ZGlmZiAtLWdpdCBhLy5idW5kbGUvY29uZmlnIGIvLmJ1bmRsZS9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhMGVkYgotLS0gL2Rldi9udWxsCisrKyBiLy5idW5kbGUvY29uZmlnCkBAIC0wLDAgKzEsNCBAQAorLS0tCitCVU5ETEVfRlJPWkVOOiAiMSIKK0JVTkRMRV9QQVRIOiAidmVuZG9yL2J1bmRsZSIKK0JVTkRMRV9ESVNBQkxFX1NIQVJFRF9HRU1TOiAidHJ1ZSIKZGlmZiAtLWdpdCBhLy5zYXNzLWNhY2hlLzA0ZTUxYWZkZDBlY2NmMmU2N2E3ZjYyZGQ4MTg4NzQ2MGU0YmVlYWMvX2Jhc2Uuc2Nzc2MgYi8uc2Fzcy1jYWNoZS8wNGU1MWFmZGQwZWNjZjJlNjdhN2Y2MmRkODE4ODc0NjBlNGJlZWFjL19iYXNlLnNjc3NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzRiMzEKLS0tIC9kZXYvbnVsbAorKysgYi8uc2Fzcy1jYWNoZS8wNGU1MWFmZGQwZWNjZjJlNjdhN2Y2MmRkODE4ODc0NjBlNGJlZWFjL19iYXNlLnNjc3NjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLy5zYXNzLWNhY2hlLzA0ZTUxYWZkZDBlY2NmMmU2N2E3ZjYyZGQ4MTg4NzQ2MGU0YmVlYWMvX21peGlucy5zY3NzYyBiLy5zYXNzLWNhY2hlLzA0ZTUxYWZkZDBlY2NmMmU2N2E3ZjYyZGQ4MTg4NzQ2MGU0YmVlYWMvX21peGlucy5zY3NzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZiNmFhCi0tLSAvZGV2L251bGwKKysrIGIvLnNhc3MtY2FjaGUvMDRlNTFhZmRkMGVjY2YyZTY3YTdmNjJkZDgxODg3NDYwZTRiZWVhYy9fbWl4aW5zLnNjc3NjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL19pbmNsdWRlcy9oZWFkLmh0bWwgYi9faW5jbHVkZXMvaGVhZC5odG1sCmluZGV4IGM5NjYyNmQuLmU5N2YzY2UgMTAwNzU1Ci0tLSBhL19pbmNsdWRlcy9oZWFkLmh0bWwKKysrIGIvX2luY2x1ZGVzL2hlYWQuaHRtbApAQCAtMjIsNiArMjIsMTYgQEAKICAgICA8IS0tIEN1c3RvbSBDU1MgLS0+CiAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjc3MvbWFpbi5jc3MiIHR5cGU9InRleHQvY3NzIj4KIAorICAgIDwhLS0gR2xvYmFsIFNpdGUgVGFnIChndGFnLmpzKSAtIEdvb2dsZSBBbmFseXRpY3MgLS0+Cis8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1VQS04NDc0MjM0MS0yIj48L3NjcmlwdD4KKzxzY3JpcHQ+CisgIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOworICBmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKX07CisgIGd0YWcoJ2pzJywgbmV3IERhdGUoKSk7CisKKyAgZ3RhZygnY29uZmlnJywgJ1VBLTg0NzQyMzQxLTInKTsKKzwvc2NyaXB0PgorCiAgICAgPCEtLSBIVE1MNSBTaGltIGFuZCBSZXNwb25kLmpzIElFOCBzdXBwb3J0IG9mIEhUTUw1IGVsZW1lbnRzIGFuZCBtZWRpYSBxdWVyaWVzIC0tPgogICAgIDwhLS0gV0FSTklORzogUmVzcG9uZC5qcyBkb2Vzbid0IHdvcmsgaWYgeW91IHZpZXcgdGhlIHBhZ2UgdmlhIGZpbGU6Ly8gLS0+CiAgICAgPCEtLVtpZiBsdCBJRSA5XT4KZGlmZiAtLWdpdCBhL19zaXRlL2ZlZWQueG1sIGIvX3NpdGUvZmVlZC54bWwKaW5kZXggM2VmMGRkYS4uOTdjNmY0NCAxMDA2NDQKLS0tIGEvX3NpdGUvZmVlZC54bWwKKysrIGIvX3NpdGUvZmVlZC54bWwKQEAgLTEgKzEgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PGZlZWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIgPjxnZW5lcmF0b3IgdXJpPSJodHRwczovL2pla3lsbHJiLmNvbS8iIHZlcnNpb249IjMuNS4yIj5KZWt5bGw8L2dlbmVyYXRvcj48bGluayBocmVmPSJodHRwOi8vbG9jYWxob3N0OjQwMDAvZmVlZC54bWwiIHJlbD0ic2VsZiIgdHlwZT0iYXBwbGljYXRpb24vYXRvbSt4bWwiIC8+PGxpbmsgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo0MDAwLyIgcmVsPSJhbHRlcm5hdGUiIHR5cGU9InRleHQvaHRtbCIgLz48dXBkYXRlZD4yMDE3LTA5LTIxVDIxOjQ0OjUwKzEwOjAwPC91cGRhdGVkPjxpZD5odHRwOi8vbG9jYWxob3N0OjQwMDAvPC9pZD48c3VidGl0bGU+PC9zdWJ0aXRsZT48L2ZlZWQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48ZmVlZCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiA+PGdlbmVyYXRvciB1cmk9Imh0dHBzOi8vamVreWxscmIuY29tLyIgdmVyc2lvbj0iMy41LjIiPkpla3lsbDwvZ2VuZXJhdG9yPjxsaW5rIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3Q6NDAwMC9mZWVkLnhtbCIgcmVsPSJzZWxmIiB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tK3htbCIgLz48bGluayBocmVmPSJodHRwOi8vbG9jYWxob3N0OjQwMDAvIiByZWw9ImFsdGVybmF0ZSIgdHlwZT0idGV4dC9odG1sIiAvPjx1cGRhdGVkPjIwMTctMDktMjFUMjI6MjA6MDArMTA6MDA8L3VwZGF0ZWQ+PGlkPmh0dHA6Ly9sb2NhbGhvc3Q6NDAwMC88L2lkPjxzdWJ0aXRsZT48L3N1YnRpdGxlPjwvZmVlZD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fc2l0ZS9pbmRleC5odG1sIGIvX3NpdGUvaW5kZXguaHRtbAppbmRleCAwOGE4M2IxLi4xYTg2NjA2IDEwMDY0NAotLS0gYS9fc2l0ZS9pbmRleC5odG1sCisrKyBiL19zaXRlL2luZGV4Lmh0bWwKQEAgLTI1LDYgKzI1LDE2IEBACiAgICAgPCEtLSBDdXN0b20gQ1NTIC0tPgogICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY3NzL21haW4uY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+CiAKKyAgICA8IS0tIEdsb2JhbCBTaXRlIFRhZyAoZ3RhZy5qcykgLSBHb29nbGUgQW5hbHl0aWNzIC0tPgorPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanM/aWQ9VUEtODQ3NDIzNDEtMiI+PC9zY3JpcHQ+Cis8c2NyaXB0PgorICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKKyAgZnVuY3Rpb24gZ3RhZygpe2RhdGFMYXllci5wdXNoKGFyZ3VtZW50cyl9OworICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOworCisgIGd0YWcoJ2NvbmZpZycsICdVQS04NDc0MjM0MS0yJyk7Cis8L3NjcmlwdD4KKwogICAgIDwhLS0gSFRNTDUgU2hpbSBhbmQgUmVzcG9uZC5qcyBJRTggc3VwcG9ydCBvZiBIVE1MNSBlbGVtZW50cyBhbmQgbWVkaWEgcXVlcmllcyAtLT4KICAgICA8IS0tIFdBUk5JTkc6IFJlc3BvbmQuanMgZG9lc24ndCB3b3JrIGlmIHlvdSB2aWV3IHRoZSBwYWdlIHZpYSBmaWxlOi8vIC0tPgogICAgIDwhLS1baWYgbHQgSUUgOV0+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvYmluL2pla3lsbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vamVreWxsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmNzAxMDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvYmluL2pla3lsbApAQCAtMCwwICsxLDIyIEBACisjIS91c3IvYmluL2VudiBydWJ5CisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFJ1YnlHZW1zLgorIworIyBUaGUgYXBwbGljYXRpb24gJ2pla3lsbCcgaXMgaW5zdGFsbGVkIGFzIHBhcnQgb2YgYSBnZW0sIGFuZAorIyB0aGlzIGZpbGUgaXMgaGVyZSB0byBmYWNpbGl0YXRlIHJ1bm5pbmcgaXQuCisjCisKK3JlcXVpcmUgJ3J1YnlnZW1zJworCit2ZXJzaW9uID0gIj49IDAuYSIKKworaWYgQVJHVi5maXJzdAorICBzdHIgPSBBUkdWLmZpcnN0CisgIHN0ciA9IHN0ci5kdXAuZm9yY2VfZW5jb2RpbmcoIkJJTkFSWSIpIGlmIHN0ci5yZXNwb25kX3RvPyA6Zm9yY2VfZW5jb2RpbmcKKyAgaWYgc3RyID1+IC9cQV8oLiopX1x6LyBhbmQgR2VtOjpWZXJzaW9uLmNvcnJlY3Q/KCQxKSB0aGVuCisgICAgdmVyc2lvbiA9ICQxCisgICAgQVJHVi5zaGlmdAorICBlbmQKK2VuZAorCitsb2FkIEdlbS5hY3RpdmF0ZV9iaW5fcGF0aCgnamVreWxsJywgJ2pla3lsbCcsIHZlcnNpb24pCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvYmluL2tyYW1kb3duIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2Jpbi9rcmFtZG93bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMDk0ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2Jpbi9rcmFtZG93bgpAQCAtMCwwICsxLDIyIEBACisjIS91c3IvYmluL2VudiBydWJ5CisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFJ1YnlHZW1zLgorIworIyBUaGUgYXBwbGljYXRpb24gJ2tyYW1kb3duJyBpcyBpbnN0YWxsZWQgYXMgcGFydCBvZiBhIGdlbSwgYW5kCisjIHRoaXMgZmlsZSBpcyBoZXJlIHRvIGZhY2lsaXRhdGUgcnVubmluZyBpdC4KKyMKKworcmVxdWlyZSAncnVieWdlbXMnCisKK3ZlcnNpb24gPSAiPj0gMC5hIgorCitpZiBBUkdWLmZpcnN0CisgIHN0ciA9IEFSR1YuZmlyc3QKKyAgc3RyID0gc3RyLmR1cC5mb3JjZV9lbmNvZGluZygiQklOQVJZIikgaWYgc3RyLnJlc3BvbmRfdG8/IDpmb3JjZV9lbmNvZGluZworICBpZiBzdHIgPX4gL1xBXyguKilfXHovIGFuZCBHZW06OlZlcnNpb24uY29ycmVjdD8oJDEpIHRoZW4KKyAgICB2ZXJzaW9uID0gJDEKKyAgICBBUkdWLnNoaWZ0CisgIGVuZAorZW5kCisKK2xvYWQgR2VtLmFjdGl2YXRlX2Jpbl9wYXRoKCdrcmFtZG93bicsICdrcmFtZG93bicsIHZlcnNpb24pCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvYmluL2xpc3RlbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vbGlzdGVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlMThhN2UKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvYmluL2xpc3RlbgpAQCAtMCwwICsxLDIyIEBACisjIS91c3IvYmluL2VudiBydWJ5CisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFJ1YnlHZW1zLgorIworIyBUaGUgYXBwbGljYXRpb24gJ2xpc3RlbicgaXMgaW5zdGFsbGVkIGFzIHBhcnQgb2YgYSBnZW0sIGFuZAorIyB0aGlzIGZpbGUgaXMgaGVyZSB0byBmYWNpbGl0YXRlIHJ1bm5pbmcgaXQuCisjCisKK3JlcXVpcmUgJ3J1YnlnZW1zJworCit2ZXJzaW9uID0gIj49IDAuYSIKKworaWYgQVJHVi5maXJzdAorICBzdHIgPSBBUkdWLmZpcnN0CisgIHN0ciA9IHN0ci5kdXAuZm9yY2VfZW5jb2RpbmcoIkJJTkFSWSIpIGlmIHN0ci5yZXNwb25kX3RvPyA6Zm9yY2VfZW5jb2RpbmcKKyAgaWYgc3RyID1+IC9cQV8oLiopX1x6LyBhbmQgR2VtOjpWZXJzaW9uLmNvcnJlY3Q/KCQxKSB0aGVuCisgICAgdmVyc2lvbiA9ICQxCisgICAgQVJHVi5zaGlmdAorICBlbmQKK2VuZAorCitsb2FkIEdlbS5hY3RpdmF0ZV9iaW5fcGF0aCgnbGlzdGVuJywgJ2xpc3RlbicsIHZlcnNpb24pCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvYmluL3JvdWdpZnkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvYmluL3JvdWdpZnkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODk1MzkxNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vcm91Z2lmeQpAQCAtMCwwICsxLDIyIEBACisjIS91c3IvYmluL2VudiBydWJ5CisjCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IFJ1YnlHZW1zLgorIworIyBUaGUgYXBwbGljYXRpb24gJ3JvdWdlJyBpcyBpbnN0YWxsZWQgYXMgcGFydCBvZiBhIGdlbSwgYW5kCisjIHRoaXMgZmlsZSBpcyBoZXJlIHRvIGZhY2lsaXRhdGUgcnVubmluZyBpdC4KKyMKKworcmVxdWlyZSAncnVieWdlbXMnCisKK3ZlcnNpb24gPSAiPj0gMC5hIgorCitpZiBBUkdWLmZpcnN0CisgIHN0ciA9IEFSR1YuZmlyc3QKKyAgc3RyID0gc3RyLmR1cC5mb3JjZV9lbmNvZGluZygiQklOQVJZIikgaWYgc3RyLnJlc3BvbmRfdG8/IDpmb3JjZV9lbmNvZGluZworICBpZiBzdHIgPX4gL1xBXyguKilfXHovIGFuZCBHZW06OlZlcnNpb24uY29ycmVjdD8oJDEpIHRoZW4KKyAgICB2ZXJzaW9uID0gJDEKKyAgICBBUkdWLnNoaWZ0CisgIGVuZAorZW5kCisKK2xvYWQgR2VtLmFjdGl2YXRlX2Jpbl9wYXRoKCdyb3VnZScsICdyb3VnaWZ5JywgdmVyc2lvbikKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vc2FmZV95YW1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2Jpbi9zYWZlX3lhbWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIwNTZhZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vc2FmZV95YW1sCkBAIC0wLDAgKzEsMjIgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgUnVieUdlbXMuCisjCisjIFRoZSBhcHBsaWNhdGlvbiAnc2FmZV95YW1sJyBpcyBpbnN0YWxsZWQgYXMgcGFydCBvZiBhIGdlbSwgYW5kCisjIHRoaXMgZmlsZSBpcyBoZXJlIHRvIGZhY2lsaXRhdGUgcnVubmluZyBpdC4KKyMKKworcmVxdWlyZSAncnVieWdlbXMnCisKK3ZlcnNpb24gPSAiPj0gMC5hIgorCitpZiBBUkdWLmZpcnN0CisgIHN0ciA9IEFSR1YuZmlyc3QKKyAgc3RyID0gc3RyLmR1cC5mb3JjZV9lbmNvZGluZygiQklOQVJZIikgaWYgc3RyLnJlc3BvbmRfdG8/IDpmb3JjZV9lbmNvZGluZworICBpZiBzdHIgPX4gL1xBXyguKilfXHovIGFuZCBHZW06OlZlcnNpb24uY29ycmVjdD8oJDEpIHRoZW4KKyAgICB2ZXJzaW9uID0gJDEKKyAgICBBUkdWLnNoaWZ0CisgIGVuZAorZW5kCisKK2xvYWQgR2VtLmFjdGl2YXRlX2Jpbl9wYXRoKCdzYWZlX3lhbWwnLCAnc2FmZV95YW1sJywgdmVyc2lvbikKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMzU3MjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2Jpbi9zYXNzCkBAIC0wLDAgKzEsMjIgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgUnVieUdlbXMuCisjCisjIFRoZSBhcHBsaWNhdGlvbiAnc2FzcycgaXMgaW5zdGFsbGVkIGFzIHBhcnQgb2YgYSBnZW0sIGFuZAorIyB0aGlzIGZpbGUgaXMgaGVyZSB0byBmYWNpbGl0YXRlIHJ1bm5pbmcgaXQuCisjCisKK3JlcXVpcmUgJ3J1YnlnZW1zJworCit2ZXJzaW9uID0gIj49IDAuYSIKKworaWYgQVJHVi5maXJzdAorICBzdHIgPSBBUkdWLmZpcnN0CisgIHN0ciA9IHN0ci5kdXAuZm9yY2VfZW5jb2RpbmcoIkJJTkFSWSIpIGlmIHN0ci5yZXNwb25kX3RvPyA6Zm9yY2VfZW5jb2RpbmcKKyAgaWYgc3RyID1+IC9cQV8oLiopX1x6LyBhbmQgR2VtOjpWZXJzaW9uLmNvcnJlY3Q/KCQxKSB0aGVuCisgICAgdmVyc2lvbiA9ICQxCisgICAgQVJHVi5zaGlmdAorICBlbmQKK2VuZAorCitsb2FkIEdlbS5hY3RpdmF0ZV9iaW5fcGF0aCgnc2FzcycsICdzYXNzJywgdmVyc2lvbikKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vc2Fzcy1jb252ZXJ0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2Jpbi9zYXNzLWNvbnZlcnQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjdmOWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9iaW4vc2Fzcy1jb252ZXJ0CkBAIC0wLDAgKzEsMjIgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKyMKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgUnVieUdlbXMuCisjCisjIFRoZSBhcHBsaWNhdGlvbiAnc2FzcycgaXMgaW5zdGFsbGVkIGFzIHBhcnQgb2YgYSBnZW0sIGFuZAorIyB0aGlzIGZpbGUgaXMgaGVyZSB0byBmYWNpbGl0YXRlIHJ1bm5pbmcgaXQuCisjCisKK3JlcXVpcmUgJ3J1YnlnZW1zJworCit2ZXJzaW9uID0gIj49IDAuYSIKKworaWYgQVJHVi5maXJzdAorICBzdHIgPSBBUkdWLmZpcnN0CisgIHN0ciA9IHN0ci5kdXAuZm9yY2VfZW5jb2RpbmcoIkJJTkFSWSIpIGlmIHN0ci5yZXNwb25kX3RvPyA6Zm9yY2VfZW5jb2RpbmcKKyAgaWYgc3RyID1+IC9cQV8oLiopX1x6LyBhbmQgR2VtOjpWZXJzaW9uLmNvcnJlY3Q/KCQxKSB0aGVuCisgICAgdmVyc2lvbiA9ICQxCisgICAgQVJHVi5zaGlmdAorICBlbmQKK2VuZAorCitsb2FkIEdlbS5hY3RpdmF0ZV9iaW5fcGF0aCgnc2FzcycsICdzYXNzLWNvbnZlcnQnLCB2ZXJzaW9uKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2Jpbi9zY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2Jpbi9zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkOTM4YzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvYmluL3Njc3MKQEAgLTAsMCArMSwyMiBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorIworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBSdWJ5R2Vtcy4KKyMKKyMgVGhlIGFwcGxpY2F0aW9uICdzYXNzJyBpcyBpbnN0YWxsZWQgYXMgcGFydCBvZiBhIGdlbSwgYW5kCisjIHRoaXMgZmlsZSBpcyBoZXJlIHRvIGZhY2lsaXRhdGUgcnVubmluZyBpdC4KKyMKKworcmVxdWlyZSAncnVieWdlbXMnCisKK3ZlcnNpb24gPSAiPj0gMC5hIgorCitpZiBBUkdWLmZpcnN0CisgIHN0ciA9IEFSR1YuZmlyc3QKKyAgc3RyID0gc3RyLmR1cC5mb3JjZV9lbmNvZGluZygiQklOQVJZIikgaWYgc3RyLnJlc3BvbmRfdG8/IDpmb3JjZV9lbmNvZGluZworICBpZiBzdHIgPX4gL1xBXyguKilfXHovIGFuZCBHZW06OlZlcnNpb24uY29ycmVjdD8oJDEpIHRoZW4KKyAgICB2ZXJzaW9uID0gJDEKKyAgICBBUkdWLnNoaWZ0CisgIGVuZAorZW5kCisKK2xvYWQgR2VtLmFjdGl2YXRlX2Jpbl9wYXRoKCdzYXNzJywgJ3Njc3MnLCB2ZXJzaW9uKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2FkZHJlc3NhYmxlLTIuNS4yLmdlbSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9hZGRyZXNzYWJsZS0yLjUuMi5nZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1M2VhMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9hZGRyZXNzYWJsZS0yLjUuMi5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2NvbG9yYXRvci0xLjEuMC5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvY29sb3JhdG9yLTEuMS4wLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYxNmFkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2NvbG9yYXRvci0xLjEuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2ZmaS0xLjkuMTguZ2VtIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2ZmaS0xLjkuMTguZ2VtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjEzZTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvZmZpLTEuOS4xOC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2ZvcndhcmRhYmxlLWV4dGVuZGVkLTIuNi4wLmdlbSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9mb3J3YXJkYWJsZS1leHRlbmRlZC0yLjYuMC5nZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwMjIyZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9mb3J3YXJkYWJsZS1leHRlbmRlZC0yLjYuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2pla3lsbC0zLjUuMi5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvamVreWxsLTMuNS4yLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFlNjNmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2pla3lsbC0zLjUuMi5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2pla3lsbC1mZWVkLTAuOS4yLmdlbSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9qZWt5bGwtZmVlZC0wLjkuMi5nZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyMjFhOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9qZWt5bGwtZmVlZC0wLjkuMi5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2pla3lsbC1zYXNzLWNvbnZlcnRlci0xLjUuMC5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWY4MzY5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2pla3lsbC1zYXNzLWNvbnZlcnRlci0xLjUuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2pla3lsbC13YXRjaC0xLjUuMC5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvamVreWxsLXdhdGNoLTEuNS4wLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjEzODkxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2pla3lsbC13YXRjaC0xLjUuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2tyYW1kb3duLTEuMTQuMC5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUva3JhbWRvd24tMS4xNC4wLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzExMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2tyYW1kb3duLTEuMTQuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2xpcXVpZC00LjAuMC5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvbGlxdWlkLTQuMC4wLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI1NmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2xpcXVpZC00LjAuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2xpc3Rlbi0zLjAuOC5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvbGlzdGVuLTMuMC44LmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGZiMDBhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL2xpc3Rlbi0zLjAuOC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL21lcmNlbmFyeS0wLjMuNi5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvbWVyY2VuYXJ5LTAuMy42LmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTMzM2UwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL21lcmNlbmFyeS0wLjMuNi5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL21pbmltYS0yLjEuMS5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvbWluaW1hLTIuMS4xLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZThhYTYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL21pbmltYS0yLjEuMS5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3BhdGh1dGlsLTAuMTQuMC5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvcGF0aHV0aWwtMC4xNC4wLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGE0NWFjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3BhdGh1dGlsLTAuMTQuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3B1YmxpY19zdWZmaXgtMy4wLjAuZ2VtIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3B1YmxpY19zdWZmaXgtMy4wLjAuZ2VtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkM2M0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvcHVibGljX3N1ZmZpeC0zLjAuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3JiLWZzZXZlbnQtMC4xMC4yLmdlbSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9yYi1mc2V2ZW50LTAuMTAuMi5nZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhMjExNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9yYi1mc2V2ZW50LTAuMTAuMi5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3JiLWlub3RpZnktMC45LjEwLmdlbSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9yYi1pbm90aWZ5LTAuOS4xMC5nZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzZDU4NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9yYi1pbm90aWZ5LTAuOS4xMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3JvdWdlLTEuMTEuMS5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvcm91Z2UtMS4xMS4xLmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDBlZmZlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3JvdWdlLTEuMTEuMS5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3NhZmVfeWFtbC0xLjAuNC5nZW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvc2FmZV95YW1sLTEuMC40LmdlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE0OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3NhZmVfeWFtbC0xLjAuNC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3Nhc3MtMy41LjEuZ2VtIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3Nhc3MtMy41LjEuZ2VtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjNlNjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvY2FjaGUvc2Fzcy0zLjUuMS5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2NhY2hlL3Nhc3MtbGlzdGVuLTQuMC4wLmdlbSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9zYXNzLWxpc3Rlbi00LjAuMC5nZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2NDY1MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9jYWNoZS9zYXNzLWxpc3Rlbi00LjAuMC5nZW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2V4dGVuc2lvbnMveDg2XzY0LWRhcndpbi0xNi8yLjQuMC9mZmktMS45LjE4L2ZmaV9jLmJ1bmRsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9leHRlbnNpb25zL3g4Nl82NC1kYXJ3aW4tMTYvMi40LjAvZmZpLTEuOS4xOC9mZmlfYy5idW5kbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzBjZWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9leHRlbnNpb25zL3g4Nl82NC1kYXJ3aW4tMTYvMi40LjAvZmZpLTEuOS4xOC9mZmlfYy5idW5kbGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2V4dGVuc2lvbnMveDg2XzY0LWRhcndpbi0xNi8yLjQuMC9mZmktMS45LjE4L2dlbS5idWlsZF9jb21wbGV0ZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9leHRlbnNpb25zL3g4Nl82NC1kYXJ3aW4tMTYvMi40LjAvZmZpLTEuOS4xOC9nZW0uYnVpbGRfY29tcGxldGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9leHRlbnNpb25zL3g4Nl82NC1kYXJ3aW4tMTYvMi40LjAvZmZpLTEuOS4xOC9nZW0uYnVpbGRfY29tcGxldGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9leHRlbnNpb25zL3g4Nl82NC1kYXJ3aW4tMTYvMi40LjAvZmZpLTEuOS4xOC9nZW1fbWFrZS5vdXQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZXh0ZW5zaW9ucy94ODZfNjQtZGFyd2luLTE2LzIuNC4wL2ZmaS0xLjkuMTgvZ2VtX21ha2Uub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMDdmZTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZXh0ZW5zaW9ucy94ODZfNjQtZGFyd2luLTE2LzIuNC4wL2ZmaS0xLjkuMTgvZ2VtX21ha2Uub3V0CkBAIC0wLDAgKzEsNjEgQEAKK2N1cnJlbnQgZGlyZWN0b3J5OiAvVXNlcnMvcm9hZGFuL1dvcmsvYXBhY2hlL2luY3ViYXRvci1hbWF0ZXJhc3Utc2l0ZS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYworL3Vzci9sb2NhbC9vcHQvcnVieS9iaW4vcnVieSAtciAuL3NpdGVjb25mMjAxNzA5MjEtMjI0NzYtMXdqczN2MC5yYiBleHRjb25mLnJiCitjaGVja2luZyBmb3IgZmZpLmguLi4gbm8KK2NoZWNraW5nIGZvciBmZmkuaCBpbiAvdXNyL2xvY2FsL2luY2x1ZGUsL3Vzci9pbmNsdWRlL2ZmaS4uLiB5ZXMKK2NoZWNraW5nIGZvciBmZmlfY2FsbCgpIGluIC1sZmZpLi4uIHllcworY2hlY2tpbmcgZm9yIGZmaV9wcmVwX2Nsb3N1cmUoKS4uLiB5ZXMKK2NoZWNraW5nIGZvciBmZmlfcmF3X2NhbGwoKS4uLiBubworY2hlY2tpbmcgZm9yIHNobHdhcGkuaC4uLiBubworY2hlY2tpbmcgZm9yIHJiX3RocmVhZF9ibG9ja2luZ19yZWdpb24oKS4uLiBubworY2hlY2tpbmcgZm9yIHJiX3RocmVhZF9jYWxsX3dpdGhfZ3ZsKCkuLi4geWVzCitjaGVja2luZyBmb3IgcmJfdGhyZWFkX2NhbGxfd2l0aG91dF9ndmwoKS4uLiB5ZXMKK2NoZWNraW5nIGZvciBmZmlfcHJlcF9jaWZfdmFyKCkuLi4gbm8KK2NyZWF0aW5nIGV4dGNvbmYuaAorY3JlYXRpbmcgTWFrZWZpbGUKKworY3VycmVudCBkaXJlY3Rvcnk6IC9Vc2Vycy9yb2FkYW4vV29yay9hcGFjaGUvaW5jdWJhdG9yLWFtYXRlcmFzdS1zaXRlL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jCittYWtlICJERVNURElSPSIgY2xlYW4KKworY3VycmVudCBkaXJlY3Rvcnk6IC9Vc2Vycy9yb2FkYW4vV29yay9hcGFjaGUvaW5jdWJhdG9yLWFtYXRlcmFzdS1zaXRlL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jCittYWtlICJERVNURElSPSIKK2NvbXBpbGluZyBBYnN0cmFjdE1lbW9yeS5jCitjb21waWxpbmcgQXJyYXlUeXBlLmMKK2NvbXBpbGluZyBCdWZmZXIuYworY29tcGlsaW5nIENhbGwuYworQ2FsbC5jOjM1NTo1OiB3YXJuaW5nOiBpbXBsaWNpdCBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbiAncmJfdGhyZWFkX2NhbGxfd2l0aG91dF9ndmwnIGlzIGludmFsaWQgaW4gQzk5IFstV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uXQorICAgIHJiZmZpX3RocmVhZF9ibG9ja2luZ19yZWdpb24oY2FsbF9ibG9ja2luZ19mdW5jdGlvbiwgZGF0YSwgKHZvaWQgKikgLTEsIE5VTEwpOworICAgIF4KKy4vVGhyZWFkLmg6Nzg6Mzk6IG5vdGU6IGV4cGFuZGVkIGZyb20gbWFjcm8gJ3JiZmZpX3RocmVhZF9ibG9ja2luZ19yZWdpb24nCisjIGRlZmluZSByYmZmaV90aHJlYWRfYmxvY2tpbmdfcmVnaW9uIHJiX3RocmVhZF9jYWxsX3dpdGhvdXRfZ3ZsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKzEgd2FybmluZyBnZW5lcmF0ZWQuCitjb21waWxpbmcgQ2xvc3VyZVBvb2wuYworY29tcGlsaW5nIERhdGFDb252ZXJ0ZXIuYworY29tcGlsaW5nIER5bmFtaWNMaWJyYXJ5LmMKK2NvbXBpbGluZyBGdW5jdGlvbi5jCitGdW5jdGlvbi5jOjU2Mzo5OiB3YXJuaW5nOiBpbXBsaWNpdCBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbiAncmJfdGhyZWFkX2NhbGxfd2l0aG91dF9ndmwnIGlzIGludmFsaWQgaW4gQzk5IFstV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uXQorICAgICAgICByYl90aHJlYWRfY2FsbF93aXRob3V0X2d2bChhc3luY19jYl93YWl0LCAmdywgYXN5bmNfY2Jfc3RvcCwgJncpOworICAgICAgICBeCisxIHdhcm5pbmcgZ2VuZXJhdGVkLgorY29tcGlsaW5nIEZ1bmN0aW9uSW5mby5jCitjb21waWxpbmcgTGFzdEVycm9yLmMKK2NvbXBpbGluZyBMb25nRG91YmxlLmMKK2NvbXBpbGluZyBNYXBwZWRUeXBlLmMKK2NvbXBpbGluZyBNZW1vcnlQb2ludGVyLmMKK2NvbXBpbGluZyBNZXRob2RIYW5kbGUuYworY29tcGlsaW5nIFBsYXRmb3JtLmMKK2NvbXBpbGluZyBQb2ludGVyLmMKK2NvbXBpbGluZyBTdHJ1Y3QuYworY29tcGlsaW5nIFN0cnVjdEJ5UmVmZXJlbmNlLmMKK2NvbXBpbGluZyBTdHJ1Y3RCeVZhbHVlLmMKK2NvbXBpbGluZyBTdHJ1Y3RMYXlvdXQuYworY29tcGlsaW5nIFRocmVhZC5jCitjb21waWxpbmcgVHlwZS5jCitjb21waWxpbmcgVHlwZXMuYworY29tcGlsaW5nIFZhcmlhZGljLmMKK2NvbXBpbGluZyBmZmkuYworbGlua2luZyBzaGFyZWQtb2JqZWN0IGZmaV9jLmJ1bmRsZQorCitjdXJyZW50IGRpcmVjdG9yeTogL1VzZXJzL3JvYWRhbi9Xb3JrL2FwYWNoZS9pbmN1YmF0b3ItYW1hdGVyYXN1LXNpdGUvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MKK21ha2UgIkRFU1RESVI9IiBpbnN0YWxsCisvdXNyL2Jpbi9pbnN0YWxsIC1jIC1tIDA3NTUgZmZpX2MuYnVuZGxlIC4vLmdlbS4yMDE3MDkyMS0yMjQ3Ni12eWl3eXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9leHRlbnNpb25zL3g4Nl82NC1kYXJ3aW4tMTYvMi40LjAvZmZpLTEuOS4xOC9ta21mLmxvZyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9leHRlbnNpb25zL3g4Nl82NC1kYXJ3aW4tMTYvMi40LjAvZmZpLTEuOS4xOC9ta21mLmxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE1ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2V4dGVuc2lvbnMveDg2XzY0LWRhcndpbi0xNi8yLjQuMC9mZmktMS45LjE4L21rbWYubG9nCkBAIC0wLDAgKzEsNDAwIEBACitwYWNrYWdlIGNvbmZpZ3VyYXRpb24gZm9yIGxpYmZmaSBpcyBub3QgZm91bmQKK2hhdmVfaGVhZGVyOiBjaGVja2luZyBmb3IgZmZpLmguLi4gLS0tLS0tLS0tLS0tLS0tLS0tLS0gbm8KKworImNsYW5nIC1vIGNvbmZ0ZXN0IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAgLUkvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9pbmNsdWRlIC1EX1hPUEVOX1NPVVJDRSAtRF9EQVJXSU5fQ19TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QgLURfUkVFTlRSQU5UICAgLU8zIC1mbm8tZmFzdC1tYXRoIC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXBhcmVudGhlc2VzIC1Xbm8tbG9uZy1sb25nIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSAtV25vLXBhcmVudGhlc2VzLWVxdWFsaXR5IC1Xbm8tY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIC1Xbm8tc2VsZi1hc3NpZ24gLVd1bnVzZWQtdmFyaWFibGUgLVdpbXBsaWNpdC1pbnQgLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV3Nob3J0ZW4tNjQtdG8tMzIgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2RpdmlzaW9uLWJ5LXplcm8gLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2V4dHJhLXRva2VucyAgLWZuby1jb21tb24gLXBpcGUgY29uZnRlc3QuYyAgLUwuIC1ML3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgLUwuIC1mc3RhY2stcHJvdGVjdG9yIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliICAgICAtbHJ1YnkuMi40LjEgIC1scHRocmVhZCAtbGRsIC1sb2JqYyAiCitjaGVja2VkIHByb2dyYW0gd2FzOgorLyogYmVnaW4gKi8KKzE6ICNpbmNsdWRlICJydWJ5LmgiCisyOiAKKzM6IGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKzQ6IHsKKzU6ICAgcmV0dXJuIDA7Cis2OiB9CisvKiBlbmQgKi8KKworImNsYW5nIC1FIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAgLUkvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9pbmNsdWRlIC1EX1hPUEVOX1NPVVJDRSAtRF9EQVJXSU5fQ19TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QgLURfUkVFTlRSQU5UICAgLU8zIC1mbm8tZmFzdC1tYXRoIC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXBhcmVudGhlc2VzIC1Xbm8tbG9uZy1sb25nIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSAtV25vLXBhcmVudGhlc2VzLWVxdWFsaXR5IC1Xbm8tY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIC1Xbm8tc2VsZi1hc3NpZ24gLVd1bnVzZWQtdmFyaWFibGUgLVdpbXBsaWNpdC1pbnQgLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV3Nob3J0ZW4tNjQtdG8tMzIgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2RpdmlzaW9uLWJ5LXplcm8gLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2V4dHJhLXRva2VucyAgLWZuby1jb21tb24gLXBpcGUgIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QuaSIKK2NvbmZ0ZXN0LmM6MzoxMDogZmF0YWwgZXJyb3I6ICdmZmkuaCcgZmlsZSBub3QgZm91bmQKKyNpbmNsdWRlIDxmZmkuaD4KKyAgICAgICAgIF4KKzEgZXJyb3IgZ2VuZXJhdGVkLgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisxOiAjaW5jbHVkZSAicnVieS5oIgorMjogCiszOiAjaW5jbHVkZSA8ZmZpLmg+CisvKiBlbmQgKi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZmluZF9oZWFkZXI6IGNoZWNraW5nIGZvciBmZmkuaCBpbiAvdXNyL2xvY2FsL2luY2x1ZGUsL3Vzci9pbmNsdWRlL2ZmaS4uLiAtLS0tLS0tLS0tLS0tLS0tLS0tLSB5ZXMKKworImNsYW5nIC1FIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAgLUkvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9pbmNsdWRlIC1EX1hPUEVOX1NPVVJDRSAtRF9EQVJXSU5fQ19TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QgLURfUkVFTlRSQU5UICAgLU8zIC1mbm8tZmFzdC1tYXRoIC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXBhcmVudGhlc2VzIC1Xbm8tbG9uZy1sb25nIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSAtV25vLXBhcmVudGhlc2VzLWVxdWFsaXR5IC1Xbm8tY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIC1Xbm8tc2VsZi1hc3NpZ24gLVd1bnVzZWQtdmFyaWFibGUgLVdpbXBsaWNpdC1pbnQgLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV3Nob3J0ZW4tNjQtdG8tMzIgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2RpdmlzaW9uLWJ5LXplcm8gLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2V4dHJhLXRva2VucyAgLWZuby1jb21tb24gLXBpcGUgIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QuaSIKK2NvbmZ0ZXN0LmM6MzoxMDogZmF0YWwgZXJyb3I6ICdmZmkuaCcgZmlsZSBub3QgZm91bmQKKyNpbmNsdWRlIDxmZmkuaD4KKyAgICAgICAgIF4KKzEgZXJyb3IgZ2VuZXJhdGVkLgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisxOiAjaW5jbHVkZSAicnVieS5oIgorMjogCiszOiAjaW5jbHVkZSA8ZmZpLmg+CisvKiBlbmQgKi8KKworImNsYW5nIC1FIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAgLUkvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9pbmNsdWRlIC1EX1hPUEVOX1NPVVJDRSAtRF9EQVJXSU5fQ19TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QgLURfUkVFTlRSQU5UICAgLU8zIC1mbm8tZmFzdC1tYXRoIC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXBhcmVudGhlc2VzIC1Xbm8tbG9uZy1sb25nIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSAtV25vLXBhcmVudGhlc2VzLWVxdWFsaXR5IC1Xbm8tY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIC1Xbm8tc2VsZi1hc3NpZ24gLVd1bnVzZWQtdmFyaWFibGUgLVdpbXBsaWNpdC1pbnQgLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV3Nob3J0ZW4tNjQtdG8tMzIgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2RpdmlzaW9uLWJ5LXplcm8gLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2V4dHJhLXRva2VucyAgLWZuby1jb21tb24gLXBpcGUgLUkvdXNyL2xvY2FsL2luY2x1ZGUgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5pIgorY29uZnRlc3QuYzozOjEwOiBmYXRhbCBlcnJvcjogJ2ZmaS5oJyBmaWxlIG5vdCBmb3VuZAorI2luY2x1ZGUgPGZmaS5oPgorICAgICAgICAgXgorMSBlcnJvciBnZW5lcmF0ZWQuCitjaGVja2VkIHByb2dyYW0gd2FzOgorLyogYmVnaW4gKi8KKzE6ICNpbmNsdWRlICJydWJ5LmgiCisyOiAKKzM6ICNpbmNsdWRlIDxmZmkuaD4KKy8qIGVuZCAqLworCisiY2xhbmcgLUUgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3g4Nl82NC1kYXJ3aW4xNiAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAvcnVieS9iYWNrd2FyZCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAgLUkuICAtSS91c3IvbG9jYWwvb3B0L2xpYnlhbWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L29wZW5zc2wvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2luY2x1ZGUgLURfWE9QRU5fU09VUkNFIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9EQVJXSU5fVU5MSU1JVEVEX1NFTEVDVCAtRF9SRUVOVFJBTlQgICAtTzMgLWZuby1mYXN0LW1hdGggLWdnZGIzIC1XYWxsIC1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tcGFyZW50aGVzZXMgLVduby1sb25nLWxvbmcgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXRhdXRvbG9naWNhbC1jb21wYXJlIC1Xbm8tcGFyZW50aGVzZXMtZXF1YWxpdHkgLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQgLVduby1zZWxmLWFzc2lnbiAtV3VudXNlZC12YXJpYWJsZSAtV2ltcGxpY2l0LWludCAtV3BvaW50ZXItYXJpdGggLVd3cml0ZS1zdHJpbmdzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xc2hvcnRlbi02NC10by0zMiAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZGl2aXNpb24tYnktemVybyAtV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XZXh0cmEtdG9rZW5zICAtZm5vLWNvbW1vbiAtcGlwZSAtSS91c3IvaW5jbHVkZS9mZmkgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5pIgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisxOiAjaW5jbHVkZSAicnVieS5oIgorMjogCiszOiAjaW5jbHVkZSA8ZmZpLmg+CisvKiBlbmQgKi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaGF2ZV9saWJyYXJ5OiBjaGVja2luZyBmb3IgZmZpX2NhbGwoKSBpbiAtbGZmaS4uLiAtLS0tLS0tLS0tLS0tLS0tLS0tLSB5ZXMKKworImNsYW5nIC1vIGNvbmZ0ZXN0IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAtSS91c3IvaW5jbHVkZS9mZmkgIC1JL3Vzci9sb2NhbC9vcHQvbGlieWFtbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvaW5jbHVkZSAtRF9YT1BFTl9TT1VSQ0UgLURfREFSV0lOX0NfU09VUkNFIC1EX0RBUldJTl9VTkxJTUlURURfU0VMRUNUIC1EX1JFRU5UUkFOVCAgIC1PMyAtZm5vLWZhc3QtbWF0aCAtZ2dkYjMgLVdhbGwgLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1wYXJlbnRoZXNlcyAtV25vLWxvbmctbG9uZyAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIC1Xbm8tdGF1dG9sb2dpY2FsLWNvbXBhcmUgLVduby1wYXJlbnRoZXNlcy1lcXVhbGl0eSAtV25vLWNvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZCAtV25vLXNlbGYtYXNzaWduIC1XdW51c2VkLXZhcmlhYmxlIC1XaW1wbGljaXQtaW50IC1XcG9pbnRlci1hcml0aCAtV3dyaXRlLXN0cmluZ3MgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVdzaG9ydGVuLTY0LXRvLTMyIC1XaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24gLVdkaXZpc2lvbi1ieS16ZXJvIC1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdleHRyYS10b2tlbnMgIC1mbm8tY29tbW9uIC1waXBlIGNvbmZ0ZXN0LmMgIC1MLiAtTC91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9saWIgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliIC1MLiAtZnN0YWNrLXByb3RlY3RvciAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAgICAgLWxydWJ5LjIuNC4xIC1sZmZpICAtbHB0aHJlYWQgLWxkbCAtbG9iamMgIgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisgMTogI2luY2x1ZGUgInJ1YnkuaCIKKyAyOiAKKyAzOiAjaW5jbHVkZSA8ZmZpLmg+CisgNDogCisgNTogLyp0b3AqLworIDY6IGV4dGVybiBpbnQgdCh2b2lkKTsKKyA3OiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgODogeworIDk6ICAgaWYgKGFyZ2MgPiAxMDAwMDAwKSB7CisxMDogICAgIHByaW50ZigiJXAiLCAmdCk7CisxMTogICB9CisxMjogCisxMzogICByZXR1cm4gMDsKKzE0OiB9CisxNTogaW50IHQodm9pZCkgeyB2b2lkICgoKnZvbGF0aWxlIHApKCkpOyBwID0gKHZvaWQgKCgqKSgpKSlmZmlfY2FsbDsgcmV0dXJuICFwOyB9CisvKiBlbmQgKi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaGF2ZV9mdW5jOiBjaGVja2luZyBmb3IgZmZpX3ByZXBfY2xvc3VyZSgpLi4uIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHllcworCisiY2xhbmcgLW8gY29uZnRlc3QgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3g4Nl82NC1kYXJ3aW4xNiAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAvcnVieS9iYWNrd2FyZCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAgLUkuIC1JL3Vzci9pbmNsdWRlL2ZmaSAgLUkvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9pbmNsdWRlIC1EX1hPUEVOX1NPVVJDRSAtRF9EQVJXSU5fQ19TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QgLURfUkVFTlRSQU5UICAgLU8zIC1mbm8tZmFzdC1tYXRoIC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXBhcmVudGhlc2VzIC1Xbm8tbG9uZy1sb25nIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSAtV25vLXBhcmVudGhlc2VzLWVxdWFsaXR5IC1Xbm8tY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIC1Xbm8tc2VsZi1hc3NpZ24gLVd1bnVzZWQtdmFyaWFibGUgLVdpbXBsaWNpdC1pbnQgLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV3Nob3J0ZW4tNjQtdG8tMzIgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2RpdmlzaW9uLWJ5LXplcm8gLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2V4dHJhLXRva2VucyAgLWZuby1jb21tb24gLXBpcGUgY29uZnRlc3QuYyAgLUwuIC1ML3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgLUwuIC1mc3RhY2stcHJvdGVjdG9yIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliICAgIC1sZmZpICAtbHJ1YnkuMi40LjEgLWxmZmkgIC1scHRocmVhZCAtbGRsIC1sb2JqYyAiCitjb25mdGVzdC5jOjEzOjU3OiBlcnJvcjogdXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAnZmZpX3ByZXBfY2xvc3VyZScKK2ludCB0KHZvaWQpIHsgdm9pZCAoKCp2b2xhdGlsZSBwKSgpKTsgcCA9ICh2b2lkICgoKikoKSkpZmZpX3ByZXBfY2xvc3VyZTsgcmV0dXJuICFwOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKzEgZXJyb3IgZ2VuZXJhdGVkLgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisgMTogI2luY2x1ZGUgInJ1YnkuaCIKKyAyOiAKKyAzOiAvKnRvcCovCisgNDogZXh0ZXJuIGludCB0KHZvaWQpOworIDU6IGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyA2OiB7CisgNzogICBpZiAoYXJnYyA+IDEwMDAwMDApIHsKKyA4OiAgICAgcHJpbnRmKCIlcCIsICZ0KTsKKyA5OiAgIH0KKzEwOiAKKzExOiAgIHJldHVybiAwOworMTI6IH0KKzEzOiBpbnQgdCh2b2lkKSB7IHZvaWQgKCgqdm9sYXRpbGUgcCkoKSk7IHAgPSAodm9pZCAoKCopKCkpKWZmaV9wcmVwX2Nsb3N1cmU7IHJldHVybiAhcDsgfQorLyogZW5kICovCisKKyJjbGFuZyAtbyBjb25mdGVzdCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAveDg2XzY0LWRhcndpbjE2IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC9ydWJ5L2JhY2t3YXJkIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMCAtSS4gLUkvdXNyL2luY2x1ZGUvZmZpICAtSS91c3IvbG9jYWwvb3B0L2xpYnlhbWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L29wZW5zc2wvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2luY2x1ZGUgLURfWE9QRU5fU09VUkNFIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9EQVJXSU5fVU5MSU1JVEVEX1NFTEVDVCAtRF9SRUVOVFJBTlQgICAtTzMgLWZuby1mYXN0LW1hdGggLWdnZGIzIC1XYWxsIC1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tcGFyZW50aGVzZXMgLVduby1sb25nLWxvbmcgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXRhdXRvbG9naWNhbC1jb21wYXJlIC1Xbm8tcGFyZW50aGVzZXMtZXF1YWxpdHkgLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQgLVduby1zZWxmLWFzc2lnbiAtV3VudXNlZC12YXJpYWJsZSAtV2ltcGxpY2l0LWludCAtV3BvaW50ZXItYXJpdGggLVd3cml0ZS1zdHJpbmdzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xc2hvcnRlbi02NC10by0zMiAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZGl2aXNpb24tYnktemVybyAtV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XZXh0cmEtdG9rZW5zICAtZm5vLWNvbW1vbiAtcGlwZSBjb25mdGVzdC5jICAtTC4gLUwvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAtTC4gLWZzdGFjay1wcm90ZWN0b3IgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgICAgLWxmZmkgIC1scnVieS4yLjQuMSAtbGZmaSAgLWxwdGhyZWFkIC1sZGwgLWxvYmpjICIKK2NoZWNrZWQgcHJvZ3JhbSB3YXM6CisvKiBiZWdpbiAqLworIDE6ICNpbmNsdWRlICJydWJ5LmgiCisgMjogCisgMzogLyp0b3AqLworIDQ6IGV4dGVybiBpbnQgdCh2b2lkKTsKKyA1OiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgNjogeworIDc6ICAgaWYgKGFyZ2MgPiAxMDAwMDAwKSB7CisgODogICAgIHByaW50ZigiJXAiLCAmdCk7CisgOTogICB9CisxMDogCisxMTogICByZXR1cm4gMDsKKzEyOiB9CisxMzogZXh0ZXJuIHZvaWQgZmZpX3ByZXBfY2xvc3VyZSgpOworMTQ6IGludCB0KHZvaWQpIHsgZmZpX3ByZXBfY2xvc3VyZSgpOyByZXR1cm4gMDsgfQorLyogZW5kICovCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2hhdmVfZnVuYzogY2hlY2tpbmcgZm9yIGZmaV9yYXdfY2FsbCgpLi4uIC0tLS0tLS0tLS0tLS0tLS0tLS0tIG5vCisKKyJjbGFuZyAtbyBjb25mdGVzdCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAveDg2XzY0LWRhcndpbjE2IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC9ydWJ5L2JhY2t3YXJkIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMCAtSS4gLUkvdXNyL2luY2x1ZGUvZmZpICAtSS91c3IvbG9jYWwvb3B0L2xpYnlhbWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L29wZW5zc2wvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2luY2x1ZGUgLURfWE9QRU5fU09VUkNFIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9EQVJXSU5fVU5MSU1JVEVEX1NFTEVDVCAtRF9SRUVOVFJBTlQgICAtTzMgLWZuby1mYXN0LW1hdGggLWdnZGIzIC1XYWxsIC1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tcGFyZW50aGVzZXMgLVduby1sb25nLWxvbmcgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXRhdXRvbG9naWNhbC1jb21wYXJlIC1Xbm8tcGFyZW50aGVzZXMtZXF1YWxpdHkgLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQgLVduby1zZWxmLWFzc2lnbiAtV3VudXNlZC12YXJpYWJsZSAtV2ltcGxpY2l0LWludCAtV3BvaW50ZXItYXJpdGggLVd3cml0ZS1zdHJpbmdzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xc2hvcnRlbi02NC10by0zMiAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZGl2aXNpb24tYnktemVybyAtV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XZXh0cmEtdG9rZW5zICAtZm5vLWNvbW1vbiAtcGlwZSBjb25mdGVzdC5jICAtTC4gLUwvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAtTC4gLWZzdGFjay1wcm90ZWN0b3IgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgICAgLWxmZmkgIC1scnVieS4yLjQuMSAtbGZmaSAgLWxwdGhyZWFkIC1sZGwgLWxvYmpjICIKK2NvbmZ0ZXN0LmM6MTM6NTc6IGVycm9yOiB1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdmZmlfcmF3X2NhbGwnCitpbnQgdCh2b2lkKSB7IHZvaWQgKCgqdm9sYXRpbGUgcCkoKSk7IHAgPSAodm9pZCAoKCopKCkpKWZmaV9yYXdfY2FsbDsgcmV0dXJuICFwOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKzEgZXJyb3IgZ2VuZXJhdGVkLgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisgMTogI2luY2x1ZGUgInJ1YnkuaCIKKyAyOiAKKyAzOiAvKnRvcCovCisgNDogZXh0ZXJuIGludCB0KHZvaWQpOworIDU6IGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyA2OiB7CisgNzogICBpZiAoYXJnYyA+IDEwMDAwMDApIHsKKyA4OiAgICAgcHJpbnRmKCIlcCIsICZ0KTsKKyA5OiAgIH0KKzEwOiAKKzExOiAgIHJldHVybiAwOworMTI6IH0KKzEzOiBpbnQgdCh2b2lkKSB7IHZvaWQgKCgqdm9sYXRpbGUgcCkoKSk7IHAgPSAodm9pZCAoKCopKCkpKWZmaV9yYXdfY2FsbDsgcmV0dXJuICFwOyB9CisvKiBlbmQgKi8KKworImNsYW5nIC1vIGNvbmZ0ZXN0IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAtSS91c3IvaW5jbHVkZS9mZmkgIC1JL3Vzci9sb2NhbC9vcHQvbGlieWFtbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvaW5jbHVkZSAtRF9YT1BFTl9TT1VSQ0UgLURfREFSV0lOX0NfU09VUkNFIC1EX0RBUldJTl9VTkxJTUlURURfU0VMRUNUIC1EX1JFRU5UUkFOVCAgIC1PMyAtZm5vLWZhc3QtbWF0aCAtZ2dkYjMgLVdhbGwgLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1wYXJlbnRoZXNlcyAtV25vLWxvbmctbG9uZyAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIC1Xbm8tdGF1dG9sb2dpY2FsLWNvbXBhcmUgLVduby1wYXJlbnRoZXNlcy1lcXVhbGl0eSAtV25vLWNvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZCAtV25vLXNlbGYtYXNzaWduIC1XdW51c2VkLXZhcmlhYmxlIC1XaW1wbGljaXQtaW50IC1XcG9pbnRlci1hcml0aCAtV3dyaXRlLXN0cmluZ3MgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVdzaG9ydGVuLTY0LXRvLTMyIC1XaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24gLVdkaXZpc2lvbi1ieS16ZXJvIC1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdleHRyYS10b2tlbnMgIC1mbm8tY29tbW9uIC1waXBlIGNvbmZ0ZXN0LmMgIC1MLiAtTC91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9saWIgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliIC1MLiAtZnN0YWNrLXByb3RlY3RvciAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAgICAtbGZmaSAgLWxydWJ5LjIuNC4xIC1sZmZpICAtbHB0aHJlYWQgLWxkbCAtbG9iamMgIgorVW5kZWZpbmVkIHN5bWJvbHMgZm9yIGFyY2hpdGVjdHVyZSB4ODZfNjQ6CisgICJfZmZpX3Jhd19jYWxsIiwgcmVmZXJlbmNlZCBmcm9tOgorICAgICAgX3QgaW4gY29uZnRlc3QtYTU4NGFhLm8KK2xkOiBzeW1ib2wocykgbm90IGZvdW5kIGZvciBhcmNoaXRlY3R1cmUgeDg2XzY0CitjbGFuZzogZXJyb3I6IGxpbmtlciBjb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAxICh1c2UgLXYgdG8gc2VlIGludm9jYXRpb24pCitjaGVja2VkIHByb2dyYW0gd2FzOgorLyogYmVnaW4gKi8KKyAxOiAjaW5jbHVkZSAicnVieS5oIgorIDI6IAorIDM6IC8qdG9wKi8KKyA0OiBleHRlcm4gaW50IHQodm9pZCk7CisgNTogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIDY6IHsKKyA3OiAgIGlmIChhcmdjID4gMTAwMDAwMCkgeworIDg6ICAgICBwcmludGYoIiVwIiwgJnQpOworIDk6ICAgfQorMTA6IAorMTE6ICAgcmV0dXJuIDA7CisxMjogfQorMTM6IGV4dGVybiB2b2lkIGZmaV9yYXdfY2FsbCgpOworMTQ6IGludCB0KHZvaWQpIHsgZmZpX3Jhd19jYWxsKCk7IHJldHVybiAwOyB9CisvKiBlbmQgKi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaGF2ZV9oZWFkZXI6IGNoZWNraW5nIGZvciBzaGx3YXBpLmguLi4gLS0tLS0tLS0tLS0tLS0tLS0tLS0gbm8KKworImNsYW5nIC1FIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAtSS91c3IvaW5jbHVkZS9mZmkgIC1JL3Vzci9sb2NhbC9vcHQvbGlieWFtbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvaW5jbHVkZSAtRF9YT1BFTl9TT1VSQ0UgLURfREFSV0lOX0NfU09VUkNFIC1EX0RBUldJTl9VTkxJTUlURURfU0VMRUNUIC1EX1JFRU5UUkFOVCAgIC1PMyAtZm5vLWZhc3QtbWF0aCAtZ2dkYjMgLVdhbGwgLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1wYXJlbnRoZXNlcyAtV25vLWxvbmctbG9uZyAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIC1Xbm8tdGF1dG9sb2dpY2FsLWNvbXBhcmUgLVduby1wYXJlbnRoZXNlcy1lcXVhbGl0eSAtV25vLWNvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZCAtV25vLXNlbGYtYXNzaWduIC1XdW51c2VkLXZhcmlhYmxlIC1XaW1wbGljaXQtaW50IC1XcG9pbnRlci1hcml0aCAtV3dyaXRlLXN0cmluZ3MgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVdzaG9ydGVuLTY0LXRvLTMyIC1XaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24gLVdkaXZpc2lvbi1ieS16ZXJvIC1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdleHRyYS10b2tlbnMgIC1mbm8tY29tbW9uIC1waXBlICBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0LmkiCitjb25mdGVzdC5jOjM6MTA6IGZhdGFsIGVycm9yOiAnc2hsd2FwaS5oJyBmaWxlIG5vdCBmb3VuZAorI2luY2x1ZGUgPHNobHdhcGkuaD4KKyAgICAgICAgIF4KKzEgZXJyb3IgZ2VuZXJhdGVkLgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisxOiAjaW5jbHVkZSAicnVieS5oIgorMjogCiszOiAjaW5jbHVkZSA8c2hsd2FwaS5oPgorLyogZW5kICovCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2hhdmVfZnVuYzogY2hlY2tpbmcgZm9yIHJiX3RocmVhZF9ibG9ja2luZ19yZWdpb24oKS4uLiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBubworCisiY2xhbmcgLW8gY29uZnRlc3QgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3g4Nl82NC1kYXJ3aW4xNiAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAvcnVieS9iYWNrd2FyZCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAgLUkuIC1JL3Vzci9pbmNsdWRlL2ZmaSAgLUkvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9pbmNsdWRlIC1EX1hPUEVOX1NPVVJDRSAtRF9EQVJXSU5fQ19TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QgLURfUkVFTlRSQU5UICAgLU8zIC1mbm8tZmFzdC1tYXRoIC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXBhcmVudGhlc2VzIC1Xbm8tbG9uZy1sb25nIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSAtV25vLXBhcmVudGhlc2VzLWVxdWFsaXR5IC1Xbm8tY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIC1Xbm8tc2VsZi1hc3NpZ24gLVd1bnVzZWQtdmFyaWFibGUgLVdpbXBsaWNpdC1pbnQgLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV3Nob3J0ZW4tNjQtdG8tMzIgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2RpdmlzaW9uLWJ5LXplcm8gLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2V4dHJhLXRva2VucyAgLWZuby1jb21tb24gLXBpcGUgY29uZnRlc3QuYyAgLUwuIC1ML3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgLUwuIC1mc3RhY2stcHJvdGVjdG9yIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliICAgIC1sZmZpICAtbHJ1YnkuMi40LjEgLWxmZmkgIC1scHRocmVhZCAtbGRsIC1sb2JqYyAiCitjb25mdGVzdC5jOjEzOjU3OiBlcnJvcjogdXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAncmJfdGhyZWFkX2Jsb2NraW5nX3JlZ2lvbicKK2ludCB0KHZvaWQpIHsgdm9pZCAoKCp2b2xhdGlsZSBwKSgpKTsgcCA9ICh2b2lkICgoKikoKSkpcmJfdGhyZWFkX2Jsb2NraW5nX3JlZ2lvbjsgcmV0dXJuICFwOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKzEgZXJyb3IgZ2VuZXJhdGVkLgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisgMTogI2luY2x1ZGUgInJ1YnkuaCIKKyAyOiAKKyAzOiAvKnRvcCovCisgNDogZXh0ZXJuIGludCB0KHZvaWQpOworIDU6IGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyA2OiB7CisgNzogICBpZiAoYXJnYyA+IDEwMDAwMDApIHsKKyA4OiAgICAgcHJpbnRmKCIlcCIsICZ0KTsKKyA5OiAgIH0KKzEwOiAKKzExOiAgIHJldHVybiAwOworMTI6IH0KKzEzOiBpbnQgdCh2b2lkKSB7IHZvaWQgKCgqdm9sYXRpbGUgcCkoKSk7IHAgPSAodm9pZCAoKCopKCkpKXJiX3RocmVhZF9ibG9ja2luZ19yZWdpb247IHJldHVybiAhcDsgfQorLyogZW5kICovCisKKyJjbGFuZyAtbyBjb25mdGVzdCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAveDg2XzY0LWRhcndpbjE2IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC9ydWJ5L2JhY2t3YXJkIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMCAtSS4gLUkvdXNyL2luY2x1ZGUvZmZpICAtSS91c3IvbG9jYWwvb3B0L2xpYnlhbWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L29wZW5zc2wvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2luY2x1ZGUgLURfWE9QRU5fU09VUkNFIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9EQVJXSU5fVU5MSU1JVEVEX1NFTEVDVCAtRF9SRUVOVFJBTlQgICAtTzMgLWZuby1mYXN0LW1hdGggLWdnZGIzIC1XYWxsIC1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tcGFyZW50aGVzZXMgLVduby1sb25nLWxvbmcgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXRhdXRvbG9naWNhbC1jb21wYXJlIC1Xbm8tcGFyZW50aGVzZXMtZXF1YWxpdHkgLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQgLVduby1zZWxmLWFzc2lnbiAtV3VudXNlZC12YXJpYWJsZSAtV2ltcGxpY2l0LWludCAtV3BvaW50ZXItYXJpdGggLVd3cml0ZS1zdHJpbmdzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xc2hvcnRlbi02NC10by0zMiAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZGl2aXNpb24tYnktemVybyAtV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XZXh0cmEtdG9rZW5zICAtZm5vLWNvbW1vbiAtcGlwZSBjb25mdGVzdC5jICAtTC4gLUwvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAtTC4gLWZzdGFjay1wcm90ZWN0b3IgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgICAgLWxmZmkgIC1scnVieS4yLjQuMSAtbGZmaSAgLWxwdGhyZWFkIC1sZGwgLWxvYmpjICIKK1VuZGVmaW5lZCBzeW1ib2xzIGZvciBhcmNoaXRlY3R1cmUgeDg2XzY0OgorICAiX3JiX3RocmVhZF9ibG9ja2luZ19yZWdpb24iLCByZWZlcmVuY2VkIGZyb206CisgICAgICBfdCBpbiBjb25mdGVzdC00ZjZiYjYubworbGQ6IHN5bWJvbChzKSBub3QgZm91bmQgZm9yIGFyY2hpdGVjdHVyZSB4ODZfNjQKK2NsYW5nOiBlcnJvcjogbGlua2VyIGNvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlIDEgKHVzZSAtdiB0byBzZWUgaW52b2NhdGlvbikKK2NoZWNrZWQgcHJvZ3JhbSB3YXM6CisvKiBiZWdpbiAqLworIDE6ICNpbmNsdWRlICJydWJ5LmgiCisgMjogCisgMzogLyp0b3AqLworIDQ6IGV4dGVybiBpbnQgdCh2b2lkKTsKKyA1OiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgNjogeworIDc6ICAgaWYgKGFyZ2MgPiAxMDAwMDAwKSB7CisgODogICAgIHByaW50ZigiJXAiLCAmdCk7CisgOTogICB9CisxMDogCisxMTogICByZXR1cm4gMDsKKzEyOiB9CisxMzogZXh0ZXJuIHZvaWQgcmJfdGhyZWFkX2Jsb2NraW5nX3JlZ2lvbigpOworMTQ6IGludCB0KHZvaWQpIHsgcmJfdGhyZWFkX2Jsb2NraW5nX3JlZ2lvbigpOyByZXR1cm4gMDsgfQorLyogZW5kICovCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2hhdmVfZnVuYzogY2hlY2tpbmcgZm9yIHJiX3RocmVhZF9jYWxsX3dpdGhfZ3ZsKCkuLi4gLS0tLS0tLS0tLS0tLS0tLS0tLS0geWVzCisKKyJjbGFuZyAtbyBjb25mdGVzdCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAveDg2XzY0LWRhcndpbjE2IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC9ydWJ5L2JhY2t3YXJkIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMCAtSS4gLUkvdXNyL2luY2x1ZGUvZmZpICAtSS91c3IvbG9jYWwvb3B0L2xpYnlhbWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L29wZW5zc2wvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2luY2x1ZGUgLURfWE9QRU5fU09VUkNFIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9EQVJXSU5fVU5MSU1JVEVEX1NFTEVDVCAtRF9SRUVOVFJBTlQgICAtTzMgLWZuby1mYXN0LW1hdGggLWdnZGIzIC1XYWxsIC1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tcGFyZW50aGVzZXMgLVduby1sb25nLWxvbmcgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXRhdXRvbG9naWNhbC1jb21wYXJlIC1Xbm8tcGFyZW50aGVzZXMtZXF1YWxpdHkgLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQgLVduby1zZWxmLWFzc2lnbiAtV3VudXNlZC12YXJpYWJsZSAtV2ltcGxpY2l0LWludCAtV3BvaW50ZXItYXJpdGggLVd3cml0ZS1zdHJpbmdzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xc2hvcnRlbi02NC10by0zMiAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZGl2aXNpb24tYnktemVybyAtV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XZXh0cmEtdG9rZW5zICAtZm5vLWNvbW1vbiAtcGlwZSBjb25mdGVzdC5jICAtTC4gLUwvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAtTC4gLWZzdGFjay1wcm90ZWN0b3IgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgICAgLWxmZmkgIC1scnVieS4yLjQuMSAtbGZmaSAgLWxwdGhyZWFkIC1sZGwgLWxvYmpjICIKK2NvbmZ0ZXN0LmM6MTM6NTc6IGVycm9yOiB1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdyYl90aHJlYWRfY2FsbF93aXRoX2d2bCcKK2ludCB0KHZvaWQpIHsgdm9pZCAoKCp2b2xhdGlsZSBwKSgpKTsgcCA9ICh2b2lkICgoKikoKSkpcmJfdGhyZWFkX2NhbGxfd2l0aF9ndmw7IHJldHVybiAhcDsgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisxIGVycm9yIGdlbmVyYXRlZC4KK2NoZWNrZWQgcHJvZ3JhbSB3YXM6CisvKiBiZWdpbiAqLworIDE6ICNpbmNsdWRlICJydWJ5LmgiCisgMjogCisgMzogLyp0b3AqLworIDQ6IGV4dGVybiBpbnQgdCh2b2lkKTsKKyA1OiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgNjogeworIDc6ICAgaWYgKGFyZ2MgPiAxMDAwMDAwKSB7CisgODogICAgIHByaW50ZigiJXAiLCAmdCk7CisgOTogICB9CisxMDogCisxMTogICByZXR1cm4gMDsKKzEyOiB9CisxMzogaW50IHQodm9pZCkgeyB2b2lkICgoKnZvbGF0aWxlIHApKCkpOyBwID0gKHZvaWQgKCgqKSgpKSlyYl90aHJlYWRfY2FsbF93aXRoX2d2bDsgcmV0dXJuICFwOyB9CisvKiBlbmQgKi8KKworImNsYW5nIC1vIGNvbmZ0ZXN0IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAtSS91c3IvaW5jbHVkZS9mZmkgIC1JL3Vzci9sb2NhbC9vcHQvbGlieWFtbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvaW5jbHVkZSAtRF9YT1BFTl9TT1VSQ0UgLURfREFSV0lOX0NfU09VUkNFIC1EX0RBUldJTl9VTkxJTUlURURfU0VMRUNUIC1EX1JFRU5UUkFOVCAgIC1PMyAtZm5vLWZhc3QtbWF0aCAtZ2dkYjMgLVdhbGwgLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1wYXJlbnRoZXNlcyAtV25vLWxvbmctbG9uZyAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIC1Xbm8tdGF1dG9sb2dpY2FsLWNvbXBhcmUgLVduby1wYXJlbnRoZXNlcy1lcXVhbGl0eSAtV25vLWNvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZCAtV25vLXNlbGYtYXNzaWduIC1XdW51c2VkLXZhcmlhYmxlIC1XaW1wbGljaXQtaW50IC1XcG9pbnRlci1hcml0aCAtV3dyaXRlLXN0cmluZ3MgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVdzaG9ydGVuLTY0LXRvLTMyIC1XaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24gLVdkaXZpc2lvbi1ieS16ZXJvIC1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdleHRyYS10b2tlbnMgIC1mbm8tY29tbW9uIC1waXBlIGNvbmZ0ZXN0LmMgIC1MLiAtTC91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9saWIgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliIC1MLiAtZnN0YWNrLXByb3RlY3RvciAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAgICAtbGZmaSAgLWxydWJ5LjIuNC4xIC1sZmZpICAtbHB0aHJlYWQgLWxkbCAtbG9iamMgIgorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisgMTogI2luY2x1ZGUgInJ1YnkuaCIKKyAyOiAKKyAzOiAvKnRvcCovCisgNDogZXh0ZXJuIGludCB0KHZvaWQpOworIDU6IGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyA2OiB7CisgNzogICBpZiAoYXJnYyA+IDEwMDAwMDApIHsKKyA4OiAgICAgcHJpbnRmKCIlcCIsICZ0KTsKKyA5OiAgIH0KKzEwOiAKKzExOiAgIHJldHVybiAwOworMTI6IH0KKzEzOiBleHRlcm4gdm9pZCByYl90aHJlYWRfY2FsbF93aXRoX2d2bCgpOworMTQ6IGludCB0KHZvaWQpIHsgcmJfdGhyZWFkX2NhbGxfd2l0aF9ndmwoKTsgcmV0dXJuIDA7IH0KKy8qIGVuZCAqLworCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitoYXZlX2Z1bmM6IGNoZWNraW5nIGZvciByYl90aHJlYWRfY2FsbF93aXRob3V0X2d2bCgpLi4uIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHllcworCisiY2xhbmcgLW8gY29uZnRlc3QgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3g4Nl82NC1kYXJ3aW4xNiAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAvcnVieS9iYWNrd2FyZCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAgLUkuIC1JL3Vzci9pbmNsdWRlL2ZmaSAgLUkvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2luY2x1ZGUgLUkvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9pbmNsdWRlIC1EX1hPUEVOX1NPVVJDRSAtRF9EQVJXSU5fQ19TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QgLURfUkVFTlRSQU5UICAgLU8zIC1mbm8tZmFzdC1tYXRoIC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXBhcmVudGhlc2VzIC1Xbm8tbG9uZy1sb25nIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSAtV25vLXBhcmVudGhlc2VzLWVxdWFsaXR5IC1Xbm8tY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIC1Xbm8tc2VsZi1hc3NpZ24gLVd1bnVzZWQtdmFyaWFibGUgLVdpbXBsaWNpdC1pbnQgLVdwb2ludGVyLWFyaXRoIC1Xd3JpdGUtc3RyaW5ncyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV3Nob3J0ZW4tNjQtdG8tMzIgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtV2RpdmlzaW9uLWJ5LXplcm8gLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2V4dHJhLXRva2VucyAgLWZuby1jb21tb24gLXBpcGUgY29uZnRlc3QuYyAgLUwuIC1ML3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgLUwuIC1mc3RhY2stcHJvdGVjdG9yIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliICAgIC1sZmZpICAtbHJ1YnkuMi40LjEgLWxmZmkgIC1scHRocmVhZCAtbGRsIC1sb2JqYyAiCitjb25mdGVzdC5jOjEzOjU3OiBlcnJvcjogdXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAncmJfdGhyZWFkX2NhbGxfd2l0aG91dF9ndmwnCitpbnQgdCh2b2lkKSB7IHZvaWQgKCgqdm9sYXRpbGUgcCkoKSk7IHAgPSAodm9pZCAoKCopKCkpKXJiX3RocmVhZF9jYWxsX3dpdGhvdXRfZ3ZsOyByZXR1cm4gIXA7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorMSBlcnJvciBnZW5lcmF0ZWQuCitjaGVja2VkIHByb2dyYW0gd2FzOgorLyogYmVnaW4gKi8KKyAxOiAjaW5jbHVkZSAicnVieS5oIgorIDI6IAorIDM6IC8qdG9wKi8KKyA0OiBleHRlcm4gaW50IHQodm9pZCk7CisgNTogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIDY6IHsKKyA3OiAgIGlmIChhcmdjID4gMTAwMDAwMCkgeworIDg6ICAgICBwcmludGYoIiVwIiwgJnQpOworIDk6ICAgfQorMTA6IAorMTE6ICAgcmV0dXJuIDA7CisxMjogfQorMTM6IGludCB0KHZvaWQpIHsgdm9pZCAoKCp2b2xhdGlsZSBwKSgpKTsgcCA9ICh2b2lkICgoKikoKSkpcmJfdGhyZWFkX2NhbGxfd2l0aG91dF9ndmw7IHJldHVybiAhcDsgfQorLyogZW5kICovCisKKyJjbGFuZyAtbyBjb25mdGVzdCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAveDg2XzY0LWRhcndpbjE2IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC9ydWJ5L2JhY2t3YXJkIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMCAtSS4gLUkvdXNyL2luY2x1ZGUvZmZpICAtSS91c3IvbG9jYWwvb3B0L2xpYnlhbWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L29wZW5zc2wvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2luY2x1ZGUgLURfWE9QRU5fU09VUkNFIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9EQVJXSU5fVU5MSU1JVEVEX1NFTEVDVCAtRF9SRUVOVFJBTlQgICAtTzMgLWZuby1mYXN0LW1hdGggLWdnZGIzIC1XYWxsIC1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tcGFyZW50aGVzZXMgLVduby1sb25nLWxvbmcgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXRhdXRvbG9naWNhbC1jb21wYXJlIC1Xbm8tcGFyZW50aGVzZXMtZXF1YWxpdHkgLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQgLVduby1zZWxmLWFzc2lnbiAtV3VudXNlZC12YXJpYWJsZSAtV2ltcGxpY2l0LWludCAtV3BvaW50ZXItYXJpdGggLVd3cml0ZS1zdHJpbmdzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xc2hvcnRlbi02NC10by0zMiAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZGl2aXNpb24tYnktemVybyAtV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XZXh0cmEtdG9rZW5zICAtZm5vLWNvbW1vbiAtcGlwZSBjb25mdGVzdC5jICAtTC4gLUwvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAtTC4gLWZzdGFjay1wcm90ZWN0b3IgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgICAgLWxmZmkgIC1scnVieS4yLjQuMSAtbGZmaSAgLWxwdGhyZWFkIC1sZGwgLWxvYmpjICIKK2NoZWNrZWQgcHJvZ3JhbSB3YXM6CisvKiBiZWdpbiAqLworIDE6ICNpbmNsdWRlICJydWJ5LmgiCisgMjogCisgMzogLyp0b3AqLworIDQ6IGV4dGVybiBpbnQgdCh2b2lkKTsKKyA1OiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgNjogeworIDc6ICAgaWYgKGFyZ2MgPiAxMDAwMDAwKSB7CisgODogICAgIHByaW50ZigiJXAiLCAmdCk7CisgOTogICB9CisxMDogCisxMTogICByZXR1cm4gMDsKKzEyOiB9CisxMzogZXh0ZXJuIHZvaWQgcmJfdGhyZWFkX2NhbGxfd2l0aG91dF9ndmwoKTsKKzE0OiBpbnQgdCh2b2lkKSB7IHJiX3RocmVhZF9jYWxsX3dpdGhvdXRfZ3ZsKCk7IHJldHVybiAwOyB9CisvKiBlbmQgKi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaGF2ZV9mdW5jOiBjaGVja2luZyBmb3IgZmZpX3ByZXBfY2lmX3ZhcigpLi4uIC0tLS0tLS0tLS0tLS0tLS0tLS0tIG5vCisKKyJjbGFuZyAtbyBjb25mdGVzdCAtSS91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAveDg2XzY0LWRhcndpbjE2IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC9ydWJ5L2JhY2t3YXJkIC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMCAtSS4gLUkvdXNyL2luY2x1ZGUvZmZpICAtSS91c3IvbG9jYWwvb3B0L2xpYnlhbWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L29wZW5zc2wvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2luY2x1ZGUgLURfWE9QRU5fU09VUkNFIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9EQVJXSU5fVU5MSU1JVEVEX1NFTEVDVCAtRF9SRUVOVFJBTlQgICAtTzMgLWZuby1mYXN0LW1hdGggLWdnZGIzIC1XYWxsIC1XZXh0cmEgLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tcGFyZW50aGVzZXMgLVduby1sb25nLWxvbmcgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXRhdXRvbG9naWNhbC1jb21wYXJlIC1Xbm8tcGFyZW50aGVzZXMtZXF1YWxpdHkgLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQgLVduby1zZWxmLWFzc2lnbiAtV3VudXNlZC12YXJpYWJsZSAtV2ltcGxpY2l0LWludCAtV3BvaW50ZXItYXJpdGggLVd3cml0ZS1zdHJpbmdzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xc2hvcnRlbi02NC10by0zMiAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIC1XZGl2aXNpb24tYnktemVybyAtV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XZXh0cmEtdG9rZW5zICAtZm5vLWNvbW1vbiAtcGlwZSBjb25mdGVzdC5jICAtTC4gLUwvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAtTC4gLWZzdGFjay1wcm90ZWN0b3IgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvbG9jYWwvb3B0L2xpYnlhbWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9saWIgLUwvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIgICAgLWxmZmkgIC1scnVieS4yLjQuMSAtbGZmaSAgLWxwdGhyZWFkIC1sZGwgLWxvYmpjICIKK2NvbmZ0ZXN0LmM6MTM6NTc6IGVycm9yOiB1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdmZmlfcHJlcF9jaWZfdmFyJworaW50IHQodm9pZCkgeyB2b2lkICgoKnZvbGF0aWxlIHApKCkpOyBwID0gKHZvaWQgKCgqKSgpKSlmZmlfcHJlcF9jaWZfdmFyOyByZXR1cm4gIXA7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorMSBlcnJvciBnZW5lcmF0ZWQuCitjaGVja2VkIHByb2dyYW0gd2FzOgorLyogYmVnaW4gKi8KKyAxOiAjaW5jbHVkZSAicnVieS5oIgorIDI6IAorIDM6IC8qdG9wKi8KKyA0OiBleHRlcm4gaW50IHQodm9pZCk7CisgNTogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIDY6IHsKKyA3OiAgIGlmIChhcmdjID4gMTAwMDAwMCkgeworIDg6ICAgICBwcmludGYoIiVwIiwgJnQpOworIDk6ICAgfQorMTA6IAorMTE6ICAgcmV0dXJuIDA7CisxMjogfQorMTM6IGludCB0KHZvaWQpIHsgdm9pZCAoKCp2b2xhdGlsZSBwKSgpKTsgcCA9ICh2b2lkICgoKikoKSkpZmZpX3ByZXBfY2lmX3ZhcjsgcmV0dXJuICFwOyB9CisvKiBlbmQgKi8KKworImNsYW5nIC1vIGNvbmZ0ZXN0IC1JL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xL2luY2x1ZGUvcnVieS0yLjQuMC94ODZfNjQtZGFyd2luMTYgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3J1YnkvYmFja3dhcmQgLUkvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wIC1JLiAtSS91c3IvaW5jbHVkZS9mZmkgIC1JL3Vzci9sb2NhbC9vcHQvbGlieWFtbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvb3BlbnNzbC9pbmNsdWRlIC1JL3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvaW5jbHVkZSAtRF9YT1BFTl9TT1VSQ0UgLURfREFSV0lOX0NfU09VUkNFIC1EX0RBUldJTl9VTkxJTUlURURfU0VMRUNUIC1EX1JFRU5UUkFOVCAgIC1PMyAtZm5vLWZhc3QtbWF0aCAtZ2dkYjMgLVdhbGwgLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1wYXJlbnRoZXNlcyAtV25vLWxvbmctbG9uZyAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIC1Xbm8tdGF1dG9sb2dpY2FsLWNvbXBhcmUgLVduby1wYXJlbnRoZXNlcy1lcXVhbGl0eSAtV25vLWNvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZCAtV25vLXNlbGYtYXNzaWduIC1XdW51c2VkLXZhcmlhYmxlIC1XaW1wbGljaXQtaW50IC1XcG9pbnRlci1hcml0aCAtV3dyaXRlLXN0cmluZ3MgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVdzaG9ydGVuLTY0LXRvLTMyIC1XaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24gLVdkaXZpc2lvbi1ieS16ZXJvIC1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdleHRyYS10b2tlbnMgIC1mbm8tY29tbW9uIC1waXBlIGNvbmZ0ZXN0LmMgIC1MLiAtTC91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9saWIgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliIC1MLiAtZnN0YWNrLXByb3RlY3RvciAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYiAgICAtbGZmaSAgLWxydWJ5LjIuNC4xIC1sZmZpICAtbHB0aHJlYWQgLWxkbCAtbG9iamMgIgorVW5kZWZpbmVkIHN5bWJvbHMgZm9yIGFyY2hpdGVjdHVyZSB4ODZfNjQ6CisgICJfZmZpX3ByZXBfY2lmX3ZhciIsIHJlZmVyZW5jZWQgZnJvbToKKyAgICAgIF90IGluIGNvbmZ0ZXN0LWU0MGFhMi5vCitsZDogc3ltYm9sKHMpIG5vdCBmb3VuZCBmb3IgYXJjaGl0ZWN0dXJlIHg4Nl82NAorY2xhbmc6IGVycm9yOiBsaW5rZXIgY29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgMSAodXNlIC12IHRvIHNlZSBpbnZvY2F0aW9uKQorY2hlY2tlZCBwcm9ncmFtIHdhczoKKy8qIGJlZ2luICovCisgMTogI2luY2x1ZGUgInJ1YnkuaCIKKyAyOiAKKyAzOiAvKnRvcCovCisgNDogZXh0ZXJuIGludCB0KHZvaWQpOworIDU6IGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyA2OiB7CisgNzogICBpZiAoYXJnYyA+IDEwMDAwMDApIHsKKyA4OiAgICAgcHJpbnRmKCIlcCIsICZ0KTsKKyA5OiAgIH0KKzEwOiAKKzExOiAgIHJldHVybiAwOworMTI6IH0KKzEzOiBleHRlcm4gdm9pZCBmZmlfcHJlcF9jaWZfdmFyKCk7CisxNDogaW50IHQodm9pZCkgeyBmZmlfcHJlcF9jaWZfdmFyKCk7IHJldHVybiAwOyB9CisvKiBlbmQgKi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0Y29uZi5oIGlzOgorLyogYmVnaW4gKi8KKzE6ICNpZm5kZWYgRVhUQ09ORl9ICisyOiAjZGVmaW5lIEVYVENPTkZfSAorMzogI2RlZmluZSBIQVZFX0ZGSV9QUkVQX0NMT1NVUkUgMQorNDogI2RlZmluZSBIQVZFX1JCX1RIUkVBRF9DQUxMX1dJVEhfR1ZMIDEKKzU6ICNkZWZpbmUgSEFWRV9SQl9USFJFQURfQ0FMTF9XSVRIT1VUX0dWTCAxCis2OiAjZGVmaW5lIFJVQllfMV85IDEKKzc6ICNlbmRpZgorLyogZW5kICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL0NIQU5HRUxPRy5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL0NIQU5HRUxPRy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNhY2QyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvQ0hBTkdFTE9HLm1kCkBAIC0wLDAgKzEsMjE2IEBACisjIEFkZHJlc3NhYmxlIDIuNS4yCistIGJldHRlciBzdXBwb3J0IGZvciBmcm96ZW4gc3RyaW5nIGxpdGVyYWxzCistIGZpeGVkIGJ1ZyB3LyB1cHBlcmNhc2UgY2hhcmFjdGVycyBpbiBzY2hlbWUKKy0gSUROQSBlcnJvcnMgdy8gZW1vamkgVVJMcworLSBjb21wYXRpYmlsaXR5IHcvIHB1YmxpY19zdWZmaXggMy54CisKKyMgQWRkcmVzc2FibGUgMi41LjEKKy0gYWxsb3cgdW5pY29kZSBub3JtYWxpemF0aW9uIHRvIGJlIGRpc2FibGVkIGZvciBVUkkgVGVtcGxhdGUgZXhwYW5zaW9uCistIHJlbW92ZWQgZHVwbGljYXRlIHRlc3QKKworIyBBZGRyZXNzYWJsZSAyLjUuMAorLSBkcm9wcGluZyBzdXBwb3J0IGZvciBSdWJ5IDEuOQorLSBhZGRpbmcgc3VwcG9ydCBmb3IgUnVieSAyLjQgcHJldmlldworLSBhZGQgc3VwcG9ydCBmb3IgcHVibGljIHN1ZmZpeGVzIGFuZCB0bGQ7IGZpcnN0IHJ1bnRpbWUgZGVwZW5kZW5jeQorLSBob3N0bmFtZSBlc2NhcGluZyBzaG91bGQgbWF0Y2ggUkZDOyB1bmRlcnNjb3JlcyBpbiBob3N0bmFtZXMgbm8gbG9uZ2VyIGVzY2FwZWQKKy0gcGF0aHMgYmVnaW5uaW5nIHdpdGggLy8gYW5kIG1pc3NpbmcgYW4gYXV0aG9yaXR5IGFyZSBub3cgY29uc2lkZXJlZCBpbnZhbGlkCistIHZhbGlkYXRpb24gbm93IGFsc28gdGFrZXMgcGxhY2UgYWZ0ZXIgc2V0dGluZyBhIHBhdGgKKy0gaGFuZGxlIGJhY2tzbGFzaGVzIGluIGF1dGhvcml0eSBtb3JlIGxpa2UgYSBicm93c2VyIGZvciBgaGV1cmlzdGljX3BhcnNlYAorLSB1bmVzY2FwZWQgYmFja3NsYXNoZXMgaW4gaG9zdCBub3cgcmFpc2UgYW4gYEludmFsaWRVUklFcnJvcmAKKy0gYG1lcmdlIWAsIGBqb2luIWAsIGBvbWl0IWAgYW5kIGBub3JtYWxpemUhYCBkb24ndCBkaXNhYmxlIGRlZmVycmVkIHZhbGlkYXRpb24KKy0gYGhldXJpc3RpY19wYXJzZWAgbm93IHRyaW1zIHdoaXRlc3BhY2UgYmVmb3JlIHBhcnNpbmcKKy0gaG9zdCBwYXJ0cyBsb25nZXIgdGhhbiA2MyBieXRlcyB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBwYXNzZWQgdG8gbGliaWRuCistIG5vcm1hbGl6ZWQgdmFsdWVzIGFsd2F5cyBlbmNvZGVkIGFzIFVURi04CisKKyMgQWRkcmVzc2FibGUgMi40LjAKKy0gc3VwcG9ydCBmb3IgMS44LnggZHJvcHBlZAorLSBkb3VibGUgcXVvdGVzIGluIGEgaG9zdCBub3cgcmFpc2VzIGFuIGVycm9yCistIG5ld2xpbmVzIGluIGhvc3Qgd2lsbCBubyBsb25nZXIgZ2V0IHVuZXNjYXBlZCBkdXJpbmcgbm9ybWFsaXphdGlvbgorLSBzdHJpY3RlciBoYW5kbGluZyBvZiBib2d1cyBzY2hlbWUgdmFsdWVzCistIHN0cmljdGVyIGhhbmRsaW5nIG9mIGVuY29kZWQgcG9ydCB2YWx1ZXMKKy0gY2FsbGluZyBgcmVxdWlyZSAnYWRkcmVzc2FibGUnYCB3aWxsIG5vdyBsb2FkIGJvdGggdGhlIFVSSSBhbmQgVGVtcGxhdGUgZmlsZXMKKy0gYXNzaWduaW5nIHRvIHRoZSBgaG9zdG5hbWVgIGNvbXBvbmVudCB3aXRoIGFuIGBJUEFkZHJgIG9iamVjdCBpcyBub3cgc3VwcG9ydGVkCistIGFzc2lnbmluZyB0byB0aGUgYG9yaWdpbmAgY29tcG9uZW50IGlzIG5vdyBzdXBwb3J0ZWQKKy0gZml4ZWQgbWlub3IgYnVnIHdoZXJlIGFuIGV4Y2VwdGlvbiB3b3VsZCBiZSB0aHJvd24gZm9yIGEgbWlzc2luZyBBQ0Ugc3VmZml4CistIGJldHRlciBwYXJ0aWFsIGV4cGFuc2lvbiBvZiBVUkkgdGVtcGxhdGVzCisKKyMgQWRkcmVzc2FibGUgMi4zLjgKKy0gZml4IHdhcm5pbmdzCistIHVwZGF0ZSBkZXBlbmRlbmN5IGdlbXMKKy0gc3VwcG9ydCBmb3IgMS44Lnggb2ZmaWNpYWxseSBkZXByZWNhdGVkCisKKyMgQWRkcmVzc2FibGUgMi4zLjcKKy0gZml4IHNjZW5hcmlvIGluIHdoaWNoIGludmFsaWQgVVJJcyBkb24ndCBnZXQgYW4gZXhjZXB0aW9uIHVudGlsIGluc3BlY3RlZAorLSBoYW5kbGUgaG9zdG5hbWVzIHdpdGggdHdvIGFkamFjZW50IHBlcmlvZHMgY29ycmVjdGx5CistIHVwZ3JhZGUgb2YgUlNwZWMKKworIyBBZGRyZXNzYWJsZSAyLjMuNgorLSBub3JtYWxpemF0aW9uIGRyb3BzIGVtcHR5IHF1ZXJ5IHN0cmluZworLSBiZXR0ZXIgaGFuZGxpbmcgaW4gdGVtcGxhdGUgZXh0cmFjdCBmb3IgbWlzc2luZyB2YWx1ZXMKKy0gdGVtcGxhdGUgbW9kaWZpZXIgZm9yIGAnPydgIG5vdyB0cmVhdGVkIGFzIG9wdGlvbmFsCistIGZpeGVkIGlzc3VlIHdoZXJlIGNoYXJhY3RlciBjbGFzcyBwYXJhbWV0ZXJzIHdlcmUgbW9kaWZpZWQKKy0gdGVtcGxhdGVzIGNhbiBub3cgYmUgdGVzdGVkIGZvciBlcXVhbGl0eQorLSBhZGRlZCBgOnNvcnRlZGAgb3B0aW9uIHRvIG5vcm1hbGl6YXRpb24gb2YgcXVlcnkgc3RyaW5ncworLSBmaXhlZCBpc3N1ZSB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaG9zdHMgZ2l2ZW4gaW4gYCdleGFtcGxlLmNvbS4nYCBmb3JtCisKKyMgQWRkcmVzc2FibGUgMi4zLjUKKy0gYWRkZWQgQWRkcmVzc2FibGU6OlVSSSNlbXB0eT8gbWV0aG9kCistIEFkZHJlc3NhYmxlOjpVUkkjaG9zdG5hbWUgbWV0aG9kcyBub3cgc3RyaXAgc3F1YXJlIGJyYWNrZXRzIGZyb20gSVB2NiBob3N0cworLSBjb21wYXRpYmlsaXR5IHdpdGggTmV0OjpIVFRQIGluIFJ1YnkgMi4wLjAKKy0gQWRkcmVzc2FibGU6OlVSSSNyb3V0ZV9mcm9tIHNob3VsZCBhbHdheXMgZ2l2ZSByZWxhdGl2ZSBVUklzCisKKyMgQWRkcmVzc2FibGUgMi4zLjQKKy0gZml4ZWQgaXNzdWUgd2l0aCBlbmNvZGluZyBhbHRlcmluZyBpdHMgaW5wdXRzCistIHF1ZXJ5IHN0cmluZyBub3JtYWxpemF0aW9uIG5vdyBsZWF2ZXMgJzsnIGNoYXJhY3RlcnMgYWxvbmUKKy0gRmFrZUZTIGlzIGRldGVjdGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGxvYWQgdW5pY29kZSB0YWJsZXMKKy0gYWRkaXRpb25hbCB0ZXN0aW5nIHRvIGVuc3VyZSBmcm96ZW4gb2JqZWN0cyBkb24ndCBjYXVzZSBwcm9ibGVtcworCisjIEFkZHJlc3NhYmxlIDIuMy4zCistIGZpeGVkIGlzc3VlIHdpdGggY29udmVydGluZyBjb21tb24gcHJpbWl0aXZlcyBkdXJpbmcgdGVtcGxhdGUgZXhwYW5zaW9uCistIGZpeGVkIHBvcnQgZW5jb2RpbmcgaXNzdWUKKy0gcmVtb3ZlZCBhIGZldyB3YXJuaW5ncworLSBub3JtYWxpemUgc2hvdWxkIG5vdyBpZ25vcmUgJTJCIGluIHF1ZXJ5IHN0cmluZ3MKKy0gdGhlIElETkEgbG9naWMgc2hvdWxkIG5vdyBiZSBoYW5kbGVkIGJ5IGxpYmlkbiBpbiBSdWJ5IDEuOQorLSBubyB0ZW1wbGF0ZSBtYXRjaCBzaG91bGQgbm93IHJlc3VsdCBpbiBuaWwgaW5zdGVhZCBvZiBhbiBlbXB0eSBNYXRjaERhdGEKKy0gYWRkZWQgbGljZW5zZSBpbmZvcm1hdGlvbiB0byBnZW1zcGVjCisKKyMgQWRkcmVzc2FibGUgMi4zLjIKKy0gYWRkZWQgQWRkcmVzc2FibGU6OlVSSSNkZWZhdWx0X3BvcnQgbWV0aG9kCistIGZpeGVkIGlzc3VlIHdpdGggTWFyc2hhbGxpbmcgVW5pY29kZSBkYXRhIG9uIFdpbmRvd3MKKy0gaW1wcm92ZWQgaGV1cmlzdGljIHBhcnNpbmcgdG8gYmV0dGVyIGhhbmRsZSBJUHY0IGFkZHJlc3NlcworCisjIEFkZHJlc3NhYmxlIDIuMy4xCistIGZpeGVkIG1pc3NpbmcgdW5pY29kZSBkYXRhIGZpbGUKKworIyBBZGRyZXNzYWJsZSAyLjMuMAorLSB1cGRhdGVkIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZSB0byB1c2UgUkZDIDY1NzAsIGxldmVsIDQKKy0gZml4ZWQgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgUnVieQorLSBtb3ZlZCB1bmljb2RlIHRhYmxlcyBpbnRvIGEgZGF0YSBmaWxlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zCistIHJlbW92aW5nIHN1cHBvcnQgZm9yIG11bHRpcGxlIHF1ZXJ5IHZhbHVlIG5vdGF0aW9ucworCisjIEFkZHJlc3NhYmxlIDIuMi44CistIGZpeGVkIGlzc3VlcyB3aXRoIGRvdCBzZWdtZW50IHJlbW92YWwgY29kZQorLSBmb3JtIGVuY29kaW5nIGNhbiBub3cgaGFuZGxlIG11bHRpcGxlIHZhbHVlcyBwZXIga2V5CistIHVwZGF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQKKworIyBBZGRyZXNzYWJsZSAyLjIuNworLSBmaXhlZCBpc3N1ZXMgcmVsYXRlZCB0byBBZGRyZXNzYWJsZTo6VVJJI3F1ZXJ5X3ZhbHVlcz0KKy0gdGhlIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UgbWV0aG9kIGlzIG5vdyBwb2x5bW9ycGhpYworCisjIEFkZHJlc3NhYmxlIDIuMi42CistIGNoYW5nZWQgdGhlIHdheSBhbWJpZ3VvdXMgcGF0aHMgYXJlIGhhbmRsZWQKKy0gZml4ZWQgYnVnIHdpdGggZnJvemVuIFVSSXMKKy0gaHR0cHMgc3VwcG9ydGVkIGluIGhldXJpc3RpYyBwYXJzaW5nCisKKyMgQWRkcmVzc2FibGUgMi4yLjUKKy0gJ3BhcnNpbmcnIGEgcHJlLXBhcnNlZCBVUkkgb2JqZWN0IGlzIG5vdyBhIGR1cCBvcGVyYXRpb24KKy0gaW50cm9kdWNlZCBjb25kaXRpb25hbCBzdXBwb3J0IGZvciBsaWJpZG4KKy0gZml4ZWQgbm9ybWFsaXphdGlvbiBpc3N1ZSBvbiBhbXBlcnNhbmRzIGluIHF1ZXJ5IHN0cmluZ3MKKy0gYWRkZWQgYWRkaXRpb25hbCB0ZXN0cyBhcm91bmQgaGFuZGxpbmcgb2YgcXVlcnkgc3RyaW5ncworCisjIEFkZHJlc3NhYmxlIDIuMi40CistIGFkZGVkIG9yaWdpbiBzdXBwb3J0IGZyb20gZHJhZnQtaWV0Zi13ZWJzZWMtb3JpZ2luLTAwCistIHJlc29sdmVkIGlzc3VlIHdpdGggYXR0ZW1wdGluZyB0byBuYXZpZ2F0ZSBiZWxvdyByb290CistIGZpeGVkIGJ1ZyB3aXRoIHN0cmluZyBzcGxpdHRpbmcgaW4gcXVlcnkgc3RyaW5ncworCisjIEFkZHJlc3NhYmxlIDIuMi4zCistIGFkZGVkIDpmbGF0X2FycmF5IG5vdGF0aW9uIGZvciBxdWVyeSBzdHJpbmdzCisKKyMgQWRkcmVzc2FibGUgMi4yLjIKKy0gZml4ZWQgaXNzdWUgd2l0aCBwZXJjZW50IGVzY2FwaW5nIG9mICcrJyBjaGFyYWN0ZXIgaW4gcXVlcnkgc3RyaW5ncworCisjIEFkZHJlc3NhYmxlIDIuMi4xCistIGFkZGVkIHN1cHBvcnQgZm9yIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZC4KKworIyBBZGRyZXNzYWJsZSAyLjIuMAorLSBhZGRlZCBzaXRlIG1ldGhvZHMKKy0gaW1wcm92ZWQgZG9jdW1lbnRhdGlvbgorCisjIEFkZHJlc3NhYmxlIDIuMS4yCistIGFkZGVkIEhUVFAgcmVxdWVzdCBVUkkgbWV0aG9kcworLSBiZXR0ZXIgaGFuZGxpbmcgb2YgV2luZG93cyBmaWxlIHBhdGhzCistIHZhbGlkYXRpb25fZGVmZXJyZWQgYm9vbGVhbiByZXBsYWNlZCB3aXRoIGRlZmVyX3ZhbGlkYXRpb24gYmxvY2sKKy0gbm9ybWFsaXphdGlvbiBvZiBwZXJjZW50LWVuY29kZWQgcGF0aHMgc2hvdWxkIG5vdyBiZSBjb3JyZWN0CistIGZpeGVkIGlzc3VlIHdpdGggY29uc3RydWN0aW5nIFVSSXMgd2l0aCByZWxhdGl2ZSBwYXRocworLSBmaXhlZCB3YXJuaW5ncworCisjIEFkZHJlc3NhYmxlIDIuMS4xCistIG1vcmUgdHlwZSBjaGVja2luZyBjaGFuZ2VzCistIGZpeGVkIGlzc3VlIHdpdGggdW5pY29kZSBub3JtYWxpemF0aW9uCistIGFkZGVkIG1ldGhvZCB0byBmaW5kIHRlbXBsYXRlIGRlZmF1bHRzCistIHN5bWJvbGljIGtleXMgYXJlIG5vdyBhbGxvd2VkIGluIHRlbXBsYXRlIG1hcHBpbmdzCistIG51bWVyaWMgdmFsdWVzIGFuZCBzeW1ib2xpYyB2YWx1ZXMgYXJlIG5vdyBhbGxvd2VkIGluIHRlbXBsYXRlIG1hcHBpbmdzCisKKyMgQWRkcmVzc2FibGUgMi4xLjAKKy0gcmVmYWN0b3JlZCBVUkkgdGVtcGxhdGUgc3VwcG9ydCBvdXQgaW50byBpdHMgb3duIGNsYXNzCistIHJlbW92ZWQgZXh0cmFjdCBtZXRob2QgZHVlIHRvIGJlaW5nIHVzZWxlc3MgYW5kIHVucmVsaWFibGUKKy0gcmVtb3ZlZCBBZGRyZXNzYWJsZTo6VVJJLmV4cGFuZF90ZW1wbGF0ZQorLSByZW1vdmVkIEFkZHJlc3NhYmxlOjpVUkkjZXh0cmFjdF9tYXBwaW5nCistIGFkZGVkIHBhcnRpYWwgdGVtcGxhdGUgZXhwYW5zaW9uCistIGZpeGVkIG1pbm9yIGJ1Z3MgaW4gdGhlIHBhcnNlIGFuZCBoZXVyaXN0aWNfcGFyc2UgbWV0aG9kcworLSBmaXhlZCBpbmNvbXBhdGliaWxpdHkgd2l0aCBSdWJ5IDEuOS4xCistIGZpeGVkIGJvdHRsZW5lY2sgaW4gQWRkcmVzc2FibGU6OlVSSSNoYXNoIGFuZCBBZGRyZXNzYWJsZTo6VVJJI3RvX3MKKy0gZml4ZWQgdW5pY29kZSBub3JtYWxpemF0aW9uIGV4Y2VwdGlvbgorLSB1cGRhdGVkIHF1ZXJ5X3ZhbHVlcyBtZXRob2RzIHRvIGJldHRlciBoYW5kbGUgc3Vic2NyaXB0IG5vdGF0aW9uCistIHdvcmtlZCBhcm91bmQgaXNzdWUgd2l0aCBmcmVlemluZyBVUklzCistIGltcHJvdmVkIHNwZWNzCisKKyMgQWRkcmVzc2FibGUgMi4wLjIKKy0gZml4ZWQgaXNzdWUgd2l0aCBVUkkgdGVtcGxhdGUgZXhwYW5zaW9uCistIGZpeGVkIGlzc3VlIHdpdGggcGVyY2VudCBlc2NhcGluZyBjaGFyYWN0ZXJzIDAtMTUKKworIyBBZGRyZXNzYWJsZSAyLjAuMQorLSBmaXhlZCBpc3N1ZSB3aXRoIHF1ZXJ5IHN0cmluZyBhc3NpZ25tZW50CistIGZpeGVkIGlzc3VlIHdpdGggaW1wcm9wZXJseSBlbmNvZGVkIGNvbXBvbmVudHMKKworIyBBZGRyZXNzYWJsZSAyLjAuMAorLSB0aGUgaW5pdGlhbGl6ZSBtZXRob2Qgbm93IHRha2VzIGFuIG9wdGlvbnMgaGFzaCBhcyBpdHMgb25seSBwYXJhbWV0ZXIKKy0gYWRkZWQgcXVlcnlfdmFsdWVzIG1ldGhvZCB0byBVUkkgY2xhc3MKKy0gY29tcGxldGVseSByZXBsYWNlZCBJRE5BIGltcGxlbWVudGF0aW9uIHdpdGggcHVyZSBSdWJ5CistIHJlbmFtZWQgQWRkcmVzc2FibGU6OkFERFJFU1NBQkxFX1ZFUlNJT04gdG8gQWRkcmVzc2FibGU6OlZFUlNJT04KKy0gY29tcGxldGVseSByZXdvcmtlZCB0aGUgUmFrZWZpbGUKKy0gY2hhbmdlZCB0aGUgYmVoYXZpb3Igb2YgdGhlIHBvcnQgbWV0aG9kIHNpZ25pZmljYW50bHkKKy0gQWRkcmVzc2FibGU6OlVSSS5lbmNvZGVfc2VnbWVudCwgQWRkcmVzc2FibGU6OlVSSS51bmVuY29kZV9zZWdtZW50IHJlbmFtZWQKKy0gZG9jdW1lbnRhdGlvbiBpcyBub3cgaW4gWUFSRCBmb3JtYXQKKy0gbW9yZSByaWdvcm91cyB0eXBlIGNoZWNraW5nCistIHRvX3N0ciBtZXRob2QgaW1wbGVtZW50ZWQsIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gU3RyaW5ncyBub3cgYWxsb3dlZAorLSBBZGRyZXNzYWJsZTo6VVJJI29taXQgbWV0aG9kIGFkZGVkLCBBZGRyZXNzYWJsZTo6VVJJI21lcmdlIG1ldGhvZCByZXBsYWNlZAorLSB1cGRhdGVkIFVSSSBUZW1wbGF0ZSBjb2RlIHRvIG1hdGNoIHYgMDMgb2YgdGhlIGRyYWZ0IHNwZWMKKy0gYWRkZWQgYSBidW5jaCBvZiBuZXcgc3BlY2lmaWNhdGlvbnMKKworIyBBZGRyZXNzYWJsZSAxLjAuNAorLSBzd2l0Y2hlZCB0byB1c2luZyBSU3BlYydzIHBlbmRpbmcgc3lzdGVtIGZvciBzcGVjcyB0aGF0IHJlbHkgb24gSUROCistIGZpeGVkIGlzc3VlIHdpdGggY3JlYXRpbmcgVVJJcyB3aXRoIHBhdGhzIHRoYXQgYXJlIG5vdCBwcmVmaXhlZCB3aXRoICcvJworCisjIEFkZHJlc3NhYmxlIDEuMC4zCistIGltcGxlbWVudGVkIGEgaGFzaCBtZXRob2QKKworIyBBZGRyZXNzYWJsZSAxLjAuMgorLSBmaXhlZCBtaW5vciBidWcgd2l0aCB0aGUgZXh0cmFjdF9tYXBwaW5nIG1ldGhvZAorCisjIEFkZHJlc3NhYmxlIDEuMC4xCistIGZpeGVkIG1pbm9yIGJ1ZyB3aXRoIHRoZSBleHRyYWN0X21hcHBpbmcgbWV0aG9kCisKKyMgQWRkcmVzc2FibGUgMS4wLjAKKy0gaGV1cmlzdGljIHBhcnNlIG1ldGhvZCBhZGRlZAorLSBwYXJzaW5nIGlzIHNsaWdodGx5IG1vcmUgc3RyaWN0CistIHJlcGxhY2VkIHRvX2ggd2l0aCB0b19oYXNoCistIGZpeGVkIHJvdXRpbmcgbWV0aG9kcworLSBpbXByb3ZlZCBzcGVjaWZpY2F0aW9ucworLSBpbXByb3ZlZCBoZWNrbGUgcmFrZSB0YXNrCistIG5vIHN1cnZpdmluZyBoZWNrbGUgbXV0YXRpb25zCisKKyMgQWRkcmVzc2FibGUgMC4xLjIKKy0gaW1wcm92ZWQgbm9ybWFsaXphdGlvbgorLSBmaXhlZCBidWcgaW4gam9pbmluZyBhbGdvcml0aG0KKy0gdXBkYXRlZCBzcGVjaWZpY2F0aW9ucworCisjIEFkZHJlc3NhYmxlIDAuMS4xCistIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbgorLSBhZGRlZCBVUkkgVGVtcGxhdGUgdmFyaWFibGUgZXh0cmFjdGlvbgorCisjIEFkZHJlc3NhYmxlIDAuMS4wCistIGluaXRpYWwgcmVsZWFzZQorLSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBSRkMgMzk4NiwgMzk4NworLSBzdXBwb3J0IGZvciBJUklzIHZpYSBsaWJpZG4KKy0gc3VwcG9ydCBmb3IgdGhlIFVSSSBUZW1wbGF0ZSBkcmFmdCBzcGVjCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9HZW1maWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM0NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvR2VtZmlsZQpAQCAtMCwwICsxLDMyIEBACitzb3VyY2UgJ2h0dHBzOi8vcnVieWdlbXMub3JnJworCitnZW1zcGVjCisKK2dyb3VwIDp0ZXN0IGRvCisgIGdlbSAncnNwZWMnLCAnfj4gMy4wJworICBnZW0gJ3JzcGVjLWl0cycsICd+PiAxLjEnCitlbmQKKworZ3JvdXAgOmRldmVsb3BtZW50IGRvCisgIGdlbSAnbGF1bmNoeScsICd+PiAyLjQnLCAnPj0gMi40LjMnCisgIGdlbSAncmVkY2FycGV0JywgOnBsYXRmb3JtID0+IDptcmlfMTkKKyAgZ2VtICd5YXJkJworZW5kCisKK2dyb3VwIDp0ZXN0LCA6ZGV2ZWxvcG1lbnQgZG8KKyAgZ2VtICdyYWtlJywgJz4gMTAuMCcsICc8IDEyJworICBnZW0gJ3NpbXBsZWNvdicsIDpyZXF1aXJlID0+IGZhbHNlCisgIGdlbSAnY292ZXJhbGxzJywgOnJlcXVpcmUgPT4gZmFsc2UsIDpwbGF0Zm9ybXMgPT4gWworICAgIDpydWJ5XzIwLCA6cnVieV8yMSwgOnJ1YnlfMjIsIDpydWJ5XzIzCisgIF0KKyAgIyBVc2VkIHRvIHRlc3QgY29tcGF0aWJpbGl0eS4KKyAgZ2VtICdyYWNrLW1vdW50JywgZ2l0OiAnaHR0cHM6Ly9naXRodWIuY29tL3Nwb3JrbW9uZ2VyL3JhY2stbW91bnQuZ2l0JywgcmVxdWlyZTogJ3JhY2svbW91bnQnCisKKyAgaWYgUlVCWV9WRVJTSU9OLnN0YXJ0X3dpdGg/KCcyLjAnLCAnMi4xJykKKyAgICBnZW0gJ3JhY2snLCAnPCAyJywgOnJlcXVpcmUgPT4gZmFsc2UKKyAgZWxzZQorICAgIGdlbSAncmFjaycsIDpyZXF1aXJlID0+IGZhbHNlCisgIGVuZAorZW5kCisKK2dlbSAnaWRuLXJ1YnknLCA6cGxhdGZvcm0gPT4gWzptcmlfMjAsIDptcmlfMjEsIDptcmlfMjIsIDptcmlfMjMsIDptcmlfMjRdCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9MSUNFTlNFLnR4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTFkYTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworMS4gRGVmaW5pdGlvbnMuCisKKyAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKzQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKzUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCitDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDFmZDBlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTIxIEBACisjIEFkZHJlc3NhYmxlCisKKzxkbD4KKyAgPGR0PkhvbWVwYWdlPC9kdD48ZGQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Nwb3JrbW9uZ2VyL2FkZHJlc3NhYmxlIj5naXRodWIuY29tL3Nwb3JrbW9uZ2VyL2FkZHJlc3NhYmxlPC9hPjwvZGQ+CisgIDxkdD5BdXRob3I8L2R0PjxkZD48YSBocmVmPSJtYWlsdG86Ym9iQHNwb3JrbW9uZ2VyLmNvbSI+Qm9iIEFtYW48L2E+PC9kZD4KKyAgPGR0PkNvcHlyaWdodDwvZHQ+PGRkPkNvcHlyaWdodCDCqSBCb2IgQW1hbjwvZGQ+CisgIDxkdD5MaWNlbnNlPC9kdD48ZGQ+QXBhY2hlIDIuMDwvZGQ+Cis8L2RsPgorCitbIVtHZW0gVmVyc2lvbl0oaHR0cDovL2ltZy5zaGllbGRzLmlvL2dlbS9kdC9hZGRyZXNzYWJsZS5zdmcpXVtnZW1dCitbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vc2VjdXJlLnRyYXZpcy1jaS5vcmcvc3Bvcmttb25nZXIvYWRkcmVzc2FibGUuc3ZnP2JyYW5jaD1tYXN0ZXIpXVt0cmF2aXNdCitbIVtEZXBlbmRlbmN5IFN0YXR1c10oaHR0cHM6Ly9nZW1uYXNpdW0uY29tL3Nwb3JrbW9uZ2VyL2FkZHJlc3NhYmxlLnN2Zz90cmF2aXMpXVtnZW1uYXNpdW1dCitbIVtUZXN0IENvdmVyYWdlIFN0YXR1c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9jb3ZlcmFsbHMvc3Bvcmttb25nZXIvYWRkcmVzc2FibGUuc3ZnKV1bY292ZXJhbGxzXQorWyFbRG9jdW1lbnRhdGlvbiBDb3ZlcmFnZSBTdGF0dXNdKGh0dHA6Ly9pbmNoLWNpLm9yZy9naXRodWIvc3Bvcmttb25nZXIvYWRkcmVzc2FibGUuc3ZnP2JyYW5jaD1tYXN0ZXIpXVtpbmNoXQorCitbZ2VtXTogaHR0cHM6Ly9ydWJ5Z2Vtcy5vcmcvZ2Vtcy9hZGRyZXNzYWJsZQorW3RyYXZpc106IGh0dHA6Ly90cmF2aXMtY2kub3JnL3Nwb3JrbW9uZ2VyL2FkZHJlc3NhYmxlCitbZ2VtbmFzaXVtXTogaHR0cHM6Ly9nZW1uYXNpdW0uY29tL3Nwb3JrbW9uZ2VyL2FkZHJlc3NhYmxlCitbY292ZXJhbGxzXTogaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vci9zcG9ya21vbmdlci9hZGRyZXNzYWJsZQorW2luY2hdOiBodHRwOi8vaW5jaC1jaS5vcmcvZ2l0aHViL3Nwb3JrbW9uZ2VyL2FkZHJlc3NhYmxlCisKKyMgRGVzY3JpcHRpb24KKworQWRkcmVzc2FibGUgaXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIFVSSSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHBhcnQgb2YKK1J1YnkncyBzdGFuZGFyZCBsaWJyYXJ5LiBJdCBtb3JlIGNsb3NlbHkgY29uZm9ybXMgdG8gUkZDIDM5ODYsIFJGQyAzOTg3LCBhbmQKK1JGQyA2NTcwIChsZXZlbCA0KSwgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIElSSXMgYW5kIFVSSSB0ZW1wbGF0ZXMuCisKKyMgUmVmZXJlbmNlCisKKy0ge0FkZHJlc3NhYmxlOjpVUkl9CistIHtBZGRyZXNzYWJsZTo6VGVtcGxhdGV9CisKKyMgRXhhbXBsZSB1c2FnZQorCitgYGBydWJ5CityZXF1aXJlICJhZGRyZXNzYWJsZS91cmkiCisKK3VyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlLyIpCit1cmkuc2NoZW1lCisjPT4gImh0dHAiCit1cmkuaG9zdAorIz0+ICJleGFtcGxlLmNvbSIKK3VyaS5wYXRoCisjPT4gIi9wYXRoL3RvL3Jlc291cmNlLyIKKwordXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL3d3dy7oqbnlp4bmlq8uY29tLyIpCit1cmkubm9ybWFsaXplCisjPT4gIzxBZGRyZXNzYWJsZTo6VVJJOjB4YzlhNGM4IFVSSTpodHRwOi8vd3d3LnhuLS04d3MwMHpoeTNhLmNvbS8+CitgYGAKKworCisjIFVSSSBUZW1wbGF0ZXMKKworRm9yIG1vcmUgZGV0YWlscywgc2VlIFtSRkMgNjU3MF0oaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzY1NzAudHh0KS4KKworCitgYGBydWJ5CisKK3JlcXVpcmUgImFkZHJlc3NhYmxlL3RlbXBsYXRlIgorCit0ZW1wbGF0ZSA9IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImh0dHA6Ly9leGFtcGxlLmNvbS97P3F1ZXJ5Kn0vIikKK3RlbXBsYXRlLmV4cGFuZCh7CisgICJxdWVyeSIgPT4geworICAgICdmb28nID0+ICdiYXInLAorICAgICdjb2xvcicgPT4gJ3JlZCcKKyAgfQorfSkKKyM9PiAjPEFkZHJlc3NhYmxlOjpVUkk6MHhjOWQ5NWMgVVJJOmh0dHA6Ly9leGFtcGxlLmNvbS8/Zm9vPWJhciZjb2xvcj1yZWQ+CisKK3RlbXBsYXRlID0gQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tL3s/b25lLHR3byx0aHJlZX0iKQordGVtcGxhdGUucGFydGlhbF9leHBhbmQoeyJvbmUiID0+ICIxIiwgInRocmVlIiA9PiAzfSkucGF0dGVybgorIz0+ICJodHRwOi8vZXhhbXBsZS5jb20vP29uZT0xeyZ0d299JnRocmVlPTMiCisKK3RlbXBsYXRlID0gQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgImh0dHA6Ly97aG9zdH17L3NlZ21lbnRzKn0vez9vbmUsdHdvLGJvZ3VzfXsjZnJhZ21lbnR9IgorKQordXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgImh0dHA6Ly9leGFtcGxlLmNvbS9hL2IvYy8/b25lPTEmdHdvPTIjZm9vIgorKQordGVtcGxhdGUuZXh0cmFjdCh1cmkpCisjPT4KKyMgeworIyAgICJob3N0IiA9PiAiZXhhbXBsZS5jb20iLAorIyAgICJzZWdtZW50cyIgPT4gWyJhIiwgImIiLCAiYyJdLAorIyAgICJvbmUiID0+ICIxIiwKKyMgICAidHdvIiA9PiAiMiIsCisjICAgImZyYWdtZW50IiA9PiAiZm9vIgorIyB9CitgYGAKKworIyBJbnN0YWxsCisKK2BgYGNvbnNvbGUKKyQgZ2VtIGluc3RhbGwgYWRkcmVzc2FibGUKK2BgYAorCitZb3UgbWF5IG9wdGlvbmFsbHkgdHVybiBvbiBuYXRpdmUgSUROIHN1cHBvcnQgYnkgaW5zdGFsbGluZyBsaWJpZG4gYW5kIHRoZQoraWRuIGdlbToKKworYGBgY29uc29sZQorJCBzdWRvIGFwdC1nZXQgaW5zdGFsbCBpZG4gIyBEZWJpYW4vVWJ1bnR1CiskIGJyZXcgaW5zdGFsbCBsaWJpZG4gIyBPUyBYCiskIGdlbSBpbnN0YWxsIGlkbi1ydWJ5CitgYGAKKworIyBTZW1hbnRpYyBWZXJzaW9uaW5nCisKK1RoaXMgcHJvamVjdCB1c2VzIHNlbWVudGljIHZlcnNpb25pbmcuIFlvdSBjYW4gKGFuZCBzaG91bGQpIHNwZWNpZnkgeW91cgorZGVwZW5kZW5jeSB1c2luZyBhIHBlc3NpbWlzdGljIHZlcnNpb24gY29uc3RyYWludCBjb3ZlcmluZyB0aGUgbWFqb3IgYW5kIG1pbm9yCit2YWx1ZXM6CisKK2BgYHJ1YnkKK3NwZWMuYWRkX2RlcGVuZGVuY3kgJ2FkZHJlc3NhYmxlJywgJ34+IDIuNScKK2BgYAorCitJZiB5b3UgbmVlZCBhIHNwZWNpZmljIGJ1ZyBmaXgsIHlvdSBjYW4gYWxzbyBzcGVjaWZ5IG1pbmltdW0gdGlueSB2ZXJzaW9ucword2l0aG91dCBwcmV2ZW50aW5nIHVwZGF0ZXMgdG8gdGhlIGxhdGVzdCBtaW5vciByZWxlYXNlOgorCitgYGBydWJ5CitzcGVjLmFkZF9kZXBlbmRlbmN5ICdhZGRyZXNzYWJsZScsICd+PiAyLjMnLCAnPj0gMi4zLjcnCitgYGAKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL1Jha2VmaWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvUmFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkY2I4YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL1Jha2VmaWxlCkBAIC0wLDAgKzEsMzIgQEAKK3JlcXVpcmUgJ3J1YnlnZW1zJworcmVxdWlyZSAncmFrZScKKworcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJ2xpYicsICdhZGRyZXNzYWJsZScsICd2ZXJzaW9uJykKKworUEtHX0RJU1BMQVlfTkFNRSAgID0gJ0FkZHJlc3NhYmxlJworUEtHX05BTUUgICAgICAgICAgID0gUEtHX0RJU1BMQVlfTkFNRS5kb3duY2FzZQorUEtHX1ZFUlNJT04gICAgICAgID0gQWRkcmVzc2FibGU6OlZFUlNJT046OlNUUklORworUEtHX0ZJTEVfTkFNRSAgICAgID0gIiN7UEtHX05BTUV9LSN7UEtHX1ZFUlNJT059IgorCitSRUxFQVNFX05BTUUgICAgICAgPSAiUkVMICN7UEtHX1ZFUlNJT059IgorCitQS0dfU1VNTUFSWSAgICAgICAgPSAiVVJJIEltcGxlbWVudGF0aW9uIgorUEtHX0RFU0NSSVBUSU9OICAgID0gPDwtVEVYVAorQWRkcmVzc2FibGUgaXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIFVSSSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHBhcnQgb2YKK1J1YnkncyBzdGFuZGFyZCBsaWJyYXJ5LiBJdCBtb3JlIGNsb3NlbHkgY29uZm9ybXMgdG8gdGhlIHJlbGV2YW50IFJGQ3MgYW5kCithZGRzIHN1cHBvcnQgZm9yIElSSXMgYW5kIFVSSSB0ZW1wbGF0ZXMuCitURVhUCisKK1BLR19GSUxFUyA9IEZpbGVMaXN0WworICAgICJsaWIvKiovKiIsICJzcGVjLyoqLyoiLCAidmVuZG9yLyoqLyoiLCAiZGF0YS8qKi8qIiwKKyAgICAidGFza3MvKiovKiIsCisgICAgIltBLVpdKiIsICJSYWtlZmlsZSIKK10uZXhjbHVkZSgvcGtnLykuZXhjbHVkZSgvZGF0YWJhc2VcLnltbC8pLgorICBleGNsdWRlKC9HZW1maWxlXC5sb2NrLykuZXhjbHVkZSgvW19cLl1naXQkLykKKwordGFzayA6ZGVmYXVsdCA9PiAic3BlYyIKKworV0lORE9XUyA9IChSVUJZX1BMQVRGT1JNID1+IC9tc3dpbnx3aW4zMnxtaW5nd3xiY2N3aW58Y3lnd2luLykgcmVzY3VlIGZhbHNlCitTVURPID0gV0lORE9XUyA/ICcnIDogKCdzdWRvJyB1bmxlc3MgRU5WWydTVURPTEVTUyddKQorCitEaXJbJ3Rhc2tzLyoqLyoucmFrZSddLmVhY2ggeyB8cmFrZXwgbG9hZCByYWtlIH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2RhdGEvdW5pY29kZS5kYXRhIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvZGF0YS91bmljb2RlLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmYzIyNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2RhdGEvdW5pY29kZS5kYXRhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDlhMDVlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvbGliL2FkZHJlc3NhYmxlLnJiCkBAIC0wLDAgKzEsMiBAQAorcmVxdWlyZSAnYWRkcmVzc2FibGUvdXJpJworcmVxdWlyZSAnYWRkcmVzc2FibGUvdGVtcGxhdGUnCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9saWIvYWRkcmVzc2FibGUvaWRuYS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS9pZG5hLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGExYjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9saWIvYWRkcmVzc2FibGUvaWRuYS5yYgpAQCAtMCwwICsxLDI1IEBACisjIGVuY29kaW5nOnV0Zi04CisjLS0KKyMgQ29weXJpZ2h0IChDKSBCb2IgQW1hbgorIworIyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIysrCisKKworYmVnaW4KKyAgcmVxdWlyZSAiYWRkcmVzc2FibGUvaWRuYS9uYXRpdmUiCityZXNjdWUgTG9hZEVycm9yCisgICMgbGliaWRuIG9yIHRoZSBpZG4gZ2VtIHdhcyBub3QgYXZhaWxhYmxlLCBmYWxsIGJhY2sgb24gYSBwdXJlLVJ1YnkKKyAgIyBpbXBsZW1lbnRhdGlvbi4uLgorICByZXF1aXJlICJhZGRyZXNzYWJsZS9pZG5hL3B1cmUiCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS9pZG5hL25hdGl2ZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS9pZG5hL25hdGl2ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2MyMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvbGliL2FkZHJlc3NhYmxlL2lkbmEvbmF0aXZlLnJiCkBAIC0wLDAgKzEsNTkgQEAKKyMgZW5jb2Rpbmc6dXRmLTgKKyMtLQorIyBDb3B5cmlnaHQgKEMpIEJvYiBBbWFuCisjCisjICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjKysKKworCityZXF1aXJlICJpZG4iCisKK21vZHVsZSBBZGRyZXNzYWJsZQorICBtb2R1bGUgSUROQQorICAgIGRlZiBzZWxmLnB1bnljb2RlX2VuY29kZSh2YWx1ZSkKKyAgICAgIElETjo6UHVueWNvZGUuZW5jb2RlKHZhbHVlLnRvX3MpCisgICAgZW5kCisKKyAgICAgZGVmIHNlbGYucHVueWNvZGVfZGVjb2RlKHZhbHVlKQorICAgICAgIElETjo6UHVueWNvZGUuZGVjb2RlKHZhbHVlLnRvX3MpCisgICAgIGVuZAorCisgICAgZGVmIHNlbGYudW5pY29kZV9ub3JtYWxpemVfa2ModmFsdWUpCisgICAgICBJRE46OlN0cmluZ3ByZXAubmZrY19ub3JtYWxpemUodmFsdWUudG9fcykKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLnRvX2FzY2lpKHZhbHVlKQorICAgICAgdmFsdWUudG9fcy5zcGxpdCgnLicsIC0xKS5tYXAgZG8gfHNlZ21lbnR8CisgICAgICAgIGlmIHNlZ21lbnQuc2l6ZSA+IDAgJiYgc2VnbWVudC5zaXplIDwgNjQKKyAgICAgICAgICBJRE46OklkbmEudG9BU0NJSShzZWdtZW50LCBJRE46OklkbmE6OkFMTE9XX1VOQVNTSUdORUQpCisgICAgICAgIGVsc2lmIHNlZ21lbnQuc2l6ZSA+PSA2NAorICAgICAgICAgIHNlZ21lbnQKKyAgICAgICAgZWxzZQorICAgICAgICAgICcnCisgICAgICAgIGVuZAorICAgICAgZW5kLmpvaW4oJy4nKQorICAgIGVuZAorCisgICAgZGVmIHNlbGYudG9fdW5pY29kZSh2YWx1ZSkKKyAgICAgIHZhbHVlLnRvX3Muc3BsaXQoJy4nLCAtMSkubWFwIGRvIHxzZWdtZW50fAorICAgICAgICBpZiBzZWdtZW50LnNpemUgPiAwICYmIHNlZ21lbnQuc2l6ZSA8IDY0CisgICAgICAgICAgSUROOjpJZG5hLnRvVW5pY29kZShzZWdtZW50LCBJRE46OklkbmE6OkFMTE9XX1VOQVNTSUdORUQpCisgICAgICAgIGVsc2lmIHNlZ21lbnQuc2l6ZSA+PSA2NAorICAgICAgICAgIHNlZ21lbnQKKyAgICAgICAgZWxzZQorICAgICAgICAgICcnCisgICAgICAgIGVuZAorICAgICAgZW5kLmpvaW4oJy4nKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvbGliL2FkZHJlc3NhYmxlL2lkbmEvcHVyZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS9pZG5hL3B1cmUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMDI2YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS9pZG5hL3B1cmUucmIKQEAgLTAsMCArMSw2NzcgQEAKKyMgZW5jb2Rpbmc6dXRmLTgKKyMtLQorIyBDb3B5cmlnaHQgKEMpIEJvYiBBbWFuCisjCisjICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjKysKKworCittb2R1bGUgQWRkcmVzc2FibGUKKyAgbW9kdWxlIElETkEKKyAgICAjIFRoaXMgbW9kdWxlIGlzIGxvb3NlbHkgYmFzZWQgb24gaWRuX2FjdGlvbm1haWxlciBieSBNaWNrIFN0YXVnYWFyZCwKKyAgICAjIHRoZSB1bmljb2RlIGxpYnJhcnkgYnkgWW9zaGlkYSBNYXNhdG8sIGFuZCB0aGUgcHVueWNvZGUgaW1wbGVtZW50YXRpb24KKyAgICAjIGJ5IEthenVoaXJvIE5pc2hpeWFtYS4gIE1vc3Qgb2YgdGhlIGNvZGUgd2FzIGNvcGllZCB2ZXJiYXRpbSwgYnV0CisgICAgIyBzb21lIHJlZm9ybWF0dGluZyB3YXMgZG9uZSwgYW5kIHNvbWUgdHJhbnNsYXRpb24gZnJvbSBDIHdhcyBkb25lLgorICAgICMKKyAgICAjIFdpdGhvdXQgdGhlaXIgY29kZSB0byB3b3JrIGZyb20gYXMgYSBiYXNlLCB3ZSdkIGFsbCBzdGlsbCBiZSByZWx5aW5nCisgICAgIyBvbiB0aGUgcHJlc2VuY2Ugb2YgbGliaWRuLiAgV2hpY2ggbm9ib2R5IGV2ZXIgc2VlbXMgdG8gaGF2ZSBpbnN0YWxsZWQuCisgICAgIworICAgICMgT3JpZ2luYWwgc291cmNlczoKKyAgICAjIGh0dHA6Ly9naXRodWIuY29tL3N0YXVnYWFyZC9pZG5fYWN0aW9ubWFpbGVyCisgICAgIyBodHRwOi8vd3d3Lnlvc2hpZGFtLm5ldC9SdWJ5Lmh0bWwjdW5pY29kZQorICAgICMgaHR0cDovL3J1Ynlmb3JnZS5vcmcvZnJzLz9ncm91cF9pZD0yNTUwCisKKworICAgIFVOSUNPREVfVEFCTEUgPSBGaWxlLmV4cGFuZF9wYXRoKAorICAgICAgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi8uLi8uLicsICdkYXRhL3VuaWNvZGUuZGF0YScpCisgICAgKQorCisgICAgQUNFX1BSRUZJWCA9ICJ4bi0tIgorCisgICAgVVRGOF9SRUdFWCA9IC9cQSg/OgorICAgICAgW1x4MDlceDBBXHgwRFx4MjAtXHg3RV0gICAgICAgICAgICAgICAjIEFTQ0lJCisgICAgICB8IFtceEMyLVx4REZdW1x4ODAtXHhCRl0gICAgICAgICAgICAgICMgbm9uLW92ZXJsb25nIDItYnl0ZQorICAgICAgfCBceEUwW1x4QTAtXHhCRl1bXHg4MC1ceEJGXSAgICAgICAgICAjIGV4Y2x1ZGluZyBvdmVybG9uZ3MKKyAgICAgIHwgW1x4RTEtXHhFQ1x4RUVceEVGXVtceDgwLVx4QkZdezJ9ICAgIyBzdHJhaWdodCAzLWJ5dGUKKyAgICAgIHwgXHhFRFtceDgwLVx4OUZdW1x4ODAtXHhCRl0gICAgICAgICAgIyBleGNsdWRpbmcgc3Vycm9nYXRlcworICAgICAgfCBceEYwW1x4OTAtXHhCRl1bXHg4MC1ceEJGXXsyfSAgICAgICAjIHBsYW5lcyAxLTMKKyAgICAgIHwgW1x4RjEtXHhGM11bXHg4MC1ceEJGXXszfSAgICAgICAgICAgIyBwbGFuZXMgNG5pbDUKKyAgICAgIHwgXHhGNFtceDgwLVx4OEZdW1x4ODAtXHhCRl17Mn0gICAgICAgIyBwbGFuZSAxNgorICAgICAgKSpcei9tbngKKworICAgIFVURjhfUkVHRVhfTVVMVElCWVRFID0gLyg/OgorICAgICAgW1x4QzItXHhERl1bXHg4MC1ceEJGXSAgICAgICAgICAgICAgICAjIG5vbi1vdmVybG9uZyAyLWJ5dGUKKyAgICAgIHwgXHhFMFtceEEwLVx4QkZdW1x4ODAtXHhCRl0gICAgICAgICAgIyBleGNsdWRpbmcgb3ZlcmxvbmdzCisgICAgICB8IFtceEUxLVx4RUNceEVFXHhFRl1bXHg4MC1ceEJGXXsyfSAgICMgc3RyYWlnaHQgMy1ieXRlCisgICAgICB8IFx4RURbXHg4MC1ceDlGXVtceDgwLVx4QkZdICAgICAgICAgICMgZXhjbHVkaW5nIHN1cnJvZ2F0ZXMKKyAgICAgIHwgXHhGMFtceDkwLVx4QkZdW1x4ODAtXHhCRl17Mn0gICAgICAgIyBwbGFuZXMgMS0zCisgICAgICB8IFtceEYxLVx4RjNdW1x4ODAtXHhCRl17M30gICAgICAgICAgICMgcGxhbmVzIDRuaWw1CisgICAgICB8IFx4RjRbXHg4MC1ceDhGXVtceDgwLVx4QkZdezJ9ICAgICAgICMgcGxhbmUgMTYKKyAgICAgICkvbW54CisKKyAgICAjIDpzdGFydGRvYzoKKworICAgICMgQ29udmVydHMgZnJvbSBhIFVuaWNvZGUgaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUgdG8gYW4gQVNDSUkKKyAgICAjIGRvbWFpbiBuYW1lIGFzIGRlc2NyaWJlZCBpbiBSRkMgMzQ5MC4KKyAgICBkZWYgc2VsZi50b19hc2NpaShpbnB1dCkKKyAgICAgIGlucHV0ID0gaW5wdXQudG9fcyB1bmxlc3MgaW5wdXQuaXNfYT8oU3RyaW5nKQorICAgICAgaW5wdXQgPSBpbnB1dC5kdXAKKyAgICAgIGlmIGlucHV0LnJlc3BvbmRfdG8/KDpmb3JjZV9lbmNvZGluZykKKyAgICAgICAgaW5wdXQuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkFTQ0lJXzhCSVQpCisgICAgICBlbmQKKyAgICAgIGlmIGlucHV0ID1+IFVURjhfUkVHRVggJiYgaW5wdXQgPX4gVVRGOF9SRUdFWF9NVUxUSUJZVEUKKyAgICAgICAgcGFydHMgPSB1bmljb2RlX2Rvd25jYXNlKGlucHV0KS5zcGxpdCgnLicpCisgICAgICAgIHBhcnRzLm1hcCEgZG8gfHBhcnR8CisgICAgICAgICAgaWYgcGFydC5yZXNwb25kX3RvPyg6Zm9yY2VfZW5jb2RpbmcpCisgICAgICAgICAgICBwYXJ0LmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpBU0NJSV84QklUKQorICAgICAgICAgIGVuZAorICAgICAgICAgIGlmIHBhcnQgPX4gVVRGOF9SRUdFWCAmJiBwYXJ0ID1+IFVURjhfUkVHRVhfTVVMVElCWVRFCisgICAgICAgICAgICBBQ0VfUFJFRklYICsgcHVueWNvZGVfZW5jb2RlKHVuaWNvZGVfbm9ybWFsaXplX2tjKHBhcnQpKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcnQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIHBhcnRzLmpvaW4oJy4nKQorICAgICAgZWxzZQorICAgICAgICBpbnB1dAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIENvbnZlcnRzIGZyb20gYW4gQVNDSUkgZG9tYWluIG5hbWUgdG8gYSBVbmljb2RlIGludGVybmF0aW9uYWxpemVkCisgICAgIyBkb21haW4gbmFtZSBhcyBkZXNjcmliZWQgaW4gUkZDIDM0OTAuCisgICAgZGVmIHNlbGYudG9fdW5pY29kZShpbnB1dCkKKyAgICAgIGlucHV0ID0gaW5wdXQudG9fcyB1bmxlc3MgaW5wdXQuaXNfYT8oU3RyaW5nKQorICAgICAgcGFydHMgPSBpbnB1dC5zcGxpdCgnLicpCisgICAgICBwYXJ0cy5tYXAhIGRvIHxwYXJ0fAorICAgICAgICBpZiBwYXJ0ID1+IC9eI3tBQ0VfUFJFRklYfSguKykvCisgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgIHB1bnljb2RlX2RlY29kZShwYXJ0Wy9eI3tBQ0VfUFJFRklYfSguKykvLCAxXSkKKyAgICAgICAgICByZXNjdWUgQWRkcmVzc2FibGU6OklETkE6OlB1bnljb2RlQmFkSW5wdXQKKyAgICAgICAgICAgICMgdG9Vbmljb2RlIGlzIGV4cGxpY2l0bHkgZGVmaW5lZCBhcyBuZXZlci1mYWlscyBieSB0aGUgc3BlYworICAgICAgICAgICAgcGFydAorICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgcGFydAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgb3V0cHV0ID0gcGFydHMuam9pbignLicpCisgICAgICBpZiBvdXRwdXQucmVzcG9uZF90bz8oOmZvcmNlX2VuY29kaW5nKQorICAgICAgICBvdXRwdXQuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisgICAgICBvdXRwdXQKKyAgICBlbmQKKworICAgICMgVW5pY29kZSBub3JtYWxpemF0aW9uIGZvcm0gS0MuCisgICAgZGVmIHNlbGYudW5pY29kZV9ub3JtYWxpemVfa2MoaW5wdXQpCisgICAgICBpbnB1dCA9IGlucHV0LnRvX3MgdW5sZXNzIGlucHV0LmlzX2E/KFN0cmluZykKKyAgICAgIHVucGFja2VkID0gaW5wdXQudW5wYWNrKCJVKiIpCisgICAgICB1bnBhY2tlZCA9CisgICAgICAgIHVuaWNvZGVfY29tcG9zZSh1bmljb2RlX3NvcnRfY2Fub25pY2FsKHVuaWNvZGVfZGVjb21wb3NlKHVucGFja2VkKSkpCisgICAgICByZXR1cm4gdW5wYWNrZWQucGFjaygiVSoiKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFVuaWNvZGUgYXdhcmUgZG93bmNhc2UgbWV0aG9kLgorICAgICMKKyAgICAjIEBhcGkgcHJpdmF0ZQorICAgICMgQHBhcmFtIFtTdHJpbmddIGlucHV0CisgICAgIyAgIFRoZSBpbnB1dCBzdHJpbmcuCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBkb3duY2FzZWQgcmVzdWx0LgorICAgIGRlZiBzZWxmLnVuaWNvZGVfZG93bmNhc2UoaW5wdXQpCisgICAgICBpbnB1dCA9IGlucHV0LnRvX3MgdW5sZXNzIGlucHV0LmlzX2E/KFN0cmluZykKKyAgICAgIHVucGFja2VkID0gaW5wdXQudW5wYWNrKCJVKiIpCisgICAgICB1bnBhY2tlZC5tYXAhIHsgfGNvZGVwb2ludHwgbG9va3VwX3VuaWNvZGVfbG93ZXJjYXNlKGNvZGVwb2ludCkgfQorICAgICAgcmV0dXJuIHVucGFja2VkLnBhY2soIlUqIikKKyAgICBlbmQKKyAgICAoY2xhc3MgPDxzZWxmOyBwcml2YXRlIDp1bmljb2RlX2Rvd25jYXNlOyBlbmQpCisKKyAgICBkZWYgc2VsZi51bmljb2RlX2NvbXBvc2UodW5wYWNrZWQpCisgICAgICB1bnBhY2tlZF9yZXN1bHQgPSBbXQorICAgICAgbGVuZ3RoID0gdW5wYWNrZWQubGVuZ3RoCisKKyAgICAgIHJldHVybiB1bnBhY2tlZCBpZiBsZW5ndGggPT0gMAorCisgICAgICBzdGFydGVyID0gdW5wYWNrZWRbMF0KKyAgICAgIHN0YXJ0ZXJfY2MgPSBsb29rdXBfdW5pY29kZV9jb21iaW5pbmdfY2xhc3Moc3RhcnRlcikKKyAgICAgIHN0YXJ0ZXJfY2MgPSAyNTYgaWYgc3RhcnRlcl9jYyAhPSAwCisgICAgICBmb3IgaSBpbiAxLi4ubGVuZ3RoCisgICAgICAgIGNoID0gdW5wYWNrZWRbaV0KKyAgICAgICAgY2MgPSBsb29rdXBfdW5pY29kZV9jb21iaW5pbmdfY2xhc3MoY2gpCisKKyAgICAgICAgaWYgKHN0YXJ0ZXJfY2MgPT0gMCAmJgorICAgICAgICAgICAgKGNvbXBvc2l0ZSA9IHVuaWNvZGVfY29tcG9zZV9wYWlyKHN0YXJ0ZXIsIGNoKSkgIT0gbmlsKQorICAgICAgICAgIHN0YXJ0ZXIgPSBjb21wb3NpdGUKKyAgICAgICAgICBzdGFydGVyY2MgPSBsb29rdXBfdW5pY29kZV9jb21iaW5pbmdfY2xhc3MoY29tcG9zaXRlKQorICAgICAgICBlbHNlCisgICAgICAgICAgdW5wYWNrZWRfcmVzdWx0IDw8IHN0YXJ0ZXIKKyAgICAgICAgICBzdGFydGVyID0gY2gKKyAgICAgICAgICBzdGFydGVyY2MgPSBjYworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgdW5wYWNrZWRfcmVzdWx0IDw8IHN0YXJ0ZXIKKyAgICAgIHJldHVybiB1bnBhY2tlZF9yZXN1bHQKKyAgICBlbmQKKyAgICAoY2xhc3MgPDxzZWxmOyBwcml2YXRlIDp1bmljb2RlX2NvbXBvc2U7IGVuZCkKKworICAgIGRlZiBzZWxmLnVuaWNvZGVfY29tcG9zZV9wYWlyKGNoX29uZSwgY2hfdHdvKQorICAgICAgaWYgY2hfb25lID49IEhBTkdVTF9MQkFTRSAmJiBjaF9vbmUgPCBIQU5HVUxfTEJBU0UgKyBIQU5HVUxfTENPVU5UICYmCisgICAgICAgICAgY2hfdHdvID49IEhBTkdVTF9WQkFTRSAmJiBjaF90d28gPCBIQU5HVUxfVkJBU0UgKyBIQU5HVUxfVkNPVU5UCisgICAgICAgICMgSGFuZ3VsIEwgKyBWCisgICAgICAgIHJldHVybiBIQU5HVUxfU0JBU0UgKyAoCisgICAgICAgICAgKGNoX29uZSAtIEhBTkdVTF9MQkFTRSkgKiBIQU5HVUxfVkNPVU5UICsgKGNoX3R3byAtIEhBTkdVTF9WQkFTRSkKKyAgICAgICAgKSAqIEhBTkdVTF9UQ09VTlQKKyAgICAgIGVsc2lmIGNoX29uZSA+PSBIQU5HVUxfU0JBU0UgJiYKKyAgICAgICAgICBjaF9vbmUgPCBIQU5HVUxfU0JBU0UgKyBIQU5HVUxfU0NPVU5UICYmCisgICAgICAgICAgKGNoX29uZSAtIEhBTkdVTF9TQkFTRSkgJSBIQU5HVUxfVENPVU5UID09IDAgJiYKKyAgICAgICAgICBjaF90d28gPj0gSEFOR1VMX1RCQVNFICYmIGNoX3R3byA8IEhBTkdVTF9UQkFTRSArIEhBTkdVTF9UQ09VTlQKKyAgICAgICAgICAgIyBIYW5ndWwgTFYgKyBUCisgICAgICAgIHJldHVybiBjaF9vbmUgKyAoY2hfdHdvIC0gSEFOR1VMX1RCQVNFKQorICAgICAgZW5kCisKKyAgICAgIHAgPSBbXQorICAgICAgdWNzNF90b191dGY4ID0gbGFtYmRhIGRvIHxjaHwKKyAgICAgICAgaWYgY2ggPCAxMjgKKyAgICAgICAgICBwIDw8IGNoCisgICAgICAgIGVsc2lmIGNoIDwgMjA0OAorICAgICAgICAgIHAgPDwgKGNoID4+IDYgfCAxOTIpCisgICAgICAgICAgcCA8PCAoY2ggJiA2MyB8IDEyOCkKKyAgICAgICAgZWxzaWYgY2ggPCAweDEwMDAwCisgICAgICAgICAgcCA8PCAoY2ggPj4gMTIgfCAyMjQpCisgICAgICAgICAgcCA8PCAoY2ggPj4gNiAmIDYzIHwgMTI4KQorICAgICAgICAgIHAgPDwgKGNoICYgNjMgfCAxMjgpCisgICAgICAgIGVsc2lmIGNoIDwgMHgyMDAwMDAKKyAgICAgICAgICBwIDw8IChjaCA+PiAxOCB8IDI0MCkKKyAgICAgICAgICBwIDw8IChjaCA+PiAxMiAmIDYzIHwgMTI4KQorICAgICAgICAgIHAgPDwgKGNoID4+IDYgJiA2MyB8IDEyOCkKKyAgICAgICAgICBwIDw8IChjaCAmIDYzIHwgMTI4KQorICAgICAgICBlbHNpZiBjaCA8IDB4NDAwMDAwMAorICAgICAgICAgIHAgPDwgKGNoID4+IDI0IHwgMjQ4KQorICAgICAgICAgIHAgPDwgKGNoID4+IDE4ICYgNjMgfCAxMjgpCisgICAgICAgICAgcCA8PCAoY2ggPj4gMTIgJiA2MyB8IDEyOCkKKyAgICAgICAgICBwIDw8IChjaCA+PiA2ICYgNjMgfCAxMjgpCisgICAgICAgICAgcCA8PCAoY2ggJiA2MyB8IDEyOCkKKyAgICAgICAgZWxzaWYgY2ggPCAweDgwMDAwMDAwCisgICAgICAgICAgcCA8PCAoY2ggPj4gMzAgfCAyNTIpCisgICAgICAgICAgcCA8PCAoY2ggPj4gMjQgJiA2MyB8IDEyOCkKKyAgICAgICAgICBwIDw8IChjaCA+PiAxOCAmIDYzIHwgMTI4KQorICAgICAgICAgIHAgPDwgKGNoID4+IDEyICYgNjMgfCAxMjgpCisgICAgICAgICAgcCA8PCAoY2ggPj4gNiAmIDYzIHwgMTI4KQorICAgICAgICAgIHAgPDwgKGNoICYgNjMgfCAxMjgpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHVjczRfdG9fdXRmOC5jYWxsKGNoX29uZSkKKyAgICAgIHVjczRfdG9fdXRmOC5jYWxsKGNoX3R3bykKKworICAgICAgcmV0dXJuIGxvb2t1cF91bmljb2RlX2NvbXBvc2l0aW9uKHApCisgICAgZW5kCisgICAgKGNsYXNzIDw8c2VsZjsgcHJpdmF0ZSA6dW5pY29kZV9jb21wb3NlX3BhaXI7IGVuZCkKKworICAgIGRlZiBzZWxmLnVuaWNvZGVfc29ydF9jYW5vbmljYWwodW5wYWNrZWQpCisgICAgICB1bnBhY2tlZCA9IHVucGFja2VkLmR1cAorICAgICAgaSA9IDEKKyAgICAgIGxlbmd0aCA9IHVucGFja2VkLmxlbmd0aAorCisgICAgICByZXR1cm4gdW5wYWNrZWQgaWYgbGVuZ3RoIDwgMgorCisgICAgICB3aGlsZSBpIDwgbGVuZ3RoCisgICAgICAgIGxhc3QgPSB1bnBhY2tlZFtpLTFdCisgICAgICAgIGNoID0gdW5wYWNrZWRbaV0KKyAgICAgICAgbGFzdF9jYyA9IGxvb2t1cF91bmljb2RlX2NvbWJpbmluZ19jbGFzcyhsYXN0KQorICAgICAgICBjYyA9IGxvb2t1cF91bmljb2RlX2NvbWJpbmluZ19jbGFzcyhjaCkKKyAgICAgICAgaWYgY2MgIT0gMCAmJiBsYXN0X2NjICE9IDAgJiYgbGFzdF9jYyA+IGNjCisgICAgICAgICAgdW5wYWNrZWRbaV0gPSBsYXN0CisgICAgICAgICAgdW5wYWNrZWRbaS0xXSA9IGNoCisgICAgICAgICAgaSAtPSAxIGlmIGkgPiAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpICs9IDEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIHJldHVybiB1bnBhY2tlZAorICAgIGVuZAorICAgIChjbGFzcyA8PHNlbGY7IHByaXZhdGUgOnVuaWNvZGVfc29ydF9jYW5vbmljYWw7IGVuZCkKKworICAgIGRlZiBzZWxmLnVuaWNvZGVfZGVjb21wb3NlKHVucGFja2VkKQorICAgICAgdW5wYWNrZWRfcmVzdWx0ID0gW10KKyAgICAgIGZvciBjcCBpbiB1bnBhY2tlZAorICAgICAgICBpZiBjcCA+PSBIQU5HVUxfU0JBU0UgJiYgY3AgPCBIQU5HVUxfU0JBU0UgKyBIQU5HVUxfU0NPVU5UCisgICAgICAgICAgbCwgdiwgdCA9IHVuaWNvZGVfZGVjb21wb3NlX2hhbmd1bChjcCkKKyAgICAgICAgICB1bnBhY2tlZF9yZXN1bHQgPDwgbAorICAgICAgICAgIHVucGFja2VkX3Jlc3VsdCA8PCB2IGlmIHYKKyAgICAgICAgICB1bnBhY2tlZF9yZXN1bHQgPDwgdCBpZiB0CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkYyA9IGxvb2t1cF91bmljb2RlX2NvbXBhdGliaWxpdHkoY3ApCisgICAgICAgICAgdW5sZXNzIGRjCisgICAgICAgICAgICB1bnBhY2tlZF9yZXN1bHQgPDwgY3AKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB1bnBhY2tlZF9yZXN1bHQuY29uY2F0KHVuaWNvZGVfZGVjb21wb3NlKGRjLnVucGFjaygiVSoiKSkpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICByZXR1cm4gdW5wYWNrZWRfcmVzdWx0CisgICAgZW5kCisgICAgKGNsYXNzIDw8c2VsZjsgcHJpdmF0ZSA6dW5pY29kZV9kZWNvbXBvc2U7IGVuZCkKKworICAgIGRlZiBzZWxmLnVuaWNvZGVfZGVjb21wb3NlX2hhbmd1bChjb2RlcG9pbnQpCisgICAgICBzaW5kZXggPSBjb2RlcG9pbnQgLSBIQU5HVUxfU0JBU0U7CisgICAgICBpZiBzaW5kZXggPCAwIHx8IHNpbmRleCA+PSBIQU5HVUxfU0NPVU5UCisgICAgICAgIGwgPSBjb2RlcG9pbnQKKyAgICAgICAgdiA9IHQgPSBuaWwKKyAgICAgICAgcmV0dXJuIGwsIHYsIHQKKyAgICAgIGVuZAorICAgICAgbCA9IEhBTkdVTF9MQkFTRSArIHNpbmRleCAvIEhBTkdVTF9OQ09VTlQKKyAgICAgIHYgPSBIQU5HVUxfVkJBU0UgKyAoc2luZGV4ICUgSEFOR1VMX05DT1VOVCkgLyBIQU5HVUxfVENPVU5UCisgICAgICB0ID0gSEFOR1VMX1RCQVNFICsgc2luZGV4ICUgSEFOR1VMX1RDT1VOVAorICAgICAgaWYgdCA9PSBIQU5HVUxfVEJBU0UKKyAgICAgICAgdCA9IG5pbAorICAgICAgZW5kCisgICAgICByZXR1cm4gbCwgdiwgdAorICAgIGVuZAorICAgIChjbGFzcyA8PHNlbGY7IHByaXZhdGUgOnVuaWNvZGVfZGVjb21wb3NlX2hhbmd1bDsgZW5kKQorCisgICAgZGVmIHNlbGYubG9va3VwX3VuaWNvZGVfY29tYmluaW5nX2NsYXNzKGNvZGVwb2ludCkKKyAgICAgIGNvZGVwb2ludF9kYXRhID0gVU5JQ09ERV9EQVRBW2NvZGVwb2ludF0KKyAgICAgIChjb2RlcG9pbnRfZGF0YSA/CisgICAgICAgIChjb2RlcG9pbnRfZGF0YVtVTklDT0RFX0RBVEFfQ09NQklOSU5HX0NMQVNTXSB8fCAwKSA6CisgICAgICAgIDApCisgICAgZW5kCisgICAgKGNsYXNzIDw8c2VsZjsgcHJpdmF0ZSA6bG9va3VwX3VuaWNvZGVfY29tYmluaW5nX2NsYXNzOyBlbmQpCisKKyAgICBkZWYgc2VsZi5sb29rdXBfdW5pY29kZV9jb21wYXRpYmlsaXR5KGNvZGVwb2ludCkKKyAgICAgIGNvZGVwb2ludF9kYXRhID0gVU5JQ09ERV9EQVRBW2NvZGVwb2ludF0KKyAgICAgIChjb2RlcG9pbnRfZGF0YSA/CisgICAgICAgIGNvZGVwb2ludF9kYXRhW1VOSUNPREVfREFUQV9DT01QQVRJQklMSVRZXSA6IG5pbCkKKyAgICBlbmQKKyAgICAoY2xhc3MgPDxzZWxmOyBwcml2YXRlIDpsb29rdXBfdW5pY29kZV9jb21wYXRpYmlsaXR5OyBlbmQpCisKKyAgICBkZWYgc2VsZi5sb29rdXBfdW5pY29kZV9sb3dlcmNhc2UoY29kZXBvaW50KQorICAgICAgY29kZXBvaW50X2RhdGEgPSBVTklDT0RFX0RBVEFbY29kZXBvaW50XQorICAgICAgKGNvZGVwb2ludF9kYXRhID8KKyAgICAgICAgKGNvZGVwb2ludF9kYXRhW1VOSUNPREVfREFUQV9MT1dFUkNBU0VdIHx8IGNvZGVwb2ludCkgOgorICAgICAgICBjb2RlcG9pbnQpCisgICAgZW5kCisgICAgKGNsYXNzIDw8c2VsZjsgcHJpdmF0ZSA6bG9va3VwX3VuaWNvZGVfbG93ZXJjYXNlOyBlbmQpCisKKyAgICBkZWYgc2VsZi5sb29rdXBfdW5pY29kZV9jb21wb3NpdGlvbih1bnBhY2tlZCkKKyAgICAgIHJldHVybiBDT01QT1NJVElPTl9UQUJMRVt1bnBhY2tlZF0KKyAgICBlbmQKKyAgICAoY2xhc3MgPDxzZWxmOyBwcml2YXRlIDpsb29rdXBfdW5pY29kZV9jb21wb3NpdGlvbjsgZW5kKQorCisgICAgSEFOR1VMX1NCQVNFID0gIDB4YWMwMAorICAgIEhBTkdVTF9MQkFTRSA9ICAweDExMDAKKyAgICBIQU5HVUxfTENPVU5UID0gMTkKKyAgICBIQU5HVUxfVkJBU0UgPSAgMHgxMTYxCisgICAgSEFOR1VMX1ZDT1VOVCA9IDIxCisgICAgSEFOR1VMX1RCQVNFID0gIDB4MTFhNworICAgIEhBTkdVTF9UQ09VTlQgPSAyOAorICAgIEhBTkdVTF9OQ09VTlQgPSBIQU5HVUxfVkNPVU5UICogSEFOR1VMX1RDT1VOVCAjIDU4OAorICAgIEhBTkdVTF9TQ09VTlQgPSBIQU5HVUxfTENPVU5UICogSEFOR1VMX05DT1VOVCAjIDExMTcyCisKKyAgICBVTklDT0RFX0RBVEFfQ09NQklOSU5HX0NMQVNTID0gMAorICAgIFVOSUNPREVfREFUQV9FWENMVVNJT04gPSAxCisgICAgVU5JQ09ERV9EQVRBX0NBTk9OSUNBTCA9IDIKKyAgICBVTklDT0RFX0RBVEFfQ09NUEFUSUJJTElUWSA9IDMKKyAgICBVTklDT0RFX0RBVEFfVVBQRVJDQVNFID0gNAorICAgIFVOSUNPREVfREFUQV9MT1dFUkNBU0UgPSA1CisgICAgVU5JQ09ERV9EQVRBX1RJVExFQ0FTRSA9IDYKKworICAgIGJlZ2luCisgICAgICBpZiBkZWZpbmVkPyhGYWtlRlMpCisgICAgICAgIGZha2Vmc19zdGF0ZSA9IEZha2VGUy5hY3RpdmF0ZWQ/CisgICAgICAgIEZha2VGUy5kZWFjdGl2YXRlIQorICAgICAgZW5kCisgICAgICAjIFRoaXMgaXMgYSBzcGFyc2UgVW5pY29kZSB0YWJsZS4gIENvZGVwb2ludHMgd2l0aG91dCBlbnRyaWVzIGFyZQorICAgICAgIyBhc3N1bWVkIHRvIGhhdmUgdGhlIHZhbHVlOiBbMCwgMCwgbmlsLCBuaWwsIG5pbCwgbmlsLCBuaWxdCisgICAgICBVTklDT0RFX0RBVEEgPSBGaWxlLm9wZW4oVU5JQ09ERV9UQUJMRSwgInJiIikgZG8gfGZpbGV8CisgICAgICAgIE1hcnNoYWwubG9hZChmaWxlLnJlYWQpCisgICAgICBlbmQKKyAgICBlbnN1cmUKKyAgICAgIGlmIGRlZmluZWQ/KEZha2VGUykKKyAgICAgICAgRmFrZUZTLmFjdGl2YXRlISBpZiBmYWtlZnNfc3RhdGUKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgQ09NUE9TSVRJT05fVEFCTEUgPSB7fQorICAgIGZvciBjb2RlcG9pbnQsIGRhdGEgaW4gVU5JQ09ERV9EQVRBCisgICAgICBjYW5vbmljYWwgPSBkYXRhW1VOSUNPREVfREFUQV9DQU5PTklDQUxdCisgICAgICBleGNsdXNpb24gPSBkYXRhW1VOSUNPREVfREFUQV9FWENMVVNJT05dCisKKyAgICAgIGlmIGNhbm9uaWNhbCAmJiBleGNsdXNpb24gPT0gMAorICAgICAgICBDT01QT1NJVElPTl9UQUJMRVtjYW5vbmljYWwudW5wYWNrKCJDKiIpXSA9IGNvZGVwb2ludAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBVTklDT0RFX01BWF9MRU5HVEggPSAyNTYKKyAgICBBQ0VfTUFYX0xFTkdUSCA9IDI1NgorCisgICAgUFVOWUNPREVfQkFTRSA9IDM2CisgICAgUFVOWUNPREVfVE1JTiA9IDEKKyAgICBQVU5ZQ09ERV9UTUFYID0gMjYKKyAgICBQVU5ZQ09ERV9TS0VXID0gMzgKKyAgICBQVU5ZQ09ERV9EQU1QID0gNzAwCisgICAgUFVOWUNPREVfSU5JVElBTF9CSUFTID0gNzIKKyAgICBQVU5ZQ09ERV9JTklUSUFMX04gPSAweDgwCisgICAgUFVOWUNPREVfREVMSU1JVEVSID0gMHgyRAorCisgICAgUFVOWUNPREVfTUFYSU5UID0gMSA8PCA2NAorCisgICAgUFVOWUNPREVfUFJJTlRfQVNDSUkgPQorICAgICAgIlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuIiArCisgICAgICAiXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4iICsKKyAgICAgICIgIVwiXCMkJSYnKCkqKywtLi8iICsKKyAgICAgICIwMTIzNDU2Nzg5Ojs8PT4/IiArCisgICAgICAiQEFCQ0RFRkdISUpLTE1OTyIgKworICAgICAgIlBRUlNUVVZXWFlaW1xcXV5fIiArCisgICAgICAiYGFiY2RlZmdoaWprbG1ubyIgKworICAgICAgInBxcnN0dXZ3eHl6e3x9flxuIgorCisgICAgIyBJbnB1dCBpcyBpbnZhbGlkLgorICAgIGNsYXNzIFB1bnljb2RlQmFkSW5wdXQgPCBTdGFuZGFyZEVycm9yOyBlbmQKKyAgICAjIE91dHB1dCB3b3VsZCBleGNlZWQgdGhlIHNwYWNlIHByb3ZpZGVkLgorICAgIGNsYXNzIFB1bnljb2RlQmlnT3V0cHV0IDwgU3RhbmRhcmRFcnJvcjsgZW5kCisgICAgIyBJbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzLgorICAgIGNsYXNzIFB1bnljb2RlT3ZlcmZsb3cgPCBTdGFuZGFyZEVycm9yOyBlbmQKKworICAgIGRlZiBzZWxmLnB1bnljb2RlX2VuY29kZSh1bmljb2RlKQorICAgICAgdW5pY29kZSA9IHVuaWNvZGUudG9fcyB1bmxlc3MgdW5pY29kZS5pc19hPyhTdHJpbmcpCisgICAgICBpbnB1dCA9IHVuaWNvZGUudW5wYWNrKCJVKiIpCisgICAgICBvdXRwdXQgPSBbMF0gKiAoQUNFX01BWF9MRU5HVEggKyAxKQorICAgICAgaW5wdXRfbGVuZ3RoID0gaW5wdXQuc2l6ZQorICAgICAgb3V0cHV0X2xlbmd0aCA9IFtBQ0VfTUFYX0xFTkdUSF0KKworICAgICAgIyBJbml0aWFsaXplIHRoZSBzdGF0ZQorICAgICAgbiA9IFBVTllDT0RFX0lOSVRJQUxfTgorICAgICAgZGVsdGEgPSBvdXQgPSAwCisgICAgICBtYXhfb3V0ID0gb3V0cHV0X2xlbmd0aFswXQorICAgICAgYmlhcyA9IFBVTllDT0RFX0lOSVRJQUxfQklBUworCisgICAgICAjIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6CisgICAgICBpbnB1dF9sZW5ndGgudGltZXMgZG8gfGp8CisgICAgICAgIGlmIHB1bnljb2RlX2Jhc2ljPyhpbnB1dFtqXSkKKyAgICAgICAgICBpZiBtYXhfb3V0IC0gb3V0IDwgMgorICAgICAgICAgICAgcmFpc2UgUHVueWNvZGVCaWdPdXRwdXQsCisgICAgICAgICAgICAgICJPdXRwdXQgd291bGQgZXhjZWVkIHRoZSBzcGFjZSBwcm92aWRlZC4iCisgICAgICAgICAgZW5kCisgICAgICAgICAgb3V0cHV0W291dF0gPSBpbnB1dFtqXQorICAgICAgICAgIG91dCArPSAxCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGggPSBiID0gb3V0CisKKyAgICAgICMgaCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQsIGIgaXMgdGhlCisgICAgICAjIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cywgYW5kIG91dCBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgICMgdGhhdCBoYXZlIGJlZW4gb3V0cHV0LgorCisgICAgICBpZiBiID4gMAorICAgICAgICBvdXRwdXRbb3V0XSA9IFBVTllDT0RFX0RFTElNSVRFUgorICAgICAgICBvdXQgKz0gMQorICAgICAgZW5kCisKKyAgICAgICMgTWFpbiBlbmNvZGluZyBsb29wOgorCisgICAgICB3aGlsZSBoIDwgaW5wdXRfbGVuZ3RoCisgICAgICAgICMgQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuCisgICAgICAgICMgaGFuZGxlZCBhbHJlYWR5LiAgRmluZCB0aGUgbmV4dCBsYXJnZXIgb25lOgorCisgICAgICAgIG0gPSBQVU5ZQ09ERV9NQVhJTlQKKyAgICAgICAgaW5wdXRfbGVuZ3RoLnRpbWVzIGRvIHxqfAorICAgICAgICAgIG0gPSBpbnB1dFtqXSBpZiAobi4uLm0pID09PSBpbnB1dFtqXQorICAgICAgICBlbmQKKworICAgICAgICAjIEluY3JlYXNlIGRlbHRhIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MKKyAgICAgICAgIyA8bixpPiBzdGF0ZSB0byA8bSwwPiwgYnV0IGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3c6CisKKyAgICAgICAgaWYgbSAtIG4gPiAoUFVOWUNPREVfTUFYSU5UIC0gZGVsdGEpIC8gKGggKyAxKQorICAgICAgICAgIHJhaXNlIFB1bnljb2RlT3ZlcmZsb3csICJJbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzLiIKKyAgICAgICAgZW5kCisgICAgICAgIGRlbHRhICs9IChtIC0gbikgKiAoaCArIDEpCisgICAgICAgIG4gPSBtCisKKyAgICAgICAgaW5wdXRfbGVuZ3RoLnRpbWVzIGRvIHxqfAorICAgICAgICAgICMgUHVueWNvZGUgZG9lcyBub3QgbmVlZCB0byBjaGVjayB3aGV0aGVyIGlucHV0W2pdIGlzIGJhc2ljOgorICAgICAgICAgIGlmIGlucHV0W2pdIDwgbgorICAgICAgICAgICAgZGVsdGEgKz0gMQorICAgICAgICAgICAgaWYgZGVsdGEgPT0gMAorICAgICAgICAgICAgICByYWlzZSBQdW55Y29kZU92ZXJmbG93LAorICAgICAgICAgICAgICAgICJJbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzLiIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorCisgICAgICAgICAgaWYgaW5wdXRbal0gPT0gbgorICAgICAgICAgICAgIyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcjoKKworICAgICAgICAgICAgcSA9IGRlbHRhOyBrID0gUFVOWUNPREVfQkFTRQorICAgICAgICAgICAgd2hpbGUgdHJ1ZQorICAgICAgICAgICAgICBpZiBvdXQgPj0gbWF4X291dAorICAgICAgICAgICAgICAgIHJhaXNlIFB1bnljb2RlQmlnT3V0cHV0LAorICAgICAgICAgICAgICAgICAgIk91dHB1dCB3b3VsZCBleGNlZWQgdGhlIHNwYWNlIHByb3ZpZGVkLiIKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgIHQgPSAoCisgICAgICAgICAgICAgICAgaWYgayA8PSBiaWFzCisgICAgICAgICAgICAgICAgICBQVU5ZQ09ERV9UTUlOCisgICAgICAgICAgICAgICAgZWxzaWYgayA+PSBiaWFzICsgUFVOWUNPREVfVE1BWAorICAgICAgICAgICAgICAgICAgUFVOWUNPREVfVE1BWAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGsgLSBiaWFzCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgYnJlYWsgaWYgcSA8IHQKKyAgICAgICAgICAgICAgb3V0cHV0W291dF0gPQorICAgICAgICAgICAgICAgIHB1bnljb2RlX2VuY29kZV9kaWdpdCh0ICsgKHEgLSB0KSAlIChQVU5ZQ09ERV9CQVNFIC0gdCkpCisgICAgICAgICAgICAgIG91dCArPSAxCisgICAgICAgICAgICAgIHEgPSAocSAtIHQpIC8gKFBVTllDT0RFX0JBU0UgLSB0KQorICAgICAgICAgICAgICBrICs9IFBVTllDT0RFX0JBU0UKKyAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICBvdXRwdXRbb3V0XSA9IHB1bnljb2RlX2VuY29kZV9kaWdpdChxKQorICAgICAgICAgICAgb3V0ICs9IDEKKyAgICAgICAgICAgIGJpYXMgPSBwdW55Y29kZV9hZGFwdChkZWx0YSwgaCArIDEsIGggPT0gYikKKyAgICAgICAgICAgIGRlbHRhID0gMAorICAgICAgICAgICAgaCArPSAxCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlbHRhICs9IDEKKyAgICAgICAgbiArPSAxCisgICAgICBlbmQKKworICAgICAgb3V0cHV0X2xlbmd0aFswXSA9IG91dAorCisgICAgICBvdXRsZW4gPSBvdXQKKyAgICAgIG91dGxlbi50aW1lcyBkbyB8anwKKyAgICAgICAgYyA9IG91dHB1dFtqXQorICAgICAgICB1bmxlc3MgYyA+PSAwICYmIGMgPD0gMTI3CisgICAgICAgICAgcmFpc2UgU3RhbmRhcmRFcnJvciwgIkludmFsaWQgb3V0cHV0IGNoYXIuIgorICAgICAgICBlbmQKKyAgICAgICAgdW5sZXNzIFBVTllDT0RFX1BSSU5UX0FTQ0lJW2NdCisgICAgICAgICAgcmFpc2UgUHVueWNvZGVCYWRJbnB1dCwgIklucHV0IGlzIGludmFsaWQuIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBvdXRwdXRbMC4ub3V0bGVuXS5tYXAgeyB8eHwgeC5jaHIgfS5qb2luKCIiKS5zdWIoL1wwK1x6LywgIiIpCisgICAgZW5kCisgICAgKGNsYXNzIDw8c2VsZjsgcHJpdmF0ZSA6cHVueWNvZGVfZW5jb2RlOyBlbmQpCisKKyAgICBkZWYgc2VsZi5wdW55Y29kZV9kZWNvZGUocHVueWNvZGUpCisgICAgICBpbnB1dCA9IFtdCisgICAgICBvdXRwdXQgPSBbXQorCisgICAgICBpZiBBQ0VfTUFYX0xFTkdUSCAqIDIgPCBwdW55Y29kZS5zaXplCisgICAgICAgIHJhaXNlIFB1bnljb2RlQmlnT3V0cHV0LCAiT3V0cHV0IHdvdWxkIGV4Y2VlZCB0aGUgc3BhY2UgcHJvdmlkZWQuIgorICAgICAgZW5kCisgICAgICBwdW55Y29kZS5lYWNoX2J5dGUgZG8gfGN8CisgICAgICAgIHVubGVzcyBjID49IDAgJiYgYyA8PSAxMjcKKyAgICAgICAgICByYWlzZSBQdW55Y29kZUJhZElucHV0LCAiSW5wdXQgaXMgaW52YWxpZC4iCisgICAgICAgIGVuZAorICAgICAgICBpbnB1dC5wdXNoKGMpCisgICAgICBlbmQKKworICAgICAgaW5wdXRfbGVuZ3RoID0gaW5wdXQubGVuZ3RoCisgICAgICBvdXRwdXRfbGVuZ3RoID0gW1VOSUNPREVfTUFYX0xFTkdUSF0KKworICAgICAgIyBJbml0aWFsaXplIHRoZSBzdGF0ZQorICAgICAgbiA9IFBVTllDT0RFX0lOSVRJQUxfTgorCisgICAgICBvdXQgPSBpID0gMAorICAgICAgbWF4X291dCA9IG91dHB1dF9sZW5ndGhbMF0KKyAgICAgIGJpYXMgPSBQVU5ZQ09ERV9JTklUSUFMX0JJQVMKKworICAgICAgIyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzOiAgTGV0IGIgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlCisgICAgICAjIHBvaW50cyBiZWZvcmUgdGhlIGxhc3QgZGVsaW1pdGVyLCBvciAwIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4KKyAgICAgICMgY29weSB0aGUgZmlyc3QgYiBjb2RlIHBvaW50cyB0byB0aGUgb3V0cHV0LgorCisgICAgICBiID0gMAorICAgICAgaW5wdXRfbGVuZ3RoLnRpbWVzIGRvIHxqfAorICAgICAgICBiID0gaiBpZiBwdW55Y29kZV9kZWxpbWl0ZXI/KGlucHV0W2pdKQorICAgICAgZW5kCisgICAgICBpZiBiID4gbWF4X291dAorICAgICAgICByYWlzZSBQdW55Y29kZUJpZ091dHB1dCwgIk91dHB1dCB3b3VsZCBleGNlZWQgdGhlIHNwYWNlIHByb3ZpZGVkLiIKKyAgICAgIGVuZAorCisgICAgICBiLnRpbWVzIGRvIHxqfAorICAgICAgICB1bmxlc3MgcHVueWNvZGVfYmFzaWM/KGlucHV0W2pdKQorICAgICAgICAgIHJhaXNlIFB1bnljb2RlQmFkSW5wdXQsICJJbnB1dCBpcyBpbnZhbGlkLiIKKyAgICAgICAgZW5kCisgICAgICAgIG91dHB1dFtvdXRdID0gaW5wdXRbal0KKyAgICAgICAgb3V0Kz0xCisgICAgICBlbmQKKworICAgICAgIyBNYWluIGRlY29kaW5nIGxvb3A6ICBTdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkKKyAgICAgICMgYmFzaWMgY29kZSBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLgorCisgICAgICBpbl8gPSBiID4gMCA/IGIgKyAxIDogMAorICAgICAgd2hpbGUgaW5fIDwgaW5wdXRfbGVuZ3RoCisKKyAgICAgICAgIyBpbl8gaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZCwgYW5kCisgICAgICAgICMgb3V0IGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gdGhlIG91dHB1dCBhcnJheS4KKworICAgICAgICAjIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gZGVsdGEsCisgICAgICAgICMgd2hpY2ggZ2V0cyBhZGRlZCB0byBpLiAgVGhlIG92ZXJmbG93IGNoZWNraW5nIGlzIGVhc2llcgorICAgICAgICAjIGlmIHdlIGluY3JlYXNlIGkgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZworICAgICAgICAjIHZhbHVlIGF0IHRoZSBlbmQgdG8gb2J0YWluIGRlbHRhLgorCisgICAgICAgIG9sZGkgPSBpOyB3ID0gMTsgayA9IFBVTllDT0RFX0JBU0UKKyAgICAgICAgd2hpbGUgdHJ1ZQorICAgICAgICAgIGlmIGluXyA+PSBpbnB1dF9sZW5ndGgKKyAgICAgICAgICAgIHJhaXNlIFB1bnljb2RlQmFkSW5wdXQsICJJbnB1dCBpcyBpbnZhbGlkLiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBkaWdpdCA9IHB1bnljb2RlX2RlY29kZV9kaWdpdChpbnB1dFtpbl9dKQorICAgICAgICAgIGluXys9MQorICAgICAgICAgIGlmIGRpZ2l0ID49IFBVTllDT0RFX0JBU0UKKyAgICAgICAgICAgIHJhaXNlIFB1bnljb2RlQmFkSW5wdXQsICJJbnB1dCBpcyBpbnZhbGlkLiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBpZiBkaWdpdCA+IChQVU5ZQ09ERV9NQVhJTlQgLSBpKSAvIHcKKyAgICAgICAgICAgIHJhaXNlIFB1bnljb2RlT3ZlcmZsb3csICJJbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzLiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBpICs9IGRpZ2l0ICogdworICAgICAgICAgIHQgPSAoCisgICAgICAgICAgICBpZiBrIDw9IGJpYXMKKyAgICAgICAgICAgICAgUFVOWUNPREVfVE1JTgorICAgICAgICAgICAgZWxzaWYgayA+PSBiaWFzICsgUFVOWUNPREVfVE1BWAorICAgICAgICAgICAgICBQVU5ZQ09ERV9UTUFYCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGsgLSBiaWFzCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICApCisgICAgICAgICAgYnJlYWsgaWYgZGlnaXQgPCB0CisgICAgICAgICAgaWYgdyA+IFBVTllDT0RFX01BWElOVCAvIChQVU5ZQ09ERV9CQVNFIC0gdCkKKyAgICAgICAgICAgIHJhaXNlIFB1bnljb2RlT3ZlcmZsb3csICJJbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzLiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICB3ICo9IFBVTllDT0RFX0JBU0UgLSB0CisgICAgICAgICAgayArPSBQVU5ZQ09ERV9CQVNFCisgICAgICAgIGVuZAorCisgICAgICAgIGJpYXMgPSBwdW55Y29kZV9hZGFwdChpIC0gb2xkaSwgb3V0ICsgMSwgb2xkaSA9PSAwKQorCisgICAgICAgICMgSSB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBvdXQgKyAxIHRvIDAsCisgICAgICAgICMgaW5jcmVtZW50aW5nIG4gZWFjaCB0aW1lLCBzbyB3ZSdsbCBmaXggdGhhdCBub3c6CisKKyAgICAgICAgaWYgaSAvIChvdXQgKyAxKSA+IFBVTllDT0RFX01BWElOVCAtIG4KKyAgICAgICAgICByYWlzZSBQdW55Y29kZU92ZXJmbG93LCAiSW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzcy4iCisgICAgICAgIGVuZAorICAgICAgICBuICs9IGkgLyAob3V0ICsgMSkKKyAgICAgICAgaSAlPSBvdXQgKyAxCisKKyAgICAgICAgIyBJbnNlcnQgbiBhdCBwb3NpdGlvbiBpIG9mIHRoZSBvdXRwdXQ6CisKKyAgICAgICAgIyBub3QgbmVlZGVkIGZvciBQdW55Y29kZToKKyAgICAgICAgIyByYWlzZSBQVU5ZQ09ERV9JTlZBTElEX0lOUFVUIGlmIGRlY29kZV9kaWdpdChuKSA8PSBiYXNlCisgICAgICAgIGlmIG91dCA+PSBtYXhfb3V0CisgICAgICAgICAgcmFpc2UgUHVueWNvZGVCaWdPdXRwdXQsICJPdXRwdXQgd291bGQgZXhjZWVkIHRoZSBzcGFjZSBwcm92aWRlZC4iCisgICAgICAgIGVuZAorCisgICAgICAgICNtZW1tb3ZlKG91dHB1dCArIGkgKyAxLCBvdXRwdXQgKyBpLCAob3V0IC0gaSkgKiBzaXplb2YgKm91dHB1dCkKKyAgICAgICAgb3V0cHV0W2kgKyAxLCBvdXQgLSBpXSA9IG91dHB1dFtpLCBvdXQgLSBpXQorICAgICAgICBvdXRwdXRbaV0gPSBuCisgICAgICAgIGkgKz0gMQorCisgICAgICAgIG91dCArPSAxCisgICAgICBlbmQKKworICAgICAgb3V0cHV0X2xlbmd0aFswXSA9IG91dAorCisgICAgICBvdXRwdXQucGFjaygiVSoiKQorICAgIGVuZAorICAgIChjbGFzcyA8PHNlbGY7IHByaXZhdGUgOnB1bnljb2RlX2RlY29kZTsgZW5kKQorCisgICAgZGVmIHNlbGYucHVueWNvZGVfYmFzaWM/KGNvZGVwb2ludCkKKyAgICAgIGNvZGVwb2ludCA8IDB4ODAKKyAgICBlbmQKKyAgICAoY2xhc3MgPDxzZWxmOyBwcml2YXRlIDpwdW55Y29kZV9iYXNpYz87IGVuZCkKKworICAgIGRlZiBzZWxmLnB1bnljb2RlX2RlbGltaXRlcj8oY29kZXBvaW50KQorICAgICAgY29kZXBvaW50ID09IFBVTllDT0RFX0RFTElNSVRFUgorICAgIGVuZAorICAgIChjbGFzcyA8PHNlbGY7IHByaXZhdGUgOnB1bnljb2RlX2RlbGltaXRlcj87IGVuZCkKKworICAgIGRlZiBzZWxmLnB1bnljb2RlX2VuY29kZV9kaWdpdChkKQorICAgICAgZCArIDIyICsgNzUgKiAoKGQgPCAyNikgPyAxIDogMCkKKyAgICBlbmQKKyAgICAoY2xhc3MgPDxzZWxmOyBwcml2YXRlIDpwdW55Y29kZV9lbmNvZGVfZGlnaXQ7IGVuZCkKKworICAgICMgUmV0dXJucyB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGVwb2ludAorICAgICMgKGZvciB1c2UgaW4gcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgMCB0bworICAgICMgYmFzZSAtIDEsIG9yIFBVTllDT0RFX0JBU0UgaWYgY29kZXBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLgorICAgIGRlZiBzZWxmLnB1bnljb2RlX2RlY29kZV9kaWdpdChjb2RlcG9pbnQpCisgICAgICBpZiBjb2RlcG9pbnQgLSA0OCA8IDEwCisgICAgICAgIGNvZGVwb2ludCAtIDIyCisgICAgICBlbHNpZiBjb2RlcG9pbnQgLSA2NSA8IDI2CisgICAgICAgIGNvZGVwb2ludCAtIDY1CisgICAgICBlbHNpZiBjb2RlcG9pbnQgLSA5NyA8IDI2CisgICAgICAgIGNvZGVwb2ludCAtIDk3CisgICAgICBlbHNlCisgICAgICAgIFBVTllDT0RFX0JBU0UKKyAgICAgIGVuZAorICAgIGVuZAorICAgIChjbGFzcyA8PHNlbGY7IHByaXZhdGUgOnB1bnljb2RlX2RlY29kZV9kaWdpdDsgZW5kKQorCisgICAgIyBCaWFzIGFkYXB0YXRpb24gbWV0aG9kCisgICAgZGVmIHNlbGYucHVueWNvZGVfYWRhcHQoZGVsdGEsIG51bXBvaW50cywgZmlyc3R0aW1lKQorICAgICAgZGVsdGEgPSBmaXJzdHRpbWUgPyBkZWx0YSAvIFBVTllDT0RFX0RBTVAgOiBkZWx0YSA+PiAxCisgICAgICAjIGRlbHRhID4+IDEgaXMgYSBmYXN0ZXIgd2F5IG9mIGRvaW5nIGRlbHRhIC8gMgorICAgICAgZGVsdGEgKz0gZGVsdGEgLyBudW1wb2ludHMKKyAgICAgIGRpZmZlcmVuY2UgPSBQVU5ZQ09ERV9CQVNFIC0gUFVOWUNPREVfVE1JTgorCisgICAgICBrID0gMAorICAgICAgd2hpbGUgZGVsdGEgPiAoZGlmZmVyZW5jZSAqIFBVTllDT0RFX1RNQVgpIC8gMgorICAgICAgICBkZWx0YSAvPSBkaWZmZXJlbmNlCisgICAgICAgIGsgKz0gUFVOWUNPREVfQkFTRQorICAgICAgZW5kCisKKyAgICAgIGsgKyAoZGlmZmVyZW5jZSArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBQVU5ZQ09ERV9TS0VXKQorICAgIGVuZAorICAgIChjbGFzcyA8PHNlbGY7IHByaXZhdGUgOnB1bnljb2RlX2FkYXB0OyBlbmQpCisgIGVuZAorICAjIDpzdGFydGRvYzoKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvbGliL2FkZHJlc3NhYmxlL3RlbXBsYXRlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvbGliL2FkZHJlc3NhYmxlL3RlbXBsYXRlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZWUzZjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9saWIvYWRkcmVzc2FibGUvdGVtcGxhdGUucmIKQEAgLTAsMCArMSwxMDY1IEBACisjIGVuY29kaW5nOnV0Zi04CisjLS0KKyMgQ29weXJpZ2h0IChDKSBCb2IgQW1hbgorIworIyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIysrCisKKworcmVxdWlyZSAiYWRkcmVzc2FibGUvdmVyc2lvbiIKK3JlcXVpcmUgImFkZHJlc3NhYmxlL3VyaSIKKworbW9kdWxlIEFkZHJlc3NhYmxlCisgICMjCisgICMgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFVSSSB0ZW1wbGF0ZSBiYXNlZCBvbgorICAjIFJGQyA2NTcwIChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTcwKS4KKyAgY2xhc3MgVGVtcGxhdGUKKyAgICAjIENvbnN0YW50cyB1c2VkIHRocm91Z2hvdXQgdGhlIHRlbXBsYXRlIGNvZGUuCisgICAgYW55dGhpbmcgPQorICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6UkVTRVJWRUQgKworICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRAorCisKKyAgICB2YXJpYWJsZV9jaGFyX2NsYXNzID0KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM6OkFMUEhBICsKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM6OkRJR0lUICsgJ18nCisKKyAgICB2YXJfY2hhciA9CisgICAgICAiKD86KD86WyN7dmFyaWFibGVfY2hhcl9jbGFzc31dfCVbYS1mQS1GMC05XVthLWZBLUYwLTldKSspIgorICAgIFJFU0VSVkVEID0KKyAgICAgICIoPzpbI3thbnl0aGluZ31dfCVbYS1mQS1GMC05XVthLWZBLUYwLTldKSIKKyAgICBVTlJFU0VSVkVEID0KKyAgICAgICIoPzpbI3sKKyAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRAorICAgICAgfV18JVthLWZBLUYwLTldW2EtZkEtRjAtOV0pIgorICAgIHZhcmlhYmxlID0KKyAgICAgICIoPzoje3Zhcl9jaGFyfSg/OlxcLj8je3Zhcl9jaGFyfSkqKSIKKyAgICB2YXJzcGVjID0KKyAgICAgICIoPzooI3t2YXJpYWJsZX0pKFxcKnw6XFxkKyk/KSIKKyAgICBWQVJOQU1FID0KKyAgICAgIC9eI3t2YXJpYWJsZX0kLworICAgIFZBUlNQRUMgPQorICAgICAgL14je3ZhcnNwZWN9JC8KKyAgICBWQVJJQUJMRV9MSVNUID0KKyAgICAgIC9eI3t2YXJzcGVjfSg/Oiwje3ZhcnNwZWN9KSokLworICAgIG9wZXJhdG9yID0KKyAgICAgICIrIy4vOz8mPSwhQHwiCisgICAgRVhQUkVTU0lPTiA9CisgICAgICAvXHsoWyN7b3BlcmF0b3J9XSk/KCN7dmFyc3BlY30oPzosI3t2YXJzcGVjfSkqKVx9LworCisKKyAgICBMRUFERVJTID0geworICAgICAgJz8nID0+ICc/JywKKyAgICAgICcvJyA9PiAnLycsCisgICAgICAnIycgPT4gJyMnLAorICAgICAgJy4nID0+ICcuJywKKyAgICAgICc7JyA9PiAnOycsCisgICAgICAnJicgPT4gJyYnCisgICAgfQorICAgIEpPSU5FUlMgPSB7CisgICAgICAnPycgPT4gJyYnLAorICAgICAgJy4nID0+ICcuJywKKyAgICAgICc7JyA9PiAnOycsCisgICAgICAnJicgPT4gJyYnLAorICAgICAgJy8nID0+ICcvJworICAgIH0KKworICAgICMjCisgICAgIyBSYWlzZWQgaWYgYW4gaW52YWxpZCB0ZW1wbGF0ZSB2YWx1ZSBpcyBzdXBwbGllZC4KKyAgICBjbGFzcyBJbnZhbGlkVGVtcGxhdGVWYWx1ZUVycm9yIDwgU3RhbmRhcmRFcnJvcgorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFJhaXNlZCBpZiBhbiBpbnZhbGlkIHRlbXBsYXRlIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBwYXR0ZXJuLgorICAgIGNsYXNzIEludmFsaWRUZW1wbGF0ZU9wZXJhdG9yRXJyb3IgPCBTdGFuZGFyZEVycm9yCisgICAgZW5kCisKKyAgICAjIworICAgICMgUmFpc2VkIGlmIGFuIGludmFsaWQgdGVtcGxhdGUgb3BlcmF0b3IgaXMgdXNlZCBpbiBhIHBhdHRlcm4uCisgICAgY2xhc3MgVGVtcGxhdGVPcGVyYXRvckFib3J0ZWRFcnJvciA8IFN0YW5kYXJkRXJyb3IKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGRhdGEgdGhhdCBpcyBleHRyYWN0ZWQgd2hlbiBhIFRlbXBsYXRlCisgICAgIyBpcyBtYXRjaGVkIGFnYWluc3QgYSBVUkkuCisgICAgY2xhc3MgTWF0Y2hEYXRhCisgICAgICAjIworICAgICAgIyBDcmVhdGVzIGEgbmV3IE1hdGNoRGF0YSBvYmplY3QuCisgICAgICAjIE1hdGNoRGF0YSBvYmplY3RzIHNob3VsZCBuZXZlciBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBbQWRkcmVzc2FibGU6OlVSSV0gdXJpCisgICAgICAjICAgVGhlIFVSSSB0aGF0IHRoZSB0ZW1wbGF0ZSB3YXMgbWF0Y2hlZCBhZ2FpbnN0LgorICAgICAgZGVmIGluaXRpYWxpemUodXJpLCB0ZW1wbGF0ZSwgbWFwcGluZykKKyAgICAgICAgQHVyaSA9IHVyaS5kdXAuZnJlZXplCisgICAgICAgIEB0ZW1wbGF0ZSA9IHRlbXBsYXRlCisgICAgICAgIEBtYXBwaW5nID0gbWFwcGluZy5kdXAuZnJlZXplCisgICAgICBlbmQKKworICAgICAgIyMKKyAgICAgICMgQHJldHVybiBbQWRkcmVzc2FibGU6OlVSSV0KKyAgICAgICMgICBUaGUgVVJJIHRoYXQgdGhlIFRlbXBsYXRlIHdhcyBtYXRjaGVkIGFnYWluc3QuCisgICAgICBhdHRyX3JlYWRlciA6dXJpCisKKyAgICAgICMjCisgICAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpUZW1wbGF0ZV0KKyAgICAgICMgICBUaGUgVGVtcGxhdGUgdXNlZCBmb3IgdGhlIG1hdGNoLgorICAgICAgYXR0cl9yZWFkZXIgOnRlbXBsYXRlCisKKyAgICAgICMjCisgICAgICAjIEByZXR1cm4gW0hhc2hdCisgICAgICAjICAgVGhlIG1hcHBpbmcgdGhhdCByZXN1bHRlZCBmcm9tIHRoZSBtYXRjaC4KKyAgICAgICMgICBOb3RlIHRoYXQgdGhpcyBtYXBwaW5nIGRvZXMgbm90IGluY2x1ZGUga2V5cyBvciB2YWx1ZXMgZm9yCisgICAgICAjICAgdmFyaWFibGVzIHRoYXQgYXBwZWFyIGluIHRoZSBUZW1wbGF0ZSwgYnV0IGFyZSBub3QgcHJlc2VudAorICAgICAgIyAgIGluIHRoZSBVUkkuCisgICAgICBhdHRyX3JlYWRlciA6bWFwcGluZworCisgICAgICAjIworICAgICAgIyBAcmV0dXJuIFtBcnJheV0KKyAgICAgICMgICBUaGUgbGlzdCBvZiB2YXJpYWJsZXMgdGhhdCB3ZXJlIHByZXNlbnQgaW4gdGhlIFRlbXBsYXRlLgorICAgICAgIyAgIE5vdGUgdGhhdCB0aGlzIGxpc3Qgd2lsbCBpbmNsdWRlIHZhcmlhYmxlcyB3aGljaCBkbyBub3QgYXBwZWFyCisgICAgICAjICAgaW4gdGhlIG1hcHBpbmcgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHByZXNlbnQgaW4gVVJJLgorICAgICAgZGVmIHZhcmlhYmxlcworICAgICAgICBzZWxmLnRlbXBsYXRlLnZhcmlhYmxlcworICAgICAgZW5kCisgICAgICBhbGlhc19tZXRob2QgOmtleXMsIDp2YXJpYWJsZXMKKyAgICAgIGFsaWFzX21ldGhvZCA6bmFtZXMsIDp2YXJpYWJsZXMKKworICAgICAgIyMKKyAgICAgICMgQHJldHVybiBbQXJyYXldCisgICAgICAjICAgVGhlIGxpc3Qgb2YgdmFsdWVzIHRoYXQgd2VyZSBjYXB0dXJlZCBieSB0aGUgVGVtcGxhdGUuCisgICAgICAjICAgTm90ZSB0aGF0IHRoaXMgbGlzdCB3aWxsIGluY2x1ZGUgbmlscyBmb3IgYW55IHZhcmlhYmxlcyB3aGljaAorICAgICAgIyAgIHdlcmUgaW4gdGhlIFRlbXBsYXRlLCBidXQgZGlkIG5vdCBhcHBlYXIgaW4gdGhlIFVSSS4KKyAgICAgIGRlZiB2YWx1ZXMKKyAgICAgICAgQHZhbHVlcyB8fD0gc2VsZi52YXJpYWJsZXMuaW5qZWN0KFtdKSBkbyB8YWNjdSwga2V5fAorICAgICAgICAgIGFjY3UgPDwgc2VsZi5tYXBwaW5nW2tleV0KKyAgICAgICAgICBhY2N1CisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBhbGlhc19tZXRob2QgOmNhcHR1cmVzLCA6dmFsdWVzCisKKyAgICAgICMjCisgICAgICAjIEFjY2Vzc2VzIGNhcHR1cmVkIHZhbHVlcyBieSBuYW1lIG9yIGJ5IGluZGV4LgorICAgICAgIworICAgICAgIyBAcGFyYW0gW1N0cmluZywgU3ltYm9sLCBGaXhudW1dIGtleQorICAgICAgIyAgIENhcHR1cmUgaW5kZXggb3IgbmFtZS4gTm90ZSB0aGF0IHdoZW4gYWNjZXNzaW5nIGJ5IHdpdGggaW5kZXgKKyAgICAgICMgICBvZiAwLCB0aGUgZnVsbCBVUkkgd2lsbCBiZSByZXR1cm5lZC4gVGhlIGludGVudGlvbiBpcyB0byBtaW1pYworICAgICAgIyAgIHRoZSA6Ok1hdGNoRGF0YSNbXSBiZWhhdmlvci4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIFsjdG9faW50LCBuaWxdIGxlbgorICAgICAgIyAgIElmIHByb3ZpZGVkLCBhbiBhcnJheSBvZiB2YWx1ZXMgd2lsbCBiZSByZXR1cmVuZCB3aXRoIHRoZSBnaXZlbgorICAgICAgIyAgIHBhcmFtZXRlciB1c2VkIGFzIGxlbmd0aC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQXJyYXksIFN0cmluZywgbmlsXQorICAgICAgIyAgIFRoZSBjYXB0dXJlZCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRleCBvciBuYW1lLiBJZiB0aGUKKyAgICAgICMgICB2YWx1ZSB3YXMgbm90IHByb3ZpZGVkIG9yIHRoZSBrZXkgaXMgdW5rbm93biwgbmlsIHdpbGwgYmUKKyAgICAgICMgICByZXR1cm5lZC4KKyAgICAgICMKKyAgICAgICMgICBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgYW4gYXJyYXkgb2YgdGhhdCBsZW5ndGggd2lsbAorICAgICAgIyAgIGJlIHJldHVybmVkIGluc3RlYWQuCisgICAgICBkZWYgW10oa2V5LCBsZW4gPSBuaWwpCisgICAgICAgIGlmIGxlbgorICAgICAgICAgIHRvX2Fba2V5LCBsZW5dCisgICAgICAgIGVsc2lmIFN0cmluZyA9PT0ga2V5IG9yIFN5bWJvbCA9PT0ga2V5CisgICAgICAgICAgbWFwcGluZ1trZXkudG9fc10KKyAgICAgICAgZWxzZQorICAgICAgICAgIHRvX2Fba2V5XQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIworICAgICAgIyBAcmV0dXJuIFtBcnJheV0KKyAgICAgICMgICBBcnJheSB3aXRoIHRoZSBtYXRjaGVkIFVSSSBhcyBmaXJzdCBlbGVtZW50IGZvbGxvd2VkIGJ5IHRoZSBjYXB0dXJlZAorICAgICAgIyAgIHZhbHVlcy4KKyAgICAgIGRlZiB0b19hCisgICAgICAgIFt0b19zLCAqdmFsdWVzXQorICAgICAgZW5kCisKKyAgICAgICMjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgICMgICBUaGUgbWF0Y2hlZCBVUkkgYXMgU3RyaW5nLgorICAgICAgZGVmIHRvX3MKKyAgICAgICAgdXJpLnRvX3MKKyAgICAgIGVuZAorICAgICAgYWxpYXNfbWV0aG9kIDpzdHJpbmcsIDp0b19zCisKKyAgICAgICMgUmV0dXJucyBtdWx0aXBsZSBjYXB0dXJlZCB2YWx1ZXMgYXQgb25jZS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIFtTdHJpbmcsIFN5bWJvbCwgRml4bnVtXSAqaW5kZXhlcworICAgICAgIyAgIEluZGljZXMgb2YgdGhlIGNhcHR1cmVzIHRvIGJlIHJldHVybmVkCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0FycmF5XQorICAgICAgIyAgIFZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGluZGljZXMuCisgICAgICAjCisgICAgICAjIEBzZWUgQWRkcmVzc2FibGU6OlRlbXBsYXRlOjpNYXRjaERhdGEjW10KKyAgICAgIGRlZiB2YWx1ZXNfYXQoKmluZGV4ZXMpCisgICAgICAgIGluZGV4ZXMubWFwIHsgfGl8IHNlbGZbaV0gfQorICAgICAgZW5kCisKKyAgICAgICMjCisgICAgICAjIFJldHVybnMgYSA8dHQ+U3RyaW5nPC90dD4gcmVwcmVzZW50YXRpb24gb2YgdGhlIE1hdGNoRGF0YSdzIHN0YXRlLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBNYXRjaERhdGEncyBzdGF0ZSwgYXMgYSA8dHQ+U3RyaW5nPC90dD4uCisgICAgICBkZWYgaW5zcGVjdAorICAgICAgICBzcHJpbnRmKCIjPCVzOiUjMHggUkVTVUxUOiVzPiIsCisgICAgICAgICAgc2VsZi5jbGFzcy50b19zLCBzZWxmLm9iamVjdF9pZCwgc2VsZi5tYXBwaW5nLmluc3BlY3QpCisgICAgICBlbmQKKworICAgICAgIyMKKyAgICAgICMgRHVtbXkgbWV0aG9kIGZvciBjb2RlIGV4cGVjdGluZyBhIDo6TWF0Y2hEYXRhIGluc3RhbmNlCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gQW4gZW1wdHkgc3RyaW5nLgorICAgICAgZGVmIHByZV9tYXRjaAorICAgICAgICAiIgorICAgICAgZW5kCisgICAgICBhbGlhc19tZXRob2QgOnBvc3RfbWF0Y2gsIDpwcmVfbWF0Y2gKKyAgICBlbmQKKworICAgICMjCisgICAgIyBDcmVhdGVzIGEgbmV3IDx0dD5BZGRyZXNzYWJsZTo6VGVtcGxhdGU8L3R0PiBvYmplY3QuCisgICAgIworICAgICMgQHBhcmFtIFsjdG9fc3RyXSBwYXR0ZXJuIFRoZSBVUkkgVGVtcGxhdGUgcGF0dGVybi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBZGRyZXNzYWJsZTo6VGVtcGxhdGVdIFRoZSBpbml0aWFsaXplZCBUZW1wbGF0ZSBvYmplY3QuCisgICAgZGVmIGluaXRpYWxpemUocGF0dGVybikKKyAgICAgIGlmICFwYXR0ZXJuLnJlc3BvbmRfdG8/KDp0b19zdHIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3twYXR0ZXJuLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQKKyAgICAgIEBwYXR0ZXJuID0gcGF0dGVybi50b19zdHIuZHVwLmZyZWV6ZQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIEZyZWV6ZSBVUkksIGluaXRpYWxpemluZyBpbnN0YW5jZSB2YXJpYWJsZXMuCisgICAgIworICAgICMgQHJldHVybiBbQWRkcmVzc2FibGU6OlVSSV0gVGhlIGZyb3plbiBVUkkgb2JqZWN0LgorICAgIGRlZiBmcmVlemUKKyAgICAgIHNlbGYudmFyaWFibGVzCisgICAgICBzZWxmLnZhcmlhYmxlX2RlZmF1bHRzCisgICAgICBzZWxmLm5hbWVkX2NhcHR1cmVzCisgICAgICBzdXBlcgorICAgIGVuZAorCisgICAgIyMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIFRlbXBsYXRlIG9iamVjdCdzIHBhdHRlcm4uCisgICAgYXR0cl9yZWFkZXIgOnBhdHRlcm4KKworICAgICMjCisgICAgIyBSZXR1cm5zIGEgPHR0PlN0cmluZzwvdHQ+IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUZW1wbGF0ZSBvYmplY3QncyBzdGF0ZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBUZW1wbGF0ZSBvYmplY3QncyBzdGF0ZSwgYXMgYSA8dHQ+U3RyaW5nPC90dD4uCisgICAgZGVmIGluc3BlY3QKKyAgICAgIHNwcmludGYoIiM8JXM6JSMweCBQQVRURVJOOiVzPiIsCisgICAgICAgIHNlbGYuY2xhc3MudG9fcywgc2VsZi5vYmplY3RfaWQsIHNlbGYucGF0dGVybikKKyAgICBlbmQKKworICAgICMjCisgICAgIyBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBUZW1wbGF0ZSBvYmplY3RzIGFyZSBlcXVhbC4gVGhpcyBtZXRob2QKKyAgICAjIGRvZXMgTk9UIG5vcm1hbGl6ZSBlaXRoZXIgVGVtcGxhdGUgYmVmb3JlIGRvaW5nIHRoZSBjb21wYXJpc29uLgorICAgICMKKyAgICAjIEBwYXJhbSBbT2JqZWN0XSB0ZW1wbGF0ZSBUaGUgVGVtcGxhdGUgdG8gY29tcGFyZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtUcnVlQ2xhc3MsIEZhbHNlQ2xhc3NdCisgICAgIyAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBUZW1wbGF0ZXMgYXJlIGVxdWl2YWxlbnQsIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICMgICBvdGhlcndpc2UuCisgICAgZGVmID09KHRlbXBsYXRlKQorICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyB0ZW1wbGF0ZS5raW5kX29mPyhUZW1wbGF0ZSkKKyAgICAgIHJldHVybiBzZWxmLnBhdHRlcm4gPT0gdGVtcGxhdGUucGF0dGVybgorICAgIGVuZAorCisgICAgIyMKKyAgICAjIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZSBtYWtlcyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIGA9PWAgYW5kIGBlcWw/YC4KKyAgICAjCisgICAgIyBAc2VlICM9PQorICAgIGFsaWFzX21ldGhvZCA6ZXFsPywgOj09CisKKyAgICAjIworICAgICMgRXh0cmFjdHMgYSBtYXBwaW5nIGZyb20gdGhlIFVSSSB1c2luZyBhIFVSSSBUZW1wbGF0ZSBwYXR0ZXJuLgorICAgICMKKyAgICAjIEBwYXJhbSBbQWRkcmVzc2FibGU6OlVSSSwgI3RvX3N0cl0gdXJpCisgICAgIyAgIFRoZSBVUkkgdG8gZXh0cmFjdCBmcm9tLgorICAgICMKKyAgICAjIEBwYXJhbSBbI3Jlc3RvcmUsICNtYXRjaF0gcHJvY2Vzc29yCisgICAgIyAgIEEgdGVtcGxhdGUgcHJvY2Vzc29yIG9iamVjdCBtYXkgb3B0aW9uYWxseSBiZSBzdXBwbGllZC4KKyAgICAjCisgICAgIyAgIFRoZSBvYmplY3Qgc2hvdWxkIHJlc3BvbmQgdG8gZWl0aGVyIHRoZSA8dHQ+cmVzdG9yZTwvdHQ+IG9yCisgICAgIyAgIDx0dD5tYXRjaDwvdHQ+IG1lc3NhZ2VzIG9yIGJvdGguIFRoZSA8dHQ+cmVzdG9yZTwvdHQ+IG1ldGhvZCBzaG91bGQKKyAgICAjICAgdGFrZSB0d28gcGFyYW1ldGVyczogYFtTdHJpbmddIG5hbWVgIGFuZCBgW1N0cmluZ10gdmFsdWVgLgorICAgICMgICBUaGUgPHR0PnJlc3RvcmU8L3R0PiBtZXRob2Qgc2hvdWxkIHJldmVyc2UgYW55IHRyYW5zZm9ybWF0aW9ucyB0aGF0CisgICAgIyAgIGhhdmUgYmVlbiBwZXJmb3JtZWQgb24gdGhlIHZhbHVlIHRvIGVuc3VyZSBhIHZhbGlkIFVSSS4KKyAgICAjICAgVGhlIDx0dD5tYXRjaDwvdHQ+IG1ldGhvZCBzaG91bGQgdGFrZSBhIHNpbmdsZQorICAgICMgICBwYXJhbWV0ZXI6IGBbU3RyaW5nXSBuYW1lYC4gIFRoZSA8dHQ+bWF0Y2g8L3R0PiBtZXRob2Qgc2hvdWxkIHJldHVybgorICAgICMgICBhIDx0dD5TdHJpbmc8L3R0PiBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIGNhcHR1cmUgZ3JvdXAgZm9yCisgICAgIyAgIG1hdGNoaW5nIG9uIHRoYXQgcGFydGljdWxhciB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYCIuKj8iYC4KKyAgICAjICAgVGhlIDx0dD5tYXRjaDwvdHQ+IG1ldGhvZCBoYXMgbm8gZWZmZWN0IG9uIG11bHRpdmFyaWF0ZSBvcGVyYXRvcgorICAgICMgICBleHBhbnNpb25zLgorICAgICMKKyAgICAjIEByZXR1cm4gW0hhc2gsIE5pbENsYXNzXQorICAgICMgICBUaGUgPHR0Pkhhc2g8L3R0PiBtYXBwaW5nIHRoYXQgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBVUkksIG9yCisgICAgIyAgIDx0dD5uaWw8L3R0PiBpZiB0aGUgVVJJIGRpZG4ndCBtYXRjaCB0aGUgdGVtcGxhdGUuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgY2xhc3MgRXhhbXBsZVByb2Nlc3NvcgorICAgICMgICAgIGRlZiBzZWxmLnJlc3RvcmUobmFtZSwgdmFsdWUpCisgICAgIyAgICAgICByZXR1cm4gdmFsdWUuZ3N1YigvXCsvLCAiICIpIGlmIG5hbWUgPT0gInF1ZXJ5IgorICAgICMgICAgICAgcmV0dXJuIHZhbHVlCisgICAgIyAgICAgZW5kCisgICAgIworICAgICMgICAgIGRlZiBzZWxmLm1hdGNoKG5hbWUpCisgICAgIyAgICAgICByZXR1cm4gIi4qPyIgaWYgbmFtZSA9PSAiZmlyc3QiCisgICAgIyAgICAgICByZXR1cm4gIi4qIgorICAgICMgICAgIGVuZAorICAgICMgICBlbmQKKyAgICAjCisgICAgIyAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoCisgICAgIyAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9zZWFyY2gvYW4rZXhhbXBsZStzZWFyY2grcXVlcnkvIgorICAgICMgICApCisgICAgIyAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoCisgICAgIyAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9zZWFyY2gve3F1ZXJ5fS8iCisgICAgIyAgICkuZXh0cmFjdCh1cmksIEV4YW1wbGVQcm9jZXNzb3IpCisgICAgIyAgICM9PiB7InF1ZXJ5IiA9PiAiYW4gZXhhbXBsZSBzZWFyY2ggcXVlcnkifQorICAgICMKKyAgICAjICAgdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL2EvYi9jLyIpCisgICAgIyAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoCisgICAgIyAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS97Zmlyc3R9L3tzZWNvbmR9LyIKKyAgICAjICAgKS5leHRyYWN0KHVyaSwgRXhhbXBsZVByb2Nlc3NvcikKKyAgICAjICAgIz0+IHsiZmlyc3QiID0+ICJhIiwgInNlY29uZCIgPT4gImIvYyJ9CisgICAgIworICAgICMgICB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vYS9iL2MvIikKKyAgICAjICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAjICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3tmaXJzdH0vey1saXN0fC98c2Vjb25kfS8iCisgICAgIyAgICkuZXh0cmFjdCh1cmkpCisgICAgIyAgICM9PiB7ImZpcnN0IiA9PiAiYSIsICJzZWNvbmQiID0+IFsiYiIsICJjIl19CisgICAgZGVmIGV4dHJhY3QodXJpLCBwcm9jZXNzb3I9bmlsKQorICAgICAgbWF0Y2hfZGF0YSA9IHNlbGYubWF0Y2godXJpLCBwcm9jZXNzb3IpCisgICAgICByZXR1cm4gKG1hdGNoX2RhdGEgPyBtYXRjaF9kYXRhLm1hcHBpbmcgOiBuaWwpCisgICAgZW5kCisKKyAgICAjIworICAgICMgRXh0cmFjdHMgbWF0Y2ggZGF0YSBmcm9tIHRoZSBVUkkgdXNpbmcgYSBVUkkgVGVtcGxhdGUgcGF0dGVybi4KKyAgICAjCisgICAgIyBAcGFyYW0gW0FkZHJlc3NhYmxlOjpVUkksICN0b19zdHJdIHVyaQorICAgICMgICBUaGUgVVJJIHRvIGV4dHJhY3QgZnJvbS4KKyAgICAjCisgICAgIyBAcGFyYW0gWyNyZXN0b3JlLCAjbWF0Y2hdIHByb2Nlc3NvcgorICAgICMgICBBIHRlbXBsYXRlIHByb2Nlc3NvciBvYmplY3QgbWF5IG9wdGlvbmFsbHkgYmUgc3VwcGxpZWQuCisgICAgIworICAgICMgICBUaGUgb2JqZWN0IHNob3VsZCByZXNwb25kIHRvIGVpdGhlciB0aGUgPHR0PnJlc3RvcmU8L3R0PiBvcgorICAgICMgICA8dHQ+bWF0Y2g8L3R0PiBtZXNzYWdlcyBvciBib3RoLiBUaGUgPHR0PnJlc3RvcmU8L3R0PiBtZXRob2Qgc2hvdWxkCisgICAgIyAgIHRha2UgdHdvIHBhcmFtZXRlcnM6IGBbU3RyaW5nXSBuYW1lYCBhbmQgYFtTdHJpbmddIHZhbHVlYC4KKyAgICAjICAgVGhlIDx0dD5yZXN0b3JlPC90dD4gbWV0aG9kIHNob3VsZCByZXZlcnNlIGFueSB0cmFuc2Zvcm1hdGlvbnMgdGhhdAorICAgICMgICBoYXZlIGJlZW4gcGVyZm9ybWVkIG9uIHRoZSB2YWx1ZSB0byBlbnN1cmUgYSB2YWxpZCBVUkkuCisgICAgIyAgIFRoZSA8dHQ+bWF0Y2g8L3R0PiBtZXRob2Qgc2hvdWxkIHRha2UgYSBzaW5nbGUKKyAgICAjICAgcGFyYW1ldGVyOiBgW1N0cmluZ10gbmFtZWAuIFRoZSA8dHQ+bWF0Y2g8L3R0PiBtZXRob2Qgc2hvdWxkIHJldHVybgorICAgICMgICBhIDx0dD5TdHJpbmc8L3R0PiBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIGNhcHR1cmUgZ3JvdXAgZm9yCisgICAgIyAgIG1hdGNoaW5nIG9uIHRoYXQgcGFydGljdWxhciB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYCIuKj8iYC4KKyAgICAjICAgVGhlIDx0dD5tYXRjaDwvdHQ+IG1ldGhvZCBoYXMgbm8gZWZmZWN0IG9uIG11bHRpdmFyaWF0ZSBvcGVyYXRvcgorICAgICMgICBleHBhbnNpb25zLgorICAgICMKKyAgICAjIEByZXR1cm4gW0hhc2gsIE5pbENsYXNzXQorICAgICMgICBUaGUgPHR0Pkhhc2g8L3R0PiBtYXBwaW5nIHRoYXQgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBVUkksIG9yCisgICAgIyAgIDx0dD5uaWw8L3R0PiBpZiB0aGUgVVJJIGRpZG4ndCBtYXRjaCB0aGUgdGVtcGxhdGUuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgY2xhc3MgRXhhbXBsZVByb2Nlc3NvcgorICAgICMgICAgIGRlZiBzZWxmLnJlc3RvcmUobmFtZSwgdmFsdWUpCisgICAgIyAgICAgICByZXR1cm4gdmFsdWUuZ3N1YigvXCsvLCAiICIpIGlmIG5hbWUgPT0gInF1ZXJ5IgorICAgICMgICAgICAgcmV0dXJuIHZhbHVlCisgICAgIyAgICAgZW5kCisgICAgIworICAgICMgICAgIGRlZiBzZWxmLm1hdGNoKG5hbWUpCisgICAgIyAgICAgICByZXR1cm4gIi4qPyIgaWYgbmFtZSA9PSAiZmlyc3QiCisgICAgIyAgICAgICByZXR1cm4gIi4qIgorICAgICMgICAgIGVuZAorICAgICMgICBlbmQKKyAgICAjCisgICAgIyAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoCisgICAgIyAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9zZWFyY2gvYW4rZXhhbXBsZStzZWFyY2grcXVlcnkvIgorICAgICMgICApCisgICAgIyAgIG1hdGNoID0gQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAjICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3NlYXJjaC97cXVlcnl9LyIKKyAgICAjICAgKS5tYXRjaCh1cmksIEV4YW1wbGVQcm9jZXNzb3IpCisgICAgIyAgIG1hdGNoLnZhcmlhYmxlcworICAgICMgICAjPT4gWyJxdWVyeSJdCisgICAgIyAgIG1hdGNoLmNhcHR1cmVzCisgICAgIyAgICM9PiBbImFuIGV4YW1wbGUgc2VhcmNoIHF1ZXJ5Il0KKyAgICAjCisgICAgIyAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9hL2IvYy8iKQorICAgICMgICBtYXRjaCA9IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoCisgICAgIyAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS97Zmlyc3R9L3src2Vjb25kfS8iCisgICAgIyAgICkubWF0Y2godXJpLCBFeGFtcGxlUHJvY2Vzc29yKQorICAgICMgICBtYXRjaC52YXJpYWJsZXMKKyAgICAjICAgIz0+IFsiZmlyc3QiLCAic2Vjb25kIl0KKyAgICAjICAgbWF0Y2guY2FwdHVyZXMKKyAgICAjICAgIz0+IFsiYSIsICJiL2MiXQorICAgICMKKyAgICAjICAgdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL2EvYi9jLyIpCisgICAgIyAgIG1hdGNoID0gQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAjICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3tmaXJzdH17L3NlY29uZCp9LyIKKyAgICAjICAgKS5tYXRjaCh1cmkpCisgICAgIyAgIG1hdGNoLnZhcmlhYmxlcworICAgICMgICAjPT4gWyJmaXJzdCIsICJzZWNvbmQiXQorICAgICMgICBtYXRjaC5jYXB0dXJlcworICAgICMgICAjPT4gWyJhIiwgWyJiIiwgImMiXV0KKyAgICBkZWYgbWF0Y2godXJpLCBwcm9jZXNzb3I9bmlsKQorICAgICAgdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSh1cmkpCisgICAgICBtYXBwaW5nID0ge30KKworICAgICAgIyBGaXJzdCwgd2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwYXR0ZXJuLCBhbmQgZXh0cmFjdCB0aGUgdmFsdWVzLgorICAgICAgZXhwYW5zaW9ucywgZXhwYW5zaW9uX3JlZ2V4cCA9CisgICAgICAgIHBhcnNlX3RlbXBsYXRlX3BhdHRlcm4ocGF0dGVybiwgcHJvY2Vzc29yKQorCisgICAgICByZXR1cm4gbmlsIHVubGVzcyB1cmkudG9fc3RyLm1hdGNoKGV4cGFuc2lvbl9yZWdleHApCisgICAgICB1bnBhcnNlZF92YWx1ZXMgPSB1cmkudG9fc3RyLnNjYW4oZXhwYW5zaW9uX3JlZ2V4cCkuZmxhdHRlbgorCisgICAgICBpZiB1cmkudG9fc3RyID09IHBhdHRlcm4KKyAgICAgICAgcmV0dXJuIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZTo6TWF0Y2hEYXRhLm5ldyh1cmksIHNlbGYsIG1hcHBpbmcpCisgICAgICBlbHNpZiBleHBhbnNpb25zLnNpemUgPiAwCisgICAgICAgIGluZGV4ID0gMAorICAgICAgICBleHBhbnNpb25zLmVhY2ggZG8gfGV4cGFuc2lvbnwKKyAgICAgICAgICBfLCBvcGVyYXRvciwgdmFybGlzdCA9ICpleHBhbnNpb24ubWF0Y2goRVhQUkVTU0lPTikKKyAgICAgICAgICB2YXJsaXN0LnNwbGl0KCcsJykuZWFjaCBkbyB8dmFyc3BlY3wKKyAgICAgICAgICAgIF8sIG5hbWUsIG1vZGlmaWVyID0gKnZhcnNwZWMubWF0Y2goVkFSU1BFQykKKyAgICAgICAgICAgIG1hcHBpbmdbbmFtZV0gfHw9IG5pbAorICAgICAgICAgICAgY2FzZSBvcGVyYXRvcgorICAgICAgICAgICAgd2hlbiBuaWwsICcrJywgJyMnLCAnLycsICcuJworICAgICAgICAgICAgICB1bnBhcnNlZF92YWx1ZSA9IHVucGFyc2VkX3ZhbHVlc1tpbmRleF0KKyAgICAgICAgICAgICAgbmFtZSA9IHZhcnNwZWNbVkFSU1BFQywgMV0KKyAgICAgICAgICAgICAgdmFsdWUgPSB1bnBhcnNlZF92YWx1ZQorICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KEpPSU5FUlNbb3BlcmF0b3JdKSBpZiB2YWx1ZSAmJiBtb2RpZmllciA9PSAnKicKKyAgICAgICAgICAgIHdoZW4gJzsnLCAnPycsICcmJworICAgICAgICAgICAgICBpZiBtb2RpZmllciA9PSAnKicKKyAgICAgICAgICAgICAgICBpZiB1bnBhcnNlZF92YWx1ZXNbaW5kZXhdCisgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVucGFyc2VkX3ZhbHVlc1tpbmRleF0uc3BsaXQoSk9JTkVSU1tvcGVyYXRvcl0pCisgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmluamVjdCh7fSkgZG8gfGFjYywgdnwKKyAgICAgICAgICAgICAgICAgICAga2V5LCB2YWwgPSB2LnNwbGl0KCc9JykKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gIiIgaWYgdmFsLm5pbD8KKyAgICAgICAgICAgICAgICAgICAgYWNjW2tleV0gPSB2YWwKKyAgICAgICAgICAgICAgICAgICAgYWNjCisgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlmICh1bnBhcnNlZF92YWx1ZXNbaW5kZXhdKQorICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSB1bnBhcnNlZF92YWx1ZXNbaW5kZXhdLnNwbGl0KCc9JykKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gIiIgaWYgdmFsdWUubmlsPworICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgaWYgcHJvY2Vzc29yICE9IG5pbCAmJiBwcm9jZXNzb3IucmVzcG9uZF90bz8oOnJlc3RvcmUpCisgICAgICAgICAgICAgIHZhbHVlID0gcHJvY2Vzc29yLnJlc3RvcmUobmFtZSwgdmFsdWUpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGlmIHByb2Nlc3NvciA9PSBuaWwKKyAgICAgICAgICAgICAgaWYgdmFsdWUuaXNfYT8oSGFzaCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmluamVjdCh7fSl7fGFjYywgKGssIHYpfAorICAgICAgICAgICAgICAgICAgYWNjW0FkZHJlc3NhYmxlOjpVUkkudW5lbmNvZGVfY29tcG9uZW50KGspXSA9CisgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkkudW5lbmNvZGVfY29tcG9uZW50KHYpCisgICAgICAgICAgICAgICAgICBhY2MKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2lmIHZhbHVlLmlzX2E/KEFycmF5KQorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubWFwe3x2fCBBZGRyZXNzYWJsZTo6VVJJLnVuZW5jb2RlX2NvbXBvbmVudCh2KSB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IEFkZHJlc3NhYmxlOjpVUkkudW5lbmNvZGVfY29tcG9uZW50KHZhbHVlKQorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgaWYgIW1hcHBpbmcuaGFzX2tleT8obmFtZSkgfHwgbWFwcGluZ1tuYW1lXS5uaWw/CisgICAgICAgICAgICAgICMgRG9lc24ndCBleGlzdCwgc2V0IHRvIHZhbHVlIChldmVuIGlmIHZhbHVlIGlzIG5pbCkKKyAgICAgICAgICAgICAgbWFwcGluZ1tuYW1lXSA9IHZhbHVlCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICByZXR1cm4gQWRkcmVzc2FibGU6OlRlbXBsYXRlOjpNYXRjaERhdGEubmV3KHVyaSwgc2VsZiwgbWFwcGluZykKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG5pbAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIworICAgICMgRXhwYW5kcyBhIFVSSSB0ZW1wbGF0ZSBpbnRvIGFub3RoZXIgVVJJIHRlbXBsYXRlLgorICAgICMKKyAgICAjIEBwYXJhbSBbSGFzaF0gbWFwcGluZyBUaGUgbWFwcGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwYXR0ZXJuLgorICAgICMgQHBhcmFtIFsjdmFsaWRhdGUsICN0cmFuc2Zvcm1dIHByb2Nlc3NvcgorICAgICMgICBBbiBvcHRpb25hbCBwcm9jZXNzb3Igb2JqZWN0IG1heSBiZSBzdXBwbGllZC4KKyAgICAjIEBwYXJhbSBbQm9vbGVhbl0gbm9ybWFsaXplX3ZhbHVlcworICAgICMgICBPcHRpb25hbCBmbGFnIHRvIGVuYWJsZS9kaXNhYmxlIHVuaWNvZGUgbm9ybWFsaXphdGlvbi4gRGVmYXVsdDogdHJ1ZQorICAgICMKKyAgICAjIFRoZSBvYmplY3Qgc2hvdWxkIHJlc3BvbmQgdG8gZWl0aGVyIHRoZSA8dHQ+dmFsaWRhdGU8L3R0PiBvcgorICAgICMgPHR0PnRyYW5zZm9ybTwvdHQ+IG1lc3NhZ2VzIG9yIGJvdGguIEJvdGggdGhlIDx0dD52YWxpZGF0ZTwvdHQ+IGFuZAorICAgICMgPHR0PnRyYW5zZm9ybTwvdHQ+IG1ldGhvZHMgc2hvdWxkIHRha2UgdHdvIHBhcmFtZXRlcnM6IDx0dD5uYW1lPC90dD4gYW5kCisgICAgIyA8dHQ+dmFsdWU8L3R0Pi4gVGhlIDx0dD52YWxpZGF0ZTwvdHQ+IG1ldGhvZCBzaG91bGQgcmV0dXJuIDx0dD50cnVlPC90dD4KKyAgICAjIG9yIDx0dD5mYWxzZTwvdHQ+OyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaXMgdmFsaWQsCisgICAgIyA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UuIEFuIDx0dD5JbnZhbGlkVGVtcGxhdGVWYWx1ZUVycm9yPC90dD4KKyAgICAjIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgdmFsdWUgaXMgaW52YWxpZC4gVGhlIDx0dD50cmFuc2Zvcm08L3R0PgorICAgICMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIHZhcmlhYmxlIHZhbHVlIGFzIGEgPHR0PlN0cmluZzwvdHQ+LgorICAgICMgSWYgYSA8dHQ+dHJhbnNmb3JtPC90dD4gbWV0aG9kIGlzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIG5vdCBiZSBwZXJjZW50CisgICAgIyBlbmNvZGVkIGF1dG9tYXRpY2FsbHkuIFVuaWNvZGUgbm9ybWFsaXphdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBib3RoCisgICAgIyBiZWZvcmUgYW5kIGFmdGVyIHNlbmRpbmcgdGhlIHZhbHVlIHRvIHRoZSB0cmFuc2Zvcm0gbWV0aG9kLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpUZW1wbGF0ZV0gVGhlIHBhcnRpYWxseSBleHBhbmRlZCBVUkkgdGVtcGxhdGUuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAjICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3tvbmV9L3t0d299LyIKKyAgICAjICAgKS5wYXJ0aWFsX2V4cGFuZCh7Im9uZSIgPT4gIjEifSkucGF0dGVybgorICAgICMgICAjPT4gImh0dHA6Ly9leGFtcGxlLmNvbS8xL3t0d299LyIKKyAgICAjCisgICAgIyAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoCisgICAgIyAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS97P29uZSx0d299LyIKKyAgICAjICAgKS5wYXJ0aWFsX2V4cGFuZCh7Im9uZSIgPT4gIjEifSkucGF0dGVybgorICAgICMgICAjPT4gImh0dHA6Ly9leGFtcGxlLmNvbS8/b25lPTF7JnR3b30vIgorICAgICMKKyAgICAjICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAjICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3s/b25lLHR3byx0aHJlZX0vIgorICAgICMgICApLnBhcnRpYWxfZXhwYW5kKHsib25lIiA9PiAiMSIsICJ0aHJlZSIgPT4gM30pLnBhdHRlcm4KKyAgICAjICAgIz0+ICJodHRwOi8vZXhhbXBsZS5jb20vP29uZT0xeyZ0d299JnRocmVlPTMiCisgICAgZGVmIHBhcnRpYWxfZXhwYW5kKG1hcHBpbmcsIHByb2Nlc3Nvcj1uaWwsIG5vcm1hbGl6ZV92YWx1ZXM9dHJ1ZSkKKyAgICAgIHJlc3VsdCA9IHNlbGYucGF0dGVybi5kdXAKKyAgICAgIG1hcHBpbmcgPSBub3JtYWxpemVfa2V5cyhtYXBwaW5nKQorICAgICAgcmVzdWx0LmdzdWIhKCBFWFBSRVNTSU9OICkgZG8gfGNhcHR1cmV8CisgICAgICAgIHRyYW5zZm9ybV9wYXJ0aWFsX2NhcHR1cmUobWFwcGluZywgY2FwdHVyZSwgcHJvY2Vzc29yLCBub3JtYWxpemVfdmFsdWVzKQorICAgICAgZW5kCisgICAgICByZXR1cm4gQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldyhyZXN1bHQpCisgICAgZW5kCisKKyAgICAjIworICAgICMgRXhwYW5kcyBhIFVSSSB0ZW1wbGF0ZSBpbnRvIGEgZnVsbCBVUkkuCisgICAgIworICAgICMgQHBhcmFtIFtIYXNoXSBtYXBwaW5nIFRoZSBtYXBwaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHBhdHRlcm4uCisgICAgIyBAcGFyYW0gWyN2YWxpZGF0ZSwgI3RyYW5zZm9ybV0gcHJvY2Vzc29yCisgICAgIyAgIEFuIG9wdGlvbmFsIHByb2Nlc3NvciBvYmplY3QgbWF5IGJlIHN1cHBsaWVkLgorICAgICMgQHBhcmFtIFtCb29sZWFuXSBub3JtYWxpemVfdmFsdWVzCisgICAgIyAgIE9wdGlvbmFsIGZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgdW5pY29kZSBub3JtYWxpemF0aW9uLiBEZWZhdWx0OiB0cnVlCisgICAgIworICAgICMgVGhlIG9iamVjdCBzaG91bGQgcmVzcG9uZCB0byBlaXRoZXIgdGhlIDx0dD52YWxpZGF0ZTwvdHQ+IG9yCisgICAgIyA8dHQ+dHJhbnNmb3JtPC90dD4gbWVzc2FnZXMgb3IgYm90aC4gQm90aCB0aGUgPHR0PnZhbGlkYXRlPC90dD4gYW5kCisgICAgIyA8dHQ+dHJhbnNmb3JtPC90dD4gbWV0aG9kcyBzaG91bGQgdGFrZSB0d28gcGFyYW1ldGVyczogPHR0Pm5hbWU8L3R0PiBhbmQKKyAgICAjIDx0dD52YWx1ZTwvdHQ+LiBUaGUgPHR0PnZhbGlkYXRlPC90dD4gbWV0aG9kIHNob3VsZCByZXR1cm4gPHR0PnRydWU8L3R0PgorICAgICMgb3IgPHR0PmZhbHNlPC90dD47IDx0dD50cnVlPC90dD4gaWYgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpcyB2YWxpZCwKKyAgICAjIDx0dD5mYWxzZTwvdHQ+IG90aGVyd2lzZS4gQW4gPHR0PkludmFsaWRUZW1wbGF0ZVZhbHVlRXJyb3I8L3R0PgorICAgICMgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGlmIHRoZSB2YWx1ZSBpcyBpbnZhbGlkLiBUaGUgPHR0PnRyYW5zZm9ybTwvdHQ+CisgICAgIyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgdHJhbnNmb3JtZWQgdmFyaWFibGUgdmFsdWUgYXMgYSA8dHQ+U3RyaW5nPC90dD4uCisgICAgIyBJZiBhIDx0dD50cmFuc2Zvcm08L3R0PiBtZXRob2QgaXMgdXNlZCwgdGhlIHZhbHVlIHdpbGwgbm90IGJlIHBlcmNlbnQKKyAgICAjIGVuY29kZWQgYXV0b21hdGljYWxseS4gVW5pY29kZSBub3JtYWxpemF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGJvdGgKKyAgICAjIGJlZm9yZSBhbmQgYWZ0ZXIgc2VuZGluZyB0aGUgdmFsdWUgdG8gdGhlIHRyYW5zZm9ybSBtZXRob2QuCisgICAgIworICAgICMgQHJldHVybiBbQWRkcmVzc2FibGU6OlVSSV0gVGhlIGV4cGFuZGVkIFVSSSB0ZW1wbGF0ZS4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBjbGFzcyBFeGFtcGxlUHJvY2Vzc29yCisgICAgIyAgICAgZGVmIHNlbGYudmFsaWRhdGUobmFtZSwgdmFsdWUpCisgICAgIyAgICAgICByZXR1cm4gISEodmFsdWUgPX4gL15bXHcgXSskLykgaWYgbmFtZSA9PSAicXVlcnkiCisgICAgIyAgICAgICByZXR1cm4gdHJ1ZQorICAgICMgICAgIGVuZAorICAgICMKKyAgICAjICAgICBkZWYgc2VsZi50cmFuc2Zvcm0obmFtZSwgdmFsdWUpCisgICAgIyAgICAgICByZXR1cm4gdmFsdWUuZ3N1YigvIC8sICIrIikgaWYgbmFtZSA9PSAicXVlcnkiCisgICAgIyAgICAgICByZXR1cm4gdmFsdWUKKyAgICAjICAgICBlbmQKKyAgICAjICAgZW5kCisgICAgIworICAgICMgICBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KAorICAgICMgICAgICJodHRwOi8vZXhhbXBsZS5jb20vc2VhcmNoL3txdWVyeX0vIgorICAgICMgICApLmV4cGFuZCgKKyAgICAjICAgICB7InF1ZXJ5IiA9PiAiYW4gZXhhbXBsZSBzZWFyY2ggcXVlcnkifSwKKyAgICAjICAgICBFeGFtcGxlUHJvY2Vzc29yCisgICAgIyAgICkudG9fc3RyCisgICAgIyAgICM9PiAiaHR0cDovL2V4YW1wbGUuY29tL3NlYXJjaC9hbitleGFtcGxlK3NlYXJjaCtxdWVyeS8iCisgICAgIworICAgICMgICBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KAorICAgICMgICAgICJodHRwOi8vZXhhbXBsZS5jb20vc2VhcmNoL3txdWVyeX0vIgorICAgICMgICApLmV4cGFuZCgKKyAgICAjICAgICB7InF1ZXJ5IiA9PiAiYW4gZXhhbXBsZSBzZWFyY2ggcXVlcnkifQorICAgICMgICApLnRvX3N0cgorICAgICMgICAjPT4gImh0dHA6Ly9leGFtcGxlLmNvbS9zZWFyY2gvYW4lMjBleGFtcGxlJTIwc2VhcmNoJTIwcXVlcnkvIgorICAgICMKKyAgICAjICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAjICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3NlYXJjaC97cXVlcnl9LyIKKyAgICAjICAgKS5leHBhbmQoCisgICAgIyAgICAgeyJxdWVyeSIgPT4gImJvZ3VzISJ9LAorICAgICMgICAgIEV4YW1wbGVQcm9jZXNzb3IKKyAgICAjICAgKS50b19zdHIKKyAgICAjICAgIz0+IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZTo6SW52YWxpZFRlbXBsYXRlVmFsdWVFcnJvcgorICAgIGRlZiBleHBhbmQobWFwcGluZywgcHJvY2Vzc29yPW5pbCwgbm9ybWFsaXplX3ZhbHVlcz10cnVlKQorICAgICAgcmVzdWx0ID0gc2VsZi5wYXR0ZXJuLmR1cAorICAgICAgbWFwcGluZyA9IG5vcm1hbGl6ZV9rZXlzKG1hcHBpbmcpCisgICAgICByZXN1bHQuZ3N1YiEoIEVYUFJFU1NJT04gKSBkbyB8Y2FwdHVyZXwKKyAgICAgICAgdHJhbnNmb3JtX2NhcHR1cmUobWFwcGluZywgY2FwdHVyZSwgcHJvY2Vzc29yLCBub3JtYWxpemVfdmFsdWVzKQorICAgICAgZW5kCisgICAgICByZXR1cm4gQWRkcmVzc2FibGU6OlVSSS5wYXJzZShyZXN1bHQpCisgICAgZW5kCisKKyAgICAjIworICAgICMgUmV0dXJucyBhbiBBcnJheSBvZiB2YXJpYWJsZXMgdXNlZCB3aXRoaW4gdGhlIHRlbXBsYXRlIHBhdHRlcm4uCisgICAgIyBUaGUgdmFyaWFibGVzIGFyZSBsaXN0ZWQgaW4gdGhlIEFycmF5IGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciB3aXRoaW4KKyAgICAjIHRoZSBwYXR0ZXJuLiAgTXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgYSB2YXJpYWJsZSB3aXRoaW4gYSBwYXR0ZXJuIGFyZQorICAgICMgbm90IHJlcHJlc2VudGVkIGluIHRoaXMgQXJyYXkuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXldIFRoZSB2YXJpYWJsZXMgcHJlc2VudCBpbiB0aGUgdGVtcGxhdGUncyBwYXR0ZXJuLgorICAgIGRlZiB2YXJpYWJsZXMKKyAgICAgIEB2YXJpYWJsZXMgfHw9IG9yZGVyZWRfdmFyaWFibGVfZGVmYXVsdHMubWFwIHsgfHZhciwgdmFsfCB2YXIgfS51bmlxCisgICAgZW5kCisgICAgYWxpYXNfbWV0aG9kIDprZXlzLCA6dmFyaWFibGVzCisgICAgYWxpYXNfbWV0aG9kIDpuYW1lcywgOnZhcmlhYmxlcworCisgICAgIyMKKyAgICAjIFJldHVybnMgYSBtYXBwaW5nIG9mIHZhcmlhYmxlcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcyBzcGVjaWZpZWQKKyAgICAjIGluIHRoZSB0ZW1wbGF0ZS4gVmFyaWFibGVzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIG5vdCByZXR1cm5lZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtIYXNoXSBNYXBwaW5nIG9mIHRlbXBsYXRlIHZhcmlhYmxlcyB0byB0aGVpciBkZWZhdWx0cworICAgIGRlZiB2YXJpYWJsZV9kZWZhdWx0cworICAgICAgQHZhcmlhYmxlX2RlZmF1bHRzIHx8PQorICAgICAgICBIYXNoWypvcmRlcmVkX3ZhcmlhYmxlX2RlZmF1bHRzLnJlamVjdCB7IHxrLCB2fCB2Lm5pbD8gfS5mbGF0dGVuXQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIENvZXJjZXMgYSB0ZW1wbGF0ZSBpbnRvIGEgYFJlZ2V4cGAgb2JqZWN0LiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aWxsCisgICAgIyBiZWhhdmUgdmVyeSBzaW1pbGFybHkgdG8gdGhlIGFjdHVhbCB0ZW1wbGF0ZSwgYW5kIHNob3VsZCBtYXRjaCB0aGUgc2FtZQorICAgICMgVVJJIHZhbHVlcywgYnV0IGl0IGNhbm5vdCBmdWxseSBoYW5kbGUsIGZvciBleGFtcGxlLCB2YWx1ZXMgdGhhdCB3b3VsZAorICAgICMgZXh0cmFjdCB0byBhbiBgQXJyYXlgLgorICAgICMKKyAgICAjIEByZXR1cm4gW1JlZ2V4cF0gQSByZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG1hdGNoIHRoZSB0ZW1wbGF0ZS4KKyAgICBkZWYgdG9fcmVnZXhwCisgICAgICBfLCBzb3VyY2UgPSBwYXJzZV90ZW1wbGF0ZV9wYXR0ZXJuKHBhdHRlcm4pCisgICAgICBSZWdleHAubmV3KHNvdXJjZSkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBSZXR1cm5zIHRoZSBzb3VyY2Ugb2YgdGhlIGNvZXJjZWQgYFJlZ2V4cGAuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgc291cmNlIG9mIHRoZSBgUmVnZXhwYCBnaXZlbiBieSB7I3RvX3JlZ2V4cH0uCisgICAgIworICAgICMgQGFwaSBwcml2YXRlCisgICAgZGVmIHNvdXJjZQorICAgICAgc2VsZi50b19yZWdleHAuc291cmNlCisgICAgZW5kCisKKyAgICAjIworICAgICMgUmV0dXJucyB0aGUgbmFtZWQgY2FwdHVyZXMgb2YgdGhlIGNvZXJjZWQgYFJlZ2V4cGAuCisgICAgIworICAgICMgQHJldHVybiBbSGFzaF0gVGhlIG5hbWVkIGNhcHR1cmVzIG9mIHRoZSBgUmVnZXhwYCBnaXZlbiBieSB7I3RvX3JlZ2V4cH0uCisgICAgIworICAgICMgQGFwaSBwcml2YXRlCisgICAgZGVmIG5hbWVkX2NhcHR1cmVzCisgICAgICBzZWxmLnRvX3JlZ2V4cC5uYW1lZF9jYXB0dXJlcworICAgIGVuZAorCisgICAgIyMKKyAgICAjIEdlbmVyYXRlcyBhIHJvdXRlIHJlc3VsdCBmb3IgYSBnaXZlbiBzZXQgb2YgcGFyYW1ldGVycy4KKyAgICAjIFNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcmFjay1tb3VudC4KKyAgICAjCisgICAgIyBAcGFyYW0gcGFyYW1zIFtIYXNoXSBUaGUgc2V0IG9mIHBhcmFtZXRlcnMgdXNlZCB0byBleHBhbmQgdGhlIHRlbXBsYXRlLgorICAgICMgQHBhcmFtIHJlY2FsbCBbSGFzaF0gRGVmYXVsdCBwYXJhbWV0ZXJzIHVzZWQgdG8gZXhwYW5kIHRoZSB0ZW1wbGF0ZS4KKyAgICAjIEBwYXJhbSBvcHRpb25zIFtIYXNoXSBFaXRoZXIgYSBgOnByb2Nlc3NvcmAgb3IgYSBgOnBhcmFtZXRlcml6ZWAgYmxvY2suCisgICAgIworICAgICMgQGFwaSBwcml2YXRlCisgICAgZGVmIGdlbmVyYXRlKHBhcmFtcz17fSwgcmVjYWxsPXt9LCBvcHRpb25zPXt9KQorICAgICAgbWVyZ2VkID0gcmVjYWxsLm1lcmdlKHBhcmFtcykKKyAgICAgIGlmIG9wdGlvbnNbOnByb2Nlc3Nvcl0KKyAgICAgICAgcHJvY2Vzc29yID0gb3B0aW9uc1s6cHJvY2Vzc29yXQorICAgICAgZWxzaWYgb3B0aW9uc1s6cGFyYW1ldGVyaXplXQorICAgICAgICAjIFRPRE86IFRoaXMgaXMgc2VuZGluZyBtZSBpbnRvIGZpdHMgdHJ5aW5nIHRvIHNob2UtaG9ybiB0aGlzIGludG8KKyAgICAgICAgIyB0aGUgZXhpc3RpbmcgQVBJLiBJIHRoaW5rIEkndmUgZ290IHRoaXMgYmFja3dhcmRzIGFuZCBwcm9jZXNzb3JzCisgICAgICAgICMgc2hvdWxkIGJlIGEgc2V0IG9mIDQgb3B0aW9uYWwgYmxvY2tzIG5hbWVkIDp2YWxpZGF0ZSwgOnRyYW5zZm9ybSwKKyAgICAgICAgIyA6bWF0Y2gsIGFuZCA6cmVzdG9yZS4gSGF2aW5nIHRvIHVzZSBhIHNpbmdsZXRvbiBoZXJlIGlzIGEgaHVnZQorICAgICAgICAjIGNvZGUgc21lbGwuCisgICAgICAgIHByb2Nlc3NvciA9IE9iamVjdC5uZXcKKyAgICAgICAgY2xhc3MgPDxwcm9jZXNzb3IKKyAgICAgICAgICBhdHRyX2FjY2Vzc29yIDpibG9jaworICAgICAgICAgIGRlZiB0cmFuc2Zvcm0obmFtZSwgdmFsdWUpCisgICAgICAgICAgICBibG9jay5jYWxsKG5hbWUsIHZhbHVlKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgcHJvY2Vzc29yLmJsb2NrID0gb3B0aW9uc1s6cGFyYW1ldGVyaXplXQorICAgICAgZWxzZQorICAgICAgICBwcm9jZXNzb3IgPSBuaWwKKyAgICAgIGVuZAorICAgICAgcmVzdWx0ID0gc2VsZi5leHBhbmQobWVyZ2VkLCBwcm9jZXNzb3IpCisgICAgICByZXN1bHQudG9fcyBpZiByZXN1bHQKKyAgICBlbmQKKworICBwcml2YXRlCisgICAgZGVmIG9yZGVyZWRfdmFyaWFibGVfZGVmYXVsdHMKKyAgICAgIEBvcmRlcmVkX3ZhcmlhYmxlX2RlZmF1bHRzIHx8PSBiZWdpbgorICAgICAgICBleHBhbnNpb25zLCBfID0gcGFyc2VfdGVtcGxhdGVfcGF0dGVybihwYXR0ZXJuKQorICAgICAgICBleHBhbnNpb25zLm1hcCBkbyB8Y2FwdHVyZXwKKyAgICAgICAgICBfLCBfLCB2YXJsaXN0ID0gKmNhcHR1cmUubWF0Y2goRVhQUkVTU0lPTikKKyAgICAgICAgICB2YXJsaXN0LnNwbGl0KCcsJykubWFwIGRvIHx2YXJzcGVjfAorICAgICAgICAgICAgdmFyc3BlY1tWQVJTUEVDLCAxXQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQuZmxhdHRlbgorICAgICAgZW5kCisgICAgZW5kCisKKworICAgICMjCisgICAgIyBMb29wcyB0aHJvdWdoIGVhY2ggY2FwdHVyZSBhbmQgZXhwYW5kcyBhbnkgdmFsdWVzIGF2YWlsYWJsZSBpbiBtYXBwaW5nCisgICAgIworICAgICMgQHBhcmFtIFtIYXNoXSBtYXBwaW5nCisgICAgIyAgIFNldCBvZiBrZXlzIHRvIGV4cGFuZAorICAgICMgQHBhcmFtIFtTdHJpbmddIGNhcHR1cmUKKyAgICAjICAgVGhlIGV4cHJlc3Npb24gdG8gZXhwYW5kCisgICAgIyBAcGFyYW0gWyN2YWxpZGF0ZSwgI3RyYW5zZm9ybV0gcHJvY2Vzc29yCisgICAgIyAgIEFuIG9wdGlvbmFsIHByb2Nlc3NvciBvYmplY3QgbWF5IGJlIHN1cHBsaWVkLgorICAgICMgQHBhcmFtIFtCb29sZWFuXSBub3JtYWxpemVfdmFsdWVzCisgICAgIyAgIE9wdGlvbmFsIGZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgdW5pY29kZSBub3JtYWxpemF0aW9uLiBEZWZhdWx0OiB0cnVlCisgICAgIworICAgICMgVGhlIG9iamVjdCBzaG91bGQgcmVzcG9uZCB0byBlaXRoZXIgdGhlIDx0dD52YWxpZGF0ZTwvdHQ+IG9yCisgICAgIyA8dHQ+dHJhbnNmb3JtPC90dD4gbWVzc2FnZXMgb3IgYm90aC4gQm90aCB0aGUgPHR0PnZhbGlkYXRlPC90dD4gYW5kCisgICAgIyA8dHQ+dHJhbnNmb3JtPC90dD4gbWV0aG9kcyBzaG91bGQgdGFrZSB0d28gcGFyYW1ldGVyczogPHR0Pm5hbWU8L3R0PiBhbmQKKyAgICAjIDx0dD52YWx1ZTwvdHQ+LiBUaGUgPHR0PnZhbGlkYXRlPC90dD4gbWV0aG9kIHNob3VsZCByZXR1cm4gPHR0PnRydWU8L3R0PgorICAgICMgb3IgPHR0PmZhbHNlPC90dD47IDx0dD50cnVlPC90dD4gaWYgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpcyB2YWxpZCwKKyAgICAjIDx0dD5mYWxzZTwvdHQ+IG90aGVyd2lzZS4gQW4gPHR0PkludmFsaWRUZW1wbGF0ZVZhbHVlRXJyb3I8L3R0PiBleGNlcHRpb24KKyAgICAjIHdpbGwgYmUgcmFpc2VkIGlmIHRoZSB2YWx1ZSBpcyBpbnZhbGlkLiBUaGUgPHR0PnRyYW5zZm9ybTwvdHQ+IG1ldGhvZAorICAgICMgc2hvdWxkIHJldHVybiB0aGUgdHJhbnNmb3JtZWQgdmFyaWFibGUgdmFsdWUgYXMgYSA8dHQ+U3RyaW5nPC90dD4uIElmIGEKKyAgICAjIDx0dD50cmFuc2Zvcm08L3R0PiBtZXRob2QgaXMgdXNlZCwgdGhlIHZhbHVlIHdpbGwgbm90IGJlIHBlcmNlbnQgZW5jb2RlZAorICAgICMgYXV0b21hdGljYWxseS4gVW5pY29kZSBub3JtYWxpemF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGJvdGggYmVmb3JlIGFuZAorICAgICMgYWZ0ZXIgc2VuZGluZyB0aGUgdmFsdWUgdG8gdGhlIHRyYW5zZm9ybSBtZXRob2QuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgZXhwYW5kZWQgZXhwcmVzc2lvbgorICAgIGRlZiB0cmFuc2Zvcm1fcGFydGlhbF9jYXB0dXJlKG1hcHBpbmcsIGNhcHR1cmUsIHByb2Nlc3NvciA9IG5pbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfdmFsdWVzID0gdHJ1ZSkKKyAgICAgIF8sIG9wZXJhdG9yLCB2YXJsaXN0ID0gKmNhcHR1cmUubWF0Y2goRVhQUkVTU0lPTikKKworICAgICAgdmFycyA9IHZhcmxpc3Quc3BsaXQoJywnKQorCisgICAgICBpZiAnPycgPT0gb3BlcmF0b3IKKyAgICAgICAgIyBwYXJ0aWFsIGV4cGFuc2lvbiBvZiBmb3JtIHN0eWxlIHF1ZXJ5IHZhcmlhYmxlcyBzb21ldGltZXMgcmVxdWlyZXMgYQorICAgICAgICAjIHNsaWdodCByZW9yZGVyaW5nIG9mIHRoZSB2YXJpYWJsZXMgdG8gcHJvZHVjZSBhIHZhbGlkIHVybC4KKyAgICAgICAgZmlyc3RfdG9fZXhwYW5kID0gdmFycy5maW5kIHsgfHZhcnNwZWN8CisgICAgICAgICAgXywgbmFtZSwgXyA9ICAqdmFyc3BlYy5tYXRjaChWQVJTUEVDKQorICAgICAgICAgIG1hcHBpbmcua2V5PyBuYW1lCisgICAgICAgIH0KKworICAgICAgICB2YXJzID0gW2ZpcnN0X3RvX2V4cGFuZF0gKyB2YXJzLnJlamVjdCB7fHZhcnNwZWN8IHZhcnNwZWMgPT0gZmlyc3RfdG9fZXhwYW5kfSAgaWYgZmlyc3RfdG9fZXhwYW5kCisgICAgICBlbmQKKworICAgICAgdmFycworICAgICAgICAuemlwKG9wZXJhdG9yX3NlcXVlbmNlKG9wZXJhdG9yKS50YWtlKHZhcnMubGVuZ3RoKSkKKyAgICAgICAgLnJlZHVjZSgiIi5kdXApIGRvIHxhY2MsICh2YXJzcGVjLCBvcCl8CisgICAgICAgICAgXywgbmFtZSwgXyA9ICAqdmFyc3BlYy5tYXRjaChWQVJTUEVDKQorCisgICAgICAgICAgYWNjIDw8IGlmIG1hcHBpbmcua2V5PyBuYW1lCisgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2NhcHR1cmUobWFwcGluZywgInsje29wfSN7dmFyc3BlY319IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsIG5vcm1hbGl6ZV92YWx1ZXMpCisgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAieyN7b3B9I3t2YXJzcGVjfX0iCisgICAgICAgICAgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIworICAgICMgQ3JlYXRlcyBhIGxhenkgRW51bWVyYXRvciBvZiB0aGUgb3BlcmF0b3JzIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZXhwYW5kCisgICAgIyB2YXJpYWJsZXMgaW4gYSB2YXJsaXN0IHN0YXJ0aW5nIHdpdGggYG9wZXJhdG9yYC4gRm9yIGV4YW1wbGUsIGFuIG9wZXJhdG9yCisgICAgIyBgIj8iYCByZXN1bHRzIGluIHRoZSBzZXF1ZW5jZSBgIj8iLCImIiwiJiIuLi5gCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmddIG9wZXJhdG9yIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgYSBzZXF1ZW5jZQorICAgICMKKyAgICAjIEByZXR1cm4gW0VudW1lcmF0b3JdIHNlcXVlbmNlIG9mIG9wZXJhdG9ycworICAgIGRlZiBvcGVyYXRvcl9zZXF1ZW5jZShvcGVyYXRvcikKKyAgICAgIHJlc3Rfb3BlcmF0b3IgPSBpZiAiPyIgPT0gb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICImIgorICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICBoZWFkX29wZXJhdG9yID0gb3BlcmF0b3IKKworICAgICAgRW51bWVyYXRvci5uZXcgZG8gfHl8CisgICAgICAgIHkgPDwgaGVhZF9vcGVyYXRvci50b19zCisgICAgICAgIHdoaWxlIHRydWUKKyAgICAgICAgICB5IDw8IHJlc3Rfb3BlcmF0b3IudG9fcworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRyYW5zZm9ybXMgYSBtYXBwZWQgdmFsdWUgc28gdGhhdCB2YWx1ZXMgY2FuIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlCisgICAgIyB0ZW1wbGF0ZS4KKyAgICAjCisgICAgIyBAcGFyYW0gW0hhc2hdIG1hcHBpbmcgVGhlIG1hcHBpbmcgdG8gcmVwbGFjZSBjYXB0dXJlcworICAgICMgQHBhcmFtIFtTdHJpbmddIGNhcHR1cmUKKyAgICAjICAgVGhlIGV4cHJlc3Npb24gdG8gcmVwbGFjZQorICAgICMgQHBhcmFtIFsjdmFsaWRhdGUsICN0cmFuc2Zvcm1dIHByb2Nlc3NvcgorICAgICMgICBBbiBvcHRpb25hbCBwcm9jZXNzb3Igb2JqZWN0IG1heSBiZSBzdXBwbGllZC4KKyAgICAjIEBwYXJhbSBbQm9vbGVhbl0gbm9ybWFsaXplX3ZhbHVlcworICAgICMgICBPcHRpb25hbCBmbGFnIHRvIGVuYWJsZS9kaXNhYmxlIHVuaWNvZGUgbm9ybWFsaXphdGlvbi4gRGVmYXVsdDogdHJ1ZQorICAgICMKKyAgICAjCisgICAgIyBUaGUgb2JqZWN0IHNob3VsZCByZXNwb25kIHRvIGVpdGhlciB0aGUgPHR0PnZhbGlkYXRlPC90dD4gb3IKKyAgICAjIDx0dD50cmFuc2Zvcm08L3R0PiBtZXNzYWdlcyBvciBib3RoLiBCb3RoIHRoZSA8dHQ+dmFsaWRhdGU8L3R0PiBhbmQKKyAgICAjIDx0dD50cmFuc2Zvcm08L3R0PiBtZXRob2RzIHNob3VsZCB0YWtlIHR3byBwYXJhbWV0ZXJzOiA8dHQ+bmFtZTwvdHQ+IGFuZAorICAgICMgPHR0PnZhbHVlPC90dD4uIFRoZSA8dHQ+dmFsaWRhdGU8L3R0PiBtZXRob2Qgc2hvdWxkIHJldHVybiA8dHQ+dHJ1ZTwvdHQ+CisgICAgIyBvciA8dHQ+ZmFsc2U8L3R0PjsgPHR0PnRydWU8L3R0PiBpZiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGlzIHZhbGlkLAorICAgICMgPHR0PmZhbHNlPC90dD4gb3RoZXJ3aXNlLiBBbiA8dHQ+SW52YWxpZFRlbXBsYXRlVmFsdWVFcnJvcjwvdHQ+IGV4Y2VwdGlvbgorICAgICMgd2lsbCBiZSByYWlzZWQgaWYgdGhlIHZhbHVlIGlzIGludmFsaWQuIFRoZSA8dHQ+dHJhbnNmb3JtPC90dD4gbWV0aG9kCisgICAgIyBzaG91bGQgcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCB2YXJpYWJsZSB2YWx1ZSBhcyBhIDx0dD5TdHJpbmc8L3R0Pi4gSWYgYQorICAgICMgPHR0PnRyYW5zZm9ybTwvdHQ+IG1ldGhvZCBpcyB1c2VkLCB0aGUgdmFsdWUgd2lsbCBub3QgYmUgcGVyY2VudCBlbmNvZGVkCisgICAgIyBhdXRvbWF0aWNhbGx5LiBVbmljb2RlIG5vcm1hbGl6YXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgYm90aCBiZWZvcmUgYW5kCisgICAgIyBhZnRlciBzZW5kaW5nIHRoZSB2YWx1ZSB0byB0aGUgdHJhbnNmb3JtIG1ldGhvZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBleHBhbmRlZCBleHByZXNzaW9uCisgICAgZGVmIHRyYW5zZm9ybV9jYXB0dXJlKG1hcHBpbmcsIGNhcHR1cmUsIHByb2Nlc3Nvcj1uaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV92YWx1ZXM9dHJ1ZSkKKyAgICAgIF8sIG9wZXJhdG9yLCB2YXJsaXN0ID0gKmNhcHR1cmUubWF0Y2goRVhQUkVTU0lPTikKKyAgICAgIHJldHVybl92YWx1ZSA9IHZhcmxpc3Quc3BsaXQoJywnKS5pbmplY3QoW10pIGRvIHxhY2MsIHZhcnNwZWN8CisgICAgICAgIF8sIG5hbWUsIG1vZGlmaWVyID0gKnZhcnNwZWMubWF0Y2goVkFSU1BFQykKKyAgICAgICAgdmFsdWUgPSBtYXBwaW5nW25hbWVdCisgICAgICAgIHVubGVzcyB2YWx1ZSA9PSBuaWwgfHwgdmFsdWUgPT0ge30KKyAgICAgICAgICBhbGxvd19yZXNlcnZlZCA9ICV3KCsgIykuaW5jbHVkZT8ob3BlcmF0b3IpCisgICAgICAgICAgIyBDb21tb24gcHJpbWl0aXZlcyB3aGVyZSB0aGUgLnRvX3Mgb3V0cHV0IGlzIHdlbGwtZGVmaW5lZAorICAgICAgICAgIGlmIE51bWVyaWMgPT09IHZhbHVlIHx8IFN5bWJvbCA9PT0gdmFsdWUgfHwKKyAgICAgICAgICAgICAgdmFsdWUgPT0gdHJ1ZSB8fCB2YWx1ZSA9PSBmYWxzZQorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b19zCisgICAgICAgICAgZW5kCisgICAgICAgICAgbGVuZ3RoID0gbW9kaWZpZXIuZ3N1YignOicsICcnKS50b19pIGlmIG1vZGlmaWVyID1+IC9eOlxkKy8KKworICAgICAgICAgIHVubGVzcyAoSGFzaCA9PT0gdmFsdWUpIHx8CisgICAgICAgICAgICB2YWx1ZS5yZXNwb25kX3RvPyg6dG9fYXJ5KSB8fCB2YWx1ZS5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLAorICAgICAgICAgICAgICAiQ2FuJ3QgY29udmVydCAje3ZhbHVlLmNsYXNzfSBpbnRvIFN0cmluZyBvciBBcnJheS4iCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICB2YWx1ZSA9IG5vcm1hbGl6ZV92YWx1ZSh2YWx1ZSkgaWYgbm9ybWFsaXplX3ZhbHVlcworCisgICAgICAgICAgaWYgcHJvY2Vzc29yID09IG5pbCB8fCAhcHJvY2Vzc29yLnJlc3BvbmRfdG8/KDp0cmFuc2Zvcm0pCisgICAgICAgICAgICAjIEhhbmRsZSBwZXJjZW50IGVzY2FwaW5nCisgICAgICAgICAgICBpZiBhbGxvd19yZXNlcnZlZAorICAgICAgICAgICAgICBlbmNvZGVfbWFwID0KKyAgICAgICAgICAgICAgICBBZGRyZXNzYWJsZTo6VVJJOjpDaGFyYWN0ZXJDbGFzc2VzOjpSRVNFUlZFRCArCisgICAgICAgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlbmNvZGVfbWFwID0gQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBpZiB2YWx1ZS5raW5kX29mPyhBcnJheSkKKyAgICAgICAgICAgICAgdHJhbnNmb3JtZWRfdmFsdWUgPSB2YWx1ZS5tYXAgZG8gfHZhbHwKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGgKKyAgICAgICAgICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkkuZW5jb2RlX2NvbXBvbmVudCh2YWxbMC4uLmxlbmd0aF0sIGVuY29kZV9tYXApCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSS5lbmNvZGVfY29tcG9uZW50KHZhbCwgZW5jb2RlX21hcCkKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgIHVubGVzcyBtb2RpZmllciA9PSAiKiIKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZF92YWx1ZSA9IHRyYW5zZm9ybWVkX3ZhbHVlLmpvaW4oJywnKQorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVsc2lmIHZhbHVlLmtpbmRfb2Y/KEhhc2gpCisgICAgICAgICAgICAgIHRyYW5zZm9ybWVkX3ZhbHVlID0gdmFsdWUubWFwIGRvIHxrZXksIHZhbHwKKyAgICAgICAgICAgICAgICBpZiBtb2RpZmllciA9PSAiKiIKKyAgICAgICAgICAgICAgICAgICIjeworICAgICAgICAgICAgICAgICAgICBBZGRyZXNzYWJsZTo6VVJJLmVuY29kZV9jb21wb25lbnQoIGtleSwgZW5jb2RlX21hcCkKKyAgICAgICAgICAgICAgICAgIH09I3sKKyAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSS5lbmNvZGVfY29tcG9uZW50KCB2YWwsIGVuY29kZV9tYXApCisgICAgICAgICAgICAgICAgICB9IgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICIjeworICAgICAgICAgICAgICAgICAgICBBZGRyZXNzYWJsZTo6VVJJLmVuY29kZV9jb21wb25lbnQoIGtleSwgZW5jb2RlX21hcCkKKyAgICAgICAgICAgICAgICAgIH0sI3sKKyAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSS5lbmNvZGVfY29tcG9uZW50KCB2YWwsIGVuY29kZV9tYXApCisgICAgICAgICAgICAgICAgICB9IgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgdW5sZXNzIG1vZGlmaWVyID09ICIqIgorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkX3ZhbHVlID0gdHJhbnNmb3JtZWRfdmFsdWUuam9pbignLCcpCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiBsZW5ndGgKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZF92YWx1ZSA9IEFkZHJlc3NhYmxlOjpVUkkuZW5jb2RlX2NvbXBvbmVudCgKKyAgICAgICAgICAgICAgICAgIHZhbHVlWzAuLi5sZW5ndGhdLCBlbmNvZGVfbWFwKQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRfdmFsdWUgPSBBZGRyZXNzYWJsZTo6VVJJLmVuY29kZV9jb21wb25lbnQoCisgICAgICAgICAgICAgICAgICB2YWx1ZSwgZW5jb2RlX21hcCkKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKworICAgICAgICAgICMgUHJvY2VzcywgaWYgd2UndmUgZ290IGEgcHJvY2Vzc29yCisgICAgICAgICAgaWYgcHJvY2Vzc29yICE9IG5pbAorICAgICAgICAgICAgaWYgcHJvY2Vzc29yLnJlc3BvbmRfdG8/KDp2YWxpZGF0ZSkKKyAgICAgICAgICAgICAgaWYgIXByb2Nlc3Nvci52YWxpZGF0ZShuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBkaXNwbGF5X3ZhbHVlID0gdmFsdWUua2luZF9vZj8oQXJyYXkpID8gdmFsdWUuaW5zcGVjdCA6IHZhbHVlCisgICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFRlbXBsYXRlVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICIje25hbWV9PSN7ZGlzcGxheV92YWx1ZX0gaXMgYW4gaW52YWxpZCB0ZW1wbGF0ZSB2YWx1ZS4iCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBpZiBwcm9jZXNzb3IucmVzcG9uZF90bz8oOnRyYW5zZm9ybSkKKyAgICAgICAgICAgICAgdHJhbnNmb3JtZWRfdmFsdWUgPSBwcm9jZXNzb3IudHJhbnNmb3JtKG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgICBpZiBub3JtYWxpemVfdmFsdWVzCisgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRfdmFsdWUgPSBub3JtYWxpemVfdmFsdWUodHJhbnNmb3JtZWRfdmFsdWUpCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgICAgYWNjIDw8IFtuYW1lLCB0cmFuc2Zvcm1lZF92YWx1ZV0KKyAgICAgICAgZW5kCisgICAgICAgIGFjYworICAgICAgZW5kCisgICAgICByZXR1cm4gIiIgaWYgcmV0dXJuX3ZhbHVlLmVtcHR5PworICAgICAgam9pbl92YWx1ZXMob3BlcmF0b3IsIHJldHVybl92YWx1ZSkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUYWtlcyBhIHNldCBvZiB2YWx1ZXMsIGFuZCBqb2lucyB0aGVtIHRvZ2V0aGVyIGJhc2VkIG9uIHRoZQorICAgICMgb3BlcmF0b3IuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsIE5pbF0gb3BlcmF0b3IgT25lIG9mIHRoZSBvcGVyYXRvcnMgZnJvbSB0aGUgc2V0CisgICAgIyAgICg/LCYsKywjLDssLywuKSwgb3IgbmlsIGlmIHRoZXJlIHdhc24ndCBvbmUuCisgICAgIyBAcGFyYW0gW0FycmF5XSByZXR1cm5fdmFsdWUKKyAgICAjICAgVGhlIHNldCBvZiByZXR1cm4gdmFsdWVzIChhcyBbdmFyaWFibGVfbmFtZSwgdmFsdWVdIHR1cGxlcykgdGhhdCB3aWxsCisgICAgIyAgIGJlIGpvaW5lZCB0b2dldGhlci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSB0cmFuc2Zvcm1lZCBtYXBwZWQgdmFsdWUKKyAgICBkZWYgam9pbl92YWx1ZXMob3BlcmF0b3IsIHJldHVybl92YWx1ZSkKKyAgICAgIGxlYWRlciA9IExFQURFUlMuZmV0Y2gob3BlcmF0b3IsICcnKQorICAgICAgam9pbmVyID0gSk9JTkVSUy5mZXRjaChvcGVyYXRvciwgJywnKQorICAgICAgY2FzZSBvcGVyYXRvcgorICAgICAgd2hlbiAnJicsICc/JworICAgICAgICBsZWFkZXIgKyByZXR1cm5fdmFsdWUubWFwe3xrLHZ8CisgICAgICAgICAgaWYgdi5pc19hPyhBcnJheSkgJiYgdi5maXJzdCA9fiAvPS8KKyAgICAgICAgICAgIHYuam9pbihqb2luZXIpCisgICAgICAgICAgZWxzaWYgdi5pc19hPyhBcnJheSkKKyAgICAgICAgICAgIHYubWFwe3xpbm5lcl92YWx1ZXwgIiN7a309I3tpbm5lcl92YWx1ZX0ifS5qb2luKGpvaW5lcikKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAiI3trfT0je3Z9IgorICAgICAgICAgIGVuZAorICAgICAgICB9LmpvaW4oam9pbmVyKQorICAgICAgd2hlbiAnOycKKyAgICAgICAgcmV0dXJuX3ZhbHVlLm1hcHt8ayx2fAorICAgICAgICAgIGlmIHYuaXNfYT8oQXJyYXkpICYmIHYuZmlyc3QgPX4gLz0vCisgICAgICAgICAgICAnOycgKyB2LmpvaW4oIjsiKQorICAgICAgICAgIGVsc2lmIHYuaXNfYT8oQXJyYXkpCisgICAgICAgICAgICAnOycgKyB2Lm1hcHt8aW5uZXJfdmFsdWV8ICIje2t9PSN7aW5uZXJfdmFsdWV9In0uam9pbigiOyIpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdiAmJiB2ICE9ICcnID8gICI7I3trfT0je3Z9IiA6ICI7I3trfSIKKyAgICAgICAgICBlbmQKKyAgICAgICAgfS5qb2luCisgICAgICBlbHNlCisgICAgICAgIGxlYWRlciArIHJldHVybl92YWx1ZS5tYXB7fGssdnwgdn0uam9pbihqb2luZXIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUYWtlcyBhIHNldCBvZiB2YWx1ZXMsIGFuZCBqb2lucyB0aGVtIHRvZ2V0aGVyIGJhc2VkIG9uIHRoZQorICAgICMgb3BlcmF0b3IuCisgICAgIworICAgICMgQHBhcmFtIFtIYXNoLCBBcnJheSwgU3RyaW5nXSB2YWx1ZQorICAgICMgICBOb3JtYWxpemVzIGtleXMgYW5kIHZhbHVlcyB3aXRoIElETkEjdW5pY29kZV9ub3JtYWxpemVfa2MKKyAgICAjCisgICAgIyBAcmV0dXJuIFtIYXNoLCBBcnJheSwgU3RyaW5nXSBUaGUgbm9ybWFsaXplZCB2YWx1ZXMKKyAgICBkZWYgbm9ybWFsaXplX3ZhbHVlKHZhbHVlKQorICAgICAgdW5sZXNzIHZhbHVlLmlzX2E/KEhhc2gpCisgICAgICAgIHZhbHVlID0gdmFsdWUucmVzcG9uZF90bz8oOnRvX2FyeSkgPyB2YWx1ZS50b19hcnkgOiB2YWx1ZS50b19zdHIKKyAgICAgIGVuZAorCisgICAgICAjIEhhbmRsZSB1bmljb2RlIG5vcm1hbGl6YXRpb24KKyAgICAgIGlmIHZhbHVlLmtpbmRfb2Y/KEFycmF5KQorICAgICAgICB2YWx1ZS5tYXAhIHsgfHZhbHwgQWRkcmVzc2FibGU6OklETkEudW5pY29kZV9ub3JtYWxpemVfa2ModmFsKSB9CisgICAgICBlbHNpZiB2YWx1ZS5raW5kX29mPyhIYXNoKQorICAgICAgICB2YWx1ZSA9IHZhbHVlLmluamVjdCh7fSkgeyB8YWNjLCAoaywgdil8CisgICAgICAgICAgYWNjW0FkZHJlc3NhYmxlOjpJRE5BLnVuaWNvZGVfbm9ybWFsaXplX2tjKGspXSA9CisgICAgICAgICAgICBBZGRyZXNzYWJsZTo6SUROQS51bmljb2RlX25vcm1hbGl6ZV9rYyh2KQorICAgICAgICAgIGFjYworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHZhbHVlID0gQWRkcmVzc2FibGU6OklETkEudW5pY29kZV9ub3JtYWxpemVfa2ModmFsdWUpCisgICAgICBlbmQKKyAgICAgIHZhbHVlCisgICAgZW5kCisKKyAgICAjIworICAgICMgR2VuZXJhdGVzIGEgaGFzaCB3aXRoIHN0cmluZyBrZXlzCisgICAgIworICAgICMgQHBhcmFtIFtIYXNoXSBtYXBwaW5nIEEgbWFwcGluZyBoYXNoIHRvIG5vcm1hbGl6ZQorICAgICMKKyAgICAjIEByZXR1cm4gW0hhc2hdCisgICAgIyAgIEEgaGFzaCB3aXRoIHN0cmluZ2lmaWVkIGtleXMKKyAgICBkZWYgbm9ybWFsaXplX2tleXMobWFwcGluZykKKyAgICAgIHJldHVybiBtYXBwaW5nLmluamVjdCh7fSkgZG8gfGFjY3UsIHBhaXJ8CisgICAgICAgIG5hbWUsIHZhbHVlID0gcGFpcgorICAgICAgICBpZiBTeW1ib2wgPT09IG5hbWUKKyAgICAgICAgICBuYW1lID0gbmFtZS50b19zCisgICAgICAgIGVsc2lmIG5hbWUucmVzcG9uZF90bz8oOnRvX3N0cikKKyAgICAgICAgICBuYW1lID0gbmFtZS50b19zdHIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwKKyAgICAgICAgICAgICJDYW4ndCBjb252ZXJ0ICN7bmFtZS5jbGFzc30gaW50byBTdHJpbmcuIgorICAgICAgICBlbmQKKyAgICAgICAgYWNjdVtuYW1lXSA9IHZhbHVlCisgICAgICAgIGFjY3UKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIEdlbmVyYXRlcyB0aGUgPHR0PlJlZ2V4cDwvdHQ+IHRoYXQgcGFyc2VzIGEgdGVtcGxhdGUgcGF0dGVybi4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZ10gcGF0dGVybiBUaGUgVVJJIHRlbXBsYXRlIHBhdHRlcm4uCisgICAgIyBAcGFyYW0gWyNtYXRjaF0gcHJvY2Vzc29yIFRoZSB0ZW1wbGF0ZSBwcm9jZXNzb3IgdG8gdXNlLgorICAgICMKKyAgICAjIEByZXR1cm4gW1JlZ2V4cF0KKyAgICAjICAgQSByZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggbWF5IGJlIHVzZWQgdG8gcGFyc2UgYSB0ZW1wbGF0ZSBwYXR0ZXJuLgorICAgIGRlZiBwYXJzZV90ZW1wbGF0ZV9wYXR0ZXJuKHBhdHRlcm4sIHByb2Nlc3Nvcj1uaWwpCisgICAgICAjIEVzY2FwZSB0aGUgcGF0dGVybi4gVGhlIHR3byBnc3VicyByZXN0b3JlIHRoZSBlc2NhcGVkIGN1cmx5IGJyYWNlcworICAgICAgIyBiYWNrIHRvIHRoZWlyIG9yaWdpbmFsIGZvcm0uIEJhc2ljYWxseSwgZXNjYXBlIGV2ZXJ5dGhpbmcgdGhhdCBpc24ndAorICAgICAgIyB3aXRoaW4gYW4gZXhwYW5zaW9uLgorICAgICAgZXNjYXBlZF9wYXR0ZXJuID0gUmVnZXhwLmVzY2FwZSgKKyAgICAgICAgcGF0dGVybgorICAgICAgKS5nc3ViKC9cXFx7KC4qPylcXFx9LykgZG8gfGVzY2FwZWR8CisgICAgICAgIGVzY2FwZWQuZ3N1YigvXFwoLikvLCAiXFwxIikKKyAgICAgIGVuZAorCisgICAgICBleHBhbnNpb25zID0gW10KKworICAgICAgIyBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBjYXB0dXJlcyB0aGUgdmFsdWVzIG9mIHRoZQorICAgICAgIyB2YXJpYWJsZXMgaW4gdGhlIFVSSS4KKyAgICAgIHJlZ2V4cF9zdHJpbmcgPSBlc2NhcGVkX3BhdHRlcm4uZ3N1YiggRVhQUkVTU0lPTiApIGRvIHxleHBhbnNpb258CisKKyAgICAgICAgZXhwYW5zaW9ucyA8PCBleHBhbnNpb24KKyAgICAgICAgXywgb3BlcmF0b3IsIHZhcmxpc3QgPSAqZXhwYW5zaW9uLm1hdGNoKEVYUFJFU1NJT04pCisgICAgICAgIGxlYWRlciA9IFJlZ2V4cC5lc2NhcGUoTEVBREVSUy5mZXRjaChvcGVyYXRvciwgJycpKQorICAgICAgICBqb2luZXIgPSBSZWdleHAuZXNjYXBlKEpPSU5FUlMuZmV0Y2gob3BlcmF0b3IsICcsJykpCisgICAgICAgIGNvbWJpbmVkID0gdmFybGlzdC5zcGxpdCgnLCcpLm1hcCBkbyB8dmFyc3BlY3wKKyAgICAgICAgICBfLCBuYW1lLCBtb2RpZmllciA9ICp2YXJzcGVjLm1hdGNoKFZBUlNQRUMpCisKKyAgICAgICAgICByZXN1bHQgPSBwcm9jZXNzb3IgJiYgcHJvY2Vzc29yLnJlc3BvbmRfdG8/KDptYXRjaCkgPyBwcm9jZXNzb3IubWF0Y2gobmFtZSkgOiBuaWwKKyAgICAgICAgICBpZiByZXN1bHQKKyAgICAgICAgICAgICIoPzwje25hbWV9PiN7IHJlc3VsdCB9KSIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBncm91cCA9IGNhc2Ugb3BlcmF0b3IKKyAgICAgICAgICAgIHdoZW4gJysnCisgICAgICAgICAgICAgICIjeyBSRVNFUlZFRCB9Kj8iCisgICAgICAgICAgICB3aGVuICcjJworICAgICAgICAgICAgICAiI3sgUkVTRVJWRUQgfSo/IgorICAgICAgICAgICAgd2hlbiAnLycKKyAgICAgICAgICAgICAgIiN7IFVOUkVTRVJWRUQgfSo/IgorICAgICAgICAgICAgd2hlbiAnLicKKyAgICAgICAgICAgICAgIiN7IFVOUkVTRVJWRUQuZ3N1YignXC4nLCAnJykgfSo/IgorICAgICAgICAgICAgd2hlbiAnOycKKyAgICAgICAgICAgICAgIiN7IFVOUkVTRVJWRUQgfSo9PyN7IFVOUkVTRVJWRUQgfSo/IgorICAgICAgICAgICAgd2hlbiAnPycKKyAgICAgICAgICAgICAgIiN7IFVOUkVTRVJWRUQgfSo9I3sgVU5SRVNFUlZFRCB9Kj8iCisgICAgICAgICAgICB3aGVuICcmJworICAgICAgICAgICAgICAiI3sgVU5SRVNFUlZFRCB9Kj0jeyBVTlJFU0VSVkVEIH0qPyIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIiN7IFVOUkVTRVJWRUQgfSo/IgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBpZiBtb2RpZmllciA9PSAnKicKKyAgICAgICAgICAgICAgIig/PCN7bmFtZX0+I3tncm91cH0oPzoje2pvaW5lcn0/I3tncm91cH0pKik/IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAiKD88I3tuYW1lfT4je2dyb3VwfSk/IgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZC5qb2luKCIje2pvaW5lcn0/IikKKyAgICAgICAgIig/Onwje2xlYWRlcn0je2NvbWJpbmVkfSkiCisgICAgICBlbmQKKworICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMgdGhlIHdob2xlIFVSSS4KKyAgICAgIHJlZ2V4cF9zdHJpbmcgPSAiXiN7cmVnZXhwX3N0cmluZ30kIgorICAgICAgcmV0dXJuIGV4cGFuc2lvbnMsIFJlZ2V4cC5uZXcocmVnZXhwX3N0cmluZykKKyAgICBlbmQKKworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvbGliL2FkZHJlc3NhYmxlL3VyaS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS91cmkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmYTFhNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS91cmkucmIKQEAgLTAsMCArMSwyNDkyIEBACisjIGVuY29kaW5nOnV0Zi04CisjLS0KKyMgQ29weXJpZ2h0IChDKSBCb2IgQW1hbgorIworIyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIysrCisKKworcmVxdWlyZSAiYWRkcmVzc2FibGUvdmVyc2lvbiIKK3JlcXVpcmUgImFkZHJlc3NhYmxlL2lkbmEiCityZXF1aXJlICJwdWJsaWNfc3VmZml4IgorCisjIworIyBBZGRyZXNzYWJsZSBpcyBhIGxpYnJhcnkgZm9yIHByb2Nlc3NpbmcgbGlua3MgYW5kIFVSSXMuCittb2R1bGUgQWRkcmVzc2FibGUKKyAgIyMKKyAgIyBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgVVJJIHBhcnNlciBiYXNlZCBvbgorICAjIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM5ODYudHh0Ij5SRkMgMzk4NjwvYT4sCisgICMgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzk4Ny50eHQiPlJGQyAzOTg3PC9hPi4KKyAgY2xhc3MgVVJJCisgICAgIyMKKyAgICAjIFJhaXNlZCBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIHVyaSBpcyBzdXBwbGllZC4KKyAgICBjbGFzcyBJbnZhbGlkVVJJRXJyb3IgPCBTdGFuZGFyZEVycm9yCisgICAgZW5kCisKKyAgICAjIworICAgICMgQ29udGFpbmVyIGZvciB0aGUgY2hhcmFjdGVyIGNsYXNzZXMgc3BlY2lmaWVkIGluCisgICAgIyA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzOTg2LnR4dCI+UkZDIDM5ODY8L2E+LgorICAgIG1vZHVsZSBDaGFyYWN0ZXJDbGFzc2VzCisgICAgICBBTFBIQSA9ICJhLXpBLVoiCisgICAgICBESUdJVCA9ICIwLTkiCisgICAgICBHRU5fREVMSU1TID0gIlxcOlxcL1xcP1xcI1xcW1xcXVxcQCIKKyAgICAgIFNVQl9ERUxJTVMgPSAiXFwhXFwkXFwmXFwnXFwoXFwpXFwqXFwrXFwsXFw7XFw9IgorICAgICAgUkVTRVJWRUQgPSBHRU5fREVMSU1TICsgU1VCX0RFTElNUworICAgICAgVU5SRVNFUlZFRCA9IEFMUEhBICsgRElHSVQgKyAiXFwtXFwuXFxfXFx+IgorICAgICAgUENIQVIgPSBVTlJFU0VSVkVEICsgU1VCX0RFTElNUyArICJcXDpcXEAiCisgICAgICBTQ0hFTUUgPSBBTFBIQSArIERJR0lUICsgIlxcLVxcK1xcLiIKKyAgICAgIEhPU1QgPSBVTlJFU0VSVkVEICsgU1VCX0RFTElNUyArICJcXFtcXDpcXF0iCisgICAgICBBVVRIT1JJVFkgPSBQQ0hBUgorICAgICAgUEFUSCA9IFBDSEFSICsgIlxcLyIKKyAgICAgIFFVRVJZID0gUENIQVIgKyAiXFwvXFw/IgorICAgICAgRlJBR01FTlQgPSBQQ0hBUiArICJcXC9cXD8iCisgICAgZW5kCisKKyAgICBTTEFTSCA9ICcvJworICAgIEVNUFRZX1NUUiA9ICcnCisKKyAgICBVUklSRUdFWCA9IC9eKChbXjpcLz8jXSspOik/KFwvXC8oW15cLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/JC8KKworICAgIFBPUlRfTUFQUElORyA9IHsKKyAgICAgICJodHRwIiA9PiA4MCwKKyAgICAgICJodHRwcyIgPT4gNDQzLAorICAgICAgImZ0cCIgPT4gMjEsCisgICAgICAidGZ0cCIgPT4gNjksCisgICAgICAic2Z0cCIgPT4gMjIsCisgICAgICAic3NoIiA9PiAyMiwKKyAgICAgICJzdm4rc3NoIiA9PiAyMiwKKyAgICAgICJ0ZWxuZXQiID0+IDIzLAorICAgICAgIm5udHAiID0+IDExOSwKKyAgICAgICJnb3BoZXIiID0+IDcwLAorICAgICAgIndhaXMiID0+IDIxMCwKKyAgICAgICJsZGFwIiA9PiAzODksCisgICAgICAicHJvc3Blcm8iID0+IDE1MjUKKyAgICB9CisKKyAgICAjIworICAgICMgUmV0dXJucyBhIFVSSSBvYmplY3QgYmFzZWQgb24gdGhlIHBhcnNlZCBzdHJpbmcuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsIEFkZHJlc3NhYmxlOjpVUkksICN0b19zdHJdIHVyaQorICAgICMgICBUaGUgVVJJIHN0cmluZyB0byBwYXJzZS4KKyAgICAjICAgTm8gcGFyc2luZyBpcyBwZXJmb3JtZWQgaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGFuCisgICAgIyAgIDxjb2RlPkFkZHJlc3NhYmxlOjpVUkk8L2NvZGU+LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIFRoZSBwYXJzZWQgVVJJLgorICAgIGRlZiBzZWxmLnBhcnNlKHVyaSkKKyAgICAgICMgSWYgd2Ugd2VyZSBnaXZlbiBuaWwsIHJldHVybiBuaWwuCisgICAgICByZXR1cm4gbmlsIHVubGVzcyB1cmkKKyAgICAgICMgSWYgYSBVUkkgb2JqZWN0IGlzIHBhc3NlZCwganVzdCByZXR1cm4gaXRzZWxmLgorICAgICAgcmV0dXJuIHVyaS5kdXAgaWYgdXJpLmtpbmRfb2Y/KHNlbGYpCisKKyAgICAgICMgSWYgYSBVUkkgb2JqZWN0IG9mIHRoZSBSdWJ5IHN0YW5kYXJkIGxpYnJhcnkgdmFyaWV0eSBpcyBwYXNzZWQsCisgICAgICAjIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcsIHRoZW4gcGFyc2UgdGhlIHN0cmluZy4KKyAgICAgICMgV2UgZG8gdGhlIGNoZWNrIHRoaXMgd2F5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBhY2NpZGVudGFsbHkKKyAgICAgICMgY2F1c2UgYSBtaXNzaW5nIGNvbnN0YW50IGV4Y2VwdGlvbiB0byBiZSB0aHJvd24uCisgICAgICBpZiB1cmkuY2xhc3MubmFtZSA9fiAvXlVSSVxiLworICAgICAgICB1cmkgPSB1cmkudG9fcworICAgICAgZW5kCisKKyAgICAgICMgT3RoZXJ3aXNlLCBjb252ZXJ0IHRvIGEgU3RyaW5nCisgICAgICBiZWdpbgorICAgICAgICB1cmkgPSB1cmkudG9fc3RyCisgICAgICByZXNjdWUgVHlwZUVycm9yLCBOb01ldGhvZEVycm9yCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3t1cmkuY2xhc3N9IGludG8gU3RyaW5nLiIKKyAgICAgIGVuZCBpZiBub3QgdXJpLmlzX2E/IFN0cmluZworCisgICAgICAjIFRoaXMgUmVnZXhwIHN1cHBsaWVkIGFzIGFuIGV4YW1wbGUgaW4gUkZDIDM5ODYsIGFuZCBpdCB3b3JrcyBncmVhdC4KKyAgICAgIHNjYW4gPSB1cmkuc2NhbihVUklSRUdFWCkKKyAgICAgIGZyYWdtZW50cyA9IHNjYW5bMF0KKyAgICAgIHNjaGVtZSA9IGZyYWdtZW50c1sxXQorICAgICAgYXV0aG9yaXR5ID0gZnJhZ21lbnRzWzNdCisgICAgICBwYXRoID0gZnJhZ21lbnRzWzRdCisgICAgICBxdWVyeSA9IGZyYWdtZW50c1s2XQorICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudHNbOF0KKyAgICAgIHVzZXIgPSBuaWwKKyAgICAgIHBhc3N3b3JkID0gbmlsCisgICAgICBob3N0ID0gbmlsCisgICAgICBwb3J0ID0gbmlsCisgICAgICBpZiBhdXRob3JpdHkgIT0gbmlsCisgICAgICAgICMgVGhlIFJlZ2V4cCBhYm92ZSBkb2Vzbid0IHNwbGl0IGFwYXJ0IHRoZSBhdXRob3JpdHkuCisgICAgICAgIHVzZXJpbmZvID0gYXV0aG9yaXR5Wy9eKFteXFtcXV0qKUAvLCAxXQorICAgICAgICBpZiB1c2VyaW5mbyAhPSBuaWwKKyAgICAgICAgICB1c2VyID0gdXNlcmluZm8uc3RyaXBbL14oW146XSopOj8vLCAxXQorICAgICAgICAgIHBhc3N3b3JkID0gdXNlcmluZm8uc3RyaXBbLzooLiopJC8sIDFdCisgICAgICAgIGVuZAorICAgICAgICBob3N0ID0gYXV0aG9yaXR5LmdzdWIoCisgICAgICAgICAgL14oW15cW1xdXSopQC8sIEVNUFRZX1NUUgorICAgICAgICApLmdzdWIoCisgICAgICAgICAgLzooW146QFxbXF1dKj8pJC8sIEVNUFRZX1NUUgorICAgICAgICApCisgICAgICAgIHBvcnQgPSBhdXRob3JpdHlbLzooW146QFxbXF1dKj8pJC8sIDFdCisgICAgICBlbmQKKyAgICAgIGlmIHBvcnQgPT0gRU1QVFlfU1RSCisgICAgICAgIHBvcnQgPSBuaWwKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gbmV3KAorICAgICAgICA6c2NoZW1lID0+IHNjaGVtZSwKKyAgICAgICAgOnVzZXIgPT4gdXNlciwKKyAgICAgICAgOnBhc3N3b3JkID0+IHBhc3N3b3JkLAorICAgICAgICA6aG9zdCA9PiBob3N0LAorICAgICAgICA6cG9ydCA9PiBwb3J0LAorICAgICAgICA6cGF0aCA9PiBwYXRoLAorICAgICAgICA6cXVlcnkgPT4gcXVlcnksCisgICAgICAgIDpmcmFnbWVudCA9PiBmcmFnbWVudAorICAgICAgKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIENvbnZlcnRzIGFuIGlucHV0IHRvIGEgVVJJLiBUaGUgaW5wdXQgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkCisgICAgIyBVUkkg4oCUIHRoZSBtZXRob2Qgd2lsbCB1c2UgaGV1cmlzdGljcyB0byBndWVzcyB3aGF0IFVSSSB3YXMgaW50ZW5kZWQuCisgICAgIyBUaGlzIGlzIG5vdCBzdGFuZGFyZHMtY29tcGxpYW50LCBtZXJlbHkgdXNlci1mcmllbmRseS4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgQWRkcmVzc2FibGU6OlVSSSwgI3RvX3N0cl0gdXJpCisgICAgIyAgIFRoZSBVUkkgc3RyaW5nIHRvIHBhcnNlLgorICAgICMgICBObyBwYXJzaW5nIGlzIHBlcmZvcm1lZCBpZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgYW4KKyAgICAjICAgPGNvZGU+QWRkcmVzc2FibGU6OlVSSTwvY29kZT4uCisgICAgIyBAcGFyYW0gW0hhc2hdIGhpbnRzCisgICAgIyAgIEEgPGNvZGU+SGFzaDwvY29kZT4gb2YgaGludHMgdG8gdGhlIGhldXJpc3RpYyBwYXJzZXIuCisgICAgIyAgIERlZmF1bHRzIHRvIDxjb2RlPns6c2NoZW1lID0+ICJodHRwIn08L2NvZGU+LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIFRoZSBwYXJzZWQgVVJJLgorICAgIGRlZiBzZWxmLmhldXJpc3RpY19wYXJzZSh1cmksIGhpbnRzPXt9KQorICAgICAgIyBJZiB3ZSB3ZXJlIGdpdmVuIG5pbCwgcmV0dXJuIG5pbC4KKyAgICAgIHJldHVybiBuaWwgdW5sZXNzIHVyaQorICAgICAgIyBJZiBhIFVSSSBvYmplY3QgaXMgcGFzc2VkLCBqdXN0IHJldHVybiBpdHNlbGYuCisgICAgICByZXR1cm4gdXJpLmR1cCBpZiB1cmkua2luZF9vZj8oc2VsZikKKworICAgICAgIyBJZiBhIFVSSSBvYmplY3Qgb2YgdGhlIFJ1Ynkgc3RhbmRhcmQgbGlicmFyeSB2YXJpZXR5IGlzIHBhc3NlZCwKKyAgICAgICMgY29udmVydCBpdCB0byBhIHN0cmluZywgdGhlbiBwYXJzZSB0aGUgc3RyaW5nLgorICAgICAgIyBXZSBkbyB0aGUgY2hlY2sgdGhpcyB3YXkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFjY2lkZW50YWxseQorICAgICAgIyBjYXVzZSBhIG1pc3NpbmcgY29uc3RhbnQgZXhjZXB0aW9uIHRvIGJlIHRocm93bi4KKyAgICAgIGlmIHVyaS5jbGFzcy5uYW1lID1+IC9eVVJJXGIvCisgICAgICAgIHVyaSA9IHVyaS50b19zCisgICAgICBlbmQKKworICAgICAgaWYgIXVyaS5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7dXJpLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQKKyAgICAgICMgT3RoZXJ3aXNlLCBjb252ZXJ0IHRvIGEgU3RyaW5nCisgICAgICB1cmkgPSB1cmkudG9fc3RyLmR1cC5zdHJpcAorICAgICAgaGludHMgPSB7CisgICAgICAgIDpzY2hlbWUgPT4gImh0dHAiCisgICAgICB9Lm1lcmdlKGhpbnRzKQorICAgICAgY2FzZSB1cmkKKyAgICAgIHdoZW4gL15odHRwOlwvKy8KKyAgICAgICAgdXJpLmdzdWIhKC9eaHR0cDpcLysvLCAiaHR0cDovLyIpCisgICAgICB3aGVuIC9eaHR0cHM6XC8rLworICAgICAgICB1cmkuZ3N1YiEoL15odHRwczpcLysvLCAiaHR0cHM6Ly8iKQorICAgICAgd2hlbiAvXmZlZWQ6XC8raHR0cDpcLysvCisgICAgICAgIHVyaS5nc3ViISgvXmZlZWQ6XC8raHR0cDpcLysvLCAiZmVlZDpodHRwOi8vIikKKyAgICAgIHdoZW4gL15mZWVkOlwvKy8KKyAgICAgICAgdXJpLmdzdWIhKC9eZmVlZDpcLysvLCAiZmVlZDovLyIpCisgICAgICB3aGVuIC9eZmlsZTpcLysvCisgICAgICAgIHVyaS5nc3ViISgvXmZpbGU6XC8rLywgImZpbGU6Ly8vIikKKyAgICAgIHdoZW4gL15cZHsxLDN9XC5cZHsxLDN9XC5cZHsxLDN9XC5cZHsxLDN9LworICAgICAgICB1cmkuZ3N1YiEoL14vLCBoaW50c1s6c2NoZW1lXSArICI6Ly8iKQorICAgICAgZW5kCisgICAgICBtYXRjaCA9IHVyaS5tYXRjaChVUklSRUdFWCkKKyAgICAgIGZyYWdtZW50cyA9IG1hdGNoLmNhcHR1cmVzCisgICAgICBhdXRob3JpdHkgPSBmcmFnbWVudHNbM10KKyAgICAgIGlmIGF1dGhvcml0eSAmJiBhdXRob3JpdHkubGVuZ3RoID4gMAorICAgICAgICBuZXdfYXV0aG9yaXR5ID0gYXV0aG9yaXR5LmdzdWIoL1xcLywgJy8nKS5nc3ViKC8gLywgJyUyMCcpCisgICAgICAgICMgTk9URTogV2Ugd2FudCBvZmZzZXQgNCwgbm90IDMhCisgICAgICAgIG9mZnNldCA9IG1hdGNoLm9mZnNldCg0KQorICAgICAgICB1cmlbb2Zmc2V0WzBdLi4ub2Zmc2V0WzFdXSA9IG5ld19hdXRob3JpdHkKKyAgICAgIGVuZAorICAgICAgcGFyc2VkID0gc2VsZi5wYXJzZSh1cmkpCisgICAgICBpZiBwYXJzZWQuc2NoZW1lID1+IC9eW15cLz8jXC5dK1wuW15cLz8jXSskLworICAgICAgICBwYXJzZWQgPSBzZWxmLnBhcnNlKGhpbnRzWzpzY2hlbWVdICsgIjovLyIgKyB1cmkpCisgICAgICBlbmQKKyAgICAgIGlmIHBhcnNlZC5wYXRoLmluY2x1ZGU/KCIuIikKKyAgICAgICAgbmV3X2hvc3QgPSBwYXJzZWQucGF0aFsvXihbXlwvXStcLlteXC9dKikvLCAxXQorICAgICAgICBpZiBuZXdfaG9zdAorICAgICAgICAgIHBhcnNlZC5kZWZlcl92YWxpZGF0aW9uIGRvCisgICAgICAgICAgICBuZXdfcGF0aCA9IHBhcnNlZC5wYXRoLmdzdWIoCisgICAgICAgICAgICAgIFJlZ2V4cC5uZXcoIl4iICsgUmVnZXhwLmVzY2FwZShuZXdfaG9zdCkpLCBFTVBUWV9TVFIpCisgICAgICAgICAgICBwYXJzZWQuaG9zdCA9IG5ld19ob3N0CisgICAgICAgICAgICBwYXJzZWQucGF0aCA9IG5ld19wYXRoCisgICAgICAgICAgICBwYXJzZWQuc2NoZW1lID0gaGludHNbOnNjaGVtZV0gdW5sZXNzIHBhcnNlZC5zY2hlbWUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIHJldHVybiBwYXJzZWQKKyAgICBlbmQKKworICAgICMjCisgICAgIyBDb252ZXJ0cyBhIHBhdGggdG8gYSBmaWxlIHNjaGVtZSBVUkkuIElmIHRoZSBwYXRoIHN1cHBsaWVkIGlzCisgICAgIyByZWxhdGl2ZSwgaXQgd2lsbCBiZSByZXR1cm5lZCBhcyBhIHJlbGF0aXZlIFVSSS4gSWYgdGhlIHBhdGggc3VwcGxpZWQKKyAgICAjIGlzIGFjdHVhbGx5IGEgbm9uLWZpbGUgVVJJLCBpdCB3aWxsIHBhcnNlIHRoZSBVUkkgYXMgaWYgaXQgaGFkIGJlZW4KKyAgICAjIHBhcnNlZCB3aXRoIDxjb2RlPkFkZHJlc3NhYmxlOjpVUkkucGFyc2U8L2NvZGU+LiBIYW5kbGVzIGFsbCBvZiB0aGUKKyAgICAjIHZhcmlvdXMgTWljcm9zb2Z0LXNwZWNpZmljIGZvcm1hdHMgZm9yIHNwZWNpZnlpbmcgcGF0aHMuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsIEFkZHJlc3NhYmxlOjpVUkksICN0b19zdHJdIHBhdGgKKyAgICAjICAgVHlwaWNhbGx5IGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBwYXRoIHRvIGEgZmlsZSBvciBkaXJlY3RvcnksIGJ1dAorICAgICMgICB3aWxsIHJldHVybiBhIHNlbnNpYmxlIHJldHVybiB2YWx1ZSBpZiBhbiBhYnNvbHV0ZSBVUkkgaXMgc3VwcGxpZWQKKyAgICAjICAgaW5zdGVhZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBZGRyZXNzYWJsZTo6VVJJXQorICAgICMgICBUaGUgcGFyc2VkIGZpbGUgc2NoZW1lIFVSSSBvciB0aGUgb3JpZ2luYWwgVVJJIGlmIHNvbWUgb3RoZXIgVVJJCisgICAgIyAgIHNjaGVtZSB3YXMgcHJvdmlkZWQuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgYmFzZSA9IEFkZHJlc3NhYmxlOjpVUkkuY29udmVydF9wYXRoKCIvYWJzb2x1dGUvcGF0aC8iKQorICAgICMgICB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aCgicmVsYXRpdmUvcGF0aCIpCisgICAgIyAgIChiYXNlICsgdXJpKS50b19zCisgICAgIyAgICM9PiAiZmlsZTovLy9hYnNvbHV0ZS9wYXRoL3JlbGF0aXZlL3BhdGgiCisgICAgIworICAgICMgICBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aCgKKyAgICAjICAgICAiYzpcXHdpbmRvd3NcXE15IERvY3VtZW50cyAxMDAlMjBcXGZvby50eHQiCisgICAgIyAgICkudG9fcworICAgICMgICAjPT4gImZpbGU6Ly8vYzovd2luZG93cy9NeSUyMERvY3VtZW50cyUyMDEwMCUyMC9mb28udHh0IgorICAgICMKKyAgICAjICAgQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoImh0dHA6Ly9leGFtcGxlLmNvbS8iKS50b19zCisgICAgIyAgICM9PiAiaHR0cDovL2V4YW1wbGUuY29tLyIKKyAgICBkZWYgc2VsZi5jb252ZXJ0X3BhdGgocGF0aCkKKyAgICAgICMgSWYgd2Ugd2VyZSBnaXZlbiBuaWwsIHJldHVybiBuaWwuCisgICAgICByZXR1cm4gbmlsIHVubGVzcyBwYXRoCisgICAgICAjIElmIGEgVVJJIG9iamVjdCBpcyBwYXNzZWQsIGp1c3QgcmV0dXJuIGl0c2VsZi4KKyAgICAgIHJldHVybiBwYXRoIGlmIHBhdGgua2luZF9vZj8oc2VsZikKKyAgICAgIGlmICFwYXRoLnJlc3BvbmRfdG8/KDp0b19zdHIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3twYXRoLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQKKyAgICAgICMgT3RoZXJ3aXNlLCBjb252ZXJ0IHRvIGEgU3RyaW5nCisgICAgICBwYXRoID0gcGF0aC50b19zdHIuc3RyaXAKKworICAgICAgcGF0aC5nc3ViISgvXmZpbGU6XC8/XC8/LywgRU1QVFlfU1RSKSBpZiBwYXRoID1+IC9eZmlsZTpcLz9cLz8vCisgICAgICBwYXRoID0gU0xBU0ggKyBwYXRoIGlmIHBhdGggPX4gL14oW2EtekEtWl0pW1x8Ol0vCisgICAgICB1cmkgPSBzZWxmLnBhcnNlKHBhdGgpCisKKyAgICAgIGlmIHVyaS5zY2hlbWUgPT0gbmlsCisgICAgICAgICMgQWRqdXN0IHdpbmRvd3Mtc3R5bGUgdXJpcworICAgICAgICB1cmkucGF0aC5nc3ViISgvXlwvPyhbYS16QS1aXSlbXHw6XVtcXFwvXS8pIGRvCisgICAgICAgICAgIi8jeyQxLmRvd25jYXNlfTovIgorICAgICAgICBlbmQKKyAgICAgICAgdXJpLnBhdGguZ3N1YiEoL1xcLywgU0xBU0gpCisgICAgICAgIGlmIEZpbGUuZXhpc3Q/KHVyaS5wYXRoKSAmJgorICAgICAgICAgICAgRmlsZS5zdGF0KHVyaS5wYXRoKS5kaXJlY3Rvcnk/CisgICAgICAgICAgdXJpLnBhdGguZ3N1YiEoL1wvJC8sIEVNUFRZX1NUUikKKyAgICAgICAgICB1cmkucGF0aCA9IHVyaS5wYXRoICsgJy8nCisgICAgICAgIGVuZAorCisgICAgICAgICMgSWYgdGhlIHBhdGggaXMgYWJzb2x1dGUsIHNldCB0aGUgc2NoZW1lIGFuZCBob3N0LgorICAgICAgICBpZiB1cmkucGF0aCA9fiAvXlwvLworICAgICAgICAgIHVyaS5zY2hlbWUgPSAiZmlsZSIKKyAgICAgICAgICB1cmkuaG9zdCA9IEVNUFRZX1NUUgorICAgICAgICBlbmQKKyAgICAgICAgdXJpLm5vcm1hbGl6ZSEKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gdXJpCisgICAgZW5kCisKKyAgICAjIworICAgICMgSm9pbnMgc2V2ZXJhbCBVUklzIHRvZ2V0aGVyLgorICAgICMKKyAgICAjIEBwYXJhbSBbU3RyaW5nLCBBZGRyZXNzYWJsZTo6VVJJLCAjdG9fc3RyXSAqdXJpcworICAgICMgICBUaGUgVVJJcyB0byBqb2luLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIFRoZSBqb2luZWQgVVJJLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGJhc2UgPSAiaHR0cDovL2V4YW1wbGUuY29tLyIKKyAgICAjICAgdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgicmVsYXRpdmUvcGF0aCIpCisgICAgIyAgIEFkZHJlc3NhYmxlOjpVUkkuam9pbihiYXNlLCB1cmkpCisgICAgIyAgICM9PiAjPEFkZHJlc3NhYmxlOjpVUkk6MHhjYWIzOTAgVVJJOmh0dHA6Ly9leGFtcGxlLmNvbS9yZWxhdGl2ZS9wYXRoPgorICAgIGRlZiBzZWxmLmpvaW4oKnVyaXMpCisgICAgICB1cmlfb2JqZWN0cyA9IHVyaXMuY29sbGVjdCBkbyB8dXJpfAorICAgICAgICBpZiAhdXJpLnJlc3BvbmRfdG8/KDp0b19zdHIpCisgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiQ2FuJ3QgY29udmVydCAje3VyaS5jbGFzc30gaW50byBTdHJpbmcuIgorICAgICAgICBlbmQKKyAgICAgICAgdXJpLmtpbmRfb2Y/KHNlbGYpID8gdXJpIDogc2VsZi5wYXJzZSh1cmkudG9fc3RyKQorICAgICAgZW5kCisgICAgICByZXN1bHQgPSB1cmlfb2JqZWN0cy5zaGlmdC5kdXAKKyAgICAgIGZvciB1cmkgaW4gdXJpX29iamVjdHMKKyAgICAgICAgcmVzdWx0LmpvaW4hKHVyaSkKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFBlcmNlbnQgZW5jb2RlcyBhIFVSSSBjb21wb25lbnQuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsICN0b19zdHJdIGNvbXBvbmVudCBUaGUgVVJJIGNvbXBvbmVudCB0byBlbmNvZGUuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsIFJlZ2V4cF0gY2hhcmFjdGVyX2NsYXNzCisgICAgIyAgIFRoZSBjaGFyYWN0ZXJzIHdoaWNoIGFyZSBub3QgcGVyY2VudCBlbmNvZGVkLiBJZiBhIDxjb2RlPlN0cmluZzwvY29kZT4KKyAgICAjICAgaXMgcGFzc2VkLCB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBtdXN0IGJlIGZvcm1hdHRlZCBhcyBhIHJlZ3VsYXIKKyAgICAjICAgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgY2xhc3MuIChEbyBub3QgaW5jbHVkZSB0aGUgc3Vycm91bmRpbmcgc3F1YXJlCisgICAgIyAgIGJyYWNrZXRzLikgIEZvciBleGFtcGxlLCA8Y29kZT4iYi16Qi1aMC05IjwvY29kZT4gd291bGQgY2F1c2UKKyAgICAjICAgZXZlcnl0aGluZyBidXQgdGhlIGxldHRlcnMgJ2InIHRocm91Z2ggJ3onIGFuZCB0aGUgbnVtYmVycyAnMCcgdGhyb3VnaAorICAgICMgICc5JyB0byBiZSBwZXJjZW50IGVuY29kZWQuIElmIGEgPGNvZGU+UmVnZXhwPC9jb2RlPiBpcyBwYXNzZWQsIHRoZQorICAgICMgICB2YWx1ZSA8Y29kZT4vW15iLXpCLVowLTldLzwvY29kZT4gd291bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3QuIEEgc2V0IG9mCisgICAgIyAgIHVzZWZ1bCA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisgICAgIyAgIDxjb2RlPkFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM8L2NvZGU+IG1vZHVsZS4gVGhlIGRlZmF1bHQKKyAgICAjICAgdmFsdWUgaXMgdGhlIHJlc2VydmVkIHBsdXMgdW5yZXNlcnZlZCBjaGFyYWN0ZXIgY2xhc3NlcyBzcGVjaWZpZWQgaW4KKyAgICAjICAgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzk4Ni50eHQiPlJGQyAzOTg2PC9hPi4KKyAgICAjCisgICAgIyBAcGFyYW0gW1JlZ2V4cF0gdXBjYXNlX2VuY29kZWQKKyAgICAjICAgQSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IG1heSBhbHJlYWR5IGJlIHBlcmNlbnQgZW5jb2RlZCwgYW5kIHdob3NlCisgICAgIyAgIGVuY29kaW5ncyBzaG91bGQgYmUgdXBjYXNlZC4gVGhpcyBhbGxvd3Mgbm9ybWFsaXphdGlvbiBvZiBwZXJjZW50CisgICAgIyAgIGVuY29kaW5ncyBmb3IgY2hhcmFjdGVycyBub3QgaW5jbHVkZWQgaW4gdGhlCisgICAgIyAgIDxjb2RlPmNoYXJhY3Rlcl9jbGFzczwvY29kZT4uCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgZW5jb2RlZCBjb21wb25lbnQuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgQWRkcmVzc2FibGU6OlVSSS5lbmNvZGVfY29tcG9uZW50KCJzaW1wbGUvZXhhbXBsZSIsICJiLXpCLVowLTkiKQorICAgICMgICA9PiAic2ltcGxlJTJGZXglNjFtcGxlIgorICAgICMgICBBZGRyZXNzYWJsZTo6VVJJLmVuY29kZV9jb21wb25lbnQoInNpbXBsZS9leGFtcGxlIiwgL1teYi16Qi1aMC05XS8pCisgICAgIyAgID0+ICJzaW1wbGUlMkZleCU2MW1wbGUiCisgICAgIyAgIEFkZHJlc3NhYmxlOjpVUkkuZW5jb2RlX2NvbXBvbmVudCgKKyAgICAjICAgICAic2ltcGxlL2V4YW1wbGUiLCBBZGRyZXNzYWJsZTo6VVJJOjpDaGFyYWN0ZXJDbGFzc2VzOjpVTlJFU0VSVkVECisgICAgIyAgICkKKyAgICAjICAgPT4gInNpbXBsZSUyRmV4YW1wbGUiCisgICAgZGVmIHNlbGYuZW5jb2RlX2NvbXBvbmVudChjb21wb25lbnQsIGNoYXJhY3Rlcl9jbGFzcz0KKyAgICAgICAgQ2hhcmFjdGVyQ2xhc3Nlczo6UkVTRVJWRUQgKyBDaGFyYWN0ZXJDbGFzc2VzOjpVTlJFU0VSVkVELAorICAgICAgICB1cGNhc2VfZW5jb2RlZD0nJykKKyAgICAgIHJldHVybiBuaWwgaWYgY29tcG9uZW50Lm5pbD8KKworICAgICAgYmVnaW4KKyAgICAgICAgaWYgY29tcG9uZW50LmtpbmRfb2Y/KFN5bWJvbCkgfHwKKyAgICAgICAgICAgIGNvbXBvbmVudC5raW5kX29mPyhOdW1lcmljKSB8fAorICAgICAgICAgICAgY29tcG9uZW50LmtpbmRfb2Y/KFRydWVDbGFzcykgfHwKKyAgICAgICAgICAgIGNvbXBvbmVudC5raW5kX29mPyhGYWxzZUNsYXNzKQorICAgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudC50b19zCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQudG9fc3RyCisgICAgICAgIGVuZAorICAgICAgcmVzY3VlIFR5cGVFcnJvciwgTm9NZXRob2RFcnJvcgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7Y29tcG9uZW50LmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQgaWYgIWNvbXBvbmVudC5pc19hPyBTdHJpbmcKKworICAgICAgaWYgIVtTdHJpbmcsIFJlZ2V4cF0uaW5jbHVkZT8oY2hhcmFjdGVyX2NsYXNzLmNsYXNzKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsCisgICAgICAgICAgIkV4cGVjdGVkIFN0cmluZyBvciBSZWdleHAsIGdvdCAje2NoYXJhY3Rlcl9jbGFzcy5pbnNwZWN0fSIKKyAgICAgIGVuZAorICAgICAgaWYgY2hhcmFjdGVyX2NsYXNzLmtpbmRfb2Y/KFN0cmluZykKKyAgICAgICAgY2hhcmFjdGVyX2NsYXNzID0gL1teI3tjaGFyYWN0ZXJfY2xhc3N9XS8KKyAgICAgIGVuZAorICAgICAgIyBXZSBjYW4ndCBwZXJmb3JtIHJlZ2V4cHMgb24gaW52YWxpZCBVVEYgc2VxdWVuY2VzLCBidXQKKyAgICAgICMgaGVyZSB3ZSBuZWVkIHRvLCBzbyBzd2l0Y2ggdG8gQVNDSUkuCisgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuZHVwCisgICAgICBjb21wb25lbnQuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkFTQ0lJXzhCSVQpCisgICAgICAjIEF2b2lkaW5nIGdzdWIhIGJlY2F1c2UgdGhlcmUgYXJlIGVkZ2UgY2FzZXMgd2l0aCBmcm96ZW4gc3RyaW5ncworICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LmdzdWIoY2hhcmFjdGVyX2NsYXNzKSBkbyB8c2VxdWVuY2V8CisgICAgICAgIChzZXF1ZW5jZS51bnBhY2soJ0MqJykubWFwIHsgfGN8ICIlIiArICgiJTAyeCIgJSBjKS51cGNhc2UgfSkuam9pbgorICAgICAgZW5kCisgICAgICBpZiB1cGNhc2VfZW5jb2RlZC5sZW5ndGggPiAwCisgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudC5nc3ViKC8lKCN7dXBjYXNlX2VuY29kZWQuY2hhcnMubWFwIGRvIHxjaGFyfAorICAgICAgICAgIGNoYXIudW5wYWNrKCdDKicpLm1hcCB7IHxjfCAnJTAyeCcgJSBjIH0uam9pbgorICAgICAgICBlbmQuam9pbignfCcpfSkvaSkgeyB8c3wgcy51cGNhc2UgfQorICAgICAgZW5kCisgICAgICByZXR1cm4gY29tcG9uZW50CisgICAgZW5kCisKKyAgICBjbGFzcyA8PCBzZWxmCisgICAgICBhbGlhc19tZXRob2QgOmVuY29kZV9jb21wb25lbnQsIDplbmNvZGVfY29tcG9uZW50CisgICAgZW5kCisKKyAgICAjIworICAgICMgVW5lbmNvZGVzIGFueSBwZXJjZW50IGVuY29kZWQgY2hhcmFjdGVycyB3aXRoaW4gYSBVUkkgY29tcG9uZW50LgorICAgICMgVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgZm9yIHVuZW5jb2RpbmcgZWl0aGVyIGNvbXBvbmVudHMgb3IgZnVsbCBVUklzLAorICAgICMgaG93ZXZlciwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSA8Y29kZT51bmVuY29kZV9jb21wb25lbnQ8L2NvZGU+CisgICAgIyBhbGlhcyB3aGVuIHVuZW5jb2RpbmcgY29tcG9uZW50cy4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgQWRkcmVzc2FibGU6OlVSSSwgI3RvX3N0cl0gdXJpCisgICAgIyAgIFRoZSBVUkkgb3IgY29tcG9uZW50IHRvIHVuZW5jb2RlLgorICAgICMKKyAgICAjIEBwYXJhbSBbQ2xhc3NdIHJldHVybl90eXBlCisgICAgIyAgIFRoZSB0eXBlIG9mIG9iamVjdCB0byByZXR1cm4uCisgICAgIyAgIFRoaXMgdmFsdWUgbWF5IG9ubHkgYmUgc2V0IHRvIDxjb2RlPlN0cmluZzwvY29kZT4gb3IKKyAgICAjICAgPGNvZGU+QWRkcmVzc2FibGU6OlVSSTwvY29kZT4uIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGludmFsaWQuIERlZmF1bHRzCisgICAgIyAgIHRvIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmddIGxlYXZlX2VuY29kZWQKKyAgICAjICAgQSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0byBsZWF2ZSBlbmNvZGVkLiBJZiBhIHBlcmNlbnQgZW5jb2RlZCBjaGFyYWN0ZXIKKyAgICAjICAgaW4gdGhpcyBsaXN0IGlzIGVuY291bnRlcmVkIHRoZW4gaXQgd2lsbCByZW1haW4gcGVyY2VudCBlbmNvZGVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZywgQWRkcmVzc2FibGU6OlVSSV0KKyAgICAjICAgVGhlIHVuZW5jb2RlZCBjb21wb25lbnQgb3IgVVJJLgorICAgICMgICBUaGUgcmV0dXJuIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgPGNvZGU+cmV0dXJuX3R5cGU8L2NvZGU+CisgICAgIyAgIHBhcmFtZXRlci4KKyAgICBkZWYgc2VsZi51bmVuY29kZSh1cmksIHJldHVybl90eXBlPVN0cmluZywgbGVhdmVfZW5jb2RlZD0nJykKKyAgICAgIHJldHVybiBuaWwgaWYgdXJpLm5pbD8KKworICAgICAgYmVnaW4KKyAgICAgICAgdXJpID0gdXJpLnRvX3N0cgorICAgICAgcmVzY3VlIE5vTWV0aG9kRXJyb3IsIFR5cGVFcnJvcgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7dXJpLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQgaWYgIXVyaS5pc19hPyBTdHJpbmcKKyAgICAgIGlmICFbU3RyaW5nLCA6OkFkZHJlc3NhYmxlOjpVUkldLmluY2x1ZGU/KHJldHVybl90eXBlKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsCisgICAgICAgICAgIkV4cGVjdGVkIENsYXNzIChTdHJpbmcgb3IgQWRkcmVzc2FibGU6OlVSSSksICIgKworICAgICAgICAgICJnb3QgI3tyZXR1cm5fdHlwZS5pbnNwZWN0fSIKKyAgICAgIGVuZAorICAgICAgdXJpID0gdXJpLmR1cAorICAgICAgIyBTZXJpb3VzbHksIG9ubHkgdXNlIFVURi04LiBJJ20gcmVhbGx5IG5vdCBraWRkaW5nIQorICAgICAgdXJpLmZvcmNlX2VuY29kaW5nKCJ1dGYtOCIpCisgICAgICBsZWF2ZV9lbmNvZGVkID0gbGVhdmVfZW5jb2RlZC5kdXAuZm9yY2VfZW5jb2RpbmcoInV0Zi04IikKKyAgICAgIHJlc3VsdCA9IHVyaS5nc3ViKC8lWzAtOWEtZl17Mn0vaXUpIGRvIHxzZXF1ZW5jZXwKKyAgICAgICAgYyA9IHNlcXVlbmNlWzEuLjNdLnRvX2koMTYpLmNocgorICAgICAgICBjLmZvcmNlX2VuY29kaW5nKCJ1dGYtOCIpCisgICAgICAgIGxlYXZlX2VuY29kZWQuaW5jbHVkZT8oYykgPyBzZXF1ZW5jZSA6IGMKKyAgICAgIGVuZAorICAgICAgcmVzdWx0LmZvcmNlX2VuY29kaW5nKCJ1dGYtOCIpCisgICAgICBpZiByZXR1cm5fdHlwZSA9PSBTdHJpbmcKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgZWxzaWYgcmV0dXJuX3R5cGUgPT0gOjpBZGRyZXNzYWJsZTo6VVJJCisgICAgICAgIHJldHVybiA6OkFkZHJlc3NhYmxlOjpVUkkucGFyc2UocmVzdWx0KQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjbGFzcyA8PCBzZWxmCisgICAgICBhbGlhc19tZXRob2QgOnVuZXNjYXBlLCA6dW5lbmNvZGUKKyAgICAgIGFsaWFzX21ldGhvZCA6dW5lbmNvZGVfY29tcG9uZW50LCA6dW5lbmNvZGUKKyAgICAgIGFsaWFzX21ldGhvZCA6dW5lc2NhcGVfY29tcG9uZW50LCA6dW5lbmNvZGUKKyAgICBlbmQKKworCisgICAgIyMKKyAgICAjIE5vcm1hbGl6ZXMgdGhlIGVuY29kaW5nIG9mIGEgVVJJIGNvbXBvbmVudC4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgI3RvX3N0cl0gY29tcG9uZW50IFRoZSBVUkkgY29tcG9uZW50IHRvIGVuY29kZS4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgUmVnZXhwXSBjaGFyYWN0ZXJfY2xhc3MKKyAgICAjICAgVGhlIGNoYXJhY3RlcnMgd2hpY2ggYXJlIG5vdCBwZXJjZW50IGVuY29kZWQuIElmIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgorICAgICMgICBpcyBwYXNzZWQsIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG11c3QgYmUgZm9ybWF0dGVkIGFzIGEgcmVndWxhcgorICAgICMgICBleHByZXNzaW9uIGNoYXJhY3RlciBjbGFzcy4gKERvIG5vdCBpbmNsdWRlIHRoZSBzdXJyb3VuZGluZyBzcXVhcmUKKyAgICAjICAgYnJhY2tldHMuKSAgRm9yIGV4YW1wbGUsIDxjb2RlPiJiLXpCLVowLTkiPC9jb2RlPiB3b3VsZCBjYXVzZQorICAgICMgICBldmVyeXRoaW5nIGJ1dCB0aGUgbGV0dGVycyAnYicgdGhyb3VnaCAneicgYW5kIHRoZSBudW1iZXJzICcwJworICAgICMgICB0aHJvdWdoICc5JyB0byBiZSBwZXJjZW50IGVuY29kZWQuIElmIGEgPGNvZGU+UmVnZXhwPC9jb2RlPiBpcyBwYXNzZWQsCisgICAgIyAgIHRoZSB2YWx1ZSA8Y29kZT4vW15iLXpCLVowLTldLzwvY29kZT4gd291bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3QuIEEKKyAgICAjICAgc2V0IG9mIHVzZWZ1bCA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisgICAgIyAgIDxjb2RlPkFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM8L2NvZGU+IG1vZHVsZS4gVGhlIGRlZmF1bHQKKyAgICAjICAgdmFsdWUgaXMgdGhlIHJlc2VydmVkIHBsdXMgdW5yZXNlcnZlZCBjaGFyYWN0ZXIgY2xhc3NlcyBzcGVjaWZpZWQgaW4KKyAgICAjICAgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzk4Ni50eHQiPlJGQyAzOTg2PC9hPi4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZ10gbGVhdmVfZW5jb2RlZAorICAgICMgICBXaGVuIDxjb2RlPmNoYXJhY3Rlcl9jbGFzczwvY29kZT4gaXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoZW4KKyAgICAjICAgPGNvZGU+bGVhdmVfZW5jb2RlZDwvY29kZT4gaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHNob3VsZCByZW1haW4KKyAgICAjICAgcGVyY2VudCBlbmNvZGVkIHdoaWxlIG5vcm1hbGl6aW5nIHRoZSBjb21wb25lbnQ7IGlmIHRoZXkgYXBwZWFyIHBlcmNlbnQKKyAgICAjICAgZW5jb2RlZCBpbiB0aGUgb3JpZ2luYWwgY29tcG9uZW50LCB0aGVuIHRoZXkgd2lsbCBiZSB1cGNhc2VkICgiJTJmIgorICAgICMgICBub3JtYWxpemVkIHRvICIlMkYiKSBidXQgb3RoZXJ3aXNlIGxlZnQgYWxvbmUuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgbm9ybWFsaXplZCBjb21wb25lbnQuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVfY29tcG9uZW50KCJzaW1wbCU2NS8lNjV4YW1wbCU2NSIsICJiLXpCLVoiKQorICAgICMgICA9PiAic2ltcGxlJTJGZXglNjFtcGxlIgorICAgICMgICBBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoCisgICAgIyAgICAgInNpbXBsJTY1LyU2NXhhbXBsJTY1IiwgL1teYi16Qi1aXS8KKyAgICAjICAgKQorICAgICMgICA9PiAic2ltcGxlJTJGZXglNjFtcGxlIgorICAgICMgICBBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoCisgICAgIyAgICAgInNpbXBsJTY1LyU2NXhhbXBsJTY1IiwKKyAgICAjICAgICBBZGRyZXNzYWJsZTo6VVJJOjpDaGFyYWN0ZXJDbGFzc2VzOjpVTlJFU0VSVkVECisgICAgIyAgICkKKyAgICAjICAgPT4gInNpbXBsZSUyRmV4YW1wbGUiCisgICAgIyAgIEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplX2NvbXBvbmVudCgKKyAgICAjICAgICAib25lJTIwdHdvJTJmdGhyZWUlMjZmb3VyIiwKKyAgICAjICAgICAiMC05YS16QS1aICYvIiwKKyAgICAjICAgICAiLyIKKyAgICAjICAgKQorICAgICMgICA9PiAib25lIHR3byUyRnRocmVlJmZvdXIiCisgICAgZGVmIHNlbGYubm9ybWFsaXplX2NvbXBvbmVudChjb21wb25lbnQsIGNoYXJhY3Rlcl9jbGFzcz0KKyAgICAgICAgQ2hhcmFjdGVyQ2xhc3Nlczo6UkVTRVJWRUQgKyBDaGFyYWN0ZXJDbGFzc2VzOjpVTlJFU0VSVkVELAorICAgICAgICBsZWF2ZV9lbmNvZGVkPScnKQorICAgICAgcmV0dXJuIG5pbCBpZiBjb21wb25lbnQubmlsPworCisgICAgICBiZWdpbgorICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQudG9fc3RyCisgICAgICByZXNjdWUgTm9NZXRob2RFcnJvciwgVHlwZUVycm9yCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3tjb21wb25lbnQuY2xhc3N9IGludG8gU3RyaW5nLiIKKyAgICAgIGVuZCBpZiAhY29tcG9uZW50LmlzX2E/IFN0cmluZworCisgICAgICBpZiAhW1N0cmluZywgUmVnZXhwXS5pbmNsdWRlPyhjaGFyYWN0ZXJfY2xhc3MuY2xhc3MpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwKKyAgICAgICAgICAiRXhwZWN0ZWQgU3RyaW5nIG9yIFJlZ2V4cCwgZ290ICN7Y2hhcmFjdGVyX2NsYXNzLmluc3BlY3R9IgorICAgICAgZW5kCisgICAgICBpZiBjaGFyYWN0ZXJfY2xhc3Mua2luZF9vZj8oU3RyaW5nKQorICAgICAgICBsZWF2ZV9yZSA9IGlmIGxlYXZlX2VuY29kZWQubGVuZ3RoID4gMAorICAgICAgICAgIGNoYXJhY3Rlcl9jbGFzcyA9ICIje2NoYXJhY3Rlcl9jbGFzc30lIiB1bmxlc3MgY2hhcmFjdGVyX2NsYXNzLmluY2x1ZGU/KCclJykKKworICAgICAgICAgICJ8JSg/ISN7bGVhdmVfZW5jb2RlZC5jaGFycy5tYXAgZG8gfGNoYXJ8CisgICAgICAgICAgICBzZXEgPSBjaGFyLnVucGFjaygnQyonKS5tYXAgeyB8Y3wgJyUwMngnICUgYyB9LmpvaW4KKyAgICAgICAgICAgIFtzZXEudXBjYXNlLCBzZXEuZG93bmNhc2VdCisgICAgICAgICAgZW5kLmZsYXR0ZW4uam9pbignfCcpfSkiCisgICAgICAgIGVuZAorCisgICAgICAgIGNoYXJhY3Rlcl9jbGFzcyA9IC9bXiN7Y2hhcmFjdGVyX2NsYXNzfV0je2xlYXZlX3JlfS8KKyAgICAgIGVuZAorICAgICAgIyBXZSBjYW4ndCBwZXJmb3JtIHJlZ2V4cHMgb24gaW52YWxpZCBVVEYgc2VxdWVuY2VzLCBidXQKKyAgICAgICMgaGVyZSB3ZSBuZWVkIHRvLCBzbyBzd2l0Y2ggdG8gQVNDSUkuCisgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuZHVwCisgICAgICBjb21wb25lbnQuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkFTQ0lJXzhCSVQpCisgICAgICB1bmVuY29kZWQgPSBzZWxmLnVuZW5jb2RlX2NvbXBvbmVudChjb21wb25lbnQsIFN0cmluZywgbGVhdmVfZW5jb2RlZCkKKyAgICAgIGJlZ2luCisgICAgICAgIGVuY29kZWQgPSBzZWxmLmVuY29kZV9jb21wb25lbnQoCisgICAgICAgICAgQWRkcmVzc2FibGU6OklETkEudW5pY29kZV9ub3JtYWxpemVfa2ModW5lbmNvZGVkKSwKKyAgICAgICAgICBjaGFyYWN0ZXJfY2xhc3MsCisgICAgICAgICAgbGVhdmVfZW5jb2RlZAorICAgICAgICApCisgICAgICByZXNjdWUgQXJndW1lbnRFcnJvcgorICAgICAgICBlbmNvZGVkID0gc2VsZi5lbmNvZGVfY29tcG9uZW50KHVuZW5jb2RlZCkKKyAgICAgIGVuZAorICAgICAgZW5jb2RlZC5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpCisgICAgICByZXR1cm4gZW5jb2RlZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFBlcmNlbnQgZW5jb2RlcyBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBVUkkuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsIEFkZHJlc3NhYmxlOjpVUkksICN0b19zdHJdIHVyaQorICAgICMgICBUaGUgVVJJIHRvIGVuY29kZS4KKyAgICAjCisgICAgIyBAcGFyYW0gW0NsYXNzXSByZXR1cm5fdHlwZQorICAgICMgICBUaGUgdHlwZSBvZiBvYmplY3QgdG8gcmV0dXJuLgorICAgICMgICBUaGlzIHZhbHVlIG1heSBvbmx5IGJlIHNldCB0byA8Y29kZT5TdHJpbmc8L2NvZGU+IG9yCisgICAgIyAgIDxjb2RlPkFkZHJlc3NhYmxlOjpVUkk8L2NvZGU+LiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnZhbGlkLiBEZWZhdWx0cworICAgICMgICB0byA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZywgQWRkcmVzc2FibGU6OlVSSV0KKyAgICAjICAgVGhlIGVuY29kZWQgVVJJLgorICAgICMgICBUaGUgcmV0dXJuIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgPGNvZGU+cmV0dXJuX3R5cGU8L2NvZGU+CisgICAgIyAgIHBhcmFtZXRlci4KKyAgICBkZWYgc2VsZi5lbmNvZGUodXJpLCByZXR1cm5fdHlwZT1TdHJpbmcpCisgICAgICByZXR1cm4gbmlsIGlmIHVyaS5uaWw/CisKKyAgICAgIGJlZ2luCisgICAgICAgIHVyaSA9IHVyaS50b19zdHIKKyAgICAgIHJlc2N1ZSBOb01ldGhvZEVycm9yLCBUeXBlRXJyb3IKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiQ2FuJ3QgY29udmVydCAje3VyaS5jbGFzc30gaW50byBTdHJpbmcuIgorICAgICAgZW5kIGlmICF1cmkuaXNfYT8gU3RyaW5nCisKKyAgICAgIGlmICFbU3RyaW5nLCA6OkFkZHJlc3NhYmxlOjpVUkldLmluY2x1ZGU/KHJldHVybl90eXBlKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsCisgICAgICAgICAgIkV4cGVjdGVkIENsYXNzIChTdHJpbmcgb3IgQWRkcmVzc2FibGU6OlVSSSksICIgKworICAgICAgICAgICJnb3QgI3tyZXR1cm5fdHlwZS5pbnNwZWN0fSIKKyAgICAgIGVuZAorICAgICAgdXJpX29iamVjdCA9IHVyaS5raW5kX29mPyhzZWxmKSA/IHVyaSA6IHNlbGYucGFyc2UodXJpKQorICAgICAgZW5jb2RlZF91cmkgPSBBZGRyZXNzYWJsZTo6VVJJLm5ldygKKyAgICAgICAgOnNjaGVtZSA9PiBzZWxmLmVuY29kZV9jb21wb25lbnQodXJpX29iamVjdC5zY2hlbWUsCisgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6U0NIRU1FKSwKKyAgICAgICAgOmF1dGhvcml0eSA9PiBzZWxmLmVuY29kZV9jb21wb25lbnQodXJpX29iamVjdC5hdXRob3JpdHksCisgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6QVVUSE9SSVRZKSwKKyAgICAgICAgOnBhdGggPT4gc2VsZi5lbmNvZGVfY29tcG9uZW50KHVyaV9vYmplY3QucGF0aCwKKyAgICAgICAgICBBZGRyZXNzYWJsZTo6VVJJOjpDaGFyYWN0ZXJDbGFzc2VzOjpQQVRIKSwKKyAgICAgICAgOnF1ZXJ5ID0+IHNlbGYuZW5jb2RlX2NvbXBvbmVudCh1cmlfb2JqZWN0LnF1ZXJ5LAorICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM6OlFVRVJZKSwKKyAgICAgICAgOmZyYWdtZW50ID0+IHNlbGYuZW5jb2RlX2NvbXBvbmVudCh1cmlfb2JqZWN0LmZyYWdtZW50LAorICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM6OkZSQUdNRU5UKQorICAgICAgKQorICAgICAgaWYgcmV0dXJuX3R5cGUgPT0gU3RyaW5nCisgICAgICAgIHJldHVybiBlbmNvZGVkX3VyaS50b19zCisgICAgICBlbHNpZiByZXR1cm5fdHlwZSA9PSA6OkFkZHJlc3NhYmxlOjpVUkkKKyAgICAgICAgcmV0dXJuIGVuY29kZWRfdXJpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgIGFsaWFzX21ldGhvZCA6ZXNjYXBlLCA6ZW5jb2RlCisgICAgZW5kCisKKyAgICAjIworICAgICMgTm9ybWFsaXplcyB0aGUgZW5jb2Rpbmcgb2YgYSBVUkkuIENoYXJhY3RlcnMgd2l0aGluIGEgaG9zdG5hbWUgYXJlCisgICAgIyBub3QgcGVyY2VudCBlbmNvZGVkIHRvIGFsbG93IGZvciBpbnRlcm5hdGlvbmFsaXplZCBkb21haW4gbmFtZXMuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsIEFkZHJlc3NhYmxlOjpVUkksICN0b19zdHJdIHVyaQorICAgICMgICBUaGUgVVJJIHRvIGVuY29kZS4KKyAgICAjCisgICAgIyBAcGFyYW0gW0NsYXNzXSByZXR1cm5fdHlwZQorICAgICMgICBUaGUgdHlwZSBvZiBvYmplY3QgdG8gcmV0dXJuLgorICAgICMgICBUaGlzIHZhbHVlIG1heSBvbmx5IGJlIHNldCB0byA8Y29kZT5TdHJpbmc8L2NvZGU+IG9yCisgICAgIyAgIDxjb2RlPkFkZHJlc3NhYmxlOjpVUkk8L2NvZGU+LiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnZhbGlkLiBEZWZhdWx0cworICAgICMgICB0byA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZywgQWRkcmVzc2FibGU6OlVSSV0KKyAgICAjICAgVGhlIGVuY29kZWQgVVJJLgorICAgICMgICBUaGUgcmV0dXJuIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgPGNvZGU+cmV0dXJuX3R5cGU8L2NvZGU+CisgICAgIyAgIHBhcmFtZXRlci4KKyAgICBkZWYgc2VsZi5ub3JtYWxpemVkX2VuY29kZSh1cmksIHJldHVybl90eXBlPVN0cmluZykKKyAgICAgIGJlZ2luCisgICAgICAgIHVyaSA9IHVyaS50b19zdHIKKyAgICAgIHJlc2N1ZSBOb01ldGhvZEVycm9yLCBUeXBlRXJyb3IKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiQ2FuJ3QgY29udmVydCAje3VyaS5jbGFzc30gaW50byBTdHJpbmcuIgorICAgICAgZW5kIGlmICF1cmkuaXNfYT8gU3RyaW5nCisKKyAgICAgIGlmICFbU3RyaW5nLCA6OkFkZHJlc3NhYmxlOjpVUkldLmluY2x1ZGU/KHJldHVybl90eXBlKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsCisgICAgICAgICAgIkV4cGVjdGVkIENsYXNzIChTdHJpbmcgb3IgQWRkcmVzc2FibGU6OlVSSSksICIgKworICAgICAgICAgICJnb3QgI3tyZXR1cm5fdHlwZS5pbnNwZWN0fSIKKyAgICAgIGVuZAorICAgICAgdXJpX29iamVjdCA9IHVyaS5raW5kX29mPyhzZWxmKSA/IHVyaSA6IHNlbGYucGFyc2UodXJpKQorICAgICAgY29tcG9uZW50cyA9IHsKKyAgICAgICAgOnNjaGVtZSA9PiBzZWxmLnVuZW5jb2RlX2NvbXBvbmVudCh1cmlfb2JqZWN0LnNjaGVtZSksCisgICAgICAgIDp1c2VyID0+IHNlbGYudW5lbmNvZGVfY29tcG9uZW50KHVyaV9vYmplY3QudXNlciksCisgICAgICAgIDpwYXNzd29yZCA9PiBzZWxmLnVuZW5jb2RlX2NvbXBvbmVudCh1cmlfb2JqZWN0LnBhc3N3b3JkKSwKKyAgICAgICAgOmhvc3QgPT4gc2VsZi51bmVuY29kZV9jb21wb25lbnQodXJpX29iamVjdC5ob3N0KSwKKyAgICAgICAgOnBvcnQgPT4gKHVyaV9vYmplY3QucG9ydC5uaWw/ID8gbmlsIDogdXJpX29iamVjdC5wb3J0LnRvX3MpLAorICAgICAgICA6cGF0aCA9PiBzZWxmLnVuZW5jb2RlX2NvbXBvbmVudCh1cmlfb2JqZWN0LnBhdGgpLAorICAgICAgICA6cXVlcnkgPT4gc2VsZi51bmVuY29kZV9jb21wb25lbnQodXJpX29iamVjdC5xdWVyeSksCisgICAgICAgIDpmcmFnbWVudCA9PiBzZWxmLnVuZW5jb2RlX2NvbXBvbmVudCh1cmlfb2JqZWN0LmZyYWdtZW50KQorICAgICAgfQorICAgICAgY29tcG9uZW50cy5lYWNoIGRvIHxrZXksIHZhbHVlfAorICAgICAgICBpZiB2YWx1ZSAhPSBuaWwKKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgY29tcG9uZW50c1trZXldID0KKyAgICAgICAgICAgICAgQWRkcmVzc2FibGU6OklETkEudW5pY29kZV9ub3JtYWxpemVfa2ModmFsdWUudG9fc3RyKQorICAgICAgICAgIHJlc2N1ZSBBcmd1bWVudEVycm9yCisgICAgICAgICAgICAjIExpa2VseSBhIG1hbGZvcm1lZCBVVEYtOCBjaGFyYWN0ZXIsIHNraXAgdW5pY29kZSBub3JtYWxpemF0aW9uCisgICAgICAgICAgICBjb21wb25lbnRzW2tleV0gPSB2YWx1ZS50b19zdHIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGVuY29kZWRfdXJpID0gQWRkcmVzc2FibGU6OlVSSS5uZXcoCisgICAgICAgIDpzY2hlbWUgPT4gc2VsZi5lbmNvZGVfY29tcG9uZW50KGNvbXBvbmVudHNbOnNjaGVtZV0sCisgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6U0NIRU1FKSwKKyAgICAgICAgOnVzZXIgPT4gc2VsZi5lbmNvZGVfY29tcG9uZW50KGNvbXBvbmVudHNbOnVzZXJdLAorICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM6OlVOUkVTRVJWRUQpLAorICAgICAgICA6cGFzc3dvcmQgPT4gc2VsZi5lbmNvZGVfY29tcG9uZW50KGNvbXBvbmVudHNbOnBhc3N3b3JkXSwKKyAgICAgICAgICBBZGRyZXNzYWJsZTo6VVJJOjpDaGFyYWN0ZXJDbGFzc2VzOjpVTlJFU0VSVkVEKSwKKyAgICAgICAgOmhvc3QgPT4gY29tcG9uZW50c1s6aG9zdF0sCisgICAgICAgIDpwb3J0ID0+IGNvbXBvbmVudHNbOnBvcnRdLAorICAgICAgICA6cGF0aCA9PiBzZWxmLmVuY29kZV9jb21wb25lbnQoY29tcG9uZW50c1s6cGF0aF0sCisgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6UEFUSCksCisgICAgICAgIDpxdWVyeSA9PiBzZWxmLmVuY29kZV9jb21wb25lbnQoY29tcG9uZW50c1s6cXVlcnldLAorICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM6OlFVRVJZKSwKKyAgICAgICAgOmZyYWdtZW50ID0+IHNlbGYuZW5jb2RlX2NvbXBvbmVudChjb21wb25lbnRzWzpmcmFnbWVudF0sCisgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6RlJBR01FTlQpCisgICAgICApCisgICAgICBpZiByZXR1cm5fdHlwZSA9PSBTdHJpbmcKKyAgICAgICAgcmV0dXJuIGVuY29kZWRfdXJpLnRvX3MKKyAgICAgIGVsc2lmIHJldHVybl90eXBlID09IDo6QWRkcmVzc2FibGU6OlVSSQorICAgICAgICByZXR1cm4gZW5jb2RlZF91cmkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIEVuY29kZXMgYSBzZXQgb2Yga2V5L3ZhbHVlIHBhaXJzIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yIHRoZQorICAgICMgPGNvZGU+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPiBNSU1FIHR5cGUuCisgICAgIworICAgICMgQHBhcmFtIFsjdG9faGFzaCwgI3RvX2FyeV0gZm9ybV92YWx1ZXMKKyAgICAjICAgVGhlIGZvcm0gdmFsdWVzIHRvIGVuY29kZS4KKyAgICAjCisgICAgIyBAcGFyYW0gW1RydWVDbGFzcywgRmFsc2VDbGFzc10gc29ydAorICAgICMgICBTb3J0IHRoZSBrZXkvdmFsdWUgcGFpcnMgcHJpb3IgdG8gZW5jb2RpbmcuCisgICAgIyAgIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgIyAgIFRoZSBlbmNvZGVkIHZhbHVlLgorICAgIGRlZiBzZWxmLmZvcm1fZW5jb2RlKGZvcm1fdmFsdWVzLCBzb3J0PWZhbHNlKQorICAgICAgaWYgZm9ybV92YWx1ZXMucmVzcG9uZF90bz8oOnRvX2hhc2gpCisgICAgICAgIGZvcm1fdmFsdWVzID0gZm9ybV92YWx1ZXMudG9faGFzaC50b19hCisgICAgICBlbHNpZiBmb3JtX3ZhbHVlcy5yZXNwb25kX3RvPyg6dG9fYXJ5KQorICAgICAgICBmb3JtX3ZhbHVlcyA9IGZvcm1fdmFsdWVzLnRvX2FyeQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7Zm9ybV92YWx1ZXMuY2xhc3N9IGludG8gQXJyYXkuIgorICAgICAgZW5kCisKKyAgICAgIGZvcm1fdmFsdWVzID0gZm9ybV92YWx1ZXMuaW5qZWN0KFtdKSBkbyB8YWNjdSwgKGtleSwgdmFsdWUpfAorICAgICAgICBpZiB2YWx1ZS5raW5kX29mPyhBcnJheSkKKyAgICAgICAgICB2YWx1ZS5lYWNoIGRvIHx2fAorICAgICAgICAgICAgYWNjdSA8PCBba2V5LnRvX3MsIHYudG9fc10KKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFjY3UgPDwgW2tleS50b19zLCB2YWx1ZS50b19zXQorICAgICAgICBlbmQKKyAgICAgICAgYWNjdQorICAgICAgZW5kCisKKyAgICAgIGlmIHNvcnQKKyAgICAgICAgIyBVc2VmdWwgZm9yIE9BdXRoIGFuZCBvcHRpbWl6aW5nIGNhY2hpbmcgc3lzdGVtcworICAgICAgICBmb3JtX3ZhbHVlcyA9IGZvcm1fdmFsdWVzLnNvcnQKKyAgICAgIGVuZAorICAgICAgZXNjYXBlZF9mb3JtX3ZhbHVlcyA9IGZvcm1fdmFsdWVzLm1hcCBkbyB8KGtleSwgdmFsdWUpfAorICAgICAgICAjIExpbmUgYnJlYWtzIGFyZSBDUkxGIHBhaXJzCisgICAgICAgIFsKKyAgICAgICAgICBzZWxmLmVuY29kZV9jb21wb25lbnQoCisgICAgICAgICAgICBrZXkuZ3N1YigvKFxyXG58XG58XHIpLywgIlxyXG4iKSwKKyAgICAgICAgICAgIENoYXJhY3RlckNsYXNzZXM6OlVOUkVTRVJWRUQKKyAgICAgICAgICApLmdzdWIoIiUyMCIsICIrIiksCisgICAgICAgICAgc2VsZi5lbmNvZGVfY29tcG9uZW50KAorICAgICAgICAgICAgdmFsdWUuZ3N1YigvKFxyXG58XG58XHIpLywgIlxyXG4iKSwKKyAgICAgICAgICAgIENoYXJhY3RlckNsYXNzZXM6OlVOUkVTRVJWRUQKKyAgICAgICAgICApLmdzdWIoIiUyMCIsICIrIikKKyAgICAgICAgXQorICAgICAgZW5kCisgICAgICByZXR1cm4gZXNjYXBlZF9mb3JtX3ZhbHVlcy5tYXAgZG8gfChrZXksIHZhbHVlKXwKKyAgICAgICAgIiN7a2V5fT0je3ZhbHVlfSIKKyAgICAgIGVuZC5qb2luKCImIikKKyAgICBlbmQKKworICAgICMjCisgICAgIyBEZWNvZGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGZvciB0aGUKKyAgICAjIDxjb2RlPmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4gTUlNRSB0eXBlLgorICAgICMKKyAgICAjIEBwYXJhbSBbU3RyaW5nLCAjdG9fc3RyXSBlbmNvZGVkX3ZhbHVlCisgICAgIyAgIFRoZSBmb3JtIHZhbHVlcyB0byBkZWNvZGUuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXldCisgICAgIyAgIFRoZSBkZWNvZGVkIHZhbHVlcy4KKyAgICAjICAgVGhpcyBpcyBub3QgYSA8Y29kZT5IYXNoPC9jb2RlPiBiZWNhdXNlIG9mIHRoZSBwb3NzaWJpbGl0eSBmb3IKKyAgICAjICAgZHVwbGljYXRlIGtleXMuCisgICAgZGVmIHNlbGYuZm9ybV91bmVuY29kZShlbmNvZGVkX3ZhbHVlKQorICAgICAgaWYgIWVuY29kZWRfdmFsdWUucmVzcG9uZF90bz8oOnRvX3N0cikKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiQ2FuJ3QgY29udmVydCAje2VuY29kZWRfdmFsdWUuY2xhc3N9IGludG8gU3RyaW5nLiIKKyAgICAgIGVuZAorICAgICAgZW5jb2RlZF92YWx1ZSA9IGVuY29kZWRfdmFsdWUudG9fc3RyCisgICAgICBzcGxpdF92YWx1ZXMgPSBlbmNvZGVkX3ZhbHVlLnNwbGl0KCImIikubWFwIGRvIHxwYWlyfAorICAgICAgICBwYWlyLnNwbGl0KCI9IiwgMikKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIHNwbGl0X3ZhbHVlcy5tYXAgZG8gfChrZXksIHZhbHVlKXwKKyAgICAgICAgWworICAgICAgICAgIGtleSA/IHNlbGYudW5lbmNvZGVfY29tcG9uZW50KAorICAgICAgICAgICAga2V5LmdzdWIoIisiLCAiJTIwIikpLmdzdWIoLyhcclxufFxufFxyKS8sICJcbiIpIDogbmlsLAorICAgICAgICAgIHZhbHVlID8gKHNlbGYudW5lbmNvZGVfY29tcG9uZW50KAorICAgICAgICAgICAgdmFsdWUuZ3N1YigiKyIsICIlMjAiKSkuZ3N1YigvKFxyXG58XG58XHIpLywgIlxuIikpIDogbmlsCisgICAgICAgIF0KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIENyZWF0ZXMgYSBuZXcgdXJpIG9iamVjdCBmcm9tIGNvbXBvbmVudCBwYXJ0cy4KKyAgICAjCisgICAgIyBAb3B0aW9uIFtTdHJpbmcsICN0b19zdHJdIHNjaGVtZSBUaGUgc2NoZW1lIGNvbXBvbmVudC4KKyAgICAjIEBvcHRpb24gW1N0cmluZywgI3RvX3N0cl0gdXNlciBUaGUgdXNlciBjb21wb25lbnQuCisgICAgIyBAb3B0aW9uIFtTdHJpbmcsICN0b19zdHJdIHBhc3N3b3JkIFRoZSBwYXNzd29yZCBjb21wb25lbnQuCisgICAgIyBAb3B0aW9uIFtTdHJpbmcsICN0b19zdHJdIHVzZXJpbmZvCisgICAgIyAgIFRoZSB1c2VyaW5mbyBjb21wb25lbnQuIElmIHRoaXMgaXMgc3VwcGxpZWQsIHRoZSB1c2VyIGFuZCBwYXNzd29yZAorICAgICMgICBjb21wb25lbnRzIG11c3QgYmUgb21pdHRlZC4KKyAgICAjIEBvcHRpb24gW1N0cmluZywgI3RvX3N0cl0gaG9zdCBUaGUgaG9zdCBjb21wb25lbnQuCisgICAgIyBAb3B0aW9uIFtTdHJpbmcsICN0b19zdHJdIHBvcnQgVGhlIHBvcnQgY29tcG9uZW50LgorICAgICMgQG9wdGlvbiBbU3RyaW5nLCAjdG9fc3RyXSBhdXRob3JpdHkKKyAgICAjICAgVGhlIGF1dGhvcml0eSBjb21wb25lbnQuIElmIHRoaXMgaXMgc3VwcGxpZWQsIHRoZSB1c2VyLCBwYXNzd29yZCwKKyAgICAjICAgdXNlcmluZm8sIGhvc3QsIGFuZCBwb3J0IGNvbXBvbmVudHMgbXVzdCBiZSBvbWl0dGVkLgorICAgICMgQG9wdGlvbiBbU3RyaW5nLCAjdG9fc3RyXSBwYXRoIFRoZSBwYXRoIGNvbXBvbmVudC4KKyAgICAjIEBvcHRpb24gW1N0cmluZywgI3RvX3N0cl0gcXVlcnkgVGhlIHF1ZXJ5IGNvbXBvbmVudC4KKyAgICAjIEBvcHRpb24gW1N0cmluZywgI3RvX3N0cl0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IGNvbXBvbmVudC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBZGRyZXNzYWJsZTo6VVJJXSBUaGUgY29uc3RydWN0ZWQgVVJJIG9iamVjdC4KKyAgICBkZWYgaW5pdGlhbGl6ZShvcHRpb25zPXt9KQorICAgICAgaWYgb3B0aW9ucy5oYXNfa2V5Pyg6YXV0aG9yaXR5KQorICAgICAgICBpZiAob3B0aW9ucy5rZXlzICYgWzp1c2VyaW5mbywgOnVzZXIsIDpwYXNzd29yZCwgOmhvc3QsIDpwb3J0XSkuYW55PworICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsCisgICAgICAgICAgICAiQ2Fubm90IHNwZWNpZnkgYm90aCBhbiBhdXRob3JpdHkgYW5kIGFueSBvZiB0aGUgY29tcG9uZW50cyAiICsKKyAgICAgICAgICAgICJ3aXRoaW4gdGhlIGF1dGhvcml0eS4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBpZiBvcHRpb25zLmhhc19rZXk/KDp1c2VyaW5mbykKKyAgICAgICAgaWYgKG9wdGlvbnMua2V5cyAmIFs6dXNlciwgOnBhc3N3b3JkXSkuYW55PworICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsCisgICAgICAgICAgICAiQ2Fubm90IHNwZWNpZnkgYm90aCBhIHVzZXJpbmZvIGFuZCBlaXRoZXIgdGhlIHVzZXIgb3IgcGFzc3dvcmQuIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzZWxmLmRlZmVyX3ZhbGlkYXRpb24gZG8KKyAgICAgICAgIyBCdW5jaCBvZiBjcmF6eSBsb2dpYyByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZSBjb21wb3NpdGUgY29tcG9uZW50cworICAgICAgICAjIGxpa2UgdXNlcmluZm8gYW5kIGF1dGhvcml0eS4KKyAgICAgICAgc2VsZi5zY2hlbWUgPSBvcHRpb25zWzpzY2hlbWVdIGlmIG9wdGlvbnNbOnNjaGVtZV0KKyAgICAgICAgc2VsZi51c2VyID0gb3B0aW9uc1s6dXNlcl0gaWYgb3B0aW9uc1s6dXNlcl0KKyAgICAgICAgc2VsZi5wYXNzd29yZCA9IG9wdGlvbnNbOnBhc3N3b3JkXSBpZiBvcHRpb25zWzpwYXNzd29yZF0KKyAgICAgICAgc2VsZi51c2VyaW5mbyA9IG9wdGlvbnNbOnVzZXJpbmZvXSBpZiBvcHRpb25zWzp1c2VyaW5mb10KKyAgICAgICAgc2VsZi5ob3N0ID0gb3B0aW9uc1s6aG9zdF0gaWYgb3B0aW9uc1s6aG9zdF0KKyAgICAgICAgc2VsZi5wb3J0ID0gb3B0aW9uc1s6cG9ydF0gaWYgb3B0aW9uc1s6cG9ydF0KKyAgICAgICAgc2VsZi5hdXRob3JpdHkgPSBvcHRpb25zWzphdXRob3JpdHldIGlmIG9wdGlvbnNbOmF1dGhvcml0eV0KKyAgICAgICAgc2VsZi5wYXRoID0gb3B0aW9uc1s6cGF0aF0gaWYgb3B0aW9uc1s6cGF0aF0KKyAgICAgICAgc2VsZi5xdWVyeSA9IG9wdGlvbnNbOnF1ZXJ5XSBpZiBvcHRpb25zWzpxdWVyeV0KKyAgICAgICAgc2VsZi5xdWVyeV92YWx1ZXMgPSBvcHRpb25zWzpxdWVyeV92YWx1ZXNdIGlmIG9wdGlvbnNbOnF1ZXJ5X3ZhbHVlc10KKyAgICAgICAgc2VsZi5mcmFnbWVudCA9IG9wdGlvbnNbOmZyYWdtZW50XSBpZiBvcHRpb25zWzpmcmFnbWVudF0KKyAgICAgIGVuZAorICAgICAgc2VsZi50b19zCisgICAgZW5kCisKKyAgICAjIworICAgICMgRnJlZXplIFVSSSwgaW5pdGlhbGl6aW5nIGluc3RhbmNlIHZhcmlhYmxlcy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBZGRyZXNzYWJsZTo6VVJJXSBUaGUgZnJvemVuIFVSSSBvYmplY3QuCisgICAgZGVmIGZyZWV6ZQorICAgICAgc2VsZi5ub3JtYWxpemVkX3NjaGVtZQorICAgICAgc2VsZi5ub3JtYWxpemVkX3VzZXIKKyAgICAgIHNlbGYubm9ybWFsaXplZF9wYXNzd29yZAorICAgICAgc2VsZi5ub3JtYWxpemVkX3VzZXJpbmZvCisgICAgICBzZWxmLm5vcm1hbGl6ZWRfaG9zdAorICAgICAgc2VsZi5ub3JtYWxpemVkX3BvcnQKKyAgICAgIHNlbGYubm9ybWFsaXplZF9hdXRob3JpdHkKKyAgICAgIHNlbGYubm9ybWFsaXplZF9zaXRlCisgICAgICBzZWxmLm5vcm1hbGl6ZWRfcGF0aAorICAgICAgc2VsZi5ub3JtYWxpemVkX3F1ZXJ5CisgICAgICBzZWxmLm5vcm1hbGl6ZWRfZnJhZ21lbnQKKyAgICAgIHNlbGYuaGFzaAorICAgICAgc3VwZXIKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgc2NoZW1lIGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgc2NoZW1lIGNvbXBvbmVudC4KKyAgICBkZWYgc2NoZW1lCisgICAgICByZXR1cm4gZGVmaW5lZD8oQHNjaGVtZSkgPyBAc2NoZW1lIDogbmlsCisgICAgZW5kCisKKyAgICAjIworICAgICMgVGhlIHNjaGVtZSBjb21wb25lbnQgZm9yIHRoaXMgVVJJLCBub3JtYWxpemVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHNjaGVtZSBjb21wb25lbnQsIG5vcm1hbGl6ZWQuCisgICAgZGVmIG5vcm1hbGl6ZWRfc2NoZW1lCisgICAgICByZXR1cm4gbmlsIHVubGVzcyBzZWxmLnNjaGVtZQorICAgICAgQG5vcm1hbGl6ZWRfc2NoZW1lIHx8PSBiZWdpbgorICAgICAgICBpZiBzZWxmLnNjaGVtZSA9fiAvXlxzKnNzaFwrc3ZuXHMqJC9pCisgICAgICAgICAgInN2bitzc2giLmR1cAorICAgICAgICBlbHNlCisgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVfY29tcG9uZW50KAorICAgICAgICAgICAgc2VsZi5zY2hlbWUuc3RyaXAuZG93bmNhc2UsCisgICAgICAgICAgICBBZGRyZXNzYWJsZTo6VVJJOjpDaGFyYWN0ZXJDbGFzc2VzOjpTQ0hFTUUKKyAgICAgICAgICApCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICAjIEFsbCBub3JtYWxpemVkIHZhbHVlcyBzaG91bGQgYmUgVVRGLTgKKyAgICAgIEBub3JtYWxpemVkX3NjaGVtZS5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpIGlmIEBub3JtYWxpemVkX3NjaGVtZQorICAgICAgQG5vcm1hbGl6ZWRfc2NoZW1lCisgICAgZW5kCisKKyAgICAjIworICAgICMgU2V0cyB0aGUgc2NoZW1lIGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsICN0b19zdHJdIG5ld19zY2hlbWUgVGhlIG5ldyBzY2hlbWUgY29tcG9uZW50LgorICAgIGRlZiBzY2hlbWU9KG5ld19zY2hlbWUpCisgICAgICBpZiBuZXdfc2NoZW1lICYmICFuZXdfc2NoZW1lLnJlc3BvbmRfdG8/KDp0b19zdHIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3tuZXdfc2NoZW1lLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbHNpZiBuZXdfc2NoZW1lCisgICAgICAgIG5ld19zY2hlbWUgPSBuZXdfc2NoZW1lLnRvX3N0cgorICAgICAgZW5kCisgICAgICBpZiBuZXdfc2NoZW1lICYmIG5ld19zY2hlbWUgIX4gL1xBW2Etel1bYS16MC05XC5cK1wtXSpcei9pCisgICAgICAgIHJhaXNlIEludmFsaWRVUklFcnJvciwgIkludmFsaWQgc2NoZW1lIGZvcm1hdDogI3tuZXdfc2NoZW1lfSIKKyAgICAgIGVuZAorICAgICAgQHNjaGVtZSA9IG5ld19zY2hlbWUKKyAgICAgIEBzY2hlbWUgPSBuaWwgaWYgQHNjaGVtZS50b19zLnN0cmlwLmVtcHR5PworCisgICAgICAjIFJlc2V0IGRlcGVuZGVudCB2YWx1ZXMKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QG5vcm1hbGl6ZWRfc2NoZW1lKSBpZiBkZWZpbmVkPyhAbm9ybWFsaXplZF9zY2hlbWUpCisgICAgICByZW1vdmVfY29tcG9zaXRlX3ZhbHVlcworCisgICAgICAjIEVuc3VyZSB3ZSBoYXZlbid0IGNyZWF0ZWQgYW4gaW52YWxpZCBVUkkKKyAgICAgIHZhbGlkYXRlKCkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgdXNlciBjb21wb25lbnQgZm9yIHRoaXMgVVJJLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHVzZXIgY29tcG9uZW50LgorICAgIGRlZiB1c2VyCisgICAgICByZXR1cm4gZGVmaW5lZD8oQHVzZXIpID8gQHVzZXIgOiBuaWwKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgdXNlciBjb21wb25lbnQgZm9yIHRoaXMgVVJJLCBub3JtYWxpemVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHVzZXIgY29tcG9uZW50LCBub3JtYWxpemVkLgorICAgIGRlZiBub3JtYWxpemVkX3VzZXIKKyAgICAgIHJldHVybiBuaWwgdW5sZXNzIHNlbGYudXNlcgorICAgICAgcmV0dXJuIEBub3JtYWxpemVkX3VzZXIgaWYgZGVmaW5lZD8oQG5vcm1hbGl6ZWRfdXNlcikKKyAgICAgIEBub3JtYWxpemVkX3VzZXIgfHw9IGJlZ2luCisgICAgICAgIGlmIG5vcm1hbGl6ZWRfc2NoZW1lID1+IC9odHRwcz8vICYmIHNlbGYudXNlci5zdHJpcC5lbXB0eT8gJiYKKyAgICAgICAgICAgICghc2VsZi5wYXNzd29yZCB8fCBzZWxmLnBhc3N3b3JkLnN0cmlwLmVtcHR5PykKKyAgICAgICAgICBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplX2NvbXBvbmVudCgKKyAgICAgICAgICAgIHNlbGYudXNlci5zdHJpcCwKKyAgICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM6OlVOUkVTRVJWRUQKKyAgICAgICAgICApCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICAjIEFsbCBub3JtYWxpemVkIHZhbHVlcyBzaG91bGQgYmUgVVRGLTgKKyAgICAgIEBub3JtYWxpemVkX3VzZXIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KSBpZiBAbm9ybWFsaXplZF91c2VyCisgICAgICBAbm9ybWFsaXplZF91c2VyCisgICAgZW5kCisKKyAgICAjIworICAgICMgU2V0cyB0aGUgdXNlciBjb21wb25lbnQgZm9yIHRoaXMgVVJJLgorICAgICMKKyAgICAjIEBwYXJhbSBbU3RyaW5nLCAjdG9fc3RyXSBuZXdfdXNlciBUaGUgbmV3IHVzZXIgY29tcG9uZW50LgorICAgIGRlZiB1c2VyPShuZXdfdXNlcikKKyAgICAgIGlmIG5ld191c2VyICYmICFuZXdfdXNlci5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7bmV3X3VzZXIuY2xhc3N9IGludG8gU3RyaW5nLiIKKyAgICAgIGVuZAorICAgICAgQHVzZXIgPSBuZXdfdXNlciA/IG5ld191c2VyLnRvX3N0ciA6IG5pbAorCisgICAgICAjIFlvdSBjYW4ndCBoYXZlIGEgbmlsIHVzZXIgd2l0aCBhIG5vbi1uaWwgcGFzc3dvcmQKKyAgICAgIGlmIHBhc3N3b3JkICE9IG5pbAorICAgICAgICBAdXNlciA9IEVNUFRZX1NUUiBpZiBAdXNlci5uaWw/CisgICAgICBlbmQKKworICAgICAgIyBSZXNldCBkZXBlbmRlbnQgdmFsdWVzCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkB1c2VyaW5mbykgaWYgZGVmaW5lZD8oQHVzZXJpbmZvKQorICAgICAgcmVtb3ZlX2luc3RhbmNlX3ZhcmlhYmxlKDpAbm9ybWFsaXplZF91c2VyaW5mbykgaWYgZGVmaW5lZD8oQG5vcm1hbGl6ZWRfdXNlcmluZm8pCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkBhdXRob3JpdHkpIGlmIGRlZmluZWQ/KEBhdXRob3JpdHkpCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkBub3JtYWxpemVkX3VzZXIpIGlmIGRlZmluZWQ/KEBub3JtYWxpemVkX3VzZXIpCisgICAgICByZW1vdmVfY29tcG9zaXRlX3ZhbHVlcworCisgICAgICAjIEVuc3VyZSB3ZSBoYXZlbid0IGNyZWF0ZWQgYW4gaW52YWxpZCBVUkkKKyAgICAgIHZhbGlkYXRlKCkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgcGFzc3dvcmQgY29tcG9uZW50IGZvciB0aGlzIFVSSS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBwYXNzd29yZCBjb21wb25lbnQuCisgICAgZGVmIHBhc3N3b3JkCisgICAgICByZXR1cm4gZGVmaW5lZD8oQHBhc3N3b3JkKSA/IEBwYXNzd29yZCA6IG5pbAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBwYXNzd29yZCBjb21wb25lbnQgZm9yIHRoaXMgVVJJLCBub3JtYWxpemVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHBhc3N3b3JkIGNvbXBvbmVudCwgbm9ybWFsaXplZC4KKyAgICBkZWYgbm9ybWFsaXplZF9wYXNzd29yZAorICAgICAgcmV0dXJuIG5pbCB1bmxlc3Mgc2VsZi5wYXNzd29yZAorICAgICAgcmV0dXJuIEBub3JtYWxpemVkX3Bhc3N3b3JkIGlmIGRlZmluZWQ/KEBub3JtYWxpemVkX3Bhc3N3b3JkKQorICAgICAgQG5vcm1hbGl6ZWRfcGFzc3dvcmQgfHw9IGJlZ2luCisgICAgICAgIGlmIHNlbGYubm9ybWFsaXplZF9zY2hlbWUgPX4gL2h0dHBzPy8gJiYgc2VsZi5wYXNzd29yZC5zdHJpcC5lbXB0eT8gJiYKKyAgICAgICAgICAgICghc2VsZi51c2VyIHx8IHNlbGYudXNlci5zdHJpcC5lbXB0eT8pCisgICAgICAgICAgbmlsCisgICAgICAgIGVsc2UKKyAgICAgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoCisgICAgICAgICAgICBzZWxmLnBhc3N3b3JkLnN0cmlwLAorICAgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRAorICAgICAgICAgICkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgICMgQWxsIG5vcm1hbGl6ZWQgdmFsdWVzIHNob3VsZCBiZSBVVEYtOAorICAgICAgaWYgQG5vcm1hbGl6ZWRfcGFzc3dvcmQKKyAgICAgICAgQG5vcm1hbGl6ZWRfcGFzc3dvcmQuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisgICAgICBAbm9ybWFsaXplZF9wYXNzd29yZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFNldHMgdGhlIHBhc3N3b3JkIGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsICN0b19zdHJdIG5ld19wYXNzd29yZCBUaGUgbmV3IHBhc3N3b3JkIGNvbXBvbmVudC4KKyAgICBkZWYgcGFzc3dvcmQ9KG5ld19wYXNzd29yZCkKKyAgICAgIGlmIG5ld19wYXNzd29yZCAmJiAhbmV3X3Bhc3N3b3JkLnJlc3BvbmRfdG8/KDp0b19zdHIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3tuZXdfcGFzc3dvcmQuY2xhc3N9IGludG8gU3RyaW5nLiIKKyAgICAgIGVuZAorICAgICAgQHBhc3N3b3JkID0gbmV3X3Bhc3N3b3JkID8gbmV3X3Bhc3N3b3JkLnRvX3N0ciA6IG5pbAorCisgICAgICAjIFlvdSBjYW4ndCBoYXZlIGEgbmlsIHVzZXIgd2l0aCBhIG5vbi1uaWwgcGFzc3dvcmQKKyAgICAgIEBwYXNzd29yZCB8fD0gbmlsCisgICAgICBAdXNlciB8fD0gbmlsCisgICAgICBpZiBAcGFzc3dvcmQgIT0gbmlsCisgICAgICAgIEB1c2VyID0gRU1QVFlfU1RSIGlmIEB1c2VyLm5pbD8KKyAgICAgIGVuZAorCisgICAgICAjIFJlc2V0IGRlcGVuZGVudCB2YWx1ZXMKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QHVzZXJpbmZvKSBpZiBkZWZpbmVkPyhAdXNlcmluZm8pCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkBub3JtYWxpemVkX3VzZXJpbmZvKSBpZiBkZWZpbmVkPyhAbm9ybWFsaXplZF91c2VyaW5mbykKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QGF1dGhvcml0eSkgaWYgZGVmaW5lZD8oQGF1dGhvcml0eSkKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QG5vcm1hbGl6ZWRfcGFzc3dvcmQpIGlmIGRlZmluZWQ/KEBub3JtYWxpemVkX3Bhc3N3b3JkKQorICAgICAgcmVtb3ZlX2NvbXBvc2l0ZV92YWx1ZXMKKworICAgICAgIyBFbnN1cmUgd2UgaGF2ZW4ndCBjcmVhdGVkIGFuIGludmFsaWQgVVJJCisgICAgICB2YWxpZGF0ZSgpCisgICAgZW5kCisKKyAgICAjIworICAgICMgVGhlIHVzZXJpbmZvIGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIyBDb21iaW5lcyB0aGUgdXNlciBhbmQgcGFzc3dvcmQgY29tcG9uZW50cy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSB1c2VyaW5mbyBjb21wb25lbnQuCisgICAgZGVmIHVzZXJpbmZvCisgICAgICBjdXJyZW50X3VzZXIgPSBzZWxmLnVzZXIKKyAgICAgIGN1cnJlbnRfcGFzc3dvcmQgPSBzZWxmLnBhc3N3b3JkCisgICAgICAoY3VycmVudF91c2VyIHx8IGN1cnJlbnRfcGFzc3dvcmQpICYmIEB1c2VyaW5mbyB8fD0gYmVnaW4KKyAgICAgICAgaWYgY3VycmVudF91c2VyICYmIGN1cnJlbnRfcGFzc3dvcmQKKyAgICAgICAgICAiI3tjdXJyZW50X3VzZXJ9OiN7Y3VycmVudF9wYXNzd29yZH0iCisgICAgICAgIGVsc2lmIGN1cnJlbnRfdXNlciAmJiAhY3VycmVudF9wYXNzd29yZAorICAgICAgICAgICIje2N1cnJlbnRfdXNlcn0iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIworICAgICMgVGhlIHVzZXJpbmZvIGNvbXBvbmVudCBmb3IgdGhpcyBVUkksIG5vcm1hbGl6ZWQuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgdXNlcmluZm8gY29tcG9uZW50LCBub3JtYWxpemVkLgorICAgIGRlZiBub3JtYWxpemVkX3VzZXJpbmZvCisgICAgICByZXR1cm4gbmlsIHVubGVzcyBzZWxmLnVzZXJpbmZvCisgICAgICByZXR1cm4gQG5vcm1hbGl6ZWRfdXNlcmluZm8gaWYgZGVmaW5lZD8oQG5vcm1hbGl6ZWRfdXNlcmluZm8pCisgICAgICBAbm9ybWFsaXplZF91c2VyaW5mbyB8fD0gYmVnaW4KKyAgICAgICAgY3VycmVudF91c2VyID0gc2VsZi5ub3JtYWxpemVkX3VzZXIKKyAgICAgICAgY3VycmVudF9wYXNzd29yZCA9IHNlbGYubm9ybWFsaXplZF9wYXNzd29yZAorICAgICAgICBpZiAhY3VycmVudF91c2VyICYmICFjdXJyZW50X3Bhc3N3b3JkCisgICAgICAgICAgbmlsCisgICAgICAgIGVsc2lmIGN1cnJlbnRfdXNlciAmJiBjdXJyZW50X3Bhc3N3b3JkCisgICAgICAgICAgIiN7Y3VycmVudF91c2VyfToje2N1cnJlbnRfcGFzc3dvcmR9Ii5kdXAKKyAgICAgICAgZWxzaWYgY3VycmVudF91c2VyICYmICFjdXJyZW50X3Bhc3N3b3JkCisgICAgICAgICAgIiN7Y3VycmVudF91c2VyfSIuZHVwCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICAjIEFsbCBub3JtYWxpemVkIHZhbHVlcyBzaG91bGQgYmUgVVRGLTgKKyAgICAgIGlmIEBub3JtYWxpemVkX3VzZXJpbmZvCisgICAgICAgIEBub3JtYWxpemVkX3VzZXJpbmZvLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgIGVuZAorICAgICAgQG5vcm1hbGl6ZWRfdXNlcmluZm8KKyAgICBlbmQKKworICAgICMjCisgICAgIyBTZXRzIHRoZSB1c2VyaW5mbyBjb21wb25lbnQgZm9yIHRoaXMgVVJJLgorICAgICMKKyAgICAjIEBwYXJhbSBbU3RyaW5nLCAjdG9fc3RyXSBuZXdfdXNlcmluZm8gVGhlIG5ldyB1c2VyaW5mbyBjb21wb25lbnQuCisgICAgZGVmIHVzZXJpbmZvPShuZXdfdXNlcmluZm8pCisgICAgICBpZiBuZXdfdXNlcmluZm8gJiYgIW5ld191c2VyaW5mby5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7bmV3X3VzZXJpbmZvLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQKKyAgICAgIG5ld191c2VyLCBuZXdfcGFzc3dvcmQgPSBpZiBuZXdfdXNlcmluZm8KKyAgICAgICAgWworICAgICAgICAgIG5ld191c2VyaW5mby50b19zdHIuc3RyaXBbL14oLiopOi8sIDFdLAorICAgICAgICAgIG5ld191c2VyaW5mby50b19zdHIuc3RyaXBbLzooLiopJC8sIDFdCisgICAgICAgIF0KKyAgICAgIGVsc2UKKyAgICAgICAgW25pbCwgbmlsXQorICAgICAgZW5kCisKKyAgICAgICMgUGFzc3dvcmQgYXNzaWduZWQgZmlyc3QgdG8gZW5zdXJlIHZhbGlkaXR5IGluIGNhc2Ugb2YgbmlsCisgICAgICBzZWxmLnBhc3N3b3JkID0gbmV3X3Bhc3N3b3JkCisgICAgICBzZWxmLnVzZXIgPSBuZXdfdXNlcgorCisgICAgICAjIFJlc2V0IGRlcGVuZGVudCB2YWx1ZXMKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QGF1dGhvcml0eSkgaWYgZGVmaW5lZD8oQGF1dGhvcml0eSkKKyAgICAgIHJlbW92ZV9jb21wb3NpdGVfdmFsdWVzCisKKyAgICAgICMgRW5zdXJlIHdlIGhhdmVuJ3QgY3JlYXRlZCBhbiBpbnZhbGlkIFVSSQorICAgICAgdmFsaWRhdGUoKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBob3N0IGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgaG9zdCBjb21wb25lbnQuCisgICAgZGVmIGhvc3QKKyAgICAgIHJldHVybiBkZWZpbmVkPyhAaG9zdCkgPyBAaG9zdCA6IG5pbAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBob3N0IGNvbXBvbmVudCBmb3IgdGhpcyBVUkksIG5vcm1hbGl6ZWQuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgaG9zdCBjb21wb25lbnQsIG5vcm1hbGl6ZWQuCisgICAgZGVmIG5vcm1hbGl6ZWRfaG9zdAorICAgICAgcmV0dXJuIG5pbCB1bmxlc3Mgc2VsZi5ob3N0CisgICAgICBAbm9ybWFsaXplZF9ob3N0IHx8PSBiZWdpbgorICAgICAgICBpZiAhc2VsZi5ob3N0LnN0cmlwLmVtcHR5PworICAgICAgICAgIHJlc3VsdCA9IDo6QWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAgICAgICBVUkkudW5lbmNvZGVfY29tcG9uZW50KHNlbGYuaG9zdC5zdHJpcC5kb3duY2FzZSkKKyAgICAgICAgICApCisgICAgICAgICAgaWYgcmVzdWx0ID1+IC9bXlwuXVwuJC8KKyAgICAgICAgICAgICMgU2luZ2xlIHRyYWlsaW5nIGRvdHMgYXJlIHVubmVjZXNzYXJ5LgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzAuLi4tMV0KKyAgICAgICAgICBlbmQKKyAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoCisgICAgICAgICAgICByZXN1bHQsCisgICAgICAgICAgICBDaGFyYWN0ZXJDbGFzc2VzOjpIT1NUKQorICAgICAgICAgIHJlc3VsdAorICAgICAgICBlbHNlCisgICAgICAgICAgRU1QVFlfU1RSLmR1cAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgIyBBbGwgbm9ybWFsaXplZCB2YWx1ZXMgc2hvdWxkIGJlIFVURi04CisgICAgICBAbm9ybWFsaXplZF9ob3N0LmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpVVEZfOCkgaWYgQG5vcm1hbGl6ZWRfaG9zdAorICAgICAgQG5vcm1hbGl6ZWRfaG9zdAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFNldHMgdGhlIGhvc3QgY29tcG9uZW50IGZvciB0aGlzIFVSSS4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgI3RvX3N0cl0gbmV3X2hvc3QgVGhlIG5ldyBob3N0IGNvbXBvbmVudC4KKyAgICBkZWYgaG9zdD0obmV3X2hvc3QpCisgICAgICBpZiBuZXdfaG9zdCAmJiAhbmV3X2hvc3QucmVzcG9uZF90bz8oOnRvX3N0cikKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiQ2FuJ3QgY29udmVydCAje25ld19ob3N0LmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQKKyAgICAgIEBob3N0ID0gbmV3X2hvc3QgPyBuZXdfaG9zdC50b19zdHIgOiBuaWwKKworICAgICAgIyBSZXNldCBkZXBlbmRlbnQgdmFsdWVzCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkBhdXRob3JpdHkpIGlmIGRlZmluZWQ/KEBhdXRob3JpdHkpCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkBub3JtYWxpemVkX2hvc3QpIGlmIGRlZmluZWQ/KEBub3JtYWxpemVkX2hvc3QpCisgICAgICByZW1vdmVfY29tcG9zaXRlX3ZhbHVlcworCisgICAgICAjIEVuc3VyZSB3ZSBoYXZlbid0IGNyZWF0ZWQgYW4gaW52YWxpZCBVUkkKKyAgICAgIHZhbGlkYXRlKCkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGlzIG1ldGhvZCBpcyBzYW1lIGFzIFVSSTo6R2VuZXJpYyNob3N0IGV4Y2VwdAorICAgICMgYnJhY2tldHMgZm9yIElQdjYgKGFuZCAnSVB2RnV0dXJlJykgYWRkcmVzc2VzIGFyZSByZW1vdmVkLgorICAgICMKKyAgICAjIEBzZWUgQWRkcmVzc2FibGU6OlVSSSNob3N0CisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgaG9zdG5hbWUgZm9yIHRoaXMgVVJJLgorICAgIGRlZiBob3N0bmFtZQorICAgICAgdiA9IHNlbGYuaG9zdAorICAgICAgL1xBXFsoLiopXF1cei8gPX4gdiA/ICQxIDogdgorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoaXMgbWV0aG9kIGlzIHNhbWUgYXMgVVJJOjpHZW5lcmljI2hvc3Q9IGV4Y2VwdAorICAgICMgdGhlIGFyZ3VtZW50IGNhbiBiZSBhIGJhcmUgSVB2NiBhZGRyZXNzIChvciAnSVB2RnV0dXJlJykuCisgICAgIworICAgICMgQHNlZSBBZGRyZXNzYWJsZTo6VVJJI2hvc3Q9CisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsICN0b19zdHJdIG5ld19ob3N0bmFtZSBUaGUgbmV3IGhvc3RuYW1lIGZvciB0aGlzIFVSSS4KKyAgICBkZWYgaG9zdG5hbWU9KG5ld19ob3N0bmFtZSkKKyAgICAgIGlmIG5ld19ob3N0bmFtZSAmJgorICAgICAgICAgIChuZXdfaG9zdG5hbWUucmVzcG9uZF90bz8oOmlwdjQ/KSB8fCBuZXdfaG9zdG5hbWUucmVzcG9uZF90bz8oOmlwdjY/KSkKKyAgICAgICAgbmV3X2hvc3RuYW1lID0gbmV3X2hvc3RuYW1lLnRvX3MKKyAgICAgIGVsc2lmIG5ld19ob3N0bmFtZSAmJiAhbmV3X2hvc3RuYW1lLnJlc3BvbmRfdG8/KDp0b19zdHIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3tuZXdfaG9zdG5hbWUuY2xhc3N9IGludG8gU3RyaW5nLiIKKyAgICAgIGVuZAorICAgICAgdiA9IG5ld19ob3N0bmFtZSA/IG5ld19ob3N0bmFtZS50b19zdHIgOiBuaWwKKyAgICAgIHYgPSAiWyN7dn1dIiBpZiAvXEFcWy4qXF1cei8gIX4gdiAmJiAvOi8gPX4gdgorICAgICAgc2VsZi5ob3N0ID0gdgorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFJldHVybnMgdGhlIHRvcC1sZXZlbCBkb21haW4gZm9yIHRoaXMgaG9zdC4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJ3d3cuZXhhbXBsZS5jby51ayIpLnRsZCAjID0+ICJjby51ayIKKyAgICBkZWYgdGxkCisgICAgICBQdWJsaWNTdWZmaXgucGFyc2Uoc2VsZi5ob3N0LCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkudGxkCisgICAgZW5kCisKKyAgICAjIworICAgICMgUmV0dXJucyB0aGUgcHVibGljIHN1ZmZpeCBkb21haW4gZm9yIHRoaXMgaG9zdC4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJ3d3cuZXhhbXBsZS5jby51ayIpLmRvbWFpbiAjID0+ICJleGFtcGxlLmNvLnVrIgorICAgIGRlZiBkb21haW4KKyAgICAgIFB1YmxpY1N1ZmZpeC5kb21haW4oc2VsZi5ob3N0LCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgYXV0aG9yaXR5IGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIyBDb21iaW5lcyB0aGUgdXNlciwgcGFzc3dvcmQsIGhvc3QsIGFuZCBwb3J0IGNvbXBvbmVudHMuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgYXV0aG9yaXR5IGNvbXBvbmVudC4KKyAgICBkZWYgYXV0aG9yaXR5CisgICAgICBzZWxmLmhvc3QgJiYgQGF1dGhvcml0eSB8fD0gYmVnaW4KKyAgICAgICAgYXV0aG9yaXR5ID0gU3RyaW5nLm5ldworICAgICAgICBpZiBzZWxmLnVzZXJpbmZvICE9IG5pbAorICAgICAgICAgIGF1dGhvcml0eSA8PCAiI3tzZWxmLnVzZXJpbmZvfUAiCisgICAgICAgIGVuZAorICAgICAgICBhdXRob3JpdHkgPDwgc2VsZi5ob3N0CisgICAgICAgIGlmIHNlbGYucG9ydCAhPSBuaWwKKyAgICAgICAgICBhdXRob3JpdHkgPDwgIjoje3NlbGYucG9ydH0iCisgICAgICAgIGVuZAorICAgICAgICBhdXRob3JpdHkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBhdXRob3JpdHkgY29tcG9uZW50IGZvciB0aGlzIFVSSSwgbm9ybWFsaXplZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBhdXRob3JpdHkgY29tcG9uZW50LCBub3JtYWxpemVkLgorICAgIGRlZiBub3JtYWxpemVkX2F1dGhvcml0eQorICAgICAgcmV0dXJuIG5pbCB1bmxlc3Mgc2VsZi5hdXRob3JpdHkKKyAgICAgIEBub3JtYWxpemVkX2F1dGhvcml0eSB8fD0gYmVnaW4KKyAgICAgICAgYXV0aG9yaXR5ID0gU3RyaW5nLm5ldworICAgICAgICBpZiBzZWxmLm5vcm1hbGl6ZWRfdXNlcmluZm8gIT0gbmlsCisgICAgICAgICAgYXV0aG9yaXR5IDw8ICIje3NlbGYubm9ybWFsaXplZF91c2VyaW5mb31AIgorICAgICAgICBlbmQKKyAgICAgICAgYXV0aG9yaXR5IDw8IHNlbGYubm9ybWFsaXplZF9ob3N0CisgICAgICAgIGlmIHNlbGYubm9ybWFsaXplZF9wb3J0ICE9IG5pbAorICAgICAgICAgIGF1dGhvcml0eSA8PCAiOiN7c2VsZi5ub3JtYWxpemVkX3BvcnR9IgorICAgICAgICBlbmQKKyAgICAgICAgYXV0aG9yaXR5CisgICAgICBlbmQKKyAgICAgICMgQWxsIG5vcm1hbGl6ZWQgdmFsdWVzIHNob3VsZCBiZSBVVEYtOAorICAgICAgaWYgQG5vcm1hbGl6ZWRfYXV0aG9yaXR5CisgICAgICAgIEBub3JtYWxpemVkX2F1dGhvcml0eS5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpCisgICAgICBlbmQKKyAgICAgIEBub3JtYWxpemVkX2F1dGhvcml0eQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFNldHMgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgZm9yIHRoaXMgVVJJLgorICAgICMKKyAgICAjIEBwYXJhbSBbU3RyaW5nLCAjdG9fc3RyXSBuZXdfYXV0aG9yaXR5IFRoZSBuZXcgYXV0aG9yaXR5IGNvbXBvbmVudC4KKyAgICBkZWYgYXV0aG9yaXR5PShuZXdfYXV0aG9yaXR5KQorICAgICAgaWYgbmV3X2F1dGhvcml0eQorICAgICAgICBpZiAhbmV3X2F1dGhvcml0eS5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3tuZXdfYXV0aG9yaXR5LmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICAgIGVuZAorICAgICAgICBuZXdfYXV0aG9yaXR5ID0gbmV3X2F1dGhvcml0eS50b19zdHIKKyAgICAgICAgbmV3X3VzZXJpbmZvID0gbmV3X2F1dGhvcml0eVsvXihbXlxbXF1dKilALywgMV0KKyAgICAgICAgaWYgbmV3X3VzZXJpbmZvCisgICAgICAgICAgbmV3X3VzZXIgPSBuZXdfdXNlcmluZm8uc3RyaXBbL14oW146XSopOj8vLCAxXQorICAgICAgICAgIG5ld19wYXNzd29yZCA9IG5ld191c2VyaW5mby5zdHJpcFsvOiguKikkLywgMV0KKyAgICAgICAgZW5kCisgICAgICAgIG5ld19ob3N0ID0gbmV3X2F1dGhvcml0eS5nc3ViKAorICAgICAgICAgIC9eKFteXFtcXV0qKUAvLCBFTVBUWV9TVFIKKyAgICAgICAgKS5nc3ViKAorICAgICAgICAgIC86KFteOkBcW1xdXSo/KSQvLCBFTVBUWV9TVFIKKyAgICAgICAgKQorICAgICAgICBuZXdfcG9ydCA9CisgICAgICAgICAgbmV3X2F1dGhvcml0eVsvOihbXjpAXFtcXV0qPykkLywgMV0KKyAgICAgIGVuZAorCisgICAgICAjIFBhc3N3b3JkIGFzc2lnbmVkIGZpcnN0IHRvIGVuc3VyZSB2YWxpZGl0eSBpbiBjYXNlIG9mIG5pbAorICAgICAgc2VsZi5wYXNzd29yZCA9IGRlZmluZWQ/KG5ld19wYXNzd29yZCkgPyBuZXdfcGFzc3dvcmQgOiBuaWwKKyAgICAgIHNlbGYudXNlciA9IGRlZmluZWQ/KG5ld191c2VyKSA/IG5ld191c2VyIDogbmlsCisgICAgICBzZWxmLmhvc3QgPSBkZWZpbmVkPyhuZXdfaG9zdCkgPyBuZXdfaG9zdCA6IG5pbAorICAgICAgc2VsZi5wb3J0ID0gZGVmaW5lZD8obmV3X3BvcnQpID8gbmV3X3BvcnQgOiBuaWwKKworICAgICAgIyBSZXNldCBkZXBlbmRlbnQgdmFsdWVzCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkB1c2VyaW5mbykgaWYgZGVmaW5lZD8oQHVzZXJpbmZvKQorICAgICAgcmVtb3ZlX2luc3RhbmNlX3ZhcmlhYmxlKDpAbm9ybWFsaXplZF91c2VyaW5mbykgaWYgZGVmaW5lZD8oQG5vcm1hbGl6ZWRfdXNlcmluZm8pCisgICAgICByZW1vdmVfY29tcG9zaXRlX3ZhbHVlcworCisgICAgICAjIEVuc3VyZSB3ZSBoYXZlbid0IGNyZWF0ZWQgYW4gaW52YWxpZCBVUkkKKyAgICAgIHZhbGlkYXRlKCkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgb3JpZ2luIGZvciB0aGlzIFVSSSwgc2VyaWFsaXplZCB0byBBU0NJSSwgYXMgcGVyCisgICAgIyBSRkMgNjQ1NCwgc2VjdGlvbiA2LjIuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgc2VyaWFsaXplZCBvcmlnaW4uCisgICAgZGVmIG9yaWdpbgorICAgICAgaWYgc2VsZi5zY2hlbWUgJiYgc2VsZi5hdXRob3JpdHkKKyAgICAgICAgaWYgc2VsZi5ub3JtYWxpemVkX3BvcnQKKyAgICAgICAgICAiI3tzZWxmLm5vcm1hbGl6ZWRfc2NoZW1lfTovLyN7c2VsZi5ub3JtYWxpemVkX2hvc3R9IiArCisgICAgICAgICAgIjoje3NlbGYubm9ybWFsaXplZF9wb3J0fSIKKyAgICAgICAgZWxzZQorICAgICAgICAgICIje3NlbGYubm9ybWFsaXplZF9zY2hlbWV9Oi8vI3tzZWxmLm5vcm1hbGl6ZWRfaG9zdH0iCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICAibnVsbCIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFNldHMgdGhlIG9yaWdpbiBmb3IgdGhpcyBVUkksIHNlcmlhbGl6ZWQgdG8gQVNDSUksIGFzIHBlcgorICAgICMgUkZDIDY0NTQsIHNlY3Rpb24gNi4yLiBUaGlzIGFzc2lnbm1lbnQgd2lsbCByZXNldCB0aGUgYHVzZXJpbmZvYAorICAgICMgY29tcG9uZW50LgorICAgICMKKyAgICAjIEBwYXJhbSBbU3RyaW5nLCAjdG9fc3RyXSBuZXdfb3JpZ2luIFRoZSBuZXcgb3JpZ2luIGNvbXBvbmVudC4KKyAgICBkZWYgb3JpZ2luPShuZXdfb3JpZ2luKQorICAgICAgaWYgbmV3X29yaWdpbgorICAgICAgICBpZiAhbmV3X29yaWdpbi5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3tuZXdfb3JpZ2luLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICAgIGVuZAorICAgICAgICBuZXdfb3JpZ2luID0gbmV3X29yaWdpbi50b19zdHIKKyAgICAgICAgbmV3X3NjaGVtZSA9IG5ld19vcmlnaW5bL14oW146XC8/I10rKTpcL1wvLywgMV0KKyAgICAgICAgdW5sZXNzIG5ld19zY2hlbWUKKyAgICAgICAgICByYWlzZSBJbnZhbGlkVVJJRXJyb3IsICdBbiBvcmlnaW4gY2Fubm90IG9taXQgdGhlIHNjaGVtZS4nCisgICAgICAgIGVuZAorICAgICAgICBuZXdfaG9zdCA9IG5ld19vcmlnaW5bLzpcL1wvKFteXC8/IzpdKykvLCAxXQorICAgICAgICB1bmxlc3MgbmV3X2hvc3QKKyAgICAgICAgICByYWlzZSBJbnZhbGlkVVJJRXJyb3IsICdBbiBvcmlnaW4gY2Fubm90IG9taXQgdGhlIGhvc3QuJworICAgICAgICBlbmQKKyAgICAgICAgbmV3X3BvcnQgPSBuZXdfb3JpZ2luWy86KFteOkBcW1xdXC9dKj8pJC8sIDFdCisgICAgICBlbmQKKworICAgICAgc2VsZi5zY2hlbWUgPSBkZWZpbmVkPyhuZXdfc2NoZW1lKSA/IG5ld19zY2hlbWUgOiBuaWwKKyAgICAgIHNlbGYuaG9zdCA9IGRlZmluZWQ/KG5ld19ob3N0KSA/IG5ld19ob3N0IDogbmlsCisgICAgICBzZWxmLnBvcnQgPSBkZWZpbmVkPyhuZXdfcG9ydCkgPyBuZXdfcG9ydCA6IG5pbAorICAgICAgc2VsZi51c2VyaW5mbyA9IG5pbAorCisgICAgICAjIFJlc2V0IGRlcGVuZGVudCB2YWx1ZXMKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QHVzZXJpbmZvKSBpZiBkZWZpbmVkPyhAdXNlcmluZm8pCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkBub3JtYWxpemVkX3VzZXJpbmZvKSBpZiBkZWZpbmVkPyhAbm9ybWFsaXplZF91c2VyaW5mbykKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QGF1dGhvcml0eSkgaWYgZGVmaW5lZD8oQGF1dGhvcml0eSkKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QG5vcm1hbGl6ZWRfYXV0aG9yaXR5KSBpZiBkZWZpbmVkPyhAbm9ybWFsaXplZF9hdXRob3JpdHkpCisgICAgICByZW1vdmVfY29tcG9zaXRlX3ZhbHVlcworCisgICAgICAjIEVuc3VyZSB3ZSBoYXZlbid0IGNyZWF0ZWQgYW4gaW52YWxpZCBVUkkKKyAgICAgIHZhbGlkYXRlKCkKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhbiBhcnJheSBvZiBrbm93biBpcC1iYXNlZCBzY2hlbWVzLiBUaGVzZSBzY2hlbWVzIHR5cGljYWxseQorICAgICMgdXNlIGEgc2ltaWxhciBVUkkgZm9ybToKKyAgICAjIDxjb2RlPi8vPHVzZXI+OjxwYXNzd29yZD5APGhvc3Q+Ojxwb3J0Pi88dXJsLXBhdGg+PC9jb2RlPgorICAgIGRlZiBzZWxmLmlwX2Jhc2VkX3NjaGVtZXMKKyAgICAgIHJldHVybiBzZWxmLnBvcnRfbWFwcGluZy5rZXlzCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYSBoYXNoIG9mIGNvbW1vbiBJUC1iYXNlZCBzY2hlbWVzIGFuZCB0aGVpciBkZWZhdWx0IHBvcnQKKyAgICAjIG51bWJlcnMuIEFkZGluZyBuZXcgc2NoZW1lcyB0byB0aGlzIGhhc2gsIGFzIG5lY2Vzc2FyeSwgd2lsbCBhbGxvdworICAgICMgZm9yIGJldHRlciBVUkkgbm9ybWFsaXphdGlvbi4KKyAgICBkZWYgc2VsZi5wb3J0X21hcHBpbmcKKyAgICAgIFBPUlRfTUFQUElORworICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBwb3J0IGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIyBUaGlzIGlzIHRoZSBwb3J0IG51bWJlciBhY3R1YWxseSBnaXZlbiBpbiB0aGUgVVJJLiBUaGlzIGRvZXMgbm90CisgICAgIyBpbmZlciBwb3J0IG51bWJlcnMgZnJvbSBkZWZhdWx0IHZhbHVlcy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXSBUaGUgcG9ydCBjb21wb25lbnQuCisgICAgZGVmIHBvcnQKKyAgICAgIHJldHVybiBkZWZpbmVkPyhAcG9ydCkgPyBAcG9ydCA6IG5pbAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBwb3J0IGNvbXBvbmVudCBmb3IgdGhpcyBVUkksIG5vcm1hbGl6ZWQuCisgICAgIworICAgICMgQHJldHVybiBbSW50ZWdlcl0gVGhlIHBvcnQgY29tcG9uZW50LCBub3JtYWxpemVkLgorICAgIGRlZiBub3JtYWxpemVkX3BvcnQKKyAgICAgIHJldHVybiBuaWwgdW5sZXNzIHNlbGYucG9ydAorICAgICAgcmV0dXJuIEBub3JtYWxpemVkX3BvcnQgaWYgZGVmaW5lZD8oQG5vcm1hbGl6ZWRfcG9ydCkKKyAgICAgIEBub3JtYWxpemVkX3BvcnQgfHw9IGJlZ2luCisgICAgICAgIGlmIFVSSS5wb3J0X21hcHBpbmdbc2VsZi5ub3JtYWxpemVkX3NjaGVtZV0gPT0gc2VsZi5wb3J0CisgICAgICAgICAgbmlsCisgICAgICAgIGVsc2UKKyAgICAgICAgICBzZWxmLnBvcnQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMjCisgICAgIyBTZXRzIHRoZSBwb3J0IGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsIEludGVnZXIsICN0b19zXSBuZXdfcG9ydCBUaGUgbmV3IHBvcnQgY29tcG9uZW50LgorICAgIGRlZiBwb3J0PShuZXdfcG9ydCkKKyAgICAgIGlmIG5ld19wb3J0ICE9IG5pbCAmJiBuZXdfcG9ydC5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICBuZXdfcG9ydCA9IEFkZHJlc3NhYmxlOjpVUkkudW5lbmNvZGVfY29tcG9uZW50KG5ld19wb3J0LnRvX3N0cikKKyAgICAgIGVuZAorCisgICAgICBpZiBuZXdfcG9ydC5yZXNwb25kX3RvPyg6dmFsaWRfZW5jb2Rpbmc/KSAmJiAhbmV3X3BvcnQudmFsaWRfZW5jb2Rpbmc/CisgICAgICAgIHJhaXNlIEludmFsaWRVUklFcnJvciwgIkludmFsaWQgZW5jb2RpbmcgaW4gcG9ydCIKKyAgICAgIGVuZAorCisgICAgICBpZiBuZXdfcG9ydCAhPSBuaWwgJiYgIShuZXdfcG9ydC50b19zID1+IC9eXGQrJC8pCisgICAgICAgIHJhaXNlIEludmFsaWRVUklFcnJvciwKKyAgICAgICAgICAiSW52YWxpZCBwb3J0IG51bWJlcjogI3tuZXdfcG9ydC5pbnNwZWN0fSIKKyAgICAgIGVuZAorCisgICAgICBAcG9ydCA9IG5ld19wb3J0LnRvX3MudG9faQorICAgICAgQHBvcnQgPSBuaWwgaWYgQHBvcnQgPT0gMAorCisgICAgICAjIFJlc2V0IGRlcGVuZGVudCB2YWx1ZXMKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QGF1dGhvcml0eSkgaWYgZGVmaW5lZD8oQGF1dGhvcml0eSkKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QG5vcm1hbGl6ZWRfcG9ydCkgaWYgZGVmaW5lZD8oQG5vcm1hbGl6ZWRfcG9ydCkKKyAgICAgIHJlbW92ZV9jb21wb3NpdGVfdmFsdWVzCisKKyAgICAgICMgRW5zdXJlIHdlIGhhdmVuJ3QgY3JlYXRlZCBhbiBpbnZhbGlkIFVSSQorICAgICAgdmFsaWRhdGUoKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBpbmZlcnJlZCBwb3J0IGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIyBUaGlzIG1ldGhvZCB3aWxsIG5vcm1hbGl6ZSB0byB0aGUgZGVmYXVsdCBwb3J0IGZvciB0aGUgVVJJJ3Mgc2NoZW1lIGlmCisgICAgIyB0aGUgcG9ydCBpc24ndCBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGUgVVJJLgorICAgICMKKyAgICAjIEByZXR1cm4gW0ludGVnZXJdIFRoZSBpbmZlcnJlZCBwb3J0IGNvbXBvbmVudC4KKyAgICBkZWYgaW5mZXJyZWRfcG9ydAorICAgICAgaWYgc2VsZi5wb3J0LnRvX2kgPT0gMAorICAgICAgICBzZWxmLmRlZmF1bHRfcG9ydAorICAgICAgZWxzZQorICAgICAgICBzZWxmLnBvcnQudG9faQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIworICAgICMgVGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhpcyBVUkkncyBzY2hlbWUuCisgICAgIyBUaGlzIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm5zIHRoZSBkZWZhdWx0IHBvcnQgZm9yIHRoZSBVUkkncyBzY2hlbWUKKyAgICAjIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXNlbmNlIG9mIGFuIGV4cGxpY2l0IHBvcnQgaW4gdGhlIFVSSS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXSBUaGUgZGVmYXVsdCBwb3J0LgorICAgIGRlZiBkZWZhdWx0X3BvcnQKKyAgICAgIFVSSS5wb3J0X21hcHBpbmdbc2VsZi5zY2hlbWUuc3RyaXAuZG93bmNhc2VdIGlmIHNlbGYuc2NoZW1lCisgICAgZW5kCisKKyAgICAjIworICAgICMgVGhlIGNvbWJpbmF0aW9uIG9mIGNvbXBvbmVudHMgdGhhdCByZXByZXNlbnQgYSBzaXRlLgorICAgICMgQ29tYmluZXMgdGhlIHNjaGVtZSwgdXNlciwgcGFzc3dvcmQsIGhvc3QsIGFuZCBwb3J0IGNvbXBvbmVudHMuCisgICAgIyBQcmltYXJpbHkgdXNlZnVsIGZvciBIVFRQIGFuZCBIVFRQUy4KKyAgICAjCisgICAgIyBGb3IgZXhhbXBsZSwgPGNvZGU+Imh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoP3F1ZXJ5IjwvY29kZT4gd291bGQgaGF2ZSBhCisgICAgIyA8Y29kZT5zaXRlPC9jb2RlPiB2YWx1ZSBvZiA8Y29kZT4iaHR0cDovL2V4YW1wbGUuY29tIjwvY29kZT4uCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgY29tcG9uZW50cyB0aGF0IGlkZW50aWZ5IGEgc2l0ZS4KKyAgICBkZWYgc2l0ZQorICAgICAgKHNlbGYuc2NoZW1lIHx8IHNlbGYuYXV0aG9yaXR5KSAmJiBAc2l0ZSB8fD0gYmVnaW4KKyAgICAgICAgc2l0ZV9zdHJpbmcgPSAiIi5kdXAKKyAgICAgICAgc2l0ZV9zdHJpbmcgPDwgIiN7c2VsZi5zY2hlbWV9OiIgaWYgc2VsZi5zY2hlbWUgIT0gbmlsCisgICAgICAgIHNpdGVfc3RyaW5nIDw8ICIvLyN7c2VsZi5hdXRob3JpdHl9IiBpZiBzZWxmLmF1dGhvcml0eSAhPSBuaWwKKyAgICAgICAgc2l0ZV9zdHJpbmcKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBub3JtYWxpemVkIGNvbWJpbmF0aW9uIG9mIGNvbXBvbmVudHMgdGhhdCByZXByZXNlbnQgYSBzaXRlLgorICAgICMgQ29tYmluZXMgdGhlIHNjaGVtZSwgdXNlciwgcGFzc3dvcmQsIGhvc3QsIGFuZCBwb3J0IGNvbXBvbmVudHMuCisgICAgIyBQcmltYXJpbHkgdXNlZnVsIGZvciBIVFRQIGFuZCBIVFRQUy4KKyAgICAjCisgICAgIyBGb3IgZXhhbXBsZSwgPGNvZGU+Imh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoP3F1ZXJ5IjwvY29kZT4gd291bGQgaGF2ZSBhCisgICAgIyA8Y29kZT5zaXRlPC9jb2RlPiB2YWx1ZSBvZiA8Y29kZT4iaHR0cDovL2V4YW1wbGUuY29tIjwvY29kZT4uCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgbm9ybWFsaXplZCBjb21wb25lbnRzIHRoYXQgaWRlbnRpZnkgYSBzaXRlLgorICAgIGRlZiBub3JtYWxpemVkX3NpdGUKKyAgICAgIHJldHVybiBuaWwgdW5sZXNzIHNlbGYuc2l0ZQorICAgICAgQG5vcm1hbGl6ZWRfc2l0ZSB8fD0gYmVnaW4KKyAgICAgICAgc2l0ZV9zdHJpbmcgPSAiIi5kdXAKKyAgICAgICAgaWYgc2VsZi5ub3JtYWxpemVkX3NjaGVtZSAhPSBuaWwKKyAgICAgICAgICBzaXRlX3N0cmluZyA8PCAiI3tzZWxmLm5vcm1hbGl6ZWRfc2NoZW1lfToiCisgICAgICAgIGVuZAorICAgICAgICBpZiBzZWxmLm5vcm1hbGl6ZWRfYXV0aG9yaXR5ICE9IG5pbAorICAgICAgICAgIHNpdGVfc3RyaW5nIDw8ICIvLyN7c2VsZi5ub3JtYWxpemVkX2F1dGhvcml0eX0iCisgICAgICAgIGVuZAorICAgICAgICBzaXRlX3N0cmluZworICAgICAgZW5kCisgICAgICAjIEFsbCBub3JtYWxpemVkIHZhbHVlcyBzaG91bGQgYmUgVVRGLTgKKyAgICAgIEBub3JtYWxpemVkX3NpdGUuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KSBpZiBAbm9ybWFsaXplZF9zaXRlCisgICAgICBAbm9ybWFsaXplZF9zaXRlCisgICAgZW5kCisKKyAgICAjIworICAgICMgU2V0cyB0aGUgc2l0ZSB2YWx1ZSBmb3IgdGhpcyBVUkkuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsICN0b19zdHJdIG5ld19zaXRlIFRoZSBuZXcgc2l0ZSB2YWx1ZS4KKyAgICBkZWYgc2l0ZT0obmV3X3NpdGUpCisgICAgICBpZiBuZXdfc2l0ZQorICAgICAgICBpZiAhbmV3X3NpdGUucmVzcG9uZF90bz8oOnRvX3N0cikKKyAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7bmV3X3NpdGUuY2xhc3N9IGludG8gU3RyaW5nLiIKKyAgICAgICAgZW5kCisgICAgICAgIG5ld19zaXRlID0gbmV3X3NpdGUudG9fc3RyCisgICAgICAgICMgVGhlc2UgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZGVyaXZlZCBmcm9tIHRoZSBwcmltYXJ5IHBhcnNpbmcKKyAgICAgICAgIyBleHByZXNzaW9uCisgICAgICAgIHNlbGYuc2NoZW1lID0gbmV3X3NpdGVbL14oPzooW146XC8/I10rKTopPyg/OlwvXC8oPzpbXlwvPyNdKikpPyQvLCAxXQorICAgICAgICBzZWxmLmF1dGhvcml0eSA9IG5ld19zaXRlWworICAgICAgICAgIC9eKD86KD86W146XC8/I10rKTopPyg/OlwvXC8oW15cLz8jXSopKT8kLywgMQorICAgICAgICBdCisgICAgICBlbHNlCisgICAgICAgIHNlbGYuc2NoZW1lID0gbmlsCisgICAgICAgIHNlbGYuYXV0aG9yaXR5ID0gbmlsCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgcGF0aCBjb21wb25lbnQgZm9yIHRoaXMgVVJJLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHBhdGggY29tcG9uZW50LgorICAgIGRlZiBwYXRoCisgICAgICByZXR1cm4gZGVmaW5lZD8oQHBhdGgpID8gQHBhdGggOiBFTVBUWV9TVFIKKyAgICBlbmQKKworICAgIE5PUk1QQVRIID0gL14oPyFcLylbXlwvOl0qOi4qJC8KKyAgICAjIworICAgICMgVGhlIHBhdGggY29tcG9uZW50IGZvciB0aGlzIFVSSSwgbm9ybWFsaXplZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBwYXRoIGNvbXBvbmVudCwgbm9ybWFsaXplZC4KKyAgICBkZWYgbm9ybWFsaXplZF9wYXRoCisgICAgICBAbm9ybWFsaXplZF9wYXRoIHx8PSBiZWdpbgorICAgICAgICBwYXRoID0gc2VsZi5wYXRoLnRvX3MKKyAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gbmlsICYmIHBhdGggPX4gTk9STVBBVEgKKyAgICAgICAgICAjIFJlbGF0aXZlIHBhdGhzIHdpdGggY29sb25zIGluIHRoZSBmaXJzdCBzZWdtZW50IGFyZSBhbWJpZ3VvdXMuCisgICAgICAgICAgcGF0aCA9IHBhdGguc3ViKCI6IiwgIiUyRiIpCisgICAgICAgIGVuZAorICAgICAgICAjIFN0cmluZyNzcGxpdChkZWxpbWV0ZXIsIC0xKSB1c2VzIHRoZSBtb3JlIHN0cmljdCBzcGxpdHRpbmcgYmVoYXZpb3IKKyAgICAgICAgIyBmb3VuZCBieSBkZWZhdWx0IGluIFB5dGhvbi4KKyAgICAgICAgcmVzdWx0ID0gcGF0aC5zdHJpcC5zcGxpdChTTEFTSCwgLTEpLm1hcCBkbyB8c2VnbWVudHwKKyAgICAgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoCisgICAgICAgICAgICBzZWdtZW50LAorICAgICAgICAgICAgQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6UENIQVIKKyAgICAgICAgICApCisgICAgICAgIGVuZC5qb2luKFNMQVNIKQorCisgICAgICAgIHJlc3VsdCA9IFVSSS5ub3JtYWxpemVfcGF0aChyZXN1bHQpCisgICAgICAgIGlmIHJlc3VsdC5lbXB0eT8gJiYKKyAgICAgICAgICAgIFsiaHR0cCIsICJodHRwcyIsICJmdHAiLCAidGZ0cCJdLmluY2x1ZGU/KHNlbGYubm9ybWFsaXplZF9zY2hlbWUpCisgICAgICAgICAgcmVzdWx0ID0gU0xBU0guZHVwCisgICAgICAgIGVuZAorICAgICAgICByZXN1bHQKKyAgICAgIGVuZAorICAgICAgIyBBbGwgbm9ybWFsaXplZCB2YWx1ZXMgc2hvdWxkIGJlIFVURi04CisgICAgICBAbm9ybWFsaXplZF9wYXRoLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpVVEZfOCkgaWYgQG5vcm1hbGl6ZWRfcGF0aAorICAgICAgQG5vcm1hbGl6ZWRfcGF0aAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFNldHMgdGhlIHBhdGggY29tcG9uZW50IGZvciB0aGlzIFVSSS4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgI3RvX3N0cl0gbmV3X3BhdGggVGhlIG5ldyBwYXRoIGNvbXBvbmVudC4KKyAgICBkZWYgcGF0aD0obmV3X3BhdGgpCisgICAgICBpZiBuZXdfcGF0aCAmJiAhbmV3X3BhdGgucmVzcG9uZF90bz8oOnRvX3N0cikKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiQ2FuJ3QgY29udmVydCAje25ld19wYXRoLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQKKyAgICAgIEBwYXRoID0gKG5ld19wYXRoIHx8IEVNUFRZX1NUUikudG9fc3RyCisgICAgICBpZiAhQHBhdGguZW1wdHk/ICYmIEBwYXRoWzAuLjBdICE9IFNMQVNIICYmIGhvc3QgIT0gbmlsCisgICAgICAgIEBwYXRoID0gIi8je0BwYXRofSIKKyAgICAgIGVuZAorCisgICAgICAjIFJlc2V0IGRlcGVuZGVudCB2YWx1ZXMKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QG5vcm1hbGl6ZWRfcGF0aCkgaWYgZGVmaW5lZD8oQG5vcm1hbGl6ZWRfcGF0aCkKKyAgICAgIHJlbW92ZV9jb21wb3NpdGVfdmFsdWVzCisKKyAgICAgICMgRW5zdXJlIHdlIGhhdmVuJ3QgY3JlYXRlZCBhbiBpbnZhbGlkIFVSSQorICAgICAgdmFsaWRhdGUoKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBiYXNlbmFtZSwgaWYgYW55LCBvZiB0aGUgZmlsZSBpbiB0aGUgcGF0aCBjb21wb25lbnQuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgcGF0aCdzIGJhc2VuYW1lLgorICAgIGRlZiBiYXNlbmFtZQorICAgICAgIyBQYXRoIGNhbm5vdCBiZSBuaWwKKyAgICAgIHJldHVybiBGaWxlLmJhc2VuYW1lKHNlbGYucGF0aCkuZ3N1YigvO1teXC9dKiQvLCBFTVBUWV9TVFIpCisgICAgZW5kCisKKyAgICAjIworICAgICMgVGhlIGV4dG5hbWUsIGlmIGFueSwgb2YgdGhlIGZpbGUgaW4gdGhlIHBhdGggY29tcG9uZW50LgorICAgICMgRW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGV4dGVuc2lvbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBwYXRoJ3MgZXh0bmFtZS4KKyAgICBkZWYgZXh0bmFtZQorICAgICAgcmV0dXJuIG5pbCB1bmxlc3Mgc2VsZi5wYXRoCisgICAgICByZXR1cm4gRmlsZS5leHRuYW1lKHNlbGYuYmFzZW5hbWUpCisgICAgZW5kCisKKyAgICAjIworICAgICMgVGhlIHF1ZXJ5IGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgcXVlcnkgY29tcG9uZW50LgorICAgIGRlZiBxdWVyeQorICAgICAgcmV0dXJuIGRlZmluZWQ/KEBxdWVyeSkgPyBAcXVlcnkgOiBuaWwKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgcXVlcnkgY29tcG9uZW50IGZvciB0aGlzIFVSSSwgbm9ybWFsaXplZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBxdWVyeSBjb21wb25lbnQsIG5vcm1hbGl6ZWQuCisgICAgZGVmIG5vcm1hbGl6ZWRfcXVlcnkoKmZsYWdzKQorICAgICAgcmV0dXJuIG5pbCB1bmxlc3Mgc2VsZi5xdWVyeQorICAgICAgcmV0dXJuIEBub3JtYWxpemVkX3F1ZXJ5IGlmIGRlZmluZWQ/KEBub3JtYWxpemVkX3F1ZXJ5KQorICAgICAgQG5vcm1hbGl6ZWRfcXVlcnkgfHw9IGJlZ2luCisgICAgICAgIG1vZGlmaWVkX3F1ZXJ5X2NsYXNzID0gQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6UVVFUlkuZHVwCisgICAgICAgICMgTWFrZSBzdXJlIHBvc3NpYmxlIGtleS12YWx1ZSBwYWlyIGRlbGltaXRlcnMgYXJlIGVzY2FwZWQuCisgICAgICAgIG1vZGlmaWVkX3F1ZXJ5X2NsYXNzLnN1YiEoIlxcJiIsICIiKS5zdWIhKCJcXDsiLCAiIikKKyAgICAgICAgcGFpcnMgPSAoc2VsZi5xdWVyeSB8fCAiIikuc3BsaXQoIiYiLCAtMSkKKyAgICAgICAgcGFpcnMuc29ydCEgaWYgZmxhZ3MuaW5jbHVkZT8oOnNvcnRlZCkKKyAgICAgICAgY29tcG9uZW50ID0gcGFpcnMubWFwIGRvIHxwYWlyfAorICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplX2NvbXBvbmVudChwYWlyLCBtb2RpZmllZF9xdWVyeV9jbGFzcywgIisiKQorICAgICAgICBlbmQuam9pbigiJiIpCisgICAgICAgIGNvbXBvbmVudCA9PSAiIiA/IG5pbCA6IGNvbXBvbmVudAorICAgICAgZW5kCisgICAgICAjIEFsbCBub3JtYWxpemVkIHZhbHVlcyBzaG91bGQgYmUgVVRGLTgKKyAgICAgIEBub3JtYWxpemVkX3F1ZXJ5LmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpVVEZfOCkgaWYgQG5vcm1hbGl6ZWRfcXVlcnkKKyAgICAgIEBub3JtYWxpemVkX3F1ZXJ5CisgICAgZW5kCisKKyAgICAjIworICAgICMgU2V0cyB0aGUgcXVlcnkgY29tcG9uZW50IGZvciB0aGlzIFVSSS4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgI3RvX3N0cl0gbmV3X3F1ZXJ5IFRoZSBuZXcgcXVlcnkgY29tcG9uZW50LgorICAgIGRlZiBxdWVyeT0obmV3X3F1ZXJ5KQorICAgICAgaWYgbmV3X3F1ZXJ5ICYmICFuZXdfcXVlcnkucmVzcG9uZF90bz8oOnRvX3N0cikKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiQ2FuJ3QgY29udmVydCAje25ld19xdWVyeS5jbGFzc30gaW50byBTdHJpbmcuIgorICAgICAgZW5kCisgICAgICBAcXVlcnkgPSBuZXdfcXVlcnkgPyBuZXdfcXVlcnkudG9fc3RyIDogbmlsCisKKyAgICAgICMgUmVzZXQgZGVwZW5kZW50IHZhbHVlcworICAgICAgcmVtb3ZlX2luc3RhbmNlX3ZhcmlhYmxlKDpAbm9ybWFsaXplZF9xdWVyeSkgaWYgZGVmaW5lZD8oQG5vcm1hbGl6ZWRfcXVlcnkpCisgICAgICByZW1vdmVfY29tcG9zaXRlX3ZhbHVlcworICAgIGVuZAorCisgICAgIyMKKyAgICAjIENvbnZlcnRzIHRoZSBxdWVyeSBjb21wb25lbnQgdG8gYSBIYXNoIHZhbHVlLgorICAgICMKKyAgICAjIEBwYXJhbSBbQ2xhc3NdIHJldHVybl90eXBlIFRoZSByZXR1cm4gdHlwZSBkZXNpcmVkLiBWYWx1ZSBtdXN0IGJlIGVpdGhlcgorICAgICMgICBgSGFzaGAgb3IgYEFycmF5YC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtIYXNoLCBBcnJheSwgbmlsXSBUaGUgcXVlcnkgc3RyaW5nIHBhcnNlZCBhcyBhIEhhc2ggb3IgQXJyYXkKKyAgICAjICAgb3IgbmlsIGlmIHRoZSBxdWVyeSBzdHJpbmcgaXMgYmxhbmsuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiP29uZT0xJnR3bz0yJnRocmVlPTMiKS5xdWVyeV92YWx1ZXMKKyAgICAjICAgIz0+IHsib25lIiA9PiAiMSIsICJ0d28iID0+ICIyIiwgInRocmVlIiA9PiAiMyJ9CisgICAgIyAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIj9vbmU9dHdvJm9uZT10aHJlZSIpLnF1ZXJ5X3ZhbHVlcyhBcnJheSkKKyAgICAjICAgIz0+IFtbIm9uZSIsICJ0d28iXSwgWyJvbmUiLCAidGhyZWUiXV0KKyAgICAjICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiP29uZT10d28mb25lPXRocmVlIikucXVlcnlfdmFsdWVzKEhhc2gpCisgICAgIyAgICM9PiB7Im9uZSIgPT4gInRocmVlIn0KKyAgICAjICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiPyIpLnF1ZXJ5X3ZhbHVlcworICAgICMgICAjPT4ge30KKyAgICAjICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiIikucXVlcnlfdmFsdWVzCisgICAgIyAgICM9PiBuaWwKKyAgICBkZWYgcXVlcnlfdmFsdWVzKHJldHVybl90eXBlPUhhc2gpCisgICAgICBlbXB0eV9hY2N1bXVsYXRvciA9IEFycmF5ID09IHJldHVybl90eXBlID8gW10gOiB7fQorICAgICAgaWYgcmV0dXJuX3R5cGUgIT0gSGFzaCAmJiByZXR1cm5fdHlwZSAhPSBBcnJheQorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiSW52YWxpZCByZXR1cm4gdHlwZS4gTXVzdCBiZSBIYXNoIG9yIEFycmF5LiIKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIG5pbCBpZiBzZWxmLnF1ZXJ5ID09IG5pbAorICAgICAgc3BsaXRfcXVlcnkgPSBzZWxmLnF1ZXJ5LnNwbGl0KCImIikubWFwIGRvIHxwYWlyfAorICAgICAgICBwYWlyLnNwbGl0KCI9IiwgMikgaWYgcGFpciAmJiAhcGFpci5lbXB0eT8KKyAgICAgIGVuZC5jb21wYWN0CisgICAgICByZXR1cm4gc3BsaXRfcXVlcnkuaW5qZWN0KGVtcHR5X2FjY3VtdWxhdG9yLmR1cCkgZG8gfGFjY3UsIHBhaXJ8CisgICAgICAgICMgSSdkIHJhdGhlciB1c2Uga2V5L3ZhbHVlIGlkZW50aWZpZXJzIGluc3RlYWQgb2YgYXJyYXkgbG9va3VwcywKKyAgICAgICAgIyBidXQgaW4gdGhpcyBjYXNlIEkgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhlIGV4YWN0IHBhaXIgc3RydWN0dXJlLAorICAgICAgICAjIHNvIGl0J3MgYmVzdCB0byBtYWtlIGFsbCBjaGFuZ2VzIGluLXBsYWNlLgorICAgICAgICBwYWlyWzBdID0gVVJJLnVuZW5jb2RlX2NvbXBvbmVudChwYWlyWzBdKQorICAgICAgICBpZiBwYWlyWzFdLnJlc3BvbmRfdG8/KDp0b19zdHIpCisgICAgICAgICAgIyBJIGxvYXRoZSB0aGUgZmFjdCB0aGF0IEkgaGF2ZSB0byBkbyB0aGlzLiBTdHVwaWQgSFRNTCA0LjAxLgorICAgICAgICAgICMgVHJlYXRpbmcgJysnIGFzIGEgc3BhY2Ugd2FzIGp1c3QgYW4gdW5iZWxpZXZhYmx5IGJhZCBpZGVhLgorICAgICAgICAgICMgVGhlcmUgd2FzIG5vdGhpbmcgd3Jvbmcgd2l0aCAnJTIwJyEKKyAgICAgICAgICAjIElmIGl0IGFpbid0IGJyb2tlLCBkb24ndCBmaXggaXQhCisgICAgICAgICAgcGFpclsxXSA9IFVSSS51bmVuY29kZV9jb21wb25lbnQocGFpclsxXS50b19zdHIuZ3N1YigvXCsvLCAiICIpKQorICAgICAgICBlbmQKKyAgICAgICAgaWYgcmV0dXJuX3R5cGUgPT0gSGFzaAorICAgICAgICAgIGFjY3VbcGFpclswXV0gPSBwYWlyWzFdCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhY2N1IDw8IHBhaXIKKyAgICAgICAgZW5kCisgICAgICAgIGFjY3UKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFNldHMgdGhlIHF1ZXJ5IGNvbXBvbmVudCBmb3IgdGhpcyBVUkkgZnJvbSBhIEhhc2ggb2JqZWN0LgorICAgICMgQW4gZW1wdHkgSGFzaCBvciBBcnJheSB3aWxsIHJlc3VsdCBpbiBhbiBlbXB0eSBxdWVyeSBzdHJpbmcuCisgICAgIworICAgICMgQHBhcmFtIFtIYXNoLCAjdG9faGFzaCwgQXJyYXldIG5ld19xdWVyeV92YWx1ZXMgVGhlIG5ldyBxdWVyeSB2YWx1ZXMuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgdXJpLnF1ZXJ5X3ZhbHVlcyA9IHs6YSA9PiAiYSIsIDpiID0+IFsiYyIsICJkIiwgImUiXX0KKyAgICAjICAgdXJpLnF1ZXJ5CisgICAgIyAgICMgPT4gImE9YSZiPWMmYj1kJmI9ZSIKKyAgICAjICAgdXJpLnF1ZXJ5X3ZhbHVlcyA9IFtbJ2EnLCAnYSddLCBbJ2InLCAnYyddLCBbJ2InLCAnZCddLCBbJ2InLCAnZSddXQorICAgICMgICB1cmkucXVlcnkKKyAgICAjICAgIyA9PiAiYT1hJmI9YyZiPWQmYj1lIgorICAgICMgICB1cmkucXVlcnlfdmFsdWVzID0gW1snYScsICdhJ10sIFsnYicsIFsnYycsICdkJywgJ2UnXV1dCisgICAgIyAgIHVyaS5xdWVyeQorICAgICMgICAjID0+ICJhPWEmYj1jJmI9ZCZiPWUiCisgICAgIyAgIHVyaS5xdWVyeV92YWx1ZXMgPSBbWydmbGFnJ10sIFsna2V5JywgJ3ZhbHVlJ11dCisgICAgIyAgIHVyaS5xdWVyeQorICAgICMgICAjID0+ICJmbGFnJmtleT12YWx1ZSIKKyAgICBkZWYgcXVlcnlfdmFsdWVzPShuZXdfcXVlcnlfdmFsdWVzKQorICAgICAgaWYgbmV3X3F1ZXJ5X3ZhbHVlcyA9PSBuaWwKKyAgICAgICAgc2VsZi5xdWVyeSA9IG5pbAorICAgICAgICByZXR1cm4gbmlsCisgICAgICBlbmQKKworICAgICAgaWYgIW5ld19xdWVyeV92YWx1ZXMuaXNfYT8oQXJyYXkpCisgICAgICAgIGlmICFuZXdfcXVlcnlfdmFsdWVzLnJlc3BvbmRfdG8/KDp0b19oYXNoKQorICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwKKyAgICAgICAgICAgICJDYW4ndCBjb252ZXJ0ICN7bmV3X3F1ZXJ5X3ZhbHVlcy5jbGFzc30gaW50byBIYXNoLiIKKyAgICAgICAgZW5kCisgICAgICAgIG5ld19xdWVyeV92YWx1ZXMgPSBuZXdfcXVlcnlfdmFsdWVzLnRvX2hhc2gKKyAgICAgICAgbmV3X3F1ZXJ5X3ZhbHVlcyA9IG5ld19xdWVyeV92YWx1ZXMubWFwIGRvIHxrZXksIHZhbHVlfAorICAgICAgICAgIGtleSA9IGtleS50b19zIGlmIGtleS5raW5kX29mPyhTeW1ib2wpCisgICAgICAgICAgW2tleSwgdmFsdWVdCisgICAgICAgIGVuZAorICAgICAgICAjIFVzZWZ1bCBkZWZhdWx0IGZvciBPQXV0aCBhbmQgY2FjaGluZy4KKyAgICAgICAgIyBPbmx5IHRvIGJlIHVzZWQgZm9yIG5vbi1BcnJheSBpbnB1dHMuIEFycmF5cyBzaG91bGQgcHJlc2VydmUgb3JkZXIuCisgICAgICAgIG5ld19xdWVyeV92YWx1ZXMuc29ydCEKKyAgICAgIGVuZAorCisgICAgICAjIG5ld19xdWVyeV92YWx1ZXMgaGF2ZSBmb3JtIFtbJ2tleTEnLCAndmFsdWUxJ10sIFsna2V5MicsICd2YWx1ZTInXV0KKyAgICAgIGJ1ZmZlciA9ICIiLmR1cAorICAgICAgbmV3X3F1ZXJ5X3ZhbHVlcy5lYWNoIGRvIHxrZXksIHZhbHVlfAorICAgICAgICBlbmNvZGVkX2tleSA9IFVSSS5lbmNvZGVfY29tcG9uZW50KAorICAgICAgICAgIGtleSwgQ2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRAorICAgICAgICApCisgICAgICAgIGlmIHZhbHVlID09IG5pbAorICAgICAgICAgIGJ1ZmZlciA8PCAiI3tlbmNvZGVkX2tleX0mIgorICAgICAgICBlbHNpZiB2YWx1ZS5raW5kX29mPyhBcnJheSkKKyAgICAgICAgICB2YWx1ZS5lYWNoIGRvIHxzdWJfdmFsdWV8CisgICAgICAgICAgICBlbmNvZGVkX3ZhbHVlID0gVVJJLmVuY29kZV9jb21wb25lbnQoCisgICAgICAgICAgICAgIHN1Yl92YWx1ZSwgQ2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRAorICAgICAgICAgICAgKQorICAgICAgICAgICAgYnVmZmVyIDw8ICIje2VuY29kZWRfa2V5fT0je2VuY29kZWRfdmFsdWV9JiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVuY29kZWRfdmFsdWUgPSBVUkkuZW5jb2RlX2NvbXBvbmVudCgKKyAgICAgICAgICAgIHZhbHVlLCBDaGFyYWN0ZXJDbGFzc2VzOjpVTlJFU0VSVkVECisgICAgICAgICAgKQorICAgICAgICAgIGJ1ZmZlciA8PCAiI3tlbmNvZGVkX2tleX09I3tlbmNvZGVkX3ZhbHVlfSYiCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBzZWxmLnF1ZXJ5ID0gYnVmZmVyLmNob3AKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgSFRUUCByZXF1ZXN0IFVSSSBmb3IgdGhpcyBVUkkuICBUaGlzIGlzIHRoZSBwYXRoIGFuZCB0aGUKKyAgICAjIHF1ZXJ5IHN0cmluZy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSByZXF1ZXN0IFVSSSByZXF1aXJlZCBmb3IgYW4gSFRUUCByZXF1ZXN0LgorICAgIGRlZiByZXF1ZXN0X3VyaQorICAgICAgcmV0dXJuIG5pbCBpZiBzZWxmLmFic29sdXRlPyAmJiBzZWxmLnNjaGVtZSAhfiAvXmh0dHBzPyQvaQorICAgICAgcmV0dXJuICgKKyAgICAgICAgKCFzZWxmLnBhdGguZW1wdHk/ID8gc2VsZi5wYXRoIDogU0xBU0gpICsKKyAgICAgICAgKHNlbGYucXVlcnkgPyAiPyN7c2VsZi5xdWVyeX0iIDogRU1QVFlfU1RSKQorICAgICAgKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFNldHMgdGhlIEhUVFAgcmVxdWVzdCBVUkkgZm9yIHRoaXMgVVJJLgorICAgICMKKyAgICAjIEBwYXJhbSBbU3RyaW5nLCAjdG9fc3RyXSBuZXdfcmVxdWVzdF91cmkgVGhlIG5ldyBIVFRQIHJlcXVlc3QgVVJJLgorICAgIGRlZiByZXF1ZXN0X3VyaT0obmV3X3JlcXVlc3RfdXJpKQorICAgICAgaWYgIW5ld19yZXF1ZXN0X3VyaS5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7bmV3X3JlcXVlc3RfdXJpLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQKKyAgICAgIGlmIHNlbGYuYWJzb2x1dGU/ICYmIHNlbGYuc2NoZW1lICF+IC9eaHR0cHM/JC9pCisgICAgICAgIHJhaXNlIEludmFsaWRVUklFcnJvciwKKyAgICAgICAgICAiQ2Fubm90IHNldCBhbiBIVFRQIHJlcXVlc3QgVVJJIGZvciBhIG5vbi1IVFRQIFVSSS4iCisgICAgICBlbmQKKyAgICAgIG5ld19yZXF1ZXN0X3VyaSA9IG5ld19yZXF1ZXN0X3VyaS50b19zdHIKKyAgICAgIHBhdGhfY29tcG9uZW50ID0gbmV3X3JlcXVlc3RfdXJpWy9eKFteXD9dKilcPyg/Oi4qKSQvLCAxXQorICAgICAgcXVlcnlfY29tcG9uZW50ID0gbmV3X3JlcXVlc3RfdXJpWy9eKD86W15cP10qKVw/KC4qKSQvLCAxXQorICAgICAgcGF0aF9jb21wb25lbnQgPSBwYXRoX2NvbXBvbmVudC50b19zCisgICAgICBwYXRoX2NvbXBvbmVudCA9ICghcGF0aF9jb21wb25lbnQuZW1wdHk/ID8gcGF0aF9jb21wb25lbnQgOiBTTEFTSCkKKyAgICAgIHNlbGYucGF0aCA9IHBhdGhfY29tcG9uZW50CisgICAgICBzZWxmLnF1ZXJ5ID0gcXVlcnlfY29tcG9uZW50CisKKyAgICAgICMgUmVzZXQgZGVwZW5kZW50IHZhbHVlcworICAgICAgcmVtb3ZlX2NvbXBvc2l0ZV92YWx1ZXMKKyAgICBlbmQKKworICAgICMjCisgICAgIyBUaGUgZnJhZ21lbnQgY29tcG9uZW50IGZvciB0aGlzIFVSSS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBmcmFnbWVudCBjb21wb25lbnQuCisgICAgZGVmIGZyYWdtZW50CisgICAgICByZXR1cm4gZGVmaW5lZD8oQGZyYWdtZW50KSA/IEBmcmFnbWVudCA6IG5pbAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoZSBmcmFnbWVudCBjb21wb25lbnQgZm9yIHRoaXMgVVJJLCBub3JtYWxpemVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIGZyYWdtZW50IGNvbXBvbmVudCwgbm9ybWFsaXplZC4KKyAgICBkZWYgbm9ybWFsaXplZF9mcmFnbWVudAorICAgICAgcmV0dXJuIG5pbCB1bmxlc3Mgc2VsZi5mcmFnbWVudAorICAgICAgcmV0dXJuIEBub3JtYWxpemVkX2ZyYWdtZW50IGlmIGRlZmluZWQ/KEBub3JtYWxpemVkX2ZyYWdtZW50KQorICAgICAgQG5vcm1hbGl6ZWRfZnJhZ21lbnQgfHw9IGJlZ2luCisgICAgICAgIGNvbXBvbmVudCA9IEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplX2NvbXBvbmVudCgKKyAgICAgICAgICBzZWxmLmZyYWdtZW50LAorICAgICAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkNoYXJhY3RlckNsYXNzZXM6OkZSQUdNRU5UCisgICAgICAgICkKKyAgICAgICAgY29tcG9uZW50ID09ICIiID8gbmlsIDogY29tcG9uZW50CisgICAgICBlbmQKKyAgICAgICMgQWxsIG5vcm1hbGl6ZWQgdmFsdWVzIHNob3VsZCBiZSBVVEYtOAorICAgICAgaWYgQG5vcm1hbGl6ZWRfZnJhZ21lbnQKKyAgICAgICAgQG5vcm1hbGl6ZWRfZnJhZ21lbnQuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisgICAgICBAbm9ybWFsaXplZF9mcmFnbWVudAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFNldHMgdGhlIGZyYWdtZW50IGNvbXBvbmVudCBmb3IgdGhpcyBVUkkuCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsICN0b19zdHJdIG5ld19mcmFnbWVudCBUaGUgbmV3IGZyYWdtZW50IGNvbXBvbmVudC4KKyAgICBkZWYgZnJhZ21lbnQ9KG5ld19mcmFnbWVudCkKKyAgICAgIGlmIG5ld19mcmFnbWVudCAmJiAhbmV3X2ZyYWdtZW50LnJlc3BvbmRfdG8/KDp0b19zdHIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3tuZXdfZnJhZ21lbnQuY2xhc3N9IGludG8gU3RyaW5nLiIKKyAgICAgIGVuZAorICAgICAgQGZyYWdtZW50ID0gbmV3X2ZyYWdtZW50ID8gbmV3X2ZyYWdtZW50LnRvX3N0ciA6IG5pbAorCisgICAgICAjIFJlc2V0IGRlcGVuZGVudCB2YWx1ZXMKKyAgICAgIHJlbW92ZV9pbnN0YW5jZV92YXJpYWJsZSg6QG5vcm1hbGl6ZWRfZnJhZ21lbnQpIGlmIGRlZmluZWQ/KEBub3JtYWxpemVkX2ZyYWdtZW50KQorICAgICAgcmVtb3ZlX2NvbXBvc2l0ZV92YWx1ZXMKKworICAgICAgIyBFbnN1cmUgd2UgaGF2ZW4ndCBjcmVhdGVkIGFuIGludmFsaWQgVVJJCisgICAgICB2YWxpZGF0ZSgpCisgICAgZW5kCisKKyAgICAjIworICAgICMgRGV0ZXJtaW5lcyBpZiB0aGUgc2NoZW1lIGluZGljYXRlcyBhbiBJUC1iYXNlZCBwcm90b2NvbC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtUcnVlQ2xhc3MsIEZhbHNlQ2xhc3NdCisgICAgIyAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzY2hlbWUgaW5kaWNhdGVzIGFuIElQLWJhc2VkIHByb3RvY29sLgorICAgICMgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgIGRlZiBpcF9iYXNlZD8KKyAgICAgIGlmIHNlbGYuc2NoZW1lCisgICAgICAgIHJldHVybiBVUkkuaXBfYmFzZWRfc2NoZW1lcy5pbmNsdWRlPygKKyAgICAgICAgICBzZWxmLnNjaGVtZS5zdHJpcC5kb3duY2FzZSkKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIGZhbHNlCisgICAgZW5kCisKKyAgICAjIworICAgICMgRGV0ZXJtaW5lcyBpZiB0aGUgVVJJIGlzIHJlbGF0aXZlLgorICAgICMKKyAgICAjIEByZXR1cm4gW1RydWVDbGFzcywgRmFsc2VDbGFzc10KKyAgICAjICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIFVSSSBpcyByZWxhdGl2ZS4gPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgIyAgIG90aGVyd2lzZS4KKyAgICBkZWYgcmVsYXRpdmU/CisgICAgICByZXR1cm4gc2VsZi5zY2hlbWUubmlsPworICAgIGVuZAorCisgICAgIyMKKyAgICAjIERldGVybWluZXMgaWYgdGhlIFVSSSBpcyBhYnNvbHV0ZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtUcnVlQ2xhc3MsIEZhbHNlQ2xhc3NdCisgICAgIyAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBVUkkgaXMgYWJzb2x1dGUuIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICMgICBvdGhlcndpc2UuCisgICAgZGVmIGFic29sdXRlPworICAgICAgcmV0dXJuICFyZWxhdGl2ZT8KKyAgICBlbmQKKworICAgICMjCisgICAgIyBKb2lucyB0d28gVVJJcyB0b2dldGhlci4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgQWRkcmVzc2FibGU6OlVSSSwgI3RvX3N0cl0gVGhlIFVSSSB0byBqb2luIHdpdGguCisgICAgIworICAgICMgQHJldHVybiBbQWRkcmVzc2FibGU6OlVSSV0gVGhlIGpvaW5lZCBVUkkuCisgICAgZGVmIGpvaW4odXJpKQorICAgICAgaWYgIXVyaS5yZXNwb25kX3RvPyg6dG9fc3RyKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBjb252ZXJ0ICN7dXJpLmNsYXNzfSBpbnRvIFN0cmluZy4iCisgICAgICBlbmQKKyAgICAgIGlmICF1cmkua2luZF9vZj8oVVJJKQorICAgICAgICAjIE90aGVyd2lzZSwgY29udmVydCB0byBhIFN0cmluZywgdGhlbiBwYXJzZS4KKyAgICAgICAgdXJpID0gVVJJLnBhcnNlKHVyaS50b19zdHIpCisgICAgICBlbmQKKyAgICAgIGlmIHVyaS50b19zLmVtcHR5PworICAgICAgICByZXR1cm4gc2VsZi5kdXAKKyAgICAgIGVuZAorCisgICAgICBqb2luZWRfc2NoZW1lID0gbmlsCisgICAgICBqb2luZWRfdXNlciA9IG5pbAorICAgICAgam9pbmVkX3Bhc3N3b3JkID0gbmlsCisgICAgICBqb2luZWRfaG9zdCA9IG5pbAorICAgICAgam9pbmVkX3BvcnQgPSBuaWwKKyAgICAgIGpvaW5lZF9wYXRoID0gbmlsCisgICAgICBqb2luZWRfcXVlcnkgPSBuaWwKKyAgICAgIGpvaW5lZF9mcmFnbWVudCA9IG5pbAorCisgICAgICAjIFNlY3Rpb24gNS4yLjIgb2YgUkZDIDM5ODYKKyAgICAgIGlmIHVyaS5zY2hlbWUgIT0gbmlsCisgICAgICAgIGpvaW5lZF9zY2hlbWUgPSB1cmkuc2NoZW1lCisgICAgICAgIGpvaW5lZF91c2VyID0gdXJpLnVzZXIKKyAgICAgICAgam9pbmVkX3Bhc3N3b3JkID0gdXJpLnBhc3N3b3JkCisgICAgICAgIGpvaW5lZF9ob3N0ID0gdXJpLmhvc3QKKyAgICAgICAgam9pbmVkX3BvcnQgPSB1cmkucG9ydAorICAgICAgICBqb2luZWRfcGF0aCA9IFVSSS5ub3JtYWxpemVfcGF0aCh1cmkucGF0aCkKKyAgICAgICAgam9pbmVkX3F1ZXJ5ID0gdXJpLnF1ZXJ5CisgICAgICBlbHNlCisgICAgICAgIGlmIHVyaS5hdXRob3JpdHkgIT0gbmlsCisgICAgICAgICAgam9pbmVkX3VzZXIgPSB1cmkudXNlcgorICAgICAgICAgIGpvaW5lZF9wYXNzd29yZCA9IHVyaS5wYXNzd29yZAorICAgICAgICAgIGpvaW5lZF9ob3N0ID0gdXJpLmhvc3QKKyAgICAgICAgICBqb2luZWRfcG9ydCA9IHVyaS5wb3J0CisgICAgICAgICAgam9pbmVkX3BhdGggPSBVUkkubm9ybWFsaXplX3BhdGgodXJpLnBhdGgpCisgICAgICAgICAgam9pbmVkX3F1ZXJ5ID0gdXJpLnF1ZXJ5CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiB1cmkucGF0aCA9PSBuaWwgfHwgdXJpLnBhdGguZW1wdHk/CisgICAgICAgICAgICBqb2luZWRfcGF0aCA9IHNlbGYucGF0aAorICAgICAgICAgICAgaWYgdXJpLnF1ZXJ5ICE9IG5pbAorICAgICAgICAgICAgICBqb2luZWRfcXVlcnkgPSB1cmkucXVlcnkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgam9pbmVkX3F1ZXJ5ID0gc2VsZi5xdWVyeQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgdXJpLnBhdGhbMC4uMF0gPT0gU0xBU0gKKyAgICAgICAgICAgICAgam9pbmVkX3BhdGggPSBVUkkubm9ybWFsaXplX3BhdGgodXJpLnBhdGgpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGJhc2VfcGF0aCA9IHNlbGYucGF0aC5kdXAKKyAgICAgICAgICAgICAgYmFzZV9wYXRoID0gRU1QVFlfU1RSIGlmIGJhc2VfcGF0aCA9PSBuaWwKKyAgICAgICAgICAgICAgYmFzZV9wYXRoID0gVVJJLm5vcm1hbGl6ZV9wYXRoKGJhc2VfcGF0aCkKKworICAgICAgICAgICAgICAjIFNlY3Rpb24gNS4yLjMgb2YgUkZDIDM5ODYKKyAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAjIFJlbW92ZXMgdGhlIHJpZ2h0LW1vc3QgcGF0aCBzZWdtZW50IGZyb20gdGhlIGJhc2UgcGF0aC4KKyAgICAgICAgICAgICAgaWYgYmFzZV9wYXRoID1+IC9cLy8KKyAgICAgICAgICAgICAgICBiYXNlX3BhdGguZ3N1YiEoL1wvW15cL10rJC8sIFNMQVNIKQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmFzZV9wYXRoID0gRU1QVFlfU1RSCisgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICMgSWYgdGhlIGJhc2UgcGF0aCBpcyBlbXB0eSBhbmQgYW4gYXV0aG9yaXR5IHNlZ21lbnQgaGFzIGJlZW4KKyAgICAgICAgICAgICAgIyBkZWZpbmVkLCB1c2UgYSBiYXNlIHBhdGggb2YgU0xBU0gKKyAgICAgICAgICAgICAgaWYgYmFzZV9wYXRoLmVtcHR5PyAmJiBzZWxmLmF1dGhvcml0eSAhPSBuaWwKKyAgICAgICAgICAgICAgICBiYXNlX3BhdGggPSBTTEFTSAorICAgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgICBqb2luZWRfcGF0aCA9IFVSSS5ub3JtYWxpemVfcGF0aChiYXNlX3BhdGggKyB1cmkucGF0aCkKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgam9pbmVkX3F1ZXJ5ID0gdXJpLnF1ZXJ5CisgICAgICAgICAgZW5kCisgICAgICAgICAgam9pbmVkX3VzZXIgPSBzZWxmLnVzZXIKKyAgICAgICAgICBqb2luZWRfcGFzc3dvcmQgPSBzZWxmLnBhc3N3b3JkCisgICAgICAgICAgam9pbmVkX2hvc3QgPSBzZWxmLmhvc3QKKyAgICAgICAgICBqb2luZWRfcG9ydCA9IHNlbGYucG9ydAorICAgICAgICBlbmQKKyAgICAgICAgam9pbmVkX3NjaGVtZSA9IHNlbGYuc2NoZW1lCisgICAgICBlbmQKKyAgICAgIGpvaW5lZF9mcmFnbWVudCA9IHVyaS5mcmFnbWVudAorCisgICAgICByZXR1cm4gc2VsZi5jbGFzcy5uZXcoCisgICAgICAgIDpzY2hlbWUgPT4gam9pbmVkX3NjaGVtZSwKKyAgICAgICAgOnVzZXIgPT4gam9pbmVkX3VzZXIsCisgICAgICAgIDpwYXNzd29yZCA9PiBqb2luZWRfcGFzc3dvcmQsCisgICAgICAgIDpob3N0ID0+IGpvaW5lZF9ob3N0LAorICAgICAgICA6cG9ydCA9PiBqb2luZWRfcG9ydCwKKyAgICAgICAgOnBhdGggPT4gam9pbmVkX3BhdGgsCisgICAgICAgIDpxdWVyeSA9PiBqb2luZWRfcXVlcnksCisgICAgICAgIDpmcmFnbWVudCA9PiBqb2luZWRfZnJhZ21lbnQKKyAgICAgICkKKyAgICBlbmQKKyAgICBhbGlhc19tZXRob2QgOissIDpqb2luCisKKyAgICAjIworICAgICMgRGVzdHJ1Y3RpdmUgZm9ybSBvZiA8Y29kZT5qb2luPC9jb2RlPi4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgQWRkcmVzc2FibGU6OlVSSSwgI3RvX3N0cl0gVGhlIFVSSSB0byBqb2luIHdpdGguCisgICAgIworICAgICMgQHJldHVybiBbQWRkcmVzc2FibGU6OlVSSV0gVGhlIGpvaW5lZCBVUkkuCisgICAgIworICAgICMgQHNlZSBBZGRyZXNzYWJsZTo6VVJJI2pvaW4KKyAgICBkZWYgam9pbiEodXJpKQorICAgICAgcmVwbGFjZV9zZWxmKHNlbGYuam9pbih1cmkpKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIE1lcmdlcyBhIFVSSSB3aXRoIGEgPGNvZGU+SGFzaDwvY29kZT4gb2YgY29tcG9uZW50cy4KKyAgICAjIFRoaXMgbWV0aG9kIGhhcyBkaWZmZXJlbnQgYmVoYXZpb3IgZnJvbSA8Y29kZT5qb2luPC9jb2RlPi4gQW55CisgICAgIyBjb21wb25lbnRzIHByZXNlbnQgaW4gdGhlIDxjb2RlPmhhc2g8L2NvZGU+IHBhcmFtZXRlciB3aWxsIG92ZXJyaWRlIHRoZQorICAgICMgb3JpZ2luYWwgY29tcG9uZW50cy4gVGhlIHBhdGggY29tcG9uZW50IGlzIG5vdCB0cmVhdGVkIHNwZWNpYWxseS4KKyAgICAjCisgICAgIyBAcGFyYW0gW0hhc2gsIEFkZHJlc3NhYmxlOjpVUkksICN0b19oYXNoXSBUaGUgY29tcG9uZW50cyB0byBtZXJnZSB3aXRoLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIFRoZSBtZXJnZWQgVVJJLgorICAgICMKKyAgICAjIEBzZWUgSGFzaCNtZXJnZQorICAgIGRlZiBtZXJnZShoYXNoKQorICAgICAgaWYgIWhhc2gucmVzcG9uZF90bz8oOnRvX2hhc2gpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbid0IGNvbnZlcnQgI3toYXNoLmNsYXNzfSBpbnRvIEhhc2guIgorICAgICAgZW5kCisgICAgICBoYXNoID0gaGFzaC50b19oYXNoCisKKyAgICAgIGlmIGhhc2guaGFzX2tleT8oOmF1dGhvcml0eSkKKyAgICAgICAgaWYgKGhhc2gua2V5cyAmIFs6dXNlcmluZm8sIDp1c2VyLCA6cGFzc3dvcmQsIDpob3N0LCA6cG9ydF0pLmFueT8KKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLAorICAgICAgICAgICAgIkNhbm5vdCBzcGVjaWZ5IGJvdGggYW4gYXV0aG9yaXR5IGFuZCBhbnkgb2YgdGhlIGNvbXBvbmVudHMgIiArCisgICAgICAgICAgICAid2l0aGluIHRoZSBhdXRob3JpdHkuIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgaWYgaGFzaC5oYXNfa2V5Pyg6dXNlcmluZm8pCisgICAgICAgIGlmIChoYXNoLmtleXMgJiBbOnVzZXIsIDpwYXNzd29yZF0pLmFueT8KKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLAorICAgICAgICAgICAgIkNhbm5vdCBzcGVjaWZ5IGJvdGggYSB1c2VyaW5mbyBhbmQgZWl0aGVyIHRoZSB1c2VyIG9yIHBhc3N3b3JkLiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgdXJpID0gc2VsZi5jbGFzcy5uZXcKKyAgICAgIHVyaS5kZWZlcl92YWxpZGF0aW9uIGRvCisgICAgICAgICMgQnVuY2ggb2YgY3JhenkgbG9naWMgcmVxdWlyZWQgYmVjYXVzZSBvZiB0aGUgY29tcG9zaXRlIGNvbXBvbmVudHMKKyAgICAgICAgIyBsaWtlIHVzZXJpbmZvIGFuZCBhdXRob3JpdHkuCisgICAgICAgIHVyaS5zY2hlbWUgPQorICAgICAgICAgIGhhc2guaGFzX2tleT8oOnNjaGVtZSkgPyBoYXNoWzpzY2hlbWVdIDogc2VsZi5zY2hlbWUKKyAgICAgICAgaWYgaGFzaC5oYXNfa2V5Pyg6YXV0aG9yaXR5KQorICAgICAgICAgIHVyaS5hdXRob3JpdHkgPQorICAgICAgICAgICAgaGFzaC5oYXNfa2V5Pyg6YXV0aG9yaXR5KSA/IGhhc2hbOmF1dGhvcml0eV0gOiBzZWxmLmF1dGhvcml0eQorICAgICAgICBlbmQKKyAgICAgICAgaWYgaGFzaC5oYXNfa2V5Pyg6dXNlcmluZm8pCisgICAgICAgICAgdXJpLnVzZXJpbmZvID0KKyAgICAgICAgICAgIGhhc2guaGFzX2tleT8oOnVzZXJpbmZvKSA/IGhhc2hbOnVzZXJpbmZvXSA6IHNlbGYudXNlcmluZm8KKyAgICAgICAgZW5kCisgICAgICAgIGlmICFoYXNoLmhhc19rZXk/KDp1c2VyaW5mbykgJiYgIWhhc2guaGFzX2tleT8oOmF1dGhvcml0eSkKKyAgICAgICAgICB1cmkudXNlciA9CisgICAgICAgICAgICBoYXNoLmhhc19rZXk/KDp1c2VyKSA/IGhhc2hbOnVzZXJdIDogc2VsZi51c2VyCisgICAgICAgICAgdXJpLnBhc3N3b3JkID0KKyAgICAgICAgICAgIGhhc2guaGFzX2tleT8oOnBhc3N3b3JkKSA/IGhhc2hbOnBhc3N3b3JkXSA6IHNlbGYucGFzc3dvcmQKKyAgICAgICAgZW5kCisgICAgICAgIGlmICFoYXNoLmhhc19rZXk/KDphdXRob3JpdHkpCisgICAgICAgICAgdXJpLmhvc3QgPQorICAgICAgICAgICAgaGFzaC5oYXNfa2V5Pyg6aG9zdCkgPyBoYXNoWzpob3N0XSA6IHNlbGYuaG9zdAorICAgICAgICAgIHVyaS5wb3J0ID0KKyAgICAgICAgICAgIGhhc2guaGFzX2tleT8oOnBvcnQpID8gaGFzaFs6cG9ydF0gOiBzZWxmLnBvcnQKKyAgICAgICAgZW5kCisgICAgICAgIHVyaS5wYXRoID0KKyAgICAgICAgICBoYXNoLmhhc19rZXk/KDpwYXRoKSA/IGhhc2hbOnBhdGhdIDogc2VsZi5wYXRoCisgICAgICAgIHVyaS5xdWVyeSA9CisgICAgICAgICAgaGFzaC5oYXNfa2V5Pyg6cXVlcnkpID8gaGFzaFs6cXVlcnldIDogc2VsZi5xdWVyeQorICAgICAgICB1cmkuZnJhZ21lbnQgPQorICAgICAgICAgIGhhc2guaGFzX2tleT8oOmZyYWdtZW50KSA/IGhhc2hbOmZyYWdtZW50XSA6IHNlbGYuZnJhZ21lbnQKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gdXJpCisgICAgZW5kCisKKyAgICAjIworICAgICMgRGVzdHJ1Y3RpdmUgZm9ybSBvZiA8Y29kZT5tZXJnZTwvY29kZT4uCisgICAgIworICAgICMgQHBhcmFtIFtIYXNoLCBBZGRyZXNzYWJsZTo6VVJJLCAjdG9faGFzaF0gVGhlIGNvbXBvbmVudHMgdG8gbWVyZ2Ugd2l0aC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBZGRyZXNzYWJsZTo6VVJJXSBUaGUgbWVyZ2VkIFVSSS4KKyAgICAjCisgICAgIyBAc2VlIEFkZHJlc3NhYmxlOjpVUkkjbWVyZ2UKKyAgICBkZWYgbWVyZ2UhKHVyaSkKKyAgICAgIHJlcGxhY2Vfc2VsZihzZWxmLm1lcmdlKHVyaSkpCisgICAgZW5kCisKKyAgICAjIworICAgICMgUmV0dXJucyB0aGUgc2hvcnRlc3Qgbm9ybWFsaXplZCByZWxhdGl2ZSBmb3JtIG9mIHRoaXMgVVJJIHRoYXQgdXNlcyB0aGUKKyAgICAjIHN1cHBsaWVkIFVSSSBhcyBhIGJhc2UgZm9yIHJlc29sdXRpb24uIFJldHVybnMgYW4gYWJzb2x1dGUgVVJJIGlmCisgICAgIyBuZWNlc3NhcnkuIFRoaXMgaXMgZWZmZWN0aXZlbHkgdGhlIG9wcG9zaXRlIG9mIDxjb2RlPnJvdXRlX3RvPC9jb2RlPi4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZywgQWRkcmVzc2FibGU6OlVSSSwgI3RvX3N0cl0gdXJpIFRoZSBVUkkgdG8gcm91dGUgZnJvbS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBZGRyZXNzYWJsZTo6VVJJXQorICAgICMgICBUaGUgbm9ybWFsaXplZCByZWxhdGl2ZSBVUkkgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBVUkkuCisgICAgZGVmIHJvdXRlX2Zyb20odXJpKQorICAgICAgdXJpID0gVVJJLnBhcnNlKHVyaSkubm9ybWFsaXplCisgICAgICBub3JtYWxpemVkX3NlbGYgPSBzZWxmLm5vcm1hbGl6ZQorICAgICAgaWYgbm9ybWFsaXplZF9zZWxmLnJlbGF0aXZlPworICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiRXhwZWN0ZWQgYWJzb2x1dGUgVVJJLCBnb3Q6ICN7c2VsZi50b19zfSIKKyAgICAgIGVuZAorICAgICAgaWYgdXJpLnJlbGF0aXZlPworICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiRXhwZWN0ZWQgYWJzb2x1dGUgVVJJLCBnb3Q6ICN7dXJpLnRvX3N9IgorICAgICAgZW5kCisgICAgICBpZiBub3JtYWxpemVkX3NlbGYgPT0gdXJpCisgICAgICAgIHJldHVybiBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCIjI3tub3JtYWxpemVkX3NlbGYuZnJhZ21lbnR9IikKKyAgICAgIGVuZAorICAgICAgY29tcG9uZW50cyA9IG5vcm1hbGl6ZWRfc2VsZi50b19oYXNoCisgICAgICBpZiBub3JtYWxpemVkX3NlbGYuc2NoZW1lID09IHVyaS5zY2hlbWUKKyAgICAgICAgY29tcG9uZW50c1s6c2NoZW1lXSA9IG5pbAorICAgICAgICBpZiBub3JtYWxpemVkX3NlbGYuYXV0aG9yaXR5ID09IHVyaS5hdXRob3JpdHkKKyAgICAgICAgICBjb21wb25lbnRzWzp1c2VyXSA9IG5pbAorICAgICAgICAgIGNvbXBvbmVudHNbOnBhc3N3b3JkXSA9IG5pbAorICAgICAgICAgIGNvbXBvbmVudHNbOmhvc3RdID0gbmlsCisgICAgICAgICAgY29tcG9uZW50c1s6cG9ydF0gPSBuaWwKKyAgICAgICAgICBpZiBub3JtYWxpemVkX3NlbGYucGF0aCA9PSB1cmkucGF0aAorICAgICAgICAgICAgY29tcG9uZW50c1s6cGF0aF0gPSBuaWwKKyAgICAgICAgICAgIGlmIG5vcm1hbGl6ZWRfc2VsZi5xdWVyeSA9PSB1cmkucXVlcnkKKyAgICAgICAgICAgICAgY29tcG9uZW50c1s6cXVlcnldID0gbmlsCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiB1cmkucGF0aCAhPSBTTEFTSCBhbmQgY29tcG9uZW50c1s6cGF0aF0KKyAgICAgICAgICAgICAgc2VsZl9zcGxpdHRlZF9wYXRoID0gc3BsaXRfcGF0aChjb21wb25lbnRzWzpwYXRoXSkKKyAgICAgICAgICAgICAgdXJpX3NwbGl0dGVkX3BhdGggPSBzcGxpdF9wYXRoKHVyaS5wYXRoKQorICAgICAgICAgICAgICBzZWxmX2RpciA9IHNlbGZfc3BsaXR0ZWRfcGF0aC5zaGlmdAorICAgICAgICAgICAgICB1cmlfZGlyID0gdXJpX3NwbGl0dGVkX3BhdGguc2hpZnQKKyAgICAgICAgICAgICAgd2hpbGUgIXNlbGZfc3BsaXR0ZWRfcGF0aC5lbXB0eT8gJiYgIXVyaV9zcGxpdHRlZF9wYXRoLmVtcHR5PyBhbmQgc2VsZl9kaXIgPT0gdXJpX2RpcgorICAgICAgICAgICAgICAgIHNlbGZfZGlyID0gc2VsZl9zcGxpdHRlZF9wYXRoLnNoaWZ0CisgICAgICAgICAgICAgICAgdXJpX2RpciA9IHVyaV9zcGxpdHRlZF9wYXRoLnNoaWZ0CisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBjb21wb25lbnRzWzpwYXRoXSA9ICh1cmlfc3BsaXR0ZWRfcGF0aC5maWxsKCcuLicpICsgW3NlbGZfZGlyXSArIHNlbGZfc3BsaXR0ZWRfcGF0aCkuam9pbihTTEFTSCkKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgIyBBdm9pZCBuZXR3b3JrLXBhdGggcmVmZXJlbmNlcy4KKyAgICAgIGlmIGNvbXBvbmVudHNbOmhvc3RdICE9IG5pbAorICAgICAgICBjb21wb25lbnRzWzpzY2hlbWVdID0gbm9ybWFsaXplZF9zZWxmLnNjaGVtZQorICAgICAgZW5kCisgICAgICByZXR1cm4gQWRkcmVzc2FibGU6OlVSSS5uZXcoCisgICAgICAgIDpzY2hlbWUgPT4gY29tcG9uZW50c1s6c2NoZW1lXSwKKyAgICAgICAgOnVzZXIgPT4gY29tcG9uZW50c1s6dXNlcl0sCisgICAgICAgIDpwYXNzd29yZCA9PiBjb21wb25lbnRzWzpwYXNzd29yZF0sCisgICAgICAgIDpob3N0ID0+IGNvbXBvbmVudHNbOmhvc3RdLAorICAgICAgICA6cG9ydCA9PiBjb21wb25lbnRzWzpwb3J0XSwKKyAgICAgICAgOnBhdGggPT4gY29tcG9uZW50c1s6cGF0aF0sCisgICAgICAgIDpxdWVyeSA9PiBjb21wb25lbnRzWzpxdWVyeV0sCisgICAgICAgIDpmcmFnbWVudCA9PiBjb21wb25lbnRzWzpmcmFnbWVudF0KKyAgICAgICkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBSZXR1cm5zIHRoZSBzaG9ydGVzdCBub3JtYWxpemVkIHJlbGF0aXZlIGZvcm0gb2YgdGhlIHN1cHBsaWVkIFVSSSB0aGF0CisgICAgIyB1c2VzIHRoaXMgVVJJIGFzIGEgYmFzZSBmb3IgcmVzb2x1dGlvbi4gUmV0dXJucyBhbiBhYnNvbHV0ZSBVUkkgaWYKKyAgICAjIG5lY2Vzc2FyeS4gVGhpcyBpcyBlZmZlY3RpdmVseSB0aGUgb3Bwb3NpdGUgb2YgPGNvZGU+cm91dGVfZnJvbTwvY29kZT4uCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmcsIEFkZHJlc3NhYmxlOjpVUkksICN0b19zdHJdIHVyaSBUaGUgVVJJIHRvIHJvdXRlIHRvLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldCisgICAgIyAgIFRoZSBub3JtYWxpemVkIHJlbGF0aXZlIFVSSSB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIHN1cHBsaWVkIFVSSS4KKyAgICBkZWYgcm91dGVfdG8odXJpKQorICAgICAgcmV0dXJuIFVSSS5wYXJzZSh1cmkpLnJvdXRlX2Zyb20oc2VsZikKKyAgICBlbmQKKworICAgICMjCisgICAgIyBSZXR1cm5zIGEgbm9ybWFsaXplZCBVUkkgb2JqZWN0LgorICAgICMKKyAgICAjIE5PVEU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IGF0dGVtcHQgdG8gZnVsbHkgY29uZm9ybSB0byBzcGVjaWZpY2F0aW9ucy4KKyAgICAjIEl0IGV4aXN0cyBsYXJnZWx5IHRvIGNvcnJlY3Qgb3RoZXIgcGVvcGxlJ3MgZmFpbHVyZXMgdG8gcmVhZCB0aGUKKyAgICAjIHNwZWNpZmljYXRpb25zLCBhbmQgYWxzbyB0byBkZWFsIHdpdGggY2FjaGluZyBpc3N1ZXMgc2luY2Ugc2V2ZXJhbAorICAgICMgZGlmZmVyZW50IFVSSXMgbWF5IHJlcHJlc2VudCB0aGUgc2FtZSByZXNvdXJjZSBhbmQgc2hvdWxkIG5vdCBiZQorICAgICMgY2FjaGVkIG11bHRpcGxlIHRpbWVzLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIFRoZSBub3JtYWxpemVkIFVSSS4KKyAgICBkZWYgbm9ybWFsaXplCisgICAgICAjIFRoaXMgaXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgdGhlIGZyZXF1ZW50bHkgbWlzdXNlZCBmZWVkCisgICAgICAjIFVSSSBzY2hlbWUuCisgICAgICBpZiBub3JtYWxpemVkX3NjaGVtZSA9PSAiZmVlZCIKKyAgICAgICAgaWYgc2VsZi50b19zID1+IC9eZmVlZDpcLypodHRwOlwvKi8KKyAgICAgICAgICByZXR1cm4gVVJJLnBhcnNlKAorICAgICAgICAgICAgc2VsZi50b19zWy9eZmVlZDpcLyooaHR0cDpcLyouKikvLCAxXQorICAgICAgICAgICkubm9ybWFsaXplCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHJldHVybiBzZWxmLmNsYXNzLm5ldygKKyAgICAgICAgOnNjaGVtZSA9PiBub3JtYWxpemVkX3NjaGVtZSwKKyAgICAgICAgOmF1dGhvcml0eSA9PiBub3JtYWxpemVkX2F1dGhvcml0eSwKKyAgICAgICAgOnBhdGggPT4gbm9ybWFsaXplZF9wYXRoLAorICAgICAgICA6cXVlcnkgPT4gbm9ybWFsaXplZF9xdWVyeSwKKyAgICAgICAgOmZyYWdtZW50ID0+IG5vcm1hbGl6ZWRfZnJhZ21lbnQKKyAgICAgICkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBEZXN0cnVjdGl2ZWx5IG5vcm1hbGl6ZXMgdGhpcyBVUkkgb2JqZWN0LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIFRoZSBub3JtYWxpemVkIFVSSS4KKyAgICAjCisgICAgIyBAc2VlIEFkZHJlc3NhYmxlOjpVUkkjbm9ybWFsaXplCisgICAgZGVmIG5vcm1hbGl6ZSEKKyAgICAgIHJlcGxhY2Vfc2VsZihzZWxmLm5vcm1hbGl6ZSkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBDcmVhdGVzIGEgVVJJIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIHVzZXJzLiBJZiBzZW1hbnRpYyBhdHRhY2tzIGFyZQorICAgICMgbGlrZWx5LCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHRyeSB0byBkZXRlY3QgdGhlc2UgYW5kIHdhcm4gdGhlIHVzZXIuCisgICAgIyBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzk4Ni50eHQiPlJGQyAzOTg2PC9hPiwKKyAgICAjIHNlY3Rpb24gNy42IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIEEgVVJJIHN1aXRhYmxlIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICAgIGRlZiBkaXNwbGF5X3VyaQorICAgICAgZGlzcGxheV91cmkgPSBzZWxmLm5vcm1hbGl6ZQorICAgICAgZGlzcGxheV91cmkuaG9zdCA9IDo6QWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZShkaXNwbGF5X3VyaS5ob3N0KQorICAgICAgcmV0dXJuIGRpc3BsYXlfdXJpCisgICAgZW5kCisKKyAgICAjIworICAgICMgUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgVVJJIG9iamVjdHMgYXJlIGVxdWFsLiBUaGlzIG1ldGhvZAorICAgICMgbm9ybWFsaXplcyBib3RoIFVSSXMgYmVmb3JlIGRvaW5nIHRoZSBjb21wYXJpc29uLCBhbmQgYWxsb3dzIGNvbXBhcmlzb24KKyAgICAjIGFnYWluc3QgPGNvZGU+U3RyaW5nczwvY29kZT4uCisgICAgIworICAgICMgQHBhcmFtIFtPYmplY3RdIHVyaSBUaGUgVVJJIHRvIGNvbXBhcmUuCisgICAgIworICAgICMgQHJldHVybiBbVHJ1ZUNsYXNzLCBGYWxzZUNsYXNzXQorICAgICMgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgVVJJcyBhcmUgZXF1aXZhbGVudCwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgIyAgIG90aGVyd2lzZS4KKyAgICBkZWYgPT09KHVyaSkKKyAgICAgIGlmIHVyaS5yZXNwb25kX3RvPyg6bm9ybWFsaXplKQorICAgICAgICB1cmlfc3RyaW5nID0gdXJpLm5vcm1hbGl6ZS50b19zCisgICAgICBlbHNlCisgICAgICAgIGJlZ2luCisgICAgICAgICAgdXJpX3N0cmluZyA9IDo6QWRkcmVzc2FibGU6OlVSSS5wYXJzZSh1cmkpLm5vcm1hbGl6ZS50b19zCisgICAgICAgIHJlc2N1ZSBJbnZhbGlkVVJJRXJyb3IsIFR5cGVFcnJvcgorICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIHNlbGYubm9ybWFsaXplLnRvX3MgPT0gdXJpX3N0cmluZworICAgIGVuZAorCisgICAgIyMKKyAgICAjIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIFVSSSBvYmplY3RzIGFyZSBlcXVhbC4gVGhpcyBtZXRob2QKKyAgICAjIG5vcm1hbGl6ZXMgYm90aCBVUklzIGJlZm9yZSBkb2luZyB0aGUgY29tcGFyaXNvbi4KKyAgICAjCisgICAgIyBAcGFyYW0gW09iamVjdF0gdXJpIFRoZSBVUkkgdG8gY29tcGFyZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtUcnVlQ2xhc3MsIEZhbHNlQ2xhc3NdCisgICAgIyAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBVUklzIGFyZSBlcXVpdmFsZW50LCA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAjICAgb3RoZXJ3aXNlLgorICAgIGRlZiA9PSh1cmkpCisgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHVyaS5raW5kX29mPyhVUkkpCisgICAgICByZXR1cm4gc2VsZi5ub3JtYWxpemUudG9fcyA9PSB1cmkubm9ybWFsaXplLnRvX3MKKyAgICBlbmQKKworICAgICMjCisgICAgIyBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBVUkkgb2JqZWN0cyBhcmUgZXF1YWwuIFRoaXMgbWV0aG9kCisgICAgIyBkb2VzIE5PVCBub3JtYWxpemUgZWl0aGVyIFVSSSBiZWZvcmUgZG9pbmcgdGhlIGNvbXBhcmlzb24uCisgICAgIworICAgICMgQHBhcmFtIFtPYmplY3RdIHVyaSBUaGUgVVJJIHRvIGNvbXBhcmUuCisgICAgIworICAgICMgQHJldHVybiBbVHJ1ZUNsYXNzLCBGYWxzZUNsYXNzXQorICAgICMgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgVVJJcyBhcmUgZXF1aXZhbGVudCwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgIyAgIG90aGVyd2lzZS4KKyAgICBkZWYgZXFsPyh1cmkpCisgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHVyaS5raW5kX29mPyhVUkkpCisgICAgICByZXR1cm4gc2VsZi50b19zID09IHVyaS50b19zCisgICAgZW5kCisKKyAgICAjIworICAgICMgQSBoYXNoIHZhbHVlIHRoYXQgd2lsbCBtYWtlIGEgVVJJIGVxdWl2YWxlbnQgdG8gaXRzIG5vcm1hbGl6ZWQKKyAgICAjIGZvcm0uCisgICAgIworICAgICMgQHJldHVybiBbSW50ZWdlcl0gQSBoYXNoIG9mIHRoZSBVUkkuCisgICAgZGVmIGhhc2gKKyAgICAgIEBoYXNoIHx8PSBzZWxmLnRvX3MuaGFzaCAqIC0xCisgICAgZW5kCisKKyAgICAjIworICAgICMgQ2xvbmVzIHRoZSBVUkkgb2JqZWN0LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIFRoZSBjbG9uZWQgVVJJLgorICAgIGRlZiBkdXAKKyAgICAgIGR1cGxpY2F0ZWRfdXJpID0gc2VsZi5jbGFzcy5uZXcoCisgICAgICAgIDpzY2hlbWUgPT4gc2VsZi5zY2hlbWUgPyBzZWxmLnNjaGVtZS5kdXAgOiBuaWwsCisgICAgICAgIDp1c2VyID0+IHNlbGYudXNlciA/IHNlbGYudXNlci5kdXAgOiBuaWwsCisgICAgICAgIDpwYXNzd29yZCA9PiBzZWxmLnBhc3N3b3JkID8gc2VsZi5wYXNzd29yZC5kdXAgOiBuaWwsCisgICAgICAgIDpob3N0ID0+IHNlbGYuaG9zdCA/IHNlbGYuaG9zdC5kdXAgOiBuaWwsCisgICAgICAgIDpwb3J0ID0+IHNlbGYucG9ydCwKKyAgICAgICAgOnBhdGggPT4gc2VsZi5wYXRoID8gc2VsZi5wYXRoLmR1cCA6IG5pbCwKKyAgICAgICAgOnF1ZXJ5ID0+IHNlbGYucXVlcnkgPyBzZWxmLnF1ZXJ5LmR1cCA6IG5pbCwKKyAgICAgICAgOmZyYWdtZW50ID0+IHNlbGYuZnJhZ21lbnQgPyBzZWxmLmZyYWdtZW50LmR1cCA6IG5pbAorICAgICAgKQorICAgICAgcmV0dXJuIGR1cGxpY2F0ZWRfdXJpCisgICAgZW5kCisKKyAgICAjIworICAgICMgT21pdHMgY29tcG9uZW50cyBmcm9tIGEgVVJJLgorICAgICMKKyAgICAjIEBwYXJhbSBbU3ltYm9sXSAqY29tcG9uZW50cyBUaGUgY29tcG9uZW50cyB0byBiZSBvbWl0dGVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FkZHJlc3NhYmxlOjpVUkldIFRoZSBVUkkgd2l0aCBjb21wb25lbnRzIG9taXR0ZWQuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL3BhdGg/cXVlcnkiKQorICAgICMgICAjPT4gIzxBZGRyZXNzYWJsZTo6VVJJOjB4Y2M1ZTdhIFVSSTpodHRwOi8vZXhhbXBsZS5jb20vcGF0aD9xdWVyeT4KKyAgICAjICAgdXJpLm9taXQoOnNjaGVtZSwgOmF1dGhvcml0eSkKKyAgICAjICAgIz0+ICM8QWRkcmVzc2FibGU6OlVSSToweGNjNGQ4NiBVUkk6L3BhdGg/cXVlcnk+CisgICAgZGVmIG9taXQoKmNvbXBvbmVudHMpCisgICAgICBpbnZhbGlkX2NvbXBvbmVudHMgPSBjb21wb25lbnRzIC0gWworICAgICAgICA6c2NoZW1lLCA6dXNlciwgOnBhc3N3b3JkLCA6dXNlcmluZm8sIDpob3N0LCA6cG9ydCwgOmF1dGhvcml0eSwKKyAgICAgICAgOnBhdGgsIDpxdWVyeSwgOmZyYWdtZW50CisgICAgICBdCisgICAgICB1bmxlc3MgaW52YWxpZF9jb21wb25lbnRzLmVtcHR5PworICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLAorICAgICAgICAgICJJbnZhbGlkIGNvbXBvbmVudCBuYW1lczogI3tpbnZhbGlkX2NvbXBvbmVudHMuaW5zcGVjdH0uIgorICAgICAgZW5kCisgICAgICBkdXBsaWNhdGVkX3VyaSA9IHNlbGYuZHVwCisgICAgICBkdXBsaWNhdGVkX3VyaS5kZWZlcl92YWxpZGF0aW9uIGRvCisgICAgICAgIGNvbXBvbmVudHMuZWFjaCBkbyB8Y29tcG9uZW50fAorICAgICAgICAgIGR1cGxpY2F0ZWRfdXJpLnNlbmQoKGNvbXBvbmVudC50b19zICsgIj0iKS50b19zeW0sIG5pbCkKKyAgICAgICAgZW5kCisgICAgICAgIGR1cGxpY2F0ZWRfdXJpLnVzZXIgPSBkdXBsaWNhdGVkX3VyaS5ub3JtYWxpemVkX3VzZXIKKyAgICAgIGVuZAorICAgICAgZHVwbGljYXRlZF91cmkKKyAgICBlbmQKKworICAgICMjCisgICAgIyBEZXN0cnVjdGl2ZSBmb3JtIG9mIG9taXQuCisgICAgIworICAgICMgQHBhcmFtIFtTeW1ib2xdICpjb21wb25lbnRzIFRoZSBjb21wb25lbnRzIHRvIGJlIG9taXR0ZWQuCisgICAgIworICAgICMgQHJldHVybiBbQWRkcmVzc2FibGU6OlVSSV0gVGhlIFVSSSB3aXRoIGNvbXBvbmVudHMgb21pdHRlZC4KKyAgICAjCisgICAgIyBAc2VlIEFkZHJlc3NhYmxlOjpVUkkjb21pdAorICAgIGRlZiBvbWl0ISgqY29tcG9uZW50cykKKyAgICAgIHJlcGxhY2Vfc2VsZihzZWxmLm9taXQoKmNvbXBvbmVudHMpKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIERldGVybWluZXMgaWYgdGhlIFVSSSBpcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgIworICAgICMgQHJldHVybiBbVHJ1ZUNsYXNzLCBGYWxzZUNsYXNzXQorICAgICMgICBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVtcHR5LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgIGRlZiBlbXB0eT8KKyAgICAgIHJldHVybiBzZWxmLnRvX3MuZW1wdHk/CisgICAgZW5kCisKKyAgICAjIworICAgICMgQ29udmVydHMgdGhlIFVSSSB0byBhIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgVVJJJ3MgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbi4KKyAgICBkZWYgdG9fcworICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gbmlsICYmIHNlbGYucGF0aCAhPSBuaWwgJiYgIXNlbGYucGF0aC5lbXB0eT8gJiYKKyAgICAgICAgICBzZWxmLnBhdGggPX4gTk9STVBBVEgKKyAgICAgICAgcmFpc2UgSW52YWxpZFVSSUVycm9yLAorICAgICAgICAgICJDYW5ub3QgYXNzZW1ibGUgVVJJIHN0cmluZyB3aXRoIGFtYmlndW91cyBwYXRoOiAnI3tzZWxmLnBhdGh9JyIKKyAgICAgIGVuZAorICAgICAgQHVyaV9zdHJpbmcgfHw9IGJlZ2luCisgICAgICAgIHVyaV9zdHJpbmcgPSBTdHJpbmcubmV3CisgICAgICAgIHVyaV9zdHJpbmcgPDwgIiN7c2VsZi5zY2hlbWV9OiIgaWYgc2VsZi5zY2hlbWUgIT0gbmlsCisgICAgICAgIHVyaV9zdHJpbmcgPDwgIi8vI3tzZWxmLmF1dGhvcml0eX0iIGlmIHNlbGYuYXV0aG9yaXR5ICE9IG5pbAorICAgICAgICB1cmlfc3RyaW5nIDw8IHNlbGYucGF0aC50b19zCisgICAgICAgIHVyaV9zdHJpbmcgPDwgIj8je3NlbGYucXVlcnl9IiBpZiBzZWxmLnF1ZXJ5ICE9IG5pbAorICAgICAgICB1cmlfc3RyaW5nIDw8ICIjI3tzZWxmLmZyYWdtZW50fSIgaWYgc2VsZi5mcmFnbWVudCAhPSBuaWwKKyAgICAgICAgdXJpX3N0cmluZy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpCisgICAgICAgIHVyaV9zdHJpbmcKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFVSSSdzIGFyZSBnbG9yaWZpZWQgPGNvZGU+U3RyaW5nczwvY29kZT4uIEFsbG93IGltcGxpY2l0IGNvbnZlcnNpb24uCisgICAgYWxpYXNfbWV0aG9kIDp0b19zdHIsIDp0b19zCisKKyAgICAjIworICAgICMgUmV0dXJucyBhIEhhc2ggb2YgdGhlIFVSSSBjb21wb25lbnRzLgorICAgICMKKyAgICAjIEByZXR1cm4gW0hhc2hdIFRoZSBVUkkgYXMgYSA8Y29kZT5IYXNoPC9jb2RlPiBvZiBjb21wb25lbnRzLgorICAgIGRlZiB0b19oYXNoCisgICAgICByZXR1cm4geworICAgICAgICA6c2NoZW1lID0+IHNlbGYuc2NoZW1lLAorICAgICAgICA6dXNlciA9PiBzZWxmLnVzZXIsCisgICAgICAgIDpwYXNzd29yZCA9PiBzZWxmLnBhc3N3b3JkLAorICAgICAgICA6aG9zdCA9PiBzZWxmLmhvc3QsCisgICAgICAgIDpwb3J0ID0+IHNlbGYucG9ydCwKKyAgICAgICAgOnBhdGggPT4gc2VsZi5wYXRoLAorICAgICAgICA6cXVlcnkgPT4gc2VsZi5xdWVyeSwKKyAgICAgICAgOmZyYWdtZW50ID0+IHNlbGYuZnJhZ21lbnQKKyAgICAgIH0KKyAgICBlbmQKKworICAgICMjCisgICAgIyBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJJIG9iamVjdCdzIHN0YXRlLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIFVSSSBvYmplY3QncyBzdGF0ZSwgYXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgIGRlZiBpbnNwZWN0CisgICAgICBzcHJpbnRmKCIjPCVzOiUjMHggVVJJOiVzPiIsIFVSSS50b19zLCBzZWxmLm9iamVjdF9pZCwgc2VsZi50b19zKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gbWFrZSBzZXZlcmFsIGNoYW5nZXMgdG8gYSBVUkkgc2ltdWx0YW5lb3VzbHksCisgICAgIyB3aGljaCBzZXBhcmF0ZWx5IHdvdWxkIGNhdXNlIHZhbGlkYXRpb24gZXJyb3JzLCBidXQgaW4gY29uanVuY3Rpb24sCisgICAgIyBhcmUgdmFsaWQuICBUaGUgVVJJIHdpbGwgYmUgcmV2YWxpZGF0ZWQgYXMgc29vbiBhcyB0aGUgZW50aXJlIGJsb2NrIGhhcworICAgICMgYmVlbiBleGVjdXRlZC4KKyAgICAjCisgICAgIyBAcGFyYW0gW1Byb2NdIGJsb2NrCisgICAgIyAgIEEgc2V0IG9mIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIGdpdmVuIFVSSS4KKyAgICBkZWYgZGVmZXJfdmFsaWRhdGlvbigmYmxvY2spCisgICAgICByYWlzZSBMb2NhbEp1bXBFcnJvciwgIk5vIGJsb2NrIGdpdmVuLiIgdW5sZXNzIGJsb2NrCisgICAgICBAdmFsaWRhdGlvbl9kZWZlcnJlZCA9IHRydWUKKyAgICAgIGJsb2NrLmNhbGwoKQorICAgICAgQHZhbGlkYXRpb25fZGVmZXJyZWQgPSBmYWxzZQorICAgICAgdmFsaWRhdGUKKyAgICAgIHJldHVybiBuaWwKKyAgICBlbmQKKworICBwcm90ZWN0ZWQKKyAgICBTRUxGX1JFRiA9ICcuJworICAgIFBBUkVOVCA9ICcuLicKKworICAgIFJVTEVfMkEgPSAvXC9cLlwvfFwvXC4kLworICAgIFJVTEVfMkJfMkMgPSAvXC8oW15cL10qKVwvXC5cLlwvfFwvKFteXC9dKilcL1wuXC4kLworICAgIFJVTEVfMkQgPSAvXlwuXC4/XC8/LworICAgIFJVTEVfUFJFRklYRURfUEFSRU5UID0gL15cL1wuXC4/XC98XihcL1wuXC4/KStcLz8kLworCisgICAgIyMKKyAgICAjIFJlc29sdmVzIHBhdGhzIHRvIHRoZWlyIHNpbXBsZXN0IGZvcm0uCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmddIHBhdGggVGhlIHBhdGggdG8gbm9ybWFsaXplLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIG5vcm1hbGl6ZWQgcGF0aC4KKyAgICBkZWYgc2VsZi5ub3JtYWxpemVfcGF0aChwYXRoKQorICAgICAgIyBTZWN0aW9uIDUuMi40IG9mIFJGQyAzOTg2CisKKyAgICAgIHJldHVybiBuaWwgaWYgcGF0aC5uaWw/CisgICAgICBub3JtYWxpemVkX3BhdGggPSBwYXRoLmR1cAorICAgICAgYmVnaW4KKyAgICAgICAgbW9kID0gbmlsCisgICAgICAgIG1vZCB8fD0gbm9ybWFsaXplZF9wYXRoLmdzdWIhKFJVTEVfMkEsIFNMQVNIKQorCisgICAgICAgIHBhaXIgPSBub3JtYWxpemVkX3BhdGgubWF0Y2goUlVMRV8yQl8yQykKKyAgICAgICAgcGFyZW50LCBjdXJyZW50ID0gcGFpclsxXSwgcGFpclsyXSBpZiBwYWlyCisgICAgICAgIGlmIHBhaXIgJiYgKChwYXJlbnQgIT0gU0VMRl9SRUYgJiYgcGFyZW50ICE9IFBBUkVOVCkgfHwKKyAgICAgICAgICAgIChjdXJyZW50ICE9IFNFTEZfUkVGICYmIGN1cnJlbnQgIT0gUEFSRU5UKSkKKyAgICAgICAgICBtb2QgfHw9IG5vcm1hbGl6ZWRfcGF0aC5nc3ViISgKKyAgICAgICAgICAgIFJlZ2V4cC5uZXcoCisgICAgICAgICAgICAgICIvI3tSZWdleHAuZXNjYXBlKHBhcmVudC50b19zKX0vXFwuXFwuL3wiICsKKyAgICAgICAgICAgICAgIigvI3tSZWdleHAuZXNjYXBlKGN1cnJlbnQudG9fcyl9L1xcLlxcLiQpIgorICAgICAgICAgICAgKSwgU0xBU0gKKyAgICAgICAgICApCisgICAgICAgIGVuZAorCisgICAgICAgIG1vZCB8fD0gbm9ybWFsaXplZF9wYXRoLmdzdWIhKFJVTEVfMkQsIEVNUFRZX1NUUikKKyAgICAgICAgIyBOb24tc3RhbmRhcmQsIHJlbW92ZXMgcHJlZml4ZWQgZG90dGVkIHNlZ21lbnRzIGZyb20gcGF0aC4KKyAgICAgICAgbW9kIHx8PSBub3JtYWxpemVkX3BhdGguZ3N1YiEoUlVMRV9QUkVGSVhFRF9QQVJFTlQsIFNMQVNIKQorICAgICAgZW5kIHVudGlsIG1vZC5uaWw/CisKKyAgICAgIHJldHVybiBub3JtYWxpemVkX3BhdGgKKyAgICBlbmQKKworICAgICMjCisgICAgIyBFbnN1cmVzIHRoYXQgdGhlIFVSSSBpcyB2YWxpZC4KKyAgICBkZWYgdmFsaWRhdGUKKyAgICAgIHJldHVybiBpZiAhIUB2YWxpZGF0aW9uX2RlZmVycmVkCisgICAgICBpZiBzZWxmLnNjaGVtZSAhPSBuaWwgJiYgc2VsZi5pcF9iYXNlZD8gJiYKKyAgICAgICAgICAoc2VsZi5ob3N0ID09IG5pbCB8fCBzZWxmLmhvc3QuZW1wdHk/KSAmJgorICAgICAgICAgIChzZWxmLnBhdGggPT0gbmlsIHx8IHNlbGYucGF0aC5lbXB0eT8pCisgICAgICAgIHJhaXNlIEludmFsaWRVUklFcnJvciwKKyAgICAgICAgICAiQWJzb2x1dGUgVVJJIG1pc3NpbmcgaGllcmFyY2hpY2FsIHNlZ21lbnQ6ICcje3NlbGYudG9fc30nIgorICAgICAgZW5kCisgICAgICBpZiBzZWxmLmhvc3QgPT0gbmlsCisgICAgICAgIGlmIHNlbGYucG9ydCAhPSBuaWwgfHwKKyAgICAgICAgICAgIHNlbGYudXNlciAhPSBuaWwgfHwKKyAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgIT0gbmlsCisgICAgICAgICAgcmFpc2UgSW52YWxpZFVSSUVycm9yLCAiSG9zdG5hbWUgbm90IHN1cHBsaWVkOiAnI3tzZWxmLnRvX3N9JyIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGlmIHNlbGYucGF0aCAhPSBuaWwgJiYgIXNlbGYucGF0aC5lbXB0eT8gJiYgc2VsZi5wYXRoWzAuLjBdICE9IFNMQVNIICYmCisgICAgICAgICAgc2VsZi5hdXRob3JpdHkgIT0gbmlsCisgICAgICAgIHJhaXNlIEludmFsaWRVUklFcnJvciwKKyAgICAgICAgICAiQ2Fubm90IGhhdmUgYSByZWxhdGl2ZSBwYXRoIHdpdGggYW4gYXV0aG9yaXR5IHNldDogJyN7c2VsZi50b19zfSciCisgICAgICBlbmQKKyAgICAgIGlmIHNlbGYucGF0aCAhPSBuaWwgJiYgIXNlbGYucGF0aC5lbXB0eT8gJiYKKyAgICAgICAgICBzZWxmLnBhdGhbMC4uMV0gPT0gU0xBU0ggKyBTTEFTSCAmJiBzZWxmLmF1dGhvcml0eSA9PSBuaWwKKyAgICAgICAgcmFpc2UgSW52YWxpZFVSSUVycm9yLAorICAgICAgICAgICJDYW5ub3QgaGF2ZSBhIHBhdGggd2l0aCB0d28gbGVhZGluZyBzbGFzaGVzICIgKworICAgICAgICAgICJ3aXRob3V0IGFuIGF1dGhvcml0eSBzZXQ6ICcje3NlbGYudG9fc30nIgorICAgICAgZW5kCisgICAgICB1bnJlc2VydmVkID0gQ2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRAorICAgICAgc3ViX2RlbGltcyA9IENoYXJhY3RlckNsYXNzZXM6OlNVQl9ERUxJTVMKKyAgICAgIGlmICFzZWxmLmhvc3QubmlsPyAmJiAoc2VsZi5ob3N0ID1+IC9bPD57fVwvXFxcP1wjXEAiW1s6c3BhY2U6XV1dLyB8fAorICAgICAgICAgIChzZWxmLmhvc3RbL15cWyguKilcXSQvLCAxXSAhPSBuaWwgJiYgc2VsZi5ob3N0Wy9eXFsoLiopXF0kLywgMV0gIX4KKyAgICAgICAgICBSZWdleHAubmV3KCJeWyN7dW5yZXNlcnZlZH0je3N1Yl9kZWxpbXN9Ol0qJCIpKSkKKyAgICAgICAgcmFpc2UgSW52YWxpZFVSSUVycm9yLCAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaG9zdDogJyN7c2VsZi5ob3N0LnRvX3N9JyIKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIG5pbAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFJlcGxhY2VzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBzZWxmIHdpdGggdGhlIHNwZWNpZmllZCBVUkkncyBzdGF0ZS4KKyAgICAjIFVzZWQgaW4gZGVzdHJ1Y3RpdmUgb3BlcmF0aW9ucyB0byBhdm9pZCBtYXNzaXZlIGNvZGUgcmVwZXRpdGlvbi4KKyAgICAjCisgICAgIyBAcGFyYW0gW0FkZHJlc3NhYmxlOjpVUkldIHVyaSBUaGUgVVJJIHRvIHJlcGxhY2UgPGNvZGU+c2VsZjwvY29kZT4gd2l0aC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBZGRyZXNzYWJsZTo6VVJJXSA8Y29kZT5zZWxmPC9jb2RlPi4KKyAgICBkZWYgcmVwbGFjZV9zZWxmKHVyaSkKKyAgICAgICMgUmVzZXQgZGVwZW5kZW50IHZhbHVlcworICAgICAgaW5zdGFuY2VfdmFyaWFibGVzLmVhY2ggZG8gfHZhcnwKKyAgICAgICAgaWYgaW5zdGFuY2VfdmFyaWFibGVfZGVmaW5lZD8odmFyKSAmJiB2YXIgIT0gOkB2YWxpZGF0aW9uX2RlZmVycmVkCisgICAgICAgICAgcmVtb3ZlX2luc3RhbmNlX3ZhcmlhYmxlKHZhcikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgQHNjaGVtZSA9IHVyaS5zY2hlbWUKKyAgICAgIEB1c2VyID0gdXJpLnVzZXIKKyAgICAgIEBwYXNzd29yZCA9IHVyaS5wYXNzd29yZAorICAgICAgQGhvc3QgPSB1cmkuaG9zdAorICAgICAgQHBvcnQgPSB1cmkucG9ydAorICAgICAgQHBhdGggPSB1cmkucGF0aAorICAgICAgQHF1ZXJ5ID0gdXJpLnF1ZXJ5CisgICAgICBAZnJhZ21lbnQgPSB1cmkuZnJhZ21lbnQKKyAgICAgIHJldHVybiBzZWxmCisgICAgZW5kCisKKyAgICAjIworICAgICMgU3BsaXRzIHBhdGggc3RyaW5nIHdpdGggIi8iIChzbGFzaCkuCisgICAgIyBJdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlcmUgaXMgZW1wdHkgc3RyaW5nIGFmdGVyIGxhc3Qgc2xhc2ggd2hlbgorICAgICMgcGF0aCBlbmRzIHdpdGggc2xhc2guCisgICAgIworICAgICMgQHBhcmFtIFtTdHJpbmddIHBhdGggVGhlIHBhdGggdG8gc3BsaXQuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nPl0gQW4gYXJyYXkgb2YgcGFydHMgb2YgcGF0aC4KKyAgICBkZWYgc3BsaXRfcGF0aChwYXRoKQorICAgICAgc3BsaXR0ZWQgPSBwYXRoLnNwbGl0KFNMQVNIKQorICAgICAgc3BsaXR0ZWQgPDwgRU1QVFlfU1RSIGlmIHBhdGguZW5kX3dpdGg/IFNMQVNICisgICAgICBzcGxpdHRlZAorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFJlc2V0cyBjb21wb3NpdGUgdmFsdWVzIGZvciB0aGUgZW50aXJlIFVSSQorICAgICMKKyAgICAjIEBhcGkgcHJpdmF0ZQorICAgIGRlZiByZW1vdmVfY29tcG9zaXRlX3ZhbHVlcworICAgICAgcmVtb3ZlX2luc3RhbmNlX3ZhcmlhYmxlKDpAdXJpX3N0cmluZykgaWYgZGVmaW5lZD8oQHVyaV9zdHJpbmcpCisgICAgICByZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUoOkBoYXNoKSBpZiBkZWZpbmVkPyhAaGFzaCkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvbGliL2FkZHJlc3NhYmxlL3ZlcnNpb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyODQ2NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL2xpYi9hZGRyZXNzYWJsZS92ZXJzaW9uLnJiCkBAIC0wLDAgKzEsMzAgQEAKKyMgZW5jb2Rpbmc6dXRmLTgKKyMtLQorIyBDb3B5cmlnaHQgKEMpIEJvYiBBbWFuCisjCisjICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjKysKKworCisjIFVzZWQgdG8gcHJldmVudCB0aGUgY2xhc3MvbW9kdWxlIGZyb20gYmVpbmcgbG9hZGVkIG1vcmUgdGhhbiBvbmNlCitpZiAhZGVmaW5lZD8oQWRkcmVzc2FibGU6OlZFUlNJT04pCisgIG1vZHVsZSBBZGRyZXNzYWJsZQorICAgIG1vZHVsZSBWRVJTSU9OCisgICAgICBNQUpPUiA9IDIKKyAgICAgIE1JTk9SID0gNQorICAgICAgVElOWSAgPSAyCisKKyAgICAgIFNUUklORyA9IFtNQUpPUiwgTUlOT1IsIFRJTlldLmpvaW4oJy4nKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS9pZG5hX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9zcGVjL2FkZHJlc3NhYmxlL2lkbmFfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQ3ZWMzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS9pZG5hX3NwZWMucmIKQEAgLTAsMCArMSwyOTggQEAKKyMgY29kaW5nOiB1dGYtOAorIyBDb3B5cmlnaHQgKEMpIEJvYiBBbWFuCisjCisjICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworcmVxdWlyZSAic3BlY19oZWxwZXIiCisKKyMgSGF2ZSB0byB1c2UgUnVieUdlbXMgdG8gbG9hZCB0aGUgaWRuIGdlbS4KK3JlcXVpcmUgInJ1YnlnZW1zIgorCityZXF1aXJlICJhZGRyZXNzYWJsZS9pZG5hIgorCitzaGFyZWRfZXhhbXBsZXNfZm9yICJjb252ZXJ0aW5nIGZyb20gdW5pY29kZSB0byBBU0NJSSIgZG8KKyAgaXQgInNob3VsZCBjb252ZXJ0ICd3d3cuZ29vZ2xlLmNvbScgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b19hc2NpaSgid3d3Lmdvb2dsZS5jb20iKSkudG8gZXEoInd3dy5nb29nbGUuY29tIikKKyAgZW5kCisKKyAgTE9ORyA9ICdBY2ludXNGYWxsdW1Ucm9tcGV0dW1OdWxsdW5DcmVkaXR1bVZpc3VtRXN0QXRDdWFkTG9uZ3VtRXRDZWZhbGx1bS5jb20nCisgIGl0ICJzaG91bGQgY29udmVydCAnI3tMT05HfScgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b19hc2NpaShMT05HKSkudG8gZXEoTE9ORykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0ICd3d3cu6Km55aeG5pavLmNvbScgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b19hc2NpaSgKKyAgICAgICJ3d3cu6Km55aeG5pavLmNvbSIKKyAgICApKS50byBlcSgid3d3LnhuLS04d3MwMHpoeTNhLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29udmVydCAnd3d3LknDsXTDq3Juw6J0acO0bsOgbGl6w6Z0acO4bi5jb20nIGNvcnJlY3RseSIgZG8KKyAgICAid3d3LknDsXTDq3Juw6J0acO0bsOgbGl6w6Z0acO4bi5jb20iCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpJRE5BLnRvX2FzY2lpKAorICAgICAgInd3dy5JXHhDM1x4QjF0XHhDM1x4QUJyblx4QzNceEEydGlceEMzXHhCNCIgKworICAgICAgIm5ceEMzXHhBMGxpelx4QzNceEE2dGlceEMzXHhCOG4uY29tIgorICAgICkpLnRvIGVxKCJ3d3cueG4tLWl0cm50aW5saXp0aW4tdmRiMGE1ZXhkOGV3Y3llLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29udmVydCAnd3d3LknDsXTDq3Juw6J0acO0bsOgbGl6w6Z0acO4bi5jb20nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAid3d3LkluXHhDQ1x4ODN0ZVx4Q0NceDg4cm5hXHhDQ1x4ODJ0aW9ceENDXHg4Mm4iICsKKyAgICAgICJhXHhDQ1x4ODBsaXpceEMzXHhBNnRpXHhDM1x4QjhuLmNvbSIKKyAgICApKS50byBlcSgid3d3LnhuLS1pdHJudGlubGl6dGluLXZkYjBhNWV4ZDhld2N5ZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgIiArCisgICAgICAiJ3d3dy7jgbvjgpPjgajjgYbjgavjgarjgYzjgYTjgo/jgZHjga7jgo/jgYvjgonjgarjgYTjganjgoHjgYTjgpPjgoHjgYTjga7jgonjgbnjgovjgb7jgaDjgarjgYzjgY/jgZfjgarjgYTjgajjgZ/jgorjgarjgYQudzMubWFnLmtlaW8uYWMuanAnICIgKworICAgICAgImNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAid3d3LlwzNDNcMjAxXDI3M1wzNDNcMjAyXDIyM1wzNDNcMjAxXDI1MFwzNDNcMjAxXDIwNlwzNDNcMjAxXDI1M1wzNDMiICsKKyAgICAgICJcMjAxXDI1MlwzNDNcMjAxXDIxNFwzNDNcMjAxXDIwNFwzNDNcMjAyXDIxN1wzNDNcMjAxXDIyMVwzNDNcMjAxXDI1NiIgKworICAgICAgIlwzNDNcMjAyXDIxN1wzNDNcMjAxXDIxM1wzNDNcMjAyXDIxMVwzNDNcMjAxXDI1MlwzNDNcMjAxXDIwNFwzNDNcMjAxIiArCisgICAgICAiXDI1MVwzNDNcMjAyXDIwMVwzNDNcMjAxXDIwNFwzNDNcMjAyXDIyM1wzNDNcMjAyXDIwMVwzNDNcMjAxXDIwNFwzNDMiICsKKyAgICAgICJcMjAxXDI1NlwzNDNcMjAyXDIxMVwzNDNcMjAxXDI3MVwzNDNcMjAyXDIxM1wzNDNcMjAxXDI3NlwzNDNcMjAxXDI0MCIgKworICAgICAgIlwzNDNcMjAxXDI1MlwzNDNcMjAxXDIxNFwzNDNcMjAxXDIxN1wzNDNcMjAxXDIyN1wzNDNcMjAxXDI1MlwzNDNcMjAxIiArCisgICAgICAiXDIwNFwzNDNcMjAxXDI1MFwzNDNcMjAxXDIzN1wzNDNcMjAyXDIxMlwzNDNcMjAxXDI1MlwzNDNcMjAxXDIwNC4iICsKKyAgICAgICJ3My5tYWcua2Vpby5hYy5qcCIKKyAgICApKS50byBlcSgKKyAgICAgICJ3d3cueG4tLW44amFhYWFhaTViaGY3YXM4ZnNmazNqbmtuZWZkZGUzIiArCisgICAgICAiZmcxMWFtYjVnemRiNHdpOWJ5YTNrYzZscmEudzMubWFnLmtlaW8uYWMuanAiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgIiArCisgICAgICAiJ3d3dy7jgbvjgpPjgajjgYbjgavjgarjgYzjgYTjgo/jgZHjga7jgo/jgYvjgonjgarjgYTjganjgoHjgYTjgpPjgoHjgYTjga7jgonjgbnjgovjgb7jgaDjgarjgYzjgY/jgZfjgarjgYTjgajjgZ/jgorjgarjgYQudzMubWFnLmtlaW8uYWMuanAnICIgKworICAgICAgImNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAid3d3LlwzNDNcMjAxXDI3M1wzNDNcMjAyXDIyM1wzNDNcMjAxXDI1MFwzNDNcMjAxXDIwNlwzNDNcMjAxXDI1M1wzNDMiICsKKyAgICAgICJcMjAxXDI1MlwzNDNcMjAxXDIxM1wzNDNcMjAyXDIzMVwzNDNcMjAxXDIwNFwzNDNcMjAyXDIxN1wzNDNcMjAxXDIyMSIgKworICAgICAgIlwzNDNcMjAxXDI1NlwzNDNcMjAyXDIxN1wzNDNcMjAxXDIxM1wzNDNcMjAyXDIxMVwzNDNcMjAxXDI1MlwzNDNcMjAxIiArCisgICAgICAiXDIwNFwzNDNcMjAxXDI1MFwzNDNcMjAyXDIzMVwzNDNcMjAyXDIwMVwzNDNcMjAxXDIwNFwzNDNcMjAyXDIyM1wzNDMiICsKKyAgICAgICJcMjAyXDIwMVwzNDNcMjAxXDIwNFwzNDNcMjAxXDI1NlwzNDNcMjAyXDIxMVwzNDNcMjAxXDI3MFwzNDNcMjAyXDIzMSIgKworICAgICAgIlwzNDNcMjAyXDIxM1wzNDNcMjAxXDI3NlwzNDNcMjAxXDIzN1wzNDNcMjAyXDIzMVwzNDNcMjAxXDI1MlwzNDNcMjAxIiArCisgICAgICAiXDIxM1wzNDNcMjAyXDIzMVwzNDNcMjAxXDIxN1wzNDNcMjAxXDIyN1wzNDNcMjAxXDI1MlwzNDNcMjAxXDIwNFwzNDMiICsKKyAgICAgICJcMjAxXDI1MFwzNDNcMjAxXDIzN1wzNDNcMjAyXDIxMlwzNDNcMjAxXDI1MlwzNDNcMjAxXDIwNC4iICsKKyAgICAgICJ3My5tYWcua2Vpby5hYy5qcCIKKyAgICApKS50byBlcSgKKyAgICAgICJ3d3cueG4tLW44amFhYWFhaTViaGY3YXM4ZnNmazNqbmtuZWZkZGUzIiArCisgICAgICAiZmcxMWFtYjVnemRiNHdpOWJ5YTNrYzZscmEudzMubWFnLmtlaW8uYWMuanAiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ+eCueW/g+WSjOeDpOm4rS53My5tYWcua2Vpby5hYy5qcCcgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b19hc2NpaSgKKyAgICAgICLngrnlv4Plkozng6TpuK0udzMubWFnLmtlaW8uYWMuanAiCisgICAgKSkudG8gZXEoInhuLS0wdHJ2NHhmdm44ZWwzNHQudzMubWFnLmtlaW8uYWMuanAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ+qwgOqwgeqwguqwg+qwhOqwheqwhuqwh+qwiOqwie2eou2eoy5jb20nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAi6rCA6rCB6rCC6rCD6rCE6rCF6rCG6rCH6rCI6rCJ7Z6i7Z6jLmNvbSIKKyAgICApKS50byBlcSgieG4tLW8zOWFjZGVmZ2hpams1ODgzam1hLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29udmVydCAiICsKKyAgICAgICInXDM0N1wyNDJcMjc0XDM0NlwyNTBcMjMxXDM0NlwyNzJcMjI2XDM1MCIgKworICAgICAgIlwyMjBcMjU0XDM0NVwyMzRcMjEzXDM0N1wyNDJcMjc0LmNvbScgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b19hc2NpaSgKKyAgICAgICJcMzQ3XDI0MlwyNzRcMzQ2XDI1MFwyMzFcMzQ2XDI3MlwyMjZcMzUwIiArCisgICAgICAiXDIyMFwyNTRcMzQ1XDIzNFwyMTNcMzQ3XDI0MlwyNzQuY29tIgorICAgICkpLnRvIGVxKCJ4bi0tOWNzNTY1YnJpZDQ2bWRhMDg2by5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ+++mOWuoO2QseOAuS5jb20nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAiXDM1N1wyNzZcMjMwXDM0NVwyNTZcMjQwXDM1NVwyMjBcMjYxXDM0M1wyMDBcMjcxLmNvbSIKKyAgICApKS50byBlcSgieG4tLWVlazE3NGhveGZwcjRrLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29udmVydCAn44Oq5a6g7ZCx5Y2ELmNvbScgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b19hc2NpaSgKKyAgICAgICJcMzQzXDIwM1wyNTJcMzQ1XDI1NlwyNDBcMzU1XDIyMFwyNjFcMzQ1XDIxNVwyMDQuY29tIgorICAgICkpLnRvIGVxKCJ4bi0tZWVrMTc0aG94ZnByNGsuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0ICfhhrUnIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAiXDM0MVwyMDZcMjY1IgorICAgICkpLnRvIGVxKCJ4bi0tNHVkIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0ICfvvq8nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAiXDM1N1wyNzZcMjU3IgorICAgICkpLnRvIGVxKCJ4bi0tNHVkIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0ICfwn4y58J+MufCfjLkud3MnIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fYXNjaWkoCisgICAgICAiXDM2MFwyMzdcMjE0XDI3MVwzNjBcMjM3XDIxNFwyNzFcMzYwXDIzN1wyMTRcMjcxLndzIgorICAgICkpLnRvIGVxKCJ4bi0tMmg4aGFhLndzIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYW5kbGUgdHdvIGFkamFjZW50ICcuJ3MgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b19hc2NpaSgKKyAgICAgICJleGFtcGxlLi5ob3N0IgorICAgICkpLnRvIGVxKCJleGFtcGxlLi5ob3N0IikKKyAgZW5kCitlbmQKKworc2hhcmVkX2V4YW1wbGVzX2ZvciAiY29udmVydGluZyBmcm9tIEFTQ0lJIHRvIHVuaWNvZGUiIGRvCisgIExPTkcgPSAnQWNpbnVzRmFsbHVtVHJvbXBldHVtTnVsbHVuQ3JlZGl0dW1WaXN1bUVzdEF0Q3VhZExvbmd1bUV0Q2VmYWxsdW0uY29tJworICBpdCAic2hvdWxkIGNvbnZlcnQgJyN7TE9OR30nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZShMT05HKSkudG8gZXEoTE9ORykKKyAgZW5kCisKKyAgaXQgInNob3VsZCByZXR1cm4gdGhlIGlkZW50aXR5IGNvbnZlcnNpb24gd2hlbiBwdW55Y29kZSBkZWNvZGUgZmFpbHMiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpJRE5BLnRvX3VuaWNvZGUoInhuLS16Y2twMWN5ZzEuc2Jsby5qcCIpKS50byBlcSgKKyAgICAgICJ4bi0temNrcDFjeWcxLnNibG8uanAiKQorICBlbmQKKworICBpdCAic2hvdWxkIHJldHVybiB0aGUgaWRlbnRpdHkgY29udmVyc2lvbiB3aGVuIHRoZSBBQ0UgcHJlZml4IGhhcyBubyBzdWZmaXgiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpJRE5BLnRvX3VuaWNvZGUoInhuLS0uLi4tIikpLnRvIGVxKCJ4bi0tLi4uLSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29udmVydCAnd3d3Lmdvb2dsZS5jb20nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZSgid3d3Lmdvb2dsZS5jb20iKSkudG8gZXEoCisgICAgICAid3d3Lmdvb2dsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ3d3dy7oqbnlp4bmlq8uY29tJyBjb3JyZWN0bHkiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpJRE5BLnRvX3VuaWNvZGUoCisgICAgICAid3d3LnhuLS04d3MwMHpoeTNhLmNvbSIKKyAgICApKS50byBlcSgid3d3LuipueWnhuaWry5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ+ipueWnhuaWry5jb20nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZSgKKyAgICAgICJ4bi0tOHdzMDB6aHkzYS5jb20iCisgICAgKSkudG8gZXEoIuipueWnhuaWry5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ3d3dy5pw7F0w6tybsOidGnDtG7DoGxpesOmdGnDuG4uY29tJyBjb3JyZWN0bHkiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpJRE5BLnRvX3VuaWNvZGUoCisgICAgICAid3d3LnhuLS1pdHJudGlubGl6dGluLXZkYjBhNWV4ZDhld2N5ZS5jb20iCisgICAgKSkudG8gZXEoInd3dy5pw7F0w6tybsOidGnDtG7DoGxpesOmdGnDuG4uY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0ICdpw7F0w6tybsOidGnDtG7DoGxpesOmdGnDuG4uY29tJyBjb3JyZWN0bHkiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpJRE5BLnRvX3VuaWNvZGUoCisgICAgICAieG4tLWl0cm50aW5saXp0aW4tdmRiMGE1ZXhkOGV3Y3llLmNvbSIKKyAgICApKS50byBlcSgiacOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7huLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29udmVydCAiICsKKyAgICAgICInd3d3LuOBu+OCk+OBqOOBhuOBq+OBquOBjOOBhOOCj+OBkeOBruOCj+OBi+OCieOBquOBhOOBqeOCgeOBhOOCk+OCgeOBhOOBruOCieOBueOCi+OBvuOBoOOBquOBjOOBj+OBl+OBquOBhOOBqOOBn+OCiuOBquOBhC53My5tYWcua2Vpby5hYy5qcCcgIiArCisgICAgICAiY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b191bmljb2RlKAorICAgICAgInd3dy54bi0tbjhqYWFhYWFpNWJoZjdhczhmc2ZrM2pua25lZmRkZTMiICsKKyAgICAgICJmZzExYW1iNWd6ZGI0d2k5YnlhM2tjNmxyYS53My5tYWcua2Vpby5hYy5qcCIKKyAgICApKS50byBlcSgKKyAgICAgICJ3d3cu44G744KT44Go44GG44Gr44Gq44GM44GE44KP44GR44Gu44KP44GL44KJ44Gq44GE44Gp44KB44GE44KT44KB44GE44Gu44KJ44G544KL44G+44Gg44Gq44GM44GP44GX44Gq44GE44Go44Gf44KK44Gq44GELnczLm1hZy5rZWlvLmFjLmpwIgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0ICfngrnlv4Plkozng6TpuK0udzMubWFnLmtlaW8uYWMuanAnIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZSgKKyAgICAgICJ4bi0tMHRydjR4ZnZuOGVsMzR0LnczLm1hZy5rZWlvLmFjLmpwIgorICAgICkpLnRvIGVxKCLngrnlv4Plkozng6TpuK0udzMubWFnLmtlaW8uYWMuanAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ+qwgOqwgeqwguqwg+qwhOqwheqwhuqwh+qwiOqwie2eou2eoy5jb20nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZSgKKyAgICAgICJ4bi0tbzM5YWNkZWZnaGlqazU4ODNqbWEuY29tIgorICAgICkpLnRvIGVxKCLqsIDqsIHqsILqsIPqsITqsIXqsIbqsIfqsIjqsIntnqLtnqMuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0ICIgKworICAgICAgIidcMzQ3XDI0MlwyNzRcMzQ2XDI1MFwyMzFcMzQ2XDI3MlwyMjZcMzUwIiArCisgICAgICAiXDIyMFwyNTRcMzQ1XDIzNFwyMTNcMzQ3XDI0MlwyNzQuY29tJyBjb3JyZWN0bHkiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpJRE5BLnRvX3VuaWNvZGUoCisgICAgICAieG4tLTljczU2NWJyaWQ0Nm1kYTA4Nm8uY29tIgorICAgICkpLnRvIGVxKAorICAgICAgIlwzNDdcMjQyXDI3NFwzNDZcMjUwXDIzMVwzNDZcMjcyXDIyNlwzNTAiICsKKyAgICAgICJcMjIwXDI1NFwzNDVcMjM0XDIxM1wzNDdcMjQyXDI3NC5jb20iCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ+ODquWuoO2QseWNhC5jb20nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZSgKKyAgICAgICJ4bi0tZWVrMTc0aG94ZnByNGsuY29tIgorICAgICkpLnRvIGVxKCJcMzQzXDIwM1wyNTJcMzQ1XDI1NlwyNDBcMzU1XDIyMFwyNjFcMzQ1XDIxNVwyMDQuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0ICfvvq8nIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZSgKKyAgICAgICJ4bi0tNHVkIgorICAgICkpLnRvIGVxKCJcMzQxXDIwNlwyNjUiKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgJ/CfjLnwn4y58J+MuS53cycgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS50b191bmljb2RlKAorICAgICAgInhuLS0yaDhoYWEud3MiCisgICAgKSkudG8gZXEoIlwzNjBcMjM3XDIxNFwyNzFcMzYwXDIzN1wyMTRcMjcxXDM2MFwyMzdcMjE0XDI3MS53cyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGFuZGxlIHR3byBhZGphY2VudCAnLidzIGNvcnJlY3RseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudG9fdW5pY29kZSgKKyAgICAgICJleGFtcGxlLi5ob3N0IgorICAgICkpLnRvIGVxKCJleGFtcGxlLi5ob3N0IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3JtYWxpemUgJ3N0cmluZycgY29ycmVjdGx5IiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6SUROQS51bmljb2RlX25vcm1hbGl6ZV9rYyg6J3N0cmluZycpKS50byBlcSgic3RyaW5nIikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OklETkEudW5pY29kZV9ub3JtYWxpemVfa2MoInN0cmluZyIpKS50byBlcSgic3RyaW5nIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OklETkEsICJ3aGVuIHVzaW5nIHRoZSBwdXJlLVJ1YnkgaW1wbGVtZW50YXRpb24iIGRvCisgIGJlZm9yZSBkbworICAgIEFkZHJlc3NhYmxlLnNlbmQoOnJlbW92ZV9jb25zdCwgOklETkEpCisgICAgbG9hZCAiYWRkcmVzc2FibGUvaWRuYS9wdXJlLnJiIgorICBlbmQKKworICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImNvbnZlcnRpbmcgZnJvbSB1bmljb2RlIHRvIEFTQ0lJIgorICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImNvbnZlcnRpbmcgZnJvbSBBU0NJSSB0byB1bmljb2RlIgorCisgIGJlZ2luCisgICAgcmVxdWlyZSAiZmliZXIiCisKKyAgICBpdCAic2hvdWxkIG5vdCBibG93IHVwIGluc2lkZSBmaWJlcnMiIGRvCisgICAgICBmID0gRmliZXIubmV3IGRvCisgICAgICAgIEFkZHJlc3NhYmxlLnNlbmQoOnJlbW92ZV9jb25zdCwgOklETkEpCisgICAgICAgIGxvYWQgImFkZHJlc3NhYmxlL2lkbmEvcHVyZS5yYiIKKyAgICAgIGVuZAorICAgICAgZi5yZXN1bWUKKyAgICBlbmQKKyAgcmVzY3VlIExvYWRFcnJvcgorICAgICMgRmliZXJzIGFyZW4ndCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIFJ1YnksIHNraXAgdGhpcyB0ZXN0LgorICAgIHdhcm4oJ0ZpYmVycyB1bnN1cHBvcnRlZC4nKQorICBlbmQKK2VuZAorCitiZWdpbgorICByZXF1aXJlICJpZG4iCisKKyAgZGVzY3JpYmUgQWRkcmVzc2FibGU6OklETkEsICJ3aGVuIHVzaW5nIHRoZSBuYXRpdmUtY29kZSBpbXBsZW1lbnRhdGlvbiIgZG8KKyAgICBiZWZvcmUgZG8KKyAgICAgIEFkZHJlc3NhYmxlLnNlbmQoOnJlbW92ZV9jb25zdCwgOklETkEpCisgICAgICBsb2FkICJhZGRyZXNzYWJsZS9pZG5hL25hdGl2ZS5yYiIKKyAgICBlbmQKKworICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAiY29udmVydGluZyBmcm9tIHVuaWNvZGUgdG8gQVNDSUkiCisgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJjb252ZXJ0aW5nIGZyb20gQVNDSUkgdG8gdW5pY29kZSIKKyAgZW5kCityZXNjdWUgTG9hZEVycm9yCisgICMgQ2Fubm90IHRlc3QgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IGxpYmlkbiBzdXBwb3J0LgorICB3YXJuKCdDb3VsZCBub3QgbG9hZCBuYXRpdmUgSUROIGltcGxlbWVudGF0aW9uLicpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3NwZWMvYWRkcmVzc2FibGUvbmV0X2h0dHBfY29tcGF0X3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9zcGVjL2FkZHJlc3NhYmxlL25ldF9odHRwX2NvbXBhdF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTNmODYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9zcGVjL2FkZHJlc3NhYmxlL25ldF9odHRwX2NvbXBhdF9zcGVjLnJiCkBAIC0wLDAgKzEsMjggQEAKKyMgY29kaW5nOiB1dGYtOAorIyBDb3B5cmlnaHQgKEMpIEJvYiBBbWFuCisjCisjICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworcmVxdWlyZSAic3BlY19oZWxwZXIiCisKK3JlcXVpcmUgImFkZHJlc3NhYmxlL3VyaSIKK3JlcXVpcmUgIm5ldC9odHRwIgorCitkZXNjcmliZSBOZXQ6OkhUVFAgZG8KKyAgaXQgInNob3VsZCBiZSBjb21wYXRpYmxlIHdpdGggQWRkcmVzc2FibGUiIGRvCisgICAgcmVzcG9uc2VfYm9keSA9CisgICAgICBOZXQ6OkhUVFAuZ2V0KEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoJ2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS8nKSkKKyAgICBleHBlY3QocmVzcG9uc2VfYm9keSkubm90X3RvIGJlX25pbAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS9yYWNrX21vdW50X2NvbXBhdF9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS9yYWNrX21vdW50X2NvbXBhdF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMmE0YWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9zcGVjL2FkZHJlc3NhYmxlL3JhY2tfbW91bnRfY29tcGF0X3NwZWMucmIKQEAgLTAsMCArMSwxMDQgQEAKKyMgY29kaW5nOiB1dGYtOAorIyBDb3B5cmlnaHQgKEMpIEJvYiBBbWFuCisjCisjICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworcmVxdWlyZSAic3BlY19oZWxwZXIiCisKK3JlcXVpcmUgImFkZHJlc3NhYmxlL3VyaSIKK3JlcXVpcmUgImFkZHJlc3NhYmxlL3RlbXBsYXRlIgorcmVxdWlyZSAicmFjay9tb3VudCIKKworZGVzY3JpYmUgUmFjazo6TW91bnQgZG8KKyAgbGV0KDphcHBfb25lKSBkbworICAgIHByb2MgeyB8ZW52fCBbMjAwLCB7J0NvbnRlbnQtVHlwZScgPT4gJ3RleHQvcGxhaW4nfSwgJ1JvdXRlIDEnXSB9CisgIGVuZAorICBsZXQoOmFwcF90d28pIGRvCisgICAgcHJvYyB7IHxlbnZ8IFsyMDAsIHsnQ29udGVudC1UeXBlJyA9PiAndGV4dC9wbGFpbid9LCAnUm91dGUgMiddIH0KKyAgZW5kCisgIGxldCg6YXBwX3RocmVlKSBkbworICAgIHByb2MgeyB8ZW52fCBbMjAwLCB7J0NvbnRlbnQtVHlwZScgPT4gJ3RleHQvcGxhaW4nfSwgJ1JvdXRlIDMnXSB9CisgIGVuZAorICBsZXQoOnJvdXRlcykgZG8KKyAgICBzID0gUmFjazo6TW91bnQ6OlJvdXRlU2V0Lm5ldyBkbyB8c2V0fAorICAgICAgc2V0LmFkZF9yb3V0ZShhcHBfb25lLCB7CisgICAgICAgIDpyZXF1ZXN0X21ldGhvZCA9PiAnR0VUJywKKyAgICAgICAgOnBhdGhfaW5mbyA9PiBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCcvb25lL3tpZH0vJykKKyAgICAgIH0sIHs6aWQgPT4gJ3VuaWRlbnRpZmllZCd9LCA6b25lKQorICAgICAgc2V0LmFkZF9yb3V0ZShhcHBfdHdvLCB7CisgICAgICAgIDpyZXF1ZXN0X21ldGhvZCA9PiAnR0VUJywKKyAgICAgICAgOnBhdGhfaW5mbyA9PiBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCcvdHdvLycpCisgICAgICB9LCB7OmlkID0+ICd1bmlkZW50aWZpZWQnfSwgOnR3bykKKyAgICAgIHNldC5hZGRfcm91dGUoYXBwX3RocmVlLCB7CisgICAgICAgIDpyZXF1ZXN0X21ldGhvZCA9PiAnR0VUJywKKyAgICAgICAgOnBhdGhfaW5mbyA9PiBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCcvdGhyZWUve2lkfS8nKS50b19yZWdleHAKKyAgICAgIH0sIHs6aWQgPT4gJ3VuaWRlbnRpZmllZCd9LCA6dGhyZWUpCisgICAgZW5kCisgICAgcy5yZWhhc2gKKyAgICBzCisgIGVuZAorCisgIGl0ICJzaG91bGQgZ2VuZXJhdGUgZnJvbSByb3V0ZXMgd2l0aCBBZGRyZXNzYWJsZTo6VGVtcGxhdGUiIGRvCisgICAgcGF0aCwgXyA9IHJvdXRlcy5nZW5lcmF0ZSg6cGF0aF9pbmZvLCA6b25lLCB7OmlkID0+ICcxMjMnfSkKKyAgICBleHBlY3QocGF0aCkudG8gZXEgJy9vbmUvMTIzLycKKyAgZW5kCisKKyAgaXQgInNob3VsZCBnZW5lcmF0ZSBmcm9tIHJvdXRlcyB3aXRoIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZSB1c2luZyBkZWZhdWx0cyIgZG8KKyAgICBwYXRoLCBfID0gcm91dGVzLmdlbmVyYXRlKDpwYXRoX2luZm8sIDpvbmUsIHt9KQorICAgIGV4cGVjdChwYXRoKS50byBlcSAnL29uZS91bmlkZW50aWZpZWQvJworICBlbmQKKworICBpdCAic2hvdWxkIHJlY29nbml6ZSByb3V0ZXMgd2l0aCBBZGRyZXNzYWJsZTo6VGVtcGxhdGUiIGRvCisgICAgcmVxdWVzdCA9IFJhY2s6OlJlcXVlc3QubmV3KAorICAgICAgJ1JFUVVFU1RfTUVUSE9EJyA9PiAnR0VUJywKKyAgICAgICdQQVRIX0lORk8nID0+ICcvb25lLzEyMy8nCisgICAgKQorICAgIHJvdXRlLCBfLCBwYXJhbXMgPSByb3V0ZXMucmVjb2duaXplKHJlcXVlc3QpCisgICAgZXhwZWN0KHJvdXRlKS5ub3RfdG8gYmVfbmlsCisgICAgZXhwZWN0KHJvdXRlLmFwcCkudG8gZXEgYXBwX29uZQorICAgIGV4cGVjdChwYXJhbXMpLnRvIGVxKHtpZDogJzEyMyd9KQorICBlbmQKKworICBpdCAic2hvdWxkIGdlbmVyYXRlIGZyb20gcm91dGVzIHdpdGggQWRkcmVzc2FibGU6OlRlbXBsYXRlIiBkbworICAgIHBhdGgsIF8gPSByb3V0ZXMuZ2VuZXJhdGUoOnBhdGhfaW5mbywgOnR3bywgezppZCA9PiAnNjU0J30pCisgICAgZXhwZWN0KHBhdGgpLnRvIGVxICcvdHdvLycKKyAgZW5kCisKKyAgaXQgInNob3VsZCBnZW5lcmF0ZSBmcm9tIHJvdXRlcyB3aXRoIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZSB1c2luZyBkZWZhdWx0cyIgZG8KKyAgICBwYXRoLCBfID0gcm91dGVzLmdlbmVyYXRlKDpwYXRoX2luZm8sIDp0d28sIHt9KQorICAgIGV4cGVjdChwYXRoKS50byBlcSAnL3R3by8nCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVjb2duaXplIHJvdXRlcyB3aXRoIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZSIgZG8KKyAgICByZXF1ZXN0ID0gUmFjazo6UmVxdWVzdC5uZXcoCisgICAgICAnUkVRVUVTVF9NRVRIT0QnID0+ICdHRVQnLAorICAgICAgJ1BBVEhfSU5GTycgPT4gJy90d28vJworICAgICkKKyAgICByb3V0ZSwgXywgcGFyYW1zID0gcm91dGVzLnJlY29nbml6ZShyZXF1ZXN0KQorICAgIGV4cGVjdChyb3V0ZSkubm90X3RvIGJlX25pbAorICAgIGV4cGVjdChyb3V0ZS5hcHApLnRvIGVxIGFwcF90d28KKyAgICBleHBlY3QocGFyYW1zKS50byBlcSh7aWQ6ICd1bmlkZW50aWZpZWQnfSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCByZWNvZ25pemUgcm91dGVzIHdpdGggZGVyaXZlZCBSZWdleHAiIGRvCisgICAgcmVxdWVzdCA9IFJhY2s6OlJlcXVlc3QubmV3KAorICAgICAgJ1JFUVVFU1RfTUVUSE9EJyA9PiAnR0VUJywKKyAgICAgICdQQVRIX0lORk8nID0+ICcvdGhyZWUvNzg5LycKKyAgICApCisgICAgcm91dGUsIF8sIHBhcmFtcyA9IHJvdXRlcy5yZWNvZ25pemUocmVxdWVzdCkKKyAgICBleHBlY3Qocm91dGUpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3Qocm91dGUuYXBwKS50byBlcSBhcHBfdGhyZWUKKyAgICBleHBlY3QocGFyYW1zKS50byBlcSh7aWQ6ICc3ODknfSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3NwZWMvYWRkcmVzc2FibGUvc2VjdXJpdHlfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3NwZWMvYWRkcmVzc2FibGUvc2VjdXJpdHlfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjc1NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS9zZWN1cml0eV9zcGVjLnJiCkBAIC0wLDAgKzEsNTcgQEAKKyMgY29kaW5nOiB1dGYtOAorIyBDb3B5cmlnaHQgKEMpIEJvYiBBbWFuCisjCisjICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworcmVxdWlyZSAic3BlY19oZWxwZXIiCisKK3JlcXVpcmUgImFkZHJlc3NhYmxlL3VyaSIKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGEgVVJJIGtub3duIHRvIGNhdXNlIGNyYXNoZXMgIiArCisgICAgImluIGNlcnRhaW4gYnJvd3NlcnMiIGRvCisgIGl0ICJzaG91bGQgcGFyc2UgY29ycmVjdGx5IiBkbworICAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoJyUlMzAlMzAnKQorICAgIGV4cGVjdCh1cmkucGF0aCkudG8gZXEoJyUlMzAlMzAnKQorICAgIGV4cGVjdCh1cmkubm9ybWFsaXplLnBhdGgpLnRvIGVxKCclMjUwMCcpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcGFyc2UgY29ycmVjdGx5IGFzIGEgZnVsbCBVUkkiIGRvCisgICAgdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgnaHR0cDovL3d3dy5leGFtcGxlLmNvbS8lJTMwJTMwJykKKyAgICBleHBlY3QodXJpLnBhdGgpLnRvIGVxKCcvJSUzMCUzMCcpCisgICAgZXhwZWN0KHVyaS5ub3JtYWxpemUucGF0aCkudG8gZXEoJy8lMjUwMCcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhIFVSSSBrbm93biB0byBjYXVzZSBjcmFzaGVzICIgKworICAgICJpbiBjZXJ0YWluIGJyb3dzZXJzIiBkbworICBpdCAic2hvdWxkIHBhcnNlIGNvcnJlY3RseSIgZG8KKyAgICB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCfZhNmP2LXZkdio2Y/ZhNmP2YTYtdmR2KjZj9ix2LHZiyDgpaMg4KWjaCDgpaMg4KWjIOWGlycpCisgICAgZXhwZWN0KHVyaS5wYXRoKS50byBlcSgn2YTZj9i12ZHYqNmP2YTZj9mE2LXZkdio2Y/Ysdix2Ysg4KWjIOClo2gg4KWjIOCloyDlhpcnKQorICAgIGV4cGVjdCh1cmkubm9ybWFsaXplLnBhdGgpLnRvIGVxKAorICAgICAgJyVEOSU4NCVEOSU4RiVEOCVCNSVEOSU5MSVEOCVBOCVEOSU4RiVEOSU4NCVEOSU4RiVEOSU4NCVEOCVCNSVEOSU5MScgKworICAgICAgJyVEOCVBOCVEOSU4RiVEOCVCMSVEOCVCMSVEOSU4QiUyMCVFMCVBNSVBMyUyMCVFMCVBNSVBM2glMjAlRTAlQTUnICsKKyAgICAgICclQTMlMjAlRTAlQTUlQTMlMjAlRTUlODYlOTcnCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIHBhcnNlIGNvcnJlY3RseSBhcyBhIGZ1bGwgVVJJIiBkbworICAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20v2YTZj9i12ZHYqNmP2YTZj9mE2LXZkdio2Y/Ysdix2Ysg4KWjIOClo2gg4KWjIOCloyDlhpcnKQorICAgIGV4cGVjdCh1cmkucGF0aCkudG8gZXEoJy/ZhNmP2LXZkdio2Y/ZhNmP2YTYtdmR2KjZj9ix2LHZiyDgpaMg4KWjaCDgpaMg4KWjIOWGlycpCisgICAgZXhwZWN0KHVyaS5ub3JtYWxpemUucGF0aCkudG8gZXEoCisgICAgICAnLyVEOSU4NCVEOSU4RiVEOCVCNSVEOSU5MSVEOCVBOCVEOSU4RiVEOSU4NCVEOSU4RiVEOSU4NCVEOCVCNSVEOSU5MScgKworICAgICAgJyVEOCVBOCVEOSU4RiVEOCVCMSVEOCVCMSVEOSU4QiUyMCVFMCVBNSVBMyUyMCVFMCVBNSVBM2glMjAlRTAlQTUnICsKKyAgICAgICclQTMlMjAlRTAlQTUlQTMlMjAlRTUlODYlOTcnCisgICAgKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS90ZW1wbGF0ZV9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS90ZW1wbGF0ZV9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOGFiMTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9zcGVjL2FkZHJlc3NhYmxlL3RlbXBsYXRlX3NwZWMucmIKQEAgLTAsMCArMSwxNDE5IEBACisjIGNvZGluZzogdXRmLTgKKyMgQ29weXJpZ2h0IChDKSBCb2IgQW1hbgorIworIyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK3JlcXVpcmUgInNwZWNfaGVscGVyIgorCityZXF1aXJlICJiaWdkZWNpbWFsIgorcmVxdWlyZSAiYWRkcmVzc2FibGUvdGVtcGxhdGUiCisKK3NoYXJlZF9leGFtcGxlc19mb3IgJ2V4cGFuZHMnIGRvIHx0ZXN0c3wKKyAgdGVzdHMuZWFjaCBkbyB8dGVtcGxhdGUsIGV4cGFuc2lvbnwKKyAgICBleHAgPSBleHBhbnNpb24uaXNfYT8oQXJyYXkpID8gZXhwYW5zaW9uLmZpcnN0IDogZXhwYW5zaW9uCisgICAgaXQgIiN7dGVtcGxhdGV9IHRvICN7ZXhwfSIgZG8KKyAgICAgIHRtcGwgPSBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KHRlbXBsYXRlKS5leHBhbmQoc3ViamVjdCkKKyAgICAgIGlmIGV4cGFuc2lvbi5pc19hPyhBcnJheSkKKyAgICAgICAgZXhwZWN0KGV4cGFuc2lvbi5hbnk/e3xpfCBpID09IHRtcGwudG9fc3RyfSkudG8gYmUgdHJ1ZQorICAgICAgZWxzZQorICAgICAgICBleHBlY3QodG1wbC50b19zdHIpLnRvIGVxKGV4cGFuc2lvbikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZAorCitkZXNjcmliZSAiZXFsPyIgZG8KKyAgbGV0KDp0ZW1wbGF0ZSkgeyBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCdodHRwczovL3d3dy5leGFtcGxlLmNvbS97Zm9vfScpIH0KKyAgaXQgJ2lzIGVxdWFsIHdoZW4gdGhlIHBhdHRlcm4gbWF0Y2hlcycgZG8KKyAgICBvdGhlcl90ZW1wbGF0ZSA9IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tL3tmb299JykKKyAgICBleHBlY3QodGVtcGxhdGUpLnRvIGJlX2VxbChvdGhlcl90ZW1wbGF0ZSkKKyAgICBleHBlY3Qob3RoZXJfdGVtcGxhdGUpLnRvIGJlX2VxbCh0ZW1wbGF0ZSkKKyAgZW5kCisgIGl0ICdpcyBub3QgZXF1YWwgd2hlbiB0aGUgcGF0dGVybiBkaWZmZXJzJyBkbworICAgIG90aGVyX3RlbXBsYXRlID0gQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20ve2Jhcn0nKQorICAgIGV4cGVjdCh0ZW1wbGF0ZSkudG9fbm90IGJlX2VxbChvdGhlcl90ZW1wbGF0ZSkKKyAgICBleHBlY3Qob3RoZXJfdGVtcGxhdGUpLnRvX25vdCBiZV9lcWwodGVtcGxhdGUpCisgIGVuZAorICBpdCAnaXMgbm90IGVxdWFsIHRvIG5vbi10ZW1wbGF0ZXMnIGRvCisgICAgdXJpID0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2Zvby9iYXInCisgICAgYWRkcmVzc2FibGVfdGVtcGxhdGUgPSBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3IHVyaQorICAgIGFkZHJlc3NhYmxlX3VyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UgdXJpCisgICAgZXhwZWN0KGFkZHJlc3NhYmxlX3RlbXBsYXRlKS50b19ub3QgYmVfZXFsKGFkZHJlc3NhYmxlX3VyaSkKKyAgICBleHBlY3QoYWRkcmVzc2FibGVfdXJpKS50b19ub3QgYmVfZXFsKGFkZHJlc3NhYmxlX3RlbXBsYXRlKQorICBlbmQKK2VuZAorCitkZXNjcmliZSAiPT0iIGRvCisgIGxldCg6dGVtcGxhdGUpIHsgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20ve2Zvb30nKSB9CisgIGl0ICdpcyBlcXVhbCB3aGVuIHRoZSBwYXR0ZXJuIG1hdGNoZXMnIGRvCisgICAgb3RoZXJfdGVtcGxhdGUgPSBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCdodHRwczovL3d3dy5leGFtcGxlLmNvbS97Zm9vfScpCisgICAgZXhwZWN0KHRlbXBsYXRlKS50byBlcSBvdGhlcl90ZW1wbGF0ZQorICAgIGV4cGVjdChvdGhlcl90ZW1wbGF0ZSkudG8gZXEgdGVtcGxhdGUKKyAgZW5kCisgIGl0ICdpcyBub3QgZXF1YWwgd2hlbiB0aGUgcGF0dGVybiBkaWZmZXJzJyBkbworICAgIG90aGVyX3RlbXBsYXRlID0gQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20ve2Jhcn0nKQorICAgIGV4cGVjdCh0ZW1wbGF0ZSkubm90X3RvIGVxIG90aGVyX3RlbXBsYXRlCisgICAgZXhwZWN0KG90aGVyX3RlbXBsYXRlKS5ub3RfdG8gZXEgdGVtcGxhdGUKKyAgZW5kCisgIGl0ICdpcyBub3QgZXF1YWwgdG8gbm9uLXRlbXBsYXRlcycgZG8KKyAgICB1cmkgPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vZm9vL2JhcicKKyAgICBhZGRyZXNzYWJsZV90ZW1wbGF0ZSA9IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcgdXJpCisgICAgYWRkcmVzc2FibGVfdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSB1cmkKKyAgICBleHBlY3QoYWRkcmVzc2FibGVfdGVtcGxhdGUpLm5vdF90byBlcSBhZGRyZXNzYWJsZV91cmkKKyAgICBleHBlY3QoYWRkcmVzc2FibGVfdXJpKS5ub3RfdG8gZXEgYWRkcmVzc2FibGVfdGVtcGxhdGUKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIlR5cGUgY29udmVyc2lvbiIgZG8KKyAgc3ViamVjdCB7CisgICAgeworICAgICAgOnZhciA9PiB0cnVlLAorICAgICAgOmhlbGxvID0+IDEyMzQsCisgICAgICA6bm90aGluZyA9PiBuaWwsCisgICAgICA6c3ltID0+IDpzeW1ib2xpYywKKyAgICAgIDpkZWNpbWFsID0+IEJpZ0RlY2ltYWwubmV3KCcxJykKKyAgICB9CisgIH0KKworICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgJ3t2YXJ9JyA9PiAndHJ1ZScsCisgICAgJ3toZWxsb30nID0+ICcxMjM0JywKKyAgICAne25vdGhpbmd9JyA9PiAnJywKKyAgICAne3N5bX0nID0+ICdzeW1ib2xpYycsCisgICAgJ3tkZWNpbWFsfScgPT4gUlVCWV9WRVJTSU9OIDwgJzIuNC4wJyA/ICcwLjFFMScgOiAnMC4xZTEnCisgIH0KK2VuZAorCitkZXNjcmliZSAiTGV2ZWwgMToiIGRvCisgIHN1YmplY3QgeworICAgIHs6dmFyID0+ICJ2YWx1ZSIsIDpoZWxsbyA9PiAiSGVsbG8gV29ybGQhIn0KKyAgfQorICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgJ3t2YXJ9JyA9PiAndmFsdWUnLAorICAgICd7aGVsbG99JyA9PiAnSGVsbG8lMjBXb3JsZCUyMScKKyAgfQorZW5kCisKK2Rlc2NyaWJlICJMZXZlbCAyIiBkbworICBzdWJqZWN0IHsKKyAgICB7CisgICAgICA6dmFyID0+ICJ2YWx1ZSIsCisgICAgICA6aGVsbG8gPT4gIkhlbGxvIFdvcmxkISIsCisgICAgICA6cGF0aCA9PiAiL2Zvby9iYXIiCisgICAgfQorICB9CisgIGNvbnRleHQgIk9wZXJhdG9yICs6IiBkbworICAgIGl0X2JlaGF2ZXNfbGlrZSAnZXhwYW5kcycsIHsKKyAgICAgICd7K3Zhcn0nID0+ICd2YWx1ZScsCisgICAgICAneytoZWxsb30nID0+ICdIZWxsbyUyMFdvcmxkIScsCisgICAgICAneytwYXRofS9oZXJlJyA9PiAnL2Zvby9iYXIvaGVyZScsCisgICAgICAnaGVyZT9yZWY9eytwYXRofScgPT4gJ2hlcmU/cmVmPS9mb28vYmFyJworICAgIH0KKyAgZW5kCisgIGNvbnRleHQgIk9wZXJhdG9yICM6IiBkbworICAgIGl0X2JlaGF2ZXNfbGlrZSAnZXhwYW5kcycsIHsKKyAgICAgICdYeyN2YXJ9JyA9PiAnWCN2YWx1ZScsCisgICAgICAnWHsjaGVsbG99JyA9PiAnWCNIZWxsbyUyMFdvcmxkIScKKyAgICB9CisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJMZXZlbCAzIiBkbworICBzdWJqZWN0IHsKKyAgICB7CisgICAgICA6dmFyID0+ICJ2YWx1ZSIsCisgICAgICA6aGVsbG8gPT4gIkhlbGxvIFdvcmxkISIsCisgICAgICA6ZW1wdHkgPT4gIiIsCisgICAgICA6cGF0aCA9PiAiL2Zvby9iYXIiLAorICAgICAgOnggPT4gIjEwMjQiLAorICAgICAgOnkgPT4gIjc2OCIKKyAgICB9CisgIH0KKyAgY29udGV4dCAiT3BlcmF0b3IgbmlsIChtdWx0aXBsZSB2YXJzKToiIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ21hcD97eCx5fScgPT4gJ21hcD8xMDI0LDc2OCcsCisgICAgICAne3gsaGVsbG8seX0nID0+ICcxMDI0LEhlbGxvJTIwV29ybGQlMjEsNzY4JworICAgIH0KKyAgZW5kCisgIGNvbnRleHQgIk9wZXJhdG9yICsgKG11bHRpcGxlIHZhcnMpOiIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAneyt4LGhlbGxvLHl9JyA9PiAnMTAyNCxIZWxsbyUyMFdvcmxkISw3NjgnLAorICAgICAgJ3srcGF0aCx4fS9oZXJlJyA9PiAnL2Zvby9iYXIsMTAyNC9oZXJlJworICAgIH0KKyAgZW5kCisgIGNvbnRleHQgIk9wZXJhdG9yICMgKG11bHRpcGxlIHZhcnMpOiIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAneyN4LGhlbGxvLHl9JyA9PiAnIzEwMjQsSGVsbG8lMjBXb3JsZCEsNzY4JywKKyAgICAgICd7I3BhdGgseH0vaGVyZScgPT4gJyMvZm9vL2JhciwxMDI0L2hlcmUnCisgICAgfQorICBlbmQKKyAgY29udGV4dCAiT3BlcmF0b3IgLiIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAnWHsudmFyfScgPT4gJ1gudmFsdWUnLAorICAgICAgJ1h7LngseX0nID0+ICdYLjEwMjQuNzY4JworICAgIH0KKyAgZW5kCisgIGNvbnRleHQgIk9wZXJhdG9yIC8iIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3svdmFyfScgPT4gJy92YWx1ZScsCisgICAgICAney92YXIseH0vaGVyZScgPT4gJy92YWx1ZS8xMDI0L2hlcmUnCisgICAgfQorICBlbmQKKyAgY29udGV4dCAiT3BlcmF0b3IgOyIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAnezt4LHl9JyA9PiAnO3g9MTAyNDt5PTc2OCcsCisgICAgICAnezt4LHksZW1wdHl9JyA9PiAnO3g9MTAyNDt5PTc2ODtlbXB0eScKKyAgICB9CisgIGVuZAorICBjb250ZXh0ICJPcGVyYXRvciA/IiBkbworICAgIGl0X2JlaGF2ZXNfbGlrZSAnZXhwYW5kcycsIHsKKyAgICAgICd7P3gseX0nID0+ICc/eD0xMDI0Jnk9NzY4JywKKyAgICAgICd7P3gseSxlbXB0eX0nID0+ICc/eD0xMDI0Jnk9NzY4JmVtcHR5PScKKyAgICB9CisgIGVuZAorICBjb250ZXh0ICJPcGVyYXRvciAmIiBkbworICAgIGl0X2JlaGF2ZXNfbGlrZSAnZXhwYW5kcycsIHsKKyAgICAgICc/Zml4ZWQ9eWVzeyZ4fScgPT4gJz9maXhlZD15ZXMmeD0xMDI0JywKKyAgICAgICd7JngseSxlbXB0eX0nID0+ICcmeD0xMDI0Jnk9NzY4JmVtcHR5PScKKyAgICB9CisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJMZXZlbCA0IiBkbworICBzdWJqZWN0IHsKKyAgICB7CisgICAgICA6dmFyID0+ICJ2YWx1ZSIsCisgICAgICA6aGVsbG8gPT4gIkhlbGxvIFdvcmxkISIsCisgICAgICA6cGF0aCA9PiAiL2Zvby9iYXIiLAorICAgICAgOnNlbWkgPT4gIjsiLAorICAgICAgOmxpc3QgPT4gJXcocmVkIGdyZWVuIGJsdWUpLAorICAgICAgOmtleXMgPT4geyJzZW1pIiA9PiAnOycsICJkb3QiID0+ICcuJywgImNvbW1hIiA9PiAnLCd9CisgICAgfQorICB9CisgIGNvbnRleHQgIkV4cGFuc2lvbiB3aXRoIHZhbHVlIG1vZGlmaWVycyIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAne3ZhcjozfScgPT4gJ3ZhbCcsCisgICAgICAne3ZhcjozMH0nID0+ICd2YWx1ZScsCisgICAgICAne2xpc3R9JyA9PiAncmVkLGdyZWVuLGJsdWUnLAorICAgICAgJ3tsaXN0Kn0nID0+ICdyZWQsZ3JlZW4sYmx1ZScsCisgICAgICAne2tleXN9JyA9PiBbCisgICAgICAgICdzZW1pLCUzQixkb3QsLixjb21tYSwlMkMnLAorICAgICAgICAnZG90LC4sc2VtaSwlM0IsY29tbWEsJTJDJywKKyAgICAgICAgJ2NvbW1hLCUyQyxzZW1pLCUzQixkb3QsLicsCisgICAgICAgICdzZW1pLCUzQixjb21tYSwlMkMsZG90LC4nLAorICAgICAgICAnZG90LC4sY29tbWEsJTJDLHNlbWksJTNCJywKKyAgICAgICAgJ2NvbW1hLCUyQyxkb3QsLixzZW1pLCUzQicKKyAgICAgIF0sCisgICAgICAne2tleXMqfScgPT4gWworICAgICAgICAnc2VtaT0lM0IsZG90PS4sY29tbWE9JTJDJywKKyAgICAgICAgJ2RvdD0uLHNlbWk9JTNCLGNvbW1hPSUyQycsCisgICAgICAgICdjb21tYT0lMkMsc2VtaT0lM0IsZG90PS4nLAorICAgICAgICAnc2VtaT0lM0IsY29tbWE9JTJDLGRvdD0uJywKKyAgICAgICAgJ2RvdD0uLGNvbW1hPSUyQyxzZW1pPSUzQicsCisgICAgICAgICdjb21tYT0lMkMsZG90PS4sc2VtaT0lM0InCisgICAgICBdCisgICAgfQorICBlbmQKKyAgY29udGV4dCAiT3BlcmF0b3IgKyB3aXRoIHZhbHVlIG1vZGlmaWVycyIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAneytwYXRoOjZ9L2hlcmUnID0+ICcvZm9vL2IvaGVyZScsCisgICAgICAneytsaXN0fScgPT4gJ3JlZCxncmVlbixibHVlJywKKyAgICAgICd7K2xpc3QqfScgPT4gJ3JlZCxncmVlbixibHVlJywKKyAgICAgICd7K2tleXN9JyA9PiBbCisgICAgICAgICdzZW1pLDssZG90LC4sY29tbWEsLCcsCisgICAgICAgICdkb3QsLixzZW1pLDssY29tbWEsLCcsCisgICAgICAgICdjb21tYSwsLHNlbWksOyxkb3QsLicsCisgICAgICAgICdzZW1pLDssY29tbWEsLCxkb3QsLicsCisgICAgICAgICdkb3QsLixjb21tYSwsLHNlbWksOycsCisgICAgICAgICdjb21tYSwsLGRvdCwuLHNlbWksOycKKyAgICAgIF0sCisgICAgICAneytrZXlzKn0nID0+IFsKKyAgICAgICAgJ3NlbWk9Oyxkb3Q9Lixjb21tYT0sJywKKyAgICAgICAgJ2RvdD0uLHNlbWk9Oyxjb21tYT0sJywKKyAgICAgICAgJ2NvbW1hPSwsc2VtaT07LGRvdD0uJywKKyAgICAgICAgJ3NlbWk9Oyxjb21tYT0sLGRvdD0uJywKKyAgICAgICAgJ2RvdD0uLGNvbW1hPSwsc2VtaT07JywKKyAgICAgICAgJ2NvbW1hPSwsZG90PS4sc2VtaT07JworICAgICAgXQorICAgIH0KKyAgZW5kCisgIGNvbnRleHQgIk9wZXJhdG9yICMgd2l0aCB2YWx1ZSBtb2RpZmllcnMiIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3sjcGF0aDo2fS9oZXJlJyA9PiAnIy9mb28vYi9oZXJlJywKKyAgICAgICd7I2xpc3R9JyA9PiAnI3JlZCxncmVlbixibHVlJywKKyAgICAgICd7I2xpc3QqfScgPT4gJyNyZWQsZ3JlZW4sYmx1ZScsCisgICAgICAneyNrZXlzfScgPT4gWworICAgICAgICAnI3NlbWksOyxkb3QsLixjb21tYSwsJywKKyAgICAgICAgJyNkb3QsLixzZW1pLDssY29tbWEsLCcsCisgICAgICAgICcjY29tbWEsLCxzZW1pLDssZG90LC4nLAorICAgICAgICAnI3NlbWksOyxjb21tYSwsLGRvdCwuJywKKyAgICAgICAgJyNkb3QsLixjb21tYSwsLHNlbWksOycsCisgICAgICAgICcjY29tbWEsLCxkb3QsLixzZW1pLDsnCisgICAgICBdLAorICAgICAgJ3sja2V5cyp9JyA9PiBbCisgICAgICAgICcjc2VtaT07LGRvdD0uLGNvbW1hPSwnLAorICAgICAgICAnI2RvdD0uLHNlbWk9Oyxjb21tYT0sJywKKyAgICAgICAgJyNjb21tYT0sLHNlbWk9Oyxkb3Q9LicsCisgICAgICAgICcjc2VtaT07LGNvbW1hPSwsZG90PS4nLAorICAgICAgICAnI2RvdD0uLGNvbW1hPSwsc2VtaT07JywKKyAgICAgICAgJyNjb21tYT0sLGRvdD0uLHNlbWk9OycKKyAgICAgIF0KKyAgICB9CisgIGVuZAorICBjb250ZXh0ICJPcGVyYXRvciAuIHdpdGggdmFsdWUgbW9kaWZpZXJzIiBkbworICAgIGl0X2JlaGF2ZXNfbGlrZSAnZXhwYW5kcycsIHsKKyAgICAgICdYey52YXI6M30nID0+ICdYLnZhbCcsCisgICAgICAnWHsubGlzdH0nID0+ICdYLnJlZCxncmVlbixibHVlJywKKyAgICAgICdYey5saXN0Kn0nID0+ICdYLnJlZC5ncmVlbi5ibHVlJywKKyAgICAgICdYey5rZXlzfScgPT4gWworICAgICAgICAnWC5zZW1pLCUzQixkb3QsLixjb21tYSwlMkMnLAorICAgICAgICAnWC5kb3QsLixzZW1pLCUzQixjb21tYSwlMkMnLAorICAgICAgICAnWC5jb21tYSwlMkMsc2VtaSwlM0IsZG90LC4nLAorICAgICAgICAnWC5zZW1pLCUzQixjb21tYSwlMkMsZG90LC4nLAorICAgICAgICAnWC5kb3QsLixjb21tYSwlMkMsc2VtaSwlM0InLAorICAgICAgICAnWC5jb21tYSwlMkMsZG90LC4sc2VtaSwlM0InCisgICAgICBdLAorICAgICAgJ1h7LmtleXMqfScgPT4gWworICAgICAgICAnWC5zZW1pPSUzQi5kb3Q9Li5jb21tYT0lMkMnLAorICAgICAgICAnWC5kb3Q9Li5zZW1pPSUzQi5jb21tYT0lMkMnLAorICAgICAgICAnWC5jb21tYT0lMkMuc2VtaT0lM0IuZG90PS4nLAorICAgICAgICAnWC5zZW1pPSUzQi5jb21tYT0lMkMuZG90PS4nLAorICAgICAgICAnWC5kb3Q9Li5jb21tYT0lMkMuc2VtaT0lM0InLAorICAgICAgICAnWC5jb21tYT0lMkMuZG90PS4uc2VtaT0lM0InCisgICAgICBdCisgICAgfQorICBlbmQKKyAgY29udGV4dCAiT3BlcmF0b3IgLyB3aXRoIHZhbHVlIG1vZGlmaWVycyIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAney92YXI6MSx2YXJ9JyA9PiAnL3YvdmFsdWUnLAorICAgICAgJ3svbGlzdH0nID0+ICcvcmVkLGdyZWVuLGJsdWUnLAorICAgICAgJ3svbGlzdCp9JyA9PiAnL3JlZC9ncmVlbi9ibHVlJywKKyAgICAgICd7L2xpc3QqLHBhdGg6NH0nID0+ICcvcmVkL2dyZWVuL2JsdWUvJTJGZm9vJywKKyAgICAgICd7L2tleXN9JyA9PiBbCisgICAgICAgICcvc2VtaSwlM0IsZG90LC4sY29tbWEsJTJDJywKKyAgICAgICAgJy9kb3QsLixzZW1pLCUzQixjb21tYSwlMkMnLAorICAgICAgICAnL2NvbW1hLCUyQyxzZW1pLCUzQixkb3QsLicsCisgICAgICAgICcvc2VtaSwlM0IsY29tbWEsJTJDLGRvdCwuJywKKyAgICAgICAgJy9kb3QsLixjb21tYSwlMkMsc2VtaSwlM0InLAorICAgICAgICAnL2NvbW1hLCUyQyxkb3QsLixzZW1pLCUzQicKKyAgICAgIF0sCisgICAgICAney9rZXlzKn0nID0+IFsKKyAgICAgICAgJy9zZW1pPSUzQi9kb3Q9Li9jb21tYT0lMkMnLAorICAgICAgICAnL2RvdD0uL3NlbWk9JTNCL2NvbW1hPSUyQycsCisgICAgICAgICcvY29tbWE9JTJDL3NlbWk9JTNCL2RvdD0uJywKKyAgICAgICAgJy9zZW1pPSUzQi9jb21tYT0lMkMvZG90PS4nLAorICAgICAgICAnL2RvdD0uL2NvbW1hPSUyQy9zZW1pPSUzQicsCisgICAgICAgICcvY29tbWE9JTJDL2RvdD0uL3NlbWk9JTNCJworICAgICAgXQorICAgIH0KKyAgZW5kCisgIGNvbnRleHQgIk9wZXJhdG9yIDsgd2l0aCB2YWx1ZSBtb2RpZmllcnMiIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3s7aGVsbG86NX0nID0+ICc7aGVsbG89SGVsbG8nLAorICAgICAgJ3s7bGlzdH0nID0+ICc7bGlzdD1yZWQsZ3JlZW4sYmx1ZScsCisgICAgICAneztsaXN0Kn0nID0+ICc7bGlzdD1yZWQ7bGlzdD1ncmVlbjtsaXN0PWJsdWUnLAorICAgICAgJ3s7a2V5c30nID0+IFsKKyAgICAgICAgJztrZXlzPXNlbWksJTNCLGRvdCwuLGNvbW1hLCUyQycsCisgICAgICAgICc7a2V5cz1kb3QsLixzZW1pLCUzQixjb21tYSwlMkMnLAorICAgICAgICAnO2tleXM9Y29tbWEsJTJDLHNlbWksJTNCLGRvdCwuJywKKyAgICAgICAgJztrZXlzPXNlbWksJTNCLGNvbW1hLCUyQyxkb3QsLicsCisgICAgICAgICc7a2V5cz1kb3QsLixjb21tYSwlMkMsc2VtaSwlM0InLAorICAgICAgICAnO2tleXM9Y29tbWEsJTJDLGRvdCwuLHNlbWksJTNCJworICAgICAgXSwKKyAgICAgICd7O2tleXMqfScgPT4gWworICAgICAgICAnO3NlbWk9JTNCO2RvdD0uO2NvbW1hPSUyQycsCisgICAgICAgICc7ZG90PS47c2VtaT0lM0I7Y29tbWE9JTJDJywKKyAgICAgICAgJztjb21tYT0lMkM7c2VtaT0lM0I7ZG90PS4nLAorICAgICAgICAnO3NlbWk9JTNCO2NvbW1hPSUyQztkb3Q9LicsCisgICAgICAgICc7ZG90PS47Y29tbWE9JTJDO3NlbWk9JTNCJywKKyAgICAgICAgJztjb21tYT0lMkM7ZG90PS47c2VtaT0lM0InCisgICAgICBdCisgICAgfQorICBlbmQKKyAgY29udGV4dCAiT3BlcmF0b3IgPyB3aXRoIHZhbHVlIG1vZGlmaWVycyIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAnez92YXI6M30nID0+ICc/dmFyPXZhbCcsCisgICAgICAnez9saXN0fScgPT4gJz9saXN0PXJlZCxncmVlbixibHVlJywKKyAgICAgICd7P2xpc3QqfScgPT4gJz9saXN0PXJlZCZsaXN0PWdyZWVuJmxpc3Q9Ymx1ZScsCisgICAgICAnez9rZXlzfScgPT4gWworICAgICAgICAnP2tleXM9c2VtaSwlM0IsZG90LC4sY29tbWEsJTJDJywKKyAgICAgICAgJz9rZXlzPWRvdCwuLHNlbWksJTNCLGNvbW1hLCUyQycsCisgICAgICAgICc/a2V5cz1jb21tYSwlMkMsc2VtaSwlM0IsZG90LC4nLAorICAgICAgICAnP2tleXM9c2VtaSwlM0IsY29tbWEsJTJDLGRvdCwuJywKKyAgICAgICAgJz9rZXlzPWRvdCwuLGNvbW1hLCUyQyxzZW1pLCUzQicsCisgICAgICAgICc/a2V5cz1jb21tYSwlMkMsZG90LC4sc2VtaSwlM0InCisgICAgICBdLAorICAgICAgJ3s/a2V5cyp9JyA9PiBbCisgICAgICAgICc/c2VtaT0lM0ImZG90PS4mY29tbWE9JTJDJywKKyAgICAgICAgJz9kb3Q9LiZzZW1pPSUzQiZjb21tYT0lMkMnLAorICAgICAgICAnP2NvbW1hPSUyQyZzZW1pPSUzQiZkb3Q9LicsCisgICAgICAgICc/c2VtaT0lM0ImY29tbWE9JTJDJmRvdD0uJywKKyAgICAgICAgJz9kb3Q9LiZjb21tYT0lMkMmc2VtaT0lM0InLAorICAgICAgICAnP2NvbW1hPSUyQyZkb3Q9LiZzZW1pPSUzQicKKyAgICAgIF0KKyAgICB9CisgIGVuZAorICBjb250ZXh0ICJPcGVyYXRvciAmIHdpdGggdmFsdWUgbW9kaWZpZXJzIiBkbworICAgIGl0X2JlaGF2ZXNfbGlrZSAnZXhwYW5kcycsIHsKKyAgICAgICd7JnZhcjozfScgPT4gJyZ2YXI9dmFsJywKKyAgICAgICd7Jmxpc3R9JyA9PiAnJmxpc3Q9cmVkLGdyZWVuLGJsdWUnLAorICAgICAgJ3smbGlzdCp9JyA9PiAnJmxpc3Q9cmVkJmxpc3Q9Z3JlZW4mbGlzdD1ibHVlJywKKyAgICAgICd7JmtleXN9JyA9PiBbCisgICAgICAgICcma2V5cz1zZW1pLCUzQixkb3QsLixjb21tYSwlMkMnLAorICAgICAgICAnJmtleXM9ZG90LC4sc2VtaSwlM0IsY29tbWEsJTJDJywKKyAgICAgICAgJyZrZXlzPWNvbW1hLCUyQyxzZW1pLCUzQixkb3QsLicsCisgICAgICAgICcma2V5cz1zZW1pLCUzQixjb21tYSwlMkMsZG90LC4nLAorICAgICAgICAnJmtleXM9ZG90LC4sY29tbWEsJTJDLHNlbWksJTNCJywKKyAgICAgICAgJyZrZXlzPWNvbW1hLCUyQyxkb3QsLixzZW1pLCUzQicKKyAgICAgIF0sCisgICAgICAneyZrZXlzKn0nID0+IFsKKyAgICAgICAgJyZzZW1pPSUzQiZkb3Q9LiZjb21tYT0lMkMnLAorICAgICAgICAnJmRvdD0uJnNlbWk9JTNCJmNvbW1hPSUyQycsCisgICAgICAgICcmY29tbWE9JTJDJnNlbWk9JTNCJmRvdD0uJywKKyAgICAgICAgJyZzZW1pPSUzQiZjb21tYT0lMkMmZG90PS4nLAorICAgICAgICAnJmRvdD0uJmNvbW1hPSUyQyZzZW1pPSUzQicsCisgICAgICAgICcmY29tbWE9JTJDJmRvdD0uJnNlbWk9JTNCJworICAgICAgXQorICAgIH0KKyAgZW5kCitlbmQKK2Rlc2NyaWJlICJNb2RpZmllcnMiIGRvCisgIHN1YmplY3QgeworICAgIHsKKyAgICAgIDp2YXIgPT4gInZhbHVlIiwKKyAgICAgIDpzZW1pID0+ICI7IiwKKyAgICAgIDp5ZWFyID0+ICV3KDE5NjUgMjAwMCAyMDEyKSwKKyAgICAgIDpkb20gPT4gJXcoZXhhbXBsZSBjb20pCisgICAgfQorICB9CisgIGNvbnRleHQgImxlbmd0aCIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAne3ZhcjozfScgPT4gJ3ZhbCcsCisgICAgICAne3ZhcjozMH0nID0+ICd2YWx1ZScsCisgICAgICAne3Zhcn0nID0+ICd2YWx1ZScsCisgICAgICAne3NlbWl9JyA9PiAnJTNCJywKKyAgICAgICd7c2VtaToyfScgPT4gJyUzQicKKyAgICB9CisgIGVuZAorICBjb250ZXh0ICJleHBsb2RlIiBkbworICAgIGl0X2JlaGF2ZXNfbGlrZSAnZXhwYW5kcycsIHsKKyAgICAgICdmaW5kez95ZWFyKn0nID0+ICdmaW5kP3llYXI9MTk2NSZ5ZWFyPTIwMDAmeWVhcj0yMDEyJywKKyAgICAgICd3d3d7LmRvbSp9JyA9PiAnd3d3LmV4YW1wbGUuY29tJywKKyAgICB9CisgIGVuZAorZW5kCitkZXNjcmliZSAiRXhwYW5zaW9uIiBkbworICBzdWJqZWN0IHsKKyAgICB7CisgICAgICA6Y291bnQgPT4gWyJvbmUiLCAidHdvIiwgInRocmVlIl0sCisgICAgICA6ZG9tID0+IFsiZXhhbXBsZSIsICJjb20iXSwKKyAgICAgIDpkdWIgICA9PiAibWUvdG9vIiwKKyAgICAgIDpoZWxsbyA9PiAiSGVsbG8gV29ybGQhIiwKKyAgICAgIDpoYWxmICA9PiAiNTAlIiwKKyAgICAgIDp2YXIgICA9PiAidmFsdWUiLAorICAgICAgOndobyAgID0+ICJmcmVkIiwKKyAgICAgIDpiYXNlICA9PiAiaHR0cDovL2V4YW1wbGUuY29tL2hvbWUvIiwKKyAgICAgIDpwYXRoICA9PiAiL2Zvby9iYXIiLAorICAgICAgOmxpc3QgID0+IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXSwKKyAgICAgIDprZXlzICA9PiB7InNlbWkiID0+ICI7IiwiZG90IiA9PiAiLiIsImNvbW1hIiA9PiAiLCJ9LAorICAgICAgOnYgICAgID0+ICI2IiwKKyAgICAgIDp4ICAgICA9PiAiMTAyNCIsCisgICAgICA6eSAgICAgPT4gIjc2OCIsCisgICAgICA6ZW1wdHkgPT4gIiIsCisgICAgICA6ZW1wdHlfa2V5cyAgPT4ge30sCisgICAgICA6dW5kZWYgPT4gbmlsCisgICAgfQorICB9CisgIGNvbnRleHQgImNvbmNhdGVuYXRpb24iIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3tjb3VudH0nID0+ICdvbmUsdHdvLHRocmVlJywKKyAgICAgICd7Y291bnQqfScgPT4gJ29uZSx0d28sdGhyZWUnLAorICAgICAgJ3svY291bnR9JyA9PiAnL29uZSx0d28sdGhyZWUnLAorICAgICAgJ3svY291bnQqfScgPT4gJy9vbmUvdHdvL3RocmVlJywKKyAgICAgICd7O2NvdW50fScgPT4gJztjb3VudD1vbmUsdHdvLHRocmVlJywKKyAgICAgICd7O2NvdW50Kn0nID0+ICc7Y291bnQ9b25lO2NvdW50PXR3bztjb3VudD10aHJlZScsCisgICAgICAnez9jb3VudH0nID0+ICc/Y291bnQ9b25lLHR3byx0aHJlZScsCisgICAgICAnez9jb3VudCp9JyA9PiAnP2NvdW50PW9uZSZjb3VudD10d28mY291bnQ9dGhyZWUnLAorICAgICAgJ3smY291bnQqfScgPT4gJyZjb3VudD1vbmUmY291bnQ9dHdvJmNvdW50PXRocmVlJworICAgIH0KKyAgZW5kCisgIGNvbnRleHQgInNpbXBsZSBleHBhbnNpb24iIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3t2YXJ9JyA9PiAndmFsdWUnLAorICAgICAgJ3toZWxsb30nID0+ICdIZWxsbyUyMFdvcmxkJTIxJywKKyAgICAgICd7aGFsZn0nID0+ICc1MCUyNScsCisgICAgICAnT3tlbXB0eX1YJyA9PiAnT1gnLAorICAgICAgJ097dW5kZWZ9WCcgPT4gJ09YJywKKyAgICAgICd7eCx5fScgPT4gJzEwMjQsNzY4JywKKyAgICAgICd7eCxoZWxsbyx5fScgPT4gJzEwMjQsSGVsbG8lMjBXb3JsZCUyMSw3NjgnLAorICAgICAgJz97eCxlbXB0eX0nID0+ICc/MTAyNCwnLAorICAgICAgJz97eCx1bmRlZn0nID0+ICc/MTAyNCcsCisgICAgICAnP3t1bmRlZix5fScgPT4gJz83NjgnLAorICAgICAgJ3t2YXI6M30nID0+ICd2YWwnLAorICAgICAgJ3t2YXI6MzB9JyA9PiAndmFsdWUnLAorICAgICAgJ3tsaXN0fScgPT4gJ3JlZCxncmVlbixibHVlJywKKyAgICAgICd7bGlzdCp9JyA9PiAncmVkLGdyZWVuLGJsdWUnLAorICAgICAgJ3trZXlzfScgPT4gWworICAgICAgICAnc2VtaSwlM0IsZG90LC4sY29tbWEsJTJDJywKKyAgICAgICAgJ2RvdCwuLHNlbWksJTNCLGNvbW1hLCUyQycsCisgICAgICAgICdjb21tYSwlMkMsc2VtaSwlM0IsZG90LC4nLAorICAgICAgICAnc2VtaSwlM0IsY29tbWEsJTJDLGRvdCwuJywKKyAgICAgICAgJ2RvdCwuLGNvbW1hLCUyQyxzZW1pLCUzQicsCisgICAgICAgICdjb21tYSwlMkMsZG90LC4sc2VtaSwlM0InCisgICAgICBdLAorICAgICAgJ3trZXlzKn0nID0+IFsKKyAgICAgICAgJ3NlbWk9JTNCLGRvdD0uLGNvbW1hPSUyQycsCisgICAgICAgICdkb3Q9LixzZW1pPSUzQixjb21tYT0lMkMnLAorICAgICAgICAnY29tbWE9JTJDLHNlbWk9JTNCLGRvdD0uJywKKyAgICAgICAgJ3NlbWk9JTNCLGNvbW1hPSUyQyxkb3Q9LicsCisgICAgICAgICdkb3Q9Lixjb21tYT0lMkMsc2VtaT0lM0InLAorICAgICAgICAnY29tbWE9JTJDLGRvdD0uLHNlbWk9JTNCJworICAgICAgXQorICAgIH0KKyAgZW5kCisgIGNvbnRleHQgInJlc2VydmVkIGV4cGFuc2lvbiAoKykiIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3srdmFyfScgPT4gJ3ZhbHVlJywKKyAgICAgICd7K2hlbGxvfScgPT4gJ0hlbGxvJTIwV29ybGQhJywKKyAgICAgICd7K2hhbGZ9JyA9PiAnNTAlMjUnLAorICAgICAgJ3tiYXNlfWluZGV4JyA9PiAnaHR0cCUzQSUyRiUyRmV4YW1wbGUuY29tJTJGaG9tZSUyRmluZGV4JywKKyAgICAgICd7K2Jhc2V9aW5kZXgnID0+ICdodHRwOi8vZXhhbXBsZS5jb20vaG9tZS9pbmRleCcsCisgICAgICAnT3srZW1wdHl9WCcgPT4gJ09YJywKKyAgICAgICdPeyt1bmRlZn1YJyA9PiAnT1gnLAorICAgICAgJ3srcGF0aH0vaGVyZScgPT4gJy9mb28vYmFyL2hlcmUnLAorICAgICAgJ2hlcmU/cmVmPXsrcGF0aH0nID0+ICdoZXJlP3JlZj0vZm9vL2JhcicsCisgICAgICAndXB7K3BhdGh9e3Zhcn0vaGVyZScgPT4gJ3VwL2Zvby9iYXJ2YWx1ZS9oZXJlJywKKyAgICAgICd7K3gsaGVsbG8seX0nID0+ICcxMDI0LEhlbGxvJTIwV29ybGQhLDc2OCcsCisgICAgICAneytwYXRoLHh9L2hlcmUnID0+ICcvZm9vL2JhciwxMDI0L2hlcmUnLAorICAgICAgJ3srcGF0aDo2fS9oZXJlJyA9PiAnL2Zvby9iL2hlcmUnLAorICAgICAgJ3srbGlzdH0nID0+ICdyZWQsZ3JlZW4sYmx1ZScsCisgICAgICAneytsaXN0Kn0nID0+ICdyZWQsZ3JlZW4sYmx1ZScsCisgICAgICAneytrZXlzfScgPT4gWworICAgICAgICAnc2VtaSw7LGRvdCwuLGNvbW1hLCwnLAorICAgICAgICAnZG90LC4sc2VtaSw7LGNvbW1hLCwnLAorICAgICAgICAnY29tbWEsLCxzZW1pLDssZG90LC4nLAorICAgICAgICAnc2VtaSw7LGNvbW1hLCwsZG90LC4nLAorICAgICAgICAnZG90LC4sY29tbWEsLCxzZW1pLDsnLAorICAgICAgICAnY29tbWEsLCxkb3QsLixzZW1pLDsnCisgICAgICBdLAorICAgICAgJ3sra2V5cyp9JyA9PiBbCisgICAgICAgICdzZW1pPTssZG90PS4sY29tbWE9LCcsCisgICAgICAgICdkb3Q9LixzZW1pPTssY29tbWE9LCcsCisgICAgICAgICdjb21tYT0sLHNlbWk9Oyxkb3Q9LicsCisgICAgICAgICdzZW1pPTssY29tbWE9LCxkb3Q9LicsCisgICAgICAgICdkb3Q9Lixjb21tYT0sLHNlbWk9OycsCisgICAgICAgICdjb21tYT0sLGRvdD0uLHNlbWk9OycKKyAgICAgIF0KKyAgICB9CisgIGVuZAorICBjb250ZXh0ICJmcmFnbWVudCBleHBhbnNpb24gKCMpIiBkbworICAgIGl0X2JlaGF2ZXNfbGlrZSAnZXhwYW5kcycsIHsKKyAgICAgICd7I3Zhcn0nID0+ICcjdmFsdWUnLAorICAgICAgJ3sjaGVsbG99JyA9PiAnI0hlbGxvJTIwV29ybGQhJywKKyAgICAgICd7I2hhbGZ9JyA9PiAnIzUwJTI1JywKKyAgICAgICdmb297I2VtcHR5fScgPT4gJ2ZvbyMnLAorICAgICAgJ2Zvb3sjdW5kZWZ9JyA9PiAnZm9vJywKKyAgICAgICd7I3gsaGVsbG8seX0nID0+ICcjMTAyNCxIZWxsbyUyMFdvcmxkISw3NjgnLAorICAgICAgJ3sjcGF0aCx4fS9oZXJlJyA9PiAnIy9mb28vYmFyLDEwMjQvaGVyZScsCisgICAgICAneyNwYXRoOjZ9L2hlcmUnID0+ICcjL2Zvby9iL2hlcmUnLAorICAgICAgJ3sjbGlzdH0nID0+ICcjcmVkLGdyZWVuLGJsdWUnLAorICAgICAgJ3sjbGlzdCp9JyA9PiAnI3JlZCxncmVlbixibHVlJywKKyAgICAgICd7I2tleXN9JyA9PiBbCisgICAgICAgICcjc2VtaSw7LGRvdCwuLGNvbW1hLCwnLAorICAgICAgICAnI2RvdCwuLHNlbWksOyxjb21tYSwsJywKKyAgICAgICAgJyNjb21tYSwsLHNlbWksOyxkb3QsLicsCisgICAgICAgICcjc2VtaSw7LGNvbW1hLCwsZG90LC4nLAorICAgICAgICAnI2RvdCwuLGNvbW1hLCwsc2VtaSw7JywKKyAgICAgICAgJyNjb21tYSwsLGRvdCwuLHNlbWksOycKKyAgICAgIF0sCisgICAgICAneyNrZXlzKn0nID0+IFsKKyAgICAgICAgJyNzZW1pPTssZG90PS4sY29tbWE9LCcsCisgICAgICAgICcjZG90PS4sc2VtaT07LGNvbW1hPSwnLAorICAgICAgICAnI2NvbW1hPSwsc2VtaT07LGRvdD0uJywKKyAgICAgICAgJyNzZW1pPTssY29tbWE9LCxkb3Q9LicsCisgICAgICAgICcjZG90PS4sY29tbWE9LCxzZW1pPTsnLAorICAgICAgICAnI2NvbW1hPSwsZG90PS4sc2VtaT07JworICAgICAgXQorICAgIH0KKyAgZW5kCisgIGNvbnRleHQgImxhYmVsIGV4cGFuc2lvbiAoLikiIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3sud2hvfScgPT4gJy5mcmVkJywKKyAgICAgICd7Lndobyx3aG99JyA9PiAnLmZyZWQuZnJlZCcsCisgICAgICAney5oYWxmLHdob30nID0+ICcuNTAlMjUuZnJlZCcsCisgICAgICAnd3d3ey5kb20qfScgPT4gJ3d3dy5leGFtcGxlLmNvbScsCisgICAgICAnWHsudmFyfScgPT4gJ1gudmFsdWUnLAorICAgICAgJ1h7LmVtcHR5fScgPT4gJ1guJywKKyAgICAgICdYey51bmRlZn0nID0+ICdYJywKKyAgICAgICdYey52YXI6M30nID0+ICdYLnZhbCcsCisgICAgICAnWHsubGlzdH0nID0+ICdYLnJlZCxncmVlbixibHVlJywKKyAgICAgICdYey5saXN0Kn0nID0+ICdYLnJlZC5ncmVlbi5ibHVlJywKKyAgICAgICdYey5rZXlzfScgPT4gWworICAgICAgICAnWC5zZW1pLCUzQixkb3QsLixjb21tYSwlMkMnLAorICAgICAgICAnWC5kb3QsLixzZW1pLCUzQixjb21tYSwlMkMnLAorICAgICAgICAnWC5jb21tYSwlMkMsc2VtaSwlM0IsZG90LC4nLAorICAgICAgICAnWC5zZW1pLCUzQixjb21tYSwlMkMsZG90LC4nLAorICAgICAgICAnWC5kb3QsLixjb21tYSwlMkMsc2VtaSwlM0InLAorICAgICAgICAnWC5jb21tYSwlMkMsZG90LC4sc2VtaSwlM0InCisgICAgICBdLAorICAgICAgJ1h7LmtleXMqfScgPT4gWworICAgICAgICAnWC5zZW1pPSUzQi5kb3Q9Li5jb21tYT0lMkMnLAorICAgICAgICAnWC5kb3Q9Li5zZW1pPSUzQi5jb21tYT0lMkMnLAorICAgICAgICAnWC5jb21tYT0lMkMuc2VtaT0lM0IuZG90PS4nLAorICAgICAgICAnWC5zZW1pPSUzQi5jb21tYT0lMkMuZG90PS4nLAorICAgICAgICAnWC5kb3Q9Li5jb21tYT0lMkMuc2VtaT0lM0InLAorICAgICAgICAnWC5jb21tYT0lMkMuZG90PS4uc2VtaT0lM0InCisgICAgICBdLAorICAgICAgJ1h7LmVtcHR5X2tleXN9JyA9PiAnWCcsCisgICAgICAnWHsuZW1wdHlfa2V5cyp9JyA9PiAnWCcKKyAgICB9CisgIGVuZAorICBjb250ZXh0ICJwYXRoIGV4cGFuc2lvbiAoLykiIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3svd2hvfScgPT4gJy9mcmVkJywKKyAgICAgICd7L3dobyx3aG99JyA9PiAnL2ZyZWQvZnJlZCcsCisgICAgICAney9oYWxmLHdob30nID0+ICcvNTAlMjUvZnJlZCcsCisgICAgICAney93aG8sZHVifScgPT4gJy9mcmVkL21lJTJGdG9vJywKKyAgICAgICd7L3Zhcn0nID0+ICcvdmFsdWUnLAorICAgICAgJ3svdmFyLGVtcHR5fScgPT4gJy92YWx1ZS8nLAorICAgICAgJ3svdmFyLHVuZGVmfScgPT4gJy92YWx1ZScsCisgICAgICAney92YXIseH0vaGVyZScgPT4gJy92YWx1ZS8xMDI0L2hlcmUnLAorICAgICAgJ3svdmFyOjEsdmFyfScgPT4gJy92L3ZhbHVlJywKKyAgICAgICd7L2xpc3R9JyA9PiAnL3JlZCxncmVlbixibHVlJywKKyAgICAgICd7L2xpc3QqfScgPT4gJy9yZWQvZ3JlZW4vYmx1ZScsCisgICAgICAney9saXN0KixwYXRoOjR9JyA9PiAnL3JlZC9ncmVlbi9ibHVlLyUyRmZvbycsCisgICAgICAney9rZXlzfScgPT4gWworICAgICAgICAnL3NlbWksJTNCLGRvdCwuLGNvbW1hLCUyQycsCisgICAgICAgICcvZG90LC4sc2VtaSwlM0IsY29tbWEsJTJDJywKKyAgICAgICAgJy9jb21tYSwlMkMsc2VtaSwlM0IsZG90LC4nLAorICAgICAgICAnL3NlbWksJTNCLGNvbW1hLCUyQyxkb3QsLicsCisgICAgICAgICcvZG90LC4sY29tbWEsJTJDLHNlbWksJTNCJywKKyAgICAgICAgJy9jb21tYSwlMkMsZG90LC4sc2VtaSwlM0InCisgICAgICBdLAorICAgICAgJ3sva2V5cyp9JyA9PiBbCisgICAgICAgICcvc2VtaT0lM0IvZG90PS4vY29tbWE9JTJDJywKKyAgICAgICAgJy9kb3Q9Li9zZW1pPSUzQi9jb21tYT0lMkMnLAorICAgICAgICAnL2NvbW1hPSUyQy9zZW1pPSUzQi9kb3Q9LicsCisgICAgICAgICcvc2VtaT0lM0IvY29tbWE9JTJDL2RvdD0uJywKKyAgICAgICAgJy9kb3Q9Li9jb21tYT0lMkMvc2VtaT0lM0InLAorICAgICAgICAnL2NvbW1hPSUyQy9kb3Q9Li9zZW1pPSUzQicKKyAgICAgIF0KKyAgICB9CisgIGVuZAorICBjb250ZXh0ICJwYXRoLXN0eWxlIGV4cGFuc2lvbiAoOykiIGRvCisgICAgaXRfYmVoYXZlc19saWtlICdleHBhbmRzJywgeworICAgICAgJ3s7d2hvfScgPT4gJzt3aG89ZnJlZCcsCisgICAgICAneztoYWxmfScgPT4gJztoYWxmPTUwJTI1JywKKyAgICAgICd7O2VtcHR5fScgPT4gJztlbXB0eScsCisgICAgICAnezt2LGVtcHR5LHdob30nID0+ICc7dj02O2VtcHR5O3dobz1mcmVkJywKKyAgICAgICd7O3YsYmFyLHdob30nID0+ICc7dj02O3dobz1mcmVkJywKKyAgICAgICd7O3gseX0nID0+ICc7eD0xMDI0O3k9NzY4JywKKyAgICAgICd7O3gseSxlbXB0eX0nID0+ICc7eD0xMDI0O3k9NzY4O2VtcHR5JywKKyAgICAgICd7O3gseSx1bmRlZn0nID0+ICc7eD0xMDI0O3k9NzY4JywKKyAgICAgICd7O2hlbGxvOjV9JyA9PiAnO2hlbGxvPUhlbGxvJywKKyAgICAgICd7O2xpc3R9JyA9PiAnO2xpc3Q9cmVkLGdyZWVuLGJsdWUnLAorICAgICAgJ3s7bGlzdCp9JyA9PiAnO2xpc3Q9cmVkO2xpc3Q9Z3JlZW47bGlzdD1ibHVlJywKKyAgICAgICd7O2tleXN9JyA9PiBbCisgICAgICAgICc7a2V5cz1zZW1pLCUzQixkb3QsLixjb21tYSwlMkMnLAorICAgICAgICAnO2tleXM9ZG90LC4sc2VtaSwlM0IsY29tbWEsJTJDJywKKyAgICAgICAgJztrZXlzPWNvbW1hLCUyQyxzZW1pLCUzQixkb3QsLicsCisgICAgICAgICc7a2V5cz1zZW1pLCUzQixjb21tYSwlMkMsZG90LC4nLAorICAgICAgICAnO2tleXM9ZG90LC4sY29tbWEsJTJDLHNlbWksJTNCJywKKyAgICAgICAgJztrZXlzPWNvbW1hLCUyQyxkb3QsLixzZW1pLCUzQicKKyAgICAgIF0sCisgICAgICAneztrZXlzKn0nID0+IFsKKyAgICAgICAgJztzZW1pPSUzQjtkb3Q9Ljtjb21tYT0lMkMnLAorICAgICAgICAnO2RvdD0uO3NlbWk9JTNCO2NvbW1hPSUyQycsCisgICAgICAgICc7Y29tbWE9JTJDO3NlbWk9JTNCO2RvdD0uJywKKyAgICAgICAgJztzZW1pPSUzQjtjb21tYT0lMkM7ZG90PS4nLAorICAgICAgICAnO2RvdD0uO2NvbW1hPSUyQztzZW1pPSUzQicsCisgICAgICAgICc7Y29tbWE9JTJDO2RvdD0uO3NlbWk9JTNCJworICAgICAgXQorICAgIH0KKyAgZW5kCisgIGNvbnRleHQgImZvcm0gcXVlcnkgZXhwYW5zaW9uICg/KSIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAnez93aG99JyA9PiAnP3dobz1mcmVkJywKKyAgICAgICd7P2hhbGZ9JyA9PiAnP2hhbGY9NTAlMjUnLAorICAgICAgJ3s/eCx5fScgPT4gJz94PTEwMjQmeT03NjgnLAorICAgICAgJ3s/eCx5LGVtcHR5fScgPT4gJz94PTEwMjQmeT03NjgmZW1wdHk9JywKKyAgICAgICd7P3gseSx1bmRlZn0nID0+ICc/eD0xMDI0Jnk9NzY4JywKKyAgICAgICd7P3ZhcjozfScgPT4gJz92YXI9dmFsJywKKyAgICAgICd7P2xpc3R9JyA9PiAnP2xpc3Q9cmVkLGdyZWVuLGJsdWUnLAorICAgICAgJ3s/bGlzdCp9JyA9PiAnP2xpc3Q9cmVkJmxpc3Q9Z3JlZW4mbGlzdD1ibHVlJywKKyAgICAgICd7P2tleXN9JyA9PiBbCisgICAgICAgICc/a2V5cz1zZW1pLCUzQixkb3QsLixjb21tYSwlMkMnLAorICAgICAgICAnP2tleXM9ZG90LC4sc2VtaSwlM0IsY29tbWEsJTJDJywKKyAgICAgICAgJz9rZXlzPWNvbW1hLCUyQyxzZW1pLCUzQixkb3QsLicsCisgICAgICAgICc/a2V5cz1zZW1pLCUzQixjb21tYSwlMkMsZG90LC4nLAorICAgICAgICAnP2tleXM9ZG90LC4sY29tbWEsJTJDLHNlbWksJTNCJywKKyAgICAgICAgJz9rZXlzPWNvbW1hLCUyQyxkb3QsLixzZW1pLCUzQicKKyAgICAgIF0sCisgICAgICAnez9rZXlzKn0nID0+IFsKKyAgICAgICAgJz9zZW1pPSUzQiZkb3Q9LiZjb21tYT0lMkMnLAorICAgICAgICAnP2RvdD0uJnNlbWk9JTNCJmNvbW1hPSUyQycsCisgICAgICAgICc/Y29tbWE9JTJDJnNlbWk9JTNCJmRvdD0uJywKKyAgICAgICAgJz9zZW1pPSUzQiZjb21tYT0lMkMmZG90PS4nLAorICAgICAgICAnP2RvdD0uJmNvbW1hPSUyQyZzZW1pPSUzQicsCisgICAgICAgICc/Y29tbWE9JTJDJmRvdD0uJnNlbWk9JTNCJworICAgICAgXQorICAgIH0KKyAgZW5kCisgIGNvbnRleHQgImZvcm0gcXVlcnkgZXhwYW5zaW9uICgmKSIgZG8KKyAgICBpdF9iZWhhdmVzX2xpa2UgJ2V4cGFuZHMnLCB7CisgICAgICAneyZ3aG99JyA9PiAnJndobz1mcmVkJywKKyAgICAgICd7JmhhbGZ9JyA9PiAnJmhhbGY9NTAlMjUnLAorICAgICAgJz9maXhlZD15ZXN7Jnh9JyA9PiAnP2ZpeGVkPXllcyZ4PTEwMjQnLAorICAgICAgJ3smeCx5LGVtcHR5fScgPT4gJyZ4PTEwMjQmeT03NjgmZW1wdHk9JywKKyAgICAgICd7JngseSx1bmRlZn0nID0+ICcmeD0xMDI0Jnk9NzY4JywKKyAgICAgICd7JnZhcjozfScgPT4gJyZ2YXI9dmFsJywKKyAgICAgICd7Jmxpc3R9JyA9PiAnJmxpc3Q9cmVkLGdyZWVuLGJsdWUnLAorICAgICAgJ3smbGlzdCp9JyA9PiAnJmxpc3Q9cmVkJmxpc3Q9Z3JlZW4mbGlzdD1ibHVlJywKKyAgICAgICd7JmtleXN9JyA9PiBbCisgICAgICAgICcma2V5cz1zZW1pLCUzQixkb3QsLixjb21tYSwlMkMnLAorICAgICAgICAnJmtleXM9ZG90LC4sc2VtaSwlM0IsY29tbWEsJTJDJywKKyAgICAgICAgJyZrZXlzPWNvbW1hLCUyQyxzZW1pLCUzQixkb3QsLicsCisgICAgICAgICcma2V5cz1zZW1pLCUzQixjb21tYSwlMkMsZG90LC4nLAorICAgICAgICAnJmtleXM9ZG90LC4sY29tbWEsJTJDLHNlbWksJTNCJywKKyAgICAgICAgJyZrZXlzPWNvbW1hLCUyQyxkb3QsLixzZW1pLCUzQicKKyAgICAgIF0sCisgICAgICAneyZrZXlzKn0nID0+IFsKKyAgICAgICAgJyZzZW1pPSUzQiZkb3Q9LiZjb21tYT0lMkMnLAorICAgICAgICAnJmRvdD0uJnNlbWk9JTNCJmNvbW1hPSUyQycsCisgICAgICAgICcmY29tbWE9JTJDJnNlbWk9JTNCJmRvdD0uJywKKyAgICAgICAgJyZzZW1pPSUzQiZjb21tYT0lMkMmZG90PS4nLAorICAgICAgICAnJmRvdD0uJmNvbW1hPSUyQyZzZW1pPSUzQicsCisgICAgICAgICcmY29tbWE9JTJDJmRvdD0uJnNlbWk9JTNCJworICAgICAgXQorICAgIH0KKyAgZW5kCisgIGNvbnRleHQgIm5vbi1zdHJpbmcga2V5IGluIG1hdGNoIGRhdGEiIGRvCisgICAgc3ViamVjdCB7QWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tL3tvbmV9Iil9CisKKyAgICBpdCAicmFpc2VzIFR5cGVFcnJvciIgZG8KKyAgICAgIGV4cGVjdCB7IHN1YmplY3QuZXhwYW5kKE9iamVjdC5uZXcgPT4gIjEiKSB9LnRvIHJhaXNlX2Vycm9yIFR5cGVFcnJvcgorICAgIGVuZAorICBlbmQKK2VuZAorCitjbGFzcyBFeGFtcGxlVHdvUHJvY2Vzc29yCisgIGRlZiBzZWxmLnJlc3RvcmUobmFtZSwgdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlLmdzdWIoLy0vLCAiICIpIGlmIG5hbWUgPT0gInF1ZXJ5IgorICAgIHJldHVybiB2YWx1ZQorICBlbmQKKworICBkZWYgc2VsZi5tYXRjaChuYW1lKQorICAgIHJldHVybiAiLio/IiBpZiBuYW1lID09ICJmaXJzdCIKKyAgICByZXR1cm4gIi4qIgorICBlbmQKKyAgZGVmIHNlbGYudmFsaWRhdGUobmFtZSwgdmFsdWUpCisgICAgcmV0dXJuICEhKHZhbHVlID1+IC9eW1x3IF0rJC8pIGlmIG5hbWUgPT0gInF1ZXJ5IgorICAgIHJldHVybiB0cnVlCisgIGVuZAorCisgIGRlZiBzZWxmLnRyYW5zZm9ybShuYW1lLCB2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUuZ3N1YigvIC8sICIrIikgaWYgbmFtZSA9PSAicXVlcnkiCisgICAgcmV0dXJuIHZhbHVlCisgIGVuZAorZW5kCisKK2NsYXNzIER1bWJQcm9jZXNzb3IKKyAgZGVmIHNlbGYubWF0Y2gobmFtZSkKKyAgICByZXR1cm4gIi4qPyIgaWYgbmFtZSA9PSAiZmlyc3QiCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZSBkbworICBkZXNjcmliZSAnaW5pdGlhbGl6ZScgZG8KKyAgICBjb250ZXh0ICd3aXRoIGEgbm9uLXN0cmluZycgZG8KKyAgICAgIGl0ICdyYWlzZXMgYSBUeXBlRXJyb3InIGRvCisgICAgICAgIGV4cGVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcobmlsKSB9LnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAnZnJlZXplJyBkbworICAgIHN1YmplY3QgeyBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCJodHRwOi8vZXhhbXBsZS5jb20ve2ZpcnN0fS97K3NlY29uZH0vIikgfQorICAgIGl0ICdmcmVlemVzIHRoZSB0ZW1wbGF0ZScgZG8KKyAgICAgIGV4cGVjdChzdWJqZWN0LmZyZWV6ZSkudG8gYmVfZnJvemVuCisgICAgZW5kCisgIGVuZAorCisgIGRlc2NyaWJlICJNYXRjaGluZyIgZG8KKyAgICBsZXQoOnVyaSl7CisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKAorICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3NlYXJjaC9hbi1leGFtcGxlLXNlYXJjaC1xdWVyeS8iCisgICAgICApCisgICAgfQorICAgIGxldCg6dXJpMil7CisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vYS9iL2MvIikKKyAgICB9CisgICAgbGV0KDp1cmkzKXsKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS87YT0xO2I9MjtjPTM7Zmlyc3Q9Zm9vIikKKyAgICB9CisgICAgbGV0KDp1cmk0KXsKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8/YT0xJmI9MiZjPTMmZmlyc3Q9Zm9vIikKKyAgICB9CisgICAgbGV0KDp1cmk1KXsKKyAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vZm9vIgorICAgIH0KKyAgICBjb250ZXh0ICJmaXJzdCB1cmkgd2l0aCBFeGFtcGxlVHdvUHJvY2Vzc29yIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoCisgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9zZWFyY2gve3F1ZXJ5fS8iCisgICAgICAgICkubWF0Y2godXJpLCBFeGFtcGxlVHdvUHJvY2Vzc29yKQorICAgICAgfQorICAgICAgaXRzKDp2YXJpYWJsZXMpeyBzaG91bGQgPT0gWyJxdWVyeSJdIH0KKyAgICAgIGl0cyg6Y2FwdHVyZXMpeyBzaG91bGQgPT0gWyJhbiBleGFtcGxlIHNlYXJjaCBxdWVyeSJdIH0KKyAgICBlbmQKKworICAgIGNvbnRleHQgInNlY29uZCB1cmkgd2l0aCBFeGFtcGxlVHdvUHJvY2Vzc29yIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoCisgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS97Zmlyc3R9L3src2Vjb25kfS8iCisgICAgICAgICkubWF0Y2godXJpMiwgRXhhbXBsZVR3b1Byb2Nlc3NvcikKKyAgICAgIH0KKyAgICAgIGl0cyg6dmFyaWFibGVzKXsgc2hvdWxkID09IFsiZmlyc3QiLCAic2Vjb25kIl0gfQorICAgICAgaXRzKDpjYXB0dXJlcyl7IHNob3VsZCA9PSBbImEiLCAiYi9jIl0gfQorICAgIGVuZAorCisgICAgY29udGV4dCAic2Vjb25kIHVyaSB3aXRoIER1bWJQcm9jZXNzb3IiIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3tmaXJzdH0veytzZWNvbmR9LyIKKyAgICAgICAgKS5tYXRjaCh1cmkyLCBEdW1iUHJvY2Vzc29yKQorICAgICAgfQorICAgICAgaXRzKDp2YXJpYWJsZXMpeyBzaG91bGQgPT0gWyJmaXJzdCIsICJzZWNvbmQiXSB9CisgICAgICBpdHMoOmNhcHR1cmVzKXsgc2hvdWxkID09IFsiYSIsICJiL2MiXSB9CisgICAgZW5kCisKKyAgICBjb250ZXh0ICJzZWNvbmQgdXJpIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoCisgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS97Zmlyc3R9ey9zZWNvbmQqfS8iCisgICAgICAgICkubWF0Y2godXJpMikKKyAgICAgIH0KKyAgICAgIGl0cyg6dmFyaWFibGVzKXsgc2hvdWxkID09IFsiZmlyc3QiLCAic2Vjb25kIl0gfQorICAgICAgaXRzKDpjYXB0dXJlcyl7IHNob3VsZCA9PSBbImEiLCBbImIiLCJjIl1dIH0KKyAgICBlbmQKKyAgICBjb250ZXh0ICJ0aGlyZCB1cmkiIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3s7aGFzaCosZmlyc3R9IgorICAgICAgICApLm1hdGNoKHVyaTMpCisgICAgICB9CisgICAgICBpdHMoOnZhcmlhYmxlcyl7IHNob3VsZCA9PSBbImhhc2giLCAiZmlyc3QiXSB9CisgICAgICBpdHMoOmNhcHR1cmVzKXsgc2hvdWxkID09IFsKKyAgICAgICAgeyJhIiA9PiAiMSIsICJiIiA9PiAiMiIsICJjIiA9PiAiMyIsICJmaXJzdCIgPT4gImZvbyJ9LCBuaWxdIH0KKyAgICBlbmQKKyAgICAjIE5vdGUgdGhhdCB0aGlzIGV4cGFuc2lvbiBpcyBpbXBvc3NpYmxlIHRvIHJldmVydCBkZXRlcm1pbmlzdGljYWxseSAtIHRoZQorICAgICMgKiBvcGVyYXRvciBtZWFucyBmaXJzdCBjb3VsZCBoYXZlIGJlZW4gYSBrZXkgb2YgaGFzaCBvciBhIHNlcGFyYXRlIGtleS4KKyAgICAjIFNlbWFudGljYWxseSwgYSBzZXBhcmF0ZSBrZXkgaXMgbW9yZSBsaWtlbHksIGJ1dCBib3RoIGFyZSBwb3NzaWJsZS4KKyAgICBjb250ZXh0ICJmb3VydGggdXJpIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoCisgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS97P2hhc2gqLGZpcnN0fSIKKyAgICAgICAgKS5tYXRjaCh1cmk0KQorICAgICAgfQorICAgICAgaXRzKDp2YXJpYWJsZXMpeyBzaG91bGQgPT0gWyJoYXNoIiwgImZpcnN0Il0gfQorICAgICAgaXRzKDpjYXB0dXJlcyl7IHNob3VsZCA9PSBbCisgICAgICAgIHsiYSIgPT4gIjEiLCAiYiIgPT4gIjIiLCAiYyIgPT4gIjMiLCAiZmlyc3QiPT4gImZvbyJ9LCBuaWxdIH0KKyAgICBlbmQKKyAgICBjb250ZXh0ICJmaWZ0aCB1cmkiIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3twYXRofXs/aGFzaCosZmlyc3R9IgorICAgICAgICApLm1hdGNoKHVyaTUpCisgICAgICB9CisgICAgICBpdHMoOnZhcmlhYmxlcyl7IHNob3VsZCA9PSBbInBhdGgiLCAiaGFzaCIsICJmaXJzdCJdIH0KKyAgICAgIGl0cyg6Y2FwdHVyZXMpeyBzaG91bGQgPT0gWyJmb28iLCBuaWwsIG5pbF0gfQorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAnbWF0Y2gnIGRvCisgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoJ2h0dHA6Ly9leGFtcGxlLmNvbS9maXJzdC9zZWNvbmQvJykgfQorICAgIGNvbnRleHQgJ3doZW4gdGhlIFVSSSBpcyB0aGUgc2FtZSBhcyB0aGUgdGVtcGxhdGUnIGRvCisgICAgICBpdCAncmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBpdHNlbGYgd2l0aCBhbiBlbXB0eSBtYXBwaW5nJyBkbworICAgICAgICB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCdodHRwOi8vZXhhbXBsZS5jb20vZmlyc3Qvc2Vjb25kLycpCisgICAgICAgIG1hdGNoX2RhdGEgPSBzdWJqZWN0Lm1hdGNoKHVyaSkKKyAgICAgICAgZXhwZWN0KG1hdGNoX2RhdGEpLnRvIGJlX2FuIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZTo6TWF0Y2hEYXRhCisgICAgICAgIGV4cGVjdChtYXRjaF9kYXRhLnVyaSkudG8gZXEodXJpKQorICAgICAgICBleHBlY3QobWF0Y2hfZGF0YS50ZW1wbGF0ZSkudG8gZXEoc3ViamVjdCkKKyAgICAgICAgZXhwZWN0KG1hdGNoX2RhdGEubWFwcGluZykudG8gYmVfZW1wdHkKKyAgICAgICAgZXhwZWN0KG1hdGNoX2RhdGEuaW5zcGVjdCkudG8gYmVfYW4gU3RyaW5nCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzY3JpYmUgImV4dHJhY3QiIGRvCisgICAgbGV0KDp0ZW1wbGF0ZSkgeworICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygKKyAgICAgICAgImh0dHA6Ly97aG9zdH17L3NlZ21lbnRzKn0vez9vbmUsdHdvLGJvZ3VzfXsjZnJhZ21lbnR9IgorICAgICAgKQorICAgIH0KKyAgICBsZXQoOnVyaSl7ICJodHRwOi8vZXhhbXBsZS5jb20vYS9iL2MvP29uZT0xJnR3bz0yI2ZvbyIgfQorICAgIGxldCg6dXJpMil7ICJodHRwOi8vZXhhbXBsZS5jb20vYS9iL2MvI2ZvbyIgfQorICAgIGl0ICJzaG91bGQgYmUgYWJsZSB0byBleHRyYWN0IHdpdGggcXVlcmllcyIgZG8KKyAgICAgIGV4cGVjdCh0ZW1wbGF0ZS5leHRyYWN0KHVyaSkpLnRvIGVxKHsKKyAgICAgICAgImhvc3QiID0+ICJleGFtcGxlLmNvbSIsCisgICAgICAgICJzZWdtZW50cyIgPT4gJXcoYSBiIGMpLAorICAgICAgICAib25lIiA9PiAiMSIsCisgICAgICAgICJib2d1cyIgPT4gbmlsLAorICAgICAgICAidHdvIiA9PiAiMiIsCisgICAgICAgICJmcmFnbWVudCIgPT4gImZvbyIKKyAgICAgIH0pCisgICAgZW5kCisgICAgaXQgInNob3VsZCBiZSBhYmxlIHRvIGV4dHJhY3Qgd2l0aG91dCBxdWVyaWVzIiBkbworICAgICAgZXhwZWN0KHRlbXBsYXRlLmV4dHJhY3QodXJpMikpLnRvIGVxKHsKKyAgICAgICAgImhvc3QiID0+ICJleGFtcGxlLmNvbSIsCisgICAgICAgICJzZWdtZW50cyIgPT4gJXcoYSBiIGMpLAorICAgICAgICAib25lIiA9PiBuaWwsCisgICAgICAgICJib2d1cyIgPT4gbmlsLAorICAgICAgICAidHdvIiA9PiBuaWwsCisgICAgICAgICJmcmFnbWVudCIgPT4gImZvbyIKKyAgICAgIH0pCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJpc3N1ZSAjMTM3IiBkbworICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoJy9wYXRoez9wYWdlLHBlcl9wYWdlfScpIH0KKworICAgICAgaXQgImNhbiBtYXRjaCBlbXB0eSIgZG8KKyAgICAgICAgZGF0YSA9IHN1YmplY3QuZXh0cmFjdCgiL3BhdGgiKQorICAgICAgICBleHBlY3QoZGF0YVsicGFnZSJdKS50byBlcShuaWwpCisgICAgICAgIGV4cGVjdChkYXRhWyJwZXJfcGFnZSJdKS50byBlcShuaWwpCisgICAgICAgIGV4cGVjdChkYXRhLmtleXMuc29ydCkudG8gZXEoWydwYWdlJywgJ3Blcl9wYWdlJ10pCisgICAgICBlbmQKKworICAgICAgaXQgImNhbiBtYXRjaCBmaXJzdCB2YXIiIGRvCisgICAgICAgIGRhdGEgPSBzdWJqZWN0LmV4dHJhY3QoIi9wYXRoP3BhZ2U9MSIpCisgICAgICAgIGV4cGVjdChkYXRhWyJwYWdlIl0pLnRvIGVxKCIxIikKKyAgICAgICAgZXhwZWN0KGRhdGFbInBlcl9wYWdlIl0pLnRvIGVxKG5pbCkKKyAgICAgICAgZXhwZWN0KGRhdGEua2V5cy5zb3J0KS50byBlcShbJ3BhZ2UnLCAncGVyX3BhZ2UnXSkKKyAgICAgIGVuZAorCisgICAgICBpdCAiY2FuIG1hdGNoIHNlY29uZCB2YXIiIGRvCisgICAgICAgIGRhdGEgPSBzdWJqZWN0LmV4dHJhY3QoIi9wYXRoP3Blcl9wYWdlPTEiKQorICAgICAgICBleHBlY3QoZGF0YVsicGFnZSJdKS50byBlcShuaWwpCisgICAgICAgIGV4cGVjdChkYXRhWyJwZXJfcGFnZSJdKS50byBlcSgiMSIpCisgICAgICAgIGV4cGVjdChkYXRhLmtleXMuc29ydCkudG8gZXEoWydwYWdlJywgJ3Blcl9wYWdlJ10pCisgICAgICBlbmQKKworICAgICAgaXQgImNhbiBtYXRjaCBib3RoIHZhcnMiIGRvCisgICAgICAgIGRhdGEgPSBzdWJqZWN0LmV4dHJhY3QoIi9wYXRoP3BhZ2U9MiZwZXJfcGFnZT0xIikKKyAgICAgICAgZXhwZWN0KGRhdGFbInBhZ2UiXSkudG8gZXEoIjIiKQorICAgICAgICBleHBlY3QoZGF0YVsicGVyX3BhZ2UiXSkudG8gZXEoIjEiKQorICAgICAgICBleHBlY3QoZGF0YS5rZXlzLnNvcnQpLnRvIGVxKFsncGFnZScsICdwZXJfcGFnZSddKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlc2NyaWJlICJQYXJ0aWFsIGV4cGFuZCB3aXRoIHN5bWJvbHMiIGRvCisgICAgY29udGV4dCAicGFydGlhbF9leHBhbmQgd2l0aCB0d28gc2ltcGxlIHZhbHVlcyIgZG8KKyAgICAgIHN1YmplY3QgeworICAgICAgICBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCJodHRwOi8vZXhhbXBsZS5jb20ve29uZX0ve3R3b30vIikKKyAgICAgIH0KKyAgICAgIGl0ICJidWlsZHMgYSBuZXcgcGF0dGVybiIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QucGFydGlhbF9leHBhbmQoOm9uZSA9PiAiMSIpLnBhdHRlcm4pLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vMS97dHdvfS8iCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgInBhcnRpYWxfZXhwYW5kIHF1ZXJ5IHdpdGggbWlzc2luZyBwYXJhbSBpbiBtaWRkbGUiIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tL3s/b25lLHR3byx0aHJlZX0vIikKKyAgICAgIH0KKyAgICAgIGl0ICJidWlsZHMgYSBuZXcgcGF0dGVybiIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QucGFydGlhbF9leHBhbmQoOm9uZSA9PiAiMSIsIDp0aHJlZSA9PiAiMyIpLnBhdHRlcm4pLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vP29uZT0xeyZ0d299JnRocmVlPTMvIgorICAgICAgICApCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBjb250ZXh0ICJwYXJ0aWFsX2V4cGFuZCBmb3JtIHN0eWxlIHF1ZXJ5IHdpdGggbWlzc2luZyBwYXJhbSBhdCBiZWdpbm5pbmciIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tL3s/b25lLHR3b30vIikKKyAgICAgIH0KKyAgICAgIGl0ICJidWlsZHMgYSBuZXcgcGF0dGVybiIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QucGFydGlhbF9leHBhbmQoOnR3byA9PiAiMiIpLnBhdHRlcm4pLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vP3R3bz0yeyZvbmV9LyIKKyAgICAgICAgKQorICAgICAgZW5kCisgICAgZW5kCisgICAgY29udGV4dCAicGFydGlhbF9leHBhbmQgd2l0aCBxdWVyeSBzdHJpbmciIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tL3s/dHdvLG9uZX0vIikKKyAgICAgIH0KKyAgICAgIGl0ICJidWlsZHMgYSBuZXcgcGF0dGVybiIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QucGFydGlhbF9leHBhbmQoOm9uZSA9PiAiMSIpLnBhdHRlcm4pLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vP29uZT0xeyZ0d299LyIKKyAgICAgICAgKQorICAgICAgZW5kCisgICAgZW5kCisgICAgY29udGV4dCAicGFydGlhbF9leHBhbmQgd2l0aCBwYXRoIG9wZXJhdG9yIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImh0dHA6Ly9leGFtcGxlLmNvbXsvb25lLHR3b30vIikKKyAgICAgIH0KKyAgICAgIGl0ICJidWlsZHMgYSBuZXcgcGF0dGVybiIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QucGFydGlhbF9leHBhbmQoOm9uZSA9PiAiMSIpLnBhdHRlcm4pLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vMXsvdHdvfS8iCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgInBhcnRpYWwgZXhwYW5kIHdpdGggdW5pY29kZSB2YWx1ZXMiIGRvCisgICAgICBzdWJqZWN0IGRvCisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImh0dHA6Ly9leGFtcGxlLmNvbS97cmVzb3VyY2V9L3txdWVyeX0vIikKKyAgICAgIGVuZAorICAgICAgaXQgIm5vcm1hbGl6ZXMgdW5pY29kZSBieSBkZWZhdWx0IiBkbworICAgICAgICB0ZW1wbGF0ZSA9IHN1YmplY3QucGFydGlhbF9leHBhbmQoInF1ZXJ5IiA9PiAiQ2FmZVx1MDMwMSIpCisgICAgICAgIGV4cGVjdCh0ZW1wbGF0ZS5wYXR0ZXJuKS50byBlcSgKKyAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3tyZXNvdXJjZX0vQ2FmJUMzJUE5LyIKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJkb2VzIG5vdCBub3JtYWxpemUgdW5pY29kZSB3aGVuIGJ5dGUgc2VtYW50aWNzIHJlcXVlc3RlZCIgZG8KKyAgICAgICAgdGVtcGxhdGUgPSBzdWJqZWN0LnBhcnRpYWxfZXhwYW5kKHsicXVlcnkiID0+ICJDYWZlXHUwMzAxIn0sIG5pbCwgZmFsc2UpCisgICAgICAgIGV4cGVjdCh0ZW1wbGF0ZS5wYXR0ZXJuKS50byBlcSgKKyAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3tyZXNvdXJjZX0vQ2FmZSVDQyU4MS8iCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgZGVzY3JpYmUgIlBhcnRpYWwgZXhwYW5kIHdpdGggc3RyaW5ncyIgZG8KKyAgICBjb250ZXh0ICJwYXJ0aWFsX2V4cGFuZCB3aXRoIHR3byBzaW1wbGUgdmFsdWVzIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImh0dHA6Ly9leGFtcGxlLmNvbS97b25lfS97dHdvfS8iKQorICAgICAgfQorICAgICAgaXQgImJ1aWxkcyBhIG5ldyBwYXR0ZXJuIiBkbworICAgICAgICBleHBlY3Qoc3ViamVjdC5wYXJ0aWFsX2V4cGFuZCgib25lIiA9PiAiMSIpLnBhdHRlcm4pLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vMS97dHdvfS8iCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgInBhcnRpYWxfZXhwYW5kIHF1ZXJ5IHdpdGggbWlzc2luZyBwYXJhbSBpbiBtaWRkbGUiIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tL3s/b25lLHR3byx0aHJlZX0vIikKKyAgICAgIH0KKyAgICAgIGl0ICJidWlsZHMgYSBuZXcgcGF0dGVybiIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QucGFydGlhbF9leHBhbmQoIm9uZSIgPT4gIjEiLCAidGhyZWUiID0+ICIzIikucGF0dGVybikudG8gZXEoCisgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8/b25lPTF7JnR3b30mdGhyZWU9My8iCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgInBhcnRpYWxfZXhwYW5kIHdpdGggcXVlcnkgc3RyaW5nIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImh0dHA6Ly9leGFtcGxlLmNvbS97P3R3byxvbmV9LyIpCisgICAgICB9CisgICAgICBpdCAiYnVpbGRzIGEgbmV3IHBhdHRlcm4iIGRvCisgICAgICAgIGV4cGVjdChzdWJqZWN0LnBhcnRpYWxfZXhwYW5kKCJvbmUiID0+ICIxIikucGF0dGVybikudG8gZXEoCisgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8/b25lPTF7JnR3b30vIgorICAgICAgICApCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBjb250ZXh0ICJwYXJ0aWFsX2V4cGFuZCB3aXRoIHBhdGggb3BlcmF0b3IiIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tey9vbmUsdHdvfS8iKQorICAgICAgfQorICAgICAgaXQgImJ1aWxkcyBhIG5ldyBwYXR0ZXJuIiBkbworICAgICAgICBleHBlY3Qoc3ViamVjdC5wYXJ0aWFsX2V4cGFuZCgib25lIiA9PiAiMSIpLnBhdHRlcm4pLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vMXsvdHdvfS8iCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgZGVzY3JpYmUgIkV4cGFuZCIgZG8KKyAgICBjb250ZXh0ICJleHBhbmQgd2l0aCB1bmljb2RlIHZhbHVlcyIgZG8KKyAgICAgIHN1YmplY3QgZG8KKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tL3NlYXJjaC97cXVlcnl9LyIpCisgICAgICBlbmQKKyAgICAgIGl0ICJub3JtYWxpemVzIHVuaWNvZGUgYnkgZGVmYXVsdCIgZG8KKyAgICAgICAgdXJpID0gc3ViamVjdC5leHBhbmQoInF1ZXJ5IiA9PiAiQ2FmZVx1MDMwMSIpLnRvX3N0cgorICAgICAgICBleHBlY3QodXJpKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tL3NlYXJjaC9DYWYlQzMlQTkvIikKKyAgICAgIGVuZAorCisgICAgICBpdCAiZG9lcyBub3Qgbm9ybWFsaXplIHVuaWNvZGUgd2hlbiBieXRlIHNlbWFudGljcyByZXF1ZXN0ZWQiIGRvCisgICAgICAgIHVyaSA9IHN1YmplY3QuZXhwYW5kKHsgInF1ZXJ5IiA9PiAiQ2FmZVx1MDMwMSIgfSwgbmlsLCBmYWxzZSkudG9fc3RyCisgICAgICAgIGV4cGVjdCh1cmkpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20vc2VhcmNoL0NhZmUlQ0MlODEvIikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgImV4cGFuZCB3aXRoIGEgcHJvY2Vzc29yIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImh0dHA6Ly9leGFtcGxlLmNvbS9zZWFyY2gve3F1ZXJ5fS8iKQorICAgICAgfQorICAgICAgaXQgInByb2Nlc3NlcyBzcGFjZXMiIGRvCisgICAgICAgIGV4cGVjdChzdWJqZWN0LmV4cGFuZCh7InF1ZXJ5IiA9PiAiYW4gZXhhbXBsZSBzZWFyY2ggcXVlcnkifSwKKyAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlVHdvUHJvY2Vzc29yKS50b19zdHIpLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vc2VhcmNoL2FuK2V4YW1wbGUrc2VhcmNoK3F1ZXJ5LyIKKyAgICAgICAgKQorICAgICAgZW5kCisgICAgICBpdCAidmFsaWRhdGVzIiBkbworICAgICAgICBleHBlY3R7CisgICAgICAgICAgc3ViamVjdC5leHBhbmQoeyJxdWVyeSIgPT4gIkJvZ3VzISJ9LAorICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVUd29Qcm9jZXNzb3IpLnRvX3N0cgorICAgICAgICB9LnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpUZW1wbGF0ZTo6SW52YWxpZFRlbXBsYXRlVmFsdWVFcnJvcikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgInBhcnRpYWxfZXhwYW5kIHF1ZXJ5IHdpdGggbWlzc2luZyBwYXJhbSBpbiBtaWRkbGUiIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tL3s/b25lLHR3byx0aHJlZX0vIikKKyAgICAgIH0KKyAgICAgIGl0ICJidWlsZHMgYSBuZXcgcGF0dGVybiIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QucGFydGlhbF9leHBhbmQoIm9uZSIgPT4gIjEiLCAidGhyZWUiID0+ICIzIikucGF0dGVybikudG8gZXEoCisgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8/b25lPTF7JnR3b30mdGhyZWU9My8iCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgInBhcnRpYWxfZXhwYW5kIHdpdGggcXVlcnkgc3RyaW5nIiBkbworICAgICAgc3ViamVjdCB7CisgICAgICAgIEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImh0dHA6Ly9leGFtcGxlLmNvbS97P3R3byxvbmV9LyIpCisgICAgICB9CisgICAgICBpdCAiYnVpbGRzIGEgbmV3IHBhdHRlcm4iIGRvCisgICAgICAgIGV4cGVjdChzdWJqZWN0LnBhcnRpYWxfZXhwYW5kKCJvbmUiID0+ICIxIikucGF0dGVybikudG8gZXEoCisgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8/b25lPTF7JnR3b30vIgorICAgICAgICApCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBjb250ZXh0ICJwYXJ0aWFsX2V4cGFuZCB3aXRoIHBhdGggb3BlcmF0b3IiIGRvCisgICAgICBzdWJqZWN0IHsKKyAgICAgICAgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiaHR0cDovL2V4YW1wbGUuY29tey9vbmUsdHdvfS8iKQorICAgICAgfQorICAgICAgaXQgImJ1aWxkcyBhIG5ldyBwYXR0ZXJuIiBkbworICAgICAgICBleHBlY3Qoc3ViamVjdC5wYXJ0aWFsX2V4cGFuZCgib25lIiA9PiAiMSIpLnBhdHRlcm4pLnRvIGVxKAorICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vMXsvdHdvfS8iCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgY29udGV4dCAiTWF0Y2hpbmcgd2l0aCBvcGVyYXRvcnMiIGRvCisgICAgZGVzY3JpYmUgIkxldmVsIDE6IiBkbworICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImZvb3tmb299L3tiYXJ9YmF6IikgfQorICAgICAgaXQgImNhbiBtYXRjaCIgZG8KKyAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goImZvb2Zvby9iYW5hbmFiYXoiKQorICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJmb28iXSkudG8gZXEoImZvbyIpCisgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImJhciJdKS50byBlcSgiYmFuYW5hIikKKyAgICAgIGVuZAorICAgICAgaXQgImNhbiBmYWlsIiBkbworICAgICAgICBleHBlY3Qoc3ViamVjdC5tYXRjaCgiYmFyL2ZvbyIpKS50byBiZV9uaWwKKyAgICAgICAgZXhwZWN0KHN1YmplY3QubWF0Y2goImZvb2JheiIpKS50byBiZV9uaWwKKyAgICAgIGVuZAorICAgICAgaXQgImNhbiBtYXRjaCBlbXB0eSIgZG8KKyAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goImZvby9iYXoiKQorICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJmb28iXSkudG8gZXEobmlsKQorICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJiYXIiXSkudG8gZXEobmlsKQorICAgICAgZW5kCisgICAgICBpdCAibGlzdHMgdmFycyIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QudmFyaWFibGVzKS50byBlcShbImZvbyIsICJiYXIiXSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgIkxldmVsIDI6IiBkbworICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImZvb3srZm9vfXsjYmFyfWJheiIpIH0KKyAgICAgIGl0ICJjYW4gbWF0Y2giIGRvCisgICAgICAgIGRhdGEgPSBzdWJqZWN0Lm1hdGNoKCJmb28vdGVzdC9iYW5hbmEjYmF6YmF6IikKKyAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1siZm9vIl0pLnRvIGVxKCIvdGVzdC9iYW5hbmEiKQorICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJiYXIiXSkudG8gZXEoImJheiIpCisgICAgICBlbmQKKyAgICAgIGl0ICJjYW4gbWF0Y2ggZW1wdHkgbGV2ZWwgMiAjIiBkbworICAgICAgICBkYXRhID0gc3ViamVjdC5tYXRjaCgiZm9vL3Rlc3QvYmFuYW5hYmF6IikKKyAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1siZm9vIl0pLnRvIGVxKCIvdGVzdC9iYW5hbmEiKQorICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJiYXIiXSkudG8gZXEobmlsKQorICAgICAgICBkYXRhID0gc3ViamVjdC5tYXRjaCgiZm9vL3Rlc3QvYmFuYW5hI2JheiIpCisgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImZvbyJdKS50byBlcSgiL3Rlc3QvYmFuYW5hIikKKyAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1siYmFyIl0pLnRvIGVxKCIiKQorICAgICAgZW5kCisgICAgICBpdCAiY2FuIG1hdGNoIGVtcHR5IGxldmVsIDIgKyIgZG8KKyAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goImZvb2JheiIpCisgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImZvbyJdKS50byBlcShuaWwpCisgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImJhciJdKS50byBlcShuaWwpCisgICAgICAgIGRhdGEgPSBzdWJqZWN0Lm1hdGNoKCJmb28jYmFyYmF6IikKKyAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1siZm9vIl0pLnRvIGVxKG5pbCkKKyAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1siYmFyIl0pLnRvIGVxKCJiYXIiKQorICAgICAgZW5kCisgICAgICBpdCAibGlzdHMgdmFycyIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QudmFyaWFibGVzKS50byBlcShbImZvbyIsICJiYXIiXSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgIkxldmVsIDM6IiBkbworICAgICAgY29udGV4dCAibm8gb3BlcmF0b3IiIGRvCisgICAgICAgIHN1YmplY3QgeyBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCJmb297Zm9vLGJhcn1iYXoiKSB9CisgICAgICAgIGl0ICJjYW4gbWF0Y2giIGRvCisgICAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goImZvb2ZvbyxiYXJiYXoiKQorICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImZvbyJdKS50byBlcSgiZm9vIikKKyAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJiYXIiXSkudG8gZXEoImJhciIpCisgICAgICAgIGVuZAorICAgICAgICBpdCAibGlzdHMgdmFycyIgZG8KKyAgICAgICAgICBleHBlY3Qoc3ViamVjdC52YXJpYWJsZXMpLnRvIGVxKFsiZm9vIiwgImJhciJdKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY29udGV4dCAiKyBvcGVyYXRvciIgZG8KKyAgICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImZvb3srZm9vLGJhcn1iYXoiKSB9CisgICAgICAgIGl0ICJjYW4gbWF0Y2giIGRvCisgICAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goImZvb2Zvby9iYXIsYmFyYmF6IikKKyAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJiYXIiXSkudG8gZXEoImZvby9iYXIsYmFyIikKKyAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJmb28iXSkudG8gZXEoIiIpCisgICAgICAgIGVuZAorICAgICAgICBpdCAibGlzdHMgdmFycyIgZG8KKyAgICAgICAgICBleHBlY3Qoc3ViamVjdC52YXJpYWJsZXMpLnRvIGVxKFsiZm9vIiwgImJhciJdKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY29udGV4dCAiLiBvcGVyYXRvciIgZG8KKyAgICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImZvb3suZm9vLGJhcn1iYXoiKSB9CisgICAgICAgIGl0ICJjYW4gbWF0Y2giIGRvCisgICAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goImZvby5mb28uYmFyYmF6IikKKyAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJmb28iXSkudG8gZXEoImZvbyIpCisgICAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1siYmFyIl0pLnRvIGVxKCJiYXIiKQorICAgICAgICBlbmQKKyAgICAgICAgaXQgImxpc3RzIHZhcnMiIGRvCisgICAgICAgICAgZXhwZWN0KHN1YmplY3QudmFyaWFibGVzKS50byBlcShbImZvbyIsICJiYXIiXSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGNvbnRleHQgIi8gb3BlcmF0b3IiIGRvCisgICAgICAgIHN1YmplY3QgeyBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCJmb297L2ZvbyxiYXJ9YmF6IikgfQorICAgICAgICBpdCAiY2FuIG1hdGNoIiBkbworICAgICAgICAgIGRhdGEgPSBzdWJqZWN0Lm1hdGNoKCJmb28vZm9vL2JhcmJheiIpCisgICAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1siZm9vIl0pLnRvIGVxKCJmb28iKQorICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImJhciJdKS50byBlcSgiYmFyIikKKyAgICAgICAgZW5kCisgICAgICAgIGl0ICJsaXN0cyB2YXJzIiBkbworICAgICAgICAgIGV4cGVjdChzdWJqZWN0LnZhcmlhYmxlcykudG8gZXEoWyJmb28iLCAiYmFyIl0pCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBjb250ZXh0ICI7IG9wZXJhdG9yIiBkbworICAgICAgICBzdWJqZWN0IHsgQWRkcmVzc2FibGU6OlRlbXBsYXRlLm5ldygiZm9veztmb28sYmFyLGJhen1iYXoiKSB9CisgICAgICAgIGl0ICJjYW4gbWF0Y2giIGRvCisgICAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goImZvbztmb289YmFyJTIwYmF6O2Jhcj1mb287YmF6YmF6IikKKyAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJmb28iXSkudG8gZXEoImJhciBiYXoiKQorICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImJhciJdKS50byBlcSgiZm9vIikKKyAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJiYXoiXSkudG8gZXEoIiIpCisgICAgICAgIGVuZAorICAgICAgICBpdCAibGlzdHMgdmFycyIgZG8KKyAgICAgICAgICBleHBlY3Qoc3ViamVjdC52YXJpYWJsZXMpLnRvIGVxKCV3KGZvbyBiYXIgYmF6KSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGNvbnRleHQgIj8gb3BlcmF0b3IiIGRvCisgICAgICAgIGNvbnRleHQgInRlc3QiIGRvCisgICAgICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImZvb3s/Zm9vLGJhcn1iYXoiKSB9CisgICAgICAgICAgaXQgImNhbiBtYXRjaCIgZG8KKyAgICAgICAgICAgIGRhdGEgPSBzdWJqZWN0Lm1hdGNoKCJmb28/Zm9vPWJhciUyMGJheiZiYXI9Zm9vYmF6IikKKyAgICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImZvbyJdKS50byBlcSgiYmFyIGJheiIpCisgICAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJiYXIiXSkudG8gZXEoImZvbyIpCisgICAgICAgICAgZW5kCisgICAgICAgICAgaXQgImxpc3RzIHZhcnMiIGRvCisgICAgICAgICAgICBleHBlY3Qoc3ViamVjdC52YXJpYWJsZXMpLnRvIGVxKCV3KGZvbyBiYXIpKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBjb250ZXh0ICJpc3N1ZSAjMTM3IiBkbworICAgICAgICAgIHN1YmplY3QgeyBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCcvcGF0aHs/cGFnZSxwZXJfcGFnZX0nKSB9CisKKyAgICAgICAgICBpdCAiY2FuIG1hdGNoIGVtcHR5IiBkbworICAgICAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goIi9wYXRoIikKKyAgICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbInBhZ2UiXSkudG8gZXEobmlsKQorICAgICAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1sicGVyX3BhZ2UiXSkudG8gZXEobmlsKQorICAgICAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZy5rZXlzLnNvcnQpLnRvIGVxKFsncGFnZScsICdwZXJfcGFnZSddKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgaXQgImNhbiBtYXRjaCBmaXJzdCB2YXIiIGRvCisgICAgICAgICAgICBkYXRhID0gc3ViamVjdC5tYXRjaCgiL3BhdGg/cGFnZT0xIikKKyAgICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbInBhZ2UiXSkudG8gZXEoIjEiKQorICAgICAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1sicGVyX3BhZ2UiXSkudG8gZXEobmlsKQorICAgICAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZy5rZXlzLnNvcnQpLnRvIGVxKFsncGFnZScsICdwZXJfcGFnZSddKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgaXQgImNhbiBtYXRjaCBzZWNvbmQgdmFyIiBkbworICAgICAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goIi9wYXRoP3Blcl9wYWdlPTEiKQorICAgICAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1sicGFnZSJdKS50byBlcShuaWwpCisgICAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJwZXJfcGFnZSJdKS50byBlcSgiMSIpCisgICAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nLmtleXMuc29ydCkudG8gZXEoWydwYWdlJywgJ3Blcl9wYWdlJ10pCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBpdCAiY2FuIG1hdGNoIGJvdGggdmFycyIgZG8KKyAgICAgICAgICAgIGRhdGEgPSBzdWJqZWN0Lm1hdGNoKCIvcGF0aD9wYWdlPTImcGVyX3BhZ2U9MSIpCisgICAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJwYWdlIl0pLnRvIGVxKCIyIikKKyAgICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbInBlcl9wYWdlIl0pLnRvIGVxKCIxIikKKyAgICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmcua2V5cy5zb3J0KS50byBlcShbJ3BhZ2UnLCAncGVyX3BhZ2UnXSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgY29udGV4dCAiaXNzdWUgIzcxIiBkbworICAgICAgICAgIHN1YmplY3QgeyBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCJodHRwOi8vY3liZXJzY29yZS5kZXYvYXBpL3VzZXJzez91c2VybmFtZX0iKSB9CisgICAgICAgICAgaXQgImNhbiBtYXRjaCIgZG8KKyAgICAgICAgICAgIGRhdGEgPSBzdWJqZWN0Lm1hdGNoKCJodHRwOi8vY3liZXJzY29yZS5kZXYvYXBpL3VzZXJzP3VzZXJuYW1lPWZvb2JheiIpCisgICAgICAgICAgICBleHBlY3QoZGF0YS5tYXBwaW5nWyJ1c2VybmFtZSJdKS50byBlcSgiZm9vYmF6IikKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBpdCAibGlzdHMgdmFycyIgZG8KKyAgICAgICAgICAgIGV4cGVjdChzdWJqZWN0LnZhcmlhYmxlcykudG8gZXEoJXcodXNlcm5hbWUpKQorICAgICAgICAgICAgZXhwZWN0KHN1YmplY3Qua2V5cykudG8gZXEoJXcodXNlcm5hbWUpKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY29udGV4dCAiJiBvcGVyYXRvciIgZG8KKyAgICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZS5uZXcoImZvb3smZm9vLGJhcn1iYXoiKSB9CisgICAgICAgIGl0ICJjYW4gbWF0Y2giIGRvCisgICAgICAgICAgZGF0YSA9IHN1YmplY3QubWF0Y2goImZvbyZmb289YmFyJTIwYmF6JmJhcj1mb29iYXoiKQorICAgICAgICAgIGV4cGVjdChkYXRhLm1hcHBpbmdbImZvbyJdKS50byBlcSgiYmFyIGJheiIpCisgICAgICAgICAgZXhwZWN0KGRhdGEubWFwcGluZ1siYmFyIl0pLnRvIGVxKCJmb28iKQorICAgICAgICBlbmQKKyAgICAgICAgaXQgImxpc3RzIHZhcnMiIGRvCisgICAgICAgICAgZXhwZWN0KHN1YmplY3QudmFyaWFibGVzKS50byBlcSgldyhmb28gYmFyKSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgY29udGV4dCAic3VwcG9ydCByZWdleGVzOiIgZG8KKyAgICBjb250ZXh0ICJFWFBSRVNTSU9OIiBkbworICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZTo6RVhQUkVTU0lPTiB9CisgICAgICBpdCAic2hvdWxkIGJlIGFibGUgdG8gbWF0Y2ggYW4gZXhwcmVzc2lvbiIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvIG1hdGNoKCJ7Zm9vfSIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS50byBtYXRjaCgie2Zvbyw5fSIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS50byBtYXRjaCgie2Zvby5iYXIsYmF6fSIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS50byBtYXRjaCgieytmb28uYmFyLGJhen0iKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goIntmb28sZm9vJTIwYmFyfSIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS50byBtYXRjaCgieyNmb286MjAsYmF6Kn0iKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goInN0dWZmeyNmb286MjAsYmF6Kn10aGluZ3MiKQorICAgICAgZW5kCisgICAgICBpdCAic2hvdWxkIGZhaWwgb24gbm9uIHZhcnMiIGRvCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS5ub3RfdG8gbWF0Y2goIiF7Zm9vIikKKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLm5vdF90byBtYXRjaCgie2Zvby5iYXIufSIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS5ub3RfdG8gbWF0Y2goIiF7fSIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBjb250ZXh0ICJWQVJOQU1FIiBkbworICAgICAgc3ViamVjdCB7IEFkZHJlc3NhYmxlOjpUZW1wbGF0ZTo6VkFSTkFNRSB9CisgICAgICBpdCAic2hvdWxkIGJlIGFibGUgdG8gbWF0Y2ggYSB2YXJpYWJsZSIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvIG1hdGNoKCJmb28iKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goIjkiKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goImZvby5iYXIiKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goImZvb19iYXIiKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goImZvb19iYXIuYmF6IikKKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvIG1hdGNoKCJmb28lMjBiYXIiKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goImZvbyUyMGJhci5iYXoiKQorICAgICAgZW5kCisgICAgICBpdCAic2hvdWxkIGZhaWwgb24gbm9uIHZhcnMiIGRvCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS5ub3RfdG8gbWF0Y2goIiFmb28iKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkubm90X3RvIG1hdGNoKCJmb28uYmFyLiIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS5ub3RfdG8gbWF0Y2goImZvbyUyJTAwYmFyIikKKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLm5vdF90byBtYXRjaCgiZm9vX2JhJXIiKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkubm90X3RvIG1hdGNoKCJmb29fYmFyKiIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS5ub3RfdG8gbWF0Y2goImZvb19iYXI6MjAiKQorICAgICAgZW5kCisgICAgZW5kCisgICAgY29udGV4dCAiVkFSSUFCTEVfTElTVCIgZG8KKyAgICAgIHN1YmplY3QgeyBBZGRyZXNzYWJsZTo6VGVtcGxhdGU6OlZBUklBQkxFX0xJU1QgfQorICAgICAgaXQgInNob3VsZCBiZSBhYmxlIHRvIG1hdGNoIGEgdmFyaWFibGUgbGlzdCIgZG8KKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvIG1hdGNoKCJmb28sYmFyIikKKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvIG1hdGNoKCJmb28iKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goImZvbyxiYXIqLGJheiIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS50byBtYXRjaCgiZm9vLmJhcixiYXJfYmF6KixiYXo6MTIiKQorICAgICAgZW5kCisgICAgICBpdCAic2hvdWxkIGZhaWwgb24gbm9uIHZhcnMiIGRvCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS5ub3RfdG8gbWF0Y2goIixmb28sYmFyKixiYXoiKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkubm90X3RvIG1hdGNoKCJmb28sKmJhcixiYXoiKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkubm90X3RvIG1hdGNoKCJmb28sLGJhciosYmF6IikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgIlZBUlNQRUMiIGRvCisgICAgICBzdWJqZWN0IHsgQWRkcmVzc2FibGU6OlRlbXBsYXRlOjpWQVJTUEVDIH0KKyAgICAgIGl0ICJzaG91bGQgYmUgYWJsZSB0byBtYXRjaCBhIHZhcmlhYmxlIHdpdGggbW9kaWZpZXIiIGRvCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS50byBtYXRjaCgiOTo4IikKKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvIG1hdGNoKCJmb28uYmFyKiIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS50byBtYXRjaCgiZm9vX2JhcjoxMiIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS50byBtYXRjaCgiZm9vX2Jhci5iYXoqIikKKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvIG1hdGNoKCJmb28lMjBiYXI6MTIiKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkudG8gbWF0Y2goImZvbyUyMGJhci5iYXoqIikKKyAgICAgIGVuZAorICAgICAgaXQgInNob3VsZCBmYWlsIG9uIG5vbiB2YXJzIiBkbworICAgICAgICBleHBlY3Qoc3ViamVjdCkubm90X3RvIG1hdGNoKCIhZm9vIikKKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLm5vdF90byBtYXRjaCgiKmZvbyIpCisgICAgICAgIGV4cGVjdChzdWJqZWN0KS5ub3RfdG8gbWF0Y2goImZvKm8iKQorICAgICAgICBleHBlY3Qoc3ViamVjdCkubm90X3RvIG1hdGNoKCJmbzpvIikKKyAgICAgICAgZXhwZWN0KHN1YmplY3QpLm5vdF90byBtYXRjaCgiZm9vOiIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlRlbXBsYXRlOjpNYXRjaERhdGEgZG8KKyAgbGV0KDp0ZW1wbGF0ZSkgeyBBZGRyZXNzYWJsZTo6VGVtcGxhdGUubmV3KCd7Zm9vfS97YmFyfScpIH0KKyAgc3ViamVjdCg6aXRzKSB7IHRlbXBsYXRlLm1hdGNoKCdhYi9jZCcpIH0KKyAgaXRzKDp1cmkpIHsgc2hvdWxkID09IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoJ2FiL2NkJykgfQorICBpdHMoOnRlbXBsYXRlKSB7IHNob3VsZCA9PSB0ZW1wbGF0ZSB9CisgIGl0cyg6bWFwcGluZykgeyBzaG91bGQgPT0geyAnZm9vJyA9PiAnYWInLCAnYmFyJyA9PiAnY2QnIH0gfQorICBpdHMoOnZhcmlhYmxlcykgeyBzaG91bGQgPT0gWydmb28nLCAnYmFyJ10gfQorICBpdHMoOmtleXMpIHsgc2hvdWxkID09IFsnZm9vJywgJ2JhciddIH0KKyAgaXRzKDpuYW1lcykgeyBzaG91bGQgPT0gWydmb28nLCAnYmFyJ10gfQorICBpdHMoOnZhbHVlcykgeyBzaG91bGQgPT0gWydhYicsICdjZCddIH0KKyAgaXRzKDpjYXB0dXJlcykgeyBzaG91bGQgPT0gWydhYicsICdjZCddIH0KKyAgaXRzKDp0b19hKSB7IHNob3VsZCA9PSBbJ2FiL2NkJywgJ2FiJywgJ2NkJ10gfQorICBpdHMoOnRvX3MpIHsgc2hvdWxkID09ICdhYi9jZCcgfQorICBpdHMoOnN0cmluZykgeyBzaG91bGQgPT0gaXRzLnRvX3MgfQorICBpdHMoOnByZV9tYXRjaCkgeyBzaG91bGQgPT0gIiIgfQorICBpdHMoOnBvc3RfbWF0Y2gpIHsgc2hvdWxkID09ICIiIH0KKworICBkZXNjcmliZSAndmFsdWVzX2F0JyBkbworICAgIGl0ICdyZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIHZhbHVlcycgZG8KKyAgICAgIGV4cGVjdChpdHMudmFsdWVzX2F0KDAsIDIpKS50byBlcShbJ2FiL2NkJywgJ2NkJ10pCisgICAgZW5kCisgICAgaXQgJ2FsbG93cyBtaXhpbmcgaW50ZWdlciBhbiBzdHJpbmcga2V5cycgZG8KKyAgICAgIGV4cGVjdChpdHMudmFsdWVzX2F0KCdmb28nLCAxKSkudG8gZXEoWydhYicsICdhYiddKQorICAgIGVuZAorICAgIGl0ICdhY2NlcHRzIHVua25vd24ga2V5cycgZG8KKyAgICAgIGV4cGVjdChpdHMudmFsdWVzX2F0KCdiYXonLCAnZm9vJykpLnRvIGVxKFtuaWwsICdhYiddKQorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAnW10nIGRvCisgICAgY29udGV4dCAnc3RyaW5nIGtleScgZG8KKyAgICAgIGl0ICdyZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGNhcHR1cmUnIGRvCisgICAgICAgIGV4cGVjdChpdHNbJ2ZvbyddKS50byBlcSgnYWInKQorICAgICAgICBleHBlY3QoaXRzWydiYXInXSkudG8gZXEoJ2NkJykKKyAgICAgIGVuZAorICAgICAgaXQgJ3JldHVybnMgbmlsIGZvciB1bmtub3duIGtleXMnIGRvCisgICAgICAgIGV4cGVjdChpdHNbJ2JheiddKS50byBiZV9uaWwKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgJ3N5bWJvbCBrZXknIGRvCisgICAgICBpdCAncmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBjYXB0dXJlJyBkbworICAgICAgICBleHBlY3QoaXRzWzpmb29dKS50byBlcSgnYWInKQorICAgICAgICBleHBlY3QoaXRzWzpiYXJdKS50byBlcSgnY2QnKQorICAgICAgZW5kCisgICAgICBpdCAncmV0dXJucyBuaWwgZm9yIHVua25vd24ga2V5cycgZG8KKyAgICAgICAgZXhwZWN0KGl0c1s6YmF6XSkudG8gYmVfbmlsCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBjb250ZXh0ICdpbnRlZ2VyIGtleScgZG8KKyAgICAgIGl0ICdyZXR1cm5zIHRoZSBmdWxsIFVSSSBmb3IgaW5kZXggMCcgZG8KKyAgICAgICAgZXhwZWN0KGl0c1swXSkudG8gZXEoJ2FiL2NkJykKKyAgICAgIGVuZAorICAgICAgaXQgJ3JldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgY2FwdHVyZScgZG8KKyAgICAgICAgZXhwZWN0KGl0c1sxXSkudG8gZXEoJ2FiJykKKyAgICAgICAgZXhwZWN0KGl0c1syXSkudG8gZXEoJ2NkJykKKyAgICAgIGVuZAorICAgICAgaXQgJ3JldHVybnMgbmlsIGZvciB1bmtub3duIGtleXMnIGRvCisgICAgICAgIGV4cGVjdChpdHNbM10pLnRvIGJlX25pbAorICAgICAgZW5kCisgICAgZW5kCisgICAgY29udGV4dCAnb3RoZXIga2V5JyBkbworICAgICAgaXQgJ3JhaXNlcyBhbiBleGNlcHRpb24nIGRvCisgICAgICAgIGV4cGVjdCB7IGl0c1tPYmplY3QubmV3XSB9LnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGNvbnRleHQgJ3dpdGggbGVuZ3RoJyBkbworICAgICAgaXQgJ3JldHVybnMgYW4gYXJyYXkgc3RhcnRpbmcgYXQgaW5kZXggd2l0aCBnaXZlbiBsZW5ndGgnIGRvCisgICAgICAgIGV4cGVjdChpdHNbMCwgMl0pLnRvIGVxKFsnYWIvY2QnLCAnYWInXSkKKyAgICAgICAgZXhwZWN0KGl0c1syLCAxXSkudG8gZXEoWydjZCddKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi9zcGVjL2FkZHJlc3NhYmxlL3VyaV9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS91cmlfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE1YzI4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9hZGRyZXNzYWJsZS91cmlfc3BlYy5yYgpAQCAtMCwwICsxLDY0NjggQEAKKyMgY29kaW5nOiB1dGYtOAorIyBDb3B5cmlnaHQgKEMpIEJvYiBBbWFuCisjCisjICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworcmVxdWlyZSAic3BlY19oZWxwZXIiCisKK3JlcXVpcmUgImFkZHJlc3NhYmxlL3VyaSIKK3JlcXVpcmUgInVyaSIKK3JlcXVpcmUgImlwYWRkciIKKworaWYgISIiLnJlc3BvbmRfdG8/KCJmb3JjZV9lbmNvZGluZyIpCisgIGNsYXNzIFN0cmluZworICAgIGRlZiBmb3JjZV9lbmNvZGluZyhlbmNvZGluZykKKyAgICAgIEBlbmNvZGluZyA9IGVuY29kaW5nCisgICAgZW5kCisKKyAgICBkZWYgZW5jb2RpbmcKKyAgICAgIEBlbmNvZGluZyB8fD0gRW5jb2Rpbmc6OkFTQ0lJXzhCSVQKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgRW5jb2RpbmcKKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lKQorICAgICAgQG5hbWUgPSBuYW1lCisgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgcmV0dXJuIEBuYW1lCisgICAgZW5kCisKKyAgICBVVEZfOCA9IEVuY29kaW5nLm5ldygiVVRGLTgiKQorICAgIEFTQ0lJXzhCSVQgPSBFbmNvZGluZy5uZXcoIlVTLUFTQ0lJIikKKyAgZW5kCitlbmQKKworbW9kdWxlIEZha2UKKyAgbW9kdWxlIFVSSQorICAgIGNsYXNzIEhUVFAKKyAgICAgIGRlZiBpbml0aWFsaXplKHVyaSkKKyAgICAgICAgQHVyaSA9IHVyaQorICAgICAgZW5kCisKKyAgICAgIGRlZiB0b19zCisgICAgICAgIHJldHVybiBAdXJpLnRvX3MKKyAgICAgIGVuZAorCisgICAgICBhbGlhcyA6dG9fc3RyIDp0b19zCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhIG5vbi1udW1lcmljIHBvcnQgbnVtYmVyIiBkbworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkubmV3KDpwb3J0ID0+ICJib2d1cyIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhIGludmFsaWQgZW5jb2RlZCBwb3J0IG51bWJlciIgZG8KKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldyg6cG9ydCA9PiAiJWViIikKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGEgbm9uLXN0cmluZyBzY2hlbWUiIGRvCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5uZXcoOnNjaGVtZSA9PiA6Ym9ndXMpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhIG5vbi1zdHJpbmcgdXNlciIgZG8KKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldyg6dXNlciA9PiA6Ym9ndXMpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhIG5vbi1zdHJpbmcgcGFzc3dvcmQiIGRvCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5uZXcoOnBhc3N3b3JkID0+IDpib2d1cykKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGEgbm9uLXN0cmluZyB1c2VyaW5mbyIgZG8KKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldyg6dXNlcmluZm8gPT4gOmJvZ3VzKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYSBub24tc3RyaW5nIGhvc3QiIGRvCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5uZXcoOmhvc3QgPT4gOmJvZ3VzKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYSBub24tc3RyaW5nIGF1dGhvcml0eSIgZG8KKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldyg6YXV0aG9yaXR5ID0+IDpib2d1cykKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGEgbm9uLXN0cmluZyBwYXRoIiBkbworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkubmV3KDpwYXRoID0+IDpib2d1cykKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGEgbm9uLXN0cmluZyBxdWVyeSIgZG8KKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldyg6cXVlcnkgPT4gOmJvZ3VzKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYSBub24tc3RyaW5nIGZyYWdtZW50IiBkbworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkubmV3KDpmcmFnbWVudCA9PiA6Ym9ndXMpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhIHNjaGVtZSBidXQgbm8gaGllcmFyY2hpY2FsICIgKworICAgICJzZWdtZW50IiBkbworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6IikKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgInF1b3RlIGhhbmRsaW5nIiBkbworICBkZXNjcmliZSAnaW4gaG9zdCBuYW1lJyBkbworICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgZm9yIHNpbmdsZSBxdW90ZSIgZG8KKyAgICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2xvY2FsXCJob3N0LyIpCisgICAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIm5ld2xpbmUgbm9ybWFsaXphdGlvbiIgZG8KKyAgaXQgInNob3VsZCBub3QgYWNjZXB0IG5ld2xpbmVzIGluIHNjaGVtZSIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodCUwYXRwOi8vbG9jYWxob3N0LyIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IHVuZXNjYXBlIG5ld2xpbmUgaW4gcGF0aCIgZG8KKyAgICB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vbG9jYWxob3N0LyUwYSIpLm5vcm1hbGl6ZQorICAgIGV4cGVjdCh1cmkudG9fcykudG8gZXEoImh0dHA6Ly9sb2NhbGhvc3QvJTBBIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgdW5lc2NhcGUgbmV3bGluZSBpbiBob3N0bmFtZSIgZG8KKyAgICB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vbG9jYWwlMGFob3N0LyIpLm5vcm1hbGl6ZQorICAgIGV4cGVjdCh1cmkudG9fcykudG8gZXEoImh0dHA6Ly9sb2NhbCUwQWhvc3QvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgdW5lc2NhcGUgbmV3bGluZSBpbiB1c2VybmFtZSIgZG8KKyAgICB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZm9vJTBhYmFyQGxvY2FsaG9zdC8iKS5ub3JtYWxpemUKKyAgICBleHBlY3QodXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vZm9vJTBBYmFyQGxvY2FsaG9zdC8iKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCB1bmVzY2FwZSBuZXdsaW5lIGluIHVzZXJuYW1lIiBkbworICAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlOmZvbyUwYWJhckBleGFtcGxlLyIpLm5vcm1hbGl6ZQorICAgIGV4cGVjdCh1cmkudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlOmZvbyUwQWJhckBleGFtcGxlLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGFjY2VwdCBuZXdsaW5lIGluIGhvc3RuYW1lIiBkbworICAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9sb2NhbGhvc3QvIikKKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICB1cmkuaG9zdCA9ICJsb2NhbFxuaG9zdCIKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGFtYmlndW91cyBwYXRoIiBkbworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIjo6aHR0cCIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhbiBpbnZhbGlkIGhvc3QiIGRvCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5uZXcoOmhvc3QgPT4gIjxpbnZhbGlkPiIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhIGhvc3QgY29uc2lzdGluZyBvZiAiICsKKyAgICAic3ViLWRlbGltcyBjaGFyYWN0ZXJzIiBkbworICBpdCAic2hvdWxkIG5vdCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldygKKyAgICAgICAgOmhvc3QgPT4gQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6U1VCX0RFTElNUy5nc3ViKC9cXC8sICcnKQorICAgICAgKQorICAgIGVuZCkubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBhIGhvc3QgY29uc2lzdGluZyBvZiAiICsKKyAgICAidW5yZXNlcnZlZCBjaGFyYWN0ZXJzIiBkbworICBpdCAic2hvdWxkIG5vdCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldygKKyAgICAgICAgOmhvc3QgPT4gQWRkcmVzc2FibGU6OlVSSTo6Q2hhcmFjdGVyQ2xhc3Nlczo6VU5SRVNFUlZFRC5nc3ViKC9cXC8sICcnKQorICAgICAgKQorICAgIGVuZCkubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgZnJvbSBuaWwgY29tcG9uZW50cyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkubmV3CisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIG5pbCBzaXRlIHZhbHVlIiBkbworICAgIGV4cGVjdChAdXJpLnNpdGUpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIGVtcHR5IHBhdGgiIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgYW4gZW1wdHkgdXJpIiBkbworICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBuaWwgZGVmYXVsdCBwb3J0IiBkbworICAgIGV4cGVjdChAdXJpLmRlZmF1bHRfcG9ydCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGVtcHR5IiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9lbXB0eQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIHRoZSBzY2hlbWUgaXMgc2V0IHRvIHdoaXRlc3BhY2UiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5zY2hlbWUgPSAiXHQgXG4iCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIHNjaGVtZSBpcyBzZXQgdG8gYWxsIGRpZ2l0cyIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnNjaGVtZSA9ICIxMjMiCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIHNjaGVtZSBiZWdpbnMgd2l0aCBhIGRpZ2l0IiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkuc2NoZW1lID0gIjFzY2hlbWUiCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIHNjaGVtZSBiZWdpbnMgd2l0aCBhIHBsdXMiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5zY2hlbWUgPSAiK3NjaGVtZSIKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBpZiB0aGUgc2NoZW1lIGJlZ2lucyB3aXRoIGEgZG90IiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkuc2NoZW1lID0gIi5zY2hlbWUiCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIHNjaGVtZSBiZWdpbnMgd2l0aCBhIGRhc2giIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5zY2hlbWUgPSAiLXNjaGVtZSIKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBpZiB0aGUgc2NoZW1lIGNvbnRhaW5zIGFuIGlsbGVnYWwgY2hhcmFjdGVyIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkuc2NoZW1lID0gInNjaGVtZSEiCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIHNjaGVtZSBjb250YWlucyB3aGl0ZXNwYWNlIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkuc2NoZW1lID0gInNjaCBlbWUiCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIHNjaGVtZSBjb250YWlucyBhIG5ld2xpbmUiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5zY2hlbWUgPSAic2NoXG5lbWUiCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgaWYgc2V0IGludG8gYW4gaW52YWxpZCBzdGF0ZSIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnVzZXIgPSAidXNlciIKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBpZiBzZXQgaW50byBhbiBpbnZhbGlkIHN0YXRlIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkucGFzc3dvcmQgPSAicGFzcyIKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBpZiBzZXQgaW50byBhbiBpbnZhbGlkIHN0YXRlIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkuc2NoZW1lID0gImh0dHAiCisgICAgICBAdXJpLmZyYWdtZW50ID0gImZyYWdtZW50IgorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIHNldCBpbnRvIGFuIGludmFsaWQgc3RhdGUiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5mcmFnbWVudCA9ICJmcmFnbWVudCIKKyAgICAgIEB1cmkuc2NoZW1lID0gImh0dHAiCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGluaXRpYWxpemVkIGZyb20gaW5kaXZpZHVhbCBjb21wb25lbnRzIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5uZXcoCisgICAgICA6c2NoZW1lID0+ICJodHRwIiwKKyAgICAgIDp1c2VyID0+ICJ1c2VyIiwKKyAgICAgIDpwYXNzd29yZCA9PiAicGFzc3dvcmQiLAorICAgICAgOmhvc3QgPT4gImV4YW1wbGUuY29tIiwKKyAgICAgIDpwb3J0ID0+IDgwODAsCisgICAgICA6cGF0aCA9PiAiL3BhdGgiLAorICAgICAgOnF1ZXJ5ID0+ICJxdWVyeT12YWx1ZSIsCisgICAgICA6ZnJhZ21lbnQgPT4gImZyYWdtZW50IgorICAgICkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2h0dHAnIGZvciAjc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnaHR0cCcgZm9yICNub3JtYWxpemVkX3NjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3NjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAicmV0dXJucyAndXNlcicgZm9yICN1c2VyIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJ1c2VyIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3VzZXInIGZvciAjbm9ybWFsaXplZF91c2VyIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfdXNlcikudG8gZXEoInVzZXIiKQorICBlbmQKKworICBpdCAicmV0dXJucyAncGFzc3dvcmQnIGZvciAjcGFzc3dvcmQiIGRvCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCJwYXNzd29yZCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdwYXNzd29yZCcgZm9yICNub3JtYWxpemVkX3Bhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcGFzc3dvcmQpLnRvIGVxKCJwYXNzd29yZCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICd1c2VyOnBhc3N3b3JkJyBmb3IgI3VzZXJpbmZvIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXJpbmZvKS50byBlcSgidXNlcjpwYXNzd29yZCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICd1c2VyOnBhc3N3b3JkJyBmb3IgI25vcm1hbGl6ZWRfdXNlcmluZm8iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF91c2VyaW5mbykudG8gZXEoInVzZXI6cGFzc3dvcmQiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnZXhhbXBsZS5jb20nIGZvciAjaG9zdCIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAicmV0dXJucyAnZXhhbXBsZS5jb20nIGZvciAjbm9ybWFsaXplZF9ob3N0IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2NvbScgZm9yICN0bGQiIGRvCisgICAgZXhwZWN0KEB1cmkudGxkKS50byBlcSgiY29tIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCcgZm9yICNhdXRob3JpdHkiIGRvCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgidXNlcjpwYXNzd29yZEBleGFtcGxlLmNvbTo4MDgwIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCcgZm9yICNub3JtYWxpemVkX2F1dGhvcml0eSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX2F1dGhvcml0eSkudG8gZXEoInVzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIDgwODAgZm9yICNwb3J0IiBkbworICAgIGV4cGVjdChAdXJpLnBvcnQpLnRvIGVxKDgwODApCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIDgwODAgZm9yICNub3JtYWxpemVkX3BvcnQiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9wb3J0KS50byBlcSg4MDgwKQorICBlbmQKKworICBpdCAicmV0dXJucyA4MCBmb3IgI2RlZmF1bHRfcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5kZWZhdWx0X3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAicmV0dXJucyAnaHR0cDovL3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCcgZm9yICNzaXRlIiBkbworICAgIGV4cGVjdChAdXJpLnNpdGUpLnRvIGVxKCJodHRwOi8vdXNlcjpwYXNzd29yZEBleGFtcGxlLmNvbTo4MDgwIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2h0dHA6Ly91c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAnIGZvciAjbm9ybWFsaXplZF9zaXRlIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfc2l0ZSkudG8gZXEoImh0dHA6Ly91c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnL3BhdGgnIGZvciAjcGF0aCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiL3BhdGgiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnL3BhdGgnIGZvciAjbm9ybWFsaXplZF9wYXRoIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcGF0aCkudG8gZXEoIi9wYXRoIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3F1ZXJ5PXZhbHVlJyBmb3IgI3F1ZXJ5IiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcSgicXVlcnk9dmFsdWUiKQorICBlbmQKKworICBpdCAicmV0dXJucyAncXVlcnk9dmFsdWUnIGZvciAjbm9ybWFsaXplZF9xdWVyeSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3F1ZXJ5KS50byBlcSgicXVlcnk9dmFsdWUiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnZnJhZ21lbnQnIGZvciAjZnJhZ21lbnQiIGRvCisgICAgZXhwZWN0KEB1cmkuZnJhZ21lbnQpLnRvIGVxKCJmcmFnbWVudCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdmcmFnbWVudCcgZm9yICNub3JtYWxpemVkX2ZyYWdtZW50IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfZnJhZ21lbnQpLnRvIGVxKCJmcmFnbWVudCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICNoYXNoIiBkbworICAgIGV4cGVjdChAdXJpLmhhc2gpLm5vdF90byBiZSBuaWwKKyAgZW5kCisKKyAgaXQgInJldHVybnMgI3RvX3MiIGRvCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MC9wYXRoP3F1ZXJ5PXZhbHVlI2ZyYWdtZW50IgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgZW1wdHkiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9lbXB0eQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBmcm96ZW4iIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9mcm96ZW4KKyAgZW5kCisKKyAgaXQgInNob3VsZCBhbGxvdyBkZXN0cnVjdGl2ZSBvcGVyYXRpb25zIiBkbworICAgIGV4cGVjdCB7IEB1cmkubm9ybWFsaXplISB9Lm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBpbml0aWFsaXplZCBmcm9tICIgKworICAgICJmcm96ZW4gaW5kaXZpZHVhbCBjb21wb25lbnRzIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5uZXcoCisgICAgICA6c2NoZW1lID0+ICJodHRwIi5mcmVlemUsCisgICAgICA6dXNlciA9PiAidXNlciIuZnJlZXplLAorICAgICAgOnBhc3N3b3JkID0+ICJwYXNzd29yZCIuZnJlZXplLAorICAgICAgOmhvc3QgPT4gImV4YW1wbGUuY29tIi5mcmVlemUsCisgICAgICA6cG9ydCA9PiAiODA4MCIuZnJlZXplLAorICAgICAgOnBhdGggPT4gIi9wYXRoIi5mcmVlemUsCisgICAgICA6cXVlcnkgPT4gInF1ZXJ5PXZhbHVlIi5mcmVlemUsCisgICAgICA6ZnJhZ21lbnQgPT4gImZyYWdtZW50Ii5mcmVlemUKKyAgICApCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdodHRwJyBmb3IgI3NjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2h0dHAnIGZvciAjbm9ybWFsaXplZF9zY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3VzZXInIGZvciAjdXNlciIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcSgidXNlciIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICd1c2VyJyBmb3IgI25vcm1hbGl6ZWRfdXNlciIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3VzZXIpLnRvIGVxKCJ1c2VyIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3Bhc3N3b3JkJyBmb3IgI3Bhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgicGFzc3dvcmQiKQorICBlbmQKKworICBpdCAicmV0dXJucyAncGFzc3dvcmQnIGZvciAjbm9ybWFsaXplZF9wYXNzd29yZCIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3Bhc3N3b3JkKS50byBlcSgicGFzc3dvcmQiKQorICBlbmQKKworICBpdCAicmV0dXJucyAndXNlcjpwYXNzd29yZCcgZm9yICN1c2VyaW5mbyIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyaW5mbykudG8gZXEoInVzZXI6cGFzc3dvcmQiKQorICBlbmQKKworICBpdCAicmV0dXJucyAndXNlcjpwYXNzd29yZCcgZm9yICNub3JtYWxpemVkX3VzZXJpbmZvIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfdXNlcmluZm8pLnRvIGVxKCJ1c2VyOnBhc3N3b3JkIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2V4YW1wbGUuY29tJyBmb3IgI2hvc3QiIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2V4YW1wbGUuY29tJyBmb3IgI25vcm1hbGl6ZWRfaG9zdCIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX2hvc3QpLnRvIGVxKCJleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICd1c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAnIGZvciAjYXV0aG9yaXR5IiBkbworICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoInVzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICd1c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAnIGZvciAjbm9ybWFsaXplZF9hdXRob3JpdHkiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9hdXRob3JpdHkpLnRvIGVxKCJ1c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAiKQorICBlbmQKKworICBpdCAicmV0dXJucyA4MDgwIGZvciAjcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcSg4MDgwKQorICBlbmQKKworICBpdCAicmV0dXJucyA4MDgwIGZvciAjbm9ybWFsaXplZF9wb3J0IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcG9ydCkudG8gZXEoODA4MCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgODAgZm9yICNkZWZhdWx0X3BvcnQiIGRvCisgICAgZXhwZWN0KEB1cmkuZGVmYXVsdF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2h0dHA6Ly91c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAnIGZvciAjc2l0ZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zaXRlKS50byBlcSgiaHR0cDovL3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdodHRwOi8vdXNlcjpwYXNzd29yZEBleGFtcGxlLmNvbTo4MDgwJyBmb3IgI25vcm1hbGl6ZWRfc2l0ZSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3NpdGUpLnRvIGVxKCJodHRwOi8vdXNlcjpwYXNzd29yZEBleGFtcGxlLmNvbTo4MDgwIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJy9wYXRoJyBmb3IgI3BhdGgiIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi9wYXRoIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJy9wYXRoJyBmb3IgI25vcm1hbGl6ZWRfcGF0aCIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3BhdGgpLnRvIGVxKCIvcGF0aCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdxdWVyeT12YWx1ZScgZm9yICNxdWVyeSIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEoInF1ZXJ5PXZhbHVlIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3F1ZXJ5PXZhbHVlJyBmb3IgI25vcm1hbGl6ZWRfcXVlcnkiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9xdWVyeSkudG8gZXEoInF1ZXJ5PXZhbHVlIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2ZyYWdtZW50JyBmb3IgI2ZyYWdtZW50IiBkbworICAgIGV4cGVjdChAdXJpLmZyYWdtZW50KS50byBlcSgiZnJhZ21lbnQiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnZnJhZ21lbnQnIGZvciAjbm9ybWFsaXplZF9mcmFnbWVudCIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX2ZyYWdtZW50KS50byBlcSgiZnJhZ21lbnQiKQorICBlbmQKKworICBpdCAicmV0dXJucyAjaGFzaCIgZG8KKyAgICBleHBlY3QoQHVyaS5oYXNoKS5ub3RfdG8gYmUgbmlsCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICN0b19zIiBkbworICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly91c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAvcGF0aD9xdWVyeT12YWx1ZSNmcmFnbWVudCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGVtcHR5IiBkbworICAgIGV4cGVjdChAdXJpKS5ub3RfdG8gYmVfZW1wdHkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgZnJvemVuIiBkbworICAgIGV4cGVjdChAdXJpKS5ub3RfdG8gYmVfZnJvemVuCisgIGVuZAorCisgIGl0ICJzaG91bGQgYWxsb3cgZGVzdHJ1Y3RpdmUgb3BlcmF0aW9ucyIgZG8KKyAgICBleHBlY3QgeyBAdXJpLm5vcm1hbGl6ZSEgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gYSBmcm96ZW4gc3RyaW5nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgICAgICJodHRwOi8vdXNlcjpwYXNzd29yZEBleGFtcGxlLmNvbTo4MDgwL3BhdGg/cXVlcnk9dmFsdWUjZnJhZ21lbnQiLmZyZWV6ZQorICAgICkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2h0dHAnIGZvciAjc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnaHR0cCcgZm9yICNub3JtYWxpemVkX3NjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3NjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAicmV0dXJucyAndXNlcicgZm9yICN1c2VyIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJ1c2VyIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3VzZXInIGZvciAjbm9ybWFsaXplZF91c2VyIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfdXNlcikudG8gZXEoInVzZXIiKQorICBlbmQKKworICBpdCAicmV0dXJucyAncGFzc3dvcmQnIGZvciAjcGFzc3dvcmQiIGRvCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCJwYXNzd29yZCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdwYXNzd29yZCcgZm9yICNub3JtYWxpemVkX3Bhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcGFzc3dvcmQpLnRvIGVxKCJwYXNzd29yZCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICd1c2VyOnBhc3N3b3JkJyBmb3IgI3VzZXJpbmZvIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXJpbmZvKS50byBlcSgidXNlcjpwYXNzd29yZCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICd1c2VyOnBhc3N3b3JkJyBmb3IgI25vcm1hbGl6ZWRfdXNlcmluZm8iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF91c2VyaW5mbykudG8gZXEoInVzZXI6cGFzc3dvcmQiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnZXhhbXBsZS5jb20nIGZvciAjaG9zdCIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAicmV0dXJucyAnZXhhbXBsZS5jb20nIGZvciAjbm9ybWFsaXplZF9ob3N0IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCcgZm9yICNhdXRob3JpdHkiIGRvCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgidXNlcjpwYXNzd29yZEBleGFtcGxlLmNvbTo4MDgwIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCcgZm9yICNub3JtYWxpemVkX2F1dGhvcml0eSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX2F1dGhvcml0eSkudG8gZXEoInVzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIDgwODAgZm9yICNwb3J0IiBkbworICAgIGV4cGVjdChAdXJpLnBvcnQpLnRvIGVxKDgwODApCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIDgwODAgZm9yICNub3JtYWxpemVkX3BvcnQiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9wb3J0KS50byBlcSg4MDgwKQorICBlbmQKKworICBpdCAicmV0dXJucyA4MCBmb3IgI2RlZmF1bHRfcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5kZWZhdWx0X3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAicmV0dXJucyAnaHR0cDovL3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MCcgZm9yICNzaXRlIiBkbworICAgIGV4cGVjdChAdXJpLnNpdGUpLnRvIGVxKCJodHRwOi8vdXNlcjpwYXNzd29yZEBleGFtcGxlLmNvbTo4MDgwIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2h0dHA6Ly91c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAnIGZvciAjbm9ybWFsaXplZF9zaXRlIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfc2l0ZSkudG8gZXEoImh0dHA6Ly91c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnL3BhdGgnIGZvciAjcGF0aCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiL3BhdGgiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnL3BhdGgnIGZvciAjbm9ybWFsaXplZF9wYXRoIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcGF0aCkudG8gZXEoIi9wYXRoIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ3F1ZXJ5PXZhbHVlJyBmb3IgI3F1ZXJ5IiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcSgicXVlcnk9dmFsdWUiKQorICBlbmQKKworICBpdCAicmV0dXJucyAncXVlcnk9dmFsdWUnIGZvciAjbm9ybWFsaXplZF9xdWVyeSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3F1ZXJ5KS50byBlcSgicXVlcnk9dmFsdWUiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnZnJhZ21lbnQnIGZvciAjZnJhZ21lbnQiIGRvCisgICAgZXhwZWN0KEB1cmkuZnJhZ21lbnQpLnRvIGVxKCJmcmFnbWVudCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdmcmFnbWVudCcgZm9yICNub3JtYWxpemVkX2ZyYWdtZW50IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfZnJhZ21lbnQpLnRvIGVxKCJmcmFnbWVudCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICNoYXNoIiBkbworICAgIGV4cGVjdChAdXJpLmhhc2gpLm5vdF90byBiZSBuaWwKKyAgZW5kCisKKyAgaXQgInJldHVybnMgI3RvX3MiIGRvCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3VzZXI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODA4MC9wYXRoP3F1ZXJ5PXZhbHVlI2ZyYWdtZW50IgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgZW1wdHkiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9lbXB0eQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBmcm96ZW4iIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9mcm96ZW4KKyAgZW5kCisKKyAgaXQgInNob3VsZCBhbGxvdyBkZXN0cnVjdGl2ZSBvcGVyYXRpb25zIiBkbworICAgIGV4cGVjdCB7IEB1cmkubm9ybWFsaXplISB9Lm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBmcm96ZW4iIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLm5ldy5mcmVlemUKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNub3JtYWxpemVkX3NjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3NjaGVtZSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICN1c2VyIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjbm9ybWFsaXplZF91c2VyIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfdXNlcikudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNwYXNzd29yZCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNub3JtYWxpemVkX3Bhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjdXNlcmluZm8iIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcmluZm8pLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjbm9ybWFsaXplZF91c2VyaW5mbyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3VzZXJpbmZvKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIG5pbCBmb3IgI2hvc3QiIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNub3JtYWxpemVkX2hvc3QiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9ob3N0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIG5pbCBmb3IgI2F1dGhvcml0eSIgZG8KKyAgICBleHBlY3QoQHVyaS5hdXRob3JpdHkpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjbm9ybWFsaXplZF9hdXRob3JpdHkiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9hdXRob3JpdHkpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIG5pbCBmb3IgI25vcm1hbGl6ZWRfcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3BvcnQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjZGVmYXVsdF9wb3J0IiBkbworICAgIGV4cGVjdChAdXJpLmRlZmF1bHRfcG9ydCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNzaXRlIiBkbworICAgIGV4cGVjdChAdXJpLnNpdGUpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjbm9ybWFsaXplZF9zaXRlIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfc2l0ZSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyAnJyBmb3IgI3BhdGgiIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoJycpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICcnIGZvciAjbm9ybWFsaXplZF9wYXRoIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcGF0aCkudG8gZXEoJycpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIG5pbCBmb3IgI3F1ZXJ5IiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIG5pbCBmb3IgI25vcm1hbGl6ZWRfcXVlcnkiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9xdWVyeSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNmcmFnbWVudCIgZG8KKyAgICBleHBlY3QoQHVyaS5mcmFnbWVudCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNub3JtYWxpemVkX2ZyYWdtZW50IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfZnJhZ21lbnQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgI2hhc2giIGRvCisgICAgZXhwZWN0KEB1cmkuaGFzaCkubm90X3RvIGJlIG5pbAorICBlbmQKKworICBpdCAicmV0dXJucyAjdG9fcyIgZG8KKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgnJykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBlbXB0eSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gYmVfZW1wdHkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBmcm96ZW4iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2Zyb3plbgorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBmcm96ZW4gYWZ0ZXIgZHVwaW5nIiBkbworICAgIGV4cGVjdChAdXJpLmR1cCkubm90X3RvIGJlX2Zyb3plbgorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBhbGxvdyBkZXN0cnVjdGl2ZSBvcGVyYXRpb25zIiBkbworICAgIGV4cGVjdCB7IEB1cmkubm9ybWFsaXplISB9LnRvIHJhaXNlX2Vycm9yIHsgfGVycm9yfAorICAgICAgZXhwZWN0KGVycm9yLm1lc3NhZ2UpLnRvIG1hdGNoKC9jYW4ndCBtb2RpZnkgZnJvemVuLykKKyAgICAgIGV4cGVjdChlcnJvcikudG8gc2F0aXNmeSB7IHxlfCBSdW50aW1lRXJyb3IgPT09IGUgfHwgVHlwZUVycm9yID09PSBlIH0KKyAgICB9CisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGZyb3plbiIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoCisgICAgICAiSFRUUDovL2V4YW1wbGUuY29tLjolMzglMzAvJTcwYSU3NCU2OD9hPSUzMSMxJTMyMyIKKyAgICApLmZyZWV6ZQorICBlbmQKKworICBpdCAicmV0dXJucyAnSFRUUCcgZm9yICNzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiSFRUUCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdodHRwJyBmb3IgI25vcm1hbGl6ZWRfc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfc2NoZW1lKS50byBlcSgiaHR0cCIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLnNjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICN1c2VyIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjbm9ybWFsaXplZF91c2VyIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfdXNlcikudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNwYXNzd29yZCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAicmV0dXJucyBuaWwgZm9yICNub3JtYWxpemVkX3Bhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjdXNlcmluZm8iIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcmluZm8pLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjbm9ybWFsaXplZF91c2VyaW5mbyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3VzZXJpbmZvKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdleGFtcGxlLmNvbS4nIGZvciAjaG9zdCIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20uIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjbm9ybWFsaXplZF9ob3N0IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2V4YW1wbGUuY29tLjo4MCcgZm9yICNhdXRob3JpdHkiIGRvCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgiZXhhbXBsZS5jb20uOjgwIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2V4YW1wbGUuY29tOjgwJyBmb3IgI25vcm1hbGl6ZWRfYXV0aG9yaXR5IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfYXV0aG9yaXR5KS50byBlcSgiZXhhbXBsZS5jb20iKQorICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS5hdXRob3JpdHkpLnRvIGVxKCJleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIDgwIGZvciAjcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInJldHVybnMgbmlsIGZvciAjbm9ybWFsaXplZF9wb3J0IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcG9ydCkudG8gZXEobmlsKQorICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS5wb3J0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIDgwIGZvciAjZGVmYXVsdF9wb3J0IiBkbworICAgIGV4cGVjdChAdXJpLmRlZmF1bHRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdIVFRQOi8vZXhhbXBsZS5jb20uOjgwJyBmb3IgI3NpdGUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2l0ZSkudG8gZXEoIkhUVFA6Ly9leGFtcGxlLmNvbS46ODAiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnaHR0cDovL2V4YW1wbGUuY29tJyBmb3IgI25vcm1hbGl6ZWRfc2l0ZSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3NpdGUpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20iKQorICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS5zaXRlKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJy8lNzBhJTc0JTY4JyBmb3IgI3BhdGgiIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi8lNzBhJTc0JTY4IikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJy9wYXRoJyBmb3IgI25vcm1hbGl6ZWRfcGF0aCIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3BhdGgpLnRvIGVxKCIvcGF0aCIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLnBhdGgpLnRvIGVxKCIvcGF0aCIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICdhPSUzMScgZm9yICNxdWVyeSIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEoImE9JTMxIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJ2E9MScgZm9yICNub3JtYWxpemVkX3F1ZXJ5IiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcXVlcnkpLnRvIGVxKCJhPTEiKQorICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS5xdWVyeSkudG8gZXEoImE9MSIpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zICcvJTcwYSU3NCU2OD9hPSUzMScgZm9yICNyZXF1ZXN0X3VyaSIgZG8KKyAgICBleHBlY3QoQHVyaS5yZXF1ZXN0X3VyaSkudG8gZXEoIi8lNzBhJTc0JTY4P2E9JTMxIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgJzElMzIzJyBmb3IgI2ZyYWdtZW50IiBkbworICAgIGV4cGVjdChAdXJpLmZyYWdtZW50KS50byBlcSgiMSUzMjMiKQorICBlbmQKKworICBpdCAicmV0dXJucyAnMTIzJyBmb3IgI25vcm1hbGl6ZWRfZnJhZ21lbnQiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9mcmFnbWVudCkudG8gZXEoIjEyMyIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLmZyYWdtZW50KS50byBlcSgiMTIzIikKKyAgZW5kCisKKyAgaXQgInJldHVybnMgI2hhc2giIGRvCisgICAgZXhwZWN0KEB1cmkuaGFzaCkubm90X3RvIGJlIG5pbAorICBlbmQKKworICBpdCAicmV0dXJucyAjdG9fcyIgZG8KKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgnSFRUUDovL2V4YW1wbGUuY29tLjo4MC8lNzBhJTc0JTY4P2E9JTMxIzElMzIzJykKKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoJ2h0dHA6Ly9leGFtcGxlLmNvbS9wYXRoP2E9MSMxMjMnKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBlbXB0eSIgZG8KKyAgICBleHBlY3QoQHVyaSkubm90X3RvIGJlX2VtcHR5CisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgZnJvemVuIiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9mcm96ZW4KKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgZnJvemVuIGFmdGVyIGR1cGluZyIgZG8KKyAgICBleHBlY3QoQHVyaS5kdXApLm5vdF90byBiZV9mcm96ZW4KKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYWxsb3cgZGVzdHJ1Y3RpdmUgb3BlcmF0aW9ucyIgZG8KKyAgICBleHBlY3QgeyBAdXJpLm5vcm1hbGl6ZSEgfS50byByYWlzZV9lcnJvciB7IHxlcnJvcnwKKyAgICAgIGV4cGVjdChlcnJvci5tZXNzYWdlKS50byBtYXRjaCgvY2FuJ3QgbW9kaWZ5IGZyb3plbi8pCisgICAgICBleHBlY3QoZXJyb3IpLnRvIHNhdGlzZnkgeyB8ZXwgUnVudGltZUVycm9yID09PSBlIHx8IFR5cGVFcnJvciA9PT0gZSB9CisgICAgfQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIGZyb20gc3RyaW5nIGNvbXBvbmVudHMiIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLm5ldygKKyAgICAgIDpzY2hlbWUgPT4gImh0dHAiLCA6aG9zdCA9PiAiZXhhbXBsZS5jb20iCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBzaXRlIHZhbHVlIG9mICdodHRwOi8vZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLnNpdGUpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBlcXVpdmFsZW50IHBhcnNlZCBVUkkiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbSIpKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIGludmFsaWQgY29tcG9uZW50cyBvbWl0dGVkIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkub21pdCg6Ym9ndXMpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBcmd1bWVudEVycm9yKQorICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkub21pdCg6c2NoZW1lLCA6Ym9ndXMsIDpwYXRoKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQXJndW1lbnRFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGEgbmlsIGhvc3QgYnV0ICIgKworICAgICJub24tbmlsIGF1dGhvcml0eSBjb21wb25lbnRzIiBkbworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkubmV3KDp1c2VyID0+ICJ1c2VyIiwgOnBhc3N3b3JkID0+ICJwYXNzIiwgOnBvcnQgPT4gODApCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNyZWF0ZWQgd2l0aCBib3RoIGFuIGF1dGhvcml0eSBhbmQgYSB1c2VyIiBkbworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkubmV3KAorICAgICAgICA6dXNlciA9PiAidXNlciIsIDphdXRob3JpdHkgPT4gInVzZXJAZXhhbXBsZS5jb206ODAiCisgICAgICApCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBcmd1bWVudEVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYW4gYXV0aG9yaXR5IGFuZCBubyBwb3J0IiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5uZXcoOmF1dGhvcml0eSA9PiAidXNlckBleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGluZmVyIGEgcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkuZGVmYXVsdF9wb3J0KS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBzaXRlIHZhbHVlIG9mICcvL3VzZXJAZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLnNpdGUpLnRvIGVxKCIvL3VzZXJAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSAnbnVsbCcgb3JpZ2luIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ251bGwnKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYSBob3N0IHdpdGggdHJhaWxpbmcgZG90cyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkubmV3KDphdXRob3JpdHkgPT4gImV4YW1wbGUuLi4iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBzdGFibGUgbm9ybWFsaXplZCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS5ub3JtYWxpemUubm9ybWFsaXplLmhvc3QpLnRvIGVxKAorICAgICAgQHVyaS5ub3JtYWxpemUuaG9zdAorICAgICkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGEgaG9zdCB3aXRoIGEgYmFja3NsYXNoIiBkbworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkubmV3KDphdXRob3JpdHkgPT4gImV4YW1wbGVcXGV4YW1wbGUiKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYSBob3N0IHdpdGggYSBzbGFzaCIgZG8KKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldyg6YXV0aG9yaXR5ID0+ICJleGFtcGxlL2V4YW1wbGUiKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYSBob3N0IHdpdGggYSBzcGFjZSIgZG8KKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5ldyg6YXV0aG9yaXR5ID0+ICJleGFtcGxlIGV4YW1wbGUiKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYm90aCBhIHVzZXJpbmZvIGFuZCBhIHVzZXIiIGRvCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5uZXcoOnVzZXIgPT4gInVzZXIiLCA6dXNlcmluZm8gPT4gInVzZXI6cGFzcyIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBcmd1bWVudEVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBjcmVhdGVkIHdpdGggYSBwYXRoIHRoYXQgaGFzbid0IGJlZW4gIiArCisgICAgInByZWZpeGVkIHdpdGggYSAnLycgYnV0IGEgaG9zdCBzcGVjaWZpZWQiIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLm5ldygKKyAgICAgIDpzY2hlbWUgPT4gImh0dHAiLCA6aG9zdCA9PiAiZXhhbXBsZS5jb20iLCA6cGF0aCA9PiAicGF0aCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgcHJlZml4IGEgJy8nIHRvIHRoZSBwYXRoIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aCIpKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBzaXRlIHZhbHVlIG9mICdodHRwOi8vZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLnNpdGUpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdodHRwOi8vZXhhbXBsZS5jb20iIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnaHR0cDovL2V4YW1wbGUuY29tJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY3JlYXRlZCB3aXRoIGEgcGF0aCB0aGF0IGhhc24ndCBiZWVuICIgKworICAgICJwcmVmaXhlZCB3aXRoIGEgJy8nIGJ1dCBubyBob3N0IHNwZWNpZmllZCIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkubmV3KAorICAgICAgOnNjaGVtZSA9PiAiaHR0cCIsIDpwYXRoID0+ICJwYXRoIgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgcHJlZml4IGEgJy8nIHRvIHRoZSBwYXRoIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOnBhdGgiKSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgc2l0ZSB2YWx1ZSBvZiAnaHR0cDonIiBkbworICAgIGV4cGVjdChAdXJpLnNpdGUpLnRvIGVxKCJodHRwOiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhICdudWxsJyBvcmlnaW4iIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnbnVsbCcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tIGFuIEFkZHJlc3NhYmxlOjpVUkkgb2JqZWN0IiBkbworICBpdCAic2hvdWxkIG5vdCBoYXZlIHVuZXhwZWN0ZWQgc2lkZS1lZmZlY3RzIiBkbworICAgIG9yaWdpbmFsX3VyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgIG5ld191cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKG9yaWdpbmFsX3VyaSkKKyAgICBuZXdfdXJpLmhvc3QgPSAnd3d3LmV4YW1wbGUuY29tJworICAgIGV4cGVjdChuZXdfdXJpLmhvc3QpLnRvIGVxKCd3d3cuZXhhbXBsZS5jb20nKQorICAgIGV4cGVjdChuZXdfdXJpLnRvX3MpLnRvIGVxKCdodHRwOi8vd3d3LmV4YW1wbGUuY29tLycpCisgICAgZXhwZWN0KG9yaWdpbmFsX3VyaS5ob3N0KS50byBlcSgnZXhhbXBsZS5jb20nKQorICAgIGV4cGVjdChvcmlnaW5hbF91cmkudG9fcykudG8gZXEoJ2h0dHA6Ly9leGFtcGxlLmNvbS8nKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIHVuZXhwZWN0ZWQgc2lkZS1lZmZlY3RzIiBkbworICAgIG9yaWdpbmFsX3VyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgIG5ld191cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShvcmlnaW5hbF91cmkpCisgICAgbmV3X3VyaS5ob3N0ID0gJ3d3dy5leGFtcGxlLmNvbScKKyAgICBleHBlY3QobmV3X3VyaS5ob3N0KS50byBlcSgnd3d3LmV4YW1wbGUuY29tJykKKyAgICBleHBlY3QobmV3X3VyaS50b19zKS50byBlcSgnaHR0cDovL3d3dy5leGFtcGxlLmNvbS8nKQorICAgIGV4cGVjdChvcmlnaW5hbF91cmkuaG9zdCkudG8gZXEoJ2V4YW1wbGUuY29tJykKKyAgICBleHBlY3Qob3JpZ2luYWxfdXJpLnRvX3MpLnRvIGVxKCdodHRwOi8vZXhhbXBsZS5jb20vJykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgaGF2ZSB1bmV4cGVjdGVkIHNpZGUtZWZmZWN0cyIgZG8KKyAgICBvcmlnaW5hbF91cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICBuZXdfdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZShvcmlnaW5hbF91cmkpCisgICAgbmV3X3VyaS5vcmlnaW4gPSAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb206ODA4MCcKKyAgICBleHBlY3QobmV3X3VyaS5ob3N0KS50byBlcSgnd3d3LmV4YW1wbGUuY29tJykKKyAgICBleHBlY3QobmV3X3VyaS50b19zKS50byBlcSgnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb206ODA4MC8nKQorICAgIGV4cGVjdChvcmlnaW5hbF91cmkuaG9zdCkudG8gZXEoJ2V4YW1wbGUuY29tJykKKyAgICBleHBlY3Qob3JpZ2luYWxfdXJpLnRvX3MpLnRvIGVxKCdodHRwOi8vZXhhbXBsZS5jb20vJykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgaGF2ZSB1bmV4cGVjdGVkIHNpZGUtZWZmZWN0cyIgZG8KKyAgICBvcmlnaW5hbF91cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICBuZXdfdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2Uob3JpZ2luYWxfdXJpKQorICAgIG5ld191cmkub3JpZ2luID0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tOjgwODAnCisgICAgZXhwZWN0KG5ld191cmkuaG9zdCkudG8gZXEoJ3d3dy5leGFtcGxlLmNvbScpCisgICAgZXhwZWN0KG5ld191cmkudG9fcykudG8gZXEoJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tOjgwODAvJykKKyAgICBleHBlY3Qob3JpZ2luYWxfdXJpLmhvc3QpLnRvIGVxKCdleGFtcGxlLmNvbScpCisgICAgZXhwZWN0KG9yaWdpbmFsX3VyaS50b19zKS50byBlcSgnaHR0cDovL2V4YW1wbGUuY29tLycpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tIHNvbWV0aGluZyB0aGF0IGxvb2tzICIgKworICAgICJsaWtlIGEgVVJJIG9iamVjdCIgZG8KKyAgaXQgInNob3VsZCBwYXJzZSB3aXRob3V0IGVycm9yIiBkbworICAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoRmFrZTo6VVJJOjpIVFRQLm5ldygiaHR0cDovL2V4YW1wbGUuY29tLyIpKQorICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UodXJpKQorICAgIGVuZCkubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tIGEgc3RhbmRhcmQgbGlicmFyeSBVUkkgb2JqZWN0IiBkbworICBpdCAic2hvdWxkIHBhcnNlIHdpdGhvdXQgZXJyb3IiIGRvCisgICAgdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZShVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8iKSkKKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKHVyaSkKKyAgICBlbmQpLm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAnJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgaXAtYmFzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9pcF9iYXNlZAorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwYXRoIG9mICcnIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByZXF1ZXN0IFVSSSBvZiAnLyciIGRvCisgICAgZXhwZWN0KEB1cmkucmVxdWVzdF91cmkpLnRvIGVxKCIvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHJlbGF0aXZlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9yZWxhdGl2ZQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgJ251bGwnIG9yaWdpbiIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdudWxsJykKKyAgZW5kCitlbmQKKworIyBTZWN0aW9uIDEuMS4yIG9mIFJGQyAzOTg2CitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2Z0cDovL2Z0cC5pcy5jby56YS9yZmMvcmZjMTgwOC50eHQnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiZnRwOi8vZnRwLmlzLmNvLnphL3JmYy9yZmMxODA4LnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAnZnRwJyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiZnRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGlwLWJhc2VkIiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9pcF9iYXNlZAorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICdmdHAuaXMuY28uemEnIiBkbworICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJmdHAuaXMuY28uemEiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgaW5mZXJyZWRfcG9ydCBvZiAyMSIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSgyMSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnL3JmYy9yZmMxODA4LnR4dCciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi9yZmMvcmZjMTgwOC50eHQiKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGEgcmVxdWVzdCBVUkkiIGRvCisgICAgZXhwZWN0KEB1cmkucmVxdWVzdF91cmkpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkudG8gYmVfZXFsKEB1cmkpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2Z0cDovL2Z0cC5pcy5jby56YSciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnZnRwOi8vZnRwLmlzLmNvLnphJykKKyAgZW5kCitlbmQKKworIyBTZWN0aW9uIDEuMS4yIG9mIFJGQyAzOTg2CitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0JyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgdGhlICdodHRwJyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiaHR0cCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpcC1iYXNlZCIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gYmVfaXBfYmFzZWQKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgaG9zdCBvZiAnd3d3LmlldGYub3JnJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgid3d3LmlldGYub3JnIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGluZmVycmVkX3BvcnQgb2YgODAiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJy9yZmMvcmZjMjM5Ni50eHQnIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIvcmZjL3JmYzIzOTYudHh0IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcmVxdWVzdCBVUkkgb2YgJy9yZmMvcmZjMjM5Ni50eHQnIiBkbworICAgIGV4cGVjdChAdXJpLnJlcXVlc3RfdXJpKS50byBlcSgiL3JmYy9yZmMyMzk2LnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLnRvIGJlX2VxbChAdXJpKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvcnJlY3RseSBvbWl0IGNvbXBvbmVudHMiIGRvCisgICAgZXhwZWN0KEB1cmkub21pdCg6c2NoZW1lKS50b19zKS50byBlcSgiLy93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0IikKKyAgICBleHBlY3QoQHVyaS5vbWl0KDpwYXRoKS50b19zKS50byBlcSgiaHR0cDovL3d3dy5pZXRmLm9yZyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IG9taXQgY29tcG9uZW50cyBkZXN0cnVjdGl2ZWx5IiBkbworICAgIEB1cmkub21pdCEoOnNjaGVtZSkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiLy93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovL3d3dy5pZXRmLm9yZyciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnaHR0cDovL3d3dy5pZXRmLm9yZycpCisgIGVuZAorZW5kCisKKyMgU2VjdGlvbiAxLjEuMiBvZiBSRkMgMzk4NgorZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidsZGFwOi8vWzIwMDE6ZGI4Ojo3XS9jPUdCP29iamVjdENsYXNzP29uZSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJsZGFwOi8vWzIwMDE6ZGI4Ojo3XS9jPUdCP29iamVjdENsYXNzP29uZSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAnbGRhcCcgc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoImxkYXAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaXAtYmFzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2lwX2Jhc2VkCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGhvc3Qgb2YgJ1syMDAxOmRiODo6N10nIiBkbworICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJbMjAwMTpkYjg6OjddIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGluZmVycmVkX3BvcnQgb2YgMzg5IiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDM4OSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnL2M9R0InIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIvYz1HQiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgYSByZXF1ZXN0IFVSSSIgZG8KKyAgICBleHBlY3QoQHVyaS5yZXF1ZXN0X3VyaSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBhbGxvdyByZXF1ZXN0IFVSSSBhc3NpZ25tZW50IiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkucmVxdWVzdF91cmkgPSAiLyIKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcXVlcnkgb2YgJ29iamVjdENsYXNzP29uZSciIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKCJvYmplY3RDbGFzcz9vbmUiKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgb21pdCBjb21wb25lbnRzIiBkbworICAgIGV4cGVjdChAdXJpLm9taXQoOnNjaGVtZSwgOmF1dGhvcml0eSkudG9fcykudG8gZXEoIi9jPUdCP29iamVjdENsYXNzP29uZSIpCisgICAgZXhwZWN0KEB1cmkub21pdCg6cGF0aCkudG9fcykudG8gZXEoImxkYXA6Ly9bMjAwMTpkYjg6OjddP29iamVjdENsYXNzP29uZSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IG9taXQgY29tcG9uZW50cyBkZXN0cnVjdGl2ZWx5IiBkbworICAgIEB1cmkub21pdCEoOnNjaGVtZSwgOmF1dGhvcml0eSkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiL2M9R0I/b2JqZWN0Q2xhc3M/b25lIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBpZiBvbWlzc2lvbiB3b3VsZCBjcmVhdGUgYW4gaW52YWxpZCBVUkkiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5vbWl0KDphdXRob3JpdHksIDpwYXRoKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdsZGFwOi8vWzIwMDE6ZGI4Ojo3XSciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnbGRhcDovL1syMDAxOmRiODo6N10nKQorICBlbmQKK2VuZAorCisjIFNlY3Rpb24gMS4xLjIgb2YgUkZDIDM5ODYKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInbWFpbHRvOkpvaG4uRG9lQGV4YW1wbGUuY29tJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIm1haWx0bzpKb2huLkRvZUBleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAnbWFpbHRvJyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgibWFpbHRvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpcC1iYXNlZCIgZG8KKyAgICBleHBlY3QoQHVyaSkubm90X3RvIGJlX2lwX2Jhc2VkCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgYW4gaW5mZXJyZWRfcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJ0pvaG4uRG9lQGV4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiSm9obi5Eb2VAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGEgcmVxdWVzdCBVUkkiIGRvCisgICAgZXhwZWN0KEB1cmkucmVxdWVzdF91cmkpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkudG8gYmVfZXFsKEB1cmkpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhICdudWxsJyBvcmlnaW4iIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnbnVsbCcpCisgIGVuZAorZW5kCisKKyMgU2VjdGlvbiAyIG9mIFJGQyA2MDY4CitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ21haWx0bzo/dG89YWRkcjFAYW4uZXhhbXBsZSxhZGRyMkBhbi5leGFtcGxlJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoCisgICAgICAibWFpbHRvOj90bz1hZGRyMUBhbi5leGFtcGxlLGFkZHIyQGFuLmV4YW1wbGUiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSB0aGUgJ21haWx0bycgc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoIm1haWx0byIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgaXAtYmFzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9pcF9iYXNlZAorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGFuIGluZmVycmVkX3BvcnQiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwYXRoIG9mICcnIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIiKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGEgcmVxdWVzdCBVUkkiIGRvCisgICAgZXhwZWN0KEB1cmkucmVxdWVzdF91cmkpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBUbzogZmllbGQgdmFsdWUgcGFyYW1ldGVyaXplZCIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMoSGFzaClbInRvIl0pLnRvIGVxKAorICAgICAgImFkZHIxQGFuLmV4YW1wbGUsYWRkcjJAYW4uZXhhbXBsZSIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLnRvIGJlX2VxbChAdXJpKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSAnbnVsbCcgb3JpZ2luIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ251bGwnKQorICBlbmQKK2VuZAorCisjIFNlY3Rpb24gMS4xLjIgb2YgUkZDIDM5ODYKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInbmV3czpjb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLnVuaXgnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgibmV3czpjb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLnVuaXgiKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSB0aGUgJ25ld3MnIHNjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJuZXdzIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgaGF2ZSBhbiBpbmZlcnJlZF9wb3J0IiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpcC1iYXNlZCIgZG8KKyAgICBleHBlY3QoQHVyaSkubm90X3RvIGJlX2lwX2Jhc2VkCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJ2NvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peCciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoImNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgYSByZXF1ZXN0IFVSSSIgZG8KKyAgICBleHBlY3QoQHVyaS5yZXF1ZXN0X3VyaSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgJ251bGwnIG9yaWdpbiIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdudWxsJykKKyAgZW5kCitlbmQKKworIyBTZWN0aW9uIDEuMS4yIG9mIFJGQyAzOTg2CitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ3RlbDorMS04MTYtNTU1LTEyMTInIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgidGVsOisxLTgxNi01NTUtMTIxMiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAndGVsJyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgidGVsIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpcC1iYXNlZCIgZG8KKyAgICBleHBlY3QoQHVyaSkubm90X3RvIGJlX2lwX2Jhc2VkCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgYW4gaW5mZXJyZWRfcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJysxLTgxNi01NTUtMTIxMiciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIisxLTgxNi01NTUtMTIxMiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgYSByZXF1ZXN0IFVSSSIgZG8KKyAgICBleHBlY3QoQHVyaS5yZXF1ZXN0X3VyaSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgJ251bGwnIG9yaWdpbiIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdudWxsJykKKyAgZW5kCitlbmQKKworIyBTZWN0aW9uIDEuMS4yIG9mIFJGQyAzOTg2CitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ3RlbG5ldDovLzE5Mi4wLjIuMTY6ODAvJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoInRlbG5ldDovLzE5Mi4wLjIuMTY6ODAvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgdGhlICd0ZWxuZXQnIHNjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJ0ZWxuZXQiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICcxOTIuMC4yLjE2JyIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiMTkyLjAuMi4xNiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBvcnQgb2YgODAiIGRvCisgICAgZXhwZWN0KEB1cmkucG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGluZmVycmVkX3BvcnQgb2YgODAiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGRlZmF1bHRfcG9ydCBvZiAyMyIgZG8KKyAgICBleHBlY3QoQHVyaS5kZWZhdWx0X3BvcnQpLnRvIGVxKDIzKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaXAtYmFzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2lwX2Jhc2VkCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJy8nIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgaGF2ZSBhIHJlcXVlc3QgVVJJIiBkbworICAgIGV4cGVjdChAdXJpLnJlcXVlc3RfdXJpKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLnRvIGJlX2VxbChAdXJpKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICd0ZWxuZXQ6Ly8xOTIuMC4yLjE2OjgwJyIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCd0ZWxuZXQ6Ly8xOTIuMC4yLjE2OjgwJykKKyAgZW5kCitlbmQKKworIyBTZWN0aW9uIDEuMS4yIG9mIFJGQyAzOTg2CitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ3VybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOmRvY2Jvb2s6ZHRkOnhtbDo0LjEuMiciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKAorICAgICAgInVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOmRvY2Jvb2s6ZHRkOnhtbDo0LjEuMiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAndXJuJyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgidXJuIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgaGF2ZSBhbiBpbmZlcnJlZF9wb3J0IiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpcC1iYXNlZCIgZG8KKyAgICBleHBlY3QoQHVyaSkubm90X3RvIGJlX2lwX2Jhc2VkCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgIiArCisgICAgICAiJ29hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246ZG9jYm9vazpkdGQ6eG1sOjQuMS4yJyIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgib2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjpkb2Nib29rOmR0ZDp4bWw6NC4xLjIiKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGEgcmVxdWVzdCBVUkkiIGRvCisgICAgZXhwZWN0KEB1cmkucmVxdWVzdF91cmkpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkudG8gYmVfZXFsKEB1cmkpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhICdudWxsJyBvcmlnaW4iIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnbnVsbCcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGhldXJpc3RpY2FsbHkgcGFyc2VkIGZyb20gIiArCisgICAgIicxOTIuMC4yLjE2OjgwMDAvcGF0aCciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZSgiMTkyLjAuMi4xNjo4MDAwL3BhdGgiKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSB0aGUgJ2h0dHAnIHNjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgaG9zdCBvZiAnMTkyLjAuMi4xNiciIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoIjE5Mi4wLjIuMTYiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwb3J0IG9mICc4MDAwJyIgZG8KKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcSg4MDAwKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaXAtYmFzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2lwX2Jhc2VkCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJy9wYXRoJyIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiL3BhdGgiKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovLzE5Mi4wLjIuMTY6ODAwMCciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnaHR0cDovLzE5Mi4wLjIuMTY6ODAwMCcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJ3aGVuIGluc3BlY3RlZCwgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgVVJJIiBkbworICAgIGV4cGVjdChAdXJpLmluc3BlY3QpLnRvIGluY2x1ZGUoImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJ3aGVuIGluc3BlY3RlZCwgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgY2xhc3MgbmFtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5pbnNwZWN0KS50byBpbmNsdWRlKCJBZGRyZXNzYWJsZTo6VVJJIikKKyAgZW5kCisKKyAgaXQgIndoZW4gaW5zcGVjdGVkLCBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBvYmplY3QgaWQiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5zcGVjdCkudG8gaW5jbHVkZSgiJSMweCIgJSBAdXJpLm9iamVjdF9pZCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgdGhlICdodHRwJyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiaHR0cCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpcC1iYXNlZCIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gYmVfaXBfYmFzZWQKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIGF1dGhvcml0eSBzZWdtZW50IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIGlwLWJhc2VkIiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9pcF9iYXNlZAorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gdXNlcm5hbWUiIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gcGFzc3dvcmQiIGRvCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgcG9ydCA4MCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgaGF2ZSBhIHNwZWNpZmllZCBwb3J0IiBkbworICAgIGV4cGVjdChAdXJpLnBvcnQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIGVtcHR5IHBhdGgiIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBxdWVyeSBzdHJpbmciIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcmVxdWVzdCBVUkkgb2YgJy8nIiBkbworICAgIGV4cGVjdChAdXJpLnJlcXVlc3RfdXJpKS50byBlcSgiLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBmcmFnbWVudCIgZG8KKyAgICBleHBlY3QoQHVyaS5mcmFnbWVudCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgYWJzb2x1dGUiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2Fic29sdXRlCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgcmVsYXRpdmUiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9yZWxhdGl2ZQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBleGFjdGx5IGVxdWFsIHRvIDQyIiBkbworICAgIGV4cGVjdChAdXJpLmVxbD8oNDIpKS50byBlcShmYWxzZSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgZXF1YWwgdG8gNDIiIGRvCisgICAgZXhwZWN0KEB1cmkgPT0gNDIpLnRvIGVxKGZhbHNlKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSByb3VnaGx5IGVxdWFsIHRvIDQyIiBkbworICAgIGV4cGVjdChAdXJpID09PSA0MikudG8gZXEoZmFsc2UpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgZXhhY3RseSBlcXVhbCB0byBodHRwOi8vZXhhbXBsZS5jb20iIGRvCisgICAgZXhwZWN0KEB1cmkuZXFsPyhBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20iKSkpLnRvIGVxKHRydWUpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgcm91Z2hseSBlcXVhbCB0byBodHRwOi8vZXhhbXBsZS5jb20vIiBkbworICAgIGV4cGVjdChAdXJpID09PSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vIikpLnRvIGVxKHRydWUpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgcm91Z2hseSBlcXVhbCB0byB0aGUgc3RyaW5nICdodHRwOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgICBleHBlY3QoQHVyaSA9PT0gImh0dHA6Ly9leGFtcGxlLmNvbS8iKS50byBlcSh0cnVlKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSByb3VnaGx5IGVxdWFsIHRvIHRoZSBzdHJpbmcgIiArCisgICAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbTpib2d1cy8nIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIGV4cGVjdChAdXJpID09PSAiaHR0cDovL2V4YW1wbGUuY29tOmJvZ3VzLyIpLnRvIGVxKGZhbHNlKQorICAgIGVuZCkubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGl0c2VsZiB3aGVuIGpvaW5lZCB3aXRoIGl0c2VsZiIgZG8KKyAgICBleHBlY3QoQHVyaS5qb2luKEB1cmkpLnRvX3MpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20iKQorICAgIGV4cGVjdChAdXJpLmpvaW4hKEB1cmkpLnRvX3MpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL0VYQU1QTEUuY29tIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vRVhBTVBMRS5jb20iKSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBlcXVpdmFsZW50IHRvIGh0dHA6Ly9FWEFNUExFLmNvbTo4MC8iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9FWEFNUExFLmNvbTo4MC8iKSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBzYW1lIGhhc2ggYXMgaHR0cDovL2V4YW1wbGUuY29tIiBkbworICAgIGV4cGVjdChAdXJpLmhhc2gpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbSIpLmhhc2gpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoIGFzIGh0dHA6Ly9FWEFNUExFLmNvbSBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkub3JpZ2luID0gImh0dHA6Ly9FWEFNUExFLmNvbSIKKyAgICBleHBlY3QoQHVyaS5oYXNoKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vRVhBTVBMRS5jb20iKS5oYXNoKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBkaWZmZXJlbnQgaGFzaCBmcm9tIGh0dHA6Ly9FWEFNUExFLmNvbSIgZG8KKyAgICBleHBlY3QoQHVyaS5oYXNoKS5ub3RfdG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL0VYQU1QTEUuY29tIikuaGFzaCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYWxsb3cgb3JpZ2luIGFzc2lnbm1lbnQgd2l0aG91dCBzY2hlbWUiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5vcmlnaW4gPSAiZXhhbXBsZS5jb20iCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGFsbG93IG9yaWdpbiBhc3NpZ25tZW50IHdpdGhvdXQgaG9zdCIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLm9yaWdpbiA9ICJodHRwOi8vIgorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBhbGxvdyBvcmlnaW4gYXNzaWdubWVudCB3aXRoIGJvZ3VzIHR5cGUiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5vcmlnaW4gPSA6Ym9ndXMKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDYuMi4zIG9mIFJGQyAzOTg2CisgIGl0ICJzaG91bGQgYmUgZXF1aXZhbGVudCB0byBodHRwOi8vZXhhbXBsZS5jb20vIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vIikpCisgIGVuZAorCisgICMgU2VjdGlvbiA2LjIuMyBvZiBSRkMgMzk4NgorICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL2V4YW1wbGUuY29tOi8iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbTovIikpCisgIGVuZAorCisgICMgU2VjdGlvbiA2LjIuMyBvZiBSRkMgMzk4NgorICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL2V4YW1wbGUuY29tOjgwLyIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tOjgwLyIpKQorICBlbmQKKworICAjIFNlY3Rpb24gNi4yLjIuMSBvZiBSRkMgMzk4NgorICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL0VYQU1QTEUuQ09NLyIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL0VYQU1QTEUuQ09NLyIpKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnL3BhdGgvJyB0byAnaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvJyIgZG8KKyAgICBleHBlY3QoQHVyaS5yb3V0ZV90bygiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiL3BhdGgvIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHJvdXRlIG9mICcuLicgZnJvbSAnaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvJyIgZG8KKyAgICBleHBlY3QoQHVyaS5yb3V0ZV9mcm9tKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aC8iKSkudG8gZXEoCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCIuLiIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnIycgdG8gJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLnJvdXRlX3RvKCJodHRwOi8vZXhhbXBsZS5jb20vIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiIyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnaHR0cDovL2Vsc2V3aGVyZS5jb20vJyB0byAiICsKKyAgICAgICInaHR0cDovL2Vsc2V3aGVyZS5jb20vJyIgZG8KKyAgICBleHBlY3QoQHVyaS5yb3V0ZV90bygiaHR0cDovL2Vsc2V3aGVyZS5jb20vIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2Vsc2V3aGVyZS5jb20vIikKKyAgICApCisgIGVuZAorCisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdyZWxhdGl2ZS9wYXRoJyBzaG91bGQgYmUgIiArCisgICAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS9yZWxhdGl2ZS9wYXRoJyIgZG8KKyAgICBleHBlY3QoQHVyaS5qb2luKCdyZWxhdGl2ZS9wYXRoJykpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL3JlbGF0aXZlL3BhdGgiKQorICAgICkKKyAgZW5kCisKKyAgaXQgIndoZW4gam9pbmVkIHdpdGggYSBib2d1cyBvYmplY3QgYSBUeXBlRXJyb3Igc2hvdWxkIGJlIHJhaXNlZCIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLmpvaW4oNDIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB1c2VybmFtZSBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkudXNlciA9ICJuZXd1c2VyIgorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJuZXd1c2VyIikKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vbmV3dXNlckBleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB1c2VybmFtZSBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkudXNlciA9ICJ1c2VyQDEyMyEiCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoInVzZXJAMTIzISIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF91c2VyKS50byBlcSgidXNlciU0MDEyMyUyMSIpCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoImh0dHA6Ly91c2VyJTQwMTIzJTIxQGV4YW1wbGUuY29tLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBwYXNzd29yZCBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkucGFzc3dvcmQgPSAibmV3cGFzcyIKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEoIm5ld3Bhc3MiKQorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCIiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vOm5ld3Bhc3NAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcGFzc3dvcmQgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnBhc3N3b3JkID0gIiNzZWNyZXRAMTIzISIKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEoIiNzZWNyZXRAMTIzISIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9wYXNzd29yZCkudG8gZXEoIiUyM3NlY3JldCU0MDEyMyUyMSIpCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoIiIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLnRvX3MpLnRvIGVxKCJodHRwOi8vOiUyM3NlY3JldCU0MDEyMyUyMUBleGFtcGxlLmNvbS8iKQorICAgIGV4cGVjdChAdXJpLm9taXQoOnBhc3N3b3JkKS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHVzZXIvcGFzcyBhZnRlciByZXBlYXRlZCBhc3NpZ25tZW50IiBkbworICAgIEB1cmkudXNlciA9IG5pbAorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKG5pbCkKKyAgICBAdXJpLnBhc3N3b3JkID0gIm5ld3Bhc3MiCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCJuZXdwYXNzIikKKyAgICAjIFVzZXJuYW1lIGNhbm5vdCBiZSBuaWwgaWYgdGhlIHBhc3N3b3JkIGlzIHNldAorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCIiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vOm5ld3Bhc3NAZXhhbXBsZS5jb20iKQorICAgIEB1cmkudXNlciA9ICJuZXd1c2VyIgorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJuZXd1c2VyIikKKyAgICBAdXJpLnBhc3N3b3JkID0gbmlsCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL25ld3VzZXJAZXhhbXBsZS5jb20iKQorICAgIEB1cmkudXNlciA9ICJuZXd1c2VyIgorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJuZXd1c2VyIikKKyAgICBAdXJpLnBhc3N3b3JkID0gIiIKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEoIiIpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9uZXd1c2VyOkBleGFtcGxlLmNvbSIpCisgICAgQHVyaS5wYXNzd29yZCA9ICJuZXdwYXNzIgorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgibmV3cGFzcyIpCisgICAgQHVyaS51c2VyID0gbmlsCisgICAgIyBVc2VybmFtZSBjYW5ub3QgYmUgbmlsIGlmIHRoZSBwYXNzd29yZCBpcyBzZXQKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcSgiIikKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovLzpuZXdwYXNzQGV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHVzZXIvcGFzcyBhZnRlciB1c2VyaW5mbyBhc3NpZ25tZW50IiBkbworICAgIEB1cmkudXNlciA9ICJuZXd1c2VyIgorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJuZXd1c2VyIikKKyAgICBAdXJpLnBhc3N3b3JkID0gIm5ld3Bhc3MiCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCJuZXdwYXNzIikKKyAgICBAdXJpLnVzZXJpbmZvID0gbmlsCisgICAgZXhwZWN0KEB1cmkudXNlcmluZm8pLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgY29udmVydCB0byBhIGhhc2giIGRvCisgICAgZXhwZWN0KEB1cmkudG9faGFzaCkudG8gZXEoeworICAgICAgOnNjaGVtZSA9PiAiaHR0cCIsCisgICAgICA6dXNlciA9PiBuaWwsCisgICAgICA6cGFzc3dvcmQgPT4gbmlsLAorICAgICAgOmhvc3QgPT4gImV4YW1wbGUuY29tIiwKKyAgICAgIDpwb3J0ID0+IG5pbCwKKyAgICAgIDpwYXRoID0+ICIiLAorICAgICAgOnF1ZXJ5ID0+IG5pbCwKKyAgICAgIDpmcmFnbWVudCA9PiBuaWwKKyAgICB9KQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGlkZW50aWNhbCB0byBpdHMgZHVwbGljYXRlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShAdXJpLmR1cCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovL2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdodHRwOi8vZXhhbXBsZS5jb20nKQorICBlbmQKK2VuZAorCisjIFNlY3Rpb24gNS4xLjIgb2YgUkZDIDI2MTYKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInSFRUUDovL3d3dy53My5vcmcvcHViL1dXVy9UaGVQcm9qZWN0Lmh0bWwnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiSFRUUDovL3d3dy53My5vcmcvcHViL1dXVy9UaGVQcm9qZWN0Lmh0bWwiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcmVxdWVzdCBVUkkiIGRvCisgICAgZXhwZWN0KEB1cmkucmVxdWVzdF91cmkpLnRvIGVxKCIvcHViL1dXVy9UaGVQcm9qZWN0Lmh0bWwiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcmVxdWVzdCBVUkkgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnJlcXVlc3RfdXJpID0gIi9zb21lL3doZXJlL2Vsc2UuaHRtbD9xdWVyeT9zdHJpbmciCisgICAgZXhwZWN0KEB1cmkucmVxdWVzdF91cmkpLnRvIGVxKCIvc29tZS93aGVyZS9lbHNlLmh0bWw/cXVlcnk/c3RyaW5nIikKKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiL3NvbWUvd2hlcmUvZWxzZS5odG1sIikKKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEoInF1ZXJ5P3N0cmluZyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCByZXF1ZXN0IFVSSSBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkucmVxdWVzdF91cmkgPSAiP3g9eSIKKyAgICBleHBlY3QoQHVyaS5yZXF1ZXN0X3VyaSkudG8gZXEoIi8/eD15IikKKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiLyIpCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKCJ4PXkiKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIHRoZSBzaXRlIHZhbHVlIGlzIHNldCB0byBzb21ldGhpbmcgYm9ndXMiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5zaXRlID0gNDIKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBVUkkgaXMgc2V0IHRvIHNvbWV0aGluZyBib2d1cyIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnJlcXVlc3RfdXJpID0gNDIKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgY29udmVydCB0byBhIGhhc2giIGRvCisgICAgZXhwZWN0KEB1cmkudG9faGFzaCkudG8gZXEoeworICAgICAgOnNjaGVtZSA9PiAiSFRUUCIsCisgICAgICA6dXNlciA9PiBuaWwsCisgICAgICA6cGFzc3dvcmQgPT4gbmlsLAorICAgICAgOmhvc3QgPT4gInd3dy53My5vcmciLAorICAgICAgOnBvcnQgPT4gbmlsLAorICAgICAgOnBhdGggPT4gIi9wdWIvV1dXL1RoZVByb2plY3QuaHRtbCIsCisgICAgICA6cXVlcnkgPT4gbmlsLAorICAgICAgOmZyYWdtZW50ID0+IG5pbAorICAgIH0pCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2h0dHA6Ly93d3cudzMub3JnJyIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdodHRwOi8vd3d3LnczLm9yZycpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNpbmcgSVB2NiBhZGRyZXNzZXMiIGRvCisgIGl0ICJzaG91bGQgbm90IHJhaXNlIGFuIGVycm9yIGZvciAiICsKKyAgICAgICInaHR0cDovL1szZmZlOjE5MDA6NDU0NTozOjIwMDpmOGZmOmZlMjE6NjdjZl0vJyIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vWzNmZmU6MTkwMDo0NTQ1OjM6MjAwOmY4ZmY6ZmUyMTo2N2NmXS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCByYWlzZSBhbiBlcnJvciBmb3IgIiArCisgICAgICAiJ2h0dHA6Ly9bZmU4MDowOjA6MDoyMDA6ZjhmZjpmZTIxOjY3Y2ZdLyciIGRvCisgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL1tmZTgwOjA6MDowOjIwMDpmOGZmOmZlMjE6NjdjZl0vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgcmFpc2UgYW4gZXJyb3IgZm9yICIgKworICAgICAgIidodHRwOi8vW2ZlODA6OjIwMDpmOGZmOmZlMjE6NjdjZl0vJyIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vW2ZlODA6OjIwMDpmOGZmOmZlMjE6NjdjZl0vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgcmFpc2UgYW4gZXJyb3IgZm9yICIgKworICAgICAgIidodHRwOi8vWzo6MV0vJyIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vWzo6MV0vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgcmFpc2UgYW4gZXJyb3IgZm9yICIgKworICAgICAgIidodHRwOi8vW2ZlODA6OjFdLyciIGRvCisgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL1tmZTgwOjoxXS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGZvciAiICsKKyAgICAgICInaHR0cDovL1s8aW52YWxpZD5dLyciIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL1s8aW52YWxpZD5dLyIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNpbmcgSVB2NiBhZGRyZXNzIiBkbworICBzdWJqZWN0IHsgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL1szZmZlOjE5MDA6NDU0NTozOjIwMDpmOGZmOmZlMjE6NjdjZl0vIikgfQorICBpdHMoOmhvc3QpIHsgc2hvdWxkID09ICdbM2ZmZToxOTAwOjQ1NDU6MzoyMDA6ZjhmZjpmZTIxOjY3Y2ZdJyB9CisgIGl0cyg6aG9zdG5hbWUpIHsgc2hvdWxkID09ICczZmZlOjE5MDA6NDU0NTozOjIwMDpmOGZmOmZlMjE6NjdjZicgfQorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGFzc2lnbmluZyBJUHY2IGFkZHJlc3MiIGRvCisgIGl0ICJzaG91bGQgYWxsb3cgdG8gc2V0IGJhcmUgSVB2NiBhZGRyZXNzIGFzIGhvc3RuYW1lIiBkbworICAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9bOjoxXS8iKQorICAgIHVyaS5ob3N0bmFtZSA9ICczZmZlOjE5MDA6NDU0NTozOjIwMDpmOGZmOmZlMjE6NjdjZicKKyAgICBleHBlY3QodXJpLnRvX3MpLnRvIGVxKCdodHRwOi8vWzNmZmU6MTkwMDo0NTQ1OjM6MjAwOmY4ZmY6ZmUyMTo2N2NmXS8nKQorICBlbmQKKworICBpdCAic2hvdWxkIGFsbG93IHRvIHNldCBiYXJlIElQdjYgYWRkcmVzcyBhcyBob3N0bmFtZSB3aXRoIElQQWRkciBvYmplY3QiIGRvCisgICAgdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL1s6OjFdLyIpCisgICAgdXJpLmhvc3RuYW1lID0gSVBBZGRyLm5ldygnM2ZmZToxOTAwOjQ1NDU6MzoyMDA6ZjhmZjpmZTIxOjY3Y2YnKQorICAgIGV4cGVjdCh1cmkudG9fcykudG8gZXEoJ2h0dHA6Ly9bM2ZmZToxOTAwOjQ1NDU6MzoyMDA6ZjhmZjpmZTIxOjY3Y2ZdLycpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGFsbG93IHRvIHNldCBiYXJlIElQdjYgYWRkcmVzcyBhcyBob3N0IiBkbworICAgIHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9bOjoxXS8iKQorICAgIHNraXAgIm5vdCBjaGVja2VkIgorICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIHVyaS5ob3N0ID0gJzNmZmU6MTkwMDo0NTQ1OjM6MjAwOmY4ZmY6ZmUyMTo2N2NmJworICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzaW5nIElQdkZ1dHVyZSBhZGRyZXNzZXMiIGRvCisgIGl0ICJzaG91bGQgbm90IHJhaXNlIGFuIGVycm9yIGZvciAiICsKKyAgICAgICInaHR0cDovL1t2OS4zZmZlOjE5MDA6NDU0NTozOjIwMDpmOGZmOmZlMjE6NjdjZl0vJyIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vW3Y5LjNmZmU6MTkwMDo0NTQ1OjM6MjAwOmY4ZmY6ZmUyMTo2N2NmXS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCByYWlzZSBhbiBlcnJvciBmb3IgIiArCisgICAgICAiJ2h0dHA6Ly9bdmZmLmZlODA6MDowOjA6MjAwOmY4ZmY6ZmUyMTo2N2NmXS8nIiBkbworICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9bdmZmLmZlODA6MDowOjA6MjAwOmY4ZmY6ZmUyMTo2N2NmXS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCByYWlzZSBhbiBlcnJvciBmb3IgIiArCisgICAgICAiJ2h0dHA6Ly9bdjEyLmZlODA6OjIwMDpmOGZmOmZlMjE6NjdjZl0vJyIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vW3YxMi5mZTgwOjoyMDA6ZjhmZjpmZTIxOjY3Y2ZdLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IHJhaXNlIGFuIGVycm9yIGZvciAiICsKKyAgICAgICInaHR0cDovL1t2YTAuOjoxXS8nIiBkbworICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9bdmEwLjo6MV0vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgcmFpc2UgYW4gZXJyb3IgZm9yICIgKworICAgICAgIidodHRwOi8vW3YyNTUuZmU4MDo6MV0vJyIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vW3YyNTUuZmU4MDo6MV0vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBmb3IgIiArCisgICAgICAiJ2h0dHA6Ly9bdjAuPGludmFsaWQ+XS8nIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9bdjAuPGludmFsaWQ+XS8iKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorCisgICMgQmFzZWQgb24gaHR0cDovL2ludGVydHdpbmdseS5uZXQvYmxvZy8yMDA0LzA3LzMxL1VSSS1FcXVpdmFsZW5jZQorICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL2V4YW1wbGUuY29tIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20iKSkKKyAgZW5kCisKKyAgIyBCYXNlZCBvbiBodHRwOi8vaW50ZXJ0d2luZ2x5Lm5ldC9ibG9nLzIwMDQvMDcvMzEvVVJJLUVxdWl2YWxlbmNlCisgIGl0ICJzaG91bGQgYmUgZXF1aXZhbGVudCB0byBIVFRQOi8vZXhhbXBsZS5jb20vIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJIVFRQOi8vZXhhbXBsZS5jb20vIikpCisgIGVuZAorCisgICMgQmFzZWQgb24gaHR0cDovL2ludGVydHdpbmdseS5uZXQvYmxvZy8yMDA0LzA3LzMxL1VSSS1FcXVpdmFsZW5jZQorICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL2V4YW1wbGUuY29tOi8iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbTovIikpCisgIGVuZAorCisgICMgQmFzZWQgb24gaHR0cDovL2ludGVydHdpbmdseS5uZXQvYmxvZy8yMDA0LzA3LzMxL1VSSS1FcXVpdmFsZW5jZQorICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL2V4YW1wbGUuY29tOjgwLyIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tOjgwLyIpKQorICBlbmQKKworICAjIEJhc2VkIG9uIGh0dHA6Ly9pbnRlcnR3aW5nbHkubmV0L2Jsb2cvMjAwNC8wNy8zMS9VUkktRXF1aXZhbGVuY2UKKyAgaXQgInNob3VsZCBiZSBlcXVpdmFsZW50IHRvIGh0dHA6Ly9FeGFtcGxlLmNvbS8iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9FeGFtcGxlLmNvbS8iKSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHVzZXJuYW1lIGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS51c2VyID0gbmlsCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEobmlsKQorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcGFzc3dvcmQgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnBhc3N3b3JkID0gbmlsCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByZXF1ZXN0IFVSSSBvZiAnLyciIGRvCisgICAgZXhwZWN0KEB1cmkucmVxdWVzdF91cmkpLnRvIGVxKCIvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgY29udmVydCB0byBhIGhhc2giIGRvCisgICAgZXhwZWN0KEB1cmkudG9faGFzaCkudG8gZXEoeworICAgICAgOnNjaGVtZSA9PiAiaHR0cCIsCisgICAgICA6dXNlciA9PiBuaWwsCisgICAgICA6cGFzc3dvcmQgPT4gbmlsLAorICAgICAgOmhvc3QgPT4gImV4YW1wbGUuY29tIiwKKyAgICAgIDpwb3J0ID0+IG5pbCwKKyAgICAgIDpwYXRoID0+ICIvIiwKKyAgICAgIDpxdWVyeSA9PiBuaWwsCisgICAgICA6ZnJhZ21lbnQgPT4gbmlsCisgICAgfSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBpZGVudGljYWwgdG8gaXRzIGR1cGxpY2F0ZSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQHVyaS5kdXApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoIGFzIGl0cyBkdXBsaWNhdGUiIGRvCisgICAgZXhwZWN0KEB1cmkuaGFzaCkudG8gZXEoQHVyaS5kdXAuaGFzaCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgZGlmZmVyZW50IGhhc2ggZnJvbSBpdHMgZXF1aXZhbGVudCBTdHJpbmcgdmFsdWUiIGRvCisgICAgZXhwZWN0KEB1cmkuaGFzaCkubm90X3RvIGVxKEB1cmkudG9fcy5oYXNoKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBhcyBhbiBlcXVhbCBVUkkiIGRvCisgICAgZXhwZWN0KEB1cmkuaGFzaCkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLyIpLmhhc2gpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgZXF1aXZhbGVudCB0byBodHRwOi8vRVhBTVBMRS5jb20iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9FWEFNUExFLmNvbSIpKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL0VYQU1QTEUuY29tOjgwLyIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL0VYQU1QTEUuY29tOjgwLyIpKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBhcyBodHRwOi8vZXhhbXBsZS5jb20vIiBkbworICAgIGV4cGVjdChAdXJpLmhhc2gpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8iKS5oYXNoKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBhcyBodHRwOi8vZXhhbXBsZS5jb20gYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnBhdGggPSAiIgorICAgIGV4cGVjdChAdXJpLmhhc2gpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbSIpLmhhc2gpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoIGFzIGh0dHA6Ly9leGFtcGxlLmNvbS8/IGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5xdWVyeSA9ICIiCisgICAgZXhwZWN0KEB1cmkuaGFzaCkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLz8iKS5oYXNoKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIHNhbWUgaGFzaCBhcyBodHRwOi8vZXhhbXBsZS5jb20vPyBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkucXVlcnlfdmFsdWVzID0ge30KKyAgICBleHBlY3QoQHVyaS5oYXNoKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vPyIpLmhhc2gpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoIGFzIGh0dHA6Ly9leGFtcGxlLmNvbS8jIGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5mcmFnbWVudCA9ICIiCisgICAgZXhwZWN0KEB1cmkuaGFzaCkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLyMiKS5oYXNoKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBkaWZmZXJlbnQgaGFzaCBmcm9tIGh0dHA6Ly9leGFtcGxlLmNvbSIgZG8KKyAgICBleHBlY3QoQHVyaS5oYXNoKS5ub3RfdG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tIikuaGFzaCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovL2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdodHRwOi8vZXhhbXBsZS5jb20nKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbT8jJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbT8jIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgY29udmVydCB0byBhIGhhc2giIGRvCisgICAgZXhwZWN0KEB1cmkudG9faGFzaCkudG8gZXEoeworICAgICAgOnNjaGVtZSA9PiAiaHR0cCIsCisgICAgICA6dXNlciA9PiBuaWwsCisgICAgICA6cGFzc3dvcmQgPT4gbmlsLAorICAgICAgOmhvc3QgPT4gImV4YW1wbGUuY29tIiwKKyAgICAgIDpwb3J0ID0+IG5pbCwKKyAgICAgIDpwYXRoID0+ICIiLAorICAgICAgOnF1ZXJ5ID0+ICIiLAorICAgICAgOmZyYWdtZW50ID0+ICIiCisgICAgfSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcmVxdWVzdCBVUkkgb2YgJy8/JyIgZG8KKyAgICBleHBlY3QoQHVyaS5yZXF1ZXN0X3VyaSkudG8gZXEoIi8/IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3JtYWxpemUgdG8gJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2h0dHA6Ly9leGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vQGV4YW1wbGUuY29tLyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vQGV4YW1wbGUuY29tLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgZXF1aXZhbGVudCB0byBodHRwOi8vZXhhbXBsZS5jb20iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbSIpKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvcnJlY3RseSBjb252ZXJ0IHRvIGEgaGFzaCIgZG8KKyAgICBleHBlY3QoQHVyaS50b19oYXNoKS50byBlcSh7CisgICAgICA6c2NoZW1lID0+ICJodHRwIiwKKyAgICAgIDp1c2VyID0+ICIiLAorICAgICAgOnBhc3N3b3JkID0+IG5pbCwKKyAgICAgIDpob3N0ID0+ICJleGFtcGxlLmNvbSIsCisgICAgICA6cG9ydCA9PiBuaWwsCisgICAgICA6cGF0aCA9PiAiLyIsCisgICAgICA6cXVlcnkgPT4gbmlsLAorICAgICAgOmZyYWdtZW50ID0+IG5pbAorICAgIH0pCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGl0cyBkdXBsaWNhdGUiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEB1cmkuZHVwKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdodHRwOi8vZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2h0dHA6Ly9leGFtcGxlLmNvbScpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tLi8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLi8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL2V4YW1wbGUuY29tIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20iKSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLm5vdF90byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBpZGVudGljYWwgdG8gaXRzIGR1cGxpY2F0ZSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQHVyaS5kdXApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2h0dHA6Ly9leGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnaHR0cDovL2V4YW1wbGUuY29tJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vOkBleGFtcGxlLmNvbS8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovLzpAZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBlcXVpdmFsZW50IHRvIGh0dHA6Ly9leGFtcGxlLmNvbSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tIikpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IGNvbnZlcnQgdG8gYSBoYXNoIiBkbworICAgIGV4cGVjdChAdXJpLnRvX2hhc2gpLnRvIGVxKHsKKyAgICAgIDpzY2hlbWUgPT4gImh0dHAiLAorICAgICAgOnVzZXIgPT4gIiIsCisgICAgICA6cGFzc3dvcmQgPT4gIiIsCisgICAgICA6aG9zdCA9PiAiZXhhbXBsZS5jb20iLAorICAgICAgOnBvcnQgPT4gbmlsLAorICAgICAgOnBhdGggPT4gIi8iLAorICAgICAgOnF1ZXJ5ID0+IG5pbCwKKyAgICAgIDpmcmFnbWVudCA9PiBuaWwKKyAgICB9KQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGlkZW50aWNhbCB0byBpdHMgZHVwbGljYXRlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShAdXJpLmR1cCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovL2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdodHRwOi8vZXhhbXBsZS5jb20nKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ0hUVFA6Ly9FWEFNUExFLkNPTS8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiSFRUUDovL0VYQU1QTEUuQ09NLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgZXF1aXZhbGVudCB0byBodHRwOi8vZXhhbXBsZS5jb20iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbSIpKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvcnJlY3RseSBjb252ZXJ0IHRvIGEgaGFzaCIgZG8KKyAgICBleHBlY3QoQHVyaS50b19oYXNoKS50byBlcSh7CisgICAgICA6c2NoZW1lID0+ICJIVFRQIiwKKyAgICAgIDp1c2VyID0+IG5pbCwKKyAgICAgIDpwYXNzd29yZCA9PiBuaWwsCisgICAgICA6aG9zdCA9PiAiRVhBTVBMRS5DT00iLAorICAgICAgOnBvcnQgPT4gbmlsLAorICAgICAgOnBhdGggPT4gIi8iLAorICAgICAgOnF1ZXJ5ID0+IG5pbCwKKyAgICAgIDpmcmFnbWVudCA9PiBuaWwKKyAgICB9KQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGlkZW50aWNhbCB0byBpdHMgZHVwbGljYXRlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShAdXJpLmR1cCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovL2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdodHRwOi8vZXhhbXBsZS5jb20nKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSB0bGQgb2YgJ2NvbSciIGRvCisgICAgZXhwZWN0KEB1cmkudGxkKS50byBlcSgnY29tJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vd3d3LmV4YW1wbGUuY28udWsvJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly93d3cuZXhhbXBsZS5jby51ay8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdodHRwOi8vd3d3LmV4YW1wbGUuY28udWsnIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2h0dHA6Ly93d3cuZXhhbXBsZS5jby51aycpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHRsZCBvZiAnY28udWsnIiBkbworICAgIGV4cGVjdChAdXJpLnRsZCkudG8gZXEoJ2NvLnVrJykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgZG9tYWluIG9mICdleGFtcGxlLmNvLnVrJyIgZG8KKyAgICBleHBlY3QoQHVyaS5kb21haW4pLnRvIGVxKCdleGFtcGxlLmNvLnVrJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vc3ViX2RvbWFpbi5ibG9nc3BvdC5jb20vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9zdWJfZG9tYWluLmJsb2dzcG90LmNvbS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdodHRwOi8vc3ViX2RvbWFpbi5ibG9nc3BvdC5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2h0dHA6Ly9zdWJfZG9tYWluLmJsb2dzcG90LmNvbScpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHRsZCBvZiAnY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS50bGQpLnRvIGVxKCdjb20nKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBkb21haW4gb2YgJ2Jsb2dzcG90LmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuZG9tYWluKS50byBlcSgnYmxvZ3Nwb3QuY29tJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vfnNtaXRoLyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vfnNtaXRoLyIpCisgIGVuZAorCisgICMgQmFzZWQgb24gaHR0cDovL2ludGVydHdpbmdseS5uZXQvYmxvZy8yMDA0LzA3LzMxL1VSSS1FcXVpdmFsZW5jZQorICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gaHR0cDovL2V4YW1wbGUuY29tLyU3RXNtaXRoLyIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLyU3RXNtaXRoLyIpKQorICBlbmQKKworICAjIEJhc2VkIG9uIGh0dHA6Ly9pbnRlcnR3aW5nbHkubmV0L2Jsb2cvMjAwNC8wNy8zMS9VUkktRXF1aXZhbGVuY2UKKyAgaXQgInNob3VsZCBiZSBlcXVpdmFsZW50IHRvIGh0dHA6Ly9leGFtcGxlLmNvbS8lN2VzbWl0aC8iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8lN2VzbWl0aC8iKSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBpZGVudGljYWwgdG8gaXRzIGR1cGxpY2F0ZSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQHVyaS5kdXApCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tLyVFOCciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vJUU4IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gbm9ybWFsaXplZCIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLm5vcm1hbGl6ZQorICAgIGVuZCkubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLnRvIGJlX2VxbChAdXJpKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBjaGFuZ2UgaWYgZW5jb2RlZCB3aXRoIHRoZSBub3JtYWxpemluZyBhbGdvcml0aG0iIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplZF9lbmNvZGUoQHVyaSkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL2V4YW1wbGUuY29tLyVFOCIKKyAgICApCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplZF9lbmNvZGUoQHVyaSwgQWRkcmVzc2FibGU6OlVSSSkudG9fcykudG8gYmUgPT09CisgICAgICAiaHR0cDovL2V4YW1wbGUuY29tLyVFOCIKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vcGF0aCUyRnNlZ21lbnQvJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoJTJGc2VnbWVudC8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBlcXVhbCB0byAnaHR0cDovL2V4YW1wbGUuY29tL3BhdGglMkZzZWdtZW50LyciIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aCUyRnNlZ21lbnQvIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGVxdWFsIHRvICdodHRwOi8vZXhhbXBsZS5jb20vcGF0aC9zZWdtZW50LyciIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3NlZ21lbnQvIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGVxdWFsIHRvICdodHRwOi8vZXhhbXBsZS5jb20vcGF0aC9zZWdtZW50LyciIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS5ub3RfdG8gYmVfZXFsKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvc2VnbWVudC8iKQorICAgICkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vPyVGNiciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vPyVGNiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIG5vcm1hbGl6ZWQiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5ub3JtYWxpemUKKyAgICBlbmQpLm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgY2hhbmdlIGlmIGVuY29kZWQgd2l0aCB0aGUgbm9ybWFsaXppbmcgYWxnb3JpdGhtIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZWRfZW5jb2RlKEB1cmkpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8/JUY2IgorICAgICkKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVkX2VuY29kZShAdXJpLCBBZGRyZXNzYWJsZTo6VVJJKS50b19zKS50byBiZSA9PT0KKyAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vPyVGNiIKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vIyVGNiciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vIyVGNiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIG5vcm1hbGl6ZWQiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5ub3JtYWxpemUKKyAgICBlbmQpLm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgY2hhbmdlIGlmIGVuY29kZWQgd2l0aCB0aGUgbm9ybWFsaXppbmcgYWxnb3JpdGhtIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZWRfZW5jb2RlKEB1cmkpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8jJUY2IgorICAgICkKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVkX2VuY29kZShAdXJpLCBBZGRyZXNzYWJsZTo6VVJJKS50b19zKS50byBiZSA9PT0KKyAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vIyVGNiIKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vJUMzJTg3JyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8lQzMlODciKQorICBlbmQKKworICAjIEJhc2VkIG9uIGh0dHA6Ly9pbnRlcnR3aW5nbHkubmV0L2Jsb2cvMjAwNC8wNy8zMS9VUkktRXF1aXZhbGVuY2UKKyAgaXQgInNob3VsZCBiZSBlcXVpdmFsZW50IHRvICdodHRwOi8vZXhhbXBsZS5jb20vQyVDQyVBNyciIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9DJUNDJUE3IikpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGNoYW5nZSBpZiBlbmNvZGVkIHdpdGggdGhlIG5vcm1hbGl6aW5nIGFsZ29yaXRobSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVkX2VuY29kZShAdXJpKS50b19zKS50byBlcSgKKyAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vJUMzJTg3IgorICAgICkKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVkX2VuY29kZShAdXJpLCBBZGRyZXNzYWJsZTo6VVJJKS50b19zKS50byBiZSA9PT0KKyAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vJUMzJTg3IgorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIGVuY29kaW5nIHdpdGggYW4gdW5leHBlY3RlZCByZXR1cm4gdHlwZSIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZWRfZW5jb2RlKEB1cmksIEludGVnZXIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJpZiBwZXJjZW50IGVuY29kZWQgc2hvdWxkIGJlICdodHRwOi8vZXhhbXBsZS5jb20vQyUyNUNDJTI1QTcnIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmVuY29kZShAdXJpKS50b19zKS50byBlcSgKKyAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vJTI1QzMlMjU4NyIKKyAgICApCisgIGVuZAorCisgIGl0ICJpZiBwZXJjZW50IGVuY29kZWQgc2hvdWxkIGJlICdodHRwOi8vZXhhbXBsZS5jb20vQyUyNUNDJTI1QTcnIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmVuY29kZShAdXJpLCBBZGRyZXNzYWJsZTo6VVJJKSkudG8gZXEoCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vJTI1QzMlMjU4NyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIGVuY29kaW5nIHdpdGggYW4gdW5leHBlY3RlZCByZXR1cm4gdHlwZSIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLmVuY29kZShAdXJpLCBJbnRlZ2VyKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGlkZW50aWNhbCB0byBpdHMgZHVwbGljYXRlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShAdXJpLmR1cCkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vP3E9c3RyaW5nJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8/cT1zdHJpbmciKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSB0aGUgJ2h0dHAnIHNjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIGF1dGhvcml0eSBzZWdtZW50IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHVzZXJuYW1lIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHBhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHBvcnQgODAiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJy8nIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcXVlcnkgc3RyaW5nIG9mICdxPXN0cmluZyciIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKCJxPXN0cmluZyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBmcmFnbWVudCIgZG8KKyAgICBleHBlY3QoQHVyaS5mcmFnbWVudCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgYWJzb2x1dGUiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2Fic29sdXRlCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgcmVsYXRpdmUiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9yZWxhdGl2ZQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBpZGVudGljYWwgdG8gaXRzIGR1cGxpY2F0ZSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQHVyaS5kdXApCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tOjgwLyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb206ODAvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgdGhlICdodHRwJyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiaHR0cCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBhdXRob3JpdHkgc2VnbWVudCBvZiAnZXhhbXBsZS5jb206ODAnIiBkbworICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoImV4YW1wbGUuY29tOjgwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgaG9zdCBvZiAnZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyB1c2VybmFtZSIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBwYXNzd29yZCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSBwb3J0IDgwIiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgZXhwbGljaXQgcG9ydCA4MCIgZG8KKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnLyciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gcXVlcnkgc3RyaW5nIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBmcmFnbWVudCIgZG8KKyAgICBleHBlY3QoQHVyaS5mcmFnbWVudCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgYWJzb2x1dGUiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2Fic29sdXRlCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgcmVsYXRpdmUiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9yZWxhdGl2ZQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGV4YWN0bHkgZXF1YWwgdG8gaHR0cDovL2V4YW1wbGUuY29tOjgwLyIgZG8KKyAgICBleHBlY3QoQHVyaS5lcWw/KEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbTo4MC8iKSkpLnRvIGVxKHRydWUpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgcm91Z2hseSBlcXVhbCB0byBodHRwOi8vZXhhbXBsZS5jb20vIiBkbworICAgIGV4cGVjdChAdXJpID09PSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vIikpLnRvIGVxKHRydWUpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgcm91Z2hseSBlcXVhbCB0byB0aGUgc3RyaW5nICdodHRwOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgICBleHBlY3QoQHVyaSA9PT0gImh0dHA6Ly9leGFtcGxlLmNvbS8iKS50byBlcSh0cnVlKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSByb3VnaGx5IGVxdWFsIHRvIHRoZSBzdHJpbmcgIiArCisgICAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbTpib2d1cy8nIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIGV4cGVjdChAdXJpID09PSAiaHR0cDovL2V4YW1wbGUuY29tOmJvZ3VzLyIpLnRvIGVxKGZhbHNlKQorICAgIGVuZCkubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGl0c2VsZiB3aGVuIGpvaW5lZCB3aXRoIGl0c2VsZiIgZG8KKyAgICBleHBlY3QoQHVyaS5qb2luKEB1cmkpLnRvX3MpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb206ODAvIikKKyAgICBleHBlY3QoQHVyaS5qb2luIShAdXJpKS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tOjgwLyIpCisgIGVuZAorCisgICMgU2VjdGlvbiA2LjIuMyBvZiBSRkMgMzk4NgorICBpdCAic2hvdWxkIGJlIGVxdWFsIHRvIGh0dHA6Ly9leGFtcGxlLmNvbS8iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8iKSkKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDYuMi4zIG9mIFJGQyAzOTg2CisgIGl0ICJzaG91bGQgYmUgZXF1YWwgdG8gaHR0cDovL2V4YW1wbGUuY29tOi8iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbTovIikpCisgIGVuZAorCisgICMgU2VjdGlvbiA2LjIuMyBvZiBSRkMgMzk4NgorICBpdCAic2hvdWxkIGJlIGVxdWFsIHRvIGh0dHA6Ly9leGFtcGxlLmNvbTo4MC8iIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbTo4MC8iKSkKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDYuMi4yLjEgb2YgUkZDIDM5ODYKKyAgaXQgInNob3VsZCBiZSBlcXVhbCB0byBodHRwOi8vRVhBTVBMRS5DT00vIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vRVhBTVBMRS5DT00vIikpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IGNvbnZlcnQgdG8gYSBoYXNoIiBkbworICAgIGV4cGVjdChAdXJpLnRvX2hhc2gpLnRvIGVxKHsKKyAgICAgIDpzY2hlbWUgPT4gImh0dHAiLAorICAgICAgOnVzZXIgPT4gbmlsLAorICAgICAgOnBhc3N3b3JkID0+IG5pbCwKKyAgICAgIDpob3N0ID0+ICJleGFtcGxlLmNvbSIsCisgICAgICA6cG9ydCA9PiA4MCwKKyAgICAgIDpwYXRoID0+ICIvIiwKKyAgICAgIDpxdWVyeSA9PiBuaWwsCisgICAgICA6ZnJhZ21lbnQgPT4gbmlsCisgICAgfSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBpZGVudGljYWwgdG8gaXRzIGR1cGxpY2F0ZSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQHVyaS5kdXApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2h0dHA6Ly9leGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnaHR0cDovL2V4YW1wbGUuY29tJykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgY2hhbmdlIGlmIGVuY29kZWQgd2l0aCB0aGUgbm9ybWFsaXppbmcgYWxnb3JpdGhtIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZWRfZW5jb2RlKEB1cmkpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbTo4MC8iCisgICAgKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZWRfZW5jb2RlKEB1cmksIEFkZHJlc3NhYmxlOjpVUkkpLnRvX3MpLnRvIGJlID09PQorICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbTo4MC8iCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tOjgwODAvJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbTo4MDgwLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAnaHR0cCcgc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gYXV0aG9yaXR5IHNlZ21lbnQgb2YgJ2V4YW1wbGUuY29tOjgwODAnIiBkbworICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoImV4YW1wbGUuY29tOjgwODAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHVzZXJuYW1lIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHBhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHBvcnQgODA4MCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MDgwKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgZXhwbGljaXQgcG9ydCA4MDgwIiBkbworICAgIGV4cGVjdChAdXJpLnBvcnQpLnRvIGVxKDgwODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBkZWZhdWx0IHBvcnQgODAiIGRvCisgICAgZXhwZWN0KEB1cmkuZGVmYXVsdF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnLyciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gcXVlcnkgc3RyaW5nIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBmcmFnbWVudCIgZG8KKyAgICBleHBlY3QoQHVyaS5mcmFnbWVudCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgYWJzb2x1dGUiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2Fic29sdXRlCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgcmVsYXRpdmUiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9yZWxhdGl2ZQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGV4YWN0bHkgZXF1YWwgdG8gaHR0cDovL2V4YW1wbGUuY29tOjgwODAvIiBkbworICAgIGV4cGVjdChAdXJpLmVxbD8oQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgICAgICJodHRwOi8vZXhhbXBsZS5jb206ODA4MC8iKSkpLnRvIGVxKHRydWUpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHJvdXRlIG9mICdodHRwOi8vZXhhbXBsZS5jb206ODA4MC8nIGZyb20gIiArCisgICAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvLyciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfZnJvbSgiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tOjgwODAvIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHJvdXRlIG9mICdodHRwOi8vZXhhbXBsZS5jb206ODA4MC8nIGZyb20gIiArCisgICAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbTo4MC9wYXRoL3RvLyciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfZnJvbSgiaHR0cDovL2V4YW1wbGUuY29tOjgwL3BhdGgvdG8vIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tOjgwODAvIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHJvdXRlIG9mICcuLi8uLi8nIGZyb20gIiArCisgICAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbTo4MDgwL3BhdGgvdG8vJyIgZG8KKyAgICBleHBlY3QoQHVyaS5yb3V0ZV9mcm9tKCJodHRwOi8vZXhhbXBsZS5jb206ODA4MC9wYXRoL3RvLyIpKS50byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIi4uLy4uLyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnaHR0cDovL2V4YW1wbGUuY29tOjgwODAvJyBmcm9tICIgKworICAgICAgIidodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvdG8vJyIgZG8KKyAgICBleHBlY3QoQHVyaS5yb3V0ZV9mcm9tKCJodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvdG8vIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tOjgwODAvIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IGNvbnZlcnQgdG8gYSBoYXNoIiBkbworICAgIGV4cGVjdChAdXJpLnRvX2hhc2gpLnRvIGVxKHsKKyAgICAgIDpzY2hlbWUgPT4gImh0dHAiLAorICAgICAgOnVzZXIgPT4gbmlsLAorICAgICAgOnBhc3N3b3JkID0+IG5pbCwKKyAgICAgIDpob3N0ID0+ICJleGFtcGxlLmNvbSIsCisgICAgICA6cG9ydCA9PiA4MDgwLAorICAgICAgOnBhdGggPT4gIi8iLAorICAgICAgOnF1ZXJ5ID0+IG5pbCwKKyAgICAgIDpmcmFnbWVudCA9PiBuaWwKKyAgICB9KQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGlkZW50aWNhbCB0byBpdHMgZHVwbGljYXRlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShAdXJpLmR1cCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovL2V4YW1wbGUuY29tOjgwODAnIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2h0dHA6Ly9leGFtcGxlLmNvbTo4MDgwJykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgY2hhbmdlIGlmIGVuY29kZWQgd2l0aCB0aGUgbm9ybWFsaXppbmcgYWxnb3JpdGhtIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZWRfZW5jb2RlKEB1cmkpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbTo4MDgwLyIKKyAgICApCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplZF9lbmNvZGUoQHVyaSwgQWRkcmVzc2FibGU6OlVSSSkudG9fcykudG8gYmUgPT09CisgICAgICAiaHR0cDovL2V4YW1wbGUuY29tOjgwODAvIgorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbTolMzglMzAvJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbTolMzglMzAvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHBvcnQiIGRvCisgICAgZXhwZWN0KEB1cmkucG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS5ub3RfdG8gYmVfZXFsKEB1cmkpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm9ybWFsaXplIHRvICdodHRwOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdodHRwOi8vZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2h0dHA6Ly9leGFtcGxlLmNvbScpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tLyUyRS8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLyUyRS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgc2tpcCgKKyAgICAgICdwYXRoIHNlZ21lbnQgbm9ybWFsaXphdGlvbiBzaG91bGQgaGFwcGVuIGJlZm9yZSAnICsKKyAgICAgICdwZXJjZW50IGVzY2FwaW5nIG5vcm1hbGl6YXRpb24nCisgICAgKQorICAgIEB1cmkubm9ybWFsaXplLnNob3VsZCBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3JtYWxpemUgdG8gJ2h0dHA6Ly9leGFtcGxlLmNvbS8lMkUvJyIgZG8KKyAgICBza2lwKAorICAgICAgJ3BhdGggc2VnbWVudCBub3JtYWxpemF0aW9uIHNob3VsZCBoYXBwZW4gYmVmb3JlICcgKworICAgICAgJ3BlcmNlbnQgZXNjYXBpbmcgbm9ybWFsaXphdGlvbicKKyAgICApCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyUyRS8iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8uLiciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vLi4iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLm5vdF90byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3JtYWxpemUgdG8gJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tLy4uLy4uJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8uLi8uLiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBwb3J0IiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkubm90X3RvIGJlX2VxbChAdXJpKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vcm1hbGl6ZSB0byAnaHR0cDovL2V4YW1wbGUuY29tLyciIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLnRvX3MpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vcGF0aCgvLi4nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgoLy4uIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHBvcnQiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS5ub3RfdG8gYmVfZXFsKEB1cmkpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm9ybWFsaXplIHRvICdodHRwOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8ocGF0aCkvLi4nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLyhwYXRoKS8uLiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBwb3J0IiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkubm90X3RvIGJlX2VxbChAdXJpKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vcm1hbGl6ZSB0byAnaHR0cDovL2V4YW1wbGUuY29tLyciIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLnRvX3MpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vcGF0aCgvLi4vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoKC8uLi8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLm5vdF90byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3JtYWxpemUgdG8gJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tLyhwYXRoKS8uLi8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLyhwYXRoKS8uLi8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLm5vdF90byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3JtYWxpemUgdG8gJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInLy4uLy9leGFtcGxlLmNvbSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCIvLi4vL2V4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZWNvbWUgaW52YWxpZCB3aGVuIG5vcm1hbGl6ZWQiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5ub3JtYWxpemUKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvciwgL2F1dGhvcml0eS8pCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJy8uLi8vZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIvLi4vL2V4YW1wbGUuY29tIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gJy9hL2IvYy8uLy4uLy4uL2cnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiL2EvYi9jLy4vLi4vLi4vZyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS5ub3RfdG8gYmVfZXFsKEB1cmkpCisgIGVuZAorCisgICMgU2VjdGlvbiA1LjIuNCBvZiBSRkMgMzk4NgorICBpdCAic2hvdWxkIG5vcm1hbGl6ZSB0byAnL2EvZyciIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLnRvX3MpLnRvIGVxKCIvYS9nIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gJ21pZC9jb250ZW50PTUvLi4vNiciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJtaWQvY29udGVudD01Ly4uLzYiKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkubm90X3RvIGJlX2VxbChAdXJpKQorICBlbmQKKworICAjIFNlY3Rpb24gNS4yLjQgb2YgUkZDIDM5ODYKKyAgaXQgInNob3VsZCBub3JtYWxpemUgdG8gJ21pZC82JyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoIm1pZC82IikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vd3d3LmV4YW1wbGUuY29tLy8vLi4vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vLy8uLi8nKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkubm90X3RvIGJlX2VxbChAdXJpKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vcm1hbGl6ZSB0byAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS8vJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2UvJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAnaHR0cCcgc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gYXV0aG9yaXR5IHNlZ21lbnQgb2YgJ2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5hdXRob3JpdHkpLnRvIGVxKCJleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGhvc3Qgb2YgJ2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gdXNlcm5hbWUiIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gcGFzc3dvcmQiIGRvCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgcG9ydCA4MCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnL3BhdGgvdG8vcmVzb3VyY2UvJyIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiL3BhdGgvdG8vcmVzb3VyY2UvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHF1ZXJ5IHN0cmluZyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gZnJhZ21lbnQiIGRvCisgICAgZXhwZWN0KEB1cmkuZnJhZ21lbnQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIGFic29sdXRlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9hYnNvbHV0ZQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHJlbGF0aXZlIiBkbworICAgIGV4cGVjdChAdXJpKS5ub3RfdG8gYmVfcmVsYXRpdmUKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBleGFjdGx5IGVxdWFsIHRvIGh0dHA6Ly9leGFtcGxlLmNvbTo4MDgwLyIgZG8KKyAgICBleHBlY3QoQHVyaS5lcWw/KEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoCisgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2UvIikpKS50byBlcSh0cnVlKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAncmVzb3VyY2UvJyBmcm9tICIgKworICAgICAgIidodHRwOi8vZXhhbXBsZS5jb20vcGF0aC90by8nIiBkbworICAgIGV4cGVjdChAdXJpLnJvdXRlX2Zyb20oImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvLyIpKS50byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoInJlc291cmNlLyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnLi4vJyBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2Uvc3ViJyIgZG8KKyAgICBleHBlY3QoQHVyaS5yb3V0ZV9mcm9tKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aC90by9yZXNvdXJjZS9zdWIiKSkudG8gZXEoCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCIuLi8iKQorICAgICkKKyAgZW5kCisKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAncmVzb3VyY2UvJyBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vYW5vdGhlciciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfZnJvbSgiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vYW5vdGhlciIpKS50byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoInJlc291cmNlLyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAncmVzb3VyY2UvJyBmcm9tICIgKworICAgICAgIidodHRwOi8vZXhhbXBsZS5jb20vcGF0aC90by9yZXMnIiBkbworICAgIGV4cGVjdChAdXJpLnJvdXRlX2Zyb20oImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvL3JlcyIpKS50byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoInJlc291cmNlLyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAncmVzb3VyY2UvJyBmcm9tICIgKworICAgICAgIidodHRwOi8vZXhhbXBsZS5jb206ODAvcGF0aC90by8nIiBkbworICAgIGV4cGVjdChAdXJpLnJvdXRlX2Zyb20oImh0dHA6Ly9leGFtcGxlLmNvbTo4MC9wYXRoL3RvLyIpKS50byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoInJlc291cmNlLyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vJyBmcm9tICIgKworICAgICAgIidodHRwOi8vZXhhbXBsZS5jb206ODA4MC9wYXRoL3RvLyciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfZnJvbSgiaHR0cDovL2V4YW1wbGUuY29tOjgwODAvcGF0aC90by8iKSkudG8gZXEoCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aC90by9yZXNvdXJjZS8iKQorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcm91dGUgb2YgJ2h0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvLycgZnJvbSAiICsKKyAgICAgICInaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvLyciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfZnJvbSgiaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvLyIpKS50byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlLyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnLi4vLi4vcGF0aC90by9yZXNvdXJjZS8nIGZyb20gIiArCisgICAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS90by9yZXNvdXJjZS8nIiBkbworICAgIGV4cGVjdChAdXJpLnJvdXRlX2Zyb20oImh0dHA6Ly9leGFtcGxlLmNvbS90by9yZXNvdXJjZS8iKSkudG8gZXEoCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCIuLi8uLi9wYXRoL3RvL3Jlc291cmNlLyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvcnJlY3RseSBjb252ZXJ0IHRvIGEgaGFzaCIgZG8KKyAgICBleHBlY3QoQHVyaS50b19oYXNoKS50byBlcSh7CisgICAgICA6c2NoZW1lID0+ICJodHRwIiwKKyAgICAgIDp1c2VyID0+IG5pbCwKKyAgICAgIDpwYXNzd29yZCA9PiBuaWwsCisgICAgICA6aG9zdCA9PiAiZXhhbXBsZS5jb20iLAorICAgICAgOnBvcnQgPT4gbmlsLAorICAgICAgOnBhdGggPT4gIi9wYXRoL3RvL3Jlc291cmNlLyIsCisgICAgICA6cXVlcnkgPT4gbmlsLAorICAgICAgOmZyYWdtZW50ID0+IG5pbAorICAgIH0pCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGl0cyBkdXBsaWNhdGUiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKEB1cmkuZHVwKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ3JlbGF0aXZlL3BhdGgvdG8vcmVzb3VyY2UnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgicmVsYXRpdmUvcGF0aC90by9yZXNvdXJjZSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgYSBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgaXAtYmFzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9pcF9iYXNlZAorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGFuIGF1dGhvcml0eSBzZWdtZW50IiBkbworICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGEgaG9zdCIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyB1c2VybmFtZSIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBwYXNzd29yZCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGEgcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJ3JlbGF0aXZlL3BhdGgvdG8vcmVzb3VyY2UnIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCJyZWxhdGl2ZS9wYXRoL3RvL3Jlc291cmNlIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHF1ZXJ5IHN0cmluZyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gZnJhZ21lbnQiIGRvCisgICAgZXhwZWN0KEB1cmkuZnJhZ21lbnQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhYnNvbHV0ZSIgZG8KKyAgICBleHBlY3QoQHVyaSkubm90X3RvIGJlX2Fic29sdXRlCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCByZWxhdGl2ZSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gYmVfcmVsYXRpdmUKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBpZiByb3V0aW5nIGlzIGF0dGVtcHRlZCIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnJvdXRlX3RvKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKEFyZ3VtZW50RXJyb3IsIC9yZWxhdGl2ZVwvcGF0aFwvdG9cL3Jlc291cmNlLykKKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnJvdXRlX2Zyb20oImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQXJndW1lbnRFcnJvciwgL3JlbGF0aXZlXC9wYXRoXC90b1wvcmVzb3VyY2UvKQorICBlbmQKKworICBpdCAid2hlbiBqb2luZWQgd2l0aCAnYW5vdGhlci9yZWxhdGl2ZS9wYXRoJyBzaG91bGQgYmUgIiArCisgICAgICAiJ3JlbGF0aXZlL3BhdGgvdG8vYW5vdGhlci9yZWxhdGl2ZS9wYXRoJyIgZG8KKyAgICBleHBlY3QoQHVyaS5qb2luKCdhbm90aGVyL3JlbGF0aXZlL3BhdGgnKSkudG8gZXEoCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJyZWxhdGl2ZS9wYXRoL3RvL2Fub3RoZXIvcmVsYXRpdmUvcGF0aCIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGlkZW50aWNhbCB0byBpdHMgZHVwbGljYXRlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcShAdXJpLmR1cCkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidyZWxhdGl2ZV9wYXRoX3dpdGhfbm9fc2xhc2hlcyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJyZWxhdGl2ZV9wYXRoX3dpdGhfbm9fc2xhc2hlcyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgYSBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgaXAtYmFzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9pcF9iYXNlZAorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGFuIGF1dGhvcml0eSBzZWdtZW50IiBkbworICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGEgaG9zdCIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyB1c2VybmFtZSIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBwYXNzd29yZCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBoYXZlIGEgcG9ydCIgZG8KKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJ3JlbGF0aXZlX3BhdGhfd2l0aF9ub19zbGFzaGVzJyIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgicmVsYXRpdmVfcGF0aF93aXRoX25vX3NsYXNoZXMiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gcXVlcnkgc3RyaW5nIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBmcmFnbWVudCIgZG8KKyAgICBleHBlY3QoQHVyaS5mcmFnbWVudCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFic29sdXRlIiBkbworICAgIGV4cGVjdChAdXJpKS5ub3RfdG8gYmVfYWJzb2x1dGUKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHJlbGF0aXZlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9yZWxhdGl2ZQorICBlbmQKKworICBpdCAid2hlbiBqb2luZWQgd2l0aCAnYW5vdGhlcl9yZWxhdGl2ZV9wYXRoJyBzaG91bGQgYmUgIiArCisgICAgICAiJ2Fub3RoZXJfcmVsYXRpdmVfcGF0aCciIGRvCisgICAgZXhwZWN0KEB1cmkuam9pbignYW5vdGhlcl9yZWxhdGl2ZV9wYXRoJykpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiYW5vdGhlcl9yZWxhdGl2ZV9wYXRoIikKKyAgICApCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tL2ZpbGUudHh0JyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS9maWxlLnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHNjaGVtZSBvZiAnaHR0cCciIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiaHR0cCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBhdXRob3JpdHkgc2VnbWVudCBvZiAnZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgaG9zdCBvZiAnZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyB1c2VybmFtZSIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBwYXNzd29yZCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSBwb3J0IDgwIiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwYXRoIG9mICcvZmlsZS50eHQnIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIvZmlsZS50eHQiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBiYXNlbmFtZSBvZiAnZmlsZS50eHQnIiBkbworICAgIGV4cGVjdChAdXJpLmJhc2VuYW1lKS50byBlcSgiZmlsZS50eHQiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gZXh0bmFtZSBvZiAnLnR4dCciIGRvCisgICAgZXhwZWN0KEB1cmkuZXh0bmFtZSkudG8gZXEoIi50eHQiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gcXVlcnkgc3RyaW5nIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBmcmFnbWVudCIgZG8KKyAgICBleHBlY3QoQHVyaS5mcmFnbWVudCkudG8gZXEobmlsKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS9maWxlLnR4dDtwYXJhbWV0ZXInIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL2ZpbGUudHh0O3BhcmFtZXRlciIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHNjaGVtZSBvZiAnaHR0cCciIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiaHR0cCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBhdXRob3JpdHkgc2VnbWVudCBvZiAnZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgaG9zdCBvZiAnZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyB1c2VybmFtZSIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBwYXNzd29yZCIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSBwb3J0IDgwIiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwYXRoIG9mICcvZmlsZS50eHQ7cGFyYW1ldGVyJyIgZG8KKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiL2ZpbGUudHh0O3BhcmFtZXRlciIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGJhc2VuYW1lIG9mICdmaWxlLnR4dCciIGRvCisgICAgZXhwZWN0KEB1cmkuYmFzZW5hbWUpLnRvIGVxKCJmaWxlLnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBleHRuYW1lIG9mICcudHh0JyIgZG8KKyAgICBleHBlY3QoQHVyaS5leHRuYW1lKS50byBlcSgiLnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBubyBxdWVyeSBzdHJpbmciIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIGZyYWdtZW50IiBkbworICAgIGV4cGVjdChAdXJpLmZyYWdtZW50KS50byBlcShuaWwpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tL2ZpbGUudHh0O3g9eSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vZmlsZS50eHQ7eD15IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgc2NoZW1lIG9mICdodHRwJyIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgc2NoZW1lIG9mICdodHRwJyIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIGF1dGhvcml0eSBzZWdtZW50IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHVzZXJuYW1lIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHBhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHBvcnQgODAiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJy9maWxlLnR4dDt4PXknIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIvZmlsZS50eHQ7eD15IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIGV4dG5hbWUgb2YgJy50eHQnIiBkbworICAgIGV4cGVjdChAdXJpLmV4dG5hbWUpLnRvIGVxKCIudHh0IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHF1ZXJ5IHN0cmluZyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gZnJhZ21lbnQiIGRvCisgICAgZXhwZWN0KEB1cmkuZnJhZ21lbnQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkudG8gYmVfZXFsKEB1cmkpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInc3ZuK3NzaDovL2RldmVsb3Blcm5hbWVAcnVieWZvcmdlLm9yZy92YXIvc3ZuL3Byb2plY3QnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgICAgICJzdm4rc3NoOi8vZGV2ZWxvcGVybmFtZUBydWJ5Zm9yZ2Uub3JnL3Zhci9zdm4vcHJvamVjdCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHNjaGVtZSBvZiAnc3ZuK3NzaCciIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgic3ZuK3NzaCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpcC1iYXNlZCIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gYmVfaXBfYmFzZWQKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnL3Zhci9zdm4vcHJvamVjdCciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi92YXIvc3ZuL3Byb2plY3QiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSB1c2VybmFtZSBvZiAnZGV2ZWxvcGVybmFtZSciIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoImRldmVsb3Blcm5hbWUiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gcGFzc3dvcmQiIGRvCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkudG8gYmVfZXFsKEB1cmkpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInc3NoK3N2bjovL2RldmVsb3Blcm5hbWVAUlVCWUZPUkdFLk9SRy92YXIvc3ZuL3Byb2plY3QnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgICAgICJzc2grc3ZuOi8vZGV2ZWxvcGVybmFtZUBSVUJZRk9SR0UuT1JHL3Zhci9zdm4vcHJvamVjdCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHNjaGVtZSBvZiAnc3NoK3N2biciIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgic3NoK3N2biIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIG5vcm1hbGl6ZWQgc2NoZW1lIG9mICdzdm4rc3NoJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3NjaGVtZSkudG8gZXEoInN2bitzc2giKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBub3JtYWxpemVkIHNpdGUgb2YgJ3N2bitzc2gnIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfc2l0ZSkudG8gZXEoInN2bitzc2g6Ly9kZXZlbG9wZXJuYW1lQHJ1Ynlmb3JnZS5vcmciKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGlwLWJhc2VkIiBkbworICAgIGV4cGVjdChAdXJpKS5ub3RfdG8gYmVfaXBfYmFzZWQKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnL3Zhci9zdm4vcHJvamVjdCciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi92YXIvc3ZuL3Byb2plY3QiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSB1c2VybmFtZSBvZiAnZGV2ZWxvcGVybmFtZSciIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoImRldmVsb3Blcm5hbWUiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gcGFzc3dvcmQiIGRvCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLm5vdF90byBiZV9lcWwoQHVyaSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidtYWlsdG86dXNlckBleGFtcGxlLmNvbSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJtYWlsdG86dXNlckBleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHNjaGVtZSBvZiAnbWFpbHRvJyIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJtYWlsdG8iKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIHRvIGJlIGlwLWJhc2VkIiBkbworICAgIGV4cGVjdChAdXJpKS5ub3RfdG8gYmVfaXBfYmFzZWQKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAndXNlckBleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoInVzZXJAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gdXNlciIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLnRvIGJlX2VxbChAdXJpKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ3RhZzpleGFtcGxlLmNvbSwyMDA2LTA4LTE4Oi9wYXRoL3RvL3NvbWV0aGluZyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKAorICAgICAgInRhZzpleGFtcGxlLmNvbSwyMDA2LTA4LTE4Oi9wYXRoL3RvL3NvbWV0aGluZyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHNjaGVtZSBvZiAndGFnJyIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJ0YWciKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaXAtYmFzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkpLm5vdF90byBiZV9pcF9iYXNlZAorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwYXRoIG9mICIgKworICAgICAgIidleGFtcGxlLmNvbSwyMDA2LTA4LTE4Oi9wYXRoL3RvL3NvbWV0aGluZyciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoImV4YW1wbGUuY29tLDIwMDYtMDgtMTg6L3BhdGgvdG8vc29tZXRoaW5nIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHVzZXIiIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgJ251bGwnIG9yaWdpbiIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdudWxsJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20veDt5LyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20veDt5LyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBpbiBub3JtYWwgZm9ybSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUpLnRvIGJlX2VxbChAdXJpKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8/eD0xJnk9MiciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vP3g9MSZ5PTIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIid2aWV3LXNvdXJjZTpodHRwOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoInZpZXctc291cmNlOmh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBzY2hlbWUgb2YgJ3ZpZXctc291cmNlJyIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJ2aWV3LXNvdXJjZSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGluIG5vcm1hbCBmb3JtIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSkudG8gYmVfZXFsKEB1cmkpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhICdudWxsJyBvcmlnaW4iIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnbnVsbCcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgICAgICJodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAnaHR0cCcgc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gYXV0aG9yaXR5IHNlZ21lbnQgb2YgJ3VzZXI6cGFzc0BleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgidXNlcjpwYXNzQGV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgdXNlcm5hbWUgb2YgJ3VzZXInIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJ1c2VyIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGFzc3dvcmQgb2YgJ3Bhc3MnIiBkbworICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgicGFzcyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGhvc3Qgb2YgJ2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSBwb3J0IDgwIiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwYXRoIG9mICcvcGF0aC90by9yZXNvdXJjZSciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi9wYXRoL3RvL3Jlc291cmNlIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcXVlcnkgc3RyaW5nIG9mICdxdWVyeT14JyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEoInF1ZXJ5PXgiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBmcmFnbWVudCBvZiAnZnJhZ21lbnQnIiBkbworICAgIGV4cGVjdChAdXJpLmZyYWdtZW50KS50byBlcSgiZnJhZ21lbnQiKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4gbm9ybWFsIGZvcm0iIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplKS50byBiZV9lcWwoQHVyaSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcm91dGUgb2YgJy4uLy4uLycgdG8gIiArCisgICAgICAiJ2h0dHA6Ly91c2VyOnBhc3NAZXhhbXBsZS5jb20vcGF0aC8nIiBkbworICAgIGV4cGVjdChAdXJpLnJvdXRlX3RvKCJodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiLi4vLi4vIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHJvdXRlIG9mICd0by9yZXNvdXJjZT9xdWVyeT14I2ZyYWdtZW50JyAiICsKKyAgICAgICJmcm9tICdodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvJyIgZG8KKyAgICBleHBlY3QoQHVyaS5yb3V0ZV9mcm9tKCJodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgidG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnP3F1ZXJ5PXgjZnJhZ21lbnQnICIgKworICAgICAgImZyb20gJ2h0dHA6Ly91c2VyOnBhc3NAZXhhbXBsZS5jb20vcGF0aC90by9yZXNvdXJjZSciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfZnJvbSgiaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlIikpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiP3F1ZXJ5PXgjZnJhZ21lbnQiKQorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcm91dGUgb2YgJyNmcmFnbWVudCcgIiArCisgICAgICAiZnJvbSAnaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgnIiBkbworICAgIGV4cGVjdChAdXJpLnJvdXRlX2Zyb20oCisgICAgICAiaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgiKSkudG8gZXEoCisgICAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIiNmcmFnbWVudCIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAnI2ZyYWdtZW50JyBmcm9tICIgKworICAgICAgIidodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfZnJvbSgKKyAgICAgICJodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCIKKyAgICApKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCIjZnJhZ21lbnQiKSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcm91dGUgb2YgJ2h0dHA6Ly9lbHNld2hlcmUuY29tLycgdG8gIiArCisgICAgICAiJ2h0dHA6Ly9lbHNld2hlcmUuY29tLyciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfdG8oImh0dHA6Ly9lbHNld2hlcmUuY29tLyIpKS50byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9lbHNld2hlcmUuY29tLyIpCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSByb3V0ZSBvZiAiICsKKyAgICAgICInaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQnICIgKworICAgICAgImZyb20gJ2h0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvLyciIGRvCisgICAgZXhwZWN0KEB1cmkucm91dGVfZnJvbSgiaHR0cDovL2Vsc2V3aGVyZS5jb20vcGF0aC90by8iKSkudG8gZXEoCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKAorICAgICAgICAiaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQiKQorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHNjaGVtZSBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkuc2NoZW1lID0gImZ0cCIKKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJmdHAiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKAorICAgICAgImZ0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQiCisgICAgKQorICAgIGV4cGVjdChAdXJpLnRvX3N0cikudG8gZXEoCisgICAgICAiZnRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBzaXRlIHNlZ21lbnQgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnNpdGUgPSAiaHR0cHM6Ly9uZXd1c2VyOm5ld3Bhc3NAZXhhbXBsZS5jb206NDQzIgorICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoImh0dHBzIikKKyAgICBleHBlY3QoQHVyaS5hdXRob3JpdHkpLnRvIGVxKCJuZXd1c2VyOm5ld3Bhc3NAZXhhbXBsZS5jb206NDQzIikKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcSgibmV3dXNlciIpCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCJuZXdwYXNzIikKKyAgICBleHBlY3QoQHVyaS51c2VyaW5mbykudG8gZXEoIm5ld3VzZXI6bmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF91c2VyaW5mbykudG8gZXEoIm5ld3VzZXI6bmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcSg0NDMpCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoNDQzKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHBzOi8vbmV3dXNlcjpuZXdwYXNzQGV4YW1wbGUuY29tOjQ0MyIgKworICAgICAgIi9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgYXV0aG9yaXR5IHNlZ21lbnQgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLmF1dGhvcml0eSA9ICJuZXd1c2VyOm5ld3Bhc3NAZXhhbXBsZS5jb206ODAiCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgibmV3dXNlcjpuZXdwYXNzQGV4YW1wbGUuY29tOjgwIikKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcSgibmV3dXNlciIpCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCJuZXdwYXNzIikKKyAgICBleHBlY3QoQHVyaS51c2VyaW5mbykudG8gZXEoIm5ld3VzZXI6bmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF91c2VyaW5mbykudG8gZXEoIm5ld3VzZXI6bmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcSg4MCkKKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgKKyAgICAgICJodHRwOi8vbmV3dXNlcjpuZXdwYXNzQGV4YW1wbGUuY29tOjgwIiArCisgICAgICAiL3BhdGgvdG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB1c2VyaW5mbyBzZWdtZW50IGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS51c2VyaW5mbyA9ICJuZXd1c2VyOm5ld3Bhc3MiCisgICAgZXhwZWN0KEB1cmkudXNlcmluZm8pLnRvIGVxKCJuZXd1c2VyOm5ld3Bhc3MiKQorICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoIm5ld3VzZXI6bmV3cGFzc0BleGFtcGxlLmNvbSIpCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoIm5ld3VzZXIiKQorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgibmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL25ld3VzZXI6bmV3cGFzc0BleGFtcGxlLmNvbSIgKworICAgICAgIi9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdXNlcm5hbWUgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnVzZXIgPSAibmV3dXNlciIKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcSgibmV3dXNlciIpCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgibmV3dXNlcjpwYXNzQGV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHBhc3N3b3JkIGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5wYXNzd29yZCA9ICJuZXdwYXNzIgorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgibmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgidXNlcjpuZXdwYXNzQGV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IGhvc3QgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLmhvc3QgPSAibmV3ZXhhbXBsZS5jb20iCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoIm5ld2V4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5hdXRob3JpdHkpLnRvIGVxKCJ1c2VyOnBhc3NAbmV3ZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgaG9zdCBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkuaG9zdG5hbWUgPSAibmV3ZXhhbXBsZS5jb20iCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoIm5ld2V4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5ob3N0bmFtZSkudG8gZXEoIm5ld2V4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5hdXRob3JpdHkpLnRvIGVxKCJ1c2VyOnBhc3NAbmV3ZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIGFzc2lnbmluZyBhIGJvZ3VzIG9iamVjdCB0byB0aGUgaG9zdG5hbWUiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5ob3N0bmFtZSA9IE9iamVjdC5uZXcKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBwb3J0IGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5wb3J0ID0gODA4MAorICAgIGV4cGVjdChAdXJpLnBvcnQpLnRvIGVxKDgwODApCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgidXNlcjpwYXNzQGV4YW1wbGUuY29tOjgwODAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3Qgb3JpZ2luIGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5vcmlnaW4gPSAiaHR0cDovL25ld2V4YW1wbGUuY29tIgorICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJuZXdleGFtcGxlLmNvbSIpCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgibmV3ZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcGF0aCBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkucGF0aCA9ICIvbmV3cGF0aC90by9yZXNvdXJjZSIKKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiL25ld3BhdGgvdG8vcmVzb3VyY2UiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly91c2VyOnBhc3NAZXhhbXBsZS5jb20vbmV3cGF0aC90by9yZXNvdXJjZT9xdWVyeT14I2ZyYWdtZW50IgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHNjaGVtZSBhbmQgYXV0aG9yaXR5IGFmdGVyIG5pbCBhc3NpZ25tZW50IiBkbworICAgIEB1cmkuc2l0ZSA9IG5pbAorICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEobmlsKQorICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEobmlsKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCIvcGF0aC90by9yZXNvdXJjZT9xdWVyeT14I2ZyYWdtZW50IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHNjaGVtZSBhbmQgYXV0aG9yaXR5IGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5zaXRlID0gImZpbGU6Ly8iCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiZmlsZSIpCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgiIikKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiZmlsZTovLy9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcGF0aCBhZnRlciBuaWwgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnBhdGggPSBuaWwKKyAgICBleHBlY3QoQHVyaS5wYXRoKS50byBlcSgiIikKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgKKyAgICAgICJodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tP3F1ZXJ5PXgjZnJhZ21lbnQiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcXVlcnkgc3RyaW5nIGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5xdWVyeSA9ICJuZXdxdWVyeT14IgorICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcSgibmV3cXVlcnk9eCIpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP25ld3F1ZXJ5PXgjZnJhZ21lbnQiCisgICAgKQorICAgIEB1cmkucXVlcnkgPSBuaWwKKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEobmlsKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly91c2VyOnBhc3NAZXhhbXBsZS5jb20vcGF0aC90by9yZXNvdXJjZSNmcmFnbWVudCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBxdWVyeSBzdHJpbmcgYWZ0ZXIgaGFzaCBhc3NpZ25tZW50IiBkbworICAgIEB1cmkucXVlcnlfdmFsdWVzID0geyI/dWVzdGlvbiBtYXJrIiA9PiAiPXNpZ24iLCAiaGVsbG8iID0+ICJnXHhDM1x4QkNudGhlciJ9CisgICAgZXhwZWN0KEB1cmkucXVlcnkuc3BsaXQoIiYiKSkudG8gaW5jbHVkZSgiJTNGdWVzdGlvbiUyMG1hcms9JTNEc2lnbiIpCisgICAgZXhwZWN0KEB1cmkucXVlcnkuc3BsaXQoIiYiKSkudG8gaW5jbHVkZSgiaGVsbG89ZyVDMyVCQ250aGVyIikKKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMpLnRvIGVxKHsKKyAgICAgICI/dWVzdGlvbiBtYXJrIiA9PiAiPXNpZ24iLCAiaGVsbG8iID0+ICJnXHhDM1x4QkNudGhlciIKKyAgICB9KQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcXVlcnkgc3RyaW5nIGFmdGVyIGZsYWcgaGFzaCBhc3NpZ25tZW50IiBkbworICAgIEB1cmkucXVlcnlfdmFsdWVzID0geydmbGFnPzEnID0+IG5pbCwgJ2ZsPWFnMicgPT4gbmlsLCAnZmxhZzMnID0+IG5pbH0KKyAgICBleHBlY3QoQHVyaS5xdWVyeS5zcGxpdCgiJiIpKS50byBpbmNsdWRlKCJmbGFnJTNGMSIpCisgICAgZXhwZWN0KEB1cmkucXVlcnkuc3BsaXQoIiYiKSkudG8gaW5jbHVkZSgiZmwlM0RhZzIiKQorICAgIGV4cGVjdChAdXJpLnF1ZXJ5LnNwbGl0KCImIikpLnRvIGluY2x1ZGUoImZsYWczIikKKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMoQXJyYXkpLnNvcnQpLnRvIGVxKFtbImZsPWFnMiJdLCBbImZsYWczIl0sIFsiZmxhZz8xIl1dKQorICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcyhIYXNoKSkudG8gZXEoeworICAgICAgJ2ZsYWc/MScgPT4gbmlsLCAnZmw9YWcyJyA9PiBuaWwsICdmbGFnMycgPT4gbmlsCisgICAgfSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBpZiBxdWVyeSB2YWx1ZXMgYXJlIHNldCB0byBhIGJvZ3VzIHR5cGUiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5xdWVyeV92YWx1ZXMgPSAiYm9ndXMiCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBmcmFnbWVudCBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkuZnJhZ21lbnQgPSAibmV3ZnJhZ21lbnQiCisgICAgZXhwZWN0KEB1cmkuZnJhZ21lbnQpLnRvIGVxKCJuZXdmcmFnbWVudCIpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjbmV3ZnJhZ21lbnQiCisgICAgKQorCisgICAgQHVyaS5mcmFnbWVudCA9IG5pbAorICAgIGV4cGVjdChAdXJpLmZyYWdtZW50KS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGFmdGVyIGEgbWVyZ2UiIGRvCisgICAgZXhwZWN0KEB1cmkubWVyZ2UoOmZyYWdtZW50ID0+ICJuZXdmcmFnbWVudCIpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly91c2VyOnBhc3NAZXhhbXBsZS5jb20vcGF0aC90by9yZXNvdXJjZT9xdWVyeT14I25ld2ZyYWdtZW50IgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBhZnRlciBhIG1lcmdlIiBkbworICAgIGV4cGVjdChAdXJpLm1lcmdlKDpmcmFnbWVudCA9PiBuaWwpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly91c2VyOnBhc3NAZXhhbXBsZS5jb20vcGF0aC90by9yZXNvdXJjZT9xdWVyeT14IgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBhZnRlciBhIG1lcmdlIiBkbworICAgIGV4cGVjdChAdXJpLm1lcmdlKDp1c2VyaW5mbyA9PiAibmV3dXNlcjpuZXdwYXNzIikudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL25ld3VzZXI6bmV3cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGFmdGVyIGEgbWVyZ2UiIGRvCisgICAgZXhwZWN0KEB1cmkubWVyZ2UoOnVzZXJpbmZvID0+IG5pbCkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMgYWZ0ZXIgYSBtZXJnZSIgZG8KKyAgICBleHBlY3QoQHVyaS5tZXJnZSg6cGF0aCA9PiAibmV3cGF0aCIpLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly91c2VyOnBhc3NAZXhhbXBsZS5jb20vbmV3cGF0aD9xdWVyeT14I2ZyYWdtZW50IgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBhZnRlciBhIG1lcmdlIiBkbworICAgIGV4cGVjdChAdXJpLm1lcmdlKDpwb3J0ID0+ICI0MiIsIDpwYXRoID0+ICJuZXdwYXRoIiwgOnF1ZXJ5ID0+ICIiKS50b19zKS50byBlcSgKKyAgICAgICJodHRwOi8vdXNlcjpwYXNzQGV4YW1wbGUuY29tOjQyL25ld3BhdGg/I2ZyYWdtZW50IgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBhZnRlciBhIG1lcmdlIiBkbworICAgIGV4cGVjdChAdXJpLm1lcmdlKDphdXRob3JpdHkgPT4gImZvbzpiYXJAYmF6OjQyIikudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL2ZvbzpiYXJAYmF6OjQyL3BhdGgvdG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCIKKyAgICApCisgICAgIyBFbnN1cmUgdGhlIG9wZXJhdGlvbiB3YXMgbm90IGRlc3RydWN0aXZlCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3VzZXI6cGFzc0BleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlP3F1ZXJ5PXgjZnJhZ21lbnQiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGFmdGVyIGEgZGVzdHJ1Y3RpdmUgbWVyZ2UiIGRvCisgICAgQHVyaS5tZXJnZSEoOmF1dGhvcml0eSA9PiAiZm9vOmJhckBiYXo6NDIiKQorICAgICMgRW5zdXJlIHRoZSBvcGVyYXRpb24gd2FzIGRlc3RydWN0aXZlCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL2ZvbzpiYXJAYmF6OjQyL3BhdGgvdG8vcmVzb3VyY2U/cXVlcnk9eCNmcmFnbWVudCIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgZmFpbCB0byBtZXJnZSB3aXRoIGJvZ3VzIHZhbHVlcyIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLm1lcmdlKDpwb3J0ID0+ICJib2d1cyIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgZmFpbCB0byBtZXJnZSB3aXRoIGJvZ3VzIHZhbHVlcyIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLm1lcmdlKDphdXRob3JpdHkgPT4gImJhckBiYXo6Ym9ndXMiKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQWRkcmVzc2FibGU6OlVSSTo6SW52YWxpZFVSSUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIGZhaWwgdG8gbWVyZ2Ugd2l0aCBib2d1cyBwYXJhbWV0ZXJzIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkubWVyZ2UoNDIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgZmFpbCB0byBtZXJnZSB3aXRoIGJvZ3VzIHBhcmFtZXRlcnMiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5tZXJnZSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgZmFpbCB0byBtZXJnZSB3aXRoIGJvdGggYXV0aG9yaXR5IGFuZCBzdWJjb21wb25lbnRzIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkubWVyZ2UoOmF1dGhvcml0eSA9PiAiZm9vOmJhckBiYXo6NDIiLCA6cG9ydCA9PiAiNDIiKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQXJndW1lbnRFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBmYWlsIHRvIG1lcmdlIHdpdGggYm90aCB1c2VyaW5mbyBhbmQgc3ViY29tcG9uZW50cyIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLm1lcmdlKDp1c2VyaW5mbyA9PiAiZm9vOmJhciIsIDp1c2VyID0+ICJmb28iKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQXJndW1lbnRFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBpZGVudGljYWwgdG8gaXRzIGR1cGxpY2F0ZSIgZG8KKyAgICBleHBlY3QoQHVyaSkudG8gZXEoQHVyaS5kdXApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2h0dHA6Ly9leGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnaHR0cDovL2V4YW1wbGUuY29tJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICInaHR0cDovL2V4YW1wbGUuY29tL3NlYXJjaD9xPVElMjZBJyIgZG8KKworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL3NlYXJjaD9xPVElMjZBIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcXVlcnkgb2YgJ3E9USUyNkEnIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcSgicT1RJTI2QSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBxdWVyeV92YWx1ZXMgb2YgeydxJyA9PiAnUSZBJ30iIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKS50byBlcSh7ICdxJyA9PiAnUSZBJyB9KQorICBlbmQKKworICBpdCAic2hvdWxkIG5vcm1hbGl6ZSB0byB0aGUgb3JpZ2luYWwgdXJpICIgKworICAgICAgIih3aXRoIHRoZSBhbXBlcnNhbmQgcHJvcGVybHkgcGVyY2VudC1lbmNvZGVkKSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbS9zZWFyY2g/cT1RJTI2QSIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tLz8meD1iJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8/Jng9YiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHF1ZXJ5IG9mICcmeD1iJyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEoIiZ4PWIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgcXVlcnlfdmFsdWVzIG9mIHsneCcgPT4gJ2InfSIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMpLnRvIGVxKHsneCcgPT4gJ2InfSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vP3E9J29uZTt0d28nJng9MSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vP3E9J29uZTt0d28nJng9MSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHF1ZXJ5IG9mICdxPSdvbmU7dHdvJyZ4PTEnIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcSgicT0nb25lO3R3bycmeD0xIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHF1ZXJ5X3ZhbHVlcyBvZiB7XCJxXCIgPT4gXCInb25lO3R3bydcIiwgXCJ4XCIgPT4gXCIxXCJ9IiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcykudG8gZXEoeyJxIiA9PiAiJ29uZTt0d28nIiwgIngiID0+ICIxIn0pCisgIGVuZAorCisgIGl0ICJzaG91bGQgZXNjYXBlIHRoZSAnOycgY2hhcmFjdGVyIHdoZW4gbm9ybWFsaXppbmcgdG8gYXZvaWQgYW1iaWd1aXR5ICIgKworICAgICAgIndpdGggdGhlIFczQyBIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiIgZG8KKyAgICAjIEhUTUwgNC4wMSBTZWN0aW9uIEIuMi4yCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLnF1ZXJ5KS50byBlcSgicT0nb25lJTNCdHdvJyZ4PTEiKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8/JiZ4PWInIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLz8mJng9YiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHF1ZXJ5IG9mICcmJng9YiciIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKCImJng9YiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBxdWVyeV92YWx1ZXMgb2Ygeyd4JyA9PiAnYid9IiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcykudG8gZXEoeyd4JyA9PiAnYid9KQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8/cT1hJiZ4PWInIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLz9xPWEmJng9YiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHF1ZXJ5IG9mICdxPWEmJng9YiciIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKCJxPWEmJng9YiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBxdWVyeV92YWx1ZXMgb2YgeydxJyA9PiAnYSwgJ3gnID0+ICdiJ30iIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKS50byBlcSh7J3EnID0+ICdhJywgJ3gnID0+ICdiJ30pCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL2V4YW1wbGUuY29tLz9xJiZ4PWInIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLz9xJiZ4PWIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBxdWVyeSBvZiAncSYmeD1iJyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEoInEmJng9YiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBxdWVyeV92YWx1ZXMgb2YgeydxJyA9PiB0cnVlLCAneCcgPT4gJ2InfSIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMpLnRvIGVxKHsncScgPT4gbmlsLCAneCcgPT4gJ2InfSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vP3E9YStiJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8/cT1hK2IiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBxdWVyeSBvZiAncT1hK2InIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcSgicT1hK2IiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgcXVlcnlfdmFsdWVzIG9mIHsncScgPT4gJ2EgYid9IiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcykudG8gZXEoeydxJyA9PiAnYSBiJ30pCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIG5vcm1hbGl6ZWQgcXVlcnkgb2YgJ3E9YStiJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3F1ZXJ5KS50byBlcSgicT1hK2IiKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8/cT1hJTJiYiciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vP3E9YSUyYmIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBxdWVyeSBvZiAncT1hK2InIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcSgicT1hJTJiYiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBxdWVyeV92YWx1ZXMgb2YgeydxJyA9PiAnYStiJ30iIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKS50byBlcSh7J3EnID0+ICdhK2InfSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgbm9ybWFsaXplZCBxdWVyeSBvZiAncT1hJTJCYiciIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF9xdWVyeSkudG8gZXEoInE9YSUyQmIiKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8/dj0lN0Umdz0lJng9JTI1Jnk9JTJCJno9QyVDQyVBNyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vZXhhbXBsZS5jb20vP3Y9JTdFJnc9JSZ4PSUyNSZ5PSUyQiZ6PUMlQ0MlQTciKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBub3JtYWxpemVkIHF1ZXJ5IG9mICd2PX4mdz0lMjUmeD0lMjUmeT0lMkImej0lQzMlODcnIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcXVlcnkpLnRvIGVxKCJ2PX4mdz0lMjUmeD0lMjUmeT0lMkImej0lQzMlODciKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly9leGFtcGxlLmNvbS8/dj0lN0Umdz0lJng9JTI1Jnk9KyZ6PUMlQ0MlQTcnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLz92PSU3RSZ3PSUmeD0lMjUmeT0rJno9QyVDQyVBNyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIG5vcm1hbGl6ZWQgcXVlcnkgb2YgJ3Y9fiZ3PSUyNSZ4PSUyNSZ5PSsmej0lQzMlODcnIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfcXVlcnkpLnRvIGVxKCJ2PX4mdz0lMjUmeD0lMjUmeT0rJno9JUMzJTg3IikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vc291bmQlMmJ2aXNpb24nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tL3NvdW5kJTJidmlzaW9uIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgbm9ybWFsaXplZCBwYXRoIG9mICcvc291bmQrdmlzaW9uJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3BhdGgpLnRvIGVxKCcvc291bmQrdmlzaW9uJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vP3E9JyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbS8/cT0iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBxdWVyeSBvZiAncT0nIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcSgicT0iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgcXVlcnlfdmFsdWVzIG9mIHsncScgPT4gJyd9IiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcykudG8gZXEoeydxJyA9PiAnJ30pCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovL3VzZXJAZXhhbXBsZS5jb20nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL3VzZXJAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSB0aGUgJ2h0dHAnIHNjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgdXNlcm5hbWUgb2YgJ3VzZXInIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJ1c2VyIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIG5vIHBhc3N3b3JkIiBkbworICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHVzZXJpbmZvIG9mICd1c2VyJyIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyaW5mbykudG8gZXEoInVzZXIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBub3JtYWxpemVkIHVzZXJpbmZvIG9mICd1c2VyJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3VzZXJpbmZvKS50byBlcSgidXNlciIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGhvc3Qgb2YgJ2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgZGVmYXVsdF9wb3J0IDgwIiBkbworICAgIGV4cGVjdChAdXJpLmRlZmF1bHRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHBvcnQgODAiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB1c2VybmFtZSBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkudXNlciA9ICJuZXd1c2VyIgorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJuZXd1c2VyIikKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEobmlsKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vbmV3dXNlckBleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBwYXNzd29yZCBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkucGFzc3dvcmQgPSAibmV3cGFzcyIKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEoIm5ld3Bhc3MiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vdXNlcjpuZXdwYXNzQGV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHVzZXJpbmZvIHNlZ21lbnQgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnVzZXJpbmZvID0gIm5ld3VzZXI6bmV3cGFzcyIKKyAgICBleHBlY3QoQHVyaS51c2VyaW5mbykudG8gZXEoIm5ld3VzZXI6bmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoIm5ld3VzZXIiKQorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgibmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9uZXd1c2VyOm5ld3Bhc3NAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdXNlcmluZm8gc2VnbWVudCBhZnRlciBuaWwgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnVzZXJpbmZvID0gbmlsCisgICAgZXhwZWN0KEB1cmkudXNlcmluZm8pLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20iKQorICAgIGV4cGVjdChAdXJpLnBvcnQpLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IGF1dGhvcml0eSBzZWdtZW50IGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5hdXRob3JpdHkgPSAibmV3dXNlckBleGFtcGxlLmNvbSIKKyAgICBleHBlY3QoQHVyaS5hdXRob3JpdHkpLnRvIGVxKCJuZXd1c2VyQGV4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcSgibmV3dXNlciIpCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20iKQorICAgIGV4cGVjdChAdXJpLnBvcnQpLnRvIGVxKG5pbCkKKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL25ld3VzZXJAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGFmdGVyIG5pbCBhc3NpZ25tZW50IG9mIGF1dGhvcml0eSBzZWdtZW50IiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgICMgVGhpcyB3b3VsZCBjcmVhdGUgYW4gaW52YWxpZCBVUkkKKyAgICAgIEB1cmkuYXV0aG9yaXR5ID0gbmlsCisgICAgZW5kKS50byByYWlzZV9lcnJvcgorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly91c2VyOkBleGFtcGxlLmNvbSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vdXNlcjpAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSB0aGUgJ2h0dHAnIHNjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgdXNlcm5hbWUgb2YgJ3VzZXInIiBkbworICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJ1c2VyIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGFzc3dvcmQgb2YgJyciIGRvCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBub3JtYWxpemVkIHVzZXJpbmZvIG9mICd1c2VyOiciIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF91c2VyaW5mbykudG8gZXEoInVzZXI6IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgaG9zdCBvZiAnZXhhbXBsZS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHBvcnQgODAiIGRvCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB1c2VybmFtZSBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkudXNlciA9ICJuZXd1c2VyIgorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJuZXd1c2VyIikKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEoIiIpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9uZXd1c2VyOkBleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBwYXNzd29yZCBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkucGFzc3dvcmQgPSAibmV3cGFzcyIKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEoIm5ld3Bhc3MiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vdXNlcjpuZXdwYXNzQGV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IGF1dGhvcml0eSBzZWdtZW50IGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5hdXRob3JpdHkgPSAibmV3dXNlcjpAZXhhbXBsZS5jb20iCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgibmV3dXNlcjpAZXhhbXBsZS5jb20iKQorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCJuZXd1c2VyIikKKyAgICBleHBlY3QoQHVyaS5wYXNzd29yZCkudG8gZXEoIiIpCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9uZXd1c2VyOkBleGFtcGxlLmNvbSIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovLzpwYXNzQGV4YW1wbGUuY29tJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly86cGFzc0BleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdXNlIHRoZSAnaHR0cCcgc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEoImh0dHAiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSB1c2VybmFtZSBvZiAnJyIgZG8KKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcSgiIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGFzc3dvcmQgb2YgJ3Bhc3MnIiBkbworICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgicGFzcyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHVzZXJpbmZvIG9mICc6cGFzcyciIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcmluZm8pLnRvIGVxKCI6cGFzcyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIG5vcm1hbGl6ZWQgdXNlcmluZm8gb2YgJzpwYXNzJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemVkX3VzZXJpbmZvKS50byBlcSgiOnBhc3MiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgcG9ydCA4MCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHVzZXJuYW1lIGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS51c2VyID0gIm5ld3VzZXIiCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoIm5ld3VzZXIiKQorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgicGFzcyIpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9uZXd1c2VyOnBhc3NAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcGFzc3dvcmQgYWZ0ZXIgYXNzaWdubWVudCIgZG8KKyAgICBAdXJpLnBhc3N3b3JkID0gIm5ld3Bhc3MiCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCJuZXdwYXNzIikKKyAgICBleHBlY3QoQHVyaS51c2VyKS50byBlcSgiIikKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovLzpuZXdwYXNzQGV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IGF1dGhvcml0eSBzZWdtZW50IGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5hdXRob3JpdHkgPSAiOm5ld3Bhc3NAZXhhbXBsZS5jb20iCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgiOm5ld3Bhc3NAZXhhbXBsZS5jb20iKQorICAgIGV4cGVjdChAdXJpLnVzZXIpLnRvIGVxKCIiKQorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgibmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgICBleHBlY3QoQHVyaS5wb3J0KS50byBlcShuaWwpCisgICAgZXhwZWN0KEB1cmkuaW5mZXJyZWRfcG9ydCkudG8gZXEoODApCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly86bmV3cGFzc0BleGFtcGxlLmNvbSIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInaHR0cDovLzpAZXhhbXBsZS5jb20nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovLzpAZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSB0aGUgJ2h0dHAnIHNjaGVtZSIgZG8KKyAgICBleHBlY3QoQHVyaS5zY2hlbWUpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgdXNlcm5hbWUgb2YgJyciIGRvCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoIiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhc3N3b3JkIG9mICcnIiBkbworICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgiIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgbm9ybWFsaXplZCB1c2VyaW5mbyBvZiBuaWwiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplZF91c2VyaW5mbykudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgcG9ydCA4MCIgZG8KKyAgICBleHBlY3QoQHVyaS5pbmZlcnJlZF9wb3J0KS50byBlcSg4MCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHVzZXJuYW1lIGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS51c2VyID0gIm5ld3VzZXIiCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoIm5ld3VzZXIiKQorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgiIikKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL25ld3VzZXI6QGV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHBhc3N3b3JkIGFmdGVyIGFzc2lnbm1lbnQiIGRvCisgICAgQHVyaS5wYXNzd29yZCA9ICJuZXdwYXNzIgorICAgIGV4cGVjdChAdXJpLnBhc3N3b3JkKS50byBlcSgibmV3cGFzcyIpCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoIiIpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly86bmV3cGFzc0BleGFtcGxlLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBhdXRob3JpdHkgc2VnbWVudCBhZnRlciBhc3NpZ25tZW50IiBkbworICAgIEB1cmkuYXV0aG9yaXR5ID0gIjpAbmV3ZXhhbXBsZS5jb20iCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgiOkBuZXdleGFtcGxlLmNvbSIpCisgICAgZXhwZWN0KEB1cmkudXNlcikudG8gZXEoIiIpCisgICAgZXhwZWN0KEB1cmkucGFzc3dvcmQpLnRvIGVxKCIiKQorICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJuZXdleGFtcGxlLmNvbSIpCisgICAgZXhwZWN0KEB1cmkucG9ydCkudG8gZXEobmlsKQorICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDgwKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vOkBuZXdleGFtcGxlLmNvbSIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInI2V4YW1wbGUnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiI2V4YW1wbGUiKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgcmVsYXRpdmUiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX3JlbGF0aXZlCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGhvc3Qgb2YgbmlsIiBkbworICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgc2l0ZSBvZiBuaWwiIGRvCisgICAgZXhwZWN0KEB1cmkuc2l0ZSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBub3JtYWxpemVkX3NpdGUgb2YgbmlsIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZWRfc2l0ZSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwYXRoIG9mICcnIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBxdWVyeSBzdHJpbmcgb2YgbmlsIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5KS50byBlcShuaWwpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGZyYWdtZW50IG9mICdleGFtcGxlJyIgZG8KKyAgICBleHBlY3QoQHVyaS5mcmFnbWVudCkudG8gZXEoImV4YW1wbGUiKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAidGhlIG5ldHdvcmstcGF0aCByZWZlcmVuY2UgJy8vZXhhbXBsZS5jb20vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIi8vZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHJlbGF0aXZlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9yZWxhdGl2ZQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBob3N0IG9mICdleGFtcGxlLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkuaG9zdCkudG8gZXEoImV4YW1wbGUuY29tIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnLyciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi8iKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIHJvdXRpbmcgaXMgYXR0ZW1wdGVkIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkucm91dGVfdG8oImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQXJndW1lbnRFcnJvciwgL1wvXC9leGFtcGxlLmNvbVwvLykKKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnJvdXRlX2Zyb20oImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQXJndW1lbnRFcnJvciwgL1wvXC9leGFtcGxlLmNvbVwvLykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgJ251bGwnIG9yaWdpbiIgZG8KKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdudWxsJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidmZWVkOi8vaHR0cDovL2V4YW1wbGUuY29tLyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJmZWVkOi8vaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGhvc3Qgb2YgJ2h0dHAnIiBkbworICAgIGV4cGVjdChAdXJpLmhvc3QpLnRvIGVxKCJodHRwIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGEgcGF0aCBvZiAnLy9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCIvL2V4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInZmVlZDpodHRwOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImZlZWQ6aHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHBhdGggb2YgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBub3JtYWxpemUgdG8gJ2h0dHA6Ly9leGFtcGxlLmNvbS8nIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplIS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhICdudWxsJyBvcmlnaW4iIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnbnVsbCcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInZXhhbXBsZTovL2EvYi9jLyU3QmZvbyU3RCciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJleGFtcGxlOi8vYS9iL2MvJTdCZm9vJTdEIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDYuMi4yIG9mIFJGQyAzOTg2CisgIGl0ICJzaG91bGQgYmUgZXF1aXZhbGVudCB0byBlWEFNUExFOi8vYS8uL2IvLi4vYi8lNjMvJTdiZm9vJTdkIiBkbworICAgIGV4cGVjdChAdXJpKS50byBlcSgKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImVYQU1QTEU6Ly9hLy4vYi8uLi9iLyU2My8lN2Jmb28lN2QiKQorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnZXhhbXBsZTovL2EnIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2V4YW1wbGU6Ly9hJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vaW5kaXJlY3QvcGF0aC8uL3RvLy4uL3Jlc291cmNlLyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKAorICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9pbmRpcmVjdC9wYXRoLy4vdG8vLi4vcmVzb3VyY2UvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCB1c2UgdGhlICdodHRwJyBzY2hlbWUiIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiaHR0cCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIGhvc3Qgb2YgJ2V4YW1wbGUuY29tJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ob3N0KS50byBlcSgiZXhhbXBsZS5jb20iKQorICBlbmQKKworICBpdCAic2hvdWxkIHVzZSBwb3J0IDgwIiBkbworICAgIGV4cGVjdChAdXJpLmluZmVycmVkX3BvcnQpLnRvIGVxKDgwKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSBwYXRoIG9mICcvaW5kaXJlY3QvcGF0aC8uL3RvLy4uL3Jlc291cmNlLyciIGRvCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi9pbmRpcmVjdC9wYXRoLy4vdG8vLi4vcmVzb3VyY2UvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDYuMi4yLjMgb2YgUkZDIDM5ODYKKyAgaXQgInNob3VsZCBoYXZlIGEgbm9ybWFsaXplZCBwYXRoIG9mICcvaW5kaXJlY3QvcGF0aC9yZXNvdXJjZS8nIiBkbworICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS5wYXRoKS50byBlcSgiL2luZGlyZWN0L3BhdGgvcmVzb3VyY2UvIikKKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUhLnBhdGgpLnRvIGVxKCIvaW5kaXJlY3QvcGF0aC9yZXNvdXJjZS8iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly91bmRlcl9zY29yZS5leGFtcGxlLmNvbS8nIiBkbworICBpdCAic2hvdWxkIG5vdCBjYXVzZSBhbiBlcnJvciIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vdW5kZXJfc2NvcmUuZXhhbXBsZS5jb20vIikKKyAgICBlbmQpLm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJy4vdGhpczp0aGF0JyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIi4vdGhpczp0aGF0IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBjb25zaWRlcmVkIHJlbGF0aXZlIiBkbworICAgIGV4cGVjdChAdXJpKS50byBiZV9yZWxhdGl2ZQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgbm8gc2NoZW1lIiBkbworICAgIGV4cGVjdChAdXJpLnNjaGVtZSkudG8gZXEobmlsKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSAnbnVsbCcgb3JpZ2luIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ251bGwnKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ3RoaXM6dGhhdCciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJ0aGlzOnRoYXQiKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGNvbnNpZGVyZWQgYWJzb2x1dGUiIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGJlX2Fic29sdXRlCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhIHNjaGVtZSBvZiAndGhpcyciIGRvCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgidGhpcyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhICdudWxsJyBvcmlnaW4iIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnbnVsbCcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICc/JyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIj8iKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vcm1hbGl6ZSB0byAnJyIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoIiIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCByZXR1cm4gdHlwZSIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMpLnRvIGVxKHt9KQorICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcyhIYXNoKSkudG8gZXEoe30pCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKEFycmF5KSkudG8gZXEoW10pCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhICdudWxsJyBvcmlnaW4iIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnbnVsbCcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICc/b25lPTEmdHdvPTImdGhyZWU9MyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCI/b25lPTEmdHdvPTImdGhyZWU9MyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBxdWVyeSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKS50byBlcSh7Im9uZSIgPT4gIjEiLCAidHdvIiA9PiAiMiIsICJ0aHJlZSIgPT4gIjMifSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciBmb3IgaW52YWxpZCByZXR1cm4gdHlwZSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5xdWVyeV92YWx1ZXMoRml4bnVtKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoQXJndW1lbnRFcnJvcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IGFycmF5IHF1ZXJ5IHZhbHVlcyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMoQXJyYXkpKS50byBlcShbCisgICAgICBbIm9uZSIsICIxIl0sIFsidHdvIiwgIjIiXSwgWyJ0aHJlZSIsICIzIl0KKyAgICBdKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYSAnbnVsbCcgb3JpZ2luIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ251bGwnKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAnP29uZT0xPXVubyZ0d289Mj1kb3MnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiP29uZT0xPXVubyZ0d289Mj1kb3MiKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcXVlcnkgdmFsdWVzIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcykudG8gZXEoeyJvbmUiID0+ICIxPXVubyIsICJ0d28iID0+ICIyPWRvcyJ9KQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgYXJyYXkgcXVlcnkgdmFsdWVzIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcyhBcnJheSkpLnRvIGVxKFsKKyAgICAgIFsib25lIiwgIjE9dW5vIl0sIFsidHdvIiwgIjI9ZG9zIl0KKyAgICBdKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAnP29uZVt0d29dW3RocmVlXT1mb3VyJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIj9vbmVbdHdvXVt0aHJlZV09Zm91ciIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBxdWVyeSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKS50byBlcSh7Im9uZVt0d29dW3RocmVlXSIgPT4gImZvdXIifSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IGFycmF5IHF1ZXJ5IHZhbHVlcyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMoQXJyYXkpKS50byBlcShbCisgICAgICBbIm9uZVt0d29dW3RocmVlXSIsICJmb3VyIl0KKyAgICBdKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAnP29uZS50d28udGhyZWU9Zm91ciciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCI/b25lLnR3by50aHJlZT1mb3VyIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHF1ZXJ5IHZhbHVlcyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMpLnRvIGVxKHsKKyAgICAgICJvbmUudHdvLnRocmVlIiA9PiAiZm91ciIKKyAgICB9KQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgYXJyYXkgcXVlcnkgdmFsdWVzIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcyhBcnJheSkpLnRvIGVxKFsKKyAgICAgIFsib25lLnR3by50aHJlZSIsICJmb3VyIl0KKyAgICBdKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJz9vbmVbdHdvXVt0aHJlZV09Zm91ciZvbmVbdHdvXVtmaXZlXT1zaXgnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiP29uZVt0d29dW3RocmVlXT1mb3VyJm9uZVt0d29dW2ZpdmVdPXNpeCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBxdWVyeSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKS50byBlcSh7CisgICAgICAib25lW3R3b11bdGhyZWVdIiA9PiAiZm91ciIsICJvbmVbdHdvXVtmaXZlXSIgPT4gInNpeCIKKyAgICB9KQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgYXJyYXkgcXVlcnkgdmFsdWVzIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcyhBcnJheSkpLnRvIGVxKFsKKyAgICAgIFsib25lW3R3b11bdGhyZWVdIiwgImZvdXIiXSwgWyJvbmVbdHdvXVtmaXZlXSIsICJzaXgiXQorICAgIF0pCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInP29uZS50d28udGhyZWU9Zm91ciZvbmUudHdvLmZpdmU9c2l4JyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoIj9vbmUudHdvLnRocmVlPWZvdXImb25lLnR3by5maXZlPXNpeCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBxdWVyeSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKS50byBlcSh7CisgICAgICAib25lLnR3by50aHJlZSIgPT4gImZvdXIiLCAib25lLnR3by5maXZlIiA9PiAic2l4IgorICAgIH0pCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBhcnJheSBxdWVyeSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKEFycmF5KSkudG8gZXEoWworICAgICAgWyJvbmUudHdvLnRocmVlIiwgImZvdXIiXSwgWyJvbmUudHdvLmZpdmUiLCAic2l4Il0KKyAgICBdKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJz9vbmU9dHdvJm9uZT10aHJlZSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKAorICAgICAgIj9vbmU9dHdvJm9uZT10aHJlZSZvbmU9Zm91ciIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBjb3JyZWN0IGFycmF5IHF1ZXJ5IHZhbHVlcyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMoQXJyYXkpKS50byBlcSgKKyAgICAgIFtbJ29uZScsICd0d28nXSwgWydvbmUnLCAndGhyZWUnXSwgWydvbmUnLCAnZm91ciddXQorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGNvcnJlY3QgaGFzaCBxdWVyeSB2YWx1ZXMiIGRvCisgICAgc2tpcCgiVGhpcyBpcyBwcm9iYWJseSBtb3JlIGRlc2lyYWJsZSBiZWhhdmlvci4iKQorICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcyhIYXNoKSkudG8gZXEoCisgICAgICB7J29uZScgPT4gWyd0d28nLCAndGhyZWUnLCAnZm91ciddfQorICAgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhbmRsZSBhc3NpZ25tZW50IHdpdGgga2V5cyBvZiBtaXhlZCB0eXBlIiBkbworICAgIEB1cmkucXVlcnlfdmFsdWVzID0gQHVyaS5xdWVyeV92YWx1ZXMoSGFzaCkubWVyZ2UoezpvbmUgPT4gJ3RocmVlJ30pCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKEhhc2gpKS50byBlcSh7J29uZScgPT4gJ3RocmVlJ30pCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInP29uZVt0d29dW3RocmVlXVtdPWZvdXImb25lW3R3b11bdGhyZWVdW109Zml2ZSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKAorICAgICAgIj9vbmVbdHdvXVt0aHJlZV1bXT1mb3VyJm9uZVt0d29dW3RocmVlXVtdPWZpdmUiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgY29ycmVjdCBxdWVyeSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKEhhc2gpKS50byBlcSh7Im9uZVt0d29dW3RocmVlXVtdIiA9PiAiZml2ZSJ9KQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgY29ycmVjdCBhcnJheSBxdWVyeSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKEFycmF5KSkudG8gZXEoWworICAgICAgWyJvbmVbdHdvXVt0aHJlZV1bXSIsICJmb3VyIl0sIFsib25lW3R3b11bdGhyZWVdW10iLCAiZml2ZSJdCisgICAgXSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIic/b25lW3R3b11bdGhyZWVdWzBdPWZvdXImb25lW3R3b11bdGhyZWVdWzFdPWZpdmUnIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgICAgICI/b25lW3R3b11bdGhyZWVdWzBdPWZvdXImb25lW3R3b11bdGhyZWVdWzFdPWZpdmUiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgcXVlcnkgdmFsdWVzIiBkbworICAgIGV4cGVjdChAdXJpLnF1ZXJ5X3ZhbHVlcykudG8gZXEoeworICAgICAgIm9uZVt0d29dW3RocmVlXVswXSIgPT4gImZvdXIiLCAib25lW3R3b11bdGhyZWVdWzFdIiA9PiAiZml2ZSIKKyAgICB9KQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJz9vbmVbdHdvXVt0aHJlZV1bMV09Zm91ciZvbmVbdHdvXVt0aHJlZV1bMF09Zml2ZSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKAorICAgICAgIj9vbmVbdHdvXVt0aHJlZV1bMV09Zm91ciZvbmVbdHdvXVt0aHJlZV1bMF09Zml2ZSIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCBxdWVyeSB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEB1cmkucXVlcnlfdmFsdWVzKS50byBlcSh7CisgICAgICAib25lW3R3b11bdGhyZWVdWzFdIiA9PiAiZm91ciIsICJvbmVbdHdvXVt0aHJlZV1bMF0iID0+ICJmaXZlIgorICAgIH0pCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tICIgKworICAgICInP29uZVt0d29dW3RocmVlXVsyXT1mb3VyJm9uZVt0d29dW3RocmVlXVsxXT1maXZlJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoCisgICAgICAiP29uZVt0d29dW3RocmVlXVsyXT1mb3VyJm9uZVt0d29dW3RocmVlXVsxXT1maXZlIgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHF1ZXJ5IHZhbHVlcyIgZG8KKyAgICBleHBlY3QoQHVyaS5xdWVyeV92YWx1ZXMpLnRvIGVxKHsKKyAgICAgICJvbmVbdHdvXVt0aHJlZV1bMl0iID0+ICJmb3VyIiwgIm9uZVt0d29dW3RocmVlXVsxXSIgPT4gImZpdmUiCisgICAgfSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vd3d3LuipueWnhuaWry5jb20vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoImh0dHA6Ly93d3cu6Km55aeG5pavLmNvbS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gJ2h0dHA6Ly93d3cueG4tLTh3czAwemh5M2EuY29tLyciIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL3d3dy54bi0tOHdzMDB6aHkzYS5jb20vIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgZG9tYWluIG5hbWUgZW5jb2RlZCBkdXJpbmcgbm9ybWFsaXphdGlvbiIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVkX2VuY29kZShAdXJpLnRvX3MpKS50byBlcSgKKyAgICAgICJodHRwOi8vd3d3LuipueWnhuaWry5jb20vIgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovL3d3dy54bi0tOHdzMDB6aHkzYS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2h0dHA6Ly93d3cueG4tLTh3czAwemh5M2EuY29tJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vd3d3LuipueWnhuaWry5jb20vIHNvbWUgc3BhY2VzIC8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiaHR0cDovL3d3dy7oqbnlp4bmlq8uY29tLyBzb21lIHNwYWNlcyAvIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBiZSBlcXVpdmFsZW50IHRvICIgKworICAgICAgIidodHRwOi8vd3d3LnhuLS04d3MwMHpoeTNhLmNvbS8lMjBzb21lJTIwc3BhY2VzJTIwLyciIGRvCisgICAgZXhwZWN0KEB1cmkpLnRvIGVxKAorICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgICAgICAgImh0dHA6Ly93d3cueG4tLTh3czAwemh5M2EuY29tLyUyMHNvbWUlMjBzcGFjZXMlMjAvIikKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGhhdmUgZG9tYWluIG5hbWUgZW5jb2RlZCBkdXJpbmcgbm9ybWFsaXphdGlvbiIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVkX2VuY29kZShAdXJpLnRvX3MpKS50byBlcSgKKyAgICAgICJodHRwOi8vd3d3LuipueWnhuaWry5jb20vJTIwc29tZSUyMHNwYWNlcyUyMC8iCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdodHRwOi8vd3d3LnhuLS04d3MwMHpoeTNhLmNvbSciIGRvCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnaHR0cDovL3d3dy54bi0tOHdzMDB6aHkzYS5jb20nKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBwYXJzZWQgZnJvbSAiICsKKyAgICAiJ2h0dHA6Ly93d3cueG4tLTh3czAwemh5M2EuY29tLyciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vd3d3LnhuLS04d3MwMHpoeTNhLmNvbS8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGJlIGRpc3BsYXllZCBhcyBodHRwOi8vd3d3LuipueWnhuaWry5jb20vIiBkbworICAgIGV4cGVjdChAdXJpLmRpc3BsYXlfdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vd3d3LuipueWnhuaWry5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBwcm9wZXJseSBmb3JjZSB0aGUgZW5jb2RpbmciIGRvCisgICAgZGlzcGxheV9zdHJpbmcgPSBAdXJpLmRpc3BsYXlfdXJpLnRvX3N0cgorICAgIGV4cGVjdChkaXNwbGF5X3N0cmluZykudG8gZXEoImh0dHA6Ly93d3cu6Km55aeG5pavLmNvbS8iKQorICAgIGlmIGRpc3BsYXlfc3RyaW5nLnJlc3BvbmRfdG8/KDplbmNvZGluZykKKyAgICAgIGV4cGVjdChkaXNwbGF5X3N0cmluZy5lbmNvZGluZy50b19zKS50byBlcShFbmNvZGluZzo6VVRGXzgudG9fcykKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnaHR0cDovL3d3dy54bi0tOHdzMDB6aHkzYS5jb20nIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2h0dHA6Ly93d3cueG4tLTh3czAwemh5M2EuY29tJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFyc2VkIGZyb20gIiArCisgICAgIidodHRwOi8vd3d3LuipueWnhuaWry5jb20vYXRvbXRlc3RzL2lyaS/oqbkuaHRtbCciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vd3d3LuipueWnhuaWry5jb20vYXRvbXRlc3RzL2lyaS/oqbkuaHRtbCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm9ybWFsaXplIHRvICIgKworICAgICAgImh0dHA6Ly93d3cueG4tLTh3czAwemh5M2EuY29tL2F0b210ZXN0cy9pcmkvJUU4JUE5JUI5Lmh0bWwiIGRvCisgICAgZXhwZWN0KEB1cmkubm9ybWFsaXplLnRvX3MpLnRvIGVxKAorICAgICAgImh0dHA6Ly93d3cueG4tLTh3czAwemh5M2EuY29tL2F0b210ZXN0cy9pcmkvJUU4JUE5JUI5Lmh0bWwiCisgICAgKQorICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSEudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3d3dy54bi0tOHdzMDB6aHkzYS5jb20vYXRvbXRlc3RzL2lyaS8lRTglQTklQjkuaHRtbCIKKyAgICApCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNlZCBmcm9tIGEgcGVyY2VudC1lbmNvZGVkIElSSSIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoCisgICAgICAiaHR0cDovL3d3dy4lRTMlODElQkIlRTMlODIlOTMlRTMlODElQTglRTMlODElODYlRTMlODElQUIlRTMlODElQUEiICsKKyAgICAgICIlRTMlODElOEMlRTMlODElODQlRTMlODIlOEYlRTMlODElOTElRTMlODElQUUlRTMlODIlOEYlRTMlODElOEIlRTMiICsKKyAgICAgICIlODIlODklRTMlODElQUElRTMlODElODQlRTMlODElQTklRTMlODIlODElRTMlODElODQlRTMlODIlOTMlRTMlODIiICsKKyAgICAgICIlODElRTMlODElODQlRTMlODElQUUlRTMlODIlODklRTMlODElQjklRTMlODIlOEIlRTMlODElQkUlRTMlODElQTAiICsKKyAgICAgICIlRTMlODElQUElRTMlODElOEMlRTMlODElOEYlRTMlODElOTclRTMlODElQUElRTMlODElODQlRTMlODElQTglRTMiICsKKyAgICAgICIlODElOUYlRTMlODIlOEElRTMlODElQUElRTMlODElODQudzMubWFnLmtlaW8uYWMuanAiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIG5vcm1hbGl6ZSB0byBzb21ldGhpbmcgc2FuZSIgZG8KKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3d3dy54bi0tbjhqYWFhYWFpNWJoZjdhczhmc2ZrM2pua25lZmRkZTNmIiArCisgICAgICAiZzExYW1iNWd6ZGI0d2k5YnlhM2tjNmxyYS53My5tYWcua2Vpby5hYy5qcC8iCisgICAgKQorICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZSEudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL3d3dy54bi0tbjhqYWFhYWFpNWJoZjdhczhmc2ZrM2pua25lZmRkZTNmIiArCisgICAgICAiZzExYW1iNWd6ZGI0d2k5YnlhM2tjNmxyYS53My5tYWcua2Vpby5hYy5qcC8iCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIGNvcnJlY3Qgb3JpZ2luIiBkbworICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoCisgICAgICAiaHR0cDovL3d3dy54bi0tbjhqYWFhYWFpNWJoZjdhczhmc2ZrM2pua25lZmRkZTNmIiArCisgICAgICAiZzExYW1iNWd6ZGI0d2k5YnlhM2tjNmxyYS53My5tYWcua2Vpby5hYy5qcCIKKyAgICApCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aXRoIGEgYmFzZSB1cmkgb2YgJ2h0dHA6Ly9hL2IvYy9kO3A/cSciIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKCJodHRwOi8vYS9iL2MvZDtwP3EiKQorICBlbmQKKworICAjIFNlY3Rpb24gNS40LjEgb2YgUkZDIDM5ODYKKyAgaXQgIndoZW4gam9pbmVkIHdpdGggJ2c6aCcgc2hvdWxkIHJlc29sdmUgdG8gZzpoIiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnOmgiKS50b19zKS50byBlcSgiZzpoIikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKEB1cmksICJnOmgiKS50b19zKS50byBlcSgiZzpoIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnJyBzaG91bGQgcmVzb2x2ZSB0byBodHRwOi8vYS9iL2MvZyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZyIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICJnIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuL2cnIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy9nIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIuL2ciKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2ciKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLi9nIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnLycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2cvIiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnLyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZy8iKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiZy8iKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2cvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcvZycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvZyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiL2ciKS50b19zKS50byBlcSgiaHR0cDovL2EvZyIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICIvZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcvL2cnIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9nIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIvL2ciKS50b19zKS50byBlcSgiaHR0cDovL2ciKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLy9nIikudG9fcykudG8gZXEoImh0dHA6Ly9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICc/eScgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2Q7cD95IiBkbworICAgIGV4cGVjdCgoQHVyaSArICI/eSIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZDtwP3kiKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiP3kiKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2Q7cD95IikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnP3knIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy9nP3kiIGRvCisgICAgZXhwZWN0KChAdXJpICsgImc/eSIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZz95IikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKEB1cmkudG9fcywgImc/eSIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZz95IikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcjcycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2Q7cD9xI3MiIGRvCisgICAgZXhwZWN0KChAdXJpICsgIiNzIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9kO3A/cSNzIikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKEB1cmkudG9fcywgIiNzIikudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL2EvYi9jL2Q7cD9xI3MiCisgICAgKQorICBlbmQKKworICAjIFNlY3Rpb24gNS40LjEgb2YgUkZDIDM5ODYKKyAgaXQgIndoZW4gam9pbmVkIHdpdGggJ2cjcycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2cjcyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiZyNzIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nI3MiKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiZyNzIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nI3MiKQorICBlbmQKKworICAjIFNlY3Rpb24gNS40LjEgb2YgUkZDIDM5ODYKKyAgaXQgIndoZW4gam9pbmVkIHdpdGggJ2c/eSNzJyBzaG91bGQgcmVzb2x2ZSB0byBodHRwOi8vYS9iL2MvZz95I3MiIGRvCisgICAgZXhwZWN0KChAdXJpICsgImc/eSNzIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nP3kjcyIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbigKKyAgICAgIEB1cmkudG9fcywgImc/eSNzIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nP3kjcyIpCisgIGVuZAorCisgICMgU2VjdGlvbiA1LjQuMSBvZiBSRkMgMzk4NgorICBpdCAid2hlbiBqb2luZWQgd2l0aCAnO3gnIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy87eCIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiO3giKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jLzt4IikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKEB1cmkudG9fcywgIjt4IikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy87eCIpCisgIGVuZAorCisgICMgU2VjdGlvbiA1LjQuMSBvZiBSRkMgMzk4NgorICBpdCAid2hlbiBqb2luZWQgd2l0aCAnZzt4JyBzaG91bGQgcmVzb2x2ZSB0byBodHRwOi8vYS9iL2MvZzt4IiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnO3giKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2c7eCIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICJnO3giKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2c7eCIpCisgIGVuZAorCisgICMgU2VjdGlvbiA1LjQuMSBvZiBSRkMgMzk4NgorICBpdCAid2hlbiBqb2luZWQgd2l0aCAnZzt4P3kjcycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2c7eD95I3MiIGRvCisgICAgZXhwZWN0KChAdXJpICsgImc7eD95I3MiKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2c7eD95I3MiKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oCisgICAgICBAdXJpLnRvX3MsICJnO3g/eSNzIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nO3g/eSNzIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcnIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy9kO3A/cSIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9kO3A/cSIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICIiKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2Q7cD9xIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuJyBzaG91bGQgcmVzb2x2ZSB0byBodHRwOi8vYS9iL2MvIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIuIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy8iKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLiIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jLyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiLi8iKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jLyIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICIuLyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLicgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi8iIGRvCisgICAgZXhwZWN0KChAdXJpICsgIi4uIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvIikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKEB1cmkudG9fcywgIi4uIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLi8nIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIuLi8iKS50b19zKS50byBlcSgiaHR0cDovL2EvYi8iKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLi4vIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLi9nJyBzaG91bGQgcmVzb2x2ZSB0byBodHRwOi8vYS9iL2ciIGRvCisgICAgZXhwZWN0KChAdXJpICsgIi4uL2ciKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9nIikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKEB1cmkudG9fcywgIi4uL2ciKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLi8uLicgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIuLi8uLiIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS8iKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLi4vLi4iKS50b19zKS50byBlcSgiaHR0cDovL2EvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLi8uLi8nIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hLyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiLi4vLi4vIikudG9fcykudG8gZXEoImh0dHA6Ly9hLyIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICIuLi8uLi8iKS50b19zKS50byBlcSgiaHR0cDovL2EvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4xIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLi8uLi9nJyBzaG91bGQgcmVzb2x2ZSB0byBodHRwOi8vYS9nIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIuLi8uLi9nIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2ciKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLi4vLi4vZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLi8uLi8uLi9nJyBzaG91bGQgcmVzb2x2ZSB0byBodHRwOi8vYS9nIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIuLi8uLi8uLi9nIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2ciKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLi4vLi4vLi4vZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9nIikKKyAgZW5kCisKKyAgaXQgIndoZW4gam9pbmVkIHdpdGggJy4uLy4uLy4vLi4vZycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvZyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiLi4vLi4vLi8uLi9nIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2ciKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLi4vLi4vLi8uLi9nIikudG9fcykudG8gZXEoCisgICAgICAiaHR0cDovL2EvZyIKKyAgICApCisgIGVuZAorCisgICMgU2VjdGlvbiA1LjQuMiBvZiBSRkMgMzk4NgorICBpdCAid2hlbiBqb2luZWQgd2l0aCAnLi4vLi4vLi4vLi4vZycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvZyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiLi4vLi4vLi4vLi4vZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9nIikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKAorICAgICAgQHVyaS50b19zLCAiLi4vLi4vLi4vLi4vZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcvLi9nJyBzaG91bGQgcmVzb2x2ZSB0byBodHRwOi8vYS9nIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIvLi9nIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2ciKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLy4vZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcvLi4vZycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvZyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiLy4uL2ciKS50b19zKS50byBlcSgiaHR0cDovL2EvZyIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICIvLi4vZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnLicgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2cuIiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnLiIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZy4iKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiZy4iKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2cuIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuZycgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jLy5nIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIuZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvLmciKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLmciKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jLy5nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnLi4nIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy9nLi4iIGRvCisgICAgZXhwZWN0KChAdXJpICsgImcuLiIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZy4uIikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKEB1cmkudG9fcywgImcuLiIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZy4uIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLmcnIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy8uLmciIGRvCisgICAgZXhwZWN0KChAdXJpICsgIi4uZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvLi5nIikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKEB1cmkudG9fcywgIi4uZyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvLi5nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuLy4uL2cnIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvZyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiLi8uLi9nIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvZyIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICIuLy4uL2ciKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9nIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICcuL2cvLicgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2cvIiBkbworICAgIGV4cGVjdCgoQHVyaSArICIuL2cvLiIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZy8iKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiLi9nLy4iKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2cvIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnLy4vaCcgc2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2cvaCIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiZy8uL2giKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2cvaCIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICJnLy4vaCIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZy9oIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnLy4uL2gnIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy9oIiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnLy4uL2giKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2giKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaS50b19zLCAiZy8uLi9oIikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9oIikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnO3g9MS8uL3knICIgKworICAgICAgInNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy9nO3g9MS95IiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnO3g9MS8uL3kiKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2c7eD0xL3kiKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oCisgICAgICBAdXJpLnRvX3MsICJnO3g9MS8uL3kiKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2c7eD0xL3kiKQorICBlbmQKKworICAjIFNlY3Rpb24gNS40LjIgb2YgUkZDIDM5ODYKKyAgaXQgIndoZW4gam9pbmVkIHdpdGggJ2c7eD0xLy4uL3knIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy95IiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnO3g9MS8uLi95IikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy95IikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKAorICAgICAgQHVyaS50b19zLCAiZzt4PTEvLi4veSIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MveSIpCisgIGVuZAorCisgICMgU2VjdGlvbiA1LjQuMiBvZiBSRkMgMzk4NgorICBpdCAid2hlbiBqb2luZWQgd2l0aCAnZz95Ly4veCcgIiArCisgICAgICAic2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2c/eS8uL3giIGRvCisgICAgZXhwZWN0KChAdXJpICsgImc/eS8uL3giKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2c/eS8uL3giKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oCisgICAgICBAdXJpLnRvX3MsICJnP3kvLi94IikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nP3kvLi94IikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdnP3kvLi4veCcgIiArCisgICAgICAic2hvdWxkIHJlc29sdmUgdG8gaHR0cDovL2EvYi9jL2c/eS8uLi94IiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnP3kvLi4veCIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZz95Ly4uL3giKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oCisgICAgICBAdXJpLnRvX3MsICJnP3kvLi4veCIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZz95Ly4uL3giKQorICBlbmQKKworICAjIFNlY3Rpb24gNS40LjIgb2YgUkZDIDM5ODYKKyAgaXQgIndoZW4gam9pbmVkIHdpdGggJ2cjcy8uL3gnICIgKworICAgICAgInNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy9nI3MvLi94IiBkbworICAgIGV4cGVjdCgoQHVyaSArICJnI3MvLi94IikudG9fcykudG8gZXEoImh0dHA6Ly9hL2IvYy9nI3MvLi94IikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKAorICAgICAgQHVyaS50b19zLCAiZyNzLy4veCIpLnRvX3MpLnRvIGVxKCJodHRwOi8vYS9iL2MvZyNzLy4veCIpCisgIGVuZAorCisgICMgU2VjdGlvbiA1LjQuMiBvZiBSRkMgMzk4NgorICBpdCAid2hlbiBqb2luZWQgd2l0aCAnZyNzLy4uL3gnICIgKworICAgICAgInNob3VsZCByZXNvbHZlIHRvIGh0dHA6Ly9hL2IvYy9nI3MvLi4veCIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiZyNzLy4uL3giKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2cjcy8uLi94IikKKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5qb2luKAorICAgICAgQHVyaS50b19zLCAiZyNzLy4uL3giKS50b19zKS50byBlcSgiaHR0cDovL2EvYi9jL2cjcy8uLi94IikKKyAgZW5kCisKKyAgIyBTZWN0aW9uIDUuNC4yIG9mIFJGQyAzOTg2CisgIGl0ICJ3aGVuIGpvaW5lZCB3aXRoICdodHRwOmcnIHNob3VsZCByZXNvbHZlIHRvIGh0dHA6ZyIgZG8KKyAgICBleHBlY3QoKEB1cmkgKyAiaHR0cDpnIikudG9fcykudG8gZXEoImh0dHA6ZyIpCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuam9pbihAdXJpLnRvX3MsICJodHRwOmciKS50b19zKS50byBlcSgiaHR0cDpnIikKKyAgZW5kCisKKyAgIyBFZGdlIGNhc2UgdG8gYmUgc3VyZQorICBpdCAid2hlbiBqb2luZWQgd2l0aCAnLy9leGFtcGxlLmNvbS8nIHNob3VsZCAiICsKKyAgICAgICJyZXNvbHZlIHRvIGh0dHA6Ly9leGFtcGxlLmNvbS8iIGRvCisgICAgZXhwZWN0KChAdXJpICsgIi8vZXhhbXBsZS5jb20vIikudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmpvaW4oCisgICAgICBAdXJpLnRvX3MsICIvL2V4YW1wbGUuY29tLyIpLnRvX3MpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgIndoZW4gam9pbmVkIHdpdGggYSBib2d1cyBvYmplY3QgYSBUeXBlRXJyb3Igc2hvdWxkIGJlIHJhaXNlZCIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLmpvaW4oQHVyaSwgNDIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGNvbnZlcnRpbmcgdGhlIHBhdGggIiArCisgICAgIidyZWxhdGl2ZS9wYXRoL3RvL3NvbWV0aGluZyciIGRvCisgIGJlZm9yZSBkbworICAgIEBwYXRoID0gJ3JlbGF0aXZlL3BhdGgvdG8vc29tZXRoaW5nJworICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgdG8gIiArCisgICAgICAiXCdyZWxhdGl2ZS9wYXRoL3RvL3NvbWV0aGluZ1wnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS50b19zdHIpLnRvIGVxKCJyZWxhdGl2ZS9wYXRoL3RvL3NvbWV0aGluZyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgam9pbiB3aXRoIGFuIGFic29sdXRlIGZpbGUgcGF0aCBjb3JyZWN0bHkiIGRvCisgICAgQGJhc2UgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aCgiL2Fic29sdXRlL3BhdGgvIikKKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoQHBhdGgpCisgICAgZXhwZWN0KChAYmFzZSArIEB1cmkpLnRvX3N0cikudG8gZXEoCisgICAgICAiZmlsZTovLy9hYnNvbHV0ZS9wYXRoL3JlbGF0aXZlL3BhdGgvdG8vc29tZXRoaW5nIgorICAgICkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gY29udmVydGluZyBhIGJvZ3VzIHBhdGgiIGRvCisgIGl0ICJzaG91bGQgcmFpc2UgYSBUeXBlRXJyb3IiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoNDIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIGEgVU5JWCByb290IGRpcmVjdG9yeSIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHBhdGggPSAiLyIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0IHRvIFwnZmlsZTovLy9cJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoQHBhdGgpCisgICAgZXhwZWN0KEB1cmkudG9fc3RyKS50byBlcSgiZmlsZTovLy8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdmaWxlOi8vJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoQHBhdGgpCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnZmlsZTovLycpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIGEgV2luZG93cyByb290IGRpcmVjdG9yeSIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHBhdGggPSAiQzpcXCIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb252ZXJ0IHRvIFwnZmlsZTovLy9jOi9cJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoQHBhdGgpCisgICAgZXhwZWN0KEB1cmkudG9fc3RyKS50byBlcSgiZmlsZTovLy9jOi8iKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgYW4gb3JpZ2luIG9mICdmaWxlOi8vJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoQHBhdGgpCisgICAgZXhwZWN0KEB1cmkub3JpZ2luKS50byBlcSgnZmlsZTovLycpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIHRoZSBwYXRoICcvb25lL3R3by8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAcGF0aCA9ICcvb25lL3R3by8nCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29udmVydCB0byAiICsKKyAgICAgICJcJ2ZpbGU6Ly8vb25lL3R3by9cJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoQHBhdGgpCisgICAgZXhwZWN0KEB1cmkudG9fc3RyKS50byBlcSgiZmlsZTovLy9vbmUvdHdvLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2ZpbGU6Ly8nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdmaWxlOi8vJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIHBhdGggIiArCisgICAgIidjOlxcd2luZG93c1xcTXkgRG9jdW1lbnRzIDEwMCUyMFxcZm9vLnR4dCciIGRvCisgIGJlZm9yZSBkbworICAgIEBwYXRoID0gImM6XFx3aW5kb3dzXFxNeSBEb2N1bWVudHMgMTAwJTIwXFxmb28udHh0IgorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgdG8gIiArCisgICAgICAiXCdmaWxlOi8vL2M6L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dFwnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS50b19zdHIpLnRvIGVxKCJmaWxlOi8vL2M6L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2ZpbGU6Ly8nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdmaWxlOi8vJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIHBhdGggIiArCisgICAgIidmaWxlOi8vYzpcXHdpbmRvd3NcXE15IERvY3VtZW50cyAxMDAlMjBcXGZvby50eHQnIiBkbworICBiZWZvcmUgZG8KKyAgICBAcGF0aCA9ICJmaWxlOi8vYzpcXHdpbmRvd3NcXE15IERvY3VtZW50cyAxMDAlMjBcXGZvby50eHQiCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29udmVydCB0byAiICsKKyAgICAgICJcJ2ZpbGU6Ly8vYzovd2luZG93cy9NeSUyMERvY3VtZW50cyUyMDEwMCUyMC9mb28udHh0XCciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuY29udmVydF9wYXRoKEBwYXRoKQorICAgIGV4cGVjdChAdXJpLnRvX3N0cikudG8gZXEoImZpbGU6Ly8vYzovd2luZG93cy9NeSUyMERvY3VtZW50cyUyMDEwMCUyMC9mb28udHh0IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIGFuIG9yaWdpbiBvZiAnZmlsZTovLyciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuY29udmVydF9wYXRoKEBwYXRoKQorICAgIGV4cGVjdChAdXJpLm9yaWdpbikudG8gZXEoJ2ZpbGU6Ly8nKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgcGF0aCAiICsKKyAgICAiJ2ZpbGU6YzpcXHdpbmRvd3NcXE15IERvY3VtZW50cyAxMDAlMjBcXGZvby50eHQnIiBkbworICBiZWZvcmUgZG8KKyAgICBAcGF0aCA9ICJmaWxlOmM6XFx3aW5kb3dzXFxNeSBEb2N1bWVudHMgMTAwJTIwXFxmb28udHh0IgorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgdG8gIiArCisgICAgICAiXCdmaWxlOi8vL2M6L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dFwnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS50b19zdHIpLnRvIGVxKCJmaWxlOi8vL2M6L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2ZpbGU6Ly8nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdmaWxlOi8vJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIHBhdGggIiArCisgICAgIidmaWxlOi9jOlxcd2luZG93c1xcTXkgRG9jdW1lbnRzIDEwMCUyMFxcZm9vLnR4dCciIGRvCisgIGJlZm9yZSBkbworICAgIEBwYXRoID0gImZpbGU6L2M6XFx3aW5kb3dzXFxNeSBEb2N1bWVudHMgMTAwJTIwXFxmb28udHh0IgorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgdG8gIiArCisgICAgICAiXCdmaWxlOi8vL2M6L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dFwnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS50b19zdHIpLnRvIGVxKCJmaWxlOi8vL2M6L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2ZpbGU6Ly8nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdmaWxlOi8vJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIHBhdGggIiArCisgICAgIidmaWxlOi8vL2N8L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dCciIGRvCisgIGJlZm9yZSBkbworICAgIEBwYXRoID0gImZpbGU6Ly8vY3wvd2luZG93cy9NeSUyMERvY3VtZW50cyUyMDEwMCUyMC9mb28udHh0IgorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnZlcnQgdG8gIiArCisgICAgICAiXCdmaWxlOi8vL2M6L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dFwnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS50b19zdHIpLnRvIGVxKCJmaWxlOi8vL2M6L3dpbmRvd3MvTXklMjBEb2N1bWVudHMlMjAxMDAlMjAvZm9vLnR4dCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSBhbiBvcmlnaW4gb2YgJ2ZpbGU6Ly8nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmNvbnZlcnRfcGF0aChAcGF0aCkKKyAgICBleHBlY3QoQHVyaS5vcmlnaW4pLnRvIGVxKCdmaWxlOi8vJykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gYW4gaHR0cCBwcm90b2NvbCBVUkkiIGRvCisgIGJlZm9yZSBkbworICAgIEBwYXRoID0gImh0dHA6Ly9leGFtcGxlLmNvbS8iCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGRvIGFueSBjb252ZXJzaW9uIGF0IGFsbCIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5jb252ZXJ0X3BhdGgoQHBhdGgpCisgICAgZXhwZWN0KEB1cmkudG9fc3RyKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2NsYXNzIFN1cGVyU3RyaW5nCisgIGRlZiBpbml0aWFsaXplKHN0cmluZykKKyAgICBAc3RyaW5nID0gc3RyaW5nLnRvX3MKKyAgZW5kCisKKyAgZGVmIHRvX3N0cgorICAgIHJldHVybiBAc3RyaW5nCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHBhcnNpbmcgYSBub24tU3RyaW5nIG9iamVjdCIgZG8KKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgcGFyc2UgYW55dGhpbmcgd2l0aCBhICd0b19zdHInIG1ldGhvZCIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKFN1cGVyU3RyaW5nLm5ldyg0MikpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYSBUeXBlRXJyb3IgZm9yIG9iamVjdHMgdGhhbiBjYW5ub3QgYmUgY29udmVydGVkIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoNDIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IHBhcnNlIGhldXJpc3RpY2FsbHkgYW55dGhpbmcgd2l0aCBhICd0b19zdHInIG1ldGhvZCIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShTdXBlclN0cmluZy5uZXcoNDIpKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yIGZvciBvYmplY3RzIHRoYW4gY2Fubm90IGJlIGNvbnZlcnRlZCIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZSg0MikKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZm9ybSBlbmNvZGluZyBhIGhhc2giIGRvCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmZvcm1fZW5jb2RlKAorICAgICAgW1siJm9uZSIsICIvMSJdLCBbIj10d28iLCAiPzIiXSwgWyI6dGhyZWUiLCAiIzMiXV0KKyAgICApKS50byBlcSgiJTI2b25lPSUyRjEmJTNEdHdvPSUzRjImJTNBdGhyZWU9JTIzMyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmZvcm1fZW5jb2RlKAorICAgICAgeyJxIiA9PiAib25lIHR3byB0aHJlZSJ9CisgICAgKSkudG8gZXEoInE9b25lK3R3byt0aHJlZSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmZvcm1fZW5jb2RlKAorICAgICAgeyJrZXkiID0+IG5pbH0KKyAgICApKS50byBlcSgia2V5PSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmZvcm1fZW5jb2RlKAorICAgICAgeyJxIiA9PiBbIm9uZSIsICJ0d28iLCAidGhyZWUiXX0KKyAgICApKS50byBlcSgicT1vbmUmcT10d28mcT10aHJlZSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3RseSBlbmNvZGVkIG5ld2xpbmVzIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmZvcm1fZW5jb2RlKAorICAgICAgeyJ0ZXh0IiA9PiAib25lXG50d29ccnRocmVlXHJcbmZvdXJcblxyIn0KKyAgICApKS50byBlcSgidGV4dD1vbmUlMEQlMEF0d28lMEQlMEF0aHJlZSUwRCUwQWZvdXIlMEQlMEElMEQlMEEiKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBhIHNvcnRlZCBwZXJjZW50IGVuY29kZWQgc2VxdWVuY2UiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuZm9ybV9lbmNvZGUoCisgICAgICBbWyJhIiwgIjEiXSwgWyJkdXAiLCAiMyJdLCBbImR1cCIsICIyIl1dLCB0cnVlCisgICAgKSkudG8gZXEoImE9MSZkdXA9MiZkdXA9MyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGZvcm0gZW5jb2RpbmcgYSBub24tQXJyYXkgb2JqZWN0IiBkbworICBpdCAic2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yIGZvciBvYmplY3RzIHRoYW4gY2Fubm90IGJlIGNvbnZlcnRlZCIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLmZvcm1fZW5jb2RlKDQyKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKK2VuZAorCisjIFNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjc0OSNhcHBlbmRpeC1CCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBmb3JtIGVuY29kaW5nIHRoZSBleGFtcGxlIHZhbHVlIGZyb20gT0F1dGggMiIgZG8KKyAgaXQgInNob3VsZCByZXN1bHQgaW4gY29ycmVjdCB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuZm9ybV9lbmNvZGUoCisgICAgICB7InZhbHVlIiA9PiAiICUmK8Kj4oKsIn0KKyAgICApKS50byBlcSgidmFsdWU9KyUyNSUyNiUyQiVDMiVBMyVFMiU4MiVBQyIpCisgIGVuZAorZW5kCisKKyMgU2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NzQ5I2FwcGVuZGl4LUIKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGZvcm0gdW5lbmNvZGluZyB0aGUgZXhhbXBsZSB2YWx1ZSBmcm9tIE9BdXRoIDIiIGRvCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgdmFsdWVzIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmZvcm1fdW5lbmNvZGUoCisgICAgICAidmFsdWU9KyUyNSUyNiUyQiVDMiVBMyVFMiU4MiVBQyIKKyAgICApKS50byBlcShbWyJ2YWx1ZSIsICIgJSYrwqPigqwiXV0pCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGZvcm0gdW5lbmNvZGluZyBhIHN0cmluZyIgZG8KKyAgaXQgInNob3VsZCByZXN1bHQgaW4gY29ycmVjdCB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuZm9ybV91bmVuY29kZSgKKyAgICAgICIlMjZvbmU9JTJGMSYlM0R0d289JTNGMiYlM0F0aHJlZT0lMjMzIgorICAgICkpLnRvIGVxKFtbIiZvbmUiLCAiLzEiXSwgWyI9dHdvIiwgIj8yIl0sIFsiOnRocmVlIiwgIiMzIl1dKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHZhbHVlcyIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5mb3JtX3VuZW5jb2RlKAorICAgICAgInE9b25lK3R3byt0aHJlZSIKKyAgICApKS50byBlcShbWyJxIiwgIm9uZSB0d28gdGhyZWUiXV0pCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgdmFsdWVzIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmZvcm1fdW5lbmNvZGUoCisgICAgICAidGV4dD1vbmUlMEQlMEF0d28lMEQlMEF0aHJlZSUwRCUwQWZvdXIlMEQlMEElMEQlMEEiCisgICAgKSkudG8gZXEoW1sidGV4dCIsICJvbmVcbnR3b1xudGhyZWVcbmZvdXJcblxuIl1dKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHZhbHVlcyIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5mb3JtX3VuZW5jb2RlKAorICAgICAgImE9MSZkdXA9MiZkdXA9MyIKKyAgICApKS50byBlcShbWyJhIiwgIjEiXSwgWyJkdXAiLCAiMiJdLCBbImR1cCIsICIzIl1dKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHZhbHVlcyIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5mb3JtX3VuZW5jb2RlKAorICAgICAgImtleSIKKyAgICApKS50byBlcShbWyJrZXkiLCBuaWxdXSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCByZXN1bHQgaW4gY29ycmVjdCB2YWx1ZXMiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuZm9ybV91bmVuY29kZSgiR2l2ZW5OYW1lPVJlbiVDMyVBOSIpKS50byBlcSgKKyAgICAgIFtbIkdpdmVuTmFtZSIsICJSZW7DqSJdXQorICAgICkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZm9ybSB1bmVuY29kaW5nIGEgbm9uLVN0cmluZyBvYmplY3QiIGRvCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IHBhcnNlIGFueXRoaW5nIHdpdGggYSAndG9fc3RyJyBtZXRob2QiIGRvCisgICAgQWRkcmVzc2FibGU6OlVSSS5mb3JtX3VuZW5jb2RlKFN1cGVyU3RyaW5nLm5ldyg0MikpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYSBUeXBlRXJyb3IgZm9yIG9iamVjdHMgdGhhbiBjYW5ub3QgYmUgY29udmVydGVkIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkuZm9ybV91bmVuY29kZSg0MikKKyAgICBlbmQpLnRvIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gbm9ybWFsaXppbmcgYSBub24tU3RyaW5nIG9iamVjdCIgZG8KKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgcGFyc2UgYW55dGhpbmcgd2l0aCBhICd0b19zdHInIG1ldGhvZCIgZG8KKyAgICBBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoU3VwZXJTdHJpbmcubmV3KDQyKSkKKyAgZW5kCisKKyAgaXQgInNob3VsZCByYWlzZSBhIFR5cGVFcnJvciBmb3Igb2JqZWN0cyB0aGFuIGNhbm5vdCBiZSBjb252ZXJ0ZWQiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVfY29tcG9uZW50KDQyKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yIGZvciBvYmplY3RzIHRoYW4gY2Fubm90IGJlIGNvbnZlcnRlZCIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoImNvbXBvbmVudCIsIDQyKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBub3JtYWxpemluZyBhIHBhdGggd2l0aCBhbiBlbmNvZGVkIHNsYXNoIiBkbworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgiL3BhdGglMkZzZWdtZW50LyIpLm5vcm1hbGl6ZS5wYXRoKS50byBlcSgKKyAgICAgICIvcGF0aCUyRnNlZ21lbnQvIgorICAgICkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gbm9ybWFsaXppbmcgYSBwYXJ0aWFsbHkgZW5jb2RlZCBzdHJpbmciIGRvCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoCisgICAgICAicGFydGlhbGx5ICUgZW5jb2RlZCUyMSIKKyAgICApKS50byBlcSgicGFydGlhbGx5JTIwJTI1JTIwZW5jb2RlZCEiKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVfY29tcG9uZW50KAorICAgICAgInBhcnRpYWxseSAlMjUgZW5jb2RlZCEiCisgICAgKSkudG8gZXEoInBhcnRpYWxseSUyMCUyNSUyMGVuY29kZWQhIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gbm9ybWFsaXppbmcgYSB1bmljb2RlIHNlcXVlbmNlIiBkbworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVfY29tcG9uZW50KAorICAgICAgIi9DJUNDJUE3IgorICAgICkpLnRvIGVxKCIvJUMzJTg3IikKKyAgZW5kCisKKyAgaXQgInNob3VsZCByZXN1bHQgaW4gY29ycmVjdCBwZXJjZW50IGVuY29kZWQgc2VxdWVuY2UiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplX2NvbXBvbmVudCgKKyAgICAgICIvJUMzJTg3IgorICAgICkpLnRvIGVxKCIvJUMzJTg3IikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gbm9ybWFsaXppbmcgYSBtdWx0aWJ5dGUgc3RyaW5nIiBkbworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVfY29tcG9uZW50KCJnw7xudGhlciIpKS50byBlcSgKKyAgICAgICJnJUMzJUJDbnRoZXIiCisgICAgKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVfY29tcG9uZW50KCJnJUMzJUJDbnRoZXIiKSkudG8gZXEoCisgICAgICAiZyVDMyVCQ250aGVyIgorICAgICkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gbm9ybWFsaXppbmcgYSBzdHJpbmcgYnV0IGxlYXZpbmcgc29tZSBjaGFyYWN0ZXJzIGVuY29kZWQiIGRvCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLm5vcm1hbGl6ZV9jb21wb25lbnQoIiU1OFglNTlZJTVBWiIsICIwLTlhLXpYWSIsICJZIikpLnRvIGVxKAorICAgICAgIlhYJTU5WSU1QSU1QSIKKyAgICApCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IG1vZGlmeSB0aGUgY2hhcmFjdGVyIGNsYXNzIiBkbworICAgIGNoYXJhY3Rlcl9jbGFzcyA9ICIwLTlhLXpYWSIKKworICAgIGNoYXJhY3Rlcl9jbGFzc19jb3B5ID0gY2hhcmFjdGVyX2NsYXNzLmR1cAorCisgICAgQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVfY29tcG9uZW50KCIlNThYJTU5WSU1QVoiLCBjaGFyYWN0ZXJfY2xhc3MsICJZIikKKworICAgIGV4cGVjdChjaGFyYWN0ZXJfY2xhc3MpLnRvIGVxKGNoYXJhY3Rlcl9jbGFzc19jb3B5KQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBlbmNvZGluZyBhIHN0cmluZyB3aXRoIGV4aXN0aW5nIGVuY29kaW5ncyB0byB1cGNhc2UiIGRvCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmVuY29kZV9jb21wb25lbnQoIkpLJTRjIiwgIjAtOUEtSUtNLVphLXolIiwgIkwiKSkudG8gZXEoIiU0QUslNEMiKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBlbmNvZGluZyBhIG11bHRpYnl0ZSBzdHJpbmciIGRvCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmVuY29kZV9jb21wb25lbnQoImfDvG50aGVyIikpLnRvIGVxKCJnJUMzJUJDbnRoZXIiKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS5lbmNvZGVfY29tcG9uZW50KAorICAgICAgImfDvG50aGVyIiwgL1teYS16QS1aMC05XDpcL1w/XCNcW1xdXEBcIVwkXCZcJ1woXClcKlwrXCxcO1w9XC1cLlxfXH5dLworICAgICkpLnRvIGVxKCJnJUMzJUJDbnRoZXIiKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBmb3JtIGVuY29kaW5nIGEgbXVsdGlieXRlIHN0cmluZyIgZG8KKyAgaXQgInNob3VsZCByZXN1bHQgaW4gY29ycmVjdCBwZXJjZW50IGVuY29kZWQgc2VxdWVuY2UiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuZm9ybV9lbmNvZGUoeyJHaXZlbk5hbWUiID0+ICJSZW7DqSJ9KSkudG8gZXEoCisgICAgICAiR2l2ZW5OYW1lPVJlbiVDMyVBOSIKKyAgICApCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGVuY29kaW5nIGEgc3RyaW5nIHdpdGggQVNDSUkgY2hhcnMgMC0xNSIgZG8KKyAgaXQgInNob3VsZCByZXN1bHQgaW4gY29ycmVjdCBwZXJjZW50IGVuY29kZWQgc2VxdWVuY2UiIGRvCisgICAgZXhwZWN0KEFkZHJlc3NhYmxlOjpVUkkuZW5jb2RlX2NvbXBvbmVudCgib25lXG50d28iKSkudG8gZXEoIm9uZSUwQXR3byIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmVzdWx0IGluIGNvcnJlY3QgcGVyY2VudCBlbmNvZGVkIHNlcXVlbmNlIiBkbworICAgIGV4cGVjdChBZGRyZXNzYWJsZTo6VVJJLmVuY29kZV9jb21wb25lbnQoCisgICAgICAib25lXG50d28iLCAvW15hLXpBLVowLTlcOlwvXD9cI1xbXF1cQFwhXCRcJlwnXChcKVwqXCtcLFw7XD1cLVwuXF9cfl0vCisgICAgKSkudG8gZXEoIm9uZSUwQXR3byIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIHVuZW5jb2RpbmcgYSBtdWx0aWJ5dGUgc3RyaW5nIiBkbworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS51bmVuY29kZV9jb21wb25lbnQoImclQzMlQkNudGhlciIpKS50byBlcSgiZ8O8bnRoZXIiKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvbnNpc3RlbnRseSB1c2UgVVRGLTggaW50ZXJuYWxseSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS51bmVuY29kZV9jb21wb25lbnQoInNraT0lQkElREHJqyIpKS50byBlcSgic2tpPVx4QkFceERByasiKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlc3VsdCBpbiBjb3JyZWN0IHBlcmNlbnQgZW5jb2RlZCBzZXF1ZW5jZSBhcyBhIFVSSSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS51bmVuY29kZSgKKyAgICAgICIvcGF0aD9nJUMzJUJDbnRoZXIiLCA6OkFkZHJlc3NhYmxlOjpVUkkKKyAgICApKS50byBlcShBZGRyZXNzYWJsZTo6VVJJLm5ldygKKyAgICAgIDpwYXRoID0+ICIvcGF0aCIsIDpxdWVyeSA9PiAiZ8O8bnRoZXIiCisgICAgKSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gcGFydGlhbGx5IHVuZW5jb2RpbmcgYSBzdHJpbmciIGRvCisgIGl0ICJzaG91bGQgdW5lbmNvZGUgYWxsIGNoYXJhY3RlcnMgYnkgZGVmYXVsdCIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS51bmVuY29kZSgnJSUyNX4lN2UrJTJiJywgU3RyaW5nKSkudG8gZXEoJyUlfn4rKycpCisgIGVuZAorCisgIGl0ICJzaG91bGQgdW5lbmNvZGUgY2hhcmFjdGVycyBub3QgaW4gbGVhdmVfZW5jb2RlZCIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS51bmVuY29kZSgnJSUyNX4lN2UrJTJiJywgU3RyaW5nLCAnficpKS50byBlcSgnJSV+JTdlKysnKQorICBlbmQKKworICBpdCAic2hvdWxkIGxlYXZlIGNoYXJhY3RlcnMgaW4gbGVhdmVfZW5jb2RlZCBhbG9uZSIgZG8KKyAgICBleHBlY3QoQWRkcmVzc2FibGU6OlVSSS51bmVuY29kZSgnJSUyNX4lN2UrJTJiJywgU3RyaW5nLCAnJX4rJykpLnRvIGVxKCclJTI1fiU3ZSslMmInKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiB1bmVuY29kaW5nIGEgYm9ndXMgb2JqZWN0IiBkbworICBpdCAic2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkudW5lbmNvZGVfY29tcG9uZW50KDQyKQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkudW5lbmNvZGUoIi9wYXRoP2clQzMlQkNudGhlciIsIEludGVnZXIpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGVuY29kaW5nIGEgYm9ndXMgb2JqZWN0IiBkbworICBpdCAic2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkuZW5jb2RlKE9iamVjdC5uZXcpCisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYSBUeXBlRXJyb3IiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQWRkcmVzc2FibGU6OlVSSS5ub3JtYWxpemVkX2VuY29kZShPYmplY3QubmV3KQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkuZW5jb2RlX2NvbXBvbmVudCgiZ8O8bnRoZXIiLCBPYmplY3QubmV3KQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkuZW5jb2RlX2NvbXBvbmVudChPYmplY3QubmV3KQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQGlucHV0ID0gImh0dHA6Ly9leGFtcGxlLmNvbS8iCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGV1cmlzdGljYWxseSBwYXJzZSB0byAnaHR0cDovL2V4YW1wbGUuY29tLyciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuaGV1cmlzdGljX3BhcnNlKEBpbnB1dCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IHJhaXNlIGVycm9yIHdoZW4gZnJvemVuIiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkuaGV1cmlzdGljX3BhcnNlKEBpbnB1dCkuZnJlZXplLnRvX3MKKyAgICBlbmQpLm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidodHRwczovL2V4YW1wbGUuY29tLyciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICJodHRwczovL2V4YW1wbGUuY29tLyIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwczovL2V4YW1wbGUuY29tLyciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuaGV1cmlzdGljX3BhcnNlKEBpbnB1dCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cHM6Ly9leGFtcGxlLmNvbS8iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidodHRwOmV4YW1wbGUuY29tLyciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICJodHRwOmV4YW1wbGUuY29tLyIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vZXhhbXBsZS5jb20vJyAiICsKKyAgICAgICJldmVuIHdpdGggYSBzY2hlbWUgaGludCBvZiAnZnRwJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0LCB7OnNjaGVtZSA9PiAnZnRwJ30pCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidodHRwczpleGFtcGxlLmNvbS8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAaW5wdXQgPSAiaHR0cHM6ZXhhbXBsZS5jb20vIgorICBlbmQKKworICBpdCAic2hvdWxkIGhldXJpc3RpY2FsbHkgcGFyc2UgdG8gJ2h0dHBzOi8vZXhhbXBsZS5jb20vJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwczovL2V4YW1wbGUuY29tLyIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGV1cmlzdGljYWxseSBwYXJzZSB0byAnaHR0cHM6Ly9leGFtcGxlLmNvbS8nICIgKworICAgICAgImV2ZW4gd2l0aCBhIHNjaGVtZSBoaW50IG9mICdmdHAnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQsIHs6c2NoZW1lID0+ICdmdHAnfSkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cHM6Ly9leGFtcGxlLmNvbS8iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidodHRwOi8vZXhhbXBsZS5jb20vZXhhbXBsZS5jb20vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQGlucHV0ID0gImh0dHA6Ly9leGFtcGxlLmNvbS9leGFtcGxlLmNvbS8iCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGV1cmlzdGljYWxseSBwYXJzZSB0byAnaHR0cDovL2V4YW1wbGUuY29tL2V4YW1wbGUuY29tLyciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuaGV1cmlzdGljX3BhcnNlKEBpbnB1dCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tL2V4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIHRoZSBpbnB1dCAiICsKKyAgICAiJ2h0dHA6Ly9wcmVmaXhcXC5leGFtcGxlLmNvbS8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAaW5wdXQgPSAiaHR0cDovL3ByZWZpeFxcLmV4YW1wbGUuY29tLyIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vcHJlZml4Ly5leGFtcGxlLmNvbS8nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQpCisgICAgZXhwZWN0KEB1cmkuYXV0aG9yaXR5KS50byBlcSgicHJlZml4IikKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL3ByZWZpeC8uZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vcHJlZml4Ly5leGFtcGxlLmNvbS8nICIgKworICAgICAgImV2ZW4gd2l0aCBhIHNjaGVtZSBoaW50IG9mICdmdHAnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQsIHs6c2NoZW1lID0+ICdmdHAnfSkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL3ByZWZpeC8uZXhhbXBsZS5jb20vIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIGlucHV0ICIgKworICAgICInaHR0cDovL3A6XFwvJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQGlucHV0ID0gImh0dHA6Ly9wOlxcLyIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vcC8vJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoInAiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vcC8vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vcC8vJyAiICsKKyAgICAgICJldmVuIHdpdGggYSBzY2hlbWUgaGludCBvZiAnZnRwJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0LCB7OnNjaGVtZSA9PiAnZnRwJ30pCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9wLy8iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidodHRwOi8vcDovLyciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICJodHRwOi8vcDovLyIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vcC8vJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoInAiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vcC8vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vcC8vJyAiICsKKyAgICAgICJldmVuIHdpdGggYSBzY2hlbWUgaGludCBvZiAnZnRwJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0LCB7OnNjaGVtZSA9PiAnZnRwJ30pCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9wLy8iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidodHRwOi8vcDovL3AnIiBkbworICBiZWZvcmUgZG8KKyAgICBAaW5wdXQgPSAiaHR0cDovL3A6Ly9wIgorICBlbmQKKworICBpdCAic2hvdWxkIGhldXJpc3RpY2FsbHkgcGFyc2UgdG8gJ2h0dHA6Ly9wLy9wJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoInAiKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vcC8vcCIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGV1cmlzdGljYWxseSBwYXJzZSB0byAnaHR0cDovL3AvL3AnICIgKworICAgICAgImV2ZW4gd2l0aCBhIHNjaGVtZSBoaW50IG9mICdmdHAnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQsIHs6c2NoZW1lID0+ICdmdHAnfSkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL3AvL3AiKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidodHRwOi8vcHJlZml4IC5leGFtcGxlLmNvbS8nIiBkbworICBiZWZvcmUgZG8KKyAgICBAaW5wdXQgPSAiaHR0cDovL3ByZWZpeCAuZXhhbXBsZS5jb20vIgorICBlbmQKKworICAjIEp1c3RpZmljYXRpb24gaGVyZSBiZWluZyB0aGF0IG5vIGJyb3dzZXIgYWN0dWFsbHkgdHJpZXMgdG8gcmVzb2x2ZSB0aGlzLgorICAjIFRoZXkgYWxsIHRyZWF0IHRoaXMgYXMgYSB3ZWIgc2VhcmNoLgorICBpdCAic2hvdWxkIGhldXJpc3RpY2FsbHkgcGFyc2UgdG8gJ2h0dHA6Ly9wcmVmaXglMjAuZXhhbXBsZS5jb20vJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoInByZWZpeCUyMC5leGFtcGxlLmNvbSIpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9wcmVmaXglMjAuZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vcHJlZml4JTIwLmV4YW1wbGUuY29tLycgIiArCisgICAgICAiZXZlbiB3aXRoIGEgc2NoZW1lIGhpbnQgb2YgJ2Z0cCciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuaGV1cmlzdGljX3BhcnNlKEBpbnB1dCwgezpzY2hlbWUgPT4gJ2Z0cCd9KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vcHJlZml4JTIwLmV4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIHRoZSBpbnB1dCAiICsKKyAgICAiJyAgaHR0cDovL3d3dy5leGFtcGxlLmNvbS8gICciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICIgIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vICAiCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGV1cmlzdGljYWxseSBwYXJzZSB0byAnaHR0cDovL3ByZWZpeCUyMC5leGFtcGxlLmNvbS8nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQpCisgICAgZXhwZWN0KEB1cmkuc2NoZW1lKS50byBlcSgiaHR0cCIpCisgICAgZXhwZWN0KEB1cmkucGF0aCkudG8gZXEoIi8iKQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIHRoZSBpbnB1dCAiICsKKyAgICAiJ2h0dHA6Ly9wcmVmaXglMkYuZXhhbXBsZS5jb20vJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQGlucHV0ID0gImh0dHA6Ly9wcmVmaXglMkYuZXhhbXBsZS5jb20vIgorICBlbmQKKworICBpdCAic2hvdWxkIGhldXJpc3RpY2FsbHkgcGFyc2UgdG8gJ2h0dHA6Ly9wcmVmaXglMkYuZXhhbXBsZS5jb20vJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLmF1dGhvcml0eSkudG8gZXEoInByZWZpeCUyRi5leGFtcGxlLmNvbSIpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9wcmVmaXglMkYuZXhhbXBsZS5jb20vIikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vcHJlZml4JTJGLmV4YW1wbGUuY29tLycgIiArCisgICAgICAiZXZlbiB3aXRoIGEgc2NoZW1lIGhpbnQgb2YgJ2Z0cCciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuaGV1cmlzdGljX3BhcnNlKEBpbnB1dCwgezpzY2hlbWUgPT4gJ2Z0cCd9KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vcHJlZml4JTJGLmV4YW1wbGUuY29tLyIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIHRoZSBpbnB1dCAiICsKKyAgICAiJy9wYXRoL3RvL3Jlc291cmNlJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQGlucHV0ID0gIi9wYXRoL3RvL3Jlc291cmNlIgorICBlbmQKKworICBpdCAic2hvdWxkIGhldXJpc3RpY2FsbHkgcGFyc2UgdG8gJy9wYXRoL3RvL3Jlc291cmNlJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCIvcGF0aC90by9yZXNvdXJjZSIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIHRoZSBpbnB1dCAiICsKKyAgICAiJ3JlbGF0aXZlL3BhdGgvdG8vcmVzb3VyY2UnIiBkbworICBiZWZvcmUgZG8KKyAgICBAaW5wdXQgPSAicmVsYXRpdmUvcGF0aC90by9yZXNvdXJjZSIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdyZWxhdGl2ZS9wYXRoL3RvL3Jlc291cmNlJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJyZWxhdGl2ZS9wYXRoL3RvL3Jlc291cmNlIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIGlucHV0ICIgKworICAgICInZXhhbXBsZS5jb20nIiBkbworICBiZWZvcmUgZG8KKyAgICBAaW5wdXQgPSAiZXhhbXBsZS5jb20iCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGV1cmlzdGljYWxseSBwYXJzZSB0byAnaHR0cDovL2V4YW1wbGUuY29tJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJodHRwOi8vZXhhbXBsZS5jb20iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidleGFtcGxlLmNvbScgYW5kIGEgc2NoZW1lIGhpbnQgb2YgJ2Z0cCciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICJleGFtcGxlLmNvbSIKKyAgICBAaGludHMgPSB7OnNjaGVtZSA9PiAnZnRwJ30KKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vZXhhbXBsZS5jb20nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQsIEBoaW50cykKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiZnRwOi8vZXhhbXBsZS5jb20iKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidleGFtcGxlLmNvbToyMScgYW5kIGEgc2NoZW1lIGhpbnQgb2YgJ2Z0cCciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICJleGFtcGxlLmNvbToyMSIKKyAgICBAaGludHMgPSB7OnNjaGVtZSA9PiAnZnRwJ30KKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vZXhhbXBsZS5jb206MjEnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQsIEBoaW50cykKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiZnRwOi8vZXhhbXBsZS5jb206MjEiKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBBZGRyZXNzYWJsZTo6VVJJLCAid2hlbiBnaXZlbiB0aGUgaW5wdXQgIiArCisgICAgIidleGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQGlucHV0ID0gImV4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2UiCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGV1cmlzdGljYWxseSBwYXJzZSB0byAnaHR0cDovL2V4YW1wbGUuY29tL3BhdGgvdG8vcmVzb3VyY2UnIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvL3Jlc291cmNlIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIGlucHV0ICIgKworICAgICInaHR0cDovLy9leGFtcGxlLmNvbSciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICJodHRwOi8vL2V4YW1wbGUuY29tIgorICBlbmQKKworICBpdCAic2hvdWxkIGhldXJpc3RpY2FsbHkgcGFyc2UgdG8gJ2h0dHA6Ly9leGFtcGxlLmNvbSciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuaGV1cmlzdGljX3BhcnNlKEBpbnB1dCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIGlucHV0ICIgKworICAgICInZmVlZDovLy9leGFtcGxlLmNvbSciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICJmZWVkOi8vL2V4YW1wbGUuY29tIgorICBlbmQKKworICBpdCAic2hvdWxkIGhldXJpc3RpY2FsbHkgcGFyc2UgdG8gJ2ZlZWQ6Ly9leGFtcGxlLmNvbSciIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkuaGV1cmlzdGljX3BhcnNlKEBpbnB1dCkKKyAgICBleHBlY3QoQHVyaS50b19zKS50byBlcSgiZmVlZDovL2V4YW1wbGUuY29tIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIGlucHV0ICIgKworICAgICInZmlsZTovL3BhdGgvdG8vcmVzb3VyY2UvJyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQGlucHV0ID0gImZpbGU6Ly9wYXRoL3RvL3Jlc291cmNlLyIKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdmaWxlOi8vL3BhdGgvdG8vcmVzb3VyY2UvJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJmaWxlOi8vL3BhdGgvdG8vcmVzb3VyY2UvIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgQWRkcmVzc2FibGU6OlVSSSwgIndoZW4gZ2l2ZW4gdGhlIGlucHV0ICIgKworICAgICInZmVlZDovL2h0dHA6Ly9leGFtcGxlLmNvbSciIGRvCisgIGJlZm9yZSBkbworICAgIEBpbnB1dCA9ICJmZWVkOi8vaHR0cDovL2V4YW1wbGUuY29tIgorICBlbmQKKworICBpdCAic2hvdWxkIGhldXJpc3RpY2FsbHkgcGFyc2UgdG8gJ2ZlZWQ6aHR0cDovL2V4YW1wbGUuY29tJyIgZG8KKyAgICBAdXJpID0gQWRkcmVzc2FibGU6OlVSSS5oZXVyaXN0aWNfcGFyc2UoQGlucHV0KQorICAgIGV4cGVjdChAdXJpLnRvX3MpLnRvIGVxKCJmZWVkOmh0dHA6Ly9leGFtcGxlLmNvbSIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGdpdmVuIHRoZSBpbnB1dCAiICsKKyAgICAiOjpVUkkucGFyc2UoJ2h0dHA6Ly9leGFtcGxlLmNvbScpIiBkbworICBiZWZvcmUgZG8KKyAgICBAaW5wdXQgPSA6OlVSSS5wYXJzZSgnaHR0cDovL2V4YW1wbGUuY29tJykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoZXVyaXN0aWNhbGx5IHBhcnNlIHRvICdodHRwOi8vZXhhbXBsZS5jb20nIiBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLmhldXJpc3RpY19wYXJzZShAaW5wdXQpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEoImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGFzc2lnbmluZyBxdWVyeSB2YWx1ZXMiIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBBZGRyZXNzYWJsZTo6VVJJLm5ldworICBlbmQKKworICBpdCAic2hvdWxkIGNvcnJlY3RseSBhc3NpZ24gezphID0+ICdhJywgOmIgPT4gWydjJywgJ2QnLCAnZSddfSIgZG8KKyAgICBAdXJpLnF1ZXJ5X3ZhbHVlcyA9IHs6YSA9PiAiYSIsIDpiID0+IFsiYyIsICJkIiwgImUiXX0KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEoImE9YSZiPWMmYj1kJmI9ZSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgYXR0ZW1wdGluZyB0byBhc3NpZ24geydhJyA9PiB7J2InID0+IFsnYyddfX0iIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5xdWVyeV92YWx1ZXMgPSB7ICdhJyA9PiB7J2InID0+IFsnYyddIH0gfQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGF0dGVtcHRpbmcgdG8gYXNzaWduICIgKworICAgICAgIns6YiA9PiAnMicsIDphID0+IHs6YyA9PiAnMSd9fSIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnF1ZXJ5X3ZhbHVlcyA9IHs6YiA9PiAnMicsIDphID0+IHs6YyA9PiAnMSd9fQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGF0dGVtcHRpbmcgdG8gYXNzaWduICIgKworICAgICAgIns6YSA9PiAnYScsIDpiID0+IFt7OmMgPT4gJ2MnLCA6ZCA9PiAnZCd9LCAiICsKKyAgICAgICJ7OmUgPT4gJ2UnLCA6ZiA9PiAnZid9XX0iIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5xdWVyeV92YWx1ZXMgPSB7CisgICAgICAgIDphID0+ICJhIiwgOmIgPT4gW3s6YyA9PiAiYyIsIDpkID0+ICJkIn0sIHs6ZSA9PiAiZSIsIDpmID0+ICJmIn1dCisgICAgICB9CisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgYXR0ZW1wdGluZyB0byBhc3NpZ24gIiArCisgICAgICAiezphID0+ICdhJywgOmIgPT4gW3s6YyA9PiB0cnVlLCA6ZCA9PiAnZCd9LCAiICsKKyAgICAgICJ7OmUgPT4gJ2UnLCA6ZiA9PiAnZid9XX0iIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5xdWVyeV92YWx1ZXMgPSB7CisgICAgICAgIDphID0+ICdhJywgOmIgPT4gW3s6YyA9PiB0cnVlLCA6ZCA9PiAnZCd9LCB7OmUgPT4gJ2UnLCA6ZiA9PiAnZid9XQorICAgICAgfQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGF0dGVtcHRpbmcgdG8gYXNzaWduICIgKworICAgICAgIns6YSA9PiAnYScsIDpiID0+IHs6YyA9PiB0cnVlLCA6ZCA9PiAnZCd9fSIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnF1ZXJ5X3ZhbHVlcyA9IHsKKyAgICAgICAgOmEgPT4gJ2EnLCA6YiA9PiB7OmMgPT4gdHJ1ZSwgOmQgPT4gJ2QnfQorICAgICAgfQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGF0dGVtcHRpbmcgdG8gYXNzaWduICIgKworICAgICAgIns6YSA9PiAnYScsIDpiID0+IHs6YyA9PiB0cnVlLCA6ZCA9PiAnZCd9fSIgZG8KKyAgICBleHBlY3QobGFtYmRhIGRvCisgICAgICBAdXJpLnF1ZXJ5X3ZhbHVlcyA9IHsKKyAgICAgICAgOmEgPT4gJ2EnLCA6YiA9PiB7OmMgPT4gdHJ1ZSwgOmQgPT4gJ2QnfQorICAgICAgfQorICAgIGVuZCkudG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvcnJlY3RseSBhc3NpZ24gezphID0+IDEsIDpiID0+IDEuNX0iIGRvCisgICAgQHVyaS5xdWVyeV92YWx1ZXMgPSB7IDphID0+IDEsIDpiID0+IDEuNSB9CisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKCJhPTEmYj0xLjUiKQorICBlbmQKKworICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIGF0dGVtcHRpbmcgdG8gYXNzaWduICIgKworICAgICAgIns6eiA9PiAxLCA6ZiA9PiBbMiwgezk5OS4xID0+IFszLCc0J119LCBbJ2gnLCAnaSddXSwgIiArCisgICAgICAiOmEgPT4gezpiID0+IFsnYycsICdkJ10sIDplID0+IHRydWUsIDp5ID0+IDAuNX19IiBkbworICAgIGV4cGVjdChsYW1iZGEgZG8KKyAgICAgIEB1cmkucXVlcnlfdmFsdWVzID0geworICAgICAgICA6eiA9PiAxLAorICAgICAgICA6ZiA9PiBbIDIsIHs5OTkuMSA9PiBbMywnNCddfSwgWydoJywgJ2knXSBdLAorICAgICAgICA6YSA9PiB7IDpiID0+IFsnYycsICdkJ10sIDplID0+IHRydWUsIDp5ID0+IDAuNSB9CisgICAgICB9CisgICAgZW5kKS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IGFzc2lnbiB7fSIgZG8KKyAgICBAdXJpLnF1ZXJ5X3ZhbHVlcyA9IHt9CisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKCcnKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvcnJlY3RseSBhc3NpZ24gbmlsIiBkbworICAgIEB1cmkucXVlcnlfdmFsdWVzID0gbmlsCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKG5pbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgc29ydCB7J2FiJyA9PiAnYycsIDphYiA9PiAnYScsIDphID0+ICd4J30iIGRvCisgICAgQHVyaS5xdWVyeV92YWx1ZXMgPSB7J2FiJyA9PiAnYycsIDphYiA9PiAnYScsIDphID0+ICd4J30KKyAgICBleHBlY3QoQHVyaS5xdWVyeSkudG8gZXEoImE9eCZhYj1hJmFiPWMiKQorICBlbmQKKworICBpdCAic2hvdWxkIGNvcnJlY3RseSBhc3NpZ24gIiArCisgICAgICAiW1snYicsICdjJ10sIFsnYicsICdhJ10sIFsnYScsICdhJ11dIiBkbworICAgICMgT3JkZXIgY2FuIGJlIGd1YXJhbnRlZWQgaW4gdGhpcyBmb3JtYXQsIHNvIHByZXNlcnZlIGl0LgorICAgIEB1cmkucXVlcnlfdmFsdWVzID0gW1snYicsICdjJ10sIFsnYicsICdhJ10sIFsnYScsICdhJ11dCisgICAgZXhwZWN0KEB1cmkucXVlcnkpLnRvIGVxKCJiPWMmYj1hJmE9YSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcHJlc2VydmUgcXVlcnkgc3RyaW5nIG9yZGVyIiBkbworICAgIHF1ZXJ5X3N0cmluZyA9ICgoJ2EnLi4neicpLnRvX2EucmV2ZXJzZS5tYXAgeyB8ZXwgIiN7ZX09I3tlfSIgfSkuam9pbigiJiIpCisgICAgQHVyaS5xdWVyeSA9IHF1ZXJ5X3N0cmluZworICAgIG9yaWdpbmFsX3VyaSA9IEB1cmkudG9fcworICAgIEB1cmkucXVlcnlfdmFsdWVzID0gQHVyaS5xdWVyeV92YWx1ZXMoQXJyYXkpCisgICAgZXhwZWN0KEB1cmkudG9fcykudG8gZXEob3JpZ2luYWxfdXJpKQorICBlbmQKKworICBkZXNjcmliZSAnd2hlbiBhIGhhc2ggd2l0aCBtaXhlZCB0eXBlcyBpcyBhc3NpZ25lZCB0byBxdWVyeV92YWx1ZXMnIGRvCisgICAgaXQgJ3Nob3VsZCBub3QgcmFpc2UgYW4gZXJyb3InIGRvCisgICAgICBza2lwICdJc3N1ZSAjOTQnCisgICAgICBleHBlY3QgeyBzdWJqZWN0LnF1ZXJ5X3ZhbHVlcyA9IHsgInBhZ2UiID0+ICIxIiwgOnBhZ2UgPT4gMiB9IH0udG9fbm90IHJhaXNlX2Vycm9yCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGFzc2lnbmluZyBwYXRoIHZhbHVlcyIgZG8KKyAgYmVmb3JlIGRvCisgICAgQHVyaSA9IEFkZHJlc3NhYmxlOjpVUkkubmV3CisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IGFzc2lnbiBwYXRocyBjb250YWluaW5nIGNvbG9ucyIgZG8KKyAgICBAdXJpLnBhdGggPSAiYWNjdDpib2JAc3Bvcmttb25nZXIuY29tIgorICAgIGV4cGVjdChAdXJpLnBhdGgpLnRvIGVxKCJhY2N0OmJvYkBzcG9ya21vbmdlci5jb20iKQorICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS50b19zdHIpLnRvIGVxKCJhY2N0JTJGYm9iQHNwb3JrbW9uZ2VyLmNvbSIpCisgICAgZXhwZWN0KGxhbWJkYSB7IEB1cmkudG9fcyB9KS50byByYWlzZV9lcnJvcigKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkk6OkludmFsaWRVUklFcnJvcgorICAgICkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjb3JyZWN0bHkgYXNzaWduIHBhdGhzIGNvbnRhaW5pbmcgY29sb25zIiBkbworICAgIEB1cmkucGF0aCA9ICIvYWNjdDpib2JAc3Bvcmttb25nZXIuY29tIgorICAgIEB1cmkuYXV0aG9yaXR5ID0gImV4YW1wbGUuY29tIgorICAgIGV4cGVjdChAdXJpLm5vcm1hbGl6ZS50b19zdHIpLnRvIGVxKCIvL2V4YW1wbGUuY29tL2FjY3Q6Ym9iQHNwb3JrbW9uZ2VyLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgY29ycmVjdGx5IGFzc2lnbiBwYXRocyBjb250YWluaW5nIGNvbG9ucyIgZG8KKyAgICBAdXJpLnBhdGggPSAiYWNjdDpib2JAc3Bvcmttb25nZXIuY29tIgorICAgIEB1cmkuc2NoZW1lID0gInNvbWV0aGluZyIKKyAgICBleHBlY3QoQHVyaS5ub3JtYWxpemUudG9fc3RyKS50byBlcSgic29tZXRoaW5nOmFjY3Q6Ym9iQHNwb3JrbW9uZ2VyLmNvbSIpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGFsbG93IHJlbGF0aXZlIHBhdGhzIHRvIGJlIGFzc2lnbmVkIG9uIGFic29sdXRlIFVSSXMiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5zY2hlbWUgPSAiaHR0cCIKKyAgICAgIEB1cmkuaG9zdCA9ICJleGFtcGxlLmNvbSIKKyAgICAgIEB1cmkucGF0aCA9ICJhY2N0OmJvYkBzcG9ya21vbmdlci5jb20iCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGFsbG93IHJlbGF0aXZlIHBhdGhzIHRvIGJlIGFzc2lnbmVkIG9uIGFic29sdXRlIFVSSXMiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5wYXRoID0gImFjY3Q6Ym9iQHNwb3JrbW9uZ2VyLmNvbSIKKyAgICAgIEB1cmkuc2NoZW1lID0gImh0dHAiCisgICAgICBAdXJpLmhvc3QgPSAiZXhhbXBsZS5jb20iCisgICAgZW5kKS50byByYWlzZV9lcnJvcihBZGRyZXNzYWJsZTo6VVJJOjpJbnZhbGlkVVJJRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgbm90IGFsbG93IHJlbGF0aXZlIHBhdGhzIHRvIGJlIGFzc2lnbmVkIG9uIGFic29sdXRlIFVSSXMiIGRvCisgICAgZXhwZWN0KGxhbWJkYSBkbworICAgICAgQHVyaS5wYXRoID0gInV1aWQ6MGIzZWNmNjAtM2Y5My0xMWRmLWE5YzMtMDAxZjViZmZmZTEyIgorICAgICAgQHVyaS5zY2hlbWUgPSAidXJuIgorICAgIGVuZCkubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEFkZHJlc3NhYmxlOjpVUkksICJ3aGVuIGluaXRpYWxpemluZyBhIHN1YmNsYXNzIG9mIEFkZHJlc3NhYmxlOjpVUkkiIGRvCisgIGJlZm9yZSBkbworICAgIEB1cmkgPSBDbGFzcy5uZXcoQWRkcmVzc2FibGU6OlVSSSkubmV3CisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgc2FtZSBjbGFzcyBhZnRlciBiZWluZyBwYXJzZWQiIGRvCisgICAgZXhwZWN0KEB1cmkuY2xhc3MpLnRvIGVxKEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoQHVyaSkuY2xhc3MpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgc2FtZSBjbGFzcyBhcyBpdHMgZHVwbGljYXRlIiBkbworICAgIGV4cGVjdChAdXJpLmNsYXNzKS50byBlcShAdXJpLmR1cC5jbGFzcykKKyAgZW5kCisKKyAgaXQgInNob3VsZCBoYXZlIHRoZSBzYW1lIGNsYXNzIGFmdGVyIGJlaW5nIG5vcm1hbGl6ZWQiIGRvCisgICAgZXhwZWN0KEB1cmkuY2xhc3MpLnRvIGVxKEB1cmkubm9ybWFsaXplLmNsYXNzKQorICBlbmQKKworICBpdCAic2hvdWxkIGhhdmUgdGhlIHNhbWUgY2xhc3MgYWZ0ZXIgYmVpbmcgbWVyZ2VkIiBkbworICAgIGV4cGVjdChAdXJpLmNsYXNzKS50byBlcShAdXJpLm1lcmdlKDpwYXRoID0+ICdwYXRoJykuY2xhc3MpCisgIGVuZAorCisgIGl0ICJzaG91bGQgaGF2ZSB0aGUgc2FtZSBjbGFzcyBhZnRlciBiZWluZyBqb2luZWQiIGRvCisgICAgZXhwZWN0KEB1cmkuY2xhc3MpLnRvIGVxKEB1cmkuam9pbigncGF0aCcpLmNsYXNzKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvc3BlYy9zcGVjX2hlbHBlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3NwZWMvc3BlY19oZWxwZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1MzgyOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3NwZWMvc3BlY19oZWxwZXIucmIKQEAgLTAsMCArMSwyMSBAQAorcmVxdWlyZSAnYnVuZGxlci9zZXR1cCcKK3JlcXVpcmUgJ3JzcGVjL2l0cycKKworYmVnaW4KKyAgcmVxdWlyZSAnY292ZXJhbGxzJworICBDb3ZlcmFsbHMud2VhciEgZG8KKyAgICBhZGRfZmlsdGVyICJzcGVjLyIKKyAgICBhZGRfZmlsdGVyICJ2ZW5kb3IvIgorICBlbmQKK3Jlc2N1ZSBMb2FkRXJyb3IKKyAgd2FybiAid2FybmluZzogY292ZXJhbGxzIGdlbSBub3QgZm91bmQ7IHNraXBwaW5nIENvdmVyYWxscyIKKyAgcmVxdWlyZSAnc2ltcGxlY292JworICBTaW1wbGVDb3Yuc3RhcnQgZG8KKyAgICBhZGRfZmlsdGVyICJzcGVjLyIKKyAgICBhZGRfZmlsdGVyICJ2ZW5kb3IvIgorICBlbmQKK2VuZAorCitSU3BlYy5jb25maWd1cmUgZG8gfGNvbmZpZ3wKKyAgY29uZmlnLndhcm5pbmdzID0gdHJ1ZQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi90YXNrcy9jbG9iYmVyLnJha2UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi90YXNrcy9jbG9iYmVyLnJha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzY2U4MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3Rhc2tzL2Nsb2JiZXIucmFrZQpAQCAtMCwwICsxLDIgQEAKK2Rlc2MgIlJlbW92ZSBhbGwgYnVpbGQgcHJvZHVjdHMiCit0YXNrICJjbG9iYmVyIgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvdGFza3MvZ2VtLnJha2UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi90YXNrcy9nZW0ucmFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDA1MmMwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvdGFza3MvZ2VtLnJha2UKQEAgLTAsMCArMSw5MSBAQAorcmVxdWlyZSAicnVieWdlbXMvcGFja2FnZV90YXNrIgorCituYW1lc3BhY2UgOmdlbSBkbworICBHRU1fU1BFQyA9IEdlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgICAgcy5uYW1lID0gUEtHX05BTUUKKyAgICBzLnZlcnNpb24gPSBQS0dfVkVSU0lPTgorICAgIHMuc3VtbWFyeSA9IFBLR19TVU1NQVJZCisgICAgcy5kZXNjcmlwdGlvbiA9IFBLR19ERVNDUklQVElPTgorCisgICAgcy5maWxlcyA9IFBLR19GSUxFUy50b19hCisKKyAgICBzLmhhc19yZG9jID0gdHJ1ZQorICAgIHMuZXh0cmFfcmRvY19maWxlcyA9ICV3KCBSRUFETUUubWQgKQorICAgIHMucmRvY19vcHRpb25zLmNvbmNhdCBbIi0tbWFpbiIsICAiUkVBRE1FLm1kIl0KKworICAgIGlmICFzLnJlc3BvbmRfdG8/KDphZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSkKKyAgICAgIHB1dHMgIkNhbm5vdCBidWlsZCBHZW0gd2l0aCB0aGlzIHZlcnNpb24gb2YgUnVieUdlbXMuIgorICAgICAgZXhpdCgxKQorICAgIGVuZAorCisgICAgcy5yZXF1aXJlZF9ydWJ5X3ZlcnNpb24gPSAnPj0gMi4wJworCisgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5ICdwdWJsaWNfc3VmZml4JywgJz49IDIuMC4yJywgJzwgNC4wJworICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ2J1bmRsZXInLCAnfj4gMS4wJworCisgICAgcy5yZXF1aXJlX3BhdGggPSAibGliIgorCisgICAgcy5hdXRob3IgPSAiQm9iIEFtYW4iCisgICAgcy5lbWFpbCA9ICJib2JAc3Bvcmttb25nZXIuY29tIgorICAgIHMuaG9tZXBhZ2UgPSAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb3JrbW9uZ2VyL2FkZHJlc3NhYmxlIgorICAgIHMubGljZW5zZSA9ICJBcGFjaGUtMi4wIgorICBlbmQKKworICBHZW06OlBhY2thZ2VUYXNrLm5ldyhHRU1fU1BFQykgZG8gfHB8CisgICAgcC5nZW1fc3BlYyA9IEdFTV9TUEVDCisgICAgcC5uZWVkX3RhciA9IHRydWUKKyAgICBwLm5lZWRfemlwID0gdHJ1ZQorICBlbmQKKworICBkZXNjICJHZW5lcmF0ZXMgLmdlbXNwZWMgZmlsZSIKKyAgdGFzayA6Z2Vtc3BlYyBkbworICAgIHNwZWNfc3RyaW5nID0gR0VNX1NQRUMudG9fcnVieQorICAgIEZpbGUub3BlbigiI3tHRU1fU1BFQy5uYW1lfS5nZW1zcGVjIiwgJ3cnKSBkbyB8ZmlsZXwKKyAgICAgIGZpbGUud3JpdGUgc3BlY19zdHJpbmcKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzYyAiU2hvdyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2VtIgorICB0YXNrIDpkZWJ1ZyBkbworICAgIHB1dHMgR0VNX1NQRUMudG9fcnVieQorICBlbmQKKworICBkZXNjICJJbnN0YWxsIHRoZSBnZW0iCisgIHRhc2sgOmluc3RhbGwgPT4gWyJjbG9iYmVyIiwgImdlbTpwYWNrYWdlIl0gZG8KKyAgICBzaCAiI3tTVURPfSBnZW0gaW5zdGFsbCAtLWxvY2FsIHBrZy8je0dFTV9TUEVDLmZ1bGxfbmFtZX0iCisgIGVuZAorCisgIGRlc2MgIlVuaW5zdGFsbCB0aGUgZ2VtIgorICB0YXNrIDp1bmluc3RhbGwgZG8KKyAgICBpbnN0YWxsZWRfbGlzdCA9IEdlbS5zb3VyY2VfaW5kZXguZmluZF9uYW1lKFBLR19OQU1FKQorICAgIGlmIGluc3RhbGxlZF9saXN0ICYmCisgICAgICAgIChpbnN0YWxsZWRfbGlzdC5jb2xsZWN0IHsgfHN8IHMudmVyc2lvbi50b19zfS5pbmNsdWRlPyhQS0dfVkVSU0lPTikpCisgICAgICBzaCgKKyAgICAgICAgIiN7U1VET30gZ2VtIHVuaW5zdGFsbCAtLXZlcnNpb24gJyN7UEtHX1ZFUlNJT059JyAiICsKKyAgICAgICAgIi0taWdub3JlLWRlcGVuZGVuY2llcyAtLWV4ZWN1dGFibGVzICN7UEtHX05BTUV9IgorICAgICAgKQorICAgIGVuZAorICBlbmQKKworICBkZXNjICJSZWluc3RhbGwgdGhlIGdlbSIKKyAgdGFzayA6cmVpbnN0YWxsID0+IFs6dW5pbnN0YWxsLCA6aW5zdGFsbF0KKworICBkZXNjICdQYWNrYWdlIGZvciByZWxlYXNlJworICB0YXNrIDpyZWxlYXNlID0+IFsiZ2VtOnBhY2thZ2UiLCAiZ2VtOmdlbXNwZWMiXSBkbyB8dHwKKyAgICB2ID0gRU5WWydWRVJTSU9OJ10gb3IgYWJvcnQgJ011c3Qgc3VwcGx5IFZFUlNJT049eC55LnonCisgICAgYWJvcnQgIlZlcnNpb25zIGRvbid0IG1hdGNoICN7dn0gdnMgI3tQUk9KLnZlcnNpb259IiBpZiB2ICE9IFBLR19WRVJTSU9OCisgICAgcGtnID0gInBrZy8je0dFTV9TUEVDLmZ1bGxfbmFtZX0iCisKKyAgICBjaGFuZ2Vsb2cgPSBGaWxlLm9wZW4oIkNIQU5HRUxPRy5tZCIpIHsgfGZpbGV8IGZpbGUucmVhZCB9CisKKyAgICBwdXRzICJSZWxlYXNpbmcgI3tQS0dfTkFNRX0gdi4gI3tQS0dfVkVSU0lPTn0iCisgICAgUmFrZTo6VGFza1siZ2l0OnRhZzpjcmVhdGUiXS5pbnZva2UKKyAgZW5kCitlbmQKKworZGVzYyAiQWxpYXMgdG8gZ2VtOnBhY2thZ2UiCit0YXNrICJnZW0iID0+ICJnZW06cGFja2FnZSIKKwordGFzayAiZ2VtOnJlbGVhc2UiID0+ICJnZW06Z2Vtc3BlYyIKKwordGFzayAiY2xvYmJlciIgPT4gWyJnZW06Y2xvYmJlcl9wYWNrYWdlIl0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3Rhc2tzL2dpdC5yYWtlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvdGFza3MvZ2l0LnJha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlYzJmZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3Rhc2tzL2dpdC5yYWtlCkBAIC0wLDAgKzEsNDUgQEAKK25hbWVzcGFjZSA6Z2l0IGRvCisgIG5hbWVzcGFjZSA6dGFnIGRvCisgICAgZGVzYyAiTGlzdCB0YWdzIGZyb20gdGhlIEdpdCByZXBvc2l0b3J5IgorICAgIHRhc2sgOmxpc3QgZG8KKyAgICAgIHRhZ3MgPSBgZ2l0IHRhZyAtbGAKKyAgICAgIHRhZ3MuZ3N1YiEoIlxyIiwgIiIpCisgICAgICB0YWdzID0gdGFncy5zcGxpdCgiXG4iKS5zb3J0IHt8YSwgYnwgYiA8PT4gYSB9CisgICAgICBwdXRzIHRhZ3Muam9pbigiXG4iKQorICAgIGVuZAorCisgICAgZGVzYyAiQ3JlYXRlIGEgbmV3IHRhZyBpbiB0aGUgR2l0IHJlcG9zaXRvcnkiCisgICAgdGFzayA6Y3JlYXRlIGRvCisgICAgICBjaGFuZ2Vsb2cgPSBGaWxlLm9wZW4oIkNIQU5HRUxPRy5tZCIsICJyIikgeyB8ZmlsZXwgZmlsZS5yZWFkIH0KKyAgICAgIHB1dHMgIi0iICogODAKKyAgICAgIHB1dHMgY2hhbmdlbG9nCisgICAgICBwdXRzICItIiAqIDgwCisgICAgICBwdXRzCisKKyAgICAgIHYgPSBFTlZbIlZFUlNJT04iXSBvciBhYm9ydCAiTXVzdCBzdXBwbHkgVkVSU0lPTj14LnkueiIKKyAgICAgIGFib3J0ICJWZXJzaW9ucyBkb24ndCBtYXRjaCAje3Z9IHZzICN7UEtHX1ZFUlNJT059IiBpZiB2ICE9IFBLR19WRVJTSU9OCisKKyAgICAgIGdpdF9zdGF0dXMgPSBgZ2l0IHN0YXR1c2AKKyAgICAgIGlmIGdpdF9zdGF0dXMgIX4gL15ub3RoaW5nIHRvIGNvbW1pdC8KKyAgICAgICAgYWJvcnQgIldvcmtpbmcgZGlyZWN0b3J5IGlzbid0IGNsZWFuLiIKKyAgICAgIGVuZAorCisgICAgICB0YWcgPSAiI3tQS0dfTkFNRX0tI3tQS0dfVkVSU0lPTn0iCisgICAgICBtc2cgPSAiUmVsZWFzZSAje1BLR19OQU1FfS0je1BLR19WRVJTSU9OfSIKKworICAgICAgZXhpc3RpbmdfdGFncyA9IGBnaXQgdGFnIC1sICN7UEtHX05BTUV9LSpgLnNwbGl0KCdcbicpCisgICAgICBpZiBleGlzdGluZ190YWdzLmluY2x1ZGU/KHRhZykKKyAgICAgICAgd2FybigiVGFnIGFscmVhZHkgZXhpc3RzLCBkZWxldGluZy4uLiIpCisgICAgICAgIHVubGVzcyBzeXN0ZW0gImdpdCB0YWcgLWQgI3t0YWd9IgorICAgICAgICAgIGFib3J0ICJUYWcgZGVsZXRpb24gZmFpbGVkLiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIHB1dHMgIkNyZWF0aW5nIGdpdCB0YWcgJyN7dGFnfScuLi4iCisgICAgICB1bmxlc3Mgc3lzdGVtICJnaXQgdGFnIC1hIC1tIFwiI3ttc2d9XCIgI3t0YWd9IgorICAgICAgICBhYm9ydCAiVGFnIGNyZWF0aW9uIGZhaWxlZC4iCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKwordGFzayAiZ2VtOnJlbGVhc2UiID0+ICJnaXQ6dGFnOmNyZWF0ZSIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3Rhc2tzL21ldHJpY3MucmFrZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3Rhc2tzL21ldHJpY3MucmFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWZjNWMyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvdGFza3MvbWV0cmljcy5yYWtlCkBAIC0wLDAgKzEsMjIgQEAKK25hbWVzcGFjZSA6bWV0cmljcyBkbworICB0YXNrIDpsaW5lcyBkbworICAgIGxpbmVzLCBjb2RlbGluZXMsIHRvdGFsX2xpbmVzLCB0b3RhbF9jb2RlbGluZXMgPSAwLCAwLCAwLCAwCisgICAgZm9yIGZpbGVfbmFtZSBpbiBGaWxlTGlzdFsibGliLyoqLyoucmIiXQorICAgICAgZiA9IEZpbGUub3BlbihmaWxlX25hbWUpCisgICAgICB3aGlsZSBsaW5lID0gZi5nZXRzCisgICAgICAgIGxpbmVzICs9IDEKKyAgICAgICAgbmV4dCBpZiBsaW5lID1+IC9eXHMqJC8KKyAgICAgICAgbmV4dCBpZiBsaW5lID1+IC9eXHMqIy8KKyAgICAgICAgY29kZWxpbmVzICs9IDEKKyAgICAgIGVuZAorICAgICAgcHV0cyAiTDogI3tzcHJpbnRmKCIlNGQiLCBsaW5lcyl9LCAiICsKKyAgICAgICAgIkxPQyAje3NwcmludGYoIiU0ZCIsIGNvZGVsaW5lcyl9IHwgI3tmaWxlX25hbWV9IgorICAgICAgdG90YWxfbGluZXMgICAgICs9IGxpbmVzCisgICAgICB0b3RhbF9jb2RlbGluZXMgKz0gY29kZWxpbmVzCisKKyAgICAgIGxpbmVzLCBjb2RlbGluZXMgPSAwLCAwCisgICAgZW5kCisKKyAgICBwdXRzICJUb3RhbDogTGluZXMgI3t0b3RhbF9saW5lc30sIExPQyAje3RvdGFsX2NvZGVsaW5lc30iCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9hZGRyZXNzYWJsZS0yLjUuMi90YXNrcy9yc3BlYy5yYWtlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvdGFza3MvcnNwZWMucmFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRhNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvdGFza3MvcnNwZWMucmFrZQpAQCAtMCwwICsxLDIxIEBACityZXF1aXJlICJyc3BlYy9jb3JlL3Jha2VfdGFzayIKKworbmFtZXNwYWNlIDpzcGVjIGRvCisgIFJTcGVjOjpDb3JlOjpSYWtlVGFzay5uZXcoOnNpbXBsZWNvdikgZG8gfHR8CisgICAgdC5wYXR0ZXJuID0gRmlsZUxpc3RbJ3NwZWMvKiovKl9zcGVjLnJiJ10KKyAgICB0LnJzcGVjX29wdHMgPSBbJy0tY29sb3InLCAnLS1mb3JtYXQnLCAnZG9jdW1lbnRhdGlvbiddCisgIGVuZAorCisgIG5hbWVzcGFjZSA6c2ltcGxlY292IGRvCisgICAgZGVzYyAiQnJvd3NlIHRoZSBjb2RlIGNvdmVyYWdlIHJlcG9ydC4iCisgICAgdGFzayA6YnJvd3NlID0+ICJzcGVjOnNpbXBsZWNvdiIgZG8KKyAgICAgIHJlcXVpcmUgImxhdW5jaHkiCisgICAgICBMYXVuY2h5Lm9wZW4oImNvdmVyYWdlL2luZGV4Lmh0bWwiKQorICAgIGVuZAorICBlbmQKK2VuZAorCitkZXNjICJBbGlhcyB0byBzcGVjOnNpbXBsZWNvdiIKK3Rhc2sgInNwZWMiID0+ICJzcGVjOnNpbXBsZWNvdiIKKwordGFzayAiY2xvYmJlciIgPT4gWyJzcGVjOmNsb2JiZXJfc2ltcGxlY292Il0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3Rhc2tzL3lhcmQucmFrZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2FkZHJlc3NhYmxlLTIuNS4yL3Rhc2tzL3lhcmQucmFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGU0NDkxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvYWRkcmVzc2FibGUtMi41LjIvdGFza3MveWFyZC5yYWtlCkBAIC0wLDAgKzEsMjcgQEAKK3JlcXVpcmUgInJha2UiCisKK2JlZ2luCisgIHJlcXVpcmUgInlhcmQiCisgIHJlcXVpcmUgInlhcmQvcmFrZS95YXJkb2NfdGFzayIKKworICBuYW1lc3BhY2UgOmRvYyBkbworICAgIGRlc2MgIkdlbmVyYXRlIFlhcmRvYyBkb2N1bWVudGF0aW9uIgorICAgIFlBUkQ6OlJha2U6OllhcmRvY1Rhc2submV3IGRvIHx5YXJkb2N8CisgICAgICB5YXJkb2MubmFtZSA9ICJ5YXJkIgorICAgICAgeWFyZG9jLm9wdGlvbnMgPSBbIi0tdmVyYm9zZSIsICItLW1hcmt1cCIsICJtYXJrZG93biJdCisgICAgICB5YXJkb2MuZmlsZXMgPSBGaWxlTGlzdFsKKyAgICAgICAgImxpYi8qKi8qLnJiIiwgImV4dC8qKi8qLmMiLAorICAgICAgICAiUkVBRE1FLm1kIiwgIkNIQU5HRUxPRy5tZCIsICJMSUNFTlNFLnR4dCIKKyAgICAgIF0uZXhjbHVkZSgvaWRuYS8pCisgICAgZW5kCisgIGVuZAorCisgIHRhc2sgImNsb2JiZXIiID0+IFsiZG9jOmNsb2JiZXJfeWFyZCJdCisKKyAgZGVzYyAiQWxpYXMgdG8gZG9jOnlhcmQiCisgIHRhc2sgImRvYyIgPT4gImRvYzp5YXJkIgorcmVzY3VlIExvYWRFcnJvcgorICAjIElmIHlhcmQgaXNuJ3QgYXZhaWxhYmxlLCBpdCdzIG5vdCB0aGUgZW5kIG9mIHRoZSB3b3JsZAorICBkZXNjICJBbGlhcyB0byBkb2M6cmRvYyIKKyAgdGFzayAiZG9jIiA9PiAiZG9jOnJkb2MiCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2NvbG9yYXRvci0xLjEuMC9HZW1maWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL0dlbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0ZmJhMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2NvbG9yYXRvci0xLjEuMC9HZW1maWxlCkBAIC0wLDAgKzEsMTEgQEAKK3NvdXJjZSAiaHR0cHM6Ly9ydWJ5Z2Vtcy5vcmciCitnZW1zcGVjCisKK2dlbSAicmFrZSIKK2dyb3VwIDpkZXZlbG9wbWVudCBkbworICBnZW0gInJzcGVjLWhlbHBlcnMiLCA6cmVxdWlyZSA9PiBmYWxzZQorICBnZW0gImx1bmEtcnNwZWMtZm9ybWF0dGVycyIsIDpyZXF1aXJlID0+IGZhbHNlCisgIGdlbSAicHJ5IiwgOnJlcXVpcmUgPT4gZmFsc2UgdW5sZXNzIEVOVlsKKyAgICAiQ0kiCisgIF0KK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL0hpc3RvcnkubWFya2Rvd24gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9jb2xvcmF0b3ItMS4xLjAvSGlzdG9yeS5tYXJrZG93bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWM0MjcwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL0hpc3RvcnkubWFya2Rvd24KQEAgLTAsMCArMSwyNSBAQAorIyMgMS4xLjAgLyAyMDE2LTA2LTI4CisKKyMjIyBNaW5vciBFbmhhbmNlbWVudHMKKworKiBTdXBwb3J0IGpydWJ5ICgjOCkKKworIyMgMS4wLjAgLyAyMDE2LTA0LTI4CisKKyMjIyBNYWpvciBlbmhhbmNlbWVudHMKKworLSBNZXJnZSBTaW1wbGU6OkFOU0kgYW5kIENvbG9yYXRvci4gKCM3KQorCisjIyMgTWlub3IgRW5oYW5jZW1lbnRzCisKKy0gRGVsZXRlIHVubmVjZXNzYXJ5IGBTeW1ib2wjdG9fc3ltYCAoIzIpCistIENoYW5nZSBhcmd1bWVudCBuYW1lIG9mIGBFbnVtZXJhdG9yI2VhY2hgIGZvciBiZXR0ZXIgY29kZSBsZWdpYmlsaXR5ICgjMykKKworIyMjIERldmVsb3BtZW50IEZpeGVzCisKKy0gQ29udmVydCB0byBuZXcgUlNwZWMgZXhwZWN0YXRpb24gc3ludGF4ICgjMSkKKy0gRml4IGBTdHJpbmcjYmx1ZWAgcmVzdWx0IGluIFJFQURNRSAoIzQpCisKKyMjIDAuMSAvIDIwMTMtMDQtMTMKKworQmlydGhkYXkhCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9jb2xvcmF0b3ItMS4xLjAvTElDRU5TRSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2NvbG9yYXRvci0xLjEuMC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjZiZTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9jb2xvcmF0b3ItMS4xLjAvTElDRU5TRQpAQCAtMCwwICsxLDIxIEBACitUaGUgTUlUIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSBQYXJrZXIgTW9vcmUKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL1JFQURNRS5tYXJrZG93biBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2NvbG9yYXRvci0xLjEuMC9SRUFETUUubWFya2Rvd24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmODg2ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2NvbG9yYXRvci0xLjEuMC9SRUFETUUubWFya2Rvd24KQEAgLTAsMCArMSw0NyBAQAorIyBjb2xvcmF0b3IKKworQ29sb3JpemUgeW91ciB0ZXh0IGZvciB0aGUgdGVybWluYWwKKworWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvb2N0b3ByZXNzL2NvbG9yYXRvci5wbmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9vY3RvcHJlc3MvY29sb3JhdG9yKQorCisjIyBFeGFtcGxlCisKK2BgYHJ1YnkKKyJ0aGlzIHN0cmluZyIucmVkCisjID0+IFxlWzMxbXRoaXMgc3RyaW5nXGVbMG0KKyJteSBzdHJpbmciLmJsdWUKKyMgPT4gXGVbMzRtbXkgc3RyaW5nXGVbMG0KKyMgZXRjLi4uCitgYGAKKworIyMgU3VwcG9ydGVkIENvbG9ycworCistIGByZWRgCistIGBibGFja2AKKy0gYGdyZWVuYAorLSBgeWVsbG93YAorLSBgbWFnZW50YWAKKy0gYHdoaXRlYAorLSBgYmx1ZWAKKy0gYGN5YW5gCistIGBib2xkYAorCisjIyBPdGhlciBzdXBwb3J0ZWQgQW5zaSBtZXRob2RzCisKKy0gYGNsZWFyX2xpbmVgCistIGBoYXNfYW5zaT9gLCBgaGFzX2NvbG9yP2AKKy0gYHN0cmlwX2Fuc2lgLCBgc3RyaXBfY29sb3JgCistIGByZXNldF9hbnNpYCwgYHJlc2V0X2NvbG9yYAorLSBgY2xlYXJfc2NyZWVuYAorLSBgYW5zaV9qdW1wYAorCisjIyBXaHkKKworVGhlcmUgYXJlIGEgYnVuY2ggb2YgZ2VtcyB0aGF0IHByb3ZpZGUgZnVuY3Rpb25hbGl0eSBsaWtlIHRoaXMsIGJ1dCBub25lIGhhdmUKK2FzIHNpbXBsZSBhbiBBUEkgYXMgdGhpcy4gSnVzdCBjYWxsIGAic3RyaW5nIi5jb2xvcmAgYW5kIHlvdXIgdGV4dCB3aWxsIGJlCitjb2xvcml6ZWQuCisKKyMjIExpY2Vuc2UKKworTUlULiBXcml0dGVuIGFzIGEgc2luZ2xlIFJ1YnkgZmlsZSBieSBCcmFuZG9uIE1hdGhpcywgY29udmVydGVkIGludG8gYSBnZW0gYnkKK1BhcmtlciBNb29yZS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2NvbG9yYXRvci0xLjEuMC9SYWtlZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2NvbG9yYXRvci0xLjEuMC9SYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2U5ZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL1Jha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorcmVxdWlyZSAiYnVuZGxlci9nZW1fdGFza3MiCityZXF1aXJlICJyc3BlYy9jb3JlL3Jha2VfdGFzayIKKworUlNwZWM6OkNvcmU6OlJha2VUYXNrLm5ldyg6c3BlYykKKwordGFzayA6ZGVmYXVsdCA9PiA6c3BlYwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL2NvbG9yYXRvci5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL2NvbG9yYXRvci5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmQwY2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9jb2xvcmF0b3ItMS4xLjAvY29sb3JhdG9yLmdlbXNwZWMKQEAgLTAsMCArMSwyMyBAQAorIyBjb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgnbGliL2NvbG9yYXRvci5yYicsIF9fZGlyX18pCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHNwZWN8CisgIHNwZWMubmFtZSAgICAgICAgPSAiY29sb3JhdG9yIgorICBzcGVjLnN1bW1hcnkgICAgID0gIkNvbG9yaXplIHlvdXIgdGV4dCBpbiB0aGUgdGVybWluYWwuIgorICBzcGVjLnZlcnNpb24gICAgID0gQ29sb3JhdG9yOjpWRVJTSU9OCisgIHNwZWMuYXV0aG9ycyAgICAgPSBbIlBhcmtlciBNb29yZSIsICJCcmFuZG9uIE1hdGhpcyJdCisgIHNwZWMuZW1haWwgICAgICAgPSBbInBhcmtybW9vcmVAZ21haWwuY29tIiwgImJyYW5kb25AaW1hdGhpcy5jb20iXQorICBzcGVjLmhvbWVwYWdlICAgID0gImh0dHBzOi8vZ2l0aHViLmNvbS9vY3RvcHJlc3MvY29sb3JhdG9yIgorICBzcGVjLmxpY2Vuc2VzICAgID0gWyJNSVQiXQorCisgIGFsbCAgICAgICAgICAgICAgICA9IGBnaXQgbHMtZmlsZXMgLXpgLnNwbGl0KCJceDAiKS5yZWplY3QgeyB8ZnwgZi5zdGFydF93aXRoPygiLiIpIH0KKyAgc3BlYy5maWxlcyAgICAgICAgID0gYWxsLnNlbGVjdCB7IHxmfCBGaWxlLmJhc2VuYW1lKGYpID09IGYgfHwgZiA9fiAlcnteKGJpbnxsaWIpL30gfQorICBzcGVjLmV4ZWN1dGFibGVzICAgPSBzcGVjLmZpbGVzLmdyZXAoJXJ7XmJpbi99KSB7IHxmfCBGaWxlLmJhc2VuYW1lKGYpIH0KKyAgc3BlYy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiXQorCisgIHNwZWMuZXh0cmFfcmRvY19maWxlcyA9IFsiUkVBRE1FLm1hcmtkb3duIiwgIkxJQ0VOU0UiXQorICBzcGVjLnJkb2Nfb3B0aW9ucyAgICAgPSBbIi0tY2hhcnNldD1VVEYtOCJdCisKKyAgc3BlYy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAicnNwZWMiLCAifj4gMy4xIgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9jb2xvcmF0b3ItMS4xLjAvbGliL2NvbG9yYXRvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2NvbG9yYXRvci0xLjEuMC9saWIvY29sb3JhdG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2Y2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9jb2xvcmF0b3ItMS4xLjAvbGliL2NvbG9yYXRvci5yYgpAQCAtMCwwICsxLDExMSBAQAorJDoudW5zaGlmdCBGaWxlLmRpcm5hbWUoX19GSUxFX18pCisKK21vZHVsZSBDb2xvcmF0b3IKKyAgbW9kdWxlX2Z1bmN0aW9uCisgIFZFUlNJT04gPSAiMS4xLjAiCisKKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEFOU0lfTUFUQ0hSID0gL1x4MWIuKj9bamttc3VBQkdLSF0vCisgIEFOU0lfQ09MT1JTID0geworICAgIDpibGFjayAgID0+IDMwLAorICAgIDpyZWQgICAgID0+IDMxLAorICAgIDpncmVlbiAgID0+IDMyLAorICAgIDp5ZWxsb3cgID0+IDMzLAorICAgIDpibHVlICAgID0+IDM0LAorICAgIDptYWdlbnRhID0+IDM1LAorICAgIDpjeWFuICAgID0+IDM2LAorICAgIDp3aGl0ZSAgID0+IDM3LAorICAgIDpib2xkICAgID0+IDEKKyAgfQorCisgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBBbGxvd3MgeW91IHRvIGNoZWNrIGlmIGEgc3RyaW5nIGN1cnJlbnRseSBoYXMgYW5zaS4KKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGRlZiBoYXNfYW5zaT8oc3RyKQorICAgIHN0ci5tYXRjaChBTlNJX01BVENIUikuaXNfYT8oCisgICAgICBNYXRjaERhdGEKKyAgICApCisgIGVuZAorCisgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBKdW1wIHRoZSBjdXJzb3IsIG1vdmluZyBpdCB1cCBhbmQgdGhlbiBiYWNrIGRvd24gdG8gaXQncyBzcG90LCBhbGxvd2luZworICAjIHlvdSB0byBkbyBmYW5jeSB0aGluZ3MgbGlrZSBtdWx0aXBsZSBvdXRwdXQgKGRvd25sb2FkcykgdGhlIHdheSB0aGF0IERvY2tlcgorICAjIGRvZXMgdGhlbSBpbiBhbiBhc3luYyB3YXkgd2l0aG91dCBicmVha2luZyB0ZXJtLgorICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZGVmIGFuc2lfanVtcChzdHIsIG51bSkKKyAgICAiXHgxYlsje251bX1BI3tjbGVhcl9saW5lKHN0cil9XHgxYlsjeworICAgICAgbnVtCisgICAgfUIiCisgIGVuZAorCisgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBkZWYgcmVzZXRfYW5zaShzdHIgPSAiIikKKyAgICAiXHgxYlswbSN7CisgICAgICBzdHIKKyAgICB9IgorICBlbmQKKworICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZGVmIGNsZWFyX2xpbmUoc3RyID0gIiIpCisgICAgIlx4MWJbMktcciN7CisgICAgICBzdHIKKyAgICB9IgorICBlbmQKKworICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICMgU3RyaXAgQU5TSSBmcm9tIHRoZSBjdXJyZW50IHN0cmluZywgbWFraW5nIGl0IGp1c3QgYSBub3JtYWwgc3RyaW5nLgorICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZGVmIHN0cmlwX2Fuc2koc3RyKQorICAgIHN0ci5nc3ViKAorICAgICAgQU5TSV9NQVRDSFIsICIiCisgICAgKQorICBlbmQKKworICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICMgQ2xlYXIgdGhlIHNjcmVlbidzIGN1cnJlbnQgdmlldywgc28gdGhlIHVzZXIgZ2V0cyBhIGNsZWFuIG91dHB1dC4KKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGRlZiBjbGVhcl9zY3JlZW4oc3RyID0gIiIpCisgICAgIlx4MWJbSFx4MWJbMkojeworICAgICAgc3RyCisgICAgfSIKKyAgZW5kCisKKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGRlZiBjb2xvcml6ZShzdHIgPSAiIiwgY29sb3IpCisgICAgIlx4MWJbI3tjb2xvcn1tI3tzdHJ9XHgxYlswbSIKKyAgZW5kCisKKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIENvbG9yYXRvcjo6QU5TSV9DT0xPUlMuZWFjaCBkbyB8Y29sb3IsIGNvZGV8CisgICAgZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QgY29sb3IgZG8gfHN0cnwKKyAgICAgIGNvbG9yaXplKAorICAgICAgICBzdHIsIGNvZGUKKyAgICAgICkKKyAgICBlbmQKKyAgZW5kCisKKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGNsYXNzIDw8IHNlbGYKKyAgICBhbGlhcyByZXNldF9jb2xvciByZXNldF9hbnNpCisgICAgYWxpYXMgc3RyaXBfY29sb3Igc3RyaXBfYW5zaQorICAgIGFsaWFzIGhhc19jb2xvcj8gaGFzX2Fuc2k/CisgIGVuZAorCisgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBDT1JFX01FVEhPRFMgPSAoCisgICAgcHVibGljX21ldGhvZHMgLSBPYmplY3QubWV0aG9kcworICApCitlbmQKKworcmVxdWlyZSAiY29sb3JhdG9yL2NvcmVfZXh0IgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL2xpYi9jb2xvcmF0b3IvY29yZV9leHQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9jb2xvcmF0b3ItMS4xLjAvbGliL2NvbG9yYXRvci9jb3JlX2V4dC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmUwYmYwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvY29sb3JhdG9yLTEuMS4wL2xpYi9jb2xvcmF0b3IvY29yZV9leHQucmIKQEAgLTAsMCArMSw5IEBACitjbGFzcyBTdHJpbmcKKyAgQ29sb3JhdG9yOjpDT1JFX01FVEhPRFMuZWFjaCBkbyB8bWV0aG9kfAorICAgIGRlZmluZV9tZXRob2QgbWV0aG9kIGRvIHwqYXJnc3wKKyAgICAgIENvbG9yYXRvci5wdWJsaWNfc2VuZChtZXRob2QsCisgICAgICAgIHNlbGYsICphcmdzCisgICAgICApCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L0NPUFlJTkcgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyMjMxOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvQ09QWUlORwpAQCAtMCwwICsxLDQ5IEBACitDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbGliZmZpLCB1c2VkIGJ5IHRoaXMgcHJvamVjdCwgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgorCitsaWJmZmkgLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAxMSAgQW50aG9ueSBHcmVlbiwgUmVkIEhhdCwgSW5jIGFuZCBvdGhlcnMuCitTZWUgc291cmNlIGZpbGVzIGZvciBkZXRhaWxzLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCitDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKK1NPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L0xJQ0VOU0UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxODVmZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvTElDRU5TRQpAQCAtMCwwICsxLDI0IEBACitDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNiwgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvUkVBRE1FLm1kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiOGVmYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTExIEBACisjIHJ1YnktZmZpIGh0dHBzOi8vd2lraS5naXRodWIuY29tL2ZmaS9mZmkgWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvZmZpL2ZmaS5wbmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9mZmkvZmZpKQorCisjIyBEZXNjcmlwdGlvbgorCitSdWJ5LUZGSSBpcyBhIHJ1YnkgZXh0ZW5zaW9uIGZvciBwcm9ncmFtbWF0aWNhbGx5IGxvYWRpbmcgZHluYW1pYworbGlicmFyaWVzLCBiaW5kaW5nIGZ1bmN0aW9ucyB3aXRoaW4gdGhlbSwgYW5kIGNhbGxpbmcgdGhvc2UgZnVuY3Rpb25zCitmcm9tIFJ1YnkgY29kZS4gTW9yZW92ZXIsIGEgUnVieS1GRkkgZXh0ZW5zaW9uIHdvcmtzIHdpdGhvdXQgY2hhbmdlcworb24gUnVieSBhbmQgSlJ1YnkuIFtEaXNjb3ZlciB3aHkgeW91IHNob3VsZCB3cml0ZSB5b3VyIG5leHQgZXh0ZW5zaW9uCit1c2luZyBSdWJ5LUZGSV0oaHR0cHM6Ly93aWtpLmdpdGh1Yi5jb20vZmZpL2ZmaS93aHktdXNlLWZmaSkuCisKKyMjIEZlYXR1cmVzL3Byb2JsZW1zCisKKyogSW50dWl0aXZlIERTTAorKiBTdXBwb3J0cyBhbGwgQyBuYXRpdmUgdHlwZXMKKyogQyBzdHJ1Y3RzIChhbHNvIG5lc3RlZCksIGVudW1zIGFuZCBnbG9iYWwgdmFyaWFibGVzCisqIENhbGxiYWNrcyBmcm9tIEMgdG8gcnVieQorKiBBdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIG5hdGl2ZSBtZW1vcnkKKworIyMgU3lub3BzaXMKKworYGBgcnVieQorcmVxdWlyZSAnZmZpJworCittb2R1bGUgTXlMaWIKKyAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICBmZmlfbGliICdjJworICBhdHRhY2hfZnVuY3Rpb24gOnB1dHMsIFsgOnN0cmluZyBdLCA6aW50CitlbmQKKworTXlMaWIucHV0cyAnSGVsbG8sIFdvcmxkIHVzaW5nIGxpYmMhJworYGBgCisKK0ZvciBsZXNzIG1pbmltYWxpc3RpYyBhbmQgbW9yZSBzYW5lIGV4YW1wbGVzIHlvdSBtYXkgbG9vayBhdDoKKworKiB0aGUgc2FtcGxlcy8gZm9sZGVyCisqIHRoZSBleGFtcGxlcyBvbiB0aGUgW3dpa2ldKGh0dHBzOi8vd2lraS5naXRodWIuY29tL2ZmaS9mZmkpCisqIHRoZSBwcm9qZWN0cyB1c2luZyBGRkkgbGlzdGVkIG9uIHRoaXMgcGFnZSAoaHR0cHM6Ly93aWtpLmdpdGh1Yi5jb20vZmZpL2ZmaS9wcm9qZWN0cy11c2luZy1mZmkpCisKKyMjIFJlcXVpcmVtZW50cworCitZb3UgbmVlZCBhIHNhbmUgYnVpbGRpbmcgZW52aXJvbm1lbnQgaW4gb3JkZXIgdG8gY29tcGlsZSB0aGUgZXh0ZW5zaW9uLgorQXQgYSBtaW5pbXVtLCB5b3Ugd2lsbCBuZWVkOgorKiBBIEMgY29tcGlsZXIgKGUuZy4gWGNvZGUgb24gT1NYLCBnY2Mgb24gZXZlcnl0aGluZyBlbHNlKQorKiBsaWJmZmkgZGV2ZWxvcG1lbnQgbGlicmFyeSAtIHRoaXMgaXMgY29tbW9ubHkgaW4gdGhlIGxpYmZmaS1kZXYgb3IgbGliZmZpLWRldmVsCisKK09uIExpbnV4IHN5c3RlbXMgcnVubmluZyB3aXRoIFtQYVhdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BhWCkgKEdlbnRvbywgQWxwaW5lLCBldGMuKSBGRkkgbWF5IHRyaWdnZXIgYG1wcm90cmVjdGAgZXJyb3JzLiBZb3UgbWF5IG5lZWQgdG8gZGlzYWJsZSBbbXByb3RlY3RdKGh0dHBzOi8vZW4ud2lraWJvb2tzLm9yZy93aWtpL0dyc2VjdXJpdHkvQXBwZW5kaXgvR3JzZWN1cml0eV9hbmRfUGFYX0NvbmZpZ3VyYXRpb25fT3B0aW9ucyNSZXN0cmljdF9tcHJvdGVjdC4yOC4yOSkgZm9yIHJ1YnkgKGBwYXhjdGwgLW0gWy9wYXRoL3RvL3J1YnldYCkgZm9yIHRoZSB0aW1lIGJlaW5nIHVudGlsIGEgc29sdXRpb24gaXMgZm91bmQuCisKKyMjIEluc3RhbGxhdGlvbgorCitGcm9tIHJ1YnlnZW1zOgorCisgICAgW3N1ZG9dIGdlbSBpbnN0YWxsIGZmaQorCitvciBmcm9tIHRoZSBnaXQgcmVwb3NpdG9yeSBvbiBnaXRodWI6CisKKyAgICBnaXQgY2xvbmUgZ2l0Oi8vZ2l0aHViLmNvbS9mZmkvZmZpLmdpdAorICAgIGNkIGZmaQorICAgIHJha2UgZ2VtOmluc3RhbGwKKworIyMgTGljZW5zZQorCitUaGUgZmZpIGxpYnJhcnkgaXMgY292ZXJlZCBieSB0aGUgQlNEIGxpY2Vuc2UsIGFsc28gc2VlIHRoZSBMSUNFTlNFIGZpbGUuCitUaGUgc3BlY3MgYXJlIHNoYXJlZCB3aXRoIFJ1YnlzcGVjIGFuZCBhcmUgbGljZW5zZWQgYnkgdGhlIHNhbWUgbGljZW5zZQorYXMgUnVieXNwZWMsIHNlZSB0aGUgTElDRU5TRS5TUEVDUyBmaWxlLgorCisjIyBDcmVkaXRzCisKK1RoZSBmb2xsb3dpbmcgcGVvcGxlIGhhdmUgc3VibWl0dGVkIGNvZGUsIGJ1ZyByZXBvcnRzLCBvciBvdGhlcndpc2UgY29udHJpYnV0ZWQgdG8gdGhlIHN1Y2Nlc3Mgb2YgdGhpcyBwcm9qZWN0OgorCisqIEFsYmFuIFBlaWduaWVyIDxhbGJhbi5wZWlnbmllckBmcmVlLmZyPgorKiBBbWFuIEd1cHRhIDxhbWFuQHRtbTEubmV0PgorKiBBbmRyZWEgRmF6emkgPGFuZHJlYS5mYXp6aUBhbGNhY29vcC5pdD4KKyogQW5kcmVhcyBOaWVkZXJsIDxyaWNvMzJAZ214Lm5ldD4KKyogQW5kcmV3IENob2xha2lhbiA8YW5kcmV3QGFuZHJld3ZjLmNvbT4KKyogQW50b25pbyBUZXJjZWlybyA8dGVyY2Vpcm9Ac29mdHdhcmVsaXZyZS5vcmc+CisqIEJyaWFuIENhbmRsZXIgPEIuQ2FuZGxlckBwb2JveC5jb20+CisqIEJyaWFuIEQuIEJ1cm5zIDxidXJuczE4MEBnbWFpbC5jb20+CisqIEJyeWFuIEtlYXJuZXkgPGJrZWFybmV5QHJlZGhhdC5jb20+CisqIENoYXJsaWUgU2F2YWdlIDxjZmlzQHplcmlzdGEuY29tPgorKiBDaGlrYW5hZ2EgVG9tb3l1a2kgPG5hZ2FjaGlrYTAwQGdtYWlsLmNvbT4KKyogSG9uZ2xpIExhaSA8aG9uZ2xpQHBodXNpb24ubmw+CisqIElhbiBNYWNMZW9kIDxpYW5AbmV2aXIubmV0PgorKiBKYWtlIERvdWdsYXMgPGpha2VAc2hpZnRlZGxhYnMuY29tPgorKiBKZWFuLURvbWluaXF1ZSBNb3JhbmkgPGpkbW9yYW5pQG1hYy5jb20+CisqIEplcmVteSBIaW5lZ2FyZG5lciA8amVyZW15QGhpbmVnYXJkbmVyLm9yZz4KKyogSmVzw7pzIEdhcmPDrWEgU8OhZXogPGJsYXh0ZXJAZ21haWwuY29tPgorKiBKb2UgS2hvb2J5YXIgPGpvZUBhbmtoY3JhZnQuY29tPgorKiBKdXJpaiBTbWFrb3YgPGp1cmlqQHdvb3lkLm9yZz4KKyogS0lTSElNT1RPLCBNYWtvdG8gPGtzbWFrb3RvQGRkLmlpajR1Lm9yLmpwPgorKiBLaW0gQnVyZ2VzdHJhbmQgPGtpbUBidXJnZXN0cmFuZC5zZT4KKyogTGFycyBLYW5pcyA8a2FuaXNAY29tY2FyZC5kZT4KKyogTHVjIEhlaW5yaWNoIDxsdWNAaG9uay1ob25rLmNvbT4KKyogTHVpcyBMYXZlbmEgPGx1aXNsYXZlbmFAZ21haWwuY29tPgorKiBNYXRpanMgdmFuIFp1aWpsZW4gPG1hdGlqc0BtYXRpanMubmV0PgorKiBNYXR0aGV3IEtpbmcgPGF1dG9tYXR0aGV3QGdtYWlsLmNvbT4KKyogTWlrZSBEYWxlc3NpbyA8bWlrZS5kYWxlc3Npb0BnbWFpbC5jb20+CisqIE5BUlVTRSwgWXVpIDxuYXJ1c2VAYWlyZW1peC5qcD4KKyogUGFyayBIZWVzb2IgPHBoYXNpc0BnbWFpbC5jb20+CisqIFNoaW4gWWVlIDxzaGlueWVlQHNwZWVkZ29jb21wdXRpbmcuY29tPgorKiBTdGVwaGVuIEJhbm5hc2NoIDxzdGVwaGVuLmJhbm5hc2NoQGdtYWlsLmNvbT4KKyogU3VyYWogTi4gS3VyYXBhdGkgPHN1bmFrdUBnbWFpbC5jb20+CisqIFN5bHZhaW4gRGF1YmVydCA8c3lsdmFpbi5kYXViZXJ0QGxhcG9zdGUubmV0PgorKiBWaWN0b3IgQ29zdGFuCisqIGJlb3JhbkBnbWFpbC5jb20KKyogY3RpZGUgPGNocmlzdGlkZUBjaHJpc3RpZGUuY29tPgorKiBlbWJvc3MgPE1hcnRpbi5Cb3NzbGV0QGdvb2dsZW1haWwuY29tPgorKiBob2JvcGhvYmUgPHVudXN1YWx0ZWFyc0BnbWFpbC5jb20+CisqIG1laCA8bWVoQHBhcmFub2ljaS5vcmc+CisqIHBvc3Rtb2Rlcm4gPHBvc3Rtb2Rlcm4ubW9kM0BnbWFpbC5jb20+CisqIHd5Y2F0c0BnbWFpbC5jb20gPHd5Y2F0c0BnbWFpbC5jb20+CisqIFdheW5lIE1laXNzbmVyIDx3bWVpc3NuZXJAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9SYWtlZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvUmFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlNGNmMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvUmFrZWZpbGUKQEAgLTAsMCArMSwyMzIgQEAKK3JlcXVpcmUgJ3J1YnlnZW1zL3Rhc2tzJworcmVxdWlyZSAncmJjb25maWcnCityZXF1aXJlICdyYWtlL2NsZWFuJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIuL2xpYi9mZmkvdmVyc2lvbiIpCisKK1VTRV9SQUtFX0NPTVBJTEVSID0gKFJVQllfUExBVEZPUk0gPX4gL2phdmEvKSA/IGZhbHNlIDogdHJ1ZQoraWYgVVNFX1JBS0VfQ09NUElMRVIKKyAgcmVxdWlyZSAncmFrZS9leHRlbnNpb250YXNrJworZW5kCisKK3JlcXVpcmUgJ2RhdGUnCityZXF1aXJlICdmaWxldXRpbHMnCityZXF1aXJlICdyYmNvbmZpZycKK3JlcXVpcmUgJ3JzcGVjL2NvcmUvcmFrZV90YXNrJworcmVxdWlyZSAncnVieWdlbXMvcGFja2FnZV90YXNrJworCitMSUJFWFQgPSBjYXNlIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3Rfb3MnXS5kb3duY2FzZQorICB3aGVuIC9kYXJ3aW4vCisgICAgImR5bGliIgorICB3aGVuIC9tc3dpbnxtaW5ndy8KKyAgICAiZGxsIgorICBlbHNlCisgICAgUmJDb25maWc6OkNPTkZJR1snRExFWFQnXQorICBlbmQKKworQ1BVID0gY2FzZSBSYkNvbmZpZzo6Q09ORklHWydob3N0X2NwdSddLmRvd25jYXNlCisgIHdoZW4gL2lbMzQ1Nl04Ni8KKyAgICAjIERhcndpbiBhbHdheXMgcmVwb3J0cyBpNjg2LCBldmVuIHdoZW4gcnVubmluZyBpbiA2NGJpdCBtb2RlCisgICAgaWYgUmJDb25maWc6OkNPTkZJR1snaG9zdF9vcyddID1+IC9kYXJ3aW4vICYmIDB4ZmVlMWRlYWRiZWVmLmlzX2E/KEZpeG51bSkKKyAgICAgICJ4ODZfNjQiCisgICAgZWxzZQorICAgICAgImkzODYiCisgICAgZW5kCisKKyAgd2hlbiAvYW1kNjR8eDg2XzY0LworICAgICJ4ODZfNjQiCisKKyAgd2hlbiAvcHBjNjR8cG93ZXJwYzY0LworICAgICJwb3dlcnBjNjQiCisKKyAgd2hlbiAvcHBjfHBvd2VycGMvCisgICAgInBvd2VycGMiCisKKyAgd2hlbiAvXmFybS8KKyAgICAiYXJtIgorCisgIGVsc2UKKyAgICBSYkNvbmZpZzo6Q09ORklHWydob3N0X2NwdSddCisgIGVuZAorCitPUyA9IGNhc2UgUmJDb25maWc6OkNPTkZJR1snaG9zdF9vcyddLmRvd25jYXNlCisgIHdoZW4gL2xpbnV4LworICAgICJsaW51eCIKKyAgd2hlbiAvZGFyd2luLworICAgICJkYXJ3aW4iCisgIHdoZW4gL2ZyZWVic2QvCisgICAgImZyZWVic2QiCisgIHdoZW4gL29wZW5ic2QvCisgICAgIm9wZW5ic2QiCisgIHdoZW4gL3N1bm9zfHNvbGFyaXMvCisgICAgInNvbGFyaXMiCisgIHdoZW4gL21zd2lufG1pbmd3LworICAgICJ3aW4zMiIKKyAgZWxzZQorICAgIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3Rfb3MnXS5kb3duY2FzZQorICBlbmQKKworR01BS0UgPSBzeXN0ZW0oJ3doaWNoIGdtYWtlID4vZGV2L251bGwnKSAmJiAnZ21ha2UnIHx8ICdtYWtlJworCitMSUJURVNUID0gImJ1aWxkL2xpYnRlc3QuI3tMSUJFWFR9IgorQlVJTERfRElSID0gImJ1aWxkIgorQlVJTERfRVhUX0RJUiA9IEZpbGUuam9pbihCVUlMRF9ESVIsICIje1JiQ29uZmlnOjpDT05GSUdbJ2FyY2gnXX0iLCAnZmZpX2MnLCBSVUJZX1ZFUlNJT04pCisKK2RlZiBnZW1fc3BlYworICBAZ2VtX3NwZWMgfHw9IEdlbTo6U3BlY2lmaWNhdGlvbi5sb2FkKCdmZmkuZ2Vtc3BlYycpCitlbmQKKworVEVTVF9ERVBTID0gWyBMSUJURVNUIF0KK2lmIFJVQllfUExBVEZPUk0gPT0gImphdmEiCisgIFJTcGVjOjpDb3JlOjpSYWtlVGFzay5uZXcoOnNwZWMpIGRvIHxjb25maWd8CisgICAgY29uZmlnLnJzcGVjX29wdHMgPSBZQU1MLmxvYWRfZmlsZSAnc3BlYy9zcGVjLm9wdHMnCisgIGVuZAorZWxzZQorICBSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3KDpzcGVjID0+IDpjb21waWxlKSBkbyB8Y29uZmlnfAorICAgIGNvbmZpZy5yc3BlY19vcHRzID0gWUFNTC5sb2FkX2ZpbGUgJ3NwZWMvc3BlYy5vcHRzJworICBlbmQKKworICBURVNUX0RFUFMudW5zaGlmdCA6Y29tcGlsZQorZW5kCisKK2Rlc2MgIkJ1aWxkIGFsbCBwYWNrYWdlcyIKK3Rhc2sgOnBhY2thZ2UgPT4gJ2dlbTpwYWNrYWdlJworCitDTE9CQkVSLmluY2x1ZGUgJ2xpYi9mZmkvdHlwZXMuY29uZicKK0NMT0JCRVIuaW5jbHVkZSAncGtnJworQ0xPQkJFUi5pbmNsdWRlICdsb2cnCisKK0NMRUFOLmluY2x1ZGUgJ2J1aWxkJworQ0xFQU4uaW5jbHVkZSAnY29uZnRlc3QuZFNZTScKK0NMRUFOLmluY2x1ZGUgJ3NwZWMvZmZpL2ZpeHR1cmVzL2xpYnRlc3Que2R5bGliLHNvLGRsbH0nCitDTEVBTi5pbmNsdWRlICdzcGVjL2ZmaS9maXh0dXJlcy8qLm8nCitDTEVBTi5pbmNsdWRlICJwa2cvZmZpLSote21pbmd3MzIsamF2YX0iCitDTEVBTi5pbmNsdWRlICdsaWIvMS4qJworQ0xFQU4uaW5jbHVkZSAnbGliLzIuKicKK0NMRUFOLmluY2x1ZGUgJ2JpbicKKwordGFzayA6ZGlzdGNsZWFuID0+IDpjbG9iYmVyCisKK2Rlc2MgIkJ1aWxkIHRoZSBuYXRpdmUgdGVzdCBsaWIiCitmaWxlICJidWlsZC9saWJ0ZXN0LiN7TElCRVhUfSIgPT4gRmlsZUxpc3RbJ2xpYnRlc3QvKiovKi5bY2hdJ10gZG8KKyAgc2ggJXsje0dNQUtFfSAtZiBsaWJ0ZXN0L0dOVW1ha2VmaWxlIENQVT0je0NQVX0gT1M9I3tPU30gfQorZW5kCisKKworZGVzYyAiQnVpbGQgdGVzdCBoZWxwZXIgbGliIgordGFzayA6bGlidGVzdCA9PiAiYnVpbGQvbGlidGVzdC4je0xJQkVYVH0iCisKK2Rlc2MgIlRlc3QgdGhlIGV4dGVuc2lvbiIKK3Rhc2sgOnRlc3QgPT4gWyA6c3BlYyBdCisKKworbmFtZXNwYWNlIDpiZW5jaCBkbworICBJVEVSID0gRU5WWydJVEVSJ10gPyBFTlZbJ0lURVInXS50b19pIDogMTAwMDAwCisgIGJlbmNoX2xpYnMgPSAiLUlsaWIgLUkje0JVSUxEX0RJUn0iIHVubGVzcyBSVUJZX1BMQVRGT1JNID09ICJqYXZhIgorICBiZW5jaF9maWxlcyA9IERpclsiYmVuY2gvYmVuY2hfKi5yYiJdLnJlamVjdCB7IHxmfCBmID09ICJiZW5jaF9oZWxwZXIucmIiIH0KKyAgYmVuY2hfZmlsZXMuZWFjaCBkbyB8YmVuY2h8CisgICAgdGFzayBGaWxlLmJhc2VuYW1lKGJlbmNoLCAiLnJiIilbNi4uLTFdID0+IFRFU1RfREVQUyBkbworICAgICAgc2ggJXsje0dlbS5ydWJ5fSAje2JlbmNoX2xpYnN9ICN7YmVuY2h9ICN7SVRFUn19CisgICAgZW5kCisgIGVuZAorICB0YXNrIDphbGwgPT4gVEVTVF9ERVBTIGRvCisgICAgYmVuY2hfZmlsZXMuZWFjaCBkbyB8YmVuY2h8CisgICAgICBzaCAleyN7R2VtLnJ1Ynl9ICN7YmVuY2hfbGlic30gI3tiZW5jaH19CisgICAgZW5kCisgIGVuZAorZW5kCisKK3Rhc2sgJ3NwZWM6cnVuJyA9PiBURVNUX0RFUFMKK3Rhc2sgJ3NwZWM6c3BlY2RvYycgPT4gVEVTVF9ERVBTCisKK3Rhc2sgOmRlZmF1bHQgPT4gOnNwZWMKKworbmFtZXNwYWNlICdqYXZhJyBkbworCisgIGphdmFfZ2VtX3NwZWMgPSBHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICAgIHMubmFtZSA9IGdlbV9zcGVjLm5hbWUKKyAgICBzLnZlcnNpb24gPSBnZW1fc3BlYy52ZXJzaW9uCisgICAgcy5hdXRob3IgPSBnZW1fc3BlYy5hdXRob3IKKyAgICBzLmVtYWlsID0gZ2VtX3NwZWMuZW1haWwKKyAgICBzLmhvbWVwYWdlID0gZ2VtX3NwZWMuaG9tZXBhZ2UKKyAgICBzLnN1bW1hcnkgPSBnZW1fc3BlYy5zdW1tYXJ5CisgICAgcy5kZXNjcmlwdGlvbiA9IGdlbV9zcGVjLmRlc2NyaXB0aW9uCisgICAgcy5maWxlcyA9ICV3KExJQ0VOU0UgQ09QWUlORyBSRUFETUUubWQgUmFrZWZpbGUpCisgICAgcy5oYXNfcmRvYyA9IGZhbHNlCisgICAgcy5saWNlbnNlID0gZ2VtX3NwZWMubGljZW5zZQorICAgIHMucGxhdGZvcm0gPSAnamF2YScKKyAgZW5kCisKKyAgR2VtOjpQYWNrYWdlVGFzay5uZXcoamF2YV9nZW1fc3BlYykgZG8gfHBrZ3wKKyAgICBwa2cubmVlZF96aXAgPSB0cnVlCisgICAgcGtnLm5lZWRfdGFyID0gdHJ1ZQorICAgIHBrZy5wYWNrYWdlX2RpciA9ICdwa2cnCisgIGVuZAorZW5kCisKK3Rhc2sgJ2dlbTpqYXZhJyA9PiAnamF2YTpnZW0nCisKKworaWYgVVNFX1JBS0VfQ09NUElMRVIKKyAgUmFrZTo6RXh0ZW5zaW9uVGFzay5uZXcoJ2ZmaV9jJywgZ2VtX3NwZWMpIGRvIHxleHR8CisgICAgZXh0Lm5hbWUgPSAnZmZpX2MnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kaWNhdGUgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbi4KKyAgICAjIGV4dC5saWJfZGlyID0gQlVJTERfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwdXQgYmluYXJpZXMgaW50byB0aGlzIGZvbGRlci4KKyAgICBleHQudG1wX2RpciA9IEJVSUxEX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZW1wb3JhcnkgZm9sZGVyIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLgorICAgIGV4dC5jcm9zc19jb21waWxlID0gdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVuYWJsZSBjcm9zcyBjb21waWxhdGlvbiAocmVxdWlyZXMgY3Jvc3MgY29tcGlsZSB0b29sY2hhaW4pCisgICAgZXh0LmNyb3NzX3BsYXRmb3JtID0gJXdbaTM4Ni1taW5ndzMyIHg2NC1taW5ndzMyXSAgICAgICAgICAgICAgICAgICAgICMgZm9yY2VzIHRoZSBXaW5kb3dzIHBsYXRmb3JtIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lCisgIGVuZAorCisgIEVOVlsnUlVCWV9DQ19WRVJTSU9OJ10gfHw9ICcxLjguNzoxLjkuMzoyLjAuMDoyLjEuNjoyLjIuMjoyLjMuMCcKKworICAjIFRvIHJlZHVjZSB0aGUgZ2VtIGZpbGUgc2l6ZSBzdHJpcCBtaW5ndzMyIGRsbHMgYmVmb3JlIHBhY2thZ2luZworICBFTlZbJ1JVQllfQ0NfVkVSU0lPTiddLnRvX3Muc3BsaXQoJzonKS5lYWNoIGRvIHxydWJ5X3ZlcnNpb258CisgICAgdGFzayAiYnVpbGQvaTM4Ni1taW5ndzMyL3N0YWdlL2xpYi8je3J1YnlfdmVyc2lvblsvXlxkK1wuXGQrL119L2ZmaV9jLnNvIiBkbyB8dHwKKyAgICAgIHNoICJpNjg2LXc2NC1taW5ndzMyLXN0cmlwIC1TIGJ1aWxkL2kzODYtbWluZ3czMi9zdGFnZS9saWIvI3tydWJ5X3ZlcnNpb25bL15cZCtcLlxkKy9dfS9mZmlfYy5zbyIKKyAgICBlbmQKKworICAgIHRhc2sgImJ1aWxkL3g2NC1taW5ndzMyL3N0YWdlL2xpYi8je3J1YnlfdmVyc2lvblsvXlxkK1wuXGQrL119L2ZmaV9jLnNvIiBkbyB8dHwKKyAgICAgIHNoICJ4ODZfNjQtdzY0LW1pbmd3MzItc3RyaXAgLVMgYnVpbGQveDY0LW1pbmd3MzIvc3RhZ2UvbGliLyN7cnVieV92ZXJzaW9uWy9eXGQrXC5cZCsvXX0vZmZpX2Muc28iCisgICAgZW5kCisgIGVuZAorCisgIGRlc2MgImJ1aWxkIGEgd2luZG93cyBnZW0gd2l0aG91dCBhbGwgdGhlIGNlcmVtb255LiIKKyAgdGFzayAiZ2VtOndpbmRvd3MiIGRvCisgICAgcmVxdWlyZSAicmFrZV9jb21waWxlcl9kb2NrIgorICAgIFJha2VDb21waWxlckRvY2suc2ggImJ1bmRsZSAmJiByYWtlIGNyb3NzIG5hdGl2ZSBnZW0gTUFLRT0nbmljZSBtYWtlIC1qYG5wcm9jYCciCisgIGVuZAorZW5kCisKKyRMT0FEX1BBVEgudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJ2xpYicpCityZXF1aXJlICdmZmkvcGxhdGZvcm0nCit0eXBlc19jb25mID0gRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRkZJOjpQbGF0Zm9ybTo6Q09ORl9ESVIsICd0eXBlcy5jb25mJykpCitsb2dmaWxlID0gRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICd0eXBlc19sb2cnKQorCitmaWxlIHR5cGVzX2NvbmYgPT4gRmlsZS5qb2luKCJsaWIiLCAiZmZpIiwgInZlcnNpb24ucmIiKSBkbyB8dGFza3wKKyAgcmVxdWlyZSAnZmlsZXV0aWxzJworICByZXF1aXJlICdmZmkvdG9vbHMvdHlwZXNfZ2VuZXJhdG9yJworICBvcHRpb25zID0ge30KKyAgRmlsZVV0aWxzLm1rZGlyX3AoRmlsZS5kaXJuYW1lKHRhc2submFtZSksIHsgOm1vZGUgPT4gMDc1NSB9KQorICBGaWxlLm9wZW4odGFzay5uYW1lLCBGaWxlOjpDUkVBVHxGaWxlOjpUUlVOQ3xGaWxlOjpSRFdSLCAwNjQ0KSBkbyB8ZnwKKyAgICBmLnB1dHMgRkZJOjpUeXBlc0dlbmVyYXRvci5nZW5lcmF0ZShvcHRpb25zKQorICBlbmQKKyAgRmlsZS5vcGVuKGxvZ2ZpbGUsICd3JykgZG8gfGxvZ3wKKyAgICBsb2cucHV0cyh0eXBlc19jb25mKQorICBlbmQKK2VuZAorCit0YXNrIDp0eXBlc19jb25mID0+IHR5cGVzX2NvbmYgZG8KK2VuZAorCitHZW06OlRhc2tzLm5ldyBkbyB8dHwKKyAgdC5zY20udGFnLmZvcm1hdCA9ICclcycKK2VuZAorCitiZWdpbgorICByZXF1aXJlICd5YXJkJworCisgIG5hbWVzcGFjZSA6ZG9jIGRvCisgICAgWUFSRDo6UmFrZTo6WWFyZG9jVGFzay5uZXcgZG8gfHlhcmR8CisgICAgZW5kCisgIGVuZAorcmVzY3VlIExvYWRFcnJvcgorICB3YXJuICJbd2Fybl0gWUFSRCB1bmF2YWlsYWJsZSIKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvLnNpdGVhcmNoZGlyLnRpbWUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy8uc2l0ZWFyY2hkaXIudGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvLnNpdGVhcmNoZGlyLnRpbWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Fic3RyYWN0TWVtb3J5LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9BYnN0cmFjdE1lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTg4NGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9BYnN0cmFjdE1lbW9yeS5jCkBAIC0wLDAgKzEsMTEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBKYWtlIERvdWdsYXMgPGpha2VAc2hpZnRlZGxhYnMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEx1YyBIZWlucmljaCA8bHVjQGhvbmstaG9uay5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjIGluY2x1ZGUgPHN0ZGludC5oPgorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjZWxzZQorIyBpbmNsdWRlICJ3aW4zMi9zdGRib29sLmgiCisjIGluY2x1ZGUgIndpbjMyL3N0ZGludC5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxydWJ5Lmg+CisKKyNpbmNsdWRlICJyYmZmaS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgIkFic3RyYWN0TWVtb3J5LmgiCisjaW5jbHVkZSAiUG9pbnRlci5oIgorI2luY2x1ZGUgIkZ1bmN0aW9uLmgiCisjaW5jbHVkZSAiTG9uZ0RvdWJsZS5oIgorCisjaWZuZGVmIFBSSXNWQUxVRQorIyBkZWZpbmUgUFJJc1ZBTFVFICJzIgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgY2hhciogbWVtb3J5X2FkZHJlc3MoVkFMVUUgc2VsZik7CitWQUxVRSByYmZmaV9BYnN0cmFjdE1lbW9yeUNsYXNzID0gUW5pbDsKK3N0YXRpYyBWQUxVRSBOdWxsUG9pbnRlckVycm9yQ2xhc3MgPSBRbmlsOworc3RhdGljIElEIGlkX3RvX3B0ciA9IDAsIGlkX3BsdXMgPSAwLCBpZF9jYWxsID0gMDsKKworc3RhdGljIFZBTFVFCittZW1vcnlfYWxsb2NhdGUoVkFMVUUga2xhc3MpCit7CisgICAgQWJzdHJhY3RNZW1vcnkqIG1lbW9yeTsKKyAgICBWQUxVRSBvYmo7CisgICAgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgQWJzdHJhY3RNZW1vcnksIE5VTEwsIC0xLCBtZW1vcnkpOworICAgIG1lbW9yeS0+ZmxhZ3MgPSBNRU1fUkQgfCBNRU1fV1I7CisKKyAgICByZXR1cm4gb2JqOworfQorI2RlZmluZSBWQUwoeCwgc3dhcCkgKHVubGlrZWx5KCgobWVtb3J5LT5mbGFncyAmIE1FTV9TV0FQKSAhPSAwKSkgPyBzd2FwKCh4KSkgOiAoeCkpCisKKyNkZWZpbmUgTlVNX09QKG5hbWUsIHR5cGUsIHRvTmF0aXZlLCBmcm9tTmF0aXZlLCBzd2FwKSBcCitzdGF0aWMgdm9pZCBtZW1vcnlfb3BfcHV0XyMjbmFtZShBYnN0cmFjdE1lbW9yeSogbWVtb3J5LCBsb25nIG9mZiwgVkFMVUUgdmFsdWUpOyBcCitzdGF0aWMgdm9pZCBcCittZW1vcnlfb3BfcHV0XyMjbmFtZShBYnN0cmFjdE1lbW9yeSogbWVtb3J5LCBsb25nIG9mZiwgVkFMVUUgdmFsdWUpIFwKK3sgXAorICAgIHR5cGUgdG1wID0gKHR5cGUpIFZBTCh0b05hdGl2ZSh2YWx1ZSksIHN3YXApOyBcCisgICAgY2hlY2tXcml0ZShtZW1vcnkpOyBcCisgICAgY2hlY2tCb3VuZHMobWVtb3J5LCBvZmYsIHNpemVvZih0eXBlKSk7IFwKKyAgICBtZW1jcHkobWVtb3J5LT5hZGRyZXNzICsgb2ZmLCAmdG1wLCBzaXplb2YodG1wKSk7IFwKK30gXAorc3RhdGljIFZBTFVFIG1lbW9yeV9wdXRfIyNuYW1lKFZBTFVFIHNlbGYsIFZBTFVFIG9mZnNldCwgVkFMVUUgdmFsdWUpOyBcCitzdGF0aWMgVkFMVUUgXAorbWVtb3J5X3B1dF8jI25hbWUoVkFMVUUgc2VsZiwgVkFMVUUgb2Zmc2V0LCBWQUxVRSB2YWx1ZSkgXAoreyBcCisgICAgQWJzdHJhY3RNZW1vcnkqIG1lbW9yeTsgXAorICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBBYnN0cmFjdE1lbW9yeSwgbWVtb3J5KTsgXAorICAgIG1lbW9yeV9vcF9wdXRfIyNuYW1lKG1lbW9yeSwgTlVNMkxPTkcob2Zmc2V0KSwgdmFsdWUpOyBcCisgICAgcmV0dXJuIHNlbGY7IFwKK30gXAorc3RhdGljIFZBTFVFIG1lbW9yeV93cml0ZV8jI25hbWUoVkFMVUUgc2VsZiwgVkFMVUUgdmFsdWUpOyBcCitzdGF0aWMgVkFMVUUgXAorbWVtb3J5X3dyaXRlXyMjbmFtZShWQUxVRSBzZWxmLCBWQUxVRSB2YWx1ZSkgXAoreyBcCisgICAgQWJzdHJhY3RNZW1vcnkqIG1lbW9yeTsgXAorICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBBYnN0cmFjdE1lbW9yeSwgbWVtb3J5KTsgXAorICAgIG1lbW9yeV9vcF9wdXRfIyNuYW1lKG1lbW9yeSwgMCwgdmFsdWUpOyBcCisgICAgcmV0dXJuIHNlbGY7IFwKK30gXAorc3RhdGljIFZBTFVFIG1lbW9yeV9vcF9nZXRfIyNuYW1lKEFic3RyYWN0TWVtb3J5KiBtZW1vcnksIGxvbmcgb2ZmKTsgXAorc3RhdGljIFZBTFVFIFwKK21lbW9yeV9vcF9nZXRfIyNuYW1lKEFic3RyYWN0TWVtb3J5KiBtZW1vcnksIGxvbmcgb2ZmKSBcCit7IFwKKyAgICB0eXBlIHRtcDsgXAorICAgIGNoZWNrUmVhZChtZW1vcnkpOyBcCisgICAgY2hlY2tCb3VuZHMobWVtb3J5LCBvZmYsIHNpemVvZih0eXBlKSk7IFwKKyAgICBtZW1jcHkoJnRtcCwgbWVtb3J5LT5hZGRyZXNzICsgb2ZmLCBzaXplb2YodG1wKSk7IFwKKyAgICByZXR1cm4gZnJvbU5hdGl2ZShWQUwodG1wLCBzd2FwKSk7IFwKK30gXAorc3RhdGljIFZBTFVFIG1lbW9yeV9nZXRfIyNuYW1lKFZBTFVFIHNlbGYsIFZBTFVFIG9mZnNldCk7IFwKK3N0YXRpYyBWQUxVRSBcCittZW1vcnlfZ2V0XyMjbmFtZShWQUxVRSBzZWxmLCBWQUxVRSBvZmZzZXQpIFwKK3sgXAorICAgIEFic3RyYWN0TWVtb3J5KiBtZW1vcnk7IFwKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgQWJzdHJhY3RNZW1vcnksIG1lbW9yeSk7IFwKKyAgICByZXR1cm4gbWVtb3J5X29wX2dldF8jI25hbWUobWVtb3J5LCBOVU0yTE9ORyhvZmZzZXQpKTsgXAorfSBcCitzdGF0aWMgVkFMVUUgbWVtb3J5X3JlYWRfIyNuYW1lKFZBTFVFIHNlbGYpOyBcCitzdGF0aWMgVkFMVUUgXAorbWVtb3J5X3JlYWRfIyNuYW1lKFZBTFVFIHNlbGYpIFwKK3sgXAorICAgIEFic3RyYWN0TWVtb3J5KiBtZW1vcnk7IFwKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgQWJzdHJhY3RNZW1vcnksIG1lbW9yeSk7IFwKKyAgICByZXR1cm4gbWVtb3J5X29wX2dldF8jI25hbWUobWVtb3J5LCAwKTsgXAorfSBcCitzdGF0aWMgTWVtb3J5T3AgbWVtb3J5X29wXyMjbmFtZSA9IHsgbWVtb3J5X29wX2dldF8jI25hbWUsIG1lbW9yeV9vcF9wdXRfIyNuYW1lIH07IFwKK1wKK3N0YXRpYyBWQUxVRSBtZW1vcnlfcHV0X2FycmF5X29mXyMjbmFtZShWQUxVRSBzZWxmLCBWQUxVRSBvZmZzZXQsIFZBTFVFIGFyeSk7IFwKK3N0YXRpYyBWQUxVRSBcCittZW1vcnlfcHV0X2FycmF5X29mXyMjbmFtZShWQUxVRSBzZWxmLCBWQUxVRSBvZmZzZXQsIFZBTFVFIGFyeSkgXAoreyBcCisgICAgbG9uZyBjb3VudCA9IFJBUlJBWV9MRU4oYXJ5KTsgXAorICAgIGxvbmcgb2ZmID0gTlVNMkxPTkcob2Zmc2V0KTsgXAorICAgIEFic3RyYWN0TWVtb3J5KiBtZW1vcnkgPSBNRU1PUlkoc2VsZik7IFwKKyAgICBsb25nIGk7IFwKKyAgICBjaGVja1dyaXRlKG1lbW9yeSk7IFwKKyAgICBjaGVja0JvdW5kcyhtZW1vcnksIG9mZiwgY291bnQgKiBzaXplb2YodHlwZSkpOyBcCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsgXAorICAgICAgICB0eXBlIHRtcCA9ICh0eXBlKSBWQUwodG9OYXRpdmUoUkFSUkFZX1BUUihhcnkpW2ldKSwgc3dhcCk7IFwKKyAgICAgICAgbWVtY3B5KG1lbW9yeS0+YWRkcmVzcyArIG9mZiArIChpICogc2l6ZW9mKHR5cGUpKSwgJnRtcCwgc2l6ZW9mKHRtcCkpOyBcCisgICAgfSBcCisgICAgcmV0dXJuIHNlbGY7IFwKK30gXAorc3RhdGljIFZBTFVFIG1lbW9yeV93cml0ZV9hcnJheV9vZl8jI25hbWUoVkFMVUUgc2VsZiwgVkFMVUUgYXJ5KTsgXAorc3RhdGljIFZBTFVFIFwKK21lbW9yeV93cml0ZV9hcnJheV9vZl8jI25hbWUoVkFMVUUgc2VsZiwgVkFMVUUgYXJ5KSBcCit7IFwKKyAgICByZXR1cm4gbWVtb3J5X3B1dF9hcnJheV9vZl8jI25hbWUoc2VsZiwgSU5UMkZJWCgwKSwgYXJ5KTsgXAorfSBcCitzdGF0aWMgVkFMVUUgbWVtb3J5X2dldF9hcnJheV9vZl8jI25hbWUoVkFMVUUgc2VsZiwgVkFMVUUgb2Zmc2V0LCBWQUxVRSBsZW5ndGgpOyBcCitzdGF0aWMgVkFMVUUgXAorbWVtb3J5X2dldF9hcnJheV9vZl8jI25hbWUoVkFMVUUgc2VsZiwgVkFMVUUgb2Zmc2V0LCBWQUxVRSBsZW5ndGgpIFwKK3sgXAorICAgIGxvbmcgY291bnQgPSBOVU0yTE9ORyhsZW5ndGgpOyBcCisgICAgbG9uZyBvZmYgPSBOVU0yTE9ORyhvZmZzZXQpOyBcCisgICAgQWJzdHJhY3RNZW1vcnkqIG1lbW9yeSA9IE1FTU9SWShzZWxmKTsgXAorICAgIFZBTFVFIHJldFZhbCA9IHJiX2FyeV9uZXcyKGNvdW50KTsgXAorICAgIGxvbmcgaTsgXAorICAgIGNoZWNrUmVhZChtZW1vcnkpOyBcCisgICAgY2hlY2tCb3VuZHMobWVtb3J5LCBvZmYsIGNvdW50ICogc2l6ZW9mKHR5cGUpKTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7IFwKKyAgICAgICAgdHlwZSB0bXA7IFwKKyAgICAgICAgbWVtY3B5KCZ0bXAsIG1lbW9yeS0+YWRkcmVzcyArIG9mZiArIChpICogc2l6ZW9mKHR5cGUpKSwgc2l6ZW9mKHRtcCkpOyBcCisgICAgICAgIHJiX2FyeV9wdXNoKHJldFZhbCwgZnJvbU5hdGl2ZShWQUwodG1wLCBzd2FwKSkpOyBcCisgICAgfSBcCisgICAgcmV0dXJuIHJldFZhbDsgXAorfSBcCitzdGF0aWMgVkFMVUUgbWVtb3J5X3JlYWRfYXJyYXlfb2ZfIyNuYW1lKFZBTFVFIHNlbGYsIFZBTFVFIGxlbmd0aCk7IFwKK3N0YXRpYyBWQUxVRSBcCittZW1vcnlfcmVhZF9hcnJheV9vZl8jI25hbWUoVkFMVUUgc2VsZiwgVkFMVUUgbGVuZ3RoKSBcCit7IFwKKyAgICByZXR1cm4gbWVtb3J5X2dldF9hcnJheV9vZl8jI25hbWUoc2VsZiwgSU5UMkZJWCgwKSwgbGVuZ3RoKTsgXAorfQorCisjZGVmaW5lIE5PU1dBUCh4KSAoeCkKKyNkZWZpbmUgYnN3YXAxNih4KSAoKCh4KSA+PiA4KSAmIDB4ZmYpIHwgKCgoeCkgPDwgOCkgJiAweGZmMDApOworc3RhdGljIGlubGluZSBpbnQxNl90CitTV0FQUzE2KGludDE2X3QgeCkKK3sKKyAgICByZXR1cm4gYnN3YXAxNih4KTsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdAorU1dBUFUxNih1aW50MTZfdCB4KQoreworICAgIHJldHVybiBic3dhcDE2KHgpOworfQorCisjaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA8IDQpIHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fIDwgMykKKyNkZWZpbmUgYnN3YXAzMih4KSBcCisgICAgICAgKCgoeCA8PCAyNCkgJiAweGZmMDAwMDAwKSB8IFwKKyAgICAgICAgKCh4IDw8ICA4KSAmIDB4MDBmZjAwMDApIHwgXAorICAgICAgICAoKHggPj4gIDgpICYgMHgwMDAwZmYwMCkgfCBcCisgICAgICAgICgoeCA+PiAyNCkgJiAweDAwMDAwMGZmKSkKKworI2RlZmluZSBic3dhcDY0KHgpIFwKKyAgICAgICAoKCh4IDw8IDU2KSAmIDB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgfCBcCisgICAgICAgICgoeCA8PCA0MCkgJiAweDAwZmYwMDAwMDAwMDAwMDBVTEwpIHwgXAorICAgICAgICAoKHggPDwgMjQpICYgMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgKCh4IDw8ICA4KSAmIDB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgfCBcCisgICAgICAgICgoeCA+PiAgOCkgJiAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIHwgXAorICAgICAgICAoKHggPj4gMjQpICYgMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSB8IFwKKyAgICAgICAgKCh4ID4+IDQwKSAmIDB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgfCBcCisgICAgICAgICgoeCA+PiA1NikgJiAweDAwMDAwMDAwMDAwMDAwZmZVTEwpKQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgCitTV0FQUzMyKGludDMyX3QgeCkKK3sKKyAgICByZXR1cm4gYnN3YXAzMih4KTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCAKK1NXQVBVMzIodWludDMyX3QgeCkKK3sKKyAgICByZXR1cm4gYnN3YXAzMih4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQ2NF90CitTV0FQUzY0KGludDY0X3QgeCkKK3sKKyAgICByZXR1cm4gYnN3YXA2NCh4KTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdAorU1dBUFU2NCh1aW50NjRfdCB4KQoreworICAgIHJldHVybiBic3dhcDY0KHgpOworfQorCisjZWxzZQorIyBkZWZpbmUgU1dBUFMzMih4KSAoKGludDMyX3QpIF9fYnVpbHRpbl9ic3dhcDMyKHgpKQorIyBkZWZpbmUgU1dBUFUzMih4KSAoKHVpbnQzMl90KSBfX2J1aWx0aW5fYnN3YXAzMih4KSkKKyMgZGVmaW5lIFNXQVBTNjQoeCkgKChpbnQ2NF90KSBfX2J1aWx0aW5fYnN3YXA2NCh4KSkKKyMgZGVmaW5lIFNXQVBVNjQoeCkgKCh1aW50NjRfdCkgX19idWlsdGluX2Jzd2FwNjQoeCkpCisjZW5kaWYKKworI2lmIExPTkdfTUFYID4gSU5UX01BWAorIyBkZWZpbmUgU1dBUFNMT05HIFNXQVBTNjQKKyMgZGVmaW5lIFNXQVBVTE9ORyBTV0FQVTY0CisjZWxzZQorIyBkZWZpbmUgU1dBUFNMT05HIFNXQVBTMzIKKyMgZGVmaW5lIFNXQVBVTE9ORyBTV0FQVTMyCisjZW5kaWYKKworTlVNX09QKGludDgsIGludDhfdCwgTlVNMklOVCwgSU5UMk5VTSwgTk9TV0FQKTsKK05VTV9PUCh1aW50OCwgdWludDhfdCwgTlVNMlVJTlQsIFVJTlQyTlVNLCBOT1NXQVApOworTlVNX09QKGludDE2LCBpbnQxNl90LCBOVU0ySU5ULCBJTlQyTlVNLCBTV0FQUzE2KTsKK05VTV9PUCh1aW50MTYsIHVpbnQxNl90LCBOVU0yVUlOVCwgVUlOVDJOVU0sIFNXQVBVMTYpOworTlVNX09QKGludDMyLCBpbnQzMl90LCBOVU0ySU5ULCBJTlQyTlVNLCBTV0FQUzMyKTsKK05VTV9PUCh1aW50MzIsIHVpbnQzMl90LCBOVU0yVUlOVCwgVUlOVDJOVU0sIFNXQVBVMzIpOworTlVNX09QKGludDY0LCBpbnQ2NF90LCBOVU0yTEwsIExMMk5VTSwgU1dBUFM2NCk7CitOVU1fT1AodWludDY0LCB1aW50NjRfdCwgTlVNMlVMTCwgVUxMMk5VTSwgU1dBUFU2NCk7CitOVU1fT1AobG9uZywgbG9uZywgTlVNMkxPTkcsIExPTkcyTlVNLCBTV0FQU0xPTkcpOworTlVNX09QKHVsb25nLCB1bnNpZ25lZCBsb25nLCBOVU0yVUxPTkcsIFVMT05HMk5VTSwgU1dBUFVMT05HKTsKK05VTV9PUChmbG9hdDMyLCBmbG9hdCwgTlVNMkRCTCwgcmJfZmxvYXRfbmV3LCBOT1NXQVApOworTlVNX09QKGZsb2F0NjQsIGRvdWJsZSwgTlVNMkRCTCwgcmJfZmxvYXRfbmV3LCBOT1NXQVApOworTlVNX09QKGxvbmdkb3VibGUsIGxvbmcgZG91YmxlLCByYmZmaV9udW0ybG9uZ2RvdWJsZSwgcmJmZmlfbG9uZ2RvdWJsZV9uZXcsIE5PU1dBUCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCoKK2dldF9wb2ludGVyX3ZhbHVlKFZBTFVFIHZhbHVlKQoreworICAgIGNvbnN0IGludCB0eXBlID0gVFlQRSh2YWx1ZSk7CisgICAgaWYgKHR5cGUgPT0gVF9EQVRBICYmIHJiX29ial9pc19raW5kX29mKHZhbHVlLCByYmZmaV9Qb2ludGVyQ2xhc3MpKSB7CisgICAgICAgIHJldHVybiBtZW1vcnlfYWRkcmVzcyh2YWx1ZSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IFRfTklMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUX0ZJWE5VTSkgeworICAgICAgICByZXR1cm4gKHZvaWQgKikgKHVpbnRwdHJfdCkgRklYMlVMT05HKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVF9CSUdOVU0pIHsKKyAgICAgICAgcmV0dXJuICh2b2lkICopICh1aW50cHRyX3QpIE5VTTJVTEwodmFsdWUpOworICAgIH0gZWxzZSBpZiAocmJfcmVzcG9uZF90byh2YWx1ZSwgaWRfdG9fcHRyKSkgeworICAgICAgICByZXR1cm4gTUVNT1JZX1BUUihyYl9mdW5jYWxsMih2YWx1ZSwgaWRfdG9fcHRyLCAwLCBOVUxMKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAidmFsdWUgaXMgbm90IGEgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK05VTV9PUChwb2ludGVyLCB2b2lkICosIGdldF9wb2ludGVyX3ZhbHVlLCByYmZmaV9Qb2ludGVyX05ld0luc3RhbmNlLCBOT1NXQVApOworCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QKK3JiZmZpX2Jvb2xfdmFsdWUoVkFMVUUgdmFsdWUpCit7CisgICAgcmV0dXJuIFJURVNUKHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBWQUxVRQorcmJmZmlfYm9vbF9uZXcodWludDhfdCB2YWx1ZSkKK3sKKyAgICByZXR1cm4gKHZhbHVlICYgMSkgIT0gMCA/IFF0cnVlIDogUWZhbHNlOworfQorCitOVU1fT1AoYm9vbCwgdW5zaWduZWQgY2hhciwgcmJmZmlfYm9vbF92YWx1ZSwgcmJmZmlfYm9vbF9uZXcsIE5PU1dBUCk7CisKKworLyoKKyAqIGNhbGwtc2VxOiBtZW1vcnkuY2xlYXIKKyAqIFNldCB0aGUgbWVtb3J5IHRvIGFsbC16ZXJvLgorICogQHJldHVybiBbc2VsZl0KKyAqLworc3RhdGljIFZBTFVFCittZW1vcnlfY2xlYXIoVkFMVUUgc2VsZikKK3sKKyAgICBBYnN0cmFjdE1lbW9yeSogcHRyID0gTUVNT1JZKHNlbGYpOworICAgIG1lbXNldChwdHItPmFkZHJlc3MsIDAsIHB0ci0+c2l6ZSk7CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbWVtb3J5LnNpemUKKyAqIFJldHVybiBtZW1vcnkgc2l6ZSBpbiBieXRlcyAoYWxpYXM6ICN0b3RhbCkKKyAqIEByZXR1cm4gW051bWVyaWNdCisgKi8KK3N0YXRpYyBWQUxVRQorbWVtb3J5X3NpemUoVkFMVUUgc2VsZikKK3sKKyAgICBBYnN0cmFjdE1lbW9yeSogcHRyOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEFic3RyYWN0TWVtb3J5LCBwdHIpOworCisgICAgcmV0dXJuIExPTkcyTlVNKHB0ci0+c2l6ZSk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbWVtb3J5LmdldCh0eXBlLCBvZmZzZXQpCisgKiBSZXR1cm4gZGF0YSBvZiBnaXZlbiB0eXBlIGNvbnRhaW5lZCBpbiBtZW1vcnkuCisgKiBAcGFyYW0gW1N5bWJvbCwgVHlwZV0gdHlwZV9uYW1lIHR5cGUgb2YgZGF0YSB0byBnZXQKKyAqIEBwYXJhbSBbTnVtZXJpY10gb2Zmc2V0IHBvaW50IGluIGJ1ZmZlciB0byBzdGFydCBmcm9tCisgKiBAcmV0dXJuIFtPYmplY3RdCisgKiBAcmFpc2Uge0FyZ3VtZW50RXJyb3J9IGlmIHR5cGUgaXMgbm90IHN1cHBvcnRlZAorICovCitzdGF0aWMgVkFMVUUKK21lbW9yeV9nZXQoVkFMVUUgc2VsZiwgVkFMVUUgdHlwZV9uYW1lLCBWQUxVRSBvZmZzZXQpCit7CisgICAgQWJzdHJhY3RNZW1vcnkqIHB0cjsKKyAgICBWQUxVRSBuVHlwZTsKKyAgICBUeXBlICp0eXBlOworCisgICAgblR5cGUgPSByYmZmaV9UeXBlX0xvb2t1cCh0eXBlX25hbWUpOworICAgIGlmKE5JTF9QKG5UeXBlKSkgZ290byB1bmRlZmluZWRfdHlwZTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBBYnN0cmFjdE1lbW9yeSwgcHRyKTsKKyAgICBEYXRhX0dldF9TdHJ1Y3QoblR5cGUsIFR5cGUsIHR5cGUpOworCisgICAgTWVtb3J5T3AgKm9wID0gZ2V0X21lbW9yeV9vcCh0eXBlKTsKKyAgICBpZihvcCA9PSBOVUxMKSBnb3RvIHVuZGVmaW5lZF90eXBlOworCisgICAgcmV0dXJuIG9wLT5nZXQocHRyLCBOVU0yTE9ORyhvZmZzZXQpKTsKKwordW5kZWZpbmVkX3R5cGU6IHsKKyAgICBWQUxVRSBtc2cgPSByYl9zcHJpbnRmKCJ1bmRlZmluZWQgdHlwZSAnJSIgUFJJc1ZBTFVFICInIiwgdHlwZV9uYW1lKTsKKyAgICByYl9leGNfcmFpc2UocmJfZXhjX25ldzMocmJfZUFyZ0Vycm9yLCBtc2cpKTsKKyAgICByZXR1cm4gUW5pbDsKKyAgfQorfQorCisvKgorICogY2FsbC1zZXE6IG1lbW9yeS5wdXQodHlwZSwgb2Zmc2V0LCB2YWx1ZSkKKyAqIEBwYXJhbSBbU3ltYm9sLCBUeXBlXSB0eXBlX25hbWUgdHlwZSBvZiBkYXRhIHRvIHB1dAorICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQgcG9pbnQgaW4gYnVmZmVyIHRvIHN0YXJ0IGZyb20KKyAqIEByZXR1cm4gW25pbF0KKyAqIEByYWlzZSB7QXJndW1lbnRFcnJvcn0gaWYgdHlwZSBpcyBub3Qgc3VwcG9ydGVkCisgKi8KK3N0YXRpYyBWQUxVRQorbWVtb3J5X3B1dChWQUxVRSBzZWxmLCBWQUxVRSB0eXBlX25hbWUsIFZBTFVFIG9mZnNldCwgVkFMVUUgdmFsdWUpCit7CisgICAgQWJzdHJhY3RNZW1vcnkqIHB0cjsKKyAgICBWQUxVRSBuVHlwZTsKKyAgICBUeXBlICp0eXBlOworCisgICAgblR5cGUgPSByYmZmaV9UeXBlX0xvb2t1cCh0eXBlX25hbWUpOworICAgIGlmKE5JTF9QKG5UeXBlKSkgZ290byB1bmRlZmluZWRfdHlwZTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBBYnN0cmFjdE1lbW9yeSwgcHRyKTsKKyAgICBEYXRhX0dldF9TdHJ1Y3QoblR5cGUsIFR5cGUsIHR5cGUpOworCisgICAgTWVtb3J5T3AgKm9wID0gZ2V0X21lbW9yeV9vcCh0eXBlKTsKKyAgICBpZihvcCA9PSBOVUxMKSBnb3RvIHVuZGVmaW5lZF90eXBlOworCisgICAgb3AtPnB1dChwdHIsIE5VTTJMT05HKG9mZnNldCksIHZhbHVlKTsKKyAgICByZXR1cm4gUW5pbDsKKwordW5kZWZpbmVkX3R5cGU6IHsKKyAgICBWQUxVRSBtc2cgPSByYl9zcHJpbnRmKCJ1bnN1cHBvcnRlZCB0eXBlICclIiBQUklzVkFMVUUgIiciLCB0eXBlX25hbWUpOworICAgIHJiX2V4Y19yYWlzZShyYl9leGNfbmV3MyhyYl9lQXJnRXJyb3IsIG1zZykpOworICAgIHJldHVybiBRbmlsOworICB9Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbWVtb3J5LmdldF9zdHJpbmcob2Zmc2V0LCBsZW5ndGg9bmlsKQorICogUmV0dXJuIHN0cmluZyBjb250YWluZWQgaW4gbWVtb3J5LgorICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQgcG9pbnQgaW4gYnVmZmVyIHRvIHN0YXJ0IGZyb20KKyAqIEBwYXJhbSBbTnVtZXJpY10gbGVuZ3RoIHN0cmluZydzIGxlbmd0aCBpbiBieXRlcy4gSWYgbmlsLCBhIChtZW1vcnkgc2l6ZSAtIG9mZnNldCkgbGVuZ3RoIHN0cmluZyBpcyByZXR1cm5lZCkuCisgKiBAcmV0dXJuIFtTdHJpbmddCisgKiBAcmFpc2Uge0luZGV4RXJyb3J9IGlmICtsZW5ndGgrIGlzIHRvbyBncmVhdAorICogQHJhaXNlIHtOdWxsUG9pbnRlckVycm9yfSBpZiBtZW1vcnkgbm90IGluaXRpYWxpemVkCisgKi8KK3N0YXRpYyBWQUxVRQorbWVtb3J5X2dldF9zdHJpbmcoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKQoreworICAgIFZBTFVFIGxlbmd0aCA9IFFuaWwsIG9mZnNldCA9IFFuaWw7CisgICAgQWJzdHJhY3RNZW1vcnkqIHB0ciA9IE1FTU9SWShzZWxmKTsKKyAgICBsb25nIG9mZiwgbGVuOworICAgIGNoYXIqIGVuZDsKKyAgICBpbnQgbmFyZ3MgPSByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjExIiwgJm9mZnNldCwgJmxlbmd0aCk7CisKKyAgICBvZmYgPSBOVU0yTE9ORyhvZmZzZXQpOworICAgIGxlbiA9IG5hcmdzID4gMSAmJiBsZW5ndGggIT0gUW5pbCA/IE5VTTJMT05HKGxlbmd0aCkgOiAocHRyLT5zaXplIC0gb2ZmKTsKKyAgICBjaGVja1JlYWQocHRyKTsKKyAgICBjaGVja0JvdW5kcyhwdHIsIG9mZiwgbGVuKTsKKworICAgIGVuZCA9IG1lbWNocihwdHItPmFkZHJlc3MgKyBvZmYsIDAsIGxlbik7CisgICAgcmV0dXJuIHJiX3RhaW50ZWRfc3RyX25ldygoY2hhciAqKSBwdHItPmFkZHJlc3MgKyBvZmYsCisgICAgICAgICAgICAoZW5kICE9IE5VTEwgPyBlbmQgLSBwdHItPmFkZHJlc3MgLSBvZmYgOiBsZW4pKTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBtZW1vcnkuZ2V0X2FycmF5X29mX3N0cmluZyhvZmZzZXQsIGNvdW50PW5pbCkKKyAqIFJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5lZCBpbiBtZW1vcnkuCisgKiBAcGFyYW0gW051bWVyaWNdIG9mZnNldCBwb2ludCBpbiBtZW1vcnkgdG8gc3RhcnQgZnJvbQorICogQHBhcmFtIFtOdW1lcmljXSBjb3VudCBudW1iZXIgb2Ygc3RyaW5ncyB0byBnZXQuIElmIG5pbCwgcmV0dXJuIGFsbCBzdHJpbmdzCisgKiBAcmV0dXJuIFtBcnJheTxTdHJpbmc+XQorICogQHJhaXNlIHtJbmRleEVycm9yfSBpZiArb2Zmc2V0KyBpcyB0b28gZ3JlYXQKKyAqIEByYWlzZSB7TnVsbFBvaW50ZXJFcnJvcn0gaWYgbWVtb3J5IG5vdCBpbml0aWFsaXplZAorICovCitzdGF0aWMgVkFMVUUKK21lbW9yeV9nZXRfYXJyYXlfb2Zfc3RyaW5nKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZikKK3sKKyAgICBWQUxVRSBvZmZzZXQgPSBRbmlsLCBjb3VudG51bSA9IFFuaWwsIHJldFZhbCA9IFFuaWw7CisgICAgQWJzdHJhY3RNZW1vcnkqIHB0cjsKKyAgICBsb25nIG9mZjsKKyAgICBpbnQgY291bnQ7CisKKyAgICByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjExIiwgJm9mZnNldCwgJmNvdW50bnVtKTsKKyAgICBvZmYgPSBOVU0yTE9ORyhvZmZzZXQpOworICAgIGNvdW50ID0gKGNvdW50bnVtID09IFFuaWwgPyAwIDogTlVNMklOVChjb3VudG51bSkpOworICAgIHJldFZhbCA9IHJiX2FyeV9uZXcyKGNvdW50KTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBBYnN0cmFjdE1lbW9yeSwgcHRyKTsKKyAgICBjaGVja1JlYWQocHRyKTsKKworICAgIGlmIChjb3VudG51bSAhPSBRbmlsKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGNoZWNrQm91bmRzKHB0ciwgb2ZmLCBjb3VudCAqIHNpemVvZiAoY2hhciopKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHJwdHIgPSAqKChjb25zdCBjaGFyKiopIChwdHItPmFkZHJlc3MgKyBvZmYpICsgaSk7CisgICAgICAgICAgICByYl9hcnlfcHVzaChyZXRWYWwsIChzdHJwdHIgPT0gTlVMTCA/IFFuaWwgOiByYl90YWludGVkX3N0cl9uZXcyKHN0cnB0cikpKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hlY2tCb3VuZHMocHRyLCBvZmYsIHNpemVvZiAoY2hhciopKTsKKyAgICAgICAgZm9yICggOyBvZmYgPCBwdHItPnNpemUgLSAobG9uZykgc2l6ZW9mICh2b2lkICopOyBvZmYgKz0gKGxvbmcpIHNpemVvZiAodm9pZCAqKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciogc3RycHRyID0gKihjb25zdCBjaGFyKiopIChwdHItPmFkZHJlc3MgKyBvZmYpOworICAgICAgICAgICAgaWYgKHN0cnB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYl9hcnlfcHVzaChyZXRWYWwsIHJiX3RhaW50ZWRfc3RyX25ldzIoc3RycHRyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCisvKgorICogY2FsbC1zZXE6IG1lbW9yeS5yZWFkX2FycmF5X29mX3N0cmluZyhjb3VudD1uaWwpCisgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluZWQgaW4gbWVtb3J5LiBTYW1lIGFzOgorICogIG1lbW9yeS5nZXRfYXJyYXlfb2Zfc3RyaW5nKDAsIGNvdW50KQorICogQHBhcmFtIFtOdW1lcmljXSBjb3VudCBudW1iZXIgb2Ygc3RyaW5ncyB0byBnZXQuIElmIG5pbCwgcmV0dXJuIGFsbCBzdHJpbmdzCisgKiBAcmV0dXJuIFtBcnJheTxTdHJpbmc+XQorICovCitzdGF0aWMgVkFMVUUgCittZW1vcnlfcmVhZF9hcnJheV9vZl9zdHJpbmcoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKQoreworICAgIFZBTFVFKiByYXJndiA9IEFMTE9DQV9OKFZBTFVFLCBhcmdjICsgMSk7CisgICAgaW50IGk7CisKKyAgICByYXJndlswXSA9IElOVDJGSVgoMCk7CisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICByYXJndltpICsgMV0gPSBhcmd2W2ldOworICAgIH0KKworICAgIHJldHVybiBtZW1vcnlfZ2V0X2FycmF5X29mX3N0cmluZyhhcmdjICsgMSwgcmFyZ3YsIHNlbGYpOworfQorCisKKy8qCisgKiBjYWxsLXNlcTogbWVtb3J5LnB1dF9zdHJpbmcob2Zmc2V0LCBzdHIpCisgKiBAcGFyYW0gW051bWVyaWNdIG9mZnNldAorICogQHBhcmFtIFtTdHJpbmddIHN0cgorICogQHJldHVybiBbc2VsZl0KKyAqIEByYWlzZSB7U2VjdXJpdHlFcnJvcn0gd2hlbiB3cml0aW5nIHVuc2FmZSBzdHJpbmcgdG8gbWVtb3J5CisgKiBAcmFpc2Uge0luZGV4RXJyb3J9IGlmICtvZmZzZXQrIGlzIHRvbyBncmVhdAorICogQHJhaXNlIHtOdWxsUG9pbnRlckVycm9yfSBpZiBtZW1vcnkgbm90IGluaXRpYWxpemVkCisgKiBQdXQgYSBzdHJpbmcgaW4gbWVtb3J5LgorICovCitzdGF0aWMgVkFMVUUKK21lbW9yeV9wdXRfc3RyaW5nKFZBTFVFIHNlbGYsIFZBTFVFIG9mZnNldCwgVkFMVUUgc3RyKQoreworICAgIEFic3RyYWN0TWVtb3J5KiBwdHIgPSBNRU1PUlkoc2VsZik7CisgICAgbG9uZyBvZmYsIGxlbjsKKworICAgIENoZWNrX1R5cGUoc3RyLCBUX1NUUklORyk7CisgICAgb2ZmID0gTlVNMkxPTkcob2Zmc2V0KTsKKyAgICBsZW4gPSBSU1RSSU5HX0xFTihzdHIpOworCisgICAgY2hlY2tXcml0ZShwdHIpOworICAgIGNoZWNrQm91bmRzKHB0ciwgb2ZmLCBsZW4gKyAxKTsKKworICAgIG1lbWNweShwdHItPmFkZHJlc3MgKyBvZmYsIFJTVFJJTkdfUFRSKHN0ciksIGxlbik7CisgICAgKigoY2hhciAqKSBwdHItPmFkZHJlc3MgKyBvZmYgKyBsZW4pID0gJ1wwJzsKKworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogY2FsbC1zZXE6IG1lbW9yeS5nZXRfYnl0ZXMob2Zmc2V0LCBsZW5ndGgpCisgKiBSZXR1cm4gc3RyaW5nIGNvbnRhaW5lZCBpbiBtZW1vcnkuCisgKiBAcGFyYW0gW051bWVyaWNdIG9mZnNldCBwb2ludCBpbiBidWZmZXIgdG8gc3RhcnQgZnJvbQorICogQHBhcmFtIFtOdW1lcmljXSBsZW5ndGggc3RyaW5nJ3MgbGVuZ3RoIGluIGJ5dGVzLgorICogQHJldHVybiBbU3RyaW5nXQorICogQHJhaXNlIHtJbmRleEVycm9yfSBpZiArbGVuZ3RoKyBpcyB0b28gZ3JlYXQKKyAqIEByYWlzZSB7TnVsbFBvaW50ZXJFcnJvcn0gaWYgbWVtb3J5IG5vdCBpbml0aWFsaXplZAorICovCitzdGF0aWMgVkFMVUUKK21lbW9yeV9nZXRfYnl0ZXMoVkFMVUUgc2VsZiwgVkFMVUUgb2Zmc2V0LCBWQUxVRSBsZW5ndGgpCit7CisgICAgQWJzdHJhY3RNZW1vcnkqIHB0ciA9IE1FTU9SWShzZWxmKTsKKyAgICBsb25nIG9mZiwgbGVuOworICAgIAorICAgIG9mZiA9IE5VTTJMT05HKG9mZnNldCk7CisgICAgbGVuID0gTlVNMkxPTkcobGVuZ3RoKTsKKworICAgIGNoZWNrUmVhZChwdHIpOworICAgIGNoZWNrQm91bmRzKHB0ciwgb2ZmLCBsZW4pOworICAgIAorICAgIHJldHVybiByYl90YWludGVkX3N0cl9uZXcoKGNoYXIgKikgcHRyLT5hZGRyZXNzICsgb2ZmLCBsZW4pOworfQorCisvKgorICogY2FsbC1zZXE6IG1lbW9yeS5wdXRfYnl0ZXMob2Zmc2V0LCBzdHIsIGluZGV4PTAsIGxlbmd0aD1uaWwpCisgKiBQdXQgYSBzdHJpbmcgaW4gbWVtb3J5LgorICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQgcG9pbnQgaW4gYnVmZmVyIHRvIHN0YXJ0IGZyb20KKyAqIEBwYXJhbSBbU3RyaW5nXSBzdHIgc3RyaW5nIHRvIHB1dCB0byBtZW1vcnkKKyAqIEBwYXJhbSBbTnVtZXJpY10gaW5kZXgKKyAqIEBwYXJhbSBbTnVtZXJpY10gbGVuZ3RoIHN0cmluZydzIGxlbmd0aCBpbiBieXRlcy4gSWYgbmlsLCBhIChtZW1vcnkgc2l6ZSAtIG9mZnNldCkgbGVuZ3RoIHN0cmluZyBpcyByZXR1cm5lZCkuCisgKiBAcmV0dXJuIFtzZWxmXQorICogQHJhaXNlIHtJbmRleEVycm9yfSBpZiArbGVuZ3RoKyBpcyB0b28gZ3JlYXQKKyAqIEByYWlzZSB7TnVsbFBvaW50ZXJFcnJvcn0gaWYgbWVtb3J5IG5vdCBpbml0aWFsaXplZAorICogQHJhaXNlIHtSYW5nZUVycm9yfSBpZiAraW5kZXgrIGlzIG5lZ2F0aXZlLCBvciBpZiBpbmRleCtsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHNpemUgb2Ygc3RyaW5nCisgKiBAcmFpc2Uge1NlY3VyaXR5RXJyb3J9IHdoZW4gd3JpdGluZyB1bnNhZmUgc3RyaW5nIHRvIG1lbW9yeQorICovCitzdGF0aWMgVkFMVUUKK21lbW9yeV9wdXRfYnl0ZXMoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKQoreworICAgIEFic3RyYWN0TWVtb3J5KiBwdHIgPSBNRU1PUlkoc2VsZik7CisgICAgVkFMVUUgb2Zmc2V0ID0gUW5pbCwgc3RyID0gUW5pbCwgcmJJbmRleCA9IFFuaWwsIHJiTGVuZ3RoID0gUW5pbDsKKyAgICBsb25nIG9mZiwgbGVuLCBpZHg7CisgICAgaW50IG5hcmdzID0gcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIyMiIsICZvZmZzZXQsICZzdHIsICZyYkluZGV4LCAmcmJMZW5ndGgpOworCisgICAgQ2hlY2tfVHlwZShzdHIsIFRfU1RSSU5HKTsKKworICAgIG9mZiA9IE5VTTJMT05HKG9mZnNldCk7CisgICAgaWR4ID0gbmFyZ3MgPiAyID8gTlVNMkxPTkcocmJJbmRleCkgOiAwOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VSYW5nZUVycm9yLCAiaW5kZXggY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvIik7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKyAgICBsZW4gPSBuYXJncyA+IDMgPyBOVU0yTE9ORyhyYkxlbmd0aCkgOiAoUlNUUklOR19MRU4oc3RyKSAtIGlkeCk7CisgICAgaWYgKChpZHggKyBsZW4pID4gUlNUUklOR19MRU4oc3RyKSkgeworICAgICAgICByYl9yYWlzZShyYl9lUmFuZ2VFcnJvciwgImluZGV4K2xlbmd0aCBpcyBncmVhdGVyIHRoYW4gc2l6ZSBvZiBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgfQorCisgICAgY2hlY2tXcml0ZShwdHIpOworICAgIGNoZWNrQm91bmRzKHB0ciwgb2ZmLCBsZW4pOworCisgICAgaWYgKHJiX3NhZmVfbGV2ZWwoKSA+PSAxICYmIE9CSl9UQUlOVEVEKHN0cikpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZVNlY3VyaXR5RXJyb3IsICJXcml0aW5nIHVuc2FmZSBzdHJpbmcgdG8gbWVtb3J5Iik7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKyAgICBtZW1jcHkocHRyLT5hZGRyZXNzICsgb2ZmLCBSU1RSSU5HX1BUUihzdHIpICsgaWR4LCBsZW4pOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbWVtb3J5LnJlYWRfYnl0ZXMobGVuZ3RoKQorICogQHBhcmFtIFtOdW1lcmljXSBsZW5ndGggb2Ygc3RyaW5nIHRvIHJldHVybgorICogQHJldHVybiBbU3RyaW5nXQorICogZXF1aXZhbGVudCB0byA6CisgKiAgbWVtb3J5LmdldF9ieXRlcygwLCBsZW5ndGgpCisgKi8KK3N0YXRpYyBWQUxVRSAKK21lbW9yeV9yZWFkX2J5dGVzKFZBTFVFIHNlbGYsIFZBTFVFIGxlbmd0aCkKK3sKKyAgICByZXR1cm4gbWVtb3J5X2dldF9ieXRlcyhzZWxmLCBJTlQyRklYKDApLCBsZW5ndGgpOworfQorCisvKgorICogY2FsbC1zZXE6IG1lbW9yeS53cml0ZV9ieXRlcyhzdHIsIGluZGV4PTAsIGxlbmd0aD1uaWwpCisgKiBAcGFyYW0gW1N0cmluZ10gc3RyIHN0cmluZyB0byBwdXQgdG8gbWVtb3J5CisgKiBAcGFyYW0gW051bWVyaWNdIGluZGV4CisgKiBAcGFyYW0gW051bWVyaWNdIGxlbmd0aCBzdHJpbmcncyBsZW5ndGggaW4gYnl0ZXMuIElmIG5pbCwgYSAobWVtb3J5IHNpemUgLSBvZmZzZXQpIGxlbmd0aCBzdHJpbmcgaXMgcmV0dXJuZWQpLgorICogQHJldHVybiBbc2VsZl0KKyAqIGVxdWl2YWxlbnQgdG8gOgorICogIG1lbW9yeS5wdXRfYnl0ZXMoMCwgc3RyLCBpbmRleCwgbGVuZ3RoKQorICovCitzdGF0aWMgVkFMVUUgCittZW1vcnlfd3JpdGVfYnl0ZXMoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKQoreworICAgIFZBTFVFKiB3YXJndiA9IEFMTE9DQV9OKFZBTFVFLCBhcmdjICsgMSk7CisgICAgaW50IGk7CisKKyAgICB3YXJndlswXSA9IElOVDJGSVgoMCk7CisgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICB3YXJndltpICsgMV0gPSBhcmd2W2ldOworICAgIH0KKworICAgIHJldHVybiBtZW1vcnlfcHV0X2J5dGVzKGFyZ2MgKyAxLCB3YXJndiwgc2VsZik7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbWVtb3J5LnR5cGVfc2l6ZQorICogQHJldHVybiBbTnVtZXJpY10gdHlwZSBzaXplIGluIGJ5dGVzCisgKiBHZXQgdGhlIG1lbW9yeSdzIHR5cGUgc2l6ZS4KKyAqLworc3RhdGljIFZBTFVFCittZW1vcnlfdHlwZV9zaXplKFZBTFVFIHNlbGYpCit7CisgICAgQWJzdHJhY3RNZW1vcnkqIHB0cjsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBBYnN0cmFjdE1lbW9yeSwgcHRyKTsKKworICAgIHJldHVybiBJTlQyTlVNKHB0ci0+dHlwZVNpemUpOworfQorCisvKgorICogRG9jdW1lbnQtbWV0aG9kOiBbXQorICogY2FsbC1zZXE6IG1lbW9yeVtpZHhdCisgKiBAcGFyYW0gW051bWVyaWNdIGlkeCBpbmRleCB0byBhY2Nlc3MgaW4gbWVtb3J5CisgKiBAcmV0dXJuIAorICogTWVtb3J5IHJlYWQgYWNjZXNzb3IuCisgKi8KK3N0YXRpYyBWQUxVRQorbWVtb3J5X2FyZWYoVkFMVUUgc2VsZiwgVkFMVUUgaWR4KQoreworICAgIEFic3RyYWN0TWVtb3J5KiBwdHI7CisgICAgVkFMVUUgcmJPZmZzZXQgPSBRbmlsOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEFic3RyYWN0TWVtb3J5LCBwdHIpOworCisgICAgcmJPZmZzZXQgPSBVTE9ORzJOVU0oTlVNMlVMT05HKGlkeCkgKiBwdHItPnR5cGVTaXplKTsKKworICAgIHJldHVybiByYl9mdW5jYWxsMihzZWxmLCBpZF9wbHVzLCAxLCAmcmJPZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIqCittZW1vcnlfYWRkcmVzcyhWQUxVRSBvYmopCit7CisgICAgcmV0dXJuICgoQWJzdHJhY3RNZW1vcnkgKikgREFUQV9QVFIob2JqKSktPmFkZHJlc3M7Cit9CisKK3N0YXRpYyBWQUxVRQorbWVtb3J5X2NvcHlfZnJvbShWQUxVRSBzZWxmLCBWQUxVRSByYnNyYywgVkFMVUUgcmJsZW4pCit7CisgICAgQWJzdHJhY3RNZW1vcnkqIGRzdDsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBBYnN0cmFjdE1lbW9yeSwgZHN0KTsKKworICAgIG1lbWNweShkc3QtPmFkZHJlc3MsIHJiZmZpX0Fic3RyYWN0TWVtb3J5X0Nhc3QocmJzcmMsIHJiZmZpX0Fic3RyYWN0TWVtb3J5Q2xhc3MpLT5hZGRyZXNzLCBOVU0ySU5UKHJibGVuKSk7CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworQWJzdHJhY3RNZW1vcnkqCityYmZmaV9BYnN0cmFjdE1lbW9yeV9DYXN0KFZBTFVFIG9iaiwgVkFMVUUga2xhc3MpCit7CisgICAgaWYgKHJiX29ial9pc19raW5kX29mKG9iaiwga2xhc3MpKSB7CisgICAgICAgIEFic3RyYWN0TWVtb3J5KiBtZW1vcnk7CisgICAgICAgIERhdGFfR2V0X1N0cnVjdChvYmosIEFic3RyYWN0TWVtb3J5LCBtZW1vcnkpOworICAgICAgICByZXR1cm4gbWVtb3J5OworICAgIH0KKworICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkludmFsaWQgTWVtb3J5IG9iamVjdCIpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkCityYmZmaV9BYnN0cmFjdE1lbW9yeV9FcnJvcihBYnN0cmFjdE1lbW9yeSAqbWVtLCBpbnQgb3ApCit7CisgICAgVkFMVUUgcmJFcnJvckNsYXNzID0gbWVtLT5hZGRyZXNzID09IE5VTEwgPyBOdWxsUG9pbnRlckVycm9yQ2xhc3MgOiByYl9lUnVudGltZUVycm9yOworICAgIGlmIChvcCA9PSBNRU1fUkQpIHsKKyAgICAgICAgcmJfcmFpc2UocmJFcnJvckNsYXNzLCAiaW52YWxpZCBtZW1vcnkgcmVhZCBhdCBhZGRyZXNzPSVwIiwgbWVtLT5hZGRyZXNzKTsKKyAgICB9IGVsc2UgaWYgKG9wID09IE1FTV9XUikgeworICAgICAgICByYl9yYWlzZShyYkVycm9yQ2xhc3MsICJpbnZhbGlkIG1lbW9yeSB3cml0ZSBhdCBhZGRyZXNzPSVwIiwgbWVtLT5hZGRyZXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByYl9yYWlzZShyYkVycm9yQ2xhc3MsICJpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgYXQgYWRkcmVzcz0lcCIsIG1lbS0+YWRkcmVzcyk7CisgICAgfQorfQorCitzdGF0aWMgVkFMVUUKK21lbW9yeV9vcF9nZXRfc3RycHRyKEFic3RyYWN0TWVtb3J5KiBwdHIsIGxvbmcgb2Zmc2V0KQoreworICAgIHZvaWQqIHRtcCA9IE5VTEw7CisKKyAgICBpZiAocHRyICE9IE5VTEwgJiYgcHRyLT5hZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgY2hlY2tSZWFkKHB0cik7CisgICAgICAgIGNoZWNrQm91bmRzKHB0ciwgb2Zmc2V0LCBzaXplb2YodG1wKSk7CisgICAgICAgIG1lbWNweSgmdG1wLCBwdHItPmFkZHJlc3MgKyBvZmZzZXQsIHNpemVvZih0bXApKTsKKyAgICB9CisKKyAgICByZXR1cm4gdG1wICE9IE5VTEwgPyByYl90YWludGVkX3N0cl9uZXcyKHRtcCkgOiBRbmlsOworfQorCitzdGF0aWMgdm9pZAorbWVtb3J5X29wX3B1dF9zdHJwdHIoQWJzdHJhY3RNZW1vcnkqIHB0ciwgbG9uZyBvZmZzZXQsIFZBTFVFIHZhbHVlKQoreworICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkNhbm5vdCBzZXQgOnN0cmluZyBmaWVsZHMiKTsKK30KKworc3RhdGljIE1lbW9yeU9wIG1lbW9yeV9vcF9zdHJwdHIgPSB7IG1lbW9yeV9vcF9nZXRfc3RycHRyLCBtZW1vcnlfb3BfcHV0X3N0cnB0ciB9OworCisKK01lbW9yeU9wcyByYmZmaV9BYnN0cmFjdE1lbW9yeU9wcyA9IHsKKyAgICAmbWVtb3J5X29wX2ludDgsIC8qLmludDggKi8KKyAgICAmbWVtb3J5X29wX3VpbnQ4LCAvKiAudWludDggKi8KKyAgICAmbWVtb3J5X29wX2ludDE2LCAvKiAuaW50MTYgKi8KKyAgICAmbWVtb3J5X29wX3VpbnQxNiwgLyogLnVpbnQxNiAqLworICAgICZtZW1vcnlfb3BfaW50MzIsIC8qIC5pbnQzMiAqLworICAgICZtZW1vcnlfb3BfdWludDMyLCAvKiAudWludDMyICovCisgICAgJm1lbW9yeV9vcF9pbnQ2NCwgLyogLmludDY0ICovCisgICAgJm1lbW9yeV9vcF91aW50NjQsIC8qIC51aW50NjQgKi8KKyAgICAmbWVtb3J5X29wX2xvbmcsIC8qIC5zbG9uZyAqLworICAgICZtZW1vcnlfb3BfdWxvbmcsIC8qIC51c2xvbmcgKi8KKyAgICAmbWVtb3J5X29wX2Zsb2F0MzIsIC8qIC5mbG9hdDMyICovCisgICAgJm1lbW9yeV9vcF9mbG9hdDY0LCAvKiAuZmxvYXQ2NCAqLworICAgICZtZW1vcnlfb3BfbG9uZ2RvdWJsZSwgLyogLmxvbmdkb3VibGUgKi8KKyAgICAmbWVtb3J5X29wX3BvaW50ZXIsIC8qIC5wb2ludGVyICovCisgICAgJm1lbW9yeV9vcF9zdHJwdHIsIC8qIC5zdHJwdHIgKi8KKyAgICAmbWVtb3J5X29wX2Jvb2wgLyogLmJvb2xPcCAqLworfTsKKwordm9pZAorcmJmZmlfQWJzdHJhY3RNZW1vcnlfSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgLyogCisgICAgICogRG9jdW1lbnQtY2xhc3M6IEZGSTo6QWJzdHJhY3RNZW1vcnkKKyAgICAgKiAKKyAgICAgKiB7QWJzdHJhY3RNZW1vcnl9IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBtYW55IG1lbW9yeSBtYW5hZ2VtZW50IGNsYXNzZXMgc3VjaCBhcyB7QnVmZmVyfS4KKyAgICAgKgorICAgICAqIFRoaXMgY2xhc3MgaGFzIGEgbG90IG9mIG1ldGhvZHMgdG8gd29yayB3aXRoIGludGVnZXJzIDoKKyAgICAgKiAqIHB1dF9pbnQ8aT5zaXplPC9pPihvZmZzZXQsIHZhbHVlKQorICAgICAqICogZ2V0X2ludDxpPnNpemU8L2k+KG9mZnNldCkKKyAgICAgKiAqIHB1dF91aW50PGk+c2l6ZTwvaT4ob2Zmc2V0LCB2YWx1ZSkKKyAgICAgKiAqIGdldF91aW50PGk+c2l6ZTwvaT4ob2Zmc2V0KQorICAgICAqICogd3JpdGV1aW50PGk+c2l6ZTwvaT4odmFsdWUpCisgICAgICogKiByZWFkX2ludDxpPnNpemU8L2k+CisgICAgICogKiB3cml0ZV91aW50PGk+c2l6ZTwvaT4odmFsdWUpCisgICAgICogKiByZWFkX3VpbnQ8aT5zaXplPC9pPgorICAgICAqICogcHV0X2FycmF5X29mX2ludDxpPnNpemU8L2k+KG9mZnNldCwgYXJ5KQorICAgICAqICogZ2V0X2FycmF5X29mX2ludDxpPnNpemU8L2k+KG9mZnNldCwgbGVuZ3RoKQorICAgICAqICogcHV0X2FycmF5X29mX3VpbnQ8aT5zaXplPC9pPihvZmZzZXQsIGFyeSkKKyAgICAgKiAqIGdldF9hcnJheV9vZl91aW50PGk+c2l6ZTwvaT4ob2Zmc2V0LCBsZW5ndGgpCisgICAgICogKiB3cml0ZV9hcnJheV9vZl9pbnQ8aT5zaXplPC9pPihhcnkpCisgICAgICogKiByZWFkX2FycmF5X29mX2ludDxpPnNpemU8L2k+KGxlbmd0aCkKKyAgICAgKiAqIHdyaXRlX2FycmF5X29mX3VpbnQ8aT5zaXplPC9pPihhcnkpCisgICAgICogKiByZWFkX2FycmF5X29mX3VpbnQ8aT5zaXplPC9pPihsZW5ndGgpCisgICAgICogd2hlcmUgX3NpemVfIGlzIDgsIDE2LCAzMiBvciA2NC4gU2FtZSBtZXRob2RzIGV4aXN0IGZvciBsb25nIHR5cGUuCisgICAgICoKKyAgICAgKiBBbGlhc2VzIGV4aXN0IDogX2NoYXJfIGZvciBfaW50OF8sIF9zaG9ydF8gZm9yIF9pbnQxNl8sIF9pbnRfIGZvciBfaW50MzJfIGFuZCA8aT5sb25nX2xvbmc8L2k+IGZvciBfaW50NjRfLgorICAgICAqCisgICAgICogT3RoZXJzIG1ldGhvZHMgYXJlIGxpc3RlZCBiZWxvdy4KKyAgICAgKi8KKyAgICBWQUxVRSBjbGFzc01lbW9yeSA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtb2R1bGVGRkksICJBYnN0cmFjdE1lbW9yeSIsIHJiX2NPYmplY3QpOworICAgIHJiZmZpX0Fic3RyYWN0TWVtb3J5Q2xhc3MgPSBjbGFzc01lbW9yeTsKKyAgICAvKiAKKyAgICAgKiBEb2N1bWVudC12YXJpYWJsZTogRkZJOjpBYnN0cmFjdE1lbW9yeSAKKyAgICAgKi8KKyAgICByYl9nbG9iYWxfdmFyaWFibGUoJnJiZmZpX0Fic3RyYWN0TWVtb3J5Q2xhc3MpOworICAgIHJiX2RlZmluZV9hbGxvY19mdW5jKGNsYXNzTWVtb3J5LCBtZW1vcnlfYWxsb2NhdGUpOworCisgICAgTnVsbFBvaW50ZXJFcnJvckNsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKG1vZHVsZUZGSSwgIk51bGxQb2ludGVyRXJyb3IiLCByYl9lUnVudGltZUVycm9yKTsKKyAgICAvKiBEb2N1bWVudC12YXJpYWJsZTogTnVsbFBvaW50ZXJFcnJvciAqLworICAgIHJiX2dsb2JhbF92YXJpYWJsZSgmTnVsbFBvaW50ZXJFcnJvckNsYXNzKTsKKworCisjdW5kZWYgSU5UCisjZGVmaW5lIElOVCh0eXBlKSBcCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInB1dF8iICN0eXBlLCBtZW1vcnlfcHV0XyMjdHlwZSwgMik7IFwKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiZ2V0XyIgI3R5cGUsIG1lbW9yeV9nZXRfIyN0eXBlLCAxKTsgXAorICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJwdXRfdSIgI3R5cGUsIG1lbW9yeV9wdXRfdSMjdHlwZSwgMik7IFwKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiZ2V0X3UiICN0eXBlLCBtZW1vcnlfZ2V0X3UjI3R5cGUsIDEpOyBcCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgIndyaXRlXyIgI3R5cGUsIG1lbW9yeV93cml0ZV8jI3R5cGUsIDEpOyBcCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInJlYWRfIiAjdHlwZSwgbWVtb3J5X3JlYWRfIyN0eXBlLCAwKTsgXAorICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJ3cml0ZV91IiAjdHlwZSwgbWVtb3J5X3dyaXRlX3UjI3R5cGUsIDEpOyBcCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInJlYWRfdSIgI3R5cGUsIG1lbW9yeV9yZWFkX3UjI3R5cGUsIDApOyBcCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInB1dF9hcnJheV9vZl8iICN0eXBlLCBtZW1vcnlfcHV0X2FycmF5X29mXyMjdHlwZSwgMik7IFwKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiZ2V0X2FycmF5X29mXyIgI3R5cGUsIG1lbW9yeV9nZXRfYXJyYXlfb2ZfIyN0eXBlLCAyKTsgXAorICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJwdXRfYXJyYXlfb2ZfdSIgI3R5cGUsIG1lbW9yeV9wdXRfYXJyYXlfb2ZfdSMjdHlwZSwgMik7IFwKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiZ2V0X2FycmF5X29mX3UiICN0eXBlLCBtZW1vcnlfZ2V0X2FycmF5X29mX3UjI3R5cGUsIDIpOyBcCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgIndyaXRlX2FycmF5X29mXyIgI3R5cGUsIG1lbW9yeV93cml0ZV9hcnJheV9vZl8jI3R5cGUsIDEpOyBcCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInJlYWRfYXJyYXlfb2ZfIiAjdHlwZSwgbWVtb3J5X3JlYWRfYXJyYXlfb2ZfIyN0eXBlLCAxKTsgXAorICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJ3cml0ZV9hcnJheV9vZl91IiAjdHlwZSwgbWVtb3J5X3dyaXRlX2FycmF5X29mX3UjI3R5cGUsIDEpOyBcCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInJlYWRfYXJyYXlfb2ZfdSIgI3R5cGUsIG1lbW9yeV9yZWFkX2FycmF5X29mX3UjI3R5cGUsIDEpOworICAgIAorICAgIElOVChpbnQ4KTsKKyAgICBJTlQoaW50MTYpOworICAgIElOVChpbnQzMik7CisgICAgSU5UKGludDY0KTsKKyAgICBJTlQobG9uZyk7CisgICAgCisjZGVmaW5lIEFMSUFTKG5hbWUsIG9sZCkgXAorICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgInB1dF8iICNuYW1lLCAicHV0XyIgI29sZCk7IFwKKyAgICByYl9kZWZpbmVfYWxpYXMoY2xhc3NNZW1vcnksICJnZXRfIiAjbmFtZSwgImdldF8iICNvbGQpOyBcCisgICAgcmJfZGVmaW5lX2FsaWFzKGNsYXNzTWVtb3J5LCAicHV0X3UiICNuYW1lLCAicHV0X3UiICNvbGQpOyBcCisgICAgcmJfZGVmaW5lX2FsaWFzKGNsYXNzTWVtb3J5LCAiZ2V0X3UiICNuYW1lLCAiZ2V0X3UiICNvbGQpOyBcCisgICAgcmJfZGVmaW5lX2FsaWFzKGNsYXNzTWVtb3J5LCAid3JpdGVfIiAjbmFtZSwgIndyaXRlXyIgI29sZCk7IFwKKyAgICByYl9kZWZpbmVfYWxpYXMoY2xhc3NNZW1vcnksICJyZWFkXyIgI25hbWUsICJyZWFkXyIgI29sZCk7IFwKKyAgICByYl9kZWZpbmVfYWxpYXMoY2xhc3NNZW1vcnksICJ3cml0ZV91IiAjbmFtZSwgIndyaXRlX3UiICNvbGQpOyBcCisgICAgcmJfZGVmaW5lX2FsaWFzKGNsYXNzTWVtb3J5LCAicmVhZF91IiAjbmFtZSwgInJlYWRfdSIgI29sZCk7IFwKKyAgICByYl9kZWZpbmVfYWxpYXMoY2xhc3NNZW1vcnksICJwdXRfYXJyYXlfb2ZfIiAjbmFtZSwgInB1dF9hcnJheV9vZl8iICNvbGQpOyBcCisgICAgcmJfZGVmaW5lX2FsaWFzKGNsYXNzTWVtb3J5LCAiZ2V0X2FycmF5X29mXyIgI25hbWUsICJnZXRfYXJyYXlfb2ZfIiAjb2xkKTsgXAorICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgInB1dF9hcnJheV9vZl91IiAjbmFtZSwgInB1dF9hcnJheV9vZl91IiAjb2xkKTsgXAorICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgImdldF9hcnJheV9vZl91IiAjbmFtZSwgImdldF9hcnJheV9vZl91IiAjb2xkKTsgXAorICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgIndyaXRlX2FycmF5X29mXyIgI25hbWUsICJ3cml0ZV9hcnJheV9vZl8iICNvbGQpOyBcCisgICAgcmJfZGVmaW5lX2FsaWFzKGNsYXNzTWVtb3J5LCAicmVhZF9hcnJheV9vZl8iICNuYW1lLCAicmVhZF9hcnJheV9vZl8iICNvbGQpOyBcCisgICAgcmJfZGVmaW5lX2FsaWFzKGNsYXNzTWVtb3J5LCAid3JpdGVfYXJyYXlfb2ZfdSIgI25hbWUsICJ3cml0ZV9hcnJheV9vZl91IiAjb2xkKTsgXAorICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgInJlYWRfYXJyYXlfb2ZfdSIgI25hbWUsICJyZWFkX2FycmF5X29mX3UiICNvbGQpOworICAgIAorICAgIEFMSUFTKGNoYXIsIGludDgpOworICAgIEFMSUFTKHNob3J0LCBpbnQxNik7CisgICAgQUxJQVMoaW50LCBpbnQzMik7CisgICAgQUxJQVMobG9uZ19sb25nLCBpbnQ2NCk7CisgICAgCisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IHB1dF9mbG9hdDMyCisgICAgICogY2FsbC1zZXE6IG1lbW9yeS5wdXRfZmxvYXQzMm9mZnNldCwgdmFsdWUpCisgICAgICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIHZhbHVlCisgICAgICogQHJldHVybiBbc2VsZl0KKyAgICAgKiBQdXQgK3ZhbHVlKyBhcyBhIDMyLWJpdCBmbG9hdCBpbiBtZW1vcnkgYXQgb2Zmc2V0ICtvZmZzZXQrIChhbGlhczogI3B1dF9mbG9hdCkuCisgICAgICovCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInB1dF9mbG9hdDMyIiwgbWVtb3J5X3B1dF9mbG9hdDMyLCAyKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogZ2V0X2Zsb2F0MzIKKyAgICAgKiBjYWxsLXNlcTogbWVtb3J5LmdldF9mbG9hdDMyKG9mZnNldCkKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIG9mZnNldAorICAgICAqIEByZXR1cm4gW0Zsb2F0XQorICAgICAqIEdldCBhIDMyLWJpdCBmbG9hdCBmcm9tIG1lbW9yeSBhdCBvZmZzZXQgK29mZnNldCsgKGFsaWFzOiAjZ2V0X2Zsb2F0KS4KKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiZ2V0X2Zsb2F0MzIiLCBtZW1vcnlfZ2V0X2Zsb2F0MzIsIDEpOworICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgInB1dF9mbG9hdCIsICJwdXRfZmxvYXQzMiIpOworICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgImdldF9mbG9hdCIsICJnZXRfZmxvYXQzMiIpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtbWV0aG9kOiB3cml0ZV9mbG9hdAorICAgICAqIGNhbGwtc2VxOiBtZW1vcnkud3JpdGVfZmxvYXQodmFsdWUpCisgICAgICogQHBhcmFtIFtOdW1lcmljXSB2YWx1ZQorICAgICAqIEByZXR1cm4gW3NlbGZdCisgICAgICogV3JpdGUgK3ZhbHVlKyBhcyBhIDMyLWJpdCBmbG9hdCBpbiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBTYW1lIGFzOgorICAgICAqICBtZW1vcnkucHV0X2Zsb2F0KDAsIHZhbHVlKQorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJ3cml0ZV9mbG9hdCIsIG1lbW9yeV93cml0ZV9mbG9hdDMyLCAxKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogcmVhZF9mbG9hdAorICAgICAqIGNhbGwtc2VxOiBtZW1vcnkucmVhZF9mbG9hdAorICAgICAqIEByZXR1cm4gW0Zsb2F0XQorICAgICAqIFJlYWQgYSAzMi1iaXQgZmxvYXQgZnJvbSBtZW1vcnkuCisgICAgICoKKyAgICAgKiBTYW1lIGFzOgorICAgICAqICBtZW1vcnkuZ2V0X2Zsb2F0KDApCisgICAgICovCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInJlYWRfZmxvYXQiLCBtZW1vcnlfcmVhZF9mbG9hdDMyLCAwKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogcHV0X2FycmF5X29mX2Zsb2F0MzIKKyAgICAgKiBjYWxsLXNlcTogbWVtb3J5LnB1dF9hcnJheV9vZl9mbG9hdDMyKG9mZnNldCwgYXJ5KQorICAgICAqIEBwYXJhbSBbTnVtZXJpY10gb2Zmc2V0CisgICAgICogQHBhcmFtIFtBcnJheTxOdW1lcmljPl0gYXJ5CisgICAgICogQHJldHVybiBbc2VsZl0KKyAgICAgKiBQdXQgdmFsdWVzIGZyb20gK2FyeSsgYXMgMzItYml0IGZsb2F0cyBpbiBtZW1vcnkgZnJvbSBvZmZzZXQgK29mZnNldCsgKGFsaWFzOiAjcHV0X2FycmF5X29mX2Zsb2F0KS4KKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAicHV0X2FycmF5X29mX2Zsb2F0MzIiLCBtZW1vcnlfcHV0X2FycmF5X29mX2Zsb2F0MzIsIDIpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtbWV0aG9kOiBnZXRfYXJyYXlfb2ZfZmxvYXQzMgorICAgICAqIGNhbGwtc2VxOiBtZW1vcnkuZ2V0X2FycmF5X29mX2Zsb2F0MzIob2Zmc2V0LCBsZW5ndGgpCisgICAgICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIGxlbmd0aCBudW1iZXIgb2YgRmxvYXQgdG8gZ2V0CisgICAgICogQHJldHVybiBbQXJyYXk8RmxvYXQ+XQorICAgICAqIEdldCAzMi1iaXQgZmxvYXRzIGluIG1lbW9yeSBmcm9tIG9mZnNldCArb2Zmc2V0KyAoYWxpYXM6ICNnZXRfYXJyYXlfb2ZfZmxvYXQpLgorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJnZXRfYXJyYXlfb2ZfZmxvYXQzMiIsIG1lbW9yeV9nZXRfYXJyYXlfb2ZfZmxvYXQzMiwgMik7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IHdyaXRlX2FycmF5X29mX2Zsb2F0CisgICAgICogY2FsbC1zZXE6IG1lbW9yeS53cml0ZV9hcnJheV9vZl9mbG9hdChhcnkpCisgICAgICogQHBhcmFtIFtBcnJheTxOdW1lcmljPl0gYXJ5CisgICAgICogQHJldHVybiBbc2VsZl0KKyAgICAgKiBXcml0ZSB2YWx1ZXMgZnJvbSArYXJ5KyBhcyAzMi1iaXQgZmxvYXRzIGluIG1lbW9yeS4KKyAgICAgKgorICAgICAqIFNhbWUgYXM6CisgICAgICogIG1lbW9yeS5wdXRfYXJyYXlfb2ZfZmxvYXQoMCwgYXJ5KQorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJ3cml0ZV9hcnJheV9vZl9mbG9hdCIsIG1lbW9yeV93cml0ZV9hcnJheV9vZl9mbG9hdDMyLCAxKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogcmVhZF9hcnJheV9vZl9mbG9hdAorICAgICAqIGNhbGwtc2VxOiBtZW1vcnkucmVhZF9hcnJheV9vZl9mbG9hdChsZW5ndGgpCisgICAgICogQHBhcmFtIFtOdW1lcmljXSBsZW5ndGggbnVtYmVyIG9mIEZsb2F0IHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIFtBcnJheTxGbG9hdD5dCisgICAgICogUmVhZCAzMi1iaXQgZmxvYXRzIGZyb20gbWVtb3J5LgorICAgICAqCisgICAgICogU2FtZSBhczoKKyAgICAgKiAgbWVtb3J5LmdldF9hcnJheV9vZl9mbG9hdCgwLCBhcnkpCisgICAgICovCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInJlYWRfYXJyYXlfb2ZfZmxvYXQiLCBtZW1vcnlfcmVhZF9hcnJheV9vZl9mbG9hdDMyLCAxKTsKKyAgICByYl9kZWZpbmVfYWxpYXMoY2xhc3NNZW1vcnksICJwdXRfYXJyYXlfb2ZfZmxvYXQiLCAicHV0X2FycmF5X29mX2Zsb2F0MzIiKTsKKyAgICByYl9kZWZpbmVfYWxpYXMoY2xhc3NNZW1vcnksICJnZXRfYXJyYXlfb2ZfZmxvYXQiLCAiZ2V0X2FycmF5X29mX2Zsb2F0MzIiKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogcHV0X2Zsb2F0NjQKKyAgICAgKiBjYWxsLXNlcTogbWVtb3J5LnB1dF9mbG9hdDY0KG9mZnNldCwgdmFsdWUpCisgICAgICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIHZhbHVlCisgICAgICogQHJldHVybiBbc2VsZl0KKyAgICAgKiBQdXQgK3ZhbHVlKyBhcyBhIDY0LWJpdCBmbG9hdCAoZG91YmxlKSBpbiBtZW1vcnkgYXQgb2Zmc2V0ICtvZmZzZXQrIChhbGlhczogI3B1dF9kb3VibGUpLgorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJwdXRfZmxvYXQ2NCIsIG1lbW9yeV9wdXRfZmxvYXQ2NCwgMik7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IGdldF9mbG9hdDY0CisgICAgICogY2FsbC1zZXE6IG1lbW9yeS5nZXRfZmxvYXQ2NChvZmZzZXQpCisgICAgICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQKKyAgICAgKiBAcmV0dXJuIFtGbG9hdF0KKyAgICAgKiBHZXQgYSA2NC1iaXQgZmxvYXQgKGRvdWJsZSkgZnJvbSBtZW1vcnkgYXQgb2Zmc2V0ICtvZmZzZXQrIChhbGlhczogI2dldF9kb3VibGUpLgorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJnZXRfZmxvYXQ2NCIsIG1lbW9yeV9nZXRfZmxvYXQ2NCwgMSk7CisgICAgcmJfZGVmaW5lX2FsaWFzKGNsYXNzTWVtb3J5LCAicHV0X2RvdWJsZSIsICJwdXRfZmxvYXQ2NCIpOworICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgImdldF9kb3VibGUiLCAiZ2V0X2Zsb2F0NjQiKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogd3JpdGVfZG91YmxlCisgICAgICogY2FsbC1zZXE6IG1lbW9yeS53cml0ZV9kb3VibGUodmFsdWUpCisgICAgICogQHBhcmFtIFtOdW1lcmljXSB2YWx1ZQorICAgICAqIEByZXR1cm4gW3NlbGZdCisgICAgICogV3JpdGUgK3ZhbHVlKyBhcyBhIDY0LWJpdCBmbG9hdCAoZG91YmxlKSBpbiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBTYW1lIGFzOgorICAgICAqICBtZW1vcnkucHV0X2RvdWJsZSgwLCB2YWx1ZSkKKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAid3JpdGVfZG91YmxlIiwgbWVtb3J5X3dyaXRlX2Zsb2F0NjQsIDEpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtbWV0aG9kOiByZWFkX2RvdWJsZQorICAgICAqIGNhbGwtc2VxOiBtZW1vcnkucmVhZF9kb3VibGUKKyAgICAgKiBAcmV0dXJuIFtGbG9hdF0KKyAgICAgKiBSZWFkIGEgNjQtYml0IGZsb2F0IChkb3VibGUpIGZyb20gbWVtb3J5LgorICAgICAqCisgICAgICogU2FtZSBhczoKKyAgICAgKiAgbWVtb3J5LmdldF9kb3VibGUoMCkKKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAicmVhZF9kb3VibGUiLCBtZW1vcnlfcmVhZF9mbG9hdDY0LCAwKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogcHV0X2FycmF5X29mX2Zsb2F0NjQKKyAgICAgKiBjYWxsLXNlcTogbWVtb3J5LnB1dF9hcnJheV9vZl9mbG9hdDY0KG9mZnNldCwgYXJ5KQorICAgICAqIEBwYXJhbSBbTnVtZXJpY10gb2Zmc2V0CisgICAgICogQHBhcmFtIFtBcnJheTxOdW1lcmljPl0gYXJ5CisgICAgICogQHJldHVybiBbc2VsZl0KKyAgICAgKiBQdXQgdmFsdWVzIGZyb20gK2FyeSsgYXMgNjQtYml0IGZsb2F0cyAoZG91YmxlcykgaW4gbWVtb3J5IGZyb20gb2Zmc2V0ICtvZmZzZXQrIChhbGlhczogI3B1dF9hcnJheV9vZl9kb3VibGUpLgorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJwdXRfYXJyYXlfb2ZfZmxvYXQ2NCIsIG1lbW9yeV9wdXRfYXJyYXlfb2ZfZmxvYXQ2NCwgMik7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IGdldF9hcnJheV9vZl9mbG9hdDY0CisgICAgICogY2FsbC1zZXE6IG1lbW9yeS5nZXRfYXJyYXlfb2ZfZmxvYXQ2NChvZmZzZXQsIGxlbmd0aCkKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIG9mZnNldAorICAgICAqIEBwYXJhbSBbTnVtZXJpY10gbGVuZ3RoIG51bWJlciBvZiBGbG9hdCB0byBnZXQKKyAgICAgKiBAcmV0dXJuIFtBcnJheTxGbG9hdD5dCisgICAgICogR2V0IDY0LWJpdCBmbG9hdHMgKGRvdWJsZXMpIGluIG1lbW9yeSBmcm9tIG9mZnNldCArb2Zmc2V0KyAoYWxpYXM6ICNnZXRfYXJyYXlfb2ZfZG91YmxlKS4KKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiZ2V0X2FycmF5X29mX2Zsb2F0NjQiLCBtZW1vcnlfZ2V0X2FycmF5X29mX2Zsb2F0NjQsIDIpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtbWV0aG9kOiB3cml0ZV9hcnJheV9vZl9kb3VibGUKKyAgICAgKiBjYWxsLXNlcTogbWVtb3J5LndyaXRlX2FycmF5X29mX2RvdWJsZShhcnkpCisgICAgICogQHBhcmFtIFtBcnJheTxOdW1lcmljPl0gYXJ5CisgICAgICogQHJldHVybiBbc2VsZl0KKyAgICAgKiBXcml0ZSB2YWx1ZXMgZnJvbSArYXJ5KyBhcyA2NC1iaXQgZmxvYXRzIChkb3VibGVzKSBpbiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBTYW1lIGFzOgorICAgICAqICBtZW1vcnkucHV0X2FycmF5X29mX2RvdWJsZSgwLCBhcnkpCisgICAgICovCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgIndyaXRlX2FycmF5X29mX2RvdWJsZSIsIG1lbW9yeV93cml0ZV9hcnJheV9vZl9mbG9hdDY0LCAxKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogcmVhZF9hcnJheV9vZl9kb3VibGUKKyAgICAgKiBjYWxsLXNlcTogbWVtb3J5LnJlYWRfYXJyYXlfb2ZfZG91YmxlKGxlbmd0aCkKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIGxlbmd0aCBudW1iZXIgb2YgRmxvYXQgdG8gcmVhZAorICAgICAqIEByZXR1cm4gW0FycmF5PEZsb2F0Pl0KKyAgICAgKiBSZWFkIDY0LWJpdCBmbG9hdHMgKGRvdWJsZXMpIGZyb20gbWVtb3J5LgorICAgICAqCisgICAgICogU2FtZSBhczoKKyAgICAgKiAgbWVtb3J5LmdldF9hcnJheV9vZl9kb3VibGUoMCwgYXJ5KQorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJyZWFkX2FycmF5X29mX2RvdWJsZSIsIG1lbW9yeV9yZWFkX2FycmF5X29mX2Zsb2F0NjQsIDEpOworICAgIHJiX2RlZmluZV9hbGlhcyhjbGFzc01lbW9yeSwgInB1dF9hcnJheV9vZl9kb3VibGUiLCAicHV0X2FycmF5X29mX2Zsb2F0NjQiKTsKKyAgICByYl9kZWZpbmVfYWxpYXMoY2xhc3NNZW1vcnksICJnZXRfYXJyYXlfb2ZfZG91YmxlIiwgImdldF9hcnJheV9vZl9mbG9hdDY0Iik7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IHB1dF9wb2ludGVyCisgICAgICogY2FsbC1zZXE6IG1lbW9yeS5wdXRfcG9pbnRlcihvZmZzZXQsIHZhbHVlKQorICAgICAqIEBwYXJhbSBbTnVtZXJpY10gb2Zmc2V0CisgICAgICogQHBhcmFtIFtuaWwsUG9pbnRlciwgSW50ZWdlciwgI3RvX3B0cl0gdmFsdWUKKyAgICAgKiBAcmV0dXJuIFtzZWxmXQorICAgICAqIFB1dCArdmFsdWUrIGluIG1lbW9yeSBmcm9tICtvZmZzZXQrLi4KKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAicHV0X3BvaW50ZXIiLCBtZW1vcnlfcHV0X3BvaW50ZXIsIDIpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtbWV0aG9kOiBnZXRfcG9pbnRlcgorICAgICAqIGNhbGwtc2VxOiBtZW1vcnkuZ2V0X3BvaW50ZXIob2Zmc2V0KQorICAgICAqIEBwYXJhbSBbTnVtZXJpY10gb2Zmc2V0CisgICAgICogQHJldHVybiBbUG9pbnRlcl0KKyAgICAgKiBHZXQgYSB7UG9pbnRlcn0gdG8gdGhlIG1lbW9yeSBmcm9tICtvZmZzZXQrLgorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJnZXRfcG9pbnRlciIsIG1lbW9yeV9nZXRfcG9pbnRlciwgMSk7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IHdyaXRlX3BvaW50ZXIKKyAgICAgKiBjYWxsLXNlcTogbWVtb3J5LndyaXRlX3BvaW50ZXIodmFsdWUpCisgICAgICogQHBhcmFtIFtuaWwsUG9pbnRlciwgSW50ZWdlciwgI3RvX3B0cl0gdmFsdWUKKyAgICAgKiBAcmV0dXJuIFtzZWxmXQorICAgICAqIFdyaXRlICt2YWx1ZSsgaW4gbWVtb3J5LgorICAgICAqCisgICAgICogRXF1aXZhbGVudCB0bzoKKyAgICAgKiAgbWVtb3J5LnB1dF9wb2ludGVyKDAsIHZhbHVlKQorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJ3cml0ZV9wb2ludGVyIiwgbWVtb3J5X3dyaXRlX3BvaW50ZXIsIDEpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtbWV0aG9kOiByZWFkX3BvaW50ZXIKKyAgICAgKiBjYWxsLXNlcTogbWVtb3J5LnJlYWRfcG9pbnRlcgorICAgICAqIEByZXR1cm4gW1BvaW50ZXJdCisgICAgICogR2V0IGEge1BvaW50ZXJ9IHRvIHRoZSBtZW1vcnkgZnJvbSBiYXNlIGFkZHJlc3MuCisgICAgICoKKyAgICAgKiBFcXVpdmFsZW50IHRvOgorICAgICAqICBtZW1vcnkuZ2V0X3BvaW50ZXIoMCkKKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAicmVhZF9wb2ludGVyIiwgbWVtb3J5X3JlYWRfcG9pbnRlciwgMCk7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IHB1dF9hcnJheV9vZl9wb2ludGVyCisgICAgICogY2FsbC1zZXE6IG1lbW9yeS5wdXRfYXJyYXlfb2ZfcG9pbnRlcihvZmZzZXQsIGFyeSkKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIG9mZnNldAorICAgICAqIEBwYXJhbSBbQXJyYXk8I3RvX3B0cj5dIGFyeQorICAgICAqIEByZXR1cm4gW3NlbGZdCisgICAgICogUHV0IGFuIGFycmF5IG9mIHtQb2ludGVyfSBpbnRvIG1lbW9yeSBmcm9tICtvZmZzZXQrLgorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJwdXRfYXJyYXlfb2ZfcG9pbnRlciIsIG1lbW9yeV9wdXRfYXJyYXlfb2ZfcG9pbnRlciwgMik7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IGdldF9hcnJheV9vZl9wb2ludGVyCisgICAgICogY2FsbC1zZXE6IG1lbW9yeS5nZXRfYXJyYXlfb2ZfcG9pbnRlcihvZmZzZXQsIGxlbmd0aCkKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIG9mZnNldAorICAgICAqIEBwYXJhbSBbTnVtZXJpY10gbGVuZ3RoCisgICAgICogQHJldHVybiBbQXJyYXk8UG9pbnRlcj5dCisgICAgICogR2V0IGFuIGFycmF5IG9mIHtQb2ludGVyfSBvZiBsZW5ndGggK2xlbmd0aCsgZnJvbSArb2Zmc2V0Ky4KKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiZ2V0X2FycmF5X29mX3BvaW50ZXIiLCBtZW1vcnlfZ2V0X2FycmF5X29mX3BvaW50ZXIsIDIpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtbWV0aG9kOiB3cml0ZV9hcnJheV9vZl9wb2ludGVyCisgICAgICogY2FsbC1zZXE6IG1lbW9yeS53cml0ZV9hcnJheV9vZl9wb2ludGVyKGFyeSkKKyAgICAgKiBAcGFyYW0gW0FycmF5PCN0b19wdHI+XSBhcnkKKyAgICAgKiBAcmV0dXJuIFtzZWxmXQorICAgICAqIFdyaXRlIGFuIGFycmF5IG9mIHtQb2ludGVyfSBpbnRvIG1lbW9yeSBmcm9tICtvZmZzZXQrLgorICAgICAqCisgICAgICogU2FtZSBhcyA6CisgICAgICogIG1lbW9yeS5wdXRfYXJyYXlfb2ZfcG9pbnRlcigwLCBhcnkpCisgICAgICovCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgIndyaXRlX2FycmF5X29mX3BvaW50ZXIiLCBtZW1vcnlfd3JpdGVfYXJyYXlfb2ZfcG9pbnRlciwgMSk7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IHJlYWRfYXJyYXlfb2ZfcG9pbnRlcgorICAgICAqIGNhbGwtc2VxOiBtZW1vcnkucmVhZF9hcnJheV9vZl9wb2ludGVyKGxlbmd0aCkKKyAgICAgKiBAcGFyYW0gW051bWVyaWNdIGxlbmd0aAorICAgICAqIEByZXR1cm4gW0FycmF5PFBvaW50ZXI+XQorICAgICAqIFJlYWQgYW4gYXJyYXkgb2Yge1BvaW50ZXJ9IG9mIGxlbmd0aCArbGVuZ3RoKy4KKyAgICAgKgorICAgICAqIFNhbWUgYXM6CisgICAgICogIG1lbW9yeS5nZXRfYXJyYXlfb2ZfcG9pbnRlcigwLCBsZW5ndGgpCisgICAgICovCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInJlYWRfYXJyYXlfb2ZfcG9pbnRlciIsIG1lbW9yeV9yZWFkX2FycmF5X29mX3BvaW50ZXIsIDEpOworCisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgImdldF9zdHJpbmciLCBtZW1vcnlfZ2V0X3N0cmluZywgLTEpOworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJwdXRfc3RyaW5nIiwgbWVtb3J5X3B1dF9zdHJpbmcsIDIpOworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJnZXRfYnl0ZXMiLCBtZW1vcnlfZ2V0X2J5dGVzLCAyKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAicHV0X2J5dGVzIiwgbWVtb3J5X3B1dF9ieXRlcywgLTEpOworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJyZWFkX2J5dGVzIiwgbWVtb3J5X3JlYWRfYnl0ZXMsIDEpOworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJ3cml0ZV9ieXRlcyIsIG1lbW9yeV93cml0ZV9ieXRlcywgLTEpOworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJnZXRfYXJyYXlfb2Zfc3RyaW5nIiwgbWVtb3J5X2dldF9hcnJheV9vZl9zdHJpbmcsIC0xKTsKKworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJnZXQiLCBtZW1vcnlfZ2V0LCAyKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAicHV0IiwgbWVtb3J5X3B1dCwgMyk7CisKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiY2xlYXIiLCBtZW1vcnlfY2xlYXIsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJ0b3RhbCIsIG1lbW9yeV9zaXplLCAwKTsKKyAgICByYl9kZWZpbmVfYWxpYXMoY2xhc3NNZW1vcnksICJzaXplIiwgInRvdGFsIik7CisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc01lbW9yeSwgInR5cGVfc2l6ZSIsIG1lbW9yeV90eXBlX3NpemUsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NNZW1vcnksICJbXSIsIG1lbW9yeV9hcmVmLCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKGNsYXNzTWVtb3J5LCAiX19jb3B5X2Zyb21fXyIsIG1lbW9yeV9jb3B5X2Zyb20sIDIpOworCisgICAgaWRfdG9fcHRyID0gcmJfaW50ZXJuKCJ0b19wdHIiKTsKKyAgICBpZF9jYWxsID0gcmJfaW50ZXJuKCJjYWxsIik7CisgICAgaWRfcGx1cyA9IHJiX2ludGVybigiKyIpOworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9BYnN0cmFjdE1lbW9yeS5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQWJzdHJhY3RNZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTE5Mjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQWJzdHJhY3RNZW1vcnkuaApAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSQkZGSV9BQlNUUkFDVE1FTU9SWV9ICisjZGVmaW5lCVJCRkZJX0FCU1RSQUNUTUVNT1JZX0gKKworI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgIlR5cGVzLmgiCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lIE1FTV9SRCAgIDB4MDEKKyNkZWZpbmUgTUVNX1dSICAgMHgwMgorI2RlZmluZSBNRU1fQ09ERSAweDA0CisjZGVmaW5lIE1FTV9TV0FQIDB4MDgKKyNkZWZpbmUgTUVNX0VNQkVEIDB4MTAKKwordHlwZWRlZiBzdHJ1Y3QgQWJzdHJhY3RNZW1vcnlfIEFic3RyYWN0TWVtb3J5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVkFMVUUgKCpnZXQpKEFic3RyYWN0TWVtb3J5KiBwdHIsIGxvbmcgb2Zmc2V0KTsKKyAgICB2b2lkICgqcHV0KShBYnN0cmFjdE1lbW9yeSogcHRyLCBsb25nIG9mZnNldCwgVkFMVUUgdmFsdWUpOworfSBNZW1vcnlPcDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE1lbW9yeU9wKiBpbnQ4OworICAgIE1lbW9yeU9wKiB1aW50ODsKKyAgICBNZW1vcnlPcCogaW50MTY7CisgICAgTWVtb3J5T3AqIHVpbnQxNjsKKyAgICBNZW1vcnlPcCogaW50MzI7CisgICAgTWVtb3J5T3AqIHVpbnQzMjsKKyAgICBNZW1vcnlPcCogaW50NjQ7CisgICAgTWVtb3J5T3AqIHVpbnQ2NDsKKyAgICBNZW1vcnlPcCogc2xvbmc7CisgICAgTWVtb3J5T3AqIHVzbG9uZzsKKyAgICBNZW1vcnlPcCogZmxvYXQzMjsKKyAgICBNZW1vcnlPcCogZmxvYXQ2NDsKKyAgICBNZW1vcnlPcCogbG9uZ2RvdWJsZTsKKyAgICBNZW1vcnlPcCogcG9pbnRlcjsKKyAgICBNZW1vcnlPcCogc3RycHRyOworICAgIE1lbW9yeU9wKiBib29sT3A7Cit9IE1lbW9yeU9wczsKKworc3RydWN0IEFic3RyYWN0TWVtb3J5XyB7CisgICAgY2hhciogYWRkcmVzczsgLyogVXNlIGNoYXIqIGluc3RlYWQgb2Ygdm9pZCogdG8gZW5zdXJlIGFkZGluZyB0byBpdCB3b3JrcyBjb3JyZWN0bHkgKi8KKyAgICBsb25nIHNpemU7CisgICAgaW50IGZsYWdzOworICAgIGludCB0eXBlU2l6ZTsKK307CisKKworZXh0ZXJuIFZBTFVFIHJiZmZpX0Fic3RyYWN0TWVtb3J5Q2xhc3M7CitleHRlcm4gTWVtb3J5T3BzIHJiZmZpX0Fic3RyYWN0TWVtb3J5T3BzOworCitleHRlcm4gdm9pZCByYmZmaV9BYnN0cmFjdE1lbW9yeV9Jbml0KFZBTFVFIGZmaU1vZHVsZSk7CisKK2V4dGVybiBBYnN0cmFjdE1lbW9yeSogcmJmZmlfQWJzdHJhY3RNZW1vcnlfQ2FzdChWQUxVRSBvYmosIFZBTFVFIGtsYXNzKTsKKworZXh0ZXJuIHZvaWQgcmJmZmlfQWJzdHJhY3RNZW1vcnlfRXJyb3IoQWJzdHJhY3RNZW1vcnkgKiwgaW50IG9wKTsKKworc3RhdGljIGlubGluZSB2b2lkCitjaGVja0JvdW5kcyhBYnN0cmFjdE1lbW9yeSogbWVtLCBsb25nIG9mZiwgbG9uZyBsZW4pCit7CisgICAgaWYgKHVubGlrZWx5KChvZmYgfCBsZW4gfCAob2ZmICsgbGVuKSB8IChtZW0tPnNpemUgLSAob2ZmICsgbGVuKSkpIDwgMCkpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZUluZGV4RXJyb3IsICJNZW1vcnkgYWNjZXNzIG9mZnNldD0lbGQgc2l6ZT0lbGQgaXMgb3V0IG9mIGJvdW5kcyIsCisgICAgICAgICAgICAgICAgb2ZmLCBsZW4pOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitjaGVja1JlYWQoQWJzdHJhY3RNZW1vcnkqIG1lbSkKK3sKKyAgICBpZiAodW5saWtlbHkoKG1lbS0+ZmxhZ3MgJiBNRU1fUkQpID09IDApKSB7CisgICAgICAgIHJiZmZpX0Fic3RyYWN0TWVtb3J5X0Vycm9yKG1lbSwgTUVNX1JEKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2hlY2tXcml0ZShBYnN0cmFjdE1lbW9yeSogbWVtKQoreworICAgIGlmICh1bmxpa2VseSgobWVtLT5mbGFncyAmIE1FTV9XUikgPT0gMCkpIHsKKyAgICAgICAgcmJmZmlfQWJzdHJhY3RNZW1vcnlfRXJyb3IobWVtLCBNRU1fV1IpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBNZW1vcnlPcCoKK2dldF9tZW1vcnlfb3AoVHlwZSogdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUtPm5hdGl2ZVR5cGUpIHsKKyAgICAgICAgY2FzZSBOQVRJVkVfSU5UODoKKyAgICAgICAgICAgIHJldHVybiByYmZmaV9BYnN0cmFjdE1lbW9yeU9wcy5pbnQ4OworICAgICAgICBjYXNlIE5BVElWRV9VSU5UODoKKyAgICAgICAgICAgIHJldHVybiByYmZmaV9BYnN0cmFjdE1lbW9yeU9wcy51aW50ODsKKyAgICAgICAgY2FzZSBOQVRJVkVfSU5UMTY6CisgICAgICAgICAgICByZXR1cm4gcmJmZmlfQWJzdHJhY3RNZW1vcnlPcHMuaW50MTY7CisgICAgICAgIGNhc2UgTkFUSVZFX1VJTlQxNjoKKyAgICAgICAgICAgIHJldHVybiByYmZmaV9BYnN0cmFjdE1lbW9yeU9wcy51aW50MTY7CisgICAgICAgIGNhc2UgTkFUSVZFX0lOVDMyOgorICAgICAgICAgICAgcmV0dXJuIHJiZmZpX0Fic3RyYWN0TWVtb3J5T3BzLmludDMyOworICAgICAgICBjYXNlIE5BVElWRV9VSU5UMzI6CisgICAgICAgICAgICByZXR1cm4gcmJmZmlfQWJzdHJhY3RNZW1vcnlPcHMudWludDMyOworICAgICAgICBjYXNlIE5BVElWRV9JTlQ2NDoKKyAgICAgICAgICAgIHJldHVybiByYmZmaV9BYnN0cmFjdE1lbW9yeU9wcy5pbnQ2NDsKKyAgICAgICAgY2FzZSBOQVRJVkVfVUlOVDY0OgorICAgICAgICAgICAgcmV0dXJuIHJiZmZpX0Fic3RyYWN0TWVtb3J5T3BzLnVpbnQ2NDsKKyAgICAgICAgY2FzZSBOQVRJVkVfTE9ORzoKKyAgICAgICAgICAgIHJldHVybiByYmZmaV9BYnN0cmFjdE1lbW9yeU9wcy5zbG9uZzsKKyAgICAgICAgY2FzZSBOQVRJVkVfVUxPTkc6CisgICAgICAgICAgICByZXR1cm4gcmJmZmlfQWJzdHJhY3RNZW1vcnlPcHMudXNsb25nOworICAgICAgICBjYXNlIE5BVElWRV9GTE9BVDMyOgorICAgICAgICAgICAgcmV0dXJuIHJiZmZpX0Fic3RyYWN0TWVtb3J5T3BzLmZsb2F0MzI7CisgICAgICAgIGNhc2UgTkFUSVZFX0ZMT0FUNjQ6CisgICAgICAgICAgICByZXR1cm4gcmJmZmlfQWJzdHJhY3RNZW1vcnlPcHMuZmxvYXQ2NDsKKyAgICAgICAgY2FzZSBOQVRJVkVfTE9OR0RPVUJMRToKKyAgICAgICAgICAgIHJldHVybiByYmZmaV9BYnN0cmFjdE1lbW9yeU9wcy5sb25nZG91YmxlOworICAgICAgICBjYXNlIE5BVElWRV9QT0lOVEVSOgorICAgICAgICAgICAgcmV0dXJuIHJiZmZpX0Fic3RyYWN0TWVtb3J5T3BzLnBvaW50ZXI7CisgICAgICAgIGNhc2UgTkFUSVZFX1NUUklORzoKKyAgICAgICAgICAgIHJldHVybiByYmZmaV9BYnN0cmFjdE1lbW9yeU9wcy5zdHJwdHI7CisgICAgICAgIGNhc2UgTkFUSVZFX0JPT0w6CisgICAgICAgICAgICByZXR1cm4gcmJmZmlfQWJzdHJhY3RNZW1vcnlPcHMuYm9vbE9wOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisjZGVmaW5lIE1FTU9SWShvYmopIHJiZmZpX0Fic3RyYWN0TWVtb3J5X0Nhc3QoKG9iaiksIHJiZmZpX0Fic3RyYWN0TWVtb3J5Q2xhc3MpCisjZGVmaW5lIE1FTU9SWV9QVFIob2JqKSBNRU1PUlkoKG9iaikpLT5hZGRyZXNzCisjZGVmaW5lIE1FTU9SWV9MRU4ob2JqKSBNRU1PUlkoKG9iaikpLT5zaXplCisKKworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYJLyogUkJGRklfQUJTVFJBQ1RNRU1PUllfSCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9BYnN0cmFjdE1lbW9yeS5vIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQWJzdHJhY3RNZW1vcnkubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjdlNjViCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQWJzdHJhY3RNZW1vcnkubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9BcnJheVR5cGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0FycmF5VHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZDY2NmEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9BcnJheVR5cGUuYwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHJ1YnkuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlICJBcnJheVR5cGUuaCIKKworc3RhdGljIFZBTFVFIGFycmF5X3R5cGVfc19hbGxvY2F0ZShWQUxVRSBrbGFzcyk7CitzdGF0aWMgVkFMVUUgYXJyYXlfdHlwZV9pbml0aWFsaXplKFZBTFVFIHNlbGYsIFZBTFVFIHJiQ29tcG9uZW50VHlwZSwgVkFMVUUgcmJMZW5ndGgpOworc3RhdGljIHZvaWQgYXJyYXlfdHlwZV9tYXJrKEFycmF5VHlwZSAqKTsKK3N0YXRpYyB2b2lkIGFycmF5X3R5cGVfZnJlZShBcnJheVR5cGUgKik7CisKK1ZBTFVFIHJiZmZpX0FycmF5VHlwZUNsYXNzID0gUW5pbDsKKworc3RhdGljIFZBTFVFCithcnJheV90eXBlX3NfYWxsb2NhdGUoVkFMVUUga2xhc3MpCit7CisgICAgQXJyYXlUeXBlKiBhcnJheTsKKyAgICBWQUxVRSBvYmo7CisKKyAgICBvYmogPSBEYXRhX01ha2VfU3RydWN0KGtsYXNzLCBBcnJheVR5cGUsIGFycmF5X3R5cGVfbWFyaywgYXJyYXlfdHlwZV9mcmVlLCBhcnJheSk7CisKKyAgICBhcnJheS0+YmFzZS5uYXRpdmVUeXBlID0gTkFUSVZFX0FSUkFZOworICAgIGFycmF5LT5iYXNlLmZmaVR5cGUgPSB4Y2FsbG9jKDEsIHNpemVvZigqYXJyYXktPmJhc2UuZmZpVHlwZSkpOworICAgIGFycmF5LT5iYXNlLmZmaVR5cGUtPnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgICAgYXJyYXktPmJhc2UuZmZpVHlwZS0+c2l6ZSA9IDA7CisgICAgYXJyYXktPmJhc2UuZmZpVHlwZS0+YWxpZ25tZW50ID0gMDsKKyAgICBhcnJheS0+cmJDb21wb25lbnRUeXBlID0gUW5pbDsKKworICAgIHJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2b2lkCithcnJheV90eXBlX21hcmsoQXJyYXlUeXBlICphcnJheSkKK3sKKyAgICByYl9nY19tYXJrKGFycmF5LT5yYkNvbXBvbmVudFR5cGUpOworfQorCitzdGF0aWMgdm9pZAorYXJyYXlfdHlwZV9mcmVlKEFycmF5VHlwZSAqYXJyYXkpCit7CisgICAgeGZyZWUoYXJyYXktPmJhc2UuZmZpVHlwZSk7CisgICAgeGZyZWUoYXJyYXktPmZmaVR5cGVzKTsKKyAgICB4ZnJlZShhcnJheSk7Cit9CisKKworLyoKKyAqIGNhbGwtc2VxOiBpbml0aWFsaXplKGNvbXBvbmVudF90eXBlLCBsZW5ndGgpCisgKiBAcGFyYW0gW1R5cGVdIGNvbXBvbmVudF90eXBlCisgKiBAcGFyYW0gW051bWVyaWNdIGxlbmd0aAorICogQHJldHVybiBbc2VsZl0KKyAqIEEgbmV3IGluc3RhbmNlIG9mIEFycmF5VHlwZS4KKyAqLworc3RhdGljIFZBTFVFCithcnJheV90eXBlX2luaXRpYWxpemUoVkFMVUUgc2VsZiwgVkFMVUUgcmJDb21wb25lbnRUeXBlLCBWQUxVRSByYkxlbmd0aCkKK3sKKyAgICBBcnJheVR5cGUqIGFycmF5OworICAgIGludCBpOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEFycmF5VHlwZSwgYXJyYXkpOworCisgICAgYXJyYXktPmxlbmd0aCA9IE5VTTJVSU5UKHJiTGVuZ3RoKTsKKyAgICBhcnJheS0+cmJDb21wb25lbnRUeXBlID0gcmJDb21wb25lbnRUeXBlOworICAgIERhdGFfR2V0X1N0cnVjdChyYkNvbXBvbmVudFR5cGUsIFR5cGUsIGFycmF5LT5jb21wb25lbnRUeXBlKTsKKyAgICAKKyAgICBhcnJheS0+ZmZpVHlwZXMgPSB4Y2FsbG9jKGFycmF5LT5sZW5ndGggKyAxLCBzaXplb2YoKmFycmF5LT5mZmlUeXBlcykpOworICAgIGFycmF5LT5iYXNlLmZmaVR5cGUtPmVsZW1lbnRzID0gYXJyYXktPmZmaVR5cGVzOworICAgIGFycmF5LT5iYXNlLmZmaVR5cGUtPnNpemUgPSBhcnJheS0+Y29tcG9uZW50VHlwZS0+ZmZpVHlwZS0+c2l6ZSAqIGFycmF5LT5sZW5ndGg7CisgICAgYXJyYXktPmJhc2UuZmZpVHlwZS0+YWxpZ25tZW50ID0gYXJyYXktPmNvbXBvbmVudFR5cGUtPmZmaVR5cGUtPmFsaWdubWVudDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhcnJheS0+bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgYXJyYXktPmZmaVR5cGVzW2ldID0gYXJyYXktPmNvbXBvbmVudFR5cGUtPmZmaVR5cGU7CisgICAgfQorCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbGVuZ3RoCisgKiBAcmV0dXJuIFtOdW1lcmljXQorICogR2V0IGFycmF5J3MgbGVuZ3RoCisgKi8KK3N0YXRpYyBWQUxVRQorYXJyYXlfdHlwZV9sZW5ndGgoVkFMVUUgc2VsZikKK3sKKyAgICBBcnJheVR5cGUqIGFycmF5OworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEFycmF5VHlwZSwgYXJyYXkpOworCisgICAgcmV0dXJuIFVJTlQyTlVNKGFycmF5LT5sZW5ndGgpOworfQorCisvKgorICogY2FsbC1zZXE6IGVsZW1lbnRfdHlwZQorICogQHJldHVybiBbVHlwZV0KKyAqIEdldCBlbGVtZW50IHR5cGUuCisgKi8KK3N0YXRpYyBWQUxVRQorYXJyYXlfdHlwZV9lbGVtZW50X3R5cGUoVkFMVUUgc2VsZikKK3sKKyAgICBBcnJheVR5cGUqIGFycmF5OworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEFycmF5VHlwZSwgYXJyYXkpOworCisgICAgcmV0dXJuIGFycmF5LT5yYkNvbXBvbmVudFR5cGU7Cit9CisKK3ZvaWQKK3JiZmZpX0FycmF5VHlwZV9Jbml0KFZBTFVFIG1vZHVsZUZGSSkKK3sKKyAgICBWQUxVRSBmZmlfVHlwZTsKKworICAgIGZmaV9UeXBlID0gcmJmZmlfVHlwZUNsYXNzOworCisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jbGFzczogRkZJOjpBcnJheVR5cGUgPCBGRkk6OlR5cGUKKyAgICAgKgorICAgICAqIFRoaXMgaXMgYSB0eXBlZCBhcnJheS4gVGhlIHR5cGUgaXMgYSB7TmF0aXZlVHlwZSBuYXRpdmUgdHlwZX0uCisgICAgICovCisgICAgcmJmZmlfQXJyYXlUeXBlQ2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIobW9kdWxlRkZJLCAiQXJyYXlUeXBlIiwgZmZpX1R5cGUpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtdmFyaWFibGU6IEZGSTo6QXJyYXlUeXBlCisgICAgICovCisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9BcnJheVR5cGVDbGFzcyk7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jb25zdGFudDogRkZJOjpUeXBlOjpBcnJheQorICAgICAqLworICAgIHJiX2RlZmluZV9jb25zdChmZmlfVHlwZSwgIkFycmF5IiwgcmJmZmlfQXJyYXlUeXBlQ2xhc3MpOworCisgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMocmJmZmlfQXJyYXlUeXBlQ2xhc3MsIGFycmF5X3R5cGVfc19hbGxvY2F0ZSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9BcnJheVR5cGVDbGFzcywgImluaXRpYWxpemUiLCBhcnJheV90eXBlX2luaXRpYWxpemUsIDIpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfQXJyYXlUeXBlQ2xhc3MsICJsZW5ndGgiLCBhcnJheV90eXBlX2xlbmd0aCwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9BcnJheVR5cGVDbGFzcywgImVsZW1fdHlwZSIsIGFycmF5X3R5cGVfZWxlbWVudF90eXBlLCAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQXJyYXlUeXBlLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9BcnJheVR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTZmZmIxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQXJyYXlUeXBlLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSQkZGSV9BUlJBWVRZUEVfSAorI2RlZmluZQlSQkZGSV9BUlJBWVRZUEVfSAorCisjaW5jbHVkZSA8cnVieS5oPgorI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgIlR5cGUuaCIKKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IEFycmF5VHlwZV8geworICAgIFR5cGUgYmFzZTsKKyAgICBpbnQgbGVuZ3RoOworICAgIGZmaV90eXBlKiogZmZpVHlwZXM7CisgICAgVHlwZSogY29tcG9uZW50VHlwZTsKKyAgICBWQUxVRSByYkNvbXBvbmVudFR5cGU7Cit9IEFycmF5VHlwZTsKKworZXh0ZXJuIHZvaWQgcmJmZmlfQXJyYXlUeXBlX0luaXQoVkFMVUUgbW9kdWxlRkZJKTsKK2V4dGVybiBWQUxVRSByYmZmaV9BcnJheVR5cGVDbGFzczsKKworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYJLyogUkJGRklfQVJSQVlUWVBFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQXJyYXlUeXBlLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9BcnJheVR5cGUubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjVhMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQXJyYXlUeXBlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQnVmZmVyLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9CdWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWY0ODM0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQnVmZmVyLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBXYXluZSBNZWlzc25lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFtYW4gR3VwdGEgPGFtYW5AdG1tMS5uZXQ+CisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGludC5oPgorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjZWxzZQorIyBpbmNsdWRlICJ3aW4zMi9zdGRib29sLmgiCisjIGluY2x1ZGUgIndpbjMyL3N0ZGludC5oIgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8cnVieS5oPgorI2luY2x1ZGUgInJiZmZpLmgiCisjaW5jbHVkZSAicmJmZmlfZW5kaWFuLmgiCisjaW5jbHVkZSAiQWJzdHJhY3RNZW1vcnkuaCIKKworI2RlZmluZSBCVUZGRVJfRU1CRURfTUFYTEVOICg4KQordHlwZWRlZiBzdHJ1Y3QgQnVmZmVyIHsKKyAgICBBYnN0cmFjdE1lbW9yeSBtZW1vcnk7CisgICAgCisgICAgdW5pb24geworICAgICAgICBWQUxVRSByYlBhcmVudDsgLyogbGluayB0byBwYXJlbnQgYnVmZmVyICovCisgICAgICAgIGNoYXIqIHN0b3JhZ2U7IC8qIHN0YXJ0IG9mIG1hbGxvYyBhcmVhICovCisgICAgICAgIGxvbmcgZW1iZWRbQlVGRkVSX0VNQkVEX01BWExFTiAvIHNpemVvZihsb25nKV07IC8qIHN0b3JhZ2UgZm9yIHRpbnkgYWxsb2NhdGlvbnMgKi8KKyAgICB9IGRhdGE7Cit9IEJ1ZmZlcjsKKworc3RhdGljIFZBTFVFIGJ1ZmZlcl9hbGxvY2F0ZShWQUxVRSBrbGFzcyk7CitzdGF0aWMgVkFMVUUgYnVmZmVyX2luaXRpYWxpemUoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKTsKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9yZWxlYXNlKEJ1ZmZlciogcHRyKTsKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9tYXJrKEJ1ZmZlciogcHRyKTsKK3N0YXRpYyBWQUxVRSBidWZmZXJfZnJlZShWQUxVRSBzZWxmKTsKKworc3RhdGljIFZBTFVFIEJ1ZmZlckNsYXNzID0gUW5pbDsKKworc3RhdGljIFZBTFVFCitidWZmZXJfYWxsb2NhdGUoVkFMVUUga2xhc3MpCit7CisgICAgQnVmZmVyKiBidWZmZXI7CisgICAgVkFMVUUgb2JqOworCisgICAgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgQnVmZmVyLCBOVUxMLCBidWZmZXJfcmVsZWFzZSwgYnVmZmVyKTsKKyAgICBidWZmZXItPmRhdGEucmJQYXJlbnQgPSBRbmlsOworICAgIGJ1ZmZlci0+bWVtb3J5LmZsYWdzID0gTUVNX1JEIHwgTUVNX1dSOworCisgICAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQKK2J1ZmZlcl9yZWxlYXNlKEJ1ZmZlciogcHRyKQoreworICAgIGlmICgocHRyLT5tZW1vcnkuZmxhZ3MgJiBNRU1fRU1CRUQpID09IDAgJiYgcHRyLT5kYXRhLnN0b3JhZ2UgIT0gTlVMTCkgeworICAgICAgICB4ZnJlZShwdHItPmRhdGEuc3RvcmFnZSk7CisgICAgICAgIHB0ci0+ZGF0YS5zdG9yYWdlID0gTlVMTDsKKyAgICB9CisgICAgCisgICAgeGZyZWUocHRyKTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBpbml0aWFsaXplKHNpemUsIGNvdW50PTEsIGNsZWFyPWZhbHNlKQorICogQHBhcmFtIFtJbnRlZ2VyLCBTeW1ib2wsICNzaXplXSBUeXBlIG9yIHNpemUgaW4gYnl0ZXMgb2YgYSBidWZmZXIgY2VsbAorICogQHBhcmFtIFtGaXhudW1dIGNvdW50IG51bWJlciBvZiBjZWxsIGluIHRoZSBCdWZmZXIKKyAqIEBwYXJhbSBbQm9vbGVhbl0gY2xlYXIgaWYgdHJ1ZSwgc2V0IHRoZSBidWZmZXIgdG8gYWxsLXplcm8KKyAqIEByZXR1cm4gW3NlbGZdCisgKiBAcmFpc2Uge05vTWVtb3J5RXJyb3J9IGlmIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEJ1ZmZlcgorICogQSBuZXcgaW5zdGFuY2Ugb2YgQnVmZmVyLgorICovCitzdGF0aWMgVkFMVUUKK2J1ZmZlcl9pbml0aWFsaXplKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZikKK3sKKyAgICBWQUxVRSByYlNpemUgPSBRbmlsLCByYkNvdW50ID0gUW5pbCwgcmJDbGVhciA9IFFuaWw7CisgICAgQnVmZmVyKiBwOworICAgIGludCBuYXJnczsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBCdWZmZXIsIHApOworCisgICAgbmFyZ3MgPSByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjEyIiwgJnJiU2l6ZSwgJnJiQ291bnQsICZyYkNsZWFyKTsKKyAgICBwLT5tZW1vcnkudHlwZVNpemUgPSByYmZmaV90eXBlX3NpemUocmJTaXplKTsKKyAgICBwLT5tZW1vcnkuc2l6ZSA9IHAtPm1lbW9yeS50eXBlU2l6ZSAqIChuYXJncyA+IDEgPyBOVU0yTE9ORyhyYkNvdW50KSA6IDEpOworCisgICAgaWYgKHAtPm1lbW9yeS5zaXplID4gQlVGRkVSX0VNQkVEX01BWExFTikgeworICAgICAgICBwLT5kYXRhLnN0b3JhZ2UgPSB4bWFsbG9jKHAtPm1lbW9yeS5zaXplICsgNyk7CisgICAgICAgIGlmIChwLT5kYXRhLnN0b3JhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgcmJfcmFpc2UocmJfZU5vTWVtRXJyb3IsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHNpemU9JWx1IGJ5dGVzIiwgcC0+bWVtb3J5LnNpemUpOworICAgICAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBlbnN1cmUgdGhlIG1lbW9yeSBpcyBhbGlnbmVkIG9uIGF0IGxlYXN0IGEgOCBieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIHAtPm1lbW9yeS5hZGRyZXNzID0gKHZvaWQgKikgKCgodWludHB0cl90KSBwLT5kYXRhLnN0b3JhZ2UgKyAweDcpICYgKHVpbnRwdHJfdCkgfjB4N1VMKTsKKyAgICAKKyAgICAgICAgaWYgKHAtPm1lbW9yeS5zaXplID4gMCAmJiAobmFyZ3MgPCAzIHx8IFJURVNUKHJiQ2xlYXIpKSkgeworICAgICAgICAgICAgbWVtc2V0KHAtPm1lbW9yeS5hZGRyZXNzLCAwLCBwLT5tZW1vcnkuc2l6ZSk7CisgICAgICAgIH0KKyAgICAKKyAgICB9IGVsc2UgeworICAgICAgICBwLT5tZW1vcnkuZmxhZ3MgfD0gTUVNX0VNQkVEOworICAgICAgICBwLT5tZW1vcnkuYWRkcmVzcyA9ICh2b2lkICopICZwLT5kYXRhLmVtYmVkWzBdOworICAgIH0KKworICAgIGlmIChyYl9ibG9ja19naXZlbl9wKCkpIHsKKyAgICAgICAgcmV0dXJuIHJiX2Vuc3VyZShyYl95aWVsZCwgc2VsZiwgYnVmZmVyX2ZyZWUsIHNlbGYpOworICAgIH0KKworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogY2FsbC1zZXE6IGluaXRpYWxpemVfY29weShvdGhlcikKKyAqIEByZXR1cm4gW3NlbGZdCisgKiBETyBOT1QgQ0FMTCBUSElTIE1FVEhPRC4KKyAqLworc3RhdGljIFZBTFVFCitidWZmZXJfaW5pdGlhbGl6ZV9jb3B5KFZBTFVFIHNlbGYsIFZBTFVFIG90aGVyKQoreworICAgIEFic3RyYWN0TWVtb3J5KiBzcmM7CisgICAgQnVmZmVyKiBkc3Q7CisgICAgCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEJ1ZmZlciwgZHN0KTsKKyAgICBzcmMgPSByYmZmaV9BYnN0cmFjdE1lbW9yeV9DYXN0KG90aGVyLCBCdWZmZXJDbGFzcyk7CisgICAgaWYgKChkc3QtPm1lbW9yeS5mbGFncyAmIE1FTV9FTUJFRCkgPT0gMCAmJiBkc3QtPmRhdGEuc3RvcmFnZSAhPSBOVUxMKSB7CisgICAgICAgIHhmcmVlKGRzdC0+ZGF0YS5zdG9yYWdlKTsKKyAgICB9CisgICAgZHN0LT5kYXRhLnN0b3JhZ2UgPSB4bWFsbG9jKHNyYy0+c2l6ZSArIDcpOworICAgIGlmIChkc3QtPmRhdGEuc3RvcmFnZSA9PSBOVUxMKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VOb01lbUVycm9yLCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBzaXplPSVsdSBieXRlcyIsIHNyYy0+c2l6ZSk7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKyAgICAKKyAgICBkc3QtPm1lbW9yeS5hZGRyZXNzID0gKHZvaWQgKikgKCgodWludHB0cl90KSBkc3QtPmRhdGEuc3RvcmFnZSArIDB4NykgJiAodWludHB0cl90KSB+MHg3VUwpOworICAgIGRzdC0+bWVtb3J5LnNpemUgPSBzcmMtPnNpemU7CisgICAgZHN0LT5tZW1vcnkudHlwZVNpemUgPSBzcmMtPnR5cGVTaXplOworICAgIAorICAgIC8qIGZpbmFsbHksIGNvcHkgdGhlIGFjdHVhbCBidWZmZXIgY29udGVudHMgKi8KKyAgICBtZW1jcHkoZHN0LT5tZW1vcnkuYWRkcmVzcywgc3JjLT5hZGRyZXNzLCBzcmMtPnNpemUpOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKK3N0YXRpYyBWQUxVRQorYnVmZmVyX2FsbG9jX2lub3V0KGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUga2xhc3MpCit7CisgICAgcmV0dXJuIGJ1ZmZlcl9pbml0aWFsaXplKGFyZ2MsIGFyZ3YsIGJ1ZmZlcl9hbGxvY2F0ZShrbGFzcykpOworfQorCitzdGF0aWMgVkFMVUUKK3NsaWNlKFZBTFVFIHNlbGYsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbikKK3sKKyAgICBCdWZmZXIqIHB0cjsKKyAgICBCdWZmZXIqIHJlc3VsdDsKKyAgICBWQUxVRSBvYmogPSBRbmlsOworICAgIAorICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBCdWZmZXIsIHB0cik7CisgICAgY2hlY2tCb3VuZHMoJnB0ci0+bWVtb3J5LCBvZmZzZXQsIGxlbik7CisKKyAgICBvYmogPSBEYXRhX01ha2VfU3RydWN0KEJ1ZmZlckNsYXNzLCBCdWZmZXIsIGJ1ZmZlcl9tYXJrLCAtMSwgcmVzdWx0KTsKKyAgICByZXN1bHQtPm1lbW9yeS5hZGRyZXNzID0gcHRyLT5tZW1vcnkuYWRkcmVzcyArIG9mZnNldDsKKyAgICByZXN1bHQtPm1lbW9yeS5zaXplID0gbGVuOworICAgIHJlc3VsdC0+bWVtb3J5LmZsYWdzID0gcHRyLT5tZW1vcnkuZmxhZ3M7CisgICAgcmVzdWx0LT5tZW1vcnkudHlwZVNpemUgPSBwdHItPm1lbW9yeS50eXBlU2l6ZTsKKyAgICByZXN1bHQtPmRhdGEucmJQYXJlbnQgPSBzZWxmOworCisgICAgcmV0dXJuIG9iajsKK30KKworLyoKKyAqIGNhbGwtc2VxOiArIG9mZnNldAorICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQKKyAqIEByZXR1cm4gW0J1ZmZlcl0gYSBuZXcgaW5zdGFuY2Ugb2YgQnVmZmVyIHBvaW50aW5nIGZyb20gb2Zmc2V0IHVudGlsIGVuZCBvZiBwcmV2aW91cyBidWZmZXIuCisgKiBBZGQgYSBCdWZmZXIgd2l0aCBhbiBvZmZzZXQKKyAqLworc3RhdGljIFZBTFVFCitidWZmZXJfcGx1cyhWQUxVRSBzZWxmLCBWQUxVRSByYk9mZnNldCkKK3sKKyAgICBCdWZmZXIqIHB0cjsKKyAgICBsb25nIG9mZnNldCA9IE5VTTJMT05HKHJiT2Zmc2V0KTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBCdWZmZXIsIHB0cik7CisKKyAgICByZXR1cm4gc2xpY2Uoc2VsZiwgb2Zmc2V0LCBwdHItPm1lbW9yeS5zaXplIC0gb2Zmc2V0KTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBzbGljZShvZmZzZXQsIGxlbmd0aCkKKyAqIEBwYXJhbSBbTnVtZXJpY10gb2Zmc2V0CisgKiBAcGFyYW0gW051bWVyaWNdIGxlbmd0aAorICogQHJldHVybiBbQnVmZmVyXSBhIG5ldyBpbnN0YW5jZSBvZiBCdWZmZXIKKyAqIFNsaWNlIGFuIGV4aXN0aW5nIEJ1ZmZlci4KKyAqLworc3RhdGljIFZBTFVFCitidWZmZXJfc2xpY2UoVkFMVUUgc2VsZiwgVkFMVUUgcmJPZmZzZXQsIFZBTFVFIHJiTGVuZ3RoKQoreworICAgIHJldHVybiBzbGljZShzZWxmLCBOVU0yTE9ORyhyYk9mZnNldCksIE5VTTJMT05HKHJiTGVuZ3RoKSk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogaW5zcGVjdAorICogQHJldHVybiBbU3RyaW5nXQorICogSW5zcGVjdCBhIEJ1ZmZlci4KKyAqLworc3RhdGljIFZBTFVFCitidWZmZXJfaW5zcGVjdChWQUxVRSBzZWxmKQoreworICAgIGNoYXIgdG1wWzEwMF07CisgICAgQnVmZmVyKiBwdHI7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgQnVmZmVyLCBwdHIpOworCisgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiM8RkZJOkJ1ZmZlcjolcCBhZGRyZXNzPSVwIHNpemU9JWxkPiIsIHB0ciwgcHRyLT5tZW1vcnkuYWRkcmVzcywgcHRyLT5tZW1vcnkuc2l6ZSk7CisgICAgCisgICAgcmV0dXJuIHJiX3N0cl9uZXcyKHRtcCk7Cit9CisKKworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorIyBkZWZpbmUgU1dBUFBFRF9PUkRFUiBCSUdfRU5ESUFOCisjZWxzZQorIyBkZWZpbmUgU1dBUFBFRF9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKworLyoKKyAqIFNldCBvciBnZXQgZW5kaWFubmVzcyBvZiBCdWZmZXIuCisgKiBAb3ZlcmxvYWQgb3JkZXIKKyAqICBAcmV0dXJuIFs6YmlnLCA6bGl0dGxlXQorICogIEdldCBlbmRpYW5uZXNzIG9mIEJ1ZmZlci4KKyAqIEBvdmVybG9hZCBvcmRlcihvcmRlcikKKyAqICBAcGFyYW0gWzpiaWcsIDpsaXR0bGUsIDpuZXR3b3JrXSBvcmRlcgorICogIEByZXR1cm4gW3NlbGZdCisgKiAgU2V0IGVuZGlhbm5lc3Mgb2YgQnVmZmVyICgrOm5ldHdvcmsrIGlzIGFuIGFsaWFzIGZvciArOmJpZyspLgorICovCitzdGF0aWMgVkFMVUUKK2J1ZmZlcl9vcmRlcihpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIHNlbGYpCit7CisgICAgQnVmZmVyKiBwdHI7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgQnVmZmVyLCBwdHIpOworICAgIGlmIChhcmdjID09IDApIHsKKyAgICAgICAgaW50IG9yZGVyID0gKHB0ci0+bWVtb3J5LmZsYWdzICYgTUVNX1NXQVApID09IDAgPyBCWVRFX09SREVSIDogU1dBUFBFRF9PUkRFUjsKKyAgICAgICAgcmV0dXJuIG9yZGVyID09IEJJR19FTkRJQU4gPyBJRDJTWU0ocmJfaW50ZXJuKCJiaWciKSkgOiBJRDJTWU0ocmJfaW50ZXJuKCJsaXR0bGUiKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVkFMVUUgcmJPcmRlciA9IFFuaWw7CisgICAgICAgIGludCBvcmRlciA9IEJZVEVfT1JERVI7CisKKyAgICAgICAgaWYgKHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiMSIsICZyYk9yZGVyKSA8IDEpIHsKKyAgICAgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIm5lZWQgYnl0ZSBvcmRlciIpOworICAgICAgICB9CisgICAgICAgIGlmIChTWU1CT0xfUChyYk9yZGVyKSkgeworICAgICAgICAgICAgSUQgaWQgPSBTWU0ySUQocmJPcmRlcik7CisgICAgICAgICAgICBpZiAoaWQgPT0gcmJfaW50ZXJuKCJsaXR0bGUiKSkgeworICAgICAgICAgICAgICAgIG9yZGVyID0gTElUVExFX0VORElBTjsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSByYl9pbnRlcm4oImJpZyIpIHx8IGlkID09IHJiX2ludGVybigibmV0d29yayIpKSB7CisgICAgICAgICAgICAgICAgb3JkZXIgPSBCSUdfRU5ESUFOOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvcmRlciAhPSBCWVRFX09SREVSKSB7CisgICAgICAgICAgICBCdWZmZXIqIHAyOworICAgICAgICAgICAgVkFMVUUgcmV0dmFsID0gc2xpY2Uoc2VsZiwgMCwgcHRyLT5tZW1vcnkuc2l6ZSk7CisKKyAgICAgICAgICAgIERhdGFfR2V0X1N0cnVjdChyZXR2YWwsIEJ1ZmZlciwgcDIpOworICAgICAgICAgICAgcDItPm1lbW9yeS5mbGFncyB8PSBNRU1fU1dBUDsKKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9Cit9CisKKy8qIE9ubHkgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgaWYgdGhlIHlpZWxkIGluIHRoZSBpbml0aWFsaXplciB0aHJvd3MgYW4gZXhjZXB0aW9uICovCitzdGF0aWMgVkFMVUUKK2J1ZmZlcl9mcmVlKFZBTFVFIHNlbGYpCit7CisgICAgQnVmZmVyKiBwdHI7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgQnVmZmVyLCBwdHIpOworICAgIGlmICgocHRyLT5tZW1vcnkuZmxhZ3MgJiBNRU1fRU1CRUQpID09IDAgJiYgcHRyLT5kYXRhLnN0b3JhZ2UgIT0gTlVMTCkgeworICAgICAgICB4ZnJlZShwdHItPmRhdGEuc3RvcmFnZSk7CisgICAgICAgIHB0ci0+ZGF0YS5zdG9yYWdlID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQKK2J1ZmZlcl9tYXJrKEJ1ZmZlciogcHRyKQoreworICAgIHJiX2djX21hcmsocHRyLT5kYXRhLnJiUGFyZW50KTsKK30KKwordm9pZAorcmJmZmlfQnVmZmVyX0luaXQoVkFMVUUgbW9kdWxlRkZJKQoreworICAgIFZBTFVFIGZmaV9BYnN0cmFjdE1lbW9yeSA9ICByYmZmaV9BYnN0cmFjdE1lbW9yeUNsYXNzOworCisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jbGFzczogRkZJOjpCdWZmZXIgPCBGRkk6OkFic3RyYWN0TWVtb3J5CisgICAgICoKKyAgICAgKiBBIEJ1ZmZlciBpcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IHR5cGUuIEl0IHNob3VsZCBiZSB1c2Ugd2l0aCBmdW5jdGlvbnMgcGxheWluZyB3aXRoIEMgYXJyYXlzLgorICAgICAqLworICAgIEJ1ZmZlckNsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKG1vZHVsZUZGSSwgIkJ1ZmZlciIsIGZmaV9BYnN0cmFjdE1lbW9yeSk7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LXZhcmlhYmxlOiBGRkk6OkJ1ZmZlcgorICAgICAqLworICAgIHJiX2dsb2JhbF92YXJpYWJsZSgmQnVmZmVyQ2xhc3MpOworICAgIHJiX2RlZmluZV9hbGxvY19mdW5jKEJ1ZmZlckNsYXNzLCBidWZmZXJfYWxsb2NhdGUpOworCisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IGFsbG9jX2lub3V0CisgICAgICogY2FsbC1zZXE6IGFsbG9jX2lub3V0KCphcmdzKQorICAgICAqIENyZWF0ZSBhIG5ldyBCdWZmZXIgZm9yIGluIGFuZCBvdXQgYXJndW1lbnRzIChhbGlhcyA6IDxpPm5ld19pbm91dDwvaT4pLgorICAgICAqLworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKEJ1ZmZlckNsYXNzLCAiYWxsb2NfaW5vdXQiLCBidWZmZXJfYWxsb2NfaW5vdXQsIC0xKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogYWxsb2Nfb3V0CisgICAgICogY2FsbC1zZXE6IGFsbG9jX291dCgqYXJncykKKyAgICAgKiBDcmVhdGUgYSBuZXcgQnVmZmVyIGZvciBvdXQgYXJndW1lbnRzIChhbGlhcyA6IDxpPm5ld19vdXQ8L2k+KS4KKyAgICAgKi8KKyAgICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChCdWZmZXJDbGFzcywgImFsbG9jX291dCIsIGJ1ZmZlcl9hbGxvY19pbm91dCwgLTEpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtbWV0aG9kOiBhbGxvY19pbgorICAgICAqIGNhbGwtc2VxOiBhbGxvY19pbigqYXJncykKKyAgICAgKiBDcmVhdGUgYSBuZXcgQnVmZmVyIGZvciBpbiBhcmd1bWVudHMgKGFsaWFzIDogPGk+bmV3X2luPC9pPikuCisgICAgICovCisgICAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QoQnVmZmVyQ2xhc3MsICJhbGxvY19pbiIsIGJ1ZmZlcl9hbGxvY19pbm91dCwgLTEpOworICAgIHJiX2RlZmluZV9hbGlhcyhyYl9zaW5nbGV0b25fY2xhc3MoQnVmZmVyQ2xhc3MpLCAibmV3X2luIiwgImFsbG9jX2luIik7CisgICAgcmJfZGVmaW5lX2FsaWFzKHJiX3NpbmdsZXRvbl9jbGFzcyhCdWZmZXJDbGFzcyksICJuZXdfb3V0IiwgImFsbG9jX291dCIpOworICAgIHJiX2RlZmluZV9hbGlhcyhyYl9zaW5nbGV0b25fY2xhc3MoQnVmZmVyQ2xhc3MpLCAibmV3X2lub3V0IiwgImFsbG9jX2lub3V0Iik7CisgICAgCisgICAgcmJfZGVmaW5lX21ldGhvZChCdWZmZXJDbGFzcywgImluaXRpYWxpemUiLCBidWZmZXJfaW5pdGlhbGl6ZSwgLTEpOworICAgIHJiX2RlZmluZV9tZXRob2QoQnVmZmVyQ2xhc3MsICJpbml0aWFsaXplX2NvcHkiLCBidWZmZXJfaW5pdGlhbGl6ZV9jb3B5LCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKEJ1ZmZlckNsYXNzLCAib3JkZXIiLCBidWZmZXJfb3JkZXIsIC0xKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKEJ1ZmZlckNsYXNzLCAiaW5zcGVjdCIsIGJ1ZmZlcl9pbnNwZWN0LCAwKTsKKyAgICByYl9kZWZpbmVfYWxpYXMoQnVmZmVyQ2xhc3MsICJsZW5ndGgiLCAidG90YWwiKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKEJ1ZmZlckNsYXNzLCAiKyIsIGJ1ZmZlcl9wbHVzLCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKEJ1ZmZlckNsYXNzLCAic2xpY2UiLCBidWZmZXJfc2xpY2UsIDIpOworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9CdWZmZXIubyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0J1ZmZlci5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTA4NzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9CdWZmZXIubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9DYWxsLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9DYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczOGNiNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0NhbGwuYwpAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgTHVjIEhlaW5yaWNoIDxsdWNAaG9uay1ob25rLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOSwgTWlrZSBEYWxlc3NpbyA8bWlrZS5kYWxlc3Npb0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEFtYW4gR3VwdGEuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGluY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbHNlCisjIGluY2x1ZGUgIndpbjMyL3N0ZGJvb2wuaCIKKyMgaW5jbHVkZSAid2luMzIvc3RkaW50LmgiCisjZW5kaWYKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHJ1YnkuaD4KKyNpZiBkZWZpbmVkKEhBVkVfTkFUSVZFVEhSRUFEKSAmJiAoZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9CTE9DS0lOR19SRUdJT04pIHx8IGRlZmluZWQoSEFWRV9SQl9USFJFQURfQ0FMTF9XSVRIT1VUX0dWTCkpICYmICFkZWZpbmVkKF9XSU4zMikKKyMgIGluY2x1ZGUgPHNpZ25hbC5oPgorIyAgaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSAiZXh0Y29uZi5oIgorI2luY2x1ZGUgInJiZmZpLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAiQWJzdHJhY3RNZW1vcnkuaCIKKyNpbmNsdWRlICJQb2ludGVyLmgiCisjaW5jbHVkZSAiU3RydWN0LmgiCisjaW5jbHVkZSAiRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJUeXBlLmgiCisjaW5jbHVkZSAiTGFzdEVycm9yLmgiCisjaW5jbHVkZSAiQ2FsbC5oIgorI2luY2x1ZGUgIk1hcHBlZFR5cGUuaCIKKyNpbmNsdWRlICJUaHJlYWQuaCIKKyNpbmNsdWRlICJMb25nRG91YmxlLmgiCisKKyNpZmRlZiBVU0VfUkFXCisjICBpZm5kZWYgX19pMzg2X18KKyMgICAgZXJyb3IgIlJBVyBhcmd1bWVudCBwYWNraW5nIG9ubHkgc3VwcG9ydGVkIG9uIGkzODYiCisjICBlbmRpZgorCisjZGVmaW5lIElOVDhfQURKICg0KQorI2RlZmluZSBJTlQxNl9BREogKDQpCisjZGVmaW5lIElOVDMyX0FESiAoNCkKKyNkZWZpbmUgSU5UNjRfQURKICg4KQorI2RlZmluZSBMT05HX0FESiAoc2l6ZW9mKGxvbmcpKQorI2RlZmluZSBGTE9BVDMyX0FESiAoNCkKKyNkZWZpbmUgRkxPQVQ2NF9BREogKDgpCisjZGVmaW5lIEFERFJFU1NfQURKIChzaXplb2Yodm9pZCAqKSkKKyNkZWZpbmUgTE9OR0RPVUJMRV9BREogKGZmaV90eXBlX2xvbmdkb3VibGUuYWxpZ25tZW50KQorCisjZW5kaWYgLyogVVNFX1JBVyAqLworCisjaWZkZWYgVVNFX1JBVworIyAgZGVmaW5lIEFESihwLCBhKSAoKHApID0gKEZGSVN0b3JhZ2UqKSAoKChjaGFyICopIHApICsgYSMjX0FESikpCisjZWxzZQorIyAgZGVmaW5lIEFESihwLCBhKSAoKysocCkpCisjZW5kaWYKKworc3RhdGljIHZvaWQqIGNhbGxiYWNrX3BhcmFtKFZBTFVFIHByb2MsIFZBTFVFIGNiaW5mbyk7CitzdGF0aWMgaW5saW5lIHZvaWQqIGdldFBvaW50ZXIoVkFMVUUgdmFsdWUsIGludCB0eXBlKTsKKworc3RhdGljIElEIGlkX3RvX3B0ciwgaWRfbWFwX3N5bWJvbCwgaWRfdG9fbmF0aXZlOworCit2b2lkCityYmZmaV9TZXR1cENhbGxQYXJhbXMoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBpbnQgcGFyYW1Db3VudCwgVHlwZSoqIHBhcmFtVHlwZXMsCisgICAgICAgIEZGSVN0b3JhZ2UqIHBhcmFtU3RvcmFnZSwgdm9pZCoqIGZmaVZhbHVlcywKKyAgICAgICAgVkFMVUUqIGNhbGxiYWNrUGFyYW1ldGVycywgaW50IGNhbGxiYWNrQ291bnQsIFZBTFVFIGVudW1zKQoreworICAgIFZBTFVFIGNhbGxiYWNrUHJvYyA9IFFuaWw7CisgICAgRkZJU3RvcmFnZSogcGFyYW0gPSAmcGFyYW1TdG9yYWdlWzBdOworICAgIGludCBpLCBhcmdpZHgsIGNiaWR4LCBhcmdDb3VudDsKKworICAgIGlmICh1bmxpa2VseShwYXJhbUNvdW50ICE9IC0xICYmIHBhcmFtQ291bnQgIT0gYXJnYykpIHsKKyAgICAgICAgaWYgKGFyZ2MgPT0gKHBhcmFtQ291bnQgLSAxKSAmJiBjYWxsYmFja0NvdW50ID09IDEgJiYgcmJfYmxvY2tfZ2l2ZW5fcCgpKSB7CisgICAgICAgICAgICBjYWxsYmFja1Byb2MgPSByYl9ibG9ja19wcm9jKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICglZCBmb3IgJWQpIiwgYXJnYywgcGFyYW1Db3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhcmdDb3VudCA9IHBhcmFtQ291bnQgIT0gLTEgPyBwYXJhbUNvdW50IDogYXJnYzsKKworICAgIGZvciAoaSA9IDAsIGFyZ2lkeCA9IDAsIGNiaWR4ID0gMDsgaSA8IGFyZ0NvdW50OyArK2kpIHsKKyAgICAgICAgVHlwZSogcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKKyAgICAgICAgaW50IHR5cGU7CisKKyAgICAgICAgCisgICAgICAgIGlmICh1bmxpa2VseShwYXJhbVR5cGUtPm5hdGl2ZVR5cGUgPT0gTkFUSVZFX01BUFBFRCkpIHsKKyAgICAgICAgICAgIFZBTFVFIHZhbHVlc1tdID0geyBhcmd2W2FyZ2lkeF0sIFFuaWwgfTsKKyAgICAgICAgICAgIGFyZ3ZbYXJnaWR4XSA9IHJiX2Z1bmNhbGwyKCgoTWFwcGVkVHlwZSAqKSBwYXJhbVR5cGUpLT5yYkNvbnZlcnRlciwgaWRfdG9fbmF0aXZlLCAyLCB2YWx1ZXMpOworICAgICAgICAgICAgcGFyYW1UeXBlID0gKChNYXBwZWRUeXBlICopIHBhcmFtVHlwZSktPnR5cGU7CisgICAgICAgIH0KKworICAgICAgICB0eXBlID0gYXJnaWR4IDwgYXJnYyA/IFRZUEUoYXJndlthcmdpZHhdKSA6IFRfTk9ORTsKKyAgICAgICAgZmZpVmFsdWVzW2ldID0gcGFyYW07CisKKyAgICAgICAgc3dpdGNoIChwYXJhbVR5cGUtPm5hdGl2ZVR5cGUpIHsKKworICAgICAgICAgICAgY2FzZSBOQVRJVkVfSU5UODoKKyAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkodHlwZSA9PSBUX1NZTUJPTCAmJiBlbnVtcyAhPSBRbmlsKSkgeworICAgICAgICAgICAgICAgICAgICBWQUxVRSB2YWx1ZSA9IHJiX2Z1bmNhbGwoZW51bXMsIGlkX21hcF9zeW1ib2wsIDEsIGFyZ3ZbYXJnaWR4XSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5zOCA9IE5VTTJJTlQodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5zOCA9IE5VTTJJTlQoYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2FyZ2lkeDsKKyAgICAgICAgICAgICAgICBBREoocGFyYW0sIElOVDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5BVElWRV9JTlQxNjoKKyAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkodHlwZSA9PSBUX1NZTUJPTCAmJiBlbnVtcyAhPSBRbmlsKSkgeworICAgICAgICAgICAgICAgICAgICBWQUxVRSB2YWx1ZSA9IHJiX2Z1bmNhbGwoZW51bXMsIGlkX21hcF9zeW1ib2wsIDEsIGFyZ3ZbYXJnaWR4XSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5zMTYgPSBOVU0ySU5UKHZhbHVlKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5zMTYgPSBOVU0ySU5UKGFyZ3ZbYXJnaWR4XSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKythcmdpZHg7CisgICAgICAgICAgICAgICAgQURKKHBhcmFtLCBJTlQxNik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX0lOVDMyOgorICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSh0eXBlID09IFRfU1lNQk9MICYmIGVudW1zICE9IFFuaWwpKSB7CisgICAgICAgICAgICAgICAgICAgIFZBTFVFIHZhbHVlID0gcmJfZnVuY2FsbChlbnVtcywgaWRfbWFwX3N5bWJvbCwgMSwgYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnMzMiA9IE5VTTJJTlQodmFsdWUpOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnMzMiA9IE5VTTJJTlQoYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2FyZ2lkeDsKKyAgICAgICAgICAgICAgICBBREoocGFyYW0sIElOVDMyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQVRJVkVfQk9PTDoKKyAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBUX1RSVUUgJiYgdHlwZSAhPSBUX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJ3cm9uZyBhcmd1bWVudCB0eXBlICAoZXhwZWN0ZWQgYSBib29sZWFuIHBhcmFtZXRlcikiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW0tPnM4ID0gYXJndlthcmdpZHgrK10gPT0gUXRydWU7CisgICAgICAgICAgICAgICAgQURKKHBhcmFtLCBJTlQ4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQVRJVkVfVUlOVDg6CisgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KHR5cGUgPT0gVF9TWU1CT0wgJiYgZW51bXMgIT0gUW5pbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgdmFsdWUgPSByYl9mdW5jYWxsKGVudW1zLCBpZF9tYXBfc3ltYm9sLCAxLCBhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dTggPSBOVU0yVUlOVCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnU4ID0gTlVNMlVJTlQoYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBREoocGFyYW0sIElOVDgpOworICAgICAgICAgICAgICAgICsrYXJnaWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5BVElWRV9VSU5UMTY6CisgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KHR5cGUgPT0gVF9TWU1CT0wgJiYgZW51bXMgIT0gUW5pbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgdmFsdWUgPSByYl9mdW5jYWxsKGVudW1zLCBpZF9tYXBfc3ltYm9sLCAxLCBhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dTE2ID0gTlVNMlVJTlQodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT51MTYgPSBOVU0yVUlOVChhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFESihwYXJhbSwgSU5UMTYpOworICAgICAgICAgICAgICAgICsrYXJnaWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5BVElWRV9VSU5UMzI6CisgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KHR5cGUgPT0gVF9TWU1CT0wgJiYgZW51bXMgIT0gUW5pbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgdmFsdWUgPSByYl9mdW5jYWxsKGVudW1zLCBpZF9tYXBfc3ltYm9sLCAxLCBhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dTMyID0gTlVNMlVJTlQodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT51MzIgPSBOVU0yVUlOVChhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFESihwYXJhbSwgSU5UMzIpOworICAgICAgICAgICAgICAgICsrYXJnaWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5BVElWRV9JTlQ2NDoKKyAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkodHlwZSA9PSBUX1NZTUJPTCAmJiBlbnVtcyAhPSBRbmlsKSkgeworICAgICAgICAgICAgICAgICAgICBWQUxVRSB2YWx1ZSA9IHJiX2Z1bmNhbGwoZW51bXMsIGlkX21hcF9zeW1ib2wsIDEsIGFyZ3ZbYXJnaWR4XSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5pNjQgPSBOVU0yTEwodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5pNjQgPSBOVU0yTEwoYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBREoocGFyYW0sIElOVDY0KTsKKyAgICAgICAgICAgICAgICArK2FyZ2lkeDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQVRJVkVfVUlOVDY0OgorICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSh0eXBlID09IFRfU1lNQk9MICYmIGVudW1zICE9IFFuaWwpKSB7CisgICAgICAgICAgICAgICAgICAgIFZBTFVFIHZhbHVlID0gcmJfZnVuY2FsbChlbnVtcywgaWRfbWFwX3N5bWJvbCwgMSwgYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnU2NCA9IE5VTTJVTEwodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT51NjQgPSBOVU0yVUxMKGFyZ3ZbYXJnaWR4XSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQURKKHBhcmFtLCBJTlQ2NCk7CisgICAgICAgICAgICAgICAgKythcmdpZHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX0xPTkc6CisgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KHR5cGUgPT0gVF9TWU1CT0wgJiYgZW51bXMgIT0gUW5pbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgdmFsdWUgPSByYl9mdW5jYWxsKGVudW1zLCBpZF9tYXBfc3ltYm9sLCAxLCBhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgICAgICAqKGZmaV9zYXJnICopIHBhcmFtID0gTlVNMkxPTkcodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICooZmZpX3NhcmcgKikgcGFyYW0gPSBOVU0yTE9ORyhhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFESihwYXJhbSwgTE9ORyk7CisgICAgICAgICAgICAgICAgKythcmdpZHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX1VMT05HOgorICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSh0eXBlID09IFRfU1lNQk9MICYmIGVudW1zICE9IFFuaWwpKSB7CisgICAgICAgICAgICAgICAgICAgIFZBTFVFIHZhbHVlID0gcmJfZnVuY2FsbChlbnVtcywgaWRfbWFwX3N5bWJvbCwgMSwgYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICAgICAgKihmZmlfYXJnICopIHBhcmFtID0gTlVNMlVMT05HKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqKGZmaV9hcmcgKikgcGFyYW0gPSBOVU0yVUxPTkcoYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBREoocGFyYW0sIExPTkcpOworICAgICAgICAgICAgICAgICsrYXJnaWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5BVElWRV9GTE9BVDMyOgorICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSh0eXBlID09IFRfU1lNQk9MICYmIGVudW1zICE9IFFuaWwpKSB7CisgICAgICAgICAgICAgICAgICAgIFZBTFVFIHZhbHVlID0gcmJfZnVuY2FsbChlbnVtcywgaWRfbWFwX3N5bWJvbCwgMSwgYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPmYzMiA9IChmbG9hdCkgTlVNMkRCTCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPmYzMiA9IChmbG9hdCkgTlVNMkRCTChhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFESihwYXJhbSwgRkxPQVQzMik7CisgICAgICAgICAgICAgICAgKythcmdpZHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX0ZMT0FUNjQ6CisgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KHR5cGUgPT0gVF9TWU1CT0wgJiYgZW51bXMgIT0gUW5pbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgdmFsdWUgPSByYl9mdW5jYWxsKGVudW1zLCBpZF9tYXBfc3ltYm9sLCAxLCBhcmd2W2FyZ2lkeF0pOworICAgICAgICAgICAgICAgICAgICBwYXJhbS0+ZjY0ID0gTlVNMkRCTCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPmY2NCA9IE5VTTJEQkwoYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBREoocGFyYW0sIEZMT0FUNjQpOworICAgICAgICAgICAgICAgICsrYXJnaWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5BVElWRV9MT05HRE9VQkxFOgorICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSh0eXBlID09IFRfU1lNQk9MICYmIGVudW1zICE9IFFuaWwpKSB7CisgICAgICAgICAgICAgICAgICAgIFZBTFVFIHZhbHVlID0gcmJfZnVuY2FsbChlbnVtcywgaWRfbWFwX3N5bWJvbCwgMSwgYXJndlthcmdpZHhdKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPmxkID0gcmJmZmlfbnVtMmxvbmdkb3VibGUodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5sZCA9IHJiZmZpX251bTJsb25nZG91YmxlKGFyZ3ZbYXJnaWR4XSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQURKKHBhcmFtLCBMT05HRE9VQkxFKTsKKyAgICAgICAgICAgICAgICArK2FyZ2lkeDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICBjYXNlIE5BVElWRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9OSUwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnB0ciA9IE5VTEw7IAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYl9zYWZlX2xldmVsKCkgPj0gMSAmJiBPQkpfVEFJTlRFRChhcmd2W2FyZ2lkeF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYl9yYWlzZShyYl9lU2VjdXJpdHlFcnJvciwgIlVuc2FmZSBzdHJpbmcgcGFyYW1ldGVyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwYXJhbS0+cHRyID0gU3RyaW5nVmFsdWVDU3RyKGFyZ3ZbYXJnaWR4XSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQURKKHBhcmFtLCBBRERSRVNTKTsKKyAgICAgICAgICAgICAgICArK2FyZ2lkeDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQVRJVkVfUE9JTlRFUjoKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX0JVRkZFUl9JTjoKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX0JVRkZFUl9PVVQ6CisgICAgICAgICAgICBjYXNlIE5BVElWRV9CVUZGRVJfSU5PVVQ6CisgICAgICAgICAgICAgICAgcGFyYW0tPnB0ciA9IGdldFBvaW50ZXIoYXJndlthcmdpZHgrK10sIHR5cGUpOworICAgICAgICAgICAgICAgIEFESihwYXJhbSwgQUREUkVTUyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgY2FzZSBOQVRJVkVfRlVOQ1RJT046CisgICAgICAgICAgICBjYXNlIE5BVElWRV9DQUxMQkFDSzoKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tQcm9jICE9IFFuaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnB0ciA9IGNhbGxiYWNrX3BhcmFtKGNhbGxiYWNrUHJvYywgY2FsbGJhY2tQYXJhbWV0ZXJzW2NiaWR4KytdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXJhbS0+cHRyID0gY2FsbGJhY2tfcGFyYW0oYXJndlthcmdpZHhdLCBjYWxsYmFja1BhcmFtZXRlcnNbY2JpZHgrK10pOworICAgICAgICAgICAgICAgICAgICArK2FyZ2lkeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQURKKHBhcmFtLCBBRERSRVNTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQVRJVkVfU1RSVUNUOgorICAgICAgICAgICAgICAgIGZmaVZhbHVlc1tpXSA9IGdldFBvaW50ZXIoYXJndlthcmdpZHgrK10sIHR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkludmFsaWQgcGFyYW1ldGVyIHR5cGU6ICVkIiwgcGFyYW1UeXBlLT5uYXRpdmVUeXBlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIFZBTFVFCitjYWxsX2Jsb2NraW5nX2Z1bmN0aW9uKHZvaWQqIGRhdGEpCit7CisgICAgcmJmZmlfYmxvY2tpbmdfY2FsbF90KiBiID0gKHJiZmZpX2Jsb2NraW5nX2NhbGxfdCAqKSBkYXRhOworICAgIGItPmZyYW1lLT5oYXNfZ3ZsID0gZmFsc2U7CisgICAgZmZpX2NhbGwoJmItPmNpZiwgRkZJX0ZOKGItPmZ1bmN0aW9uKSwgYi0+cmV0dmFsLCBiLT5mZmlWYWx1ZXMpOworICAgIGItPmZyYW1lLT5oYXNfZ3ZsID0gdHJ1ZTsKKworICAgIHJldHVybiBRbmlsOworfQorCitWQUxVRQorcmJmZmlfZG9fYmxvY2tpbmdfY2FsbCh2b2lkICpkYXRhKQoreworICAgIHJiZmZpX3RocmVhZF9ibG9ja2luZ19yZWdpb24oY2FsbF9ibG9ja2luZ19mdW5jdGlvbiwgZGF0YSwgKHZvaWQgKikgLTEsIE5VTEwpOworCisgICAgcmV0dXJuIFFuaWw7Cit9CisKK1ZBTFVFCityYmZmaV9zYXZlX2ZyYW1lX2V4Y2VwdGlvbih2b2lkICpkYXRhLCBWQUxVRSBleGMpCit7CisgICAgcmJmZmlfZnJhbWVfdCogZnJhbWUgPSAocmJmZmlfZnJhbWVfdCAqKSBkYXRhOworICAgIGZyYW1lLT5leGMgPSBleGM7CisgICAgcmV0dXJuIFFuaWw7Cit9CisKK1ZBTFVFCityYmZmaV9DYWxsRnVuY3Rpb24oaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCB2b2lkKiBmdW5jdGlvbiwgRnVuY3Rpb25UeXBlKiBmbkluZm8pCit7CisgICAgdm9pZCogcmV0dmFsOworICAgIHZvaWQqKiBmZmlWYWx1ZXM7CisgICAgRkZJU3RvcmFnZSogcGFyYW1zOworICAgIFZBTFVFIHJiUmV0dXJuVmFsdWU7CisgICAgcmJmZmlfZnJhbWVfdCBmcmFtZSA9IHsgMCB9OworICAgIAorICAgIHJldHZhbCA9IGFsbG9jYShNQVgoZm5JbmZvLT5mZmlfY2lmLnJ0eXBlLT5zaXplLCBGRklfU0laRU9GX0FSRykpOworICAgIAorICAgIGlmICh1bmxpa2VseShmbkluZm8tPmJsb2NraW5nKSkgeworICAgICAgICByYmZmaV9ibG9ja2luZ19jYWxsX3QqIGJjOworCisgICAgICAgIC8qCisgICAgICAgICAqIGR1ZSB0byB0aGUgd2F5IHRocmVhZCBzd2l0Y2hpbmcgd29ya3Mgb24gb2xkZXIgcnVieSB2YXJpYW50cywgd2UKKyAgICAgICAgICogY2Fubm90IGFsbG9jYXRlIGFueXRoaW5nIHBhc3NlZCB0byB0aGUgYmxvY2tpbmcgZnVuY3Rpb24gb24gdGhlIHN0YWNrCisgICAgICAgICAqLworI2lmIGRlZmluZWQoSEFWRV9SQl9USFJFQURfQkxPQ0tJTkdfUkVHSU9OKSB8fCBkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0NBTExfV0lUSE9VVF9HVkwpCisgICAgICAgIGZmaVZhbHVlcyA9IEFMTE9DQV9OKHZvaWQgKiwgZm5JbmZvLT5wYXJhbWV0ZXJDb3VudCk7CisgICAgICAgIHBhcmFtcyA9IEFMTE9DQV9OKEZGSVN0b3JhZ2UsIGZuSW5mby0+cGFyYW1ldGVyQ291bnQpOworICAgICAgICBiYyA9IEFMTE9DQV9OKHJiZmZpX2Jsb2NraW5nX2NhbGxfdCwgMSk7CisgICAgICAgIGJjLT5yZXR2YWwgPSByZXR2YWw7CisjZWxzZQorICAgICAgICBmZmlWYWx1ZXMgPSBBTExPQ19OKHZvaWQgKiwgZm5JbmZvLT5wYXJhbWV0ZXJDb3VudCk7CisgICAgICAgIHBhcmFtcyA9IEFMTE9DX04oRkZJU3RvcmFnZSwgZm5JbmZvLT5wYXJhbWV0ZXJDb3VudCk7CisgICAgICAgIGJjID0gQUxMT0NfTihyYmZmaV9ibG9ja2luZ19jYWxsX3QsIDEpOworICAgICAgICBiYy0+cmV0dmFsID0geG1hbGxvYyhNQVgoZm5JbmZvLT5mZmlfY2lmLnJ0eXBlLT5zaXplLCBGRklfU0laRU9GX0FSRykpOworICAgICAgICBiYy0+c3RrcmV0dmFsID0gcmV0dmFsOworI2VuZGlmCisgICAgICAgIGJjLT5jaWYgPSBmbkluZm8tPmZmaV9jaWY7CisgICAgICAgIGJjLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgICAgICBiYy0+ZmZpVmFsdWVzID0gZmZpVmFsdWVzOworICAgICAgICBiYy0+cGFyYW1zID0gcGFyYW1zOworICAgICAgICBiYy0+ZnJhbWUgPSAmZnJhbWU7CisKKyAgICAgICAgcmJmZmlfU2V0dXBDYWxsUGFyYW1zKGFyZ2MsIGFyZ3YsCisgICAgICAgICAgICBmbkluZm8tPnBhcmFtZXRlckNvdW50LCBmbkluZm8tPnBhcmFtZXRlclR5cGVzLCBwYXJhbXMsIGZmaVZhbHVlcywKKyAgICAgICAgICAgIGZuSW5mby0+Y2FsbGJhY2tQYXJhbWV0ZXJzLCBmbkluZm8tPmNhbGxiYWNrQ291bnQsIGZuSW5mby0+cmJFbnVtcyk7CisKKyAgICAgICAgcmJmZmlfZnJhbWVfcHVzaCgmZnJhbWUpOyAKKyAgICAgICAgcmJfcmVzY3VlMihyYmZmaV9kb19ibG9ja2luZ19jYWxsLCAoVkFMVUUpIGJjLCByYmZmaV9zYXZlX2ZyYW1lX2V4Y2VwdGlvbiwgKFZBTFVFKSAmZnJhbWUsIHJiX2VFeGNlcHRpb24sIChWQUxVRSkgMCk7CisgICAgICAgIHJiZmZpX2ZyYW1lX3BvcCgmZnJhbWUpOworCisjaWYgIShkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0JMT0NLSU5HX1JFR0lPTikgfHwgZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9DQUxMX1dJVEhPVVRfR1ZMKSkKKyAgICAgICAgbWVtY3B5KGJjLT5zdGtyZXR2YWwsIGJjLT5yZXR2YWwsIE1BWChiYy0+Y2lmLnJ0eXBlLT5zaXplLCBGRklfU0laRU9GX0FSRykpOworICAgICAgICB4ZnJlZShiYy0+cGFyYW1zKTsKKyAgICAgICAgeGZyZWUoYmMtPmZmaVZhbHVlcyk7CisgICAgICAgIHhmcmVlKGJjLT5yZXR2YWwpOworICAgICAgICB4ZnJlZShiYyk7CisjZW5kaWYKKyAgICAKKyAgICB9IGVsc2UgeworCisgICAgICAgIGZmaVZhbHVlcyA9IEFMTE9DQV9OKHZvaWQgKiwgZm5JbmZvLT5wYXJhbWV0ZXJDb3VudCk7CisgICAgICAgIHBhcmFtcyA9IEFMTE9DQV9OKEZGSVN0b3JhZ2UsIGZuSW5mby0+cGFyYW1ldGVyQ291bnQpOworCisgICAgICAgIHJiZmZpX1NldHVwQ2FsbFBhcmFtcyhhcmdjLCBhcmd2LAorICAgICAgICAgICAgZm5JbmZvLT5wYXJhbWV0ZXJDb3VudCwgZm5JbmZvLT5wYXJhbWV0ZXJUeXBlcywgcGFyYW1zLCBmZmlWYWx1ZXMsCisgICAgICAgICAgICBmbkluZm8tPmNhbGxiYWNrUGFyYW1ldGVycywgZm5JbmZvLT5jYWxsYmFja0NvdW50LCBmbkluZm8tPnJiRW51bXMpOworCisgICAgICAgIHJiZmZpX2ZyYW1lX3B1c2goJmZyYW1lKTsKKyAgICAgICAgZmZpX2NhbGwoJmZuSW5mby0+ZmZpX2NpZiwgRkZJX0ZOKGZ1bmN0aW9uKSwgcmV0dmFsLCBmZmlWYWx1ZXMpOworICAgICAgICByYmZmaV9mcmFtZV9wb3AoJmZyYW1lKTsKKyAgICB9CisKKyAgICBpZiAodW5saWtlbHkoIWZuSW5mby0+aWdub3JlRXJybm8pKSB7CisgICAgICAgIHJiZmZpX3NhdmVfZXJybm8oKTsKKyAgICB9ICAgIAorCisgICAgaWYgKFJURVNUKGZyYW1lLmV4YykgJiYgZnJhbWUuZXhjICE9IFFuaWwpIHsKKyAgICAgICAgcmJfZXhjX3JhaXNlKGZyYW1lLmV4Yyk7CisgICAgfQorCisgICAgUkJfR0NfR1VBUkQocmJSZXR1cm5WYWx1ZSkgPSByYmZmaV9OYXRpdmVWYWx1ZV9Ub1J1YnkoZm5JbmZvLT5yZXR1cm5UeXBlLCBmbkluZm8tPnJiUmV0dXJuVHlwZSwgcmV0dmFsKTsKKyAgICBSQl9HQ19HVUFSRChmbkluZm8tPnJiUmV0dXJuVHlwZSk7CisgICAgCisgICAgcmV0dXJuIHJiUmV0dXJuVmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCoKK2dldFBvaW50ZXIoVkFMVUUgdmFsdWUsIGludCB0eXBlKQoreworICAgIGlmIChsaWtlbHkodHlwZSA9PSBUX0RBVEEgJiYgcmJfb2JqX2lzX2tpbmRfb2YodmFsdWUsIHJiZmZpX0Fic3RyYWN0TWVtb3J5Q2xhc3MpKSkgeworCisgICAgICAgIHJldHVybiAoKEFic3RyYWN0TWVtb3J5ICopIERBVEFfUFRSKHZhbHVlKSktPmFkZHJlc3M7CisKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVF9EQVRBICYmIHJiX29ial9pc19raW5kX29mKHZhbHVlLCByYmZmaV9TdHJ1Y3RDbGFzcykpIHsKKworICAgICAgICBBYnN0cmFjdE1lbW9yeSogbWVtb3J5ID0gKChTdHJ1Y3QgKikgREFUQV9QVFIodmFsdWUpKS0+cG9pbnRlcjsKKyAgICAgICAgcmV0dXJuIG1lbW9yeSAhPSBOVUxMID8gbWVtb3J5LT5hZGRyZXNzIDogTlVMTDsKKworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUX1NUUklORykgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIFN0cmluZ1ZhbHVlUHRyKHZhbHVlKTsKKworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUX05JTCkgeworCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgfSBlbHNlIGlmIChyYl9yZXNwb25kX3RvKHZhbHVlLCBpZF90b19wdHIpKSB7CisKKyAgICAgICAgVkFMVUUgcHRyID0gcmJfZnVuY2FsbDIodmFsdWUsIGlkX3RvX3B0ciwgMCwgTlVMTCk7CisgICAgICAgIGlmIChyYl9vYmpfaXNfa2luZF9vZihwdHIsIHJiZmZpX0Fic3RyYWN0TWVtb3J5Q2xhc3MpICYmIFRZUEUocHRyKSA9PSBUX0RBVEEpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEFic3RyYWN0TWVtb3J5ICopIERBVEFfUFRSKHB0cikpLT5hZGRyZXNzOworICAgICAgICB9CisgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgInRvX3B0ciByZXR1cm5lZCBhbiBpbnZhbGlkIHBvaW50ZXIiKTsKKyAgICB9CisKKyAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICI6cG9pbnRlciBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBwb2ludGVyIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0ludm9rZXIKK3JiZmZpX0dldEludm9rZXIoRnVuY3Rpb25UeXBlICpmbkluZm8pCit7CisgICAgcmV0dXJuIHJiZmZpX0NhbGxGdW5jdGlvbjsKK30KKworCitzdGF0aWMgdm9pZCoKK2NhbGxiYWNrX3BhcmFtKFZBTFVFIHByb2MsIFZBTFVFIGNiSW5mbykKK3sKKyAgICBWQUxVRSBjYWxsYmFjayA7CisgICAgaWYgKHVubGlrZWx5KHByb2MgPT0gUW5pbCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEwgOworICAgIH0KKworICAgIC8qIEhhbmRsZSBGdW5jdGlvbiBwb2ludGVycyBoZXJlICovCisgICAgaWYgKHJiX29ial9pc19raW5kX29mKHByb2MsIHJiZmZpX0Z1bmN0aW9uQ2xhc3MpKSB7CisgICAgICAgIEFic3RyYWN0TWVtb3J5KiBwdHI7CisgICAgICAgIERhdGFfR2V0X1N0cnVjdChwcm9jLCBBYnN0cmFjdE1lbW9yeSwgcHRyKTsKKyAgICAgICAgcmV0dXJuIHB0ci0+YWRkcmVzczsKKyAgICB9CisKKyAgICBjYWxsYmFjayA9IHJiZmZpX0Z1bmN0aW9uX0ZvclByb2MoY2JJbmZvLCBwcm9jKTsKKyAgICBSQl9HQ19HVUFSRChjYWxsYmFjayk7CisKKyAgICByZXR1cm4gKChBYnN0cmFjdE1lbW9yeSAqKSBEQVRBX1BUUihjYWxsYmFjaykpLT5hZGRyZXNzOworfQorCisKK3ZvaWQKK3JiZmZpX0NhbGxfSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgaWRfdG9fcHRyID0gcmJfaW50ZXJuKCJ0b19wdHIiKTsKKyAgICBpZF90b19uYXRpdmUgPSByYl9pbnRlcm4oInRvX25hdGl2ZSIpOworICAgIGlkX21hcF9zeW1ib2wgPSByYl9pbnRlcm4oIl9fbWFwX3N5bWJvbCIpOworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9DYWxsLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9DYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiZGQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0NhbGwuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgTHVjIEhlaW5yaWNoIDxsdWNAaG9uay1ob25rLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOSwgTWlrZSBEYWxlc3NpbyA8bWlrZS5kYWxlc3Npb0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEFtYW4gR3VwdGEuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUkJGRklfQ0FMTF9ICisjZGVmaW5lCVJCRkZJX0NBTExfSAorCisjaW5jbHVkZSAiVGhyZWFkLmgiCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19pMzg2X18pICYmIFwKKyAgKGRlZmluZWQoSEFWRV9SQVdfQVBJKSB8fCBkZWZpbmVkKFVTRV9JTlRFUk5BTF9MSUJGRkkpKSAmJiBcCisgICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19XSU4zMl9fKQorIyAgZGVmaW5lIFVTRV9SQVcKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpICYmICEoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkKKyMgIGRlZmluZSBCWVBBU1NfRkZJIDEKKyNlbmRpZgorICAgIAordHlwZWRlZiB1bmlvbiB7CisjaWZkZWYgVVNFX1JBVworICAgIHNpZ25lZCBpbnQgczgsIHMxNiwgczMyOworICAgIHVuc2lnbmVkIGludCB1OCwgdTE2LCB1MzI7CisjZWxzZQorICAgIHNpZ25lZCBjaGFyIHM4OworICAgIHVuc2lnbmVkIGNoYXIgdTg7CisgICAgc2lnbmVkIHNob3J0IHMxNjsKKyAgICB1bnNpZ25lZCBzaG9ydCB1MTY7CisgICAgc2lnbmVkIGludCBzMzI7CisgICAgdW5zaWduZWQgaW50IHUzMjsKKyNlbmRpZgorICAgIHNpZ25lZCBsb25nIGxvbmcgaTY0OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7CisgICAgc2lnbmVkIGxvbmcgc2w7CisgICAgdW5zaWduZWQgbG9uZyB1bDsKKyAgICB2b2lkKiBwdHI7CisgICAgZmxvYXQgZjMyOworICAgIGRvdWJsZSBmNjQ7CisgICAgbG9uZyBkb3VibGUgbGQ7Cit9IEZGSVN0b3JhZ2U7CisgCitleHRlcm4gdm9pZCByYmZmaV9DYWxsX0luaXQoVkFMVUUgbW9kdWxlRkZJKTsKKworZXh0ZXJuIHZvaWQgcmJmZmlfU2V0dXBDYWxsUGFyYW1zKGludCBhcmdjLCBWQUxVRSogYXJndiwgaW50IHBhcmFtQ291bnQsIFR5cGUqKiBwYXJhbVR5cGVzLAorICAgICAgICBGRklTdG9yYWdlKiBwYXJhbVN0b3JhZ2UsIHZvaWQqKiBmZmlWYWx1ZXMsCisgICAgICAgIFZBTFVFKiBjYWxsYmFja1BhcmFtZXRlcnMsIGludCBjYWxsYmFja0NvdW50LCBWQUxVRSBlbnVtcyk7CisKK3N0cnVjdCBGdW5jdGlvblR5cGVfOworZXh0ZXJuIFZBTFVFIHJiZmZpX0NhbGxGdW5jdGlvbihpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIHZvaWQqIGZ1bmN0aW9uLCBzdHJ1Y3QgRnVuY3Rpb25UeXBlXyogZm5JbmZvKTsKKwordHlwZWRlZiBWQUxVRSAoKkludm9rZXIpKGludCBhcmdjLCBWQUxVRSogYXJndiwgdm9pZCogZnVuY3Rpb24sIHN0cnVjdCBGdW5jdGlvblR5cGVfKiBmbkluZm8pOworCitJbnZva2VyIHJiZmZpX0dldEludm9rZXIoc3RydWN0IEZ1bmN0aW9uVHlwZV8qIGZuSW5mbyk7CisKK2V4dGVybiBWQUxVRSByYmZmaV9HZXRFbnVtVmFsdWUoVkFMVUUgZW51bXMsIFZBTFVFIHZhbHVlKTsKK2V4dGVybiBpbnQgcmJmZmlfR2V0U2lnbmVkSW50VmFsdWUoVkFMVUUgdmFsdWUsIGludCB0eXBlLCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwgY29uc3QgY2hhciogdHlwZU5hbWUsIFZBTFVFIGVudW1zKTsKKwordHlwZWRlZiBzdHJ1Y3QgcmJmZmlfYmxvY2tpbmdfY2FsbCB7CisgICAgcmJmZmlfZnJhbWVfdCogZnJhbWU7CisgICAgdm9pZCogZnVuY3Rpb247CisgICAgZmZpX2NpZiBjaWY7CisgICAgdm9pZCAqKmZmaVZhbHVlczsKKyAgICB2b2lkKiByZXR2YWw7CisgICAgdm9pZCogcGFyYW1zOworI2lmICEoZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9CTE9DS0lOR19SRUdJT04pIHx8IGRlZmluZWQoSEFWRV9SQl9USFJFQURfQ0FMTF9XSVRIT1VUX0dWTCkpCisgICAgdm9pZCogc3RrcmV0dmFsOworI2VuZGlmCit9IHJiZmZpX2Jsb2NraW5nX2NhbGxfdDsKKworVkFMVUUgcmJmZmlfZG9fYmxvY2tpbmdfY2FsbCh2b2lkKiBkYXRhKTsKK1ZBTFVFIHJiZmZpX3NhdmVfZnJhbWVfZXhjZXB0aW9uKHZvaWQgKmRhdGEsIFZBTFVFIGV4Yyk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBSQkZGSV9DQUxMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQ2FsbC5vIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQ2FsbC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNmY5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9DYWxsLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQ2xvc3VyZVBvb2wuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Nsb3N1cmVQb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5OWI0MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Nsb3N1cmVQb29sLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8ICFkZWZpbmVkKF9XSU4zMikKKyMgIGluY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfTVNDX1ZFUgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorIyBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyNlbmRpZgorI2lmIGRlZmluZWQoX19DWUdXSU5fXykgfHwgIWRlZmluZWQoX1dJTjMyKQorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjZWxzZQorIyAgaW5jbHVkZSA8d2luc29jazIuaD4KKyMgIGRlZmluZSBfV0lOU09DS0FQSV8KKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cnVieS5oPgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoSU5UOF9NSU4pCisjICBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgInJiZmZpLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisKKyNpbmNsdWRlICJGdW5jdGlvbi5oIgorI2luY2x1ZGUgIlR5cGVzLmgiCisjaW5jbHVkZSAiVHlwZS5oIgorI2luY2x1ZGUgIkxhc3RFcnJvci5oIgorI2luY2x1ZGUgIkNhbGwuaCIKKworI2luY2x1ZGUgIkNsb3N1cmVQb29sLmgiCisKKworI2lmbmRlZiByb3VuZHVwCisjICBkZWZpbmUgcm91bmR1cCh4LCB5KSAgICgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKKyNlbmRpZgorI2lmZGVmIF9XSU4zMgorICB0eXBlZGVmIGNoYXIqIGNhZGRyX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgTWVtb3J5IHsKKyAgICB2b2lkKiBjb2RlOworICAgIHZvaWQqIGRhdGE7CisgICAgc3RydWN0IE1lbW9yeSogbmV4dDsKK30gTWVtb3J5OworCitzdHJ1Y3QgQ2xvc3VyZVBvb2xfIHsKKyAgICB2b2lkKiBjdHg7CisgICAgaW50IGNsb3N1cmVTaXplOworICAgIGJvb2wgKCpwcmVwKSh2b2lkKiBjdHgsIHZvaWQgKmNvZGUsIENsb3N1cmUqIGNsb3N1cmUsIGNoYXIqIGVycmJ1Ziwgc2l6ZV90IGVycmJ1ZnNpemUpOworICAgIHN0cnVjdCBNZW1vcnkqIGJsb2NrczsgLyogS2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGlzIHBvb2wgKi8KKyAgICBDbG9zdXJlKiBsaXN0OworICAgIGxvbmcgcmVmY250OworfTsKKworc3RhdGljIGxvbmcgcGFnZVNpemU7CisKK3N0YXRpYyB2b2lkKiBhbGxvY2F0ZVBhZ2Uodm9pZCk7CitzdGF0aWMgYm9vbCBmcmVlUGFnZSh2b2lkICopOworc3RhdGljIGJvb2wgcHJvdGVjdFBhZ2Uodm9pZCAqKTsKKworQ2xvc3VyZVBvb2wqCityYmZmaV9DbG9zdXJlUG9vbF9OZXcoaW50IGNsb3N1cmVTaXplLCAKKyAgICAgICAgYm9vbCAoKnByZXApKHZvaWQqIGN0eCwgdm9pZCAqY29kZSwgQ2xvc3VyZSogY2xvc3VyZSwgY2hhciogZXJyYnVmLCBzaXplX3QgZXJyYnVmc2l6ZSksCisgICAgICAgIHZvaWQqIGN0eCkKK3sKKyAgICBDbG9zdXJlUG9vbCogcG9vbDsKKworICAgIHBvb2wgPSB4Y2FsbG9jKDEsIHNpemVvZigqcG9vbCkpOworICAgIHBvb2wtPmNsb3N1cmVTaXplID0gY2xvc3VyZVNpemU7CisgICAgcG9vbC0+Y3R4ID0gY3R4OworICAgIHBvb2wtPnByZXAgPSBwcmVwOworICAgIHBvb2wtPnJlZmNudCA9IDE7CisgICAgCisgICAgcmV0dXJuIHBvb2w7Cit9CisKK3ZvaWQKK2NsZWFudXBfY2xvc3VyZV9wb29sKENsb3N1cmVQb29sKiBwb29sKQoreworICAgIE1lbW9yeSogbWVtb3J5OworICAgIAorICAgIGZvciAobWVtb3J5ID0gcG9vbC0+YmxvY2tzOyBtZW1vcnkgIT0gTlVMTDsgKSB7CisgICAgICAgIE1lbW9yeSogbmV4dCA9IG1lbW9yeS0+bmV4dDsKKyAgICAgICAgZnJlZVBhZ2UobWVtb3J5LT5jb2RlKTsKKyAgICAgICAgZnJlZShtZW1vcnktPmRhdGEpOworICAgICAgICBmcmVlKG1lbW9yeSk7CisgICAgICAgIG1lbW9yeSA9IG5leHQ7CisgICAgfQorICAgIHhmcmVlKHBvb2wpOworfQorCit2b2lkCityYmZmaV9DbG9zdXJlUG9vbF9GcmVlKENsb3N1cmVQb29sKiBwb29sKQoreworICAgIGlmIChwb29sICE9IE5VTEwpIHsKKyAgICAgICAgbG9uZyByZWZjbnQgPSAtLShwb29sLT5yZWZjbnQpOworICAgICAgICBpZiAocmVmY250ID09IDApIHsKKyAgICAgICAgICAgIGNsZWFudXBfY2xvc3VyZV9wb29sKHBvb2wpOworICAgICAgICB9CisgICAgfQorfQorCitDbG9zdXJlKgorcmJmZmlfQ2xvc3VyZV9BbGxvYyhDbG9zdXJlUG9vbCogcG9vbCkKK3sKKyAgICBDbG9zdXJlICpsaXN0ID0gTlVMTDsKKyAgICBNZW1vcnkqIGJsb2NrID0gTlVMTDsKKyAgICBjYWRkcl90IGNvZGUgPSBOVUxMOworICAgIGNoYXIgZXJybXNnWzI1Nl07CisgICAgaW50IG5jbG9zdXJlczsKKyAgICBsb25nIHRyYW1wb2xpbmVTaXplOworICAgIGludCBpOworCisgICAgaWYgKHBvb2wtPmxpc3QgIT0gTlVMTCkgeworICAgICAgICBDbG9zdXJlKiBjbG9zdXJlID0gcG9vbC0+bGlzdDsKKyAgICAgICAgcG9vbC0+bGlzdCA9IHBvb2wtPmxpc3QtPm5leHQ7CisgICAgICAgIHBvb2wtPnJlZmNudCsrOworICAgIAorICAgICAgICByZXR1cm4gY2xvc3VyZTsKKyAgICB9CisKKyAgICB0cmFtcG9saW5lU2l6ZSA9IHJvdW5kdXAocG9vbC0+Y2xvc3VyZVNpemUsIDgpOworICAgIG5jbG9zdXJlcyA9IChpbnQpIChwYWdlU2l6ZSAvIHRyYW1wb2xpbmVTaXplKTsKKyAgICBibG9jayA9IGNhbGxvYygxLCBzaXplb2YoKmJsb2NrKSk7CisgICAgbGlzdCA9IGNhbGxvYyhuY2xvc3VyZXMsIHNpemVvZigqbGlzdCkpOworICAgIGNvZGUgPSBhbGxvY2F0ZVBhZ2UoKTsKKyAgICAKKyAgICBpZiAoYmxvY2sgPT0gTlVMTCB8fCBsaXN0ID09IE5VTEwgfHwgY29kZSA9PSBOVUxMKSB7CisgICAgICAgIHNucHJpbnRmKGVycm1zZywgc2l6ZW9mKGVycm1zZyksICJmYWlsZWQgdG8gYWxsb2NhdGUgYSBwYWdlLiBlcnJubz0lZCAoJXMpIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBuY2xvc3VyZXM7ICsraSkgeworICAgICAgICBDbG9zdXJlKiBjbG9zdXJlID0gJmxpc3RbaV07CisgICAgICAgIGNsb3N1cmUtPm5leHQgPSAmbGlzdFtpICsgMV07CisgICAgICAgIGNsb3N1cmUtPnBvb2wgPSBwb29sOworICAgICAgICBjbG9zdXJlLT5jb2RlID0gKGNvZGUgKyAoaSAqIHRyYW1wb2xpbmVTaXplKSk7CisKKyAgICAgICAgaWYgKCEoKnBvb2wtPnByZXApKHBvb2wtPmN0eCwgY2xvc3VyZS0+Y29kZSwgY2xvc3VyZSwgZXJybXNnLCBzaXplb2YoZXJybXNnKSkpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXByb3RlY3RQYWdlKGNvZGUpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogVHJhY2sgdGhlIGFsbG9jYXRlZCBwYWdlICsgQ2xvc3VyZSBtZW1vcnkgYXJlYSAqLworICAgIGJsb2NrLT5kYXRhID0gbGlzdDsKKyAgICBibG9jay0+Y29kZSA9IGNvZGU7CisgICAgYmxvY2stPm5leHQgPSBwb29sLT5ibG9ja3M7CisgICAgcG9vbC0+YmxvY2tzID0gYmxvY2s7CisKKyAgICAvKiBUaHJlYWQgdGhlIG5ldyBibG9jayBvbnRvIHRoZSBmcmVlIGxpc3QsIGFwYXJ0IGZyb20gdGhlIGZpcnN0IG9uZS4gKi8KKyAgICBsaXN0W25jbG9zdXJlcyAtIDFdLm5leHQgPSBwb29sLT5saXN0OworICAgIHBvb2wtPmxpc3QgPSBsaXN0LT5uZXh0OworICAgIHBvb2wtPnJlZmNudCsrOworCisgICAgLyogVXNlIHRoZSBmaXJzdCBvbmUgYXMgdGhlIG5ldyBoYW5kbGUgKi8KKyAgICByZXR1cm4gbGlzdDsKKworZXJyb3I6CisgICAgZnJlZShibG9jayk7CisgICAgZnJlZShsaXN0KTsKKyAgICBpZiAoY29kZSAhPSBOVUxMKSB7CisgICAgICAgIGZyZWVQYWdlKGNvZGUpOworICAgIH0KKyAgICAKKworICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICIlcyIsIGVycm1zZyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK3JiZmZpX0Nsb3N1cmVfRnJlZShDbG9zdXJlKiBjbG9zdXJlKQoreworICAgIGlmIChjbG9zdXJlICE9IE5VTEwpIHsKKyAgICAgICAgQ2xvc3VyZVBvb2wqIHBvb2wgPSBjbG9zdXJlLT5wb29sOworICAgICAgICBsb25nIHJlZmNudDsKKyAgICAgICAgLyogSnVzdCBwdXNoIGl0IG9uIHRoZSBmcm9udCBvZiB0aGUgZnJlZSBsaXN0ICovCisgICAgICAgIGNsb3N1cmUtPm5leHQgPSBwb29sLT5saXN0OworICAgICAgICBwb29sLT5saXN0ID0gY2xvc3VyZTsKKyAgICAgICAgcmVmY250ID0gLS0ocG9vbC0+cmVmY250KTsKKyAgICAgICAgaWYgKHJlZmNudCA9PSAwKSB7CisgICAgICAgICAgICBjbGVhbnVwX2Nsb3N1cmVfcG9vbChwb29sKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCoKK3JiZmZpX0Nsb3N1cmVfQ29kZUFkZHJlc3MoQ2xvc3VyZSogaGFuZGxlKQoreworICAgIHJldHVybiBoYW5kbGUtPmNvZGU7Cit9CisKKworc3RhdGljIGxvbmcKK2dldFBhZ2VTaXplKCkKK3sKKyNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkKKyAgICBTWVNURU1fSU5GTyBzaTsKKyAgICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisgICAgcmV0dXJuIHNpLmR3UGFnZVNpemU7CisjZWxzZQorICAgIHJldHVybiBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQqCithbGxvY2F0ZVBhZ2Uodm9pZCkKK3sKKyNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkKKyAgICByZXR1cm4gVmlydHVhbEFsbG9jKE5VTEwsIHBhZ2VTaXplLCBNRU1fQ09NTUlUIHwgTUVNX1JFU0VSVkUsIFBBR0VfUkVBRFdSSVRFKTsKKyNlbHNlCisgICAgY2FkZHJfdCBwYWdlID0gbW1hcChOVUxMLCBwYWdlU2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT04gfCBNQVBfUFJJVkFURSwgLTEsIDApOworICAgIHJldHVybiAocGFnZSAhPSAoY2FkZHJfdCkgLTEpID8gcGFnZSA6IE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIGJvb2wKK2ZyZWVQYWdlKHZvaWQgKmFkZHIpCit7CisjaWYgIWRlZmluZWQoX19DWUdXSU5fXykgJiYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpCisgICAgcmV0dXJuIFZpcnR1YWxGcmVlKGFkZHIsIDAsIE1FTV9SRUxFQVNFKTsKKyNlbHNlCisgICAgcmV0dXJuIG11bm1hcChhZGRyLCBwYWdlU2l6ZSkgPT0gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgYm9vbAorcHJvdGVjdFBhZ2Uodm9pZCogcGFnZSkKK3sKKyNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkKKyAgICBEV09SRCBvbGRQcm90ZWN0OworICAgIHJldHVybiBWaXJ0dWFsUHJvdGVjdChwYWdlLCBwYWdlU2l6ZSwgUEFHRV9FWEVDVVRFX1JFQUQsICZvbGRQcm90ZWN0KTsKKyNlbHNlCisgICAgcmV0dXJuIG1wcm90ZWN0KHBhZ2UsIHBhZ2VTaXplLCBQUk9UX1JFQUQgfCBQUk9UX0VYRUMpID09IDA7CisjZW5kaWYKK30KKwordm9pZAorcmJmZmlfQ2xvc3VyZVBvb2xfSW5pdChWQUxVRSBtb2R1bGUpCit7CisgICAgcGFnZVNpemUgPSBnZXRQYWdlU2l6ZSgpOworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9DbG9zdXJlUG9vbC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQ2xvc3VyZVBvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQyMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQ2xvc3VyZVBvb2wuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIFdheW5lIE1laXNzbmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSVUJZRkZJX0NMT1NVUkVQT09MX0gKKyNkZWZpbmUgUlVCWUZGSV9DTE9TVVJFUE9PTF9ICisKK3R5cGVkZWYgc3RydWN0IENsb3N1cmVQb29sXyBDbG9zdXJlUG9vbDsKK3R5cGVkZWYgc3RydWN0IENsb3N1cmVfIENsb3N1cmU7CisKK3N0cnVjdCBDbG9zdXJlXyB7CisgICAgdm9pZCogaW5mbzsgICAgICAvKiBvcGFxdWUgaGFuZGxlIGZvciBzdG9yaW5nIGNsb3N1cmUtaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YSAqLworICAgIHZvaWQqIGZ1bmN0aW9uOyAgLyogY2xvc3VyZS1pbnN0YW5jZSBzcGVjaWZpYyBmdW5jdGlvbiwgY2FsbGVkIGJ5IGN1c3RvbSB0cmFtcG9saW5lICovCisgICAgdm9pZCogY29kZTsgICAgICAvKiBUaGUgbmF0aXZlIHRyYW1wb2xpbmUgY29kZSBsb2NhdGlvbiAqLworICAgIHN0cnVjdCBDbG9zdXJlUG9vbF8qIHBvb2w7CisgICAgQ2xvc3VyZSogbmV4dDsKK307CisKK3ZvaWQgcmJmZmlfQ2xvc3VyZVBvb2xfSW5pdChWQUxVRSBtb2R1bGUpOworCitDbG9zdXJlUG9vbCogcmJmZmlfQ2xvc3VyZVBvb2xfTmV3KGludCBjbG9zdXJlU2l6ZSwgCisgICAgICAgIGJvb2wgKCpwcmVwKSh2b2lkKiBjdHgsIHZvaWQgKmNvZGUsIENsb3N1cmUqIGNsb3N1cmUsIGNoYXIqIGVycmJ1Ziwgc2l6ZV90IGVycmJ1ZnNpemUpLAorICAgICAgICB2b2lkKiBjdHgpOworCit2b2lkIHJiZmZpX0Nsb3N1cmVQb29sX0ZyZWUoQ2xvc3VyZVBvb2wgKik7CisKK0Nsb3N1cmUqIHJiZmZpX0Nsb3N1cmVfQWxsb2MoQ2xvc3VyZVBvb2wgKik7Cit2b2lkIHJiZmZpX0Nsb3N1cmVfRnJlZShDbG9zdXJlICopOworCit2b2lkKiByYmZmaV9DbG9zdXJlX0dldENvZGVBZGRyZXNzKENsb3N1cmUgKik7CisKKyNlbmRpZiAvKiBSVUJZRkZJX0NMT1NVUkVQT09MX0ggKi8KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvQ2xvc3VyZVBvb2wubyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Nsb3N1cmVQb29sLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhM2ViZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Nsb3N1cmVQb29sLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRGF0YUNvbnZlcnRlci5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRGF0YUNvbnZlcnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNWI4MjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9EYXRhQ29udmVydGVyLmMKQEAgLTAsMCArMSw5MSBAQAorCisjaW5jbHVkZSA8cnVieS5oPgorCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSAicmJmZmkuaCIKKworI2luY2x1ZGUgIlR5cGUuaCIKKyNpbmNsdWRlICJNYXBwZWRUeXBlLmgiCisKKworVkFMVUUgcmJmZmlfRGF0YUNvbnZlcnRlckNsYXNzID0gUW5pbDsKK3N0YXRpYyBJRCBpZF9uYXRpdmVfdHlwZV9pdmFyOworCisvKgorICogR2V0IG5hdGl2ZSB0eXBlLgorICogQG92ZXJsb2FkIG5hdGl2ZV90eXBlKHR5cGUpCisgKiAgQHBhcmFtIFtTdHJpbmcsIFN5bWJvbCwgVHlwZV0gdHlwZQorICogIEByZXR1cm4gW1R5cGVdCisgKiAgR2V0IG5hdGl2ZSB0eXBlIGZyb20gK3R5cGUrLgorICogQG92ZXJsb2FkIG5hdGl2ZV90eXBlCisgKiAgQHJhaXNlIHtOb3RJbXBsZW1lbnRlZEVycm9yfSBUaGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRlbi4KKyAqLworc3RhdGljIFZBTFVFCitjb252X25hdGl2ZV90eXBlKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZikKK3sKKyAgICBpZiAoYXJnYyA9PSAwKSB7CisgICAgICAgIGlmICghcmJfaXZhcl9kZWZpbmVkKHNlbGYsIGlkX25hdGl2ZV90eXBlX2l2YXIpKSB7CisgICAgICAgICAgICByYl9yYWlzZShyYl9lTm90SW1wRXJyb3IsICJuYXRpdmVfdHlwZSBtZXRob2Qgbm90IG92ZXJyaWRkZW4gYW5kIG5vIG5hdGl2ZV90eXBlIHNldCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJiX2l2YXJfZ2V0KHNlbGYsIGlkX25hdGl2ZV90eXBlX2l2YXIpOworCisgICAgfSBlbHNlIGlmIChhcmdjID09IDEpIHsKKyAgICAgICAgVkFMVUUgdHlwZSA9IHJiZmZpX1R5cGVfRmluZChhcmd2WzBdKTsKKworICAgICAgICByYl9pdmFyX3NldChzZWxmLCBpZF9uYXRpdmVfdHlwZV9pdmFyLCB0eXBlKTsKKworICAgICAgICByZXR1cm4gdHlwZTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgImluY29ycmVjdCBhcmd1bWVudHMiKTsKKyAgICB9Cit9CisKKy8qCisgKiBjYWxsLXNlcTogdG9fbmF0aXZlKHZhbHVlLCBjdHgpCisgKiBAcGFyYW0gdmFsdWUKKyAqIEBwYXJhbSBjdHgKKyAqIEByZXR1cm4gW3ZhbHVlXQorICogQ29udmVydCB0byBhIG5hdGl2ZSB0eXBlLgorICovCitzdGF0aWMgVkFMVUUKK2NvbnZfdG9fbmF0aXZlKFZBTFVFIHNlbGYsIFZBTFVFIHZhbHVlLCBWQUxVRSBjdHgpCit7CisgICAgcmV0dXJuIHZhbHVlOworfQorCisvKgorICogY2FsbC1zZXE6IGZyb21fbmF0aXZlKHZhbHVlLCBjdHgpCisgKiBAcGFyYW0gdmFsdWUKKyAqIEBwYXJhbSBjdHgKKyAqIEByZXR1cm4gW3ZhbHVlXQorICogQ29udmVydCBmcm9tIGEgbmF0aXZlIHR5cGUuCisgKi8KK3N0YXRpYyBWQUxVRQorY29udl9mcm9tX25hdGl2ZShWQUxVRSBzZWxmLCBWQUxVRSB2YWx1ZSwgVkFMVUUgY3R4KQoreworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisKK3ZvaWQKK3JiZmZpX0RhdGFDb252ZXJ0ZXJfSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tb2R1bGU6IEZGSTo6RGF0YUNvbnZlcnRlcgorICAgICAqIFRoaXMgbW9kdWxlIGlzIHVzZWQgdG8gZXh0ZW5kIHNvbWVzIGNsYXNzZXMgYW5kIGdpdmUgdGhlbiBhIGNvbW1vbiBBUEkuCisgICAgICoKKyAgICAgKiBNb3N0IG9mIG1ldGhvZHMgZGVmaW5lZCBoZXJlIG11c3QgYmUgb3ZlcnJpZGVuLgorICAgICAqLworICAgIHJiZmZpX0RhdGFDb252ZXJ0ZXJDbGFzcyA9IHJiX2RlZmluZV9tb2R1bGVfdW5kZXIobW9kdWxlRkZJLCAiRGF0YUNvbnZlcnRlciIpOworCisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9EYXRhQ29udmVydGVyQ2xhc3MsICJuYXRpdmVfdHlwZSIsIGNvbnZfbmF0aXZlX3R5cGUsIC0xKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX0RhdGFDb252ZXJ0ZXJDbGFzcywgInRvX25hdGl2ZSIsIGNvbnZfdG9fbmF0aXZlLCAyKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX0RhdGFDb252ZXJ0ZXJDbGFzcywgImZyb21fbmF0aXZlIiwgY29udl9mcm9tX25hdGl2ZSwgMik7CisKKyAgICBpZF9uYXRpdmVfdHlwZV9pdmFyID0gcmJfaW50ZXJuKCJAbmF0aXZlX3R5cGUiKTsKK30KKworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9EYXRhQ29udmVydGVyLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9EYXRhQ29udmVydGVyLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YzE3NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0RhdGFDb252ZXJ0ZXIubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9EeW5hbWljTGlicmFyeS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRHluYW1pY0xpYnJhcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJlYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRHluYW1pY0xpYnJhcnkuYwpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIFdheW5lIE1laXNzbmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyMgaW5jbHVkZSA8d2luc29jazIuaD4KKyMgZGVmaW5lIF9XSU5TT0NLQVBJXworIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGluY2x1ZGUgPHNobHdhcGkuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxydWJ5Lmg+CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoSU5UOF9NSU4pCisjICBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8ZmZpLmg+CisKKyNpbmNsdWRlICJyYmZmaS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgIkFic3RyYWN0TWVtb3J5LmgiCisjaW5jbHVkZSAiUG9pbnRlci5oIgorI2luY2x1ZGUgIkR5bmFtaWNMaWJyYXJ5LmgiCisKK3R5cGVkZWYgc3RydWN0IExpYnJhcnlTeW1ib2xfIHsKKyAgICBQb2ludGVyIGJhc2U7CisgICAgVkFMVUUgbGlicmFyeTsKKyAgICBWQUxVRSBuYW1lOworfSBMaWJyYXJ5U3ltYm9sOworCitzdGF0aWMgVkFMVUUgbGlicmFyeV9pbml0aWFsaXplKFZBTFVFIHNlbGYsIFZBTFVFIGxpYm5hbWUsIFZBTFVFIGxpYmZsYWdzKTsKK3N0YXRpYyB2b2lkIGxpYnJhcnlfZnJlZShMaWJyYXJ5KiBsaWIpOworCisKK3N0YXRpYyBWQUxVRSBzeW1ib2xfYWxsb2NhdGUoVkFMVUUga2xhc3MpOworc3RhdGljIFZBTFVFIHN5bWJvbF9uZXcoVkFMVUUgbGlicmFyeSwgdm9pZCogYWRkcmVzcywgVkFMVUUgbmFtZSk7CitzdGF0aWMgdm9pZCBzeW1ib2xfbWFyayhMaWJyYXJ5U3ltYm9sKiBzeW0pOworCitzdGF0aWMgVkFMVUUgTGlicmFyeUNsYXNzID0gUW5pbCwgU3ltYm9sQ2xhc3MgPSBRbmlsOworCisjaWYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCitzdGF0aWMgdm9pZCogZGxfb3Blbihjb25zdCBjaGFyKiBuYW1lLCBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgZGxfZXJyb3IoY2hhciogYnVmLCBpbnQgc2l6ZSk7CisjZGVmaW5lIGRsX3N5bShoYW5kbGUsIG5hbWUpIEdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSkKKyNkZWZpbmUgZGxfY2xvc2UoaGFuZGxlKSBGcmVlTGlicmFyeShoYW5kbGUpCisjZWxzZQorIyBkZWZpbmUgZGxfb3BlbihuYW1lLCBmbGFncykgZGxvcGVuKG5hbWUsIGZsYWdzICE9IDAgPyBmbGFncyA6IFJUTERfTEFaWSkKKyMgZGVmaW5lIGRsX2Vycm9yKGJ1Ziwgc2l6ZSkgZG8geyBzbnByaW50ZihidWYsIHNpemUsICIlcyIsIGRsZXJyb3IoKSk7IH0gd2hpbGUoMCkKKyMgZGVmaW5lIGRsX3N5bShoYW5kbGUsIG5hbWUpIGRsc3ltKGhhbmRsZSwgbmFtZSkKKyMgZGVmaW5lIGRsX2Nsb3NlKGhhbmRsZSkgZGxjbG9zZShoYW5kbGUpCisjZW5kaWYKKworc3RhdGljIFZBTFVFCitsaWJyYXJ5X2FsbG9jYXRlKFZBTFVFIGtsYXNzKQoreworICAgIExpYnJhcnkqIGxpYnJhcnk7CisgICAgcmV0dXJuIERhdGFfTWFrZV9TdHJ1Y3Qoa2xhc3MsIExpYnJhcnksIE5VTEwsIGxpYnJhcnlfZnJlZSwgbGlicmFyeSk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogRHluYW1pY0xpYnJhcnkub3BlbihsaWJuYW1lLCBsaWJmbGFncykKKyAqIEBwYXJhbSBsaWJuYW1lIChzZWUgI2luaXRpYWxpemUpCisgKiBAcGFyYW0gbGliZmxhZ3MgKHNlZSAjaW5pdGlhbGl6ZSkKKyAqIEByZXR1cm4gW0ZGSTo6RHluYW1pY0xpYnJhcnldCisgKiBAcmFpc2Uge0xvYWRFcnJvcn0gaWYgK2xpYm5hbWUrIGNhbm5vdCBiZSBvcGVuZWQKKyAqIE9wZW4gYSBsaWJyYXJ5LgorICovCitzdGF0aWMgVkFMVUUKK2xpYnJhcnlfb3BlbihWQUxVRSBrbGFzcywgVkFMVUUgbGlibmFtZSwgVkFMVUUgbGliZmxhZ3MpCit7CisgICAgcmV0dXJuIGxpYnJhcnlfaW5pdGlhbGl6ZShsaWJyYXJ5X2FsbG9jYXRlKGtsYXNzKSwgbGlibmFtZSwgbGliZmxhZ3MpOworfQorCisvKgorICogY2FsbC1zZXE6IGluaXRpYWxpemUobGlibmFtZSwgbGliZmxhZ3MpCisgKiBAcGFyYW0gW1N0cmluZ10gbGlibmFtZSBuYW1lIG9mIGxpYnJhcnkgdG8gb3BlbgorICogQHBhcmFtIFtGaXhudW1dIGxpYmZsYWdzIGZsYWdzIGZvciBsaWJyYXJ5IHRvIG9wZW4KKyAqIEByZXR1cm4gW0ZGSTo6RHluYW1pY0xpYnJhcnldCisgKiBAcmFpc2Uge0xvYWRFcnJvcn0gaWYgK2xpYm5hbWUrIGNhbm5vdCBiZSBvcGVuZWQKKyAqIEEgbmV3IER5bmFtaWNMaWJyYXJ5IGluc3RhbmNlLgorICovCitzdGF0aWMgVkFMVUUKK2xpYnJhcnlfaW5pdGlhbGl6ZShWQUxVRSBzZWxmLCBWQUxVRSBsaWJuYW1lLCBWQUxVRSBsaWJmbGFncykKK3sKKyAgICBMaWJyYXJ5KiBsaWJyYXJ5OworICAgIGludCBmbGFnczsKKworICAgIENoZWNrX1R5cGUobGliZmxhZ3MsIFRfRklYTlVNKTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBMaWJyYXJ5LCBsaWJyYXJ5KTsKKyAgICBmbGFncyA9IGxpYmZsYWdzICE9IFFuaWwgPyBOVU0yVUlOVChsaWJmbGFncykgOiAwOworICAgIAorICAgIGxpYnJhcnktPmhhbmRsZSA9IGRsX29wZW4obGlibmFtZSAhPSBRbmlsID8gU3RyaW5nVmFsdWVDU3RyKGxpYm5hbWUpIDogTlVMTCwgZmxhZ3MpOworICAgIGlmIChsaWJyYXJ5LT5oYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBjaGFyIGVycm1zZ1sxMDI0XTsKKyAgICAgICAgZGxfZXJyb3IoZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisgICAgICAgIHJiX3JhaXNlKHJiX2VMb2FkRXJyb3IsICJDb3VsZCBub3Qgb3BlbiBsaWJyYXJ5ICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBsaWJuYW1lICE9IFFuaWwgPyBTdHJpbmdWYWx1ZUNTdHIobGlibmFtZSkgOiAiW2N1cnJlbnQgcHJvY2Vzc10iLAorICAgICAgICAgICAgICAgIGVycm1zZyk7CisgICAgfQorI2lmZGVmIF9fQ1lHV0lOX18KKyAgICAvLyBPbiBDeWd3aW4gMS43LjE3ICJkbHN5bShkbG9wZW4oMCwwKSwgJ2dldHBpZCcpIiBmYWlscy4gKGRsZXJyb3I6ICJObyBzdWNoIHByb2Nlc3MiKQorICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB3ZSBjYW4gdXNlICJkbHN5bShSVExEX0RFRkFVTFQsICdnZXRwaWQnKSIgaW5zdGVhZC4KKyAgICAvLyBTaW5jZSAwID09IFJUTERfREVGQVVMVCB3ZSB3b24ndCBjYWxsIGRsX2Nsb3NlIGxhdGVyLgorICAgIGlmIChsaWJuYW1lID09IFFuaWwpIHsKKyAgICAgICAgZGxfY2xvc2UobGlicmFyeS0+aGFuZGxlKTsKKyAgICAgICAgbGlicmFyeS0+aGFuZGxlID0gUlRMRF9ERUZBVUxUOworICAgIH0KKyNlbmRpZgorICAgIHJiX2l2X3NldChzZWxmLCAiQG5hbWUiLCBsaWJuYW1lICE9IFFuaWwgPyBsaWJuYW1lIDogcmJfc3RyX25ldzIoIltjdXJyZW50IHByb2Nlc3NdIikpOworICAgIHJldHVybiBzZWxmOworfQorCitzdGF0aWMgVkFMVUUKK2xpYnJhcnlfZGxzeW0oVkFMVUUgc2VsZiwgVkFMVUUgbmFtZSkKK3sKKyAgICBMaWJyYXJ5KiBsaWJyYXJ5OworICAgIHZvaWQqIGFkZHJlc3MgPSBOVUxMOworICAgIENoZWNrX1R5cGUobmFtZSwgVF9TVFJJTkcpOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIExpYnJhcnksIGxpYnJhcnkpOworICAgIGFkZHJlc3MgPSBkbF9zeW0obGlicmFyeS0+aGFuZGxlLCBTdHJpbmdWYWx1ZUNTdHIobmFtZSkpOworICAgIAorICAgIHJldHVybiBhZGRyZXNzICE9IE5VTEwgPyBzeW1ib2xfbmV3KHNlbGYsIGFkZHJlc3MsIG5hbWUpIDogUW5pbDsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBsYXN0X2Vycm9yCisgKiBAcmV0dXJuIFtTdHJpbmddIGxpYnJhcnkncyBsYXN0IGVycm9yIHN0cmluZworICovCitzdGF0aWMgVkFMVUUKK2xpYnJhcnlfZGxlcnJvcihWQUxVRSBzZWxmKQoreworICAgIGNoYXIgZXJybXNnWzEwMjRdOworICAgIGRsX2Vycm9yKGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworICAgIHJldHVybiByYl90YWludGVkX3N0cl9uZXcyKGVycm1zZyk7Cit9CisKK3N0YXRpYyB2b2lkCitsaWJyYXJ5X2ZyZWUoTGlicmFyeSogbGlicmFyeSkKK3sKKyAgICAvKiBkbGNsb3NlKCkgb24gTWFjT1MgdGVuZHMgdG8gc2VnZmF1bHQgLSBhdm9pZCBpdCAqLworI2lmbmRlZiBfX0FQUExFX18KKyAgICBpZiAobGlicmFyeS0+aGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgZGxfY2xvc2UobGlicmFyeS0+aGFuZGxlKTsKKyAgICB9CisjZW5kaWYKKyAgICB4ZnJlZShsaWJyYXJ5KTsKK30KKworI2lmIChkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorc3RhdGljIHZvaWQqCitkbF9vcGVuKGNvbnN0IGNoYXIqIG5hbWUsIGludCBmbGFncykKK3sKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRFdPUkQgZHdGbGFncyA9IFBhdGhJc1JlbGF0aXZlQShuYW1lKSA/IDAgOiBMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSDsKKyAgICAgICAgcmV0dXJuIExvYWRMaWJyYXJ5RXhBKG5hbWUsIE5VTEwsIGR3RmxhZ3MpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RsX2Vycm9yKGNoYXIqIGJ1ZiwgaW50IHNpemUpCit7CisgICAgRm9ybWF0TWVzc2FnZUEoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sIE5VTEwsIEdldExhc3RFcnJvcigpLAorICAgICAgICAgICAgMCwgYnVmLCBzaXplLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgVkFMVUUKK3N5bWJvbF9hbGxvY2F0ZShWQUxVRSBrbGFzcykKK3sKKyAgICBMaWJyYXJ5U3ltYm9sKiBzeW07CisgICAgVkFMVUUgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgTGlicmFyeVN5bWJvbCwgTlVMTCwgLTEsIHN5bSk7CisgICAgc3ltLT5uYW1lID0gUW5pbDsKKyAgICBzeW0tPmxpYnJhcnkgPSBRbmlsOworICAgIHN5bS0+YmFzZS5yYlBhcmVudCA9IFFuaWw7CisKKyAgICByZXR1cm4gb2JqOworfQorCisKKy8qCisgKiBjYWxsLXNlcTogaW5pdGlhbGl6ZV9jb3B5KG90aGVyKQorICogQHBhcmFtIFtPYmplY3RdIG90aGVyCisgKiBAcmV0dXJuIFtuaWxdCisgKiBETyBOT1QgQ0FMTCBUSElTIE1FVEhPRAorICovCitzdGF0aWMgVkFMVUUKK3N5bWJvbF9pbml0aWFsaXplX2NvcHkoVkFMVUUgc2VsZiwgVkFMVUUgb3RoZXIpCit7CisgICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwgImNhbm5vdCBkdXBsaWNhdGUgc3ltYm9sIik7CisgICAgcmV0dXJuIFFuaWw7Cit9CisKK3N0YXRpYyBWQUxVRQorc3ltYm9sX25ldyhWQUxVRSBsaWJyYXJ5LCB2b2lkKiBhZGRyZXNzLCBWQUxVRSBuYW1lKQoreworICAgIExpYnJhcnlTeW1ib2wqIHN5bTsKKyAgICBWQUxVRSBvYmogPSBEYXRhX01ha2VfU3RydWN0KFN5bWJvbENsYXNzLCBMaWJyYXJ5U3ltYm9sLCBzeW1ib2xfbWFyaywgLTEsIHN5bSk7CisKKyAgICBzeW0tPmJhc2UubWVtb3J5LmFkZHJlc3MgPSBhZGRyZXNzOworICAgIHN5bS0+YmFzZS5tZW1vcnkuc2l6ZSA9IExPTkdfTUFYOworICAgIHN5bS0+YmFzZS5tZW1vcnkudHlwZVNpemUgPSAxOworICAgIHN5bS0+YmFzZS5tZW1vcnkuZmxhZ3MgPSBNRU1fUkQgfCBNRU1fV1I7CisgICAgc3ltLT5saWJyYXJ5ID0gbGlicmFyeTsKKyAgICBzeW0tPm5hbWUgPSBuYW1lOworCisgICAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQKK3N5bWJvbF9tYXJrKExpYnJhcnlTeW1ib2wqIHN5bSkKK3sKKyAgICByYl9nY19tYXJrKHN5bS0+bGlicmFyeSk7CisgICAgcmJfZ2NfbWFyayhzeW0tPm5hbWUpOworfQorCisvKgorICogY2FsbC1zZXE6IGluc3BlY3QKKyAqIEByZXR1cm4gW1N0cmluZ10KKyAqIEluc3BlY3QuCisgKi8KK3N0YXRpYyBWQUxVRQorc3ltYm9sX2luc3BlY3QoVkFMVUUgc2VsZikKK3sKKyAgICBMaWJyYXJ5U3ltYm9sKiBzeW07CisgICAgY2hhciBidWZbMjU2XTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBMaWJyYXJ5U3ltYm9sLCBzeW0pOworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIjPEZGSTo6TGlicmFyeTo6U3ltYm9sIG5hbWU9JXMgYWRkcmVzcz0lcD4iLAorICAgICAgICAgICAgIFN0cmluZ1ZhbHVlQ1N0cihzeW0tPm5hbWUpLCBzeW0tPmJhc2UubWVtb3J5LmFkZHJlc3MpOworICAgIHJldHVybiByYl9zdHJfbmV3MihidWYpOworfQorCit2b2lkCityYmZmaV9EeW5hbWljTGlicmFyeV9Jbml0KFZBTFVFIG1vZHVsZUZGSSkKK3sKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OkR5bmFtaWNMaWJyYXJ5CisgICAgICovCisgICAgTGlicmFyeUNsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKG1vZHVsZUZGSSwgIkR5bmFtaWNMaWJyYXJ5IiwgcmJfY09iamVjdCk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZMaWJyYXJ5Q2xhc3MpOworICAgIC8qCisgICAgICogRG9jdW1lbnQtY2xhc3M6IEZGSTo6RHluYW1pY0xpYnJhcnk6OlN5bWJvbCA8IEZGSTo6UG9pbnRlcgorICAgICAqCisgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbGlicmFyeSBzeW1ib2wuIEl0IG1heSBiZSBhIHtQb2ludGVyIHBvaW50ZXJ9IHRvCisgICAgICogYSBmdW5jdGlvbiBvciB0byBhIHZhcmlhYmxlLgorICAgICAqLworICAgIFN5bWJvbENsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKExpYnJhcnlDbGFzcywgIlN5bWJvbCIsIHJiZmZpX1BvaW50ZXJDbGFzcyk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZTeW1ib2xDbGFzcyk7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNvbnN0OiBGRkk6Ok5hdGl2ZUxpYnJhcnkKKyAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBGRkk6OkR5bmFtaWNMaWJyYXJ5CisgICAgICovCisgICAgcmJfZGVmaW5lX2NvbnN0KG1vZHVsZUZGSSwgIk5hdGl2ZUxpYnJhcnkiLCBMaWJyYXJ5Q2xhc3MpOyAvKiBiYWNrd2FyZHMgY29tcGF0IGxpYnJhcnkgKi8KKyAgICByYl9kZWZpbmVfYWxsb2NfZnVuYyhMaWJyYXJ5Q2xhc3MsIGxpYnJhcnlfYWxsb2NhdGUpOworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKExpYnJhcnlDbGFzcywgIm9wZW4iLCBsaWJyYXJ5X29wZW4sIDIpOworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKExpYnJhcnlDbGFzcywgImxhc3RfZXJyb3IiLCBsaWJyYXJ5X2RsZXJyb3IsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QoTGlicmFyeUNsYXNzLCAiaW5pdGlhbGl6ZSIsIGxpYnJhcnlfaW5pdGlhbGl6ZSwgMik7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IGZpbmRfc3ltYm9sCisgICAgICogY2FsbC1zZXE6IGZpbmRfc3ltYm9sKG5hbWUpCisgICAgICogQHBhcmFtIFtTdHJpbmddIG5hbWUgbGlicmFyeSBzeW1ib2wncyBuYW1lCisgICAgICogQHJldHVybiBbRkZJOjpEeW5hbWljTGlicmFyeTo6U3ltYm9sXSBsaWJyYXJ5IHN5bWJvbAorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoTGlicmFyeUNsYXNzLCAiZmluZF9zeW1ib2wiLCBsaWJyYXJ5X2Rsc3ltLCAxKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1ldGhvZDogZmluZF9mdW5jdGlvbgorICAgICAqIGNhbGwtc2VxOiBmaW5kX2Z1bmN0aW9uKG5hbWUpCisgICAgICogQHBhcmFtIFtTdHJpbmddIG5hbWUgbGlicmFyeSBmdW5jdGlvbidzIG5hbWUKKyAgICAgKiBAcmV0dXJuIFtGRkk6OkR5bmFtaWNMaWJyYXJ5OjpTeW1ib2xdIGxpYnJhcnkgZnVuY3Rpb24gc3ltYm9sCisgICAgICovCisgICAgcmJfZGVmaW5lX21ldGhvZChMaWJyYXJ5Q2xhc3MsICJmaW5kX2Z1bmN0aW9uIiwgbGlicmFyeV9kbHN5bSwgMSk7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1tZXRob2Q6IGZpbmRfdmFyaWFibGUKKyAgICAgKiBjYWxsLXNlcTogZmluZF92YXJpYWJsZShuYW1lKQorICAgICAqIEBwYXJhbSBbU3RyaW5nXSBuYW1lIGxpYnJhcnkgdmFyaWFibGUncyBuYW1lCisgICAgICogQHJldHVybiBbRkZJOjpEeW5hbWljTGlicmFyeTo6U3ltYm9sXSBsaWJyYXJ5IHZhcmlhYmxlIHN5bWJvbAorICAgICAqLworICAgIHJiX2RlZmluZV9tZXRob2QoTGlicmFyeUNsYXNzLCAiZmluZF92YXJpYWJsZSIsIGxpYnJhcnlfZGxzeW0sIDEpOworICAgIHJiX2RlZmluZV9tZXRob2QoTGlicmFyeUNsYXNzLCAibGFzdF9lcnJvciIsIGxpYnJhcnlfZGxlcnJvciwgMCk7CisgICAgcmJfZGVmaW5lX2F0dHIoTGlicmFyeUNsYXNzLCAibmFtZSIsIDEsIDApOworCisgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMoU3ltYm9sQ2xhc3MsIHN5bWJvbF9hbGxvY2F0ZSk7CisgICAgcmJfdW5kZWZfbWV0aG9kKFN5bWJvbENsYXNzLCAibmV3Iik7CisgICAgcmJfZGVmaW5lX21ldGhvZChTeW1ib2xDbGFzcywgImluc3BlY3QiLCBzeW1ib2xfaW5zcGVjdCwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChTeW1ib2xDbGFzcywgImluaXRpYWxpemVfY29weSIsIHN5bWJvbF9pbml0aWFsaXplX2NvcHksIDEpOworCisjZGVmaW5lIERFRih4KSByYl9kZWZpbmVfY29uc3QoTGlicmFyeUNsYXNzLCAiUlRMRF8iICN4LCBVSU5UMk5VTShSVExEXyMjeCkpCisgICAgREVGKExBWlkpOworICAgIERFRihOT1cpOworICAgIERFRihHTE9CQUwpOworICAgIERFRihMT0NBTCk7CisgICAgREVGKE5PTE9BRCk7CisgICAgREVGKE5PREVMRVRFKTsKKyAgICBERUYoRklSU1QpOworICAgIERFRihERUVQQklORCk7CisgICAgREVGKE1FTUJFUik7CisgICAgREVGKEJJTkRJTkdfTUFTSyk7CisgICAgREVGKExPQ0FUSU9OX01BU0spOworICAgIERFRihBTExfTUFTSyk7CisjdW5kZWYgREVGCisKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRHluYW1pY0xpYnJhcnkuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0R5bmFtaWNMaWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiZjdiYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0R5bmFtaWNMaWJyYXJ5LmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIFdheW5lIE1laXNzbmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTElCUkFSWV9ICisjZGVmaW5lCV9MSUJSQVJZX0gKKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBpZiB0aGVzZSBhcmVuJ3QgZGVmaW5lZCAoZWcuIHdpbmRvd3MpLCB3ZSBuZWVkIHNlbnNpYmxlIGRlZmF1bHRzICovCisjaWZuZGVmIFJUTERfTEFaWQorI2RlZmluZSBSVExEX0xBWlkgMQorI2VuZGlmCisKKyNpZm5kZWYgUlRMRF9OT1cKKyNkZWZpbmUgUlRMRF9OT1cgMgorI2VuZGlmCisKKyNpZm5kZWYgUlRMRF9MT0NBTAorI2RlZmluZSBSVExEX0xPQ0FMIDQKKyNlbmRpZgorCisjaWZuZGVmIFJUTERfR0xPQkFMCisjZGVmaW5lIFJUTERfR0xPQkFMIDgKKyNlbmRpZgorCisvKiBJZiB0aGVzZSBhcmVuJ3QgZGVmaW5lZCwgdGhleSdyZSBub3Qgc3VwcG9ydGVkIHNvIGRlZmluZSBhcyAwICovCisjaWZuZGVmIFJUTERfTk9MT0FECisjZGVmaW5lIFJUTERfTk9MT0FEIDAKKyNlbmRpZgorCisjaWZuZGVmIFJUTERfTk9ERUxFVEUKKyNkZWZpbmUgUlRMRF9OT0RFTEVURSAwCisjZW5kaWYKKworI2lmbmRlZiBSVExEX0ZJUlNUCisjZGVmaW5lIFJUTERfRklSU1QgMAorI2VuZGlmCisKKyNpZm5kZWYgUlRMRF9ERUVQQklORAorI2RlZmluZSBSVExEX0RFRVBCSU5EIDAKKyNlbmRpZgorCisjaWZuZGVmIFJUTERfTUVNQkVSCisjZGVmaW5lIFJUTERfTUVNQkVSIDAKKyNlbmRpZgorCisvKiBjb252ZW5pZW5jZSAqLworI2lmbmRlZiBSVExEX0JJTkRJTkdfTUFTSworI2RlZmluZSBSVExEX0JJTkRJTkdfTUFTSyAoUlRMRF9MQVpZIHwgUlRMRF9OT1cpCisjZW5kaWYKKworI2lmbmRlZiBSVExEX0xPQ0FUSU9OX01BU0sKKyNkZWZpbmUgUlRMRF9MT0NBVElPTl9NQVNLIChSVExEX0xPQ0FMIHwgUlRMRF9HTE9CQUwpCisjZW5kaWYKKworI2lmbmRlZiBSVExEX0FMTF9NQVNLCisjZGVmaW5lIFJUTERfQUxMX01BU0sgKFJUTERfQklORElOR19NQVNLIHwgUlRMRF9MT0NBVElPTl9NQVNLIHwgUlRMRF9OT0xPQUQgfCBSVExEX05PREVMRVRFIHwgUlRMRF9GSVJTVCB8IFJUTERfREVFUEJJTkQgfCBSVExEX01FTUJFUikKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBMaWJyYXJ5IHsKKyAgICB2b2lkKiBoYW5kbGU7Cit9IExpYnJhcnk7CisKK2V4dGVybiB2b2lkIHJiZmZpX0R5bmFtaWNMaWJyYXJ5X0luaXQoVkFMVUUgZmZpTW9kdWxlKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIF9MSUJSQVJZX0ggKi8KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRHluYW1pY0xpYnJhcnkubyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0R5bmFtaWNMaWJyYXJ5Lm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjMGE3YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0R5bmFtaWNMaWJyYXJ5Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRnVuY3Rpb24uYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Z1bmN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmOWVhYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Z1bmN0aW9uLmMKQEAgLTAsMCArMSw5OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZm5kZWYgX1dJTjMyCisjIGluY2x1ZGUgPHN5cy9tbWFuLmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfTVNDX1ZFUgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorIyBpZiAhZGVmaW5lZChJTlQ4X01JTikKKyMgIGluY2x1ZGUgIndpbjMyL3N0ZGludC5oIgorIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8cnVieS5oPgorCisjaW5jbHVkZSA8ZmZpLmg+CisjaWYgZGVmaW5lZChIQVZFX05BVElWRVRIUkVBRCkgJiYgIWRlZmluZWQoX1dJTjMyKQorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJyYmZmaS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCisjaW5jbHVkZSAiQWJzdHJhY3RNZW1vcnkuaCIKKyNpbmNsdWRlICJQb2ludGVyLmgiCisjaW5jbHVkZSAiU3RydWN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm0uaCIKKyNpbmNsdWRlICJUeXBlLmgiCisjaW5jbHVkZSAiTGFzdEVycm9yLmgiCisjaW5jbHVkZSAiQ2FsbC5oIgorI2luY2x1ZGUgIkNsb3N1cmVQb29sLmgiCisjaW5jbHVkZSAiTWFwcGVkVHlwZS5oIgorI2luY2x1ZGUgIlRocmVhZC5oIgorI2luY2x1ZGUgIkxvbmdEb3VibGUuaCIKKyNpbmNsdWRlICJNZXRob2RIYW5kbGUuaCIKKyNpbmNsdWRlICJGdW5jdGlvbi5oIgorCit0eXBlZGVmIHN0cnVjdCBGdW5jdGlvbl8geworICAgIFBvaW50ZXIgYmFzZTsKKyAgICBGdW5jdGlvblR5cGUqIGluZm87CisgICAgTWV0aG9kSGFuZGxlKiBtZXRob2RIYW5kbGU7CisgICAgYm9vbCBhdXRvcmVsZWFzZTsKKyAgICBDbG9zdXJlKiBjbG9zdXJlOworICAgIFZBTFVFIHJiUHJvYzsKKyAgICBWQUxVRSByYkZ1bmN0aW9uSW5mbzsKK30gRnVuY3Rpb247CisKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX21hcmsoRnVuY3Rpb24gKik7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9mcmVlKEZ1bmN0aW9uICopOworc3RhdGljIFZBTFVFIGZ1bmN0aW9uX2luaXQoVkFMVUUgc2VsZiwgVkFMVUUgcmJGdW5jdGlvbkluZm8sIFZBTFVFIHJiUHJvYyk7CitzdGF0aWMgdm9pZCBjYWxsYmFja19pbnZva2UoZmZpX2NpZiogY2lmLCB2b2lkKiByZXR2YWwsIHZvaWQqKiBwYXJhbWV0ZXJzLCB2b2lkKiB1c2VyX2RhdGEpOworc3RhdGljIGJvb2wgY2FsbGJhY2tfcHJlcCh2b2lkKiBjdHgsIHZvaWQqIGNvZGUsIENsb3N1cmUqIGNsb3N1cmUsIGNoYXIqIGVycm1zZywgc2l6ZV90IGVycm1zZ3NpemUpOworc3RhdGljIHZvaWQqIGNhbGxiYWNrX3dpdGhfZ3ZsKHZvaWQqIGRhdGEpOworc3RhdGljIFZBTFVFIGludm9rZV9jYWxsYmFjayh2b2lkKiBkYXRhKTsKK3N0YXRpYyBWQUxVRSBzYXZlX2NhbGxiYWNrX2V4Y2VwdGlvbih2b2lkKiBkYXRhLCBWQUxVRSBleGMpOworCisjZGVmaW5lIERFRkVSX0FTWU5DX0NBTExCQUNLIDEKKworCisjaWYgZGVmaW5lZChERUZFUl9BU1lOQ19DQUxMQkFDSykKK3N0YXRpYyBWQUxVRSBhc3luY19jYl9ldmVudCh2b2lkICopOworc3RhdGljIFZBTFVFIGFzeW5jX2NiX2NhbGwodm9pZCAqKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9SQl9USFJFQURfQ0FMTF9XSVRIX0dWTAorZXh0ZXJuIHZvaWQgKnJiX3RocmVhZF9jYWxsX3dpdGhfZ3ZsKHZvaWQgKigqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YTEpOworI2VuZGlmCisKK1ZBTFVFIHJiZmZpX0Z1bmN0aW9uQ2xhc3MgPSBRbmlsOworCisjaWYgZGVmaW5lZChERUZFUl9BU1lOQ19DQUxMQkFDSykKK3N0YXRpYyBWQUxVRSBhc3luY19jYl90aHJlYWQgPSBRbmlsOworI2VuZGlmCisKK3N0YXRpYyBJRCBpZF9jYWxsID0gMCwgaWRfdG9fbmF0aXZlID0gMCwgaWRfZnJvbV9uYXRpdmUgPSAwLCBpZF9jYnRhYmxlID0gMCwgaWRfY2JfcmVmID0gMDsKKworc3RydWN0IGd2bF9jYWxsYmFjayB7CisgICAgQ2xvc3VyZSogY2xvc3VyZTsKKyAgICB2b2lkKiAgICByZXR2YWw7CisgICAgdm9pZCoqICAgcGFyYW1ldGVyczsKKyAgICBib29sIGRvbmU7CisgICAgcmJmZmlfZnJhbWVfdCAqZnJhbWU7CisjaWYgZGVmaW5lZChERUZFUl9BU1lOQ19DQUxMQkFDSykKKyAgICBzdHJ1Y3QgZ3ZsX2NhbGxiYWNrKiBuZXh0OworIyBpZm5kZWYgX1dJTjMyCisgICAgcHRocmVhZF9jb25kX3QgYXN5bmNfY29uZDsKKyAgICBwdGhyZWFkX211dGV4X3QgYXN5bmNfbXV0ZXg7CisjIGVsc2UKKyAgICBIQU5ETEUgYXN5bmNfZXZlbnQ7CisjIGVuZGlmCisjZW5kaWYKK307CisKKworI2lmIGRlZmluZWQoREVGRVJfQVNZTkNfQ0FMTEJBQ0spCitzdGF0aWMgc3RydWN0IGd2bF9jYWxsYmFjayogYXN5bmNfY2JfbGlzdCA9IE5VTEw7CisjIGlmbmRlZiBfV0lOMzIKKyAgICBzdGF0aWMgcHRocmVhZF9tdXRleF90IGFzeW5jX2NiX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKyAgICBzdGF0aWMgcHRocmVhZF9jb25kX3QgYXN5bmNfY2JfY29uZCA9IFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKKyMgIGlmICEoZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9CTE9DS0lOR19SRUdJT04pIHx8IGRlZmluZWQoSEFWRV9SQl9USFJFQURfQ0FMTF9XSVRIT1VUX0dWTCkpCisgICAgc3RhdGljIGludCBhc3luY19jYl9waXBlWzJdOworIyAgZW5kaWYKKyMgZWxzZQorICAgIHN0YXRpYyBIQU5ETEUgYXN5bmNfY2JfY29uZDsKKyAgICBzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBhc3luY19jYl9sb2NrOworIyAgaWYgIShkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0JMT0NLSU5HX1JFR0lPTikgfHwgZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9DQUxMX1dJVEhPVVRfR1ZMKSkKKyAgICBzdGF0aWMgaW50IGFzeW5jX2NiX3BpcGVbMl07CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworc3RhdGljIFZBTFVFCitmdW5jdGlvbl9hbGxvY2F0ZShWQUxVRSBrbGFzcykKK3sKKyAgICBGdW5jdGlvbiAqZm47CisgICAgVkFMVUUgb2JqOworCisgICAgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgRnVuY3Rpb24sIGZ1bmN0aW9uX21hcmssIGZ1bmN0aW9uX2ZyZWUsIGZuKTsKKworICAgIGZuLT5iYXNlLm1lbW9yeS5mbGFncyA9IE1FTV9SRDsKKyAgICBmbi0+YmFzZS5yYlBhcmVudCA9IFFuaWw7CisgICAgZm4tPnJiUHJvYyA9IFFuaWw7CisgICAgZm4tPnJiRnVuY3Rpb25JbmZvID0gUW5pbDsKKyAgICBmbi0+YXV0b3JlbGVhc2UgPSB0cnVlOworCisgICAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQKK2Z1bmN0aW9uX21hcmsoRnVuY3Rpb24gKmZuKQoreworICAgIHJiX2djX21hcmsoZm4tPmJhc2UucmJQYXJlbnQpOworICAgIHJiX2djX21hcmsoZm4tPnJiUHJvYyk7CisgICAgcmJfZ2NfbWFyayhmbi0+cmJGdW5jdGlvbkluZm8pOworfQorCitzdGF0aWMgdm9pZAorZnVuY3Rpb25fZnJlZShGdW5jdGlvbiAqZm4pCit7CisgICAgaWYgKGZuLT5tZXRob2RIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICByYmZmaV9NZXRob2RIYW5kbGVfRnJlZShmbi0+bWV0aG9kSGFuZGxlKTsKKyAgICB9CisKKyAgICBpZiAoZm4tPmNsb3N1cmUgIT0gTlVMTCAmJiBmbi0+YXV0b3JlbGVhc2UpIHsKKyAgICAgICAgcmJmZmlfQ2xvc3VyZV9GcmVlKGZuLT5jbG9zdXJlKTsKKyAgICB9CisKKyAgICB4ZnJlZShmbik7Cit9CisKKy8qCisgKiBAcGFyYW0gW1R5cGUsIFN5bWJvbF0gcmV0dXJuX3R5cGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBmdW5jdGlvbgorICogQHBhcmFtIFtBcnJheTxUeXBlLCBTeW1ib2w+XSBwYXJhbV90eXBlcyBhcnJheSBvZiBwYXJhbWV0ZXJzIHR5cGVzCisgKiBAcGFyYW0gW0hhc2hdIG9wdGlvbnMgc2VlIHtGRkk6OkZ1bmN0aW9uVHlwZX0gZm9yIGF2YWlsYWJsZSBvcHRpb25zCisgKiBAcmV0dXJuIFtzZWxmXQorICogQSBuZXcgRnVuY3Rpb24gaW5zdGFuY2UuCisgKgorICogRGVmaW5lIGEgZnVuY3Rpb24gZnJvbSBhIFByb2Mgb3IgYSBibG9jay4KKyAqCisgKiBAb3ZlcmxvYWQgaW5pdGlhbGl6ZShyZXR1cm5fdHlwZSwgcGFyYW1fdHlwZXMsIG9wdGlvbnMgPSB7fSkgeyB8aXwgLi4uIH0KKyAqICBAeWllbGRwYXJhbSBpIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbgorICogQG92ZXJsb2FkIGluaXRpYWxpemUocmV0dXJuX3R5cGUsIHBhcmFtX3R5cGVzLCBwcm9jLCBvcHRpb25zID0ge30pCisgKiAgQHBhcmFtIFtQcm9jXSBwcm9jCisgKi8KK3N0YXRpYyBWQUxVRQorZnVuY3Rpb25faW5pdGlhbGl6ZShpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIHNlbGYpCit7CisKKyAgICBWQUxVRSByYlJldHVyblR5cGUgPSBRbmlsLCByYlBhcmFtVHlwZXMgPSBRbmlsLCByYlByb2MgPSBRbmlsLCByYk9wdGlvbnMgPSBRbmlsOworICAgIFZBTFVFIHJiRnVuY3Rpb25JbmZvID0gUW5pbDsKKyAgICBWQUxVRSBpbmZvQXJndlszXTsKKyAgICBpbnQgbmFyZ3M7CisKKyAgICBuYXJncyA9IHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiMjIiLCAmcmJSZXR1cm5UeXBlLCAmcmJQYXJhbVR5cGVzLCAmcmJQcm9jLCAmcmJPcHRpb25zKTsKKworICAgIC8qCisgICAgICogQ2FsbGJhY2sgd2l0aCBibG9jaywKKyAgICAgKiBlLmcuIEZ1bmN0aW9uLm5ldyg6aW50LCBbIDppbnQgXSkgeyB8aXwgYmxhaCB9CisgICAgICogb3IgICBGdW5jdGlvbi5uZXcoOmludCwgWyA6aW50IF0sIHsgOmNvbnZlbnRpb24gPT4gOnN0ZGNhbGwgfSkgeyB8aXwgYmxhaCB9CisgICAgICovCisgICAgaWYgKHJiX2Jsb2NrX2dpdmVuX3AoKSkgeworICAgICAgICBpZiAobmFyZ3MgPiAzKSB7CisgICAgICAgICAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJjYW5ub3QgY3JlYXRlIGZ1bmN0aW9uIHdpdGggYm90aCBwcm9jL2FkZHJlc3MgYW5kIGJsb2NrIik7CisgICAgICAgIH0KKyAgICAgICAgcmJPcHRpb25zID0gcmJQcm9jOworICAgICAgICByYlByb2MgPSByYl9ibG9ja19wcm9jKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ2FsbGJhY2sgd2l0aCBwcm9jLCBvciBGdW5jdGlvbiB3aXRoIGFkZHJlc3MKKyAgICAgICAgICogZS5nLiBGdW5jdGlvbi5uZXcoOmludCwgWyA6aW50IF0sIFByb2MubmV3IHsgfGl8IH0pCisgICAgICAgICAqICAgICAgRnVuY3Rpb24ubmV3KDppbnQsIFsgOmludCBdLCBQcm9jLm5ldyB7IHxpfCB9LCB7IDpjb252ZW50aW9uID0+IDpzdGRjYWxsIH0pCisgICAgICAgICAqICAgICAgRnVuY3Rpb24ubmV3KDppbnQsIFsgOmludCBdLCBhZGRyKQorICAgICAgICAgKiAgICAgIEZ1bmN0aW9uLm5ldyg6aW50LCBbIDppbnQgXSwgYWRkciwgeyA6Y29udmVudGlvbiA9PiA6c3RkY2FsbCB9KQorICAgICAgICAgKi8KKyAgICB9CisKKyAgICBpbmZvQXJndlswXSA9IHJiUmV0dXJuVHlwZTsKKyAgICBpbmZvQXJndlsxXSA9IHJiUGFyYW1UeXBlczsKKyAgICBpbmZvQXJndlsyXSA9IHJiT3B0aW9uczsKKyAgICByYkZ1bmN0aW9uSW5mbyA9IHJiX2NsYXNzX25ld19pbnN0YW5jZShyYk9wdGlvbnMgIT0gUW5pbCA/IDMgOiAyLCBpbmZvQXJndiwgcmJmZmlfRnVuY3Rpb25UeXBlQ2xhc3MpOworCisgICAgZnVuY3Rpb25faW5pdChzZWxmLCByYkZ1bmN0aW9uSW5mbywgcmJQcm9jKTsKKworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogY2FsbC1zZXE6IGluaXRpYWxpemVfY29weShvdGhlcikKKyAqIEByZXR1cm4gW25pbF0KKyAqIERPIE5PVCBDQUxMIFRISVMgTUVUSE9ECisgKi8KK3N0YXRpYyBWQUxVRQorZnVuY3Rpb25faW5pdGlhbGl6ZV9jb3B5KFZBTFVFIHNlbGYsIFZBTFVFIG90aGVyKQoreworICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJjYW5ub3QgZHVwbGljYXRlIGZ1bmN0aW9uIGluc3RhbmNlcyIpOworICAgIHJldHVybiBRbmlsOworfQorCitWQUxVRQorcmJmZmlfRnVuY3Rpb25fTmV3SW5zdGFuY2UoVkFMVUUgcmJGdW5jdGlvbkluZm8sIFZBTFVFIHJiUHJvYykKK3sKKyAgICByZXR1cm4gZnVuY3Rpb25faW5pdChmdW5jdGlvbl9hbGxvY2F0ZShyYmZmaV9GdW5jdGlvbkNsYXNzKSwgcmJGdW5jdGlvbkluZm8sIHJiUHJvYyk7Cit9CisKK1ZBTFVFCityYmZmaV9GdW5jdGlvbl9Gb3JQcm9jKFZBTFVFIHJiRnVuY3Rpb25JbmZvLCBWQUxVRSBwcm9jKQoreworICAgIFZBTFVFIGNhbGxiYWNrLCBjYnJlZiwgY2JUYWJsZTsKKyAgICBGdW5jdGlvbiogZnA7CisKKyAgICBjYnJlZiA9IFJURVNUKHJiX2l2YXJfZGVmaW5lZChwcm9jLCBpZF9jYl9yZWYpKSA/IHJiX2l2YXJfZ2V0KHByb2MsIGlkX2NiX3JlZikgOiBRbmlsOworICAgIC8qIElmIHRoZSBmaXJzdCBjYWxsYmFjayByZWZlcmVuY2UgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uIGZ1bmN0aW9uIHNpZ25hdHVyZSwgdXNlIGl0ICovCisgICAgaWYgKGNicmVmICE9IFFuaWwgJiYgQ0xBU1NfT0YoY2JyZWYpID09IHJiZmZpX0Z1bmN0aW9uQ2xhc3MpIHsKKyAgICAgICAgRGF0YV9HZXRfU3RydWN0KGNicmVmLCBGdW5jdGlvbiwgZnApOworICAgICAgICBpZiAoZnAtPnJiRnVuY3Rpb25JbmZvID09IHJiRnVuY3Rpb25JbmZvKSB7CisgICAgICAgICAgICByZXR1cm4gY2JyZWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjYlRhYmxlID0gUlRFU1QocmJfaXZhcl9kZWZpbmVkKHByb2MsIGlkX2NidGFibGUpKSA/IHJiX2l2YXJfZ2V0KHByb2MsIGlkX2NidGFibGUpIDogUW5pbDsKKyAgICBpZiAoY2JUYWJsZSAhPSBRbmlsICYmIChjYWxsYmFjayA9IHJiX2hhc2hfYXJlZihjYlRhYmxlLCByYkZ1bmN0aW9uSW5mbykpICE9IFFuaWwpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrOworICAgIH0KKworICAgIC8qIE5vIGV4aXN0aW5nIGZ1bmN0aW9uIGZvciB0aGUgcHJvYyB3aXRoIHRoYXQgc2lnbmF0dXJlLCBjcmVhdGUgYSBuZXcgb25lIGFuZCBjYWNoZSBpdCAqLworICAgIGNhbGxiYWNrID0gcmJmZmlfRnVuY3Rpb25fTmV3SW5zdGFuY2UocmJGdW5jdGlvbkluZm8sIHByb2MpOworICAgIGlmIChjYnJlZiA9PSBRbmlsKSB7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIG90aGVyIGNiIGFscmVhZHkgY2FjaGVkIGZvciB0aGlzIHByb2MsIHdlIGNhbiB1c2UgdGhlIGl2YXIgc2xvdCAqLworICAgICAgICByYl9pdmFyX3NldChwcm9jLCBpZF9jYl9yZWYsIGNhbGxiYWNrKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGUgcHJvYyBpbnN0YW5jZSBoYXMgYmVlbiB1c2VkIGFzIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBjYWxsYmFjaywgc3RvcmUgZXh0cmFzIGluIGEgaGFzaCAqLworICAgICAgICBjYlRhYmxlID0gcmJfaGFzaF9uZXcoKTsKKyAgICAgICAgcmJfaXZhcl9zZXQocHJvYywgaWRfY2J0YWJsZSwgY2JUYWJsZSk7CisgICAgICAgIHJiX2hhc2hfYXNldChjYlRhYmxlLCByYkZ1bmN0aW9uSW5mbywgY2FsbGJhY2spOworICAgIH0KKworICAgIHJldHVybiBjYWxsYmFjazsKK30KKworc3RhdGljIFZBTFVFCitmdW5jdGlvbl9pbml0KFZBTFVFIHNlbGYsIFZBTFVFIHJiRnVuY3Rpb25JbmZvLCBWQUxVRSByYlByb2MpCit7CisgICAgRnVuY3Rpb24qIGZuID0gTlVMTDsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBGdW5jdGlvbiwgZm4pOworCisgICAgZm4tPnJiRnVuY3Rpb25JbmZvID0gcmJGdW5jdGlvbkluZm87CisKKyAgICBEYXRhX0dldF9TdHJ1Y3QoZm4tPnJiRnVuY3Rpb25JbmZvLCBGdW5jdGlvblR5cGUsIGZuLT5pbmZvKTsKKworICAgIGlmIChyYl9vYmpfaXNfa2luZF9vZihyYlByb2MsIHJiZmZpX1BvaW50ZXJDbGFzcykpIHsKKyAgICAgICAgUG9pbnRlciogb3JpZzsKKyAgICAgICAgRGF0YV9HZXRfU3RydWN0KHJiUHJvYywgUG9pbnRlciwgb3JpZyk7CisgICAgICAgIGZuLT5iYXNlLm1lbW9yeSA9IG9yaWctPm1lbW9yeTsKKyAgICAgICAgZm4tPmJhc2UucmJQYXJlbnQgPSByYlByb2M7CisKKyAgICB9IGVsc2UgaWYgKHJiX29ial9pc19raW5kX29mKHJiUHJvYywgcmJfY1Byb2MpIHx8IHJiX3Jlc3BvbmRfdG8ocmJQcm9jLCBpZF9jYWxsKSkgeworICAgICAgICBpZiAoZm4tPmluZm8tPmNsb3N1cmVQb29sID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZuLT5pbmZvLT5jbG9zdXJlUG9vbCA9IHJiZmZpX0Nsb3N1cmVQb29sX05ldyhzaXplb2YoZmZpX2Nsb3N1cmUpLCBjYWxsYmFja19wcmVwLCBmbi0+aW5mbyk7CisgICAgICAgICAgICBpZiAoZm4tPmluZm8tPmNsb3N1cmVQb29sID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByYl9yYWlzZShyYl9lTm9NZW1FcnJvciwgImZhaWxlZCB0byBjcmVhdGUgY2xvc3VyZSBwb29sIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIGRlZmluZWQoREVGRVJfQVNZTkNfQ0FMTEJBQ0spCisgICAgICAgIGlmIChhc3luY19jYl90aHJlYWQgPT0gUW5pbCkgeworI2lmICEoZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9CTE9DS0lOR19SRUdJT04pIHx8IGRlZmluZWQoSEFWRV9SQl9USFJFQURfQ0FMTF9XSVRIT1VUX0dWTCkpICYmIGRlZmluZWQoX1dJTjMyKQorICAgICAgICAgICAgX3BpcGUoYXN5bmNfY2JfcGlwZSwgMTAyNCwgT19CSU5BUlkpOworI2VsaWYgIShkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0JMT0NLSU5HX1JFR0lPTikgfHwgZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9DQUxMX1dJVEhPVVRfR1ZMKSkKKyAgICAgICAgICAgIHBpcGUoYXN5bmNfY2JfcGlwZSk7CisgICAgICAgICAgICBmY250bChhc3luY19jYl9waXBlWzBdLCBGX1NFVEZMLCBmY250bChhc3luY19jYl9waXBlWzBdLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0spOworICAgICAgICAgICAgZmNudGwoYXN5bmNfY2JfcGlwZVsxXSwgRl9TRVRGTCwgZmNudGwoYXN5bmNfY2JfcGlwZVsxXSwgRl9HRVRGTCkgfCBPX05PTkJMT0NLKTsKKyNlbmRpZgorICAgICAgICAgICAgYXN5bmNfY2JfdGhyZWFkID0gcmJfdGhyZWFkX2NyZWF0ZShhc3luY19jYl9ldmVudCwgTlVMTCk7CisgICAgICAgIH0KKworI2VuZGlmCisKKyAgICAgICAgZm4tPmNsb3N1cmUgPSByYmZmaV9DbG9zdXJlX0FsbG9jKGZuLT5pbmZvLT5jbG9zdXJlUG9vbCk7CisgICAgICAgIGZuLT5jbG9zdXJlLT5pbmZvID0gZm47CisgICAgICAgIGZuLT5iYXNlLm1lbW9yeS5hZGRyZXNzID0gZm4tPmNsb3N1cmUtPmNvZGU7CisgICAgICAgIGZuLT5iYXNlLm1lbW9yeS5zaXplID0gc2l6ZW9mKCpmbi0+Y2xvc3VyZSk7CisgICAgICAgIGZuLT5hdXRvcmVsZWFzZSA9IHRydWU7CisKKyAgICB9IGVsc2UgeworICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAid3JvbmcgYXJndW1lbnQgdHlwZSAlcywgZXhwZWN0ZWQgcG9pbnRlciBvciBwcm9jIiwKKyAgICAgICAgICAgICAgICByYl9vYmpfY2xhc3NuYW1lKHJiUHJvYykpOworICAgIH0KKworICAgIGZuLT5yYlByb2MgPSByYlByb2M7CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBjYWxsKCphcmdzKQorICogQHBhcmFtIFtBcnJheV0gYXJncyBmdW5jdGlvbiBhcmd1bWVudHMKKyAqIEByZXR1cm4gW0ZGSTo6VHlwZV0KKyAqIENhbGwgdGhlIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBWQUxVRQorZnVuY3Rpb25fY2FsbChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIHNlbGYpCit7CisgICAgRnVuY3Rpb24qIGZuOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEZ1bmN0aW9uLCBmbik7CisKKyAgICByZXR1cm4gKCpmbi0+aW5mby0+aW52b2tlKShhcmdjLCBhcmd2LCBmbi0+YmFzZS5tZW1vcnkuYWRkcmVzcywgZm4tPmluZm8pOworfQorCisvKgorICogY2FsbC1zZXE6IGF0dGFjaChtLCBuYW1lKQorICogQHBhcmFtIFtNb2R1bGVdIG0KKyAqIEBwYXJhbSBbU3RyaW5nXSBuYW1lCisgKiBAcmV0dXJuIFtzZWxmXQorICogQXR0YWNoIGEgRnVuY3Rpb24gdG8gdGhlIE1vZHVsZSArbSsgYXMgK25hbWUrLgorICovCitzdGF0aWMgVkFMVUUKK2Z1bmN0aW9uX2F0dGFjaChWQUxVRSBzZWxmLCBWQUxVRSBtb2R1bGUsIFZBTFVFIG5hbWUpCit7CisgICAgRnVuY3Rpb24qIGZuOworICAgIGNoYXIgdmFyWzEwMjRdOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEZ1bmN0aW9uLCBmbik7CisKKyAgICBpZiAoZm4tPmluZm8tPnBhcmFtZXRlckNvdW50ID09IC0xKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJjYW5ub3QgYXR0YWNoIHZhcmlhZGljIGZ1bmN0aW9ucyIpOworICAgICAgICByZXR1cm4gUW5pbDsKKyAgICB9CisKKyAgICBpZiAoIXJiX29ial9pc19raW5kX29mKG1vZHVsZSwgcmJfY01vZHVsZSkpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwgInRyeWluZyB0byBhdHRhY2ggZnVuY3Rpb24gdG8gbm9uLW1vZHVsZSIpOworICAgICAgICByZXR1cm4gUW5pbDsKKyAgICB9CisKKyAgICBpZiAoZm4tPm1ldGhvZEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGZuLT5tZXRob2RIYW5kbGUgPSByYmZmaV9NZXRob2RIYW5kbGVfQWxsb2MoZm4tPmluZm8sIGZuLT5iYXNlLm1lbW9yeS5hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0YXNoIHRoZSBGdW5jdGlvbiBpbiBhIG1vZHVsZSB2YXJpYWJsZSBzbyBpdCBkb2VzIG5vdCBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQKKyAgICAgKi8KKyAgICBzbnByaW50Zih2YXIsIHNpemVvZih2YXIpLCAiQEAlcyIsIFN0cmluZ1ZhbHVlQ1N0cihuYW1lKSk7CisgICAgcmJfY3Zfc2V0KG1vZHVsZSwgdmFyLCBzZWxmKTsKKworICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKG1vZHVsZSwgU3RyaW5nVmFsdWVDU3RyKG5hbWUpLAorICAgICAgICAgICAgcmJmZmlfTWV0aG9kSGFuZGxlX0NvZGVBZGRyZXNzKGZuLT5tZXRob2RIYW5kbGUpLCAtMSk7CisKKworICAgIHJiX2RlZmluZV9tZXRob2QobW9kdWxlLCBTdHJpbmdWYWx1ZUNTdHIobmFtZSksCisgICAgICAgICAgICByYmZmaV9NZXRob2RIYW5kbGVfQ29kZUFkZHJlc3MoZm4tPm1ldGhvZEhhbmRsZSksIC0xKTsKKworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogY2FsbC1zZXE6IGF1dG9yZWxlYXNlID0gYXV0b3JlbGVhc2UKKyAqIEBwYXJhbSBbQm9vbGVhbl0gYXV0b3JlbGVhc2UKKyAqIEByZXR1cm4gW3NlbGZdCisgKiBTZXQgK2F1dG9yZWxlYXNlKyBhdHRyaWJ1dGUgKFNlZSB7UG9pbnRlcn0pLgorICovCitzdGF0aWMgVkFMVUUKK2Z1bmN0aW9uX3NldF9hdXRvcmVsZWFzZShWQUxVRSBzZWxmLCBWQUxVRSBhdXRvcmVsZWFzZSkKK3sKKyAgICBGdW5jdGlvbiogZm47CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgRnVuY3Rpb24sIGZuKTsKKworICAgIGZuLT5hdXRvcmVsZWFzZSA9IFJURVNUKGF1dG9yZWxlYXNlKTsKKworICAgIHJldHVybiBzZWxmOworfQorCitzdGF0aWMgVkFMVUUKK2Z1bmN0aW9uX2F1dG9yZWxlYXNlX3AoVkFMVUUgc2VsZikKK3sKKyAgICBGdW5jdGlvbiogZm47CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgRnVuY3Rpb24sIGZuKTsKKworICAgIHJldHVybiBmbi0+YXV0b3JlbGVhc2UgPyBRdHJ1ZSA6IFFmYWxzZTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBmcmVlCisgKiBAcmV0dXJuIFtzZWxmXQorICogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IEZ1bmN0aW9uLgorICovCitzdGF0aWMgVkFMVUUKK2Z1bmN0aW9uX3JlbGVhc2UoVkFMVUUgc2VsZikKK3sKKyAgICBGdW5jdGlvbiogZm47CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgRnVuY3Rpb24sIGZuKTsKKworICAgIGlmIChmbi0+Y2xvc3VyZSA9PSBOVUxMKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJjYW5ub3QgZnJlZSBmdW5jdGlvbiB3aGljaCB3YXMgbm90IGFsbG9jYXRlZCIpOworICAgIH0KKworICAgIHJiZmZpX0Nsb3N1cmVfRnJlZShmbi0+Y2xvc3VyZSk7CisgICAgZm4tPmNsb3N1cmUgPSBOVUxMOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKK3N0YXRpYyB2b2lkCitjYWxsYmFja19pbnZva2UoZmZpX2NpZiogY2lmLCB2b2lkKiByZXR2YWwsIHZvaWQqKiBwYXJhbWV0ZXJzLCB2b2lkKiB1c2VyX2RhdGEpCit7CisgICAgc3RydWN0IGd2bF9jYWxsYmFjayBjYiA9IHsgMCB9OworCisgICAgY2IuY2xvc3VyZSA9IChDbG9zdXJlICopIHVzZXJfZGF0YTsKKyAgICBjYi5yZXR2YWwgPSByZXR2YWw7CisgICAgY2IucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgY2IuZG9uZSA9IGZhbHNlOworICAgIGNiLmZyYW1lID0gcmJmZmlfZnJhbWVfY3VycmVudCgpOworCisgICAgaWYgKGNiLmZyYW1lICE9IE5VTEwpIGNiLmZyYW1lLT5leGMgPSBRbmlsOworICAgIGlmIChjYi5mcmFtZSAhPSBOVUxMICYmIGNiLmZyYW1lLT5oYXNfZ3ZsKSB7CisgICAgICAgIGNhbGxiYWNrX3dpdGhfZ3ZsKCZjYik7CisKKyNpZiBkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0NBTExfV0lUSF9HVkwpCisgICAgfSBlbHNlIGlmIChjYi5mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIHJiX3RocmVhZF9jYWxsX3dpdGhfZ3ZsKGNhbGxiYWNrX3dpdGhfZ3ZsLCAmY2IpOworI2VuZGlmCisjaWYgZGVmaW5lZChERUZFUl9BU1lOQ19DQUxMQkFDSykgJiYgIWRlZmluZWQoX1dJTjMyKQorICAgIH0gZWxzZSB7CisgICAgICAgIGJvb2wgZW1wdHkgPSBmYWxzZTsKKworICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJmNiLmFzeW5jX211dGV4LCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9jb25kX2luaXQoJmNiLmFzeW5jX2NvbmQsIE5VTEwpOworCisgICAgICAgIC8qIE5vdyBzaWduYWwgdGhlIGFzeW5jIGNhbGxiYWNrIHRocmVhZCAqLworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmFzeW5jX2NiX211dGV4KTsKKyAgICAgICAgZW1wdHkgPSBhc3luY19jYl9saXN0ID09IE5VTEw7CisgICAgICAgIGNiLm5leHQgPSBhc3luY19jYl9saXN0OworICAgICAgICBhc3luY19jYl9saXN0ID0gJmNiOworCisjaWYgIShkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0JMT0NLSU5HX1JFR0lPTikgfHwgZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9DQUxMX1dJVEhPVVRfR1ZMKSkKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFzeW5jX2NiX211dGV4KTsKKyAgICAgICAgLyogT25seSBzaWduYWwgaWYgdGhlIGxpc3Qgd2FzIGVtcHR5ICovCisgICAgICAgIGlmIChlbXB0eSkgeworICAgICAgICAgICAgY2hhciBjOworICAgICAgICAgICAgd3JpdGUoYXN5bmNfY2JfcGlwZVsxXSwgJmMsIDEpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZhc3luY19jYl9jb25kKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFzeW5jX2NiX211dGV4KTsKKyNlbmRpZgorCisgICAgICAgIC8qIFdhaXQgZm9yIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoZSBydWJ5IGNhbGxiYWNrIHRvIHNpZ25hbCBpdCBpcyBkb25lICovCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2IuYXN5bmNfbXV0ZXgpOworICAgICAgICB3aGlsZSAoIWNiLmRvbmUpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZjYi5hc3luY19jb25kLCAmY2IuYXN5bmNfbXV0ZXgpOworICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjYi5hc3luY19tdXRleCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjYi5hc3luY19jb25kKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZjYi5hc3luY19tdXRleCk7CisKKyNlbGlmIGRlZmluZWQoREVGRVJfQVNZTkNfQ0FMTEJBQ0spICYmIGRlZmluZWQoX1dJTjMyKQorICAgIH0gZWxzZSB7CisgICAgICAgIGJvb2wgZW1wdHkgPSBmYWxzZTsKKworICAgICAgICBjYi5hc3luY19ldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisKKyAgICAgICAgLyogTm93IHNpZ25hbCB0aGUgYXN5bmMgY2FsbGJhY2sgdGhyZWFkICovCisgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZhc3luY19jYl9sb2NrKTsKKyAgICAgICAgZW1wdHkgPSBhc3luY19jYl9saXN0ID09IE5VTEw7CisgICAgICAgIGNiLm5leHQgPSBhc3luY19jYl9saXN0OworICAgICAgICBhc3luY19jYl9saXN0ID0gJmNiOworICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmYXN5bmNfY2JfbG9jayk7CisKKyNpZiAhKGRlZmluZWQoSEFWRV9SQl9USFJFQURfQkxPQ0tJTkdfUkVHSU9OKSB8fCBkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0NBTExfV0lUSE9VVF9HVkwpKQorICAgICAgICAvKiBPbmx5IHNpZ25hbCBpZiB0aGUgbGlzdCB3YXMgZW1wdHkgKi8KKyAgICAgICAgaWYgKGVtcHR5KSB7CisgICAgICAgICAgICBjaGFyIGM7CisgICAgICAgICAgICB3cml0ZShhc3luY19jYl9waXBlWzFdLCAmYywgMSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIFNldEV2ZW50KGFzeW5jX2NiX2NvbmQpOworI2VuZGlmCisKKyAgICAgICAgLyogV2FpdCBmb3IgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIHJ1YnkgY2FsbGJhY2sgdG8gc2lnbmFsIGl0IGlzIGRvbmUgKi8KKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChjYi5hc3luY19ldmVudCwgSU5GSU5JVEUpOworICAgICAgICBDbG9zZUhhbmRsZShjYi5hc3luY19ldmVudCk7CisjZW5kaWYKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkKERFRkVSX0FTWU5DX0NBTExCQUNLKQorc3RydWN0IGFzeW5jX3dhaXQgeworICAgIHZvaWQqIGNiOworICAgIGJvb2wgc3RvcDsKK307CisKK3N0YXRpYyBWQUxVRSBhc3luY19jYl93YWl0KHZvaWQgKik7CitzdGF0aWMgdm9pZCBhc3luY19jYl9zdG9wKHZvaWQgKik7CisKKyNpZiBkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0JMT0NLSU5HX1JFR0lPTikgfHwgZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9DQUxMX1dJVEhPVVRfR1ZMKQorc3RhdGljIFZBTFVFCithc3luY19jYl9ldmVudCh2b2lkKiB1bnVzZWQpCit7CisgICAgc3RydWN0IGFzeW5jX3dhaXQgdyA9IHsgMCB9OworCisgICAgdy5zdG9wID0gZmFsc2U7CisgICAgd2hpbGUgKCF3LnN0b3ApIHsKKyNpZiBkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0NBTExfV0lUSE9VVF9HVkwpCisgICAgICAgIHJiX3RocmVhZF9jYWxsX3dpdGhvdXRfZ3ZsKGFzeW5jX2NiX3dhaXQsICZ3LCBhc3luY19jYl9zdG9wLCAmdyk7CisjZWxzZQorICAgICAgICByYl90aHJlYWRfYmxvY2tpbmdfcmVnaW9uKGFzeW5jX2NiX3dhaXQsICZ3LCBhc3luY19jYl9zdG9wLCAmdyk7CisjZW5kaWYKKyAgICAgICAgaWYgKHcuY2IgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogU3RhcnQgdXAgYSBuZXcgcnVieSB0aHJlYWQgdG8gcnVuIHRoZSBydWJ5IGNhbGxiYWNrICovCisgICAgICAgICAgICByYl90aHJlYWRfY3JlYXRlKGFzeW5jX2NiX2NhbGwsIHcuY2IpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFFuaWw7Cit9CisKKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorc3RhdGljIFZBTFVFCithc3luY19jYl9ldmVudCh2b2lkKiB1bnVzZWQpCit7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RydWN0IGd2bF9jYWxsYmFjayogY2I7CisgICAgICAgIGNoYXIgYnVmWzY0XTsKKyAgICAgICAgZmRfc2V0IHJmZHM7CisKKyAgICAgICAgRkRfWkVSTygmcmZkcyk7CisgICAgICAgIEZEX1NFVChhc3luY19jYl9waXBlWzBdLCAmcmZkcyk7CisgICAgICAgIHJiX3RocmVhZF9zZWxlY3QoYXN5bmNfY2JfcGlwZVswXSArIDEsICZyZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgcmVhZChhc3luY19jYl9waXBlWzBdLCBidWYsIHNpemVvZihidWYpKTsKKworICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmYXN5bmNfY2JfbG9jayk7CisgICAgICAgIGNiID0gYXN5bmNfY2JfbGlzdDsKKyAgICAgICAgYXN5bmNfY2JfbGlzdCA9IE5VTEw7CisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZhc3luY19jYl9sb2NrKTsKKworICAgICAgICB3aGlsZSAoY2IgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RydWN0IGd2bF9jYWxsYmFjayogbmV4dCA9IGNiLT5uZXh0OworICAgICAgICAgICAgLyogU3RhcnQgdXAgYSBuZXcgcnVieSB0aHJlYWQgdG8gcnVuIHRoZSBydWJ5IGNhbGxiYWNrICovCisgICAgICAgICAgICByYl90aHJlYWRfY3JlYXRlKGFzeW5jX2NiX2NhbGwsIGNiKTsKKyAgICAgICAgICAgIGNiID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBRbmlsOworfQorI2Vsc2UKK3N0YXRpYyBWQUxVRQorYXN5bmNfY2JfZXZlbnQodm9pZCogdW51c2VkKQoreworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0cnVjdCBndmxfY2FsbGJhY2sqIGNiOworICAgICAgICBjaGFyIGJ1Zls2NF07CisKKyAgICAgICAgaWYgKHJlYWQoYXN5bmNfY2JfcGlwZVswXSwgYnVmLCBzaXplb2YoYnVmKSkgPCAwKSB7CisgICAgICAgICAgICByYl90aHJlYWRfd2FpdF9mZChhc3luY19jYl9waXBlWzBdKTsKKyAgICAgICAgICAgIHdoaWxlIChyZWFkKGFzeW5jX2NiX3BpcGVbMF0sIGJ1Ziwgc2l6ZW9mIChidWYpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmJfaW9fd2FpdF9yZWFkYWJsZShhc3luY19jYl9waXBlWzBdKSAhPSBRdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUWZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYXN5bmNfY2JfbXV0ZXgpOworICAgICAgICBjYiA9IGFzeW5jX2NiX2xpc3Q7CisgICAgICAgIGFzeW5jX2NiX2xpc3QgPSBOVUxMOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYXN5bmNfY2JfbXV0ZXgpOworCisgICAgICAgIHdoaWxlIChjYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdHJ1Y3QgZ3ZsX2NhbGxiYWNrKiBuZXh0ID0gY2ItPm5leHQ7CisgICAgICAgICAgICAvKiBTdGFydCB1cCBhIG5ldyBydWJ5IHRocmVhZCB0byBydW4gdGhlIHJ1YnkgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgIHJiX3RocmVhZF9jcmVhdGUoYXN5bmNfY2JfY2FsbCwgY2IpOworICAgICAgICAgICAgY2IgPSBuZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFFuaWw7Cit9CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorc3RhdGljIFZBTFVFCithc3luY19jYl93YWl0KHZvaWQgKmRhdGEpCit7CisgICAgc3RydWN0IGFzeW5jX3dhaXQqIHcgPSAoc3RydWN0IGFzeW5jX3dhaXQgKikgZGF0YTsKKworICAgIHctPmNiID0gTlVMTDsKKworICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZhc3luY19jYl9sb2NrKTsKKworICAgIHdoaWxlICghdy0+c3RvcCAmJiBhc3luY19jYl9saXN0ID09IE5VTEwpIHsKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmFzeW5jX2NiX2xvY2spOworICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGFzeW5jX2NiX2NvbmQsIElORklOSVRFKTsKKyAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmFzeW5jX2NiX2xvY2spOworICAgIH0KKworICAgIGlmIChhc3luY19jYl9saXN0ICE9IE5VTEwpIHsKKyAgICAgICAgdy0+Y2IgPSBhc3luY19jYl9saXN0OworICAgICAgICBhc3luY19jYl9saXN0ID0gYXN5bmNfY2JfbGlzdC0+bmV4dDsKKyAgICB9CisKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmYXN5bmNfY2JfbG9jayk7CisKKyAgICByZXR1cm4gUW5pbDsKK30KKworc3RhdGljIHZvaWQKK2FzeW5jX2NiX3N0b3Aodm9pZCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgYXN5bmNfd2FpdCogdyA9IChzdHJ1Y3QgYXN5bmNfd2FpdCAqKSBkYXRhOworCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmFzeW5jX2NiX2xvY2spOworICAgIHctPnN0b3AgPSB0cnVlOworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZhc3luY19jYl9sb2NrKTsKKyAgICBTZXRFdmVudChhc3luY19jYl9jb25kKTsKK30KKworI2Vsc2UKK3N0YXRpYyBWQUxVRQorYXN5bmNfY2Jfd2FpdCh2b2lkICpkYXRhKQoreworICAgIHN0cnVjdCBhc3luY193YWl0KiB3ID0gKHN0cnVjdCBhc3luY193YWl0ICopIGRhdGE7CisKKyAgICB3LT5jYiA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmFzeW5jX2NiX211dGV4KTsKKworICAgIHdoaWxlICghdy0+c3RvcCAmJiBhc3luY19jYl9saXN0ID09IE5VTEwpIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmFzeW5jX2NiX2NvbmQsICZhc3luY19jYl9tdXRleCk7CisgICAgfQorCisgICAgaWYgKGFzeW5jX2NiX2xpc3QgIT0gTlVMTCkgeworICAgICAgICB3LT5jYiA9IGFzeW5jX2NiX2xpc3Q7CisgICAgICAgIGFzeW5jX2NiX2xpc3QgPSBhc3luY19jYl9saXN0LT5uZXh0OworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhc3luY19jYl9tdXRleCk7CisKKyAgICByZXR1cm4gUW5pbDsKK30KKworc3RhdGljIHZvaWQKK2FzeW5jX2NiX3N0b3Aodm9pZCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgYXN5bmNfd2FpdCogdyA9IChzdHJ1Y3QgYXN5bmNfd2FpdCAqKSBkYXRhOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZhc3luY19jYl9tdXRleCk7CisgICAgdy0+c3RvcCA9IHRydWU7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmYXN5bmNfY2JfY29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFzeW5jX2NiX211dGV4KTsKK30KKyNlbmRpZgorCitzdGF0aWMgVkFMVUUKK2FzeW5jX2NiX2NhbGwodm9pZCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgZ3ZsX2NhbGxiYWNrKiBjYiA9IChzdHJ1Y3QgZ3ZsX2NhbGxiYWNrICopIGRhdGE7CisKKyAgICBjYWxsYmFja193aXRoX2d2bChkYXRhKTsKKworICAgIC8qIFNpZ25hbCB0aGUgb3JpZ2luYWwgbmF0aXZlIHRocmVhZCB0aGF0IHRoZSBydWJ5IGNvZGUgaGFzIGNvbXBsZXRlZCAqLworI2lmZGVmIF9XSU4zMgorICAgIFNldEV2ZW50KGNiLT5hc3luY19ldmVudCk7CisjZWxzZQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2ItPmFzeW5jX211dGV4KTsKKyAgICBjYi0+ZG9uZSA9IHRydWU7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmY2ItPmFzeW5jX2NvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjYi0+YXN5bmNfbXV0ZXgpOworI2VuZGlmCisKKyAgICByZXR1cm4gUW5pbDsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkICoKK2NhbGxiYWNrX3dpdGhfZ3ZsKHZvaWQqIGRhdGEpCit7CisgICAgcmJfcmVzY3VlMihpbnZva2VfY2FsbGJhY2ssIChWQUxVRSkgZGF0YSwgc2F2ZV9jYWxsYmFja19leGNlcHRpb24sIChWQUxVRSkgZGF0YSwgcmJfZUV4Y2VwdGlvbiwgKFZBTFVFKSAwKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFZBTFVFCitpbnZva2VfY2FsbGJhY2sodm9pZCogZGF0YSkKK3sKKyAgICBzdHJ1Y3QgZ3ZsX2NhbGxiYWNrKiBjYiA9IChzdHJ1Y3QgZ3ZsX2NhbGxiYWNrICopIGRhdGE7CisKKyAgICBGdW5jdGlvbiogZm4gPSAoRnVuY3Rpb24gKikgY2ItPmNsb3N1cmUtPmluZm87CisgICAgRnVuY3Rpb25UeXBlICpjYkluZm8gPSBmbi0+aW5mbzsKKyAgICBUeXBlKiByZXR1cm5UeXBlID0gY2JJbmZvLT5yZXR1cm5UeXBlOworICAgIHZvaWQqIHJldHZhbCA9IGNiLT5yZXR2YWw7CisgICAgdm9pZCoqIHBhcmFtZXRlcnMgPSBjYi0+cGFyYW1ldGVyczsKKyAgICBWQUxVRSogcmJQYXJhbXM7CisgICAgVkFMVUUgcmJSZXR1cm5UeXBlID0gY2JJbmZvLT5yYlJldHVyblR5cGU7CisgICAgVkFMVUUgcmJSZXR1cm5WYWx1ZTsKKyAgICBpbnQgaTsKKworICAgIHJiUGFyYW1zID0gQUxMT0NBX04oVkFMVUUsIGNiSW5mby0+cGFyYW1ldGVyQ291bnQpOworICAgIGZvciAoaSA9IDA7IGkgPCBjYkluZm8tPnBhcmFtZXRlckNvdW50OyArK2kpIHsKKyAgICAgICAgVkFMVUUgcGFyYW07CisgICAgICAgIFR5cGUqIHBhcmFtVHlwZSA9IGNiSW5mby0+cGFyYW1ldGVyVHlwZXNbaV07CisgICAgICAgIFZBTFVFIHJiUGFyYW1UeXBlID0gcmJfYXJ5X2VudHJ5KGNiSW5mby0+cmJQYXJhbWV0ZXJUeXBlcywgaSk7CisKKyAgICAgICAgaWYgKHVubGlrZWx5KHBhcmFtVHlwZS0+bmF0aXZlVHlwZSA9PSBOQVRJVkVfTUFQUEVEKSkgeworICAgICAgICAgICAgcmJQYXJhbVR5cGUgPSAoKE1hcHBlZFR5cGUgKikgcGFyYW1UeXBlKS0+cmJUeXBlOworICAgICAgICAgICAgcGFyYW1UeXBlID0gKChNYXBwZWRUeXBlICopIHBhcmFtVHlwZSktPnR5cGU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHBhcmFtVHlwZS0+bmF0aXZlVHlwZSkgeworICAgICAgICAgICAgY2FzZSBOQVRJVkVfSU5UODoKKyAgICAgICAgICAgICAgICBwYXJhbSA9IElOVDJOVU0oKihpbnQ4X3QgKikgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BVElWRV9VSU5UODoKKyAgICAgICAgICAgICAgICBwYXJhbSA9IFVJTlQyTlVNKCoodWludDhfdCAqKSBwYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX0lOVDE2OgorICAgICAgICAgICAgICAgIHBhcmFtID0gSU5UMk5VTSgqKGludDE2X3QgKikgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BVElWRV9VSU5UMTY6CisgICAgICAgICAgICAgICAgcGFyYW0gPSBVSU5UMk5VTSgqKHVpbnQxNl90ICopIHBhcmFtZXRlcnNbaV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQVRJVkVfSU5UMzI6CisgICAgICAgICAgICAgICAgcGFyYW0gPSBJTlQyTlVNKCooaW50MzJfdCAqKSBwYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX1VJTlQzMjoKKyAgICAgICAgICAgICAgICBwYXJhbSA9IFVJTlQyTlVNKCoodWludDMyX3QgKikgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BVElWRV9JTlQ2NDoKKyAgICAgICAgICAgICAgICBwYXJhbSA9IExMMk5VTSgqKGludDY0X3QgKikgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BVElWRV9VSU5UNjQ6CisgICAgICAgICAgICAgICAgcGFyYW0gPSBVTEwyTlVNKCoodWludDY0X3QgKikgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BVElWRV9MT05HOgorICAgICAgICAgICAgICAgIHBhcmFtID0gTE9ORzJOVU0oKihsb25nICopIHBhcmFtZXRlcnNbaV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQVRJVkVfVUxPTkc6CisgICAgICAgICAgICAgICAgcGFyYW0gPSBVTE9ORzJOVU0oKih1bnNpZ25lZCBsb25nICopIHBhcmFtZXRlcnNbaV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQVRJVkVfRkxPQVQzMjoKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHJiX2Zsb2F0X25ldygqKGZsb2F0ICopIHBhcmFtZXRlcnNbaV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQVRJVkVfRkxPQVQ2NDoKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHJiX2Zsb2F0X25ldygqKGRvdWJsZSAqKSBwYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX0xPTkdET1VCTEU6CisJICAgICAgcGFyYW0gPSByYmZmaV9sb25nZG91YmxlX25ldygqKGxvbmcgZG91YmxlICopIHBhcmFtZXRlcnNbaV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQVRJVkVfU1RSSU5HOgorICAgICAgICAgICAgICAgIHBhcmFtID0gKCoodm9pZCAqKikgcGFyYW1ldGVyc1tpXSAhPSBOVUxMKSA/IHJiX3RhaW50ZWRfc3RyX25ldzIoKihjaGFyICoqKSBwYXJhbWV0ZXJzW2ldKSA6IFFuaWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5BVElWRV9QT0lOVEVSOgorICAgICAgICAgICAgICAgIHBhcmFtID0gcmJmZmlfUG9pbnRlcl9OZXdJbnN0YW5jZSgqKHZvaWQgKiopIHBhcmFtZXRlcnNbaV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQVRJVkVfQk9PTDoKKyAgICAgICAgICAgICAgICBwYXJhbSA9ICgqKHVpbnQ4X3QgKikgcGFyYW1ldGVyc1tpXSkgPyBRdHJ1ZSA6IFFmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQVRJVkVfRlVOQ1RJT046CisgICAgICAgICAgICBjYXNlIE5BVElWRV9DQUxMQkFDSzoKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX1NUUlVDVDoKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHJiZmZpX05hdGl2ZVZhbHVlX1RvUnVieShwYXJhbVR5cGUsIHJiUGFyYW1UeXBlLCBwYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYXJhbSA9IFFuaWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb252ZXJ0IHRoZSBuYXRpdmUgdmFsdWUgaW50byBhIGN1c3RvbSBydWJ5IHZhbHVlICovCisgICAgICAgIGlmICh1bmxpa2VseShjYkluZm8tPnBhcmFtZXRlclR5cGVzW2ldLT5uYXRpdmVUeXBlID09IE5BVElWRV9NQVBQRUQpKSB7CisgICAgICAgICAgICBWQUxVRSB2YWx1ZXNbXSA9IHsgcGFyYW0sIFFuaWwgfTsKKyAgICAgICAgICAgIHBhcmFtID0gcmJfZnVuY2FsbDIoKChNYXBwZWRUeXBlICopIGNiSW5mby0+cGFyYW1ldGVyVHlwZXNbaV0pLT5yYkNvbnZlcnRlciwgaWRfZnJvbV9uYXRpdmUsIDIsIHZhbHVlcyk7CisgICAgICAgIH0KKworICAgICAgICByYlBhcmFtc1tpXSA9IHBhcmFtOworICAgIH0KKworICAgIHJiUmV0dXJuVmFsdWUgPSByYl9mdW5jYWxsMihmbi0+cmJQcm9jLCBpZF9jYWxsLCBjYkluZm8tPnBhcmFtZXRlckNvdW50LCByYlBhcmFtcyk7CisKKyAgICBpZiAodW5saWtlbHkocmV0dXJuVHlwZS0+bmF0aXZlVHlwZSA9PSBOQVRJVkVfTUFQUEVEKSkgeworICAgICAgICBWQUxVRSB2YWx1ZXNbXSA9IHsgcmJSZXR1cm5WYWx1ZSwgUW5pbCB9OworICAgICAgICByYlJldHVyblZhbHVlID0gcmJfZnVuY2FsbDIoKChNYXBwZWRUeXBlICopIHJldHVyblR5cGUpLT5yYkNvbnZlcnRlciwgaWRfdG9fbmF0aXZlLCAyLCB2YWx1ZXMpOworICAgICAgICByYlJldHVyblR5cGUgPSAoKE1hcHBlZFR5cGUgKikgcmV0dXJuVHlwZSktPnJiVHlwZTsKKyAgICAgICAgcmV0dXJuVHlwZSA9ICgoTWFwcGVkVHlwZSogKSByZXR1cm5UeXBlKS0+dHlwZTsKKyAgICB9CisKKyAgICBpZiAocmJSZXR1cm5WYWx1ZSA9PSBRbmlsIHx8IFRZUEUocmJSZXR1cm5WYWx1ZSkgPT0gVF9OSUwpIHsKKyAgICAgICAgbWVtc2V0KHJldHZhbCwgMCwgcmV0dXJuVHlwZS0+ZmZpVHlwZS0+c2l6ZSk7CisgICAgfSBlbHNlIHN3aXRjaCAocmV0dXJuVHlwZS0+bmF0aXZlVHlwZSkgeworICAgICAgICBjYXNlIE5BVElWRV9JTlQ4OgorICAgICAgICBjYXNlIE5BVElWRV9JTlQxNjoKKyAgICAgICAgY2FzZSBOQVRJVkVfSU5UMzI6CisgICAgICAgICAgICAqKChmZmlfc2FyZyAqKSByZXR2YWwpID0gTlVNMklOVChyYlJldHVyblZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BVElWRV9VSU5UODoKKyAgICAgICAgY2FzZSBOQVRJVkVfVUlOVDE2OgorICAgICAgICBjYXNlIE5BVElWRV9VSU5UMzI6CisgICAgICAgICAgICAqKChmZmlfYXJnICopIHJldHZhbCkgPSBOVU0yVUlOVChyYlJldHVyblZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BVElWRV9JTlQ2NDoKKyAgICAgICAgICAgICooKGludDY0X3QgKikgcmV0dmFsKSA9IE5VTTJMTChyYlJldHVyblZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BVElWRV9VSU5UNjQ6CisgICAgICAgICAgICAqKCh1aW50NjRfdCAqKSByZXR2YWwpID0gTlVNMlVMTChyYlJldHVyblZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5BVElWRV9MT05HOgorICAgICAgICAgICAgKigoZmZpX3NhcmcgKikgcmV0dmFsKSA9IE5VTTJMT05HKHJiUmV0dXJuVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkFUSVZFX1VMT05HOgorICAgICAgICAgICAgKigoZmZpX2FyZyAqKSByZXR2YWwpID0gTlVNMlVMT05HKHJiUmV0dXJuVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkFUSVZFX0ZMT0FUMzI6CisgICAgICAgICAgICAqKChmbG9hdCAqKSByZXR2YWwpID0gKGZsb2F0KSBOVU0yREJMKHJiUmV0dXJuVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkFUSVZFX0ZMT0FUNjQ6CisgICAgICAgICAgICAqKChkb3VibGUgKikgcmV0dmFsKSA9IE5VTTJEQkwocmJSZXR1cm5WYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQVRJVkVfUE9JTlRFUjoKKyAgICAgICAgICAgIGlmIChUWVBFKHJiUmV0dXJuVmFsdWUpID09IFRfREFUQSAmJiByYl9vYmpfaXNfa2luZF9vZihyYlJldHVyblZhbHVlLCByYmZmaV9Qb2ludGVyQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgKigodm9pZCAqKikgcmV0dmFsKSA9ICgoQWJzdHJhY3RNZW1vcnkgKikgREFUQV9QVFIocmJSZXR1cm5WYWx1ZSkpLT5hZGRyZXNzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHRvIHJldHVybmluZyBOVUxMIGlmIG5vdCBhIHZhbHVlIHBvaW50ZXIgb2JqZWN0LiAgaGFuZGxlcyBuaWwgY2FzZSBhcyB3ZWxsICovCisgICAgICAgICAgICAgICAgKigodm9pZCAqKikgcmV0dmFsKSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE5BVElWRV9CT09MOgorICAgICAgICAgICAgKigoZmZpX2FyZyAqKSByZXR2YWwpID0gcmJSZXR1cm5WYWx1ZSA9PSBRdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTkFUSVZFX0ZVTkNUSU9OOgorICAgICAgICBjYXNlIE5BVElWRV9DQUxMQkFDSzoKKyAgICAgICAgICAgIGlmIChUWVBFKHJiUmV0dXJuVmFsdWUpID09IFRfREFUQSAmJiByYl9vYmpfaXNfa2luZF9vZihyYlJldHVyblZhbHVlLCByYmZmaV9Qb2ludGVyQ2xhc3MpKSB7CisKKyAgICAgICAgICAgICAgICAqKCh2b2lkICoqKSByZXR2YWwpID0gKChBYnN0cmFjdE1lbW9yeSAqKSBEQVRBX1BUUihyYlJldHVyblZhbHVlKSktPmFkZHJlc3M7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmJfb2JqX2lzX2tpbmRfb2YocmJSZXR1cm5WYWx1ZSwgcmJfY1Byb2MpIHx8IHJiX3Jlc3BvbmRfdG8ocmJSZXR1cm5WYWx1ZSwgaWRfY2FsbCkpIHsKKyAgICAgICAgICAgICAgICBWQUxVRSBmdW5jdGlvbjsKKworICAgICAgICAgICAgICAgIGZ1bmN0aW9uID0gcmJmZmlfRnVuY3Rpb25fRm9yUHJvYyhyYlJldHVyblR5cGUsIHJiUmV0dXJuVmFsdWUpOworCisgICAgICAgICAgICAgICAgKigodm9pZCAqKikgcmV0dmFsKSA9ICgoQWJzdHJhY3RNZW1vcnkgKikgREFUQV9QVFIoZnVuY3Rpb24pKS0+YWRkcmVzczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKigodm9pZCAqKikgcmV0dmFsKSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE5BVElWRV9TVFJVQ1Q6CisgICAgICAgICAgICBpZiAoVFlQRShyYlJldHVyblZhbHVlKSA9PSBUX0RBVEEgJiYgcmJfb2JqX2lzX2tpbmRfb2YocmJSZXR1cm5WYWx1ZSwgcmJmZmlfU3RydWN0Q2xhc3MpKSB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RNZW1vcnkqIG1lbW9yeSA9ICgoU3RydWN0ICopIERBVEFfUFRSKHJiUmV0dXJuVmFsdWUpKS0+cG9pbnRlcjsKKworICAgICAgICAgICAgICAgIGlmIChtZW1vcnktPmFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocmV0dmFsLCBtZW1vcnktPmFkZHJlc3MsIHJldHVyblR5cGUtPmZmaVR5cGUtPnNpemUpOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHJldHZhbCwgMCwgcmV0dXJuVHlwZS0+ZmZpVHlwZS0+c2l6ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbXNldChyZXR2YWwsIDAsIHJldHVyblR5cGUtPmZmaVR5cGUtPnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICooKGZmaV9hcmcgKikgcmV0dmFsKSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gUW5pbDsKK30KKworc3RhdGljIFZBTFVFCitzYXZlX2NhbGxiYWNrX2V4Y2VwdGlvbih2b2lkKiBkYXRhLCBWQUxVRSBleGMpCit7CisgICAgc3RydWN0IGd2bF9jYWxsYmFjayogY2IgPSAoc3RydWN0IGd2bF9jYWxsYmFjayAqKSBkYXRhOworCisgICAgbWVtc2V0KGNiLT5yZXR2YWwsIDAsICgoRnVuY3Rpb24gKikgY2ItPmNsb3N1cmUtPmluZm8pLT5pbmZvLT5yZXR1cm5UeXBlLT5mZmlUeXBlLT5zaXplKTsKKyAgICBpZiAoY2ItPmZyYW1lICE9IE5VTEwpIGNiLT5mcmFtZS0+ZXhjID0gZXhjOworCisgICAgcmV0dXJuIFFuaWw7Cit9CisKK3N0YXRpYyBib29sCitjYWxsYmFja19wcmVwKHZvaWQqIGN0eCwgdm9pZCogY29kZSwgQ2xvc3VyZSogY2xvc3VyZSwgY2hhciogZXJybXNnLCBzaXplX3QgZXJybXNnc2l6ZSkKK3sKKyAgICBGdW5jdGlvblR5cGUqIGZuSW5mbyA9IChGdW5jdGlvblR5cGUgKikgY3R4OworICAgIGZmaV9zdGF0dXMgZmZpU3RhdHVzOworCisgICAgZmZpU3RhdHVzID0gZmZpX3ByZXBfY2xvc3VyZShjb2RlLCAmZm5JbmZvLT5mZmlfY2lmLCBjYWxsYmFja19pbnZva2UsIGNsb3N1cmUpOworICAgIGlmIChmZmlTdGF0dXMgIT0gRkZJX09LKSB7CisgICAgICAgIHNucHJpbnRmKGVycm1zZywgZXJybXNnc2l6ZSwgImZmaV9wcmVwX2Nsb3N1cmUgZmFpbGVkLiAgc3RhdHVzPSUjeCIsIGZmaVN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZAorcmJmZmlfRnVuY3Rpb25fSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgcmJmZmlfRnVuY3Rpb25JbmZvX0luaXQobW9kdWxlRkZJKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OkZ1bmN0aW9uIDwgRkZJOjpQb2ludGVyCisgICAgICovCisgICAgcmJmZmlfRnVuY3Rpb25DbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtb2R1bGVGRkksICJGdW5jdGlvbiIsIHJiZmZpX1BvaW50ZXJDbGFzcyk7CisKKyAgICByYl9nbG9iYWxfdmFyaWFibGUoJnJiZmZpX0Z1bmN0aW9uQ2xhc3MpOworICAgIHJiX2RlZmluZV9hbGxvY19mdW5jKHJiZmZpX0Z1bmN0aW9uQ2xhc3MsIGZ1bmN0aW9uX2FsbG9jYXRlKTsKKworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfRnVuY3Rpb25DbGFzcywgImluaXRpYWxpemUiLCBmdW5jdGlvbl9pbml0aWFsaXplLCAtMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9GdW5jdGlvbkNsYXNzLCAiaW5pdGlhbGl6ZV9jb3B5IiwgZnVuY3Rpb25faW5pdGlhbGl6ZV9jb3B5LCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX0Z1bmN0aW9uQ2xhc3MsICJjYWxsIiwgZnVuY3Rpb25fY2FsbCwgLTEpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfRnVuY3Rpb25DbGFzcywgImF0dGFjaCIsIGZ1bmN0aW9uX2F0dGFjaCwgMik7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9GdW5jdGlvbkNsYXNzLCAiZnJlZSIsIGZ1bmN0aW9uX3JlbGVhc2UsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfRnVuY3Rpb25DbGFzcywgImF1dG9yZWxlYXNlPSIsIGZ1bmN0aW9uX3NldF9hdXRvcmVsZWFzZSwgMSk7CisgICAgLyoKKyAgICAgKiBjYWxsLXNlcTogYXV0b3JlbGVhc2UKKyAgICAgKiBAcmV0dXJuIFtCb29sZWFuXQorICAgICAqIEdldCArYXV0b3JlbGVhc2UrIGF0dHJpYnV0ZS4KKyAgICAgKiBTeW5vbnltb3VzIGZvciB7I2F1dG9yZWxlYXNlP30uCisgICAgICovCisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9GdW5jdGlvbkNsYXNzLCAiYXV0b3JlbGVhc2UiLCBmdW5jdGlvbl9hdXRvcmVsZWFzZV9wLCAwKTsKKyAgICAvKgorICAgICAqIGNhbGwtc2VxOiBhdXRvcmVsZWFzZT8KKyAgICAgKiBAcmV0dXJuIFtCb29sZWFuXSArYXV0b3JlbGVhc2UrIGF0dHJpYnV0ZQorICAgICAqIEdldCArYXV0b3JlbGVhc2UrIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX0Z1bmN0aW9uQ2xhc3MsICJhdXRvcmVsZWFzZT8iLCBmdW5jdGlvbl9hdXRvcmVsZWFzZV9wLCAwKTsKKworICAgIGlkX2NhbGwgPSByYl9pbnRlcm4oImNhbGwiKTsKKyAgICBpZF9jYnRhYmxlID0gcmJfaW50ZXJuKCJAX19mZmlfY2FsbGJhY2tfdGFibGVfXyIpOworICAgIGlkX2NiX3JlZiA9IHJiX2ludGVybigiQF9fZmZpX2NhbGxiYWNrX18iKTsKKyAgICBpZF90b19uYXRpdmUgPSByYl9pbnRlcm4oInRvX25hdGl2ZSIpOworICAgIGlkX2Zyb21fbmF0aXZlID0gcmJfaW50ZXJuKCJmcm9tX25hdGl2ZSIpOworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmFzeW5jX2NiX2xvY2spOworICAgIGFzeW5jX2NiX2NvbmQgPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9GdW5jdGlvbi5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTJhYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRnVuY3Rpb24uaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJCRkZJX0ZVTkNUSU9OX0gKKyNkZWZpbmUJUkJGRklfRlVOQ1RJT05fSAorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxmZmkuaD4KKwordHlwZWRlZiBzdHJ1Y3QgRnVuY3Rpb25UeXBlXyBGdW5jdGlvblR5cGU7CisKKyNpbmNsdWRlICJUeXBlLmgiCisjaW5jbHVkZSAiQ2FsbC5oIgorI2luY2x1ZGUgIkNsb3N1cmVQb29sLmgiCisKK3N0cnVjdCBGdW5jdGlvblR5cGVfIHsKKyAgICBUeXBlIHR5cGU7IC8qIFRoZSBuYXRpdmUgdHlwZSBvZiBhIEZ1bmN0aW9uSW5mbyBvYmplY3QgKi8KKyAgICBWQUxVRSByYlJldHVyblR5cGU7CisgICAgVkFMVUUgcmJQYXJhbWV0ZXJUeXBlczsKKworICAgIFR5cGUqIHJldHVyblR5cGU7CisgICAgVHlwZSoqIHBhcmFtZXRlclR5cGVzOworICAgIE5hdGl2ZVR5cGUqIG5hdGl2ZVBhcmFtZXRlclR5cGVzOworICAgIGZmaV90eXBlKiBmZmlSZXR1cm5UeXBlOworICAgIGZmaV90eXBlKiogZmZpUGFyYW1ldGVyVHlwZXM7CisgICAgZmZpX2NpZiBmZmlfY2lmOworICAgIEludm9rZXIgaW52b2tlOworICAgIENsb3N1cmVQb29sKiBjbG9zdXJlUG9vbDsKKyAgICBpbnQgcGFyYW1ldGVyQ291bnQ7CisgICAgaW50IGZsYWdzOworICAgIGZmaV9hYmkgYWJpOworICAgIGludCBjYWxsYmFja0NvdW50OworICAgIFZBTFVFKiBjYWxsYmFja1BhcmFtZXRlcnM7CisgICAgVkFMVUUgcmJFbnVtczsKKyAgICBib29sIGlnbm9yZUVycm5vOworICAgIGJvb2wgYmxvY2tpbmc7CisgICAgYm9vbCBoYXNTdHJ1Y3Q7Cit9OworCitleHRlcm4gVkFMVUUgcmJmZmlfRnVuY3Rpb25UeXBlQ2xhc3MsIHJiZmZpX0Z1bmN0aW9uQ2xhc3M7CisKK3ZvaWQgcmJmZmlfRnVuY3Rpb25fSW5pdChWQUxVRSBtb2R1bGVGRkkpOworVkFMVUUgcmJmZmlfRnVuY3Rpb25fTmV3SW5zdGFuY2UoVkFMVUUgZnVuY3Rpb25JbmZvLCBWQUxVRSBwcm9jKTsKK1ZBTFVFIHJiZmZpX0Z1bmN0aW9uX0ZvclByb2MoVkFMVUUgY2JJbmZvLCBWQUxVRSBwcm9jKTsKK3ZvaWQgcmJmZmlfRnVuY3Rpb25JbmZvX0luaXQoVkFMVUUgbW9kdWxlRkZJKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIFJCRkZJX0ZVTkNUSU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRnVuY3Rpb24ubyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Z1bmN0aW9uLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjYWU4NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Z1bmN0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRnVuY3Rpb25JbmZvLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9GdW5jdGlvbkluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg1Yzg3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRnVuY3Rpb25JbmZvLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIFdheW5lIE1laXNzbmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQW5kcmVhIEZhenppIDxhbmRyZWEuZmF6emlAYWxjYWNvb3AuaXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTVNDX1ZFUgorIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGluY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbHNlCisjIGluY2x1ZGUgIndpbjMyL3N0ZGJvb2wuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxydWJ5Lmg+CisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlICJyYmZmaS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCisjaW5jbHVkZSAiQWJzdHJhY3RNZW1vcnkuaCIKKyNpbmNsdWRlICJUeXBlcy5oIgorI2luY2x1ZGUgIlR5cGUuaCIKKyNpbmNsdWRlICJTdHJ1Y3RCeVZhbHVlLmgiCisjaW5jbHVkZSAiRnVuY3Rpb24uaCIKKworc3RhdGljIFZBTFVFIGZudHlwZV9hbGxvY2F0ZShWQUxVRSBrbGFzcyk7CitzdGF0aWMgVkFMVUUgZm50eXBlX2luaXRpYWxpemUoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKTsKK3N0YXRpYyB2b2lkIGZudHlwZV9tYXJrKEZ1bmN0aW9uVHlwZSopOworc3RhdGljIHZvaWQgZm50eXBlX2ZyZWUoRnVuY3Rpb25UeXBlICopOworCitWQUxVRSByYmZmaV9GdW5jdGlvblR5cGVDbGFzcyA9IFFuaWw7CisKK3N0YXRpYyBWQUxVRQorZm50eXBlX2FsbG9jYXRlKFZBTFVFIGtsYXNzKQoreworICAgIEZ1bmN0aW9uVHlwZSogZm5JbmZvOworICAgIFZBTFVFIG9iaiA9IERhdGFfTWFrZV9TdHJ1Y3Qoa2xhc3MsIEZ1bmN0aW9uVHlwZSwgZm50eXBlX21hcmssIGZudHlwZV9mcmVlLCBmbkluZm8pOworCisgICAgZm5JbmZvLT50eXBlLmZmaVR5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgICBmbkluZm8tPnR5cGUubmF0aXZlVHlwZSA9IE5BVElWRV9GVU5DVElPTjsKKyAgICBmbkluZm8tPnJiUmV0dXJuVHlwZSA9IFFuaWw7CisgICAgZm5JbmZvLT5yYlBhcmFtZXRlclR5cGVzID0gUW5pbDsKKyAgICBmbkluZm8tPnJiRW51bXMgPSBRbmlsOworICAgIGZuSW5mby0+aW52b2tlID0gcmJmZmlfQ2FsbEZ1bmN0aW9uOworICAgIGZuSW5mby0+Y2xvc3VyZVBvb2wgPSBOVUxMOworCisgICAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQKK2ZudHlwZV9tYXJrKEZ1bmN0aW9uVHlwZSogZm5JbmZvKQoreworICAgIHJiX2djX21hcmsoZm5JbmZvLT5yYlJldHVyblR5cGUpOworICAgIHJiX2djX21hcmsoZm5JbmZvLT5yYlBhcmFtZXRlclR5cGVzKTsKKyAgICByYl9nY19tYXJrKGZuSW5mby0+cmJFbnVtcyk7CisgICAgaWYgKGZuSW5mby0+Y2FsbGJhY2tDb3VudCA+IDAgJiYgZm5JbmZvLT5jYWxsYmFja1BhcmFtZXRlcnMgIT0gTlVMTCkgeworICAgICAgICByYl9nY19tYXJrX2xvY2F0aW9ucygmZm5JbmZvLT5jYWxsYmFja1BhcmFtZXRlcnNbMF0sICZmbkluZm8tPmNhbGxiYWNrUGFyYW1ldGVyc1tmbkluZm8tPmNhbGxiYWNrQ291bnRdKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitmbnR5cGVfZnJlZShGdW5jdGlvblR5cGUqIGZuSW5mbykKK3sKKyAgICB4ZnJlZShmbkluZm8tPnBhcmFtZXRlclR5cGVzKTsKKyAgICB4ZnJlZShmbkluZm8tPmZmaVBhcmFtZXRlclR5cGVzKTsKKyAgICB4ZnJlZShmbkluZm8tPm5hdGl2ZVBhcmFtZXRlclR5cGVzKTsKKyAgICB4ZnJlZShmbkluZm8tPmNhbGxiYWNrUGFyYW1ldGVycyk7CisgICAgaWYgKGZuSW5mby0+Y2xvc3VyZVBvb2wgIT0gTlVMTCkgeworICAgICAgICByYmZmaV9DbG9zdXJlUG9vbF9GcmVlKGZuSW5mby0+Y2xvc3VyZVBvb2wpOworICAgIH0KKyAgICB4ZnJlZShmbkluZm8pOworfQorCisvKgorICogY2FsbC1zZXE6IGluaXRpYWxpemUocmV0dXJuX3R5cGUsIHBhcmFtX3R5cGVzLCBvcHRpb25zPXt9KQorICogQHBhcmFtIFtUeXBlLCBTeW1ib2xdIHJldHVybl90eXBlIHJldHVybiB0eXBlIGZvciB0aGUgZnVuY3Rpb24KKyAqIEBwYXJhbSBbQXJyYXk8VHlwZSwgU3ltYm9sPl0gcGFyYW1fdHlwZXMgYXJyYXkgb2YgcGFyYW1ldGVycyB0eXBlcworICogQHBhcmFtIFtIYXNoXSBvcHRpb25zCisgKiBAb3B0aW9uIG9wdGlvbnMgW0Jvb2xlYW5dIDpibG9ja2luZyBzZXQgdG8gdHJ1ZSBpZiB0aGUgQyBmdW5jdGlvbiBpcyBhIGJsb2NraW5nIGNhbGwKKyAqIEBvcHRpb24gb3B0aW9ucyBbU3ltYm9sXSA6Y29udmVudGlvbiBjYWxsaW5nIGNvbnZlbnRpb24gc2VlIHtGRkk6OkxpYnJhcnkjY2FsbGluZ19jb252ZW50aW9ufQorICogQG9wdGlvbiBvcHRpb25zIFtGRkk6OkVudW1zXSA6ZW51bXMKKyAqIEByZXR1cm4gW3NlbGZdCisgKiBBIG5ldyBGdW5jdGlvblR5cGUgaW5zdGFuY2UuCisgKi8KK3N0YXRpYyBWQUxVRQorZm50eXBlX2luaXRpYWxpemUoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKQoreworICAgIEZ1bmN0aW9uVHlwZSAqZm5JbmZvOworICAgIGZmaV9zdGF0dXMgc3RhdHVzOworICAgIFZBTFVFIHJiUmV0dXJuVHlwZSA9IFFuaWwsIHJiUGFyYW1UeXBlcyA9IFFuaWwsIHJiT3B0aW9ucyA9IFFuaWw7CisgICAgVkFMVUUgcmJFbnVtcyA9IFFuaWwsIHJiQ29udmVudGlvbiA9IFFuaWwsIHJiQmxvY2tpbmcgPSBRbmlsOworI2lmIGRlZmluZWQoWDg2X1dJTjMyKQorICAgIFZBTFVFIHJiQ29udmVudGlvblN0cjsKKyNlbmRpZgorICAgIGludCBpLCBuYXJnczsKKworICAgIG5hcmdzID0gcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIyMSIsICZyYlJldHVyblR5cGUsICZyYlBhcmFtVHlwZXMsICZyYk9wdGlvbnMpOworICAgIGlmIChuYXJncyA+PSAzICYmIHJiT3B0aW9ucyAhPSBRbmlsKSB7CisgICAgICAgIHJiQ29udmVudGlvbiA9IHJiX2hhc2hfYXJlZihyYk9wdGlvbnMsIElEMlNZTShyYl9pbnRlcm4oImNvbnZlbnRpb24iKSkpOworICAgICAgICByYkVudW1zID0gcmJfaGFzaF9hcmVmKHJiT3B0aW9ucywgSUQyU1lNKHJiX2ludGVybigiZW51bXMiKSkpOworICAgICAgICByYkJsb2NraW5nID0gcmJfaGFzaF9hcmVmKHJiT3B0aW9ucywgSUQyU1lNKHJiX2ludGVybigiYmxvY2tpbmciKSkpOworICAgIH0KKworICAgIENoZWNrX1R5cGUocmJQYXJhbVR5cGVzLCBUX0FSUkFZKTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBGdW5jdGlvblR5cGUsIGZuSW5mbyk7CisgICAgZm5JbmZvLT5wYXJhbWV0ZXJDb3VudCA9IChpbnQpIFJBUlJBWV9MRU4ocmJQYXJhbVR5cGVzKTsKKyAgICBmbkluZm8tPnBhcmFtZXRlclR5cGVzID0geGNhbGxvYyhmbkluZm8tPnBhcmFtZXRlckNvdW50LCBzaXplb2YoKmZuSW5mby0+cGFyYW1ldGVyVHlwZXMpKTsKKyAgICBmbkluZm8tPmZmaVBhcmFtZXRlclR5cGVzID0geGNhbGxvYyhmbkluZm8tPnBhcmFtZXRlckNvdW50LCBzaXplb2YoZmZpX3R5cGUgKikpOworICAgIGZuSW5mby0+bmF0aXZlUGFyYW1ldGVyVHlwZXMgPSB4Y2FsbG9jKGZuSW5mby0+cGFyYW1ldGVyQ291bnQsIHNpemVvZigqZm5JbmZvLT5uYXRpdmVQYXJhbWV0ZXJUeXBlcykpOworICAgIGZuSW5mby0+cmJQYXJhbWV0ZXJUeXBlcyA9IHJiX2FyeV9uZXcyKGZuSW5mby0+cGFyYW1ldGVyQ291bnQpOworICAgIGZuSW5mby0+cmJFbnVtcyA9IHJiRW51bXM7CisgICAgZm5JbmZvLT5ibG9ja2luZyA9IFJURVNUKHJiQmxvY2tpbmcpOworICAgIGZuSW5mby0+aGFzU3RydWN0ID0gZmFsc2U7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZm5JbmZvLT5wYXJhbWV0ZXJDb3VudDsgKytpKSB7CisgICAgICAgIFZBTFVFIGVudHJ5ID0gcmJfYXJ5X2VudHJ5KHJiUGFyYW1UeXBlcywgaSk7CisgICAgICAgIFZBTFVFIHR5cGUgPSByYmZmaV9UeXBlX0xvb2t1cChlbnRyeSk7CisKKyAgICAgICAgaWYgKCFSVEVTVCh0eXBlKSkgeworICAgICAgICAgICAgVkFMVUUgdHlwZU5hbWUgPSByYl9mdW5jYWxsMihlbnRyeSwgcmJfaW50ZXJuKCJpbnNwZWN0IiksIDAsIE5VTEwpOworICAgICAgICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIkludmFsaWQgcGFyYW1ldGVyIHR5cGUgKCVzKSIsIFJTVFJJTkdfUFRSKHR5cGVOYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmJfb2JqX2lzX2tpbmRfb2YodHlwZSwgcmJmZmlfRnVuY3Rpb25UeXBlQ2xhc3MpKSB7CisgICAgICAgICAgICBSRUFMTE9DX04oZm5JbmZvLT5jYWxsYmFja1BhcmFtZXRlcnMsIFZBTFVFLCBmbkluZm8tPmNhbGxiYWNrQ291bnQgKyAxKTsKKyAgICAgICAgICAgIGZuSW5mby0+Y2FsbGJhY2tQYXJhbWV0ZXJzW2ZuSW5mby0+Y2FsbGJhY2tDb3VudCsrXSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmJfb2JqX2lzX2tpbmRfb2YodHlwZSwgcmJmZmlfU3RydWN0QnlWYWx1ZUNsYXNzKSkgeworICAgICAgICAgICAgZm5JbmZvLT5oYXNTdHJ1Y3QgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmJfYXJ5X3B1c2goZm5JbmZvLT5yYlBhcmFtZXRlclR5cGVzLCB0eXBlKTsKKyAgICAgICAgRGF0YV9HZXRfU3RydWN0KHR5cGUsIFR5cGUsIGZuSW5mby0+cGFyYW1ldGVyVHlwZXNbaV0pOworICAgICAgICBmbkluZm8tPmZmaVBhcmFtZXRlclR5cGVzW2ldID0gZm5JbmZvLT5wYXJhbWV0ZXJUeXBlc1tpXS0+ZmZpVHlwZTsKKyAgICAgICAgZm5JbmZvLT5uYXRpdmVQYXJhbWV0ZXJUeXBlc1tpXSA9IGZuSW5mby0+cGFyYW1ldGVyVHlwZXNbaV0tPm5hdGl2ZVR5cGU7CisgICAgfQorCisgICAgZm5JbmZvLT5yYlJldHVyblR5cGUgPSByYmZmaV9UeXBlX0xvb2t1cChyYlJldHVyblR5cGUpOworICAgIGlmICghUlRFU1QoZm5JbmZvLT5yYlJldHVyblR5cGUpKSB7CisgICAgICAgIFZBTFVFIHR5cGVOYW1lID0gcmJfZnVuY2FsbDIocmJSZXR1cm5UeXBlLCByYl9pbnRlcm4oImluc3BlY3QiKSwgMCwgTlVMTCk7CisgICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJJbnZhbGlkIHJldHVybiB0eXBlICglcykiLCBSU1RSSU5HX1BUUih0eXBlTmFtZSkpOworICAgIH0KKyAgICAKKyAgICBpZiAocmJfb2JqX2lzX2tpbmRfb2YoZm5JbmZvLT5yYlJldHVyblR5cGUsIHJiZmZpX1N0cnVjdEJ5VmFsdWVDbGFzcykpIHsKKyAgICAgICAgZm5JbmZvLT5oYXNTdHJ1Y3QgPSB0cnVlOworICAgIH0KKworICAgIERhdGFfR2V0X1N0cnVjdChmbkluZm8tPnJiUmV0dXJuVHlwZSwgVHlwZSwgZm5JbmZvLT5yZXR1cm5UeXBlKTsKKyAgICBmbkluZm8tPmZmaVJldHVyblR5cGUgPSBmbkluZm8tPnJldHVyblR5cGUtPmZmaVR5cGU7CisKKworI2lmIGRlZmluZWQoWDg2X1dJTjMyKQorICAgIHJiQ29udmVudGlvblN0ciA9IChyYkNvbnZlbnRpb24gIT0gUW5pbCkgPyByYl9mdW5jYWxsMihyYkNvbnZlbnRpb24sIHJiX2ludGVybigidG9fcyIpLCAwLCBOVUxMKSA6IFFuaWw7CisgICAgZm5JbmZvLT5hYmkgPSAocmJDb252ZW50aW9uU3RyICE9IFFuaWwgJiYgc3RyY21wKFN0cmluZ1ZhbHVlQ1N0cihyYkNvbnZlbnRpb25TdHIpLCAic3RkY2FsbCIpID09IDApCisgICAgICAgICAgICA/IEZGSV9TVERDQUxMIDogRkZJX0RFRkFVTFRfQUJJOworI2Vsc2UKKyAgICBmbkluZm8tPmFiaSA9IEZGSV9ERUZBVUxUX0FCSTsKKyNlbmRpZgorCisgICAgc3RhdHVzID0gZmZpX3ByZXBfY2lmKCZmbkluZm8tPmZmaV9jaWYsIGZuSW5mby0+YWJpLCBmbkluZm8tPnBhcmFtZXRlckNvdW50LAorICAgICAgICAgICAgZm5JbmZvLT5mZmlSZXR1cm5UeXBlLCBmbkluZm8tPmZmaVBhcmFtZXRlclR5cGVzKTsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIEZGSV9CQURfQUJJOgorICAgICAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiSW52YWxpZCBBQkkgc3BlY2lmaWVkIik7CisgICAgICAgIGNhc2UgRkZJX0JBRF9UWVBFREVGOgorICAgICAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiSW52YWxpZCBhcmd1bWVudCB0eXBlIHNwZWNpZmllZCIpOworICAgICAgICBjYXNlIEZGSV9PSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiVW5rbm93biBGRkkgZXJyb3IiKTsKKyAgICB9CisKKyAgICBmbkluZm8tPmludm9rZSA9IHJiZmZpX0dldEludm9rZXIoZm5JbmZvKTsKKworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogY2FsbC1zZXE6IHJlc3VsdF90eXBlCisgKiBAcmV0dXJuIFtUeXBlXQorICogR2V0IHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gdHlwZQorICovCitzdGF0aWMgVkFMVUUKK2ZudHlwZV9yZXN1bHRfdHlwZShWQUxVRSBzZWxmKQoreworICAgIEZ1bmN0aW9uVHlwZSogZnQ7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgRnVuY3Rpb25UeXBlLCBmdCk7CisKKyAgICByZXR1cm4gZnQtPnJiUmV0dXJuVHlwZTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBwYXJhbV90eXBlcworICogQHJldHVybiBbQXJyYXk8VHlwZT5dCisgKiBHZXQgcGFyYW1ldGVycyB0eXBlcy4KKyAqLworc3RhdGljIFZBTFVFCitmbnR5cGVfcGFyYW1fdHlwZXMoVkFMVUUgc2VsZikKK3sKKyAgICBGdW5jdGlvblR5cGUqIGZ0OworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEZ1bmN0aW9uVHlwZSwgZnQpOworCisgICAgcmV0dXJuIHJiX2FyeV9kdXAoZnQtPnJiUGFyYW1ldGVyVHlwZXMpOworfQorCit2b2lkCityYmZmaV9GdW5jdGlvbkluZm9fSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgVkFMVUUgZmZpX1R5cGU7CisKKyAgICBmZmlfVHlwZSA9IHJiZmZpX1R5cGVDbGFzczsKKworICAgIC8qCisgICAgICogRG9jdW1lbnQtY2xhc3M6IEZGSTo6RnVuY3Rpb25UeXBlIDwgRkZJOjpUeXBlCisgICAgICovCisgICAgcmJmZmlfRnVuY3Rpb25UeXBlQ2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIobW9kdWxlRkZJLCAiRnVuY3Rpb25UeXBlIixmZmlfVHlwZSk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9GdW5jdGlvblR5cGVDbGFzcyk7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jb25zdDogRkZJOjpDYWxsYmFja0luZm8gPSBGRkk6OkZ1bmN0aW9uVHlwZQorICAgICAqLworICAgIHJiX2RlZmluZV9jb25zdChtb2R1bGVGRkksICJDYWxsYmFja0luZm8iLCByYmZmaV9GdW5jdGlvblR5cGVDbGFzcyk7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jb25zdDogRkZJOjpGdW5jdGlvbkluZm8gPSBGRkk6OkZ1bmN0aW9uVHlwZQorICAgICAqLworICAgIHJiX2RlZmluZV9jb25zdChtb2R1bGVGRkksICJGdW5jdGlvbkluZm8iLCByYmZmaV9GdW5jdGlvblR5cGVDbGFzcyk7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jb25zdDogRkZJOjpUeXBlOjpGdW5jdGlvbiA9IEZGSTo6RnVuY3Rpb25UeXBlCisgICAgICovCisgICAgcmJfZGVmaW5lX2NvbnN0KGZmaV9UeXBlLCAiRnVuY3Rpb24iLCByYmZmaV9GdW5jdGlvblR5cGVDbGFzcyk7CisKKyAgICByYl9kZWZpbmVfYWxsb2NfZnVuYyhyYmZmaV9GdW5jdGlvblR5cGVDbGFzcywgZm50eXBlX2FsbG9jYXRlKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX0Z1bmN0aW9uVHlwZUNsYXNzLCAiaW5pdGlhbGl6ZSIsIGZudHlwZV9pbml0aWFsaXplLCAtMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9GdW5jdGlvblR5cGVDbGFzcywgInJlc3VsdF90eXBlIiwgZm50eXBlX3Jlc3VsdF90eXBlLCAwKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX0Z1bmN0aW9uVHlwZUNsYXNzLCAicGFyYW1fdHlwZXMiLCBmbnR5cGVfcGFyYW1fdHlwZXMsIDApOworCit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Z1bmN0aW9uSW5mby5vIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvRnVuY3Rpb25JbmZvLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0ZmMyZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0Z1bmN0aW9uSW5mby5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xhc3RFcnJvci5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvTGFzdEVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1YTQyZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xhc3RFcnJvci5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBXYXluZSBNZWlzc25lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFtYW4gR3VwdGEgPGFtYW5AdG1tMS5uZXQ+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfTVNDX1ZFUgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxydWJ5Lmg+CisKKyNpbmNsdWRlICJMYXN0RXJyb3IuaCIKKworI2lmIGRlZmluZWQoSEFWRV9OQVRJVkVUSFJFQUQpICYmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19XSU4zMl9fKQorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjIGRlZmluZSBVU0VfUFRIUkVBRF9MT0NBTAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIGludCB0ZF9lcnJubzsKK30gVGhyZWFkRGF0YTsKKworI2lmIGRlZmluZWQoVVNFX1BUSFJFQURfTE9DQUwpCitzdGF0aWMgcHRocmVhZF9rZXlfdCB0aHJlYWREYXRhS2V5OworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgVGhyZWFkRGF0YSogdGhyZWFkX2RhdGFfZ2V0KHZvaWQpOworCisjaWYgZGVmaW5lZChVU0VfUFRIUkVBRF9MT0NBTCkKKworc3RhdGljIFRocmVhZERhdGEqCit0aHJlYWRfZGF0YV9pbml0KHZvaWQpCit7CisgICAgVGhyZWFkRGF0YSogdGQgPSB4Y2FsbG9jKDEsIHNpemVvZihUaHJlYWREYXRhKSk7CisKKyAgICBwdGhyZWFkX3NldHNwZWNpZmljKHRocmVhZERhdGFLZXksIHRkKTsKKworICAgIHJldHVybiB0ZDsKK30KKworCitzdGF0aWMgaW5saW5lIFRocmVhZERhdGEqCit0aHJlYWRfZGF0YV9nZXQodm9pZCkKK3sKKyAgICBUaHJlYWREYXRhKiB0ZCA9IHB0aHJlYWRfZ2V0c3BlY2lmaWModGhyZWFkRGF0YUtleSk7CisgICAgcmV0dXJuIHRkICE9IE5VTEwgPyB0ZCA6IHRocmVhZF9kYXRhX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQKK3RocmVhZF9kYXRhX2ZyZWUodm9pZCAqcHRyKQoreworICAgIHhmcmVlKHB0cik7Cit9CisKKyNlbHNlCitzdGF0aWMgSUQgaWRfdGhyZWFkX2RhdGE7CisKK3N0YXRpYyBUaHJlYWREYXRhKgordGhyZWFkX2RhdGFfaW5pdCh2b2lkKQoreworICAgIFRocmVhZERhdGEqIHRkOworICAgIFZBTFVFIG9iajsKKworICAgIG9iaiA9IERhdGFfTWFrZV9TdHJ1Y3QocmJfY09iamVjdCwgVGhyZWFkRGF0YSwgTlVMTCwgLTEsIHRkKTsKKyAgICByYl90aHJlYWRfbG9jYWxfYXNldChyYl90aHJlYWRfY3VycmVudCgpLCBpZF90aHJlYWRfZGF0YSwgb2JqKTsKKworICAgIHJldHVybiB0ZDsKK30KKworc3RhdGljIGlubGluZSBUaHJlYWREYXRhKgordGhyZWFkX2RhdGFfZ2V0KCkKK3sKKyAgICBWQUxVRSBvYmogPSByYl90aHJlYWRfbG9jYWxfYXJlZihyYl90aHJlYWRfY3VycmVudCgpLCBpZF90aHJlYWRfZGF0YSk7CisKKyAgICBpZiAob2JqICE9IFFuaWwgJiYgVFlQRShvYmopID09IFRfREFUQSkgeworICAgICAgICByZXR1cm4gKFRocmVhZERhdGEgKikgREFUQV9QVFIob2JqKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhyZWFkX2RhdGFfaW5pdCgpOworfQorCisjZW5kaWYKKworCisvKgorICogY2FsbC1zZXE6IGVycm9yCisgKiBAcmV0dXJuIFtOdW1lcmljXQorICogR2V0ICtlcnJubysgdmFsdWUuCisgKi8KK3N0YXRpYyBWQUxVRQorZ2V0X2xhc3RfZXJyb3IoVkFMVUUgc2VsZikKK3sKKyAgICByZXR1cm4gSU5UMk5VTSh0aHJlYWRfZGF0YV9nZXQoKS0+dGRfZXJybm8pOworfQorCisKKy8qCisgKiBjYWxsLXNlcTogZXJyb3IoZXJyb3IpCisgKiBAcGFyYW0gW051bWVyaWNdIGVycm9yCisgKiBAcmV0dXJuIFtuaWxdCisgKiBTZXQgK2Vycm5vKyB2YWx1ZS4KKyAqLworc3RhdGljIFZBTFVFCitzZXRfbGFzdF9lcnJvcihWQUxVRSBzZWxmLCBWQUxVRSBlcnJvcikKK3sKKworI2lmZGVmIF9XSU4zMgorICAgIFNldExhc3RFcnJvcihOVU0ySU5UKGVycm9yKSk7CisjZWxzZQorICAgIGVycm5vID0gTlVNMklOVChlcnJvcik7CisjZW5kaWYKKworICAgIHJldHVybiBRbmlsOworfQorCisKK3ZvaWQKK3JiZmZpX3NhdmVfZXJybm8odm9pZCkKK3sKKyAgICBpbnQgZXJyb3IgPSAwOworCisjaWZkZWYgX1dJTjMyCisgICAgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyNlbHNlCisgICAgZXJyb3IgPSBlcnJubzsKKyNlbmRpZgorCisgICAgdGhyZWFkX2RhdGFfZ2V0KCktPnRkX2Vycm5vID0gZXJyb3I7Cit9CisKKwordm9pZAorcmJmZmlfTGFzdEVycm9yX0luaXQoVkFMVUUgbW9kdWxlRkZJKQoreworICAgIC8qCisgICAgICogRG9jdW1lbnQtbW9kdWxlOiBGRkk6Okxhc3RFcnJvcgorICAgICAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSBjb3VwbGUgb2YgbWV0aG9kIHRvIHNldCBhbmQgZ2V0ICtlcnJubysKKyAgICAgKiBmb3IgY3VycmVudCB0aHJlYWQuCisgICAgICovCisgICAgVkFMVUUgbW9kdWxlRXJyb3IgPSByYl9kZWZpbmVfbW9kdWxlX3VuZGVyKG1vZHVsZUZGSSwgIkxhc3RFcnJvciIpOworCisgICAgcmJfZGVmaW5lX21vZHVsZV9mdW5jdGlvbihtb2R1bGVFcnJvciwgImVycm9yIiwgZ2V0X2xhc3RfZXJyb3IsIDApOworICAgIHJiX2RlZmluZV9tb2R1bGVfZnVuY3Rpb24obW9kdWxlRXJyb3IsICJlcnJvcj0iLCBzZXRfbGFzdF9lcnJvciwgMSk7CisKKyNpZiBkZWZpbmVkKFVTRV9QVEhSRUFEX0xPQ0FMKQorICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmdGhyZWFkRGF0YUtleSwgdGhyZWFkX2RhdGFfZnJlZSk7CisjZWxzZQorICAgIGlkX3RocmVhZF9kYXRhID0gcmJfaW50ZXJuKCJmZmlfdGhyZWFkX2xvY2FsX2RhdGEiKTsKKyNlbmRpZiAvKiBVU0VfUFRIUkVBRF9MT0NBTCAqLworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9MYXN0RXJyb3IuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xhc3RFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMWRmYmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9MYXN0RXJyb3IuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJCRkZJX0xBU1RFUlJPUl9ICisjZGVmaW5lCVJCRkZJX0xBU1RFUlJPUl9ICisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCit2b2lkIHJiZmZpX0xhc3RFcnJvcl9Jbml0KFZBTFVFIG1vZHVsZUZGSSk7CisKK3ZvaWQgcmJmZmlfc2F2ZV9lcnJubyh2b2lkKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIFJCRkZJX0xBU1RFUlJPUl9IICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xhc3RFcnJvci5vIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvTGFzdEVycm9yLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3YzBmNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xhc3RFcnJvci5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xvbmdEb3VibGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xvbmdEb3VibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE4ODNhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvTG9uZ0RvdWJsZS5jCkBAIC0wLDAgKzEsNjMgQEAKKyNpbmNsdWRlICJMb25nRG91YmxlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaWYgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0lOVEVSSVgpCisjIGRlZmluZSBzdHJ0b2xkKHN0ciwgZW5kcHRyKSAgICAoKGxvbmcgZG91YmxlKSBzdHJ0b2QoKHN0ciksIChlbmRwdHIpKSkKKyNlbmRpZiAvKiBkZWZpbmVkIChfX0NZR1dJTl9fKSAqLworCitzdGF0aWMgVkFMVUUgcmJfY0JpZ0RlY2ltYWwgPSBRbmlsOworc3RhdGljIFZBTFVFIGJpZ2RlY2ltYWxfbG9hZChWQUxVRSB1bnVzZWQpOworc3RhdGljIFZBTFVFIGJpZ2RlY2ltYWxfZmFpbGVkKFZBTFVFIHZhbHVlKTsKKworVkFMVUUgCityYmZmaV9sb25nZG91YmxlX25ldyhsb25nIGRvdWJsZSBsZCkKK3sKKyAgICBpZiAoIVJURVNUKHJiX2NCaWdEZWNpbWFsKSkgeworICAgICAgICAvKiBhbGxvdyBmYWxsYmFjayBpZiB0aGUgYmlnZGVjaW1hbCBsaWJyYXJ5IGlzIHVuYXZhaWxhYmxlIGluIGZ1dHVyZSBydWJ5IHZlcnNpb25zICovCisgICAgICAgIHJiX2NCaWdEZWNpbWFsID0gcmJfcmVzY3VlKGJpZ2RlY2ltYWxfbG9hZCwgUW5pbCwgYmlnZGVjaW1hbF9mYWlsZWQsIHJiX2NPYmplY3QpOworICAgIH0KKworICAgIGlmIChSVEVTVChyYl9jQmlnRGVjaW1hbCkgJiYgcmJfY0JpZ0RlY2ltYWwgIT0gcmJfY09iamVjdCkgeworICAgICAgICBjaGFyIGJ1ZlsxMjhdOworICAgICAgICByZXR1cm4gcmJfZnVuY2FsbChyYl9jQmlnRGVjaW1hbCwgcmJfaW50ZXJuKCJuZXciKSwgMSwgcmJfc3RyX25ldyhidWYsIHNwcmludGYoYnVmLCAiJS4zNUxlIiwgbGQpKSk7CisgICAgfQorCisgICAgLyogRmFsbCB0aHJvdWdoIHRvIGhhbmRsaW5nIGFzIGEgZmxvYXQgKi8KKyAgICByZXR1cm4gcmJfZmxvYXRfbmV3KGxkKTsKK30KKworbG9uZyBkb3VibGUgCityYmZmaV9udW0ybG9uZ2RvdWJsZShWQUxVRSB2YWx1ZSkKK3sKKyAgICBpZiAoVFlQRSh2YWx1ZSkgPT0gVF9GTE9BVCkgeworICAgICAgICByZXR1cm4gcmJfbnVtMmRibCh2YWx1ZSk7CisgICAgfQorICAgIAorICAgIGlmICghUlRFU1QocmJfY0JpZ0RlY2ltYWwpICYmIHJiX2NvbnN0X2RlZmluZWQocmJfY09iamVjdCwgcmJfaW50ZXJuKCJCaWdEZWNpbWFsIikpKSB7CisgICAgICAgIHJiX2NCaWdEZWNpbWFsID0gcmJfY29uc3RfZ2V0KHJiX2NPYmplY3QsIHJiX2ludGVybigiQmlnRGVjaW1hbCIpKTsKKyAgICB9CisKKyAgICBpZiAoUlRFU1QocmJfY0JpZ0RlY2ltYWwpICYmIHJiX2NCaWdEZWNpbWFsICE9IHJiX2NPYmplY3QgJiYgUlRFU1QocmJfb2JqX2lzX2tpbmRfb2YodmFsdWUsIHJiX2NCaWdEZWNpbWFsKSkpIHsKKyAgICAgICAgVkFMVUUgcyA9IHJiX2Z1bmNhbGwodmFsdWUsIHJiX2ludGVybigidG9fcyIpLCAxLCByYl9zdHJfbmV3MigiRSIpKTsKKyAgICAgICAgcmV0dXJuIHN0cnRvbGQoUlNUUklOR19QVFIocyksIE5VTEwpOworICAgIH0KKworICAgIC8qIEZhbGwgdGhyb3VnaCB0byBoYW5kbGluZyBhcyBhIGZsb2F0ICovCisgICAgcmV0dXJuIHJiX251bTJkYmwodmFsdWUpOworfQorCisKK3N0YXRpYyBWQUxVRSAKK2JpZ2RlY2ltYWxfbG9hZChWQUxVRSB1bnVzZWQpCit7CisgICAgcmJfcmVxdWlyZSgiYmlnZGVjaW1hbCIpOworICAgIHJldHVybiByYl9jb25zdF9nZXQocmJfY09iamVjdCwgcmJfaW50ZXJuKCJCaWdEZWNpbWFsIikpOworfQorCitzdGF0aWMgVkFMVUUgCitiaWdkZWNpbWFsX2ZhaWxlZChWQUxVRSB2YWx1ZSkKK3sKKyAgICByZXR1cm4gdmFsdWU7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9Mb25nRG91YmxlLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9Mb25nRG91YmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1MmNjYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xvbmdEb3VibGUuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJCRkZJX0xPTkdET1VCTEVfSAorI2RlZmluZQlSQkZGSV9MT05HRE9VQkxFX0gKKworI2luY2x1ZGUgPHJ1YnkuaD4KKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgc3RydG9sZCBzdHJ0b2QKKyNlbmRpZgorCitleHRlcm4gVkFMVUUgcmJmZmlfbG9uZ2RvdWJsZV9uZXcobG9uZyBkb3VibGUgbGQpOworZXh0ZXJuIGxvbmcgZG91YmxlIHJiZmZpX251bTJsb25nZG91YmxlKFZBTFVFIHZhbHVlKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIFJCRkZJX0xPTkdET1VCTEVfSCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9Mb25nRG91YmxlLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9Mb25nRG91YmxlLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4MDliMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL0xvbmdEb3VibGUubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NYWtlZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMWQzODYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NYWtlZmlsZQpAQCAtMCwwICsxLDI2NCBAQAorCitTSEVMTCA9IC9iaW4vc2gKKworIyBWPTAgcXVpZXQsIFY9MSB2ZXJib3NlLiAgb3RoZXIgdmFsdWVzIGRvbid0IHdvcmsuCitWID0gMAorUTEgPSAkKFY6MT0pCitRID0gJChRMTowPUApCitFQ0hPMSA9ICQoVjoxPUAgOikKK0VDSE8gPSAkKEVDSE8xOjA9QCBlY2hvKQorTlVMTENNRCA9IDoKKworIyMjIyBTdGFydCBvZiBzeXN0ZW0gY29uZmlndXJhdGlvbiBzZWN0aW9uLiAjIyMjCisKK3NyY2RpciA9IC4KK3RvcGRpciA9IC91c3IvbG9jYWwvQ2VsbGFyL3J1YnkvMi40LjFfMS9pbmNsdWRlL3J1YnktMi40LjAKK2hkcmRpciA9ICQodG9wZGlyKQorYXJjaF9oZHJkaXIgPSAvdXNyL2xvY2FsL0NlbGxhci9ydWJ5LzIuNC4xXzEvaW5jbHVkZS9ydWJ5LTIuNC4wL3g4Nl82NC1kYXJ3aW4xNgorUEFUSF9TRVBBUkFUT1IgPSA6CitWUEFUSCA9ICQoc3JjZGlyKTokKGFyY2hfaGRyZGlyKS9ydWJ5OiQoaGRyZGlyKS9ydWJ5CitwcmVmaXggPSAkKERFU1RESVIpL3Vzci9sb2NhbC9DZWxsYXIvcnVieS8yLjQuMV8xCitydWJ5c2l0ZWFyY2hwcmVmaXggPSAkKHJ1YnlsaWJwcmVmaXgpLyQoc2l0ZWFyY2gpCitydWJ5YXJjaHByZWZpeCA9ICQocnVieWxpYnByZWZpeCkvJChhcmNoKQorcnVieWxpYnByZWZpeCA9ICQobGliZGlyKS8kKFJVQllfQkFTRV9OQU1FKQorZXhlY19wcmVmaXggPSAkKHByZWZpeCkKK3ZlbmRvcmFyY2hoZHJkaXIgPSAkKHZlbmRvcmhkcmRpcikvJChzaXRlYXJjaCkKK3NpdGVhcmNoaGRyZGlyID0gJChzaXRlaGRyZGlyKS8kKHNpdGVhcmNoKQorcnVieWFyY2hoZHJkaXIgPSAkKHJ1YnloZHJkaXIpLyQoYXJjaCkKK3ZlbmRvcmhkcmRpciA9ICQocnVieWhkcmRpcikvdmVuZG9yX3J1YnkKK3NpdGVoZHJkaXIgPSAkKHJ1YnloZHJkaXIpL3NpdGVfcnVieQorcnVieWhkcmRpciA9ICQoaW5jbHVkZWRpcikvJChSVUJZX1ZFUlNJT05fTkFNRSkKK3ZlbmRvcmFyY2hkaXIgPSAkKHZlbmRvcmxpYmRpcikvJChzaXRlYXJjaCkKK3ZlbmRvcmxpYmRpciA9ICQodmVuZG9yZGlyKS8kKHJ1YnlfdmVyc2lvbikKK3ZlbmRvcmRpciA9ICQoREVTVERJUikvdXNyL2xvY2FsL2xpYi9ydWJ5L3ZlbmRvcl9ydWJ5CitzaXRlYXJjaGRpciA9ICQoREVTVERJUikuLy5nZW0uMjAxNzA5MjEtMjI0NzYtdnlpd3lyCitzaXRlbGliZGlyID0gJChERVNURElSKS4vLmdlbS4yMDE3MDkyMS0yMjQ3Ni12eWl3eXIKK3NpdGVkaXIgPSAkKERFU1RESVIpL3Vzci9sb2NhbC9saWIvcnVieS9zaXRlX3J1YnkKK3J1YnlhcmNoZGlyID0gJChydWJ5bGliZGlyKS8kKGFyY2gpCitydWJ5bGliZGlyID0gJChydWJ5bGlicHJlZml4KS8kKHJ1YnlfdmVyc2lvbikKK3NpdGVhcmNoaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvJChzaXRlYXJjaCkKK2FyY2hpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS8kKGFyY2gpCitzaXRlYXJjaGxpYmRpciA9ICQobGliZGlyKS8kKHNpdGVhcmNoKQorYXJjaGxpYmRpciA9ICQobGliZGlyKS8kKGFyY2gpCityaWRpciA9ICQoZGF0YXJvb3RkaXIpLyQoUklfQkFTRV9OQU1FKQorbWFuZGlyID0gJChkYXRhcm9vdGRpcikvbWFuCitsb2NhbGVkaXIgPSAkKGRhdGFyb290ZGlyKS9sb2NhbGUKK2xpYmRpciA9ICQoZXhlY19wcmVmaXgpL2xpYgorcHNkaXIgPSAkKGRvY2RpcikKK3BkZmRpciA9ICQoZG9jZGlyKQorZHZpZGlyID0gJChkb2NkaXIpCitodG1sZGlyID0gJChkb2NkaXIpCitpbmZvZGlyID0gJChkYXRhcm9vdGRpcikvaW5mbworZG9jZGlyID0gJChkYXRhcm9vdGRpcikvZG9jLyQoUEFDS0FHRSkKK29sZGluY2x1ZGVkaXIgPSAkKFNES1JPT1QpL3Vzci9pbmNsdWRlCitpbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKK2xvY2Fsc3RhdGVkaXIgPSAkKHByZWZpeCkvdmFyCitzaGFyZWRzdGF0ZWRpciA9ICQocHJlZml4KS9jb20KK3N5c2NvbmZkaXIgPSAkKHByZWZpeCkvZXRjCitkYXRhZGlyID0gJChkYXRhcm9vdGRpcikKK2RhdGFyb290ZGlyID0gJChwcmVmaXgpL3NoYXJlCitsaWJleGVjZGlyID0gJChleGVjX3ByZWZpeCkvbGliZXhlYworc2JpbmRpciA9ICQoZXhlY19wcmVmaXgpL3NiaW4KK2JpbmRpciA9ICQoZXhlY19wcmVmaXgpL2JpbgorYXJjaGRpciA9ICQocnVieWFyY2hkaXIpCisKKworQ0MgPSBjbGFuZworQ1hYID0gY2xhbmcrKworTElCUlVCWSA9ICQoTElCUlVCWV9TTykKK0xJQlJVQllfQSA9IGxpYiQoUlVCWV9TT19OQU1FKS1zdGF0aWMuYQorTElCUlVCWUFSR19TSEFSRUQgPSAtbCQoUlVCWV9TT19OQU1FKQorTElCUlVCWUFSR19TVEFUSUMgPSAtbCQoUlVCWV9TT19OQU1FKS1zdGF0aWMgLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbgorZW1wdHkgPQorT1VURkxBRyA9IC1vICQoZW1wdHkpCitDT1VURkxBRyA9IC1vICQoZW1wdHkpCitDU1JDRkxBRyA9ICQoZW1wdHkpCisKK1JVQllfRVhUQ09ORl9IID0gZXh0Y29uZi5oCitjZmxhZ3MgICA9ICQob3B0ZmxhZ3MpICQoZGVidWdmbGFncykgJCh3YXJuZmxhZ3MpCitjeHhmbGFncyA9ICQob3B0ZmxhZ3MpICQoZGVidWdmbGFncykgJCh3YXJuZmxhZ3MpCitvcHRmbGFncyA9IC1PMyAtZm5vLWZhc3QtbWF0aAorZGVidWdmbGFncyA9IC1nZ2RiMword2FybmZsYWdzID0gCitDQ0RMRkxBR1MgPSAtZm5vLWNvbW1vbgorQ0ZMQUdTICAgPSAkKENDRExGTEFHUykgJChjZmxhZ3MpICAtZm5vLWNvbW1vbiAtcGlwZSAkKEFSQ0hfRkxBRykKK0lOQ0ZMQUdTID0gLUkuIC1JJChhcmNoX2hkcmRpcikgLUkkKGhkcmRpcikvcnVieS9iYWNrd2FyZCAtSSQoaGRyZGlyKSAtSSQoc3JjZGlyKSAtSS91c3IvaW5jbHVkZS9mZmkKK0RFRlMgICAgID0gCitDUFBGTEFHUyA9IC1EUlVCWV9FWFRDT05GX0g9XCIkKFJVQllfRVhUQ09ORl9IKVwiICAtSS91c3IvbG9jYWwvb3B0L2xpYnlhbWwvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L29wZW5zc2wvaW5jbHVkZSAtSS91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2luY2x1ZGUgLURfWE9QRU5fU09VUkNFIC1EX0RBUldJTl9DX1NPVVJDRSAtRF9EQVJXSU5fVU5MSU1JVEVEX1NFTEVDVCAtRF9SRUVOVFJBTlQgJChERUZTKSAkKGNwcGZsYWdzKQorQ1hYRkxBR1MgPSAkKENDRExGTEFHUykgJChjeHhmbGFncykgJChBUkNIX0ZMQUcpCitsZGZsYWdzICA9IC1MLiAtZnN0YWNrLXByb3RlY3RvciAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYgorZGxkZmxhZ3MgPSAtV2wsLXVuZGVmaW5lZCxkeW5hbWljX2xvb2t1cCAtV2wsLW11bHRpcGx5X2RlZmluZWQsc3VwcHJlc3MgLUwvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAtTC91c3IvbG9jYWwvb3B0L29wZW5zc2wvbGliIC1ML3Vzci9sb2NhbC9vcHQvcmVhZGxpbmUvbGliIAorQVJDSF9GTEFHID0gCitETERGTEFHUyA9ICQobGRmbGFncykgJChkbGRmbGFncykgJChBUkNIX0ZMQUcpCitMRFNIQVJFRCA9ICQoQ0MpIC1keW5hbWljIC1idW5kbGUKK0xEU0hBUkVEWFggPSAkKENYWCkgLWR5bmFtaWMgLWJ1bmRsZQorQVIgPSBhcgorRVhFRVhUID0gCisKK1JVQllfSU5TVEFMTF9OQU1FID0gJChSVUJZX0JBU0VfTkFNRSkKK1JVQllfU09fTkFNRSA9IHJ1YnkuMi40LjEKK1JVQllXX0lOU1RBTExfTkFNRSA9IAorUlVCWV9WRVJTSU9OX05BTUUgPSAkKFJVQllfQkFTRV9OQU1FKS0kKHJ1YnlfdmVyc2lvbikKK1JVQllXX0JBU0VfTkFNRSA9IHJ1Ynl3CitSVUJZX0JBU0VfTkFNRSA9IHJ1YnkKKworYXJjaCA9IHg4Nl82NC1kYXJ3aW4xNgorc2l0ZWFyY2ggPSAkKGFyY2gpCitydWJ5X3ZlcnNpb24gPSAyLjQuMAorcnVieSA9ICQoYmluZGlyKS8kKFJVQllfQkFTRV9OQU1FKQorUlVCWSA9ICQocnVieSkKK3J1YnlfaGVhZGVycyA9ICQoaGRyZGlyKS9ydWJ5LmggJChoZHJkaXIpL3J1YnkvYmFja3dhcmQuaCAkKGhkcmRpcikvcnVieS9ydWJ5LmggJChoZHJkaXIpL3J1YnkvZGVmaW5lcy5oICQoaGRyZGlyKS9ydWJ5L21pc3NpbmcuaCAkKGhkcmRpcikvcnVieS9pbnRlcm4uaCAkKGhkcmRpcikvcnVieS9zdC5oICQoaGRyZGlyKS9ydWJ5L3N1YnN0LmggJChhcmNoX2hkcmRpcikvcnVieS9jb25maWcuaCAkKFJVQllfRVhUQ09ORl9IKQorCitSTSA9IHJtIC1mCitSTV9SRiA9ICQoUlVCWSkgLXJ1biAtZSBybSAtLSAtcmYKK1JNRElSUyA9IHJtZGlyIC1wCitNQUtFRElSUyA9IG1rZGlyIC1wCitJTlNUQUxMID0gL3Vzci9iaW4vaW5zdGFsbCAtYworSU5TVEFMTF9QUk9HID0gJChJTlNUQUxMKSAtbSAwNzU1CitJTlNUQUxMX0RBVEEgPSAkKElOU1RBTEwpIC1tIDY0NAorQ09QWSA9IGNwCitUT1VDSCA9IGV4aXQgPgorCisjIyMjIEVuZCBvZiBzeXN0ZW0gY29uZmlndXJhdGlvbiBzZWN0aW9uLiAjIyMjCisKK3ByZWxvYWQgPSAKK2xpYnBhdGggPSAuICQobGliZGlyKSAvdXNyL2xvY2FsL29wdC9saWJ5YW1sL2xpYiAvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAvdXNyL2xvY2FsL29wdC9yZWFkbGluZS9saWIKK0xJQlBBVEggPSAgLUwuIC1MJChsaWJkaXIpIC1ML3Vzci9sb2NhbC9vcHQvbGlieWFtbC9saWIgLUwvdXNyL2xvY2FsL29wdC9vcGVuc3NsL2xpYiAtTC91c3IvbG9jYWwvb3B0L3JlYWRsaW5lL2xpYgorREVGRklMRSA9IAorCitDTEVBTkZJTEVTID0gbWttZi5sb2cKK0RJU1RDTEVBTkZJTEVTID0gCitESVNUQ0xFQU5ESVJTID0gCisKK2V4dG91dCA9IAorZXh0b3V0X3ByZWZpeCA9IAordGFyZ2V0X3ByZWZpeCA9IAorTE9DQUxfTElCUyA9IAorTElCUyA9ICQoTElCUlVCWUFSR19TSEFSRUQpIC1sZmZpICAtbHB0aHJlYWQgLWxkbCAtbG9iamMgCitPUklHX1NSQ1MgPSBBYnN0cmFjdE1lbW9yeS5jIEFycmF5VHlwZS5jIEJ1ZmZlci5jIENhbGwuYyBDbG9zdXJlUG9vbC5jIERhdGFDb252ZXJ0ZXIuYyBEeW5hbWljTGlicmFyeS5jIEZ1bmN0aW9uLmMgRnVuY3Rpb25JbmZvLmMgTGFzdEVycm9yLmMgTG9uZ0RvdWJsZS5jIE1hcHBlZFR5cGUuYyBNZW1vcnlQb2ludGVyLmMgTWV0aG9kSGFuZGxlLmMgUGxhdGZvcm0uYyBQb2ludGVyLmMgU3RydWN0LmMgU3RydWN0QnlSZWZlcmVuY2UuYyBTdHJ1Y3RCeVZhbHVlLmMgU3RydWN0TGF5b3V0LmMgVGhyZWFkLmMgVHlwZS5jIFR5cGVzLmMgVmFyaWFkaWMuYyBmZmkuYworU1JDUyA9ICQoT1JJR19TUkNTKSAKK09CSlMgPSBBYnN0cmFjdE1lbW9yeS5vIEFycmF5VHlwZS5vIEJ1ZmZlci5vIENhbGwubyBDbG9zdXJlUG9vbC5vIERhdGFDb252ZXJ0ZXIubyBEeW5hbWljTGlicmFyeS5vIEZ1bmN0aW9uLm8gRnVuY3Rpb25JbmZvLm8gTGFzdEVycm9yLm8gTG9uZ0RvdWJsZS5vIE1hcHBlZFR5cGUubyBNZW1vcnlQb2ludGVyLm8gTWV0aG9kSGFuZGxlLm8gUGxhdGZvcm0ubyBQb2ludGVyLm8gU3RydWN0Lm8gU3RydWN0QnlSZWZlcmVuY2UubyBTdHJ1Y3RCeVZhbHVlLm8gU3RydWN0TGF5b3V0Lm8gVGhyZWFkLm8gVHlwZS5vIFR5cGVzLm8gVmFyaWFkaWMubyBmZmkubworSERSUyA9ICQoc3JjZGlyKS9BYnN0cmFjdE1lbW9yeS5oICQoc3JjZGlyKS9BcnJheVR5cGUuaCAkKHNyY2RpcikvQ2FsbC5oICQoc3JjZGlyKS9DbG9zdXJlUG9vbC5oICQoc3JjZGlyKS9jb21wYXQuaCAkKHNyY2RpcikvRHluYW1pY0xpYnJhcnkuaCAkKHNyY2RpcikvZXh0Y29uZi5oICQoc3JjZGlyKS9GdW5jdGlvbi5oICQoc3JjZGlyKS9MYXN0RXJyb3IuaCAkKHNyY2RpcikvTG9uZ0RvdWJsZS5oICQoc3JjZGlyKS9NYXBwZWRUeXBlLmggJChzcmNkaXIpL01lbW9yeVBvaW50ZXIuaCAkKHNyY2RpcikvTWV0aG9kSGFuZGxlLmggJChzcmNkaXIpL1BsYXRmb3JtLmggJChzcmNkaXIpL1BvaW50ZXIuaCAkKHNyY2RpcikvcmJmZmkuaCAkKHNyY2RpcikvcmJmZmlfZW5kaWFuLmggJChzcmNkaXIpL1N0cnVjdC5oICQoc3JjZGlyKS9TdHJ1Y3RCeVJlZmVyZW5jZS5oICQoc3JjZGlyKS9TdHJ1Y3RCeVZhbHVlLmggJChzcmNkaXIpL1RocmVhZC5oICQoc3JjZGlyKS9UeXBlLmggJChzcmNkaXIpL1R5cGVzLmgKK0xPQ0FMX0hEUlMgPSAKK1RBUkdFVCA9IGZmaV9jCitUQVJHRVRfTkFNRSA9IGZmaV9jCitUQVJHRVRfRU5UUlkgPSBJbml0XyQoVEFSR0VUX05BTUUpCitETExJQiA9ICQoVEFSR0VUKS5idW5kbGUKK0VYVFNUQVRJQyA9IAorU1RBVElDX0xJQiA9IAorCitUSU1FU1RBTVBfRElSID0gLgorQklORElSICAgICAgICA9ICQoYmluZGlyKQorUlVCWUNPTU1PTkRJUiA9ICQoc2l0ZWRpcikkKHRhcmdldF9wcmVmaXgpCitSVUJZTElCRElSICAgID0gJChzaXRlbGliZGlyKSQodGFyZ2V0X3ByZWZpeCkKK1JVQllBUkNIRElSICAgPSAkKHNpdGVhcmNoZGlyKSQodGFyZ2V0X3ByZWZpeCkKK0hEUkRJUiAgICAgICAgPSAkKHJ1YnloZHJkaXIpL3J1YnkkKHRhcmdldF9wcmVmaXgpCitBUkNISERSRElSICAgID0gJChydWJ5aGRyZGlyKS8kKGFyY2gpL3J1YnkkKHRhcmdldF9wcmVmaXgpCitUQVJHRVRfU09fRElSID0KK1RBUkdFVF9TTyAgICAgPSAkKFRBUkdFVF9TT19ESVIpJChETExJQikKK0NMRUFOTElCUyAgICAgPSAkKFRBUkdFVF9TTykgCitDTEVBTk9CSlMgICAgID0gKi5vICAqLmJhaworCithbGw6ICAgICQoRExMSUIpCitzdGF0aWM6ICQoU1RBVElDX0xJQikgaW5zdGFsbC1yYgorLlBIT05ZOiBhbGwgaW5zdGFsbCBzdGF0aWMgaW5zdGFsbC1zbyBpbnN0YWxsLXJiCisuUEhPTlk6IGNsZWFuIGNsZWFuLXNvIGNsZWFuLXN0YXRpYyBjbGVhbi1yYgorCitjbGVhbi1zdGF0aWM6OgorY2xlYW4tcmItZGVmYXVsdDo6CitjbGVhbi1yYjo6CitjbGVhbi1zbzo6CitjbGVhbjogY2xlYW4tc28gY2xlYW4tc3RhdGljIGNsZWFuLXJiLWRlZmF1bHQgY2xlYW4tcmIKKwkJLSQoUSkkKFJNKSAkKENMRUFOTElCUykgJChDTEVBTk9CSlMpICQoQ0xFQU5GSUxFUykgLioudGltZQorCitkaXN0Y2xlYW4tcmItZGVmYXVsdDo6CitkaXN0Y2xlYW4tcmI6OgorZGlzdGNsZWFuLXNvOjoKK2Rpc3RjbGVhbi1zdGF0aWM6OgorZGlzdGNsZWFuOiBjbGVhbiBkaXN0Y2xlYW4tc28gZGlzdGNsZWFuLXN0YXRpYyBkaXN0Y2xlYW4tcmItZGVmYXVsdCBkaXN0Y2xlYW4tcmIKKwkJLSQoUSkkKFJNKSBNYWtlZmlsZSAkKFJVQllfRVhUQ09ORl9IKSBjb25mdGVzdC4qIG1rbWYubG9nCisJCS0kKFEpJChSTSkgY29yZSBydWJ5JChFWEVFWFQpICp+ICQoRElTVENMRUFORklMRVMpCisJCS0kKFEpJChSTURJUlMpICQoRElTVENMRUFORElSUykgMj4gL2Rldi9udWxsIHx8IHRydWUKKworcmVhbGNsZWFuOiBkaXN0Y2xlYW4KK2luc3RhbGw6IGluc3RhbGwtc28gaW5zdGFsbC1yYgorCitpbnN0YWxsLXNvOiAkKERMTElCKSAkKFRJTUVTVEFNUF9ESVIpLy5zaXRlYXJjaGRpci50aW1lCisJJChJTlNUQUxMX1BST0cpICQoRExMSUIpICQoUlVCWUFSQ0hESVIpCitjbGVhbi1zdGF0aWM6OgorCS0kKFEpJChSTSkgJChTVEFUSUNfTElCKQoraW5zdGFsbC1yYjogcHJlLWluc3RhbGwtcmIgZG8taW5zdGFsbC1yYiBpbnN0YWxsLXJiLWRlZmF1bHQKK2luc3RhbGwtcmItZGVmYXVsdDogcHJlLWluc3RhbGwtcmItZGVmYXVsdCBkby1pbnN0YWxsLXJiLWRlZmF1bHQKK3ByZS1pbnN0YWxsLXJiOiBNYWtlZmlsZQorcHJlLWluc3RhbGwtcmItZGVmYXVsdDogTWFrZWZpbGUKK2RvLWluc3RhbGwtcmI6Citkby1pbnN0YWxsLXJiLWRlZmF1bHQ6CitwcmUtaW5zdGFsbC1yYi1kZWZhdWx0OgorCUAkKE5VTExDTUQpCiskKFRJTUVTVEFNUF9ESVIpLy5zaXRlYXJjaGRpci50aW1lOgorCSQoUSkgJChNQUtFRElSUykgJChARCkgJChSVUJZQVJDSERJUikKKwkkKFEpICQoVE9VQ0gpICRACisKK3NpdGUtaW5zdGFsbDogc2l0ZS1pbnN0YWxsLXNvIHNpdGUtaW5zdGFsbC1yYgorc2l0ZS1pbnN0YWxsLXNvOiBpbnN0YWxsLXNvCitzaXRlLWluc3RhbGwtcmI6IGluc3RhbGwtcmIKKworLlNVRkZJWEVTOiAuYyAubSAuY2MgLm1tIC5jeHggLmNwcCAubyAuUworCisuY2MubzoKKwkkKEVDSE8pIGNvbXBpbGluZyAkKDwpCisJJChRKSAkKENYWCkgJChJTkNGTEFHUykgJChDUFBGTEFHUykgJChDWFhGTEFHUykgJChDT1VURkxBRykkQCAtYyAkKENTUkNGTEFHKSQ8CisKKy5jYy5TOgorCSQoRUNITykgdHJhbnNsYXRpbmcgJCg8KQorCSQoUSkgJChDWFgpICQoSU5DRkxBR1MpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpICQoQ09VVEZMQUcpJEAgLVMgJChDU1JDRkxBRykkPAorCisubW0ubzoKKwkkKEVDSE8pIGNvbXBpbGluZyAkKDwpCisJJChRKSAkKENYWCkgJChJTkNGTEFHUykgJChDUFBGTEFHUykgJChDWFhGTEFHUykgJChDT1VURkxBRykkQCAtYyAkKENTUkNGTEFHKSQ8CisKKy5tbS5TOgorCSQoRUNITykgdHJhbnNsYXRpbmcgJCg8KQorCSQoUSkgJChDWFgpICQoSU5DRkxBR1MpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpICQoQ09VVEZMQUcpJEAgLVMgJChDU1JDRkxBRykkPAorCisuY3h4Lm86CisJJChFQ0hPKSBjb21waWxpbmcgJCg8KQorCSQoUSkgJChDWFgpICQoSU5DRkxBR1MpICQoQ1BQRkxBR1MpICQoQ1hYRkxBR1MpICQoQ09VVEZMQUcpJEAgLWMgJChDU1JDRkxBRykkPAorCisuY3h4LlM6CisJJChFQ0hPKSB0cmFuc2xhdGluZyAkKDwpCisJJChRKSAkKENYWCkgJChJTkNGTEFHUykgJChDUFBGTEFHUykgJChDWFhGTEFHUykgJChDT1VURkxBRykkQCAtUyAkKENTUkNGTEFHKSQ8CisKKy5jcHAubzoKKwkkKEVDSE8pIGNvbXBpbGluZyAkKDwpCisJJChRKSAkKENYWCkgJChJTkNGTEFHUykgJChDUFBGTEFHUykgJChDWFhGTEFHUykgJChDT1VURkxBRykkQCAtYyAkKENTUkNGTEFHKSQ8CisKKy5jcHAuUzoKKwkkKEVDSE8pIHRyYW5zbGF0aW5nICQoPCkKKwkkKFEpICQoQ1hYKSAkKElOQ0ZMQUdTKSAkKENQUEZMQUdTKSAkKENYWEZMQUdTKSAkKENPVVRGTEFHKSRAIC1TICQoQ1NSQ0ZMQUcpJDwKKworLmMubzoKKwkkKEVDSE8pIGNvbXBpbGluZyAkKDwpCisJJChRKSAkKENDKSAkKElOQ0ZMQUdTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChDT1VURkxBRykkQCAtYyAkKENTUkNGTEFHKSQ8CisKKy5jLlM6CisJJChFQ0hPKSB0cmFuc2xhdGluZyAkKDwpCisJJChRKSAkKENDKSAkKElOQ0ZMQUdTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChDT1VURkxBRykkQCAtUyAkKENTUkNGTEFHKSQ8CisKKy5tLm86CisJJChFQ0hPKSBjb21waWxpbmcgJCg8KQorCSQoUSkgJChDQykgJChJTkNGTEFHUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoQ09VVEZMQUcpJEAgLWMgJChDU1JDRkxBRykkPAorCisubS5TOgorCSQoRUNITykgdHJhbnNsYXRpbmcgJCg8KQorCSQoUSkgJChDQykgJChJTkNGTEFHUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoQ09VVEZMQUcpJEAgLVMgJChDU1JDRkxBRykkPAorCiskKFRBUkdFVF9TTyk6ICQoT0JKUykgTWFrZWZpbGUKKwkkKEVDSE8pIGxpbmtpbmcgc2hhcmVkLW9iamVjdCAkKERMTElCKQorCS0kKFEpJChSTSkgJChAKQorCSQoUSkgJChMRFNIQVJFRCkgLW8gJEAgJChPQkpTKSAkKExJQlBBVEgpICQoRExERkxBR1MpICQoTE9DQUxfTElCUykgJChMSUJTKQorCSQoUSkgJChQT1NUTElOSykKKworCisKKyQoT0JKUyk6ICQoSERSUykgJChydWJ5X2hlYWRlcnMpCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NYXBwZWRUeXBlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NYXBwZWRUeXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhNDE4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01hcHBlZFR5cGUuYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgV2F5bmUgTWVpc3NuZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHJ1YnkuaD4KKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgInJiZmZpLmgiCisKKyNpbmNsdWRlICJUeXBlLmgiCisjaW5jbHVkZSAiTWFwcGVkVHlwZS5oIgorCisKK3N0YXRpYyBWQUxVRSBtYXBwZWRfYWxsb2NhdGUoVkFMVUUpOworc3RhdGljIFZBTFVFIG1hcHBlZF9pbml0aWFsaXplKFZBTFVFLCBWQUxVRSk7CitzdGF0aWMgdm9pZCBtYXBwZWRfbWFyayhNYXBwZWRUeXBlICopOworc3RhdGljIElEIGlkX25hdGl2ZV90eXBlLCBpZF90b19uYXRpdmUsIGlkX2Zyb21fbmF0aXZlOworCitWQUxVRSByYmZmaV9NYXBwZWRUeXBlQ2xhc3MgPSBRbmlsOworCitzdGF0aWMgVkFMVUUKK21hcHBlZF9hbGxvY2F0ZShWQUxVRSBrbGFzcykKK3sKKyAgICBNYXBwZWRUeXBlKiBtOworCisgICAgVkFMVUUgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgTWFwcGVkVHlwZSwgbWFwcGVkX21hcmssIC0xLCBtKTsKKworICAgIG0tPnJiQ29udmVydGVyID0gUW5pbDsKKyAgICBtLT5yYlR5cGUgPSBRbmlsOworICAgIG0tPnR5cGUgPSBOVUxMOworICAgIG0tPmJhc2UubmF0aXZlVHlwZSA9IE5BVElWRV9NQVBQRUQ7CisgICAgbS0+YmFzZS5mZmlUeXBlID0gJmZmaV90eXBlX3ZvaWQ7CisgICAgCisgICAgcmV0dXJuIG9iajsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBpbml0aWFsaXplKGNvbnZlcnRlcikKKyAqIEBwYXJhbSBbI25hdGl2ZV90eXBlLCAjdG9fbmF0aXZlLCAjZnJvbV9uYXRpdmVdIGNvbnZlcnRlciArY29udmVydGVyKyBtdXN0IHJlc3BvbmQgdG8KKyAqICBhbGwgdGhlc2UgbWV0aG9kcworICogQHJldHVybiBbc2VsZl0KKyAqLworc3RhdGljIFZBTFVFCittYXBwZWRfaW5pdGlhbGl6ZShWQUxVRSBzZWxmLCBWQUxVRSByYkNvbnZlcnRlcikKK3sKKyAgICBNYXBwZWRUeXBlKiBtID0gTlVMTDsKKyAgICAKKyAgICBpZiAoIXJiX3Jlc3BvbmRfdG8ocmJDb252ZXJ0ZXIsIGlkX25hdGl2ZV90eXBlKSkgeworICAgICAgICByYl9yYWlzZShyYl9lTm9NZXRob2RFcnJvciwgIm5hdGl2ZV90eXBlIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoIXJiX3Jlc3BvbmRfdG8ocmJDb252ZXJ0ZXIsIGlkX3RvX25hdGl2ZSkpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZU5vTWV0aG9kRXJyb3IsICJ0b19uYXRpdmUgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIGlmICghcmJfcmVzcG9uZF90byhyYkNvbnZlcnRlciwgaWRfZnJvbV9uYXRpdmUpKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VOb01ldGhvZEVycm9yLCAiZnJvbV9uYXRpdmUgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKyAgICAKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgTWFwcGVkVHlwZSwgbSk7CisgICAgbS0+cmJUeXBlID0gcmJfZnVuY2FsbDIocmJDb252ZXJ0ZXIsIGlkX25hdGl2ZV90eXBlLCAwLCBOVUxMKTsKKyAgICBpZiAoIShyYl9vYmpfaXNfa2luZF9vZihtLT5yYlR5cGUsIHJiZmZpX1R5cGVDbGFzcykpKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJuYXRpdmVfdHlwZSBkaWQgbm90IHJldHVybiBpbnN0YW5jZSBvZiBGRkk6OlR5cGUiKTsKKyAgICB9CisKKyAgICBtLT5yYkNvbnZlcnRlciA9IHJiQ29udmVydGVyOworICAgIERhdGFfR2V0X1N0cnVjdChtLT5yYlR5cGUsIFR5cGUsIG0tPnR5cGUpOworICAgIG0tPmJhc2UuZmZpVHlwZSA9IG0tPnR5cGUtPmZmaVR5cGU7CisgICAgCisgICAgcmV0dXJuIHNlbGY7Cit9CisKK3N0YXRpYyB2b2lkCittYXBwZWRfbWFyayhNYXBwZWRUeXBlKiBtKQoreworICAgIHJiX2djX21hcmsobS0+cmJUeXBlKTsKKyAgICByYl9nY19tYXJrKG0tPnJiQ29udmVydGVyKTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBtYXBwZWRfdHlwZS5uYXRpdmVfdHlwZQorICogQHJldHVybiBbVHlwZV0KKyAqIEdldCBuYXRpdmUgdHlwZSBvZiBtYXBwZWQgdHlwZS4KKyAqLworc3RhdGljIFZBTFVFCittYXBwZWRfbmF0aXZlX3R5cGUoVkFMVUUgc2VsZikKK3sKKyAgICBNYXBwZWRUeXBlKm0gPSBOVUxMOworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBNYXBwZWRUeXBlLCBtKTsKKworICAgIHJldHVybiBtLT5yYlR5cGU7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbWFwcGVkX3R5cGUudG9fbmF0aXZlKCphcmdzKQorICogQHBhcmFtIGFyZ3MgZGVwZW5kcyBvbiB7RkZJOjpEYXRhQ29udmVydGVyfSB1c2VkIHRvIGluaXRpYWxpemUgK3NlbGYrCisgKi8KK3N0YXRpYyBWQUxVRQorbWFwcGVkX3RvX25hdGl2ZShpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIHNlbGYpCit7CisgICAgTWFwcGVkVHlwZSptID0gTlVMTDsKKyAgICAKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgTWFwcGVkVHlwZSwgbSk7CisgICAgCisgICAgcmV0dXJuIHJiX2Z1bmNhbGwyKG0tPnJiQ29udmVydGVyLCBpZF90b19uYXRpdmUsIGFyZ2MsIGFyZ3YpOworfQorCisvKgorICogY2FsbC1zZXE6IG1hcHBlZF90eXBlLmZyb21fbmF0aXZlKCphcmdzKQorICogQHBhcmFtIGFyZ3MgZGVwZW5kcyBvbiB7RkZJOjpEYXRhQ29udmVydGVyfSB1c2VkIHRvIGluaXRpYWxpemUgK3NlbGYrCisgKi8KK3N0YXRpYyBWQUxVRQorbWFwcGVkX2Zyb21fbmF0aXZlKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZikKK3sKKyAgICBNYXBwZWRUeXBlKm0gPSBOVUxMOworICAgIAorICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBNYXBwZWRUeXBlLCBtKTsKKworICAgIHJldHVybiByYl9mdW5jYWxsMihtLT5yYkNvbnZlcnRlciwgaWRfZnJvbV9uYXRpdmUsIGFyZ2MsIGFyZ3YpOworfQorCit2b2lkCityYmZmaV9NYXBwZWRUeXBlX0luaXQoVkFMVUUgbW9kdWxlRkZJKQoreworICAgIC8qIAorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OlR5cGU6Ok1hcHBlZCA8IEZGSTo6VHlwZQorICAgICAqLworICAgIHJiZmZpX01hcHBlZFR5cGVDbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihyYmZmaV9UeXBlQ2xhc3MsICJNYXBwZWQiLCByYmZmaV9UeXBlQ2xhc3MpOworICAgIAorICAgIHJiX2dsb2JhbF92YXJpYWJsZSgmcmJmZmlfTWFwcGVkVHlwZUNsYXNzKTsKKworICAgIGlkX25hdGl2ZV90eXBlID0gcmJfaW50ZXJuKCJuYXRpdmVfdHlwZSIpOworICAgIGlkX3RvX25hdGl2ZSA9IHJiX2ludGVybigidG9fbmF0aXZlIik7CisgICAgaWRfZnJvbV9uYXRpdmUgPSByYl9pbnRlcm4oImZyb21fbmF0aXZlIik7CisKKyAgICByYl9kZWZpbmVfYWxsb2NfZnVuYyhyYmZmaV9NYXBwZWRUeXBlQ2xhc3MsIG1hcHBlZF9hbGxvY2F0ZSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9NYXBwZWRUeXBlQ2xhc3MsICJpbml0aWFsaXplIiwgbWFwcGVkX2luaXRpYWxpemUsIDEpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfTWFwcGVkVHlwZUNsYXNzLCAidHlwZSIsIG1hcHBlZF9uYXRpdmVfdHlwZSwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9NYXBwZWRUeXBlQ2xhc3MsICJuYXRpdmVfdHlwZSIsIG1hcHBlZF9uYXRpdmVfdHlwZSwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9NYXBwZWRUeXBlQ2xhc3MsICJ0b19uYXRpdmUiLCBtYXBwZWRfdG9fbmF0aXZlLCAtMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9NYXBwZWRUeXBlQ2xhc3MsICJmcm9tX25hdGl2ZSIsIG1hcHBlZF9mcm9tX25hdGl2ZSwgLTEpOworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NYXBwZWRUeXBlLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NYXBwZWRUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNmNjMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01hcHBlZFR5cGUuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJCRkZJX01BUFBFRFRZUEVfSAorI2RlZmluZQlSQkZGSV9NQVBQRURUWVBFX0gKKworCisjaW5jbHVkZSA8cnVieS5oPgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgTWFwcGVkVHlwZV8geworICAgIFR5cGUgYmFzZTsKKyAgICBUeXBlKiB0eXBlOworICAgIFZBTFVFIHJiQ29udmVydGVyOworICAgIFZBTFVFIHJiVHlwZTsKKyAgICAKK30gTWFwcGVkVHlwZTsKKwordm9pZCByYmZmaV9NYXBwZWRUeXBlX0luaXQoVkFMVUUgbW9kdWxlRkZJKTsKKworZXh0ZXJuIFZBTFVFIHJiZmZpX01hcHBlZFR5cGVDbGFzczsKKworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYJLyogUkJGRklfTUFQUEVEVFlQRV9IICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01hcHBlZFR5cGUubyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01hcHBlZFR5cGUubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTBmMzljCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvTWFwcGVkVHlwZS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01lbW9yeVBvaW50ZXIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01lbW9yeVBvaW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDkxYzM1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvTWVtb3J5UG9pbnRlci5jCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBXYXluZSBNZWlzc25lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IEx1YyBIZWlucmljaCA8bHVjQGhvbmstaG9uay5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbHNlCisjIGluY2x1ZGUgIndpbjMyL3N0ZGJvb2wuaCIKKyMgaW5jbHVkZSAid2luMzIvc3RkaW50LmgiCisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxydWJ5Lmg+CisjaW5jbHVkZSAicmJmZmkuaCIKKyNpbmNsdWRlICJBYnN0cmFjdE1lbW9yeS5oIgorI2luY2x1ZGUgIlBvaW50ZXIuaCIKKyNpbmNsdWRlICJNZW1vcnlQb2ludGVyLmgiCisKKworc3RhdGljIFZBTFVFIG1lbXB0cl9hbGxvY2F0ZShWQUxVRSBrbGFzcyk7CitzdGF0aWMgdm9pZCBtZW1wdHJfcmVsZWFzZShQb2ludGVyKiBwdHIpOworc3RhdGljIFZBTFVFIG1lbXB0cl9tYWxsb2MoVkFMVUUgc2VsZiwgbG9uZyBzaXplLCBsb25nIGNvdW50LCBib29sIGNsZWFyKTsKK3N0YXRpYyBWQUxVRSBtZW1wdHJfZnJlZShWQUxVRSBzZWxmKTsKKworVkFMVUUgcmJmZmlfTWVtb3J5UG9pbnRlckNsYXNzOworCisjZGVmaW5lIE1FTVBUUihvYmopICgoTWVtb3J5UG9pbnRlciAqKSByYmZmaV9BYnN0cmFjdE1lbW9yeV9DYXN0KG9iaiwgcmJmZmlfTWVtb3J5UG9pbnRlckNsYXNzKSkKKworVkFMVUUKK3JiZmZpX01lbW9yeVBvaW50ZXJfTmV3SW5zdGFuY2UobG9uZyBzaXplLCBsb25nIGNvdW50LCBib29sIGNsZWFyKQoreworICAgIHJldHVybiBtZW1wdHJfbWFsbG9jKG1lbXB0cl9hbGxvY2F0ZShyYmZmaV9NZW1vcnlQb2ludGVyQ2xhc3MpLCBzaXplLCBjb3VudCwgY2xlYXIpOworfQorCitzdGF0aWMgVkFMVUUKK21lbXB0cl9hbGxvY2F0ZShWQUxVRSBrbGFzcykKK3sKKyAgICBQb2ludGVyKiBwOworICAgIFZBTFVFIG9iaiA9IERhdGFfTWFrZV9TdHJ1Y3Qoa2xhc3MsIFBvaW50ZXIsIE5VTEwsIG1lbXB0cl9yZWxlYXNlLCBwKTsKKyAgICBwLT5yYlBhcmVudCA9IFFuaWw7CisgICAgcC0+bWVtb3J5LmZsYWdzID0gTUVNX1JEIHwgTUVNX1dSOworCisgICAgcmV0dXJuIG9iajsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBpbml0aWFsaXplKHNpemUsIGNvdW50PTEsIGNsZWFyPXRydWUpCisgKiBAcGFyYW0gW0ZpeG51bSwgQmlnbnVtLCBTeW1ib2wsIEZGSTo6VHlwZV0gc2l6ZSBzaXplIG9mIGEgbWVtb3J5IGNlbGwgKGluIGJ5dGVzLCBvciB0eXBlIHdob20gc2l6ZSB3aWxsIGJlIHVzZWQpCisgKiBAcGFyYW0gW051bWVyaWNdIGNvdW50IG51bWJlciBvZiBjZWxscyBpbiBtZW1vcnkKKyAqIEBwYXJhbSBbQm9vbGVhbl0gY2xlYXIgc2V0IG1lbW9yeSB0byBhbGwtemVybyBpZiArdHJ1ZSsKKyAqIEByZXR1cm4gW3NlbGZdCisgKiBBIG5ldyBpbnN0YW5jZSBvZiBGRkk6Ok1lbW9yeVBvaW50ZXIuCisgKi8KK3N0YXRpYyBWQUxVRQorbWVtcHRyX2luaXRpYWxpemUoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKQoreworICAgIFZBTFVFIHNpemUgPSBRbmlsLCBjb3VudCA9IFFuaWwsIGNsZWFyID0gUW5pbDsKKyAgICBpbnQgbmFyZ3MgPSByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjEyIiwgJnNpemUsICZjb3VudCwgJmNsZWFyKTsKKworICAgIG1lbXB0cl9tYWxsb2Moc2VsZiwgcmJmZmlfdHlwZV9zaXplKHNpemUpLCBuYXJncyA+IDEgPyBOVU0yTE9ORyhjb3VudCkgOiAxLAorICAgICAgICBSVEVTVChjbGVhcikgfHwgY2xlYXIgPT0gUW5pbCk7CisKKyAgICBpZiAocmJfYmxvY2tfZ2l2ZW5fcCgpKSB7CisgICAgICAgIHJldHVybiByYl9lbnN1cmUocmJfeWllbGQsIHNlbGYsIG1lbXB0cl9mcmVlLCBzZWxmKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIFZBTFVFCittZW1wdHJfbWFsbG9jKFZBTFVFIHNlbGYsIGxvbmcgc2l6ZSwgbG9uZyBjb3VudCwgYm9vbCBjbGVhcikKK3sKKyAgICBQb2ludGVyKiBwOworICAgIHVuc2lnbmVkIGxvbmcgbXNpemU7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgUG9pbnRlciwgcCk7CisKKyAgICBtc2l6ZSA9IHNpemUgKiBjb3VudDsKKworICAgIHAtPnN0b3JhZ2UgPSB4bWFsbG9jKG1zaXplICsgNyk7CisgICAgaWYgKHAtPnN0b3JhZ2UgPT0gTlVMTCkgeworICAgICAgICByYl9yYWlzZShyYl9lTm9NZW1FcnJvciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgc2l6ZT0lbGQgYnl0ZXMiLCBtc2l6ZSk7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKyAgICBwLT5hdXRvcmVsZWFzZSA9IHRydWU7CisgICAgcC0+bWVtb3J5LnR5cGVTaXplID0gKGludCkgc2l6ZTsKKyAgICBwLT5tZW1vcnkuc2l6ZSA9IG1zaXplOworICAgIC8qIGVuc3VyZSB0aGUgbWVtb3J5IGlzIGFsaWduZWQgb24gYXQgbGVhc3QgYSA4IGJ5dGUgYm91bmRhcnkgKi8KKyAgICBwLT5tZW1vcnkuYWRkcmVzcyA9IChjaGFyICopICgoKHVpbnRwdHJfdCkgcC0+c3RvcmFnZSArIDB4NykgJiAodWludHB0cl90KSB+MHg3VUwpOzsKKyAgICBwLT5hbGxvY2F0ZWQgPSB0cnVlOworCisgICAgaWYgKGNsZWFyICYmIHAtPm1lbW9yeS5zaXplID4gMCkgeworICAgICAgICBtZW1zZXQocC0+bWVtb3J5LmFkZHJlc3MsIDAsIHAtPm1lbW9yeS5zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIFZBTFVFCittZW1wdHJfZnJlZShWQUxVRSBzZWxmKQoreworICAgIFBvaW50ZXIqIHB0cjsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBQb2ludGVyLCBwdHIpOworCisgICAgaWYgKHB0ci0+YWxsb2NhdGVkKSB7CisgICAgICAgIGlmIChwdHItPnN0b3JhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgeGZyZWUocHRyLT5zdG9yYWdlKTsKKyAgICAgICAgICAgIHB0ci0+c3RvcmFnZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcHRyLT5hbGxvY2F0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQKK21lbXB0cl9yZWxlYXNlKFBvaW50ZXIqIHB0cikKK3sKKyAgICBpZiAocHRyLT5hdXRvcmVsZWFzZSAmJiBwdHItPmFsbG9jYXRlZCAmJiBwdHItPnN0b3JhZ2UgIT0gTlVMTCkgeworICAgICAgICB4ZnJlZShwdHItPnN0b3JhZ2UpOworICAgICAgICBwdHItPnN0b3JhZ2UgPSBOVUxMOworICAgIH0KKyAgICB4ZnJlZShwdHIpOworfQorCisvKgorICogY2FsbC1zZXE6IGZyb21fc3RyaW5nKHMpCisgKiBAcGFyYW0gW1N0cmluZ10gcyBzdHJpbmcKKyAqIEByZXR1cm4gW01lbW9yeVBvaW50ZXJdCisgKiBDcmVhdGUgYSB7TWVtb3J5UG9pbnRlcn0gd2l0aCArcysgaW5zaWRlLgorICovCitzdGF0aWMgVkFMVUUKK21lbXB0cl9zX2Zyb21fc3RyaW5nKFZBTFVFIGtsYXNzLCBWQUxVRSB0b19zdHIpCit7CisgICAgVkFMVUUgcyA9IFN0cmluZ1ZhbHVlKHRvX3N0cik7CisgICAgVkFMVUUgYXJnc1tdID0geyBJTlQyRklYKDEpLCBMT05HMk5VTShSU1RSSU5HX0xFTihzKSArIDEpLCBRZmFsc2UgfTsKKyAgICBWQUxVRSBvYmogPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMywgYXJncywga2xhc3MpOworICAgIHJiX2Z1bmNhbGwob2JqLCByYl9pbnRlcm4oInB1dF9zdHJpbmciKSwgMiwgSU5UMkZJWCgwKSwgcyk7CisKKyAgICByZXR1cm4gb2JqOworfQorCit2b2lkCityYmZmaV9NZW1vcnlQb2ludGVyX0luaXQoVkFMVUUgbW9kdWxlRkZJKQoreworICAgIFZBTFVFIGZmaV9Qb2ludGVyOworCisgICAgZmZpX1BvaW50ZXIgPSByYmZmaV9Qb2ludGVyQ2xhc3M7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6Ok1lbW9yeVBvaW50ZXIgPCBGRkk6OlBvaW50ZXIKKyAgICAgKiBBIE1lbW9yeVBvaW50ZXIgaXMgYSBzcGVjaWZpYyB7UG9pbnRlcn0uIEl0IHBvaW50cyB0byBhIG1lbW9yeSBjb21wb3NlZCBvZiBjZWxscy4gQWxsIGNlbGxzIGhhdmUgdGhlCisgICAgICogc2FtZSBzaXplLgorICAgICAqCisgICAgICogQGV4YW1wbGUgQ3JlYXRlIGEgbmV3IE1lbW9yeVBvaW50ZXIKKyAgICAgKiAgbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpsb25nLCAxNikgICAjIENyZWF0ZSBhIHBvaW50ZXIgb24gYSBtZW1vcnkgb2YgMTYgbG9uZyBpbnRzLgorICAgICAqIEBleGFtcGxlIENyZWF0ZSBhIG5ldyBNZW1vcnlQb2ludGVyIGZyb20gYSBTdHJpbmcKKyAgICAgKiAgbXAxID0gRkZJOjpNZW1vcnlQb2ludGVyLmZyb21fc3RyaW5nKCJ0aGlzIGlzIGEgc3RyaW5nIikKKyAgICAgKiAgIyBzYW1lIGFzOgorICAgICAqICBtcDIgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpjaGFyLDE2KQorICAgICAqICBtcDIucHV0X3N0cmluZygidGhpcyBpcyBhIHN0cmluZyIpCisgICAgICovCisgICAgcmJmZmlfTWVtb3J5UG9pbnRlckNsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKG1vZHVsZUZGSSwgIk1lbW9yeVBvaW50ZXIiLCBmZmlfUG9pbnRlcik7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9NZW1vcnlQb2ludGVyQ2xhc3MpOworCisgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMocmJmZmlfTWVtb3J5UG9pbnRlckNsYXNzLCBtZW1wdHJfYWxsb2NhdGUpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfTWVtb3J5UG9pbnRlckNsYXNzLCAiaW5pdGlhbGl6ZSIsIG1lbXB0cl9pbml0aWFsaXplLCAtMSk7CisgICAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QocmJmZmlfTWVtb3J5UG9pbnRlckNsYXNzLCAiZnJvbV9zdHJpbmciLCBtZW1wdHJfc19mcm9tX3N0cmluZywgMSk7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01lbW9yeVBvaW50ZXIuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01lbW9yeVBvaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjU3NjgzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvTWVtb3J5UG9pbnRlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIFdheW5lIE1laXNzbmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEx1YyBIZWlucmljaCA8bHVjQGhvbmstaG9uay5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUkJGRklfTUVNT1JZUE9JTlRFUl9ICisjZGVmaW5lCVJCRkZJX01FTU9SWVBPSU5URVJfSAorCisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbHNlCisjIGluY2x1ZGUgIndpbjMyL3N0ZGJvb2wuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHJ1YnkuaD4KKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisgICAgZXh0ZXJuIHZvaWQgcmJmZmlfTWVtb3J5UG9pbnRlcl9Jbml0KFZBTFVFIG1vZHVsZUZGSSk7CisgICAgZXh0ZXJuIFZBTFVFIHJiZmZpX01lbW9yeVBvaW50ZXJDbGFzczsKKyAgICBleHRlcm4gVkFMVUUgcmJmZmlfTWVtb3J5UG9pbnRlcl9OZXdJbnN0YW5jZShsb25nIHNpemUsIGxvbmcgY291bnQsIGJvb2wgY2xlYXIpOworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIFJCRkZJX01FTU9SWVBPSU5URVJfSCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NZW1vcnlQb2ludGVyLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NZW1vcnlQb2ludGVyLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxYTc5YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01lbW9yeVBvaW50ZXIubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NZXRob2RIYW5kbGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01ldGhvZEhhbmRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWZiNzIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NZXRob2RIYW5kbGUuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBXYXluZSBNZWlzc25lcgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmbmRlZiBfV0lOMzIKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGludC5oPgorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjZWxzZQorIyBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorI2VuZGlmCisjaWZuZGVmIF9XSU4zMgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cnVieS5oPgorI2lmIGRlZmluZWQoSEFWRV9OQVRJVkVUSFJFQUQpICYmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19XSU4zMl9fKQorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgInJiZmZpLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisKKyNpbmNsdWRlICJGdW5jdGlvbi5oIgorI2luY2x1ZGUgIlR5cGVzLmgiCisjaW5jbHVkZSAiVHlwZS5oIgorI2luY2x1ZGUgIkxhc3RFcnJvci5oIgorI2luY2x1ZGUgIkNhbGwuaCIKKyNpbmNsdWRlICJDbG9zdXJlUG9vbC5oIgorI2luY2x1ZGUgIk1ldGhvZEhhbmRsZS5oIgorCisKKyNkZWZpbmUgTUFYX01FVEhPRF9GSVhFRF9BUklUWSAoNikKKworI2lmbmRlZiByb3VuZHVwCisjICBkZWZpbmUgcm91bmR1cCh4LCB5KSAgICgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKKyNlbmRpZgorI2lmZGVmIF9XSU4zMgorICB0eXBlZGVmIGNoYXIqIGNhZGRyX3Q7CisjZW5kaWYKKworI2lmZGVmIFVTRV9SQVcKKyMgIGRlZmluZSBNRVRIT0RfQ0xPU1VSRSBmZmlfcmF3X2Nsb3N1cmUKKyMgIGRlZmluZSBNRVRIT0RfUEFSQU1TIGZmaV9yYXcqCisjZWxzZQorIyAgZGVmaW5lIE1FVEhPRF9DTE9TVVJFIGZmaV9jbG9zdXJlCisjICBkZWZpbmUgTUVUSE9EX1BBUkFNUyB2b2lkKioKKyNlbmRpZgorCisKKworc3RhdGljIGJvb2wgcHJlcF90cmFtcG9saW5lKHZvaWQqIGN0eCwgdm9pZCogY29kZSwgQ2xvc3VyZSogY2xvc3VyZSwgY2hhciogZXJybXNnLCBzaXplX3QgZXJybXNnc2l6ZSk7CitzdGF0aWMgbG9uZyB0cmFtcG9saW5lX3NpemUodm9pZCk7CisKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIChkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0FQUExFX18pKQorIyBkZWZpbmUgQ1VTVE9NX1RSQU1QT0xJTkUgMQorI2VuZGlmCisKKworc3RydWN0IE1ldGhvZEhhbmRsZSB7CisgICAgQ2xvc3VyZSogY2xvc3VyZTsKK307CisKK3N0YXRpYyBDbG9zdXJlUG9vbCogZGVmYXVsdENsb3N1cmVQb29sOworCisKK01ldGhvZEhhbmRsZSoKK3JiZmZpX01ldGhvZEhhbmRsZV9BbGxvYyhGdW5jdGlvblR5cGUqIGZuSW5mbywgdm9pZCogZnVuY3Rpb24pCit7CisgICAgTWV0aG9kSGFuZGxlKiBoYW5kbGU7CisgICAgQ2xvc3VyZSogY2xvc3VyZSA9IHJiZmZpX0Nsb3N1cmVfQWxsb2MoZGVmYXVsdENsb3N1cmVQb29sKTsKKyAgICBpZiAoY2xvc3VyZSA9PSBOVUxMKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VOb01lbUVycm9yLCAiZmFpbGVkIHRvIGFsbG9jYXRlIGNsb3N1cmUgZnJvbSBwb29sIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGhhbmRsZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpoYW5kbGUpKTsKKyAgICBoYW5kbGUtPmNsb3N1cmUgPSBjbG9zdXJlOworICAgIGNsb3N1cmUtPmluZm8gPSBmbkluZm87CisgICAgY2xvc3VyZS0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKworICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3ZvaWQKK3JiZmZpX01ldGhvZEhhbmRsZV9GcmVlKE1ldGhvZEhhbmRsZSogaGFuZGxlKQoreworICAgIGlmIChoYW5kbGUgIT0gTlVMTCkgeworICAgICAgICByYmZmaV9DbG9zdXJlX0ZyZWUoaGFuZGxlLT5jbG9zdXJlKTsKKyAgICB9Cit9CisKK3ZvaWQqCityYmZmaV9NZXRob2RIYW5kbGVfQ29kZUFkZHJlc3MoTWV0aG9kSGFuZGxlKiBoYW5kbGUpCit7CisgICAgcmV0dXJuIGhhbmRsZS0+Y2xvc3VyZS0+Y29kZTsKK30KKworI2lmbmRlZiBDVVNUT01fVFJBTVBPTElORQorc3RhdGljIHZvaWQgYXR0YWNoZWRfbWV0aG9kX2ludm9rZShmZmlfY2lmKiBjaWYsIHZvaWQqIHJldHZhbCwgTUVUSE9EX1BBUkFNUyBwYXJhbWV0ZXJzLCB2b2lkKiB1c2VyX2RhdGEpOworCitzdGF0aWMgZmZpX3R5cGUqIG1ldGhvZEhhbmRsZVBhcmFtVHlwZXNbXSA9IHsKKyAgICAmZmZpX3R5cGVfc2ludCwKKyAgICAmZmZpX3R5cGVfcG9pbnRlciwKKyAgICAmZmZpX3R5cGVfdWxvbmcsCit9OworCitzdGF0aWMgZmZpX2NpZiBtaF9jaWY7CisKK3N0YXRpYyBib29sCitwcmVwX3RyYW1wb2xpbmUodm9pZCogY3R4LCB2b2lkKiBjb2RlLCBDbG9zdXJlKiBjbG9zdXJlLCBjaGFyKiBlcnJtc2csIHNpemVfdCBlcnJtc2dzaXplKQoreworICAgIGZmaV9zdGF0dXMgZmZpU3RhdHVzOworCisjaWYgZGVmaW5lZChVU0VfUkFXKQorICAgIGZmaVN0YXR1cyA9IGZmaV9wcmVwX3Jhd19jbG9zdXJlKGNvZGUsICZtaF9jaWYsIGF0dGFjaGVkX21ldGhvZF9pbnZva2UsIGNsb3N1cmUpOworI2Vsc2UKKyAgICBmZmlTdGF0dXMgPSBmZmlfcHJlcF9jbG9zdXJlKGNvZGUsICZtaF9jaWYsIGF0dGFjaGVkX21ldGhvZF9pbnZva2UsIGNsb3N1cmUpOworI2VuZGlmCisgICAgaWYgKGZmaVN0YXR1cyAhPSBGRklfT0spIHsKKyAgICAgICAgc25wcmludGYoZXJybXNnLCBlcnJtc2dzaXplLCAiZmZpX3ByZXBfY2xvc3VyZSBmYWlsZWQuICBzdGF0dXM9JSN4IiwgZmZpU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBsb25nCit0cmFtcG9saW5lX3NpemUodm9pZCkKK3sKKyAgICByZXR1cm4gc2l6ZW9mKE1FVEhPRF9DTE9TVVJFKTsKK30KKworLyoKKyAqIGF0dGFjaGVkX21ldGhvZF9pbnZva2UgaXMgdXNlZCBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gNiBwYXJhbWV0ZXJzLCBvcgorICogd2l0aCBzdHJ1Y3QgcGFyYW0gb3IgcmV0dXJuIHZhbHVlcworICovCitzdGF0aWMgdm9pZAorYXR0YWNoZWRfbWV0aG9kX2ludm9rZShmZmlfY2lmKiBjaWYsIHZvaWQqIG1yZXR2YWwsIE1FVEhPRF9QQVJBTVMgcGFyYW1ldGVycywgdm9pZCogdXNlcl9kYXRhKQoreworICAgIENsb3N1cmUqIGhhbmRsZSA9ICAoQ2xvc3VyZSAqKSB1c2VyX2RhdGE7CisgICAgRnVuY3Rpb25UeXBlKiBmbkluZm8gPSAoRnVuY3Rpb25UeXBlICopIGhhbmRsZS0+aW5mbzsKKworI2lmZGVmIFVTRV9SQVcKKyAgICBpbnQgYXJnYyA9IHBhcmFtZXRlcnNbMF0uc2ludDsKKyAgICBWQUxVRSogYXJndiA9ICooVkFMVUUgKiopICZwYXJhbWV0ZXJzWzFdOworI2Vsc2UKKyAgICBpbnQgYXJnYyA9ICooaW50ICopIHBhcmFtZXRlcnNbMF07CisgICAgVkFMVUUqIGFyZ3YgPSAqKFZBTFVFICoqKSBwYXJhbWV0ZXJzWzFdOworI2VuZGlmCisKKyAgICAqKFZBTFVFICopIG1yZXR2YWwgPSAoKmZuSW5mby0+aW52b2tlKShhcmdjLCBhcmd2LCBoYW5kbGUtPmZ1bmN0aW9uLCBmbkluZm8pOworfQorCisjZW5kaWYKKworCisKKyNpZiBkZWZpbmVkKENVU1RPTV9UUkFNUE9MSU5FKQorI2lmIGRlZmluZWQoX194ODZfNjRfXykKKworc3RhdGljIFZBTFVFIGN1c3RvbV90cmFtcG9saW5lKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZiwgQ2xvc3VyZSopOworCisjZGVmaW5lIFRSQU1QT0xJTkVfQ1RYX01BR0lDICgweGZlZTFkZWFkY2FmZWJhYmUpCisjZGVmaW5lIFRSQU1QT0xJTkVfRlVOX01BR0lDICgweGZlZWRmYWNlYmVlZmYwMGQpCisKKy8qCisgKiBUaGlzIGlzIGEgaGFuZC1jb2RlZCB0cmFtcG9saW5lIHRvIHNwZWVkdXAgZW50cnkgZnJvbSBydWJ5IHRvIHRoZSBGRkkgdHJhbnNsYXRpb24KKyAqIGxheWVyIGZvciB4ODZfNjQgYXJjaGVzLgorICoKKyAqIFNpbmNlIGEgcnVieSBmdW5jdGlvbiBoYXMgZXhhY3RseSAzIGFyZ3VtZW50cywgYW5kIHRoZSBmaXJzdCA2IGFyZ3VtZW50cyBhcmUKKyAqIHBhc3NlZCBpbiByZWdpc3RlcnMgZm9yIHg4Nl82NCwgd2UgY2FuIHRhY2sgb24gYSBjb250ZXh0IHBvaW50ZXIgYnkgc2ltcGx5CisgKiBwdXR0aW5nIGEgdmFsdWUgaW4gJXJjeCwgdGhlbiBqdW1waW5nIHRvIHRoZSBDIHRyYW1wb2xpbmUgY29kZS4KKyAqCisgKiBUaGlzIHJlc3VsdHMgaW4gYXBwcm94IGEgMzAlIHNwZWVkdXAgZm9yIHg4Nl82NCBGRkkgZGlzcGF0Y2gKKyAqLworX19hc21fXygKKyAgICAiLnRleHRcblx0IgorICAgICIuZ2xvYmwgZmZpX3RyYW1wb2xpbmVcblx0IgorICAgICIuZ2xvYmwgX2ZmaV90cmFtcG9saW5lXG5cdCIKKyAgICAiZmZpX3RyYW1wb2xpbmU6XG5cdCIKKyAgICAiX2ZmaV90cmFtcG9saW5lOlxuXHQiCisgICAgIm1vdmFic3EgJDB4ZmVlMWRlYWRjYWZlYmFiZSwgJXJjeFxuXHQiCisgICAgIm1vdmFic3EgJDB4ZmVlZGZhY2ViZWVmZjAwZCwgJXIxMVxuXHQiCisgICAgImptcHEgKiVyMTFcblx0IgorICAgICIuZ2xvYmwgZmZpX3RyYW1wb2xpbmVfZW5kXG5cdCIKKyAgICAiZmZpX3RyYW1wb2xpbmVfZW5kOlxuXHQiCisgICAgIi5nbG9ibCBfZmZpX3RyYW1wb2xpbmVfZW5kXG5cdCIKKyAgICAiX2ZmaV90cmFtcG9saW5lX2VuZDpcblx0IgorKTsKKworc3RhdGljIFZBTFVFCitjdXN0b21fdHJhbXBvbGluZShpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIHNlbGYsIENsb3N1cmUqIGhhbmRsZSkKK3sKKyAgICBGdW5jdGlvblR5cGUqIGZuSW5mbyA9IChGdW5jdGlvblR5cGUgKikgaGFuZGxlLT5pbmZvOworICAgIFZBTFVFIHJiUmV0dXJuVmFsdWU7CisKKyAgICBSQl9HQ19HVUFSRChyYlJldHVyblZhbHVlKSA9ICgqZm5JbmZvLT5pbnZva2UpKGFyZ2MsIGFyZ3YsIGhhbmRsZS0+ZnVuY3Rpb24sIGZuSW5mbyk7CisgICAgUkJfR0NfR1VBUkQoc2VsZik7CisKKyAgICByZXR1cm4gcmJSZXR1cm5WYWx1ZTsKK30KKworI2VsaWYgZGVmaW5lZChfX2kzODZfXykgJiYgMAorCitzdGF0aWMgVkFMVUUgY3VzdG9tX3RyYW1wb2xpbmUoY2FkZHJfdCBhcmdzLCBDbG9zdXJlKik7CisjZGVmaW5lIFRSQU1QT0xJTkVfQ1RYX01BR0lDICgweGZlZTFkZWFkKQorI2RlZmluZSBUUkFNUE9MSU5FX0ZVTl9NQUdJQyAoMHhiZWVmY2FmZSkKKworLyoKKyAqIFRoaXMgaXMgYSBoYW5kLWNvZGVkIHRyYW1wb2xpbmUgdG8gc3BlZWQtdXAgZW50cnkgZnJvbSBydWJ5IHRvIHRoZSBGRkkgdHJhbnNsYXRpb24KKyAqIGxheWVyIGZvciBpMzg2IGFyY2hlcy4KKyAqCisgKiBUaGlzIGRvZXMgbm90IG1ha2UgYSBkaXNjZXJuaWJsZSBkaWZmZXJlbmNlIHZzIGEgcmF3IGNsb3N1cmUsIHNvIGZvciBub3csCisgKiBpdCBpcyBub3QgZW5hYmxlZC4KKyAqLworX19hc21fXygKKyAgICAiLnRleHRcblx0IgorICAgICIuZ2xvYmwgZmZpX3RyYW1wb2xpbmVcblx0IgorICAgICIuZ2xvYmwgX2ZmaV90cmFtcG9saW5lXG5cdCIKKyAgICAiZmZpX3RyYW1wb2xpbmU6XG5cdCIKKyAgICAiX2ZmaV90cmFtcG9saW5lOlxuXHQiCisgICAgInN1YmwgICAgJDEyLCAlZXNwXG5cdCIKKyAgICAibGVhbCAgICAxNiglZXNwKSwgJWVheFxuXHQiCisgICAgIm1vdmwgICAgJWVheCwgKCVlc3ApXG5cdCIKKyAgICAibW92bCAgICAkMHhmZWUxZGVhZCwgNCglZXNwKVxuXHQiCisgICAgIm1vdmwgICAgJDB4YmVlZmNhZmUsICVlYXhcblx0IgorICAgICJjYWxsICAgIColZWF4XG5cdCIKKyAgICAiYWRkbCAgICAkMTIsICVlc3Bcblx0IgorICAgICJyZXRcblx0IgorICAgICIuZ2xvYmwgZmZpX3RyYW1wb2xpbmVfZW5kXG5cdCIKKyAgICAiZmZpX3RyYW1wb2xpbmVfZW5kOlxuXHQiCisgICAgIi5nbG9ibCBfZmZpX3RyYW1wb2xpbmVfZW5kXG5cdCIKKyAgICAiX2ZmaV90cmFtcG9saW5lX2VuZDpcblx0IgorKTsKKworc3RhdGljIFZBTFVFCitjdXN0b21fdHJhbXBvbGluZShjYWRkcl90IGFyZ3MsIENsb3N1cmUqIGhhbmRsZSkKK3sKKyAgICBGdW5jdGlvblR5cGUqIGZuSW5mbyA9IChGdW5jdGlvblR5cGUgKikgaGFuZGxlLT5pbmZvOworICAgIHJldHVybiAoKmZuSW5mby0+aW52b2tlKSgqKGludCAqKSBhcmdzLCAqKFZBTFVFICoqKSAoYXJncyArIDQpLCBoYW5kbGUtPmZ1bmN0aW9uLCBmbkluZm8pOworfQorCisjZW5kaWYgLyogX194ODZfNjRfXyBlbHNlIF9faTM4Nl9fICovCisKK2V4dGVybiB2b2lkIGZmaV90cmFtcG9saW5lKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZik7CitleHRlcm4gdm9pZCBmZmlfdHJhbXBvbGluZV9lbmQodm9pZCk7CitzdGF0aWMgaW50IHRyYW1wb2xpbmVfb2Zmc2V0cyhsb25nICosIGxvbmcgKik7CisKK3N0YXRpYyBsb25nIHRyYW1wb2xpbmVfY3R4X29mZnNldCwgdHJhbXBvbGluZV9mdW5jX29mZnNldDsKKworc3RhdGljIGxvbmcKK3RyYW1wb2xpbmVfb2Zmc2V0KGludCBvZmYsIGNvbnN0IGxvbmcgdmFsdWUpCit7CisgICAgY2FkZHJfdCBwdHI7CisgICAgZm9yIChwdHIgPSAoY2FkZHJfdCkgJmZmaV90cmFtcG9saW5lICsgb2ZmOyBwdHIgPCAoY2FkZHJfdCkgJmZmaV90cmFtcG9saW5lX2VuZDsgKytwdHIpIHsKKyAgICAgICAgaWYgKCoobG9uZyAqKSBwdHIgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBwdHIgLSAoY2FkZHJfdCkgJmZmaV90cmFtcG9saW5lOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Cit0cmFtcG9saW5lX29mZnNldHMobG9uZyogY3R4T2Zmc2V0LCBsb25nKiBmbk9mZnNldCkKK3sKKyAgICAqY3R4T2Zmc2V0ID0gdHJhbXBvbGluZV9vZmZzZXQoMCwgVFJBTVBPTElORV9DVFhfTUFHSUMpOworICAgIGlmICgqY3R4T2Zmc2V0ID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAqZm5PZmZzZXQgPSB0cmFtcG9saW5lX29mZnNldCgwLCBUUkFNUE9MSU5FX0ZVTl9NQUdJQyk7CisgICAgaWYgKCpmbk9mZnNldCA9PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sCitwcmVwX3RyYW1wb2xpbmUodm9pZCogY3R4LCB2b2lkKiBjb2RlLCBDbG9zdXJlKiBjbG9zdXJlLCBjaGFyKiBlcnJtc2csIHNpemVfdCBlcnJtc2dzaXplKQoreworICAgIGNhZGRyX3QgcHRyID0gKGNhZGRyX3QpIGNvZGU7CisKKyAgICBtZW1jcHkocHRyLCAmZmZpX3RyYW1wb2xpbmUsIHRyYW1wb2xpbmVfc2l6ZSgpKTsKKyAgICAvKiBQYXRjaCB0aGUgY29udGV4dCBhbmQgZnVuY3Rpb24gYWRkcmVzc2VzIGludG8gdGhlIHN0dWIgY29kZSAqLworICAgICooaW50cHRyX3QgKikocHRyICsgdHJhbXBvbGluZV9jdHhfb2Zmc2V0KSA9IChpbnRwdHJfdCkgY2xvc3VyZTsKKyAgICAqKGludHB0cl90ICopKHB0ciArIHRyYW1wb2xpbmVfZnVuY19vZmZzZXQpID0gKGludHB0cl90KSBjdXN0b21fdHJhbXBvbGluZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgbG9uZwordHJhbXBvbGluZV9zaXplKHZvaWQpCit7CisgICAgcmV0dXJuIChjYWRkcl90KSAmZmZpX3RyYW1wb2xpbmVfZW5kIC0gKGNhZGRyX3QpICZmZmlfdHJhbXBvbGluZTsKK30KKworI2VuZGlmIC8qIENVU1RPTV9UUkFNUE9MSU5FICovCisKKwordm9pZAorcmJmZmlfTWV0aG9kSGFuZGxlX0luaXQoVkFMVUUgbW9kdWxlKQoreworI2lmbmRlZiBDVVNUT01fVFJBTVBPTElORQorICAgIGZmaV9zdGF0dXMgZmZpU3RhdHVzOworI2VuZGlmCisKKyAgICBkZWZhdWx0Q2xvc3VyZVBvb2wgPSByYmZmaV9DbG9zdXJlUG9vbF9OZXcoKGludCkgdHJhbXBvbGluZV9zaXplKCksIHByZXBfdHJhbXBvbGluZSwgTlVMTCk7CisKKyNpZiBkZWZpbmVkKENVU1RPTV9UUkFNUE9MSU5FKQorICAgIGlmICh0cmFtcG9saW5lX29mZnNldHMoJnRyYW1wb2xpbmVfY3R4X29mZnNldCwgJnRyYW1wb2xpbmVfZnVuY19vZmZzZXQpICE9IDApIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZUZhdGFsLCAiQ291bGQgbm90IGxvY2F0ZSBvZmZzZXRzIGluIHRyYW1wb2xpbmUgY29kZSIpOworICAgIH0KKyNlbHNlCisgICAgZmZpU3RhdHVzID0gZmZpX3ByZXBfY2lmKCZtaF9jaWYsIEZGSV9ERUZBVUxUX0FCSSwgMywgJmZmaV90eXBlX3Vsb25nLAorICAgICAgICAgICAgbWV0aG9kSGFuZGxlUGFyYW1UeXBlcyk7CisgICAgaWYgKGZmaVN0YXR1cyAhPSBGRklfT0spIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZUZhdGFsLCAiZmZpX3ByZXBfY2lmIGZhaWxlZC4gIHN0YXR1cz0lI3giLCBmZmlTdGF0dXMpOworICAgIH0KKworI2VuZGlmCit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NZXRob2RIYW5kbGUuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01ldGhvZEhhbmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzQxYmYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NZXRob2RIYW5kbGUuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJCRkZJX01FVEhPREhBTkRMRV9ICisjZGVmaW5lCVJCRkZJX01FVEhPREhBTkRMRV9ICisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHJ1YnkuaD4KKyNpbmNsdWRlICJGdW5jdGlvbi5oIgorCisgICAgCit0eXBlZGVmIHN0cnVjdCBNZXRob2RIYW5kbGVQb29sIE1ldGhvZEhhbmRsZVBvb2w7Cit0eXBlZGVmIHN0cnVjdCBNZXRob2RIYW5kbGUgTWV0aG9kSGFuZGxlOworCisKK01ldGhvZEhhbmRsZSogcmJmZmlfTWV0aG9kSGFuZGxlX0FsbG9jKEZ1bmN0aW9uVHlwZSogZm5JbmZvLCB2b2lkKiBmdW5jdGlvbik7Cit2b2lkIHJiZmZpX01ldGhvZEhhbmRsZV9GcmVlKE1ldGhvZEhhbmRsZSogaGFuZGxlKTsKK3ZvaWQqIHJiZmZpX01ldGhvZEhhbmRsZV9Db2RlQWRkcmVzcyhNZXRob2RIYW5kbGUqIGhhbmRsZSk7Cit2b2lkIHJiZmZpX01ldGhvZEhhbmRsZV9Jbml0KFZBTFVFIG1vZHVsZSk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBSQkZGSV9NRVRIT0RIQU5ETEVfSCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NZXRob2RIYW5kbGUubyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL01ldGhvZEhhbmRsZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWQzOWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9NZXRob2RIYW5kbGUubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9QbGF0Zm9ybS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvUGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzA1YWQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvUGxhdGZvcm0uYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIFdheW5lIE1laXNzbmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGludC5oPgorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjZWxzZQorIyBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorI2VuZGlmCisjaW5jbHVkZSA8cnVieS5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAicmJmZmlfZW5kaWFuLmgiCisjaW5jbHVkZSAiUGxhdGZvcm0uaCIKKworI2lmIGRlZmluZWQoX19HTlVfXykgfHwgZGVmaW5lZChfX0dMSUJDX18pCisjIGluY2x1ZGUgPGdudS9saWItbmFtZXMuaD4KKyNlbmRpZgorCitzdGF0aWMgVkFMVUUgUGxhdGZvcm1Nb2R1bGUgPSBRbmlsOworCisvKgorICogRGV0ZXJtaW5lIHRoZSBjcHUgdHlwZSBhdCBjb21waWxlIHRpbWUgLSB1c2VmdWwgZm9yIE1hY09TWCB3aGVyZSB0aGUgdGhlCisgKiBzeXN0ZW0gaW5zdGFsbGVkIHJ1YnkgaW5jb3JyZWN0bHkgcmVwb3J0cyAnaG9zdF9jcHUnIGFzICdwb3dlcnBjJyB3aGVuIHJ1bm5pbmcKKyAqIG9uIGludGVsLgorICovCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9fYW1kNjQpIHx8IGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0FNRDY0KQorIyBkZWZpbmUgQ1BVICJ4ODZfNjQiCisKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9NX0lYODYpCisjIGRlZmluZSBDUFUgImkzODYiCisKKyNlbGlmIGRlZmluZWQoX19wcGM2NF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pIHx8IGRlZmluZWQoX01fUFBDKQorIyBkZWZpbmUgQ1BVICJwcGM2NCIKKworI2VsaWYgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYykKKyMgZGVmaW5lIENQVSAicHBjIgorCisvKiBOZWVkIHRvIGNoZWNrIGZvciBfX3NwYXJjdjkgZmlyc3QsIGJlY2F1c2UgX19zcGFyYyB3aWxsIGJlIGRlZmluZWQgZWl0aGVyIHdheS4gKi8KKyNlbGlmIGRlZmluZWQoX19zcGFyY3Y5X18pIHx8IGRlZmluZWQoX19zcGFyY3Y5KQorIyBkZWZpbmUgQ1BVICJzcGFyY3Y5IgorCisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX3NwYXJjKQorIyBkZWZpbmUgQ1BVICJzcGFyYyIKKworI2VsaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fYXJtKQorIyBkZWZpbmUgQ1BVICJhcm0iCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19taXBzKQorIyBkZWZpbmUgQ1BVICJtaXBzIgorCisjZWxpZiBkZWZpbmVkKF9fczM5MF9fKQorIyBkZWZpbmUgQ1BVICJzMzkwIgorCisjZWxzZQorIyBkZWZpbmUgQ1BVICJ1bmtub3duIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitleHBvcnRfcHJpbWl0aXZlX3R5cGVzKFZBTFVFIG1vZHVsZSkKK3sKKyNkZWZpbmUgUyhuYW1lLCBUKSBkbyB7IFwKKyAgICB0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgVCB2OyB9IHM7IFwKKyAgICByYl9kZWZpbmVfY29uc3QobW9kdWxlLCAjbmFtZSAiX0FMSUdOIiwgSU5UMk5VTSgoc2l6ZW9mKHMpIC0gc2l6ZW9mKFQpKSAqIDgpKTsgXAorICAgIHJiX2RlZmluZV9jb25zdChtb2R1bGUsICNuYW1lICJfU0laRSIsIElOVDJOVU0oc2l6ZW9mKFQpKiA4KSk7IFwKK30gd2hpbGUoMCkKKyAgICBTKElOVDgsIGNoYXIpOworICAgIFMoSU5UMTYsIHNob3J0KTsKKyAgICBTKElOVDMyLCBpbnQpOworICAgIFMoSU5UNjQsIGxvbmcgbG9uZyk7CisgICAgUyhMT05HLCBsb25nKTsKKyAgICBTKEZMT0FULCBmbG9hdCk7CisgICAgUyhET1VCTEUsIGRvdWJsZSk7CisgICAgUyhBRERSRVNTLCB2b2lkKik7CisjdW5kZWYgUworfQorCit2b2lkCityYmZmaV9QbGF0Zm9ybV9Jbml0KFZBTFVFIG1vZHVsZUZGSSkKK3sKKyAgICBQbGF0Zm9ybU1vZHVsZSA9IHJiX2RlZmluZV9tb2R1bGVfdW5kZXIobW9kdWxlRkZJLCAiUGxhdGZvcm0iKTsKKyAgICByYl9kZWZpbmVfY29uc3QoUGxhdGZvcm1Nb2R1bGUsICJCWVRFX09SREVSIiwgSU5UMkZJWChCWVRFX09SREVSKSk7CisgICAgcmJfZGVmaW5lX2NvbnN0KFBsYXRmb3JtTW9kdWxlLCAiTElUVExFX0VORElBTiIsIElOVDJGSVgoTElUVExFX0VORElBTikpOworICAgIHJiX2RlZmluZV9jb25zdChQbGF0Zm9ybU1vZHVsZSwgIkJJR19FTkRJQU4iLCBJTlQyRklYKEJJR19FTkRJQU4pKTsKKyAgICByYl9kZWZpbmVfY29uc3QoUGxhdGZvcm1Nb2R1bGUsICJDUFUiLCByYl9zdHJfbmV3MihDUFUpKTsKKyNpZiBkZWZpbmVkKF9fR05VX18pIHx8IGRlZmluZWQoX19HTElCQ19fKQorICAgIHJiX2RlZmluZV9jb25zdChQbGF0Zm9ybU1vZHVsZSwgIkdOVV9MSUJDIiwgcmJfc3RyX25ldzIoTElCQ19TTykpOworI2VuZGlmCisgICAgZXhwb3J0X3ByaW1pdGl2ZV90eXBlcyhQbGF0Zm9ybU1vZHVsZSk7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1BsYXRmb3JtLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9QbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzVlMzQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9QbGF0Zm9ybS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJCRkZJX1BMQVRGT1JNX0gKKyNkZWZpbmUJUkJGRklfUExBVEZPUk1fSAorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyAgICBleHRlcm4gdm9pZCByYmZmaV9QbGF0Zm9ybV9Jbml0KFZBTFVFIG1vZHVsZUZGSSk7CisKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIFJCRkZJX1BMQVRGT1JNX0ggKi8KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvUGxhdGZvcm0ubyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1BsYXRmb3JtLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2NmU3NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1BsYXRmb3JtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvUG9pbnRlci5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvUG9pbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZWU3OTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9Qb2ludGVyLmMKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIFdheW5lIE1laXNzbmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGluY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbHNlCisjIGluY2x1ZGUgIndpbjMyL3N0ZGludC5oIgorIyBpbmNsdWRlICJ3aW4zMi9zdGRib29sLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxydWJ5Lmg+CisjaW5jbHVkZSAicmJmZmkuaCIKKyNpbmNsdWRlICJyYmZmaV9lbmRpYW4uaCIKKyNpbmNsdWRlICJBYnN0cmFjdE1lbW9yeS5oIgorI2luY2x1ZGUgIlBvaW50ZXIuaCIKKworI2RlZmluZSBQT0lOVEVSKG9iaikgcmJmZmlfQWJzdHJhY3RNZW1vcnlfQ2FzdCgob2JqKSwgcmJmZmlfUG9pbnRlckNsYXNzKQorCitWQUxVRSByYmZmaV9Qb2ludGVyQ2xhc3MgPSBRbmlsOworVkFMVUUgcmJmZmlfTnVsbFBvaW50ZXJTaW5nbGV0b24gPSBRbmlsOworCitzdGF0aWMgdm9pZCBwdHJfcmVsZWFzZShQb2ludGVyKiBwdHIpOworc3RhdGljIHZvaWQgcHRyX21hcmsoUG9pbnRlciogcHRyKTsKKworVkFMVUUKK3JiZmZpX1BvaW50ZXJfTmV3SW5zdGFuY2Uodm9pZCogYWRkcikKK3sKKyAgICBQb2ludGVyKiBwOworICAgIFZBTFVFIG9iajsKKworICAgIGlmIChhZGRyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHJiZmZpX051bGxQb2ludGVyU2luZ2xldG9uOworICAgIH0KKworICAgIG9iaiA9IERhdGFfTWFrZV9TdHJ1Y3QocmJmZmlfUG9pbnRlckNsYXNzLCBQb2ludGVyLCBOVUxMLCAtMSwgcCk7CisgICAgcC0+bWVtb3J5LmFkZHJlc3MgPSBhZGRyOworICAgIHAtPm1lbW9yeS5zaXplID0gTE9OR19NQVg7CisgICAgcC0+bWVtb3J5LmZsYWdzID0gKGFkZHIgPT0gTlVMTCkgPyAwIDogKE1FTV9SRCB8IE1FTV9XUik7CisgICAgcC0+bWVtb3J5LnR5cGVTaXplID0gMTsKKyAgICBwLT5yYlBhcmVudCA9IFFuaWw7CisKKyAgICByZXR1cm4gb2JqOworfQorCitzdGF0aWMgVkFMVUUKK3B0cl9hbGxvY2F0ZShWQUxVRSBrbGFzcykKK3sKKyAgICBQb2ludGVyKiBwOworICAgIFZBTFVFIG9iajsKKworICAgIG9iaiA9IERhdGFfTWFrZV9TdHJ1Y3Qoa2xhc3MsIFBvaW50ZXIsIHB0cl9tYXJrLCBwdHJfcmVsZWFzZSwgcCk7CisgICAgcC0+cmJQYXJlbnQgPSBRbmlsOworICAgIHAtPm1lbW9yeS5mbGFncyA9IE1FTV9SRCB8IE1FTV9XUjsKKworICAgIHJldHVybiBvYmo7Cit9CisKKy8qCisgKiBAb3ZlcmxvYWQgaW5pdGlhbGl6ZShwb2ludGVyKQorICogIEBwYXJhbSBbUG9pbnRlcl0gcG9pbnRlciBhbm90aGVyIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZSBmcm9tCisgKiAgQ3JlYXRlIGEgbmV3IHBvaW50ZXIgZnJvbSBhbm90aGVyIHtQb2ludGVyfS4KKyAqIEBvdmVybG9hZCBpbml0aWFsaXplKHR5cGUsIGFkZHJlc3MpCisgKiAgQHBhcmFtIFtUeXBlXSB0eXBlIHR5cGUgZm9yIHBvaW50ZXIKKyAqICBAcGFyYW0gW0ludGVnZXJdIGFkZHJlc3MgYmFzZSBhZGRyZXNzIGZvciBwb2ludGVyCisgKiAgQ3JlYXRlIGEgbmV3IHBvaW50ZXIgZnJvbSBhIHtUeXBlfSBhbmQgYSBiYXNlIGFkZHJlc3MKKyAqIEByZXR1cm4gW3NlbGZdCisgKiBBIG5ldyBpbnN0YW5jZSBvZiBQb2ludGVyLgorICovCitzdGF0aWMgVkFMVUUKK3B0cl9pbml0aWFsaXplKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZikKK3sKKyAgICBQb2ludGVyKiBwOworICAgIFZBTFVFIHJiVHlwZSA9IFFuaWwsIHJiQWRkcmVzcyA9IFFuaWw7CisgICAgaW50IHR5cGVTaXplID0gMTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBQb2ludGVyLCBwKTsKKworICAgIHN3aXRjaCAocmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIxMSIsICZyYlR5cGUsICZyYkFkZHJlc3MpKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJiQWRkcmVzcyA9IHJiVHlwZTsKKyAgICAgICAgICAgIHR5cGVTaXplID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0eXBlU2l6ZSA9IHJiZmZpX3R5cGVfc2l6ZShyYlR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJJbnZhbGlkIGFyZ3VtZW50cyIpOworICAgIH0KKworICAgIHN3aXRjaCAoVFlQRShyYkFkZHJlc3MpKSB7CisgICAgICAgIGNhc2UgVF9GSVhOVU06CisgICAgICAgIGNhc2UgVF9CSUdOVU06CisgICAgICAgICAgICBwLT5tZW1vcnkuYWRkcmVzcyA9ICh2b2lkKikgKHVpbnRwdHJfdCkgTlVNMkxMKHJiQWRkcmVzcyk7CisgICAgICAgICAgICBwLT5tZW1vcnkuc2l6ZSA9IExPTkdfTUFYOworICAgICAgICAgICAgaWYgKHAtPm1lbW9yeS5hZGRyZXNzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwLT5tZW1vcnkuZmxhZ3MgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChyYl9vYmpfaXNfa2luZF9vZihyYkFkZHJlc3MsIHJiZmZpX1BvaW50ZXJDbGFzcykpIHsKKyAgICAgICAgICAgICAgICBQb2ludGVyKiBvcmlnOworCisgICAgICAgICAgICAgICAgcC0+cmJQYXJlbnQgPSByYkFkZHJlc3M7CisgICAgICAgICAgICAgICAgRGF0YV9HZXRfU3RydWN0KHJiQWRkcmVzcywgUG9pbnRlciwgb3JpZyk7CisgICAgICAgICAgICAgICAgcC0+bWVtb3J5ID0gb3JpZy0+bWVtb3J5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAid3JvbmcgYXJndW1lbnQgdHlwZSwgZXhwZWN0ZWQgSW50ZWdlciBvciBGRkk6OlBvaW50ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHAtPm1lbW9yeS50eXBlU2l6ZSA9IHR5cGVTaXplOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogcHRyLmluaXRpYWxpemVfY29weShvdGhlcikKKyAqIEBwYXJhbSBbUG9pbnRlcl0gb3RoZXIgc291cmNlIGZvciBjbG9uaW5nIG9yIGR1cHBpbmcKKyAqIEByZXR1cm4gW3NlbGZdCisgKiBAcmFpc2Uge1J1bnRpbWVFcnJvcn0gaWYgK290aGVyKyBpcyBhbiB1bmJvdW5kZWQgbWVtb3J5IGFyZWEsIG9yIGlzIHVucmVhZGFibGUvdW53cml0YWJsZQorICogQHJhaXNlIHtOb01lbUVycm9yfSBpZiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgb2JqZWN0CisgKiBETyBOT1QgQ0FMTCBUSElTIE1FVEhPRC4KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbGx5IHVzZWQgYnkgI2R1cCBhbmQgI2Nsb25lLiBNZW1vcnkgY29udGVudCBpcyBjb3BpZWQgZnJvbSArb3RoZXIrLgorICovCitzdGF0aWMgVkFMVUUKK3B0cl9pbml0aWFsaXplX2NvcHkoVkFMVUUgc2VsZiwgVkFMVUUgb3RoZXIpCit7CisgICAgQWJzdHJhY3RNZW1vcnkqIHNyYzsKKyAgICBQb2ludGVyKiBkc3Q7CisgICAgCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFBvaW50ZXIsIGRzdCk7CisgICAgc3JjID0gUE9JTlRFUihvdGhlcik7CisgICAgaWYgKHNyYy0+c2l6ZSA9PSBMT05HX01BWCkgeworICAgICAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAiY2Fubm90IGR1cGxpY2F0ZSB1bmJvdW5kZWQgbWVtb3J5IGFyZWEiKTsKKyAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgfQorICAgIAorICAgIGlmICgoZHN0LT5tZW1vcnkuZmxhZ3MgJiAoTUVNX1JEIHwgTUVNX1dSKSkgIT0gKE1FTV9SRCB8IE1FTV9XUikpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwgImNhbm5vdCBkdXBsaWNhdGUgdW5yZWFkYWJsZS91bndyaXRhYmxlIG1lbW9yeSBhcmVhIik7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKworICAgIGlmIChkc3QtPnN0b3JhZ2UgIT0gTlVMTCkgeworICAgICAgICB4ZnJlZShkc3QtPnN0b3JhZ2UpOworICAgICAgICBkc3QtPnN0b3JhZ2UgPSBOVUxMOworICAgIH0KKworICAgIGRzdC0+c3RvcmFnZSA9IHhtYWxsb2Moc3JjLT5zaXplICsgNyk7CisgICAgaWYgKGRzdC0+c3RvcmFnZSA9PSBOVUxMKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VOb01lbUVycm9yLCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBzaXplPSVsdSBieXRlcyIsIHNyYy0+c2l6ZSk7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKyAgICAKKyAgICBkc3QtPmFsbG9jYXRlZCA9IHRydWU7CisgICAgZHN0LT5hdXRvcmVsZWFzZSA9IHRydWU7CisgICAgZHN0LT5tZW1vcnkuYWRkcmVzcyA9ICh2b2lkICopICgoKHVpbnRwdHJfdCkgZHN0LT5zdG9yYWdlICsgMHg3KSAmICh1aW50cHRyX3QpIH4weDdVTCk7CisgICAgZHN0LT5tZW1vcnkuc2l6ZSA9IHNyYy0+c2l6ZTsKKyAgICBkc3QtPm1lbW9yeS50eXBlU2l6ZSA9IHNyYy0+dHlwZVNpemU7CisgICAgCisgICAgLyogZmluYWxseSwgY29weSB0aGUgYWN0dWFsIG1lbW9yeSBjb250ZW50cyAqLworICAgIG1lbWNweShkc3QtPm1lbW9yeS5hZGRyZXNzLCBzcmMtPmFkZHJlc3MsIHNyYy0+c2l6ZSk7CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIFZBTFVFCitzbGljZShWQUxVRSBzZWxmLCBsb25nIG9mZnNldCwgbG9uZyBzaXplKQoreworICAgIEFic3RyYWN0TWVtb3J5KiBwdHI7CisgICAgUG9pbnRlciogcDsKKyAgICBWQUxVRSByZXR2YWw7CisgICAgCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEFic3RyYWN0TWVtb3J5LCBwdHIpOworICAgIGNoZWNrQm91bmRzKHB0ciwgb2Zmc2V0LCBzaXplID09IExPTkdfTUFYID8gMSA6IHNpemUpOworCisgICAgcmV0dmFsID0gRGF0YV9NYWtlX1N0cnVjdChyYmZmaV9Qb2ludGVyQ2xhc3MsIFBvaW50ZXIsIHB0cl9tYXJrLCAtMSwgcCk7CisKKyAgICBwLT5tZW1vcnkuYWRkcmVzcyA9IHB0ci0+YWRkcmVzcyArIG9mZnNldDsKKyAgICBwLT5tZW1vcnkuc2l6ZSA9IHNpemU7CisgICAgcC0+bWVtb3J5LmZsYWdzID0gcHRyLT5mbGFnczsKKyAgICBwLT5tZW1vcnkudHlwZVNpemUgPSBwdHItPnR5cGVTaXplOworICAgIHAtPnJiUGFyZW50ID0gc2VsZjsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIAorICogRG9jdW1lbnQtbWV0aG9kOiArCisgKiBjYWxsLXNlcTogcHRyICsgb2Zmc2V0CisgKiBAcGFyYW0gW051bWVyaWNdIG9mZnNldAorICogQHJldHVybiBbUG9pbnRlcl0KKyAqIFJldHVybiBhIG5ldyB7UG9pbnRlcn0gZnJvbSBhbiBleGlzdGluZyBwb2ludGVyIGFuZCBhbiArb2Zmc2V0Ky4KKyAqLworc3RhdGljIFZBTFVFCitwdHJfcGx1cyhWQUxVRSBzZWxmLCBWQUxVRSBvZmZzZXQpCit7CisgICAgQWJzdHJhY3RNZW1vcnkqIHB0cjsKKyAgICBsb25nIG9mZiA9IE5VTTJMT05HKG9mZnNldCk7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgQWJzdHJhY3RNZW1vcnksIHB0cik7CisKKyAgICByZXR1cm4gc2xpY2Uoc2VsZiwgb2ZmLCBwdHItPnNpemUgPT0gTE9OR19NQVggPyBMT05HX01BWCA6IHB0ci0+c2l6ZSAtIG9mZik7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogcHRyLnNsaWNlKG9mZnNldCwgbGVuZ3RoKQorICogQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQKKyAqIEBwYXJhbSBbTnVtZXJpY10gbGVuZ3RoCisgKiBAcmV0dXJuIFtQb2ludGVyXQorICogUmV0dXJuIGEgbmV3IHtQb2ludGVyfSBmcm9tIGFuIGV4aXN0aW5nIG9uZS4gVGhpcyBwb2ludGVyIHBvaW50cyBvbiBzYW1lIGNvbnRlbnRzIAorICogZnJvbSArb2Zmc2V0KyBmb3IgYSBsZW5ndGggK2xlbmd0aCsuCisgKi8KK3N0YXRpYyBWQUxVRQorcHRyX3NsaWNlKFZBTFVFIHNlbGYsIFZBTFVFIHJiT2Zmc2V0LCBWQUxVRSByYkxlbmd0aCkKK3sKKyAgICByZXR1cm4gc2xpY2Uoc2VsZiwgTlVNMkxPTkcocmJPZmZzZXQpLCBOVU0yTE9ORyhyYkxlbmd0aCkpOworfQorCisvKgorICogY2FsbC1zZXE6IHB0ci5pbnNwZWN0CisgKiBAcmV0dXJuIFtTdHJpbmddCisgKiBJbnNwZWN0IHBvaW50ZXIgb2JqZWN0LgorICovCitzdGF0aWMgVkFMVUUKK3B0cl9pbnNwZWN0KFZBTFVFIHNlbGYpCit7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBQb2ludGVyKiBwdHI7CisgICAgCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFBvaW50ZXIsIHB0cik7CisKKyAgICBpZiAocHRyLT5tZW1vcnkuc2l6ZSAhPSBMT05HX01BWCkgeworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiIzwlcyBhZGRyZXNzPSVwIHNpemU9JWx1PiIsCisgICAgICAgICAgICAgICAgcmJfb2JqX2NsYXNzbmFtZShzZWxmKSwgcHRyLT5tZW1vcnkuYWRkcmVzcywgcHRyLT5tZW1vcnkuc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiM8JXMgYWRkcmVzcz0lcD4iLCByYl9vYmpfY2xhc3NuYW1lKHNlbGYpLCBwdHItPm1lbW9yeS5hZGRyZXNzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmJfc3RyX25ldzIoYnVmKTsKK30KKworLyoKKyAqIERvY3VtZW50LW1ldGhvZDogbnVsbD8KKyAqIGNhbGwtc2VxOiBwdHIubnVsbD8KKyAqIEByZXR1cm4gW0Jvb2xlYW5dCisgKiBSZXR1cm4gK3RydWUrIGlmICtzZWxmKyBpcyBhIHtOVUxMfSBwb2ludGVyLgorICovCitzdGF0aWMgVkFMVUUKK3B0cl9udWxsX3AoVkFMVUUgc2VsZikKK3sKKyAgICBQb2ludGVyKiBwdHI7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgUG9pbnRlciwgcHRyKTsKKworICAgIHJldHVybiBwdHItPm1lbW9yeS5hZGRyZXNzID09IE5VTEwgPyBRdHJ1ZSA6IFFmYWxzZTsKK30KKworLyoKKyAqIERvY3VtZW50LW1ldGhvZDogPT0KKyAqIGNhbGwtc2VxOiBwdHIgPT0gb3RoZXIKKyAqIEBwYXJhbSBbUG9pbnRlcl0gb3RoZXIKKyAqIENoZWNrIGVxdWFsaXR5IGJldHdlZW4gK3NlbGYrIGFuZCArb3RoZXIrLiBFcXVhbGl0eSBpcyB0ZXN0ZWQgb24geyNhZGRyZXNzfS4KKyAqLworc3RhdGljIFZBTFVFCitwdHJfZXF1YWxzKFZBTFVFIHNlbGYsIFZBTFVFIG90aGVyKQoreworICAgIFBvaW50ZXIqIHB0cjsKKyAgICAKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgUG9pbnRlciwgcHRyKTsKKworICAgIGlmIChOSUxfUChvdGhlcikpIHsKKyAgICAgICAgcmV0dXJuIHB0ci0+bWVtb3J5LmFkZHJlc3MgPT0gTlVMTCA/IFF0cnVlIDogUWZhbHNlOworICAgIH0KKworICAgIHJldHVybiBwdHItPm1lbW9yeS5hZGRyZXNzID09IFBPSU5URVIob3RoZXIpLT5hZGRyZXNzID8gUXRydWUgOiBRZmFsc2U7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogcHRyLmFkZHJlc3MKKyAqIEByZXR1cm4gW051bWVyaWNdIHBvaW50ZXIncyBiYXNlIGFkZHJlc3MKKyAqIFJldHVybiArc2VsZisncyBiYXNlIGFkZHJlc3MgKGFsaWFzOiAjdG9faSkuCisgKi8KK3N0YXRpYyBWQUxVRQorcHRyX2FkZHJlc3MoVkFMVUUgc2VsZikKK3sKKyAgICBQb2ludGVyKiBwdHI7CisgICAgCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFBvaW50ZXIsIHB0cik7CisKKyAgICByZXR1cm4gVUxMMk5VTSgodWludHB0cl90KSBwdHItPm1lbW9yeS5hZGRyZXNzKTsKK30KKworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorIyBkZWZpbmUgU1dBUFBFRF9PUkRFUiBCSUdfRU5ESUFOCisjZWxzZQorIyBkZWZpbmUgU1dBUFBFRF9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKworLyoKKyAqIEdldCBvciBzZXQgK3NlbGYrJ3MgZW5kaWFubmVzcworICogQG92ZXJsb2FkIG9yZGVyCisgKiAgQHJldHVybiBbOmJpZywgOmxpdHRsZV0gZW5kaWFubmVzcyBvZiArc2VsZisKKyAqIEBvdmVybG9hZCBvcmRlcihvcmRlcikKKyAqICBAcGFyYW0gIFtTeW1ib2xdIG9yZGVyIGVuZGlhbm5lc3MgdG8gc2V0ICgrOmxpdHRsZSssICs6YmlnKyBvciArOm5ldHdvcmsrKS4gKzpiaWcrIGFuZCArOm5ldHdvcmsrIAorICogICBhcmUgc3lub255bW91cy4KKyAqICBAcmV0dXJuIFtzZWxmXQorICovCitzdGF0aWMgVkFMVUUKK3B0cl9vcmRlcihpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIHNlbGYpCit7CisgICAgUG9pbnRlciogcHRyOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFBvaW50ZXIsIHB0cik7CisgICAgaWYgKGFyZ2MgPT0gMCkgeworICAgICAgICBpbnQgb3JkZXIgPSAocHRyLT5tZW1vcnkuZmxhZ3MgJiBNRU1fU1dBUCkgPT0gMCA/IEJZVEVfT1JERVIgOiBTV0FQUEVEX09SREVSOworICAgICAgICByZXR1cm4gb3JkZXIgPT0gQklHX0VORElBTiA/IElEMlNZTShyYl9pbnRlcm4oImJpZyIpKSA6IElEMlNZTShyYl9pbnRlcm4oImxpdHRsZSIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBWQUxVRSByYk9yZGVyID0gUW5pbDsKKyAgICAgICAgaW50IG9yZGVyID0gQllURV9PUkRFUjsKKworICAgICAgICBpZiAocmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIxIiwgJnJiT3JkZXIpIDwgMSkgeworICAgICAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAibmVlZCBieXRlIG9yZGVyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFNZTUJPTF9QKHJiT3JkZXIpKSB7CisgICAgICAgICAgICBJRCBpZCA9IFNZTTJJRChyYk9yZGVyKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSByYl9pbnRlcm4oImxpdHRsZSIpKSB7CisgICAgICAgICAgICAgICAgb3JkZXIgPSBMSVRUTEVfRU5ESUFOOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IHJiX2ludGVybigiYmlnIikgfHwgaWQgPT0gcmJfaW50ZXJuKCJuZXR3b3JrIikpIHsKKyAgICAgICAgICAgICAgICBvcmRlciA9IEJJR19FTkRJQU47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9yZGVyICE9IEJZVEVfT1JERVIpIHsKKyAgICAgICAgICAgIFBvaW50ZXIqIHAyOworICAgICAgICAgICAgVkFMVUUgcmV0dmFsID0gc2xpY2Uoc2VsZiwgMCwgcHRyLT5tZW1vcnkuc2l6ZSk7CisKKyAgICAgICAgICAgIERhdGFfR2V0X1N0cnVjdChyZXR2YWwsIFBvaW50ZXIsIHAyKTsKKyAgICAgICAgICAgIHAyLT5tZW1vcnkuZmxhZ3MgfD0gTUVNX1NXQVA7CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorfQorCisKKy8qCisgKiBjYWxsLXNlcTogcHRyLmZyZWUKKyAqIEByZXR1cm4gW3NlbGZdCisgKiBGcmVlIG1lbW9yeSBwb2ludGVkIGJ5ICtzZWxmKy4KKyAqLworc3RhdGljIFZBTFVFCitwdHJfZnJlZShWQUxVRSBzZWxmKQoreworICAgIFBvaW50ZXIqIHB0cjsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBQb2ludGVyLCBwdHIpOworCisgICAgaWYgKHB0ci0+YWxsb2NhdGVkKSB7CisgICAgICAgIGlmIChwdHItPnN0b3JhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgeGZyZWUocHRyLT5zdG9yYWdlKTsKKyAgICAgICAgICAgIHB0ci0+c3RvcmFnZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcHRyLT5hbGxvY2F0ZWQgPSBmYWxzZTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIFZBTFVFIGNhbGxlciA9IHJiX2Z1bmNhbGwocmJfZnVuY2FsbChRbmlsLCByYl9pbnRlcm4oImNhbGxlciIpLCAwKSwgcmJfaW50ZXJuKCJmaXJzdCIpLCAwKTsKKyAgICAgICAgCisgICAgICAgIHJiX3dhcm4oImNhbGxpbmcgZnJlZSBvbiBub24gYWxsb2NhdGVkIHBvaW50ZXIgJXMgZnJvbSAlcyIsIFJTVFJJTkdfUFRSKHB0cl9pbnNwZWN0KHNlbGYpKSwgUlNUUklOR19QVFIocmJfc3RyX3RvX3N0cihjYWxsZXIpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNlbGY7Cit9CisKK3N0YXRpYyBWQUxVRQorcHRyX3R5cGVfc2l6ZShWQUxVRSBzZWxmKQoreworICAgIFBvaW50ZXIqIHB0cjsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBQb2ludGVyLCBwdHIpOworICAgIAorICAgIHJldHVybiBJTlQyTlVNKHB0ci0+bWVtb3J5LnR5cGVTaXplKTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBwdHIuYXV0b3JlbGVhc2UgPSBhdXRvcmVsZWFzZQorICogQHBhcmFtIFtCb29sZWFuXSBhdXRvcmVsZWFzZQorICogQHJldHVybiBbQm9vbGVhbl0gK2F1dG9yZWxlYXNlKworICogU2V0ICthdXRvcmVsZWFzZSsgYXR0cmlidXRlLiBTZWUgYWxzbyBBdXRvcmVsZWFzZSBzZWN0aW9uLgorICovCitzdGF0aWMgVkFMVUUKK3B0cl9hdXRvcmVsZWFzZShWQUxVRSBzZWxmLCBWQUxVRSBhdXRvcmVsZWFzZSkKK3sKKyAgICBQb2ludGVyKiBwdHI7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgUG9pbnRlciwgcHRyKTsKKyAgICBwdHItPmF1dG9yZWxlYXNlID0gYXV0b3JlbGVhc2UgPT0gUXRydWU7CisKKyAgICByZXR1cm4gYXV0b3JlbGVhc2U7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogcHRyLmF1dG9yZWxlYXNlPworICogQHJldHVybiBbQm9vbGVhbl0KKyAqIEdldCArYXV0b3JlbGVhc2UrIGF0dHJpYnV0ZS4gU2VlIGFsc28gQXV0b3JlbGVhc2Ugc2VjdGlvbi4KKyAqLworc3RhdGljIFZBTFVFCitwdHJfYXV0b3JlbGVhc2VfcChWQUxVRSBzZWxmKQoreworICAgIFBvaW50ZXIqIHB0cjsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBQb2ludGVyLCBwdHIpOworICAgIAorICAgIHJldHVybiBwdHItPmF1dG9yZWxlYXNlID8gUXRydWUgOiBRZmFsc2U7Cit9CisKKworc3RhdGljIHZvaWQKK3B0cl9yZWxlYXNlKFBvaW50ZXIqIHB0cikKK3sKKyAgICBpZiAocHRyLT5hdXRvcmVsZWFzZSAmJiBwdHItPmFsbG9jYXRlZCAmJiBwdHItPnN0b3JhZ2UgIT0gTlVMTCkgeworICAgICAgICB4ZnJlZShwdHItPnN0b3JhZ2UpOworICAgICAgICBwdHItPnN0b3JhZ2UgPSBOVUxMOworICAgIH0KKyAgICB4ZnJlZShwdHIpOworfQorCitzdGF0aWMgdm9pZAorcHRyX21hcmsoUG9pbnRlciogcHRyKQoreworICAgIHJiX2djX21hcmsocHRyLT5yYlBhcmVudCk7Cit9CisKK3ZvaWQKK3JiZmZpX1BvaW50ZXJfSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgVkFMVUUgcmJOdWxsQWRkcmVzcyA9IFVMTDJOVU0oMCk7CisgICAgVkFMVUUgZmZpX0Fic3RyYWN0TWVtb3J5ID0gIHJiZmZpX0Fic3RyYWN0TWVtb3J5Q2xhc3M7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OlBvaW50ZXIgPCBGRkk6OkFic3RyYWN0TWVtb3J5CisgICAgICogUG9pbnRlciBjbGFzcyBpcyB1c2VkIHRvIG1hbmFnZSBDIHBvaW50ZXJzIHdpdGggZWFzZS4gQSB7UG9pbnRlcn0gb2JqZWN0IGlzIGRlZmluZWQgYnkgaGlzCisgICAgICogeyNhZGRyZXNzfSAoYXMgYSBDIHBvaW50ZXIpLiBJdCBwZXJtaXRzIGFkZGl0aW9ucyB3aXRoIGFuIGludGVnZXIgZm9yIHBvaW50ZXIgYXJpdGhtZXRpYy4KKyAgICAgKgorICAgICAqID09QXV0b3JlbGVhc2UKKyAgICAgKiBBIHBvaW50ZXIgb2JqZWN0IG1heSBhdXRvcmVsZWFzZSBoaXMgY29udGVudHMgd2hlbiBmcmVlZCAoYnkgZGVmYXVsdCkuIFRoaXMgYmVoYXZpb3VyIG1heSBiZQorICAgICAqIGNoYW5nZWQgd2l0aCB7I2F1dG9yZWxlYXNlPX0gbWV0aG9kLgorICAgICAqLworICAgIHJiZmZpX1BvaW50ZXJDbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtb2R1bGVGRkksICJQb2ludGVyIiwgZmZpX0Fic3RyYWN0TWVtb3J5KTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LXZhcmlhYmxlOiBQb2ludGVyCisgICAgICovCisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9Qb2ludGVyQ2xhc3MpOworCisgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMocmJmZmlfUG9pbnRlckNsYXNzLCBwdHJfYWxsb2NhdGUpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfUG9pbnRlckNsYXNzLCAiaW5pdGlhbGl6ZSIsIHB0cl9pbml0aWFsaXplLCAtMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9Qb2ludGVyQ2xhc3MsICJpbml0aWFsaXplX2NvcHkiLCBwdHJfaW5pdGlhbGl6ZV9jb3B5LCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1BvaW50ZXJDbGFzcywgImluc3BlY3QiLCBwdHJfaW5zcGVjdCwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9Qb2ludGVyQ2xhc3MsICJ0b19zIiwgcHRyX2luc3BlY3QsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfUG9pbnRlckNsYXNzLCAiKyIsIHB0cl9wbHVzLCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1BvaW50ZXJDbGFzcywgInNsaWNlIiwgcHRyX3NsaWNlLCAyKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1BvaW50ZXJDbGFzcywgIm51bGw/IiwgcHRyX251bGxfcCwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9Qb2ludGVyQ2xhc3MsICJhZGRyZXNzIiwgcHRyX2FkZHJlc3MsIDApOworICAgIHJiX2RlZmluZV9hbGlhcyhyYmZmaV9Qb2ludGVyQ2xhc3MsICJ0b19pIiwgImFkZHJlc3MiKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1BvaW50ZXJDbGFzcywgIj09IiwgcHRyX2VxdWFscywgMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9Qb2ludGVyQ2xhc3MsICJvcmRlciIsIHB0cl9vcmRlciwgLTEpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfUG9pbnRlckNsYXNzLCAiYXV0b3JlbGVhc2U9IiwgcHRyX2F1dG9yZWxlYXNlLCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1BvaW50ZXJDbGFzcywgImF1dG9yZWxlYXNlPyIsIHB0cl9hdXRvcmVsZWFzZV9wLCAwKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1BvaW50ZXJDbGFzcywgImZyZWUiLCBwdHJfZnJlZSwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9Qb2ludGVyQ2xhc3MsICJ0eXBlX3NpemUiLCBwdHJfdHlwZV9zaXplLCAwKTsKKworICAgIHJiZmZpX051bGxQb2ludGVyU2luZ2xldG9uID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDEsICZyYk51bGxBZGRyZXNzLCByYmZmaV9Qb2ludGVyQ2xhc3MpOworICAgIC8qCisgICAgICogTlVMTCBwb2ludGVyCisgICAgICovCisgICAgcmJfZGVmaW5lX2NvbnN0KHJiZmZpX1BvaW50ZXJDbGFzcywgIk5VTEwiLCByYmZmaV9OdWxsUG9pbnRlclNpbmdsZXRvbik7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1BvaW50ZXIuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1BvaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDg2ODUxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvUG9pbnRlci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIFdheW5lIE1laXNzbmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUkJGRklfUE9JTlRFUl9ICisjZGVmaW5lCVJCRkZJX1BPSU5URVJfSAorCisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbHNlCisjIGluY2x1ZGUgIndpbjMyL3N0ZGJvb2wuaCIKKyNlbmRpZgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJBYnN0cmFjdE1lbW9yeS5oIgorCitleHRlcm4gdm9pZCByYmZmaV9Qb2ludGVyX0luaXQoVkFMVUUgbW9kdWxlRkZJKTsKK2V4dGVybiBWQUxVRSByYmZmaV9Qb2ludGVyX05ld0luc3RhbmNlKHZvaWQqIGFkZHIpOworZXh0ZXJuIFZBTFVFIHJiZmZpX1BvaW50ZXJDbGFzczsKK2V4dGVybiBWQUxVRSByYmZmaV9OdWxsUG9pbnRlclNpbmdsZXRvbjsKKwordHlwZWRlZiBzdHJ1Y3QgUG9pbnRlciB7CisgICAgQWJzdHJhY3RNZW1vcnkgbWVtb3J5OworICAgIFZBTFVFIHJiUGFyZW50OworICAgIGNoYXIqIHN0b3JhZ2U7IC8qIHN0YXJ0IG9mIG1hbGxvYyBhcmVhICovCisgICAgYm9vbCBhdXRvcmVsZWFzZTsKKyAgICBib29sIGFsbG9jYXRlZDsKK30gUG9pbnRlcjsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIFJCRkZJX1BPSU5URVJfSCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9Qb2ludGVyLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9Qb2ludGVyLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzMzVlMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1BvaW50ZXIubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3QuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDI4YTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3QuYwpAQCAtMCwwICsxLDgyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBMdWMgSGVpbnJpY2ggPGx1Y0Bob25rLWhvbmsuY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorIyBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHJ1YnkuaD4KKyNpbmNsdWRlICJyYmZmaS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgIkFic3RyYWN0TWVtb3J5LmgiCisjaW5jbHVkZSAiUG9pbnRlci5oIgorI2luY2x1ZGUgIk1lbW9yeVBvaW50ZXIuaCIKKyNpbmNsdWRlICJGdW5jdGlvbi5oIgorI2luY2x1ZGUgIlR5cGVzLmgiCisjaW5jbHVkZSAiRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJTdHJ1Y3RCeVZhbHVlLmgiCisjaW5jbHVkZSAiQXJyYXlUeXBlLmgiCisjaW5jbHVkZSAiTWFwcGVkVHlwZS5oIgorI2luY2x1ZGUgIlN0cnVjdC5oIgorCit0eXBlZGVmIHN0cnVjdCBJbmxpbmVBcnJheV8geworICAgIFZBTFVFIHJiTWVtb3J5OworICAgIFZBTFVFIHJiRmllbGQ7CisKKyAgICBBYnN0cmFjdE1lbW9yeSogbWVtb3J5OworICAgIFN0cnVjdEZpZWxkKiBmaWVsZDsKKyAgICBNZW1vcnlPcCAqb3A7CisgICAgVHlwZSogY29tcG9uZW50VHlwZTsKKyAgICBBcnJheVR5cGUqIGFycmF5VHlwZTsKKyAgICBpbnQgbGVuZ3RoOworfSBJbmxpbmVBcnJheTsKKworCitzdGF0aWMgdm9pZCBzdHJ1Y3RfbWFyayhTdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBzdHJ1Y3RfZnJlZShTdHJ1Y3QgKik7CitzdGF0aWMgVkFMVUUgc3RydWN0X2NsYXNzX2xheW91dChWQUxVRSBrbGFzcyk7CitzdGF0aWMgdm9pZCBzdHJ1Y3RfbWFsbG9jKFN0cnVjdCogcyk7CitzdGF0aWMgdm9pZCBpbmxpbmVfYXJyYXlfbWFyayhJbmxpbmVBcnJheSAqKTsKK3N0YXRpYyB2b2lkIHN0b3JlX3JlZmVyZW5jZV92YWx1ZShTdHJ1Y3RGaWVsZCogZiwgU3RydWN0KiBzLCBWQUxVRSB2YWx1ZSk7CisKK1ZBTFVFIHJiZmZpX1N0cnVjdENsYXNzID0gUW5pbDsKKworVkFMVUUgcmJmZmlfU3RydWN0SW5saW5lQXJyYXlDbGFzcyA9IFFuaWw7CitWQUxVRSByYmZmaV9TdHJ1Y3RMYXlvdXRDaGFyQXJyYXlDbGFzcyA9IFFuaWw7CisKK3N0YXRpYyBJRCBpZF9wb2ludGVyX2l2YXIgPSAwLCBpZF9sYXlvdXRfaXZhciA9IDA7CitzdGF0aWMgSUQgaWRfZ2V0ID0gMCwgaWRfcHV0ID0gMCwgaWRfdG9fcHRyID0gMCwgaWRfdG9fcyA9IDAsIGlkX2xheW91dCA9IDA7CisKK3N0YXRpYyBpbmxpbmUgY2hhcioKK21lbW9yeV9hZGRyZXNzKFZBTFVFIHNlbGYpCit7CisgICAgcmV0dXJuICgoQWJzdHJhY3RNZW1vcnkgKilEQVRBX1BUUigoc2VsZikpKS0+YWRkcmVzczsKK30KKworc3RhdGljIFZBTFVFCitzdHJ1Y3RfYWxsb2NhdGUoVkFMVUUga2xhc3MpCit7CisgICAgU3RydWN0KiBzOworICAgIFZBTFVFIG9iaiA9IERhdGFfTWFrZV9TdHJ1Y3Qoa2xhc3MsIFN0cnVjdCwgc3RydWN0X21hcmssIHN0cnVjdF9mcmVlLCBzKTsKKyAgICAKKyAgICBzLT5yYlBvaW50ZXIgPSBRbmlsOworICAgIHMtPnJiTGF5b3V0ID0gUW5pbDsKKworICAgIHJldHVybiBvYmo7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogaW5pdGlhbGl6ZQorICogQG92ZXJsb2FkIGluaXRpYWxpemUocG9pbnRlciwgKmFyZ3MpCisgKiAgQHBhcmFtIFtBYnN0cmFjdE1lbW9yeV0gcG9pbnRlcgorICogIEBwYXJhbSBbQXJyYXldIGFyZ3MKKyAqIEByZXR1cm4gW3NlbGZdCisgKi8KK3N0YXRpYyBWQUxVRQorc3RydWN0X2luaXRpYWxpemUoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKQoreworICAgIFN0cnVjdCogczsKKyAgICBWQUxVRSByYlBvaW50ZXIgPSBRbmlsLCByZXN0ID0gUW5pbCwga2xhc3MgPSBDTEFTU19PRihzZWxmKTsKKyAgICBpbnQgbmFyZ3M7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0LCBzKTsKKyAgICAKKyAgICBuYXJncyA9IHJiX3NjYW5fYXJncyhhcmdjLCBhcmd2LCAiMDEqIiwgJnJiUG9pbnRlciwgJnJlc3QpOworCisgICAgLyogQ2FsbCB1cCBpbnRvIHJ1YnkgY29kZSB0byBhZGp1c3QgdGhlIGxheW91dCAqLworICAgIGlmIChuYXJncyA+IDEpIHsKKyAgICAgICAgcy0+cmJMYXlvdXQgPSByYl9mdW5jYWxsMihDTEFTU19PRihzZWxmKSwgaWRfbGF5b3V0LCAoaW50KSBSQVJSQVlfTEVOKHJlc3QpLCBSQVJSQVlfUFRSKHJlc3QpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5yYkxheW91dCA9IHN0cnVjdF9jbGFzc19sYXlvdXQoa2xhc3MpOworICAgIH0KKworICAgIGlmICghcmJfb2JqX2lzX2tpbmRfb2Yocy0+cmJMYXlvdXQsIHJiZmZpX1N0cnVjdExheW91dENsYXNzKSkgeworICAgICAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAiSW52YWxpZCBTdHJ1Y3QgbGF5b3V0Iik7CisgICAgfQorCisgICAgRGF0YV9HZXRfU3RydWN0KHMtPnJiTGF5b3V0LCBTdHJ1Y3RMYXlvdXQsIHMtPmxheW91dCk7CisgICAgCisgICAgaWYgKHJiUG9pbnRlciAhPSBRbmlsKSB7CisgICAgICAgIHMtPnBvaW50ZXIgPSBNRU1PUlkocmJQb2ludGVyKTsKKyAgICAgICAgcy0+cmJQb2ludGVyID0gcmJQb2ludGVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdF9tYWxsb2Mocyk7CisgICAgfQorCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogaW5pdGlhbGl6ZV9jb3B5KG90aGVyKQorICogQHJldHVybiBbbmlsXQorICogRE8gTk9UIENBTEwgVEhJUyBNRVRIT0QKKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfaW5pdGlhbGl6ZV9jb3B5KFZBTFVFIHNlbGYsIFZBTFVFIG90aGVyKQoreworICAgIFN0cnVjdCogc3JjOworICAgIFN0cnVjdCogZHN0OworICAgIAorICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3QsIGRzdCk7CisgICAgRGF0YV9HZXRfU3RydWN0KG90aGVyLCBTdHJ1Y3QsIHNyYyk7CisgICAgaWYgKGRzdCA9PSBzcmMpIHsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorICAgIAorICAgIGRzdC0+cmJMYXlvdXQgPSBzcmMtPnJiTGF5b3V0OworICAgIGRzdC0+bGF5b3V0ID0gc3JjLT5sYXlvdXQ7CisgICAgCisgICAgLyoKKyAgICAgKiBBIG5ldyBNZW1vcnlQb2ludGVyIGluc3RhbmNlIGlzIGFsbG9jYXRlZCBoZXJlIGluc3RlYWQgb2YganVzdCBjYWxsaW5nCisgICAgICogI2R1cCBvbiByYlBvaW50ZXIsIHNpbmNlIHRoZSBQb2ludGVyIG1heSBub3Qga25vdyBpdHMgbGVuZ3RoLCBvciBtYXkKKyAgICAgKiBiZSBsb25nZXIgdGhhbiBqdXN0IHRoaXMgc3RydWN0LgorICAgICAqLworICAgIGlmIChzcmMtPnBvaW50ZXItPmFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICBkc3QtPnJiUG9pbnRlciA9IHJiZmZpX01lbW9yeVBvaW50ZXJfTmV3SW5zdGFuY2UoMSwgc3JjLT5sYXlvdXQtPnNpemUsIGZhbHNlKTsKKyAgICAgICAgZHN0LT5wb2ludGVyID0gTUVNT1JZKGRzdC0+cmJQb2ludGVyKTsKKyAgICAgICAgbWVtY3B5KGRzdC0+cG9pbnRlci0+YWRkcmVzcywgc3JjLT5wb2ludGVyLT5hZGRyZXNzLCBzcmMtPmxheW91dC0+c2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0LT5yYlBvaW50ZXIgPSBzcmMtPnJiUG9pbnRlcjsKKyAgICAgICAgZHN0LT5wb2ludGVyID0gc3JjLT5wb2ludGVyOworICAgIH0KKworICAgIGlmIChzcmMtPmxheW91dC0+cmVmZXJlbmNlRmllbGRDb3VudCA+IDApIHsKKyAgICAgICAgZHN0LT5yYlJlZmVyZW5jZXMgPSBBTExPQ19OKFZBTFVFLCBkc3QtPmxheW91dC0+cmVmZXJlbmNlRmllbGRDb3VudCk7CisgICAgICAgIG1lbWNweShkc3QtPnJiUmVmZXJlbmNlcywgc3JjLT5yYlJlZmVyZW5jZXMsIGRzdC0+bGF5b3V0LT5yZWZlcmVuY2VGaWVsZENvdW50ICogc2l6ZW9mKFZBTFVFKSk7CisgICAgfQorICAgICAgICAKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIFZBTFVFCitzdHJ1Y3RfY2xhc3NfbGF5b3V0KFZBTFVFIGtsYXNzKQoreworICAgIFZBTFVFIGxheW91dDsKKyAgICBpZiAoIXJiX2l2YXJfZGVmaW5lZChrbGFzcywgaWRfbGF5b3V0X2l2YXIpKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJubyBTdHJ1Y3QgbGF5b3V0IGNvbmZpZ3VyZWQgZm9yICVzIiwgcmJfY2xhc3MybmFtZShrbGFzcykpOworICAgIH0KKworICAgIGxheW91dCA9IHJiX2l2YXJfZ2V0KGtsYXNzLCBpZF9sYXlvdXRfaXZhcik7CisgICAgaWYgKCFyYl9vYmpfaXNfa2luZF9vZihsYXlvdXQsIHJiZmZpX1N0cnVjdExheW91dENsYXNzKSkgeworICAgICAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAiaW52YWxpZCBTdHJ1Y3QgbGF5b3V0IGZvciAlcyIsIHJiX2NsYXNzMm5hbWUoa2xhc3MpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGF5b3V0OworfQorCitzdGF0aWMgU3RydWN0TGF5b3V0Kgorc3RydWN0X2xheW91dChWQUxVRSBzZWxmKQoreworICAgIFN0cnVjdCogcyA9IChTdHJ1Y3QgKikgREFUQV9QVFIoc2VsZik7CisgICAgaWYgKHMtPmxheW91dCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzLT5sYXlvdXQ7CisgICAgfQorCisgICAgaWYgKHMtPmxheW91dCA9PSBOVUxMKSB7CisgICAgICAgIHMtPnJiTGF5b3V0ID0gc3RydWN0X2NsYXNzX2xheW91dChDTEFTU19PRihzZWxmKSk7CisgICAgICAgIERhdGFfR2V0X1N0cnVjdChzLT5yYkxheW91dCwgU3RydWN0TGF5b3V0LCBzLT5sYXlvdXQpOworICAgIH0KKworICAgIHJldHVybiBzLT5sYXlvdXQ7Cit9CisKK3N0YXRpYyBTdHJ1Y3QqCitzdHJ1Y3RfdmFsaWRhdGUoVkFMVUUgc2VsZikKK3sKKyAgICBTdHJ1Y3QqIHM7CisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFN0cnVjdCwgcyk7CisKKyAgICBpZiAoc3RydWN0X2xheW91dChzZWxmKSA9PSBOVUxMKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJzdHJ1Y3QgbGF5b3V0ID09IG51bGwiKTsKKyAgICB9CisKKyAgICBpZiAocy0+cG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAgIHN0cnVjdF9tYWxsb2Mocyk7CisgICAgfQorCisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJ1Y3RfbWFsbG9jKFN0cnVjdCogcykKK3sKKyAgICBpZiAocy0+cmJQb2ludGVyID09IFFuaWwpIHsKKyAgICAgICAgcy0+cmJQb2ludGVyID0gcmJmZmlfTWVtb3J5UG9pbnRlcl9OZXdJbnN0YW5jZShzLT5sYXlvdXQtPnNpemUsIDEsIHRydWUpOworCisgICAgfSBlbHNlIGlmICghcmJfb2JqX2lzX2tpbmRfb2Yocy0+cmJQb2ludGVyLCByYmZmaV9BYnN0cmFjdE1lbW9yeUNsYXNzKSkgeworICAgICAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAiaW52YWxpZCBwb2ludGVyIGluIHN0cnVjdCIpOworICAgIH0KKworICAgIHMtPnBvaW50ZXIgPSAoQWJzdHJhY3RNZW1vcnkgKikgREFUQV9QVFIocy0+cmJQb2ludGVyKTsKK30KKworc3RhdGljIHZvaWQKK3N0cnVjdF9tYXJrKFN0cnVjdCAqcykKK3sKKyAgICByYl9nY19tYXJrKHMtPnJiUG9pbnRlcik7CisgICAgcmJfZ2NfbWFyayhzLT5yYkxheW91dCk7CisgICAgaWYgKHMtPnJiUmVmZXJlbmNlcyAhPSBOVUxMKSB7CisgICAgICAgIHJiX2djX21hcmtfbG9jYXRpb25zKCZzLT5yYlJlZmVyZW5jZXNbMF0sICZzLT5yYlJlZmVyZW5jZXNbcy0+bGF5b3V0LT5yZWZlcmVuY2VGaWVsZENvdW50XSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc3RydWN0X2ZyZWUoU3RydWN0KiBzKQoreworICAgIHhmcmVlKHMtPnJiUmVmZXJlbmNlcyk7CisgICAgeGZyZWUocyk7Cit9CisKKworc3RhdGljIHZvaWQKK3N0b3JlX3JlZmVyZW5jZV92YWx1ZShTdHJ1Y3RGaWVsZCogZiwgU3RydWN0KiBzLCBWQUxVRSB2YWx1ZSkKK3sKKyAgICBpZiAodW5saWtlbHkoZi0+cmVmZXJlbmNlSW5kZXggPT0gLTEpKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJwdXRfcmVmZXJlbmNlX3ZhbHVlIGNhbGxlZCBmb3Igbm9uLXJlZmVyZW5jZSB0eXBlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHMtPnJiUmVmZXJlbmNlcyA9PSBOVUxMKSB7CisgICAgICAgIGludCBpOworICAgICAgICBzLT5yYlJlZmVyZW5jZXMgPSBBTExPQ19OKFZBTFVFLCBzLT5sYXlvdXQtPnJlZmVyZW5jZUZpZWxkQ291bnQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bGF5b3V0LT5yZWZlcmVuY2VGaWVsZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHMtPnJiUmVmZXJlbmNlc1tpXSA9IFFuaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5yYlJlZmVyZW5jZXNbZi0+cmVmZXJlbmNlSW5kZXhdID0gdmFsdWU7Cit9CisKKworc3RhdGljIFZBTFVFCitzdHJ1Y3RfZmllbGQoU3RydWN0KiBzLCBWQUxVRSBmaWVsZE5hbWUpCit7CisgICAgU3RydWN0TGF5b3V0KiBsYXlvdXQgPSBzLT5sYXlvdXQ7CisgICAgVkFMVUUgcmJGaWVsZDsKKworICAgIGlmIChsaWtlbHkoU1lNQk9MX1AoZmllbGROYW1lKSAmJiBzdF9sb29rdXAobGF5b3V0LT5maWVsZFN5bWJvbFRhYmxlLCBmaWVsZE5hbWUsIChzdF9kYXRhX3QgKikgJnJiRmllbGQpKSkgeworICAgICAgICByZXR1cm4gcmJGaWVsZDsKKyAgICB9CisKKyAgICAvLyBUT0RPIGRvZXMgdGhpcyBldmVyIHJldHVybiBhbnl0aGluZz8KKyAgICByYkZpZWxkID0gcmJfaGFzaF9hcmVmKGxheW91dC0+cmJGaWVsZE1hcCwgZmllbGROYW1lKTsKKyAgICBpZiAocmJGaWVsZCA9PSBRbmlsKSB7CisgICAgICAgIFZBTFVFIHN0ciA9IHJiX2Z1bmNhbGwyKGZpZWxkTmFtZSwgaWRfdG9fcywgMCwgTlVMTCk7CisgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIk5vIHN1Y2ggZmllbGQgJyVzJyIsIFN0cmluZ1ZhbHVlUHRyKHN0cikpOworICAgIH0KKworICAgIHJldHVybiByYkZpZWxkOworfQorCisvKgorICogY2FsbC1zZXE6IHN0cnVjdFtmaWVsZF9uYW1lXQorICogQHBhcmFtIGZpZWxkX25hbWUgZmllbGQgdG8gYWNjZXNzCisgKiBBY2NlcyB0byBhIFN0cnVjdCBmaWVsZC4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfYXJlZihWQUxVRSBzZWxmLCBWQUxVRSBmaWVsZE5hbWUpCit7CisgICAgU3RydWN0KiBzOworICAgIFZBTFVFIHJiRmllbGQ7CisgICAgU3RydWN0RmllbGQqIGY7CisKKyAgICBzID0gc3RydWN0X3ZhbGlkYXRlKHNlbGYpOworCisgICAgcmJGaWVsZCA9IHN0cnVjdF9maWVsZChzLCBmaWVsZE5hbWUpOworICAgIGYgPSAoU3RydWN0RmllbGQgKikgREFUQV9QVFIocmJGaWVsZCk7CisKKyAgICBpZiAoZi0+Z2V0ICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuICgqZi0+Z2V0KShmLCBzKTsKKyAgICAKKyAgICB9IGVsc2UgaWYgKGYtPm1lbW9yeU9wICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuICgqZi0+bWVtb3J5T3AtPmdldCkocy0+cG9pbnRlciwgZi0+b2Zmc2V0KTsKKworICAgIH0gZWxzZSB7CisgICAgCisgICAgICAgIC8qIGNhbGwgdXAgdG8gdGhlIHJ1YnkgY29kZSB0byBmZXRjaCB0aGUgdmFsdWUgKi8KKyAgICAgICAgcmV0dXJuIHJiX2Z1bmNhbGwyKHJiRmllbGQsIGlkX2dldCwgMSwgJnMtPnJiUG9pbnRlcik7CisgICAgfQorfQorCisvKgorICogY2FsbC1zZXE6IFtdPShmaWVsZF9uYW1lLCB2YWx1ZSkKKyAqIEBwYXJhbSBmaWVsZF9uYW1lIGZpZWxkIHRvIGFjY2VzcworICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHNldCB0byArZmllbGRfbmFtZSsKKyAqIEByZXR1cm4gW3ZhbHVlXQorICogU2V0IGEgZmllbGQgaW4gU3RydWN0LgorICovCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9hc2V0KFZBTFVFIHNlbGYsIFZBTFVFIGZpZWxkTmFtZSwgVkFMVUUgdmFsdWUpCit7CisgICAgU3RydWN0KiBzOworICAgIFZBTFVFIHJiRmllbGQ7CisgICAgU3RydWN0RmllbGQqIGY7CisKKworICAgIHMgPSBzdHJ1Y3RfdmFsaWRhdGUoc2VsZik7CisKKyAgICByYkZpZWxkID0gc3RydWN0X2ZpZWxkKHMsIGZpZWxkTmFtZSk7CisgICAgZiA9IChTdHJ1Y3RGaWVsZCAqKSBEQVRBX1BUUihyYkZpZWxkKTsKKyAgICBpZiAoZi0+cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgKCpmLT5wdXQpKGYsIHMsIHZhbHVlKTsKKworICAgIH0gZWxzZSBpZiAoZi0+bWVtb3J5T3AgIT0gTlVMTCkgeworCisgICAgICAgICgqZi0+bWVtb3J5T3AtPnB1dCkocy0+cG9pbnRlciwgZi0+b2Zmc2V0LCB2YWx1ZSk7CisgICAgCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY2FsbCB1cCB0byB0aGUgcnVieSBjb2RlIHRvIHNldCB0aGUgdmFsdWUgKi8KKyAgICAgICAgVkFMVUUgYXJndlsyXTsKKyAgICAgICAgYXJndlswXSA9IHMtPnJiUG9pbnRlcjsKKyAgICAgICAgYXJndlsxXSA9IHZhbHVlOworICAgICAgICByYl9mdW5jYWxsMihyYkZpZWxkLCBpZF9wdXQsIDIsIGFyZ3YpOworICAgIH0KKworICAgIGlmIChmLT5yZWZlcmVuY2VSZXF1aXJlZCkgeworICAgICAgICBzdG9yZV9yZWZlcmVuY2VfdmFsdWUoZiwgcywgdmFsdWUpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogcG9pbnRlcj0gcG9pbnRlcgorICogQHBhcmFtIFtBYnN0cmFjdE1lbW9yeV0gcG9pbnRlcgorICogQHJldHVybiBbc2VsZl0KKyAqIE1ha2UgU3RydWN0IHBvaW50IHRvICtwb2ludGVyKy4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3Rfc2V0X3BvaW50ZXIoVkFMVUUgc2VsZiwgVkFMVUUgcG9pbnRlcikKK3sKKyAgICBTdHJ1Y3QqIHM7CisgICAgU3RydWN0TGF5b3V0KiBsYXlvdXQ7CisgICAgQWJzdHJhY3RNZW1vcnkqIG1lbW9yeTsKKworICAgIGlmICghcmJfb2JqX2lzX2tpbmRfb2YocG9pbnRlciwgcmJmZmlfQWJzdHJhY3RNZW1vcnlDbGFzcykpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIndyb25nIGFyZ3VtZW50IHR5cGUgJXMgKGV4cGVjdGVkIFBvaW50ZXIgb3IgQnVmZmVyKSIsCisgICAgICAgICAgICAgICAgcmJfb2JqX2NsYXNzbmFtZShwb2ludGVyKSk7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKworICAgIAorICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3QsIHMpOworICAgIERhdGFfR2V0X1N0cnVjdChwb2ludGVyLCBBYnN0cmFjdE1lbW9yeSwgbWVtb3J5KTsKKyAgICBsYXlvdXQgPSBzdHJ1Y3RfbGF5b3V0KHNlbGYpOworCisgICAgaWYgKChpbnQpIGxheW91dC0+YmFzZS5mZmlUeXBlLT5zaXplID4gbWVtb3J5LT5zaXplKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIm1lbW9yeSBvZiAlbGQgYnl0ZXMgdG9vIHNtYWxsIGZvciBzdHJ1Y3QgJXMgKGV4cGVjdGVkIGF0IGxlYXN0ICVsZCkiLAorICAgICAgICAgICAgICAgIG1lbW9yeS0+c2l6ZSwgcmJfb2JqX2NsYXNzbmFtZShzZWxmKSwgKGxvbmcpIGxheW91dC0+YmFzZS5mZmlUeXBlLT5zaXplKTsKKyAgICB9CisgICAgCisgICAgcy0+cG9pbnRlciA9IE1FTU9SWShwb2ludGVyKTsKKyAgICBzLT5yYlBvaW50ZXIgPSBwb2ludGVyOworICAgIHJiX2l2YXJfc2V0KHNlbGYsIGlkX3BvaW50ZXJfaXZhciwgcG9pbnRlcik7CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBwb2ludGVyCisgKiBAcmV0dXJuIFtBYnN0cmFjdE1lbW9yeV0KKyAqIEdldCBwb2ludGVyIHRvIFN0cnVjdCBjb250ZW50cy4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfZ2V0X3BvaW50ZXIoVkFMVUUgc2VsZikKK3sKKyAgICBTdHJ1Y3QqIHM7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0LCBzKTsKKworICAgIHJldHVybiBzLT5yYlBvaW50ZXI7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbGF5b3V0PSBsYXlvdXQKKyAqIEBwYXJhbSBbU3RydWN0TGF5b3V0XSBsYXlvdXQKKyAqIEByZXR1cm4gW3NlbGZdCisgKiBTZXQgdGhlIFN0cnVjdCdzIGxheW91dC4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3Rfc2V0X2xheW91dChWQUxVRSBzZWxmLCBWQUxVRSBsYXlvdXQpCit7CisgICAgU3RydWN0KiBzOworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3QsIHMpOworCisgICAgaWYgKCFyYl9vYmpfaXNfa2luZF9vZihsYXlvdXQsIHJiZmZpX1N0cnVjdExheW91dENsYXNzKSkgeworICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAid3JvbmcgYXJndW1lbnQgdHlwZSAlcyAoZXhwZWN0ZWQgJXMpIiwKKyAgICAgICAgICAgICAgICByYl9vYmpfY2xhc3NuYW1lKGxheW91dCksIHJiX2NsYXNzMm5hbWUocmJmZmlfU3RydWN0TGF5b3V0Q2xhc3MpKTsKKyAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgfQorCisgICAgRGF0YV9HZXRfU3RydWN0KGxheW91dCwgU3RydWN0TGF5b3V0LCBzLT5sYXlvdXQpOworICAgIHJiX2l2YXJfc2V0KHNlbGYsIGlkX2xheW91dF9pdmFyLCBsYXlvdXQpOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbGF5b3V0CisgKiBAcmV0dXJuIFtTdHJ1Y3RMYXlvdXRdCisgKiBHZXQgdGhlIFN0cnVjdCdzIGxheW91dC4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfZ2V0X2xheW91dChWQUxVRSBzZWxmKQoreworICAgIFN0cnVjdCogczsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3QsIHMpOworCisgICAgcmV0dXJuIHMtPnJiTGF5b3V0OworfQorCisvKgorICogY2FsbC1zZXE6IG51bGw/CisgKiBAcmV0dXJuIFtCb29sZWFuXQorICogVGVzdCBpZiBTdHJ1Y3QncyBwb2ludGVyIGlzIE5VTEwKKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfbnVsbF9wKFZBTFVFIHNlbGYpCit7CisgICAgU3RydWN0KiBzOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFN0cnVjdCwgcyk7CisKKyAgICByZXR1cm4gcy0+cG9pbnRlci0+YWRkcmVzcyA9PSBOVUxMID8gUXRydWUgOiBRZmFsc2U7Cit9CisKKy8qCisgKiAoc2VlIFBvaW50ZXIjb3JkZXIpCisgKi8KK3N0YXRpYyBWQUxVRQorc3RydWN0X29yZGVyKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZikKK3sKKyAgICBTdHJ1Y3QqIHM7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0LCBzKTsKKyAgICBpZiAoYXJnYyA9PSAwKSB7CisgICAgICAgIHJldHVybiByYl9mdW5jYWxsKHMtPnJiUG9pbnRlciwgcmJfaW50ZXJuKCJvcmRlciIpLCAwKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIFZBTFVFIHJldHZhbCA9IHJiX29ial9kdXAoc2VsZik7CisgICAgICAgIFZBTFVFIHJiUG9pbnRlciA9IHJiX2Z1bmNhbGwyKHMtPnJiUG9pbnRlciwgcmJfaW50ZXJuKCJvcmRlciIpLCBhcmdjLCBhcmd2KTsKKyAgICAgICAgc3RydWN0X3NldF9wb2ludGVyKHJldHZhbCwgcmJQb2ludGVyKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorfQorCitzdGF0aWMgVkFMVUUKK2lubGluZV9hcnJheV9hbGxvY2F0ZShWQUxVRSBrbGFzcykKK3sKKyAgICBJbmxpbmVBcnJheSogYXJyYXk7CisgICAgVkFMVUUgb2JqOworCisgICAgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgSW5saW5lQXJyYXksIGlubGluZV9hcnJheV9tYXJrLCAtMSwgYXJyYXkpOworICAgIGFycmF5LT5yYkZpZWxkID0gUW5pbDsKKyAgICBhcnJheS0+cmJNZW1vcnkgPSBRbmlsOworCisgICAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQKK2lubGluZV9hcnJheV9tYXJrKElubGluZUFycmF5KiBhcnJheSkKK3sKKyAgICByYl9nY19tYXJrKGFycmF5LT5yYkZpZWxkKTsKKyAgICByYl9nY19tYXJrKGFycmF5LT5yYk1lbW9yeSk7Cit9CisKKy8qCisgKiBEb2N1bWVudC1tZXRob2Q6IEZGSTo6U3RydWN0OjpJbmxpbmVBcnJheSNpbml0aWFsaXplCisgKiBjYWxsLXNlcTogaW5pdGlhbGl6ZShtZW1vcnksIGZpZWxkKQorICogQHBhcmFtIFtBYnN0cmFjdE1lbW9yeV0gbWVtb3J5CisgKiBAcGFyYW0gW1N0cnVjdEZpZWxkXSBmaWVsZAorICogQHJldHVybiBbc2VsZl0KKyAqLworc3RhdGljIFZBTFVFCitpbmxpbmVfYXJyYXlfaW5pdGlhbGl6ZShWQUxVRSBzZWxmLCBWQUxVRSByYk1lbW9yeSwgVkFMVUUgcmJGaWVsZCkKK3sKKyAgICBJbmxpbmVBcnJheSogYXJyYXk7CisgICAgCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIElubGluZUFycmF5LCBhcnJheSk7CisgICAgYXJyYXktPnJiTWVtb3J5ID0gcmJNZW1vcnk7CisgICAgYXJyYXktPnJiRmllbGQgPSByYkZpZWxkOworCisgICAgRGF0YV9HZXRfU3RydWN0KHJiTWVtb3J5LCBBYnN0cmFjdE1lbW9yeSwgYXJyYXktPm1lbW9yeSk7CisgICAgRGF0YV9HZXRfU3RydWN0KHJiRmllbGQsIFN0cnVjdEZpZWxkLCBhcnJheS0+ZmllbGQpOworICAgIERhdGFfR2V0X1N0cnVjdChhcnJheS0+ZmllbGQtPnJiVHlwZSwgQXJyYXlUeXBlLCBhcnJheS0+YXJyYXlUeXBlKTsKKyAgICBEYXRhX0dldF9TdHJ1Y3QoYXJyYXktPmFycmF5VHlwZS0+cmJDb21wb25lbnRUeXBlLCBUeXBlLCBhcnJheS0+Y29tcG9uZW50VHlwZSk7CisgICAgCisgICAgYXJyYXktPm9wID0gZ2V0X21lbW9yeV9vcChhcnJheS0+Y29tcG9uZW50VHlwZSk7CisgICAgaWYgKGFycmF5LT5vcCA9PSBOVUxMICYmIGFycmF5LT5jb21wb25lbnRUeXBlLT5uYXRpdmVUeXBlID09IE5BVElWRV9NQVBQRUQpIHsKKyAgICAgICAgYXJyYXktPm9wID0gZ2V0X21lbW9yeV9vcCgoKE1hcHBlZFR5cGUgKikgYXJyYXktPmNvbXBvbmVudFR5cGUpLT50eXBlKTsKKyAgICB9CisgICAgCisgICAgYXJyYXktPmxlbmd0aCA9IGFycmF5LT5hcnJheVR5cGUtPmxlbmd0aDsKKworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogY2FsbC1zZXE6IHNpemUKKyAqIEByZXR1cm4gW051bWVyaWNdCisgKiBHZXQgc2l6ZQorICovCitzdGF0aWMgVkFMVUUKK2lubGluZV9hcnJheV9zaXplKFZBTFVFIHNlbGYpCit7CisgICAgSW5saW5lQXJyYXkqIGFycmF5OworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIElubGluZUFycmF5LCBhcnJheSk7CisKKyAgICByZXR1cm4gVUlOVDJOVU0oKChBcnJheVR5cGUgKikgYXJyYXktPmZpZWxkLT50eXBlKS0+bGVuZ3RoKTsKK30KKworc3RhdGljIGludAoraW5saW5lX2FycmF5X29mZnNldChJbmxpbmVBcnJheSogYXJyYXksIGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5kZXggPCAwIHx8IChpbmRleCA+PSBhcnJheS0+bGVuZ3RoICYmIGFycmF5LT5sZW5ndGggPiAwKSkgeworICAgICAgICByYl9yYWlzZShyYl9lSW5kZXhFcnJvciwgImluZGV4ICVkIG91dCBvZiBib3VuZHMiLCBpbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIChpbnQpIGFycmF5LT5maWVsZC0+b2Zmc2V0ICsgKGluZGV4ICogKGludCkgYXJyYXktPmNvbXBvbmVudFR5cGUtPmZmaVR5cGUtPnNpemUpOworfQorCisvKgorICogY2FsbC1zZXE6IFtdKGluZGV4KQorICogQHBhcmFtIFtOdW1lcmljXSBpbmRleAorICogQHJldHVybiBbVHlwZSwgU3RydWN0XQorICovCitzdGF0aWMgVkFMVUUKK2lubGluZV9hcnJheV9hcmVmKFZBTFVFIHNlbGYsIFZBTFVFIHJiSW5kZXgpCit7CisgICAgSW5saW5lQXJyYXkqIGFycmF5OworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIElubGluZUFycmF5LCBhcnJheSk7CisKKyAgICBpZiAoYXJyYXktPm9wICE9IE5VTEwpIHsKKyAgICAgICAgVkFMVUUgcmJOYXRpdmVWYWx1ZSA9IGFycmF5LT5vcC0+Z2V0KGFycmF5LT5tZW1vcnksIAorICAgICAgICAgICAgICAgIGlubGluZV9hcnJheV9vZmZzZXQoYXJyYXksIE5VTTJJTlQocmJJbmRleCkpKTsKKyAgICAgICAgaWYgKHVubGlrZWx5KGFycmF5LT5jb21wb25lbnRUeXBlLT5uYXRpdmVUeXBlID09IE5BVElWRV9NQVBQRUQpKSB7CisgICAgICAgICAgICByZXR1cm4gcmJfZnVuY2FsbCgoKE1hcHBlZFR5cGUgKikgYXJyYXktPmNvbXBvbmVudFR5cGUpLT5yYkNvbnZlcnRlciwgCisgICAgICAgICAgICAgICAgICAgIHJiX2ludGVybigiZnJvbV9uYXRpdmUiKSwgMiwgcmJOYXRpdmVWYWx1ZSwgUW5pbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmJOYXRpdmVWYWx1ZTsgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgfSBlbHNlIGlmIChhcnJheS0+Y29tcG9uZW50VHlwZS0+bmF0aXZlVHlwZSA9PSBOQVRJVkVfU1RSVUNUKSB7CisgICAgICAgIFZBTFVFIHJiT2Zmc2V0ID0gSU5UMk5VTShpbmxpbmVfYXJyYXlfb2Zmc2V0KGFycmF5LCBOVU0ySU5UKHJiSW5kZXgpKSk7CisgICAgICAgIFZBTFVFIHJiTGVuZ3RoID0gSU5UMk5VTShhcnJheS0+Y29tcG9uZW50VHlwZS0+ZmZpVHlwZS0+c2l6ZSk7CisgICAgICAgIFZBTFVFIHJiUG9pbnRlciA9IHJiX2Z1bmNhbGwoYXJyYXktPnJiTWVtb3J5LCByYl9pbnRlcm4oInNsaWNlIiksIDIsIHJiT2Zmc2V0LCByYkxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuIHJiX2NsYXNzX25ld19pbnN0YW5jZSgxLCAmcmJQb2ludGVyLCAoKFN0cnVjdEJ5VmFsdWUgKikgYXJyYXktPmNvbXBvbmVudFR5cGUpLT5yYlN0cnVjdENsYXNzKTsKKyAgICB9IGVsc2UgeworCisgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgImdldCBub3Qgc3VwcG9ydGVkIGZvciAlcyIsIHJiX29ial9jbGFzc25hbWUoYXJyYXktPmFycmF5VHlwZS0+cmJDb21wb25lbnRUeXBlKSk7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KK30KKworLyoKKyAqIGNhbGwtc2VxOiBbXT0oaW5kZXgsIHZhbHVlKQorICogQHBhcmFtIFtOdW1lcmljXSBpbmRleAorICogQHBhcmFtIFtUeXBlLCBTdHJ1Y3RdCisgKiBAcmV0dXJuIFt2YWx1ZV0KKyAqLworc3RhdGljIFZBTFVFCitpbmxpbmVfYXJyYXlfYXNldChWQUxVRSBzZWxmLCBWQUxVRSByYkluZGV4LCBWQUxVRSByYlZhbHVlKQoreworICAgIElubGluZUFycmF5KiBhcnJheTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBJbmxpbmVBcnJheSwgYXJyYXkpOworCisgICAgaWYgKGFycmF5LT5vcCAhPSBOVUxMKSB7CisgICAgICAgIGlmICh1bmxpa2VseShhcnJheS0+Y29tcG9uZW50VHlwZS0+bmF0aXZlVHlwZSA9PSBOQVRJVkVfTUFQUEVEKSkgeworICAgICAgICAgICAgcmJWYWx1ZSA9IHJiX2Z1bmNhbGwoKChNYXBwZWRUeXBlICopIGFycmF5LT5jb21wb25lbnRUeXBlKS0+cmJDb252ZXJ0ZXIsIAorICAgICAgICAgICAgICAgICAgICByYl9pbnRlcm4oInRvX25hdGl2ZSIpLCAyLCByYlZhbHVlLCBRbmlsKTsKKyAgICAgICAgfQorICAgICAgICBhcnJheS0+b3AtPnB1dChhcnJheS0+bWVtb3J5LCBpbmxpbmVfYXJyYXlfb2Zmc2V0KGFycmF5LCBOVU0ySU5UKHJiSW5kZXgpKSwKKyAgICAgICAgICAgIHJiVmFsdWUpOworICAgICAgICAKKyAgICB9IGVsc2UgaWYgKGFycmF5LT5jb21wb25lbnRUeXBlLT5uYXRpdmVUeXBlID09IE5BVElWRV9TVFJVQ1QpIHsKKyAgICAgICAgaW50IG9mZnNldCA9IGlubGluZV9hcnJheV9vZmZzZXQoYXJyYXksIE5VTTJJTlQocmJJbmRleCkpOworICAgICAgICBTdHJ1Y3QqIHM7CisKKyAgICAgICAgaWYgKCFyYl9vYmpfaXNfa2luZF9vZihyYlZhbHVlLCByYmZmaV9TdHJ1Y3RDbGFzcykpIHsKKyAgICAgICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJhcmd1bWVudCBub3QgYW4gaW5zdGFuY2Ugb2Ygc3RydWN0Iik7CisgICAgICAgICAgICByZXR1cm4gUW5pbDsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrV3JpdGUoYXJyYXktPm1lbW9yeSk7CisgICAgICAgIGNoZWNrQm91bmRzKGFycmF5LT5tZW1vcnksIG9mZnNldCwgYXJyYXktPmNvbXBvbmVudFR5cGUtPmZmaVR5cGUtPnNpemUpOworCisgICAgICAgIERhdGFfR2V0X1N0cnVjdChyYlZhbHVlLCBTdHJ1Y3QsIHMpOworICAgICAgICBjaGVja1JlYWQocy0+cG9pbnRlcik7CisgICAgICAgIGNoZWNrQm91bmRzKHMtPnBvaW50ZXIsIDAsIGFycmF5LT5jb21wb25lbnRUeXBlLT5mZmlUeXBlLT5zaXplKTsKKworICAgICAgICBtZW1jcHkoYXJyYXktPm1lbW9yeS0+YWRkcmVzcyArIG9mZnNldCwgcy0+cG9pbnRlci0+YWRkcmVzcywgYXJyYXktPmNvbXBvbmVudFR5cGUtPmZmaVR5cGUtPnNpemUpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQXJyYXlUeXBlKiBhcnJheVR5cGU7CisgICAgICAgIERhdGFfR2V0X1N0cnVjdChhcnJheS0+ZmllbGQtPnJiVHlwZSwgQXJyYXlUeXBlLCBhcnJheVR5cGUpOworCisgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgInNldCBub3Qgc3VwcG9ydGVkIGZvciAlcyIsIHJiX29ial9jbGFzc25hbWUoYXJyYXlUeXBlLT5yYkNvbXBvbmVudFR5cGUpKTsKKyAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgfQorCisgICAgcmV0dXJuIHJiVmFsdWU7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogZWFjaAorICogWWllbGQgYmxvY2sgZm9yIGVhY2ggZWxlbWVudCBvZiArc2VsZisuCisgKi8KK3N0YXRpYyBWQUxVRQoraW5saW5lX2FycmF5X2VhY2goVkFMVUUgc2VsZikKK3sKKyAgICBJbmxpbmVBcnJheSogYXJyYXk7CisgICAgCisgICAgaW50IGk7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgSW5saW5lQXJyYXksIGFycmF5KTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXJyYXktPmxlbmd0aDsgKytpKSB7CisgICAgICAgIHJiX3lpZWxkKGlubGluZV9hcnJheV9hcmVmKHNlbGYsIElOVDJGSVgoaSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyoKKyAqIGNhbGwtc2VxOiB0b19hCisgKiBAcmV0dXJuIFtBcnJheV0KKyAqIENvbnZlcnQgK3NlbGYrIHRvIGFuIGFycmF5LgorICovCitzdGF0aWMgVkFMVUUKK2lubGluZV9hcnJheV90b19hKFZBTFVFIHNlbGYpCit7CisgICAgSW5saW5lQXJyYXkqIGFycmF5OworICAgIFZBTFVFIG9iajsKKyAgICBpbnQgaTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBJbmxpbmVBcnJheSwgYXJyYXkpOworICAgIG9iaiA9IHJiX2FyeV9uZXcyKGFycmF5LT5sZW5ndGgpOworCisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IGFycmF5LT5sZW5ndGg7ICsraSkgeworICAgICAgICByYl9hcnlfcHVzaChvYmosIGlubGluZV9hcnJheV9hcmVmKHNlbGYsIElOVDJGSVgoaSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2JqOworfQorCisvKgorICogRG9jdW1lbnQtbWV0aG9kOiBGRkk6OlN0cnVjdExheW91dDo6Q2hhckFycmF5I3RvX3MKKyAqIGNhbGwtc2VxOiB0b19zCisgKiBAcmV0dXJuIFtTdHJpbmddCisgKiBDb252ZXJ0ICtzZWxmKyB0byBhIHN0cmluZy4KKyAqLworc3RhdGljIFZBTFVFCitpbmxpbmVfYXJyYXlfdG9fcyhWQUxVRSBzZWxmKQoreworICAgIElubGluZUFycmF5KiBhcnJheTsKKyAgICBWQUxVRSBhcmd2WzJdOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIElubGluZUFycmF5LCBhcnJheSk7CisgCisgICAgaWYgKGFycmF5LT5jb21wb25lbnRUeXBlLT5uYXRpdmVUeXBlICE9IE5BVElWRV9JTlQ4ICYmIGFycmF5LT5jb21wb25lbnRUeXBlLT5uYXRpdmVUeXBlICE9IE5BVElWRV9VSU5UOCkgeworICAgICAgICBWQUxVRSBkdW1teSA9IFFuaWw7CisgICAgICAgIHJldHVybiByYl9jYWxsX3N1cGVyKDAsICZkdW1teSk7CisgICAgfQorCisgICAgYXJndlswXSA9IFVJTlQyTlVNKGFycmF5LT5maWVsZC0+b2Zmc2V0KTsKKyAgICBhcmd2WzFdID0gVUlOVDJOVU0oYXJyYXktPmxlbmd0aCk7CisKKyAgICByZXR1cm4gcmJfZnVuY2FsbDIoYXJyYXktPnJiTWVtb3J5LCByYl9pbnRlcm4oImdldF9zdHJpbmciKSwgMiwgYXJndik7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogdG9fcHRyCisgKiBAcmV0dXJuIFtBYnN0cmFjdE1lbW9yeV0KKyAqIEdldCBwb2ludGVyIHRvICtzZWxmKyBjb250ZW50LgorICovCitzdGF0aWMgVkFMVUUKK2lubGluZV9hcnJheV90b19wdHIoVkFMVUUgc2VsZikKK3sKKyAgICBJbmxpbmVBcnJheSogYXJyYXk7CisgICAgCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIElubGluZUFycmF5LCBhcnJheSk7CisKKyAgICByZXR1cm4gcmJfZnVuY2FsbChhcnJheS0+cmJNZW1vcnksIHJiX2ludGVybigic2xpY2UiKSwgMiwKKyAgICAgICAgVUlOVDJOVU0oYXJyYXktPmZpZWxkLT5vZmZzZXQpLCBVSU5UMk5VTShhcnJheS0+YXJyYXlUeXBlLT5iYXNlLmZmaVR5cGUtPnNpemUpKTsKK30KKworCit2b2lkCityYmZmaV9TdHJ1Y3RfSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgVkFMVUUgU3RydWN0Q2xhc3M7CisKKyAgICByYmZmaV9TdHJ1Y3RMYXlvdXRfSW5pdChtb2R1bGVGRkkpOworCisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jbGFzczogRkZJOjpTdHJ1Y3QKKyAgICAgKgorICAgICAqIEEgRkZJOjpTdHJ1Y3QgbWVhbnMgdG8gbWlycm9yIGEgQyBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBBIFN0cnVjdCBpcyBkZWZpbmVkIGFzOgorICAgICAqICBjbGFzcyBNeVN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICogICAgbGF5b3V0IDp2YWx1ZTEsIDppbnQsCisgICAgICogICAgICAgICAgIDp2YWx1ZTIsIDpkb3VibGUKKyAgICAgKiAgZW5kCisgICAgICogYW5kIGlzIHVzZWQgYXM6CisgICAgICogIG15X3N0cnVjdCA9IE15U3RydWN0Lm5ldworICAgICAqICBteV9zdHJ1Y3RbOnZhbHVlMV0gPSAxMgorICAgICAqCisgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vZ2l0aHViLmNvbS9mZmkvZmZpL3dpa2kvU3RydWN0cworICAgICAqLworICAgIHJiZmZpX1N0cnVjdENsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKG1vZHVsZUZGSSwgIlN0cnVjdCIsIHJiX2NPYmplY3QpOworICAgIFN0cnVjdENsYXNzID0gcmJmZmlfU3RydWN0Q2xhc3M7IC8vIHB1dCBvbiBhIGxpbmUgYWxvbmUgdG8gaGVscCBSRG9jCisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9TdHJ1Y3RDbGFzcyk7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OlN0cnVjdDo6SW5saW5lQXJyYXkKKyAgICAgKi8KKyAgICByYmZmaV9TdHJ1Y3RJbmxpbmVBcnJheUNsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKHJiZmZpX1N0cnVjdENsYXNzLCAiSW5saW5lQXJyYXkiLCByYl9jT2JqZWN0KTsKKyAgICByYl9nbG9iYWxfdmFyaWFibGUoJnJiZmZpX1N0cnVjdElubGluZUFycmF5Q2xhc3MpOworCisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jbGFzczogRkZJOjpTdHJ1Y3RMYXlvdXQ6OkNoYXJBcnJheSA8IEZGSTo6U3RydWN0OjpJbmxpbmVBcnJheQorICAgICAqLworICAgIHJiZmZpX1N0cnVjdExheW91dENoYXJBcnJheUNsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKHJiZmZpX1N0cnVjdExheW91dENsYXNzLCAiQ2hhckFycmF5IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJmZmlfU3RydWN0SW5saW5lQXJyYXlDbGFzcyk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9TdHJ1Y3RMYXlvdXRDaGFyQXJyYXlDbGFzcyk7CisKKworICAgIHJiX2RlZmluZV9hbGxvY19mdW5jKFN0cnVjdENsYXNzLCBzdHJ1Y3RfYWxsb2NhdGUpOworICAgIHJiX2RlZmluZV9tZXRob2QoU3RydWN0Q2xhc3MsICJpbml0aWFsaXplIiwgc3RydWN0X2luaXRpYWxpemUsIC0xKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKFN0cnVjdENsYXNzLCAiaW5pdGlhbGl6ZV9jb3B5Iiwgc3RydWN0X2luaXRpYWxpemVfY29weSwgMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChTdHJ1Y3RDbGFzcywgIm9yZGVyIiwgc3RydWN0X29yZGVyLCAtMSk7CisgICAgCisgICAgcmJfZGVmaW5lX2FsaWFzKHJiX3NpbmdsZXRvbl9jbGFzcyhTdHJ1Y3RDbGFzcyksICJhbGxvY19pbiIsICJuZXciKTsKKyAgICByYl9kZWZpbmVfYWxpYXMocmJfc2luZ2xldG9uX2NsYXNzKFN0cnVjdENsYXNzKSwgImFsbG9jX291dCIsICJuZXciKTsKKyAgICByYl9kZWZpbmVfYWxpYXMocmJfc2luZ2xldG9uX2NsYXNzKFN0cnVjdENsYXNzKSwgImFsbG9jX2lub3V0IiwgIm5ldyIpOworICAgIHJiX2RlZmluZV9hbGlhcyhyYl9zaW5nbGV0b25fY2xhc3MoU3RydWN0Q2xhc3MpLCAibmV3X2luIiwgIm5ldyIpOworICAgIHJiX2RlZmluZV9hbGlhcyhyYl9zaW5nbGV0b25fY2xhc3MoU3RydWN0Q2xhc3MpLCAibmV3X291dCIsICJuZXciKTsKKyAgICByYl9kZWZpbmVfYWxpYXMocmJfc2luZ2xldG9uX2NsYXNzKFN0cnVjdENsYXNzKSwgIm5ld19pbm91dCIsICJuZXciKTsKKworICAgIHJiX2RlZmluZV9tZXRob2QoU3RydWN0Q2xhc3MsICJwb2ludGVyIiwgc3RydWN0X2dldF9wb2ludGVyLCAwKTsKKyAgICByYl9kZWZpbmVfcHJpdmF0ZV9tZXRob2QoU3RydWN0Q2xhc3MsICJwb2ludGVyPSIsIHN0cnVjdF9zZXRfcG9pbnRlciwgMSk7CisKKyAgICByYl9kZWZpbmVfbWV0aG9kKFN0cnVjdENsYXNzLCAibGF5b3V0Iiwgc3RydWN0X2dldF9sYXlvdXQsIDApOworICAgIHJiX2RlZmluZV9wcml2YXRlX21ldGhvZChTdHJ1Y3RDbGFzcywgImxheW91dD0iLCBzdHJ1Y3Rfc2V0X2xheW91dCwgMSk7CisKKyAgICByYl9kZWZpbmVfbWV0aG9kKFN0cnVjdENsYXNzLCAiW10iLCBzdHJ1Y3RfYXJlZiwgMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChTdHJ1Y3RDbGFzcywgIltdPSIsIHN0cnVjdF9hc2V0LCAyKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKFN0cnVjdENsYXNzLCAibnVsbD8iLCBzdHJ1Y3RfbnVsbF9wLCAwKTsKKworICAgIHJiX2luY2x1ZGVfbW9kdWxlKHJiZmZpX1N0cnVjdElubGluZUFycmF5Q2xhc3MsIHJiX21FbnVtZXJhYmxlKTsKKyAgICByYl9kZWZpbmVfYWxsb2NfZnVuYyhyYmZmaV9TdHJ1Y3RJbmxpbmVBcnJheUNsYXNzLCBpbmxpbmVfYXJyYXlfYWxsb2NhdGUpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0SW5saW5lQXJyYXlDbGFzcywgImluaXRpYWxpemUiLCBpbmxpbmVfYXJyYXlfaW5pdGlhbGl6ZSwgMik7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RJbmxpbmVBcnJheUNsYXNzLCAiW10iLCBpbmxpbmVfYXJyYXlfYXJlZiwgMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RJbmxpbmVBcnJheUNsYXNzLCAiW109IiwgaW5saW5lX2FycmF5X2FzZXQsIDIpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0SW5saW5lQXJyYXlDbGFzcywgImVhY2giLCBpbmxpbmVfYXJyYXlfZWFjaCwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RJbmxpbmVBcnJheUNsYXNzLCAic2l6ZSIsIGlubGluZV9hcnJheV9zaXplLCAwKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdElubGluZUFycmF5Q2xhc3MsICJ0b19hIiwgaW5saW5lX2FycmF5X3RvX2EsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0SW5saW5lQXJyYXlDbGFzcywgInRvX3B0ciIsIGlubGluZV9hcnJheV90b19wdHIsIDApOworCisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RMYXlvdXRDaGFyQXJyYXlDbGFzcywgInRvX3MiLCBpbmxpbmVfYXJyYXlfdG9fcywgMCk7CisgICAgcmJfZGVmaW5lX2FsaWFzKHJiZmZpX1N0cnVjdExheW91dENoYXJBcnJheUNsYXNzLCAidG9fc3RyIiwgInRvX3MiKTsKKworICAgIGlkX3BvaW50ZXJfaXZhciA9IHJiX2ludGVybigiQHBvaW50ZXIiKTsKKyAgICBpZF9sYXlvdXRfaXZhciA9IHJiX2ludGVybigiQGxheW91dCIpOworICAgIGlkX2xheW91dCA9IHJiX2ludGVybigibGF5b3V0Iik7CisgICAgaWRfZ2V0ID0gcmJfaW50ZXJuKCJnZXQiKTsKKyAgICBpZF9wdXQgPSByYl9pbnRlcm4oInB1dCIpOworICAgIGlkX3RvX3B0ciA9IHJiX2ludGVybigidG9fcHRyIik7CisgICAgaWRfdG9fcyA9IHJiX2ludGVybigidG9fcyIpOworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3QuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTgyNjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3QuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgTHVjIEhlaW5yaWNoIDxsdWNAaG9uay1ob25rLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSQkZGSV9TVFJVQ1RfSAorI2RlZmluZQlSQkZGSV9TVFJVQ1RfSAorCisjaW5jbHVkZSAiZXh0Y29uZi5oIgorI2luY2x1ZGUgIkFic3RyYWN0TWVtb3J5LmgiCisjaW5jbHVkZSAiVHlwZS5oIgorI2lmZGVmIFJVQllfMV85CisjaW5jbHVkZSA8cnVieS9zdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdC5oPgorI2VuZGlmCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworICAgIGV4dGVybiB2b2lkIHJiZmZpX1N0cnVjdF9Jbml0KFZBTFVFIGZmaU1vZHVsZSk7CisgICAgZXh0ZXJuIHZvaWQgcmJmZmlfU3RydWN0TGF5b3V0X0luaXQoVkFMVUUgZmZpTW9kdWxlKTsKKyAgICB0eXBlZGVmIHN0cnVjdCBTdHJ1Y3RGaWVsZF8gU3RydWN0RmllbGQ7CisgICAgdHlwZWRlZiBzdHJ1Y3QgU3RydWN0TGF5b3V0XyBTdHJ1Y3RMYXlvdXQ7CisgICAgdHlwZWRlZiBzdHJ1Y3QgU3RydWN0XyBTdHJ1Y3Q7CisKKyAgICBzdHJ1Y3QgU3RydWN0RmllbGRfIHsKKyAgICAgICAgVHlwZSogdHlwZTsKKyAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKKworICAgICAgICBpbnQgcmVmZXJlbmNlSW5kZXg7CisKKyAgICAgICAgYm9vbCByZWZlcmVuY2VSZXF1aXJlZDsKKyAgICAgICAgVkFMVUUgcmJUeXBlOworICAgICAgICBWQUxVRSByYk5hbWU7CisKKyAgICAgICAgVkFMVUUgKCpnZXQpKFN0cnVjdEZpZWxkKiBmaWVsZCwgU3RydWN0KiBzKTsKKyAgICAgICAgdm9pZCAoKnB1dCkoU3RydWN0RmllbGQqIGZpZWxkLCBTdHJ1Y3QqIHMsIFZBTFVFIHZhbHVlKTsKKworICAgICAgICBNZW1vcnlPcCogbWVtb3J5T3A7CisgICAgfTsKKworICAgIHN0cnVjdCBTdHJ1Y3RMYXlvdXRfIHsKKyAgICAgICAgVHlwZSBiYXNlOworICAgICAgICBTdHJ1Y3RGaWVsZCoqIGZpZWxkczsKKyAgICAgICAgaW50IGZpZWxkQ291bnQ7CisgICAgICAgIGludCBzaXplOworICAgICAgICBpbnQgYWxpZ247CisgICAgICAgIGZmaV90eXBlKiogZmZpVHlwZXM7CisgICAgICAgIHN0cnVjdCBzdF90YWJsZSogZmllbGRTeW1ib2xUYWJsZTsKKworICAgICAgICAvKiogVGhlIG51bWJlciBvZiByZWZlcmVuY2UgdHJhY2tpbmcgZmllbGRzIGluIHRoaXMgc3RydWN0ICovCisgICAgICAgIGludCByZWZlcmVuY2VGaWVsZENvdW50OworICAgICAgICAKKyAgICAgICAgVkFMVUUgcmJGaWVsZE5hbWVzOworICAgICAgICBWQUxVRSByYkZpZWxkTWFwOworICAgICAgICBWQUxVRSByYkZpZWxkczsKKyAgICB9OworCisgICAgc3RydWN0IFN0cnVjdF8geworICAgICAgICBTdHJ1Y3RMYXlvdXQqIGxheW91dDsKKyAgICAgICAgQWJzdHJhY3RNZW1vcnkqIHBvaW50ZXI7CisgICAgICAgIFZBTFVFKiByYlJlZmVyZW5jZXM7CisKKyAgICAgICAgVkFMVUUgcmJMYXlvdXQ7CisgICAgICAgIFZBTFVFIHJiUG9pbnRlcjsKKyAgICB9OworCisgICAgZXh0ZXJuIFZBTFVFIHJiZmZpX1N0cnVjdENsYXNzLCByYmZmaV9TdHJ1Y3RMYXlvdXRDbGFzczsKKyAgICBleHRlcm4gVkFMVUUgcmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcywgcmJmZmlfU3RydWN0TGF5b3V0RnVuY3Rpb25GaWVsZENsYXNzOworICAgIGV4dGVybiBWQUxVRSByYmZmaV9TdHJ1Y3RMYXlvdXRBcnJheUZpZWxkQ2xhc3M7CisgICAgZXh0ZXJuIFZBTFVFIHJiZmZpX1N0cnVjdElubGluZUFycmF5Q2xhc3M7CisgICAgZXh0ZXJuIFZBTFVFIHJiZmZpX1N0cnVjdExheW91dENoYXJBcnJheUNsYXNzOworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYJLyogUkJGRklfU1RSVUNUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvU3RydWN0Lm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3QubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzRjNDQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvU3RydWN0Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvU3RydWN0QnlSZWZlcmVuY2UuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdEJ5UmVmZXJlbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlNTExMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdEJ5UmVmZXJlbmNlLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFdheW5lIE1laXNzbmVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG9yIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTVNDX1ZFUgorIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGludC5oPgorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjZWxzZQorIyBpbmNsdWRlICJ3aW4zMi9zdGRib29sLmgiCisjIGluY2x1ZGUgIndpbjMyL3N0ZGludC5oIgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxydWJ5Lmg+CisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlICJyYmZmaS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCisjaW5jbHVkZSAiUG9pbnRlci5oIgorI2luY2x1ZGUgIlN0cnVjdC5oIgorI2luY2x1ZGUgIlN0cnVjdEJ5UmVmZXJlbmNlLmgiCisKKworI2RlZmluZSBGRklfQUxJR04odiwgYSkgICgoKCgoc2l6ZV90KSAodikpLTEpIHwgKChhKS0xKSkrMSkKKworc3RhdGljIFZBTFVFIHNicl9hbGxvY2F0ZShWQUxVRSk7CitzdGF0aWMgVkFMVUUgc2JyX2luaXRpYWxpemUoVkFMVUUsIFZBTFVFKTsKK3N0YXRpYyB2b2lkIHNicl9tYXJrKFN0cnVjdEJ5UmVmZXJlbmNlICopOworCitWQUxVRSByYmZmaV9TdHJ1Y3RCeVJlZmVyZW5jZUNsYXNzID0gUW5pbDsKKworc3RhdGljIFZBTFVFCitzYnJfYWxsb2NhdGUoVkFMVUUga2xhc3MpCit7CisgICAgU3RydWN0QnlSZWZlcmVuY2UqIHNicjsKKworICAgIFZBTFVFIG9iaiA9IERhdGFfTWFrZV9TdHJ1Y3Qoa2xhc3MsIFN0cnVjdEJ5UmVmZXJlbmNlLCBzYnJfbWFyaywgLTEsIHNicik7CisKKyAgICBzYnItPnJiU3RydWN0Q2xhc3MgPSBRbmlsOworCisgICAgcmV0dXJuIG9iajsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBpbml0aWFsaXplKHN0cnVjX2NsYXNzKQorICogQHBhcmFtIFtTdHJ1Y3RdIHN0cnVjdF9jYWxzcworICogQHJldHVybiBbc2VsZl0KKyAqIEEgbmV3IGluc3RhbmNlIG9mIFN0cnVjdEJ5UmVmZXJlbmNlLgorICovCitzdGF0aWMgVkFMVUUKK3Nicl9pbml0aWFsaXplKFZBTFVFIHNlbGYsIFZBTFVFIHJiU3RydWN0Q2xhc3MpCit7CisgICAgU3RydWN0QnlSZWZlcmVuY2UqIHNiciA9IE5VTEw7CisgICAgCisgICAgaWYgKCFyYl9jbGFzc19pbmhlcml0ZWRfcChyYlN0cnVjdENsYXNzLCByYmZmaV9TdHJ1Y3RDbGFzcykpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIndyb25nIHR5cGUgKGV4cGVjdGVkIHN1YmNsYXNzIG9mIEZGSTo6U3RydWN0KSIpOworICAgIH0KKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3RCeVJlZmVyZW5jZSwgc2JyKTsKKyAgICBzYnItPnJiU3RydWN0Q2xhc3MgPSByYlN0cnVjdENsYXNzOworICAgIAorICAgIHJldHVybiBzZWxmOworfQorCitzdGF0aWMgdm9pZAorc2JyX21hcmsoU3RydWN0QnlSZWZlcmVuY2UgKnNicikKK3sKKyAgICByYl9nY19tYXJrKHNici0+cmJTdHJ1Y3RDbGFzcyk7Cit9CisKKworLyoKKyAqIGNhbGwtc2VxOiBzdHJ1Y3RfY2xhc3MKKyAqIEByZXR1cm4gW1N0cnVjdF0KKyAqIEdldCArc3RydWN0X2NsYXNzKy4KKyAqLworc3RhdGljIFZBTFVFCitzYnJfc3RydWN0X2NsYXNzKFZBTFVFIHNlbGYpCit7CisgICAgU3RydWN0QnlSZWZlcmVuY2UqIHNicjsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3RCeVJlZmVyZW5jZSwgc2JyKTsKKworICAgIHJldHVybiBzYnItPnJiU3RydWN0Q2xhc3M7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbmF0aXZlX3R5cGUKKyAqIEByZXR1cm4gW0NsYXNzXQorICogQWx3YXlzIGdldCB7RkZJOjpUeXBlfTo6UE9JTlRFUi4KKyAqLworc3RhdGljIFZBTFVFCitzYnJfbmF0aXZlX3R5cGUoVkFMVUUgc2VsZikKK3sKKyAgICByZXR1cm4gcmJfY29uc3RfZ2V0KHJiZmZpX1R5cGVDbGFzcywgcmJfaW50ZXJuKCJQT0lOVEVSIikpOworfQorCisvKgorICogY2FsbC1zZXE6IHRvX25hdGl2ZSh2YWx1ZSwgY3R4KQorICogQHBhcmFtIFtuaWwsIFN0cnVjdF0gdmFsdWUKKyAqIEBwYXJhbSBbbmlsXSBjdHgKKyAqIEByZXR1cm4gW0Fic3RyYWN0TWVtb3J5XSBQb2ludGVyIG9uICt2YWx1ZSsuCisgKi8KK3N0YXRpYyBWQUxVRQorc2JyX3RvX25hdGl2ZShWQUxVRSBzZWxmLCBWQUxVRSB2YWx1ZSwgVkFMVUUgY3R4KQoreworICAgIFN0cnVjdEJ5UmVmZXJlbmNlKiBzYnI7CisgICAgU3RydWN0KiBzOworCisgICAgaWYgKHVubGlrZWx5KHZhbHVlID09IFFuaWwpKSB7CisgICAgICAgIHJldHVybiByYmZmaV9OdWxsUG9pbnRlclNpbmdsZXRvbjsKKyAgICB9CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0QnlSZWZlcmVuY2UsIHNicik7CisgICAgaWYgKCFyYl9vYmpfaXNfa2luZF9vZih2YWx1ZSwgc2JyLT5yYlN0cnVjdENsYXNzKSkgeworICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAid3JvbmcgYXJndW1lbnQgdHlwZSAlcyAoZXhwZWN0ZWQgJXMpIiwKKyAgICAgICAgICAgICAgICByYl9vYmpfY2xhc3NuYW1lKHZhbHVlKSwKKyAgICAgICAgICAgICAgICBSU1RSSU5HX1BUUihyYl9jbGFzc19uYW1lKHNici0+cmJTdHJ1Y3RDbGFzcykpKTsKKyAgICB9CisKKyAgICBEYXRhX0dldF9TdHJ1Y3QodmFsdWUsIFN0cnVjdCwgcyk7CisKKyAgICByZXR1cm4gcy0+cmJQb2ludGVyOworfQorCisvKgorICogY2FsbC1zZXE6IGZyb21fbmF0aXZlKHZhbHVlLCBjdHgpCisgKiBAcGFyYW0gW0Fic3RyYWN0TWVtb3J5XSB2YWx1ZQorICogQHBhcmFtIFtuaWxdIGN0eAorICogQHJldHVybiBbU3RydWN0XQorICogQ3JlYXRlIGEgc3RydWN0IGZyb20gY29udGVudCBvZiBtZW1vcnkgK3ZhbHVlKy4KKyAqLworc3RhdGljIFZBTFVFCitzYnJfZnJvbV9uYXRpdmUoVkFMVUUgc2VsZiwgVkFMVUUgdmFsdWUsIFZBTFVFIGN0eCkKK3sKKyAgICBTdHJ1Y3RCeVJlZmVyZW5jZSogc2JyOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFN0cnVjdEJ5UmVmZXJlbmNlLCBzYnIpOworCisgICAgcmV0dXJuIHJiX2NsYXNzX25ld19pbnN0YW5jZSgxLCAmdmFsdWUsIHNici0+cmJTdHJ1Y3RDbGFzcyk7Cit9CisKKwordm9pZAorcmJmZmlfU3RydWN0QnlSZWZlcmVuY2VfSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jbGFzczogRkZJOjpTdHJ1Y3RCeVJlZmVyZW5jZQorICAgICAqIFRoaXMgY2xhc3MgaW5jbHVkZXMge0ZGSTo6RGF0YUNvbnZlcnRlcn0gbW9kdWxlLgorICAgICAqLworICAgIHJiZmZpX1N0cnVjdEJ5UmVmZXJlbmNlQ2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIobW9kdWxlRkZJLCAiU3RydWN0QnlSZWZlcmVuY2UiLCByYl9jT2JqZWN0KTsKKyAgICByYl9nbG9iYWxfdmFyaWFibGUoJnJiZmZpX1N0cnVjdEJ5UmVmZXJlbmNlQ2xhc3MpOworICAgIHJiX2luY2x1ZGVfbW9kdWxlKHJiZmZpX1N0cnVjdEJ5UmVmZXJlbmNlQ2xhc3MsIHJiX2NvbnN0X2dldChtb2R1bGVGRkksIHJiX2ludGVybigiRGF0YUNvbnZlcnRlciIpKSk7CisgICAgCisgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMocmJmZmlfU3RydWN0QnlSZWZlcmVuY2VDbGFzcywgc2JyX2FsbG9jYXRlKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdEJ5UmVmZXJlbmNlQ2xhc3MsICJpbml0aWFsaXplIiwgc2JyX2luaXRpYWxpemUsIDEpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0QnlSZWZlcmVuY2VDbGFzcywgInN0cnVjdF9jbGFzcyIsIHNicl9zdHJ1Y3RfY2xhc3MsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0QnlSZWZlcmVuY2VDbGFzcywgIm5hdGl2ZV90eXBlIiwgc2JyX25hdGl2ZV90eXBlLCAwKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdEJ5UmVmZXJlbmNlQ2xhc3MsICJ0b19uYXRpdmUiLCBzYnJfdG9fbmF0aXZlLCAyKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdEJ5UmVmZXJlbmNlQ2xhc3MsICJmcm9tX25hdGl2ZSIsIHNicl9mcm9tX25hdGl2ZSwgMik7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdEJ5UmVmZXJlbmNlLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RCeVJlZmVyZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzk3YWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RCeVJlZmVyZW5jZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIFdheW5lIE1laXNzbmVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG9yIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSQkZGSV9TVFJVQ1RCWVJFRkVSRU5DRV9ICisjZGVmaW5lCVJCRkZJX1NUUlVDVEJZUkVGRVJFTkNFX0gKKworI2luY2x1ZGUgPHJ1YnkuaD4KKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBTdHJ1Y3RCeVJlZmVyZW5jZV8geworICAgIFZBTFVFIHJiU3RydWN0Q2xhc3M7Cit9IFN0cnVjdEJ5UmVmZXJlbmNlOworCit2b2lkIHJiZmZpX1N0cnVjdEJ5UmVmZXJlbmNlX0luaXQoVkFMVUUgbW9kdWxlRkZJKTsKKworZXh0ZXJuIFZBTFVFIHJiZmZpX1N0cnVjdEJ5UmVmZXJlbmNlQ2xhc3M7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBSQkZGSV9TVFJVQ1RCWVJFRkVSRU5DRV9IICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdEJ5UmVmZXJlbmNlLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RCeVJlZmVyZW5jZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmVkZjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RCeVJlZmVyZW5jZS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdEJ5VmFsdWUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdEJ5VmFsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlmYjljCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvU3RydWN0QnlWYWx1ZS5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfTVNDX1ZFUgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorIyBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cnVieS5oPgorCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSAicmJmZmkuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworI2luY2x1ZGUgIlR5cGUuaCIKKyNpbmNsdWRlICJTdHJ1Y3RCeVZhbHVlLmgiCisjaW5jbHVkZSAiU3RydWN0LmgiCisKKyNkZWZpbmUgRkZJX0FMSUdOKHYsIGEpICAoKCgoKHNpemVfdCkgKHYpKS0xKSB8ICgoYSktMSkpKzEpCisKK3N0YXRpYyBWQUxVRSBzYnZfYWxsb2NhdGUoVkFMVUUpOworc3RhdGljIFZBTFVFIHNidl9pbml0aWFsaXplKFZBTFVFLCBWQUxVRSk7CitzdGF0aWMgdm9pZCBzYnZfbWFyayhTdHJ1Y3RCeVZhbHVlICopOworc3RhdGljIHZvaWQgc2J2X2ZyZWUoU3RydWN0QnlWYWx1ZSAqKTsKKworVkFMVUUgcmJmZmlfU3RydWN0QnlWYWx1ZUNsYXNzID0gUW5pbDsKKworc3RhdGljIFZBTFVFCitzYnZfYWxsb2NhdGUoVkFMVUUga2xhc3MpCit7CisgICAgU3RydWN0QnlWYWx1ZSogc2J2OworCisgICAgVkFMVUUgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgU3RydWN0QnlWYWx1ZSwgc2J2X21hcmssIHNidl9mcmVlLCBzYnYpOworCisgICAgc2J2LT5yYlN0cnVjdENsYXNzID0gUW5pbDsKKyAgICBzYnYtPnJiU3RydWN0TGF5b3V0ID0gUW5pbDsKKyAgICBzYnYtPmJhc2UubmF0aXZlVHlwZSA9IE5BVElWRV9TVFJVQ1Q7CisKKyAgICBzYnYtPmJhc2UuZmZpVHlwZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpzYnYtPmJhc2UuZmZpVHlwZSkpOworICAgIHNidi0+YmFzZS5mZmlUeXBlLT5zaXplID0gMDsKKyAgICBzYnYtPmJhc2UuZmZpVHlwZS0+YWxpZ25tZW50ID0gMTsKKyAgICBzYnYtPmJhc2UuZmZpVHlwZS0+dHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKworICAgIHJldHVybiBvYmo7Cit9CisKK3N0YXRpYyBWQUxVRQorc2J2X2luaXRpYWxpemUoVkFMVUUgc2VsZiwgVkFMVUUgcmJTdHJ1Y3RDbGFzcykKK3sKKyAgICBTdHJ1Y3RCeVZhbHVlKiBzYnYgPSBOVUxMOworICAgIFN0cnVjdExheW91dCogbGF5b3V0ID0gTlVMTDsKKyAgICBWQUxVRSByYkxheW91dCA9IFFuaWw7CisKKyAgICByYkxheW91dCA9IHJiX2l2YXJfZ2V0KHJiU3RydWN0Q2xhc3MsIHJiX2ludGVybigiQGxheW91dCIpKTsKKyAgICBpZiAoIXJiX29ial9pc19pbnN0YW5jZV9vZihyYkxheW91dCwgcmJmZmlfU3RydWN0TGF5b3V0Q2xhc3MpKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJ3cm9uZyB0eXBlIGluIEBsYXlvdXQgaXZhciAoZXhwZWN0ZWQgRkZJOjpTdHJ1Y3RMYXlvdXQpIik7CisgICAgfQorCisgICAgRGF0YV9HZXRfU3RydWN0KHJiTGF5b3V0LCBTdHJ1Y3RMYXlvdXQsIGxheW91dCk7CisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFN0cnVjdEJ5VmFsdWUsIHNidik7CisgICAgc2J2LT5yYlN0cnVjdENsYXNzID0gcmJTdHJ1Y3RDbGFzczsKKyAgICBzYnYtPnJiU3RydWN0TGF5b3V0ID0gcmJMYXlvdXQ7CisKKyAgICAvKiBXZSBjYW4ganVzdCB1c2UgZXZlcnl0aGluZyBmcm9tIHRoZSBmZmlfdHlwZSBkaXJlY3RseSAqLworICAgICpzYnYtPmJhc2UuZmZpVHlwZSA9ICpsYXlvdXQtPmJhc2UuZmZpVHlwZTsKKyAgICAKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQKK3Nidl9tYXJrKFN0cnVjdEJ5VmFsdWUgKnNidikKK3sKKyAgICByYl9nY19tYXJrKHNidi0+cmJTdHJ1Y3RDbGFzcyk7CisgICAgcmJfZ2NfbWFyayhzYnYtPnJiU3RydWN0TGF5b3V0KTsKK30KKworc3RhdGljIHZvaWQKK3Nidl9mcmVlKFN0cnVjdEJ5VmFsdWUgKnNidikKK3sKKyAgICB4ZnJlZShzYnYtPmJhc2UuZmZpVHlwZSk7CisgICAgeGZyZWUoc2J2KTsKK30KKworCitzdGF0aWMgVkFMVUUKK3Nidl9sYXlvdXQoVkFMVUUgc2VsZikKK3sKKyAgICBTdHJ1Y3RCeVZhbHVlKiBzYnY7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0QnlWYWx1ZSwgc2J2KTsKKyAgICByZXR1cm4gc2J2LT5yYlN0cnVjdExheW91dDsKK30KKworc3RhdGljIFZBTFVFCitzYnZfc3RydWN0X2NsYXNzKFZBTFVFIHNlbGYpCit7CisgICAgU3RydWN0QnlWYWx1ZSogc2J2OworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFN0cnVjdEJ5VmFsdWUsIHNidik7CisKKyAgICByZXR1cm4gc2J2LT5yYlN0cnVjdENsYXNzOworfQorCit2b2lkCityYmZmaV9TdHJ1Y3RCeVZhbHVlX0luaXQoVkFMVUUgbW9kdWxlRkZJKQoreworICAgIHJiZmZpX1N0cnVjdEJ5VmFsdWVDbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtb2R1bGVGRkksICJTdHJ1Y3RCeVZhbHVlIiwgcmJmZmlfVHlwZUNsYXNzKTsKKyAgICByYl9nbG9iYWxfdmFyaWFibGUoJnJiZmZpX1N0cnVjdEJ5VmFsdWVDbGFzcyk7CisgICAgcmJfZGVmaW5lX2NvbnN0KHJiZmZpX1R5cGVDbGFzcywgIlN0cnVjdCIsIHJiZmZpX1N0cnVjdEJ5VmFsdWVDbGFzcyk7CisKKyAgICByYl9kZWZpbmVfYWxsb2NfZnVuYyhyYmZmaV9TdHJ1Y3RCeVZhbHVlQ2xhc3MsIHNidl9hbGxvY2F0ZSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RCeVZhbHVlQ2xhc3MsICJpbml0aWFsaXplIiwgc2J2X2luaXRpYWxpemUsIDEpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0QnlWYWx1ZUNsYXNzLCAibGF5b3V0Iiwgc2J2X2xheW91dCwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RCeVZhbHVlQ2xhc3MsICJzdHJ1Y3RfY2xhc3MiLCBzYnZfc3RydWN0X2NsYXNzLCAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvU3RydWN0QnlWYWx1ZS5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvU3RydWN0QnlWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjI3NjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RCeVZhbHVlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSQkZGSV9TVFJVQ1RCWVZBTFVFX0gKKyNkZWZpbmUJUkJGRklfU1RSVUNUQllWQUxVRV9ICisKKyNpbmNsdWRlIDxydWJ5Lmg+CisjaW5jbHVkZSAiVHlwZS5oIgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFN0cnVjdEJ5VmFsdWVfIHsKKyAgICBUeXBlIGJhc2U7CisgICAgVkFMVUUgcmJTdHJ1Y3RDbGFzczsKKyAgICBWQUxVRSByYlN0cnVjdExheW91dDsKK30gU3RydWN0QnlWYWx1ZTsKKwordm9pZCByYmZmaV9TdHJ1Y3RCeVZhbHVlX0luaXQoVkFMVUUgbW9kdWxlRkZJKTsKKworZXh0ZXJuIFZBTFVFIHJiZmZpX1N0cnVjdEJ5VmFsdWVDbGFzczsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIFJCRkZJX1NUUlVDVEJZVkFMVUVfSCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RCeVZhbHVlLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RCeVZhbHVlLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmMjMwNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdEJ5VmFsdWUubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RMYXlvdXQuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdExheW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4M2U1MzIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9TdHJ1Y3RMYXlvdXQuYwpAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgTHVjIEhlaW5yaWNoIDxsdWNAaG9uay1ob25rLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorIyBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHJ1YnkuaD4KKyNpbmNsdWRlICJyYmZmaS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgIkFic3RyYWN0TWVtb3J5LmgiCisjaW5jbHVkZSAiUG9pbnRlci5oIgorI2luY2x1ZGUgIk1lbW9yeVBvaW50ZXIuaCIKKyNpbmNsdWRlICJGdW5jdGlvbi5oIgorI2luY2x1ZGUgIlR5cGVzLmgiCisjaW5jbHVkZSAiU3RydWN0QnlWYWx1ZS5oIgorI2luY2x1ZGUgIkFycmF5VHlwZS5oIgorI2luY2x1ZGUgIkZ1bmN0aW9uLmgiCisjaW5jbHVkZSAiTWFwcGVkVHlwZS5oIgorI2luY2x1ZGUgIlN0cnVjdC5oIgorCisjZGVmaW5lIEZGSV9BTElHTih2LCBhKSAgKCgoKChzaXplX3QpICh2KSktMSkgfCAoKGEpLTEpKSsxKQorCitzdGF0aWMgdm9pZCBzdHJ1Y3RfbGF5b3V0X21hcmsoU3RydWN0TGF5b3V0ICopOworc3RhdGljIHZvaWQgc3RydWN0X2xheW91dF9mcmVlKFN0cnVjdExheW91dCAqKTsKK3N0YXRpYyB2b2lkIHN0cnVjdF9maWVsZF9tYXJrKFN0cnVjdEZpZWxkKiApOworCitWQUxVRSByYmZmaV9TdHJ1Y3RMYXlvdXRGaWVsZENsYXNzID0gUW5pbDsKK1ZBTFVFIHJiZmZpX1N0cnVjdExheW91dE51bWJlckZpZWxkQ2xhc3MgPSBRbmlsLCByYmZmaV9TdHJ1Y3RMYXlvdXRQb2ludGVyRmllbGRDbGFzcyA9IFFuaWw7CitWQUxVRSByYmZmaV9TdHJ1Y3RMYXlvdXRTdHJpbmdGaWVsZENsYXNzID0gUW5pbDsKK1ZBTFVFIHJiZmZpX1N0cnVjdExheW91dEZ1bmN0aW9uRmllbGRDbGFzcyA9IFFuaWwsIHJiZmZpX1N0cnVjdExheW91dEFycmF5RmllbGRDbGFzcyA9IFFuaWw7CisKK1ZBTFVFIHJiZmZpX1N0cnVjdExheW91dENsYXNzID0gUW5pbDsKKworCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9maWVsZF9hbGxvY2F0ZShWQUxVRSBrbGFzcykKK3sKKyAgICBTdHJ1Y3RGaWVsZCogZmllbGQ7CisgICAgVkFMVUUgb2JqOworCisgICAgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgU3RydWN0RmllbGQsIHN0cnVjdF9maWVsZF9tYXJrLCAtMSwgZmllbGQpOworICAgIGZpZWxkLT5yYlR5cGUgPSBRbmlsOworICAgIGZpZWxkLT5yYk5hbWUgPSBRbmlsOworCisgICAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQKK3N0cnVjdF9maWVsZF9tYXJrKFN0cnVjdEZpZWxkKiBmKQoreworICAgIHJiX2djX21hcmsoZi0+cmJUeXBlKTsKKyAgICByYl9nY19tYXJrKGYtPnJiTmFtZSk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogaW5pdGlhbGl6ZShuYW1lLCBvZmZzZXQsIHR5cGUpCisgKiBAcGFyYW0gW1N0cmluZyxTeW1ib2xdIG5hbWUKKyAqIEBwYXJhbSBbRml4bnVtXSBvZmZzZXQKKyAqIEBwYXJhbSBbRkZJOjpUeXBlXSB0eXBlCisgKiBAcmV0dXJuIFtzZWxmXQorICogQSBuZXcgRkZJOjpTdHJ1Y3RMYXlvdXQ6OkZpZWxkIGluc3RhbmNlLgorICovCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9maWVsZF9pbml0aWFsaXplKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZikKK3sKKyAgICBWQUxVRSByYk9mZnNldCA9IFFuaWwsIHJiTmFtZSA9IFFuaWwsIHJiVHlwZSA9IFFuaWw7CisgICAgU3RydWN0RmllbGQqIGZpZWxkOworICAgIGludCBuYXJnczsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3RGaWVsZCwgZmllbGQpOworCisgICAgbmFyZ3MgPSByYl9zY2FuX2FyZ3MoYXJnYywgYXJndiwgIjMiLCAmcmJOYW1lLCAmcmJPZmZzZXQsICZyYlR5cGUpOworCisgICAgaWYgKFRZUEUocmJOYW1lKSAhPSBUX1NZTUJPTCAmJiBUWVBFKHJiTmFtZSkgIT0gVF9TVFJJTkcpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIndyb25nIGFyZ3VtZW50IHR5cGUgJXMgKGV4cGVjdGVkIFN5bWJvbC9TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICByYl9vYmpfY2xhc3NuYW1lKHJiTmFtZSkpOworICAgIH0KKworICAgIENoZWNrX1R5cGUocmJPZmZzZXQsIFRfRklYTlVNKTsKKworICAgIGlmICghcmJfb2JqX2lzX2tpbmRfb2YocmJUeXBlLCByYmZmaV9UeXBlQ2xhc3MpKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJ3cm9uZyBhcmd1bWVudCB0eXBlICVzIChleHBlY3RlZCBGRkk6OlR5cGUpIiwKKyAgICAgICAgICAgICAgICByYl9vYmpfY2xhc3NuYW1lKHJiVHlwZSkpOworICAgIH0KKworICAgIGZpZWxkLT5vZmZzZXQgPSBOVU0yVUlOVChyYk9mZnNldCk7CisgICAgZmllbGQtPnJiTmFtZSA9IChUWVBFKHJiTmFtZSkgPT0gVF9TWU1CT0wpID8gcmJOYW1lIDogcmJfc3RyX2ludGVybihyYk5hbWUpOworICAgIGZpZWxkLT5yYlR5cGUgPSByYlR5cGU7CisgICAgRGF0YV9HZXRfU3RydWN0KGZpZWxkLT5yYlR5cGUsIFR5cGUsIGZpZWxkLT50eXBlKTsKKyAgICBmaWVsZC0+bWVtb3J5T3AgPSBnZXRfbWVtb3J5X29wKGZpZWxkLT50eXBlKTsKKyAgICBmaWVsZC0+cmVmZXJlbmNlSW5kZXggPSAtMTsKKworICAgIHN3aXRjaCAoZmllbGQtPnR5cGUtPm5hdGl2ZVR5cGUgPT0gTkFUSVZFX01BUFBFRCA/ICgoTWFwcGVkVHlwZSAqKSBmaWVsZC0+dHlwZSktPnR5cGUtPm5hdGl2ZVR5cGUgOiBmaWVsZC0+dHlwZS0+bmF0aXZlVHlwZSkgeworICAgICAgICBjYXNlIE5BVElWRV9GVU5DVElPTjoKKyAgICAgICAgY2FzZSBOQVRJVkVfQ0FMTEJBQ0s6CisgICAgICAgIGNhc2UgTkFUSVZFX1BPSU5URVI6CisgICAgICAgICAgICBmaWVsZC0+cmVmZXJlbmNlUmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZpZWxkLT5yZWZlcmVuY2VSZXF1aXJlZCA9IChyYl9yZXNwb25kX3RvKHNlbGYsIHJiX2ludGVybigicmVmZXJlbmNlX3JlcXVpcmVkPyIpKQorICAgICAgICAgICAgICAgICAgICAmJiBSVEVTVChyYl9mdW5jYWxsMihzZWxmLCByYl9pbnRlcm4oInJlZmVyZW5jZV9yZXF1aXJlZD8iKSwgMCwgTlVMTCkpKQorICAgICAgICAgICAgICAgICAgICB8fCAocmJfcmVzcG9uZF90byhyYlR5cGUsIHJiX2ludGVybigicmVmZXJlbmNlX3JlcXVpcmVkPyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgUlRFU1QocmJfZnVuY2FsbDIocmJUeXBlLCByYl9pbnRlcm4oInJlZmVyZW5jZV9yZXF1aXJlZD8iKSwgMCwgTlVMTCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBvZmZzZXQKKyAqIEByZXR1cm4gW051bWVyaWNdCisgKiBHZXQgdGhlIGZpZWxkIG9mZnNldC4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfZmllbGRfb2Zmc2V0KFZBTFVFIHNlbGYpCit7CisgICAgU3RydWN0RmllbGQqIGZpZWxkOworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3RGaWVsZCwgZmllbGQpOworICAgIHJldHVybiBVSU5UMk5VTShmaWVsZC0+b2Zmc2V0KTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBzaXplCisgKiBAcmV0dXJuIFtOdW1lcmljXQorICogR2V0IHRoZSBmaWVsZCBzaXplLgorICovCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9maWVsZF9zaXplKFZBTFVFIHNlbGYpCit7CisgICAgU3RydWN0RmllbGQqIGZpZWxkOworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3RGaWVsZCwgZmllbGQpOworICAgIHJldHVybiBVSU5UMk5VTShmaWVsZC0+dHlwZS0+ZmZpVHlwZS0+c2l6ZSk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogYWxpZ25tZW50CisgKiBAcmV0dXJuIFtOdW1lcmljXQorICogR2V0IHRoZSBmaWVsZCBhbGlnbm1lbnQuCisgKi8KK3N0YXRpYyBWQUxVRQorc3RydWN0X2ZpZWxkX2FsaWdubWVudChWQUxVRSBzZWxmKQoreworICAgIFN0cnVjdEZpZWxkKiBmaWVsZDsKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0RmllbGQsIGZpZWxkKTsKKyAgICByZXR1cm4gVUlOVDJOVU0oZmllbGQtPnR5cGUtPmZmaVR5cGUtPmFsaWdubWVudCk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogdHlwZQorICogQHJldHVybiBbVHlwZV0KKyAqIEdldCB0aGUgZmllbGQgdHlwZS4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfZmllbGRfdHlwZShWQUxVRSBzZWxmKQoreworICAgIFN0cnVjdEZpZWxkKiBmaWVsZDsKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0RmllbGQsIGZpZWxkKTsKKworICAgIHJldHVybiBmaWVsZC0+cmJUeXBlOworfQorCisvKgorICogY2FsbC1zZXE6IG5hbWUKKyAqIEByZXR1cm4gW1N5bWJvbF0KKyAqIEdldCB0aGUgZmllbGQgbmFtZS4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfZmllbGRfbmFtZShWQUxVRSBzZWxmKQoreworICAgIFN0cnVjdEZpZWxkKiBmaWVsZDsKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0RmllbGQsIGZpZWxkKTsKKyAgICByZXR1cm4gZmllbGQtPnJiTmFtZTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBnZXQocG9pbnRlcikKKyAqIEBwYXJhbSBbQWJzdHJhY3RNZW1vcnldIHBvaW50ZXIgcG9pbnRlciBvbiBhIHtTdHJ1Y3R9CisgKiBAcmV0dXJuIFtPYmplY3RdCisgKiBHZXQgYW4gb2JqZWN0IG9mIHR5cGUgeyN0eXBlfSBmcm9tIG1lbW9yeSBwb2ludGVkIGJ5ICtwb2ludGVyKy4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfZmllbGRfZ2V0KFZBTFVFIHNlbGYsIFZBTFVFIHBvaW50ZXIpCit7CisgICAgU3RydWN0RmllbGQqIGY7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0RmllbGQsIGYpOworICAgIGlmIChmLT5tZW1vcnlPcCA9PSBOVUxMKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgImdldCBub3Qgc3VwcG9ydGVkIGZvciAlcyIsIHJiX29ial9jbGFzc25hbWUoZi0+cmJUeXBlKSk7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKworICAgIHJldHVybiAoKmYtPm1lbW9yeU9wLT5nZXQpKE1FTU9SWShwb2ludGVyKSwgZi0+b2Zmc2V0KTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBwdXQocG9pbnRlciwgdmFsdWUpCisgKiBAcGFyYW0gW0Fic3RyYWN0TWVtb3J5XSBwb2ludGVyIHBvaW50ZXIgb24gYSB7U3RydWN0fQorICogQHBhcmFtIFtPYmplY3RdIHZhbHVlIHRoaXMgb2JqZWN0IG11c3QgYmUgYSBraW5kIG9mIHsjdHlwZX0KKyAqIEByZXR1cm4gW3NlbGZdCisgKiBQdXQgYW4gb2JqZWN0IHRvIG1lbW9yeSBwb2ludGVkIGJ5ICtwb2ludGVyKy4KKyAqLworc3RhdGljIFZBTFVFCitzdHJ1Y3RfZmllbGRfcHV0KFZBTFVFIHNlbGYsIFZBTFVFIHBvaW50ZXIsIFZBTFVFIHZhbHVlKQoreworICAgIFN0cnVjdEZpZWxkKiBmOworICAgIAorICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3RGaWVsZCwgZik7CisgICAgaWYgKGYtPm1lbW9yeU9wID09IE5VTEwpIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAicHV0IG5vdCBzdXBwb3J0ZWQgZm9yICVzIiwgcmJfb2JqX2NsYXNzbmFtZShmLT5yYlR5cGUpKTsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorCisgICAgKCpmLT5tZW1vcnlPcC0+cHV0KShNRU1PUlkocG9pbnRlciksIGYtPm9mZnNldCwgdmFsdWUpOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogZ2V0KHBvaW50ZXIpCisgKiBAcGFyYW0gW0Fic3RyYWN0TWVtb3J5XSBwb2ludGVyIHBvaW50ZXIgb24gYSB7U3RydWN0fQorICogQHJldHVybiBbRnVuY3Rpb25dCisgKiBHZXQgYSB7RnVuY3Rpb259IGZyb20gbWVtb3J5IHBvaW50ZWQgYnkgK3BvaW50ZXIrLgorICovCitzdGF0aWMgVkFMVUUKK2Z1bmN0aW9uX2ZpZWxkX2dldChWQUxVRSBzZWxmLCBWQUxVRSBwb2ludGVyKQoreworICAgIFN0cnVjdEZpZWxkKiBmOworICAgIAorICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3RGaWVsZCwgZik7CisKKyAgICByZXR1cm4gcmJmZmlfRnVuY3Rpb25fTmV3SW5zdGFuY2UoZi0+cmJUeXBlLCAoKnJiZmZpX0Fic3RyYWN0TWVtb3J5T3BzLnBvaW50ZXItPmdldCkoTUVNT1JZKHBvaW50ZXIpLCBmLT5vZmZzZXQpKTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBwdXQocG9pbnRlciwgcHJvYykKKyAqIEBwYXJhbSBbQWJzdHJhY3RNZW1vcnldIHBvaW50ZXIgcG9pbnRlciB0byBhIHtTdHJ1Y3R9CisgKiBAcGFyYW0gW0Z1bmN0aW9uLCBQcm9jXSBwcm9jCisgKiBAcmV0dXJuIFtGdW5jdGlvbl0KKyAqIFNldCBhIHtGdW5jdGlvbn0gdG8gbWVtb3J5IHBvaW50ZWQgYnkgK3BvaW50ZXIrIGFzIGEgZnVuY3Rpb24uIAorICoKKyAqIElmIGEgUHJvYyBpcyBzdWJtaXR0ZWQgYXMgK3Byb2MrLCBpdCBpcyBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkIHRvIGEge0Z1bmN0aW9ufS4KKyAqLworc3RhdGljIFZBTFVFCitmdW5jdGlvbl9maWVsZF9wdXQoVkFMVUUgc2VsZiwgVkFMVUUgcG9pbnRlciwgVkFMVUUgcHJvYykKK3sKKyAgICBTdHJ1Y3RGaWVsZCogZjsKKyAgICBWQUxVRSB2YWx1ZSA9IFFuaWw7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0RmllbGQsIGYpOworCisgICAgaWYgKE5JTF9QKHByb2MpIHx8IHJiX29ial9pc19raW5kX29mKHByb2MsIHJiZmZpX0Z1bmN0aW9uQ2xhc3MpKSB7CisgICAgICAgIHZhbHVlID0gcHJvYzsKKyAgICB9IGVsc2UgaWYgKHJiX29ial9pc19raW5kX29mKHByb2MsIHJiX2NQcm9jKSB8fCByYl9yZXNwb25kX3RvKHByb2MsIHJiX2ludGVybigiY2FsbCIpKSkgeworICAgICAgICB2YWx1ZSA9IHJiZmZpX0Z1bmN0aW9uX0ZvclByb2MoZi0+cmJUeXBlLCBwcm9jKTsKKyAgICB9IGVsc2UgeworICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAid3JvbmcgdHlwZSAoZXhwZWN0ZWQgUHJvYyBvciBGdW5jdGlvbikiKTsKKyAgICB9CisKKyAgICAoKnJiZmZpX0Fic3RyYWN0TWVtb3J5T3BzLnBvaW50ZXItPnB1dCkoTUVNT1JZKHBvaW50ZXIpLCBmLT5vZmZzZXQsIHZhbHVlKTsKKworICAgIHJldHVybiBzZWxmOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2lzQ2hhckFycmF5KEFycmF5VHlwZSogYXJyYXlUeXBlKQoreworICAgIHJldHVybiBhcnJheVR5cGUtPmNvbXBvbmVudFR5cGUtPm5hdGl2ZVR5cGUgPT0gTkFUSVZFX0lOVDgKKyAgICAgICAgICAgIHx8IGFycmF5VHlwZS0+Y29tcG9uZW50VHlwZS0+bmF0aXZlVHlwZSA9PSBOQVRJVkVfVUlOVDg7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogZ2V0KHBvaW50ZXIpCisgKiBAcGFyYW0gW0Fic3RyYWN0TWVtb3J5XSBwb2ludGVyIHBvaW50ZXIgb24gYSB7U3RydWN0fQorICogQHJldHVybiBbRkZJOjpTdHJ1Y3RMYXlvdXQ6OkNoYXJBcnJheSwgRkZJOjpTdHJ1Y3Q6OklubGluZUFycmF5XQorICogR2V0IGFuIGFycmF5IGZyb20gYSB7U3RydWN0fS4KKyAqLworc3RhdGljIFZBTFVFCithcnJheV9maWVsZF9nZXQoVkFMVUUgc2VsZiwgVkFMVUUgcG9pbnRlcikKK3sKKyAgICBTdHJ1Y3RGaWVsZCogZjsKKyAgICBBcnJheVR5cGUqIGFycmF5OworICAgIFZBTFVFIGFyZ3ZbMl07CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0RmllbGQsIGYpOworICAgIERhdGFfR2V0X1N0cnVjdChmLT5yYlR5cGUsIEFycmF5VHlwZSwgYXJyYXkpOworCisgICAgYXJndlswXSA9IHBvaW50ZXI7CisgICAgYXJndlsxXSA9IHNlbGY7CisKKyAgICByZXR1cm4gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDIsIGFyZ3YsIGlzQ2hhckFycmF5KGFycmF5KQorICAgICAgICAgICAgPyByYmZmaV9TdHJ1Y3RMYXlvdXRDaGFyQXJyYXlDbGFzcyA6IHJiZmZpX1N0cnVjdElubGluZUFycmF5Q2xhc3MpOworfQorCisvKgorICogY2FsbC1zZXE6IHB1dChwb2ludGVyLCB2YWx1ZSkKKyAqIEBwYXJhbSBbQWJzdHJhY3RNZW1vcnldIHBvaW50ZXIgcG9pbnRlciBvbiBhIHtTdHJ1Y3R9CisgKiBAcGFyYW0gW1N0cmluZywgQXJyYXldIHZhbHVlICt2YWx1ZSsgbWF5IGJlIGEgU3RyaW5nIG9ubHkgaWYgYXJyYXkncyB0eXBlIGlzIGEga2luZCBvZiAraW50OCsKKyAqIEByZXR1cm4gW3ZhbHVlXQorICogU2V0IGFuIGFycmF5IGluIGEge1N0cnVjdH0uCisgKi8KK3N0YXRpYyBWQUxVRQorYXJyYXlfZmllbGRfcHV0KFZBTFVFIHNlbGYsIFZBTFVFIHBvaW50ZXIsIFZBTFVFIHZhbHVlKQoreworICAgIFN0cnVjdEZpZWxkKiBmOworICAgIEFycmF5VHlwZSogYXJyYXk7CisgICAgCisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0RmllbGQsIGYpOworICAgIERhdGFfR2V0X1N0cnVjdChmLT5yYlR5cGUsIEFycmF5VHlwZSwgYXJyYXkpOworICAgIAorICAgIGlmIChpc0NoYXJBcnJheShhcnJheSkgJiYgcmJfb2JqX2lzX2luc3RhbmNlX29mKHZhbHVlLCByYl9jU3RyaW5nKSkgeworICAgICAgICBWQUxVRSBhcmd2WzJdOworCisgICAgICAgIGFyZ3ZbMF0gPSBJTlQyRklYKGYtPm9mZnNldCk7CisgICAgICAgIGFyZ3ZbMV0gPSB2YWx1ZTsKKworICAgICAgICByYl9mdW5jYWxsMihwb2ludGVyLCByYl9pbnRlcm4oInB1dF9zdHJpbmciKSwgMiwgYXJndik7CisKKyAgICB9IGVsc2UgeworI2lmZGVmIG5vdHlldAorICAgICAgICBNZW1vcnlPcCogb3A7CisgICAgICAgIGludCBjb3VudCA9IFJBUlJBWV9MRU4odmFsdWUpOworICAgICAgICBpbnQgaTsKKyAgICAgICAgQWJzdHJhY3RNZW1vcnkqIG1lbW9yeSA9IE1FTU9SWShwb2ludGVyKTsKKworICAgICAgICBpZiAoY291bnQgPiBhcnJheS0+bGVuZ3RoKSB7CisgICAgICAgICAgICByYl9yYWlzZShyYl9lSW5kZXhFcnJvciwgImFycmF5IHRvbyBsYXJnZSIpOworICAgICAgICB9CisKKyAgICAgICAgLyogY2xlYXIgdGhlIGNvbnRlbnRzIGluIGNhc2Ugb2YgYSBzaG9ydCB3cml0ZSAqLworICAgICAgICBjaGVja1dyaXRlKG1lbW9yeSk7CisgICAgICAgIGNoZWNrQm91bmRzKG1lbW9yeSwgZi0+b2Zmc2V0LCBmLT50eXBlLT5mZmlUeXBlLT5zaXplKTsKKyAgICAgICAgaWYgKGNvdW50IDwgYXJyYXktPmxlbmd0aCkgeworICAgICAgICAgICAgbWVtc2V0KG1lbW9yeS0+YWRkcmVzcyArIGYtPm9mZnNldCArIChjb3VudCAqIGFycmF5LT5jb21wb25lbnRUeXBlLT5mZmlUeXBlLT5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgMCwgKGFycmF5LT5sZW5ndGggLSBjb3VudCkgKiBhcnJheS0+Y29tcG9uZW50VHlwZS0+ZmZpVHlwZS0+c2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBub3cgY29weSBlYWNoIGVsZW1lbnQgaW4gKi8KKyAgICAgICAgaWYgKChvcCA9IGdldF9tZW1vcnlfb3AoYXJyYXktPmNvbXBvbmVudFR5cGUpKSAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgKCpvcC0+cHV0KShtZW1vcnksIGYtPm9mZnNldCArIChpICogYXJyYXktPmNvbXBvbmVudFR5cGUtPmZmaVR5cGUtPnNpemUpLCByYl9hcnlfZW50cnkodmFsdWUsIGkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKGFycmF5LT5jb21wb25lbnRUeXBlLT5uYXRpdmVUeXBlID09IE5BVElWRV9TVFJVQ1QpIHsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBWQUxVRSBlbnRyeSA9IHJiX2FyeV9lbnRyeSh2YWx1ZSwgaSk7CisgICAgICAgICAgICAgICAgU3RydWN0KiBzOworCisgICAgICAgICAgICAgICAgaWYgKCFyYl9vYmpfaXNfa2luZF9vZihlbnRyeSwgcmJmZmlfU3RydWN0Q2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJhcnJheSBlbGVtZW50IG5vdCBhbiBpbnN0YW5jZSBvZiBGRkk6OlN0cnVjdCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBEYXRhX0dldF9TdHJ1Y3QoZW50cnksIFN0cnVjdCwgcyk7CisgICAgICAgICAgICAgICAgY2hlY2tSZWFkKHMtPnBvaW50ZXIpOworICAgICAgICAgICAgICAgIGNoZWNrQm91bmRzKHMtPnBvaW50ZXIsIDAsIGFycmF5LT5jb21wb25lbnRUeXBlLT5mZmlUeXBlLT5zaXplKTsKKworICAgICAgICAgICAgICAgIG1lbWNweShtZW1vcnktPmFkZHJlc3MgKyBmLT5vZmZzZXQgKyAoaSAqIGFycmF5LT5jb21wb25lbnRUeXBlLT5mZmlUeXBlLT5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBvaW50ZXItPmFkZHJlc3MsIGFycmF5LT5jb21wb25lbnRUeXBlLT5mZmlUeXBlLT5zaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmJfcmFpc2UocmJfZU5vdEltcEVycm9yLCAicHV0IG5vdCBzdXBwb3J0ZWQgZm9yIGFycmF5cyBvZiB0eXBlICVzIiwgcmJfb2JqX2NsYXNzbmFtZShhcnJheS0+cmJDb21wb25lbnRUeXBlKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHJiX3JhaXNlKHJiX2VOb3RJbXBFcnJvciwgImNhbm5vdCBzZXQgYXJyYXkgZmllbGQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKK30KKworCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9sYXlvdXRfYWxsb2NhdGUoVkFMVUUga2xhc3MpCit7CisgICAgU3RydWN0TGF5b3V0KiBsYXlvdXQ7CisgICAgVkFMVUUgb2JqOworCisgICAgb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgU3RydWN0TGF5b3V0LCBzdHJ1Y3RfbGF5b3V0X21hcmssIHN0cnVjdF9sYXlvdXRfZnJlZSwgbGF5b3V0KTsKKyAgICBsYXlvdXQtPnJiRmllbGRNYXAgPSBRbmlsOworICAgIGxheW91dC0+cmJGaWVsZE5hbWVzID0gUW5pbDsKKyAgICBsYXlvdXQtPnJiRmllbGRzID0gUW5pbDsKKyAgICBsYXlvdXQtPmZpZWxkU3ltYm9sVGFibGUgPSBzdF9pbml0X251bXRhYmxlKCk7CisgICAgbGF5b3V0LT5iYXNlLmZmaVR5cGUgPSB4Y2FsbG9jKDEsIHNpemVvZigqbGF5b3V0LT5iYXNlLmZmaVR5cGUpKTsKKyAgICBsYXlvdXQtPmJhc2UuZmZpVHlwZS0+c2l6ZSA9IDA7CisgICAgbGF5b3V0LT5iYXNlLmZmaVR5cGUtPmFsaWdubWVudCA9IDA7CisgICAgbGF5b3V0LT5iYXNlLmZmaVR5cGUtPnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisKKyAgICByZXR1cm4gb2JqOworfQorCisvKgorICogY2FsbC1zZXE6IGluaXRpYWxpemUoZmllbGRzLCBzaXplLCBhbGlnbikKKyAqIEBwYXJhbSBbQXJyYXk8U3RydWN0TGF5b3V0OjpGaWVsZD5dIGZpZWxkcworICogQHBhcmFtIFtOdW1lcmljXSBzaXplCisgKiBAcGFyYW0gW051bWVyaWNdIGFsaWduCisgKiBAcmV0dXJuIFtzZWxmXQorICogQSBuZXcgU3RydWN0TGF5b3V0IGluc3RhbmNlLgorICovCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9sYXlvdXRfaW5pdGlhbGl6ZShWQUxVRSBzZWxmLCBWQUxVRSBmaWVsZHMsIFZBTFVFIHNpemUsIFZBTFVFIGFsaWduKQoreworICAgIFN0cnVjdExheW91dCogbGF5b3V0OworICAgIGZmaV90eXBlKiBsdHlwZTsKKyAgICBpbnQgaTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBTdHJ1Y3RMYXlvdXQsIGxheW91dCk7CisgICAgbGF5b3V0LT5maWVsZENvdW50ID0gKGludCkgUkFSUkFZX0xFTihmaWVsZHMpOworICAgIGxheW91dC0+cmJGaWVsZE1hcCA9IHJiX2hhc2hfbmV3KCk7CisgICAgbGF5b3V0LT5yYkZpZWxkTmFtZXMgPSByYl9hcnlfbmV3MihsYXlvdXQtPmZpZWxkQ291bnQpOworICAgIGxheW91dC0+c2l6ZSA9IChpbnQpIEZGSV9BTElHTihOVU0ySU5UKHNpemUpLCAgTlVNMklOVChhbGlnbikpOworICAgIGxheW91dC0+YWxpZ24gPSBOVU0ySU5UKGFsaWduKTsKKyAgICBsYXlvdXQtPmZpZWxkcyA9IHhjYWxsb2MobGF5b3V0LT5maWVsZENvdW50LCBzaXplb2YoU3RydWN0RmllbGQgKikpOworICAgIGxheW91dC0+ZmZpVHlwZXMgPSB4Y2FsbG9jKGxheW91dC0+ZmllbGRDb3VudCArIDEsIHNpemVvZihmZmlfdHlwZSAqKSk7CisgICAgbGF5b3V0LT5yYkZpZWxkcyA9IHJiX2FyeV9uZXcyKGxheW91dC0+ZmllbGRDb3VudCk7CisgICAgbGF5b3V0LT5yZWZlcmVuY2VGaWVsZENvdW50ID0gMDsKKyAgICBsYXlvdXQtPmJhc2UuZmZpVHlwZS0+ZWxlbWVudHMgPSBsYXlvdXQtPmZmaVR5cGVzOworICAgIGxheW91dC0+YmFzZS5mZmlUeXBlLT5zaXplID0gbGF5b3V0LT5zaXplOworICAgIGxheW91dC0+YmFzZS5mZmlUeXBlLT5hbGlnbm1lbnQgPSBsYXlvdXQtPmFsaWduOworCisgICAgbHR5cGUgPSBsYXlvdXQtPmJhc2UuZmZpVHlwZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgbGF5b3V0LT5maWVsZENvdW50OyArK2kpIHsKKyAgICAgICAgVkFMVUUgcmJGaWVsZCA9IHJiX2FyeV9lbnRyeShmaWVsZHMsIGkpOworICAgICAgICBWQUxVRSByYk5hbWU7CisgICAgICAgIFN0cnVjdEZpZWxkKiBmaWVsZDsKKyAgICAgICAgZmZpX3R5cGUqIGZ0eXBlOworCisKKyAgICAgICAgaWYgKCFyYl9vYmpfaXNfa2luZF9vZihyYkZpZWxkLCByYmZmaV9TdHJ1Y3RMYXlvdXRGaWVsZENsYXNzKSkgeworICAgICAgICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIndyb25nIHR5cGUgZm9yIGZpZWxkICVkLiIsIGkpOworICAgICAgICB9CisgICAgICAgIHJiTmFtZSA9IHJiX2Z1bmNhbGwyKHJiRmllbGQsIHJiX2ludGVybigibmFtZSIpLCAwLCBOVUxMKTsKKworICAgICAgICBEYXRhX0dldF9TdHJ1Y3QocmJGaWVsZCwgU3RydWN0RmllbGQsIGZpZWxkKTsKKyAgICAgICAgbGF5b3V0LT5maWVsZHNbaV0gPSBmaWVsZDsKKworICAgICAgICBpZiAoZmllbGQtPnR5cGUgPT0gTlVMTCB8fCBmaWVsZC0+dHlwZS0+ZmZpVHlwZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAidHlwZSBvZiBmaWVsZCAlZCBub3Qgc3VwcG9ydGVkIiwgaSk7CisgICAgICAgIH0KKworICAgICAgICBmdHlwZSA9IGZpZWxkLT50eXBlLT5mZmlUeXBlOworICAgICAgICBpZiAoZnR5cGUtPnNpemUgPT0gMCAmJiBpIDwgKChpbnQpIGxheW91dC0+ZmllbGRDb3VudCAtIDEpKSB7CisgICAgICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAidHlwZSBvZiBmaWVsZCAlZCBoYXMgemVybyBzaXplIiwgaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmllbGQtPnJlZmVyZW5jZVJlcXVpcmVkKSB7CisgICAgICAgICAgICBmaWVsZC0+cmVmZXJlbmNlSW5kZXggPSBsYXlvdXQtPnJlZmVyZW5jZUZpZWxkQ291bnQrKzsKKyAgICAgICAgfQorCisKKyAgICAgICAgbGF5b3V0LT5mZmlUeXBlc1tpXSA9IGZ0eXBlLT5zaXplID4gMCA/IGZ0eXBlIDogTlVMTDsKKyAgICAgICAgc3RfaW5zZXJ0KGxheW91dC0+ZmllbGRTeW1ib2xUYWJsZSwgcmJOYW1lLCByYkZpZWxkKTsKKyAgICAgICAgcmJfaGFzaF9hc2V0KGxheW91dC0+cmJGaWVsZE1hcCwgcmJOYW1lLCByYkZpZWxkKTsKKyAgICAgICAgcmJfYXJ5X3B1c2gobGF5b3V0LT5yYkZpZWxkcywgcmJGaWVsZCk7CisgICAgICAgIHJiX2FyeV9wdXNoKGxheW91dC0+cmJGaWVsZE5hbWVzLCByYk5hbWUpOworICAgIH0KKworICAgIGlmIChsdHlwZS0+c2l6ZSA9PSAwKSB7CisgICAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJTdHJ1Y3Qgc2l6ZSBpcyB6ZXJvIik7CisgICAgfQorCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIAorICogY2FsbC1zZXE6IFtdKGZpZWxkKQorICogQHBhcmFtIFtTeW1ib2xdIGZpZWxkCisgKiBAcmV0dXJuIFtTdHJ1Y3RMYXlvdXQ6OkZpZWxkXQorICogR2V0IGEgZmllbGQgZnJvbSB0aGUgbGF5b3V0LgorICovCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9sYXlvdXRfdW5pb25fYmFuZyhWQUxVRSBzZWxmKSAKK3sKKyAgICBjb25zdCBmZmlfdHlwZSAqYWxpZ25tZW50X3R5cGVzW10gPSB7ICZmZmlfdHlwZV9zaW50OCwgJmZmaV90eXBlX3NpbnQxNiwgJmZmaV90eXBlX3NpbnQzMiwgJmZmaV90eXBlX3NpbnQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZmlfdHlwZV9mbG9hdCwgJmZmaV90eXBlX2RvdWJsZSwgJmZmaV90eXBlX2xvbmdkb3VibGUsIE5VTEwgfTsKKyAgICBTdHJ1Y3RMYXlvdXQqIGxheW91dDsKKyAgICBmZmlfdHlwZSAqdCA9IE5VTEw7CisgICAgaW50IGNvdW50LCBpOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFN0cnVjdExheW91dCwgbGF5b3V0KTsKKworICAgIGZvciAoaSA9IDA7IGFsaWdubWVudF90eXBlc1tpXSAhPSBOVUxMOyArK2kpIHsKKyAgICAgICAgaWYgKGFsaWdubWVudF90eXBlc1tpXS0+YWxpZ25tZW50ID09IGxheW91dC0+YWxpZ24pIHsKKyAgICAgICAgICAgIHQgPSAoZmZpX3R5cGUgKikgYWxpZ25tZW50X3R5cGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHQgPT0gTlVMTCkgeworICAgICAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAiY2Fubm90IGNyZWF0ZSBsaWJmZmkgdW5pb24gcmVwcmVzZW50YXRpb24gZm9yIGFsaWdubWVudCAlZCIsIGxheW91dC0+YWxpZ24pOworICAgICAgICByZXR1cm4gUW5pbDsKKyAgICB9CisKKyAgICBjb3VudCA9IChpbnQpIGxheW91dC0+c2l6ZSAvIChpbnQpIHQtPnNpemU7CisgICAgeGZyZWUobGF5b3V0LT5mZmlUeXBlcyk7CisgICAgbGF5b3V0LT5mZmlUeXBlcyA9IHhjYWxsb2MoY291bnQgKyAxLCBzaXplb2YoZmZpX3R5cGUgKikpOworICAgIGxheW91dC0+YmFzZS5mZmlUeXBlLT5lbGVtZW50cyA9IGxheW91dC0+ZmZpVHlwZXM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBsYXlvdXQtPmZmaVR5cGVzW2ldID0gdDsKKyAgICB9CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIFZBTFVFCitzdHJ1Y3RfbGF5b3V0X2FyZWYoVkFMVUUgc2VsZiwgVkFMVUUgZmllbGQpCit7CisgICAgU3RydWN0TGF5b3V0KiBsYXlvdXQ7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0TGF5b3V0LCBsYXlvdXQpOworCisgICAgcmV0dXJuIHJiX2hhc2hfYXJlZihsYXlvdXQtPnJiRmllbGRNYXAsIGZpZWxkKTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiBmaWVsZHMKKyAqIEByZXR1cm4gW0FycmF5PFN0cnVjdExheW91dDo6RmllbGQ+XQorICogR2V0IGZpZWxkcyBsaXN0LgorICovCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9sYXlvdXRfZmllbGRzKFZBTFVFIHNlbGYpCit7CisgICAgU3RydWN0TGF5b3V0KiBsYXlvdXQ7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0TGF5b3V0LCBsYXlvdXQpOworCisgICAgcmV0dXJuIHJiX2FyeV9kdXAobGF5b3V0LT5yYkZpZWxkcyk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogbWVtYmVycworICogQHJldHVybiBbQXJyYXk8U3ltYm9sPl0KKyAqIEdldCBsaXN0IG9mIGZpZWxkIG5hbWVzLgorICovCitzdGF0aWMgVkFMVUUKK3N0cnVjdF9sYXlvdXRfbWVtYmVycyhWQUxVRSBzZWxmKQoreworICAgIFN0cnVjdExheW91dCogbGF5b3V0OworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFN0cnVjdExheW91dCwgbGF5b3V0KTsKKworICAgIHJldHVybiByYl9hcnlfZHVwKGxheW91dC0+cmJGaWVsZE5hbWVzKTsKK30KKworLyoKKyAqIGNhbGwtc2VxOiB0b19hCisgKiBAcmV0dXJuIFtBcnJheTxTdHJ1Y3RMYXlvdXQ6OkZpZWxkPl0KKyAqIEdldCBhbiBhcnJheSBvZiBmaWVsZHMuCisgKi8KK3N0YXRpYyBWQUxVRQorc3RydWN0X2xheW91dF90b19hKFZBTFVFIHNlbGYpCit7CisgICAgU3RydWN0TGF5b3V0KiBsYXlvdXQ7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgU3RydWN0TGF5b3V0LCBsYXlvdXQpOworCisgICAgcmV0dXJuIHJiX2FyeV9kdXAobGF5b3V0LT5yYkZpZWxkcyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJ1Y3RfbGF5b3V0X21hcmsoU3RydWN0TGF5b3V0ICpsYXlvdXQpCit7CisgICAgcmJfZ2NfbWFyayhsYXlvdXQtPnJiRmllbGRNYXApOworICAgIHJiX2djX21hcmsobGF5b3V0LT5yYkZpZWxkTmFtZXMpOworICAgIHJiX2djX21hcmsobGF5b3V0LT5yYkZpZWxkcyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJ1Y3RfbGF5b3V0X2ZyZWUoU3RydWN0TGF5b3V0ICpsYXlvdXQpCit7CisgICAgeGZyZWUobGF5b3V0LT5mZmlUeXBlcyk7CisgICAgeGZyZWUobGF5b3V0LT5iYXNlLmZmaVR5cGUpOworICAgIHhmcmVlKGxheW91dC0+ZmllbGRzKTsKKyAgICBzdF9mcmVlX3RhYmxlKGxheW91dC0+ZmllbGRTeW1ib2xUYWJsZSk7CisgICAgeGZyZWUobGF5b3V0KTsKK30KKworCit2b2lkCityYmZmaV9TdHJ1Y3RMYXlvdXRfSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgVkFMVUUgZmZpX1R5cGUgPSByYmZmaV9UeXBlQ2xhc3M7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OlN0cnVjdExheW91dCA8IEZGSTo6VHlwZQorICAgICAqCisgICAgICogVGhpcyBjbGFzcyBhaW1zIGF0IGRlZmluaW5nIGEgc3RydWN0IGxheW91dC4KKyAgICAgKi8KKyAgICByYmZmaV9TdHJ1Y3RMYXlvdXRDbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtb2R1bGVGRkksICJTdHJ1Y3RMYXlvdXQiLCBmZmlfVHlwZSk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9TdHJ1Y3RMYXlvdXRDbGFzcyk7CisgICAgCisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jbGFzczogRkZJOjpTdHJ1Y3RMYXlvdXQ6OkZpZWxkCisgICAgICogQSBmaWVsZCBpbiBhIHtTdHJ1Y3RMYXlvdXR9LgorICAgICAqLworICAgIHJiZmZpX1N0cnVjdExheW91dEZpZWxkQ2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIocmJmZmlfU3RydWN0TGF5b3V0Q2xhc3MsICJGaWVsZCIsIHJiX2NPYmplY3QpOworICAgIHJiX2dsb2JhbF92YXJpYWJsZSgmcmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcyk7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OlN0cnVjdExheW91dDo6TnVtYmVyCisgICAgICogQSBudW1lcmljIHtGaWVsZH0gaW4gYSB7U3RydWN0TGF5b3V0fS4KKyAgICAgKi8KKyAgICByYmZmaV9TdHJ1Y3RMYXlvdXROdW1iZXJGaWVsZENsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKHJiZmZpX1N0cnVjdExheW91dENsYXNzLCAiTnVtYmVyIiwgcmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcyk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9TdHJ1Y3RMYXlvdXROdW1iZXJGaWVsZENsYXNzKTsKKworICAgIC8qCisgICAgICogRG9jdW1lbnQtY2xhc3M6IEZGSTo6U3RydWN0TGF5b3V0OjpTdHJpbmcKKyAgICAgKiBBIHN0cmluZyB7RmllbGR9IGluIGEge1N0cnVjdExheW91dH0uCisgICAgICovCisgICAgcmJmZmlfU3RydWN0TGF5b3V0U3RyaW5nRmllbGRDbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihyYmZmaV9TdHJ1Y3RMYXlvdXRDbGFzcywgIlN0cmluZyIsIHJiZmZpX1N0cnVjdExheW91dEZpZWxkQ2xhc3MpOworICAgIHJiX2dsb2JhbF92YXJpYWJsZSgmcmJmZmlfU3RydWN0TGF5b3V0U3RyaW5nRmllbGRDbGFzcyk7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OlN0cnVjdExheW91dDo6UG9pbnRlcgorICAgICAqIEEgcG9pbnRlciB7RmllbGR9IGluIGEge1N0cnVjdExheW91dH0uCisgICAgICovCisgICAgcmJmZmlfU3RydWN0TGF5b3V0UG9pbnRlckZpZWxkQ2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIocmJmZmlfU3RydWN0TGF5b3V0Q2xhc3MsICJQb2ludGVyIiwgcmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcyk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9TdHJ1Y3RMYXlvdXRQb2ludGVyRmllbGRDbGFzcyk7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OlN0cnVjdExheW91dDo6RnVuY3Rpb24KKyAgICAgKiBBIGZ1bmN0aW9uIHBvaW50ZXIge0ZpZWxkfSBpbiBhIHtTdHJ1Y3RMYXlvdXR9LgorICAgICAqLworICAgIHJiZmZpX1N0cnVjdExheW91dEZ1bmN0aW9uRmllbGRDbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihyYmZmaV9TdHJ1Y3RMYXlvdXRDbGFzcywgIkZ1bmN0aW9uIiwgcmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcyk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9TdHJ1Y3RMYXlvdXRGdW5jdGlvbkZpZWxkQ2xhc3MpOworCisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jbGFzczogRkZJOjpTdHJ1Y3RMYXlvdXQ6OkFycmF5CisgICAgICogQW4gYXJyYXkge0ZpZWxkfSBpbiBhIHtTdHJ1Y3RMYXlvdXR9LgorICAgICAqLworICAgIHJiZmZpX1N0cnVjdExheW91dEFycmF5RmllbGRDbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihyYmZmaV9TdHJ1Y3RMYXlvdXRDbGFzcywgIkFycmF5IiwgcmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcyk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9TdHJ1Y3RMYXlvdXRBcnJheUZpZWxkQ2xhc3MpOworCisgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMocmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcywgc3RydWN0X2ZpZWxkX2FsbG9jYXRlKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dEZpZWxkQ2xhc3MsICJpbml0aWFsaXplIiwgc3RydWN0X2ZpZWxkX2luaXRpYWxpemUsIC0xKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dEZpZWxkQ2xhc3MsICJvZmZzZXQiLCBzdHJ1Y3RfZmllbGRfb2Zmc2V0LCAwKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dEZpZWxkQ2xhc3MsICJzaXplIiwgc3RydWN0X2ZpZWxkX3NpemUsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcywgImFsaWdubWVudCIsIHN0cnVjdF9maWVsZF9hbGlnbm1lbnQsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0TGF5b3V0RmllbGRDbGFzcywgIm5hbWUiLCBzdHJ1Y3RfZmllbGRfbmFtZSwgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RMYXlvdXRGaWVsZENsYXNzLCAidHlwZSIsIHN0cnVjdF9maWVsZF90eXBlLCAwKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dEZpZWxkQ2xhc3MsICJwdXQiLCBzdHJ1Y3RfZmllbGRfcHV0LCAyKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dEZpZWxkQ2xhc3MsICJnZXQiLCBzdHJ1Y3RfZmllbGRfZ2V0LCAxKTsKKworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0TGF5b3V0RnVuY3Rpb25GaWVsZENsYXNzLCAicHV0IiwgZnVuY3Rpb25fZmllbGRfcHV0LCAyKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dEZ1bmN0aW9uRmllbGRDbGFzcywgImdldCIsIGZ1bmN0aW9uX2ZpZWxkX2dldCwgMSk7CisKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dEFycmF5RmllbGRDbGFzcywgImdldCIsIGFycmF5X2ZpZWxkX2dldCwgMSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RMYXlvdXRBcnJheUZpZWxkQ2xhc3MsICJwdXQiLCBhcnJheV9maWVsZF9wdXQsIDIpOworCisgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMocmJmZmlfU3RydWN0TGF5b3V0Q2xhc3MsIHN0cnVjdF9sYXlvdXRfYWxsb2NhdGUpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0TGF5b3V0Q2xhc3MsICJpbml0aWFsaXplIiwgc3RydWN0X2xheW91dF9pbml0aWFsaXplLCAzKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dENsYXNzLCAiW10iLCBzdHJ1Y3RfbGF5b3V0X2FyZWYsIDEpOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0TGF5b3V0Q2xhc3MsICJmaWVsZHMiLCBzdHJ1Y3RfbGF5b3V0X2ZpZWxkcywgMCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9TdHJ1Y3RMYXlvdXRDbGFzcywgIm1lbWJlcnMiLCBzdHJ1Y3RfbGF5b3V0X21lbWJlcnMsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfU3RydWN0TGF5b3V0Q2xhc3MsICJ0b19hIiwgc3RydWN0X2xheW91dF90b19hLCAwKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1N0cnVjdExheW91dENsYXNzLCAiX191bmlvbiEiLCBzdHJ1Y3RfbGF5b3V0X3VuaW9uX2JhbmcsIDApOworCit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdExheW91dC5vIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvU3RydWN0TGF5b3V0Lm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3N2ViNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1N0cnVjdExheW91dC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1RocmVhZC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvVGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhZTA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1RocmVhZC5jCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFdheW5lIE1laXNzbmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjZWxzZQorIyBpbmNsdWRlICJ3aW4zMi9zdGRib29sLmgiCisjIGluY2x1ZGUgIndpbjMyL3N0ZGludC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8ICFkZWZpbmVkKF9XSU4zMikKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorIyBpbmNsdWRlIDxlcnJuby5oPgorIyBpbmNsdWRlIDxzaWduYWwuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZWxzZQorIyBpbmNsdWRlIDx3aW5zb2NrMi5oPgorIyBkZWZpbmUgX1dJTlNPQ0tBUElfCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAiVGhyZWFkLmgiCisKKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyB2b2xhdGlsZSBEV09SRCBmcmFtZV90aHJlYWRfa2V5ID0gVExTX09VVF9PRl9JTkRFWEVTOworI2Vsc2UKK3N0YXRpYyBwdGhyZWFkX2tleV90IHRocmVhZF9kYXRhX2tleTsKK3N0cnVjdCB0aHJlYWRfZGF0YSB7CisgICAgcmJmZmlfZnJhbWVfdCogZnJhbWU7Cit9Oworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGhyZWFkX2RhdGEqIHRocmVhZF9kYXRhX2dldCh2b2lkKTsKKworI2VuZGlmCisKK3JiZmZpX2ZyYW1lX3QqCityYmZmaV9mcmFtZV9jdXJyZW50KHZvaWQpCit7CisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIChyYmZmaV9mcmFtZV90ICopIFRsc0dldFZhbHVlKGZyYW1lX3RocmVhZF9rZXkpOworI2Vsc2UKKyAgICBzdHJ1Y3QgdGhyZWFkX2RhdGEqIHRkID0gKHN0cnVjdCB0aHJlYWRfZGF0YSAqKSBwdGhyZWFkX2dldHNwZWNpZmljKHRocmVhZF9kYXRhX2tleSk7CisgICAgcmV0dXJuIHRkICE9IE5VTEwgPyB0ZC0+ZnJhbWUgOiBOVUxMOworI2VuZGlmCit9CisKK3ZvaWQgCityYmZmaV9mcmFtZV9wdXNoKHJiZmZpX2ZyYW1lX3QqIGZyYW1lKQoreworICAgIG1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKCpmcmFtZSkpOworICAgIGZyYW1lLT5oYXNfZ3ZsID0gdHJ1ZTsKKyAgICBmcmFtZS0+ZXhjID0gUW5pbDsKKyAgICAKKyNpZmRlZiBfV0lOMzIKKyAgICBmcmFtZS0+cHJldiA9IFRsc0dldFZhbHVlKGZyYW1lX3RocmVhZF9rZXkpOworICAgIFRsc1NldFZhbHVlKGZyYW1lX3RocmVhZF9rZXksIGZyYW1lKTsKKyNlbHNlCisgICAgZnJhbWUtPnRkID0gdGhyZWFkX2RhdGFfZ2V0KCk7CisgICAgZnJhbWUtPnByZXYgPSBmcmFtZS0+dGQtPmZyYW1lOworICAgIGZyYW1lLT50ZC0+ZnJhbWUgPSBmcmFtZTsKKyNlbmRpZgorfQorCit2b2lkIAorcmJmZmlfZnJhbWVfcG9wKHJiZmZpX2ZyYW1lX3QqIGZyYW1lKQoreworI2lmZGVmIF9XSU4zMgorICAgIFRsc1NldFZhbHVlKGZyYW1lX3RocmVhZF9rZXksIGZyYW1lLT5wcmV2KTsKKyNlbHNlCisgICAgZnJhbWUtPnRkLT5mcmFtZSA9IGZyYW1lLT5wcmV2OworI2VuZGlmCit9CisKKyNpZiAhKGRlZmluZWQoSEFWRV9SQl9USFJFQURfQkxPQ0tJTkdfUkVHSU9OKSB8fCBkZWZpbmVkKEhBVkVfUkJfVEhSRUFEX0NBTExfV0lUSE9VVF9HVkwpKQorCisjaWYgIWRlZmluZWQoX1dJTjMyKQorCitzdHJ1Y3QgQmxvY2tpbmdUaHJlYWQgeworICAgIHB0aHJlYWRfdCB0aWQ7CisgICAgVkFMVUUgKCpmbikodm9pZCAqKTsKKyAgICB2b2lkICpkYXRhOworICAgIHZvaWQgKCp1YmYpKHZvaWQgKik7CisgICAgdm9pZCAqZGF0YTI7CisgICAgVkFMVUUgcmV0dmFsOworICAgIGludCB3cmZkOworICAgIGludCByZGZkOworfTsKKworc3RhdGljIHZvaWQqCityYmZmaV9ibG9ja2luZ190aHJlYWQodm9pZCogYXJncykKK3sKKyAgICBzdHJ1Y3QgQmxvY2tpbmdUaHJlYWQqIHRociA9IChzdHJ1Y3QgQmxvY2tpbmdUaHJlYWQgKikgYXJnczsKKyAgICBjaGFyIGMgPSAxOworICAgIFZBTFVFIHJldHZhbDsKKyAgICAKKyAgICByZXR2YWwgPSAoKnRoci0+Zm4pKHRoci0+ZGF0YSk7CisgICAgCisgICAgcHRocmVhZF90ZXN0Y2FuY2VsKCk7CisKKyAgICB0aHItPnJldHZhbCA9IHJldHZhbDsKKyAgICAKKyAgICB3cml0ZSh0aHItPndyZmQsICZjLCBzaXplb2YoYykpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBWQUxVRQord2FpdF9mb3JfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisgICAgc3RydWN0IEJsb2NraW5nVGhyZWFkKiB0aHIgPSAoc3RydWN0IEJsb2NraW5nVGhyZWFkICopIGRhdGE7CisgICAgY2hhciBjOworICAgIAorICAgIGlmIChyZWFkKHRoci0+cmRmZCwgJmMsIDEpIDwgMSkgeworICAgICAgICByYl90aHJlYWRfd2FpdF9mZCh0aHItPnJkZmQpOworICAgICAgICB3aGlsZSAocmVhZCh0aHItPnJkZmQsICZjLCAxKSA8IDEgJiYgcmJfaW9fd2FpdF9yZWFkYWJsZSh0aHItPnJkZmQpID09IFF0cnVlKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gUW5pbDsKK30KKworc3RhdGljIFZBTFVFCitjbGVhbnVwX2Jsb2NraW5nX3RocmVhZCh2b2lkICpkYXRhLCBWQUxVRSBleGMpCit7CisgICAgc3RydWN0IEJsb2NraW5nVGhyZWFkKiB0aHIgPSAoc3RydWN0IEJsb2NraW5nVGhyZWFkICopIGRhdGE7CisKKyAgICBpZiAodGhyLT51YmYgIT0gKHZvaWQgKCopKHZvaWQgKikpIC0xKSB7CisgICAgICAgICgqdGhyLT51YmYpKHRoci0+ZGF0YTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfa2lsbCh0aHItPnRpZCwgU0lHVlRBTFJNKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXhjOworfQorCitWQUxVRQorcmJmZmlfdGhyZWFkX2Jsb2NraW5nX3JlZ2lvbihWQUxVRSAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGExLCB2b2lkICgqdWJmKSh2b2lkICopLCB2b2lkICpkYXRhMikKK3sKKyAgICBzdHJ1Y3QgQmxvY2tpbmdUaHJlYWQqIHRocjsKKyAgICBpbnQgZmRbMl07CisgICAgVkFMVUUgZXhjOworICAgIAorICAgIGlmIChwaXBlKGZkKSA8IDApIHsKKyAgICAgICAgcmJfcmFpc2UocmJfZVN5c3RlbUNhbGxFcnJvciwgInBpcGUoMikgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBRbmlsOworICAgIH0KKyAgICBmY250bChmZFswXSwgRl9TRVRGTCwgZmNudGwoZmRbMF0sIEZfR0VURkwpIHwgT19OT05CTE9DSyk7CisKKyAgICB0aHIgPSBBTExPQ19OKHN0cnVjdCBCbG9ja2luZ1RocmVhZCwgMSk7CisgICAgdGhyLT5yZGZkID0gZmRbMF07CisgICAgdGhyLT53cmZkID0gZmRbMV07CisgICAgdGhyLT5mbiA9IGZ1bmM7CisgICAgdGhyLT5kYXRhID0gZGF0YTE7CisgICAgdGhyLT51YmYgPSB1YmY7CisgICAgdGhyLT5kYXRhMiA9IGRhdGEyOworICAgIHRoci0+cmV0dmFsID0gUW5pbDsKKworICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyLT50aWQsIE5VTEwsIHJiZmZpX2Jsb2NraW5nX3RocmVhZCwgdGhyKSAhPSAwKSB7CisgICAgICAgIGNsb3NlKGZkWzBdKTsKKyAgICAgICAgY2xvc2UoZmRbMV0pOworICAgICAgICB4ZnJlZSh0aHIpOworICAgICAgICByYl9yYWlzZShyYl9lU3lzdGVtQ2FsbEVycm9yLCAicGlwZSgyKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgfQorCisgICAgZXhjID0gcmJfcmVzY3VlMih3YWl0X2Zvcl90aHJlYWQsIChWQUxVRSkgdGhyLCBjbGVhbnVwX2Jsb2NraW5nX3RocmVhZCwgKFZBTFVFKSB0aHIsCisgICAgICAgIHJiX2VFeGNlcHRpb24pOworICAgIAorICAgIHB0aHJlYWRfam9pbih0aHItPnRpZCwgTlVMTCk7CisgICAgY2xvc2UoZmRbMV0pOworICAgIGNsb3NlKGZkWzBdKTsKKyAgICB4ZnJlZSh0aHIpOworCisgICAgaWYgKGV4YyAhPSBRbmlsKSB7CisgICAgICAgIHJiX2V4Y19yYWlzZShleGMpOworICAgIH0KKworICAgIHJldHVybiB0aHItPnJldHZhbDsKK30KKworI2Vsc2UKKy8qIHdpbjMyIGltcGxlbWVudGF0aW9uICovCisKK3N0cnVjdCBCbG9ja2luZ1RocmVhZCB7CisgICAgSEFORExFIHRpZDsKKyAgICBWQUxVRSAoKmZuKSh2b2lkICopOworICAgIHZvaWQgKmRhdGE7CisgICAgdm9pZCAoKnViZikodm9pZCAqKTsKKyAgICB2b2lkICpkYXRhMjsKKyAgICBWQUxVRSByZXR2YWw7CisgICAgaW50IHdyZmQ7CisgICAgaW50IHJkZmQ7Cit9OworCitzdGF0aWMgRFdPUkQgX19zdGRjYWxsCityYmZmaV9ibG9ja2luZ190aHJlYWQoTFBWT0lEIGFyZ3MpCit7CisgICAgc3RydWN0IEJsb2NraW5nVGhyZWFkKiB0aHIgPSAoc3RydWN0IEJsb2NraW5nVGhyZWFkICopIGFyZ3M7CisgICAgY2hhciBjID0gMTsKKyAgICBWQUxVRSByZXR2YWw7CisKKyAgICByZXR2YWwgPSAoKnRoci0+Zm4pKHRoci0+ZGF0YSk7CisgICAgdGhyLT5yZXR2YWwgPSByZXR2YWw7CisKKyAgICB3cml0ZSh0aHItPndyZmQsICZjLCBzaXplb2YoYykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBWQUxVRQord2FpdF9mb3JfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisgICAgc3RydWN0IEJsb2NraW5nVGhyZWFkKiB0aHIgPSAoc3RydWN0IEJsb2NraW5nVGhyZWFkICopIGRhdGE7CisgICAgY2hhciBjLCByZXM7CisgICAgZmRfc2V0IHJmZHM7CisKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBGRF9TRVQodGhyLT5yZGZkLCAmcmZkcyk7CisgICAgcmJfdGhyZWFkX3NlbGVjdCh0aHItPnJkZmQgKyAxLCAmcmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcmVhZCh0aHItPnJkZmQsICZjLCAxKTsKKyAgICByZXR1cm4gUW5pbDsKK30KKworc3RhdGljIFZBTFVFCitjbGVhbnVwX2Jsb2NraW5nX3RocmVhZCh2b2lkICpkYXRhLCBWQUxVRSBleGMpCit7CisgICAgc3RydWN0IEJsb2NraW5nVGhyZWFkKiB0aHIgPSAoc3RydWN0IEJsb2NraW5nVGhyZWFkICopIGRhdGE7CisKKyAgICBpZiAodGhyLT51YmYgIT0gKHZvaWQgKCopKHZvaWQgKikpIC0xKSB7CisgICAgICAgICgqdGhyLT51YmYpKHRoci0+ZGF0YTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRlcm1pbmF0ZVRocmVhZCh0aHItPnRpZCwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGV4YzsKK30KKworVkFMVUUKK3JiZmZpX3RocmVhZF9ibG9ja2luZ19yZWdpb24oVkFMVUUgKCpmdW5jKSh2b2lkICopLCB2b2lkICpkYXRhMSwgdm9pZCAoKnViZikodm9pZCAqKSwgdm9pZCAqZGF0YTIpCit7CisgICAgc3RydWN0IEJsb2NraW5nVGhyZWFkKiB0aHI7CisgICAgaW50IGZkWzJdOworICAgIFZBTFVFIGV4YzsKKyAgICBEV09SRCBzdGF0ZTsKKyAgICBEV09SRCByZXM7CisKKyAgICBpZiAoX3BpcGUoZmQsIDEwMjQsIE9fQklOQVJZKSA9PSAtMSkgeworICAgICAgICByYl9yYWlzZShyYl9lU3lzdGVtQ2FsbEVycm9yLCAiX3BpcGUoKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgfQorCisgICAgdGhyID0gQUxMT0NfTihzdHJ1Y3QgQmxvY2tpbmdUaHJlYWQsIDEpOworICAgIHRoci0+cmRmZCA9IGZkWzBdOworICAgIHRoci0+d3JmZCA9IGZkWzFdOworICAgIHRoci0+Zm4gPSBmdW5jOworICAgIHRoci0+ZGF0YSA9IGRhdGExOworICAgIHRoci0+dWJmID0gdWJmOworICAgIHRoci0+ZGF0YTIgPSBkYXRhMjsKKyAgICB0aHItPnJldHZhbCA9IFFuaWw7CisKKyAgICB0aHItPnRpZCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCByYmZmaV9ibG9ja2luZ190aHJlYWQsIHRociwgMCwgTlVMTCk7CisgICAgaWYgKCF0aHItPnRpZCkgeworICAgICAgICBjbG9zZShmZFswXSk7CisgICAgICAgIGNsb3NlKGZkWzFdKTsKKyAgICAgICAgeGZyZWUodGhyKTsKKyAgICAgICAgcmJfcmFpc2UocmJfZVN5c3RlbUNhbGxFcnJvciwgIkNyZWF0ZVRocmVhZCgpIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gUW5pbDsKKyAgICB9CisKKyAgICBleGMgPSByYl9yZXNjdWUyKHdhaXRfZm9yX3RocmVhZCwgKFZBTFVFKSB0aHIsIGNsZWFudXBfYmxvY2tpbmdfdGhyZWFkLCAoVkFMVUUpIHRociwKKyAgICAgICAgcmJfZUV4Y2VwdGlvbik7CisKKyAgICAvKiBUaGUgdGhyZWFkIHNob3VsZCBiZSBmaW5pc2hlZCwgYWxyZWFkeS4gKi8KKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRoci0+dGlkLCBJTkZJTklURSk7CisgICAgQ2xvc2VIYW5kbGUodGhyLT50aWQpOworICAgIGNsb3NlKGZkWzFdKTsKKyAgICBjbG9zZShmZFswXSk7CisgICAgeGZyZWUodGhyKTsKKworICAgIGlmIChleGMgIT0gUW5pbCkgeworICAgICAgICByYl9leGNfcmFpc2UoZXhjKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhyLT5yZXR2YWw7Cit9CisKKyNlbmRpZiAvKiAhX1dJTjMyICovCisKKyNlbmRpZiAvKiBIQVZFX1JCX1RIUkVBRF9CTE9DS0lOR19SRUdJT04gKi8KKworI2lmbmRlZiBfV0lOMzIKK3N0YXRpYyBzdHJ1Y3QgdGhyZWFkX2RhdGEqIHRocmVhZF9kYXRhX2luaXQodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9kYXRhKgordGhyZWFkX2RhdGFfZ2V0KHZvaWQpCit7CisgICAgc3RydWN0IHRocmVhZF9kYXRhKiB0ZCA9IChzdHJ1Y3QgdGhyZWFkX2RhdGEgKikgcHRocmVhZF9nZXRzcGVjaWZpYyh0aHJlYWRfZGF0YV9rZXkpOworICAgIHJldHVybiB0ZCAhPSBOVUxMID8gdGQgOiB0aHJlYWRfZGF0YV9pbml0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGhyZWFkX2RhdGEqCit0aHJlYWRfZGF0YV9pbml0KHZvaWQpCit7CisgICAgc3RydWN0IHRocmVhZF9kYXRhKiB0ZCA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRocmVhZF9kYXRhKSk7CisKKyAgICBwdGhyZWFkX3NldHNwZWNpZmljKHRocmVhZF9kYXRhX2tleSwgdGQpOworCisgICAgcmV0dXJuIHRkOworfQorCitzdGF0aWMgdm9pZAordGhyZWFkX2RhdGFfZnJlZSh2b2lkICpwdHIpCit7CisgICAgZnJlZShwdHIpOworfQorI2VuZGlmCisKK3ZvaWQKK3JiZmZpX1RocmVhZF9Jbml0KFZBTFVFIG1vZHVsZUZGSSkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgICBmcmFtZV90aHJlYWRfa2V5ID0gVGxzQWxsb2MoKTsKKyNlbHNlCisgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZ0aHJlYWRfZGF0YV9rZXksIHRocmVhZF9kYXRhX2ZyZWUpOyAgICAKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvVGhyZWFkLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTFhNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvVGhyZWFkLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJCRkZJX1RIUkVBRF9ICisjZGVmaW5lCVJCRkZJX1RIUkVBRF9ICisKKyNpZm5kZWYgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAid2luMzIvc3RkYm9vbC5oIgorIyBpbmNsdWRlICJ3aW4zMi9zdGRpbnQuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHJ1YnkuaD4KKyNpbmNsdWRlICJleHRjb25mLmgiCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjaWZkZWYgX1dJTjMyCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisjaWZkZWYgX1dJTjMyCisgICAgRFdPUkQgaWQ7CisjZWxzZQorICAgIHB0aHJlYWRfdCBpZDsKKyNlbmRpZgorICAgIGJvb2wgdmFsaWQ7CisgICAgYm9vbCBoYXNfZ3ZsOworICAgIFZBTFVFIGV4YzsKK30gcmJmZmlfdGhyZWFkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHJiZmZpX2ZyYW1lIHsKKyNpZm5kZWYgX1dJTjMyCisgICAgc3RydWN0IHRocmVhZF9kYXRhKiB0ZDsKKyNlbmRpZgorICAgIHN0cnVjdCByYmZmaV9mcmFtZSogcHJldjsKKyAgICBib29sIGhhc19ndmw7CisgICAgVkFMVUUgZXhjOworfSByYmZmaV9mcmFtZV90OworCityYmZmaV9mcmFtZV90KiByYmZmaV9mcmFtZV9jdXJyZW50KHZvaWQpOwordm9pZCByYmZmaV9mcmFtZV9wdXNoKHJiZmZpX2ZyYW1lX3QqIGZyYW1lKTsKK3ZvaWQgcmJmZmlfZnJhbWVfcG9wKHJiZmZpX2ZyYW1lX3QqIGZyYW1lKTsKKworI2lmZGVmIEhBVkVfUkJfVEhSRUFEX0NBTExfV0lUSE9VVF9HVkwKKyMgZGVmaW5lIHJiZmZpX3RocmVhZF9ibG9ja2luZ19yZWdpb24gcmJfdGhyZWFkX2NhbGxfd2l0aG91dF9ndmwKKworI2VsaWYgZGVmaW5lZChIQVZFX1JCX1RIUkVBRF9CTE9DS0lOR19SRUdJT04pCisjIGRlZmluZSByYmZmaV90aHJlYWRfYmxvY2tpbmdfcmVnaW9uIHJiX3RocmVhZF9ibG9ja2luZ19yZWdpb24KKworI2Vsc2UKKworVkFMVUUgcmJmZmlfdGhyZWFkX2Jsb2NraW5nX3JlZ2lvbihWQUxVRSAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGExLCB2b2lkICgqdWJmKSh2b2lkICopLCB2b2lkICpkYXRhMik7CisKKyNlbmRpZgorCisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBSQkZGSV9USFJFQURfSCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UaHJlYWQubyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1RocmVhZC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGI3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UaHJlYWQubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UeXBlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UeXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0NDgyZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1R5cGUuYwpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cnVieS5oPgorI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgInJiZmZpLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAiVHlwZXMuaCIKKyNpbmNsdWRlICJUeXBlLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgQnVpbHRpblR5cGVfIHsKKyAgICBUeXBlIHR5cGU7CisgICAgY2hhciogbmFtZTsKK30gQnVpbHRpblR5cGU7CisKK3N0YXRpYyB2b2lkIGJ1aWx0aW5fdHlwZV9mcmVlKEJ1aWx0aW5UeXBlICopOworCitWQUxVRSByYmZmaV9UeXBlQ2xhc3MgPSBRbmlsOworCitzdGF0aWMgVkFMVUUgY2xhc3NCdWlsdGluVHlwZSA9IFFuaWw7CitzdGF0aWMgVkFMVUUgbW9kdWxlTmF0aXZlVHlwZSA9IFFuaWw7CitzdGF0aWMgVkFMVUUgdHlwZU1hcCA9IFFuaWwsIHNpemVNYXAgPSBRbmlsOworc3RhdGljIElEIGlkX2ZpbmRfdHlwZSA9IDAsIGlkX3R5cGVfc2l6ZSA9IDAsIGlkX3NpemUgPSAwOworCitzdGF0aWMgVkFMVUUKK3R5cGVfYWxsb2NhdGUoVkFMVUUga2xhc3MpCit7CisgICAgVHlwZSogdHlwZTsKKyAgICBWQUxVRSBvYmogPSBEYXRhX01ha2VfU3RydWN0KGtsYXNzLCBUeXBlLCBOVUxMLCAtMSwgdHlwZSk7CisKKyAgICB0eXBlLT5uYXRpdmVUeXBlID0gLTE7CisgICAgdHlwZS0+ZmZpVHlwZSA9ICZmZmlfdHlwZV92b2lkOworICAgIAorICAgIHJldHVybiBvYmo7Cit9CisKKy8qCisgKiBEb2N1bWVudC1tZXRob2Q6IGluaXRpYWxpemUKKyAqIGNhbGwtc2VxOiBpbml0aWFsaXplKHZhbHVlKQorICogQHBhcmFtIFtGaXhudW0sVHlwZV0gdmFsdWUKKyAqIEByZXR1cm4gW3NlbGZdCisgKi8KK3N0YXRpYyBWQUxVRQordHlwZV9pbml0aWFsaXplKFZBTFVFIHNlbGYsIFZBTFVFIHZhbHVlKQoreworICAgIFR5cGUqIHR5cGU7CisgICAgVHlwZSogb3RoZXI7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgVHlwZSwgdHlwZSk7CisKKyAgICBpZiAoRklYTlVNX1AodmFsdWUpKSB7CisgICAgICAgIHR5cGUtPm5hdGl2ZVR5cGUgPSBGSVgySU5UKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHJiX29ial9pc19raW5kX29mKHZhbHVlLCByYmZmaV9UeXBlQ2xhc3MpKSB7CisgICAgICAgIERhdGFfR2V0X1N0cnVjdCh2YWx1ZSwgVHlwZSwgb3RoZXIpOworICAgICAgICB0eXBlLT5uYXRpdmVUeXBlID0gb3RoZXItPm5hdGl2ZVR5cGU7CisgICAgICAgIHR5cGUtPmZmaVR5cGUgPSBvdGhlci0+ZmZpVHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJ3cm9uZyB0eXBlIik7CisgICAgfQorICAgIAorICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogY2FsbC1zZXE6IHR5cGUuc2l6ZQorICogQHJldHVybiBbRml4bnVtXQorICogUmV0dXJuIHR5cGUncyBzaXplLCBpbiBieXRlcy4KKyAqLworc3RhdGljIFZBTFVFCit0eXBlX3NpemUoVkFMVUUgc2VsZikKK3sKKyAgICBUeXBlICp0eXBlOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIFR5cGUsIHR5cGUpOworCisgICAgcmV0dXJuIElOVDJGSVgodHlwZS0+ZmZpVHlwZS0+c2l6ZSk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogdHlwZS5hbGlnbm1lbnQKKyAqIEByZXR1cm4gW0ZpeG51bV0KKyAqIEdldCBUeXBlIGFsaWdubWVudC4KKyAqLworc3RhdGljIFZBTFVFCit0eXBlX2FsaWdubWVudChWQUxVRSBzZWxmKQoreworICAgIFR5cGUgKnR5cGU7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgVHlwZSwgdHlwZSk7CisKKyAgICByZXR1cm4gSU5UMkZJWCh0eXBlLT5mZmlUeXBlLT5hbGlnbm1lbnQpOworfQorCisvKgorICogY2FsbC1zZXE6IHR5cGUuaW5zcGVjdAorICogQHJldHVybiBbU3RyaW5nXQorICogSW5zcGVjdCB7VHlwZX0gb2JqZWN0LgorICovCitzdGF0aWMgVkFMVUUKK3R5cGVfaW5zcGVjdChWQUxVRSBzZWxmKQoreworICAgIGNoYXIgYnVmWzEwMF07CisgICAgVHlwZSAqdHlwZTsKKworICAgIERhdGFfR2V0X1N0cnVjdChzZWxmLCBUeXBlLCB0eXBlKTsKKworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIjPCVzOiVwIHNpemU9JWQgYWxpZ25tZW50PSVkPiIsCisgICAgICAgICAgICByYl9vYmpfY2xhc3NuYW1lKHNlbGYpLCB0eXBlLCAoaW50KSB0eXBlLT5mZmlUeXBlLT5zaXplLCAoaW50KSB0eXBlLT5mZmlUeXBlLT5hbGlnbm1lbnQpOworCisgICAgcmV0dXJuIHJiX3N0cl9uZXcyKGJ1Zik7Cit9CisKK3N0YXRpYyBWQUxVRQorYnVpbHRpbl90eXBlX25ldyhWQUxVRSBrbGFzcywgaW50IG5hdGl2ZVR5cGUsIGZmaV90eXBlKiBmZmlUeXBlLCBjb25zdCBjaGFyKiBuYW1lKQoreworICAgIEJ1aWx0aW5UeXBlKiB0eXBlOworICAgIFZBTFVFIG9iaiA9IFFuaWw7CisKKyAgICBvYmogPSBEYXRhX01ha2VfU3RydWN0KGtsYXNzLCBCdWlsdGluVHlwZSwgTlVMTCwgYnVpbHRpbl90eXBlX2ZyZWUsIHR5cGUpOworICAgIAorICAgIHR5cGUtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisgICAgdHlwZS0+dHlwZS5uYXRpdmVUeXBlID0gbmF0aXZlVHlwZTsKKyAgICB0eXBlLT50eXBlLmZmaVR5cGUgPSBmZmlUeXBlOworCisgICAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQKK2J1aWx0aW5fdHlwZV9mcmVlKEJ1aWx0aW5UeXBlICp0eXBlKQoreworICAgIGZyZWUodHlwZS0+bmFtZSk7CisgICAgeGZyZWUodHlwZSk7Cit9CisKKy8qCisgKiBjYWxsLXNlcTogdHlwZS5pbnNwZWN0CisgKiBAcmV0dXJuIFtTdHJpbmddCisgKiBJbnNwZWN0IHtUeXBlOjpCdWlsdGlufSBvYmplY3QuCisgKi8KK3N0YXRpYyBWQUxVRQorYnVpbHRpbl90eXBlX2luc3BlY3QoVkFMVUUgc2VsZikKK3sKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIEJ1aWx0aW5UeXBlICp0eXBlOworCisgICAgRGF0YV9HZXRfU3RydWN0KHNlbGYsIEJ1aWx0aW5UeXBlLCB0eXBlKTsKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiIzwlczolcyBzaXplPSVkIGFsaWdubWVudD0lZD4iLAorICAgICAgICAgICAgcmJfb2JqX2NsYXNzbmFtZShzZWxmKSwgdHlwZS0+bmFtZSwgKGludCkgdHlwZS0+dHlwZS5mZmlUeXBlLT5zaXplLCB0eXBlLT50eXBlLmZmaVR5cGUtPmFsaWdubWVudCk7CisKKyAgICByZXR1cm4gcmJfc3RyX25ldzIoYnVmKTsKK30KKworaW50CityYmZmaV90eXBlX3NpemUoVkFMVUUgdHlwZSkKK3sKKyAgICBpbnQgdCA9IFRZUEUodHlwZSk7CisgICAgCisgICAgaWYgKHQgPT0gVF9GSVhOVU0gfHwgdCA9PSBUX0JJR05VTSkgeworICAgICAgICByZXR1cm4gTlVNMklOVCh0eXBlKTsKKyAgICAKKyAgICB9IGVsc2UgaWYgKHQgPT0gVF9TWU1CT0wpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVHJ5IGxvb2tpbmcgdXAgZGlyZWN0bHkgaW4gdGhlIHR5cGUgYW5kIHNpemUgbWFwcworICAgICAgICAgKi8KKyAgICAgICAgVkFMVUUgblR5cGU7CisgICAgICAgIGlmICgoblR5cGUgPSByYl9oYXNoX2xvb2t1cCh0eXBlTWFwLCB0eXBlKSkgIT0gUW5pbCkgeworICAgICAgICAgICAgaWYgKHJiX29ial9pc19raW5kX29mKG5UeXBlLCByYmZmaV9UeXBlQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgVHlwZSogdHlwZTsKKyAgICAgICAgICAgICAgICBEYXRhX0dldF9TdHJ1Y3QoblR5cGUsIFR5cGUsIHR5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiAoaW50KSB0eXBlLT5mZmlUeXBlLT5zaXplOworICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKHJiX3Jlc3BvbmRfdG8oblR5cGUsIGlkX3NpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTTJJTlQocmJfZnVuY2FsbDIoblR5cGUsIGlkX3NpemUsIDAsIE5VTEwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdCBmb3VuZCAtIGNhbGwgdXAgdG8gdGhlIHJ1YnkgdmVyc2lvbiB0byByZXNvbHZlICovCisgICAgICAgIHJldHVybiBOVU0ySU5UKHJiX2Z1bmNhbGwyKHJiZmZpX0ZGSU1vZHVsZSwgaWRfdHlwZV9zaXplLCAxLCAmdHlwZSkpOworICAgIAorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVU0ySU5UKHJiX2Z1bmNhbGwyKHR5cGUsIGlkX3NpemUsIDAsIE5VTEwpKTsKKyAgICB9Cit9CisKK1ZBTFVFCityYmZmaV9UeXBlX0xvb2t1cChWQUxVRSBuYW1lKQoreworICAgIGludCB0ID0gVFlQRShuYW1lKTsKKyAgICBpZiAodCA9PSBUX1NZTUJPTCB8fCB0ID09IFRfU1RSSU5HKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRyeSBsb29raW5nIHVwIGRpcmVjdGx5IGluIHRoZSB0eXBlIE1hcAorICAgICAgICAgKi8KKyAgICAgICAgVkFMVUUgblR5cGU7CisgICAgICAgIGlmICgoblR5cGUgPSByYl9oYXNoX2xvb2t1cCh0eXBlTWFwLCBuYW1lKSkgIT0gUW5pbCAmJiByYl9vYmpfaXNfa2luZF9vZihuVHlwZSwgcmJmZmlfVHlwZUNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIG5UeXBlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChyYl9vYmpfaXNfa2luZF9vZihuYW1lLCByYmZmaV9UeXBlQ2xhc3MpKSB7CisgICAgCisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qIE5vdGhpbmcgZm91bmQgLSBsZXQgY2FsbGVyIGhhbmRsZSByYWlzaW5nIGV4Y2VwdGlvbnMgKi8KKyAgICByZXR1cm4gUW5pbDsKK30KKworLyoqCisgKiByYmZmaV9UeXBlX0ZpbmQoKSBpcyBsaWtlIHJiZmZpX1R5cGVfTG9va3VwLCBidXQgYW4gZXJyb3IgaXMgcmFpc2VkIGlmIHRoZQorICogdHlwZSBpcyBub3QgZm91bmQuCisgKi8KK1ZBTFVFCityYmZmaV9UeXBlX0ZpbmQoVkFMVUUgbmFtZSkKK3sKKyAgICBWQUxVRSByYlR5cGUgPSByYmZmaV9UeXBlX0xvb2t1cChuYW1lKTsKKworICAgIGlmICghUlRFU1QocmJUeXBlKSkgeworICAgICAgICBWQUxVRSBzID0gcmJfaW5zcGVjdChuYW1lKTsKKyAgICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgImludmFsaWQgdHlwZSwgJXMiLCBSU1RSSU5HX1BUUihzKSk7CisgICAgICAgIFJCX0dDX0dVQVJEKHMpOworICAgIH0KKworICAgIHJldHVybiByYlR5cGU7Cit9CisKK3ZvaWQKK3JiZmZpX1R5cGVfSW5pdChWQUxVRSBtb2R1bGVGRkkpCit7CisgICAgLyoKKyAgICAgKiBEb2N1bWVudC1jbGFzczogRkZJOjpUeXBlCisgICAgICogVGhpcyBjbGFzcyBtYW5hZ2VzIEMgdHlwZXMuCisgICAgICoKKyAgICAgKiBJdCBlbWJiZWQge0ZGSTo6VHlwZTo6QnVpbHRpbn0gb2JqZWN0cyBhcyBjb25zdGFudHMgKGZvciBuYW1lcywKKyAgICAgKiBzZWUge0ZGSTo6TmF0aXZlVHlwZX0pLgorICAgICAqLworICAgIHJiZmZpX1R5cGVDbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtb2R1bGVGRkksICJUeXBlIiwgcmJfY09iamVjdCk7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNvbnN0YW50OiBGRkk6OlR5cGVEZWZzCisgICAgICovCisgICAgcmJfZGVmaW5lX2NvbnN0KG1vZHVsZUZGSSwgIlR5cGVEZWZzIiwgdHlwZU1hcCA9IHJiX2hhc2hfbmV3KCkpOworICAgIHJiX2RlZmluZV9jb25zdChtb2R1bGVGRkksICJTaXplVHlwZXMiLCBzaXplTWFwID0gcmJfaGFzaF9uZXcoKSk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZ0eXBlTWFwKTsKKyAgICByYl9nbG9iYWxfdmFyaWFibGUoJnNpemVNYXApOworICAgIGlkX2ZpbmRfdHlwZSA9IHJiX2ludGVybigiZmluZF90eXBlIik7CisgICAgaWRfdHlwZV9zaXplID0gcmJfaW50ZXJuKCJ0eXBlX3NpemUiKTsKKyAgICBpZF9zaXplID0gcmJfaW50ZXJuKCJzaXplIik7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNsYXNzOiBGRkk6OlR5cGU6OkJ1aWx0aW4KKyAgICAgKiBDbGFzcyBmb3IgQnVpbHQtaW4gdHlwZXMuCisgICAgICovCisgICAgY2xhc3NCdWlsdGluVHlwZSA9IHJiX2RlZmluZV9jbGFzc191bmRlcihyYmZmaV9UeXBlQ2xhc3MsICJCdWlsdGluIiwgcmJmZmlfVHlwZUNsYXNzKTsKKyAgICAvKgorICAgICAqIERvY3VtZW50LW1vZHVsZTogRkZJOjpOYXRpdmVUeXBlCisgICAgICogVGhpcyBtb2R1bGUgZGVmaW5lcyBjb25zdGFudHMgZm9yIG5hdGl2ZSAoQykgdHlwZXMuCisgICAgICoKKyAgICAgKiA9PU5hdGl2ZSB0eXBlIGNvbnN0YW50cworICAgICAqIE5hdGl2ZSB0eXBlcyBhcmUgZGVmaW5lZCBieSBjb25zdGFudHMgOgorICAgICAqICogSU5UOCwgU0NIQVIsIENIQVIKKyAgICAgKiAqIFVJTlQ4LCBVQ0hBUgorICAgICAqICogSU5UMTYsIFNIT1JULCBTU0hPUlQKKyAgICAgKiAqIFVJTlQxNiwgVVNIT1JUCisgICAgICogKiBJTlQzMiwsIElOVCwgU0lOVAorICAgICAqICogVUlOVDMyLCBVSU5UCisgICAgICogKiBJTlQ2NCwgTE9OR19MT05HLCBTTE9OR19MT05HCisgICAgICogKiBVSU5UNjQsIFVMT05HX0xPTkcKKyAgICAgKiAqIExPTkcsIFNMT05HCisgICAgICogKiBVTE9ORworICAgICAqICogRkxPQVQzMiwgRkxPQVQKKyAgICAgKiAqIEZMT0FUNjQsIERPVUJMRQorICAgICAqICogUE9JTlRFUgorICAgICAqICogQ0FMTEJBQ0sKKyAgICAgKiAqIEZVTkNUSU9OCisgICAgICogKiBDSEFSX0FSUkFZCisgICAgICogKiBCT09MCisgICAgICogKiBTVFJJTkcgKGltbXV0YWJsZSBzdHJpbmcsIG51bCB0ZXJtaW5hdGVkKQorICAgICAqICogU1RSVUNUIChzdHJ1Y3QtYi12YWx1ZSBwYXJhbSBvciByZXN1bHQpCisgICAgICogKiBBUlJBWSAoYXJyYXkgdHlwZSBkZWZpbml0aW9uKQorICAgICAqICogTUFQUEVEIChjdXN0b20gbmF0aXZlIHR5cGUpCisgICAgICogRm9yIGZ1bmN0aW9uIHJldHVybiB0eXBlIG9ubHkgOgorICAgICAqICogVk9JRAorICAgICAqIEZvciBmdW5jdGlvbiBhcmd1bWVudCB0eXBlIG9ubHkgOgorICAgICAqICogQlVGRkVSX0lOCisgICAgICogKiBCVUZGRVJfT1VUCisgICAgICogKiBWQVJBUkdTIChmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMpCisgICAgICoKKyAgICAgKiBBbGwgdGhlc2UgY29uc3RhbnRzIGFyZSBleHBvcnRlZCB0byB7RkZJfSBtb2R1bGUgcHJlZml4ZWQgd2l0aCAiVFlQRV8iLiAKKyAgICAgKiBUaGV5IGFyZSBvYmpldHMgZnJvbSB7RkZJOjpUeXBlOjpCdWlsdGlufSBjbGFzcy4KKyAgICAgKi8KKyAgICBtb2R1bGVOYXRpdmVUeXBlID0gcmJfZGVmaW5lX21vZHVsZV91bmRlcihtb2R1bGVGRkksICJOYXRpdmVUeXBlIik7CisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWdsb2JhbDogRkZJOjpUeXBlCisgICAgICovCisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZyYmZmaV9UeXBlQ2xhc3MpOworICAgIHJiX2dsb2JhbF92YXJpYWJsZSgmY2xhc3NCdWlsdGluVHlwZSk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZtb2R1bGVOYXRpdmVUeXBlKTsKKworICAgIHJiX2RlZmluZV9hbGxvY19mdW5jKHJiZmZpX1R5cGVDbGFzcywgdHlwZV9hbGxvY2F0ZSk7CisgICAgcmJfZGVmaW5lX21ldGhvZChyYmZmaV9UeXBlQ2xhc3MsICJpbml0aWFsaXplIiwgdHlwZV9pbml0aWFsaXplLCAxKTsKKyAgICByYl9kZWZpbmVfbWV0aG9kKHJiZmZpX1R5cGVDbGFzcywgInNpemUiLCB0eXBlX3NpemUsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfVHlwZUNsYXNzLCAiYWxpZ25tZW50IiwgdHlwZV9hbGlnbm1lbnQsIDApOworICAgIHJiX2RlZmluZV9tZXRob2QocmJmZmlfVHlwZUNsYXNzLCAiaW5zcGVjdCIsIHR5cGVfaW5zcGVjdCwgMCk7CisKKyAgICAvKiBNYWtlIFR5cGU6OkJ1aWx0aW4gbm9uLWFsbG9jYXRhYmxlICovCisgICAgcmJfdW5kZWZfbWV0aG9kKENMQVNTX09GKGNsYXNzQnVpbHRpblR5cGUpLCAibmV3Iik7CisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc0J1aWx0aW5UeXBlLCAiaW5zcGVjdCIsIGJ1aWx0aW5fdHlwZV9pbnNwZWN0LCAwKTsKKyAgICAKKyAgICByYl9nbG9iYWxfdmFyaWFibGUoJnJiZmZpX1R5cGVDbGFzcyk7CisgICAgcmJfZ2xvYmFsX3ZhcmlhYmxlKCZjbGFzc0J1aWx0aW5UeXBlKTsKKworICAgIC8qIERlZmluZSBhbGwgdGhlIGJ1aWx0aW4gdHlwZXMgKi8KKyAgICAjZGVmaW5lIFQoeCwgZmZpVHlwZSkgZG8geyBcCisgICAgICAgIFZBTFVFIHQgPSBRbmlsOyBcCisgICAgICAgIHJiX2RlZmluZV9jb25zdChyYmZmaV9UeXBlQ2xhc3MsICN4LCB0ID0gYnVpbHRpbl90eXBlX25ldyhjbGFzc0J1aWx0aW5UeXBlLCBOQVRJVkVfIyN4LCBmZmlUeXBlLCAjeCkpOyBcCisgICAgICAgIHJiX2RlZmluZV9jb25zdChtb2R1bGVOYXRpdmVUeXBlLCAjeCwgdCk7IFwKKyAgICAgICAgcmJfZGVmaW5lX2NvbnN0KG1vZHVsZUZGSSwgIlRZUEVfIiAjeCwgdCk7IFwKKyAgICB9IHdoaWxlKDApCisKKyAgICAjZGVmaW5lIEEob2xkX3R5cGUsIG5ld190eXBlKSBkbyB7IFwKKyAgICAgICAgVkFMVUUgdCA9IHJiX2NvbnN0X2dldChyYmZmaV9UeXBlQ2xhc3MsIHJiX2ludGVybigjb2xkX3R5cGUpKTsgXAorICAgICAgICByYl9jb25zdF9zZXQocmJmZmlfVHlwZUNsYXNzLCByYl9pbnRlcm4oI25ld190eXBlKSwgdCk7IFwKKyAgICB9IHdoaWxlKDApCisKKyAgICAvKgorICAgICAqIERvY3VtZW50LWNvbnN0YW50OiBGRkk6OlR5cGU6OkJ1aWx0aW46OlZPSUQKKyAgICAgKi8KKyAgICBUKFZPSUQsICZmZmlfdHlwZV92b2lkKTsKKyAgICBUKElOVDgsICZmZmlfdHlwZV9zaW50OCk7CisgICAgQShJTlQ4LCBTQ0hBUik7CisgICAgQShJTlQ4LCBDSEFSKTsKKyAgICBUKFVJTlQ4LCAmZmZpX3R5cGVfdWludDgpOworICAgIEEoVUlOVDgsIFVDSEFSKTsKKworICAgIFQoSU5UMTYsICZmZmlfdHlwZV9zaW50MTYpOworICAgIEEoSU5UMTYsIFNIT1JUKTsKKyAgICBBKElOVDE2LCBTU0hPUlQpOworICAgIFQoVUlOVDE2LCAmZmZpX3R5cGVfdWludDE2KTsKKyAgICBBKFVJTlQxNiwgVVNIT1JUKTsKKyAgICBUKElOVDMyLCAmZmZpX3R5cGVfc2ludDMyKTsKKyAgICBBKElOVDMyLCBJTlQpOworICAgIEEoSU5UMzIsIFNJTlQpOworICAgIFQoVUlOVDMyLCAmZmZpX3R5cGVfdWludDMyKTsKKyAgICBBKFVJTlQzMiwgVUlOVCk7CisgICAgVChJTlQ2NCwgJmZmaV90eXBlX3NpbnQ2NCk7CisgICAgQShJTlQ2NCwgTE9OR19MT05HKTsKKyAgICBBKElOVDY0LCBTTE9OR19MT05HKTsKKyAgICBUKFVJTlQ2NCwgJmZmaV90eXBlX3VpbnQ2NCk7CisgICAgQShVSU5UNjQsIFVMT05HX0xPTkcpOworICAgIFQoTE9ORywgJmZmaV90eXBlX3Nsb25nKTsKKyAgICBBKExPTkcsIFNMT05HKTsKKyAgICBUKFVMT05HLCAmZmZpX3R5cGVfdWxvbmcpOworICAgIFQoRkxPQVQzMiwgJmZmaV90eXBlX2Zsb2F0KTsKKyAgICBBKEZMT0FUMzIsIEZMT0FUKTsKKyAgICBUKEZMT0FUNjQsICZmZmlfdHlwZV9kb3VibGUpOworICAgIEEoRkxPQVQ2NCwgRE9VQkxFKTsKKyAgICBUKExPTkdET1VCTEUsICZmZmlfdHlwZV9sb25nZG91YmxlKTsKKyAgICBUKFBPSU5URVIsICZmZmlfdHlwZV9wb2ludGVyKTsKKyAgICBUKFNUUklORywgJmZmaV90eXBlX3BvaW50ZXIpOworICAgIFQoQlVGRkVSX0lOLCAmZmZpX3R5cGVfcG9pbnRlcik7CisgICAgVChCVUZGRVJfT1VULCAmZmZpX3R5cGVfcG9pbnRlcik7CisgICAgVChCVUZGRVJfSU5PVVQsICZmZmlfdHlwZV9wb2ludGVyKTsKKyAgICBUKEJPT0wsICZmZmlfdHlwZV91Y2hhcik7CisgICAgVChWQVJBUkdTLCAmZmZpX3R5cGVfdm9pZCk7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1R5cGUuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTUyMmVlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvVHlwZS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIFdheW5lIE1laXNzbmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTHVjIEhlaW5yaWNoIDxsdWNAaG9uay1ob25rLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFdmFuIFBob2VuaXggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgUkJGRklfVFlQRV9ICisjZGVmaW5lCVJCRkZJX1RZUEVfSAorCisjaW5jbHVkZSA8cnVieS5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFR5cGVfIFR5cGU7CisKKyNpbmNsdWRlICJUeXBlcy5oIgorICAgIAorc3RydWN0IFR5cGVfIHsKKyAgICBOYXRpdmVUeXBlIG5hdGl2ZVR5cGU7CisgICAgZmZpX3R5cGUqIGZmaVR5cGU7Cit9OworCitleHRlcm4gVkFMVUUgcmJmZmlfVHlwZUNsYXNzOworZXh0ZXJuIFZBTFVFIHJiZmZpX1R5cGVfTG9va3VwKFZBTFVFIHR5cGUpOworZXh0ZXJuIFZBTFVFIHJiZmZpX1R5cGVfRmluZChWQUxVRSB0eXBlKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCS8qIFJCRkZJX1RZUEVfSCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UeXBlLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UeXBlLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiNTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1R5cGUubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UeXBlcy5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvVHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2NmODk0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvVHlwZXMuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgTHVjIEhlaW5yaWNoCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEFtYW4gR3VwdGEuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxydWJ5Lmg+CisjaW5jbHVkZSAiUG9pbnRlci5oIgorI2luY2x1ZGUgInJiZmZpLmgiCisjaW5jbHVkZSAiRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJTdHJ1Y3RCeVZhbHVlLmgiCisjaW5jbHVkZSAiVHlwZXMuaCIKKyNpbmNsdWRlICJTdHJ1Y3QuaCIKKyNpbmNsdWRlICJNYXBwZWRUeXBlLmgiCisjaW5jbHVkZSAiTWVtb3J5UG9pbnRlci5oIgorI2luY2x1ZGUgIkxvbmdEb3VibGUuaCIKKworc3RhdGljIElEIGlkX2Zyb21fbmF0aXZlID0gMDsKKworCitWQUxVRQorcmJmZmlfTmF0aXZlVmFsdWVfVG9SdWJ5KFR5cGUqIHR5cGUsIFZBTFVFIHJiVHlwZSwgY29uc3Qgdm9pZCogcHRyKQoreworICAgIHN3aXRjaCAodHlwZS0+bmF0aXZlVHlwZSkgeworICAgICAgICBjYXNlIE5BVElWRV9WT0lEOgorICAgICAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgICAgIGNhc2UgTkFUSVZFX0lOVDg6CisgICAgICAgICAgcmV0dXJuIElOVDJOVU0oKHNpZ25lZCBjaGFyKSAqKGZmaV9zYXJnICopIHB0cik7CisgICAgICAgIGNhc2UgTkFUSVZFX0lOVDE2OgorICAgICAgICAgIHJldHVybiBJTlQyTlVNKChzaWduZWQgc2hvcnQpICooZmZpX3NhcmcgKikgcHRyKTsKKyAgICAgICAgY2FzZSBOQVRJVkVfSU5UMzI6CisgICAgICAgICAgcmV0dXJuIElOVDJOVU0oKHNpZ25lZCBpbnQpICooZmZpX3NhcmcgKikgcHRyKTsKKyAgICAgICAgY2FzZSBOQVRJVkVfTE9ORzoKKyAgICAgICAgICAgIHJldHVybiBMT05HMk5VTSgoc2lnbmVkIGxvbmcpICooZmZpX3NhcmcgKikgcHRyKTsKKyAgICAgICAgY2FzZSBOQVRJVkVfSU5UNjQ6CisgICAgICAgICAgICByZXR1cm4gTEwyTlVNKCooc2lnbmVkIGxvbmcgbG9uZyAqKSBwdHIpOworCisgICAgICAgIGNhc2UgTkFUSVZFX1VJTlQ4OgorICAgICAgICAgIHJldHVybiBVSU5UMk5VTSgodW5zaWduZWQgY2hhcikgKihmZmlfYXJnICopIHB0cik7CisgICAgICAgIGNhc2UgTkFUSVZFX1VJTlQxNjoKKyAgICAgICAgICByZXR1cm4gVUlOVDJOVU0oKHVuc2lnbmVkIHNob3J0KSAqKGZmaV9hcmcgKikgcHRyKTsKKyAgICAgICAgY2FzZSBOQVRJVkVfVUlOVDMyOgorICAgICAgICAgIHJldHVybiBVSU5UMk5VTSgodW5zaWduZWQgaW50KSAqKGZmaV9hcmcgKikgcHRyKTsKKyAgICAgICAgY2FzZSBOQVRJVkVfVUxPTkc6CisgICAgICAgICAgICByZXR1cm4gVUxPTkcyTlVNKCh1bnNpZ25lZCBsb25nKSAqKGZmaV9hcmcgKikgcHRyKTsKKyAgICAgICAgY2FzZSBOQVRJVkVfVUlOVDY0OgorICAgICAgICAgICAgcmV0dXJuIFVMTDJOVU0oKih1bnNpZ25lZCBsb25nIGxvbmcgKikgcHRyKTsKKworICAgICAgICBjYXNlIE5BVElWRV9GTE9BVDMyOgorICAgICAgICAgICAgcmV0dXJuIHJiX2Zsb2F0X25ldygqKGZsb2F0ICopIHB0cik7CisgICAgICAgIGNhc2UgTkFUSVZFX0ZMT0FUNjQ6CisgICAgICAgICAgICByZXR1cm4gcmJfZmxvYXRfbmV3KCooZG91YmxlICopIHB0cik7CisKKyAgICAgICAgY2FzZSBOQVRJVkVfTE9OR0RPVUJMRToKKwkgIHJldHVybiByYmZmaV9sb25nZG91YmxlX25ldygqKGxvbmcgZG91YmxlICopIHB0cik7CisKKyAgICAgICAgY2FzZSBOQVRJVkVfU1RSSU5HOgorICAgICAgICAgICAgcmV0dXJuICgqKHZvaWQgKiopIHB0ciAhPSBOVUxMKSA/IHJiX3RhaW50ZWRfc3RyX25ldzIoKihjaGFyICoqKSBwdHIpIDogUW5pbDsKKyAgICAgICAgY2FzZSBOQVRJVkVfUE9JTlRFUjoKKyAgICAgICAgICAgIHJldHVybiByYmZmaV9Qb2ludGVyX05ld0luc3RhbmNlKCoodm9pZCAqKikgcHRyKTsKKyAgICAgICAgY2FzZSBOQVRJVkVfQk9PTDoKKyAgICAgICAgICAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIpICooZmZpX2FyZyAqKSBwdHIpID8gUXRydWUgOiBRZmFsc2U7CisgICAgICAgIAorICAgICAgICBjYXNlIE5BVElWRV9GVU5DVElPTjoKKyAgICAgICAgY2FzZSBOQVRJVkVfQ0FMTEJBQ0s6IHsKKyAgICAgICAgICAgIHJldHVybiAqKHZvaWQgKiopIHB0ciAhPSBOVUxMIAorICAgICAgICAgICAgICAgICAgICA/IHJiZmZpX0Z1bmN0aW9uX05ld0luc3RhbmNlKHJiVHlwZSwgcmJmZmlfUG9pbnRlcl9OZXdJbnN0YW5jZSgqKHZvaWQgKiopIHB0cikpCisgICAgICAgICAgICAgICAgICAgIDogUW5pbDsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTkFUSVZFX1NUUlVDVDogeworICAgICAgICAgICAgU3RydWN0QnlWYWx1ZSogc2J2ID0gKFN0cnVjdEJ5VmFsdWUgKil0eXBlOworICAgICAgICAgICAgQWJzdHJhY3RNZW1vcnkqIG1lbTsKKyAgICAgICAgICAgIFZBTFVFIHJiTWVtb3J5ID0gcmJmZmlfTWVtb3J5UG9pbnRlcl9OZXdJbnN0YW5jZSgxLCBzYnYtPmJhc2UuZmZpVHlwZS0+c2l6ZSwgZmFsc2UpOworCisgICAgICAgICAgICBEYXRhX0dldF9TdHJ1Y3QocmJNZW1vcnksIEFic3RyYWN0TWVtb3J5LCBtZW0pOworICAgICAgICAgICAgbWVtY3B5KG1lbS0+YWRkcmVzcywgcHRyLCBzYnYtPmJhc2UuZmZpVHlwZS0+c2l6ZSk7CisgICAgICAgICAgICBSQl9HQ19HVUFSRChyYk1lbW9yeSk7CisgICAgICAgICAgICBSQl9HQ19HVUFSRChyYlR5cGUpOworCisgICAgICAgICAgICByZXR1cm4gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDEsICZyYk1lbW9yeSwgc2J2LT5yYlN0cnVjdENsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTkFUSVZFX01BUFBFRDogeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZvciBtYXBwZWQgdHlwZXMsIGZpcnN0IGNvbnZlcnQgdG8gdGhlIHJlYWwgbmF0aXZlIHR5cGUsIHRoZW4gdXBjYWxsIHRvCisgICAgICAgICAgICAgKiBydWJ5IHRvIGNvbnZlcnQgdG8gdGhlIGV4cGVjdGVkIHJldHVybiB0eXBlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIE1hcHBlZFR5cGUqIG0gPSAoTWFwcGVkVHlwZSAqKSB0eXBlOworICAgICAgICAgICAgVkFMVUUgdmFsdWVzWzJdLCByYlJldHVyblZhbHVlOworCisgICAgICAgICAgICB2YWx1ZXNbMF0gPSByYmZmaV9OYXRpdmVWYWx1ZV9Ub1J1YnkobS0+dHlwZSwgbS0+cmJUeXBlLCBwdHIpOworICAgICAgICAgICAgdmFsdWVzWzFdID0gUW5pbDsKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICByYlJldHVyblZhbHVlID0gcmJfZnVuY2FsbDIobS0+cmJDb252ZXJ0ZXIsIGlkX2Zyb21fbmF0aXZlLCAyLCB2YWx1ZXMpOworICAgICAgICAgICAgUkJfR0NfR1VBUkQodmFsdWVzWzBdKTsKKyAgICAgICAgICAgIFJCX0dDX0dVQVJEKHJiVHlwZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByYlJldHVyblZhbHVlOworICAgICAgICB9CisgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAiVW5rbm93biB0eXBlOiAlZCIsIHR5cGUtPm5hdGl2ZVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIFFuaWw7CisgICAgfQorfQorCit2b2lkCityYmZmaV9UeXBlc19Jbml0KFZBTFVFIG1vZHVsZUZGSSkKK3sKKyAgICBpZF9mcm9tX25hdGl2ZSA9IHJiX2ludGVybigiZnJvbV9uYXRpdmUiKTsKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvVHlwZXMuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0ODA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1R5cGVzLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgTHVjIEhlaW5yaWNoIDxsdWNAaG9uay1ob25rLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMywgUnVieSBGRkkgcHJvamVjdCBjb250cmlidXRvcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSQkZGSV9UWVBFU19ICisjZGVmaW5lCVJCRkZJX1RZUEVTX0gKKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworICAgIE5BVElWRV9WT0lELAorICAgIE5BVElWRV9JTlQ4LAorICAgIE5BVElWRV9VSU5UOCwKKyAgICBOQVRJVkVfSU5UMTYsCisgICAgTkFUSVZFX1VJTlQxNiwKKyAgICBOQVRJVkVfSU5UMzIsCisgICAgTkFUSVZFX1VJTlQzMiwKKyAgICBOQVRJVkVfSU5UNjQsCisgICAgTkFUSVZFX1VJTlQ2NCwKKyAgICBOQVRJVkVfTE9ORywKKyAgICBOQVRJVkVfVUxPTkcsCisgICAgTkFUSVZFX0ZMT0FUMzIsCisgICAgTkFUSVZFX0ZMT0FUNjQsCisgICAgTkFUSVZFX0xPTkdET1VCTEUsCisgICAgTkFUSVZFX1BPSU5URVIsCisgICAgTkFUSVZFX0NBTExCQUNLLAorICAgIE5BVElWRV9GVU5DVElPTiwKKyAgICBOQVRJVkVfQlVGRkVSX0lOLAorICAgIE5BVElWRV9CVUZGRVJfT1VULAorICAgIE5BVElWRV9CVUZGRVJfSU5PVVQsCisgICAgTkFUSVZFX0NIQVJfQVJSQVksCisgICAgTkFUSVZFX0JPT0wsCisgICAgCisgICAgLyoqIEFuIGltbXV0YWJsZSBzdHJpbmcuICBOdWwgdGVybWluYXRlZCwgYnV0IG9ubHkgY29waWVzIGluIHRvIHRoZSBuYXRpdmUgZnVuY3Rpb24gKi8KKyAgICBOQVRJVkVfU1RSSU5HLAorICAgIAorICAgIC8qKiBUaGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzICovCisgICAgTkFUSVZFX1ZBUkFSR1MsCisgICAgCisgICAgLyoqIFN0cnVjdC1ieS12YWx1ZSBwYXJhbSBvciByZXN1bHQgKi8KKyAgICBOQVRJVkVfU1RSVUNULAorCisgICAgLyoqIEFuIGFycmF5IHR5cGUgZGVmaW5pdGlvbiAqLworICAgIE5BVElWRV9BUlJBWSwKKworICAgIC8qKiBDdXN0b20gbmF0aXZlIHR5cGUgKi8KKyAgICBOQVRJVkVfTUFQUEVELAorfSBOYXRpdmVUeXBlOworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSAiVHlwZS5oIgorCitWQUxVRSByYmZmaV9OYXRpdmVWYWx1ZV9Ub1J1YnkoVHlwZSogdHlwZSwgVkFMVUUgcmJUeXBlLCBjb25zdCB2b2lkKiBwdHIpOwordm9pZCByYmZmaV9UeXBlc19Jbml0KFZBTFVFIG1vZHVsZUZGSSk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBSQkZGSV9UWVBFU19IICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1R5cGVzLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UeXBlcy5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNDM1N2YKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9UeXBlcy5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1ZhcmlhZGljLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9WYXJpYWRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3N2ZmYWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9WYXJpYWRpYy5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAgV2F5bmUgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBbmRyZWEgRmF6emkgPGFuZHJlYS5mYXp6aUBhbGNhY29vcC5pdD4KKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGludC5oPgorIyBpbmNsdWRlIDxzdGRib29sLmg+CisjZWxzZQorIyBpbmNsdWRlICJ3aW4zMi9zdGRib29sLmgiCisjIGluY2x1ZGUgIndpbjMyL3N0ZGludC5oIgorI2VuZGlmCisjaW5jbHVkZSA8cnVieS5oPgorCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSAicmJmZmkuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworI2luY2x1ZGUgIkFic3RyYWN0TWVtb3J5LmgiCisjaW5jbHVkZSAiUG9pbnRlci5oIgorI2luY2x1ZGUgIlR5cGVzLmgiCisjaW5jbHVkZSAiVHlwZS5oIgorI2luY2x1ZGUgIkxhc3RFcnJvci5oIgorI2luY2x1ZGUgIk1ldGhvZEhhbmRsZS5oIgorI2luY2x1ZGUgIkNhbGwuaCIKKyNpbmNsdWRlICJUaHJlYWQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVmFyaWFkaWNJbnZva2VyXyB7CisgICAgVkFMVUUgcmJBZGRyZXNzOworICAgIFZBTFVFIHJiUmV0dXJuVHlwZTsKKyAgICBWQUxVRSByYkVudW1zOworCisgICAgVHlwZSogcmV0dXJuVHlwZTsKKyAgICBmZmlfYWJpIGFiaTsKKyAgICB2b2lkKiBmdW5jdGlvbjsKKyAgICBpbnQgcGFyYW1Db3VudDsKKyAgICBib29sIGJsb2NraW5nOworfSBWYXJpYWRpY0ludm9rZXI7CisKKworc3RhdGljIFZBTFVFIHZhcmlhZGljX2FsbG9jYXRlKFZBTFVFIGtsYXNzKTsKK3N0YXRpYyBWQUxVRSB2YXJpYWRpY19pbml0aWFsaXplKFZBTFVFIHNlbGYsIFZBTFVFIHJiRnVuY3Rpb24sIFZBTFVFIHJiUGFyYW1ldGVyVHlwZXMsCisgICAgICAgIFZBTFVFIHJiUmV0dXJuVHlwZSwgVkFMVUUgb3B0aW9ucyk7CitzdGF0aWMgdm9pZCB2YXJpYWRpY19tYXJrKFZhcmlhZGljSW52b2tlciAqKTsKKworc3RhdGljIFZBTFVFIGNsYXNzVmFyaWFkaWNJbnZva2VyID0gUW5pbDsKKworCitzdGF0aWMgVkFMVUUKK3ZhcmlhZGljX2FsbG9jYXRlKFZBTFVFIGtsYXNzKQoreworICAgIFZhcmlhZGljSW52b2tlciAqaW52b2tlcjsKKyAgICBWQUxVRSBvYmogPSBEYXRhX01ha2VfU3RydWN0KGtsYXNzLCBWYXJpYWRpY0ludm9rZXIsIHZhcmlhZGljX21hcmssIC0xLCBpbnZva2VyKTsKKworICAgIGludm9rZXItPnJiQWRkcmVzcyA9IFFuaWw7CisgICAgaW52b2tlci0+cmJFbnVtcyA9IFFuaWw7CisgICAgaW52b2tlci0+cmJSZXR1cm5UeXBlID0gUW5pbDsKKyAgICBpbnZva2VyLT5ibG9ja2luZyA9IGZhbHNlOworCisgICAgcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQKK3ZhcmlhZGljX21hcmsoVmFyaWFkaWNJbnZva2VyICppbnZva2VyKQoreworICAgIHJiX2djX21hcmsoaW52b2tlci0+cmJFbnVtcyk7CisgICAgcmJfZ2NfbWFyayhpbnZva2VyLT5yYkFkZHJlc3MpOworICAgIHJiX2djX21hcmsoaW52b2tlci0+cmJSZXR1cm5UeXBlKTsKK30KKworc3RhdGljIFZBTFVFCit2YXJpYWRpY19pbml0aWFsaXplKFZBTFVFIHNlbGYsIFZBTFVFIHJiRnVuY3Rpb24sIFZBTFVFIHJiUGFyYW1ldGVyVHlwZXMsIFZBTFVFIHJiUmV0dXJuVHlwZSwgVkFMVUUgb3B0aW9ucykKK3sKKyAgICBWYXJpYWRpY0ludm9rZXIqIGludm9rZXIgPSBOVUxMOworICAgIFZBTFVFIHJldHZhbCA9IFFuaWw7CisgICAgVkFMVUUgY29udmVudGlvbiA9IFFuaWw7CisgICAgVkFMVUUgZml4ZWQgPSBRbmlsOworI2lmIGRlZmluZWQoWDg2X1dJTjMyKQorICAgIFZBTFVFIHJiQ29udmVudGlvblN0cjsKKyNlbmRpZgorICAgIGludCBpOworCisgICAgQ2hlY2tfVHlwZShvcHRpb25zLCBUX0hBU0gpOworICAgIGNvbnZlbnRpb24gPSByYl9oYXNoX2FyZWYob3B0aW9ucywgSUQyU1lNKHJiX2ludGVybigiY29udmVudGlvbiIpKSk7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgVmFyaWFkaWNJbnZva2VyLCBpbnZva2VyKTsKKyAgICBpbnZva2VyLT5yYkVudW1zID0gcmJfaGFzaF9hcmVmKG9wdGlvbnMsIElEMlNZTShyYl9pbnRlcm4oImVudW1zIikpKTsKKyAgICBpbnZva2VyLT5yYkFkZHJlc3MgPSByYkZ1bmN0aW9uOworICAgIGludm9rZXItPmZ1bmN0aW9uID0gcmJmZmlfQWJzdHJhY3RNZW1vcnlfQ2FzdChyYkZ1bmN0aW9uLCByYmZmaV9Qb2ludGVyQ2xhc3MpLT5hZGRyZXNzOworICAgIGludm9rZXItPmJsb2NraW5nID0gUlRFU1QocmJfaGFzaF9hcmVmKG9wdGlvbnMsIElEMlNZTShyYl9pbnRlcm4oImJsb2NraW5nIikpKSk7CisKKyNpZiBkZWZpbmVkKFg4Nl9XSU4zMikKKyAgICByYkNvbnZlbnRpb25TdHIgPSByYl9mdW5jYWxsMihjb252ZW50aW9uLCByYl9pbnRlcm4oInRvX3MiKSwgMCwgTlVMTCk7CisgICAgaW52b2tlci0+YWJpID0gKFJURVNUKGNvbnZlbnRpb24pICYmIHN0cmNtcChTdHJpbmdWYWx1ZUNTdHIocmJDb252ZW50aW9uU3RyKSwgInN0ZGNhbGwiKSA9PSAwKQorICAgICAgICAgICAgPyBGRklfU1REQ0FMTCA6IEZGSV9ERUZBVUxUX0FCSTsKKyNlbHNlCisgICAgaW52b2tlci0+YWJpID0gRkZJX0RFRkFVTFRfQUJJOworI2VuZGlmCisKKyAgICBpbnZva2VyLT5yYlJldHVyblR5cGUgPSByYmZmaV9UeXBlX0xvb2t1cChyYlJldHVyblR5cGUpOworICAgIGlmICghUlRFU1QoaW52b2tlci0+cmJSZXR1cm5UeXBlKSkgeworICAgICAgICBWQUxVRSB0eXBlTmFtZSA9IHJiX2Z1bmNhbGwyKHJiUmV0dXJuVHlwZSwgcmJfaW50ZXJuKCJpbnNwZWN0IiksIDAsIE5VTEwpOworICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAiSW52YWxpZCByZXR1cm4gdHlwZSAoJXMpIiwgUlNUUklOR19QVFIodHlwZU5hbWUpKTsKKyAgICB9CisKKyAgICBEYXRhX0dldF9TdHJ1Y3QocmJSZXR1cm5UeXBlLCBUeXBlLCBpbnZva2VyLT5yZXR1cm5UeXBlKTsKKworICAgIGludm9rZXItPnBhcmFtQ291bnQgPSAtMTsKKworICAgIGZpeGVkID0gcmJfYXJ5X25ldzIoUkFSUkFZX0xFTihyYlBhcmFtZXRlclR5cGVzKSAtIDEpOworICAgIGZvciAoaSA9IDA7IGkgPCBSQVJSQVlfTEVOKHJiUGFyYW1ldGVyVHlwZXMpOyArK2kpIHsKKyAgICAgICAgVkFMVUUgZW50cnkgPSByYl9hcnlfZW50cnkocmJQYXJhbWV0ZXJUeXBlcywgaSk7CisgICAgICAgIFZBTFVFIHJiVHlwZSA9IHJiZmZpX1R5cGVfTG9va3VwKGVudHJ5KTsKKyAgICAgICAgVHlwZSogdHlwZTsKKworICAgICAgICBpZiAoIVJURVNUKHJiVHlwZSkpIHsKKyAgICAgICAgICAgIFZBTFVFIHR5cGVOYW1lID0gcmJfZnVuY2FsbDIoZW50cnksIHJiX2ludGVybigiaW5zcGVjdCIpLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJJbnZhbGlkIHBhcmFtZXRlciB0eXBlICglcykiLCBSU1RSSU5HX1BUUih0eXBlTmFtZSkpOworICAgICAgICB9CisgICAgICAgIERhdGFfR2V0X1N0cnVjdChyYlR5cGUsIFR5cGUsIHR5cGUpOworICAgICAgICBpZiAodHlwZS0+bmF0aXZlVHlwZSAhPSBOQVRJVkVfVkFSQVJHUykgeworICAgICAgICAgICAgcmJfYXJ5X3B1c2goZml4ZWQsIGVudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICAqIEBmaXhlZCBhbmQgQHR5cGVfbWFwIGFyZSB1c2VkIGJ5IHRoZSBwYXJhbWV0ZXIgbWFuZ2xpbmcgcnVieSBjb2RlCisgICAgICovCisgICAgcmJfaXZfc2V0KHNlbGYsICJAZml4ZWQiLCBmaXhlZCk7CisgICAgcmJfaXZfc2V0KHNlbGYsICJAdHlwZV9tYXAiLCByYl9oYXNoX2FyZWYob3B0aW9ucywgSUQyU1lNKHJiX2ludGVybigidHlwZV9tYXAiKSkpKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBWQUxVRQordmFyaWFkaWNfaW52b2tlKFZBTFVFIHNlbGYsIFZBTFVFIHBhcmFtZXRlclR5cGVzLCBWQUxVRSBwYXJhbWV0ZXJWYWx1ZXMpCit7CisgICAgVmFyaWFkaWNJbnZva2VyKiBpbnZva2VyOworICAgIEZGSVN0b3JhZ2UqIHBhcmFtczsKKyAgICB2b2lkKiByZXR2YWw7CisgICAgZmZpX2NpZiBjaWY7CisgICAgdm9pZCoqIGZmaVZhbHVlczsKKyAgICBmZmlfdHlwZSoqIGZmaVBhcmFtVHlwZXM7CisgICAgZmZpX3R5cGUqIGZmaVJldHVyblR5cGU7CisgICAgVHlwZSoqIHBhcmFtVHlwZXM7CisgICAgVkFMVUUqIGFyZ3Y7CisgICAgaW50IHBhcmFtQ291bnQgPSAwLCBmaXhlZENvdW50ID0gMCwgaTsKKyAgICBmZmlfc3RhdHVzIGZmaVN0YXR1czsKKyAgICByYmZmaV9mcmFtZV90IGZyYW1lID0geyAwIH07CisKKyAgICBDaGVja19UeXBlKHBhcmFtZXRlclR5cGVzLCBUX0FSUkFZKTsKKyAgICBDaGVja19UeXBlKHBhcmFtZXRlclZhbHVlcywgVF9BUlJBWSk7CisKKyAgICBEYXRhX0dldF9TdHJ1Y3Qoc2VsZiwgVmFyaWFkaWNJbnZva2VyLCBpbnZva2VyKTsKKyAgICBwYXJhbUNvdW50ID0gKGludCkgUkFSUkFZX0xFTihwYXJhbWV0ZXJUeXBlcyk7CisgICAgcGFyYW1UeXBlcyA9IEFMTE9DQV9OKFR5cGUgKiwgcGFyYW1Db3VudCk7CisgICAgZmZpUGFyYW1UeXBlcyA9IEFMTE9DQV9OKGZmaV90eXBlICosIHBhcmFtQ291bnQpOworICAgIHBhcmFtcyA9IEFMTE9DQV9OKEZGSVN0b3JhZ2UsIHBhcmFtQ291bnQpOworICAgIGZmaVZhbHVlcyA9IEFMTE9DQV9OKHZvaWQqLCBwYXJhbUNvdW50KTsKKyAgICBhcmd2ID0gQUxMT0NBX04oVkFMVUUsIHBhcmFtQ291bnQpOworICAgIHJldHZhbCA9IGFsbG9jYShNQVgoaW52b2tlci0+cmV0dXJuVHlwZS0+ZmZpVHlwZS0+c2l6ZSwgRkZJX1NJWkVPRl9BUkcpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbUNvdW50OyArK2kpIHsKKyAgICAgICAgVkFMVUUgcmJUeXBlID0gcmJfYXJ5X2VudHJ5KHBhcmFtZXRlclR5cGVzLCBpKTsKKyAgICAgICAgCisgICAgICAgIGlmICghcmJfb2JqX2lzX2tpbmRfb2YocmJUeXBlLCByYmZmaV9UeXBlQ2xhc3MpKSB7CisgICAgICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAid3JvbmcgdHlwZS4gIEV4cGVjdGVkIChGRkk6OlR5cGUpIik7CisgICAgICAgIH0KKyAgICAgICAgRGF0YV9HZXRfU3RydWN0KHJiVHlwZSwgVHlwZSwgcGFyYW1UeXBlc1tpXSk7CisKKyAgICAgICAgc3dpdGNoIChwYXJhbVR5cGVzW2ldLT5uYXRpdmVUeXBlKSB7CisgICAgICAgICAgICBjYXNlIE5BVElWRV9JTlQ4OgorICAgICAgICAgICAgY2FzZSBOQVRJVkVfSU5UMTY6CisgICAgICAgICAgICBjYXNlIE5BVElWRV9JTlQzMjoKKyAgICAgICAgICAgICAgICByYlR5cGUgPSByYl9jb25zdF9nZXQocmJmZmlfVHlwZUNsYXNzLCByYl9pbnRlcm4oIklOVDMyIikpOworICAgICAgICAgICAgICAgIERhdGFfR2V0X1N0cnVjdChyYlR5cGUsIFR5cGUsIHBhcmFtVHlwZXNbaV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBOQVRJVkVfVUlOVDg6CisgICAgICAgICAgICBjYXNlIE5BVElWRV9VSU5UMTY6CisgICAgICAgICAgICBjYXNlIE5BVElWRV9VSU5UMzI6CisgICAgICAgICAgICAgICAgcmJUeXBlID0gcmJfY29uc3RfZ2V0KHJiZmZpX1R5cGVDbGFzcywgcmJfaW50ZXJuKCJVSU5UMzIiKSk7CisgICAgICAgICAgICAgICAgRGF0YV9HZXRfU3RydWN0KHJiVHlwZSwgVHlwZSwgcGFyYW1UeXBlc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFX0ZMT0FUMzI6CisgICAgICAgICAgICAgICAgcmJUeXBlID0gcmJfY29uc3RfZ2V0KHJiZmZpX1R5cGVDbGFzcywgcmJfaW50ZXJuKCJET1VCTEUiKSk7CisgICAgICAgICAgICAgICAgRGF0YV9HZXRfU3RydWN0KHJiVHlwZSwgVHlwZSwgcGFyYW1UeXBlc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBmZmlQYXJhbVR5cGVzW2ldID0gcGFyYW1UeXBlc1tpXS0+ZmZpVHlwZTsKKyAgICAgICAgaWYgKGZmaVBhcmFtVHlwZXNbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiSW52YWxpZCBwYXJhbWV0ZXIgdHlwZSAjJXgiLCBwYXJhbVR5cGVzW2ldLT5uYXRpdmVUeXBlKTsKKyAgICAgICAgfQorICAgICAgICBhcmd2W2ldID0gcmJfYXJ5X2VudHJ5KHBhcmFtZXRlclZhbHVlcywgaSk7CisgICAgfQorCisgICAgZmZpUmV0dXJuVHlwZSA9IGludm9rZXItPnJldHVyblR5cGUtPmZmaVR5cGU7CisgICAgaWYgKGZmaVJldHVyblR5cGUgPT0gTlVMTCkgeworICAgICAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJJbnZhbGlkIHJldHVybiB0eXBlIik7CisgICAgfQorCisgICAgLypHZXQgdGhlIG51bWJlciBvZiBmaXhlZCBhcmdzIGZyb20gQGZpeGVkIGFycmF5Ki8KKyAgICBmaXhlZENvdW50ID0gUkFSUkFZX0xFTihyYl9pdl9nZXQoc2VsZiwgIkBmaXhlZCIpKTsKKworI2lmZGVmIEhBVkVfRkZJX1BSRVBfQ0lGX1ZBUgorICAgIGZmaVN0YXR1cyA9IGZmaV9wcmVwX2NpZl92YXIoJmNpZiwgaW52b2tlci0+YWJpLCBmaXhlZENvdW50LCBwYXJhbUNvdW50LCBmZmlSZXR1cm5UeXBlLCBmZmlQYXJhbVR5cGVzKTsKKyNlbHNlCisgICAgZmZpU3RhdHVzID0gZmZpX3ByZXBfY2lmKCZjaWYsIGludm9rZXItPmFiaSwgcGFyYW1Db3VudCwgZmZpUmV0dXJuVHlwZSwgZmZpUGFyYW1UeXBlcyk7CisjZW5kaWYKKyAgICBzd2l0Y2ggKGZmaVN0YXR1cykgeworICAgICAgICBjYXNlIEZGSV9CQURfQUJJOgorICAgICAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiSW52YWxpZCBBQkkgc3BlY2lmaWVkIik7CisgICAgICAgIGNhc2UgRkZJX0JBRF9UWVBFREVGOgorICAgICAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiSW52YWxpZCBhcmd1bWVudCB0eXBlIHNwZWNpZmllZCIpOworICAgICAgICBjYXNlIEZGSV9PSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiVW5rbm93biBGRkkgZXJyb3IiKTsKKyAgICB9CisKKyAgICByYmZmaV9TZXR1cENhbGxQYXJhbXMocGFyYW1Db3VudCwgYXJndiwgLTEsIHBhcmFtVHlwZXMsIHBhcmFtcywKKyAgICAgICAgZmZpVmFsdWVzLCBOVUxMLCAwLCBpbnZva2VyLT5yYkVudW1zKTsKKyAgICAKKyAgICByYmZmaV9mcmFtZV9wdXNoKCZmcmFtZSk7CisjaWZkZWYgSEFWRV9SQl9USFJFQURfQ0FMTF9XSVRIT1VUX0dWTAorICAgIC8qIEluIENhbGwuYywgYmxvY2tpbmc6IHRydWUgaXMgc3VwcG9ydGVkIG9uIG9sZGVyIHJ1YnkgdmFyaWFudHMKKyAgICAgKiB3aXRob3V0IHJiX3RocmVhZF9jYWxsX3dpdGhvdXRfZ3ZsIGJ5IGFsbG9jYXRpbmcgb24gdGhlIGhlYXAgaW5zdGVhZAorICAgICAqIG9mIHRoZSBzdGFjay4gU2luY2UgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGJlaW5nIGFkZGVkIGxhdGVyLAorICAgICAqIHdl4oCZcmUgc2tpcHBpbmcgc3VwcG9ydCBmb3Igb2xkIHJ1YmllcyBoZXJlLiAqLworICAgIGlmKHVubGlrZWx5KGludm9rZXItPmJsb2NraW5nKSkgeworICAgICAgICByYmZmaV9ibG9ja2luZ19jYWxsX3QqIGJjOworICAgICAgICBiYyA9IEFMTE9DQV9OKHJiZmZpX2Jsb2NraW5nX2NhbGxfdCwgMSk7CisgICAgICAgIGJjLT5yZXR2YWwgPSByZXR2YWw7CisgICAgICAgIGJjLT5mdW5jdGlvbiA9IGludm9rZXItPmZ1bmN0aW9uOworICAgICAgICBiYy0+ZmZpVmFsdWVzID0gZmZpVmFsdWVzOworICAgICAgICBiYy0+cGFyYW1zID0gcGFyYW1zOworICAgICAgICBiYy0+ZnJhbWUgPSAmZnJhbWU7CisgICAgICAgIGJjLT5jaWYgPSBjaWY7CisKKyAgICAgICAgcmJfcmVzY3VlMihyYmZmaV9kb19ibG9ja2luZ19jYWxsLCAoVkFMVUUpIGJjLCByYmZmaV9zYXZlX2ZyYW1lX2V4Y2VwdGlvbiwgKFZBTFVFKSAmZnJhbWUsIHJiX2VFeGNlcHRpb24sIChWQUxVRSkgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGludm9rZXItPmZ1bmN0aW9uKSwgcmV0dmFsLCBmZmlWYWx1ZXMpOworICAgIH0KKyNlbHNlCisgICAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGludm9rZXItPmZ1bmN0aW9uKSwgcmV0dmFsLCBmZmlWYWx1ZXMpOworI2VuZGlmCisgICAgcmJmZmlfZnJhbWVfcG9wKCZmcmFtZSk7CisgICAgCisgICAgcmJmZmlfc2F2ZV9lcnJubygpOworICAgIAorICAgIGlmIChSVEVTVChmcmFtZS5leGMpICYmIGZyYW1lLmV4YyAhPSBRbmlsKSB7CisgICAgICAgIHJiX2V4Y19yYWlzZShmcmFtZS5leGMpOworICAgIH0KKworICAgIHJldHVybiByYmZmaV9OYXRpdmVWYWx1ZV9Ub1J1YnkoaW52b2tlci0+cmV0dXJuVHlwZSwgaW52b2tlci0+cmJSZXR1cm5UeXBlLCByZXR2YWwpOworfQorCisKK3ZvaWQKK3JiZmZpX1ZhcmlhZGljX0luaXQoVkFMVUUgbW9kdWxlRkZJKQoreworICAgIGNsYXNzVmFyaWFkaWNJbnZva2VyID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKG1vZHVsZUZGSSwgIlZhcmlhZGljSW52b2tlciIsIHJiX2NPYmplY3QpOworICAgIHJiX2dsb2JhbF92YXJpYWJsZSgmY2xhc3NWYXJpYWRpY0ludm9rZXIpOworCisgICAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMoY2xhc3NWYXJpYWRpY0ludm9rZXIsIHZhcmlhZGljX2FsbG9jYXRlKTsKKworICAgIHJiX2RlZmluZV9tZXRob2QoY2xhc3NWYXJpYWRpY0ludm9rZXIsICJpbml0aWFsaXplIiwgdmFyaWFkaWNfaW5pdGlhbGl6ZSwgNCk7CisgICAgcmJfZGVmaW5lX21ldGhvZChjbGFzc1ZhcmlhZGljSW52b2tlciwgImludm9rZSIsIHZhcmlhZGljX2ludm9rZSwgMik7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL1ZhcmlhZGljLm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9WYXJpYWRpYy5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OWUwNzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9WYXJpYWRpYy5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2NvbXBhdC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkZmMwOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2NvbXBhdC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIFdheW5lIE1laXNzbmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUkJGRklfQ09NUEFUX0gKKyNkZWZpbmUgUkJGRklfQ09NUEFUX0gKKworI2luY2x1ZGUgPHJ1YnkuaD4KKworI2lmbmRlZiBSQVJSQVlfTEVOCisjICBkZWZpbmUgUkFSUkFZX0xFTihhcnkpIFJBUlJBWShhcnkpLT5sZW4KKyNlbmRpZgorCisjaWZuZGVmIFJBUlJBWV9QVFIKKyMgIGRlZmluZSBSQVJSQVlfUFRSKGFyeSkgUkFSUkFZKGFyeSktPnB0cgorI2VuZGlmCisKKyNpZm5kZWYgUlNUUklOR19MRU4KKyMgIGRlZmluZSBSU1RSSU5HX0xFTihzKSBSU1RSSU5HKHMpLT5sZW4KKyNlbmRpZgorCisjaWZuZGVmIFJTVFJJTkdfUFRSCisjICBkZWZpbmUgUlNUUklOR19QVFIocykgUlNUUklORyhzKS0+cHRyCisjZW5kaWYKKworI2lmbmRlZiBOVU0yVUxMCisjICBkZWZpbmUgTlVNMlVMTCh4KSByYl9udW0ydWxsKChWQUxVRSl4KQorI2VuZGlmCisKKyNpZm5kZWYgcm91bmR1cAorIyAgZGVmaW5lIHJvdW5kdXAoeCwgeSkgICAoKCgoeCkrKCh5KS0xKSkvKHkpKSooeSkpCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjICBkZWZpbmUgbGlrZWx5KHgpIF9fYnVpbHRpbl9leHBlY3QoKHgpLCAxKQorIyAgZGVmaW5lIHVubGlrZWx5KHgpIF9fYnVpbHRpbl9leHBlY3QoKHgpLCAwKQorI2Vsc2UKKyMgIGRlZmluZSBsaWtlbHkoeCkgKHgpCisjICBkZWZpbmUgdW5saWtlbHkoeCkgKHgpCisjZW5kaWYKKworI2lmbmRlZiBNQVgKKyMgIGRlZmluZSBNQVgoYSwgYikgKChhKSA8IChiKSA/IChiKSA6IChhKSkKKyNlbmRpZgorI2lmbmRlZiBNSU4KKyMgIGRlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisjaWZuZGVmIFJCX0dDX0dVQVJECisjICBkZWZpbmUgUkJfR0NfR1VBUkQoeCkgKHgpCisjZW5kaWYKKworI2VuZGlmIC8qIFJCRkZJX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9leHRjb25mLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9leHRjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4OWEyYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2V4dGNvbmYuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgRVhUQ09ORl9ICisjZGVmaW5lIEVYVENPTkZfSAorI2RlZmluZSBIQVZFX0ZGSV9QUkVQX0NMT1NVUkUgMQorI2RlZmluZSBIQVZFX1JCX1RIUkVBRF9DQUxMX1dJVEhfR1ZMIDEKKyNkZWZpbmUgSEFWRV9SQl9USFJFQURfQ0FMTF9XSVRIT1VUX0dWTCAxCisjZGVmaW5lIFJVQllfMV85IDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvZXh0Y29uZi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2V4dGNvbmYucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0NGI2YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2V4dGNvbmYucmIKQEAgLTAsMCArMSw2NiBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorCitpZiAhZGVmaW5lZD8oUlVCWV9FTkdJTkUpIHx8IFJVQllfRU5HSU5FID09ICdydWJ5JyB8fCBSVUJZX0VOR0lORSA9PSAncmJ4JworICByZXF1aXJlICdta21mJworICByZXF1aXJlICdyYmNvbmZpZycKKyAgZGlyX2NvbmZpZygiZmZpX2MiKQorCisgICMgcmVjZW50IHZlcnNpb25zIG9mIHJ1YnkgYWRkIHJlc3RyaWN0aXZlIGFuc2kgYW5kIHdhcm5pbmcgZmxhZ3Mgb24gYSB3aGltIC0ga2lsbCB0aGVtIGFsbAorICAkd2FybmZsYWdzID0gJycKKyAgJENGTEFHUy5nc3ViISgvW1xzK10tYW5zaS8sICcnKQorICAkQ0ZMQUdTLmdzdWIhKC9bXHMrXS1zdGQ9W15cc10rLywgJycpCisgICMgc29sYXJpcyAxMCBuZWVkcyAtYzk5IGZvciA8c3RkYm9vbC5oPgorICAkQ0ZMQUdTIDw8ICIgLXN0ZD1jOTkiIGlmIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3Rfb3MnXSA9fiAvc29sYXJpcyghPzJcLjExKS8KKyAgCisgIGlmIEVOVlsnUlVCWV9DQ19WRVJTSU9OJ10ubmlsPyAmJiAocGtnX2NvbmZpZygibGliZmZpIikgfHwKKyAgICAgaGF2ZV9oZWFkZXIoImZmaS5oIikgfHwKKyAgICAgZmluZF9oZWFkZXIoImZmaS5oIiwgIi91c3IvbG9jYWwvaW5jbHVkZSIsICIvdXNyL2luY2x1ZGUvZmZpIikpCisKKyAgICAjIFdlIG5lZWQgYXQgbGVhc3QgZmZpX2NhbGwgYW5kIGZmaV9wcmVwX2Nsb3N1cmUKKyAgICBsaWJmZmlfb2sgPSBoYXZlX2xpYnJhcnkoImZmaSIsICJmZmlfY2FsbCIsIFsgImZmaS5oIiBdKSB8fAorICAgICAgICAgICAgICAgIGhhdmVfbGlicmFyeSgibGliZmZpIiwgImZmaV9jYWxsIiwgWyAiZmZpLmgiIF0pCisgICAgbGliZmZpX29rICYmPSBoYXZlX2Z1bmMoImZmaV9wcmVwX2Nsb3N1cmUiKQorCisgICAgIyBDaGVjayBpZiB0aGUgcmF3IGFwaSBpcyBhdmFpbGFibGUuCisgICAgJGRlZnMgPDwgIi1ESEFWRV9SQVdfQVBJIiBpZiBoYXZlX2Z1bmMoImZmaV9yYXdfY2FsbCIpICYmIGhhdmVfZnVuYygiZmZpX3ByZXBfcmF3X2Nsb3N1cmUiKQorICBlbmQKKworICBoYXZlX2hlYWRlcignc2hsd2FwaS5oJykKKyAgaGF2ZV9mdW5jKCdyYl90aHJlYWRfYmxvY2tpbmdfcmVnaW9uJykKKyAgaGF2ZV9mdW5jKCdyYl90aHJlYWRfY2FsbF93aXRoX2d2bCcpCisgIGhhdmVfZnVuYygncmJfdGhyZWFkX2NhbGxfd2l0aG91dF9ndmwnKQorICBoYXZlX2Z1bmMoJ2ZmaV9wcmVwX2NpZl92YXInKQorICAKKyAgJGRlZnMgPDwgIi1ESEFWRV9FWFRDT05GX0giIGlmICRkZWZzLmVtcHR5PyAjIG5lZWRlZCBzbyBjcmVhdGVfaGVhZGVyIHdvcmtzCisgICRkZWZzIDw8ICItRFVTRV9JTlRFUk5BTF9MSUJGRkkiIHVubGVzcyBsaWJmZmlfb2sKKyAgJGRlZnMgPDwgIi1EUlVCWV8xXzkiIGlmIFJVQllfVkVSU0lPTiA+PSAiMS45LjAiCisgICRkZWZzIDw8ICItREZGSV9CVUlMRElORyIgaWYgUmJDb25maWc6OkNPTkZJR1snaG9zdF9vcyddID1+IC9tc3dpbi8gIyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5ld2VyIGxpYmZmaQorCisgIGNyZWF0ZV9oZWFkZXIKKyAgCisgICRMT0NBTF9MSUJTIDw8ICIgLi9saWJmZmkvLmxpYnMvbGliZmZpX2NvbnZlbmllbmNlLmxpYiIgaWYgIWxpYmZmaV9vayAmJiBSYkNvbmZpZzo6Q09ORklHWydob3N0X29zJ10gPX4gL21zd2luLworCisgIGNyZWF0ZV9tYWtlZmlsZSgiZmZpX2MiKQorICB1bmxlc3MgbGliZmZpX29rCisgICAgRmlsZS5vcGVuKCJNYWtlZmlsZSIsICJhIikgZG8gfG1mfAorICAgICAgbWYucHV0cyAiTElCRkZJX0hPU1Q9LS1ob3N0PSN7UmJDb25maWc6OkNPTkZJR1snaG9zdF9hbGlhcyddfSIgaWYgUmJDb25maWc6OkNPTkZJRy5oYXNfa2V5PygiaG9zdF9hbGlhcyIpCisgICAgICBpZiBSYkNvbmZpZzo6Q09ORklHWydob3N0X29zJ10uZG93bmNhc2UgPX4gL2Rhcndpbi8KKyAgICAgICAgbWYucHV0cyAiaW5jbHVkZSAke3NyY2Rpcn0vbGliZmZpLmRhcndpbi5tayIKKyAgICAgIGVsc2lmIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3Rfb3MnXS5kb3duY2FzZSA9fiAvYnNkLworICAgICAgICBtZi5wdXRzICcuaW5jbHVkZSAiJHtzcmNkaXJ9L2xpYmZmaS5ic2QubWsiJworICAgICAgZWxzaWYgUmJDb25maWc6OkNPTkZJR1snaG9zdF9vcyddLmRvd25jYXNlID1+IC9tc3dpbjY0LworICAgICAgICBtZi5wdXRzICchaW5jbHVkZSAkKHNyY2RpcikvbGliZmZpLnZjNjQubWsnCisgICAgICBlbHNpZiBSYkNvbmZpZzo6Q09ORklHWydob3N0X29zJ10uZG93bmNhc2UgPX4gL21zd2luMzIvCisgICAgICAgIG1mLnB1dHMgJyFpbmNsdWRlICQoc3JjZGlyKS9saWJmZmkudmMubWsnCisgICAgICBlbHNlCisgICAgICAgIG1mLnB1dHMgImluY2x1ZGUgJHtzcmNkaXJ9L2xpYmZmaS5tayIKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCitlbHNlCisgIEZpbGUub3BlbigiTWFrZWZpbGUiLCAidyIpIGRvIHxtZnwKKyAgICBtZi5wdXRzICIjIER1bW15IG1ha2VmaWxlIGZvciBub24tbXJpIHJ1YmllcyIKKyAgICBtZi5wdXRzICJhbGwgaW5zdGFsbDo6XG4iCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9mZmkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2ZmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOWEwNTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9mZmkuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBXYXluZSBNZWlzc25lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IEx1YyBIZWlucmljaCA8bHVjQGhvbmstaG9uay5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMsIFJ1YnkgRkZJIHByb2plY3QgY29udHJpYnV0b3JzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHJ1YnkuaD4KKworI2luY2x1ZGUgPGZmaS5oPgorCisjaW5jbHVkZSAicmJmZmkuaCIKKyNpbmNsdWRlICJBYnN0cmFjdE1lbW9yeS5oIgorI2luY2x1ZGUgIlBvaW50ZXIuaCIKKyNpbmNsdWRlICJNZW1vcnlQb2ludGVyLmgiCisjaW5jbHVkZSAiU3RydWN0LmgiCisjaW5jbHVkZSAiU3RydWN0QnlWYWx1ZS5oIgorI2luY2x1ZGUgIlN0cnVjdEJ5UmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiRHluYW1pY0xpYnJhcnkuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybS5oIgorI2luY2x1ZGUgIlR5cGVzLmgiCisjaW5jbHVkZSAiTGFzdEVycm9yLmgiCisjaW5jbHVkZSAiRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJDbG9zdXJlUG9vbC5oIgorI2luY2x1ZGUgIk1ldGhvZEhhbmRsZS5oIgorI2luY2x1ZGUgIkNhbGwuaCIKKyNpbmNsdWRlICJBcnJheVR5cGUuaCIKKyNpbmNsdWRlICJNYXBwZWRUeXBlLmgiCisKK3ZvaWQgSW5pdF9mZmlfYyh2b2lkKTsKKworVkFMVUUgcmJmZmlfRkZJTW9kdWxlID0gUW5pbDsKKworc3RhdGljIFZBTFVFIG1vZHVsZUZGSSA9IFFuaWw7CisKK3ZvaWQKK0luaXRfZmZpX2Modm9pZCkgCit7CisgICAgLyogCisgICAgICogRG9jdW1lbnQtbW9kdWxlOiBGRkkKKyAgICAgKgorICAgICAqIFRoaXMgbW9kdWxlIGVtYmJlZCB0eXBlIGNvbnN0YW50cyBmcm9tIHtGRkk6Ok5hdGl2ZVR5cGV9LgorICAgICAqLworICAgIHJiZmZpX0ZGSU1vZHVsZSA9IG1vZHVsZUZGSSA9IHJiX2RlZmluZV9tb2R1bGUoIkZGSSIpOworICAgIHJiX2dsb2JhbF92YXJpYWJsZSgmcmJmZmlfRkZJTW9kdWxlKTsKKworICAgIHJiZmZpX1RocmVhZF9Jbml0KHJiZmZpX0ZGSU1vZHVsZSk7CisgICAgCisgICAgLyogRkZJOjpUeXBlIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSBtb3N0IG90aGVyIGNsYXNzZXMgKi8KKyAgICByYmZmaV9UeXBlX0luaXQobW9kdWxlRkZJKTsKKworICAgIHJiZmZpX0RhdGFDb252ZXJ0ZXJfSW5pdChtb2R1bGVGRkkpOworCisgICAgcmJmZmlfQXJyYXlUeXBlX0luaXQobW9kdWxlRkZJKTsKKyAgICByYmZmaV9MYXN0RXJyb3JfSW5pdChtb2R1bGVGRkkpOworICAgIHJiZmZpX0NhbGxfSW5pdChtb2R1bGVGRkkpOworICAgIHJiZmZpX0Nsb3N1cmVQb29sX0luaXQobW9kdWxlRkZJKTsKKyAgICByYmZmaV9NZXRob2RIYW5kbGVfSW5pdChtb2R1bGVGRkkpOworICAgIHJiZmZpX1BsYXRmb3JtX0luaXQobW9kdWxlRkZJKTsKKyAgICByYmZmaV9BYnN0cmFjdE1lbW9yeV9Jbml0KG1vZHVsZUZGSSk7CisgICAgcmJmZmlfUG9pbnRlcl9Jbml0KG1vZHVsZUZGSSk7CisgICAgcmJmZmlfRnVuY3Rpb25fSW5pdChtb2R1bGVGRkkpOworICAgIHJiZmZpX01lbW9yeVBvaW50ZXJfSW5pdChtb2R1bGVGRkkpOworICAgIHJiZmZpX0J1ZmZlcl9Jbml0KG1vZHVsZUZGSSk7CisgICAgcmJmZmlfU3RydWN0QnlWYWx1ZV9Jbml0KG1vZHVsZUZGSSk7CisgICAgcmJmZmlfU3RydWN0QnlSZWZlcmVuY2VfSW5pdChtb2R1bGVGRkkpOworICAgIHJiZmZpX1N0cnVjdF9Jbml0KG1vZHVsZUZGSSk7CisgICAgcmJmZmlfRHluYW1pY0xpYnJhcnlfSW5pdChtb2R1bGVGRkkpOworICAgIHJiZmZpX1ZhcmlhZGljX0luaXQobW9kdWxlRkZJKTsKKyAgICByYmZmaV9UeXBlc19Jbml0KG1vZHVsZUZGSSk7CisgICAgcmJmZmlfTWFwcGVkVHlwZV9Jbml0KG1vZHVsZUZGSSk7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2ZmaS5vIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvZmZpLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkMGM0MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2ZmaS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2ZmaV9jLmJ1bmRsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2ZmaV9jLmJ1bmRsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MGNlYTdlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvZmZpX2MuYnVuZGxlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS5ic2QubWsgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkuYnNkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWM2YjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkuYnNkLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBNYWtlZmlsZSBmb3IgQlNEIHN5c3RlbXMKKyMKKworSU5DRkxBR1MgKz0gLUkke0xJQkZGSV9CVUlMRF9ESVJ9L2luY2x1ZGUKK0xPQ0FMX0xJQlMgKz0gJHtMSUJGRkl9IC1scHRocmVhZAorCitMSUJGRklfQ0ZMQUdTID0gJHtGRklfTU1BUF9FWEVDfSAtcHRocmVhZAorTElCRkZJX0JVSUxEX0RJUiA9ICR7LkNVUkRJUn0vbGliZmZpLSR7YXJjaH0KKworLmlmICR7c3JjZGlyfSA9PSAiLiIKKyAgTElCRkZJX1NSQ19ESVIgOj0gJHsuQ1VSRElSfS9saWJmZmkKKy5lbHNlCisgIExJQkZGSV9TUkNfRElSIDo9ICR7c3JjZGlyfS9saWJmZmkKKy5lbmRpZgorCisKK0xJQkZGSSA9ICR7TElCRkZJX0JVSUxEX0RJUn0vLmxpYnMvbGliZmZpX2NvbnZlbmllbmNlLmEKK0xJQkZGSV9DT05GSUdVUkUgPSAke0xJQkZGSV9TUkNfRElSfS9jb25maWd1cmUgLS1kaXNhYmxlLXN0YXRpYyBcCisJLS13aXRoLXBpYz15ZXMgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcKKworJChPQkpTKToJJHtMSUJGRkl9CisKKyQoTElCRkZJKToJCQorCUBta2RpciAtcCAke0xJQkZGSV9CVUlMRF9ESVJ9CisJQGlmIFsgISAtZiAke0xJQkZGSV9CVUlMRF9ESVJ9L01ha2VmaWxlIF07IHRoZW4gXAorCSAgICBlY2hvICJDb25maWd1cmluZyBsaWJmZmkiOyBcCisJICAgIGNkICR7TElCRkZJX0JVSUxEX0RJUn0gJiYgXAorCQkvdXNyL2Jpbi9lbnYgQ0M9IiR7Q0N9IiBMRD0iJHtMRH0iIENGTEFHUz0iJHtMSUJGRklfQ0ZMQUdTfSIgR1JFUF9PUFRJT05TPSIiIFwKKwkJL2Jpbi9zaCAke0xJQkZGSV9DT05GSUdVUkV9ICR7TElCRkZJX0hPU1R9ID4gL2Rldi9udWxsOyBcCisJZmkKKwlAY2QgJHtMSUJGRklfQlVJTERfRElSfSAmJiAke01BS0V9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS5kYXJ3aW4ubWsgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkuZGFyd2luLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OGJhZGQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkuZGFyd2luLm1rCkBAIC0wLDAgKzEsOTUgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorCitpbmNsdWRlICR7c3JjZGlyfS9saWJmZmkuZ251Lm1rCisKK0NDQUNIRSA6PSAkKHNoZWxsIHR5cGUgLXAgY2NhY2hlKQorQlVJTERfRElSIDo9ICQoc2hlbGwgcHdkKQorCitJTkNGTEFHUyArPSAtSSIkKEJVSUxEX0RJUikiCisKKyMgV29yayBvdXQgd2hpY2ggYXJjaGVzIHdlIG5lZWQgdG8gY29tcGlsZSB0aGUgbGliIGZvcgorQVJDSEVTIDo9IAorQVJDSEZMQUdTID89ICQoZmlsdGVyIC1hcmNoICUsICQoQ0ZMQUdTKSkKKworaWZuZXEgKCQoZmluZHN0cmluZyAtYXJjaCBwcGMsJChBUkNIRkxBR1MpKSwpCisgIEFSQ0hFUyArPSBwcGMKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgLWFyY2ggaTM4NiwkKEFSQ0hGTEFHUykpLCkKKyAgQVJDSEVTICs9IGkzODYKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgLWFyY2ggeDg2XzY0LCQoQVJDSEZMQUdTKSksKQorICBBUkNIRVMgKz0geDg2XzY0CitlbmRpZgorCitpZmVxICgkKHN0cmlwICQoQVJDSEVTKSksKQorTElCRkZJX0JVSUxEX0RJUiA9ICQoQlVJTERfRElSKS9saWJmZmktJChhcmNoKQorIyBKdXN0IGJ1aWxkIHRoZSBvbmUgKGRlZmF1bHQpIGFyY2hpdGVjdHVyZQorJChMSUJGRkkpOgkJCisJQG1rZGlyIC1wICIkKExJQkZGSV9CVUlMRF9ESVIpIiAiJChARCkiCisJQGlmIFsgISAtZiAiJChMSUJGRklfQlVJTERfRElSKSIvTWFrZWZpbGUgXTsgdGhlbiBcCisJICAgIGVjaG8gIkNvbmZpZ3VyaW5nIGxpYmZmaSI7IFwKKwkgICAgY2QgIiQoTElCRkZJX0JVSUxEX0RJUikiICYmIFwKKwkJL3Vzci9iaW4vZW52IENDPSIkKENDKSIgTEQ9IiQoTEQpIiBDRkxBR1M9IiQoTElCRkZJX0NGTEFHUykiIEdSRVBfT1BUSU9OUz0iIiBcCisJCS9iaW4vc2ggJChMSUJGRklfQ09ORklHVVJFKSAkKExJQkZGSV9IT1NUKSA+IC9kZXYvbnVsbDsgXAorCWZpCisJY2QgIiQoTElCRkZJX0JVSUxEX0RJUikiICYmICQoTUFLRSkKKworZWxzZQorTElCVEFSR0VUUyA9ICQoZm9yZWFjaCBhcmNoLCQoQVJDSEVTKSwiJChCVUlMRF9ESVIpIi9saWJmZmktJChhcmNoKS8ubGlicy9saWJmZmlfY29udmVuaWVuY2UuYSkKKworIyBCdWlsZCBhIGZhdCBiaW5hcnkgYW5kIGFzc2VtYmxlCitidWlsZF9mZmkgPSBcCisJbWtkaXIgLXAgIiQoQlVJTERfRElSKSIvbGliZmZpLSQoMSk7IFwKKwkoaWYgWyAhIC1mICIkKEJVSUxEX0RJUikiL2xpYmZmaS0kKDEpL01ha2VmaWxlIF07IHRoZW4gXAorCSAgICBlY2hvICJDb25maWd1cmluZyBsaWJmZmkgZm9yICQoMSkiOyBcCisJICAgIGNkICIkKEJVSUxEX0RJUikiL2xpYmZmaS0kKDEpICYmIFwKKwkgICAgICBlbnYgQ0M9IiQoQ0NBQ0hFKSAkKENDKSIgQ0ZMQUdTPSItYXJjaCAkKDEpICQoTElCRkZJX0NGTEFHUykiIExERkxBR1M9Ii1hcmNoICQoMSkiIFwKKwkJJChMSUJGRklfQ09ORklHVVJFKSAtLWhvc3Q9JCgxKS1hcHBsZS1kYXJ3aW4gPiAvZGV2L251bGw7IFwKKwlmaSk7IFwKKwllbnYgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPTEwLjQgJChNQUtFKSAtQyAiJChCVUlMRF9ESVIpIi9saWJmZmktJCgxKQorCit0YXJnZXRfZmZpID0gIiQoQlVJTERfRElSKSIvbGliZmZpLSQoMSkvLmxpYnMvbGliZmZpX2NvbnZlbmllbmNlLmE6OyAkKGNhbGwgYnVpbGRfZmZpLCQoMSkpCisKKyMgV29yayBvdXQgd2hpY2ggYXJjaGVzIHdlIG5lZWQgdG8gY29tcGlsZSB0aGUgbGliIGZvcgoraWZuZXEgKCQoZmluZHN0cmluZyBwcGMsJChBUkNIRVMpKSwpCisgICQoY2FsbCB0YXJnZXRfZmZpLHBwYykKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgaTM4NiwkKEFSQ0hFUykpLCkKKyAgJChjYWxsIHRhcmdldF9mZmksaTM4NikKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgeDg2XzY0LCQoQVJDSEVTKSksKQorICAkKGNhbGwgdGFyZ2V0X2ZmaSx4ODZfNjQpCitlbmRpZgorCisKKyQoTElCRkZJKToJJChMSUJUQVJHRVRTKQorCSMgQXNzZW1ibGUgaW50byBhIEZBVCAoeDg2XzY0LCBpMzg2LCBwcGMpIGxpYnJhcnkKKwlAbWtkaXIgLXAgIiQoQEQpIgorCS91c3IvYmluL2xpYnRvb2wgLXN0YXRpYyAtbyAkQCBcCisJICAgICQoZm9yZWFjaCBhcmNoLCAkKEFSQ0hFUyksIiQoQlVJTERfRElSKSIvbGliZmZpLSQoYXJjaCkvLmxpYnMvbGliZmZpX2NvbnZlbmllbmNlLmEpCisJQG1rZGlyIC1wICIkKExJQkZGSV9CVUlMRF9ESVIpIi9pbmNsdWRlCisJJChSTSkgIiQoTElCRkZJX0JVSUxEX0RJUikiL2luY2x1ZGUvZmZpLmgKKwlAKCBcCisJCXByaW50ZiAiI2lmIGRlZmluZWQoX19pMzg2X18pXG4iOyBcCisJCXByaW50ZiAiI2luY2x1ZGUgXCJsaWJmZmktaTM4Ni9pbmNsdWRlL2ZmaS5oXCJcbiI7IFwKKwkJcHJpbnRmICIjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pXG4iOyBcCisJCXByaW50ZiAiI2luY2x1ZGUgXCJsaWJmZmkteDg2XzY0L2luY2x1ZGUvZmZpLmhcIlxuIjtcCisJCXByaW50ZiAiI2VsaWYgZGVmaW5lZChfX3BwY19fKVxuIjsgXAorCQlwcmludGYgIiNpbmNsdWRlIFwibGliZmZpLXBwYy9pbmNsdWRlL2ZmaS5oXCJcbiI7XAorCQlwcmludGYgIiNlbmRpZlxuIjtcCisJKSA+ICIkKExJQkZGSV9CVUlMRF9ESVIpIi9pbmNsdWRlL2ZmaS5oCisJQCggXAorCQlwcmludGYgIiNpZiBkZWZpbmVkKF9faTM4Nl9fKVxuIjsgXAorCQlwcmludGYgIiNpbmNsdWRlIFwibGliZmZpLWkzODYvaW5jbHVkZS9mZml0YXJnZXQuaFwiXG4iOyBcCisJCXByaW50ZiAiI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKVxuIjsgXAorCQlwcmludGYgIiNpbmNsdWRlIFwibGliZmZpLXg4Nl82NC9pbmNsdWRlL2ZmaXRhcmdldC5oXCJcbiI7XAorCQlwcmludGYgIiNlbGlmIGRlZmluZWQoX19wcGNfXylcbiI7IFwKKwkJcHJpbnRmICIjaW5jbHVkZSBcImxpYmZmaS1wcGMvaW5jbHVkZS9mZml0YXJnZXQuaFwiXG4iO1wKKwkJcHJpbnRmICIjZW5kaWZcbiI7XAorCSkgPiAiJChMSUJGRklfQlVJTERfRElSKSIvaW5jbHVkZS9mZml0YXJnZXQuaAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpLmdudS5tayBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS5nbnUubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmN2E3NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS5nbnUubWsKQEAgLTAsMCArMSwzMSBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjICBDb21tb24gZGVmaW5pdGlvbnMgZm9yIGFsbCBzeXN0ZW1zIHRoYXQgdXNlIEdOVSBtYWtlCisjCisKKworIyBUYWNrIHRoZSBleHRyYSBkZXBzIG9udG8gdGhlIGF1dG9nZW5lcmF0ZWQgdmFyaWFibGVzCitJTkNGTEFHUyArPSAtSSIkKExJQkZGSV9CVUlMRF9ESVIpIi9pbmNsdWRlCitMT0NBTF9MSUJTICs9ICQoTElCRkZJKQorQlVJTERfRElSID0gJChzaGVsbCBwd2QpCitMSUJGRklfQ0ZMQUdTID0gJChGRklfTU1BUF9FWEVDKQorTElCRkZJX0JVSUxEX0RJUiA9ICQoQlVJTERfRElSKS9saWJmZmktJChhcmNoKQorCitpZmVxICgkKHNyY2RpciksLikKKyAgTElCRkZJX1NSQ19ESVIgOj0gJChzaGVsbCBwd2QpL2xpYmZmaQorZWxzZSBpZmVxICgkKHNyY2RpciksLi4pCisgIExJQkZGSV9TUkNfRElSIDo9ICQoc2hlbGwgcHdkKS8uLi9saWJmZmkKK2Vsc2UKKyAgTElCRkZJX1NSQ19ESVIgOj0gJChyZWFscGF0aCAkKHNyY2RpcikvbGliZmZpKQorZW5kaWYKKworTElCRkZJID0gIiQoTElCRkZJX0JVSUxEX0RJUikiLy5saWJzL2xpYmZmaV9jb252ZW5pZW5jZS5hCitMSUJGRklfQ09ORklHVVJFID0gIiQoTElCRkZJX1NSQ19ESVIpIi9jb25maWd1cmUgLS1kaXNhYmxlLXN0YXRpYyBcCisJLS13aXRoLXBpYz15ZXMgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcKKworJChPQkpTKToJJChMSUJGRkkpCisKKyMKKyMgbGliZmZpLm1rIG9yIGxpYmZmaS5kYXJ3aW4ubWsgY29udGFpbnMgcnVsZXMgZm9yIGJ1aWxkaW5nIHRoZSBhY3R1YWwgbGlicmFyeQorIworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkubWsgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjMTVjNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS5tawpAQCAtMCwwICsxLDEzIEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKworaW5jbHVkZSAke3NyY2Rpcn0vbGliZmZpLmdudS5taworCiskKExJQkZGSSk6CQkKKwlAbWtkaXIgLXAgIiQoTElCRkZJX0JVSUxEX0RJUikiICIkQChEKSIKKwlAaWYgWyAhIC1mICIkKExJQkZGSV9CVUlMRF9ESVIpIi9NYWtlZmlsZSBdOyB0aGVuIFwKKwkgICAgZWNobyAiQ29uZmlndXJpbmcgbGliZmZpIjsgXAorCSAgICBjZCAiJChMSUJGRklfQlVJTERfRElSKSIgJiYgXAorCQkvdXNyL2Jpbi9lbnYgQ0ZMQUdTPSIkKExJQkZGSV9DRkxBR1MpIiBHUkVQX09QVElPTlM9IiIgXAorCQkvYmluL3NoICQoTElCRkZJX0NPTkZJR1VSRSkgJChMSUJGRklfSE9TVCkgPiAvZGV2L251bGw7IFwKKwlmaQorCSQoTUFLRSkgLUMgIiQoTElCRkZJX0JVSUxEX0RJUikiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkudmMubWsgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkudmMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyZTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS52Yy5tawpAQCAtMCwwICsxLDI2IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgTWFrZWZpbGUgZm9yIG1zdmMKKyMKKworIyBUYWNrIHRoZSBleHRyYSBkZXBzIG9udG8gdGhlIGF1dG9nZW5lcmF0ZWQgdmFyaWFibGVzCitJTkNGTEFHUyA9ICQoSU5DRkxBR1MpIC1JJChMSUJGRklfQlVJTERfRElSKS9pbmNsdWRlIC1JJChMSUJGRklfQlVJTERfRElSKS9zcmMveDg2CitMT0NBTF9MSUJTID0gJChMT0NBTF9MSUJTKSAkKExJQkZGSSkKK0JVSUxEX0RJUiA9ICQoTUFLRURJUikKK0xJQkZGSV9CVUlMRF9ESVIgPSAkKEJVSUxEX0RJUikvbGliZmZpCisKKyFJRiAiJChzcmNkaXIpIiA9PSAiLiIKK0xJQkZGSV9TUkNfRElSID0gJChNQUtFRElSKS9saWJmZmkKKyFFTFNFCitMSUJGRklfU1JDX0RJUiA9ICQoc3JjZGlyKS9saWJmZmkKKyFFTkRJRgorCitMSUJGRkkgPSAkKExJQkZGSV9CVUlMRF9ESVIpLy5saWJzL2xpYmZmaV9jb252ZW5pZW5jZS5saWIKKworJChPQkpTKToJJChMSUJGRkkpCisKKyQoTElCRkZJKToJCQorCUAkKE1BS0VESVJTKSAkKExJQkZGSV9CVUlMRF9ESVIpCisJQGNkICQoTElCRkZJX0JVSUxEX0RJUikgJiYgJChNQUtFKSAtZiBNYWtlZmlsZS52YworCQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkudmM2NC5tayBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS52YzY0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODI5NDgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkudmM2NC5tawpAQCAtMCwwICsxLDI2IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgTWFrZWZpbGUgZm9yIG1zdmMKKyMKKworIyBUYWNrIHRoZSBleHRyYSBkZXBzIG9udG8gdGhlIGF1dG9nZW5lcmF0ZWQgdmFyaWFibGVzCitJTkNGTEFHUyA9ICQoSU5DRkxBR1MpIC1JJChMSUJGRklfQlVJTERfRElSKS9pbmNsdWRlIC1JJChMSUJGRklfQlVJTERfRElSKS9zcmMveDg2CitMT0NBTF9MSUJTID0gJChMT0NBTF9MSUJTKSAkKExJQkZGSSkKK0JVSUxEX0RJUiA9ICQoTUFLRURJUikKK0xJQkZGSV9CVUlMRF9ESVIgPSAkKEJVSUxEX0RJUikvbGliZmZpCisKKyFJRiAiJChzcmNkaXIpIiA9PSAiLiIKK0xJQkZGSV9TUkNfRElSID0gJChNQUtFRElSKS9saWJmZmkKKyFFTFNFCitMSUJGRklfU1JDX0RJUiA9ICQoc3JjZGlyKS9saWJmZmkKKyFFTkRJRgorCitMSUJGRkkgPSAkKExJQkZGSV9CVUlMRF9ESVIpLy5saWJzL2xpYmZmaV9jb252ZW5pZW5jZS5saWIKKworJChPQkpTKToJJChMSUJGRkkpCisKKyQoTElCRkZJKToJCQorCUAkKE1BS0VESVJTKSAkKExJQkZGSV9CVUlMRF9ESVIpCisJQGNkICQoTElCRkZJX0JVSUxEX0RJUikgJiYgJChNQUtFKSAtZiBNYWtlZmlsZS52YzY0CisJCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9DaGFuZ2VMb2cgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDEwMjQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNDYwMCBAQAorMjAxMS0wOC0yMiAgSmFzcGVyIExpZXZpc3NlIEFkcmlhYW5zZSA8amFzcGVyQG9wZW5ic2Qub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBPcGVuQlNEL2hwcGEgYW5kIE9wZW5CU0QvcG93ZXJwYyBzdXBwb3J0LgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDExLTA3LTExICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworICAgICAgICAqIHNyYy9hcm0vZmZpLmMgKEZGSV9JTklUX1RSQU1QT0xJTkUpOiBDbGVhciBpY2FjaGUuCisKKzIwMTEtMDYtMjkgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jOiBNb3ZlIFBSIG51bWJlciB0byBjb21tZW50LgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmM6IExpa2V3aXNlLgorCisyMDExLTA2LTI5ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCVBSIGxpYmZmaS80NjY2MAorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGVfdmEuYzogeGZhaWwgZGctb3V0cHV0IG9uCisJbWlwcy1zZ2ktaXJpeDYqLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmM6IExpa2V3aXNlLgorCisyMDExLTA2LTE0ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2h1Z2Vfc3RydWN0LmMgKHRlc3RfbGFyZ2VfZm4pOiBVc2UgUFJJdTgsCisJUFJJZDggaW5zdGVhZCBvZiAlaGh1LCAlaGhkLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaCBbX19hbHBoYV9fICYmIF9fb3NmX19dIChQUklkOCwKKwlQUkl1OCk6IERlZmluZS4KKwlbX19zZ2lfX10gKFBSSWQ4LCBQUkl1OCk6IERlZmluZS4KKworMjAxMS0wNC0yOSAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIHNyYy9hbHBoYS9vc2YuUyAoVUFfU0ksIEZERV9FTkNPRElORywgRkRFX0VOQ09ERSwgRkRFX0FSQU5HRSk6CisJRGVmaW5lLgorCVVzZSB0aGVtIHRvIGhhbmRsZSBFTEYgdnMuIEVDT0ZGIGRpZmZlcmVuY2VzLgorCVtfX29zZl9fXSAoX0dMT0JBTF9fRl9mZmlfY2FsbF9vc2YpOiBEZWZpbmUuCisKKzIwMTEtMDMtMzAgIFRpbW90aHkgV2FsbCAgPHR3YWxsQHVzZXJzLnNmLm5ldD4KKworCSogc3JjL3Bvd2VycGMvZGFyd2luLlM6IEZpeCB1bmtub3duIEZERSBlbmNvZGluZy4KKwkqIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlM6IGRpdHRvLgorCisyMDExLTAyLTI1ICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IEFsbG93IGZvciBtb3JlCisJMzItYml0IEFCSXMuCisKKzIwMTEtMDItMTUgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogbTQvYXhfY2NfbWF4b3B0Lm00OiBEb24ndCAtbWFsaWduLWRvdWJsZSBvciB1c2UgLWZmYXN0LW1hdGguCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMTEtMDItMTMgIFJhbGYgV2lsZGVuaHVlcyAgPFJhbGYuV2lsZGVuaHVlc0BnbXguZGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAxMS0wMi0xMyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQG1veGllbG9naWMuY29tPgorCisJKiBpbmNsdWRlL2ZmaV9jb21tb24uaCAoVU5MSUtFTFksIExJS0VMWSk6IERlZmluZS4KKwkqIHNyYy94ODYvZmZpNjQuYyAoVU5MSUtFTFksIExJS0VMWSk6IFJlbW92ZSBkZWZpbml0aW9uLgorCSogc3JjL3ByZXBfY2lmLmMgKFVOTElLRUxZLCBMSUtFTFkpOiBSZW1vdmUgZGVmaW5pdGlvbi4KKworCSogc3JjL3ByZXBfY2lmLmMgKGluaXRpYWxpemVfYWdncmVnYXRlKTogQ29udmVydCBhc3NlcnRpb24gaW50bworCUZGSV9CQURfVFlQRURFRiByZXR1cm4uICBJbml0aWFsaXplIGFyZyBzaXplIGFuZCBhbGlnbm1lbnQgdG8gMC4KKworCSogc3JjL3BhL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IERvbid0IEFTU0VSVCBBQkkgdGVzdCwKKwlqdXN0IHJldHVybiBGRklfQkFEX0FCSSB3aGVuIHRoaW5ncyBhcmUgd3JvbmcuCisJKiBzcmMvYXJtL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IERpdHRvLgorCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRGl0dG8uCisJKiBzcmMvbWlwcy9mZmkuYyAoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBEaXR0by4KKwkqIHNyYy9pYTY0L2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IERpdHRvLgorCSogc3JjL2F2cjMyL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IERpdHRvLgorCisyMDExLTAyLTExICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIHNyYy9zcGFyYy9mZmkuYyAoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBEb24ndCBBU1NFUlQgQUJJIHRlc3QsCisJanVzdCByZXR1cm4gRkZJX0JBRF9BQkkgd2hlbiB0aGluZ3MgYXJlIHdyb25nLgorCisyMDExLTAyLTA5ICBTdHVhcnQgU2hlbHRvbiAgPHNyY3NoZWx0b25AZ21haWwuY29tPgorCisJaHR0cDovL2J1Z3MuZ2VudG9vLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjg2OTExCisJKiBzcmMvbWlwcy9mZml0YXJnZXQuaDogQ2xlYW4gdXAgZXJyb3IgbWVzc2FnZXMuCisJKiBzcmMvamF2YV9yYXdfYXBpLmMgKGZmaV9qYXZhX3RyYW5zbGF0ZV9hcmdzKTogQ2FzdCByYXcgYXJnIHRvCisJZmZpX3JhdyouCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBBZGQgcHJhZ21hIGZvciBTR0kgY29tcGlsZXIuCisKKzIwMTEtMDItMDkgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBBZGQgcG93ZXJwYzY0LSotZGFyd2luKiBzdXBwb3J0LgorCisyMDExLTAyLTA5ICBBbnRob255IEdyZWVuIDxncmVlbkBtb3hpZWxvZ2ljLmNvbT4KKworCSogUkVBRE1FOiBNZW50aW9uIEludGVyaXguCisKKzIwMTEtMDItMDkgIEpvbmF0aGFuIENhbGxlbiAgPGFiY2RAZ2VudG9vLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBBZGQgSW50ZXJpeCB0byB3aW4zMi9jeWd3aW4vbWluZ3cgY2FzZS4KKwkqIGNvbmZpZ3VyZTogRGl0dG8uCisJKiBzcmMvY2xvc3VyZXMuYzogVHJlYXQgSW50ZXJpeCBsaWtlIEN5Z3dpbiwgaW5zdGVhZCBvZiBhcyBhCisJZ2VuZXJpYyB3aW4zMi4KKworMjAxMS0wMi0wOSAgQW50aG9ueSBHcmVlbiA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX3R5cGVkZWYuYzogUmVtb3ZlIHhmYWlsLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmM6IFJlbW92ZSB4ZmFpbC4KKwkqIHNyYy94ODYvZmZpNjQuYyAoVU5MSUtFTFksIExJS0VMWSk6IERlZmluZS4KKwkoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBDaGVjayBmb3IgYmFkIEFCSS4KKwkqIHNyYy9wcmVwX2NpZi5jIChVTkxJS0VMWSwgTElLRUxZKTogRGVmaW5lLgorCShpbml0aWFsaXplX2FnZ3JlZ2F0ZSk6IENoZWNrIGZvciBiYWQgdHlwZXMuCisKKzIwMTEtMDItMDkgIExhbmRvbiBGdWxsZXIgPGxhbmRvbmZAcGxhdXNpYmxlLmNvb3A+CisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIGJ1aWxkLWlvcy5zaCwgc3JjL2FybS9nZW50cmFtcC5zaCwKKwlzcmMvYXJtL3RyYW1wb2xpbmUuUy4KKwkobm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTKTogQWRkIHNyYy9hcmMvdHJhbXBvbGluZS5TLgorCSogY29uZmlndXJlLmFjIChGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFKTogRGVmaW5lLgorCSogc3JjL2FybS9mZmkuYyAoZmZpX3RyYW1wb2xpbmVfdGFibGUpCisJKGZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGVfcGFnZSwgZmZpX3RyYW1wb2xpbmVfdGFibGVfZW50cnkpCisJKEZGSV9UUkFNUE9MSU5FX0NPREVMT0NfQ09ORklHLCBGRklfVFJBTVBPTElORV9DT05GSUdfUEFHRV9PRkZTRVQpCisJKEZGSV9UUkFNUE9MSU5FX0NPVU5ULCBmZmlfdHJhbXBvbGluZV9sb2NrLCBmZmlfdHJhbXBvbGluZV90YWJsZXMpCisJKGZmaV90cmFtcG9saW5lX3RhYmxlX2FsbG9jLCBmZmlfY2xvc3VyZV9hbGxvYywgZmZpX2Nsb3N1cmVfZnJlZSk6CisJRGVmaW5lIGZvciBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFIGNhc2UgKGlPUykuCisJKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogSGFuZGwgRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSBjYXNlCisJc2VwYXJhdGVseS4KKwkqIHNyYy9hcm0vc3lzdi5TOiBIYW5kbGUgQXBwbGUgaU9TIGhvc3QuCisJKiBzcmMvY2xvc3VyZXMuYzogSGFuZGxlIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUgY2FzZS4KKwkqIGJ1aWxkLWlvcy5zaDogTmV3IGZpbGUuCisJKiBmZmljb25maWcuaC5pbiwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIFJFQURNRTogTWVudGlvbiBBUk0gaU9TLgorCisyMDExLTAyLTA4ICBPcmVuIEhlbGQgIDxvcmVuaGVAaWwuaWJtLmNvbT4KKworCSogc3JjL2RsbWFsbG9jLmMgKF9TVFJVQ1RfTUFMTElORk8pOiBEZWZpbmUgaW4gb3JkZXIgdG8gYXZvaWQKKwlyZWRlZmluaXRpb24gb2YgbWFsbGluZm8gb24gSFAtVVguCisKKzIwMTEtMDItMDggIEdpbm4gQ2hlbiAgPGdpbm4uY2hlbkBvcmFjbGUuY29tPgorCisJKiBzcmMvc3BhcmMvZmZpLmMgKGZmaV9jYWxsKTogTWFrZSBjb21wYXRpYmxlIHdpdGggU29sYXJpcyBTdHVkaW8KKwlhZ2dyZWdhdGUgcmV0dXJuIEFCSS4gIEZsdXNoIGNhY2hlLgorCShmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IEZsdXNoIGNhY2hlLgorCisyMDExLTAyLTExICBBbnRob255IEdyZWVuICA8Z3JlZW5AbW94aWVsb2dpYy5jb20+CisKKwlGcm9tIFRvbSBIb25lcm1hbm4gPHRvbS5ob25lcm1hbm5Ab3JhY2xlLmNvbT46CisJKiBzcmMvcG93ZXJwYy9haXguUyAoZmZpX2NhbGxfQUlYKTogU3VwcG9ydCBmb3IgeGxjIHRvb2xjaGFpbiBvbgorCUFJWC4gIERlY2xhcmUgLmZmaV9wcmVwX2FyZ3MuICBJbnNlcnQgbm9wcyBhZnRlciBicmFuY2gKKwlpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGUgQUlYIGxpbmtlciBjYW4gaW5zZXJ0IFRPQyByZWxvYWQKKwlpbnN0cnVjdGlvbnMuCisJKiBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TOiBEZWNsYXJlIC5mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOLgorCisyMDExLTAyLTA4ICBFZCAgPGVkQGtkdGMubmV0PgorCisJKiBzcmMvcG93ZXJwYy9hc20uaDogRml4IGdyYW1tYXIgbml0IGluIGNvbW1lbnQuCisKKzIwMTEtMDItMDggIFVsaSBMaW5rICA8dWwubWNhbWFmaWFAbGlua2l0dXAuZGU+CisKKwkqIGluY2x1ZGUvZmZpLmguaW4gKEZGSV82NF9CSVRfTUFYKTogRGVmaW5lIGFuZCB1c2UuCisKKzIwMTEtMDItMDkgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgorCisJUFIgbGliZmZpLzQ2NjYxCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYyAobWFpbik6IENhc3Qgdm9pZCAqIHRvCisJdWludHB0cl90IGZpcnN0LgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMgKG1haW4pOiBMaWtld2lzZS4KKworMjAxMS0wMi0wOCAgUmFmYWVsIEF2aWxhIGRlIEVzcGluZG9sYSAgPHJlc3BpbmRvbGFAbW96aWxsYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogRml4IHg4NiB0ZXN0IGZvciBwYyByZWxhdGVkIHJlbG9jcy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAxMS0wMi0wNyAgSm9lbCBTaGVycmlsbCA8am9lbC5zaGVycmlsbEBvYXJjb3JwLmNvbT4KKworCSogbGliZmZpL3NyYy9tNjhrL2ZmaS5jOiBBZGQgUlRFTVMgc3VwcG9ydCBmb3IgY2FjaGUgZmx1c2hpbmcuCisJSGFuZGxlIGNhc2Ugd2hlbiBDUFUgdmFyaWFudCBkb2VzIG5vdCBoYXZlIGxvbmcgZG91YmxlIHN1cHBvcnQuCisJKiBsaWJmZmkvc3JjL202OGsvc3lzdi5TOiBBZGQgc3VwcG9ydCBmb3IgbWM2ODAwMCwgQ29sZGZpcmUsCisJYW5kIGNvcmVzIHdpdGggc29mdCBmbG9hdGluZyBwb2ludC4KKworMjAxMS0wMi0wNyAgSm9lbCBTaGVycmlsbCA8am9lbC5zaGVycmlsbEBvYXJjb3JwLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBBZGQgbWlwcyotKi1ydGVtcyogc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIHNyYy9taXBzL2ZmaXRhcmdldC5oOiBFbnN1cmUgbmVlZGVkIGNvbnN0YW50cyBhcmUgYXZhaWxhYmxlCisJZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90IGhhdmUgc2dpZGVmcy5oLgorCisyMDExLTAxLTI2ICBEYXZlIEtvcm4gIDxkYXZlLmtvcm4uY3lnd2luQGdtYWlsLmNvbT4KKworCVBSIHRhcmdldC80MDEyNQorCSogY29uZmlndXJlLmFjIChBTV9MVExERkxBR1MpOiBBZGQgLWJpbmRpciBvcHRpb24gZm9yIHdpbmRvd3MgRExMcy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAxMC0xMi0xOCAgSWFpbiBTYW5kb2UgIDxpYWluc0BnY2MuZ251Lm9yZz4KKworCVBSIGxpYmZmaS8yOTE1MgorCVBSIGxpYmZmaS80MjM3OAorCSogc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUzogUHJvdmlkZSBEYXJ3aW42NCBpbXBsZW1lbnRhdGlvbiwKKwl1cGRhdGUgY29tbWVudHMuCisJKiBzcmMvcG93ZXJwYy9mZml0YXJnZXQuaCAoUE9XRVJQQ19EQVJXSU42NCk6IE5ldywKKwkoRkZJX1RSQU1QT0xJTkVfU0laRSk6IFVwZGF0ZSBmb3IgRGFyd2luNjQuCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW4uUzogUHJvdmlkZSBEYXJ3aW42NCBpbXBsZW1lbnRhdGlvbiwKKwl1cGRhdGUgY29tbWVudHMuCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmM6IExpa2V3aXNlLgorCisyMDEwLTEyLTA2ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogY29uZmlndXJlLmFjIChsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wKTogVXNlIGRvdWJsZQorCWJhY2tzbGFzaGVzLgorCShsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcCk6IExpa2V3aXNlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDEwLTEyLTAzICBDaHVuZy1MaW4gVGFuZyAgPGNsdGFuZ0Bjb2Rlc291cmNlcnkuY29tPgorCisJKiBzcmMvYXJtL3N5c3YuUyAoZmZpX2Nsb3N1cmVfU1lTVik6IEFkZCBVTldJTkQgdG8gLnBhZCBkaXJlY3RpdmUuCisJKGZmaV9jbG9zdXJlX1ZGUCk6IFNhbWUuCisJKGZmaV9jYWxsX1ZGUCk6IE1vdmUgZG93biB0byBiZWZvcmUgZmZpX2Nsb3N1cmVfVkZQLiBBZGQgJy5mcHUgdmZwJworCWRpcmVjdGl2ZS4KKworMjAxMC0xMi0wMSAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mZml0ZXN0LmggW19fc2dpXSAoUFJJZDY0LCBQUkl1NjQpOiBEZWZpbmUuCisJKFBSSXVQVFIpOiBEZWZpbmUuCisKKzIwMTAtMTEtMjkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHJlZGhhdC5jb20+CisJICAgIFJhaW5lciBPcnRoICA8cm9AQ2VCaVRlYy5VbmktQmllbGVmZWxkLkRFPgorCisJKiBzcmMveDg2L3N5c3YuUyAoRkRFX0VOQ09ESU5HLCBGREVfRU5DT0RFKTogRGVmaW5lLgorCSguZWhfZnJhbWUpOiBVc2UgRkRFX0VOQ09ESU5HLgorCSguTEFTRkRFMSwgLkxBU0ZERTIsIExBU0ZERTMpOiBTaW1wbGlmeSB3aXRoIEZERV9FTkNPREUuCisKKzIwMTAtMTEtMjIgIEphY2VrIENhYmFuIDxqYWNla0Bjb2Rld2VhdmVycy5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQ2hlY2sgZm9yIHN5bWJvbCB1bmRlcnNjb3JlcyBvbiBtaW5ndy13NjQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBzcmMveDg2L3dpbjY0LlM6IENvcnJlY3RseSBhY2Nlc3MgZXh0ZXJuIHN5bWJvbHMgaW4gcmVzcGVjdCB0bworCXVuZGVyc2NvcmVzLgorCisyMDEwLTExLTE1ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwOiBSZW5hbWUgLi4uCisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS5leHA6IC4uLiB0byB0aGlzLgorCSogbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jYWxsLmV4cDogRG9uJ3QgbG9hZCBsaWJmZmktZGcuZXhwLgorCSogbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC9zcGVjaWFsLmV4cDogTGlrZXdpc2UuCisKKzIwMTAtMTAtMjggIENodW5nLUxpbiBUYW5nICA8Y2x0YW5nQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIHNyYy9hcm0vZmZpLmMgKGZmaV9wcmVwX2FyZ3MpOiBBZGQgVkZQIHJlZ2lzdGVyIGFyZ3VtZW50IGhhbmRsaW5nCisJY29kZSwgbmV3IHBhcmFtZXRlciwgYW5kIHJldHVybiB2YWx1ZS4gVXBkYXRlIGNvbW1lbnRzLgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEFkZCBjYXNlIGZvciBWRlAgc3RydWN0IHJldHVybiB2YWx1ZXMuIEFkZAorCWNhbGwgdG8gbGF5b3V0X3ZmcF9hcmdzKCkuCisJKGZmaV9jYWxsX1NZU1YpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKGZmaV9jYWxsX1ZGUCk6IE5ldyBkZWNsYXJhdGlvbi4KKwkoZmZpX2NhbGwpOiBBZGQgVkZQIHN0cnVjdCByZXR1cm4gY29uZGl0aW9ucy4gQ2FsbCBmZmlfY2FsbF9WRlAoKQorCXdoZW4gQUJJIGlzIEZGSV9WRlAuCisJKGZmaV9jbG9zdXJlX1ZGUCk6IE5ldyBkZWNsYXJhdGlvbi4KKwkoZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcik6IEFkZCBuZXcgdmZwX2FyZ3MgcGFyYW1ldGVyLCB1cGRhdGUgY2FsbCB0bworCWZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVigpLgorCShmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YpOiBVcGRhdGUgcGFyYW1ldGVycy4gQWRkIFZGUCBhcmd1bWVudAorCWNhc2UgaGFuZGxpbmcuCisJKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogUGFzcyBmZmlfY2xvc3VyZV9WRlAgdG8gdHJhbXBvbGluZQorCWNvbnN0cnVjdGlvbiB1bmRlciBWRlAgaGFyZC1mbG9hdC4KKwkocmVjX3ZmcF90eXBlX3ApOiBOZXcgZnVuY3Rpb24uCisJKHZmcF90eXBlX3ApOiBTYW1lLgorCShwbGFjZV92ZnBfYXJnKTogU2FtZS4KKwkobGF5b3V0X3ZmcF9hcmdzKTogU2FtZS4KKwkqIHNyYy9hcm0vZmZpdGFyZ2V0LmggKGZmaV9hYmkpOiBBZGQgRkZJX1ZGUC4gRGVmaW5lIEZGSV9ERUZBVUxUX0FCSQorCWJhc2VkIG9uIF9fQVJNX1BDU19WRlAuCisJKEZGSV9FWFRSQV9DSUZfRklFTERTKTogRGVmaW5lIGZvciBhZGRpbmcgVkZQIGhhcmQtZmxvYXQgc3BlY2lmaWMKKwlmaWVsZHMuCisJKEZGSV9UWVBFX1NUUlVDVF9WRlBfRkxPQVQpOiBEZWZpbmUgaW50ZXJuYWxseSB1c2VkIHR5cGUgY29kZS4KKwkoRkZJX1RZUEVfU1RSVUNUX1ZGUF9ET1VCTEUpOiBTYW1lLgorCSogc3JjL2FybS9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBDaGFuZ2UgY2FsbCBvZiBmZmlfcHJlcF9hcmdzKCkgdG8KKwlkaXJlY3QgY2FsbC4gTW92ZSBmdW5jdGlvbiBwb2ludGVyIGxvYWQgdXB3YXJkcy4KKwkoZmZpX2NhbGxfVkZQKTogTmV3IGZ1bmN0aW9uLgorCShmZmlfY2xvc3VyZV9WRlApOiBTYW1lLgorCisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHAgKGNoZWNrLWZsYWdzKTogTmV3IGZ1bmN0aW9uLgorCShkZy1za2lwLWlmKTogTmV3IGZ1bmN0aW9uLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGVfdmEuYzogU2tpcCBpZiB0YXJnZXQgaXMgYXJtKi0qLSoKKwlhbmQgY29tcGlsZXIgb3B0aW9ucyBpbmNsdWRlIC1tZmxvYXQtYWJpPWhhcmQuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYzogU2FtZS4KKworMjAxMC0xMC0wMSAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwlQUiBsaWJmZmkvNDU2NzcKKwkqIHNyYy94ODYvZmZpNjQuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBFbnN1cmUgY2lmLT5ieXRlcyBpcworCWEgbXVsdGlwbGUgb2YgOC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9tYW55Mi5jOiBOZXcgdGVzdC4KKworMjAxMC0wOC0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgorCisJKiBzcmMvY2xvc3VyZXMuYyAob3Blbl90ZW1wX2V4ZWNfZmlsZV9tbnQpOiBDaGVjayBpZiBnZXRtbnRlbnRfcgorCXJldHVybnMgTlVMTC4KKworMjAxMC0wOC0wOSAgQW5kcmVhcyBUb2JsZXIgIDxhbmRyZWFzdEBmZ3puZXQuY2g+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIHRhcmdldCBwb3dlcnBjNjQtKi1mcmVlYnNkKi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jOiBQYXNzCisJLW1sb25nLWRvdWJsZS0xMjggb25seSB0byBsaW51eCB0YXJnZXRzLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0Mi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jOiBMaWtld2lzZS4KKworMjAxMC0wOC0wNSAgRGFuIFdpdHRlICA8ZHdpdHRlQG1vemlsbGEuY29tPgorCisgICAgICAgICogTWFrZWZpbGUuYW06IFBhc3MgRkZJX0RFQlVHIGRlZmluZSB0byBtc3ZjYy5zaCBmb3IgbGlua2luZyB0byB0aGUKKyAgICAgICAgZGVidWcgQ1JUIHdoZW4gLS1lbmFibGUtZGVidWcgaXMgZ2l2ZW4uCisgICAgICAgICogY29uZmlndXJlLmFjOiBEZWZpbmUgaXQuCisgICAgICAgICogbXN2Y2Muc2g6IFRyYW5zbGF0ZSAtZyBhbmQgLURGRklfREVCVUcgYXBwcm9wcmlhdGVseS4KKworMjAxMC0wOC0wNCAgRGFuIFdpdHRlICA8ZHdpdHRlQG1vemlsbGEuY29tPgorCisJKiBzcmMveDg2L2ZmaXRhcmdldC5oOiBBZGQgWDg2X0FOWSBkZWZpbmUgZm9yIGFsbCB4ODYveDg2XzY0CisJcGxhdGZvcm1zLgorCSogc3JjL3g4Ni9mZmkuYzogUmVtb3ZlIHJlZHVuZGFudCBpZmRlZiBjaGVja3MuCisJKiBzcmMvcHJlcF9jaWYuYzogUHVzaCBzdGFjayBzcGFjZSBjb21wdXRhdGlvbiBpbnRvIHNyYy94ODYvZmZpLmMKKwlmb3IgWDg2X0FOWSBzbyByZXR1cm4gdmFsdWUgc3BhY2UgZG9lc24ndCBnZXQgYWRkZWQgdHdpY2UuCisKKzIwMTAtMDgtMDMgIE5laWwgUmFzaGJyb29rZSA8bmVpbEBwYXJrd2F5Y2MuY28udWs+CisKKwkqIG1zdmNjLnNoOiBEb24ndCBwYXNzIC1zYWZlc2VoIHRvIG1sNjQgYmVjYXVzZSBiZWhhdmlvciBpcyBidWdneS4KKworMjAxMC0wNy0yMiAgRGFuIFdpdHRlICA8ZHdpdHRlQG1vemlsbGEuY29tPgorCisJKiBzcmMvKi9mZml0YXJnZXQuaDogTWFrZSBGRklfTEFTVF9BQkkgb25lIHBhc3QgdGhlIGxhc3QgdmFsaWQgQUJJLgorCSogc3JjL3ByZXBfY2lmLmM6IEZpeCBBQkkgYXNzZXJ0aW9uLgorICAgICAgICAqIHNyYy9jcmlzL2ZmaS5jOiBEaXR0by4KKworMjAxMC0wNy0xMCAgRXZhbiBQaG9lbml4ICA8ZXZhbkBmYWxsaW5nc25vdy5uZXQ+CisKKwkqIHNyYy9jbG9zdXJlcy5jIChzZWxpbnV4X2VuYWJsZWRfY2hlY2spOiBGaXggc3RybmNtcCB1c2FnZSBidWcuCisKKzIwMTAtMDctMDcgIERhbiBIb3LDoWsgPGRhbkBkYW5ueS5jej4KKworCSogaW5jbHVkZS9mZmkuaC5pbjogUHJvdGVjdCAjZGVmaW5lIHdpdGggI2lmbmRlZi4KKwkqIHNyYy9wb3dlcnBjL2ZmaXRhcmdldC5oOiBEaXR0by4KKwkqIHNyYy9zMzkwL2ZmaXRhcmdldC5oOiBEaXR0by4KKwkqIHNyYy9zcGFyYy9mZml0YXJnZXQuaDogRGl0dG8uCisKKzIwMTAtMDctMDcgICBOZWlsIFJvYmVydHMgPG5laWxAbGludXguaW50ZWwuY29tPgorCisJKiBzcmMveDg2L3N5c3YuUyAoZmZpX2NhbGxfU1lTVik6IEFsaWduIHRoZSBzdGFjayBwb2ludGVyIHRvCisJMTYtYnl0ZXMuCisKKzIwMTAtMDctMDIgIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQU1fTUFLRUZMQUdTKTogUGFzcyBhbHNvIG1hbmRpciB0byBzdWJtYWtlcy4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KKworMjAxMC0wNS0xOSAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIGNvbmZpZ3VyZS5hYyAobGliZmZpX2N2X2FzX3g4Nl9wY3JlbCk6IENoZWNrIGZvciBpbGxlZ2FsIGluIGFzCisJb3V0cHV0LCB0b28uCisJKGxpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3ApOiBDaGVjayBmb3IgLmFzY2lpLgorCShsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcCk6IENoZWNrIGZvciAuc3RyaW5nLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogZmZpY29uZmlnLmguaW46IFJlZ2VuZXJhdGUuCisJKiBzcmMveDg2L3N5c3YuUyAoLmVoX2ZyYW1lKTogVXNlIC5hc2NpaSwgLnN0cmluZyBvciBlcnJvci4KKworMjAxMC0wNS0xMSAgRGFuIFdpdHRlICA8ZHdpdHRlQG1vemlsbGEuY29tPgorCisJKiBkb2MvbGliZmZpLnRleDogRG9jdW1lbnQgcHJldmlvdXMgY2hhbmdlLgorCisyMDEwLTA1LTExICBNYWtvdG8gS2F0byA8bV9rYXRvQGdhMi5zby1uZXQubmUuanA+CisKKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9jYWxsKTogRG9uJ3QgY29weSBzdHJ1Y3RzIHBhc3NlZCBieSB2YWx1ZS4KKworMjAxMC0wNS0wNSAgTWljaGFlbCBLb2hsZXIgPG1pY2hhZWxrb2hsZXJAbGl2ZS5jb20+CisKKwkqIHNyYy9kbG1hbGxvYy5jIChkbGZyZWUpOiBGaXggc3BlbGxpbmcuCisJKiBzcmMvaWE2NC9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBEaXR0by4KKwkqIGNvbmZpZ3VyZS5hYzogRGl0dG8uCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMTAtMDQtMTMgIERhbiBXaXR0ZSAgPGR3aXR0ZUBtb3ppbGxhLmNvbT4KKworCSogbXN2Y2Muc2g6IEJ1aWxkIHdpdGggLVczIGluc3RlYWQgb2YgLVdhbGwuCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmM6IFJlbW92ZSBidWlsZCB3YXJuaW5ncy4KKwkqIHNyYy94ODYvZmZpLmM6IERpdHRvLgorCSogc3JjL3g4Ni9mZml0YXJnZXQuaDogRGl0dG8uCisKKzIwMTAtMDQtMTIgIERhbiBXaXR0ZSAgPGR3aXR0ZUBtb3ppbGxhLmNvbT4KKwkgICAgV2FsdGVyIE1laW5sIDx3dW5vQGxzdncuZGU+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIE9TLzIgc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIHNyYy9jbG9zdXJlcy5jOiBEaXR0by4KKwkqIHNyYy9kbG1hbGxvYy5jOiBEaXR0by4KKwkqIHNyYy94ODYvd2luMzIuUzogRGl0dG8uCisKKzIwMTAtMDQtMDcgIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZXJyX2JhZF9hYmkuYzogUmVtb3ZlIHVudXNlZCBhcmdzIHZhcmlhYmxlLgorCisyMDEwLTA0LTAyICBSYWxmIFdpbGRlbmh1ZXMgIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgorCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogbWFuL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDEwLTAzLTMwICBEYW4gV2l0dGUgIDxkd2l0dGVAbW96aWxsYS5jb20+CisKKwkqIG1zdmNjLnNoOiBEaXNhYmxlIGJ1aWxkIHdhcm5pbmdzLgorCSogUkVBRE1FICh0ZXN0ZWQpOiBDbGFyaWZ5IHdpbmRvd3MgYnVpbGQgcHJvY2VkdXJlLgorCisyMDEwLTAzLTE1ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogY29uZmlndXJlLmFjIChsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGUpOiBOZXcgdGVzdC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGZmaWNvbmZpZy5oLmluOiBSZWdlbmVyYXRlLgorCSogbGliZmZpL3NyYy94ODYvdW5peDY0LlMgKC5laF9mcmFtZSkKKwlbSEFWRV9BU19YODZfNjRfVU5XSU5EX1NFQ1RJT05fVFlQRV06IFVzZSBAdW53aW5kIHNlY3Rpb24gdHlwZS4KKworMjAxMC0wMy0xNCAgTWF0dGhpYXMgS2xvc2UgIDxkb2tvQHVidW50dS5jb20+CisKKwkqIHNyYy94ODYvZmZpNjQuYzogRml4IHR5cG8gaW4gY29tbWVudC4KKwkqIHNyYy94ODYvZmZpLmM6IFVzZSAvKiAuLi4gKi8gY29tbWVudCBzdHlsZS4KKworMjAxMC0wMi0yNCAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIGRvYy9saWJmZmkudGV4aSAoVGhlIENsb3N1cmUgQVBJKTogRml4IHR5cG8uCisJKiBkb2MvbGliZmZpLmluZm86IFJlbW92ZS4KKworMjAxMC0wMi0xNSAgTWF0dGhpYXMgS2xvc2UgIDxkb2tvQHVidW50dS5jb20+CisKKwkqIHNyYy9hcm0vc3lzdi5TIChfX0FSTV9BUkNIX18pOiBEZWZpbmUgZm9yIHByb2Nlc3NvcgorCV9fQVJNX0FSQ0hfN0VNX18uCisKKzIwMTAtMDEtMTUgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBSRUFETUU6IEFkZCBub3RlcyBvbiBidWlsZGluZyB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorCisyMDEwLTAxLTE1ICBEYW5pZWwgV2l0dGUgIDxkd2l0dGVAbW96aWxsYS5jb20+CisKKwkqIG1zdmNjLnNoOiBOZXcgZmlsZS4KKworCSogc3JjL3g4Ni93aW4zMi5TOiBQb3J0IGFzc2VtYmx5IHJvdXRpbmVzIHRvIE1TVkMgYW5kICNpZmRlZi4KKwkqIHNyYy94ODYvZmZpLmM6IFR3ZWFrIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFuZCByZW1vdmUgZXhjZXNzCisJcGFyZW5zLgorCSogaW5jbHVkZS9mZmkuaC5pbjogQWRkIF9fZGVjbHNwZWMoYWxpZ24oOCkpIHRvIHR5cGVkZWYgc3RydWN0CisJZmZpX2Nsb3N1cmUuCisKKwkqIHNyYy94ODYvZmZpLmM6IE1lcmdlIGZmaV9jYWxsX1NZU1YgYW5kIGZmaV9jYWxsX1NURENBTEwgaW50byBuZXcKKwlmdW5jdGlvbiBmZmlfY2FsbF93aW4zMiBvbiBYODZfV0lOMzIuCisJKiBzcmMveDg2L3dpbjMyLlMgKGZmaV9jYWxsX1NZU1YpOiBSZW5hbWUgdG8gZmZpX2NhbGxfd2luMzIuCisJKGZmaV9jYWxsX1NURENBTEwpOiBSZW1vdmUuCisKKwkqIHNyYy9wcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBNb3ZlIHN0YWNrIHNwYWNlIGFsbG9jYXRpb24gY29kZQorCXRvIGZmaV9wcmVwX2NpZl9tYWNoZGVwIGZvciB4ODYuCisJKiBzcmMveDg2L2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IFRvIGhlcmUuCisKKzIwMTAtMDEtMTUgIE9saXZlciBLaWRkbGUgIDxva2lkZGxlQHlhaG9vLmNvLnVrPgorCisJKiBzcmMveDg2L2ZmaXRhcmdldC5oIChmZmlfYWJpKTogQ2hlY2sgZm9yIF9faTM4NiBhbmQgX19hbWQ2NCBmb3IKKwlTdW4gU3R1ZGlvIGNvbXBpbGVyIGNvbXBhdGliaWxpdHkuCisKKzIwMTAtMDEtMTIgIENvbnJhZCBJcndpbiA8Y29ucmFkLmlyd2luQGdtYWlsLmNvbT4KKworCSogZG9jL2xpYmZmaS50ZXhpOiBBZGQgY2xvc3VyZSBleGFtcGxlLgorCisyMDEwLTAxLTA3ICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCVBSIGxpYmZmaS80MDcwMQorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaCBbX19hbHBoYV9fICYmIF9fb3NmX19dIChQUklkTEwsCisJUFJJdUxMLCBQUklkNjQsIFBSSXU2NCwgUFJJdVBUUik6IERlZmluZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDY0LmM6IEFkZCAtV25vLWZvcm1hdCBvbgorCWFscGhhKi1kZWMtb3NmKi4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDY0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2xsMS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9tZWRpdW0yLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL2ZmaXRlc3RjeHguaCAoYWxsb2NhdGVfbW1hcCk6IENhc3QKKwlNQVBfRkFJTEVEIHRvIGNoYXIgKi4KKworMjAxMC0wMS0wNiAgUmFpbmVyIE9ydGggIDxyb0BDZUJpVGVjLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIHNyYy9taXBzL24zMi5TOiBVc2UgLmFiaWNhbGxzIGFuZCAuZWhfZnJhbWUgd2l0aCBfX0dOVUNfXy4KKworMjAwOS0xMi0zMSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIFJFQURNRTogVXBkYXRlIGZvciBsaWJmZmkgMy4wLjkuCisKKzIwMDktMTItMjcgIE1hdHRoaWFzIEtsb3NlICA8ZG9rb0B1YnVudHUuY29tPgorCisJKiBjb25maWd1cmUuYWMgKEhBVkVfTE9OR19ET1VCTEUpOiBEZWZpbmUgZm9yIG1pcHMgd2hlbgorCWFwcHJvcHJpYXRlLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDA5LTEyLTI2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmM6IE1hcmsgYXMgeGZhaWwgZm9yCisJYXZyMzIqLSotKi4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmM6IERpdHRvLgorCisyMDA5LTEyLTI2ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXoub3JnPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oOiBDb25kaXRpb25hbGx5IGluY2x1ZGUgc3RkaW50LmgKKwlhbmQgaW50dHlwZXMuaC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0LmNjOiBEaXR0by4KKworMjAwOS0xMi0yNiAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6Lm9yZz4KKworCSogY29uZmlndXJlLmFjOiBBZGQgYW1kNjQtKi1vcGVuYnNkKi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cCAobGliZmZpX3RhcmdldF9jb21waWxlKTogTGluaworCW9wZW5ic2QgcHJvZ3JhbXMgd2l0aCAtbHB0aHJlYWQuCisKKzIwMDktMTItMjYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlci5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlcl9zdGFjay5jOiBSZW1vdmUgeGZhaWwgZm9yCisJbWlwcyotKi0qIGFuZCBhcm0qLSotKi4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9tZWRpdW0uYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmM6IFJlbW92ZSB4ZmFpbCBmb3IgYXJtKi0qLSouCisKKzIwMDktMTItMzEgIEtheSBUaWV0eiAgPGt0aWV0ejcwQGdvb2dsZW1haWwuY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oLAorCXRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC9mZml0ZXN0Y3h4LmggKFBSSWRMTCwgUFJ1TEwpOiBGaXgKKwlkZWZpbml0aW9ucy4KKworMjAwOS0xMi0zMSAgQ2FybG8gQnJhbWluaSAgPGNhcmxvLmJyYW1peEBsaWJlcm8uaXQ+CisKKwkqIGNvbmZpZ3VyZS5hYyAoQU1fTFRMREZMQUdTKTogRGVmaW5lIGZvciB3aW5kb3dzIGhvc3RzLgorCSogTWFrZWZpbGUuYW0gKGxpYmZmaV9sYV9MREZMQUdTKTogQWRkIEFNX0xUTERGTEFHUy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisyMDA5LTEyLTMxICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKwkgICAgQmxha2UgQ2hhZmZpbi4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2h1Z2Vfc3RydWN0LmM6IE5ldyB0ZXN0IGNhc2UgZnJvbSBCbGFrZQorCUNoYWZmaW4gQCBBcHBsZS4KKworMjAwOS0xMi0yOCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBnbnUub3JnPgorCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgKGZmaV9wcmVwX2FyZ3MpOiBDb3B5IGFiaSBhbmQgbmFyZ3MgdG8KKwlsb2NhbCB2YXJpYWJsZXMuCisJKGFpeF9hZGp1c3RfYWdncmVnYXRlX3NpemVzKTogTmV3IGZ1bmN0aW9uLgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IENhbGwgaXQuCisKKzIwMDktMTItMjYgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogRGVmaW5lIEZGSV9NTUFQX0VYRUNfV1JJVCBmb3IgdGhlIGdpdmVuIHRhcmdldHMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBmZmljb25maWcuaC5pbjogTGlrZXdpc2UuCisJKiBzcmMvY2xvc3VyZXMuYzogUmVtb3ZlIHRoZSBGRklfTU1BUF9FWEVDX1dSSVQgZGVmaW5pdGlvbiBmb3IKKwlTb2xhcmlzL3g4Ni4KKworMjAwOS0xMi0yNiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAbGludXgtbTY4ay5vcmc+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9hcmdzX1NZU1YpOiBBZHZhbmNlIGludGFyZ19jb3VudAorCXdoZW4gYSBmbG9hdCBhcmd1bWVudHMgaXMgcGFzc2VkIGluIG1lbW9yeS4KKwkoZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YpOiBNYXJrIGdlbmVyYWwgcmVnaXN0ZXJzIGFzIHVzZWQgdXAgd2hlbgorCWEgNjRiaXQgb3Igc29mdC1mbG9hdCBsb25nIGRvdWJsZSBhcmd1bWVudCBpcyBwYXNzZWQgaW4gbWVtb3J5LgorCisyMDA5LTEyLTI1ICBNYXR0aGlhcyBLbG9zZSAgPGRva29AdWJ1bnR1LmNvbT4KKworCSogbWFuL2ZmaV9jYWxsLjM6IEZpeCAjaW5jbHVkZSBpbiBleGFtcGxlcy4KKwkqIGRvYy9saWJmZmkudGV4aTogQWRkIGRpcmNhdGVnb3J5LgorCisyMDA5LTEyLTI1ICBGcmFuayBFdmVyZGlqIDxmLnAueC5ldmVyZGlqQHR1ZGVsZnQubmw+CisKKwkqIGluY2x1ZGUvZmZpLmguaW46IFBsYWNlZCAnX19HTlVDX18nIGlmZGVmIGFyb3VuZAorCSdfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSknIGluIGZmaV9jbG9zdXJlLCBmaXhlcyBjb21waWxlIGZvcgorCUlSSVggTUlQU1BybyBjOTkuCisJKiBpbmNsdWRlL2ZmaV9jb21tb24uaDogQWRkZWQgJ19fc2dpJyBkZWZpbmUgdG8gbm9uCisJJ19fYXR0cmlidXRlX18oKF9fbW9kZV9fKCkpKScgaW50ZWdlciB0eXBlZGVmcy4KKwkqIHNyYy9taXBzL2ZmaS5jIChmZmlfY2FsbCwgZmZpX2Nsb3N1cmVfbWlwc19pbm5lcl9PMzIsCisJZmZpX2Nsb3N1cmVfbWlwc19pbm5lcl9OMzIpOiBBZGRlZCAnZGVmaW5lZChfTUlQU0VCKScgdG8gQkUgY2hlY2suCisJKGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTzMyLCBmZmlfY2xvc3VyZV9taXBzX2lubmVyX04zMik6IEFkZGVkCisJRkZJX0xPTkdET1VCTEUgc3VwcG9ydCBhbmQgYWxpZ25tZW50KE4zMiBvbmx5KS4KKwkqIHNyYy9taXBzL2ZmaXRhcmdldC5oOiBDb3JyZWN0ZWQgJyNpbmNsdWRlIDxzZ2lkZWZzLmg+JyBmb3IgSVJJWCBhbmQKKwlmaXhlZCBub24gJ19fYXR0cmlidXRlX18oKF9fbW9kZV9fKCkpKScgaW50ZWdlciB0eXBlZGVmcy4KKwkqIHNyYy9taXBzL24zMi5TOiBQdXQgJyNpZmRlZiBsaW51eCcgYXJvdW5kICcuYWJpY2FsbHMnIGFuZCAnLmVoX2ZyYW1lJworCXNpbmNlIHRoZXkgYXJlIExpbnV4L0dOVSBBc3NlbWJsZXIgc3BlY2lmaWMuCisKKzIwMDktMTItMjUgIEJyYWRsZXkgU21pdGggIDxicmFkQGJyYWQtc21pdGguY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYywgTWFrZWZpbGUuYW0sIHNyYy9hdnIzMi9mZmkuYywKKwlzcmMvYXZyMzIvZmZpdGFyZ2V0LmgsCisJc3JjL2F2cjMyL3N5c3YuUzogQWRkIEFWUjMyIHBvcnQuCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisyMDA5LTEyLTIxICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXoub3JnPgorCisJKiBjb25maWd1cmUuYWM6IE1ha2UgaT84NiBidWlsZCBvbiBGcmVlQlNEIGFuZCBPcGVuQlNELgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA5LTEyLTE1ICBKb2huIERhdmlkIEFuZ2xpbiAgPGRhdmUuYW5nbGluQG5yYy1jbnJjLmdjLmNhPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oOiBEZWZpbmUgUFJJdVBUUiBvbiBQQSBIUC1VWC4KKworMjAwOS0xMi0xMyAgSm9obiBEYXZpZCBBbmdsaW4gIDxkYXZlLmFuZ2xpbkBucmMtY25yYy5nYy5jYT4KKworCSogc3JjL3BhL2ZmaS5jIChmZmlfY2xvc3VyZV9pbm5lcl9wYTMyKTogSGFuZGxlIEZGSV9UWVBFX0xPTkdET1VCTEUKKwl0eXBlIG9uIEhQLVVYLgorCisyMDA5LTEyLTExICBFcmljIEJvdGNhem91ICA8ZWJvdGNhem91QGFkYWNvcmUuY29tPgorCisJKiBzcmMvc3BhcmMvZmZpLmMgKGZmaV9jbG9zdXJlX3NwYXJjX2lubmVyX3Y5KTogUHJvcGVybHkgYWxpZ24gJ2xvbmcKKwlkb3VibGUnIGFyZ3VtZW50cy4KKworMjAwOS0xMi0xMSAgRXJpYyBCb3RjYXpvdSAgPGVib3RjYXpvdUBhZGFjb3JlLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaDogRGVmaW5lIFBSSXVQVFIgb24gU29sYXJpcyA8IDEwLgorCisyMDA5LTEyLTEwICBSYWluZXIgT3J0aCAgPHJvQENlQmlUZWMuVW5pLUJpZWxlZmVsZC5ERT4KKworCVBSIGxpYmZmaS80MDcwMAorCSogc3JjL2Nsb3N1cmVzLmMgW1g4Nl82NCAmJiBfX3N1bl9fICYmIF9fc3ZyNF9fXQorCShGRklfTU1BUF9FWEVDX1dSSVQpOiBEZWZpbmUuCisKKzIwMDktMTItMDggIERhdmlkIERhbmV5ICA8ZGRhbmV5QGNhdml1bW5ldHdvcmtzLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bS5jOiBSZW1vdmUgeGZhaWwgZm9yIG1pcHMqLSotKgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0Mi5jOiBTYW1lLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X2xhcmdlLmM6IFNhbWUuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQuYzogU2FtZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYzogU2FtZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9tZWRpdW0yLmM6IFNhbWUuCisKKzIwMDktMTItMDcgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AZ251Lm9yZz4KKworCSogc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUuUyAobGliZmZpX2Nsb3N1cmVfQVNNKTogRml4IHRhYmxlanVtcAorCXR5cG8uCisKKzIwMDktMTItMDUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AZ251Lm9yZz4KKworCSogc3JjL3Bvd2VycGMvYWl4LlM6IFVwZGF0ZSBBSVgzMiBjb2RlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBBSVg2NAorCWNvZGUuCisJKiBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TOiBTYW1lLgorCisyMDA5LTEyLTA1ICBSYWxmIFdpbGRlbmh1ZXMgIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgorCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBtYW4vTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKzIwMDktMTItMDQgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AZ251Lm9yZz4KKworCSogc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUuUzogUmVvcmdhbml6ZSA2NC1iaXQgY29kZSB0byBtYXRjaAorCWxpbnV4NjRfY2xvc3VyZS5TLgorCisyMDA5LTEyLTA0ICBVcm9zIEJpemphayAgPHViaXpqYWtAZ21haWwuY29tPgorCisJUFIgbGliZmZpLzQxOTA4CisJKiBzcmMveDg2L2ZmaTY0LmMgKGNsYXNzaWZ5X2FyZ3VtZW50KTogVXBkYXRlIGZyb20KKwlnY2MvY29uZmlnL2kzODYvaTM4Ni5jLgorCShmZmlfY2xvc3VyZV91bml4NjRfaW5uZXIpOiBEbyBub3QgdXNlIHRoZSBhZGRyZXNzIG9mIHR3byBjb25zZWN1dGl2ZQorCVNTRSByZWdpc3RlcnMgZGlyZWN0bHkuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RibHNfc3RydWN0LmMgKG1haW4pOiBSZW1vdmUgeGZhaWwKKwlmb3IgeDg2XzY0IGxpbnV4IHRhcmdldHMuCisKKzIwMDktMTItMDQgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AZ251Lm9yZz4KKworCSogc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIChmZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOKTogSW5jcmVtZW50CisJcGZyIGZvciBsb25nIGRvdWJsZSBzcGxpdCBiZXR3ZWVuIGZwcjEzIGFuZCBzdGFjay4KKworMjAwOS0xMi0wMyAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBnbnUub3JnPgorCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgKGZmaV9wcmVwX2FyZ3MpOiBJbmNyZW1lbnQgbmV4dF9hcmcgYW5kCisJZnBhcmdfY291bnQgdHdpY2UgZm9yIGxvbmcgZG91YmxlLgorCisyMDA5LTEyLTAzICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQGdudS5vcmc+CisKKwlQUiBsaWJmZmkvNDIyNDMKKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyAoZmZpX3ByZXBfYXJncyk6IFJlbW92ZSBleHRyYSBwYXJlbnRoZXNlcy4KKworMjAwOS0xMi0wMyAgVXJvcyBCaXpqYWsgIDx1Yml6amFrQGdtYWlsLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmMgKG1haW4pOiBGaXggZm9ybWF0IHN0cmluZy4KKwlSZW1vdmUgeGZhaWxzIGZvciB4ODYgbGludXggdGFyZ2V0cy4KKworMjAwOS0xMi0wMiAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBnbnUub3JnPgorCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgKGZmaV9wcmVwX2FyZ3MpOiBGaXggdHlwbyBpbiBJTlQ2NAorCWNhc2UuCisKKzIwMDktMTItMDEgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AZ251Lm9yZz4KKworCSogc3JjL3Bvd2VycGMvYWl4LlMgKGZmaV9jYWxsX0FJWCk6IENvbnZlcnQgdG8gbW9yZSBzdGFuZGFyZAorCXJlZ2lzdGVyIHVzYWdlLiAgQ2FsbCBmZmlfcHJlcF9hcmdzIGRpcmVjdGx5LiAgQWRkIGxvbmcgZG91YmxlCisJcmV0dXJuIHZhbHVlIHN1cHBvcnQuCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgKGZmaV9wcmVwX2FyZ3MpOiBEb3VibGUgYXJnIGluY3JlbWVudAorCWFwcGxpZXMgdG8gRkZJX1RZUEVfRE9VQkxFLiAgQ29ycmVjdCBmcHJfYmFzZSBpbmNyZW1lbnQgdHlwby4KKwlTZXBhcmF0ZSBGRklfVFlQRV9TSU5UMzIgYW5kIEZGSV9UWVBFX1VJTlQzMiBjYXNlcy4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBPbmx5IDE2IGJ5dGUgc3RhY2sgYWxpZ25tZW50IGluIDY0IGJpdAorCW1vZGUuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4pOiBSZW1vdmUgbmYgYW5kIG5nIGNvdW50ZXJzLiAgTW92ZSB0ZW1wCisJaW50byBjYXNlLgorCSogc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUuUzogTWFpbnRhaW4gMTYgYnl0ZSBzdGFjayBhbGlnbm1lbnQuCisJQWxsb2NhdGUgcmVzdWx0IGFyZWEgYmV0d2VlbiBwYXJhbXMgYW5kIEZQUnMuCisKKzIwMDktMTEtMzAgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AZ251Lm9yZz4KKworCVBSIHRhcmdldC8zNTQ4NAorCSogc3JjL3Bvd2VycGMvZmZpdGFyZ2V0LmggKFBPV0VSUEM2NCk6IERlZmluZSBmb3IgUFBDNjQgTGludXggYW5kCisJQUlYNjQuCisJKiBzcmMvcG93ZXJwYy9haXguUzogSW1wbGVtZW50IEFJWDY0IHZlcnNpb24uCisJKiBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TOiBJbXBsZW1lbnQgQUlYNjQgdmVyc2lvbi4KKwkoZmZpX2Nsb3N1cmVfQVNNKTogVXNlIGV4dHNiLCBsaGEgYW5kIGRpc3BsYW1lbnQgYWRkcmVzc2VzLgorCSogc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIChmZmlfcHJlcF9hcmdzKTogSW1wbGVtZW50IEFJWDY0CisJc3VwcG9ydC4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBTYW1lLgorCShmZmlfY2FsbCk6IFNhbWUuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4pOiBTYW1lLgorCisyMDA5LTExLTAyICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXoub3JnPgorCisJUFIgbGliZmZpLzQxOTA4CisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvdGVzdGNsb3N1cmUuYzogTmV3IHRlc3QuCisKKzIwMDktMDktMjggIEthaSBUaWV0eiAgPGthaS50aWV0ekBvbmV2aXNpb24uY29tPgorCisJKiBzcmMveDg2L3dpbjY0LlMgKF9mZmlfY2FsbF93aW42NCBzdGFjayk6IFJlbW92ZSBmb3IgZ251CisJYXNzZW1ibHkgdmVyc2lvbiB1c2Ugb2YgX19fY2hrc3RrLgorCisyMDA5LTA5LTIzICBNYXR0aGlhcyBLbG9zZSAgPGRva29AdWJ1bnR1LmNvbT4KKworCVBSIGxpYmZmaS80MDI0MiwgUFIgbGliZmZpLzQxNDQzCisJKiBzcmMvYXJtL3N5c3YuUyAoX19BUk1fQVJDSF9fKTogRGVmaW5lIGZvciBwcm9jZXNzb3JzCisJX19BUk1fQVJDSF82VDJfXywgX19BUk1fQVJDSF82TV9fLCBfX0FSTV9BUkNIXzdfXywKKwlfX0FSTV9BUkNIXzdBX18sIF9fQVJNX0FSQ0hfN1JfXywgX19BUk1fQVJDSF83TV9fLgorCUNoYW5nZSB0aGUgY29uZGl0aW9uYWxzIHRvIF9fU09GVEZQX18gfHwgX19BUk1fRUFCSV9fCisJZm9yIC1tZmxvYXQtYWJpPXNvZnRmcCB0byB3b3JrLgorCisyMDA5LTA5LTE3ICBMb3JlbiBKLiBSaXR0bGUgIDxsanJpdHRsZUBhY20ub3JnPgorCisJUFIgdGVzdHN1aXRlLzMyODQzIChzdHJpa2VzIGFnYWluKQorCSogc3JjL3g4Ni9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBBZGQgWDg2X0ZSRUVCU0QgdG8KKwllbmFibGUgcHJvcGVyIGV4dGVuc2lvbiBvbiBjaGFyIGFuZCBzaG9ydC4KKworMjAwOS0wOS0xNSAgRGF2aWQgRGFuZXkgIDxkZGFuZXlAY2F2aXVtbmV0d29ya3MuY29tPgorCisJKiBzcmMvamF2YV9yYXdfYXBpLmMgKGZmaV9qYXZhX3Jhd190b19ydmFsdWUpOiBSZW1vdmUgc3BlY2lhbAorCWhhbmRsaW5nIGZvciBGRklfVFlQRV9QT0lOVEVSLgorCSogc3JjL21pcHMvZmZpdGFyZ2V0LmggKEZGSV9UWVBFX1NUUlVDVF9EX1NPRlQsCisJRkZJX1RZUEVfU1RSVUNUX0ZfU09GVCwgRkZJX1RZUEVfU1RSVUNUX0REX1NPRlQsCisJRkZJX1RZUEVfU1RSVUNUX0ZGX1NPRlQsIEZGSV9UWVBFX1NUUlVDVF9GRF9TT0ZULAorCUZGSV9UWVBFX1NUUlVDVF9ERl9TT0ZULCBGRklfVFlQRV9TVFJVQ1RfU09GVCk6IE5ldyBkZWZpbmVzLgorCShGRklfTjMyX1NPRlRfRkxPQVQsIEZGSV9ONjRfU09GVF9GTE9BVCk6IE5ldyBmZmlfYWJpIGVudW1lcmF0aW9ucy4KKwkoZW51bSBmZmlfYWJpKTogU2V0IEZGSV9ERUZBVUxUX0FCSSBmb3Igc29mdC1mbG9hdC4KKwkqIHNyYy9taXBzL24zMi5TIChmZmlfY2FsbF9OMzIpOiBBZGQgaGFuZGxpbmcgZm9yIHNvZnQtZmxvYXQKKwlzdHJ1Y3R1cmUgYW5kIHBvaW50ZXIgcmV0dXJucy4KKwkoZmZpX2Nsb3N1cmVfTjMyKTogQWRkIGhhbmRsaW5nIGZvciBwb2ludGVyIHJldHVybnMuCisJKiBzcmMvbWlwcy9mZmkuYyAoZmZpX3ByZXBfYXJncywgY2FsY19uMzJfc3RydWN0X2ZsYWdzLAorCWNhbGNfbjMyX3JldHVybl9zdHJ1Y3RfZmxhZ3MpOiBIYW5kbGUgc29mdC1mbG9hdC4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiAgSGFuZGxlIHNvZnQtZmxvYXQsIGZpeCBwb2ludGVyIGhhbmRsaW5nLgorCShmZmlfY2FsbF9OMzIpOiBEZWNsYXJlIHByb3BlciBhcmd1bWVudCB0eXBlcy4KKwkoZmZpX2NhbGwsIGNvcHlfc3RydWN0X04zMiwgZmZpX2Nsb3N1cmVfbWlwc19pbm5lcl9OMzIpOiBIYW5kbGUKKwlzb2Z0LWZsb2F0LgorCisyMDA5LTA4LTI0ICBSYWxmIFdpbGRlbmh1ZXMgIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgorCisJKiBjb25maWd1cmUuYWMgKEFDX1BSRVJFUSk6IEJ1bXAgdG8gMi42NC4KKworMjAwOS0wOC0yMiAgUmFsZiBXaWxkZW5odWVzICA8UmFsZi5XaWxkZW5odWVzQGdteC5kZT4KKworCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtaHRtbCwgaW5zdGFsbC1wZGYpOiBSZW1vdmUuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKworCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogZmZpY29uZmlnLmguaW46IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogbWFuL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDA5LTA3LTMwICBSYWxmIFdpbGRlbmh1ZXMgIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgorCisJKiBjb25maWd1cmUuYWMgKF9BQ19BUkdfVkFSX1BSRUNJT1VTKTogVXNlIG00X3JlbmFtZV9mb3JjZS4KKworMjAwOS0wNy0yNCAgRGF2ZSBLb3JuICA8ZGF2ZS5rb3JuLmN5Z3dpbkBnbWFpbC5jb20+CisKKwlQUiBsaWJmZmkvNDA4MDcKKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogQWxzbyB1c2Ugc2lnbi96ZXJvLWV4dGVuZGluZworCXJldHVybiB0eXBlcyBmb3IgWDg2X1dJTjMyLgorCSogc3JjL3g4Ni93aW4zMi5TIChfZmZpX2NhbGxfU1lTVik6IEhhbmRsZSBvbWl0dGVkIHJldHVybiB0eXBlcy4KKwkoX2ZmaV9jYWxsX1NURENBTEwsIF9mZmlfY2xvc3VyZV9TWVNWLCBfZmZpX2Nsb3N1cmVfcmF3X1NZU1YsCisJX2ZmaV9jbG9zdXJlX1NURENBTEwpOiBMaWtld2lzZS4KKworCSogc3JjL2Nsb3N1cmVzLmMgKGlzX3NlbGludXhfZW5hYmxlZCk6IERlZmluZSB0byBjb25zdCAwIGZvciBDeWd3aW4uCisJKGRsbW1hcCwgZGxtdW5tYXApOiBBbHNvIHVzZSB0aGVzZSBmdW5jdGlvbnMgb24gQ3lnd2luLgorCisyMDA5LTA3LTExICBSaWNoYXJkIFNhbmRpZm9yZCAgPHJkc2FuZGlmb3JkQGdvb2dsZW1haWwuY29tPgorCisJUFIgdGVzdHN1aXRlLzQwNjk5CisJUFIgdGVzdHN1aXRlLzQwNzA3CisJUFIgdGVzdHN1aXRlLzQwNzA5CisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHA6IFJldmVydCAyMDA5LTA3LTAyLCAyMDA5LTA3LTAxIGFuZAorCTIwMDktMDYtMzAgY29tbWl0cy4KKworMjAwOS0wNy0wMSAgUmljaGFyZCBTYW5kaWZvcmQgIDxyLnNhbmRpZm9yZEB1ay5pYm0uY29tPgorCisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHAgKGxpYmZmaS1pbml0KTogU2V0IGxkX2xpYnJhcnlfcGF0aAorCXRvICIiIGJlZm9yZSBhZGRpbmcgcGF0aHMuICAoVGhpcyByZWluc3RhdGVzIGFuIGFzc2lnbm1lbnQgdGhhdAorCXdhcyByZW1vdmVkIGJ5IG15IDIwMDktMDYtMzAgY29tbWl0LCBidXQgY2hhbmdlcyB0aGUgaW5pdGlhbAorCXZhbHVlIGZyb20gIi4iIHRvICIiLikKKworMjAwOS0wNy0wMSAgSC5KLiBMdSAgPGhvbmdqaXUubHVAaW50ZWwuY29tPgorCisJUFIgdGVzdHN1aXRlLzQwNjAxCisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHAgKGxpYmZmaS1pbml0KTogUHJvcGVybHkgc2V0CisJZ2NjZGlyLiAgQWRqdXN0IGxkX2xpYnJhcnlfcGF0aCBmb3IgZ2NjIG9ubHkgaWYgZ2NjZGlyIGlzbid0CisJZW1wdHkuCisKKzIwMDktMDYtMzAgIFJpY2hhcmQgU2FuZGlmb3JkICA8ci5zYW5kaWZvcmRAdWsuaWJtLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwIChsaWJmZmktaW5pdCk6IERvbid0IGFkZCAiLiIKKwl0byBsZF9saWJyYXJ5X3BhdGguICBVc2UgYWRkX3BhdGguICBBZGQganVzdCBmaW5kX2xpYmdjY19zCisJdG8gbGRfbGlicmFyeV9wYXRoLCBub3QgZXZlcnkgbGliZ2NjIG11bHRpbGliIGRpcmVjdG9yeS4KKworMjAwOS0wNi0xNiAgV2ltIExld2lzICA8d2ltbEBoaGhoLm9yZz4KKworCSogc3JjL3Bvd2VycGMvZmZpLmM6IEF2b2lkIGNsb2JiZXJpbmcgY3IzIGFuZCBjcjQsIHdoaWNoIGFyZQorCXN1cHBvc2VkIHRvIGJlIGNhbGxlZS1zYXZlZC4KKwkqIHNyYy9wb3dlcnBjL3N5c3YuUyAoc21hbGxfc3RydWN0X3JldHVybl92YWx1ZSk6IEZpeCBvdmVycnVuIG9mCisJcmV0dXJuIGJ1ZmZlciBmb3Igb2RkLXNpemUgc3RydWN0cy4KKworMjAwOS0wNi0xNiAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6Lm9yZz4KKworCVBSIGxpYmZmaS80MDQ0NAorCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwIChsaWJmZmlfdGFyZ2V0X2NvbXBpbGUpOiBBZGQKKwlhbGxvd19zdGFja19leGVjdXRlIGZvciBEYXJ3aW4uCisKKzIwMDktMDYtMTYgIEFuZHJldyBIYWxleSAgPGFwaEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWMgKFRBUkdFVERJUik6IEFkZCBtaXNzaW5nIGJsYW5rIGxpbmVzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA5LTA2LTE2ICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQ2NC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sbDEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jOiBGaXggcHJpbnRmIGZvcm1hdAorCXNwZWNpZmllcnMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oLAorCXRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC9mZml0ZXN0Y3h4LmggKFBSSWRMTCwgUFJJdUxMKTogRGVmaW5lLgorCisyMDA5LTA2LTE1ICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jOiB4ZmFpbCBldmVyeXdoZXJlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmM6IExpa2V3aXNlLgorCisyMDA5LTA2LTEyICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IFJlbW92ZSBpbmZvX1RFWElORk9TLgorCisyMDA5LTA2LTEyICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogQ2hhbmdlTG9nLmxpYmZmaTogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQ2NC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sbDEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jOiBGaXggcHJpbnRmIGZvcm1hdAorCXNwZWNpZmllcnMuCisJdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2M6IGluY2x1ZGUgc3RkaW50LmguCisKKzIwMDktMDYtMTEgIFRpbW90aHkgV2FsbCAgPHR3YWxsQHVzZXJzLnNmLm5ldD4KKworCSogTWFrZWZpbGUuYW0sCisJY29uZmlndXJlLmFjLAorCWluY2x1ZGUvZmZpLmguaW4sCisJaW5jbHVkZS9mZmlfY29tbW9uLmgsCisJc3JjL2Nsb3N1cmVzLmMsCisJc3JjL2RsbWFsbG9jLmMsCisJc3JjL3g4Ni9mZmkuYywKKwlzcmMveDg2L2ZmaXRhcmdldC5oLAorCXNyYy94ODYvd2luNjQuUyAobmV3KSwKKwlSRUFETUU6IEFkZGVkIHdpbjY0IHN1cHBvcnQgKG1pbmd3IG9yIE1TVkMpCisJKiBNYWtlZmlsZS5pbiwKKwlpbmNsdWRlL01ha2VmaWxlLmluLAorCW1hbi9NYWtlZmlsZS5pbiwKKwl0ZXN0c3VpdGUvTWFrZWZpbGUuaW4sCisJY29uZmlndXJlLAorCWFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkCisJKiBsdGNmLWMuc2g6IHByb3Blcmx5IGVzY2FwZSBjeWd3aW4vdzMyIHBhdGgKKwkqIG1hbi9mZmlfY2FsbC4zOiBDbGFyaWZ5IHNpemUgcmVxdWlyZW1lbnRzIGZvciByZXR1cm4gdmFsdWUuCisJKiBzcmMveDg2L2ZmaTY0LmM6IEZpeCBmaWxlbmFtZSBpbiBjb21tZW50LgorCSogc3JjL3g4Ni93aW4zMi5TOiBSZW1vdmUgdW51c2VkIGV4dGVybi4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4wLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4zLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm41LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm42LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfc3RkY2FsbC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTJieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE4Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTlieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzI0Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMmJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMi5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180Ynl0ZS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVfMV9ieXRlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNWJ5dGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182NGJ5dGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182XzFfYnl0ZS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZieXRlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfN18xX2J5dGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183Ynl0ZS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZG91YmxlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZmxvYXQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQxNi5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQzMi5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQ2NC5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQzMi5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQ2NC5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RibHNfc3RydWN0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZmxvYXQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NjaGFyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0Y2hhci5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VjaGFyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0Y2hhci5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc2NoYXIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zaW50LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc3Nob3J0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWNoYXIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdXNob3J0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX2FiaS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZXJyX2JhZF90eXBlZGVmLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2h1Z2Vfc3RydWN0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEwLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Mi5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDMuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q3LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OC5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDkuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Byb2JsZW0xLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fbGRsLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fbGwxLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9tZWRpdW0uYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdC5jYzogdXNlIGZmaV9jbG9zdXJlX2FsbG9jIGluc3RlYWQKKwlvZiBjaGVja2luZyBmb3IgTU1BUC4gIFVzZSBpbnRwdHJfdCBpbnN0ZWFkIG9mIGxvbmcgY2FzdHMuCisKKzIwMDktMDYtMTEgIEtheiBLb2ppbWEgIDxra29qaW1hQGdjYy5nbnUub3JnPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYzogQWRkIHhmYWlsIHNoKi0qLWxpbnV4LSouCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZXJyX2JhZF9hYmkuYzogQWRkIHhmYWlsIHNoKi0qLSouCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZXJyX2JhZF90eXBlZGVmLmM6IExpa2V3aXNlLgorCisyMDA5LTA2LTA5ICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogc3JjL3g4Ni9mcmVlYnNkLlM6IEFkZCBtaXNzaW5nIGZpbGUuCisKKzIwMDktMDYtMDggIEFuZHJldyBIYWxleSAgPGFwaEByZWRoYXQuY29tPgorCisJSW1wb3J0IGZyb20gbGliZmZpIDMuMC44OgorCisJKiBkb2MvbGliZmZpLnRleGk6IE5ldyBmaWxlLgorCSogZG9jL2xpYmZmaS5pbmZvOiBMaWtld2lzZS4KKwkqIGRvYy9zdGFtcC12dGk6IExpa2V3aXNlLgorCSogbWFuL01ha2VmaWxlLmFtOiBOZXcgZmlsZS4KKwkqIG1hbi9mZmlfY2FsbC4zOiBOZXcgZmlsZS4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgc3JjL3g4Ni9kYXJ3aW42NC5TLAorCXNyYy9kbG1hbGxvYy5jLgorCShub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMpOiBBZGQgWDg2X0ZSRUVCU0QuCisKKwkqIGNvbmZpZ3VyZS5hYzogQnVtcCB2ZXJzaW9uIHRvIDMuMC44LgorCXBhcmlzYyotKi1saW51eCo6IEFkZC4KKwlpMzg2LSotZnJlZWJzZCogfCBpMzg2LSotb3BlbmJzZCo6IEFkZC4KKwlwb3dlcnBjLSotYmVvcyo6IEFkZC4KKwlBTV9DT05ESVRJT05BTCBYODZfRlJFRUJTRDogQWRkLgorCUFDX0NPTkZJR19GSUxFUzogQWRkIG1hbi9NYWtlZmlsZS4KKworCSogaW5jbHVkZS9mZmkuaC5pbiAoRkZJX0ZOKTogQ2hhbmdlIHZvaWQgKCopKCkgdG8gdm9pZCAoKikodm9pZCkuCisKKzIwMDktMDYtMDggIEFuZHJldyBIYWxleSAgPGFwaEByZWRoYXQuY29tPgorCisJKiBSRUFETUU6IEltcG9ydCBmcm9tIGxpYmZmaSAzLjAuOC4KKworMjAwOS0wNi0wOCAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX2FiaS5jOiBBZGQgeGZhaWxzLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmM6IEFkZCB4ZmFpbHMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RibHNfc3RydWN0LmM6IEFkZCB4ZmFpbCB4ODZfNjQtKi1saW51eC0qLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jOiBBZGQgeGZhaWxzLgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jOiBBZGQgX19VTlVTRURfXyB0byBhcmdzLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UuYzogIExpa2V3aXNlLgorCisyMDA4LTEyLTI2ICBUaW1vdGh5IFdhbGwgIDx0d2FsbEB1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYzogbWFyayBleHBlY3RlZAorCWZhaWx1cmVzIG9uIHg4Nl82NCBjeWd3aW4vbWluZ3cuCisKKzIwMDgtMTItMjIgIFRpbW90aHkgV2FsbCAgPHR3YWxsQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4wLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4zLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm41LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm42LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfbG9jX2ZuMC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3N0ZGNhbGwuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3BvaW50ZXIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYzogdXNlIHBvcnRhYmxlIGNhc3QgZnJvbQorCXBvaW50ZXIgdG8gaW50ZWdlciAoaW50cHRyX3QpLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmM6IGRpc2FibGUgZm9yIHdpbjY0LgorCisyMDA4LTA3LTI0ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kYmxzX3N0cnVjdC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmM6IENsZWFuIHVwIGZhaWx1cmVzIGZyb20KKwljb21waWxlciB3YXJuaW5ncy4KKworMjAwOC0wMy0wNCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisJICAgIEJsYWtlIENoYWZmaW4KKwkgICAgaG9zQHRhbWFuZWdpLm9yZworCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQyLmMKKwkgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jCisJICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RibHNfc3RydWN0LmMKKwkgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMKKwkgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jCisJICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYworCSAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMKKwkgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlcl9zdGFjay5jCisJICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZXJyX2JhZF9hYmkuYworCSAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jCisJICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMKKwkgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZS5jCisJICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jCisJICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmM6IE5ldyB0ZXN0cyBmcm9tIEFwcGxlLgorCisyMDA5LTA2LTA1ICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogc3JjL3g4Ni9mZml0YXJnZXQuaCwgc3JjL3g4Ni9mZmkuYzogTWVyZ2Ugc3RkY2FsbCBjaGFuZ2VzIGZyb20KKwlsaWJmZmkuCisKKzIwMDktMDYtMDQgIEFuZHJldyBIYWxleSAgPGFwaEByZWRoYXQuY29tPgorCisJKiBzcmMveDg2L2ZmaXRhcmdldC5oLCBzcmMveDg2L3dpbjMyLlMsIHNyYy94ODYvZmZpLmM6IEJhY2sgb3V0CisJc3RkY2FsbCBjaGFuZ2VzLgorCisyMDA4LTAyLTI2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKwkgICAgVGhvbWFzIEhlbGxlciAgPHRoZWxsZXJAY3R5cGVzLm9yZz4KKworCSogc3JjL3g4Ni9mZmkuYyAoZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcik6IENoYW5nZSBDKysgY29tbWVudCB0byBDCisJY29tbWVudC4KKworMjAwOC0wMi0wMyAgVGltb3RoeSBXYWxsICA8dHdhbGxAdXNlcnMuc2YubmV0PgorCisJKiBzcmMveDg2L2ZmaS5jIChGRklfSU5JVF9UUkFNUE9MSU5FX1NURENBTEwpOiBDYWxjdWxhdGUganVtcCByZXR1cm4KKwkgIG9mZnNldCBiYXNlZCBvbiBjb2RlIHBvaW50ZXIsIG5vdCBkYXRhIHBvaW50ZXIuCisKKzIwMDgtMDEtMzEgIFRpbW90aHkgV2FsbCA8dHdhbGxAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9zdGRjYWxsLmM6IEFkZCB0ZXN0IGZvciBzdGRjYWxsCisJY2xvc3VyZXMuCisJKiBzcmMveDg2L2ZmaXRhcmdldC5oOiBJbmNyZWFzZSBzaXplIG9mIHRyYW1wb2xpbmUgZm9yIHN0ZGNhbGwKKwljbG9zdXJlcy4KKwkqIHNyYy94ODYvd2luMzIuUzogQWRkIGFzc2VtYmx5IGZvciBzdGRjYWxsIGNsb3N1cmUuCisJKiBzcmMveDg2L2ZmaS5jOiBJbml0aWFsaXplIHN0ZGNhbGwgY2xvc3VyZSB0cmFtcG9saW5lLgorCisyMDA5LTA2LTA0ICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogaW5jbHVkZS9mZmkuaC5pbjogQ2hhbmdlIHZvaWQgKCopKCkgdG8gdm9pZCAoKikodm9pZCkuCisJKiBzcmMveDg2L2ZmaS5jOiBMaWtld2lzZS4KKworMjAwOS0wNi0wNCAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlM6IEluc2VydCBsaWNlbmNlIGhlYWRlci4KKwkqIHNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TOiBMaWtld2lzZS4KKwkqIHNyYy9tNjhrL3N5c3YuUzogTGlrZXdpc2UuCisKKwkqIHNyYy9zaDY0L2ZmaS5jOiBDaGFuZ2Ugdm9pZCAoKikoKSB0byB2b2lkICgqKSh2b2lkKS4KKwkqIHNyYy9wb3dlcnBjL2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYzogTGlrZXdpc2UuCisJKiBzcmMvbTMyci9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvc2g2NC9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMveDg2L2ZmaTY0LmM6IExpa2V3aXNlLgorCSogc3JjL2FscGhhL2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy9hbHBoYS9vc2YuUzogTGlrZXdpc2UuCisJKiBzcmMvZnJ2L2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy9zMzkwL2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy9wYS9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvcGEvaHB1eDMyLlM6IExpa2V3aXNlLgorCSogc3JjL2lhNjQvdW5peC5TOiBMaWtld2lzZS4KKwkqIHNyYy9pYTY0L2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy9zcGFyYy9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvbWlwcy9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvc2gvZmZpLmM6IExpa2V3aXNlLgorCisyMDA4LTAyLTE1ICBEYXZpZCBEYW5leSAgPGRkYW5leUBhdnRyZXguY29tPgorCisJKiBzcmMvbWlwcy9mZmkuYyAoVVNFX19CVUlMVElOX19fQ0xFQVJfQ0FDSEUpOgorCURlZmluZSAoY29uZGl0aW9uYWxseSksIGFuZCB1c2UgaXQgdG8gaW5jbHVkZSBjYWNoZWN0bC5oLgorCShmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IEZpeCBjYWNoZSBmbHVzaGluZy4KKwkqIHNyYy9taXBzL2ZmaXRhcmdldC5oIChfQUJJTjMyLCBfQUJJNjQsIF9BQklPMzIpOiBEZWZpbmUuCisKKzIwMDktMDYtMDQgIEFuZHJldyBIYWxleSAgPGFwaEByZWRoYXQuY29tPgorCisJaW5jbHVkZS9mZmkuaC5pbiwKKwlzcmMvYXJtL2ZmaXRhcmdldC5oLAorCXNyYy9hcm0vZmZpLmMsCisJc3JjL2FybS9zeXN2LlMsCisJc3JjL3Bvd2VycGMvZmZpdGFyZ2V0LmgsCisJc3JjL2Nsb3N1cmVzLmMsCisJc3JjL3NoNjQvZmZpdGFyZ2V0LmgsCisJc3JjL3NoNjQvZmZpLmMsCisJc3JjL3NoNjQvc3lzdi5TLAorCXNyYy90eXBlcy5jLAorCXNyYy94ODYvZmZpNjQuYywKKwlzcmMveDg2L2ZmaXRhcmdldC5oLAorCXNyYy94ODYvd2luMzIuUywKKwlzcmMveDg2L2Rhcndpbi5TLAorCXNyYy94ODYvZmZpLmMsCisJc3JjL3g4Ni9zeXN2LlMsCisJc3JjL3g4Ni91bml4NjQuUywKKwlzcmMvYWxwaGEvZmZpdGFyZ2V0LmgsCisJc3JjL2FscGhhL2ZmaS5jLAorCXNyYy9hbHBoYS9vc2YuUywKKwlzcmMvbTY4ay9mZml0YXJnZXQuaCwKKwlzcmMvZnJ2L2ZmaXRhcmdldC5oLAorCXNyYy9mcnYvZmZpLmMsCisJc3JjL3MzOTAvZmZpdGFyZ2V0LmgsCisJc3JjL3MzOTAvc3lzdi5TLAorCXNyYy9jcmlzL2ZmaXRhcmdldC5oLAorCXNyYy9wYS9saW51eC5TLAorCXNyYy9wYS9mZml0YXJnZXQuaCwKKwlzcmMvcGEvZmZpLmMsCisJc3JjL3Jhd19hcGkuYywKKwlzcmMvaWE2NC9mZml0YXJnZXQuaCwKKwlzcmMvaWE2NC91bml4LlMsCisJc3JjL2lhNjQvZmZpLmMsCisJc3JjL2lhNjQvaWE2NF9mbGFncy5oLAorCXNyYy9qYXZhX3Jhd19hcGkuYywKKwlzcmMvZGVidWcuYywKKwlzcmMvc3BhcmMvdjkuUywKKwlzcmMvc3BhcmMvZmZpdGFyZ2V0LmgsCisJc3JjL3NwYXJjL2ZmaS5jLAorCXNyYy9zcGFyYy92OC5TLAorCXNyYy9taXBzL2ZmaXRhcmdldC5oLAorCXNyYy9taXBzL24zMi5TLAorCXNyYy9taXBzL28zMi5TLAorCXNyYy9taXBzL2ZmaS5jLAorCXNyYy9wcmVwX2NpZi5jLAorCXNyYy9zaC9mZml0YXJnZXQuaCwKKwlzcmMvc2gvZmZpLmMsCisJc3JjL3NoL3N5c3YuUzogVXBkYXRlIGxpY2Vuc2UgdGV4dC4KKworMjAwOS0wNS0yMiAgRGF2ZSBLb3JuICA8ZGF2ZS5rb3JuLmN5Z3dpbkBnbWFpbC5jb20+CisKKwkqIHNyYy94ODYvd2luMzIuUyAoX2ZmaV9jbG9zdXJlX1NURENBTEwpOiAgTmV3IGZ1bmN0aW9uLgorCSguZWhfZnJhbWUpOiAgQWRkIEZERSBmb3IgaXQuCisKKzIwMDktMDUtMjIgIERhdmUgS29ybiAgPGRhdmUua29ybi5jeWd3aW5AZ21haWwuY29tPgorCisJKiBjb25maWd1cmUuYWM6ICBBbHNvIGNoZWNrIGlmIGFzc2VtYmxlciBzdXBwb3J0cyBwYy1yZWxhdGl2ZQorCXJlbG9jcyBvbiBYODZfV0lOMzIgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUuCisJKiBzcmMveDg2L3dpbjMyLlMgKGZmaV9wcmVwX2FyZ3MpOiAgRGVjbGFyZSBleHRlcm4sIG5vdCBnbG9iYWwuCisJKF9mZmlfY2FsbF9TWVNWKTogIEFkZCBtaXNzaW5nIGZ1bmN0aW9uIHR5cGUgc3ltYm9sIC5kZWYgYW5kCisJYWRkIEVIIG1hcmt1cCBsYWJlbHMuCisJKF9mZmlfY2FsbF9TVERDQUxMKTogIExpa2V3aXNlLgorCShfZmZpX2Nsb3N1cmVfU1lTVik6ICBMaWtld2lzZS4KKwkoX2ZmaV9jbG9zdXJlX3Jhd19TWVNWKTogIExpa2V3aXNlLgorCSguZWhfZnJhbWUpOiAgQWRkIGhhbmQtY3JhZnRlZCBFSCBkYXRhLgorCisyMDA5LTA0LTA5ICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwOiBDaGFuZ2UgY29weXJpZ2h0IGhlYWRlciB0byByZWZlciB0bworCXZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRvIHBvaW50IHJlYWRlcnMKKwlhdCB0aGUgQ09QWUlORzMgZmlsZSBhbmQgdGhlIEZTRidzIGxpY2Vuc2Ugd2ViIHBhZ2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2FsbC5leHA6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwOiBMaWtld2lzZS4KKworMjAwOS0wMy0wMSAgUmFsZiBXaWxkZW5odWVzICA8UmFsZi5XaWxkZW5odWVzQGdteC5kZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA4LTEyLTE4ICBSYWluZXIgT3J0aCAgPHJvQFRlY2hGYWsuVW5pLUJpZWxlZmVsZC5ERT4KKworCVBSIGxpYmZmaS8yNjA0OAorCSogY29uZmlndXJlLmFjIChIQVZFX0FTX1g4Nl9QQ1JFTCk6IE5ldyB0ZXN0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogZmZpY29uZmlnLmguaW46IFJlZ2VuZXJhdGUuCisJKiBzcmMveDg2L3N5c3YuUyBbIUZGSV9OT19SQVdfQVBJXTogUHJlY2FsY3VsYXRlCisJUkFXX0NMT1NVUkVfQ0lGX09GRlNFVCwgUkFXX0NMT1NVUkVfRlVOX09GRlNFVCwKKwlSQVdfQ0xPU1VSRV9VU0VSX0RBVEFfT0ZGU0VUIGZvciB0aGUgU29sYXJpcyAxMC94ODYgYXNzZW1ibGVyLgorCSguZWhfZnJhbWUpOiBPbmx5IHVzZSBTWU1CT0wtLiBpZmYgSEFWRV9BU19YODZfUENSRUwuCisJKiBzcmMveDg2L3VuaXg2NC5TICguTHN0b3JlX3RhYmxlKTogTW92ZSB0byAudGV4dCBzZWN0aW9uLgorCSguTGxvYWRfdGFibGUpOiBMaWtld2lzZS4KKwkoLmVoX2ZyYW1lKTogT25seSB1c2UgU1lNQk9MLS4gaWZmIEhBVkVfQVNfWDg2X1BDUkVMLgorCisyMDA4LTEyLTE4ICBSYWxmIFdpbGRlbmh1ZXMgIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDgtMTEtMjEgIEVyaWMgQm90Y2F6b3UgIDxlYm90Y2F6b3VAYWRhY29yZS5jb20+CisKKwkqIHNyYy9zcGFyYy9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBBZGQgc3VwcG9ydCBmb3IKKwlzaWduZWQvdW5zaWduZWQgaW50OC8xNiByZXR1cm4gdmFsdWVzLgorCSogc3JjL3NwYXJjL3Y4LlMgKGZmaV9jYWxsX3Y4KTogTGlrZXdpc2UuCisJKGZmaV9jbG9zdXJlX3Y4KTogTGlrZXdpc2UuCisKKzIwMDgtMDktMjYgIFBldGVyIE8nR29ybWFuICA8cG9nbWFAdGhld3JpdHRlbndvcmQuY29tPgorCSAgICBTdGV2ZSBFbGxjZXkgIDxzamVAY3VwLmhwLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIGZvciBuZXcgbGlidG9vbC4KKwkqIE1ha2VmaWxlLmluOiBEaXR0by4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IERpdHRvLgorCSogYWNsb2NhbC5tNDogRGl0dG8uCisKKzIwMDgtMDgtMjUgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5vcmc+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaXRhcmdldC5oIChmZmlfYWJpKTogQWRkIEZGSV9MSU5VWCBhbmQKKwlGRklfTElOVVhfU09GVF9GTE9BVCB0byB0aGUgUE9XRVJQQ19GUkVFQlNEIGVudW0uCisJQWRkIG5vdGUgYWJvdXQgZmxhZyBiaXRzIHVzZWQgZm9yIEZGSV9TWVNWX1RZUEVfU01BTExfU1RSVUNULgorCUFkanVzdCBjb3B5cmlnaHQgbm90aWNlLgorCSogc3JjL3Bvd2VycGMvZmZpLmM6IEFkZCB0d28gbmV3IGZsYWdzIHRvIGluZGljYXRlIGlmIHdlIGhhdmUgb25lCisJcmVnaXN0ZXIgb3IgdHdvIHJlZ2lzdGVyIHRvIHVzZSBmb3IgRkZJX1NZU1Ygc3RydWN0cy4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBQYXNzIHRoZSByaWdodCByZWdpc3RlciBmbGFnIGludHJvZHVjZWQgYWJvdmUuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWKTogRml4IHRoZSByZXR1cm4gdHlwZSBmb3IKKwlGRklfU1lTVl9UWVBFX1NNQUxMX1NUUlVDVC4gQ29tbWVudC4KKwlBZGp1c3QgY29weXJpZ2h0IG5vdGljZS4KKworMjAwOC0wNy0xNiAgS2F6IEtvamltYSAgPGtrb2ppbWFAZ2NjLmdudS5vcmc+CisKKwkqIHNyYy9zaC9mZmkuYyAoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBUdXJuIElOU04gaW50byBhbiB1bnNpZ25lZAorCWludC4KKworMjAwOC0wNi0xNyAgUmFsZiBXaWxkZW5odWVzICA8UmFsZi5XaWxkZW5odWVzQGdteC5kZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogaW5jbHVkZS9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKworMjAwOC0wNi0wNyAgSm9zZXBoIE15ZXJzICA8am9zZXBoQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYyAocGFyaXNjKi0qLWxpbnV4KiwgcG93ZXJwYy0qLXN5c3YqLAorCXBvd2VycGMtKi1iZW9zKik6IFJlbW92ZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwOC0wNS0wOSAgSnVsaWFuIEJyb3duICA8anVsaWFuQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChMVExERkxBR1MpOiBOZXcuCisJKGxpYmZmaV9sYV9MREZMQUdTKTogVXNlIGFib3ZlLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKzIwMDgtMDQtMTggIFBhb2xvIEJvbnppbmkgIDxib256aW5pQGdudS5vcmc+CisKKwlQUiBib290c3RyYXAvMzU0NTcKKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGUuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDgtMDMtMjYgIEtheiBLb2ppbWEgIDxra29qaW1hQGdjYy5nbnUub3JnPgorCisJKiBzcmMvc2gvc3lzdi5TOiBBZGQgLm5vdGUuR05VLXN0YWNrIG9uIExpbnV4LgorCSogc3JjL3NoNjQvc3lzdi5TOiBMaWtld2lzZS4KKworMjAwOC0wMy0yNiAgRGFuaWVsIEphY29ib3dpdHogIDxkYW5AZGViaWFuLm9yZz4KKworCSogc3JjL2FybS9zeXN2LlM6IEZpeCBBUk0gY29tbWVudCBtYXJrZXIuCisKKzIwMDgtMDMtMjYgIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgorCisJKiBzcmMvYWxwaGEvb3NmLlM6IEFkZCAubm90ZS5HTlUtc3RhY2sgb24gTGludXguCisJKiBzcmMvczM5MC9zeXN2LlM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUzogTGlrZXdpc2UuCisJKiBzcmMvcG93ZXJwYy9zeXN2LlM6IExpa2V3aXNlLgorCSogc3JjL3g4Ni91bml4NjQuUzogTGlrZXdpc2UuCisJKiBzcmMveDg2L3N5c3YuUzogTGlrZXdpc2UuCisJKiBzcmMvc3BhcmMvdjguUzogTGlrZXdpc2UuCisJKiBzcmMvc3BhcmMvdjkuUzogTGlrZXdpc2UuCisJKiBzcmMvbTY4ay9zeXN2LlM6IExpa2V3aXNlLgorCSogc3JjL2FybS9zeXN2LlM6IExpa2V3aXNlLgorCisyMDA4LTAzLTE2ICBSYWxmIFdpbGRlbmh1ZXMgIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgorCisJKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlOiBMaWtld2lzZS4KKwkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKworMjAwOC0wMi0xMiAgQmpvZXJuIEtvZW5pZyAgPGJrb2VuaWdAYWxwaGEtdGllcmNoZW4uZGU+CisJICAgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIGFtZDY0LSotZnJlZWJzZCogdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA4LTAxLTMwICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwlQUiBsaWJmZmkvMzQ2MTIKKwkqIHNyYy94ODYvc3lzdi5TIChmZmlfY2xvc3VyZV9TWVNWKTogUG9wIDQgYnl0ZSBmcm9tIHN0YWNrIHdoZW4KKwlyZXR1cm5pbmcgc3RydWN0LgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2FsbC5leHA6IEFkZCAiLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIgorCXRlc3RzLgorCisyMDA4LTAxLTI0ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQGdudS5vcmc+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwOC0wMS0wNiAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6Lm9yZz4KKworCSogc3JjL3g4Ni9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBGaXggdGhpbmtvLgorCisyMDA4LTAxLTA1ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXoub3JnPgorCisJUFIgdGVzdHN1aXRlLzMyODQzCisJKiBzcmMveDg2L2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEFkZCBjb2RlIGZvcgorCXNpZ25lZC91bnNpZ25lZCBpbnQ4LzE2IGZvciBYODZfREFSV0lOLgorCVVwZGF0ZWQgY29weXJpZ2h0IGluZm8uCisJSGFuZGxlIG9uZSBhbmQgdHdvIGJ5dGUgc3RydWN0cyB3aXRoIHNwZWNpYWwgY2lmLT5mbGFncy4KKwkqIHNyYy94ODYvZmZpdGFyZ2V0Lmg6IEFkZCBzcGVjaWFsIHR5cGVzIGZvciBvbmUgYW5kIHR3byBieXRlIHN0cnVjdHMuCisJVXBkYXRlZCBjb3B5cmlnaHQgaW5mby4KKwkqIHNyYy94ODYvZGFyd2luLlMgKGZmaV9jYWxsX1NZU1YpOiBSZXdyaXRlIHRvIHVzZSBhIGp1bXAgdGFibGUgbGlrZQorCXN5c3YuUworCVJlbW92ZSBjb2RlIHRvIHBvcCBhcmdzIGZyb20gdGhlIHN0YWNrIGFmdGVyIGNhbGwuCisJU3BlY2lhbC1jYXNlIHNpZ25lZC91bnNpZ25lZCBmb3IgaW50OC8xNiwgb25lIGFuZCB0d28gYnl0ZSBzdHJ1Y3RzLgorCShmZmlfY2xvc3VyZV9yYXdfU1lTVik6IEhhbmRsZSBGRklfVFlQRV9VSU5UOCwKKwlGRklfVFlQRV9TSU5UOCwgRkZJX1RZUEVfVUlOVDE2LCBGRklfVFlQRV9TSU5UMTYsIEZGSV9UWVBFX1VJTlQzMiwKKwlGRklfVFlQRV9TSU5UMzIuCisJVXBkYXRlZCBjb3B5cmlnaHQgaW5mby4KKworMjAwNy0xMi0wOCAgRGF2aWQgRGFuZXkgIDxkZGFuZXlAYXZ0cmV4LmNvbT4KKworCSogc3JjL21pcHMvbjMyLlMgKGZmaV9jYWxsX04zMik6ICBSZXBsYWNlIGRhZGQgd2l0aCBBRERVLCBkc3ViIHdpdGgKKwlTVUJVLCBhZGQgd2l0aCBBRERVIGFuZCB1c2Ugc21hbGxlciBjb2RlIHNlcXVlbmNlcy4KKworMjAwNy0xMi0wNyAgRGF2aWQgRGFuZXkgIDxkZGFuZXlAYXZ0cmV4LmNvbT4KKworCSogc3JjL21pcHMvZmZpLmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogSGFuZGxlIGxvbmcgZG91YmxlIHJldHVybgorCXR5cGUuCisKKzIwMDctMTItMDYgIERhdmlkIERhbmV5ICA8ZGRhbmV5QGF2dHJleC5jb20+CisKKwkqIGluY2x1ZGUvZmZpLmguaW4gKEZGSV9TSVpFT0ZfSkFWQV9SQVcpOiBEZWZpbmUgaWYgbm90CWFscmVhZHkKKwlkZWZpbmVkLgorCShmZmlfamF2YV9yYXcpOiBOZXcgdHlwZWRlZi4KKwkoZmZpX2phdmFfcmF3X2NhbGwsIGZmaV9qYXZhX3B0cmFycmF5X3RvX3JhdywKKwlmZmlfamF2YV9yYXdfdG9fcHRyYXJyYXkpOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGVzIGZyb20gZmZpX3JhdyB0bworCWZmaV9qYXZhX3Jhdy4KKwkoZmZpX2phdmFfcmF3X2Nsb3N1cmUpIDogU2FtZS4KKwkoZmZpX3ByZXBfamF2YV9yYXdfY2xvc3VyZSwgZmZpX3ByZXBfamF2YV9yYXdfY2xvc3VyZV9sb2MpOiBDaGFuZ2UKKwlwYXJhbWV0ZXIgdHlwZXMuCisJKiBzcmMvamF2YV9yYXdfYXBpLmMgKGZmaV9qYXZhX3Jhd19zaXplKTogIFJlcGxhY2UgRkZJX1NJWkVPRl9BUkcgd2l0aAorCUZGSV9TSVpFT0ZfSkFWQV9SQVcuCisJKGZmaV9qYXZhX3Jhd190b19wdHJhcnJheSk6IENoYW5nZSB0eXBlIG9mIHJhdyB0byBmZmlfamF2YV9yYXcuCisJUmVwbGFjZSBGRklfU0laRU9GX0FSRyB3aXRoIEZGSV9TSVpFT0ZfSkFWQV9SQVcuIFVzZQorCXNpemVvZihmZmlfamF2YV9yYXcpIGZvciBhbGlnbm1lbnQgY2FsY3VsYXRpb25zLgorCShmZmlfamF2YV9wdHJhcnJheV90b19yYXcpOiBTYW1lLgorCShmZmlfamF2YV9ydmFsdWVfdG9fcmF3KTogQWRkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEZGSV9UWVBFX1BPSU5URVIKKwlpZiBGRklfU0laRU9GX0pBVkFfUkFXID09IDQuCisJKGZmaV9qYXZhX3Jhd190b19ydmFsdWUpOiBTYW1lLgorCShmZmlfamF2YV9yYXdfY2FsbCk6IENoYW5nZSB0eXBlIG9mIHJhdyB0byBmZmlfamF2YV9yYXcuCisJKGZmaV9qYXZhX3RyYW5zbGF0ZV9hcmdzKTogU2FtZS4KKwkoZmZpX3ByZXBfamF2YV9yYXdfY2xvc3VyZV9sb2MsIGZmaV9wcmVwX2phdmFfcmF3X2Nsb3N1cmUpOiBDaGFuZ2UKKwlwYXJhbWV0ZXIgdHlwZXMuCisJKiBzcmMvbWlwcy9mZml0YXJnZXQuaCAoRkZJX1NJWkVPRl9KQVZBX1JBVyk6IERlZmluZSBmb3IgTjMyIEFCSS4KKworMjAwNy0xMi0wNiAgRGF2aWQgRGFuZXkgIDxkZGFuZXlAYXZ0cmV4LmNvbT4KKworCSogc3JjL21pcHMvbjMyLlMgKGZmaV9jbG9zdXJlX04zMik6IFVzZSA2NC1iaXQgYWRkIGluc3RydWN0aW9uIG9uCisJcG9pbnRlciB2YWx1ZXMuCisKKzIwMDctMTItMDEgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5vcmc+CisKKwlQUiBsaWJmZmkvMzE5MzcKKwkqIHNyYy9wb3dlcnBjL2ZmaXRhcmdldC5oOiBJbnRyb2R1Y2UgbmV3IEFCSSBGRklfTElOVVhfU09GVF9GTE9BVC4KKwlBZGQgbG9jYWwgRkZJX1RZUEVfVUlOVDEyOCB0byBoYW5kbGUgc29mdC1mbG9hdCBsb25nLWRvdWJsZS0xMjguCisJKiBzcmMvcG93ZXJwYy9mZmkuYzogRGlzdGluZ3Vpc2ggYmV0d2VlbiBfX05PX0ZQUlNfXyBhbmQgbm90IGFuZAorCXNldCB0aGUgTlVNX0ZQUl9BUkdfUkVHSVNURVJTIGFjY29yZGluZyB0by4KKwlBZGQgc3VwcG9ydCBmb3IgcG90ZW50aWFsIHNvZnQtZmxvYXQgc3VwcG9ydCB1bmRlciBoYXJkLWZsb2F0CisJYXJjaGl0ZWN0dXJlLgorCShmZmlfcHJlcF9hcmdzX1NZU1YpOiBTZXQgTlVNX0ZQUl9BUkdfUkVHSVNURVJTIHRvIDAgaW4gY2FzZSBvZgorCUZGSV9MSU5VWF9TT0ZUX0ZMT0FULCBoYW5kbGUgZmxvYXQsIGRvdWJsZXMgYW5kIGxvbmctZG91YmxlcyBhY2NvcmRpbmcKKwl0byB0aGUgRkZJX0xJTlVYX1NPRlRfRkxPQVQgQUJJLgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IExpa2V3aXNlLgorCShmZmlfY2xvc3VyZV9oZWxwZXJfU1lTVik6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUzogTWFrZSBzdXJlIG5vdCB0byBzdG9yZSBmbG9hdC9kb3VibGUKKwlvbiBhcmNocyB3aGVyZSBfX05PX0ZQUlNfXyBpcyB0cnVlLgorCUFkZCBGRklfVFlQRV9VSU5UMTI4IHN1cHBvcnQuCisJKiBzcmMvcG93ZXJwYy9zeXN2LlM6IEFkZCBzdXBwb3J0IGZvciBzb2Z0LWZsb2F0IGxvbmctZG91YmxlLTEyOC4KKwlBZGp1c3QgY29weXJpZ2h0IG5vdGljZS4KKworMjAwNy0xMS0yNSAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6Lm9yZz4KKworCSogc3JjL2Nsb3N1cmVzLmM6IE1vdmUgZGVmaW50aW9uIG9mIE1BWUJFX1VOVVNFRCBmcm9tIGhlcmUgdG8gLi4uCisJKiBpbmNsdWRlL2ZmaV9jb21tb24uaDogLi4uIGhlcmUuCisJVXBkYXRlIGNvcHlyaWdodC4KKworMjAwNy0xMS0xNyAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6Lm9yZz4KKworCSogc3JjL3Bvd2VycGMvc3lzdi5TOiBMb2FkIGNvcnJlY3QgY3IgdG8gY29tcGFyZSBpZiB3ZSBoYXZlIGxvbmcgZG91YmxlLgorCSogc3JjL3Bvd2VycGMvbGludXg2NC5TOiBMaWtld2lzZS4KKwkqIHNyYy9wb3dlcnBjL2ZmaS5jOiBBZGQgYSBjb21tZW50IHRvIHNob3cgd2hpY2ggcGFydCBnb2VzIGludG8gY3I2LgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sZGwuYzogTmV3IHRlc3QuCisKKzIwMDctMDktMDQgICAgPGFwaEByZWRoYXQuY29tPgorCisJKiBzcmMvYXJtL3N5c3YuUyAoVU5XSU5EKTogTmV3LgorCShXaG9sZSBmaWxlKTogQ29uZGl0aW9uYWxseSBjb21waWxlIHVud2luZGVyIGRpcmVjdGl2ZXMuCisJKiBzcmMvYXJtL3N5c3YuUzogQWRkIHVud2luZGVyIGRpcmVjdGl2ZXMuCisKKwkqIHNyYy9hcm0vZmZpLmMgKGZmaV9wcmVwX2FyZ3MpOiBBbGlnbiBzdHJ1Y3RzIGJ5IGF0IGxlYXN0IDQgYnl0ZXMuCisJT25seSB0cmVhdCByMCBhcyBhIHN0cnVjdCBhZGRyZXNzIGlmIHdlJ3JlIGFjdHVhbGx5IHJldHVybmluZyBhCisJc3RydWN0IGJ5IGFkZHJlc3MuCisJT25seSBjb3B5IHRoZSBieXRlcyB0aGF0IGFyZSBhY3R1YWxseSB3aXRoaW4gYSBzdHJ1Y3QuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogQSBDb21wb3NpdGUgVHlwZSBub3QgbGFyZ2VyIHRoYW4gNCBieXRlcworCWlzIHJldHVybmVkIGluIHIwLCBub3QgcGFzc2VkIGJ5IGFkZHJlc3MuCisJKGZmaV9jYWxsKTogQWxsb2NhdGUgYSB3b3JkLXNpemVkIHRlbXBvcmFyeSBmb3IgdGhlIGNhc2Ugd2hlcmUKKwlhIGNvbXBvc2l0ZSBpcyByZXR1cm5lZCBpbiByMC4KKwkoZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKTogQWxpZ24gYXMgbmVjZXNzYXJ5LgorCisyMDA3LTA4LTA1ICBTdGV2ZW4gTmV3YnVyeSAgPHNfal9uZXdidXJ5QHlhaG9vLmNvLnVrPgorCisJKiBzcmMvYXJtL2ZmaS5jIChGRklfSU5JVF9UUkFNUE9MSU5FKTogVXNlIF9fY2xlYXJfY2FjaGUgaW5zdGVhZCBvZgorCWRpcmVjdGx5IHVzaW5nIHRoZSBzeXNfY2FjaGVmbHVzaCBzeXNjYWxsLgorCisyMDA3LTA3LTI3ICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogc3JjL2FybS9zeXN2LlMgKGZmaV9jbG9zdXJlX1NZU1YpOiBBZGQgc29mdC1mbG9hdC4KKworMjAwNy0wOS0wMyAgTWFjaWVqIFcuIFJvenlja2kgIDxtYWNyb0BsaW51eC1taXBzLm9yZz4KKworCSogTWFrZWZpbGUuYW06IFVuaWZ5IE1JUFNfSVJJWCBhbmQgTUlQU19MSU5VWCBpbnRvIE1JUFMuCisJKiBjb25maWd1cmUuYWM6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCisJKiBjb25maWd1cmU6IExpa2V3aXNlLgorCisyMDA3LTA4LTI0ICBEYXZpZCBEYW5leSAgPGRkYW5leUBhdnRyZXguY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX3NsLmM6IE5ldyB0ZXN0LgorCisyMDA3LTA4LTEwICBEYXZpZCBEYW5leSAgPGRkYW5leUBhdnRyZXguY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDE2LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q3LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zaW50LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q5LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUxLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnRjaGFyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMi5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc2NoYXIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VjaGFyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzlieXRlMS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZmxvYXQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcHJvYmxlbTEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjMuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NzaG9ydC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZG91YmxlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNGJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MTYuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQzMi5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19mbG9hdC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Mi5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNV8xX2J5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzI0Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNjRieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q4LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnRjaGFyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zY2hhci5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWNoYXIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQ2NC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNl8xX2J5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE2Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMThieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4wLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNi5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNWJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3BvaW50ZXIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MzIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdF9mZmlfY2FsbC5jYywKKwl0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdC5jYzogUmVtb3ZlIHhmYWlsIGZvciBtaXBzNjQqLSotKi4KKworMjAwNy0wOC0xMCAgRGF2aWQgRGFuZXkgIDxkZGFuZXlAYXZ0cmV4LmNvbT4KKworCVBSIGxpYmZmaS8yODMxMworCSogY29uZmlndXJlLmFjOiBEb24ndCB0cmVhdCBtaXBzNjQgYXMgYSBzcGVjaWFsIGNhc2UuCisJKiBNYWtlZmlsZS5hbSAobm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTKTogQWRkIG4zMi5TLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlCisJKiBNYWtlZmlsZS5pbjogRGl0dG8uCisJKiBmZmljb25maWcuaC5pbjogRGl0dG8uCisJKiBzcmMvbWlwcy9mZml0YXJnZXQuaCAoUkVHX0wsIFJFR19TLCBTVUJVLCBBRERVLCBTUkwsIExJKTogSW5kZW50LgorCShMQSwgRUhfRlJBTUVfQUxJR04sIEZERV9BRERSX0JZVEVTKTogTmV3IHByZXByb2Nlc3NvciBtYWNyb3MuCisJKEZGSV9ERUZBVUxUX0FCSSk6IFNldCBmb3IgbjY0IGNhc2UuCisJKEZGSV9DTE9TVVJFUywgRkZJX1RSQU1QT0xJTkVfU0laRSk6IERlZmluZSBmb3IgbjMyIGFuZCBuNjQgY2FzZXMuCisJKiBzcmMvbWlwcy9uMzIuUyAoZmZpX2NhbGxfTjMyKTogQWRkIGRlYnVnIG1hY3JvcyBhbmQgbGFiZWxzIGZvciBGREUuCisJKGZmaV9jbG9zdXJlX04zMik6IE5ldyBmdW5jdGlvbi4KKwkoLmVoX2ZyYW1lKTogTmV3IHNlY3Rpb24KKwkqIHNyYy9taXBzL28zMi5TOiBDbGVhbiB1cCBjb21tZW50cy4KKwkoZmZpX2Nsb3N1cmVfTzMyKTogUGFzcyBmZmlfY2xvc3VyZSBwYXJhbWV0ZXIgaW4gJDEyLgorCSogc3JjL21pcHMvZmZpLmM6IFVzZSBGRklfTUlQU19OMzIgaW5zdGVhZCBvZgorCV9NSVBTX1NJTSA9PSBfQUJJTjMyIHRocm91Z2hvdXQuCisJKEZGSV9NSVBTX1NUT1BfSEVSRSk6IE5ldywgdXNlIGluIHBsYWNlIG9mCisJZmZpX3N0b3BfaGVyZS4KKwkoZmZpX3ByZXBfYXJncyk6IFVzZSB1bnNpZ25lZCBsb25nIHRvIGhvbGQgcG9pbnRlciB2YWx1ZXMuICBSZXdyaXRlCisJdG8gc3VwcG9ydCBuMzIvbjY0IEFCSXMuCisJKGNhbGNfbjMyX3N0cnVjdF9mbGFncyk6IFJld3JpdGUuCisJKGNhbGNfbjMyX3JldHVybl9zdHJ1Y3RfZmxhZ3MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLiAgUmV2ZXJzZQorCXBvc2l0aW9uIG9mIGZsYWcgYml0cy4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBSZXdyaXRlIG4zMiBwb3J0aW9uLgorCShmZmlfY2FsbCk6IEVuYWJsZSBmb3IgbjY0LiAgQWRkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHNtYWxsIHN0cnVjdHVyZQorCXJldHVybiB2YWx1ZXMuCisJKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogQWRkIG4zMiBhbmQgbjY0IHN1cHBvcnQuCisJKGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTzMyKTogQWRkIGNhc3QgdG8gc2lsZW5jZSB3YXJuaW5nLgorCShjb3B5X3N0cnVjdF9OMzIsIGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTjMyKTogTmV3IGZ1bmN0aW9ucy4KKworMjAwNy0wOC0wOCAgRGF2aWQgRGFuZXkgIDxkZGFuZXlAYXZ0cmV4LmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaCAoZmZpX3R5cGVfbXlsb25nKTogUmVtb3ZlIGRlZmluaXRpb24uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jIChtYWluKTogVXNlIGNvcnJlY3QgdHlwZQorCXNwZWNpZmllcnMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zaW50LmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTEuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMy5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2RibDIuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9mbDMuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm41LmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTAuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sbDEuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQzMi5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQxNi5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDIuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q2LmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWludC5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzEyYnl0ZS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE2Ynl0ZS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZGJsMS5jIChtYWluKTogRGl0dG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjQuYyAobWFpbik6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm42LmMgKG1haW4pOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMgKG1haW4pOiBEaXR0by4KKworMjAwNy0wOC0wNyAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy94ODYvc3lzdi5TIChmZmlfY2xvc3VyZV9yYXdfU1lTVik6IEZpeCB0eXBvIGluIHByZXZpb3VzCisJY2hlY2tpbi4KKworMjAwNy0wOC0wNiAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwlQUiB0ZXN0c3VpdGUvMzI4NDMKKwkqIHNyYy94ODYvc3lzdi5TIChmZmlfY2xvc3VyZV9yYXdfU1lTVik6IEhhbmRsZSBGRklfVFlQRV9VSU5UOCwKKwlGRklfVFlQRV9TSU5UOCwgRkZJX1RZUEVfVUlOVDE2LCBGRklfVFlQRV9TSU5UMTYsIEZGSV9UWVBFX1VJTlQzMiwKKwlGRklfVFlQRV9TSU5UMzIuCisKKzIwMDctMDgtMDIgIERhdmlkIERhbmV5ICA8ZGRhbmV5QGF2dHJleC5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWwuYyAobWFpbik6IERlZmluZSByZXR1cm4gdHlwZSBhcworCWZmaV9hcmcuICBVc2UgcHJvcGVyIHByaW50ZiBjb252ZXJzaW9uIHNwZWNpZmllci4KKworMjAwNy0wNy0zMCAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwlQUiB0ZXN0c3VpdGUvMzI4NDMKKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogaW4geDg2IGNhc2UsIGFkZCBjb2RlIGZvcgorCXNpZ25lZC91bnNpZ25lZCBpbnQ4LzE2LgorCSogc3JjL3g4Ni9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBSZXdyaXRlIHRvOgorCVVzZSBhIGp1bXAgdGFibGUuCisJUmVtb3ZlIGNvZGUgdG8gcG9wIGFyZ3MgZnJvbSB0aGUgc3RhY2sgYWZ0ZXIgY2FsbC4KKwlTcGVjaWFsLWNhc2Ugc2lnbmVkL3Vuc2lnbmVkIGludDgvMTYuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX3NjLmMgKG1haW4pOiBSZXZlcnQuCisKKzIwMDctMDctMjYgIFJpY2hhcmQgR3VlbnRoZXIgIDxyZ3VlbnRoZXJAc3VzZS5kZT4KKworCVBSIHRlc3RzdWl0ZS8zMjg0MworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jIChtYWluKTogVmVyaWZ5IGNhbGwKKwlyZXN1bHQgYXMgc2lnbmVkIGNoYXIsIG5vdCBmZmlfYXJnLgorCisyMDA3LTA3LTE2ICBSYWluZXIgT3J0aCAgPHJvQFRlY2hGYWsuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogY29uZmlndXJlLmFjIChpPzg2LSotc29sYXJpczIuMVswLTldKTogU2V0IFRBUkdFVCB0byBYODZfNjQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDctMDctMTEgIERhdmlkIERhbmV5ICA8ZGRhbmV5QGF2dHJleC5jb20+CisKKwkqIHNyYy9taXBzL2ZmaS5jOiBEb24ndCBpbmNsdWRlIHN5cy9jYWNoZWN0bC5oLgorCShmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IFVzZSBfX2J1aWx0aW5fX19jbGVhcl9jYWNoZSgpIGluc3RlYWQgb2YKKwljYWNoZWZsdXNoKCkuCisKKzIwMDctMDUtMTggIEF1cmVsaWVuIEphcm5vICA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+CisKKwkqIHNyYy9hcm0vZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogUmVuYW1lZCBhbmQgYWp1c3RlZAorCWZyb20gKGZmaV9wcmVwX2Nsb3N1cmUpOiAuLi4gdGhpcy4KKwkoRkZJX0lOSVRfVFJBTVBPTElORSk6IEFkanVzdC4KKworMjAwNS0xMi0zMSAgUGhpbCBCbHVuZGVsbCAgPHBiQHJlY2l2YS5jb20+CisKKwkqIHNyYy9hcm0vZmZpLmMgKGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTViwKKwlmZmlfY2xvc3VyZV9TWVNWX2lubmVyLCBmZmlfcHJlcF9jbG9zdXJlKTogTmV3LCBhZGQgY2xvc3VyZSBzdXBwb3J0LgorCSogc3JjL2FybS9zeXN2LlMoZmZpX2Nsb3N1cmVfU1lTVik6IExpa2V3aXNlLgorCSogc3JjL2FybS9mZml0YXJnZXQuaCAoRkZJX1RSQU1QT0xJTkVfU0laRSk6IExpa2V3aXNlLgorCShGRklfQ0xPU1VSRVMpOiBFbmFibGUgY2xvc3VyZSBzdXBwb3J0LgorCisyMDA3LTA3LTAzICBBbmRyZXcgSGFsZXkgIDxhcGhAaGVkZ2VzLmJpbGxnYXRsaWZmLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0My5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfN18xX2J5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ny5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc2ludC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0Y2hhci5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDY0LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NjaGFyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91Y2hhci5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTlieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Byb2JsZW0xLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4zLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2RvdWJsZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMmJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTAuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOGJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MTYuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2Zsb2F0LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVfMV9ieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWludC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0Y2hhci5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc2NoYXIuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTJieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zXzFieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZfMV9ieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE4Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191c2hvcnQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjYuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9wb2ludGVyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3RfZmZpX2NhbGwuY2MsCisJdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2M6IEVuYWJsZSBmb3IgQVJNLgorCisyMDA3LTA3LTA1ICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkLgorCisyMDA3LTA2LTAyICBQYW9sbyBCb256aW5pICA8Ym9uemluaUBnbnUub3JnPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDctMDUtMjMgIFN0ZXZlIEVsbGNleSAgPHNqZUBjdXAuaHAuY29tPgorCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDA3LTA1LTEwICBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKworCSogc3JjL202OGsvZmZpLmMgKGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTViwKKwlmZmlfY2xvc3VyZV9TWVNWX2lubmVyLGZmaV9wcmVwX2Nsb3N1cmUpOiBOZXcsIGFkZCBjbG9zdXJlIHN1cHBvcnQuCisJKiBzcmMvbTY4ay9zeXN2LlMoZmZpX2Nsb3N1cmVfU1lTVixmZmlfY2xvc3VyZV9zdHJ1Y3RfU1lTVik6IExpa2V3aXNlLgorCSogc3JjL202OGsvZmZpdGFyZ2V0LmggKEZGSV9UUkFNUE9MSU5FX1NJWkUpOiBMaWtld2lzZS4KKwkoRkZJX0NMT1NVUkVTKTogRW5hYmxlIGNsb3N1cmUgc3VwcG9ydC4KKworMjAwNy0wNS0xMCAgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYyAoSEFWRV9BU19DRklfUFNFVURPX09QKTogTmV3IHRlc3QuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBmZmljb25maWcuaC5pbjogUmVnZW5lcmF0ZS4KKwkqIHNyYy9tNjhrL3N5c3YuUyAoQ0ZJX1NUQVJUUFJPQyxDRklfRU5EUFJPQywKKwlDRklfT0ZGU0VULENGSV9ERUZfQ0ZBKTogTmV3IG1hY3Jvcy4KKwkoZmZpX2NhbGxfU1lTVik6IEFkZCBjYWxsZnJhbWUgYW5ub3RhdGlvbi4KKworMjAwNy0wNS0xMCAgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisKKwkqIHNyYy9tNjhrL2ZmaS5jIChmZmlfcHJlcF9hcmdzLGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogRml4CisJbnVtZXJvdXMgdGVzdCBzdWl0ZSBmYWlsdXJlcy4KKwkqIHNyYy9tNjhrL3N5c3YuUyAoZmZpX2NhbGxfU1lTVik6IExpa2V3aXNlLgorCisyMDA3LTA0LTExICBQYW9sbyBCb256aW5pICA8Ym9uemluaUBnbnUub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEJyaW5nIHVwIHRvIGRhdGUuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIHNyYy9mcnYvZWFiaS5TOiBSZW1vdmUgUkNTIGtleXdvcmQuCisKKzIwMDctMDQtMDYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogVGlkeSB0YXJnZXQgY2FzZS4KKwkoSEFWRV9MT05HX0RPVUJMRSk6IEFsbG93IHRoZSB0YXJnZXQgdG8gb3ZlcnJpZGUuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBEb24ndCBkZWZpbmUgZmZpX3R5cGVfZm9vIGlmCisJTElCRkZJX0hJREVfQkFTSUNfVFlQRVMgaXMgZGVmaW5lZC4KKwkoZmZpX3R5cGVfbG9uZ2RvdWJsZSk6IElmIG5vdCBIQVZFX0xPTkdfRE9VQkxFLCBkZWZpbmUKKwl0byBmZmlfdHlwZV9kb3VibGUuCisJKiB0eXBlcy5jIChMSUJGRklfSElERV9CQVNJQ19UWVBFUyk6IERlZmluZS4KKwkoRkZJX1RZUEVERUYsIGZmaV90eXBlX3ZvaWQpOiBNYXJrIHRoZSBkYXRhIGNvbnN0LgorCShmZmlfdHlwZV9sb25nZG91YmxlKTogU3BlY2lhbCBjYXNlIGZvciBBbHBoYS4gIERvbid0IGRlZmluZQorCWlmIGxvbmcgZG91YmxlID09IGRvdWJsZS4KKworCSogc3JjL2FscGhhL2ZmaS5jIChGRklfVFlQRV9MT05HRE9VQkxFKTogQXNzZXJ0IHVuaXF1ZSB2YWx1ZS4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBIYW5kbGUgaXQgYXMgdGhlIDEyOC1iaXQgdHlwZS4KKwkoZmZpX2NhbGwsIGZmaV9jbG9zdXJlX29zZl9pbm5lcik6IExpa2V3aXNlLgorCShmZmlfY2xvc3VyZV9vc2ZfaW5uZXIpOiBMaWtld2lzZS4gIE1hcmsgaGlkZGVuLgorCShmZmlfY2FsbF9vc2YsIGZmaV9jbG9zdXJlX29zZik6IE1hcmsgaGlkZGVuLgorCSogc3JjL2FscGhhL2ZmaXRhcmdldC5oIChGRklfTEFTVF9BQkkpOiBUaWR5IGRlZmluaXRpb24uCisJKiBzcmMvYWxwaGEvb3NmLlMgKGZmaV9jYWxsX29zZiwgZmZpX2Nsb3N1cmVfb3NmKTogTWFyayBoaWRkZW4uCisJKGxvYWRfdGFibGUpOiBIYW5kbGUgMTI4LWJpdCBsb25nIGRvdWJsZS4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0NC5jOiBBZGQgLW1pZWVlIGZvciBhbHBoYS4KKworMjAwNy0wNC0wNiAgVG9tIFRyb21leSAgPHRyb21leUByZWRoYXQuY29tPgorCisJUFIgbGliZmZpLzMxNDkxOgorCSogUkVBRE1FOiBGaXhlZCBidWcgaW4gZXhhbXBsZS4KKworMjAwNy0wNC0wMyAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIHNyYy9jbG9zdXJlcy5jOiBJbmNsdWRlIHN5cy9zdGF0ZnMuaC4KKwkoX0dOVV9TT1VSQ0UpOiBEZWZpbmUgb24gTGludXguCisJKEZGSV9NTUFQX0VYRUNfU0VMSU5VWCk6IERlZmluZS4KKwkoc2VsaW51eF9lbmFibGVkKTogTmV3IHZhcmlhYmxlLgorCShzZWxpbnV4X2VuYWJsZWRfY2hlY2spOiBOZXcgZnVuY3Rpb24uCisJKGlzX3NlbGludXhfZW5hYmxlZCk6IERlZmluZS4KKwkoZGxtbWFwKTogVXNlIGl0LgorCisyMDA3LTAzLTI0ICBVcm9zIEJpemphayAgPHViaXpqYWtAZ21haWwuY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2ZsMi5jIChyZXR1cm5fZmwpOiBNYXJrIGFzIHN0YXRpYy4KKwlVc2UgJ3ZvbGF0aWxlIGZsb2F0IHN1bScgdG8gY3JlYXRlIHN1bSBvZiBmbG9hdHMgdG8gYXZvaWQgZmFsc2UKKwluZWdhdGl2ZSBkdWUgdG8gZXhjZXNzIHByZWNpc2lvbiBvbiBpeDg2IHRhcmdldHMuCisJKG1haW4pOiBEaXR0by4KKworMjAwNy0wMy0wOCAgQWxleGFuZHJlIE9saXZhICA8YW9saXZhQHJlZGhhdC5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmbHVzaF9pY2FjaGUpOiBGaXggbGVmdC1vdmVyIGZyb20gcHJldmlvdXMKKwlwYXRjaC4KKwkoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBSZW1vdmUgdW5uZWVkZWQgY2FzdHMuICBBZGQgbmVlZGVkIG9uZXMuCisKKzIwMDctMDMtMDcgIEFsZXhhbmRyZSBPbGl2YSAgPGFvbGl2YUByZWRoYXQuY29tPgorCisJKiBpbmNsdWRlL2ZmaS5oLmluIChmZmlfY2xvc3VyZV9hbGxvYywgZmZpX2Nsb3N1cmVfZnJlZSk6IE5ldy4KKwkoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBOZXcuCisJKGZmaV9wcmVwX3Jhd19jbG9zdXJlX2xvYyk6IE5ldy4KKwkoZmZpX3ByZXBfamF2YV9yYXdfY2xvc3VyZV9sb2MpOiBOZXcuCisJKiBzcmMvY2xvc3VyZXMuYzogTmV3IGZpbGUuCisJKiBzcmMvZGxtYWxsb2MuYyBbRkZJX01NQVBfRVhFQ19XUklUXSAoc3RydWN0IG1hbGxvY19zZWdtZW50KToKKwlSZXBsYWNlIHNmbGFncyB3aXRoIGV4ZWNfb2Zmc2V0LgorCVtGRklfTU1BUF9FWEVDX1dSSVRdIChtbWFwX2V4ZWNfb2Zmc2V0LCBhZGRfc2VnbWVudF9leGVjX29mZnNldCwKKwlzdWJfc2VnbWVudF9leGVjX29mZnNldCk6IE5ldyBtYWNyb3MuCisJKGdldF9zZWdtZW50X2ZsYWdzLCBzZXRfc2VnbWVudF9mbGFncywgY2hlY2tfc2VnbWVudF9tZXJnZSk6IE5ldworCW1hY3Jvcy4KKwkoaXNfbW1hcHBlZF9zZWdtZW50LCBpc19leHRlcm5fc2VnbWVudCk6IFVzZSBnZXRfc2VnbWVudF9mbGFncy4KKwkoYWRkX3NlZ21lbnQsIHN5c19hbGxvYywgY3JlYXRlX21zcGFjZSwgY3JlYXRlX21zcGFjZV93aXRoX2Jhc2UsCisJZGVzdHJveV9tc3BhY2UpOiBVc2UgbmV3IG1hY3Jvcy4KKwkoc3lzX2FsbG9jKTogU2lsZW5jZSB3YXJuaW5nLgorCSogTWFrZWZpbGUuYW0gKGxpYmZmaV9sYV9TT1VSQ0VTKTogQWRkIHNyYy9jbG9zdXJlcy5jLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBzcmMvcHJlcF9jaWYgW0ZGSV9DTE9TVVJFU10gKGZmaV9wcmVwX2Nsb3N1cmUpOiBJbXBsZW1lbnQgaW4KKwl0ZXJtcyBvZiBmZmlfcHJlcF9jbG9zdXJlX2xvYy4KKwkqIHNyYy9yYXdfYXBpLmMgKGZmaV9wcmVwX3Jhd19jbG9zdXJlX2xvYyk6IFJlbmFtZWQgYW5kIGFkanVzdGVkCisJZnJvbS4uLgorCShmZmlfcHJlcF9yYXdfY2xvc3VyZSk6IC4uLiB0aGlzLiAgUmUtaW1wbGVtZW50IGluIHRlcm1zIG9mIHRoZQorCXJlbmFtZWQgdmVyc2lvbi4KKwkqIHNyYy9qYXZhX3Jhd19hcGkgKGZmaV9wcmVwX2phdmFfcmF3X2Nsb3N1cmVfbG9jKTogUmVuYW1lZCBhbmQKKwlhZGp1c3RlZCBmcm9tLi4uCisJKGZmaV9wcmVwX2phdmFfcmF3X2Nsb3N1cmUpOiAuLi4gdGhpcy4gIFJlLWltcGxlbWVudCBpbiB0ZXJtcyBvZgorCXRoZSByZW5hbWVkIHZlcnNpb24uCisJKiBzcmMvYWxwaGEvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogUmVuYW1lZCBmcm9tCisJKGZmaV9wcmVwX2Nsb3N1cmUpOiAuLi4gdGhpcy4KKwkqIHNyYy9wYS9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvY3Jpcy9mZmkuYzogTGlrZXdpc2UuICBBZGp1c3QuCisJKiBzcmMvZnJ2L2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy9pYTY0L2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy9taXBzL2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYzogTGlrZXdpc2UuCisJKiBzcmMvczM5MC9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvc2gvZmZpLmM6IExpa2V3aXNlLgorCSogc3JjL3NoNjQvZmZpLmM6IExpa2V3aXNlLgorCSogc3JjL3NwYXJjL2ZmaS5jOiBMaWtld2lzZS4KKwkqIHNyYy94ODYvZmZpNjQuYzogTGlrZXdpc2UuCisJKiBzcmMveDg2L2ZmaS5jOiBMaWtld2lzZS4KKwkoRkZJX0lOSVRfVFJBTVBPTElORSk6IEFkanVzdC4KKwkoZmZpX3ByZXBfcmF3X2Nsb3N1cmVfbG9jKTogUmVuYW1lZCBhbmQgYWRqdXN0ZWQgZnJvbS4uLgorCShmZmlfcHJlcF9yYXdfY2xvc3VyZSk6IC4uLiB0aGlzLgorCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogUmVuYW1lZCBmcm9tCisJKGZmaV9wcmVwX2Nsb3N1cmUpOiAuLi4gdGhpcy4KKwkoZmx1c2hfaWNhY2hlKTogQWRqdXN0LgorCisyMDA3LTAzLTA3ICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAcmVkaGF0LmNvbT4KKworCSogc3JjL2RsbWFsbG9jLmM6IE5ldyBmaWxlLCBpbXBvcnRlZCB2ZXJzaW9uIDIuOC4zIG9mIERvdWcKKwlMZWEncyBtYWxsb2MuCisKKzIwMDctMDMtMDEgIEJyb29rcyBNb3NlcyAgPGJyb29rcy5tb3Nlc0Bjb2Rlc291cmNlcnkuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQWRkIGR1bW15IGluc3RhbGwtcGRmIHRhcmdldC4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlCisKKzIwMDctMDItMTMgIEFuZHJlYXMgS3JlYmJlbCAgPGtyZWJiZWwxQGRlLmlibS5jb20+CisKKwkqIHNyYy9zMzkwL2ZmaS5jIChmZmlfcHJlcF9hcmdzLCBmZmlfcHJlcF9jaWZfbWFjaGRlcCwKKwlmZmlfY2xvc3VyZV9oZWxwZXJfU1lTVik6IEFkZCBsb25nIGRvdWJsZSBoYW5kbGluZy4KKworMjAwNy0wMi0wMiAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2xpbnV4NjQuUyAoZmZpX2NhbGxfTElOVVg2NCk6IE1vdmUgcmVzdG9yZSBvZiByMgorCWltbWVkaWF0ZWx5IGFmdGVyIGJjdHJsIGluc3RydWN0aW9uLgorCisyMDA3LTAxLTE4ICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGFsbC1yZWN1cnNpdmUsIGluc3RhbGwtcmVjdXJzaXZlLAorCW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSwgY2xlYW4tcmVjdXJzaXZlLCBkaXN0Y2xlYW4tcmVjdXJzaXZlLAorCW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlKTogQWRkIG1pc3NpbmcgdGFyZ2V0cy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisyMDA2LTEyLTE0ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXoub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBUQVJHRVQgZm9yIHg4Nl82NC0qLWRhcndpbiouCisJKiBNYWtlZmlsZS5hbSAobm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTKTogQWRkIHJ1bGVzIGZvciA2NC1iaXQgc291cmNlcworCWZvciBYODZfREFSV0lOLgorCSogc3JjL3g4Ni9mZml0YXJnZXQuaDogU2V0IHRyYW1wb2xpbmUgc2l6ZSBmb3IgeDg2XzY0LSotZGFyd2luKi4KKwkqIHNyYy94ODYvZGFyd2luNjQuUzogTmV3IGZpbGUgZm9yIHg4Nl82NC0qLWRhcndpbiogc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogaW5jbHVkZS9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0X2ZmaV9jYWxsLmNjOiBOZXcgdGVzdCBjYXNlIGZvcgorCWZmaV9jYWxsIG9ubHkuCisKKzIwMDYtMTItMTMgIEFuZHJlYXMgVG9ibGVyIDxhLnRvYmxlckBzY2h3ZWl6Lm9yZz4KKworCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZSB3aXRoIGFjbG9jYWwgLUkgLi4gYXMgd3JpdHRlbiBpbiB0aGUKKwlNYWtlZmlsZS5hbS4KKworMjAwNi0xMC0zMSAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BhcHBsZS5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyAoZGFyd2luX2FkanVzdF9hZ2dyZWdhdGVfc2l6ZXMpOiBOZXcuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogQ2FsbCBkYXJ3aW5fYWRqdXN0X2FnZ3JlZ2F0ZV9zaXplcyBmb3IKKwlEYXJ3aW4uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYzogUmVtb3ZlIERhcndpbiBYRkFJTC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jOiBSZW1vdmUgRGFyd2luIFhGQUlMLgorCisyMDA2LTEwLTEwICBQYW9sbyBCb256aW5pICA8Ym9uemluaUBnbnUub3JnPgorCSAgICBTYW5kcm8gVG9sYWluaSAgPHRvbGFpbmlAbGliZXJvLml0PgorCisJKiBjb25maWd1cmUuYWMgW2kqODYtKi1kYXJ3aW4qXTogU2V0IFg4Nl9EQVJXSU4gc3ltYm9sIGFuZAorCWNvbmRpdGlvbmFsLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIE1ha2VmaWxlLmFtIChub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMpIFtYODZfREFSV0lOXTogTmV3IGNhc2UuCisJKEVYVFJBX0RJU1QpOiBBZGQgc3JjL3g4Ni9kYXJ3aW4uUy4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KKworCSogc3JjL3g4Ni9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApIFtYODZfREFSV0lOXTogVHJlYXQgbGlrZQorCVg4Nl9XSU4zMiwgYW5kIGFkZGl0aW9uYWxseSBhbGlnbiBzdGFjayB0byAxNiBieXRlcy4KKwkqIHNyYy94ODYvZGFyd2luLlM6IE5ldywgYmFzZWQgb24gc3lzdi5TLgorCSogc3JjL3ByZXBfY2lmLmMgKGZmaV9wcmVwX2NpZikgW1g4Nl9EQVJXSU5dOiBBbGlnbiA+IDgtYnl0ZSBzdHJ1Y3RzLgorCisyMDA2LTA5LTEyICBEYXZpZCBEYW5leSAgPGRkYW5leUBhdnRyZXguY29tPgorCisJUFIgbGliZmZpLzIzOTM1CisJKiBpbmNsdWRlL01ha2VmaWxlLmFtOiBJbnN0YWxsIGJvdGggZmZpLmggYW5kIGZmaXRhcmdldC5oIGluCisJJChsaWJkaXIpL2djYy8kKHRhcmdldF9hbGlhcykvJChnY2NfdmVyc2lvbikvaW5jbHVkZS4KKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkIGZvciBhdXRvbWFrZSAxLjkuNi4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KKworMjAwNi0wOC0xNyAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiBpbmNsdWRlL2ZmaV9jb21tb24uaCAoc3RydWN0KTogUmV2ZXJ0IGFjY2lkZW50YWwgY29tbWl0LgorCisyMDA2LTA4LTE1ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIGluY2x1ZGUvZmZpX2NvbW1vbi5oOiBSZW1vdmUgbGludCBkaXJlY3RpdmVzLgorCSogaW5jbHVkZS9mZmkuaC5pbjogTGlrZXdpc2UuCisKKzIwMDYtMDctMjUgIFRvcnN0ZW4gU2Nob2VuZmVsZCAgPGthZmZlZXRpc2NoQGdteC5kZT4KKworCSogaW5jbHVkZS9mZmkuaC5pbiAoZmZpX3R5cGVfdWxvbmcsIGZmaV90eXBlX3Nsb25nKTogRGVmaW5lIGNvcnJlY3RseQorCWZvciAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWwuYzogTmV3IHRlc3QgY2FzZS4KKworMjAwNi0wNy0xOSAgRGF2aWQgRGFuZXkgIDxkZGFuZXlAYXZ0cmV4LmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm42LmM6IFJlbW92ZSB4ZmFpbCBmb3IgbWlwcywKKwl4ZmFpbCByZW1haW5zIGZvciBtaXBzNjQuCisKKzIwMDYtMDUtMjMgIENhcmxvcyBPJ0RvbmVsbCAgPGNhcmxvc0Bjb2Rlc291cmNlcnkuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQWRkIGluc3RhbGwtaHRtbCB0YXJnZXQuIEFkZCBpbnN0YWxsLWh0bWwgdG8gLlBIT05ZCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDA2LTA1LTE4ICBKb2huIERhdmlkIEFuZ2xpbiAgPGRhdmUuYW5nbGluQG5yYy1jbnJjLmdjLmNhPgorCisJKiBwYS9mZmkuYyAoZmZpX3ByZXBfYXJnc19wYTMyKTogTG9hZCBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgZnJvbQorCXN0YWNrIHNsb3QuCisKKzIwMDYtMDQtMjIgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogUkVBRE1FOiBSZW1vdmUgbm90aWNlIGFib3V0ICdDcmF6eSBDb21tZW50cycuCisJKiBzcmMvZGVidWcuYzogUmVtb3ZlIGxpbnQgZGlyZWN0aXZlcy4gQ2xlYW51cCB3aGl0ZSBzcGFjZXMuCisJKiBzcmMvamF2YV9yYXdfYXBpLmM6IExpa2V3aXNlLgorCSogc3JjL3ByZXBfY2lmLmM6IExpa2V3aXNlLgorCSogc3JjL3Jhd19hcGkuYzogTGlrZXdpc2UuCisJKiBzcmMvZmZpdGVzdC5jOiBEZWxldGUuIE5vIGxvbmdlciBuZWVkZWQsIGFsbCB0ZXN0IGNhc2VzIG1pZ3JhdGVkCisJdG8gdGhlIHRlc3RzdWl0ZS4KKwkqIHNyYy9hcm0vZmZpLmM6IFJlbW92ZSBsaW50IGRpcmVjdGl2ZXMuCisJKiBzcmMvbTMyci9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvcGEvZmZpLmM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvZmZpLmM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jOiBMaWtld2lzZS4KKwkqIHNyYy9zaC9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvc2g2NC9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMveDg2L2ZmaS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcHJvbW90aW9uLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDEuYzogTGlrZXdpc2UuCisKKzIwMDYtMDQtMTMgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL3BhL2hwdXgzMi5TOiBDb3JyZWN0IHVud2luZCBvZmZzZXQgY2FsY3VsYXRpb24gZm9yCisJZmZpX2Nsb3N1cmVfcGEzMi4KKwkqIHNyYy9wYS9saW51eC5TOiBMaWtld2lzZS4KKworMjAwNi0wNC0xMiAgSmFtZXMgRSBXaWxzb24gIDx3aWxzb25Ac3BlY2lmaXguY29tPgorCisJUFIgbGliZ2NqLzI2NDgzCisJKiBzcmMvaWE2NC9mZmkuYyAoc3RmX3NwaWxsLCBsZGZfZmlsbCk6IFJld3JpdGUgYXMgbWFjcm9zLgorCShoZmFfdHlwZV9sb2FkKTogQ2FsbCBzdGZfc3BpbGwuCisJKGhmYV90eXBlX3N0b3JlKTogQ2FsbCBsZGZfZmlsbC4KKwkoZmZpX2NhbGwpOiBBZGp1c3QgY2FsbHMgdG8gYWJvdmUgcm91dGluZXMuICBBZGQgbG9jYWwgdGVtcHMgZm9yCisJbWFjcm8gcmVzdWx0LgorCisyMDA2LTA0LTEwICBNYXR0aGlhcyBLbG9zZSAgPGRva29AZGViaWFuLm9yZz4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwIChsaWJmZmktaW5pdCk6IFJlY29nbml6ZSBtdWx0aWxpYgorCWRpcmVjdG9yeSBuYW1lcyBjb250YWluaW5nIHVuZGVyc2NvcmVzLgorCisyMDA2LTA0LTA3ICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkBzcGVjaWZpeC5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDQuYzogTmV3IHRlc3RjYXNlLgorCisyMDA2LTA0LTA1ICBKb2huIERhdmlkIEFuZ2xpbiAgPGRhdmUuYW5nbGluQG5yYy1jbnJjLmdjLmNhPgorCSAgICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgUEFfSFBVWCBwb3J0LgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCisJKiBjb25maWd1cmUuYWM6IEFkZCBQQV9IUFVYIHJ1bGVzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogc3JjL3BhL2ZmaXRhcmdldC5oOiBSZW5hbWUgbGludXggdGFyZ2V0IHRvIFBBX0xJTlVYLgorCUFkZCBQQV9IUFVYIGFuZCBQQTY0X0hQVVguCisJUmVuYW1lIEZGSV9MSU5VWCBBQkkgdG8gRkZJX1BBMzIgQUJJLgorCShGRklfVFJBTVBPTElORV9TSVpFKTogRGVmaW5lIGZvciAzMi1iaXQgSFAtVVggdGFyZ2V0cy4KKwkoRkZJX1RZUEVfU01BTExfU1RSVUNUMik6IERlZmluZS4KKwkoRkZJX1RZUEVfU01BTExfU1RSVUNUNCk6IExpa2V3aXNlLgorCShGRklfVFlQRV9TTUFMTF9TVFJVQ1Q4KTogTGlrZXdpc2UuCisJKEZGSV9UWVBFX1NNQUxMX1NUUlVDVDMpOiBSZWRlZmluZS4KKwkoRkZJX1RZUEVfU01BTExfU1RSVUNUNSk6IExpa2V3aXNlLgorCShGRklfVFlQRV9TTUFMTF9TVFJVQ1Q2KTogTGlrZXdpc2UuCisJKEZGSV9UWVBFX1NNQUxMX1NUUlVDVDcpOiBMaWtld2lzZS4KKwkqIHNyYy9wYS9mZmkuYyAoUk9VTkRfRE9XTik6IERlbGV0ZS4KKwkoZmxkdywgZnN0dywgZmxkZCwgZnN0ZCk6IFVzZSAnX19hc21fXycuCisJKGZmaV9zdHJ1Y3RfdHlwZSk6IEFkZCBzdXBwb3J0IGZvciBGRklfVFlQRV9TTUFMTF9TVFJVQ1QyLAorCUZGSV9UWVBFX1NNQUxMX1NUUlVDVDQgYW5kIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDguCisJKGZmaV9wcmVwX2FyZ3NfTElOVVgpOiBSZW5hbWUgdG8gZmZpX3ByZXBfYXJnc19wYTMyLiBVcGRhdGUgY29tbWVudC4KKwlTaW1wbGlmeSBpbmNyZW1lbnRpbmcgb2Ygc3RhY2sgc2xvdCB2YXJpYWJsZS4gQ2hhbmdlIHR5cGUgb2YgbG9jYWwKKwknbicgdG8gdW5zaWduZWQgaW50LgorCShmZmlfc2l6ZV9zdGFja19MSU5VWCk6IFJlbmFtZSB0byBmZmlfc2l6ZV9zdGFja19wYTMyLiBIYW5kbGUgbG9uZworCWRvdWJsZSBvbiBQQV9IUFVYLgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IExpa2V3aXNlLgorCShmZmlfY2FsbCk6IExpa2V3aXNlLgorCShmZmlfY2xvc3VyZV9pbm5lcl9MSU5VWCk6IFJlbmFtZSB0byBmZmlfY2xvc3VyZV9pbm5lcl9wYTMyLiBDaGFuZ2UKKwlyZXR1cm4gdHlwZSB0byBmZmlfc3RhdHVzLiBTaW1wbGlmeSBpbmNyZW1lbnRpbmcgb2Ygc3RhY2sgc2xvdAorCXZhcmlhYmxlLiBPbmx5IGNvcHkgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnQgcmVnaXN0ZXJzIHdoZW4gUEFfTElOVVgKKwlpcyB0cnVlLiBSZWZvcm1hdCBkZWJ1ZyBzdGF0ZW1lbnQuCisJQWRkIHN1cHBvcnQgZm9yIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDIsIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDQgYW5kCisJRkZJX1RZUEVfU01BTExfU1RSVUNUOC4KKwkoZmZpX2Nsb3N1cmVfTElOVVgpOiBSZW5hbWUgdG8gZmZpX2Nsb3N1cmVfcGEzMi4gQWRkICdleHRlcm4nIHRvCisJZGVjbGFyYXRpb24uCisJKGZmaV9wcmVwX2Nsb3N1cmUpOiBNYWtlIGxpbnV4IHRyYW1wb2xpbmUgY29uZGl0aW9uYWwgb24gUEFfTElOVVguCisJQWRkIG5vcHMgdG8gY2FjaGUgZmx1c2guICBBZGQgdHJhbXBvbGluZSBmb3IgUEFfSFBVWC4KKwkqIHNyYy9wYS9ocHV4MzIuUzogTmV3IGZpbGUuCisJKiBzcmMvcGEvbGludXguUyAoZmZpX2NhbGxfTElOVVgpOiBSZW5hbWUgdG8gZmZpX2NhbGxfcGEzMi4gUmVuYW1lCisJZmZpX3ByZXBfYXJnc19MSU5VWCB0byBmZmlfcHJlcF9hcmdzX3BhMzIuCisJTG9jYWxpemUgbGFiZWxzLiBBZGQgc3VwcG9ydCBmb3IgMiwgNCBhbmQgOC1ieXRlIHNtYWxsIHN0cnVjdHMuIEhhbmRsZQorCXVuYWxpZ25lZCBkZXN0aW5hdGlvbnMgaW4gMywgNSwgNiBhbmQgNy1ieXRlIHNtYWxsIHN0cnVjdHMuIE9yZGVyCisJYXJndW1lbnQgdHlwZSBjaGVja3Mgc28gdGhhdCBjb21tb24gYXJndW1lbnQgdHlwZXMgYXBwZWFyIGZpcnN0LgorCShmZmlfY2xvc3VyZV9MSU5VWCk6IFJlbmFtZSB0byBmZmlfY2xvc3VyZV9wYTMyLiBSZW5hbWUKKwlmZmlfY2xvc3VyZV9pbm5lcl9MSU5VWCB0byBmZmlfY2xvc3VyZV9pbm5lcl9wYTMyLgorCisyMDA2LTAzLTI0ICBBbGFuIE1vZHJhICA8YW1vZHJhQGJpZ3BvbmQubmV0LmF1PgorCisJKiBzcmMvcG93ZXJwYy9mZml0YXJnZXQuaCAoZW51bSBmZmlfYWJpKTogQWRkIEZGSV9MSU5VWC4gIERlZmF1bHQKKwlmb3IgMzItYml0IHVzaW5nIElCTSBleHRlbmRlZCBkb3VibGUgZm9ybWF0LiAgRml4IEZGSV9MQVNUX0FCSS4KKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9hcmdzX1NZU1YpOiBIYW5kbGUgbGludXggdmFyaWFudCBvZgorCUZGSV9UWVBFX0xPTkdET1VCTEUuCisJKGZmaV9wcmVwX2FyZ3M2NCk6IEFzc2VydCB1c2luZyBJQk0gZXh0ZW5kZWQgZG91YmxlLgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IERvbid0IG11bmdlIEZGSV9UWVBFX0xPTkdET1VCTEUgdHlwZS4KKwlIYW5kbGUgRkZJX0xJTlVYIEZGSV9UWVBFX0xPTkdET1VCTEUgcmV0dXJuIGFuZCBhcmdzLgorCShmZmlfY2FsbCk6IEhhbmRsZSBGRklfTElOVVguCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWKTogTm9uIEZGSV9MSU5VWCBsb25nIGRvdWJsZSByZXR1cm4gbmVlZHMKKwlncHIzIHJldHVybiBwb2ludGVyIGFzIGZvciBzdHJ1Y3QgcmV0dXJuLiAgSGFuZGxlIEZGSV9MSU5VWAorCUZGSV9UWVBFX0xPTkdET1VCTEUgcmV0dXJuIGFuZCBhcmdzLiAgRG9uJ3QgaW5jcmVtZW50ICJuZiIKKwl1bm5lY2Vzc2FyaWx5LgorCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUyAoZmZpX2Nsb3N1cmVfU1lTVik6IExvYWQgYm90aCBmMSBhbmQgZjIKKwlmb3IgRkZJX1RZUEVfTE9OR0RPVUJMRS4gIE1vdmUgZXBpbG9ndWUgaW5zbnMgaW50byBjYXNlIHRhYmxlLgorCURvbid0IHVzZSByNiBhcyBwb2ludGVyIHRvIHJlc3VsdHMsIGluc3RlYWQgdXNlIHNwIG9mZnNldC4gIERvbid0CisJbWFrZSBhIHNwZWNpYWwgY2FsbCB0byBsb2FkIGxyIHdpdGggY2FzZSB0YWJsZSBhZGRyZXNzLCBpbnN0ZWFkCisJdXNlIG9mZnNldCBmcm9tIHByZXZpb3VzIGNhbGwuCisJKiBzcmMvcG93ZXJwYy9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBTYXZlIGxvbmcgZG91YmxlIHJldHVybi4KKwkqIHNyYy9wb3dlcnBjL2xpbnV4NjQuUyAoZmZpX2NhbGxfTElOVVg2NCk6IFNpbXBsaWZ5IGxvbmcgZG91YmxlCisJcmV0dXJuLgorCisyMDA2LTAzLTE1ICBLYXogS29qaW1hICA8a2tvamltYUBnY2MuZ251Lm9yZz4KKworCSogc3JjL3NoNjQvZmZpLmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogSGFuZGxlIGZsb2F0IGFyZ3VtZW50cworCXBhc3NlZCB3aXRoIEZQIHJlZ2lzdGVycyBjb3JyZWN0bHkuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWKTogTGlrZXdpc2UuCisJKiBzcmMvc2g2NC9zeXN2LlM6IExpa2V3aXNlLgorCisyMDA2LTAzLTAxICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0LmNjIChjbG9zdXJlX3Rlc3RfZm4pOiBNYXJrIGNpZiwKKwlhcmdzIGFuZCB1c2VyZGF0YSB1bnVzZWQuCisJKGNsb3N1cmVfdGVzdF9mbjEpOiBNYXJrIGNpZiBhbmQgdXNlcmRhdGEgdW51c2VkLgorCShtYWluKTogUmVtb3ZlIHVudXNlZCByZXMuCisKKzIwMDYtMDItMjggIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2NhbGwuZXhwOiBBZGp1c3QgRlNGIGFkZHJlc3MuIEFkZCB0ZXN0IHJ1bnMgZm9yCisJLU8yLCAtTzMsIC1PcyBhbmQgdGhlIHdhcm5pbmcgZmxhZ3MgLVcgLVdhbGwuCisJKiB0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvc3BlY2lhbC5leHA6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaDogQWRkIGFuIF9fVU5VU0VEX18gbWFjcm8gdG8gbWFyaworCXVudXNlZCBwYXJhbWV0ZXIgdW51c2VkIGZvciBnY2Mgb3IgZWxzZSBkbyBub3RoaW5nLgorCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL2ZmaXRlc3RjeHguaDogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzEyYnl0ZS5jIChjbHNfc3RydWN0XzEyYnl0ZV9nbik6IE1hcmsgY2lmCisJYW5kIHVzZXJkYXRhIHVudXNlZC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTZieXRlLmMgKGNsc19zdHJ1Y3RfMTZieXRlX2duKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE4Ynl0ZS5jIChjbHNfc3RydWN0XzE4Ynl0ZV9nbik6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYyAoY2xzX3N0cnVjdF8xOWJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jIChjbHNfc3RydWN0XzFfMWJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlLmMgKGNsc19zdHJ1Y3RfMjBieXRlX2duKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYyAoY2xzX3N0cnVjdF8yMGJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjRieXRlLmMgKGNsc19zdHJ1Y3RfMjRieXRlX2duKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmMgKGNsc19zdHJ1Y3RfMmJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM18xYnl0ZS5jIChjbHNfc3RydWN0XzNfMWJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUxLmMgKGNsc19zdHJ1Y3RfM2J5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUyLmMgKGNsc19zdHJ1Y3RfM2J5dGVfZ24xKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYyAoY2xzX3N0cnVjdF80XzFieXRlX2duKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRieXRlLmMgKGNsc19zdHJ1Y3RfNGJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNV8xX2J5dGUuYyAoY2xzX3N0cnVjdF81Ynl0ZV9nbik6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181Ynl0ZS5jIChjbHNfc3RydWN0XzVieXRlX2duKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jIChjbHNfc3RydWN0XzY0Ynl0ZV9nbik6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182XzFfYnl0ZS5jIChjbHNfc3RydWN0XzZieXRlX2duKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZieXRlLmMgKGNsc19zdHJ1Y3RfNmJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfN18xX2J5dGUuYyAoY2xzX3N0cnVjdF83Ynl0ZV9nbik6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183Ynl0ZS5jIChjbHNfc3RydWN0XzdieXRlX2duKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmMgKGNsc19zdHJ1Y3RfOGJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmMgKGNsc19zdHJ1Y3RfOWJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUyLmMgKGNsc19zdHJ1Y3RfOWJ5dGVfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZG91YmxlLmMgKGNsc19zdHJ1Y3RfYWxpZ25fZ24pOgorCUxpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9mbG9hdC5jIChjbHNfc3RydWN0X2FsaWduX2duKToKKwlMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jIChjbHNfc3RydWN0X2FsaWduX2duKToKKwlMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jIChjbHNfc3RydWN0X2FsaWduX2ZuKTogQ2FzdAorCXZvaWQqIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCisJKG1haW4pOiBMaWtld2lzZS4KKwkoY2xzX3N0cnVjdF9hbGlnbl9nbik6IE1hcmsgY2lmIGFuZCB1c2VyZGF0YSB1bnVzZWQuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQxNi5jIChjbHNfc3RydWN0X2FsaWduX2duKToKKwlMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMgKGNsc19zdHJ1Y3RfYWxpZ25fZ24pOgorCUxpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYyAoY2xzX3N0cnVjdF9hbGlnbl9nbik6CisJTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jIChjbHNfc3RydWN0X2FsaWduX2duKToKKwlMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmMgKGNsc19zdHJ1Y3RfYWxpZ25fZ24pOgorCUxpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGUuYyAoY2xzX3JldF9kb3VibGVfZm4pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZmxvYXQuYyAoY2xzX3JldF9mbG9hdF9mbik6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zY2hhci5jICh0ZXN0X2Z1bmNfZ24pOiBNYXJrIGNpZiBhbmQKKwlkYXRhIHVudXNlZC4KKwkobWFpbik6IENhc3QgcmVzX2NhbGwgdG8gc2lsZW5jZSBnY2MuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydC5jICh0ZXN0X2Z1bmNfZ24pOiBNYXJrIGNpZiBhbmQKKwlkYXRhIHVudXNlZC4KKwkobWFpbik6IENhc3QgcmVzX2NhbGwgdG8gc2lsZW5jZSBnY2MuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydGNoYXIuYyAodGVzdF9mdW5jX2duKTogTWFyayBjaWYKKwlhbmQgZGF0YSB1bnVzZWQuCisJKG1haW4pOiBDYXN0IHJlc19jYWxsIHRvIHNpbGVuY2UgZ2NjLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91Y2hhci5jICh0ZXN0X2Z1bmNfZ24pOiBNYXJrIGNpZiBhbmQKKwlkYXRhIHVudXNlZC4KKwkobWFpbik6IENhc3QgcmVzX2NhbGwgdG8gc2lsZW5jZSBnY2MuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydC5jICh0ZXN0X2Z1bmNfZ24pOiBNYXJrIGNpZiBhbmQKKwlkYXRhIHVudXNlZC4KKwkobWFpbik6IENhc3QgcmVzX2NhbGwgdG8gc2lsZW5jZSBnY2MuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydGNoYXIuYyAodGVzdF9mdW5jX2duKTogTWFyayBjaWYKKwlhbmQgZGF0YSB1bnVzZWQuCisJKG1haW4pOiBDYXN0IHJlc19jYWxsIHRvIHNpbGVuY2UgZ2NjLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zY2hhci5jIChjbHNfcmV0X3NjaGFyX2ZuKTogTWFyayBjaWYgYW5kCisJdXNlcmRhdGEgdW51c2VkLgorCShjbHNfcmV0X3NjaGFyX2ZuKTogQ2FzdCBwcmludGYgcGFyYW1ldGVyIHRvIHNpbGVuY2UgZ2NjLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zaW50LmMgKGNsc19yZXRfc2ludF9mbik6IE1hcmsgY2lmIGFuZAorCXVzZXJkYXRhIHVudXNlZC4KKwkoY2xzX3JldF9zaW50X2ZuKTogQ2FzdCBwcmludGYgcGFyYW1ldGVyIHRvIHNpbGVuY2UgZ2NjLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYyAoY2xzX3JldF9zc2hvcnRfZm4pOiBNYXJrIGNpZiBhbmQKKwl1c2VyZGF0YSB1bnVzZWQuCisJKGNsc19yZXRfc3Nob3J0X2ZuKTogQ2FzdCBwcmludGYgcGFyYW1ldGVyIHRvIHNpbGVuY2UgZ2NjLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191Y2hhci5jIChjbHNfcmV0X3VjaGFyX2ZuKTogIE1hcmsgY2lmIGFuZAorCXVzZXJkYXRhIHVudXNlZC4KKwkoY2xzX3JldF91Y2hhcl9mbik6IENhc3QgcHJpbnRmIHBhcmFtZXRlciB0byBzaWxlbmNlIGdjYy4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWludC5jIChjbHNfcmV0X3VpbnRfZm4pOiBNYXJrIGNpZiBhbmQKKwl1c2VyZGF0YSB1bnVzZWQuCisJKGNsc19yZXRfdWludF9mbik6IENhc3QgcHJpbnRmIHBhcmFtZXRlciB0byBzaWxlbmNlIGdjYy4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMgKGNsc19yZXRfdWxvbmdsb25nX2ZuKTogTWFyayBjaWYKKwlhbmQgdXNlcmRhdGEgdW51c2VkLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191c2hvcnQuYyAoY2xzX3JldF91c2hvcnRfZm4pOiBNYXJrIGNpZiBhbmQKKwl1c2VyZGF0YSB1bnVzZWQuCisJKGNsc19yZXRfdXNob3J0X2ZuKTogQ2FzdCBwcmludGYgcGFyYW1ldGVyIHRvIHNpbGVuY2UgZ2NjLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0LmMgKGZsb2F0aW5nKTogUmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDEuYyAobWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaS4KKwlDbGVhbnVwIHdoaXRlIHNwYWNlcy4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZWdpbnQuYyAoY2hlY2tpbmcpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGkuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdC5jIChjbHNfc3RydWN0X2NvbWJpbmVkX2duKTogTWFyaworCWNpZiBhbmQgdXNlcmRhdGEgdW51c2VkLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmMgKGNsc19zdHJ1Y3RfY29tYmluZWRfZ24pOgorCUxpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMC5jIChCX2duKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDIuYyAoQl9mbik6IEFkanVzdCBwcmludGYKKwlmb3JtYXR0ZXJzIHRvIHNpbGVuY2UgZ2NjLgorCShCX2duKTogTWFyayBjaWYgYW5kIHVzZXJkYXRhIHVudXNlZC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0My5jIChCX2duKTogTWFyayBjaWYgYW5kIHVzZXJkYXRhCisJdW51c2VkLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q0LmM6IE1lbnRpb24gcmVsYXRlZCBQUi4KKwkoQl9nbik6IE1hcmsgY2lmIGFuZCB1c2VyZGF0YSB1bnVzZWQuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYyAoQl9nbik6IE1hcmsgY2lmIGFuZCB1c2VyZGF0YQorCXVudXNlZC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jOiBNZW50aW9uIHJlbGF0ZWQgUFIuCisJKEJfZ24pOiBNYXJrIGNpZiBhbmQgdXNlcmRhdGEgdW51c2VkLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q3LmMgKEJfZ24pOiBNYXJrIGNpZiBhbmQgdXNlcmRhdGEKKwl1bnVzZWQuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDguYyAoQl9nbik6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q5LmMgKEJfZ24pOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9wcm9ibGVtMS5jIChzdHViKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcHlvYmpjLXRjLmMgKG1haW4pOiBDYXN0IHRoZSByZXN1bHQgdG8gc2lsZW5jZQorCWdjYy4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZmwyLmMgKHJldHVybl9mbCk6IEFkZCB0aGUgbm90ZSBtZW50aW9uZWQKKwlpbiB0aGUgbGFzdCBjb21taXQgZm9yIHRoaXMgdGVzdCBjYXNlIGluIHRoZSB0ZXN0IGNhc2UgaXRzZWxmLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4wLmMgKGNsb3N1cmVfdGVzdF9mbjApOiBNYXJrIGNpZiBhcworCXVudXNlZC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMS5jIChjbG9zdXJlX3Rlc3RfZm4xKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjIuYyAoY2xvc3VyZV90ZXN0X2ZuMik6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4zLmMgKGNsb3N1cmVfdGVzdF9mbjMpOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNC5jIChjbG9zdXJlX3Rlc3RfZm4wKTogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjUuYyAoY2xvc3VyZV90ZXN0X2ZuNSk6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm42LmMgKGNsb3N1cmVfdGVzdF9mbjApOiBMaWtld2lzZS4KKworMjAwNi0wMi0yMiAgS2F6IEtvamltYSAgPGtrb2ppbWFAZ2NjLmdudS5vcmc+CisKKwkqIHNyYy9zaC9zeXN2LlM6IEZpeCByZWdpc3RlciBudW1iZXJzIGluIHRoZSBGREUgZm9yCisJZmZpX2Nsb3N1cmVfU1lTVi4KKworMjAwNi0wMi0yMCAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2ZsMi5jIChyZXR1cm5fZmwpOiBSZW1vdmUgc3RhdGljCisJZGVjbGFyYXRpb24gdG8gYXZvaWQgYSBmYWxzZSBuZWdhdGl2ZSBvbiBpeDg2LiBTZWUgUFIzMjMuCisKKzIwMDYtMDItMTggIEtheiBLb2ppbWEgIDxra29qaW1hQGdjYy5nbnUub3JnPgorCisJKiBzcmMvc2gvZmZpLmMgKGZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCWFuZCBjYXN0IGludGVnZXIgdG8gdm9pZCAqIGlmIG5lZWRlZC4gIFVwZGF0ZSB0aGUgcG9pbnRlciB0bworCXRoZSBGUCByZWdpc3RlciBzYXZlZCBhcmVhIGNvcnJlY3RseS4KKworMjAwNi0wMi0xNyAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYzogWEZBSUwgdGhpcyB0ZXN0IHVudGlsIFBSMjU2MzAKKwlpcyBmaXhlZC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NC5jOiBMaWtld2lzZS4KKworMjAwNi0wMi0xNiAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2RibC5jOiBOZXcgdGVzdCBjYXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9mbC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZmwxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9mbDIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2ZsMy5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNi5jOiBMaWtld2lzZS4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmM6IFJlbW92ZSBmZmlfdHlwZV9teWxvbmcKKwlkZWZpbml0aW9uLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaDogQWRkIGZmaV90eXBlX215bG9uZyBkZWZpbml0aW9uCisJaGVyZSB0byBiZSB1c2VkIGJ5IG90aGVyIHRlc3QgY2FzZXMgdG9vLgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEwLmM6IE5ldyB0ZXN0IGNhc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDkuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDguYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDcuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYzogTGlrZXdpc2UuCisKKzIwMDYtMDEtMjEgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogY29uZmlndXJlLmFjOiBFbmFibGUgbGliZmZpIGZvciBzcGFyYzY0LSotZnJlZWJzZCouCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDYtMDEtMTggIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgorCisJKiBzcmMvcG93ZXJwYy9zeXN2LlMgKHNtc3RfdHdvX3JlZ2lzdGVyKTogRG9uJ3QgY2FsbCBfX2FzaGxkaTMsCisJaW5zdGVhZCBkbyB0aGUgc2hpZnRpbmcgaW5saW5lLgorCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUyAoZmZpX2Nsb3N1cmVfU1lTVik6IERvbid0IGNvbXB1dGUgJXI1CisJc2hpZnQgY291bnQgdW5jb25kaXRpb25hbGx5LiAgU2ltcGxpZnkgbG9hZCBzZXF1ZW5jZXMgZm9yIDEsIDIsIDMsIDQKKwlhbmQgOCBieXRlIHN0cnVjdHMsIGZvciB0aGUgcmVtYWluaW5nIHN0cnVjdCBzaXplcyBkb24ndCBjYWxsCisJX19sc2hyZGkzLCBpbnN0ZWFkIGRvIHRoZSBzaGlmdGluZyBpbmxpbmUuCisKKzIwMDUtMTItMDcgIFRoaWVtbyBTZXVmZXIgIDx0aHNAbmV0d29ya25vLmRlPgorCisJKiBzcmMvbWlwcy9mZml0YXJnZXQuaDogUmVtb3ZlIG9ic29sZXRlIHNnaWRlZnMuaCBpbmNsdWRlLiBBZGQKKwltaXNzaW5nIHBhcmVudGhlc2VzLgorCSogc3JjL21pcHMvbzMyLlMgKGZmaV9jYWxsX08zMik6IENvZGUgZm9ybWF0dGluZy4gRGVmaW5lCisJYW5kIHVzZSBBM19PRkYsIEZQX09GRiwgUkFfT0ZGLiBNaWNyby1vcHRpbWl6YXRpb25zLgorCShmZmlfY2xvc3VyZV9PMzIpOiBMaWtld2lzZSwgYnV0IHdpdGggbmV3bHkgZGVmaW5lZCBBM19PRkYyLAorCUEyX09GRjIsIEExX09GRjIsIEEwX09GRjIsIFJBX09GRjIsIEZQX09GRjIsIFMwX09GRjIsIEdQX09GRjIsCisJVjFfT0ZGMiwgVjBfT0ZGMiwgRkFfMV8xX09GRjIsIEZBXzFfMF9PRkYyLCBGQV8wXzFfT0ZGMiwKKwlGQV8wXzBfT0ZGMi4KKwkqIHNyYy9taXBzL2ZmaS5jIChmZmlfcHJlcF9hcmdzKTogQ29kZSBmb3JtYXR0aW5nLiBGaXgKKwllbmRpYW5uZXNzIGJ1Z3MuCisJKGZmaV9wcmVwX2Nsb3N1cmUpOiBJbXByb3ZlIHRyYW1wb2xpbmUgaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZy4KKwkoZmZpX2Nsb3N1cmVfbWlwc19pbm5lcl9PMzIpOiBGaXggZW5kaWFubmVzcyBidWdzLgorCisyMDA1LTEyLTAzICBBbGFuIE1vZHJhICA8YW1vZHJhQGJpZ3BvbmQubmV0LmF1PgorCisJKiBzcmMvcG93ZXJwYy9mZmkuYzogRm9ybWF0dGluZy4KKwkoZmZpX3ByZXBfYXJnc19TWVNWKTogQXZvaWQgcG9zc2libGUgYWxpYXNpbmcgcHJvYmxlbXMgYnkgdXNpbmcgdW5pb25zLgorCShmZmlfcHJlcF9hcmdzNjQpOiBMaWtld2lzZS4KKworMjAwNS0wOS0zMCAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BhcHBsZS5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cCAobGliZmZpX3RhcmdldF9jb21waWxlKTogRm9yCisJZGFyd2luLCB1c2UgLXNoYXJlZC1saWJnY2Mgbm90IC1sZ2NjX3MsIGFuZCBleHBsYWluIHdoeS4KKworMjAwNS0wOS0yNiAgVG9tIFRyb21leSAgPHRyb21leUByZWRoYXQuY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQxLmMgKHZhbHVlX3R5cGUpOiBOZXcgdHlwZWRlZi4KKwkoQ0FOQVJZKTogTmV3IGRlZmluZS4KKwkobWFpbik6IENoZWNrIGZvciByZXN1bHQgYnVmZmVyIG92ZXJmbG93LgorCSogc3JjL3Bvd2VycGMvbGludXg2NC5TOiBIYW5kbGUgbGludXg2NCBsb25nIGRvdWJsZSByZXR1cm5zLgorCSogc3JjL3Bvd2VycGMvZmZpLmMgKEZMQUdfUkVUVVJOU18xMjhCSVRTKTogTmV3IGNvbnN0YW50LgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEhhbmRsZSBsaW51eDY0IGxvbmcgZG91YmxlIHJldHVybnMuCisKKzIwMDUtMDgtMjUgIEFsYW4gTW9kcmEgIDxhbW9kcmFAYmlncG9uZC5uZXQuYXU+CisKKwlQUiB0YXJnZXQvMjM0MDQKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9hcmdzX1NZU1YpOiBDb3JyZWN0IHBsYWNlbWVudCBvZiBzdGFjaworCWhvbWVkIGZwIGFyZ3MuCisJKGZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXApOiBDb3JyZWN0IHN0YWNrIHNpemluZyBmb3Igc2FtZS4KKworMjAwNS0wOC0xMSAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYyAoSEFWRV9ISURERU5fVklTSUJJTElUWV9BVFRSSUJVVEUpOiBOZXcgdGVzdC4KKwkoQUhfQk9UVE9NKTogQWRkIEZGSV9ISURERU4gZGVmaW5pdGlvbi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIGZmaWNvbmZpZy5oLmluOiBSZWJ1aWx0LgorCSogc3JjL3Bvd2VycGMvZmZpLmMgKGhpZGRlbik6IFJlbW92ZS4KKwkoZmZpX2Nsb3N1cmVfTElOVVg2NCwgZmZpX3ByZXBfYXJnczY0LCBmZmlfY2FsbF9MSU5VWDY0LAorCWZmaV9jbG9zdXJlX2hlbHBlcl9MSU5VWDY0KTogVXNlIEZGSV9ISURERU4gaW5zdGVhZCBvZiBoaWRkZW4uCisJKiBzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUyAoZmZpX2Nsb3N1cmVfTElOVVg2NCwKKwkuZmZpX2Nsb3N1cmVfTElOVVg2NCk6IFVzZSBGRklfSElEREVOIGluc3RlYWQgb2YgLmhpZGRlbi4KKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9jbG9zdXJlX1NZU1YsIGZmaV9jbG9zdXJlX3Jhd19TWVNWKTogUmVtb3ZlLAorCWFkZCBGRklfSElEREVOIHRvIGl0cyBwcm90b3R5cGUuCisJKGZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIpOiBOZXcuCisJKiBzcmMveDg2L3N5c3YuUyAoZmZpX2Nsb3N1cmVfU1lTViwgZmZpX2Nsb3N1cmVfcmF3X1NZU1YpOiBOZXcuCisJKiBzcmMveDg2L3dpbjMyLlMgKGZmaV9jbG9zdXJlX1NZU1YsIGZmaV9jbG9zdXJlX3Jhd19TWVNWKTogTmV3LgorCisyMDA1LTA4LTEwICBBbGZyZWQgTS4gU3ptaWR0ICA8YW1zQGdudS5vcmc+CisKKwlQUiBsaWJmZmkvMjE4MTk6CisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBjb25maWd1cmUuYWM6IEhhbmRsZSBpKjg2LSotZ251Ki4KKworMjAwNS0wOC0wOSAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMgKGZmaV9jbG9zdXJlX1NZU1YpOiBVc2UKKwlEV19DRkFfb2Zmc2V0X2V4dGVuZGVkX3NmIHJhdGhlciB0aGFuCisJRFdfQ0ZBX0dOVV9uZWdhdGl2ZV9vZmZzZXRfZXh0ZW5kZWQuCisJKiBzcmMvcG93ZXJwYy9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBMaWtld2lzZS4KKworMjAwNS0wNy0yMiAgU1VHSU9LQSBUb3NoaW5vYnUgIDxzdWdpb2thQGl0b25ldC5jby5qcD4KKworCSogc3JjL3NoL3N5c3YuUyAoZmZpX2NhbGxfU1lTVik6IFN0b3AgYXJndW1lbnQgcG9wcGluZyBjb3JyZWN0bHkKKwlvbiBzaDMuCisJKGZmaV9jbG9zdXJlX1NZU1YpOiBDaGFuZ2UgdGhlIHN0YWNrIGxheW91dCBmb3Igc2gzIHN0cnVjdCBhcmd1bWVudC4KKwkqIHNyYy9zaC9mZmkuYyAoZmZpX3ByZXBfYXJncyk6IEZpeCBzaDMgYXJndW1lbnQgY29weSwgd2hlbiBpdCBpcworCXBhcnRpYWxseSBvbiByZWdpc3Rlci4KKwkoZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YpOiBMaWtld2lzZS4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBEb24ndCBzZXQgdG9vIG1hbnkgY2lmLT5mbGFncy4KKworMjAwNS0wNy0yMCAgS2F6IEtvamltYSAgPGtrb2ppbWFAZ2NjLmdudS5vcmc+CisKKwkqIHNyYy9zaC9mZmkuYyAoZmZpX2NhbGwpOiBIYW5kbGUgc21hbGwgc3RydWN0dXJlcyBjb3JyZWN0bHkuCisJUmVtb3ZlIGVtcHR5IGxpbmUuCisJKiBzcmMvc2g2NC9mZmkuYyAoc2ltcGxlX3R5cGUpOiBSZW1vdmUuCisJKHJldHVybl90eXBlKTogSGFuZGxlIHNtYWxsIHN0cnVjdHVyZXMgY29ycmVjdGx5LgorCShmZmlfcHJlcF9hcmdzKTogTGlrZXdpc2UuCisJKGZmaV9jYWxsKTogTGlrZXdpc2UuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWKTogTGlrZXdpc2UuCisJKiBzcmMvc2g2NC9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBIYW5kbGUgMSwgMiBhbmQgNC1ieXRlIHJldHVybi4KKwlFbWl0IHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgaWYgUElDIGFuZCByZW1vdmUgd3JvbmcgZGF0YWxhYmVsCisJcHJlZml4ZXMgZnJvbSBFSCBkYXRhLgorCisyMDA1LTA3LTE5ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIE1ha2VmaWxlLmFtIChub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMpOiBBZGQgUE9XRVJQQ19GUkVFQlNELgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCisJKiBjb25maWd1cmUuYWM6IEFkZCBQT1dFUlBDX0ZSRUVCU0QgcnVsZXMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBzcmMvcG93ZXJwYy9mZml0YXJnZXQuaDogQWRkIFBPV0VSUENfRlJFRUJTRCBydWxlcy4KKwkoRkZJX1NZU1ZfVFlQRV9TTUFMTF9TVFJVQ1QpOiBEZWZpbmUuCisJKiBzcmMvcG93ZXJwYy9mZmkuYzogQWRkIGZsYWdzIHRvIGhhbmRsZSBzbWFsbCBzdHJ1Y3R1cmUgcmV0dXJucworCWluIGZmaV9jYWxsX1NZU1YuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogSGFuZGxlIHNtYWxsIHN0cnVjdHVyZXMgZm9yIFNZU1YgNCBBQkkuCisJQWthIEZGSV9TWVNWLgorCShmZmlfY2xvc3VyZV9oZWxwZXJfU1lTVik6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUzogQWRkIHJldHVybiB0eXBlcyBmb3Igc21hbGwgc3RydWN0dXJlcy4KKwkqIHNyYy9wb3dlcnBjL3N5c3YuUzogQWRkIGJpdHMgdG8gaGFuZGxlIHNtYWxsIHN0cnVjdHVyZXMgZm9yCisJZmluYWwgU1lTViA0IEFCSS4KKworMjAwNS0wNy0xMCAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVfMV9ieXRlLmM6IE5ldyB0ZXN0IGZpbGUuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZfMV9ieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jOiBMaWtld2lzZS4KKworMjAwNS0wNy0wNSAgUmFuZG9scGggQ2h1bmcgIDx0YXVzcUBkZWJpYW4ub3JnPgorCisJKiBzcmMvcGEvZmZpLmMgKGZmaV9zdHJ1Y3RfdHlwZSk6IFJlbmFtZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1QxCisJYXMgRkZJX1RZUEVfU01BTExfU1RSVUNUMy4gIEJyZWFrIG91dCBoYW5kbGluZyBmb3IgNS03IGJ5dGUKKwlzdHJ1Y3R1cmVzLiAgS2lsbCBjb21waWxhdGlvbiB3YXJuaW5ncy4KKwkoZmZpX2Nsb3N1cmVfaW5uZXJfTElOVVgpOiBQcmludCByZXR1cm4gdmFsdWVzIGFzIGhleCBpbiBkZWJ1ZworCW1lc3NhZ2UuICBSZW5hbWUgRkZJX1RZUEVfU01BTExfU1RSVUNUMSBhcyBGRklfVFlQRV9TTUFMTF9TVFJVQ1QzLgorCVByb3Blcmx5IGhhbmRsZSA1LTcgYnl0ZSBzdHJ1Y3R1cmUgcmV0dXJucy4KKwkqIHNyYy9wYS9mZml0YXJnZXQuaCAoRkZJX1RZUEVfU01BTExfU1RSVUNUMSkKKwkoRkZJX1RZUEVfU01BTExfU1RSVUNUMik6IFJlbW92ZS4KKwkoRkZJX1RZUEVfU01BTExfU1RSVUNUMywgRkZJX1RZUEVfU01BTExfU1RSVUNUNSkKKwkoRkZJX1RZUEVfU01BTExfU1RSVUNUNiwgRkZJX1RZUEVfU01BTExfU1RSVUNUNyk6IERlZmluZS4KKwkqIHNyYy9wYS9saW51eC5TOiBNYXJrIHNvdXJjZSBmaWxlIGFzIHVzaW5nIFBBMS4xIGFzc2VtYmx5LgorCShjaGVja3Ntc3QxLCBjaGVja3Ntc3QyKTogUmVtb3ZlLgorCShjaGVja3Ntc3QzKTogT3B0aW1pemUgaGFuZGxpbmcgb2YgMy1ieXRlIHN0cnVjdCByZXR1cm5zLgorCShjaGVja3Ntc3Q1NjcpOiBQcm9wZXJseSBoYW5kbGUgNS03IGJ5dGUgc3RydWN0IHJldHVybnMuCisKKzIwMDUtMDYtMTUgIFJhaW5lciBPcnRoICA8cm9AVGVjaEZhay5VbmktQmllbGVmZWxkLkRFPgorCisJUFIgbGliZ2NqLzIxOTQzCisJKiBzcmMvbWlwcy9uMzIuUzogRW5mb3JjZSBQSUMgY29kZS4KKwkqIHNyYy9taXBzL28zMi5TOiBMaWtld2lzZS4KKworMjAwNS0wNi0xNSAgUmFpbmVyIE9ydGggIDxyb0BUZWNoRmFrLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIGNvbmZpZ3VyZS5hYzogVHJlYXQgaSo4Ni0qLXNvbGFyaXMyLjEwIGFuZCB1cCBhcyBYODZfNjQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDUtMDYtMDEgIEFsYW4gTW9kcmEgIDxhbW9kcmFAYmlncG9uZC5uZXQuYXU+CisKKwkqIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMgKGZmaV9jbG9zdXJlX1NZU1YpOiBEb24ndCB1c2UgSlVNUFRBUkdFVAorCXRvIGNhbGwgZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YuICBBcHBlbmQgQGxvY2FsIGluc3RlYWQuCisJKiBzcmMvcG93ZXJwYy9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBMaWtld2lzZSBmb3IgZmZpX3ByZXBfYXJnc19TWVNWLgorCisyMDA1LTA1LTE3ICBLZWxsZXkgQ29vayAgPGtjb29rQGdjYy5nbnUub3JnPgorCisJKiBjb25maWd1cmUuYWM6IFVzZSBBQ19DX0JJR0VORElBTiBpbnN0ZWFkIG9mIEFDX0NfQklHRU5ESUFOX0NST1NTLgorCVVzZSBBQ19DSEVDS19TSVpFT0YgaW5zdGVhZCBvZiBBQ19DT01QSUxFX0NIRUNLX1NJWkVPRi4KKwkqIE1ha2VmaWxlLmFtIChBQ0xPQ0FMX0FNRkxBR1MpOiBSZW1vdmUgLUkgLi4vY29uZmlnLgorCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBmZmljb25maWcuaC5pbiwgTWFrZWZpbGUuaW4sCisJaW5jbHVkZS9NYWtlZmlsZS5pbiwgdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDA1LTA1LTA5ICBNaWtlIFN0dW1wICA8bXJzQGFwcGxlLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA1LTA1LTA4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEByZWRoYXQuY29tPgorCisJUFIgbGliZmZpLzIxMjg1CisJKiBzcmMvYWxwaGEvb3NmLlM6IFVwZGF0ZSB1bndpbmQgaW50byB0byBtYXRjaCBjb2RlLgorCisyMDA1LTA1LTA0ICBBbmRyZWFzIERlZ2VydCA8YWRAcGFweXJ1cy1nbWJoLmRlPgorCSAgICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEByZWRoYXQuY29tPgorCisJKiBzcmMveDg2L2ZmaTY0LmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogU2F2ZSBzc2UtdXNlZCBmbGFnIGluCisJYml0IDExIG9mIGZsYWdzLgorCShmZmlfY2FsbCk6IE1hc2sgcmV0dXJuIHR5cGUgZmllbGQuICBQYXNzIHNzZWNvdW50IHRvIGZmaV9jYWxsX3VuaXg2NC4KKwkoZmZpX3ByZXBfY2xvc3VyZSk6IFNldCBjYXJyeSBiaXQgaWYgc3NlLXVzZWQgZmxhZyBzZXQuCisJKiBzcmMveDg2L3VuaXg2NC5TIChmZmlfY2FsbF91bml4NjQpOiBBZGQgc3NlY291bnQgYXJndW1lbnQuCisJT25seSBsb2FkIHNzZSByZWdpc3RlcnMgaWYgc3NlY291bnQgbm9uLXplcm8uCisJKGZmaV9jbG9zdXJlX3VuaXg2NCk6IE9ubHkgc2F2ZSBzc2UgcmVnaXN0ZXJzIGlmIGNhcnJ5IHNldCBvbiBlbnRyeS4KKworMjAwNS0wNC0yOSAgUmFsZiBDb3JzZXBpdXMgIDxyYWxmLmNvcnNlcGl1c0BydGVtcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIGkqODYtKi1ydGVtcyosIHNwYXJjKi0qLXJ0ZW1zKiwKKwlwb3dlcnBjLSpydGVtcyosIGFybSotKi1ydGVtcyosIHNoLSotcnRlbXMqLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA1LTA0LTIwICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwIChsaWJmZmktZGctdGVzdC0xKTogSW4gcmVnc3ViIHVzZSwKKwloYXZlIFRjbDguMy1jb21wYXRpYmxlIGludGVybWVkaWF0ZSB2YXJpYWJsZS4KKworMjAwNS0wNC0xOCAgU2ltb24gUG9zbmphayA8c2ltb24ucG9zbmpha0BzaW9sLm5ldD4KKwkgICAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgQ1JJUyBzdXBwb3J0LgorCSogY29uZmlndXJlLmFjOiBMaWtld2lzZS4KKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbiwKKwlpbmNsdWRlL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogc3JjL2NyaXM6IE5ldyBkaXJlY3RvcnkuCisJKiBzcmMvY3Jpcy9mZmkuYywgc3JjL2NyaXMvc3lzdi5TLCBzcmMvY3Jpcy9mZml0YXJnZXQuaDogTmV3IGZpbGVzLgorCSogc3JjL3ByZXBfY2lmLmMgKGZmaV9wcmVwX2NpZik6IFdyYXAgaW4gI2lmbmRlZiBfX0NSSVNfXy4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwIChsaWJmZmktZGctdGVzdC0xKTogUmVwbGFjZSBcbiB3aXRoCisJXHI/XG4gaW4gb3V0cHV0IHRlc3RzLgorCisyMDA1LTA0LTEyICBNaWtlIFN0dW1wICA8bXJzQGFwcGxlLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA1LTAzLTMwICBIYW5zIEJvZWhtICA8SGFucy5Cb2VobUBocC5jb20+CisKKwkqIHNyYy9pYTY0L2ZmaXRhcmdldC5oIChmZmlfYXJnKTogVXNlIGxvbmcgbG9uZyBpbnN0ZWFkIG9mIERJLgorCisyMDA1LTAzLTMwICBTdGV2ZSBFbGxjZXkgIDxzamVAY3VwLmhwLmNvbT4KKworCSogc3JjL2lhNjQvZmZpdGFyZ2V0LmggKGZmaV9hcmcpIEFERCBESSBhdHRyaWJ1dGUuCisJKGZmaV9zYXJnKSBEaXR0by4KKwkqIHNyYy9pYTY0L3VuaXguUyAoZmZpX2Nsb3N1cmVfdW5peCk6IEV4dGVuZCBncAorCXRvIDY0IGJpdHMgaW4gSUxQMzIgbW9kZS4KKwlMb2FkIDY0IGJpdHMgZXZlbiBmb3Igc2hvcnQgZGF0YS4KKworMjAwNS0wMy0yMyAgTWlrZSBTdHVtcCAgPG1yc0BhcHBsZS5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2Rhcndpbi5TOiBVcGRhdGUgZm9yIC1tNjQgbXVsdGlsaWIuCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TOiBMaWtld2lzZS4KKworMjAwNS0wMy0yMSAgWmFjayBXZWluYmVyZyAgPHphY2tAY29kZXNvdXJjZXJ5LmNvbT4KKworCSogY29uZmlndXJlLmFjOiBEbyBub3QgaW52b2tlIFRMX0FDX0dDQ19WRVJTSU9OLgorCURvIG5vdCBzZXQgdG9vbF9pbmNsdWRlX2Rpci4KKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjoKKwlSZWdlbmVyYXRlLgorCSogaW5jbHVkZS9NYWtlZmlsZS5hbTogU2V0IGdjY192ZXJzaW9uIGFuZCB0b29sbGliZmZpZGlyLgorCSogaW5jbHVkZS9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKworMjAwNS0wMi0yMiAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEJ1bXAgYWxpZ25tZW50IHRvCisJb2RkLW51bWJlcmVkIHJlZ2lzdGVyIHBhaXJzIGZvciA2NC1iaXQgaW50ZWdlciB0eXBlcy4KKworMjAwNS0wMi0yMyAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJUFIgbGliZmZpLzIwMTA0CisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2xsMS5jOiBOZXcgdGVzdCBjYXNlLgorCisyMDA1LTAyLTExICBKYW5pcyBKb2huc29uICA8amFuaXMxODdAdXMuaWJtLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlLmM6IFJlbW92ZSBkZy1vcHRpb25zLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0LmM6IERpdHRvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0Mi5jOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDMuYzogRGl0dG8uCisKKzIwMDUtMDItMDggIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL2Zydi9mZml0YXJnZXQuaDogUmVtb3ZlIFBQQyBzdHVmZiB3aGljaCBkb2VzIG5vdCBiZWxvbmcgdG8gZnJ2LgorCisyMDA1LTAxLTEyICBFcmljIEJvdGNhem91ICA8ZWJvdGNhem91QGxpYmVydHlzdXJmLmZyPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvc3BlY2lhbC5leHAgKGN4eF9vcHRpb25zKTogQWRkCisJLXNoYXJlZC1saWJnY2MuCisKKzIwMDQtMTItMzEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHJlZGhhdC5jb20+CisKKwkqIHNyYy90eXBlcy5jIChGRklfQUdHUkVHQVRFX1RZUEVERUYpOiBSZW1vdmUuCisJKEZGSV9UWVBFREVGKTogUmVuYW1lIGZyb20gRkZJX0lOVEVHUkFMX1RZUEVERUYuICBSZXBsYWNlIHNpemUgYW5kCisJb2Zmc2V0IHBhcmFtZXRlcnMgd2l0aCBhIHR5cGUgcGFyYW1ldGVyOyBkZWR1Y2Ugc2l6ZSBhbmQgc3RydWN0dXJlCisJYWxpZ25tZW50LiAgVXBkYXRlIGFsbCB1c2Vycy4KKworMjAwNC0xMi0zMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAcmVkaGF0LmNvbT4KKworCSogc3JjL3R5cGVzLmMgKEZGSV9UWVBFX1BPSU5URVIpOiBEZWZpbmUgd2l0aCBzaXplb2YuCisJKEZGSV9UWVBFX0xPTkdET1VCTEUpOiBGaXggZm9yIGlhNjQuCisJKiBzcmMvaWE2NC9mZml0YXJnZXQuaCAoc3RydWN0IGZmaV9pYTY0X3RyYW1wb2xpbmVfc3RydWN0KTogTW92ZQorCWludG8gZmZpX3ByZXBfY2xvc3VyZS4KKwkqIHNyYy9pYTY0L2lhNjRfZmxhZ3MuaCwgc3JjL2lhNjQvZmZpLmMsIHNyYy9pYTY0L3VuaXguUzogUmV3cml0ZQorCWZyb20gc2NyYXRjaC4KKworMjAwNC0xMi0yNyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAcmVkaGF0LmNvbT4KKworCSogc3JjL3g4Ni91bml4NjQuUzogRml4IHR5cG8gaW4gdW53aW5kIGluZm8uCisKKzIwMDQtMTItMjUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHJlZGhhdC5jb20+CisKKwkqIHNyYy94ODYvZmZpNjQuYyAoc3RydWN0IHJlZ2lzdGVyX2FyZ3MpOiBSZW5hbWUgZnJvbSBzdGFja0xheW91dC4KKwkoZW51bSB4ODZfNjRfcmVnX2NsYXNzKTogQWRkIFg4Nl82NF9DT01QTEVYX1g4N19DTEFTUy4KKwkobWVyZ2VfY2xhc3Nlcyk6IENoZWNrIGZvciBpdC4KKwkoU1NFX0NMQVNTX1ApOiBOZXcuCisJKGNsYXNzaWZ5X2FyZ3VtZW50KTogUGFzcyBieXRlX29mZnNldCBieSB2YWx1ZTsgcGVyZm9ybSBhbGwgdXBkYXRlcworCWluc2lkZSBzdHJ1Y3QgY2FzZS4KKwkoZXhhbWluZV9hcmd1bWVudCk6IEFkZCBjbGFzc2VzIGFyZ3VtZW50OyBoYW5kbGUKKwlYODZfNjRfQ09NUExFWF9YODdfQ0xBU1MuCisJKGZmaV9wcmVwX2FyZ3MpOiBNZXJnZSBpbnRvIC4uLgorCShmZmlfY2FsbCk6IC4uLiBoZXJlLiAgU2hhcmUgc3RhY2sgZnJhbWUgd2l0aCBmZmlfY2FsbF91bml4NjQuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogU2V0dXAgY2lmLT5mbGFncyBmb3IgcHJvcGVyIHN0cnVjdHVyZSByZXR1cm4uCisJKGZmaV9maWxsX3JldHVybl92YWx1ZSk6IFJlbW92ZS4KKwkoZmZpX3ByZXBfY2xvc3VyZSk6IFJlbW92ZSBkZWFkIGFzc2VydC4KKwkoZmZpX2Nsb3N1cmVfdW5peDY0X2lubmVyKTogUmVuYW1lIGZyb20gZmZpX2Nsb3N1cmVfVU5JWDY0X2lubmVyLgorCVJld3JpdGUgdG8gdXNlIHN0cnVjdCByZWdpc3Rlcl9hcmdzIGluc3RlYWQgb2YgdmFfbGlzdC4gIENyZWF0ZQorCWZsYWdzIGZvciBoYW5kbGluZyBzdHJ1Y3R1cmUgcmV0dXJucy4KKwkqIHNyYy94ODYvdW5peDY0LlM6IFJlbW92ZSBkZWFkIHN0cmluZ3MuCisJKGZmaV9jYWxsX3VuaXg2NCk6IFJlbmFtZSBmcm9tIGZmaV9jYWxsX1VOSVg2NC4gIFJld3JpdGUgdG8gc2hhcmUKKwlzdGFjayBmcmFtZSB3aXRoIGZmaV9jYWxsLiAgSGFuZGxlIHN0cnVjdHVyZSByZXR1cm5zIHByb3Blcmx5LgorCShmbG9hdDJzc2UsIGZsb2F0ZmxvYXQyc3NlLCBkb3VibGUyc3NlKTogUmVtb3ZlLgorCShzc2UyZmxvYXQsIHNzZTJkb3VibGUsIHNzZTJmbG9hdGZsb2F0KTogUmVtb3ZlLgorCShmZmlfY2xvc3VyZV91bml4NjQpOiBSZW5hbWUgZnJvbSBmZmlfY2xvc3VyZV9VTklYNjQuICBSZXdyaXRlCisJdG8gaGFuZGxlIHN0cnVjdHVyZSByZXR1cm5zIHByb3Blcmx5LgorCisyMDA0LTEyLTA4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQGdudS5vcmc+CisKKwkqIE1ha2VmaWxlLmFtIChBTV9NQUtFRkxBR1MpOiBSZW1vdmUgZHVwbGljYXRlIExJQkNGTEFHUyBhbmQKKwlQSUNGTEFHLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgorCisyMDA0LTEyLTAyICBSaWNoYXJkIFNhbmRpZm9yZCAgPHJzYW5kaWZvQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogVXNlIFRMX0FDX0dDQ19WRVJTSU9OIHRvIHNldCBnY2NfdmVyc2lvbi4KKwkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNCwgTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluLCB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKzIwMDQtMTEtMjkgIEtlbGxleSBDb29rICA8a2Nvb2tAZ2NjLmdudS5vcmc+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSBmb3IgbGlidG9vbCBjaGFuZ2UuCisKKzIwMDQtMTEtMjUgIEtlbGxleSBDb29rICA8a2Nvb2tAZ2NjLmdudS5vcmc+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSBmb3IgbGlidG9vbCByZXZlcnNpb24uCisKKzIwMDQtMTEtMjQgIEtlbGxleSBDb29rICA8a2Nvb2tAZ2NjLmdudS5vcmc+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSBmb3IgbGlidG9vbCBjaGFuZ2UuCisKKzIwMDQtMTEtMjMgIEpvaG4gRGF2aWQgQW5nbGluICA8ZGF2ZS5hbmdsaW5AbnJjLWNucmMuZ2MuY2E+CisKKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cDogVXNlIG5ldyBwcm9jcyBpbiB0YXJnZXQtbGlicGF0aC5leHAuCisKKzIwMDQtMTEtMjMgIFJpY2hhcmQgU2FuZGlmb3JkICA8cnNhbmRpZm9AcmVkaGF0LmNvbT4KKworCSogc3JjL21pcHMvbzMyLlMgKGZmaV9jYWxsX08zMiwgZmZpX2Nsb3N1cmVfTzMyKTogVXNlIGphbHIgaW5zdGVhZAorCW9mIGphbC4gIFVzZSBhbiBhYnNvbHV0ZSBlbmNvZGluZyBmb3IgdGhlIGZyYW1lIGluZm9ybWF0aW9uLgorCisyMDA0LTExLTIzICBLZWxsZXkgQ29vayAgPGtjb29rQGdjYy5nbnUub3JnPgorCisJKiBNYWtlZmlsZS5hbTogUmVtb3ZlIG5vLWRlcGVuZGVuY2llcy4gIEFkZCBBQ0xPQ0FMX0FNRkxBR1MuCisJKiBhY2luY2x1ZGUubTQ6IERlbGV0ZSBsb2dpYyBmb3Igc2luY2x1ZGVzLgorCSogYWNsb2NhbC5tNCwgTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGluY2x1ZGUvTWFrZWZpbGU6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL01ha2VmaWxlOiBMaWtld2lzZS4KKworMjAwNC0xMS0yMiAgRXJpYyBCb3RjYXpvdSAgPGVib3RjYXpvdUBsaWJlcnR5c3VyZi5mcj4KKworCSogc3JjL3NwYXJjL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlKTogQWxpZ24gZG91YmxlcyBhbmQgNjQtYml0IGludGVnZXJzCisJb24gYSA4LWJ5dGUgYm91bmRhcnkuCisJKiBzcmMvc3BhcmMvdjguUyAoZmZpX2Nsb3N1cmVfdjgpOiBSZXNlcnZlIGZyYW1lIHNwYWNlIGZvciBhcmd1bWVudHMuCisKKzIwMDQtMTAtMjcgIFJpY2hhcmQgRWFybnNoYXcgIDxyZWFybnNoYUBhcm0uY29tPgorCisJKiBzcmMvYXJtL2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEhhbmRsZSBmdW5jdGlvbnMgdGhhdCByZXR1cm4KKwlsb25nIGxvbmcgdmFsdWVzLiAgUm91bmQgc3RhY2sgYWxsb2NhdGlvbiB0byBhIG11bHRpcGxlIG9mIDggYnl0ZXMKKwlmb3IgQVRQQ1MgY29tcGF0aWJpbGl0eS4KKwkqIHNyYy9hcm0vc3lzdi5TIChmZmlfY2FsbF9TWVNWKTogUmV3b3JrIHRvIGF2b2lkIHVzZSBvZiBBUENTIHJlZ2lzdGVyCisJbmFtZXMuICBIYW5kbGUgcmV0dXJuaW5nIGxvbmcgbG9uZyB0eXBlcy4gIEFkZCBUaHVtYiBhbmQgaW50ZXJ3b3JraW5nCisJc3VwcG9ydC4gIEltcHJvdmUgc29mdC1mbG9hdCBjb2RlLgorCisyMDA0LTEwLTI3ICBSaWNoYXJkIEVhcm5zaGF3ICA8cmVhcm5zaGFAYXJtLmNvbT4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGIuZXhwIChsb2FkX2djY19saWIpOiBOZXcgZnVuY3Rpb24uCisJKGxpYmZmaV9leGl0KTogTmV3IGZ1bmN0aW9uLgorCShsaWJmZmlfaW5pdCk6IEJ1aWxkIHRoZSB0ZXN0Z2x1ZSB3cmFwcGVyIGlmIG5lZWRlZC4KKworMjAwNC0xMC0yNSAgRXJpYyBCb3RjYXpvdSAgPGVib3RjYXpvdUBsaWJlcnR5c3VyZi5mcj4KKworCVBSIG90aGVyLzE4MTM4CisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHA6IEFjY2VwdCBtb3JlIHRoYW4gb25lIG11bHRpbGliIGxpYmdjYy4KKworMjAwNC0xMC0yNSAgS2F6dWhpcm8gSW5hb2thIDxpbmFva2Eua2F6dWhpcm9AcmVuZXNhcy5jb20+CisKKwkqIHNyYy9tMzJyL2xpYmZmaXRhcmdldC5oIChGRklfQ0xPU1VSRVMpOiBTZXQgdG8gMC4KKworMjAwNC0xMC0yMCAgS2F6IEtvamltYSAgPGtrb2ppbWFAZ2NjLmdudS5vcmc+CisKKwkqIHNyYy9zaC9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBEb24ndCBhbGlnbiBmb3IgZG91YmxlIGRhdGEuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQzLmM6IE5ldyB0ZXN0IGNhc2UuCisKKzIwMDQtMTAtMTggIEtheiBLb2ppbWEgIDxra29qaW1hQGdjYy5nbnUub3JnPgorCisJKiBzcmMvc2gvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmUpOiBTZXQgVCBiaXQgaW4gdHJhbXBvbGluZSBmb3IKKwl0aGUgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc3RydWN0dXJlIHBvaW50ZWQgd2l0aCBSMi4KKwkqIHNyYy9zaC9zeXN2LlMgKGZmaV9jbG9zdXJlX1NZU1YpOiBVc2UgUjIgYXMgdGhlIHBvaW50ZXIgdG8KKwl0aGUgc3RydWN0dXJlIHJldHVybiB2YWx1ZSBpZiBUIGJpdCBzZXQuICBFbWl0IHBvc2l0aW9uCisJaW5kZXBlbmRlbnQgY29kZSBhbmQgRUggZGF0YSBpZiBQSUMuCisKKzIwMDQtMTAtMTMgIEthenVoaXJvIEluYW9rYSAgPGluYW9rYS5rYXp1aGlyb0ByZW5lc2FzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IEFkZCBtMzJyIHN1cHBvcnQuCisJKiBjb25maWd1cmUuYWM6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBjb25maXVncmU6IFJlZ2VuZXJhdGUuCisJKiBzcmMvdHlwZXMuYzogQWRkIG0zMnIgcG9ydCB0byBGRklfSU5URVJOQUxfVFlQRURFRgorCSh1aW50NjQsIHNpbnQ2NCwgZG91YmxlLCBsb25nZG91YmxlKQorCSogc3JjL20zMnI6IE5ldyBkaXJlY3RvcnkuCisJKiBzcmMvbTMyci9mZmkuYzogTmV3IGZpbGUuCisJKiBzcmMvbTMyci9zeXN2LlM6IExpa2V3aXNlLgorCSogc3JjL20zMnIvZmZpdGFyZ2V0Lmg6IExpa2V3aXNlLgorCisyMDA0LTEwLTAyICBLYXogS29qaW1hICA8a2tvamltYUBnY2MuZ251Lm9yZz4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lZ2ludC5jOiBOZXcgdGVzdCBjYXNlLgorCisyMDA0LTA5LTE0ICBILkouIEx1ICA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwlQUiBsaWJnY2ovMTc0NjUKKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cDogRG9uJ3QgdXNlIGdsb2JhbCBsZF9saWJyYXJ5X3BhdGguCisJU2V0IHVwIExEX0xJQlJBUllfUEFUSCwgU0hMSUJfUEFUSCwgTERfTElCUkFSWU4zMl9QQVRILAorCUxEX0xJQlJBUlk2NF9QQVRILCBMRF9MSUJSQVJZX1BBVEhfMzIsIExEX0xJQlJBUllfUEFUSF82NCBhbmQKKwlEWUxEX0xJQlJBUllfUEFUSC4KKworMjAwNC0wOS0wNSAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbWFueV93aW4zMi5jOiBSZW1vdmUgd2hpdGVzcGFjZXMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcHJvbW90aW9uLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sbC5jOiBSZW1vdmUgdW51c2VkIHZhci4gQ2xlYW51cAorCXdoaXRlc3BhY2VzLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWMuYzogTGlrZXdpc2UuCisKKzIwMDQtMDktMDUgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL3Bvd2VycGMvZGFyd2luLlM6IEZpeCBjb21tZW50cyBhbmQgaWRlbnRhdGlvbi4KKwkqIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlM6IExpa2V3aXNlLgorCisyMDA0LTA5LTAyICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYzogQWRkIGZsYWcgZm9yIGxvbmdkb3VibGUgcmV0dXJuIHZhbHVlcy4KKwkoZmZpX3ByZXBfYXJncyk6IEhhbmRsZSBsb25nZG91YmxlIGFyZ3VtZW50cy4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBTZXQgZmxhZ3MgZm9yIGxvbmdkb3VibGUuIENhbGN1bGF0ZSBzcGFjZSBmb3IKKwlsb25nZG91YmxlLgorCShmZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOKTogQWRkIGNsb3N1cmUgaGFuZGxpbmcgZm9yIGxvbmdkb3VibGUuCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW4uUyAoX2ZmaV9jYWxsX0RBUldJTik6IEFkZCBoYW5kbGluZyBvZiBsb25nZG91YmxlCisJdmFsdWVzLgorCSogc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUyAoX2ZmaV9jbG9zdXJlX0FTTSk6IExpa2V3aXNlLgorCSogc3JjL3R5cGVzLmM6IERlZmluZWQgbG9uZ2RvdWJsZSBzaXplIGFuZCBhbGlnbm1lbnQgZm9yIGRhcndpbi4KKworMjAwNC0wOS0wMiAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiBzcmMvcG93ZXJwYy9haXguUzogUmVtb3ZlIHdoaXRlc3BhY2VzLgorCSogc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUuUzogTGlrZXdpc2UuCisJKiBzcmMvcG93ZXJwYy9hc20uaDogTGlrZXdpc2UuCisJKiBzcmMvcG93ZXJwYy9mZmkuYzogTGlrZXdpc2UuCisJKiBzcmMvcG93ZXJwYy9mZml0YXJnZXQuaDogTGlrZXdpc2UuCisJKiBzcmMvcG93ZXJwYy9saW51eDY0LlM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLlM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUzogTGlrZXdpc2UuCisJKiBzcmMvcG93ZXJwYy9zeXN2LlM6IExpa2V3aXNlLgorCisyMDA0LTA4LTMwICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW06IEFkZCBmcnYgc3VwcG9ydC4KKwkqIE1ha2VmaWxlLmluLCB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmUuYWM6IFJlYWQgY29uZmlndXJlLmhvc3QuCisJKiBjb25maWd1cmUuaW46IFJlYWQgY29uZmlndXJlLmhvc3QuCisJKiBjb25maWd1cmUuaG9zdDogTmV3IGZpbGUuICBmcnYtZWxmIG5lZWRzIGxpYmdsb3NzLgorCSogaW5jbHVkZS9mZmkuaC5pbjogRm9yY2UgZmZpX2Nsb3N1cmUgdG8gaGF2ZSBhIG5pY2UgYmlnICg4KQorCWFsaWdubWVudC4gIFRoaXMgaXMgbmVlZGVkIHRvIGZydiBhbmQgc2hvdWxkbid0IGhhcm0gdGhlIG90aGVycy4KKwkqIGluY2x1ZGUvZmZpX2NvbW1vbi5oIChBTElHTl9ET1dOKTogTmV3IG1hY3JvLgorCSogc3JjL2Zydi9mZmkuYywgc3JjL2Zydi9mZml0YXJnZXQuaCwgc3JjL2Zydi9lYWJpLlM6IE5ldyBmaWxlcy4KKworMjAwNC0wOC0yNCAgRGF2aWQgRGFuZXkgIDxkYW5leUBhdnRyZXguY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYzogWGZhaWwgbWlwczY0KiBpbnN0ZWFkIG9mIG1pcHMqLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMgIExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4zLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm41LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE5Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zXzFieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZmxvYXQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3BvaW50ZXIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQxNi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZmxvYXQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydGNoYXIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydGNoYXIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zaW50LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Byb2JsZW0xLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2M6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYzogTGlrZXdpc2UgYW5kIHNldCByZXR1cm4gdmFsdWUKKwl0byB6ZXJvLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVieXRlLmM6IExpa2V3aXNlLgorCisyMDA0LTA4LTIzICBEYXZpZCBEYW5leSA8ZGFuZXlAYXZ0cmV4LmNvbT4KKworCVBSIGxpYmdjai8xMzE0MQorCSogc3JjL21pcHMvZmZpdGFyZ2V0LmggKEZGSV9PMzJfU09GVF9GTE9BVCk6IE5ldyBBQkkuCisJKiBzcmMvbWlwcy9mZmkuYyAoZmZpX3ByZXBfYXJncyk6IEZpeCBhbGlnbm1lbnQgY2FsY3VsYXRpb24uCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogSGFuZGxlIEZGSV9PMzJfU09GVF9GTE9BVCBmbG9hdGluZyBwb2ludAorCXBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcy4KKwkoZmZpX2NhbGwpOiBIYW5kbGUgRkZJX08zMl9TT0ZUX0ZMT0FUIEFCSS4KKwkoZmZpX3ByZXBfY2xvc3VyZSk6IERpdHRvLgorCShmZmlfY2xvc3VyZV9taXBzX2lubmVyX08zMik6IEhhbmRsZSBGRklfTzMyX1NPRlRfRkxPQVQgQUJJLCBmaXgKKwlhbGlnbm1lbnQgY2FsY3VsYXRpb25zLgorCSogc3JjL21pcHMvbzMyLlMgKGZmaV9jbG9zdXJlX08zMik6IERvbid0IHVzZSBmbG9hdGluZyBwb2ludAorCWluc3RydWN0aW9ucyBpZiBGRklfTzMyX1NPRlRfRkxPQVQsIG1ha2Ugc3RhY2sgZnJhbWUgQUJJIGNvbXBsaWFudC4KKworMjAwNC0wOC0xNCAgQ2FzZXkgTWFyc2hhbGwgPGNzbUBnbnUub3JnPgorCisJKiBzcmMvbWlwcy9mZmkuYyAoZmZpX3ByZWZfY2lmX21hY2hkZXApOiBzZXQgYGNpZi0+ZmxhZ3MnIHRvCisJY29udGFpbiBgRkZJX1RZUEVfVUlOVDY0JyBhcyByZXR1cm4gdHlwZSBmb3IgYW55IDY0LWJpdAorCWludGVnZXIgKE8zMiBBQkkgb25seSkuCisJKGZmaV9wcmVwX2Nsb3N1cmUpOiBuZXcgZnVuY3Rpb24uCisJKGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTzMyKTogbmV3IGZ1bmN0aW9uLgorCSogc3JjL21pcHMvZmZpdGFyZ2V0Lmg6IERlZmluZSBgRkZJX0NMT1NVUkVTJyBhbmQKKwlgRkZJX1RSQU1QT0xJTkVfU0laRScgYXBwcm9wcmlhdGVseSBpZiB0aGUgQUJJIGlzIG8zMi4KKwkqIHNyYy9taXBzL28zMi5TIChmZmlfY2FsbF9PMzIpOiBhZGQgbGFiZWxzIGZvciAuZWhfZnJhbWUuIFJldHVybgorCTY0IGJpdCBpbnRlZ2VycyBjb3JyZWN0bHkuCisJKGZmaV9jbG9zdXJlX08zMik6IG5ldyBmdW5jdGlvbi4KKwlBZGRlZCBEV0FSRi0yIHVud2luZCBpbmZvIGZvciBib3RoIGZ1bmN0aW9ucy4KKworMjAwNC0wOC0xMCAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy94ODYvZmZpNjQuYyAoZmZpX3ByZXBfYXJncyApOiA4LWFsaWduIGFsbCBzdGFjayBhcmd1bWVudHMuCisKKzIwMDQtMDgtMDEgIFJvYmVydCBNaWxsYW4gIDxyb2JlcnRtaEBnbnUub3JnPgorCisJKiBjb25maWd1cmUuYWM6IERldGVjdCBrbmV0YnNkLWdudSBhbmQga2ZyZWVic2QtZ251LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA0LTA3LTMwICBNYWNpZWogVy4gUm96eWNraSAgPG1hY3JvQGxpbnV4LW1pcHMub3JnPgorCisJKiBhY2luY2x1ZGUubTQgKEFDX0ZVTkNfTU1BUF9CTEFDS0xJU1QpOiBDaGVjayBmb3IgPHN5cy9tbWFuLmg+CisJYW5kIG1tYXAoKSBleHBsaWNpdGx5IGluc3RlYWQgb2YgcmVseWluZyBvbiBwcmVzZXQgYXV0b2NvbmYgY2FjaGUKKwl2YXJpYWJsZXMuCisJKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA0LTA3LTExICBVbHJpY2ggV2VpZ2FuZCAgPHV3ZWlnYW5kQGRlLmlibS5jb20+CisKKwkqIHNyYy9zMzkwL2ZmaS5jIChmZmlfcHJlcF9hcmdzKTogRml4IEMgYWxpYXNpbmcgdmlvbGF0aW9uLgorCShmZmlfY2hlY2tfZmxvYXRfc3RydWN0KTogUmVtb3ZlIHVudXNlZCBwcm90b3R5cGUuCisKKzIwMDQtMDYtMzAgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAYXBwbGUuY29tPgorCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgKGZsdXNoX2ljYWNoZSk6ICc7JyBpcyBhIGNvbW1lbnQKKwljaGFyYWN0ZXIgb24gRGFyd2luLCB1c2UgJ1xuXHQnIGluc3RlYWQuCisKKzIwMDQtMDYtMjYgIE1hdHRoaWFzIEtsb3NlICA8ZG9rb0BkZWJpYW4ub3JnPgorCisJKiBsaWJ0b29sLXZlcnNpb246IEZpeCB0eXBvIGluIHJldmlzaW9uL2FnZS4KKworMjAwNC0wNi0xNyAgTWF0dGhpYXMgS2xvc2UgIDxkb2tvQGRlYmlhbi5vcmc+CisKKwkqIGxpYnRvb2wtdmVyc2lvbjogTmV3LgorCSogTWFrZWZpbGUuYW0gKGxpYmZmaV9sYV9MREZMQUdTKTogVXNlIC12ZXJzaW9uLWluZm8gZm9yIHNvbmFtZS4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCisyMDA0LTA2LTE1ICBQYW9sbyBCb256aW5pICA8Ym9uemluaUBnbnUub3JnPgorCisJKiBNYWtlZmlsZS5hbTogUmVtb3ZlIHVzZWxlc3MgbXVsdGlsaWIgcnVsZXMuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvbWFrZSAxLjguNS4KKwkqIGNvbmZpZ3VyZS5hYzogUmVtb3ZlIHVzZWxlc3MgbXVsdGlsaWIgY29uZmlndXJ5LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisyMDA0LTA2LTE1ICBQYW9sbyBCb256aW5pICA8Ym9uemluaUBnbnUub3JnPgorCisJKiAuY3ZzaWdub3JlOiBOZXcgZmlsZS4KKworMjAwNC0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIHNyYy9pYTY0L3VuaXguUyAoZmZpX2NhbGxfdW5peCk6IEluc2VydCBncm91cCBiYXJyaWVyIGJyZWFrCisJZnBfZG9uZS4KKwkoZmZpX2Nsb3N1cmVfVU5JWCk6IEZpeCBmMTQvZjE1IGFkanVzdG1lbnQgaWYgRkxPQVRfU1ogaXMgZXZlcgorCWNoYW5nZWQgZnJvbSA4LgorCisyMDA0LTA2LTA2ICBTZWFuIE1jTmVpbCAgPHNlYW5AbWNuZWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBBZGQgeDg2XzY0LSotZnJlZWJzZCogc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwNC0wNC0yNiAgSm9lIEJ1Y2sgPGpidWNrQHdlbHNoLWJ1Y2sub3JnPgorCisJQnVnIDE1MDkzCisJKiBjb25maWd1cmUuYWM6IFRlc3QgZm9yIGV4aXN0ZW5jZSBvZiBtbWFwIGFuZCBzeXMvbW1hbi5oIGJlZm9yZQorCWNoZWNraW5nIGJsYWNrbGlzdC4gIEZpeCBzdWdnZXN0ZWQgYnkgSmltIFdpbHNvbi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwNC0wNC0yNiAgTWF0dCBBdXN0ZXJuICA8YXVzdGVybkBhcHBsZS5jb20+CisKKwkqIHNyYy9wb3dlcnBjL2Rhcndpbi5TOiBHbyB0aHJvdWdoIGEgbm9uLWxhenkgcG9pbnRlciBmb3IgaW5pdGlhbAorCUZERSBsb2NhdGlvbi4KKwkqIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlM6IExpa2V3aXNlLgorCisyMDA0LTA0LTI0ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc2NoYXIuYyAobWFpbik6IEZpeCBpbml0aWFsaXphdGlvbgorCWVycm9yLiBSZXBvcnRlZCBieSBUaG9tYXMgSGVsbGVyIDx0aGVsbGVyQHB5dGhvbi5uZXQ+LgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnQuYyAobWFpbik6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnQuYyAobWFpbik6IExpa2V3aXNlLgorCisyMDA0LTAzLTIwICBNYXR0aGlhcyBLbG9zZSAgPGRva29AZGViaWFuLm9yZz4KKworCSogc3JjL3BhL2xpbnV4LlM6IEZpeCB0eXBvLgorCisyMDA0LTAzLTE5ICBNYXR0aGlhcyBLbG9zZSAgPGRva29AZGViaWFuLm9yZz4KKworCSogTWFrZWZpbGUuYW06IFVwZGF0ZS4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogc3JjL3BhL2ZmaS5oLmluOiBSZW1vdmUuCisJKiBzcmMvcGEvZmZpdGFyZ2V0Lmg6IE5ldyBmaWxlLgorCisyMDA0LTAyLTEwICBSYW5kb2xwaCBDaHVuZyAgPHRhdXNxQGRlYmlhbi5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgUEEgc3VwcG9ydC4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogaW5jbHVkZS9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZS5hYzogQWRkIFBBIHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIHNyYy9wYS9mZmkuYzogTmV3IGZpbGUuCisJKiBzcmMvcGEvZmZpLmguaW46IEFkZCBQQSBzdXBwb3J0LgorCSogc3JjL3BhL2xpbnV4LlM6IE5ldyBmaWxlLgorCSogcHJlcF9jaWYuYzogQWRkIFBBIHN1cHBvcnQuCisKKzIwMDQtMDMtMTYgIEhvc2FrYSBZdWppICA8aG9zQHRhbWFuZWdpLm9yZz4KKworCSogc3JjL3R5cGVzLmM6IEZpeCBhbGlnbm1lbnQgc2l6ZSBvZiBYODZfV0lOMzIgY2FzZSBpbnQ2NCBhbmQKKwlkb3VibGUuCisJKiBzcmMveDg2L2ZmaS5jIChmZmlfcHJlcF9hcmdzKTogUmVwbGFjZSBlY2lmLT5jaWYtPnJ0eXBlLT50eXBlCisJd2l0aCBlY2lmLT5jaWYtPmZsYWdzLgorCShmZmlfY2FsbCwgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKTogUmVwbGFjZSBjaWYtPnJ0eXBlLT50eXBlCisJd2l0aCBjaWYtPmZsYWdzLgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEFkZCBYODZfV0lOMzIgc3RydWN0IGNhc2UuCisJKGZmaV9jbG9zdXJlX1NZU1YpOiBBZGQgMSBvciAyLWJ5dGVzIHN0cnVjdCBjYXNlIGZvciBYODZfV0lOMzIuCisJKiBzcmMveDg2L3dpbjMyLlMgKHJldHN0cnVjdDFiLCByZXRzdHJ1Y3QyYiwgc2NfcmV0c3RydWN0MWIsCisJc2NfcmV0c3RydWN0MmIpOiBBZGQgZm9yIDEgb3IgMi1ieXRlcyBzdHJ1Y3QgY2FzZS4KKworMjAwNC0wMy0xNSBLZWxsZXkgQ29vayA8a2Nvb2tAZ2NjLmdudS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVuYW1lIGZpbGUgdG8gLi4uCisJKiBjb25maWd1cmUuYWM6IC4uLiB0aGlzLgorCSogZmZpY29uZmlnLmguaW46IFJlZ2VuZXJhdGUuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKzIwMDQtMDMtMTIgIE1hdHQgQXVzdGVybiAgPGF1c3Rlcm5AYXBwbGUuY29tPgorCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW4uUzogRml4IEVIIGluZm9ybWF0aW9uIHNvIGl0IGNvcnJlc3BvbmRzIHRvCisJY2hhbmdlcyBpbiBFSCBmb3JtYXQgcmVzdWx0aW5nIGZyb20gYWRkaXRpb24gb2YgbGlua29uY2Ugc3VwcG9ydC4KKwkqIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlM6IExpa2V3aXNlLgorCisyMDA0LTAzLTExICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisJICAgIFBhb2xvIEJvbnppbmkgIDxib256aW5pQGdudS5vcmc+CisKKwkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogU2V0IHRoZW0uCisJUmVtb3ZlIFZQQVRILiBSZW1vdmUgcnVsZXMgZm9yIG9iamVjdCBmaWxlcy4gUmVtb3ZlIG11bHRpbGliIHN1cHBvcnQuCisJKEFNX0NDQVNGTEFHUyk6IEFkZC4KKwkqIGNvbmZpZ3VyZS5pbiAoQUNfQ09ORklHX0hFQURFUlMpOiBSZWxhY2UgQU1fQ09ORklHX0hFQURFUi4KKwkoQUNfUFJFUkVRKTogQnVtcCB2ZXJzaW9uIHRvIDIuNTkuCisJKEFDX0lOSVQpOiBGaWxsIHdpdGggdmVyc2lvbiBpbmZvIGFuZCBidWcgYWRkcmVzcy4KKwkoT1JJR0lOQUxfTERfRk9SX01VTFRJTElCUyk6IFJlbW92ZS4KKwkoQU1fRU5BQkxFX01VTFRJTElCKTogVXNlIHRoaXMgaW5zdGVhZCBvZiBBQ19BUkdfRU5BQkxFLgorCURlLXByZWNpb3VzIENDIHNvIHRoYXQgdGhlIHJpZ2h0IGZsYWdzIGFyZSBwYXNzZWQgZG93biB0byBtdWx0aWxpYnMuCisJKEFDX01TR19FUlJPUik6IFJlcGxhY2Ugb2Jzb2xldGUgbWFjcm8gQUNfRVJST1IuCisJKEFDX0NPTkZJR19GSUxFUyk6IFJlcGxhY2Ugb2Jzb2xldGUgbWFjcm8gQUNfTElOS19GSUxFUy4KKwkoQUNfT1VUUFVUKTogUmVvcmdhbml6ZSB0aGUgb3V0cHV0IHdpdGggQUNfQ09ORklHX0NPTU1BTkRTLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5pbiwgaW5jbHVkZS9NYWtlZmlsZS5pbiwgdGVzdHN1aXRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIGZmaWNvbmZpZy5oLmluOiBMaWtld2lzZS4KKworMjAwNC0wMy0xMSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KKworCSogc3JjL2lhNjQvZmZpLmMgKGZmaV9wcmVwX2luY29taW5nX2FyZ3NfVU5JWCk6IEdldCBmbG9hdGluZyBwb2ludAorCWFyZ3VtZW50cyBmcm9tIGZwIHJlZ2lzdGVycyBvbmx5IGZvciB0aGUgZmlyc3QgOCBwYXJhbWV0ZXIgc2xvdHMuCisJRG9uJ3QgY29udmVydCBhIGZsb2F0IHBhcmFtZXRlciB3aGVuIHBhc3NlZCBpbiBtZW1vcnkuCisKKzIwMDQtMDMtMDkgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgZm9yIGNvbmZpZy9hY2Nyb3NzLm00IGNvcnJlY3Rpb24uCisKKzIwMDQtMDItMjUgIE1hdHQgS3JhYWkgIDxrcmFhaUBhbHVtbmkuY211LmVkdT4KKworCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9wcmVwX2FyZ3NfU1lTVik6IENoYW5nZQorCWVjaWYtPmNpZi0+Ynl0ZXMgdG8gYnl0ZXMuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogQWRkIGJyYWNlcyBhcm91bmQgbmVzdGVkIGlmIHN0YXRlbWVudC4KKworMjAwNC0wMi0wOSAgQWxhbiBNb2RyYSAgPGFtb2RyYUBiaWdwb25kLm5ldC5hdT4KKworCSogc3JjL3R5cGVzLmMgKHBvaW50ZXIpOiBQT1dFUlBDNjQgaGFzIDggYnl0ZSBwb2ludGVycy4KKworCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9wcmVwX2FyZ3M2NCk6IENvcnJlY3QgbG9uZyBkb3VibGUgaGFuZGxpbmcuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9MSU5VWDY0KTogRml4IHR5cG8uCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYzogUGFzcyAtbWxvbmctZG91YmxlLTEyOAorCWZvciBwb3dlcnBjNjQtKi0qLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0Mi5jOiBMaWtld2lzZS4KKworMjAwNC0wMi0wOCAgQWxhbiBNb2RyYSAgPGFtb2RyYUBiaWdwb25kLm5ldC5hdT4KKworCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwIDxGRklfTElOVVg2ND4pOiBDb3JyZWN0CisJbG9uZyBkb3VibGUgZnVuY3Rpb24gcmV0dXJuIGFuZCBsb25nIGRvdWJsZSBhcmcgaGFuZGxpbmcuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9MSU5VWDY0KTogRm9ybWF0dGluZy4gIERlbGV0ZSB1bnVzZWQgIm5nIiB2YXIuCisJVXNlICJlbmRfcGZyIiBpbnN0ZWFkIG9mICJuZiIuICBDb3JyZWN0IGxvbmcgZG91YmxlIGhhbmRsaW5nLgorCUxvY2FsaXNlICJ0ZW1wIi4KKwkqIHNyYy9wb3dlcnBjL2xpbnV4NjQuUyAoZmZpX2NhbGxfTElOVVg2NCk6IFNhdmUgZjIgbG9uZyBkb3VibGUKKwlyZXR1cm4gdmFsdWUuCisJKiBzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUyAoZmZpX2Nsb3N1cmVfTElOVVg2NCk6IEFsbG9jYXRlCisJc3BhY2UgZm9yIGxvbmcgZG91YmxlIHJldHVybiB2YWx1ZS4gIEFkanVzdCBzdGFjayBmcmFtZSBhbmQgb2Zmc2V0cy4KKwlMb2FkIGYyIGxvbmcgZG91YmxlIHJldHVybi4KKworMjAwNC0wMi0wNyAgQWxhbiBNb2RyYSAgPGFtb2RyYUBiaWdwb25kLm5ldC5hdT4KKworCSogc3JjL3R5cGVzLmM6IFVzZSAxNiBieXRlIGxvbmcgZG91YmxlIGZvciBQT1dFUlBDNjQuCisKKzIwMDQtMDEtMjUgIEVyaWMgQm90Y2F6b3UgIDxlYm90Y2F6b3VAbGliZXJ0eXN1cmYuZnI+CisKKwkqIHNyYy9zcGFyYy9mZmkuYyAoZmZpX3ByZXBfYXJnc192OSk6IFNoaWZ0IHRoZSBwYXJhbWV0ZXIgYXJyYXkKKwl3aGVuIHRoZSBzdHJ1Y3R1cmUgcmV0dXJuIGFkZHJlc3MgaXMgcGFzc2VkIGluICVvMC4KKwkoZmZpX1Y5X3JldHVybl9zdHJ1Y3QpOiBSZW5hbWUgaW50byBmZmlfdjlfbGF5b3V0X3N0cnVjdC4KKwkoZmZpX3Y5X2xheW91dF9zdHJ1Y3QpOiBBbGlnbiB0aGUgZmllbGQgZm9sbG93aW5nIGEgbmVzdGVkIHN0cnVjdHVyZQorCW9uIGEgd29yZCBib3VuZGFyeS4gIFVzZSBtZW1tb3ZlIGluc3RlYWQgb2YgbWVtY3B5LgorCShmZmlfY2FsbCk6IFVwZGF0ZSBjYWxsIHRvIGZmaV9WOV9yZXR1cm5fc3RydWN0LgorCShmZmlfcHJlcF9jbG9zdXJlKTogRGVmaW5lICdjdHgnIG9ubHkgZm9yIFY4LgorCShmZmlfY2xvc3VyZV9zcGFyY19pbm5lcik6IENsb25lIGludG8gZmZpX2Nsb3N1cmVfc3BhcmNfaW5uZXJfdjgKKwlhbmQgZmZpX2Nsb3N1cmVfc3BhcmNfaW5uZXJfdjkuCisJKGZmaV9jbG9zdXJlX3NwYXJjX2lubmVyX3Y4KTogUmV0dXJuIGxvbmcgZG91YmxlcyBieSByZWZlcmVuY2UuCisJQWx3YXlzIHNraXAgdGhlIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcy4gIEZvciBzdHJ1Y3R1cmVzIGFuZCBsb25nCisJZG91YmxlcywgY29weSB0aGUgYXJndW1lbnQgZGlyZWN0bHkuCisJKGZmaV9jbG9zdXJlX3NwYXJjX2lubmVyX3Y5KTogU2tpcCB0aGUgc3RydWN0dXJlIHJldHVybiBhZGRyZXNzIG9ubHkKKwlpZiByZXF1aXJlZC4gIFNoaWZ0IHRoZSBtYXhpbXVtIGZsb2F0aW5nLXBvaW50IHNsb3QgYWNjb3JkaW5nbHkuICBGb3IKKwliaWcgc3RydWN0dXJlcywgY29weSB0aGUgYXJndW1lbnQgZGlyZWN0bHk7IG90aGVyd2lzZSwgbGVmdC1qdXN0aWZ5IHRoZQorCWFyZ3VtZW50IGFuZCBjYWxsIGZmaV92OV9sYXlvdXRfc3RydWN0IHRvIGxheSBvdXQgdGhlIHN0cnVjdHVyZSBvbgorCXRoZSBzdGFjay4KKwkqIHNyYy9zcGFyYy92OC5TOiBVbmRlZiBTVEFDS0ZSQU1FIGJlZm9yZSBkZWZpbmluZyBpdC4KKwkoZmZpX2Nsb3N1cmVfdjgpOiBQYXNzIHRoZSBzdHJ1Y3R1cmUgcmV0dXJuIGFkZHJlc3MuICBVcGRhdGUgY2FsbCB0bworCWZmaV9jbG9zdXJlX3NwYXJjX2lubmVyX3Y4LiAgU2hvcnQtY2lyY3VpdCBGRklfVFlQRV9JTlQgaGFuZGxpbmcuCisJU2tpcCB0aGUgJ3VuaW1wJyBpbnNuIHdoZW4gcmV0dXJuaW5nIGxvbmcgZG91YmxlcyBhbmQgc3RydWN0dXJlcy4KKwkqIHNyYy9zcGFyYy92OS5TOiBVbmRlZiBTVEFDS0ZSQU1FIGJlZm9yZSBkZWZpbmluZyBpdC4KKwkoZmZpX2Nsb3N1cmVfdjkpOiBJbmNyZWFzZSB0aGUgZnJhbWUgc2l6ZSBieSAyIHdvcmRzLiAgU2hvcnQtY2lyY3VpdAorCUZGSV9UWVBFX0lOVCBoYW5kbGluZy4gIExvYWQgc3RydWN0dXJlcyBib3RoIGluIGludGVnZXJzIGFuZAorCWZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycyBvbiByZXR1cm4uCisJKiBSRUFETUU6IFVwZGF0ZSBzdGF0dXMgb2YgdGhlIFNQQVJDIHBvcnQuCisKKzIwMDQtMDEtMjQgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3B5b2JqYy10Yy5jIChtYWluKTogVHJlYXQgcmVzdWx0IHZhbHVlCisJYXMgb2YgdHlwZSBmZmlfYXJnLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDMuYyAobWFpbik6IEZpeCBDSEVDSy4KKworMjAwNC0wMS0yMiAgVWxyaWNoIFdlaWdhbmQgIDx1d2VpZ2FuZEBkZS5pYm0uY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VpbnQuYyAoY2xzX3JldF91aW50X2ZuKTogVHJlYXQgcmVzdWx0CisJdmFsdWUgYXMgb2YgdHlwZSBmZmlfYXJnLCBub3QgdW5zaWduZWQgaW50LgorCisyMDA0LTAxLTIxICBNaWNoYWVsIFJpdHplcnQgIDxyaXR6ZXJ0QHQtb25saW5lLmRlPgorCisJKiBmZmk2NC5jIChmZmlfcHJlcF9hcmdzKTogQ2FzdCB0aGUgUkhTIG9mIGFuIGFzc2lnbm1lbnQgaW5zdGVhZAorCW9mIHRoZSBMSFMuCisKKzIwMDQtMDEtMTIgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwOiBTZXQgTERfTElCUkFSWV9QQVRIXzMyIGZvcgorCVNvbGFyaXMuCisKKzIwMDQtMDEtMDggIFJhaW5lciBPcnRoICA8cm9AVGVjaEZhay5VbmktQmllbGVmZWxkLkRFPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oIChhbGxvY2F0ZV9tbWFwKTogQ2FzdCBNQVBfRkFJTEVECisJdG8gdm9pZCAqLgorCisyMDAzLTEyLTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEByZWRoYXQuY29tPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3BvaW50ZXIuYzogQ2FzdCBwb2ludGVycyB0bworCXNpemVfdCBpbnN0ZWFkIG9mIGludC4KKworMjAwMy0xMi0wNCAgSG9zYWthIFl1amkgIDxob3NAdGFtYW5lZ2kub3JnPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbWFueV93aW4zMi5jOiBJbmNsdWRlIDxmbG9hdC5oPi4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9tYW55X3dpbjMyLmMgKG1haW4pOiBSZXBsYWNlIHZhcmlhYmxlCisJaW50IGkgd2l0aCB1bnNpZ25lZCBsb25nIHVsLgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQ2NC5jOiBOZXcgdGVzdCBjYXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQzMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MTYuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQxNi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZmxvYXQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jOiBMaWtld2lzZS4KKworMjAwMy0xMi0wMiAgSG9zYWthIFl1amkgIDxob3NAdGFtYW5lZ2kub3JnPgorCisJUFIgb3RoZXIvMTMyMjEKKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9wcmVwX2FyZ3MsIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVik6CisJQWxpZ24gYXJndW1lbnRzIHRvIDMyIGJpdHMuCisKKzIwMDMtMTItMDEgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCVBSIG90aGVyLzEzMjIxCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydC5jOiBOZXcgdGVzdCBjYXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnRjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91Y2hhci5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc2NoYXIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydGNoYXIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydC5jOiBMaWtld2lzZS4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2M6IENvc21ldGljcy4KKworMjAwMy0xMS0yNiAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oOiBJbmNsdWRlIDxmY250bC5oPi4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC9mZml0ZXN0Y3h4Lmg6IExpa2V3aXNlLgorCisyMDAzLTExLTIyICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCSogY29uZmlndXJlOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0LmNjOiBDb252ZXJ0IHRoZSBtbWFwIHRvCisJdGhlIHJpZ2h0IHR5cGUuCisKKzIwMDMtMTEtMjEgIEFuZHJlYXMgSmFlZ2VyICA8YWpAc3VzZS5kZT4KKwkgICAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiBhY2luY2x1ZGUubTQ6IEFkZCBBQ19GVU5DX01NQVBfQkxBQ0tMSVNULgorCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0ZVTkNfTU1BUF9CTEFDS0xJU1QuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIGFjbG9jYWwubTQ6IExpa2V3aXNlLgorCSogY29uZmlndXJlOiBMaWtld2lzZS4KKwkqIGZmaWNvbmZpZy5oLmluOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cDogQWRkIGluY2x1ZGUgZGlyLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaDogQWRkIE1NQVAgZGVmaW5pdGlvbnMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMC5jOiBVc2UgTU1BUCBmdW5jdGlvbmFsaXR5CisJZm9yIGZmaV9jbG9zdXJlIGlmIGF2YWlsYWJsZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMy5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTJieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE4Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTlieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzI0Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180XzFieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZmxvYXQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zaW50LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Byb2JsZW0xLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2M6IExpa2V3aXNlLgorCisyMDAzLTExLTIwICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cDogTWFrZSB0aGUgLWxnY2NfcyBjb25kaXRpb25hbC4KKworMjAwMy0xMS0xOSAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHA6IEFkZCBEWUxEX0xJQlJBUllfUEFUSCBmb3IgZGFyd2luLgorCUFkZCAtbGdjY19zIHRvIGFkZGl0aW9uYWwgZmxhZ3MuCisKKzIwMDMtMTEtMTIgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogY29uZmlndXJlLmluLCBpbmNsdWRlL01ha2VmaWxlLmFtOiBQUiBsaWJnY2ovMTExNDcsIGluc3RhbGwKKwl0aGUgZmZpdGFyZ2V0LmggaGVhZGVyIGZpbGUgaW4gYSBnY2MgdmVyc2lvbmVkIGFuZCB0YXJnZXQKKwlkZXBlbmRlbnQgcGxhY2UuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogTWFrZWZpbGUuaW4sIGluY2x1ZGUvTWFrZWZpbGUuaW46IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKworMjAwMy0xMS0wOSAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYzogUHJpbnQgcmVzdWx0IGFuZCBjaGVjaworCXdpdGggZGctb3V0cHV0IHRvIG1ha2UgZGVidWdnaW5nIGVhc2llci4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMy5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTJieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE4Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTlieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzI0Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180XzFieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZmxvYXQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zaW50LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9wcm9ibGVtMS5jOiBMaWtld2lzZS4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2M6IE1ha2UgZmZpX2Nsb3N1cmUKKwlzdGF0aWMuCisKKzIwMDMtMTEtMDggIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYzogTmV3IHRlc3QgY2FzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182NGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZTEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE5Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMThieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm41LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zY2hhci5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc2ludC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc3Nob3J0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmM6IExpa2V3aXNlLgorCisyMDAzLTExLTA4ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlLmM6IERvIGEgY2hlY2sgb24gdGhlIHJlc3VsdC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWNoYXIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VpbnQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdXNob3J0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jOiBDbGVhbnVwIHdoaXRlc3BhY2VzLgorCisyMDAzLTExLTA2ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHNyYy9wcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBNb3ZlIHRoZSB2YWxpZGl0eSBjaGVjayBhZnRlcgorCXRoZSBpbml0aWFsaXphdGlvbi4KKworMjAwMy0xMC0yMyAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiBzcmMvamF2YV9yYXdfYXBpLmMgKGZmaV9qYXZhX3B0cmFycmF5X3RvX3Jhdyk6IFJlcGxhY2UKKwlGRklfQVNTRVJUKEZBTFNFKSB3aXRoIEZGSV9BU1NFUlQoMCkuCisKKzIwMDMtMTAtMjIgIERhdmlkIERhbmV5ICA8ZGRhbmV5QGF2dHJleC5jb20+CisKKwkqIHNyYy9taXBzL2ZmaXRhcmdldC5oOiBSZXBsYWNlIHVuZGVmaW5lZCBVSU5UMzIgYW5kIGZyaWVuZHMgd2l0aAorCV9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKSBhbmQgZnJpZW5kcy4KKworMjAwMy0xMC0yMiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KKworCSogc3JjL2lhNjQvZmZpLmM6IFJlcGxhY2UgRkFMU0UvVFJVRSB3aXRoIGZhbHNlL3RydWUuCisKKzIwMDMtMTAtMjEgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogY29uZmlndXJlLmluOiBBQ19MSU5LX0ZJTEVTKGZmaXRhcmdldC5oKS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIGZmaWNvbmZpZy5oLmluOiBMaWtld2lzZS4KKworMjAwMy0xMC0yMSAgUGFvbG8gQm9uemluaSAgPGJvbnppbmlAZ251Lm9yZz4KKwkgICAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAcmVkaGF0LmNvbT4KKworCUF2b2lkIHRoYXQgZmZpLmggaW5jbHVkZXMgZmZpY29uZmlnLmguCisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogSW5jbHVkZSBmZml0YXJnZXQuaCBmaWxlcworCShUQVJHRVRfU1JDX01JUFNfR0NDKTogUmVuYW1lZCB0byBUQVJHRVRfU1JDX01JUFNfSVJJWC4KKwkoVEFSR0VUX1NSQ19NSVBTX1NHSSk6IFJlbW92ZWQuCisJKE1JUFNfR0NDKTogUmVuYW1lZCB0byBUQVJHRVRfU1JDX01JUFNfSVJJWC4KKwkoTUlQU19TR0kpOiBSZW1vdmVkLgorCShDTEVBTkZJTEVTKTogUmVtb3ZlZC4KKwkobW9zdGx5Y2xlYW4tYW0sIGNsZWFuLWFtLCBtb3N0bHljbGVhbi1zdWIsIGNsZWFuLXN1Yik6IE5ldworCXRhcmdldHMuCisJKiBhY2NvbmZpZy5oOiBSZW1vdmVkLgorCSogY29uZmlndXJlLmluOiBDb21wdXRlIHNpemVvZnMgb25seSBmb3IgZG91YmxlIGFuZCBsb25nIGRvdWJsZS4KKwlVc2UgdGhlbSB0byBkZWZpbmUgYW5kIHN1YnN0IEhBVkVfTE9OR19ET1VCTEUuICBJbmNsdWRlIGNvbW1lbnRzCisJaW50byBBQ19ERUZJTkUgaW5zdGVhZCBvZiB1c2luZyBhY2NvbmZpZy5oLiAgQ3JlYXRlCisJaW5jbHVkZS9mZml0YXJnZXQuaCBpbnN0ZWFkIG9mIGluY2x1ZGUvZmZpY29uZmlnLmguICBSZW5hbWUKKwlNSVBTX0dDQyB0byBNSVBTX0lSSVgsIGRyb3AgTUlQU19TR0kgc2luY2Ugd2UgYXJlIGluIGdjYydzIHRyZWUuCisJQUNfREVGSU5FIEVIX0ZSQU1FX0ZMQUdTLgorCSogaW5jbHVkZS9NYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBOZXcgYXV0b21ha2UgbWFjcm8uCisJKGhhY2tfREFUQSk6IEFkZCBmZml0YXJnZXQuaC4KKwkqIGluY2x1ZGUvZmZpLmguaW46IFJlbW92ZSBhbGwgc3lzdGVtIHNwZWNpZmljIGRlZmluaXRpb25zLgorCURlY2xhcmUgcmF3IEFQSSBldmVuIGlmIGl0IGlzIG5vdCBpbnN0YWxsZWQsIHdoeSBib3RoZXI/CisJVXNlIGxpbWl0cy5oIGluc3RlYWQgb2YgU0laRU9GXyogdG8gZGVmaW5lIGZmaV90eXBlXyouICBEbworCW5vdCBkZWZpbmUgRUhfRlJBTUVfRkxBR1MsIGl0IGlzIGluIGZmaWNvbmZpZy5oIG5vdy4gIEluY2x1ZGUKKwlmZml0YXJnZXQuaCBpbnN0ZWFkIG9mIGZmaWNvbmZpZy5oLiAgUmVtb3ZlIEFMSUdOIG1hY3JvLgorCShVSU5UX0FSRywgSU5UX0FSRyk6IFJlbW92ZWQsIHVzZSBmZmlfYXJnIGFuZCBmZmlfc2FyZyBpbnN0ZWFkLgorCSogaW5jbHVkZS9mZmlfY29tbW9uLmggKGJvb2wpOiBEbyBub3QgZGVmaW5lLgorCShmZmlfYXNzZXJ0KTogQWNjZXB0IGZhaWxlZCBhc3NlcnRpb24uCisJKGZmaV90eXBlX3Rlc3QpOiBSZXR1cm4gdm9pZCBhbmQgYWNjZXB0IGZpbGUvbGluZS4KKwkoRkZJX0FTU0VSVCk6IFBhc3Mgc3RyaW5naXplZCBmYWlsZWQgYXNzZXJ0aW9uLgorCShGRklfQVNTRVJUX0FUKTogTmV3IG1hY3JvLgorCShGRklfQVNTRVJUX1ZBTElEX1RZUEUpOiBOZXcgbWFjcm8uCisJKFVJTlQ4LCBTSU5UOCwgVUlOVDE2LCBTSU5UMTYsIFVJTlQzMiwgU0lOVDMyLAorCVVJTlQ2NCwgU0lOVDY0KTogRGVmaW5lIGhlcmUgd2l0aCBnY2MncyBfX2F0dHJpYnV0ZV9fIG1hY3JvCisJaW5zdGVhZCBvZiBpbiBmZmkuaAorCShGTE9BVDMyLCBBTElHTik6IERlZmluZSBoZXJlIGluc3RlYWQgb2YgaW4gZmZpLmgKKwkqIGluY2x1ZGUvZmZpLW1pcHMuaDogUmVtb3ZlZC4gIEl0cyBjb250ZW50IG1vdmVkIHRvCisJc3JjL21pcHMvZmZpdGFyZ2V0LmggYWZ0ZXIgc2VwYXJhdGluZyBhc3NlbWJseSBhbmQgQyBzZWN0aW9ucy4KKwkqIHNyYy9hbHBoYS9mZmkuYywgc3JjL2FscGhhL2ZmaS5jLCBzcmMvamF2YV9yYXdfYXBpLmMKKwlzcmMvcHJlcF9jaWYuYywgc3JjL3Jhd19hcGkuYywgc3JjL2lhNjQvZmZpLmMsCisJc3JjL21pcHMvZmZpLmMsIHNyYy9taXBzL24zMi5TLCBzcmMvbWlwcy9vMzIuUywKKwlzcmMvbWlwcy9mZml0YXJnZXQuaCwgc3JjL3NwYXJjL2ZmaS5jLCBzcmMveDg2L2ZmaTY0LmM6CisJU0laRU9GX0FSRyAtPiBGRklfU0laRU9GX0FSRy4KKwkqIHNyYy9pYTY0L2ZmaS5jOiBJbmNsdWRlIHN0ZGJvb2wuaCAocHJvdmlkZWQgYnkgR0NDIDIuOTUrKS4KKwkqIHNyYy9kZWJ1Zy5jIChmZmlfYXNzZXJ0KTogQWNjZXB0IHN0cmluZ2l6ZWQgZmFpbGVkIGFzc2VydGlvbi4KKwkoZmZpX3R5cGVfdGVzdCk6IFJld3JpdHRlbi4KKwkqIHNyYy9wcmVwLWNpZi5jIChpbml0aWFsaXplX2FnZ3JlZ2F0ZSwgZmZpX3ByZXBfY2lmKTogQ2FsbAorCUZGSV9BU1NFUlRfVkFMSURfVFlQRS4KKwkqIHNyYy9hbHBoYS9mZml0YXJnZXQuaCwgc3JjL2FybS9mZml0YXJnZXQuaCwKKwlzcmMvaWE2NC9mZml0YXJnZXQuaCwgc3JjL202OGsvZmZpdGFyZ2V0LmgsCisJc3JjL21pcHMvZmZpdGFyZ2V0LmgsIHNyYy9wb3dlcnBjL2ZmaXRhcmdldC5oLAorCXNyYy9zMzkwL2ZmaXRhcmdldC5oLCBzcmMvc2gvZmZpdGFyZ2V0LmgsCisJc3JjL3NoNjQvZmZpdGFyZ2V0LmgsIHNyYy9zcGFyYy9mZml0YXJnZXQuaCwKKwlzcmMveDg2L2ZmaXRhcmdldC5oOiBOZXcgZmlsZXMuCisJKiBzcmMvYWxwaGEvb3NmLlMsIHNyYy9hcm0vc3lzdi5TLCBzcmMvaWE2NC91bml4LlMsCisJc3JjL202OGsvc3lzdi5TLCBzcmMvbWlwcy9uMzIuUywgc3JjL21pcHMvbzMyLlMsCisJc3JjL3Bvd2VycGMvYWl4LlMsIHNyYy9wb3dlcnBjL2Rhcndpbi5TLAorCXNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYywgc3JjL3Bvd2VycGMvbGludXg2NC5TLAorCXNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TLCBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TLAorCXNyYy9wb3dlcnBjL3N5c3YuUywgc3JjL3MzOTAvc3lzdi5TLCBzcmMvc2gvc3lzdi5TLAorCXNyYy9zaDY0L3N5c3YuUywgc3JjL3NwYXJjL3Y4LlMsIHNyYy9zcGFyYy92OS5TLAorCXNyYy94ODYvc3lzdi5TLCBzcmMveDg2L3VuaXg2NC5TLCBzcmMveDg2L3dpbjMyLlM6CisJaW5jbHVkZSBmZmljb25maWcuaAorCisyMDAzLTEwLTIwICBSYWluZXIgT3J0aCAgPHJvQFRlY2hGYWsuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogc3JjL21pcHMvZmZpLmM6IFVzZSBfQUJJTjMyLCBfQUJJTzMyIGluc3RlYWQgb2YgZXh0ZXJuYWwKKwlfTUlQU19TSU1fTkFCSTMyLCBfTUlQU19TSU1fQUJJMzIuCisKKzIwMDMtMTAtMTkgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIChmZmlfcHJlcF9hcmdzKTogRGVjbGFyZSBieXRlcyBhZ2Fpbi4KKwlVc2VkIHdoZW4gRkZJX0RFQlVHID0gMS4KKworMjAwMy0xMC0xNCAgQWxhbiBNb2RyYSAgPGFtb2RyYUBiaWdwb25kLm5ldC5hdT4KKworCSogc3JjL3R5cGVzLmMgKGRvdWJsZSwgbG9uZ2RvdWJsZSk6IERlZmF1bHQgUE9XRVJQQzY0IHRvIDggYnl0ZSBzaXplCisJYW5kIGFsaWduLgorCisyMDAzLTEwLTA2ICBSYWluZXIgT3J0aCAgPHJvQFRlY2hGYWsuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogaW5jbHVkZS9mZmlfbWlwcy5oOiBEZWZpbmUgRkZJX01JUFNfTjMyIGZvciBOMzIvTjY0IEFCSXMsCisJRkZJX01JUFNfTzMyIGZvciBPMzIgQUJJLgorCisyMDAzLTEwLTAxICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cDogU2V0IExEX0xJQlJBUllfUEFUSF82NCBmb3IKKwlTUEFSQzY0LiBDbGVhbnVwIHdoaXRlc3BhY2VzLgorCisyMDAzLTA5LTE5ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMC5jOiBYZmFpbCBtaXBzLCBhcm0sCisJc3Ryb25nYXJtLCB4c2NhbGUuIENsZWFudXAgd2hpdGVzcGFjZXMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjMuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzEyYnl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTZieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzI0Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180XzFieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZmxvYXQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Byb2JsZW0xLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2M6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3B5b2JqYy10Yy5jOiBDbGVhbnVwIHdoaXRlc3BhY2VzLgorCisyMDAzLTA5LTE4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQGdudS5vcmc+CisKKwkqIHNyYy9wb3dlcnBjL2FpeC5TOiBDbGVhbnVwIHdoaXRlc3BhY2VzLgorCSogc3JjL3Bvd2VycGMvYWl4X2Nsb3N1cmUuUzogTGlrZXdpc2UuCisKKzIwMDMtMDktMTggIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL3Bvd2VycGMvZGFyd2luLlM6IENsZWFudXAgd2hpdGVzcGFjZXMsIGNvbW1lbnQgZm9ybWF0dGluZy4KKwkqIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jOiBMaWtld2lzZS4KKworMjAwMy0wOS0xOCAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCSAgICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQGdudS5vcmc+CisKKwkqIHNyYy90eXBlcy5jIChkb3VibGUpOiBBZGQgQUlYIGFuZCBEYXJ3aW4gdG8gdGhlIHJpZ2h0IFRZUEVERUYuCisJKiBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TOiBSZW1vdmUgdGhlIHBvaW50ZXIgdG8gdGhlIG91dGdvaW5nCisJcGFyYW1ldGVyIHN0YWNrLgorCSogc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUzogTGlrZXdpc2UuCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgKGZmaV9wcmVwX2FyZ3MpOiBIYW5kbGUgc3RydWN0dXJlcworCWFjY29yZGluZyB0byB0aGUgRGFyd2luL0FJWCBBQkkuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogTGlrZXdpc2UuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4pOiBMaWtld2lzZS4KKwlSZW1vdmUgdGhlIG91dGdvaW5nIHBhcmFtZXRlciBzdGFjayBsb2dpYy4gU2ltcGxpZnkgdGhlIGV2YWx1YXRpb24KKwlvZiB0aGUgZGlmZmVyZW50IENBU0UgdHlwZXMuCisJKGZmaV9wcmVwX2Nsb3VzdXJlKTogQXZvaWQgdGhlIGNhc3RzIG9uIGx2YWx1ZXMuIENoYW5nZSB0aGUgYnJhbmNoCisJc3RhdGVtZW50IGluIHRoZSB0cmFtcG9saW5lIGNvZGUuCisKKzIwMDMtMDktMTggIEtheiBLb2ppbWEgIDxra29qaW1hQGdjYy5nbnUub3JnPgorCisJKiBzcmMvc2gvZmZpLmMgKGZmaV9wcmVwX2FyZ3MpOiBUYWtlIGFjY291bnQgaW50byB0aGUgYWxpZ25lbWVudAorCWZvciB0aGUgcmVnaXN0ZXIgc2l6ZS4KKwkoZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YpOiBIYW5kbGUgdGhlIHN0cnVjdHVyZSByZXR1cm4gdmFsdWUKKwlhZGRyZXNzIGNvcnJlY3RseS4KKwkoZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YpOiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHR5cGUgd2hlbgorCXRoZSByZWdpc3RlcnMgYXJlIHVzZWQgZm9yIHRoZSBzdHJ1Y3R1cmUgcmV0dXJuIHZhbHVlLgorCSogc3JjL3NoL3N5c3YuUyAoZmZpX2Nsb3N1cmVfU1lTVik6IEZpeCB0aGUgc3RhY2sgbGF5b3V0IGZvcgorCXRoZSA2NC1iaXQgcmV0dXJuIHZhbHVlLiAgVXBkYXRlIGNvcHlyaWdodCB5ZWFycy4KKworMjAwMy0wOS0xNyAgUmFpbmVyIE9ydGggIDxyb0BUZWNoRmFrLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cCAobGliZmZpX3RhcmdldF9jb21waWxlKTogU2VhcmNoIGluCisJc3JjZGlyIGZvciBmZmlfbWlwcy5oLgorCisyMDAzLTA5LTEyICBBbGFuIE1vZHJhICA8YW1vZHJhQGJpZ3BvbmQubmV0LmF1PgorCisJKiBzcmMvcHJlcF9jaWYuYyAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGUpOiBJbmNsdWRlIHRhaWwgcGFkZGluZyBpbgorCXN0cnVjdHVyZSBzaXplLgorCSogc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLlMgKGZmaV9jbG9zdXJlX0xJTlVYNjQpOiBDb3JyZWN0CisJcGxhY2VtZW50IG9mIGZsb2F0IHJlc3VsdC4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0LmNjIChjbG9zdXJlX3Rlc3RfZm4xKTogQ29ycmVjdAorCWNhc3Qgb2YgInJlc3AiIGZvciBiaWctZW5kaWFuIDY0IGJpdCBtYWNoaW5lcy4KKworMjAwMy0wOS0xMSAgQWxhbiBNb2RyYSAgPGFtb2RyYUBiaWdwb25kLm5ldC5hdT4KKworCSogc3JjL3R5cGVzLmMgKGRvdWJsZSwgbG9uZ2RvdWJsZSk6IE1lcmdlIGlkZW50aWNhbCBTSCBhbmQgQVJNCisJdHlwZWRlZnMsIGFuZCBhZGQgUE9XRVJQQzY0LgorCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9wcmVwX2FyZ3M2NCk6IENvcnJlY3QgbmV4dF9hcmcgY2FsYyBmb3IKKwlzdHJ1Y3Qgc3BsaXQgb3ZlciBncHIgYW5kIHJlc3QuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogQ29ycmVjdCBpbnRhcmdfY291bnQgZm9yIHN0cnVjdHVyZXMuCisJKiBzcmMvcG93ZXJwYy9saW51eDY0LlMgKGZmaV9jYWxsX0xJTlVYNjQpOiBGaXggZ3ByIG9mZnNldHMuCisKKzIwMDMtMDktMDkgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL3Bvd2VycGMvZmZpLmMgKGZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWKSBIYW5kbGUgc3RydWN0CisJcGFzc2luZyBjb3JyZWN0bHkuCisKKzIwMDMtMDktMDkgIEFsYW4gTW9kcmEgIDxhbW9kcmFAYmlncG9uZC5uZXQuYXU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwMy0wOS0wNCAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiBNYWtlZmlsZS5hbTogUmVtb3ZlIGJ1aWxkIHJ1bGVzIGZvciBmZml0ZXN0LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKKzIwMDMtMDktMDQgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL2phdmFfcmF3X2FwaS5jOiBJbmNsdWRlIDxzdGRsaWIuaD4gdG8gZml4IGNvbXBpbGVyIHdhcm5pbmcKKwlhYm91dCBpbXBsaWNpdCBkZWNsYXJhdGlvbiBvZiBhYm9ydCgpLgorCisyMDAzLTA5LTA0ICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgZGVqYWdudSB0ZXN0IGZyYW1ld29yay4gRml4ZXMgUFIgb3RoZXIvMTE0MTEuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGRlamFnbnUgdGVzdCBmcmFtZXdvcmsuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5hbTogTmV3IGZpbGUuCisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuaW46IEJ1aWx0CisJKiB0ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHA6IE5ldyBmaWxlLgorCSogdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cDogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2FsbC5leHA6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaDogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjMuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzFfMWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfN2J5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE2Ynl0ZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZmxvYXQuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VzaG9ydC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdC5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDEuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQyLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnkuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbWFueV93aW4zMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3B5b2JqYy10Yy5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9wcm9ibGVtMS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9wcm9tb3Rpb24uYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2xsLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWMuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmxlbl93aW4zMi5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QxLmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDIuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0My5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q0LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDUuYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ni5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q3LmM6IExpa2V3aXNlLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDguYzogTGlrZXdpc2UuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0OS5jOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC9zcGVjaWFsLmV4cDogTmV3IGZpbGUuCisJKiB0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oOiBMaWtld2lzZS4KKwkqIHRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0LmNjOiBMaWtld2lzZS4KKworCisyMDAzLTA4LTEzICBLYXogS29qaW1hICA8a2tvamltYUBnY2MuZ251Lm9yZz4KKworCSogc3JjL3NoL2ZmaS5jIChPRlNfSU5UMTYpOiBTZXQgMCBmb3IgbGl0dGxlIGVuZGlhbiBjYXNlLiAgVXBkYXRlCisJY29weXJpZ2h0IHllYXJzLgorCisyMDAzLTA4LTAyICBBbGFuIE1vZHJhICA8YW1vZHJhQGJpZ3BvbmQubmV0LmF1PgorCisJKiBzcmMvcG93ZXJwYy9mZmkuYyAoZmZpX3ByZXBfYXJnczY0KTogTW9kaWZ5IGZvciBjaGFuZ2VkIGdjYworCXN0cnVjdHVyZSBwYXNzaW5nLgorCShmZmlfY2xvc3VyZV9oZWxwZXJfTElOVVg2NCk6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvbGludXg2NC5TOiBSZW1vdmUgY29kZSB3cml0aW5nIHRvIHBhcm0gc2F2ZSBhcmVhLgorCSogc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLlMgKGZmaV9jbG9zdXJlX0xJTlVYNjQpOiBVc2UgcmV0dXJuCisJYWRkcmVzcyBpbiBsciBmcm9tIGZmaV9jbG9zdXJlX2hlbHBlcl9MSU5VWDY0IGNhbGwgdG8gY2FsY3VsYXRlCisJdGFibGUgYWRkcmVzcy4gIE9wdGltaXplIGZ1bmN0aW9uIHRhaWwuCisKKzIwMDMtMDctMjggIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL3NwYXJjL2ZmaS5jOiBIYW5kbGUgYWxsIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4KKwkqIHNyYy9zcGFyYy92OS5TOiBMaWtld2lzZS4gRml4ZXMgc2Vjb25kIHBhcnQgb2YgUFIgdGFyZ2V0LzExNDEwLgorCisyMDAzLTA3LTExICBHZXJhbGQgUGZlaWZlciAgPHBmZWlmZXJAZGJhaS50dXdpZW4uYWMuYXQ+CisKKwkqIFJFQURNRTogTm90ZSB0aGF0IGxpYmZmaSBpcyBub3QgcGFydCBvZiBHQ0MuICBVcGRhdGUgdGhlIHByb2plY3QKKwlVUkwgYW5kIHN0YXR1cy4KKworMjAwMy0wNi0xOSAgRnJhbnogU2lybCAgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgorCisJKiBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TOiBJbmNsdWRlIGZmaS5oLgorCisyMDAzLTA2LTEzICBSYWluZXIgT3J0aCAgPHJvQFRlY2hGYWsuVW5pLUJpZWxlZmVsZC5ERT4KKworCSogc3JjL3g4Ni9zeXN2LlM6IEF2b2lkIGdhcy1vbmx5IC51bGViMTI4Ly5zbGViMTI4IGRpcmVjdGl2ZXMuCisJVXNlIEMgc3R5bGUgY29tbWVudHMuCisKKzIwMDMtMDYtMTMgIEtheiBLb2ppbWEgIDxra29qaW1hQHJyLmlpajR1Lm9yLmpwPgorCisJKiBNYWtlZmlsZS5hbTogQWRkIFNIbWVkaWEgc3VwcG9ydC4gIEZpeCBhIHR5cG8gb2YgU0ggc3VwcG9ydC4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlLmluIChzaDY0LSotbGludXgqLCBzaDUqLSotbGludXgqKTogQWRkIHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGluY2x1ZGUvZmZpLmguaW46IEFkZCBTSG1lZGlhIHN1cHBvcnQuCisJKiBzcmMvc2g2NC9mZmkuYzogTmV3IGZpbGUuCisJKiBzcmMvc2g2NC9zeXN2LlM6IE5ldyBmaWxlLgorCisyMDAzLTA1LTE2ICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluIChIQVZFX1JPX0VIX0ZSQU1FKTogQ2hlY2sgd2hldGhlciAuZWhfZnJhbWUgc2VjdGlvbgorCXNob3VsZCBiZSByZWFkLW9ubHkuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBmZmljb25maWcuaC5pbjogUmVidWlsdC4KKwkqIGluY2x1ZGUvZmZpLmguaW4gKEVIX0ZSQU1FX0ZMQUdTKTogRGVmaW5lLgorCSogc3JjL2FscGhhL29zZi5TOiBVc2UgRUhfRlJBTUVfRkxBR1MuCisJKiBzcmMvcG93ZXJwYy9saW51eDY0LlM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLlM6IExpa2V3aXNlLiAgSW5jbHVkZSBmZmkuaC4KKwkqIHNyYy9wb3dlcnBjL3N5c3YuUzogVXNlIEVIX0ZSQU1FX0ZMQUdTLiAgVXNlIHBjcmVsIGVuY29kaW5nCisJaWYgLWZwaWMvLWZQSUMvLW1yZWxvY2F0YWJsZS4KKwkqIHNyYy9wb3dlcnBjL3Bvd2VycGNfY2xvc3VyZS5TOiBMaWtld2lzZS4KKwkqIHNyYy9zcGFyYy92OC5TOiBJZiBIQVZFX1JPX0VIX0ZSQU1FIGlzIGRlZmluZWQsIGRvbid0IGluY2x1ZGUKKwkjd3JpdGUgaW4gLmVoX2ZyYW1lIGZsYWdzLgorCSogc3JjL3NwYXJjL3Y5LlM6IExpa2V3aXNlLgorCSogc3JjL3g4Ni91bml4NjQuUzogVXNlIEVIX0ZSQU1FX0ZMQUdTLgorCSogc3JjL3g4Ni9zeXN2LlM6IExpa2V3aXNlLiAgVXNlIHBjcmVsIGVuY29kaW5nIGlmIC1mcGljLy1mUElDLgorCSogc3JjL3MzOTAvc3lzdi5TOiBVc2UgRUhfRlJBTUVfRkxBR1MuICBJbmNsdWRlIGZmaS5oLgorCisyMDAzLTA1LTA3ICBKZWZmIFN0dXJtICA8anN0dXJtQG9uZS1wb2ludC5jb20+CisKKwlGaXhlcyBQUiBib290c3RyYXAvMTA2NTYKKwkqIGNvbmZpZ3VyZS5pbiAoSEFWRV9BU19SRUdJU1RFUl9QU0VVRE9fT1ApOiBUZXN0IGFzc2VtYmxlcgorCXN1cHBvcnQgZm9yIC5yZWdpc3RlciBwc2V1ZG8tb3AuCisJKiBzcmMvc3BhcmMvdjguUzogVXNlIGl0LgorCSogZmZpY29uZmlnLmguaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDMtMDQtMTggIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgorCisJKiBpbmNsdWRlL2ZmaS5oLmluIChQT1dFUlBDNjQpOiBEZWZpbmUgaWYgNjQtYml0LgorCShlbnVtIGZmaV9hYmkpOiBBZGQgRkZJX0xJTlVYNjQgb24gUE9XRVJQQy4KKwlNYWtlIGl0IHRoZSBkZWZhdWx0IG9uIFBPV0VSUEM2NC4KKwkoRkZJX1RSQU1QT0xJTkVfU0laRSk6IERlZmluZSB0byAyNCBvbiBQT1dFUlBDNjQuCisJKiBjb25maWd1cmUuaW46IENoYW5nZSBwb3dlcnBjLSotbGludXgqIGludG8gcG93ZXJwYyotKi1saW51eCouCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBzcmMvcG93ZXJwYy9mZmkuYyAoaGlkZGVuKTogRGVmaW5lLgorCShmZmlfcHJlcF9hcmdzX1NZU1YpOiBSZW5hbWVkIGZyb20KKwlmZmlfcHJlcF9hcmdzLiAgQ2FzdCBwb2ludGVycyB0byB1bnNpZ25lZCBsb25nIHRvIHNodXQgdXAgd2FybmluZ3MuCisJKE5VTV9HUFJfQVJHX1JFR0lTVEVSUzY0LCBOVU1fRlBSX0FSR19SRUdJU1RFUlM2NCwKKwlBU01fTkVFRFNfUkVHSVNURVJTNjQpOiBOZXcuCisJKGZmaV9wcmVwX2FyZ3M2NCk6IE5ldyBmdW5jdGlvbi4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBIYW5kbGUgRkZJX0xJTlVYNjQgQUJJLgorCShmZmlfY2FsbCk6IExpa2V3aXNlLgorCShmZmlfcHJlcF9jbG9zdXJlKTogTGlrZXdpc2UuCisJKGZsdXNoX2ljYWNoZSk6IFN1cnJvdW5kIGJ5ICNpZm5kZWYgUE9XRVJQQzY0LgorCShmZmlfZGJsZmwpOiBOZXcgdW5pb24gdHlwZS4KKwkoZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YpOiBVc2UgaXQgdG8gYXZvaWQgYWxpYXNpbmcgcHJvYmxlbXMuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9MSU5VWDY0KTogTmV3IGZ1bmN0aW9uLgorCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUzogU3Vycm91bmQgd2hvbGUgZmlsZSBieSAjaWZuZGVmCisJX19wb3dlcnBjNjRfXy4KKwkqIHNyYy9wb3dlcnBjL3N5c3YuUzogTGlrZXdpc2UuCisJKGZmaV9jYWxsX1NZU1YpOiBSZW5hbWUgZmZpX3ByZXBfYXJncyB0byBmZmlfcHJlcF9hcmdzX1NZU1YuCisJKiBzcmMvcG93ZXJwYy9saW51eDY0LlM6IE5ldyBmaWxlLgorCSogc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLlM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgc3JjL3Bvd2VycGMvbGludXg2NC5TIGFuZAorCXNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TLgorCShUQVJHRVRfU1JDX1BPV0VSUEMpOiBMaWtld2lzZS4KKworCSogc3JjL2ZmaXRlc3QuYyAoY2xvc3VyZV90ZXN0X2ZuLCBjbG9zdXJlX3Rlc3RfZm4xLCBjbG9zdXJlX3Rlc3RfZm4yLAorCWNsb3N1cmVfdGVzdF9mbjMpOiBGaXggcmVzdWx0IHByaW50aW5nIG9uIGJpZy1lbmRpYW4gNjQtYml0CisJbWFjaGluZXMuCisJKG1haW4pOiBQcmludCB0c3QyX2FyZyBpbnN0ZWFkIG9mIHVuaW5pdGlhbGl6ZWQgdHN0Ml9yZXN1bHQuCisKKwkqIHNyYy9mZml0ZXN0LmMgKG1haW4pOiBIaWRlIHdoYXQgY2xvc3VyZSBwb2ludGVyIHJlYWxseSBwb2ludHMgdG8KKwlmcm9tIHRoZSBjb21waWxlci4KKworMjAwMy0wNC0xNiAgUmljaGFyZCBFYXJuc2hhdyAgPHJlYXJuc2hhQGFybS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotbmV0YnNkZWxmKik6IEFkZCBjb25maWd1cmF0aW9uLgorCShjb25maWd1cmUpOiBSZWdlbmVyYXRlZC4KKworMjAwMy0wNC0wNCAgTG9yZW4gSi4gUml0dGxlICA8bGpyaXR0bGVAYWNtLm9yZz4KKworCSogaW5jbHVkZS9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKworMjAwMy0wMy0yMSAgWmRlbmVrIER2b3JhayAgPHJha2R2ZXJAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PgorCisJKiBsaWJmZmkvaW5jbHVkZS9mZmkuaC5pbjogRGVmaW5lIFg4NiBpbnN0ZWFkIG9mIFg4Nl82NCBpbiAzMgorCWJpdCBtb2RlLgorCSogbGliZmZpL3NyYy94ODYvZmZpLmMgKGZmaV9jbG9zdXJlX1NZU1YsIGZmaV9jbG9zdXJlX3Jhd19TWVNWKToKKwlSZWNlaXZlIGNsb3N1cmUgcG9pbnRlciB0aHJvdWdoIHBhcmFtZXRlciwgcmVhZCBhcmdzIHVzaW5nCisJX19idWlsdGluX2R3YXJmX2NmYS4KKwkoRkZJX0lOSVRfVFJBTVBPTElORSk6IFNlbmQgY2xvc3VyZSByZWZlcmVuY2UgdGhyb3VnaCBlYXguCisKKzIwMDMtMDMtMTIgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQXZvaWQgdHJhaWxpbmcgLy4gaW4gdG9vbGV4ZWNsaWJkaXIuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDMtMDMtMDMgIEFuZHJlYXMgVG9ibGVyIDxhLnRvYmxlckBzY2h3ZWl6LmNoPgorCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TOiBSZWNvZGUgdG8gZml0IGR5bmFtaWMgbGlicmFyaWVzLgorCisyMDAzLTAyLTA2ICBBbmRyZWFzIFRvYmxlciA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlM6CisJRml4IGFsaWduZW1lbnQgYnVnLCBhbGxvY2F0ZSA4IGJ5dGVzIGZvciB0aGUgcmVzdWx0LgorCSogbGliZmZpL3NyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlM6CisJTGlrZXdpc2UuCisJKiBsaWJmZmkvc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jOgorCVVwZGF0ZSBzdGFja2ZyYW1lIGRlc2NyaXB0aW9uIGZvciBhaXgvZGFyd2luX2Nsb3N1cmUuUy4KKworMjAwMy0wMi0wNiAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIHNyYy9zMzkwL2ZmaS5jIChmZmlfY2xvc3VyZV9oZWxwZXJfU1lTVik6IEFkZCBoaWRkZW4gdmlzaWJpbGl0eQorCWF0dHJpYnV0ZS4KKworMjAwMy0wMS0zMSAgQ2hyaXN0aWFuIENvcm5lbHNzZW4gIDxjY29ybkBjcy50dS1iZXJsaW4uZGU+LAorCSAgICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgorCisJKiBjb25maWd1cmUuaW46IEFkanVzdCBjb21tYW5kIHRvIHNvdXJjZSBjb25maWctbWwuaW4gdG8gYWNjb3VudAorCWZvciBjaGFuZ2VzIHRvIHRoZSBsaWJmZmlfYmFzZWRpciBkZWZpbml0aW9uLgorCShsaWJmZmlfYmFzZWRpcik6IFJlbW92ZSAke3NyY2Rpcn0gZnJvbSB2YWx1ZSBhbmQgaW5jbHVkZSB0cmFpbGluZworCXNsYXNoIGlmIG5vbmVtcHR5LgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDMtMDEtMjkgIEZyYW56IFNpcmwgIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT4KKworCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUzogUmVjb2RlIHRvIGZpdCBzaGFyZWQgbGlicy4KKworMjAwMy0wMS0yOCAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIGluY2x1ZGUvZmZpLmguaW46IEVuYWJsZSBGRklfQ0xPU1VSRVMgZm9yIHg4Nl82NC4KKwkqIHNyYy94ODYvZmZpNjQuYyAoZmZpX3ByZXBfY2xvc3VyZSk6IE5ldy4KKwkoZmZpX2Nsb3N1cmVfVU5JWDY0X2lubmVyKTogTmV3LgorCSogc3JjL3g4Ni91bml4NjQuUyAoZmZpX2Nsb3N1cmVfVU5JWDY0KTogTmV3LgorCisyMDAzLTAxLTI3ICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluICh0b29sZXhlY2RpciwgdG9vbGV4ZWNsaWJkaXIpOiBTZXQgYW5kIEFDX1NVQlNULgorCVJlbW92ZSBVU0VfTElCRElSIGNvbmRpdGlvbmFsLgorCSogTWFrZWZpbGUuYW0gKHRvb2xleGVjZGlyLCB0b29sZXhlY2xpYmRpcik6IERvbid0IG92ZXJyaWRlLgorCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAwMy0wMTAyNyAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBnbnUub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoVEFSR0VUX1NSQ19QT1dFUlBDX0FJWCk6IEZpeCB0eXBvLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKzIwMDMtMDEtMjIgIEFuZHJldyBIYWxleSAgPGFwaEByZWRoYXQuY29tPgorCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW4uUyAoX2ZmaV9jYWxsX0FJWCk6IEFkZCBBdWdtZW50YXRpb24gc2l6ZSB0bworCXVud2luZCBpbmZvLgorCisyMDAzLTAxLTIxICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXouY2g+CisKKwkqIHNyYy9wb3dlcnBjL2Rhcndpbi5TOiBBZGQgdW53aW5kIGluZm8uCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TOiBMaWtld2lzZS4KKworMjAwMy0wMS0xNCAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy94ODYvZmZpNjQuYyAoZmZpX3ByZXBfYXJncyk6IENoZWNrIGZvciB2b2lkIHJldHZhbC4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBMaWtld2lzZS4KKwkqIHNyYy94ODYvdW5peDY0LlM6IEFkZCB1bndpbmQgaW5mby4KKworMjAwMy0wMS0xNCAgQW5kcmVhcyBKYWVnZXIgIDxhakBzdXNlLmRlPgorCisJKiBzcmMvZmZpdGVzdC5jIChtYWluKTogT25seSB1c2UgZmZpX2Nsb3N1cmVzIGlmIHRob3NlIGFyZQorCXN1cHBvcnRlZC4KKworMjAwMy0wMS0xMyBBbmRyZWFzIFRvYmxlciA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogbGliZmZpL3NyYy9mZml0ZXN0LmMKKwkgYWRkIGNsb3N1cmUgdGVzdGNhc2VzCisKKzIwMDMtMDEtMTMgS2V2aW4gQi4gSGVuZHJpY2tzIDxraGVuZHJpY2tzQGl2ZXkudXdvLmNhPgorCisJKiBsaWJmZmkvc3JjL3Bvd2VycGMvZmZpLmMKKwkgZml4IGFsaWdubWVudCBidWcgZm9yIGZsb2F0ICg0IGJ5dGUgYWxpZ25lZCBpc28gOCBieXRlKQorCisyMDAzLTAxLTA5ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGFwcGxlLmNvbT4KKworCSogc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jOiBSZW1vdmUgUkNTIHZlcnNpb24gc3RyaW5nLgorCSogc3JjL3Bvd2VycGMvZGFyd2luLlM6IFJlbW92ZSBSQ1MgdmVyc2lvbiBzdHJpbmcuCisKKzIwMDMtMDEtMDMgIEplZmYgU3R1cm0gIDxqc3R1cm1Ab25lLXBvaW50LmNvbT4KKworCSogaW5jbHVkZS9mZmkuaC5pbjogQWRkIGNsb3N1cmUgZGVmaW5lcyBmb3IgU1BBUkMsIFNQQVJDNjQuCisJKiBzcmMvZmZpdGVzdC5jIChtYWluKTogVXNlIHN0YXRpYyBzdG9yYWdlIGZvciBjbG9zdXJlLgorCSogc3JjL3NwYXJjL2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlLCBmZmlfY2xvc3VyZV9zcGFyY19pbm5lcik6IE5ldy4KKwkqIHNyYy9zcGFyYy92OC5TIChmZmlfY2xvc3VyZV92OCk6IE5ldy4KKwkqIHNyYy9zcGFyYy92OS5TIChmZmlfY2xvc3VyZV92OSk6IE5ldy4KKworMjAwMi0xMS0xMCAgUmFuaml0IE1hdGhldyA8cm1hdGhld0Bob3RtYWlsLmNvbT4KKworCSogaW5jbHVkZS9mZmkuaC5pbjogQWRkZWQgRkZJX1NURENBTEwgZmZpX3R5cGUKKwkgIGVudW1lcmF0aW9uIGZvciBYODZfV0lOMzIuCisJKiBzcmMveDg2L3dpbjMyLlM6IEFkZGVkIGZmaV9jYWxsX1NURENBTEwgZnVuY3Rpb24KKwkgIGRlZmluaXRpb24uCisJKiBzcmMveDg2L2ZmaS5jIChmZmlfY2FsbC9mZmlfcmF3X2NhbGwpOiBBZGRlZAorCSAgc3dpdGNoIGNhc2VzIGZvciByZWNvZ25pc2luZyBGRklfU1REQ0FMTCBhbmQKKwkgIGNhbGxpbmcgZmZpX2NhbGxfU1REQ0FMTCBpZiB0YXJnZXQgaXMgWDg2X1dJTjMyLgorCSogc3JjL2ZmaXRlc3QuYyAobXlfc3RkY2FsbF9zdHJsZW4vc3RkY2FsbF9tYW55KToKKwkgIHN0ZGNhbGwgdmVyc2lvbnMgb2YgdGhlICJteV9zdHJsZW4iIGFuZCAibWFueSIKKwkgIHRlc3QgZnVuY3Rpb25zIChmb3IgWDg2X1dJTjMyKS4KKwkgIEFkZGVkIHRlc3QgY2FzZXMgdG8gdGVzdCBzdGRjYWxsIGludm9jYXRpb24gdXNpbmcKKwkgIHRoZXNlIGZ1bmN0aW9ucy4KKworMjAwMi0xMi0wMiAgS2F6IEtvamltYSAgPGtrb2ppbWFAZ2NjLmdudS5vcmc+CisKKwkqIHNyYy9zaC9zeXN2LlM6IEFkZCBEV0FSRjIgdW53aW5kIGluZm8uCisKKzIwMDItMTEtMjcgIFVscmljaCBXZWlnYW5kICA8dXdlaWdhbmRAZGUuaWJtLmNvbT4KKworCSogc3JjL3MzOTAvc3lzdi5TICguZWhfZnJhbWUgc2VjdGlvbik6IE1ha2Ugc2VjdGlvbiByZWFkLW9ubHkuCisKKzIwMDItMTEtMjYgIEppbSBXaWxzb24gIDx3aWxzb25AcmVkaGF0LmNvbT4KKworCSogc3JjL3R5cGVzLmMgKEZGSV9UWVBFX1BPSU5URVIpOiBIYXMgc2l6ZSA4IG9uIElBNjQuCisKKzIwMDItMTEtMjMgIEguSi4gTHUgPGhqbEBnbnUub3JnPgorCisJKiBhY2luY2x1ZGUubTQ6IEFkZCBkdW1teSBBTV9QUk9HX0xJQlRPT0wuCisJSW5jbHVkZSAuLi9jb25maWcvYWNjcm9zcy5tNC4KKwkqIGFjbG9jYWwubTQ7IFJlYnVpbGQuCisJKiBjb25maWd1cmU6IExpa2V3aXNlLgorCisyMDAyLTExLTE1ICBVbHJpY2ggV2VpZ2FuZCAgPHV3ZWlnYW5kQGRlLmlibS5jb20+CisKKwkqIHNyYy9zMzkwL3N5c3YuUyAoLmVoX2ZyYW1lIHNlY3Rpb24pOiBBZGFwdCB0byBwY3JlbCBGREUgZW5jb2RpbmcuCisKKzIwMDItMTEtMTEgIERKIERlbG9yaWUgIDxkakByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IExvb2sgZm9yIGNvbW1vbiBmaWxlcyBpbiB0aGUgcmlnaHQgcGxhY2UuCisKKzIwMDItMTAtMDggIFVscmljaCBXZWlnYW5kICA8dXdlaWdhbmRAZGUuaWJtLmNvbT4KKworCSogc3JjL2phdmFfcmF3X2FwaS5jIChmZmlfamF2YV9yYXdfdG9fcHRyYXJyYXkpOiBJbnRlcnByZXQKKwlyYXcgZGF0YSBhcyBfSnZfd29yZCB2YWx1ZXMsIG5vdCBmZmlfcmF3LgorCShmZmlfamF2YV9wdHJhcnJheV90b19yYXcpOiBMaWtld2lzZS4KKwkoZmZpX2phdmFfcnZhbHVlX3RvX3Jhdyk6IE5ldyBmdW5jdGlvbi4KKwkoZmZpX2phdmFfcmF3X2NhbGwpOiBDYWxsIGl0LgorCShmZmlfamF2YV9yYXdfdG9fcnZhbHVlKTogTmV3IGZ1bmN0aW9uLgorCShmZmlfamF2YV90cmFuc2xhdGVfYXJncyk6IENhbGwgaXQuCisJKiBzcmMvZmZpdGVzdC5jIChjbG9zdXJlX3Rlc3RfZm4pOiBJbnRlcnByZXQgcmV0dXJuIHZhbHVlCisJYXMgZmZpX2FyZywgbm90IGludC4KKwkqIHNyYy9zMzkwL2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEFkZCBtaXNzaW5nCisJRkZJX1RZUEVfUE9JTlRFUiBjYXNlLgorCShmZmlfY2xvc3VyZV9oZWxwZXJfU1lTVik6IExpa2V3aXNlLiAgQWxzbywgYXNzdW1lIHJldHVybgorCXZhbHVlcyBleHRlbmRlZCB0byB3b3JkIHNpemUuCisKKzIwMDItMTAtMDIgIEFuZHJlYXMgSmFlZ2VyICA8YWpAc3VzZS5kZT4KKworCSogc3JjL3g4Ni9mZmk2NC5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IFJlbW92ZSBkZWJ1ZyBvdXRwdXQuCisKKzIwMDItMTAtMDEgIEJvIFRob3JzZW4gIDxib0BzbWV0YW5hLnN1c2UuZGU+CisKKwkqIGluY2x1ZGUvZmZpLmguaW46IEZpeCBpMzg2IHdpbjMyIGNvbXBpbGF0aW9uLgorCisyMDAyLTA5LTMwICBVbHJpY2ggV2VpZ2FuZCAgPHV3ZWlnYW5kQGRlLmlibS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHMzOTB4LSotbGludXgtKiB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBEZWZpbmUgUzM5MFggZm9yIHMzOTB4IHRhcmdldHMuCisJKEZGSV9DTE9TVVJFUyk6IERlZmluZSBmb3IgczM5MC9zMzkweC4KKwkoRkZJX1RSQU1QT0xJTkVfU0laRSk6IExpa2V3aXNlLgorCShGRklfTkFUSVZFX1JBV19BUEkpOiBMaWtld2lzZS4KKwkqIHNyYy9wcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBEbyBub3QgY29tcHV0ZSBzdGFjayBzcGFjZSBmb3IgczM5MC4KKwkqIHNyYy90eXBlcy5jIChGRklfVFlQRV9QT0lOVEVSKTogVXNlIDgtYnl0ZSBwb2ludGVycyBvbiBzMzkweC4KKwkqIHNyYy9zMzkwL2ZmaS5jOiBNYWpvciByZXdvcmsgb2YgZXhpc3RpbmcgY29kZS4gIEFkZCBzdXBwb3J0IGZvcgorCXMzOTB4IHRhcmdldHMuICBBZGQgY2xvc3VyZSBzdXBwb3J0LgorCSogc3JjL3MzOTAvc3lzdi5TOiBMaWtld2lzZS4KKworMjAwMi0wOS0yOSAgUmljaGFyZCBFYXJuc2hhdyAgPHJlYXJuc2hhQGFybS5jb20+CisKKwkqIHNyYy9hcm0vc3lzdi5TOiBGaXggdHlwby4KKworMjAwMi0wOS0yOCAgUmljaGFyZCBFYXJuc2hhdyAgPHJlYXJuc2hhQGFybS5jb20+CisKKwkqIHNyYy9hcm0vc3lzdi5TOiBJZiB3ZSBkb24ndCBoYXZlIG1hY2hpbmUvYXNtLmggYW5kIHRoZSBwcmUtcHJvY2Vzc29yCisJaGFzIGRlZmluZWQgX19VU0VSX0xBQkVMX1BSRUZJWF9fLCB0aGVuIHVzZSBpdCBpbiBDTkFNRS4KKwkoZmZpX2NhbGxfU1lTVik6IEhhbmRsZSBzb2Z0LWZsb2F0LgorCisyMDAyLTA5LTI3ICBCbyBUaG9yc2VuICA8Ym9Ac3VzZS5kZT4KKworCSogaW5jbHVkZS9mZmkuaC5pbjogRml4IG11bHRpbGliIHg4Ni02NCBzdXBwb3J0LgorCisyMDAyLTA5LTIyICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIE1ha2VmaWxlLmFtIChhbGwtbXVsdGkpOiBGaXggbXVsdGlsaWIgcGFyYWxsZWwgYnVpbGQuCisKKzIwMDItMDctMTkgIEtheiBLb2ppbWEgIDxra29qaW1hQGdjYy5nbnUub3JnPgorCisJKiBjb25maWd1cmUuaW4gKHNoWzM0XSotKi1saW51eCopOiBBZGQgYnJhY2tldHMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDItMDctMTggIEtheiBLb2ppbWEgIDxra29qaW1hQGdjYy5nbnUub3JnPgorCisJKiBNYWtlZmlsZS5hbTogQWRkIFNIIHN1cHBvcnQuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZS5pbiAoc2gtKi1saW51eCosIHNoWzM0XSotKi1saW51eCopOiBBZGQgdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogaW5jbHVkZS9mZmkuaC5pbjogQWRkIFNIIHN1cHBvcnQuCisJKiBzcmMvc2gvZmZpLmM6IE5ldyBmaWxlLgorCSogc3JjL3NoL3N5c3YuUzogTmV3IGZpbGUuCisJKiBzcmMvdHlwZXMuYzogQWRkIFNIIHN1cHBvcnQuCisKKzIwMDItMDctMTYgIEJvIFRob3JzZW4gIDxib0BzdXNlLmRlPgorCisJKiBzcmMveDg2L2ZmaTY0LmM6IE5ldyBmaWxlIHRoYXQgYWRkcyB4ODYtNjQgc3VwcG9ydC4KKwkqIHNyYy94ODYvdW5peDY0LlM6IE5ldyBmaWxlIHRoYXQgaGFuZGxlcyBhcmd1bWVudCBzZXR1cCBmb3IKKwl4ODYtNjQuCisJKiBzcmMveDg2L3N5c3YuUzogRG9uJ3QgdXNlIHRoaXMgb24geDg2LTY0LgorCSogc3JjL3g4Ni9mZmkuYzogRG9uJ3QgdXNlIHRoaXMgb24geDg2LTY0LgorCVJlbW92ZSB1bnVzZWQgdmFycy4KKwkqIHNyYy9wcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBEb24ndCBkbyBzdGFjayBzaXplIGNhbGN1bGF0aW9uCisJZm9yIHg4Ni02NC4KKwkqIHNyYy9mZml0ZXN0LmMgKHN0cnVjdDYpOiBOZXcgdGVzdCB0aGF0IHRlc3RzIGEgc3BlY2lhbCBjYXNlIGluCisJdGhlIHg4Ni02NCBBQkkuCisJKHN0cnVjdDcpOiBMaWtld2lzZS4KKwkoc3RydWN0OCk6IExpa2V3aXNlLgorCShzdHJ1Y3Q5KTogTGlrZXdpc2UuCisJKGNsb3N1cmVfdGVzdF9mbik6IFNpbGVuY2Ugd2FybmluZyBhYm91dCB0aGlzIHdoZW4gaXQncyBub3QgdXNlZC4KKwkobWFpbik6IEFkZCB0aGUgbmV3IHRlc3RzLgorCShtYWluKTogRml4IGEgY291cGxlIG9mIHdyb25nIGNhc3RzIGFuZCBzaWxlbmNlIHNvbWUgY29tcGlsZXIgd2FybmluZ3MuCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBBZGQgeDg2LTY0IEFCSSBkZWZpbml0aW9uLgorCSogZmZpY29uZmlnLmguaW46IFJlZ2VuZXJhdGUuCisJKiBNYWtlZmlsZS5hbTogQWRkIHg4Ni02NCBzdXBwb3J0LgorCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlOiBMaWtld2lzZS4KKworMjAwMi0wNi0yNCAgQm8gVGhvcnNlbiAgPGJvQHN1c2UuZGU+CisKKwkqIHNyYy90eXBlcy5jOiBNZXJnZSBzZXR0aW5ncyBmb3Igc2ltaWxhciBhcmNoaXRlY3R1cmVzLgorCUFkZCB4ODYtNjQgc2l6ZXMgYW5kIGFsaWdubWVudHMuCisKKzIwMDItMDYtMjMgIEJvIFRob3JzZW4gIDxib0BzdXNlLmRlPgorCisJKiBzcmMvYXJtL2ZmaS5jIChmZmlfcHJlcF9hcmdzKTogUmVtb3ZlIHVudXNlZCB2YXJzLgorCSogc3JjL3NwYXJjL2ZmaS5jIChmZmlfcHJlcF9hcmdzX3Y4KTogTGlrZXdpc2UuCisJKiBzcmMvbWlwcy9mZmkuYyAoZmZpX3ByZXBfYXJncyk6IExpa2V3aXNlLgorCSogc3JjL202OGsvZmZpLmMgKGZmaV9wcmVwX2FyZ3MpOiBMaWtld2lzZS4KKworMjAwMi0wNy0xOCAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQorCisJKiBNYWtlZmlsZS5hbSAoVEFSR0VUX1NSQ19NSVBTX0xJTlVYKTogTmV3LgorCShsaWJmZmlfbGFfU09VUkNFUyk6IFN1cHBvcnQgTUlQU19MSU5VWC4KKwkobGliZmZpX2NvbnZlbmllbmNlX2xhX1NPVVJDRVMpOiBMaWtld2lzZS4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KKworCSogY29uZmlndXJlLmluIChtaXBzNjQqLSopOiBTa2lwLgorCShtaXBzKi0qLWxpbnV4Kik6IE5ldy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKwkqIHNyYy9taXBzL2ZmaS5jOiBJbmNsdWRlIDxzZ2lkZWZzLmg+LgorCisyMDAyLTA2LTA2ICBVbHJpY2ggV2VpZ2FuZCAgPHV3ZWlnYW5kQGRlLmlibS5jb20+CisKKwkqIHNyYy9zMzkwL3N5c3YuUzogU2F2ZS9yZXN0b3JlICVyNi4gIEFkZCBEV0FSRi0yIHVud2luZCBpbmZvLgorCisyMDAyLTA1LTI3ICBSb2dlciBTYXlsZSAgPHJvZ2VyQGV5ZXNvcGVuLmNvbT4KKworCSogc3JjL3g4Ni9mZmkuYyAoZmZpX3ByZXBfYXJncyk6IFJlbW92ZSByZWZlcmVuY2UgdG8gYXZuLgorCisyMDAyLTA1LTI3ICBCbyBUaG9yc2VuICA8Ym9Ac3VzZS5kZT4KKworCSogc3JjL3g4Ni9mZmkuYyAoZmZpX3ByZXBfYXJncyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYW5kCisJZml4IGZvcm1hdHRpbmcuCisKKzIwMDItMDUtMTMgIEFuZHJlYXMgVG9ibGVyICA8YS50b2JsZXJAc2Nod2Vpei5jaD4KKworCSogc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIChmZmlfcHJlcF9jbG9zdXJlKTogRGVjbGFyZSBmZCBhdAorCWJlZ2lubmluZyBvZiBmdW5jdGlvbiAoZm9yIG9sZGVyIGFwcGxlIGNjKS4KKworMjAwMi0wNS0wOCAgQWxleGFuZHJlIE9saXZhICA8YW9saXZhQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoT1JJR0lOQUxfTERfRk9SX01VTFRJTElCUyk6IFByZXNlcnZlIExEIGF0CisJc2NyaXB0IGVudHJ5LCBhbmQgc2V0IExEIHRvIGl0IHdoZW4gY29uZmlndXJpbmcgbXVsdGlsaWJzLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDAyLTA1LTA1ICBKYXNvbiBUaG9ycGUgIDx0aG9ycGVqQHdhc2FiaXN5c3RlbXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjNjQtKi1uZXRic2QqKTogQWRkIHRhcmdldC4KKwkoc3BhcmMtKi1uZXRic2RlbGYqKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDItMDQtMjggIERhdmlkIFMuIE1pbGxlciAgPGRhdmVtQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBGaXggU1BBUkMgdGVzdCBpbiBwcmV2aW91cyBjaGFuZ2UuCisKKzIwMDItMDQtMjkgIEdlcmhhcmQgVG9ubiAgPEdlcmhhcmRUb25uQHN3b2wuZGU+CisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgTGludXggZm9yIFMvMzkwIHN1cHBvcnQuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIExpbnV4IGZvciBTLzM5MCBzdXBwb3J0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogaW5jbHVkZS9mZmkuaC5pbjogQWRkIExpbnV4IGZvciBTLzM5MCBzdXBwb3J0LgorCSogc3JjL3MzOTAvZmZpLmM6IE5ldyBmaWxlIGZyb20gbGliZmZpIENWUyB0cmVlLgorCSogc3JjL3MzOTAvc3lzdi5TOiBOZXcgZmlsZSBmcm9tIGxpYmZmaSBDVlMgdHJlZS4KKworMjAwMi0wNC0yOCAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoSEFWRV9BU19TUEFSQ19VQV9QQ1JFTCk6IENoZWNrIGZvciB3b3JraW5nCisJJXJfZGlzcDMyKCkuCisJKiBzcmMvc3BhcmMvdjguUzogVXNlIGl0LgorCSogc3JjL3NwYXJjL3Y5LlM6IExpa2V3aXNlLgorCSogZmZpY29uZmlnLmguaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDItMDQtMDggIEhhbnMgQm9laG0gIDxIYW5zX0JvZWhtQGhwLmNvbT4KKworCSogc3JjL2phdmFfcmF3X2FwaS5jIChmZmlfamF2YV9yYXdfc2l6ZSk6IEhhbmRsZSBGRklfVFlQRV9ET1VCTEUKKwljb3JyZWN0bHkuCisJKiBzcmMvaWE2NC91bml4LlM6IEFkZCB1bndpbmQgaW5mb3JtYXRpb24uIEZpeCBjb21tZW50cy4KKwlTYXZlIHNwIGluIGEgd2F5IHRoYXQncyBjb21wYXRpYmxlIHdpdGggdW53aW5kIGluZm8uCisJKGZmaV9jYWxsX3VuaXgpOiBDb3JyZWN0bHkgcmVzdG9yZSBzcCBpbiBhbGwgY2FzZXMuCisJKiBzcmMvaWE2NC9mZmkuYzogQWRkLCBmaXggY29tbWVudHMuCisKKzIwMDItMDQtMDggIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgorCisJKiBzcmMvc3BhcmMvdjguUzogTWFrZSAuZWhfZnJhbWUgZGVwZW5kZW50IG9uIHRhcmdldCB3b3JkIHNpemUuCisKKzIwMDItMDQtMDYgIEphc29uIFRob3JwZSAgPHRob3JwZWpAd2FzYWJpc3lzdGVtcy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotbmV0YnNkKik6IEFkZCB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzIwMDItMDQtMDQgIEplZmYgU3R1cm0gIDxqc3R1cm1Ab25lLXBvaW50LmNvbT4KKworCSogc3JjL3NwYXJjL3Y4LlM6IEFkZCB1bndpbmQgaW5mby4KKwkqIHNyYy9zcGFyYy92OS5TOiBMaWtld2lzZS4KKworMjAwMi0wMy0zMCAgS3Jpc3RlciBXYWxmcmlkc3NvbiAgPGNhdG9AZGYubHRoLnNlPgorCisJKiBjb25maWd1cmUuaW46IEVuYWJsZSBpKjg2LSotbmV0YnNkZWxmKi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAwMi0wMy0yOSAgRGF2aWQgQmlsbGluZ2h1cnN0IDxEYXZpZC5CaWxsaW5naHVyc3RAcmlvdGludG8uY29tPgorCisJUFIgb3RoZXIvMjYyMAorCSogc3JjL21pcHMvbjMyLnM6IERlbGV0ZQorCSogc3JjL21pcHMvbzMyLnM6IERlbGV0ZQorCisyMDAyLTAzLTIxICBMb3JlbiBKLiBSaXR0bGUgIDxsanJpdHRsZUBhY20ub3JnPgorCisJKiBjb25maWd1cmUuaW46IEVuYWJsZSBhbHBoYSotKi1mcmVlYnNkKi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAwMi0wMy0xNyAgQnJ5Y2UgTWNLaW5sYXkgIDxicnljZUB3YWl0YWtpLm90YWdvLmFjLm56PgorCisJKiBNYWtlZmlsZS5hbTogbGliZmZpY29udmVuaWVuY2UgLT4gbGliZmZpX2NvbnZlbmllbmNlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKKwkqIE1ha2VmaWxlLmFtOiBEZWZpbmUgZmZpdGVzdF9PQkpFQ1RTLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKKzIwMDItMDMtMDcgIEFuZHJlYXMgVG9ibGVyICA8dG9hQHBvcC5hZ3JpLmNoPgorCSAgICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQGdudS5vcmc+CisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIERhcndpbiBhbmQgQUlYIGNsb3N1cmUgZmlsZXMuCisJKFRBUkdFVF9TUkNfUE9XRVJQQ19BSVgpOiBBZGQgYWl4X2Nsb3N1cmUuUy4KKwkoVEFSR0VUX1NSQ19QT1dFUlBDX0RBUldJTik6IEFkZCBkYXJ3aW5fY2xvc3VyZS5TLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBBZGQgQUlYIGFuZCBEYXJ3aW4gY2xvc3VyZSBkZWZpbml0aW9ucy4KKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyAoZmZpX3ByZXBfY2xvc3VyZSk6IE5ldyBmdW5jdGlvbi4KKwkoZmx1c2hfaWNhY2hlLCBmbHVzaF9yYW5nZSk6IE5ldyBmdW5jdGlvbnMuCisJKGZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4pOiBOZXcgZnVuY3Rpb24uCisJKiBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TOiBOZXcgZmlsZS4KKwkqIHNyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlM6IE5ldyBmaWxlLgorCisyMDAyLTAyLTI0ICBKZWZmIFN0dXJtICA8anN0dXJtQG9uZS1wb2ludC5jb20+CisKKwkqIGluY2x1ZGUvZmZpLmguaW46IEFkZCB0eXBlZGVmIGZvciBmZmlfYXJnLgorCSogc3JjL2ZmaXRlc3QuYyAobWFpbik6IERlY2xhcmUgcmludCB3aXRoIGZmaV9hcmcuCisKKzIwMDItMDItMjEgIEFuZHJlYXMgVG9ibGVyICA8dG9hQHBvcC5hZ3JpLmNoPgorCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgKGZmaV9wcmVwX2FyZ3MpOiBTa2lwIGFwcHJvcHJpYXRlCisJbnVtYmVyIG9mIEdQUnMgZm9yIGZsb2F0aW5nLXBvaW50IGFyZ3VtZW50cy4KKworMjAwMi0wMS0zMSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIGNvbmZpZ3VyZS5pbjogUmVwbGFjZSBDSEVDS19TSVpFT0YgYW5kIGVuZGlhbiB0ZXN0cyB3aXRoCisJY3Jvc3MtY29tcGlsZXIgZnJpZW5kbHkgbWFjcm9zLgorCSogYWNsb2NhbC5tNCAoQUNfQ09NUElMRV9DSEVDS19TSVpFT0YsIEFDX0NfQklHRU5ESUFOX0NST1NTKTogTmV3CisJbWFjcm9zLgorCisyMDAyLTAxLTE4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQGdudS5vcmc+CisKKwkqIHNyYy9wb3dlcnBjL2Rhcndpbi5TIChfZmZpX2NhbGxfQUlYKTogTmV3LgorCSogc3JjL3Bvd2VycGMvYWl4LlMgKGZmaV9jYWxsX0RBUldJTik6IE5ldy4KKworMjAwMi0wMS0xNyAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBnbnUub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBEYXJ3aW4gYW5kIEFJWCBmaWxlcy4KKwkoVEFSR0VUX1NSQ19QT1dFUlBDX0FJWCk6IE5ldy4KKwkoUE9XRVJQQ19BSVgpOiBOZXcgc3RhbnphLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBjb25maWd1cmUuaW46IEFkZCBBSVggY2FzZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGluY2x1ZGUvZmZpLmguaW4gKGZmaV9hYmkpOiBBZGQgRkZJX0FJWC4KKwkqIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyAoZmZpX3N0YXR1cyk6IFVzZSAibG9uZyIgdG8gc2NhbGUgZnJhbWUKKwlzaXplLiAgRml4ICJsb25nIGRvdWJsZSIgc3VwcG9ydC4KKwkoZmZpX2NhbGwpOiBBZGQgRkZJX0FJWCBjYXNlLgorCSogc3JjL3Bvd2VycGMvYWl4LlM6IE5ldy4KKworMjAwMS0xMC0wOSAgSm9obiBIb3Jua3Zpc3QgIDxqb2huQHRvYXN0ZWRtYXJzaG1hbGxvdy5jb20+CisKKwlJbXBsZW1lbnQgRGFyd2luIFBvd2VyUEMgQUJJLgorCSogY29uZmlndXJlLmluOiBIYW5kbGUgcG93ZXJwYy0qLWRhcndpbiouCisJKiBNYWtlZmlsZS5hbTogU2V0IHNvdXJjZSBmaWxlcyBmb3IgUE9XRVJQQ19EQVJXSU4uCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIGluY2x1ZGUvZmZpLmguaW46IERlZmluZSBGRklfREFSV0lOIGFuZCBGRklfREVGQVVMVF9BQkkgZm9yCisJUE9XRVJQQ19EQVJXSU4uCisJKiBzcmMvcG93ZXJwYy9kYXJ3aW4uUzogTmV3IGZpbGUuCisJKiBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmM6IE5ldyBmaWxlLgorCisyMDAxLTEwLTA3ICBKb3NlcGggUy4gTXllcnMgIDxqc20yOEBjYW0uYWMudWs+CisKKwkqIHNyYy94ODYvZmZpLmM6IEZpeCBzcGVsbGluZyBlcnJvciBvZiAic2VwYXJhdGUiIGFzICJzZXBlcmF0ZSIuCisKKzIwMDEtMDctMTYgIFJhaW5lciBPcnRoICA8cm9AVGVjaEZhay5VbmktQmllbGVmZWxkLkRFPgorCisJKiBzcmMveDg2L3N5c3YuUzogQXZvaWQgZ2FzLW9ubHkgLmJhbGlnbiBkaXJlY3RpdmUuCisJVXNlIEMgc3R5bGUgY29tbWVudHMuCisKKzIwMDEtMDctMTYgIFJhaW5lciBPcnRoICA8cm9AVGVjaEZhay5VbmktQmllbGVmZWxkLkRFPgorCisJKiBzcmMvYWxwaGEvZmZpLmMgKGZmaV9wcmVwX2Nsb3N1cmUpOiBBdm9pZCBnYXMtb25seSBtbmVtb25pYy4KKwlGaXhlcyBQUiBib290c3RyYXAvMzU2My4KKworMjAwMS0wNi0yNiAgUmFpbmVyIE9ydGggIDxyb0BUZWNoRmFrLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIHNyYy9hbHBoYS9vc2YuUyAoZmZpX2Nsb3N1cmVfb3NmKTogVXNlIC5yZGF0YSBmb3IgRUNPRkYuCisKKzIwMDEtMDYtMjUgIFJhaW5lciBPcnRoICA8cm9AVGVjaEZhay5VbmktQmllbGVmZWxkLkRFPgorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBzcGFyYyotc3VuLSogaG9zdC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwMS0wNi0wNiAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy9hbHBoYS9vc2YuUyAoX19GUkFNRV9CRUdJTl9fKTogQ29uZGl0aW9uYWxpemUgZm9yIEVMRi4KKworMjAwMS0wNi0wMyAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy9hbHBoYS9vc2YuUzogQWRkIHVud2luZCBpbmZvLgorCSogc3JjL3Bvd2VycGMvc3lzdi5TOiBBZGQgdW53aW5kIGluZm8uCisJKiBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TOiBMaWtld2lzZS4KKworMjAwMC0wNS0zMSAgSmVmZiBTdHVybSAgPGpzdHVybUBvbmUtcG9pbnQuY29tPgorCisJKiBjb25maWd1cmUuaW46IEZpeCBBQ19BUkdfRU5BQkxFIHVzYWdlLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDAxLTA1LTA2ICBCcnljZSBNY0tpbmxheSAgPGJyeWNlQHdhaXRha2kub3RhZ28uYWMubno+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIHdhcm5pbmcgYWJvdXQgYmV0YSBjb2RlLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDAxLTA0LTI1ICBIYW5zIEJvZWhtIDxIYW5zX0JvZWhtQGhwLmNvbT4KKworCSogc3JjL2lhNjQvdW5peC5TOiBSZXN0b3JlIHN0YWNrIHBvaW50ZXIgd2hlbiByZXR1cm5pbmcgZnJvbQorCWZmaV9jbG9zdXJlX1VOSVguCisJKiBzcmMvaWE2NC9mZmkuYzogRml4IHR5cG8gaW4gY29tbWVudC4KKworMjAwMS0wNC0xOCAgSmltIFdpbHNvbiAgPHdpbHNvbkByZWRoYXQuY29tPgorCisJKiBzcmMvaWE2NC91bml4LlM6IERlbGV0ZSB1bm5lY2Vzc2FyeSBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBvZiBsb2MyCisJdG8gZWxpbWluYXRlIFJBVyBEVi4KKworMjAwMS0wNC0xMiAgQnJ5Y2UgTWNLaW5sYXkgIDxicnljZUBhbGJhdHJvc3MuY28ubno+CisKKwkqIE1ha2VmaWxlLmFtOiBNYWtlIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKKzIwMDEtMDMtMjkgIEJyeWNlIE1jS2lubGF5ICA8YnJ5Y2VAYWxiYXRyb3NzLmNvLm56PgorCisJKiBjb25maWd1cmUuaW46IFVzZSBkaWZmZXJlbnQgc3ludGF4IGZvciBzdWJkaXJlY3RvcnkgY3JlYXRpb24uCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDEtMDMtMjcgIEpvbiBCZW5pc3RvbiAgPGpvbkBiZW5pc3Rvbi5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgWDg2X1dJTjMyIHRhcmdldCAoV2luMzIsIEN5Z1dpbiwgTWluZ1cpLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogTWFrZWZpbGUuYW06IEFkZGVkIFg4Nl9XSU4zMiB0YXJnZXQgc3VwcG9ydC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBBZGRlZCBYODZfV0lOMzIgdGFyZ2V0IHN1cHBvcnQuCisKKwkqIHNyYy9mZml0ZXN0LmM6IERvZXNuJ3QgcnVuIHN0cnVjdHVyZSB0ZXN0cyBmb3IgWDg2X1dJTjMyIHRhcmdldHMuCisJKiBzcmMvdHlwZXMuYzogQWRkZWQgWDg2X1dJTjMyIHRhcmdldCBzdXBwb3J0LgorCisJKiBzcmMveDg2L3dpbjMyLlM6IE5ldyBmaWxlLiBCYXNlZCBvbiBzeXN2LlMsIGJ1dCB3aXRoIEVICisJc3R1ZmYgcmVtb3ZlZCBhbmQgbWFkZSB0byB3b3JrIHdpdGggQ3lnV2luJ3MgZ2FzLgorCisyMDAxLTAzLTI2ICBCcnljZSBNY0tpbmxheSAgPGJyeWNlQGFsYmF0cm9zcy5jby5uej4KKworCSogY29uZmlndXJlLmluOiBNYWtlIHRhcmdldCBzdWJkaXJlY3RvcnkgaW4gYnVpbGQgZGlyLgorCSogTWFrZWZpbGUuYW06IE92ZXJyaWRlIHN1ZmZpeCBiYXNlZCBydWxlcyB0byBzcGVjaWZ5IGNvcnJlY3Qgb3V0cHV0CisJc3ViZGlyZWN0b3J5LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDEtMDMtMjMgIEtldmluIEIgSGVuZHJpY2tzICA8a2hlbmRyaWNrc0BpdmV5LnV3by5jYT4KKworCSogc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUzogTmV3IGZpbGUuCisJKiBzcmMvcG93ZXJwYy9mZmkuYyAoZmZpX3ByZXBfYXJncyk6IEZpeGVkIEFCSSBjb21wYXRpYmlsaXR5IGJ1ZworCWludm9sdmluZyBsb25nIGxvbmcgYW5kIHJlZ2lzdGVyIHBhaXJzLgorCShmZmlfcHJlcF9jbG9zdXJlKTogTmV3IGZ1bmN0aW9uLgorCShmbHVzaF9pY2FjaGUpOiBMaWtld2lzZS4KKwkoZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YpOiBMaWtld2lzZS4KKwkqIGluY2x1ZGUvZmZpLmguaW4gKEZGSV9DTE9TVVJFUyk6IERlZmluZSBvbiBQUEMuCisJKEZGSV9UUkFNUE9MSU5FX1NJWkUpOiBMaWtld2lzZS4KKwkoRkZJX05BVElWRV9SQVdfQVBJKTogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkZWQgc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUy4KKwkoVEFSR0VUX1NSQ19QT1dFUlBDKTogTGlrZXdpc2UuCisKKzIwMDEtMDMtMTkgIFRvbSBUcm9tZXkgIDx0cm9tZXlAcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBNYWtlZmlsZS5hbSAoZmZpdGVzdF9MREZMQUdTKTogTmV3IG1hY3JvLgorCisyMDAxLTAzLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0ByZWRoYXQuY29tPgorCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBSZW1vdmUgUkNTIGlkZW50IHN0cmluZy4KKwkqIGluY2x1ZGUvZmZpX21pcHMuaDogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMvZGVidWcuYzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMvZmZpdGVzdC5jOiBSZW1vdmUgUkNTIGlkZW50IHN0cmluZy4KKwkqIHNyYy9wcmVwX2NpZi5jOiBSZW1vdmUgUkNTIGlkZW50IHN0cmluZy4KKwkqIHNyYy90eXBlcy5jOiBSZW1vdmUgUkNTIGlkZW50IHN0cmluZy4KKwkqIHNyYy9hbHBoYS9mZmkuYzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMvYWxwaGEvb3NmLlM6IFJlbW92ZSBSQ1MgaWRlbnQgc3RyaW5nLgorCSogc3JjL2FybS9mZmkuYzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMvYXJtL3N5c3YuUzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMvbWlwcy9mZmkuYzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMvbWlwcy9uMzIuUzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMvbWlwcy9vMzIuUzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMvc3BhcmMvZmZpLmM6IFJlbW92ZSBSQ1MgaWRlbnQgc3RyaW5nLgorCSogc3JjL3NwYXJjL3Y4LlM6IFJlbW92ZSBSQ1MgaWRlbnQgc3RyaW5nLgorCSogc3JjL3NwYXJjL3Y5LlM6IFJlbW92ZSBSQ1MgaWRlbnQgc3RyaW5nLgorCSogc3JjL3g4Ni9mZmkuYzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisJKiBzcmMveDg2L3N5c3YuUzogUmVtb3ZlIFJDUyBpZGVudCBzdHJpbmcuCisKKzIwMDEtMDItMDggIEpvc2VwaCBTLiBNeWVycyAgPGpzbTI4QGNhbS5hYy51az4KKworCSogaW5jbHVkZS9mZmkuaC5pbjogQ2hhbmdlIHNvdXJjZXdhcmUuY3lnbnVzLmNvbSByZWZlcmVuY2VzIHRvCisJZ2NjLmdudS5vcmcuCisKKzIwMDAtMTItMDkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHJlZGhhdC5jb20+CisKKwkqIHNyYy9hbHBoYS9mZmkuYyAoZmZpX2NhbGwpOiBTaW1wbGlmeSBzdHJ1Y3QgcmV0dXJuIHRlc3QuCisJKGZmaV9jbG9zdXJlX29zZl9pbm5lcik6IEluZGV4IHJhdGhlciB0aGFuIGluY3JlbWVudCBhdmFsdWUKKwlhbmQgYXJnX3R5cGVzLiAgR2l2ZSBmZmlfY2xvc3VyZV9vc2YgdGhlIHJhdyByZXR1cm4gdmFsdWUgdHlwZS4KKwkqIHNyYy9hbHBoYS9vc2YuUyAoZmZpX2Nsb3N1cmVfb3NmKTogSGFuZGxlIHJldHVybiB2YWx1ZSB0eXBlCisJcHJvbW90aW9uLgorCisyMDAwLTEyLTA3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEByZWRoYXQuY29tPgorCisJKiBzcmMvcmF3X2FwaS5jIChmZmlfdHJhbnNsYXRlX2FyZ3MpOiBGaXggdHlwby4KKwkoZmZpX3ByZXBfY2xvc3VyZSk6IExpa2V3aXNlLgorCisJKiBpbmNsdWRlL2ZmaS5oLmluIFtBTFBIQV06IERlZmluZSBGRklfQ0xPU1VSRVMgYW5kCisJRkZJX1RSQU1QT0xJTkVfU0laRS4KKwkqIHNyYy9hbHBoYS9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBBZGp1c3QgbWluaW1hbAorCWNpZi0+Ynl0ZXMgZm9yIG5ldyBmZmlfY2FsbF9vc2YgaW1wbGVtZW50YXRpb24uCisJKGZmaV9wcmVwX2FyZ3MpOiBBYnNvcmIgaW50byAuLi4KKwkoZmZpX2NhbGwpOiAuLi4gaGVyZS4gIERvIGFsbCBzdGFjayBhbGxvY2F0aW9uIGhlcmUgYW5kCisJYXZvaWQgYSBjYWxsYmFjayBmdW5jdGlvbi4KKwkoZmZpX3ByZXBfY2xvc3VyZSwgZmZpX2Nsb3N1cmVfb3NmX2lubmVyKTogTmV3LgorCSogc3JjL2FscGhhL29zZi5TIChmZmlfY2FsbF9vc2YpOiBSZWltcGxlbWVudCB3aXRoIG5vIGNhbGxiYWNrLgorCShmZmlfY2xvc3VyZV9vc2YpOiBOZXcuCisKKzIwMDAtMDktMTAgIEFsZXhhbmRyZSBPbGl2YSAgPGFvbGl2YUByZWRoYXQuY29tPgorCisJKiBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWIsIGluc3RhbGwtc2g6IFJlbW92ZWQuCisJKiBsdGNvbmZpZywgbHRtYWluLnNoLCBtaXNzaW5nLCBta2luc3RhbGxkaXJzOiBMaWtld2lzZS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisJKiBhY2luY2x1ZGUubTQ6IEluY2x1ZGUgbGlidG9vbCBtYWNyb3MgZnJvbSB0aGUgdG9wIGxldmVsLgorCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDAwLTA4LTIyICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluIFtpKjg2LSotZnJlZWJzZCpdIChUQVJHRVQsIFRBUkdFVERJUik6IFNldC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAwMC0wNS0xMSAgU2NvdHQgQmFtYnJvdWdoICA8c2NvdHRiQG5ldHdpbmRlci5vcmc+CisKKwkqIGxpYmZmaS9zcmMvYXJtL3N5c3YuUyAoZmZpX2NhbGxfU1lTVik6IERvdWJsZXMgYXJlIG5vdCBzYXZlZCB0bworCW1lbW9yeSBjb3JyZWN0bHkuICBVc2UgY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zLCBub3QgYnJhbmNoZXMgd2hlcmUKKwlwb3NzaWJsZS4KKworMjAwMC0wNS0wNCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBjb25maWd1cmUuaW46IE1hdGNoIGBhcm0qLSotbGludXgtKicuCisJRnJvbSBDaHJpcyBEb3JuYW4gPGNkb3JuYW5AYXJtLmNvbT4uCisKKzIwMDAtMDQtMjggIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IERlZmluZS4KKwkoQU1fTUFLRUZMQUdTKTogTGlrZXdpc2UuCisJKE11bHRpbGliIHN1cHBvcnQuKTogQWRkIHNlY3Rpb24uCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIGx0Y29uZmlnIChleHRyYV9jb21waWxlcl9mbGFncywgZXh0cmFfY29tcGlsZXJfZmxhZ3NfdmFsdWUpOgorCU5ldyB2YXJpYWJsZXMuIFNldCBmb3IgZ2NjIHVzaW5nIC1wcmludC1tdWx0aS1saWIuIEV4cG9ydCB0aGVtCisJdG8gbGlidG9vbC4KKwkoc3BhcmM2NC0qLWxpbnV4LWdudSopOiBVc2UgbGlic3VmZiA2NCBmb3Igc2VhcmNoIHBhdGhzLgorCSogbHRtYWluLnNoIChCfGJ8Vik6IERvbid0IHRocm93IGF3YXkgZ2NjJ3MgLUIsIC1iIGFuZCAtViBvcHRpb25zCisJZm9yIC1zaGFyZWQgbGlua3MuCisJKGV4dHJhX2NvbXBpbGVyX2ZsYWdzX3ZhbHVlLCBleHRyYV9jb21waWxlcl9mbGFncyk6IENoZWNrIHRoZXNlCisJZm9yIGV4dHJhIGNvbXBpbGVyIG9wdGlvbnMgd2hpY2ggbmVlZCB0byBiZSBwYXNzZWQgZG93biBpbgorCWNvbXBpbGVyX2ZsYWdzLgorCisyMDAwLTA0LTE2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaSo4Ni1wYy1saW51eCogdG8gaSo4Ni0qLWxpbnV4Ki4KKworMjAwMC0wNC0xNCAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+CisKKwkqIGluY2x1ZGUvZmZpLmguaW4gKFNQQVJDNjQpOiBEZWZpbmUgZm9yIDY0Yml0IFNQQVJDIGJ1aWxkcy4KKwlTZXQgU1BBUkMgRkZJX0RFRkFVTFRfQUJJIGJhc2VkIG9uIFNQQVJDNjQgZGVmaW5lLgorCSogc3JjL3NwYXJjL2ZmaS5jIChmZmlfcHJlcF9hcmdzX3Y4KTogUmVuYW1lZCBmcm9tIGZmaV9wcmVwX2FyZ3MuCisJUmVwbGFjZSBhbGwgdm9pZCAqIHNpemVvZnMgd2l0aCBzaXplb2YoaW50KS4KKwlPbmx5IGNvbXBhcmUgdHlwZSB3aXRoIEZGSV9UWVBFX0xPTkdET1VCTEUgaWYgTE9OR0RPVUJMRSBpcworCWRpZmZlcmVudCB0aGFuIERPVUJMRS4KKwlSZW1vdmUgRkZJX1RZUEVfU0lOVDMyIGFuZCBGRklfVFlQRV9VSU5UMzIgY2FzZXMgKGhhbmRsZWQgZWxzZXdoZXJlKS4KKwkoZmZpX3ByZXBfYXJnc192OSk6IE5ldyBmdW5jdGlvbi4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBIYW5kbGUgVjkgQUJJIGFuZCBsb25nIGxvbmcgb24gVjguCisJKGZmaV9WOV9yZXR1cm5fc3RydWN0KTogTmV3IGZ1bmN0aW9uLgorCShmZmlfY2FsbCk6IEhhbmRsZSBGRklfVjkgQUJJIGZyb20gNjRiaXQgY29kZSBhbmQgRkZJX1Y4IEFCSSBmcm9tCisJMzJiaXQgY29kZSAobm90IHlldCBjcm9zcy1hcmNoIGNhbGxzKS4KKwkqIHNyYy9zcGFyYy92OC5TOiBBZGQgc3RydWN0IHJldHVybiBkZWxheSBub3AuCisJSGFuZGxlIGxvbmcgbG9uZy4KKwkqIHNyYy9zcGFyYy92OS5TOiBOZXcgZmlsZS4KKwkqIHNyYy9wcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBSZXR1cm4gc3RydWN0dXJlIHBvaW50ZXIKKwlpcyB1c2VkIG9uIHNwYXJjNjQgb25seSBmb3Igc3RydWN0dXJlcyBsYXJnZXIgdGhhbiAzMiBieXRlcy4KKwlQYXNzIGJ5IHJlZmVyZW5jZSBmb3Igc3RydWN0dXJlcyBpcyBkb25lIGZvciBzdHJ1Y3R1cmUgYXJndW1lbnRzCisJbGFyZ2VyIHRoYW4gMTYgYnl0ZXMuCisJKiBzcmMvZmZpdGVzdC5jIChtYWluKTogVXNlIDY0Yml0IHJpbnQgb24gc3BhcmM2NC4KKwlSdW4gbG9uZyBsb25nIHRlc3RzIG9uIHNwYXJjLgorCSogc3JjL3R5cGVzLmMgKEZGSV9UWVBFX1BPSU5URVIpOiBQb2ludGVyIGlzIDY0Yml0IG9uIGFscGhhIGFuZAorCXNwYXJjNjQuCisJKEZGSV9UWVBFX0xPTkdET1VCTEUpOiBsb25nIGRvdWJsZSBpcyAxMjggYml0IGFsaWduZWQgdG8gMTI4IGJpdHMKKwlvbiBzcGFyYzY0LgorCSogY29uZmlndXJlLmluIChzcGFyYy0qLWxpbnV4Kik6IE5ldyBzdXBwb3J0ZWQgdGFyZ2V0LgorCShzcGFyYzY0LSotbGludXgqKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBNYWtlZmlsZS5hbTogQWRkIHY5LlMgdG8gU1BBUkMgZmlsZXMuCisJKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCisJKExJTkspOiBTdXJyb3VuZCAkKENDTEQpIGludG8gZG91YmxlIHF1b3Rlcywgc28gdGhhdCBtdWx0aWxpYgorCWNvbXBpbGVzIHdvcmsgY29ycmVjdGx5LgorCisyMDAwLTA0LTA0ICBBbGV4YW5kcmUgUGV0aXQtQmlhbmNvICA8YXBiaWFuY29AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogY29uZmlndXJlLmluOiAoaSo4Ni0qLXNvbGFyaXMqKTogTmV3IGxpYmZmaSB0YXJnZXQuIFBhdGNoCisJcHJvcG9zZWQgYnkgQnJ5Y2UgTWNLaW5sYXkuCisKKzIwMDAtMDMtMjAgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IEhhbmQgZWRpdCBmb3IgamF2YV9yYXdfYXBpLmxvLgorCisyMDAwLTAzLTA4ICBCcnljZSBNY0tpbmxheSAgPGJyeWNlQGFsYmF0cm9zcy5jby5uej4KKworCSogY29uZmlnLmd1ZXNzLCBjb25maWcuc3ViOiBVcGRhdGUgZnJvbSB0aGUgZ2NjIHRyZWUuCisJRml4IGZvciBQUiBsaWJnY2ovMTY4LgorCisyMDAwLTAzLTAzICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBGaXhlZCBpYTY0IGJ5IGhhbmQuCisKKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtbXVsdGlsaWIpOiBOZXcgb3B0aW9uLgorCShsaWJmZmlfYmFzZWRpcik6IE5ldyBzdWJzdC4KKwkoQUNfT1VUUFVUKTogQWRkZWQgbXVsdGlsaWIgY29kZS4KKworMjAwMC0wMy0wMiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIE1ha2VmaWxlLmFtIChUQVJHRVRfU1JDX0lBNjQpOiBVc2UgYGlhNjQnLCBub3QgYGFscGhhJywgYXMKKwlkaXJlY3RvcnkgbmFtZS4KKworMjAwMC0wMi0yNSAgSGFucyBCb2VobSA8Ym9laG1AYWNtLm9yZz4KKworCSogc3JjL2lhNjQvZmZpLmMsIHNyYy9pYTY0L2lhNjRfZmxhZ3MuaCwgc3JjL2lhNjQvdW5peC5TOiBOZXcKKwlmaWxlcy4KKwkqIHNyYy9yYXdfYXBpLmMgKGZmaV90cmFuc2xhdGVfYXJncyk6IEZpeGVkIHR5cG8gaW4gYXJndW1lbnQKKwlsaXN0LgorCShmZmlfcHJlcF9yYXdfY2xvc3VyZSk6IFVzZSBmZmlfdHJhbnNsYXRlX2FyZ3MsIG5vdAorCWZmaV9jbG9zdXJlX3RyYW5zbGF0ZS4KKwkqIHNyYy9qYXZhX3Jhd19hcGkuYzogTmV3IGZpbGUuCisJKiBzcmMvZmZpdGVzdC5jIChjbG9zdXJlX3Rlc3RfZm4pOiBOZXcgZnVuY3Rpb24uCisJKG1haW4pOiBEZWZpbmUgYHJpbnQnIGFzIGxvbmcgbG9uZyBvbiBJQTY0LiAgQWRkZWQgbmV3IHRlc3Qgd2hlbgorCUZGSV9DTE9TVVJFUyBpcyBkZWZpbmVkLgorCSogaW5jbHVkZS9mZmkuaC5pbiAoQUxJR04pOiBVc2Ugc2l6ZV90LCBub3QgdW5zaWduZWQuCisJKGZmaV9hYmkpOiBSZWNvZ25pemUgSUE2NC4KKwkoZmZpX3Jhdyk6IEFkZGVkIGBmbHQnIGZpZWxkLgorCUFkZGVkICJKYXZhIHJhdyBBUEkiIGNvZGUuCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpYTY0LgorCSogTWFrZWZpbGUuYW0gKFRBUkdFVF9TUkNfSUE2NCk6IE5ldyBtYWNyby4KKwkobGliZmZpX2xhX2NvbW1vbl9TT1VSQ0VTKTogQWRkZWQgamF2YV9yYXdfYXBpLmMuCisJKGxpYmZmaV9sYV9TT1VSQ0VTKTogRGVmaW5lIGluIElBNjQgY2FzZS4KKworMjAwMC0wMS0wNCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdCB3aXRoIG5ld2VyIGF1dG9tYWtlLgorCisxOTk5LTEyLTMxICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IEFkZGVkIC1JJCh0b3Bfc3JjZGlyKS9zcmMuCisKKzE5OTktMDktMDEgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogaW5jbHVkZS9mZmkuaC5pbjogUmVtb3ZlZCBQQUNLQUdFIGFuZCBWRVJTSU9OIGRlZmluZXMgYW5kCisJdW5kZWZzLgorCSogZmZpY29uZmlnLmguaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBjb25maWd1cmUuaW46IFBhc3MgM3JkIGFyZ3VtZW50IHRvIEFNX0lOSVRfQVVUT01BS0UuCisJVXNlIEFNX1BST0dfTElCVE9PTCAoYXV0b21ha2UgMS40IGNvbXBhdGliaWxpdHkpLgorCSogYWNjb25maWcuaDogRG9uJ3QgI3VuZGVmIFBBQ0tBR0Ugb3IgVkVSU0lPTi4KKworMTk5OS0wOC0wOSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGN5Z251cy5jb20+CisKKwkqIGluY2x1ZGUvZmZpLmguaW46IFRyeSB0byB3b3JrIGFyb3VuZCBtZXNzeSBoZWFkZXIgcHJvYmxlbQorCXdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTi4KKworCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiB0byAyLjAwLWJldGEuCisKKwkqIGZmaWNvbmZpZy5oLmluOiBSZWJ1aWx0LgorCSogYWNjb25maWcuaCAoRkZJX05PX1NUUlVDVFMsIEZGSV9OT19SQVdfQVBJKTogRGVmaW5lLgorCisJKiBzcmMveDg2L2ZmaS5jIChmZmlfcmF3X2NhbGwpOiBSZW5hbWUuCisKKzE5OTktMDgtMDIgIEtyZXN0ZW4gS3JhYiBUaG9ydXAgIDxrcmFiQGRvbWluaXEuaXMucy51LXRva3lvLmFjLmpwPgorCisJKiBzcmMveDg2L2ZmaS5jIChmZmlfY2xvc3VyZV9TWVNWKTogTmV3IGZ1bmN0aW9uLgorCShmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YpOiBEaXR0by4KKwkoZmZpX3ByZXBfY2xvc3VyZSk6IERpdHRvLgorCShmZmlfY2xvc3VyZV9yYXdfU1lTVik6IERpdHRvLgorCShmZmlfcHJlcF9yYXdfY2xvc3VyZSk6IE1vcmUgZGl0dG8uCisJKGZmaV9jYWxsX3Jhdyk6IEZpbmFsIGRpdHRvLgorCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBBZGQgZGVmaW5pdGlvbnMgZm9yIGNsb3N1cmUgYW5kIHJhdyBBUEkuCisKKwkqIHNyYy94ODYvZmZpLmMgKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogQWRkZWQgY2FzZSBmb3IKKwlGRklfVFlQRV9VSU5UNjQuCisKKwkqIE1ha2VmaWxlLmFtIChsaWJmZmlfbGFfY29tbW9uX1NPVVJDRVMpOiBBZGRlZCByYXdfYXBpLmMKKworCSogc3JjL3Jhd19hcGkuYzogTmV3IGZpbGUuCisKKwkqIGluY2x1ZGUvZmZpLmguaW4gKGZmaV9yYXcpOiBOZXcgdHlwZS4KKwkoVUlOVF9BUkcsIFNJTlRfQVJHKTogTmV3IGRlZmluZXMuCisJKGZmaV9jbG9zdXJlLCBmZmlfcmF3X2Nsb3N1cmUpOiBOZXcgdHlwZXMuCisJKGZmaV9wcmVwX2Nsb3N1cmUsIGZmaV9wcmVwX3Jhd19jbG9zdXJlKTogTmV3IGRlY2xhcmF0aW9ucy4KKworCSogY29uZmlndXJlLmluOiBBZGQgY2hlY2sgZm9yIGVuZGlhbm5lc3MgYW5kIHNpemVvZiB2b2lkKi4KKworCSogc3JjL3g4Ni9zeXN2LlMgKGZmaV9jYWxsX1NZU1YpOiBDYWxsIGZpeHVwIHJvdXRpbmUgdmlhIGFyZ3VtZW50LAorCWluc3RlYWQgb2YgZGlyZWN0bHkuCisKKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworVGh1IEp1bCAgOCAxNDoyODo0MiAxOTk5ICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgeDg2IGFuZCBwb3dlcnBjIEJlT1MgY29uZmlndXJhdGlvbnMuCisJRnJvbSBNYWtvdG8gS2F0byA8bV9rYXRvQGdhMi5zby1uZXQubmUuanA+LgorCisxOTk5LTA1LTA5ICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgd2FybmluZyBhYm91dCB0aGlzIGJlaW5nIGJldGEgY29kZS4KKwlSZW1vdmUgc3JjL01ha2VmaWxlLmFtIGZyb20gdGhlIHBpY3R1cmUuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKwkqIE1ha2VmaWxlLmFtOiBNb3ZlIGxvZ2ljIGZyb20gc3JjL01ha2VmaWxlLmFtLiAgQWRkIGNoYW5nZXMKKwl0byBzdXBwb3J0IGxpYmZmaSBhcyBhIHRhcmdldCBsaWJyYXJ5LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwgbHRjb25maWcsIGx0bWFpbi5zaDoKKwlVcGdyYWRlZCB0byBuZXcgYXV0b2NvbmYsIGF1dG9tYWtlLCBsaWJ0b29sLgorCisJKiBSRUFETUU6IFR3ZWFrcy4KKworCSogTElDRU5TRTogVXBkYXRlIGNvcHlyaWdodCBkYXRlLgorCisJKiBzcmMvTWFrZWZpbGUuYW0sIHNyYy9NYWtlZmlsZS5pbjogUmVtb3ZlZC4KKworMTk5OC0xMS0yOSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGN5Z251cy5jb20+CisKKwkqIGluY2x1ZGUvQ2hhbmdlTG9nOiBSZW1vdmVkLgorCSogc3JjL0NoYW5nZUxvZzogUmVtb3ZlZC4KKwkqIHNyYy9taXBzL0NoYW5nZUxvZzogUmVtb3ZlZC4KKwkqIHNyYy9zcGFyYy9DaGFuZ2VMb2c6IFJlbWJvdmVkLgorCSogc3JjL3g4Ni9DaGFuZ2VMb2c6IFJlbW92ZWQuCisKKwkqIENoYW5nZUxvZy52MTogQ3JlYXRlZC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9DaGFuZ2VMb2cubGliZmZpIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL0NoYW5nZUxvZy5saWJmZmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlZThiMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9DaGFuZ2VMb2cubGliZmZpCkBAIC0wLDAgKzEsNTg0IEBACisyMDExLTAyLTA4ICBBbmRyZWFzIFRvYmxlciAgPGFuZHJlYXN0QGZnem5ldC5jaD4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmkuZXhwOiBUd2VhayBmb3Igc3RhbmQtYWxvbmUgbW9kZS4KKworMjAwOS0xMi0yNSAgU2FtdWxpIFN1b21pbmVuICA8c3N1b21pbmVuQGdlbnRvby5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogVW5kZWZpbmUgX0FDX0FSR19WQVJfUFJFQ0lPVVMgZm9yIGF1dG9jb25mIDIuNjQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBmZmljb25maWcuaC5pbjogUmVidWlsdC4KKworMjAwOS0wNi0xNiAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDY0LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fbGwxLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYzogRml4IHByaW50ZiBmb3JtYXQKKwlzcGVjaWZpZXJzLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2h1Z2Vfc3RydWN0LmM6IEFkIHg4NiBYRkFJTHMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQyLmM6IEZpeCBkZy1leGNlc3MtZXJyb3JzLgorCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2ZmaXRlc3QuaCwKKwl0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oIChQUklkTEwsIFBSSXVMTCk6IERlZmluZS4KKworMjAwOS0wNi0xMiAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDY0LmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fbGwxLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYzogRml4IHByaW50ZiBmb3JtYXQKKwlzcGVjaWZpZXJzLgorCXRlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0LmNjOiBpbmNsdWRlIHN0ZGludC5oLgorCisyMDA5LTA2LTExICBUaW1vdGh5IFdhbGwgIDx0d2FsbEB1c2Vycy5zZi5uZXQ+CisKKwkqIE1ha2VmaWxlLmFtLAorICAgICAgICBjb25maWd1cmUuYWMsCisgICAgICAgIGluY2x1ZGUvZmZpLmguaW4sCisgICAgICAgIGluY2x1ZGUvZmZpX2NvbW1vbi5oLAorICAgICAgICBzcmMvY2xvc3VyZXMuYywKKyAgICAgICAgc3JjL2RsbWFsbG9jLmMsCisgICAgICAgIHNyYy94ODYvZmZpLmMsCisgICAgICAgIHNyYy94ODYvZmZpdGFyZ2V0LmgsCisgICAgICAgIHNyYy94ODYvd2luNjQuUyAobmV3KSwKKwlSRUFETUU6IEFkZGVkIHdpbjY0IHN1cHBvcnQgKG1pbmd3IG9yIE1TVkMpCisgICAgICAgICogTWFrZWZpbGUuaW4sCisgICAgICAgIGluY2x1ZGUvTWFrZWZpbGUuaW4sCisgICAgICAgIG1hbi9NYWtlZmlsZS5pbiwKKyAgICAgICAgdGVzdHN1aXRlL01ha2VmaWxlLmluLAorICAgICAgICBjb25maWd1cmUsCisgICAgICAgIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkCisgICAgICAgICogbHRjZi1jLnNoOiBwcm9wZXJseSBlc2NhcGUgY3lnd2luL3czMiBwYXRoCisgICAgICAgICogbWFuL2ZmaV9jYWxsLjM6IENsYXJpZnkgc2l6ZSByZXF1aXJlbWVudHMgZm9yIHJldHVybiB2YWx1ZS4KKyAgICAgICAgKiBzcmMveDg2L2ZmaTY0LmM6IEZpeCBmaWxlbmFtZSBpbiBjb21tZW50LgorICAgICAgICAqIHNyYy94ODYvd2luMzIuUzogUmVtb3ZlIHVudXNlZCBleHRlcm4uCisKKyAgICAgICAgKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYywKKyAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMsCisgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMi5jLAorICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjMuYywKKyAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmMsCisgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNS5jLAorICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjYuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9zdGRjYWxsLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzE2Ynl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMThieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzFfMWJ5dGUuYywKKwl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjRieXRlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yYnl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM18xYnl0ZS5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUxLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRieXRlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNV8xX2J5dGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc181Ynl0ZS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzY0Ynl0ZS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZfMV9ieXRlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNmJ5dGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOGJ5dGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTEuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9kb3VibGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9mbG9hdC5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9wb2ludGVyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDE2LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDY0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDE2LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDY0LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZGJsc19zdHJ1Y3QuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGVfdmEuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19mbG9hdC5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGUuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc2NoYXIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnRjaGFyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfdWNoYXIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnRjaGFyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlci5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zY2hhci5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NpbnQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191Y2hhci5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VpbnQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191c2hvcnQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX3R5cGVkZWYuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0Mi5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTAuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0My5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q1LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDcuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q4LmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvcHJvYmxlbTEuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sZGwuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sbDEuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X2xhcmdlLmMsCisgCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYywKKyAJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bS5jLAorIAl0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jLAorICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdC5jYzogdXNlIGZmaV9jbG9zdXJlX2FsbG9jIGluc3RlYWQKKyAgICAgICAgb2YgY2hlY2tpbmcgZm9yIE1NQVAuICBVc2UgaW50cHRyX3QgaW5zdGVhZCBvZiBsb25nIGNhc3RzLgorCisyMDA5LTA2LTA0ICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogc3JjL3Bvd2VycGMvZmZpdGFyZ2V0Lmg6IEZpeCBtaXNhcHBsaWVkIG1lcmdlIGZyb20gZ2NjLgorCisyMDA5LTA2LTA0ICBBbmRyZXcgSGFsZXkgIDxhcGhAcmVkaGF0LmNvbT4KKworCSogc3JjL21pcHMvbzMyLlMsCisJc3JjL21pcHMvbjMyLlM6IEZpeCBsaWNlbmNlIGZvcm1hdHRpbmcuCisKKzIwMDktMDYtMDQgIEFuZHJldyBIYWxleSAgPGFwaEByZWRoYXQuY29tPgorCisJKiBzcmMveDg2L2Rhcndpbi5TOiBGaXggbGljZW5jZSBmb3JtYXR0aW5nLgorCXNyYy94ODYvd2luMzIuUzogTGlrZXdpc2UuCisJc3JjL3NoNjQvc3lzdi5TOiBMaWtld2lzZS4KKwlzcmMvc2gvc3lzdi5TOiBMaWtld2lzZS4KKworMjAwOS0wNi0wNCAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy9zaDY0L2ZmaS5jOiBSZW1vdmUgbGludCBkaXJlY3RpdmVzLiAgV2FzIG1pc3NpbmcgZnJvbSBtZXJnZQorCW9mIEFuZHJlYXMgVG9ibGVyJ3MgcGF0Y2ggZnJvbSAyMDA2LTA0LTIyLgorCQorMjAwOS0wNi0wNCAgQW5kcmV3IEhhbGV5ICA8YXBoQHJlZGhhdC5jb20+CisKKwkqIHNyYy9zaC9mZmkuYzogQXBwbHkgbWlzc2luZyBodW5rIGZyb20gQWxleGFuZHJlIE9saXZhJ3MgcGF0Y2ggb2YKKwkyMDA3LTAzLTA3LgorCisyMDA4LTEyLTI2ICBUaW1vdGh5IFdhbGwgIDx0d2FsbEB1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jLAorICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYywKKyAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlLmMsCisgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jLAorICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQyLmM6IG1hcmsgZXhwZWN0ZWQKKyAgICAgICAgZmFpbHVyZXMgb24geDg2XzY0IGN5Z3dpbi9taW5ndy4KKworMjAwOC0xMi0yMiAgVGltb3RoeSBXYWxsICA8dHdhbGxAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYywKKyAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMsICAgIAorICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjIuYywgICAgCisgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMy5jLCAgICAKKyAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmMsICAgIAorICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjUuYywgICAgCisgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNi5jLCAgICAKKyAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfbG9jX2ZuMC5jLCAgICAKKyAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfc3RkY2FsbC5jLCAgICAKKyAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9wb2ludGVyLmMsICAgIAorICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYywgICAgCisgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlcl9zdGFjay5jOiB1c2UgcG9ydGFibGUgY2FzdCBmcm9tCisgICAgICAgIHBvaW50ZXIgdG8gaW50ZWdlciAoaW50cHRyX3QpLgorICAgICAgICAqIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jOiBkaXNhYmxlIGZvciB3aW42NC4KKwkKKzIwMDgtMTItMTkgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgdmVyc2lvbiB0byAzLjAuOC4KKwkqIGNvbmZpZ3VyZSwgZG9jL3N0YW1wLXZ0aSwgZG9jL3ZlcnNpb24udGV4aTogUmVidWlsdC4KKwkqIGxpYnRvb2wtdmVyc2lvbjogSW5jcmVtZW50IHJldmlzaW9uLgorCSogUkVBRE1FOiBVcGRhdGUgZm9yIG5ldyByZWxlYXNlLgorCisyMDA4LTExLTExICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOiBCdW1wIHZlcnNpb24gdG8gMy4wLjcuCisJKiBjb25maWd1cmUsIGRvYy9zdGFtcC12dGksIGRvYy92ZXJzaW9uLnRleGk6IFJlYnVpbHQuCisJKiBsaWJ0b29sLXZlcnNpb246IEluY3JlbWVudCByZXZpc2lvbi4KKwkqIFJFQURNRTogVXBkYXRlIGZvciBuZXcgcmVsZWFzZS4KKworMjAwOC0wOC0yNSAgQW5kcmVhcyBUb2JsZXIgIDxhLnRvYmxlckBzY2h3ZWl6Lm9yZz4KKworCSogc3JjL3Bvd2VycGMvZmZpdGFyZ2V0LmggKGZmaV9hYmkpOiBBZGQgRkZJX0xJTlVYIGFuZAorCUZGSV9MSU5VWF9TT0ZUX0ZMT0FUIHRvIHRoZSBQT1dFUlBDX0ZSRUVCU0QgZW51bS4KKwlBZGQgbm90ZSBhYm91dCBmbGFnIGJpdHMgdXNlZCBmb3IgRkZJX1NZU1ZfVFlQRV9TTUFMTF9TVFJVQ1QuCisJQWRqdXN0IGNvcHlyaWdodCBub3RpY2UuCisJKiBzcmMvcG93ZXJwYy9mZmkuYzogQWRkIHR3byBuZXcgZmxhZ3MgdG8gaW5kaWNhdGUgaWYgd2UgaGF2ZSBvbmUKKwlyZWdpc3RlciBvciB0d28gcmVnaXN0ZXIgdG8gdXNlIGZvciBGRklfU1lTViBzdHJ1Y3RzLgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IFBhc3MgdGhlIHJpZ2h0IHJlZ2lzdGVyIGZsYWcgaW50cm9kdWNlZCBhYm92ZS4KKwkoZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YpOiBGaXggdGhlIHJldHVybiB0eXBlIGZvcgorCUZGSV9TWVNWX1RZUEVfU01BTExfU1RSVUNULiBDb21tZW50LgorCUFkanVzdCBjb3B5cmlnaHQgbm90aWNlLgorCisyMDA4LTA3LTI0ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kYmxzX3N0cnVjdC5jLAorCXRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlX3ZhLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMsCisJdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmM6IENsZWFuIHVwIGZhaWx1cmVzIGZyb20KKwljb21waWxlciB3YXJuaW5ncy4KKworMjAwOC0wNy0xNyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQnVtcCB2ZXJzaW9uIHRvIDMuMC42LgorCSogY29uZmlndXJlLCBkb2Mvc3RhbXAtdnRpLCBkb2MvdmVyc2lvbi50ZXhpOiBSZWJ1aWx0LgorCSogbGlidG9vbC12ZXJzaW9uOiBJbmNyZW1lbnQgcmV2aXNpb24uICBBZGQgZG9jdW1lbnRhdGlvbi4KKwkqIFJFQURNRTogVXBkYXRlIGZvciBuZXcgcmVsZWFzZS4KKworMjAwOC0wNy0xNiAgS2F6IEtvamltYSAgPGtrb2ppbWFAZ2NjLmdudS5vcmc+CisKKwkqIHNyYy9zaC9mZmkuYyAoZmZpX3ByZXBfY2xvc3VyZV9sb2MpOiBUdXJuIElOU04gaW50byBhbiB1bnNpZ25lZAorCWludC4KKworMjAwOC0wNy0xNiAgS2F6IEtvamltYSAgPGtrb2ppbWFAZ2NjLmdudS5vcmc+CisKKwkqIHNyYy9zaC9zeXN2LlM6IEFkZCAubm90ZS5HTlUtc3RhY2sgb24gTGludXguCisJKiBzcmMvc2g2NC9zeXN2LlM6IExpa2V3aXNlLgorCisyMDA4LTA0LTAzICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogbGliZmZpLnBjLmluIChMaWJzKTogQWRkIC1MJHtsaWJkaXJ9LgorCSogY29uZmlndXJlLmFjOiBCdW1wIHZlcnNpb24gdG8gMy4wLjUuCisJKiBjb25maWd1cmUsIGRvYy9zdGFtcC12dGksIGRvYy92ZXJzaW9uLnRleGk6IFJlYnVpbHQuCisJKiBsaWJ0b29sLXZlcnNpb246IEluY3JlbWVudCByZXZpc2lvbi4KKwkqIFJFQURNRTogVXBkYXRlIGZvciBuZXcgcmVsZWFzZS4KKworMjAwOC0wNC0wMyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisJICAgIFhlcmNlcyBSYW5ieSAgPHhlcnhlc0B6YWZlbmEuc2U+CisKKwkqIGluY2x1ZGUvZmZpLmguaW46IFdyYXAgZGVmaW5pdGlvbiBvZiB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRvCisJcHJvdGVjdCBmcm9tIGRvdWJsZSBkZWZpbml0aW9ucy4KKworMjAwOC0wMy0yMiAgTW9yaXlvc2hpIEtvaXp1bWkgIDxtb3JpeW9zaGlAZ21haWwuY29tPgorCisJKiBzcmMveDg2L2ZmaS5jIChmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IEZpeCBmb3IgYnVnIHJldmVhbGVkIGluCisJY2xvc3VyZV9sb2NfZm4wLmMuCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9sb2NfZm4wLmMgKGNsb3N1cmVfbG9jX3Rlc3RfZm4wKToKKwlOZXcgdGVzdC4KKworMjAwOC0wMy0wNCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisJICAgIEJsYWtlIENoYWZmaW4KKwkgICAgaG9zQHRhbWFuZWdpLm9yZworCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQyLmMKKyAgICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQuYworICAgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZGJsc19zdHJ1Y3QuYworICAgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMKKyAgICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGUuYworICAgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jCisgICAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMKKyAgICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYworICAgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX2FiaS5jCisgICAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jCisgICAgICAgICAgdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2h1Z2Vfc3RydWN0LmMKKyAgICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMKKyAgICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UuYworICAgICAgICAgIHRlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9tZWRpdW0yLmMKKyAgICAgICAgICB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmM6IE5ldyB0ZXN0cyBmcm9tIEFwcGxlLgorCisyMDA4LTAyLTI2ICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KKyAgICAgICAgICAgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBzcmMvYWxwaGEvb3NmLlM6IEFkZCAubm90ZS5HTlUtc3RhY2sgb24gTGludXguCisJKiBzcmMvczM5MC9zeXN2LlM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvbGludXg2NC5TOiBMaWtld2lzZS4KKwkqIHNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TOiBMaWtld2lzZS4KKwkqIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlM6IExpa2V3aXNlLgorCSogc3JjL3Bvd2VycGMvc3lzdi5TOiBMaWtld2lzZS4KKwkqIHNyYy94ODYvdW5peDY0LlM6IExpa2V3aXNlLgorCSogc3JjL3g4Ni9zeXN2LlM6IExpa2V3aXNlLgorCSogc3JjL3NwYXJjL3Y4LlM6IExpa2V3aXNlLgorCSogc3JjL3NwYXJjL3Y5LlM6IExpa2V3aXNlLgorCSogc3JjL202OGsvc3lzdi5TOiBMaWtld2lzZS4KKwkqIHNyYy9pYTY0L3VuaXguUzogTGlrZXdpc2UuCisJKiBzcmMvYXJtL3N5c3YuUzogTGlrZXdpc2UuCisKKzIwMDgtMDItMjYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorICAgICAgICAgICAgVGhvbWFzIEhlbGxlciAgPHRoZWxsZXJAY3R5cGVzLm9yZz4KKworCSogc3JjL3g4Ni9mZmkuYyAoZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcik6IENoYW5nZSBDKysgY29tbWVudCB0byBDCisJY29tbWVudC4KKworMjAwOC0wMi0yNiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5vcmc+CisgICAgICAgICAgICBUaG9tYXMgSGVsbGVyICA8dGhlbGxlckBjdHlwZXMub3JnPgorCisJKiBpbmNsdWRlL2ZmaS5oLmluOiBDaGFuZ2Ugdm9pZCAoKikoKSB0byB2b2lkICgqKSh2b2lkKS4KKworMjAwOC0wMi0yNiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5vcmc+CisgICAgICAgICAgICBUaG9tYXMgSGVsbGVyICA8dGhlbGxlckBjdHlwZXMub3JnPgorCisJKiBzcmMvYWxwaGEvZmZpLmM6IENoYW5nZSB2b2lkICgqKSgpIHRvIHZvaWQgKCopKHZvaWQpLgorCXNyYy9hbHBoYS9vc2YuUywgc3JjL2FybS9mZmkuYywgc3JjL2Zydi9mZmkuYywgc3JjL2lhNjQvZmZpLmMsCisJc3JjL2lhNjQvdW5peC5TLCBzcmMvamF2YV9yYXdfYXBpLmMsIHNyYy9tMzJyL2ZmaS5jLAorCXNyYy9taXBzL2ZmaS5jLCBzcmMvcGEvZmZpLmMsIHNyYy9wYS9ocHV4MzIuUywgc3JjL3BhL2xpbnV4LlMsCisJc3JjL3Bvd2VycGMvZmZpLmMsIHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYywgc3JjL3Jhd19hcGkuYywKKwlzcmMvczM5MC9mZmkuYywgc3JjL3NoL2ZmaS5jLCBzcmMvc2g2NC9mZmkuYywgc3JjL3NwYXJjL2ZmaS5jLAorCXNyYy94ODYvZmZpLmMsIHNyYy94ODYvdW5peDY0LlMsIHNyYy94ODYvZGFyd2luNjQuUywKKwlzcmMveDg2L2ZmaTY0LmM6IERpdHRvLgorCisyMDA4LTAyLTI0ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0Lm9yZz4KKworCSogY29uZmlndXJlLmFjOiBBY2NlcHQgb3BlbmJzZCosIG5vdCBqdXN0IG9wZW5ic2QuCisJQnVtcCB2ZXJzaW9uIHRvIDMuMC40LgorCSogY29uZmlndXJlLCBkb2Mvc3RhbXAtdnRpLCBkb2MvdmVyc2lvbi50ZXhpOiBSZWJ1aWx0LgorCSogbGlidG9vbC12ZXJzaW9uOiBJbmNyZW1lbnQgcmV2aXNpb24uCisJKiBSRUFETUU6IFVwZGF0ZSBmb3IgbmV3IHJlbGVhc2UuCisKKzIwMDgtMDItMjIgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBSRUFETUU6IENsZWFuIHVwIGxpc3Qgb2YgdGVzdGVkIHBsYXRmb3Jtcy4KKworMjAwOC0wMi0yMiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQnVtcCB2ZXJzaW9uIHRvIDMuMC4zLgorCSogY29uZmlndXJlLCBkb2Mvc3RhbXAtdnRpLCBkb2MvdmVyc2lvbi50ZXhpOiBSZWJ1aWx0LgorCSogbGlidG9vbC12ZXJzaW9uOiBJbmNyZW1lbnQgcmV2aXNpb24uCisJKiBSRUFETUU6IFVwZGF0ZSBmb3IgbmV3IHJlbGVhc2UuICBDbGVhbiB1cCB0ZXN0IGRvY3MuCisKKzIwMDgtMDItMjIgIEJqb2VybiBLb2VuaWcgIDxia29lbmlnQGFscGhhLXRpZXJjaGVuLmRlPgorCSAgICBBbmRyZWFzIFRvYmxlciAgPGEudG9ibGVyQHNjaHdlaXoub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCBhbWQ2NC0qLWZyZWVic2QqIHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworMjAwOC0wMi0yMiAgVGhvbWFzIEhlbGxlciA8dGhlbGxlckBjdHlwZXMub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEFkZCB4ODYgT3BlbkJTRCBzdXBwb3J0LgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDA4LTAyLTIxICBUaG9tYXMgSGVsbGVyIDx0aGVsbGVyQGN0eXBlcy5vcmc+CisKKwkqIFJFQURNRTogQ2hhbmdlICJtYWtlIHRlc3QiIHRvICJtYWtlIGNoZWNrIi4KKworMjAwOC0wMi0yMSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzogQnVtcCB2ZXJzaW9uIHRvIDMuMC4yLgorCSogY29uZmlndXJlLCBkb2Mvc3RhbXAtdnRpLCBkb2MvdmVyc2lvbi50ZXhpOiBSZWJ1aWx0LgorCSogbGlidG9vbC12ZXJzaW9uOiBJbmNyZW1lbnQgcmV2aXNpb24uCisJKiBSRUFETUU6IFVwZGF0ZSBmb3IgbmV3IHJlbGVhc2UuCisKKzIwMDgtMDItMjEgIEJqw7ZybiBLw7ZuaWcgPGJrb2VuaWdAYWxwaGEtdGllcmNoZW4uZGU+CisKKwkqIHNyYy94ODYvZnJlZWJzZC5TOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5hYzogQWRkIHg4NiBGcmVlQlNEIHN1cHBvcnQuCisJKiBNYWtlZmlsZS5hbTogRGl0dG8uCisKKzIwMDgtMDItMTUgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgdmVyc2lvbiB0byAzLjAuMS4KKwkqIGNvbmZpZ3VyZSwgZG9jL3N0YW1wLXZ0aSwgZG9jL3ZlcnNpb24udGV4aTogUmVidWlsdC4KKwkqIGxpYnRvb2wtdmVyc2lvbjogSW5jcmVtZW50IHJldmlzaW9uLgorCSogUkVBRE1FOiBVcGRhdGUgZm9yIG5ldyByZWxlYXNlLgorCisyMDA4LTAyLTE1ICBEYXZpZCBEYW5leQkgPGRkYW5leUBhdnRyZXguY29tPgorCisJKiBzcmMvbWlwcy9mZmkuYzogUmVtb3ZlIGV4dHJhICc+JyBmcm9tIGluY2x1ZGUgZGlyZWN0aXZlLgorCShmZmlfcHJlcF9jbG9zdXJlX2xvYyk6IFVzZSBjbGVhcl9sb2NhdGlvbiBpbnN0ZWFkIG9mIHRyYW1wLgorCisyMDA4LTAyLTE1ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOiBCdW1wIHZlcnNpb24gdG8gMy4wLjAuCisJKiBjb25maWd1cmUsIGRvYy9zdGFtcC12dGksIGRvYy92ZXJzaW9uLnRleGk6IFJlYnVpbHQuCisKKzIwMDgtMDItMTUgIERhdmlkIERhbmV5CSA8ZGRhbmV5QGF2dHJleC5jb20+CisKKwkqIHNyYy9taXBzL2ZmaS5jIChVU0VfX0JVSUxUSU5fX19DTEVBUl9DQUNIRSk6CisJRGVmaW5lIChjb25kaXRpb25hbGx5KSwgYW5kIHVzZSBpdCB0byBpbmNsdWRlIGNhY2hlY3RsLmguCisJKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogRml4IGNhY2hlIGZsdXNoaW5nLgorCSogc3JjL21pcHMvZmZpdGFyZ2V0LmggKF9BQklOMzIsIF9BQkk2NCwgX0FCSU8zMik6IERlZmluZS4KKworMjAwOC0wMi0xNSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBtYW4vZmZpX2NhbGwuMywgbWFuL2ZmaV9wcmVwX2NpZi4zLCBtYW4vZmZpLjM6CisJVXBkYXRlIGRhdGVzIGFuZCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZmZpX3ByZXBfY2xvc3VyZS4KKwkqIGNvbmZpZ3VyZS5hYzogQnVtcCB2ZXJzaW9uIHRvIDIuOTkuOS4KKwkqIGNvbmZpZ3VyZSwgZG9jL3N0YW1wLXZ0aSwgZG9jL3ZlcnNpb24udGV4aTogUmVidWlsdC4KKworMjAwOC0wMi0xNSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIG1hbi9mZmlfcHJlcF9jbG9zdXJlLjM6IERlbGV0ZS4KKwkqIG1hbi9NYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IFJlbW92ZSBmZmlfcHJlcF9jbG9zdXJlLjMuCisJKG1hbl9NQU5TKTogRGl0dG8uCisJKiBtYW4vTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgdmVyc2lvbiB0byAyLjk5LjguCisJKiBjb25maWd1cmUsIGRvYy9zdGFtcC12dGksIGRvYy92ZXJzaW9uLnRleGk6IFJlYnVpbHQuCisKKzIwMDgtMDItMTQgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgdmVyc2lvbiB0byAyLjk5LjcuCisJKiBjb25maWd1cmUsIGRvYy9zdGFtcC12dGksIGRvYy92ZXJzaW9uLnRleGk6IFJlYnVpbHQuCisJKiBpbmNsdWRlL2ZmaS5oLmluIExJQ0VOU0Ugc3JjL2RlYnVnLmMgc3JjL2Nsb3N1cmVzLmMKKyAgICAgICAgICBzcmMvZmZpdGVzdC5jIHNyYy9zMzkwL3N5c3YuUyBzcmMvczM5MC9mZml0YXJnZXQuaAorICAgICAgICAgIHNyYy90eXBlcy5jIHNyYy9tNjhrL2ZmaXRhcmdldC5oIHNyYy9yYXdfYXBpLmMgc3JjL2Zydi9mZmkuYworICAgICAgICAgIHNyYy9mcnYvZmZpdGFyZ2V0Lmggc3JjL3NoL2ZmaS5jIHNyYy9zaC9zeXN2LlMKKyAgICAgICAgICBzcmMvc2gvZmZpdGFyZ2V0Lmggc3JjL3Bvd2VycGMvZmZpdGFyZ2V0Lmggc3JjL3BhL2ZmaS5jCisgICAgICAgICAgc3JjL3BhL2ZmaXRhcmdldC5oIHNyYy9wYS9saW51eC5TIHNyYy9qYXZhX3Jhd19hcGkuYworICAgICAgICAgIHNyYy9jcmlzL2ZmaXRhcmdldC5oIHNyYy94ODYvZmZpLmMgc3JjL3g4Ni9zeXN2LlMKKyAgICAgICAgICBzcmMveDg2L3VuaXg2NC5TIHNyYy94ODYvd2luMzIuUyBzcmMveDg2L2ZmaXRhcmdldC5oCisgICAgICAgICAgc3JjL3g4Ni9mZmk2NC5jIHNyYy94ODYvZGFyd2luLlMgc3JjL2lhNjQvZmZpLmMKKyAgICAgICAgICBzcmMvaWE2NC9mZml0YXJnZXQuaCBzcmMvaWE2NC9pYTY0X2ZsYWdzLmggc3JjL2lhNjQvdW5peC5TCisgICAgICAgICAgc3JjL3NwYXJjL2ZmaS5jIHNyYy9zcGFyYy92OS5TIHNyYy9zcGFyYy9mZml0YXJnZXQuaAorICAgICAgICAgIHNyYy9zcGFyYy92OC5TIHNyYy9hbHBoYS9mZmkuYyBzcmMvYWxwaGEvZmZpdGFyZ2V0LmgKKyAgICAgICAgICBzcmMvYWxwaGEvb3NmLlMgc3JjL3NoNjQvZmZpLmMgc3JjL3NoNjQvc3lzdi5TCisgICAgICAgICAgc3JjL3NoNjQvZmZpdGFyZ2V0Lmggc3JjL21pcHMvZmZpLmMgc3JjL21pcHMvZmZpdGFyZ2V0LmgKKyAgICAgICAgICBzcmMvbWlwcy9uMzIuUyBzcmMvbWlwcy9vMzIuUyBzcmMvYXJtL2ZmaS5jIHNyYy9hcm0vc3lzdi5TCisgICAgICAgICAgc3JjL2FybS9mZml0YXJnZXQuaCBzcmMvcHJlcF9jaWYuYzogVXBkYXRlIGxpY2Vuc2UgdGV4dC4KKworMjAwOC0wMi0xNCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIFJFQURNRTogVXBkYXRlIHRlc3RlZCBwbGF0Zm9ybXMuCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgdmVyc2lvbiB0byAyLjk5LjYuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDgtMDItMTQgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgdmVyc2lvbiB0byAyLjk5LjUuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBkYXJ3aW42NC5TCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIHRlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cDogUmVtb3ZlIGxpYnN0ZGMrKyBiaXRzIGZyb20gR0NDIHRyZWUuCisJKiBMSUNFTlNFOiBVcGRhdGUgV0FSUkFOVFkuCisKKzIwMDgtMDItMTQgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBsaWJmZmkucGMuaW4gKGxpYmRpcik6IEZpeCBsaWJkaXIgZGVmaW5pdGlvbi4KKwkqIGNvbmZpZ3VyZS5hYzogQnVtcCB2ZXJzaW9uIHRvIDIuOTkuNC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworMjAwOC0wMi0xNCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIFJFQURNRTogVXBkYXRlLgorCSogbGliZmZpLmluZm86IE5ldyBmaWxlLgorCSogZG9jL3N0YW1wLXZ0aTogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuYWM6IEJ1bXAgdmVyc2lvbiB0byAyLjk5LjMuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDgtMDItMTQgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IEFkZCBtYW4gZGlyLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmUuYWM6IENyZWF0ZSBNYWtlZmlsZS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKyAgICAgICAgKiBtYW4vZmZpX2NhbGwuMyBtYW4vZmZpX3ByZXBfY2lmLjMgbWFuL2ZmaV9wcmVwX2Nsb3N1cmUuMworICAgICAgICAgIG1hbi9NYWtlZmlsZS5hbSBtYW4vTWFrZWZpbGUuaW46IE5ldyBmaWxlcy4KKworMjAwOC0wMi0xNCAgVG9tIFRyb21leSAgPHRyb21leUByZWRoYXQuY29tPgorCisJKiBhY2xvY2FsLm00LCBNYWtlZmlsZS5pbiwgY29uZmlndXJlLCBmZmljb25maWcuaC5pbjogUmVidWlsdC4KKwkqIG1kYXRlLXNoLCB0ZXhpbmZvLnRleDogTmV3IGZpbGVzLgorCSogTWFrZWZpbGUuYW0gKGluZm9fVEVYSU5GT1MpOiBOZXcgdmFyaWFibGUuCisJKiBkb2MvbGliZmZpLnRleGk6IE5ldyBmaWxlLgorCSogZG9jL3ZlcnNpb24udGV4aTogTGlrZXdpc2UuCisKKzIwMDgtMDItMTQgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogRG9uJ3QgY29tcGlsZSB3aXRoIC1EJChUQVJHRVQpLgorCShsaWJfTFRMSUJSQVJJRVMpOiBEZWZpbmUuCisJKHRvb2xleGVjbGliX0xJQlJBUklFUyk6IFVuZGVmaW5lLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBjb25maWd1cmUuYWM6IFJlc2V0IHZlcnNpb24gdG8gMi45OS4xLgorCSogY29uZmlndXJlLmluOiBSZWJ1aWx0LgorCisyMDA4LTAyLTE0ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogbGliZmZpLnBjLmluOiBVc2UgQFBBQ0tBR0VfTkFNRUAgYW5kIEBQQUNLQUdFX1ZFUlNJT05ALgorCSogY29uZmlndXJlLmFjOiBSZXNldCB2ZXJzaW9uIHRvIDIuOTkuMS4KKwkqIGNvbmZpZ3VyZS5pbjogUmVidWlsdC4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIENoYW5nZUxvZy5saWJmZmkuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIExJQ0VOU0U6IFVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlLgorCisyMDA4LTAyLTE0ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogaW5jbHVkZS9NYWtlZmlsZS5hbSAobm9kaXN0X2luY2x1ZGVzX0hFQURFUlMpOiBEZWZpbmUuICBEb24ndAorCWRpc3RyaWJ1dGUgZmZpdGFyZ2V0Lmggb3IgZmZpLmggZnJvbSB0aGUgYnVpbGQgaW5jbHVkZSBkaXIuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKworMjAwOC0wMi0xNCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIGluY2x1ZGUvTWFrZWZpbGUuYW0gKGluY2x1ZGVzZGlyKTogSW5zdGFsbCBoZWFkZXJzIHVuZGVyIGxpYmRpci4KKwkocGtnY29uZmlnZGlyKTogRGVmaW5lLiBJbnN0YWxsIGxpYmZmaS5wYy4KKwkqIGluY2x1ZGUvTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBsaWJmZmkucGMuaW46IENyZWF0ZS4KKwkqIGxpYnRvb2wtdmVyc2lvbjogSW5jcmVtZW50IENVUlJFTlQKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIGxpYmZmaS5wYy5pbgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDA4LTAyLTAzICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogaW5jbHVkZS9NYWtlZmlsZS5hbSAoaW5jbHVkZXNkaXIpOiBGaXggaGVhZGVyIGluc3RhbGwgd2l0aAorCURFU1RESVIuCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisyMDA4LTAyLTAzICBUaW1vdGh5IFdhbGwgIDx0d2FsbEB1c2Vycy5zZi5uZXQ+CisKKwkqIHNyYy94ODYvZmZpLmMgKEZGSV9JTklUX1RSQU1QT0xJTkVfU1REQ0FMTCk6IENhbGN1bGF0ZSBqdW1wIHJldHVybgorICAgICAgICAgIG9mZnNldCBiYXNlZCBvbiBjb2RlIHBvaW50ZXIsIG5vdCBkYXRhIHBvaW50ZXIuCisKKzIwMDgtMDItMDEgIEFudGhvbnkgR3JlZW4gIDxncmVlbkByZWRoYXQuY29tPgorCisJKiBpbmNsdWRlL01ha2VmaWxlLmFtOiBGaXggaGVhZGVyIGluc3RhbGxzLgorCSogTWFrZWZpbGUuYW06IERpdHRvLgorCSogaW5jbHVkZS9NYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIE1ha2VmaWxlLmluOiBEaXR0by4KKworMjAwOC0wMi0wMSAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJlZGhhdC5jb20+CisKKwkqIHNyYy94ODYvZmZpLmMgKEZGSV9JTklUX1RSQU1QT0xJTkVfU1REQ0FMTCwKKwlGRklfSU5JVF9UUkFNUE9MSU5FKTogUmV2ZXJ0IG15IGJyb2tlbiBjaGFuZ2VzIHRvIHR3YWxsJ3MgbGFzdAorCXBhdGNoLgorCisyMDA4LTAxLTMxICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgbWlzc2luZyBmaWxlcy4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5hbTogRGl0dG8uCisJKiBNYWtlZmlsZS5pbiwgdGVzdHN1aXRlL01ha2VmaWxlLmluOiBSZWJ1aWx0LgorCisyMDA4LTAxLTMxICBUaW1vdGh5IFdhbGwgPHR3YWxsQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfc3RkY2FsbC5jOiBBZGQgdGVzdCBmb3Igc3RkY2FsbAorCWNsb3N1cmVzLgorCSogc3JjL3g4Ni9mZml0YXJnZXQuaDogSW5jcmVhc2Ugc2l6ZSBvZiB0cmFtcG9saW5lIGZvciBzdGRjYWxsCisJY2xvc3VyZXMuCisJKiBzcmMveDg2L3dpbjMyLlM6IEFkZCBhc3NlbWJseSBmb3Igc3RkY2FsbCBjbG9zdXJlLgorCSogc3JjL3g4Ni9mZmkuYzogSW5pdGlhbGl6ZSBzdGRjYWxsIGNsb3N1cmUgdHJhbXBvbGluZS4KKworMjAwOC0wMS0zMCAgSC5KLiBMdSA8aG9uZ2ppdS5sdUBpbnRlbC5jb20+CisKKwlQUiBsaWJmZmkvMzQ2MTIKKwkqIHNyYy94ODYvc3lzdi5TIChmZmlfY2xvc3VyZV9TWVNWKTogUG9wIDQgYnl0ZSBmcm9tIHN0YWNrIHdoZW4KKwlyZXR1cm5pbmcgc3RydWN0LgorCisJKiB0ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2FsbC5leHA6IEFkZCAiLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIgorCXRlc3RzLgorCisyMDA4LTAxLTMwICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmVkaGF0LmNvbT4KKworCSogTWFrZWZpbGUuYW0sIGluY2x1ZGUvTWFrZWZpbGUuYW06IE1vdmUgaGVhZGVycyB0bworCWxpYmZmaV9sYV9TT1VSQ0VTIGZvciBuZXcgYXV0b21ha2UuCisJKiBNYWtlZmlsZS5pbiwgaW5jbHVkZS9NYWtlZmlsZS5pbjogUmVidWlsdC4KKwkKKwkqIHRlc3RzdWl0ZS9saWIvd3JhcHBlci5leHA6IENvcGllZCBmcm9tIGdjYyB0cmVlIHRvIGFsbG93IGZvciAKKwlleGVjdXRpb24gb3V0c2lkZSBvZiBnY2MgdHJlZS4KKwkqIHRlc3RzdWl0ZS9saWIvdGFyZ2V0LWxpYnBhdGguZXhwOiBEaXR0by4KKworCSogdGVzdHN1aXRlL2xpYi9saWJmZmktZGcuZXhwOiBNYW55IGNoYW5nZXMgdG8gYWxsb3cgZm9yIGV4ZWN1dGlvbgorCW91dHNpZGUgb2YgZ2NjIHRyZWUuCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9DaGFuZ2VMb2cubGliZ2NqIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL0NoYW5nZUxvZy5saWJnY2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1ZDAyZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9DaGFuZ2VMb2cubGliZ2NqCkBAIC0wLDAgKzEsNDAgQEAKKzIwMDQtMDEtMTQgIEtlbGxleSBDb29rICA8a2Nvb2tAZ2NjLmdudS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGluIEFDX1BSRVJFUSgyLjEzKQorCisyMDAzLTAyLTIwICBBbGV4YW5kcmUgT2xpdmEgIDxhb2xpdmFAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBQcm9wYWdhdGUgT1JJR0lOQUxfTERfRk9SX01VTFRJTElCUyB0bworCWNvbmZpZy5zdGF0dXMuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKzIwMDItMDEtMjcgIEFsZXhhbmRyZSBPbGl2YSAgPGFvbGl2YUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHRvb2xleGVjZGlyLCB0b29sZXhlY2xpYmRpcik6IFNldCBhbmQgQUNfU1VCU1QuCisJUmVtb3ZlIFVTRV9MSUJESVIgY29uZGl0aW9uYWwuCisJKiBNYWtlZmlsZS5hbSAodG9vbGV4ZWNkaXIsIHRvb2xleGVjbGliZGlyKTogRG9uJ3Qgb3ZlcnJpZGUuCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWx0LgorCitNb24gQXVnICA5IDE4OjMzOjM4IDE5OTkgIFJhaW5lciBPcnRoICA8cm9AVGVjaEZhay5VbmktQmllbGVmZWxkLkRFPgorCisJKiBpbmNsdWRlL01ha2VmaWxlLmluOiBSZWJ1aWx0LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQKKwkqIE1ha2VmaWxlLmFtICh0b29sZXhlY2xpYmRpcik6IEFkZCAkKE1VTFRJU1VCRElSKSBldmVuIGZvciBuYXRpdmUKKwlidWlsZHMuCisJVXNlIFVTRV9MSUJESVIuCisKKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkqIGNvbmZpZ3VyZS5pbiAoVVNFX0xJQkRJUik6IERlZmluZSBmb3IgbmF0aXZlIGJ1aWxkcy4KKwlVc2UgbG93ZXJjYXNlIGluIGNvbmZpZ3VyZSAtLWhlbHAgZXhwbGFuYXRpb25zLgorCisxOTk5LTA4LTA4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KKworCSogaW5jbHVkZS9mZmkuaC5pbiAoRkZJX0ZOKTogUmVtb3ZlIGAuLi4nLgorCisxOTk5LTA4LTA4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQ29tcGlsZSB3aXRoIC1mZXhjZXB0aW9ucy4KKworCSogc3JjL3g4Ni9zeXN2LlM6IEFkZCBleGNlcHRpb24gaGFuZGxpbmcgbWV0YWRhdGEuCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9DaGFuZ2VMb2cudjEgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvQ2hhbmdlTG9nLnYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTgyMGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvQ2hhbmdlTG9nLnYxCkBAIC0wLDAgKzEsNzY0IEBACitUaGUgbGliZmZpIHZlcnNpb24gMSBDaGFuZ2VMb2cgYXJjaGl2ZS4KKworVmVyc2lvbiAxIG9mIGxpYmZmaSBoYWQgcGVyLWRpcmVjdG9yeSBDaGFuZ2VMb2dzLiAgQ3VycmVudCBhbmQgZnV0dXJlCit2ZXJzaW9ucyBoYXZlIGEgc2luZ2xlIENoYW5nZUxvZyBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeS4gIFRoZQordmVyc2lvbiAxIENoYW5nZUxvZ3MgaGF2ZSBhbGwgYmVlbiBjb25jYXRvbmF0ZWQgaW50byB0aGlzIGZpbGUgZm9yCitmdXR1cmUgcmVmZXJlbmNlIG9ubHkuCisKKy0tLSBsaWJmZmkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNb24gT2N0ICA1IDAyOjE3OjUwIDE5OTggIEFudGhvbnkgR3JlZW4gIDxncmVlbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEJvb3N0ZWQgcmV2LgorCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsdC4KKwkqIFJFQURNRTogQm9vc3RlZCByZXYgYW5kIHVwZGF0ZWQgcmVsZWFzZSBub3Rlcy4KKworTW9uIE9jdCAgNSAwMTowMzowMyAxOTk4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBCb29zdGVkIHJldi4KKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbHQuCisJKiBSRUFETUU6IEJvb3N0ZWQgcmV2IGFuZCB1cGRhdGVkIHJlbGVhc2Ugbm90ZXMuCisKKzE5OTgtMDctMjUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBtNjhrL2ZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IFVzZSBiaXRtYXNrIGZvciBjaWYtPmZsYWdzLgorCUNvcnJlY3RseSBoYW5kbGUgc21hbGwgc3RydWN0dXJlcy4KKwkoZmZpX3ByZXBfYXJncyk6IEFsc28gaGFuZGxlIHNtYWxsIHN0cnVjdHVyZXMuCisJKGZmaV9jYWxsKTogUGFzcyBzaXplIG9mIHJldHVybiB0eXBlIHRvIGZmaV9jYWxsX1NZU1YuCisJKiBtNjhrL3N5c3YuUzogQWRqdXN0IGZvciBhYm92ZSBjaGFuZ2VzLiAgQ29ycmVjdGx5IGFsaWduIHNtYWxsCisJc3RydWN0dXJlcyBpbiB0aGUgcmV0dXJuIHZhbHVlLgorCisJKiB0eXBlcy5jICh1aW50NjQsIHNpbnQ2NCkgW002OEtdOiBDaGFuZ2UgYWxpZ25tZW50IHRvIDQuCisKK0ZyaSBBcHIgMTcgMTc6MjY6NTggMTk5OCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQm9vc3RlZCByZXYuCisJKiBjb25maWd1cmUsTWFrZWZpbGUuaW4sYWNsb2NhbC5tNDogUmVidWlsdC4KKwkqIFJFQURNRTogQm9vc3RlZCByZXYgYW5kIGFkZGVkIHJlbGVhc2Ugbm90ZXMuCisKK1N1biBGZWIgMjIgMDA6NTA6NDEgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KKworCSogY29uZmlndXJlLmluOiBBZGQgUG93ZXJQQyBjb25maWcgYml0cy4KKworMTk5OC0wMi0xNCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIG02OGsgY29uZmlnIGJpdHMuICBDaGFuZ2UgQUNfQ0FOT05JQ0FMX1NZU1RFTQorCXRvIEFDX0NBTk9OSUNBTF9IT1NULCB0aGlzIGlzIG5vdCBhIGNvbXBpbGVyLiAgVXNlICRob3N0IGluc3RlYWQKKwlvZiAkdGFyZ2V0LiAgUmVtb3ZlIEFDX0NIRUNLX1NJWkVPRihjaGFyKSwgd2UgYWxyZWFkeSBrbm93IHRoZQorCXJlc3VsdC4gIEZpeCBhcmd1bWVudCBvZiBBQ19BUkdfRU5BQkxFLgorCSogY29uZmlndXJlLCBmZmljb25maWcuaC5pbjogUmVidWlsdC4KKworVHVlIEZlYiAxMCAyMDo1Mzo0MCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBBbHBoYSBjb25maWcgYml0cy4KKworVHVlIE1heSAxMyAxMzozOToyMCAxOTk3ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogUkVBRE1FOiBVcGRhdGVkIGRhdGVzIGFuZCByZXdvcmRlZCBJcml4IGNvbW1lbnRzLgorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZWQgQUNfUFJPR19SQU5MSUIuCisKKwkqIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00LCBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZSwKKwlsdG1haW4uc2gsICovTWFrZWZpbGUuaW46IGxpYnRvb2xpemVkIGFnYWluIGFuZAlyZWJ1aWx0IHdpdGggCisJYXV0b21ha2UgYW5kIGF1dG9jb25mLgorCQorU2F0IE1heSAxMCAxODo0NDo1MCAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsdC4KKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29tcHV0ZSBFWFRSQURJU1Q7IG5vdyBoYW5kbGVkIGluCisJc3JjL01ha2VmaWxlLmluLiAgUmVtb3ZlZCBtYWNyb3MgaW1wbGllZCBieSBBTV9JTklUX0FVVE9NQUtFLgorCURvbid0IHJ1biBBTV9NQUlOVEFJTkVSX01PREUuCisKK1RodSBNYXkgIDggMTQ6MzQ6MDUgMTk5NyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIG1pc3NpbmcsIGx0bWFpbi5zaCwgbHRjb25maWcuc2g6IENyZWF0ZWQuIFRoZXNlIGFyZSBuZXcgZmlsZXMKKwlyZXF1aXJlZCBieSBhdXRvbWFrZSBhbmQgbGlidG9vbC4KKworCSogUkVBRE1FOiBCb29zdGVkIHJldiB0byAxLjE0LiBBZGRlZCBub3Rlcy4KKworCSogYWNjb25maWcuaDogTW92ZWQgUEFDS0FHRSBhbmQgVkVSU0lPTiBmb3IgbmV3IGF1dG9tYWtlLgorCQorCSogY29uZmlndXJlLmluOiBDaGFuZ2VzIGZvciBsaWJ0b29sLgorCQorCSogTWFrZWZpbGUuYW0gKGNoZWNrKTogbWFrZSB0ZXN0IG5vdyBtYWtlIGNoZWNrLiBVc2VzIGxpYnRvb2wgbm93LgorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBhY2xvY2FsLmgsIGZmaWNvbmZpZy5oLmluOiBSZWJ1aWx0LgorCitUaHUgTWF5ICAxIDE2OjI3OjA3IDE5OTcgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBtaXNzaW5nOiBBZGRlZCBmaWxlIHJlcXVpcmVkIGJ5IG5ldyBhdXRvbWFrZS4KKworVHVlIE5vdiAyNiAxNDoxMDo0MiAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3NrMy5jeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBBZGRlZCBVU0lOR19QVVJJRlkgZmxhZy4gVGhpcyBpcyBkZWZpbmVkIHdoZW4KKwktLWVuYWJsZS1wdXJpZnktc2FmZXR5IHdhcyB1c2VkIGF0IGNvbmZpZ3VyZSB0aW1lLgorCisJKiBjb25maWd1cmUuaW4gKGFsbHNvdXJjZXMpOiBBZGRlZCAtLWVuYWJsZS1wdXJpZnktc2FmZXR5IHN3aXRjaC4KKwkoVkVSU0lPTik6IEJvb3N0ZWQgcmV2IHRvIDEuMTMuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKK0ZyaSBOb3YgMjIgMDY6NDY6MTIgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBCb29zdGVkIHJldiB0byAxLjEyLgorCVJlbW92ZWQgc3BlY2lhbCBDRkxBR1MgaGFjayBmb3IgZ2NjLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisJKiBSRUFETUU6IEJvb3N0ZWQgcmV2IHRvIDEuMTIuIEFkZGVkIG5vdGVzLgorCisJKiBNYW55IGZpbGVzOiBDeWdudXMgU3VwcG9ydCBjaGFuZ2VkIHRvIEN5Z251cyBTb2x1dGlvbnMuCisKK1dlZCBPY3QgMzAgMTE6MTU6MjUgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBCb29zdGVkIHJldiB0byAxLjExLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisJKiBSRUFETUU6IEJvb3N0ZWQgcmV2IHRvIDEuMTEuIEFkZGVkIG5vdGVzIGFib3V0IEdOVSBtYWtlLgorCitUdWUgT2N0IDI5IDEyOjI1OjEyIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBGaXhlZCAtV2FsbCB0cmljay4KKwkoVkVSU0lPTik6IEJvb3N0ZWQgcmV2LgorCSogY29uZmlndXJlOiBSZWJ1aWx0CisKKwkqIGFjY29uZmlnLmg6IE5lZWRlZCBmb3IgLS1lbmFibGUtZGVidWcgY29uZmlndXJlIHN3aXRjaC4KKworCSogUkVBRE1FOiBCb29zdGVkIHJldiB0byAxLjA5LiBBZGRlZCBtb3JlIG5vdGVzIG9uIGJ1aWxkaW5nCisJbGliZmZpLCBhbmQgTENMaW50LgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIC0tZW5hYmxlLWRlYnVnIHN3aXRjaC4gQm9vc3RlZCByZXYgdG8KKwkxLjA5LgorCSogY29uZmlndXJlOiBSZWJ1aWx0CisKK1R1ZSBPY3QgMTUgMTM6MTE6MjggMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IEJvb3N0ZWQgcmV2IHRvIDEuMDgKKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworCSogUkVBRE1FOiBBZGRlZCBuMzIgYnVnIGZpeCBub3Rlcy4KKworCSogTWFrZWZpbGUuYW06IEFkZGVkICJtYWtlIGxpbnQiIHByb2R1Y3Rpb24uIAorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKK01vbiBPY3QgMTQgMTA6NTQ6NDYgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBSRUFETUU6IEFkZGVkIHdlYiBwYWdlIHJlZmVyZW5jZS4KKworCSogY29uZmlndXJlLmluLCBSRUFETUU6IEJvb3N0ZWQgcmV2IHRvIDEuMDUKKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworCSogUkVBRE1FOiBGaXhlZCBuMzIgc2FtcGxlIGNvZGUuCisKK0ZyaSBPY3QgMTEgMTc6MDk6MjggMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBSRUFETUU6IEFkZGVkIHNwYXJjIG5vdGVzLgorCisJKiBjb25maWd1cmUuaW4sIFJFQURNRTogQm9vc3RlZCByZXYgdG8gMS4wNC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworVGh1IE9jdCAxMCAxMDozMTowMyAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiwgUkVBRE1FOiBCb29zdGVkIHJldiB0byAxLjAzLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisJKiBSRUFETUU6IEFkZGVkIHN0cnVjdCBub3Rlcy4gCisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkZWQgTElDRU5TRSB0byBkaXN0cmlidXRpb24uCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKworCSogUkVBRE1FOiBSZW1vdmVkIExpbnV4IHNlY3Rpb24uIE5vIHNwZWNpYWwgbm90ZXMgbm93CisJYmVjYXVzZSBhZ2dyZWdhdGVzIGFyZy9yZXR1cm4gdHlwZXMgd29yay4KKworV2VkIE9jdCAgOSAxNjoxNjo0MiAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIFJFQURNRSwgY29uZmlndXJlLmluIChWRVJTSU9OKTogQm9vc3RlZCByZXYgdG8gMS4wMgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCitUdWUgT2N0ICA4IDExOjU2OjMzIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogUkVBRE1FIChOT1RFKTogQWRkZWQgbjMyIG5vdGVzLgorCisJKiBNYWtlZmlsZS5hbTogQWRkZWQgdGVzdCBwcm9kdWN0aW9uLgorCSogTWFrZWZpbGU6IFJlYnVpbHQKKworCSogUkVBRE1FOiBzcGVsbCBjaGVja2VkIQorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBCb29zdGVkIHJldiB0byAxLjAxCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKK01vbiBPY3QgIDcgMTU6NTA6MjIgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIG5hc3R5IGJpdCB0byBzdXBwb3J0IFNHSSB0b29scy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKwkKKwkqIFJFQURNRTogQWRkZWQgU0dJIG5vdGVzLiBBZGRlZCBub3RlIGFib3V0IGF1dG9tYWtlIGJ1Zy4KKworTW9uIE9jdCAgNyAxMTowMDoyOCAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogUkVBRE1FOiBSZXdyb3RlIGludHJvLCBhbmQgZml4ZWQgZXhhbXBsZXMuCisKK0ZyaSBPY3QgIDQgMTA6MTk6NTUgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogLUQkVEFSR0VUIGlzIG5vIGxvbmdlciB1c2VkIGFzIGEgY29tcGlsZXIgc3dpdGNoLgorCUl0IGlzIG5vdyBpbnNlcnRlZCBpbnRvIGZmaS5oIGF0IGNvbmZpZ3VyZSB0aW1lLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisJKiBGRklfQUJJIGFuZCBGRklfU1RBVFVTIGFyZSBub3cgZmZpX2FiaSBhbmQgZmZpX3N0YXR1cy4KKworVGh1IE9jdCAgMyAxMzo0NzozNCAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogUkVBRE1FLCBMSUNFTlNFOiBDcmVhdGVkLiBXcm90ZSBzb21lIGRvY3MuCisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYmFyZiBvbiBpNTg2LXVua25vd24tbGludXhhb3V0LgorCUFkZGVkIEVYVFJBRElTVCBjb2RlIGZvciAibWFrZSBkaXN0Ii4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworCSogKi9NYWtlZmlsZS5pbjogUmVidWlsdCB3aXRoIHBhdGNoZWQgYXV0b21ha2UuIAorCitUdWUgT2N0ICAxIDE3OjEyOjI1IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0sIGFjbG9jYWwubTQsIGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwKKwljb25maWd1cmUuaW4sIGZmaWNvbmZpZy5oLmluLCBpbnN0YWxsLXNoLCBta2luc3RhbGxkaXJzLCAKKwlzdGFtcC1oLmluOiBDcmVhdGVkCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBHZW5lcmF0ZWQKKworLS0tIGxpYmZmaS9pbmNsdWRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1R1ZSBGZWIgMjQgMTM6MDk6MzYgMTk5OCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGdlcmJpbC5jeWdudXMuY29tPgorCisJKiBmZmlfbWlwcy5oOiBVcGRhdGVkIEZGSV9UWVBFX1NUUlVDVF8qIHZhbHVlcyBiYXNlZCBvbgorCWZmaS5oLmluIGNoYW5nZXMuICBUaGlzIGlzIGEgd29yay1hcm91bmQgZm9yIFNHSSdzICJzaW1wbGUiCisJYXNzZW1ibGVyLgorCitTdW4gRmViIDIyIDAwOjUxOjU1IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+CisKKwkqIGZmaS5oLmluOiBQb3dlclBDIHN1cHBvcnQuCisKKzE5OTgtMDItMTQgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBmZmkuaC5pbjogQWRkIG02OGsgc3VwcG9ydC4KKwkoRkZJX1RZUEVfTE9OR0RPVUJMRSk6IE1ha2UgaXQgYSBzZXBhcmF0ZSB2YWx1ZS4KKworVHVlIEZlYiAxMCAyMDo1NToxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBmZmkuaC5pbiAoU0laRU9GX0FSRyk6IFVzZSBhIHBvaW50ZXIgdHlwZSBieSBkZWZhdWx0LgorCisJKiBmZmkuaC5pbjogQWxwaGEgc3VwcG9ydC4KKworRnJpIE5vdiAyMiAwNjo0ODo0NSAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGZmaS5oLmluLCBmZmlfY29tbW9uLmg6IEN5Z251cyBTdXBwb3J0IC0+IEN5Z251cyBTb2x1dGlvbnMuCisKK1dlZCBOb3YgMjAgMjI6MzE6MDEgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGZmaS5oLmluOiBBZGRlZCBmZmlfdHlwZV92b2lkIGRlZmluaXRpb24uCisKK1R1ZSBPY3QgMjkgMTI6MjI6NDAgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoaGFja19EQVRBKTogQWx3YXlzIGluc3RhbGwgZmZpX21pcHMuaC4KKworCSogZmZpLmguaW46IFJlbW92ZWQgRkZJX0RFQlVHLiBJdCdzIG5vdyBpbiB0aGUgY29ycmVjdAorCXBsYWNlIChhY2NvbmZpZy5oKS4KKwlBZGRlZCAjaW5jbHVkZSA8c3RkZGVmLmg+IGZvciBzaXplX3QgZGVmaW5pdGlvbi4KKworVHVlIE9jdCAxNSAxNzoyMzozNSAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogZmZpLmguaW4sIGZmaV9jb21tb24uaCwgZmZpX21pcHMuaDogTW9yZSBjbGVhbiB1cC4KKwlDb21tZW50ZWQgb3V0ICNkZWZpbmUgb2YgRkZJX0RFQlVHLgorCitUdWUgT2N0IDE1IDEzOjAxOjA2IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpX2NvbW1vbi5oOiBBZGRlZCBib29sIGRlZmluaXRpb24uCisKKwkqIGZmaS5oLmluLCBmZmlfY29tbW9uLmg6IENsZWFuIHVwIGJhc2VkIG9uIExDTGludCBvdXRwdXQuCisJQWRkZWQgZnVubnkgLypALi4uQCovIGNvbW1lbnRzIHRvIGFubm90YXRlIHNvdXJjZS4KKworTW9uIE9jdCAxNCAxMjoyOToyMyAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGZmaS5oLmluOiBJbnRlcmZhY2UgY2hhbmdlcyBiYXNlZCBvbiBmZWVkYmFjayBmcm9tIEppbQorCUJsYW5keS4KKworRnJpIE9jdCAxMSAxNjo0OTozNSAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGZmaS5oLmluOiBTbWFsbCBjaGFuZ2UgZm9yIHNwYXJjIHN1cHBvcnQuCisKK1RodSBPY3QgMTAgMTQ6NTM6MzcgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBmZmlfbWlwcy5oOiBBZGRlZCBGRklfVFlQRV9TVFJVQ1RfKiBkZWZpbml0aW9ucyBmb3IgCisJc3BlY2lhbCBzdHJ1Y3R1cmUgcmV0dXJuIHR5cGVzLgorCitXZWQgT2N0ICA5IDEzOjU1OjU3IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpLmguaW46IEFkZGVkIFNJWkVPRl9BUkcgZGVmaW5pdGlvbiBmb3IgWDg2CisKK1R1ZSBPY3QgIDggMTE6NDA6MzYgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBmZmkuaC5pbiAoRkZJX0ZOKTogQWRkZWQgbWFjcm8gZm9yIGVsaW1pbmF0aW5nIGNvbXBpbGVyIHdhcm5pbmdzLgorCVVzZSBpdCB0byBjYXNlIHlvdXIgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIHByb3BlciB0eXBlLgorCisJKiBmZmlfbWlwcy5oIChTSVpFT0ZfQVJHKTogQWRkZWQgbWFnaWMgdG8gZml4IHR5cGUgcHJvbW90aW9uIGJ1Zy4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGRlZCBmZmlfbWlwcy5oIHRvIEVYVFJBX0RJU1QuCisJKiBNYWtlZmlsZTogUmVidWlsdC4KKworCSogZmZpX21pcHMuaDogQ3JlYXRlZC4gTW92ZWQgYWxsIGNvbW1vbiBtaXBzIGRlZmluaXRpb25zIGhlcmUuCisKK01vbiBPY3QgIDcgMTA6NTg6MTIgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGZmaS5oLmluOiBUaGUgU0dJIGFzc2VtYmVyIGlzIHZlcnkgcGlja3kgYWJvdXQgcGFyZW5zLiBSZWRlZmluZWQKKyAJc29tZSBtYWNyb3MgdG8gYXZvaWQgcHJvYmxlbXMuCisKKwkqIGZmaS5oLmluOiBBZGRlZCBGRklfREVGQVVMVF9BQkkgZGVmaW5pdGlvbnMuIEFsc28gYWRkZWQKKwlleHRlcm5zIGZvciBwb2ludGVyLCBhbmQgNjRiaXQgaW50ZWdyYWwgZmZpX3R5cGVzLgorCitGcmkgT2N0ICA0IDA5OjUxOjM3IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBmZmkuaC5pbjogQWRkZWQgRkZJX0FCSSBtZW1iZXIgdG8gZmZpX2NpZiBhbmQgY2hhbmdlZAorCWZ1bmN0aW9uIHByb3RvdHlwZXMgYWNjb3JkaW5nbHkuCisJQWRkZWQgI2RlZmluZSBAVEFSR0VUQC4gTm93IHByb2dyYW1zIGluY2x1ZGluZyBmZmkuaCBkb24ndCAKKwloYXZlIHRvIHNwZWNpZnkgdGhpcyB0aGVtc2VsdmVzLgorCitUaHUgT2N0ICAzIDE1OjM2OjQ0IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBmZmkuaC5pbjogQ2hhbmdlZCBmZmlfcHJlcF9jaWYncyB2YWx1ZXMgZnJvbSB2b2lkKiB0byB2b2lkKioKKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGRlZCBFWFRSQV9ESVNUIGZvciAibWFrZSBkaXN0IgorCXRvIHdvcmsuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCisKK1dlZCBPY3QgIDIgMTA6MTY6NTkgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBDcmVhdGVkCisJKiBNYWtlZmlsZS5pbjogR2VuZXJhdGVkCisKKwkqIGZmaV9jb21tb24uaDogQWRkZWQgcmNzaWQgY29tbWVudAorCitUdWUgT2N0ICAxIDE3OjEzOjUxIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpLmguaW4sIGZmaV9jb21tb24uaDogQ3JlYXRlZAorCistLS0gbGliZmZpL3NyYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTW9uIE9jdCAgNSAwMjoxNzo1MCAxOTk4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KKworCSogYXJtL2ZmaS5jLCBhcm0vc3lzdi5TOiBDcmVhdGVkLgorCisJKiBNYWtlZmlsZS5hbTogQWRkZWQgYXJtIGZpbGVzLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKK01vbiBPY3QgIDUgMDE6NDE6MzggMTk5OCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAobGliZmZpX2xhX0xERkxBR1MpOiBJbmNyZW1lbnRlZCByZXZpc2lvbi4KKworU3VuIE9jdCAgNCAxNjoyNzoxNyAxOTk4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KKworCSogYWxwaGEvb3NmLlMgKGZmaV9jYWxsX29zZik6IFBhdGNoIGZvciBEVSBhc3NlbWJsZXIuCisKKwkqIGZmaXRlc3QuYyAobWFpbik6IGxvbmcgbG9uZyBhbmQgbG9uZyBkb3VibGUgcmV0dXJuIHZhbHVlcyB3b3JrCisJZm9yIHg4Ni4KKworRnJpIEFwciAxNyAxMTo1MDo1OCAxOTk4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKKwkqIGZmaXRlc3QuYyAobWFpbik6IEZsb2F0aW5nIHBvaW50IHRlc3RzIG5vdCBleGVjdXRlZCBmb3Igc3lzdGVtcworIAl3aXRoIGJyb2tlbiBsb25kIGRvdWJsZSAoU3VuT1MgNCB3LyBHQ0MpLgorCisJKiB0eXBlcy5jOiBGaXhlZCB4ODYgYWxpZ25tZW50IGluZm8gZm9yIGxvbmcgbG9uZyB0eXBlcy4KKworVGh1IEFwciAxNiAwNzoxNToyOCAxOTk4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AYWRhLmN5Z251cy5jb20+CisKKwkqIGZmaXRlc3QuYzogQWRkZWQgbW9yZSBub3RlcyBhYm91dCBHQ0MgYnVncyB1bmRlciBJcml4IDYuCisKK1dlZCBBcHIgMTUgMDg6NDI6MjIgMTk5OCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGZmaXRlc3QuYyAoc3RydWN0NSk6IE5ldyB0ZXN0IGZ1bmN0aW9uLgorCShtYWluKTogTmV3IHRlc3Qgd2l0aCBzdHJ1Y3Q1LgorCitUaHUgTWFyICA1IDEwOjQ4OjExIDE5OTggIEFudGhvbnkgR3JlZW4gIDxncmVlbkB0b290aWUudG8uY3lnbnVzLmNvbT4KKworCSogcHJlcF9jaWYuYyAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGUpOiBGaXggYXNzZXJ0aW9uIGZvcgorCW5lc3RlZCBzdHJ1Y3R1cmVzLgorCitUdWUgRmViIDI0IDE2OjMzOjQxIDE5OTggIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBwcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBBZGRlZCBsb25nIGRvdWJsZSBzdXBwb3J0IGZvciBzcGFyYy4KKworU3VuIEZlYiAyMiAwMDo1MjoxOCAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBwb3dlcnBjL2FzbS5oOiBOZXcgZmlsZS4KKwkqIHBvd2VycGMvZmZpLmM6IE5ldyBmaWxlLgorCSogcG93ZXJwYy9zeXN2LlM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuYW06IFBvd2VyUEMgcG9ydC4KKwkqIGZmaXRlc3QuYyAobWFpbik6IEFsbG93IGFsbCB0ZXN0cyB0byBydW4gZXZlbiBpbiBwcmVzZW5jZSBvZiBnY2MKKyAJYnVnIG9uIFBvd2VyUEMuCisKKzE5OTgtMDItMTcgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBtaXBzL2ZmaS5jOiBGaXhlZCBjb21tZW50IHR5cG8uCisKKwkqIHg4Ni9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApLCB4ODYvc3lzdi5TIChyZXRmbG9hdCk6IAorCUZpeGVkIHg4NiBsb25nIGRvdWJsZSByZXR1cm4gaGFuZGxpbmcuCisKKwkqIHR5cGVzLmM6IEZpeGVkIHg4NiBsb25nIGRvdWJsZSBhbGlnbm1lbnQgaW5mby4KKworMTk5OC0wMi0xNCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIHR5cGVzLmM6IEFkZCBtNjhrIHN1cHBvcnQuCisKKwkqIGZmaXRlc3QuYyAoZmxvYXRpbmcpOiBBZGQgbG9uZyBkb3VibGUgcGFyYW1ldGVyLgorCShyZXR1cm5fbGwsIGxkYmxpdCk6IE5ldyBmdW5jdGlvbnMgdG8gdGVzdCBsb25nIGxvbmcgYW5kIGxvbmcKKwlkb3VibGUgcmV0dXJuIHZhbHVlLgorCShtYWluKTogRml4IHR5cGUgZXJyb3IgaW4gYXNzaWdubWVudCBvZiB0c1sxLTRdX3R5cGUuZWxlbWVudHMuCisJQWRkIHRlc3RzIGZvciBsb25nIGxvbmcgYW5kIGxvbmcgZG91YmxlIGFyZ3VtZW50cyBhbmQgcmV0dXJuCisJdmFsdWVzLgorCisJKiBwcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpIFtNNjhLXTogRG9uJ3QgYWxsb2NhdGUgYXJndW1lbnQgZm9yCisJc3RydWN0IHZhbHVlIHBvaW50ZXIuCisKKwkqIG02OGsvZmZpLmMsIG02OGsvc3lzdi5TOiBOZXcgZmlsZXMuCisJKiBNYWtlZmlsZS5hbTogQWRkIGJpdHMgZm9yIG02OGsgcG9ydC4gIEFkZCBrbHVkZ2UgdG8gd29yayBhcm91bmQKKwlhdXRvbWFrZSBkZWZpY2llbmN5LgorCSh0ZXN0KTogRG9uJ3QgcmVxdWlyZSAiLiIgaW4gJFBBVEguCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKworV2VkIEZlYiAxMSAwNzozNjo1MCAxOTk4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKK1R1ZSBGZWIgMTAgMjA6NTY6MDAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYWxwaGEvZmZpLmMsIGFscGhhL29zZi5TOiBOZXcgZmlsZXMuCisJKiBNYWtlZmlsZS5hbTogQWxwaGEgcG9ydC4KKworVHVlIE5vdiAxOCAxNDoxMjowNyAxOTk3ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogbWlwcy9mZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBJbml0aWFsaXplIHJzdHJ1Y3RfZmxhZworCWZvciBuMzIuCisKK1R1ZSBKdW4gIDMgMTc6MTg6MjAgMTk5NyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGZmaXRlc3QuYyAobWFpbik6IEFkZGVkIGhhY2sgdG8gZ2V0IHN0cnVjdHVyZSB0ZXN0cyB3b3JraW5nCisJY29ycmVjdGx5LgorCitTYXQgTWF5IDEwIDE5OjA2OjQyIDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEV4cGxpY2l0bHkgbGlzdCBhbGwgZGlzdHJpYnV0YWJsZQorCWZpbGVzIGluIHN1YmRpcnMuCisJKFZFUlNJT04sIENDKTogUmVtb3ZlZC4KKworVGh1IE1heSAgOCAxNzoxOTowMSAxOTk3ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IE1hbnkgY2hhbmdlcyBmb3IgbmV3IGF1dG9tYWtlIGFuZCBsaWJ0b29sLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisKK0ZyaSBOb3YgMjIgMDY6NTc6NTYgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBmZml0ZXN0LmMgKG1haW4pOiBGaXhlZCB0ZXN0IGNhc2UgZm9yIG5vbiBtaXBzIG1hY2hpbmVzLgorCitXZWQgTm92IDIwIDIyOjMxOjU5IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiB0eXBlcy5jOiBBZGRlZCBmZmlfdHlwZV92b2lkIGRlY2xhcmF0aW9uLgorCitUdWUgT2N0IDI5IDEzOjA3OjE5IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpdGVzdC5jIChtYWluKTogRml4ZWQgY2hhcmFjdGVyIGNvbnN0YW50cy4KKwkobWFpbik6IEVtaXQgd2FybmluZyBmb3Igc3RydWN0dXJlIHRlc3QgMyBmYWlsdXJlIG9uIFN1bi4KKworCSogTWFrZWZpbGUuYW0gKFZQQVRIKTogRml4ZWQgVlBBVEggZGVmJ24gc28gYXV0b21ha2Ugd29uJ3QKKwlzdHJpcCBpdCBvdXQuIAorCU1vdmVkIGRpc3RkaXIgaGFjayBmcm9tIGxpYmZmaSB0byBhdXRvbWFrZS4gCisJKGZmaXRlc3QpOiBBZGRlZCBtaXNzaW5nIC1jIGZvciAkKENPTVBJTEUpIChjaGFuZ2UgaW4gYXV0b21ha2UpLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJCitUdWUgT2N0IDE1IDEzOjA4OjIwIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQWRkZWQgIm1ha2UgbGludCIgcHJvZHVjdGlvbi4gCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKworCSogcHJlcF9jaWYuYyAoU1RBQ0tfQVJHX1NJWkUpOiBJbXByb3ZlZCBTVEFDS19BUkdfU0laRSBtYWNyby4KKyAgCUNsZWFuIHVwIGJhc2VkIG9uIExDTGludCBvdXRwdXQuIEFkZGVkIGZ1bm55IC8qQC4uLkAqLyBjb21tZW50cyB0bworIAlhbm5vdGF0ZSBzb3VyY2UuCisKKwkqIGZmaXRlc3QuYywgZGVidWcuYzogQ2xlYW5lZCB1cCBjb2RlLgorCitNb24gT2N0IDE0IDEyOjI2OjU2IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpdGVzdC5jOiBDaGFuZ2VzIGJhc2VkIG9uIGludGVyZmFjZSBjaGFuZ2VzLgorCisJKiBwcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBDbGVhbmVkIHVwIGludGVyZmFjZSBiYXNlZCBvbgorCWZlZWRiYWNrIGZyb20gSmltIEJsYW5keS4KKworRnJpIE9jdCAxMSAxNTo1MzoxOCAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGZmaXRlc3QuYzogUmVvcmRlcmVkIHRlc3RzIHdoaWxlIHBvcnRpbmcgdG8gc3BhcmMuCisJTWFkZSBjaGFuZ2VzIHRvIGhhbmRsZSBsYW1lIHN0cnVjdHVyZSBwYXNzaW5nIGZvciBzcGFyYy4KKwlSZW1vdmVkIGNhbGxzIHRvIGZmbHVzaCgpLgorCisJKiBwcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBBZGRlZCBzcGVjaWFsIGNhc2UgZm9yIHNwYXJjCisJYWdncmVnYXRlIHR5cGUgYXJndW1lbnRzLgorCitUaHUgT2N0IDEwIDA5OjU2OjUxIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpdGVzdC5jIChtYWluKTogQWRkZWQgc3RydWN0dXJlIHBhc3NpbmcvcmV0dXJuaW5nIHRlc3RzLgorCisJKiBwcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBQZXJmb3JtIHByb3BlciBpbml0aWFsaXphdGlvbgorCW9mIHN0cnVjdHVyZSByZXR1cm4gdHlwZXMgaWYgbmVlZGVkLgorCShpbml0aWFsaXplX2FnZ3JlZ2F0ZSk6IEJ1ZyBmaXgKKworV2VkIE9jdCAgOSAxNjowNDoyMCAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIHR5cGVzLmM6IEFkZGVkIHNwZWNpYWwgZGVmaW5pdGlvbnMgZm9yIHg4NiAoZG91YmxlIGRvZXNuJ3QKKwluZWVkIGRvdWJsZSB3b3JkIGFsaWdubWVudCkuCisKKwkqIGZmaXRlc3QuYzogQWRkZWQgbWFueSB0ZXN0cworCitUdWUgT2N0ICA4IDA5OjE5OjIyIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogcHJlcF9jaWYuYyAoZmZpX3ByZXBfY2lmKTogRml4ZWQgYXNzZXJ0aW9uLgorCisJKiBkZWJ1Zy5jIChmZmlfYXNzZXJ0KTogTXVzdCByZXR1cm4gYSBub24gdm9pZCBub3cuCisKKwkqIE1ha2VmaWxlLmFtOiBBZGRlZCB0ZXN0IHByb2R1Y3Rpb24uCisJKiBNYWtlZmlsZTogUmVidWlsdC4KKworCSogZmZpdGVzdC5jIChtYWluKTogQ3JlYXRlZC4gCisKKwkqIHR5cGVzLmM6IENyZWF0ZWQuIFN0cmlwcGVkIGNvbW1vbiBjb2RlIG91dCBvZiAqL2ZmaS5jLgorCisJKiBwcmVwX2NpZi5jOiBBZGRlZCBtaXNzaW5nIHN0ZGxpYi5oIGluY2x1ZGUuCisKKwkqIGRlYnVnLmMgKGZmaV90eXBlX3Rlc3QpOiBVc2VkICJhIiB0byBlbGltaW5hdGUgY29tcGlsZXIKKwl3YXJuaW5ncyBpbiBub24tZGVidWcgYnVpbGRzLiBJbmNsdWRlZCBmZmlfY29tbW9uLmguCisKK01vbiBPY3QgIDcgMTU6MzY6NDIgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQWRkZWQgYSBydWxlIGZvciAucyAtPiAubworCVRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIFNHSSBjb21waWxlci4KKwkqIE1ha2VmaWxlOiBSZWJ1aWx0LgorCitGcmkgT2N0ICA0IDA5OjUxOjA4IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBwcmVwX2NpZi5jIChpbml0aWFsaXplX2FnZ3JlZ2F0ZSk6IE1vdmVkIGFiaSBzcGVjaWZpY2F0aW9uCisJdG8gZmZpX3ByZXBfY2lmKCkuCisKK1RodSBPY3QgIDMgMTU6Mzc6MzcgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIHByZXBfY2lmLmMgKGZmaV9wcmVwX2NpZik6IENoYW5nZWQgdmFsdWVzIGZyb20gdm9pZCogdG8gdm9pZCoqLgorCShpbml0aWFsaXplX2FnZ3JlZ2F0ZSk6IEZpeGVkIGFnZ3JlZ2F0ZSB0eXBlIGluaXRpYWxpemF0aW9uLgorCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZGVkIHN1cHBvcnQgY29kZSBmb3IgIm1ha2UgZGlzdCIuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCisKK1dlZCBPY3QgIDIgMTE6NDE6NTcgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGRlYnVnLmMsIHByZXBfY2lmOiBDcmVhdGVkLgorCisJKiBNYWtlZmlsZS5hbTogQWRkZWQgZGVidWcubyBhbmQgcHJlcF9jaWYubyB0byBPQkouCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCisKKwkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IEFkZGVkIG1pc3NpbmcgLUkuLi9pbmNsdWRlCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCisKK1R1ZSBPY3QgIDEgMTc6MTE6NTEgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBlcnJvci5jLCBNYWtlZmlsZS5hbTogQ3JlYXRlZC4KKwkqIE1ha2VmaWxlLmluOiBHZW5lcmF0ZWQuCisKKy0tLSBsaWJmZmkvc3JjL3g4NiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdW4gT2N0ICA0IDE2OjI3OjE3IDE5OTggIEFudGhvbnkgR3JlZW4gIDxncmVlbkBjeWdudXMuY29tPgorCisJKiBzeXN2LlMgKHJldGxvbmdkb3VibGUpOiBGaXhlZCBsb25nIGxvbmcgcmV0dXJuIHZhbHVlIHN1cHBvcnQuCisJKiBmZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBEaXR0by4KKworV2VkIE1heSAxMyAwNDozMDozMyAxOTk4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcmFmdC5wcHAudHNvZnQubmV0PgorCisJKiBmZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBGaXhlZCBsb25nIGRvdWJsZSByZXR1cm4gdmFsdWUKKwlzdXBwb3J0LgorCitXZWQgQXByIDE1IDA4OjQzOjIwIDE5OTggIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBmZmkuYyAoZmZpX3ByZXBfYXJncyk6IHNtYWxsIHN0cnVjdCBzdXBwb3J0IHdhcyBtaXNzaW5nLgorCitUaHUgTWF5ICA4IDE2OjUzOjU4IDE5OTcgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBvYmplY3RzLm1hazogUmVtb3ZlZC4KKworTW9uIERlYyAgMiAxNToxMjo1OCAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIHN5c3YuUzogVXNlIC5iYWxpZ24sIGZvciBhLm91dCBMaW51eCBib3hlcy4KKworVHVlIE9jdCAxNSAxMzowNjo1MCAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogZmZpLmM6IENsZWFuIHVwIGJhc2VkIG9uIExDTGludCBvdXRwdXQuCisJQWRkZWQgZnVubnkgLypALi4uQCovIGNvbW1lbnRzIHRvIGFubm90YXRlIHNvdXJjZS4KKworRnJpIE9jdCAxMSAxNjo0MzozOCAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGZmaS5jIChmZmlfY2FsbCk6IEFkZGVkIGFzc2VydGlvbiBmb3IgYmFkIEFCSXMuCisKK1dlZCBPY3QgIDkgMTM6NTc6MjcgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBzeXN2LlMgKHJldGRvdWJsZSk6IEZpeGVkIGRvdWJsZSByZXR1cm4gcHJvYmxlbXMuCisKKwkqIGZmaS5jCShmZmlfY2FsbCk6IENvcnJlY3RlZCBmbiBhcmcgZGVmaW5pdGlvbi4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBGaXhlZCBkb3VibGUgcmV0dXJuIHByb2JsZW1zCisKK1R1ZSBPY3QgIDggMTI6MTI6NDkgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBmZmkuYzogTW92ZWQgZmZpX3R5cGUgZGVmaW5pdGlvbnMgdG8gdHlwZXMuYy4KKwkoZmZpX3ByZXBfYXJncyk6IEZpeGVkIHR5cGUgcHJvbW90aW9uIGJ1Zy4KKworTW9uIE9jdCAgNyAxNTo1MzowNiAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGZmaS5jIChGRklfKl9UWVBFREVGKTogUmVtb3ZlZCByZWR1bmRhbnQgJzsnCisKK0ZyaSBPY3QgIDQgMDk6NTQ6NTMgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGZmaS5jIChmZmlfY2FsbCk6IFJlbW92ZWQgRkZJX0FCSSBhcmcsIGFuZCBzd2FwcGVkCisJcmVtYWluaW5nIGFyZ3MuCisKK1dlZCBPY3QgIDIgMTA6MDc6MDUgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIGZmaS5jLCBzeXN2LlMsIG9iamVjdHMubWFrOiBDcmVhdGVkLgorCShmZmlfcHJlcF9jaWYpOiBjaWYtPnJ2YWx1ZSBubyBsb25nZXIgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KKwkoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBNb3ZlZCBtYWNoaW5lIGluZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nCisJdG8gc3JjL3ByZXBfY2lmLmMuIEludHJvZHVjZWQgZmZpX3ByZXBfY2lmX21hY2hkZXAoKS4KKworLS0tIGxpYmZmaS9zcmMvbWlwcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1R1ZSBGZWIgMTcgMTc6MTg6MDcgMTk5OCAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIG8zMi5TOiBGaXhlZCB0eXBvIGluIGNvbW1lbnQuCisKKwkqIGZmaS5jIChmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEZpeGVkIGFyZ3VtZW50IHByb2Nlc3NpbmcuCisKK1RodSBNYXkgIDggMTY6NTM6NTggMTk5NyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIG8zMi5zLCBuMzIuczogV3JhcHBlcnMgZm9yIFNHSSB0b29sIHN1cHBvcnQuCisKKwkqIG9iamVjdHMubWFrOiBSZW1vdmVkLgorCitUdWUgT2N0IDI5IDE0OjM3OjQ1IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpLmMgKGZmaV9wcmVwX2FyZ3MpOiBDaGFuZ2VkIGludCB6IHRvIHNpemVfdCB6LgorCitUdWUgT2N0IDE1IDEzOjE3OjI1IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBuMzIuUzogRml4ZWQgYmFkIHN0YWNrIG11bmdpbmcuIAorCisJKiBmZmkuYzogTW92ZWQgcHJvdG90eXBlcyBmb3IgZmZpX2NhbGxfPzMyKCkgdG8gaGVyZSBmcm9tCisJZmZpX21pcHMuaCBiZWNhdXNlIGV4dGVuZGVkX2NpZiBpcyBub3QgZGVmaW5lZCBpbiBmZmlfbWlwcy5oLgorCitNb24gT2N0IDE0IDEyOjQyOjAyIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpLmM6IEludGVyZmFjZSBjaGFuZ2VzIGJhc2VkIG9uIGZlZWRiYWNrIGZyb20gSmltIEJsYW5keS4KKworVGh1IE9jdCAxMCAxMToyMjoxNiAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIG4zMi5TLCBmZmkuYzogTG90cyBvZiBjaGFuZ2VzIHRvIHN1cHBvcnQgcGFzc2luZyBhbmQgCisJcmV0dXJuaW5nIHN0cnVjdHVyZXMgd2l0aCB0aGUgbjMyIGNhbGxpbmcgY29udmVudGlvbi4KKworCSogbjMyLlM6IEZpeGVkIGZuIHBvaW50ZXIgYnVnLgorCisJKiBmZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBGaXggZm9yIG8zMiBzdHJ1Y3R1cmUKKwlyZXR1cm4gdmFsdWVzLgorCShmZmlfcHJlcF9hcmdzKTogRml4ZWQgbjMyIHN0cnVjdHVyZSBwYXNzaW5nIHdoZW4gc3RydWN0dXJlcworCXBhcnRpYWxseSBmaXQgaW4gcmVnaXN0ZXJzLgorCitXZWQgT2N0ICA5IDEzOjQ5OjI1IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogb2JqZWN0cy5tYWs6IEFkZGVkIG4zMi5vLgorCisJKiBuMzIuUzogQ3JlYXRlZC4KKworCSogZmZpLmMgKGZmaV9wcmVwX2FyZ3MpOiBBZGRlZCBtYWdpYyB0byBzdXBwb3J0IHByb3BlcgorCW4zMiBwcm9jZXNzaW5nLgorCitUdWUgT2N0ICA4IDEwOjM3OjM1IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpLmM6IE1vdmVkIGZmaV90eXBlIGRlZmluaXRpb25zIHRvIHR5cGVzLmMuCisJKGZmaV9wcmVwX2FyZ3MpOiBGaXhlZCB0eXBlIHByb21vdGlvbiBidWcuCisKKwkqIG8zMi5TOiBUaGlzIGNvZGUgaXMgb25seSBidWlsdCBmb3IgbzMyIGNvbXBpbGVzLgorCUEgbG90IG9mIHRoZSAjZGVmaW5lIGNydWZ0IGhhcyBtb3ZlZCB0byBmZmlfbWlwcy5oLgorCisJKiBmZmkuYyAoZmZpX3ByZXBfY2lmX21hY2hkZXApOiBGaXhlZCBhcmcgZmxhZ3MuIFNlY29uZCBhcmcKKwlpcyBvbmx5IHByb2Nlc3NlZCBpZiB0aGUgZmlyc3QgaXMgZWl0aGVyIGEgZmxvYXQgb3IgZG91YmxlLgorCitNb24gT2N0ICA3IDE1OjMzOjU5IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogbzMyLlM6IE1vZGlmaWVkIHRvIGNvbXBpbGUgdW5kZXIgZWFjaCBvZiBvMzIsIG4zMiBhbmQgbjY0LgorCisJKiBmZmkuYyAoRkZJXypfVFlQRURFRik6IFJlbW92ZWQgcmVkdW5kYW50ICc7JworCitGcmkgT2N0ICA0IDA5OjUzOjI1IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBmZmkuYyAoZmZpX2NhbGwpOiBSZW1vdmVkIEZGSV9BQkkgYXJnLCBhbmQgc3dhcHBlZAorCXJlbWFpbmluZyBhcmdzLgorCitXZWQgT2N0ICAyIDE3OjQxOjIyIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogbzMyLlM6IFJlbW92ZWQgY3J1ZnR5IGRlZmluaXRpb25zLgorCitXZWQgT2N0ICAyIDEyOjUzOjQyIDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBmZmkuYyAoZmZpX3ByZXBfY2lmKTogY2lmLT5ydmFsdWUgbm8gbG9uZ2VyIGluaXRpYWxpemVkIHRvIE5VTEwuCisJKGZmaV9wcmVwX2NpZl9tYWNoZGVwKTogTW92ZWQgYWxsIG1hY2hpbmUgaW5kZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcKKwl0byBzcmMvcHJlcF9jaWYuYy4gSW50cm9kdWNlZCBmZmlfcHJlcF9jaWZfbWFjaGRlcC4gUmV0dXJuIHR5cGVzCisJb2YgRkZJX1RZUEVfU1RSVUNUIGFyZSBubyBkaWZmZXJlbnQgdGhhbiBGRklfVFlQRV9JTlQuCisKK1R1ZSBPY3QgIDEgMTc6MTE6MDIgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQHJ0bC5jeWdudXMuY29tPgorCisJKiBmZmkuYywgbzMyLlMsIG9iamVjdC5tYWs6IENyZWF0ZWQKKwkKKy0tLSBsaWJmZmkvc3JjL3NwYXJjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUdWUgRmViIDI0IDE2OjMzOjE4IDE5OTggIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiBmZmkuYyAoZmZpX3ByZXBfYXJncyk6IEFkZGVkIGxvbmcgZG91YmxlIHN1cHBvcnQuCisKK1RodSBNYXkgIDggMTY6NTM6NTggMTk5NyAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGhvc2VyLmN5Z251cy5jb20+CisKKwkqIG9iamVjdHMubWFrOiBSZW1vdmVkLgorCitUaHUgTWF5ICAxIDE2OjA3OjU2IDE5OTcgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBob3Nlci5jeWdudXMuY29tPgorCisJKiB2OC5TOiBGaXhlZCBtaW5vciBwb3J0YWJpbGl0eSBwcm9ibGVtIHJlcG9ydGVkIGJ5IAorCVJ1c3MgTWNNYW51cyA8bWNtYW5yQGVxLmdzLmNvbT4uCisKK1R1ZSBOb3YgMjYgMTQ6MTI6NDMgMTk5NiAgQW50aG9ueSBHcmVlbiAgPGdyZWVuQGNzazMuY3lnbnVzLmNvbT4KKworCSogdjguUzogVXNlZCBTVEFDS0ZSQU1FIGRlZmluZSBlbHNld2hlcmUuIAorCisJKiBmZmkuYyAoZmZpX3ByZXBfYXJncyk6IFplcm8gb3V0IHNwYWNlIHdoZW4gVVNJTkdfUFVSSUZZCisJaXMgc2V0LgorCShmZmlfcHJlcF9jaWZfbWFjaGRlcCk6IEFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0YWNrIGZyYW1lIAorCXNwYWNlIGZvciBmdW5jdGlvbnMgd2l0aCA8IDYgYXJncy4KKworVHVlIE9jdCAyOSAxNTowODo1NSAxOTk2ICBBbnRob255IEdyZWVuICA8Z3JlZW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGZmaS5jIChmZmlfcHJlcF9hcmdzKTogaW50IHogaXMgbm93IHNpemVfdCB6LgorCitNb24gT2N0IDE0IDEzOjMxOjI0IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogdjguUyAoZmZpX2NhbGxfVjgpOiBHb3Jkb24gcmV3cml0ZXMgdGhpcyBhZ2Fpbi4gSXQgbG9va3MKKwlncmVhdCBub3cuCisKKwkqIGZmaS5jIChmZmlfY2FsbCk6IFRoZSBjb21tZW50IGFib3V0IGhpamFja2VkIHJlZ2lzdGVycworCWlzIG5vIGxvbmdlciB2YWxpZCBhZnRlciBnb3Jkb25pIGhhY2tlZCB2OC5TLgorCisgICAgICAgICogdjguUyAoZmZpX2NhbGxfVjgpOiBSZXdyb3RlIHdpdGggZ29yZG9uaS4gTXVjaCBzaW1wbGVyLgorCQorCSogdjguUywgZmZpLmM6IGZmaV9jYWxsKCkgaGFkIGNoYW5nZWQgdG8gYWNjZXB0IG1vcmUgdGhhbgorCXR3byBhcmdzLCBzbyB2OC5TIGhhZCB0byBjaGFuZ2UgKGJlY2F1c2UgaXQgaGlqYWNrcyBpbmNvbWluZworCWFyZyByZWdpc3RlcnMpLgorCisJKiBmZmkuYzogSW50ZXJmYWNlIGNoYW5nZXMgYmFzZWQgb24gZmVlZGJhY2sgZnJvbSBKaW0gQmxhbmR5LgorCitUaHUgT2N0IDEwIDE3OjQ4OjE2IDE5OTYgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBydGwuY3lnbnVzLmNvbT4KKworCSogZmZpLmMsIHY4LlMsIG9iamVjdHMubWFrOiBDcmVhdGVkLgorCQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvTElDRU5TRSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTI2NjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvTElDRU5TRQpAQCAtMCwwICsxLDIxIEBACitsaWJmZmkgLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAxMSAgQW50aG9ueSBHcmVlbiwgUmVkIEhhdCwgSW5jIGFuZCBvdGhlcnMuCitTZWUgc291cmNlIGZpbGVzIGZvciBkZXRhaWxzLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCitDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKK1NPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL01ha2VmaWxlLmFtIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTE5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOTYgQEAKKyMjIFByb2Nlc3MgdGhpcyB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgorCitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiBzdWJkaXItb2JqZWN0cworCitTVUJESVJTID0gaW5jbHVkZSB0ZXN0c3VpdGUgbWFuCisKK0VYVFJBX0RJU1QgPSBMSUNFTlNFIENoYW5nZUxvZy52MSBDaGFuZ2VMb2cubGliZ2NqIGNvbmZpZ3VyZS5ob3N0CVwKKwlzcmMvYWxwaGEvZmZpLmMgc3JjL2FscGhhL29zZi5TIHNyYy9hbHBoYS9mZml0YXJnZXQuaAkJXAorCXNyYy9hcm0vZmZpLmMgc3JjL2FybS9zeXN2LlMgc3JjL2FybS90cmFtcG9saW5lLlMJCVwKKwlzcmMvYXJtL2ZmaXRhcmdldC5oIHNyYy9hdnIzMi9mZmkuYyBzcmMvYXZyMzIvc3lzdi5TCQlcCisJc3JjL2F2cjMyL2ZmaXRhcmdldC5oIHNyYy9jcmlzL2ZmaS5jIHNyYy9jcmlzL3N5c3YuUwkJXAorCXNyYy9jcmlzL2ZmaXRhcmdldC5oIHNyYy9pYTY0L2ZmaS5jIHNyYy9pYTY0L2ZmaXRhcmdldC5oCVwKKwlzcmMvaWE2NC9pYTY0X2ZsYWdzLmggc3JjL2lhNjQvdW5peC5TIHNyYy9taXBzL2ZmaS5jCQlcCisJc3JjL21pcHMvbjMyLlMgc3JjL21pcHMvbzMyLlMgc3JjL21pcHMvZmZpdGFyZ2V0LmgJCVwKKwlzcmMvbTMyci9mZmkuYyBzcmMvbTMyci9zeXN2LlMgc3JjL20zMnIvZmZpdGFyZ2V0LmgJCVwKKwlzcmMvbTY4ay9mZmkuYyBzcmMvbTY4ay9zeXN2LlMgc3JjL202OGsvZmZpdGFyZ2V0LmgJCVwKKwlzcmMvcG93ZXJwYy9mZmkuYyBzcmMvcG93ZXJwYy9zeXN2LlMgc3JjL3Bvd2VycGMvbGludXg2NC5TCVwKKwlzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUyBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TCQlcCisJc3JjL3Bvd2VycGMvYXNtLmggc3JjL3Bvd2VycGMvYWl4LlMgc3JjL3Bvd2VycGMvZGFyd2luLlMJXAorCXNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMgc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUwkJXAorCXNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyBzcmMvcG93ZXJwYy9mZml0YXJnZXQuaAkJXAorCXNyYy9zMzkwL2ZmaS5jIHNyYy9zMzkwL3N5c3YuUyBzcmMvczM5MC9mZml0YXJnZXQuaAkJXAorCXNyYy9zaC9mZmkuYyBzcmMvc2gvc3lzdi5TIHNyYy9zaC9mZml0YXJnZXQuaCBzcmMvc2g2NC9mZmkuYwlcCisJc3JjL3NoNjQvc3lzdi5TIHNyYy9zaDY0L2ZmaXRhcmdldC5oIHNyYy9zcGFyYy92OC5TCQlcCisJc3JjL3NwYXJjL3Y5LlMgc3JjL3NwYXJjL2ZmaXRhcmdldC5oIHNyYy9zcGFyYy9mZmkuYwkJXAorCXNyYy94ODYvZGFyd2luNjQuUyBzcmMveDg2L2ZmaS5jIHNyYy94ODYvc3lzdi5TCQkJXAorCXNyYy94ODYvd2luMzIuUyBzcmMveDg2L3dpbjY0LlMgc3JjL3g4Ni9kYXJ3aW4uUwkJXAorCXNyYy94ODYvZnJlZWJzZC5TIHNyYy94ODYvZmZpNjQuYyBzcmMveDg2L3VuaXg2NC5TCQlcCisJc3JjL3g4Ni9mZml0YXJnZXQuaCBzcmMvcGEvZmZpdGFyZ2V0Lmggc3JjL3BhL2ZmaS5jCQlcCisJc3JjL3BhL2xpbnV4LlMgc3JjL3BhL2hwdXgzMi5TIHNyYy9mcnYvZmZpLmMgc3JjL2Zydi9lYWJpLlMJXAorCXNyYy9mcnYvZmZpdGFyZ2V0Lmggc3JjL2RsbWFsbG9jLmMgc3JjL21veGllL2ZmaS5jCQlcCisJc3JjL21veGllL2VhYmkuUyBsaWJ0b29sLXZlcnNpb24gQ2hhbmdlTG9nLmxpYmZmaQkJXAorCW00L2xpYnRvb2wubTQgbTQvbHR+b2Jzb2xldGUubTQgbTQvbHRvcHRpb25zLm00IG00L2x0c3VnYXIubTQJXAorCW00L2x0dmVyc2lvbi5tNCBidWlsZC1pb3Muc2ggc3JjL2FybS9nZW50cmFtcC5zaCBzcmMvZGVidWcuYyAgICBcCisJbXN2Y2Muc2gKKworCitpbmZvX1RFWElORk9TID0gZG9jL2xpYmZmaS50ZXhpCisKKyMjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMKKyMjIFRoaXMgc2VjdGlvbiBpcyBmb3IgbWFrZSBhbmQgbXVsdGlsaWIgbWFkbmVzcy4KKyMjCisKKyMgV29yayBhcm91bmQgd2hhdCBhcHBlYXJzIHRvIGJlIGEgR05VIG1ha2UgYnVnIGhhbmRsaW5nIE1BS0VGTEFHUworIyB2YWx1ZXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBtYWtlIHZhcmlhYmxlcywgYXMgaXMgdGhlIGNhc2UgZm9yIENDIGFuZAorIyBmcmllbmRzIHdoZW4gd2UgYXJlIGNhbGxlZCBmcm9tIHRoZSB0b3AgbGV2ZWwgTWFrZWZpbGUuCitBTV9NQUtFRkxBR1MgPSBcCisJIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCisJIkNDX0ZPUl9CVUlMRD0kKENDX0ZPUl9CVUlMRCkiIFwKKwkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAorCSJDWFhGTEFHUz0kKENYWEZMQUdTKSIgXAorCSJDRkxBR1NfRk9SX0JVSUxEPSQoQ0ZMQUdTX0ZPUl9CVUlMRCkiIFwKKwkiQ0ZMQUdTX0ZPUl9UQVJHRVQ9JChDRkxBR1NfRk9SX1RBUkdFVCkiIFwKKwkiSU5TVEFMTD0kKElOU1RBTEwpIiBcCisJIklOU1RBTExfREFUQT0kKElOU1RBTExfREFUQSkiIFwKKwkiSU5TVEFMTF9QUk9HUkFNPSQoSU5TVEFMTF9QUk9HUkFNKSIgXAorCSJJTlNUQUxMX1NDUklQVD0kKElOU1RBTExfU0NSSVBUKSIgXAorCSJKQzFGTEFHUz0kKEpDMUZMQUdTKSIgXAorCSJMREZMQUdTPSQoTERGTEFHUykiIFwKKwkiTElCQ0ZMQUdTPSQoTElCQ0ZMQUdTKSIgXAorCSJMSUJDRkxBR1NfRk9SX1RBUkdFVD0kKExJQkNGTEFHU19GT1JfVEFSR0VUKSIgXAorCSJNQUtFPSQoTUFLRSkiIFwKKwkiTUFLRUlORk89JChNQUtFSU5GTykgJChNQUtFSU5GT0ZMQUdTKSIgXAorCSJQSUNGTEFHPSQoUElDRkxBRykiIFwKKwkiUElDRkxBR19GT1JfVEFSR0VUPSQoUElDRkxBR19GT1JfVEFSR0VUKSIgXAorCSJSVU5URVNURkxBR1M9JChSVU5URVNURkxBR1MpIiBcCisJIlNIRUxMPSQoU0hFTEwpIiBcCisJImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCisJImluZm9kaXI9JChpbmZvZGlyKSIgXAorCSJsaWJkaXI9JChsaWJkaXIpIiBcCisJIm1hbmRpcj0kKG1hbmRpcikiIFwKKwkicHJlZml4PSQocHJlZml4KSIgXAorCSJBUj0kKEFSKSIgXAorCSJBUz0kKEFTKSIgXAorCSJDQz0kKENDKSIgXAorCSJDWFg9JChDWFgpIiBcCisJIkxEPSQoTEQpIiBcCisJIk5NPSQoTk0pIiBcCisJIlJBTkxJQj0kKFJBTkxJQikiIFwKKwkiREVTVERJUj0kKERFU1RESVIpIgorCitNQUtFT1ZFUlJJREVTPQorCitBQ0xPQ0FMX0FNRkxBR1M9JChBQ0xPQ0FMX0FNRkxBR1MpIC1JIG00CisKK2xpYl9MVExJQlJBUklFUyA9IGxpYmZmaS5sYQorbm9pbnN0X0xUTElCUkFSSUVTID0gbGliZmZpX2NvbnZlbmllbmNlLmxhCisKK2xpYmZmaV9sYV9TT1VSQ0VTID0gc3JjL2RlYnVnLmMgc3JjL3ByZXBfY2lmLmMgc3JjL3R5cGVzLmMgXAorCQlzcmMvcmF3X2FwaS5jIHNyYy9qYXZhX3Jhd19hcGkuYyBzcmMvY2xvc3VyZXMuYworCitwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IGxpYmZmaS5wYworCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgPQorCitpZiBNSVBTCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL21pcHMvZmZpLmMgc3JjL21pcHMvbzMyLlMgc3JjL21pcHMvbjMyLlMKK2VuZGlmCitpZiBYODYKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvc3lzdi5TCitlbmRpZgoraWYgWDg2X0ZSRUVCU0QKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvZnJlZWJzZC5TCitlbmRpZgoraWYgWDg2X1dJTjMyCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL3g4Ni9mZmkuYyBzcmMveDg2L3dpbjMyLlMKK2VuZGlmCitpZiBYODZfV0lONjQKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvd2luNjQuUworZW5kaWYKK2lmIFg4Nl9EQVJXSU4KK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvZGFyd2luLlMgc3JjL3g4Ni9mZmk2NC5jIHNyYy94ODYvZGFyd2luNjQuUworZW5kaWYKK2lmIFNQQVJDCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL3NwYXJjL2ZmaS5jIHNyYy9zcGFyYy92OC5TIHNyYy9zcGFyYy92OS5TCitlbmRpZgoraWYgQUxQSEEKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvYWxwaGEvZmZpLmMgc3JjL2FscGhhL29zZi5TCitlbmRpZgoraWYgSUE2NAorbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy9pYTY0L2ZmaS5jIHNyYy9pYTY0L3VuaXguUworZW5kaWYKK2lmIE0zMlIKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvbTMyci9zeXN2LlMgc3JjL20zMnIvZmZpLmMKK2VuZGlmCitpZiBNNjhLCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL202OGsvZmZpLmMgc3JjL202OGsvc3lzdi5TCitlbmRpZgoraWYgUE9XRVJQQworbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy9wb3dlcnBjL2ZmaS5jIHNyYy9wb3dlcnBjL3N5c3YuUyBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TIHNyYy9wb3dlcnBjL2xpbnV4NjQuUyBzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUworZW5kaWYKK2lmIFBPV0VSUENfQUlYCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIHNyYy9wb3dlcnBjL2FpeC5TIHNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMKK2VuZGlmCitpZiBQT1dFUlBDX0RBUldJTgorbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyBzcmMvcG93ZXJwYy9kYXJ3aW4uUyBzcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TCitlbmRpZgoraWYgUE9XRVJQQ19GUkVFQlNECitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL3Bvd2VycGMvZmZpLmMgc3JjL3Bvd2VycGMvc3lzdi5TIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMKK2VuZGlmCitpZiBBUk0KK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvYXJtL3N5c3YuUyBzcmMvYXJtL2ZmaS5jCitpZiBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL2FybS90cmFtcG9saW5lLlMKK2VuZGlmCitlbmRpZgoraWYgQVZSMzIKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvYXZyMzIvc3lzdi5TIHNyYy9hdnIzMi9mZmkuYworZW5kaWYKK2lmIExJQkZGSV9DUklTCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL2NyaXMvc3lzdi5TIHNyYy9jcmlzL2ZmaS5jCitlbmRpZgoraWYgRlJWCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgKz0gc3JjL2Zydi9lYWJpLlMgc3JjL2Zydi9mZmkuYworZW5kaWYKK2lmIFMzOTAKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvczM5MC9zeXN2LlMgc3JjL3MzOTAvZmZpLmMKK2VuZGlmCitpZiBYODZfNjQKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMveDg2L2ZmaTY0LmMgc3JjL3g4Ni91bml4NjQuUyBzcmMveDg2L2ZmaS5jIHNyYy94ODYvc3lzdi5TCitlbmRpZgoraWYgU0gKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvc2gvc3lzdi5TIHNyYy9zaC9mZmkuYworZW5kaWYKK2lmIFNINjQKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvc2g2NC9zeXN2LlMgc3JjL3NoNjQvZmZpLmMKK2VuZGlmCitpZiBQQV9MSU5VWAorbm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTICs9IHNyYy9wYS9saW51eC5TIHNyYy9wYS9mZmkuYworZW5kaWYKK2lmIFBBX0hQVVgKK25vZGlzdF9saWJmZmlfbGFfU09VUkNFUyArPSBzcmMvcGEvaHB1eDMyLlMgc3JjL3BhL2ZmaS5jCitlbmRpZgorCitsaWJmZmlfY29udmVuaWVuY2VfbGFfU09VUkNFUyA9ICQobGliZmZpX2xhX1NPVVJDRVMpCitub2Rpc3RfbGliZmZpX2NvbnZlbmllbmNlX2xhX1NPVVJDRVMgPSAkKG5vZGlzdF9saWJmZmlfbGFfU09VUkNFUykKKworQU1fQ0ZMQUdTID0gLWcKK2lmIEZGSV9ERUJVRworIyBCdWlsZCBkZWJ1Zy4gRGVmaW5lIEZGSV9ERUJVRyBvbiB0aGUgY29tbWFuZGxpbmUgc28gdGhhdCwgd2hlbiBidWlsZGluZyB3aXRoCisjIE1TVkMsIGl0IGNhbiBsaW5rIGFnYWluc3QgdGhlIGRlYnVnIENSVC4KK0FNX0NGTEFHUyArPSAtREZGSV9ERUJVRworZW5kaWYKKworbGliZmZpX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvIGBncmVwIC12ICdeXCMnICQoc3JjZGlyKS9saWJ0b29sLXZlcnNpb25gICQoTFRMREZMQUdTKSAkKEFNX0xUTERGTEFHUykKKworQU1fQ1BQRkxBR1MgPSAtSS4gLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUlpbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zcmMKK0FNX0NDQVNGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCisKKyMgTm8gaW5zdGFsbC1odG1sIG9yIGluc3RhbGwtcGRmIHN1cHBvcnQgaW4gYXV0b21ha2UgeWV0CisuUEhPTlk6IGluc3RhbGwtaHRtbCBpbnN0YWxsLXBkZgoraW5zdGFsbC1odG1sOgoraW5zdGFsbC1wZGY6CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvTWFrZWZpbGUuaW4gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlMTU4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE4MjAgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQE1JUFNfVFJVRUBhbV9fYXBwZW5kXzEgPSBzcmMvbWlwcy9mZmkuYyBzcmMvbWlwcy9vMzIuUyBzcmMvbWlwcy9uMzIuUworQFg4Nl9UUlVFQGFtX19hcHBlbmRfMiA9IHNyYy94ODYvZmZpLmMgc3JjL3g4Ni9zeXN2LlMKK0BYODZfRlJFRUJTRF9UUlVFQGFtX19hcHBlbmRfMyA9IHNyYy94ODYvZmZpLmMgc3JjL3g4Ni9mcmVlYnNkLlMKK0BYODZfV0lOMzJfVFJVRUBhbV9fYXBwZW5kXzQgPSBzcmMveDg2L2ZmaS5jIHNyYy94ODYvd2luMzIuUworQFg4Nl9XSU42NF9UUlVFQGFtX19hcHBlbmRfNSA9IHNyYy94ODYvZmZpLmMgc3JjL3g4Ni93aW42NC5TCitAWDg2X0RBUldJTl9UUlVFQGFtX19hcHBlbmRfNiA9IHNyYy94ODYvZmZpLmMgc3JjL3g4Ni9kYXJ3aW4uUyBzcmMveDg2L2ZmaTY0LmMgc3JjL3g4Ni9kYXJ3aW42NC5TCitAU1BBUkNfVFJVRUBhbV9fYXBwZW5kXzcgPSBzcmMvc3BhcmMvZmZpLmMgc3JjL3NwYXJjL3Y4LlMgc3JjL3NwYXJjL3Y5LlMKK0BBTFBIQV9UUlVFQGFtX19hcHBlbmRfOCA9IHNyYy9hbHBoYS9mZmkuYyBzcmMvYWxwaGEvb3NmLlMKK0BJQTY0X1RSVUVAYW1fX2FwcGVuZF85ID0gc3JjL2lhNjQvZmZpLmMgc3JjL2lhNjQvdW5peC5TCitATTMyUl9UUlVFQGFtX19hcHBlbmRfMTAgPSBzcmMvbTMyci9zeXN2LlMgc3JjL20zMnIvZmZpLmMKK0BNNjhLX1RSVUVAYW1fX2FwcGVuZF8xMSA9IHNyYy9tNjhrL2ZmaS5jIHNyYy9tNjhrL3N5c3YuUworQFBPV0VSUENfVFJVRUBhbV9fYXBwZW5kXzEyID0gc3JjL3Bvd2VycGMvZmZpLmMgc3JjL3Bvd2VycGMvc3lzdi5TIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLlMgc3JjL3Bvd2VycGMvbGludXg2NC5TIHNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TCitAUE9XRVJQQ19BSVhfVFJVRUBhbV9fYXBwZW5kXzEzID0gc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jIHNyYy9wb3dlcnBjL2FpeC5TIHNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMKK0BQT1dFUlBDX0RBUldJTl9UUlVFQGFtX19hcHBlbmRfMTQgPSBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgc3JjL3Bvd2VycGMvZGFyd2luLlMgc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUworQFBPV0VSUENfRlJFRUJTRF9UUlVFQGFtX19hcHBlbmRfMTUgPSBzcmMvcG93ZXJwYy9mZmkuYyBzcmMvcG93ZXJwYy9zeXN2LlMgc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUworQEFSTV9UUlVFQGFtX19hcHBlbmRfMTYgPSBzcmMvYXJtL3N5c3YuUyBzcmMvYXJtL2ZmaS5jCitAQVJNX1RSVUVAQEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfVFJVRUBhbV9fYXBwZW5kXzE3ID0gc3JjL2FybS90cmFtcG9saW5lLlMKK0BBVlIzMl9UUlVFQGFtX19hcHBlbmRfMTggPSBzcmMvYXZyMzIvc3lzdi5TIHNyYy9hdnIzMi9mZmkuYworQExJQkZGSV9DUklTX1RSVUVAYW1fX2FwcGVuZF8xOSA9IHNyYy9jcmlzL3N5c3YuUyBzcmMvY3Jpcy9mZmkuYworQEZSVl9UUlVFQGFtX19hcHBlbmRfMjAgPSBzcmMvZnJ2L2VhYmkuUyBzcmMvZnJ2L2ZmaS5jCitAUzM5MF9UUlVFQGFtX19hcHBlbmRfMjEgPSBzcmMvczM5MC9zeXN2LlMgc3JjL3MzOTAvZmZpLmMKK0BYODZfNjRfVFJVRUBhbV9fYXBwZW5kXzIyID0gc3JjL3g4Ni9mZmk2NC5jIHNyYy94ODYvdW5peDY0LlMgc3JjL3g4Ni9mZmkuYyBzcmMveDg2L3N5c3YuUworQFNIX1RSVUVAYW1fX2FwcGVuZF8yMyA9IHNyYy9zaC9zeXN2LlMgc3JjL3NoL2ZmaS5jCitAU0g2NF9UUlVFQGFtX19hcHBlbmRfMjQgPSBzcmMvc2g2NC9zeXN2LlMgc3JjL3NoNjQvZmZpLmMKK0BQQV9MSU5VWF9UUlVFQGFtX19hcHBlbmRfMjUgPSBzcmMvcGEvbGludXguUyBzcmMvcGEvZmZpLmMKK0BQQV9IUFVYX1RSVUVAYW1fX2FwcGVuZF8yNiA9IHNyYy9wYS9ocHV4MzIuUyBzcmMvcGEvZmZpLmMKKyMgQnVpbGQgZGVidWcuIERlZmluZSBGRklfREVCVUcgb24gdGhlIGNvbW1hbmRsaW5lIHNvIHRoYXQsIHdoZW4gYnVpbGRpbmcgd2l0aAorIyBNU1ZDLCBpdCBjYW4gbGluayBhZ2FpbnN0IHRoZSBkZWJ1ZyBDUlQuCitARkZJX0RFQlVHX1RSVUVAYW1fX2FwcGVuZF8yNyA9IC1ERkZJX0RFQlVHCitzdWJkaXIgPSAuCitESVNUX0NPTU1PTiA9IFJFQURNRSAkKGFtX19jb25maWd1cmVfZGVwcykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2RvYy9zdGFtcC12dGkgXAorCSQoc3JjZGlyKS9kb2MvdmVyc2lvbi50ZXhpICQoc3JjZGlyKS9mZmljb25maWcuaC5pbiBcCisJJChzcmNkaXIpL2xpYmZmaS5wYy5pbiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSBDaGFuZ2VMb2cgXAorCWNvbXBpbGUgY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgZGVwY29tcCBpbnN0YWxsLXNoIGx0bWFpbi5zaCBcCisJbWRhdGUtc2ggbWlzc2luZyB0ZXhpbmZvLnRleAorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvYXhfY2NfbWF4b3B0Lm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NmbGFnc193YXJuX2FsbC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jaGVja19jb21waWxlcl9mbGFncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jb21waWxlcl92ZW5kb3IubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY29uZmlndXJlX2FyZ3MubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfZW5hYmxlX2J1aWxkZGlyLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2djY19hcmNoZmxhZy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9nY2NfeDg2X2NwdWlkLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2xpYnRvb2wubTQgJCh0b3Bfc3JjZGlyKS9tNC9sdG9wdGlvbnMubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbHRzdWdhci5tNCAkKHRvcF9zcmNkaXIpL200L2x0dmVyc2lvbi5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdH5vYnNvbGV0ZS5tNCAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMgPSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIFwKKyBjb25maWd1cmUubGluZW5vIGNvbmZpZy5zdGF0dXMubGluZW5vCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9IGZmaWNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSBsaWJmZmkucGMKK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGluZm9kaXIpIiBcCisJIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiCitMVExJQlJBUklFUyA9ICQobGliX0xUTElCUkFSSUVTKSAkKG5vaW5zdF9MVExJQlJBUklFUykKK2xpYmZmaV9sYV9MSUJBREQgPQorYW1fX2RpcnN0YW1wID0gJChhbV9fbGVhZGluZ19kb3QpZGlyc3RhbXAKK2FtX2xpYmZmaV9sYV9PQkpFQ1RTID0gc3JjL2RlYnVnLmxvIHNyYy9wcmVwX2NpZi5sbyBzcmMvdHlwZXMubG8gXAorCXNyYy9yYXdfYXBpLmxvIHNyYy9qYXZhX3Jhd19hcGkubG8gc3JjL2Nsb3N1cmVzLmxvCitATUlQU19UUlVFQGFtX19vYmplY3RzXzEgPSBzcmMvbWlwcy9mZmkubG8gc3JjL21pcHMvbzMyLmxvIFwKK0BNSVBTX1RSVUVACXNyYy9taXBzL24zMi5sbworQFg4Nl9UUlVFQGFtX19vYmplY3RzXzIgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L3N5c3YubG8KK0BYODZfRlJFRUJTRF9UUlVFQGFtX19vYmplY3RzXzMgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L2ZyZWVic2QubG8KK0BYODZfV0lOMzJfVFJVRUBhbV9fb2JqZWN0c180ID0gc3JjL3g4Ni9mZmkubG8gc3JjL3g4Ni93aW4zMi5sbworQFg4Nl9XSU42NF9UUlVFQGFtX19vYmplY3RzXzUgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L3dpbjY0LmxvCitAWDg2X0RBUldJTl9UUlVFQGFtX19vYmplY3RzXzYgPSBzcmMveDg2L2ZmaS5sbyBzcmMveDg2L2Rhcndpbi5sbyBcCitAWDg2X0RBUldJTl9UUlVFQAlzcmMveDg2L2ZmaTY0LmxvIHNyYy94ODYvZGFyd2luNjQubG8KK0BTUEFSQ19UUlVFQGFtX19vYmplY3RzXzcgPSBzcmMvc3BhcmMvZmZpLmxvIHNyYy9zcGFyYy92OC5sbyBcCitAU1BBUkNfVFJVRUAJc3JjL3NwYXJjL3Y5LmxvCitAQUxQSEFfVFJVRUBhbV9fb2JqZWN0c184ID0gc3JjL2FscGhhL2ZmaS5sbyBzcmMvYWxwaGEvb3NmLmxvCitASUE2NF9UUlVFQGFtX19vYmplY3RzXzkgPSBzcmMvaWE2NC9mZmkubG8gc3JjL2lhNjQvdW5peC5sbworQE0zMlJfVFJVRUBhbV9fb2JqZWN0c18xMCA9IHNyYy9tMzJyL3N5c3YubG8gc3JjL20zMnIvZmZpLmxvCitATTY4S19UUlVFQGFtX19vYmplY3RzXzExID0gc3JjL202OGsvZmZpLmxvIHNyYy9tNjhrL3N5c3YubG8KK0BQT1dFUlBDX1RSVUVAYW1fX29iamVjdHNfMTIgPSBzcmMvcG93ZXJwYy9mZmkubG8gc3JjL3Bvd2VycGMvc3lzdi5sbyBcCitAUE9XRVJQQ19UUlVFQAlzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5sbyBcCitAUE9XRVJQQ19UUlVFQAlzcmMvcG93ZXJwYy9saW51eDY0LmxvIFwKK0BQT1dFUlBDX1RSVUVACXNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5sbworQFBPV0VSUENfQUlYX1RSVUVAYW1fX29iamVjdHNfMTMgPSBzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmxvIFwKK0BQT1dFUlBDX0FJWF9UUlVFQAlzcmMvcG93ZXJwYy9haXgubG8gXAorQFBPV0VSUENfQUlYX1RSVUVACXNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLmxvCitAUE9XRVJQQ19EQVJXSU5fVFJVRUBhbV9fb2JqZWN0c18xNCA9IHNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4ubG8gXAorQFBPV0VSUENfREFSV0lOX1RSVUVACXNyYy9wb3dlcnBjL2Rhcndpbi5sbyBcCitAUE9XRVJQQ19EQVJXSU5fVFJVRUAJc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUubG8KK0BQT1dFUlBDX0ZSRUVCU0RfVFJVRUBhbV9fb2JqZWN0c18xNSA9IHNyYy9wb3dlcnBjL2ZmaS5sbyBcCitAUE9XRVJQQ19GUkVFQlNEX1RSVUVACXNyYy9wb3dlcnBjL3N5c3YubG8gXAorQFBPV0VSUENfRlJFRUJTRF9UUlVFQAlzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5sbworQEFSTV9UUlVFQGFtX19vYmplY3RzXzE2ID0gc3JjL2FybS9zeXN2LmxvIHNyYy9hcm0vZmZpLmxvCitAQVJNX1RSVUVAQEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfVFJVRUBhbV9fb2JqZWN0c18xNyA9IHNyYy9hcm0vdHJhbXBvbGluZS5sbworQEFWUjMyX1RSVUVAYW1fX29iamVjdHNfMTggPSBzcmMvYXZyMzIvc3lzdi5sbyBzcmMvYXZyMzIvZmZpLmxvCitATElCRkZJX0NSSVNfVFJVRUBhbV9fb2JqZWN0c18xOSA9IHNyYy9jcmlzL3N5c3YubG8gc3JjL2NyaXMvZmZpLmxvCitARlJWX1RSVUVAYW1fX29iamVjdHNfMjAgPSBzcmMvZnJ2L2VhYmkubG8gc3JjL2Zydi9mZmkubG8KK0BTMzkwX1RSVUVAYW1fX29iamVjdHNfMjEgPSBzcmMvczM5MC9zeXN2LmxvIHNyYy9zMzkwL2ZmaS5sbworQFg4Nl82NF9UUlVFQGFtX19vYmplY3RzXzIyID0gc3JjL3g4Ni9mZmk2NC5sbyBzcmMveDg2L3VuaXg2NC5sbyBcCitAWDg2XzY0X1RSVUVACXNyYy94ODYvZmZpLmxvIHNyYy94ODYvc3lzdi5sbworQFNIX1RSVUVAYW1fX29iamVjdHNfMjMgPSBzcmMvc2gvc3lzdi5sbyBzcmMvc2gvZmZpLmxvCitAU0g2NF9UUlVFQGFtX19vYmplY3RzXzI0ID0gc3JjL3NoNjQvc3lzdi5sbyBzcmMvc2g2NC9mZmkubG8KK0BQQV9MSU5VWF9UUlVFQGFtX19vYmplY3RzXzI1ID0gc3JjL3BhL2xpbnV4LmxvIHNyYy9wYS9mZmkubG8KK0BQQV9IUFVYX1RSVUVAYW1fX29iamVjdHNfMjYgPSBzcmMvcGEvaHB1eDMyLmxvIHNyYy9wYS9mZmkubG8KK25vZGlzdF9saWJmZmlfbGFfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMSkgJChhbV9fb2JqZWN0c18yKSBcCisJJChhbV9fb2JqZWN0c18zKSAkKGFtX19vYmplY3RzXzQpICQoYW1fX29iamVjdHNfNSkgXAorCSQoYW1fX29iamVjdHNfNikgJChhbV9fb2JqZWN0c183KSAkKGFtX19vYmplY3RzXzgpIFwKKwkkKGFtX19vYmplY3RzXzkpICQoYW1fX29iamVjdHNfMTApICQoYW1fX29iamVjdHNfMTEpIFwKKwkkKGFtX19vYmplY3RzXzEyKSAkKGFtX19vYmplY3RzXzEzKSAkKGFtX19vYmplY3RzXzE0KSBcCisJJChhbV9fb2JqZWN0c18xNSkgJChhbV9fb2JqZWN0c18xNikgJChhbV9fb2JqZWN0c18xNykgXAorCSQoYW1fX29iamVjdHNfMTgpICQoYW1fX29iamVjdHNfMTkpICQoYW1fX29iamVjdHNfMjApIFwKKwkkKGFtX19vYmplY3RzXzIxKSAkKGFtX19vYmplY3RzXzIyKSAkKGFtX19vYmplY3RzXzIzKSBcCisJJChhbV9fb2JqZWN0c18yNCkgJChhbV9fb2JqZWN0c18yNSkgJChhbV9fb2JqZWN0c18yNikKK2xpYmZmaV9sYV9PQkpFQ1RTID0gJChhbV9saWJmZmlfbGFfT0JKRUNUUykgXAorCSQobm9kaXN0X2xpYmZmaV9sYV9PQkpFQ1RTKQorbGliZmZpX2xhX0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChsaWJmZmlfbGFfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorbGliZmZpX2NvbnZlbmllbmNlX2xhX0xJQkFERCA9CithbV9fb2JqZWN0c18yNyA9IHNyYy9kZWJ1Zy5sbyBzcmMvcHJlcF9jaWYubG8gc3JjL3R5cGVzLmxvIFwKKwlzcmMvcmF3X2FwaS5sbyBzcmMvamF2YV9yYXdfYXBpLmxvIHNyYy9jbG9zdXJlcy5sbworYW1fbGliZmZpX2NvbnZlbmllbmNlX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzI3KQorYW1fX29iamVjdHNfMjggPSAkKGFtX19vYmplY3RzXzEpICQoYW1fX29iamVjdHNfMikgJChhbV9fb2JqZWN0c18zKSBcCisJJChhbV9fb2JqZWN0c180KSAkKGFtX19vYmplY3RzXzUpICQoYW1fX29iamVjdHNfNikgXAorCSQoYW1fX29iamVjdHNfNykgJChhbV9fb2JqZWN0c184KSAkKGFtX19vYmplY3RzXzkpIFwKKwkkKGFtX19vYmplY3RzXzEwKSAkKGFtX19vYmplY3RzXzExKSAkKGFtX19vYmplY3RzXzEyKSBcCisJJChhbV9fb2JqZWN0c18xMykgJChhbV9fb2JqZWN0c18xNCkgJChhbV9fb2JqZWN0c18xNSkgXAorCSQoYW1fX29iamVjdHNfMTYpICQoYW1fX29iamVjdHNfMTcpICQoYW1fX29iamVjdHNfMTgpIFwKKwkkKGFtX19vYmplY3RzXzE5KSAkKGFtX19vYmplY3RzXzIwKSAkKGFtX19vYmplY3RzXzIxKSBcCisJJChhbV9fb2JqZWN0c18yMikgJChhbV9fb2JqZWN0c18yMykgJChhbV9fb2JqZWN0c18yNCkgXAorCSQoYW1fX29iamVjdHNfMjUpICQoYW1fX29iamVjdHNfMjYpCitub2Rpc3RfbGliZmZpX2NvbnZlbmllbmNlX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzI4KQorbGliZmZpX2NvbnZlbmllbmNlX2xhX09CSkVDVFMgPSAkKGFtX2xpYmZmaV9jb252ZW5pZW5jZV9sYV9PQkpFQ1RTKSBcCisJJChub2Rpc3RfbGliZmZpX2NvbnZlbmllbmNlX2xhX09CSkVDVFMpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQAorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK2FtX19tdiA9IG12IC1mCitDUFBBU0NPTVBJTEUgPSAkKENDQVMpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKQorTFRDUFBBU0NPTVBJTEUgPSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0NBUykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGliZmZpX2xhX1NPVVJDRVMpICQobm9kaXN0X2xpYmZmaV9sYV9TT1VSQ0VTKSBcCisJJChsaWJmZmlfY29udmVuaWVuY2VfbGFfU09VUkNFUykgXAorCSQobm9kaXN0X2xpYmZmaV9jb252ZW5pZW5jZV9sYV9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChsaWJmZmlfbGFfU09VUkNFUykgJChsaWJmZmlfY29udmVuaWVuY2VfbGFfU09VUkNFUykKK0lORk9fREVQUyA9ICQoc3JjZGlyKS9kb2MvbGliZmZpLmluZm8KK2FtX19URVhJTkZPX1RFWF9ESVIgPSAkKHNyY2RpcikKK0RWSVMgPSBkb2MvbGliZmZpLmR2aQorUERGUyA9IGRvYy9saWJmZmkucGRmCitQU1MgPSBkb2MvbGliZmZpLnBzCitIVE1MUyA9IGRvYy9saWJmZmkuaHRtbAorVEVYSU5GT1MgPSBkb2MvbGliZmZpLnRleGkKK1RFWEkyRFZJID0gdGV4aTJkdmkKK1RFWEkyUERGID0gJChURVhJMkRWSSkgLS1wZGYgLS1iYXRjaAorTUFLRUlORk9IVE1MID0gJChNQUtFSU5GTykgLS1odG1sCitBTV9NQUtFSU5GT0hUTUxGTEFHUyA9ICQoQU1fTUFLRUlORk9GTEFHUykKK0RWSVBTID0gZHZpcHMKK1JFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCisJaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAorCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKKwlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQorREFUQSA9ICQocGtnY29uZmlnX0RBVEEpCitSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAorICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCitBTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoUkVDVVJTSVZFX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIFwKKwkkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTOi1yZWN1cnNpdmU9KSB0YWdzIFRBR1MgY3RhZ3MgQ1RBR1MgXAorCWRpc3RkaXIgZGlzdCBkaXN0LWFsbCBkaXN0Y2hlY2sKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RfU1VCRElSUyA9ICQoU1VCRElSUykKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCit0b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKK2FtX19yZW1vdmVfZGlzdGRpciA9IFwKKyAgeyB0ZXN0ICEgLWQgIiQoZGlzdGRpcikiIFwKKyAgICB8fCB7IGZpbmQgIiQoZGlzdGRpcikiIC10eXBlIGQgISAtcGVybSAtMjAwIC1leGVjIGNobW9kIHUrdyB7fSAnOycgXAorICAgICAgICAgJiYgcm0gLWZyICIkKGRpc3RkaXIpIjsgfTsgfQorYW1fX3JlbGF0aXZpemUgPSBcCisgIGRpcjA9YHB3ZGA7IFwKKyAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCisgIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCisgIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCisgIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAorICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCisgICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAorICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKKyAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCisgICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAorICAgICAgZWxzZSBcCisgICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAorICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCisgICAgICAgIGZpOyBcCisgICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCisgICAgICBmaTsgXAorICAgIGZpOyBcCisgICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgIGRvbmU7IFwKKyAgcmVsZGlyPSIkJGRpcjIiCitESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKK0daSVBfRU5WID0gLS1iZXN0CitkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CitkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0xUTERGTEFHUyA9IEBBTV9MVExERkxBR1NACitBTV9SVU5URVNURkxBR1MgPSBAQU1fUlVOVEVTVEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0RFUE1PREUgPSBAQ0NBU0RFUE1PREVACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSA9IEBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitIQVZFX0xPTkdfRE9VQkxFID0gQEhBVkVfTE9OR19ET1VCTEVACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BSVERJQUcgPSBAUFJURElBR0AKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVEFSR0VUID0gQFRBUkdFVEAKK1RBUkdFVERJUiA9IEBUQVJHRVRESVJACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitheF9lbmFibGVfYnVpbGRkaXJfc2VkID0gQGF4X2VuYWJsZV9idWlsZGRpcl9zZWRACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzX3N5bWJvbF91bmRlcnNjb3JlID0gQHN5c19zeW1ib2xfdW5kZXJzY29yZUAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldCA9IEB0YXJnZXRACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAordGFyZ2V0X29zID0gQHRhcmdldF9vc0AKK3RhcmdldF92ZW5kb3IgPSBAdGFyZ2V0X3ZlbmRvckAKK3Rvb2xleGVjZGlyID0gQHRvb2xleGVjZGlyQAordG9vbGV4ZWNsaWJkaXIgPSBAdG9vbGV4ZWNsaWJkaXJACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24gc3ViZGlyLW9iamVjdHMKK1NVQkRJUlMgPSBpbmNsdWRlIHRlc3RzdWl0ZSBtYW4KK0VYVFJBX0RJU1QgPSBMSUNFTlNFIENoYW5nZUxvZy52MSBDaGFuZ2VMb2cubGliZ2NqIGNvbmZpZ3VyZS5ob3N0CVwKKwlzcmMvYWxwaGEvZmZpLmMgc3JjL2FscGhhL29zZi5TIHNyYy9hbHBoYS9mZml0YXJnZXQuaAkJXAorCXNyYy9hcm0vZmZpLmMgc3JjL2FybS9zeXN2LlMgc3JjL2FybS90cmFtcG9saW5lLlMJCVwKKwlzcmMvYXJtL2ZmaXRhcmdldC5oIHNyYy9hdnIzMi9mZmkuYyBzcmMvYXZyMzIvc3lzdi5TCQlcCisJc3JjL2F2cjMyL2ZmaXRhcmdldC5oIHNyYy9jcmlzL2ZmaS5jIHNyYy9jcmlzL3N5c3YuUwkJXAorCXNyYy9jcmlzL2ZmaXRhcmdldC5oIHNyYy9pYTY0L2ZmaS5jIHNyYy9pYTY0L2ZmaXRhcmdldC5oCVwKKwlzcmMvaWE2NC9pYTY0X2ZsYWdzLmggc3JjL2lhNjQvdW5peC5TIHNyYy9taXBzL2ZmaS5jCQlcCisJc3JjL21pcHMvbjMyLlMgc3JjL21pcHMvbzMyLlMgc3JjL21pcHMvZmZpdGFyZ2V0LmgJCVwKKwlzcmMvbTMyci9mZmkuYyBzcmMvbTMyci9zeXN2LlMgc3JjL20zMnIvZmZpdGFyZ2V0LmgJCVwKKwlzcmMvbTY4ay9mZmkuYyBzcmMvbTY4ay9zeXN2LlMgc3JjL202OGsvZmZpdGFyZ2V0LmgJCVwKKwlzcmMvcG93ZXJwYy9mZmkuYyBzcmMvcG93ZXJwYy9zeXN2LlMgc3JjL3Bvd2VycGMvbGludXg2NC5TCVwKKwlzcmMvcG93ZXJwYy9saW51eDY0X2Nsb3N1cmUuUyBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TCQlcCisJc3JjL3Bvd2VycGMvYXNtLmggc3JjL3Bvd2VycGMvYWl4LlMgc3JjL3Bvd2VycGMvZGFyd2luLlMJXAorCXNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMgc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUwkJXAorCXNyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyBzcmMvcG93ZXJwYy9mZml0YXJnZXQuaAkJXAorCXNyYy9zMzkwL2ZmaS5jIHNyYy9zMzkwL3N5c3YuUyBzcmMvczM5MC9mZml0YXJnZXQuaAkJXAorCXNyYy9zaC9mZmkuYyBzcmMvc2gvc3lzdi5TIHNyYy9zaC9mZml0YXJnZXQuaCBzcmMvc2g2NC9mZmkuYwlcCisJc3JjL3NoNjQvc3lzdi5TIHNyYy9zaDY0L2ZmaXRhcmdldC5oIHNyYy9zcGFyYy92OC5TCQlcCisJc3JjL3NwYXJjL3Y5LlMgc3JjL3NwYXJjL2ZmaXRhcmdldC5oIHNyYy9zcGFyYy9mZmkuYwkJXAorCXNyYy94ODYvZGFyd2luNjQuUyBzcmMveDg2L2ZmaS5jIHNyYy94ODYvc3lzdi5TCQkJXAorCXNyYy94ODYvd2luMzIuUyBzcmMveDg2L3dpbjY0LlMgc3JjL3g4Ni9kYXJ3aW4uUwkJXAorCXNyYy94ODYvZnJlZWJzZC5TIHNyYy94ODYvZmZpNjQuYyBzcmMveDg2L3VuaXg2NC5TCQlcCisJc3JjL3g4Ni9mZml0YXJnZXQuaCBzcmMvcGEvZmZpdGFyZ2V0Lmggc3JjL3BhL2ZmaS5jCQlcCisJc3JjL3BhL2xpbnV4LlMgc3JjL3BhL2hwdXgzMi5TIHNyYy9mcnYvZmZpLmMgc3JjL2Zydi9lYWJpLlMJXAorCXNyYy9mcnYvZmZpdGFyZ2V0Lmggc3JjL2RsbWFsbG9jLmMgc3JjL21veGllL2ZmaS5jCQlcCisJc3JjL21veGllL2VhYmkuUyBsaWJ0b29sLXZlcnNpb24gQ2hhbmdlTG9nLmxpYmZmaQkJXAorCW00L2xpYnRvb2wubTQgbTQvbHR+b2Jzb2xldGUubTQgbTQvbHRvcHRpb25zLm00IG00L2x0c3VnYXIubTQJXAorCW00L2x0dmVyc2lvbi5tNCBidWlsZC1pb3Muc2ggc3JjL2FybS9nZW50cmFtcC5zaCBzcmMvZGVidWcuYyAgICBcCisJbXN2Y2Muc2gKKworaW5mb19URVhJTkZPUyA9IGRvYy9saWJmZmkudGV4aQorCisjIFdvcmsgYXJvdW5kIHdoYXQgYXBwZWFycyB0byBiZSBhIEdOVSBtYWtlIGJ1ZyBoYW5kbGluZyBNQUtFRkxBR1MKKyMgdmFsdWVzIGRlZmluZWQgaW4gdGVybXMgb2YgbWFrZSB2YXJpYWJsZXMsIGFzIGlzIHRoZSBjYXNlIGZvciBDQyBhbmQKKyMgZnJpZW5kcyB3aGVuIHdlIGFyZSBjYWxsZWQgZnJvbSB0aGUgdG9wIGxldmVsIE1ha2VmaWxlLgorQU1fTUFLRUZMQUdTID0gXAorCSJBUl9GTEFHUz0kKEFSX0ZMQUdTKSIgXAorCSJDQ19GT1JfQlVJTEQ9JChDQ19GT1JfQlVJTEQpIiBcCisJIkNGTEFHUz0kKENGTEFHUykiIFwKKwkiQ1hYRkxBR1M9JChDWFhGTEFHUykiIFwKKwkiQ0ZMQUdTX0ZPUl9CVUlMRD0kKENGTEFHU19GT1JfQlVJTEQpIiBcCisJIkNGTEFHU19GT1JfVEFSR0VUPSQoQ0ZMQUdTX0ZPUl9UQVJHRVQpIiBcCisJIklOU1RBTEw9JChJTlNUQUxMKSIgXAorCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCisJIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKKwkiSU5TVEFMTF9TQ1JJUFQ9JChJTlNUQUxMX1NDUklQVCkiIFwKKwkiSkMxRkxBR1M9JChKQzFGTEFHUykiIFwKKwkiTERGTEFHUz0kKExERkxBR1MpIiBcCisJIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKKwkiTElCQ0ZMQUdTX0ZPUl9UQVJHRVQ9JChMSUJDRkxBR1NfRk9SX1RBUkdFVCkiIFwKKwkiTUFLRT0kKE1BS0UpIiBcCisJIk1BS0VJTkZPPSQoTUFLRUlORk8pICQoTUFLRUlORk9GTEFHUykiIFwKKwkiUElDRkxBRz0kKFBJQ0ZMQUcpIiBcCisJIlBJQ0ZMQUdfRk9SX1RBUkdFVD0kKFBJQ0ZMQUdfRk9SX1RBUkdFVCkiIFwKKwkiUlVOVEVTVEZMQUdTPSQoUlVOVEVTVEZMQUdTKSIgXAorCSJTSEVMTD0kKFNIRUxMKSIgXAorCSJleGVjX3ByZWZpeD0kKGV4ZWNfcHJlZml4KSIgXAorCSJpbmZvZGlyPSQoaW5mb2RpcikiIFwKKwkibGliZGlyPSQobGliZGlyKSIgXAorCSJtYW5kaXI9JChtYW5kaXIpIiBcCisJInByZWZpeD0kKHByZWZpeCkiIFwKKwkiQVI9JChBUikiIFwKKwkiQVM9JChBUykiIFwKKwkiQ0M9JChDQykiIFwKKwkiQ1hYPSQoQ1hYKSIgXAorCSJMRD0kKExEKSIgXAorCSJOTT0kKE5NKSIgXAorCSJSQU5MSUI9JChSQU5MSUIpIiBcCisJIkRFU1RESVI9JChERVNURElSKSIKKworTUFLRU9WRVJSSURFUyA9IAorQUNMT0NBTF9BTUZMQUdTID0gJChBQ0xPQ0FMX0FNRkxBR1MpIC1JIG00CitsaWJfTFRMSUJSQVJJRVMgPSBsaWJmZmkubGEKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYmZmaV9jb252ZW5pZW5jZS5sYQorbGliZmZpX2xhX1NPVVJDRVMgPSBzcmMvZGVidWcuYyBzcmMvcHJlcF9jaWYuYyBzcmMvdHlwZXMuYyBcCisJCXNyYy9yYXdfYXBpLmMgc3JjL2phdmFfcmF3X2FwaS5jIHNyYy9jbG9zdXJlcy5jCisKK3BrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKK3BrZ2NvbmZpZ19EQVRBID0gbGliZmZpLnBjCitub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMgPSAkKGFtX19hcHBlbmRfMSkgJChhbV9fYXBwZW5kXzIpIFwKKwkkKGFtX19hcHBlbmRfMykgJChhbV9fYXBwZW5kXzQpICQoYW1fX2FwcGVuZF81KSBcCisJJChhbV9fYXBwZW5kXzYpICQoYW1fX2FwcGVuZF83KSAkKGFtX19hcHBlbmRfOCkgXAorCSQoYW1fX2FwcGVuZF85KSAkKGFtX19hcHBlbmRfMTApICQoYW1fX2FwcGVuZF8xMSkgXAorCSQoYW1fX2FwcGVuZF8xMikgJChhbV9fYXBwZW5kXzEzKSAkKGFtX19hcHBlbmRfMTQpIFwKKwkkKGFtX19hcHBlbmRfMTUpICQoYW1fX2FwcGVuZF8xNikgJChhbV9fYXBwZW5kXzE3KSBcCisJJChhbV9fYXBwZW5kXzE4KSAkKGFtX19hcHBlbmRfMTkpICQoYW1fX2FwcGVuZF8yMCkgXAorCSQoYW1fX2FwcGVuZF8yMSkgJChhbV9fYXBwZW5kXzIyKSAkKGFtX19hcHBlbmRfMjMpIFwKKwkkKGFtX19hcHBlbmRfMjQpICQoYW1fX2FwcGVuZF8yNSkgJChhbV9fYXBwZW5kXzI2KQorbGliZmZpX2NvbnZlbmllbmNlX2xhX1NPVVJDRVMgPSAkKGxpYmZmaV9sYV9TT1VSQ0VTKQorbm9kaXN0X2xpYmZmaV9jb252ZW5pZW5jZV9sYV9TT1VSQ0VTID0gJChub2Rpc3RfbGliZmZpX2xhX1NPVVJDRVMpCitBTV9DRkxBR1MgPSAtZyAkKGFtX19hcHBlbmRfMjcpCitsaWJmZmlfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gYGdyZXAgLXYgJ15cIycgJChzcmNkaXIpL2xpYnRvb2wtdmVyc2lvbmAgJChMVExERkxBR1MpICQoQU1fTFRMREZMQUdTKQorQU1fQ1BQRkxBR1MgPSAtSS4gLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUlpbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zcmMKK0FNX0NDQVNGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCithbGw6IGZmaWNvbmZpZy5oCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5TIC5jIC5kdmkgLmxvIC5vIC5vYmogLnBzCithbS0tcmVmcmVzaDoKKwlAOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24nOyBcCisJICAgICAgJChhbV9fY2QpICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiBNYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAorCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCitmZmljb25maWcuaDogc3RhbXAtaDEKKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKKwkgIHJtIC1mIHN0YW1wLWgxOyBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBzdGFtcC1oMTsgXAorCWVsc2UgOjsgZmkKKworc3RhbXAtaDE6ICQoc3JjZGlyKS9mZmljb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBybSAtZiBzdGFtcC1oMQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgZmZpY29uZmlnLmgKKyQoc3JjZGlyKS9mZmljb25maWcuaC5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykgCisJKCQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikpCisJcm0gLWYgc3RhbXAtaDEKKwl0b3VjaCAkQAorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBmZmljb25maWcuaCBzdGFtcC1oMQorbGliZmZpLnBjOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvbGliZmZpLnBjLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAoraW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChsaWJkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChsaWJkaXIpIgorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCisJbGlzdDI9OyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgbGlzdDI9IiQkbGlzdDIgJCRwIjsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWRvbmU7IFwKKwl0ZXN0IC16ICIkJGxpc3QyIiB8fCB7IFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAnJChERVNURElSKSQobGliZGlyKSciOyBcCisJICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAiJChERVNURElSKSQobGliZGlyKSI7IFwKKwl9CisKK3VuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAkKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAnJChERVNURElSKSQobGliZGlyKS8kJGYnIjsgXAorCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgIiQoREVTVERJUikkKGxpYmRpcikvJCRmIjsgXAorCWRvbmUKKworY2xlYW4tbGliTFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorCitjbGVhbi1ub2luc3RMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MVExJQlJBUklFUykKKwlAbGlzdD0nJChub2luc3RfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCisJICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKKwkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKKwkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKKwlkb25lCitzcmMvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYworCUA6ID4gc3JjLyQoYW1fX2RpcnN0YW1wKQorc3JjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjLyQoREVQRElSKQorCUA6ID4gc3JjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9kZWJ1Zy5sbzogc3JjLyQoYW1fX2RpcnN0YW1wKSBzcmMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3ByZXBfY2lmLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvdHlwZXMubG86IHNyYy8kKGFtX19kaXJzdGFtcCkgc3JjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9yYXdfYXBpLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvamF2YV9yYXdfYXBpLmxvOiBzcmMvJChhbV9fZGlyc3RhbXApIHNyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvY2xvc3VyZXMubG86IHNyYy8kKGFtX19kaXJzdGFtcCkgc3JjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9taXBzLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvbWlwcworCUA6ID4gc3JjL21pcHMvJChhbV9fZGlyc3RhbXApCitzcmMvbWlwcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9taXBzLyQoREVQRElSKQorCUA6ID4gc3JjL21pcHMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL21pcHMvZmZpLmxvOiBzcmMvbWlwcy8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9taXBzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9taXBzL28zMi5sbzogc3JjL21pcHMvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvbWlwcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvbWlwcy9uMzIubG86IHNyYy9taXBzLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL21pcHMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3g4Ni8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL3g4NgorCUA6ID4gc3JjL3g4Ni8kKGFtX19kaXJzdGFtcCkKK3NyYy94ODYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMveDg2LyQoREVQRElSKQorCUA6ID4gc3JjL3g4Ni8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMveDg2L2ZmaS5sbzogc3JjL3g4Ni8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy94ODYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3g4Ni9zeXN2LmxvOiBzcmMveDg2LyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3g4Ni8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMveDg2L2ZyZWVic2QubG86IHNyYy94ODYvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMveDg2LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy94ODYvd2luMzIubG86IHNyYy94ODYvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMveDg2LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy94ODYvd2luNjQubG86IHNyYy94ODYvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMveDg2LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy94ODYvZGFyd2luLmxvOiBzcmMveDg2LyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3g4Ni8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMveDg2L2ZmaTY0LmxvOiBzcmMveDg2LyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3g4Ni8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMveDg2L2RhcndpbjY0LmxvOiBzcmMveDg2LyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3g4Ni8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvc3BhcmMvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9zcGFyYworCUA6ID4gc3JjL3NwYXJjLyQoYW1fX2RpcnN0YW1wKQorc3JjL3NwYXJjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL3NwYXJjLyQoREVQRElSKQorCUA6ID4gc3JjL3NwYXJjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9zcGFyYy9mZmkubG86IHNyYy9zcGFyYy8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9zcGFyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvc3BhcmMvdjgubG86IHNyYy9zcGFyYy8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9zcGFyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvc3BhcmMvdjkubG86IHNyYy9zcGFyYy8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9zcGFyYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvYWxwaGEvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9hbHBoYQorCUA6ID4gc3JjL2FscGhhLyQoYW1fX2RpcnN0YW1wKQorc3JjL2FscGhhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL2FscGhhLyQoREVQRElSKQorCUA6ID4gc3JjL2FscGhhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9hbHBoYS9mZmkubG86IHNyYy9hbHBoYS8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9hbHBoYS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvYWxwaGEvb3NmLmxvOiBzcmMvYWxwaGEvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvYWxwaGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL2lhNjQvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9pYTY0CisJQDogPiBzcmMvaWE2NC8kKGFtX19kaXJzdGFtcCkKK3NyYy9pYTY0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL2lhNjQvJChERVBESVIpCisJQDogPiBzcmMvaWE2NC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvaWE2NC9mZmkubG86IHNyYy9pYTY0LyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL2lhNjQvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL2lhNjQvdW5peC5sbzogc3JjL2lhNjQvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvaWE2NC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvbTMyci8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL20zMnIKKwlAOiA+IHNyYy9tMzJyLyQoYW1fX2RpcnN0YW1wKQorc3JjL20zMnIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvbTMyci8kKERFUERJUikKKwlAOiA+IHNyYy9tMzJyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9tMzJyL3N5c3YubG86IHNyYy9tMzJyLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL20zMnIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL20zMnIvZmZpLmxvOiBzcmMvbTMyci8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9tMzJyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9tNjhrLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvbTY4aworCUA6ID4gc3JjL202OGsvJChhbV9fZGlyc3RhbXApCitzcmMvbTY4ay8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9tNjhrLyQoREVQRElSKQorCUA6ID4gc3JjL202OGsvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL202OGsvZmZpLmxvOiBzcmMvbTY4ay8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9tNjhrLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9tNjhrL3N5c3YubG86IHNyYy9tNjhrLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL202OGsvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3Bvd2VycGMvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9wb3dlcnBjCisJQDogPiBzcmMvcG93ZXJwYy8kKGFtX19kaXJzdGFtcCkKK3NyYy9wb3dlcnBjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL3Bvd2VycGMvJChERVBESVIpCisJQDogPiBzcmMvcG93ZXJwYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvcG93ZXJwYy9mZmkubG86IHNyYy9wb3dlcnBjLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3Bvd2VycGMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3Bvd2VycGMvc3lzdi5sbzogc3JjL3Bvd2VycGMvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvcG93ZXJwYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5sbzogc3JjL3Bvd2VycGMvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvcG93ZXJwYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvcG93ZXJwYy9saW51eDY0LmxvOiBzcmMvcG93ZXJwYy8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9wb3dlcnBjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5sbzogc3JjL3Bvd2VycGMvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvcG93ZXJwYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvcG93ZXJwYy9mZmlfZGFyd2luLmxvOiBzcmMvcG93ZXJwYy8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9wb3dlcnBjLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9wb3dlcnBjL2FpeC5sbzogc3JjL3Bvd2VycGMvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvcG93ZXJwYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5sbzogc3JjL3Bvd2VycGMvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvcG93ZXJwYy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvcG93ZXJwYy9kYXJ3aW4ubG86IHNyYy9wb3dlcnBjLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3Bvd2VycGMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUubG86IHNyYy9wb3dlcnBjLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3Bvd2VycGMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL2FybS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL2FybQorCUA6ID4gc3JjL2FybS8kKGFtX19kaXJzdGFtcCkKK3NyYy9hcm0vJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvYXJtLyQoREVQRElSKQorCUA6ID4gc3JjL2FybS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvYXJtL3N5c3YubG86IHNyYy9hcm0vJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvYXJtLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9hcm0vZmZpLmxvOiBzcmMvYXJtLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL2FybS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvYXJtL3RyYW1wb2xpbmUubG86IHNyYy9hcm0vJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvYXJtLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9hdnIzMi8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL2F2cjMyCisJQDogPiBzcmMvYXZyMzIvJChhbV9fZGlyc3RhbXApCitzcmMvYXZyMzIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvYXZyMzIvJChERVBESVIpCisJQDogPiBzcmMvYXZyMzIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL2F2cjMyL3N5c3YubG86IHNyYy9hdnIzMi8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9hdnIzMi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvYXZyMzIvZmZpLmxvOiBzcmMvYXZyMzIvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvYXZyMzIvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL2NyaXMvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9jcmlzCisJQDogPiBzcmMvY3Jpcy8kKGFtX19kaXJzdGFtcCkKK3NyYy9jcmlzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL2NyaXMvJChERVBESVIpCisJQDogPiBzcmMvY3Jpcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvY3Jpcy9zeXN2LmxvOiBzcmMvY3Jpcy8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9jcmlzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9jcmlzL2ZmaS5sbzogc3JjL2NyaXMvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvY3Jpcy8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvZnJ2LyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvZnJ2CisJQDogPiBzcmMvZnJ2LyQoYW1fX2RpcnN0YW1wKQorc3JjL2Zydi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9mcnYvJChERVBESVIpCisJQDogPiBzcmMvZnJ2LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9mcnYvZWFiaS5sbzogc3JjL2Zydi8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9mcnYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL2Zydi9mZmkubG86IHNyYy9mcnYvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvZnJ2LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9zMzkwLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvczM5MAorCUA6ID4gc3JjL3MzOTAvJChhbV9fZGlyc3RhbXApCitzcmMvczM5MC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApOgorCUAkKE1LRElSX1ApIHNyYy9zMzkwLyQoREVQRElSKQorCUA6ID4gc3JjL3MzOTAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3MzOTAvc3lzdi5sbzogc3JjL3MzOTAvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvczM5MC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvczM5MC9mZmkubG86IHNyYy9zMzkwLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3MzOTAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3g4Ni91bml4NjQubG86IHNyYy94ODYvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMveDg2LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9zaC8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL3NoCisJQDogPiBzcmMvc2gvJChhbV9fZGlyc3RhbXApCitzcmMvc2gvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvc2gvJChERVBESVIpCisJQDogPiBzcmMvc2gvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3NoL3N5c3YubG86IHNyYy9zaC8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9zaC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvc2gvZmZpLmxvOiBzcmMvc2gvJChhbV9fZGlyc3RhbXApIHNyYy9zaC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCitzcmMvc2g2NC8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL3NoNjQKKwlAOiA+IHNyYy9zaDY0LyQoYW1fX2RpcnN0YW1wKQorc3JjL3NoNjQvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvc2g2NC8kKERFUERJUikKKwlAOiA+IHNyYy9zaDY0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9zaDY0L3N5c3YubG86IHNyYy9zaDY0LyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3NoNjQvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3NoNjQvZmZpLmxvOiBzcmMvc2g2NC8kKGFtX19kaXJzdGFtcCkgXAorCXNyYy9zaDY0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK3NyYy9wYS8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgc3JjL3BhCisJQDogPiBzcmMvcGEvJChhbV9fZGlyc3RhbXApCitzcmMvcGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKToKKwlAJChNS0RJUl9QKSBzcmMvcGEvJChERVBESVIpCisJQDogPiBzcmMvcGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3BhL2xpbnV4LmxvOiBzcmMvcGEvJChhbV9fZGlyc3RhbXApIFwKKwlzcmMvcGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3BhL2ZmaS5sbzogc3JjL3BhLyQoYW1fX2RpcnN0YW1wKSBzcmMvcGEvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorc3JjL3BhL2hwdXgzMi5sbzogc3JjL3BhLyQoYW1fX2RpcnN0YW1wKSBcCisJc3JjL3BhLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKK2xpYmZmaS5sYTogJChsaWJmZmlfbGFfT0JKRUNUUykgJChsaWJmZmlfbGFfREVQRU5ERU5DSUVTKSAKKwkkKGxpYmZmaV9sYV9MSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGliZmZpX2xhX09CSkVDVFMpICQobGliZmZpX2xhX0xJQkFERCkgJChMSUJTKQorbGliZmZpX2NvbnZlbmllbmNlLmxhOiAkKGxpYmZmaV9jb252ZW5pZW5jZV9sYV9PQkpFQ1RTKSAkKGxpYmZmaV9jb252ZW5pZW5jZV9sYV9ERVBFTkRFTkNJRVMpIAorCSQoTElOSykgICQobGliZmZpX2NvbnZlbmllbmNlX2xhX09CSkVDVFMpICQobGliZmZpX2NvbnZlbmllbmNlX2xhX0xJQkFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvYWxwaGEvZmZpLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvYWxwaGEvZmZpLmxvCisJLXJtIC1mIHNyYy9hbHBoYS9vc2YuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9hbHBoYS9vc2YubG8KKwktcm0gLWYgc3JjL2FybS9mZmkuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9hcm0vZmZpLmxvCisJLXJtIC1mIHNyYy9hcm0vc3lzdi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2FybS9zeXN2LmxvCisJLXJtIC1mIHNyYy9hcm0vdHJhbXBvbGluZS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2FybS90cmFtcG9saW5lLmxvCisJLXJtIC1mIHNyYy9hdnIzMi9mZmkuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9hdnIzMi9mZmkubG8KKwktcm0gLWYgc3JjL2F2cjMyL3N5c3YuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9hdnIzMi9zeXN2LmxvCisJLXJtIC1mIHNyYy9jbG9zdXJlcy4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2Nsb3N1cmVzLmxvCisJLXJtIC1mIHNyYy9jcmlzL2ZmaS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2NyaXMvZmZpLmxvCisJLXJtIC1mIHNyYy9jcmlzL3N5c3YuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9jcmlzL3N5c3YubG8KKwktcm0gLWYgc3JjL2RlYnVnLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvZGVidWcubG8KKwktcm0gLWYgc3JjL2Zydi9lYWJpLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvZnJ2L2VhYmkubG8KKwktcm0gLWYgc3JjL2Zydi9mZmkuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9mcnYvZmZpLmxvCisJLXJtIC1mIHNyYy9pYTY0L2ZmaS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2lhNjQvZmZpLmxvCisJLXJtIC1mIHNyYy9pYTY0L3VuaXguJChPQkpFWFQpCisJLXJtIC1mIHNyYy9pYTY0L3VuaXgubG8KKwktcm0gLWYgc3JjL2phdmFfcmF3X2FwaS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL2phdmFfcmF3X2FwaS5sbworCS1ybSAtZiBzcmMvbTMyci9mZmkuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9tMzJyL2ZmaS5sbworCS1ybSAtZiBzcmMvbTMyci9zeXN2LiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvbTMyci9zeXN2LmxvCisJLXJtIC1mIHNyYy9tNjhrL2ZmaS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL202OGsvZmZpLmxvCisJLXJtIC1mIHNyYy9tNjhrL3N5c3YuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9tNjhrL3N5c3YubG8KKwktcm0gLWYgc3JjL21pcHMvZmZpLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvbWlwcy9mZmkubG8KKwktcm0gLWYgc3JjL21pcHMvbjMyLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvbWlwcy9uMzIubG8KKwktcm0gLWYgc3JjL21pcHMvbzMyLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvbWlwcy9vMzIubG8KKwktcm0gLWYgc3JjL3BhL2ZmaS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3BhL2ZmaS5sbworCS1ybSAtZiBzcmMvcGEvaHB1eDMyLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvcGEvaHB1eDMyLmxvCisJLXJtIC1mIHNyYy9wYS9saW51eC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3BhL2xpbnV4LmxvCisJLXJtIC1mIHNyYy9wb3dlcnBjL2FpeC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3Bvd2VycGMvYWl4LmxvCisJLXJtIC1mIHNyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5sbworCS1ybSAtZiBzcmMvcG93ZXJwYy9kYXJ3aW4uJChPQkpFWFQpCisJLXJtIC1mIHNyYy9wb3dlcnBjL2Rhcndpbi5sbworCS1ybSAtZiBzcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUubG8KKwktcm0gLWYgc3JjL3Bvd2VycGMvZmZpLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvcG93ZXJwYy9mZmkubG8KKwktcm0gLWYgc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5sbworCS1ybSAtZiBzcmMvcG93ZXJwYy9saW51eDY0LiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvcG93ZXJwYy9saW51eDY0LmxvCisJLXJtIC1mIHNyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLmxvCisJLXJtIC1mIHNyYy9wb3dlcnBjL3BwY19jbG9zdXJlLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5sbworCS1ybSAtZiBzcmMvcG93ZXJwYy9zeXN2LiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvcG93ZXJwYy9zeXN2LmxvCisJLXJtIC1mIHNyYy9wcmVwX2NpZi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3ByZXBfY2lmLmxvCisJLXJtIC1mIHNyYy9yYXdfYXBpLiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvcmF3X2FwaS5sbworCS1ybSAtZiBzcmMvczM5MC9mZmkuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9zMzkwL2ZmaS5sbworCS1ybSAtZiBzcmMvczM5MC9zeXN2LiQoT0JKRVhUKQorCS1ybSAtZiBzcmMvczM5MC9zeXN2LmxvCisJLXJtIC1mIHNyYy9zaC9mZmkuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9zaC9mZmkubG8KKwktcm0gLWYgc3JjL3NoL3N5c3YuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9zaC9zeXN2LmxvCisJLXJtIC1mIHNyYy9zaDY0L2ZmaS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3NoNjQvZmZpLmxvCisJLXJtIC1mIHNyYy9zaDY0L3N5c3YuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9zaDY0L3N5c3YubG8KKwktcm0gLWYgc3JjL3NwYXJjL2ZmaS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3NwYXJjL2ZmaS5sbworCS1ybSAtZiBzcmMvc3BhcmMvdjguJChPQkpFWFQpCisJLXJtIC1mIHNyYy9zcGFyYy92OC5sbworCS1ybSAtZiBzcmMvc3BhcmMvdjkuJChPQkpFWFQpCisJLXJtIC1mIHNyYy9zcGFyYy92OS5sbworCS1ybSAtZiBzcmMvdHlwZXMuJChPQkpFWFQpCisJLXJtIC1mIHNyYy90eXBlcy5sbworCS1ybSAtZiBzcmMveDg2L2Rhcndpbi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3g4Ni9kYXJ3aW4ubG8KKwktcm0gLWYgc3JjL3g4Ni9kYXJ3aW42NC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3g4Ni9kYXJ3aW42NC5sbworCS1ybSAtZiBzcmMveDg2L2ZmaS4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3g4Ni9mZmkubG8KKwktcm0gLWYgc3JjL3g4Ni9mZmk2NC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3g4Ni9mZmk2NC5sbworCS1ybSAtZiBzcmMveDg2L2ZyZWVic2QuJChPQkpFWFQpCisJLXJtIC1mIHNyYy94ODYvZnJlZWJzZC5sbworCS1ybSAtZiBzcmMveDg2L3N5c3YuJChPQkpFWFQpCisJLXJtIC1mIHNyYy94ODYvc3lzdi5sbworCS1ybSAtZiBzcmMveDg2L3VuaXg2NC4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3g4Ni91bml4NjQubG8KKwktcm0gLWYgc3JjL3g4Ni93aW4zMi4kKE9CSkVYVCkKKwktcm0gLWYgc3JjL3g4Ni93aW4zMi5sbworCS1ybSAtZiBzcmMveDg2L3dpbjY0LiQoT0JKRVhUKQorCS1ybSAtZiBzcmMveDg2L3dpbjY0LmxvCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvJChERVBESVIpL2Nsb3N1cmVzLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjLyQoREVQRElSKS9kZWJ1Zy5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy8kKERFUERJUikvamF2YV9yYXdfYXBpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjLyQoREVQRElSKS9wcmVwX2NpZi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy8kKERFUERJUikvcmF3X2FwaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy8kKERFUERJUikvdHlwZXMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvYWxwaGEvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9hbHBoYS8kKERFUERJUikvb3NmLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL2FybS8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL2FybS8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9hcm0vJChERVBESVIpL3RyYW1wb2xpbmUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvYXZyMzIvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9hdnIzMi8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9jcmlzLyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvY3Jpcy8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9mcnYvJChERVBESVIpL2VhYmkuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvZnJ2LyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvaWE2NC8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL2lhNjQvJChERVBESVIpL3VuaXguUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbTMyci8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL20zMnIvJChERVBESVIpL3N5c3YuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbTY4ay8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL202OGsvJChERVBESVIpL3N5c3YuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvbWlwcy8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL21pcHMvJChERVBESVIpL24zMi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9taXBzLyQoREVQRElSKS9vMzIuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvcGEvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9wYS8kKERFUERJUikvaHB1eDMyLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3BhLyQoREVQRElSKS9saW51eC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9wb3dlcnBjLyQoREVQRElSKS9haXguUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvcG93ZXJwYy8kKERFUERJUikvYWl4X2Nsb3N1cmUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvcG93ZXJwYy8kKERFUERJUikvZGFyd2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3Bvd2VycGMvJChERVBESVIpL2Rhcndpbl9jbG9zdXJlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3Bvd2VycGMvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9wb3dlcnBjLyQoREVQRElSKS9mZmlfZGFyd2luLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3Bvd2VycGMvJChERVBESVIpL2xpbnV4NjQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvcG93ZXJwYy8kKERFUERJUikvbGludXg2NF9jbG9zdXJlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3Bvd2VycGMvJChERVBESVIpL3BwY19jbG9zdXJlLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3Bvd2VycGMvJChERVBESVIpL3N5c3YuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvczM5MC8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3MzOTAvJChERVBESVIpL3N5c3YuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvc2gvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9zaC8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9zaDY0LyQoREVQRElSKS9mZmkuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMvc2g2NC8kKERFUERJUikvc3lzdi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9zcGFyYy8kKERFUERJUikvZmZpLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3NwYXJjLyQoREVQRElSKS92OC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy9zcGFyYy8kKERFUERJUikvdjkuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMveDg2LyQoREVQRElSKS9kYXJ3aW4uUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMveDg2LyQoREVQRElSKS9kYXJ3aW42NC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy94ODYvJChERVBESVIpL2ZmaS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy94ODYvJChERVBESVIpL2ZmaTY0LlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAc3JjL3g4Ni8kKERFUERJUikvZnJlZWJzZC5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy94ODYvJChERVBESVIpL3N5c3YuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMveDg2LyQoREVQRElSKS91bml4NjQuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUBzcmMveDg2LyQoREVQRElSKS93aW4zMi5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQHNyYy94ODYvJChERVBESVIpL3dpbjY0LlBsb0BhbV9fcXVvdGVACisKKy5TLm86CitAYW1fX2Zhc3RkZXBDQ0FTX1RSVUVACWRlcGJhc2U9YGVjaG8gJEAgfCBzZWQgJ3N8W14vXSokJHwkKERFUERJUikvJnw7c3xcLm8kJHx8J2A7XAorQGFtX19mYXN0ZGVwQ0NBU19UUlVFQAkkKENQUEFTQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgJDwgJiZcCitAYW1fX2Zhc3RkZXBDQ0FTX1RSVUVACSQoYW1fX212KSAkJGRlcGJhc2UuVHBvICQkZGVwYmFzZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NBU19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ0FTX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NBU0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NBU19GQUxTRUAJJChDUFBBU0NPTVBJTEUpIC1jIC1vICRAICQ8CisKKy5TLm9iajoKK0BhbV9fZmFzdGRlcENDQVNfVFJVRUAJZGVwYmFzZT1gZWNobyAkQCB8IHNlZCAnc3xbXi9dKiQkfCQoREVQRElSKS8mfDtzfFwub2JqJCR8fCdgO1wKK0BhbV9fZmFzdGRlcENDQVNfVFJVRUAJJChDUFBBU0NPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkJGRlcGJhc2UuVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AgJiZcCitAYW1fX2Zhc3RkZXBDQ0FTX1RSVUVACSQoYW1fX212KSAkJGRlcGJhc2UuVHBvICQkZGVwYmFzZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NBU19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ0FTX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NBU0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NBU19GQUxTRUAJJChDUFBBU0NPTVBJTEUpIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLlMubG86CitAYW1fX2Zhc3RkZXBDQ0FTX1RSVUVACWRlcGJhc2U9YGVjaG8gJEAgfCBzZWQgJ3N8W14vXSokJHwkKERFUERJUikvJnw7c3xcLmxvJCR8fCdgO1wKK0BhbV9fZmFzdGRlcENDQVNfVFJVRUAJJChMVENQUEFTQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQkZGVwYmFzZS5UcG8gLWMgLW8gJEAgJDwgJiZcCitAYW1fX2Zhc3RkZXBDQ0FTX1RSVUVACSQoYW1fX212KSAkJGRlcGJhc2UuVHBvICQkZGVwYmFzZS5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDQVNfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDQVNfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0FTREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ0FTX0ZBTFNFQAkkKExUQ1BQQVNDT01QSUxFKSAtYyAtbyAkQCAkPAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJZGVwYmFzZT1gZWNobyAkQCB8IHNlZCAnc3xbXi9dKiQkfCQoREVQRElSKS8mfDtzfFwubyQkfHwnYDtcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkJGRlcGJhc2UuVHBvIC1jIC1vICRAICQ8ICYmXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQkZGVwYmFzZS5UcG8gJCRkZXBiYXNlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAtbyAkQCAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlkZXBiYXNlPWBlY2hvICRAIHwgc2VkICdzfFteL10qJCR8JChERVBESVIpLyZ8O3N8XC5vYmokJHx8J2A7XAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJCRkZXBiYXNlLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgICYmXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQkZGVwYmFzZS5UcG8gJCRkZXBiYXNlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJZGVwYmFzZT1gZWNobyAkQCB8IHNlZCAnc3xbXi9dKiQkfCQoREVQRElSKS8mfDtzfFwubG8kJHx8J2A7XAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkJGRlcGJhc2UuVHBvIC1jIC1vICRAICQ8ICYmXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQkZGVwYmFzZS5UcG8gJCRkZXBiYXNlLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKwktcm0gLXJmIHNyYy8ubGlicyBzcmMvX2xpYnMKKwktcm0gLXJmIHNyYy9hbHBoYS8ubGlicyBzcmMvYWxwaGEvX2xpYnMKKwktcm0gLXJmIHNyYy9hcm0vLmxpYnMgc3JjL2FybS9fbGlicworCS1ybSAtcmYgc3JjL2F2cjMyLy5saWJzIHNyYy9hdnIzMi9fbGlicworCS1ybSAtcmYgc3JjL2NyaXMvLmxpYnMgc3JjL2NyaXMvX2xpYnMKKwktcm0gLXJmIHNyYy9mcnYvLmxpYnMgc3JjL2Zydi9fbGlicworCS1ybSAtcmYgc3JjL2lhNjQvLmxpYnMgc3JjL2lhNjQvX2xpYnMKKwktcm0gLXJmIHNyYy9tMzJyLy5saWJzIHNyYy9tMzJyL19saWJzCisJLXJtIC1yZiBzcmMvbTY4ay8ubGlicyBzcmMvbTY4ay9fbGlicworCS1ybSAtcmYgc3JjL21pcHMvLmxpYnMgc3JjL21pcHMvX2xpYnMKKwktcm0gLXJmIHNyYy9wYS8ubGlicyBzcmMvcGEvX2xpYnMKKwktcm0gLXJmIHNyYy9wb3dlcnBjLy5saWJzIHNyYy9wb3dlcnBjL19saWJzCisJLXJtIC1yZiBzcmMvczM5MC8ubGlicyBzcmMvczM5MC9fbGlicworCS1ybSAtcmYgc3JjL3NoLy5saWJzIHNyYy9zaC9fbGlicworCS1ybSAtcmYgc3JjL3NoNjQvLmxpYnMgc3JjL3NoNjQvX2xpYnMKKwktcm0gLXJmIHNyYy9zcGFyYy8ubGlicyBzcmMvc3BhcmMvX2xpYnMKKwktcm0gLXJmIHNyYy94ODYvLmxpYnMgc3JjL3g4Ni9fbGlicworCitkaXN0Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgbGlidG9vbCBjb25maWcubHQKK2RvYy8kKGFtX19kaXJzdGFtcCk6CisJQCQoTUtESVJfUCkgZG9jCisJQDogPiBkb2MvJChhbV9fZGlyc3RhbXApCisKKyQoc3JjZGlyKS9kb2MvbGliZmZpLmluZm86IGRvYy9saWJmZmkudGV4aSAkKHNyY2RpcikvZG9jL3ZlcnNpb24udGV4aQorCXJlc3RvcmU9OiAmJiBiYWNrdXBkaXI9IiQoYW1fX2xlYWRpbmdfZG90KWFtJCQkJCIgJiYgXAorCWFtX19jd2Q9YHB3ZGAgJiYgJChhbV9fY2QpICQoc3JjZGlyKSAmJiBcCisJcm0gLXJmICQkYmFja3VwZGlyICYmIG1rZGlyICQkYmFja3VwZGlyICYmIFwKKwlpZiAoJChNQUtFSU5GTykgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgZm9yIGYgaW4gJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XSAkKEA6LmluZm89KS5pWzAtOV0gJChAOi5pbmZvPSkuaVswLTldWzAtOV07IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJGY7IHRoZW4gbXYgJCRmICQkYmFja3VwZGlyOyByZXN0b3JlPW12OyBlbHNlIDo7IGZpOyBcCisJICBkb25lOyBcCisJZWxzZSA6OyBmaSAmJiBcCisJY2QgIiQkYW1fX2N3ZCI7IFwKKwlpZiAkKE1BS0VJTkZPKSAkKEFNX01BS0VJTkZPRkxBR1MpICQoTUFLRUlORk9GTEFHUykgLUkgZG9jIC1JICQoc3JjZGlyKS9kb2MgXAorCSAtbyAkQCAkKHNyY2RpcikvZG9jL2xpYmZmaS50ZXhpOyBcCisJdGhlbiBcCisJICByYz0wOyBcCisJICAkKGFtX19jZCkgJChzcmNkaXIpOyBcCisJZWxzZSBcCisJICByYz0kJD87IFwKKwkgICQoYW1fX2NkKSAkKHNyY2RpcikgJiYgXAorCSAgJCRyZXN0b3JlICQkYmFja3VwZGlyLyogYGVjaG8gIi4vJEAiIHwgc2VkICdzfFteL10qJCR8fCdgOyBcCisJZmk7IFwKKwlybSAtcmYgJCRiYWNrdXBkaXI7IGV4aXQgJCRyYworCitkb2MvbGliZmZpLmR2aTogZG9jL2xpYmZmaS50ZXhpICQoc3JjZGlyKS9kb2MvdmVyc2lvbi50ZXhpIGRvYy8kKGFtX19kaXJzdGFtcCkKKwlURVhJTlBVVFM9IiQoYW1fX1RFWElORk9fVEVYX0RJUikkKFBBVEhfU0VQQVJBVE9SKSQkVEVYSU5QVVRTIiBcCisJTUFLRUlORk89JyQoTUFLRUlORk8pICQoQU1fTUFLRUlORk9GTEFHUykgJChNQUtFSU5GT0ZMQUdTKSAtSSBkb2MgLUkgJChzcmNkaXIpL2RvYycgXAorCSQoVEVYSTJEVkkpIC1vICRAIGB0ZXN0IC1mICdkb2MvbGliZmZpLnRleGknIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRvYy9saWJmZmkudGV4aQorCitkb2MvbGliZmZpLnBkZjogZG9jL2xpYmZmaS50ZXhpICQoc3JjZGlyKS9kb2MvdmVyc2lvbi50ZXhpIGRvYy8kKGFtX19kaXJzdGFtcCkKKwlURVhJTlBVVFM9IiQoYW1fX1RFWElORk9fVEVYX0RJUikkKFBBVEhfU0VQQVJBVE9SKSQkVEVYSU5QVVRTIiBcCisJTUFLRUlORk89JyQoTUFLRUlORk8pICQoQU1fTUFLRUlORk9GTEFHUykgJChNQUtFSU5GT0ZMQUdTKSAtSSBkb2MgLUkgJChzcmNkaXIpL2RvYycgXAorCSQoVEVYSTJQREYpIC1vICRAIGB0ZXN0IC1mICdkb2MvbGliZmZpLnRleGknIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRvYy9saWJmZmkudGV4aQorCitkb2MvbGliZmZpLmh0bWw6IGRvYy9saWJmZmkudGV4aSAkKHNyY2RpcikvZG9jL3ZlcnNpb24udGV4aSBkb2MvJChhbV9fZGlyc3RhbXApCisJcm0gLXJmICQoQDouaHRtbD0uaHRwKQorCWlmICQoTUFLRUlORk9IVE1MKSAkKEFNX01BS0VJTkZPSFRNTEZMQUdTKSAkKE1BS0VJTkZPRkxBR1MpIC1JIGRvYyAtSSAkKHNyY2RpcikvZG9jIFwKKwkgLW8gJChAOi5odG1sPS5odHApIGB0ZXN0IC1mICdkb2MvbGliZmZpLnRleGknIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRvYy9saWJmZmkudGV4aTsgXAorCXRoZW4gXAorCSAgcm0gLXJmICRAOyBcCisJICBpZiB0ZXN0ICEgLWQgJChAOi5odG1sPS5odHApICYmIHRlc3QgLWQgJChAOi5odG1sPSk7IHRoZW4gXAorCSAgICBtdiAkKEA6Lmh0bWw9KSAkQDsgZWxzZSBtdiAkKEA6Lmh0bWw9Lmh0cCkgJEA7IGZpOyBcCisJZWxzZSBcCisJICBpZiB0ZXN0ICEgLWQgJChAOi5odG1sPS5odHApICYmIHRlc3QgLWQgJChAOi5odG1sPSk7IHRoZW4gXAorCSAgICBybSAtcmYgJChAOi5odG1sPSk7IGVsc2Ugcm0gLVJmICQoQDouaHRtbD0uaHRwKSAkQDsgZmk7IFwKKwkgIGV4aXQgMTsgXAorCWZpCiskKHNyY2RpcikvZG9jL3ZlcnNpb24udGV4aTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvZG9jL3N0YW1wLXZ0aQorJChzcmNkaXIpL2RvYy9zdGFtcC12dGk6IGRvYy9saWJmZmkudGV4aSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZQorCXRlc3QgLWYgZG9jLyQoYW1fX2RpcnN0YW1wKSB8fCAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkb2MvJChhbV9fZGlyc3RhbXApCisJQChkaXI9LjsgdGVzdCAtZiAuL2RvYy9saWJmZmkudGV4aSB8fCBkaXI9JChzcmNkaXIpOyBcCisJc2V0IGAkKFNIRUxMKSAkKHNyY2RpcikvbWRhdGUtc2ggJCRkaXIvZG9jL2xpYmZmaS50ZXhpYDsgXAorCWVjaG8gIkBzZXQgVVBEQVRFRCAkJDEgJCQyICQkMyI7IFwKKwllY2hvICJAc2V0IFVQREFURUQtTU9OVEggJCQyICQkMyI7IFwKKwllY2hvICJAc2V0IEVESVRJT04gJChWRVJTSU9OKSI7IFwKKwllY2hvICJAc2V0IFZFUlNJT04gJChWRVJTSU9OKSIpID4gdnRpLnRtcAorCUBjbXAgLXMgdnRpLnRtcCAkKHNyY2RpcikvZG9jL3ZlcnNpb24udGV4aSBcCisJICB8fCAoZWNobyAiVXBkYXRpbmcgJChzcmNkaXIpL2RvYy92ZXJzaW9uLnRleGkiOyBcCisJICAgICAgY3AgdnRpLnRtcCAkKHNyY2RpcikvZG9jL3ZlcnNpb24udGV4aSkKKwktQHJtIC1mIHZ0aS50bXAKKwlAY3AgJChzcmNkaXIpL2RvYy92ZXJzaW9uLnRleGkgJEAKKworbW9zdGx5Y2xlYW4tdnRpOgorCS1ybSAtZiB2dGkudG1wCisKK21haW50YWluZXItY2xlYW4tdnRpOgorQE1BSU5UQUlORVJfTU9ERV9UUlVFQAktcm0gLWYgJChzcmNkaXIpL2RvYy9zdGFtcC12dGkgJChzcmNkaXIpL2RvYy92ZXJzaW9uLnRleGkKKy5kdmkucHM6CisJVEVYSU5QVVRTPSIkKGFtX19URVhJTkZPX1RFWF9ESVIpJChQQVRIX1NFUEFSQVRPUikkJFRFWElOUFVUUyIgXAorCSQoRFZJUFMpIC1vICRAICQ8CisKK3VuaW5zdGFsbC1kdmktYW06CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChEVklTKSc7IHRlc3QgLW4gIiQoZHZpZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgICQoYW1fX3N0cmlwX2RpcikgXAorCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChkdmlkaXIpLyQkZiciOyBcCisJICBybSAtZiAiJChERVNURElSKSQoZHZpZGlyKS8kJGYiOyBcCisJZG9uZQorCit1bmluc3RhbGwtaHRtbC1hbToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKEhUTUxTKSc7IHRlc3QgLW4gIiQoaHRtbGRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAkKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiBybSAtcmYgJyQoREVTVERJUikkKGh0bWxkaXIpLyQkZiciOyBcCisJICBybSAtcmYgIiQoREVTVERJUikkKGh0bWxkaXIpLyQkZiI7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1pbmZvLWFtOgorCUAkKFBSRV9VTklOU1RBTEwpCisJQGlmIHRlc3QgLWQgJyQoREVTVERJUikkKGluZm9kaXIpJyAmJiBcCisJICAgIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uICYmIFwKKwkgICAgIGluc3RhbGwtaW5mbyAtLXZlcnNpb24gMj4mMSB8IHNlZCAxcSB8IGdyZXAgLWkgLXYgZGViaWFuKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICAgIHJlbGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgJ3N8Xi4qL3x8J2A7IFwKKwkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSckKERFU1RESVIpJChpbmZvZGlyKScgLS1yZW1vdmUgJyQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSciOyBcCisJICAgIGlmIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSIkKERFU1RESVIpJChpbmZvZGlyKSIgLS1yZW1vdmUgIiQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSI7IFwKKwkgICAgdGhlbiA6OyBlbHNlIHRlc3QgISAtZiAiJChERVNURElSKSQoaW5mb2RpcikvJCRyZWxmaWxlIiB8fCBleGl0IDE7IGZpOyBcCisJICBkb25lOyBcCisJZWxzZSA6OyBmaQorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIHJlbGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgJ3N8Xi4qL3x8J2A7IFwKKwkgIHJlbGZpbGVfaT1gZWNobyAiJCRyZWxmaWxlIiB8IHNlZCAnc3xcLmluZm8kJHx8O3N8JCR8Lml8J2A7IFwKKwkgIChpZiB0ZXN0IC1kICIkKERFU1RESVIpJChpbmZvZGlyKSIgJiYgY2QgIiQoREVTVERJUikkKGluZm9kaXIpIjsgdGhlbiBcCisJICAgICBlY2hvICIgY2QgJyQoREVTVERJUikkKGluZm9kaXIpJyAmJiBybSAtZiAkJHJlbGZpbGUgJCRyZWxmaWxlLVswLTldICQkcmVsZmlsZS1bMC05XVswLTldICQkcmVsZmlsZV9pWzAtOV0gJCRyZWxmaWxlX2lbMC05XVswLTldIjsgXAorCSAgICAgcm0gLWYgJCRyZWxmaWxlICQkcmVsZmlsZS1bMC05XSAkJHJlbGZpbGUtWzAtOV1bMC05XSAkJHJlbGZpbGVfaVswLTldICQkcmVsZmlsZV9pWzAtOV1bMC05XTsgXAorCSAgIGVsc2UgOjsgZmkpOyBcCisJZG9uZQorCit1bmluc3RhbGwtcGRmLWFtOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoUERGUyknOyB0ZXN0IC1uICIkKHBkZmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAkKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQocGRmZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKHBkZmRpcikvJCRmIjsgXAorCWRvbmUKKwordW5pbnN0YWxsLXBzLWFtOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoUFNTKSc7IHRlc3QgLW4gIiQocHNkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgJChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKHBzZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKHBzZGlyKS8kJGYiOyBcCisJZG9uZQorCitkaXN0LWluZm86ICQoSU5GT19ERVBTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGJhc2UgaW4gXAorCSAgICAkKHNyY2RpcikvKikgYmFzZT1gZWNobyAiJCRiYXNlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgZXNhYzsgXAorCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgYmFzZV9pPWBlY2hvICIkJGJhc2UiIHwgc2VkICdzfFwuaW5mbyQkfHw7c3wkJHwuaXwnYDsgXAorCSAgZm9yIGZpbGUgaW4gJCRkLyQkYmFzZSAkJGQvJCRiYXNlLVswLTldICQkZC8kJGJhc2UtWzAtOV1bMC05XSAkJGQvJCRiYXNlX2lbMC05XSAkJGQvJCRiYXNlX2lbMC05XVswLTldOyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIFwKKwkgICAgICByZWxmaWxlPWBleHByICIkJGZpbGUiIDogIiQkZC9cKC4qXCkiYDsgXAorCSAgICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRyZWxmaWxlIiB8fCBcCisJCWNwIC1wICQkZmlsZSAiJChkaXN0ZGlyKS8kJHJlbGZpbGUiOyBcCisJICAgIGVsc2UgOjsgZmk7IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKK21vc3RseWNsZWFuLWFtaW5mbzoKKwktcm0gLXJmIGxpYmZmaS5hdXggbGliZmZpLmNwIGxpYmZmaS5jcHMgbGliZmZpLmZuIGxpYmZmaS5reSBsaWJmZmkubG9nIFwKKwkgIGxpYmZmaS5wZyBsaWJmZmkudG1wIGxpYmZmaS50b2MgbGliZmZpLnRwIGxpYmZmaS52cgorCitjbGVhbi1hbWluZm86CisJLXRlc3QgLXogImRvYy9saWJmZmkuZHZpIGRvYy9saWJmZmkucGRmIGRvYy9saWJmZmkucHMgZG9jL2xpYmZmaS5odG1sIiBcCisJfHwgcm0gLXJmIGRvYy9saWJmZmkuZHZpIGRvYy9saWJmZmkucGRmIGRvYy9saWJmZmkucHMgZG9jL2xpYmZmaS5odG1sCisKK21haW50YWluZXItY2xlYW4tYW1pbmZvOgorCUBsaXN0PSckKElORk9fREVQUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlfaT1gZWNobyAiJCRpIiB8IHNlZCAnc3xcLmluZm8kJHx8O3N8JCR8Lml8J2A7IFwKKwkgIGVjaG8gIiBybSAtZiAkJGkgJCRpLVswLTldICQkaS1bMC05XVswLTldICQkaV9pWzAtOV0gJCRpX2lbMC05XVswLTldIjsgXAorCSAgcm0gLWYgJCRpICQkaS1bMC05XSAkJGktWzAtOV1bMC05XSAkJGlfaVswLTldICQkaV9pWzAtOV1bMC05XTsgXAorCWRvbmUKK2luc3RhbGwtcGtnY29uZmlnREFUQTogJChwa2djb25maWdfREFUQSkKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHBrZ2NvbmZpZ2RpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiCisJQGxpc3Q9JyQocGtnY29uZmlnX0RBVEEpJzsgdGVzdCAtbiAiJChwa2djb25maWdkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IFwKKwlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKHBrZ2NvbmZpZ2RpciknIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikiIHx8IGV4aXQgJCQ/OyBcCisJZG9uZQorCit1bmluc3RhbGwtcGtnY29uZmlnREFUQToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHBrZ2NvbmZpZ19EQVRBKSc7IHRlc3QgLW4gIiQocGtnY29uZmlnZGlyKSIgfHwgbGlzdD07IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICQkcDsgZG9uZSB8IHNlZCAtZSAnc3xeLiovfHwnYDsgXAorCXRlc3QgLW4gIiQkZmlsZXMiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChwa2djb25maWdkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKKyQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorY3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGZmaWNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD0uOyBcCisJZWxzZSBcCisJICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD07IFwKKwlmaTsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAorCSAgICAgIHNldCAiJCRAIiAiJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBmZmljb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiBjdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGZmaWNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGZmaWNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKwl0ZXN0IC1kICIkKGRpc3RkaXIpIiB8fCBta2RpciAiJChkaXN0ZGlyKSIKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJChkaXN0ZGlyKS8kJHN1YmRpciI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X2Rpc3RkaXI9JCRyZWxkaXI7IFwKKwkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJCh0b3BfZGlzdGRpcikiOyBcCisJICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCisJICAgIG5ld190b3BfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBlY2hvICIgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXFwiOyBcCisJICAgIGVjaG8gIiAgICAgYW1fX3JlbW92ZV9kaXN0ZGlyPTogYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogYW1fX3NraXBfbW9kZV9maXg9OiBkaXN0ZGlyKSI7IFwKKwkgICAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiBcCisJICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBcCisJICAgICAgICBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcCisJCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKKwkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAorCQlhbV9fc2tpcF9tb2RlX2ZpeD06IFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgXAorCSAgZGlzdC1pbmZvCisJLXRlc3QgLW4gIiQoYW1fX3NraXBfbW9kZV9maXgpIiBcCisJfHwgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC03NTUgXAorCQktZXhlYyBjaG1vZCB1K3J3eCxnbytyeCB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1saW5rcyAxIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDAwIC1leGVjIGNobW9kIGErciB7fSBcOyAtbyBcCisJICAhIC10eXBlIGQgISAtcGVybSAtNDQ0IC1leGVjICQoaW5zdGFsbF9zaCkgLWMgLW0gYStyIHt9IHt9IFw7IFwKKwl8fCBjaG1vZCAtUiBhK3IgIiQoZGlzdGRpcikiCitkaXN0LWd6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWJ6aXAyOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGJ6aXAyIC05IC1jID4kKGRpc3RkaXIpLnRhci5iejIKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC1sem1hOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGx6bWEgLTkgLWMgPiQoZGlzdGRpcikudGFyLmx6bWEKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC14ejogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCB4eiAtYyA+JChkaXN0ZGlyKS50YXIueHoKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC10YXJaOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGNvbXByZXNzIC1jID4kKGRpc3RkaXIpLnRhci5aCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3Qtc2hhcjogZGlzdGRpcgorCXNoYXIgJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS5zaGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtemlwOiBkaXN0ZGlyCisJLXJtIC1mICQoZGlzdGRpcikuemlwCisJemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QgZGlzdC1hbGw6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCisjIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCisjIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCisjIHRhcmZpbGUuCitkaXN0Y2hlY2s6IGRpc3QKKwljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCisJKi50YXIuZ3oqKSBcCisJICBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWRjICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLmJ6MiopIFwKKwkgIGJ6aXAyIC1kYyAkKGRpc3RkaXIpLnRhci5iejIgfCAkKGFtX191bnRhcikgOztcCisJKi50YXIubHptYSopIFwKKwkgIGx6bWEgLWRjICQoZGlzdGRpcikudGFyLmx6bWEgfCAkKGFtX191bnRhcikgOztcCisJKi50YXIueHoqKSBcCisJICB4eiAtZGMgJChkaXN0ZGlyKS50YXIueHogfCAkKGFtX191bnRhcikgOztcCisJKi50YXIuWiopIFwKKwkgIHVuY29tcHJlc3MgLWMgJChkaXN0ZGlyKS50YXIuWiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnNoYXIuZ3oqKSBcCisJICBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWRjICQoZGlzdGRpcikuc2hhci5neiB8IHVuc2hhciA7O1wKKwkqLnppcCopIFwKKwkgIHVuemlwICQoZGlzdGRpcikuemlwIDs7XAorCWVzYWMKKwljaG1vZCAtUiBhLXcgJChkaXN0ZGlyKTsgY2htb2QgYSt3ICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpL19idWlsZAorCW1rZGlyICQoZGlzdGRpcikvX2luc3QKKwljaG1vZCBhLXcgJChkaXN0ZGlyKQorCXRlc3QgLWQgJChkaXN0ZGlyKS9fYnVpbGQgfHwgZXhpdCAwOyBcCisJZGNfaW5zdGFsbF9iYXNlPWAkKGFtX19jZCkgJChkaXN0ZGlyKS9faW5zdCAmJiBwd2QgfCBzZWQgLWUgJ3MsXlteOlxcL106W1xcL10sLywnYCBcCisJICAmJiBkY19kZXN0ZGlyPSIkJHtUTVBESVItL3RtcH0vYW0tZGMtJCQkJC8iIFwKKwkgICYmIGFtX19jd2Q9YHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQoZGlzdGRpcikvX2J1aWxkIFwKKwkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAorCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgJiYgKHsgXAorCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCisJICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKKwkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKKwkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKKwkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrIFwKKwkgICYmIGNkICIkJGFtX19jd2QiIFwKKwkgIHx8IGV4aXQgMQorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCUAoZWNobyAiJChkaXN0ZGlyKSBhcmNoaXZlcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uOiAiOyBcCisJICBsaXN0PSckKERJU1RfQVJDSElWRVMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSkgfCBcCisJICBzZWQgLWUgMWggLWUgMXMvLi89L2cgLWUgMXAgLWUgMXggLWUgJyQkcCcgLWUgJyQkeCcKK2Rpc3R1bmluc3RhbGxjaGVjazoKKwlAJChhbV9fY2QpICckKGRpc3R1bmluc3RhbGxjaGVja19kaXIpJyBcCisJJiYgdGVzdCBgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtbGUgMSBcCisJICAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGw6IiA7IFwKKwkgICAgICAgIGlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuIFwKKwkgICAgICAgICAgZWNobyAiICAoY2hlY2sgREVTVERJUiBzdXBwb3J0KSI7IFwKKwkgICAgICAgIGZpIDsgXAorCSAgICAgICAgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgIGV4aXQgMTsgfSA+JjIKK2Rpc3RjbGVhbmNoZWNrOiBkaXN0Y2xlYW4KKwlAaWYgdGVzdCAnJChzcmNkaXIpJyA9IC4gOyB0aGVuIFwKKwkgIGVjaG8gIkVSUk9SOiBkaXN0Y2xlYW5jaGVjayBjYW4gb25seSBydW4gZnJvbSBhIFZQQVRIIGJ1aWxkIiA7IFwKKwkgIGV4aXQgMSA7IFwKKwlmaQorCUB0ZXN0IGAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWVxIDAgXAorCSAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBpbiBidWlsZCBkaXJlY3RvcnkgYWZ0ZXIgZGlzdGNsZWFuOiIgOyBcCisJICAgICAgICQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgZXhpdCAxOyB9ID4mMgorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZSAkKElORk9fREVQUykgJChMVExJQlJBUklFUykgJChEQVRBKSBmZmljb25maWcuaAoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CisJZm9yIGRpciBpbiAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGluZm9kaXIpIiAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKwktcm0gLWYgZG9jLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9hbHBoYS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9hbHBoYS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL2FybS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9hcm0vJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9hdnIzMi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9hdnIzMi8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL2NyaXMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvY3Jpcy8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL2Zydi8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9mcnYvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9pYTY0LyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL2lhNjQvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9tMzJyLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL20zMnIvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9tNjhrLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL202OGsvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9taXBzLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL21pcHMvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9wYS8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9wYS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL3Bvd2VycGMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvcG93ZXJwYy8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL3MzOTAvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvczM5MC8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL3NoLyQoREVQRElSKS8kKGFtX19kaXJzdGFtcCkKKwktcm0gLWYgc3JjL3NoLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvc2g2NC8kKERFUERJUikvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy9zaDY0LyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvc3BhcmMvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMvc3BhcmMvJChhbV9fZGlyc3RhbXApCisJLXJtIC1mIHNyYy94ODYvJChERVBESVIpLyQoYW1fX2RpcnN0YW1wKQorCS1ybSAtZiBzcmMveDg2LyQoYW1fX2RpcnN0YW1wKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWFtaW5mbyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKKwljbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdExUTElCUkFSSUVTIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQorCS1ybSAtcmYgc3JjLyQoREVQRElSKSBzcmMvYWxwaGEvJChERVBESVIpIHNyYy9hcm0vJChERVBESVIpIHNyYy9hdnIzMi8kKERFUERJUikgc3JjL2NyaXMvJChERVBESVIpIHNyYy9mcnYvJChERVBESVIpIHNyYy9pYTY0LyQoREVQRElSKSBzcmMvbTMyci8kKERFUERJUikgc3JjL202OGsvJChERVBESVIpIHNyYy9taXBzLyQoREVQRElSKSBzcmMvcGEvJChERVBESVIpIHNyYy9wb3dlcnBjLyQoREVQRElSKSBzcmMvczM5MC8kKERFUERJUikgc3JjL3NoLyQoREVQRElSKSBzcmMvc2g2NC8kKERFUERJUikgc3JjL3NwYXJjLyQoREVQRElSKSBzcmMveDg2LyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOiAkKERWSVMpCisKK2h0bWw6IGh0bWwtcmVjdXJzaXZlCisKK2h0bWwtYW06ICQoSFRNTFMpCisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06ICQoSU5GT19ERVBTKQorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWR2aS1hbTogJChEVklTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoZHZpZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoZHZpZGlyKSIKKwlAbGlzdD0nJChEVklTKSc7IHRlc3QgLW4gIiQoZHZpZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChkdmlkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChkdmlkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1saWJMVExJQlJBUklFUworCitpbnN0YWxsLWh0bWwtYW06ICQoSFRNTFMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChodG1sZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoaHRtbGRpcikiCisJQGxpc3Q9JyQoSFRNTFMpJzsgbGlzdDI9OyB0ZXN0IC1uICIkKGh0bWxkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIiB8fCB0ZXN0IC1kICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgJChhbV9fc3RyaXBfZGlyKSBcCisJICBpZiB0ZXN0IC1kICIkJGQkJHAiOyB0aGVuIFwKKwkgICAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGh0bWxkaXIpLyQkZiciOyBcCisJICAgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGh0bWxkaXIpLyQkZiIgfHwgZXhpdCAxOyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZCQkcCcvKiAnJChERVNURElSKSQoaHRtbGRpcikvJCRmJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGQkJHAiLyogIiQoREVTVERJUikkKGh0bWxkaXIpLyQkZiIgfHwgZXhpdCAkJD87IFwKKwkgIGVsc2UgXAorCSAgICBsaXN0Mj0iJCRsaXN0MiAkJGQkJHAiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwl0ZXN0IC16ICIkJGxpc3QyIiB8fCB7IGVjaG8gIiQkbGlzdDIiIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKGh0bWxkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChodG1sZGlyKSIgfHwgZXhpdCAkJD87IFwKKwlkb25lOyB9CitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGluZm9kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChpbmZvZGlyKSIKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoSU5GT19ERVBTKSc7IHRlc3QgLW4gIiQoaW5mb2RpcikiIHx8IGxpc3Q9OyBcCisJZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICBjYXNlICQkZmlsZSBpbiBcCisJICAgICQoc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBmaWxlX2k9YGVjaG8gIiQkZmlsZSIgfCBzZWQgJ3N8XC5pbmZvJCR8fDtzfCQkfC5pfCdgOyBcCisJICBmb3IgaWZpbGUgaW4gJCRkLyQkZmlsZSAkJGQvJCRmaWxlLVswLTldICQkZC8kJGZpbGUtWzAtOV1bMC05XSBcCisJICAgICAgICAgICAgICAgJCRkLyQkZmlsZV9pWzAtOV0gJCRkLyQkZmlsZV9pWzAtOV1bMC05XSA7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJGlmaWxlOyB0aGVuIFwKKwkgICAgICBlY2hvICIkJGlmaWxlIjsgXAorCSAgICBlbHNlIDogOyBmaTsgXAorCSAgZG9uZTsgXAorCWRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQoaW5mb2RpciknIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKGluZm9kaXIpIiB8fCBleGl0ICQkPzsgZG9uZQorCUAkKFBPU1RfSU5TVEFMTCkKKwlAaWYgKGluc3RhbGwtaW5mbyAtLXZlcnNpb24gJiYgXAorCSAgICAgaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiAyPiYxIHwgc2VkIDFxIHwgZ3JlcCAtaSAtdiBkZWJpYW4pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBsaXN0PSckKElORk9fREVQUyknOyB0ZXN0IC1uICIkKGluZm9kaXIpIiB8fCBsaXN0PTsgXAorCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICAgIHJlbGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgJ3N8Xi4qL3x8J2A7IFwKKwkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSckKERFU1RESVIpJChpbmZvZGlyKScgJyQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSciO1wKKwkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9IiQoREVTVERJUikkKGluZm9kaXIpIiAiJChERVNURElSKSQoaW5mb2RpcikvJCRyZWxmaWxlIiB8fCA6O1wKKwkgIGRvbmU7IFwKKwllbHNlIDogOyBmaQoraW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmLWFtOiAkKFBERlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChwZGZkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChwZGZkaXIpIgorCUBsaXN0PSckKFBERlMpJzsgdGVzdCAtbiAiJChwZGZkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IFwKKwlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKHBkZmRpciknIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKHBkZmRpcikiIHx8IGV4aXQgJCQ/OyBkb25lCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBzLWFtOiAkKFBTUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHBzZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQocHNkaXIpIgorCUBsaXN0PSckKFBTUyknOyB0ZXN0IC1uICIkKHBzZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChwc2RpciknIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKHBzZGlyKSIgfHwgZXhpdCAkJD87IGRvbmUKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKKwktcm0gLXJmIHNyYy8kKERFUERJUikgc3JjL2FscGhhLyQoREVQRElSKSBzcmMvYXJtLyQoREVQRElSKSBzcmMvYXZyMzIvJChERVBESVIpIHNyYy9jcmlzLyQoREVQRElSKSBzcmMvZnJ2LyQoREVQRElSKSBzcmMvaWE2NC8kKERFUERJUikgc3JjL20zMnIvJChERVBESVIpIHNyYy9tNjhrLyQoREVQRElSKSBzcmMvbWlwcy8kKERFUERJUikgc3JjL3BhLyQoREVQRElSKSBzcmMvcG93ZXJwYy8kKERFUERJUikgc3JjL3MzOTAvJChERVBESVIpIHNyYy9zaC8kKERFUERJUikgc3JjL3NoNjQvJChERVBESVIpIHNyYy9zcGFyYy8kKERFUERJUikgc3JjL3g4Ni8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tdnRpCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tdnRpCisKK3BkZjogcGRmLXJlY3Vyc2l2ZQorCitwZGYtYW06ICQoUERGUykKKworcHM6IHBzLXJlY3Vyc2l2ZQorCitwcy1hbTogJChQU1MpCisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWR2aS1hbSB1bmluc3RhbGwtaHRtbC1hbSB1bmluc3RhbGwtaW5mby1hbSBcCisJdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIHVuaW5zdGFsbC1wZGYtYW0gXAorCXVuaW5zdGFsbC1wa2djb25maWdEQVRBIHVuaW5zdGFsbC1wcy1hbQorCisuTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgYWxsIFwKKwljdGFncy1yZWN1cnNpdmUgaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwIHRhZ3MtcmVjdXJzaXZlCisKKy5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAorCWFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tYW1pbmZvIFwKKwljbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgXAorCWNsZWFuLW5vaW5zdExUTElCUkFSSUVTIGN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0IGRpc3QtYWxsIFwKKwlkaXN0LWJ6aXAyIGRpc3QtZ3ppcCBkaXN0LWluZm8gZGlzdC1sem1hIGRpc3Qtc2hhciBkaXN0LXRhclogXAorCWRpc3QteHogZGlzdC16aXAgZGlzdGNoZWNrIGRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBcCisJZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuY2hlY2sgZGlzdGRpciBkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWxpYkxUTElCUkFSSUVTIFwKKwlpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgXAorCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCisJbWFpbnRhaW5lci1jbGVhbi12dGkgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tYW1pbmZvIFwKKwltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCisJbW9zdGx5Y2xlYW4tdnRpIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtZHZpLWFtIHVuaW5zdGFsbC1odG1sLWFtIFwKKwl1bmluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgdW5pbnN0YWxsLXBkZi1hbSBcCisJdW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgdW5pbnN0YWxsLXBzLWFtCisKKworIyBObyBpbnN0YWxsLWh0bWwgb3IgaW5zdGFsbC1wZGYgc3VwcG9ydCBpbiBhdXRvbWFrZSB5ZXQKKy5QSE9OWTogaW5zdGFsbC1odG1sIGluc3RhbGwtcGRmCitpbnN0YWxsLWh0bWw6CitpbnN0YWxsLXBkZjoKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL01ha2VmaWxlLnZjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL01ha2VmaWxlLnZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmM4OTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvTWFrZWZpbGUudmMKQEAgLTAsMCArMSwxNDEgQEAKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgbGliZmZpIFdpbmRvd3MgTWFrZWZpbGUKKyMKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKworTkFNRT1mZmktMworVkVSU0lPTj0zLjAuMTAKK1RBUkdFVD1YODZfV0lOMzIKK0NDPWNsLmV4ZQorQVM9bWwuZXhlCitSQz1yYy5leGUKK01UPW10LmV4ZQorQVI9ImxpbmsuZXhlIgorU089LmRsbAorT0JKPS5vYmoKK0VYRT0uZXhlCitMQT0ubGliCitMSU5LPSJsaW5rLmV4ZSIKK1BSRUZJWD0KK1RPUERJUj0uCitDUFA9Y2wuZXhlIC1FUAorQ0ZMQUdTPS1ub2xvZ28gLVppIC1EX01EIC1XMyAtRFdJTjMyIC1EV0lOTlQgLURfV0lOMzIgLURfV0lORE9XUyAtRF9XSU5OVCAtRF9XSU4zMl9XSU5OVD0weDA1MDEgLURfV0lOMzJfSUU9MHgwNjAwIC1EX1g4Nl89MSAtRE5ERUJVRyAtTUQgLU8yIC1PYjIgLU95LQorTERGTEFHUz0vTk9MT0dPIC9NQUNISU5FOlg4NgorU0hGTEFHUz0vRExMIC9JTkNSRU1FTlRBTDpOTyAvREVCVUcgL1NVQlNZU1RFTTpXSU5ET1dTIC9PUFQ6UkVGCitBUkZMQUdTPS9MSUIKK0FTRkxBR1M9LWNvZmYgLVczIC1DeCAtWm0gLURpMzg2IC1EUVVJRVQgLUQ/UVVJRVQKK1JDRkxBR1M9L2wgMHg0MDkgLUROREVCVUcKK0lOQ0xVREVTPS1JIC4gLUkgLlxpbmNsdWRlIC1JIC5cc3JjXHg4NiAKK0xJQlM9a2VybmVsMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYgorCitWRVJTSU9OX01BSk9SPTMKK1ZFUlNJT05fTUlOT1I9MQorVkVSU0lPTl9QQVRDSD0xMHJjCisKK0RFU1RESVI9JChQUkVGSVgpCitERVNUQklOPSQoUFJFRklYKVxiaW4KK0RFU1RMSUI9JChQUkVGSVgpXGxpYgorREVTVElOQz0kKFBSRUZJWClcaW5jbHVkZQorU1JDRElSPSQoVE9QRElSKVxzcmMKKworV09SS0RJUj0kKFRPUERJUilcLmxpYnMKK1NPTElCTkFNRT1saWIkKE5BTUUpCitMQUxJQk5BTUU9bGliZmZpX2NvbnZlbmllbmNlCitTVEFUSUNMSUI9JChXT1JLRElSKVwkKExBTElCTkFNRSkkKExBKQorCitCVUlMRFBEQiA9ICQoV09SS0RJUilcJChTT0xJQk5BTUUpLnBkYgorCitIRUFERVJTID0gXAorCSQoVE9QRElSKVxmZmljb25maWcuaAorCitGRklfSEVBREVSUyA9IFwKKwkkKFRPUERJUilcaW5jbHVkZVxmZmkuaAorCQorT0JKRUNUUyA9IFwKKwkkKFNSQ0RJUilcY2xvc3VyZXMub2JqIFwKKwkkKFNSQ0RJUilcZGVidWcub2JqIFwKKwkkKFNSQ0RJUilcamF2YV9yYXdfYXBpLm9iaiBcCisJJChTUkNESVIpXHByZXBfY2lmLm9iaiBcCisJJChTUkNESVIpXHJhd19hcGkub2JqIFwKKwkkKFNSQ0RJUilcdHlwZXMub2JqIFwKKwkkKFNSQ0RJUilceDg2XGZmaS5vYmoKKworIUlGICIkKFRBUkdFVCkiID09ICJYODZfV0lOMzIiCitPQkpFQ1RTID0gJChPQkpFQ1RTKSBcCisJJChTUkNESVIpXHg4Nlx3aW4zMi5vYmoKK0FTTVNSQ1MgPSBcCisgICAgJChTUkNESVIpXHg4Nlx3aW4zMi5hc20KKyAgICAKKyFFTkRJRgorIUlGICIkKFRBUkdFVCkiID09ICJYODZfV0lONjQiCitPQkpFQ1RTID0gJChPQkpFQ1RTKSBcCisJJChTUkNESVIpXHg4Nlx3aW42NC5vYmoKK0FTTVNSQ1MgPSBcCisgICAgJChTUkNESVIpXHg4Nlx3aW42NC5hc20KKworIUVORElGCisKKy5TVUZGSVhFUyA6IC5TIC5hc20KKworYWxsOiAkKFdPUktESVIpICQoU1RBVElDTElCKQorCisuYyQoT0JKKToKKwkkKENDKSAtYyAkKENGTEFHUykgJChJTkNMVURFUykgLUZvJEAgLUZkJChXT1JLRElSKVwkKE5BTUUpLXNyYyAkPAorCisuYXNtJChPQkopOgorCSQoQVMpIC1jICQoQVNGTEFHUykgL0ZvICRAICQ8CisKKy5TLmFzbToKKwkkKENQUCkgJChDRkxBR1MpICQoSU5DTFVERVMpICQ8ID4kQAorCisucmMucmVzOgorCSQoUkMpICQoUkNGTEFHUykgL2ZvICRAICQ8CisKKyQoV09SS0RJUikgOgorCS1AaWYgbm90IGV4aXN0ICIkKFdPUktESVIpXCQoTlVMTCkiIG1rZGlyICQoV09SS0RJUikKKworJChIRUFERVJTKSA6CisJLUBpZiBub3QgZXhpc3QgJChIRUFERVJTKSBjb3B5ICQoSEVBREVSUyl3ICQoSEVBREVSUykKKworJChGRklfSEVBREVSUykgOgorCS1AaWYgbm90IGV4aXN0ICQoRkZJX0hFQURFUlMpIGNvcHkgJChGRklfSEVBREVSUykudmMgJChGRklfSEVBREVSUykKKwkKKyQoU1RBVElDTElCKTogJChXT1JLRElSKSAkKEZGSV9IRUFERVJTKSAkKEhFQURFUlMpICQoQVNNU1JDUykgJChPQkpFQ1RTKQorCSQoQVIpICQoQVJGTEFHUykgJChMREZMQUdTKSAvb3V0OiQoU1RBVElDTElCKSBAPDwKKwkkKE9CSkVDVFMpCis8PAorCisKKyFJRiAhREVGSU5FRChQUkVGSVgpIHx8ICIkKFBSRUZJWCkiID09ICIiCisKK2luc3RhbGw6CisJQGVjaG8gRVJST1I6IFlvdSBtdXN0IGRlZmluZSBpbnN0YWxsYXRpb24gUFJFRklYPWRlc3RpbmF0aW9uCisKKyFFTFNFCisKK2luc3RhbGw6IGFsbAorCS1AeGNvcHkgIiQoVE9QRElSKVxpbmNsdWRlXCouaCIgIiQoREVTVElOQylcIiAvWSAvUQorCS1AeGNvcHkgIiQoU1JDRElSKVx4ODZcZmZpdGFyZ2V0LmgiICIkKERFU1RJTkMpXCIgL1kgL1EKKwktQHhjb3B5ICIkKFdPUktESVIpXCQoTEFMSUJOQU1FKSQoTEEpIiAiJChERVNUTElCKVwiIC9ZIC9RCisJLUB4Y29weSAiJChXT1JLRElSKVwkKFNPTElCTkFNRSkkKExBKSIgIiQoREVTVExJQilcIiAvWSAvUQorCS1AeGNvcHkgIiQoV09SS0RJUilcJChTT0xJQk5BTUUpJChTTykiICIkKERFU1RCSU4pXCIgL1kgL1EKKwktQHhjb3B5ICIkKFdPUktESVIpXCQoU09MSUJOQU1FKS5wZGIiICIkKERFU1RMSUIpXCIgL1kgL1EKKworIUVORElGCisKK2NsZWFuOgorCS1AZGVsIC9RICQoT0JKRUNUUykgMj5OVUwKKwktQGRlbCAvUSAkKFJFU09VUkNFUykgMj5OVUwKKwktQGRlbCAvUSAkKEFTTVNSQ1MpIDI+TlVMCisJLUBkZWwgL1EgL1MgJChXT1JLRElSKSAyPk5VTAorCitkaXN0Y2xlYW46IGNsZWFuCisJLUBkZWwgL1EgJChIRUFERVJTKSAyPk5VTAorCS1AZGVsIC9RICQoVE9QRElSKVxpbmNsdWRlXGZmaS5oIDI+TlVMCisJLUBkZWwgL1EgJChUT1BESVIpXGZmaWNvbmZpZy5oIDI+TlVMCisJLUBkZWwgL1EgJChUT1BESVIpXE1ha2VmaWxlLnZjIDI+TlVMCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9NYWtlZmlsZS52YzY0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL01ha2VmaWxlLnZjNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5OWJhYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9NYWtlZmlsZS52YzY0CkBAIC0wLDAgKzEsMTQxIEBACisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIGxpYmZmaSBXaW5kb3dzIE1ha2VmaWxlCisjCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisKK05BTUU9ZmZpLTMKK1ZFUlNJT049My4wLjEwCitUQVJHRVQ9WDg2X1dJTjY0CitDQz1jbC5leGUKK0FTPW1sNjQuZXhlCitSQz1yYy5leGUKK01UPW10LmV4ZQorQVI9ImxpbmsuZXhlIgorU089LmRsbAorT0JKPS5vYmoKK0VYRT0uZXhlCitMQT0ubGliCitMSU5LPSJsaW5rLmV4ZSIKK1BSRUZJWD0KK1RPUERJUj0uCitDUFA9Y2wuZXhlIC1FUAorQ0ZMQUdTPS1ub2xvZ28gLVppIC1EX01EIC1XMyAtRFdJTjY0IC1EV0lOTlQgLURfV0lOMzIgLURfV0lORE9XUyAtRF9XSU5OVCAtRF9XSU4zMl9XSU5OVD0weDA1MDEgLURfV0lOMzJfSUU9MHgwNjAwIC1EX0FNRDY0Xz0xIC1ETkRFQlVHIC1NRCAtTzIgLU9iMiAtT3ktCitMREZMQUdTPS9OT0xPR08gL01BQ0hJTkU6WDY0CitTSEZMQUdTPS9ETEwgL0lOQ1JFTUVOVEFMOk5PIC9ERUJVRyAvU1VCU1lTVEVNOldJTkRPV1MgL09QVDpSRUYKK0FSRkxBR1M9L0xJQgorQVNGTEFHUz0tY29mZiAtVzMgLUN4IC1abSAtRGkzODYgLURRVUlFVCAtRD9RVUlFVAorUkNGTEFHUz0vbCAweDQwOSAtRE5ERUJVRworSU5DTFVERVM9LUkgLiAtSSAuXGluY2x1ZGUgLUkgLlxzcmNceDg2IAorTElCUz1rZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliCisKK1ZFUlNJT05fTUFKT1I9MworVkVSU0lPTl9NSU5PUj0xCitWRVJTSU9OX1BBVENIPTEwcmMKKworREVTVERJUj0kKFBSRUZJWCkKK0RFU1RCSU49JChQUkVGSVgpXGJpbgorREVTVExJQj0kKFBSRUZJWClcbGliCitERVNUSU5DPSQoUFJFRklYKVxpbmNsdWRlCitTUkNESVI9JChUT1BESVIpXHNyYworCitXT1JLRElSPSQoVE9QRElSKVwubGlicworU09MSUJOQU1FPWxpYiQoTkFNRSkKK0xBTElCTkFNRT1saWJmZmlfY29udmVuaWVuY2UKK1NUQVRJQ0xJQj0kKFdPUktESVIpXCQoTEFMSUJOQU1FKSQoTEEpCisKK0JVSUxEUERCID0gJChXT1JLRElSKVwkKFNPTElCTkFNRSkucGRiCisKK0hFQURFUlMgPSBcCisJJChUT1BESVIpXGZmaWNvbmZpZy5oCisKK0ZGSV9IRUFERVJTID0gXAorCSQoVE9QRElSKVxpbmNsdWRlXGZmaS5oCisJCitPQkpFQ1RTID0gXAorCSQoU1JDRElSKVxjbG9zdXJlcy5vYmogXAorCSQoU1JDRElSKVxkZWJ1Zy5vYmogXAorCSQoU1JDRElSKVxqYXZhX3Jhd19hcGkub2JqIFwKKwkkKFNSQ0RJUilccHJlcF9jaWYub2JqIFwKKwkkKFNSQ0RJUilccmF3X2FwaS5vYmogXAorCSQoU1JDRElSKVx0eXBlcy5vYmogXAorCSQoU1JDRElSKVx4ODZcZmZpLm9iagorCishSUYgIiQoVEFSR0VUKSIgPT0gIlg4Nl9XSU4zMiIKK09CSkVDVFMgPSAkKE9CSkVDVFMpIFwKKwkkKFNSQ0RJUilceDg2XHdpbjMyLm9iagorQVNNU1JDUyA9IFwKKyAgICAkKFNSQ0RJUilceDg2XHdpbjMyLmFzbQorICAgIAorIUVORElGCishSUYgIiQoVEFSR0VUKSIgPT0gIlg4Nl9XSU42NCIKK09CSkVDVFMgPSAkKE9CSkVDVFMpIFwKKwkkKFNSQ0RJUilceDg2XHdpbjY0Lm9iagorQVNNU1JDUyA9IFwKKyAgICAkKFNSQ0RJUilceDg2XHdpbjY0LmFzbQorCishRU5ESUYKKworLlNVRkZJWEVTIDogLlMgLmFzbQorCithbGw6ICQoV09SS0RJUikgJChTVEFUSUNMSUIpCisKKy5jJChPQkopOgorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKElOQ0xVREVTKSAtRm8kQCAtRmQkKFdPUktESVIpXCQoTkFNRSktc3JjICQ8CisKKy5hc20kKE9CSik6CisJJChBUykgLWMgJChBU0ZMQUdTKSAvRm8gJEAgJDwKKworLlMuYXNtOgorCSQoQ1BQKSAkKENGTEFHUykgJChJTkNMVURFUykgJDwgPiRACisKKy5yYy5yZXM6CisJJChSQykgJChSQ0ZMQUdTKSAvZm8gJEAgJDwKKworJChXT1JLRElSKSA6CisJLUBpZiBub3QgZXhpc3QgIiQoV09SS0RJUilcJChOVUxMKSIgbWtkaXIgJChXT1JLRElSKQorCiskKEhFQURFUlMpIDoKKwktQGlmIG5vdCBleGlzdCAkKEhFQURFUlMpIGNvcHkgJChIRUFERVJTKXcgJChIRUFERVJTKQorCiskKEZGSV9IRUFERVJTKSA6CisJLUBpZiBub3QgZXhpc3QgJChGRklfSEVBREVSUykgY29weSAkKEZGSV9IRUFERVJTKS52YzY0ICQoRkZJX0hFQURFUlMpCisJCiskKFNUQVRJQ0xJQik6ICQoV09SS0RJUikgJChGRklfSEVBREVSUykgJChIRUFERVJTKSAkKEFTTVNSQ1MpICQoT0JKRUNUUykKKwkkKEFSKSAkKEFSRkxBR1MpICQoTERGTEFHUykgL291dDokKFNUQVRJQ0xJQikgQDw8CisJJChPQkpFQ1RTKQorPDwKKworCishSUYgIURFRklORUQoUFJFRklYKSB8fCAiJChQUkVGSVgpIiA9PSAiIgorCitpbnN0YWxsOgorCUBlY2hvIEVSUk9SOiBZb3UgbXVzdCBkZWZpbmUgaW5zdGFsbGF0aW9uIFBSRUZJWD1kZXN0aW5hdGlvbgorCishRUxTRQorCitpbnN0YWxsOiBhbGwKKwktQHhjb3B5ICIkKFRPUERJUilcaW5jbHVkZVwqLmgiICIkKERFU1RJTkMpXCIgL1kgL1EKKwktQHhjb3B5ICIkKFNSQ0RJUilceDg2XGZmaXRhcmdldC5oIiAiJChERVNUSU5DKVwiIC9ZIC9RCisJLUB4Y29weSAiJChXT1JLRElSKVwkKExBTElCTkFNRSkkKExBKSIgIiQoREVTVExJQilcIiAvWSAvUQorCS1AeGNvcHkgIiQoV09SS0RJUilcJChTT0xJQk5BTUUpJChMQSkiICIkKERFU1RMSUIpXCIgL1kgL1EKKwktQHhjb3B5ICIkKFdPUktESVIpXCQoU09MSUJOQU1FKSQoU08pIiAiJChERVNUQklOKVwiIC9ZIC9RCisJLUB4Y29weSAiJChXT1JLRElSKVwkKFNPTElCTkFNRSkucGRiIiAiJChERVNUTElCKVwiIC9ZIC9RCisKKyFFTkRJRgorCitjbGVhbjoKKwktQGRlbCAvUSAkKE9CSkVDVFMpIDI+TlVMCisJLUBkZWwgL1EgJChSRVNPVVJDRVMpIDI+TlVMCisJLUBkZWwgL1EgJChBU01TUkNTKSAyPk5VTAorCS1AZGVsIC9RIC9TICQoV09SS0RJUikgMj5OVUwKKworZGlzdGNsZWFuOiBjbGVhbgorCS1AZGVsIC9RICQoSEVBREVSUykgMj5OVUwKKwktQGRlbCAvUSAkKFRPUERJUilcaW5jbHVkZVxmZmkuaCAyPk5VTAorCS1AZGVsIC9RICQoVE9QRElSKVxmZmljb25maWcuaCAyPk5VTAorCS1AZGVsIC9RICQoVE9QRElSKVxNYWtlZmlsZS52YyAyPk5VTAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvUkVBRE1FIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdjMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL1JFQURNRQpAQCAtMCwwICsxLDM0MiBAQAorU3RhdHVzCis9PT09PT0KKworbGliZmZpLTMuMC4xMCB3YXMgcmVsZWFzZWQgb24gQXVndXN0IDIzLCAyMDExLiBDaGVjayB0aGUgbGliZmZpIHdlYgorcGFnZSBmb3IgdXBkYXRlczogPFVSTDpodHRwOi8vc291cmNld2FyZS5vcmcvbGliZmZpLz4uCisKKworV2hhdCBpcyBsaWJmZmk/Cis9PT09PT09PT09PT09PT0KKworQ29tcGlsZXJzIGZvciBoaWdoIGxldmVsIGxhbmd1YWdlcyBnZW5lcmF0ZSBjb2RlIHRoYXQgZm9sbG93IGNlcnRhaW4KK2NvbnZlbnRpb25zLiBUaGVzZSBjb252ZW50aW9ucyBhcmUgbmVjZXNzYXJ5LCBpbiBwYXJ0LCBmb3Igc2VwYXJhdGUKK2NvbXBpbGF0aW9uIHRvIHdvcmsuIE9uZSBzdWNoIGNvbnZlbnRpb24gaXMgdGhlICJjYWxsaW5nCitjb252ZW50aW9uIi4gVGhlICJjYWxsaW5nIGNvbnZlbnRpb24iIGlzIGVzc2VudGlhbGx5IGEgc2V0IG9mCithc3N1bXB0aW9ucyBtYWRlIGJ5IHRoZSBjb21waWxlciBhYm91dCB3aGVyZSBmdW5jdGlvbiBhcmd1bWVudHMgd2lsbAorYmUgZm91bmQgb24gZW50cnkgdG8gYSBmdW5jdGlvbi4gQSAiY2FsbGluZyBjb252ZW50aW9uIiBhbHNvIHNwZWNpZmllcword2hlcmUgdGhlIHJldHVybiB2YWx1ZSBmb3IgYSBmdW5jdGlvbiBpcyBmb3VuZC4KKworU29tZSBwcm9ncmFtcyBtYXkgbm90IGtub3cgYXQgdGhlIHRpbWUgb2YgY29tcGlsYXRpb24gd2hhdCBhcmd1bWVudHMKK2FyZSB0byBiZSBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gRm9yIGluc3RhbmNlLCBhbiBpbnRlcnByZXRlciBtYXkgYmUKK3RvbGQgYXQgcnVuLXRpbWUgYWJvdXQgdGhlIG51bWJlciBhbmQgdHlwZXMgb2YgYXJndW1lbnRzIHVzZWQgdG8gY2FsbAorYSBnaXZlbiBmdW5jdGlvbi4gTGliZmZpIGNhbiBiZSB1c2VkIGluIHN1Y2ggcHJvZ3JhbXMgdG8gcHJvdmlkZSBhCiticmlkZ2UgZnJvbSB0aGUgaW50ZXJwcmV0ZXIgcHJvZ3JhbSB0byBjb21waWxlZCBjb2RlLgorCitUaGUgbGliZmZpIGxpYnJhcnkgcHJvdmlkZXMgYSBwb3J0YWJsZSwgaGlnaCBsZXZlbCBwcm9ncmFtbWluZworaW50ZXJmYWNlIHRvIHZhcmlvdXMgY2FsbGluZyBjb252ZW50aW9ucy4gVGhpcyBhbGxvd3MgYSBwcm9ncmFtbWVyIHRvCitjYWxsIGFueSBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgYSBjYWxsIGludGVyZmFjZSBkZXNjcmlwdGlvbiBhdCBydW4KK3RpbWUuICAKKworRkZJIHN0YW5kcyBmb3IgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UuICBBIGZvcmVpZ24gZnVuY3Rpb24KK2ludGVyZmFjZSBpcyB0aGUgcG9wdWxhciBuYW1lIGZvciB0aGUgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGNvZGUKK3dyaXR0ZW4gaW4gb25lIGxhbmd1YWdlIHRvIGNhbGwgY29kZSB3cml0dGVuIGluIGFub3RoZXIgbGFuZ3VhZ2UuIFRoZQorbGliZmZpIGxpYnJhcnkgcmVhbGx5IG9ubHkgcHJvdmlkZXMgdGhlIGxvd2VzdCwgbWFjaGluZSBkZXBlbmRlbnQKK2xheWVyIG9mIGEgZnVsbHkgZmVhdHVyZWQgZm9yZWlnbiBmdW5jdGlvbiBpbnRlcmZhY2UuIEEgbGF5ZXIgbXVzdAorZXhpc3QgYWJvdmUgbGliZmZpIHRoYXQgaGFuZGxlcyB0eXBlIGNvbnZlcnNpb25zIGZvciB2YWx1ZXMgcGFzc2VkCitiZXR3ZWVuIHRoZSB0d28gbGFuZ3VhZ2VzLgorCisKK1N1cHBvcnRlZCBQbGF0Zm9ybXMKKz09PT09PT09PT09PT09PT09PT0KKworTGliZmZpIGhhcyBiZWVuIHBvcnRlZCB0byBtYW55IGRpZmZlcmVudCBwbGF0Zm9ybXMuCitGb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkZXRhaWxzIGFuZCB0ZXN0aW5nIHN0YXR1cywgcGxlYXNlCityZWZlciB0byB0aGUgd2lraSBwYWdlIGhlcmU6CisKKyBodHRwOi8vd3d3Lm1veGllbG9naWMub3JnL3dpa2kvaW5kZXgucGhwP3RpdGxlPUxpYmZmaV8zLjAuMTAKKworQXQgdGhlIHRpbWUgb2YgcmVsZWFzZSwgdGhlIGZvbGxvd2luZyBiYXNpYyBjb25maWd1cmF0aW9ucyBoYXZlIGJlZW4KK3Rlc3RlZDoKKworfC0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgQXJjaGl0ZWN0dXJlIHwgT3BlcmF0aW5nIFN5c3RlbSB8Cit8LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBBbHBoYSAgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKK3wgQWxwaGEgICAgICAgIHwgVHJ1NjQgICAgICAgICAgICB8Cit8IEFSTSAgICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfAorfCBBUk0gICAgICAgICAgfCBpT1MgICAgICAgICAgICAgIHwKK3wgQVZSMzIgICAgICAgIHwgTGludXggICAgICAgICAgICB8Cit8IEhQUEEgICAgICAgICB8IEhQVVggICAgICAgICAgICAgfAorfCBJQS02NCAgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKK3wgTTY4SyAgICAgICAgIHwgUlRFTVMgICAgICAgICAgICB8Cit8IE1JUFMgICAgICAgICB8IElSSVggICAgICAgICAgICAgfAorfCBNSVBTICAgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKK3wgTUlQUyAgICAgICAgIHwgUlRFTVMgICAgICAgICAgICB8Cit8IE1JUFM2NCAgICAgICB8IExpbnV4ICAgICAgICAgICAgfAorfCBQb3dlclBDICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKK3wgUG93ZXJQQyAgICAgIHwgTWFjIE9TWCAgICAgICAgICB8Cit8IFBvd2VyUEMgICAgICB8IEZyZWVCU0QgICAgICAgICAgfAorfCBQb3dlclBDNjQgICAgfCBMaW51eCAgICAgICAgICAgIHwKK3wgUzM5MCAgICAgICAgIHwgTGludXggICAgICAgICAgICB8Cit8IFMzOTBYICAgICAgICB8IExpbnV4ICAgICAgICAgICAgfAorfCBTUEFSQyAgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKK3wgU1BBUkMgICAgICAgIHwgU29sYXJpcyAgICAgICAgICB8Cit8IFNQQVJDNjQgICAgICB8IExpbnV4ICAgICAgICAgICAgfAorfCBTUEFSQzY0ICAgICAgfCBGcmVlQlNEICAgICAgICAgIHwKK3wgWDg2ICAgICAgICAgIHwgRnJlZUJTRCAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICB8IEludGVyaXggICAgICAgICAgfAorfCBYODYgICAgICAgICAgfCBrRnJlZUJTRCAgICAgICAgIHwKK3wgWDg2ICAgICAgICAgIHwgTGludXggICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICB8IE1hYyBPU1ggICAgICAgICAgfAorfCBYODYgICAgICAgICAgfCBPcGVuQlNEICAgICAgICAgIHwKK3wgWDg2ICAgICAgICAgIHwgT1MvMiAgICAgICAgICAgICB8Cit8IFg4NiAgICAgICAgICB8IFNvbGFyaXMgICAgICAgICAgfAorfCBYODYgICAgICAgICAgfCBXaW5kb3dzL0N5Z3dpbiAgIHwKK3wgWDg2ICAgICAgICAgIHwgV2luZG93cy9NaW5nVyAgICB8Cit8IFg4Ni02NCAgICAgICB8IEZyZWVCU0QgICAgICAgICAgfAorfCBYODYtNjQgICAgICAgfCBMaW51eCAgICAgICAgICAgIHwKK3wgWDg2LTY0ICAgICAgIHwgT3BlbkJTRCAgICAgICAgICB8Cit8IFg4Ni02NCAgICAgICB8IFdpbmRvd3MvTWluZ1cgICAgfAorfC0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLXwKKworUGxlYXNlIHNlbmQgYWRkaXRpb25hbCBwbGF0Zm9ybSB0ZXN0IHJlc3VsdHMgdG8KK2xpYmZmaS1kaXNjdXNzQHNvdXJjZXdhcmUub3JnIGFuZCBmZWVsIGZyZWUgdG8gdXBkYXRlIHRoZSB3aWtpIHBhZ2UKK2Fib3ZlLgorCitJbnN0YWxsaW5nIGxpYmZmaQorPT09PT09PT09PT09PT09PT0KKworRmlyc3QgeW91IG11c3QgY29uZmlndXJlIHRoZSBkaXN0cmlidXRpb24gZm9yIHlvdXIgcGFydGljdWxhcgorc3lzdGVtLiBHbyB0byB0aGUgZGlyZWN0b3J5IHlvdSB3aXNoIHRvIGJ1aWxkIGxpYmZmaSBpbiBhbmQgcnVuIHRoZQorImNvbmZpZ3VyZSIgcHJvZ3JhbSBmb3VuZCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGxpYmZmaSBzb3VyY2UKK2Rpc3RyaWJ1dGlvbi4KKworWW91IG1heSB3YW50IHRvIHRlbGwgY29uZmlndXJlIHdoZXJlIHRvIGluc3RhbGwgdGhlIGxpYmZmaSBsaWJyYXJ5IGFuZAoraGVhZGVyIGZpbGVzLiBUbyBkbyB0aGF0LCB1c2UgdGhlIC0tcHJlZml4IGNvbmZpZ3VyZSBzd2l0Y2guICBMaWJmZmkKK3dpbGwgaW5zdGFsbCB1bmRlciAvdXNyL2xvY2FsIGJ5IGRlZmF1bHQuIAorCitJZiB5b3Ugd2FudCB0byBlbmFibGUgZXh0cmEgcnVuLXRpbWUgZGVidWdnaW5nIGNoZWNrcyB1c2UgdGhlIHRoZQorLS1lbmFibGUtZGVidWcgY29uZmlndXJlIHN3aXRjaC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3VyIHByb2dyYW0gZGllcworbXlzdGVyaW91c2x5IHdoaWxlIHVzaW5nIGxpYmZmaS4gCisKK0Fub3RoZXIgdXNlZnVsIGNvbmZpZ3VyZSBzd2l0Y2ggaXMgLS1lbmFibGUtcHVyaWZ5LXNhZmV0eS4gVXNpbmcgdGhpcword2lsbCBhZGQgc29tZSBleHRyYSBjb2RlIHdoaWNoIHdpbGwgc3VwcHJlc3MgY2VydGFpbiB3YXJuaW5ncyB3aGVuIHlvdQorYXJlIHVzaW5nIFB1cmlmeSB3aXRoIGxpYmZmaS4gT25seSB1c2UgdGhpcyBzd2l0Y2ggd2hlbiB1c2luZyAKK1B1cmlmeSwgYXMgaXQgd2lsbCBzbG93IGRvd24gdGhlIGxpYnJhcnkuCisKK0l0J3MgYWxzbyBwb3NzaWJsZSB0byBidWlsZCBsaWJmZmkgb24gV2luZG93cyBwbGF0Zm9ybXMgd2l0aAorTWljcm9zb2Z0J3MgVmlzdWFsIEMrKyBjb21waWxlci4gIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBtc3ZjYy5zaAord3JhcHBlciBzY3JpcHQgZHVyaW5nIGNvbmZpZ3VyYXRpb24gbGlrZSBzbzoKKworcGF0aC90by9jb25maWd1cmUgQ0M9cGF0aC90by9tc3ZjYy5zaCBMRD1saW5rIENQUD1cImNsIC1ub2xvZ28gLUVQXCIKKworRm9yIDY0LWJpdCBXaW5kb3dzIGJ1aWxkcywgdXNlIENDPSJwYXRoL3RvL21zdmNjLnNoIC1tNjQiLgorWW91IG1heSBhbHNvIG5lZWQgdG8gc3BlY2lmeSAtLWJ1aWxkIGFwcHJvcHJpYXRlbHkuIFdoZW4gYnVpbGRpbmcgd2l0aCBNU1ZDCit1bmRlciBhIE1pbmdXIGVudmlyb25tZW50LCB5b3UgbWF5IG5lZWQgdG8gcmVtb3ZlIHRoZSBsaW5lIGluIGNvbmZpZ3VyZQordGhhdCBzZXRzICdmaXhfc3JjZmlsZV9wYXRoJyB0byBhICdjeWdwYXRoJyBjb21tYW5kLiAoJ2N5Z3BhdGgnIGlzIG5vdAorcHJlc2VudCBpbiBNaW5nVywgYW5kIGlzIG5vdCByZXF1aXJlZCB3aGVuIHVzaW5nIE1pbmdXLXN0eWxlIHBhdGhzLikKKworRm9yIGlPUyBidWlsZHMsIHJlZmVyIHRvIHRoZSBidWlsZC1pb3Muc2ggc2NyaXB0IGZvciBndWlkYW5jZS4KKworQ29uZmlndXJlIGhhcyBtYW55IG90aGVyIG9wdGlvbnMuIFVzZSAiY29uZmlndXJlIC0taGVscCIgdG8gc2VlIHRoZW0gYWxsLgorCitPbmNlIGNvbmZpZ3VyZSBoYXMgZmluaXNoZWQsIHR5cGUgIm1ha2UiLiBOb3RlIHRoYXQgeW91IG11c3QgYmUgdXNpbmcKK0dOVSBtYWtlLiAgWW91IGNhbiBmdHAgR05VIG1ha2UgZnJvbSBwcmVwLmFpLm1pdC5lZHU6L3B1Yi9nbnUuCisKK1RvIGVuc3VyZSB0aGF0IGxpYmZmaSBpcyB3b3JraW5nIGFzIGFkdmVydGlzZWQsIHR5cGUgIm1ha2UgY2hlY2siLgorVGhpcyB3aWxsIHJlcXVpcmUgdGhhdCB5b3UgaGF2ZSBEZWphR05VIGluc3RhbGxlZC4KKworVG8gaW5zdGFsbCB0aGUgbGlicmFyeSBhbmQgaGVhZGVyIGZpbGVzLCB0eXBlICJtYWtlIGluc3RhbGwiLgorCisKK0hpc3RvcnkKKz09PT09PT0KKworU2VlIHRoZSBDaGFuZ2VMb2cgZmlsZXMgZm9yIGRldGFpbHMuCisKKzMuMC4xMCBBdWctMjMtMTEKKyAgICAgICAgQWRkIHN1cHBvcnQgZm9yIEFwcGxlJ3MgaU9TLgorCUFkZCBzdXBwb3J0IGZvciBBUk0gVkZQIEFCSS4KKyAgICAgICAgQWRkIFJURU1TIHN1cHBvcnQgZm9yIE1JUFMgYW5kIE02OEsuCisJRml4IGluc3RydWN0aW9uIGNhY2hlIGNsZWFyaW5nIHByb2JsZW1zIG9uCisJICBBUk0gYW5kIFNQQVJDLgorCUZpeCB0aGUgTjY0IGJ1aWxkIG9uIG1pcHMtc2dpLWlyaXg2LjUuCisJRW5hYmxlIGJ1aWxkcyB3aXRoIE1pY3Jvc29mdCdzIGNvbXBpbGVyLgorCUVuYWJsZSB4ODYgYnVpbGRzIHdpdGggT3JhY2xlJ3MgU29sYXJpcyBjb21waWxlci4KKwlGaXggc3VwcG9ydCBmb3IgY2FsbGluZyBjb2RlIGNvbXBpbGVkIHdpdGggT3JhY2xlJ3MgU3BhcmMKKwkgIFNvbGFyaXMgY29tcGlsZXIuCisJVGVzdHN1aXRlIGZpeGVzIGZvciBUcnU2NCBVbml4LgorCUFkZGl0aW9uYWwgcGxhdGZvcm0gc3VwcG9ydC4KKworMy4wLjkgRGVjLTMxLTA5CisgICAgICAgIEFkZCBBVlIzMiBhbmQgd2luNjQgcG9ydHMuICBBZGQgQVJNIHNvZnRmcCBzdXBwb3J0LgorCU1hbnkgZml4ZXMgZm9yIEFJWCwgU29sYXJpcywgSFAtVVgsICpCU0QuCisJU2V2ZXJhbCBQb3dlclBDIGFuZCB4ODYtNjQgYnVnIGZpeGVzLgorCUJ1aWxkIERMTCBmb3Igd2luZG93cy4KKworMy4wLjggRGVjLTE5LTA4CisgICAgICAgIEFkZCAqQlNELCBCZU9TLCBhbmQgUEEtTGludXggc3VwcG9ydC4KKworMy4wLjcgTm92LTExLTA4CisgICAgICAgIEZpeCBmb3IgcHBjIEZyZWVCU0QuCisJKHRoYW5rcyB0byBBbmRyZWFzIFRvYmxlcikKKworMy4wLjYgSnVsLTE3LTA4CisgICAgICAgIEZpeCBmb3IgY2xvc3VyZXMgb24gc2guCisJTWFyayB0aGUgc2gvc2g2NCBzdGFjayBhcyBub24tZXhlY3V0YWJsZS4KKwkoYm90aCB0aGFua3MgdG8gS2F6IEtvamltYSkKKworMy4wLjUgQXByLTMtMDgKKyAgICAgICAgRml4IGxpYmZmaS5wYyBmaWxlLgorCUZpeCAjZGVmaW5lIEFSTSBmb3IgSWNlZFRlYSB1c2Vycy4KKwlGaXggeDg2IGNsb3N1cmUgYnVnLgorCiszLjAuNCBGZWItMjQtMDgKKyAgICAgICAgRml4IHg4NiBPcGVuQlNEIGNvbmZpZ3VyeS4KKworMy4wLjMgRmViLTIyLTA4CisgICAgICAgIEVuYWJsZSB4ODYgT3BlbkJTRCB0aGFua3MgdG8gVGhvbWFzIEhlbGxlciwgYW5kCisJeDg2LTY0IEZyZWVCU0QgdGhhbmtzIHRvIEJqw7ZybiBLw7ZuaWcgYW5kIEFuZHJlYXMgVG9ibGVyLgorCUNsZWFuIHVwIHRlc3QgaW5zdHJ1Y3Rpb24gaW4gUkVBRE1FLgorCiszLjAuMiBGZWItMjEtMDgKKyAgICAgICAgSW1wcm92ZWQgeDg2IEZyZWVCU0Qgc3VwcG9ydC4KKwlUaGFua3MgdG8gQmrDtnJuIEvDtm5pZy4KKworMy4wLjEgRmViLTE1LTA4CisgICAgICAgIEZpeCBpbnN0cnVjdGlvbiBjYWNoZSBmbHVzaGluZyBidWcgb24gTUlQUy4KKwlUaGFua3MgdG8gRGF2aWQgRGFuZXkuCisKKzMuMC4wIEZlYi0xNS0wOAorICAgICAgICBNYW55IGNoYW5nZXMsIG1vc3RseSB0aGFua3MgdG8gdGhlIEdDQyBwcm9qZWN0LgorCUN5Z251cyBTb2x1dGlvbnMgaXMgbm93IFJlZCBIYXQuCisKKyAgWzEwIHllYXJzIGdvIGJ5Li4uXQorCisxLjIwIE9jdC01LTk4CisJUmFmZmFlbGUgU2VuYSBwcm9kdWNlcyBBUk0gcG9ydC4KKworMS4xOSBPY3QtNS05OAorCUZpeGVkIHg4NiBsb25nIGRvdWJsZSBhbmQgbG9uZyBsb25nIHJldHVybiBzdXBwb3J0LgorCW02OGsgYnVnIGZpeGVzIGZyb20gQW5kcmVhcyBTY2h3YWIuCisJUGF0Y2ggZm9yIERVIGFzc2VtYmxlciBjb21wYXRpYmlsaXR5IGZvciB0aGUgQWxwaGEgZnJvbSBSaWNoYXJkCisJSGVuZGVyc29uLgorCisxLjE4IEFwci0xNy05OAorCUJ1ZyBmaXhlcyBhbmQgTUlQUyBjb25maWd1cmF0aW9uIGNoYW5nZXMuCisKKzEuMTcgRmViLTI0LTk4CisJQnVnIGZpeGVzIGFuZCBtNjhrIHBvcnQgZnJvbSBBbmRyZWFzIFNjaHdhYi4gUG93ZXJQQyBwb3J0IGZyb20KKwlHZW9mZnJleSBLZWF0aW5nLiBWYXJpb3VzIGJ1ZyB4ODYsIFNwYXJjIGFuZCBNSVBTIGJ1ZyBmaXhlcy4KKworMS4xNiBGZWItMTEtOTgKKwlSaWNoYXJkIEhlbmRlcnNvbiBwcm9kdWNlcyBBbHBoYSBwb3J0LgorCisxLjE1IERlYy00LTk3CisJRml4ZWQgYW4gbjMyIEFCSSBidWcuIE5ldyBsaWJ0b29sLCBhdXRvKiBzdXBwb3J0LgorCisxLjE0IE1heS0xMy05NworCWxpYnRvb2wgaXMgbm93IHVzZWQgdG8gZ2VuZXJhdGUgc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLgorCUZpeGVkIGEgbWlub3IgcG9ydGFiaWxpdHkgcHJvYmxlbSByZXBvcnRlZCBieSBSdXNzIE1jTWFudXMKKwk8bWNtYW5yQGVxLmdzLmNvbT4uCisKKzEuMTMgRGVjLTItOTYKKwlBZGRlZCAtLWVuYWJsZS1wdXJpZnktc2FmZXR5IHRvIGtlZXAgUHVyaWZ5IGZyb20gY29tcGxhaW5pbmcKKwlhYm91dCBjZXJ0YWluIGxvdyBsZXZlbCBjb2RlLgorCVNwYXJjIGZpeCBmb3IgY2FsbGluZyBmdW5jdGlvbnMgd2l0aCA8IDYgYXJncy4KKwlMaW51eCB4ODYgYS5vdXQgZml4LgorCisxLjEyIE5vdi0yMi05NgorCUFkZGVkIG1pc3NpbmcgZmZpX3R5cGVfdm9pZCwgbmVlZGVkIGZvciBzdXBwb3J0aW5nIHZvaWQgcmV0dXJuIAorCXR5cGVzLiBGaXhlZCB0ZXN0IGNhc2UgZm9yIG5vbiBNSVBTIG1hY2hpbmVzLiBDeWdudXMgU3VwcG9ydCAKKwlpcyBub3cgQ3lnbnVzIFNvbHV0aW9ucy4gCisKKzEuMTEgT2N0LTMwLTk2CisJQWRkZWQgbm90ZXMgYWJvdXQgR05VIG1ha2UuCisKKzEuMTAgT2N0LTI5LTk2CisJQWRkZWQgY29uZmlndXJhdGlvbiBmaXggZm9yIG5vbiBHTlUgY29tcGlsZXJzLgorCisxLjA5IE9jdC0yOS05NgorCUFkZGVkIC0tZW5hYmxlLWRlYnVnIGNvbmZpZ3VyZSBzd2l0Y2guIENsZWFuLXVwcyBiYXNlZCBvbiBMQ0xpbnQgCisJZmVlZGJhY2suIGZmaV9taXBzLmggaXMgYWx3YXlzIGluc3RhbGxlZC4gTWFueSBjb25maWd1cmF0aW9uIAorCWZpeGVzLiBGaXhlZCBmZml0ZXN0LmMgZm9yIHNwYXJjIGJ1aWxkcy4KKworMS4wOCBPY3QtMTUtOTYKKwlGaXhlZCBuMzIgcHJvYmxlbS4gTWFueSBjbGVhbi11cHMuCisKKzEuMDcgT2N0LTE0LTk2CisJR29yZG9uIElybGFtIHJld3JpdGVzIHY4LlMgYWdhaW4uIEJ1ZyBmaXhlcy4KKworMS4wNiBPY3QtMTQtOTYKKwlHb3Jkb24gSXJsYW0gaW1wcm92ZWQgdGhlIHNwYXJjIHBvcnQuIAorCisxLjA1IE9jdC0xNC05NgorCUludGVyZmFjZSBjaGFuZ2VzIGJhc2VkIG9uIGZlZWRiYWNrLgorCisxLjA0IE9jdC0xMS05NgorCVNwYXJjIHBvcnQgY29tcGxldGUgKG1vZHVsbyBzdHJ1Y3QgcGFzc2luZyBidWcpLgorCisxLjAzIE9jdC0xMC05NgorCVBhc3Npbmcgc3RydWN0IGFyZ3MsIGFuZCByZXR1cm5pbmcgc3RydWN0IHZhbHVlcyB3b3JrcyBmb3IKKwlhbGwgYXJjaGl0ZWN0dXJlcy9jYWxsaW5nIGNvbnZlbnRpb25zLiBFeHBhbmRlZCB0ZXN0cy4KKworMS4wMiBPY3QtOS05NgorCUFkZGVkIFNHSSBuMzIgc3VwcG9ydC4gRml4ZWQgYnVncyBpbiBib3RoIG8zMiBhbmQgTGludXggc3VwcG9ydC4KKwlBZGRlZCAibWFrZSB0ZXN0Ii4KKworMS4wMSBPY3QtOC05NgorCUZpeGVkIGZsb2F0IHBhc3NpbmcgYnVnIGluIG1pcHMgdmVyc2lvbi4gUmVzdHJ1Y3R1cmVkIHNvbWUKKwlvZiB0aGUgY29kZS4gQnVpbGRzIGNsZWFubHkgd2l0aCBTR0kgdG9vbHMuCisKKzEuMDAgT2N0LTctOTYKKwlGaXJzdCByZWxlYXNlLiBObyBwdWJsaWMgYW5ub3VuY2VtZW50LgorCisKK0F1dGhvcnMgJiBDcmVkaXRzCis9PT09PT09PT09PT09PT09PQorCitsaWJmZmkgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbnRob255IEdyZWVuIDxncmVlbkByZWRoYXQuY29tPi4KKworVGhlIGRldmVsb3BlcnMgb2YgdGhlIEdOVSBDb21waWxlciBDb2xsZWN0aW9uIHByb2plY3QgaGF2ZSBtYWRlCitpbm51bWVyYWJsZSB2YWx1YWJsZSBjb250cmlidXRpb25zLiAgU2VlIHRoZSBDaGFuZ2VMb2cgZmlsZSBmb3IKK2RldGFpbHMuCisKK1NvbWUgb2YgdGhlIGlkZWFzIGJlaGluZCBsaWJmZmkgd2VyZSBpbnNwaXJlZCBieSBHaWFubmkgTWFyaWFuaSdzIGZyZWUKK2dlbmNhbGwgbGlicmFyeSBmb3IgU2lsaWNvbiBHcmFwaGljcyBtYWNoaW5lcy4KKworVGhlIGNsb3N1cmUgbWVjaGFuaXNtIHdhcyBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgYnkgS3Jlc3RlbiBLcmFiCitUaG9ydXAuCisKK01ham9yIHByb2Nlc3NvciBhcmNoaXRlY3R1cmUgcG9ydHMgd2VyZSBjb250cmlidXRlZCBieSB0aGUgZm9sbG93aW5nCitkZXZlbG9wZXJzOgorCithbHBoYQkJUmljaGFyZCBIZW5kZXJzb24KK2FybQkJUmFmZmFlbGUgU2VuYQorY3JpcwkJU2ltb24gUG9zbmphaywgSGFucy1QZXRlciBOaWxzc29uCitmcnYJCUFudGhvbnkgR3JlZW4KK2lhNjQJCUhhbnMgQm9laG0KK20zMnIJCUthenVoaXJvIEluYW9rYQorbTY4awkJQW5kcmVhcyBTY2h3YWIKK21pcHMJCUFudGhvbnkgR3JlZW4sIENhc2V5IE1hcnNoYWxsCittaXBzNjQJCURhdmlkIERhbmV5CitwYQkJUmFuZG9scGggQ2h1bmcsIERhdmUgQW5nbGluLCBBbmRyZWFzIFRvYmxlcgorcG93ZXJwYwkJR2VvZmZyZXkgS2VhdGluZywgQW5kcmVhcyBUb2JsZXIsIAorCQkJIERhdmlkIEVkZWxzb2huLCBKb2huIEhvcm5rdmlzdAorcG93ZXJwYzY0CUpha3ViIEplbGluZWsKK3MzOTAJCUdlcmhhcmQgVG9ubiwgVWxyaWNoIFdlaWdhbmQKK3NoCQlLYXogS29qaW1hCitzaDY0CQlLYXogS29qaW1hCitzcGFyYwkJQW50aG9ueSBHcmVlbiwgR29yZG9uIElybGFtCit4ODYJCUFudGhvbnkgR3JlZW4sIEpvbiBCZW5pc3RvbgoreDg2LTY0CQlCbyBUaG9yc2VuCisKK0plc3BlciBTa292IGFuZCBBbmRyZXcgSGFsZXkgYm90aCBkaWQgbW9yZSB0aGFuIHRoZWlyIGZhaXIgc2hhcmUgb2YKK3N0ZXBwaW5nIHRocm91Z2ggdGhlIGNvZGUgYW5kIHRyYWNraW5nIGRvd24gYnVncy4KKworVGhhbmtzIGFsc28gdG8gVG9tIFRyb21leSBmb3IgYnVnIGZpeGVzLCBkb2N1bWVudGF0aW9uIGFuZAorY29uZmlndXJhdGlvbiBoZWxwLgorCitUaGFua3MgdG8gSmltIEJsYW5keSwgd2hvIHByb3ZpZGVkIHNvbWUgdXNlZnVsIGZlZWRiYWNrIG9uIHRoZSBsaWJmZmkKK2ludGVyZmFjZS4KKworQW5kcmVhcyBUb2JsZXIgaGFzIGRvbmUgYSB0cmVtZW5kb3VzIGFtb3VudCBvZiB3b3JrIG9uIHRoZSB0ZXN0c3VpdGUuCisKK0FsZXggT2xpdmEgc29sdmVkIHRoZSBleGVjdXRhYmxlIHBhZ2UgcHJvYmxlbSBmb3IgU0VsaW51eC4KKworVGhlIGxpc3QgYWJvdmUgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvbXBsZXRlIGFuZCBpbmFjY3VyYXRlLiAgSSdtCitoYXBweSB0byBtYWtlIGNvcnJlY3Rpb25zIG9yIGFkZGl0aW9ucyB1cG9uIHJlcXVlc3QuCisKK0lmIHlvdSBoYXZlIGEgcHJvYmxlbSwgb3IgaGF2ZSBmb3VuZCBhIGJ1ZywgcGxlYXNlIHNlbmQgYSBub3RlIHRvIHRoZQorYXV0aG9yIGF0IGdyZWVuQG1veGllbG9naWMuY29tLCBvciB0aGUgcHJvamVjdCBtYWlsaW5nIGxpc3QgYXQKK2xpYmZmaS1kaXNjdXNzQHNvdXJjZXdhcmUub3JnLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2FjaW5jbHVkZS5tNCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9hY2luY2x1ZGUubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4ZjhiYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9hY2luY2x1ZGUubTQKQEAgLTAsMCArMSw5MiBAQAorIyBtbWFwKDIpIGJsYWNrbGlzdGluZy4gIFNvbWUgcGxhdGZvcm1zIHByb3ZpZGUgdGhlIG1tYXAgbGlicmFyeSByb3V0aW5lCisjIGJ1dCBkb24ndCBzdXBwb3J0IGFsbCBvZiB0aGUgZmVhdHVyZXMgd2UgbmVlZCBmcm9tIGl0LgorQUNfREVGVU4oW0FDX0ZVTkNfTU1BUF9CTEFDS0xJU1RdLAorWworQUNfQ0hFQ0tfSEVBREVSKFtzeXMvbW1hbi5oXSwKKwkJW2xpYmZmaV9oZWFkZXJfc3lzX21tYW5faD15ZXNdLCBbbGliZmZpX2hlYWRlcl9zeXNfbW1hbl9oPW5vXSkKK0FDX0NIRUNLX0ZVTkMoW21tYXBdLCBbbGliZmZpX2Z1bmNfbW1hcD15ZXNdLCBbbGliZmZpX2Z1bmNfbW1hcD1ub10pCitpZiB0ZXN0ICIkbGliZmZpX2hlYWRlcl9zeXNfbW1hbl9oIiAhPSB5ZXMgXAorIHx8IHRlc3QgIiRsaWJmZmlfZnVuY19tbWFwIiAhPSB5ZXM7IHRoZW4KKyAgIGFjX2N2X2Z1bmNfbW1hcF9maWxlPW5vCisgICBhY19jdl9mdW5jX21tYXBfZGV2X3plcm89bm8KKyAgIGFjX2N2X2Z1bmNfbW1hcF9hbm9uPW5vCitlbHNlCisgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciByZWFkLW9ubHkgbW1hcCBvZiBhIHBsYWluIGZpbGUgd29ya3NdLAorICBhY19jdl9mdW5jX21tYXBfZmlsZSwKKyAgWyMgQWRkIGEgc3lzdGVtIHRvIHRoaXMgYmxhY2tsaXN0IGlmCisgICAjIG1tYXAoMCwgc3RhdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCkgZG9lc24ndCByZXR1cm4gYQorICAgIyBtZW1vcnkgYXJlYSBjb250YWluaW5nIHRoZSBzYW1lIGRhdGEgdGhhdCB5b3UnZCBnZXQgaWYgeW91IGFwcGxpZWQKKyAgICMgcmVhZCgpIHRvIHRoZSBzYW1lIGZkLiAgVGhlIG9ubHkgc3lzdGVtIGtub3duIHRvIGhhdmUgYSBwcm9ibGVtIGhlcmUKKyAgICMgaXMgVk1TLCB3aGVyZSB0ZXh0IGZpbGVzIGhhdmUgcmVjb3JkIHN0cnVjdHVyZS4KKyAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICB2bXMqIHwgdWx0cml4KikKKwlhY19jdl9mdW5jX21tYXBfZmlsZT1ubyA7OworICAgICAqKQorCWFjX2N2X2Z1bmNfbW1hcF9maWxlPXllczs7CisgICBlc2FjXSkKKyAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIG1tYXAgZnJvbSAvZGV2L3plcm8gd29ya3NdLAorICBhY19jdl9mdW5jX21tYXBfZGV2X3plcm8sCisgIFsjIEFkZCBhIHN5c3RlbSB0byB0aGlzIGJsYWNrbGlzdCBpZiBpdCBoYXMgbW1hcCgpIGJ1dCAvZGV2L3plcm8KKyAgICMgZG9lcyBub3QgZXhpc3QsIG9yIGlmIG1tYXBwaW5nIC9kZXYvemVybyBkb2VzIG5vdCBnaXZlIGFub255bW91cworICAgIyB6ZXJvZWQgcGFnZXMgd2l0aCBib3RoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICMgMS4gSWYgeW91IG1hcCBOIGNvbnNlY3V0aXZlIHBhZ2VzIGluIHdpdGggb25lIGNhbGwsIGFuZCB0aGVuCisgICAjICAgIHVubWFwIGFueSBzdWJzZXQgb2YgdGhvc2UgcGFnZXMsIHRoZSBwYWdlcyB0aGF0IHdlcmUgbm90CisgICAjICAgIGV4cGxpY2l0bHkgdW5tYXBwZWQgcmVtYWluIGFjY2Vzc2libGUuCisgICAjIDIuIElmIHlvdSBtYXAgdHdvIGFkamFjZW50IGJsb2NrcyBvZiBtZW1vcnkgYW5kIHRoZW4gdW5tYXAgdGhlbQorICAgIyAgICBib3RoIGF0IG9uY2UsIHRoZXkgbXVzdCBib3RoIGdvIGF3YXkuCisgICAjIFN5c3RlbXMga25vd24gdG8gYmUgaW4gdGhpcyBjYXRlZ29yeSBhcmUgV2luZG93cyAoYWxsIHZhcmlhbnRzKSwKKyAgICMgVk1TLCBhbmQgRGFyd2luLgorICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgIHZtcyogfCBjeWd3aW4qIHwgcGUgfCBtaW5ndyogfCBkYXJ3aW4qIHwgdWx0cml4KiB8IGhwdXgxMCogfCBocHV4MTEuMDApCisJYWNfY3ZfZnVuY19tbWFwX2Rldl96ZXJvPW5vIDs7CisgICAgICopCisJYWNfY3ZfZnVuY19tbWFwX2Rldl96ZXJvPXllczs7CisgICBlc2FjXSkKKworICAgIyBVbmxpa2UgL2Rldi96ZXJvLCB0aGUgTUFQX0FOT04oWU1PVVMpIGRlZmluZXMgY2FuIGJlIHByb2JlZCBmb3IuCisgICBBQ19DQUNIRV9DSEVDSyhbZm9yIE1BUF9BTk9OKFlNT1VTKV0sIGFjX2N2X2RlY2xfbWFwX2Fub24sCisgICAgW0FDX1RSWV9DT01QSUxFKAorWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIE1BUF9BTk9OWU1PVVMKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyBNQVBfQU5PTgorI2VuZGlmCitdLAorW2ludCBuID0gTUFQX0FOT05ZTU9VUztdLAorICAgIGFjX2N2X2RlY2xfbWFwX2Fub249eWVzLAorICAgIGFjX2N2X2RlY2xfbWFwX2Fub249bm8pXSkKKworICAgaWYgdGVzdCAkYWNfY3ZfZGVjbF9tYXBfYW5vbiA9IG5vOyB0aGVuCisgICAgIGFjX2N2X2Z1bmNfbW1hcF9hbm9uPW5vCisgICBlbHNlCisgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIG1tYXAgd2l0aCBNQVBfQU5PTihZTU9VUykgd29ya3NdLAorICAgICBhY19jdl9mdW5jX21tYXBfYW5vbiwKKyAgWyMgQWRkIGEgc3lzdGVtIHRvIHRoaXMgYmxhY2tsaXN0IGlmIGl0IGhhcyBtbWFwKCkgYW5kIE1BUF9BTk9OIG9yCisgICAjIE1BUF9BTk9OWU1PVVMsIGJ1dCB1c2luZyBtbWFwKC4uLiwgTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VUywgLTEsIDApCisgICAjIGRvZXNuJ3QgZ2l2ZSBhbm9ueW1vdXMgemVyb2VkIHBhZ2VzIHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBsaXN0ZWQKKyAgICMgYWJvdmUgZm9yIHVzZSBvZiAvZGV2L3plcm8uCisgICAjIFN5c3RlbXMga25vd24gdG8gYmUgaW4gdGhpcyBjYXRlZ29yeSBhcmUgV2luZG93cywgVk1TLCBhbmQgU0NPIFVuaXguCisgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgdm1zKiB8IGN5Z3dpbiogfCBwZSB8IG1pbmd3KiB8IHNjbyogfCB1ZGsqICkKKwlhY19jdl9mdW5jX21tYXBfYW5vbj1ubyA7OworICAgICAqKQorCWFjX2N2X2Z1bmNfbW1hcF9hbm9uPXllczs7CisgICBlc2FjXSkKKyAgIGZpCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZmlsZSA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9NTUFQX0ZJTEUsIDEsCisJICAgIFtEZWZpbmUgaWYgcmVhZC1vbmx5IG1tYXAgb2YgYSBwbGFpbiBmaWxlIHdvcmtzLl0pCitmaQoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2Rldl96ZXJvID0geWVzOyB0aGVuCisgIEFDX0RFRklORShIQVZFX01NQVBfREVWX1pFUk8sIDEsCisJICAgIFtEZWZpbmUgaWYgbW1hcCBvZiAvZGV2L3plcm8gd29ya3MuXSkKK2ZpCitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfYW5vbiA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9NTUFQX0FOT04sIDEsCisJICAgIFtEZWZpbmUgaWYgbW1hcCB3aXRoIE1BUF9BTk9OKFlNT1VTKSB3b3Jrcy5dKQorZmkKK10pCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvYWNsb2NhbC5tNCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzJjMzkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvYWNsb2NhbC5tNApAQCAtMCwwICsxLDE4NzMgQEAKKyMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjExLjEgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKKyMgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK200X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCisgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKK200X2lmKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSwgWzIuNjhdLCwKK1ttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42OC4KK1lvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIEl0IG1heSB3b3JrLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8uCitJZiB5b3UgaGF2ZSBwcm9ibGVtcywgeW91IG1heSBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS4KK1RvIGRvIHNvLCB1c2UgdGhlIHByb2NlZHVyZSBkb2N1bWVudGVkIGJ5IHRoZSBwYWNrYWdlLCB0eXBpY2FsbHkgYGF1dG9yZWNvbmYnLl0pXSkKKworIyBsdGRsLm00IC0gQ29uZmlndXJlIGx0ZGwgZm9yIHRoZSB0YXJnZXQgc3lzdGVtLiAtKi1BdXRvY29uZi0qLQorIworIyAgIENvcHlyaWdodCAoQykgMTk5OS0yMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgVGhvbWFzIFRhbm5lciwgMTk5OQorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDE4IExURExfSU5JVAorCisjIExUX0NPTkZJR19MVERMX0RJUihESVJFQ1RPUlksIFtMVERMLU1PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRElSRUNUT1JZIGNvbnRhaW5zIHRoZSBsaWJsdGRsIHNvdXJjZXMuICBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcworIyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcywgYXMgbG9uZyBhcyB0aGUgc2FtZSBESVJFQ1RPUlkgaXMgYWx3YXlzIGdpdmVuLgorQUNfREVGVU4oW0xUX0NPTkZJR19MVERMX0RJUl0sCitbQUNfQkVGT1JFKFskMF0sIFtMVERMX0lOSVRdKQorXyQwKCQqKQorXSkjIExUX0NPTkZJR19MVERMX0RJUgorCisjIFdlIGJyZWFrIHRoaXMgb3V0IGludG8gYSBzZXBhcmF0ZSBtYWNybywgc28gdGhhdCB3ZSBjYW4gY2FsbCBpdCBzYWZlbHkKKyMgaW50ZXJuYWxseSB3aXRob3V0IGJlaW5nIGNhdWdodCBhY2NpZGVudGFsbHkgYnkgdGhlIHNlZCBzY2FuIGluIGxpYnRvb2xpemUuCittNF9kZWZ1bihbX0xUX0NPTkZJR19MVERMX0RJUl0sCitbZG5sIHJlbW92ZSB0cmFpbGluZyBzbGFzaGVzCittNF9wdXNoZGVmKFtfQVJHX0RJUl0sIG00X2JwYXRzdWJzdChbJDFdLCBbLyokXSkpCittNF9jYXNlKF9MVERMX0RJUiwKKwlbXSwgW2RubCBvbmx5IHNldCBsdF9sdGRsX2RpciBpZiBfQVJHX0RJUiBpcyBub3Qgc2ltcGx5IGAuJworCSAgICAgbTRfaWYoX0FSR19ESVIsIFsuXSwKKwkgICAgICAgICAgICAgW10sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9ESVJdLCBfQVJHX0RJUikKKwkgICAgICAgICAgX0xUX1NIRUxMX0lOSVQoW2x0X2x0ZGxfZGlyPSddX0FSR19ESVJbJ10pXSldLAorICAgIFttNF9pZihfQVJHX0RJUiwgX0xURExfRElSLAorCSAgICBbXSwKKwlbbTRfZmF0YWwoW211bHRpcGxlIGxpYmx0ZGwgZGlyZWN0b3JpZXM6IGBdX0xURExfRElSWycsIGBdX0FSR19ESVJbJ10pXSldKQorbTRfcG9wZGVmKFtfQVJHX0RJUl0pCitdKSMgX0xUX0NPTkZJR19MVERMX0RJUgorCisjIEluaXRpYWxpc2U6CittNF9kZWZpbmUoW19MVERMX0RJUl0sIFtdKQorCisKKyMgX0xUX0JVSUxEX1BSRUZJWAorIyAtLS0tLS0tLS0tLS0tLS0tCisjIElmIEF1dG9jb25mIGlzIG5ldyBlbm91Z2gsIGV4cGFuZCB0byBgJHt0b3BfYnVpbGRfcHJlZml4fScsIG90aGVyd2lzZQorIyB0byBgJHt0b3BfYnVpbGRkaXJ9LycuCittNF9kZWZpbmUoW19MVF9CVUlMRF9QUkVGSVhdLAorW200X2lmZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgIFttNF9pZihtNF92ZXJzaW9uX2NvbXBhcmUobTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pLCBbMi42Ml0pLAorCSAgWy0xXSwgW200X2lmZGVmKFtfQUNfSEFWRV9UT1BfQlVJTERfUFJFRklYXSwKKwkJCSAgWyR7dG9wX2J1aWxkX3ByZWZpeH1dLAorCQkJICBbJHt0b3BfYnVpbGRkaXJ9L10pXSwKKwkgIFske3RvcF9idWlsZF9wcmVmaXh9XSldLAorICAgWyR7dG9wX2J1aWxkZGlyfS9dKVtdZG5sCitdKQorCisKKyMgTFRETF9DT05WRU5JRU5DRQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSBhbmQKKyMgTFRETElOQ0wgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcworIyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIExJQkxUREwgd2lsbCBiZSBwcmVmaXhlZCB3aXRoCisjICcke3RvcF9idWlsZF9wcmVmaXh9JyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB3aXRoICcke3RvcF9idWlsZGRpcn0vJywKKyMgYW5kIExURExJTkNMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3Bfc3JjZGlyfS8nIChub3RlIHRoZSBzaW5nbGUKKyMgcXVvdGVzISkuICBJZiB5b3VyIHBhY2thZ2UgaXMgbm90IGZsYXQgYW5kIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsCisjIGRlZmluZSB0b3BfYnVpbGRfcHJlZml4LCB0b3BfYnVpbGRkaXIsIGFuZCB0b3Bfc3JjZGlyIGFwcHJvcHJpYXRlbHkKKyMgaW4geW91ciBNYWtlZmlsZXMuCitBQ19ERUZVTihbTFRETF9DT05WRU5JRU5DRV0sCitbQUNfQkVGT1JFKFskMF0sIFtMVERMX0lOSVRdKWRubAorZG5sIEFsdGhvdWdoIHRoZSBhcmd1bWVudCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9jdW1lbnRlZCwKK2RubCBMVERMX0NPTlZFTklFTkNFIHVzZWQgdG8gdGFrZSBhIERJUkVDVE9SWSBvcmd1bWVudCwgaWYgd2UgaGF2ZSBvbmUKK2RubCBoZXJlIG1ha2Ugc3VyZSBpdCBpcyB0aGUgc2FtZSBhcyBhbnkgb3RoZXIgZGVjbGFyYXRpb24gb2YgbGlibHRkbCdzCitkbmwgbG9jYXRpb24hICBUaGlzIGFsc28gZW5zdXJlcyBsdF9sdGRsX2RpciBpcyBzZXQgd2hlbiBjb25maWd1cmUuYWMgaXMKK2RubCBub3QgeWV0IHVzaW5nIGFuIGV4cGxpY2l0IExUX0NPTkZJR19MVERMX0RJUi4KK200X2lmdmFsKFskMV0sIFtfTFRfQ09ORklHX0xURExfRElSKFskMV0pXSlkbmwKK18kMCgpCitdKSMgTFRETF9DT05WRU5JRU5DRQorCisjIEFDX0xJQkxURExfQ09OVkVOSUVOQ0UgYWNjZXB0ZWQgYSBkaXJlY3RvcnkgYXJndW1lbnQgaW4gb2xkZXIgbGlidG9vbHMsCisjIG5vdyB3ZSBoYXZlIExUX0NPTkZJR19MVERMX0RJUjoKK0FVX0RFRlVOKFtBQ19MSUJMVERMX0NPTlZFTklFTkNFXSwKK1tfTFRfQ09ORklHX0xURExfRElSKFttNF9kZWZhdWx0KFskMV0sIFtsaWJsdGRsXSldKQorX0xURExfQ09OVkVOSUVOQ0VdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQkxURExfQ09OVkVOSUVOQ0VdLCBbXSkKKworCisjIF9MVERMX0NPTlZFTklFTkNFCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIENvZGUgc2hhcmVkIGJ5IExURExfQ09OVkVOSUVOQ0UgYW5kIExURExfSU5JVChbY29udmVuaWVuY2VdKS4KK200X2RlZnVuKFtfTFRETF9DT05WRU5JRU5DRV0sCitbY2FzZSAkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UgaW4KKyAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7CisgICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKK2VzYWMKK0xJQkxUREw9J19MVF9CVUlMRF9QUkVGSVgnIiR7bHRfbHRkbF9kaXIrJGx0X2x0ZGxfZGlyL31saWJsdGRsYy5sYSIKK0xURExERVBTPSRMSUJMVERMCitMVERMSU5DTD0nLUkke3RvcF9zcmNkaXJ9JyIke2x0X2x0ZGxfZGlyKy8kbHRfbHRkbF9kaXJ9IgorCitBQ19TVUJTVChbTElCTFRETF0pCitBQ19TVUJTVChbTFRETERFUFNdKQorQUNfU1VCU1QoW0xURExJTkNMXSkKKworIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgorSU5DTFRETD0iJExURExJTkNMIgorQUNfU1VCU1QoW0lOQ0xURExdKQorXSkjIF9MVERMX0NPTlZFTklFTkNFCisKKworIyBMVERMX0lOU1RBTExBQkxFCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvciB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5CisjIGFuZCBMVERMSU5DTCB0byB0aGUgaW5jbHVkZSBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgaGVhZGVyIGFuZCBhZGRzCisjIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0byB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdAorIyBBQ19DT05GSUdfU1VCRElSUyBpcyBub3QgY2FsbGVkIGZyb20gaGVyZS4gIElmIGFuIGluc3RhbGxlZCBsaWJsdGRsCisjIGlzIG5vdCBmb3VuZCwgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX2J1aWxkX3ByZWZpeH0nIGlmCisjIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHdpdGggJyR7dG9wX2J1aWxkZGlyfS8nLCBhbmQgTFRETElOQ0wgd2lsbCBiZQorIyBwcmVmaXhlZCB3aXRoICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIKKyMgcGFja2FnZSBpcyBub3QgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZF9wcmVmaXgsCisjIHRvcF9idWlsZGRpciwgYW5kIHRvcF9zcmNkaXIgYXBwcm9wcmlhdGVseSBpbiB5b3VyIE1ha2VmaWxlcy4KKyMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgTFRfSU5JVC4KK0FDX0RFRlVOKFtMVERMX0lOU1RBTExBQkxFXSwKK1tBQ19CRUZPUkUoWyQwXSwgW0xURExfSU5JVF0pZG5sCitkbmwgQWx0aG91Z2ggdGhlIGFyZ3VtZW50IGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2N1bWVudGVkLAorZG5sIExURExfSU5TVEFMTEFCTEUgdXNlZCB0byB0YWtlIGEgRElSRUNUT1JZIG9yZ3VtZW50LCBpZiB3ZSBoYXZlIG9uZQorZG5sIGhlcmUgbWFrZSBzdXJlIGl0IGlzIHRoZSBzYW1lIGFzIGFueSBvdGhlciBkZWNsYXJhdGlvbiBvZiBsaWJsdGRsJ3MKK2RubCBsb2NhdGlvbiEgIFRoaXMgYWxzbyBlbnN1cmVzIGx0X2x0ZGxfZGlyIGlzIHNldCB3aGVuIGNvbmZpZ3VyZS5hYyBpcworZG5sIG5vdCB5ZXQgdXNpbmcgYW4gZXhwbGljaXQgTFRfQ09ORklHX0xURExfRElSLgorbTRfaWZ2YWwoWyQxXSwgW19MVF9DT05GSUdfTFRETF9ESVIoWyQxXSldKWRubAorXyQwKCkKK10pIyBMVERMX0lOU1RBTExBQkxFCisKKyMgQUNfTElCTFRETF9JTlNUQUxMQUJMRSBhY2NlcHRlZCBhIGRpcmVjdG9yeSBhcmd1bWVudCBpbiBvbGRlciBsaWJ0b29scywKKyMgbm93IHdlIGhhdmUgTFRfQ09ORklHX0xURExfRElSOgorQVVfREVGVU4oW0FDX0xJQkxURExfSU5TVEFMTEFCTEVdLAorW19MVF9DT05GSUdfTFRETF9ESVIoW200X2RlZmF1bHQoWyQxXSwgW2xpYmx0ZGxdKV0pCitfTFRETF9JTlNUQUxMQUJMRV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCTFRETF9JTlNUQUxMQUJMRV0sIFtdKQorCisKKyMgX0xURExfSU5TVEFMTEFCTEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29kZSBzaGFyZWQgYnkgTFRETF9JTlNUQUxMQUJMRSBhbmQgTFRETF9JTklUKFtpbnN0YWxsYWJsZV0pLgorbTRfZGVmdW4oW19MVERMX0lOU1RBTExBQkxFXSwKK1tpZiB0ZXN0IC1mICRwcmVmaXgvbGliL2xpYmx0ZGwubGE7IHRoZW4KKyAgbHRfc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgTERGTEFHUz0iLUwkcHJlZml4L2xpYiAkTERGTEFHUyIKKyAgQUNfQ0hFQ0tfTElCKFtsdGRsXSwgW2x0X2RsaW5pdF0sIFtsdF9saWJfbHRkbD15ZXNdKQorICBMREZMQUdTPSIkbHRfc2F2ZV9MREZMQUdTIgorICBpZiB0ZXN0IHgiJHtsdF9saWJfbHRkbC1ub30iID0geHllczsgdGhlbgorICAgIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geHllczsgdGhlbgorICAgICAgIyBEb24ndCBvdmVyd3JpdGUgJHByZWZpeC9saWIvbGlibHRkbC5sYSB3aXRob3V0IC0tZW5hYmxlLWx0ZGwtaW5zdGFsbAorICAgICAgQUNfTVNHX1dBUk4oW25vdCBvdmVyd3JpdGluZyBsaWJsdGRsIGF0ICRwcmVmaXgsIGZvcmNlIHdpdGggYC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCddKQorICAgICAgZW5hYmxlX2x0ZGxfaW5zdGFsbD1ubworICAgIGZpCisgIGVsaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHhubzsgdGhlbgorICAgIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKQorICBmaQorZmkKKworIyBJZiBjb25maWd1cmUuYWMgZGVjbGFyZWQgYW4gaW5zdGFsbGFibGUgbHRkbCwgYW5kIHRoZSB1c2VyIGRpZG4ndCBvdmVycmlkZQorIyB3aXRoIC0tZGlzYWJsZS1sdGRsLWluc3RhbGwsIHdlIHdpbGwgaW5zdGFsbCB0aGUgc2hpcHBlZCBsaWJsdGRsLgorY2FzZSAkZW5hYmxlX2x0ZGxfaW5zdGFsbCBpbgorICBubykgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGw9bm8iCisgICAgICBMSUJMVERMPSItbGx0ZGwiCisgICAgICBMVERMREVQUz0KKyAgICAgIExURExJTkNMPQorICAgICAgOzsKKyAgKikgIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCisgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIKKyAgICAgIExJQkxUREw9J19MVF9CVUlMRF9QUkVGSVgnIiR7bHRfbHRkbF9kaXIrJGx0X2x0ZGxfZGlyL31saWJsdGRsLmxhIgorICAgICAgTFRETERFUFM9JExJQkxUREwKKyAgICAgIExURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0nIiR7bHRfbHRkbF9kaXIrLyRsdF9sdGRsX2Rpcn0iCisgICAgICA7OworZXNhYworCitBQ19TVUJTVChbTElCTFRETF0pCitBQ19TVUJTVChbTFRETERFUFNdKQorQUNfU1VCU1QoW0xURExJTkNMXSkKKworIyBGb3IgYmFja3dhcmRzIG5vbi1nZXR0ZXh0IGNvbnNpc3RlbnQgY29tcGF0aWJpbGl0eS4uLgorSU5DTFRETD0iJExURExJTkNMIgorQUNfU1VCU1QoW0lOQ0xURExdKQorXSkjIExURExfSU5TVEFMTEFCTEUKKworCisjIF9MVERMX01PREVfRElTUEFUQ0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRETF9NT0RFX0RJU1BBVENIXSwKK1tkbmwgSWYgX0xURExfRElSIGlzIGAuJywgdGhlbiB3ZSBhcmUgY29uZmlndXJpbmcgbGlibHRkbCBpdHNlbGY6CittNF9pZihfTFRETF9ESVIsIFtdLAorCVtdLAorICAgIGRubCBpZiBfTFRETF9NT0RFIHdhcyBub3Qgc2V0IGFscmVhZHksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGBzdWJwcm9qZWN0JzoKKyAgICBbbTRfY2FzZShtNF9kZWZhdWx0KF9MVERMX01PREUsIFtzdWJwcm9qZWN0XSksCisJICBbc3VicHJvamVjdF0sIFtBQ19DT05GSUdfU1VCRElSUyhfTFRETF9ESVIpCisJCQkgIF9MVF9TSEVMTF9JTklUKFtsdF9kbG9wZW5fZGlyPSIkbHRfbHRkbF9kaXIiXSldLAorCSAgW25vbnJlY3Vyc2l2ZV0sIFtfTFRfU0hFTExfSU5JVChbbHRfZGxvcGVuX2Rpcj0iJGx0X2x0ZGxfZGlyIjsgbHRfbGlib2JqX3ByZWZpeD0iJGx0X2x0ZGxfZGlyLyJdKV0sCisJICBbcmVjdXJzaXZlXSwgW10sCisJW200X2ZhdGFsKFt1bmtub3duIGxpYmx0ZGwgbW9kZTogXV9MVERMX01PREUpXSldKWRubAorZG5sIEJlIGNhcmVmdWwgbm90IHRvIGV4cGFuZCB0d2ljZToKK200X2RlZmluZShbJDBdLCBbXSkKK10pIyBfTFRETF9NT0RFX0RJU1BBVENICisKKworIyBfTFRfTElCT0JKKE1PRFVMRV9OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMaWtlIEFDX0xJQk9CSiwgZXhjZXB0IHRoYXQgTU9EVUxFX05BTUUgZ29lcyBpbnRvIF9MVF9MSUJPQkpTIGluc3RlYWQKKyMgb2YgaW50byBMSUJPQkpTLgorQUNfREVGVU4oW19MVF9MSUJPQkpdLCBbCisgIG00X3BhdHRlcm5fYWxsb3coW15fTFRfTElCT0JKUyRdKQorICBfTFRfTElCT0JKUz0iJF9MVF9MSUJPQkpTICQxLiRhY19vYmpleHQiCitdKSMgX0xUX0xJQk9CSlMKKworCisjIExURExfSU5JVChbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENsaWVudHMgb2YgbGlibHRkbCBjYW4gdXNlIHRoaXMgbWFjcm8gdG8gYWxsb3cgdGhlIGluc3RhbGxlciB0bworIyBjaG9vc2UgYmV0d2VlbiBhIHNoaXBwZWQgY29weSBvZiB0aGUgbHRkbCBzb3VyY2VzIG9yIGEgcHJlaW5zdGFsbGVkCisjIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBJZiB0aGUgc2hpcHBlZCBsdGRsIHNvdXJjZXMgYXJlIG5vdCBpbiBhCisjIHN1YmRpcmVjdG9yeSBuYW1lZCBsaWJsdGRsLCB0aGUgZGlyZWN0b3J5IG5hbWUgbXVzdCBiZSBnaXZlbiBieQorIyBMVF9DT05GSUdfTFRETF9ESVIuCitBQ19ERUZVTihbTFRETF9JTklUXSwKK1tkbmwgUGFyc2UgT1BUSU9OUworX0xUX1NFVF9PUFRJT05TKFskMF0sIFskMV0pCisKK2RubCBXZSBuZWVkIHRvIGtlZXAgb3VyIG93biBsaXN0IG9mIGxpYm9ianMgc2VwYXJhdGUgZnJvbSBvdXIgcGFyZW50IHByb2plY3QsCitkbmwgYW5kIHRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGF0IGlzIHJlZGVmaW5lIHRoZSBBQ19MSUJPQkpzIG1hY3JvIHdoaWxlCitkbmwgd2UgbG9vayBmb3Igb3VyIG93biBMSUJPQkpzLgorbTRfcHVzaGRlZihbQUNfTElCT0JKXSwgbTRfZGVmbihbX0xUX0xJQk9CSl0pKQorbTRfcHVzaGRlZihbQUNfTElCU09VUkNFU10pCisKK2RubCBJZiBub3Qgb3RoZXJ3aXNlIGRlZmluZWQsIGRlZmF1bHQgdG8gdGhlIDEuNS54IGNvbXBhdGlibGUgc3VicHJvamVjdCBtb2RlOgorbTRfaWYoX0xURExfTU9ERSwgW10sCisgICAgICAgIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBtNF9kZWZhdWx0KFskMl0sIFtzdWJwcm9qZWN0XSkpCisgICAgICAgIG00X2lmKFstMV0sIFttNF9icmVnZXhwKF9MVERMX01PREUsIFtcKHN1YnByb2plY3RcfFwobm9uXCk/cmVjdXJzaXZlXCldKV0sCisgICAgICAgICAgICAgICAgW200X2ZhdGFsKFt1bmtub3duIGxpYmx0ZGwgbW9kZTogXV9MVERMX01PREUpXSldKQorCitBQ19BUkdfV0lUSChbaW5jbHVkZWRfbHRkbF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtaW5jbHVkZWQtbHRkbF0sCisgICAgICAgICAgICAgICAgICAgIFt1c2UgdGhlIEdOVSBsdGRsIHNvdXJjZXMgaW5jbHVkZWQgaGVyZV0pXSkKKworaWYgdGVzdCAieCR3aXRoX2luY2x1ZGVkX2x0ZGwiICE9IHh5ZXM7IHRoZW4KKyAgIyBXZSBhcmUgbm90IGJlaW5nIGZvcmNlZCB0byB1c2UgdGhlIGluY2x1ZGVkIGxpYmx0ZGwgc291cmNlcywgc28KKyAgIyBkZWNpZGUgd2hldGhlciB0aGVyZSBpcyBhIHVzZWZ1bCBpbnN0YWxsZWQgdmVyc2lvbiB3ZSBjYW4gdXNlLgorICBBQ19DSEVDS19IRUFERVIoW2x0ZGwuaF0sCisgICAgICBbQUNfQ0hFQ0tfREVDTChbbHRfZGxpbnRlcmZhY2VfcmVnaXN0ZXJdLAorCSAgIFtBQ19DSEVDS19MSUIoW2x0ZGxdLCBbbHRfZGxhZHZpc2VfcHJlbG9hZF0sCisJICAgICAgIFt3aXRoX2luY2x1ZGVkX2x0ZGw9bm9dLAorCSAgICAgICBbd2l0aF9pbmNsdWRlZF9sdGRsPXllc10pXSwKKwkgICBbd2l0aF9pbmNsdWRlZF9sdGRsPXllc10sCisJICAgW0FDX0lOQ0xVREVTX0RFRkFVTFQKKwkgICAgI2luY2x1ZGUgPGx0ZGwuaD5dKV0sCisgICAgICBbd2l0aF9pbmNsdWRlZF9sdGRsPXllc10sCisgICAgICBbQUNfSU5DTFVERVNfREVGQVVMVF0KKyAgKQorZmkKKworZG5sIElmIG5laXRoZXIgTFRfQ09ORklHX0xURExfRElSLCBMVERMX0NPTlZFTklFTkNFIG5vciBMVERMX0lOU1RBTExBQkxFCitkbmwgd2FzIGNhbGxlZCB5ZXQsIHRoZW4gZm9yIG9sZCB0aW1lcycgc2FrZSwgd2UgYXNzdW1lIGxpYmx0ZGwgaXMgaW4gYW4KK2RubCBlcG9ueW1vdXMgZGlyZWN0b3J5OgorQUNfUFJPVklERV9JRkVMU0UoW0xUX0NPTkZJR19MVERMX0RJUl0sIFtdLCBbX0xUX0NPTkZJR19MVERMX0RJUihbbGlibHRkbF0pXSkKKworQUNfQVJHX1dJVEgoW2x0ZGxfaW5jbHVkZV0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtbHRkbC1pbmNsdWRlPURJUl0sCisgICAgICAgICAgICAgICAgICAgIFt1c2UgdGhlIGx0ZGwgaGVhZGVycyBpbnN0YWxsZWQgaW4gRElSXSldKQorCitpZiB0ZXN0IC1uICIkd2l0aF9sdGRsX2luY2x1ZGUiOyB0aGVuCisgIGlmIHRlc3QgLWYgIiR3aXRoX2x0ZGxfaW5jbHVkZS9sdGRsLmgiOyB0aGVuIDoKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbaW52YWxpZCBsdGRsIGluY2x1ZGUgZGlyZWN0b3J5OiBgJHdpdGhfbHRkbF9pbmNsdWRlJ10pCisgIGZpCitlbHNlCisgIHdpdGhfbHRkbF9pbmNsdWRlPW5vCitmaQorCitBQ19BUkdfV0lUSChbbHRkbF9saWJdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWx0ZGwtbGliPURJUl0sCisgICAgICAgICAgICAgICAgICAgIFt1c2UgdGhlIGxpYmx0ZGwubGEgaW5zdGFsbGVkIGluIERJUl0pXSkKKworaWYgdGVzdCAtbiAiJHdpdGhfbHRkbF9saWIiOyB0aGVuCisgIGlmIHRlc3QgLWYgIiR3aXRoX2x0ZGxfbGliL2xpYmx0ZGwubGEiOyB0aGVuIDoKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbaW52YWxpZCBsdGRsIGxpYnJhcnkgZGlyZWN0b3J5OiBgJHdpdGhfbHRkbF9saWInXSkKKyAgZmkKK2Vsc2UKKyAgd2l0aF9sdGRsX2xpYj1ubworZmkKKworY2FzZSAsJHdpdGhfaW5jbHVkZWRfbHRkbCwkd2l0aF9sdGRsX2luY2x1ZGUsJHdpdGhfbHRkbF9saWIsIGluCisgICx5ZXMsbm8sbm8sKQorCW00X2Nhc2UobTRfZGVmYXVsdChfTFRETF9UWVBFLCBbY29udmVuaWVuY2VdKSwKKwkgICAgW2NvbnZlbmllbmNlXSwgW19MVERMX0NPTlZFTklFTkNFXSwKKwkgICAgW2luc3RhbGxhYmxlXSwgW19MVERMX0lOU1RBTExBQkxFXSwKKwkgIFttNF9mYXRhbChbdW5rbm93biBsaWJsdGRsIGJ1aWxkIHR5cGU6IF1fTFRETF9UWVBFKV0pCisJOzsKKyAgLG5vLG5vLG5vLCkKKwkjIElmIHRoZSBpbmNsdWRlZCBsdGRsIGlzIG5vdCB0byBiZSB1c2VkLCB0aGVuIHVzZSB0aGUKKwkjIHByZWluc3RhbGxlZCBsaWJsdGRsIHdlIGZvdW5kLgorCUFDX0RFRklORShbSEFWRV9MVERMXSwgWzFdLAorCSAgW0RlZmluZSB0aGlzIGlmIGEgbW9kZXJuIGxpYmx0ZGwgaXMgYWxyZWFkeSBpbnN0YWxsZWRdKQorCUxJQkxUREw9LWxsdGRsCisJTFRETERFUFM9CisJTFRETElOQ0w9CisJOzsKKyAgLG5vKixubywqKQorCUFDX01TR19FUlJPUihbYC0td2l0aC1sdGRsLWluY2x1ZGUnIGFuZCBgLS13aXRoLWx0ZGwtbGliJyBvcHRpb25zIG11c3QgYmUgdXNlZCB0b2dldGhlcl0pCisJOzsKKyAgKikJd2l0aF9pbmNsdWRlZF9sdGRsPW5vCisJTElCTFRETD0iLUwkd2l0aF9sdGRsX2xpYiAtbGx0ZGwiCisJTFRETERFUFM9CisJTFRETElOQ0w9Ii1JJHdpdGhfbHRkbF9pbmNsdWRlIgorCTs7Citlc2FjCitJTkNMVERMPSIkTFRETElOQ0wiCisKKyMgUmVwb3J0IG91ciBkZWNpc2lvbi4uLgorQUNfTVNHX0NIRUNLSU5HKFt3aGVyZSB0byBmaW5kIGxpYmx0ZGwgaGVhZGVyc10pCitBQ19NU0dfUkVTVUxUKFskTFRETElOQ0xdKQorQUNfTVNHX0NIRUNLSU5HKFt3aGVyZSB0byBmaW5kIGxpYmx0ZGwgbGlicmFyeV0pCitBQ19NU0dfUkVTVUxUKFskTElCTFRETF0pCisKK19MVERMX1NFVFVQCisKK2RubCByZXN0b3JlIGF1dG9jb25mIGRlZmluaXRpb24uCittNF9wb3BkZWYoW0FDX0xJQk9CSl0pCittNF9wb3BkZWYoW0FDX0xJQlNPVVJDRVNdKQorCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKFsKKyAgICBfbHRkbF9saWJvYmpzPQorICAgIF9sdGRsX2x0bGlib2Jqcz0KKyAgICBpZiB0ZXN0IC1uICIkX0xUX0xJQk9CSlMiOyB0aGVuCisgICAgICAjIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLgorICAgICAgX2x0X3NlZF9kcm9wX29iamV4dD0ncy9cLm8kLy87cy9cLm9iaiQvLycKKyAgICAgIGZvciBpIGluIGBmb3IgaSBpbiAkX0xUX0xJQk9CSlM7IGRvIGVjaG8gIiRpIjsgZG9uZSB8IHNlZCAiJF9sdF9zZWRfZHJvcF9vYmpleHQiIHwgc29ydCAtdWA7IGRvCisgICAgICAgIF9sdGRsX2xpYm9ianM9IiRfbHRkbF9saWJvYmpzICRsdF9saWJvYmpfcHJlZml4JGkuJGFjX29iamV4dCIKKyAgICAgICAgX2x0ZGxfbHRsaWJvYmpzPSIkX2x0ZGxfbHRsaWJvYmpzICRsdF9saWJvYmpfcHJlZml4JGkubG8iCisgICAgICBkb25lCisgICAgZmkKKyAgICBBQ19TVUJTVChbbHRkbF9MSUJPQkpTXSwgWyRfbHRkbF9saWJvYmpzXSkKKyAgICBBQ19TVUJTVChbbHRkbF9MVExJQk9CSlNdLCBbJF9sdGRsX2x0bGlib2Jqc10pCitdKQorCisjIE9ubHkgZXhwYW5kIG9uY2U6CittNF9kZWZpbmUoW0xURExfSU5JVF0pCitdKSMgTFRETF9JTklUCisKKyMgT2xkIG5hbWVzOgorQVVfREVGVU4oW0FDX0xJQl9MVERMXSwgW0xURExfSU5JVCgkQCldKQorQVVfREVGVU4oW0FDX1dJVEhfTFRETF0sIFtMVERMX0lOSVQoJEApXSkKK0FVX0RFRlVOKFtMVF9XSVRIX0xURExdLCBbTFRETF9JTklUKCRAKV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQl9MVERMXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX1dJVEhfTFRETF0sIFtdKQorZG5sIEFDX0RFRlVOKFtMVF9XSVRIX0xURExdLCBbXSkKKworCisjIF9MVERMX1NFVFVQCisjIC0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYWxsIHRoZSBjaGVja3MgbmVjZXNzYXJ5IGZvciBjb21waWxhdGlvbiBvZiB0aGUgbHRkbCBvYmplY3RzCisjICAtLSBpbmNsdWRpbmcgY29tcGlsZXIgY2hlY2tzIGFuZCBoZWFkZXIgY2hlY2tzLiAgVGhpcyBpcyBhIHB1YmxpYworIyBpbnRlcmZhY2UgIG1haW5seSBmb3IgdGhlIGJlbmVmaXQgb2YgbGlibHRkbCdzIG93biBjb25maWd1cmUuYWMsIG1vc3QKKyMgb3RoZXIgdXNlcnMgc2hvdWxkIGNhbGwgTFRETF9JTklUIGluc3RlYWQuCitBQ19ERUZVTihbX0xURExfU0VUVVBdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX01PRFVMRV9FWFRdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX01PRFVMRV9QQVRIXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1NZU19ETFNFQVJDSF9QQVRIXSlkbmwKK0FDX1JFUVVJUkUoW0xUX0xJQl9ETExPQURdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX1NZTUJPTF9VU0NPUkVdKWRubAorQUNfUkVRVUlSRShbTFRfRlVOQ19ETFNZTV9VU0NPUkVdKWRubAorQUNfUkVRVUlSRShbTFRfU1lTX0RMT1BFTl9ERVBMSUJTXSlkbmwKK0FDX1JFUVVJUkUoW2dsX0ZVTkNfQVJHWl0pZG5sCisKK200X3JlcXVpcmUoW19MVF9DSEVDS19PQkpESVJdKWRubAorbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfRExQUkVPUEVOXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCisKK2RubCBEb24ndCByZXF1aXJlIHRoaXMsIG9yIGl0IHdpbGwgYmUgZXhwYW5kZWQgZWFybGllciB0aGFuIHRoZSBjb2RlCitkbmwgdGhhdCBzZXRzIHRoZSB2YXJpYWJsZXMgaXQgcmVsaWVzIG9uOgorX0xUX0VOQUJMRV9JTlNUQUxMCisKK2RubCBfTFRETF9NT0RFIHNwZWNpZmljIGNvZGUgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZToKK19MVERMX01PREVfRElTUEFUQ0gKKworIyBJbiBvcmRlciB0aGF0IGx0ZGwuYyBjYW4gY29tcGlsZSwgZmluZCBvdXQgdGhlIGZpcnN0IEFDX0NPTkZJR19IRUFERVJTCisjIHRoZSB1c2VyIHVzZWQuICBUaGlzIGlzIHNvIHRoYXQgbHRkbC5oIGNhbiBwaWNrIHVwIHRoZSBwYXJlbnQgcHJvamVjdHMKKyMgY29uZmlnLmggZmlsZSwgVGhlIGZpcnN0IGZpbGUgaW4gQUNfQ09ORklHX0hFQURFUlMgbXVzdCBjb250YWluIHRoZQorIyBkZWZpbml0aW9ucyByZXF1aXJlZCBieSBsdGRsLmMuCisjIEZJWE1FOiBSZW1vdmUgdXNlIG9mIHVuZG9jdW1lbnRlZCBBQ19MSVNUX0hFQURFUlMgKDIuNTkgY29tcGF0aWJpbGl0eSkuCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKFtkbmwKK200X3BhdHRlcm5fYWxsb3coW15MVF9DT05GSUdfSCRdKWRubAorbTRfaWZzZXQoW0FIX0hFQURFUl0sCisgICAgW0xUX0NPTkZJR19IPUFIX0hFQURFUl0sCisgICAgW200X2lmc2V0KFtBQ19MSVNUX0hFQURFUlNdLAorCSAgICBbTFRfQ09ORklHX0g9YGVjaG8gIkFDX0xJU1RfSEVBREVSUyIgfCAkU0VEICdzLF5bWyAgICAgIF1dKiwsO3MsW1sgOl1dLiokLCwnYF0sCisJW10pXSldKQorQUNfU1VCU1QoW0xUX0NPTkZJR19IXSkKKworQUNfQ0hFQ0tfSEVBREVSUyhbdW5pc3RkLmggZGwuaCBzeXMvZGwuaCBkbGQuaCBtYWNoLW8vZHlsZC5oIGRpcmVudC5oXSwKKwlbXSwgW10sIFtBQ19JTkNMVURFU19ERUZBVUxUXSkKKworQUNfQ0hFQ0tfRlVOQ1MoW2Nsb3NlZGlyIG9wZW5kaXIgcmVhZGRpcl0sIFtdLCBbQUNfTElCT0JKKFtsdF9fZGlyZW50XSldKQorQUNfQ0hFQ0tfRlVOQ1MoW3N0cmxjYXQgc3RybGNweV0sIFtdLCBbQUNfTElCT0JKKFtsdF9fc3RybF0pXSkKKworbTRfcGF0dGVybl9hbGxvdyhbTFRfTElCRVhUXSlkbmwKK0FDX0RFRklORV9VTlFVT1RFRChbTFRfTElCRVhUXSxbIiRsaWJleHQiXSxbVGhlIGFyY2hpdmUgZXh0ZW5zaW9uXSkKKworbmFtZT0KK2V2YWwgImx0X2xpYnByZWZpeD1cIiRsaWJuYW1lX3NwZWNcIiIKK200X3BhdHRlcm5fYWxsb3coW0xUX0xJQlBSRUZJWF0pZG5sCitBQ19ERUZJTkVfVU5RVU9URUQoW0xUX0xJQlBSRUZJWF0sWyIkbHRfbGlicHJlZml4Il0sW1RoZSBhcmNoaXZlIHByZWZpeF0pCisKK25hbWU9bHRkbAorZXZhbCAiTFRETE9QRU49XCIkbGlibmFtZV9zcGVjXCIiCitBQ19TVUJTVChbTFRETE9QRU5dKQorXSkjIF9MVERMX1NFVFVQCisKKworIyBfTFRfRU5BQkxFX0lOU1RBTEwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9FTkFCTEVfSU5TVEFMTF0sCitbQUNfQVJHX0VOQUJMRShbbHRkbC1pbnN0YWxsXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWx0ZGwtaW5zdGFsbF0sIFtpbnN0YWxsIGxpYmx0ZGxdKV0pCisKK2Nhc2UgLCR7ZW5hYmxlX2x0ZGxfaW5zdGFsbH0sJHtlbmFibGVfbHRkbF9jb252ZW5pZW5jZX0gaW4KKyAgKnllcyopIDs7CisgICopIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcyA7OworZXNhYworCittNF9pZmRlZihbQU1fQ09ORElUSU9OQUxdLAorW0FNX0NPTkRJVElPTkFMKElOU1RBTExfTFRETCwgdGVzdCB4IiR7ZW5hYmxlX2x0ZGxfaW5zdGFsbC1ub30iICE9IHhubykKKyBBTV9DT05ESVRJT05BTChDT05WRU5JRU5DRV9MVERMLCB0ZXN0IHgiJHtlbmFibGVfbHRkbF9jb252ZW5pZW5jZS1ub30iICE9IHhubyldKQorXSkjIF9MVF9FTkFCTEVfSU5TVEFMTAorCisKKyMgTFRfU1lTX0RMT1BFTl9ERVBMSUJTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19ETE9QRU5fREVQTElCU10sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgZGVwbGlicyBhcmUgbG9hZGVkIGJ5IGRsb3Blbl0sCisgIFtsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnNdLAorICBbIyBQT1JUTUUgZG9lcyB5b3VyIHN5c3RlbSBhdXRvbWF0aWNhbGx5IGxvYWQgZGVwbGlicyBmb3IgZGxvcGVuPworICAjIG9yIGl0cyBsb2dpY2FsIGVxdWl2YWxlbnQgKGUuZy4gc2hsX2xvYWQgZm9yIEhQLVVYIDwgMTEpCisgICMgRm9yIG5vdywgd2UganVzdCBjYXRjaCBPU2VzIHdlIGtub3cgc29tZXRoaW5nIGFib3V0IC0tIGluIHRoZQorICAjIGZ1dHVyZSwgd2UnbGwgdHJ5IHRlc3QgdGhpcyBwcm9ncmFtbWF0aWNhbGx5LgorICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9dW5rbm93bgorICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqfGFpeDQuMS4qfGFpeDQuMi4qKQorICAgICMgVW5rbm93biB3aGV0aGVyIHRoaXMgaXMgdHJ1ZSBmb3IgdGhlc2UgdmVyc2lvbnMgb2YgQUlYLCBidXQKKyAgICAjIHdlIHdhbnQgdGhpcyBgY2FzZScgaGVyZSB0byBleHBsaWNpdGx5IGNhdGNoIHRob3NlIHZlcnNpb25zLgorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz11bmtub3duCisgICAgOzsKKyAgYWl4W1s0LTldXSopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGFtaWdhb3MqKQorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgcG93ZXJwYykKKyAgICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz1ubworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZGFyd2luKikKKyAgICAjIEFzc3VtaW5nIHRoZSB1c2VyIGhhcyBpbnN0YWxsZWQgYSBsaWJkbCBmcm9tIHNvbWV3aGVyZSwgdGhpcyBpcyB0cnVlCisgICAgIyBJZiB5b3UgYXJlIGxvb2tpbmcgZm9yIG9uZSBodHRwOi8vd3d3Lm9wZW5kYXJ3aW4ub3JnL3Byb2plY3RzL2RsY29tcGF0CisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9eWVzCisgICAgOzsKKyAgZ251KiB8IGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgICAjIEdOVSBhbmQgaXRzIHZhcmlhbnRzLCB1c2luZyBnbnUgbGQuc28gKEdsaWJjKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBocHV4MTAqfGhwdXgxMSopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIGludGVyaXgqKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBpcml4W1sxMjM0NV1dKnxpcml4Ni5bWzAxXV0qKQorICAgICMgQ2F0Y2ggYWxsIHZlcnNpb25zIG9mIElSSVggYmVmb3JlIDYuMiwgYW5kIGluZGljYXRlIHRoYXQgd2UgZG9uJ3QKKyAgICAjIGtub3cgaG93IGl0IHdvcmtlZCBmb3IgYW55IG9mIHRob3NlIHZlcnNpb25zLgorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz11bmtub3duCisgICAgOzsKKyAgaXJpeCopCisgICAgIyBUaGUgY2FzZSBhYm92ZSBjYXRjaGVzIGFueXRoaW5nIGJlZm9yZSA2LjIsIGFuZCBpdCdzIGtub3duIHRoYXQKKyAgICAjIGF0IDYuMiBhbmQgbGF0ZXIgZGxvcGVuIGRvZXMgbG9hZCBkZXBsaWJzLgorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBuZXRic2QqKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9eWVzCisgICAgOzsKKyAgb3NmW1sxMjM0XV0qKQorICAgICMgZGxvcGVuIGRpZCBsb2FkIGRlcGxpYnMgKGF0IGxlYXN0IGF0IDQueCksIGJ1dCB1bnRpbCB0aGUgNS54IHNlcmllcywKKyAgICAjIGl0IGRpZCAqbm90KiB1c2UgYW4gUlBBVEggaW4gYSBzaGFyZWQgbGlicmFyeSB0byBmaW5kIG9iamVjdHMgdGhlCisgICAgIyBsaWJyYXJ5IGRlcGVuZHMgb24sIHNvIHdlIGV4cGxpY2l0bHkgc2F5IGBubycuCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPW5vCisgICAgOzsKKyAgb3NmNS4wfG9zZjUuMGF8b3NmNS4xKQorICAgICMgZGxvcGVuICpkb2VzKiBsb2FkIGRlcGxpYnMgYW5kIHdpdGggdGhlIHJpZ2h0IGxvYWRlciBwYXRjaCBhcHBsaWVkCisgICAgIyBpdCBldmVuIHVzZXMgUlBBVEggaW4gYSBzaGFyZWQgbGlicmFyeSB0byBzZWFyY2ggZm9yIHNoYXJlZCBvYmplY3RzCisgICAgIyB0aGF0IHRoZSBsaWJyYXJ5IGRlcGVuZHMgb24sIGJ1dCB0aGVyZSdzIG5vIGVhc3kgd2F5IHRvIGtub3cgaWYgdGhhdAorICAgICMgcGF0Y2ggaXMgaW5zdGFsbGVkLiAgU2luY2UgdGhpcyBpcyB0aGUgY2FzZSwgYWxsIHdlIGNhbiByZWFsbHkKKyAgICAjIHNheSBpcyB1bmtub3duIC0tIGl0IGRlcGVuZHMgb24gdGhlIHBhdGNoIGJlaW5nIGluc3RhbGxlZC4gIElmCisgICAgIyBpdCBpcywgdGhpcyBjaGFuZ2VzIHRvIGB5ZXMnLiAgV2l0aG91dCBpdCwgaXQgd291bGQgYmUgYG5vJy4KKyAgICBsdF9jdl9zeXNfZGxvcGVuX2RlcGxpYnM9dW5rbm93bgorICAgIDs7CisgIG9zZiopCisgICAgIyB0aGUgdHdvIGNhc2VzIGFib3ZlIHNob3VsZCBjYXRjaCBhbGwgdmVyc2lvbnMgb2Ygb3NmIDw9IDUuMS4gIFJlYWQKKyAgICAjIHRoZSBjb21tZW50cyBhYm92ZSBmb3Igd2hhdCB3ZSBrbm93IGFib3V0IHRoZW0uCisgICAgIyBBdCA+IDUuMSwgZGVwbGlicyBhcmUgbG9hZGVkICphbmQqIGFueSBSUEFUSCBpbiBhIHNoYXJlZCBsaWJyYXJ5CisgICAgIyBpcyB1c2VkIHRvIGZpbmQgdGhlbSBzbyB3ZSBjYW4gZmluYWxseSBzYXkgYHllcycuCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIHFueCopCisgICAgbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzPXllcworICAgIDs7CisgIHNvbGFyaXMqKQorICAgIGx0X2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgICBsaWJsdGRsX2N2X3N5c19kbG9wZW5fZGVwbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIF0pCitpZiB0ZXN0ICIkbHRfY3Zfc3lzX2Rsb3Blbl9kZXBsaWJzIiAhPSB5ZXM7IHRoZW4KKyBBQ19ERUZJTkUoW0xURExfRExPUEVOX0RFUExJQlNdLCBbMV0sCisgICAgW0RlZmluZSBpZiB0aGUgT1MgbmVlZHMgaGVscCB0byBsb2FkIGRlcGVuZGVudCBsaWJyYXJpZXMgZm9yIGRsb3BlbigpLl0pCitmaQorXSkjIExUX1NZU19ETE9QRU5fREVQTElCUworCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xURExfU1lTX0RMT1BFTl9ERVBMSUJTXSwgW0xUX1NZU19ETE9QRU5fREVQTElCU10pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xURExfU1lTX0RMT1BFTl9ERVBMSUJTXSwgW10pCisKKworIyBMVF9TWVNfTU9EVUxFX0VYVAorIyAtLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19NT0RVTEVfRVhUXSwKK1ttNF9yZXF1aXJlKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFt3aGljaCBleHRlbnNpb24gaXMgdXNlZCBmb3IgcnVudGltZSBsb2FkYWJsZSBtb2R1bGVzXSwKKyAgW2xpYmx0ZGxfY3Zfc2hsaWJleHRdLAorWworbW9kdWxlPXllcworZXZhbCBsaWJsdGRsX2N2X3NobGliZXh0PSRzaHJleHRfY21kcworICBdKQoraWYgdGVzdCAtbiAiJGxpYmx0ZGxfY3Zfc2hsaWJleHQiOyB0aGVuCisgIG00X3BhdHRlcm5fYWxsb3coW0xUX01PRFVMRV9FWFRdKWRubAorICBBQ19ERUZJTkVfVU5RVU9URUQoW0xUX01PRFVMRV9FWFRdLCBbIiRsaWJsdGRsX2N2X3NobGliZXh0Il0sCisgICAgW0RlZmluZSB0byB0aGUgZXh0ZW5zaW9uIHVzZWQgZm9yIHJ1bnRpbWUgbG9hZGFibGUgbW9kdWxlcywgc2F5LCAiLnNvIi5dKQorZmkKK10pIyBMVF9TWVNfTU9EVUxFX0VYVAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xURExfU0hMSUJFWFRdLCBbTFRfU1lTX01PRFVMRV9FWFRdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MVERMX1NITElCRVhUXSwgW10pCisKKworIyBMVF9TWVNfTU9EVUxFX1BBVEgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfU1lTX01PRFVMRV9QQVRIXSwKK1ttNF9yZXF1aXJlKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFt3aGljaCB2YXJpYWJsZSBzcGVjaWZpZXMgcnVuLXRpbWUgbW9kdWxlIHNlYXJjaCBwYXRoXSwKKyAgW2x0X2N2X21vZHVsZV9wYXRoX3Zhcl0sIFtsdF9jdl9tb2R1bGVfcGF0aF92YXI9IiRzaGxpYnBhdGhfdmFyIl0pCitpZiB0ZXN0IC1uICIkbHRfY3ZfbW9kdWxlX3BhdGhfdmFyIjsgdGhlbgorICBtNF9wYXR0ZXJuX2FsbG93KFtMVF9NT0RVTEVfUEFUSF9WQVJdKWRubAorICBBQ19ERUZJTkVfVU5RVU9URUQoW0xUX01PRFVMRV9QQVRIX1ZBUl0sIFsiJGx0X2N2X21vZHVsZV9wYXRoX3ZhciJdLAorICAgIFtEZWZpbmUgdG8gdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgcnVuLXRpbWUgbW9kdWxlIHNlYXJjaCBwYXRoLl0pCitmaQorXSkjIExUX1NZU19NT0RVTEVfUEFUSAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xURExfU0hMSUJQQVRIXSwgW0xUX1NZU19NT0RVTEVfUEFUSF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xURExfU0hMSUJQQVRIXSwgW10pCisKKworIyBMVF9TWVNfRExTRUFSQ0hfUEFUSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19ETFNFQVJDSF9QQVRIXSwKK1ttNF9yZXF1aXJlKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgdGhlIGRlZmF1bHQgbGlicmFyeSBzZWFyY2ggcGF0aF0sCisgIFtsdF9jdl9zeXNfZGxzZWFyY2hfcGF0aF0sCisgIFtsdF9jdl9zeXNfZGxzZWFyY2hfcGF0aD0iJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIl0pCitpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX2Rsc2VhcmNoX3BhdGgiOyB0aGVuCisgIHN5c19kbHNlYXJjaF9wYXRoPQorICBmb3IgZGlyIGluICRsdF9jdl9zeXNfZGxzZWFyY2hfcGF0aDsgZG8KKyAgICBpZiB0ZXN0IC16ICIkc3lzX2Rsc2VhcmNoX3BhdGgiOyB0aGVuCisgICAgICBzeXNfZGxzZWFyY2hfcGF0aD0iJGRpciIKKyAgICBlbHNlCisgICAgICBzeXNfZGxzZWFyY2hfcGF0aD0iJHN5c19kbHNlYXJjaF9wYXRoJFBBVEhfU0VQQVJBVE9SJGRpciIKKyAgICBmaQorICBkb25lCisgIG00X3BhdHRlcm5fYWxsb3coW0xUX0RMU0VBUkNIX1BBVEhdKWRubAorICBBQ19ERUZJTkVfVU5RVU9URUQoW0xUX0RMU0VBUkNIX1BBVEhdLCBbIiRzeXNfZGxzZWFyY2hfcGF0aCJdLAorICAgIFtEZWZpbmUgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGguXSkKK2ZpCitdKSMgTFRfU1lTX0RMU0VBUkNIX1BBVEgKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MVERMX1NZU1NFQVJDSFBBVEhdLCBbTFRfU1lTX0RMU0VBUkNIX1BBVEhdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MVERMX1NZU1NFQVJDSFBBVEhdLCBbXSkKKworCisjIF9MVF9DSEVDS19ETFBSRU9QRU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DSEVDS19ETFBSRU9QRU5dLAorW200X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgbGlidG9vbCBzdXBwb3J0cyAtZGxvcGVuLy1kbHByZW9wZW5dLAorICBbbGlibHRkbF9jdl9wcmVsb2FkZWRfc3ltYm9sc10sCisgIFtpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgICBsaWJsdGRsX2N2X3ByZWxvYWRlZF9zeW1ib2xzPXllcworICBlbHNlCisgICAgbGlibHRkbF9jdl9wcmVsb2FkZWRfc3ltYm9scz1ubworICBmaQorICBdKQoraWYgdGVzdCB4IiRsaWJsdGRsX2N2X3ByZWxvYWRlZF9zeW1ib2xzIiA9IHh5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKFtIQVZFX1BSRUxPQURFRF9TWU1CT0xTXSwgWzFdLAorICAgIFtEZWZpbmUgaWYgbGlidG9vbCBjYW4gZXh0cmFjdCBzeW1ib2wgbGlzdHMgZnJvbSBvYmplY3QgZmlsZXMuXSkKK2ZpCitdKSMgX0xUX0NIRUNLX0RMUFJFT1BFTgorCisKKyMgTFRfTElCX0RMTE9BRAorIyAtLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfTElCX0RMTE9BRF0sCitbbTRfcGF0dGVybl9hbGxvdyhbXkxUX0RMTE9BREVSUyRdKQorTFRfRExMT0FERVJTPQorQUNfU1VCU1QoW0xUX0RMTE9BREVSU10pCisKK0FDX0xBTkdfUFVTSChbQ10pCisKK0xJQkFERF9ETE9QRU49CitBQ19TRUFSQ0hfTElCUyhbZGxvcGVuXSwgW2RsXSwKKwlbQUNfREVGSU5FKFtIQVZFX0xJQkRMXSwgWzFdLAorCQkgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsaWJkbCBsaWJyYXJ5IG9yIGVxdWl2YWxlbnQuXSkKKwlpZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2Rsb3BlbiIgIT0gIm5vbmUgcmVxdWlyZWQiIDsgdGhlbgorCSAgTElCQUREX0RMT1BFTj0iLWxkbCIKKwlmaQorCWxpYmx0ZGxfY3ZfbGliX2RsX2Rsb3Blbj0ieWVzIgorCUxUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfWRsb3Blbi5sYSJdLAorICAgIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2lmIEhBVkVfRExGQ05fSAorIyAgaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorICAgIF1dLCBbW2Rsb3BlbigwLCAwKTtdXSldLAorCSAgICBbQUNfREVGSU5FKFtIQVZFX0xJQkRMXSwgWzFdLAorCQkgICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbGliZGwgbGlicmFyeSBvciBlcXVpdmFsZW50Ll0pCisJICAgIGxpYmx0ZGxfY3ZfZnVuY19kbG9wZW49InllcyIKKwkgICAgTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99ZGxvcGVuLmxhIl0sCisJW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAorCQlbQUNfREVGSU5FKFtIQVZFX0xJQkRMXSwgWzFdLAorCQkJIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGxpYmRsIGxpYnJhcnkgb3IgZXF1aXZhbGVudC5dKQorCSAgICAgICAgTElCQUREX0RMT1BFTj0iLWxzdmxkIiBsaWJsdGRsX2N2X2Z1bmNfZGxvcGVuPSJ5ZXMiCisJCUxUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfWRsb3Blbi5sYSJdKV0pXSkKK2lmIHRlc3QgeCIkbGlibHRkbF9jdl9mdW5jX2Rsb3BlbiIgPSB4eWVzIHx8IHRlc3QgeCIkbGlibHRkbF9jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXMKK3RoZW4KKyAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKKyAgTElCUz0iJExJQlMgJExJQkFERF9ETE9QRU4iCisgIEFDX0NIRUNLX0ZVTkNTKFtkbGVycm9yXSkKKyAgTElCUz0iJGx0X3NhdmVfTElCUyIKK2ZpCitBQ19TVUJTVChbTElCQUREX0RMT1BFTl0pCisKK0xJQkFERF9TSExfTE9BRD0KK0FDX0NIRUNLX0ZVTkMoW3NobF9sb2FkXSwKKwlbQUNfREVGSU5FKFtIQVZFX1NITF9MT0FEXSwgWzFdLAorCQkgICBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaGxfbG9hZCBmdW5jdGlvbi5dKQorCUxUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfXNobF9sb2FkLmxhIl0sCisgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW3NobF9sb2FkXSwKKwkgICAgW0FDX0RFRklORShbSEFWRV9TSExfTE9BRF0sIFsxXSwKKwkJICAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNobF9sb2FkIGZ1bmN0aW9uLl0pCisJICAgIExUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfXNobF9sb2FkLmxhIgorCSAgICBMSUJBRERfU0hMX0xPQUQ9Ii1sZGxkIl0pXSkKK0FDX1NVQlNUKFtMSUJBRERfU0hMX0xPQURdKQorCitjYXNlICRob3N0X29zIGluCitkYXJ3aW5bWzE1NjddXS4qKQorIyBXZSBvbmx5IHdhbnQgdGhpcyBmb3IgcHJlLU1hYyBPUyBYIDEwLjQuCisgIEFDX0NIRUNLX0ZVTkMoW19keWxkX2Z1bmNfbG9va3VwXSwKKwlbQUNfREVGSU5FKFtIQVZFX0RZTERdLCBbMV0sCisJCSAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9keWxkX2Z1bmNfbG9va3VwIGZ1bmN0aW9uLl0pCisJTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99ZHlsZC5sYSJdKQorICA7OworYmVvcyopCisgIExUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfWxvYWRfYWRkX29uLmxhIgorICA7OworY3lnd2luKiB8IG1pbmd3KiB8IG9zMiogfCBwdzMyKikKKyAgQUNfQ0hFQ0tfREVDTFMoW2N5Z3dpbl9jb252X3BhdGhdLCBbXSwgW10sIFtbI2luY2x1ZGUgPHN5cy9jeWd3aW4uaD5dXSkKKyAgTFRfRExMT0FERVJTPSIkTFRfRExMT0FERVJTICR7bHRfZGxvcGVuX2RpciskbHRfZGxvcGVuX2Rpci99bG9hZGxpYnJhcnkubGEiCisgIDs7Citlc2FjCisKK0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKKwlbQUNfREVGSU5FKFtIQVZFX0RMRF0sIFsxXSwKKwkJICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgR05VIGRsZCBsaWJyYXJ5Ll0pCisJCUxUX0RMTE9BREVSUz0iJExUX0RMTE9BREVSUyAke2x0X2Rsb3Blbl9kaXIrJGx0X2Rsb3Blbl9kaXIvfWRsZF9saW5rLmxhIl0pCitBQ19TVUJTVChbTElCQUREX0RMRF9MSU5LXSkKKworbTRfcGF0dGVybl9hbGxvdyhbXkxUX0RMUFJFT1BFTiRdKQorTFRfRExQUkVPUEVOPQoraWYgdGVzdCAtbiAiJExUX0RMTE9BREVSUyIKK3RoZW4KKyAgZm9yIGx0X2xvYWRlciBpbiAkTFRfRExMT0FERVJTOyBkbworICAgIExUX0RMUFJFT1BFTj0iJExUX0RMUFJFT1BFTi1kbHByZW9wZW4gJGx0X2xvYWRlciAiCisgIGRvbmUKKyAgQUNfREVGSU5FKFtIQVZFX0xJQkRMTE9BREVSXSwgWzFdLAorICAgICAgICAgICAgW0RlZmluZSBpZiBsaWJkbGxvYWRlciB3aWxsIGJlIGJ1aWx0IG9uIHRoaXMgcGxhdGZvcm1dKQorZmkKK0FDX1NVQlNUKFtMVF9ETFBSRU9QRU5dKQorCitkbmwgVGhpcyBpc24ndCB1c2VkIGFueW1vcmUsIGJ1dCBzZXQgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CitMSUJBRERfREw9IiRMSUJBRERfRExPUEVOICRMSUJBRERfU0hMX0xPQUQiCitBQ19TVUJTVChbTElCQUREX0RMXSkKKworQUNfTEFOR19QT1AKK10pIyBMVF9MSUJfRExMT0FECisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTFRETF9ETExJQl0sIFtMVF9MSUJfRExMT0FEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTFRETF9ETExJQl0sIFtdKQorCisKKyMgTFRfU1lTX1NZTUJPTF9VU0NPUkUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzIHdpdGggYW4gdW5kZXJzY29yZT8KK0FDX0RFRlVOKFtMVF9TWVNfU1lNQk9MX1VTQ09SRV0sCitbbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdLAorICBbbHRfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlXSwKKyAgW2x0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubworICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgordm9pZCBubV90ZXN0X2Z1bmMoKXt9CitpbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitfTFRfRU9GCisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgorICAgICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgorICAgICAgaWYgZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgICBlbHNlCisgICAgICAgIGlmIGdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIDoKKyAgICAgICAgZWxzZQorCSAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgIGZpCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBjYXQgY29uZnRlc3QuYyA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgXSkKKyAgc3lzX3N5bWJvbF91bmRlcnNjb3JlPSRsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUKKyAgQUNfU1VCU1QoW3N5c19zeW1ib2xfdW5kZXJzY29yZV0pCitdKSMgTFRfU1lTX1NZTUJPTF9VU0NPUkUKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MVERMX1NZTUJPTF9VU0NPUkVdLCBbTFRfU1lTX1NZTUJPTF9VU0NPUkVdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MVERMX1NZTUJPTF9VU0NPUkVdLCBbXSkKKworCisjIExUX0ZVTkNfRExTWU1fVVNDT1JFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfRlVOQ19ETFNZTV9VU0NPUkVdLAorW0FDX1JFUVVJUkUoW0xUX1NZU19TWU1CT0xfVVNDT1JFXSlkbmwKK2lmIHRlc3QgeCIkbHRfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiA9IHh5ZXM7IHRoZW4KKyAgaWYgdGVzdCB4IiRsaWJsdGRsX2N2X2Z1bmNfZGxvcGVuIiA9IHh5ZXMgfHwKKyAgICAgdGVzdCB4IiRsaWJsdGRsX2N2X2xpYl9kbF9kbG9wZW4iID0geHllcyA7IHRoZW4KKwlBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB3ZSBoYXZlIHRvIGFkZCBhbiB1bmRlcnNjb3JlIGZvciBkbHN5bV0sCisJICBbbGlibHRkbF9jdl9uZWVkX3VzY29yZV0sCisJICBbbGlibHRkbF9jdl9uZWVkX3VzY29yZT11bmtub3duCisgICAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgICBMSUJTPSIkTElCUyAkTElCQUREX0RMT1BFTiIKKwkgIF9MVF9UUllfRExPUEVOX1NFTEYoCisJICAgIFtsaWJsdGRsX2N2X25lZWRfdXNjb3JlPW5vXSwgW2xpYmx0ZGxfY3ZfbmVlZF91c2NvcmU9eWVzXSwKKwkgICAgW10sCQkJCSBbbGlibHRkbF9jdl9uZWVkX3VzY29yZT1jcm9zc10pCisJICBMSUJTPSIkc2F2ZV9MSUJTIgorCV0pCisgIGZpCitmaQorCitpZiB0ZXN0IHgiJGxpYmx0ZGxfY3ZfbmVlZF91c2NvcmUiID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoW05FRURfVVNDT1JFXSwgWzFdLAorICAgIFtEZWZpbmUgaWYgZGxzeW0oKSByZXF1aXJlcyBhIGxlYWRpbmcgdW5kZXJzY29yZSBpbiBzeW1ib2wgbmFtZXMuXSkKK2ZpCitdKSMgTFRfRlVOQ19ETFNZTV9VU0NPUkUKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MVERMX0RMU1lNX1VTQ09SRV0sIFtMVF9GVU5DX0RMU1lNX1VTQ09SRV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xURExfRExTWU1fVVNDT1JFXSwgW10pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KKyMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCisjIChUaGlzIHByaXZhdGUgbWFjcm8gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGlzIGZpbGUuKQorQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLAorW2FtX19hcGlfdmVyc2lvbj0nMS4xMScKK2RubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KK2RubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCittNF9pZihbJDFdLCBbMS4xMS4xXSwgW10sCisgICAgICBbQUNfRkFUQUwoW0RvIG5vdCBjYWxsICQwLCB1c2UgQU1fSU5JVF9BVVRPTUFLRShbJDFdKS5dKV0pZG5sCitdKQorCisjIF9BTV9BVVRPQ09ORl9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGFjbG9jYWwgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZmluZCB0aGUgQXV0b2NvbmYgdmVyc2lvbi4KKyMgVGhpcyBpcyBhIHByaXZhdGUgbWFjcm8gdG9vLiAgVXNpbmcgbTRfZGVmaW5lIHNpbXBsaWZpZXMKKyMgdGhlIGxvZ2ljIGluIGFjbG9jYWwsIHdoaWNoIGNhbiBzaW1wbHkgaWdub3JlIHRoaXMgZGVmaW5pdGlvbi4KK200X2RlZmluZShbX0FNX0FVVE9DT05GX1ZFUlNJT05dLCBbXSkKKworIyBBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIGFuZCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIHRoZXkgY2FuIGJlIHRyYWNlZC4KKyMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBTV9JTklUX0FVVE9NQUtFLgorQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAorW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuMTEuMV0pZG5sCittNF9pZm5kZWYoW0FDX0FVVE9DT05GX1ZFUlNJT05dLAorICBbbTRfY29weShbbTRfUEFDS0FHRV9WRVJTSU9OXSwgW0FDX0FVVE9DT05GX1ZFUlNJT05dKV0pZG5sCitfQU1fQVVUT0NPTkZfVkVSU0lPTihtNF9kZWZuKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSkpXSkKKworIyBGaWd1cmUgb3V0IGhvdyB0byBydW4gdGhlIGFzc2VtYmxlci4gICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNQorCisjIEFNX1BST0dfQVMKKyMgLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX1BST0dfQVNdLAorWyMgQnkgZGVmYXVsdCB3ZSBzaW1wbHkgdXNlIHRoZSBDIGNvbXBpbGVyIHRvIGJ1aWxkIGFzc2VtYmx5IGNvZGUuCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK3Rlc3QgIiR7Q0NBUytzZXR9IiA9IHNldCB8fCBDQ0FTPSRDQwordGVzdCAiJHtDQ0FTRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0NBU0ZMQUdTPSRDRkxBR1MKK0FDX0FSR19WQVIoW0NDQVNdLCAgICAgIFthc3NlbWJsZXIgY29tcGlsZXIgY29tbWFuZCAoZGVmYXVsdHMgdG8gQ0MpXSkKK0FDX0FSR19WQVIoW0NDQVNGTEFHU10sIFthc3NlbWJsZXIgY29tcGlsZXIgZmxhZ3MgKGRlZmF1bHRzIHRvIENGTEFHUyldKQorX0FNX0lGX09QVElPTihbbm8tZGVwZW5kZW5jaWVzXSwsIFtfQU1fREVQRU5ERU5DSUVTKFtDQ0FTXSldKWRubAorXSkKKworIyBBTV9BVVhfRElSX0VYUEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCisjICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCisjIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCisjCisjIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKKyMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKKyMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCisjIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQorIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAorIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKKyMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KKyMKKyMgJGFjX2F1eF9kaXIvbWlzc2luZworIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCisjICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCisjICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCisjICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKKyMKKyMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKKyMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKKyMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91CisjIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCisjCisjIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAorIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKKyMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKKyMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCisjICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCisjIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCisjIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCisjIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KKyMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgorIworIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KKyMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQorIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCisKK0FDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sCitbZG5sIFJlbHkgb24gYXV0b2NvbmYgdG8gc2V0IHVwIENEUEFUSCBwcm9wZXJseS4KK0FDX1BSRVJFUShbMi41MF0pZG5sCisjIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCithbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitdKQorCisjIEFNX0NPTkRJVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDkKKworIyBBTV9DT05ESVRJT05BTChOQU1FLCBTSEVMTC1DT05ESVRJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCitBQ19ERUZVTihbQU1fQ09ORElUSU9OQUxdLAorW0FDX1BSRVJFUSgyLjUyKWRubAorIGlmZWxzZShbJDFdLCBbVFJVRV0sICBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0sCisJWyQxXSwgW0ZBTFNFXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAorQUNfU1VCU1QoWyQxX1RSVUVdKWRubAorQUNfU1VCU1QoWyQxX0ZBTFNFXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFskMV9UUlVFXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFskMV9GQUxTRV0pZG5sCittNF9kZWZpbmUoW19BTV9DT05EX1ZBTFVFXyQxXSwgWyQyXSlkbmwKK2lmICQyOyB0aGVuCisgICQxX1RSVUU9CisgICQxX0ZBTFNFPScjJworZWxzZQorICAkMV9UUlVFPScjJworICAkMV9GQUxTRT0KK2ZpCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKAorW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgorICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCitmaV0pXSkKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDkKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMTAKKworIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKKyMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCisjIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncworIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCisjIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KKworCisjIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCisjIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCisjIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCisjCisjIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcworIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgorIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCisjIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgorQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAorQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAorQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCisKK2lmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgWyQxXSwgVVBDLCAgW2RlcGNjPSIkVVBDIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIEdDSiwgIFtkZXBjYz0iJEdDSiIgIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgICAgICAgICAgICAgW2RlcGNjPSIkJDEiICAgYW1fY29tcGlsZXJfbGlzdD1dKQorCitBQ19DQUNIRV9DSEVDSyhbZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2NdLAorICAgICAgICAgICAgICAgW2FtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSwKK1tpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiBbJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnXSA8IC4vZGVwY29tcGAKKyAgZmkKKyAgYW1fX3VuaXZlcnNhbD1mYWxzZQorICBtNF9jYXNlKFskMV0sIFtDQ10sCisgICAgW2Nhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjXSwKKyAgICBbQ1hYXSwKKyAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCisgICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7CisgICAgIGVzYWNdKQorCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCisgICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgZ2NjKQorICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KKyAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCisgICAgICA7OworICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbXN2aXN1YWxjcHAgfCBtc3ZjbXN5cykKKyAgICAgICMgVGhpcyBjb21waWxlciB3b24ndCBncm9rIGAtYyAtbycsIGJ1dCBhbHNvLCB0aGUgbWludXNvIHRlc3QgaGFzCisgICAgICAjIG5vdCBydW4geWV0LiAgVGhlc2UgZGVwbW9kZXMgYXJlIGxhdGUgZW5vdWdoIGluIHRoZSBnYW1lLCBhbmQKKyAgICAgICMgc28gd2VhayB0aGF0IHRoZWlyIGZ1bmN0aW9uaW5nIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCisgICAgICBhbV9fb2JqPWNvbmZ0ZXN0LiR7T0JKRVhULW99CisgICAgICBhbV9fbWludXNfb2JqPQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PSRhbV9fb2JqIFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jICRhbV9fbWludXNfb2JqIHN1Yi9jb25mdGVzdC5jIFwKKyAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgJGFtX19vYmogc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKKyAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCisgICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCisgICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKKyAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAorICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgICAgICAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorZmkKK10pCitBQ19TVUJTVChbJDFERVBNT0RFXSwgW2RlcG1vZGU9JGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlXSkKK0FNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcCQxXSwgWworICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAorICAmJiB0ZXN0ICIkYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCitdKQorCisKKyMgQU1fU0VUX0RFUERJUgorIyAtLS0tLS0tLS0tLS0tCisjIENob29zZSBhIGRpcmVjdG9yeSBuYW1lIGZvciBkZXBlbmRlbmN5IGZpbGVzLgorIyBUaGlzIG1hY3JvIGlzIEFDX1JFUVVJUkVkIGluIF9BTV9ERVBFTkRFTkNJRVMKK0FDX0RFRlVOKFtBTV9TRVRfREVQRElSXSwKK1tBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAorQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKWRubAorXSkKKworCisjIEFNX0RFUF9UUkFDSworIyAtLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9ERVBfVFJBQ0tdLAorW0FDX0FSR19FTkFCTEUoZGVwZW5kZW5jeS10cmFja2luZywKK1sgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKKyAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQoraWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworZmkKK0FNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQorQUNfU1VCU1QoW0FNREVQQkFDS1NMQVNIXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFtBTURFUEJBQ0tTTEFTSF0pZG5sCitdKQorCisjIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyNzZXJpYWwgNQorCisjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW3sKKyAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKKyAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAorICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KKyAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCisgICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7CisgICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OworICBlc2FjCisgIHNoaWZ0CisgIGZvciBtZgorICBkbworICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKKyAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCisgICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKKyAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KKyAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKKyAgICBlbHNlCisgICAgICBjb250aW51ZQorICAgIGZpCisgICAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKKyAgICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCisgICAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQorICAgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAorICAgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQorICAgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCisgICAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKKyAgICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCisgICAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAorICAgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQorICAgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCisgICAgIyBleHBhbnNpb24uCisgICAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCisgICAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKKwkgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQorICAgICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAorICAgICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQorICAgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKKyAgICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgorICAgIGRvbmUKKyAgZG9uZQorfQorXSkjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworCisKKyMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgorIworIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCisjIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoIGAuUCcgZmlsZSB0aGF0IHdlIHdpbGwKKyMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KK0FDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCitbQUNfQ09ORklHX0NPTU1BTkRTKFtkZXBmaWxlc10sCisgICAgIFt0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorICAgICBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiIGFjX2F1eF9kaXI9IiRhY19hdXhfZGlyIl0pCitdKQorCisjIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorIyAyMDA1LCAyMDA2LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDE2CisKKyMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCisjIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCisKKyMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKKyMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQorIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCisjIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQorIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgorIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKKyMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKKyMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgorIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgorQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAorW0FDX1BSRVJFUShbMi42Ml0pZG5sCitkbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdworZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCittNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KKyAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKKyAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgorICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCisgICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAorICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKKyAgZmkKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCitBQ19TVUJTVChbQ1lHUEFUSF9XXSkKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCittNF9pZnZhbChbJDJdLAorW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKK1tfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKK2RubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgorbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCisgIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCisgQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAorIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAorCitfQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKK1tBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCisgQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAorCisjIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCitBQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAorQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAorQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQorQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKK0FNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQorQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCitBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQorQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0pZG5sCitBQ19SRVFVSVJFKFtBTV9QUk9HX01LRElSX1BdKWRubAorIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCitBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCitfQU1fSUZfT1BUSU9OKFt0YXItdXN0YXJdLCBbX0FNX1BST0dfVEFSKFt1c3Rhcl0pXSwKKwkgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKKwkJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKK19BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhDQyldLAorCQkgIFtkZWZpbmUoW0FDX1BST0dfQ0NdLAorCQkJICBkZWZuKFtBQ19QUk9HX0NDXSlbX0FNX0RFUEVOREVOQ0lFUyhDQyldKV0pZG5sCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAorCQkgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAorCQkgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwKKwkJCSAgZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKENYWCldKV0pZG5sCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19PQkpDXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0sCisJCSAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKKwkJCSAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKK10pCitfQU1fSUZfT1BUSU9OKFtzaWxlbnQtcnVsZXNdLCBbQUNfUkVRVUlSRShbQU1fU0lMRU5UX1JVTEVTXSldKWRubAorZG5sIFRoZSBgcGFyYWxsZWwtdGVzdHMnIGRyaXZlciBtYXkgbmVlZCB0byBrbm93IGFib3V0IEVYRUVYVCwgc28gYWRkIHRoZQorZG5sIGBhbV9fRVhFRVhUJyBjb25kaXRpb25hbCBpZiBfQU1fQ09NUElMRVJfRVhFRVhUIHdhcyBzZWVuLiAgVGhpcyBtYWNybworZG5sIGlzIGhvb2tlZCBvbnRvIF9BQ19DT01QSUxFUl9FWEVFWFQgZWFybHksIHNlZSBiZWxvdy4KK0FDX0NPTkZJR19DT01NQU5EU19QUkUoZG5sCitbbTRfcHJvdmlkZV9pZihbX0FNX0NPTVBJTEVSX0VYRUVYVF0sCisgIFtBTV9DT05ESVRJT05BTChbYW1fX0VYRUVYVF0sIFt0ZXN0IC1uICIkRVhFRVhUIl0pXSldKWRubAorXSkKKworZG5sIEhvb2sgaW50byBgX0FDX0NPTVBJTEVSX0VYRUVYVCcgZWFybHkgdG8gbGVhcm4gaXRzIGV4cGFuc2lvbi4gIERvIG5vdAorZG5sIGFkZCB0aGUgY29uZGl0aW9uYWwgcmlnaHQgaGVyZSwgYXMgX0FDX0NPTVBJTEVSX0VYRUVYVCBtYXkgYmUgZnVydGhlcgorZG5sIG1hbmdsZWQgYnkgQXV0b2NvbmYgYW5kIHJ1biBpbiBhIHNoZWxsIGNvbmRpdGlvbmFsIHN0YXRlbWVudC4KK200X2RlZmluZShbX0FDX0NPTVBJTEVSX0VYRUVYVF0sCittNF9kZWZuKFtfQUNfQ09NUElMRVJfRVhFRVhUXSlbbTRfcHJvdmlkZShbX0FNX0NPTVBJTEVSX0VYRUVYVF0pXSkKKworCisjIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCisjIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgorIyB0aGF0IGlzIGdlbmVyYXRlZC4gIFRoZSBzdGFtcCBmaWxlcyBhcmUgbnVtYmVyZWQgdG8gaGF2ZSBkaWZmZXJlbnQgbmFtZXMuCisKKyMgQXV0b2NvbmYgY2FsbHMgX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PSyAod2hlbiBkZWZpbmVkKSBpbiB0aGUKKyMgbG9vcCB3aGVyZSBjb25maWcuc3RhdHVzIGNyZWF0ZXMgdGhlIGhlYWRlcnMsIHNvIHdlIGNhbiBnZW5lcmF0ZQorIyBvdXIgc3RhbXAgZmlsZXMgdGhlcmUuCitBQ19ERUZVTihbX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PS10sCitbIyBDb21wdXRlICQxJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgorX2FtX2FyZz0kMQorX2FtX3N0YW1wX2NvdW50PTEKK2ZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbworICBjYXNlICRfYW1faGVhZGVyIGluCisgICAgJF9hbV9hcmcgfCAkX2FtX2FyZzoqICkKKyAgICAgIGJyZWFrIDs7CisgICAgKiApCisgICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7CisgIGVzYWMKK2RvbmUKK2VjaG8gInRpbWVzdGFtcCBmb3IgJF9hbV9hcmciID5gQVNfRElSTkFNRShbIiRfYW1fYXJnIl0pYC9zdGFtcC1oW10kX2FtX3N0YW1wX2NvdW50XSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19JTlNUQUxMX1NICisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgJGluc3RhbGxfc2guCitBQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCitpZiB0ZXN0IHgiJHtpbnN0YWxsX3NofSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAnJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCciIDs7CisgICopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL2luc3RhbGwtc2giCisgIGVzYWMKK2ZpCitBQ19TVUJTVChpbnN0YWxsX3NoKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAyCisKKyMgQ2hlY2sgd2hldGhlciB0aGUgdW5kZXJseWluZyBmaWxlLXN5c3RlbSBzdXBwb3J0cyBmaWxlbmFtZXMKKyMgd2l0aCBhIGxlYWRpbmcgZG90LiAgRm9yIGluc3RhbmNlIE1TLURPUyBkb2Vzbid0LgorQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sCitbcm0gLXJmIC50c3QgMj4vZGV2L251bGwKK21rZGlyIC50c3QgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLnRzdDsgdGhlbgorICBhbV9fbGVhZGluZ19kb3Q9LgorZWxzZQorICBhbV9fbGVhZGluZ19kb3Q9XworZmkKK3JtZGlyIC50c3QgMj4vZGV2L251bGwKK0FDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKV0pCisKKyMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLiAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMgRnJvbSBKaW0gTWV5ZXJpbmcKKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNQorCisjIEFNX01BSU5UQUlORVJfTU9ERShbREVGQVVMVC1NT0RFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb250cm9sIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzLgorIyBEZWZhdWx0IGlzIHRvIGRpc2FibGUgdGhlbSwgdW5sZXNzIGBlbmFibGUnIGlzIHBhc3NlZCBsaXRlcmFsbHkuCisjIEZvciBzeW1tZXRyeSwgYGRpc2FibGUnIG1heSBiZSBwYXNzZWQgYXMgd2VsbC4gIEFueXdheSwgdGhlIHVzZXIKKyMgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHdpdGggdGhlIC0tZW5hYmxlLy0tZGlzYWJsZSBzd2l0Y2guCitBQ19ERUZVTihbQU1fTUFJTlRBSU5FUl9NT0RFXSwKK1ttNF9jYXNlKG00X2RlZmF1bHQoWyQxXSwgW2Rpc2FibGVdKSwKKyAgICAgICBbZW5hYmxlXSwgW200X2RlZmluZShbYW1fbWFpbnRhaW5lcl9vdGhlcl0sIFtkaXNhYmxlXSldLAorICAgICAgIFtkaXNhYmxlXSwgW200X2RlZmluZShbYW1fbWFpbnRhaW5lcl9vdGhlcl0sIFtlbmFibGVdKV0sCisgICAgICAgW200X2RlZmluZShbYW1fbWFpbnRhaW5lcl9vdGhlcl0sIFtlbmFibGVdKQorICAgICAgICBtNF93YXJuKFtzeW50YXhdLCBbdW5leHBlY3RlZCBhcmd1bWVudCB0byBBTUAmdEBfTUFJTlRBSU5FUl9NT0RFOiAkMV0pXSkKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBhbV9tYWludGFpbmVyX290aGVyIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKKyAgZG5sIG1haW50YWluZXItbW9kZSdzIGRlZmF1bHQgaXMgJ2Rpc2FibGUnIHVubGVzcyAnZW5hYmxlJyBpcyBwYXNzZWQKKyAgQUNfQVJHX0VOQUJMRShbbWFpbnRhaW5lci1tb2RlXSwKK1sgIC0tXVthbV9tYWludGFpbmVyX290aGVyXVstbWFpbnRhaW5lci1tb2RlICBhbV9tYWludGFpbmVyX290aGVyIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisJCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAorICAgICAgW1VTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbF0sCisgICAgICBbVVNFX01BSU5UQUlORVJfTU9ERT1dbTRfaWYoYW1fbWFpbnRhaW5lcl9vdGhlciwgW2VuYWJsZV0sIFtub10sIFt5ZXNdKSkKKyAgQUNfTVNHX1JFU1VMVChbJFVTRV9NQUlOVEFJTkVSX01PREVdKQorICBBTV9DT05ESVRJT05BTChbTUFJTlRBSU5FUl9NT0RFXSwgW3Rlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXNdKQorICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKyAgQUNfU1VCU1QoW01BSU5UXSlkbmwKK10KKykKKworQVVfREVGVU4oW2ptX01BSU5UQUlORVJfTU9ERV0sIFtBTV9NQUlOVEFJTkVSX01PREVdKQorCisjIENoZWNrIHRvIHNlZSBob3cgJ21ha2UnIHRyZWF0cyBpbmNsdWRlcy4JICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNAorCisjIEFNX01BS0VfSU5DTFVERSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBob3cgbWFrZSB0cmVhdHMgaW5jbHVkZXMuCitBQ19ERUZVTihbQU1fTUFLRV9JTkNMVURFXSwKK1thbV9tYWtlPSR7TUFLRS1tYWtlfQorY2F0ID4gY29uZmluYyA8PCAnRU5EJworYW1fX2RvaXQ6CisJQGVjaG8gdGhpcyBpcyB0aGUgYW1fX2RvaXQgdGFyZ2V0CisuUEhPTlk6IGFtX19kb2l0CitFTkQKKyMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KK0FDX01TR19DSEVDS0lORyhbZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZV0pCithbV9faW5jbHVkZT0iIyIKK2FtX19xdW90ZT0KK19hbV9yZXN1bHQ9bm9uZQorIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2VjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKKyMgSWdub3JlIGFsbCBraW5kcyBvZiBhZGRpdGlvbmFsIG91dHB1dCBmcm9tIGBtYWtlJy4KK2Nhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCisqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKKyAgYW1fX2luY2x1ZGU9aW5jbHVkZQorICBhbV9fcXVvdGU9CisgIF9hbV9yZXN1bHQ9R05VCisgIDs7Citlc2FjCisjIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2lmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KKyAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKKyAgIGNhc2UgYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIGluICMoCisgICAqdGhlXCBhbV9fZG9pdFwgdGFyZ2V0KikKKyAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKKyAgICAgYW1fX3F1b3RlPSJcIiIKKyAgICAgX2FtX3Jlc3VsdD1CU0QKKyAgICAgOzsKKyAgIGVzYWMKK2ZpCitBQ19TVUJTVChbYW1fX2luY2x1ZGVdKQorQUNfU1VCU1QoW2FtX19xdW90ZV0pCitBQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCitybSAtZiBjb25maW5jIGNvbmZtZgorXSkKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNgorCisjIEFNX1BST0dfQ0NfQ19PCisjIC0tLS0tLS0tLS0tLS0tCisjIExpa2UgQUNfUFJPR19DQ19DX08sIGJ1dCBjaGFuZ2VkIGZvciBhdXRvbWFrZS4KK0FDX0RFRlVOKFtBTV9QUk9HX0NDX0NfT10sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ19DX09dKWRubAorQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAorQUNfUkVRVUlSRV9BVVhfRklMRShbY29tcGlsZV0pZG5sCisjIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKKyMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgorc2V0IGR1bW15ICRDQworYW1fY2M9YGVjaG8gJFsyXSB8IHNlZCBbJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nXWAKK2V2YWwgYW1fdD1cJGFjX2N2X3Byb2dfY2NfJHthbV9jY31fY19vCitpZiB0ZXN0ICIkYW1fdCIgIT0geWVzOyB0aGVuCisgICAjIExvc2luZyBjb21waWxlciwgc28gb3ZlcnJpZGUgd2l0aCB0aGUgc2NyaXB0LgorICAgIyBGSVhNRTogSXQgaXMgd3JvbmcgdG8gcmV3cml0ZSBDQy4KKyAgICMgQnV0IGlmIHdlIGRvbid0IHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSBvZiBvbmUgc29ydCBvciBhbm90aGVyLgorICAgIyBBIGxvbmdlci10ZXJtIGZpeCB3b3VsZCBiZSB0byBoYXZlIGF1dG9tYWtlIHVzZSBhbV9fQ0MgaW4gdGhpcyBjYXNlLAorICAgIyBhbmQgdGhlbiB3ZSBjb3VsZCBzZXQgYW1fX0NDPSJcJCh0b3Bfc3JjZGlyKS9jb21waWxlIFwkKENDKSIKKyAgIENDPSIkYW1fYXV4X2Rpci9jb21waWxlICRDQyIKK2ZpCitkbmwgTWFrZSBzdXJlIEFDX1BST0dfQ0MgaXMgbmV2ZXIgY2FsbGVkIGFnYWluLCBvciBpdCB3aWxsIG92ZXJyaWRlIG91cgorZG5sIHNldHRpbmcgb2YgQ0MuCittNF9kZWZpbmUoW0FDX1BST0dfQ0NdLAorICAgICAgICAgIFttNF9mYXRhbChbQUNfUFJPR19DQyBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIEFNX1BST0dfQ0NfQ19PXSldKQorXSkKKworIyBGYWtlIHRoZSBleGlzdGVuY2Ugb2YgcHJvZ3JhbXMgdGhhdCBHTlUgbWFpbnRhaW5lcnMgdXNlLiAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA2CisKKyMgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCitbQUNfUkVRVUlSRShbQU1fTUlTU0lOR19IQVNfUlVOXSkKKyQxPSR7JDEtIiR7YW1fbWlzc2luZ19ydW59JDIifQorQUNfU1VCU1QoJDEpXSkKKworCisjIEFNX01JU1NJTkdfSEFTX1JVTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIE1JU1NJTkcgaWYgbm90IGRlZmluZWQgc28gZmFyIGFuZCB0ZXN0IGlmIGl0IHN1cHBvcnRzIC0tcnVuLgorIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCitBQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCitBQ19SRVFVSVJFX0FVWF9GSUxFKFttaXNzaW5nXSlkbmwKK2lmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKKyAgKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKKyAgZXNhYworZmkKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCitmaQorXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19NS0RJUl9QCisjIC0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgYG1rZGlyIC1wJy4KK0FDX0RFRlVOKFtBTV9QUk9HX01LRElSX1BdLAorW0FDX1BSRVJFUShbMi42MF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX01LRElSX1BdKWRubAorZG5sIEF1dG9tYWtlIDEuOCB0byAxLjkuNiB1c2VkIHRvIGRlZmluZSBta2Rpcl9wLiAgV2Ugbm93IHVzZSBNS0RJUl9QLAorZG5sIHdoaWxlIGtlZXBpbmcgYSBkZWZpbml0aW9uIG9mIG1rZGlyX3AgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitkbmwgQE1LRElSX1BAIGlzIG1hZ2ljOiBBQ19PVVRQVVQgYWRqdXN0cyBpdHMgdmFsdWUgZm9yIGVhY2ggTWFrZWZpbGUuCitkbmwgSG93ZXZlciB3ZSBjYW5ub3QgZGVmaW5lIG1rZGlyX3AgYXMgJChNS0RJUl9QKSBmb3IgdGhlIHNha2Ugb2YKK2RubCBNYWtlZmlsZS5pbnMgdGhhdCBkbyBub3QgZGVmaW5lIE1LRElSX1AsIHNvIHdlIGRvIG91ciBvd24KK2RubCBhZGp1c3RtZW50IHVzaW5nIHRvcF9idWlsZGRpciAod2hpY2ggaXMgZGVmaW5lZCBtb3JlIG9mdGVuIHRoYW4KK2RubCBNS0RJUl9QKS4KK0FDX1NVQlNUKFtta2Rpcl9wXSwgWyIkTUtESVJfUCJdKWRubAorY2FzZSAkbWtkaXJfcCBpbgorICBbW1xcLyRdXSogfCA/OltbXFwvXV0qKSA7OworICAqLyopIG1rZGlyX3A9IlwkKHRvcF9idWlsZGRpcikvJG1rZGlyX3AiIDs7Citlc2FjCitdKQorCisjIEhlbHBlciBmdW5jdGlvbnMgZm9yIG9wdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA0CisKKyMgX0FNX01BTkdMRV9PUFRJT04oTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQU1fTUFOR0xFX09QVElPTl0sCitbW19BTV9PUFRJT05fXW00X2JwYXRzdWJzdCgkMSwgW1teYS16QS1aMC05X11dLCBbX10pXSkKKworIyBfQU1fU0VUX09QVElPTihOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0IG9wdGlvbiBOQU1FLiAgUHJlc2VudGx5IHRoYXQgb25seSBtZWFucyBkZWZpbmluZyBhIGZsYWcgZm9yIHRoaXMgb3B0aW9uLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIDEpXSkKKworIyBfQU1fU0VUX09QVElPTlMoT1BUSU9OUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPUFRJT05TIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgQXV0b21ha2Ugb3B0aW9ucy4KK0FDX0RFRlVOKFtfQU1fU0VUX09QVElPTlNdLAorW200X2ZvcmVhY2hfdyhbX0FNX09wdGlvbl0sIFskMV0sIFtfQU1fU0VUX09QVElPTihfQU1fT3B0aW9uKV0pXSkKKworIyBfQU1fSUZfT1BUSU9OKE9QVElPTiwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhlY3V0ZSBJRi1TRVQgaWYgT1BUSU9OIGlzIHNldCwgSUYtTk9ULVNFVCBvdGhlcndpc2UuCitBQ19ERUZVTihbX0FNX0lGX09QVElPTl0sCitbbTRfaWZzZXQoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIFskMl0sIFskM10pXSkKKworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4gICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA1CisKKyMgQU1fU0FOSVRZX0NIRUNLCisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX1NBTklUWV9DSEVDS10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBSZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMgaW4gJHNyY2RpciBvciB0aGUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkKKyMgbmFtZS4gIEFjY2VwdCBzcGFjZSBhbmQgdGFiIG9ubHkgaW4gdGhlIGxhdHRlci4KK2FtX2xmPScKKycKK2Nhc2UgYHB3ZGAgaW4KKyAgKltbXFxcIlwjXCRcJlwnXGAkYW1fbGZdXSopCisgICAgQUNfTVNHX0VSUk9SKFt1bnNhZmUgYWJzb2x1dGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZV0pOzsKK2VzYWMKK2Nhc2UgJHNyY2RpciBpbgorICAqW1tcXFwiXCNcJFwmXCdcYCRhbV9sZlwgXAldXSopCisgICAgQUNfTVNHX0VSUk9SKFt1bnNhZmUgc3JjZGlyIHZhbHVlOiBgJHNyY2RpciddKTs7Citlc2FjCisKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiRbKl0iID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZWAKKyAgIGZpCisgICBybSAtZiBjb25mdGVzdC5maWxlCisgICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCisgICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisgICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisgICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQorICAgZmkKKworICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKK2ZpCitBQ19NU0dfUkVTVUxUKHllcyldKQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAorIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKKyMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKKyMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCisjIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKKyMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQorIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCitbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2RubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKK0FDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAyCisKKyMgX0FNX1NVQlNUX05PVE1BS0UoVkFSSUFCTEUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcmV2ZW50IEF1dG9tYWtlIGZyb20gb3V0cHV0dGluZyBWQVJJQUJMRSA9IEBWQVJJQUJMRUAgaW4gTWFrZWZpbGUuaW4uCisjIFRoaXMgbWFjcm8gaXMgdHJhY2VkIGJ5IEF1dG9tYWtlLgorQUNfREVGVU4oW19BTV9TVUJTVF9OT1RNQUtFXSkKKworIyBBTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHVibGljIHNpc3RlciBvZiBfQU1fU1VCU1RfTk9UTUFLRS4KK0FDX0RFRlVOKFtBTV9TVUJTVF9OT1RNQUtFXSwgW19BTV9TVUJTVF9OT1RNQUtFKCRAKV0pCisKKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBfQU1fUFJPR19UQVIoRk9STUFUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbCBpbiBmb3JtYXQgRk9STUFULgorIyBGT1JNQVQgc2hvdWxkIGJlIG9uZSBvZiBgdjcnLCBgdXN0YXInLCBvciBgcGF4Jy4KKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3RhcikgdGhhdCBpcyBhIGNvbW1hbmQKKyMgd3JpdGluZyB0byBzdGRvdXQgYSBGT1JNQVQtdGFyYmFsbCBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkKKyMgJHRhcmRpci4KKyMgICAgIHRhcmRpcj1kaXJlY3RvcnkgJiYgJChhbV9fdGFyKSA+IHJlc3VsdC50YXIKKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3VudGFyKSB0aGF0IGV4dHJhY3Qgc3VjaAorIyBhIHRhcmJhbGwgcmVhZCBmcm9tIHN0ZGluLgorIyAgICAgJChhbV9fdW50YXIpIDwgcmVzdWx0LnRhcgorQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sCitbIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorQU1fTUlTU0lOR19QUk9HKFtBTVRBUl0sIFt0YXJdKQorbTRfaWYoWyQxXSwgW3Y3XSwKKyAgICAgW2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJ10sCisgICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCisgICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQorQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQorIyBMb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgorX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKK19hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9CisjIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKKyMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KK2ZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCitkbworICBjYXNlICRfYW1fdG9vbCBpbgorICBnbnV0YXIpCisgICAgZm9yIF9hbV90YXIgaW4gdGFyIGdudXRhciBndGFyOworICAgIGRvCisgICAgICBBTV9SVU5fTE9HKFskX2FtX3RhciAtLXZlcnNpb25dKSAmJiBicmVhaworICAgIGRvbmUKKyAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgorICAgIDs7CisgIHBsYWludGFyKQorICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCisgICAgIyB1c3RhciB0YXJiYWxsIGVpdGhlci4KKyAgICAodGFyIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxICYmIGNvbnRpbnVlCisgICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89J3RhciBjaGYgLSAiJHRhcmRpciInCisgICAgYW1fX3VudGFyPSd0YXIgeGYgLScKKyAgICA7OworICBwYXgpCisgICAgYW1fX3Rhcj0ncGF4IC1MIC14ICQxIC13ICIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCisgICAgYW1fX3VudGFyPSdwYXggLXInCisgICAgOzsKKyAgY3BpbykKKyAgICBhbV9fdGFyPSdmaW5kICIkJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKKyAgICBhbV9fdGFyXz0nZmluZCAiJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKKyAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCisgICAgOzsKKyAgbm9uZSkKKyAgICBhbV9fdGFyPWZhbHNlCisgICAgYW1fX3Rhcl89ZmFsc2UKKyAgICBhbV9fdW50YXI9ZmFsc2UKKyAgICA7OworICBlc2FjCisKKyAgIyBJZiB0aGUgdmFsdWUgd2FzIGNhY2hlZCwgc3RvcCBub3cuICBXZSBqdXN0IHdhbnRlZCB0byBoYXZlIGFtX190YXIKKyAgIyBhbmQgYW1fX3VudGFyIHNldC4KKyAgdGVzdCAtbiAiJHthbV9jdl9wcm9nX3Rhcl8kMX0iICYmIGJyZWFrCisKKyAgIyB0YXIvdW50YXIgYSBkdW1teSBkaXJlY3RvcnksIGFuZCBzdG9wIGlmIHRoZSBjb21tYW5kIHdvcmtzCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgIGVjaG8gR3JlcE1lID4gY29uZnRlc3QuZGlyL2ZpbGUKKyAgQU1fUlVOX0xPRyhbdGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyXSkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LnRhcjsgdGhlbgorICAgIEFNX1JVTl9MT0coWyRhbV9fdW50YXIgPGNvbmZ0ZXN0LnRhcl0pCisgICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCisgIGZpCitkb25lCitybSAtcmYgY29uZnRlc3QuZGlyCisKK0FDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKK0FDX01TR19SRVNVTFQoWyRhbV9jdl9wcm9nX3Rhcl8kMV0pXSkKK0FDX1NVQlNUKFthbV9fdGFyXSkKK0FDX1NVQlNUKFthbV9fdW50YXJdKQorXSkgIyBfQU1fUFJPR19UQVIKKworbTRfaW5jbHVkZShbbTQvYXhfY2NfbWF4b3B0Lm00XSkKK200X2luY2x1ZGUoW200L2F4X2NmbGFnc193YXJuX2FsbC5tNF0pCittNF9pbmNsdWRlKFttNC9heF9jaGVja19jb21waWxlcl9mbGFncy5tNF0pCittNF9pbmNsdWRlKFttNC9heF9jb21waWxlcl92ZW5kb3IubTRdKQorbTRfaW5jbHVkZShbbTQvYXhfY29uZmlndXJlX2FyZ3MubTRdKQorbTRfaW5jbHVkZShbbTQvYXhfZW5hYmxlX2J1aWxkZGlyLm00XSkKK200X2luY2x1ZGUoW200L2F4X2djY19hcmNoZmxhZy5tNF0pCittNF9pbmNsdWRlKFttNC9heF9nY2NfeDg2X2NwdWlkLm00XSkKK200X2luY2x1ZGUoW200L2xpYnRvb2wubTRdKQorbTRfaW5jbHVkZShbbTQvbHRvcHRpb25zLm00XSkKK200X2luY2x1ZGUoW200L2x0c3VnYXIubTRdKQorbTRfaW5jbHVkZShbbTQvbHR2ZXJzaW9uLm00XSkKK200X2luY2x1ZGUoW200L2x0fm9ic29sZXRlLm00XSkKK200X2luY2x1ZGUoW2FjaW5jbHVkZS5tNF0pCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvYnVpbGQtaW9zLnNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2J1aWxkLWlvcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZGVhMjQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2J1aWxkLWlvcy5zaApAQCAtMCwwICsxLDY3IEBACisjIS9iaW4vc2gKKworUExBVEZPUk1fSU9TPS9EZXZlbG9wZXIvUGxhdGZvcm1zL2lQaG9uZU9TLnBsYXRmb3JtLworUExBVEZPUk1fSU9TX1NJTT0vRGV2ZWxvcGVyL1BsYXRmb3Jtcy9pUGhvbmVTaW11bGF0b3IucGxhdGZvcm0vCitTREtfSU9TX1ZFUlNJT049IjQuMiIKK01JTl9JT1NfVkVSU0lPTj0iMy4wIgorT1VUUFVUX0RJUj0idW5pdmVyc2FsLWlvcyIKKworYnVpbGRfdGFyZ2V0ICgpIHsKKyAgICBsb2NhbCBwbGF0Zm9ybT0kMQorICAgIGxvY2FsIHNkaz0kMgorICAgIGxvY2FsIGFyY2g9JDMKKyAgICBsb2NhbCB0cmlwbGU9JDQKKyAgICBsb2NhbCBidWlsZGRpcj0kNQorCisgICAgbWtkaXIgLXAgIiR7YnVpbGRkaXJ9IgorICAgIHB1c2hkICIke2J1aWxkZGlyfSIKKyAgICBleHBvcnQgQ0M9IiR7cGxhdGZvcm19Ii9EZXZlbG9wZXIvdXNyL2Jpbi9nY2MtNC4yCisgICAgZXhwb3J0IENGTEFHUz0iLWFyY2ggJHthcmNofSAtaXN5c3Jvb3QgJHtzZGt9IC1taXBob25lb3MtdmVyc2lvbi1taW49JHtNSU5fSU9TX1ZFUlNJT059IgorICAgIC4uL2NvbmZpZ3VyZSAtLWhvc3Q9JHt0cmlwbGV9ICYmIG1ha2UKKyAgICBwb3BkCit9CisKKyMgQnVpbGQgYWxsIHRhcmdldHMKK2J1aWxkX3RhcmdldCAiJHtQTEFURk9STV9JT1N9IiAiJHtQTEFURk9STV9JT1N9L0RldmVsb3Blci9TREtzL2lQaG9uZU9TJHtTREtfSU9TX1ZFUlNJT059LnNkay8iIGFybXY2IGFybS1hcHBsZS1kYXJ3aW4xMCBhcm12Ni1pb3MKK2J1aWxkX3RhcmdldCAiJHtQTEFURk9STV9JT1N9IiAiJHtQTEFURk9STV9JT1N9L0RldmVsb3Blci9TREtzL2lQaG9uZU9TJHtTREtfSU9TX1ZFUlNJT059LnNkay8iIGFybXY3IGFybS1hcHBsZS1kYXJ3aW4xMCBhcm12Ny1pb3MKK2J1aWxkX3RhcmdldCAiJHtQTEFURk9STV9JT1NfU0lNfSIgIiR7UExBVEZPUk1fSU9TX1NJTX0vRGV2ZWxvcGVyL1NES3MvaVBob25lU2ltdWxhdG9yJHtTREtfSU9TX1ZFUlNJT059LnNkay8iIGkzODYgaTM4Ni1hcHBsZS1kYXJ3aW4xMCBpMzg2LWlvcy1zaW0KKworIyBDcmVhdGUgdW5pdmVyc2FsIG91dHB1dCBkaXJlY3RvcmllcworbWtkaXIgLXAgIiR7T1VUUFVUX0RJUn0iCitta2RpciAtcCAiJHtPVVRQVVRfRElSfS9pbmNsdWRlIgorbWtkaXIgLXAgIiR7T1VUUFVUX0RJUn0vaW5jbHVkZS9hcm12NiIKK21rZGlyIC1wICIke09VVFBVVF9ESVJ9L2luY2x1ZGUvYXJtdjciCitta2RpciAtcCAiJHtPVVRQVVRfRElSfS9pbmNsdWRlL2kzODYiCisKKyMgQ3JlYXRlIHRoZSB1bml2ZXJzYWwgYmluYXJ5CitsaXBvIC1jcmVhdGUgYXJtdjYtaW9zLy5saWJzL2xpYmZmaS5hIGFybXY3LWlvcy8ubGlicy9saWJmZmkuYSBpMzg2LWlvcy1zaW0vLmxpYnMvbGliZmZpLmEgLW91dHB1dCAiJHtPVVRQVVRfRElSfS9saWJmZmkuYSIKKworIyBDb3B5IGluIHRoZSBoZWFkZXJzCitjb3B5X2hlYWRlcnMgKCkgeworICAgIGxvY2FsIHNyYz0kMQorICAgIGxvY2FsIGRlc3Q9JDIKKworICAgICMgRml4IG5vbi1yZWxhdGl2ZSBoZWFkZXIgcmVmZXJlbmNlCisgICAgc2VkICdzLzxmZml0YXJnZXQuaD4vImZmaXRhcmdldC5oIi8nIDwgIiR7c3JjfS9pbmNsdWRlL2ZmaS5oIiA+ICIke2Rlc3R9L2ZmaS5oIgorICAgIGNwICIke3NyY30vaW5jbHVkZS9mZml0YXJnZXQuaCIgIiR7ZGVzdH0iCit9CisKK2NvcHlfaGVhZGVycyBhcm12Ni1pb3MgIiR7T1VUUFVUX0RJUn0vaW5jbHVkZS9hcm12NiIKK2NvcHlfaGVhZGVycyBhcm12Ny1pb3MgIiR7T1VUUFVUX0RJUn0vaW5jbHVkZS9hcm12NyIKK2NvcHlfaGVhZGVycyBpMzg2LWlvcy1zaW0gIiR7T1VUUFVUX0RJUn0vaW5jbHVkZS9pMzg2IgorCisjIENyZWF0ZSB0b3AtbGV2ZWwgaGVhZGVyCisoCitjYXQgPDwgRU9GCisjaWZkZWYgX19hcm1fXworICAjaW5jbHVkZSA8YXJtL2FyY2guaD4KKyAgI2lmZGVmIF9BUk1fQVJDSF82CisgICAgI2luY2x1ZGUgImluY2x1ZGUvYXJtdjYvZmZpLmgiCisgICNlbGlmIF9BUk1fQVJDSF83CisgICAgI2luY2x1ZGUgImluY2x1ZGUvYXJtdjcvZmZpLmgiCisgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyAgI2luY2x1ZGUgImluY2x1ZGUvaTM4Ni9mZmkuaCIKKyNlbmRpZgorRU9GCispID4gIiR7T1VUUFVUX0RJUn0vZmZpLmgiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvY29tcGlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9jb21waWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwMDk2YTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvY29tcGlsZQpAQCAtMCwwICsxLDE0MyBAQAorIyEgL2Jpbi9zaAorIyBXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KKworc2NyaXB0dmVyc2lvbj0yMDA5LTEwLTA2LjIwOyAjIFVUQworCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOSAgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKKyMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bworIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KKworY2FzZSAkMSBpbgorICAnJykKKyAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICAgICBleGl0IDE7CisgICAgIDs7CisgIC1oIHwgLS1oKikKKyAgICBjYXQgPDxcRU9GCitVc2FnZTogY29tcGlsZSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQorCitXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KK1JlbW92ZSBgLW8gZGVzdC5vJyBmcm9tIEFSR1MsIHJ1biBQUk9HUkFNIHdpdGggdGhlIHJlbWFpbmluZworYXJndW1lbnRzLCBhbmQgcmVuYW1lIHRoZSBvdXRwdXQgYXMgZXhwZWN0ZWQuCisKK0lmIHlvdSBhcmUgdHJ5aW5nIHRvIGJ1aWxkIGEgd2hvbGUgcGFja2FnZSB0aGlzIGlzIG5vdCB0aGUKK3JpZ2h0IHNjcmlwdCB0byBydW46IHBsZWFzZSBzdGFydCBieSByZWFkaW5nIHRoZSBmaWxlIGBJTlNUQUxMJy4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KK0VPRgorICAgIGV4aXQgJD8KKyAgICA7OworICAtdiB8IC0tdiopCisgICAgZWNobyAiY29tcGlsZSAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0ICQ/CisgICAgOzsKK2VzYWMKKworb2ZpbGU9CitjZmlsZT0KK2VhdD0KKworZm9yIGFyZworZG8KKyAgaWYgdGVzdCAtbiAiJGVhdCI7IHRoZW4KKyAgICBlYXQ9CisgIGVsc2UKKyAgICBjYXNlICQxIGluCisgICAgICAtbykKKwkjIGNvbmZpZ3VyZSBtaWdodCBjaG9vc2UgdG8gcnVuIGNvbXBpbGUgYXMgYGNvbXBpbGUgY2MgLW8gZm9vIGZvby5jJy4KKwkjIFNvIHdlIHN0cmlwIGAtbyBhcmcnIG9ubHkgaWYgYXJnIGlzIGFuIG9iamVjdC4KKwllYXQ9MQorCWNhc2UgJDIgaW4KKwkgICoubyB8ICoub2JqKQorCSAgICBvZmlsZT0kMgorCSAgICA7OworCSAgKikKKwkgICAgc2V0IHggIiRAIiAtbyAiJDIiCisJICAgIHNoaWZ0CisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqLmMpCisJY2ZpbGU9JDEKKwlzZXQgeCAiJEAiICIkMSIKKwlzaGlmdAorCTs7CisgICAgICAqKQorCXNldCB4ICIkQCIgIiQxIgorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGZpCisgIHNoaWZ0Citkb25lCisKK2lmIHRlc3QgLXogIiRvZmlsZSIgfHwgdGVzdCAteiAiJGNmaWxlIjsgdGhlbgorICAjIElmIG5vIGAtbycgb3B0aW9uIHdhcyBzZWVuIHRoZW4gd2UgbWlnaHQgaGF2ZSBiZWVuIGludm9rZWQgZnJvbSBhCisgICMgcGF0dGVybiBydWxlIHdoZXJlIHdlIGRvbid0IG5lZWQgb25lLiAgVGhhdCBpcyBvayAtLSB0aGlzIGlzIGEKKyAgIyBub3JtYWwgY29tcGlsYXRpb24gdGhhdCB0aGUgbG9zaW5nIGNvbXBpbGVyIGNhbiBoYW5kbGUuICBJZiBubworICAjIGAuYycgZmlsZSB3YXMgc2VlbiB0aGVuIHdlIGFyZSBwcm9iYWJseSBsaW5raW5nLiAgVGhhdCBpcyBhbHNvCisgICMgb2suCisgIGV4ZWMgIiRAIgorZmkKKworIyBOYW1lIG9mIGZpbGUgd2UgZXhwZWN0IGNvbXBpbGVyIHRvIGNyZWF0ZS4KK2NvZmlsZT1gZWNobyAiJGNmaWxlIiB8IHNlZCAnc3xeLipbXFwvXXx8OyBzfF5bYS16QS1aXTp8fDsgcy9cLmMkLy5vLydgCisKKyMgQ3JlYXRlIHRoZSBsb2NrIGRpcmVjdG9yeS4KKyMgTm90ZTogdXNlIGBbL1xcOi4tXScgaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIHNhbWUgbmFtZQorIyB0aGF0IHdlIGFyZSB1c2luZyBmb3IgdGhlIC5vIGZpbGUuICBBbHNvLCBiYXNlIHRoZSBuYW1lIG9uIHRoZSBleHBlY3RlZAorIyBvYmplY3QgZmlsZSBuYW1lLCBzaW5jZSB0aGF0IGlzIHdoYXQgbWF0dGVycyB3aXRoIGEgcGFyYWxsZWwgYnVpbGQuCitsb2NrZGlyPWBlY2hvICIkY29maWxlIiB8IHNlZCAtZSAnc3xbL1xcOi4tXXxffGcnYC5kCit3aGlsZSB0cnVlOyBkbworICBpZiBta2RpciAiJGxvY2tkaXIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGJyZWFrCisgIGZpCisgIHNsZWVwIDEKK2RvbmUKKyMgRklYTUU6IHJhY2UgY29uZGl0aW9uIGhlcmUgaWYgdXNlciBraWxscyBiZXR3ZWVuIG1rZGlyIGFuZCB0cmFwLgordHJhcCAicm1kaXIgJyRsb2NrZGlyJzsgZXhpdCAxIiAxIDIgMTUKKworIyBSdW4gdGhlIGNvbXBpbGUuCisiJEAiCityZXQ9JD8KKworaWYgdGVzdCAtZiAiJGNvZmlsZSI7IHRoZW4KKyAgdGVzdCAiJGNvZmlsZSIgPSAiJG9maWxlIiB8fCBtdiAiJGNvZmlsZSIgIiRvZmlsZSIKK2VsaWYgdGVzdCAtZiAiJHtjb2ZpbGV9YmoiOyB0aGVuCisgIHRlc3QgIiR7Y29maWxlfWJqIiA9ICIkb2ZpbGUiIHx8IG12ICIke2NvZmlsZX1iaiIgIiRvZmlsZSIKK2ZpCisKK3JtZGlyICIkbG9ja2RpciIKK2V4aXQgJHJldAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2NvbmZpZy5ndWVzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGM4NGM2OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNTAxIEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA5LTExLTIwJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAgUGxlYXNlIHNlbmQgcGF0Y2hlcyAoY29udGV4dAorIyBkaWZmIGZvcm1hdCkgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGFuZCBpbmNsdWRlIGEgQ2hhbmdlTG9nCisjIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAorMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKKyAgICAgICBleGl0IDEgOzsKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgJCMgIT0gMDsgdGhlbgorICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgZXhpdCAxCitmaQorCit0cmFwICdleGl0IDEnIDEgMiAxNQorCisjIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCisjIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCisjIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKKyMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KKworIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAorIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgorCisjIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCisKK3NldF9jY19mb3JfYnVpbGQ9JwordHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Cit0cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOworOiAke1RNUERJUj0vdG1wfSA7CisgeyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAorIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8CisgeyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8CisgeyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOworZHVtbXk9JHRtcC9kdW1teSA7Cit0bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKK2Nhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KKyAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKKwlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCisJICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7CisJICBmaSA7CisJZG9uZSA7CisJaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KKwkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7CisJZmkKKwk7OworICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7CisgLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OworZXNhYyA7IHNldF9jY19mb3JfYnVpbGQ9IDsnCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCisjIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgMTk5NC0wOC0yNCkKK2lmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICitmaQorCitVTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KK1VOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgorVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KK1VOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgorCisjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICAqOk5ldEJTRDoqOiopCisJIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKKwkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCAtcSBfX0VMRl9fCisJCXRoZW4KKwkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KKwkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPworCQkgICAgb3M9bmV0YnNkCisJCWVsc2UKKwkJICAgIG9zPW5ldGJzZGVsZgorCQlmaQorCQk7OworCSAgICAqKQorCSAgICAgICAgb3M9bmV0YnNkCisJCTs7CisJZXNhYworCSMgVGhlIE9TIHJlbGVhc2UKKwkjIERlYmlhbiBHTlUvTmV0QlNEIG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQgdXNlcmxhbmQsIGFuZAorCSMgdGh1cywgbmVlZCBhIGRpc3RpbmN0IHRyaXBsZXQuIEhvd2V2ZXIsIHRoZXkgZG8gbm90IG5lZWQKKwkjIGtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhCisJIyBzdWl0YWJsZSB0YWcsIGluIHRoZSBzdHlsZSBvZiBsaW51eC1nbnUuCisJY2FzZSAiJHtVTkFNRV9WRVJTSU9OfSIgaW4KKwkgICAgRGViaWFuKikKKwkJcmVsZWFzZT0nLWdudScKKwkJOzsKKwkgICAgKikKKwkJcmVsZWFzZT1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKKwkJOzsKKwllc2FjCisJIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06CisJIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06CisJIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgorCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgorCWV4aXQgOzsKKyAgICAqOk9wZW5CU0Q6KjoqKQorCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9PcGVuQlNELi8vJ2AKKwllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6ZWtrb0JTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpTb2xpZEJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc29saWRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpNaXJCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYWxwaGE6T1NGMToqOiopCisJY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgorCSo0LjApCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCisJCTs7CisJKjUuKikKKwkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCisJCTs7CisJZXNhYworCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCisJIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKKwkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCisJIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCisJQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAorCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KKwkgICAgIkVWNCAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjQuNSAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNSAoMjExNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7CisJICAgICJFVjUuNiAoMjExNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKKwkgICAgIkVWNS42ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7CisJICAgICJFVjUuNyAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OworCSAgICAiRVY2ICgyMTI2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKKwkgICAgIkVWNi43ICgyMTI2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OworCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44QUwgKDIxMjY0QikiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOENYICgyMTI2NEQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7CisJICAgICJFVjcgKDIxMzY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OworCSAgICAiRVY3LjkgKDIxMzY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7CisJZXNhYworCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCisJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCisJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KKwkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KKwkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwlleGl0IDs7CisgICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCisJIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/CisJZWNobyBhbHBoYS1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKKwllY2hvIGFscGhhLWRlYy13aW5udDMuNQorCWV4aXQgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgOzsKKyAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKKwlleGl0IDs7CisgICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCisJZXhpdCA7OworICAgICo6T1MvMzkwOio6KikKKwllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCisJZXhpdCA7OworICAgICo6ei9WTToqOiopCisJZWNobyBzMzkwLWlibS16dm1vZQorCWV4aXQgOzsKKyAgICAqOk9TNDAwOio6KikKKyAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAorCWV4aXQgOzsKKyAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCisJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKKwllY2hvIGFybS11bmtub3duLXJpc2NvcworCWV4aXQgOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQorCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKKwlleGl0IDs7CisgICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCisJIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KKwlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCisJZWxzZQorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBOSUxFKjoqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKKwllY2hvIHNwYXJjLWljbC1ueDYKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqIHwgRFJTPzYwMDA6aXNpczo0LjIqOjcqKQorCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgorCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3OyBleGl0IDs7CisJZXNhYyA7OworICAgIHMzOTB4OlN1bk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjRIOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgaTg2cGM6QXVyb3JhVVg6NS4qOiogfCBpODZ4ZW46QXVyb3JhVVg6NS4qOiopCisJZWNobyBpMzg2LXBjLWF1cm9yYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KiB8IGk4NnhlbjpTdW5PUzo1Lio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJU1VOX0FSQ0g9ImkzODYiCisJIyBJZiB0aGVyZSBpcyBhIGNvbXBpbGVyLCBzZWUgaWYgaXQgaXMgY29uZmlndXJlZCBmb3IgNjQtYml0IG9iamVjdHMuCisJIyBOb3RlIHRoYXQgdGhlIFN1biBjYyBkb2VzIG5vdCB0dXJuIF9fTFA2NF9fIGludG8gMSBsaWtlIGdjYyBkb2VzLgorCSMgVGhpcyB0ZXN0IHdvcmtzIGZvciBib3RoIGNvbXBpbGVycy4KKwlpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkgICAgaWYgKGVjaG8gJyNpZmRlZiBfX2FtZDY0JzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKKwkJZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkgICAgdGhlbgorCQlTVU5fQVJDSD0ieDg2XzY0IgorCSAgICBmaQorCWZpCisJZWNobyAke1NVTl9BUkNIfS1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJICAgIGVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJICAgIGZpCisJZWxzZQorCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwlmaQorIAlleGl0IDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCisJCXRoZW4KKwkJCWVjaG8gIiRTWVNURU1fTkFNRSIKKwkJZWxzZQorCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJCWZpCisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDs7CisgICAgKjpBSVg6KjpbNDU2XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKKwllc2FjCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisKKwkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKKwkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCisJICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6CisJICAgICMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMworCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKKworCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8CisJCWdyZXAgLXEgX19MUDY0X18KKwkgICAgdGhlbgorCQlIUF9BUkNIPSJocHBhMi4wdyIKKwkgICAgZWxzZQorCQlIUF9BUkNIPSJocHBhNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQKKwltYWluICgpCisJeworCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKKwkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0CisJICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KKwkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoY3B1KQorCQl7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKKwkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7CisJICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZXhpdCAoMCk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgOzsKKyAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCisJZWNobyBocHBhMS4xLWhwLWJzZAorCWV4aXQgOzsKKyAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1ic2QKKwlleGl0IDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCA7OworICAgIGhwOD8/Ok9TRjE6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1vc2YKKwlleGl0IDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorICAgICAgICBleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgOzsKKyAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorCWV4aXQgOzsKKyAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3BhcmMqOkJTRC9PUzoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICBwYzk4KQorCQllY2hvIGkzODYtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCWVzYWMKKwlleGl0IDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDs7CisgICAgKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjp3aW5kb3dzMzIqOiopCisgICAgCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCA7OworICAgICo6SW50ZXJpeCo6KikKKyAgICAJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHg4NikKKwkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgYXV0aGVudGljYW1kIHwgZ2VudWluZWludGVsIHwgRU02NFQpCisJCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBJQTY0KQorCQllY2hvIGlhNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJZXNhYyA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgOzsKKyAgICA4NjY0OldpbmRvd3NfTlQ6KikKKwllY2hvIHg4Nl82NC1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIC1xIGxkLnNvLjEKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXworCXRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVlYWJpCisJZmkKKwlleGl0IDs7CisgICAgYXZyMzIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyBjcmlzLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBmcnY6TGludXg6KjoqKQorICAgIAllY2hvIGZydi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwlMSUJDPWdudQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkxJQkMnYAorCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKKwlleGl0IDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG0zMnIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTY4KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG1pcHM6TGludXg6KjoqIHwgbWlwczY0OkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmICR7VU5BTUVfTUFDSElORX0KKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfWVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9JHtVTkFNRV9NQUNISU5FfWVsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkNQVSdgCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KKwk7OworICAgIG9yMzI6TGludXg6KjoqKQorCWVjaG8gb3IzMi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYWRyZTpMaW51eDoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcHBjOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAorCWV4aXQgOzsKKyAgICBzaDY0KjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHh0ZW5zYSo6TGludXg6KjoqKQorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Ok9TLzI6KjoqKQorCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CisJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKKwlleGl0IDs7CisgICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCisJZXhpdCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDs7CisgICAgaSo4NjpzeWxsYWJsZToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCisJZXhpdCA7OworICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC5bMDJdKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQorCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9CisJZmkKKwlleGl0IDs7CisgICAgaSo4NjoqOjU6WzY3OF0qKQorICAgIAkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTU4Ni4KKwkjIE5vdGU6IHdoYXRldmVyIHRoaXMgaXMsIGl0IE1VU1QgYmUgdGhlIHNhbWUgYXMgd2hhdCBjb25maWcuc3ViCisJIyBwcmludHMgZm9yIHRoZSAiZGpncHAiIGhvc3QsIG9yIGVsc2UgR0RCIGNvbmZpZ3VyeSB3aWxsIGRlY2lkZSB0aGF0CisJIyB0aGlzIGlzIGEgY3Jvc3MtYnVpbGQuCisJZWNobyBpNTg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCA7OworICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7CisgICAgTkNSKjoqOjQuMjoqIHwgTVBSQVMqOio6NC4yOiopCisJT1NfUkVMPScuMycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkgICAgJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIHB0ZXJvbiA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDs7CisgICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCisJZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LlswMl0qOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQorCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgKjpTSU5JWC0qOio6KikKKwlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0CisJZWxzZQorCQllY2hvIG5zMzJrLXNuaS1zeXN2CisJZmkKKwlleGl0IDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICAqOio6KjpGVFgqKQorCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgorCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgKjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgOzsKKyAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKKwlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KKwkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpIYWlrdToqOiopCSMgSGFpa3UgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1oYWlrdQorCWV4aXQgOzsKKyAgICBTWC00OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTY6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC03OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ny1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtODpTVVBFUi1VWDoqOiopCisJZWNobyBzeDgtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLThSOlNVUEVSLVVYOio6KikKKwllY2hvIHN4OHItbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlJoYXBzb2R5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RGFyd2luOio6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYCB8fCBVTkFNRV9QUk9DRVNTT1I9dW5rbm93bgorCWNhc2UgJFVOQU1FX1BST0NFU1NPUiBpbgorCSAgICBpMzg2KQorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCQkgIGlmIChlY2hvICcjaWZkZWYgX19MUDY0X18nOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAorCQkgICAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQkgICAgICBncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAorCQkgIHRoZW4KKwkJICAgICAgVU5BTUVfUFJPQ0VTU09SPSJ4ODZfNjQiCisJCSAgZmkKKwkJZmkgOzsKKwkgICAgdW5rbm93bikgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KKwkJVU5BTUVfUFJPQ0VTU09SPWkzODYKKwkJVU5BTUVfTUFDSElORT1wYworCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDs7CisgICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisgICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RHJhZ29uRmx5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCA7OworICAgICo6KlZNUzoqOiopCisgICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyA7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgKjpYRU5JWDoqOlN5c1YpCisJZWNobyBpMzg2LXBjLXhlbml4CisJZXhpdCA7OworICAgIGkqODY6c2t5b3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1za3lvc2BlY2hvICR7VU5BTUVfUkVMRUFTRX1gIHwgc2VkIC1lICdzLyAuKiQvLycKKwlleGl0IDs7CisgICAgaSo4NjpyZG9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcmRvcworCWV4aXQgOzsKKyAgICBpKjg2OkFST1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1hcm9zCisJZXhpdCA7OworZXNhYworCisjZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKKyNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKKworZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorY2F0ID4kZHVtbXkuYyA8PEVPRgorI2lmZGVmIF9TRVFVRU5UXworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorbWFpbiAoKQoreworI2lmIGRlZmluZWQgKHNvbnkpCisjaWYgZGVmaW5lZCAoTUlQU0VCKQorICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAorICAgICBJIGRvbid0IGtub3cuLi4uICAqLworICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCisjaWZkZWYgTkVXU09TNAorICAgICAgICAgICI0IgorI2Vsc2UKKwkgICIiCisjZW5kaWYKKyAgICAgICAgICk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9jb25maWcuc3ViIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE1NWE1MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTcwNSBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA5LTExLTIwJworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBHTlUgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDs7CisKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2Nhc2UgJCMgaW4KKyAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKKyAxKSA7OworICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICAgIGV4aXQgMTs7Citlc2FjCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWRpZXRsaWJjIHwgbGludXgtbmV3bGliKiB8IGxpbnV4LXVjbGliYyogfCBcCisgIHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKKyAga29wZW5zb2xhcmlzKi1nbnUqIHwgXAorICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5IHwgLW1pY3JvYmxhemUpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgICAgICAgIC1ibHVlZ2VuZSopCisJICAgICAgICBvcz0tY25rCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworIAktY2hvcnVzcmRiKQorIAkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisgCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzV2NiopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKKwktbWludCB8IC1taW50WzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCTE3NTBhIHwgNTgwIFwKKwl8IGEyOWsgXAorCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKKwl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAorCXwgYW0zM18yLjAgXAorCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBmaWRvIHwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCisJfCBpcDJrIHwgaXEyMDAwIFwKKwl8IGxtMzIgXAorCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCisJfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgfCBtZXAgfCBtZXRhZyBcCisJfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKKwl8IG1pcHMxNiBcCisJfCBtaXBzNjQgfCBtaXBzNjRlbCBcCisJfCBtaXBzNjRvY3Rlb24gfCBtaXBzNjRvY3Rlb25lbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0cjU5MDAgfCBtaXBzNjRyNTkwMGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAorCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbW94aWUgXAorCXwgbXQgXAorCXwgbXNwNDMwIFwKKwl8IG5pb3MgfCBuaW9zMiBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9yMzIgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKKwl8IHB5cmFtaWQgXAorCXwgcnggXAorCXwgc2NvcmUgXAorCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAorCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKKwl8IHNwdSB8IHN0cm9uZ2FybSBcCisJfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAorCXwgdWJpY29tMzIgXAorCXwgdjg1MCB8IHY4NTBlIFwKKwl8IHdlMzJrIFwKKwl8IHg4NiB8IHhjMTZ4IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrIHwgejgwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIgfCBwaWNvY2hpcCkKKwkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCW1zMSkKKwkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCisJCTs7CisKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpKjg2IHwgeDg2XzY0KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwk1ODAtKiBcCisJfCBhMjlrLSogXAorCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCisJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCisJfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKKwl8IGF2ci0qIHwgYXZyMzItKiBcCisJfCBiZmluLSogfCBiczIwMDAtKiBcCisJfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKKwl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgbG0zMi0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogfCBtZXRhZy0qIHwgbWljcm9ibGF6ZS0qIFwKKwl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKKwl8IG1pcHMxNi0qIFwKKwl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCisJfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKKwl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCisJfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAorCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKKwl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCisJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKKwl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCisJfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKKwl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCisJfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKKwl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbW1peC0qIFwKKwl8IG10LSogXAorCXwgbXNwNDMwLSogXAorCXwgbmlvcy0qIHwgbmlvczItKiBcCisJfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiB8IHBwY2JlLSogXAorCXwgcHlyYW1pZC0qIFwKKwl8IHJvbXAtKiB8IHJzNjAwMC0qIHwgcngtKiBcCisJfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzI0XWFlYi0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzY0Yi0qIHwgc3BhcmM2NHYtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKKwl8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKKwl8IHRhaG9lLSogfCB0aHVtYi0qIFwKKwl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIHwgdGlsZS0qIFwKKwl8IHRyb24tKiBcCisJfCB1Ymljb20zMi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzY2FsZWVbYmxdLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EqLSogXAorCXwgeW1wLSogXAorCXwgejhrLSogfCB6ODAtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCisJeHRlbnNhKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKyAgICAJYWJhY3VzKQorCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCisJCTs7CisJYWRvYmU2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCisJCW9zPS1zY291dAorCQk7OworCWFsbGlhbnQgfCBmeDgwKQorCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAorCQk7OworCWFsdG9zIHwgYWx0b3MzMDY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKKwkJOzsKKwlhbTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKKwkJb3M9LWJzZAorCQk7OworCWFtZDY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQk7OworCWFtZDY0LSopCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXBvbGxvNjhic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LWJzZAorCQk7OworCWFyb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tYXJvcworCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJYmxhY2tmaW4pCisJCWJhc2ljX21hY2hpbmU9YmZpbi11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCWJsYWNrZmluLSopCisJCWJhc2ljX21hY2hpbmU9YmZpbi1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwlibHVlZ2VuZSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LWNuaworCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisgICAgICAgIGNlZ2NjKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1jZWdjYworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXludikKKwkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQorCQlvcz0tdW5pY29zbXAKKwkJOzsKKwljcjE2KQorCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQorCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJY3J4KQorCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMxMAorCQk7OworCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMyMAorCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkaWNvcykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1kaWNvcworCQk7OworCWRqZ3BwKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJb3M9LW1zZG9zZGpncHAKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LW9zZgorCQk7OworCWhwcHJvKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LXByb2VsZgorCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJOzsKKyMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW02OGtub21tdSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJbTY4a25vbW11LSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKyAgICAgICAgbWljcm9ibGF6ZSkKKwkJYmFzaWNfbWFjaGluZT1taWNyb2JsYXplLXhpbGlueAorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmd3MzJjZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tbWluZ3czMmNlCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXMxLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNWVsKQorCQliYXNpY19tYWNoaW5lPXNoNWxlLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGlsZSopCisJCWJhc2ljX21hY2hpbmU9dGlsZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisgICAgICAgIC1hdXJvcmF1eCkKKwkgICAgICAgIG9zPS1hdXJvcmF1eAorCQk7OworCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCisJCTs7CisJLXNvbGFyaXMpCisJCW9zPS1zb2xhcmlzMgorCQk7OworCS1zdnI0KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXVuaXh3YXJlKikKKwkJb3M9LXN5c3Y0LjJ1dworCQk7OworCS1nbnUvbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCisJIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KKwkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KKwktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCisJICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtY25rKiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtYXVyb3JhdXgqIHwgLXNvbGFyaXMqIFwKKwkgICAgICB8IC1zeW0qIHwgLWtvcGVuc29sYXJpcyogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogfCAtYXJvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogXAorCSAgICAgIHwgLW9wZW5ic2QqIHwgLXNvbGlkYnNkKiBcCisJICAgICAgfCAtZWtrb2JzZCogfCAta2ZyZWVic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogfCAtbHlueG9zKiBcCisJICAgICAgfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAorCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKKwkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKKwkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiB8IC1jZWdjYyogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyogfCAtZXMqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktcW54KikKKwkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCQkgICAgeDg2LSogfCBpKjg2LSopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1udG8kb3MKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwktbnRvLXFueCopCisJCTs7CisJLW50byopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xudG98bnRvLXFueHwnYAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIHwgLWhhaWt1KiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eC1kaWV0bGliYykKKwkJb3M9LWxpbnV4LWRpZXRsaWJjCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisgICAgICAgIC1vczQwMCopCisJCW9zPS1vczQwMAorCQk7OworCS13aW5jZSopCisJCW9zPS13aW5jZQorCQk7OworCS1vc2Zyb3NlKikKKwkJb3M9LW9zZnJvc2UKKwkJOzsKKwktb3NmKikKKwkJb3M9LW9zZgorCQk7OworCS11dGVrKikKKwkJb3M9LWJzZAorCQk7OworCS1keW5peCopCisJCW9zPS1ic2QKKwkJOzsKKwktYWNpcyopCisJCW9zPS1hb3MKKwkJOzsKKwktYXRoZW9zKikKKwkJb3M9LWF0aGVvcworCQk7OworCS1zeWxsYWJsZSopCisJCW9zPS1zeWxsYWJsZQorCQk7OworCS0zODZic2QpCisJCW9zPS1ic2QKKwkJOzsKKwktY3RpeCogfCAtdXRzKikKKwkJb3M9LXN5c3YKKwkJOzsKKwktbm92YSopCisJCW9zPS1ydG1rLW5vdmEKKwkJOzsKKwktbnMyICkKKwkJb3M9LW5leHRzdGVwMgorCQk7OworCS1uc2sqKQorCQlvcz0tbnNrCisJCTs7CisJIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgorCS1zaW5peDUuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKKwkJOzsKKwktc2luaXgqKQorCQlvcz0tc3lzdjQKKwkJOzsKKyAgICAgICAgLXRwZiopCisJCW9zPS10cGYKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwkta2FvcyopCisJCW9zPS1rYW9zCisJCTs7CisJLXp2bW9lKQorCQlvcz0tenZtb2UKKwkJOzsKKwktZGljb3MqKQorCQlvcz0tZGljb3MKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorICAgICAgICBzY29yZS0qKQorCQlvcz0tZWxmCisJCTs7CisgICAgICAgIHNwdS0qKQorCQlvcz0tZWxmCisJCTs7CisJKi1hY29ybikKKwkJb3M9LXJpc2NpeDEuMgorCQk7OworCWFybSotcmViZWwpCisJCW9zPS1saW51eAorCQk7OworCWFybSotc2VtaSkKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICAgICAgYzR4LSogfCB0aWM0eC0qKQorICAgICAgICAJb3M9LWNvZmYKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworCXBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKKwkJIyBkZWZhdWx0LgorCQkjIG9zPS1zdW5vczQKKwkJOzsKKwltNjgqLWNpc2NvKQorCQlvcz0tYW91dAorCQk7OworICAgICAgICBtZXAtKikKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLWNpc2NvKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotKikKKwkJb3M9LWVsZgorCQk7OworCW9yMzItKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgorCQlvcz0tc3lzdjMKKwkJOzsKKwlzcGFyYy0qIHwgKi1zdW4pCisJCW9zPS1zdW5vczQuMS4xCisJCTs7CisJKi1iZSkKKwkJb3M9LWJlb3MKKwkJOzsKKwkqLWhhaWt1KQorCQlvcz0taGFpa3UKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworICAgIAkqLWtudXRoKQorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwkqLXdlYykKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkKKwkJb3M9LXByb2VsZgorCQk7OworCSotb2tpKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisJKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisJKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWNuayp8LWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1vczQwMCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvY29uZmlndXJlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzFjODNhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDE3MTkxIEBACisjISAvYmluL3NoCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OCBmb3IgbGliZmZpIDMuMC4xMC4KKyMKKyMgUmVwb3J0IGJ1Z3MgdG8gPGh0dHA6Ly9zb3VyY2V3YXJlLm9yZy9saWJmZmkuaHRtbD4uCisjCisjCisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKyMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4KKyMKKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK2lmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KKyAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisiCisgIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Cithc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KK2FzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQorCitleGl0Y29kZT0wCithc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9CitpZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6CisKK2Vsc2UKKyAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMSIKKyAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KKyAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTworICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCisKKyAgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cJHtCQVNIX1ZFUlNJT04rc2V0fVwiIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKyAgICBFQ0hPPVwkRUNIT1wkRUNIT1wkRUNIT1wkRUNIT1wkRUNITworICAgIEVDSE89XCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPXCRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgXCJYXGBwcmludGYgJXMgXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiIFxcCisgICAgICB8fCB0ZXN0IFwiWFxgcHJpbnQgLXIgLS0gXCRFQ0hPXGBcIiA9IFwiWFwkRUNIT1wiICkgfHwgZXhpdCAxCit0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKKyAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKyAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorCitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2ZvdW5kPWZhbHNlCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGFzX2ZvdW5kPToKKyAgY2FzZSAkYXNfZGlyIGluICMoCisJIC8qKQorCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KKwkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCisJCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGJyZWFrIDIKK2ZpCitmaQorCSAgIGRvbmU7OworICAgICAgIGVzYWMKKyAgYXNfZm91bmQ9ZmFsc2UKK2RvbmUKKyRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcworZmk7IH0KK0lGUz0kYXNfc2F2ZV9JRlMKKworCisgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6CisgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisJIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKwkjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorCSMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KKwlCQVNIX0VOVj0vZGV2L251bGwKKwlFTlY9L2Rldi9udWxsCisJKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCisJZXhwb3J0IENPTkZJR19TSEVMTAorCWNhc2UgJC0gaW4gIyAoKCgoCisJICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKKwkgICp2KiApIGFzX29wdHM9LXYgOzsKKwkgICp4KiApIGFzX29wdHM9LXggOzsKKwkgICogKSBhc19vcHRzPSA7OworCWVzYWMKKwlleGVjICIkQ09ORklHX1NIRUxMIiAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CitmaQorCisgICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgorICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCisgICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgorICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgorICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgorICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKKyAgZWxzZQorICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYW5kCiskMDogaHR0cDovL3NvdXJjZXdhcmUub3JnL2xpYmZmaS5odG1sIGFib3V0IHlvdXIgc3lzdGVtLAorJDA6IGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCiskMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KKyQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgorICBmaQorICBleGl0IDEKK2ZpCitmaQorZmkKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CitleHBvcnQgU0hFTEwKKyMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgorQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KK3Vuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTyBhc19saW5lbm9fMmE9JExJTkVOTworICBldmFsICd0ZXN0ICJ4JGFzX2xpbmVub18xJyRhc19ydW4nIiAhPSAieCRhc19saW5lbm9fMickYXNfcnVuJyIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicgfHwgeworICAjIEJsYW1lIExlZSBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KKyAgICAgIE4KKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKyAgICAgIHQgbG9vcAorICAgICAgcy8tXG4uKi8vCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdGVzdF94PSd0ZXN0IC14JworZWxzZQorICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBhc19sc19MX29wdGlvbj1MCisgIGVsc2UKKyAgICBhc19sc19MX29wdGlvbj0KKyAgZmkKKyAgYXNfdGVzdF94PScKKyAgICBldmFsIHNoIC1jICdcJycKKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorCXRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4gIygKKwktKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKKwordGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAorZXhlYyA2PiYxCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0nbGliZmZpJworUEFDS0FHRV9UQVJOQU1FPSdsaWJmZmknCitQQUNLQUdFX1ZFUlNJT049JzMuMC4xMCcKK1BBQ0tBR0VfU1RSSU5HPSdsaWJmZmkgMy4wLjEwJworUEFDS0FHRV9CVUdSRVBPUlQ9J2h0dHA6Ly9zb3VyY2V3YXJlLm9yZy9saWJmZmkuaHRtbCcKK1BBQ0tBR0VfVVJMPScnCisKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiIKKworYWNfc3Vic3RfdmFycz0nYW1fX0VYRUVYVF9GQUxTRQorYW1fX0VYRUVYVF9UUlVFCitMVExJQk9CSlMKK0xJQk9CSlMKK3Rvb2xleGVjbGliZGlyCit0b29sZXhlY2RpcgorRkZJX0RFQlVHX0ZBTFNFCitGRklfREVCVUdfVFJVRQorVEFSR0VURElSCitUQVJHRVQKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfRkFMU0UKK0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfVFJVRQorc3lzX3N5bWJvbF91bmRlcnNjb3JlCitIQVZFX0xPTkdfRE9VQkxFCitBTExPQ0EKK1BBNjRfSFBVWF9GQUxTRQorUEE2NF9IUFVYX1RSVUUKK1BBX0hQVVhfRkFMU0UKK1BBX0hQVVhfVFJVRQorUEFfTElOVVhfRkFMU0UKK1BBX0xJTlVYX1RSVUUKK1NINjRfRkFMU0UKK1NINjRfVFJVRQorU0hfRkFMU0UKK1NIX1RSVUUKK1g4Nl82NF9GQUxTRQorWDg2XzY0X1RSVUUKK1MzOTBfRkFMU0UKK1MzOTBfVFJVRQorRlJWX0ZBTFNFCitGUlZfVFJVRQorTElCRkZJX0NSSVNfRkFMU0UKK0xJQkZGSV9DUklTX1RSVUUKK0FWUjMyX0ZBTFNFCitBVlIzMl9UUlVFCitBUk1fRkFMU0UKK0FSTV9UUlVFCitQT1dFUlBDX0ZSRUVCU0RfRkFMU0UKK1BPV0VSUENfRlJFRUJTRF9UUlVFCitQT1dFUlBDX0RBUldJTl9GQUxTRQorUE9XRVJQQ19EQVJXSU5fVFJVRQorUE9XRVJQQ19BSVhfRkFMU0UKK1BPV0VSUENfQUlYX1RSVUUKK1BPV0VSUENfRkFMU0UKK1BPV0VSUENfVFJVRQorTU9YSUVfRkFMU0UKK01PWElFX1RSVUUKK002OEtfRkFMU0UKK002OEtfVFJVRQorTTMyUl9GQUxTRQorTTMyUl9UUlVFCitJQTY0X0ZBTFNFCitJQTY0X1RSVUUKK0FMUEhBX0ZBTFNFCitBTFBIQV9UUlVFCitYODZfREFSV0lOX0ZBTFNFCitYODZfREFSV0lOX1RSVUUKK1g4Nl9XSU42NF9GQUxTRQorWDg2X1dJTjY0X1RSVUUKK1g4Nl9XSU4zMl9GQUxTRQorWDg2X1dJTjMyX1RSVUUKK1g4Nl9GUkVFQlNEX0ZBTFNFCitYODZfRlJFRUJTRF9UUlVFCitYODZfRkFMU0UKK1g4Nl9UUlVFCitTUEFSQ19GQUxTRQorU1BBUkNfVFJVRQorTUlQU19GQUxTRQorTUlQU19UUlVFCitBTV9MVExERkxBR1MKK0FNX1JVTlRFU1RGTEFHUworVEVTVFNVQkRJUl9GQUxTRQorVEVTVFNVQkRJUl9UUlVFCitNQUlOVAorTUFJTlRBSU5FUl9NT0RFX0ZBTFNFCitNQUlOVEFJTkVSX01PREVfVFJVRQorUFJURElBRworQ1BQCitPVE9PTDY0CitPVE9PTAorTElQTworTk1FRElUCitEU1lNVVRJTAorTUFOSUZFU1RfVE9PTAorUkFOTElCCithY19jdF9BUgorQVIKK0RMTFRPT0wKK09CSkRVTVAKK0xOX1MKK05NCithY19jdF9EVU1QQklOCitEVU1QQklOCitMRAorRkdSRVAKK0VHUkVQCitHUkVQCitTRUQKK0xJQlRPT0wKK2FtX19mYXN0ZGVwQ0NBU19GQUxTRQorYW1fX2Zhc3RkZXBDQ0FTX1RSVUUKK0NDQVNERVBNT0RFCitDQ0FTRkxBR1MKK0NDQVMKK2FtX19mYXN0ZGVwQ0NfRkFMU0UKK2FtX19mYXN0ZGVwQ0NfVFJVRQorQ0NERVBNT0RFCitBTURFUEJBQ0tTTEFTSAorQU1ERVBfRkFMU0UKK0FNREVQX1RSVUUKK2FtX19xdW90ZQorYW1fX2luY2x1ZGUKK0RFUERJUgorT0JKRVhUCitFWEVFWFQKK2FjX2N0X0NDCitDUFBGTEFHUworTERGTEFHUworQ0ZMQUdTCitDQworYW1fX3VudGFyCithbV9fdGFyCitBTVRBUgorYW1fX2xlYWRpbmdfZG90CitTRVRfTUFLRQorQVdLCitta2Rpcl9wCitNS0RJUl9QCitJTlNUQUxMX1NUUklQX1BST0dSQU0KK1NUUklQCitpbnN0YWxsX3NoCitNQUtFSU5GTworQVVUT0hFQURFUgorQVVUT01BS0UKK0FVVE9DT05GCitBQ0xPQ0FMCitWRVJTSU9OCitQQUNLQUdFCitDWUdQQVRIX1cKK2FtX19pc3JjCitJTlNUQUxMX0RBVEEKK0lOU1RBTExfU0NSSVBUCitJTlNUQUxMX1BST0dSQU0KK2F4X2VuYWJsZV9idWlsZGRpcl9zZWQKK3RhcmdldF9vcwordGFyZ2V0X3ZlbmRvcgordGFyZ2V0X2NwdQordGFyZ2V0Citob3N0X29zCitob3N0X3ZlbmRvcgoraG9zdF9jcHUKK2hvc3QKK2J1aWxkX29zCitidWlsZF92ZW5kb3IKK2J1aWxkX2NwdQorYnVpbGQKK3RhcmdldF9hbGlhcworaG9zdF9hbGlhcworYnVpbGRfYWxpYXMKK0xJQlMKK0VDSE9fVAorRUNIT19OCitFQ0hPX0MKK0RFRlMKK21hbmRpcgorbG9jYWxlZGlyCitsaWJkaXIKK3BzZGlyCitwZGZkaXIKK2R2aWRpcgoraHRtbGRpcgoraW5mb2RpcgorZG9jZGlyCitvbGRpbmNsdWRlZGlyCitpbmNsdWRlZGlyCitsb2NhbHN0YXRlZGlyCitzaGFyZWRzdGF0ZWRpcgorc3lzY29uZmRpcgorZGF0YWRpcgorZGF0YXJvb3RkaXIKK2xpYmV4ZWNkaXIKK3NiaW5kaXIKK2JpbmRpcgorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorcHJlZml4CitleGVjX3ByZWZpeAorUEFDS0FHRV9VUkwKK1BBQ0tBR0VfQlVHUkVQT1JUCitQQUNLQUdFX1NUUklORworUEFDS0FHRV9WRVJTSU9OCitQQUNLQUdFX1RBUk5BTUUKK1BBQ0tBR0VfTkFNRQorUEFUSF9TRVBBUkFUT1IKK1NIRUxMJworYWNfc3Vic3RfZmlsZXM9JycKK2FjX3VzZXJfb3B0cz0nCitlbmFibGVfb3B0aW9uX2NoZWNraW5nCitlbmFibGVfYnVpbGRkaXIKK2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nCitlbmFibGVfc2hhcmVkCitlbmFibGVfc3RhdGljCit3aXRoX3BpYworZW5hYmxlX2Zhc3RfaW5zdGFsbAord2l0aF9nbnVfbGQKK3dpdGhfc3lzcm9vdAorZW5hYmxlX2xpYnRvb2xfbG9jaworZW5hYmxlX3BvcnRhYmxlX2JpbmFyeQord2l0aF9nY2NfYXJjaAorZW5hYmxlX21haW50YWluZXJfbW9kZQorZW5hYmxlX2RlYnVnCitlbmFibGVfc3RydWN0cworZW5hYmxlX3Jhd19hcGkKK2VuYWJsZV9wdXJpZnlfc2FmZXR5CisnCisgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcworaG9zdF9hbGlhcwordGFyZ2V0X2FsaWFzCitDQ0FTCitDQ0FTRkxBR1MKK0NQUAorQ1BQRkxBR1MnCisKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorYWNfaW5pdF9oZWxwPQorYWNfaW5pdF92ZXJzaW9uPWZhbHNlCithY191bnJlY29nbml6ZWRfb3B0cz0KK2FjX3VucmVjb2duaXplZF9zZXA9CisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorY2FjaGVfZmlsZT0vZGV2L251bGwKK2V4ZWNfcHJlZml4PU5PTkUKK25vX2NyZWF0ZT0KK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCisjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKyMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CisjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCisjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCitkYXRhZGlyPScke2RhdGFyb290ZGlyfScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2RvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCitodG1sZGlyPScke2RvY2Rpcn0nCitkdmlkaXI9JyR7ZG9jZGlyfScKK3BkZmRpcj0nJHtkb2NkaXJ9JworcHNkaXI9JyR7ZG9jZGlyfScKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCittYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKworYWNfcHJldj0KK2FjX2Rhc2hkYXNoPQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7CisgICo9KSAgIGFjX29wdGFyZz0gOzsKKyAgKikgICAgYWNfb3B0YXJnPXllcyA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKyAgLS0pCisgICAgYWNfZGFzaGRhc2g9eWVzIDs7CisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKKworICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisgIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQorICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKKyAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQorICAgIGFjX3ByZXY9ZG9jZGlyIDs7CisgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKyAgICBhY19wcmV2PWR2aWRpciA7OworICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGFjX2luaXRfaGVscD1sb25nIDs7CisgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKyAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7CisgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKyAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCisgIHwgLS1odD0qKQorICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCisgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKyAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCisgICAgYWNfcHJldj1wZGZkaXIgOzsKKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKyAgICBwZGZkaXI9JGFjX29wdGFyZyA7OworCisgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisgICAgYWNfcHJldj1wc2RpciA7OworICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworCisgIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAorICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKKyAgICBlc2FjCisgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKyAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KKyAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorICAgIG5vKSA7OworICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKKyAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7CisgIGVzYWMKK2ZpCisKKyMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgorZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisJCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAorCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCisJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCitkbworICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgKi8gKQorICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCisgICAgICBldmFsICRhY192YXI9XCRhY192YWw7OworICBlc2FjCisgICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKKyAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CisgIGVzYWMKKyAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KKyAgICBJZiBhIGNyb3NzIGNvbXBpbGVyIGlzIGRldGVjdGVkIHRoZW4gY3Jvc3MgY29tcGlsZSBtb2RlIHdpbGwgYmUgdXNlZCIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKK2FjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgorYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKK3Rlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8CiskYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKK2ZpCithY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCithY19hYnNfY29uZmRpcj1gKAorCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCisJcHdkKWAKKyMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCitpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisgIHNyY2Rpcj0uCitmaQorIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKyMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCitjYXNlICRzcmNkaXIgaW4KKyovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworZXNhYworZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KK2RvbmUKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBsaWJmZmkgMy4wLjEwIHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KKworVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCisKK1RvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKK1ZBUj1WQUxVRS4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCB2YXJpYWJsZXMuCisKK0RlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgorCitDb25maWd1cmF0aW9uOgorICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAgICAgLS1oZWxwPXNob3J0ICAgICAgICBkaXNwbGF5IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBwYWNrYWdlCisgICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcworICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50ICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcgLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0tZGF0YXJvb3RkaXI9RElSICAgICAgIHJlYWQtb25seSBhcmNoLi1pbmRlcGVuZGVudCBkYXRhIHJvb3QgW1BSRUZJWC9zaGFyZV0KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQorICAtLWxvY2FsZWRpcj1ESVIgICAgICAgICBsb2NhbGUtZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSL2xvY2FsZV0KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKyAgLS1kb2NkaXI9RElSICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2MvbGliZmZpXQorICAtLWh0bWxkaXI9RElSICAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1kdmlkaXI9RElSICAgICAgICAgICAgZHZpIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wZGZkaXI9RElSICAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wc2Rpcj1ESVIgICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorX0FDRU9GCisKKyAgY2F0IDw8XF9BQ0VPRgorCitQcm9ncmFtIG5hbWVzOgorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQorICAtLXRhcmdldD1UQVJHRVQgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIGNvbXBpbGVycyBmb3IgVEFSR0VUIFtIT1NUXQorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorICBjYXNlICRhY19pbml0X2hlbHAgaW4KKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIGxpYmZmaSAzLjAuMTA6Ijs7CisgICBlc2FjCisgIGNhdCA8PFxfQUNFT0YKKworT3B0aW9uYWwgRmVhdHVyZXM6CisgIC0tZGlzYWJsZS1vcHRpb24tY2hlY2tpbmcgIGlnbm9yZSB1bnJlY29nbml6ZWQgLS1lbmFibGUvLS13aXRoIG9wdGlvbnMKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0tZGlzYWJsZS1idWlsZGRpciAgICAgIGRpc2FibGUgYXV0b21hdGljIGJ1aWxkIGluIHN1YmRpciBvZiBzb3VyY2VzCisKKyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAorICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9ycworICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KKyAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdCisgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10KKyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKQorICAtLWVuYWJsZS1wb3J0YWJsZS1iaW5hcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSBjb21waWxlciBvcHRpbWl6YXRpb25zIHRoYXQgd291bGQgcHJvZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBvcnRhYmxlIGJpbmFyaWVzCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSAgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisJCQkgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIKKyAgLS1lbmFibGUtZGVidWcgICAgICAgICAgZGVidWdnaW5nIG1vZGUKKyAgLS1kaXNhYmxlLXN0cnVjdHMgICAgICAgb21pdCBjb2RlIGZvciBzdHJ1Y3Qgc3VwcG9ydAorICAtLWRpc2FibGUtcmF3LWFwaSAgICAgICBtYWtlIHRoZSByYXcgYXBpIHVuYXZhaWxhYmxlCisgIC0tZW5hYmxlLXB1cmlmeS1zYWZldHkgIHB1cmlmeS1zYWZlIG1vZGUKKworT3B0aW9uYWwgUGFja2FnZXM6CisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0td2l0aC1waWMgICAgICAgICAgICAgIHRyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIFtkZWZhdWx0PXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoXQorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dCisgIC0td2l0aC1zeXNyb290PURJUiBTZWFyY2ggZm9yIGRlcGVuZGVudCBsaWJyYXJpZXMgd2l0aGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgKG9yIHRoZSBjb21waWxlcidzIHN5c3Jvb3QgaWYgbm90IHNwZWNpZmllZCkuCisgIC0td2l0aC1nY2MtYXJjaD08YXJjaD4gIHVzZSBhcmNoaXRlY3R1cmUgPGFyY2g+IGZvciBnY2MgLW1hcmNoLy1tdHVuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBndWVzc2luZworCitTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKKyAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCisgIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKKyAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCisgICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KKyAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgorICBDUFBGTEFHUyAgICAoT2JqZWN0aXZlKSBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCisgICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDQ0FTICAgICAgICBhc3NlbWJsZXIgY29tcGlsZXIgY29tbWFuZCAoZGVmYXVsdHMgdG8gQ0MpCisgIENDQVNGTEFHUyAgIGFzc2VtYmxlciBjb21waWxlciBmbGFncyAoZGVmYXVsdHMgdG8gQ0ZMQUdTKQorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitSZXBvcnQgYnVncyB0byA8aHR0cDovL3NvdXJjZXdhcmUub3JnL2xpYmZmaS5odG1sPi4KK19BQ0VPRgorYWNfc3RhdHVzPSQ/CitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAiJGFjX2RpciIgfHwKKyAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorICAgICAgY29udGludWUKKyAgICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbHNlCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorICAgIGZpIHx8IGFjX3N0YXR1cz0kPworICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KKyAgZG9uZQorZmkKKwordGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCitpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCisgIGNhdCA8PFxfQUNFT0YKK2xpYmZmaSBjb25maWd1cmUgMy4wLjEwCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjgKKworQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KK19BQ0VPRgorICBleGl0CitmaQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEF1dG9jb25mIGluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgYWNfZm5fY190cnlfY29tcGlsZSBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2xpbmsgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2xpbmsgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgICMgRGVsZXRlIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikgaW5mb3JtYXRpb24KKyAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAorICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcworICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCisgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfbGluaworCisjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCisKKyMgYWNfZm5fY190cnlfY3BwIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NwcCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPiBjb25mdGVzdC5pICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgIGFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jcHAKKworIyBhY19mbl9jX3RyeV9ydW4gTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLiBBc3N1bWVzCisjIHRoYXQgZXhlY3V0YWJsZXMgKmNhbiogYmUgcnVuLgorYWNfZm5fY190cnlfcnVuICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyAgICAgICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgICAgIGFjX3JldHZhbD0kYWNfc3RhdHVzCitmaQorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X3J1bgorCisjIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2NfY2hlY2tfZnVuYyAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICQyIGlubm9jdW91c18kMgorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkMgorCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICQyICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgorY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkMiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19mdW5jCisKKyMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cywgZ2l2aW5nIGEgd2FybmluZyBpZiBpdCBjYW5ub3QgYmUgY29tcGlsZWQgdXNpbmcKKyMgdGhlIGluY2x1ZGUgZmlsZXMgaW4gSU5DTFVERVMgYW5kIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUgorIyBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHVzYWJpbGl0eSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAkMiB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHByZXNlbmNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHByZXNlbmNlLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gIygoCisgIHllczpubzogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisoICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIGh0dHA6Ly9zb3VyY2V3YXJlLm9yZy9saWJmZmkuaHRtbCAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgICApIHwgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9XCRhY19oZWFkZXJfY29tcGlsZXIiCitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwKKworIyBhY19mbl9jX2NoZWNrX3R5cGUgTElORU5PIFRZUEUgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUKKyMgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja190eXBlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCQyKSkKKwkgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworaWYgKHNpemVvZiAoKCQyKSkpCisJICAgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgZXZhbCAiJDM9eWVzIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfdHlwZQorCisjIGFjX2ZuX2NfY29tcHV0ZV9pbnQgTElORU5PIEVYUFIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyaWVzIHRvIGZpbmQgdGhlIGNvbXBpbGUtdGltZSB2YWx1ZSBvZiBFWFBSIGluIGEgcHJvZ3JhbSB0aGF0IGluY2x1ZGVzCisjIElOQ0xVREVTLCBzZXR0aW5nIFZBUiBhY2NvcmRpbmdseS4gUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBjb3VsZCBiZQorIyBjb21wdXRlZAorYWNfZm5fY19jb21wdXRlX2ludCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPj0gMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hpPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGFzX2ZuX2FyaXRoICRhY19taWQgKyAxICYmIGFjX2xvPSRhc192YWwKKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhc19mbl9hcml0aCAyICcqJyAkYWNfbWlkICsgMSAmJiBhY19taWQ9JGFzX3ZhbAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPCAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hpPS0xIGFjX21pZD0tMQorICB3aGlsZSA6OyBkbworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPj0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19sbz0kYWNfbWlkOyBicmVhaworZWxzZQorICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgLSAxICYmIGFjX2hpPSRhc192YWwKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhc19mbl9hcml0aCAyICcqJyAkYWNfbWlkICYmIGFjX21pZD0kYXNfdmFsCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgYWNfbG89IGFjX2hpPQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYXNfZm5fYXJpdGggJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvICYmIGFjX21pZD0kYXNfdmFsCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0kYWNfbWlkCitlbHNlCisgIGFzX2ZuX2FyaXRoICcoJyAkYWNfbWlkICcpJyArIDEgJiYgYWNfbG89JGFzX3ZhbAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorY2FzZSAkYWNfbG8gaW4gIygoCis/KikgZXZhbCAiJDM9XCRhY19sbyI7IGFjX3JldHZhbD0wIDs7CisnJykgYWNfcmV0dmFsPTEgOzsKK2VzYWMKKyAgZWxzZQorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuICQyOyB9CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworCisgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CisgIGlmICghIGYpCisgICAgcmV0dXJuIDE7CisgIGlmICgoJDIpIDwgMCkKKyAgICB7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgkMikpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWxkIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKCQyKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbHUiLCBpKTsKKyAgICB9CisgIC8qIERvIG5vdCBvdXRwdXQgYSB0cmFpbGluZyBuZXdsaW5lLCBhcyB0aGlzIGNhdXNlcyBcclxuIGNvbmZ1c2lvbgorICAgICBvbiBzb21lIHBsYXRmb3Jtcy4gICovCisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgZWNobyA+PmNvbmZ0ZXN0LnZhbDsgcmVhZCAkMyA8Y29uZnRlc3QudmFsOyBhY19yZXR2YWw9MAorZWxzZQorICBhY19yZXR2YWw9MQorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvbmZ0ZXN0LnZhbAorCisgIGZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfY29tcHV0ZV9pbnQKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IGxpYmZmaSAkYXNfbWUgMy4wLjEwLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgJDAgJEAKKworX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vaG9zdGluZm8gICAgICA9IGAoL3Vzci9iaW4vaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqXCcqKQorICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczAgIiAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJnczEgIiAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKK3sgYWNfY29uZmlndXJlX2FyZ3MwPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwO30KK3sgYWNfY29uZmlndXJlX2FyZ3MxPTsgdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxO30KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCisjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCit0cmFwICdleGl0X3N0YXR1cz0kPworICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKyAgeworICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispCisgICAgZWNobworCisgICAgJGFzX2VjaG8gIiMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgICBjYXNlICRhY192YWwgaW4KKyAgICAgICpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKyAgICAgIGVzYWMKKyAgICAgICRhc19lY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKyAgICBkb25lIHwgc29ydAorICAgIGVjaG8KKworICAgIGlmIHRlc3QgLW4gIiRhY19zdWJzdF9maWxlcyI7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKyAgICAgIGRvCisJZXZhbCBhY192YWw9XCQkYWNfdmFyCisJY2FzZSAkYWNfdmFsIGluCisJKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworCWVzYWMKKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjIgorICAgICAgZWNobworICAgICAgY2F0IGNvbmZkZWZzLmgKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKKyAgfSA+JjUKKyAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCisgICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbworICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBhc19mbl9leGl0IDEnICRhY19zaWduYWwKK2RvbmUKK2FjX3NpZ25hbD0wCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAorCiskYXNfZWNobyAiLyogY29uZmRlZnMuaCAqLyIgPiBjb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9VUkwgIiRQQUNLQUdFX1VSTCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2FjX3NpdGVfZmlsZTE9Tk9ORQorYWNfc2l0ZV9maWxlMj1OT05FCitpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCisgICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCisgIGNhc2UgJENPTkZJR19TSVRFIGluICMoKAorICAgIC0qKSAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CisgICAgKikgICBhY19zaXRlX2ZpbGUxPS4vJENPTkZJR19TSVRFOzsKKyAgZXNhYworZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JHByZWZpeC9ldGMvY29uZmlnLnNpdGUKK2Vsc2UKKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKyAgYWNfc2l0ZV9maWxlMj0kYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKK2RvCisgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkYWNfc2l0ZV9maWxlIiAmJiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIiBcCisgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJmYWlsZWQgdG8gbG9hZCBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwgZmlsZXMKKyAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gIiRjYWNoZV9maWxlIjs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisgICAgZXNhYworICBmaQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKKyMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKyMgdmFsdWUuCithY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwkjIGRpZmZlcmVuY2VzIGluIHdoaXRlc3BhY2UgZG8gbm90IGxlYWQgdG8gZmFpbHVyZS4KKwlhY19vbGRfdmFsX3c9YGVjaG8geCAkYWNfb2xkX3ZhbGAKKwlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKwlpZiB0ZXN0ICIkYWNfb2xkX3ZhbF93IiAhPSAiJGFjX25ld192YWxfdyI7IHRoZW4KKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBhY19jYWNoZV9jb3JydXB0ZWQ9OgorCWVsc2UKKwkgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCisJZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiYyO30KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mNQorJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KKyAgICAgIGZpOzsKKyAgZXNhYworICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorICAgIGNhc2UgJGFjX25ld192YWwgaW4KKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7CisgICAgZXNhYworICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCisgICAgICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MgIiAnJGFjX2FyZyciIDs7CisgICAgZXNhYworICBmaQorZG9uZQoraWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorICBhc19mbl9lcnJvciAkPyAicnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgIiRMSU5FTk8iIDUKK2ZpCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTWFpbiBib2R5IG9mIHNjcmlwdC4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCithY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIGZmaWNvbmZpZy5oIgorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluICIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iOyBkbworICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9zaHRvb2wiOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvc2h0b29sIGluc3RhbGwgLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgaW5zdGFsbC1zaCwgaW5zdGFsbC5zaCwgb3Igc2h0b29sIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiAiJExJTkVOTyIgNQorZmkKKworIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCisjIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCisjIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKKyMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KKyRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfYnVpbGQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1CithY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X2J1aWxkIGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgIiRMSU5FTk8iIDU7OworZXNhYworYnVpbGQ9JGFjX2N2X2J1aWxkCithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfYnVpbGQKK3NoaWZ0CitidWlsZF9jcHU9JDEKK2J1aWxkX3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2J1aWxkX29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hvc3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAorZWxzZQorICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CitjYXNlICRhY19jdl9ob3N0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNTs7Citlc2FjCitob3N0PSRhY19jdl9ob3N0CithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfaG9zdAorc2hpZnQKK2hvc3RfY3B1PSQxCitob3N0X3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2hvc3Rfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3RhcmdldCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIngkdGFyZ2V0X2FsaWFzIiA9IHg7IHRoZW4KKyAgYWNfY3ZfdGFyZ2V0PSRhY19jdl9ob3N0CitlbHNlCisgIGFjX2N2X3RhcmdldD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkdGFyZ2V0X2FsaWFzYCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkdGFyZ2V0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3RhcmdldCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3RhcmdldCIgPiY2OyB9CitjYXNlICRhY19jdl90YXJnZXQgaW4KKyotKi0qKSA7OworKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIHRhcmdldCIgIiRMSU5FTk8iIDU7OworZXNhYwordGFyZ2V0PSRhY19jdl90YXJnZXQKK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKK3NldCB4ICRhY19jdl90YXJnZXQKK3NoaWZ0Cit0YXJnZXRfY3B1PSQxCit0YXJnZXRfdmVuZG9yPSQyCitzaGlmdDsgc2hpZnQKKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgordGFyZ2V0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICR0YXJnZXRfb3MgaW4gKlwgKikgdGFyZ2V0X29zPWBlY2hvICIkdGFyZ2V0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK3Rlc3QgLW4gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKK3RhcmdldF9hbGlhcz0ke3RhcmdldF9hbGlhcy0kaG9zdF9hbGlhc30KKworLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKKworCisgICAjIFskXUAgaXMgdW5zYWJsZSBpbiAyLjYwKyBidXQgZWFybGllciBhdXRvY29uZiBoYWQgbm8gYWNfY29uZmlndXJlX2FyZ3MKKyAgIGlmIHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3Mrc2V0fSIgIT0gInNldCIgOyB0aGVuCisgICAgICBhY19jb25maWd1cmVfYXJncz0KKyAgICAgIGZvciBhY19hcmcgaW4gJHsxKyIkQCJ9OyBkbworICAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCisgICAgICBkb25lCisgICBmaQorCisjIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCithbV9hdXhfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCisKKworYXhfZW5hYmxlX2J1aWxkZGlyPSIuIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJ1aWxkZGlyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2J1aWxkZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfYnVpbGRkaXI7IGF4X2VuYWJsZV9idWlsZGRpcj0iJGVuYWJsZXZhbCIKK2Vsc2UKKyAgYXhfZW5hYmxlX2J1aWxkZGlyPSJhdXRvIgorZmkKKworaWYgdGVzdCAiLiRhY19zcmNkaXJfZGVmYXVsdGVkIiAhPSAiLm5vIiA7IHRoZW4KK2lmIHRlc3QgIi4kc3JjZGlyIiA9ICIuLiIgOyB0aGVuCisgIGlmIHRlc3QgLWYgY29uZmlnLnN0YXR1cyA7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHRvcGxldmVsIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQuLi4gc2tpcHBpbmcgc3ViZGlyIGJ1aWxkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHRvcGxldmVsIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQuLi4gc2tpcHBpbmcgc3ViZGlyIGJ1aWxkIiA+JjY7fQorICBlbHNlCisgICAgdGVzdCAiLiRheF9lbmFibGVfYnVpbGRkaXIiID0gIi4iICAmJiBheF9lbmFibGVfYnVpbGRkaXI9Ii4iCisgICAgdGVzdCAiLiRheF9lbmFibGVfYnVpbGRkaXIiID0gIi5ubyIgICYmIGF4X2VuYWJsZV9idWlsZGRpcj0iLiIKKyAgICB0ZXN0ICIuJFRBUkdFVCIgPSAiLiIgJiYgVEFSR0VUPSIkdGFyZ2V0IgorICAgIHRlc3QgIi4kYXhfZW5hYmxlX2J1aWxkZGlyIiA9ICIuYXV0byIgJiYgYXhfZW5hYmxlX2J1aWxkZGlyPSIkVEFSR0VUIgorICAgIGlmIHRlc3QgIi4kYXhfZW5hYmxlX2J1aWxkZGlyIiAhPSAiLi4iIDsgdGhlbiAgICAjIHdlIGtub3cgd2hlcmUgdG8gZ28gYW5kCisgICAgICBhc19kaXI9JGF4X2VuYWJsZV9idWlsZGRpcjsgYXNfZm5fbWtkaXJfcAorICAgICAgZWNobyBfXy4kYXhfZW5hYmxlX2J1aWxkZGlyLl9fID4gJGF4X2VuYWJsZV9idWlsZGRpci9jb25mdGVzdC50bXAKKyAgICAgIGNkICRheF9lbmFibGVfYnVpbGRkaXIKKyAgICAgIGlmIGdyZXAgX18uJGF4X2VuYWJsZV9idWlsZGRpci5fXyBjb25mdGVzdC50bXAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgICAgcm0gY29uZnRlc3QudG1wCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBjb250aW51ZSBjb25maWd1cmUgaW4gZGVmYXVsdCBidWlsZGRpciBcIi4vJGF4X2VuYWJsZV9idWlsZGRpclwiIiA+JjUKKyRhc19lY2hvICJjb250aW51ZSBjb25maWd1cmUgaW4gZGVmYXVsdCBidWlsZGRpciBcIi4vJGF4X2VuYWJsZV9idWlsZGRpclwiIiA+JjY7IH0KKyAgICAgIGVsc2UKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjaGFuZ2UgdG8gZGVmYXVsdCBidWlsZGRpciBcIi4vJGF4X2VuYWJsZV9idWlsZGRpclwiIiAiJExJTkVOTyIgNQorICAgICAgZmkKKyAgICAgIHNyY2Rpcj1gZWNobyAiJGF4X2VuYWJsZV9idWlsZGRpciIgfAorICAgICAgICAgICAgICBzZWQgLWUgJ3MsXlwuLywsO3MsW14vXSQsJi8sO3MsW14vXSovLC4uLyxnO3MsWy9dJCwsOydgCisgICAgICAjIGdvaW5nIHRvIHJlc3RhcnQgZnJvbSBzdWJkaXJlY3RvcnkgbG9jYXRpb24KKyAgICAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcubG9nICAgJiYgbXYgJHNyY2Rpci9jb25maWcubG9nICAgLgorICAgICAgdGVzdCAtZiAkc3JjZGlyL2NvbmZkZWZzLmggICAmJiBtdiAkc3JjZGlyL2NvbmZkZWZzLmggICAuCisgICAgICB0ZXN0IC1mICRzcmNkaXIvY29uZnRlc3QubG9nICYmIG12ICRzcmNkaXIvY29uZnRlc3QubG9nIC4KKyAgICAgIHRlc3QgLWYgJHNyY2Rpci8kY2FjaGVfZmlsZSAgJiYgbXYgJHNyY2Rpci8kY2FjaGVfZmlsZSAgLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IC4uLi5leGVjICRTSEVMTCAkc3JjZGlyLyQwIFwiLS1zcmNkaXI9JHNyY2RpclwiIFwiLS1lbmFibGUtYnVpbGRkaXI9JGF4X2VuYWJsZV9idWlsZGRpclwiICR7MStcIiRAXCJ9IiA+JjUKKyRhc19lY2hvICIuLi4uZXhlYyAkU0hFTEwgJHNyY2Rpci8kMCBcIi0tc3JjZGlyPSRzcmNkaXJcIiBcIi0tZW5hYmxlLWJ1aWxkZGlyPSRheF9lbmFibGVfYnVpbGRkaXJcIiAkezErXCIkQFwifSIgPiY2OyB9CisgICAgICBjYXNlICIkMCIgaW4gIyByZXN0YXJ0CisgICAgICAgL1xcKikgZXZhbCAkU0hFTEwgIickMCciICInLS1zcmNkaXI9JHNyY2RpciciICInLS1lbmFibGUtYnVpbGRkaXI9JGF4X2VuYWJsZV9idWlsZGRpciciICRhY19jb25maWd1cmVfYXJncyA7OworICAgICAgICopIGV2YWwgJFNIRUxMICInJHNyY2Rpci8kMCciICInLS1zcmNkaXI9JHNyY2RpciciICInLS1lbmFibGUtYnVpbGRkaXI9JGF4X2VuYWJsZV9idWlsZGRpciciICRhY19jb25maWd1cmVfYXJncyA7OworICAgICAgZXNhYyA7IGV4aXQgJD8KKyAgICBmaQorICBmaQorZmkgZmkKK3Rlc3QgIi4kYXhfZW5hYmxlX2J1aWxkZGlyIiA9ICIuYXV0byIgJiYgYXhfZW5hYmxlX2J1aWxkZGlyPSIuIgorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnc2VkIHNlZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ3NlZCBzZWQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX2F4X2VuYWJsZV9idWlsZGRpcl9zZWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRheF9lbmFibGVfYnVpbGRkaXJfc2VkIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2F4X2VuYWJsZV9idWlsZGRpcl9zZWQ9IiRheF9lbmFibGVfYnVpbGRkaXJfc2VkIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9heF9lbmFibGVfYnVpbGRkaXJfc2VkPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX2F4X2VuYWJsZV9idWlsZGRpcl9zZWQiICYmIGFjX2N2X3BhdGhfYXhfZW5hYmxlX2J1aWxkZGlyX3NlZD0ic2VkIgorICA7OworZXNhYworZmkKK2F4X2VuYWJsZV9idWlsZGRpcl9zZWQ9JGFjX2N2X3BhdGhfYXhfZW5hYmxlX2J1aWxkZGlyX3NlZAoraWYgdGVzdCAtbiAiJGF4X2VuYWJsZV9idWlsZGRpcl9zZWQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCIgPiY1CiskYXNfZWNobyAiJGF4X2VuYWJsZV9idWlsZGRpcl9zZWQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworYXhfZW5hYmxlX2J1aWxkZGlyX2F1eGRpcj0iJGFtX2F1eF9kaXIiCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgYnVpbGRpciIKKworCithbV9fYXBpX3ZlcnNpb249JzEuMTEnCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KKyMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmICR7YWNfY3ZfcGF0aF9pbnN0YWxsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbiAjKCgKKyAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAorICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKyAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCisgIC91c3IvdWNiLyogKSA7OworICAqKQorICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgIyBieSBkZWZhdWx0LgorICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCisJICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCisJICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCisJICAgIHRoZW4KKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgICAgYnJlYWsgMworCSAgICBmaQorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICA7OworZXNhYworCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQorJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uICIgPiY2OyB9CisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCisjIFJlamVjdCB1bnNhZmUgY2hhcmFjdGVycyBpbiAkc3JjZGlyIG9yIHRoZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeQorIyBuYW1lLiAgQWNjZXB0IHNwYWNlIGFuZCB0YWIgb25seSBpbiB0aGUgbGF0dGVyLgorYW1fbGY9JworJworY2FzZSBgcHdkYCBpbgorICAqW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXSopCisgICAgYXNfZm5fZXJyb3IgJD8gInVuc2FmZSBhYnNvbHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBuYW1lIiAiJExJTkVOTyIgNTs7Citlc2FjCitjYXNlICRzcmNkaXIgaW4KKyAgKltcXFwiXCNcJFwmXCdcYCRhbV9sZlwgXAldKikKKyAgICBhc19mbl9lcnJvciAkPyAidW5zYWZlIHNyY2RpciB2YWx1ZTogXGAkc3JjZGlyJyIgIiRMSU5FTk8iIDU7OworZXNhYworCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgIiRzcmNkaXIvY29uZmlndXJlIiBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgYXNfZm5fZXJyb3IgJD8gImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1CisgICBmaQorCisgICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgYXNfZm5fZXJyb3IgJD8gIm5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siICIkTElORU5PIiA1CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgRG91YmxlIGFueSBcIG9yICQuCisjIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgorYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJworcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gJGFzX2VjaG8gIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisKK2lmIHRlc3QgeCIke01JU1NJTkcrc2V0fSIgIT0geHNldDsgdGhlbgorICBjYXNlICRhbV9hdXhfZGlyIGluCisgICpcICogfCAqXAkqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSBcIiRhbV9hdXhfZGlyL21pc3NpbmdcIiIgOzsKKyAgKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIgOzsKKyAgZXNhYworZmkKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogXGBtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiYyO30KK2ZpCisKK2lmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKKyAgKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKKyAgZXNhYworZmkKKworIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCisjIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0CisjIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCisjIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitTVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAoraWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKKyRhc19lY2hvICIkU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgorICBhY19jdF9TVFJJUD0kU1RSSVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKK2lmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgorICAgIFNUUklQPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFNUUklQPSRhY19jdF9TVFJJUAorICBmaQorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJE1LRElSX1AiOyB0aGVuCisgIGlmICR7YWNfY3ZfcGF0aF9ta2Rpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBta2RpciBnbWtkaXI7IGRvCisJIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCSAgIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH0gfHwgY29udGludWUKKwkgICBjYXNlIGAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLS12ZXJzaW9uIDI+JjFgIGluICMoCisJICAgICAnbWtkaXIgKEdOVSBjb3JldXRpbHMpICcqIHwgXAorCSAgICAgJ21rZGlyIChjb3JldXRpbHMpICcqIHwgXAorCSAgICAgJ21rZGlyIChmaWxldXRpbHMpICc0LjEqKQorCSAgICAgICBhY19jdl9wYXRoX21rZGlyPSRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQKKwkgICAgICAgYnJlYWsgMzs7CisJICAgZXNhYworCSBkb25lCisgICAgICAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCisKKyAgdGVzdCAtZCAuLy0tdmVyc2lvbiAmJiBybWRpciAuLy0tdmVyc2lvbgorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBNS0RJUl9QPSIkYWNfY3ZfcGF0aF9ta2RpciAtcCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBNS0RJUl9QIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgTUtESVJfUD0iJGFjX2luc3RhbGxfc2ggLWQiCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNS0RJUl9QIiA+JjUKKyRhc19lY2hvICIkTUtESVJfUCIgPiY2OyB9CisKK21rZGlyX3A9IiRNS0RJUl9QIgorY2FzZSAkbWtkaXJfcCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSopIDs7CisgICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKK2VzYWMKKworZm9yIGFjX3Byb2cgaW4gZ2F3ayBtYXdrIG5hd2sgYXdrCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQVdLKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BV0s9IiRBV0siICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19BV0s9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVdLIiA+JjUKKyRhc19lY2hvICIkQVdLIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KK3NldCB4ICR7TUFLRS1tYWtlfQorYWNfbWFrZT1gJGFzX2VjaG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCitpZiBldmFsIFwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxfQUNFT0YKK1NIRUxMID0gL2Jpbi9zaAorYWxsOgorCUBlY2hvICdAQEAlJSU9JChNQUtFKT1AQEAlJSUnCitfQUNFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2Nhc2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgorICAqQEBAJSUlPT8qPUBAQCUlJSopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKKyAgKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Citlc2FjCitybSAtZiBjb25mdGVzdC5tYWtlCitmaQoraWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgIFNFVF9NQUtFPQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworcm0gLXJmIC50c3QgMj4vZGV2L251bGwKK21rZGlyIC50c3QgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLnRzdDsgdGhlbgorICBhbV9fbGVhZGluZ19kb3Q9LgorZWxzZQorICBhbV9fbGVhZGluZ19kb3Q9XworZmkKK3JtZGlyIC50c3QgMj4vZGV2L251bGwKKworaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgorICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAorICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCisgIGFtX19pc3JjPScgLUkkKHNyY2RpciknCisgICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAorICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgIiRMSU5FTk8iIDUKKyAgZmkKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCisKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorIFBBQ0tBR0U9J2xpYmZmaScKKyBWRVJTSU9OPSczLjAuMTAnCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitfQUNFT0YKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorCitBQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSJ9CisKKworQVVUT0NPTkY9JHtBVVRPQ09ORi0iJHthbV9taXNzaW5nX3J1bn1hdXRvY29uZiJ9CisKKworQVVUT01BS0U9JHtBVVRPTUFLRS0iJHthbV9taXNzaW5nX3J1bn1hdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0ifQorCisKK0FVVE9IRUFERVI9JHtBVVRPSEVBREVSLSIke2FtX21pc3NpbmdfcnVufWF1dG9oZWFkZXIifQorCisKK01BS0VJTkZPPSR7TUFLRUlORk8tIiR7YW1fbWlzc2luZ19ydW59bWFrZWluZm8ifQorCisjIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgorIyBzb21lIHBsYXRmb3Jtcy4KKyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworQU1UQVI9JHtBTVRBUi0iJHthbV9taXNzaW5nX3J1bn10YXIifQorCithbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLScKKworCisKKworCisKKyMgVGhlIHNhbWUgYXMgaW4gYm9laG0tZ2MgYW5kIGxpYnN0ZGMrKy4gSGF2ZSB0byBib3Jyb3cgaXQgZnJvbSB0aGVyZS4KKyMgV2UgbXVzdCBmb3JjZSBDQyB0byAvbm90LyBiZSBwcmVjaW91cyB2YXJpYWJsZXM7IG90aGVyd2lzZQorIyB0aGUgd3JvbmcsIG5vbi1tdWx0aWxpYi1hZGp1c3RlZCB2YWx1ZSB3aWxsIGJlIHVzZWQgaW4gbXVsdGlsaWJzLgorIyBBcyBhIHNpZGUgZWZmZWN0LCB3ZSBoYXZlIHRvIHN1YnN0IENGTEFHUyBvdXJzZWx2ZXMuCisjIEFsc28gc2F2ZSBhbmQgcmVzdG9yZSBDRkxBR1MsIHNpbmNlIEFDX1BST0dfQ0Mgd2lsbCBjb21lIHVwIHdpdGgKKyMgZGVmYXVsdHMgb2YgaXRzIG93biBpZiBub25lIGFyZSBwcm92aWRlZC4KKworCisKK3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIGZpCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK3NldCBYICRhY19jb21waWxlCithY19jb21waWxlcj0kMgorZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbworICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIHNlZCAnMTBhXAorLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgorICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KK2RvbmUKKworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKworIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgorYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKworYWNfcm1maWxlcz0KK2ZvciBhY19maWxlIGluICRhY19maWxlcworZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKKyAgZXNhYworZG9uZQorcm0gLWYgJGFjX3JtZmlsZXMKKworaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCisjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKKyMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCisjIEF1dG9jb25mLgorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCitkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkKKwk7OworICAgIFthYl0ub3V0ICkKKwkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorCSMgY2VydGFpbmx5IHJpZ2h0LgorCWJyZWFrOzsKKyAgICAqLiogKQorCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOworCXRoZW4gOjsgZWxzZQorCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCWZpCisJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90CisJIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCisJIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCisJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCisJIyBhY3R1YWxseSB3b3JraW5nLgorCWJyZWFrOzsKKyAgICAqICkKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKK3Rlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQorCitlbHNlCisgIGFjX2ZpbGU9JycKK2ZpCitpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CisKK3JtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KK2lmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJICBicmVhazs7CisgICAgKiApIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CitGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOworIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorICB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorICBpZiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVleHQnCisgIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1ubworICBlbHNlCisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorCWNyb3NzX2NvbXBpbGluZz15ZXMKKyAgICBlbHNlCisJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgIGZpCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorJGFzX2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X29iamV4dCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2NfY29tcGlsZXJfZ251Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2crOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCisgICBhY19jdl9wcm9nX2NjX2c9bm8KKyAgIENGTEFHUz0iLWciCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBDRkxBR1M9IiIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworCSBDRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY2NfYzg5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19jODk9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCitpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCisvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKyNkZWZpbmUgRk9PKHgpICd4JworaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisJLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CisgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCitkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorIyBBQ19DQUNIRV9WQUwKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCisgIHgpCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7CisgIHhubykKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKKyAgKikKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OworZXNhYworaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKKworZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorREVQRElSPSIke2FtX19sZWFkaW5nX2RvdH1kZXBzIgorCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgZGVwZmlsZXMiCisKKworYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAiID4mNjsgfQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCitjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgYW1fX3F1b3RlPQorICBfYW1fcmVzdWx0PUdOVQorICA7OworZXNhYworIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgIGFtX19xdW90ZT0iXCIiCisgICAgIF9hbV9yZXN1bHQ9QlNECisgICAgIDs7CisgICBlc2FjCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1CiskYXNfZWNobyAiJF9hbV9yZXN1bHQiID4mNjsgfQorcm0gLWYgY29uZmluYyBjb25mbWYKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7CitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKKyAgQU1ERVBCQUNLU0xBU0g9J1wnCitmaQorIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBBTURFUF9UUlVFPQorICBBTURFUF9GQUxTRT0nIycKK2Vsc2UKKyAgQU1ERVBfVFJVRT0nIycKKyAgQU1ERVBfRkFMU0U9CitmaQorCisKKworZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICIgPiY2OyB9CitpZiAke2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBhbV9fdW5pdmVyc2FsPWZhbHNlCisgIGNhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjCisKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKKyAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKKyAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQorICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgorICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBnY2MpCisgICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgorICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKKyAgICAgIDs7CisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CiskYXNfZWNobyAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisgaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKK0NGTEFHUz0kc2F2ZV9DRkxBR1MKKworCisKKworCisjIEJ5IGRlZmF1bHQgd2Ugc2ltcGx5IHVzZSB0aGUgQyBjb21waWxlciB0byBidWlsZCBhc3NlbWJseSBjb2RlLgorCit0ZXN0ICIke0NDQVMrc2V0fSIgPSBzZXQgfHwgQ0NBUz0kQ0MKK3Rlc3QgIiR7Q0NBU0ZMQUdTK3NldH0iID0gc2V0IHx8IENDQVNGTEFHUz0kQ0ZMQUdTCisKKworCitkZXBjYz0iJENDQVMiICAgYW1fY29tcGlsZXJfbGlzdD0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9DQ0FTX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NBU19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCisgIGZpCisgIGFtX191bml2ZXJzYWw9ZmFsc2UKKworCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuICBBbHNvLCBzb21lIEludGVsCisgICAgIyB2ZXJzaW9ucyBoYWQgdHJvdWJsZSB3aXRoIG91dHB1dCBpbiBzdWJkaXJzCisgICAgYW1fX29iaj1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICBhbV9fbWludXNfb2JqPSItbyAkYW1fX29iaiIKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgZ2NjKQorICAgICAgIyBUaGlzIGRlcG1vZGUgY2F1c2VzIGEgY29tcGlsZXIgcmFjZSBpbiB1bml2ZXJzYWwgbW9kZS4KKyAgICAgIHRlc3QgIiRhbV9fdW5pdmVyc2FsIiA9IGZhbHNlIHx8IGNvbnRpbnVlCisgICAgICA7OworICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbXN2aXN1YWxjcHAgfCBtc3ZjbXN5cykKKyAgICAgICMgVGhpcyBjb21waWxlciB3b24ndCBncm9rIGAtYyAtbycsIGJ1dCBhbHNvLCB0aGUgbWludXNvIHRlc3QgaGFzCisgICAgICAjIG5vdCBydW4geWV0LiAgVGhlc2UgZGVwbW9kZXMgYXJlIGxhdGUgZW5vdWdoIGluIHRoZSBnYW1lLCBhbmQKKyAgICAgICMgc28gd2VhayB0aGF0IHRoZWlyIGZ1bmN0aW9uaW5nIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCisgICAgICBhbV9fb2JqPWNvbmZ0ZXN0LiR7T0JKRVhULW99CisgICAgICBhbV9fbWludXNfb2JqPQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PSRhbV9fb2JqIFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jICRhbV9fbWludXNfb2JqIHN1Yi9jb25mdGVzdC5jIFwKKyAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0MS5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgJGFtX19vYmogc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKKyAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCisgICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCisgICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKKyAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAorICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgICAgICAgYW1fY3ZfQ0NBU19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DQ0FTX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFtX2N2X0NDQVNfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9DQ0FTX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NDQVNERVBNT0RFPWRlcG1vZGU9JGFtX2N2X0NDQVNfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKKworIGlmCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl9DQ0FTX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ0FTX1RSVUU9CisgIGFtX19mYXN0ZGVwQ0NBU19GQUxTRT0nIycKK2Vsc2UKKyAgYW1fX2Zhc3RkZXBDQ0FTX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NBU19GQUxTRT0KK2ZpCisKKworaWYgdGVzdCAieCRDQyIgIT0geGNjOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFuZCBjYyB1bmRlcnN0YW5kIC1jIGFuZCAtbyB0b2dldGhlci4uLiAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgY2MgdW5kZXJzdGFuZHMgLWMgYW5kIC1vIHRvZ2V0aGVyLi4uICIgPiY2OyB9CitmaQorc2V0IGR1bW15ICRDQzsgYWNfY2M9YCRhc19lY2hvICIkMiIgfAorCQkgICAgICBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAoraWYgZXZhbCBcJHthY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorIyBNYWtlIHN1cmUgaXQgd29ya3MgYm90aCB3aXRoICRDQyBhbmQgd2l0aCBzaW1wbGUgY2MuCisjIFdlIGRvIHRoZSB0ZXN0IHR3aWNlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgcmVmdXNlIHRvIG92ZXJ3cml0ZSBhbgorIyBleGlzdGluZyAubyBmaWxlIHdpdGggLW8sIHRob3VnaCB0aGV5IHdpbGwgY3JlYXRlIG9uZS4KK2FjX3RyeT0nJENDIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiY1Jworcm0gLWYgY29uZnRlc3QyLioKK2lmIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJgorICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJiB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07Cit0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289eWVzCisgIGlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgorICAgICMgVGVzdCBmaXJzdCB0aGF0IGNjIGV4aXN0cyBhdCBhbGwuCisgICAgaWYgeyBhY190cnk9J2NjIC1jIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KKyAgICAgIGFjX3RyeT0nY2MgLWMgY29uZnRlc3QuJGFjX2V4dCAtbyBjb25mdGVzdDIuJGFjX29iamV4dCA+JjUnCisgICAgICBybSAtZiBjb25mdGVzdDIuKgorICAgICAgaWYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmCisJIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OworICAgICAgdGhlbgorCSMgY2Mgd29ya3MgdG9vLgorCToKKyAgICAgIGVsc2UKKwkjIGNjIGV4aXN0cyBidXQgZG9lc24ndCBsaWtlIC1vLgorCWV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QqCisKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2NfbyA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgTk9fTUlOVVNfQ19NSU5VU19PIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisjIEZJWE1FOiB3ZSByZWx5IG9uIHRoZSBjYWNoZSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UKKyMgdGhlcmUgaXMgbm8gb3RoZXIgd2F5Lgorc2V0IGR1bW15ICRDQworYW1fY2M9YGVjaG8gJDIgfCBzZWQgJ3MvW15hLXpBLVowLTlfXS9fL2c7cy9eWzAtOV0vXy8nYAorZXZhbCBhbV90PVwkYWNfY3ZfcHJvZ19jY18ke2FtX2NjfV9jX28KK2lmIHRlc3QgIiRhbV90IiAhPSB5ZXM7IHRoZW4KKyAgICMgTG9zaW5nIGNvbXBpbGVyLCBzbyBvdmVycmlkZSB3aXRoIHRoZSBzY3JpcHQuCisgICAjIEZJWE1FOiBJdCBpcyB3cm9uZyB0byByZXdyaXRlIENDLgorICAgIyBCdXQgaWYgd2UgZG9uJ3QgdGhlbiB3ZSBnZXQgaW50byB0cm91YmxlIG9mIG9uZSBzb3J0IG9yIGFub3RoZXIuCisgICAjIEEgbG9uZ2VyLXRlcm0gZml4IHdvdWxkIGJlIHRvIGhhdmUgYXV0b21ha2UgdXNlIGFtX19DQyBpbiB0aGlzIGNhc2UsCisgICAjIGFuZCB0aGVuIHdlIGNvdWxkIHNldCBhbV9fQ0M9IlwkKHRvcF9zcmNkaXIpL2NvbXBpbGUgXCQoQ0MpIgorICAgQ0M9IiRhbV9hdXhfZGlyL2NvbXBpbGUgJENDIgorZmkKKworCitjYXNlIGBwd2RgIGluCisgICpcICogfCAqXAkqKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIFxgcHdkXGAiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIFxgcHdkXGAiID4mMjt9IDs7Citlc2FjCisKKworCittYWNyb192ZXJzaW9uPScyLjQnCittYWNyb19yZXZpc2lvbj0nMS4zMjkzJworCisKKworCisKKworCisKKworCisKKworCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBCYWNrc2xhc2hpZnkgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbgorIyBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbImAkXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaW5nbGUgcXVvdGUuCitkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3Q9J3MvJ1wnJy8nXCdcXFxcXFxcJ1wnJy9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gYXZvaWQgYWNjaWRlbnRhbCBnbG9iYmluZyBpbiBldmFsZWQgZXhwcmVzc2lvbnMKK25vX2dsb2Jfc3Vic3Q9J3MvXCovXFxcKi9nJworCitFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworRUNITz0kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBwcmludCBzdHJpbmdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBwcmludCBzdHJpbmdzLi4uICIgPiY2OyB9CisjIFRlc3QgcHJpbnQgZmlyc3QsIGJlY2F1c2UgaXQgd2lsbCBiZSBhIGJ1aWx0aW4gaWYgcHJlc2VudC4KK2lmIHRlc3QgIlhgKCBwcmludCAtciAtLSAtbiApIDI+L2Rldi9udWxsYCIgPSBYLW4gJiYgXAorICAgdGVzdCAiWGBwcmludCAtciAtLSAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnQgLXIgLS0nCitlbGlmIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPIDI+L2Rldi9udWxsYCIgPSAiWCRFQ0hPIjsgdGhlbgorICBFQ0hPPSdwcmludGYgJXNcbicKK2Vsc2UKKyAgIyBVc2UgdGhpcyBmdW5jdGlvbiBhcyBhIGZhbGxiYWNrIHRoYXQgYWx3YXlzIHdvcmtzLgorICBmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKKyAgeworICAgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskMQorX0xURUNIT19FT0YnCisgIH0KKyAgRUNITz0nZnVuY19mYWxsYmFja19lY2hvJworZmkKKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIiCit9CisKK2Nhc2UgIiRFQ0hPIiBpbgorICBwcmludGYqKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogcHJpbnRmIiA+JjUKKyRhc19lY2hvICJwcmludGYiID4mNjsgfSA7OworICBwcmludCopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBwcmludCAtciIgPiY1CiskYXNfZWNobyAicHJpbnQgLXIiID4mNjsgfSA7OworICAqKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY2F0IiA+JjUKKyRhc19lY2hvICJjYXQiID4mNjsgfSA7OworZXNhYworCisKKworCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX1NFRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAgICAgICBhY19zY3JpcHQ9cy9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIvCisgICAgIGZvciBhY19pIGluIDEgMiAzIDQgNSA2IDc7IGRvCisgICAgICAgYWNfc2NyaXB0PSIkYWNfc2NyaXB0JGFzX25sJGFjX3NjcmlwdCIKKyAgICAgZG9uZQorICAgICBlY2hvICIkYWNfc2NyaXB0IiAyPi9kZXYvbnVsbCB8IHNlZCA5OXEgPmNvbmZ0ZXN0LnNlZAorICAgICB7IGFjX3NjcmlwdD07IHVuc2V0IGFjX3NjcmlwdDt9CisgICAgIGlmIHRlc3QgLXogIiRTRUQiOyB0aGVuCisgIGFjX3BhdGhfU0VEX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfU0VEPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9TRUQiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX1NFRCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX1NFRCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfU0VECitjYXNlIGAiJGFjX3BhdGhfU0VEIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX1NFRD0iJGFjX3BhdGhfU0VEIiBhY19wYXRoX1NFRF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX1NFRCIgLWYgY29uZnRlc3Quc2VkIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9TRURfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfU0VEPSIkYWNfcGF0aF9TRUQiCisgICAgICBhY19wYXRoX1NFRF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX1NFRF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfU0VEIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIHNlZCBjb3VsZCBiZSBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfU0VEPSRTRUQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfU0VEIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9TRUQiID4mNjsgfQorIFNFRD0iJGFjX2N2X3BhdGhfU0VEIgorICBybSAtZiBjb25mdGVzdC5zZWQKKwordGVzdCAteiAiJFNFRCIgJiYgU0VEPXNlZAorWHNlZD0iJFNFRCAtZSAxcy9eWC8vIgorCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0dSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9HUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKK2Nhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgorICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQorIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfRUdSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBmZ3JlcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZmdyZXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9GR1JFUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGVjaG8gJ2FiKmMnIHwgJEdSRVAgLUYgJ2FiKmMnID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0ZHUkVQPSIkR1JFUCAtRiIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEZHUkVQIjsgdGhlbgorICBhY19wYXRoX0ZHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZmdyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0ZHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9GR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRkdSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9GR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRkdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9GR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9GR1JFUD0iJGFjX3BhdGhfRkdSRVAiIGFjX3BhdGhfRkdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0ZHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0ZHUkVQIiBGR1JFUCA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRkdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRkdSRVA9IiRhY19wYXRoX0ZHUkVQIgorICAgICAgYWNfcGF0aF9GR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0ZHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9GR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBmZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRkdSRVA9JEZHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9GR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRkdSRVAiID4mNjsgfQorIEZHUkVQPSIkYWNfY3ZfcGF0aF9GR1JFUCIKKworCit0ZXN0IC16ICIkR1JFUCIgJiYgR1JFUD1ncmVwCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2dudV9sZDsgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgJENDLi4uICIgPiY2OyB9CisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1xcL10qIHwgPzpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICIgPiY2OyB9CitmaQoraWYgJHtsdF9jdl9wYXRoX0xEKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRCIgPiY1CiskYXNfZWNobyAiJExEIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQordGVzdCAteiAiJExEIiAmJiBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfZ251X2xkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2dudV9sZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfZ251X2xkIiA+JjY7IH0KK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlciAobm0pLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3BhdGhfTk0rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBsdF9jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIGx0X25tX3RvX2NoZWNrPSIke2FjX3Rvb2xfcHJlZml4fW5tIgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiICYmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuCisgICAgbHRfbm1fdG9fY2hlY2s9IiRsdF9ubV90b19jaGVjayBubSIKKyAgZmkKKyAgZm9yIGx0X3RtcF9ubSBpbiAkbHRfbm1fdG9fY2hlY2s7IGRvCisgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4vZWxmIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgdG1wX25tPSIkYWNfZGlyLyRsdF90bXBfbm0iCisgICAgICBpZiB0ZXN0IC1mICIkdG1wX25tIiB8fCB0ZXN0IC1mICIkdG1wX25tJGFjX2V4ZWV4dCIgOyB0aGVuCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisJIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKwkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisJIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCisJY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJKi9kZXYvbnVsbCogfCAqJ0ludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZScqKQorCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKKwkgIGJyZWFrCisJICA7OworCSopCisJICBjYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkgICovZGV2L251bGwqKQorCSAgICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgorCSAgICBicmVhaworCSAgICA7OworCSAgKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwkgICAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIGRvbmUKKyAgOiAke2x0X2N2X3BhdGhfTk09bm99CitmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcGF0aF9OTSIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3BhdGhfTk0iID4mNjsgfQoraWYgdGVzdCAiJGx0X2N2X3BhdGhfTk0iICE9ICJubyI7IHRoZW4KKyAgTk09IiRsdF9jdl9wYXRoX05NIgorZWxzZQorICAjIERpZG4ndCBmaW5kIGFueSBCU0QgY29tcGF0aWJsZSBuYW1lIGxpc3RlciwgbG9vayBmb3IgZHVtcGJpbi4KKyAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuIDoKKyAgICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgZWxzZQorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZHVtcGJpbiAibGluayAtZHVtcCIKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfRFVNUEJJTis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiREVU1QQklOIjsgdGhlbgorICBhY19jdl9wcm9nX0RVTVBCSU49IiREVU1QQklOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfRFVNUEJJTj0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorRFVNUEJJTj0kYWNfY3ZfcHJvZ19EVU1QQklOCitpZiB0ZXN0IC1uICIkRFVNUEJJTiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICREVU1QQklOIiA+JjUKKyRhc19lY2hvICIkRFVNUEJJTiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJERVTVBCSU4iICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkRFVNUEJJTiI7IHRoZW4KKyAgYWNfY3RfRFVNUEJJTj0kRFVNUEJJTgorICBmb3IgYWNfcHJvZyBpbiBkdW1wYmluICJsaW5rIC1kdW1wIgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X0RVTVBCSU4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRFVNUEJJTiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9EVU1QQklOPSIkYWNfY3RfRFVNUEJJTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RVTVBCSU49IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0RVTVBCSU49JGFjX2N2X3Byb2dfYWNfY3RfRFVNUEJJTgoraWYgdGVzdCAtbiAiJGFjX2N0X0RVTVBCSU4iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfRFVNUEJJTiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0RVTVBCSU4iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfRFVNUEJJTiIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0RVTVBCSU4iID0geDsgdGhlbgorICAgIERVTVBCSU49IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgRFVNUEJJTj0kYWNfY3RfRFVNUEJJTgorICBmaQorZmkKKworICAgIGNhc2UgYCREVU1QQklOIC1zeW1ib2xzIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisgICAgKkNPRkYqKQorICAgICAgRFVNUEJJTj0iJERVTVBCSU4gLXN5bWJvbHMiCisgICAgICA7OworICAgICopCisgICAgICBEVU1QQklOPToKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCisgIGlmIHRlc3QgIiREVU1QQklOIiAhPSAiOiI7IHRoZW4KKyAgICBOTT0iJERVTVBCSU4iCisgIGZpCitmaQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQorCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2UuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfbm1faW50ZXJmYWNlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3Zfbm1faW50ZXJmYWNlPSJCU0Qgbm0iCisgIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuJGFjX2V4dAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGFjX2NvbXBpbGVcIiIgPiY1KQorICAoZXZhbCAiJGFjX2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJE5NIFxcXCJjb25mdGVzdC4kYWNfb2JqZXh0XFxcIlwiIiA+JjUpCisgIChldmFsICIkTk0gXCJjb25mdGVzdC4kYWNfb2JqZXh0XCIiIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0KQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogb3V0cHV0XCIiID4mNSkKKyAgY2F0IGNvbmZ0ZXN0Lm91dCA+JjUKKyAgaWYgJEdSRVAgJ0V4dGVybmFsLipzb21lX3ZhcmlhYmxlJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9ubV9pbnRlcmZhY2U9Ik1TIGR1bXBiaW4iCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0KgorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3Zfbm1faW50ZXJmYWNlIiA+JjUKKyRhc19lY2hvICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA+JjY7IH0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gIiA+JjY7IH0KK0xOX1M9JGFzX2xuX3MKK2lmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vLCB1c2luZyAkTE5fUyIgPiY1CiskYXNfZWNobyAibm8sIHVzaW5nICRMTl9TIiA+JjY7IH0KK2ZpCisKKyMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9zeXNfbWF4X2NtZF9sZW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAgIGk9MAorICB0ZXN0c3RyaW5nPSJBQkNEIgorCisgIGNhc2UgJGJ1aWxkX29zIGluCisgIG1zZG9zZGpncHAqKQorICAgICMgT24gREpHUFAsIHRoaXMgdGVzdCBjYW4gYmxvdyB1cCBwcmV0dHkgYmFkbHkgZHVlIHRvIHByb2JsZW1zIGluIGxpYmMKKyAgICAjIChhbnkgc2luZ2xlIGFyZ3VtZW50IGV4Y2VlZGluZyAyMDAwIGJ5dGVzIGNhdXNlcyBhIGJ1ZmZlciBvdmVycnVuCisgICAgIyBkdXJpbmcgZ2xvYiBleHBhbnNpb24pLiAgRXZlbiBpZiBpdCB3ZXJlIGZpeGVkLCB0aGUgcmVzdWx0IG9mIHRoaXMKKyAgICAjIGNoZWNrIHdvdWxkIGJlIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTIyODg7ICAgICMgMTJLIGlzIGFib3V0IHJpZ2h0CisgICAgOzsKKworICBnbnUqKQorICAgICMgVW5kZXIgR05VIEh1cmQsIHRoaXMgdGVzdCBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSBpcworICAgICMgbm8gbGltaXQgdG8gdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICMgTGlidG9vbCB3aWxsIGludGVycHJldCAtMSBhcyBubyBsaW1pdCB3aGF0c29ldmVyCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xOworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKKyAgICAjIE9uIFdpbjl4L01FLCB0aGlzIHRlc3QgYmxvd3MgdXAgLS0gaXQgc3VjY2VlZHMsIGJ1dCB0YWtlcworICAgICMgYWJvdXQgNSBtaW51dGVzIGFzIHRoZSB0ZXN0c3RyaW5nIGdyb3dzIGV4cG9uZW50aWFsbHkuCisgICAgIyBXb3JzZSwgc2luY2UgOXgvTUUgYXJlIG5vdCBwcmUtZW1wdGl2ZWx5IG11bHRpdGFza2luZywKKyAgICAjIHlvdSBlbmQgdXAgd2l0aCBhICJmcm96ZW4iIGNvbXB1dGVyLCBldmVuIHRob3VnaCB3aXRoIHBhdGllbmNlCisgICAgIyB0aGUgdGVzdCBldmVudHVhbGx5IHN1Y2NlZWRzICh3aXRoIGEgbWF4IGxpbmUgbGVuZ3RoIG9mIDI1NmspLgorICAgICMgSW5zdGVhZCwgbGV0J3MganVzdCBwdW50OiB1c2UgdGhlIG1pbmltdW0gbGluZWxlbmd0aCByZXBvcnRlZCBieQorICAgICMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zOiA4MTkyIChvbiBOVC8ySy9YUCkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBtaW50KikKKyAgICAjIE9uIE1pTlQgdGhpcyBjYW4gdGFrZSBhIGxvbmcgdGltZSBhbmQgcnVuIG91dCBvZiBtZW1vcnkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCisgICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG5ldGJzZCogfCBmcmVlYnNkKiB8IG9wZW5ic2QqIHwgZGFyd2luKiB8IGRyYWdvbmZseSopCisgICAgIyBUaGlzIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSAzODZCU0QsIGF0IGxlYXN0LiAgTGlrZWx5IGZ1cnRoZXIuCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsaWYgdGVzdCAteCAvdXNyL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC91c3Ivc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTY1NTM2CSMgdXNhYmxlIGRlZmF1bHQgZm9yIGFsbCBCU0RzCisgICAgZmkKKyAgICAjIEFuZCBhZGQgYSBzYWZldHkgem9uZQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICA7OworCisgIGludGVyaXgqKQorICAgICMgV2Uga25vdyB0aGUgdmFsdWUgMjYyMTQ0IGFuZCBoYXJkY29kZSBpdCB3aXRoIGEgc2FmZXR5IHpvbmUgKGxpa2UgQlNEKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKlsJIF0vLydgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4CisgICAgZmkKKyAgICA7OworICAqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gKGdldGNvbmYgQVJHX01BWCkgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICBlbHNlCisgICAgICAjIE1ha2UgdGVzdHN0cmluZyBhIGxpdHRsZSBiaWdnZXIgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHdpdGggaXQuCisgICAgICAjIGEgMUsgc3RyaW5nIHNob3VsZCBiZSBhIHJlYXNvbmFibGUgc3RhcnQuCisgICAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOyBkbworICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQorICAgICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKKyAgICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICAgIHdoaWxlIHsgdGVzdCAiWCJgZnVuY19mYWxsYmFja19lY2hvICIkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAorCSAgICAgICAgID0gIlgkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIjsgfSA+L2Rldi9udWxsIDI+JjEgJiYKKwkgICAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKKyAgICAgIGRvCisgICAgICAgIGk9YGV4cHIgJGkgKyAxYAorICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgICMgT25seSBjaGVjayB0aGUgc3RyaW5nIGxlbmd0aCBvdXRzaWRlIHRoZSBsb29wLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYAorICAgICAgdGVzdHN0cmluZz0KKyAgICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24KKyAgICAgICMgbWFzc2l2ZSBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlCisgICAgICAjIGxpbmtlci4gIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCisgICAgZmkKKyAgICA7OworICBlc2FjCisKK2ZpCisKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iID4mNQorJGFzX2VjaG8gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm9uZSIgPiY1CiskYXNfZWNobyAibm9uZSIgPiY2OyB9CitmaQorbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisKKworCisKKworOiAke0NQPSJjcCAtZiJ9Cis6ICR7TVY9Im12IC1mIn0KKzogJHtSTT0icm0gLWYifQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIHNvbWUgWFNJIGNvbnN0cnVjdHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgc29tZSBYU0kgY29uc3RydWN0cy4uLiAiID4mNjsgfQorIyBUcnkgc29tZSBYU0kgZmVhdHVyZXMKK3hzaV9zaGVsbD1ubworKCBfbHRfZHVtbXk9ImEvYi9jIgorICB0ZXN0ICIke19sdF9kdW1teSMjKi99LCR7X2x0X2R1bW15JS8qfSwke19sdF9kdW1teSM/P30iJHtfbHRfZHVtbXklIiRfbHRfZHVtbXkifSwgXAorICAgICAgPSBjLGEvYixiL2MsIFwKKyAgICAmJiBldmFsICd0ZXN0ICQoKCAxICsgMSApKSAtZXEgMiBcCisgICAgJiYgdGVzdCAiJHsjX2x0X2R1bW15fSIgLWVxIDUnICkgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgeHNpX3NoZWxsPXllcworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR4c2lfc2hlbGwiID4mNQorJGFzX2VjaG8gIiR4c2lfc2hlbGwiID4mNjsgfQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgXCIrPVwiIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIFwiKz1cIi4uLiAiID4mNjsgfQorbHRfc2hlbGxfYXBwZW5kPW5vCisoIGZvbz1iYXI7IHNldCBmb28gYmF6OyBldmFsICIkMSs9XCQyIiAmJiB0ZXN0ICIkZm9vIiA9IGJhcmJheiApIFwKKyAgICA+L2Rldi9udWxsIDI+JjEgXAorICAmJiBsdF9zaGVsbF9hcHBlbmQ9eWVzCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X3NoZWxsX2FwcGVuZCIgPiY1CiskYXNfZWNobyAiJGx0X3NoZWxsX2FwcGVuZCIgPiY2OyB9CisKKworaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGx0X3Vuc2V0PXVuc2V0CitlbHNlCisgIGx0X3Vuc2V0PWZhbHNlCitmaQorCisKKworCisKKyMgdGVzdCBFQkNESUMgb3IgQVNDSUkKK2Nhc2UgYGVjaG8gWHx0ciBYICdcMTAxJ2AgaW4KKyBBKSAjIEFTQ0lJIGJhc2VkIHN5c3RlbQorICAgICMgXG4gaXMgbm90IGludGVycHJldGVkIGNvcnJlY3RseSBieSBTb2xhcmlzIDggL3Vzci91Y2IvdHIKKyAgbHRfU1AyTkw9J3RyIFwwNDAgXDAxMicKKyAgbHRfTkwyU1A9J3RyIFwwMTVcMDEyIFwwNDBcMDQwJworICA7OworICopICMgRUJDRElDIGJhc2VkIHN5c3RlbQorICBsdF9TUDJOTD0ndHIgXDEwMCBcbicKKyAgbHRfTkwyU1A9J3RyIFxyXG4gXDEwMFwxMDAnCisgIDs7Citlc2FjCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvICRob3N0IGZvcm1hdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byAkaG9zdCBmb3JtYXQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfdG9faG9zdF9maWxlX2NtZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICotKi1jeWd3aW4qICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgICAqLSotY3lnd2luKiApCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorICAgICAgICA7OworICAgICAgKiApICMgb3RoZXJ3aXNlLCBhc3N1bWUgKm5peAorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4KKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgKiApICMgdW5oYW5kbGVkIGhvc3RzIChhbmQgIm5vcm1hbCIgbmF0aXZlIGJ1aWxkcykKKyAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICA7OworZXNhYworCitmaQorCit0b19ob3N0X2ZpbGVfY21kPSRsdF9jdl90b19ob3N0X2ZpbGVfY21kCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl90b19ob3N0X2ZpbGVfY21kIiA+JjY7IH0KKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvIHRvb2xjaGFpbiBmb3JtYXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gdG9vbGNoYWluIGZvcm1hdC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl90b190b29sX2ZpbGVfY21kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgI2Fzc3VtZSBvcmRpbmFyeSBjcm9zcyB0b29scywgb3IgbmF0aXZlIGJ1aWxkLgorbHRfY3ZfdG9fdG9vbF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCitjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKK2VzYWMKKworZmkKKwordG9fdG9vbF9maWxlX2NtZD0kbHRfY3ZfdG9fdG9vbF9maWxlX2NtZAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl90b190b29sX2ZpbGVfY21kIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfdG9fdG9vbF9maWxlX2NtZCIgPiY2OyB9CisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfbGRfcmVsb2FkX2ZsYWcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9sZF9yZWxvYWRfZmxhZz0nLXInCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9sZF9yZWxvYWRfZmxhZyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjY7IH0KK3JlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZworY2FzZSAkcmVsb2FkX2ZsYWcgaW4KKyIiIHwgIiAiKikgOzsKKyopIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIiA7OworZXNhYworcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz1mYWxzZQorICAgIGZpCisgICAgOzsKKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGVsc2UKKyAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBmaQorICAgIDs7Citlc2FjCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vYmpkdW1wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9iamR1bXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX09CSkRVTVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19PQkpEVU1QPSIkT0JKRFVNUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX09CSkRVTVA9IiR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitPQkpEVU1QPSRhY19jdl9wcm9nX09CSkRVTVAKK2lmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9CSkRVTVAiID4mNQorJGFzX2VjaG8gIiRPQkpEVU1QIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQkpEVU1QIjsgdGhlbgorICBhY19jdF9PQkpEVU1QPSRPQkpEVU1QCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb2JqZHVtcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9IiRhY19jdF9PQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0ib2JqZHVtcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9PQkpEVU1QPSRhY19jdl9wcm9nX2FjX2N0X09CSkRVTVAKK2lmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09CSkRVTVAiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PQkpEVU1QIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfT0JKRFVNUCIgPSB4OyB0aGVuCisgICAgT0JKRFVNUD0iZmFsc2UiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT0JKRFVNUD0kYWNfY3RfT0JKRFVNUAorICBmaQorZWxzZQorICBPQkpEVU1QPSIkYWNfY3ZfcHJvZ19PQkpEVU1QIgorZmkKKwordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4WzQtOV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitiZW9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYnNkaVs0NV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbworICA7OworCitjeWd3aW4qKQorICAjIGZ1bmNfd2luMzJfbGliaWQgaXMgYSBzaGVsbCBmdW5jdGlvbiBkZWZpbmVkIGluIGx0bWFpbi5zaAorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgOzsKKworbWluZ3cqIHwgcHczMiopCisgICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcsCisgICMgdW5sZXNzIHdlIGZpbmQgJ2ZpbGUnLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHdlIGFyZSBjcm9zcy1jb21waWxpbmcuCisgICMgZnVuY193aW4zMl9saWJpZCBhc3N1bWVzIEJTRCBubSwgc28gZGlzYWxsb3cgaXQgaWYgdXNpbmcgTVMgZHVtcGJpbi4KKyAgaWYgKCB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJCU0Qgbm0iICYmIGZpbGUgLyApID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIGVsc2UKKyAgICAjIEtlZXAgdGhpcyBwYXR0ZXJuIGluIHN5bmMgd2l0aCB0aGUgb25lIGluIGZ1bmNfd2luMzJfbGliaWQuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgKHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/fHBlLWFybS13aW5jZXxwZS14ODYtNjQpJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgZmkKKyAgOzsKKworY2VnY2MqKQorICAjIHVzZSB0aGUgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLiBTZWUgbWluZ3cqLgorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZS1hcm0tLipsaXR0bGUoLiphcmNoaXRlY3R1cmU6IGFybSk/JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbMy05XTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JworICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICBmaQorICA7OworCitnbnUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitoYWlrdSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGWyAtXVswLTldWzAtOV0pKC1iaXQpPyggW0xNXVNCKT8gc2hhcmVkIG9iamVjdCggZmlsZSk/WywgLV0qIFBBLVJJU0MgWzAtOV1cLlswLTldJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAorICAgIDs7CisgICopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18UEEtUklTQ1swLTldXC5bMC05XSkgc2hhcmVkIGxpYnJhcnknCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqIHwgaypic2QqLWdudSB8IGtvcGVuc29sYXJpcyotZ251KQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb1wuWzAtOV0rXC5bMC05XSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc298X3BpY1wuYSkkJworICBmaQorICA7OworCituZXdvczYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCisgIDs7CisKKypudG8qIHwgKnFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK29wZW5ic2QqKQorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfFwuc298X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYlteL10rKFwuc29cLlswLTldK1wuWzAtOV0rfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCityZG9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtNTF1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVswLTldWzAtOV0qIFZlcnNpb24gWzAtOV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHBjKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgZXNhYworICA7OworCit0cGYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjY7IH0KKworZmlsZV9tYWdpY19nbG9iPQord2FudF9ub2Nhc2VnbG9iPW5vCitpZiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG1pbmd3KiB8IHB3MzIqKQorICAgIGlmICggc2hvcHQgfCBncmVwIG5vY2FzZWdsb2IgKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHdhbnRfbm9jYXNlZ2xvYj15ZXMKKyAgICBlbHNlCisgICAgICBmaWxlX21hZ2ljX2dsb2I9YGVjaG8gYUFiQmNDZERlRWZGZ0doSGlJakprS2xMbU1uTm9PcFBxUXJSc1N0VHVVdlZ3V3hYeVl6WiB8ICRTRUQgLWUgInMvXCguLlwpL3NcL1tcMV1cL1tcMV1cL2c7L2ciYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworZmkKKworZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKK3Rlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0RMTFRPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERMTFRPT0wiID4mNQorJGFzX2VjaG8gIiRETExUT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgorICBhY19jdF9ETExUT09MPSRETExUT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9ETExUT09MPSRhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9ETExUT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfRExMVE9PTCIgPSB4OyB0aGVuCisgICAgRExMVE9PTD0iZmFsc2UiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgRExMVE9PTD0kYWNfY3RfRExMVE9PTAorICBmaQorZWxzZQorICBETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgorZmkKKwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBhc3NvY2lhdGUgcnVudGltZSBhbmQgbGluayBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIGFzc29jaWF0ZSBydW50aW1lIGFuZCBsaW5rIGxpYnJhcmllcy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSd1bmtub3duJworCitjYXNlICRob3N0X29zIGluCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICMgdHdvIGRpZmZlcmVudCBzaGVsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgIyBkZWNpZGUgd2hpY2ggdG8gdXNlIGJhc2VkIG9uIGNhcGFiaWxpdGllcyBvZiAkRExMVE9PTAorICBjYXNlIGAkRExMVE9PTCAtLWhlbHAgMj4mMWAgaW4KKyAgKi0taWRlbnRpZnktc3RyaWN0KikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIKKyAgICA7OworICAqKQorICAgIGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPWZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFjaworICAgIDs7CisgIGVzYWMKKyAgOzsKKyopCisgICMgZmFsbGJhY2s6IGFzc3VtZSBsaW5rbGliIElTIHNoYXJlZGxpYgorICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0iJEVDSE8iCisgIDs7Citlc2FjCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiA+JjUKKyRhc19lY2hvICIkbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiID4mNjsgfQorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9JGx0X2N2X3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCit0ZXN0IC16ICIkc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQiICYmIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRFQ0hPCisKKworCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBhcgorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19BUis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVI9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FSPSRhY19jdl9wcm9nX0FSCitpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQorJGFzX2VjaG8gIiRBUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgdGVzdCAtbiAiJEFSIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJEFSIjsgdGhlbgorICBhY19jdF9BUj0kQVIKKyAgZm9yIGFjX3Byb2cgaW4gYXIKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9BUis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iJGFjX2N0X0FSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0FSPSRhY19jdl9wcm9nX2FjX2N0X0FSCitpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQVIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9BUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9BUiIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0FSIiA9IHg7IHRoZW4KKyAgICBBUj0iZmFsc2UiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQVI9JGFjX2N0X0FSCisgIGZpCitmaQorCis6ICR7QVI9YXJ9Cis6ICR7QVJfRkxBR1M9Y3J1fQorCisKKworCisKKworCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFyY2hpdmVyIEBGSUxFIHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGFyY2hpdmVyIEBGSUxFIHN1cHBvcnQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXJfYXRfZmlsZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X2FyX2F0X2ZpbGU9bm8KKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBlY2hvIGNvbmZ0ZXN0LiRhY19vYmpleHQgPiBjb25mdGVzdC5sc3QKKyAgICAgIGx0X2FyX3RyeT0nJEFSICRBUl9GTEFHUyBsaWJjb25mdGVzdC5hIEBjb25mdGVzdC5sc3QgPiY1JworICAgICAgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGx0X2FyX3RyeVwiIjsgfSA+JjUKKyAgKGV2YWwgJGx0X2FyX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KKyAgICAgIGlmIHRlc3QgIiRhY19zdGF0dXMiIC1lcSAwOyB0aGVuCisJIyBFbnN1cmUgdGhlIGFyY2hpdmVyIGZhaWxzIHVwb24gYm9ndXMgZmlsZSBuYW1lcy4KKwlybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGxpYmNvbmZ0ZXN0LmEKKwl7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkbHRfYXJfdHJ5XCIiOyB9ID4mNQorICAoZXZhbCAkbHRfYXJfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorCWlmIHRlc3QgIiRhY19zdGF0dXMiIC1uZSAwOyB0aGVuCisgICAgICAgICAgbHRfY3ZfYXJfYXRfZmlsZT1ACisgICAgICAgIGZpCisgICAgICBmaQorICAgICAgcm0gLWYgY29uZnRlc3QuKiBsaWJjb25mdGVzdC5hCisKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfYXJfYXRfZmlsZSIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FyX2F0X2ZpbGUiID4mNjsgfQorCitpZiB0ZXN0ICJ4JGx0X2N2X2FyX2F0X2ZpbGUiID0geG5vOyB0aGVuCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0KK2Vsc2UKKyAgYXJjaGl2ZXJfbGlzdF9zcGVjPSRsdF9jdl9hcl9hdF9maWxlCitmaQorCisKKworCisKKworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQorJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAoraWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCisgICAgU1RSSVA9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgU1RSSVA9JGFjX2N0X1NUUklQCisgIGZpCitlbHNlCisgIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKK2ZpCisKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgorCisKKworCisKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1JBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkFOTElCIiA+JjUKKyRhc19lY2hvICIkUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCisgIGFjX2N0X1JBTkxJQj0kUkFOTElCCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9SQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgorICAgIFJBTkxJQj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorICBmaQorZWxzZQorICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2ZpCisKK3Rlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06CisKKworCisKKworCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorZmkKKworY2FzZSAkaG9zdF9vcyBpbgorICBkYXJ3aW4qKQorICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj15ZXMgOzsKKyAgKikKKyAgICBsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb249bm8gOzsKK2VzYWMKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW0JDREVHUlNUXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCitzeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJworCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4KikKKyAgc3ltY29kZT0nW0JDRFRdJworICA7OworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICBzeW1jb2RlPSdbQUJDREdJU1RXXScKKyAgOzsKK2hwdXgqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tBQkNERUdSU1RdJworICBmaQorICA7OworaXJpeCogfCBub25zdG9wdXgqKQorICBzeW1jb2RlPSdbQkNERUdSU1RdJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW0JDREVHUVJTVF0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW0JEUlRdJworICA7Oworc2NvMy4ydjUqKQorICBzeW1jb2RlPSdbRFRdJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tEVF0nCisgIDs7CitzeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICBzeW1jb2RlPSdbQUJEVF0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW0RGTlNUVV0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW0FCQ0RHSVJTVFddJyA7OworZXNhYworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorIyBTb21lIHN5c3RlbXMgKGVzcC4gb24gaWE2NCkgbGluayBkYXRhIGFuZCBjb2RlIHN5bWJvbHMgZGlmZmVyZW50bHksCisjIHNvIHVzZSB0aGlzIGdlbmVyYWwgYXBwcm9hY2guCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpWyBdKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpWyBdKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwobGliW14gXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YCRFQ0hPICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJzY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICAgICMgRmFrZSBpdCBmb3IgZHVtcGJpbiBhbmQgc2F5IFQgZm9yIGFueSBub24tc3RhdGljIGZ1bmN0aW9uCisgICAgIyBhbmQgRCBmb3IgYW55IGdsb2JhbCB2YXJpYWJsZS4KKyAgICAjIEFsc28gZmluZCBDKysgYW5kIF9fZmFzdGNhbGwgc3ltYm9scyBmcm9tIE1TVkMrKywKKyAgICAjIHdoaWNoIHN0YXJ0IHdpdGggQCBvciA/LgorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRBV0sgJyJcCisiICAgICB7bGFzdF9zZWN0aW9uPXNlY3Rpb247IHNlY3Rpb249XCQgM307IlwKKyIgICAgIC9TZWN0aW9uIGxlbmd0aCAuKiNyZWxvY3MuKihwaWNrIGFueSkve2hpZGVbbGFzdF9zZWN0aW9uXT0xfTsiXAorIiAgICAgXCQgMCF+L0V4dGVybmFsICpcfC97bmV4dH07IlwKKyIgICAgIC8gMCsgVU5ERUYgL3tuZXh0fTsgLyBVTkRFRiBcKFtefF1cKSooKS97bmV4dH07IlwKKyIgICAgIHtpZihoaWRlW3NlY3Rpb25dKSBuZXh0fTsiXAorIiAgICAge2Y9MH07IFwkIDB+L1woXCkuKlx8L3tmPTF9OyB7cHJpbnRmIGYgPyBcIlQgXCIgOiBcIkQgXCJ9OyJcCisiICAgICB7c3BsaXQoXCQgMCwgYSwgL1x8fFxyLyk7IHNwbGl0KGFbMl0sIHMpfTsiXAorIiAgICAgc1sxXX4vXltAP10ve3ByaW50IHNbMV0sIHNbMV07IG5leHR9OyJcCisiICAgICBzWzFdfnByZngge3NwbGl0KHNbMV0sdCxcIkBcIik7IHByaW50IHRbMV0sIHN1YnN0cih0WzFdLGxlbmd0aChwcmZ4KSl9IlwKKyIgICAgICcgcHJmeD1eJGFjX3N5bXByZngiCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWwkgXVwoJHN5bWNvZGUkc3ltY29kZSpcKVsJIF1bCSBdKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgorICBmaQorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnLyBfX2dudV9sdG8vZCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKTsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorX0xUX0VPRgorCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19jb21waWxlXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgXD4gJG5saXN0XCIiOyB9ID4mNQorICAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEuICAqLworIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QKKyNlbHNlCisjIGRlZmluZSBMVF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX0xUX0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8X0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK0xUX0RMU1lNX0NPTlNUIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHZvaWQgICAgICAgKmFkZHJlc3M7Cit9CitsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW10gPQoreworICB7ICJAUFJPR1JBTUAiLCAodm9pZCAqKSAwIH0sCitfTFRfRU9GCisJICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKKwkgIGNhdCA8PFxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyAgezAsICh2b2lkICopIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitfTFRfRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0CisJICBsdF9nbG9ic3ltX3NhdmVfTElCUz0kTElCUworCSAgbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisJICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2xpbmtcIiI7IH0gPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0kbHRfZ2xvYnN5bV9zYXZlX0xJQlMKKwkgIENGTEFHUz0kbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUworCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQorCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCogY29uZnRzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGJyZWFrCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorCitmaQorCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBmYWlsZWQiID4mNQorJGFzX2VjaG8gImZhaWxlZCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBvayIgPiY1CiskYXNfZWNobyAib2siID4mNjsgfQorZmkKKworIyBSZXNwb25zZSBmaWxlIHN1cHBvcnQuCitpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICBubV9maWxlX2xpc3Rfc3BlYz0nQCcKK2VsaWYgJE5NIC0taGVscCAyPi9kZXYvbnVsbCB8IGdyZXAgJ1tAXUZJTEUnID4vZGV2L251bGw7IHRoZW4KKyAgbm1fZmlsZV9saXN0X3NwZWM9J0AnCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3lzcm9vdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3lzcm9vdC4uLiAiID4mNjsgfQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXN5c3Jvb3Qgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3N5c3Jvb3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3N5c3Jvb3Q7CitlbHNlCisgIHdpdGhfc3lzcm9vdD1ubworZmkKKworCitsdF9zeXNyb290PQorY2FzZSAke3dpdGhfc3lzcm9vdH0gaW4gIygKKyB5ZXMpCisgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICBsdF9zeXNyb290PWAkQ0MgLS1wcmludC1zeXNyb290IDI+L2Rldi9udWxsYAorICAgZmkKKyAgIDs7ICMoCisgLyopCisgICBsdF9zeXNyb290PWBlY2hvICIkd2l0aF9zeXNyb290IiB8IHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICA7OyAjKAorIG5vfCcnKQorICAgOzsgIygKKyAqKQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7d2l0aF9zeXNyb290fSIgPiY1CiskYXNfZWNobyAiJHt3aXRoX3N5c3Jvb3R9IiA+JjY7IH0KKyAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgc3lzcm9vdCBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGguIiAiJExJTkVOTyIgNQorICAgOzsKK2VzYWMKKworIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke2x0X3N5c3Jvb3Q6LW5vfSIgPiY1CiskYXNfZWNobyAiJHtsdF9zeXNyb290Oi1ub30iID4mNjsgfQorCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbGlidG9vbF9sb2NrOworZmkKKwordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgJGhvc3QgaW4KK2lhNjQtKi1ocHV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICAgKkVMRi0zMiopCisJSFBVWF9JQTY0X01PREU9IjMyIgorCTs7CisgICAgICAqRUxGLTY0KikKKwlIUFVYX0lBNjRfTU9ERT0iNjQiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnI2xpbmUgJyRMSU5FTk8nICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtMzIiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1uMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwkgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKK3MzOTAqLSpsaW51eCp8czM5MCotKnRwZip8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX2NvbXBpbGVcIiI7IH0gPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAgICozMi1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorCSAgICA7OworCSAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisJICAgIDs7CisJICBzMzkweC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisJICAgIDs7CisJICBzcGFyYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICo2NC1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjRfZmJzZCIKKwkgICAgOzsKKwkgIHg4Nl82NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKwkgICAgOzsKKwkgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisJICAgIDs7CisJICBzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKwkgICAgOzsKKwkgIHNwYXJjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfY2NfbmVlZHNfYmVsZis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKK2Vsc2UKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNjsgfQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7Oworc3BhcmMqLSpzb2xhcmlzKikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KKyAgICAgIHllcyopIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIgOzsKKyAgICAgICopCisJaWYgJHtMRC1sZH0gLTY0IC1yIC1vIGNvbmZ0ZXN0Mi5vIGNvbmZ0ZXN0Lm8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7Citlc2FjCisKK25lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1tdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1tdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRNQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdl9wcm9nX01BTklGRVNUX1RPT0w9IiRNQU5JRkVTVF9UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfTUFOSUZFU1RfVE9PTD0iJHthY190b29sX3ByZWZpeH1tdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitNQU5JRkVTVF9UT09MPSRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wKK2lmIHRlc3QgLW4gIiRNQU5JRkVTVF9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1BTklGRVNUX1RPT0wiID4mNQorJGFzX2VjaG8gIiRNQU5JRkVTVF9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19NQU5JRkVTVF9UT09MIjsgdGhlbgorICBhY19jdF9NQU5JRkVTVF9UT09MPSRNQU5JRkVTVF9UT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG10OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X01BTklGRVNUX1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTUFOSUZFU1RfVE9PTD0iJGFjX2N0X01BTklGRVNUX1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9NQU5JRkVTVF9UT09MPSJtdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9NQU5JRkVTVF9UT09MPSRhY19jdl9wcm9nX2FjX2N0X01BTklGRVNUX1RPT0wKK2lmIHRlc3QgLW4gIiRhY19jdF9NQU5JRkVTVF9UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X01BTklGRVNUX1RPT0wiID4mNQorJGFzX2VjaG8gIiRhY19jdF9NQU5JRkVTVF9UT09MIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfTUFOSUZFU1RfVE9PTCIgPSB4OyB0aGVuCisgICAgTUFOSUZFU1RfVE9PTD0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBNQU5JRkVTVF9UT09MPSRhY19jdF9NQU5JRkVTVF9UT09MCisgIGZpCitlbHNlCisgIE1BTklGRVNUX1RPT0w9IiRhY19jdl9wcm9nX01BTklGRVNUX1RPT0wiCitmaQorCit0ZXN0IC16ICIkTUFOSUZFU1RfVE9PTCIgJiYgTUFOSUZFU1RfVE9PTD1tdAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkTUFOSUZFU1RfVE9PTCBpcyBhIG1hbmlmZXN0IHRvb2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJE1BTklGRVNUX1RPT0wgaXMgYSBtYW5pZmVzdCB0b29sLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD1ubworICBlY2hvICIkYXNfbWU6JExJTkVOTzogJE1BTklGRVNUX1RPT0wgJy0/JyIgPiY1CisgICRNQU5JRkVTVF9UT09MICctPycgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgaWYgJEdSRVAgJ01hbmlmZXN0IFRvb2wnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbD15ZXMKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiID4mNjsgfQoraWYgdGVzdCAieCRsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2wiICE9IHh5ZXM7IHRoZW4KKyAgTUFOSUZFU1RfVE9PTD06CitmaQorCisKKworCisKKworICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luKikKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kc3ltdXRpbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kc3ltdXRpbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfRFNZTVVUSUwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N2X3Byb2dfRFNZTVVUSUw9IiREU1lNVVRJTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0RTWU1VVElMPSIke2FjX3Rvb2xfcHJlZml4fWRzeW11dGlsIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0RTWU1VVElMPSRhY19jdl9wcm9nX0RTWU1VVElMCitpZiB0ZXN0IC1uICIkRFNZTVVUSUwiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkRFNZTVVUSUwiID4mNQorJGFzX2VjaG8gIiREU1lNVVRJTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N0X0RTWU1VVElMPSREU1lNVVRJTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRzeW11dGlsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBkc3ltdXRpbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUwrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfRFNZTVVUSUwiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfRFNZTVVUSUw9IiRhY19jdF9EU1lNVVRJTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0RTWU1VVElMPSJkc3ltdXRpbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9EU1lNVVRJTD0kYWNfY3ZfcHJvZ19hY19jdF9EU1lNVVRJTAoraWYgdGVzdCAtbiAiJGFjX2N0X0RTWU1VVElMIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0RTWU1VVElMIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfRFNZTVVUSUwiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9EU1lNVVRJTCIgPSB4OyB0aGVuCisgICAgRFNZTVVUSUw9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgRFNZTVVUSUw9JGFjX2N0X0RTWU1VVElMCisgIGZpCitlbHNlCisgIERTWU1VVElMPSIkYWNfY3ZfcHJvZ19EU1lNVVRJTCIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1ubWVkaXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bm1lZGl0OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19OTUVESVQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk1FRElUIjsgdGhlbgorICBhY19jdl9wcm9nX05NRURJVD0iJE5NRURJVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX05NRURJVD0iJHthY190b29sX3ByZWZpeH1ubWVkaXQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorTk1FRElUPSRhY19jdl9wcm9nX05NRURJVAoraWYgdGVzdCAtbiAiJE5NRURJVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICROTUVESVQiID4mNQorJGFzX2VjaG8gIiROTUVESVQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX05NRURJVCI7IHRoZW4KKyAgYWNfY3RfTk1FRElUPSROTUVESVQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJubWVkaXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG5tZWRpdDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfTk1FRElUKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X05NRURJVCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9IiRhY19jdF9OTUVESVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9OTUVESVQ9Im5tZWRpdCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9OTUVESVQ9JGFjX2N2X3Byb2dfYWNfY3RfTk1FRElUCitpZiB0ZXN0IC1uICIkYWNfY3RfTk1FRElUIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X05NRURJVCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X05NRURJVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X05NRURJVCIgPSB4OyB0aGVuCisgICAgTk1FRElUPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE5NRURJVD0kYWNfY3RfTk1FRElUCisgIGZpCitlbHNlCisgIE5NRURJVD0iJGFjX2N2X3Byb2dfTk1FRElUIgorZmkKKworICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWxpcG8iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9bGlwbzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfTElQTys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRMSVBPIjsgdGhlbgorICBhY19jdl9wcm9nX0xJUE89IiRMSVBPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfTElQTz0iJHthY190b29sX3ByZWZpeH1saXBvIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0xJUE89JGFjX2N2X3Byb2dfTElQTworaWYgdGVzdCAtbiAiJExJUE8iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTElQTyIgPiY1CiskYXNfZWNobyAiJExJUE8iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0xJUE8iOyB0aGVuCisgIGFjX2N0X0xJUE89JExJUE8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsaXBvIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsaXBvOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9MSVBPKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0xJUE8iOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfTElQTz0iJGFjX2N0X0xJUE8iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9MSVBPPSJsaXBvIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0xJUE89JGFjX2N2X3Byb2dfYWNfY3RfTElQTworaWYgdGVzdCAtbiAiJGFjX2N0X0xJUE8iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfTElQTyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0xJUE8iID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9MSVBPIiA9IHg7IHRoZW4KKyAgICBMSVBPPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIExJUE89JGFjX2N0X0xJUE8KKyAgZmkKK2Vsc2UKKyAgTElQTz0iJGFjX2N2X3Byb2dfTElQTyIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfT1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfT1RPT0w9IiRPVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX09UT09MPSIke2FjX3Rvb2xfcHJlZml4fW90b29sIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK09UT09MPSRhY19jdl9wcm9nX09UT09MCitpZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT1RPT0wiID4mNQorJGFzX2VjaG8gIiRPVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT1RPT0wiOyB0aGVuCisgIGFjX2N0X09UT09MPSRPVE9PTAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm90b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfT1RPT0wrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfT1RPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w9IiRhY19jdF9PVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09UT09MPSJvdG9vbCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9PVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9PVE9PTAoraWYgdGVzdCAtbiAiJGFjX2N0X09UT09MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09UT09MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT1RPT0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9PVE9PTCIgPSB4OyB0aGVuCisgICAgT1RPT0w9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT1RPT0w9JGFjX2N0X09UT09MCisgIGZpCitlbHNlCisgIE9UT09MPSIkYWNfY3ZfcHJvZ19PVE9PTCIKK2ZpCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vdG9vbDY0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW90b29sNjQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX09UT09MNjQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkT1RPT0w2NCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19PVE9PTDY0PSIkT1RPT0w2NCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX09UT09MNjQ9IiR7YWNfdG9vbF9wcmVmaXh9b3Rvb2w2NCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitPVE9PTDY0PSRhY19jdl9wcm9nX09UT09MNjQKK2lmIHRlc3QgLW4gIiRPVE9PTDY0IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9UT09MNjQiID4mNQorJGFzX2VjaG8gIiRPVE9PTDY0IiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PVE9PTDY0IjsgdGhlbgorICBhY19jdF9PVE9PTDY0PSRPVE9PTDY0CisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib3Rvb2w2NCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb3Rvb2w2NDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfT1RPT0w2NCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PVE9PTDY0IjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09UT09MNjQ9IiRhY19jdF9PVE9PTDY0IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT1RPT0w2ND0ib3Rvb2w2NCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9PVE9PTDY0PSRhY19jdl9wcm9nX2FjX2N0X09UT09MNjQKK2lmIHRlc3QgLW4gIiRhY19jdF9PVE9PTDY0IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09UT09MNjQiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PVE9PTDY0IiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfT1RPT0w2NCIgPSB4OyB0aGVuCisgICAgT1RPT0w2ND0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBPVE9PTDY0PSRhY19jdF9PVE9PTDY0CisgIGZpCitlbHNlCisgIE9UT09MNjQ9IiRhY19jdl9wcm9nX09UT09MNjQiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIC1zaW5nbGVfbW9kdWxlIGxpbmtlciBmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubworICAgICAgaWYgdGVzdCAteiAiJHtMVF9NVUxUSV9NT0RVTEV9IjsgdGhlbgorCSMgQnkgZGVmYXVsdCB3ZSB3aWxsIGFkZCB0aGUgLXNpbmdsZV9tb2R1bGUgZmxhZy4gWW91IGNhbiBvdmVycmlkZQorCSMgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExUX01VTFRJX01PRFVMRQorCSMgbm9uLWVtcHR5IGF0IGNvbmZpZ3VyZSB0aW1lLCBvciBieSBhZGRpbmcgLW11bHRpX21vZHVsZSB0byB0aGUKKwkjIGxpbmsgZmxhZ3MuCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCWVjaG8gImludCBmb28odm9pZCl7cmV0dXJuIDE7fSIgPiBjb25mdGVzdC5jCisJZWNobyAiJExUQ0MgJExUQ0ZMQUdTICRMREZMQUdTIC1vIGxpYmNvbmZ0ZXN0LmR5bGliIFwKKy1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSBjb25mdGVzdC5jIiA+JjUKKwkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKKyAgICAgICAgX2x0X3Jlc3VsdD0kPworCWlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMDsgdGhlbgorCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyID4mNQorCWZpCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPiY2OyB9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBsaW5rZXIgZmxhZy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KKyAgICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgICAgZWNobyAiX21haW4iID4gY29uZnRlc3Quc3ltCisgICAgICBMREZMQUdTPSIkTERGTEFHUyAtV2wsLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCxjb25mdGVzdC5zeW0iCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PXllcworZWxzZQorICBsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPiY2OyB9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLWZvcmNlX2xvYWQgbGlua2VyIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIC1mb3JjZV9sb2FkIGxpbmtlciBmbGFnLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2xkX2ZvcmNlX2xvYWQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9sZF9mb3JjZV9sb2FkPW5vCisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBmb3JjZWRfbG9hZGVkKCkgeyByZXR1cm4gMjt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgLWMgLW8gY29uZnRlc3QubyBjb25mdGVzdC5jIiA+JjUKKyAgICAgICRMVENDICRMVENGTEFHUyAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMgMj4mNQorICAgICAgZWNobyAiJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8iID4mNQorICAgICAgJEFSIGNydSBsaWJjb25mdGVzdC5hIGNvbmZ0ZXN0Lm8gMj4mNQorICAgICAgZWNobyAiJFJBTkxJQiBsaWJjb25mdGVzdC5hIiA+JjUKKyAgICAgICRSQU5MSUIgbGliY29uZnRlc3QuYSAyPiY1CisgICAgICBjYXQgPiBjb25mdGVzdC5jIDw8IF9MVF9FT0YKK2ludCBtYWluKCkgeyByZXR1cm4gMDt9CitfTFRfRU9GCisgICAgICBlY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtV2wsLWZvcmNlX2xvYWQsLi9saWJjb25mdGVzdC5hIiA+JjUKKyAgICAgICRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1XbCwtZm9yY2VfbG9hZCwuL2xpYmNvbmZ0ZXN0LmEgMj5jb25mdGVzdC5lcnIKKyAgICAgIF9sdF9yZXN1bHQ9JD8KKyAgICAgIGlmIHRlc3QgLWYgY29uZnRlc3QgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMCAmJiAkR1JFUCBmb3JjZWRfbG9hZCBjb25mdGVzdCAyPiYxID4vZGV2L251bGw7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiY1CisgICAgICBmaQorICAgICAgICBybSAtZiBjb25mdGVzdC5lcnIgbGliY29uZnRlc3QuYSBjb25mdGVzdCBjb25mdGVzdC5jCisgICAgICAgIHJtIC1yZiBjb25mdGVzdC5kU1lNCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA+JjY7IH0KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4xLiopCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCisgICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCisgICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAorICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/CisgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCisJMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bOTFdKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKwkxMC5bMDEyXSopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisJMTAuKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKyAgICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfc2luZ2xlX21vZD0nJHNpbmdsZV9tb2R1bGUnCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPScgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sc19saXN0LCRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0nCisgICAgZWxzZQorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IiAmJiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAibm8iOyB0aGVuCisgICAgICBfbHRfZHN5bXV0aWw9J34kRFNZTVVUSUwgJGxpYiB8fCA6JworICAgIGVsc2UKKyAgICAgIF9sdF9kc3ltdXRpbD0KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUKKyRhc19lY2hvICIkQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRjKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIDoKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgcmV0dXJuIDI7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2ZvciBhY19oZWFkZXIgaW4gZGxmY24uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiZGxmY24uaCIgImFjX2N2X2hlYWRlcl9kbGZjbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCisKKworIyBTZXQgb3B0aW9ucworCisKKworICAgICAgICBlbmFibGVfZGxvcGVuPW5vCisKKworICBlbmFibGVfd2luMzJfZGxsPW5vCisKKworICAgICAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zaGFyZWQ7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc2hhcmVkPXllcyA7OworICAgIG5vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc2hhcmVkPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfc2hhcmVkPXllcworZmkKKworCisKKworCisKKworCisKKyAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9zdGF0aWM7IHA9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9zdGF0aWM9eWVzCitmaQorCisKKworCisKKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9waWM7IHBpY19tb2RlPSIkd2l0aHZhbCIKK2Vsc2UKKyAgcGljX21vZGU9ZGVmYXVsdAorZmkKKworCit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPWRlZmF1bHQKKworCisKKworCisKKworICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbDsgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCitmaQorCisKKworCisKKworCisKKworCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGx0bWFpbiIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKKworCisKKworCisKKworCisKKworCisKKworCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG9iamRpciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X29iamRpcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIHJtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X29iamRpciIgPiY1CiskYXNfZWNobyAiJGx0X2N2X29iamRpciIgPiY2OyB9CitvYmpkaXI9JGx0X2N2X29iamRpcgorCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgTFRfT0JKRElSICIkbHRfY3Zfb2JqZGlyLyIKK19BQ0VPRgorCisKKworCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBHbG9iYWwgdmFyaWFibGVzOgorb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIiRjY190ZW1wIiB8ICRTRUQgInMlLiovJSU7IHMlXiRob3N0X2FsaWFzLSUlImAKKworCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZS4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wYXRoX01BR0lDX0NNRCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorW1xcLypdIHwgID86W1xcL10qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFjX2R1bW15PSIvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fWZpbGU7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKworCisKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZpbGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKKyRhc19lY2hvICIkTUFHSUNfQ01EIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0CisKK2x0X3NhdmVfQ0M9IiRDQyIKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0PSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKKworCisKKworCisKKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJFJNIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCisKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBudmNjKikKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0nIC1YY29tcGlsZXIgLWZuby1idWlsdGluJyA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJyA7OworICBlc2FjCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCisgICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0geHllczsgdGhlbgorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKK2Vsc2UKKyAgICA6CitmaQorCitmaQorCisKKworCisKKworICBsdF9wcm9nX2NvbXBpbGVyX3dsPQorbHRfcHJvZ19jb21waWxlcl9waWM9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KKworCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbMy05XSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVhsaW5rZXIgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1YY29tcGlsZXIgLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWM9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgIyBvbGQgSW50ZWwgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisgICAgICBlY2MqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBpY2MgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisgICAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KKyAgICAgIGljYyogfCBpZm9ydCopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIExhaGV5IEZvcnRyYW4gOC4xLgorICAgICAgbGY5NSopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLS1zaGFyZWQnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy0tc3RhdGljJworCTs7CisgICAgICBuYWdmb3IqKQorCSMgTkFHIEZvcnRyYW4gY29tcGlsZXIKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsLVdsLCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1QSUMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworCTs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZnBpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgeGwqIHwgYmd4bCogfCBiZ2YqIHwgbXBpeGwqKQorCSMgSUJNIFhMIEMgOC4wL0ZvcnRyYW4gMTAuMSwgMTEuMSBvbiBQUEMgYW5kIEJsdWVHZW5lCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLXFwaWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1xc3RhdGljbGluaycKKwk7OworICAgICAgKikKKwljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkqU3VuXCBGKiB8ICpTdW4qRm9ydHJhbiopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisJICBsdF9wcm9nX2NvbXBpbGVyX3dsPScnCisJICA7OworCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKwkgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKwkgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgcmRvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZjc3KiB8IGY5MCogfCBmOTUqIHwgc3VuZjc3KiB8IHN1bmY5MCogfCBzdW5mOTUqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctS2NvbmZvcm1fcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctcGljJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKKyAgICA7OworZXNhYworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWM9JGx0X3Byb2dfY29tcGlsZXJfcGljCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljIiA+JjY7IH0KK2x0X3Byb2dfY29tcGlsZXJfcGljPSRsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3JrcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3M9bm8KKyAgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWMgLURQSUMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgICBjYXNlICRsdF9wcm9nX2NvbXBpbGVyX3BpYyBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljIiA7OworICAgICBlc2FjCitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworZmkKKworZmkKKworCisKKworCisKKworCisKKworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgorICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICAgJEVDSE8gIiRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRTRUQgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAorICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrcz15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPiY2OyB9CisKK2lmIHRlc3QgeCIkbHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID0geHllczsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0KK2ZpCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfcHJvZ19jb21waWxlcl9jX28rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJEVDSE8gIiRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIiA+JjUKKyRhc19lY2hvICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNjsgfQorCisKKworCisKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dC4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkUk0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICAkUk0gLXIgY29uZnRlc3QKKyAgICRSTSBjb25mdGVzdCoKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNQorJGFzX2VjaG8gIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY2OyB9CisKKworCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAiID4mNjsgfQorICBoYXJkX2xpbmtzPXllcworICAkUk0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorJGFzX2VjaG8gIiRoYXJkX2xpbmtzIiA+JjY7IH0KKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisKKyAgcnVucGF0aF92YXI9CisgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQorICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KKyAgYXJjaGl2ZV9jbWRzPQorICBhcmNoaXZlX2V4cHN5bV9jbWRzPQorICBjb21waWxlcl9uZWVkc19vYmplY3Q9bm8KKyAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz1ubworICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9CisgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgaGFyZGNvZGVfYXV0b21hdGljPW5vCisgIGhhcmRjb2RlX2RpcmVjdD1ubworICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9bm8KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0KKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKyAgaGFyZGNvZGVfbWludXNfTD1ubworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCisgIGluaGVyaXRfcnBhdGg9bm8KKyAgbGlua19hbGxfZGVwbGlicz11bmtub3duCisgIG1vZHVsZV9jbWRzPQorICBtb2R1bGVfZXhwc3ltX2NtZHM9CisgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9CisgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQorICB0aHJlYWRfc2FmZV9mbGFnX3NwZWM9CisgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIGluY2x1ZGVfZXhwc3ltcz0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBleGNsdWRlX2V4cHN5bXM9J19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKicKKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBpbnRlcml4KikKKyAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQorICAgIHdpdGhfZ251X2xkPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIGxkX3NobGlicz15ZXMKKworICAjIE9uIHNvbWUgdGFyZ2V0cywgR05VIGxkIGlzIGNvbXBhdGlibGUgZW5vdWdoIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIKKyAgIyB0aGF0IHdlJ3JlIGJldHRlciBvZmYgdXNpbmcgdGhlIG5hdGl2ZSBpbnRlcmZhY2UgZm9yIGJvdGguCisgIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPW5vCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorCSMgVGhlIEFJWCBwb3J0IG9mIEdOVSBsZCBoYXMgYWx3YXlzIGFzcGlyZWQgdG8gY29tcGF0aWJpbGl0eQorCSMgd2l0aCB0aGUgbmF0aXZlIGxpbmtlci4gIEhvd2V2ZXIsIGFzIHRoZSB3YXJuaW5nIGluIHRoZSBHTlUgbGQKKwkjIGJsb2NrIHNheXMsIHZlcnNpb25zIGJlZm9yZSAyLjE5LjUqIGNvdWxkbid0IHJlYWxseSBjcmVhdGUgd29ya2luZworCSMgc2hhcmVkIGxpYnJhcmllcywgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJmYWNlIHVzZWQuCisJY2FzZSBgJExEIC12IDI+JjFgIGluCisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi4xOS41KikgOzsKKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLlsyLTldKikgOzsKKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCBbMy05XSopIDs7CisJICAqKQorCSAgICBsdF91c2VfZ251X2xkX2ludGVyZmFjZT15ZXMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICopCisJbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJOzsKKyAgICBlc2FjCisgIGZpCisKKyAgaWYgdGVzdCAiJGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgZWxzZQorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICpHTlVcIGdvbGQqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgICAqXCBbMDFdLiogfCAqXCAyLlswLTldLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4WzMtOV0qKQorICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjE5LCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIGluc3RhbGwgYmludXRpbHMKKyoqKiAyLjIwIG9yIGFib3ZlLCBvciBtb2RpZnkgeW91ciBQQVRIIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZC4KKyoqKiBZb3Ugd2lsbCB0aGVuIG5lZWQgdG8gcmVzdGFydCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLgorCitfTFRfRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCWFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworICAgICAgZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdWyBdL3MvLipbIF1cKFteIF0qXCkvXDEgREFUQS87cy9eLipbIF1fX25tX19cKFteIF0qXClbIF1bXiBdKi9cMSBEQVRBLzsvXklbIF0vZDsvXltBSVRXXVsgXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgZXhjbHVkZV9leHBzeW1zPSdbX10rR0xPQkFMX09GRlNFVF9UQUJMRV98W19dK0dMT0JBTF9fW0ZJRF1fLip8W19dK2hlYWRfW0EtWmEtejAtOV9dK19kbGx8W0EtWmEtejAtOV9dK19kbGxfaW5hbWUnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaGFpa3UqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgaW50ZXJpeFszLTldKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIDs7CisKKyAgICBnbnUqIHwgbGludXgqIHwgdHBmKiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgICAgIHRtcF9kaWV0PW5vCisgICAgICBpZiB0ZXN0ICIkaG9zdF9vcyIgPSBsaW51eC1kaWV0bGliYzsgdGhlbgorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBkaWV0XCAqKSB0bXBfZGlldD15ZXM7OwkjIGxpbnV4LWRpZXRsaWJjIHdpdGggc3RhdGljIGxpbmtpbmcgKCFkaWV0LWR5bikKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEVHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGwgXAorCSAmJiB0ZXN0ICIkdG1wX2RpZXQiID0gbm8KKyAgICAgIHRoZW4KKwl0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwl0bXBfc2hhcmVkZmxhZz0nLXNoYXJlZCcKKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKyAgICAgICAgcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgorCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCisJICA7OworCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisJCQkJCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKKwllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWxmOTUqKQkJCQkjIExhaGV5IEZvcnRyYW4gOC4xCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKwkgIHRtcF9zaGFyZWRmbGFnPSctLXNoYXJlZCcgOzsKKwl4bFtjQ10qIHwgYmd4bFtjQ10qIHwgbXBpeGxbY0NdKikgIyBJQk0gWEwgQyA4LjAgb24gUFBDIChkZWFsIHdpdGggeGxmIGJlbG93KQorCSAgdG1wX3NoYXJlZGZsYWc9Jy1xbWtzaHJvYmonCisJICB0bXBfYWRkZmxhZz0gOzsKKwludmNjKikJIyBDdWRhIENvbXBpbGVyIERyaXZlciAyLjIKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGNvbXBpbGVyX25lZWRzX29iamVjdD15ZXMKKwkgIDs7CisJZXNhYworCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45CisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGNvbXBpbGVyX25lZWRzX29iamVjdD15ZXMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCWVzYWMKKwlhcmNoaXZlX2NtZHM9JyRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKyAgICAgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisgICAgICAgIGZpCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCXhsZiogfCBiZ2YqIHwgYmd4bGYqIHwgbXBpeGxmKikKKwkgICMgSUJNIFhMIEZvcnRyYW4gMTAuMSBvbiBQUEMgY2Fubm90IGNyZWF0ZSBzaGFyZWQgbGlicyBpdHNlbGYKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9Jy1ycGF0aCAkbGliZGlyJworCSAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtbyAkbGliJworCSAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICBmaQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisgICAgICAgIGxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1vICRsaWInCisJd2xhcmM9CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCWxkX3NobGlicz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCisJbGRfc2hsaWJzPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBSZWxlYXNlcyBvZiB0aGUgR05VIGxpbmtlciBwcmlvciB0byAyLjE2LjkxLjAuMyBjYW4gbm90CisqKiogcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU0NPIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuMTYuOTEuMC4zIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKwk7OworCSopCisJICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCisJICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQorCSAgIyBEVF9SVU5QQVRIIHRhZyBmcm9tIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMuICBCdXQgZG9pbmcgc28KKwkgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCisJICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICBlbHNlCisJICAgIGxkX3NobGlicz1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0gbm87IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgIGZpCisgIGVsc2UKKyAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFs0LTldKikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJIyBBbHNvLCBBSVggbm0gdHJlYXRzIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGxpa2Ugb3RoZXIgZ2xvYmFsCisJIyBkZWZpbmVkIHN5bWJvbHMsIHdoZXJlYXMgR05VIG5tIG1hcmtzIHRoZW0gYXMgIlciLgorCWlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChzdWJzdHIoXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4WzUtOV0qKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgZmkKKwkgIGRvbmUKKwkgIDs7CisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIGFyY2hpdmVfY21kcz0nJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlPXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICBmaWxlX2xpc3Rfc3BlYz0nJHt3bH0tZiwnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICBoYXJkY29kZV9taW51c19MPXllcworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKwkgIGZpCisJICA7OworCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCWZpCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1iZXhwYWxsJworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPSctYmVyb2snCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICAgIGlmIHRlc3QgIiR7bHRfY3ZfYWl4X2xpYnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoCitlbHNlCisgIGlmICR7bHRfY3ZfYWl4X2xpYnBhdGhfKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPSIvdXNyL2xpYjovbGliIgorICBmaQorCitmaQorCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aF8KK2ZpCisKKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKyAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iLXogbm9kZWZzIgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAjIGVtcHR5IGV4ZWN1dGFibGUuCisJIGlmIHRlc3QgIiR7bHRfY3ZfYWl4X2xpYnBhdGgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYWl4X2xpYnBhdGg9JGx0X2N2X2FpeF9saWJwYXRoCitlbHNlCisgIGlmICR7bHRfY3ZfYWl4X2xpYnBhdGhfKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKKyAgbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkgIC9eMC8geworCSAgICAgIHMvXjAgICpcKFteIF0qXCkgKiQvXDEvCisJICAgICAgcAorCSAgfQorICAgICAgfScKKyAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICAjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHRlc3QgLXogIiRsdF9jdl9haXhfbGlicGF0aF8iOyB0aGVuCisgICAgbHRfY3ZfYWl4X2xpYnBhdGhfPSIvdXNyL2xpYjovbGliIgorICBmaQorCitmaQorCisgIGFpeF9saWJwYXRoPSRsdF9jdl9haXhfbGlicGF0aF8KK2ZpCisKKwkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBub191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm5vdG9rJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1iZXJvaycKKwkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgZWxzZQorCSAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyRjb252ZW5pZW5jZScKKwkgIGZpCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPScnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBic2RpWzQ1XSopCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9LXJkeW5hbWljCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGNsKikKKwkjIE5hdGl2ZSBNU1ZDCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCWFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKwlmaWxlX2xpc3Rfc3BlYz0nQCcKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgLVdsLC1kbGx+bGlua25hbWVzPScKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgICBzZWQgLW4gLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyAtZSAnMVxcXCFwJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgZWxzZQorCSAgICBzZWQgLWUgJ3MvXFxcXFxcXCguKlxcXFxcXFwpLy1saW5rXFxcIC1FWFBPUlQ6XFxcXFxcXDEvJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwOworCSAgZml+CisJICAkQ0MgLW8gJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzICJAJHRvb2xfb3V0cHV0X29iamRpciRzb25hbWUuZXhwIiAtV2wsLURMTCwtSU1QTElCOiIkdG9vbF9vdXRwdXRfb2JqZGlyJGxpYm5hbWUuZGxsLmxpYiJ+CisJICBsaW5rbmFtZXM9JworCSMgVGhlIGxpbmtlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgc3RhdGljIGxpYiBpZiB3ZSBidWlsZCBhIERMTC4KKwkjIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgKT0ndHJ1ZScKKwllbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzPXllcworCWV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXVsgXS9zLy4qWyBdXChbXiBdKlwpL1wxLERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddWyBdL3MvLipbIF0vLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKwkjIERvbid0IHVzZSByYW5saWIKKwlvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCisJcG9zdGxpbmtfY21kcz0nbHRfb3V0cHV0ZmlsZT0iQE9VVFBVVEAifgorCSAgbHRfdG9vbF9vdXRwdXRmaWxlPSJAVE9PTF9PVVRQVVRAIn4KKwkgIGNhc2UgJGx0X291dHB1dGZpbGUgaW4KKwkgICAgKi5leGV8Ki5FWEUpIDs7CisJICAgICopCisJICAgICAgbHRfb3V0cHV0ZmlsZT0iJGx0X291dHB1dGZpbGUuZXhlIgorCSAgICAgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iJGx0X3Rvb2xfb3V0cHV0ZmlsZS5leGUiCisJICAgICAgOzsKKwkgIGVzYWN+CisJICBpZiB0ZXN0ICIkTUFOSUZFU1RfVE9PTCIgIT0gIjoiICYmIHRlc3QgLWYgIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsgdGhlbgorCSAgICAkTUFOSUZFU1RfVE9PTCAtbWFuaWZlc3QgIiRsdF90b29sX291dHB1dGZpbGUubWFuaWZlc3QiIC1vdXRwdXRyZXNvdXJjZToiJGx0X3Rvb2xfb3V0cHV0ZmlsZSIgfHwgZXhpdCAxOworCSAgICAkUk0gIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsKKwkgIGZpJworCTs7CisgICAgICAqKQorCSMgQXNzdW1lIE1TVkMgd3JhcHBlcgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGZ1bmNfZWNob19hbGwgIiRkZXBsaWJzIiB8ICRTRUQgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKwkjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorCW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J3RydWUnCisJIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKwlvbGRfYXJjaGl2ZV9jbWRzPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisJZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisKKworICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgaGFyZGNvZGVfYXV0b21hdGljPXllcworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCisgIGlmIHRlc3QgIiRsdF9jdl9sZF9mb3JjZV9sb2FkIiA9ICJ5ZXMiOyB0aGVuCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9J2Bmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSAke3dsfS1mb3JjZV9sb2FkLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgJworICBlbHNlCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JycKKyAgZmkKKyAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRfbHRfZGFyX2FsbG93X3VuZGVmaW5lZCIKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgaWZvcnQqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9eWVzIDs7CisgICAgICopIF9sdF9kYXJfY2FuX3NoYXJlZD0kR0NDIDs7CisgIGVzYWMKKyAgaWYgdGVzdCAiJF9sdF9kYXJfY2FuX3NoYXJlZCIgPSAieWVzIjsgdGhlbgorICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWZ1bmNfZWNob19hbGwKKyAgICBhcmNoaXZlX2NtZHM9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgbW9kdWxlX2NtZHM9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICR7X2x0X2Rhcl9zaW5nbGVfbW9kfSR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisKKyAgZWxzZQorICBsZF9zaGxpYnM9bm8KKyAgZmkKKworICAgICAgOzsKKworICAgIGRndXgqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgZnJlZWJzZDEqKQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyKikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgICA7OworCisgICAgaHB1eDEwKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JytiICRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisJaGFyZGNvZGVfZGlyZWN0PXllcworCWhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT15ZXMKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwloYXJkY29kZV9taW51c19MPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCisJICAjIE9sZGVyIHZlcnNpb25zIG9mIHRoZSAxMS4wMCBjb21waWxlciBkbyBub3QgdW5kZXJzdGFuZCAtYiB5ZXQKKwkgICMgKEhQOTI0NTMtMDEgQS4xMS4wMS4yMCBkb2Vzbid0LCBIUDkyNDUzLTAxIEIuMTEuWC4zNTE3NS0zNTE3Ni5HUCBkb2VzKQorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAkQ0MgdW5kZXJzdGFuZHMgLWIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgJENDIHVuZGVyc3RhbmRzIC1iLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X3Byb2dfY29tcGlsZXJfX2IrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX19iPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgLWIiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkRUNITyAiJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFNFRCAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfX2I9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIC1yIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbHRfY3ZfcHJvZ19jb21waWxlcl9fYiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID4mNjsgfQorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfX2IiID0geHllczsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCitlbHNlCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworZmkKKworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgaGFyZGNvZGVfZGlyZWN0PW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJICA7OworCSopCisJICBoYXJkY29kZV9kaXJlY3Q9eWVzCisJICBoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKwkjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgbGFuZ3VhZ2VzLCBzbyBubyBwZXItdGFnIGNhY2hlIHZhcmlhYmxlLgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgJGhvc3Rfb3MgbGlua2VyIGFjY2VwdHMgLWV4cG9ydGVkX3N5bWJvbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwkgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisJICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworaW50IGZvbyAodm9pZCkgeyByZXR1cm4gMDsgfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sPXllcworZWxzZQorICBsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbCIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2lyaXhfZXhwb3J0ZWRfc3ltYm9sIiA+JjY7IH0KKwlpZiB0ZXN0ICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID0geWVzOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAke3dsfS1leHBvcnRzX2ZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwlmaQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBpbmhlcml0X3JwYXRoPXllcworICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgIDs7CisKKyAgICBvcGVuYnNkKikKKyAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJaGFyZGNvZGVfZGlyZWN0PXllcworCWhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKwloYXJkY29kZV9kaXJlY3RfYWJzb2x1dGU9eWVzCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorCSAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworCSAgICAgOzsKKwkgICAqKQorCSAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICAgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZWxzZQorCWxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhcmNoaXZlX2NtZHM9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9J25vJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworCisgICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IHByaW50ZiAiJXNcXG4iICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAkY29tcGlsZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JFJNICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSdubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiBkZWZzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisgICAgICBlbHNlCisJY2FzZSBgJENDIC1WIDI+JjFgIGluCisJKiJDb21waWxlcnMgNS4wIiopCisJICB3bGFyYz0nJworCSAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJKikKKwkgIHdsYXJjPScke3dsfScKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworICAgICAgKikKKwkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuICBHQ0MgZGlzY2FyZHMgaXQgd2l0aG91dCBgJHdsJywKKwkjIGJ1dCBpcyBjYXJlZnVsIGVub3VnaCBub3QgdG8gcmVvcmRlci4KKwkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnM9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCisgICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0teixub2RlZnMnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgICopCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCB4JGhvc3RfdmVuZG9yID0geHNuaTsgdGhlbgorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsZF9zaGxpYnMiID4mNQorJGFzX2VjaG8gIiRsZF9zaGxpYnMiID4mNjsgfQordGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorCisKKworCisKKworCisKKworCisKKworCisKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sYyIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBhcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHMgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gIiA+JjY7IH0KK2lmICR7bHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAkUk0gY29uZnRlc3QqCisJZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKwlpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisJICBzb25hbWU9Y29uZnRlc3QKKwkgIGxpYj1jb25mdGVzdAorCSAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisJICBkZXBsaWJzPQorCSAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKKwkgIHBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpYworCSAgY29tcGlsZXJfZmxhZ3M9LXYKKwkgIGxpbmtlcl9mbGFncz0tdgorCSAgdmVyc3RyaW5nPQorCSAgb3V0cHV0X29iamRpcj0uCisJICBsaWJuYW1lPWNvbmZ0ZXN0CisJICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisJICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiOyB9ID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorCSAgdGhlbgorCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworCSAgZWxzZQorCSAgICBsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKwkgIGZpCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorCWZpCisJJFJNIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiA+JjY7IH0KKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPSRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICIgPiY2OyB9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7CisgICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKKyAgZXNhYworICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWRfc3RyaXBfZXE9InMsPVwoW0EtWmEtel06XCksXDEsZyIgOzsKKyAgICAqKSBsdF9zZWRfc3RyaXBfZXE9InMsPS8sLyxnIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICRsdF9zZWRfc3RyaXBfZXFgCisgIGNhc2UgJGx0X3NlYXJjaF9wYXRoX3NwZWMgaW4KKyAgKlw7KikKKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgJ3MvOy8gL2cnYAorICAgIDs7CisgICopCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgOzsKKyAgZXNhYworICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAorICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KKyAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9CisgIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCisgIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KKyAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KKyAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCisgICAgZWxzZQorICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCisJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCisgICAgZmkKKyAgZG9uZQorICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIiB8IGF3ayAnCitCRUdJTiB7UlM9IiAiOyBGUz0iL3xcbiI7fSB7CisgIGx0X2Zvbz0iIjsKKyAgbHRfY291bnQ9MDsKKyAgZm9yIChsdF9pID0gTkY7IGx0X2kgPiAwOyBsdF9pLS0pIHsKKyAgICBpZiAoJGx0X2kgIT0gIiIgJiYgJGx0X2kgIT0gIi4iKSB7CisgICAgICBpZiAoJGx0X2kgPT0gIi4uIikgeworICAgICAgICBsdF9jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGx0X2NvdW50ID09IDApIHsKKyAgICAgICAgICBsdF9mb289Ii8iICRsdF9pIGx0X2ZvbzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsdF9jb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChsdF9mb28gIT0gIiIpIHsgbHRfZnJlcVtsdF9mb29dKys7IH0KKyAgaWYgKGx0X2ZyZXFbbHRfZm9vXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQorfSdgCisgICMgQVdLIHByb2dyYW0gYWJvdmUgZXJyb25lb3VzbHkgcHJlcGVuZHMgJy8nIHRvIEM6L2Rvcy9wYXRocworICAjIGZvciB0aGVzZSBob3N0cy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG1pbmd3KiB8IGNlZ2NjKikgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8XAorICAgICAgJFNFRCAncywvXChbQS1aYS16XTpcKSxcMSxnJ2AgOzsKKyAgZXNhYworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkbHRfTkwyU1BgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4WzQtOV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICA7OworICBlc2FjCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRjY19iYXNlbmFtZSBpbgorICB5ZXMsKikKKyAgICAjIGdjYworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGlmIHRlc3QgLW4gJ1wnJyRzdHJpcG1lJ1wnJyAmJiB0ZXN0IC1uICdcJyckc3RyaXBsaWInXCcnOyB0aGVuCisgICAgICAgIGV2YWwgJ1wnJyRzdHJpcGxpYiBcJGRsZGlyLyRkbG5hbWUnXCcnIHx8IGV4aXQgXCQ/OworICAgICAgZmknCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xpYi93MzJhcGkiCisgICAgICA7OworICAgIG1pbmd3KiB8IGNlZ2NjKikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAgIDs7CisKKyAgKixjbCopCisgICAgIyBOYXRpdmUgTVNWQworICAgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5kbGwubGliJworCisgICAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgICBtaW5ndyopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9CisgICAgICBsdF9zYXZlX2lmcz0kSUZTCisgICAgICBJRlM9JzsnCisgICAgICBmb3IgbHRfcGF0aCBpbiAkTElCCisgICAgICBkbworICAgICAgICBJRlM9JGx0X3NhdmVfaWZzCisgICAgICAgICMgTGV0IERPUyB2YXJpYWJsZSBleHBhbnNpb24gcHJpbnQgdGhlIHNob3J0IDguMyBzdHlsZSBmaWxlIG5hbWUuCisgICAgICAgIGx0X3BhdGg9YGNkICIkbHRfcGF0aCIgMj4vZGV2L251bGwgJiYgY21kIC8vQyAiZm9yICVpIGluICgiLiIpIGRvIEBlY2hvICV+c2kiYAorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgJGx0X3BhdGgiCisgICAgICBkb25lCisgICAgICBJRlM9JGx0X3NhdmVfaWZzCisgICAgICAjIENvbnZlcnQgdG8gTVNZUyBzdHlsZS4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgc2VkIC1lICdzfFxcXFx8L3xnJyAtZSAnc3wgXFwoW2EtekEtWl1cXCk6fCAvXFwxfGcnIC1lICdzfF4gfHwnYAorICAgICAgOzsKKyAgICBjeWd3aW4qKQorICAgICAgIyBDb252ZXJ0IHRvIHVuaXggZm9ybSwgdGhlbiB0byBkb3MgZm9ybSwgdGhlbiBiYWNrIHRvIHVuaXggZm9ybQorICAgICAgIyBidXQgdGhpcyB0aW1lIGRvcyBzdHlsZSAobm8gc3BhY2VzISkgc28gdGhhdCB0aGUgdW5peCBmb3JtIGxvb2tzCisgICAgICAjIGxpa2UgL2N5Z2RyaXZlL2MvUFJPR1JBfjE6L2N5Z2RyLi4uCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJExJQiJgCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGN5Z3BhdGggLS1wYXRoIC0tZG9zICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiAyPi9kZXYvbnVsbGAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICA7OworICAgICopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRMSUIiCisgICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkR1JFUCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgICMgRklYTUU6IGZpbmQgdGhlIHNob3J0IG5hbWUgb3IgdGhlIHBhdGggY29tcG9uZW50cywgYXMgc3BhY2VzIGFyZQorICAgICAgIyBjb21tb24uIChlLmcuICJQcm9ncmFtIEZpbGVzIiAtPiAiUFJPR1JBfjEiKQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJFJNIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGluay5leGUnCisgICAgOzsKKworICAqKQorICAgICMgQXNzdW1lIE1TVkMgd3JhcHBlcgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKyAgZXNhYworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCisKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICAqKSAjIGZyb20gNC42IG9uLCBhbmQgRHJhZ29uRmx5CisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitoYWlrdSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBydW50aW1lX2xvYWRlciIKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvYm9vdC9ob21lL2NvbmZpZy9saWIgL2Jvb3QvY29tbW9uL2xpYiAvYm9vdC9zeXN0ZW0vbGliJworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LCAuLi4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgICMgb3IgZmFpbHMgb3V0cmlnaHQsIHNvIG92ZXJyaWRlIGF0b21pY2FsbHk6CisgIGluc3RhbGxfb3ZlcnJpZGVfbW9kZT01NTUKKyAgOzsKKworaW50ZXJpeFszLTldKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBpZiAke2x0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIHNhdmVfTERGTEFHUz0kTERGTEFHUworICAgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkbHRfcHJvZ19jb21waWxlcl93bFwiOyBcCisJIExERkxBR1M9XCJcJExERkxBR1MgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIiIKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgaWYgICgkT0JKRFVNUCAtcCBjb25mdGVzdCRhY19leGVleHQpIDI+L2Rldi9udWxsIHwgZ3JlcCAiUlVOUEFUSC4qJGxpYmRpciIgPi9kZXYvbnVsbDsgdGhlbiA6CisgIGx0X2N2X3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKK2ZpCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBMREZMQUdTPSRzYXZlX0xERkxBR1MKKyAgICBsaWJkaXI9JHNhdmVfbGliZGlyCisKK2ZpCisKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyAyPi9kZXYvbnVsbCIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZztzLyIvL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCisqbnRvKiB8ICpxbngqKQorICB2ZXJzaW9uX3R5cGU9cW54CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdsZHFueC5zbycKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKQluZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikJCQkJbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworcmRvcyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordHBmKikKKyAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorJGFzX2VjaG8gIiRkeW5hbWljX2xpbmtlciIgPiY2OyB9Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gIiA+JjY7IH0KK2hhcmRjb2RlX2FjdGlvbj0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiB8fAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWMiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGVudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb24iID4mNQorJGFzX2VjaG8gIiRoYXJkY29kZV9hY3Rpb24iID4mNjsgfQorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluayB8fAorICAgdGVzdCAiJGluaGVyaXRfcnBhdGgiID0geWVzOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKworCisKKworICBpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisKK2ZpCisKKyAgICA7OworCisgICopCisgICAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic2hsX2xvYWQiICJhY19jdl9mdW5jX3NobF9sb2FkIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3NobF9sb2FkIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzaGxfbG9hZCBpbiAtbGRsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2RsZF9zaGxfbG9hZCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzaGxfbG9hZCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCitlbHNlCisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImRsb3BlbiIgImFjX2N2X2Z1bmNfZGxvcGVuIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2Rsb3BlbiIgPSB4eWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9saWJfZGxfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGxfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3N2bGRfZGxvcGVuPXllcworZWxzZQorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA9IHh5ZXM7IHRoZW4gOgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCIKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9kbGRfZGxkX2xpbmsrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxkX2xpbmsgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBkbGRfbGluayAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPXllcworZWxzZQorICBhY19jdl9saWJfZGxkX2RsZF9saW5rPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGxkX2RsZF9saW5rIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPSB4eWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgorZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9kbG9wZW5fc2VsZis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2xpbmUgJExJTkVOTyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2hlbiAtZnZpc2JpbGl0eT1oaWRkZW4gaXMgdXNlZCwgYXNzdW1lIHRoZSBjb2RlIGhhcyBiZWVuIGFubm90YXRlZAorICAgY29ycmVzcG9uZGluZ2x5IGZvciB0aGUgc3ltYm9scyBuZWVkZWQuICAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gMykpCitpbnQgZm5vcmQgKCkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CisjZW5kaWYKKworaW50IGZub3JkICgpIHsgcmV0dXJuIDQyOyB9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpICBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgICAgICBlbHNlIHB1dHMgKGRsZXJyb3IgKCkpOworCX0KKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9CitfTFRfRU9GCisgIGlmIHsgeyBldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiRhY19saW5rXCIiOyB9ID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mNSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZj1ubyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKKworCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZiIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjY7IH0KKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICIgPiY2OyB9CitpZiAke2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdoZW4gLWZ2aXNiaWxpdHk9aGlkZGVuIGlzIHVzZWQsIGFzc3VtZSB0aGUgY29kZSBoYXMgYmVlbiBhbm5vdGF0ZWQKKyAgIGNvcnJlc3BvbmRpbmdseSBmb3IgdGhlIHN5bWJvbHMgbmVlZGVkLiAgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDMpKQoraW50IGZub3JkICgpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpOworI2VuZGlmCisKK2ludCBmbm9yZCAoKSB7IHJldHVybiA0MjsgfQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZQorICAgICAgICB7CisJICBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSAgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAgICAgZWxzZSBwdXRzIChkbGVycm9yICgpKTsKKwl9CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICByZXR1cm4gc3RhdHVzOworfQorX0xUX0VPRgorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfbGlua1wiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JjUgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY1CiskYXNfZWNobyAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2OyB9CisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlLi4uICIgPiY2OyB9CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgZmkKKyAgICA7OworICAqKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgIDs7CisgIGVzYWMKK2ZpCisKKworCisKKworCisKKworCisKKworCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjYW5fYnVpbGRfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkY2FuX2J1aWxkX3NoYXJlZCIgPiY2OyB9CisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbNC05XSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3NoYXJlZCIgPiY2OyB9CisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKKyRhc19lY2hvICIkZW5hYmxlX3N0YXRpYyIgPiY2OyB9CisKKworCisKK2ZpCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworCisKKworCisKKworCisKKworCisKKworICAgICAgICBhY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgbGlidG9vbCIKKworCisKKworIyBPbmx5IGV4cGFuZCBvbmNlOgorCisKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVuZG9yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlbmRvci4uLiAiID4mNjsgfQoraWYgJHtheF9jdl9jX2NvbXBpbGVyX3ZlbmRvcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGF4X2N2X2NfY29tcGlsZXJfdmVuZG9yPXVua25vd24KKyAgIyBub3RlOiBkb24ndCBjaGVjayBmb3IgZ2NjIGZpcnN0IHNpbmNlIHNvbWUgb3RoZXIgY29tcGlsZXJzIGRlZmluZSBfX0dOVUNfXworICBmb3IgdmVudGVzdCBpbiBpbnRlbDpfX0lDQyxfX0VDQyxfX0lOVEVMX0NPTVBJTEVSIGlibTpfX3hsY19fLF9feGxDX18sX19JQk1DX18sX19JQk1DUFBfXyBwYXRoc2NhbGU6X19QQVRIQ0NfXyxfX1BBVEhTQ0FMRV9fIGNsYW5nOl9fY2xhbmdfXyBnbnU6X19HTlVDX18gc3VuOl9fU1VOUFJPX0MsX19TVU5QUk9fQ0MgaHA6X19IUF9jYyxfX0hQX2FDQyBkZWM6X19ERUNDLF9fREVDQ1hYLF9fREVDQ19WRVIsX19ERUNDWFhfVkVSIGJvcmxhbmQ6X19CT1JMQU5EQ19fLF9fVFVSQk9DX18gY29tZWF1Ol9fQ09NT19fIGNyYXk6X0NSQVlDIGthaTpfX0tDQyBsY2M6X19MQ0NfXyBtZXRyb3dlcmtzOl9fTVdFUktTX18gc2dpOl9fc2dpLHNnaSBtaWNyb3NvZnQ6X01TQ19WRVIgd2F0Y29tOl9fV0FUQ09NQ19fIHBvcnRsYW5kOl9fUEdJOyBkbworICAgIHZlbmNwcD0iZGVmaW5lZCgiYGVjaG8gJHZlbnRlc3QgfCBjdXQgLWQ6IC1mMiB8IHNlZCAncy8sLykgfHwgZGVmaW5lZCgvZydgIikiCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworI2lmICEoJHZlbmNwcCkKKyAgICAgIHRoaXNpc2FuZXJyb3I7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGF4X2N2X2NfY29tcGlsZXJfdmVuZG9yPWBlY2hvICR2ZW50ZXN0IHwgY3V0IC1kOiAtZjFgOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2N2X2NfY29tcGlsZXJfdmVuZG9yIiA+JjUKKyRhc19lY2hvICIkYXhfY3ZfY19jb21waWxlcl92ZW5kb3IiID4mNjsgfQorCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXBvcnRhYmxlLWJpbmFyeSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9wb3J0YWJsZV9iaW5hcnkrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9wb3J0YWJsZV9iaW5hcnk7IGFjeF9tYXhvcHRfcG9ydGFibGU9JHdpdGh2YWwKK2Vsc2UKKyAgYWN4X21heG9wdF9wb3J0YWJsZT1ubworZmkKKworCisjIFRyeSB0byBkZXRlcm1pbmUgImdvb2QiIG5hdGl2ZSBjb21waWxlciBmbGFncyBpZiBub25lIHNwZWNpZmllZCB2aWEgQ0ZMQUdTCitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiICE9ICJzZXQiOyB0aGVuCisgIENGTEFHUz0iIgorICBjYXNlICRheF9jdl9jX2NvbXBpbGVyX3ZlbmRvciBpbgorICAgIGRlYykgQ0ZMQUdTPSItbmV3YyAtdzAgLU81IC1hbnNpX2FsaWFzIC1hbnNpX2FyZ3MgLWZwX3Jlb3JkZXIgLXR1bmUgaG9zdCIKKwkgaWYgdGVzdCAieCRhY3hfbWF4b3B0X3BvcnRhYmxlIiA9IHhubzsgdGhlbgorICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLWFyY2ggaG9zdCIKKyAgICAgICAgIGZpOzsKKworICAgIHN1bikgQ0ZMQUdTPSItbmF0aXZlIC1mYXN0IC14TzUgLWRhbGlnbiIKKwkgaWYgdGVzdCAieCRhY3hfbWF4b3B0X3BvcnRhYmxlIiA9IHh5ZXM7IHRoZW4KKwkgICBDRkxBR1M9IiRDRkxBR1MgLXhhcmNoPWdlbmVyaWMiCisgICAgICAgICBmaTs7CisKKyAgICBocCkgIENGTEFHUz0iK09hbGwgK09wdHJzX2Fuc2kgK0RTbmF0aXZlIgorCSBpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geHllczsgdGhlbgorCSAgIENGTEFHUz0iJENGTEFHUyArREFwb3J0YWJsZSIKKwkgZmk7OworCisgICAgaWJtKSBpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geG5vOyB0aGVuCisgICAgICAgICAgIHhsY19vcHQ9Ii1xYXJjaD1hdXRvIC1xdHVuZT1hdXRvIgorCSBlbHNlCisgICAgICAgICAgIHhsY19vcHQ9Ii1xdHVuZT1hdXRvIgorCSBmaQorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJHhsY19vcHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJHhsY19vcHQuLi4gIiA+JjY7IH0KK2F4X3NhdmVfRkxBR1M9JENGTEFHUworICAgQ0ZMQUdTPSIkeGxjX29wdCIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsIGAkYXNfZWNobyAiYXhfY3ZfY19mbGFnc18keGxjX29wdCIgfCAkYXNfdHJfc2hgPXllcworZWxzZQorICBldmFsIGAkYXNfZWNobyAiYXhfY3ZfY19mbGFnc18keGxjX29wdCIgfCAkYXNfdHJfc2hgPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBDRkxBR1M9JGF4X3NhdmVfRkxBR1MKK2V2YWwgYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3M9JGAkYXNfZWNobyAiYXhfY3ZfY19mbGFnc18keGxjX29wdCIgfCAkYXNfdHJfc2hgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzIiA+JjUKKyRhc19lY2hvICIkYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3MiID4mNjsgfQoraWYgdGVzdCAieCRheF9jaGVja19jb21waWxlcl9mbGFncyIgPSB4eWVzOyB0aGVuCisJQ0ZMQUdTPSItTzMgLXFhbnNpYWxpYXMgLXcgJHhsY19vcHQiCitlbHNlCisJQ0ZMQUdTPSItTzMgLXFhbnNpYWxpYXMgLXciCisgICAgICAgICAgICAgICAgZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogIFlvdSBzZWVtIHRvIGhhdmUgdGhlIElCTSAgQyBjb21waWxlci4gIEl0IGlzICAgICAgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICByZWNvbW1lbmRlZCBmb3IgYmVzdCBwZXJmb3JtYW5jZSB0aGF0IHlvdSB1c2U6ICAgICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogICAgQ0ZMQUdTPS1PMyAtcWFyY2g9eHh4IC1xdHVuZT14eHggLXFhbnNpYWxpYXMgLXcgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICAgICAgICAgICAgICAgICAgICAgIF5eXiAgICAgICAgXl5eICAgICAgICAgICAgICAgICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgd2hlcmUgeHh4IGlzIHB3cjIsIHB3cjMsIDYwNCwgb3Igd2hhdGV2ZXIga2luZCBvZiAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogIENQVSB5b3UgaGF2ZS4gIChTZXQgdGhlIENGTEFHUyBlbnZpcm9ubWVudCB2YXIuICAgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICBhbmQgcmUtcnVuIGNvbmZpZ3VyZS4pICBGb3IgbW9yZSBpbmZvLCBtYW4gY2MuICAgICoiCisgICAgICAgICAgICAgICAgZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZmkKKworICAgICAgICAgOzsKKworICAgIGludGVsKSBDRkxBR1M9Ii1PMyAtYW5zaV9hbGlhcyIKKwlpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geG5vOyB0aGVuCisJICBpY2NfYXJjaGZsYWc9dW5rbm93bgorCSAgaWNjX2ZsYWdzPSIiCisJICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBpNjg2Knx4ODZfNjQqKQorICAgICAgICAgICAgICAjIGljYyBhY2NlcHRzIGdjYyBhc3NlbWJseSBzeW50YXgsIHNvIHRoZXNlIHNob3VsZCB3b3JrOgorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHg4NiBjcHVpZCAwIG91dHB1dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgeDg2IGNwdWlkIDAgb3V0cHV0Li4uICIgPiY2OyB9CitpZiAke2F4X2N2X2djY194ODZfY3B1aWRfMCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wPXVua25vd24KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKKworICAgICBpbnQgb3AgPSAwLCBlYXgsIGVieCwgZWN4LCBlZHg7CisgICAgIEZJTEUgKmY7CisgICAgICBfX2FzbV9fKCJjcHVpZCIKKyAgICAgICAgOiAiPWEiIChlYXgpLCAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpCisgICAgICAgIDogImEiIChvcCkpOworICAgICBmID0gZm9wZW4oImNvbmZ0ZXN0X2NwdWlkIiwgInciKTsgaWYgKCFmKSByZXR1cm4gMTsKKyAgICAgZnByaW50ZihmLCAiJXg6JXg6JXg6JXhcbiIsIGVheCwgZWJ4LCBlY3gsIGVkeCk7CisgICAgIGZjbG9zZShmKTsKKyAgICAgcmV0dXJuIDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGF4X2N2X2djY194ODZfY3B1aWRfMD1gY2F0IGNvbmZ0ZXN0X2NwdWlkYDsgcm0gLWYgY29uZnRlc3RfY3B1aWQKK2Vsc2UKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wPXVua25vd247IHJtIC1mIGNvbmZ0ZXN0X2NwdWlkCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wIiA+JjUKKyRhc19lY2hvICIkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wIiA+JjY7IH0KK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgeDg2IGNwdWlkIDEgb3V0cHV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB4ODYgY3B1aWQgMSBvdXRwdXQuLi4gIiA+JjY7IH0KK2lmICR7YXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBheF9jdl9nY2NfeDg2X2NwdWlkXzE9dW5rbm93bgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisgICAgIGludCBvcCA9IDEsIGVheCwgZWJ4LCBlY3gsIGVkeDsKKyAgICAgRklMRSAqZjsKKyAgICAgIF9fYXNtX18oImNwdWlkIgorICAgICAgICA6ICI9YSIgKGVheCksICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkKKyAgICAgICAgOiAiYSIgKG9wKSk7CisgICAgIGYgPSBmb3BlbigiY29uZnRlc3RfY3B1aWQiLCAidyIpOyBpZiAoIWYpIHJldHVybiAxOworICAgICBmcHJpbnRmKGYsICIleDoleDoleDoleFxuIiwgZWF4LCBlYngsIGVjeCwgZWR4KTsKKyAgICAgZmNsb3NlKGYpOworICAgICByZXR1cm4gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xPWBjYXQgY29uZnRlc3RfY3B1aWRgOyBybSAtZiBjb25mdGVzdF9jcHVpZAorZWxzZQorICBheF9jdl9nY2NfeDg2X2NwdWlkXzE9dW5rbm93bjsgcm0gLWYgY29uZnRlc3RfY3B1aWQKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jdl9nY2NfeDg2X2NwdWlkXzEiID4mNQorJGFzX2VjaG8gIiRheF9jdl9nY2NfeDg2X2NwdWlkXzEiID4mNjsgfQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKwkgICAgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzAgaW4gIyBzZWUgQVhfR0NDX0FSQ0hGTEFHCisgICAgICAgICAgICAgICAgKjo3NTZlNjU0NzoqOiopICMgSW50ZWwKKyAgICAgICAgICAgICAgICAgIGNhc2UgJGF4X2N2X2djY194ODZfY3B1aWRfMSBpbgorICAgICAgICAgICAgICAgICAgICAqNmE/OipbMjM0XToqOip8KjZbNzg5Yl0/Oio6KjoqKSBpY2NfZmxhZ3M9Ii14SyI7OworICAgICAgICAgICAgICAgICAgICAqZjNbMzQ3XToqOio6KnwqZjQxMzQ3Oio6KjoqKSBpY2NfZmxhZ3M9Ii14UCAteE4gLXhXIC14SyI7OworICAgICAgICAgICAgICAgICAgICAqZj8/Oio6KjoqKSBpY2NfZmxhZ3M9Ii14TiAteFcgLXhLIjs7CisgICAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgaWYgdGVzdCAieCRpY2NfZmxhZ3MiICE9IHg7IHRoZW4KKyAgICAgICAgICAgIGZvciBmbGFnIGluICRpY2NfZmxhZ3M7IGRvCisgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgQyBjb21waWxlciBhY2NlcHRzICRmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgQyBjb21waWxlciBhY2NlcHRzICRmbGFnLi4uICIgPiY2OyB9CitheF9zYXZlX0ZMQUdTPSRDRkxBR1MKKyAgIENGTEFHUz0iJGZsYWciCisgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCBgJGFzX2VjaG8gImF4X2N2X2NfZmxhZ3NfJGZsYWciIHwgJGFzX3RyX3NoYD15ZXMKK2Vsc2UKKyAgZXZhbCBgJGFzX2VjaG8gImF4X2N2X2NfZmxhZ3NfJGZsYWciIHwgJGFzX3RyX3NoYD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgQ0ZMQUdTPSRheF9zYXZlX0ZMQUdTCitldmFsIGF4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzPSRgJGFzX2VjaG8gImF4X2N2X2NfZmxhZ3NfJGZsYWciIHwgJGFzX3RyX3NoYAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jaGVja19jb21waWxlcl9mbGFncyIgPiY1CiskYXNfZWNobyAiJGF4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzIiA+JjY7IH0KK2lmIHRlc3QgIngkYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3MiID0geHllczsgdGhlbgorCWljY19hcmNoZmxhZz0kZmxhZzsgYnJlYWsKK2Vsc2UKKwk6CitmaQorCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgZmkKKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpY2MgYXJjaGl0ZWN0dXJlIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGljYyBhcmNoaXRlY3R1cmUgZmxhZy4uLiAiID4mNjsgfQorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRpY2NfYXJjaGZsYWciID4mNQorJGFzX2VjaG8gIiRpY2NfYXJjaGZsYWciID4mNjsgfQorICAgICAgICAgIGlmIHRlc3QgIngkaWNjX2FyY2hmbGFnIiAhPSB4dW5rbm93bjsgdGhlbgorICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRpY2NfYXJjaGZsYWciCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKwk7OworCisgICAgZ251KQorICAgICAjIGRlZmF1bHQgb3B0aW1pemF0aW9uIGZsYWdzIGZvciBnY2Mgb24gYWxsIHN5c3RlbXMKKyAgICAgQ0ZMQUdTPSItTzMgLWZvbWl0LWZyYW1lLXBvaW50ZXIiCisKKyAgICAgIyAgLWZzdHJpY3QtYWxpYXNpbmcgZm9yIGdjYy0yLjk1KworICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAtZnN0cmljdC1hbGlhc2luZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAtZnN0cmljdC1hbGlhc2luZy4uLiAiID4mNjsgfQoraWYgJHtheF9jdl9jX2ZsYWdzX19mc3RyaWN0X2FsaWFzaW5nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgICAgYXhfc2F2ZV9GTEFHUz0kQ0ZMQUdTCisgICAgICBDRkxBR1M9Ii1mc3RyaWN0LWFsaWFzaW5nIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGF4X2N2X2NfZmxhZ3NfX2ZzdHJpY3RfYWxpYXNpbmc9eWVzCitlbHNlCisgIGF4X2N2X2NfZmxhZ3NfX2ZzdHJpY3RfYWxpYXNpbmc9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgIENGTEFHUz0kYXhfc2F2ZV9GTEFHUworZmkKKworZXZhbCBheF9jaGVja19jb21waWxlcl9mbGFncz0kYXhfY3ZfY19mbGFnc19fZnN0cmljdF9hbGlhc2luZworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jaGVja19jb21waWxlcl9mbGFncyIgPiY1CiskYXNfZWNobyAiJGF4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzIiA+JjY7IH0KK2lmIHRlc3QgIngkYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3MiID0geHllczsgdGhlbgorCUNGTEFHUz0iJENGTEFHUyAtZnN0cmljdC1hbGlhc2luZyIKK2Vsc2UKKwk6CitmaQorCisKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgLWZmYXN0LW1hdGgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgLWZmYXN0LW1hdGguLi4gIiA+JjY7IH0KK2lmICR7YXhfY3ZfY19mbGFnc19fZmZhc3RfbWF0aCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgICAgIGF4X3NhdmVfRkxBR1M9JENGTEFHUworICAgICAgQ0ZMQUdTPSItZmZhc3QtbWF0aCIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBheF9jdl9jX2ZsYWdzX19mZmFzdF9tYXRoPXllcworZWxzZQorICBheF9jdl9jX2ZsYWdzX19mZmFzdF9tYXRoPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICBDRkxBR1M9JGF4X3NhdmVfRkxBR1MKK2ZpCisKK2V2YWwgYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3M9JGF4X2N2X2NfZmxhZ3NfX2ZmYXN0X21hdGgKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3MiID4mNQorJGFzX2VjaG8gIiRheF9jaGVja19jb21waWxlcl9mbGFncyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGF4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzIiA9IHh5ZXM7IHRoZW4KKwlDRkxBR1M9IiRDRkxBR1MgLWZmYXN0LW1hdGgiCitlbHNlCisJOgorZmkKKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ2NjLWFyY2ggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2djY19hcmNoK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9nY2NfYXJjaDsgYXhfZ2NjX2FyY2g9JHdpdGh2YWwKK2Vsc2UKKyAgYXhfZ2NjX2FyY2g9eWVzCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdjYyBhcmNoaXRlY3R1cmUgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2NjIGFyY2hpdGVjdHVyZSBmbGFnLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogIiA+JjUKKyRhc19lY2hvICIiID4mNjsgfQoraWYgJHtheF9jdl9nY2NfYXJjaGZsYWcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCitheF9jdl9nY2NfYXJjaGZsYWc9InVua25vd24iCisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisKK2lmIHRlc3QgIngkYXhfZ2NjX2FyY2giID0geHllczsgdGhlbgorYXhfZ2NjX2FyY2g9IiIKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbm87IHRoZW4KK2Nhc2UgJGhvc3RfY3B1IGluCisgIGlbMzQ1Nl04Nip8eDg2XzY0KikgIyB1c2UgY3B1aWQgY29kZXMsIGluIHBhcnQgZnJvbSB4ODZpbmZvLTEuNyBieSBELiBKb25lcworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHg4NiBjcHVpZCAwIG91dHB1dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgeDg2IGNwdWlkIDAgb3V0cHV0Li4uICIgPiY2OyB9CitpZiAke2F4X2N2X2djY194ODZfY3B1aWRfMCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wPXVua25vd24KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKKworICAgICBpbnQgb3AgPSAwLCBlYXgsIGVieCwgZWN4LCBlZHg7CisgICAgIEZJTEUgKmY7CisgICAgICBfX2FzbV9fKCJjcHVpZCIKKyAgICAgICAgOiAiPWEiIChlYXgpLCAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpCisgICAgICAgIDogImEiIChvcCkpOworICAgICBmID0gZm9wZW4oImNvbmZ0ZXN0X2NwdWlkIiwgInciKTsgaWYgKCFmKSByZXR1cm4gMTsKKyAgICAgZnByaW50ZihmLCAiJXg6JXg6JXg6JXhcbiIsIGVheCwgZWJ4LCBlY3gsIGVkeCk7CisgICAgIGZjbG9zZShmKTsKKyAgICAgcmV0dXJuIDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGF4X2N2X2djY194ODZfY3B1aWRfMD1gY2F0IGNvbmZ0ZXN0X2NwdWlkYDsgcm0gLWYgY29uZnRlc3RfY3B1aWQKK2Vsc2UKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wPXVua25vd247IHJtIC1mIGNvbmZ0ZXN0X2NwdWlkCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wIiA+JjUKKyRhc19lY2hvICIkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wIiA+JjY7IH0KK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgeDg2IGNwdWlkIDEgb3V0cHV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB4ODYgY3B1aWQgMSBvdXRwdXQuLi4gIiA+JjY7IH0KK2lmICR7YXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBheF9jdl9nY2NfeDg2X2NwdWlkXzE9dW5rbm93bgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisgICAgIGludCBvcCA9IDEsIGVheCwgZWJ4LCBlY3gsIGVkeDsKKyAgICAgRklMRSAqZjsKKyAgICAgIF9fYXNtX18oImNwdWlkIgorICAgICAgICA6ICI9YSIgKGVheCksICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkKKyAgICAgICAgOiAiYSIgKG9wKSk7CisgICAgIGYgPSBmb3BlbigiY29uZnRlc3RfY3B1aWQiLCAidyIpOyBpZiAoIWYpIHJldHVybiAxOworICAgICBmcHJpbnRmKGYsICIleDoleDoleDoleFxuIiwgZWF4LCBlYngsIGVjeCwgZWR4KTsKKyAgICAgZmNsb3NlKGYpOworICAgICByZXR1cm4gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xPWBjYXQgY29uZnRlc3RfY3B1aWRgOyBybSAtZiBjb25mdGVzdF9jcHVpZAorZWxzZQorICBheF9jdl9nY2NfeDg2X2NwdWlkXzE9dW5rbm93bjsgcm0gLWYgY29uZnRlc3RfY3B1aWQKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jdl9nY2NfeDg2X2NwdWlkXzEiID4mNQorJGFzX2VjaG8gIiRheF9jdl9nY2NfeDg2X2NwdWlkXzEiID4mNjsgfQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKyAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wIGluCisgICAgICAgKjo3NTZlNjU0NzoqOiopICMgSW50ZWwKKyAgICAgICAgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzEgaW4KKwkgICAgKjVbNDhdPzoqOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW0tbW14IHBlbnRpdW0iIDs7CisJICAgICo1Pz86KjoqOiopIGF4X2djY19hcmNoPXBlbnRpdW0gOzsKKwkgICAgKjZbMzQ1Nl0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTIgcGVudGl1bXBybyIgOzsKKwkgICAgKjZhPzoqWzAxXToqOiopIGF4X2djY19hcmNoPSJwZW50aXVtMiBwZW50aXVtcHJvIiA7OworCSAgICAqNmE/OipbMjM0XToqOiopIGF4X2djY19hcmNoPSJwZW50aXVtMyBwZW50aXVtcHJvIiA7OworCSAgICAqNls5ZF0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bS1tIHBlbnRpdW0zIHBlbnRpdW1wcm8iIDs7CisJICAgICo2Wzc4Yl0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTMgcGVudGl1bXBybyIgOzsKKwkgICAgKjY/PzoqOio6KikgYXhfZ2NjX2FyY2g9cGVudGl1bXBybyA7OworICAgICAgICAgICAgKmYzWzM0N106KjoqOip8KmY0MTM0NzoqOio6KikKKwkJY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgICAgICAgICAgICAgIHg4Nl82NCopIGF4X2djY19hcmNoPSJub2NvbmEgcGVudGl1bTQgcGVudGl1bXBybyIgOzsKKyAgICAgICAgICAgICAgICAgICopIGF4X2djY19hcmNoPSJwcmVzY290dCBwZW50aXVtNCBwZW50aXVtcHJvIiA7OworICAgICAgICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAgICAgICpmPz86KjoqOiopIGF4X2djY19hcmNoPSJwZW50aXVtNCBwZW50aXVtcHJvIjs7CisgICAgICAgICAgZXNhYyA7OworICAgICAgICo6Njg3NDc1NDE6KjoqKSAjIEFNRAorICAgICAgICAgIGNhc2UgJGF4X2N2X2djY194ODZfY3B1aWRfMSBpbgorCSAgICAqNVs2N10/Oio6KjoqKSBheF9nY2NfYXJjaD1rNiA7OworCSAgICAqNVs4ZF0/Oio6KjoqKSBheF9nY2NfYXJjaD0iazYtMiBrNiIgOzsKKwkgICAgKjVbOV0/Oio6KjoqKSBheF9nY2NfYXJjaD0iazYtMyBrNiIgOzsKKwkgICAgKjYwPzoqOio6KikgYXhfZ2NjX2FyY2g9azcgOzsKKwkgICAgKjZbMTJdPzoqOio6KikgYXhfZ2NjX2FyY2g9ImF0aGxvbiBrNyIgOzsKKwkgICAgKjZbMzRdPzoqOio6KikgYXhfZ2NjX2FyY2g9ImF0aGxvbi10YmlyZCBrNyIgOzsKKwkgICAgKjY3PzoqOio6KikgYXhfZ2NjX2FyY2g9ImF0aGxvbi00IGF0aGxvbiBrNyIgOzsKKwkgICAgKjZbNjhhXT86KjoqOiopCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgeDg2IGNwdWlkIDB4ODAwMDAwMDYgb3V0cHV0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB4ODYgY3B1aWQgMHg4MDAwMDAwNiBvdXRwdXQuLi4gIiA+JjY7IH0KK2lmICR7YXhfY3ZfZ2NjX3g4Nl9jcHVpZF8weDgwMDAwMDA2Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBheF9jdl9nY2NfeDg2X2NwdWlkXzB4ODAwMDAwMDY9dW5rbm93bgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworCisgICAgIGludCBvcCA9IDB4ODAwMDAwMDYsIGVheCwgZWJ4LCBlY3gsIGVkeDsKKyAgICAgRklMRSAqZjsKKyAgICAgIF9fYXNtX18oImNwdWlkIgorICAgICAgICA6ICI9YSIgKGVheCksICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkKKyAgICAgICAgOiAiYSIgKG9wKSk7CisgICAgIGYgPSBmb3BlbigiY29uZnRlc3RfY3B1aWQiLCAidyIpOyBpZiAoIWYpIHJldHVybiAxOworICAgICBmcHJpbnRmKGYsICIleDoleDoleDoleFxuIiwgZWF4LCBlYngsIGVjeCwgZWR4KTsKKyAgICAgZmNsb3NlKGYpOworICAgICByZXR1cm4gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8weDgwMDAwMDA2PWBjYXQgY29uZnRlc3RfY3B1aWRgOyBybSAtZiBjb25mdGVzdF9jcHVpZAorZWxzZQorICBheF9jdl9nY2NfeDg2X2NwdWlkXzB4ODAwMDAwMDY9dW5rbm93bjsgcm0gLWYgY29uZnRlc3RfY3B1aWQKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jdl9nY2NfeDg2X2NwdWlkXzB4ODAwMDAwMDYiID4mNQorJGFzX2VjaG8gIiRheF9jdl9nY2NfeDg2X2NwdWlkXzB4ODAwMDAwMDYiID4mNjsgfQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisgIyBMMiBjYWNoZSBzaXplCisJICAgICAgIGNhc2UgJGF4X2N2X2djY194ODZfY3B1aWRfMHg4MDAwMDAwNiBpbgorICAgICAgICAgICAgICAgICAqOio6KlsxLTlhLWZdPz8/Pz8/OiopICMgKEwyID0gZWN4ID4+IDE2KSA+PSAyNTYKKwkJCWF4X2djY19hcmNoPSJhdGhsb24teHAgYXRobG9uLTQgYXRobG9uIGs3IiA7OworICAgICAgICAgICAgICAgICAqKSBheF9nY2NfYXJjaD0iYXRobG9uLTQgYXRobG9uIGs3IiA7OworCSAgICAgICBlc2FjIDs7CisJICAgICpmWzRjZWY4Yl0/Oio6KjoqKSBheF9nY2NfYXJjaD0iYXRobG9uNjQgazgiIDs7CisJICAgICpmNT86KjoqOiopIGF4X2djY19hcmNoPSJvcHRlcm9uIGs4IiA7OworCSAgICAqZjc/Oio6KjoqKSBheF9nY2NfYXJjaD0iYXRobG9uLWZ4IG9wdGVyb24gazgiIDs7CisJICAgICpmPz86KjoqOiopIGF4X2djY19hcmNoPSJrOCIgOzsKKyAgICAgICAgICBlc2FjIDs7CisJKjo3NDZlNjU0MzoqOiopICMgSURUCisJICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIGluCisJICAgICAqNTQ/Oio6KjoqKSBheF9nY2NfYXJjaD13aW5jaGlwLWM2IDs7CisJICAgICAqNTg/Oio6KjoqKSBheF9nY2NfYXJjaD13aW5jaGlwMiA7OworCSAgICAgKjZbNzhdPzoqOio6KikgYXhfZ2NjX2FyY2g9YzMgOzsKKwkgICAgICo2OT86KjoqOiopIGF4X2djY19hcmNoPSJjMy0yIGMzIiA7OworCSAgIGVzYWMgOzsKKyAgICAgZXNhYworICAgICBpZiB0ZXN0IHgiJGF4X2djY19hcmNoIiA9IHg7IHRoZW4gIyBmYWxsYmFjaworCWNhc2UgJGhvc3RfY3B1IGluCisJICBpNTg2KikgYXhfZ2NjX2FyY2g9cGVudGl1bSA7OworCSAgaTY4NiopIGF4X2djY19hcmNoPXBlbnRpdW1wcm8gOzsKKyAgICAgICAgZXNhYworICAgICBmaQorICAgICA7OworCisgIHNwYXJjKikKKyAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwcnRkaWFnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwcnRkaWFnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9QUlRESUFHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUFJURElBRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QUlRESUFHPSIkUFJURElBRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2R1bW15PSIkUEFUSDovdXNyL3BsYXRmb3JtL2B1bmFtZSAtaWAvc2Jpbi86L3Vzci9wbGF0Zm9ybS9gdW5hbWUgLW1gL3NiaW4vIgorZm9yIGFzX2RpciBpbiAkYXNfZHVtbXkKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfUFJURElBRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QUlRESUFHIiAmJiBhY19jdl9wYXRoX1BSVERJQUc9InBydGRpYWciCisgIDs7Citlc2FjCitmaQorUFJURElBRz0kYWNfY3ZfcGF0aF9QUlRESUFHCitpZiB0ZXN0IC1uICIkUFJURElBRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQUlRESUFHIiA+JjUKKyRhc19lY2hvICIkUFJURElBRyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgICAgIGNwdXR5cGU9YCgoKGdyZXAgY3B1IC9wcm9jL2NwdWluZm8gfCBjdXQgLWQ6IC1mMikgOyAoJFBSVERJQUcgLXYgfGdyZXAgLWkgc3BhcmMpIDsgZ3JlcCAtaSBjcHUgL3Zhci9ydW4vZG1lc2cuYm9vdCApIHwgaGVhZCAtbiAxKSAyPiAvZGV2L251bGxgCisgICAgIGNwdXR5cGU9YGVjaG8gIiRjcHV0eXBlIiB8IHRyIC1kICcgLScgfHRyICRhc19jcl9MRVRURVJTICRhc19jcl9sZXR0ZXJzYAorICAgICBjYXNlICRjcHV0eXBlIGluCisgICAgICAgICAqdWx0cmFzcGFyY2l2KikgYXhfZ2NjX2FyY2g9InVsdHJhc3BhcmM0IHVsdHJhc3BhcmMzIHVsdHJhc3BhcmMgdjkiIDs7CisgICAgICAgICAqdWx0cmFzcGFyY2lpaSopIGF4X2djY19hcmNoPSJ1bHRyYXNwYXJjMyB1bHRyYXNwYXJjIHY5IiA7OworICAgICAgICAgKnVsdHJhc3BhcmMqKSBheF9nY2NfYXJjaD0idWx0cmFzcGFyYyB2OSIgOzsKKyAgICAgICAgICpzdXBlcnNwYXJjKnwqdG1zMzkwejVbMDVdKikgYXhfZ2NjX2FyY2g9InN1cGVyc3BhcmMgdjgiIDs7CisgICAgICAgICAqaHlwZXJzcGFyYyp8KnJ0NjJbMDU2XSopIGF4X2djY19hcmNoPSJoeXBlcnNwYXJjIHY4IiA7OworICAgICAgICAgKmN5cHJlc3MqKSBheF9nY2NfYXJjaD1jeXByZXNzIDs7CisgICAgIGVzYWMgOzsKKworICBhbHBoYWV2NSkgYXhfZ2NjX2FyY2g9ZXY1IDs7CisgIGFscGhhZXY1NikgYXhfZ2NjX2FyY2g9ZXY1NiA7OworICBhbHBoYXBjYTU2KSBheF9nY2NfYXJjaD0icGNhNTYgZXY1NiIgOzsKKyAgYWxwaGFwY2E1NykgYXhfZ2NjX2FyY2g9InBjYTU3IHBjYTU2IGV2NTYiIDs7CisgIGFscGhhZXY2KSBheF9nY2NfYXJjaD1ldjYgOzsKKyAgYWxwaGFldjY3KSBheF9nY2NfYXJjaD1ldjY3IDs7CisgIGFscGhhZXY2OCkgYXhfZ2NjX2FyY2g9ImV2NjggZXY2NyIgOzsKKyAgYWxwaGFldjY5KSBheF9nY2NfYXJjaD0iZXY2OSBldjY4IGV2NjciIDs7CisgIGFscGhhZXY3KSBheF9nY2NfYXJjaD0iZXY3IGV2NjkgZXY2OCBldjY3IiA7OworICBhbHBoYWV2NzkpIGF4X2djY19hcmNoPSJldjc5IGV2NyBldjY5IGV2NjggZXY2NyIgOzsKKworICBwb3dlcnBjKikKKyAgICAgY3B1dHlwZT1gKChncmVwIGNwdSAvcHJvYy9jcHVpbmZvIHwgaGVhZCAtbiAxIHwgY3V0IC1kOiAtZjIgfCBjdXQgLWQsIC1mMSB8IHNlZCAncy8gLy9nJykgOyAvdXNyL2Jpbi9tYWNoaW5lIDsgL2Jpbi9tYWNoaW5lOyBncmVwIENQVSAvdmFyL3J1bi9kbWVzZy5ib290IHwgaGVhZCAtbiAxIHwgY3V0IC1kIiAiIC1mMikgMj4gL2Rldi9udWxsYAorICAgICBjcHV0eXBlPWBlY2hvICRjcHV0eXBlIHwgc2VkIC1lICdzL3BwYy8vZztzLyAqLy9nJ2AKKyAgICAgY2FzZSAkY3B1dHlwZSBpbgorICAgICAgICo3NTAqKSBheF9nY2NfYXJjaD0iNzUwIEczIiA7OworICAgICAgICo3NDBbMC05XSopIGF4X2djY19hcmNoPSIkY3B1dHlwZSA3NDAwIEc0IiA7OworICAgICAgICo3NFs0LTVdWzAtOV0qKSBheF9nY2NfYXJjaD0iJGNwdXR5cGUgNzQ1MCBHNCIgOzsKKyAgICAgICAqNzRbMC05XVswLTldKikgYXhfZ2NjX2FyY2g9IiRjcHV0eXBlIEc0IiA7OworICAgICAgICo5NzAqKSBheF9nY2NfYXJjaD0iOTcwIEc1IHBvd2VyNCI7OworICAgICAgICpQT1dFUjQqfCpwb3dlcjQqfCpncSopIGF4X2djY19hcmNoPSJwb3dlcjQgOTcwIjs7CisgICAgICAgKlBPV0VSNSp8KnBvd2VyNSp8KmdyKnwqZ3MqKSBheF9nY2NfYXJjaD0icG93ZXI1IHBvd2VyNCA5NzAiOzsKKyAgICAgICA2MDNldnw4MjQwKSBheF9nY2NfYXJjaD0iJGNwdXR5cGUgNjAzZSA2MDMiOzsKKyAgICAgICAqKSBheF9nY2NfYXJjaD0kY3B1dHlwZSA7OworICAgICBlc2FjCisgICAgIGF4X2djY19hcmNoPSIkYXhfZ2NjX2FyY2ggcG93ZXJwYyIKKyAgICAgOzsKK2VzYWMKK2ZpICMgbm90IGNyb3NzLWNvbXBpbGluZworZmkgIyBndWVzcyBhcmNoCisKK2lmIHRlc3QgIngkYXhfZ2NjX2FyY2giICE9IHggLWEgIngkYXhfZ2NjX2FyY2giICE9IHhubzsgdGhlbgorZm9yIGFyY2ggaW4gJGF4X2djY19hcmNoOyBkbworICBpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geHllczsgdGhlbiAjIGlmIHdlIHJlcXVpcmUgcG9ydGFibGUgY29kZQorICAgIGZsYWdzPSItbXR1bmU9JGFyY2giCisgICAgIyAtbWNwdT0kYXJjaCBhbmQgbSRhcmNoIGdlbmVyYXRlIG5vbnBvcnRhYmxlIGNvZGUgb24gZXZlcnkgYXJjaCBleGNlcHQKKyAgICAjIHg4Ni4gIEFuZCBzb21lIG90aGVyIGFyY2hlcyAoZS5nLiBBbHBoYSkgZG9uJ3QgYWNjZXB0IC1tdHVuZS4gIEdycnIuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4gaSo4Nnx4ODZfNjQqKSBmbGFncz0iJGZsYWdzIC1tY3B1PSRhcmNoIC1tJGFyY2giOzsgZXNhYworICBlbHNlCisgICAgZmxhZ3M9Ii1tYXJjaD0kYXJjaCAtbWNwdT0kYXJjaCAtbSRhcmNoIgorICBmaQorICBmb3IgZmxhZyBpbiAkZmxhZ3M7IGRvCisgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBDIGNvbXBpbGVyIGFjY2VwdHMgJGZsYWcuLi4gIiA+JjY7IH0KK2F4X3NhdmVfRkxBR1M9JENGTEFHUworICAgQ0ZMQUdTPSIkZmxhZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsIGAkYXNfZWNobyAiYXhfY3ZfY19mbGFnc18kZmxhZyIgfCAkYXNfdHJfc2hgPXllcworZWxzZQorICBldmFsIGAkYXNfZWNobyAiYXhfY3ZfY19mbGFnc18kZmxhZyIgfCAkYXNfdHJfc2hgPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBDRkxBR1M9JGF4X3NhdmVfRkxBR1MKK2V2YWwgYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3M9JGAkYXNfZWNobyAiYXhfY3ZfY19mbGFnc18kZmxhZyIgfCAkYXNfdHJfc2hgCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzIiA+JjUKKyRhc19lY2hvICIkYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3MiID4mNjsgfQoraWYgdGVzdCAieCRheF9jaGVja19jb21waWxlcl9mbGFncyIgPSB4eWVzOyB0aGVuCisJYXhfY3ZfZ2NjX2FyY2hmbGFnPSRmbGFnOyBicmVhaworZWxzZQorCToKK2ZpCisKKyAgZG9uZQorICB0ZXN0ICJ4JGF4X2N2X2djY19hcmNoZmxhZyIgPSB4dW5rbm93biB8fCBicmVhaworZG9uZQorZmkKKworZmkgIyAkR0NDPXllcworCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnY2MgYXJjaGl0ZWN0dXJlIGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdjYyBhcmNoaXRlY3R1cmUgZmxhZy4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jdl9nY2NfYXJjaGZsYWciID4mNQorJGFzX2VjaG8gIiRheF9jdl9nY2NfYXJjaGZsYWciID4mNjsgfQoraWYgdGVzdCAieCRheF9jdl9nY2NfYXJjaGZsYWciID0geHVua25vd247IHRoZW4KKyAgOgorZWxzZQorICBDRkxBR1M9IiRDRkxBR1MgJGF4X2N2X2djY19hcmNoZmxhZyIKK2ZpCisKKyAgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgLXogIiRDRkxBR1MiOyB0aGVuCisJZWNobyAiIgorCWVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorICAgICAgICBlY2hvICIqIFdBUk5JTkc6IERvbid0IGtub3cgdGhlIGJlc3QgQ0ZMQUdTIGZvciB0aGlzIHN5c3RlbSAgKiIKKyAgICAgICAgZWNobyAiKiBVc2UgLi9jb25maWd1cmUgQ0ZMQUdTPS4uLiB0byBzcGVjaWZ5IHlvdXIgb3duIGZsYWdzICoiCisJZWNobyAiKiAob3RoZXJ3aXNlLCBhIGRlZmF1bHQgb2YgQ0ZMQUdTPS1PMyB3aWxsIGJlIHVzZWQpICAgICoiCisJZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisJZWNobyAiIgorICAgICAgICBDRkxBR1M9Ii1PMyIKKyAgZmkKKworICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIEMgY29tcGlsZXIgYWNjZXB0cyAkQ0ZMQUdTIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgQyBjb21waWxlciBhY2NlcHRzICRDRkxBR1MuLi4gIiA+JjY7IH0KK2F4X3NhdmVfRkxBR1M9JENGTEFHUworICAgQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgYCRhc19lY2hvICJheF9jdl9jX2ZsYWdzXyRDRkxBR1MiIHwgJGFzX3RyX3NoYD15ZXMKK2Vsc2UKKyAgZXZhbCBgJGFzX2VjaG8gImF4X2N2X2NfZmxhZ3NfJENGTEFHUyIgfCAkYXNfdHJfc2hgPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBDRkxBR1M9JGF4X3NhdmVfRkxBR1MKK2V2YWwgYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3M9JGAkYXNfZWNobyAiYXhfY3ZfY19mbGFnc18kQ0ZMQUdTIiB8ICRhc190cl9zaGAKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3MiID4mNQorJGFzX2VjaG8gIiRheF9jaGVja19jb21waWxlcl9mbGFncyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGF4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzIiA9IHh5ZXM7IHRoZW4KKwk6CitlbHNlCisKKwllY2hvICIiCisgICAgICAgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorICAgICAgICBlY2hvICIqIFdBUk5JTkc6IFRoZSBndWVzc2VkIENGTEFHUyBkb24ndCBzZWVtIHRvIHdvcmsgd2l0aCAgKiIKKyAgICAgICAgZWNobyAiKiB5b3VyIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoiCisgICAgICAgIGVjaG8gIiogVXNlIC4vY29uZmlndXJlIENGTEFHUz0uLi4gdG8gc3BlY2lmeSB5b3VyIG93biBmbGFncyAqIgorICAgICAgICBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKyAgICAgICAgZWNobyAiIgorICAgICAgICBDRkxBR1M9IiIKKworZmkKKworCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIENGTEFHUyBmb3IgbWF4aW11bSB3YXJuaW5ncyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBDRkxBR1MgZm9yIG1heGltdW0gd2FybmluZ3MuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY2ZsYWdzX3dhcm5fYWxsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfY2ZsYWdzX3dhcm5fYWxsPSJubywgdW5rbm93biIKKyBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKK2ZvciBhY19hcmcgaW4gIi1wZWRhbnRpYyAgJSAtV2FsbCIgICAgICAgICAgIi14c3RyY29uc3QgJSAtdiIgICAgICAgICAgICAgIi1zdGQxICAgICAgJSAtdmVyYm9zZSAtdzAgLXdhcm5wcm90b3MiICAgICItcWxhbmdsdmw9YW5zaSAlIC1xc3JjbXNnIC1xaW5mbz1hbGw6bm9wcHQ6bm9wcGM6bm9vYnM6bm9jbmQiICAgICItYW5zaSAtYW5zaUUgJSAtZnVsbHdhcm4iICAgICIrRVNsaXQgICAgICUgK3cxIiAgICAgICAgICAgICItWGMgICAgICAgICUgLXB2Y3RsLGZ1bGxtc2ciICAgICItaCBjb25mb3JtICUgLWggbXNnbGV2ZWwgMiIgICAgIworZG8gQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MgImBlY2hvICRhY19hcmcgfCBzZWQgLWUgJ3MsJSUuKiwsJyAtZSAncywlLCwnYAorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NmbGFnc193YXJuX2FsbD1gZWNobyAkYWNfYXJnIHwgc2VkIC1lICdzLC4qJSAqLCwnYCA7IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCisgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NmbGFnc193YXJuX2FsbCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NmbGFnc193YXJuX2FsbCIgPiY2OyB9CitjYXNlICIuJGFjX2N2X2NmbGFnc193YXJuX2FsbCIgaW4KKyAgICAgLm9rfC5vaywqKSAgOzsKKyAgIC58Lm5vfC5ubywqKQorIDs7CisgICAqKQorICAgaWYgZWNobyAiICRDRkxBR1MgIiB8IGdyZXAgIiAkYWNfY3ZfY2ZsYWdzX3dhcm5fYWxsICIgMj4mMSA+L2Rldi9udWxsCisgICB0aGVuIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUyBkb2VzIGNvbnRhaW4gXCRhY19jdl9jZmxhZ3Nfd2Fybl9hbGwiOyB9ID4mNQorICAoOiBDRkxBR1MgZG9lcyBjb250YWluICRhY19jdl9jZmxhZ3Nfd2Fybl9hbGwpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICBlbHNlIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiA6IENGTEFHUz1cIlwkQ0ZMQUdTIFwkYWNfY3ZfY2ZsYWdzX3dhcm5fYWxsXCIiOyB9ID4mNQorICAoOiBDRkxBR1M9IiRDRkxBR1MgJGFjX2N2X2NmbGFnc193YXJuX2FsbCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgICAgICAgICAgICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRhY19jdl9jZmxhZ3Nfd2Fybl9hbGwiCisgICBmaQorIDs7Citlc2FjCisKK2lmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgorICBDRkxBR1M9IiRDRkxBR1MgLWZleGNlcHRpb25zIgorZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzLi4uICIgPiY2OyB9CisgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9tYWludGFpbmVyX21vZGU7IFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCitmaQorCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVVNFX01BSU5UQUlORVJfTU9ERSIgPiY1CiskYXNfZWNobyAiJFVTRV9NQUlOVEFJTkVSX01PREUiID4mNjsgfQorICAgaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgorICBNQUlOVEFJTkVSX01PREVfVFJVRT0KKyAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJworZWxzZQorICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKKyAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQorZmkKKworICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKworCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL21tYW4uaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3lzL21tYW4uaCIgImFjX2N2X2hlYWRlcl9zeXNfbW1hbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zeXNfbW1hbl9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1lTX01NQU5fSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfZnVuYyBpbiBtbWFwCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIm1tYXAiICJhY19jdl9mdW5jX21tYXAiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbW1hcCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX01NQVAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKworYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5cy9tbWFuLmgiICJhY19jdl9oZWFkZXJfc3lzX21tYW5faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX21tYW5faCIgPSB4eWVzOyB0aGVuIDoKKyAgbGliZmZpX2hlYWRlcl9zeXNfbW1hbl9oPXllcworZWxzZQorICBsaWJmZmlfaGVhZGVyX3N5c19tbWFuX2g9bm8KK2ZpCisKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAibW1hcCIgImFjX2N2X2Z1bmNfbW1hcCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19tbWFwIiA9IHh5ZXM7IHRoZW4gOgorICBsaWJmZmlfZnVuY19tbWFwPXllcworZWxzZQorICBsaWJmZmlfZnVuY19tbWFwPW5vCitmaQorCitpZiB0ZXN0ICIkbGliZmZpX2hlYWRlcl9zeXNfbW1hbl9oIiAhPSB5ZXMgXAorIHx8IHRlc3QgIiRsaWJmZmlfZnVuY19tbWFwIiAhPSB5ZXM7IHRoZW4KKyAgIGFjX2N2X2Z1bmNfbW1hcF9maWxlPW5vCisgICBhY19jdl9mdW5jX21tYXBfZGV2X3plcm89bm8KKyAgIGFjX2N2X2Z1bmNfbW1hcF9hbm9uPW5vCitlbHNlCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgcmVhZC1vbmx5IG1tYXAgb2YgYSBwbGFpbiBmaWxlIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgcmVhZC1vbmx5IG1tYXAgb2YgYSBwbGFpbiBmaWxlIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfbW1hcF9maWxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBBZGQgYSBzeXN0ZW0gdG8gdGhpcyBibGFja2xpc3QgaWYKKyAgICMgbW1hcCgwLCBzdGF0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKSBkb2Vzbid0IHJldHVybiBhCisgICAjIG1lbW9yeSBhcmVhIGNvbnRhaW5pbmcgdGhlIHNhbWUgZGF0YSB0aGF0IHlvdSdkIGdldCBpZiB5b3UgYXBwbGllZAorICAgIyByZWFkKCkgdG8gdGhlIHNhbWUgZmQuICBUaGUgb25seSBzeXN0ZW0ga25vd24gdG8gaGF2ZSBhIHByb2JsZW0gaGVyZQorICAgIyBpcyBWTVMsIHdoZXJlIHRleHQgZmlsZXMgaGF2ZSByZWNvcmQgc3RydWN0dXJlLgorICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgIHZtcyogfCB1bHRyaXgqKQorCWFjX2N2X2Z1bmNfbW1hcF9maWxlPW5vIDs7CisgICAgICopCisJYWNfY3ZfZnVuY19tbWFwX2ZpbGU9eWVzOzsKKyAgIGVzYWMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbW1hcF9maWxlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19tbWFwX2ZpbGUiID4mNjsgfQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIG1tYXAgZnJvbSAvZGV2L3plcm8gd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBtbWFwIGZyb20gL2Rldi96ZXJvIHdvcmtzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfbW1hcF9kZXZfemVybys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICMgQWRkIGEgc3lzdGVtIHRvIHRoaXMgYmxhY2tsaXN0IGlmIGl0IGhhcyBtbWFwKCkgYnV0IC9kZXYvemVybworICAgIyBkb2VzIG5vdCBleGlzdCwgb3IgaWYgbW1hcHBpbmcgL2Rldi96ZXJvIGRvZXMgbm90IGdpdmUgYW5vbnltb3VzCisgICAjIHplcm9lZCBwYWdlcyB3aXRoIGJvdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgIyAxLiBJZiB5b3UgbWFwIE4gY29uc2VjdXRpdmUgcGFnZXMgaW4gd2l0aCBvbmUgY2FsbCwgYW5kIHRoZW4KKyAgICMgICAgdW5tYXAgYW55IHN1YnNldCBvZiB0aG9zZSBwYWdlcywgdGhlIHBhZ2VzIHRoYXQgd2VyZSBub3QKKyAgICMgICAgZXhwbGljaXRseSB1bm1hcHBlZCByZW1haW4gYWNjZXNzaWJsZS4KKyAgICMgMi4gSWYgeW91IG1hcCB0d28gYWRqYWNlbnQgYmxvY2tzIG9mIG1lbW9yeSBhbmQgdGhlbiB1bm1hcCB0aGVtCisgICAjICAgIGJvdGggYXQgb25jZSwgdGhleSBtdXN0IGJvdGggZ28gYXdheS4KKyAgICMgU3lzdGVtcyBrbm93biB0byBiZSBpbiB0aGlzIGNhdGVnb3J5IGFyZSBXaW5kb3dzIChhbGwgdmFyaWFudHMpLAorICAgIyBWTVMsIGFuZCBEYXJ3aW4uCisgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgdm1zKiB8IGN5Z3dpbiogfCBwZSB8IG1pbmd3KiB8IGRhcndpbiogfCB1bHRyaXgqIHwgaHB1eDEwKiB8IGhwdXgxMS4wMCkKKwlhY19jdl9mdW5jX21tYXBfZGV2X3plcm89bm8gOzsKKyAgICAgKikKKwlhY19jdl9mdW5jX21tYXBfZGV2X3plcm89eWVzOzsKKyAgIGVzYWMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbW1hcF9kZXZfemVybyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfbW1hcF9kZXZfemVybyIgPiY2OyB9CisKKyAgICMgVW5saWtlIC9kZXYvemVybywgdGhlIE1BUF9BTk9OKFlNT1VTKSBkZWZpbmVzIGNhbiBiZSBwcm9iZWQgZm9yLgorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgTUFQX0FOT04oWU1PVVMpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBNQVBfQU5PTihZTU9VUykuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZGVjbF9tYXBfYW5vbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIE1BUF9BTk9OWU1PVVMKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyBNQVBfQU5PTgorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworaW50IG4gPSBNQVBfQU5PTllNT1VTOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2RlY2xfbWFwX2Fub249eWVzCitlbHNlCisgIGFjX2N2X2RlY2xfbWFwX2Fub249bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2RlY2xfbWFwX2Fub24iID4mNQorJGFzX2VjaG8gIiRhY19jdl9kZWNsX21hcF9hbm9uIiA+JjY7IH0KKworICAgaWYgdGVzdCAkYWNfY3ZfZGVjbF9tYXBfYW5vbiA9IG5vOyB0aGVuCisgICAgIGFjX2N2X2Z1bmNfbW1hcF9hbm9uPW5vCisgICBlbHNlCisgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBtbWFwIHdpdGggTUFQX0FOT04oWU1PVVMpIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgbW1hcCB3aXRoIE1BUF9BTk9OKFlNT1VTKSB3b3Jrcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX21tYXBfYW5vbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICMgQWRkIGEgc3lzdGVtIHRvIHRoaXMgYmxhY2tsaXN0IGlmIGl0IGhhcyBtbWFwKCkgYW5kIE1BUF9BTk9OIG9yCisgICAjIE1BUF9BTk9OWU1PVVMsIGJ1dCB1c2luZyBtbWFwKC4uLiwgTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VUywgLTEsIDApCisgICAjIGRvZXNuJ3QgZ2l2ZSBhbm9ueW1vdXMgemVyb2VkIHBhZ2VzIHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBsaXN0ZWQKKyAgICMgYWJvdmUgZm9yIHVzZSBvZiAvZGV2L3plcm8uCisgICAjIFN5c3RlbXMga25vd24gdG8gYmUgaW4gdGhpcyBjYXRlZ29yeSBhcmUgV2luZG93cywgVk1TLCBhbmQgU0NPIFVuaXguCisgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgdm1zKiB8IGN5Z3dpbiogfCBwZSB8IG1pbmd3KiB8IHNjbyogfCB1ZGsqICkKKwlhY19jdl9mdW5jX21tYXBfYW5vbj1ubyA7OworICAgICAqKQorCWFjX2N2X2Z1bmNfbW1hcF9hbm9uPXllczs7CisgICBlc2FjCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX21tYXBfYW5vbiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfbW1hcF9hbm9uIiA+JjY7IH0KKyAgIGZpCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZmlsZSA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX01NQVBfRklMRSAxIiA+PmNvbmZkZWZzLmgKKworZmkKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9kZXZfemVybyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX01NQVBfREVWX1pFUk8gMSIgPj5jb25mZGVmcy5oCisKK2ZpCitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfYW5vbiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX01NQVBfQU5PTiAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisgaWYgdGVzdCAtZCAkc3JjZGlyL3Rlc3RzdWl0ZTsgdGhlbgorICBURVNUU1VCRElSX1RSVUU9CisgIFRFU1RTVUJESVJfRkFMU0U9JyMnCitlbHNlCisgIFRFU1RTVUJESVJfVFJVRT0nIycKKyAgVEVTVFNVQkRJUl9GQUxTRT0KK2ZpCisKKworVEFSR0VURElSPSJ1bmtub3duIgorY2FzZSAiJGhvc3QiIGluCisgIGFscGhhKi0qLSopCisJVEFSR0VUPUFMUEhBOyBUQVJHRVRESVI9YWxwaGE7CisJIyBTdXBwb3J0IDEyOC1iaXQgbG9uZyBkb3VibGUsIGNoYW5nZWFibGUgdmlhIGNvbW1hbmQtbGluZSBzd2l0Y2guCisJSEFWRV9MT05HX0RPVUJMRT0nZGVmaW5lZChfX0xPTkdfRE9VQkxFXzEyOF9fKScKKwk7OworCisgIGFybSotKi0qKQorCVRBUkdFVD1BUk07IFRBUkdFVERJUj1hcm0KKwk7OworCisgIGFtZDY0LSotZnJlZWJzZCogfCBhbWQ2NC0qLW9wZW5ic2QqKQorCVRBUkdFVD1YODZfNjQ7IFRBUkdFVERJUj14ODYKKyAgCTs7CisKKyAgYW1kNjQtKi1mcmVlYnNkKikKKwlUQVJHRVQ9WDg2XzY0OyBUQVJHRVRESVI9eDg2CisJOzsKKworICBhdnIzMiotKi0qKQorCVRBUkdFVD1BVlIzMjsgVEFSR0VURElSPWF2cjMyCisJOzsKKworICBjcmlzLSotKikKKwlUQVJHRVQ9TElCRkZJX0NSSVM7IFRBUkdFVERJUj1jcmlzCisJOzsKKworICBmcnYtKi0qKQorCVRBUkdFVD1GUlY7IFRBUkdFVERJUj1mcnYKKwk7OworCisgIGhwcGEqLSotbGludXgqIHwgcGFyaXNjKi0qLWxpbnV4KiB8IGhwcGEqLSotb3BlbmJzZCopCisJVEFSR0VUPVBBX0xJTlVYOyBUQVJHRVRESVI9cGEKKwk7OworICBocHBhKjY0LSotaHB1eCopCisJVEFSR0VUPVBBNjRfSFBVWDsgVEFSR0VURElSPXBhCisJOzsKKyAgaHBwYSotKi1ocHV4KikKKwlUQVJHRVQ9UEFfSFBVWDsgVEFSR0VURElSPXBhCisJOzsKKworICBpPzg2LSotZnJlZWJzZCogfCBpPzg2LSotb3BlbmJzZCopCisJVEFSR0VUPVg4Nl9GUkVFQlNEOyBUQVJHRVRESVI9eDg2CisJOzsKKyAgaT84Ni13aW4zMiogfCBpPzg2LSotY3lnd2luKiB8IGk/ODYtKi1taW5ndyogfCBpPzg2LSotb3MyKiB8IGk/ODYtKi1pbnRlcml4KikKKwlUQVJHRVQ9WDg2X1dJTjMyOyBUQVJHRVRESVI9eDg2CisJIyBBbGwgbWluZ3cvY3lnd2luL3dpbjMyIGJ1aWxkcyByZXF1aXJlIC1uby11bmRlZmluZWQgZm9yIHNoYXJlZGxpYi4KKwkjIFdlIG11c3QgYWxzbyBjaGVjayB3aXRoX2Nyb3NzX2hvc3QgdG8gZGVjaWRlIGlmIHRoaXMgaXMgYSBuYXRpdmUKKwkjIG9yIGNyb3NzLWJ1aWxkIGFuZCBzZWxlY3Qgd2hlcmUgdG8gaW5zdGFsbCBkbGxzIGFwcHJvcHJpYXRlbHkuCisJaWYgdGVzdCAtbiAiJHdpdGhfY3Jvc3NfaG9zdCIgJiYKKwkgICB0ZXN0IHgiJHdpdGhfY3Jvc3NfaG9zdCIgIT0geCJubyI7IHRoZW4KKwkgIEFNX0xUTERGTEFHUz0nLW5vLXVuZGVmaW5lZCAtYmluZGlyICIkKHRvb2xleGVjbGliZGlyKSInOworCWVsc2UKKwkgIEFNX0xUTERGTEFHUz0nLW5vLXVuZGVmaW5lZCAtYmluZGlyICIkKGJpbmRpcikiJzsKKwlmaQorCTs7CisgIGk/ODYtKi1kYXJ3aW4qKQorCVRBUkdFVD1YODZfREFSV0lOOyBUQVJHRVRESVI9eDg2CisJOzsKKyAgaT84Ni0qLXNvbGFyaXMyLjFbMC05XSopCisJVEFSR0VUPVg4Nl82NDsgVEFSR0VURElSPXg4NgorCTs7CisgIGk/ODYtKi0qKQorCVRBUkdFVD1YODY7IFRBUkdFVERJUj14ODYKKwk7OworCisgIGlhNjQqLSotKikKKwlUQVJHRVQ9SUE2NDsgVEFSR0VURElSPWlhNjQKKwk7OworCisgIG0zMnIqLSotKikKKwlUQVJHRVQ9TTMyUjsgVEFSR0VURElSPW0zMnIKKwk7OworCisgIG02OGstKi0qKQorCVRBUkdFVD1NNjhLOyBUQVJHRVRESVI9bTY4aworCTs7CisKKyAgbWlwcy1zZ2ktaXJpeDUuKiB8IG1pcHMtc2dpLWlyaXg2LiogfCBtaXBzKi0qLXJ0ZW1zKikKKwlUQVJHRVQ9TUlQUzsgVEFSR0VURElSPW1pcHMKKwk7OworICBtaXBzKi0qLWxpbnV4KiB8IG1pcHMqLSotb3BlbmJzZCopCisJIyBTdXBwb3J0IDEyOC1iaXQgbG9uZyBkb3VibGUgZm9yIE5ld0FCSS4KKwlIQVZFX0xPTkdfRE9VQkxFPSdkZWZpbmVkKF9fbWlwczY0KScKKwlUQVJHRVQ9TUlQUzsgVEFSR0VURElSPW1pcHMKKwk7OworCisgIHBvd2VycGMqLSotbGludXgqIHwgcG93ZXJwYy0qLXN5c3YqKQorCVRBUkdFVD1QT1dFUlBDOyBUQVJHRVRESVI9cG93ZXJwYworCTs7CisgIHBvd2VycGMtKi1iZW9zKikKKwlUQVJHRVQ9UE9XRVJQQzsgVEFSR0VURElSPXBvd2VycGMKKwk7OworICBwb3dlcnBjLSotZGFyd2luKiB8IHBvd2VycGM2NC0qLWRhcndpbiopCisJVEFSR0VUPVBPV0VSUENfREFSV0lOOyBUQVJHRVRESVI9cG93ZXJwYworCTs7CisgIHBvd2VycGMtKi1haXgqIHwgcnM2MDAwLSotYWl4KikKKwlUQVJHRVQ9UE9XRVJQQ19BSVg7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKKyAgcG93ZXJwYy0qLWZyZWVic2QqIHwgcG93ZXJwYy0qLW9wZW5ic2QqKQorCVRBUkdFVD1QT1dFUlBDX0ZSRUVCU0Q7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKKyAgcG93ZXJwYzY0LSotZnJlZWJzZCopCisJVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKKyAgcG93ZXJwYyotKi1ydGVtcyopCisJVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKKworICBzMzkwLSotKiB8IHMzOTB4LSotKikKKwlUQVJHRVQ9UzM5MDsgVEFSR0VURElSPXMzOTAKKwk7OworCisgIHNoLSotKiB8IHNoWzM0XSotKi0qKQorCVRBUkdFVD1TSDsgVEFSR0VURElSPXNoCisJOzsKKyAgc2g2NC0qLSogfCBzaDUqLSotKikKKwlUQVJHRVQ9U0g2NDsgVEFSR0VURElSPXNoNjQKKwk7OworCisgIHNwYXJjKi0qLSopCisJVEFSR0VUPVNQQVJDOyBUQVJHRVRESVI9c3BhcmMKKwk7OworCisgIHg4Nl82NC0qLWRhcndpbiopCisJVEFSR0VUPVg4Nl9EQVJXSU47IFRBUkdFVERJUj14ODYKKwk7OworCisgIHg4Nl82NC0qLWN5Z3dpbiogfCB4ODZfNjQtKi1taW5ndyopCisJVEFSR0VUPVg4Nl9XSU42NDsgVEFSR0VURElSPXg4NgorCTs7CisKKyAgeDg2XzY0LSotKikKKwlUQVJHRVQ9WDg2XzY0OyBUQVJHRVRESVI9eDg2CisJOzsKK2VzYWMKKworCisKKworaWYgdGVzdCAkVEFSR0VURElSID0gdW5rbm93bjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiXCJsaWJmZmkgaGFzIG5vdCBiZWVuIHBvcnRlZCB0byAkaG9zdC5cIiIgIiRMSU5FTk8iIDUKK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geE1JUFM7IHRoZW4KKyAgTUlQU19UUlVFPQorICBNSVBTX0ZBTFNFPScjJworZWxzZQorICBNSVBTX1RSVUU9JyMnCisgIE1JUFNfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhTUEFSQzsgdGhlbgorICBTUEFSQ19UUlVFPQorICBTUEFSQ19GQUxTRT0nIycKK2Vsc2UKKyAgU1BBUkNfVFJVRT0nIycKKyAgU1BBUkNfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhYODY7IHRoZW4KKyAgWDg2X1RSVUU9CisgIFg4Nl9GQUxTRT0nIycKK2Vsc2UKKyAgWDg2X1RSVUU9JyMnCisgIFg4Nl9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFg4Nl9GUkVFQlNEOyB0aGVuCisgIFg4Nl9GUkVFQlNEX1RSVUU9CisgIFg4Nl9GUkVFQlNEX0ZBTFNFPScjJworZWxzZQorICBYODZfRlJFRUJTRF9UUlVFPScjJworICBYODZfRlJFRUJTRF9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFg4Nl9XSU4zMjsgdGhlbgorICBYODZfV0lOMzJfVFJVRT0KKyAgWDg2X1dJTjMyX0ZBTFNFPScjJworZWxzZQorICBYODZfV0lOMzJfVFJVRT0nIycKKyAgWDg2X1dJTjMyX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4WDg2X1dJTjY0OyB0aGVuCisgIFg4Nl9XSU42NF9UUlVFPQorICBYODZfV0lONjRfRkFMU0U9JyMnCitlbHNlCisgIFg4Nl9XSU42NF9UUlVFPScjJworICBYODZfV0lONjRfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhYODZfREFSV0lOOyB0aGVuCisgIFg4Nl9EQVJXSU5fVFJVRT0KKyAgWDg2X0RBUldJTl9GQUxTRT0nIycKK2Vsc2UKKyAgWDg2X0RBUldJTl9UUlVFPScjJworICBYODZfREFSV0lOX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4QUxQSEE7IHRoZW4KKyAgQUxQSEFfVFJVRT0KKyAgQUxQSEFfRkFMU0U9JyMnCitlbHNlCisgIEFMUEhBX1RSVUU9JyMnCisgIEFMUEhBX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4SUE2NDsgdGhlbgorICBJQTY0X1RSVUU9CisgIElBNjRfRkFMU0U9JyMnCitlbHNlCisgIElBNjRfVFJVRT0nIycKKyAgSUE2NF9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geE0zMlI7IHRoZW4KKyAgTTMyUl9UUlVFPQorICBNMzJSX0ZBTFNFPScjJworZWxzZQorICBNMzJSX1RSVUU9JyMnCisgIE0zMlJfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhNNjhLOyB0aGVuCisgIE02OEtfVFJVRT0KKyAgTTY4S19GQUxTRT0nIycKK2Vsc2UKKyAgTTY4S19UUlVFPScjJworICBNNjhLX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4TU9YSUU7IHRoZW4KKyAgTU9YSUVfVFJVRT0KKyAgTU9YSUVfRkFMU0U9JyMnCitlbHNlCisgIE1PWElFX1RSVUU9JyMnCisgIE1PWElFX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4UE9XRVJQQzsgdGhlbgorICBQT1dFUlBDX1RSVUU9CisgIFBPV0VSUENfRkFMU0U9JyMnCitlbHNlCisgIFBPV0VSUENfVFJVRT0nIycKKyAgUE9XRVJQQ19GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFBPV0VSUENfQUlYOyB0aGVuCisgIFBPV0VSUENfQUlYX1RSVUU9CisgIFBPV0VSUENfQUlYX0ZBTFNFPScjJworZWxzZQorICBQT1dFUlBDX0FJWF9UUlVFPScjJworICBQT1dFUlBDX0FJWF9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFBPV0VSUENfREFSV0lOOyB0aGVuCisgIFBPV0VSUENfREFSV0lOX1RSVUU9CisgIFBPV0VSUENfREFSV0lOX0ZBTFNFPScjJworZWxzZQorICBQT1dFUlBDX0RBUldJTl9UUlVFPScjJworICBQT1dFUlBDX0RBUldJTl9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFBPV0VSUENfRlJFRUJTRDsgdGhlbgorICBQT1dFUlBDX0ZSRUVCU0RfVFJVRT0KKyAgUE9XRVJQQ19GUkVFQlNEX0ZBTFNFPScjJworZWxzZQorICBQT1dFUlBDX0ZSRUVCU0RfVFJVRT0nIycKKyAgUE9XRVJQQ19GUkVFQlNEX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4QVJNOyB0aGVuCisgIEFSTV9UUlVFPQorICBBUk1fRkFMU0U9JyMnCitlbHNlCisgIEFSTV9UUlVFPScjJworICBBUk1fRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhBVlIzMjsgdGhlbgorICBBVlIzMl9UUlVFPQorICBBVlIzMl9GQUxTRT0nIycKK2Vsc2UKKyAgQVZSMzJfVFJVRT0nIycKKyAgQVZSMzJfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhMSUJGRklfQ1JJUzsgdGhlbgorICBMSUJGRklfQ1JJU19UUlVFPQorICBMSUJGRklfQ1JJU19GQUxTRT0nIycKK2Vsc2UKKyAgTElCRkZJX0NSSVNfVFJVRT0nIycKKyAgTElCRkZJX0NSSVNfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhGUlY7IHRoZW4KKyAgRlJWX1RSVUU9CisgIEZSVl9GQUxTRT0nIycKK2Vsc2UKKyAgRlJWX1RSVUU9JyMnCisgIEZSVl9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFMzOTA7IHRoZW4KKyAgUzM5MF9UUlVFPQorICBTMzkwX0ZBTFNFPScjJworZWxzZQorICBTMzkwX1RSVUU9JyMnCisgIFMzOTBfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhYODZfNjQ7IHRoZW4KKyAgWDg2XzY0X1RSVUU9CisgIFg4Nl82NF9GQUxTRT0nIycKK2Vsc2UKKyAgWDg2XzY0X1RSVUU9JyMnCisgIFg4Nl82NF9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFNIOyB0aGVuCisgIFNIX1RSVUU9CisgIFNIX0ZBTFNFPScjJworZWxzZQorICBTSF9UUlVFPScjJworICBTSF9GQUxTRT0KK2ZpCisKKyBpZiB0ZXN0IHgkVEFSR0VUID0geFNINjQ7IHRoZW4KKyAgU0g2NF9UUlVFPQorICBTSDY0X0ZBTFNFPScjJworZWxzZQorICBTSDY0X1RSVUU9JyMnCisgIFNINjRfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhQQV9MSU5VWDsgdGhlbgorICBQQV9MSU5VWF9UUlVFPQorICBQQV9MSU5VWF9GQUxTRT0nIycKK2Vsc2UKKyAgUEFfTElOVVhfVFJVRT0nIycKKyAgUEFfTElOVVhfRkFMU0U9CitmaQorCisgaWYgdGVzdCB4JFRBUkdFVCA9IHhQQV9IUFVYOyB0aGVuCisgIFBBX0hQVVhfVFJVRT0KKyAgUEFfSFBVWF9GQUxTRT0nIycKK2Vsc2UKKyAgUEFfSFBVWF9UUlVFPScjJworICBQQV9IUFVYX0ZBTFNFPQorZmkKKworIGlmIHRlc3QgeCRUQVJHRVQgPSB4UEE2NF9IUFVYOyB0aGVuCisgIFBBNjRfSFBVWF9UUlVFPQorICBQQTY0X0hQVVhfRkFMU0U9JyMnCitlbHNlCisgIFBBNjRfSFBVWF9UUlVFPScjJworICBQQTY0X0hQVVhfRkFMU0U9CitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGVhZGVyX3N0ZGMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgOgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgU1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitmb3IgYWNfZnVuYyBpbiBtZW1jcHkKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAibWVtY3B5IiAiYWNfY3ZfZnVuY19tZW1jcHkiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbWVtY3B5IiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTUVNQ1BZIDEKK19BQ0VPRgorCitmaQorZG9uZQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCitmaQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmguLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfd29ya2luZ19hbGxvY2FfaCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludAorbWFpbiAoKQoreworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSAoMiAqIHNpemVvZiAoaW50KSk7CisJCQkgIGlmIChwKSByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl93b3JraW5nX2FsbG9jYV9oPXllcworZWxzZQorICBhY19jdl93b3JraW5nX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3dvcmtpbmdfYWxsb2NhX2giID4mNQorJGFzX2VjaG8gIiRhY19jdl93b3JraW5nX2FsbG9jYV9oIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3dvcmtpbmdfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbGxvY2EuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWZkZWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK3ZvaWQgKmFsbG9jYSAoc2l6ZV90KTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EgKDEpOworCQkJCSAgICBpZiAocCkgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiID4mNjsgfQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0FMTE9DQSAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorCitBTExPQ0E9XCR7TElCT0JKRElSfWFsbG9jYS4kYWNfb2JqZXh0CisKKyRhc19lY2hvICIjZGVmaW5lIENfQUxMT0NBIDEiID4+Y29uZmRlZnMuaAorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgXGBhbGxvY2EuYycgbmVlZHMgQ3JheSBob29rcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9vc19jcmF5Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmIGRlZmluZWQgQ1JBWSAmJiAhIGRlZmluZWQgQ1JBWTIKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9vc19jcmF5IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfb3NfY3JheSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCisgIGZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYworX0FDRU9GCisKKyAgICBicmVhaworZmkKKworICBkb25lCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX3N0YWNrX2RpcmVjdGlvbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQoreworICBzdGF0aWMgY2hhciAqYWRkciA9IDA7CisgIGF1dG8gY2hhciBkdW1teTsKKyAgaWYgKGFkZHIgPT0gMCkKKyAgICB7CisgICAgICBhZGRyID0gJmR1bW15OworICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Cit9CisKK2ludAorbWFpbiAoKQoreworICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCkgPCAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iID4mNjsgfQorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCitfQUNFT0YKKworCitmaQorCisKKyMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgZG91YmxlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgZG91YmxlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9kb3VibGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChkb3VibGUpKSIgImFjX2N2X3NpemVvZl9kb3VibGUiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKworZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9kb3VibGUiID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoZG91YmxlKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2RvdWJsZT0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2RvdWJsZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl9kb3VibGUiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfRE9VQkxFICRhY19jdl9zaXplb2ZfZG91YmxlCitfQUNFT0YKKworCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGxvbmcgZG91YmxlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyBkb3VibGUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAobG9uZyBkb3VibGUpKSIgImFjX2N2X3NpemVvZl9sb25nX2RvdWJsZSIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfZG91YmxlIiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgZG91YmxlKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2xvbmdfZG91YmxlPTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZ19kb3VibGUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfbG9uZ19kb3VibGUiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfTE9OR19ET1VCTEUgJGFjX2N2X3NpemVvZl9sb25nX2RvdWJsZQorX0FDRU9GCisKKworCisjIEFsc28gQUNfU1VCU1QgdGhpcyB2YXJpYWJsZSBmb3IgZmZpLmguCitpZiB0ZXN0IC16ICIkSEFWRV9MT05HX0RPVUJMRSI7IHRoZW4KKyAgSEFWRV9MT05HX0RPVUJMRT0wCisgIGlmIHRlc3QgJGFjX2N2X3NpemVvZl9kb3VibGUgIT0gJGFjX2N2X3NpemVvZl9sb25nX2RvdWJsZTsgdGhlbgorICAgIGlmIHRlc3QgJGFjX2N2X3NpemVvZl9sb25nX2RvdWJsZSAhPSAwOyB0aGVuCisgICAgICBIQVZFX0xPTkdfRE9VQkxFPTEKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MT05HX0RPVUJMRSAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCisgIGZpCitmaQorCisKKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX2JpZ2VuZGlhbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKyAgICAjIFNlZSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSB1bml2ZXJzYWwgY29tcGlsZXIuCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmbmRlZiBfX0FQUExFX0NDX18KKwkgICAgICAgbm90IGEgdW5pdmVyc2FsIGNhcGFibGUgY29tcGlsZXIKKwkgICAgICNlbmRpZgorCSAgICAgdHlwZWRlZiBpbnQgZHVtbXk7CisKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCisJIyBDaGVjayBmb3IgcG90ZW50aWFsIC1hcmNoIGZsYWdzLiAgSXQgaXMgbm90IHVuaXZlcnNhbCB1bmxlc3MKKwkjIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gLWFyY2ggZmxhZ3Mgd2l0aCBkaWZmZXJlbnQgdmFsdWVzLgorCWFjX2FyY2g9CisJYWNfcHJldj0KKwlmb3IgYWNfd29yZCBpbiAkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1M7IGRvCisJIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorCSAgIGNhc2UgJGFjX3dvcmQgaW4KKwkgICAgIGk/ODYgfCB4ODZfNjQgfCBwcGMgfCBwcGM2NCkKKwkgICAgICAgaWYgdGVzdCAteiAiJGFjX2FyY2giIHx8IHRlc3QgIiRhY19hcmNoIiA9ICIkYWNfd29yZCI7IHRoZW4KKwkJIGFjX2FyY2g9JGFjX3dvcmQKKwkgICAgICAgZWxzZQorCQkgYWNfY3ZfY19iaWdlbmRpYW49dW5pdmVyc2FsCisJCSBicmVhaworCSAgICAgICBmaQorCSAgICAgICA7OworCSAgIGVzYWMKKwkgICBhY19wcmV2PQorCSBlbGlmIHRlc3QgIngkYWNfd29yZCIgPSAieC1hcmNoIjsgdGhlbgorCSAgIGFjX3ByZXY9YXJjaAorCSBmaQorICAgICAgIGRvbmUKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKyAgICAgICMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJICAgICAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK2ludAorbWFpbiAoKQoreworI2lmICEgKGRlZmluZWQgQllURV9PUkRFUiAmJiBkZWZpbmVkIEJJR19FTkRJQU4gXAorCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAorCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCisJICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcworCSAgICAgI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworaW50CittYWluICgpCit7CisjaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCisJCSBub3QgYmlnIGVuZGlhbgorCQkjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIFNlZSBpZiA8bGltaXRzLmg+IGRlZmluZXMgX0xJVFRMRV9FTkRJQU4gb3IgX0JJR19FTkRJQU4gKGUuZy4sIFNvbGFyaXMpLgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZiAhIChkZWZpbmVkIF9MSVRUTEVfRU5ESUFOIHx8IGRlZmluZWQgX0JJR19FTkRJQU4pCisJICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcworCSAgICAgI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIF9CSUdfRU5ESUFOIG9yIG5vdC4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX0JJR19FTkRJQU4KKwkJIG5vdCBiaWcgZW5kaWFuCisJCSNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgZmkKKyAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKyAgICAgICMgQ29tcGlsZSBhIHRlc3QgcHJvZ3JhbS4KKyAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgIyBUcnkgdG8gZ3Vlc3MgYnkgZ3JlcHBpbmcgdmFsdWVzIGZyb20gYW4gb2JqZWN0IGZpbGUuCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK3Nob3J0IGludCBhc2NpaV9tbVtdID0KKwkJICB7IDB4NDI0OSwgMHg0NzY1LCAweDZFNDQsIDB4Njk2MSwgMHg2RTUzLCAweDc5NTMsIDAgfTsKKwkJc2hvcnQgaW50IGFzY2lpX2lpW10gPQorCQkgIHsgMHg2OTRDLCAweDU0NTQsIDB4NjU2QywgMHg2RTQ1LCAweDY5NDQsIDB4NkU2MSwgMCB9OworCQlpbnQgdXNlX2FzY2lpIChpbnQgaSkgeworCQkgIHJldHVybiBhc2NpaV9tbVtpXSArIGFzY2lpX2lpW2ldOworCQl9CisJCXNob3J0IGludCBlYmNkaWNfaWlbXSA9CisJCSAgeyAweDg5RDMsIDB4RTNFMywgMHg4NTkzLCAweDk1QzUsIDB4ODlDNCwgMHg5NTgxLCAwIH07CisJCXNob3J0IGludCBlYmNkaWNfbW1bXSA9CisJCSAgeyAweEMyQzksIDB4Qzc4NSwgMHg5NUM0LCAweDg5ODEsIDB4OTVFMiwgMHhBOEUyLCAwIH07CisJCWludCB1c2VfZWJjZGljIChpbnQgaSkgeworCQkgIHJldHVybiBlYmNkaWNfbW1baV0gKyBlYmNkaWNfaWlbaV07CisJCX0KKwkJZXh0ZXJuIGludCBmb287CisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHVzZV9hc2NpaSAoZm9vKSA9PSB1c2VfZWJjZGljIChmb28pOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGlmIGdyZXAgQklHZW5EaWFuU3lTIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbDsgdGhlbgorCSAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworCSAgICBmaQorCSAgICBpZiBncmVwIExpVFRsZUVuRGlhbiBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGwgOyB0aGVuCisJICAgICAgaWYgdGVzdCAiJGFjX2N2X2NfYmlnZW5kaWFuIiA9IHVua25vd247IHRoZW4KKwkJYWNfY3ZfY19iaWdlbmRpYW49bm8KKwkgICAgICBlbHNlCisJCSMgZmluZGluZyBib3RoIHN0cmluZ3MgaXMgdW5saWtlbHkgdG8gaGFwcGVuLCBidXQgd2hvIGtub3dzPworCQlhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisJICAgICAgZmkKKwkgICAgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworCisJICAgICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCisJICAgICB1bmlvbgorCSAgICAgeworCSAgICAgICBsb25nIGludCBsOworCSAgICAgICBjaGFyIGNbc2l6ZW9mIChsb25nIGludCldOworCSAgICAgfSB1OworCSAgICAgdS5sID0gMTsKKwkgICAgIHJldHVybiB1LmNbc2l6ZW9mIChsb25nIGludCkgLSAxXSA9PSAxOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCisgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19iaWdlbmRpYW4iID4mNjsgfQorIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCisgICB5ZXMpCisgICAgICRhc19lY2hvICIjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxIiA+PmNvbmZkZWZzLmgKKzs7ICMoCisgICBubykKKyAgICAgIDs7ICMoCisgICB1bml2ZXJzYWwpCisKKyRhc19lY2hvICIjZGVmaW5lIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAxIiA+PmNvbmZkZWZzLmgKKworICAgICA7OyAjKAorICAgKikKKyAgICAgYXNfZm5fZXJyb3IgJD8gInVua25vd24gZW5kaWFubmVzcworIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiAiJExJTkVOTyIgNSA7OworIGVzYWMKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGFzc2VtYmxlciAuY2ZpIHBzZXVkby1vcCBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGFzc2VtYmxlciAuY2ZpIHBzZXVkby1vcCBzdXBwb3J0Li4uICIgPiY2OyB9CitpZiAke2xpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgIGxpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wPXVua25vd24KKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCithc20gKCIuY2ZpX3N0YXJ0cHJvY1xuXHQuY2ZpX2VuZHByb2MiKTsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3A9eWVzCitlbHNlCisgIGxpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wIiA+JjUKKyRhc19lY2hvICIkbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3AiID4mNjsgfQoraWYgdGVzdCAieCRsaWJmZmlfY3ZfYXNfY2ZpX3BzZXVkb19vcCIgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVNfQ0ZJX1BTRVVET19PUCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworaWYgdGVzdCB4JFRBUkdFVCA9IHhTUEFSQzsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYXNzZW1ibGVyIGFuZCBsaW5rZXIgc3VwcG9ydCB1bmFsaWduZWQgcGMgcmVsYXRlZCByZWxvY3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgYXNzZW1ibGVyIGFuZCBsaW5rZXIgc3VwcG9ydCB1bmFsaWduZWQgcGMgcmVsYXRlZCByZWxvY3MuLi4gIiA+JjY7IH0KK2lmICR7bGliZmZpX2N2X2FzX3NwYXJjX3VhX3BjcmVsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCXNhdmVfTERGTEFHUz0iJExERkxBR1MiCisJQ0ZMQUdTPSIkQ0ZMQUdTIC1mcGljIgorCUxERkxBR1M9IiRMREZMQUdTIC1zaGFyZWQiCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworYXNtICgiLnRleHQ7IGZvbzogbm9wOyAuZGF0YTsgLmFsaWduIDQ7IC5ieXRlIDA7IC51YXdvcmQgJXJfZGlzcDMyKGZvbyk7IC50ZXh0Iik7CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGxpYmZmaV9jdl9hc19zcGFyY191YV9wY3JlbD15ZXMKK2Vsc2UKKyAgbGliZmZpX2N2X2FzX3NwYXJjX3VhX3BjcmVsPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKwlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGliZmZpX2N2X2FzX3NwYXJjX3VhX3BjcmVsIiA+JjUKKyRhc19lY2hvICIkbGliZmZpX2N2X2FzX3NwYXJjX3VhX3BjcmVsIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc19zcGFyY191YV9wY3JlbCIgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfQVNfU1BBUkNfVUFfUENSRUwgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBhc3NlbWJsZXIgLnJlZ2lzdGVyIHBzZXVkby1vcCBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGFzc2VtYmxlciAucmVnaXN0ZXIgcHNldWRvLW9wIHN1cHBvcnQuLi4gIiA+JjY7IH0KK2lmICR7bGliZmZpX2N2X2FzX3JlZ2lzdGVyX3BzZXVkb19vcCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgICAgICBsaWJmZmlfY3ZfYXNfcmVnaXN0ZXJfcHNldWRvX29wPXVua25vd24KKyAgICAgICAjIENoZWNrIGlmIHdlIGhhdmUgLnJlZ2lzdGVyCisgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworYXNtICgiLnJlZ2lzdGVyICVnMiwgI3NjcmF0Y2giKTsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgbGliZmZpX2N2X2FzX3JlZ2lzdGVyX3BzZXVkb19vcD15ZXMKK2Vsc2UKKyAgbGliZmZpX2N2X2FzX3JlZ2lzdGVyX3BzZXVkb19vcD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsaWJmZmlfY3ZfYXNfcmVnaXN0ZXJfcHNldWRvX29wIiA+JjUKKyRhc19lY2hvICIkbGliZmZpX2N2X2FzX3JlZ2lzdGVyX3BzZXVkb19vcCIgPiY2OyB9CisgICAgaWYgdGVzdCAieCRsaWJmZmlfY3ZfYXNfcmVnaXN0ZXJfcHNldWRvX29wIiA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BU19SRUdJU1RFUl9QU0VVRE9fT1AgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JFRBUkdFVCA9IHhYODYgfHwgdGVzdCB4JFRBUkdFVCA9IHhYODZfV0lOMzIgfHwgdGVzdCB4JFRBUkdFVCA9IHhYODZfNjQ7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGFzc2VtYmxlciBzdXBwb3J0cyBwYyByZWxhdGVkIHJlbG9jcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBhc3NlbWJsZXIgc3VwcG9ydHMgcGMgcmVsYXRlZCByZWxvY3MuLi4gIiA+JjY7IH0KK2lmICR7bGliZmZpX2N2X2FzX3g4Nl9wY3JlbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKwlsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsPW5vCisJZWNobyAnLnRleHQ7IGZvbzogbm9wOyAuZGF0YTsgLmxvbmcgZm9vLS47IC50ZXh0JyA+IGNvbmZ0ZXN0LnMKKwlpZiAkQ0MgJENGTEFHUyAtYyBjb25mdGVzdC5zID4gL2Rldi9udWxsOyB0aGVuCisJICAgbGliZmZpX2N2X2FzX3g4Nl9wY3JlbD15ZXMKKwlmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsIiA+JjUKKyRhc19lY2hvICIkbGliZmZpX2N2X2FzX3g4Nl9wY3JlbCIgPiY2OyB9CisgICAgaWYgdGVzdCAieCRsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsIiA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BU19YODZfUENSRUwgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBhc3NlbWJsZXIgLmFzY2lpIHBzZXVkby1vcCBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGFzc2VtYmxlciAuYXNjaWkgcHNldWRvLW9wIHN1cHBvcnQuLi4gIiA+JjY7IH0KK2lmICR7bGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgICAgICBsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wPXVua25vd24KKyAgICAgICAjIENoZWNrIGlmIHdlIGhhdmUgLmFzY2lpCisgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworYXNtICgiLmFzY2lpIFxcInN0cmluZ1xcIiIpOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wPXllcworZWxzZQorICBsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGxpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3AiID4mNQorJGFzX2VjaG8gIiRsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3AiID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0FTX0FTQ0lJX1BTRVVET19PUCAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGFzc2VtYmxlciAuc3RyaW5nIHBzZXVkby1vcCBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGFzc2VtYmxlciAuc3RyaW5nIHBzZXVkby1vcCBzdXBwb3J0Li4uICIgPiY2OyB9CitpZiAke2xpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAgICAgIGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wPXVua25vd24KKyAgICAgICAjIENoZWNrIGlmIHdlIGhhdmUgLnN0cmluZworICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2FzbSAoIi5zdHJpbmcgXFwic3RyaW5nXFwiIik7CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wPXllcworZWxzZQorICBsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcCIgPiY1CiskYXNfZWNobyAiJGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wIiA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BU19TVFJJTkdfUFNFVURPX09QIDEiID4+Y29uZmRlZnMuaAorCisgICAgZmkKK2ZpCisKK2lmIHRlc3QgeCRUQVJHRVQgPSB4WDg2X1dJTjY0OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scy4uLiAiID4mNjsgfQoraWYgJHtsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQoraW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQorX0xUX0VPRgorICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkYWNfY29tcGlsZVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiB7IHsgZXZhbCBlY2hvICJcIlwkYXNfbWVcIjoke2FzX2xpbmVuby0kTElORU5PfTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIiI7IH0gPiY1CisgIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgorICAgICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgorICAgICAgaWYgZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgICBlbHNlCisgICAgICAgIGlmIGdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIDoKKyAgICAgICAgZWxzZQorCSAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgICBjYXQgY29uZnRlc3QuYyA+JjUKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiID4mNQorJGFzX2VjaG8gIiRsdF9jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiID4mNjsgfQorICBzeXNfc3ltYm9sX3VuZGVyc2NvcmU9JGx0X2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZQorCisKKyAgICBpZiB0ZXN0ICJ4JHN5c19zeW1ib2xfdW5kZXJzY29yZSIgPSB4eWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNZTUJPTF9VTkRFUlNDT1JFIDEiID4+Y29uZmRlZnMuaAorCisgICAgZmkKK2ZpCisKKworRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRT0wCitjYXNlICIkdGFyZ2V0IiBpbgorICAgICAqYXJtKi1hcHBsZS1kYXJ3aW4qKQorICAgICAgIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEU9MQorCiskYXNfZWNobyAiI2RlZmluZSBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFIDEiID4+Y29uZmRlZnMuaAorCisgICAgIDs7CisgICAgICotYXBwbGUtZGFyd2luMTAqIHwgKi0qLWZyZWVic2QqIHwgKi0qLW9wZW5ic2QqIHwgKi1wYy1zb2xhcmlzKikKKworJGFzX2VjaG8gIiNkZWZpbmUgRkZJX01NQVBfRVhFQ19XUklUIDEiID4+Y29uZmRlZnMuaAorCisgICAgIDs7Citlc2FjCisgaWYgdGVzdCB4JEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUgPSB4MTsgdGhlbgorICBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFX1RSVUU9CisgIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfRkFMU0U9JyMnCitlbHNlCisgIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfVFJVRT0nIycKKyAgRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRV9GQUxTRT0KK2ZpCisKKworCitpZiB0ZXN0IHgkVEFSR0VUID0geFg4Nl82NDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYXNzZW1ibGVyIHN1cHBvcnRzIHVud2luZCBzZWN0aW9uIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgYXNzZW1ibGVyIHN1cHBvcnRzIHVud2luZCBzZWN0aW9uIHR5cGUuLi4gIiA+JjY7IH0KK2lmICR7bGliZmZpX2N2X2FzX3g4Nl82NF91bndpbmRfc2VjdGlvbl90eXBlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCWxpYmZmaV9jdl9hc194ODZfNjRfdW53aW5kX3NlY3Rpb25fdHlwZT15ZXMKKwllY2hvICcuc2VjdGlvbiAuZWhfZnJhbWUsImEiLEB1bndpbmQnID4gY29uZnRlc3QucworCWlmICRDQyAkQ0ZMQUdTIC1jIGNvbmZ0ZXN0LnMgMj4mMSB8IGdyZXAgLWkgd2FybmluZyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGU9bm8KKwlmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGUiID4mNQorJGFzX2VjaG8gIiRsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGUiID4mNjsgfQorICAgIGlmIHRlc3QgIngkbGliZmZpX2N2X2FzX3g4Nl82NF91bndpbmRfc2VjdGlvbl90eXBlIiA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9BU19YODZfNjRfVU5XSU5EX1NFQ1RJT05fVFlQRSAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCitmaQorCitpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIC5laF9mcmFtZSBzZWN0aW9uIHNob3VsZCBiZSByZWFkLW9ubHkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAuZWhfZnJhbWUgc2VjdGlvbiBzaG91bGQgYmUgcmVhZC1vbmx5Li4uICIgPiY2OyB9CitpZiAke2xpYmZmaV9jdl9yb19laF9mcmFtZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyAgCWxpYmZmaV9jdl9yb19laF9mcmFtZT1ubworICAJZWNobyAnZXh0ZXJuIHZvaWQgZm9vICh2b2lkKTsgdm9pZCBiYXIgKHZvaWQpIHsgZm9vICgpOyBmb28gKCk7IH0nID4gY29uZnRlc3QuYworICAJaWYgJENDICRDRkxBR1MgLVMgLWZwaWMgLWZleGNlcHRpb25zIC1vIGNvbmZ0ZXN0LnMgY29uZnRlc3QuYyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIAkgICAgaWYgZ3JlcCAnLnNlY3Rpb24uKmVoX2ZyYW1lLioiYSInIGNvbmZ0ZXN0LnMgPiAvZGV2L251bGw7IHRoZW4KKyAgCQlsaWJmZmlfY3Zfcm9fZWhfZnJhbWU9eWVzCisgIAkgICAgZWxpZiBncmVwICcuc2VjdGlvbi4qZWhfZnJhbWUuKiNhbGxvYycgY29uZnRlc3QuYyBcCisgIAkJIHwgZ3JlcCAtdiAnI3dyaXRlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAJCWxpYmZmaV9jdl9yb19laF9mcmFtZT15ZXMKKyAgCSAgICBmaQorICAJZmkKKyAgCXJtIC1mIGNvbmZ0ZXN0LioKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkbGliZmZpX2N2X3JvX2VoX2ZyYW1lIiA+JjUKKyRhc19lY2hvICIkbGliZmZpX2N2X3JvX2VoX2ZyYW1lIiA+JjY7IH0KKyAgaWYgdGVzdCAieCRsaWJmZmlfY3Zfcm9fZWhfZnJhbWUiID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1JPX0VIX0ZSQU1FIDEiID4+Y29uZmRlZnMuaAorCisKKyRhc19lY2hvICIjZGVmaW5lIEVIX0ZSQU1FX0ZMQUdTIFwiYVwiIiA+PmNvbmZkZWZzLmgKKworICBlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIEVIX0ZSQU1FX0ZMQUdTIFwiYXdcIiIgPj5jb25mZGVmcy5oCisKKyAgZmkKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiaGlkZGVuXCIpKSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJoaWRkZW5cIikpKS4uLiAiID4mNjsgfQoraWYgJHtsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworICAJZWNobyAnaW50IF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKSBmb28gKHZvaWQpIHsgcmV0dXJuIDEgIDsgfScgPiBjb25mdGVzdC5jCisgIAlsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlPW5vCisgIAlpZiB7IGFjX3RyeT0nJHtDQy1jY30gLVdlcnJvciAtUyBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0LnMgMT4mNScKKyAgeyB7IGV2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJGFjX3RyeVwiIjsgfSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4KKyAgCSAgICBpZiBncmVwICdcLmhpZGRlbi4qZm9vJyBjb25mdGVzdC5zID4vZGV2L251bGw7IHRoZW4KKyAgCQlsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlPXllcworICAJICAgIGZpCisgIAlmaQorICAJcm0gLWYgY29uZnRlc3QuKgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRsaWJmZmlfY3ZfaGlkZGVuX3Zpc2liaWxpdHlfYXR0cmlidXRlIiA+JjUKKyRhc19lY2hvICIkbGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZSIgPiY2OyB9CisgIGlmIHRlc3QgJGxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9ISURERU5fVklTSUJJTElUWV9BVFRSSUJVVEUgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKK2ZpCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfZGVidWc7IGlmIHRlc3QgIiRlbmFibGVfZGVidWciID0gInllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgRkZJX0RFQlVHIDEiID4+Y29uZmRlZnMuaAorCisgIGZpCitmaQorCisgaWYgdGVzdCAiJGVuYWJsZV9kZWJ1ZyIgPSAieWVzIjsgdGhlbgorICBGRklfREVCVUdfVFJVRT0KKyAgRkZJX0RFQlVHX0ZBTFNFPScjJworZWxzZQorICBGRklfREVCVUdfVFJVRT0nIycKKyAgRkZJX0RFQlVHX0ZBTFNFPQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RydWN0cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdHJ1Y3RzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfc3RydWN0czsgaWYgdGVzdCAiJGVuYWJsZV9zdHJ1Y3RzIiA9ICJubyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgRkZJX05PX1NUUlVDVFMgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXJhdy1hcGkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcmF3X2FwaStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3Jhd19hcGk7IGlmIHRlc3QgIiRlbmFibGVfcmF3X2FwaSIgPSAibm8iOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEZGSV9OT19SQVdfQVBJIDEiID4+Y29uZmRlZnMuaAorCisgIGZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wdXJpZnktc2FmZXR5IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3B1cmlmeV9zYWZldHkrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9wdXJpZnlfc2FmZXR5OyBpZiB0ZXN0ICIkZW5hYmxlX3B1cmlmeV9zYWZldHkiID0gInllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgVVNJTkdfUFVSSUZZIDEiID4+Y29uZmRlZnMuaAorCisgIGZpCitmaQorCisKKyMgVGhlc2UgdmFyaWFibGVzIGFyZSBvbmx5IGV2ZXIgdXNlZCB3aGVuIHdlIGNyb3NzLWJ1aWxkIHRvIFg4Nl9XSU4zMi4KKyMgQW5kIHdlIG9ubHkgc3VwcG9ydCB0aGlzIHdpdGggR0NDLCBzby4uLgoraWYgdGVzdCB4IiRHQ0MiICE9IHgibm8iOyB0aGVuCisgIGlmIHRlc3QgLW4gIiR3aXRoX2Nyb3NzX2hvc3QiICYmCisgICAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgorICAgIHRvb2xleGVjZGlyPSckKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcyknCisgICAgdG9vbGV4ZWNsaWJkaXI9JyQodG9vbGV4ZWNkaXIpL2xpYicKKyAgZWxzZQorICAgIHRvb2xleGVjZGlyPSckKGxpYmRpcikvZ2NjLWxpYi8kKHRhcmdldF9hbGlhcyknCisgICAgdG9vbGV4ZWNsaWJkaXI9JyQobGliZGlyKScKKyAgZmkKKyAgbXVsdGlfb3NfZGlyZWN0b3J5PWAkQ0MgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeWAKKyAgY2FzZSAkbXVsdGlfb3NfZGlyZWN0b3J5IGluCisgICAgLikgOzsgIyBBdm9pZCB0cmFpbGluZyAvLgorICAgICopIHRvb2xleGVjbGliZGlyPSR0b29sZXhlY2xpYmRpci8kbXVsdGlfb3NfZGlyZWN0b3J5IDs7CisgIGVzYWMKKworCitmaQorCitpZiB0ZXN0ICIke211bHRpbGlifSIgPSAieWVzIjsgdGhlbgorICBtdWx0aWxpYl9hcmc9Ii0tZW5hYmxlLW11bHRpbGliIgorZWxzZQorICBtdWx0aWxpYl9hcmc9CitmaQorCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgaW5jbHVkZSIKKworYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIHNyYyIKKworCithY19jb25maWdfbGlua3M9IiRhY19jb25maWdfbGlua3MgaW5jbHVkZS9mZml0YXJnZXQuaDpzcmMvJFRBUkdFVERJUi9mZml0YXJnZXQuaCIKKworCithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgaW5jbHVkZS9NYWtlZmlsZSBpbmNsdWRlL2ZmaS5oIE1ha2VmaWxlIHRlc3RzdWl0ZS9NYWtlZmlsZSBtYW4vTWFrZWZpbGUgbGliZmZpLnBjIgorCisKK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCisjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisjIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzLgorCitfQUNFT0YKKworIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCisgICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXM6IGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXC4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKSB8CisgIHNlZCAnCisgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorICAgICB0IGNsZWFyCisgICAgIDpjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6ZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIjsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICAgIGlmIHRlc3QgISAtZiAiJGNhY2hlX2ZpbGUiIHx8IHRlc3QgLWggIiRjYWNoZV9maWxlIjsgdGhlbgorCWNhdCBjb25mY2FjaGUgPiIkY2FjaGVfZmlsZSIKKyAgICAgIGVsc2UKKyAgICAgICAgY2FzZSAkY2FjaGVfZmlsZSBpbiAjKAorICAgICAgICAqLyogfCA/OiopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiQkICYmCisJICBtdiAtZiAiJGNhY2hlX2ZpbGUiJCQgIiRjYWNoZV9maWxlIiA7OyAjKAorICAgICAgICAqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIgOzsKKwllc2FjCisgICAgICBmaQorICAgIGZpCisgIGVsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworYWNfbGlib2Jqcz0KK2FjX2x0bGlib2Jqcz0KK1U9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKKyAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKyAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCisgIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCisgIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKKyBpZiB0ZXN0IC1uICIkRVhFRVhUIjsgdGhlbgorICBhbV9fRVhFRVhUX1RSVUU9CisgIGFtX19FWEVFWFRfRkFMU0U9JyMnCitlbHNlCisgIGFtX19FWEVFWFRfVFJVRT0nIycKKyAgYW1fX0VYRUVYVF9GQUxTRT0KK2ZpCisKK2lmIHRlc3QgLXogIiR7QU1ERVBfVFJVRX0iICYmIHRlc3QgLXogIiR7QU1ERVBfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ0FTX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NBU19GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ0NBU1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7TUFJTlRBSU5FUl9NT0RFX1RSVUV9IiAmJiB0ZXN0IC16ICIke01BSU5UQUlORVJfTU9ERV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIk1BSU5UQUlORVJfTU9ERVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7VEVTVFNVQkRJUl9UUlVFfSIgJiYgdGVzdCAteiAiJHtURVNUU1VCRElSX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiVEVTVFNVQkRJUlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7TUlQU19UUlVFfSIgJiYgdGVzdCAteiAiJHtNSVBTX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiTUlQU1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7U1BBUkNfVFJVRX0iICYmIHRlc3QgLXogIiR7U1BBUkNfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJTUEFSQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7WDg2X1RSVUV9IiAmJiB0ZXN0IC16ICIke1g4Nl9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlg4NlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7WDg2X0ZSRUVCU0RfVFJVRX0iICYmIHRlc3QgLXogIiR7WDg2X0ZSRUVCU0RfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJYODZfRlJFRUJTRFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7WDg2X1dJTjMyX1RSVUV9IiAmJiB0ZXN0IC16ICIke1g4Nl9XSU4zMl9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlg4Nl9XSU4zMlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7WDg2X1dJTjY0X1RSVUV9IiAmJiB0ZXN0IC16ICIke1g4Nl9XSU42NF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlg4Nl9XSU42NFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7WDg2X0RBUldJTl9UUlVFfSIgJiYgdGVzdCAteiAiJHtYODZfREFSV0lOX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiWDg2X0RBUldJTlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7QUxQSEFfVFJVRX0iICYmIHRlc3QgLXogIiR7QUxQSEFfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJBTFBIQVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7SUE2NF9UUlVFfSIgJiYgdGVzdCAteiAiJHtJQTY0X0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiSUE2NFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7TTMyUl9UUlVFfSIgJiYgdGVzdCAteiAiJHtNMzJSX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiTTMyUlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7TTY4S19UUlVFfSIgJiYgdGVzdCAteiAiJHtNNjhLX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiTTY4S1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7TU9YSUVfVFJVRX0iICYmIHRlc3QgLXogIiR7TU9YSUVfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJNT1hJRVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7UE9XRVJQQ19UUlVFfSIgJiYgdGVzdCAteiAiJHtQT1dFUlBDX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiUE9XRVJQQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7UE9XRVJQQ19BSVhfVFJVRX0iICYmIHRlc3QgLXogIiR7UE9XRVJQQ19BSVhfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJQT1dFUlBDX0FJWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7UE9XRVJQQ19EQVJXSU5fVFJVRX0iICYmIHRlc3QgLXogIiR7UE9XRVJQQ19EQVJXSU5fRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJQT1dFUlBDX0RBUldJTlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7UE9XRVJQQ19GUkVFQlNEX1RSVUV9IiAmJiB0ZXN0IC16ICIke1BPV0VSUENfRlJFRUJTRF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlBPV0VSUENfRlJFRUJTRFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7QVJNX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FSTV9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkFSTVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7QVZSMzJfVFJVRX0iICYmIHRlc3QgLXogIiR7QVZSMzJfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJBVlIzMlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7TElCRkZJX0NSSVNfVFJVRX0iICYmIHRlc3QgLXogIiR7TElCRkZJX0NSSVNfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJMSUJGRklfQ1JJU1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7RlJWX1RSVUV9IiAmJiB0ZXN0IC16ICIke0ZSVl9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkZSVlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7UzM5MF9UUlVFfSIgJiYgdGVzdCAteiAiJHtTMzkwX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiUzM5MFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7WDg2XzY0X1RSVUV9IiAmJiB0ZXN0IC16ICIke1g4Nl82NF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlg4Nl82NFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7U0hfVFJVRX0iICYmIHRlc3QgLXogIiR7U0hfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJTSFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7U0g2NF9UUlVFfSIgJiYgdGVzdCAteiAiJHtTSDY0X0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiU0g2NFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7UEFfTElOVVhfVFJVRX0iICYmIHRlc3QgLXogIiR7UEFfTElOVVhfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJQQV9MSU5VWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7UEFfSFBVWF9UUlVFfSIgJiYgdGVzdCAteiAiJHtQQV9IUFVYX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiUEFfSFBVWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgLXogIiR7UEE2NF9IUFVYX1RSVUV9IiAmJiB0ZXN0IC16ICIke1BBNjRfSFBVWF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIlBBNjRfSFBVWFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiAiJExJTkVOTyIgNQorZmkKKworaWYgdGVzdCAteiAiJHtGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFX1RSVUV9IiAmJiB0ZXN0IC16ICIke0ZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHtGRklfREVCVUdfVFJVRX0iICYmIHRlc3QgLXogIiR7RkZJX0RFQlVHX0ZBTFNFfSI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNvbmRpdGlvbmFsIFwiRkZJX0RFQlVHXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQorCis6ICIke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfSIKK2FjX3dyaXRlX2ZhaWw9MAorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQorYXNfd3JpdGVfZmFpbD0wCitjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyEgJFNIRUxMCisjIEdlbmVyYXRlZCBieSAkYXNfbWUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK2FjX2NzX3JlY2hlY2s9ZmFsc2UKK2FjX2NzX3NpbGVudD1mYWxzZQorCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorZXhwb3J0IFNIRUxMCitfQVNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisKKworYXNfbmw9JworJworZXhwb3J0IGFzX25sCisjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKyMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAorIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KK2lmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKKyAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50IC1yIC0tJworICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKK2VsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworZWxzZQorICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKyAgZWxzZQorICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKyAgICAgIGFyZz0kMTsKKyAgICAgIGNhc2UgJGFyZyBpbiAjKAorICAgICAgKiIkYXNfbmwiKikKKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworICAgICAgZXNhYzsKKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKyAgICAnCisgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5CisgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKyAgZmkKKyAgZXhwb3J0IGFzX2VjaG9fYm9keQorICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCitmaQorCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIFBBVEhfU0VQQVJBVE9SPToKKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgfQorZmkKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKyMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCitJRlM9IiAiIgkkYXNfbmwiCisKKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCithc19teXNlbGY9CitjYXNlICQwIGluICMoKAorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisgIGV4aXQgMQorZmkKKworIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgorIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgorIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAorIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KK2ZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKK2RvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCisgICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgorZG9uZQorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFCisKKyMgQ0RQQVRILgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCisKKyMgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0ICQ/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgorYXNfZm5fc2V0X3N0YXR1cyAoKQoreworICByZXR1cm4gJDEKK30gIyBhc19mbl9zZXRfc3RhdHVzCisKKyMgYXNfZm5fZXhpdCBTVEFUVVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgorYXNfZm5fZXhpdCAoKQoreworICBzZXQgK2UKKyAgYXNfZm5fc2V0X3N0YXR1cyAkMQorICBleGl0ICQxCit9ICMgYXNfZm5fZXhpdAorCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKyMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKKyMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgorIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQorIyBpbXBsZW1lbnRhdGlvbnMuCitpZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMSs9XCQyCisgIH0nCitlbHNlCisgIGFzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMT1cJCQxXCQyCisgIH0KK2ZpICMgYXNfZm5fYXBwZW5kCisKKyMgYXNfZm5fYXJpdGggQVJHLi4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCisjIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKKyMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCitpZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD0kKCggJCogKSkKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCisgIH0KK2ZpICMgYXNfZm5fYXJpdGgKKworCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCistbiopCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgorICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKK2ZpCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wJworICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9bG4KKyAgZWxzZQorICAgIGFzX2xuX3M9J2NwIC1wJworICBmaQorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisKKworIyBhc19mbl9ta2Rpcl9wCisjIC0tLS0tLS0tLS0tLS0KKyMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorYXNfZm5fbWtkaXJfcCAoKQoreworCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gIyBhc19mbl9ta2Rpcl9wCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc190ZXN0X3g9J3Rlc3QgLXgnCitlbHNlCisgIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGFzX2xzX0xfb3B0aW9uPUwKKyAgZWxzZQorICAgIGFzX2xzX0xfb3B0aW9uPQorICBmaQorICBhc190ZXN0X3g9JworICAgIGV2YWwgc2ggLWMgJ1wnJworICAgICAgaWYgdGVzdCAtZCAiJDEiOyB0aGVuCisJdGVzdCAtZCAiJDEvLiI7CisgICAgICBlbHNlCisJY2FzZSAkMSBpbiAjKAorCS0qKXNldCAiLi8kMSI7OworCWVzYWM7CisJY2FzZSBgbHMgLWxkJyRhc19sc19MX29wdGlvbicgIiQxIiAyPi9kZXYvbnVsbGAgaW4gIygoCisJPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQorICAgICdcJycgc2gKKyAgJworZmkKK2FzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCitleGVjIDY+JjEKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWluIGJvZHkgb2YgJENPTkZJR19TVEFUVVMgc2NyaXB0LiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0VPRgordGVzdCAkYXNfd3JpdGVfZmFpbCA9IDAgJiYgY2htb2QgK3ggJENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJDAgYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCisjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgorYWNfbG9nPSIKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgbGliZmZpICRhc19tZSAzLjAuMTAsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY4LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgICQgJDAgJEAKKworb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisiCisKK19BQ0VPRgorCitjYXNlICRhY19jb25maWdfZmlsZXMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKK2VzYWMKKworY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2hlYWRlcnM7IHNoaWZ0OyBhY19jb25maWdfaGVhZGVycz0kKjs7Citlc2FjCisKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCitjb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCitjb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgorY29uZmlnX2xpbmtzPSIkYWNfY29uZmlnX2xpbmtzIgorY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfdXNhZ2U9IlwKK1xgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gYWN0aW9ucworZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICBVbmxlc3MgdGhlIGZpbGVzCithbmQgYWN0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIFRBR3MsIGFsbCBhcmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVEFHXS4uLgorCisgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0CisgICAgICAtLWNvbmZpZyAgICAgcHJpbnQgY29uZmlndXJhdGlvbiwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudAorICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAgICAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAgICAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK0NvbmZpZ3VyYXRpb24gbGlua3M6CiskY29uZmlnX2xpbmtzCisKK0NvbmZpZ3VyYXRpb24gY29tbWFuZHM6CiskY29uZmlnX2NvbW1hbmRzCisKK1JlcG9ydCBidWdzIHRvIDxodHRwOi8vc291cmNld2FyZS5vcmcvbGliZmZpLmh0bWw+LiIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX2NvbmZpZz0iYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2AiCithY19jc192ZXJzaW9uPSJcXAorbGliZmZpIGNvbmZpZy5zdGF0dXMgMy4wLjEwCitjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjgsCisgIHdpdGggb3B0aW9ucyBcXCJcJGFjX2NzX2NvbmZpZ1xcIgorCitDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCisKK2FjX3B3ZD0nJGFjX3B3ZCcKK3NyY2Rpcj0nJHNyY2RpcicKK0lOU1RBTEw9JyRJTlNUQUxMJworTUtESVJfUD0nJE1LRElSX1AnCitBV0s9JyRBV0snCit0ZXN0IC1uICJcJEFXSyIgfHwgQVdLPWF3aworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KK2FjX25lZWRfZGVmYXVsdHM9Ogord2hpbGUgdGVzdCAkIyAhPSAwCitkbworICBjYXNlICQxIGluCisgIC0tKj0/KikKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgLS0qPSkKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz0KKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgKikKKyAgICBhY19vcHRpb249JDEKKyAgICBhY19vcHRhcmc9JDIKKyAgICBhY19zaGlmdD1zaGlmdAorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgYWNfY3NfcmVjaGVjaz06IDs7CisgIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisgIC0tY29uZmlnIHwgLS1jb25maSB8IC0tY29uZiB8IC0tY29uIHwgLS1jbyB8IC0tYyApCisgICAgJGFzX2VjaG8gIiRhY19jc19jb25maWciOyBleGl0IDs7CisgIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgJycpIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGZpbGUgYXJndW1lbnQiIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfRklMRVMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKyAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBhc19mbl9hcHBlbmQgQ09ORklHX0hFQURFUlMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICBhc19mbl9lcnJvciAkPyAiYW1iaWd1b3VzIG9wdGlvbjogXGAkMScKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDs7CisKKyAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ190YXJnZXRzICIgJDEiCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgc2V0IFggJyRTSEVMTCcgJyQwJyAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgorICBzaGlmdAorICBcJGFzX2VjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCBcJCoiID4mNgorICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICBleGVjICJcJEAiCitmaQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2V4ZWMgNT4+Y29uZmlnLmxvZworeworICBlY2hvCisgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCisjIyBSdW5uaW5nICRhc19tZS4gIyMKK19BU0JPWAorICAkYXNfZWNobyAiJGFjX2xvZyIKK30gPiY1CisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjCisjIElOSVQtQ09NTUFORFMKKyMKK2F4X2VuYWJsZV9idWlsZGRpcl9zcmNkaXI9IiRzcmNkaXIiICAgICAgICAgICAgICAgICAgICAjICRzcmNkaXIKK2F4X2VuYWJsZV9idWlsZGRpcl9ob3N0PSIkSE9TVCIgICAgICAgICAgICAgICAgICAgICAgICAjICRIT1NUIC8gJGhvc3QKK2F4X2VuYWJsZV9idWlsZGRpcl92ZXJzaW9uPSIkVkVSU0lPTiIgICAgICAgICAgICAgICAgICAjICRWRVJTSU9OCitheF9lbmFibGVfYnVpbGRkaXJfcGFja2FnZT0iJFBBQ0tBR0UiICAgICAgICAgICAgICAgICAgIyAkUEFDS0FHRQorYXhfZW5hYmxlX2J1aWxkZGlyX2F1eGRpcj0iJGF4X2VuYWJsZV9idWlsZGRpcl9hdXhkaXIiICMgJEFVWAorYXhfZW5hYmxlX2J1aWxkZGlyX3NlZD0iJGF4X2VuYWJsZV9idWlsZGRpcl9zZWQiICAgICAgICMgJFNFRAorYXhfZW5hYmxlX2J1aWxkZGlyPSIkYXhfZW5hYmxlX2J1aWxkZGlyIiAgICAgICAgICAgICAgICMgJFNVQgorCitBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCisKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JworZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKK21hY3JvX3ZlcnNpb249J2AkRUNITyAiJG1hY3JvX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbWFjcm9fcmV2aXNpb249J2AkRUNITyAiJG1hY3JvX3JldmlzaW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zaGFyZWQ9J2AkRUNITyAiJGVuYWJsZV9zaGFyZWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX3N0YXRpYz0nYCRFQ0hPICIkZW5hYmxlX3N0YXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwaWNfbW9kZT0nYCRFQ0hPICIkcGljX21vZGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Zhc3RfaW5zdGFsbD0nYCRFQ0hPICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitTSEVMTD0nYCRFQ0hPICIkU0hFTEwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRUNITz0nYCRFQ0hPICIkRUNITyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitob3N0X2FsaWFzPSdgJEVDSE8gIiRob3N0X2FsaWFzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hvc3Q9J2AkRUNITyAiJGhvc3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaG9zdF9vcz0nYCRFQ0hPICIkaG9zdF9vcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitidWlsZF9hbGlhcz0nYCRFQ0hPICIkYnVpbGRfYWxpYXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYnVpbGQ9J2AkRUNITyAiJGJ1aWxkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2J1aWxkX29zPSdgJEVDSE8gIiRidWlsZF9vcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitTRUQ9J2AkRUNITyAiJFNFRCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitYc2VkPSdgJEVDSE8gIiRYc2VkIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0dSRVA9J2AkRUNITyAiJEdSRVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworRUdSRVA9J2AkRUNITyAiJEVHUkVQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0ZHUkVQPSdgJEVDSE8gIiRGR1JFUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitMRD0nYCRFQ0hPICIkTEQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTk09J2AkRUNITyAiJE5NIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0xOX1M9J2AkRUNITyAiJExOX1MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbWF4X2NtZF9sZW49J2AkRUNITyAiJG1heF9jbWRfbGVuIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FjX29iamV4dD0nYCRFQ0hPICIkYWNfb2JqZXh0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2V4ZWV4dD0nYCRFQ0hPICIkZXhlZXh0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Vuc2V0PSdgJEVDSE8gIiRsdF91bnNldCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9TUDJOTD0nYCRFQ0hPICIkbHRfU1AyTkwiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfTkwyU1A9J2AkRUNITyAiJGx0X05MMlNQIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9J2AkRUNITyAiJGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3ZfdG9fdG9vbF9maWxlX2NtZD0nYCRFQ0hPICIkbHRfY3ZfdG9fdG9vbF9maWxlX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCityZWxvYWRfZmxhZz0nYCRFQ0hPICIkcmVsb2FkX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcmVsb2FkX2NtZHM9J2AkRUNITyAiJHJlbG9hZF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK09CSkRVTVA9J2AkRUNITyAiJE9CSkRVTVAiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZGVwbGlic19jaGVja19tZXRob2Q9J2AkRUNITyAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbWFnaWNfY21kPSdgJEVDSE8gIiRmaWxlX21hZ2ljX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitmaWxlX21hZ2ljX2dsb2I9J2AkRUNITyAiJGZpbGVfbWFnaWNfZ2xvYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit3YW50X25vY2FzZWdsb2I9J2AkRUNITyAiJHdhbnRfbm9jYXNlZ2xvYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitETExUT09MPSdgJEVDSE8gIiRETExUT09MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSdgJEVDSE8gIiRzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitBUj0nYCRFQ0hPICIkQVIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworQVJfRkxBR1M9J2AkRUNITyAiJEFSX0ZMQUdTIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVyX2xpc3Rfc3BlYz0nYCRFQ0hPICIkYXJjaGl2ZXJfbGlzdF9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK1NUUklQPSdgJEVDSE8gIiRTVFJJUCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitSQU5MSUI9J2AkRUNITyAiJFJBTkxJQiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nYCRFQ0hPICIkb2xkX3Bvc3RpbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0nYCRFQ0hPICIkb2xkX3Bvc3R1bmluc3RhbGxfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitvbGRfYXJjaGl2ZV9jbWRzPSdgJEVDSE8gIiRvbGRfYXJjaGl2ZV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj0nYCRFQ0hPICIkbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0NDPSdgJEVDSE8gIiRDQyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitDRkxBR1M9J2AkRUNITyAiJENGTEFHUyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitjb21waWxlcj0nYCRFQ0hPICIkY29tcGlsZXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworR0NDPSdgJEVDSE8gIiRHQ0MiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0nYCRFQ0hPICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9J2AkRUNITyAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9J2AkRUNITyAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm1fZmlsZV9saXN0X3NwZWM9J2AkRUNITyAiJG5tX2ZpbGVfbGlzdF9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3N5c3Jvb3Q9J2AkRUNITyAiJGx0X3N5c3Jvb3QiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2JqZGlyPSdgJEVDSE8gIiRvYmpkaXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworTUFHSUNfQ01EPSdgJEVDSE8gIiRNQUdJQ19DTUQiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9J2AkRUNITyAiJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfcGljPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9wcm9nX2NvbXBpbGVyX3dsPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3dsIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljPSdgJEVDSE8gIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfbz0nYCRFQ0hPICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF9sb2Nrcz0nYCRFQ0hPICIkbmVlZF9sb2NrcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitNQU5JRkVTVF9UT09MPSdgJEVDSE8gIiRNQU5JRkVTVF9UT09MIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK0RTWU1VVElMPSdgJEVDSE8gIiREU1lNVVRJTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitOTUVESVQ9J2AkRUNITyAiJE5NRURJVCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitMSVBPPSdgJEVDSE8gIiRMSVBPIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK09UT09MPSdgJEVDSE8gIiRPVE9PTCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitPVE9PTDY0PSdgJEVDSE8gIiRPVE9PTDY0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xpYmV4dD0nYCRFQ0hPICIkbGliZXh0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NocmV4dF9jbWRzPSdgJEVDSE8gIiRzaHJleHRfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleHRyYWN0X2V4cHN5bXNfY21kcz0nYCRFQ0hPICIkZXh0cmFjdF9leHBzeW1zX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYXJjaGl2ZV9jbWRzX25lZWRfbGM9J2AkRUNITyAiJGFyY2hpdmVfY21kc19uZWVkX2xjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9J2AkRUNITyAiJGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSdgJEVDSE8gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJword2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9J2AkRUNITyAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2NvbXBpbGVyX25lZWRzX29iamVjdD0nYCRFQ0hPICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9J2AkRUNITyAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfY21kcz0nYCRFQ0hPICIkYXJjaGl2ZV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2FyY2hpdmVfZXhwc3ltX2NtZHM9J2AkRUNITyAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbW9kdWxlX2NtZHM9J2AkRUNITyAiJG1vZHVsZV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK21vZHVsZV9leHBzeW1fY21kcz0nYCRFQ0hPICIkbW9kdWxlX2V4cHN5bV9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3dpdGhfZ251X2xkPSdgJEVDSE8gIiR3aXRoX2dudV9sZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCithbGxvd191bmRlZmluZWRfZmxhZz0nYCRFQ0hPICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbm9fdW5kZWZpbmVkX2ZsYWc9J2AkRUNITyAiJG5vX3VuZGVmaW5lZF9mbGFnIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2AkRUNITyAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0nYCRFQ0hPICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSdgJEVDSE8gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdD0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0IiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0nYCRFQ0hPICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2hhcmRjb2RlX21pbnVzX0w9J2AkRUNITyAiJGhhcmRjb2RlX21pbnVzX0wiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0nYCRFQ0hPICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9hdXRvbWF0aWM9J2AkRUNITyAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmhlcml0X3JwYXRoPSdgJEVDSE8gIiRpbmhlcml0X3JwYXRoIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2xpbmtfYWxsX2RlcGxpYnM9J2AkRUNITyAiJGxpbmtfYWxsX2RlcGxpYnMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSdgJEVDSE8gIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZXhwb3J0X3N5bWJvbHNfY21kcz0nYCRFQ0hPICIkZXhwb3J0X3N5bWJvbHNfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitleGNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGV4Y2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitpbmNsdWRlX2V4cHN5bXM9J2AkRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwcmVsaW5rX2NtZHM9J2AkRUNITyAiJHByZWxpbmtfY21kcyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitwb3N0bGlua19jbWRzPSdgJEVDSE8gIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbGVfbGlzdF9zcGVjPSdgJEVDSE8gIiRmaWxlX2xpc3Rfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0nYCRFQ0hPICIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF9saWJfcHJlZml4PSdgJEVDSE8gIiRuZWVkX2xpYl9wcmVmaXgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbmVlZF92ZXJzaW9uPSdgJEVDSE8gIiRuZWVkX3ZlcnNpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwordmVyc2lvbl90eXBlPSdgJEVDSE8gIiR2ZXJzaW9uX3R5cGUiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcnVucGF0aF92YXI9J2AkRUNITyAiJHJ1bnBhdGhfdmFyIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3NobGlicGF0aF92YXI9J2AkRUNITyAiJHNobGlicGF0aF92YXIiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSdgJEVDSE8gIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlibmFtZV9zcGVjPSdgJEVDSE8gIiRsaWJuYW1lX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbGlicmFyeV9uYW1lc19zcGVjPSdgJEVDSE8gIiRsaWJyYXJ5X25hbWVzX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworc29uYW1lX3NwZWM9J2AkRUNITyAiJHNvbmFtZV9zcGVjIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2luc3RhbGxfb3ZlcnJpZGVfbW9kZT0nYCRFQ0hPICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3Bvc3RpbnN0YWxsX2NtZHM9J2AkRUNITyAiJHBvc3RpbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworcG9zdHVuaW5zdGFsbF9jbWRzPSdgJEVDSE8gIiRwb3N0dW5pbnN0YWxsX2NtZHMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZmluaXNoX2NtZHM9J2AkRUNITyAiJGZpbmlzaF9jbWRzIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK2ZpbmlzaF9ldmFsPSdgJEVDSE8gIiRmaW5pc2hfZXZhbCIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitoYXJkY29kZV9pbnRvX2xpYnM9J2AkRUNITyAiJGhhcmRjb2RlX2ludG9fbGlicyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9J2AkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nYCRFQ0hPICIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworaGFyZGNvZGVfYWN0aW9uPSdgJEVDSE8gIiRoYXJkY29kZV9hY3Rpb24iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworZW5hYmxlX2Rsb3Blbj0nYCRFQ0hPICIkZW5hYmxlX2Rsb3BlbiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGY9J2AkRUNITyAiJGVuYWJsZV9kbG9wZW5fc2VsZiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCitlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSdgJEVDSE8gIiRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK29sZF9zdHJpcGxpYj0nYCRFQ0hPICIkb2xkX3N0cmlwbGliIiB8ICRTRUQgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK3N0cmlwbGliPSdgJEVDSE8gIiRzdHJpcGxpYiIgfCAkU0VEICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnCisKK0xUQ0M9JyRMVENDJworTFRDRkxBR1M9JyRMVENGTEFHUycKK2NvbXBpbGVyPSckY29tcGlsZXJfREVGQVVMVCcKKworIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgorZnVuY19mYWxsYmFja19lY2hvICgpCit7CisgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCitcJDEKK19MVEVDSE9fRU9GJworfQorCisjIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBTSEVMTCBcCitFQ0hPIFwKK1NFRCBcCitHUkVQIFwKK0VHUkVQIFwKK0ZHUkVQIFwKK0xEIFwKK05NIFwKK0xOX1MgXAorbHRfU1AyTkwgXAorbHRfTkwyU1AgXAorcmVsb2FkX2ZsYWcgXAorT0JKRFVNUCBcCitkZXBsaWJzX2NoZWNrX21ldGhvZCBcCitmaWxlX21hZ2ljX2NtZCBcCitmaWxlX21hZ2ljX2dsb2IgXAord2FudF9ub2Nhc2VnbG9iIFwKK0RMTFRPT0wgXAorc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQgXAorQVIgXAorQVJfRkxBR1MgXAorYXJjaGl2ZXJfbGlzdF9zcGVjIFwKK1NUUklQIFwKK1JBTkxJQiBcCitDQyBcCitDRkxBR1MgXAorY29tcGlsZXIgXAorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IFwKK25tX2ZpbGVfbGlzdF9zcGVjIFwKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIFwKK2x0X3Byb2dfY29tcGlsZXJfcGljIFwKK2x0X3Byb2dfY29tcGlsZXJfd2wgXAorbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgXAorbHRfY3ZfcHJvZ19jb21waWxlcl9jX28gXAorbmVlZF9sb2NrcyBcCitNQU5JRkVTVF9UT09MIFwKK0RTWU1VVElMIFwKK05NRURJVCBcCitMSVBPIFwKK09UT09MIFwKK09UT09MNjQgXAorc2hyZXh0X2NtZHMgXAorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjIFwKK2NvbXBpbGVyX25lZWRzX29iamVjdCBcCit3aXRoX2dudV9sZCBcCithbGxvd191bmRlZmluZWRfZmxhZyBcCitub191bmRlZmluZWRfZmxhZyBcCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIFwKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQgXAoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBcCitleGNsdWRlX2V4cHN5bXMgXAoraW5jbHVkZV9leHBzeW1zIFwKK2ZpbGVfbGlzdF9zcGVjIFwKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIFwKK2xpYm5hbWVfc3BlYyBcCitsaWJyYXJ5X25hbWVzX3NwZWMgXAorc29uYW1lX3NwZWMgXAoraW5zdGFsbF9vdmVycmlkZV9tb2RlIFwKK2ZpbmlzaF9ldmFsIFwKK29sZF9zdHJpcGxpYiBcCitzdHJpcGxpYjsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPIFxcXFwiIlxcXFxcJFwkdmFyIlxcXFwiXGAgaW4KKyAgICAqW1xcXFxcXFxgXFwiXFxcJF0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gcmVsb2FkX2NtZHMgXAorb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAorb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCitvbGRfYXJjaGl2ZV9jbWRzIFwKK2V4dHJhY3RfZXhwc3ltc19jbWRzIFwKK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgXAorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgXAorYXJjaGl2ZV9jbWRzIFwKK2FyY2hpdmVfZXhwc3ltX2NtZHMgXAorbW9kdWxlX2NtZHMgXAorbW9kdWxlX2V4cHN5bV9jbWRzIFwKK2V4cG9ydF9zeW1ib2xzX2NtZHMgXAorcHJlbGlua19jbWRzIFwKK3Bvc3RsaW5rX2NtZHMgXAorcG9zdGluc3RhbGxfY21kcyBcCitwb3N0dW5pbnN0YWxsX2NtZHMgXAorZmluaXNoX2NtZHMgXAorc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIFwKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbXFxcXFxcXGBcXCJcXFwkXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlxcXCRcJHZhclxcIiB8IFxcXCRTRUQgLWUgXFwiXFxcJGRvdWJsZV9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRkZWxheV92YXJpYWJsZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInCit4c2lfc2hlbGw9JyR4c2lfc2hlbGwnCitsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnCisKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCisKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJworCisKKworVEFSR0VURElSPSIkVEFSR0VURElSIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorCisjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KK2ZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cworZG8KKyAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgorICAgICJmZmljb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgZmZpY29uZmlnLmgiIDs7CisgICAgImJ1aWxkaXIiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgYnVpbGRpciIgOzsKKyAgICAiZGVwZmlsZXMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7CisgICAgImxpYnRvb2wiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgbGlidG9vbCIgOzsKKyAgICAiaW5jbHVkZSIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBpbmNsdWRlIiA7OworICAgICJzcmMiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgc3JjIiA7OworICAgICJpbmNsdWRlL2ZmaXRhcmdldC5oIikgQ09ORklHX0xJTktTPSIkQ09ORklHX0xJTktTIGluY2x1ZGUvZmZpdGFyZ2V0Lmg6c3JjLyRUQVJHRVRESVIvZmZpdGFyZ2V0LmgiIDs7CisgICAgImluY2x1ZGUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW5jbHVkZS9NYWtlZmlsZSIgOzsKKyAgICAiaW5jbHVkZS9mZmkuaCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpbmNsdWRlL2ZmaS5oIiA7OworICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgICAidGVzdHN1aXRlL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3RzdWl0ZS9NYWtlZmlsZSIgOzsKKyAgICAibWFuL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1hbi9NYWtlZmlsZSIgOzsKKyAgICAibGliZmZpLnBjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYmZmaS5wYyIgOzsKKworICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKKyAgZXNhYworZG9uZQorCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0xJTktTK3NldH0iID0gc2V0IHx8IENPTkZJR19MSU5LUz0kY29uZmlnX2xpbmtzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKKyMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorJGRlYnVnIHx8Cit7CisgIHRtcD0gYWNfdG1wPQorICB0cmFwICdleGl0X3N0YXR1cz0kPworICA6ICIke2FjX3RtcDo9JHRtcH0iCisgIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKKyAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKK30KKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCit9IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorYWNfdG1wPSR0bXAKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgoraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKworCithY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCisjIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCisjIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKKyMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCitpZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KKyAgZXZhbCBhY19jcj1cJFwnXFxyXCcKK2ZpCithY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCitpZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgorICBhY19jc19hd2tfY3I9J1xccicKK2Vsc2UKKyAgYWNfY3NfYXdrX2NyPSRhY19jcgorZmkKKworZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKK19BQ0VPRgorCisKK3sKKyAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKKyAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgorICBlY2hvICJfQUNFT0YiCit9ID5jb25mJCRzdWJzLnNoIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKK2FjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCisgIC4gLi9jb25mJCRzdWJzLnNoIHx8CisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisgIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCisgIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorcm0gLWYgY29uZiQkc3Vicy5zaAorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKK19BQ0VPRgorc2VkIC1uICcKK2gKK3MvXi9TWyIvOyBzLyEuKi8iXT0vCitwCitnCitzL15bXiFdKiEvLworOnJlcGwKK3QgcmVwbAorcy8nIiRhY19kZWxpbSInJC8vCit0IGRlbGltCis6bmwKK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLworcAorbgorYiByZXBsCis6bW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBubAorOmRlbGltCitoCitzL1woLlx7MTQ4XH1cKS4uKi9cMS8KK3QgbW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCitwCitiCis6bW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBkZWxpbQorJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJworL15bXiIiXS97CisgIE4KKyAgcy9cbi8vCit9CisnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCitybSAtZiBjb25mJCRzdWJzLmF3aworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitfQUNBV0sKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCisgIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCisKK30KK3sKKyAgbGluZSA9ICQgMAorICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKKyAgc3Vic3RlZCA9IDAKKyAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQorICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7CisgICAga2V5ID0gZmllbGRbaV0KKyAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQorICAgIGlmIChTX2lzX3NldFtrZXldKSB7CisgICAgICB2YWx1ZSA9IFNba2V5XQorICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQorICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKKyAgICAgIHN1YnN0ZWQgPSAxCisgICAgfSBlbHNlCisgICAgICBsZW4gKz0gMSArIGtleWxlbgorICB9CisKKyAgcHJpbnQgbGluZQorfQorCitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQoraWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCitlbHNlCisgIGNhdAorZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorX0FDRU9GCisKKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKK2gKK3MvLy8KK3MvXi86Lworcy9bCSBdKiQvOi8KK3MvOlwkKHNyY2Rpcik6LzovZworcy86XCR7c3JjZGlyfTovOi9nCitzLzpAc3JjZGlyQDovOi9nCitzL146Ki8vCitzLzoqJC8vCit4CitzL1woPVsJIF0qXCkuKi9cMS8KK0cKK3MvXG4vLworcy9eW149XSo9WwkgXSokLy8KK30nCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCitpZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCitjYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKK0JFR0lOIHsKK19BQ0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcworIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bworIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgorCisjIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCisjIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCisgIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKKyAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCisKKyMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAorIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCisjIG5ld2xpbmUgc2VxdWVuY2VzLgorCithY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgorc2VkIC1uICcKK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCByc2V0Cis6cnNldAorcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KK3QgZGVmCitkCis6ZGVmCitzL1xcJC8vCit0IGJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzIi9wCitzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAorZAorOmJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCit0IGNvbnQKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCit0IGNvbnQKK2QKKzpjb250CituCitzLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKK3QgY2xlYXIKKzpjbGVhcgorcy9cXCQvLwordCBic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCitkCis6YnNubGMKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAorYiBjb250CisnIDxjb25mZGVmcy5oIHwgc2VkICcKK3MvJyIkYWNfZGVsaW0iJy8iXFxcCisiL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorfQorL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7CisgIGxpbmUgPSBcJCAwCisgIHNwbGl0KGxpbmUsIGFyZywgIiAiKQorICBpZiAoYXJnWzFdID09ICIjIikgeworICAgIGRlZnVuZGVmID0gYXJnWzJdCisgICAgbWFjMSA9IGFyZ1szXQorICB9IGVsc2UgeworICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKKyAgICBtYWMxID0gYXJnWzJdCisgIH0KKyAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQorICBtYWNybyA9IG1hYzJbMV0KKyAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCisgIGlmIChEX2lzX3NldFttYWNyb10pIHsKKyAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgorICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KKyAgICBuZXh0CisgIH0gZWxzZSB7CisgICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAorICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKyAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgeworICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgorICAgICAgbmV4dAorICAgIH0KKyAgfQorfQoreyBwcmludCB9CitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgorCisKK2V2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICA6TCAkQ09ORklHX0xJTktTICA6QyAkQ09ORklHX0NPTU1BTkRTIgorc2hpZnQKK2ZvciBhY190YWcKK2RvCisgIGNhc2UgJGFjX3RhZyBpbgorICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKKyAgZXNhYworICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorICA6W0ZITF0qOiopOzsKKyAgOkwqIHwgOkMqOiopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHRhZyBcYCRhY190YWcnIiAiJExJTkVOTyIgNTs7CisgIDpbRkhdLSkgYWNfdGFnPS06LTs7CisgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CisgIGVzYWMKKyAgYWNfc2F2ZV9JRlM9JElGUworICBJRlM9OgorICBzZXQgeCAkYWNfdGFnCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgc2hpZnQKKyAgYWNfZmlsZT0kMQorICBzaGlmdAorCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkwpIGFjX3NvdXJjZT0kMTs7CisgIDpbRkhdKQorICAgIGFjX2ZpbGVfaW5wdXRzPQorICAgIGZvciBhY19mCisgICAgZG8KKyAgICAgIGNhc2UgJGFjX2YgaW4KKyAgICAgIC0pIGFjX2Y9IiRhY190bXAvc3RkaW4iOzsKKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCisJICMgKGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSkuICBUaGUgYWJzb2x1dGUgcGF0aCBjYW5ub3QgYmUgRE9TLXN0eWxlLAorCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgorCSB0ZXN0IC1mICIkYWNfZiIgfHwKKwkgICBjYXNlICRhY19mIGluCisJICAgW1xcLyRdKikgZmFsc2U7OworCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKKwkgICBlc2FjIHx8CisJICAgYXNfZm5fZXJyb3IgMSAiY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogXGAkYWNfZiciICIkTElORU5PIiA1OzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX2YgaW4gKlwnKikgYWNfZj1gJGFzX2VjaG8gIiRhY19mIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7IGVzYWMKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19maWxlX2lucHV0cyAiICckYWNfZiciCisgICAgZG9uZQorCisgICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgICBjb25maWd1cmVfaW5wdXQ9J0dlbmVyYXRlZCBmcm9tICdgCisJICAkYXNfZWNobyAiJCoiIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZycKKwlgJyBieSBjb25maWd1cmUuJworICAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKyAgICBmaQorICAgICMgTmV1dHJhbGl6ZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW50ZXJwcmV0ZWQgYnkgc2VkIGluIHJlcGxhY2VtZW50IHN0cmluZ3MuCisgICAgY2FzZSAkY29uZmlndXJlX2lucHV0IGluICMoCisgICAgKlwmKiB8ICpcfCogfCAqXFwqICkKKyAgICAgICBhY19zZWRfY29uZl9pbnB1dD1gJGFzX2VjaG8gIiRjb25maWd1cmVfaW5wdXQiIHwKKyAgICAgICBzZWQgJ3MvW1xcXFwmfF0vXFxcXCYvZydgOzsgIygKKyAgICAqKSBhY19zZWRfY29uZl9pbnB1dD0kY29uZmlndXJlX2lucHV0OzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRhY190YWcgaW4KKyAgICAqOi06KiB8ICo6LSkgY2F0ID4iJGFjX3RtcC9zdGRpbiIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1IDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKworICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIGFzX2Rpcj0iJGFjX2RpciI7IGFzX2ZuX21rZGlyX3AKKyAgYWNfYnVpbGRkaXI9LgorCitjYXNlICIkYWNfZGlyIiBpbgorLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisqKQorICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YCRhc19lY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3N8L1teXFwvXSp8Ly4ufGc7c3wvfHwnYAorICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CisgIGVzYWMgOzsKK2VzYWMKK2FjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAorYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKK2FjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKK2VzYWMKK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKworCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkYpCisgICMKKyAgIyBDT05GSUdfRklMRQorICAjCisKKyAgY2FzZSAkSU5TVEFMTCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7CisgICopIGFjX0lOU1RBTEw9JGFjX3RvcF9idWlsZF9wcmVmaXgkSU5TVEFMTCA7OworICBlc2FjCisgIGFjX01LRElSX1A9JE1LRElSX1AKKyAgY2FzZSAkTUtESVJfUCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSA7OworICAqLyopIGFjX01LRElSX1A9JGFjX3RvcF9idWlsZF9wcmVmaXgkTUtESVJfUCA7OworICBlc2FjCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgorIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCithY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KK2FjX3NlZF9kYXRhcm9vdD0nCisvZGF0YXJvb3RkaXIvIHsKKyAgcAorICBxCit9CisvQGRhdGFkaXJAL3AKKy9AZG9jZGlyQC9wCisvQGluZm9kaXJAL3AKKy9AbG9jYWxlZGlyQC9wCisvQG1hbmRpckAvcCcKK2Nhc2UgYGV2YWwgInNlZCAtbiBcIlwkYWNfc2VkX2RhdGFyb290XCIgJGFjX2ZpbGVfaW5wdXRzImAgaW4KKypkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKypAZGF0YWRpckAqfCpAZG9jZGlyQCp8KkBpbmZvZGlyQCp8KkBsb2NhbGVkaXJAKnwqQG1hbmRpckAqKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mMjt9CitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhY19kYXRhcm9vdGRpcl9oYWNrPScKKyAgcyZAZGF0YWRpckAmJGRhdGFkaXImZworICBzJkBkb2NkaXJAJiRkb2NkaXImZworICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCisgIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCisgIHMmQG1hbmRpckAmJG1hbmRpciZnCisgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Citlc2FjCitfQUNFT0YKKworIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgorIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCisjIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/CitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX3NlZF9leHRyYT0iJGFjX3Zwc3ViCiskZXh0cmFzdWIKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorOnQKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK3N8QGNvbmZpZ3VyZV9pbnB1dEB8JGFjX3NlZF9jb25mX2lucHV0fDt0IHQKK3MmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAorcyZAdG9wX2J1aWxkX3ByZWZpeEAmJGFjX3RvcF9idWlsZF9wcmVmaXgmO3QgdAorcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKK3MmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKK3MmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0CitzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAorcyZATUtESVJfUEAmJGFjX01LRElSX1AmO3QgdAorJGFjX2RhdGFyb290ZGlyX2hhY2sKKyIKK2V2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiB8ICRBV0sgLWYgIiRhY190bXAvc3Vicy5hd2siIFwKKyAgPiRhY190bXAvb3V0IHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorCit0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkYWNfdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyBcCisgICAgICAiJGFjX3RtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiYyO30KKworICBybSAtZiAiJGFjX3RtcC9zdGRpbiIKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtKSBjYXQgIiRhY190bXAvb3V0IiAmJiBybSAtZiAiJGFjX3RtcC9vdXQiOzsKKyAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJGFjX3RtcC9vdXQiICIkYWNfZmlsZSI7OworICBlc2FjIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgOzsKKyAgOkgpCisgICMKKyAgIyBDT05GSUdfSEVBREVSCisgICMKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsKKyAgICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiCisgICAgfSA+IiRhY190bXAvY29uZmlnLmgiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJGFjX3RtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CisgICAgZWxzZQorICAgICAgcm0gLWYgIiRhY19maWxlIgorICAgICAgbXYgIiRhY190bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAorCXx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAtIiAiJExJTkVOTyIgNQorICBmaQorIyBDb21wdXRlICIkYWNfZmlsZSIncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCitfYW1fYXJnPSIkYWNfZmlsZSIKK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YCRhc19kaXJuYW1lIC0tICIkX2FtX2FyZyIgfHwKKyRhc19leHByIFgiJF9hbV9hcmciIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJF9hbV9hcmciIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJF9hbV9hcmciIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJF9hbV9hcmciIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkX2FtX2FyZyIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgL3N0YW1wLWgkX2FtX3N0YW1wX2NvdW50CisgOzsKKyAgOkwpCisgICMKKyAgIyBDT05GSUdfTElOSworICAjCisKKyAgaWYgdGVzdCAiJGFjX3NvdXJjZSIgPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRzcmNkaXIiID0gJy4nOyB0aGVuCisgICAgOgorICBlbHNlCisgICAgIyBQcmVmZXIgdGhlIGZpbGUgZnJvbSB0aGUgc291cmNlIHRyZWUgaWYgbmFtZXMgYXJlIGlkZW50aWNhbC4KKyAgICBpZiB0ZXN0ICIkYWNfc291cmNlIiA9ICIkYWNfZmlsZSIgfHwgdGVzdCAhIC1yICIkYWNfc291cmNlIjsgdGhlbgorICAgICAgYWNfc291cmNlPSRzcmNkaXIvJGFjX3NvdXJjZQorICAgIGZpCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxpbmtpbmcgJGFjX3NvdXJjZSB0byAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsaW5raW5nICRhY19zb3VyY2UgdG8gJGFjX2ZpbGUiID4mNjt9CisKKyAgICBpZiB0ZXN0ICEgLXIgIiRhY19zb3VyY2UiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiJGFjX3NvdXJjZTogZmlsZSBub3QgZm91bmQiICIkTElORU5PIiA1CisgICAgZmkKKyAgICBybSAtZiAiJGFjX2ZpbGUiCisKKyAgICAjIFRyeSBhIHJlbGF0aXZlIHN5bWxpbmssIHRoZW4gYSBoYXJkIGxpbmssIHRoZW4gYSBjb3B5LgorICAgIGNhc2UgJGFjX3NvdXJjZSBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX3JlbF9zb3VyY2U9JGFjX3NvdXJjZSA7OworCSopIGFjX3JlbF9zb3VyY2U9JGFjX3RvcF9idWlsZF9wcmVmaXgkYWNfc291cmNlIDs7CisgICAgZXNhYworICAgIGxuIC1zICIkYWNfcmVsX3NvdXJjZSIgIiRhY19maWxlIiAyPi9kZXYvbnVsbCB8fAorICAgICAgbG4gIiRhY19zb3VyY2UiICIkYWNfZmlsZSIgMj4vZGV2L251bGwgfHwKKyAgICAgIGNwIC1wICIkYWNfc291cmNlIiAiJGFjX2ZpbGUiIHx8CisgICAgICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGxpbmsgb3IgY29weSAkYWNfc291cmNlIHRvICRhY19maWxlIiAiJExJTkVOTyIgNQorICBmaQorIDs7CisgIDpDKSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjY7fQorIDs7CisgIGVzYWMKKworCisgIGNhc2UgJGFjX2ZpbGUkYWNfbW9kZSBpbgorICAgICJidWlsZGlyIjpDKSAgIGFjX3RvcF9zcmNkaXI9IiRheF9lbmFibGVfYnVpbGRkaXJfc3JjZGlyIgorICBpZiB0ZXN0ICIuJGF4X2VuYWJsZV9idWlsZGRpciIgPSAiLi4iIDsgdGhlbgorICAgIGlmIHRlc3QgLWYgIiR0b3Bfc3JjZGlyL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogc2tpcHBpbmcgdG9wX3NyY2Rpci9NYWtlZmlsZSAtIGxlZnQgdW50b3VjaGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHNraXBwaW5nIHRvcF9zcmNkaXIvTWFrZWZpbGUgLSBsZWZ0IHVudG91Y2hlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHNraXBwaW5nIHRvcF9zcmNkaXIvTWFrZWZpbGUgLSBub3QgY3JlYXRlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBza2lwcGluZyB0b3Bfc3JjZGlyL01ha2VmaWxlIC0gbm90IGNyZWF0ZWQiID4mNjt9CisgICAgZmkKKyAgZWxzZQorICAgIGlmIHRlc3QgLWYgIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgIGE9YGdyZXAgIl5WRVJTSU9OICIgIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlImAgOyBiPWBncmVwICJeVkVSU0lPTiAiIE1ha2VmaWxlYAorICAgICAgdGVzdCAiJGEiICE9ICIkYiIgJiYgcm0gIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlIgorICAgIGZpCisgICAgaWYgdGVzdCAtZiAiJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUiIDsgdGhlbgorCWVjaG8gIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlIDogJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUuaW4iID4gJHRtcC9jb25mdGVtcC5taworCWVjaG8gIglAIGVjaG8gJ1JFTU9WRUQsLCwnID5cJEAiID4+ICR0bXAvY29uZnRlbXAubWsKKyAgICAgIGV2YWwgIiR7TUFLRS1tYWtlfSAtZiAkdG1wL2NvbmZ0ZW1wLm1rIDI+L2Rldi9udWxsID4vZGV2L251bGwiCisgICAgICBpZiBncmVwICdeUkVNT1ZFRCwsLCcgIiRhY190b3Bfc3JjZGlyL01ha2VmaWxlIiA+L2Rldi9udWxsCisgICAgICB0aGVuIHJtICRhY190b3Bfc3JjZGlyL01ha2VmaWxlIDsgZmkKKyAgICAgIGNwICR0bXAvY29uZnRlbXAubWsgJGFjX3RvcF9zcmNkaXIvbWFrZWZpbGVzLm1rfiAgICAgICMjIERFQlVHR0lORworICAgIGZpCisgICAgaWYgdGVzdCAhIC1mICIkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZSIgOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0ZSB0b3Bfc3JjZGlyL01ha2VmaWxlIGd1ZXNzZWQgZnJvbSBsb2NhbCBNYWtlZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGUgdG9wX3NyY2Rpci9NYWtlZmlsZSBndWVzc2VkIGZyb20gbG9jYWwgTWFrZWZpbGUiID4mNjt9CisgICAgICB4PSdgJyA7IGNhdCA+JHRtcC9jb25mdGVtcC5zZWQgPDxfRU9GCisvXlwkL24KK3gKKy9eXCQvYlMKK3gKKy9cXFxcXCQve0g7ZDt9Cit7SDtzLy4qLy87eDt9CitiTQorOlMKK3gKKy9cXFxcXCQve2g7ZDt9Cit7aDtzLy4qLy87eDt9Cis6TQorcy9cXChcXG5cXCkJL1xcMSAvZworL14JL2QKKy9eWwkgXSpbXFwjXS9kCisvXlZQQVRIICo9L2QKK3MvXnNyY2RpciAqPS4qL3NyY2RpciA9IC4vCitzL150b3Bfc3JjZGlyICo9LiovdG9wX3NyY2RpciA9IC4vCisvWzo9XS8hZAorL15cXC4vZAorLyA9IC9iCisvIC49IC9iCisvOi8hYgorcy86LiovOi8KK3MvIC8gIC9nCitzLyBcXChbYS16XVthLXotXSpbYS16QS1aMC05XVxcKVxcKFsgOl1cXCkvIFxcMSBcXDEtYWxsXFwyL2cKK3MvXlxcKFthLXpdW2Etei1dKlthLXpBLVowLTldXFwpXFwoWyA6XVxcKS9cXDEgXFwxLWFsbFxcMi8KK3MvICAvIC9nCisvXmFsbCBhbGwtYWxsWyA6XS9pXFwKK2FsbC1jb25maWd1cmVkIDogYWxsLWFsbAorcy8gW2EtekEtWjAtOS1dKi1hbGwgW2EtekEtWjAtOS1dKi1hbGwtYWxsLy9nCisvLWFsbC1hbGwvZAorYVxcCisJQCBIT1NUPSJcJChIT1NUKVwiIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRIT1NUIiA9ICIuIiAmJiBIT1NUPSR4IHNoICRheF9lbmFibGVfYnVpbGRkaXJfYXV4ZGlyL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIFwkXCRIT1NUICIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgdXNlPSR4IGJhc2VuYW1lICJcJFxAIiAtYWxsICR4OyBuPSR4IGVjaG8gXCRcJEJVSUxEIHwgd2MgLXcgJHggXFxcXFxcCisJOyBlY2hvICJNQUtFIFwkXCRIT1NUIDogXCRcJG4gKiBcJFxAIjsgaWYgdGVzdCAiXCRcJG4iID0gIjAiIDsgdGhlbiA6IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMuKnwiIE1ha2VmaWxlIHx0YWlsIC0xfCBzZWQgLWUgJ3MvLip8Ly8nICR4IDsgZmkgXFxcXFxcCisJOyB0ZXN0ICIuXCRcJEJVSUxEIiA9ICIuIiAmJiBCVUlMRD0iLiIgXFxcXFxcCisJOyB0ZXN0ICJcJFwkdXNlIiA9ICJcJFxAIiAmJiBCVUlMRD0keCBlY2hvICJcJFwkQlVJTEQiIHwgdGFpbCAtMSAkeCBcXFxcXFwKKwk7IGZvciBpIGluIFwkXCRCVUlMRCA7IGRvIHRlc3QgIi5cJFwkaSIgPSAiLiIgJiYgY29udGludWUgXFxcXFxcCisJOyAoY2QgIlwkXCRpIiAmJiB0ZXN0ICEgLWYgY29uZmlndXJlICYmIFwkKE1BS0UpIFwkXCR1c2UpIHx8IGV4aXQ7IGRvbmUKKy9kaXN0LWFsbCAqOi9hXFwKKwlAIEhPU1Q9IlwkKEhPU1QpXCIgXFxcXFxcCisJOyB0ZXN0ICIuXCRcJEhPU1QiID0gIi4iICYmIEhPU1Q9JHggc2ggJGF4X2VuYWJsZV9idWlsZGRpcl9hdXhkaXIvY29uZmlnLmd1ZXNzICR4IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMgXCRcJEhPU1QgIiBNYWtlZmlsZSB8IHNlZCAtZSAncy8uKnwvLycgJHggXFxcXFxcCisJOyBmb3VuZD0keCBlY2hvIFwkXCRCVUlMRCB8IHdjIC13ICR4IFxcXFxcXAorCTsgZWNobyAiTUFLRSBcJFwkSE9TVCA6IFwkXCRmb3VuZCBcJChQQUNLQUdFKS1cJChWRVJTSU9OKS50YXIuKiIgXFxcXFxcCisJOyBpZiB0ZXN0ICJcJFwkZm91bmQiID0gIjAiIDsgdGhlbiA6IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMgLip8IiBNYWtlZmlsZSB8dGFpbCAtMXwgc2VkIC1lICdzLy4qfC8vJyAkeCBcXFxcXFwKKwk7IGZpIDsgZm9yIGkgaW4gXCRcJEJVSUxEIDsgZG8gdGVzdCAiLlwkXCRpIiA9ICIuIiAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGZvciBmIGluIFwkXCRpL1wkKFBBQ0tBR0UpLVwkKFZFUlNJT04pLnRhci4qIFxcXFxcXAorCTsgZG8gdGVzdCAtZiAiXCRcJGYiICYmIG12ICJcJFwkZiIgXCQoUFVCKS4gOyBkb25lIDsgYnJlYWsgOyBkb25lCisvZGlzdC1bYS16QS1aMC05XSotYWxsICo6L2FcXAorCUAgSE9TVD0iXCQoSE9TVClcIiBcXFxcXFwKKwk7IHRlc3QgIi5cJFwkSE9TVCIgPSAiLiIgJiYgSE9TVD0keCBzaCAuL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIFwkXCRIT1NUICIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgZm91bmQ9JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkZm91bmQgXCQoUEFDS0FHRSktXCQoVkVSU0lPTikuKiIgXFxcXFxcCisJOyBpZiB0ZXN0ICJcJFwkZm91bmQiID0gIjAiIDsgdGhlbiA6IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMgLip8IiBNYWtlZmlsZSB8dGFpbCAtMXwgc2VkIC1lICdzLy4qfC8vJyAkeCBcXFxcXFwKKwk7IGZpIDsgZm9yIGkgaW4gXCRcJEJVSUxEIDsgZG8gdGVzdCAiLlwkXCRpIiA9ICIuIiAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGZvciBmIGluIFwkXCRpL1wkKFBBQ0tBR0UpLVwkKFZFUlNJT04pLiogXFxcXFxcCisJOyBkbyB0ZXN0IC1mICJcJFwkZiIgJiYgbXYgIlwkXCRmIiBcJChQVUIpLiA7IGRvbmUgOyBicmVhayA7IGRvbmUKKy9kaXN0Y2xlYW4tYWxsICo6L2FcXAorCUAgSE9TVD0iXCQoSE9TVClcIiBcXFxcXFwKKwk7IHRlc3QgIi5cJFwkSE9TVCIgPSAiLiIgJiYgSE9TVD0keCBzaCAkYXhfZW5hYmxlX2J1aWxkZGlyX2F1eGRpci9jb25maWcuZ3Vlc3MgJHggXFxcXFxcCisJOyBCVUlMRD0keCBncmVwICJeIyMjIyAuKnwiIE1ha2VmaWxlIHwgc2VkIC1lICdzLy4qfC8vJyAkeCBcXFxcXFwKKwk7IHVzZT0keCBiYXNlbmFtZSAiXCRcQCIgLWFsbCAkeDsgbj0keCBlY2hvIFwkXCRCVUlMRCB8IHdjIC13ICR4IFxcXFxcXAorCTsgZWNobyAiTUFLRSBcJFwkSE9TVCA6IFwkXCRuICogXCRcQCAoYWxsIGxvY2FsIGJ1aWxkcykiIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRCVUlMRCIgPSAiLiIgJiYgQlVJTEQ9Ii4iIFxcXFxcXAorCTsgZm9yIGkgaW4gXCRcJEJVSUxEIDsgZG8gdGVzdCAiLlwkXCRpIiA9ICIuIiAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGVjaG8gIiMgcm0gLXIgXCRcJGkiOyBkb25lIDsgZWNobyAiIyAoc2xlZXAgMykiIDsgc2xlZXAgMyBcXFxcXFwKKwk7IGZvciBpIGluIFwkXCRCVUlMRCA7IGRvIHRlc3QgIi5cJFwkaSIgPSAiLiIgJiYgY29udGludWUgXFxcXFxcCisJOyBlY2hvICJcJFwkaSIgfCBncmVwICJeLyIgPiAvZGV2L251bGwgJiYgY29udGludWUgXFxcXFxcCisJOyBlY2hvICJcJFwkaSIgfCBncmVwICJeLi4vIiA+IC9kZXYvbnVsbCAmJiBjb250aW51ZSBcXFxcXFwKKwk7IGVjaG8gInJtIC1yIFwkXCRpIjsgKHJtIC1yICJcJFwkaSIpIDsgZG9uZSA7IHJtIE1ha2VmaWxlCitfRU9GCisgICAgICBjcCAiJHRtcC9jb25mdGVtcC5zZWQiICIkYWNfdG9wX3NyY2Rpci9tYWtlZmlsZS5zZWR+IiAgICAgICAgICAgICMjIERFQlVHR0lORworICAgICAgJGF4X2VuYWJsZV9idWlsZGRpcl9zZWQgLWYgJHRtcC9jb25mdGVtcC5zZWQgTWFrZWZpbGUgPiRhY190b3Bfc3JjZGlyL01ha2VmaWxlCisgICAgICBpZiB0ZXN0IC1mICIkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZS5tayIgOyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXh0ZW5kIHRvcF9zcmNkaXIvTWFrZWZpbGUgd2l0aCB0b3Bfc3JjZGlyL01ha2VmaWxlLm1rIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGV4dGVuZCB0b3Bfc3JjZGlyL01ha2VmaWxlIHdpdGggdG9wX3NyY2Rpci9NYWtlZmlsZS5tayIgPiY2O30KKyAgICAgICAgY2F0ICRhY190b3Bfc3JjZGlyL01ha2VmaWxlLm1rID4+JGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUKKyAgICAgIGZpIDsgeHh4eD0iIyMjIyIKKyAgICAgIGVjaG8gIiR4eHh4IENPTkZJR1VSQVRJT05TIEZPUiBUT1BMRVZFTCBNQUtFRklMRTogIiA+PiRhY190b3Bfc3JjZGlyL01ha2VmaWxlCisgICAgICAjIHNhbml0eSBjaGVjaworICAgICAgaWYgZ3JlcCAnXjsgZWNobyAiTUFLRSAnICRhY190b3Bfc3JjZGlyL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogYnVnZ3kgc2VkIGZvdW5kIC0gaXQgZGVsZXRlcyB0YWIgaW4gXCJhXCIgdGV4dCBwYXJ0cyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBidWdneSBzZWQgZm91bmQgLSBpdCBkZWxldGVzIHRhYiBpbiBcImFcIiB0ZXh0IHBhcnRzIiA+JjY7fQorICAgICAgICAkYXhfZW5hYmxlX2J1aWxkZGlyX3NlZCAtZSAnL15AIEhPU1Q9L3MvXi8JLycgLWUgJy9eOyAvcy9eLwkvJyAkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZSBcCisgICAgICAgICAgPiRhY190b3Bfc3JjZGlyL01ha2VmaWxlfgorICAgICAgICAodGVzdCAtcyAkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZX4gJiYgbXYgJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGV+ICRhY190b3Bfc3JjZGlyL01ha2VmaWxlKSAyPi9kZXYvbnVsbAorICAgICAgZmkKKyAgICBlbHNlCisgICAgICB4eHh4PSJcXCNcXCNcXCNcXCMiCisgICAgICAjIGVjaG8gIi9eJHh4eHggKiRheF9lbmFibGVfYnVpbGRkaXJfaG9zdCAvZCIgPiR0bXAvY29uZnRlbXAuc2VkCisgICAgICBlY2hvICJzIV4keHh4eCBbXnxdKiB8ICokYXhfZW5hYmxlX2J1aWxkZGlyICpcJCEkeHh4eCAuLi4uLi4gJGF4X2VuYWJsZV9idWlsZGRpciEiID4kdG1wL2NvbmZ0ZW1wLnNlZAorICAgICAgJGF4X2VuYWJsZV9idWlsZGRpcl9zZWQgLWYgIiR0bXAvY29uZnRlbXAuc2VkIiAiJGFjX3RvcF9zcmNkaXIvTWFrZWZpbGUiID4kdG1wL21rZmlsZS50bXAKKyAgICAgICAgY3AgIiR0bXAvY29uZnRlbXAuc2VkIiAiJGFjX3RvcF9zcmNkaXIvbWFrZWZpbGVzLnNlZH4iICAgICAgICAgIyMgREVCVUdHSU5HCisgICAgICAgIGNwICIkdG1wL21rZmlsZS50bXAiICAgIiRhY190b3Bfc3JjZGlyL21ha2VmaWxlcy5vdXR+IiAgICAgICAgICMjIERFQlVHR0lORworICAgICAgaWYgY21wIC1zICIkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZSIgIiR0bXAvbWtmaWxlLnRtcCIgMj4vZGV2L251bGwgOyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfToga2VlcGluZyB0b3Bfc3JjZGlyL01ha2VmaWxlIGZyb20gZWFybGllciBjb25maWd1cmUiID4mNQorJGFzX2VjaG8gIiRhc19tZToga2VlcGluZyB0b3Bfc3JjZGlyL01ha2VmaWxlIGZyb20gZWFybGllciBjb25maWd1cmUiID4mNjt9CisgICAgICAgIHJtICIkdG1wL21rZmlsZS50bXAiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmV1c2luZyB0b3Bfc3JjZGlyL01ha2VmaWxlIGZyb20gZWFybGllciBjb25maWd1cmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogcmV1c2luZyB0b3Bfc3JjZGlyL01ha2VmaWxlIGZyb20gZWFybGllciBjb25maWd1cmUiID4mNjt9CisgICAgICAgIG12ICIkdG1wL21rZmlsZS50bXAiICIkYWNfdG9wX3NyY2Rpci9NYWtlZmlsZSIKKyAgICAgIGZpCisgICAgZmkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGJ1aWxkIGluICRheF9lbmFibGVfYnVpbGRkaXIgKEhPU1Q9JGF4X2VuYWJsZV9idWlsZGRpcl9ob3N0KSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBidWlsZCBpbiAkYXhfZW5hYmxlX2J1aWxkZGlyIChIT1NUPSRheF9lbmFibGVfYnVpbGRkaXJfaG9zdCkiID4mNjt9CisgICAgeHh4eD0iIyMjIyIKKyAgICBlY2hvICIkeHh4eCIgIiRheF9lbmFibGVfYnVpbGRkaXJfaG9zdCIgInwkYXhfZW5hYmxlX2J1aWxkZGlyIiA+PiRhY190b3Bfc3JjZGlyL01ha2VmaWxlCisgIGZpCisgOzsKKyAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IHsKKyAgIyBBdXRvY29uZiAyLjYyIHF1b3RlcyAtLWZpbGUgYXJndW1lbnRzIGZvciBldmFsLCBidXQgbm90IHdoZW4gZmlsZXMKKyAgIyBhcmUgbGlzdGVkIHdpdGhvdXQgLS1maWxlLiAgTGV0J3MgcGxheSBzYWZlIGFuZCBvbmx5IGVuYWJsZSB0aGUgZXZhbAorICAjIGlmIHdlIGRldGVjdCB0aGUgcXVvdGluZy4KKyAgY2FzZSAkQ09ORklHX0ZJTEVTIGluCisgICpcJyopIGV2YWwgc2V0IHggIiRDT05GSUdfRklMRVMiIDs7CisgICopICAgc2V0IHggJENPTkZJR19GSUxFUyA7OworICBlc2FjCisgIHNoaWZ0CisgIGZvciBtZgorICBkbworICAgICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAgICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKKyAgICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAgICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCisgICAgIyBHcmVwJ2luZyB0aGUgd2hvbGUgZmlsZSBpcyBub3QgZ29vZCBlaXRoZXI6IEFJWCBncmVwIGhhcyBhIGxpbmUKKyAgICAjIGxpbWl0IG9mIDIwNDgsIGJ1dCBhbGwgc2VkJ3Mgd2Uga25vdyBoYXZlIHVuZGVyc3RhbmQgYXQgbGVhc3QgNDAwMC4KKyAgICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAorJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkbWYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgIGVsc2UKKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKyAgICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAorICAgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgICAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgICAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICAgIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgICAjIGV4cGFuc2lvbi4KKyAgICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorCSBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICAgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8CiskYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyOyBhc19mbl9ta2Rpcl9wCisgICAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgICAgZG9uZQorICBkb25lCit9CisgOzsKKyAgICAibGlidG9vbCI6QykKKworICAgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyAgICAjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgICBmaQorCisgICAgY2ZnZmlsZT0iJHtvZmlsZX1UIgorICAgIHRyYXAgIiRSTSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICAgJFJNICIkY2ZnZmlsZSIKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyEgJFNIRUxMCisKKyMgYCRFQ0hPICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRhc19tZSAoJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjICAgICAgICAgICAgICAgICBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgorIworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgorIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisKKyMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorYXZhaWxhYmxlX3RhZ3M9IiIKKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKKworIyBXaGljaCByZWxlYXNlIG9mIGxpYnRvb2wubTQgd2FzIHVzZWQ/CittYWNyb192ZXJzaW9uPSRtYWNyb192ZXJzaW9uCittYWNyb19yZXZpc2lvbj0kbWFjcm9fcmV2aXNpb24KKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hhdCB0eXBlIG9mIG9iamVjdHMgdG8gYnVpbGQuCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgcHJvdGVjdHMgYmFja3NsYXNoZXMuCitFQ0hPPSRsdF9FQ0hPCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KK1NFRD0kbHRfU0VECisKKyMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCitYc2VkPSJcJFNFRCAtZSAxcy9eWC8vIgorCisjIEEgZ3JlcCBwcm9ncmFtIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzLgorR1JFUD0kbHRfR1JFUAorCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgQSBsaXRlcmFsIHN0cmluZyBtYXRjaGVyLgorRkdSRVA9JGx0X0ZHUkVQCisKKyMgQSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIuCitOTT0kbHRfTk0KKworIyBXaGV0aGVyIHdlIG5lZWQgc29mdCBvciBoYXJkIGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KK21heF9jbWRfbGVuPSRtYXhfY21kX2xlbgorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0kYWNfb2JqZXh0CisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSRleGVleHQKKworIyB3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiLgorbHRfdW5zZXQ9JGx0X3Vuc2V0CisKKyMgdHVybiBzcGFjZXMgaW50byBuZXdsaW5lcy4KK1NQMk5MPSRsdF9sdF9TUDJOTAorCisjIHR1cm4gbmV3bGluZXMgaW50byBzcGFjZXMuCitOTDJTUD0kbHRfbHRfTkwyU1AKKworIyBjb252ZXJ0IFwkYnVpbGQgZmlsZSBuYW1lcyB0byBcJGhvc3QgZm9ybWF0LgordG9faG9zdF9maWxlX2NtZD0kbHRfY3ZfdG9faG9zdF9maWxlX2NtZAorCisjIGNvbnZlcnQgXCRidWlsZCBmaWxlcyB0byB0b29sY2hhaW4gZm9ybWF0LgordG9fdG9vbF9maWxlX2NtZD0kbHRfY3ZfdG9fdG9vbF9maWxlX2NtZAorCisjIEFuIG9iamVjdCBzeW1ib2wgZHVtcGVyLgorT0JKRFVNUD0kbHRfT0JKRFVNUAorCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9ICJmaWxlX21hZ2ljIi4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEhvdyB0byBmaW5kIHBvdGVudGlhbCBmaWxlcyB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiLgorZmlsZV9tYWdpY19nbG9iPSRsdF9maWxlX21hZ2ljX2dsb2IKKworIyBGaW5kIHBvdGVudGlhbCBmaWxlcyB1c2luZyBub2Nhc2VnbG9iIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyIuCit3YW50X25vY2FzZWdsb2I9JGx0X3dhbnRfbm9jYXNlZ2xvYgorCisjIERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0kbHRfRExMVE9PTAorCisjIENvbW1hbmQgdG8gYXNzb2NpYXRlIHNoYXJlZCBhbmQgbGluayBsaWJyYXJpZXMuCitzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kbHRfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQKKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKKworIyBGbGFncyB0byBjcmVhdGUgYW4gYXJjaGl2ZS4KK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEhvdyB0byBmZWVkIGEgZmlsZSBsaXN0aW5nIHRvIHRoZSBhcmNoaXZlci4KK2FyY2hpdmVyX2xpc3Rfc3BlYz0kbHRfYXJjaGl2ZXJfbGlzdF9zcGVjCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0uCitTVFJJUD0kbHRfU1RSSVAKKworIyBDb21tYW5kcyB1c2VkIHRvIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgV2hldGhlciB0byB1c2UgYSBsb2NrIGZvciBvbGQgYXJjaGl2ZSBleHRyYWN0aW9uLgorbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPSRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24KKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9DQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfQ0ZMQUdTCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpci4KK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyIHdoZW4gbGliIHByZWZpeCBpcyBuZWVkZWQuCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXgKKworIyBTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXMgZm9yIFwkTk0uCitubV9maWxlX2xpc3Rfc3BlYz0kbHRfbm1fZmlsZV9saXN0X3NwZWMKKworIyBUaGUgcm9vdCB3aGVyZSB0byBzZWFyY2ggZm9yIGRlcGVuZGVudCBsaWJyYXJpZXMsYW5kIGluIHdoaWNoIG91ciBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZC4KK2x0X3N5c3Jvb3Q9JGx0X3N5c3Jvb3QKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgd2l0aCAiZmlsZSIuCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIE1hbmlmZXN0IHRvb2wuCitNQU5JRkVTVF9UT09MPSRsdF9NQU5JRkVTVF9UT09MCisKKyMgVG9vbCB0byBtYW5pcHVsYXRlIGFyY2hpdmVkIERXQVJGIGRlYnVnIHN5bWJvbCBmaWxlcyBvbiBNYWMgT1MgWC4KK0RTWU1VVElMPSRsdF9EU1lNVVRJTAorCisjIFRvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYLgorTk1FRElUPSRsdF9OTUVESVQKKworIyBUb29sIHRvIG1hbmlwdWxhdGUgZmF0IG9iamVjdHMgYW5kIGFyY2hpdmVzIG9uIE1hYyBPUyBYLgorTElQTz0kbHRfTElQTworCisjIGxkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYLgorT1RPT0w9JGx0X09UT09MCisKKyMgbGRkL3JlYWRlbGYgbGlrZSB0b29sIGZvciA2NCBiaXQgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYIDEwLjQuCitPVE9PTDY0PSRsdF9PVE9PTDY0CisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSRsaWJleHQKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSRsdF9zaHJleHRfY21kcworCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9JGx0X3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rCisKKyMgRG8gd2UgbmVlZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgUGVybWlzc2lvbiBtb2RlIG92ZXJyaWRlIGZvciBpbnN0YWxsYXRpb24gb2Ygc2hhcmVkIGxpYnJhcmllcy4KK2luc3RhbGxfb3ZlcnJpZGVfbW9kZT0kbHRfaW5zdGFsbF9vdmVycmlkZV9tb2RlCisKKyMgQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitwb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZCB0byB1c2UgYWZ0ZXIgdW5pbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgQXMgImZpbmlzaF9jbWRzIiwgZXhjZXB0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0CisjIG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCitoYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicworCisjIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcy4KK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMuCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xECisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHMKKworIyBBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWMKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2wKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWMKKworIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Citjb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljLgorYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjCisKKyMgV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHkuCitjb21waWxlcl9uZWVkc19vYmplY3Q9JGx0X2NvbXBpbGVyX25lZWRzX29iamVjdAorCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHMKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIGlmIGRpZmZlcmVudCBmcm9tIGJ1aWxkaW5nCisjIGEgc2hhcmVkIGFyY2hpdmUuCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHMKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzCisKKyMgV2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBHTlUgbGQgb3Igbm90Lgord2l0aF9nbnVfbGQ9JGx0X3dpdGhfZ251X2xkCisKKyMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCithbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKworIyBGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QKK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5CisjIGR1cmluZyBsaW5raW5nLiAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgorCisjIFNldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRVwke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworIyBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0CisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FXCR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCisjIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcworIyAiYWJzb2x1dGUiLGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nIFwke3NobGlicGF0aF92YXJ9IGlmIHRoZQorIyBsaWJyYXJ5IGlzIHJlbG9jYXRlZC4KK2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZT0kaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlCisKKyMgU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKKyMgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKKworIyBTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgorCisjIFNldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgorIyBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAorIyBhZ2FpbnN0IGl0LgoraGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWMKKworIyBTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcworIyB0byBydW50aW1lIHBhdGggbGlzdC4KK2luaGVyaXRfcnBhdGg9JGluaGVyaXRfcnBhdGgKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzCisKKyMgU2V0IHRvICJ5ZXMiIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kcworCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltcworCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zCisKKyMgQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXMuCitwcmVsaW5rX2NtZHM9JGx0X3ByZWxpbmtfY21kcworCisjIENvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgZmluaXNoaW5nIGxpbmtpbmcgcHJvZ3JhbXMuCitwb3N0bGlua19jbWRzPSRsdF9wb3N0bGlua19jbWRzCisKKyMgU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzLgorZmlsZV9saXN0X3NwZWM9JGx0X2ZpbGVfbGlzdF9zcGVjCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgorCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX0xUX0VPRgorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK19MVF9FT0YKKyAgICA7OworICBlc2FjCisKKworbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCisKKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCisgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgaWYgdGVzdCB4IiR4c2lfc2hlbGwiID0geHllczsgdGhlbgorICBzZWQgLWUgJy9eZnVuY19kaXJuYW1lICgpJC8sL159ICMgZnVuY19kaXJuYW1lIC9jXAorZnVuY19kaXJuYW1lICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7XAorXCAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOztcCitcICAgIGVzYWNcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19kaXJuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19iYXNlbmFtZSAoKSQvLC9efSAjIGZ1bmNfYmFzZW5hbWUgL2NcCitmdW5jX2Jhc2VuYW1lICgpXAore1wKK1wgICAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IlwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2Jhc2VuYW1lIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKSQvLC9efSAjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgL2NcCitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7XAorXCAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOztcCitcICAgIGVzYWNcCitcICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3RyaXBuYW1lICgpJC8sL159ICMgZnVuY19zdHJpcG5hbWUgL2NcCitmdW5jX3N0cmlwbmFtZSAoKVwKK3tcCitcICAgICMgcGRrc2ggNS4yLjE0IGRvZXMgbm90IGRvICR7WCUkWX0gY29ycmVjdGx5IGlmIGJvdGggWCBhbmQgWSBhcmVcCitcICAgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC5cCitcICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9XAorXCAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQjIiR7MX0ifVwKK1wgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zdHJpcG5hbWUgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3NwbGl0X2xvbmdfb3B0ICgpJC8sL159ICMgZnVuY19zcGxpdF9sb25nX29wdCAvY1wKK2Z1bmNfc3BsaXRfbG9uZ19vcHQgKClcCit7XAorXCAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9JHsxJSU9Kn1cCitcICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnPSR7MSMqPX1cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19zcGxpdF9sb25nX29wdCBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfc3BsaXRfc2hvcnRfb3B0ICgpJC8sL159ICMgZnVuY19zcGxpdF9zaG9ydF9vcHQgL2NcCitmdW5jX3NwbGl0X3Nob3J0X29wdCAoKVwKK3tcCitcICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZz0kezEjPz99XAorXCAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9uYW1lPSR7MSUiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyJ9XAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICBzZWQgLWUgJy9eZnVuY19sbzJvICgpJC8sL159ICMgZnVuY19sbzJvIC9jXAorZnVuY19sbzJvICgpXAore1wKK1wgICAgY2FzZSAkezF9IGluXAorXCAgICAgICoubG8pIGZ1bmNfbG8yb19yZXN1bHQ9JHsxJS5sb30uJHtvYmpleHR9IDs7XAorXCAgICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7O1wKK1wgICAgZXNhY1wKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2xvMm8gaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX3hmb3JtICgpJC8sL159ICMgZnVuY194Zm9ybSAvY1wKK2Z1bmNfeGZvcm0gKClcCit7XAorICAgIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG9cCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY194Zm9ybSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCisKKyAgc2VkIC1lICcvXmZ1bmNfYXJpdGggKCkkLywvXn0gIyBmdW5jX2FyaXRoIC9jXAorZnVuY19hcml0aCAoKVwKK3tcCisgICAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICQqICkpXAorfSAjIEV4dGVuZGVkLXNoZWxsIGZ1bmNfYXJpdGggaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2xlbiAoKSQvLC9efSAjIGZ1bmNfbGVuIC9jXAorZnVuY19sZW4gKClcCit7XAorICAgIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfVwKK30gIyBFeHRlbmRlZC1zaGVsbCBmdW5jX2xlbiBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorCitmaQorCitpZiB0ZXN0IHgiJGx0X3NoZWxsX2FwcGVuZCIgPSB4eWVzOyB0aGVuCisgIHNlZCAtZSAnL15mdW5jX2FwcGVuZCAoKSQvLC9efSAjIGZ1bmNfYXBwZW5kIC9jXAorZnVuY19hcHBlbmQgKClcCit7XAorICAgIGV2YWwgIiR7MX0rPVxcJHsyfSJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcHBlbmQgaW1wbGVtZW50YXRpb24nICIkY2ZnZmlsZSIgPiAkY2ZnZmlsZS50bXAgXAorICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQordGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKKworCisgIHNlZCAtZSAnL15mdW5jX2FwcGVuZF9xdW90ZWQgKCkkLywvXn0gIyBmdW5jX2FwcGVuZF9xdW90ZWQgL2NcCitmdW5jX2FwcGVuZF9xdW90ZWQgKClcCit7XAorXCAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkezJ9IlwKK1wgICAgZXZhbCAiJHsxfSs9XFxcXCBcXCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCJcCit9ICMgRXh0ZW5kZWQtc2hlbGwgZnVuY19hcHBlbmRfcXVvdGVkIGltcGxlbWVudGF0aW9uJyAiJGNmZ2ZpbGUiID4gJGNmZ2ZpbGUudG1wIFwKKyAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKK3Rlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CisKKworICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgd2hlcmUgcG9zc2libGUgYnkgZGlyZWN0IHVzZSBvZiAnKz0nCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFthLXpBLVpfXVx7MSxcfVwpICIlXDErPSIlZycgJGNmZ2ZpbGUgPiAkY2ZnZmlsZS50bXAgXAorICAgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgICAgfHwgKHJtIC1mICIkY2ZnZmlsZSIgJiYgY3AgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUudG1wIikKKyAgdGVzdCAwIC1lcSAkPyB8fCBfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsPToKK2Vsc2UKKyAgIyBTYXZlIGEgYGZ1bmNfYXBwZW5kJyBmdW5jdGlvbiBjYWxsIGV2ZW4gd2hlbiAnKz0nIGlzIG5vdCBhdmFpbGFibGUKKyAgc2VkIC1lICdzJWZ1bmNfYXBwZW5kIFwoW2EtekEtWl9dXHsxLFx9XCkgIiVcMT0iJFwxJWcnICRjZmdmaWxlID4gJGNmZ2ZpbGUudG1wIFwKKyAgICAmJiBtdiAtZiAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiIFwKKyAgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCisgIHRlc3QgMCAtZXEgJD8gfHwgX2x0X2Z1bmN0aW9uX3JlcGxhY2VfZmFpbD06CitmaQorCitpZiB0ZXN0IHgiJF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWwiID0geCI6IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFVuYWJsZSB0byBzdWJzdGl0dXRlIGV4dGVuZGVkIHNoZWxsIGZ1bmN0aW9ucyBpbiAkb2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogVW5hYmxlIHRvIHN1YnN0aXR1dGUgZXh0ZW5kZWQgc2hlbGwgZnVuY3Rpb25zIGluICRvZmlsZSIgPiYyO30KK2ZpCisKKworICAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCisgIGNobW9kICt4ICIkb2ZpbGUiCisKKyA7OworICAgICJpbmNsdWRlIjpDKSB0ZXN0IC1kIGluY2x1ZGUgfHwgbWtkaXIgaW5jbHVkZSA7OworICAgICJzcmMiOkMpCit0ZXN0IC1kIHNyYyB8fCBta2RpciBzcmMKK3Rlc3QgLWQgc3JjLyRUQVJHRVRESVIgfHwgbWtkaXIgc3JjLyRUQVJHRVRESVIKKyA7OworCisgIGVzYWMKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworYXNfZm5fZXhpdCAwCitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKK3Rlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0IDEKK2ZpCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KK2ZpCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9jb25maWd1cmUuYWMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTJkMzMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsNDk2IEBACitkbmwgUHJvY2VzcyB0aGlzIHdpdGggYXV0b2NvbmYgdG8gY3JlYXRlIGNvbmZpZ3VyZQorCitBQ19QUkVSRVEoMi42MykKKworQUNfSU5JVChbbGliZmZpXSwgWzMuMC4xMF0sIFtodHRwOi8vc291cmNld2FyZS5vcmcvbGliZmZpLmh0bWxdKQorQUNfQ09ORklHX0hFQURFUlMoW2ZmaWNvbmZpZy5oXSkKKworQUNfQ0FOT05JQ0FMX1NZU1RFTQordGFyZ2V0X2FsaWFzPSR7dGFyZ2V0X2FsaWFzLSRob3N0X2FsaWFzfQorCisuICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAorCitBWF9FTkFCTEVfQlVJTERESVIKKworQU1fSU5JVF9BVVRPTUFLRQorCisjIFRoZSBzYW1lIGFzIGluIGJvZWhtLWdjIGFuZCBsaWJzdGRjKysuIEhhdmUgdG8gYm9ycm93IGl0IGZyb20gdGhlcmUuCisjIFdlIG11c3QgZm9yY2UgQ0MgdG8gL25vdC8gYmUgcHJlY2lvdXMgdmFyaWFibGVzOyBvdGhlcndpc2UKKyMgdGhlIHdyb25nLCBub24tbXVsdGlsaWItYWRqdXN0ZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGluIG11bHRpbGlicy4KKyMgQXMgYSBzaWRlIGVmZmVjdCwgd2UgaGF2ZSB0byBzdWJzdCBDRkxBR1Mgb3Vyc2VsdmVzLgorIyBBbHNvIHNhdmUgYW5kIHJlc3RvcmUgQ0ZMQUdTLCBzaW5jZSBBQ19QUk9HX0NDIHdpbGwgY29tZSB1cCB3aXRoCisjIGRlZmF1bHRzIG9mIGl0cyBvd24gaWYgbm9uZSBhcmUgcHJvdmlkZWQuCisKK200X3JlbmFtZShbX0FDX0FSR19WQVJfUFJFQ0lPVVNdLFtyZWFsX1BSRUNJT1VTXSkKK200X2RlZmluZShbX0FDX0FSR19WQVJfUFJFQ0lPVVNdLFtdKQorc2F2ZV9DRkxBR1M9JENGTEFHUworQUNfUFJPR19DQworQ0ZMQUdTPSRzYXZlX0NGTEFHUworbTRfdW5kZWZpbmUoW19BQ19BUkdfVkFSX1BSRUNJT1VTXSkKK200X3JlbmFtZShbcmVhbF9QUkVDSU9VU10sW19BQ19BUkdfVkFSX1BSRUNJT1VTXSkKKworQUNfU1VCU1QoQ0ZMQUdTKQorCitBTV9QUk9HX0FTCitBTV9QUk9HX0NDX0NfTworQUNfUFJPR19MSUJUT09MCitBQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCisKK0FYX0NDX01BWE9QVAorQVhfQ0ZMQUdTX1dBUk5fQUxMCitpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mZXhjZXB0aW9ucyIKK2ZpCisKK0FNX01BSU5UQUlORVJfTU9ERQorCitBQ19DSEVDS19IRUFERVJTKHN5cy9tbWFuLmgpCitBQ19DSEVDS19GVU5DUyhtbWFwKQorQUNfRlVOQ19NTUFQX0JMQUNLTElTVAorCitkbmwgVGhlIC1uby10ZXN0c3VpdGUgbW9kdWxlcyBvbWl0IHRoZSB0ZXN0IHN1YmRpci4KK0FNX0NPTkRJVElPTkFMKFRFU1RTVUJESVIsIHRlc3QgLWQgJHNyY2Rpci90ZXN0c3VpdGUpCisKK1RBUkdFVERJUj0idW5rbm93biIKK2Nhc2UgIiRob3N0IiBpbgorICBhbHBoYSotKi0qKQorCVRBUkdFVD1BTFBIQTsgVEFSR0VURElSPWFscGhhOworCSMgU3VwcG9ydCAxMjgtYml0IGxvbmcgZG91YmxlLCBjaGFuZ2VhYmxlIHZpYSBjb21tYW5kLWxpbmUgc3dpdGNoLgorCUhBVkVfTE9OR19ET1VCTEU9J2RlZmluZWQoX19MT05HX0RPVUJMRV8xMjhfXyknCisJOzsKKworICBhcm0qLSotKikKKwlUQVJHRVQ9QVJNOyBUQVJHRVRESVI9YXJtCisJOzsKKworICBhbWQ2NC0qLWZyZWVic2QqIHwgYW1kNjQtKi1vcGVuYnNkKikKKwlUQVJHRVQ9WDg2XzY0OyBUQVJHRVRESVI9eDg2CisgIAk7OworCisgIGFtZDY0LSotZnJlZWJzZCopCisJVEFSR0VUPVg4Nl82NDsgVEFSR0VURElSPXg4NgorCTs7CisKKyAgYXZyMzIqLSotKikKKwlUQVJHRVQ9QVZSMzI7IFRBUkdFVERJUj1hdnIzMgorCTs7CisKKyAgY3Jpcy0qLSopCisJVEFSR0VUPUxJQkZGSV9DUklTOyBUQVJHRVRESVI9Y3JpcworCTs7CisKKyAgZnJ2LSotKikKKwlUQVJHRVQ9RlJWOyBUQVJHRVRESVI9ZnJ2CisJOzsKKworICBocHBhKi0qLWxpbnV4KiB8IHBhcmlzYyotKi1saW51eCogfCBocHBhKi0qLW9wZW5ic2QqKQorCVRBUkdFVD1QQV9MSU5VWDsgVEFSR0VURElSPXBhCisJOzsKKyAgaHBwYSo2NC0qLWhwdXgqKQorCVRBUkdFVD1QQTY0X0hQVVg7IFRBUkdFVERJUj1wYQorCTs7CisgIGhwcGEqLSotaHB1eCopCisJVEFSR0VUPVBBX0hQVVg7IFRBUkdFVERJUj1wYQorCTs7CisKKyAgaT84Ni0qLWZyZWVic2QqIHwgaT84Ni0qLW9wZW5ic2QqKQorCVRBUkdFVD1YODZfRlJFRUJTRDsgVEFSR0VURElSPXg4NgorCTs7CisgIGk/ODYtd2luMzIqIHwgaT84Ni0qLWN5Z3dpbiogfCBpPzg2LSotbWluZ3cqIHwgaT84Ni0qLW9zMiogfCBpPzg2LSotaW50ZXJpeCopCisJVEFSR0VUPVg4Nl9XSU4zMjsgVEFSR0VURElSPXg4NgorCSMgQWxsIG1pbmd3L2N5Z3dpbi93aW4zMiBidWlsZHMgcmVxdWlyZSAtbm8tdW5kZWZpbmVkIGZvciBzaGFyZWRsaWIuCisJIyBXZSBtdXN0IGFsc28gY2hlY2sgd2l0aF9jcm9zc19ob3N0IHRvIGRlY2lkZSBpZiB0aGlzIGlzIGEgbmF0aXZlCisJIyBvciBjcm9zcy1idWlsZCBhbmQgc2VsZWN0IHdoZXJlIHRvIGluc3RhbGwgZGxscyBhcHByb3ByaWF0ZWx5LgorCWlmIHRlc3QgLW4gIiR3aXRoX2Nyb3NzX2hvc3QiICYmCisJICAgdGVzdCB4IiR3aXRoX2Nyb3NzX2hvc3QiICE9IHgibm8iOyB0aGVuCisJICBBTV9MVExERkxBR1M9Jy1uby11bmRlZmluZWQgLWJpbmRpciAiJCh0b29sZXhlY2xpYmRpcikiJzsKKwllbHNlCisJICBBTV9MVExERkxBR1M9Jy1uby11bmRlZmluZWQgLWJpbmRpciAiJChiaW5kaXIpIic7CisJZmkKKwk7OworICBpPzg2LSotZGFyd2luKikKKwlUQVJHRVQ9WDg2X0RBUldJTjsgVEFSR0VURElSPXg4NgorCTs7CisgIGk/ODYtKi1zb2xhcmlzMi4xW1swLTldXSopCisJVEFSR0VUPVg4Nl82NDsgVEFSR0VURElSPXg4NgorCTs7CisgIGk/ODYtKi0qKQorCVRBUkdFVD1YODY7IFRBUkdFVERJUj14ODYKKwk7OworCisgIGlhNjQqLSotKikKKwlUQVJHRVQ9SUE2NDsgVEFSR0VURElSPWlhNjQKKwk7OworCisgIG0zMnIqLSotKikKKwlUQVJHRVQ9TTMyUjsgVEFSR0VURElSPW0zMnIKKwk7OworCisgIG02OGstKi0qKQorCVRBUkdFVD1NNjhLOyBUQVJHRVRESVI9bTY4aworCTs7CisKKyAgbWlwcy1zZ2ktaXJpeDUuKiB8IG1pcHMtc2dpLWlyaXg2LiogfCBtaXBzKi0qLXJ0ZW1zKikKKwlUQVJHRVQ9TUlQUzsgVEFSR0VURElSPW1pcHMKKwk7OworICBtaXBzKi0qLWxpbnV4KiB8IG1pcHMqLSotb3BlbmJzZCopCisJIyBTdXBwb3J0IDEyOC1iaXQgbG9uZyBkb3VibGUgZm9yIE5ld0FCSS4KKwlIQVZFX0xPTkdfRE9VQkxFPSdkZWZpbmVkKF9fbWlwczY0KScKKwlUQVJHRVQ9TUlQUzsgVEFSR0VURElSPW1pcHMKKwk7OworCisgIHBvd2VycGMqLSotbGludXgqIHwgcG93ZXJwYy0qLXN5c3YqKQorCVRBUkdFVD1QT1dFUlBDOyBUQVJHRVRESVI9cG93ZXJwYworCTs7CisgIHBvd2VycGMtKi1iZW9zKikKKwlUQVJHRVQ9UE9XRVJQQzsgVEFSR0VURElSPXBvd2VycGMKKwk7OworICBwb3dlcnBjLSotZGFyd2luKiB8IHBvd2VycGM2NC0qLWRhcndpbiopCisJVEFSR0VUPVBPV0VSUENfREFSV0lOOyBUQVJHRVRESVI9cG93ZXJwYworCTs7CisgIHBvd2VycGMtKi1haXgqIHwgcnM2MDAwLSotYWl4KikKKwlUQVJHRVQ9UE9XRVJQQ19BSVg7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKKyAgcG93ZXJwYy0qLWZyZWVic2QqIHwgcG93ZXJwYy0qLW9wZW5ic2QqKQorCVRBUkdFVD1QT1dFUlBDX0ZSRUVCU0Q7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKKyAgcG93ZXJwYzY0LSotZnJlZWJzZCopCisJVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKKyAgcG93ZXJwYyotKi1ydGVtcyopCisJVEFSR0VUPVBPV0VSUEM7IFRBUkdFVERJUj1wb3dlcnBjCisJOzsKKworICBzMzkwLSotKiB8IHMzOTB4LSotKikKKwlUQVJHRVQ9UzM5MDsgVEFSR0VURElSPXMzOTAKKwk7OworCisgIHNoLSotKiB8IHNoW1szNF1dKi0qLSopCisJVEFSR0VUPVNIOyBUQVJHRVRESVI9c2gKKwk7OworICBzaDY0LSotKiB8IHNoNSotKi0qKQorCVRBUkdFVD1TSDY0OyBUQVJHRVRESVI9c2g2NAorCTs7CisKKyAgc3BhcmMqLSotKikKKwlUQVJHRVQ9U1BBUkM7IFRBUkdFVERJUj1zcGFyYworCTs7CisKKyAgeDg2XzY0LSotZGFyd2luKikKKwlUQVJHRVQ9WDg2X0RBUldJTjsgVEFSR0VURElSPXg4NgorCTs7CisKKyAgeDg2XzY0LSotY3lnd2luKiB8IHg4Nl82NC0qLW1pbmd3KikKKwlUQVJHRVQ9WDg2X1dJTjY0OyBUQVJHRVRESVI9eDg2CisJOzsKKworICB4ODZfNjQtKi0qKQorCVRBUkdFVD1YODZfNjQ7IFRBUkdFVERJUj14ODYKKwk7OworZXNhYworCitBQ19TVUJTVChBTV9SVU5URVNURkxBR1MpCitBQ19TVUJTVChBTV9MVExERkxBR1MpCisKK2lmIHRlc3QgJFRBUkdFVERJUiA9IHVua25vd247IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFsibGliZmZpIGhhcyBub3QgYmVlbiBwb3J0ZWQgdG8gJGhvc3QuIl0pCitmaQorCitBTV9DT05ESVRJT05BTChNSVBTLCB0ZXN0IHgkVEFSR0VUID0geE1JUFMpCitBTV9DT05ESVRJT05BTChTUEFSQywgdGVzdCB4JFRBUkdFVCA9IHhTUEFSQykKK0FNX0NPTkRJVElPTkFMKFg4NiwgdGVzdCB4JFRBUkdFVCA9IHhYODYpCitBTV9DT05ESVRJT05BTChYODZfRlJFRUJTRCwgdGVzdCB4JFRBUkdFVCA9IHhYODZfRlJFRUJTRCkKK0FNX0NPTkRJVElPTkFMKFg4Nl9XSU4zMiwgdGVzdCB4JFRBUkdFVCA9IHhYODZfV0lOMzIpCitBTV9DT05ESVRJT05BTChYODZfV0lONjQsIHRlc3QgeCRUQVJHRVQgPSB4WDg2X1dJTjY0KQorQU1fQ09ORElUSU9OQUwoWDg2X0RBUldJTiwgdGVzdCB4JFRBUkdFVCA9IHhYODZfREFSV0lOKQorQU1fQ09ORElUSU9OQUwoQUxQSEEsIHRlc3QgeCRUQVJHRVQgPSB4QUxQSEEpCitBTV9DT05ESVRJT05BTChJQTY0LCB0ZXN0IHgkVEFSR0VUID0geElBNjQpCitBTV9DT05ESVRJT05BTChNMzJSLCB0ZXN0IHgkVEFSR0VUID0geE0zMlIpCitBTV9DT05ESVRJT05BTChNNjhLLCB0ZXN0IHgkVEFSR0VUID0geE02OEspCitBTV9DT05ESVRJT05BTChNT1hJRSwgdGVzdCB4JFRBUkdFVCA9IHhNT1hJRSkKK0FNX0NPTkRJVElPTkFMKFBPV0VSUEMsIHRlc3QgeCRUQVJHRVQgPSB4UE9XRVJQQykKK0FNX0NPTkRJVElPTkFMKFBPV0VSUENfQUlYLCB0ZXN0IHgkVEFSR0VUID0geFBPV0VSUENfQUlYKQorQU1fQ09ORElUSU9OQUwoUE9XRVJQQ19EQVJXSU4sIHRlc3QgeCRUQVJHRVQgPSB4UE9XRVJQQ19EQVJXSU4pCitBTV9DT05ESVRJT05BTChQT1dFUlBDX0ZSRUVCU0QsIHRlc3QgeCRUQVJHRVQgPSB4UE9XRVJQQ19GUkVFQlNEKQorQU1fQ09ORElUSU9OQUwoQVJNLCB0ZXN0IHgkVEFSR0VUID0geEFSTSkKK0FNX0NPTkRJVElPTkFMKEFWUjMyLCB0ZXN0IHgkVEFSR0VUID0geEFWUjMyKQorQU1fQ09ORElUSU9OQUwoTElCRkZJX0NSSVMsIHRlc3QgeCRUQVJHRVQgPSB4TElCRkZJX0NSSVMpCitBTV9DT05ESVRJT05BTChGUlYsIHRlc3QgeCRUQVJHRVQgPSB4RlJWKQorQU1fQ09ORElUSU9OQUwoUzM5MCwgdGVzdCB4JFRBUkdFVCA9IHhTMzkwKQorQU1fQ09ORElUSU9OQUwoWDg2XzY0LCB0ZXN0IHgkVEFSR0VUID0geFg4Nl82NCkKK0FNX0NPTkRJVElPTkFMKFNILCB0ZXN0IHgkVEFSR0VUID0geFNIKQorQU1fQ09ORElUSU9OQUwoU0g2NCwgdGVzdCB4JFRBUkdFVCA9IHhTSDY0KQorQU1fQ09ORElUSU9OQUwoUEFfTElOVVgsIHRlc3QgeCRUQVJHRVQgPSB4UEFfTElOVVgpCitBTV9DT05ESVRJT05BTChQQV9IUFVYLCB0ZXN0IHgkVEFSR0VUID0geFBBX0hQVVgpCitBTV9DT05ESVRJT05BTChQQTY0X0hQVVgsIHRlc3QgeCRUQVJHRVQgPSB4UEE2NF9IUFVYKQorCitBQ19IRUFERVJfU1REQworQUNfQ0hFQ0tfRlVOQ1MobWVtY3B5KQorQUNfRlVOQ19BTExPQ0EKKworQUNfQ0hFQ0tfU0laRU9GKGRvdWJsZSkKK0FDX0NIRUNLX1NJWkVPRihsb25nIGRvdWJsZSkKKworIyBBbHNvIEFDX1NVQlNUIHRoaXMgdmFyaWFibGUgZm9yIGZmaS5oLgoraWYgdGVzdCAteiAiJEhBVkVfTE9OR19ET1VCTEUiOyB0aGVuCisgIEhBVkVfTE9OR19ET1VCTEU9MAorICBpZiB0ZXN0ICRhY19jdl9zaXplb2ZfZG91YmxlICE9ICRhY19jdl9zaXplb2ZfbG9uZ19kb3VibGU7IHRoZW4KKyAgICBpZiB0ZXN0ICRhY19jdl9zaXplb2ZfbG9uZ19kb3VibGUgIT0gMDsgdGhlbgorICAgICAgSEFWRV9MT05HX0RPVUJMRT0xCisgICAgICBBQ19ERUZJTkUoSEFWRV9MT05HX0RPVUJMRSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbG9uZyBkb3VibGUgdHlwZSBhbmQgaXQgaXMgYmlnZ2VyIHRoYW4gYSBkb3VibGVdKQorICAgIGZpCisgIGZpCitmaQorQUNfU1VCU1QoSEFWRV9MT05HX0RPVUJMRSkKKworQUNfQ19CSUdFTkRJQU4KKworQUNfQ0FDSEVfQ0hFQ0soW2Fzc2VtYmxlciAuY2ZpIHBzZXVkby1vcCBzdXBwb3J0XSwKKyAgICBsaWJmZmlfY3ZfYXNfY2ZpX3BzZXVkb19vcCwgWworICAgIGxpYmZmaV9jdl9hc19jZmlfcHNldWRvX29wPXVua25vd24KKyAgICBBQ19UUllfQ09NUElMRShbYXNtICgiLmNmaV9zdGFydHByb2Ncblx0LmNmaV9lbmRwcm9jIik7XSwsCisJCSAgIFtsaWJmZmlfY3ZfYXNfY2ZpX3BzZXVkb19vcD15ZXNdLAorCQkgICBbbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3A9bm9dKQorXSkKK2lmIHRlc3QgIngkbGliZmZpX2N2X2FzX2NmaV9wc2V1ZG9fb3AiID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX0FTX0NGSV9QU0VVRE9fT1AsIDEsCisJICAgICAgW0RlZmluZSBpZiB5b3VyIGFzc2VtYmxlciBzdXBwb3J0cyAuY2ZpXyogZGlyZWN0aXZlcy5dKQorZmkKKworaWYgdGVzdCB4JFRBUkdFVCA9IHhTUEFSQzsgdGhlbgorICAgIEFDX0NBQ0hFX0NIRUNLKFthc3NlbWJsZXIgYW5kIGxpbmtlciBzdXBwb3J0IHVuYWxpZ25lZCBwYyByZWxhdGVkIHJlbG9jc10sCisJbGliZmZpX2N2X2FzX3NwYXJjX3VhX3BjcmVsLCBbCisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwlDRkxBR1M9IiRDRkxBR1MgLWZwaWMiCisJTERGTEFHUz0iJExERkxBR1MgLXNoYXJlZCIKKwlBQ19UUllfTElOSyhbYXNtICgiLnRleHQ7IGZvbzogbm9wOyAuZGF0YTsgLmFsaWduIDQ7IC5ieXRlIDA7IC51YXdvcmQgJXJfZGlzcDMyKGZvbyk7IC50ZXh0Iik7XSwsCisJCSAgICBbbGliZmZpX2N2X2FzX3NwYXJjX3VhX3BjcmVsPXllc10sCisJCSAgICBbbGliZmZpX2N2X2FzX3NwYXJjX3VhX3BjcmVsPW5vXSkKKwlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIl0pCisgICAgaWYgdGVzdCAieCRsaWJmZmlfY3ZfYXNfc3BhcmNfdWFfcGNyZWwiID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX0FTX1NQQVJDX1VBX1BDUkVMLCAxLAorCQkgIFtEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgYW5kIGxpbmtlciBzdXBwb3J0IHVuYWxpZ25lZCBQQyByZWxhdGl2ZSByZWxvY3MuXSkKKyAgICBmaQorCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2Fzc2VtYmxlciAucmVnaXN0ZXIgcHNldWRvLW9wIHN1cHBvcnRdLAorICAgICAgIGxpYmZmaV9jdl9hc19yZWdpc3Rlcl9wc2V1ZG9fb3AsIFsKKyAgICAgICBsaWJmZmlfY3ZfYXNfcmVnaXN0ZXJfcHNldWRvX29wPXVua25vd24KKyAgICAgICAjIENoZWNrIGlmIHdlIGhhdmUgLnJlZ2lzdGVyCisgICAgICAgQUNfVFJZX0NPTVBJTEUoW2FzbSAoIi5yZWdpc3RlciAlZzIsICNzY3JhdGNoIik7XSwsCisJCSAgICAgICBbbGliZmZpX2N2X2FzX3JlZ2lzdGVyX3BzZXVkb19vcD15ZXNdLAorCQkgICAgICAgW2xpYmZmaV9jdl9hc19yZWdpc3Rlcl9wc2V1ZG9fb3A9bm9dKQorICAgIF0pCisgICAgaWYgdGVzdCAieCRsaWJmZmlfY3ZfYXNfcmVnaXN0ZXJfcHNldWRvX29wIiA9IHh5ZXM7IHRoZW4KKyAgICAgICBBQ19ERUZJTkUoSEFWRV9BU19SRUdJU1RFUl9QU0VVRE9fT1AsIDEsCisJICAgICAgIFtEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgc3VwcG9ydHMgLnJlZ2lzdGVyLl0pCisgICAgZmkKK2ZpCisKK2lmIHRlc3QgeCRUQVJHRVQgPSB4WDg2IHx8IHRlc3QgeCRUQVJHRVQgPSB4WDg2X1dJTjMyIHx8IHRlc3QgeCRUQVJHRVQgPSB4WDg2XzY0OyB0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2Fzc2VtYmxlciBzdXBwb3J0cyBwYyByZWxhdGVkIHJlbG9jc10sCisJbGliZmZpX2N2X2FzX3g4Nl9wY3JlbCwgWworCWxpYmZmaV9jdl9hc194ODZfcGNyZWw9bm8KKwllY2hvICcudGV4dDsgZm9vOiBub3A7IC5kYXRhOyAubG9uZyBmb28tLjsgLnRleHQnID4gY29uZnRlc3QucworCWlmICRDQyAkQ0ZMQUdTIC1jIGNvbmZ0ZXN0LnMgPiAvZGV2L251bGw7IHRoZW4KKwkgICBsaWJmZmlfY3ZfYXNfeDg2X3BjcmVsPXllcworCWZpCisJXSkKKyAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc194ODZfcGNyZWwiID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX0FTX1g4Nl9QQ1JFTCwgMSwKKwkJICBbRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIFBDIHJlbGF0aXZlIHJlbG9jcy5dKQorICAgIGZpCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbYXNzZW1ibGVyIC5hc2NpaSBwc2V1ZG8tb3Agc3VwcG9ydF0sCisgICAgICAgbGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcCwgWworICAgICAgIGxpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3A9dW5rbm93bgorICAgICAgICMgQ2hlY2sgaWYgd2UgaGF2ZSAuYXNjaWkKKyAgICAgICBBQ19UUllfQ09NUElMRShbYXNtICgiLmFzY2lpIFxcInN0cmluZ1xcIiIpO10sLAorCQkgICAgICAgW2xpYmZmaV9jdl9hc19hc2NpaV9wc2V1ZG9fb3A9eWVzXSwKKwkJICAgICAgIFtsaWJmZmlfY3ZfYXNfYXNjaWlfcHNldWRvX29wPW5vXSkKKyAgICBdKQorICAgIGlmIHRlc3QgIngkbGliZmZpX2N2X2FzX2FzY2lpX3BzZXVkb19vcCIgPSB4eWVzOyB0aGVuCisgICAgICAgQUNfREVGSU5FKEhBVkVfQVNfQVNDSUlfUFNFVURPX09QLCAxLAorCSAgICAgICBbRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIC5hc2NpaS5dKQorICAgIGZpCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbYXNzZW1ibGVyIC5zdHJpbmcgcHNldWRvLW9wIHN1cHBvcnRdLAorICAgICAgIGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wLCBbCisgICAgICAgbGliZmZpX2N2X2FzX3N0cmluZ19wc2V1ZG9fb3A9dW5rbm93bgorICAgICAgICMgQ2hlY2sgaWYgd2UgaGF2ZSAuc3RyaW5nCisgICAgICAgQUNfVFJZX0NPTVBJTEUoW2FzbSAoIi5zdHJpbmcgXFwic3RyaW5nXFwiIik7XSwsCisJCSAgICAgICBbbGliZmZpX2N2X2FzX3N0cmluZ19wc2V1ZG9fb3A9eWVzXSwKKwkJICAgICAgIFtsaWJmZmlfY3ZfYXNfc3RyaW5nX3BzZXVkb19vcD1ub10pCisgICAgXSkKKyAgICBpZiB0ZXN0ICJ4JGxpYmZmaV9jdl9hc19zdHJpbmdfcHNldWRvX29wIiA9IHh5ZXM7IHRoZW4KKyAgICAgICBBQ19ERUZJTkUoSEFWRV9BU19TVFJJTkdfUFNFVURPX09QLCAxLAorCSAgICAgICBbRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIC5zdHJpbmcuXSkKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JFRBUkdFVCA9IHhYODZfV0lONjQ7IHRoZW4KKyAgICBMVF9TWVNfU1lNQk9MX1VTQ09SRQorICAgIGlmIHRlc3QgIngkc3lzX3N5bWJvbF91bmRlcnNjb3JlIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKFNZTUJPTF9VTkRFUlNDT1JFLCAxLCBbRGVmaW5lIGlmIHN5bWJvbHMgYXJlIHVuZGVyc2NvcmVkLl0pCisgICAgZmkKK2ZpCisKKworRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRT0wCitjYXNlICIkdGFyZ2V0IiBpbgorICAgICAqYXJtKi1hcHBsZS1kYXJ3aW4qKQorICAgICAgIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEU9MQorICAgICAgIEFDX0RFRklORShGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFLCAxLAorICAgICAgICAgICAgICAgICBbQ2Fubm90IHVzZSBQUk9UX0VYRUMgb24gdGhpcyB0YXJnZXQsIHNvLCB3ZSByZXZlcnQgdG8KKyAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSBtZWFuc10pCisgICAgIDs7CisgICAgICotYXBwbGUtZGFyd2luMTAqIHwgKi0qLWZyZWVic2QqIHwgKi0qLW9wZW5ic2QqIHwgKi1wYy1zb2xhcmlzKikKKyAgICAgICBBQ19ERUZJTkUoRkZJX01NQVBfRVhFQ19XUklULCAxLAorICAgICAgICAgICAgICAgICBbQ2Fubm90IHVzZSBtYWxsb2Mgb24gdGhpcyB0YXJnZXQsIHNvLCB3ZSByZXZlcnQgdG8KKyAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSBtZWFuc10pCisgICAgIDs7Citlc2FjCitBTV9DT05ESVRJT05BTChGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFLCB0ZXN0IHgkRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSA9IHgxKQorQUNfU1VCU1QoRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSkKKworaWYgdGVzdCB4JFRBUkdFVCA9IHhYODZfNjQ7IHRoZW4KKyAgICBBQ19DQUNIRV9DSEVDSyhbYXNzZW1ibGVyIHN1cHBvcnRzIHVud2luZCBzZWN0aW9uIHR5cGVdLAorCWxpYmZmaV9jdl9hc194ODZfNjRfdW53aW5kX3NlY3Rpb25fdHlwZSwgWworCWxpYmZmaV9jdl9hc194ODZfNjRfdW53aW5kX3NlY3Rpb25fdHlwZT15ZXMKKwllY2hvICcuc2VjdGlvbiAuZWhfZnJhbWUsImEiLEB1bndpbmQnID4gY29uZnRlc3QucworCWlmICRDQyAkQ0ZMQUdTIC1jIGNvbmZ0ZXN0LnMgMj4mMSB8IGdyZXAgLWkgd2FybmluZyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGU9bm8KKwlmaQorCV0pCisgICAgaWYgdGVzdCAieCRsaWJmZmlfY3ZfYXNfeDg2XzY0X3Vud2luZF9zZWN0aW9uX3R5cGUiID0geHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX0FTX1g4Nl82NF9VTldJTkRfU0VDVElPTl9UWVBFLCAxLAorCQkgIFtEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgc3VwcG9ydHMgdW53aW5kIHNlY3Rpb24gdHlwZS5dKQorICAgIGZpCitmaQorCitpZiB0ZXN0ICJ4JEdDQyIgPSAieHllcyI7IHRoZW4KKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgLmVoX2ZyYW1lIHNlY3Rpb24gc2hvdWxkIGJlIHJlYWQtb25seV0sCisgICAgICBsaWJmZmlfY3Zfcm9fZWhfZnJhbWUsIFsKKyAgCWxpYmZmaV9jdl9yb19laF9mcmFtZT1ubworICAJZWNobyAnZXh0ZXJuIHZvaWQgZm9vICh2b2lkKTsgdm9pZCBiYXIgKHZvaWQpIHsgZm9vICgpOyBmb28gKCk7IH0nID4gY29uZnRlc3QuYworICAJaWYgJENDICRDRkxBR1MgLVMgLWZwaWMgLWZleGNlcHRpb25zIC1vIGNvbmZ0ZXN0LnMgY29uZnRlc3QuYyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIAkgICAgaWYgZ3JlcCAnLnNlY3Rpb24uKmVoX2ZyYW1lLioiYSInIGNvbmZ0ZXN0LnMgPiAvZGV2L251bGw7IHRoZW4KKyAgCQlsaWJmZmlfY3Zfcm9fZWhfZnJhbWU9eWVzCisgIAkgICAgZWxpZiBncmVwICcuc2VjdGlvbi4qZWhfZnJhbWUuKiNhbGxvYycgY29uZnRlc3QuYyBcCisgIAkJIHwgZ3JlcCAtdiAnI3dyaXRlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAJCWxpYmZmaV9jdl9yb19laF9mcmFtZT15ZXMKKyAgCSAgICBmaQorICAJZmkKKyAgCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIF0pCisgIGlmIHRlc3QgIngkbGliZmZpX2N2X3JvX2VoX2ZyYW1lIiA9IHh5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShIQVZFX1JPX0VIX0ZSQU1FLCAxLAorICAJICAgICAgW0RlZmluZSBpZiAuZWhfZnJhbWUgc2VjdGlvbnMgc2hvdWxkIGJlIHJlYWQtb25seS5dKQorICAgICAgQUNfREVGSU5FKEVIX0ZSQU1FX0ZMQUdTLCAiYSIsCisgIAkgICAgICBbRGVmaW5lIHRvIHRoZSBmbGFncyBuZWVkZWQgZm9yIHRoZSAuc2VjdGlvbiAuZWhfZnJhbWUgZGlyZWN0aXZlLiAgXSkKKyAgZWxzZQorICAgICAgQUNfREVGSU5FKEVIX0ZSQU1FX0ZMQUdTLCAiYXciLAorICAJICAgICAgW0RlZmluZSB0byB0aGUgZmxhZ3MgbmVlZGVkIGZvciB0aGUgLnNlY3Rpb24gLmVoX2ZyYW1lIGRpcmVjdGl2ZS4gIF0pCisgIGZpCisKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpXSwKKyAgICAgIGxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUsIFsKKyAgCWVjaG8gJ2ludCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkgZm9vICh2b2lkKSB7IHJldHVybiAxICA7IH0nID4gY29uZnRlc3QuYworICAJbGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZT1ubworICAJaWYgQUNfVFJZX0NPTU1BTkQoJHtDQy1jY30gLVdlcnJvciAtUyBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0LnMgMT4mQVNfTUVTU0FHRV9MT0dfRkQpOyB0aGVuCisgIAkgICAgaWYgZ3JlcCAnXC5oaWRkZW4uKmZvbycgY29uZnRlc3QucyA+L2Rldi9udWxsOyB0aGVuCisgIAkJbGliZmZpX2N2X2hpZGRlbl92aXNpYmlsaXR5X2F0dHJpYnV0ZT15ZXMKKyAgCSAgICBmaQorICAJZmkKKyAgCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIF0pCisgIGlmIHRlc3QgJGxpYmZmaV9jdl9oaWRkZW5fdmlzaWJpbGl0eV9hdHRyaWJ1dGUgPSB5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShIQVZFX0hJRERFTl9WSVNJQklMSVRZX0FUVFJJQlVURSwgMSwKKyAgCSAgICAgIFtEZWZpbmUgaWYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKSBpcyBzdXBwb3J0ZWQuXSkKKyAgZmkKK2ZpCisKK0FIX0JPVFRPTShbCisjaWZkZWYgSEFWRV9ISURERU5fVklTSUJJTElUWV9BVFRSSUJVVEUKKyNpZmRlZiBMSUJGRklfQVNNCisjZGVmaW5lIEZGSV9ISURERU4obmFtZSkgLmhpZGRlbiBuYW1lCisjZWxzZQorI2RlZmluZSBGRklfSElEREVOIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorI2VuZGlmCisjZWxzZQorI2lmZGVmIExJQkZGSV9BU00KKyNkZWZpbmUgRkZJX0hJRERFTihuYW1lKQorI2Vsc2UKKyNkZWZpbmUgRkZJX0hJRERFTgorI2VuZGlmCisjZW5kaWYKK10pCisKK0FDX1NVQlNUKFRBUkdFVCkKK0FDX1NVQlNUKFRBUkdFVERJUikKKworQUNfU1VCU1QoU0hFTEwpCisKK0FDX0FSR19FTkFCTEUoZGVidWcsCitbICAtLWVuYWJsZS1kZWJ1ZyAgICAgICAgICBkZWJ1Z2dpbmcgbW9kZV0sCisgIGlmIHRlc3QgIiRlbmFibGVfZGVidWciID0gInllcyI7IHRoZW4KKyAgICBBQ19ERUZJTkUoRkZJX0RFQlVHLCAxLCBbRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgZXh0cmEgZGVidWdnaW5nLl0pCisgIGZpKQorQU1fQ09ORElUSU9OQUwoRkZJX0RFQlVHLCB0ZXN0ICIkZW5hYmxlX2RlYnVnIiA9ICJ5ZXMiKQorCitBQ19BUkdfRU5BQkxFKHN0cnVjdHMsCitbICAtLWRpc2FibGUtc3RydWN0cyAgICAgICBvbWl0IGNvZGUgZm9yIHN0cnVjdCBzdXBwb3J0XSwKKyAgaWYgdGVzdCAiJGVuYWJsZV9zdHJ1Y3RzIiA9ICJubyI7IHRoZW4KKyAgICBBQ19ERUZJTkUoRkZJX05PX1NUUlVDVFMsIDEsIFtEZWZpbmUgdGhpcyBpcyB5b3UgZG8gbm90IHdhbnQgc3VwcG9ydCBmb3IgYWdncmVnYXRlIHR5cGVzLl0pCisgIGZpKQorCitBQ19BUkdfRU5BQkxFKHJhdy1hcGksCitbICAtLWRpc2FibGUtcmF3LWFwaSAgICAgICBtYWtlIHRoZSByYXcgYXBpIHVuYXZhaWxhYmxlXSwKKyAgaWYgdGVzdCAiJGVuYWJsZV9yYXdfYXBpIiA9ICJubyI7IHRoZW4KKyAgICBBQ19ERUZJTkUoRkZJX05PX1JBV19BUEksIDEsIFtEZWZpbmUgdGhpcyBpcyB5b3UgZG8gbm90IHdhbnQgc3VwcG9ydCBmb3IgdGhlIHJhdyBBUEkuXSkKKyAgZmkpCisKK0FDX0FSR19FTkFCTEUocHVyaWZ5LXNhZmV0eSwKK1sgIC0tZW5hYmxlLXB1cmlmeS1zYWZldHkgIHB1cmlmeS1zYWZlIG1vZGVdLAorICBpZiB0ZXN0ICIkZW5hYmxlX3B1cmlmeV9zYWZldHkiID0gInllcyI7IHRoZW4KKyAgICBBQ19ERUZJTkUoVVNJTkdfUFVSSUZZLCAxLCBbRGVmaW5lIHRoaXMgaWYgeW91IGFyZSB1c2luZyBQdXJpZnkgYW5kIHdhbnQgdG8gc3VwcHJlc3Mgc3B1cmlvdXMgbWVzc2FnZXMuXSkKKyAgZmkpCisKKyMgVGhlc2UgdmFyaWFibGVzIGFyZSBvbmx5IGV2ZXIgdXNlZCB3aGVuIHdlIGNyb3NzLWJ1aWxkIHRvIFg4Nl9XSU4zMi4KKyMgQW5kIHdlIG9ubHkgc3VwcG9ydCB0aGlzIHdpdGggR0NDLCBzby4uLgoraWYgdGVzdCB4IiRHQ0MiICE9IHgibm8iOyB0aGVuCisgIGlmIHRlc3QgLW4gIiR3aXRoX2Nyb3NzX2hvc3QiICYmCisgICAgIHRlc3QgeCIkd2l0aF9jcm9zc19ob3N0IiAhPSB4Im5vIjsgdGhlbgorICAgIHRvb2xleGVjZGlyPSckKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcyknCisgICAgdG9vbGV4ZWNsaWJkaXI9JyQodG9vbGV4ZWNkaXIpL2xpYicKKyAgZWxzZQorICAgIHRvb2xleGVjZGlyPSckKGxpYmRpcikvZ2NjLWxpYi8kKHRhcmdldF9hbGlhcyknCisgICAgdG9vbGV4ZWNsaWJkaXI9JyQobGliZGlyKScKKyAgZmkKKyAgbXVsdGlfb3NfZGlyZWN0b3J5PWAkQ0MgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeWAKKyAgY2FzZSAkbXVsdGlfb3NfZGlyZWN0b3J5IGluCisgICAgLikgOzsgIyBBdm9pZCB0cmFpbGluZyAvLgorICAgICopIHRvb2xleGVjbGliZGlyPSR0b29sZXhlY2xpYmRpci8kbXVsdGlfb3NfZGlyZWN0b3J5IDs7CisgIGVzYWMKKyAgQUNfU1VCU1QodG9vbGV4ZWNkaXIpCisgIEFDX1NVQlNUKHRvb2xleGVjbGliZGlyKQorZmkKKworaWYgdGVzdCAiJHttdWx0aWxpYn0iID0gInllcyI7IHRoZW4KKyAgbXVsdGlsaWJfYXJnPSItLWVuYWJsZS1tdWx0aWxpYiIKK2Vsc2UKKyAgbXVsdGlsaWJfYXJnPQorZmkKKworQUNfQ09ORklHX0NPTU1BTkRTKGluY2x1ZGUsIFt0ZXN0IC1kIGluY2x1ZGUgfHwgbWtkaXIgaW5jbHVkZV0pCitBQ19DT05GSUdfQ09NTUFORFMoc3JjLCBbCit0ZXN0IC1kIHNyYyB8fCBta2RpciBzcmMKK3Rlc3QgLWQgc3JjLyRUQVJHRVRESVIgfHwgbWtkaXIgc3JjLyRUQVJHRVRESVIKK10sIFtUQVJHRVRESVI9IiRUQVJHRVRESVIiXSkKKworQUNfQ09ORklHX0xJTktTKGluY2x1ZGUvZmZpdGFyZ2V0Lmg6c3JjLyRUQVJHRVRESVIvZmZpdGFyZ2V0LmgpCisKK0FDX0NPTkZJR19GSUxFUyhpbmNsdWRlL01ha2VmaWxlIGluY2x1ZGUvZmZpLmggTWFrZWZpbGUgdGVzdHN1aXRlL01ha2VmaWxlIG1hbi9NYWtlZmlsZSBsaWJmZmkucGMpCisKK0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2NvbmZpZ3VyZS5ob3N0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2NvbmZpZ3VyZS5ob3N0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjQ1N2IKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvY29uZmlndXJlLmhvc3QKQEAgLTAsMCArMSwxMSBAQAorIyBjb25maWd1cmUuaG9zdAorIworIyBUaGlzIHNoZWxsIHNjcmlwdCBoYW5kbGVzIGFsbCBob3N0IGJhc2VkIGNvbmZpZ3VyYXRpb24gZm9yIGxpYmZmaS4KKyMgCisKKyMgVEhJUyBUQUJMRSBJUyBTT1JURUQuICBLRUVQIElUIFRIQVQgV0FZLgorY2FzZSAiJHtob3N0fSIgaW4KKyAgZnJ2Ki1lbGYpCisgICAgTERGTEFHUz1gZWNobyAkTERGTEFHUyB8IHNlZCAicy9cLUJbXiBdKmxpYmdsb3NzXC9mcnZcLy8vImBcIC1CYHB3ZGAvLi4vbGliZ2xvc3MvZnJ2LworICAgIDs7Citlc2FjCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvZGVwY29tcCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9kZXBjb21wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmOGVlYTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvZGVwY29tcApAQCAtMCwwICsxLDYzMCBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkgRnJlZQorIyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCithcyBzaWRlLWVmZmVjdHMuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlczoKKyAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgorICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KKyAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KKyAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KKyAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0ICQ/CisgICAgOzsKKyAgLXYgfCAtLXYqKQorICAgIGVjaG8gImRlcGNvbXAgJHNjcmlwdHZlcnNpb24iCisgICAgZXhpdCAkPworICAgIDs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRkZXBtb2RlIiB8fCB0ZXN0IC16ICIkc291cmNlIiB8fCB0ZXN0IC16ICIkb2JqZWN0IjsgdGhlbgorICBlY2hvICJkZXBjb21wOiBWYXJpYWJsZXMgc291cmNlLCBvYmplY3QgYW5kIGRlcG1vZGUgbXVzdCBiZSBzZXQiIDE+JjIKKyAgZXhpdCAxCitmaQorCisjIERlcGVuZGVuY2llcyBmb3Igc3ViL2Jhci5vIG9yIHN1Yi9iYXIub2JqIGdvIGludG8gc3ViLy5kZXBzL2Jhci5Qby4KK2RlcGZpbGU9JHtkZXBmaWxlLWBlY2hvICIkb2JqZWN0IiB8CisgIHNlZCAnc3xbXlxcL10qJHwnJHtERVBESVItLmRlcHN9Jy8mfDtzfFwuXChbXi5dKlwpJHwuUFwxfDtzfFBvYmokfFBvfCdgfQordG1wZGVwZmlsZT0ke3RtcGRlcGZpbGUtYGVjaG8gIiRkZXBmaWxlIiB8IHNlZCAncy9cLlwoW14uXSpcKSQvLlRcMS8nYH0KKworcm0gLWYgIiR0bXBkZXBmaWxlIgorCisjIFNvbWUgbW9kZXMgd29yayBqdXN0IGxpa2Ugb3RoZXIgbW9kZXMsIGJ1dCB1c2UgZGlmZmVyZW50IGZsYWdzLiAgV2UKKyMgcGFyYW1ldGVyaXplIGhlcmUsIGJ1dCBzdGlsbCBsaXN0IHRoZSBtb2RlcyBpbiB0aGUgYmlnIGNhc2UgYmVsb3csCisjIHRvIG1ha2UgZGVwZW5kLm00IGVhc2llciB0byB3cml0ZS4gIE5vdGUgdGhhdCB3ZSAqY2Fubm90KiB1c2UgYSBjYXNlCisjIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGNhbiBvbmx5IGNvbnRhaW4gb25lIGNhc2Ugc3RhdGVtZW50LgoraWYgdGVzdCAiJGRlcG1vZGUiID0gaHA7IHRoZW4KKyAgIyBIUCBjb21waWxlciB1c2VzIC1NIGFuZCBubyBleHRyYSBhcmcuCisgIGdjY2ZsYWc9LU0KKyAgZGVwbW9kZT1nY2MKK2ZpCisKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGRhc2hYbXN0ZG91dDsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBkYXNobXN0ZG91dCB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50LgorICAgZGFzaG1mbGFnPS14TQorICAgZGVwbW9kZT1kYXNobXN0ZG91dAorZmkKKworY3lncGF0aF91PSJjeWdwYXRoIC11IC1mIC0iCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBtc3ZjbXN5czsgdGhlbgorICAgIyBUaGlzIGlzIGp1c3QgbGlrZSBtc3Zpc3VhbGNwcCBidXQgdy9vIGN5Z3BhdGggdHJhbnNsYXRpb24uCisgICAjIEp1c3QgY29udmVydCB0aGUgYmFja3NsYXNoLWVzY2FwZWQgYmFja3NsYXNoZXMgdG8gc2luZ2xlIGZvcndhcmQKKyAgICMgc2xhc2hlcyB0byBzYXRpc2Z5IGRlcGVuZC5tNAorICAgY3lncGF0aF91PSJzZWQgcyxcXFxcXFxcXCwvLGciCisgICBkZXBtb2RlPW1zdmlzdWFsY3BwCitmaQorCitjYXNlICIkZGVwbW9kZSIgaW4KK2djYzMpCisjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAorIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKKyMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KKyMjIFVuZm9ydHVuYXRlbHksIEZyZWVCU0QgYzg5IGFjY2VwdGFuY2Ugb2YgZmxhZ3MgZGVwZW5kcyB1cG9uCisjIyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IG9yZGVyOyBzbyBhZGQgdGhlIGZsYWdzIHdoZXJlIHRoZXkKKyMjIGFwcGVhciBpbiBkZXBlbmQyLmFtLiAgTm90ZSB0aGF0IHRoZSBzbG93ZG93biBpbmN1cnJlZCBoZXJlCisjIyBhZmZlY3RzIG9ubHkgY29uZmlndXJlOiBpbiBtYWtlZmlsZXMsICVGQVNUREVQJSBzaG9ydGN1dHMgdGhpcy4KKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1jKSBzZXQgZm5vcmQgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIgIiRhcmciIDs7CisgICAgKikgIHNldCBmbm9yZCAiJEAiICIkYXJnIiA7OworICAgIGVzYWMKKyAgICBzaGlmdCAjIGZub3JkCisgICAgc2hpZnQgIyAkYXJnCisgIGRvbmUKKyAgIiRAIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCisgIDs7CisKK2djYykKKyMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCisjIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKKyMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCisjIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCisjIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQorIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKKyMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgorIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQorIyMgICB0aGFuIHJlbmFtaW5nKS4KKyAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCisgICAgZ2NjZmxhZz0tTUQsCisgIGZpCisgICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisjIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCisgIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAorICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCisjIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQorIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCisjIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZworIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbworIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8CisjIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKKyMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcworIyMgd2VsbC4KKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworc2dpKQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgorICBlbHNlCisgICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcworICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisKKyAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCisgICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKKyAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KKyAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOworICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAjIGRlcGVuZGVuY3kgbGluZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKKyAgICB0ciAnCisnICcgJyA+PiAiJGRlcGZpbGUiCisgICAgZWNobyA+PiAiJGRlcGZpbGUiCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2FpeCkKKyAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcworICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQorICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCisgICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgorICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2UudQorICAgICIkQCIgLVdjLC1NCisgIGVsc2UKKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UudQorICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLnUKKyAgICAiJEAiIC1NCisgIGZpCisgIHN0YXQ9JD8KKworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCisgICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAjIFRoYXQncyBhIHRhYiBhbmQgYSBzcGFjZSBpbiB0aGUgW10uCisgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitpY2MpCisgICMgSW50ZWwncyBDIGNvbXBpbGVyIHVuZGVyc3RhbmRzIGAtTUQgLU1GIGZpbGUnLiAgSG93ZXZlciBvbgorICAjICAgIGljYyAtTUQgLU1GIGZvby5kIC1jIC1vIHN1Yi9mb28ubyBzdWIvZm9vLmMKKyAgIyBJQ0MgNy4wIHdpbGwgZmlsbCBmb28uZCB3aXRoIHNvbWV0aGluZyBsaWtlCisgICMgICAgZm9vLm86IHN1Yi9mb28uYworICAjICAgIGZvby5vOiBzdWIvZm9vLmgKKyAgIyB3aGljaCBpcyB3cm9uZy4gIFdlIHdhbnQ6CisgICMgICAgc3ViL2Zvby5vOiBzdWIvZm9vLmMKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uaAorICAjICAgIHN1Yi9mb28uYzoKKyAgIyAgICBzdWIvZm9vLmg6CisgICMgSUNDIDcuMSB3aWxsIG91dHB1dAorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgc3ViL2Zvby5oCisgICMgYW5kIHdpbGwgd3JhcCBsb25nIGxpbmVzIHVzaW5nIFwgOgorICAjICAgIGZvby5vOiBzdWIvZm9vLmMgLi4uIFwKKyAgIyAgICAgc3ViL2Zvby5oIC4uLiBcCisgICMgICAgIC4uLgorCisgICIkQCIgLU1EIC1NRiAiJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLAorICAjIG9yIGBmb28ubzogZGVwMS5oIGRlcDIuaCBcJywgb3IgYCBkZXAzLmggZGVwNC5oIFwnLgorICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgIHNlZCAicyxeW146XSo6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorICAjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgIHNlZCAncyxeW146XSo6IFwoLipcKSQsXDEsO3MvXlxcJC8vOy9eJC9kOy86JC9kJyA8ICIkdG1wZGVwZmlsZSIgfAorICAgIHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwMikKKyAgIyBUaGUgImhwIiBzdGFuemEgYWJvdmUgZG9lcyBub3Qgd29yayB3aXRoIGFDQyAoQysrKSBhbmQgSFAncyBpYTY0CisgICMgY29tcGlsZXJzLCB3aGljaCBoYXZlIGludGVncmF0ZWQgcHJlcHJvY2Vzc29ycy4gIFRoZSBjb3JyZWN0IG9wdGlvbgorICAjIHRvIHVzZSB3aXRoIHRoZXNlIGlzICtNYWtlZDsgaXQgd3JpdGVzIGRlcGVuZGVuY2llcyB0byBhIGZpbGUgbmFtZWQKKyAgIyAnZm9vLmQnLCB3aGljaCBsYW5kcyBuZXh0IHRvIHRoZSBvYmplY3QgZmlsZSwgd2hlcmV2ZXIgdGhhdAorICAjIGhhcHBlbnMgdG8gYmUuCisgICMgTXVjaCBvZiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRydTY0IGNhc2U7IHNlZSBjb21tZW50cyB0aGVyZS4KKyAgZGlyPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3wvW14vXSokfC98J2AKKyAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyLmxpYnMvJGJhc2UuZAorICAgICIkQCIgLVdjLCtNYWtlZAorICBlbHNlCisgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLmQKKyAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICIkQCIgK01ha2VkCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKKyAgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCisgIGRvCisgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgIGRvbmUKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgIyBBZGQgYGRlcGVuZGVudC5oOicgbGluZXMuCisgICAgc2VkIC1uZSAnMiwkeworCSAgICAgICBzL14gKi8vCisJICAgICAgIHMvIFxcKiQvLworCSAgICAgICBzLyQvOi8KKwkgICAgICAgcAorCSAgICAgfScgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiICIkdG1wZGVwZmlsZTIiCisgIDs7CisKK3RydTY0KQorICAgIyBUaGUgVHJ1NjQgY29tcGlsZXIgdXNlcyAtTUQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGFzIGEgc2lkZQorICAgIyBlZmZlY3QuICBgY2MgLU1EIC1vIGZvby5vIC4uLicgcHV0cyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYGZvby5vLmQnLgorICAgIyBBdCBsZWFzdCBvbiBBbHBoYS9SZWRoYXQgNi4xLCBDb21wYXEgQ0NDIFY2LjItNTA0IHNlZW1zIHRvIHB1dAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisgICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICAgdGVzdCAieCRkaXIiID0gIngkb2JqZWN0IiAmJiBkaXI9CisgICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisKKyAgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRoIFRydTY0IGNjLCBzaGFyZWQgb2JqZWN0cyBjYW4gYWxzbyBiZSB1c2VkIHRvIG1ha2UgYQorICAgICAgIyBzdGF0aWMgbGlicmFyeS4gIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgaW4gbGlidG9vbCAxLjQgc2VyaWVzIHRvCisgICAgICAjIGhhbmRsZSBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbi4KKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNCwgZGVwZW5kZW5jaWVzIHdlcmUgb3V0cHV0IGluICRkaXIubGlicy8kYmFzZS5sby5kLgorICAgICAgIworICAgICAgIyBXaXRoIGxpYnRvb2wgMS41IHRoaXMgZXhjZXB0aW9uIHdhcyByZW1vdmVkLCBhbmQgbGlidG9vbCBub3cKKyAgICAgICMgZ2VuZXJhdGVzIDIgc2VwYXJhdGUgb2JqZWN0cyBmb3IgdGhlIDIgbGlicmFyaWVzLiAgVGhlc2UgdHdvCisgICAgICAjIGNvbXBpbGF0aW9ucyBvdXRwdXQgZGVwZW5kZW5jaWVzIGluICRkaXIubGlicy8kYmFzZS5vLmQgYW5kCisgICAgICAjIGluICRkaXIkYmFzZS5vLmQuICBXZSBoYXZlIHRvIGNoZWNrIGZvciBib3RoIGZpbGVzLCBiZWNhdXNlCisgICAgICAjIG9uZSBvZiB0aGUgdHdvIGNvbXBpbGF0aW9ucyBjYW4gYmUgZGlzYWJsZWQuICBXZSBzaG91bGQgcHJlZmVyCisgICAgICAjICRkaXIkYmFzZS5vLmQgb3ZlciAkZGlyLmxpYnMvJGJhc2Uuby5kIGJlY2F1c2UgdGhlIGxhdHRlciBpcworICAgICAgIyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgd2hlbiAubGlicy8gaXMgZGVsZXRlZCwgd2hpbGUgaWdub3JpbmcKKyAgICAgICMgdGhlIGZvcm1lciB3b3VsZCBjYXVzZSBhIGRpc3RjbGVhbmNoZWNrIHBhbmljLgorICAgICAgdG1wZGVwZmlsZTE9JGRpci5saWJzLyRiYXNlLmxvLmQgICAjIGxpYnRvb2wgMS40CisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2Uuby5kICAgICAgICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS5vLmQgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTQ9JGRpci5saWJzLyRiYXNlLmQgICAgICAjIENvbXBhcSBDQ0MgVjYuMi01MDQKKyAgICAgICIkQCIgLVdjLC1NRAorICAgZWxzZQorICAgICAgdG1wZGVwZmlsZTE9JGRpciRiYXNlLm8uZAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGUzPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlND0kZGlyJGJhc2UuZAorICAgICAgIiRAIiAtTUQKKyAgIGZpCisKKyAgIHN0YXQ9JD8KKyAgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICAgZWxzZQorICAgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgICAgIGV4aXQgJHN0YXQKKyAgIGZpCisKKyAgIGZvciB0bXBkZXBmaWxlIGluICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICBkbworICAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgIGRvbmUKKyAgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICAgc2VkIC1lICJzLF4uKlwuW2Etel0qOiwkb2JqZWN0OiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICAgIHNlZCAtZSAncyxeLipcLlthLXpdKjpbCSBdKiwsJyAtZSAncywkLDosJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorICAgZWxzZQorICAgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgIGZpCisgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICA7OworCisjbm9zaWRlZWZmZWN0KQorICAjIFRoaXMgY29tbWVudCBhYm92ZSBpcyB1c2VkIGJ5IGF1dG9tYWtlIHRvIHRlbGwgc2lkZS1lZmZlY3QKKyAgIyBkZXBlbmRlbmN5IHRyYWNraW5nIG1lY2hhbmlzbXMgZnJvbSBzbG93ZXIgb25lcy4KKworZGFzaG1zdGRvdXQpCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICB0ZXN0IC16ICIkZGFzaG1mbGFnIiAmJiBkYXNobWZsYWc9LU0KKyAgIyBSZXF1aXJlIGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGA6JworICAjIGluIHRoZSB0YXJnZXQgbmFtZS4gIFRoaXMgaXMgdG8gY29wZSB3aXRoIERPUy1zdHlsZSBmaWxlbmFtZXM6CisgICMgYSBkZXBlbmRlbmN5IHN1Y2ggYXMgYGM6L2Zvby9iYXInIGNvdWxkIGJlIHNlZW4gYXMgdGFyZ2V0IGBjJyBvdGhlcndpc2UuCisgICIkQCIgJGRhc2htZmxhZyB8CisgICAgc2VkICdzOl5bICBdKlteOiBdW146XVteOl0qXDpbICAgIF0qOiciJG9iamVjdCInXDogOicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworZGFzaFhtc3Rkb3V0KQorICAjIFRoaXMgY2FzZSBvbmx5IGV4aXN0cyB0byBzYXRpc2Z5IGRlcGVuZC5tNC4gIEl0IGlzIG5ldmVyIGFjdHVhbGx5CisgICMgcnVuLCBhcyB0aGlzIG1vZGUgaXMgc3BlY2lhbGx5IHJlY29nbml6ZWQgaW4gdGhlIHByZWFtYmxlLgorICBleGl0IDEKKyAgOzsKKworbWFrZWRlcGVuZCkKKyAgIiRAIiB8fCBleGl0ICQ/CisgICMgUmVtb3ZlIGFueSBMaWJ0b29sIGNhbGwKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisgICMgWCBtYWtlZGVwZW5kCisgIHNoaWZ0CisgIGNsZWFyZWQ9bm8gZWF0PW5vCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRjbGVhcmVkIGluCisgICAgbm8pCisgICAgICBzZXQgIiI7IHNoaWZ0CisgICAgICBjbGVhcmVkPXllcyA7OworICAgIGVzYWMKKyAgICBpZiB0ZXN0ICRlYXQgPSB5ZXM7IHRoZW4KKyAgICAgIGVhdD1ubworICAgICAgY29udGludWUKKyAgICBmaQorICAgIGNhc2UgIiRhcmciIGluCisgICAgLUQqfC1JKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQorICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KKyAgICAtYXJjaCkKKyAgICAgIGVhdD15ZXMgOzsKKyAgICAtKnwkb2JqZWN0KQorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgIGVzYWMKKyAgZG9uZQorICBvYmpfc3VmZml4PWBlY2hvICIkb2JqZWN0IiB8IHNlZCAncy9eLipcLi8uLydgCisgIHRvdWNoICIkdG1wZGVwZmlsZSIKKyAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCisnIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKKyAgOzsKKworY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAiWCQxIiAhPSAnWC0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIiRAIiAtRSB8CisgICAgc2VkIC1uIC1lICcvXiMgWzAtOV1bMC05XSogIlwoW14iXSpcKSIuKi8gczo6IFwxIFxcOnAnIFwKKyAgICAgICAtZSAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2aXN1YWxjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICIkYXJnIiBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorCXNldCBmbm9yZCAiJEAiCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgKikKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIiRAIiAtRSAyPi9kZXYvbnVsbCB8CisgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6XDE6cCcgfCAkY3lncGF0aF91IHwgc29ydCAtdSA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBzZWQgPCAiJHRtcGRlcGZpbGUiIC1uIC1lICdzJSAlXFwgJWcnIC1lICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCisgIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAtbiAtZSAncyUgJVxcICVnJyAtZSAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3ZjbXN5cykKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK25vbmUpCisgIGV4ZWMgIiRAIgorICA7OworCisqKQorICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2RvYy9saWJmZmkuaW5mbyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9kb2MvbGliZmZpLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5MzIwYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9kb2MvbGliZmZpLmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2RvYy9saWJmZmkudGV4aSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9kb2MvbGliZmZpLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkZDY2NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9kb2MvbGliZmZpLnRleGkKQEAgLTAsMCArMSw2MDAgQEAKK1xpbnB1dCB0ZXhpbmZvICAgQGMgLSotdGV4aW5mby0qLQorQGMgJSoqc3RhcnQgb2YgaGVhZGVyCitAc2V0ZmlsZW5hbWUgbGliZmZpLmluZm8KK0BzZXR0aXRsZSBsaWJmZmkKK0BzZXRjaGFwdGVybmV3cGFnZSBvZmYKK0BjICUqKmVuZCBvZiBoZWFkZXIKKworQGMgTWVyZ2UgdGhlIHN0YW5kYXJkIGluZGV4ZXMgaW50byBhIHNpbmdsZSBvbmUuCitAc3luY29kZWluZGV4IGZuIGNwCitAc3luY29kZWluZGV4IHZyIGNwCitAc3luY29kZWluZGV4IGt5IGNwCitAc3luY29kZWluZGV4IHBnIGNwCitAc3luY29kZWluZGV4IHRwIGNwCisKK0BpbmNsdWRlIHZlcnNpb24udGV4aQorCitAY29weWluZworCitUaGlzIG1hbnVhbCBpcyBmb3IgTGliZmZpLCBhIHBvcnRhYmxlIGZvcmVpZ24tZnVuY3Rpb24gaW50ZXJmYWNlCitsaWJyYXJ5LgorCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDIwMDgsIDIwMTAgUmVkIEhhdCwgSW5jLgorCitAcXVvdGF0aW9uCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgZG9jdW1lbnQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorbGF0ZXIgdmVyc2lvbi4gIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGUKK3NlY3Rpb24gZW50aXRsZWQgYGBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZScnLgorCitAZW5kIHF1b3RhdGlvbgorQGVuZCBjb3B5aW5nCisKK0BkaXJjYXRlZ29yeSBEZXZlbG9wbWVudAorQGRpcmVudHJ5CisqIGxpYmZmaTogKGxpYmZmaSkuICAgICAgICAgICAgIFBvcnRhYmxlIGZvcmVpZ24tZnVuY3Rpb24gaW50ZXJmYWNlIGxpYnJhcnkuCitAZW5kIGRpcmVudHJ5CisKK0B0aXRsZXBhZ2UKK0B0aXRsZSBMaWJmZmkKK0BwYWdlCitAdnNraXAgMHB0IHBsdXMgMWZpbGxsCitAaW5zZXJ0Y29weWluZworQGVuZCB0aXRsZXBhZ2UKKworCitAaWZub3R0ZXgKK0Bub2RlIFRvcAorQHRvcCBsaWJmZmkKKworQGluc2VydGNvcHlpbmcKKworQG1lbnUKKyogSW50cm9kdWN0aW9uOjogICAgICAgICAgICAgICAgV2hhdCBpcyBsaWJmZmk/CisqIFVzaW5nIGxpYmZmaTo6ICAgICAgICAgICAgICAgIEhvdyB0byB1c2UgbGliZmZpLgorKiBNaXNzaW5nIEZlYXR1cmVzOjogICAgICAgICAgICBUaGluZ3MgbGliZmZpIGNhbid0IGRvLgorKiBJbmRleDo6ICAgICAgICAgICAgICAgICAgICAgICBJbmRleC4KK0BlbmQgbWVudQorCitAZW5kIGlmbm90dGV4CisKKworQG5vZGUgSW50cm9kdWN0aW9uCitAY2hhcHRlciBXaGF0IGlzIGxpYmZmaT8KKworQ29tcGlsZXJzIGZvciBoaWdoIGxldmVsIGxhbmd1YWdlcyBnZW5lcmF0ZSBjb2RlIHRoYXQgZm9sbG93IGNlcnRhaW4KK2NvbnZlbnRpb25zLiAgVGhlc2UgY29udmVudGlvbnMgYXJlIG5lY2Vzc2FyeSwgaW4gcGFydCwgZm9yIHNlcGFyYXRlCitjb21waWxhdGlvbiB0byB3b3JrLiAgT25lIHN1Y2ggY29udmVudGlvbiBpcyB0aGUgQGRmbntjYWxsaW5nCitjb252ZW50aW9ufS4gIFRoZSBjYWxsaW5nIGNvbnZlbnRpb24gaXMgYSBzZXQgb2YgYXNzdW1wdGlvbnMgbWFkZSBieQordGhlIGNvbXBpbGVyIGFib3V0IHdoZXJlIGZ1bmN0aW9uIGFyZ3VtZW50cyB3aWxsIGJlIGZvdW5kIG9uIGVudHJ5IHRvCithIGZ1bmN0aW9uLiAgQSBjYWxsaW5nIGNvbnZlbnRpb24gYWxzbyBzcGVjaWZpZXMgd2hlcmUgdGhlIHJldHVybgordmFsdWUgZm9yIGEgZnVuY3Rpb24gaXMgZm91bmQuICBUaGUgY2FsbGluZyBjb252ZW50aW9uIGlzIGFsc28KK3NvbWV0aW1lcyBjYWxsZWQgdGhlIEBkZm57QUJJfSBvciBAZGZue0FwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2V9LgorQGNpbmRleCBjYWxsaW5nIGNvbnZlbnRpb24KK0BjaW5kZXggQUJJCitAY2luZGV4IEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UKKworU29tZSBwcm9ncmFtcyBtYXkgbm90IGtub3cgYXQgdGhlIHRpbWUgb2YgY29tcGlsYXRpb24gd2hhdCBhcmd1bWVudHMKK2FyZSB0byBiZSBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gIEZvciBpbnN0YW5jZSwgYW4gaW50ZXJwcmV0ZXIgbWF5IGJlCit0b2xkIGF0IHJ1bi10aW1lIGFib3V0IHRoZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cyB1c2VkIHRvIGNhbGwKK2EgZ2l2ZW4gZnVuY3Rpb24uICBAc2FtcHtMaWJmZml9IGNhbiBiZSB1c2VkIGluIHN1Y2ggcHJvZ3JhbXMgdG8KK3Byb3ZpZGUgYSBicmlkZ2UgZnJvbSB0aGUgaW50ZXJwcmV0ZXIgcHJvZ3JhbSB0byBjb21waWxlZCBjb2RlLgorCitUaGUgQHNhbXB7bGliZmZpfSBsaWJyYXJ5IHByb3ZpZGVzIGEgcG9ydGFibGUsIGhpZ2ggbGV2ZWwgcHJvZ3JhbW1pbmcKK2ludGVyZmFjZSB0byB2YXJpb3VzIGNhbGxpbmcgY29udmVudGlvbnMuICBUaGlzIGFsbG93cyBhIHByb2dyYW1tZXIgdG8KK2NhbGwgYW55IGZ1bmN0aW9uIHNwZWNpZmllZCBieSBhIGNhbGwgaW50ZXJmYWNlIGRlc2NyaXB0aW9uIGF0IHJ1bgordGltZS4KKworQGFjcm9ueW17RkZJfSBzdGFuZHMgZm9yIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlLiAgQSBmb3JlaWduCitmdW5jdGlvbiBpbnRlcmZhY2UgaXMgdGhlIHBvcHVsYXIgbmFtZSBmb3IgdGhlIGludGVyZmFjZSB0aGF0IGFsbG93cworY29kZSB3cml0dGVuIGluIG9uZSBsYW5ndWFnZSB0byBjYWxsIGNvZGUgd3JpdHRlbiBpbiBhbm90aGVyIGxhbmd1YWdlLgorVGhlIEBzYW1we2xpYmZmaX0gbGlicmFyeSByZWFsbHkgb25seSBwcm92aWRlcyB0aGUgbG93ZXN0LCBtYWNoaW5lCitkZXBlbmRlbnQgbGF5ZXIgb2YgYSBmdWxseSBmZWF0dXJlZCBmb3JlaWduIGZ1bmN0aW9uIGludGVyZmFjZS4gIEEKK2xheWVyIG11c3QgZXhpc3QgYWJvdmUgQHNhbXB7bGliZmZpfSB0aGF0IGhhbmRsZXMgdHlwZSBjb252ZXJzaW9ucyBmb3IKK3ZhbHVlcyBwYXNzZWQgYmV0d2VlbiB0aGUgdHdvIGxhbmd1YWdlcy4KK0BjaW5kZXggRkZJCitAY2luZGV4IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCisKKworQG5vZGUgVXNpbmcgbGliZmZpCitAY2hhcHRlciBVc2luZyBsaWJmZmkKKworQG1lbnUKKyogVGhlIEJhc2ljczo6ICAgICAgICAgICAgICAgICAgVGhlIGJhc2ljIGxpYmZmaSBBUEkuCisqIFNpbXBsZSBFeGFtcGxlOjogICAgICAgICAgICAgIEEgc2ltcGxlIGV4YW1wbGUuCisqIFR5cGVzOjogICAgICAgICAgICAgICAgICAgICAgIGxpYmZmaSB0eXBlIGRlc2NyaXB0aW9ucy4KKyogTXVsdGlwbGUgQUJJczo6ICAgICAgICAgICAgICAgRGlmZmVyZW50IHBhc3Npbmcgc3R5bGVzIG9uIG9uZSBwbGF0Zm9ybS4KKyogVGhlIENsb3N1cmUgQVBJOjogICAgICAgICAgICAgV3JpdGluZyBhIGdlbmVyaWMgZnVuY3Rpb24uCisqIENsb3N1cmUgRXhhbXBsZTo6ICAgICAgICAgICAgIEEgY2xvc3VyZSBleGFtcGxlLgorQGVuZCBtZW51CisKKworQG5vZGUgVGhlIEJhc2ljcworQHNlY3Rpb24gVGhlIEJhc2ljcworCitAc2FtcHtMaWJmZml9IGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHlvdSB3aXNoCit0byBjYWxsIGFuZCB0aGF0IHlvdSBrbm93IHRoZSBudW1iZXIgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cyB0byBwYXNzCitpdCwgYXMgd2VsbCBhcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLgorCitUaGUgZmlyc3QgdGhpbmcgeW91IG11c3QgZG8gaXMgY3JlYXRlIGFuIEBjb2Rle2ZmaV9jaWZ9IG9iamVjdCB0aGF0CittYXRjaGVzIHRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIHlvdSB3aXNoIHRvIGNhbGwuICBUaGlzIGlzIGEKK3NlcGFyYXRlIHN0ZXAgYmVjYXVzZSBpdCBpcyBjb21tb24gdG8gbWFrZSBtdWx0aXBsZSBjYWxscyB1c2luZyBhCitzaW5nbGUgQGNvZGV7ZmZpX2NpZn0uICBUaGUgQGRmbntjaWZ9IGluIEBjb2Rle2ZmaV9jaWZ9IHN0YW5kcyBmb3IKK0NhbGwgSW50ZXJGYWNlLiAgVG8gcHJlcGFyZSBhIGNhbGwgaW50ZXJmYWNlIG9iamVjdCwgdXNlIHRoZSBmdW5jdGlvbgorQGNvZGV7ZmZpX3ByZXBfY2lmfS4KK0BjaW5kZXggY2lmCisKK0BmaW5kZXggZmZpX3ByZXBfY2lmCitAZGVmdW4gZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWYgKGZmaV9jaWYgKkB2YXJ7Y2lmfSwgZmZpX2FiaSBAdmFye2FiaX0sIHVuc2lnbmVkIGludCBAdmFye25hcmdzfSwgZmZpX3R5cGUgKkB2YXJ7cnR5cGV9LCBmZmlfdHlwZSAqKkB2YXJ7YXJndHlwZXN9KQorVGhpcyBpbml0aWFsaXplcyBAdmFye2NpZn0gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorCitAdmFye2FiaX0gaXMgdGhlIEFCSSB0byB1c2U7IG5vcm1hbGx5IEBjb2Rle0ZGSV9ERUZBVUxUX0FCSX0gaXMgd2hhdAoreW91IHdhbnQuICBAcmVme011bHRpcGxlIEFCSXN9IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAdmFye25hcmdzfSBpcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHRoaXMgZnVuY3Rpb24gYWNjZXB0cy4KK0BzYW1we2xpYmZmaX0gZG9lcyBub3QgeWV0IGhhbmRsZSB2YXJhcmdzIGZ1bmN0aW9uczsgc2VlIEByZWZ7TWlzc2luZworRmVhdHVyZXN9IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAdmFye3J0eXBlfSBpcyBhIHBvaW50ZXIgdG8gYW4gQGNvZGV7ZmZpX3R5cGV9IHN0cnVjdHVyZSB0aGF0CitkZXNjcmliZXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbi4gIEB4cmVme1R5cGVzfS4KKworQHZhcnthcmd0eXBlc30gaXMgYSB2ZWN0b3Igb2YgQGNvZGV7ZmZpX3R5cGV9IHBvaW50ZXJzLgorQHZhcnthcmd0eXBlc30gbXVzdCBoYXZlIEB2YXJ7bmFyZ3N9IGVsZW1lbnRzLiAgSWYgQHZhcntuYXJnc30gaXMgMCwKK3RoaXMgYXJndW1lbnQgaXMgaWdub3JlZC4KKworQGNvZGV7ZmZpX3ByZXBfY2lmfSByZXR1cm5zIGEgQGNvZGV7bGliZmZpfSBzdGF0dXMgY29kZSwgb2YgdHlwZQorQGNvZGV7ZmZpX3N0YXR1c30uICBUaGlzIHdpbGwgYmUgZWl0aGVyIEBjb2Rle0ZGSV9PS30gaWYgZXZlcnl0aGluZword29ya2VkIHByb3Blcmx5OyBAY29kZXtGRklfQkFEX1RZUEVERUZ9IGlmIG9uZSBvZiB0aGUgQGNvZGV7ZmZpX3R5cGV9CitvYmplY3RzIGlzIGluY29ycmVjdDsgb3IgQGNvZGV7RkZJX0JBRF9BQkl9IGlmIHRoZSBAdmFye2FiaX0gcGFyYW1ldGVyCitpcyBpbnZhbGlkLgorQGVuZCBkZWZ1bgorCisKK1RvIGNhbGwgYSBmdW5jdGlvbiB1c2luZyBhbiBpbml0aWFsaXplZCBAY29kZXtmZmlfY2lmfSwgdXNlIHRoZQorQGNvZGV7ZmZpX2NhbGx9IGZ1bmN0aW9uOgorCitAZmluZGV4IGZmaV9jYWxsCitAZGVmdW4gdm9pZCBmZmlfY2FsbCAoZmZpX2NpZiAqQHZhcntjaWZ9LCB2b2lkICpAdmFye2ZufSwgdm9pZCAqQHZhcntydmFsdWV9LCB2b2lkICoqQHZhcnthdmFsdWVzfSkKK1RoaXMgY2FsbHMgdGhlIGZ1bmN0aW9uIEB2YXJ7Zm59IGFjY29yZGluZyB0byB0aGUgZGVzY3JpcHRpb24gZ2l2ZW4gaW4KK0B2YXJ7Y2lmfS4gIEB2YXJ7Y2lmfSBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHByZXBhcmVkIHVzaW5nCitAY29kZXtmZmlfcHJlcF9jaWZ9LgorCitAdmFye3J2YWx1ZX0gaXMgYSBwb2ludGVyIHRvIGEgY2h1bmsgb2YgbWVtb3J5IHRoYXQgd2lsbCBob2xkIHRoZQorcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsLiAgVGhpcyBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQorcmVzdWx0IGFuZCBtdXN0IGJlIHN1aXRhYmx5IGFsaWduZWQ7IGl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eQordG8gZW5zdXJlIHRoaXMuICBJZiBAdmFye2NpZn0gZGVjbGFyZXMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucworQGNvZGV7dm9pZH0gKHVzaW5nIEBjb2Rle2ZmaV90eXBlX3ZvaWR9KSwgdGhlbiBAdmFye3J2YWx1ZX0gaXMKK2lnbm9yZWQuICBJZiBAdmFye3J2YWx1ZX0gaXMgQHNhbXB7TlVMTH0sIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcworZGlzY2FyZGVkLgorCitAdmFye2F2YWx1ZXN9IGlzIGEgdmVjdG9yIG9mIEBjb2Rle3ZvaWQgKn0gcG9pbnRlcnMgdGhhdCBwb2ludCB0byB0aGUKK21lbW9yeSBsb2NhdGlvbnMgaG9sZGluZyB0aGUgYXJndW1lbnQgdmFsdWVzIGZvciBhIGNhbGwuICBJZiBAdmFye2NpZn0KK2RlY2xhcmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGhhcyBubyBhcmd1bWVudHMgKGkuZS4sIEB2YXJ7bmFyZ3N9IHdhcyAwKSwKK3RoZW4gQHZhcnthdmFsdWVzfSBpcyBpZ25vcmVkLiAgTm90ZSB0aGF0IGFyZ3VtZW50IHZhbHVlcyBtYXkgYmUKK21vZGlmaWVkIGJ5IHRoZSBjYWxsZWUgKGZvciBpbnN0YW5jZSwgc3RydWN0cyBwYXNzZWQgYnkgdmFsdWUpOyB0aGUKK2J1cmRlbiBvZiBjb3B5aW5nIHBhc3MtYnktdmFsdWUgYXJndW1lbnRzIGlzIHBsYWNlZCBvbiB0aGUgY2FsbGVyLgorQGVuZCBkZWZ1bgorCisKK0Bub2RlIFNpbXBsZSBFeGFtcGxlCitAc2VjdGlvbiBTaW1wbGUgRXhhbXBsZQorCitIZXJlIGlzIGEgdHJpdmlhbCBleGFtcGxlIHRoYXQgY2FsbHMgQGNvZGV7cHV0c30gYSBmZXcgdGltZXMuCisKK0BleGFtcGxlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworaW50IG1haW4oKQorQHsKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzWzFdOworICB2b2lkICp2YWx1ZXNbMV07CisgIGNoYXIgKnM7CisgIGludCByYzsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGFyZ3VtZW50IGluZm8gdmVjdG9ycyAqLyAgICAKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9wb2ludGVyOworICB2YWx1ZXNbMF0gPSAmczsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBpZiAoZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwgCisJCSAgICAgICAmZmZpX3R5cGVfdWludCwgYXJncykgPT0gRkZJX09LKQorICAgIEB7CisgICAgICBzID0gIkhlbGxvIFdvcmxkISI7CisgICAgICBmZmlfY2FsbCgmY2lmLCBwdXRzLCAmcmMsIHZhbHVlcyk7CisgICAgICAvKiByYyBub3cgaG9sZHMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCB0byBwdXRzICovCisgICAgICAKKyAgICAgIC8qIHZhbHVlcyBob2xkcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uJ3MgYXJnLCBzbyB0byAKKyAgICAgICAgIGNhbGwgcHV0cygpIGFnYWluIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGNoYW5nZSB0aGUgCisgICAgICAgICB2YWx1ZSBvZiBzICovCisgICAgICBzID0gIlRoaXMgaXMgY29vbCEiOworICAgICAgZmZpX2NhbGwoJmNpZiwgcHV0cywgJnJjLCB2YWx1ZXMpOworICAgIEB9CisgIAorICByZXR1cm4gMDsKK0B9CitAZW5kIGV4YW1wbGUKKworCitAbm9kZSBUeXBlcworQHNlY3Rpb24gVHlwZXMKKworQG1lbnUKKyogUHJpbWl0aXZlIFR5cGVzOjogICAgICAgICAgICAgQnVpbHQtaW4gdHlwZXMuCisqIFN0cnVjdHVyZXM6OiAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSB0eXBlcy4KKyogVHlwZSBFeGFtcGxlOjogICAgICAgICAgICAgICAgU3RydWN0dXJlIHR5cGUgZXhhbXBsZS4KK0BlbmQgbWVudQorCitAbm9kZSBQcmltaXRpdmUgVHlwZXMKK0BzdWJzZWN0aW9uIFByaW1pdGl2ZSBUeXBlcworCitAY29kZXtMaWJmZml9IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGJ1aWx0LWluIHR5cGUgZGVzY3JpcHRvcnMgdGhhdCBjYW4KK2JlIHVzZWQgdG8gZGVzY3JpYmUgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBmZmlfdHlwZV92b2lkCitAdGluZGV4IGZmaV90eXBlX3ZvaWQKK1RoZSB0eXBlIEBjb2Rle3ZvaWR9LiAgVGhpcyBjYW5ub3QgYmUgdXNlZCBmb3IgYXJndW1lbnQgdHlwZXMsIG9ubHkKK2ZvciByZXR1cm4gdmFsdWVzLgorCitAaXRlbSBmZmlfdHlwZV91aW50OAorQHRpbmRleCBmZmlfdHlwZV91aW50OAorQW4gdW5zaWduZWQsIDgtYml0IGludGVnZXIgdHlwZS4KKworQGl0ZW0gZmZpX3R5cGVfc2ludDgKK0B0aW5kZXggZmZpX3R5cGVfc2ludDgKK0Egc2lnbmVkLCA4LWJpdCBpbnRlZ2VyIHR5cGUuCisKK0BpdGVtIGZmaV90eXBlX3VpbnQxNgorQHRpbmRleCBmZmlfdHlwZV91aW50MTYKK0FuIHVuc2lnbmVkLCAxNi1iaXQgaW50ZWdlciB0eXBlLgorCitAaXRlbSBmZmlfdHlwZV9zaW50MTYKK0B0aW5kZXggZmZpX3R5cGVfc2ludDE2CitBIHNpZ25lZCwgMTYtYml0IGludGVnZXIgdHlwZS4KKworQGl0ZW0gZmZpX3R5cGVfdWludDMyCitAdGluZGV4IGZmaV90eXBlX3VpbnQzMgorQW4gdW5zaWduZWQsIDMyLWJpdCBpbnRlZ2VyIHR5cGUuCisKK0BpdGVtIGZmaV90eXBlX3NpbnQzMgorQHRpbmRleCBmZmlfdHlwZV9zaW50MzIKK0Egc2lnbmVkLCAzMi1iaXQgaW50ZWdlciB0eXBlLgorCitAaXRlbSBmZmlfdHlwZV91aW50NjQKK0B0aW5kZXggZmZpX3R5cGVfdWludDY0CitBbiB1bnNpZ25lZCwgNjQtYml0IGludGVnZXIgdHlwZS4KKworQGl0ZW0gZmZpX3R5cGVfc2ludDY0CitAdGluZGV4IGZmaV90eXBlX3NpbnQ2NAorQSBzaWduZWQsIDY0LWJpdCBpbnRlZ2VyIHR5cGUuCisKK0BpdGVtIGZmaV90eXBlX2Zsb2F0CitAdGluZGV4IGZmaV90eXBlX2Zsb2F0CitUaGUgQyBAY29kZXtmbG9hdH0gdHlwZS4KKworQGl0ZW0gZmZpX3R5cGVfZG91YmxlCitAdGluZGV4IGZmaV90eXBlX2RvdWJsZQorVGhlIEMgQGNvZGV7ZG91YmxlfSB0eXBlLgorCitAaXRlbSBmZmlfdHlwZV91Y2hhcgorQHRpbmRleCBmZmlfdHlwZV91Y2hhcgorVGhlIEMgQGNvZGV7dW5zaWduZWQgY2hhcn0gdHlwZS4KKworQGl0ZW0gZmZpX3R5cGVfc2NoYXIKK0B0aW5kZXggZmZpX3R5cGVfc2NoYXIKK1RoZSBDIEBjb2Rle3NpZ25lZCBjaGFyfSB0eXBlLiAgKE5vdGUgdGhhdCB0aGVyZSBpcyBub3QgYW4gZXhhY3QKK2VxdWl2YWxlbnQgdG8gdGhlIEMgQGNvZGV7Y2hhcn0gdHlwZSBpbiBAY29kZXtsaWJmZml9OyBvcmRpbmFyaWx5IHlvdQorc2hvdWxkIGVpdGhlciB1c2UgQGNvZGV7ZmZpX3R5cGVfc2NoYXJ9IG9yIEBjb2Rle2ZmaV90eXBlX3VjaGFyfQorZGVwZW5kaW5nIG9uIHdoZXRoZXIgQGNvZGV7Y2hhcn0gaXMgc2lnbmVkLikKKworQGl0ZW0gZmZpX3R5cGVfdXNob3J0CitAdGluZGV4IGZmaV90eXBlX3VzaG9ydAorVGhlIEMgQGNvZGV7dW5zaWduZWQgc2hvcnR9IHR5cGUuCisKK0BpdGVtIGZmaV90eXBlX3NzaG9ydAorQHRpbmRleCBmZmlfdHlwZV9zc2hvcnQKK1RoZSBDIEBjb2Rle3Nob3J0fSB0eXBlLgorCitAaXRlbSBmZmlfdHlwZV91aW50CitAdGluZGV4IGZmaV90eXBlX3VpbnQKK1RoZSBDIEBjb2Rle3Vuc2lnbmVkIGludH0gdHlwZS4KKworQGl0ZW0gZmZpX3R5cGVfc2ludAorQHRpbmRleCBmZmlfdHlwZV9zaW50CitUaGUgQyBAY29kZXtpbnR9IHR5cGUuCisKK0BpdGVtIGZmaV90eXBlX3Vsb25nCitAdGluZGV4IGZmaV90eXBlX3Vsb25nCitUaGUgQyBAY29kZXt1bnNpZ25lZCBsb25nfSB0eXBlLgorCitAaXRlbSBmZmlfdHlwZV9zbG9uZworQHRpbmRleCBmZmlfdHlwZV9zbG9uZworVGhlIEMgQGNvZGV7bG9uZ30gdHlwZS4KKworQGl0ZW0gZmZpX3R5cGVfbG9uZ2RvdWJsZQorQHRpbmRleCBmZmlfdHlwZV9sb25nZG91YmxlCitPbiBwbGF0Zm9ybXMgdGhhdCBoYXZlIGEgQyBAY29kZXtsb25nIGRvdWJsZX0gdHlwZSwgdGhpcyBpcyBkZWZpbmVkLgorT24gb3RoZXIgcGxhdGZvcm1zLCBpdCBpcyBub3QuCisKK0BpdGVtIGZmaV90eXBlX3BvaW50ZXIKK0B0aW5kZXggZmZpX3R5cGVfcG9pbnRlcgorQSBnZW5lcmljIEBjb2Rle3ZvaWQgKn0gcG9pbnRlci4gIFlvdSBzaG91bGQgdXNlIHRoaXMgZm9yIGFsbAorcG9pbnRlcnMsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgcmVhbCB0eXBlLgorQGVuZCB0YWJsZQorCitFYWNoIG9mIHRoZXNlIGlzIG9mIHR5cGUgQGNvZGV7ZmZpX3R5cGV9LCBzbyB5b3UgbXVzdCB0YWtlIHRoZSBhZGRyZXNzCit3aGVuIHBhc3NpbmcgdG8gQGNvZGV7ZmZpX3ByZXBfY2lmfS4KKworCitAbm9kZSBTdHJ1Y3R1cmVzCitAc3Vic2VjdGlvbiBTdHJ1Y3R1cmVzCisKK0FsdGhvdWdoIEBzYW1we2xpYmZmaX0gaGFzIG5vIHNwZWNpYWwgc3VwcG9ydCBmb3IgdW5pb25zIG9yCitiaXQtZmllbGRzLCBpdCBpcyBwZXJmZWN0bHkgaGFwcHkgcGFzc2luZyBzdHJ1Y3R1cmVzIGJhY2sgYW5kIGZvcnRoLgorWW91IG11c3QgZmlyc3QgZGVzY3JpYmUgdGhlIHN0cnVjdHVyZSB0byBAc2FtcHtsaWJmZml9IGJ5IGNyZWF0aW5nIGEKK25ldyBAY29kZXtmZmlfdHlwZX0gb2JqZWN0IGZvciBpdC4KKworQHRpbmRleCBmZmlfdHlwZQorQGRlZnRwIGZmaV90eXBlCitUaGUgQGNvZGV7ZmZpX3R5cGV9IGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CitAdGFibGUgQGNvZGUKK0BpdGVtIHNpemVfdCBzaXplCitUaGlzIGlzIHNldCBieSBAY29kZXtsaWJmZml9OyB5b3Ugc2hvdWxkIGluaXRpYWxpemUgaXQgdG8gemVyby4KKworQGl0ZW0gdW5zaWduZWQgc2hvcnQgYWxpZ25tZW50CitUaGlzIGlzIHNldCBieSBAY29kZXtsaWJmZml9OyB5b3Ugc2hvdWxkIGluaXRpYWxpemUgaXQgdG8gemVyby4KKworQGl0ZW0gdW5zaWduZWQgc2hvcnQgdHlwZQorRm9yIGEgc3RydWN0dXJlLCB0aGlzIHNob3VsZCBiZSBzZXQgdG8gQGNvZGV7RkZJX1RZUEVfU1RSVUNUfS4KKworQGl0ZW0gZmZpX3R5cGUgKiplbGVtZW50cworVGhpcyBpcyBhIEBzYW1we05VTEx9LXRlcm1pbmF0ZWQgYXJyYXkgb2YgcG9pbnRlcnMgdG8gQGNvZGV7ZmZpX3R5cGV9CitvYmplY3RzLiAgVGhlcmUgaXMgb25lIGVsZW1lbnQgcGVyIGZpZWxkIG9mIHRoZSBzdHJ1Y3QuCitAZW5kIHRhYmxlCitAZW5kIGRlZnRwCisKKworQG5vZGUgVHlwZSBFeGFtcGxlCitAc3Vic2VjdGlvbiBUeXBlIEV4YW1wbGUKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIGluaXRpYWxpemVzIGEgQGNvZGV7ZmZpX3R5cGV9IG9iamVjdAorcmVwcmVzZW50aW5nIHRoZSBAY29kZXt0bX0gc3RydWN0IGZyb20gTGludXgncyBAZmlsZXt0aW1lLmh9LgorCitIZXJlIGlzIGhvdyB0aGUgc3RydWN0IGlzIGRlZmluZWQ6CisKK0BleGFtcGxlCitzdHJ1Y3QgdG0gQHsKKyAgICBpbnQgdG1fc2VjOworICAgIGludCB0bV9taW47CisgICAgaW50IHRtX2hvdXI7CisgICAgaW50IHRtX21kYXk7CisgICAgaW50IHRtX21vbjsKKyAgICBpbnQgdG1feWVhcjsKKyAgICBpbnQgdG1fd2RheTsKKyAgICBpbnQgdG1feWRheTsKKyAgICBpbnQgdG1faXNkc3Q7CisgICAgLyogVGhvc2UgYXJlIGZvciBmdXR1cmUgdXNlLiAqLworICAgIGxvbmcgaW50IF9fdG1fZ210b2ZmX187CisgICAgX19jb25zdCBjaGFyICpfX3RtX3pvbmVfXzsKK0B9OworQGVuZCBleGFtcGxlCisKK0hlcmUgaXMgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSB0byBkZXNjcmliZSB0aGlzIHN0cnVjdCB0bworQGNvZGV7bGliZmZpfToKKworQGV4YW1wbGUKKyAgICBAeworICAgICAgZmZpX3R5cGUgdG1fdHlwZTsKKyAgICAgIGZmaV90eXBlICp0bV90eXBlX2VsZW1lbnRzWzEyXTsKKyAgICAgIGludCBpOworCisgICAgICB0bV90eXBlLnNpemUgPSB0bV90eXBlLmFsaWdubWVudCA9IDA7CisgICAgICB0bV90eXBlLmVsZW1lbnRzID0gJnRtX3R5cGVfZWxlbWVudHM7CisgICAgCisgICAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICAgICAgICAgIHRtX3R5cGVfZWxlbWVudHNbaV0gPSAmZmZpX3R5cGVfc2ludDsKKworICAgICAgdG1fdHlwZV9lbGVtZW50c1s5XSA9ICZmZmlfdHlwZV9zbG9uZzsKKyAgICAgIHRtX3R5cGVfZWxlbWVudHNbMTBdID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICB0bV90eXBlX2VsZW1lbnRzWzExXSA9IE5VTEw7CisKKyAgICAgIC8qIHRtX3R5cGUgY2FuIG5vdyBiZSB1c2VkIHRvIHJlcHJlc2VudCB0bSBhcmd1bWVudCB0eXBlcyBhbmQKKwkgcmV0dXJuIHR5cGVzIGZvciBmZmlfcHJlcF9jaWYoKSAqLworICAgIEB9CitAZW5kIGV4YW1wbGUKKworCitAbm9kZSBNdWx0aXBsZSBBQklzCitAc2VjdGlvbiBNdWx0aXBsZSBBQklzCisKK0EgZ2l2ZW4gcGxhdGZvcm0gbWF5IHByb3ZpZGUgbXVsdGlwbGUgZGlmZmVyZW50IEFCSXMgYXQgb25jZS4gIEZvcgoraW5zdGFuY2UsIHRoZSB4ODYgcGxhdGZvcm0gaGFzIGJvdGggQHNhbXB7c3RkY2FsbH0gYW5kIEBzYW1we2Zhc3RjYWxsfQorZnVuY3Rpb25zLgorCitAY29kZXtsaWJmZml9IHByb3ZpZGVzIHNvbWUgc3VwcG9ydCBmb3IgdGhpcy4gIEhvd2V2ZXIsIHRoaXMgaXMKK25lY2Vzc2FyaWx5IHBsYXRmb3JtLXNwZWNpZmljLgorCitAYyBGSVhNRTogZG9jdW1lbnQgdGhlIHBsYXRmb3JtcworCitAbm9kZSBUaGUgQ2xvc3VyZSBBUEkKK0BzZWN0aW9uIFRoZSBDbG9zdXJlIEFQSQorCitAY29kZXtsaWJmZml9IGFsc28gcHJvdmlkZXMgYSB3YXkgdG8gd3JpdGUgYSBnZW5lcmljIGZ1bmN0aW9uIC0tIGEKK2Z1bmN0aW9uIHRoYXQgY2FuIGFjY2VwdCBhbmQgZGVjb2RlIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMuCitUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB3cml0aW5nIGFuIGludGVycHJldGVyLCBvciB0byBwcm92aWRlIHdyYXBwZXJzCitmb3IgYXJiaXRyYXJ5IGZ1bmN0aW9ucy4KKworVGhpcyBmYWNpbGl0eSBpcyBjYWxsZWQgdGhlIEBkZm57Y2xvc3VyZSBBUEl9LiAgQ2xvc3VyZXMgYXJlIG5vdAorc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXM7IHlvdSBjYW4gY2hlY2sgdGhlIEBjb2Rle0ZGSV9DTE9TVVJFU30KK2RlZmluZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGV5IGFyZSBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQKK3BsYXRmb3JtLgorQGNpbmRleCBjbG9zdXJlcworQGNpbmRleCBjbG9zdXJlIEFQSQorQGZpbmRleCBGRklfQ0xPU1VSRVMKKworQmVjYXVzZSBjbG9zdXJlcyB3b3JrIGJ5IGFzc2VtYmxpbmcgYSB0aW55IGZ1bmN0aW9uIGF0IHJ1bnRpbWUsIHRoZXkKK3JlcXVpcmUgc3BlY2lhbCBhbGxvY2F0aW9uIG9uIHBsYXRmb3JtcyB0aGF0IGhhdmUgYSBub24tZXhlY3V0YWJsZQoraGVhcC4gIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBjbG9zdXJlcyBpcyBoYW5kbGVkIGJ5IGEgcGFpciBvZgorZnVuY3Rpb25zOgorCitAZmluZGV4IGZmaV9jbG9zdXJlX2FsbG9jCitAZGVmdW4gdm9pZCAqZmZpX2Nsb3N1cmVfYWxsb2MgKHNpemVfdCBAdmFye3NpemV9LCB2b2lkICoqQHZhcntjb2RlfSkKK0FsbG9jYXRlIGEgY2h1bmsgb2YgbWVtb3J5IGhvbGRpbmcgQHZhcntzaXplfSBieXRlcy4gIFRoaXMgcmV0dXJucyBhCitwb2ludGVyIHRvIHRoZSB3cml0YWJsZSBhZGRyZXNzLCBhbmQgc2V0cyAqQHZhcntjb2RlfSB0byB0aGUKK2NvcnJlc3BvbmRpbmcgZXhlY3V0YWJsZSBhZGRyZXNzLgorCitAdmFye3NpemV9IHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGhvbGQgYSBAY29kZXtmZmlfY2xvc3VyZX0gb2JqZWN0LgorQGVuZCBkZWZ1bgorCitAZmluZGV4IGZmaV9jbG9zdXJlX2ZyZWUKK0BkZWZ1biB2b2lkIGZmaV9jbG9zdXJlX2ZyZWUgKHZvaWQgKkB2YXJ7d3JpdGFibGV9KQorRnJlZSBtZW1vcnkgYWxsb2NhdGVkIHVzaW5nIEBjb2Rle2ZmaV9jbG9zdXJlX2FsbG9jfS4gIFRoZSBhcmd1bWVudCBpcwordGhlIHdyaXRhYmxlIGFkZHJlc3MgdGhhdCB3YXMgcmV0dXJuZWQuCitAZW5kIGRlZnVuCisKKworT25jZSB5b3UgaGF2ZSBhbGxvY2F0ZWQgdGhlIG1lbW9yeSBmb3IgYSBjbG9zdXJlLCB5b3UgbXVzdCBjb25zdHJ1Y3QgYQorQGNvZGV7ZmZpX2NpZn0gZGVzY3JpYmluZyB0aGUgZnVuY3Rpb24gY2FsbC4gIEZpbmFsbHkgeW91IGNhbiBwcmVwYXJlCit0aGUgY2xvc3VyZSBmdW5jdGlvbjoKKworQGZpbmRleCBmZmlfcHJlcF9jbG9zdXJlX2xvYworQGRlZnVuIGZmaV9zdGF0dXMgZmZpX3ByZXBfY2xvc3VyZV9sb2MgKGZmaV9jbG9zdXJlICpAdmFye2Nsb3N1cmV9LCBmZmlfY2lmICpAdmFye2NpZn0sIHZvaWQgKCpAdmFye2Z1bn0pIChmZmlfY2lmICpAdmFye2NpZn0sIHZvaWQgKkB2YXJ7cmV0fSwgdm9pZCAqKkB2YXJ7YXJnc30sIHZvaWQgKkB2YXJ7dXNlcl9kYXRhfSksIHZvaWQgKkB2YXJ7dXNlcl9kYXRhfSwgdm9pZCAqQHZhcntjb2RlbG9jfSkKK1ByZXBhcmUgYSBjbG9zdXJlIGZ1bmN0aW9uLgorCitAdmFye2Nsb3N1cmV9IGlzIHRoZSBhZGRyZXNzIG9mIGEgQGNvZGV7ZmZpX2Nsb3N1cmV9IG9iamVjdDsgdGhpcyBpcwordGhlIHdyaXRhYmxlIGFkZHJlc3MgcmV0dXJuZWQgYnkgQGNvZGV7ZmZpX2Nsb3N1cmVfYWxsb2N9LgorCitAdmFye2NpZn0gaXMgdGhlIEBjb2Rle2ZmaV9jaWZ9IGRlc2NyaWJpbmcgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCisKK0B2YXJ7dXNlcl9kYXRhfSBpcyBhbiBhcmJpdHJhcnkgZGF0dW0gdGhhdCBpcyBwYXNzZWQsIHVuaW50ZXJwcmV0ZWQsCit0byB5b3VyIGNsb3N1cmUgZnVuY3Rpb24uCisKK0B2YXJ7Y29kZWxvY30gaXMgdGhlIGV4ZWN1dGFibGUgYWRkcmVzcyByZXR1cm5lZCBieQorQGNvZGV7ZmZpX2Nsb3N1cmVfYWxsb2N9LgorCitAdmFye2Z1bn0gaXMgdGhlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNsb3N1cmUgaXMKK2ludm9rZWQuICBJdCBpcyBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnRzOgorQHRhYmxlIEB2YXIKK0BpdGVtIGNpZgorVGhlIEBjb2Rle2ZmaV9jaWZ9IHBhc3NlZCB0byBAY29kZXtmZmlfcHJlcF9jbG9zdXJlX2xvY30uCisKK0BpdGVtIHJldAorQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgdXNlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlLgorQHZhcntmdW59IG11c3QgZmlsbCB0aGlzLCB1bmxlc3MgdGhlIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIHJldHVybmluZworQGNvZGV7dm9pZH0uCitAYyBGSVhNRTogaXMgdGhpcyBOVUxMIGZvciB2b2lkLXJldHVybmluZyBmdW5jdGlvbnM/CisKK0BpdGVtIGFyZ3MKK0EgdmVjdG9yIG9mIHBvaW50ZXJzIHRvIG1lbW9yeSBob2xkaW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLgorCitAaXRlbSB1c2VyX2RhdGEKK1RoZSBzYW1lIEB2YXJ7dXNlcl9kYXRhfSB0aGF0IHdhcyBwYXNzZWQgdG8KK0Bjb2Rle2ZmaV9wcmVwX2Nsb3N1cmVfbG9jfS4KK0BlbmQgdGFibGUKKworQGNvZGV7ZmZpX3ByZXBfY2xvc3VyZV9sb2N9IHdpbGwgcmV0dXJuIEBjb2Rle0ZGSV9PS30gaWYgZXZlcnl0aGluZword2VudCBvaywgYW5kIHNvbWV0aGluZyBlbHNlIG9uIGVycm9yLgorQGMgRklYTUU6IHdoYXQ/CisKK0FmdGVyIGNhbGxpbmcgQGNvZGV7ZmZpX3ByZXBfY2xvc3VyZV9sb2N9LCB5b3UgY2FuIGNhc3QgQHZhcntjb2RlbG9jfQordG8gdGhlIGFwcHJvcHJpYXRlIHBvaW50ZXItdG8tZnVuY3Rpb24gdHlwZS4KK0BlbmQgZGVmdW4KKworWW91IG1heSBzZWUgb2xkIGNvZGUgcmVmZXJyaW5nIHRvIEBjb2Rle2ZmaV9wcmVwX2Nsb3N1cmV9LiAgVGhpcworZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgYXMgaXQgY2Fubm90IGhhbmRsZSB0aGUgbmVlZCBmb3Igc2VwYXJhdGUKK3dyaXRhYmxlIGFuZCBleGVjdXRhYmxlIGFkZHJlc3Nlcy4KKworQG5vZGUgQ2xvc3VyZSBFeGFtcGxlCitAc2VjdGlvbiBDbG9zdXJlIEV4YW1wbGUKKworQSB0cml2aWFsIGV4YW1wbGUgdGhhdCBjcmVhdGVzIGEgbmV3IEBjb2Rle3B1dHN9IGJ5IGJpbmRpbmcgCitAY29kZXtmcHV0c30gd2l0aCBAY29kZXtzdGRpbn0uCisKK0BleGFtcGxlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworLyogQWN0cyBsaWtlIHB1dHMgd2l0aCB0aGUgZmlsZSBnaXZlbiBhdCB0aW1lIG9mIGVuY2xvc3VyZS4gKi8KK3ZvaWQgcHV0c19iaW5kaW5nKGZmaV9jaWYgKmNpZiwgdW5zaWduZWQgaW50ICpyZXQsIHZvaWQqIGFyZ3NbXSwgCisgICAgICAgICAgICAgICAgICBGSUxFICpzdHJlYW0pCitAeworICAqcmV0ID0gZnB1dHMoKihjaGFyICoqKWFyZ3NbMF0sIHN0cmVhbSk7CitAfQorCitpbnQgbWFpbigpCitAeworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbMV07CisgIGZmaV9jbG9zdXJlICpjbG9zdXJlOworCisgIGludCAoKmJvdW5kX3B1dHMpKGNoYXIgKik7CisgIGludCByYzsKKyAgCisgIC8qIEFsbG9jYXRlIGNsb3N1cmUgYW5kIGJvdW5kX3B1dHMgKi8KKyAgY2xvc3VyZSA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZib3VuZF9wdXRzKTsKKworICBpZiAoY2xvc3VyZSkKKyAgICBAeworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgYXJndW1lbnQgaW5mbyB2ZWN0b3JzICovCisgICAgICBhcmdzWzBdID0gJmZmaV90eXBlX3BvaW50ZXI7CisKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICAgICAgaWYgKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICZmZmlfdHlwZV91aW50LCBhcmdzKSA9PSBGRklfT0spCisgICAgICAgIEB7CisgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgY2xvc3VyZSwgc2V0dGluZyBzdHJlYW0gdG8gc3Rkb3V0ICovCisgICAgICAgICAgaWYgKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKGNsb3N1cmUsICZjaWYsIHB1dHNfYmluZGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dCwgYm91bmRfcHV0cykgPT0gRkZJX09LKQorICAgICAgICAgICAgQHsKKyAgICAgICAgICAgICAgcmMgPSBib3VuZF9wdXRzKCJIZWxsbyBXb3JsZCEiKTsKKyAgICAgICAgICAgICAgLyogcmMgbm93IGhvbGRzIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgdG8gZnB1dHMgKi8KKyAgICAgICAgICAgIEB9CisgICAgICAgIEB9CisgICAgQH0KKworICAvKiBEZWFsbG9jYXRlIGJvdGggY2xvc3VyZSwgYW5kIGJvdW5kX3B1dHMgKi8KKyAgZmZpX2Nsb3N1cmVfZnJlZShjbG9zdXJlKTsKKworICByZXR1cm4gMDsKK0B9CisKK0BlbmQgZXhhbXBsZQorCisKK0Bub2RlIE1pc3NpbmcgRmVhdHVyZXMKK0BjaGFwdGVyIE1pc3NpbmcgRmVhdHVyZXMKKworQGNvZGV7bGliZmZpfSBpcyBtaXNzaW5nIGEgZmV3IGZlYXR1cmVzLiAgV2Ugd2VsY29tZSBwYXRjaGVzIHRvIGFkZAorc3VwcG9ydCBmb3IgdGhlc2UuCisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBjYWxsaW5nIHZhcmFyZ3MgZnVuY3Rpb25zLiAgVGhpcyBtYXkgd29yayBvbgorc29tZSBwbGF0Zm9ybXMsIGRlcGVuZGluZyBvbiBob3cgdGhlIEFCSSBpcyBkZWZpbmVkLCBidXQgaXQgaXMgbm90CityZWxpYWJsZS4KKworQGl0ZW0KK1RoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIGJpdCBmaWVsZHMgaW4gc3RydWN0dXJlcy4KKworQGl0ZW0KK1RoZSBjbG9zdXJlIEFQSSBpcworCitAYyBGSVhNRTogLi4uCisKK0BpdGVtCitUaGUgYGByYXcnJyBBUEkgaXMgdW5kb2N1bWVudGVkLgorQGMgYXJndW1lbnQgcHJvbW90aW9uPworQGMgdW5pb25zPworQGMgYW55dGhpbmcgZWxzZT8KK0BlbmQgaXRlbWl6ZQorCisKK0Bub2RlIEluZGV4CitAdW5udW1iZXJlZCBJbmRleAorCitAcHJpbnRpbmRleCBjcAorCitAYnllCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvZG9jL3N0YW1wLXZ0aSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9kb2Mvc3RhbXAtdnRpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzdiYjgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvZG9jL3N0YW1wLXZ0aQpAQCAtMCwwICsxLDQgQEAKK0BzZXQgVVBEQVRFRCAyMyBBdWd1c3QgMjAxMQorQHNldCBVUERBVEVELU1PTlRIIEF1Z3VzdCAyMDExCitAc2V0IEVESVRJT04gMy4wLjEwCitAc2V0IFZFUlNJT04gMy4wLjEwCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvZG9jL3ZlcnNpb24udGV4aSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9kb2MvdmVyc2lvbi50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzdiYjgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvZG9jL3ZlcnNpb24udGV4aQpAQCAtMCwwICsxLDQgQEAKK0BzZXQgVVBEQVRFRCAyMyBBdWd1c3QgMjAxMQorQHNldCBVUERBVEVELU1PTlRIIEF1Z3VzdCAyMDExCitAc2V0IEVESVRJT04gMy4wLjEwCitAc2V0IFZFUlNJT04gMy4wLjEwCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvZmZpY29uZmlnLmguaW4gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvZmZpY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MmM1NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9mZmljb25maWcuaC5pbgpAQCAtMCwwICsxLDE5OSBAQAorLyogZmZpY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiBidWlsZGluZyB1bml2ZXJzYWwgKGludGVybmFsIGhlbHBlciBtYWNybykgKi8KKyN1bmRlZiBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKworLyogRGVmaW5lIHRvIG9uZSBvZiBgX2dldGI2NycsIGBHRVRCNjcnLCBgZ2V0YjY3JyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUAorICAgc3lzdGVtcy4gVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYGFsbG9jYS5jJyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuCisgICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSB0byAxIGlmIHVzaW5nIGBhbGxvY2EuYycuICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIHRoZSBmbGFncyBuZWVkZWQgZm9yIHRoZSAuc2VjdGlvbiAuZWhfZnJhbWUgZGlyZWN0aXZlLiAqLworI3VuZGVmIEVIX0ZSQU1FX0ZMQUdTCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IGV4dHJhIGRlYnVnZ2luZy4gKi8KKyN1bmRlZiBGRklfREVCVUcKKworLyogQ2Fubm90IHVzZSBQUk9UX0VYRUMgb24gdGhpcyB0YXJnZXQsIHNvLCB3ZSByZXZlcnQgdG8gYWx0ZXJuYXRpdmUgbWVhbnMgKi8KKyN1bmRlZiBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFCisKKy8qIENhbm5vdCB1c2UgbWFsbG9jIG9uIHRoaXMgdGFyZ2V0LCBzbywgd2UgcmV2ZXJ0IHRvIGFsdGVybmF0aXZlIG1lYW5zICovCisjdW5kZWYgRkZJX01NQVBfRVhFQ19XUklUCisKKy8qIERlZmluZSB0aGlzIGlzIHlvdSBkbyBub3Qgd2FudCBzdXBwb3J0IGZvciB0aGUgcmF3IEFQSS4gKi8KKyN1bmRlZiBGRklfTk9fUkFXX0FQSQorCisvKiBEZWZpbmUgdGhpcyBpcyB5b3UgZG8gbm90IHdhbnQgc3VwcG9ydCBmb3IgYWdncmVnYXRlIHR5cGVzLiAqLworI3VuZGVmIEZGSV9OT19TVFJVQ1RTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGBhbGxvY2EnLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4KKyAgICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgc3VwcG9ydHMgLmFzY2lpLiAqLworI3VuZGVmIEhBVkVfQVNfQVNDSUlfUFNFVURPX09QCisKKy8qIERlZmluZSBpZiB5b3VyIGFzc2VtYmxlciBzdXBwb3J0cyAuY2ZpXyogZGlyZWN0aXZlcy4gKi8KKyN1bmRlZiBIQVZFX0FTX0NGSV9QU0VVRE9fT1AKKworLyogRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIC5yZWdpc3Rlci4gKi8KKyN1bmRlZiBIQVZFX0FTX1JFR0lTVEVSX1BTRVVET19PUAorCisvKiBEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgYW5kIGxpbmtlciBzdXBwb3J0IHVuYWxpZ25lZCBQQyByZWxhdGl2ZSByZWxvY3MuCisgICAqLworI3VuZGVmIEhBVkVfQVNfU1BBUkNfVUFfUENSRUwKKworLyogRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIC5zdHJpbmcuICovCisjdW5kZWYgSEFWRV9BU19TVFJJTkdfUFNFVURPX09QCisKKy8qIERlZmluZSBpZiB5b3VyIGFzc2VtYmxlciBzdXBwb3J0cyB1bndpbmQgc2VjdGlvbiB0eXBlLiAqLworI3VuZGVmIEhBVkVfQVNfWDg2XzY0X1VOV0lORF9TRUNUSU9OX1RZUEUKKworLyogRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIFBDIHJlbGF0aXZlIHJlbG9jcy4gKi8KKyN1bmRlZiBIQVZFX0FTX1g4Nl9QQ1JFTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRExGQ05fSAorCisvKiBEZWZpbmUgaWYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKSBpcyBzdXBwb3J0ZWQuICovCisjdW5kZWYgSEFWRV9ISURERU5fVklTSUJJTElUWV9BVFRSSUJVVEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsb25nIGRvdWJsZSB0eXBlIGFuZCBpdCBpcyBiaWdnZXIgdGhhbiBhIGRvdWJsZSAqLworI3VuZGVmIEhBVkVfTE9OR19ET1VCTEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1jcHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTUVNQ1BZCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtbWFwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGlmIG1tYXAgd2l0aCBNQVBfQU5PTihZTU9VUykgd29ya3MuICovCisjdW5kZWYgSEFWRV9NTUFQX0FOT04KKworLyogRGVmaW5lIGlmIG1tYXAgb2YgL2Rldi96ZXJvIHdvcmtzLiAqLworI3VuZGVmIEhBVkVfTU1BUF9ERVZfWkVSTworCisvKiBEZWZpbmUgaWYgcmVhZC1vbmx5IG1tYXAgb2YgYSBwbGFpbiBmaWxlIHdvcmtzLiAqLworI3VuZGVmIEhBVkVfTU1BUF9GSUxFCisKKy8qIERlZmluZSBpZiAuZWhfZnJhbWUgc2VjdGlvbnMgc2hvdWxkIGJlIHJlYWQtb25seS4gKi8KKyN1bmRlZiBIQVZFX1JPX0VIX0ZSQU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tbWFuLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX01NQU5fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4KKyAgICovCisjdW5kZWYgTFRfT0JKRElSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgQyBjb21waWxlciBkb2Vzbid0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuICovCisjdW5kZWYgTk9fTUlOVVNfQ19NSU5VU19PCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI3VuZGVmIFBBQ0tBR0UKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCisKKy8qIFRoZSBzaXplIG9mIGBkb3VibGUnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX0RPVUJMRQorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZyBkb3VibGUnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX0xPTkdfRE9VQkxFCisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVudGltZS4KKwlTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisJU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisJU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24gKi8KKyN1bmRlZiBTVEFDS19ESVJFQ1RJT04KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgUHVyaWZ5IGFuZCB3YW50IHRvIHN1cHByZXNzIHNwdXJpb3VzIG1lc3NhZ2VzLgorICAgKi8KKyN1bmRlZiBVU0lOR19QVVJJRlkKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI3VuZGVmIFZFUlNJT04KKworLyogRGVmaW5lIFdPUkRTX0JJR0VORElBTiB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0CisgICBzaWduaWZpY2FudCBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsKS4gKi8KKyNpZiBkZWZpbmVkIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAorIyBpZiBkZWZpbmVkIF9fQklHX0VORElBTl9fCisjICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgIHVuZGVmIFdPUkRTX0JJR0VORElBTgorIyBlbmRpZgorI2VuZGlmCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzaXplX3QKKworCisjaWZkZWYgSEFWRV9ISURERU5fVklTSUJJTElUWV9BVFRSSUJVVEUKKyNpZmRlZiBMSUJGRklfQVNNCisjZGVmaW5lIEZGSV9ISURERU4obmFtZSkgLmhpZGRlbiBuYW1lCisjZWxzZQorI2RlZmluZSBGRklfSElEREVOIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorI2VuZGlmCisjZWxzZQorI2lmZGVmIExJQkZGSV9BU00KKyNkZWZpbmUgRkZJX0hJRERFTihuYW1lKQorI2Vsc2UKKyNkZWZpbmUgRkZJX0hJRERFTgorI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2ZmaWNvbmZpZy5odyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9mZmljb25maWcuaHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3NTA2YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9mZmljb25maWcuaHcKQEAgLTAsMCArMSw1NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KKyAgIGxpYmZmaSAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzLCAyMDA3LCAyMDA4ICBSZWQgSGF0LCBJbmMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSUNPTkZJR19ICisjZGVmaW5lIExJQkZGSUNPTkZJR19ICisKKyNkZWZpbmUgSEFWRV9BTExPQ0EgICAgICAgICAxCisjZGVmaW5lIEhBVkVfTUVNQ1BZICAgICAgICAgMQorI2RlZmluZSBIQVZFX01FTU9SWV9IICAgICAgIDEKKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAgICAgICAxCisjZGVmaW5lIEhBVkVfU1RSSU5HX0ggICAgICAgMQorI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggICAgIDEKKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAgICAxCisjZGVmaW5lIFNURENfSEVBREVSUyAgICAgICAgMQorCisjaWYgZGVmaW5lZChYODZfV0lONjQpCisjZGVmaW5lIFNJWkVPRl9ET1VCTEUgICAgICAgOAorI2RlZmluZSBTSVpFT0ZfTE9OR19ET1VCTEUgIDAKKyNlbHNlCisjZGVmaW5lIFNJWkVPRl9ET1VCTEUgICAgICAgOAorI2RlZmluZSBTSVpFT0ZfTE9OR19ET1VCTEUgIDAKKyNlbmRpZgorCisjaWZkZWYgTElCRkZJX0FTTQorI2RlZmluZSBGRklfSElEREVOKG5hbWUpCisjZWxzZQorI2RlZmluZSBGRklfSElEREVOCisjZW5kaWYKKworI2VuZGlmIC8qIExJQkZGSUNPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2luY2x1ZGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyODAyNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9pbmNsdWRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOSBAQAorIyMgUHJvY2VzcyB0aGlzIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCisKK0FVVE9NQUtFX09QVElPTlM9Zm9yZWlnbgorCitESVNUQ0xFQU5GSUxFUz1mZml0YXJnZXQuaAorRVhUUkFfRElTVD1mZmkuaC5pbiBmZmlfY29tbW9uLmgKKworaW5jbHVkZXNkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VfTkFNRUAtQFBBQ0tBR0VfVkVSU0lPTkAvaW5jbHVkZQorbm9kaXN0X2luY2x1ZGVzX0hFQURFUlMgPSBmZmkuaCBmZml0YXJnZXQuaApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2luY2x1ZGUvTWFrZWZpbGUuaW4gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvaW5jbHVkZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2QzZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2luY2x1ZGUvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0ODcgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK3N1YmRpciA9IGluY2x1ZGUKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJChzcmNkaXIpL2ZmaS5oLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9heF9jY19tYXhvcHQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2ZsYWdzX3dhcm5fYWxsLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NvbXBpbGVyX3ZlbmRvci5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jb25maWd1cmVfYXJncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9lbmFibGVfYnVpbGRkaXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfZ2NjX2FyY2hmbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2djY194ODZfY3B1aWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCAkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00ICQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9mZmljb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0gZmZpLmggZmZpdGFyZ2V0LmgKK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoaW5jbHVkZXNkaXIpIgorSEVBREVSUyA9ICQobm9kaXN0X2luY2x1ZGVzX0hFQURFUlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fTFRMREZMQUdTID0gQEFNX0xUTERGTEFHU0AKK0FNX1JVTlRFU1RGTEFHUyA9IEBBTV9SVU5URVNURkxBR1NACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0FTID0gQENDQVNACitDQ0FTREVQTU9ERSA9IEBDQ0FTREVQTU9ERUAKK0NDQVNGTEFHUyA9IEBDQ0FTRkxBR1NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRExMVE9PTCA9IEBETExUT09MQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFID0gQEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEVACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0hBVkVfTE9OR19ET1VCTEUgPSBASEFWRV9MT05HX0RPVUJMRUAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJUT09MID0gQExJQlRPT0xACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01BTklGRVNUX1RPT0wgPSBATUFOSUZFU1RfVE9PTEAKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFJURElBRyA9IEBQUlRESUFHQAorUkFOTElCID0gQFJBTkxJQkAKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitUQVJHRVQgPSBAVEFSR0VUQAorVEFSR0VURElSID0gQFRBUkdFVERJUkAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0FSID0gQGFjX2N0X0FSQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2F4X2VuYWJsZV9idWlsZGRpcl9zZWQgPSBAYXhfZW5hYmxlX2J1aWxkZGlyX3NlZEAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNfc3ltYm9sX3VuZGVyc2NvcmUgPSBAc3lzX3N5bWJvbF91bmRlcnNjb3JlQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0ID0gQHRhcmdldEAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0YXJnZXRfY3B1ID0gQHRhcmdldF9jcHVACit0YXJnZXRfb3MgPSBAdGFyZ2V0X29zQAordGFyZ2V0X3ZlbmRvciA9IEB0YXJnZXRfdmVuZG9yQAordG9vbGV4ZWNkaXIgPSBAdG9vbGV4ZWNkaXJACit0b29sZXhlY2xpYmRpciA9IEB0b29sZXhlY2xpYmRpckAKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbgorRElTVENMRUFORklMRVMgPSBmZml0YXJnZXQuaAorRVhUUkFfRElTVCA9IGZmaS5oLmluIGZmaV9jb21tb24uaAoraW5jbHVkZXNkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VfTkFNRUAtQFBBQ0tBR0VfVkVSU0lPTkAvaW5jbHVkZQorbm9kaXN0X2luY2x1ZGVzX0hFQURFUlMgPSBmZmkuaCBmZml0YXJnZXQuaAorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduIGluY2x1ZGUvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduIGluY2x1ZGUvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CitmZmkuaDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJChzcmNkaXIpL2ZmaS5oLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtbm9kaXN0X2luY2x1ZGVzSEVBREVSUzogJChub2Rpc3RfaW5jbHVkZXNfSEVBREVSUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGluY2x1ZGVzZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoaW5jbHVkZXNkaXIpIgorCUBsaXN0PSckKG5vZGlzdF9pbmNsdWRlc19IRUFERVJTKSc7IHRlc3QgLW4gIiQoaW5jbHVkZXNkaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IFwKKwlkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICBlY2hvICIgJChJTlNUQUxMX0hFQURFUikgJCRmaWxlcyAnJChERVNURElSKSQoaW5jbHVkZXNkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgIiQoREVTVERJUikkKGluY2x1ZGVzZGlyKSIgfHwgZXhpdCAkJD87IFwKKwlkb25lCisKK3VuaW5zdGFsbC1ub2Rpc3RfaW5jbHVkZXNIRUFERVJTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobm9kaXN0X2luY2x1ZGVzX0hFQURFUlMpJzsgdGVzdCAtbiAiJChpbmNsdWRlc2RpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwl0ZXN0IC1uICIkJGZpbGVzIiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoaW5jbHVkZXNkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoaW5jbHVkZXNkaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoSEVBREVSUykKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGluY2x1ZGVzZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisJLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1ub2Rpc3RfaW5jbHVkZXNIRUFERVJTCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW5vZGlzdF9pbmNsdWRlc0hFQURFUlMKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLW5vZGlzdF9pbmNsdWRlc0hFQURFUlMgXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtbm9kaXN0X2luY2x1ZGVzSEVBREVSUworCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9pbmNsdWRlL2ZmaS5oLmluIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2luY2x1ZGUvZmZpLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhMjliMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9pbmNsdWRlL2ZmaS5oLmluCkBAIC0wLDAgKzEsNDI3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgbGliZmZpIEBWRVJTSU9OQCAtIENvcHlyaWdodCAoYykgMjAxMSBBbnRob255IEdyZWVuCisgICAgICAgICAgICAgICAgICAgIC0gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMsIDIwMDcsIDIwMDggUmVkIEhhdCwgSW5jLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAgIGZpbGVzICh0aGUgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgICBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoZSBiYXNpYyBBUEkgaXMgZGVzY3JpYmVkIGluIHRoZSBSRUFETUUgZmlsZS4KKworICAgVGhlIHJhdyBBUEkgaXMgZGVzaWduZWQgdG8gYnlwYXNzIHNvbWUgb2YgdGhlIGFyZ3VtZW50IHBhY2tpbmcKKyAgIGFuZCB1bnBhY2tpbmcgb24gYXJjaGl0ZWN0dXJlcyBmb3Igd2hpY2ggaXQgY2FuIGJlIGF2b2lkZWQuCisKKyAgIFRoZSBjbG9zdXJlIEFQSSBhbGxvd3MgaW50ZXJwcmV0ZWQgZnVuY3Rpb25zIHRvIGJlIHBhY2thZ2VkIHVwCisgICBpbnNpZGUgYSBDIGZ1bmN0aW9uIHBvaW50ZXIsIHNvIHRoYXQgdGhleSBjYW4gYmUgY2FsbGVkIGFzIEMgZnVuY3Rpb25zLAorICAgd2l0aCBubyB1bmRlcnN0YW5kaW5nIG9uIHRoZSBjbGllbnQgc2lkZSB0aGF0IHRoZXkgYXJlIGludGVycHJldGVkLgorICAgSXQgY2FuIGFsc28gYmUgdXNlZCBpbiBvdGhlciBjYXNlcyBpbiB3aGljaCBpdCBpcyBuZWNlc3NhcnkgdG8gcGFja2FnZQorICAgdXAgYSB1c2VyIHNwZWNpZmllZCBwYXJhbWV0ZXIgYW5kIGEgZnVuY3Rpb24gcG9pbnRlciBhcyBhIHNpbmdsZQorICAgZnVuY3Rpb24gcG9pbnRlci4KKworICAgVGhlIGNsb3N1cmUgQVBJIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gZ2V0IGl0cyBmdW5jdGlvbmFsaXR5LAorICAgZS5nLiBmb3IgdXNlIGJ5IGdpai4gIFJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byBlbXVsYXRlIHRoZSByYXcgQVBJCisgICBpZiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybSBkb2Vzbid0IGFsbG93IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4KKworICAgTW9yZSBkZXRhaWxzIG9uIHRoZSByYXcgYW5kIGNsb3VyZSBBUEkgY2FuIGJlIGZvdW5kIGluOgorCisgICBodHRwOi8vZ2NjLmdudS5vcmcvbWwvamF2YS8xOTk5LXEzL21zZzAwMTM4Lmh0bWwKKworICAgYW5kCisKKyAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9qYXZhLzE5OTktcTMvbXNnMDAxNzQuaHRtbAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfSAorI2RlZmluZSBMSUJGRklfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFNwZWNpZnkgd2hpY2ggYXJjaGl0ZWN0dXJlIGxpYmZmaSBpcyBjb25maWd1cmVkIGZvci4gKi8KKyNpZm5kZWYgQFRBUkdFVEAKKyNkZWZpbmUgQFRBUkdFVEAKKyNlbmRpZgorCisvKiAtLS0tIFN5c3RlbSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpdGFyZ2V0Lmg+CisKKyNpZm5kZWYgTElCRkZJX0FTTQorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyhYKQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLyogTE9OR19MT05HX01BWCBpcyBub3QgYWx3YXlzIGRlZmluZWQgKG5vdCBpZiBTVFJJQ1RfQU5TSSwgZm9yIGV4YW1wbGUpLgorICAgQnV0IHdlIGNhbiBmaW5kIGl0IGVpdGhlciB1bmRlciB0aGUgY29ycmVjdCBBTlNJIG5hbWUsIG9yIHVuZGVyIEdOVQorICAgQydzIGludGVybmFsIG5hbWUuICAqLworCisjZGVmaW5lIEZGSV82NF9CSVRfTUFYIDkyMjMzNzIwMzY4NTQ3NzU4MDcKKworI2lmZGVmIExPTkdfTE9OR19NQVgKKyMgZGVmaW5lIEZGSV9MT05HX0xPTkdfTUFYIExPTkdfTE9OR19NQVgKKyNlbHNlCisjIGlmZGVmIExMT05HX01BWAorIyAgZGVmaW5lIEZGSV9MT05HX0xPTkdfTUFYIExMT05HX01BWAorIyAgaWZkZWYgX0FJWDUyIC8qIG9yIG5ld2VyIGhhcyBDOTkgTExPTkdfTUFYICovCisjICAgdW5kZWYgRkZJXzY0X0JJVF9NQVgKKyMgICBkZWZpbmUgRkZJXzY0X0JJVF9NQVggOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjICBlbmRpZiAvKiBfQUlYNTIgb3IgbmV3ZXIgKi8KKyMgZWxzZQorIyAgaWZkZWYgX19HTlVDX18KKyMgICBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKyMgIGVuZGlmCisjICBpZmRlZiBfQUlYIC8qIEFJWCA1LjEgYW5kIGVhcmxpZXIgaGF2ZSBMT05HTE9OR19NQVggKi8KKyMgICBpZm5kZWYgX19QUEM2NF9fCisjICAgIGlmIGRlZmluZWQgKF9fSUJNQ19fKSB8fCBkZWZpbmVkIChfX0lCTUNQUF9fKQorIyAgICAgZGVmaW5lIEZGSV9MT05HX0xPTkdfTUFYIExPTkdMT05HX01BWAorIyAgICBlbmRpZgorIyAgIGVuZGlmIC8qIF9fUFBDNjRfXyAqLworIyAgIHVuZGVmICBGRklfNjRfQklUX01BWAorIyAgIGRlZmluZSBGRklfNjRfQklUX01BWCA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGNsb3N1cmUgY29kZSBhc3N1bWVzIHRoYXQgdGhpcyB3b3JrcyBvbiBwb2ludGVycywgaS5lLiBhIHNpemVfdAkqLworLyogY2FuIGhvbGQgYSBwb2ludGVyLgkJCQkJCQkqLworCit0eXBlZGVmIHN0cnVjdCBfZmZpX3R5cGUKK3sKKyAgc2l6ZV90IHNpemU7CisgIHVuc2lnbmVkIHNob3J0IGFsaWdubWVudDsKKyAgdW5zaWduZWQgc2hvcnQgdHlwZTsKKyAgc3RydWN0IF9mZmlfdHlwZSAqKmVsZW1lbnRzOworfSBmZmlfdHlwZTsKKworI2lmbmRlZiBMSUJGRklfSElERV9CQVNJQ19UWVBFUworI2lmIFNDSEFSX01BWCA9PSAxMjcKKyMgZGVmaW5lIGZmaV90eXBlX3VjaGFyICAgICAgICAgICAgICAgIGZmaV90eXBlX3VpbnQ4CisjIGRlZmluZSBmZmlfdHlwZV9zY2hhciAgICAgICAgICAgICAgICBmZmlfdHlwZV9zaW50OAorI2Vsc2UKKyAjZXJyb3IgImNoYXIgc2l6ZSBub3Qgc3VwcG9ydGVkIgorI2VuZGlmCisKKyNpZiBTSFJUX01BWCA9PSAzMjc2NworIyBkZWZpbmUgZmZpX3R5cGVfdXNob3J0ICAgICAgIGZmaV90eXBlX3VpbnQxNgorIyBkZWZpbmUgZmZpX3R5cGVfc3Nob3J0ICAgICAgIGZmaV90eXBlX3NpbnQxNgorI2VsaWYgU0hSVF9NQVggPT0gMjE0NzQ4MzY0NworIyBkZWZpbmUgZmZpX3R5cGVfdXNob3J0ICAgICAgIGZmaV90eXBlX3VpbnQzMgorIyBkZWZpbmUgZmZpX3R5cGVfc3Nob3J0ICAgICAgIGZmaV90eXBlX3NpbnQzMgorI2Vsc2UKKyAjZXJyb3IgInNob3J0IHNpemUgbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorCisjaWYgSU5UX01BWCA9PSAzMjc2NworIyBkZWZpbmUgZmZpX3R5cGVfdWludCAgICAgICAgIGZmaV90eXBlX3VpbnQxNgorIyBkZWZpbmUgZmZpX3R5cGVfc2ludCAgICAgICAgIGZmaV90eXBlX3NpbnQxNgorI2VsaWYgSU5UX01BWCA9PSAyMTQ3NDgzNjQ3CisjIGRlZmluZSBmZmlfdHlwZV91aW50ICAgICAgICAgZmZpX3R5cGVfdWludDMyCisjIGRlZmluZSBmZmlfdHlwZV9zaW50ICAgICAgICAgZmZpX3R5cGVfc2ludDMyCisjZWxpZiBJTlRfTUFYID09IDkyMjMzNzIwMzY4NTQ3NzU4MDcKKyMgZGVmaW5lIGZmaV90eXBlX3VpbnQgICAgICAgICBmZmlfdHlwZV91aW50NjQKKyMgZGVmaW5lIGZmaV90eXBlX3NpbnQgICAgICAgICBmZmlfdHlwZV9zaW50NjQKKyNlbHNlCisgI2Vycm9yICJpbnQgc2l6ZSBub3Qgc3VwcG9ydGVkIgorI2VuZGlmCisKKyNpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3CisjIGlmIEZGSV9MT05HX0xPTkdfTUFYICE9IEZGSV82NF9CSVRfTUFYCisgI2Vycm9yICJubyA2NC1iaXQgZGF0YSB0eXBlIHN1cHBvcnRlZCIKKyMgZW5kaWYKKyNlbGlmIExPTkdfTUFYICE9IEZGSV82NF9CSVRfTUFYCisgI2Vycm9yICJsb25nIHNpemUgbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorCisjaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NworIyBkZWZpbmUgZmZpX3R5cGVfdWxvbmcgICAgICAgIGZmaV90eXBlX3VpbnQzMgorIyBkZWZpbmUgZmZpX3R5cGVfc2xvbmcgICAgICAgIGZmaV90eXBlX3NpbnQzMgorI2VsaWYgTE9OR19NQVggPT0gRkZJXzY0X0JJVF9NQVgKKyMgZGVmaW5lIGZmaV90eXBlX3Vsb25nICAgICAgICBmZmlfdHlwZV91aW50NjQKKyMgZGVmaW5lIGZmaV90eXBlX3Nsb25nICAgICAgICBmZmlfdHlwZV9zaW50NjQKKyNlbHNlCisgI2Vycm9yICJsb25nIHNpemUgbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0eXBlcy5jICovCitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdm9pZDsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV91aW50ODsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50ODsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV91aW50MTY7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDE2OworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQzMjsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50MzI7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDY0OworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQ2NDsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9mbG9hdDsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9kb3VibGU7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfcG9pbnRlcjsKKworI2lmIEBIQVZFX0xPTkdfRE9VQkxFQAorZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2xvbmdkb3VibGU7CisjZWxzZQorI2RlZmluZSBmZmlfdHlwZV9sb25nZG91YmxlIGZmaV90eXBlX2RvdWJsZQorI2VuZGlmCisjZW5kaWYgLyogTElCRkZJX0hJREVfQkFTSUNfVFlQRVMgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgRkZJX09LID0gMCwKKyAgRkZJX0JBRF9UWVBFREVGLAorICBGRklfQkFEX0FCSQorfSBmZmlfc3RhdHVzOworCit0eXBlZGVmIHVuc2lnbmVkIEZGSV9UWVBFOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGZmaV9hYmkgYWJpOworICB1bnNpZ25lZCBuYXJnczsKKyAgZmZpX3R5cGUgKiphcmdfdHlwZXM7CisgIGZmaV90eXBlICpydHlwZTsKKyAgdW5zaWduZWQgYnl0ZXM7CisgIHVuc2lnbmVkIGZsYWdzOworI2lmZGVmIEZGSV9FWFRSQV9DSUZfRklFTERTCisgIEZGSV9FWFRSQV9DSUZfRklFTERTOworI2VuZGlmCit9IGZmaV9jaWY7CisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIHRoZSByYXcgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRkZJX1NJWkVPRl9BUkcKKyMgaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NworIyAgZGVmaW5lIEZGSV9TSVpFT0ZfQVJHICAgICAgICA0CisjIGVsaWYgTE9OR19NQVggPT0gRkZJXzY0X0JJVF9NQVgKKyMgIGRlZmluZSBGRklfU0laRU9GX0FSRyAgICAgICAgOAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkZJX1NJWkVPRl9KQVZBX1JBVworIyAgZGVmaW5lIEZGSV9TSVpFT0ZfSkFWQV9SQVcgRkZJX1NJWkVPRl9BUkcKKyNlbmRpZgorCit0eXBlZGVmIHVuaW9uIHsKKyAgZmZpX3NhcmcgIHNpbnQ7CisgIGZmaV9hcmcgICB1aW50OworICBmbG9hdAkgICAgZmx0OworICBjaGFyICAgICAgZGF0YVtGRklfU0laRU9GX0FSR107CisgIHZvaWQqICAgICBwdHI7Cit9IGZmaV9yYXc7CisKKyNpZiBGRklfU0laRU9GX0pBVkFfUkFXID09IDQgJiYgRkZJX1NJWkVPRl9BUkcgPT0gOAorLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgbWlwczY0L24zMiBBQkkgKGFuZCBwZXJoYXBzIG90aGVycykgd2hlcmUKKyAgIHNpemVvZih2b2lkICopIGlzIDQgYW5kIEZGSV9TSVpFT0ZfQVJHIGlzIDguICAqLwordHlwZWRlZiB1bmlvbiB7CisgIHNpZ25lZCBpbnQJc2ludDsKKyAgdW5zaWduZWQgaW50CXVpbnQ7CisgIGZsb2F0CQlmbHQ7CisgIGNoYXIJCWRhdGFbRkZJX1NJWkVPRl9KQVZBX1JBV107CisgIHZvaWQqCQlwdHI7Cit9IGZmaV9qYXZhX3JhdzsKKyNlbHNlCit0eXBlZGVmIGZmaV9yYXcgZmZpX2phdmFfcmF3OworI2VuZGlmCisKKwordm9pZCBmZmlfcmF3X2NhbGwgKGZmaV9jaWYgKmNpZiwKKwkJICAgdm9pZCAoKmZuKSh2b2lkKSwKKwkJICAgdm9pZCAqcnZhbHVlLAorCQkgICBmZmlfcmF3ICphdmFsdWUpOworCit2b2lkIGZmaV9wdHJhcnJheV90b19yYXcgKGZmaV9jaWYgKmNpZiwgdm9pZCAqKmFyZ3MsIGZmaV9yYXcgKnJhdyk7Cit2b2lkIGZmaV9yYXdfdG9fcHRyYXJyYXkgKGZmaV9jaWYgKmNpZiwgZmZpX3JhdyAqcmF3LCB2b2lkICoqYXJncyk7CitzaXplX3QgZmZpX3Jhd19zaXplIChmZmlfY2lmICpjaWYpOworCisvKiBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUgcmF3IEFQSSwgZXhjZXB0IGl0IHVzZXMgSmF2YSBwYXJhbWV0ZXIJKi8KKy8qIHBhY2tpbmcsIGV2ZW4gb24gNjQtYml0IG1hY2hpbmVzLiAgSS5lLiBvbiA2NC1iaXQgbWFjaGluZXMJCSovCisvKiBsb25ncyBhbmQgZG91YmxlcyBhcmUgZm9sbG93ZWQgYnkgYW4gZW1wdHkgNjQtYml0IHdvcmQuCQkqLworCit2b2lkIGZmaV9qYXZhX3Jhd19jYWxsIChmZmlfY2lmICpjaWYsCisJCQl2b2lkICgqZm4pKHZvaWQpLAorCQkJdm9pZCAqcnZhbHVlLAorCQkJZmZpX2phdmFfcmF3ICphdmFsdWUpOworCit2b2lkIGZmaV9qYXZhX3B0cmFycmF5X3RvX3JhdyAoZmZpX2NpZiAqY2lmLCB2b2lkICoqYXJncywgZmZpX2phdmFfcmF3ICpyYXcpOwordm9pZCBmZmlfamF2YV9yYXdfdG9fcHRyYXJyYXkgKGZmaV9jaWYgKmNpZiwgZmZpX2phdmFfcmF3ICpyYXcsIHZvaWQgKiphcmdzKTsKK3NpemVfdCBmZmlfamF2YV9yYXdfc2l6ZSAoZmZpX2NpZiAqY2lmKTsKKworLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgY2xvc3VyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEZGSV9DTE9TVVJFUworCisjaWZkZWYgX01TQ19WRVIKK19fZGVjbHNwZWMoYWxpZ24oOCkpCisjZW5kaWYKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciB0cmFtcFtGRklfVFJBTVBPTElORV9TSVpFXTsKKyAgZmZpX2NpZiAgICpjaWY7CisgIHZvaWQgICAgICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopOworICB2b2lkICAgICAgKnVzZXJfZGF0YTsKKyNpZmRlZiBfX0dOVUNfXworfSBmZmlfY2xvc3VyZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworI2Vsc2UKK30gZmZpX2Nsb3N1cmU7CisjIGlmZGVmIF9fc2dpCisjICBwcmFnbWEgcGFjayAwCisjIGVuZGlmCisjZW5kaWYKKwordm9pZCAqZmZpX2Nsb3N1cmVfYWxsb2MgKHNpemVfdCBzaXplLCB2b2lkICoqY29kZSk7Cit2b2lkIGZmaV9jbG9zdXJlX2ZyZWUgKHZvaWQgKik7CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmUgKGZmaV9jbG9zdXJlKiwKKwkJICBmZmlfY2lmICosCisJCSAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKKwkJICB2b2lkICp1c2VyX2RhdGEpOworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqLAorCQkgICAgICBmZmlfY2lmICosCisJCSAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLHZvaWQqKix2b2lkKiksCisJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJICAgICAgdm9pZCpjb2RlbG9jKTsKKworI2lmZGVmIF9fc2dpCisjIHByYWdtYSBwYWNrIDgKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIHRyYW1wW0ZGSV9UUkFNUE9MSU5FX1NJWkVdOworCisgIGZmaV9jaWYgICAqY2lmOworCisjaWYgIUZGSV9OQVRJVkVfUkFXX0FQSQorCisgIC8qIGlmIHRoaXMgaXMgZW5hYmxlZCwgdGhlbiBhIHJhdyBjbG9zdXJlIGhhcyB0aGUgc2FtZSBsYXlvdXQgCisgICAgIGFzIGEgcmVndWxhciBjbG9zdXJlLiAgV2UgdXNlIHRoaXMgdG8gaW5zdGFsbCBhbiBpbnRlcm1lZGlhdGUgCisgICAgIGhhbmRsZXIgdG8gZG8gdGhlIHRyYW5zYWx0aW9uLCB2b2lkKiogLT4gZmZpX3JhdyouICovCisKKyAgdm9pZCAgICAgKCp0cmFuc2xhdGVfYXJncykoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKTsKKyAgdm9pZCAgICAgICp0aGlzX2Nsb3N1cmU7CisKKyNlbmRpZgorCisgIHZvaWQgICAgICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfcmF3Kix2b2lkKik7CisgIHZvaWQgICAgICAqdXNlcl9kYXRhOworCit9IGZmaV9yYXdfY2xvc3VyZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIHRyYW1wW0ZGSV9UUkFNUE9MSU5FX1NJWkVdOworCisgIGZmaV9jaWYgICAqY2lmOworCisjaWYgIUZGSV9OQVRJVkVfUkFXX0FQSQorCisgIC8qIGlmIHRoaXMgaXMgZW5hYmxlZCwgdGhlbiBhIHJhdyBjbG9zdXJlIGhhcyB0aGUgc2FtZSBsYXlvdXQgCisgICAgIGFzIGEgcmVndWxhciBjbG9zdXJlLiAgV2UgdXNlIHRoaXMgdG8gaW5zdGFsbCBhbiBpbnRlcm1lZGlhdGUgCisgICAgIGhhbmRsZXIgdG8gZG8gdGhlIHRyYW5zYWx0aW9uLCB2b2lkKiogLT4gZmZpX3JhdyouICovCisKKyAgdm9pZCAgICAgKCp0cmFuc2xhdGVfYXJncykoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKTsKKyAgdm9pZCAgICAgICp0aGlzX2Nsb3N1cmU7CisKKyNlbmRpZgorCisgIHZvaWQgICAgICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfamF2YV9yYXcqLHZvaWQqKTsKKyAgdm9pZCAgICAgICp1c2VyX2RhdGE7CisKK30gZmZpX2phdmFfcmF3X2Nsb3N1cmU7CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX3Jhd19jbG9zdXJlIChmZmlfcmF3X2Nsb3N1cmUqLAorCQkgICAgICBmZmlfY2lmICpjaWYsCisJCSAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9yYXcqLHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworZmZpX3N0YXR1cworZmZpX3ByZXBfcmF3X2Nsb3N1cmVfbG9jIChmZmlfcmF3X2Nsb3N1cmUqLAorCQkJICBmZmlfY2lmICpjaWYsCisJCQkgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9yYXcqLHZvaWQqKSwKKwkJCSAgdm9pZCAqdXNlcl9kYXRhLAorCQkJICB2b2lkICpjb2RlbG9jKTsKKworZmZpX3N0YXR1cworZmZpX3ByZXBfamF2YV9yYXdfY2xvc3VyZSAoZmZpX2phdmFfcmF3X2Nsb3N1cmUqLAorCQkgICAgICAgICAgIGZmaV9jaWYgKmNpZiwKKwkJICAgICAgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfamF2YV9yYXcqLHZvaWQqKSwKKwkJICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9qYXZhX3Jhd19jbG9zdXJlX2xvYyAoZmZpX2phdmFfcmF3X2Nsb3N1cmUqLAorCQkJICAgICAgIGZmaV9jaWYgKmNpZiwKKwkJCSAgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfamF2YV9yYXcqLHZvaWQqKSwKKwkJCSAgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCQkgICAgICAgdm9pZCAqY29kZWxvYyk7CisKKyNlbmRpZiAvKiBGRklfQ0xPU1VSRVMgKi8KKworLyogLS0tLSBQdWJsaWMgaW50ZXJmYWNlIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWYoZmZpX2NpZiAqY2lmLAorCQkJZmZpX2FiaSBhYmksCisJCQl1bnNpZ25lZCBpbnQgbmFyZ3MsCisJCQlmZmlfdHlwZSAqcnR5cGUsCisJCQlmZmlfdHlwZSAqKmF0eXBlcyk7CisKK3ZvaWQgZmZpX2NhbGwoZmZpX2NpZiAqY2lmLAorCSAgICAgIHZvaWQgKCpmbikodm9pZCksCisJICAgICAgdm9pZCAqcnZhbHVlLAorCSAgICAgIHZvaWQgKiphdmFsdWUpOworCisvKiBVc2VmdWwgZm9yIGVsaW1pbmF0aW5nIGNvbXBpbGVyIHdhcm5pbmdzICovCisjZGVmaW5lIEZGSV9GTihmKSAoKHZvaWQgKCopKHZvaWQpKWYpCisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgc2hhcmVkIHdpdGggYXNzZW1ibHkgY29kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNlbmRpZgorCisvKiBJZiB0aGVzZSBjaGFuZ2UsIHVwZGF0ZSBzcmMvbWlwcy9mZml0YXJnZXQuaC4gKi8KKyNkZWZpbmUgRkZJX1RZUEVfVk9JRCAgICAgICAwICAgIAorI2RlZmluZSBGRklfVFlQRV9JTlQgICAgICAgIDEKKyNkZWZpbmUgRkZJX1RZUEVfRkxPQVQgICAgICAyICAgIAorI2RlZmluZSBGRklfVFlQRV9ET1VCTEUgICAgIDMKKyNpZiBASEFWRV9MT05HX0RPVUJMRUAKKyNkZWZpbmUgRkZJX1RZUEVfTE9OR0RPVUJMRSA0CisjZWxzZQorI2RlZmluZSBGRklfVFlQRV9MT05HRE9VQkxFIEZGSV9UWVBFX0RPVUJMRQorI2VuZGlmCisjZGVmaW5lIEZGSV9UWVBFX1VJTlQ4ICAgICAgNSAgIAorI2RlZmluZSBGRklfVFlQRV9TSU5UOCAgICAgIDYKKyNkZWZpbmUgRkZJX1RZUEVfVUlOVDE2ICAgICA3IAorI2RlZmluZSBGRklfVFlQRV9TSU5UMTYgICAgIDgKKyNkZWZpbmUgRkZJX1RZUEVfVUlOVDMyICAgICA5CisjZGVmaW5lIEZGSV9UWVBFX1NJTlQzMiAgICAgMTAKKyNkZWZpbmUgRkZJX1RZUEVfVUlOVDY0ICAgICAxMQorI2RlZmluZSBGRklfVFlQRV9TSU5UNjQgICAgIDEyCisjZGVmaW5lIEZGSV9UWVBFX1NUUlVDVCAgICAgMTMKKyNkZWZpbmUgRkZJX1RZUEVfUE9JTlRFUiAgICAxNAorCisvKiBUaGlzIHNob3VsZCBhbHdheXMgcmVmZXIgdG8gdGhlIGxhc3QgdHlwZSBjb2RlIChmb3Igc2FuaXR5IGNoZWNrcykgKi8KKyNkZWZpbmUgRkZJX1RZUEVfTEFTVCAgICAgICBGRklfVFlQRV9QT0lOVEVSCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2luY2x1ZGUvZmZpLmgudmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvaW5jbHVkZS9mZmkuaC52YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE5NTRjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2luY2x1ZGUvZmZpLmgudmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCisgICBsaWJmZmkgMy4wLjEwIC0gQ29weXJpZ2h0IChjKSAyMDExIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICAgICAgLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMywgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICAgZmlsZXMgKHRoZSBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwKKyAgIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICAgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAgIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhlIGJhc2ljIEFQSSBpcyBkZXNjcmliZWQgaW4gdGhlIFJFQURNRSBmaWxlLgorCisgICBUaGUgcmF3IEFQSSBpcyBkZXNpZ25lZCB0byBieXBhc3Mgc29tZSBvZiB0aGUgYXJndW1lbnQgcGFja2luZworICAgYW5kIHVucGFja2luZyBvbiBhcmNoaXRlY3R1cmVzIGZvciB3aGljaCBpdCBjYW4gYmUgYXZvaWRlZC4KKworICAgVGhlIGNsb3N1cmUgQVBJIGFsbG93cyBpbnRlcnByZXRlZCBmdW5jdGlvbnMgdG8gYmUgcGFja2FnZWQgdXAKKyAgIGluc2lkZSBhIEMgZnVuY3Rpb24gcG9pbnRlciwgc28gdGhhdCB0aGV5IGNhbiBiZSBjYWxsZWQgYXMgQyBmdW5jdGlvbnMsCisgICB3aXRoIG5vIHVuZGVyc3RhbmRpbmcgb24gdGhlIGNsaWVudCBzaWRlIHRoYXQgdGhleSBhcmUgaW50ZXJwcmV0ZWQuCisgICBJdCBjYW4gYWxzbyBiZSB1c2VkIGluIG90aGVyIGNhc2VzIGluIHdoaWNoIGl0IGlzIG5lY2Vzc2FyeSB0byBwYWNrYWdlCisgICB1cCBhIHVzZXIgc3BlY2lmaWVkIHBhcmFtZXRlciBhbmQgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGEgc2luZ2xlCisgICBmdW5jdGlvbiBwb2ludGVyLgorCisgICBUaGUgY2xvc3VyZSBBUEkgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byBnZXQgaXRzIGZ1bmN0aW9uYWxpdHksCisgICBlLmcuIGZvciB1c2UgYnkgZ2lqLiAgUm91dGluZXMgYXJlIHByb3ZpZGVkIHRvIGVtdWxhdGUgdGhlIHJhdyBBUEkKKyAgIGlmIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtIGRvZXNuJ3QgYWxsb3cgZmFzdGVyIGltcGxlbWVudGF0aW9uLgorCisgICBNb3JlIGRldGFpbHMgb24gdGhlIHJhdyBhbmQgY2xvdXJlIEFQSSBjYW4gYmUgZm91bmQgaW46CisKKyAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9qYXZhLzE5OTktcTMvbXNnMDAxMzguaHRtbAorCisgICBhbmQKKworICAgaHR0cDovL2djYy5nbnUub3JnL21sL2phdmEvMTk5OS1xMy9tc2cwMDE3NC5odG1sCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9ICisjZGVmaW5lIExJQkZGSV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogU3BlY2lmeSB3aGljaCBhcmNoaXRlY3R1cmUgbGliZmZpIGlzIGNvbmZpZ3VyZWQgZm9yLiAqLworI2lmbmRlZiBYODZfV0lOMzIKKyNkZWZpbmUgWDg2X1dJTjMyCisjZW5kaWYKKworLyogLS0tLSBTeXN0ZW0gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGZmaXRhcmdldC5oPgorCisjaWZuZGVmIExJQkZGSV9BU00KKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIF9fYXR0cmlidXRlX18oWCkKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8qIExPTkdfTE9OR19NQVggaXMgbm90IGFsd2F5cyBkZWZpbmVkIChub3QgaWYgU1RSSUNUX0FOU0ksIGZvciBleGFtcGxlKS4KKyAgIEJ1dCB3ZSBjYW4gZmluZCBpdCBlaXRoZXIgdW5kZXIgdGhlIGNvcnJlY3QgQU5TSSBuYW1lLCBvciB1bmRlciBHTlUKKyAgIEMncyBpbnRlcm5hbCBuYW1lLiAgKi8KKworI2RlZmluZSBGRklfNjRfQklUX01BWCA5MjIzMzcyMDM2ODU0Nzc1ODA3CisKKyNpZmRlZiBMT05HX0xPTkdfTUFYCisjIGRlZmluZSBGRklfTE9OR19MT05HX01BWCBMT05HX0xPTkdfTUFYCisjZWxzZQorIyBpZmRlZiBMTE9OR19NQVgKKyMgIGRlZmluZSBGRklfTE9OR19MT05HX01BWCBMTE9OR19NQVgKKyMgIGlmZGVmIF9BSVg1MiAvKiBvciBuZXdlciBoYXMgQzk5IExMT05HX01BWCAqLworIyAgIHVuZGVmIEZGSV82NF9CSVRfTUFYCisjICAgZGVmaW5lIEZGSV82NF9CSVRfTUFYIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorIyAgZW5kaWYgLyogX0FJWDUyIG9yIG5ld2VyICovCisjIGVsc2UKKyMgIGlmZGVmIF9fR05VQ19fCisjICAgZGVmaW5lIEZGSV9MT05HX0xPTkdfTUFYIF9fTE9OR19MT05HX01BWF9fCisjICBlbmRpZgorIyAgaWZkZWYgX0FJWCAvKiBBSVggNS4xIGFuZCBlYXJsaWVyIGhhdmUgTE9OR0xPTkdfTUFYICovCisjICAgaWZuZGVmIF9fUFBDNjRfXworIyAgICBpZiBkZWZpbmVkIChfX0lCTUNfXykgfHwgZGVmaW5lZCAoX19JQk1DUFBfXykKKyMgICAgIGRlZmluZSBGRklfTE9OR19MT05HX01BWCBMT05HTE9OR19NQVgKKyMgICAgZW5kaWYKKyMgICBlbmRpZiAvKiBfX1BQQzY0X18gKi8KKyMgICB1bmRlZiAgRkZJXzY0X0JJVF9NQVgKKyMgICBkZWZpbmUgRkZJXzY0X0JJVF9NQVggOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBjbG9zdXJlIGNvZGUgYXNzdW1lcyB0aGF0IHRoaXMgd29ya3Mgb24gcG9pbnRlcnMsIGkuZS4gYSBzaXplX3QJKi8KKy8qIGNhbiBob2xkIGEgcG9pbnRlci4JCQkJCQkJKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2ZmaV90eXBlCit7CisgIHNpemVfdCBzaXplOworICB1bnNpZ25lZCBzaG9ydCBhbGlnbm1lbnQ7CisgIHVuc2lnbmVkIHNob3J0IHR5cGU7CisgIHN0cnVjdCBfZmZpX3R5cGUgKiplbGVtZW50czsKK30gZmZpX3R5cGU7CisKKyNpZm5kZWYgTElCRkZJX0hJREVfQkFTSUNfVFlQRVMKKyNpZiBTQ0hBUl9NQVggPT0gMTI3CisjIGRlZmluZSBmZmlfdHlwZV91Y2hhciAgICAgICAgICAgICAgICBmZmlfdHlwZV91aW50OAorIyBkZWZpbmUgZmZpX3R5cGVfc2NoYXIgICAgICAgICAgICAgICAgZmZpX3R5cGVfc2ludDgKKyNlbHNlCisgI2Vycm9yICJjaGFyIHNpemUgbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorCisjaWYgU0hSVF9NQVggPT0gMzI3NjcKKyMgZGVmaW5lIGZmaV90eXBlX3VzaG9ydCAgICAgICBmZmlfdHlwZV91aW50MTYKKyMgZGVmaW5lIGZmaV90eXBlX3NzaG9ydCAgICAgICBmZmlfdHlwZV9zaW50MTYKKyNlbGlmIFNIUlRfTUFYID09IDIxNDc0ODM2NDcKKyMgZGVmaW5lIGZmaV90eXBlX3VzaG9ydCAgICAgICBmZmlfdHlwZV91aW50MzIKKyMgZGVmaW5lIGZmaV90eXBlX3NzaG9ydCAgICAgICBmZmlfdHlwZV9zaW50MzIKKyNlbHNlCisgI2Vycm9yICJzaG9ydCBzaXplIG5vdCBzdXBwb3J0ZWQiCisjZW5kaWYKKworI2lmIElOVF9NQVggPT0gMzI3NjcKKyMgZGVmaW5lIGZmaV90eXBlX3VpbnQgICAgICAgICBmZmlfdHlwZV91aW50MTYKKyMgZGVmaW5lIGZmaV90eXBlX3NpbnQgICAgICAgICBmZmlfdHlwZV9zaW50MTYKKyNlbGlmIElOVF9NQVggPT0gMjE0NzQ4MzY0NworIyBkZWZpbmUgZmZpX3R5cGVfdWludCAgICAgICAgIGZmaV90eXBlX3VpbnQzMgorIyBkZWZpbmUgZmZpX3R5cGVfc2ludCAgICAgICAgIGZmaV90eXBlX3NpbnQzMgorI2VsaWYgSU5UX01BWCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisjIGRlZmluZSBmZmlfdHlwZV91aW50ICAgICAgICAgZmZpX3R5cGVfdWludDY0CisjIGRlZmluZSBmZmlfdHlwZV9zaW50ICAgICAgICAgZmZpX3R5cGVfc2ludDY0CisjZWxzZQorICNlcnJvciAiaW50IHNpemUgbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorCisjaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NworIyBpZiBGRklfTE9OR19MT05HX01BWCAhPSBGRklfNjRfQklUX01BWAorICNlcnJvciAibm8gNjQtYml0IGRhdGEgdHlwZSBzdXBwb3J0ZWQiCisjIGVuZGlmCisjZWxpZiBMT05HX01BWCAhPSBGRklfNjRfQklUX01BWAorICNlcnJvciAibG9uZyBzaXplIG5vdCBzdXBwb3J0ZWQiCisjZW5kaWYKKworI2lmIExPTkdfTUFYID09IDIxNDc0ODM2NDcKKyMgZGVmaW5lIGZmaV90eXBlX3Vsb25nICAgICAgICBmZmlfdHlwZV91aW50MzIKKyMgZGVmaW5lIGZmaV90eXBlX3Nsb25nICAgICAgICBmZmlfdHlwZV9zaW50MzIKKyNlbGlmIExPTkdfTUFYID09IEZGSV82NF9CSVRfTUFYCisjIGRlZmluZSBmZmlfdHlwZV91bG9uZyAgICAgICAgZmZpX3R5cGVfdWludDY0CisjIGRlZmluZSBmZmlfdHlwZV9zbG9uZyAgICAgICAgZmZpX3R5cGVfc2ludDY0CisjZWxzZQorICNlcnJvciAibG9uZyBzaXplIG5vdCBzdXBwb3J0ZWQiCisjZW5kaWYKKworLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gdHlwZXMuYyAqLworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3ZvaWQ7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDg7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDg7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDE2OworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQxNjsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV91aW50MzI7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDMyOworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQ2NDsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50NjQ7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfZmxvYXQ7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfZG91YmxlOworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3BvaW50ZXI7CisKKyNpZiAwCitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKyNlbHNlCisjZGVmaW5lIGZmaV90eXBlX2xvbmdkb3VibGUgZmZpX3R5cGVfZG91YmxlCisjZW5kaWYKKyNlbmRpZiAvKiBMSUJGRklfSElERV9CQVNJQ19UWVBFUyAqLworCit0eXBlZGVmIGVudW0geworICBGRklfT0sgPSAwLAorICBGRklfQkFEX1RZUEVERUYsCisgIEZGSV9CQURfQUJJCit9IGZmaV9zdGF0dXM7CisKK3R5cGVkZWYgdW5zaWduZWQgRkZJX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZmZpX2FiaSBhYmk7CisgIHVuc2lnbmVkIG5hcmdzOworICBmZmlfdHlwZSAqKmFyZ190eXBlczsKKyAgZmZpX3R5cGUgKnJ0eXBlOworICB1bnNpZ25lZCBieXRlczsKKyAgdW5zaWduZWQgZmxhZ3M7CisjaWZkZWYgRkZJX0VYVFJBX0NJRl9GSUVMRFMKKyAgRkZJX0VYVFJBX0NJRl9GSUVMRFM7CisjZW5kaWYKK30gZmZpX2NpZjsKKworLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgdGhlIHJhdyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBGRklfU0laRU9GX0FSRworIyBpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3CisjICBkZWZpbmUgRkZJX1NJWkVPRl9BUkcgICAgICAgIDQKKyMgZWxpZiBMT05HX01BWCA9PSBGRklfNjRfQklUX01BWAorIyAgZGVmaW5lIEZGSV9TSVpFT0ZfQVJHICAgICAgICA4CisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGRklfU0laRU9GX0pBVkFfUkFXCisjICBkZWZpbmUgRkZJX1NJWkVPRl9KQVZBX1JBVyBGRklfU0laRU9GX0FSRworI2VuZGlmCisKK3R5cGVkZWYgdW5pb24geworICBmZmlfc2FyZyAgc2ludDsKKyAgZmZpX2FyZyAgIHVpbnQ7CisgIGZsb2F0CSAgICBmbHQ7CisgIGNoYXIgICAgICBkYXRhW0ZGSV9TSVpFT0ZfQVJHXTsKKyAgdm9pZCogICAgIHB0cjsKK30gZmZpX3JhdzsKKworI2lmIEZGSV9TSVpFT0ZfSkFWQV9SQVcgPT0gNCAmJiBGRklfU0laRU9GX0FSRyA9PSA4CisvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGZvciBtaXBzNjQvbjMyIEFCSSAoYW5kIHBlcmhhcHMgb3RoZXJzKSB3aGVyZQorICAgc2l6ZW9mKHZvaWQgKikgaXMgNCBhbmQgRkZJX1NJWkVPRl9BUkcgaXMgOC4gICovCit0eXBlZGVmIHVuaW9uIHsKKyAgc2lnbmVkIGludAlzaW50OworICB1bnNpZ25lZCBpbnQJdWludDsKKyAgZmxvYXQJCWZsdDsKKyAgY2hhcgkJZGF0YVtGRklfU0laRU9GX0pBVkFfUkFXXTsKKyAgdm9pZCoJCXB0cjsKK30gZmZpX2phdmFfcmF3OworI2Vsc2UKK3R5cGVkZWYgZmZpX3JhdyBmZmlfamF2YV9yYXc7CisjZW5kaWYKKworCit2b2lkIGZmaV9yYXdfY2FsbCAoZmZpX2NpZiAqY2lmLAorCQkgICB2b2lkICgqZm4pKHZvaWQpLAorCQkgICB2b2lkICpydmFsdWUsCisJCSAgIGZmaV9yYXcgKmF2YWx1ZSk7CisKK3ZvaWQgZmZpX3B0cmFycmF5X3RvX3JhdyAoZmZpX2NpZiAqY2lmLCB2b2lkICoqYXJncywgZmZpX3JhdyAqcmF3KTsKK3ZvaWQgZmZpX3Jhd190b19wdHJhcnJheSAoZmZpX2NpZiAqY2lmLCBmZmlfcmF3ICpyYXcsIHZvaWQgKiphcmdzKTsKK3NpemVfdCBmZmlfcmF3X3NpemUgKGZmaV9jaWYgKmNpZik7CisKKy8qIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZSByYXcgQVBJLCBleGNlcHQgaXQgdXNlcyBKYXZhIHBhcmFtZXRlcgkqLworLyogcGFja2luZywgZXZlbiBvbiA2NC1iaXQgbWFjaGluZXMuICBJLmUuIG9uIDY0LWJpdCBtYWNoaW5lcwkJKi8KKy8qIGxvbmdzIGFuZCBkb3VibGVzIGFyZSBmb2xsb3dlZCBieSBhbiBlbXB0eSA2NC1iaXQgd29yZC4JCSovCisKK3ZvaWQgZmZpX2phdmFfcmF3X2NhbGwgKGZmaV9jaWYgKmNpZiwKKwkJCXZvaWQgKCpmbikodm9pZCksCisJCQl2b2lkICpydmFsdWUsCisJCQlmZmlfamF2YV9yYXcgKmF2YWx1ZSk7CisKK3ZvaWQgZmZpX2phdmFfcHRyYXJyYXlfdG9fcmF3IChmZmlfY2lmICpjaWYsIHZvaWQgKiphcmdzLCBmZmlfamF2YV9yYXcgKnJhdyk7Cit2b2lkIGZmaV9qYXZhX3Jhd190b19wdHJhcnJheSAoZmZpX2NpZiAqY2lmLCBmZmlfamF2YV9yYXcgKnJhdywgdm9pZCAqKmFyZ3MpOworc2l6ZV90IGZmaV9qYXZhX3Jhd19zaXplIChmZmlfY2lmICpjaWYpOworCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgRkZJX0NMT1NVUkVTCisKKyNpZmRlZiBfTVNDX1ZFUgorX19kZWNsc3BlYyhhbGlnbig4KSkKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIHRyYW1wW0ZGSV9UUkFNUE9MSU5FX1NJWkVdOworICBmZmlfY2lmICAgKmNpZjsKKyAgdm9pZCAgICAgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLHZvaWQqKix2b2lkKik7CisgIHZvaWQgICAgICAqdXNlcl9kYXRhOworI2lmZGVmIF9fR05VQ19fCit9IGZmaV9jbG9zdXJlIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKDgpKSk7CisjZWxzZQorfSBmZmlfY2xvc3VyZTsKKyMgaWZkZWYgX19zZ2kKKyMgIHByYWdtYSBwYWNrIDAKKyMgZW5kaWYKKyNlbmRpZgorCit2b2lkICpmZmlfY2xvc3VyZV9hbGxvYyAoc2l6ZV90IHNpemUsIHZvaWQgKipjb2RlKTsKK3ZvaWQgZmZpX2Nsb3N1cmVfZnJlZSAodm9pZCAqKTsKKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2xvc3VyZSAoZmZpX2Nsb3N1cmUqLAorCQkgIGZmaV9jaWYgKiwKKwkJICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopLAorCQkgIHZvaWQgKnVzZXJfZGF0YSk7CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmVfbG9jIChmZmlfY2xvc3VyZSosCisJCSAgICAgIGZmaV9jaWYgKiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkgICAgICB2b2lkKmNvZGVsb2MpOworCisjaWZkZWYgX19zZ2kKKyMgcHJhZ21hIHBhY2sgOAorI2VuZGlmCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgdHJhbXBbRkZJX1RSQU1QT0xJTkVfU0laRV07CisKKyAgZmZpX2NpZiAgICpjaWY7CisKKyNpZiAhRkZJX05BVElWRV9SQVdfQVBJCisKKyAgLyogaWYgdGhpcyBpcyBlbmFibGVkLCB0aGVuIGEgcmF3IGNsb3N1cmUgaGFzIHRoZSBzYW1lIGxheW91dCAKKyAgICAgYXMgYSByZWd1bGFyIGNsb3N1cmUuICBXZSB1c2UgdGhpcyB0byBpbnN0YWxsIGFuIGludGVybWVkaWF0ZSAKKyAgICAgaGFuZGxlciB0byBkbyB0aGUgdHJhbnNhbHRpb24sIHZvaWQqKiAtPiBmZmlfcmF3Ki4gKi8KKworICB2b2lkICAgICAoKnRyYW5zbGF0ZV9hcmdzKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopOworICB2b2lkICAgICAgKnRoaXNfY2xvc3VyZTsKKworI2VuZGlmCisKKyAgdm9pZCAgICAgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9yYXcqLHZvaWQqKTsKKyAgdm9pZCAgICAgICp1c2VyX2RhdGE7CisKK30gZmZpX3Jhd19jbG9zdXJlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgdHJhbXBbRkZJX1RSQU1QT0xJTkVfU0laRV07CisKKyAgZmZpX2NpZiAgICpjaWY7CisKKyNpZiAhRkZJX05BVElWRV9SQVdfQVBJCisKKyAgLyogaWYgdGhpcyBpcyBlbmFibGVkLCB0aGVuIGEgcmF3IGNsb3N1cmUgaGFzIHRoZSBzYW1lIGxheW91dCAKKyAgICAgYXMgYSByZWd1bGFyIGNsb3N1cmUuICBXZSB1c2UgdGhpcyB0byBpbnN0YWxsIGFuIGludGVybWVkaWF0ZSAKKyAgICAgaGFuZGxlciB0byBkbyB0aGUgdHJhbnNhbHRpb24sIHZvaWQqKiAtPiBmZmlfcmF3Ki4gKi8KKworICB2b2lkICAgICAoKnRyYW5zbGF0ZV9hcmdzKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopOworICB2b2lkICAgICAgKnRoaXNfY2xvc3VyZTsKKworI2VuZGlmCisKKyAgdm9pZCAgICAgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9qYXZhX3Jhdyosdm9pZCopOworICB2b2lkICAgICAgKnVzZXJfZGF0YTsKKworfSBmZmlfamF2YV9yYXdfY2xvc3VyZTsKKworZmZpX3N0YXR1cworZmZpX3ByZXBfcmF3X2Nsb3N1cmUgKGZmaV9yYXdfY2xvc3VyZSosCisJCSAgICAgIGZmaV9jaWYgKmNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosZmZpX3Jhdyosdm9pZCopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEpOworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9yYXdfY2xvc3VyZV9sb2MgKGZmaV9yYXdfY2xvc3VyZSosCisJCQkgIGZmaV9jaWYgKmNpZiwKKwkJCSAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosZmZpX3Jhdyosdm9pZCopLAorCQkJICB2b2lkICp1c2VyX2RhdGEsCisJCQkgIHZvaWQgKmNvZGVsb2MpOworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9qYXZhX3Jhd19jbG9zdXJlIChmZmlfamF2YV9yYXdfY2xvc3VyZSosCisJCSAgICAgICAgICAgZmZpX2NpZiAqY2lmLAorCQkgICAgICAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9qYXZhX3Jhdyosdm9pZCopLAorCQkgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2phdmFfcmF3X2Nsb3N1cmVfbG9jIChmZmlfamF2YV9yYXdfY2xvc3VyZSosCisJCQkgICAgICAgZmZpX2NpZiAqY2lmLAorCQkJICAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9qYXZhX3Jhdyosdm9pZCopLAorCQkJICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCSAgICAgICB2b2lkICpjb2RlbG9jKTsKKworI2VuZGlmIC8qIEZGSV9DTE9TVVJFUyAqLworCisvKiAtLS0tIFB1YmxpYyBpbnRlcmZhY2UgZGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZihmZmlfY2lmICpjaWYsCisJCQlmZmlfYWJpIGFiaSwKKwkJCXVuc2lnbmVkIGludCBuYXJncywKKwkJCWZmaV90eXBlICpydHlwZSwKKwkJCWZmaV90eXBlICoqYXR5cGVzKTsKKwordm9pZCBmZmlfY2FsbChmZmlfY2lmICpjaWYsCisJICAgICAgdm9pZCAoKmZuKSh2b2lkKSwKKwkgICAgICB2b2lkICpydmFsdWUsCisJICAgICAgdm9pZCAqKmF2YWx1ZSk7CisKKy8qIFVzZWZ1bCBmb3IgZWxpbWluYXRpbmcgY29tcGlsZXIgd2FybmluZ3MgKi8KKyNkZWZpbmUgRkZJX0ZOKGYpICgodm9pZCAoKikodm9pZCkpZikKKworLyogLS0tLSBEZWZpbml0aW9ucyBzaGFyZWQgd2l0aCBhc3NlbWJseSBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2VuZGlmCisKKy8qIElmIHRoZXNlIGNoYW5nZSwgdXBkYXRlIHNyYy9taXBzL2ZmaXRhcmdldC5oLiAqLworI2RlZmluZSBGRklfVFlQRV9WT0lEICAgICAgIDAgICAgCisjZGVmaW5lIEZGSV9UWVBFX0lOVCAgICAgICAgMQorI2RlZmluZSBGRklfVFlQRV9GTE9BVCAgICAgIDIgICAgCisjZGVmaW5lIEZGSV9UWVBFX0RPVUJMRSAgICAgMworI2lmIDAKKyNkZWZpbmUgRkZJX1RZUEVfTE9OR0RPVUJMRSA0CisjZWxzZQorI2RlZmluZSBGRklfVFlQRV9MT05HRE9VQkxFIEZGSV9UWVBFX0RPVUJMRQorI2VuZGlmCisjZGVmaW5lIEZGSV9UWVBFX1VJTlQ4ICAgICAgNSAgIAorI2RlZmluZSBGRklfVFlQRV9TSU5UOCAgICAgIDYKKyNkZWZpbmUgRkZJX1RZUEVfVUlOVDE2ICAgICA3IAorI2RlZmluZSBGRklfVFlQRV9TSU5UMTYgICAgIDgKKyNkZWZpbmUgRkZJX1RZUEVfVUlOVDMyICAgICA5CisjZGVmaW5lIEZGSV9UWVBFX1NJTlQzMiAgICAgMTAKKyNkZWZpbmUgRkZJX1RZUEVfVUlOVDY0ICAgICAxMQorI2RlZmluZSBGRklfVFlQRV9TSU5UNjQgICAgIDEyCisjZGVmaW5lIEZGSV9UWVBFX1NUUlVDVCAgICAgMTMKKyNkZWZpbmUgRkZJX1RZUEVfUE9JTlRFUiAgICAxNAorCisvKiBUaGlzIHNob3VsZCBhbHdheXMgcmVmZXIgdG8gdGhlIGxhc3QgdHlwZSBjb2RlIChmb3Igc2FuaXR5IGNoZWNrcykgKi8KKyNkZWZpbmUgRkZJX1RZUEVfTEFTVCAgICAgICBGRklfVFlQRV9QT0lOVEVSCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9pbmNsdWRlL2ZmaS5oLnZjNjQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvaW5jbHVkZS9mZmkuaC52YzY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODljOWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvaW5jbHVkZS9mZmkuaC52YzY0CkBAIC0wLDAgKzEsNDI3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgbGliZmZpIDMuMC4xMCAtIENvcHlyaWdodCAoYykgMjAxMSBBbnRob255IEdyZWVuCisgICAgICAgICAgICAgICAgICAgIC0gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMsIDIwMDcsIDIwMDggUmVkIEhhdCwgSW5jLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAgIGZpbGVzICh0aGUgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgICBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAgIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoZSBiYXNpYyBBUEkgaXMgZGVzY3JpYmVkIGluIHRoZSBSRUFETUUgZmlsZS4KKworICAgVGhlIHJhdyBBUEkgaXMgZGVzaWduZWQgdG8gYnlwYXNzIHNvbWUgb2YgdGhlIGFyZ3VtZW50IHBhY2tpbmcKKyAgIGFuZCB1bnBhY2tpbmcgb24gYXJjaGl0ZWN0dXJlcyBmb3Igd2hpY2ggaXQgY2FuIGJlIGF2b2lkZWQuCisKKyAgIFRoZSBjbG9zdXJlIEFQSSBhbGxvd3MgaW50ZXJwcmV0ZWQgZnVuY3Rpb25zIHRvIGJlIHBhY2thZ2VkIHVwCisgICBpbnNpZGUgYSBDIGZ1bmN0aW9uIHBvaW50ZXIsIHNvIHRoYXQgdGhleSBjYW4gYmUgY2FsbGVkIGFzIEMgZnVuY3Rpb25zLAorICAgd2l0aCBubyB1bmRlcnN0YW5kaW5nIG9uIHRoZSBjbGllbnQgc2lkZSB0aGF0IHRoZXkgYXJlIGludGVycHJldGVkLgorICAgSXQgY2FuIGFsc28gYmUgdXNlZCBpbiBvdGhlciBjYXNlcyBpbiB3aGljaCBpdCBpcyBuZWNlc3NhcnkgdG8gcGFja2FnZQorICAgdXAgYSB1c2VyIHNwZWNpZmllZCBwYXJhbWV0ZXIgYW5kIGEgZnVuY3Rpb24gcG9pbnRlciBhcyBhIHNpbmdsZQorICAgZnVuY3Rpb24gcG9pbnRlci4KKworICAgVGhlIGNsb3N1cmUgQVBJIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gZ2V0IGl0cyBmdW5jdGlvbmFsaXR5LAorICAgZS5nLiBmb3IgdXNlIGJ5IGdpai4gIFJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byBlbXVsYXRlIHRoZSByYXcgQVBJCisgICBpZiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybSBkb2Vzbid0IGFsbG93IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4KKworICAgTW9yZSBkZXRhaWxzIG9uIHRoZSByYXcgYW5kIGNsb3VyZSBBUEkgY2FuIGJlIGZvdW5kIGluOgorCisgICBodHRwOi8vZ2NjLmdudS5vcmcvbWwvamF2YS8xOTk5LXEzL21zZzAwMTM4Lmh0bWwKKworICAgYW5kCisKKyAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9qYXZhLzE5OTktcTMvbXNnMDAxNzQuaHRtbAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfSAorI2RlZmluZSBMSUJGRklfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFNwZWNpZnkgd2hpY2ggYXJjaGl0ZWN0dXJlIGxpYmZmaSBpcyBjb25maWd1cmVkIGZvci4gKi8KKyNpZm5kZWYgWDg2X1dJTjY0CisjZGVmaW5lIFg4Nl9XSU42NAorI2VuZGlmCisKKy8qIC0tLS0gU3lzdGVtIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZml0YXJnZXQuaD4KKworI2lmbmRlZiBMSUJGRklfQVNNCisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBfX2F0dHJpYnV0ZV9fKFgpCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBMT05HX0xPTkdfTUFYIGlzIG5vdCBhbHdheXMgZGVmaW5lZCAobm90IGlmIFNUUklDVF9BTlNJLCBmb3IgZXhhbXBsZSkuCisgICBCdXQgd2UgY2FuIGZpbmQgaXQgZWl0aGVyIHVuZGVyIHRoZSBjb3JyZWN0IEFOU0kgbmFtZSwgb3IgdW5kZXIgR05VCisgICBDJ3MgaW50ZXJuYWwgbmFtZS4gICovCisKKyNkZWZpbmUgRkZJXzY0X0JJVF9NQVggOTIyMzM3MjAzNjg1NDc3NTgwNworCisjaWZkZWYgTE9OR19MT05HX01BWAorIyBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggTE9OR19MT05HX01BWAorI2Vsc2UKKyMgaWZkZWYgTExPTkdfTUFYCisjICBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggTExPTkdfTUFYCisjICBpZmRlZiBfQUlYNTIgLyogb3IgbmV3ZXIgaGFzIEM5OSBMTE9OR19NQVggKi8KKyMgICB1bmRlZiBGRklfNjRfQklUX01BWAorIyAgIGRlZmluZSBGRklfNjRfQklUX01BWCA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKyMgIGVuZGlmIC8qIF9BSVg1MiBvciBuZXdlciAqLworIyBlbHNlCisjICBpZmRlZiBfX0dOVUNfXworIyAgIGRlZmluZSBGRklfTE9OR19MT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXworIyAgZW5kaWYKKyMgIGlmZGVmIF9BSVggLyogQUlYIDUuMSBhbmQgZWFybGllciBoYXZlIExPTkdMT05HX01BWCAqLworIyAgIGlmbmRlZiBfX1BQQzY0X18KKyMgICAgaWYgZGVmaW5lZCAoX19JQk1DX18pIHx8IGRlZmluZWQgKF9fSUJNQ1BQX18pCisjICAgICBkZWZpbmUgRkZJX0xPTkdfTE9OR19NQVggTE9OR0xPTkdfTUFYCisjICAgIGVuZGlmCisjICAgZW5kaWYgLyogX19QUEM2NF9fICovCisjICAgdW5kZWYgIEZGSV82NF9CSVRfTUFYCisjICAgZGVmaW5lIEZGSV82NF9CSVRfTUFYIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgY2xvc3VyZSBjb2RlIGFzc3VtZXMgdGhhdCB0aGlzIHdvcmtzIG9uIHBvaW50ZXJzLCBpLmUuIGEgc2l6ZV90CSovCisvKiBjYW4gaG9sZCBhIHBvaW50ZXIuCQkJCQkJCSovCisKK3R5cGVkZWYgc3RydWN0IF9mZmlfdHlwZQoreworICBzaXplX3Qgc2l6ZTsKKyAgdW5zaWduZWQgc2hvcnQgYWxpZ25tZW50OworICB1bnNpZ25lZCBzaG9ydCB0eXBlOworICBzdHJ1Y3QgX2ZmaV90eXBlICoqZWxlbWVudHM7Cit9IGZmaV90eXBlOworCisjaWZuZGVmIExJQkZGSV9ISURFX0JBU0lDX1RZUEVTCisjaWYgU0NIQVJfTUFYID09IDEyNworIyBkZWZpbmUgZmZpX3R5cGVfdWNoYXIgICAgICAgICAgICAgICAgZmZpX3R5cGVfdWludDgKKyMgZGVmaW5lIGZmaV90eXBlX3NjaGFyICAgICAgICAgICAgICAgIGZmaV90eXBlX3NpbnQ4CisjZWxzZQorICNlcnJvciAiY2hhciBzaXplIG5vdCBzdXBwb3J0ZWQiCisjZW5kaWYKKworI2lmIFNIUlRfTUFYID09IDMyNzY3CisjIGRlZmluZSBmZmlfdHlwZV91c2hvcnQgICAgICAgZmZpX3R5cGVfdWludDE2CisjIGRlZmluZSBmZmlfdHlwZV9zc2hvcnQgICAgICAgZmZpX3R5cGVfc2ludDE2CisjZWxpZiBTSFJUX01BWCA9PSAyMTQ3NDgzNjQ3CisjIGRlZmluZSBmZmlfdHlwZV91c2hvcnQgICAgICAgZmZpX3R5cGVfdWludDMyCisjIGRlZmluZSBmZmlfdHlwZV9zc2hvcnQgICAgICAgZmZpX3R5cGVfc2ludDMyCisjZWxzZQorICNlcnJvciAic2hvcnQgc2l6ZSBub3Qgc3VwcG9ydGVkIgorI2VuZGlmCisKKyNpZiBJTlRfTUFYID09IDMyNzY3CisjIGRlZmluZSBmZmlfdHlwZV91aW50ICAgICAgICAgZmZpX3R5cGVfdWludDE2CisjIGRlZmluZSBmZmlfdHlwZV9zaW50ICAgICAgICAgZmZpX3R5cGVfc2ludDE2CisjZWxpZiBJTlRfTUFYID09IDIxNDc0ODM2NDcKKyMgZGVmaW5lIGZmaV90eXBlX3VpbnQgICAgICAgICBmZmlfdHlwZV91aW50MzIKKyMgZGVmaW5lIGZmaV90eXBlX3NpbnQgICAgICAgICBmZmlfdHlwZV9zaW50MzIKKyNlbGlmIElOVF9NQVggPT0gOTIyMzM3MjAzNjg1NDc3NTgwNworIyBkZWZpbmUgZmZpX3R5cGVfdWludCAgICAgICAgIGZmaV90eXBlX3VpbnQ2NAorIyBkZWZpbmUgZmZpX3R5cGVfc2ludCAgICAgICAgIGZmaV90eXBlX3NpbnQ2NAorI2Vsc2UKKyAjZXJyb3IgImludCBzaXplIG5vdCBzdXBwb3J0ZWQiCisjZW5kaWYKKworI2lmIExPTkdfTUFYID09IDIxNDc0ODM2NDcKKyMgaWYgRkZJX0xPTkdfTE9OR19NQVggIT0gRkZJXzY0X0JJVF9NQVgKKyAjZXJyb3IgIm5vIDY0LWJpdCBkYXRhIHR5cGUgc3VwcG9ydGVkIgorIyBlbmRpZgorI2VsaWYgTE9OR19NQVggIT0gRkZJXzY0X0JJVF9NQVgKKyAjZXJyb3IgImxvbmcgc2l6ZSBub3Qgc3VwcG9ydGVkIgorI2VuZGlmCisKKyNpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3CisjIGRlZmluZSBmZmlfdHlwZV91bG9uZyAgICAgICAgZmZpX3R5cGVfdWludDMyCisjIGRlZmluZSBmZmlfdHlwZV9zbG9uZyAgICAgICAgZmZpX3R5cGVfc2ludDMyCisjZWxpZiBMT05HX01BWCA9PSBGRklfNjRfQklUX01BWAorIyBkZWZpbmUgZmZpX3R5cGVfdWxvbmcgICAgICAgIGZmaV90eXBlX3VpbnQ2NAorIyBkZWZpbmUgZmZpX3R5cGVfc2xvbmcgICAgICAgIGZmaV90eXBlX3NpbnQ2NAorI2Vsc2UKKyAjZXJyb3IgImxvbmcgc2l6ZSBub3Qgc3VwcG9ydGVkIgorI2VuZGlmCisKKy8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIHR5cGVzLmMgKi8KK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV92b2lkOworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQ4OworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQ4OworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQxNjsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50MTY7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDMyOworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQzMjsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV91aW50NjQ7CitleHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDY0OworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2Zsb2F0OworZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2RvdWJsZTsKK2V4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyOworCisjaWYgMAorZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2xvbmdkb3VibGU7CisjZWxzZQorI2RlZmluZSBmZmlfdHlwZV9sb25nZG91YmxlIGZmaV90eXBlX2RvdWJsZQorI2VuZGlmCisjZW5kaWYgLyogTElCRkZJX0hJREVfQkFTSUNfVFlQRVMgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgRkZJX09LID0gMCwKKyAgRkZJX0JBRF9UWVBFREVGLAorICBGRklfQkFEX0FCSQorfSBmZmlfc3RhdHVzOworCit0eXBlZGVmIHVuc2lnbmVkIEZGSV9UWVBFOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGZmaV9hYmkgYWJpOworICB1bnNpZ25lZCBuYXJnczsKKyAgZmZpX3R5cGUgKiphcmdfdHlwZXM7CisgIGZmaV90eXBlICpydHlwZTsKKyAgdW5zaWduZWQgYnl0ZXM7CisgIHVuc2lnbmVkIGZsYWdzOworI2lmZGVmIEZGSV9FWFRSQV9DSUZfRklFTERTCisgIEZGSV9FWFRSQV9DSUZfRklFTERTOworI2VuZGlmCit9IGZmaV9jaWY7CisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIHRoZSByYXcgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRkZJX1NJWkVPRl9BUkcKKyMgaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NworIyAgZGVmaW5lIEZGSV9TSVpFT0ZfQVJHICAgICAgICA0CisjIGVsaWYgTE9OR19NQVggPT0gRkZJXzY0X0JJVF9NQVgKKyMgIGRlZmluZSBGRklfU0laRU9GX0FSRyAgICAgICAgOAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkZJX1NJWkVPRl9KQVZBX1JBVworIyAgZGVmaW5lIEZGSV9TSVpFT0ZfSkFWQV9SQVcgRkZJX1NJWkVPRl9BUkcKKyNlbmRpZgorCit0eXBlZGVmIHVuaW9uIHsKKyAgZmZpX3NhcmcgIHNpbnQ7CisgIGZmaV9hcmcgICB1aW50OworICBmbG9hdAkgICAgZmx0OworICBjaGFyICAgICAgZGF0YVtGRklfU0laRU9GX0FSR107CisgIHZvaWQqICAgICBwdHI7Cit9IGZmaV9yYXc7CisKKyNpZiBGRklfU0laRU9GX0pBVkFfUkFXID09IDQgJiYgRkZJX1NJWkVPRl9BUkcgPT0gOAorLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgbWlwczY0L24zMiBBQkkgKGFuZCBwZXJoYXBzIG90aGVycykgd2hlcmUKKyAgIHNpemVvZih2b2lkICopIGlzIDQgYW5kIEZGSV9TSVpFT0ZfQVJHIGlzIDguICAqLwordHlwZWRlZiB1bmlvbiB7CisgIHNpZ25lZCBpbnQJc2ludDsKKyAgdW5zaWduZWQgaW50CXVpbnQ7CisgIGZsb2F0CQlmbHQ7CisgIGNoYXIJCWRhdGFbRkZJX1NJWkVPRl9KQVZBX1JBV107CisgIHZvaWQqCQlwdHI7Cit9IGZmaV9qYXZhX3JhdzsKKyNlbHNlCit0eXBlZGVmIGZmaV9yYXcgZmZpX2phdmFfcmF3OworI2VuZGlmCisKKwordm9pZCBmZmlfcmF3X2NhbGwgKGZmaV9jaWYgKmNpZiwKKwkJICAgdm9pZCAoKmZuKSh2b2lkKSwKKwkJICAgdm9pZCAqcnZhbHVlLAorCQkgICBmZmlfcmF3ICphdmFsdWUpOworCit2b2lkIGZmaV9wdHJhcnJheV90b19yYXcgKGZmaV9jaWYgKmNpZiwgdm9pZCAqKmFyZ3MsIGZmaV9yYXcgKnJhdyk7Cit2b2lkIGZmaV9yYXdfdG9fcHRyYXJyYXkgKGZmaV9jaWYgKmNpZiwgZmZpX3JhdyAqcmF3LCB2b2lkICoqYXJncyk7CitzaXplX3QgZmZpX3Jhd19zaXplIChmZmlfY2lmICpjaWYpOworCisvKiBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUgcmF3IEFQSSwgZXhjZXB0IGl0IHVzZXMgSmF2YSBwYXJhbWV0ZXIJKi8KKy8qIHBhY2tpbmcsIGV2ZW4gb24gNjQtYml0IG1hY2hpbmVzLiAgSS5lLiBvbiA2NC1iaXQgbWFjaGluZXMJCSovCisvKiBsb25ncyBhbmQgZG91YmxlcyBhcmUgZm9sbG93ZWQgYnkgYW4gZW1wdHkgNjQtYml0IHdvcmQuCQkqLworCit2b2lkIGZmaV9qYXZhX3Jhd19jYWxsIChmZmlfY2lmICpjaWYsCisJCQl2b2lkICgqZm4pKHZvaWQpLAorCQkJdm9pZCAqcnZhbHVlLAorCQkJZmZpX2phdmFfcmF3ICphdmFsdWUpOworCit2b2lkIGZmaV9qYXZhX3B0cmFycmF5X3RvX3JhdyAoZmZpX2NpZiAqY2lmLCB2b2lkICoqYXJncywgZmZpX2phdmFfcmF3ICpyYXcpOwordm9pZCBmZmlfamF2YV9yYXdfdG9fcHRyYXJyYXkgKGZmaV9jaWYgKmNpZiwgZmZpX2phdmFfcmF3ICpyYXcsIHZvaWQgKiphcmdzKTsKK3NpemVfdCBmZmlfamF2YV9yYXdfc2l6ZSAoZmZpX2NpZiAqY2lmKTsKKworLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgY2xvc3VyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEZGSV9DTE9TVVJFUworCisjaWZkZWYgX01TQ19WRVIKK19fZGVjbHNwZWMoYWxpZ24oOCkpCisjZW5kaWYKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciB0cmFtcFtGRklfVFJBTVBPTElORV9TSVpFXTsKKyAgZmZpX2NpZiAgICpjaWY7CisgIHZvaWQgICAgICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopOworICB2b2lkICAgICAgKnVzZXJfZGF0YTsKKyNpZmRlZiBfX0dOVUNfXworfSBmZmlfY2xvc3VyZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkICg4KSkpOworI2Vsc2UKK30gZmZpX2Nsb3N1cmU7CisjIGlmZGVmIF9fc2dpCisjICBwcmFnbWEgcGFjayAwCisjIGVuZGlmCisjZW5kaWYKKwordm9pZCAqZmZpX2Nsb3N1cmVfYWxsb2MgKHNpemVfdCBzaXplLCB2b2lkICoqY29kZSk7Cit2b2lkIGZmaV9jbG9zdXJlX2ZyZWUgKHZvaWQgKik7CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmUgKGZmaV9jbG9zdXJlKiwKKwkJICBmZmlfY2lmICosCisJCSAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKKwkJICB2b2lkICp1c2VyX2RhdGEpOworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqLAorCQkgICAgICBmZmlfY2lmICosCisJCSAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLHZvaWQqKix2b2lkKiksCisJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJICAgICAgdm9pZCpjb2RlbG9jKTsKKworI2lmZGVmIF9fc2dpCisjIHByYWdtYSBwYWNrIDgKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIHRyYW1wW0ZGSV9UUkFNUE9MSU5FX1NJWkVdOworCisgIGZmaV9jaWYgICAqY2lmOworCisjaWYgIUZGSV9OQVRJVkVfUkFXX0FQSQorCisgIC8qIGlmIHRoaXMgaXMgZW5hYmxlZCwgdGhlbiBhIHJhdyBjbG9zdXJlIGhhcyB0aGUgc2FtZSBsYXlvdXQgCisgICAgIGFzIGEgcmVndWxhciBjbG9zdXJlLiAgV2UgdXNlIHRoaXMgdG8gaW5zdGFsbCBhbiBpbnRlcm1lZGlhdGUgCisgICAgIGhhbmRsZXIgdG8gZG8gdGhlIHRyYW5zYWx0aW9uLCB2b2lkKiogLT4gZmZpX3JhdyouICovCisKKyAgdm9pZCAgICAgKCp0cmFuc2xhdGVfYXJncykoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKTsKKyAgdm9pZCAgICAgICp0aGlzX2Nsb3N1cmU7CisKKyNlbmRpZgorCisgIHZvaWQgICAgICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfcmF3Kix2b2lkKik7CisgIHZvaWQgICAgICAqdXNlcl9kYXRhOworCit9IGZmaV9yYXdfY2xvc3VyZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIHRyYW1wW0ZGSV9UUkFNUE9MSU5FX1NJWkVdOworCisgIGZmaV9jaWYgICAqY2lmOworCisjaWYgIUZGSV9OQVRJVkVfUkFXX0FQSQorCisgIC8qIGlmIHRoaXMgaXMgZW5hYmxlZCwgdGhlbiBhIHJhdyBjbG9zdXJlIGhhcyB0aGUgc2FtZSBsYXlvdXQgCisgICAgIGFzIGEgcmVndWxhciBjbG9zdXJlLiAgV2UgdXNlIHRoaXMgdG8gaW5zdGFsbCBhbiBpbnRlcm1lZGlhdGUgCisgICAgIGhhbmRsZXIgdG8gZG8gdGhlIHRyYW5zYWx0aW9uLCB2b2lkKiogLT4gZmZpX3JhdyouICovCisKKyAgdm9pZCAgICAgKCp0cmFuc2xhdGVfYXJncykoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKTsKKyAgdm9pZCAgICAgICp0aGlzX2Nsb3N1cmU7CisKKyNlbmRpZgorCisgIHZvaWQgICAgICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfamF2YV9yYXcqLHZvaWQqKTsKKyAgdm9pZCAgICAgICp1c2VyX2RhdGE7CisKK30gZmZpX2phdmFfcmF3X2Nsb3N1cmU7CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX3Jhd19jbG9zdXJlIChmZmlfcmF3X2Nsb3N1cmUqLAorCQkgICAgICBmZmlfY2lmICpjaWYsCisJCSAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9yYXcqLHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworZmZpX3N0YXR1cworZmZpX3ByZXBfcmF3X2Nsb3N1cmVfbG9jIChmZmlfcmF3X2Nsb3N1cmUqLAorCQkJICBmZmlfY2lmICpjaWYsCisJCQkgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLGZmaV9yYXcqLHZvaWQqKSwKKwkJCSAgdm9pZCAqdXNlcl9kYXRhLAorCQkJICB2b2lkICpjb2RlbG9jKTsKKworZmZpX3N0YXR1cworZmZpX3ByZXBfamF2YV9yYXdfY2xvc3VyZSAoZmZpX2phdmFfcmF3X2Nsb3N1cmUqLAorCQkgICAgICAgICAgIGZmaV9jaWYgKmNpZiwKKwkJICAgICAgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfamF2YV9yYXcqLHZvaWQqKSwKKwkJICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9qYXZhX3Jhd19jbG9zdXJlX2xvYyAoZmZpX2phdmFfcmF3X2Nsb3N1cmUqLAorCQkJICAgICAgIGZmaV9jaWYgKmNpZiwKKwkJCSAgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfamF2YV9yYXcqLHZvaWQqKSwKKwkJCSAgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCQkgICAgICAgdm9pZCAqY29kZWxvYyk7CisKKyNlbmRpZiAvKiBGRklfQ0xPU1VSRVMgKi8KKworLyogLS0tLSBQdWJsaWMgaW50ZXJmYWNlIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWYoZmZpX2NpZiAqY2lmLAorCQkJZmZpX2FiaSBhYmksCisJCQl1bnNpZ25lZCBpbnQgbmFyZ3MsCisJCQlmZmlfdHlwZSAqcnR5cGUsCisJCQlmZmlfdHlwZSAqKmF0eXBlcyk7CisKK3ZvaWQgZmZpX2NhbGwoZmZpX2NpZiAqY2lmLAorCSAgICAgIHZvaWQgKCpmbikodm9pZCksCisJICAgICAgdm9pZCAqcnZhbHVlLAorCSAgICAgIHZvaWQgKiphdmFsdWUpOworCisvKiBVc2VmdWwgZm9yIGVsaW1pbmF0aW5nIGNvbXBpbGVyIHdhcm5pbmdzICovCisjZGVmaW5lIEZGSV9GTihmKSAoKHZvaWQgKCopKHZvaWQpKWYpCisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgc2hhcmVkIHdpdGggYXNzZW1ibHkgY29kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNlbmRpZgorCisvKiBJZiB0aGVzZSBjaGFuZ2UsIHVwZGF0ZSBzcmMvbWlwcy9mZml0YXJnZXQuaC4gKi8KKyNkZWZpbmUgRkZJX1RZUEVfVk9JRCAgICAgICAwICAgIAorI2RlZmluZSBGRklfVFlQRV9JTlQgICAgICAgIDEKKyNkZWZpbmUgRkZJX1RZUEVfRkxPQVQgICAgICAyICAgIAorI2RlZmluZSBGRklfVFlQRV9ET1VCTEUgICAgIDMKKyNpZiAwCisjZGVmaW5lIEZGSV9UWVBFX0xPTkdET1VCTEUgNAorI2Vsc2UKKyNkZWZpbmUgRkZJX1RZUEVfTE9OR0RPVUJMRSBGRklfVFlQRV9ET1VCTEUKKyNlbmRpZgorI2RlZmluZSBGRklfVFlQRV9VSU5UOCAgICAgIDUgICAKKyNkZWZpbmUgRkZJX1RZUEVfU0lOVDggICAgICA2CisjZGVmaW5lIEZGSV9UWVBFX1VJTlQxNiAgICAgNyAKKyNkZWZpbmUgRkZJX1RZUEVfU0lOVDE2ICAgICA4CisjZGVmaW5lIEZGSV9UWVBFX1VJTlQzMiAgICAgOQorI2RlZmluZSBGRklfVFlQRV9TSU5UMzIgICAgIDEwCisjZGVmaW5lIEZGSV9UWVBFX1VJTlQ2NCAgICAgMTEKKyNkZWZpbmUgRkZJX1RZUEVfU0lOVDY0ICAgICAxMgorI2RlZmluZSBGRklfVFlQRV9TVFJVQ1QgICAgIDEzCisjZGVmaW5lIEZGSV9UWVBFX1BPSU5URVIgICAgMTQKKworLyogVGhpcyBzaG91bGQgYWx3YXlzIHJlZmVyIHRvIHRoZSBsYXN0IHR5cGUgY29kZSAoZm9yIHNhbml0eSBjaGVja3MpICovCisjZGVmaW5lIEZGSV9UWVBFX0xBU1QgICAgICAgRkZJX1RZUEVfUE9JTlRFUgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvaW5jbHVkZS9mZmlfY29tbW9uLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvaW5jbHVkZS9mZmlfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1Mzc2MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9pbmNsdWRlL2ZmaV9jb21tb24uaApAQCAtMCwwICsxLDEyNiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaV9jb21tb24uaCAtIENvcHlyaWdodCAoQykgMjAxMSAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYworICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2ICBSZWQgSGF0LCBJbmMuCisgICAgICAgICAgICAgICAgICAKKyAgIENvbW1vbiBpbnRlcm5hbCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zLiBPbmx5IG5lY2Vzc2FyeSBmb3IgYnVpbGRpbmcKKyAgIGxpYmZmaS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgRkZJX0NPTU1PTl9ICisjZGVmaW5lIEZGSV9DT01NT05fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKworLyogRG8gbm90IG1vdmUgdGhpcy4gU29tZSB2ZXJzaW9ucyBvZiBBSVggYXJlIHZlcnkgcGlja3kgYWJvdXQgd2hlcmUKKyAgIHRoaXMgaXMgcG9zaXRpb25lZC4gKi8KKyNpZmRlZiBfX0dOVUNfXworLyogbWluZ3c2NCBkZWZpbmVzIHRoaXMgYWxyZWFkeSBpbiBtYWxsb2MuaC4gKi8KKyNpZm5kZWYgYWxsb2NhCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2VuZGlmCisjIGRlZmluZSBNQVlCRV9VTlVTRUQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZWxzZQorIyBkZWZpbmUgTUFZQkVfVU5VU0VECisjIGlmIEhBVkVfQUxMT0NBX0gKKyMgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyBlbHNlCisjICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgIGVsc2UKKyMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjICAgIGVsc2UKK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBtZW1jcHkuICovCisjaWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyMgaWZuZGVmIEhBVkVfTUVNQ1BZCisjICBkZWZpbmUgbWVtY3B5KGQsIHMsIG4pIGJjb3B5ICgocyksIChkKSwgKG4pKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZGSV9ERUJVRykKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpZmRlZiBGRklfREVCVUcKK3ZvaWQgZmZpX2Fzc2VydChjaGFyICpleHByLCBjaGFyICpmaWxlLCBpbnQgbGluZSk7Cit2b2lkIGZmaV9zdG9wX2hlcmUodm9pZCk7Cit2b2lkIGZmaV90eXBlX3Rlc3QoZmZpX3R5cGUgKmEsIGNoYXIgKmZpbGUsIGludCBsaW5lKTsKKworI2RlZmluZSBGRklfQVNTRVJUKHgpICgoeCkgPyAodm9pZCkwIDogZmZpX2Fzc2VydCgjeCwgX19GSUxFX18sX19MSU5FX18pKQorI2RlZmluZSBGRklfQVNTRVJUX0FUKHgsIGYsIGwpICgoeCkgPyAwIDogZmZpX2Fzc2VydCgjeCwgKGYpLCAobCkpKQorI2RlZmluZSBGRklfQVNTRVJUX1ZBTElEX1RZUEUoeCkgZmZpX3R5cGVfdGVzdCAoeCwgX19GSUxFX18sIF9fTElORV9fKQorI2Vsc2UKKyNkZWZpbmUgRkZJX0FTU0VSVCh4KQorI2RlZmluZSBGRklfQVNTRVJUX0FUKHgsIGYsIGwpCisjZGVmaW5lIEZGSV9BU1NFUlRfVkFMSURfVFlQRSh4KQorI2VuZGlmCisKKyNkZWZpbmUgQUxJR04odiwgYSkgICgoKCgoc2l6ZV90KSAodikpLTEpIHwgKChhKS0xKSkrMSkKKyNkZWZpbmUgQUxJR05fRE9XTih2LCBhKSAoKChzaXplX3QpICh2KSkgJiAtYSkKKworLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZyAqLworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpOworCisvKiBFeHRlbmRlZCBjaWYsIHVzZWQgaW4gY2FsbGJhY2sgZnJvbSBhc3NlbWJseSByb3V0aW5lICovCit0eXBlZGVmIHN0cnVjdAoreworICBmZmlfY2lmICpjaWY7CisgIHZvaWQgKnJ2YWx1ZTsKKyAgdm9pZCAqKmF2YWx1ZTsKK30gZXh0ZW5kZWRfY2lmOworCisvKiBUZXJzZSBzaXplZCB0eXBlIGRlZmluaXRpb25zLiAgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fc2dpKQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OwordHlwZWRlZiBzaWduZWQgY2hhciAgIFNJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSU5UMTY7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCAgIFNJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMjsKK3R5cGVkZWYgc2lnbmVkIGludCAgIFNJTlQzMjsKKyMgaWZkZWYgX01TQ19WRVIKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSU5UNjQ7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0ICAgU0lOVDY0OworIyBlbHNlCisjIGluY2x1ZGUgPGludHR5cGVzLmg+Cit0eXBlZGVmIHVpbnQ2NF90IFVJTlQ2NDsKK3R5cGVkZWYgaW50NjRfdCAgU0lOVDY0OworIyBlbmRpZgorI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ4ICBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1FJX18pKSk7Cit0eXBlZGVmIHNpZ25lZCBpbnQgICBTSU5UOCAgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19RSV9fKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDE2IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fSElfXykpKTsKK3R5cGVkZWYgc2lnbmVkIGludCAgIFNJTlQxNiBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0hJX18pKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzIgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOwordHlwZWRlZiBzaWduZWQgaW50ICAgU0lOVDMyIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ2NCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSk7Cit0eXBlZGVmIHNpZ25lZCBpbnQgICBTSU5UNjQgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpOworI2VuZGlmCisKK3R5cGVkZWYgZmxvYXQgRkxPQVQzMjsKKworI2lmbmRlZiBfX0dOVUNfXworI2RlZmluZSBfX2J1aWx0aW5fZXhwZWN0KHgsIGV4cGVjdGVkX3ZhbHVlKSAoeCkKKyNlbmRpZgorI2RlZmluZSBMSUtFTFkoeCkgICAgX19idWlsdGluX2V4cGVjdCgoeCksMSkKKyNkZWZpbmUgVU5MSUtFTFkoeCkgIF9fYnVpbHRpbl9leHBlY3QoKHgpLDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2luc3RhbGwtc2ggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NzgxYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2luc3RhbGwtc2gKQEAgLTAsMCArMSw1MjAgQEAKKyMhL2Jpbi9zaAorIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKworc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQworCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisjCisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guCisKK25sPScKKycKK0lGUz0iICIiCSRubCIKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9JHtET0lUUFJPRy19CitpZiB0ZXN0IC16ICIkZG9pdCI7IHRoZW4KKyAgZG9pdF9leGVjPWV4ZWMKK2Vsc2UKKyAgZG9pdF9leGVjPSRkb2l0CitmaQorCisjIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOworIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KKworY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQorY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQorY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQorY21wcHJvZz0ke0NNUFBST0ctY21wfQorY3Bwcm9nPSR7Q1BQUk9HLWNwfQorbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQorbXZwcm9nPSR7TVZQUk9HLW12fQorcm1wcm9nPSR7Uk1QUk9HLXJtfQorc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQorCitwb3NpeF9nbG9iPSc/JworaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKKyAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7CisgICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIHBvc2l4X2dsb2I9CisgICAgZWxzZQorICAgICAgcG9zaXhfZ2xvYj06CisgICAgZmkKKyAgfQorJworCitwb3NpeF9ta2Rpcj0KKworIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCittb2RlPTA3NTUKKworY2hncnBjbWQ9CitjaG1vZGNtZD0kY2htb2Rwcm9nCitjaG93bmNtZD0KK212Y21kPSRtdnByb2cKK3JtY21kPSIkcm1wcm9nIC1mIgorc3RyaXBjbWQ9CisKK3NyYz0KK2RzdD0KK2Rpcl9hcmc9Citkc3RfYXJnPQorCitjb3B5X29uX2NoYW5nZT1mYWxzZQorbm9fdGFyZ2V0X2RpcmVjdG9yeT0KKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQorICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQorICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgorICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCisKK0luIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCitJbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KK0luIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KKworT3B0aW9uczoKKyAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KKyAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworICAtYyAgICAgICAgICAgIChpZ25vcmVkKQorICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCisgIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KKyAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KKyAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCisgIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCisgIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKyAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgorICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDTVBQUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HCisgIFJNUFJPRyBTVFJJUFBST0cKKyIKKword2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1jKSA7OworCisgICAgLUMpIGNvcHlfb25fY2hhbmdlPXRydWU7OworCisgICAgLWQpIGRpcl9hcmc9dHJ1ZTs7CisKKyAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJc2hpZnQ7OworCisgICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKKworICAgIC1tKSBtb2RlPSQyCisJY2FzZSAkbW9kZSBpbgorCSAgKicgJyogfCAqJwknKiB8IConCisnKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQorCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCisJICAgIGV4aXQgMTs7CisJZXNhYworCXNoaWZ0OzsKKworICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwlzaGlmdDs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZzs7CisKKyAgICAtdCkgZHN0X2FyZz0kMgorCXNoaWZ0OzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWU7OworCisgICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OworCisgICAgLS0pCXNoaWZ0CisJYnJlYWs7OworCisgICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgorCWV4aXQgMTs7CisKKyAgICAqKSAgYnJlYWs7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2lmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0X2FyZyI7IHRoZW4KKyAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCisgICMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCisgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KKyAgZm9yIGFyZworICBkbworICAgIGlmIHRlc3QgLW4gIiRkc3RfYXJnIjsgdGhlbgorICAgICAgIyAkQCBpcyBub3QgZW1wdHk6IGl0IGNvbnRhaW5zIGF0IGxlYXN0ICRhcmcuCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdF9hcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgZmkKKyAgICBzaGlmdCAjIGFyZworICAgIGRzdF9hcmc9JGFyZworICBkb25lCitmaQorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgorICAgIGV4aXQgMQorICBmaQorICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KKyAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KKyAgZXhpdCAwCitmaQorCitpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KKyAgdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKKworICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgorICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCisgIGNhc2UgJG1vZGUgaW4KKyAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KKyAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OworICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKKworICAgICpbMC03XSkKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSclIDIwMCcKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSx1K3J3CisgICAgICBmaQorICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKKyAgZXNhYworZmkKKworZm9yIHNyYworZG8KKyAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICBjYXNlICRzcmMgaW4KKyAgICAtKikgc3JjPS4vJHNyYzs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIGRzdGRpcj0kZHN0CisgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICBkc3RkaXJfc3RhdHVzPSQ/CisgIGVsc2UKKworICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBkc3Q9JGRzdF9hcmcKKyAgICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgICAgY2FzZSAkZHN0IGluCisgICAgICAtKikgZHN0PS4vJGRzdDs7CisgICAgZXNhYworCisgICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yaworICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgorCWVjaG8gIiQwOiAkZHN0X2FyZzogSXMgYSBkaXJlY3RvcnkiID4mMgorCWV4aXQgMQorICAgICAgZmkKKyAgICAgIGRzdGRpcj0kZHN0CisgICAgICBkc3Q9JGRzdGRpci9gYmFzZW5hbWUgIiRzcmMiYAorICAgICAgZHN0ZGlyX3N0YXR1cz0wCisgICAgZWxzZQorICAgICAgIyBQcmVmZXIgZGlybmFtZSwgYnV0IGZhbGwgYmFjayBvbiBhIHN1YnN0aXR1dGUgaWYgZGlybmFtZSBmYWlscy4KKyAgICAgIGRzdGRpcj1gCisJKGRpcm5hbWUgIiRkc3QiKSAyPi9kZXYvbnVsbCB8fAorCWV4cHIgWCIkZHN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKwllY2hvIFgiJGRzdCIgfAorCSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXClbXi9dLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXCkkL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIC9eWFwoXC9cKS4qL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIHMvLiovLi87IHEnCisgICAgICBgCisKKyAgICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgICBkc3RkaXJfc3RhdHVzPSQ/CisgICAgZmkKKyAgZmkKKworICBvYnNvbGV0ZV9ta2Rpcl91c2VkPWZhbHNlCisKKyAgaWYgdGVzdCAkZHN0ZGlyX3N0YXR1cyAhPSAwOyB0aGVuCisgICAgY2FzZSAkcG9zaXhfbWtkaXIgaW4KKyAgICAgICcnKQorCSMgQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJzIHVzaW5nIG1vZGUgNzU1IGFzIG1vZGlmaWVkIGJ5IHRoZSB1bWFzay4KKwkjIFRoaXMgaXMgbGlrZSBGcmVlQlNEICdpbnN0YWxsJyBhcyBvZiAxOTk3LTEwLTI4LgorCXVtYXNrPWB1bWFza2AKKwljYXNlICRzdHJpcGNtZC4kdW1hc2sgaW4KKwkgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgorCSAgKlsyMzY3XVsyMzY3XSkgbWtkaXJfdW1hc2s9JHVtYXNrOzsKKwkgIC4qMFswMl1bMDJdIHwgLlswMl1bMDJdIHwgLlswMl0pIG1rZGlyX3VtYXNrPTIyOzsKKworCSAgKlswLTddKQorCSAgICBta2Rpcl91bWFzaz1gZXhwciAkdW1hc2sgKyAyMiBcCisJICAgICAgLSAkdW1hc2sgJSAxMDAgJSA0MCArICR1bWFzayAlIDIwIFwKKwkgICAgICAtICR1bWFzayAlIDEwICUgNCArICR1bWFzayAlIDIKKwkgICAgYDs7CisJICAqKSBta2Rpcl91bWFzaz0kdW1hc2ssZ28tdzs7CisJZXNhYworCisJIyBXaXRoIC1kLCBjcmVhdGUgdGhlIG5ldyBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgbW9kZS4KKwkjIE90aGVyd2lzZSwgcmVseSBvbiAkbWtkaXJfdW1hc2suCisJaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisJICBta2Rpcl9tb2RlPS1tJG1vZGUKKwllbHNlCisJICBta2Rpcl9tb2RlPQorCWZpCisKKwlwb3NpeF9ta2Rpcj1mYWxzZQorCWNhc2UgJHVtYXNrIGluCisJICAqWzEyMzU2N11bMC03XVswLTddKQorCSAgICAjIFBPU0lYIG1rZGlyIC1wIHNldHMgdSt3eCBiaXRzIHJlZ2FyZGxlc3Mgb2YgdW1hc2ssIHdoaWNoCisJICAgICMgaXMgaW5jb21wYXRpYmxlIHdpdGggRnJlZUJTRCAnaW5zdGFsbCcgd2hlbiAodW1hc2sgJiAzMDApICE9IDAuCisJICAgIDs7CisJICAqKQorCSAgICB0bXBkaXI9JHtUTVBESVItL3RtcH0vaW5zJFJBTkRPTS0kJAorCSAgICB0cmFwICdyZXQ9JD87IHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIiAyPi9kZXYvbnVsbDsgZXhpdCAkcmV0JyAwCisKKwkgICAgaWYgKHVtYXNrICRta2Rpcl91bWFzayAmJgorCQlleGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiR0bXBkaXIvZCIpID4vZGV2L251bGwgMj4mMQorCSAgICB0aGVuCisJICAgICAgaWYgdGVzdCAteiAiJGRpcl9hcmciIHx8IHsKKwkJICAgIyBDaGVjayBmb3IgUE9TSVggaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAtbS4KKwkJICAgIyBIUC1VWCAxMS4yMyBhbmQgSVJJWCA2LjUgbWtkaXIgLW0gLXAgc2V0cyBncm91cC0gb3IKKwkJICAgIyBvdGhlci13cml0ZWFibGUgYml0IG9mIHBhcmVudCBkaXJlY3Rvcnkgd2hlbiBpdCBzaG91bGRuJ3QuCisJCSAgICMgRnJlZUJTRCA2LjEgbWtkaXIgLW0gLXAgc2V0cyBtb2RlIG9mIGV4aXN0aW5nIGRpcmVjdG9yeS4KKwkJICAgbHNfbGRfdG1wZGlyPWBscyAtbGQgIiR0bXBkaXIiYAorCQkgICBjYXNlICRsc19sZF90bXBkaXIgaW4KKwkJICAgICBkPz8/Py0/ci0qKSBkaWZmZXJlbnRfbW9kZT03MDA7OworCQkgICAgIGQ/Pz8/LT8tLSopIGRpZmZlcmVudF9tb2RlPTc1NTs7CisJCSAgICAgKikgZmFsc2U7OworCQkgICBlc2FjICYmCisJCSAgICRta2RpcnByb2cgLW0kZGlmZmVyZW50X21vZGUgLXAgLS0gIiR0bXBkaXIiICYmIHsKKwkJICAgICBsc19sZF90bXBkaXJfMT1gbHMgLWxkICIkdG1wZGlyImAKKwkJICAgICB0ZXN0ICIkbHNfbGRfdG1wZGlyIiA9ICIkbHNfbGRfdG1wZGlyXzEiCisJCSAgIH0KKwkJIH0KKwkgICAgICB0aGVuIHBvc2l4X21rZGlyPToKKwkgICAgICBmaQorCSAgICAgIHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBSZW1vdmUgYW55IGRpcnMgbGVmdCBiZWhpbmQgYnkgYW5jaWVudCBta2RpciBpbXBsZW1lbnRhdGlvbnMuCisJICAgICAgcm1kaXIgLi8kbWtkaXJfbW9kZSAuLy1wIC4vLS0gMj4vZGV2L251bGwKKwkgICAgZmkKKwkgICAgdHJhcCAnJyAwOzsKKwllc2FjOzsKKyAgICBlc2FjCisKKyAgICBpZgorICAgICAgJHBvc2l4X21rZGlyICYmICgKKwl1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiCisgICAgICApCisgICAgdGhlbiA6CisgICAgZWxzZQorCisgICAgICAjIFRoZSB1bWFzayBpcyByaWRpY3Vsb3VzLCBvciBta2RpciBkb2VzIG5vdCBjb25mb3JtIHRvIFBPU0lYLAorICAgICAgIyBvciBpdCBmYWlsZWQgcG9zc2libHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uICBDcmVhdGUgdGhlCisgICAgICAjIGRpcmVjdG9yeSB0aGUgc2xvdyB3YXksIHN0ZXAgYnkgc3RlcCwgY2hlY2tpbmcgZm9yIHJhY2VzIGFzIHdlIGdvLgorCisgICAgICBjYXNlICRkc3RkaXIgaW4KKwkvKikgcHJlZml4PScvJzs7CisJLSopIHByZWZpeD0nLi8nOzsKKwkqKSAgcHJlZml4PScnOzsKKyAgICAgIGVzYWMKKworICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIKKworICAgICAgb0lGUz0kSUZTCisgICAgICBJRlM9LworICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mCisgICAgICBzZXQgZm5vcmQgJGRzdGRpcgorICAgICAgc2hpZnQKKyAgICAgICRwb3NpeF9nbG9iIHNldCArZgorICAgICAgSUZTPSRvSUZTCisKKyAgICAgIHByZWZpeGVzPQorCisgICAgICBmb3IgZAorICAgICAgZG8KKwl0ZXN0IC16ICIkZCIgJiYgY29udGludWUKKworCXByZWZpeD0kcHJlZml4JGQKKwlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgorCSAgcHJlZml4ZXM9CisJZWxzZQorCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCisJICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKKwkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCisJICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCisJICBlbHNlCisJICAgIGNhc2UgJHByZWZpeCBpbgorCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKwkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OworCSAgICBlc2FjCisJICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKKwkgIGZpCisJZmkKKwlwcmVmaXg9JHByZWZpeC8KKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgorCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8CisJICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKKwlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCisgICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAorICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQorICBlbHNlCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKworICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCisgICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgSWYgLUMsIGRvbid0IGJvdGhlciB0byBjb3B5IGlmIGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgZmlsZS4KKyAgICBpZiAkY29weV9vbl9jaGFuZ2UgJiYKKyAgICAgICBvbGQ9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3QiCTI+L2Rldi9udWxsYCAmJgorICAgICAgIG5ldz1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdHRtcCIJMj4vZGV2L251bGxgICYmCisKKyAgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIiAmJgorICAgICAgICRwb3NpeF9nbG9iIHNldCAtZiAmJgorICAgICAgIHNldCBYICRvbGQgJiYgb2xkPTokMjokNDokNTokNiAmJgorICAgICAgIHNldCBYICRuZXcgJiYgbmV3PTokMjokNDokNTokNiAmJgorICAgICAgICRwb3NpeF9nbG9iIHNldCArZiAmJgorCisgICAgICAgdGVzdCAiJG9sZCIgPSAiJG5ldyIgJiYKKyAgICAgICAkY21wcHJvZyAiJGRzdCIgIiRkc3R0bXAiID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4KKyAgICAgIHJtIC1mICIkZHN0dG1wIgorICAgIGVsc2UKKyAgICAgICMgUmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorICAgICAgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdCIgMj4vZGV2L251bGwgfHwKKworICAgICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQorICAgICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICMgc3VwcG9ydCAtZi4KKyAgICAgIHsKKwkjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwl7CisJICB0ZXN0ICEgLWYgIiRkc3QiIHx8CisJICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIHx8CisJICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdCIgIiRybXRtcCIgMj4vZGV2L251bGwgJiYKKwkgICAgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH0KKwkgIH0gfHwKKwkgIHsgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgorCSAgICAoZXhpdCAxKTsgZXhpdCAxCisJICB9CisJfSAmJgorCisJIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCSRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCisgICAgICB9CisgICAgZmkgfHwgZXhpdCAxCisKKyAgICB0cmFwICcnIDAKKyAgZmkKK2RvbmUKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2xpYmZmaS5wYy5pbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9saWJmZmkucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlMWM3YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9saWJmZmkucGMuaW4KQEAgLTAsMCArMSwxMCBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9JHtsaWJkaXJ9L0BQQUNLQUdFX05BTUVALUBQQUNLQUdFX1ZFUlNJT05AL2luY2x1ZGUKKworTmFtZTogQFBBQ0tBR0VfTkFNRUAKK0Rlc2NyaXB0aW9uOiBMaWJyYXJ5IHN1cHBvcnRpbmcgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2VzCitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxmZmkKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbGlidG9vbC12ZXJzaW9uIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2xpYnRvb2wtdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI4MGUwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2xpYnRvb2wtdmVyc2lvbgpAQCAtMCwwICsxLDI5IEBACisjIFRoaXMgZmlsZSBpcyB1c2VkIHRvIG1haW50YWluIGxpYnRvb2wgdmVyc2lvbiBpbmZvIGZvciBsaWJmZmkuICBTZWUKKyMgdGhlIGxpYnRvb2wgbWFudWFsIHRvIHVuZGVyc3RhbmQgdGhlIG1lYW5pbmcgb2YgdGhlIGZpZWxkcy4gIFRoaXMgaXMKKyMgYSBzZXBhcmF0ZSBmaWxlIHNvIHRoYXQgdmVyc2lvbiB1cGRhdGVzIGRvbid0IGludm9sdmUgcmUtcnVubmluZworIyBhdXRvbWFrZS4KKyMKKyMgSGVyZSBhcmUgYSBzZXQgb2YgcnVsZXMgdG8gaGVscCB5b3UgdXBkYXRlIHlvdXIgbGlicmFyeSB2ZXJzaW9uCisjIGluZm9ybWF0aW9uOgorIyAKKyMgMS4gU3RhcnQgd2l0aCB2ZXJzaW9uIGluZm9ybWF0aW9uIG9mIGAwOjA6MCcgZm9yIGVhY2ggbGlidG9vbCBsaWJyYXJ5LgorIworIyAyLiBVcGRhdGUgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gb25seSBpbW1lZGlhdGVseSBiZWZvcmUgYSBwdWJsaWMKKyMgICAgcmVsZWFzZSBvZiB5b3VyIHNvZnR3YXJlLiBNb3JlIGZyZXF1ZW50IHVwZGF0ZXMgYXJlIHVubmVjZXNzYXJ5LAorIyAgICBhbmQgb25seSBndWFyYW50ZWUgdGhhdCB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIGdldHMgbGFyZ2VyCisjICAgIGZhc3Rlci4KKyMKKyMgMy4gSWYgdGhlIGxpYnJhcnkgc291cmNlIGNvZGUgaGFzIGNoYW5nZWQgYXQgYWxsIHNpbmNlIHRoZSBsYXN0CisjICAgIHVwZGF0ZSwgdGhlbiBpbmNyZW1lbnQgcmV2aXNpb24gKGBjOnI6YScgYmVjb21lcyBgYzpyKzE6YScpLgorIworIyA0LiBJZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gYWRkZWQsIHJlbW92ZWQsIG9yIGNoYW5nZWQgc2luY2UgdGhlCisjICAgIGxhc3QgdXBkYXRlLCBpbmNyZW1lbnQgY3VycmVudCwgYW5kIHNldCByZXZpc2lvbiB0byAwLgorIworIyA1LiBJZiBhbnkgaW50ZXJmYWNlcyBoYXZlIGJlZW4gYWRkZWQgc2luY2UgdGhlIGxhc3QgcHVibGljIHJlbGVhc2UsCisjICAgIHRoZW4gaW5jcmVtZW50IGFnZS4KKyMKKyMgNi4gSWYgYW55IGludGVyZmFjZXMgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgdGhlIGxhc3QgcHVibGljCisjICAgIHJlbGVhc2UsIHRoZW4gc2V0IGFnZSB0byAwLgorIworIyBDVVJSRU5UOlJFVklTSU9OOkFHRQorNToxMDowCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbHRtYWluLnNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTU2MjRjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL2x0bWFpbi5zaApAQCAtMCwwICsxLDk2MzYgQEAKKworIyBsaWJ0b29sIChHTlUgbGlidG9vbCkgMi40CisjIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAorIyAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTworIyB3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLAorIyBvciBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisjIFVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgorIworIyBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMKKyMgICAgICAgLS1jb25maWcgICAgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKyMgICAgICAgLS1kZWJ1ZyAgICAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZworIyAgIC1uLCAtLWRyeS1ydW4gICAgICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcworIyAgICAgICAtLWZlYXR1cmVzICAgICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyMgICAgICAgLS1tb2RlPU1PREUgICAgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUKKyMgICAgICAgLS1wcmVzZXJ2ZS1kdXAtZGVwcyAgZG9uJ3QgcmVtb3ZlIGR1cGxpY2F0ZSBkZXBlbmRlbmN5IGxpYnJhcmllcworIyAgICAgICAtLXF1aWV0LCAtLXNpbGVudCAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisjICAgICAgIC0tbm8tcXVpZXQsIC0tbm8tc2lsZW50CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgKGRlZmF1bHQpCisjICAgICAgIC0tdGFnPVRBRyAgICAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKKyMgICAtdiwgLS12ZXJib3NlICAgICAgICAgICAgcHJpbnQgbW9yZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYW4gZGVmYXVsdAorIyAgICAgICAtLW5vLXZlcmJvc2UgICAgICAgICBkb24ndCBwcmludCB0aGUgZXh0cmEgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworIyAgICAgICAtLXZlcnNpb24gICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisjICAgLWgsIC0taGVscCwgLS1oZWxwLWFsbCAgIHByaW50IHNob3J0LCBsb25nLCBvciBkZXRhaWxlZCBoZWxwIG1lc3NhZ2UKKyMKKyMgTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorIworIyAgICAgICAgIGNsZWFuICAgICAgICAgICAgICByZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5CisjICAgICAgICAgY29tcGlsZSAgICAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKKyMgICAgICAgICBleGVjdXRlICAgICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KKyMgICAgICAgICBmaW5pc2ggICAgICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcworIyAgICAgICAgIGluc3RhbGwgICAgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcworIyAgICAgICAgIGxpbmsgICAgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKKyMgICAgICAgICB1bmluc3RhbGwgICAgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKKyMKKyMgTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgV2hlbiBwYXNzZWQgYXMgZmlyc3Qgb3B0aW9uLAorIyBgLS1tb2RlPU1PREUnIG1heSBiZSBhYmJyZXZpYXRlZCBhcyBgTU9ERScgb3IgYSB1bmlxdWUgYWJicmV2aWF0aW9uIG9mIHRoYXQuCisjIFRyeSBgJHByb2duYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLgorIworIyBXaGVuIHJlcG9ydGluZyBhIGJ1ZywgcGxlYXNlIGRlc2NyaWJlIGEgdGVzdCBjYXNlIHRvIHJlcHJvZHVjZSBpdCBhbmQKKyMgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorIworIyAgICAgICAgIGhvc3QtdHJpcGxldDoJJGhvc3QKKyMgICAgICAgICBzaGVsbDoJCSRTSEVMTAorIyAgICAgICAgIGNvbXBpbGVyOgkJJExUQ0MKKyMgICAgICAgICBjb21waWxlciBmbGFnczoJCSRMVENGTEFHUworIyAgICAgICAgIGxpbmtlcjoJCSRMRCAoZ251PyAkd2l0aF9nbnVfbGQpCisjICAgICAgICAgJHByb2duYW1lOgkoR05VIGxpYnRvb2wpIDIuNAorIyAgICAgICAgIGF1dG9tYWtlOgkkYXV0b21ha2VfdmVyc2lvbgorIyAgICAgICAgIGF1dG9jb25mOgkkYXV0b2NvbmZfdmVyc2lvbgorIworIyBSZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uCisjIEdOVSBsaWJ0b29sIGhvbWUgcGFnZTogPGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJ0b29sLz4uCisjIEdlbmVyYWwgaGVscCB1c2luZyBHTlUgc29mdHdhcmU6IDxodHRwOi8vd3d3LmdudS5vcmcvZ2V0aGVscC8+LgorCitQUk9HUkFNPWxpYnRvb2wKK1BBQ0tBR0U9bGlidG9vbAorVkVSU0lPTj0yLjQKK1RJTUVTVEFNUD0iIgorcGFja2FnZV9yZXZpc2lvbj0xLjMyOTMKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCitmaQorQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW50IGJ1aWx0aW4gb3IgcHJpbnRmLgorZnVuY19mYWxsYmFja19lY2hvICgpCit7CisgIGV2YWwgJ2NhdCA8PF9MVEVDSE9fRU9GCiskMQorX0xURUNIT19FT0YnCit9CisKKyMgTkxTIG51aXNhbmNlczogV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCitsdF91c2VyX2xvY2FsZT0KK2x0X3NhZmVfbG9jYWxlPQorZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCitkbworICBldmFsICJpZiB0ZXN0IFwiXCR7JGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICBzYXZlXyRsdF92YXI9XCQkbHRfdmFyCisgICAgICAgICAgJGx0X3Zhcj1DCisJICBleHBvcnQgJGx0X3ZhcgorCSAgbHRfdXNlcl9sb2NhbGU9XCIkbHRfdmFyPVxcXCRzYXZlX1wkbHRfdmFyOyBcJGx0X3VzZXJfbG9jYWxlXCIKKwkgIGx0X3NhZmVfbG9jYWxlPVwiJGx0X3Zhcj1DOyBcJGx0X3NhZmVfbG9jYWxlXCIKKwlmaSIKK2RvbmUKK0xDX0FMTD1DCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UgTENfQUxMCisKKyRsdF91bnNldCBDRFBBVEgKKworCisjIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKKyMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCisjIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAorIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCisjIGZ1bmN0aW9uLgorcHJvZ3BhdGg9IiQwIgorCisKKworOiAke0NQPSJjcCAtZiJ9Cit0ZXN0ICIke0VDSE8rc2V0fSIgPSBzZXQgfHwgRUNITz0ke2FzX2VjaG8tJ3ByaW50ZiAlc1xuJ30KKzogJHtFR1JFUD0iL2Jpbi9ncmVwIC1FIn0KKzogJHtGR1JFUD0iL2Jpbi9ncmVwIC1GIn0KKzogJHtHUkVQPSIvYmluL2dyZXAifQorOiAke0xOX1M9ImxuIC1zIn0KKzogJHtNQUtFPSJtYWtlIn0KKzogJHtNS0RJUj0ibWtkaXIifQorOiAke01WPSJtdiAtZiJ9Cis6ICR7Uk09InJtIC1mIn0KKzogJHtTRUQ9Ii9iaW4vc2VkIn0KKzogJHtTSEVMTD0iJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0ifQorOiAke1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyJ9CisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK0VYSVRfU1VDQ0VTUz0wCitFWElUX0ZBSUxVUkU9MQorRVhJVF9NSVNNQVRDSD02MyAgIyAkPyA9IDYzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmVyc2lvbiBtaXNtYXRjaCB0byBtaXNzaW5nLgorRVhJVF9TS0lQPTc3CSAgIyAkPyA9IDc3IGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBza2lwcGVkIHRlc3QgdG8gYXV0b21ha2UuCisKK2V4aXRfc3RhdHVzPSRFWElUX1NVQ0NFU1MKKworIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKK2x0X25sPScKKycKK0lGUz0iIAkkbHRfbmwiCisKK2Rpcm5hbWU9InMsL1teL10qJCwsIgorYmFzZW5hbWU9InMsXi4qLywsIgorCisjIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKKyMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorZnVuY19kaXJuYW1lICgpCit7CisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGRpcm5hbWUiYAorICAgIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKKyAgICBmaQorfSAjIGZ1bmNfZGlybmFtZSBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfYmFzZW5hbWUgZmlsZQorZnVuY19iYXNlbmFtZSAoKQoreworICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICIkYmFzZW5hbWUiYAorfSAjIGZ1bmNfYmFzZW5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgorIyBjYWxsOgorIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKKyMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAorIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisjIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKKyMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KKyMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQoreworICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAtZSAiJGRpcm5hbWUiYAorICAgIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCisgICAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKKyAgICBmaQorICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEIC1lICIkYmFzZW5hbWUiYAorfSAjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX3N0cmlwbmFtZSBwcmVmaXggc3VmZml4IG5hbWUKKyMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCisjIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAorIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCisjIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCisjIGZ1bmNfc3RyaXBfc3VmZml4IHByZWZpeCBuYW1lCitmdW5jX3N0cmlwbmFtZSAoKQoreworICAgIGNhc2UgJHsyfSBpbgorICAgICAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIiR7M30iIHwgJFNFRCAicyVeJHsxfSUlOyBzJVxcXFwkezJ9XCQlJSJgOzsKKyAgICAgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICIkezN9IiB8ICRTRUQgInMlXiR7MX0lJTsgcyUkezJ9XCQlJSJgOzsKKyAgICBlc2FjCit9ICMgZnVuY19zdHJpcG5hbWUgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBUaGVzZSBTRUQgc2NyaXB0cyBwcmVzdXBwb3NlIGFuIGFic29sdXRlIHBhdGggd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgorcGF0aGNhcj0ncyxeL1woW14vXSpcKS4qJCxcMSwnCitwYXRoY2RyPSdzLF4vW14vXSosLCcKK3JlbW92ZWRvdHBhcnRzPSc6ZG90c2wKKwkJc0AvXC4vQC9AZworCQl0IGRvdHNsCisJCXMsL1wuJCwvLCcKK2NvbGxhcHNlc2xhc2hlcz0nc0AvXHsxLFx9QC9AZycKK2ZpbmFsc2xhc2g9J3MsLyokLC8sJworCisjIGZ1bmNfbm9ybWFsX2Fic3BhdGggUEFUSAorIyBSZW1vdmUgZG91YmxlZC11cCBhbmQgdHJhaWxpbmcgc2xhc2hlcywgIi4iIHBhdGggY29tcG9uZW50cywKKyMgYW5kIGNhbmNlbCBvdXQgYW55ICIuLiIgcGF0aCBjb21wb25lbnRzIGluIFBBVEggYWZ0ZXIgbWFraW5nCisjIGl0IGFuIGFic29sdXRlIHBhdGguCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQiCitmdW5jX25vcm1hbF9hYnNwYXRoICgpCit7CisgICMgU3RhcnQgZnJvbSByb290IGRpciBhbmQgcmVhc3NlbWJsZSB0aGUgcGF0aC4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9CisgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGg9JDEKKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2U9CisgIGNhc2UgJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGggaW4KKyAgICAiIikKKyAgICAgICMgRW1wdHkgcGF0aCwgdGhhdCBqdXN0IG1lYW5zICRjd2QuCisgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLycgImBwd2RgIgorICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgICAgcmV0dXJuCisgICAgOzsKKyAgICAjIFRoZSBuZXh0IHRocmVlIGVudHJpZXMgYXJlIHVzZWQgdG8gc3BvdCBhIHJ1biBvZiBwcmVjaXNlbHkKKyAgICAjIHR3byBsZWFkaW5nIHNsYXNoZXMgd2l0aG91dCB1c2luZyBuZWdhdGVkIGNoYXJhY3RlciBjbGFzc2VzOworICAgICMgd2UgdGFrZSBhZHZhbnRhZ2Ugb2YgY2FzZSdzIGZpcnN0LW1hdGNoIGJlaGF2aW91ci4KKyAgICAvLy8qKQorICAgICAgIyBVbnVzdWFsIGZvcm0gb2YgYWJzb2x1dGUgcGF0aCwgZG8gbm90aGluZy4KKyAgICA7OworICAgIC8vKikKKyAgICAgICMgTm90IG5lY2Vzc2FyaWx5IGFuIG9yZGluYXJ5IHBhdGg7IFBPU0lYIHJlc2VydmVzIGxlYWRpbmcgJy8vJworICAgICAgIyBhbmQgZm9yIGV4YW1wbGUgQ3lnd2luIHVzZXMgaXQgdG8gYWNjZXNzIHJlbW90ZSBmaWxlIHNoYXJlcworICAgICAgIyBvdmVyIENJRlMvU01CLCBzbyB3ZSBjb25zZXJ2ZSBhIGxlYWRpbmcgZG91YmxlIHNsYXNoIGlmIGZvdW5kLgorICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9hbHRuYW1lc3BhY2U9LworICAgIDs7CisgICAgLyopCisgICAgICAjIEFic29sdXRlIHBhdGgsIGRvIG5vdGhpbmcuCisgICAgOzsKKyAgICAqKQorICAgICAgIyBSZWxhdGl2ZSBwYXRoLCBwcmVwZW5kICRjd2QuCisgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWBwd2RgLyRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoCisgICAgOzsKKyAgZXNhYworICAjIENhbmNlbCBvdXQgYWxsIHRoZSBzaW1wbGUgc3R1ZmYgdG8gc2F2ZSBpdGVyYXRpb25zLiAgV2UgYWxzbyB3YW50CisgICMgdGhlIHBhdGggdG8gZW5kIHdpdGggYSBzbGFzaCBmb3IgZWFzZSBvZiBwYXJzaW5nLCBzbyBtYWtlIHN1cmUKKyAgIyB0aGVyZSBpcyBvbmUgKGFuZCBvbmx5IG9uZSkgaGVyZS4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aD1gJEVDSE8gIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiB8ICRTRUQgXAorICAgICAgICAtZSAiJHJlbW92ZWRvdHBhcnRzIiAtZSAiJGNvbGxhcHNlc2xhc2hlcyIgLWUgIiRmaW5hbHNsYXNoImAKKyAgd2hpbGUgOjsgZG8KKyAgICAjIFByb2Nlc3NlZCBpdCBhbGwgeWV0PworICAgIGlmIHRlc3QgIiRmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoIiA9IC8gOyB0aGVuCisgICAgICAjIElmIHdlIGFzY2VuZGVkIHRvIHRoZSByb290IHVzaW5nICIuLiIgdGhlIHJlc3VsdCBtYXkgYmUgZW1wdHkgbm93LgorICAgICAgaWYgdGVzdCAteiAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0IiA7IHRoZW4KKyAgICAgICAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9LworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Rjb21wb25lbnQ9YCRFQ0hPICIkZnVuY19ub3JtYWxfYWJzcGF0aF90cGF0aCIgfCAkU0VEIFwKKyAgICAgICAgLWUgIiRwYXRoY2FyImAKKyAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3RwYXRoPWAkRUNITyAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdHBhdGgiIHwgJFNFRCBcCisgICAgICAgIC1lICIkcGF0aGNkciJgCisgICAgIyBGaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBpdAorICAgIGNhc2UgJGZ1bmNfbm9ybWFsX2Fic3BhdGhfdGNvbXBvbmVudCBpbgorICAgICAgIiIpCisgICAgICAgICMgVHJhaWxpbmcgZW1wdHkgcGF0aCBjb21wb25lbnQsIGlnbm9yZSBpdC4KKyAgICAgIDs7CisgICAgICAuLikKKyAgICAgICAgIyBQYXJlbnQgZGlyOyBzdHJpcCBsYXN0IGFzc2VtYmxlZCBjb21wb25lbnQgZnJvbSByZXN1bHQuCisgICAgICAgIGZ1bmNfZGlybmFtZSAiJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0IgorICAgICAgICBmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorICAgICAgOzsKKyAgICAgICopCisgICAgICAgICMgQWN0dWFsIHBhdGggY29tcG9uZW50LCBhcHBlbmQgaXQuCisgICAgICAgIGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0PSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdC8kZnVuY19ub3JtYWxfYWJzcGF0aF90Y29tcG9uZW50CisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICAjIFJlc3RvcmUgbGVhZGluZyBkb3VibGUtc2xhc2ggaWYgb25lIHdhcyBmb3VuZCBvbiBlbnRyeS4KKyAgZnVuY19ub3JtYWxfYWJzcGF0aF9yZXN1bHQ9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfYWx0bmFtZXNwYWNlJGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0Cit9CisKKyMgZnVuY19yZWxhdGl2ZV9wYXRoIFNSQ0RJUiBEU1RESVIKKyMgZ2VuZXJhdGVzIGEgcmVsYXRpdmUgcGF0aCBmcm9tIFNSQ0RJUiB0byBEU1RESVIsIHdpdGggYSB0cmFpbGluZworIyBzbGFzaCBpZiBub24tZW1wdHksIHN1aXRhYmxlIGZvciBpbW1lZGlhdGVseSBhcHBlbmRpbmcgYSBmaWxlbmFtZQorIyB3aXRob3V0IG5lZWRpbmcgdG8gYXBwZW5kIGEgc2VwYXJhdG9yLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiCitmdW5jX3JlbGF0aXZlX3BhdGggKCkKK3sKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0KKyAgZnVuY19ub3JtYWxfYWJzcGF0aCAiJDEiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyPSRmdW5jX25vcm1hbF9hYnNwYXRoX3Jlc3VsdAorICBmdW5jX25vcm1hbF9hYnNwYXRoICIkMiIKKyAgZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXI9JGZ1bmNfbm9ybWFsX2Fic3BhdGhfcmVzdWx0CisKKyAgIyBBc2NlbmQgdGhlIHRyZWUgc3RhcnRpbmcgZnJvbSBsaWJkaXIKKyAgd2hpbGUgOjsgZG8KKyAgICAjIGNoZWNrIGlmIHdlIGhhdmUgZm91bmQgYSBwcmVmaXggb2YgYmluZGlyCisgICAgY2FzZSAkZnVuY19yZWxhdGl2ZV9wYXRoX3RiaW5kaXIgaW4KKyAgICAgICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpcikKKyAgICAgICAgIyBmb3VuZCBhbiBleGFjdCBtYXRjaAorICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfdGNhbmNlbGxlZD0KKyAgICAgICAgYnJlYWsKKyAgICAgICAgOzsKKyAgICAgICRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpciopCisgICAgICAgICMgZm91bmQgYSBtYXRjaGluZyBwcmVmaXgKKyAgICAgICAgZnVuY19zdHJpcG5hbWUgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGxpYmRpciIgJycgIiRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpciIKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCI7IHRoZW4KKyAgICAgICAgICBmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0PS4KKyAgICAgICAgZmkKKyAgICAgICAgYnJlYWsKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfZGlybmFtZSAkZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXIKKyAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3RsaWJkaXI9JHtmdW5jX2Rpcm5hbWVfcmVzdWx0fQorICAgICAgICBpZiB0ZXN0ICJ4JGZ1bmNfcmVsYXRpdmVfcGF0aF90bGliZGlyIiA9IHggOyB0aGVuCisgICAgICAgICAgIyBIYXZlIHRvIGRlc2NlbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QhCisgICAgICAgICAgZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdD0uLi8kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdAorICAgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF90Y2FuY2VsbGVkPSRmdW5jX3JlbGF0aXZlX3BhdGhfdGJpbmRpcgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9Li4vJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQKKyAgICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIE5vdyBjYWxjdWxhdGUgcGF0aDsgdGFrZSBjYXJlIHRvIGF2b2lkIGRvdWJsaW5nLXVwIHNsYXNoZXMuCisgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiCisgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICBmdW5jX3N0cmlwbmFtZSAnLycgJy8nICIkZnVuY19yZWxhdGl2ZV9wYXRoX3RjYW5jZWxsZWQiCisgIGlmIHRlc3QgIngkZnVuY19zdHJpcG5hbWVfcmVzdWx0IiAhPSB4IDsgdGhlbgorICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JHtmdW5jX3JlbGF0aXZlX3BhdGhfcmVzdWx0fS8ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdH0KKyAgZmkKKworICAjIE5vcm1hbGlzYXRpb24uIElmIGJpbmRpciBpcyBsaWJkaXIsIHJldHVybiBlbXB0eSBzdHJpbmcsCisgICMgZWxzZSByZWxhdGl2ZSBwYXRoIGVuZGluZyB3aXRoIGEgc2xhc2g7IGVpdGhlciB3YXksIHRhcmdldAorICAjIGZpbGUgbmFtZSBjYW4gYmUgZGlyZWN0bHkgYXBwZW5kZWQuCisgIGlmIHRlc3QgISAteiAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQiOyB0aGVuCisgICAgZnVuY19zdHJpcG5hbWUgJy4vJyAnJyAiJGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQvIgorICAgIGZ1bmNfcmVsYXRpdmVfcGF0aF9yZXN1bHQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICBmaQorfQorCisjIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbToKK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRwcm9ncGF0aCIKK3Byb2duYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCisjIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggZm9yIHJlZXhlY3V0aW9uOgorY2FzZSAkcHJvZ3BhdGggaW4KKyAgW1xcL10qfFtBLVphLXpdOlxcKikgOzsKKyAgKltcXC9dKikKKyAgICAgcHJvZ2Rpcj0kZnVuY19kaXJuYW1lX3Jlc3VsdAorICAgICBwcm9nZGlyPWBjZCAiJHByb2dkaXIiICYmIHB3ZGAKKyAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKKyAgICAgOzsKKyAgKikKKyAgICAgc2F2ZV9JRlM9IiRJRlMiCisgICAgIElGUz06CisgICAgIGZvciBwcm9nZGlyIGluICRQQVRIOyBkbworICAgICAgIElGUz0iJHNhdmVfSUZTIgorICAgICAgIHRlc3QgLXggIiRwcm9nZGlyLyRwcm9nbmFtZSIgJiYgYnJlYWsKKyAgICAgZG9uZQorICAgICBJRlM9IiRzYXZlX0lGUyIKKyAgICAgdGVzdCAtbiAiJHByb2dkaXIiIHx8IHByb2dkaXI9YHB3ZGAKKyAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKKyAgICAgOzsKK2VzYWMKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9IiR7U0VEfSInIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbYCIkXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgdHVybnMgYSBzdHJpbmcgaW50byBhIHJlZ2V4IG1hdGNoaW5nIGZvciB0aGUKKyMgc3RyaW5nIGxpdGVyYWxseS4KK3NlZF9tYWtlX2xpdGVyYWxfcmVnZXg9J3MsW10uW14kXFwqXC9dLFxcJixnJworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBjb252ZXJ0cyBhIHczMiBmaWxlIG5hbWUgb3IgcGF0aAorIyB3aGljaCBjb250YWlucyBmb3J3YXJkIHNsYXNoZXMsIGludG8gb25lIHRoYXQgY29udGFpbnMKKyMgKGVzY2FwZWQpIGJhY2tzbGFzaGVzLiAgQSB2ZXJ5IG5haXZlIGltcGxlbWVudGF0aW9uLgorbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeT0nc3xcXFxcKnxcXHxnO3N8L3xcXHxnO3N8XFx8XFxcXHxnJworCisjIFJlLWBcJyBwYXJhbWV0ZXIgZXhwYW5zaW9ucyBpbiBvdXRwdXQgb2YgZG91YmxlX3F1b3RlX3N1YnN0IHRoYXQgd2VyZQorIyBgXCctZWQgaW4gaW5wdXQgdG8gdGhlIHNhbWUuICBJZiBhbiBvZGQgbnVtYmVyIG9mIGBcJyBwcmVjZWRlZCBhICckJworIyBpbiBpbnB1dCB0byBkb3VibGVfcXVvdGVfc3Vic3QsIHRoYXQgJyQnIHdhcyBwcm90ZWN0ZWQgZnJvbSBleHBhbnNpb24uCisjIFNpbmNlIGVhY2ggaW5wdXQgYFwnIGlzIG5vdyB0d28gYFwncywgbG9vayBmb3IgYW55IG51bWJlciBvZiBydW5zIG9mCisjIGZvdXIgYFwncyBmb2xsb3dlZCBieSB0d28gYFwncyBhbmQgdGhlbiBhICckJy4gIGBcJyB0aGF0ICckJy4KK2JzPSdcXCcKK2JzMj0nXFxcXCcKK2JzND0nXFxcXFxcXFwnCitkb2xsYXI9J1wkJworc2VkX2RvdWJsZV9iYWNrc2xhc2g9IlwKKyAgcy8kYnM0LyZcXAorL2cKKyAgcy9eJGJzMiRkb2xsYXIvJGJzJi8KKyAgcy9cXChbXiRic11cXCkkYnMyJGRvbGxhci9cXDEkYnMyJGJzJGRvbGxhci9nCisgIHMvXG4vL2ciCisKKyMgU3RhbmRhcmQgb3B0aW9uczoKK29wdF9kcnlfcnVuPWZhbHNlCitvcHRfaGVscD1mYWxzZQorb3B0X3F1aWV0PWZhbHNlCitvcHRfdmVyYm9zZT1mYWxzZQorb3B0X3dhcm5pbmc9OgorCisjIGZ1bmNfZWNobyBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSwgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBtb2RlCisjIG5hbWUgaWYgaXQgaGFzIGJlZW4gc2V0IHlldC4KK2Z1bmNfZWNobyAoKQoreworICAgICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9JCoiCit9CisKKyMgZnVuY192ZXJib3NlIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIGluIHZlcmJvc2UgbW9kZSBvbmx5LgorZnVuY192ZXJib3NlICgpCit7CisgICAgJG9wdF92ZXJib3NlICYmIGZ1bmNfZWNobyAkezErIiRAIn0KKworICAgICMgQSBidWcgaW4gYmFzaCBoYWx0cyB0aGUgc2NyaXB0IGlmIHRoZSBsYXN0IGxpbmUgb2YgYSBmdW5jdGlvbgorICAgICMgZmFpbHMgd2hlbiBzZXQgLWUgaXMgaW4gZm9yY2UsIHNvIHdlIG5lZWQgYW5vdGhlciBjb21tYW5kIHRvCisgICAgIyB3b3JrIGFyb3VuZCB0aGF0OgorICAgIDoKK30KKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIkKiIKK30KKworIyBmdW5jX2Vycm9yIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLgorZnVuY19lcnJvciAoKQoreworICAgICRFQ0hPICIkcHJvZ25hbWU6ICR7b3B0X21vZGUrJG9wdF9tb2RlOiB9IiR7MSsiJEAifSAxPiYyCit9CisKKyMgZnVuY193YXJuaW5nIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCitmdW5jX3dhcm5pbmcgKCkKK3sKKyAgICAkb3B0X3dhcm5pbmcgJiYgJEVDSE8gIiRwcm9nbmFtZTogJHtvcHRfbW9kZSskb3B0X21vZGU6IH13YXJuaW5nOiAiJHsxKyIkQCJ9IDE+JjIKKworICAgICMgYmFzaCBidWcgYWdhaW46CisgICAgOgorfQorCisjIGZ1bmNfZmF0YWxfZXJyb3IgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGFuZCBleGl0LgorZnVuY19mYXRhbF9lcnJvciAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCit9CisKKyMgZnVuY19mYXRhbF9oZWxwIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQorIyBhIGhlbHAgaGludCwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2hlbHAgKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGZ1bmNfZmF0YWxfZXJyb3IgIiRoZWxwIgorfQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAgIyMgZGVmYXVsdAorCisKKyMgZnVuY19ncmVwIGV4cHJlc3Npb24gZmlsZW5hbWUKKyMgQ2hlY2sgd2hldGhlciBFWFBSRVNTSU9OIG1hdGNoZXMgYW55IGxpbmUgb2YgRklMRU5BTUUsIHdpdGhvdXQgb3V0cHV0LgorZnVuY19ncmVwICgpCit7CisgICAgJEdSRVAgIiQxIiAiJDIiID4vZGV2L251bGwgMj4mMQorfQorCisKKyMgZnVuY19ta2Rpcl9wIGRpcmVjdG9yeS1wYXRoCisjIE1ha2Ugc3VyZSB0aGUgZW50aXJlIHBhdGggdG8gRElSRUNUT1JZLVBBVEggaXMgYXZhaWxhYmxlLgorZnVuY19ta2Rpcl9wICgpCit7CisgICAgbXlfZGlyZWN0b3J5X3BhdGg9IiQxIgorICAgIG15X2Rpcl9saXN0PQorCisgICAgaWYgdGVzdCAtbiAiJG15X2RpcmVjdG9yeV9wYXRoIiAmJiB0ZXN0ICIkb3B0X2RyeV9ydW4iICE9ICI6IjsgdGhlbgorCisgICAgICAjIFByb3RlY3QgZGlyZWN0b3J5IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nCisgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbgorICAgICAgICAtKikgbXlfZGlyZWN0b3J5X3BhdGg9Ii4vJG15X2RpcmVjdG9yeV9wYXRoIiA7OworICAgICAgZXNhYworCisgICAgICAjIFdoaWxlIHNvbWUgcG9ydGlvbiBvZiBESVIgZG9lcyBub3QgeWV0IGV4aXN0Li4uCisgICAgICB3aGlsZSB0ZXN0ICEgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCI7IGRvCisgICAgICAgICMgLi4ubWFrZSBhIGxpc3QgaW4gdG9wbW9zdCBmaXJzdCBvcmRlci4gIFVzZSBhIGNvbG9uIGRlbGltaXRlZAorCSMgbGlzdCBpbmNhc2Ugc29tZSBwb3J0aW9uIG9mIHBhdGggY29udGFpbnMgd2hpdGVzcGFjZS4KKyAgICAgICAgbXlfZGlyX2xpc3Q9IiRteV9kaXJlY3RvcnlfcGF0aDokbXlfZGlyX2xpc3QiCisKKyAgICAgICAgIyBJZiB0aGUgbGFzdCBwb3J0aW9uIGFkZGVkIGhhcyBubyBzbGFzaCBpbiBpdCwgdGhlIGxpc3QgaXMgZG9uZQorICAgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbiAqLyopIDs7ICopIGJyZWFrIDs7IGVzYWMKKworICAgICAgICAjIC4uLm90aGVyd2lzZSB0aHJvdyBhd2F5IHRoZSBjaGlsZCBkaXJlY3RvcnkgYW5kIGxvb3AKKyAgICAgICAgbXlfZGlyZWN0b3J5X3BhdGg9YCRFQ0hPICIkbXlfZGlyZWN0b3J5X3BhdGgiIHwgJFNFRCAtZSAiJGRpcm5hbWUiYAorICAgICAgZG9uZQorICAgICAgbXlfZGlyX2xpc3Q9YCRFQ0hPICIkbXlfZGlyX2xpc3QiIHwgJFNFRCAncyw6KiQsLCdgCisKKyAgICAgIHNhdmVfbWtkaXJfcF9JRlM9IiRJRlMiOyBJRlM9JzonCisgICAgICBmb3IgbXlfZGlyIGluICRteV9kaXJfbGlzdDsgZG8KKwlJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgorICAgICAgICAjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaWYgdHdvIHByb2Nlc3NlcworICAgICAgICAjIHRyeSB0byBjcmVhdGUgb25lIG9mIHRoZSBkaXJlY3RvcmllcyBjb25jdXJyZW50bHkuICBEb24ndAorICAgICAgICAjIHN0b3AgaW4gdGhhdCBjYXNlIQorICAgICAgICAkTUtESVIgIiRteV9kaXIiIDI+L2Rldi9udWxsIHx8IDoKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfbWtkaXJfcF9JRlMiCisKKyAgICAgICMgQmFpbCBvdXQgaWYgd2UgKG9yIHNvbWUgb3RoZXIgcHJvY2VzcykgZmFpbGVkIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgICAgIHRlc3QgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCIgfHwgXAorICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJGYWlsZWQgdG8gY3JlYXRlIFxgJDEnIgorICAgIGZpCit9CisKKworIyBmdW5jX21rdGVtcGRpciBbc3RyaW5nXQorIyBNYWtlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdvbid0IGNsYXNoIHdpdGggb3RoZXIgcnVubmluZworIyBsaWJ0b29sIHByb2Nlc3NlcywgYW5kIGF2b2lkcyByYWNlIGNvbmRpdGlvbnMgaWYgcG9zc2libGUuICBJZgorIyBnaXZlbiwgU1RSSU5HIGlzIHRoZSBiYXNlbmFtZSBmb3IgdGhhdCBkaXJlY3RvcnkuCitmdW5jX21rdGVtcGRpciAoKQoreworICAgIG15X3RlbXBsYXRlPSIke1RNUERJUi0vdG1wfS8kezEtJHByb2duYW1lfSIKKworICAgIGlmIHRlc3QgIiRvcHRfZHJ5X3J1biIgPSAiOiI7IHRoZW4KKyAgICAgICMgUmV0dXJuIGEgZGlyZWN0b3J5IG5hbWUsIGJ1dCBkb24ndCBjcmVhdGUgaXQgaW4gZHJ5LXJ1biBtb2RlCisgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSQkIgorICAgIGVsc2UKKworICAgICAgIyBJZiBta3RlbXAgd29ya3MsIHVzZSB0aGF0IGZpcnN0IGFuZCBmb3JlbW9zdAorICAgICAgbXlfdG1wZGlyPWBta3RlbXAgLWQgIiR7bXlfdGVtcGxhdGV9LVhYWFhYWFhYIiAyPi9kZXYvbnVsbGAKKworICAgICAgaWYgdGVzdCAhIC1kICIkbXlfdG1wZGlyIjsgdGhlbgorICAgICAgICAjIEZhaWxpbmcgdGhhdCwgYXQgbGVhc3QgdHJ5IGFuZCB1c2UgJFJBTkRPTSB0byBhdm9pZCBhIHJhY2UKKyAgICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0ke1JBTkRPTS0wfSQkIgorCisgICAgICAgIHNhdmVfbWt0ZW1wZGlyX3VtYXNrPWB1bWFza2AKKyAgICAgICAgdW1hc2sgMDA3NworICAgICAgICAkTUtESVIgIiRteV90bXBkaXIiCisgICAgICAgIHVtYXNrICRzYXZlX21rdGVtcGRpcl91bWFzaworICAgICAgZmkKKworICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gZHJ5LXJ1biBtb2RlLCBib21iIG91dCBvbiBmYWlsdXJlCisgICAgICB0ZXN0IC1kICIkbXlfdG1wZGlyIiB8fCBcCisgICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCRteV90bXBkaXInIgorICAgIGZpCisKKyAgICAkRUNITyAiJG15X3RtcGRpciIKK30KKworCisjIGZ1bmNfcXVvdGVfZm9yX2V2YWwgYXJnCisjIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlci4KKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXM6IEZVTkNfUVVPVEVfRk9SX0VWQUxfUkVTVUxUCisjIGlzIGRvdWJsZS1xdW90ZWQsIHN1aXRhYmxlIGZvciBhIHN1YnNlcXVlbnQgZXZhbCwgd2hlcmVhcworIyBGVU5DX1FVT1RFX0ZPUl9FVkFMX1VOUVVPVEVEX1JFU1VMVCBoYXMgbWVyZWx5IGFsbCBjaGFyYWN0ZXJzCisjIHdoaWNoIGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZSBxdW90ZXMgYmFja3NsYXNoaWZpZWQuCitmdW5jX3F1b3RlX2Zvcl9ldmFsICgpCit7CisgICAgY2FzZSAkMSBpbgorICAgICAgKltcXFxgXCJcJF0qKQorCWZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0PWAkRUNITyAiJDEiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD0iJDEiIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQgaW4KKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQorICAgICAgIyB3b3JkIHNwbGl0dGluZywgY29tbWFuZCBzdWJzdGl0dXRpb24gYW5kIGFuZCB2YXJpYWJsZQorICAgICAgIyBleHBhbnNpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKyAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IlwiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0XCIiCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdD0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IgorICAgIGVzYWMKK30KKworCisjIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCBhcmcKKyMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyOyBzYW1lIGFzIGFib3ZlLAorIyBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitmdW5jX3F1b3RlX2Zvcl9leHBhbmQgKCkKK3sKKyAgICBjYXNlICQxIGluCisgICAgICAqW1xcXGBcIl0qKQorCW15X2FyZz1gJEVDSE8gIiQxIiB8ICRTRUQgXAorCSAgICAtZSAiJGRvdWJsZV9xdW90ZV9zdWJzdCIgLWUgIiRzZWRfZG91YmxlX2JhY2tzbGFzaCJgIDs7CisgICAgICAqKQorICAgICAgICBteV9hcmc9IiQxIiA7OworICAgIGVzYWMKKworICAgIGNhc2UgJG15X2FyZyBpbgorICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHRvIGRlbGF5CisgICAgICAjIHdvcmQgc3BsaXR0aW5nIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBmb3IgYSBzdWJzZXF1ZW50IGV2YWwuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgICBteV9hcmc9IlwiJG15X2FyZ1wiIgorICAgICAgICA7OworICAgIGVzYWMKKworICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQ9IiRteV9hcmciCit9CisKKworIyBmdW5jX3Nob3dfZXZhbCBjbWQgW2ZhaWxfZXhwXQorIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCisjIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAorIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4KK2Z1bmNfc2hvd19ldmFsICgpCit7CisgICAgbXlfY21kPSIkMSIKKyAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgorCisgICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7CisgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCisgICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisgICAgfQorCisgICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQorICAgICAgZXZhbCAiJG15X2NtZCIKKyAgICAgIG15X3N0YXR1cz0kPworICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQorCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCisgICAgICBmaQorICAgIGZpCit9CisKKworIyBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgY21kIFtmYWlsX2V4cF0KKyMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcworIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKKyMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuICBVc2UgdGhlIHNhdmVkIGxvY2FsZSBmb3IgZXZhbHVhdGlvbi4KK2Z1bmNfc2hvd19ldmFsX2xvY2FsZSAoKQoreworICAgIG15X2NtZD0iJDEiCisgICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKKworICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgeworICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgorICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorICAgIH0KKworICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKKyAgICAgIGV2YWwgIiRsdF91c2VyX2xvY2FsZQorCSAgICAkbXlfY21kIgorICAgICAgbXlfc3RhdHVzPSQ/CisgICAgICBldmFsICIkbHRfc2FmZV9sb2NhbGUiCisgICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCisJZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKKyAgICAgIGZpCisgICAgZmkKK30KKworIyBmdW5jX3RyX3NoCisjIFR1cm4gJDEgaW50byBhIHN0cmluZyBzdWl0YWJsZSBmb3IgYSBzaGVsbCB2YXJpYWJsZSBuYW1lLgorIyBSZXN1bHQgaXMgc3RvcmVkIGluICRmdW5jX3RyX3NoX3Jlc3VsdC4gIEFsbCBjaGFyYWN0ZXJzCisjIG5vdCBpbiB0aGUgc2V0IGEtekEtWjAtOV8gYXJlIHJlcGxhY2VkIHdpdGggJ18nLiBGdXJ0aGVyLAorIyBpZiAkMSBiZWdpbnMgd2l0aCBhIGRpZ2l0LCBhICdfJyBpcyBwcmVwZW5kZWQgYXMgd2VsbC4KK2Z1bmNfdHJfc2ggKCkKK3sKKyAgY2FzZSAkMSBpbgorICBbMC05XSogfCAqWyFhLXpBLVowLTlfXSopCisgICAgZnVuY190cl9zaF9yZXN1bHQ9YCRFQ0hPICIkMSIgfCAkU0VEICdzL15cKFswLTldXCkvX1wxLzsgcy9bXmEtekEtWjAtOV9dL18vZydgCisgICAgOzsKKyAgKiApCisgICAgZnVuY190cl9zaF9yZXN1bHQ9JDEKKyAgICA7OworICBlc2FjCit9CisKKworIyBmdW5jX3ZlcnNpb24KKyMgRWNobyB2ZXJzaW9uIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorZnVuY192ZXJzaW9uICgpCit7CisgICAgJG9wdF9kZWJ1ZworCisgICAgJFNFRCAtbiAnLyhDKS8hYiBnbworCTptb3JlCisJL1wuLyF7CisJICBOCisJICBzL1xuIyAvIC8KKwkgIGIgbW9yZQorCX0KKwk6Z28KKwkvXiMgJyRQUk9HUkFNJyAoR05VIC8sLyMgd2FycmFudHk7IC8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisgICAgICAgIHMvXCgoQylcKVsgMC05LC1dKlwoIFsxLTldWzAtOV0qXCkvXDFcMi8KKyAgICAgICAgcAorICAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgIGV4aXQgJD8KK30KKworIyBmdW5jX3VzYWdlCisjIEVjaG8gc2hvcnQgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK2Z1bmNfdXNhZ2UgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvXiMgICouKi0taGVscC8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisJcy9cJHByb2duYW1lLyckcHJvZ25hbWUnLworCXAKKyAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgZWNobworICAgICRFQ0hPICJydW4gXGAkcHJvZ25hbWUgLS1oZWxwIHwgbW9yZScgZm9yIGZ1bGwgdXNhZ2UiCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfaGVscCBbTk9FWElUXQorIyBFY2hvIGxvbmcgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdCwKKyMgdW5sZXNzICdub2V4aXQnIGlzIHBhc3NlZCBhcyBhcmd1bWVudC4KK2Z1bmNfaGVscCAoKQoreworICAgICRvcHRfZGVidWcKKworICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC8jIFJlcG9ydCBidWdzIHRvLyB7CisJOnByaW50CisgICAgICAgIHMvXiMgLy8KKwlzL14jICokLy8KKwlzKlwkcHJvZ25hbWUqJyRwcm9nbmFtZScqCisJcypcJGhvc3QqJyIkaG9zdCInKgorCXMqXCRTSEVMTConIiRTSEVMTCInKgorCXMqXCRMVENDKiciJExUQ0MiJyoKKwlzKlwkTFRDRkxBR1MqJyIkTFRDRkxBR1MiJyoKKwlzKlwkTEQqJyIkTEQiJyoKKwlzL1wkd2l0aF9nbnVfbGQvJyIkd2l0aF9nbnVfbGQiJy8KKwlzL1wkYXV0b21ha2VfdmVyc2lvbi8nImAoYXV0b21ha2UgLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KKwlzL1wkYXV0b2NvbmZfdmVyc2lvbi8nImAoYXV0b2NvbmYgLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KKwlwCisJZAorICAgICB9CisgICAgIC9eIyAuKiBob21lIHBhZ2U6L2IgcHJpbnQKKyAgICAgL14jIEdlbmVyYWwgaGVscCB1c2luZy9iIHByaW50CisgICAgICcgPCAiJHByb2dwYXRoIgorICAgIHJldD0kPworICAgIGlmIHRlc3QgLXogIiQxIjsgdGhlbgorICAgICAgZXhpdCAkcmV0CisgICAgZmkKK30KKworIyBmdW5jX21pc3NpbmdfYXJnIGFyZ25hbWUKKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciBhbmQgc2V0IGdsb2JhbAorIyBleGl0X2NtZC4KK2Z1bmNfbWlzc2luZ19hcmcgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisKKyAgICBmdW5jX2Vycm9yICJtaXNzaW5nIGFyZ3VtZW50IGZvciAkMS4iCisgICAgZXhpdF9jbWQ9ZXhpdAorfQorCisKKyMgZnVuY19zcGxpdF9zaG9ydF9vcHQgc2hvcnRvcHQKKyMgU2V0IGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWUgYW5kIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyBzaGVsbAorIyB2YXJpYWJsZXMgYWZ0ZXIgc3BsaXR0aW5nIFNIT1JUT1BUIGFmdGVyIHRoZSAybmQgY2hhcmFjdGVyLgorZnVuY19zcGxpdF9zaG9ydF9vcHQgKCkKK3sKKyAgICBteV9zZWRfc2hvcnRfb3B0PScxcy9eXCguLlwpLiokL1wxLztxJworICAgIG15X3NlZF9zaG9ydF9yZXN0PScxcy9eLi5cKC4qXCkkL1wxLztxJworCisgICAgZnVuY19zcGxpdF9zaG9ydF9vcHRfbmFtZT1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfc2hvcnRfb3B0ImAKKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmc9YCRFQ0hPICIkMSIgfCAkU0VEICIkbXlfc2VkX3Nob3J0X3Jlc3QiYAorfSAjIGZ1bmNfc3BsaXRfc2hvcnRfb3B0IG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19zcGxpdF9sb25nX29wdCBsb25nb3B0CisjIFNldCBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWUgYW5kIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnIHNoZWxsCisjIHZhcmlhYmxlcyBhZnRlciBzcGxpdHRpbmcgTE9OR09QVCBhdCB0aGUgYD0nIHNpZ24uCitmdW5jX3NwbGl0X2xvbmdfb3B0ICgpCit7CisgICAgbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtLVtePV0qXCk9LiovXDEvO3EnCisgICAgbXlfc2VkX2xvbmdfYXJnPScxcy9eLS1bXj1dKj0vLycKKworICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZT1gJEVDSE8gIiQxIiB8ICRTRUQgIiRteV9zZWRfbG9uZ19vcHQiYAorICAgIGZ1bmNfc3BsaXRfbG9uZ19vcHRfYXJnPWAkRUNITyAiJDEiIHwgJFNFRCAiJG15X3NlZF9sb25nX2FyZyJgCit9ICMgZnVuY19zcGxpdF9sb25nX29wdCBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworZXhpdF9jbWQ9OgorCisKKworCisKK21hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKK21hZ2ljX2V4ZT0iJSUlTUFHSUMgRVhFIHZhcmlhYmxlJSUlIgorCisjIEdsb2JhbCB2YXJpYWJsZXMuCitub25vcHQ9CitwcmVzZXJ2ZV9hcmdzPQorbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgorbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgorZXh0cmFjdGVkX2FyY2hpdmVzPQorZXh0cmFjdGVkX3NlcmlhbD0wCisKKyMgSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgaW4gYW55IG9mIHRoZSBhY3Rpb25zLCB0aGUgY29tbWFuZCBpbiBpdAorIyB3aWxsIGJlIGV4ZWNlZCBhdCB0aGUgZW5kLiAgVGhpcyBwcmV2ZW50cyBoZXJlLWRvY3VtZW50cyBmcm9tIGJlaW5nCisjIGxlZnQgb3ZlciBieSBzaGVsbHMuCitleGVjX2NtZD0KKworIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKKyMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgorZnVuY19hcHBlbmQgKCkKK3sKKyAgICBldmFsICIkezF9PVwkJHsxfVwkezJ9IgorfSAjIGZ1bmNfYXBwZW5kIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisjIGZ1bmNfYXBwZW5kX3F1b3RlZCB2YXIgdmFsdWUKKyMgUXVvdGUgVkFMVUUgYW5kIGFwcGVuZCB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUiwgc2VwYXJhdGVkCisjIGJ5IGEgc3BhY2UuCitmdW5jX2FwcGVuZF9xdW90ZWQgKCkKK3sKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkezJ9IgorICAgIGV2YWwgIiR7MX09XCQkezF9XFwgXCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKK30gIyBmdW5jX2FwcGVuZF9xdW90ZWQgbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgorZnVuY19hcml0aCAoKQoreworICAgIGZ1bmNfYXJpdGhfcmVzdWx0PWBleHByICIke0B9ImAKK30gIyBmdW5jX2FyaXRoIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19sZW4gc3RyaW5nCisjIFNUUklORyBtYXkgbm90IHN0YXJ0IHdpdGggYSBoeXBoZW4uCitmdW5jX2xlbiAoKQoreworICAgIGZ1bmNfbGVuX3Jlc3VsdD1gZXhwciAiJHsxfSIgOiAiLioiIDI+L2Rldi9udWxsIHx8IGVjaG8gJG1heF9jbWRfbGVuYAorfSAjIGZ1bmNfbGVuIG1heSBiZSByZXBsYWNlZCBieSBleHRlbmRlZCBzaGVsbCBpbXBsZW1lbnRhdGlvbgorCisKKyMgZnVuY19sbzJvIG9iamVjdAorZnVuY19sbzJvICgpCit7CisgICAgZnVuY19sbzJvX3Jlc3VsdD1gJEVDSE8gIiR7MX0iIHwgJFNFRCAiJGxvMm8iYAorfSAjIGZ1bmNfbG8ybyBtYXkgYmUgcmVwbGFjZWQgYnkgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb24KKworCisjIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQorZnVuY194Zm9ybSAoKQoreworICAgIGZ1bmNfeGZvcm1fcmVzdWx0PWAkRUNITyAiJHsxfSIgfCAkU0VEICdzL1wuW14uXSokLy5sby8nYAorfSAjIGZ1bmNfeGZvcm0gbWF5IGJlIHJlcGxhY2VkIGJ5IGV4dGVuZGVkIHNoZWxsIGltcGxlbWVudGF0aW9uCisKKworIyBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGZvbGxvd2VkIGJ5CisjIGEgY29uZmlndXJhdGlvbiBmYWlsdXJlIGhpbnQsIGFuZCBleGl0LgorZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICgpCit7CisgICAgZnVuY19lcnJvciAkezErIiRAIn0KKyAgICBmdW5jX2Vycm9yICJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorICAgIGZ1bmNfZmF0YWxfZXJyb3IgIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuIgorfQorCisKKyMgZnVuY19jb25maWcKKyMgRGlzcGxheSB0aGUgY29uZmlndXJhdGlvbiBmb3IgYWxsIHRoZSB0YWdzIGluIHRoaXMgc2NyaXB0LgorZnVuY19jb25maWcgKCkKK3sKKyAgICByZV9iZWdpbmNmPSdeIyAjIyMgQkVHSU4gTElCVE9PTCcKKyAgICByZV9lbmRjZj0nXiMgIyMjIEVORCBMSUJUT09MJworCisgICAgIyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgICAgJFNFRCAiMSwvJHJlX2JlZ2luY2YgQ09ORklHL2Q7LyRyZV9lbmRjZiBDT05GSUcvLFwkZCIgPCAiJHByb2dwYXRoIgorCisgICAgIyBOb3cgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgdGFncy4KKyAgICBmb3IgdGFnbmFtZSBpbiAkdGFnbGlzdDsgZG8KKyAgICAgICRTRUQgLW4gIi8kcmVfYmVnaW5jZiBUQUcgQ09ORklHOiAkdGFnbmFtZVwkLywvJHJlX2VuZGNmIFRBRyBDT05GSUc6ICR0YWduYW1lXCQvcCIgPCAiJHByb2dwYXRoIgorICAgIGRvbmUKKworICAgIGV4aXQgJD8KK30KKworIyBmdW5jX2ZlYXR1cmVzCisjIERpc3BsYXkgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4KK2Z1bmNfZmVhdHVyZXMgKCkKK3sKKyAgICBlY2hvICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGZpCisKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19lbmFibGVfdGFnIHRhZ25hbWUKKyMgVmVyaWZ5IHRoYXQgVEFHTkFNRSBpcyB2YWxpZCwgYW5kIGVpdGhlciBmbGFnIGFuIGVycm9yIGFuZCBleGl0LCBvcgorIyBlbmFibGUgdGhlIFRBR05BTUUgdGFnLiAgV2UgYWxzbyBhZGQgVEFHTkFNRSB0byB0aGUgZ2xvYmFsICR0YWdsaXN0CisjIHZhcmlhYmxlIGhlcmUuCitmdW5jX2VuYWJsZV90YWcgKCkKK3sKKyAgIyBHbG9iYWwgdmFyaWFibGU6CisgIHRhZ25hbWU9IiQxIgorCisgIHJlX2JlZ2luY2Y9Il4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCisgIHJlX2VuZGNmPSJeIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWVcJCIKKyAgc2VkX2V4dHJhY3RjZj0iLyRyZV9iZWdpbmNmLywvJHJlX2VuZGNmL3AiCisKKyAgIyBWYWxpZGF0ZSB0YWduYW1lLgorICBjYXNlICR0YWduYW1lIGluCisgICAgKlshLV9BLVphLXowLTksL10qKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWUiCisgICAgICA7OworICBlc2FjCisKKyAgIyBEb24ndCB0ZXN0IGZvciB0aGUgImRlZmF1bHQiIEMgdGFnLCBhcyB3ZSBrbm93IGl0J3MKKyAgIyB0aGVyZSBidXQgbm90IHNwZWNpYWxseSBtYXJrZWQuCisgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICBDQykgOzsKKyAgICAqKQorICAgICAgaWYgJEdSRVAgIiRyZV9iZWdpbmNmIiAiJHByb2dwYXRoIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwl0YWdsaXN0PSIkdGFnbGlzdCAkdGFnbmFtZSIKKworCSMgRXZhbHVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uICBCZSBjYXJlZnVsIHRvIHF1b3RlIHRoZSBwYXRoCisJIyBhbmQgdGhlIHNlZCBzY3JpcHQsIHRvIGF2b2lkIHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlLCBidXQKKwkjIGFsc28gZG9uJ3QgdXNlIG5vbi1wb3J0YWJsZSBxdW90ZXMgd2l0aGluIGJhY2txdW90ZXMgd2l0aGluCisJIyBxdW90ZXMgd2UgaGF2ZSB0byBkbyBpdCBpbiAyIHN0ZXBzOgorCWV4dHJhY3RlZGNmPWAkU0VEIC1uIC1lICIkc2VkX2V4dHJhY3RjZiIgPCAiJHByb2dwYXRoImAKKwlldmFsICIkZXh0cmFjdGVkY2YiCisgICAgICBlbHNlCisJZnVuY19lcnJvciAiaWdub3JpbmcgdW5rbm93biB0YWcgJHRhZ25hbWUiCisgICAgICBmaQorICAgICAgOzsKKyAgZXNhYworfQorCisjIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorIyBFbnN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgbTQgbWFjcm9zLCBhbmQgbGlidG9vbCBzY3JpcHQgZnJvbSB0aGUgc2FtZQorIyByZWxlYXNlIG9mIGxpYnRvb2wuCitmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2ggKCkKK3sKKyAgaWYgdGVzdCAiJHBhY2thZ2VfcmV2aXNpb24iICE9ICIkbWFjcm9fcmV2aXNpb24iOyB0aGVuCisgICAgaWYgdGVzdCAiJFZFUlNJT04iICE9ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRtYWNyb192ZXJzaW9uIjsgdGhlbgorICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQorJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIGFuIG9sZGVyIHJlbGVhc2UuCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBlbHNlCisgICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCiskcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gJFBBQ0tBR0UgJG1hY3JvX3ZlcnNpb24uCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbiwKKyRwcm9nbmFtZTogYnV0IHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIHJldmlzaW9uICRtYWNyb19yZXZpc2lvbi4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24KKyRwcm9nbmFtZTogb2YgJFBBQ0tBR0UgJFZFUlNJT04gYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICBmaQorCisgICAgZXhpdCAkRVhJVF9NSVNNQVRDSAorICBmaQorfQorCisKKyMgU2hvcnRoYW5kIGZvciAtLW1vZGU9Zm9vLCBvbmx5IHZhbGlkIGFzIHRoZSBmaXJzdCBhcmd1bWVudAorY2FzZSAkMSBpbgorY2xlYW58Y2xlYXxjbGV8Y2wpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNsZWFuICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2NvbXBpbGV8Y29tcGlsfGNvbXBpfGNvbXB8Y29tfGNvfGMpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGNvbXBpbGUgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworZXhlY3V0ZXxleGVjdXR8ZXhlY3V8ZXhlY3xleGV8ZXh8ZSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZXhlY3V0ZSAkezErIiRAIn07IHNoaWZ0CisgIDs7CitmaW5pc2h8ZmluaXN8ZmluaXxmaW58Zml8ZikKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgZmluaXNoICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2luc3RhbGx8aW5zdGFsfGluc3RhfGluc3R8aW5zfGlufGkpCisgIHNoaWZ0OyBzZXQgZHVtbXkgLS1tb2RlIGluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAorICA7OworbGlua3xsaW58bGl8bCkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgbGluayAkezErIiRAIn07IHNoaWZ0CisgIDs7Cit1bmluc3RhbGx8dW5pbnN0YWx8dW5pbnN0YXx1bmluc3R8dW5pbnN8dW5pbnx1bml8dW58dSkKKyAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgdW5pbnN0YWxsICR7MSsiJEAifTsgc2hpZnQKKyAgOzsKK2VzYWMKKworCisKKyMgT3B0aW9uIGRlZmF1bHRzOgorb3B0X2RlYnVnPToKK29wdF9kcnlfcnVuPWZhbHNlCitvcHRfY29uZmlnPWZhbHNlCitvcHRfcHJlc2VydmVfZHVwX2RlcHM9ZmFsc2UKK29wdF9mZWF0dXJlcz1mYWxzZQorb3B0X2ZpbmlzaD1mYWxzZQorb3B0X2hlbHA9ZmFsc2UKK29wdF9oZWxwX2FsbD1mYWxzZQorb3B0X3NpbGVudD06CitvcHRfdmVyYm9zZT06CitvcHRfc2lsZW50PWZhbHNlCitvcHRfdmVyYm9zZT1mYWxzZQorCisKKyMgUGFyc2Ugb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5LiAgVGhpcyBjb21lcyBhcyBzb29uIGFzIHBvc3NpYmxlIGluIHRoZQorIyBzY3JpcHQgdG8gbWFrZSB0aGluZ3MgbGlrZSBgLS12ZXJzaW9uJyBoYXBwZW4gYXMgcXVpY2tseSBhcyB3ZSBjYW4uCit7CisgICMgdGhpcyBqdXN0IGVhc2VzIGV4aXQgaGFuZGxpbmcKKyAgd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgICBvcHQ9IiQxIgorICAgIHNoaWZ0CisgICAgY2FzZSAkb3B0IGluCisgICAgICAtLWRlYnVnfC14KQlvcHRfZGVidWc9J3NldCAteCcKKwkJCWZ1bmNfZWNobyAiZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKKwkJCSRvcHRfZGVidWcKKwkJCTs7CisgICAgICAtLWRyeS1ydW58LS1kcnlydW58LW4pCisJCQlvcHRfZHJ5X3J1bj06CisJCQk7OworICAgICAgLS1jb25maWcpCisJCQlvcHRfY29uZmlnPToKK2Z1bmNfY29uZmlnCisJCQk7OworICAgICAgLS1kbG9wZW58LWRsb3BlbikKKwkJCW9wdGFyZz0iJDEiCisJCQlvcHRfZGxvcGVuPSIke29wdF9kbG9wZW4rJG9wdF9kbG9wZW4KK30kb3B0YXJnIgorCQkJc2hpZnQKKwkJCTs7CisgICAgICAtLXByZXNlcnZlLWR1cC1kZXBzKQorCQkJb3B0X3ByZXNlcnZlX2R1cF9kZXBzPToKKwkJCTs7CisgICAgICAtLWZlYXR1cmVzKQorCQkJb3B0X2ZlYXR1cmVzPToKK2Z1bmNfZmVhdHVyZXMKKwkJCTs7CisgICAgICAtLWZpbmlzaCkKKwkJCW9wdF9maW5pc2g9Ogorc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAorCQkJOzsKKyAgICAgIC0taGVscCkKKwkJCW9wdF9oZWxwPToKKwkJCTs7CisgICAgICAtLWhlbHAtYWxsKQorCQkJb3B0X2hlbHBfYWxsPToKK29wdF9oZWxwPSc6IGhlbHAtYWxsJworCQkJOzsKKyAgICAgIC0tbW9kZSkKKwkJCXRlc3QgJCMgPSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgJG9wdCAmJiBicmVhaworCQkJb3B0YXJnPSIkMSIKKwkJCW9wdF9tb2RlPSIkb3B0YXJnIgorY2FzZSAkb3B0YXJnIGluCisgICMgVmFsaWQgbW9kZSBhcmd1bWVudHM6CisgIGNsZWFufGNvbXBpbGV8ZXhlY3V0ZXxmaW5pc2h8aW5zdGFsbHxsaW5rfHJlbGlua3x1bmluc3RhbGwpIDs7CisKKyAgIyBDYXRjaCBhbnl0aGluZyBlbHNlIGFzIGFuIGVycm9yCisgICopIGZ1bmNfZXJyb3IgImludmFsaWQgYXJndW1lbnQgZm9yICRvcHQiCisgICAgIGV4aXRfY21kPWV4aXQKKyAgICAgYnJlYWsKKyAgICAgOzsKK2VzYWMKKwkJCXNoaWZ0CisJCQk7OworICAgICAgLS1uby1zaWxlbnR8LS1uby1xdWlldCkKKwkJCW9wdF9zaWxlbnQ9ZmFsc2UKK2Z1bmNfYXBwZW5kIHByZXNlcnZlX2FyZ3MgIiAkb3B0IgorCQkJOzsKKyAgICAgIC0tbm8tdmVyYm9zZSkKKwkJCW9wdF92ZXJib3NlPWZhbHNlCitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKKwkJCTs7CisgICAgICAtLXNpbGVudHwtLXF1aWV0KQorCQkJb3B0X3NpbGVudD06CitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKKyAgICAgICAgb3B0X3ZlcmJvc2U9ZmFsc2UKKwkJCTs7CisgICAgICAtLXZlcmJvc2V8LXYpCisJCQlvcHRfdmVyYm9zZT06CitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCIKK29wdF9zaWxlbnQ9ZmFsc2UKKwkJCTs7CisgICAgICAtLXRhZykKKwkJCXRlc3QgJCMgPSAwICYmIGZ1bmNfbWlzc2luZ19hcmcgJG9wdCAmJiBicmVhaworCQkJb3B0YXJnPSIkMSIKKwkJCW9wdF90YWc9IiRvcHRhcmciCitmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgJG9wdCAkb3B0YXJnIgorZnVuY19lbmFibGVfdGFnICIkb3B0YXJnIgorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgIC1cP3wtaCkJCWZ1bmNfdXNhZ2UJCQkJOzsKKyAgICAgIC0taGVscCkJCWZ1bmNfaGVscAkJCQk7OworICAgICAgLS12ZXJzaW9uKQlmdW5jX3ZlcnNpb24JCQkJOzsKKworICAgICAgIyBTZXBhcmF0ZSBvcHRhcmdzIHRvIGxvbmcgb3B0aW9uczoKKyAgICAgIC0tKj0qKQorCQkJZnVuY19zcGxpdF9sb25nX29wdCAiJG9wdCIKKwkJCXNldCBkdW1teSAiJGZ1bmNfc3BsaXRfbG9uZ19vcHRfbmFtZSIgIiRmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZyIgJHsxKyIkQCJ9CisJCQlzaGlmdAorCQkJOzsKKworICAgICAgIyBTZXBhcmF0ZSBub24tYXJndW1lbnQgc2hvcnQgb3B0aW9uczoKKyAgICAgIC1cPyp8LWgqfC1uKnwtdiopCisJCQlmdW5jX3NwbGl0X3Nob3J0X29wdCAiJG9wdCIKKwkJCXNldCBkdW1teSAiJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWUiICItJGZ1bmNfc3BsaXRfc2hvcnRfb3B0X2FyZyIgJHsxKyIkQCJ9CisJCQlzaGlmdAorCQkJOzsKKworICAgICAgLS0pCQlicmVhawkJCQkJOzsKKyAgICAgIC0qKQkJZnVuY19mYXRhbF9oZWxwICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdCciIDs7CisgICAgICAqKQkJc2V0IGR1bW15ICIkb3B0IiAkezErIiRAIn07CXNoaWZ0OyBicmVhayAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAjIFZhbGlkYXRlIG9wdGlvbnM6CisKKyAgIyBzYXZlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQKKyAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisgICAgbm9ub3B0PSIkb3B0IgorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBwcmVzZXJ2ZSAtLWRlYnVnCisgIHRlc3QgIiRvcHRfZGVidWciID0gOiB8fCBmdW5jX2FwcGVuZCBwcmVzZXJ2ZV9hcmdzICIgLS1kZWJ1ZyIKKworICBjYXNlICRob3N0IGluCisgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKnB3MzIqIHwgKmNlZ2NjKikKKyAgICAgICMgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0aW9ucyBpbiAkcG9zdGRlcHMgYW5kICRwcmVkZXBzCisgICAgICBvcHRfZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPToKKyAgICAgIDs7CisgICAgKikKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9JG9wdF9wcmVzZXJ2ZV9kdXBfZGVwcworICAgICAgOzsKKyAgZXNhYworCisgICRvcHRfaGVscCB8fCB7CisgICAgIyBTYW5pdHkgY2hlY2tzIGZpcnN0OgorICAgIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIm5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiCisgICAgZmkKKworICAgICMgRGFyd2luIHN1Y2tzCisgICAgZXZhbCBzdGRfc2hyZXh0PVwiJHNocmV4dF9jbWRzXCIKKworICAgICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCisgICAgaWYgdGVzdCAtbiAiJG9wdF9kbG9wZW4iICYmIHRlc3QgIiRvcHRfbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgorICAgICAgZnVuY19lcnJvciAidW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIgorICAgICAgJEVDSE8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgorICAgIGdlbmVyaWNfaGVscD0iJGhlbHAiCisgICAgaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCAtLW1vZGU9JG9wdF9tb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisgIH0KKworCisgICMgQmFpbCBpZiB0aGUgb3B0aW9ucyB3ZXJlIHNjcmV3ZWQKKyAgJGV4aXRfY21kICRFWElUX0ZBSUxVUkUKK30KKworCisKKworIyMgLS0tLS0tLS0tLS0gIyMKKyMjICAgIE1haW4uICAgICMjCisjIyAtLS0tLS0tLS0tLSAjIworCisjIGZ1bmNfbGFsaWJfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sYWxpYl9wICgpCit7CisgICAgdGVzdCAtZiAiJDEiICYmCisgICAgICAkU0VEIC1lIDRxICIkMSIgMj4vZGV2L251bGwgXAorICAgICAgICB8ICRHUkVQICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIgPiAvZGV2L251bGwgMj4mMQorfQorCisjIGZ1bmNfbGFsaWJfdW5zYWZlX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCBgLmxhJyBsaWJyYXJ5IG9yIGAubG8nIG9iamVjdCBmaWxlLgorIyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHNhbWUgY2hlY2sgYXMgZnVuY19sYWxpYl9wIHdpdGhvdXQKKyMgcmVzb3J0aW5nIHRvIGV4dGVybmFsIHByb2dyYW1zLiAgVG8gdGhpcyBlbmQsIGl0IHJlZGlyZWN0cyBzdGRpbiBhbmQKKyMgY2xvc2VzIGl0IGFmdGVyd2FyZHMsIHdpdGhvdXQgc2F2aW5nIHRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IuCisjIEFzIGEgc2FmZXR5IG1lYXN1cmUsIHVzZSBpdCBvbmx5IHdoZXJlIGEgbmVnYXRpdmUgcmVzdWx0IHdvdWxkIGJlCisjIGZhdGFsIGFueXdheS4gIFdvcmtzIGlmIGBmaWxlJyBkb2VzIG5vdCBleGlzdC4KK2Z1bmNfbGFsaWJfdW5zYWZlX3AgKCkKK3sKKyAgICBsYWxpYl9wPW5vCisgICAgaWYgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXIgIiQxIiAmJiBleGVjIDU8JjAgPCIkMSI7IHRoZW4KKwlmb3IgbGFsaWJfcF9sIGluIDEgMiAzIDQKKwlkbworCSAgICByZWFkIGxhbGliX3BfbGluZQorCSAgICBjYXNlICIkbGFsaWJfcF9saW5lIiBpbgorCQlcI1wgR2VuZXJhdGVkXCBieVwgKiRQQUNLQUdFKiApIGxhbGliX3A9eWVzOyBicmVhazs7CisJICAgIGVzYWMKKwlkb25lCisJZXhlYyAwPCY1IDU8Ji0KKyAgICBmaQorICAgIHRlc3QgIiRsYWxpYl9wIiA9IHllcworfQorCisjIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAoKQoreworICAgIGZ1bmNfbGFsaWJfcCAiJDEiCit9CisKKyMgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBleGVjdXRhYmxlCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICgpCit7CisgICAgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9CisgICAgY2FzZSAkMSBpbgorICAgICouZXhlKSA7OworICAgICopIGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4PS5leGUgOzsKKyAgICBlc2FjCisgICAgJEdSRVAgIiRtYWdpY19leGUiICIkMSRmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeCIgPi9kZXYvbnVsbCAyPiYxCit9CisKKyMgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSBmaWxlCisjIEFzc3VtZXMgZmlsZSBpcyBhbiBsdHdyYXBwZXJfZXhlY3V0YWJsZQorIyB1c2VzICRmaWxlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZmlsZW5hbWUgZm9yIGEKKyMgdGVtcG9yYXJ5IGx0d3JhcHBlcl9zY3JpcHQuCitmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICgpCit7CisgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJDEiICIiICIuIgorICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdC8kb2JqZGlyLyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fV9sdHNod3JhcHBlciIKK30KKworIyBmdW5jX2x0d3JhcHBlcl9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb3Igd3JhcHBlciBleGVjdXRhYmxlCisjIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhIGJhc2ljIHNhbml0eSBjaGVjazsgaXQgd2lsbCBoYXJkbHkgZmx1c2ggb3V0CisjIGRldGVybWluZWQgaW1wb3N0ZXJzLgorZnVuY19sdHdyYXBwZXJfcCAoKQoreworICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkMSIgfHwgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkMSIKK30KKworCisjIGZ1bmNfZXhlY3V0ZV9jbWRzIGNvbW1hbmRzIGZhaWxfY21kCisjIEV4ZWN1dGUgdGlsZGUtZGVsaW1pdGVkIENPTU1BTkRTLgorIyBJZiBGQUlMX0NNRCBpcyBnaXZlbiwgZXZhbCB0aGF0IHVwb24gZmFpbHVyZS4KKyMgRkFJTF9DTUQgbWF5IHJlYWQtYWNjZXNzIHRoZSBjdXJyZW50IGNvbW1hbmQgaW4gdmFyaWFibGUgQ01EIQorZnVuY19leGVjdXRlX2NtZHMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgc2F2ZV9pZnM9JElGUzsgSUZTPSd+JworICAgIGZvciBjbWQgaW4gJDE7IGRvCisgICAgICBJRlM9JHNhdmVfaWZzCisgICAgICBldmFsIGNtZD1cIiRjbWRcIgorICAgICAgZnVuY19zaG93X2V2YWwgIiRjbWQiICIkezItOn0iCisgICAgZG9uZQorICAgIElGUz0kc2F2ZV9pZnMKK30KKworCisjIGZ1bmNfc291cmNlIGZpbGUKKyMgU291cmNlIEZJTEUsIGFkZGluZyBkaXJlY3RvcnkgY29tcG9uZW50IGlmIG5lY2Vzc2FyeS4KKyMgTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3Nhcnkgb24gY3lnd2luL21pbmd3IHRvIGFwcGVuZCBhIGRvdCB0bworIyBGSUxFIGV2ZW4gaWYgYm90aCBGSUxFIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCisjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKKyMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KK2Z1bmNfc291cmNlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGNhc2UgJDEgaW4KKyAgICAqLyogfCAqXFwqKQkuICIkMSIgOzsKKyAgICAqKQkJLiAiLi8kMSIgOzsKKyAgICBlc2FjCit9CisKKworIyBmdW5jX3Jlc29sdmVfc3lzcm9vdCBQQVRICisjIFJlcGxhY2UgYSBsZWFkaW5nID0gaW4gUEFUSCB3aXRoIGEgc3lzcm9vdC4gIFN0b3JlIHRoZSByZXN1bHQgaW50bworIyBmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKK2Z1bmNfcmVzb2x2ZV9zeXNyb290ICgpCit7CisgIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdD0kMQorICBjYXNlICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQgaW4KKyAgPSopCisgICAgZnVuY19zdHJpcG5hbWUgJz0nICcnICIkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdD0kbHRfc3lzcm9vdCRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICA7OworICBlc2FjCit9CisKKyMgZnVuY19yZXBsYWNlX3N5c3Jvb3QgUEFUSAorIyBJZiBQQVRIIGJlZ2lucyB3aXRoIHRoZSBzeXNyb290LCByZXBsYWNlIGl0IHdpdGggPSBhbmQKKyMgc3RvcmUgdGhlIHJlc3VsdCBpbnRvIGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdC4KK2Z1bmNfcmVwbGFjZV9zeXNyb290ICgpCit7CisgIGNhc2UgIiRsdF9zeXNyb290OiQxIiBpbgorICA/KjoiJGx0X3N5c3Jvb3QiKikKKyAgICBmdW5jX3N0cmlwbmFtZSAiJGx0X3N5c3Jvb3QiICcnICIkMSIKKyAgICBmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQ9Ij0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorICAgIDs7CisgICopCisgICAgIyBJbmNsdWRpbmcgbm8gc3lzcm9vdC4KKyAgICBmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQ9JDEKKyAgICA7OworICBlc2FjCit9CisKKyMgZnVuY19pbmZlcl90YWcgYXJnCisjIEluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIHRvIHVzZSBpZiBhbnkgYXJlIGF2YWlsYWJsZSBhbmQKKyMgaWYgb25lIHdhc24ndCBjaG9zZW4gdmlhIHRoZSAiLS10YWciIGNvbW1hbmQgbGluZSBvcHRpb24uCisjIE9ubHkgYXR0ZW1wdCB0aGlzIGlmIHRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlCisjIGNvbW1hbmQgZG9lc24ndCBtYXRjaCB0aGUgZGVmYXVsdCBjb21waWxlci4KKyMgYXJnIGlzIHVzdWFsbHkgb2YgdGhlIGZvcm0gJ2djYyAuLi4nCitmdW5jX2luZmVyX3RhZyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBpZiB0ZXN0IC1uICIkYXZhaWxhYmxlX3RhZ3MiICYmIHRlc3QgLXogIiR0YWduYW1lIjsgdGhlbgorICAgICAgQ0NfcXVvdGVkPQorICAgICAgZm9yIGFyZyBpbiAkQ0M7IGRvCisJZnVuY19hcHBlbmRfcXVvdGVkIENDX3F1b3RlZCAiJGFyZyIKKyAgICAgIGRvbmUKKyAgICAgIENDX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ2AKKyAgICAgIENDX3F1b3RlZF9leHBhbmRlZD1gZnVuY19lY2hvX2FsbCAkQ0NfcXVvdGVkYAorICAgICAgY2FzZSAkQCBpbgorICAgICAgIyBCbGFua3MgaW4gdGhlIGNvbW1hbmQgbWF5IGhhdmUgYmVlbiBzdHJpcHBlZCBieSB0aGUgY2FsbGluZyBzaGVsbCwKKyAgICAgICMgYnV0IG5vdCBmcm9tIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIGNvbmZpZ3VyZSB3YXMgcnVuLgorICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiAkQ0NfZXhwYW5kZWQgIiogfCAiJENDX2V4cGFuZGVkICIqIHwgXAorICAgICAgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgJENDX3F1b3RlZF9leHBhbmRlZCAiKiB8ICIkQ0NfcXVvdGVkX2V4cGFuZGVkICIqKSA7OworICAgICAgIyBCbGFua3MgYXQgdGhlIHN0YXJ0IG9mICRiYXNlX2NvbXBpbGUgd2lsbCBjYXVzZSB0aGlzIHRvIGZhaWwKKyAgICAgICMgaWYgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoZW0gYXMgd2VsbC4KKyAgICAgICopCisJZm9yIHogaW4gJGF2YWlsYWJsZV90YWdzOyBkbworCSAgaWYgJEdSRVAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR6JCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgorCSAgICBldmFsICJgJHtTRUR9IC1uIC1lICcvXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvLC9eIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJyR6JyQvcCcgPCAkcHJvZ3BhdGhgIgorCSAgICBDQ19xdW90ZWQ9CisJICAgIGZvciBhcmcgaW4gJENDOyBkbworCSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkgICAgICBmdW5jX2FwcGVuZF9xdW90ZWQgQ0NfcXVvdGVkICIkYXJnIgorCSAgICBkb25lCisJICAgIENDX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ2AKKwkgICAgQ0NfcXVvdGVkX2V4cGFuZGVkPWBmdW5jX2VjaG9fYWxsICRDQ19xdW90ZWRgCisJICAgIGNhc2UgIiRAICIgaW4KKwkgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiAkQ0NfZXhwYW5kZWQgIiogfCAiJENDX2V4cGFuZGVkICIqIHwgXAorCSAgICAiICRDQ19xdW90ZWQiKiB8ICIkQ0NfcXVvdGVkICIqIHwgIiAkQ0NfcXVvdGVkX2V4cGFuZGVkICIqIHwgIiRDQ19xdW90ZWRfZXhwYW5kZWQgIiopCisJICAgICAgIyBUaGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZSBjb21tYW5kIG1hdGNoZXMKKwkgICAgICAjIHRoZSBvbmUgaW4gdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uLgorCSAgICAgICMgQXNzdW1lIHRoaXMgaXMgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9uIHdlIHdhbnQuCisJICAgICAgdGFnbmFtZT0kegorCSAgICAgIGJyZWFrCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKwlkb25lCisJIyBJZiAkdGFnbmFtZSBzdGlsbCBpc24ndCBzZXQsIHRoZW4gbm8gdGFnZ2VkIGNvbmZpZ3VyYXRpb24KKwkjIHdhcyBmb3VuZCBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCB0aGUgIi0tdGFnIiBjb21tYW5kCisJIyBsaW5lIG9wdGlvbiBtdXN0IGJlIHVzZWQuCisJaWYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisJICBmdW5jX2VjaG8gInVuYWJsZSB0byBpbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgInNwZWNpZnkgYSB0YWcgd2l0aCBcYC0tdGFnJyIKKyMJZWxzZQorIwkgIGZ1bmNfdmVyYm9zZSAidXNpbmcgJHRhZ25hbWUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24iCisJZmkKKwk7OworICAgICAgZXNhYworICAgIGZpCit9CisKKworCisjIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3Qgb3V0cHV0X25hbWUgcGljX25hbWUgbm9ucGljX25hbWUKKyMgQ3JlYXRlIGEgbGlidG9vbCBvYmplY3QgZmlsZSAoYW5hbG9nb3VzIHRvIGEgIi5sYSIgZmlsZSksCisjIGJ1dCBkb24ndCBjcmVhdGUgaXQgaWYgd2UncmUgZG9pbmcgYSBkcnkgcnVuLgorZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAoKQoreworICAgIHdyaXRlX2xpYm9iaj0kezF9CisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHdyaXRlX2xvYmo9XCckezJ9XCcKKyAgICBlbHNlCisgICAgICB3cml0ZV9sb2JqPW5vbmUKKyAgICBmaQorCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgd3JpdGVfb2xkb2JqPVwnJHszfVwnCisgICAgZWxzZQorICAgICAgd3JpdGVfb2xkb2JqPW5vbmUKKyAgICBmaQorCisgICAgJG9wdF9kcnlfcnVuIHx8IHsKKyAgICAgIGNhdCA+JHt3cml0ZV9saWJvYmp9VCA8PEVPRgorIyAkd3JpdGVfbGlib2JqIC0gYSBsaWJ0b29sIG9iamVjdCBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgTmFtZSBvZiB0aGUgUElDIG9iamVjdC4KK3BpY19vYmplY3Q9JHdyaXRlX2xvYmoKKworIyBOYW1lIG9mIHRoZSBub24tUElDIG9iamVjdAorbm9uX3BpY19vYmplY3Q9JHdyaXRlX29sZG9iagorCitFT0YKKyAgICAgICRNViAiJHt3cml0ZV9saWJvYmp9VCIgIiR7d3JpdGVfbGlib2JqfSIKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRklMRSBOQU1FIEFORCBQQVRIIENPTlZFUlNJT04gSEVMUEVSIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgQVJHCisjIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyB3aGVuICRidWlsZCBpcyAqbml4LAorIyBhbmQgJGhvc3QgaXMgbWluZ3csIGN5Z3dpbiwgb3Igc29tZSBvdGhlciB3MzIgZW52aXJvbm1lbnQuIFJlbGllcyBvbiBhCisjIGNvcnJlY3RseSBjb25maWd1cmVkIHdpbmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlLCB3aXRoIHRoZSB3aW5lcGF0aCBwcm9ncmFtCisjIGluICRidWlsZCdzICRQQVRILgorIworIyBBUkcgaXMgdGhlICRidWlsZCBmaWxlIG5hbWUgdG8gYmUgY29udmVydGVkIHRvIHczMiBmb3JtYXQuCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gJGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0LCBhbmQgd2lsbAorIyBiZSBlbXB0eSBvbiBlcnJvciAob3Igd2hlbiBBUkcgaXMgZW1wdHkpCitmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFVuZm9ydHVuYXRlbHksIHdpbmVwYXRoIGRvZXMgbm90IGV4aXQgd2l0aCBhIG5vbi16ZXJvIGVycm9yIGNvZGUsIHNvIHdlCisgICAgIyBhcmUgZm9yY2VkIHRvIGNoZWNrIHRoZSBjb250ZW50cyBvZiBzdGRvdXQuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKKyAgICAjIGNvbW1hbmQgaXMgbm90IGZvdW5kLCB0aGUgc2hlbGwgd2lsbCBzZXQgYW4gZXhpdCBjb2RlIG9mIDEyNyBhbmQgcHJpbnQKKyAgICAjICphbiBlcnJvciBtZXNzYWdlKiB0byBzdGRvdXQuIFNvIHdlIG11c3QgY2hlY2sgZm9yIGJvdGggZXJyb3IgY29kZSBvZgorICAgICMgemVybyBBTkQgbm9uLWVtcHR5IHN0ZG91dCwgd2hpY2ggZXhwbGFpbnMgdGhlIG9kZCBjb25zdHJ1Y3Rpb246CisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXA9YHdpbmVwYXRoIC13ICIkMSIgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAiJD8iIC1lcSAwICYmIHRlc3QgLW4gIiR7ZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXB9IjsgdGhlbgorICAgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQ9YCRFQ0hPICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl90bXAiIHwKKyAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAorICAgIGVsc2UKKyAgICAgIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0PQorICAgIGZpCisgIGZpCit9CisjIGVuZDogZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMiBBUkcKKyMgSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgcGF0aCBjb252ZXJzaW9uIGZ1bmN0aW9ucyB3aGVuICRidWlsZCBpcyAqbml4LCBhbmQKKyMgJGhvc3QgaXMgbWluZ3csIGN5Z3dpbiwgb3Igc29tZSBvdGhlciB3MzIgZW52aXJvbm1lbnQuIFJlbGllcyBvbiBhIGNvcnJlY3RseQorIyBjb25maWd1cmVkIHdpbmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlLCB3aXRoIHRoZSB3aW5lcGF0aCBwcm9ncmFtIGluICRidWlsZCdzCisjICRQQVRILiBBc3N1bWVzIEFSRyBoYXMgbm8gbGVhZGluZyBvciB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzLgorIworIyBBUkcgaXMgcGF0aCB0byBiZSBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgZm9ybWF0IHRvIHdpbjMyLgorIyBSZXN1bHQgaXMgYXZhaWxhYmxlIGluICRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdC4KKyMgVW5jb252ZXJ0aWJsZSBmaWxlIChkaXJlY3RvcnkpIG5hbWVzIGluIEFSRyBhcmUgc2tpcHBlZDsgaWYgbm8gZGlyZWN0b3J5IG5hbWVzCisjIGFyZSBjb252ZXJ0aWJsZSwgdGhlbiB0aGUgcmVzdWx0IG1heSBiZSBlbXB0eS4KK2Z1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICAjIHVuZm9ydHVuYXRlbHksIHdpbmVwYXRoIGRvZXNuJ3QgY29udmVydCBwYXRocywgb25seSBmaWxlIG5hbWVzCisgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0PSIiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgIG9sZElGUz0kSUZTCisgICAgSUZTPToKKyAgICBmb3IgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9mIGluICQxOyBkbworICAgICAgSUZTPSRvbGRJRlMKKyAgICAgIGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzIgIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX2YiCisgICAgICBpZiB0ZXN0IC1uICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiIDsgdGhlbgorICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQiOyB0aGVuCisgICAgICAgICAgZnVuY19jb252ZXJ0X2NvcmVfcGF0aF93aW5lX3RvX3czMl9yZXN1bHQ9IiRmdW5jX2NvbnZlcnRfY29yZV9maWxlX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZ1bmNfYXBwZW5kIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0ICI7JGZ1bmNfY29udmVydF9jb3JlX2ZpbGVfd2luZV90b193MzJfcmVzdWx0IgorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSRvbGRJRlMKKyAgZmkKK30KKyMgZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyCisKKworIyBmdW5jX2N5Z3BhdGggQVJHUy4uLgorIyBXcmFwcGVyIGFyb3VuZCBjYWxsaW5nIHRoZSBjeWdwYXRoIHByb2dyYW0gdmlhIExUX0NZR1BBVEguIFRoaXMgaXMgdXNlZCB3aGVuCisjIHdoZW4gKDEpICRidWlsZCBpcyAqbml4IGFuZCBDeWd3aW4gaXMgaG9zdGVkIHZpYSBhIHdpbmUgZW52aXJvbm1lbnQ7IG9yICgyKQorIyAkYnVpbGQgaXMgTVNZUyBhbmQgJGhvc3QgaXMgQ3lnd2luLCBvciAoMykgJGJ1aWxkIGlzIEN5Z3dpbi4gSW4gY2FzZSAoMSkgb3IKKyMgKDIpLCByZXR1cm5zIHRoZSBDeWd3aW4gZmlsZSBuYW1lIG9yIHBhdGggaW4gZnVuY19jeWdwYXRoX3Jlc3VsdCAoaW5wdXQKKyMgZmlsZSBuYW1lIG9yIHBhdGggaXMgYXNzdW1lZCB0byBiZSBpbiB3MzIgZm9ybWF0LCBhcyBwcmV2aW91c2x5IGNvbnZlcnRlZAorIyBmcm9tICRidWlsZCdzICpuaXggb3IgTVNZUyBmb3JtYXQpLiBJbiBjYXNlICgzKSwgcmV0dXJucyB0aGUgdzMyIGZpbGUgbmFtZQorIyBvciBwYXRoIGluIGZ1bmNfY3lncGF0aF9yZXN1bHQgKGlucHV0IGZpbGUgbmFtZSBvciBwYXRoIGlzIGFzc3VtZWQgdG8gYmUgaW4KKyMgQ3lnd2luIGZvcm1hdCkuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGVycm9yLgorIworIyBBUkdTIGFyZSBwYXNzZWQgdG8gY3lncGF0aCwgd2l0aCB0aGUgbGFzdCBvbmUgYmVpbmcgdGhlIGZpbGUgbmFtZSBvciBwYXRoIHRvCisjIGJlIGNvbnZlcnRlZC4KKyMKKyMgU3BlY2lmeSB0aGUgYWJzb2x1dGUgKm5peCAob3IgdzMyKSBuYW1lIHRvIGN5Z3BhdGggaW4gdGhlIExUX0NZR1BBVEgKKyMgZW52aXJvbm1lbnQgdmFyaWFibGU7IGRvIG5vdCBwdXQgaXQgaW4gJFBBVEguCitmdW5jX2N5Z3BhdGggKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC1uICIkTFRfQ1lHUEFUSCIgJiYgdGVzdCAtZiAiJExUX0NZR1BBVEgiOyB0aGVuCisgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD1gJExUX0NZR1BBVEggIiRAIiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICIkPyIgLW5lIDA7IHRoZW4KKyAgICAgICMgb24gZmFpbHVyZSwgZW5zdXJlIHJlc3VsdCBpcyBlbXB0eQorICAgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD0KKyAgICBmaQorICBlbHNlCisgICAgZnVuY19jeWdwYXRoX3Jlc3VsdD0KKyAgICBmdW5jX2Vycm9yICJMVF9DWUdQQVRIIGlzIGVtcHR5IG9yIHNwZWNpZmllcyBub24tZXhpc3RlbnQgZmlsZTogXGAkTFRfQ1lHUEFUSCciCisgIGZpCit9CisjZW5kOiBmdW5jX2N5Z3BhdGgKKworCisjIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBvciBwYXRoIEFSRyBmcm9tIE1TWVMgZm9ybWF0IHRvIHczMiBmb3JtYXQuICBSZXR1cm4KKyMgcmVzdWx0IGluIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgIyBhd2t3YXJkOiBjbWQgYXBwZW5kcyBzcGFjZXMgdG8gcmVzdWx0CisgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdD1gKCBjbWQgLy9jIGVjaG8gIiQxIiApIDI+L2Rldi9udWxsIHwKKyAgICAkU0VEIC1lICdzL1sgXSokLy8nIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCit9CisjZW5kOiBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgQVJHMSBBUkcyCisjIFZlcmlmeSB0aGF0IEFSRzEgKGEgZmlsZSBuYW1lIGluICRidWlsZCBmb3JtYXQpIHdhcyBjb252ZXJ0ZWQgdG8gJGhvc3QKKyMgZm9ybWF0IGluIEFSRzIuIE90aGVyd2lzZSwgZW1pdCBhbiBlcnJvciBtZXNzYWdlLCBidXQgY29udGludWUgKHJlc2V0dGluZworIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQgdG8gQVJHMSkuCitmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAoKQoreworICAkb3B0X2RlYnVnCisgIGlmIHRlc3QgLXogIiQyIiAmJiB0ZXN0IC1uICIkMSIgOyB0aGVuCisgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSBob3N0IGZpbGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIgorICAgIGZ1bmNfZXJyb3IgIiAgXGAkMSciCisgICAgZnVuY19lcnJvciAiQ29udGludWluZywgYnV0IHVuaW5zdGFsbGVkIGV4ZWN1dGFibGVzIG1heSBub3Qgd29yay4iCisgICAgIyBGYWxsYmFjazoKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sKKworCisjIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIEZST01fUEFUSFNFUCBUT19QQVRIU0VQIEZST01fUEFUSCBUT19QQVRICisjIFZlcmlmeSB0aGF0IEZST01fUEFUSCAoYSBwYXRoIGluICRidWlsZCBmb3JtYXQpIHdhcyBjb252ZXJ0ZWQgdG8gJGhvc3QKKyMgZm9ybWF0IGluIFRPX1BBVEguIE90aGVyd2lzZSwgZW1pdCBhbiBlcnJvciBtZXNzYWdlLCBidXQgY29udGludWUsIHJlc2V0dGluZworIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQgdG8gYSBzaW1wbGlzdGljIGZhbGxiYWNrIHZhbHVlIChzZWUgYmVsb3cpLgorZnVuY19jb252ZXJ0X3BhdGhfY2hlY2sgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC16ICIkNCIgJiYgdGVzdCAtbiAiJDMiOyB0aGVuCisgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSB0aGUgaG9zdCBwYXRoIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgZnVuY19lcnJvciAiICBcYCQzJyIKKyAgICBmdW5jX2Vycm9yICJDb250aW51aW5nLCBidXQgdW5pbnN0YWxsZWQgZXhlY3V0YWJsZXMgbWF5IG5vdCB3b3JrLiIKKyAgICAjIEZhbGxiYWNrLiAgVGhpcyBpcyBhIGRlbGliZXJhdGVseSBzaW1wbGlzdGljICJjb252ZXJzaW9uIiBhbmQKKyAgICAjIHNob3VsZCBub3QgYmUgImltcHJvdmVkIi4gIFNlZSBsaWJ0b29sLmluZm8uCisgICAgaWYgdGVzdCAieCQxIiAhPSAieCQyIjsgdGhlbgorICAgICAgbHRfcmVwbGFjZV9wYXRoc2VwX2NoYXJzPSJzfCQxfCQyfGciCisgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGVjaG8gIiQzIiB8CisgICAgICAgICRTRUQgLWUgIiRsdF9yZXBsYWNlX3BhdGhzZXBfY2hhcnMiYAorICAgIGVsc2UKKyAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDMiCisgICAgZmkKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgRlJPTlRQQVQgQkFDS1BBVCBSRVBMIE9SSUcKKyMgTW9kaWZpZXMgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IGJ5IHByZXBlbmRpbmcgUkVQTCBpZiBPUklHIG1hdGNoZXMgRlJPTlRQQVQKKyMgYW5kIGFwcGVuZGluZyBSRVBMIGlmIE9SSUcgbWF0Y2hlcyBCQUNLUEFULgorZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICgpCit7CisgICRvcHRfZGVidWcKKyAgY2FzZSAkNCBpbgorICAkMSApIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJDMkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIDs7CisgIGVzYWMKKyAgY2FzZSAkNCBpbgorICAkMiApIGZ1bmNfYXBwZW5kIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCAiJDMiCisgICAgOzsKKyAgZXNhYworfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgJGJ1aWxkIHRvICRob3N0IEZJTEUgTkFNRSBDT05WRVJTSU9OIEZVTkNUSU9OUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpbnZva2VkIHZpYSBgJHRvX2hvc3RfZmlsZV9jbWQgQVJHJworIworIyBJbiBlYWNoIGNhc2UsIEFSRyBpcyB0aGUgcGF0aCB0byBiZSBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgdG8gJGhvc3QgZm9ybWF0LgorIyBSZXN1bHQgd2lsbCBiZSBhdmFpbGFibGUgaW4gJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KKworCisjIGZ1bmNfdG9faG9zdF9maWxlIEFSRworIyBDb252ZXJ0cyB0aGUgZmlsZSBuYW1lIEFSRyBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiBSZXR1cm4gcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfdG9faG9zdF9maWxlICgpCit7CisgICRvcHRfZGVidWcKKyAgJHRvX2hvc3RfZmlsZV9jbWQgIiQxIgorfQorIyBlbmQgZnVuY190b19ob3N0X2ZpbGUKKworCisjIGZ1bmNfdG9fdG9vbF9maWxlIEFSRyBMQVpZCisjIGNvbnZlcnRzIHRoZSBmaWxlIG5hbWUgQVJHIGZyb20gJGJ1aWxkIGZvcm1hdCB0byB0b29sY2hhaW4gZm9ybWF0LiBSZXR1cm4KKyMgcmVzdWx0IGluIGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdC4gIElmIHRoZSBjb252ZXJzaW9uIGluIHVzZSBpcyBsaXN0ZWQKKyMgaW4gKHRoZSBjb21tYSBzZXBhcmF0ZWQpIExBWlksIG5vIGNvbnZlcnNpb24gdGFrZXMgcGxhY2UuCitmdW5jX3RvX3Rvb2xfZmlsZSAoKQoreworICAkb3B0X2RlYnVnCisgIGNhc2UgLCQyLCBpbgorICAgICosIiR0b190b29sX2ZpbGVfY21kIiwqKQorICAgICAgZnVuY190b190b29sX2ZpbGVfcmVzdWx0PSQxCisgICAgICA7OworICAgICopCisgICAgICAkdG9fdG9vbF9maWxlX2NtZCAiJDEiCisgICAgICBmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQ9JGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdAorICAgICAgOzsKKyAgZXNhYworfQorIyBlbmQgZnVuY190b190b29sX2ZpbGUKKworCisjIGZ1bmNfY29udmVydF9maWxlX25vb3AgQVJHCisjIENvcHkgQVJHIHRvIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX25vb3AgKCkKK3sKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25vb3AKKworCisjIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IGZpbGUgbmFtZSBBUkcgZnJvbSAobWluZ3cpIE1TWVMgdG8gKG1pbmd3KSB3MzIgZm9ybWF0OyBhdXRvbWF0aWMKKyMgY29udmVyc2lvbiB0byB3MzIgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGN3cmFwcGVyLiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICBmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMiAiJDEiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzJfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tIEN5Z3dpbiB0byB3MzIgZm9ybWF0LiAgUmV0dXJucyByZXN1bHQgaW4KKyMgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X2ZpbGVfY3lnd2luX3RvX3czMiAoKQoreworICAkb3B0X2RlYnVnCisgIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdD0iJDEiCisgIGlmIHRlc3QgLW4gIiQxIjsgdGhlbgorICAgICMgYmVjYXVzZSAkYnVpbGQgaXMgY3lnd2luLCB3ZSBjYWxsICJ0aGUiIGN5Z3BhdGggaW4gJFBBVEg7IG5vIG5lZWQgdG8gdXNlCisgICAgIyBMVF9DWUdQQVRIIGluIHRoaXMgY2FzZS4KKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9YGN5Z3BhdGggLW0gIiQxImAKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIKKworCisjIGZ1bmNfY29udmVydF9maWxlX25peF90b193MzIgQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tICpuaXggdG8gdzMyIGZvcm1hdC4gIFJlcXVpcmVzIGEgd2luZSBlbnZpcm9ubWVudAorIyBhbmQgYSB3b3JraW5nIHdpbmVwYXRoLiBSZXR1cm5zIHJlc3VsdCBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJDEiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgIGZpCisgIGZ1bmNfY29udmVydF9maWxlX2NoZWNrICIkMSIgIiRmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQiCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX2N5Z3dpbiBBUkcKKyMgQ29udmVydCBmaWxlIG5hbWUgQVJHIGZyb20gTVNZUyB0byBDeWd3aW4gZm9ybWF0LiAgUmVxdWlyZXMgTFRfQ1lHUEFUSCBzZXQuCisjIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiQxIgorICAgIGZ1bmNfY3lncGF0aCAtdSAiJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICBmaQorICBmdW5jX2NvbnZlcnRfZmlsZV9jaGVjayAiJDEiICIkZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0IgorfQorIyBlbmQgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b19jeWd3aW4KKworCisjIGZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4gQVJHCisjIENvbnZlcnQgZmlsZSBuYW1lIEFSRyBmcm9tICpuaXggdG8gQ3lnd2luIGZvcm1hdC4gIFJlcXVpcmVzIEN5Z3dpbiBpbnN0YWxsZWQKKyMgaW4gYSB3aW5lIGVudmlyb25tZW50LCB3b3JraW5nIHdpbmVwYXRoLCBhbmQgTFRfQ1lHUEFUSCBzZXQuICBSZXR1cm5zIHJlc3VsdAorIyBpbiBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBjb252ZXJ0IGZyb20gKm5peCB0byB3MzIsIHRoZW4gdXNlIGN5Z3BhdGggdG8gY29udmVydCBmcm9tIHczMiB0byBjeWd3aW4uCisgICAgZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMiAiJDEiCisgICAgZnVuY19jeWdwYXRoIC11ICIkZnVuY19jb252ZXJ0X2NvcmVfZmlsZV93aW5lX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0PSIkZnVuY19jeWdwYXRoX3Jlc3VsdCIKKyAgZmkKKyAgZnVuY19jb252ZXJ0X2ZpbGVfY2hlY2sgIiQxIiAiJGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdCIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgJGJ1aWxkIHRvICRob3N0IFBBVEggQ09OVkVSU0lPTiBGVU5DVElPTlMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGludm9rZWQgdmlhIGAkdG9faG9zdF9wYXRoX2NtZCBBUkcnCisjCisjIEluIGVhY2ggY2FzZSwgQVJHIGlzIHRoZSBwYXRoIHRvIGJlIGNvbnZlcnRlZCBmcm9tICRidWlsZCB0byAkaG9zdCBmb3JtYXQuCisjIFRoZSByZXN1bHQgd2lsbCBiZSBhdmFpbGFibGUgaW4gJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KKyMKKyMgUGF0aCBzZXBhcmF0b3JzIGFyZSBhbHNvIGNvbnZlcnRlZCBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiAgSWYKKyMgQVJHIGJlZ2lucyBvciBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIsIGl0IGlzIHByZXNlcnZlZCAoYnV0CisjIGNvbnZlcnRlZCB0byAkaG9zdCBmb3JtYXQpIG9uIG91dHB1dC4KKyMKKyMgQWxsIHBhdGggY29udmVyc2lvbiBmdW5jdGlvbnMgYXJlIG5hbWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbjoKKyMgICBmaWxlIG5hbWUgY29udmVyc2lvbiBmdW5jdGlvbiAgICA6IGZ1bmNfY29udmVydF9maWxlX1hfdG9fWSAoKQorIyAgIHBhdGggY29udmVyc2lvbiBmdW5jdGlvbiAgICAgICAgIDogZnVuY19jb252ZXJ0X3BhdGhfWF90b19ZICgpCisjIHdoZXJlLCBmb3IgYW55IGdpdmVuICRidWlsZC8kaG9zdCBjb21iaW5hdGlvbiB0aGUgJ1hfdG9fWScgdmFsdWUgaXMgdGhlCisjIHNhbWUuICBJZiBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgYWRkZWQgZm9yIG5ldyAkYnVpbGQvJGhvc3QgY29tYmluYXRpb25zLAorIyB0aGUgdHdvIG5ldyBmdW5jdGlvbnMgbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuLCBvciBmdW5jX2luaXRfdG9faG9zdF9wYXRoX2NtZAorIyB3aWxsIGJyZWFrLgorCisKKyMgZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQKKyMgRW5zdXJlcyB0aGF0IGZ1bmN0aW9uICJwb2ludGVyIiB2YXJpYWJsZSAkdG9faG9zdF9wYXRoX2NtZCBpcyBzZXQgdG8gdGhlCisjIGFwcHJvcHJpYXRlIHZhbHVlLCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgJHRvX2hvc3RfZmlsZV9jbWQuCit0b19ob3N0X3BhdGhfY21kPQorZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBpZiB0ZXN0IC16ICIkdG9faG9zdF9wYXRoX2NtZCI7IHRoZW4KKyAgICBmdW5jX3N0cmlwbmFtZSAnZnVuY19jb252ZXJ0X2ZpbGVfJyAnJyAiJHRvX2hvc3RfZmlsZV9jbWQiCisgICAgdG9faG9zdF9wYXRoX2NtZD0iZnVuY19jb252ZXJ0X3BhdGhfJHtmdW5jX3N0cmlwbmFtZV9yZXN1bHR9IgorICBmaQorfQorCisKKyMgZnVuY190b19ob3N0X3BhdGggQVJHCisjIENvbnZlcnRzIHRoZSBwYXRoIEFSRyBmcm9tICRidWlsZCBmb3JtYXQgdG8gJGhvc3QgZm9ybWF0LiBSZXR1cm4gcmVzdWx0CisjIGluIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfdG9faG9zdF9wYXRoICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY19pbml0X3RvX2hvc3RfcGF0aF9jbWQKKyAgJHRvX2hvc3RfcGF0aF9jbWQgIiQxIgorfQorIyBlbmQgZnVuY190b19ob3N0X3BhdGgKKworCisjIGZ1bmNfY29udmVydF9wYXRoX25vb3AgQVJHCisjIENvcHkgQVJHIHRvIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25vb3AgKCkKK3sKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX25vb3AKKworCisjIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyIEFSRworIyBDb252ZXJ0IHBhdGggQVJHIGZyb20gKG1pbmd3KSBNU1lTIHRvIChtaW5ndykgdzMyIGZvcm1hdDsgYXV0b21hdGljCisjIGNvbnZlcnNpb24gdG8gdzMyIGlzIG5vdCBhdmFpbGFibGUgaW5zaWRlIHRoZSBjd3JhcHBlci4gIFJldHVybnMgcmVzdWx0IGluCisjIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tIEFSRy4gIE1TWVMKKyAgICAjIGJlaGF2aW9yIGlzIGluY29uc2lzdGVudCBoZXJlOyBjeWdwYXRoIHR1cm5zIHRoZW0gaW50byAnLjsnIGFuZCAnOy4nOworICAgICMgYW5kIHdpbmVwYXRoIGlnbm9yZXMgdGhlbSBjb21wbGV0ZWx5LgorICAgIGZ1bmNfc3RyaXBuYW1lIDogOiAiJDEiCisgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisgICAgZnVuY19jb252ZXJ0X2NvcmVfbXN5c190b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6ICI7IiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgIjsiICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX21zeXNfdG9fdzMyCisKKworIyBmdW5jX2NvbnZlcnRfcGF0aF9jeWd3aW5fdG9fdzMyIEFSRworIyBDb252ZXJ0IHBhdGggQVJHIGZyb20gQ3lnd2luIHRvIHczMiBmb3JtYXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9jeWd3aW5fdG9fdzMyICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBTZWUgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b193MzI6CisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGN5Z3BhdGggLW0gLXAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxImAKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6ICI7IiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgIjsiICIkMSIKKyAgZmkKK30KKyMgZW5kIGZ1bmNfY29udmVydF9wYXRoX2N5Z3dpbl90b193MzIKKworCisjIGZ1bmNfY29udmVydF9wYXRoX25peF90b193MzIgQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAqbml4IHRvIHczMiBmb3JtYXQuICBSZXF1aXJlcyBhIHdpbmUgZW52aXJvbm1lbnQgYW5kCisjIGEgd29ya2luZyB3aW5lcGF0aC4gIFJldHVybnMgcmVzdWx0IGluIGZ1bmNfdG9faG9zdF9maWxlX3Jlc3VsdC4KK2Z1bmNfY29udmVydF9wYXRoX25peF90b193MzIgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzIgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD0iJGZ1bmNfY29udmVydF9jb3JlX3BhdGhfd2luZV90b193MzJfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogIjsiIFwKKyAgICAgICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiCisgICAgZnVuY19jb252ZXJ0X3BhdGhfZnJvbnRfYmFja19wYXRoc2VwICI6KiIgIio6IiAiOyIgIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbml4X3RvX3czMgorCisKKyMgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4gQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSBNU1lTIHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBMVF9DWUdQQVRIIHNldC4KKyMgUmV0dXJucyByZXN1bHQgaW4gZnVuY190b19ob3N0X2ZpbGVfcmVzdWx0LgorZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4gKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKyAgICAjIFNlZSBmdW5jX2NvbnZlcnRfcGF0aF9tc3lzX3RvX3czMjoKKyAgICBmdW5jX3N0cmlwbmFtZSA6IDogIiQxIgorICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorICAgIGZ1bmNfY29udmVydF9jb3JlX21zeXNfdG9fdzMyICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgLXAgIiRmdW5jX2NvbnZlcnRfY29yZV9tc3lzX3RvX3czMl9yZXN1bHQiCisgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkZnVuY19jeWdwYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9jaGVjayA6IDogXAorICAgICAgIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICBmdW5jX2NvbnZlcnRfcGF0aF9mcm9udF9iYWNrX3BhdGhzZXAgIjoqIiAiKjoiIDogIiQxIgorICBmaQorfQorIyBlbmQgZnVuY19jb252ZXJ0X3BhdGhfbXN5c190b19jeWd3aW4KKworCisjIGZ1bmNfY29udmVydF9wYXRoX25peF90b19jeWd3aW4gQVJHCisjIENvbnZlcnQgcGF0aCBBUkcgZnJvbSAqbml4IHRvIEN5Z3dpbiBmb3JtYXQuICBSZXF1aXJlcyBDeWd3aW4gaW5zdGFsbGVkIGluIGEKKyMgYSB3aW5lIGVudmlyb25tZW50LCB3b3JraW5nIHdpbmVwYXRoLCBhbmQgTFRfQ1lHUEFUSCBzZXQuICBSZXR1cm5zIHJlc3VsdCBpbgorIyBmdW5jX3RvX2hvc3RfZmlsZV9yZXN1bHQuCitmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fY3lnd2luICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tCisgICAgIyBBUkcuIG1zeXMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50IGhlcmUsIGN5Z3BhdGggdHVybnMgdGhlbQorICAgICMgaW50byAnLjsnIGFuZCAnOy4nLCBhbmQgd2luZXBhdGggaWdub3JlcyB0aGVtIGNvbXBsZXRlbHkuCisgICAgZnVuY19zdHJpcG5hbWUgOiA6ICIkMSIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF90bXAxPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKyAgICBmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIKKyAgICBmdW5jX2N5Z3BhdGggLXUgLXAgIiRmdW5jX2NvbnZlcnRfY29yZV9wYXRoX3dpbmVfdG9fdzMyX3Jlc3VsdCIKKyAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiRmdW5jX2N5Z3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2NoZWNrIDogOiBcCisgICAgICAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IgorICAgIGZ1bmNfY29udmVydF9wYXRoX2Zyb250X2JhY2tfcGF0aHNlcCAiOioiICIqOiIgOiAiJDEiCisgIGZpCit9CisjIGVuZCBmdW5jX2NvbnZlcnRfcGF0aF9uaXhfdG9fY3lnd2luCisKKworIyBmdW5jX21vZGVfY29tcGlsZSBhcmcuLi4KK2Z1bmNfbW9kZV9jb21waWxlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKKyAgICBzdXBwcmVzc19vcHQ9eWVzCisgICAgc3VwcHJlc3Nfb3V0cHV0PQorICAgIGFyZ19tb2RlPW5vcm1hbAorICAgIGxpYm9iaj0KKyAgICBsYXRlcj0KKyAgICBwaWVfZmxhZz0KKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnX21vZGUgaW4KKyAgICAgIGFyZyAgKQorCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKKwlsYXN0YXJnPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCTs7CisKKyAgICAgIHRhcmdldCApCisJbGlib2JqPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCWNvbnRpbnVlCisJOzsKKworICAgICAgbm9ybWFsICkKKwkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCisJY2FzZSAkYXJnIGluCisJLW8pCisJICB0ZXN0IC1uICIkbGlib2JqIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIKKwkgIGFyZ19tb2RlPXRhcmdldAorCSAgY29udGludWUKKwkgIDs7CisKKwktcGllIHwgLWZwaWUgfCAtZlBJRSkKKyAgICAgICAgICBmdW5jX2FwcGVuZCBwaWVfZmxhZyAiICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1zaGFyZWQgfCAtc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCisJICBmdW5jX2FwcGVuZCBsYXRlciAiICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1uby1zdXBwcmVzcykKKwkgIHN1cHByZXNzX29wdD1ubworCSAgY29udGludWUKKwkgIDs7CisKKwktWGNvbXBpbGVyKQorCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAorCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKKwkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCisKKwktV2MsKikKKwkgIGZ1bmNfc3RyaXBuYW1lICctV2MsJyAnJyAiJGFyZyIKKwkgIGFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgbGFzdGFyZz0KKwkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCSAgZm9yIGFyZyBpbiAkYXJnczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBsYXN0YXJnICIkYXJnIgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRsYXN0YXJnIgorCSAgbGFzdGFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKwkgICMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgorCSAgZnVuY19hcHBlbmQgYmFzZV9jb21waWxlICIgJGxhc3RhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCSopCisJICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCisJICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KKwkgICMKKwkgIGxhc3Rhcmc9IiRzcmNmaWxlIgorCSAgc3JjZmlsZT0iJGFyZyIKKwkgIDs7CisJZXNhYyAgIyAgY2FzZSAkYXJnCisJOzsKKyAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KKyAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBiYXNlX2NvbXBpbGUgIiRsYXN0YXJnIgorICAgIGRvbmUgIyBmb3IgYXJnCisKKyAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgIGFyZykKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBtdXN0IHNwZWNpZnkgYW4gYXJndW1lbnQgZm9yIC1YY29tcGlsZSIKKyAgICAgIDs7CisgICAgdGFyZ2V0KQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIgorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgICAgdGVzdCAteiAiJGxpYm9iaiIgJiYgeworCWZ1bmNfYmFzZW5hbWUgIiRzcmNmaWxlIgorCWxpYm9iaj0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgICAgfQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5bY0NGU2lmbXNvXSB8IFwKKyAgICAqLmFkYSB8ICouYWRiIHwgKi5hZHMgfCAqLmFzbSB8IFwKKyAgICAqLmMrKyB8ICouY2MgfCAqLmlpIHwgKi5jbGFzcyB8ICouY3BwIHwgKi5jeHggfCBcCisgICAgKi5bZkZdWzA5XT8gfCAqLmZvciB8ICouamF2YSB8ICoub2JqIHwgKi5zeCB8ICouY3UgfCAqLmN1cCkKKyAgICAgIGZ1bmNfeGZvcm0gIiRsaWJvYmoiCisgICAgICBsaWJvYmo9JGZ1bmNfeGZvcm1fcmVzdWx0CisgICAgICA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGxpYm9iaiBpbgorICAgICoubG8pIGZ1bmNfbG8ybyAiJGxpYm9iaiI7IG9iaj0kZnVuY19sbzJvX3Jlc3VsdCA7OworICAgICopCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICBmb3IgYXJnIGluICRsYXRlcjsgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLXNoYXJlZCkKKwl0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgXAorCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJjYW4gbm90IGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiCisJYnVpbGRfb2xkX2xpYnM9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1zdGF0aWMpCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLXBpYykKKwlwaWNfbW9kZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItbm9uLXBpYykKKwlwaWNfbW9kZT1ubworCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbGlib2JqIgorICAgIHRlc3QgIlgkbGlib2JqIiAhPSAiWCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIgXAorICAgICAgJiYgJEVDSE8gIlgkbGlib2JqIiB8ICRHUkVQICdbXX4jXip7fTs8Pj8iJyInIicJICYoKXxgJFtdJyBcCisgICAgICAmJiBmdW5jX3dhcm5pbmcgImxpYm9iaiBuYW1lIFxgJGxpYm9iaicgbWF5IG5vdCBjb250YWluIHNoZWxsIHNwZWNpYWwgY2hhcmFjdGVycy4iCisgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG9iaiIgIi8iICIiCisgICAgb2JqbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgIGxvYmo9JHt4ZGlyfSRvYmpkaXIvJG9iam5hbWUKKworICAgIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiCisKKyAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgorICAgIGVsc2UKKyAgICAgIHJlbW92ZWxpc3Q9IiRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBmaQorCisgICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKyAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgIGZpCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcworICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYworICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KKyAgICAgIG91dHB1dF9vYmo9YCRFQ0hPICIkc3JjZmlsZSIgfCAkU0VEICdzJV4uKi8lJTsgcyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9CisgICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKKyAgICBlbHNlCisgICAgICBvdXRwdXRfb2JqPQorICAgICAgbmVlZF9sb2Nrcz1ubworICAgICAgbG9ja2ZpbGU9CisgICAgZmkKKworICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCisgICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQorICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgorICAgICAgdW50aWwgJG9wdF9kcnlfcnVuIHx8IGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbworCWZ1bmNfZWNobyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorICAgICAgZnVuY19hcHBlbmQgcmVtb3ZlbGlzdCAiICRvdXRwdXRfb2JqIgorICAgICAgJEVDSE8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKyAgICBmdW5jX2FwcGVuZCByZW1vdmVsaXN0ICIgJGxvY2tmaWxlIgorICAgIHRyYXAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScgMSAyIDE1CisKKyAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJHNyY2ZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgICAgc3JjZmlsZT0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHNyY2ZpbGUiCisgICAgcXNyY2ZpbGU9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0CisKKyAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KKyAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQorCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgorICAgICAgZWxzZQorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSIKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfbWtkaXJfcCAiJHhkaXIkb2JqZGlyIgorCisgICAgICBpZiB0ZXN0IC16ICIkb3V0cHV0X29iaiI7IHRoZW4KKwkjIFBsYWNlIFBJQyBvYmplY3RzIGluICRvYmpkaXIKKwlmdW5jX2FwcGVuZCBjb21tYW5kICIgLW8gJGxvYmoiCisgICAgICBmaQorCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIglcCisgICAgICAgICAgJ3Rlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJGxvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkbG9iaiInIFwKKwkgICdlcnJvcj0kPzsgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkZXJyb3InCisgICAgICBmaQorCisgICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCisgICAgICBpZiB0ZXN0ICIkc3VwcHJlc3Nfb3B0IiA9IHllczsgdGhlbgorCXN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSRwaWVfZmxhZyIKKyAgICAgIGVsc2UKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21tYW5kICIgLW8gJG9iaiIKKyAgICAgIGZpCisKKyAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgorICAgICAgZnVuY19hcHBlbmQgY29tbWFuZCAiJHN1cHByZXNzX291dHB1dCIKKyAgICAgIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSAiJGNvbW1hbmQiIFwKKyAgICAgICAgJyRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJG9iaiI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJE1WICIkb3V0cHV0X29iaiIgIiRvYmoiJyBcCisJICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJworICAgICAgZmkKKyAgICBmaQorCisgICAgJG9wdF9kcnlfcnVuIHx8IHsKKyAgICAgIGZ1bmNfd3JpdGVfbGlidG9vbF9vYmplY3QgIiRsaWJvYmoiICIkb2JqZGlyLyRvYmpuYW1lIiAiJG9iam5hbWUiCisKKyAgICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorCXJlbW92ZWxpc3Q9JGxvY2tmaWxlCisgICAgICAgICRSTSAiJGxvY2tmaWxlIgorICAgICAgZmkKKyAgICB9CisKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKworJG9wdF9oZWxwIHx8IHsKKyAgdGVzdCAiJG9wdF9tb2RlIiA9IGNvbXBpbGUgJiYgZnVuY19tb2RlX2NvbXBpbGUgJHsxKyIkQCJ9Cit9CisKK2Z1bmNfbW9kZV9oZWxwICgpCit7CisgICAgIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCisgICAgY2FzZSAkb3B0X21vZGUgaW4KKyAgICAgICIiKQorICAgICAgICAjIEdlbmVyaWMgaGVscCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgdXNhZ2UgY29tbWVudHMKKyAgICAgICAgIyBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmaWxlLgorICAgICAgICBmdW5jX2hlbHAKKyAgICAgICAgOzsKKworICAgICAgY2xlYW4pCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKK3dpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgICAgICAgOzsKKworICAgICAgY29tcGlsZSkKKyAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCisKK0NvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCisgIC1uby1zdXBwcmVzcyAgICAgIGRvIG5vdCBzdXBwcmVzcyBjb21waWxlciBvdXRwdXQgZm9yIG11bHRpcGxlIHBhc3NlcworICAtcHJlZmVyLXBpYyAgICAgICB0cnkgdG8gYnVpbGQgUElDIG9iamVjdHMgb25seQorICAtcHJlZmVyLW5vbi1waWMgICB0cnkgdG8gYnVpbGQgbm9uLVBJQyBvYmplY3RzIG9ubHkKKyAgLXNoYXJlZCAgICAgICAgICAgZG8gbm90IGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKKyAgLXN0YXRpYyAgICAgICAgICAgb25seSBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisgIC1XYyxGTEFHICAgICAgICAgIHBhc3MgRkxBRyBkaXJlY3RseSB0byB0aGUgY29tcGlsZXIKKworQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKK2Zyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCisKK1RoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQorU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCitsaWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCisgICAgICAgIDs7CisKKyAgICAgIGV4ZWN1dGUpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCisKK0F1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAorCitUaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCitmbGFncy4KKworSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAoraW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5CitkaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KKworVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCisgICAgICAgIDs7CisKKyAgICAgIGZpbmlzaCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgorCitDb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgorCitFYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgorCitUaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKK3RoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgorICAgICAgICA7OworCisgICAgICBpbnN0YWxsKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KKworSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCisKK0lOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQorZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBJTlNUQUxMLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1pbnN0LXByZWZpeC1kaXIgUFJFRklYLURJUiAgVXNlIFBSRUZJWC1ESVIgYXMgYSBzdGFnaW5nIGFyZWEgZm9yIGluc3RhbGxhdGlvbgorCitUaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQorQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCisgICAgICAgIDs7CisKKyAgICAgIGxpbmspCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgorCitMaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCitjcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgorCitMSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKK2EgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKKyAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCisgIC1iaW5kaXIgQklORElSICAgIHNwZWNpZnkgcGF0aCB0byBiaW5hcmllcyBkaXJlY3RvcnkgKGZvciBzeXN0ZW1zIHdoZXJlCisgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyBtdXN0IGJlIGZvdW5kIGluIHRoZSBQQVRIIHNldHRpbmcgYXQgcnVudGltZSkKKyAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCisgIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCisgIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCisgIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCisgICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQorICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCisgIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKKyAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKKyAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCisgIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCisgIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCisgIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKKyAgLXNoYXJlZCAgICAgICAgICAgb25seSBkbyBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXNocmV4dCBTVUZGSVggICAgb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIHNoYXJlZCBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uCisgIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgIC1zdGF0aWMtbGlidG9vbC1saWJzCisgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCisgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KKyAgLXdlYWsgTElCTkFNRSAgICAgZGVjbGFyZSB0aGF0IHRoZSB0YXJnZXQgcHJvdmlkZXMgdGhlIExJQk5BTUUgaW50ZXJmYWNlCisgIC1XYyxGTEFHCisgIC1YY29tcGlsZXIgRkxBRyAgIHBhc3MgbGlua2VyLXNwZWNpZmljIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGNvbXBpbGVyCisgIC1XbCxGTEFHCisgIC1YbGlua2VyIEZMQUcgICAgIHBhc3MgbGlua2VyLXNwZWNpZmljIEZMQUcgZGlyZWN0bHkgdG8gdGhlIGxpbmtlcgorICAtWENDbGlua2VyIEZMQUcgICBwYXNzIGxpbmstc3BlY2lmaWMgRkxBRyB0byB0aGUgY29tcGlsZXIgZHJpdmVyIChDQykKKworQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KKworRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKK3RyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5CitvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAorb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcworcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCit1c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKK2lzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgICAgICAgIDs7CisKKyAgICAgIHVuaW5zdGFsbCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KK090aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgICAgICAgOzsKKworICAgICAgKikKKyAgICAgICAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG9wdF9tb2RlJyIKKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBlY2hvCisgICAgJEVDSE8gIlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKK30KKworIyBOb3cgdGhhdCB3ZSd2ZSBjb2xsZWN0ZWQgYSBwb3NzaWJsZSAtLW1vZGUgYXJnLCBzaG93IGhlbHAgaWYgbmVjZXNzYXJ5CitpZiAkb3B0X2hlbHA7IHRoZW4KKyAgaWYgdGVzdCAiJG9wdF9oZWxwIiA9IDo7IHRoZW4KKyAgICBmdW5jX21vZGVfaGVscAorICBlbHNlCisgICAgeworICAgICAgZnVuY19oZWxwIG5vZXhpdAorICAgICAgZm9yIG9wdF9tb2RlIGluIGNvbXBpbGUgbGluayBleGVjdXRlIGluc3RhbGwgZmluaXNoIHVuaW5zdGFsbCBjbGVhbjsgZG8KKwlmdW5jX21vZGVfaGVscAorICAgICAgZG9uZQorICAgIH0gfCBzZWQgLW4gJzFwOyAyLCRzL15Vc2FnZTovICBvcjogL3AnCisgICAgeworICAgICAgZnVuY19oZWxwIG5vZXhpdAorICAgICAgZm9yIG9wdF9tb2RlIGluIGNvbXBpbGUgbGluayBleGVjdXRlIGluc3RhbGwgZmluaXNoIHVuaW5zdGFsbCBjbGVhbjsgZG8KKwllY2hvCisJZnVuY19tb2RlX2hlbHAKKyAgICAgIGRvbmUKKyAgICB9IHwKKyAgICBzZWQgJzFkCisgICAgICAvXldoZW4gcmVwb3J0aW5nLywvXlJlcG9ydC97CisJSAorCWQKKyAgICAgIH0KKyAgICAgICR4CisgICAgICAvaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMvZAorICAgICAgL21vcmUgZGV0YWlsZWQgLipNT0RFL2QKKyAgICAgIHMvXlVzYWdlOi4qLS1tb2RlPVwoW14gXSpcKSAuKi9EZXNjcmlwdGlvbiBvZiBcMSBtb2RlOi8nCisgIGZpCisgIGV4aXQgJD8KK2ZpCisKKworIyBmdW5jX21vZGVfZXhlY3V0ZSBhcmcuLi4KK2Z1bmNfbW9kZV9leGVjdXRlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCisgICAgY21kPSIkbm9ub3B0IgorICAgIHRlc3QgLXogIiRjbWQiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiCisKKyAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgorICAgIGZvciBmaWxlIGluICRvcHRfZGxvcGVuOyBkbworICAgICAgdGVzdCAtZiAiJGZpbGUiIFwKKwl8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiCisKKyAgICAgIGRpcj0KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICoubGEpCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmaWxlIgorCWZpbGU9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAorCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKworCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgorCWRsbmFtZT0KKwlsaWJyYXJ5X25hbWVzPQorCWZ1bmNfc291cmNlICIkZmlsZSIKKworCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgorCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisJICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCisJICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgXAorCSAgICBmdW5jX3dhcm5pbmcgIlxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgorCSAgY29udGludWUKKwlmaQorCisJZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgorCSAgZnVuY19hcHBlbmQgZGlyICIvJG9iamRpciIKKwllbHNlCisJICBpZiB0ZXN0ICEgLWYgIiRkaXIvJGRsbmFtZSI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCTs7CisKKyAgICAgICopCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAtKiB8ICoubGEgfCAqLmxvICkgOzsKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICIkZmlsZSIKKwkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCisJICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKKwllbGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCisJICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKKwkgIGZ1bmNfc291cmNlICIkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZ1bmNfYXBwZW5kX3F1b3RlZCBhcmdzICIkZmlsZSIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0ICJYJG9wdF9kcnlfcnVuIiA9IFhmYWxzZTsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCisJZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKworICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCisgICAgICBkbworCWV2YWwgImlmIHRlc3QgXCJcJHtzYXZlXyRsdF92YXIrc2V0fVwiID0gc2V0OyB0aGVuCisgICAgICAgICAgICAgICAgJGx0X3Zhcj1cJHNhdmVfJGx0X3ZhcjsgZXhwb3J0ICRsdF92YXIKKwkgICAgICBlbHNlCisJCSRsdF91bnNldCAkbHRfdmFyCisJICAgICAgZmkiCisgICAgICBkb25lCisKKyAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KKyAgICAgIGV4ZWNfY21kPSJcJGNtZCRhcmdzIgorICAgIGVsc2UKKyAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwlldmFsICJcJEVDSE8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgorCWVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCisgICAgICAkRUNITyAiJGNtZCRhcmdzIgorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGV4ZWN1dGUgJiYgZnVuY19tb2RlX2V4ZWN1dGUgJHsxKyIkQCJ9CisKKworIyBmdW5jX21vZGVfZmluaXNoIGFyZy4uLgorZnVuY19tb2RlX2ZpbmlzaCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBsaWJzPQorICAgIGxpYmRpcnM9CisgICAgYWRtaW5jbWRzPQorCisgICAgZm9yIG9wdCBpbiAiJG5vbm9wdCIgJHsxKyIkQCJ9CisgICAgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRvcHQiOyB0aGVuCisJZnVuY19hcHBlbmQgbGliZGlycyAiICRvcHQiCisKKyAgICAgIGVsaWYgdGVzdCAtZiAiJG9wdCI7IHRoZW4KKwlpZiBmdW5jX2xhbGliX3Vuc2FmZV9wICIkb3B0IjsgdGhlbgorCSAgZnVuY19hcHBlbmQgbGlicyAiICRvcHQiCisJZWxzZQorCSAgZnVuY193YXJuaW5nICJcYCRvcHQnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwlmaQorCisgICAgICBlbHNlCisJZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCBhcmd1bWVudCBcYCRvcHQnIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkbGlicyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRsdF9zeXNyb290IjsgdGhlbgorICAgICAgICBzeXNyb290X3JlZ2V4PWAkRUNITyAiJGx0X3N5c3Jvb3QiIHwgJFNFRCAiJHNlZF9tYWtlX2xpdGVyYWxfcmVnZXgiYAorICAgICAgICBzeXNyb290X2NtZD0icy9cKFsgJ11cKSRzeXNyb290X3JlZ2V4L1wxL2c7IgorICAgICAgZWxzZQorICAgICAgICBzeXNyb290X2NtZD0KKyAgICAgIGZpCisKKyAgICAgICMgUmVtb3ZlIHN5c3Jvb3QgcmVmZXJlbmNlcworICAgICAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisgICAgICAgIGZvciBsaWIgaW4gJGxpYnM7IGRvCisgICAgICAgICAgZWNobyAicmVtb3ZpbmcgcmVmZXJlbmNlcyB0byAkbHRfc3lzcm9vdCBhbmQgXGA9JyBwcmVmaXhlcyBmcm9tICRsaWIiCisgICAgICAgIGRvbmUKKyAgICAgIGVsc2UKKyAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKKyAgICAgICAgZm9yIGxpYiBpbiAkbGliczsgZG8KKwkgIHNlZCAtZSAiJHtzeXNyb290X2NtZH0gcy9cKFsgJ10tW0xSXVwpPS9cMS9nOyBzL1woWyAnXVwpPS9cMS9nIiAkbGliIFwKKwkgICAgPiAkdG1wZGlyL3RtcC1sYQorCSAgbXYgLWYgJHRtcGRpci90bXAtbGEgJGxpYgorCWRvbmUKKyAgICAgICAgJHtSTX1yICIkdG1wZGlyIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgorCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KKwkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZmluaXNoX2NtZHMiICdhZG1pbmNtZHM9IiRhZG1pbmNtZHMKKyciJGNtZCInIicKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KKwkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KKwkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZHMiIHx8IGZ1bmNfYXBwZW5kIGFkbWluY21kcyAiCisgICAgICAgJGNtZHMiCisJZmkKKyAgICAgIGRvbmUKKyAgICBmaQorCisgICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCisgICAgJG9wdF9zaWxlbnQgJiYgZXhpdCAkRVhJVF9TVUNDRVNTCisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJJEVDSE8gIiAgICRsaWJkaXIiCisgICAgICBkb25lCisgICAgICBlY2hvCisgICAgICBlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKKyAgICAgIGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgorICAgICAgZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIHRoZSBcYC1MTElCRElSJyIKKyAgICAgIGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCWVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisJZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwllY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKwllY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCWxpYmRpcj1MSUJESVIKKwlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKwkkRUNITyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCisJJEVDSE8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisJZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCisgICAgICBmaQorICAgICAgZWNobworCisgICAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICAgIGNhc2UgJGhvc3QgaW4KKwlzb2xhcmlzMi5bNjc4OV18c29sYXJpczIuMVswLTldKQorCSAgZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSksIGNybGUoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCIKKwkgIGVjaG8gInBhZ2VzLiIKKwkgIDs7CisJKikKKwkgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgZmkKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKwordGVzdCAiJG9wdF9tb2RlIiA9IGZpbmlzaCAmJiBmdW5jX21vZGVfZmluaXNoICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX2luc3RhbGwgYXJnLi4uCitmdW5jX21vZGVfaW5zdGFsbCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCisgICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKKyAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KKyAgICAgICBjYXNlICRub25vcHQgaW4gKnNodG9vbCopIDo7OyAqKSBmYWxzZTs7IGVzYWM7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRub25vcHQiCisgICAgICBpbnN0YWxsX3Byb2c9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCAiCisgICAgICBhcmc9JDEKKyAgICAgIHNoaWZ0CisgICAgZWxzZQorICAgICAgaW5zdGFsbF9wcm9nPQorICAgICAgYXJnPSRub25vcHQKKyAgICBmaQorCisgICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgorICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgIGZ1bmNfYXBwZW5kIGluc3RhbGxfcHJvZyAiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGluc3RhbGxfc2hhcmVkX3Byb2c9JGluc3RhbGxfcHJvZworICAgIGNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KKyAgICAgICpbXFxcIC9dY3BcICopIGluc3RhbGxfY3A9OiA7OworICAgICAgKikgaW5zdGFsbF9jcD1mYWxzZSA7OworICAgIGVzYWMKKworICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KKyAgICBkZXN0PQorICAgIGZpbGVzPQorICAgIG9wdHM9CisgICAgcHJldj0KKyAgICBpbnN0YWxsX3R5cGU9CisgICAgaXNkaXI9bm8KKyAgICBzdHJpcG1lPQorICAgIG5vX21vZGU9OgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgYXJnMj0KKyAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgorCWZ1bmNfYXBwZW5kIGZpbGVzICIgJGRlc3QiCisJZGVzdD0kYXJnCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWQpIGlzZGlyPXllcyA7OworICAgICAgLWYpCisJaWYgJGluc3RhbGxfY3A7IHRoZW4gOjsgZWxzZQorCSAgcHJldj0kYXJnCisJZmkKKwk7OworICAgICAgLWcgfCAtbSB8IC1vKQorCXByZXY9JGFyZworCTs7CisgICAgICAtcykKKwlzdHJpcG1lPSIgLXMiCisJY29udGludWUKKwk7OworICAgICAgLSopCisJOzsKKyAgICAgICopCisJIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgorCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCSAgaWYgdGVzdCAieCRwcmV2IiA9IHgtbSAmJiB0ZXN0IC1uICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIjsgdGhlbgorCSAgICBhcmcyPSRpbnN0YWxsX292ZXJyaWRlX21vZGUKKwkgICAgbm9fbW9kZT1mYWxzZQorCSAgZmkKKwkgIHByZXY9CisJZWxzZQorCSAgZGVzdD0kYXJnCisJICBjb250aW51ZQorCWZpCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgICBmdW5jX2FwcGVuZCBpbnN0YWxsX3Byb2cgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBpZiB0ZXN0IC1uICIkYXJnMiI7IHRoZW4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnMiIKKyAgICAgIGZpCisgICAgICBmdW5jX2FwcGVuZCBpbnN0YWxsX3NoYXJlZF9wcm9nICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGRvbmUKKworICAgIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAtbiAiJGluc3RhbGxfb3ZlcnJpZGVfbW9kZSIgJiYgJG5vX21vZGU7IHRoZW4KKyAgICAgIGlmICRpbnN0YWxsX2NwOyB0aGVuIDo7IGVsc2UKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkaW5zdGFsbF9vdmVycmlkZV9tb2RlIgorCWZ1bmNfYXBwZW5kIGluc3RhbGxfc2hhcmVkX3Byb2cgIiAtbSAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwlmdW5jX2ZhdGFsX2hlbHAgIm5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIgorICAgICAgZWxzZQorCWZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIgorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCisgICAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZGVzdCIKKyAgICBkZXN0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgorICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKKyAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCisgICAgICBkZXN0ZGlyPSIkZGVzdCIKKyAgICAgIGRlc3RuYW1lPQorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRkZXN0IiAiIiAiLiIKKyAgICAgIGRlc3RkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgZGVzdG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgorICAgICAgc2V0IGR1bW15ICRmaWxlczsgc2hpZnQKKyAgICAgIHRlc3QgIiQjIiAtZ3QgMSAmJiBcCisJZnVuY19mYXRhbF9oZWxwICJcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiCisgICAgZmkKKyAgICBjYXNlICRkZXN0ZGlyIGluCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisJY2FzZSAkZmlsZSBpbgorCSoubG8pIDs7CisJKikKKwkgIGZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIHN0YXRpY2xpYnM9CisgICAgZnV0dXJlX2xpYmRpcnM9CisgICAgY3VycmVudF9saWJkaXJzPQorICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKworICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouJGxpYmV4dCkKKwkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgorCWZ1bmNfYXBwZW5kIHN0YXRpY2xpYnMgIiAkZmlsZSIKKwk7OworCisgICAgICAqLmxhKQorCWZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZmlsZSIKKwlmaWxlPSRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGZpbGUiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwlyZWxpbmtfY29tbWFuZD0KKwlmdW5jX3NvdXJjZSAiJGZpbGUiCisKKwkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCisJaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KKwkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGN1cnJlbnRfbGliZGlycyAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZWxzZQorCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmdXR1cmVfbGliZGlycyAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKworCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIvIiAiIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJZnVuY19hcHBlbmQgZGlyICIkb2JqZGlyIgorCisJaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgIyBEZXRlcm1pbmUgdGhlIHByZWZpeCB0aGUgdXNlciBoYXMgYXBwbGllZCB0byBvdXIgZnV0dXJlIGRpci4KKwkgIGluc3RfcHJlZml4X2Rpcj1gJEVDSE8gIiRkZXN0ZGlyIiB8ICRTRUQgLWUgInMlJGxpYmRpclwkJSUiYAorCisJICAjIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIHBsYWNlIHVzIG91dHNpZGUgb2Ygb3VyIGV4cGVjdGVkCisJICAjIGxvY2F0aW9uIGIvYyB0aGlzIHByZXZlbnRzIGZpbmRpbmcgZGVwZW5kZW50IGxpYnJhcmllcyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgdG8gdGhlIHNhbWUgcHJlZml4LgorCSAgIyBBdCBwcmVzZW50LCB0aGlzIGNoZWNrIGRvZXNuJ3QgYWZmZWN0IHdpbmRvd3MgLmRsbCdzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCBpbnRvICRsaWJkaXIvLi4vYmluIChjdXJyZW50bHksIHRoYXQgd29ya3MgZmluZSkKKwkgICMgYnV0IGl0J3Mgc29tZXRoaW5nIHRvIGtlZXAgYW4gZXllIG9uLgorCSAgdGVzdCAiJGluc3RfcHJlZml4X2RpciIgPSAiJGRlc3RkaXIiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIKKworCSAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkgICAgIyBTdGljayB0aGUgaW5zdF9wcmVmaXhfZGlyIGRhdGEgaW50byB0aGUgbGluayBjb21tYW5kLgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAorCSAgZWxzZQorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIiRyZWxpbmtfY29tbWFuZCIgfCAkU0VEICJzJUBpbnN0X3ByZWZpeF9kaXJAJSUiYAorCSAgZmkKKworCSAgZnVuY193YXJuaW5nICJyZWxpbmtpbmcgXGAkZmlsZSciCisJICBmdW5jX3Nob3dfZXZhbCAiJHJlbGlua19jb21tYW5kIiBcCisJICAgICdmdW5jX2ZhdGFsX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnXCcnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiJworCWZpCisKKwkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lczsgc2hpZnQKKwlpZiB0ZXN0IC1uICIkMSI7IHRoZW4KKwkgIHJlYWxuYW1lPSIkMSIKKwkgIHNoaWZ0CisKKwkgIHNyY25hbWU9IiRyZWFsbmFtZSIKKwkgIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCIgJiYgc3JjbmFtZT0iJHJlYWxuYW1lIlQKKworCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgorCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3NoYXJlZF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiBcCisJICAgICAgJ2V4aXQgJD8nCisJICB0c3RyaXBtZT0iJHN0cmlwbWUiCisJICBjYXNlICRob3N0X29zIGluCisJICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJICAgIGNhc2UgJHJlYWxuYW1lIGluCisJICAgICouZGxsLmEpCisJICAgICAgdHN0cmlwbWU9IiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0IC1uICIkdHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KKwkgICAgZnVuY19zaG93X2V2YWwgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiICdleGl0ICQ/JworCSAgZmkKKworCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KKwkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCisJICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KKwkgICAgZm9yIGxpbmtuYW1lCisJICAgIGRvCisJICAgICAgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIiBcCisJCSYmIGZ1bmNfc2hvd19ldmFsICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJFJNICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKKwkgICAgZG9uZQorCSAgZmkKKworCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RpbnN0YWxsX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KKwlmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQorCWZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgJ2V4aXQgJD8nCisKKwkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCisJdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBmdW5jX2FwcGVuZCBzdGF0aWNsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJOzsKKworICAgICAgKi5sbykKKwkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJY2FzZSAkZGVzdGZpbGUgaW4KKwkqLmxvKQorCSAgZnVuY19sbzJvICIkZGVzdGZpbGUiCisJICBzdGF0aWNkZXN0PSRmdW5jX2xvMm9fcmVzdWx0CisJICA7OworCSouJG9iamV4dCkKKwkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKwkgIGRlc3RmaWxlPQorCSAgOzsKKwkqKQorCSAgZnVuY19mYXRhbF9oZWxwICJjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIKKwkgIDs7CisJZXNhYworCisJIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCisJdGVzdCAtbiAiJGRlc3RmaWxlIiAmJiBcCisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiICdleGl0ICQ/JworCisJIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwkgIGZ1bmNfbG8ybyAiJGZpbGUiCisJICBzdGF0aWNvYmo9JGZ1bmNfbG8yb19yZXN1bHQKKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgJ2V4aXQgJD8nCisJZmkKKwlleGl0ICRFWElUX1NVQ0NFU1MKKwk7OworCisgICAgICAqKQorCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYW5kIHRoZXJlIGlzIGEgLmV4ZSBvbiB0aGUgZW5kLCBzdHJpcCBpdAorCSMgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSBhIGxpYnRvb2wgc2NyaXB0IHdlIGFjdHVhbGx5IHdhbnQgdG8KKwkjIGluc3RhbGwKKwlzdHJpcHBlZF9leHQ9IiIKKwljYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKKwkgICAgZmkKKwkgICAgOzsKKwllc2FjCisKKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KikKKwkgICAgaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKKwkgICAgICB3cmFwcGVyPSRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICBlbHNlCisJICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKKwkgICAgICB3cmFwcGVyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgZmkKKwkgICAgOzsKKwkqKQorCSAgICB3cmFwcGVyPSRmaWxlCisJICAgIDs7CisJZXNhYworCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkd3JhcHBlciI7IHRoZW4KKwkgIG5vdGluc3RfZGVwbGlicz0KKwkgIHJlbGlua19jb21tYW5kPQorCisJICBmdW5jX3NvdXJjZSAiJHdyYXBwZXIiCisKKwkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorCSAgdGVzdCAteiAiJGdlbmVyYXRlZF9ieV9saWJ0b29sX3ZlcnNpb24iICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIgorCisJICBmaW5hbGl6ZT15ZXMKKwkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KKwkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgorCSAgICBsaWJkaXI9CisJICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJICAgICAgZnVuY19zb3VyY2UgIiRsaWIiCisJICAgIGZpCisJICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkRUNITyAiJGxpYiIgfCAkU0VEICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX3dhcm5pbmcgIlxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIgorCSAgICAgIGZpbmFsaXplPW5vCisJICAgIGZpCisJICBkb25lCisKKwkgIHJlbGlua19jb21tYW5kPQorCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgorCisJICBvdXRwdXRuYW1lPQorCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgorCSAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKKwkJZnVuY19iYXNlbmFtZSAiJGZpbGUkc3RyaXBwZWRfZXh0IgorCQlmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgorCSAgICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCSAgICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCisKKwkgICAgICAgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkcmVsaW5rX2NvbW1hbmQiCisJCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgICAgICAgfQorCSAgICAgICAgaWYgZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICAgICAgICAgIGVsc2UKKwkJICBmdW5jX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiCisJCSAgJG9wdF9kcnlfcnVuIHx8ICR7Uk19ciAiJHRtcGRpciIKKwkJICBjb250aW51ZQorCSAgICAgICAgZmkKKwkgICAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IHJlbGluayBcYCRmaWxlJyIKKwkgICAgICBmaQorCSAgICB9CisJICBlbHNlCisJICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJEVDSE8gIiRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkU0VEICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAorCSAgZmkKKwlmaQorCisJIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCisJIyBvbmUgYW55d2F5CisJY2FzZSAkaW5zdGFsbF9wcm9nLCRob3N0IGluCisJKi91c3IvYmluL2luc3RhbGwqLCpjeWd3aW4qKQorCSAgY2FzZSAkZmlsZTokZGVzdGZpbGUgaW4KKwkgICouZXhlOiouZXhlKQorCSAgICAjIHRoaXMgaXMgb2sKKwkgICAgOzsKKwkgICouZXhlOiopCisJICAgIGRlc3RmaWxlPSRkZXN0ZmlsZS5leGUKKwkgICAgOzsKKwkgICo6Ki5leGUpCisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGRlc3RmaWxlIgorCSAgICBkZXN0ZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgJ2V4aXQgJD8nCisJJG9wdF9kcnlfcnVuIHx8IGlmIHRlc3QgLW4gIiRvdXRwdXRuYW1lIjsgdGhlbgorCSAgJHtSTX1yICIkdG1wZGlyIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KKyAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisgICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCisgICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgorCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiICdleGl0ICQ/JworCisgICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJG9sZF9zdHJpcGxpYiI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX3Bvc3RpbnN0YWxsX2NtZHMiICdleGl0ICQ/JworICAgIGRvbmUKKworICAgIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyIgJiYgXAorICAgICAgZnVuY193YXJuaW5nICJyZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIgorCisgICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KKyAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCisgICAgICAkb3B0X2RyeV9ydW4gJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgorICAgICAgZXhlY19jbWQ9JyRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1maW5pc2gkY3VycmVudF9saWJkaXJzJworICAgIGVsc2UKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIGZpCit9CisKK3Rlc3QgIiRvcHRfbW9kZSIgPSBpbnN0YWxsICYmIGZ1bmNfbW9kZV9pbnN0YWxsICR7MSsiJEAifQorCisKKyMgZnVuY19nZW5lcmF0ZV9kbHN5bXMgb3V0cHV0bmFtZSBvcmlnaW5hdG9yIHBpY19wCisjIEV4dHJhY3Qgc3ltYm9scyBmcm9tIGRscHJlZmlsZXMgYW5kIGNyZWF0ZSAke291dHB1dG5hbWV9Uy5vIHdpdGgKKyMgYSBkbHByZW9wZW4gc3ltYm9sIHRhYmxlLgorZnVuY19nZW5lcmF0ZV9kbHN5bXMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbXlfb3V0cHV0bmFtZT0iJDEiCisgICAgbXlfb3JpZ2luYXRvcj0iJDIiCisgICAgbXlfcGljX3A9IiR7My1ub30iCisgICAgbXlfcHJlZml4PWAkRUNITyAiJG15X29yaWdpbmF0b3IiIHwgc2VkICdzJVteYS16QS1aMC05XSVfJWcnYAorICAgIG15X2Rsc3ltcz0KKworICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJbXlfZGxzeW1zPSIke215X291dHB1dG5hbWV9Uy5jIgorICAgICAgZWxzZQorCWZ1bmNfZXJyb3IgIm5vdCBjb25maWd1cmVkIHRvIGV4dHJhY3QgZ2xvYmFsIHN5bWJvbHMgZnJvbSBkbHByZW9wZW5lZCBmaWxlcyIKKyAgICAgIGZpCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRteV9kbHN5bXMiOyB0aGVuCisgICAgICBjYXNlICRteV9kbHN5bXMgaW4KKyAgICAgICIiKSA7OworICAgICAgKi5jKQorCSMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCisJbmxpc3Q9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX0ubm0iCisKKwlmdW5jX3Nob3dfZXZhbCAiJFJNICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgorCisJIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KKwlmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisKKwkkb3B0X2RyeV9ydW4gfHwgJEVDSE8gPiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKy8qICRteV9kbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkbXlfb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLworLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiBcIkNcIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA0KSkgfHwgKF9fR05VQ19fID4gNCkpCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV3N0cmljdC1wcm90b3R5cGVzXCIKKyNlbmRpZgorCisvKiBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIGJldHdlZW4gbGlidG9vbC5tNCwgbHRtYWluLCBsdF9zeXN0ZW0uaCwgYW5kIHRlc3RzLiAgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNvbid0IGJlIGNvbnN0LCBiZWNhdXNlIHJ1bnRpbWUKKyAgIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbiBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8KKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUCisjZWxpZiBkZWZpbmVkKF9fb3NmX18pCisvKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhLiAgKi8KKyMgZGVmaW5lIExUX0RMU1lNX0NPTlNUCisjZWxzZQorIyBkZWZpbmUgTFRfRExTWU1fQ09OU1QgY29uc3QKKyNlbmRpZgorCisvKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAorIgorCisJaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KKwkgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKKworCSAgJG9wdF9kcnlfcnVuIHx8IGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgorCisJICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgc3ltYm9sIGxpc3QuCisJICBwcm9nZmlsZXM9YCRFQ0hPICIkb2JqcyRvbGRfZGVwbGlicyIgfCAkU1AyTkwgfCAkU0VEICIkbG8ybyIgfCAkTkwyU1BgCisJICBmb3IgcHJvZ2ZpbGUgaW4gJHByb2dmaWxlczsgZG8KKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRwcm9nZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQnIgorCSAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJE5NICRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgZG9uZQorCisJICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgJyRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCisJICAgIH0KKwkgIGZpCisKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgfQorCSAgZmkKKworCSAgIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwkgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkUk0gJGV4cG9ydF9zeW1ib2xzCisJICAgICAgZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AICQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorICAgICAgICAgICAgICAgIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisgICAgICAgICAgICAgICAgZXZhbCAnY2F0ICIkZXhwb3J0X3N5bWJvbHMiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIH0KKwkgIGVsc2UKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICBldmFsICIke1NFRH0gLWUgJ3MvXChbXS5bKl4kXVwpL1xcXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKKwkgICAgICBldmFsICckR1JFUCAtZiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICAgICAgICAgIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICAgIGV2YWwgJ2NhdCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkgICAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIH0KKwkgIGZpCisJZmkKKworCWZvciBkbHByZWZpbGUgaW4gJGRscHJlZmlsZXM7IGRvCisJICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGRscHJlZmlsZSciCisJICBmdW5jX2Jhc2VuYW1lICIkZGxwcmVmaWxlIgorCSAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgICAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICAgICAgIyBpZiBhbiBpbXBvcnQgbGlicmFyeSwgd2UgbmVlZCB0byBvYnRhaW4gZGxuYW1lCisJICAgICAgaWYgZnVuY193aW4zMl9pbXBvcnRfbGliX3AgIiRkbHByZWZpbGUiOyB0aGVuCisJICAgICAgICBmdW5jX3RyX3NoICIkZGxwcmVmaWxlIgorCSAgICAgICAgZXZhbCAiY3Vycl9sYWZpbGU9XCRsaWJmaWxlXyRmdW5jX3RyX3NoX3Jlc3VsdCIKKwkgICAgICAgIGRscHJlZmlsZV9kbGJhc2VuYW1lPSIiCisJICAgICAgICBpZiB0ZXN0IC1uICIkY3Vycl9sYWZpbGUiICYmIGZ1bmNfbGFsaWJfcCAiJGN1cnJfbGFmaWxlIjsgdGhlbgorCSAgICAgICAgICAjIFVzZSBzdWJzaGVsbCwgdG8gYXZvaWQgY2xvYmJlcmluZyBjdXJyZW50IHZhcmlhYmxlIHZhbHVlcworCSAgICAgICAgICBkbHByZWZpbGVfZGxuYW1lPWBzb3VyY2UgIiRjdXJyX2xhZmlsZSIgJiYgZWNobyAiJGRsbmFtZSJgCisJICAgICAgICAgIGlmIHRlc3QgLW4gIiRkbHByZWZpbGVfZGxuYW1lIiA7IHRoZW4KKwkgICAgICAgICAgICBmdW5jX2Jhc2VuYW1lICIkZGxwcmVmaWxlX2RsbmFtZSIKKwkgICAgICAgICAgICBkbHByZWZpbGVfZGxiYXNlbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICAgICAgICBlbHNlCisJICAgICAgICAgICAgIyBubyBsYWZpbGUuIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgLWRscHJlb3BlbiA8aW1wb3J0IGxpYnJhcnk+LgorCSAgICAgICAgICAgICRzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCAiJGRscHJlZmlsZSIKKwkgICAgICAgICAgICBkbHByZWZpbGVfZGxiYXNlbmFtZT0kc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQKKwkgICAgICAgICAgZmkKKwkgICAgICAgIGZpCisJICAgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICAgICBpZiB0ZXN0IC1uICIkZGxwcmVmaWxlX2RsYmFzZW5hbWUiIDsgdGhlbgorCSAgICAgICAgICAgIGV2YWwgJyRFQ0hPICI6ICRkbHByZWZpbGVfZGxiYXNlbmFtZSIgPj4gIiRubGlzdCInCisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICBmdW5jX3dhcm5pbmcgIkNvdWxkIG5vdCBjb21wdXRlIERMTCBuYW1lIGZyb20gJG5hbWUiCisJICAgICAgICAgICAgZXZhbCAnJEVDSE8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgICAgICAgZmkKKwkgICAgICAgICAgZnVuY190b190b29sX2ZpbGUgIiRkbHByZWZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisJICAgICAgICAgIGV2YWwgIiROTSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfAorCSAgICAgICAgICAgICRTRUQgLWUgJy9JIF9faW1wL2QnIC1lICdzL0kgX19ubV8vRCAvO3MvX25tX18vLycgPj4gJyRubGlzdCciCisJICAgICAgICB9CisJICAgICAgZWxzZSAjIG5vdCBhbiBpbXBvcnQgbGliCisJICAgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICAgICBldmFsICckRUNITyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICAgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJGRscHJlZmlsZSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKwkgICAgICAgICAgZXZhbCAiJE5NIFwiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdFwiIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgICAgICAgIH0KKwkgICAgICBmaQorCSAgICA7OworCSAgICAqKQorCSAgICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgICBldmFsICckRUNITyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICAgICAgZnVuY190b190b29sX2ZpbGUgIiRkbHByZWZpbGUiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisJICAgICAgICBldmFsICIkTk0gXCIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0XCIgMj4vZGV2L251bGwgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICAgIH0KKwkgICAgOzsKKyAgICAgICAgICBlc2FjCisJZG9uZQorCisJJG9wdF9kcnlfcnVuIHx8IHsKKwkgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KKwkgIHRlc3QgLWYgIiRubGlzdCIgfHwgOiA+ICIkbmxpc3QiCisKKwkgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCisJICAgICRNViAiJG5saXN0IlQgIiRubGlzdCIKKwkgIGZpCisKKwkgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisJICBpZiAkR1JFUCAtdiAiXjogIiA8ICIkbmxpc3QiIHwKKwkgICAgICBpZiBzb3J0IC1rIDMgPC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJc29ydCAtayAzCisJICAgICAgZWxzZQorCQlzb3J0ICsyCisJICAgICAgZmkgfAorCSAgICAgIHVuaXEgPiAiJG5saXN0IlM7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICAkR1JFUCAtdiAiXjogIiA8ICIkbmxpc3QiID4gIiRubGlzdCJTCisJICBmaQorCisJICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgorCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCJTID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIicKKwkgIGVsc2UKKwkgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICBmaQorCisJICBlY2hvID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHZvaWQgKmFkZHJlc3M7Cit9IGx0X2Rsc3ltbGlzdDsKK2V4dGVybiBMVF9ETFNZTV9DT05TVCBsdF9kbHN5bWxpc3QKK2x0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXTsKK0xUX0RMU1lNX0NPTlNUIGx0X2Rsc3ltbGlzdAorbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3tcCisgIHsgXCIkbXlfb3JpZ2luYXRvclwiLCAodm9pZCAqKSAwIH0sIgorCisJICBjYXNlICRuZWVkX2xpYl9wcmVmaXggaW4KKwkgIG5vKQorCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgICAgOzsKKwkgICopCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXgiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICAgIDs7CisJICBlc2FjCisJICBlY2hvID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorICB7MCwgKHZvaWQgKikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWZcCisiCisJfSAjICEkb3B0X2RyeV9ydW4KKworCXBpY19mbGFnX2Zvcl9zeW10YWJsZT0KKwljYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KKwkqIiAtc3RhdGljICIqKSA7OworCSopCisJICBjYXNlICRob3N0IGluCisJICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKKwkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcworCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQorCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCisJICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgorCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQorCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURGUkVFQlNEX1dPUktBUk9VTkQiIDs7CisJICAqLSotaHB1eCopCisJICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICJYJG15X3BpY19wIiAhPSBYbm87IHRoZW4KKwkgICAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwlzeW10YWJfY2ZsYWdzPQorCWZvciBhcmcgaW4gJExUQ0ZMQUdTOyBkbworCSAgY2FzZSAkYXJnIGluCisJICAtcGllIHwgLWZwaWUgfCAtZlBJRSkgOzsKKwkgICopIGZ1bmNfYXBwZW5kIHN5bXRhYl9jZmxhZ3MgIiAkYXJnIiA7OworCSAgZXNhYworCWRvbmUKKworCSMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJZnVuY19zaG93X2V2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyRzeW10YWJfY2ZsYWdzIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRteV9kbHN5bXMiKScgJ2V4aXQgJD8nCisKKwkjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCInCisKKwkjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgorCXN5bWZpbGVvYmo9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX1TLiRvYmpleHQiCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmIjsgdGhlbgorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAorCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCisJICBlbHNlCisJICAgIGNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICBmaQorCSAgOzsKKwkqKQorCSAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfY29tbWFuZCIgfCAkU0VEICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAorCSAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIiRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTRUQgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlmdW5jX2ZhdGFsX2Vycm9yICJ1bmtub3duIHN1ZmZpeCBmb3IgXGAkbXlfZGxzeW1zJyIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCisgICAgICAjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCisgICAgICAjIHJlYWxseSB3YXMgcmVxdWlyZWQuCisKKyAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisgICAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTRUQgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICIkZmluYWxpemVfY29tbWFuZCIgfCAkU0VEICJzJSBAU1lNRklMRUAlJSJgCisgICAgZmkKK30KKworIyBmdW5jX3dpbjMyX2xpYmlkIGFyZworIyByZXR1cm4gdGhlIGxpYnJhcnkgdHlwZSBvZiBmaWxlICdhcmcnCisjCisjIE5lZWQgYSBsb3Qgb2YgZ29vIHRvIGhhbmRsZSAqYm90aCogRExMcyBhbmQgaW1wb3J0IGxpYnMKKyMgSGFzIHRvIGJlIGEgc2hlbGwgZnVuY3Rpb24gaW4gb3JkZXIgdG8gJ2VhdCcgdGhlIGFyZ3VtZW50CisjIHRoYXQgaXMgc3VwcGxpZWQgd2hlbiAkZmlsZV9tYWdpY19jb21tYW5kIGlzIGNhbGxlZC4KKyMgRGVzcGl0ZSB0aGUgbmFtZSwgYWxzbyBkZWFsIHdpdGggNjQgYml0IGJpbmFyaWVzLgorZnVuY193aW4zMl9saWJpZCAoKQoreworICAkb3B0X2RlYnVnCisgIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCisgIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCisgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KKyAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0CisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgorICAgIDs7CisgICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKKyAgICAjIEtlZXAgdGhlIGVncmVwIHBhdHRlcm4gaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4gX0xUX0NIRUNLX01BR0lDX01FVEhPRC4KKyAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8CisgICAgICAgJEVHUkVQICdmaWxlIGZvcm1hdCAocGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT98cGUtYXJtLXdpbmNlfHBlLXg4Ni02NCknID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkMSIgZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSBcIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIiB8CisJJFNFRCAtbiAtZSAnCisJICAgIDEsMTAweworCQkvIEkgL3sKKwkJICAgIHMsLiosaW1wb3J0LAorCQkgICAgcAorCQkgICAgcQorCQl9CisJICAgIH0nYAorICAgICAgY2FzZSAkd2luMzJfbm1yZXMgaW4KKyAgICAgIGltcG9ydCopICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiOzsKKyAgICAgICopICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgICpETEwqKQorICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgOzsKKyAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCisgICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKKyAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICRFQ0hPICIkd2luMzJfbGliaWRfdHlwZSIKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWIgQVJHCisjCisjIFBsYXRmb3JtLXNwZWNpZmljIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCisjIG5hbWUgb2YgdGhlIERMTCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorIyBpbXBvcnQgbGlicmFyeSBBUkcuCisjIEludm9rZWQgYnkgZXZhbCdpbmcgdGhlIGxpYnRvb2wgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gdGhlIHZhcmlhYmxlCisjICAgICRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliICgpCit7CisgICRvcHRfZGVidWcKKyAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9YCRETExUT09MIC0taWRlbnRpZnktc3RyaWN0IC0taWRlbnRpZnkgIiQxImAKK30KKworIyBmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSBTRUNUSU9OX05BTUUgTElCTkFNRXMKKyMKKyMgVGhlIGlzIHRoZSBjb3JlIG9mIGEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgYQorIyBwbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbiB0byBleHRyYWN0IHRoZSBuYW1lIG9mIHRoZQorIyBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgaW1wb3J0IGxpYnJhcnkgTElCTkFNRS4KKyMKKyMgU0VDVElPTl9OQU1FIGlzIGVpdGhlciAuaWRhdGEkNiBvciAuaWRhdGEkNywgZGVwZW5kaW5nCisjIG9uIHRoZSBwbGF0Zm9ybSBhbmQgY29tcGlsZXIgdGhhdCBjcmVhdGVkIHRoZSBpbXBsaWIuCisjCisjIEVjaG9zIHRoZSBuYW1lIG9mIHRoZSBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZQorIyBzcGVjaWZpZWQgaW1wb3J0IGxpYnJhcnkuCitmdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2tfY29yZSAoKQoreworICAkb3B0X2RlYnVnCisgIG1hdGNoX2xpdGVyYWw9YCRFQ0hPICIkMSIgfCAkU0VEICIkc2VkX21ha2VfbGl0ZXJhbF9yZWdleCJgCisgICRPQkpEVU1QIC1zIC0tc2VjdGlvbiAiJDEiICIkMiIgMj4vZGV2L251bGwgfAorICAgICRTRUQgJy9eQ29udGVudHMgb2Ygc2VjdGlvbiAnIiRtYXRjaF9saXRlcmFsIic6L3sKKyAgICAgICMgUGxhY2UgbWFya2VyIGF0IGJlZ2lubmluZyBvZiBhcmNoaXZlIG1lbWJlciBkbGxuYW1lIHNlY3Rpb24KKyAgICAgIHMvLiovPT09PU1BUks9PT09LworICAgICAgcAorICAgICAgZAorICAgIH0KKyAgICAjIFRoZXNlIGxpbmVzIGNhbiBzb21ldGltZXMgYmUgbG9uZ2VyIHRoYW4gNDMgY2hhcmFjdGVycywgYnV0CisgICAgIyBhcmUgYWx3YXlzIHVuaW50ZXJlc3RpbmcKKyAgICAvOlsJIF0qZmlsZSBmb3JtYXQgcGVbaV1ceywxXH0tL2QKKyAgICAvXkluIGFyY2hpdmUgW146XSo6L2QKKyAgICAjIEVuc3VyZSBtYXJrZXIgaXMgcHJpbnRlZAorICAgIC9ePT09PU1BUks9PT09L3AKKyAgICAjIFJlbW92ZSBhbGwgbGluZXMgd2l0aCBsZXNzIHRoYW4gNDMgY2hhcmFjdGVycworICAgIC9eLlx7NDNcfS8hZAorICAgICMgRnJvbSByZW1haW5pbmcgbGluZXMsIHJlbW92ZSBmaXJzdCA0MyBjaGFyYWN0ZXJzCisgICAgcy9eLlx7NDNcfS8vJyB8CisgICAgJFNFRCAtbiAnCisgICAgICAjIEpvaW4gbWFya2VyIGFuZCBhbGwgbGluZXMgdW50aWwgbmV4dCBtYXJrZXIgaW50byBhIHNpbmdsZSBsaW5lCisgICAgICAvXj09PT1NQVJLPT09PS8gYiBwYXJhCisgICAgICBICisgICAgICAkIGIgcGFyYQorICAgICAgYgorICAgICAgOnBhcmEKKyAgICAgIHgKKyAgICAgIHMvXG4vL2cKKyAgICAgICMgUmVtb3ZlIHRoZSBtYXJrZXIKKyAgICAgIHMvXj09PT1NQVJLPT09PS8vCisgICAgICAjIFJlbW92ZSB0cmFpbGluZyBkb3RzIGFuZCB3aGl0ZXNwYWNlCisgICAgICBzL1tcLiBcdF0qJC8vCisgICAgICAjIFByaW50CisgICAgICAvLi9wJyB8CisgICAgIyB3ZSBub3cgaGF2ZSBhIGxpc3QsIG9uZSBlbnRyeSBwZXIgbGluZSwgb2YgdGhlIHN0cmluZ2lmaWVkCisgICAgIyBjb250ZW50cyBvZiB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbiBvZiBhbGwgbWVtYmVycyBvZiB0aGUKKyAgICAjIGFyY2hpdmUgd2hpY2ggcG9zc2VzcyB0aGF0IHNlY3Rpb24uIEhldXJpc3RpYzogZWxpbWluYXRlCisgICAgIyBhbGwgdGhvc2Ugd2hpY2ggaGF2ZSBhIGZpcnN0IG9yIHNlY29uZCBjaGFyYWN0ZXIgdGhhdCBpcworICAgICMgYSAnLicgKHRoYXQgaXMsIG9iamR1bXAncyByZXByZXNlbnRhdGlvbiBvZiBhbiB1bnByaW50YWJsZQorICAgICMgY2hhcmFjdGVyLikgVGhpcyBzaG91bGQgd29yayBmb3IgYWxsIGFyY2hpdmVzIHdpdGggbGVzcyB0aGFuCisgICAgIyAweDMwMmYgZXhwb3J0cyAtLSBidXQgd2lsbCBmYWlsIGZvciBETExzIHdob3NlIG5hbWUgYWN0dWFsbHkKKyAgICAjIGJlZ2lucyB3aXRoIGEgbGl0ZXJhbCAnLicgb3IgYSBzaW5nbGUgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5CisgICAgIyBhICcuJy4KKyAgICAjCisgICAgIyBPZiB0aG9zZSB0aGF0IHJlbWFpbiwgcHJpbnQgdGhlIGZpcnN0IG9uZS4KKyAgICAkU0VEIC1lICcvXlwuL2Q7L14uXC4vZDtxJworfQorCisjIGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3AgQVJHCisjIFRoaXMgcHJlZGljYXRlIHJldHVybnMgd2l0aCB6ZXJvIHN0YXR1cyAoVFJVRSkgaWYKKyMgQVJHIGlzIGEgR05VL2JpbnV0aWxzLXN0eWxlIGltcG9ydCBsaWJyYXJ5LiBSZXR1cm5zCisjIHdpdGggbm9uemVybyBzdGF0dXMgKEZBTFNFKSBvdGhlcndpc2UuCitmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl9wICgpCit7CisgICRvcHRfZGVidWcKKyAgZnVuY190b190b29sX2ZpbGUgIiQxIiBmdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICBmdW5jX2N5Z21pbmdfZ251X2ltcGxpYl90bXA9YCROTSAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgfCBldmFsICIkZ2xvYmFsX3N5bWJvbF9waXBlIiB8ICRFR1JFUCAnIChfaGVhZF9bQS1aYS16MC05X10rX1thZF1sKnxbQS1aYS16MC05X10rX1thZF1sKl9pbmFtZSkkJ2AKKyAgdGVzdCAtbiAiJGZ1bmNfY3lnbWluZ19nbnVfaW1wbGliX3RtcCIKK30KKworIyBmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3AgQVJHCisjIFRoaXMgcHJlZGljYXRlIHJldHVybnMgd2l0aCB6ZXJvIHN0YXR1cyAoVFJVRSkgaWYKKyMgQVJHIGlzIGFuIE1TLXN0eWxlIGltcG9ydCBsaWJyYXJ5LiBSZXR1cm5zCisjIHdpdGggbm9uemVybyBzdGF0dXMgKEZBTFNFKSBvdGhlcndpc2UuCitmdW5jX2N5Z21pbmdfbXNfaW1wbGliX3AgKCkKK3sKKyAgJG9wdF9kZWJ1ZworICBmdW5jX3RvX3Rvb2xfZmlsZSAiJDEiIGZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyCisgIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfdG1wPWAkTk0gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiIHwgZXZhbCAiJGdsb2JhbF9zeW1ib2xfcGlwZSIgfCAkR1JFUCAnX05VTExfSU1QT1JUX0RFU0NSSVBUT1InYAorICB0ZXN0IC1uICIkZnVuY19jeWdtaW5nX21zX2ltcGxpYl90bXAiCit9CisKKyMgZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrIEFSRworIyBQbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbiB0byBleHRyYWN0IHRoZQorIyBuYW1lIG9mIHRoZSBETEwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyMgaW1wb3J0IGxpYnJhcnkgQVJHLgorIworIyBUaGlzIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGlzIGZvciB1c2Ugd2hlbiAkRExMVE9PTAorIyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAtLWlkZW50aWZ5LXN0cmljdCBvcHRpb24uCisjIEludm9rZWQgYnkgZXZhbCdpbmcgdGhlIGxpYnRvb2wgdmFyaWFibGUKKyMgICAgJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kCisjIFJlc3VsdCBpcyBhdmFpbGFibGUgaW4gdGhlIHZhcmlhYmxlCisjICAgICRzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdAorZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrICgpCit7CisgICRvcHRfZGVidWcKKyAgaWYgZnVuY19jeWdtaW5nX2dudV9pbXBsaWJfcCAiJDEiIDsgdGhlbgorICAgICMgYmludXRpbHMgaW1wb3J0IGxpYnJhcnkKKyAgICBzaGFyZWRsaWJfZnJvbV9saW5rbGliX3Jlc3VsdD1gZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliX2ZhbGxiYWNrX2NvcmUgJy5pZGF0YSQ3JyAiJDEiYAorICBlbGlmIGZ1bmNfY3lnbWluZ19tc19pbXBsaWJfcCAiJDEiIDsgdGhlbgorICAgICMgbXMtZ2VuZXJhdGVkIGltcG9ydCBsaWJyYXJ5CisgICAgc2hhcmVkbGliX2Zyb21fbGlua2xpYl9yZXN1bHQ9YGZ1bmNfY3lnbWluZ19kbGxfZm9yX2ltcGxpYl9mYWxsYmFja19jb3JlICcuaWRhdGEkNicgIiQxImAKKyAgZWxzZQorICAgICMgdW5rbm93bgorICAgIHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfcmVzdWx0PSIiCisgIGZpCit9CisKKworIyBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSBkaXIgb2xkbGliCitmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBmX2V4X2FuX2FyX2Rpcj0iJDEiOyBzaGlmdAorICAgIGZfZXhfYW5fYXJfb2xkbGliPSIkMSIKKyAgICBpZiB0ZXN0ICIkbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uIiA9IHllczsgdGhlbgorICAgICAgbG9ja2ZpbGU9JGZfZXhfYW5fYXJfb2xkbGliLmxvY2sKKyAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBmaQorICAgIGZ1bmNfc2hvd19ldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcIlwkZl9leF9hbl9hcl9vbGRsaWJcIikiIFwKKwkJICAgJ3N0YXQ9JD87IHJtIC1mICIkbG9ja2ZpbGUiOyBleGl0ICRzdGF0JworICAgIGlmIHRlc3QgIiRsb2NrX29sZF9hcmNoaXZlX2V4dHJhY3Rpb24iID0geWVzOyB0aGVuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgcm0gLWYgIiRsb2NrZmlsZSIKKyAgICBmaQorICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgIDoKKyAgICBlbHNlCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJvYmplY3QgbmFtZSBjb25mbGljdHMgaW4gYXJjaGl2ZTogJGZfZXhfYW5fYXJfZGlyLyRmX2V4X2FuX2FyX29sZGxpYiIKKyAgICBmaQorfQorCisKKyMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCitmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0CisgICAgbXlfb2xkbGlicz0kezErIiRAIn0KKyAgICBteV9vbGRvYmpzPSIiCisgICAgbXlfeGxpYj0iIgorICAgIG15X3hhYnM9IiIKKyAgICBteV94ZGlyPSIiCisKKyAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KKyAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KKyAgICAgIGNhc2UgJG15X3hsaWIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OworCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OworICAgICAgZXNhYworICAgICAgZnVuY19iYXNlbmFtZSAiJG15X3hsaWIiCisgICAgICBteV94bGliPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICBteV94bGliX3U9JG15X3hsaWIKKyAgICAgIHdoaWxlIDo7IGRvCisgICAgICAgIGNhc2UgIiAkZXh0cmFjdGVkX2FyY2hpdmVzICIgaW4KKwkqIiAkbXlfeGxpYl91ICIqKQorCSAgZnVuY19hcml0aCAkZXh0cmFjdGVkX3NlcmlhbCArIDEKKwkgIGV4dHJhY3RlZF9zZXJpYWw9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICBteV94bGliX3U9bHQkZXh0cmFjdGVkX3NlcmlhbC0kbXlfeGxpYiA7OworCSopIGJyZWFrIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZXh0cmFjdGVkX2FyY2hpdmVzPSIkZXh0cmFjdGVkX2FyY2hpdmVzICRteV94bGliX3UiCisgICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliX3UiCisKKyAgICAgIGZ1bmNfbWtkaXJfcCAiJG15X3hkaXIiCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotZGFyd2luKikKKwlmdW5jX3ZlcmJvc2UgIkV4dHJhY3RpbmcgJG15X3hhYnMiCisJIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCisJJG9wdF9kcnlfcnVuIHx8IHsKKwkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAorCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPworCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKKwkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKKwkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YGJhc2VuYW1lICIkZGFyd2luX2FyY2hpdmUiYAorCSAgZGFyd2luX2FyY2hlcz1gJExJUE8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsIHx8IHRydWVgCisJICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4KKwkgICAgZGFyd2luX2FyY2hlcz1gJEVDSE8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAorCSAgICBkYXJ3aW5fYXJjaD0KKwkgICAgZnVuY192ZXJib3NlICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKKwkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCisJICAgICAgZnVuY19ta2Rpcl9wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgICRMSVBPIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKKwkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKKwkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKKwkgICAgICAkUk0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKKwkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCisgICAgICAgICAgICAjIyBPa2F5IG5vdyB3ZSd2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKKwkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJFNFRCAtZSAiJGJhc2VuYW1lIiB8IHNvcnQgLXVgCisJICAgIGRhcndpbl9maWxlPQorCSAgICBkYXJ3aW5fZmlsZXM9CisJICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbworCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgc29ydCB8ICROTDJTUGAKKwkgICAgICAkTElQTyAtY3JlYXRlIC1vdXRwdXQgIiRkYXJ3aW5fZmlsZSIgJGRhcndpbl9maWxlcworCSAgICBkb25lICMgJGRhcndpbl9maWxlbGlzdAorCSAgICAkUk0gLXJmIHVuZmF0LSQkCisJICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgorCSAgZWxzZQorCSAgICBjZCAkZGFyd2luX29yaWdfZGlyCisJICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgorCSAgZmkgIyAkZGFyd2luX2FyY2hlcworCX0gIyAhJG9wdF9kcnlfcnVuCisJOzsKKyAgICAgICopCisgICAgICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgorCTs7CisgICAgICBlc2FjCisgICAgICBteV9vbGRvYmpzPSIkbXlfb2xkb2JqcyAiYGZpbmQgJG15X3hkaXIgLW5hbWUgXCouJG9iamV4dCAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgc29ydCB8ICROTDJTUGAKKyAgICBkb25lCisKKyAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0PSIkbXlfb2xkb2JqcyIKK30KKworCisjIGZ1bmNfZW1pdF93cmFwcGVyIFthcmc9bm9dCisjCisjIEVtaXQgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KKyMgRG9uJ3QgZGlyZWN0bHkgb3BlbiBhIGZpbGUgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bworIyBpbmNvcnBvcmF0ZSB0aGUgc2NyaXB0IGNvbnRlbnRzIHdpdGhpbiBhIGN5Z3dpbi9taW5ndworIyB3cmFwcGVyIGV4ZWN1dGFibGUuICBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluCisjIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZXMKKyMgc2V0IHRoZXJlaW4uCisjCisjIEFSRyBpcyB0aGUgdmFsdWUgdGhhdCB0aGUgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVIKKyMgdmFyaWFibGUgd2lsbCB0YWtlLiAgSWYgJ3llcycsIHRoZW4gdGhlIGVtaXR0ZWQgc2NyaXB0CisjIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBpcyBzdG9yZWQgaXMKKyMgdGhlICRvYmpkaXIgZGlyZWN0b3J5LiAgVGhpcyBpcyBhIGN5Z3dpbi9taW5ndy1zcGVjaWZpYworIyBiZWhhdmlvci4KK2Z1bmNfZW1pdF93cmFwcGVyICgpCit7CisJZnVuY19lbWl0X3dyYXBwZXJfYXJnMT0kezEtbm99CisKKwkkRUNITyAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiBcJHsxK1wiXCRAXCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnXCR7MStcIlwkQFwifSc9J1wiXCRAXCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgXGAoc2V0IC1vKSAyPi9kZXYvbnVsbFxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKK2ZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCityZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCisKKyMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KK2lmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgorICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKyAgZ2VuZXJhdGVkX2J5X2xpYnRvb2xfdmVyc2lvbj0nJG1hY3JvX3ZlcnNpb24nCisgIG5vdGluc3RfZGVwbGlicz0nJG5vdGluc3RfZGVwbGlicycKK2Vsc2UKKyAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJEVDSE8gYXJlIGFscmVhZHkgc2V0LgorICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCisgICAgZmlsZT1cIlwkMFwiIgorCisgICAgcUVDSE89YCRFQ0hPICIkRUNITyIgfCAkU0VEICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAkRUNITyAiXAorCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkMQorX0xURUNIT19FT0YnCit9CisgICAgRUNITz1cIiRxRUNIT1wiCisgIGZpCisKKyMgVmVyeSBiYXNpYyBvcHRpb24gcGFyc2luZy4gVGhlc2Ugb3B0aW9ucyBhcmUgKGEpIHNwZWNpZmljIHRvCisjIHRoZSBsaWJ0b29sIHdyYXBwZXIsIChiKSBhcmUgaWRlbnRpY2FsIGJldHdlZW4gdGhlIHdyYXBwZXIKKyMgL3NjcmlwdC8gYW5kIHRoZSB3cmFwcGVyIC9leGVjdXRhYmxlLyB3aGljaCBpcyB1c2VkIG9ubHkgb24KKyMgd2luZG93cyBwbGF0Zm9ybXMsIGFuZCAoYykgYWxsIGJlZ2luIHdpdGggdGhlIHN0cmluZyAiLS1sdC0iCisjIChhcHBsaWNhdGlvbiBwcm9ncmFtcyBhcmUgdW5saWtlbHkgdG8gaGF2ZSBvcHRpb25zIHdoaWNoIG1hdGNoCisjIHRoaXMgcGF0dGVybikuCisjCisjIFRoZXJlIGFyZSBvbmx5IHR3byBzdXBwb3J0ZWQgb3B0aW9uczogLS1sdC1kZWJ1ZyBhbmQKKyMgLS1sdC1kdW1wLXNjcmlwdC4gVGhlcmUgaXMsIGRlbGliZXJhdGVseSwgbm8gLS1sdC1oZWxwLgorIworIyBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhpcyBwYXJzaW5nIGZ1bmN0aW9uIHNob3VsZCBiZSB0aGUKKyMgc2NyaXB0J3MgJDAgdmFsdWUsIGZvbGxvd2VkIGJ5ICIkQCIuCitsdF9vcHRpb25fZGVidWc9CitmdW5jX3BhcnNlX2x0X29wdGlvbnMgKCkKK3sKKyAgbHRfc2NyaXB0X2FyZzA9XCQwCisgIHNoaWZ0CisgIGZvciBsdF9vcHQKKyAgZG8KKyAgICBjYXNlIFwiXCRsdF9vcHRcIiBpbgorICAgIC0tbHQtZGVidWcpIGx0X29wdGlvbl9kZWJ1Zz0xIDs7CisgICAgLS1sdC1kdW1wLXNjcmlwdCkKKyAgICAgICAgbHRfZHVtcF9EPVxgXCRFQ0hPIFwiWFwkbHRfc2NyaXB0X2FyZzBcIiB8ICRTRUQgLWUgJ3MvXlgvLycgLWUgJ3MlL1teL10qJCUlJ1xgCisgICAgICAgIHRlc3QgXCJYXCRsdF9kdW1wX0RcIiA9IFwiWFwkbHRfc2NyaXB0X2FyZzBcIiAmJiBsdF9kdW1wX0Q9LgorICAgICAgICBsdF9kdW1wX0Y9XGBcJEVDSE8gXCJYXCRsdF9zY3JpcHRfYXJnMFwiIHwgJFNFRCAtZSAncy9eWC8vJyAtZSAncyVeLiovJSUnXGAKKyAgICAgICAgY2F0IFwiXCRsdF9kdW1wX0QvXCRsdF9kdW1wX0ZcIgorICAgICAgICBleGl0IDAKKyAgICAgIDs7CisgICAgLS1sdC0qKQorICAgICAgICBcJEVDSE8gXCJVbnJlY29nbml6ZWQgLS1sdC0gb3B0aW9uOiAnXCRsdF9vcHQnXCIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgIyBQcmludCB0aGUgZGVidWcgYmFubmVyIGltbWVkaWF0ZWx5OgorICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgIGVjaG8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBsaWJ0b29sIHdyYXBwZXIgKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OXCIgMT4mMgorICBmaQorfQorCisjIFVzZWQgd2hlbiAtLWx0LWRlYnVnLiBQcmludHMgaXRzIGFyZ3VtZW50cyB0byBzdGRvdXQKKyMgKHJlZGlyZWN0aW9uIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyKQorZnVuY19sdF9kdW1wX2FyZ3MgKCkKK3sKKyAgbHRfZHVtcF9hcmdzX049MTsKKyAgZm9yIGx0X2FyZworICBkbworICAgIFwkRUNITyBcIiR7b3V0cHV0bmFtZX06JHtvdXRwdXR9Olwke0xJTkVOT306IG5ld2FyZ3ZbXCRsdF9kdW1wX2FyZ3NfTl06IFwkbHRfYXJnXCIKKyAgICBsdF9kdW1wX2FyZ3NfTj1cYGV4cHIgXCRsdF9kdW1wX2FyZ3NfTiArIDFcYAorICBkb25lCit9CisKKyMgQ29yZSBmdW5jdGlvbiBmb3IgbGF1bmNoaW5nIHRoZSB0YXJnZXQgYXBwbGljYXRpb24KK2Z1bmNfZXhlY19wcm9ncmFtX2NvcmUgKCkKK3sKKyIKKyAgY2FzZSAkaG9zdCBpbgorICAjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKyAgKi0qLW1pbmd3IHwgKi0qLW9zMiogfCAqLWNlZ2NjKikKKyAgICAkRUNITyAiXAorICAgICAgaWYgdGVzdCAtbiBcIlwkbHRfb3B0aW9uX2RlYnVnXCI7IHRoZW4KKyAgICAgICAgXCRFQ0hPIFwiJHtvdXRwdXRuYW1lfToke291dHB1dH06XCR7TElORU5PfTogbmV3YXJndlswXTogXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIDE+JjIKKyAgICAgICAgZnVuY19sdF9kdW1wX2FyZ3MgXCR7MStcIlwkQFwifSAxPiYyCisgICAgICBmaQorICAgICAgZXhlYyBcIlwkcHJvZ2RpclxcXFxcJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisgICAgOzsKKworICAqKQorICAgICRFQ0hPICJcCisgICAgICBpZiB0ZXN0IC1uIFwiXCRsdF9vcHRpb25fZGVidWdcIjsgdGhlbgorICAgICAgICBcJEVDSE8gXCIke291dHB1dG5hbWV9OiR7b3V0cHV0fTpcJHtMSU5FTk99OiBuZXdhcmd2WzBdOiBcJHByb2dkaXIvXCRwcm9ncmFtXCIgMT4mMgorICAgICAgICBmdW5jX2x0X2R1bXBfYXJncyBcJHsxK1wiXCRAXCJ9IDE+JjIKKyAgICAgIGZpCisgICAgICBleGVjIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKyAgICA7OworICBlc2FjCisgICRFQ0hPICJcCisgICAgICBcJEVDSE8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJCpcIiAxPiYyCisgICAgICBleGl0IDEKK30KKworIyBBIGZ1bmN0aW9uIHRvIGVuY2Fwc3VsYXRlIGxhdW5jaGluZyB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uCisjIFN0cmlwcyBvcHRpb25zIGluIHRoZSAtLWx0LSogbmFtZXNwYWNlIGZyb20gXCRAIGFuZAorIyBsYXVuY2hlcyB0YXJnZXQgYXBwbGljYXRpb24gd2l0aCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy4KK2Z1bmNfZXhlY19wcm9ncmFtICgpCit7CisgIGZvciBsdF93cl9hcmcKKyAgZG8KKyAgICBjYXNlIFwkbHRfd3JfYXJnIGluCisgICAgLS1sdC0qKSA7OworICAgICopIHNldCB4IFwiXCRAXCIgXCJcJGx0X3dyX2FyZ1wiOyBzaGlmdDs7CisgICAgZXNhYworICAgIHNoaWZ0CisgIGRvbmUKKyAgZnVuY19leGVjX3Byb2dyYW1fY29yZSBcJHsxK1wiXCRAXCJ9Cit9CisKKyAgIyBQYXJzZSBvcHRpb25zCisgIGZ1bmNfcGFyc2VfbHRfb3B0aW9ucyBcIlwkMFwiIFwkezErXCJcJEBcIn0KKworICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgorICB0aGlzZGlyPVxgXCRFQ0hPIFwiXCRmaWxlXCIgfCAkU0VEICdzJS9bXi9dKiQlJSdcYAorICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCisKKyAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCisgIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICRTRUQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbworICAgIGRlc3RkaXI9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlL1teL10qXCQlJSdcYAorCisgICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgorICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KKyAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgorICAgICAgW1xcXFwvXSogfCBbQS1aYS16XTpbXFxcXC9dKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7CisgICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7CisgICAgICBlc2FjCisgICAgZmkKKworICAgIGZpbGU9XGBcJEVDSE8gXCJcJGZpbGVcIiB8ICRTRUQgJ3MlXi4qLyUlJ1xgCisgICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICRTRUQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgZG9uZQorCisgICMgVXN1YWxseSAnbm8nLCBleGNlcHQgb24gY3lnd2luL21pbmd3IHdoZW4gZW1iZWRkZWQgaW50bworICAjIHRoZSBjd3JhcHBlci4KKyAgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVI9JGZ1bmNfZW1pdF93cmFwcGVyX2FyZzEKKyAgaWYgdGVzdCBcIlwkV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVJcIiA9IFwieWVzXCI7IHRoZW4KKyAgICAjIHNwZWNpYWwgY2FzZSBmb3IgJy4nCisgICAgaWYgdGVzdCBcIlwkdGhpc2RpclwiID0gXCIuXCI7IHRoZW4KKyAgICAgIHRoaXNkaXI9XGBwd2RcYAorICAgIGZpCisgICAgIyByZW1vdmUgLmxpYnMgZnJvbSB0aGlzZGlyCisgICAgY2FzZSBcIlwkdGhpc2RpclwiIGluCisgICAgKltcXFxcL10kb2JqZGlyICkgdGhpc2Rpcj1cYFwkRUNITyBcIlwkdGhpc2RpclwiIHwgJFNFRCAncyVbXFxcXC9dW15cXFxcL10qJCUlJ1xgIDs7CisgICAgJG9iamRpciApICAgdGhpc2Rpcj0uIDs7CisgICAgZXNhYworICBmaQorCisgICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCisgIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKKyAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKKyIKKworCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAkRUNITyAiXAorICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0CisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisKKyAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8CisgICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKKyAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgorCisgICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKKworICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCisgICAgICAkTUtESVIgXCJcJHByb2dkaXJcIgorICAgIGVsc2UKKyAgICAgICRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICAgIGZpIgorCisJICAkRUNITyAiXAorCisgICAgIyByZWxpbmsgZXhlY3V0YWJsZSBpZiBuZWNlc3NhcnkKKyAgICBpZiB0ZXN0IC1uIFwiXCRyZWxpbmtfY29tbWFuZFwiOyB0aGVuCisgICAgICBpZiByZWxpbmtfY29tbWFuZF9vdXRwdXQ9XGBldmFsIFwkcmVsaW5rX2NvbW1hbmQgMj4mMVxgOyB0aGVuIDoKKyAgICAgIGVsc2UKKwkkRUNITyBcIlwkcmVsaW5rX2NvbW1hbmRfb3V0cHV0XCIgPiYyCisJJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisJZXhpdCAxCisgICAgICBmaQorICAgIGZpCisKKyAgICAkTVYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfHwKKyAgICB7ICRSTSBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsKKyAgICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfQorICAgICRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICBmaSIKKwllbHNlCisJICAkRUNITyAiXAorICBwcm9ncmFtPSckb3V0cHV0bmFtZScKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKyIKKwlmaQorCisJJEVDSE8gIlwKKworICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgorCisJIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KKwkjCisJIyBGaXggdGhlIERMTCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uICBEbyB0aGlzIGJlZm9yZSBwcmVwZW5kaW5nCisJIyB0byBzaGxpYnBhdGgsIGJlY2F1c2Ugb24gV2luZG93cywgYm90aCBhcmUgUEFUSCBhbmQgdW5pbnN0YWxsZWQKKwkjIGxpYnJhcmllcyBtdXN0IGNvbWUgZmlyc3QuCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICisgICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKKyIKKwlmaQorCisJIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCisJaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorCSAgJEVDSE8gIlwKKyAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgorICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKKworICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgorICAgICMgVGhlIHNlY29uZCBjb2xvbiBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEJlT1MgUjQgc2VkCisgICAgJHNobGlicGF0aF92YXI9XGBcJEVDSE8gXCJcJCRzaGxpYnBhdGhfdmFyXCIgfCAkU0VEICdzLzo6KlwkLy8nXGAKKworICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgorIgorCWZpCisKKwkkRUNITyAiXAorICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCisgICAgICBmdW5jX2V4ZWNfcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9CisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJEVDSE8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCisgICAgXCRFQ0hPIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCisgICAgXCRFQ0hPIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKK2ZpXAorIgorfQorCisKKyMgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworIyBlbWl0IHRoZSBzb3VyY2UgY29kZSBmb3IgYSB3cmFwcGVyIGV4ZWN1dGFibGUgb24gc3Rkb3V0CisjIE11c3QgT05MWSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gZnVuY19tb2RlX2xpbmsgYmVjYXVzZQorIyBpdCBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHZhcmlhYmxlIHNldCB0aGVyZWluLgorZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyAoKQoreworCWNhdCA8PEVPRgorCisvKiAkY3dyYXBwZXJzb3VyY2UgLSB0ZW1wb3Jhcnkgd3JhcHBlciBleGVjdXRhYmxlIGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCisgICBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisKKyAgIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorICAgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgorCisgICBUaGlzIHdyYXBwZXIgZXhlY3V0YWJsZSBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCisgICBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisqLworRU9GCisJICAgIGNhdCA8PCJFT0YiCisjaWZkZWYgX01TQ19WRVIKKyMgZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxwcm9jZXNzLmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGlmZGVmIF9fQ1lHV0lOX18KKyMgIGluY2x1ZGUgPGlvLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisvKiBkZWNsYXJhdGlvbnMgb2Ygbm9uLUFOU0kgZnVuY3Rpb25zICovCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitpbnQgX3B1dGVudiAoY29uc3QgY2hhciAqKTsKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgaWZkZWYgX19TVFJJQ1RfQU5TSV9fCitjaGFyICpyZWFscGF0aCAoY29uc3QgY2hhciAqLCBjaGFyICopOworaW50IHB1dGVudiAoY2hhciAqKTsKK2ludCBzZXRlbnYgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworIyBlbmRpZgorLyogI2VsaWYgZGVmaW5lZCAob3RoZXIgcGxhdGZvcm1zKSAuLi4gKi8KKyNlbmRpZgorCisvKiBwb3J0YWJpbGl0eSBkZWZpbmVzLCBleGNsdWRpbmcgcGF0aCBoYW5kbGluZyBtYWNyb3MgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQorIyBkZWZpbmUgc3RhdCAgICBfc3RhdAorIyBkZWZpbmUgY2htb2QgICBfY2htb2QKKyMgZGVmaW5lIGdldGN3ZCAgX2dldGN3ZAorIyBkZWZpbmUgcHV0ZW52ICBfcHV0ZW52CisjIGRlZmluZSBTX0lYVVNSIF9TX0lFWEVDCisjIGlmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAorIyAgZGVmaW5lIF9JTlRQVFJfVF9ERUZJTkVECisjICBkZWZpbmUgaW50cHRyX3QgaW50CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBkZWZpbmUgc2V0bW9kZSBfc2V0bW9kZQorIyBkZWZpbmUgc3RhdCAgICBfc3RhdAorIyBkZWZpbmUgY2htb2QgICBfY2htb2QKKyMgZGVmaW5lIGdldGN3ZCAgX2dldGN3ZAorIyBkZWZpbmUgcHV0ZW52ICBfcHV0ZW52CisjZWxpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBIQVZFX1NFVEVOVgorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorLyogI2VsaWYgZGVmaW5lZCAob3RoZXIgcGxhdGZvcm1zKSAuLi4gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQQVRIX01BWCkKKyMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKKyNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKKyMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgorI2Vsc2UKKyMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAorI2VuZGlmCisKKyNpZm5kZWYgU19JWE9USAorIyBkZWZpbmUgU19JWE9USCAwCisjZW5kaWYKKyNpZm5kZWYgU19JWEdSUAorIyBkZWZpbmUgU19JWEdSUCAwCisjZW5kaWYKKworLyogcGF0aCBoYW5kbGluZyBwb3J0YWJpbGl0eSBtYWNyb3MgKi8KKyNpZm5kZWYgRElSX1NFUEFSQVRPUgorIyBkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCisgIGRlZmluZWQgKF9fT1MyX18pCisjIGRlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorIyBpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjICBkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKKyMgZW5kaWYKKyMgaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBQQVRIX1NFUEFSQVRPUl8yICc7JworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQorI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCisJKCgoY2gpID09IERJUl9TRVBBUkFUT1IpIHx8ICgoY2gpID09IERJUl9TRVBBUkFUT1JfMikpCisjZW5kaWYgLyogRElSX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SKQorI2Vsc2UgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SXzIpCisjZW5kaWYgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworCisjaWZuZGVmIEZPUEVOX1dCCisjIGRlZmluZSBGT1BFTl9XQiAidyIKKyNlbmRpZgorI2lmbmRlZiBfT19CSU5BUlkKKyMgZGVmaW5lIF9PX0JJTkFSWSAwCisjZW5kaWYKKworI2RlZmluZSBYTUFMTE9DKHR5cGUsIG51bSkgICAgICAoKHR5cGUgKikgeG1hbGxvYyAoKG51bSkgKiBzaXplb2YodHlwZSkpKQorI2RlZmluZSBYRlJFRShzdGFsZSkgZG8geyBcCisgIGlmIChzdGFsZSkgeyBmcmVlICgodm9pZCAqKSBzdGFsZSk7IHN0YWxlID0gMDsgfSBcCit9IHdoaWxlICgwKQorCisjaWYgZGVmaW5lZChMVF9ERUJVR1dSQVBQRVIpCitzdGF0aWMgaW50IGx0X2RlYnVnID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGx0X2RlYnVnID0gMDsKKyNlbmRpZgorCitjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSAibGlidG9vbC13cmFwcGVyIjsgLyogaW4gY2FzZSB4c3RyZHVwIGZhaWxzICovCisKK3ZvaWQgKnhtYWxsb2MgKHNpemVfdCBudW0pOworY2hhciAqeHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKTsKK2NvbnN0IGNoYXIgKmJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7CitjaGFyICpmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpOworY2hhciAqY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKTsKK2ludCBtYWtlX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGNoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpOworY2hhciAqc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCk7Cit2b2lkIGx0X2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7CitzdGF0aWMgY29uc3QgY2hhciAqbm9ubnVsbCAoY29uc3QgY2hhciAqcyk7CitzdGF0aWMgY29uc3QgY2hhciAqbm9uZW1wdHkgKGNvbnN0IGNoYXIgKnMpOwordm9pZCBsdF9zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2NoYXIgKmx0X2V4dGVuZF9zdHIgKGNvbnN0IGNoYXIgKm9yaWdfdmFsdWUsIGNvbnN0IGNoYXIgKmFkZCwgaW50IHRvX2VuZCk7Cit2b2lkIGx0X3VwZGF0ZV9leGVfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOwordm9pZCBsdF91cGRhdGVfbGliX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2NoYXIgKipwcmVwYXJlX3NwYXduIChjaGFyICoqYXJndik7Cit2b2lkIGx0X2R1bXBfc2NyaXB0IChGSUxFICpmKTsKK0VPRgorCisJICAgIGNhdCA8PEVPRgordm9sYXRpbGUgY29uc3QgY2hhciAqIE1BR0lDX0VYRSA9ICIkbWFnaWNfZXhlIjsKK2NvbnN0IGNoYXIgKiBMSUJfUEFUSF9WQVJOQU1FID0gIiRzaGxpYnBhdGhfdmFyIjsKK0VPRgorCisJICAgIGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiR0ZW1wX3JwYXRoIgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCI7CitFT0YKKwkgICAgZWxzZQorCSAgICAgIGNhdCA8PCJFT0YiCitjb25zdCBjaGFyICogTElCX1BBVEhfVkFMVUUgICA9ICIiOworRU9GCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisgICAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoICIkZGxsc2VhcmNocGF0aDoiCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogRVhFX1BBVEhfVkFSTkFNRSA9ICJQQVRIIjsKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiOworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDwiRU9GIgorY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBUk5BTUUgPSAiIjsKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiI7CitFT0YKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIFRBUkdFVF9QUk9HUkFNX05BTUUgPSAibHQtJG91dHB1dG5hbWUiOyAvKiBob3BlZnVsbHksIG5vIC5leGUgKi8KK0VPRgorCSAgICBlbHNlCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICIkb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGZpCisKKworCSAgICBjYXQgPDwiRU9GIgorCisjZGVmaW5lIExUV1JBUFBFUl9PUFRJT05fUFJFRklYICAgICAgICAgIi0tbHQtIgorCitzdGF0aWMgY29uc3QgY2hhciAqbHR3cmFwcGVyX29wdGlvbl9wcmVmaXggPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWDsKK3N0YXRpYyBjb25zdCBjaGFyICpkdW1wc2NyaXB0X29wdCAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkdW1wLXNjcmlwdCI7CitzdGF0aWMgY29uc3QgY2hhciAqZGVidWdfb3B0ICAgICAgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZGVidWciOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGNoYXIgKipuZXdhcmd6OworICBpbnQgIG5ld2FyZ2M7CisgIGNoYXIgKnRtcF9wYXRoc3BlYzsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX3BhdGg7CisgIGNoYXIgKmFjdHVhbF9jd3JhcHBlcl9uYW1lOworICBjaGFyICp0YXJnZXRfbmFtZTsKKyAgY2hhciAqbHRfYXJndl96ZXJvOworICBpbnRwdHJfdCBydmFsID0gMTI3OworCisgIGludCBpOworCisgIHByb2dyYW1fbmFtZSA9IChjaGFyICopIHhzdHJkdXAgKGJhc2VfbmFtZSAoYXJndlswXSkpOworICBuZXdhcmd6ID0gWE1BTExPQyAoY2hhciAqLCBhcmdjICsgMSk7CisKKyAgLyogdmVyeSBzaW1wbGUgYXJnIHBhcnNpbmc7IGRvbid0IHdhbnQgdG8gcmVseSBvbiBnZXRvcHQKKyAgICogYWxzbywgY29weSBhbGwgbm9uIGN3cmFwcGVyIG9wdGlvbnMgdG8gbmV3YXJneiwgZXhjZXB0CisgICAqIGFyZ3pbMF0sIHdoaWNoIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkKKyAgICovCisgIG5ld2FyZ2M9MDsKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkdW1wc2NyaXB0X29wdCkgPT0gMCkKKwl7CitFT0YKKwkgICAgY2FzZSAiJGhvc3QiIGluCisJICAgICAgKm1pbmd3KiB8ICpjeWd3aW4qICkKKwkJIyBtYWtlIHN0ZG91dCB1c2UgInVuaXgiIGxpbmUgZW5kaW5ncworCQllY2hvICIgICAgICAgICAgc2V0bW9kZSgxLF9PX0JJTkFSWSk7IgorCQk7OworCSAgICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorCSAgbHRfZHVtcF9zY3JpcHQgKHN0ZG91dCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkZWJ1Z19vcHQpID09IDApCisJeworICAgICAgICAgIGx0X2RlYnVnID0gMTsKKyAgICAgICAgICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBsdHdyYXBwZXJfb3B0aW9uX3ByZWZpeCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGhvd2V2ZXIsIGlmIHRoZXJlIGlzIGFuIG9wdGlvbiBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKKyAgICAgICAgICAgICBuYW1lc3BhY2UsIGJ1dCBpdCBpcyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGtub3cgYWJvdXQgYW5kCisgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGRlYWx0IHdpdGgsIGFib3ZlIChpbmx1ZGluZyBkdW1wLXNjcmlwdCksIHRoZW4KKyAgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IuIE90aGVyd2lzZSwgdGFyZ2V0cyBtaWdodCBiZWdpbiB0byBiZWxpZXZlCisgICAgICAgICAgICAgdGhleSBhcmUgYWxsb3dlZCB0byB1c2Ugb3B0aW9ucyBpbiB0aGUgTFRXUkFQUEVSX09QVElPTl9QUkVGSVgKKyAgICAgICAgICAgICBuYW1lc3BhY2UuIFRoZSBmaXJzdCB0aW1lIGFueSB1c2VyIGNvbXBsYWlucyBhYm91dCB0aGlzLCB3ZSdsbAorICAgICAgICAgICAgIG5lZWQgdG8gbWFrZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCBhIGNvbmZpZ3VyZS10aW1lIG9wdGlvbgorICAgICAgICAgICAgIG9yIGEgY29uZmlndXJlLmFjLXNldHRhYmxlIHZhbHVlLgorICAgICAgICAgICAqLworICAgICAgICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAidW5yZWNvZ25pemVkICVzIG9wdGlvbjogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBhcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgLyogb3RoZXJ3aXNlIC4uLiAqLworICAgICAgbmV3YXJnelsrK25ld2FyZ2NdID0geHN0cmR1cCAoYXJndltpXSk7CisgICAgfQorICBuZXdhcmd6WysrbmV3YXJnY10gPSBOVUxMOworCitFT0YKKwkgICAgY2F0IDw8RU9GCisgIC8qIFRoZSBHTlUgYmFubmVyIG11c3QgYmUgdGhlIGZpcnN0IG5vbi1lcnJvciBkZWJ1ZyBtZXNzYWdlICovCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICJsaWJ0b29sIHdyYXBwZXIgKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OXG4iKTsKK0VPRgorCSAgICBjYXQgPDwiRU9GIgorICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1haW4pIGFyZ3ZbMF06ICVzXG4iLCBhcmd2WzBdKTsKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBwcm9ncmFtX25hbWU6ICVzXG4iLCBwcm9ncmFtX25hbWUpOworCisgIHRtcF9wYXRoc3BlYyA9IGZpbmRfZXhlY3V0YWJsZSAoYXJndlswXSk7CisgIGlmICh0bXBfcGF0aHNwZWMgPT0gTlVMTCkKKyAgICBsdF9mYXRhbCAoX19GSUxFX18sIF9fTElORV9fLCAiY291bGRuJ3QgZmluZCAlcyIsIGFyZ3ZbMF0pOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIihtYWluKSBmb3VuZCBleGUgKGJlZm9yZSBzeW1saW5rIGNoYXNlKSBhdDogJXNcbiIsCisJCSAgdG1wX3BhdGhzcGVjKTsKKworICBhY3R1YWxfY3dyYXBwZXJfcGF0aCA9IGNoYXNlX3N5bWxpbmtzICh0bXBfcGF0aHNwZWMpOworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgIihtYWluKSBmb3VuZCBleGUgKGFmdGVyIHN5bWxpbmsgY2hhc2UpIGF0OiAlc1xuIiwKKwkJICBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0geHN0cmR1cCAoYmFzZV9uYW1lIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9wYXRoLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogd3JhcHBlciBuYW1lIHRyYW5zZm9ybXMgKi8KKyAgc3RyZW5kemFwIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAoYWN0dWFsX2N3cmFwcGVyX25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIC8qIHRhcmdldF9uYW1lIHRyYW5zZm9ybXMgLS0gdXNlIGFjdHVhbCB0YXJnZXQgcHJvZ3JhbSBuYW1lOyBtaWdodCBoYXZlIGx0LSBwcmVmaXggKi8KKyAgdGFyZ2V0X25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKFRBUkdFVF9QUk9HUkFNX05BTUUpKTsKKyAgc3RyZW5kemFwICh0YXJnZXRfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAodGFyZ2V0X25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIHRhcmdldF9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihtYWluKSBsaWJ0b29sIHRhcmdldCBuYW1lOiAlc1xuIiwKKwkJICB0YXJnZXRfbmFtZSk7CitFT0YKKworCSAgICBjYXQgPDxFT0YKKyAgbmV3YXJnelswXSA9CisgICAgWE1BTExPQyAoY2hhciwgKHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpICsKKwkJICAgIHN0cmxlbiAoIiRvYmpkaXIiKSArIDEgKyBzdHJsZW4gKGFjdHVhbF9jd3JhcHBlcl9uYW1lKSArIDEpKTsKKyAgc3RyY3B5IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIHN0cmNhdCAobmV3YXJnelswXSwgIiRvYmpkaXIiKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiLyIpOworRU9GCisKKwkgICAgY2F0IDw8IkVPRiIKKyAgLyogc3RvcCBoZXJlLCBhbmQgY29weSBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoaXMgdHdpY2UgKi8KKyAgdG1wX3BhdGhzcGVjID0geHN0cmR1cCAobmV3YXJnelswXSk7CisKKyAgLyogZG8gTk9UIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSwgc28gdXNlIGFjdHVhbF9jd3JhcHBlcl9uYW1lICovCisgIHN0cmNhdCAobmV3YXJnelswXSwgYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIC8qIERPIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSBpZiBpdCBleGlzdHMsIHNvIHVzZSB0YXJnZXRfbmFtZSAqLworICBsdF9hcmd2X3plcm8gPSBsdF9leHRlbmRfc3RyICh0bXBfcGF0aHNwZWMsIHRhcmdldF9uYW1lLCAxKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisgIHRtcF9wYXRoc3BlYyA9IE5VTEw7CitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCSAgICBjYXQgPDwiRU9GIgorICB7CisgICAgY2hhciogcDsKKyAgICB3aGlsZSAoKHAgPSBzdHJjaHIgKG5ld2FyZ3pbMF0sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICAgIHdoaWxlICgocCA9IHN0cmNociAobHRfYXJndl96ZXJvLCAnXFwnKSkgIT0gTlVMTCkKKyAgICAgIHsKKwkqcCA9ICcvJzsKKyAgICAgIH0KKyAgfQorRU9GCisJICAgIDs7CisJICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorICBYRlJFRSAodGFyZ2V0X25hbWUpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIGx0X3NldGVudiAoIkJJTl9TSCIsICJ4cGc0Iik7IC8qIGZvciBUcnU2NCAqLworICBsdF9zZXRlbnYgKCJEVUFMQ0FTRSIsICIxIik7ICAvKiBmb3IgTVNLIHNoICovCisgIC8qIFVwZGF0ZSB0aGUgRExMIHNlYXJjaHBhdGguICBFWEVfUEFUSF9WQUxVRSAoJGRsbHNlYXJjaHBhdGgpIG11c3QKKyAgICAgYmUgcHJlcGVuZGVkIGJlZm9yZSAodGhhdCBpcywgYXBwZWFyIGFmdGVyKSBMSUJfUEFUSF9WQUxVRSAoJHRlbXBfcnBhdGgpCisgICAgIGJlY2F1c2Ugb24gV2luZG93cywgYm90aCAqX1ZBUk5BTUVzIGFyZSBQQVRIIGJ1dCB1bmluc3RhbGxlZAorICAgICBsaWJyYXJpZXMgbXVzdCBjb21lIGZpcnN0LiAqLworICBsdF91cGRhdGVfZXhlX3BhdGggKEVYRV9QQVRIX1ZBUk5BTUUsIEVYRV9QQVRIX1ZBTFVFKTsKKyAgbHRfdXBkYXRlX2xpYl9wYXRoIChMSUJfUEFUSF9WQVJOQU1FLCBMSUJfUEFUSF9WQUxVRSk7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihtYWluKSBsdF9hcmd2X3plcm86ICVzXG4iLAorCQkgIG5vbm51bGwgKGx0X2FyZ3ZfemVybykpOworICBmb3IgKGkgPSAwOyBpIDwgbmV3YXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIobWFpbikgbmV3YXJnelslZF06ICVzXG4iLAorCQkgICAgICBpLCBub25udWxsIChuZXdhcmd6W2ldKSk7CisgICAgfQorCitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCQljYXQgPDwiRU9GIgorICAvKiBleGVjdiBkb2Vzbid0IGFjdHVhbGx5IHdvcmsgb24gbWluZ3cgYXMgZXhwZWN0ZWQgb24gdW5peCAqLworICBuZXdhcmd6ID0gcHJlcGFyZV9zcGF3biAobmV3YXJneik7CisgIHJ2YWwgPSBfc3Bhd252IChfUF9XQUlULCBsdF9hcmd2X3plcm8sIChjb25zdCBjaGFyICogY29uc3QgKikgbmV3YXJneik7CisgIGlmIChydmFsID09IC0xKQorICAgIHsKKyAgICAgIC8qIGZhaWxlZCB0byBzdGFydCBwcm9jZXNzICovCisgICAgICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgICAiKG1haW4pIGZhaWxlZCB0byBsYXVuY2ggdGFyZ2V0IFwiJXNcIjogJXNcbiIsCisJCSAgICAgIGx0X2FyZ3ZfemVybywgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworICAgICAgcmV0dXJuIDEyNzsKKyAgICB9CisgIHJldHVybiBydmFsOworRU9GCisJCTs7CisJICAgICAgKikKKwkJY2F0IDw8IkVPRiIKKyAgZXhlY3YgKGx0X2FyZ3ZfemVybywgbmV3YXJneik7CisgIHJldHVybiBydmFsOyAvKiA9MTI3LCBidXQgYXZvaWRzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nICovCitFT0YKKwkJOzsKKwkgICAgZXNhYworCisJICAgIGNhdCA8PCJFT0YiCit9CisKK3ZvaWQgKgoreG1hbGxvYyAoc2l6ZV90IG51bSkKK3sKKyAgdm9pZCAqcCA9ICh2b2lkICopIG1hbGxvYyAobnVtKTsKKyAgaWYgKCFwKQorICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sICJtZW1vcnkgZXhoYXVzdGVkIik7CisKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgoreHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gc3RyaW5nID8gc3RyY3B5ICgoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0cmluZykgKyAxKSwKKwkJCSAgc3RyaW5nKSA6IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKgorYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBjaGFyICpiYXNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKKyAgICBuYW1lICs9IDI7CisjZW5kaWYKKworICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCisgICAgICBiYXNlID0gbmFtZSArIDE7CisgIHJldHVybiBiYXNlOworfQorCitpbnQKK2NoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sICIoY2hlY2tfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHBhdGgpKTsKKyAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChzdGF0IChwYXRoLCAmc3QpID49IDApCisgICAgICAmJiAoc3Quc3RfbW9kZSAmIChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK21ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgaW50IHJ2YWwgPSAwOworICBzdHJ1Y3Qgc3RhdCBzdDsKKworICBsdF9kZWJ1Z3ByaW50ZiAoX19GSUxFX18sIF9fTElORV9fLCAiKG1ha2VfZXhlY3V0YWJsZSk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgbm9uZW1wdHkgKHBhdGgpKTsKKyAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICB7CisgICAgICBydmFsID0gY2htb2QgKHBhdGgsIHN0LnN0X21vZGUgfCBTX0lYT1RIIHwgU19JWEdSUCB8IFNfSVhVU1IpOworICAgIH0KKyAgcmV0dXJuIHJ2YWw7Cit9CisKKy8qIFNlYXJjaGVzIGZvciB0aGUgZnVsbCBwYXRoIG9mIHRoZSB3cmFwcGVyLiAgUmV0dXJucworICAgbmV3bHkgYWxsb2NhdGVkIGZ1bGwgcGF0aCBuYW1lIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZQorICAgRG9lcyBub3QgY2hhc2Ugc3ltbGlua3MsIGV2ZW4gb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGVtLgorKi8KK2NoYXIgKgorZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKQoreworICBpbnQgaGFzX3NsYXNoID0gMDsKKyAgY29uc3QgY2hhciAqcDsKKyAgY29uc3QgY2hhciAqcF9uZXh0OworICAvKiBzdGF0aWMgYnVmZmVyIGZvciBnZXRjd2QgKi8KKyAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOworICBpbnQgdG1wX2xlbjsKKyAgY2hhciAqY29uY2F0X25hbWU7CisKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywgIihmaW5kX2V4ZWN1dGFibGUpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG5vbmVtcHR5ICh3cmFwcGVyKSk7CisKKyAgaWYgKCh3cmFwcGVyID09IE5VTEwpIHx8ICgqd3JhcHBlciA9PSAnXDAnKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBBYnNvbHV0ZSBwYXRoPyAqLworI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIHdyYXBwZXJbMF0pICYmIHdyYXBwZXJbMV0gPT0gJzonKQorICAgIHsKKyAgICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7CisgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorCXJldHVybiBjb25jYXRfbmFtZTsKKyAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgeworI2VuZGlmCisgICAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAod3JhcHBlclswXSkpCisJeworCSAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKwkgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJICAgIHJldHVybiBjb25jYXRfbmFtZTsKKwkgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJfQorI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICAgIH0KKyNlbmRpZgorCisgIGZvciAocCA9IHdyYXBwZXI7ICpwOyBwKyspCisgICAgaWYgKCpwID09ICcvJykKKyAgICAgIHsKKwloYXNfc2xhc2ggPSAxOworCWJyZWFrOworICAgICAgfQorICBpZiAoIWhhc19zbGFzaCkKKyAgICB7CisgICAgICAvKiBubyBzbGFzaGVzOyBzZWFyY2ggUEFUSCAqLworICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKKyAgICAgIGlmIChwYXRoICE9IE5VTEwpCisJeworCSAgZm9yIChwID0gcGF0aDsgKnA7IHAgPSBwX25leHQpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpxOworCSAgICAgIHNpemVfdCBwX2xlbjsKKwkgICAgICBmb3IgKHEgPSBwOyAqcTsgcSsrKQorCQlpZiAoSVNfUEFUSF9TRVBBUkFUT1IgKCpxKSkKKwkJICBicmVhazsKKwkgICAgICBwX2xlbiA9IHEgLSBwOworCSAgICAgIHBfbmV4dCA9ICgqcSA9PSAnXDAnID8gcSA6IHEgKyAxKTsKKwkgICAgICBpZiAocF9sZW4gPT0gMCkKKwkJeworCQkgIC8qIGVtcHR5IHBhdGg6IGN1cnJlbnQgZGlyZWN0b3J5ICovCisJCSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQorCQkgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgImdldGN3ZCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm51bGwgKHN0cmVycm9yIChlcnJubykpKTsKKwkJICB0bXBfbGVuID0gc3RybGVuICh0bXApOworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisJCSAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKKwkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7CisJCSAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOworCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkJcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJICAgIH0KKwl9CisgICAgICAvKiBub3QgZm91bmQgaW4gUEFUSDsgYXNzdW1lIGN1cmRpciAqLworICAgIH0KKyAgLyogUmVsYXRpdmUgcGF0aCB8IG5vdCBmb3VuZCBpbiBwYXRoOiBwcmVwZW5kIGN3ZCAqLworICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywgImdldGN3ZCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworICB0bXBfbGVuID0gc3RybGVuICh0bXApOworICBjb25jYXRfbmFtZSA9IFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOworICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKyAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKworICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQorICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKgorY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKQoreworI2lmbmRlZiBTX0lTTE5LCisgIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7CisjZWxzZQorICBjaGFyIGJ1ZltMVF9QQVRITUFYXTsKKyAgc3RydWN0IHN0YXQgczsKKyAgY2hhciAqdG1wX3BhdGhzcGVjID0geHN0cmR1cCAocGF0aHNwZWMpOworICBjaGFyICpwOworICBpbnQgaGFzX3N5bWxpbmtzID0gMDsKKyAgd2hpbGUgKHN0cmxlbiAodG1wX3BhdGhzcGVjKSAmJiAhaGFzX3N5bWxpbmtzKQorICAgIHsKKyAgICAgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICAgICJjaGVja2luZyBwYXRoIGNvbXBvbmVudCBmb3Igc3ltbGlua3M6ICVzXG4iLAorCQkgICAgICB0bXBfcGF0aHNwZWMpOworICAgICAgaWYgKGxzdGF0ICh0bXBfcGF0aHNwZWMsICZzKSA9PSAwKQorCXsKKwkgIGlmIChTX0lTTE5LIChzLnN0X21vZGUpICE9IDApCisJICAgIHsKKwkgICAgICBoYXNfc3ltbGlua3MgPSAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIHNlYXJjaCBiYWNrd2FyZHMgZm9yIGxhc3QgRElSX1NFUEFSQVRPUiAqLworCSAgcCA9IHRtcF9wYXRoc3BlYyArIHN0cmxlbiAodG1wX3BhdGhzcGVjKSAtIDE7CisJICB3aGlsZSAoKHAgPiB0bXBfcGF0aHNwZWMpICYmICghSVNfRElSX1NFUEFSQVRPUiAoKnApKSkKKwkgICAgcC0tOworCSAgaWYgKChwID09IHRtcF9wYXRoc3BlYykgJiYgKCFJU19ESVJfU0VQQVJBVE9SICgqcCkpKQorCSAgICB7CisJICAgICAgLyogbm8gbW9yZSBESVJfU0VQQVJBVE9SUyBsZWZ0ICovCisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICpwID0gJ1wwJzsKKwl9CisgICAgICBlbHNlCisJeworCSAgbHRfZmF0YWwgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAgICJlcnJvciBhY2Nlc3NpbmcgZmlsZSBcIiVzXCI6ICVzIiwKKwkJICAgIHRtcF9wYXRoc3BlYywgbm9ubnVsbCAoc3RyZXJyb3IgKGVycm5vKSkpOworCX0KKyAgICB9CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGlmICghaGFzX3N5bWxpbmtzKQorICAgIHsKKyAgICAgIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7CisgICAgfQorCisgIHRtcF9wYXRoc3BlYyA9IHJlYWxwYXRoIChwYXRoc3BlYywgYnVmKTsKKyAgaWYgKHRtcF9wYXRoc3BlYyA9PSAwKQorICAgIHsKKyAgICAgIGx0X2ZhdGFsIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSJjb3VsZCBub3QgZm9sbG93IHN5bWxpbmtzIGZvciAlcyIsIHBhdGhzcGVjKTsKKyAgICB9CisgIHJldHVybiB4c3RyZHVwICh0bXBfcGF0aHNwZWMpOworI2VuZGlmCit9CisKK2NoYXIgKgorc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgc2l6ZV90IGxlbiwgcGF0bGVuOworCisgIGFzc2VydCAoc3RyICE9IE5VTEwpOworICBhc3NlcnQgKHBhdCAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4gKHN0cik7CisgIHBhdGxlbiA9IHN0cmxlbiAocGF0KTsKKworICBpZiAocGF0bGVuIDw9IGxlbikKKyAgICB7CisgICAgICBzdHIgKz0gbGVuIC0gcGF0bGVuOworICAgICAgaWYgKHN0cmNtcCAoc3RyLCBwYXQpID09IDApCisJKnN0ciA9ICdcMCc7CisgICAgfQorICByZXR1cm4gc3RyOworfQorCit2b2lkCitsdF9kZWJ1Z3ByaW50ZiAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGlmIChsdF9kZWJ1ZykKKyAgICB7CisgICAgICAodm9pZCkgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6JWQ6ICIsIHByb2dyYW1fbmFtZSwgZmlsZSwgbGluZSk7CisgICAgICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgICAgICh2b2lkKSB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOworICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitsdF9lcnJvcl9jb3JlIChpbnQgZXhpdF9zdGF0dXMsIGNvbnN0IGNoYXIgKmZpbGUsCisJICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICptb2RlLAorCSAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLCB2YV9saXN0IGFwKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlczolczolZDogJXM6ICIsIHByb2dyYW1fbmFtZSwgZmlsZSwgbGluZSwgbW9kZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7CisKKyAgaWYgKGV4aXRfc3RhdHVzID49IDApCisgICAgZXhpdCAoZXhpdF9zdGF0dXMpOworfQorCit2b2lkCitsdF9mYXRhbCAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQgKGFwLCBtZXNzYWdlKTsKKyAgbHRfZXJyb3JfY29yZSAoRVhJVF9GQUlMVVJFLCBmaWxlLCBsaW5lLCAiRkFUQUwiLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZCAoYXApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitub25udWxsIChjb25zdCBjaGFyICpzKQoreworICByZXR1cm4gcyA/IHMgOiAiKG51bGwpIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorbm9uZW1wdHkgKGNvbnN0IGNoYXIgKnMpCit7CisgIHJldHVybiAocyAmJiAhKnMpID8gIihlbXB0eSkiIDogbm9ubnVsbCAocyk7Cit9CisKK3ZvaWQKK2x0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihsdF9zZXRlbnYpIHNldHRpbmcgJyVzJyB0byAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisgIHsKKyNpZmRlZiBIQVZFX1NFVEVOVgorICAgIC8qIGFsd2F5cyBtYWtlIGEgY29weSwgZm9yIGNvbnNpc3RlbmN5IHdpdGggIUhBVkVfU0VURU5WICovCisgICAgY2hhciAqc3RyID0geHN0cmR1cCAodmFsdWUpOworICAgIHNldGVudiAobmFtZSwgc3RyLCAxKTsKKyNlbHNlCisgICAgaW50IGxlbiA9IHN0cmxlbiAobmFtZSkgKyAxICsgc3RybGVuICh2YWx1ZSkgKyAxOworICAgIGNoYXIgKnN0ciA9IFhNQUxMT0MgKGNoYXIsIGxlbik7CisgICAgc3ByaW50ZiAoc3RyLCAiJXM9JXMiLCBuYW1lLCB2YWx1ZSk7CisgICAgaWYgKHB1dGVudiAoc3RyKSAhPSBFWElUX1NVQ0NFU1MpCisgICAgICB7CisgICAgICAgIFhGUkVFIChzdHIpOworICAgICAgfQorI2VuZGlmCisgIH0KK30KKworY2hhciAqCitsdF9leHRlbmRfc3RyIChjb25zdCBjaGFyICpvcmlnX3ZhbHVlLCBjb25zdCBjaGFyICphZGQsIGludCB0b19lbmQpCit7CisgIGNoYXIgKm5ld192YWx1ZTsKKyAgaWYgKG9yaWdfdmFsdWUgJiYgKm9yaWdfdmFsdWUpCisgICAgeworICAgICAgaW50IG9yaWdfdmFsdWVfbGVuID0gc3RybGVuIChvcmlnX3ZhbHVlKTsKKyAgICAgIGludCBhZGRfbGVuID0gc3RybGVuIChhZGQpOworICAgICAgbmV3X3ZhbHVlID0gWE1BTExPQyAoY2hhciwgYWRkX2xlbiArIG9yaWdfdmFsdWVfbGVuICsgMSk7CisgICAgICBpZiAodG9fZW5kKQorICAgICAgICB7CisgICAgICAgICAgc3RyY3B5IChuZXdfdmFsdWUsIG9yaWdfdmFsdWUpOworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlICsgb3JpZ192YWx1ZV9sZW4sIGFkZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlLCBhZGQpOworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlICsgYWRkX2xlbiwgb3JpZ192YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuZXdfdmFsdWUgPSB4c3RyZHVwIChhZGQpOworICAgIH0KKyAgcmV0dXJuIG5ld192YWx1ZTsKK30KKwordm9pZAorbHRfdXBkYXRlX2V4ZV9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgbHRfZGVidWdwcmludGYgKF9fRklMRV9fLCBfX0xJTkVfXywKKwkJICAiKGx0X3VwZGF0ZV9leGVfcGF0aCkgbW9kaWZ5aW5nICclcycgYnkgcHJlcGVuZGluZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbm9ubnVsbCAobmFtZSksIG5vbm51bGwgKHZhbHVlKSk7CisKKyAgaWYgKG5hbWUgJiYgKm5hbWUgJiYgdmFsdWUgJiYgKnZhbHVlKQorICAgIHsKKyAgICAgIGNoYXIgKm5ld192YWx1ZSA9IGx0X2V4dGVuZF9zdHIgKGdldGVudiAobmFtZSksIHZhbHVlLCAwKTsKKyAgICAgIC8qIHNvbWUgc3lzdGVtcyBjYW4ndCBjb3BlIHdpdGggYSAnOictdGVybWluYXRlZCBwYXRoICMnICovCisgICAgICBpbnQgbGVuID0gc3RybGVuIChuZXdfdmFsdWUpOworICAgICAgd2hpbGUgKCgobGVuID0gc3RybGVuIChuZXdfdmFsdWUpKSA+IDApICYmIElTX1BBVEhfU0VQQVJBVE9SIChuZXdfdmFsdWVbbGVuLTFdKSkKKyAgICAgICAgeworICAgICAgICAgIG5ld192YWx1ZVtsZW4tMV0gPSAnXDAnOworICAgICAgICB9CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQKK2x0X3VwZGF0ZV9saWJfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGx0X2RlYnVncHJpbnRmIChfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgIihsdF91cGRhdGVfbGliX3BhdGgpIG1vZGlmeWluZyAnJXMnIGJ5IHByZXBlbmRpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIG5vbm51bGwgKG5hbWUpLCBub25udWxsICh2YWx1ZSkpOworCisgIGlmIChuYW1lICYmICpuYW1lICYmIHZhbHVlICYmICp2YWx1ZSkKKyAgICB7CisgICAgICBjaGFyICpuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMCk7CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKK0VPRgorCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCQljYXQgPDwiRU9GIgorCisvKiBQcmVwYXJlcyBhbiBhcmd1bWVudCB2ZWN0b3IgYmVmb3JlIGNhbGxpbmcgc3Bhd24oKS4KKyAgIE5vdGUgdGhhdCBzcGF3bigpIGRvZXMgbm90IGJ5IGl0c2VsZiBjYWxsIHRoZSBjb21tYW5kIGludGVycHJldGVyCisgICAgIChnZXRlbnYgKCJDT01TUEVDIikgIT0gTlVMTCA/IGdldGVudiAoIkNPTVNQRUMiKSA6CisgICAgICAoeyBPU1ZFUlNJT05JTkZPIHY7IHYuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihPU1ZFUlNJT05JTkZPKTsKKyAgICAgICAgIEdldFZlcnNpb25FeCgmdik7CisgICAgICAgICB2LmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQ7CisgICAgICB9KSA/ICJjbWQuZXhlIiA6ICJjb21tYW5kLmNvbSIpLgorICAgSW5zdGVhZCBpdCBzaW1wbHkgY29uY2F0ZW5hdGVzIHRoZSBhcmd1bWVudHMsIHNlcGFyYXRlZCBieSAnICcsIGFuZCBjYWxscworICAgQ3JlYXRlUHJvY2VzcygpLiAgV2UgbXVzdCBxdW90ZSB0aGUgYXJndW1lbnRzIHNpbmNlIFdpbjMyIENyZWF0ZVByb2Nlc3MoKQorICAgaW50ZXJwcmV0cyBjaGFyYWN0ZXJzIGxpa2UgJyAnLCAnXHQnLCAnXFwnLCAnIicgKGJ1dCBub3QgJzwnIGFuZCAnPicpIGluIGEKKyAgIHNwZWNpYWwgd2F5OgorICAgLSBTcGFjZSBhbmQgdGFiIGFyZSBpbnRlcnByZXRlZCBhcyBkZWxpbWl0ZXJzLiBUaGV5IGFyZSBub3QgdHJlYXRlZCBhcworICAgICBkZWxpbWl0ZXJzIGlmIHRoZXkgYXJlIHN1cnJvdW5kZWQgYnkgZG91YmxlIHF1b3RlczogIi4uLiIuCisgICAtIFVuZXNjYXBlZCBkb3VibGUgcXVvdGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGlucHV0LiBUaGVpciBvbmx5IGVmZmVjdCBpcworICAgICB0aGF0IHdpdGhpbiBkb3VibGUgcXVvdGVzLCBzcGFjZSBhbmQgdGFiIGFyZSB0cmVhdGVkIGxpa2Ugbm9ybWFsCisgICAgIGNoYXJhY3RlcnMuCisgICAtIEJhY2tzbGFzaGVzIG5vdCBmb2xsb3dlZCBieSBkb3VibGUgcXVvdGVzIGFyZSBub3Qgc3BlY2lhbC4KKyAgIC0gQnV0IDIqbisxIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IGEgZG91YmxlIHF1b3RlIGJlY29tZQorICAgICBuIGJhY2tzbGFzaGVzIGZvbGxvd2VkIGJ5IGEgZG91YmxlIHF1b3RlIChuID49IDApOgorICAgICAgIFwiIC0+ICIKKyAgICAgICBcXFwiIC0+IFwiCisgICAgICAgXFxcXFwiIC0+IFxcIgorICovCisjZGVmaW5lIFNIRUxMX1NQRUNJQUxfQ0hBUlMgIlwiXFwgXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyIKKyNkZWZpbmUgU0hFTExfU1BBQ0VfQ0hBUlMgIiBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3IgorY2hhciAqKgorcHJlcGFyZV9zcGF3biAoY2hhciAqKmFyZ3YpCit7CisgIHNpemVfdCBhcmdjOworICBjaGFyICoqbmV3X2FyZ3Y7CisgIHNpemVfdCBpOworCisgIC8qIENvdW50IG51bWJlciBvZiBhcmd1bWVudHMuICAqLworICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKykKKyAgICA7CisKKyAgLyogQWxsb2NhdGUgbmV3IGFyZ3VtZW50IHZlY3Rvci4gICovCisgIG5ld19hcmd2ID0gWE1BTExPQyAoY2hhciAqLCBhcmdjICsgMSk7CisKKyAgLyogUHV0IHF1b3RlZCBhcmd1bWVudHMgaW50byB0aGUgbmV3IGFyZ3VtZW50IHZlY3Rvci4gICovCisgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqc3RyaW5nID0gYXJndltpXTsKKworICAgICAgaWYgKHN0cmluZ1swXSA9PSAnXDAnKQorCW5ld19hcmd2W2ldID0geHN0cmR1cCAoIlwiXCIiKTsKKyAgICAgIGVsc2UgaWYgKHN0cnBicmsgKHN0cmluZywgU0hFTExfU1BFQ0lBTF9DSEFSUykgIT0gTlVMTCkKKwl7CisJICBpbnQgcXVvdGVfYXJvdW5kID0gKHN0cnBicmsgKHN0cmluZywgU0hFTExfU1BBQ0VfQ0hBUlMpICE9IE5VTEwpOworCSAgc2l6ZV90IGxlbmd0aDsKKwkgIHVuc2lnbmVkIGludCBiYWNrc2xhc2hlczsKKwkgIGNvbnN0IGNoYXIgKnM7CisJICBjaGFyICpxdW90ZWRfc3RyaW5nOworCSAgY2hhciAqcDsKKworCSAgbGVuZ3RoID0gMDsKKwkgIGJhY2tzbGFzaGVzID0gMDsKKwkgIGlmIChxdW90ZV9hcm91bmQpCisJICAgIGxlbmd0aCsrOworCSAgZm9yIChzID0gc3RyaW5nOyAqcyAhPSAnXDAnOyBzKyspCisJICAgIHsKKwkgICAgICBjaGFyIGMgPSAqczsKKwkgICAgICBpZiAoYyA9PSAnIicpCisJCWxlbmd0aCArPSBiYWNrc2xhc2hlcyArIDE7CisJICAgICAgbGVuZ3RoKys7CisJICAgICAgaWYgKGMgPT0gJ1xcJykKKwkJYmFja3NsYXNoZXMrKzsKKwkgICAgICBlbHNlCisJCWJhY2tzbGFzaGVzID0gMDsKKwkgICAgfQorCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgbGVuZ3RoICs9IGJhY2tzbGFzaGVzICsgMTsKKworCSAgcXVvdGVkX3N0cmluZyA9IFhNQUxMT0MgKGNoYXIsIGxlbmd0aCArIDEpOworCisJICBwID0gcXVvdGVkX3N0cmluZzsKKwkgIGJhY2tzbGFzaGVzID0gMDsKKwkgIGlmIChxdW90ZV9hcm91bmQpCisJICAgICpwKysgPSAnIic7CisJICBmb3IgKHMgPSBzdHJpbmc7ICpzICE9ICdcMCc7IHMrKykKKwkgICAgeworCSAgICAgIGNoYXIgYyA9ICpzOworCSAgICAgIGlmIChjID09ICciJykKKwkJeworCQkgIHVuc2lnbmVkIGludCBqOworCQkgIGZvciAoaiA9IGJhY2tzbGFzaGVzICsgMTsgaiA+IDA7IGotLSkKKwkJICAgICpwKysgPSAnXFwnOworCQl9CisJICAgICAgKnArKyA9IGM7CisJICAgICAgaWYgKGMgPT0gJ1xcJykKKwkJYmFja3NsYXNoZXMrKzsKKwkgICAgICBlbHNlCisJCWJhY2tzbGFzaGVzID0gMDsKKwkgICAgfQorCSAgaWYgKHF1b3RlX2Fyb3VuZCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCBqOworCSAgICAgIGZvciAoaiA9IGJhY2tzbGFzaGVzOyBqID4gMDsgai0tKQorCQkqcCsrID0gJ1xcJzsKKwkgICAgICAqcCsrID0gJyInOworCSAgICB9CisJICAqcCA9ICdcMCc7CisKKwkgIG5ld19hcmd2W2ldID0gcXVvdGVkX3N0cmluZzsKKwl9CisgICAgICBlbHNlCisJbmV3X2FyZ3ZbaV0gPSAoY2hhciAqKSBzdHJpbmc7CisgICAgfQorICBuZXdfYXJndlthcmdjXSA9IE5VTEw7CisKKyAgcmV0dXJuIG5ld19hcmd2OworfQorRU9GCisJCTs7CisJICAgIGVzYWMKKworICAgICAgICAgICAgY2F0IDw8IkVPRiIKK3ZvaWQgbHRfZHVtcF9zY3JpcHQgKEZJTEUqIGYpCit7CitFT0YKKwkgICAgZnVuY19lbWl0X3dyYXBwZXIgeWVzIHwKKyAgICAgICAgICAgICAgJFNFRCAtZSAncy9cKFtcXCJdXCkvXFxcMS9nJyBcCisJICAgICAgICAgICAtZSAncy9eLyAgZnB1dHMgKCIvJyAtZSAncy8kL1xcbiIsIGYpOy8nCisKKyAgICAgICAgICAgIGNhdCA8PCJFT0YiCit9CitFT0YKK30KKyMgZW5kOiBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisKKyMgZnVuY193aW4zMl9pbXBvcnRfbGliX3AgQVJHCisjIFRydWUgaWYgQVJHIGlzIGFuIGltcG9ydCBsaWIsIGFzIGluZGljYXRlZCBieSAkZmlsZV9tYWdpY19jbWQKK2Z1bmNfd2luMzJfaW1wb3J0X2xpYl9wICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGNhc2UgYGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCQxXCIgMj4vZGV2L251bGwgfCAkU0VEIC1lIDEwcWAgaW4KKyAgICAqaW1wb3J0KikgOiA7OworICAgICopIGZhbHNlIDs7CisgICAgZXNhYworfQorCisjIGZ1bmNfbW9kZV9saW5rIGFyZy4uLgorZnVuY19tb2RlX2xpbmsgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkaG9zdCBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisgICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCisgICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0CisgICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCisgICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KKyAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCisKKyAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZworICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKKyAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5CisgICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KKyAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgICopCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgICBsaWJ0b29sX2FyZ3M9JG5vbm9wdAorICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKKyAgICBjb21waWxlX2NvbW1hbmQ9JG5vbm9wdAorICAgIGZpbmFsaXplX2NvbW1hbmQ9JG5vbm9wdAorCisgICAgY29tcGlsZV9ycGF0aD0KKyAgICBmaW5hbGl6ZV9ycGF0aD0KKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgY29udmVuaWVuY2U9CisgICAgb2xkX2NvbnZlbmllbmNlPQorICAgIGRlcGxpYnM9CisgICAgb2xkX2RlcGxpYnM9CisgICAgY29tcGlsZXJfZmxhZ3M9CisgICAgbGlua2VyX2ZsYWdzPQorICAgIGRsbHNlYXJjaHBhdGg9CisgICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCisgICAgaW5zdF9wcmVmaXhfZGlyPQorICAgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPQorCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGJpbmRpcj0KKyAgICBkbGZpbGVzPQorICAgIGRscHJlZmlsZXM9CisgICAgZGxzZWxmPW5vCisgICAgZXhwb3J0X2R5bmFtaWM9bm8KKyAgICBleHBvcnRfc3ltYm9scz0KKyAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KKyAgICBnZW5lcmF0ZWQ9CisgICAgbGlib2Jqcz0KKyAgICBsdGxpYnM9CisgICAgbW9kdWxlPW5vCisgICAgbm9faW5zdGFsbD1ubworICAgIG9ianM9CisgICAgbm9uX3BpY19vYmplY3RzPQorICAgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PQorICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubworICAgIHByZWxvYWQ9bm8KKyAgICBwcmV2PQorICAgIHByZXZhcmc9CisgICAgcmVsZWFzZT0KKyAgICBycGF0aD0KKyAgICB4cnBhdGg9CisgICAgcGVybV9ycGF0aD0KKyAgICB0ZW1wX3JwYXRoPQorICAgIHRocmVhZF9zYWZlPW5vCisgICAgdmluZm89CisgICAgdmluZm9fbnVtYmVyPW5vCisgICAgd2Vha19saWJzPQorICAgIHNpbmdsZV9tb2R1bGU9IiR7d2x9LXNpbmdsZV9tb2R1bGUiCisgICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQorCisgICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtc2hhcmVkKQorCXRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBcCisJICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gImNhbiBub3QgYnVpbGQgYSBzaGFyZWQgbGlicmFyeSIKKwlidWlsZF9vbGRfbGlicz1ubworCWJyZWFrCisJOzsKKyAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCWNhc2UgJGFyZyBpbgorCS1hbGwtc3RhdGljKQorCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAiY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCisJICA7OworCS1zdGF0aWMpCisJICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPWJ1aWx0CisJICA7OworCS1zdGF0aWMtbGlidG9vbC1saWJzKQorCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwkgIDs7CisJZXNhYworCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWJ1aWxkX29sZF9saWJzPXllcworCWJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCisgICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcworCisgICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCisgICAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbworICAgICAgYXJnPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgICAgcWFyZz0kZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQKKyAgICAgIGZ1bmNfYXBwZW5kIGxpYnRvb2xfYXJncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKworICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwljYXNlICRwcmV2IGluCisJb3V0cHV0KQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgQE9VVFBVVEAiCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgQE9VVFBVVEAiCisJICA7OworCWVzYWMKKworCWNhc2UgJHByZXYgaW4KKwliaW5kaXIpCisJICBiaW5kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZGxmaWxlc3xkbHByZWZpbGVzKQorCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KKwkgICAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgQFNZTUZJTEVAIgorCSAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgQFNZTUZJTEVAIgorCSAgICBwcmVsb2FkPXllcworCSAgZmkKKwkgIGNhc2UgJGFyZyBpbgorCSAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KKwkgIGZvcmNlKQorCSAgICBpZiB0ZXN0ICIkZGxzZWxmIiA9IG5vOyB0aGVuCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBzZWxmKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBkbHNlbGY9eWVzCisJICAgIGVsc2UKKwkgICAgICBkbHNlbGY9bmVlZGxlc3MKKwkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGFyZyIKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkYXJnIgorCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlleHBzeW1zKQorCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCisJICB0ZXN0IC1mICIkYXJnIiBcCisJICAgIHx8IGZ1bmNfZmF0YWxfZXJyb3IgInN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZXhwc3ltc19yZWdleCkKKwkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWZyYW1ld29yaykKKwkgIGNhc2UgJGhvc3QgaW4KKwkgICAgKi0qLWRhcndpbiopCisJICAgICAgY2FzZSAiJGRlcGxpYnMgIiBpbgorCQkqIiAkcWFyZy5sdGZyYW1ld29yayAiKikgOzsKKwkJKikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRxYXJnLmx0ZnJhbWV3b3JrIiAjIHRoaXMgaXMgZml4ZWQgbGF0ZXIKKwkJICAgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgIGVzYWMKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlpbnN0X3ByZWZpeCkKKwkgIGluc3RfcHJlZml4X2Rpcj0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlvYmplY3RsaXN0KQorCSAgaWYgdGVzdCAtZiAiJGFyZyI7IHRoZW4KKwkgICAgc2F2ZV9hcmc9JGFyZworCSAgICBtb3JlYXJncz0KKwkgICAgZm9yIGZpbCBpbiBgY2F0ICIkc2F2ZV9hcmciYAorCSAgICBkbworIwkgICAgICBmdW5jX2FwcGVuZCBtb3JlYXJncyAiICRmaWwiCisJICAgICAgYXJnPSRmaWwKKwkgICAgICAjIEEgbGlidG9vbC1jb250cm9sbGVkIG9iamVjdC4KKworCSAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIG9iamVjdC4KKwkgICAgICBpZiBmdW5jX2xhbGliX3Vuc2FmZV9wICIkYXJnIjsgdGhlbgorCQlwaWNfb2JqZWN0PQorCQlub25fcGljX29iamVjdD0KKworCQkjIFJlYWQgdGhlIC5sbyBmaWxlCisJCWZ1bmNfc291cmNlICIkYXJnIgorCisJCWlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0IC16ICIkbm9uX3BpY19vYmplY3QiIHx8CisJCSAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYKKwkJICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIKKwkJZmkKKworCQkjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCQlmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgorCQl4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCQlpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJCSAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KKwkJICAgICAgZnVuY19hcHBlbmQgZGxmaWxlcyAiICRwaWNfb2JqZWN0IgorCQkgICAgICBwcmV2PQorCQkgICAgICBjb250aW51ZQorCQkgICAgZWxzZQorCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQkgICAgICBwcmV2PWRscHJlZmlsZXMKKwkJICAgIGZpCisJCSAgZmkKKworCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCQkgICAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRwaWNfb2JqZWN0IgorCQkgICAgcHJldj0KKwkJICBmaQorCisJCSAgIyBBIFBJQyBvYmplY3QuCisJCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgorCQkgIGFyZz0iJHBpY19vYmplY3QiCisJCWZpCisKKwkJIyBOb24tUElDIG9iamVjdC4KKwkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCisKKwkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCisJCSAgICBhcmc9IiRub25fcGljX29iamVjdCIKKwkJICBmaQorCQllbHNlCisJCSAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgorCQkgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkJICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCisJCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCQlmaQorCSAgICAgIGVsc2UKKwkJIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJCWlmICRvcHRfZHJ5X3J1bjsgdGhlbgorCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkJICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCQkgIGZ1bmNfbG8ybyAiJGFyZyIKKwkJICBwaWNfb2JqZWN0PSR4ZGlyJG9iamRpci8kZnVuY19sbzJvX3Jlc3VsdAorCQkgIG5vbl9waWNfb2JqZWN0PSR4ZGlyJGZ1bmNfbG8yb19yZXN1bHQKKwkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgorCSAgICAgICAgZWxzZQorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiCisJCWZpCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJsaW5rIGlucHV0IGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgIGZpCisJICBhcmc9JHNhdmVfYXJnCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcHJlY2lvdXNfcmVnZXgpCisJICBwcmVjaW91c19maWxlc19yZWdleD0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlyZWxlYXNlKQorCSAgcmVsZWFzZT0iLSRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcnBhdGggfCB4cnBhdGgpCisJICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkgIGNhc2UgJGFyZyBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSAgKikKKwkgICAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgorCSAgICBjYXNlICIkcnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSBmdW5jX2FwcGVuZCBycGF0aCAiICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGVsc2UKKwkgICAgY2FzZSAiJHhycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJc2hyZXh0KQorCSAgc2hyZXh0X2NtZHM9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJd2VhaykKKwkgIGZ1bmNfYXBwZW5kIHdlYWtfbGlicyAiICRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJeGNjbGlua2VyKQorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGNvbXBpbGVyKQorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIHByZXY9CisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhsaW5rZXIpCisJICBmdW5jX2FwcGVuZCBsaW5rZXJfZmxhZ3MgIiAkcWFyZyIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHdsJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCisKKyAgICAgIHByZXZhcmc9IiRhcmciCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAjIFNlZSBjb21tZW50IGZvciAtc3RhdGljIGZsYWcgYmVsb3csIGZvciBtb3JlIGRldGFpbHMuCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJZnVuY19mYXRhbF9lcnJvciAiXGAtYWxsb3ctdW5kZWZpbmVkJyBtdXN0IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiCisJOzsKKworICAgICAgLWF2b2lkLXZlcnNpb24pCisJYXZvaWRfdmVyc2lvbj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1iaW5kaXIpCisJcHJldj1iaW5kaXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisJcHJldj1kbGZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxwcmVvcGVuKQorCXByZXY9ZGxwcmVmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorCWV4cG9ydF9keW5hbWljPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAibW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKKwlmaQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgorCSAgcHJldj1leHBzeW1zCisJZWxzZQorCSAgcHJldj1leHBzeW1zX3JlZ2V4CisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1mcmFtZXdvcmspCisJcHJldj1mcmFtZXdvcmsKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1pbnN0LXByZWZpeC1kaXIpCisJcHJldj1pbnN0X3ByZWZpeAorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLUwqKQorCWZ1bmNfc3RyaXBuYW1lICItTCIgJycgIiRhcmciCisJaWYgdGVzdCAteiAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCI7IHRoZW4KKwkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJyZXF1aXJlIG5vIHNwYWNlIGJldHdlZW4gXGAtTCcgYW5kIFxgJDEnIgorCSAgZWxzZQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJuZWVkIHBhdGggZm9yIFxgLUwnIG9wdGlvbiIKKwkgIGZpCisJZmkKKwlmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwlkaXI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCSAgdGVzdCAteiAiJGFic2RpciIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCisJICBkaXI9IiRhYnNkaXIiCisJICA7OworCWVzYWMKKwljYXNlICIkZGVwbGlicyAiIGluCisJKiIgLUwkZGlyICIqIHwgKiIgJGFyZyAiKikKKwkgICMgV2lsbCBvbmx5IGhhcHBlbiBmb3IgYWJzb2x1dGUgb3Igc3lzcm9vdCBhcmd1bWVudHMKKwkgIDs7CisJKikKKwkgICMgUHJlc2VydmUgc3lzcm9vdCwgYnV0IG5ldmVyIGluY2x1ZGUgcmVsYXRpdmUgZGlyZWN0b3JpZXMKKwkgIGNhc2UgJGRpciBpbgorCSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSogfCA9KikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRhcmciIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAtTCRkaXIiIDs7CisJICBlc2FjCisJICBmdW5jX2FwcGVuZCBsaWJfc2VhcmNoX3BhdGggIiAkZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisJICB0ZXN0YmluZGlyPWAkRUNITyAiJGRpciIgfCAkU0VEICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSRkaXI7OworCSAgKikgZnVuY19hcHBlbmQgZGxsc2VhcmNocGF0aCAiOiRkaXIiOzsKKwkgIGVzYWMKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7CisJICA6OikgZGxsc2VhcmNocGF0aD0kdGVzdGJpbmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWwqKQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiB8fCB0ZXN0ICJYJGFyZyIgPSAiWC1sbSI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1iZW9zKiB8ICotY2VnY2MqIHwgKi0qLWhhaWt1KikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vczIqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBmdW5jX2FwcGVuZCBkZXBsaWJzICIgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJZWxpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sY19yIjsgdGhlbgorCSBjYXNlICRob3N0IGluCisJICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KKwkgICBjb250aW51ZQorCSAgIDs7CisJIGVzYWMKKwlmaQorCWZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLW1vZHVsZSkKKwltb2R1bGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCisgICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCisgICAgICAjIERhcndpbiB1c2VzIHRoZSAtYXJjaCBmbGFnIHRvIGRldGVybWluZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLgorICAgICAgLW1vZGVsfC1hcmNofC1pc3lzcm9vdHwtLXN5c3Jvb3QpCisJZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmV8LXRocmVhZHMpCisJZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGFyZyIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbXVsdGlfbW9kdWxlKQorCXNpbmdsZV9tb2R1bGU9IiR7d2x9LW11bHRpX21vZHVsZSIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1mYXN0LWluc3RhbGwpCisJZmFzdF9pbnN0YWxsPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbm8taW5zdGFsbCkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotZGFyd2luKiB8ICotY2VnY2MqKQorCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCisJICAjIGFuZCBEYXJ3aW4gaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KKwkgIGZ1bmNfd2FybmluZyAiXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiCisJICBmdW5jX3dhcm5pbmcgImFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIKKwkgIGZhc3RfaW5zdGFsbD1ubworCSAgOzsKKwkqKSBub19pbnN0YWxsPXllcyA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtb2JqZWN0bGlzdCkKKwlwcmV2PW9iamVjdGxpc3QKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCisJcHJldj1wcmVjaW91c19yZWdleAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwlmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkYXJnIgorCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCT0qKQorCSAgZnVuY19zdHJpcG5hbWUgJz0nICcnICIkZGlyIgorCSAgZGlyPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgOzsKKwkqKQorCSAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCisJICA7OworCWVzYWMKKwljYXNlICIkeHJwYXRoICIgaW4KKwkqIiAkZGlyICIqKSA7OworCSopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNoYXJlZCkKKwkjIFRoZSBlZmZlY3RzIG9mIC1zaGFyZWQgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNocmV4dCkKKwlwcmV2PXNocmV4dAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0CisJIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cworCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAorCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCisJY29udGludWUKKwk7OworCisgICAgICAtdGhyZWFkLXNhZmUpCisJdGhyZWFkX3NhZmU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorCXByZXY9dmluZm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLW51bWJlcikKKwlwcmV2PXZpbmZvCisJdmluZm9fbnVtYmVyPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXdlYWspCisgICAgICAgIHByZXY9d2VhaworCWNvbnRpbnVlCisJOzsKKworICAgICAgLVdjLCopCisJZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgZnVuY19hcHBlbmQgYXJnICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWZ1bmNfc3RyaXBuYW1lICcgJyAnJyAiJGFyZyIKKwlhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCTs7CisKKyAgICAgIC1XbCwqKQorCWZ1bmNfc3RyaXBuYW1lICctV2wsJyAnJyAiJGFyZyIKKwlhcmdzPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlhcmc9CisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGFyZyAiICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtWGxpbmtlcikKKwlwcmV2PXhsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YQ0NsaW5rZXIpCisJcHJldj14Y2NsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgLW1zZ18qIGZvciBvc2YgY2MKKyAgICAgIC1tc2dfKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICMgRmxhZ3MgdG8gYmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLCB3aXRoIHJhdGlvbmFsZToKKyAgICAgICMgLTY0LCAtbWlwc1swLTldICAgICAgZW5hYmxlIDY0LWJpdCBtb2RlIGZvciB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC1yWzAtOV1bMC05XSogICAgICAgIHNwZWNpZnkgcHJvY2Vzc29yIGZvciB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC14YXJjaD0qLCAteHRhcmdldD0qIGVuYWJsZSA2NC1iaXQgbW9kZSBmb3IgdGhlIFN1biBjb21waWxlcgorICAgICAgIyArREEqLCArREQqICAgICAgICAgICBlbmFibGUgNjQtYml0IG1vZGUgZm9yIHRoZSBIUCBjb21waWxlcgorICAgICAgIyAtcSogICAgICAgICAgICAgICAgICBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCisgICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmbGFncyBmb3IgR0NDCisgICAgICAjIC1GL3BhdGggICAgICAgICAgICAgIHBhdGggdG8gdW5pbnN0YWxsZWQgZnJhbWV3b3JrcywgZ2NjIG9uIGRhcndpbgorICAgICAgIyAtcCwgLXBnLCAtLWNvdmVyYWdlLCAtZnByb2ZpbGUtKiAgcHJvZmlsaW5nIGZsYWdzIGZvciBHQ0MKKyAgICAgICMgQGZpbGUgICAgICAgICAgICAgICAgR0NDIHJlc3BvbnNlIGZpbGVzCisgICAgICAjIC10cD0qICAgICAgICAgICAgICAgIFBvcnRsYW5kIHBnY2MgdGFyZ2V0IHByb2Nlc3NvciBzZWxlY3Rpb24KKyAgICAgICMgLS1zeXNyb290PSogICAgICAgICAgZm9yIHN5c3Jvb3Qgc3VwcG9ydAorICAgICAgIyAtTyosIC1mbHRvKiwgLWZ3aG9wciosIC1mdXNlLWxpbmtlci1wbHVnaW4gR0NDIGxpbmstdGltZSBvcHRpbWl6YXRpb24KKyAgICAgIC02NHwtbWlwc1swLTldfC1yWzAtOV1bMC05XSp8LXhhcmNoPSp8LXh0YXJnZXQ9KnwrREEqfCtERCp8LXEqfC1tKnwgXAorICAgICAgLXRbNDVdKnwtdHhzY2FsZSp8LXB8LXBnfC0tY292ZXJhZ2V8LWZwcm9maWxlLSp8LUYqfEAqfC10cD0qfC0tc3lzcm9vdD0qfCBcCisgICAgICAtTyp8LWZsdG8qfC1md2hvcHIqfC1mdXNlLWxpbmtlci1wbHVnaW4pCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgICBmdW5jX2FwcGVuZCBjb21waWxlcl9mbGFncyAiICRhcmciCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworCisgICAgICAqLiRvYmpleHQpCisJIyBBIHN0YW5kYXJkIG9iamVjdC4KKwlmdW5jX2FwcGVuZCBvYmpzICIgJGFyZyIKKwk7OworCisgICAgICAqLmxvKQorCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgorCWlmIGZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRhcmciOyB0aGVuCisJICBwaWNfb2JqZWN0PQorCSAgbm9uX3BpY19vYmplY3Q9CisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIGZ1bmNfc291cmNlICIkYXJnIgorCisJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKKwkgICAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYKKwkgICAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIgorCSAgZmkKKworCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCSAgaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgorCQlmdW5jX2FwcGVuZCBkbGZpbGVzICIgJHBpY19vYmplY3QiCisJCXByZXY9CisJCWNvbnRpbnVlCisJICAgICAgZWxzZQorCQkjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQlwcmV2PWRscHJlZmlsZXMKKwkgICAgICBmaQorCSAgICBmaQorCisJICAgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICAgICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJICAgICAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRwaWNfb2JqZWN0IgorCSAgICAgIHByZXY9CisJICAgIGZpCisKKwkgICAgIyBBIFBJQyBvYmplY3QuCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgYXJnPSIkcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgTm9uLVBJQyBvYmplY3QuCisJICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCSAgICBmaQorCSAgZWxzZQorCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICBmaQorCWVsc2UKKwkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCSAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJICAgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICAgIGZ1bmNfbG8ybyAiJGFyZyIKKwkgICAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKKwkgICAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIG9sZF9kZXBsaWJzICIgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgICoubGEpCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgorCisJZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRhcmciCisJaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisJICBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgIHByZXY9CisJZWxpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgorCSAgZnVuY19hcHBlbmQgZGxwcmVmaWxlcyAiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQiCisJICBwcmV2PQorCWVsc2UKKwkgIGZ1bmNfYXBwZW5kIGRlcGxpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCisgICAgICAqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworICAgICAgZXNhYyAjIGFyZworCisgICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCisJZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKKwlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICAgIGZpCisgICAgZG9uZSAjIGFyZ3VtZW50IHBhcnNpbmcgbG9vcAorCisgICAgdGVzdCAtbiAiJHByZXYiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAidGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIKKworICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisgICAgZmkKKworICAgIG9sZGxpYnM9CisgICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQorICAgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCisgICAgb3V0cHV0bmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCisKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKKyAgICAgIGV2YWwgc2hsaWJfc2VhcmNoX3BhdGg9XGBcJEVDSE8gXCJcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFNFRCBcJ3MvOi8gL2dcJ1xgCisgICAgZWxzZQorICAgICAgc2hsaWJfc2VhcmNoX3BhdGg9CisgICAgZmkKKyAgICBldmFsIHN5c19saWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCIKKyAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCisKKyAgICBmdW5jX2Rpcm5hbWUgIiRvdXRwdXQiICIvIiAiIgorICAgIG91dHB1dF9vYmpkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JG9iamRpciIKKyAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dF9vYmpkaXIvIgorICAgIHRvb2xfb3V0cHV0X29iamRpcj0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCisgICAgZnVuY19ta2Rpcl9wICIkb3V0cHV0X29iamRpciIKKworICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICIiKQorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIgorICAgICAgOzsKKyAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OworICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OworICAgICoubGEpIGxpbmttb2RlPWxpYiA7OworICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgZXNhYworCisgICAgc3BlY2lhbGRlcGxpYnM9CisKKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCWNhc2UgIiRsaWJzICIgaW4KKwkqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGZ1bmNfYXBwZW5kIGxpYnMgIiAkZGVwbGliIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgorCisgICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcworICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQorICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgICAgaWYgJG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM7IHRoZW4KKwlmb3IgcHJlX3Bvc3RfZGVwIGluICRwcmVkZXBzICRwb3N0ZGVwczsgZG8KKwkgIGNhc2UgIiRwcmVfcG9zdF9kZXBzICIgaW4KKwkgICoiICRwcmVfcG9zdF9kZXAgIiopIGZ1bmNfYXBwZW5kIHNwZWNpYWxkZXBsaWJzICIgJHByZV9wb3N0X2RlcHMiIDs7CisJICBlc2FjCisJICBmdW5jX2FwcGVuZCBwcmVfcG9zdF9kZXBzICIgJHByZV9wb3N0X2RlcCIKKwlkb25lCisgICAgICBmaQorICAgICAgcHJlX3Bvc3RfZGVwcz0KKyAgICBmaQorCisgICAgZGVwbGlicz0KKyAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisgICAgbmV3bGliX3NlYXJjaF9wYXRoPQorICAgIG5lZWRfcmVsaW5rPW5vICMgd2hldGhlciB3ZSdyZSBsaW5raW5nIGFueSB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIG5vdGluc3RfZGVwbGlicz0gIyBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9wYXRoPSAjIHBhdGhzIHRoYXQgY29udGFpbiBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIGxpYikKKwlwYXNzZXM9ImNvbnYgZGxwcmVvcGVuIGxpbmsiCisJZm9yIGZpbGUgaW4gJGRsZmlsZXMgJGRscHJlZmlsZXM7IGRvCisJICBjYXNlICRmaWxlIGluCisJICAqLmxhKSA7OworCSAgKikKKwkgICAgZnVuY19mYXRhbF9oZWxwICJsaWJyYXJpZXMgY2FuIFxgLWRsb3Blbicgb25seSBsaWJ0b29sIGxpYnJhcmllczogJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJZG9uZQorCTs7CisgICAgcHJvZykKKwljb21waWxlX2RlcGxpYnM9CisJZmluYWxpemVfZGVwbGlicz0KKwlhbGxkZXBsaWJzPW5vCisJbmV3ZGxmaWxlcz0KKwluZXdkbHByZWZpbGVzPQorCXBhc3Nlcz0iY29udiBzY2FuIGRsb3BlbiBkbHByZW9wZW4gbGluayIKKwk7OworICAgICopICBwYXNzZXM9ImNvbnYiCisJOzsKKyAgICBlc2FjCisKKyAgICBmb3IgcGFzcyBpbiAkcGFzc2VzOyBkbworICAgICAgIyBUaGUgcHJlb3BlbiBwYXNzIGluIGxpYiBtb2RlIHJldmVyc2VzICRkZXBsaWJzOyBwdXQgaXQgYmFjayBoZXJlCisgICAgICAjIHNvIHRoYXQgLUwgY29tZXMgYmVmb3JlIGxpYnMgdGhhdCBuZWVkIGl0IGZvciBpbnN0YW5jZS4uLgorICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayI7IHRoZW4KKwkjIyBGSVhNRTogRmluZCB0aGUgcGxhY2Ugd2hlcmUgdGhlIGxpc3QgaXMgcmVidWlsdCBpbiB0aGUgd3JvbmcKKwkjIyAgICAgICAgb3JkZXIsIGFuZCBmaXggaXQgdGhlcmUgcHJvcGVybHkKKyAgICAgICAgdG1wX2RlcGxpYnM9CisJZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgIHRtcF9kZXBsaWJzPSIkZGVwbGliICR0bXBfZGVwbGlicyIKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iOyB0aGVuCisJbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCWNhc2UgJHBhc3MgaW4KKwlkbG9wZW4pIGxpYnM9IiRkbGZpbGVzIiA7OworCWRscHJlb3BlbikgbGlicz0iJGRscHJlZmlsZXMiIDs7CisJbGluaykgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlICRkZXBlbmRlbmN5X2xpYnMiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGRscHJlb3BlbiI7IHRoZW4KKwkjIENvbGxlY3QgYW5kIGZvcndhcmQgZGVwbGlicyBvZiBwcmVvcGVuZWQgbGlidG9vbCBsaWJzCisJZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICMgSWdub3JlIG5vbi1saWJ0b29sLWxpYnMKKwkgIGRlcGVuZGVuY3lfbGlicz0KKwkgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkbGliIgorCSAgY2FzZSAkbGliIGluCisJICAqLmxhKQlmdW5jX3NvdXJjZSAiJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIgOzsKKwkgIGVzYWMKKworCSAgIyBDb2xsZWN0IHByZW9wZW5lZCBsaWJ0b29sIGRlcGxpYnMsIGV4Y2VwdCBhbnkgdGhpcyBsaWJyYXJ5CisJICAjIGhhcyBkZWNsYXJlZCBhcyB3ZWFrIGxpYnMKKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJGRlcGxpYiIKKyAgICAgICAgICAgIGRlcGxpYl9iYXNlPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBjYXNlICIgJHdlYWtfbGlicyAiIGluCisJICAgICoiICRkZXBsaWJfYmFzZSAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgZGVwbGlicyAiICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlkb25lCisJbGlicz0iJGRscHJlZmlsZXMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisKKyAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCisJbGliPQorCWZvdW5kPW5vCisJY2FzZSAkZGVwbGliIGluCisJLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZnVuY19hcHBlbmQgY29tcGlsZXJfZmxhZ3MgIiAkZGVwbGliIgorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgorCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkJICAgICogKSBmdW5jX2FwcGVuZCBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktbCopCisJICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGZ1bmNfc3RyaXBuYW1lICctbCcgJycgIiRkZXBsaWIiCisJICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgc2VhcmNoZGlycz0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZWxzZQorCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZmkKKwkgIGZvciBzZWFyY2hkaXIgaW4gJHNlYXJjaGRpcnM7IGRvCisJICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCisJICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQorCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKKwkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgorCQkgIGZvdW5kPXllcworCQllbHNlCisJCSAgZm91bmQ9bm8KKwkJZmkKKwkJYnJlYWsgMgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQorCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKKwkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KKwkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopCisJCWlmIGZ1bmNfbGFsaWJfcCAiJGxpYiI7IHRoZW4KKwkJICBsaWJyYXJ5X25hbWVzPQorCQkgIG9sZF9saWJyYXJ5PQorCQkgIGZ1bmNfc291cmNlICIkbGliIgorCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkJICAgIGxsPSIkbCIKKwkJICBkb25lCisJCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKKwkJICAgIGZvdW5kPW5vCisJCSAgICBmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCQkgICAgbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKKwkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkJICAgIGVsc2UKKwkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkJICAgIGZpCisJCSAgICBjb250aW51ZQorCQkgIGZpCisJCWZpCisJCTs7CisJICAgICAgKikgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCSAgOzsgIyAtbAorCSoubHRmcmFtZXdvcmspCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCisJCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJCSAgICAqIiAkZGVwbGliICIqKSA7OworCQkgICAgKiApIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICBmdW5jX2FwcGVuZCBuZXdsaWJfc2VhcmNoX3BhdGggIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY29udGludWUKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkgICAgOzsKKwkgICopCisJICAgIGZ1bmNfd2FybmluZyAiXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgY29udGludWUKKwkgIDs7ICMgLUwKKwktUiopCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRkZXBsaWIiCisJICAgIGZ1bmNfcmVzb2x2ZV9zeXNyb290ICIkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICBkaXI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSAgICAjIE1ha2Ugc3VyZSB0aGUgeHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgeHJwYXRoICIgJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKQorCSAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRkZXBsaWIiCisJICBsaWI9JGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdAorCSAgOzsKKwkqLiRsaWJleHQpCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGNvbnRpbnVlCisJICBmaQorCSAgY2FzZSAkbGlua21vZGUgaW4KKwkgIGxpYikKKwkgICAgIyBMaW5raW5nIGNvbnZlbmllbmNlIG1vZHVsZXMgaW50byBzaGFyZWQgbGlicmFyaWVzIGlzIGFsbG93ZWQsCisJICAgICMgYnV0IGxpbmtpbmcgb3RoZXIgc3RhdGljIGxpYnJhcmllcyBpcyBub24tcG9ydGFibGUuCisJICAgIGNhc2UgIiAkZGxwcmVjb252ZW5pZW5jZWxpYnMgIiBpbgorCSAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAqKQorCSAgICAgIHZhbGlkX2FfbGliPW5vCisJICAgICAgY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwkJbWF0Y2hfcGF0dGVybiopCisJCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJCSAgaWYgZXZhbCAiXCRFQ0hPIFwiJGRlcGxpYlwiIiAyPi9kZXYvbnVsbCB8ICRTRUQgMTBxIFwKKwkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgIHZhbGlkX2FfbGliPXllcworCQkgIGZpCisJCTs7CisJCXBhc3NfYWxsKQorCQkgIHZhbGlkX2FfbGliPXllcworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgorCQllY2hvCisJCSRFQ0hPICIqKiogV2FybmluZzogVHJ5aW5nIHRvIGxpbmsgd2l0aCBzdGF0aWMgbGliIGFyY2hpdmUgJGRlcGxpYi4iCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJZWNobyAiKioqIGJlY2F1c2UgdGhlIGZpbGUgZXh0ZW5zaW9ucyAuJGxpYmV4dCBvZiB0aGlzIGFyZ3VtZW50IG1ha2VzIG1lIGJlbGlldmUiCisJCWVjaG8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2UgaGVyZS4iCisJICAgICAgZWxzZQorCQllY2hvCisJCSRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSIKKwkJJEVDSE8gIioqKiBzdGF0aWMgbGlicmFyeSAkZGVwbGliIGlzIG5vdCBwb3J0YWJsZSEiCisJCWRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gbGluazsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICA7OyAjICouJGxpYmV4dAorCSoubG8gfCAqLiRvYmpleHQpCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCisJICAgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkZXBsaWIiCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkZGVwbGliIgorCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCSVERVBMSUJTJSkKKwkgIGFsbGRlcGxpYnM9eWVzCisJICBjb250aW51ZQorCSAgOzsKKwllc2FjICMgY2FzZSAkZGVwbGliCisKKwlpZiB0ZXN0ICIkZm91bmQiID0geWVzIHx8IHRlc3QgLWYgIiRsaWIiOyB0aGVuIDoKKwllbHNlCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCB0aGUgbGlicmFyeSBcYCRsaWInIG9yIHVuaGFuZGxlZCBhcmd1bWVudCBcYCRkZXBsaWInIgorCWZpCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRsaWIiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCisJZnVuY19kaXJuYW1lICIkbGliIiAiIiAiLiIKKwlsYWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwlkbG5hbWU9CisJZGxvcGVuPQorCWRscHJlb3Blbj0KKwlsaWJkaXI9CisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwlpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPQorCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCisJIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZXMgaW5zdGFsbGVkLCBvciBzaG91bGRub3RsaW5rCisJaW5zdGFsbGVkPXllcworCXNob3VsZG5vdGxpbms9bm8KKwlhdm9pZHRlbXBycGF0aD0KKworCisJIyBSZWFkIHRoZSAubGEgZmlsZQorCWZ1bmNfc291cmNlICIkbGliIgorCisJIyBDb252ZXJ0ICItZnJhbWV3b3JrIGZvbyIgdG8gImZvby5sdGZyYW1ld29yayIKKwlpZiB0ZXN0IC1uICIkaW5oZXJpdGVkX2xpbmtlcl9mbGFncyI7IHRoZW4KKwkgIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPWAkRUNITyAiJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncy8tZnJhbWV3b3JrIFwoW14gJF0qXCkvXDEubHRmcmFtZXdvcmsvZydgCisJICBmb3IgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyBpbiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M7IGRvCisJICAgIGNhc2UgIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCSAgICAgICoiICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWciOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiICRkZXBlbmRlbmN5X2xpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAorCSAgIHsgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB9OyB0aGVuCisJICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGRsb3BlbiIKKwkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkZGxwcmVvcGVuIgorCWZpCisKKwlpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAjIE9ubHkgY2hlY2sgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcworCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIKKwkgICAgZmkKKwkgICAgIyBJdCBpcyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeSwgc28gYWRkIGluIGl0cyBvYmplY3RzLgorCSAgICBmdW5jX2FwcGVuZCBjb252ZW5pZW5jZSAiICRsYWRpci8kb2JqZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgZnVuY19hcHBlbmQgb2xkX2NvbnZlbmllbmNlICIgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSBjb252ZW5pZW5jZSBsaWJyYXJ5IgorCSAgZmkKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBpZiAkb3B0X3ByZXNlcnZlX2R1cF9kZXBzIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZGVwbGliIgorCSAgZG9uZQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gY29udgorCisKKwkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCisJbGlua2xpYj0KKwlpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmCisJICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IHllcyB8fAorCSAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCxubyI7IH07IHRoZW4KKwkgIGxpbmtsaWI9JG9sZF9saWJyYXJ5CisJZWxzZQorCSAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBsaW5rbGliPSIkbCIKKwkgIGRvbmUKKwlmaQorCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCisJZmkKKworCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgorCWlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IC1kbG9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIgorCSAgZmkKKwkgIGlmIHRlc3QgLXogIiRkbG5hbWUiIHx8CisJICAgICB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZworCSAgICAjIHN0YXRpY2FsbHksIHdlIG5lZWQgdG8gcHJlbG9hZC4gIFdlIGFsc28gbmVlZCB0byBwcmVsb2FkIGFueQorCSAgICAjIGRlcGVuZGVudCBsaWJyYXJpZXMgc28gbGlibHRkbCdzIGRlcGxpYiBwcmVsb2FkZXIgZG9lc24ndAorCSAgICAjIGJvbWIgb3V0IGluIHRoZSBsb2FkIGRlcGxpYnMgcGhhc2UuCisJICAgIGZ1bmNfYXBwZW5kIGRscHJlZmlsZXMgIiAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkbGliIgorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGRsb3BlbgorCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkbGFkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OworCSopCisJICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKKwkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCisJICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsYWRpciciCisJICAgIGZ1bmNfd2FybmluZyAicGFzc2luZyBpdCBsaXRlcmFsbHkgdG8gdGhlIGxpbmtlciwgYWx0aG91Z2ggaXQgbWlnaHQgZmFpbCIKKwkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCisJICBmaQorCSAgOzsKKwllc2FjCisJZnVuY19iYXNlbmFtZSAiJGxpYiIKKwlsYW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgorCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgISAtZiAiJGx0X3N5c3Jvb3QkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGx0X3N5c3Jvb3QkbGliZGlyIgorCSAgICBhYnNkaXI9IiRsdF9zeXNyb290JGxpYmRpciIKKwkgIGZpCisJICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSBYeWVzICYmIGF2b2lkdGVtcHJwYXRoPXllcworCWVsc2UKKwkgIGlmIHRlc3QgISAtZiAiJGxhZGlyLyRvYmpkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCisJICAgIGRpcj0iJGxhZGlyIgorCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgZnVuY19hcHBlbmQgbm90aW5zdF9wYXRoICIgJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgZnVuY19hcHBlbmQgbm90aW5zdF9wYXRoICIgJGFic19sYWRpciIKKwkgIGZpCisJZmkgIyAkaW5zdGFsbGVkID0geWVzCisJZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRsYW5hbWUiCisJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiICYmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm9ubHkgbGlicmFyaWVzIG1heSAtZGxwcmVvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKKwkgIGZpCisJICBjYXNlICIkaG9zdCIgaW4KKwkgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBwbGF0Zm9ybXMgd2l0aCBQRS1ETExzLgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAjIExpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJ5IGlmIGJvdGgKKwkgICAgICAjIHN0YXRpYyBhbmQgc2hhcmVkIGFyZSBwcmVzZW50LiAgVGhlcmVmb3JlLCBlbnN1cmUgd2UgZXh0cmFjdAorCSAgICAgICMgc3ltYm9scyBmcm9tIHRoZSBpbXBvcnQgbGlicmFyeSBpZiBhIHNoYXJlZCBsaWJyYXJ5IGlzIHByZXNlbnQKKwkgICAgICAjIChvdGhlcndpc2UsIHRoZSBkbG9wZW4gbW9kdWxlIG5hbWUgd2lsbCBiZSBpbmNvcnJlY3QpLiAgV2UgZG8KKwkgICAgICAjIHRoaXMgYnkgcHV0dGluZyB0aGUgaW1wb3J0IGxpYnJhcnkgbmFtZSBpbnRvICRuZXdkbHByZWZpbGVzLgorCSAgICAgICMgV2UgcmVjb3ZlciB0aGUgZGxvcGVuIG1vZHVsZSBuYW1lIGJ5ICdzYXZpbmcnIHRoZSBsYSBmaWxlCisJICAgICAgIyBuYW1lIGluIGEgc3BlY2lhbCBwdXJwb3NlIHZhcmlhYmxlLCBhbmQgKGxhdGVyKSBleHRyYWN0aW5nIHRoZQorCSAgICAgICMgZGxuYW1lIGZyb20gdGhlIGxhIGZpbGUuCisJICAgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfdHJfc2ggIiRkaXIvJGxpbmtsaWIiCisJICAgICAgICBldmFsICJsaWJmaWxlXyRmdW5jX3RyX3NoX3Jlc3VsdD1cJGFic19sYWRpci9cJGxhbmFtZSIKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAgICAgIyB0aGF0IHRoZXkgYXJlIGJlaW5nIHVzZWQgY29ycmVjdGx5IGluIHRoZSBsaW5rIHBhc3MuCisJICAgICAgICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJICAgICAgICAgIGZ1bmNfYXBwZW5kIGRscHJlY29udmVuaWVuY2VsaWJzICIgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICAgZmkKKwkgICAgOzsKKwkgICAgKiApCisJICAgICAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAgICAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCisJICAgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICAgICAgIyBLZWVwIGEgbGlzdCBvZiBwcmVvcGVuZWQgY29udmVuaWVuY2UgbGlicmFyaWVzIHRvIGNoZWNrCisJICAgICAgICAjIHRoYXQgdGhleSBhcmUgYmVpbmcgdXNlZCBjb3JyZWN0bHkgaW4gdGhlIGxpbmsgcGFzcy4KKwkgICAgICAgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkgICAgICAgICAgZnVuY19hcHBlbmQgZGxwcmVjb252ZW5pZW5jZWxpYnMgIiAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgorCSAgICAgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICAgIGZ1bmNfYXBwZW5kIG5ld2RscHJlZmlsZXMgIiAkZGlyLyRkbG5hbWUiCisJICAgICAgZWxzZQorCSAgICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRkaXIvJGxpbmtsaWIiCisJICAgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwlmaSAjICRwYXNzID0gZGxwcmVvcGVuCisKKwlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcworCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkKKworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRsYWRpciIKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisKKwkgIGxpbmthbGxkZXBsaWJzPW5vCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgIGxpbmthbGxkZXBsaWJzPXllcworCSAgZmkKKworCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgICAgICAgZnVuY19yZXNvbHZlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJICAgICAgICAgZnVuY19hcHBlbmQgbmV3bGliX3NlYXJjaF9wYXRoICIgJGZ1bmNfcmVzb2x2ZV9zeXNyb290X3Jlc3VsdCIKKwkJIDs7CisJICAgIGVzYWMKKwkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPworCSAgICBpZiB0ZXN0ICIkbGlua2FsbGRlcGxpYnMiID0geWVzOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocworCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCisJICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGlmICRvcHRfcHJlc2VydmVfZHVwX2RlcHMgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBmdW5jX2FwcGVuZCBzcGVjaWFsZGVwbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiCisJICBkb25lICMgZm9yIGRlcGxpYgorCSAgY29udGludWUKKwlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgICB7IHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fAorCSAgICAgICAgIHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMsJGluc3RhbGxlZCIgPSAiYnVpbHQseWVzIjsgfSB8fAorCSAgICAgICB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCisJICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgorCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgICAgICBjYXNlICIkdGVtcF9ycGF0aDoiIGluCisJICAgICAgKiIkYWJzZGlyOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIHRlbXBfcnBhdGggIiRhYnNkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKworCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCisJICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKKwkgICAgIyBzZWFyY2ggcGF0aC4KKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KKwkgICAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfcnBhdGggIiAkYWJzZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcnBhdGggIiAkbGliZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgorCisJICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKKwkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8CisJICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKKwkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgorCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicworCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgIHVzZV9zdGF0aWNfbGlicz1ubworCWZpCisJaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgeyB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgIyBObyBwb2ludCBpbiByZWxpbmtpbmcgRExMcyBiZWNhdXNlIHBhdGhzIGFyZSBub3QgZW5jb2RlZAorCSAgICAgIGZ1bmNfYXBwZW5kIG5vdGluc3RfZGVwbGlicyAiICRsaWIiCisJICAgICAgbmVlZF9yZWxpbms9bm8KKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm87IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBub3RpbnN0X2RlcGxpYnMgIiAkbGliIgorCSAgICAgIG5lZWRfcmVsaW5rPXllcworCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKKworCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uIHNvbWUKKwkgICMgc3lzdGVtcyAoZGFyd2luKS4gIERvbid0IGJsZWF0IGFib3V0IGRsb3BlbmVkIG1vZHVsZXMgdGhvdWdoIQorCSAgZGxvcGVubW9kdWxlPSIiCisJICBmb3IgZGxwcmVtb2R1bGV0ZXN0IGluICRkbHByZWZpbGVzOyBkbworCSAgICBpZiB0ZXN0ICJYJGRscHJlbW9kdWxldGVzdCIgPSAiWCRsaWIiOyB0aGVuCisJICAgICAgZGxvcGVubW9kdWxlPSIkZGxwcmVtb2R1bGV0ZXN0IgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICBkb25lCisJICBpZiB0ZXN0IC16ICIkZGxvcGVubW9kdWxlIiAmJiB0ZXN0ICIkc2hvdWxkbm90bGluayIgPSB5ZXMgJiYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCSAgICBlY2hvCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBlbHNlCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgZmkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKKwkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlbmQgY29tcGlsZV9ycGF0aCAiICRhYnNkaXIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyI7IHRoZW4KKwkgICAgIyBmaWd1cmUgb3V0IHRoZSBzb25hbWUKKwkgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisJICAgIHNoaWZ0CisJICAgIHJlYWxuYW1lPSIkMSIKKwkgICAgc2hpZnQKKwkgICAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPworCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKKwkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICAgICAgIyBibGVoIHdpbmRvd3MKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCBtaW5ndyogfCAqY2VnY2MqKQorCSAgICAgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkJbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisJCXZlcnN1ZmZpeD0iLSRtYWpvciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCSAgICBlbHNlCisJICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCisJICAgIGZpCisKKwkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKKwkgICAgc29yb290PSIkc29uYW1lIgorCSAgICBmdW5jX2Jhc2VuYW1lICIkc29yb290IgorCSAgICBzb25hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5kbGwnICIkc29uYW1lIgorCSAgICBuZXdsaWI9bGliaW1wLSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuYQorCisJICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93CisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6CisJICAgIGVsc2UKKwkgICAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZXh0cmFjdF9leHBzeW1zX2NtZHMiICdleGl0ICQ/JworCSAgICBmaQorCisJICAgICMgQ3JlYXRlICRuZXdsaWIKKwkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG5ld2xpYiI7IHRoZW4gOjsgZWxzZQorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiAnZXhpdCAkPycKKwkgICAgZmkKKwkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKKwkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCisJICAgIGxpbmtsaWI9JG5ld2xpYgorCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJICAgIGFkZF9zaGxpYnBhdGg9CisJICAgIGFkZF9kaXI9CisJICAgIGFkZD0KKwkgICAgbGliX2xpbmtlZD15ZXMKKwkgICAgY2FzZSAkaGFyZGNvZGVfYWN0aW9uIGluCisJICAgIGltbWVkaWF0ZSB8IHVuc3VwcG9ydGVkKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCQljYXNlICRob3N0IGluCisJCSAgKi0qLXNjbzMuMnY1LjAuWzAyNF0qKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y0KnV3MiopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotc3lzdjVPcGVuVU5JWCogfCAqLSotc3lzdjVVbml4V2FyZTcuWzAxXS5bMTBdKiB8IFwKKwkJICAgICotKi11bml4d2FyZTcqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLWRhcndpbiogKQorCQkgICAgIyBpZiB0aGUgbGliIGlzIGEgKG5vbi1kbG9wZW5lZCkgbW9kdWxlIHRoZW4gd2UgY2FuIG5vdAorCQkgICAgIyBsaW5rIGFnYWluc3QgaXQsIHNvbWVvbmUgaXMgaWdub3JpbmcgdGhlIGVhcmxpZXIgd2FybmluZ3MKKwkJICAgIGlmIC91c3IvYmluL2ZpbGUgLUwgJGFkZCAyPiAvZGV2L251bGwgfAorCQkJICRHUkVQICI6IFteOl0qIGJ1bmRsZSIgPi9kZXYvbnVsbCA7IHRoZW4KKwkJICAgICAgaWYgdGVzdCAiWCRkbG9wZW5tb2R1bGUiICE9ICJYJGxpYiI7IHRoZW4KKwkJCSRFQ0hPICIqKiogV2FybmluZzogbGliICRsaW5rbGliIGlzIGEgbW9kdWxlLCBub3QgYSBzaGFyZWQgbGlicmFyeSIKKwkJCWlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSIgOyB0aGVuCisJCQkgIGVjaG8KKwkJCSAgZWNobyAiKioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCQkgIGVjaG8gIioqKiBUaGUgbGluayB3aWxsIHByb2JhYmx5IGZhaWwsIHNvcnJ5IgorCQkJZWxzZQorCQkJICBhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgorCQkJZmkKKwkJICAgICAgZWxpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJCQlhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgorCQkgICAgICBmaQorCQkgICAgZmkKKwkJZXNhYworCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OworCQllc2FjCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KKwkJYWRkX3NobGlicGF0aD0iJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsc2UKKwkJbGliX2xpbmtlZD1ubworCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgcmVsaW5rKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzICYmCisJICAgICAgICAgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSIgPSBubzsgdGhlbgorCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkJYWRkX2Rpcj0iLUwkZGlyIgorCQkjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJCWlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJCSAgY2FzZSAkbGliZGlyIGluCisJCSAgICBbXFwvXSopCisJCSAgICAgIGZ1bmNfYXBwZW5kIGFkZF9kaXIgIiAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopIGxpYl9saW5rZWQ9bm8gOzsKKwkgICAgZXNhYworCisJICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCisJICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgorCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGNvbXBpbGVfc2hsaWJwYXRoICIkYWRkX3NobGlicGF0aDoiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCQkqIjokbGliZGlyOiIqKSA7OworCQkqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9zaGxpYnBhdGggIiRsaWJkaXI6IiA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3NobGlicGF0aCAiJGxpYmRpcjoiIDs7CisJICAgICAgZXNhYworCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiICYmCisJCSB0ZXN0IC1mICIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIgOyB0aGVuCisJCWFkZD0iJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZWxzZQorCQlhZGQ9IiRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCisJICAgICAgYWRkX2Rpcj0iLUwkbGliZGlyIgorCSAgICAgICMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQljYXNlICRsaWJkaXIgaW4KKwkJICBbXFwvXSopCisJCSAgICBmdW5jX2FwcGVuZCBhZGRfZGlyICIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgIGZpCisJICBmaQorCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICBlY2hvCisJICAgICRFQ0hPICIqKiogV2FybmluZzogVGhpcyBzeXN0ZW0gY2FuIG5vdCBsaW5rIHRvIHN0YXRpYyBsaWIgYXJjaGl2ZSAkbGliLiIKKwkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkgICAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgICBlY2hvICIqKiogQnV0IGFzIHlvdSB0cnkgdG8gYnVpbGQgYSBtb2R1bGUgbGlicmFyeSwgbGlidG9vbCB3aWxsIHN0aWxsIGNyZWF0ZSAiCisJICAgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCisJICAgICAgZWNobyAiKioqIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcgdG8gcmVzb2x2ZSBzeW1ib2xzIGF0IHJ1bnRpbWUuIgorCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJCWVjaG8KKwkJZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCWVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJCWVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkJZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgICBsaW5rX3N0YXRpYz15ZXMKKwkgIGZpCisJZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8CisJICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGxpYmRpciIKKwkgICAgICAgICAgIHRlbXBfeHJwYXRoPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIGZ1bmNfYXBwZW5kIHhycGF0aCAiICR0ZW1wX3hycGF0aCI7OworCQkgICBlc2FjOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0ZW1wX2RlcGxpYnMgIiAkbGliZGlyIjs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKKwkgIGZpCisKKwkgIGZ1bmNfYXBwZW5kIG5ld2xpYl9zZWFyY2hfcGF0aCAiICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgY2FzZSAkZGVwbGliIGluCisgICAgICAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWUgJy1MJyAnJyAiJGRlcGxpYiIKKyAgICAgICAgICAgICAgICAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCI7OworICAgICAgICAgICAgICAqKSBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIgOzsKKyAgICAgICAgICAgIGVzYWMKKwkgICAgaWYgJG9wdF9wcmVzZXJ2ZV9kdXBfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRmdW5jX3Jlc29sdmVfc3lzcm9vdF9yZXN1bHQgIiopCisgICAgICAgICAgICAgICAgZnVuY19hcHBlbmQgc3BlY2lhbGRlcGxpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgZnVuY19hcHBlbmQgdG1wX2xpYnMgIiAkZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0IgorCSAgZG9uZQorCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIHBhdGg9CisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OworCSAgICAgICoubGEpCisJICAgICAgICBmdW5jX3Jlc29sdmVfc3lzcm9vdCAiJGRlcGxpYiIKKwkgICAgICAgIGRlcGxpYj0kZnVuY19yZXNvbHZlX3N5c3Jvb3RfcmVzdWx0CisJICAgICAgICBmdW5jX2Rpcm5hbWUgIiRkZXBsaWIiICIiICIuIgorCQlkaXI9JGZ1bmNfZGlybmFtZV9yZXN1bHQKKwkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJCWNhc2UgJGRpciBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKKwkJKikKKwkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKwkJICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIgorCQkgICAgYWJzZGlyPSIkZGlyIgorCQkgIGZpCisJCSAgOzsKKwkJZXNhYworCQlpZiAkR1JFUCAiXmluc3RhbGxlZD1ubyIgJGRlcGxpYiA+IC9kZXYvbnVsbDsgdGhlbgorCQljYXNlICRob3N0IGluCisJCSotKi1kYXJ3aW4qKQorCQkgIGRlcGRlcGw9CisJCSAgZXZhbCBkZXBsaWJyYXJ5X25hbWVzPWAke1NFRH0gLW4gLWUgJ3MvXmxpYnJhcnlfbmFtZXM9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIGlmIHRlc3QgLW4gIiRkZXBsaWJyYXJ5X25hbWVzIiA7IHRoZW4KKwkJICAgIGZvciB0bXAgaW4gJGRlcGxpYnJhcnlfbmFtZXMgOyBkbworCQkgICAgICBkZXBkZXBsPSR0bXAKKwkJICAgIGRvbmUKKwkJICAgIGlmIHRlc3QgLWYgIiRhYnNkaXIvJG9iamRpci8kZGVwZGVwbCIgOyB0aGVuCisJCSAgICAgIGRlcGRlcGw9IiRhYnNkaXIvJG9iamRpci8kZGVwZGVwbCIKKwkJICAgICAgZGFyd2luX2luc3RhbGxfbmFtZT1gJHtPVE9PTH0gLUwgJGRlcGRlcGwgfCBhd2sgJ3tpZiAoTlIgPT0gMikge3ByaW50ICQxO2V4aXR9fSdgCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGRhcndpbl9pbnN0YWxsX25hbWUiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0w2NH0gLUwgJGRlcGRlcGwgIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAorICAgICAgICAgICAgICAgICAgICAgIGZpCisJCSAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVyX2ZsYWdzICIgJHt3bH0tZHlsaWJfZmlsZSAke3dsfSR7ZGFyd2luX2luc3RhbGxfbmFtZX06JHtkZXBkZXBsfSIKKwkJICAgICAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgLWR5bGliX2ZpbGUgJHtkYXJ3aW5faW5zdGFsbF9uYW1lfToke2RlcGRlcGx9IgorCQkgICAgICBwYXRoPQorCQkgICAgZmkKKwkJICBmaQorCQkgIDs7CisJCSopCisJCSAgcGF0aD0iLUwkYWJzZGlyLyRvYmpkaXIiCisJCSAgOzsKKwkJZXNhYworCQllbHNlCisJCSAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJICB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciIgJiYgXAorCQkgICAgZnVuY193YXJuaW5nICJcYCRkZXBsaWInIHNlZW1zIHRvIGJlIG1vdmVkIgorCisJCSAgcGF0aD0iLUwkYWJzZGlyIgorCQlmaQorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRwYXRoICIqKSA7OworCSAgICAgICopIGRlcGxpYnM9IiRwYXRoICRkZXBsaWJzIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCisJZmkgIyBsaW5rbW9kZSA9IGxpYgorICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KKwlpZiB0ZXN0ICIkbGlua21vZGUiID0gInByb2ciOyB0aGVuCisJICBjb21waWxlX2RlcGxpYnM9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkY29tcGlsZV9kZXBsaWJzIgorCSAgZmluYWxpemVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRmaW5hbGl6ZV9kZXBsaWJzIgorCWVsc2UKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgImAkRUNITyAiICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpCisgICAgICBmaQorICAgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJIyBMaW5rIHRoZSBkbHByZW9wZW5lZCBsaWJyYXJpZXMgYmVmb3JlIG90aGVyIGxpYnJhcmllcworCWZvciBkZXBsaWIgaW4gJHNhdmVfZGVwbGliczsgZG8KKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJZG9uZQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiAhPSBkbG9wZW47IHRoZW4KKwlpZiB0ZXN0ICIkcGFzcyIgIT0gY29udjsgdGhlbgorCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgbGliX3NlYXJjaF9wYXRoPQorCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbworCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgZnVuY19hcHBlbmQgbGliX3NlYXJjaF9wYXRoICIgJGRpciIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgbmV3bGliX3NlYXJjaF9wYXRoPQorCWZpCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiICE9ICJwcm9nLGxpbmsiOyB0aGVuCisJICB2YXJzPSJkZXBsaWJzIgorCWVsc2UKKwkgIHZhcnM9ImNvbXBpbGVfZGVwbGlicyBmaW5hbGl6ZV9kZXBsaWJzIgorCWZpCisJZm9yIHZhciBpbiAkdmFycyBkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAjIEFkZCBsaWJyYXJpZXMgdG8gJHZhciBpbiByZXZlcnNlIG9yZGVyCisJICBldmFsIHRtcF9saWJzPVwiXCQkdmFyXCIKKwkgIG5ld19saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkdG1wX2xpYnM7IGRvCisJICAgICMgRklYTUU6IFBlZGFudGljYWxseSwgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIHNvCisJICAgICMgICAgICAgIHRoYXQgc29tZSBuYXN0eSBkZXBlbmRlbmN5IGxvb3AgaXNuJ3QgYWNjaWRlbnRhbGx5CisJICAgICMgICAgICAgIGJyb2tlbjoKKwkgICAgI25ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIKKwkgICAgIyBQcmFnbWF0aWNhbGx5LCB0aGlzIHNlZW1zIHRvIGNhdXNlIHZlcnkgZmV3IHByb2JsZW1zIGluCisJICAgICMgcHJhY3RpY2U6CisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkgICAgLVIqKSA7OworCSAgICAqKQorCSAgICAgICMgQW5kIGhlcmUgaXMgdGhlIHJlYXNvbjogd2hlbiBhIGxpYnJhcnkgYXBwZWFycyBtb3JlCisJICAgICAgIyB0aGFuIG9uY2UgYXMgYW4gZXhwbGljaXQgZGVwZW5kZW5jZSBvZiBhIGxpYnJhcnksIG9yCisJICAgICAgIyBpcyBpbXBsaWNpdGx5IGxpbmtlZCBpbiBtb3JlIHRoYW4gb25jZSBieSB0aGUKKwkgICAgICAjIGNvbXBpbGVyLCBpdCBpcyBjb25zaWRlcmVkIHNwZWNpYWwsIGFuZCBtdWx0aXBsZQorCSAgICAgICMgb2NjdXJyZW5jZXMgdGhlcmVvZiBhcmUgbm90IHJlbW92ZWQuICBDb21wYXJlIHRoaXMKKwkgICAgICAjIHdpdGggaGF2aW5nIHRoZSBzYW1lIGxpYnJhcnkgYmVpbmcgbGlzdGVkIGFzIGEKKwkgICAgICAjIGRlcGVuZGVuY3kgb2YgbXVsdGlwbGUgb3RoZXIgbGlicmFyaWVzOiBpbiB0aGlzIGNhc2UsCisJICAgICAgIyB3ZSBrbm93IChwZWRhbnRpY2FsbHksIHdlIGFzc3VtZSkgdGhlIGxpYnJhcnkgZG9lcyBub3QKKwkgICAgICAjIG5lZWQgdG8gYmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlLCBzbyB3ZSBrZWVwIG9ubHkgdGhlCisJICAgICAgIyBsYXN0IGNvcHkuICBUaGlzIGlzIG5vdCBhbHdheXMgcmlnaHQsIGJ1dCBpdCBpcyByYXJlCisJICAgICAgIyBlbm91Z2ggdGhhdCB3ZSByZXF1aXJlIHVzZXJzIHRoYXQgcmVhbGx5IG1lYW4gdG8gcGxheQorCSAgICAgICMgc3VjaCB1bnBvcnRhYmxlIGxpbmtpbmcgdHJpY2tzIHRvIGxpbmsgdGhlIGxpYnJhcnkKKwkgICAgICAjIHVzaW5nIC1XbCwtbG5hbWUsIHNvIHRoYXQgbGlidG9vbCBkb2VzIG5vdCBjb25zaWRlciBpdAorCSAgICAgICMgZm9yIGR1cGxpY2F0ZSByZW1vdmFsLgorCSAgICAgIGNhc2UgIiAkc3BlY2lhbGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkgICAgICAqKQorCQljYXNlICIgJG5ld19saWJzICIgaW4KKwkJKiIgJGRlcGxpYiAiKikgOzsKKwkJKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCQllc2FjCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkbmV3X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopCisJICAgICAgY2FzZSAiICR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICAgICAqKSBmdW5jX2FwcGVuZCB0bXBfbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGRlcGxpYiIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgZXZhbCAkdmFyPVwiJHRtcF9saWJzXCIKKwlkb25lICMgZm9yIHZhcgorICAgICAgZmkKKyAgICAgICMgTGFzdCBzdGVwOiByZW1vdmUgcnVudGltZSBsaWJzIGZyb20gZGVwZW5kZW5jeV9saWJzCisgICAgICAjICh0aGV5IHN0YXkgaW4gZGVwbGlicykKKyAgICAgIHRtcF9saWJzPQorICAgICAgZm9yIGkgaW4gJGRlcGVuZGVuY3lfbGlicyA7IGRvCisJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoICIgaW4KKwkqIiAkaSAiKikKKwkgIGk9IiIKKwkgIDs7CisJZXNhYworCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KKwkgIGZ1bmNfYXBwZW5kIHRtcF9saWJzICIgJGkiCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0kdG1wX2xpYnMKKyAgICBkb25lICMgZm9yIHBhc3MKKyAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorICAgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisgICAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKyAgICBmaQorCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBvbGRsaWIpCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KKyAgICAgICpcIC1sKiB8ICpcIC1MKikKKwlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDs7CisgICAgICBlc2FjCisKKyAgICAgIHRlc3QgLW4gIiRycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkeHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCisgICAgICBmdW5jX2FwcGVuZCBvYmpzICIkb2xkX2RlcGxpYnMiCisgICAgICA7OworCisgICAgbGliKQorICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgorICAgICAgY2FzZSAkb3V0cHV0bmFtZSBpbgorICAgICAgbGliKikKKwlmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwk7OworICAgICAgKikKKwl0ZXN0ICIkbW9kdWxlIiA9IG5vICYmIFwKKwkgIGZ1bmNfZmF0YWxfaGVscCAibGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIKKworCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCisJICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCisJICBmdW5jX3N0cmlwbmFtZSAnJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIGV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwllbHNlCisJICBmdW5jX3N0cmlwbmFtZSAnJyAnLmxhJyAiJG91dHB1dG5hbWUiCisJICBsaWJuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgorCWlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMgb24gdGhpcyBob3N0OiRvYmpzIgorCWVsc2UKKwkgIGVjaG8KKwkgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBub24tbGlidG9vbCIKKwkgICRFQ0hPICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgorCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRvYmpzIgorCWZpCisgICAgICBmaQorCisgICAgICB0ZXN0ICIkZGxzZWxmIiAhPSBubyAmJiBcCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4gc2VsZicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiCisKKyAgICAgIHNldCBkdW1teSAkcnBhdGgKKyAgICAgIHNoaWZ0CisgICAgICB0ZXN0ICIkIyIgLWd0IDEgJiYgXAorCWZ1bmNfd2FybmluZyAiaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiCisKKyAgICAgIGluc3RhbGxfbGliZGlyPSIkMSIKKworICAgICAgb2xkbGlicz0KKyAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KKwkgICMgU29tZSBjb21waWxlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIGEgYC5hbCcgZXh0ZW5zaW9uIHNvCisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBleHRlbnNpb24gYW4KKwkgICMgYXJjaGl2ZSBub3JtYWxseSB3b3VsZC4KKwkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCisJICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKKwkgIGJ1aWxkX29sZF9saWJzPXllcworCWZpCisKKwl0ZXN0IC1uICIkdmluZm8iICYmIFwKKwkgIGZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvLy12ZXJzaW9uLW51bWJlcicgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIgorCisJdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwkgIGZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzIgorICAgICAgZWxzZQorCisJIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKKwlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCisJc2hpZnQKKwlJRlM9IiRzYXZlX2lmcyIKKworCXRlc3QgLW4gIiQ3IiAmJiBcCisJICBmdW5jX2ZhdGFsX2hlbHAgInRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIKKworCSMgY29udmVydCBhYnNvbHV0ZSB2ZXJzaW9uIG51bWJlcnMgdG8gbGlidG9vbCBhZ2VzCisJIyB0aGlzIHJldGFpbnMgY29tcGF0aWJpbGl0eSB3aXRoIC5sYSBmaWxlcyBhbmQgYXR0ZW1wdHMKKwkjIHRvIG1ha2UgdGhlIGNvZGUgYmVsb3cgYSBiaXQgbW9yZSBjb21wcmVoZW5zaWJsZQorCisJY2FzZSAkdmluZm9fbnVtYmVyIGluCisJeWVzKQorCSAgbnVtYmVyX21ham9yPSIkMSIKKwkgIG51bWJlcl9taW5vcj0iJDIiCisJICBudW1iZXJfcmV2aXNpb249IiQzIgorCSAgIworCSAgIyBUaGVyZSBhcmUgcmVhbGx5IG9ubHkgdHdvIGtpbmRzIC0tIHRob3NlIHRoYXQKKwkgICMgdXNlIHRoZSBjdXJyZW50IHJldmlzaW9uIGFzIHRoZSBtYWpvciB2ZXJzaW9uCisJICAjIGFuZCB0aG9zZSB0aGF0IHN1YnRyYWN0IGFnZSBhbmQgdXNlIGFnZSBhcworCSAgIyBhIG1pbm9yIHZlcnNpb24uICBCdXQsIHRoZW4gdGhlcmUgaXMgaXJpeAorCSAgIyB3aGljaCBoYXMgYW4gZXh0cmEgMSBhZGRlZCBqdXN0IGZvciBmdW4KKwkgICMKKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgZGFyd2lufGxpbnV4fG9zZnx3aW5kb3dzfG5vbmUpCisJICAgIGZ1bmNfYXJpdGggJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3IKKwkgICAgY3VycmVudD0kZnVuY19hcml0aF9yZXN1bHQKKwkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgorCSAgICByZXZpc2lvbj0iJG51bWJlcl9yZXZpc2lvbiIKKwkgICAgOzsKKwkgIGZyZWVic2QtYW91dHxmcmVlYnNkLWVsZnxxbnh8c3Vub3MpCisJICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBhZ2U9IjAiCisJICAgIDs7CisJICBpcml4fG5vbnN0b3B1eCkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBsdF9pcml4X2luY3JlbWVudD1ubworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlubykKKwkgIGN1cnJlbnQ9IiQxIgorCSAgcmV2aXNpb249IiQyIgorCSAgYWdlPSIkMyIKKwkgIDs7CisJZXNhYworCisJIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKwljYXNlICRjdXJyZW50IGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRyZXZpc2lvbiBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRhZ2UgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgorCSAgZnVuY19lcnJvciAiQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciCisJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgZnVuY19hcml0aCAkY3VycmVudCArIDEKKwkgIG1pbm9yX2N1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgaWYgdGVzdCAiWCRsdF9pcml4X2luY3JlbWVudCIgPSAiWG5vIjsgdGhlbgorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgZWxzZQorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZSArIDEKKwkgIGZpCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRyZXZpc2lvbiAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgorCSAgZG9uZQorCisJICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCisJICBtYWpvcj0uJG1ham9yCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCisJICA7OworCisJbGludXgpCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICA7OworCisJb3NmKQorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JGFnZQorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGxvb3AKKwkgICAgaWZhY2U9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXJpdGggJGxvb3AgLSAxCisJICAgIGxvb3A9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgorCSAgZG9uZQorCisJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisJICBmdW5jX2FwcGVuZCB2ZXJzdHJpbmcgIjoke2N1cnJlbnR9LjAiCisJICA7OworCisJcW54KQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IgorCSAgOzsKKworCXN1bm9zKQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwl3aW5kb3dzKQorCSAgIyBVc2UgJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seSB3YW50IG9uZQorCSAgIyBleHRlbnNpb24gb24gRE9TIDguMyBmaWxlc3lzdGVtcy4KKwkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iLSRtYWpvciIKKwkgIDs7CisKKwkqKQorCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJ1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciCisJICA7OworCWVzYWMKKworCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCisJaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkgIG1ham9yPQorCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICBkYXJ3aW4pCisJICAgICMgd2UgY2FuJ3QgY2hlY2sgZm9yICIwLjAiIGluIGFyY2hpdmVfY21kcyBkdWUgdG8gcXVvdGluZworCSAgICAjIHByb2JsZW1zLCBzbyB3ZSByZXNldCBpdCBjb21wbGV0ZWx5CisJICAgIHZlcnN0cmluZz0KKwkgICAgOzsKKwkgICopCisJICAgIHZlcnN0cmluZz0iMC4wIgorCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgICB2ZXJzdWZmaXg9CisJICBlbHNlCisJICAgIHZlcnN1ZmZpeD0iLjAuMCIKKwkgIGZpCisJZmkKKworCSMgUmVtb3ZlIHZlcnNpb24gaW5mbyBmcm9tIG5hbWUgaWYgdmVyc2lvbmluZyBzaG91bGQgYmUgYXZvaWRlZAorCWlmIHRlc3QgIiRhdm9pZF92ZXJzaW9uIiA9IHllcyAmJiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICBtYWpvcj0KKwkgIHZlcnN1ZmZpeD0KKwkgIHZlcnN0cmluZz0iIgorCWZpCisKKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCisJaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgInVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiCisJICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgIGZpCisJZWxzZQorCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCisJZmkKKworICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRsaWJuYW1lIiAiJGxpYm5hbWUiICJ5ZXMiCisgICAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHN5bWZpbGVvYmoiCisgICAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCisgICAgICBpZiB0ZXN0ICIkb3B0X21vZGUiICE9IHJlbGluazsgdGhlbgorCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5CisJIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCisJcmVtb3ZlbGlzdD0KKwl0ZW1wcmVtb3ZlbGlzdD1gJEVDSE8gIiRvdXRwdXRfb2JqZGlyLyoiYAorCWZvciBwIGluICR0ZW1wcmVtb3ZlbGlzdDsgZG8KKwkgIGNhc2UgJHAgaW4KKwkgICAgKi4kb2JqZXh0IHwgKi5nY25vKQorCSAgICAgICA7OworCSAgICAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSB8ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogfCAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qKQorCSAgICAgICBpZiB0ZXN0ICJYJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiAhPSAiWCI7IHRoZW4KKwkJIGlmICRFQ0hPICIkcCIgfCAkRUdSRVAgLWUgIiRwcmVjaW91c19maWxlc19yZWdleCIgPi9kZXYvbnVsbCAyPiYxCisJCSB0aGVuCisJCSAgIGNvbnRpbnVlCisJCSBmaQorCSAgICAgICBmaQorCSAgICAgICBmdW5jX2FwcGVuZCByZW1vdmVsaXN0ICIgJHAiCisJICAgICAgIDs7CisJICAgICopIDs7CisJICBlc2FjCisJZG9uZQorCXRlc3QgLW4gIiRyZW1vdmVsaXN0IiAmJiBcCisJICBmdW5jX3Nob3dfZXZhbCAiJHtSTX1yIFwkcmVtb3ZlbGlzdCIKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KKwlmdW5jX2FwcGVuZCBvbGRsaWJzICIgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKworCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KKwlvbGRvYmpzPSIkb2JqcyAiYCRFQ0hPICIkbGlib2JqcyIgfCAkU1AyTkwgfCAkU0VEICIvXC4ke2xpYmV4dH0kL2Q7ICRsbzJvIiB8ICROTDJTUGAKKyAgICAgIGZpCisKKyAgICAgICMgRWxpbWluYXRlIGFsbCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMuCisgICAgICAjZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKyAgICAgICMJbGliX3NlYXJjaF9wYXRoPWAkRUNITyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJFNFRCAicyUgJHBhdGggJSAlZyJgCisgICAgICAjCWRlcGxpYnM9YCRFQ0hPICIkZGVwbGlicyAiIHwgJFNFRCAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgICMJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiJGRlcGVuZGVuY3lfbGlicyAiIHwgJFNFRCAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgICNkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCXRlbXBfeHJwYXRoPQorCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KKwkgIGZ1bmNfcmVwbGFjZV9zeXNyb290ICIkbGliZGlyIgorCSAgZnVuY19hcHBlbmQgdGVtcF94cnBhdGggIiAtUiRmdW5jX3JlcGxhY2Vfc3lzcm9vdF9yZXN1bHQiCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIGZpbmFsaXplX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisJaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAorICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgorICAgICAgZGxmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbworCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBmdW5jX2FwcGVuZCBkbGZpbGVzICIgJGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisKKyAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKKyAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKKyAgICAgIGRscHJlZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KKwljYXNlICIkZGxwcmVmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBmdW5jX2FwcGVuZCBkbHByZWZpbGVzICIgJGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKiB8ICotKi1oYWlrdSopCisJICAgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGxpYnJhcnkgaXMgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZnVuY19hcHBlbmQgZGVwbGlicyAiIFN5c3RlbS5sdGZyYW1ld29yayIKKwkgICAgOzsKKwkgICotKi1uZXRic2QqKQorCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgOzsKKwkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKKwkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgOzsKKwkgICopCisJICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcyBpZiBuZWNlc3NhcnkuCisJICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX25lZWRfbGMiID0gInllcyI7IHRoZW4KKwkgICAgICBmdW5jX2FwcGVuZCBkZXBsaWJzICIgLWxjIgorCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCWZpCisKKwkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCisJbmFtZV9zYXZlPSRuYW1lCisJbGlibmFtZV9zYXZlPSRsaWJuYW1lCisJcmVsZWFzZV9zYXZlPSRyZWxlYXNlCisJdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAorCW1ham9yX3NhdmU9JG1ham9yCisJIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKKwkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KKwkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KKwlyZWxlYXNlPSIiCisJdmVyc3VmZml4PSIiCisJbWFqb3I9IiIKKwluZXdkZXBsaWJzPQorCWRyb3BwZWRkZXBzPW5vCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwlwYXNzX2FsbCkKKwkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgorCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjaworCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgorCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0CisJICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KKwkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKKwkgIDs7CisJdGVzdF9jb21waWxlKQorCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKKwkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0CisJICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjaworCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCisJICAkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0LmMKKwkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKwkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQorRU9GCisJICAkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0CisJICBpZiAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGliczsgdGhlbgorCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCisJICAgIGZvciBpIGluICRkZXBsaWJzOyBkbworCSAgICAgIGNhc2UgJGkgaW4KKwkgICAgICAtbCopCisJCWZ1bmNfc3RyaXBuYW1lIC1sICcnICIkaSIKKwkJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJICAqIiAkaSAiKikKKwkJICAgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkaSIKKwkJICAgIGk9IiIKKwkJICAgIDs7CisJCSAgZXNhYworCQlmaQorCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAorCQkgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgZGVwbGliX21hdGNoPSQxCisJCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQkgIGVsc2UKKwkJICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgZWNobworCQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCisJCSAgICBlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSBpdCBmb3IiCisJCSAgICBlY2hvICIqKiogaXRzIGR5bmFtaWMgZGVwZW5kZW5jeSBsaXN0IHRoYXQgcHJvZ3JhbXMgZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCisJCSAgZmkKKwkJZmkKKwkJOzsKKwkgICAgICAqKQorCQlmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGkiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBlbHNlCisJICAgICMgRXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZQorCSAgICAjIHRoZSBzaXR1YXRpb246IENvbXBpbGUgYSBzZXBhcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCisJICAgIGZvciBpIGluICRkZXBsaWJzOyBkbworCSAgICAgIGNhc2UgJGkgaW4KKwkgICAgICAtbCopCisJCWZ1bmNfc3RyaXBuYW1lIC1sICcnICIkaSIKKwkJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJCSRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QKKwkJaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGk7IHRoZW4KKwkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCisJCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQkgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSAgICAqIiAkaSAiKikKKwkJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQkgICAgICBpPSIiCisJCSAgICAgIDs7CisJCSAgICBlc2FjCisJCSAgZmkKKwkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsICJcXCRFQ0hPIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiImAKKwkJICAgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgICBkZXBsaWJfbWF0Y2g9JDEKKwkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQkgICAgZWxzZQorCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKKwkJICAgICAgZWNobworCQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCisJCSAgICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJICAgICAgZWNobyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgdGhpcyBvbmUiCisJCSAgICAgIGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICAgIGZpCisJCSAgZmkKKwkJZWxzZQorCQkgIGRyb3BwZWRkZXBzPXllcworCQkgIGVjaG8KKwkJICAkRUNITyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgorCQkgIGVjaG8gIioqKiBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKKwkJICBlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgorCQkgIGVjaG8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCisJCWZpCisJCTs7CisJICAgICAgKikKKwkJZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRpIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZmkKKwkgIDs7CisJZmlsZV9tYWdpYyopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgICBjYXNlICRhX2RlcGxpYiBpbgorCSAgICAtbCopCisJICAgICAgZnVuY19zdHJpcG5hbWUgLWwgJycgIiRhX2RlcGxpYiIKKwkgICAgICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkqIiAkYV9kZXBsaWIgIiopCisJCSAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQlpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY19nbG9iIjsgdGhlbgorCQkgIGxpYm5hbWVnbG9iPWBmdW5jX2VjaG9fYWxsICIkbGlibmFtZSIgfCAkU0VEIC1lICRmaWxlX21hZ2ljX2dsb2JgCisJCWVsc2UKKwkJICBsaWJuYW1lZ2xvYj0kbGlibmFtZQorCQlmaQorCQl0ZXN0ICIkd2FudF9ub2Nhc2VnbG9iIiA9IHllcyAmJiBub2Nhc2VnbG9iPWBzaG9wdCAtcCBub2Nhc2VnbG9iYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBpZiB0ZXN0ICIkd2FudF9ub2Nhc2VnbG9iIiA9IHllczsgdGhlbgorCQkgICAgc2hvcHQgLXMgbm9jYXNlZ2xvYgorCQkgICAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lZ2xvYlsuLV0qIDI+L2Rldi9udWxsYAorCQkgICAgJG5vY2FzZWdsb2IKKwkJICBlbHNlCisJCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVnbG9iWy4tXSogMj4vZGV2L251bGxgCisJCSAgZmkKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCisJCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RlbnRfbGliIiAyPi9kZXYvbnVsbCB8CisJCQkgJEdSRVAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KKwkJCWNvbnRpbnVlCisJCSAgICAgIGZpCisJCSAgICAgICMgVGhlIHN0YXRlbWVudCBhYm92ZSB0cmllcyB0byBhdm9pZCBlbnRlcmluZyBhbgorCQkgICAgICAjIGVuZGxlc3MgbG9vcCBiZWxvdywgaW4gY2FzZSBvZiBjeWNsaWMgbGlua3MuCisJCSAgICAgICMgV2UgbWlnaHQgc3RpbGwgZW50ZXIgYW4gZW5kbGVzcyBsb29wLCBzaW5jZSBhIGxpbmsKKwkJICAgICAgIyBsb29wIGNhbiBiZSBjbG9zZWQgd2hpbGUgd2UgZm9sbG93IGxpbmtzLAorCQkgICAgICAjIGJ1dCBzbyB3aGF0PworCQkgICAgICBwb3RsaWI9IiRwb3RlbnRfbGliIgorCQkgICAgICB3aGlsZSB0ZXN0IC1oICIkcG90bGliIiAyPi9kZXYvbnVsbDsgZG8KKwkJCXBvdGxpYmxpbms9YGxzIC1sZCAkcG90bGliIHwgJHtTRUR9ICdzLy4qIC0+IC8vJ2AKKwkJCWNhc2UgJHBvdGxpYmxpbmsgaW4KKwkJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcG90bGliPSIkcG90bGlibGluayI7OworCQkJKikgcG90bGliPWAkRUNITyAiJHBvdGxpYiIgfCAkU0VEICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKKwkJCWVzYWMKKwkJICAgICAgZG9uZQorCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgfAorCQkJICRTRUQgLWUgMTBxIHwKKwkJCSAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkJCWFfZGVwbGliPSIiCisJCQlicmVhayAyCisJCSAgICAgIGZpCisJCSAgZG9uZQorCQlkb25lCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlkcm9wcGVkZGVwcz15ZXMKKwkJZWNobworCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJZWNobyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgZmlsZSBtYWdpYyB0ZXN0KSIKKwkJZWxzZQorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRFQ0hPICIqKiogdXNpbmcgYSBmaWxlIG1hZ2ljLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW1hdGNoX3BhdHRlcm4qKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgY2FzZSAkYV9kZXBsaWIgaW4KKwkgICAgLWwqKQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCisJICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIGZ1bmNfYXBwZW5kIG5ld2RlcGxpYnMgIiAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgcG90bGliPSIkcG90ZW50X2xpYiIgIyBzZWUgc3ltbGluay1jaGVjayBhYm92ZSBpbiBmaWxlX21hZ2ljIHRlc3QKKwkJICAgIGlmIGV2YWwgIlwkRUNITyBcIiRwb3RlbnRfbGliXCIiIDI+L2Rldi9udWxsIHwgJFNFRCAxMHEgfCBcCisJCSAgICAgICAkRUdSRVAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkgICAgICBmdW5jX2FwcGVuZCBuZXdkZXBsaWJzICIgJGFfZGVwbGliIgorCQkgICAgICBhX2RlcGxpYj0iIgorCQkgICAgICBicmVhayAyCisJCSAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCWVjaG8KKwkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgorCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCWVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIHJlZ2V4IHBhdHRlcm4gdGVzdCkiCisJCWVsc2UKKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkRUNITyAiKioqIHVzaW5nIGEgcmVnZXggcGF0dGVybi4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGVwbGlicyAiICRhX2RlcGxpYiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwlub25lIHwgdW5rbm93biB8ICopCisJICBuZXdkZXBsaWJzPSIiCisJICB0bXBfZGVwbGlicz1gJEVDSE8gIiAkZGVwbGlicyIgfCAkU0VEICdzLyAtbGMkLy87IHMvIC1bTFJdW14gXSovL2cnYAorCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICBmb3IgaSBpbiAkcHJlZGVwcyAkcG9zdGRlcHMgOyBkbworCSAgICAgICMgY2FuJ3QgdXNlIFhzZWQgYmVsb3csIGJlY2F1c2UgJGkgbWlnaHQgY29udGFpbiAnLycKKwkgICAgICB0bXBfZGVwbGlicz1gJEVDSE8gIiAkdG1wX2RlcGxpYnMiIHwgJFNFRCAicywkaSwsImAKKwkgICAgZG9uZQorCSAgZmkKKwkgIGNhc2UgJHRtcF9kZXBsaWJzIGluCisJICAqWyFcCVwgXSopCisJICAgIGVjaG8KKwkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCisJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcGxhdGZvcm0uIgorCSAgICBlbHNlCisJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgZmkKKwkgICAgZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCisJICAgIGRyb3BwZWRkZXBzPXllcworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQorCW1ham9yPSRtYWpvcl9zYXZlCisJcmVsZWFzZT0kcmVsZWFzZV9zYXZlCisJbGlibmFtZT0kbGlibmFtZV9zYXZlCisJbmFtZT0kbmFtZV9zYXZlCisKKwljYXNlICRob3N0IGluCisJKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgd2l0aCB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgbmV3ZGVwbGlicz1gJEVDSE8gIiAkbmV3ZGVwbGlicyIgfCAkU0VEICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJICA7OworCWVzYWMKKworCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgIGVjaG8KKwkgICAgZWNobyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCisJICAgICRFQ0hPICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKKwkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCisJICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKKwkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKKwkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgICBlbHNlCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGZpCisJICBlbHNlCisJICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCisJICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKKworCSAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IG5vOyB0aGVuCisJICAgICAgZWNobworCSAgICAgIGVjaG8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCisJICAgICAgZWNobyAiKioqIGJlY2F1c2UgZWl0aGVyIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gb3IiCisJICAgICAgZWNobyAiKioqIGl0IHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCB3aXRoIC1uby11bmRlZmluZWQsIgorCSAgICAgIGVjaG8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKwlmaQorCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQorCWRlcGxpYnM9JG5ld2RlcGxpYnMKKyAgICAgIGZpCisgICAgICAjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisgICAgICBjYXNlICRob3N0IGluCisJKi0qLWRhcndpbiopCisJICBuZXdkZXBsaWJzPWAkRUNITyAiICRuZXdkZXBsaWJzIiB8ICRTRUQgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz1gJEVDSE8gIiAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIGRlcGxpYnM9YCRFQ0hPICIgJGRlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCisJICAgIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGRlcGxpYnM9IiRuZXdfbGlicyIKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKKwkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRsaWJkaXIiCisJCWxpYmRpcj0kZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0CisJCWlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJCWVsc2UKKwkJICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJCSAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkJICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCSAgICA7OworCQkgICopCisJCSAgICBmdW5jX2FwcGVuZCBoYXJkY29kZV9saWJkaXJzICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZnVuY19hcHBlbmQgZGVwX3JwYXRoICIgJGZsYWciCisJICAgICAgZmkKKwkgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZnVuY19hcHBlZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBkb25lCisJICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJICAgICB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwkgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQiOyB0aGVuCisJICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZFwiCisJICAgIGVsc2UKKwkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZmkKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgICBycGF0aD0KKwkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCisJICAgIGRvbmUKKwkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCisJICBmaQorCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKKwlmaQorCisJc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgorCXRlc3QgIiRvcHRfbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKKwlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgorCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCWZpCisKKwkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXNoaWZ0CisJcmVhbG5hbWU9IiQxIgorCXNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGZ1bmNfYXBwZW5kIGxpbmtuYW1lcyAiICRsaW5rIgorCWRvbmUKKworCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCisJdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkRUNITyAiJGxpYm9ianMiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorCXRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKwlkZWxmaWxlcz0KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgY3AgIiRleHBvcnRfc3ltYm9scyIgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKKwkgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzIgorCWZpCisKKwlvcmlnX2V4cG9ydF9zeW1ib2xzPQorCWNhc2UgJGhvc3Rfb3MgaW4KKwljeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICMgZXhwb3J0aW5nIHVzaW5nIHVzZXIgc3VwcGxpZWQgc3ltZmlsZQorCSAgICBpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgIT0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAjIGFuZCBpdCdzIE5PVCBhbHJlYWR5IGEgLmRlZiBmaWxlLiBNdXN0IGZpZ3VyZSBvdXQKKwkgICAgICAjIHdoaWNoIG9mIHRoZSBnaXZlbiBzeW1ib2xzIGFyZSBkYXRhIHN5bWJvbHMgYW5kIHRhZworCSAgICAgICMgdGhlbSBhcyBzdWNoLiBTbywgdHJpZ2dlciB1c2Ugb2YgZXhwb3J0X3N5bWJvbHNfY21kcy4KKwkgICAgICAjIGV4cG9ydF9zeW1ib2xzIGdldHMgcmVhc3NpZ25lZCBpbnNpZGUgdGhlICJwcmVwYXJlCisJICAgICAgIyB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzIiBpZiBzdGF0ZW1lbnQsIHNvIHRoZQorCSAgICAgICMgaW5jbHVkZV9leHBzeW1zIGxvZ2ljIHN0aWxsIHdvcmtzLgorCSAgICAgIG9yaWdfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0KKwkgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJICAgIGZpCisJICBmaQorCSAgOzsKKwllc2FjCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcworCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZDEgaW4gJGNtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgIyBUYWtlIHRoZSBub3JtYWwgYnJhbmNoIGlmIHRoZSBubV9maWxlX2xpc3Rfc3BlYyBicmFuY2gKKwkgICAgICAjIGRvZXNuJ3Qgd29yayBvciBpZiB0b29sIGNvbnZlcnNpb24gaXMgbm90IG5lZWRlZC4KKwkgICAgICBjYXNlICRubV9maWxlX2xpc3Rfc3BlY34kdG9fdG9vbF9maWxlX2NtZCBpbgorCQkqfmZ1bmNfY29udmVydF9maWxlX25vb3AgfCAqfmZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fdzMyIHwgfiopCisJCSAgdHJ5X25vcm1hbF9icmFuY2g9eWVzCisJCSAgZXZhbCBjbWQ9XCIkY21kMVwiCisJCSAgZnVuY19sZW4gIiAkY21kIgorCQkgIGxlbj0kZnVuY19sZW5fcmVzdWx0CisJCSAgOzsKKwkJKikKKwkJICB0cnlfbm9ybWFsX2JyYW5jaD1ubworCQkgIDs7CisJICAgICAgZXNhYworCSAgICAgIGlmIHRlc3QgIiR0cnlfbm9ybWFsX2JyYW5jaCIgPSB5ZXMgXAorCQkgJiYgeyB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgXAorCQkgICAgICB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgfQorCSAgICAgIHRoZW4KKwkJZnVuY19zaG93X2V2YWwgIiRjbWQiICdleGl0ICQ/JworCQlza2lwcGVkX2V4cG9ydD1mYWxzZQorCSAgICAgIGVsaWYgdGVzdCAtbiAiJG5tX2ZpbGVfbGlzdF9zcGVjIjsgdGhlbgorCQlmdW5jX2Jhc2VuYW1lICIkb3V0cHV0IgorCQlvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisJCXNhdmVfbGlib2Jqcz0kbGlib2JqcworCQlzYXZlX291dHB1dD0kb3V0cHV0CisJCW91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5ubQorCQlmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkJbGlib2Jqcz0kbm1fZmlsZV9saXN0X3NwZWMkZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJCWZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkJZnVuY192ZXJib3NlICJjcmVhdGluZyAkTk0gaW5wdXQgZmlsZSBsaXN0OiAkb3V0cHV0IgorCQlmb3Igb2JqIGluICRzYXZlX2xpYm9ianM7IGRvCisJCSAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJCSAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiCisJCWRvbmUgPiAiJG91dHB1dCIKKwkJZXZhbCBjbWQ9XCIkY21kMVwiCisJCWZ1bmNfc2hvd19ldmFsICIkY21kIiAnZXhpdCAkPycKKwkJb3V0cHV0PSRzYXZlX291dHB1dAorCQlsaWJvYmpzPSRzYXZlX2xpYm9ianMKKwkJc2tpcHBlZF9leHBvcnQ9ZmFsc2UKKwkgICAgICBlbHNlCisJCSMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBleGVjdXRlIGluIG9uZSBzdGVwLgorCQlmdW5jX3ZlcmJvc2UgInVzaW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgZm9yIGV4cG9ydCBsaXN0Li4uIgorCQlza2lwcGVkX2V4cG9ydD06CisJCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCisJCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgorCQlicmVhaworCSAgICAgIGZpCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IjsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKwlmaQorCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICckRUNITyAiJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiR0bXBfZXhwb3J0X3N5bWJvbHMiJworCWZpCisKKwlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKKwkgICMgRklYTUU6ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciBwb3RlbnRpYWxseSBjb250YWlucyBsb3RzIG9mCisJICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCisJICAjIGdsb2JhbCB2YXJpYWJsZXMuIGpvaW4oMSkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgdW5mb3J0dW5hdGVseQorCSAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgorCSAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgorCSAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scworCWZpCisKKwl0bXBfZGVwbGlicz0KKwlmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICBjYXNlICIgJGNvbnZlbmllbmNlICIgaW4KKwkgICoiICR0ZXN0X2RlcGxpYiAiKikgOzsKKwkgICopCisJICAgIGZ1bmNfYXBwZW5kIHRtcF9kZXBsaWJzICIgJHRlc3RfZGVwbGliIgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCisKKwlpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiICYmCisJICAgIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzICYmCisJICAgIHRlc3QgLXogIiRsaWJvYmpzIjsgdGhlbgorCSAgICAjIGV4dHJhY3QgdGhlIGFyY2hpdmVzLCBzbyB3ZSBoYXZlIG9iamVjdHMgdG8gbGlzdC4KKwkgICAgIyBUT0RPOiBjb3VsZCBvcHRpbWl6ZSB0aGlzIHRvIGp1c3QgZXh0cmFjdCBvbmUgYXJjaGl2ZS4KKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9CisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBlbHNlCisJICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICAgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgorCSAgZnVuY19hcHBlbmQgbGlua2VyX2ZsYWdzICIgJGZsYWciCisJZmkKKworCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZworCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VSAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KKwlmaQorCisJIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICBmaQorCWVsc2UKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICBlbHNlCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfY21kc1wiCisJICAgIGNtZHM9JGFyY2hpdmVfY21kcworCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgorCSAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIgJiYKKwkgICBsZW49JGZ1bmNfbGVuX3Jlc3VsdCAmJgorCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIHBpZWNld2lzZQorCSAgIyBvciwgaWYgdXNpbmcgR05VIGxkIGFuZCBza2lwcGVkX2V4cG9ydCBpcyBub3QgOiwgdXNlIGEgbGlua2VyCisJICAjIHNjcmlwdC4KKworCSAgIyBTYXZlIHRoZSB2YWx1ZSBvZiAkb3V0cHV0IGFuZCAkbGlib2JqcyBiZWNhdXNlIHdlIHdhbnQgdG8KKwkgICMgdXNlIHRoZW0gbGF0ZXIuICBJZiB3ZSBoYXZlIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCB3ZQorCSAgIyB3YW50IHRvIHVzZSBzYXZlX2xpYm9ianMgYXMgaXQgd2FzIGJlZm9yZQorCSAgIyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyB3YXMgZXhwYW5kZWQsIGJlY2F1c2Ugd2UgY2FuJ3QKKwkgICMgYXNzdW1lIHRoZSBsaW5rZXIgdW5kZXJzdGFuZHMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMuCisJICAjIFRoaXMgbWF5IGhhdmUgdG8gYmUgcmV2aXNpdGVkLCBpbiBjYXNlIHRvbyBtYW55CisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBnZXQgbGlua2VkIGluIGFuZCBlbmQgdXAgZXhjZWVkaW5nCisJICAjIHRoZSBzcGVjLgorCSAgaWYgdGVzdCAteiAiJGNvbnZlbmllbmNlIiB8fCB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcworCSAgZmkKKwkgIHNhdmVfb3V0cHV0PSRvdXRwdXQKKwkgIGZ1bmNfYmFzZW5hbWUgIiRvdXRwdXQiCisJICBvdXRwdXRfbGE9JGZ1bmNfYmFzZW5hbWVfcmVzdWx0CisKKwkgICMgQ2xlYXIgdGhlIHJlbG9hZGFibGUgb2JqZWN0IGNyZWF0aW9uIGNvbW1hbmQgcXVldWUgYW5kCisJICAjIGluaXRpYWxpemUgayB0byBvbmUuCisJICB0ZXN0X2NtZHM9CisJICBjb25jYXRfY21kcz0KKwkgIG9iamxpc3Q9CisJICBsYXN0X3JvYmo9CisJICBrPTEKKworCSAgaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgIG91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5sbmtzY3JpcHQKKwkgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBHTlUgbGQgc2NyaXB0OiAkb3V0cHV0IgorCSAgICBlY2hvICdJTlBVVCAoJyA+ICRvdXRwdXQKKwkgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgIGRvCisJICAgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICAgJEVDSE8gIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICBlY2hvICcpJyA+PiAkb3V0cHV0CisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZnVuY190b190b29sX2ZpbGVfcmVzdWx0CisJICBlbGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiWCRmaWxlX2xpc3Rfc3BlYyIgIT0gWDsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rCisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgbGlua2VyIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkgICAgOiA+ICRvdXRwdXQKKwkgICAgc2V0IHggJHNhdmVfbGlib2JqcworCSAgICBzaGlmdAorCSAgICBmaXJzdG9iaj0KKwkgICAgaWYgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXM7IHRoZW4KKwkgICAgICBmaXJzdG9iaj0iJDEgIgorCSAgICAgIHNoaWZ0CisJICAgIGZpCisJICAgIGZvciBvYmoKKwkgICAgZG8KKwkgICAgICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIgPj4gJG91dHB1dAorCSAgICBkb25lCisJICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJG91dHB1dCIKKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICAgIG91dHB1dD0kZmlyc3RvYmpcIiRmaWxlX2xpc3Rfc3BlYyRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHRcIgorCSAgZWxzZQorCSAgICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIjsgdGhlbgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCisJICAgICAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJICAgICAgZXZhbCB0ZXN0X2NtZHM9XCIkcmVsb2FkX2NtZHNcIgorCSAgICAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgICAgICBsZW4wPSRmdW5jX2xlbl9yZXN1bHQKKwkgICAgICBsZW49JGxlbjAKKworCSAgICAgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgorCSAgICAgIGZvciBvYmogaW4gJHNhdmVfbGlib2JqcworCSAgICAgIGRvCisJCWZ1bmNfbGVuICIgJG9iaiIKKwkJZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQlsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJCWlmIHRlc3QgIlgkb2JqbGlzdCIgPSBYIHx8CisJCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIjsgdGhlbgorCQkgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCQllbHNlCisJCSAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKKwkJICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgorCQkgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KKwkJICAgICMgVGhlIGZpcnN0IGZpbGUgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgY29tbWFuZCB0byBhZGQuCisJCSAgICByZWxvYWRfb2Jqcz0kb2JqbGlzdAorCQkgICAgZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kc1wiCisJCSAgZWxzZQorCQkgICAgIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KKwkJICAgICMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCSAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kc35cJFJNICRsYXN0X3JvYmpcIgorCQkgIGZpCisJCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJCSAgZnVuY19hcml0aCAkayArIDEKKwkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIG9iamxpc3Q9IiAkb2JqIgorCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKKwkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0CisJICAgICAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKKwkgICAgICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICByZWxvYWRfb2Jqcz0iJG9iamxpc3QgJGxhc3Rfcm9iaiIKKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzXCIKKwkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgorCSAgICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfX5cJFJNICRsYXN0X3JvYmpcIgorCSAgICAgIGZpCisJICAgICAgZnVuY19hcHBlbmQgZGVsZmlsZXMgIiAkb3V0cHV0IgorCisJICAgIGVsc2UKKwkgICAgICBvdXRwdXQ9CisJICAgIGZpCisKKwkgICAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS5leHAiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBsaWJvYmpzPSRvdXRwdXQKKwkgICAgICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byBjcmVhdGUgdGhlIGV4cG9ydCBmaWxlLgorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzJGV4cG9ydF9zeW1ib2xzX2NtZHNcIgorCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCisJCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzflwkUk0gJGxhc3Rfcm9ialwiCisJICAgICAgZmkKKwkgICAgZmkKKworCSAgICB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKKworCSAgICAjIExvb3AgdGhyb3VnaCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGFib3ZlIGFuZCBleGVjdXRlIHRoZW0uCisJICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICAkb3B0X3NpbGVudCB8fCB7CisJCSAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgorCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKwkgICAgICB9CisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkJbHRfZXhpdD0kPworCisJCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCQlpZiB0ZXN0ICIkb3B0X21vZGUiID0gcmVsaW5rOyB0aGVuCisJCSAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKKwkJICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCisJCSAgICAkTVYgIiR7cmVhbG5hbWV9VSIgIiRyZWFsbmFtZSIgKQorCQlmaQorCisJCWV4aXQgJGx0X2V4aXQKKwkgICAgICB9CisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBmaQorCSAgZmkKKworICAgICAgICAgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgICB0bXBfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIiRpbmNsdWRlX2V4cHN5bXMiIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgICAjIFRoZSBnaXZlbiBleHBvcnRzX3N5bWJvbHMgZmlsZSBoYXMgdG8gYmUgZmlsdGVyZWQsIHNvIGZpbHRlciBpdC4KKwkgICAgICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKKwkgICAgICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgICAgICMgJ3MnIGNvbW1hbmRzIHdoaWNoIG5vdCBhbGwgc2VkcyBjYW4gaGFuZGxlLiBHTlUgc2VkIHNob3VsZCBiZSBmaW5lCisJICAgICAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCisJICAgICAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICAgICAjIGlzbid0IGEgYmxlc3NlZCB0b29sLgorCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgorCSAgICAgIGZ1bmNfYXBwZW5kIGRlbGZpbGVzICIgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgICAgICBleHBvcnRfc3ltYm9scz0kb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scworCSAgICBmaQorCSAgZmkKKworCSAgbGlib2Jqcz0kb3V0cHV0CisJICAjIFJlc3RvcmUgdGhlIHZhbHVlIG9mIG91dHB1dC4KKwkgIG91dHB1dD0kc2F2ZV9vdXRwdXQKKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIiAmJiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZmkKKwkgICMgRXhwYW5kIHRoZSBsaWJyYXJ5IGxpbmtpbmcgY29tbWFuZHMgYWdhaW4gdG8gcmVzZXQgdGhlCisJICAjIHZhbHVlIG9mICRsaWJvYmpzIGZvciBwaWVjZXdpc2UgbGlua2luZy4KKworCSAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kbW9kdWxlX2NtZHMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJICAgIGVsc2UKKwkgICAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRkZWxmaWxlcyI7IHRoZW4KKwkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgdG8gJGNtZHMuCisJICBldmFsIGNtZHM9XCJcJGNtZHN+XCRSTSAkZGVsZmlsZXNcIgorCWZpCisKKwkjIEFkZCBhbnkgb2JqZWN0cyBmcm9tIHByZWxvYWRlZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwlpZiB0ZXN0IC1uICIkZGxwcmVmaWxlcyI7IHRoZW4KKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICBmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkZGxwcmVmaWxlcworCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCSAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwlmaQorCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgorCSAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisJICB9CisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZCIgfHwgeworCSAgICBsdF9leGl0PSQ/CisKKwkgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJICAgIGlmIHRlc3QgIiRvcHRfbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAorCSAgICAgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKKwkJJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkgICAgZmkKKworCSAgICBleGl0ICRsdF9leGl0CisJICB9CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCisJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJaWYgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkUk0gJHtyZWFsbmFtZX1UICYmICRNViAkcmVhbG5hbWUgJHtyZWFsbmFtZX1UICYmICRNViAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScgfHwgZXhpdCAkPworCisJICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwkgICAgZmkKKwkgIGZpCisKKwkgIGV4aXQgJEVYSVRfU1VDQ0VTUworCWZpCisKKwkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgorCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbworCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgorCSAgICBmdW5jX3Nob3dfZXZhbCAnKGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkbGlua25hbWUiICYmICRMTl9TICIkcmVhbG5hbWUiICIkbGlua25hbWUiKScgJ2V4aXQgJD8nCisJICBmaQorCWRvbmUKKworCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCisJaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgorCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCisJICBkbG5hbWU9IiRzb25hbWUiCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb2JqKQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KKyAgICAgICpcIC1sKiB8ICpcIC1MKikKKwlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgOzsKKyAgICAgIGVzYWMKKworICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHhycGF0aCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIHRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAgICoubG8pCisJdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiICYmIFwKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIKKworCWxpYm9iaj0kb3V0cHV0CisJZnVuY19sbzJvICIkbGlib2JqIgorCW9iaj0kZnVuY19sbzJvX3Jlc3VsdAorCTs7CisgICAgICAqKQorCWxpYm9iaj0KKwlvYmo9IiRvdXRwdXQiCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgorICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb2JqICRsaWJvYmoKKworICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCisgICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQorICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKKyAgICAgICMgdGhlIGV4dHJhY3Rpb24uCisgICAgICByZWxvYWRfY29udl9vYmpzPQorICAgICAgZ2VudG9wPQorICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKKyAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgYW5kIGhvcGUgd2UgY2FuIGdldCBieSB3aXRoCisgICAgICAjIHR1cm5pbmcgY29tbWEgaW50byBzcGFjZS4uCisgICAgICB3bD0KKworICAgICAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3M9XCIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgcmVsb2FkX2NvbnZfb2Jqcz0kcmVsb2FkX29ianNcIGAkRUNITyAiJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRTRUQgJ3N8LHwgfGcnYAorCWVsc2UKKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQorCSAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgorCWZpCisgICAgICBmaQorCisgICAgICAjIElmIHdlJ3JlIG5vdCBidWlsZGluZyBzaGFyZWQsIHdlIG5lZWQgdG8gdXNlIG5vbl9waWNfb2JqcworICAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIGxpYm9ianM9IiRub25fcGljX29iamVjdHMiCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJEVDSE8gIiRsaWJvYmpzIiB8ICRTUDJOTCB8ICRTRUQgIi9cLiR7bGliZXh0fSQvZDsgL1wubGliJC9kOyAkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworCisgICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KKyAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKwkjICRvcHRfZHJ5X3J1biB8fCBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCisJIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKwlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCisJb3V0cHV0PSIkbGlib2JqIgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKworICAgIHByb2cpCisgICAgICBjYXNlICRob3N0IGluCisJKmN5Z3dpbiopIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICAgb3V0cHV0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuZXhlOzsKKyAgICAgIGVzYWMKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgorCisgICAgICB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgXAorICAgICAgICAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biBcCisJJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93biAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgTFRfSU5JVChbZGxvcGVuXSknIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIiAkY29tcGlsZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkRUNITyAiICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRTRUQgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKKwk7OworICAgICAgZXNhYworCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLSotZGFyd2luKikKKwkjIERvbid0IGFsbG93IGxhenkgbGlua2luZywgaXQgYnJlYWtzIEMrKyBnbG9iYWwgY29uc3RydWN0b3JzCisJIyBCdXQgaXMgc3VwcG9zZWRseSBmaXhlZCBvbiAxMC40IG9yIGxhdGVyICh5YXkhKS4KKwlpZiB0ZXN0ICIkdGFnbmFtZSIgPSBDWFggOyB0aGVuCisJICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9IGluCisJICAgIDEwLlswMTIzXSkKKwkgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR7d2x9LWJpbmRfYXRfbG9hZCIKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCSMgVGltZSB0byBjaGFuZ2UgYWxsIG91ciAiZm9vLmx0ZnJhbWV3b3JrIiBzdHVmZiBiYWNrIHRvICItZnJhbWV3b3JrIGZvbyIKKwljb21waWxlX2RlcGxpYnM9YCRFQ0hPICIgJGNvbXBpbGVfZGVwbGlicyIgfCAkU0VEICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICIgJGZpbmFsaXplX2RlcGxpYnMiIHwgJFNFRCAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwk7OworICAgICAgZXNhYworCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkY29tcGlsZV9kZXBsaWJzICIgaW4KKwkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKKwkgICAgZnVuY19hcHBlbmQgbmV3X2xpYnMgIiAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGZvciBkZXBsaWIgaW4gJGNvbXBpbGVfZGVwbGliczsgZG8KKwljYXNlICRkZXBsaWIgaW4KKwktTCopCisJICBjYXNlICIgJG5ld19saWJzICIgaW4KKwkgICoiICRkZXBsaWIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBuZXdfbGlicyAiICRkZXBsaWIiIDs7CisJICBlc2FjCisJICA7OworCSopIGZ1bmNfYXBwZW5kIG5ld19saWJzICIgJGRlcGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBjb21waWxlX2RlcGxpYnM9IiRuZXdfbGlicyIKKworCisgICAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRmaW5hbGl6ZV9kZXBsaWJzIgorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbworCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorICAgICAgZmkKKworICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKKyAgICAgIHJwYXRoPQorICAgICAgaGFyZGNvZGVfbGliZGlycz0KKyAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbworCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCTs7CisJICAgICAgKikKKwkJZnVuY19hcHBlbmQgaGFyZGNvZGVfbGliZGlycyAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdW5jX2FwcGVuZCBwZXJtX3JwYXRoICIgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokbGliZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JGxpYmRpcjs7CisJICAqKSBmdW5jX2FwcGVuZCBkbGxzZWFyY2hwYXRoICI6JGxpYmRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKKwkgICopIGZ1bmNfYXBwZW5kIGRsbHNlYXJjaHBhdGggIjokdGVzdGJpbmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWZ1bmNfYXBwZW5kIGhhcmRjb2RlX2xpYmRpcnMgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnVuY19hcHBlbmQgZmluYWxpemVfcGVybV9ycGF0aCAiICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgIGZpCisgICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICIkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRTRUQgIiRsbzJvIiB8ICROTDJTUGAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFNFRCAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRvdXRwdXRuYW1lIiAiQFBST0dSQU1AIiAibm8iCisKKyAgICAgICMgdGVtcGxhdGUgcHJlbGlua2luZyBzdGVwCisgICAgICBpZiB0ZXN0IC1uICIkcHJlbGlua19jbWRzIjsgdGhlbgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcHJlbGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPXllcworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmNlZ2NjKiB8ICptaW5ndzMyY2UqKQorICAgICAgICAjIERpc2FibGUgd3JhcHBlcnMgZm9yIGNlZ2NjIGFuZCBtaW5ndzMyY2UgaG9zdHMsIHdlIGFyZSBjcm9zcyBjb21waWxpbmcgYW55d2F5LgorICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubworICAgICAgICA7OworICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGlmIHRlc3QgIiRuZWVkX3JlbGluayIgPSBubyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgICAgICB3cmFwcGVyc19yZXF1aXJlZD1ubworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAiJHdyYXBwZXJzX3JlcXVpcmVkIiA9IG5vOyB0aGVuCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIiRjb21waWxlX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCWV4aXRfc3RhdHVzPTAKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXRfc3RhdHVzPSQ/JworCisJaWYgdGVzdCAtbiAiJHBvc3RsaW5rX2NtZHMiOyB0aGVuCisJICBmdW5jX3RvX3Rvb2xfZmlsZSAiJG91dHB1dCIKKwkgIHBvc3RsaW5rX2NtZHM9YGZ1bmNfZWNob19hbGwgIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZycgLWUgJ3MlQFRPT0xfT1VUUFVUQCUnIiRmdW5jX3RvX3Rvb2xfZmlsZV9yZXN1bHQiJyVnJ2AKKwkgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdGxpbmtfY21kcyIgJ2V4aXQgJD8nCisJZmkKKworCSMgRGVsZXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IjsgdGhlbgorCSAgZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IicKKwlmaQorCisJZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKKyAgICAgIGZpCisKKyAgICAgIGNvbXBpbGVfdmFyPQorICAgICAgZmluYWxpemVfdmFyPQorICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgZnVuY19hcHBlbmQgcnBhdGggIiRkaXI6IgorCSAgZG9uZQorCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbworCSAgICBmdW5jX2FwcGVuZCBycGF0aCAiJGRpcjoiCisJICBkb25lCisJICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWxpbmtfY29tbWFuZD1gJEVDSE8gIiRsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwkjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgorCSRvcHRfZHJ5X3J1biB8fCAkUk0gJG91dHB1dAorCSMgTGluayB0aGUgZXhlY3V0YWJsZSBhbmQgZXhpdAorCWZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKKworCWlmIHRlc3QgLW4gIiRwb3N0bGlua19jbWRzIjsgdGhlbgorCSAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXQiCisJICBwb3N0bGlua19jbWRzPWBmdW5jX2VjaG9fYWxsICIkcG9zdGxpbmtfY21kcyIgfCAkU0VEIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RsaW5rX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisJIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKworCWZ1bmNfd2FybmluZyAidGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiCisJZnVuY193YXJuaW5nICJcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgorCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRTRUQgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJEVDSE8gIiRsaW5rX2NvbW1hbmQiIHwgJFNFRCAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgorICAgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkbGlua19jb21tYW5kIiAnZXhpdCAkPycKKworICAgICAgaWYgdGVzdCAtbiAiJHBvc3RsaW5rX2NtZHMiOyB0aGVuCisJZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIgorCXBvc3RsaW5rX2NtZHM9YGZ1bmNfZWNob19hbGwgIiRwb3N0bGlua19jbWRzIiB8ICRTRUQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnIC1lICdzJUBUT09MX09VVFBVVEAlJyIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IiclZydgCisJZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0bGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisJZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwkgIGVsaWYgZXZhbCB2YXJfdmFsdWU9XCQkdmFyOyB0ZXN0IC16ICIkdmFyX3ZhbHVlIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbHNlCisJICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiR2YXJfdmFsdWUiCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdDsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwkgIGZpCisJZG9uZQorCXJlbGlua19jb21tYW5kPSIoY2QgYHB3ZGA7ICRyZWxpbmtfY29tbWFuZCkiCisJcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgorCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJZXNhYworCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qKQorCSAgICBleGVleHQ9LmV4ZQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgorCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCisJICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCisJICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKwkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKKwkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQorCisJICAgICMgVGhlIHdyYXBwZXIgZXhlY3V0YWJsZSBpcyBidWlsdCB1c2luZyB0aGUgJGhvc3QgY29tcGlsZXIsCisJICAgICMgYmVjYXVzZSBpdCBjb250YWlucyAkaG9zdCBwYXRocyBhbmQgZmlsZXMuIElmIGNyb3NzLQorCSAgICAjIGNvbXBpbGluZywgaXQsIGxpa2UgdGhlIHRhcmdldCBleGVjdXRhYmxlLCBtdXN0IGJlCisJICAgICMgZXhlY3V0ZWQgb24gdGhlICRob3N0IG9yIHVuZGVyIGFuIGVtdWxhdGlvbiBlbnZpcm9ubWVudC4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQorCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKKwkgICAgfQorCisJICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6CisJICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCisJICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCisJICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KKwkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgICBlbHNlCisJCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZmkKKwkgICAgfQorCSAgOzsKKwkgICogKQorCSAgICAkUk0gJG91dHB1dAorCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKKwkgICAgY2htb2QgK3ggJG91dHB1dAorCSAgOzsKKwllc2FjCisgICAgICB9CisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkc3ltZmlsZW9iaiIKKwkgIGZpCisJZmkKKwlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCisJZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwlmdW5jX2FwcGVuZCBnZW5lcmF0ZWQgIiAkZ2VudG9wIgorCisJZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKKwlmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKyAgICAgIGVsc2UKKworCSMgQWRkIGFueSBvYmplY3RzIGZyb20gcHJlbG9hZGVkIGNvbnZlbmllbmNlIGxpYnJhcmllcworCWlmIHRlc3QgLW4gIiRkbHByZWZpbGVzIjsgdGhlbgorCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgIGZ1bmNfYXBwZW5kIGdlbmVyYXRlZCAiICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJZmkKKworCSMgUE9TSVggZGVtYW5kcyBubyBwYXRocyB0byBiZSBlbmNvZGVkIGluIGFyY2hpdmVzLiAgV2UgaGF2ZQorCSMgdG8gYXZvaWQgY3JlYXRpbmcgYXJjaGl2ZXMgd2l0aCBkdXBsaWNhdGUgYmFzZW5hbWVzIGlmIHdlCisJIyBtaWdodCBoYXZlIHRvIGV4dHJhY3QgdGhlbSBhZnRlcndhcmRzLCBlLmcuLCB3aGVuIGNyZWF0aW5nIGEKKwkjIHN0YXRpYyBhcmNoaXZlIG91dCBvZiBhIGNvbnZlbmllbmNlIGxpYnJhcnksIG9yIHdoZW4gbGlua2luZworCSMgdGhlIGVudGlyZXR5IG9mIGEgbGlidG9vbCBhcmNoaXZlIGludG8gYW5vdGhlciAoY3VycmVudGx5CisJIyBub3Qgc3VwcG9ydGVkIGJ5IGxpYnRvb2wpLgorCWlmIChmb3Igb2JqIGluICRvbGRvYmpzCisJICAgIGRvCisJICAgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgICAkRUNITyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBkb25lIHwgc29ydCB8IHNvcnQgLXVjID4vZGV2L251bGwgMj4mMSk7IHRoZW4KKwkgIDoKKwllbHNlCisJICBlY2hvICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZnVuY19hcHBlbmQgZ2VuZXJhdGVkICIgJGdlbnRvcCIKKwkgIGZ1bmNfbWtkaXJfcCAiJGdlbnRvcCIKKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgIGNvdW50ZXI9MQorCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgorCSAgICBvYmpiYXNlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCisJICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7CisJICAgICpbXCAvXSIkb2JqYmFzZSAiKikKKwkgICAgICB3aGlsZSA6OyBkbworCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbworCQkjIG92ZXJsYXBzLgorCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQorCQlmdW5jX2FyaXRoICRjb3VudGVyICsgMQorCQljb3VudGVyPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQljYXNlICIgJG9sZG9ianMgIiBpbgorCQkqW1wgL10iJG5ld29iaiAiKikgOzsKKwkJKikgaWYgdGVzdCAhIC1mICIkZ2VudG9wLyRuZXdvYmoiOyB0aGVuIGJyZWFrOyBmaSA7OworCQllc2FjCisJICAgICAgZG9uZQorCSAgICAgIGZ1bmNfc2hvd19ldmFsICJsbiAkb2JqICRnZW50b3AvJG5ld29iaiB8fCBjcCAkb2JqICRnZW50b3AvJG5ld29iaiIKKwkgICAgICBmdW5jX2FwcGVuZCBvbGRvYmpzICIgJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIDs7CisJICAgICopIGZ1bmNfYXBwZW5kIG9sZG9ianMgIiAkb2JqIiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCisKKwlmdW5jX2xlbiAiICRjbWRzIgorCWxlbj0kZnVuY19sZW5fcmVzdWx0CisJaWYgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCisJICBjbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCisJZWxpZiB0ZXN0IC1uICIkYXJjaGl2ZXJfbGlzdF9zcGVjIjsgdGhlbgorCSAgZnVuY192ZXJib3NlICJ1c2luZyBjb21tYW5kIGZpbGUgYXJjaGl2ZSBsaW5raW5nLi4uIgorCSAgZm9yIG9iaiBpbiAkb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY190b190b29sX2ZpbGUgIiRvYmoiCisJICAgICRFQ0hPICIkZnVuY190b190b29sX2ZpbGVfcmVzdWx0IgorCSAgZG9uZSA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmxpYmNtZAorCSAgZnVuY190b190b29sX2ZpbGUgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmxpYmNtZCIKKwkgIG9sZG9ianM9IiAkYXJjaGl2ZXJfbGlzdF9zcGVjJGZ1bmNfdG9fdG9vbF9maWxlX3Jlc3VsdCIKKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbHNlCisJICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cworCSAgZnVuY192ZXJib3NlICJ1c2luZyBwaWVjZXdpc2UgYXJjaGl2ZSBsaW5raW5nLi4uIgorCSAgc2F2ZV9SQU5MSUI9JFJBTkxJQgorCSAgUkFOTElCPToKKwkgIG9iamxpc3Q9CisJICBjb25jYXRfY21kcz0KKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PworCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBsYXN0X29sZG9iaj0kb2JqCisJICBkb25lCisJICBldmFsIHRlc3RfY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAorCSAgbGVuPSRsZW4wCisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIGZ1bmNfbGVuICIgJG9iaiIKKwkgICAgZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCSAgICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCSAgICBpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICAjIHRoZSBhYm92ZSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBpdCBnZXRzIHRvbyBsb25nCisJICAgICAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgICAgIGlmIHRlc3QgIiRvYmoiID0gIiRsYXN0X29sZG9iaiIgOyB0aGVuCisJCVJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgICAgICBmaQorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCisJICAgICAgb2JqbGlzdD0KKwkgICAgICBsZW49JGxlbjAKKwkgICAgZmkKKwkgIGRvbmUKKwkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgIG9sZG9ianM9JG9iamxpc3QKKwkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgorCSAgZWxzZQorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmaQorCWZpCisgICAgICBmaQorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRjbWRzIiAnZXhpdCAkPycKKyAgICBkb25lCisKKyAgICB0ZXN0IC1uICIkZ2VuZXJhdGVkIiAmJiBcCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJHtSTX1yJGdlbmVyYXRlZCIKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKyAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwllbHNlCisJICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWZpCisgICAgICBkb25lCisgICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgorICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYXV0b21hdGljIiA9IHllcyA7IHRoZW4KKwlyZWxpbmtfY29tbWFuZD0KKyAgICAgIGZpCisKKyAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgorICAgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwlmb3IgaW5zdGFsbGVkIGluIG5vIHllczsgZG8KKwkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX2xpYmRpciI7IHRoZW4KKwkgICAgICBicmVhaworCSAgICBmaQorCSAgICBvdXRwdXQ9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKKwkgICAgIyBSZXBsYWNlIGFsbCB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcyB3aXRoIHRoZSBpbnN0YWxsZWQgb25lcworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAqLmxhKQorCQlmdW5jX2Jhc2VuYW1lICIkZGVwbGliIgorCQluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCisJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgLUwqKQorCQlmdW5jX3N0cmlwbmFtZSAtTCAnJyAiJGRlcGxpYiIKKwkJZnVuY19yZXBsYWNlX3N5c3Jvb3QgIiRmdW5jX3N0cmlwbmFtZV9yZXN1bHQiCisJCWZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiIC1MJGZ1bmNfcmVwbGFjZV9zeXNyb290X3Jlc3VsdCIKKwkJOzsKKwkgICAgICAtUiopCisJCWZ1bmNfc3RyaXBuYW1lIC1SICcnICIkZGVwbGliIgorCQlmdW5jX3JlcGxhY2Vfc3lzcm9vdCAiJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkJZnVuY19hcHBlbmQgbmV3ZGVwZW5kZW5jeV9saWJzICIgLVIkZnVuY19yZXBsYWNlX3N5c3Jvb3RfcmVzdWx0IgorCQk7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RlcGVuZGVuY3lfbGlicyAiICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgbmV3ZGxmaWxlcz0KKworCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJICAgICAgICBmdW5jX2Jhc2VuYW1lICIkbGliIgorCQluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJCWV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJCXRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKKwkJZnVuY19hcHBlbmQgbmV3ZGxmaWxlcyAiICR7bHRfc3lzcm9vdDorPX0kbGliZGlyLyRuYW1lIgorCQk7OworCSAgICAgICopIGZ1bmNfYXBwZW5kIG5ld2RsZmlsZXMgIiAkbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkgICAgICAqLmxhKQorCQkjIE9ubHkgcGFzcyBwcmVvcGVuZWQgZmlsZXMgdG8gdGhlIHBzZXVkby1hcmNoaXZlIChmb3IKKwkJIyBldmVudHVhbCBsaW5raW5nIHdpdGggdGhlIGFwcC4gdGhhdCBsaW5rcyBpdCkgaWYgd2UKKwkJIyBkaWRuJ3QgYWxyZWFkeSBsaW5rIHRoZSBwcmVvcGVuZWQgb2JqZWN0cyBkaXJlY3RseSBpbnRvCisJCSMgdGhlIGxpYnJhcnk6CisJCWZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQlmdW5jX2FwcGVuZCBuZXdkbHByZWZpbGVzICIgJHtsdF9zeXNyb290Ois9fSRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBmdW5jX2FwcGVuZCBuZXdkbGZpbGVzICIgJGFicyIKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBjYXNlICRsaWIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnM9IiRsaWIiIDs7CisJCSopIGFicz1gcHdkYCIvJGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgZnVuY19hcHBlbmQgbmV3ZGxwcmVmaWxlcyAiICRhYnMiCisJICAgIGRvbmUKKwkgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisJICBmaQorCSAgJFJNICRvdXRwdXQKKwkgICMgcGxhY2UgZGxuYW1lIGluIGNvcnJlY3QgcG9zaXRpb24gZm9yIGN5Z3dpbgorCSAgIyBJbiBmYWN0LCBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHVzZSB0aGlzIGNvZGUgZm9yIGFsbCB0YXJnZXQKKwkgICMgc3lzdGVtcyB0aGF0IGNhbid0IGhhcmQtY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gdGhlaXIgZXhlY3V0YWJsZXMKKwkgICMgYW5kIHRoYXQgaGF2ZSBubyBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlIGluZGVwZW5kZW50IG9mIFBBVEgsCisJICAjIGJ1dCBpdCB0dXJucyBvdXQgd2UgY2FuJ3QgZWFzaWx5IGRldGVybWluZSB0aGF0IGZyb20gaW5zcGVjdGluZworCSAgIyBsaWJ0b29sIHZhcmlhYmxlcywgc28gd2UgaGF2ZSB0byBoYXJkLWNvZGUgdGhlIE9TcyB0byB3aGljaCBpdAorCSAgIyBhcHBsaWVzIGhlcmU7IGF0IHRoZSBtb21lbnQsIHRoYXQgbWVhbnMgcGxhdGZvcm1zIHRoYXQgdXNlIHRoZSBQRQorCSAgIyBvYmplY3QgZm9ybWF0IHdpdGggRExMIGZpbGVzLiAgU2VlIHRoZSBsb25nIGNvbW1lbnQgYXQgdGhlIHRvcCBvZgorCSAgIyB0ZXN0cy9iaW5kaXIuYXQgZm9yIGZ1bGwgZGV0YWlscy4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCB8ICpjZWdjYyosKmxhaSx5ZXMsbm8sKi5kbGwpCisJICAgICAgIyBJZiBhIC1iaW5kaXIgYXJndW1lbnQgd2FzIHN1cHBsaWVkLCBwbGFjZSB0aGUgZGxsIHRoZXJlLgorCSAgICAgIGlmIHRlc3QgIngkYmluZGlyIiAhPSB4IDsKKwkgICAgICB0aGVuCisJCWZ1bmNfcmVsYXRpdmVfcGF0aCAiJGluc3RhbGxfbGliZGlyIiAiJGJpbmRpciIKKwkJdGRsbmFtZT0kZnVuY19yZWxhdGl2ZV9wYXRoX3Jlc3VsdCRkbG5hbWUKKwkgICAgICBlbHNlCisJCSMgT3RoZXJ3aXNlIGZhbGwgYmFjayBvbiBoZXVyaXN0aWMuCisJCXRkbG5hbWU9Li4vYmluLyRkbG5hbWUKKwkgICAgICBmaQorCSAgICAgIDs7CisJICBlc2FjCisJICAkRUNITyA+ICRvdXRwdXQgIlwKKyMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckdGRsbmFtZScKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JworCisjIExpbmtlciBmbGFncyB0aGF0IGNhbiBub3QgZ28gaW4gZGVwZW5kZW5jeV9saWJzLgoraW5oZXJpdGVkX2xpbmtlcl9mbGFncz0nJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzJworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKKworIyBOYW1lcyBvZiBhZGRpdGlvbmFsIHdlYWsgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeQord2Vha19saWJyYXJ5X25hbWVzPSckd2Vha19saWJzJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgorY3VycmVudD0kY3VycmVudAorYWdlPSRhZ2UKK3JldmlzaW9uPSRyZXZpc2lvbgorCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD0kaW5zdGFsbGVkCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPSRtb2R1bGUKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JyRkbGZpbGVzJworZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgorCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0geWVzOyB0aGVuCisJICAgICRFQ0hPID4+ICRvdXRwdXQgIlwKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIiCisJICBmaQorCWRvbmUKKyAgICAgIH0KKworICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgorICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KKyAgICAgIGZ1bmNfc2hvd19ldmFsICcoIGNkICIkb3V0cHV0X29iamRpciIgJiYgJFJNICIkb3V0cHV0bmFtZSIgJiYgJExOX1MgIi4uLyRvdXRwdXRuYW1lIiAiJG91dHB1dG5hbWUiICknICdleGl0ICQ/JworICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKK3sgdGVzdCAiJG9wdF9tb2RlIiA9IGxpbmsgfHwgdGVzdCAiJG9wdF9tb2RlIiA9IHJlbGluazsgfSAmJgorICAgIGZ1bmNfbW9kZV9saW5rICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX3VuaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV91bmluc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgUk09IiRub25vcHQiCisgICAgZmlsZXM9CisgICAgcm1mb3JjZT0KKyAgICBleGl0X3N0YXR1cz0wCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZikgZnVuY19hcHBlbmQgUk0gIiAkYXJnIjsgcm1mb3JjZT15ZXMgOzsKKyAgICAgIC0qKSBmdW5jX2FwcGVuZCBSTSAiICRhcmciIDs7CisgICAgICAqKSBmdW5jX2FwcGVuZCBmaWxlcyAiICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJFJNIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIKKworICAgIHJtZGlycz0KKworICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgIGZ1bmNfZGlybmFtZSAiJGZpbGUiICIiICIuIgorICAgICAgZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICAgIGlmIHRlc3QgIlgkZGlyIiA9IFguOyB0aGVuCisJb2Rpcj0iJG9iamRpciIKKyAgICAgIGVsc2UKKwlvZGlyPSIkZGlyLyRvYmpkaXIiCisgICAgICBmaQorICAgICAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisgICAgICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB0ZXN0ICIkb3B0X21vZGUiID0gdW5pbnN0YWxsICYmIG9kaXI9IiRkaXIiCisKKyAgICAgICMgUmVtZW1iZXIgb2RpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgICBpZiB0ZXN0ICIkb3B0X21vZGUiID0gY2xlYW47IHRoZW4KKwljYXNlICIgJHJtZGlycyAiIGluCisJICAqIiAkb2RpciAiKikgOzsKKwkgICopIGZ1bmNfYXBwZW5kIHJtZGlycyAiICRvZGlyIiA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCisgICAgICBpZiB7IHRlc3QgLUwgIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgeyB0ZXN0IC1oICIkZmlsZSI7IH0gPi9kZXYvbnVsbCAyPiYxIHx8CisJIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCToKKyAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisJZXhpdF9zdGF0dXM9MQorCWNvbnRpbnVlCisgICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBybWZpbGVzPSIkZmlsZSIKKworICAgICAgY2FzZSAkbmFtZSBpbgorICAgICAgKi5sYSkKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisJaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG4iCisJICBkb25lCisJICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkb2Rpci8kb2xkX2xpYnJhcnkiCisKKwkgIGNhc2UgIiRvcHRfbW9kZSIgaW4KKwkgIGNsZWFuKQorCSAgICBjYXNlICIgJGxpYnJhcnlfbmFtZXMgIiBpbgorCSAgICAqIiAkZGxuYW1lICIqKSA7OworCSAgICAqKSB0ZXN0IC1uICIkZGxuYW1lIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJGRsbmFtZSIgOzsKKwkgICAgZXNhYworCSAgICB0ZXN0IC1uICIkbGliZGlyIiAmJiBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfWkiCisJICAgIDs7CisJICB1bmluc3RhbGwpCisJICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKKwkgICAgZmkKKwkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCisJICAgIDs7CisJICBlc2FjCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgorCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgJiYKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZGlyLyRub25fcGljX29iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqKQorCWlmIHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbiA7IHRoZW4KKwkgIG5vZXhlbmFtZT0kbmFtZQorCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5leGUpCisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRuYW1lIgorCSAgICBub2V4ZW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCisJICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQorCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmIGZ1bmNfbHR3cmFwcGVyX3AgIiRmaWxlIjsgdGhlbgorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIGZ1bmNfYXBwZW5kIHJtZmlsZXMgIiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAgIGVsc2UKKwkgICAgICByZWxpbmtfY29tbWFuZD0KKwkgICAgICBmdW5jX3NvdXJjZSAkZGlyLyRub2V4ZW5hbWUKKwkgICAgZmkKKworCSAgICAjIG5vdGUgJG5hbWUgc3RpbGwgY29udGFpbnMgLmV4ZSBpZiBpdCB3YXMgaW4gJGZpbGUgb3JpZ2luYWxseQorCSAgICAjIGFzIGRvZXMgdGhlIHZlcnNpb24gb2YgJGZpbGUgdGhhdCB3YXMgYWRkZWQgaW50byAkcm1maWxlcworCSAgICBmdW5jX2FwcGVuZCBybWZpbGVzICIgJG9kaXIvJG5hbWUgJG9kaXIvJHtuYW1lfVMuJHtvYmpleHR9IgorCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllcyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgZnVuY19hcHBlbmQgcm1maWxlcyAiICRvZGlyL2x0LSR7bm9leGVuYW1lfS5jIgorCSAgICBmaQorCSAgZmkKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJFJNICRybWZpbGVzIiAnZXhpdF9zdGF0dXM9MScKKyAgICBkb25lCisKKyAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKKyAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCisgICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICJybWRpciAkZGlyID4vZGV2L251bGwgMj4mMSIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKK30KKworeyB0ZXN0ICIkb3B0X21vZGUiID0gdW5pbnN0YWxsIHx8IHRlc3QgIiRvcHRfbW9kZSIgPSBjbGVhbjsgfSAmJgorICAgIGZ1bmNfbW9kZV91bmluc3RhbGwgJHsxKyIkQCJ9CisKK3Rlc3QgLXogIiRvcHRfbW9kZSIgJiYgeworICBoZWxwPSIkZ2VuZXJpY19oZWxwIgorICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIgorfQorCit0ZXN0IC16ICIkZXhlY19jbWQiICYmIFwKKyAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG9wdF9tb2RlJyIKKworaWYgdGVzdCAtbiAiJGV4ZWNfY21kIjsgdGhlbgorICBldmFsIGV4ZWMgIiRleGVjX2NtZCIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCitmaQorCitleGl0ICRleGl0X3N0YXR1cworCisKKyMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCisjIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZworIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKKyMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCisjIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAorIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAorIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCisjIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCisjIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5CisjIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAorYnVpbGRfbGlidG9vbF9saWJzPW5vCitidWlsZF9vbGRfbGlicz15ZXMKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKK2J1aWxkX29sZF9saWJzPWBjYXNlICRidWlsZF9saWJ0b29sX2xpYnMgaW4geWVzKSBlY2hvIG5vOzsgKikgZWNobyB5ZXM7OyBlc2FjYAorIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgorIyB2aTpzdz0yCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9jY19tYXhvcHQubTQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbTQvYXhfY2NfbWF4b3B0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTdkYTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbTQvYXhfY2NfbWF4b3B0Lm00CkBAIC0wLDAgKzEsMTc2IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jY19tYXhvcHQuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DQ19NQVhPUFQKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBUcnkgdG8gdHVybiBvbiAiZ29vZCIgQyBvcHRpbWl6YXRpb24gZmxhZ3MgZm9yIHZhcmlvdXMgY29tcGlsZXJzIGFuZAorIyAgIGFyY2hpdGVjdHVyZXMsIGZvciBzb21lIGRlZmluaXRpb24gb2YgImdvb2QiLiAoSW4gb3VyIGNhc2UsIGdvb2QgZm9yCisjICAgRkZUVyBhbmQgaG9wZWZ1bGx5IGZvciBvdGhlciBzY2llbnRpZmljIGNvZGVzLiBNb2RpZnkgYXMgbmVlZGVkLikKKyMKKyMgICBUaGUgdXNlciBjYW4gb3ZlcnJpZGUgdGhlIGZsYWdzIGJ5IHNldHRpbmcgdGhlIENGTEFHUyBlbnZpcm9ubWVudAorIyAgIHZhcmlhYmxlLiBUaGUgdXNlciBjYW4gYWxzbyBzcGVjaWZ5IC0tZW5hYmxlLXBvcnRhYmxlLWJpbmFyeSBpbiBvcmRlciB0bworIyAgIGRpc2FibGUgYW55IG9wdGltaXphdGlvbiBmbGFncyB0aGF0IG1pZ2h0IHJlc3VsdCBpbiBhIGJpbmFyeSB0aGF0IG9ubHkKKyMgICBydW5zIG9uIHRoZSBob3N0IGFyY2hpdGVjdHVyZS4KKyMKKyMgICBOb3RlIGFsc28gdGhhdCB0aGUgZmxhZ3MgYXNzdW1lIHRoYXQgQU5TSSBDIGFsaWFzaW5nIHJ1bGVzIGFyZSBmb2xsb3dlZAorIyAgIGJ5IHRoZSBjb2RlIChlLmcuIGZvciBnY2MncyAtZnN0cmljdC1hbGlhc2luZyksIGFuZCB0aGF0IGZsb2F0aW5nLXBvaW50CisjICAgY29tcHV0YXRpb25zIGNhbiBiZSByZS1vcmRlcmVkIGFzIG5lZWRlZC4KKyMKKyMgICBSZXF1aXJlcyBtYWNyb3M6IEFYX0NIRUNLX0NPTVBJTEVSX0ZMQUdTLCBBWF9DT01QSUxFUl9WRU5ET1IsCisjICAgQVhfR0NDX0FSQ0hGTEFHLCBBWF9HQ0NfWDg2X0NQVUlELgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFN0ZXZlbiBHLiBKb2huc29uIDxzdGV2ZW5qQGFsdW0ubWl0LmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggTWF0dGVvIEZyaWdvCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDExCisKK0FDX0RFRlVOKFtBWF9DQ19NQVhPUFRdLAorWworQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCitBQ19SRVFVSVJFKFtBWF9DT01QSUxFUl9WRU5ET1JdKQorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorCitBQ19BUkdfRU5BQkxFKHBvcnRhYmxlLWJpbmFyeSwgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wb3J0YWJsZS1iaW5hcnldLCBbZGlzYWJsZSBjb21waWxlciBvcHRpbWl6YXRpb25zIHRoYXQgd291bGQgcHJvZHVjZSB1bnBvcnRhYmxlIGJpbmFyaWVzXSldLAorCWFjeF9tYXhvcHRfcG9ydGFibGU9JHdpdGh2YWwsIGFjeF9tYXhvcHRfcG9ydGFibGU9bm8pCisKKyMgVHJ5IHRvIGRldGVybWluZSAiZ29vZCIgbmF0aXZlIGNvbXBpbGVyIGZsYWdzIGlmIG5vbmUgc3BlY2lmaWVkIHZpYSBDRkxBR1MKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgIT0gInNldCI7IHRoZW4KKyAgQ0ZMQUdTPSIiCisgIGNhc2UgJGF4X2N2X2NfY29tcGlsZXJfdmVuZG9yIGluCisgICAgZGVjKSBDRkxBR1M9Ii1uZXdjIC13MCAtTzUgLWFuc2lfYWxpYXMgLWFuc2lfYXJncyAtZnBfcmVvcmRlciAtdHVuZSBob3N0IgorCSBpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geG5vOyB0aGVuCisgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAtYXJjaCBob3N0IgorICAgICAgICAgZmk7OworCisgICAgc3VuKSBDRkxBR1M9Ii1uYXRpdmUgLWZhc3QgLXhPNSAtZGFsaWduIgorCSBpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geHllczsgdGhlbgorCSAgIENGTEFHUz0iJENGTEFHUyAteGFyY2g9Z2VuZXJpYyIKKyAgICAgICAgIGZpOzsKKworICAgIGhwKSAgQ0ZMQUdTPSIrT2FsbCArT3B0cnNfYW5zaSArRFNuYXRpdmUiCisJIGlmIHRlc3QgIngkYWN4X21heG9wdF9wb3J0YWJsZSIgPSB4eWVzOyB0aGVuCisJICAgQ0ZMQUdTPSIkQ0ZMQUdTICtEQXBvcnRhYmxlIgorCSBmaTs7CisKKyAgICBpYm0pIGlmIHRlc3QgIngkYWN4X21heG9wdF9wb3J0YWJsZSIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgeGxjX29wdD0iLXFhcmNoPWF1dG8gLXF0dW5lPWF1dG8iCisJIGVsc2UKKyAgICAgICAgICAgeGxjX29wdD0iLXF0dW5lPWF1dG8iCisJIGZpCisgICAgICAgICBBWF9DSEVDS19DT01QSUxFUl9GTEFHUygkeGxjX29wdCwKKwkJQ0ZMQUdTPSItTzMgLXFhbnNpYWxpYXMgLXcgJHhsY19vcHQiLAorICAgICAgICAgICAgICAgW0NGTEFHUz0iLU8zIC1xYW5zaWFsaWFzIC13IgorICAgICAgICAgICAgICAgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICBZb3Ugc2VlbSB0byBoYXZlIHRoZSBJQk0gIEMgY29tcGlsZXIuICBJdCBpcyAgICAgICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgcmVjb21tZW5kZWQgZm9yIGJlc3QgcGVyZm9ybWFuY2UgdGhhdCB5b3UgdXNlOiAgICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICAgIENGTEFHUz0tTzMgLXFhcmNoPXh4eCAtcXR1bmU9eHh4IC1xYW5zaWFsaWFzIC13ICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgICAgICAgICAgICAgICAgICAgICBeXl4gICAgICAgIF5eXiAgICAgICAgICAgICAgICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIiogIHdoZXJlIHh4eCBpcyBwd3IyLCBwd3IzLCA2MDQsIG9yIHdoYXRldmVyIGtpbmQgb2YgKiIKKyAgICAgICAgICAgICAgICBlY2hvICIqICBDUFUgeW91IGhhdmUuICAoU2V0IHRoZSBDRkxBR1MgZW52aXJvbm1lbnQgdmFyLiAgICoiCisgICAgICAgICAgICAgICAgZWNobyAiKiAgYW5kIHJlLXJ1biBjb25maWd1cmUuKSAgRm9yIG1vcmUgaW5mbywgbWFuIGNjLiAgICAqIgorICAgICAgICAgICAgICAgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiJdKQorICAgICAgICAgOzsKKworICAgIGludGVsKSBDRkxBR1M9Ii1PMyAtYW5zaV9hbGlhcyIKKwlpZiB0ZXN0ICJ4JGFjeF9tYXhvcHRfcG9ydGFibGUiID0geG5vOyB0aGVuCisJICBpY2NfYXJjaGZsYWc9dW5rbm93bgorCSAgaWNjX2ZsYWdzPSIiCisJICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBpNjg2Knx4ODZfNjQqKQorICAgICAgICAgICAgICAjIGljYyBhY2NlcHRzIGdjYyBhc3NlbWJseSBzeW50YXgsIHNvIHRoZXNlIHNob3VsZCB3b3JrOgorCSAgICAgIEFYX0dDQ19YODZfQ1BVSUQoMCkKKyAgICAgICAgICAgICAgQVhfR0NDX1g4Nl9DUFVJRCgxKQorCSAgICAgIGNhc2UgJGF4X2N2X2djY194ODZfY3B1aWRfMCBpbiAjIHNlZSBBWF9HQ0NfQVJDSEZMQUcKKyAgICAgICAgICAgICAgICAqOjc1NmU2NTQ3Oio6KikgIyBJbnRlbAorICAgICAgICAgICAgICAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8xIGluCisgICAgICAgICAgICAgICAgICAgICo2YT86KltbMjM0XV06KjoqfCo2W1s3ODliXV0/Oio6KjoqKSBpY2NfZmxhZ3M9Ii14SyI7OworICAgICAgICAgICAgICAgICAgICAqZjNbWzM0N11dOio6KjoqfCpmNFsxMzQ3XToqOio6KikgaWNjX2ZsYWdzPSIteFAgLXhOIC14VyAteEsiOzsKKyAgICAgICAgICAgICAgICAgICAgKmY/PzoqOio6KikgaWNjX2ZsYWdzPSIteE4gLXhXIC14SyI7OworICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIGlmIHRlc3QgIngkaWNjX2ZsYWdzIiAhPSB4OyB0aGVuCisgICAgICAgICAgICBmb3IgZmxhZyBpbiAkaWNjX2ZsYWdzOyBkbworICAgICAgICAgICAgICBBWF9DSEVDS19DT01QSUxFUl9GTEFHUygkZmxhZywgW2ljY19hcmNoZmxhZz0kZmxhZzsgYnJlYWtdKQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaWNjIGFyY2hpdGVjdHVyZSBmbGFnXSkKKwkgIEFDX01TR19SRVNVTFQoJGljY19hcmNoZmxhZykKKyAgICAgICAgICBpZiB0ZXN0ICJ4JGljY19hcmNoZmxhZyIgIT0geHVua25vd247IHRoZW4KKyAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkaWNjX2FyY2hmbGFnIgorICAgICAgICAgIGZpCisgICAgICAgIGZpCisJOzsKKworICAgIGdudSkKKyAgICAgIyBkZWZhdWx0IG9wdGltaXphdGlvbiBmbGFncyBmb3IgZ2NjIG9uIGFsbCBzeXN0ZW1zCisgICAgIENGTEFHUz0iLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIgorCisgICAgICMgIC1mc3RyaWN0LWFsaWFzaW5nIGZvciBnY2MtMi45NSsKKyAgICAgQVhfQ0hFQ0tfQ09NUElMRVJfRkxBR1MoLWZzdHJpY3QtYWxpYXNpbmcsCisJQ0ZMQUdTPSIkQ0ZMQUdTIC1mc3RyaWN0LWFsaWFzaW5nIikKKworICAgICBBWF9DSEVDS19DT01QSUxFUl9GTEFHUygtZmZhc3QtbWF0aCwgQ0ZMQUdTPSIkQ0ZMQUdTIC1mZmFzdC1tYXRoIikKKworICAgICBBWF9HQ0NfQVJDSEZMQUcoJGFjeF9tYXhvcHRfcG9ydGFibGUpCisgICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IC16ICIkQ0ZMQUdTIjsgdGhlbgorCWVjaG8gIiIKKwllY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKyAgICAgICAgZWNobyAiKiBXQVJOSU5HOiBEb24ndCBrbm93IHRoZSBiZXN0IENGTEFHUyBmb3IgdGhpcyBzeXN0ZW0gICoiCisgICAgICAgIGVjaG8gIiogVXNlIC4vY29uZmlndXJlIENGTEFHUz0uLi4gdG8gc3BlY2lmeSB5b3VyIG93biBmbGFncyAqIgorCWVjaG8gIiogKG90aGVyd2lzZSwgYSBkZWZhdWx0IG9mIENGTEFHUz0tTzMgd2lsbCBiZSB1c2VkKSAgICAqIgorCWVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCWVjaG8gIiIKKyAgICAgICAgQ0ZMQUdTPSItTzMiCisgIGZpCisKKyAgQVhfQ0hFQ0tfQ09NUElMRVJfRkxBR1MoJENGTEFHUywgW10sIFsKKwllY2hvICIiCisgICAgICAgIGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorICAgICAgICBlY2hvICIqIFdBUk5JTkc6IFRoZSBndWVzc2VkIENGTEFHUyBkb24ndCBzZWVtIHRvIHdvcmsgd2l0aCAgKiIKKyAgICAgICAgZWNobyAiKiB5b3VyIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoiCisgICAgICAgIGVjaG8gIiogVXNlIC4vY29uZmlndXJlIENGTEFHUz0uLi4gdG8gc3BlY2lmeSB5b3VyIG93biBmbGFncyAqIgorICAgICAgICBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKyAgICAgICAgZWNobyAiIgorICAgICAgICBDRkxBR1M9IiIKKyAgXSkKKworZmkKK10pCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbTQvYXhfY2ZsYWdzX3dhcm5fYWxsLm00IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2F4X2NmbGFnc193YXJuX2FsbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI1NTgwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2F4X2NmbGFnc193YXJuX2FsbC5tNApAQCAtMCwwICsxLDE5NSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY2ZsYWdzX3dhcm5fYWxsLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ0ZMQUdTX1dBUk5fQUxMICAgWyhzaGVsbHZhciBbLGRlZmF1bHQsIFtBL05BXV0pXQorIyAgIEFYX0NYWEZMQUdTX1dBUk5fQUxMIFsoc2hlbGx2YXIgWyxkZWZhdWx0LCBbQS9OQV1dKV0KKyMgICBBWF9GQ0ZMQUdTX1dBUk5fQUxMICBbKHNoZWxsdmFyIFssZGVmYXVsdCwgW0EvTkFdXSldCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgVHJ5IHRvIGZpbmQgYSBjb21waWxlciBvcHRpb24gdGhhdCBlbmFibGVzIG1vc3QgcmVhc29uYWJsZSB3YXJuaW5ncy4KKyMKKyMgICBGb3IgdGhlIEdOVSBjb21waWxlciBpdCB3aWxsIGJlIC1XYWxsIChhbmQgLWFuc2kgLXBlZGFudGljKSBUaGUgcmVzdWx0CisjICAgaXMgYWRkZWQgdG8gdGhlIHNoZWxsdmFyIGJlaW5nIENGTEFHUywgQ1hYRkxBR1MsIG9yIEZDRkxBR1MgYnkgZGVmYXVsdC4KKyMKKyMgICBDdXJyZW50bHkgdGhpcyBtYWNybyBrbm93cyBhYm91dCB0aGUgR0NDLCBTb2xhcmlzLCBEaWdpdGFsIFVuaXgsIEFJWCwKKyMgICBIUC1VWCwgSVJJWCwgTkVDIFNYLTUgKFN1cGVyLVVYIDEwKSwgQ3JheSBKOTAgKFVuaWNvcyAxMC4wLjAuOCksIGFuZAorIyAgIEludGVsIGNvbXBpbGVycy4gIEZvciBhIGdpdmVuIGNvbXBpbGVyLCB0aGUgRm9ydHJhbiBmbGFncyBhcmUgbXVjaCBtb3JlCisjICAgZXhwZXJpbWVudGFsIHRoYW4gdGhlaXIgQyBlcXVpdmFsZW50cy4KKyMKKyMgICAgLSAkMSBzaGVsbC12YXJpYWJsZS10by1hZGQtdG8gOiBDRkxBR1MsIENYWEZMQUdTLCBvciBGQ0ZMQUdTCisjICAgIC0gJDIgYWRkLXZhbHVlLWlmLW5vdC1mb3VuZCA6IG5vdGhpbmcKKyMgICAgLSAkMyBhY3Rpb24taWYtZm91bmQgOiBhZGQgdmFsdWUgdG8gc2hlbGx2YXJpYWJsZQorIyAgICAtICQ0IGFjdGlvbi1pZi1ub3QtZm91bmQgOiBub3RoaW5nCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggR3VpZG8gVS4gRHJhaGVpbSA8Z3VpZG9kQGdteC5kZT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTAgUmh5cyBVbGVyaWNoIDxyaHlzLnVsZXJpY2hAZ21haWwuY29tPgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwKKyMgICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgcmVzcGVjdGl2ZSBBdXRvY29uZiBNYWNybydzIGNvcHlyaWdodCBvd25lcgorIyAgIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSB0aGUgY29uZmlndXJlCisjICAgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZyB0aGUgTWFjcm8uIFlvdQorIyAgIG5lZWQgbm90IGZvbGxvdyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdoZW4gdXNpbmcKKyMgICBvciBkaXN0cmlidXRpbmcgc3VjaCBzY3JpcHRzLCBldmVuIHRob3VnaCBwb3J0aW9ucyBvZiB0aGUgdGV4dCBvZiB0aGUKKyMgICBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuCisjICAgYWxsIG90aGVyIHVzZSBvZiB0aGUgbWF0ZXJpYWwgdGhhdCBjb25zdGl0dXRlcyB0aGUgQXV0b2NvbmYgTWFjcm8uCisjCisjICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGFwcGxpZXMgdG8gdmVyc2lvbnMgb2YgdGhlIEF1dG9jb25mCisjICAgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIEFyY2hpdmUuIFdoZW4geW91IG1ha2UgYW5kIGRpc3RyaWJ1dGUgYQorIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKKyMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KKworI3NlcmlhbCAxMAorCitBQ19ERUZVTihbQVhfQ0ZMQUdTX1dBUk5fQUxMXSxbZG5sCitBU19WQVJfUFVTSERFRihbRkxBR1NdLFtDRkxBR1NdKWRubAorQVNfVkFSX1BVU0hERUYoW1ZBUl0sW2FjX2N2X2NmbGFnc193YXJuX2FsbF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbbTRfaWZ2YWwoJDEsJDEsRkxBR1MpIGZvciBtYXhpbXVtIHdhcm5pbmdzXSwKK1ZBUixbVkFSPSJubywgdW5rbm93biIKKyBBQ19MQU5HX1BVU0goW0NdKQorIGFjX3NhdmVfW11GTEFHUz0iJFtdRkxBR1MiCitmb3IgYWNfYXJnIGRubAoraW4gIi1wZWRhbnRpYyAgJSAtV2FsbCIgICAgICAgZG5sICAgR0NDCisgICAiLXhzdHJjb25zdCAlIC12IiAgICAgICAgICBkbmwgU29sYXJpcyBDCisgICAiLXN0ZDEgICAgICAlIC12ZXJib3NlIC13MCAtd2FybnByb3RvcyIgZG5sIERpZ2l0YWwgVW5peAorICAgIi1xbGFuZ2x2bD1hbnNpICUgLXFzcmNtc2cgLXFpbmZvPWFsbDpub3BwdDpub3BwYzpub29iczpub2NuZCIgZG5sIEFJWAorICAgIi1hbnNpIC1hbnNpRSAlIC1mdWxsd2FybiIgZG5sIElSSVgKKyAgICIrRVNsaXQgICAgICUgK3cxIiAgICAgICAgIGRubCBIUC1VWCBDCisgICAiLVhjICAgICAgICAlIC1wdmN0bFssXWZ1bGxtc2ciIGRubCBORUMgU1gtNSAoU3VwZXItVVggMTApCisgICAiLWggY29uZm9ybSAlIC1oIG1zZ2xldmVsIDIiIGRubCBDcmF5IEMgKFVuaWNvcykKKyAgICMKK2RvIEZMQUdTPSIkYWNfc2F2ZV9bXUZMQUdTICJgZWNobyAkYWNfYXJnIHwgc2VkIC1lICdzLCUlLiosLCcgLWUgJ3MsJSwsJ2AKKyAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU1dLAorICAgICAgICAgICAgICAgICAgICAgW1ZBUj1gZWNobyAkYWNfYXJnIHwgc2VkIC1lICdzLC4qJSAqLCwnYCA7IGJyZWFrXSkKK2RvbmUKKyBGTEFHUz0iJGFjX3NhdmVfW11GTEFHUyIKKyBBQ19MQU5HX1BPUChbQ10pCitdKQorY2FzZSAiLiRWQVIiIGluCisgICAgIC5va3wub2ssKikgbTRfaWZ2YWxuKCQzLCQzKSA7OworICAgLnwubm98Lm5vLCopIG00X2lmdmFsbigkNCwkNCxbbTRfaWZ2YWwoJDIsWworICAgICAgICBBQ19SVU5fTE9HKFs6IG00X2lmdmFsKCQxLCQxLEZMQUdTKT0iJG00X2lmdmFsKCQxLCQxLEZMQUdTKSAkMiJdKQorICAgICAgICAgICAgICAgICAgICAgIG00X2lmdmFsKCQxLCQxLEZMQUdTKT0iJG00X2lmdmFsKCQxLCQxLEZMQUdTKSAkMiJdKV0pIDs7CisgICAqKSBtNF9pZnZhbG4oJDMsJDMsWworICAgaWYgZWNobyAiICRbXW00X2lmdmFsKCQxLCQxLEZMQUdTKSAiIHwgZ3JlcCAiICRWQVIgIiAyPiYxID4vZGV2L251bGwKKyAgIHRoZW4gQUNfUlVOX0xPRyhbOiBtNF9pZnZhbCgkMSwkMSxGTEFHUykgZG9lcyBjb250YWluICRWQVJdKQorICAgZWxzZSBBQ19SVU5fTE9HKFs6IG00X2lmdmFsKCQxLCQxLEZMQUdTKT0iJG00X2lmdmFsKCQxLCQxLEZMQUdTKSAkVkFSIl0pCisgICAgICAgICAgICAgICAgICAgICAgbTRfaWZ2YWwoJDEsJDEsRkxBR1MpPSIkbTRfaWZ2YWwoJDEsJDEsRkxBR1MpICRWQVIiCisgICBmaSBdKSA7OworZXNhYworQVNfVkFSX1BPUERFRihbVkFSXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0ZMQUdTXSlkbmwKK10pCisKK2RubCB0aGUgb25seSBkaWZmZXJlbmNlIC0gdGhlIExBTkcgc2VsZWN0aW9uLi4uIGFuZCB0aGUgZGVmYXVsdCBGTEFHUworCitBQ19ERUZVTihbQVhfQ1hYRkxBR1NfV0FSTl9BTExdLFtkbmwKK0FTX1ZBUl9QVVNIREVGKFtGTEFHU10sW0NYWEZMQUdTXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtWQVJdLFtheF9jdl9jeHhmbGFnc193YXJuX2FsbF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbbTRfaWZ2YWwoJDEsJDEsRkxBR1MpIGZvciBtYXhpbXVtIHdhcm5pbmdzXSwKK1ZBUixbVkFSPSJubywgdW5rbm93biIKKyBBQ19MQU5HX1BVU0goW0MrK10pCisgYWNfc2F2ZV9bXUZMQUdTPSIkW11GTEFHUyIKK2ZvciBhY19hcmcgZG5sCitpbiAiLXBlZGFudGljICAlIC1XYWxsIiAgICAgICBkbmwgICBHQ0MKKyAgICIteHN0cmNvbnN0ICUgLXYiICAgICAgICAgIGRubCBTb2xhcmlzIEMKKyAgICItc3RkMSAgICAgICUgLXZlcmJvc2UgLXcwIC13YXJucHJvdG9zIiBkbmwgRGlnaXRhbCBVbml4CisgICAiLXFsYW5nbHZsPWFuc2kgJSAtcXNyY21zZyAtcWluZm89YWxsOm5vcHB0Om5vcHBjOm5vb2JzOm5vY25kIiBkbmwgQUlYCisgICAiLWFuc2kgLWFuc2lFICUgLWZ1bGx3YXJuIiBkbmwgSVJJWAorICAgIitFU2xpdCAgICAgJSArdzEiICAgICAgICAgZG5sIEhQLVVYIEMKKyAgICItWGMgICAgICAgICUgLXB2Y3RsWyxdZnVsbG1zZyIgZG5sIE5FQyBTWC01IChTdXBlci1VWCAxMCkKKyAgICItaCBjb25mb3JtICUgLWggbXNnbGV2ZWwgMiIgZG5sIENyYXkgQyAoVW5pY29zKQorICAgIworZG8gRkxBR1M9IiRhY19zYXZlX1tdRkxBR1MgImBlY2hvICRhY19hcmcgfCBzZWQgLWUgJ3MsJSUuKiwsJyAtZSAncywlLCwnYAorICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTV0sCisgICAgICAgICAgICAgICAgICAgICBbVkFSPWBlY2hvICRhY19hcmcgfCBzZWQgLWUgJ3MsLiolICosLCdgIDsgYnJlYWtdKQorZG9uZQorIEZMQUdTPSIkYWNfc2F2ZV9bXUZMQUdTIgorIEFDX0xBTkdfUE9QKFtDKytdKQorXSkKK2Nhc2UgIi4kVkFSIiBpbgorICAgICAub2t8Lm9rLCopIG00X2lmdmFsbigkMywkMykgOzsKKyAgIC58Lm5vfC5ubywqKSBtNF9pZnZhbG4oJDQsJDQsW200X2lmdmFsKCQyLFsKKyAgICAgICAgQUNfUlVOX0xPRyhbOiBtNF9pZnZhbCgkMSwkMSxGTEFHUyk9IiRtNF9pZnZhbCgkMSwkMSxGTEFHUykgJDIiXSkKKyAgICAgICAgICAgICAgICAgICAgICBtNF9pZnZhbCgkMSwkMSxGTEFHUyk9IiRtNF9pZnZhbCgkMSwkMSxGTEFHUykgJDIiXSldKSA7OworICAgKikgbTRfaWZ2YWxuKCQzLCQzLFsKKyAgIGlmIGVjaG8gIiAkW11tNF9pZnZhbCgkMSwkMSxGTEFHUykgIiB8IGdyZXAgIiAkVkFSICIgMj4mMSA+L2Rldi9udWxsCisgICB0aGVuIEFDX1JVTl9MT0coWzogbTRfaWZ2YWwoJDEsJDEsRkxBR1MpIGRvZXMgY29udGFpbiAkVkFSXSkKKyAgIGVsc2UgQUNfUlVOX0xPRyhbOiBtNF9pZnZhbCgkMSwkMSxGTEFHUyk9IiRtNF9pZnZhbCgkMSwkMSxGTEFHUykgJFZBUiJdKQorICAgICAgICAgICAgICAgICAgICAgIG00X2lmdmFsKCQxLCQxLEZMQUdTKT0iJG00X2lmdmFsKCQxLCQxLEZMQUdTKSAkVkFSIgorICAgZmkgXSkgOzsKK2VzYWMKK0FTX1ZBUl9QT1BERUYoW1ZBUl0pZG5sCitBU19WQVJfUE9QREVGKFtGTEFHU10pZG5sCitdKQorCitkbmwgdGhlIG9ubHkgZGlmZmVyZW5jZSAtIHRoZSBMQU5HIHNlbGVjdGlvbi4uLiBhbmQgdGhlIGRlZmF1bHQgRkxBR1MKKworQUNfREVGVU4oW0FYX0ZDRkxBR1NfV0FSTl9BTExdLFtkbmwKK0FTX1ZBUl9QVVNIREVGKFtGTEFHU10sW0ZDRkxBR1NdKWRubAorQVNfVkFSX1BVU0hERUYoW1ZBUl0sW2F4X2N2X2ZjZmxhZ3Nfd2Fybl9hbGxdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW200X2lmdmFsKCQxLCQxLEZMQUdTKSBmb3IgbWF4aW11bSB3YXJuaW5nc10sCitWQVIsW1ZBUj0ibm8sIHVua25vd24iCisgQUNfTEFOR19QVVNIKFtGb3J0cmFuXSkKKyBhY19zYXZlX1tdRkxBR1M9IiRbXUZMQUdTIgorZm9yIGFjX2FyZyBkbmwKK2luICItd2FybiBhbGwgICUgLXdhcm4gYWxsIiAgIGRubCBJbnRlbAorICAgIi1wZWRhbnRpYyAgJSAtV2FsbCIgICAgICAgZG5sIEdDQworICAgIi14c3RyY29uc3QgJSAtdiIgICAgICAgICAgZG5sIFNvbGFyaXMgQworICAgIi1zdGQxICAgICAgJSAtdmVyYm9zZSAtdzAgLXdhcm5wcm90b3MiIGRubCBEaWdpdGFsIFVuaXgKKyAgICItcWxhbmdsdmw9YW5zaSAlIC1xc3JjbXNnIC1xaW5mbz1hbGw6bm9wcHQ6bm9wcGM6bm9vYnM6bm9jbmQiIGRubCBBSVgKKyAgICItYW5zaSAtYW5zaUUgJSAtZnVsbHdhcm4iIGRubCBJUklYCisgICAiK0VTbGl0ICAgICAlICt3MSIgICAgICAgICBkbmwgSFAtVVggQworICAgIi1YYyAgICAgICAgJSAtcHZjdGxbLF1mdWxsbXNnIiBkbmwgTkVDIFNYLTUgKFN1cGVyLVVYIDEwKQorICAgIi1oIGNvbmZvcm0gJSAtaCBtc2dsZXZlbCAyIiBkbmwgQ3JheSBDIChVbmljb3MpCisgICAjCitkbyBGTEFHUz0iJGFjX3NhdmVfW11GTEFHUyAiYGVjaG8gJGFjX2FyZyB8IHNlZCAtZSAncywlJS4qLCwnIC1lICdzLCUsLCdgCisgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNXSwKKyAgICAgICAgICAgICAgICAgICAgIFtWQVI9YGVjaG8gJGFjX2FyZyB8IHNlZCAtZSAncywuKiUgKiwsJ2AgOyBicmVha10pCitkb25lCisgRkxBR1M9IiRhY19zYXZlX1tdRkxBR1MiCisgQUNfTEFOR19QT1AoW0ZvcnRyYW5dKQorXSkKK2Nhc2UgIi4kVkFSIiBpbgorICAgICAub2t8Lm9rLCopIG00X2lmdmFsbigkMywkMykgOzsKKyAgIC58Lm5vfC5ubywqKSBtNF9pZnZhbG4oJDQsJDQsW200X2lmdmFsKCQyLFsKKyAgICAgICAgQUNfUlVOX0xPRyhbOiBtNF9pZnZhbCgkMSwkMSxGTEFHUyk9IiRtNF9pZnZhbCgkMSwkMSxGTEFHUykgJDIiXSkKKyAgICAgICAgICAgICAgICAgICAgICBtNF9pZnZhbCgkMSwkMSxGTEFHUyk9IiRtNF9pZnZhbCgkMSwkMSxGTEFHUykgJDIiXSldKSA7OworICAgKikgbTRfaWZ2YWxuKCQzLCQzLFsKKyAgIGlmIGVjaG8gIiAkW11tNF9pZnZhbCgkMSwkMSxGTEFHUykgIiB8IGdyZXAgIiAkVkFSICIgMj4mMSA+L2Rldi9udWxsCisgICB0aGVuIEFDX1JVTl9MT0coWzogbTRfaWZ2YWwoJDEsJDEsRkxBR1MpIGRvZXMgY29udGFpbiAkVkFSXSkKKyAgIGVsc2UgQUNfUlVOX0xPRyhbOiBtNF9pZnZhbCgkMSwkMSxGTEFHUyk9IiRtNF9pZnZhbCgkMSwkMSxGTEFHUykgJFZBUiJdKQorICAgICAgICAgICAgICAgICAgICAgIG00X2lmdmFsKCQxLCQxLEZMQUdTKT0iJG00X2lmdmFsKCQxLCQxLEZMQUdTKSAkVkFSIgorICAgZmkgXSkgOzsKK2VzYWMKK0FTX1ZBUl9QT1BERUYoW1ZBUl0pZG5sCitBU19WQVJfUE9QREVGKFtGTEFHU10pZG5sCitdKQorCitkbmwgIGltcGxlbWVudGF0aW9uIHRhY3RpY3M6CitkbmwgICB0aGUgZm9yLWFyZ3VtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiBvcHRpb25zLiBUaGUgZmlyc3QgcGFydCBvZgorZG5sICAgdGhlc2UgZG9lcyBvbmx5IGV4aXN0IHRvIGRldGVjdCB0aGUgY29tcGlsZXIgLSB1c3VhbGx5IGl0IGlzCitkbmwgICBhIGdsb2JhbCBvcHRpb24gdG8gZW5hYmxlIC1hbnNpIG9yIC1leHRyYXdhcm5pbmdzLiBBbGwgb3RoZXIKK2RubCAgIGNvbXBpbGVycyB3aWxsIGZhaWwgYWJvdXQgaXQuIFRoYXQgd2FzIG5lZWRlZCBzaW5jZSBhIGxvdCBvZgorZG5sICAgY29tcGlsZXJzIHdpbGwgZ2l2ZSBmYWxzZSBwb3NpdGl2ZXMgZm9yIHNvbWUgb3B0aW9uLXN5bnRheAorZG5sICAgbGlrZSAtV29wdGlvbiBvciAtWG9wdGlvbiBhcyB0aGV5IHRoaW5rIG9mIGl0IGlzIGEgcGFzcy10aHJvdWdoCitkbmwgICB0byBsYXRlciBjb21waWxlIHN0YWdlcyBvciBzb21ldGhpbmcuIFRoZSAiJSIgaXMgdXNlZCBhcyBhCitkbmwgICBkZWxpbWl0ZXIuIEEgbm9uLW9wdGlvbiBjb21tZW50IGNhbiBiZSBnaXZlbiBhZnRlciAiJSUiIG1hcmtzCitkbmwgICB3aGljaCB3aWxsIGJlIHNob3duIGJ1dCBub3QgYWRkZWQgdG8gdGhlIHJlc3BlY3RpdmUgQy9DWFhGTEFHUy4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9jaGVja19jb21waWxlcl9mbGFncy5tNCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9jaGVja19jb21waWxlcl9mbGFncy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJmZDJhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2F4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzLm00CkBAIC0wLDAgKzEsNzYgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jaGVja19jb21waWxlcl9mbGFncy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NIRUNLX0NPTVBJTEVSX0ZMQUdTKEZMQUdTLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIEZMQUdTIHdvcmsgd2l0aCB0aGUgY3VycmVudCBsYW5ndWFnZSdzCisjICAgY29tcGlsZXIsIG9yIHdoZXRoZXIgdGhleSBnaXZlIGFuIGVycm9yLiAoV2FybmluZ3MsIGhvd2V2ZXIsIGFyZQorIyAgIGlnbm9yZWQuKQorIworIyAgIEFDVElPTi1TVUNDRVNTL0FDVElPTi1GQUlMVVJFIGFyZSBzaGVsbCBjb21tYW5kcyB0byBleGVjdXRlIG9uCisjICAgc3VjY2Vzcy9mYWlsdXJlLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA5IFN0ZXZlbiBHLiBKb2huc29uIDxzdGV2ZW5qQGFsdW0ubWl0LmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgTWF0dGVvIEZyaWdvCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDkKKworQUNfREVGVU4oW0FYX0NIRUNLX0NPTVBJTEVSX0ZMQUdTXSwKK1tBQ19QUkVSRVEoMi41OSkgZG5sIGZvciBfQUNfTEFOR19QUkVGSVgKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBfQUNfTEFORyBjb21waWxlciBhY2NlcHRzICQxXSkKK2RubCBTb21lIGhhY2tlcnkgaGVyZSBzaW5jZSBBQ19DQUNIRV9WQUwgY2FuJ3QgaGFuZGxlIGEgbm9uLWxpdGVyYWwgdmFybmFtZToKK0FTX0xJVEVSQUxfSUYoWyQxXSwKKyAgW0FDX0NBQ0hFX1ZBTChBU19UUl9TSChheF9jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2ZsYWdzX1skMV0pLCBbCisgICAgICBheF9zYXZlX0ZMQUdTPSRbXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKKyAgICAgIF9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9IiQxIgorICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKKyAgICAgICAgQVNfVFJfU0goYXhfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9mbGFnc19bJDFdKT15ZXMsCisgICAgICAgIEFTX1RSX1NIKGF4X2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fZmxhZ3NfWyQxXSk9bm8pCisgICAgICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSRheF9zYXZlX0ZMQUdTXSldLAorICBbYXhfc2F2ZV9GTEFHUz0kW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTCisgICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSIkMSIKKyAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCisgICAgIGV2YWwgQVNfVFJfU0goYXhfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9mbGFnc19bJDFdKT15ZXMsCisgICAgIGV2YWwgQVNfVFJfU0goYXhfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9mbGFnc19bJDFdKT1ubykKKyAgIF9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9JGF4X3NhdmVfRkxBR1NdKQorZXZhbCBheF9jaGVja19jb21waWxlcl9mbGFncz0kQVNfVFJfU0goYXhfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9mbGFnc19bJDFdKQorQUNfTVNHX1JFU1VMVCgkYXhfY2hlY2tfY29tcGlsZXJfZmxhZ3MpCitpZiB0ZXN0ICJ4JGF4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzIiA9IHh5ZXM7IHRoZW4KKwltNF9kZWZhdWx0KFskMl0sIDopCitlbHNlCisJbTRfZGVmYXVsdChbJDNdLCA6KQorZmkKK10pZG5sIEFYX0NIRUNLX0NPTVBJTEVSX0ZMQUdTCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbTQvYXhfY29tcGlsZXJfdmVuZG9yLm00IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2F4X2NvbXBpbGVyX3ZlbmRvci5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjE0NzA2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2F4X2NvbXBpbGVyX3ZlbmRvci5tNApAQCAtMCwwICsxLDYzIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jb21waWxlcl92ZW5kb3IuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DT01QSUxFUl9WRU5ET1IKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBEZXRlcm1pbmUgdGhlIHZlbmRvciBvZiB0aGUgQy9DKysgY29tcGlsZXIsIGUuZy4sIGdudSwgaW50ZWwsIGlibSwgc3VuLAorIyAgIGhwLCBib3JsYW5kLCBjb21lYXUsIGRlYywgY3JheSwga2FpLCBsY2MsIG1ldHJvd2Vya3MsIHNnaSwgbWljcm9zb2Z0LAorIyAgIHdhdGNvbSwgZXRjLiBUaGUgdmVuZG9yIGlzIHJldHVybmVkIGluIHRoZSBjYWNoZSB2YXJpYWJsZQorIyAgICRheF9jdl9jX2NvbXBpbGVyX3ZlbmRvciBmb3IgQyBhbmQgJGF4X2N2X2N4eF9jb21waWxlcl92ZW5kb3IgZm9yIEMrKy4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBTdGV2ZW4gRy4gSm9obnNvbiA8c3RldmVuakBhbHVtLm1pdC5lZHU+CisjICAgQ29weXJpZ2h0IChjKSAyMDA4IE1hdHRlbyBGcmlnbworIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwKKyMgICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgcmVzcGVjdGl2ZSBBdXRvY29uZiBNYWNybydzIGNvcHlyaWdodCBvd25lcgorIyAgIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSB0aGUgY29uZmlndXJlCisjICAgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZyB0aGUgTWFjcm8uIFlvdQorIyAgIG5lZWQgbm90IGZvbGxvdyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdoZW4gdXNpbmcKKyMgICBvciBkaXN0cmlidXRpbmcgc3VjaCBzY3JpcHRzLCBldmVuIHRob3VnaCBwb3J0aW9ucyBvZiB0aGUgdGV4dCBvZiB0aGUKKyMgICBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuCisjICAgYWxsIG90aGVyIHVzZSBvZiB0aGUgbWF0ZXJpYWwgdGhhdCBjb25zdGl0dXRlcyB0aGUgQXV0b2NvbmYgTWFjcm8uCisjCisjICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGFwcGxpZXMgdG8gdmVyc2lvbnMgb2YgdGhlIEF1dG9jb25mCisjICAgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIEFyY2hpdmUuIFdoZW4geW91IG1ha2UgYW5kIGRpc3RyaWJ1dGUgYQorIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKKyMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KKworI3NlcmlhbCA5CisKK0FDX0RFRlVOKFtBWF9DT01QSUxFUl9WRU5ET1JdLAorWworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfQUNfTEFORyBjb21waWxlciB2ZW5kb3JdLCBheF9jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2NvbXBpbGVyX3ZlbmRvciwKKyBbYXhfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9jb21waWxlcl92ZW5kb3I9dW5rbm93bgorICAjIG5vdGU6IGRvbid0IGNoZWNrIGZvciBnY2MgZmlyc3Qgc2luY2Ugc29tZSBvdGhlciBjb21waWxlcnMgZGVmaW5lIF9fR05VQ19fCisgIGZvciB2ZW50ZXN0IGluIGludGVsOl9fSUNDLF9fRUNDLF9fSU5URUxfQ09NUElMRVIgaWJtOl9feGxjX18sX194bENfXyxfX0lCTUNfXyxfX0lCTUNQUF9fIHBhdGhzY2FsZTpfX1BBVEhDQ19fLF9fUEFUSFNDQUxFX18gY2xhbmc6X19jbGFuZ19fIGdudTpfX0dOVUNfXyBzdW46X19TVU5QUk9fQyxfX1NVTlBST19DQyBocDpfX0hQX2NjLF9fSFBfYUNDIGRlYzpfX0RFQ0MsX19ERUNDWFgsX19ERUNDX1ZFUixfX0RFQ0NYWF9WRVIgYm9ybGFuZDpfX0JPUkxBTkRDX18sX19UVVJCT0NfXyBjb21lYXU6X19DT01PX18gY3JheTpfQ1JBWUMga2FpOl9fS0NDIGxjYzpfX0xDQ19fIG1ldHJvd2Vya3M6X19NV0VSS1NfXyBzZ2k6X19zZ2ksc2dpIG1pY3Jvc29mdDpfTVNDX1ZFUiB3YXRjb206X19XQVRDT01DX18gcG9ydGxhbmQ6X19QR0k7IGRvCisgICAgdmVuY3BwPSJkZWZpbmVkKCJgZWNobyAkdmVudGVzdCB8IGN1dCAtZDogLWYyIHwgc2VkICdzLywvKSB8fCBkZWZpbmVkKC9nJ2AiKSIKKyAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCxbCisjaWYgISgkdmVuY3BwKQorICAgICAgdGhpc2lzYW5lcnJvcjsKKyNlbmRpZgorXSldLCBbYXhfY3ZfXV9BQ19MQU5HX0FCQlJFVltfY29tcGlsZXJfdmVuZG9yPWBlY2hvICR2ZW50ZXN0IHwgY3V0IC1kOiAtZjFgOyBicmVha10pCisgIGRvbmUKKyBdKQorXSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9jb25maWd1cmVfYXJncy5tNCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9jb25maWd1cmVfYXJncy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI2YjFiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2F4X2NvbmZpZ3VyZV9hcmdzLm00CkBAIC0wLDAgKzEsNzAgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jb25maWd1cmVfYXJncy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NPTkZJR1VSRV9BUkdTCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgSGVscGVyIG1hY3JvIGZvciBBWF9FTkFCTEVfQlVJTERESVIuCisjCisjICAgVGhlIHRyYWRpdGlvbmFsIHdheSBvZiBzdGFydGluZyBhIHN1YmRpci1jb25maWd1cmUgaXMgcnVubmluZyB0aGUgc2NyaXB0CisjICAgd2l0aCAkezErIiRAIn0gYnV0IHNpbmNlIGF1dG9jb25mIDIuNjAgdGhpcyBpcyBicm9rZW4uIEluc3RlYWQgd2UgaGF2ZQorIyAgIHRvIHJlbHkgb24gZXZhbCdpbmcgJGFjX2NvbmZpZ3VyZV9hcmdzIGhvd2V2ZXIgc29tZSBvbGQgYXV0b2NvbmYKKyMgICB2ZXJzaW9ucyBkbyBub3QgcHJvdmlkZSB0aGF0LiBUbyBlbnN1cmUgbWF4aW11bSBwb3J0YWJpbGl0eSBvZiBhdXRvY29uZgorIyAgIGV4dGVuc2lvbiBtYWNyb3MgdGhpcyBoZWxwZXIgY2FuIGJlIEFDX1JFUVVJUkUnZCBzbyB0aGF0CisjICAgJGFjX2NvbmZpZ3VyZV9hcmdzIHdpbGwgYWxzd2F5cyBiZSBwcmVzZW50LgorIworIyAgIFNhZGx5LCB0aGUgdHJhZGl0aW9uYWwgImV4ZWMgJFNIRUxMIiBvZiB0aGUgZW5hYmxlX2J1aWxkZGlyIG1hY3JvcyBpcworIyAgIHNwb2lsZWQgbm93IGFuZCBtdXN0IGJlIHJlcGxhY2VkIGJ5ICJldmFsICsgZXhpdCAkPyIuCisjCisjICAgRXhhbXBsZToKKyMKKyMgICAgIEFDX0RFRlVOKFtBWF9FTkFCTEVfU1VCRElSXSxbZG5sCisjICAgICAgIEFDX1JFUVVJUkUoW0FYX0NPTkZJR1VSRV9BUkdTXSlkbmwKKyMgICAgICAgZXZhbCAkU0hFTEwgJGFjX2NvbmZpZ3VyZV9hcmdzIHx8IGV4aXQgJD8KKyMgICAgICAgLi4uXSkKKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBHdWlkbyBVLiBEcmFoZWltIDxndWlkb2RAZ214LmRlPgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwKKyMgICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgcmVzcGVjdGl2ZSBBdXRvY29uZiBNYWNybydzIGNvcHlyaWdodCBvd25lcgorIyAgIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSB0aGUgY29uZmlndXJlCisjICAgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZyB0aGUgTWFjcm8uIFlvdQorIyAgIG5lZWQgbm90IGZvbGxvdyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdoZW4gdXNpbmcKKyMgICBvciBkaXN0cmlidXRpbmcgc3VjaCBzY3JpcHRzLCBldmVuIHRob3VnaCBwb3J0aW9ucyBvZiB0aGUgdGV4dCBvZiB0aGUKKyMgICBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuCisjICAgYWxsIG90aGVyIHVzZSBvZiB0aGUgbWF0ZXJpYWwgdGhhdCBjb25zdGl0dXRlcyB0aGUgQXV0b2NvbmYgTWFjcm8uCisjCisjICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGFwcGxpZXMgdG8gdmVyc2lvbnMgb2YgdGhlIEF1dG9jb25mCisjICAgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIEFyY2hpdmUuIFdoZW4geW91IG1ha2UgYW5kIGRpc3RyaWJ1dGUgYQorIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKKyMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KKworI3NlcmlhbCA5CisKK0FDX0RFRlVOKFtBWF9DT05GSUdVUkVfQVJHU10sWworICAgIyBbJF1AIGlzIHVuc2FibGUgaW4gMi42MCsgYnV0IGVhcmxpZXIgYXV0b2NvbmYgaGFkIG5vIGFjX2NvbmZpZ3VyZV9hcmdzCisgICBpZiB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzK3NldH0iICE9ICJzZXQiIDsgdGhlbgorICAgICAgYWNfY29uZmlndXJlX2FyZ3M9CisgICAgICBmb3IgYWNfYXJnIGluICR7MSsiWyRdQCJ9OyBkbworICAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCisgICAgICBkb25lCisgICBmaQorXSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9lbmFibGVfYnVpbGRkaXIubTQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbTQvYXhfZW5hYmxlX2J1aWxkZGlyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWRlYzMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbTQvYXhfZW5hYmxlX2J1aWxkZGlyLm00CkBAIC0wLDAgKzEsMzAwIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9lbmFibGVfYnVpbGRkaXIuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9FTkFCTEVfQlVJTERESVIgWyhkaXJzdHJpbmctb3ItY29tbWFuZCBbLE1ha2VmaWxlLm1rIFssLWFsbF1dKV0KKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBJZiB0aGUgY3VycmVudCBjb25maWd1cmUgd2FzIHJ1biB3aXRoaW4gdGhlIHNyY2RpciB0aGVuIHdlIG1vdmUgYWxsCisjICAgY29uZmlndXJlLWZpbGVzIGludG8gYSBzdWJkaXIgYW5kIGxldCB0aGUgY29uZmlndXJlIHN0ZXBzIGNvbnRpbnVlCisjICAgdGhlcmUuIFdlIHByb3ZpZGUgYW4gb3B0aW9uIC0tZGlzYWJsZS1idWlsZGRpciB0byBzdXBwcmVzcyB0aGUgbW92ZSBpbnRvCisjICAgYSBzZXBhcmF0ZSBidWlsZGRpci4KKyMKKyMgICBEZWZhdWx0czoKKyMKKyMgICAgICQxID0gJGhvc3QgKG92ZXJyaWRkZW4gd2l0aCAkSE9TVCkKKyMgICAgICQyID0gTWFrZWZpbGUubWsKKyMgICAgICQzID0gLWFsbAorIworIyAgIFRoaXMgbWFjcm8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIEFNX0lOSVRfQVVUT01BS0UuIEl0IGNyZWF0ZXMgYSBkZWZhdWx0CisjICAgdG9wbGV2ZWwgc3JjZGlyIE1ha2VmaWxlIGZyb20gdGhlIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZSBjcmVhdGVkCisjICAgdG9wbGV2ZWwgYnVpbGRkaXIgTWFrZWZpbGUuIEl0IGp1c3QgY29waWVzIHRoZSB2YXJpYWJsZXMgYW5kCisjICAgcnVsZS10YXJnZXRzLCBlYWNoIGV4dGVuZGVkIHdpdGggYSBkZWZhdWx0IHJ1bGUtZXhlY3V0aW9uIHRoYXQgcmVjdXJzZXMKKyMgICBpbnRvIHRoZSBidWlsZCBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgIkhPU1QiLiBZb3UgY2FuIG92ZXJyaWRlIHRoZQorIyAgIGF1dG8tZGVjdGlvbiB0aHJvdWdoIGBjb25maWcuZ3Vlc3NgIGFuZCBidWlsZC10aW1lIG9mIGNvdXJzZSwgYXMgaW4KKyMKKyMgICAgIG1ha2UgSE9TVD1pMzg2LW1pbmd3LWNyb3NzCisjCisjICAgd2hpY2ggY2FuIG9mIGNvdXJzZSBzZXQgYXQgY29uZmlndXJlIHRpbWUgYXMgd2VsbCB1c2luZworIworIyAgICAgY29uZmlndXJlIC0taG9zdD1pMzg2LW1pbmd3LWNyb3NzCisjCisjICAgQWZ0ZXIgdGhlIGRlZmF1bHQgaGFzIGJlZW4gY3JlYXRlZCwgYWRkaXRpb25hbCBydWxlcyBjYW4gYmUgYXBwZW5kZWQKKyMgICB0aGF0IHdpbGwgbm90IGp1c3QgcmVjdXJzZSBpbnRvIHRoZSBzdWJkaXJlY3RvcmllcyBhbmQgb25seSBldmVyIGV4aXN0CisjICAgaW4gdGhlIHNyY2RpciB0b3BsZXZlbCBtYWtlZmlsZSAtIHRoZXNlIHBhcnRzIGFyZSByZWFkIGZyb20gdGhlICQyID0KKyMgICBNYWtlZmlsZS5tayBmaWxlCisjCisjICAgVGhlIGF1dG9tYXRpYyBydWxlcyBhcmUgdXN1YWxseSBzY2FubmluZyB0aGUgdG9wbGV2ZWwgTWFrZWZpbGUgZm9yIGxpbmVzCisjICAgbGlrZSAnIyMjIyAkaG9zdCB8JGJ1aWxkZGlyJyB0byByZWNvZ25pemUgdGhlIHBsYWNlIHdoZXJlIHRvIHJlY3Vyc2UKKyMgICBpbnRvLiBVc3VhbGx5LCB0aGUgbGFzdCBvbmUgaXMgdGhlIG9ubHkgb25lIHVzZWQuIEhvd2V2ZXIsIGFsbW9zdCBhbGwKKyMgICB0YXJnZXRzIGhhdmUgYW4gYWRkaXRpb25hbCAiKi1hbGwiIHJ1bGUgd2hpY2ggbWFrZXMgdGhlIHNjcmlwdCB0bworIyAgIHJlY3Vyc2UgaW50byBfYWxsXyB2YXJpYW50cyBvZiB0aGUgY3VycmVudCBIT1NUICghISkgc2V0dGluZy4gVGhlICItYWxsIgorIyAgIHN1ZmZpeCBjYW4gYmUgb3ZlcnJpZGVuIGZvciB0aGUgbWFjcm8gYXMgd2VsbC4KKyMKKyMgICBhIHNwZWNpYWwgcnVsZSBpcyBvbmx5IGdpdmVuIGZvciB0aGluZ3MgbGlrZSAiZGlzdCIgdGhhdCB3aWxsIGNvcHkgdGhlCisjICAgdGFyYmFsbCBmcm9tIHRoZSBidWlsZGRpciB0byB0aGUgc291cmNlZGlyIChvciAkKFBVQikpIGZvciByZWFzb24gb2YKKyMgICBjb252ZW5pZW5jZS4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOSBHdWlkbyBVLiBEcmFoZWltIDxndWlkb2RAZ214LmRlPgorIyAgIENvcHlyaWdodCAoYykgMjAwOSBBbGFuIEplbmtpbnMgPGFsYW4tamVua2luc0B0dWZmbWFpbC5jby51az4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgMjIKKworQUNfREVGVU4oW0FYX0VOQUJMRV9CVUlMRERJUl0sWworQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKVtdZG5sCitBQ19SRVFVSVJFKFtBWF9DT05GSUdVUkVfQVJHU10pW11kbmwKK0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlbXWRubAorQUNfQkVGT1JFKFskMF0sW0FNX0lOSVRfQVVUT01BS0VdKWRubAorQVNfVkFSX1BVU0hERUYoW1NVQl0sW2F4X2VuYWJsZV9idWlsZGRpcl0pZG5sCitBU19WQVJfUFVTSERFRihbQVVYXSxbYXhfZW5hYmxlX2J1aWxkZGlyX2F1eGRpcl0pZG5sCitBU19WQVJfUFVTSERFRihbU0VEXSxbYXhfZW5hYmxlX2J1aWxkZGlyX3NlZF0pZG5sCitTVUI9Ii4iCitBQ19BUkdfRU5BQkxFKFtidWlsZGRpcl0sIEFTX0hFTFBfU1RSSU5HKAorICBbLS1kaXNhYmxlLWJ1aWxkZGlyXSxbZGlzYWJsZSBhdXRvbWF0aWMgYnVpbGQgaW4gc3ViZGlyIG9mIHNvdXJjZXNdKQorICAsW1NVQj0iJGVuYWJsZXZhbCJdLCBbU1VCPSJhdXRvIl0pCitpZiB0ZXN0ICIuJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiICE9ICIubm8iIDsgdGhlbgoraWYgdGVzdCAiLiRzcmNkaXIiID0gIi4uIiA7IHRoZW4KKyAgaWYgdGVzdCAtZiBjb25maWcuc3RhdHVzIDsgdGhlbgorICAgIEFDX01TR19OT1RJQ0UodG9wbGV2ZWwgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZC4uLiBza2lwcGluZyBzdWJkaXIgYnVpbGQpCisgIGVsc2UKKyAgICB0ZXN0ICIuJFNVQiIgPSAiLiIgICYmIFNVQj0iLiIKKyAgICB0ZXN0ICIuJFNVQiIgPSAiLm5vIiAgJiYgU1VCPSIuIgorICAgIHRlc3QgIi4kVEFSR0VUIiA9ICIuIiAmJiBUQVJHRVQ9IiR0YXJnZXQiCisgICAgdGVzdCAiLiRTVUIiID0gIi5hdXRvIiAmJiBTVUI9Im00X2lmdmFsKFskMV0sIFskMV0sWyRUQVJHRVRdKSIKKyAgICBpZiB0ZXN0ICIuJFNVQiIgIT0gIi4uIiA7IHRoZW4gICAgIyB3ZSBrbm93IHdoZXJlIHRvIGdvIGFuZAorICAgICAgQVNfTUtESVJfUChbJFNVQl0pCisgICAgICBlY2hvIF9fLiRTVUIuX18gPiAkU1VCL2NvbmZ0ZXN0LnRtcAorICAgICAgY2QgJFNVQgorICAgICAgaWYgZ3JlcCBfXy4kU1VCLl9fIGNvbmZ0ZXN0LnRtcCA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDsgdGhlbgorICAgICAgICBybSBjb25mdGVzdC50bXAKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbY29udGludWUgY29uZmlndXJlIGluIGRlZmF1bHQgYnVpbGRkaXIgIi4vJFNVQiJdKQorICAgICAgZWxzZQorICAgICAgICBBQ19NU0dfRVJST1IoW2NvdWxkIG5vdCBjaGFuZ2UgdG8gZGVmYXVsdCBidWlsZGRpciAiLi8kU1VCIl0pCisgICAgICBmaQorICAgICAgc3JjZGlyPWBlY2hvICIkU1VCIiB8CisgICAgICAgICAgICAgIHNlZCAtZSAncyxeXC4vLCw7cyxbW14vXV0kLCYvLDtzLFtbXi9dXSovLC4uLyxnO3MsW1svXV0kLCw7J2AKKyAgICAgICMgZ29pbmcgdG8gcmVzdGFydCBmcm9tIHN1YmRpcmVjdG9yeSBsb2NhdGlvbgorICAgICAgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5sb2cgICAmJiBtdiAkc3JjZGlyL2NvbmZpZy5sb2cgICAuCisgICAgICB0ZXN0IC1mICRzcmNkaXIvY29uZmRlZnMuaCAgICYmIG12ICRzcmNkaXIvY29uZmRlZnMuaCAgIC4KKyAgICAgIHRlc3QgLWYgJHNyY2Rpci9jb25mdGVzdC5sb2cgJiYgbXYgJHNyY2Rpci9jb25mdGVzdC5sb2cgLgorICAgICAgdGVzdCAtZiAkc3JjZGlyLyRjYWNoZV9maWxlICAmJiBtdiAkc3JjZGlyLyRjYWNoZV9maWxlICAuCisgICAgICBBQ19NU0dfUkVTVUxUKC4uLi5leGVjICRTSEVMTCAkc3JjZGlyL1skXTAgIi0tc3JjZGlyPSRzcmNkaXIiICItLWVuYWJsZS1idWlsZGRpcj0kU1VCIiAkezErIlskXUAifSkKKyAgICAgIGNhc2UgIlskXTAiIGluICMgcmVzdGFydAorICAgICAgIFsvXFxdKikgZXZhbCAkU0hFTEwgIidbJF0wJyIgIictLXNyY2Rpcj0kc3JjZGlyJyIgIictLWVuYWJsZS1idWlsZGRpcj0kU1VCJyIgJGFjX2NvbmZpZ3VyZV9hcmdzIDs7CisgICAgICAgKikgZXZhbCAkU0hFTEwgIickc3JjZGlyL1skXTAnIiAiJy0tc3JjZGlyPSRzcmNkaXInIiAiJy0tZW5hYmxlLWJ1aWxkZGlyPSRTVUInIiAkYWNfY29uZmlndXJlX2FyZ3MgOzsKKyAgICAgIGVzYWMgOyBleGl0ICQ/CisgICAgZmkKKyAgZmkKK2ZpIGZpCit0ZXN0ICIuJFNVQiIgPSAiLmF1dG8iICYmIFNVQj0iLiIKK2RubCBhY19wYXRoX3Byb2cgdXNlcyAic2V0IGR1bW15IiB0byBvdmVycmlkZSAkQCB3aGljaCB3b3VsZCBkZWZlYXQgdGhlICJleGVjIgorQUNfUEFUSF9QUk9HKFNFRCxnc2VkIHNlZCwgc2VkKQorQVVYPSIkYW1fYXV4X2RpciIKK0FTX1ZBUl9QT1BERUYoW1NFRF0pZG5sCitBU19WQVJfUE9QREVGKFtBVVhdKWRubAorQVNfVkFSX1BPUERFRihbU1VCXSlkbmwKK0FDX0NPTkZJR19DT01NQU5EUyhbYnVpbGRpcl0sW2RubCAuLi4uLi4uLi4uLi4uLiBjb25maWcuc3RhdHVzIC4uLi4uLi4uLi4uLi4uCitBU19WQVJfUFVTSERFRihbU1VCXSxbYXhfZW5hYmxlX2J1aWxkZGlyXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtUT1BdLFt0b3Bfc3JjZGlyXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtTUkNdLFthY190b3Bfc3JjZGlyXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtBVVhdLFtheF9lbmFibGVfYnVpbGRkaXJfYXV4ZGlyXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtTRURdLFtheF9lbmFibGVfYnVpbGRkaXJfc2VkXSlkbmwKK3B1c2hkZWYoW0VORF0sW01ha2VmaWxlLm1rXSlkbmwKK3B1c2hkZWYoW19BTExdLFtpZmVsc2UoWyQzXSwsWy1hbGxdLFskM10pXSlkbmwKKyAgU1JDPSIkYXhfZW5hYmxlX2J1aWxkZGlyX3NyY2RpciIKKyAgaWYgdGVzdCAiLiRTVUIiID0gIi4uIiA7IHRoZW4KKyAgICBpZiB0ZXN0IC1mICIkVE9QL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgIEFDX01TR19OT1RJQ0UoW3NraXBwaW5nIFRPUC9NYWtlZmlsZSAtIGxlZnQgdW50b3VjaGVkXSkKKyAgICBlbHNlCisgICAgICBBQ19NU0dfTk9USUNFKFtza2lwcGluZyBUT1AvTWFrZWZpbGUgLSBub3QgY3JlYXRlZF0pCisgICAgZmkKKyAgZWxzZQorICAgIGlmIHRlc3QgLWYgIiRTUkMvTWFrZWZpbGUiIDsgdGhlbgorICAgICAgYT1gZ3JlcCAiXlZFUlNJT04gIiAiJFNSQy9NYWtlZmlsZSJgIDsgYj1gZ3JlcCAiXlZFUlNJT04gIiBNYWtlZmlsZWAKKyAgICAgIHRlc3QgIiRhIiAhPSAiJGIiICYmIHJtICIkU1JDL01ha2VmaWxlIgorICAgIGZpCisgICAgaWYgdGVzdCAtZiAiJFNSQy9NYWtlZmlsZSIgOyB0aGVuCisJZWNobyAiJFNSQy9NYWtlZmlsZSA6ICRTUkMvTWFrZWZpbGUuaW4iID4gJHRtcC9jb25mdGVtcC5taworCWVjaG8gIglbXUAgZWNobyAnUkVNT1ZFRCwsLCcgPlwkW11AIiA+PiAkdG1wL2NvbmZ0ZW1wLm1rCisgICAgICBldmFsICIke01BS0UtbWFrZX0gLWYgJHRtcC9jb25mdGVtcC5tayAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIgorICAgICAgaWYgZ3JlcCAnXlJFTU9WRUQsLCwnICIkU1JDL01ha2VmaWxlIiA+L2Rldi9udWxsCisgICAgICB0aGVuIHJtICRTUkMvTWFrZWZpbGUgOyBmaQorICAgICAgY3AgJHRtcC9jb25mdGVtcC5tayAkU1JDL21ha2VmaWxlcy5ta34gICAgICAjIyBERUJVR0dJTkcKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiAiJFNSQy9NYWtlZmlsZSIgOyB0aGVuCisgICAgICBBQ19NU0dfTk9USUNFKFtjcmVhdGUgVE9QL01ha2VmaWxlIGd1ZXNzZWQgZnJvbSBsb2NhbCBNYWtlZmlsZV0pCisgICAgICB4PSdgJyA7IGNhdCA+JHRtcC9jb25mdGVtcC5zZWQgPDxfRU9GCisvXlwkL24KK3gKKy9eXCQvYlMKK3gKKy9cXFxcXCQve0g7ZDt9Cit7SDtzLy4qLy87eDt9CitiTQorOlMKK3gKKy9cXFxcXCQve2g7ZDt9Cit7aDtzLy4qLy87eDt9Cis6TQorcy9cXChcXG5cXCkJL1xcMSAvZworL14JL2QKKy9eW1sJIF1dKltbXFwjXV0vZAorL15WUEFUSCAqPS9kCitzL15zcmNkaXIgKj0uKi9zcmNkaXIgPSAuLworcy9edG9wX3NyY2RpciAqPS4qL3RvcF9zcmNkaXIgPSAuLworL1tbOj1dXS8hZAorL15cXC4vZAorZG5sIE5vdyBoYW5kbGUgcnVsZXMgKGkuZS4gbGluZXMgY29udGFpbmluZyAiOiIgYnV0IG5vdCAiID0gIikuCisvID0gL2IKKy8gLj0gL2IKKy86LyFiCitzLzouKi86Lworcy8gLyAgL2cKK3MvIFxcKFtbYS16XV1bW2Etei1dXSpbW2EtekEtWjAtOV1dXFwpXFwoW1sgOl1dXFwpLyBcXDEgXFwxW11fQUxMXFwyL2cKK3MvXlxcKFtbYS16XV1bW2Etei1dXSpbW2EtekEtWjAtOV1dXFwpXFwoW1sgOl1dXFwpL1xcMSBcXDFbXV9BTExcXDIvCitzLyAgLyAvZworL15hbGwgYWxsW11fQUxMW1sgOl1dL2lcXAorYWxsLWNvbmZpZ3VyZWQgOiBhbGxbXV9BTEwKK2RubCBkaXN0LWFsbCBleGlzdHMuLi4gYW5kIHdvdWxkIG1ha2UgZm9yIGRpc3QtYWxsLWFsbAorcy8gW1thLXpBLVowLTktXV0qW11fQUxMIFtbYS16QS1aMC05LV1dKltdX0FMTFtdX0FMTC8vZworL1tdX0FMTFtdX0FMTC9kCithXFwKKwlAIEhPU1Q9IlwkKEhPU1QpXCIgXFxcXFxcCisJOyB0ZXN0ICIuXCRcJEhPU1QiID0gIi4iICYmIEhPU1Q9JHggc2ggJEFVWC9jb25maWcuZ3Vlc3MgJHggXFxcXFxcCisJOyBCVUlMRD0keCBncmVwICJeIyMjIyBcJFwkSE9TVCAiIE1ha2VmaWxlIHwgc2VkIC1lICdzLy4qfC8vJyAkeCBcXFxcXFwKKwk7IHVzZT0keCBiYXNlbmFtZSAiXCRcQCIgX0FMTCAkeDsgbj0keCBlY2hvIFwkXCRCVUlMRCB8IHdjIC13ICR4IFxcXFxcXAorCTsgZWNobyAiTUFLRSBcJFwkSE9TVCA6IFwkXCRuICogXCRcQCI7IGlmIHRlc3QgIlwkXCRuIiA9ICIwIiA7IHRoZW4gOiBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjLip8IiBNYWtlZmlsZSB8dGFpbCAtMXwgc2VkIC1lICdzLy4qfC8vJyAkeCA7IGZpIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRCVUlMRCIgPSAiLiIgJiYgQlVJTEQ9Ii4iIFxcXFxcXAorCTsgdGVzdCAiXCRcJHVzZSIgPSAiXCRcQCIgJiYgQlVJTEQ9JHggZWNobyAiXCRcJEJVSUxEIiB8IHRhaWwgLTEgJHggXFxcXFxcCisJOyBmb3IgaSBpbiBcJFwkQlVJTEQgOyBkbyB0ZXN0ICIuXCRcJGkiID0gIi4iICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgKGNkICJcJFwkaSIgJiYgdGVzdCAhIC1mIGNvbmZpZ3VyZSAmJiBcJChNQUtFKSBcJFwkdXNlKSB8fCBleGl0OyBkb25lCitkbmwgc3BlY2lhbCBydWxlIGFkZC1vbjogImRpc3QiIGNvcGllcyB0aGUgdGFyYmFsbCB0byAkKFBVQikuIChzb3VyY2UgdHJlZSkKKy9kaXN0W11fQUxMICo6L2FcXAorCUAgSE9TVD0iXCQoSE9TVClcIiBcXFxcXFwKKwk7IHRlc3QgIi5cJFwkSE9TVCIgPSAiLiIgJiYgSE9TVD0keCBzaCAkQVVYL2NvbmZpZy5ndWVzcyAkeCBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIFwkXCRIT1NUICIgTWFrZWZpbGUgfCBzZWQgLWUgJ3MvLip8Ly8nICR4IFxcXFxcXAorCTsgZm91bmQ9JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkZm91bmQgXCQoUEFDS0FHRSktXCQoVkVSU0lPTikudGFyLioiIFxcXFxcXAorCTsgaWYgdGVzdCAiXCRcJGZvdW5kIiA9ICIwIiA7IHRoZW4gOiBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIC4qfCIgTWFrZWZpbGUgfHRhaWwgLTF8IHNlZCAtZSAncy8uKnwvLycgJHggXFxcXFxcCisJOyBmaSA7IGZvciBpIGluIFwkXCRCVUlMRCA7IGRvIHRlc3QgIi5cJFwkaSIgPSAiLiIgJiYgY29udGludWUgXFxcXFxcCisJOyBmb3IgZiBpbiBcJFwkaS9cJChQQUNLQUdFKS1cJChWRVJTSU9OKS50YXIuKiBcXFxcXFwKKwk7IGRvIHRlc3QgLWYgIlwkXCRmIiAmJiBtdiAiXCRcJGYiIFwkKFBVQikuIDsgZG9uZSA7IGJyZWFrIDsgZG9uZQorZG5sIHNwZWNpYWwgcnVsZSBhZGQtb246ICJkaXN0LWZvbyIgY29waWVzIGFsbCB0aGUgYXJjaGl2ZXMgdG8gJChQVUIpLiAoc291cmNlIHRyZWUpCisvZGlzdC1bW2EtekEtWjAtOV1dKltdX0FMTCAqOi9hXFwKKwlAIEhPU1Q9IlwkKEhPU1QpXCIgXFxcXFxcCisJOyB0ZXN0ICIuXCRcJEhPU1QiID0gIi4iICYmIEhPU1Q9JHggc2ggLi9jb25maWcuZ3Vlc3MgJHggXFxcXFxcCisJOyBCVUlMRD0keCBncmVwICJeIyMjIyBcJFwkSE9TVCAiIE1ha2VmaWxlIHwgc2VkIC1lICdzLy4qfC8vJyAkeCBcXFxcXFwKKwk7IGZvdW5kPSR4IGVjaG8gXCRcJEJVSUxEIHwgd2MgLXcgJHggXFxcXFxcCisJOyBlY2hvICJNQUtFIFwkXCRIT1NUIDogXCRcJGZvdW5kIFwkKFBBQ0tBR0UpLVwkKFZFUlNJT04pLioiIFxcXFxcXAorCTsgaWYgdGVzdCAiXCRcJGZvdW5kIiA9ICIwIiA7IHRoZW4gOiBcXFxcXFwKKwk7IEJVSUxEPSR4IGdyZXAgIl4jIyMjIC4qfCIgTWFrZWZpbGUgfHRhaWwgLTF8IHNlZCAtZSAncy8uKnwvLycgJHggXFxcXFxcCisJOyBmaSA7IGZvciBpIGluIFwkXCRCVUlMRCA7IGRvIHRlc3QgIi5cJFwkaSIgPSAiLiIgJiYgY29udGludWUgXFxcXFxcCisJOyBmb3IgZiBpbiBcJFwkaS9cJChQQUNLQUdFKS1cJChWRVJTSU9OKS4qIFxcXFxcXAorCTsgZG8gdGVzdCAtZiAiXCRcJGYiICYmIG12ICJcJFwkZiIgXCQoUFVCKS4gOyBkb25lIDsgYnJlYWsgOyBkb25lCitkbmwgc3BlY2lhbCBydWxlIGFkZC1vbjogImRpc3RjbGVhbiIgcmVtb3ZlcyBhbGwgbG9jYWwgYnVpbGRkaXJzIGNvbXBsZXRlbHkKKy9kaXN0Y2xlYW5bXV9BTEwgKjovYVxcCisJQCBIT1NUPSJcJChIT1NUKVwiIFxcXFxcXAorCTsgdGVzdCAiLlwkXCRIT1NUIiA9ICIuIiAmJiBIT1NUPSR4IHNoICRBVVgvY29uZmlnLmd1ZXNzICR4IFxcXFxcXAorCTsgQlVJTEQ9JHggZ3JlcCAiXiMjIyMgLip8IiBNYWtlZmlsZSB8IHNlZCAtZSAncy8uKnwvLycgJHggXFxcXFxcCisJOyB1c2U9JHggYmFzZW5hbWUgIlwkXEAiIF9BTEwgJHg7IG49JHggZWNobyBcJFwkQlVJTEQgfCB3YyAtdyAkeCBcXFxcXFwKKwk7IGVjaG8gIk1BS0UgXCRcJEhPU1QgOiBcJFwkbiAqIFwkXEAgKGFsbCBsb2NhbCBidWlsZHMpIiBcXFxcXFwKKwk7IHRlc3QgIi5cJFwkQlVJTEQiID0gIi4iICYmIEJVSUxEPSIuIiBcXFxcXFwKKwk7IGZvciBpIGluIFwkXCRCVUlMRCA7IGRvIHRlc3QgIi5cJFwkaSIgPSAiLiIgJiYgY29udGludWUgXFxcXFxcCisJOyBlY2hvICIjIHJtIC1yIFwkXCRpIjsgZG9uZSA7IGVjaG8gIiMgKHNsZWVwIDMpIiA7IHNsZWVwIDMgXFxcXFxcCisJOyBmb3IgaSBpbiBcJFwkQlVJTEQgOyBkbyB0ZXN0ICIuXCRcJGkiID0gIi4iICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgZWNobyAiXCRcJGkiIHwgZ3JlcCAiXi8iID4gL2Rldi9udWxsICYmIGNvbnRpbnVlIFxcXFxcXAorCTsgZWNobyAiXCRcJGkiIHwgZ3JlcCAiXi4uLyIgPiAvZGV2L251bGwgJiYgY29udGludWUgXFxcXFxcCisJOyBlY2hvICJybSAtciBcJFwkaSI7IChybSAtciAiXCRcJGkiKSA7IGRvbmUgOyBybSBNYWtlZmlsZQorX0VPRgorICAgICAgY3AgIiR0bXAvY29uZnRlbXAuc2VkIiAiJFNSQy9tYWtlZmlsZS5zZWR+IiAgICAgICAgICAgICMjIERFQlVHR0lORworICAgICAgJFNFRCAtZiAkdG1wL2NvbmZ0ZW1wLnNlZCBNYWtlZmlsZSA+JFNSQy9NYWtlZmlsZQorICAgICAgaWYgdGVzdCAtZiAiJFNSQy9tNF9pZnZhbChbJDJdLFskMl0sW0VORF0pIiA7IHRoZW4KKyAgICAgICAgQUNfTVNHX05PVElDRShbZXh0ZW5kIFRPUC9NYWtlZmlsZSB3aXRoIFRPUC9tNF9pZnZhbChbJDJdLFskMl0sW0VORF0pXSkKKyAgICAgICAgY2F0ICRTUkMvRU5EID4+JFNSQy9NYWtlZmlsZQorICAgICAgZmkgOyB4eHh4PSIjIyMjIgorICAgICAgZWNobyAiJHh4eHggQ09ORklHVVJBVElPTlMgRk9SIFRPUExFVkVMIE1BS0VGSUxFOiAiID4+JFNSQy9NYWtlZmlsZQorICAgICAgIyBzYW5pdHkgY2hlY2sKKyAgICAgIGlmIGdyZXAgJ147IGVjaG8gIk1BS0UgJyAkU1JDL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuCisgICAgICAgIEFDX01TR19OT1RJQ0UoW2J1Z2d5IHNlZCBmb3VuZCAtIGl0IGRlbGV0ZXMgdGFiIGluICJhIiB0ZXh0IHBhcnRzXSkKKyAgICAgICAgJFNFRCAtZSAnL15AIEhPU1Q9L3MvXi8JLycgLWUgJy9eOyAvcy9eLwkvJyAkU1JDL01ha2VmaWxlIFwKKyAgICAgICAgICA+JFNSQy9NYWtlZmlsZX4KKyAgICAgICAgKHRlc3QgLXMgJFNSQy9NYWtlZmlsZX4gJiYgbXYgJFNSQy9NYWtlZmlsZX4gJFNSQy9NYWtlZmlsZSkgMj4vZGV2L251bGwKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgeHh4eD0iXFwjXFwjXFwjXFwjIgorICAgICAgIyBlY2hvICIvXiR4eHh4ICokYXhfZW5hYmxlX2J1aWxkZGlyX2hvc3QgL2QiID4kdG1wL2NvbmZ0ZW1wLnNlZAorICAgICAgZWNobyAicyFeJHh4eHggW1tefF1dKiB8ICokU1VCICpcJCEkeHh4eCAuLi4uLi4gJFNVQiEiID4kdG1wL2NvbmZ0ZW1wLnNlZAorICAgICAgJFNFRCAtZiAiJHRtcC9jb25mdGVtcC5zZWQiICIkU1JDL01ha2VmaWxlIiA+JHRtcC9ta2ZpbGUudG1wCisgICAgICAgIGNwICIkdG1wL2NvbmZ0ZW1wLnNlZCIgIiRTUkMvbWFrZWZpbGVzLnNlZH4iICAgICAgICAgIyMgREVCVUdHSU5HCisgICAgICAgIGNwICIkdG1wL21rZmlsZS50bXAiICAgIiRTUkMvbWFrZWZpbGVzLm91dH4iICAgICAgICAgIyMgREVCVUdHSU5HCisgICAgICBpZiBjbXAgLXMgIiRTUkMvTWFrZWZpbGUiICIkdG1wL21rZmlsZS50bXAiIDI+L2Rldi9udWxsIDsgdGhlbgorICAgICAgICBBQ19NU0dfTk9USUNFKFtrZWVwaW5nIFRPUC9NYWtlZmlsZSBmcm9tIGVhcmxpZXIgY29uZmlndXJlXSkKKyAgICAgICAgcm0gIiR0bXAvbWtmaWxlLnRtcCIKKyAgICAgIGVsc2UKKyAgICAgICAgQUNfTVNHX05PVElDRShbcmV1c2luZyBUT1AvTWFrZWZpbGUgZnJvbSBlYXJsaWVyIGNvbmZpZ3VyZV0pCisgICAgICAgIG12ICIkdG1wL21rZmlsZS50bXAiICIkU1JDL01ha2VmaWxlIgorICAgICAgZmkKKyAgICBmaQorICAgIEFDX01TR19OT1RJQ0UoW2J1aWxkIGluICRTVUIgKEhPU1Q9JGF4X2VuYWJsZV9idWlsZGRpcl9ob3N0KV0pCisgICAgeHh4eD0iIyMjIyIKKyAgICBlY2hvICIkeHh4eCIgIiRheF9lbmFibGVfYnVpbGRkaXJfaG9zdCIgInwkU1VCIiA+PiRTUkMvTWFrZWZpbGUKKyAgZmkKK3BvcGRlZihbRU5EXSlkbmwKK0FTX1ZBUl9QT1BERUYoW1NFRF0pZG5sCitBU19WQVJfUE9QREVGKFtBVVhdKWRubAorQVNfVkFSX1BPUERFRihbU1JDXSlkbmwKK0FTX1ZBUl9QT1BERUYoW1RPUF0pZG5sCitBU19WQVJfUE9QREVGKFtTVUJdKWRubAorXSxbZG5sCitheF9lbmFibGVfYnVpbGRkaXJfc3JjZGlyPSIkc3JjZGlyIiAgICAgICAgICAgICAgICAgICAgIyAkc3JjZGlyCitheF9lbmFibGVfYnVpbGRkaXJfaG9zdD0iJEhPU1QiICAgICAgICAgICAgICAgICAgICAgICAgIyAkSE9TVCAvICRob3N0CitheF9lbmFibGVfYnVpbGRkaXJfdmVyc2lvbj0iJFZFUlNJT04iICAgICAgICAgICAgICAgICAgIyAkVkVSU0lPTgorYXhfZW5hYmxlX2J1aWxkZGlyX3BhY2thZ2U9IiRQQUNLQUdFIiAgICAgICAgICAgICAgICAgICMgJFBBQ0tBR0UKK2F4X2VuYWJsZV9idWlsZGRpcl9hdXhkaXI9IiRheF9lbmFibGVfYnVpbGRkaXJfYXV4ZGlyIiAjICRBVVgKK2F4X2VuYWJsZV9idWlsZGRpcl9zZWQ9IiRheF9lbmFibGVfYnVpbGRkaXJfc2VkIiAgICAgICAjICRTRUQKK2F4X2VuYWJsZV9idWlsZGRpcj0iJGF4X2VuYWJsZV9idWlsZGRpciIgICAgICAgICAgICAgICAjICRTVUIKK10pZG5sCitdKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2F4X2djY19hcmNoZmxhZy5tNCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9nY2NfYXJjaGZsYWcubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3YTkxMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9nY2NfYXJjaGZsYWcubTQKQEAgLTAsMCArMSwyMTUgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfZ2NjX2FyY2hmbGFnLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfR0NDX0FSQ0hGTEFHKFtQT1JUQUJMRT9dLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIworIyBERVNDUklQVElPTgorIworIyAgIFRoaXMgbWFjcm8gdHJpZXMgdG8gZ3Vlc3MgdGhlICJuYXRpdmUiIGFyY2ggY29ycmVzcG9uZGluZyB0byB0aGUgdGFyZ2V0CisjICAgYXJjaGl0ZWN0dXJlIGZvciB1c2Ugd2l0aCBnY2MncyAtbWFyY2g9YXJjaCBvciAtbXR1bmU9YXJjaCBmbGFncy4gSWYKKyMgICBmb3VuZCwgdGhlIGNhY2hlIHZhcmlhYmxlICRheF9jdl9nY2NfYXJjaGZsYWcgaXMgc2V0IHRvIHRoaXMgZmxhZyBhbmQKKyMgICBBQ1RJT04tU1VDQ0VTUyBpcyBleGVjdXRlZDsgb3RoZXJ3aXNlICRheF9jdl9nY2NfYXJjaGZsYWcgaXMgaXMgc2V0IHRvCisjICAgInVua25vd24iIGFuZCBBQ1RJT04tRkFJTFVSRSBpcyBleGVjdXRlZC4gVGhlIGRlZmF1bHQgQUNUSU9OLVNVQ0NFU1MgaXMKKyMgICB0byBhZGQgJGF4X2N2X2djY19hcmNoZmxhZyB0byB0aGUgZW5kIG9mICRDRkxBR1MuCisjCisjICAgUE9SVEFCTEU/IHNob3VsZCBiZSBlaXRoZXIgW3llc10gKGRlZmF1bHQpIG9yIFtub10uIEluIHRoZSBmb3JtZXIgY2FzZSwKKyMgICB0aGUgZmxhZyBpcyBzZXQgdG8gLW10dW5lIChvciBlcXVpdmFsZW50KSBzbyB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgaXMKKyMgICBvbmx5IHVzZWQgZm9yIHR1bmluZywgYnV0IHRoZSBpbnN0cnVjdGlvbiBzZXQgdXNlZCBpcyBzdGlsbCBwb3J0YWJsZS4gSW4KKyMgICB0aGUgbGF0dGVyIGNhc2UsIHRoZSBmbGFnIGlzIHNldCB0byAtbWFyY2ggKG9yIGVxdWl2YWxlbnQpIHNvIHRoYXQKKyMgICBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGFyZSBlbmFibGVkLgorIworIyAgIFRoZSB1c2VyIGNhbiBzcGVjaWZ5IC0td2l0aC1nY2MtYXJjaD08YXJjaD4gaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlCisjICAgbWFjcm8ncyBjaG9pY2Ugb2YgYXJjaGl0ZWN0dXJlLCBvciAtLXdpdGhvdXQtZ2NjLWFyY2ggdG8gZGlzYWJsZSB0aGlzLgorIworIyAgIFdoZW4gY3Jvc3MtY29tcGlsaW5nLCBvciBpZiAkQ0MgaXMgbm90IGdjYywgdGhlbiBBQ1RJT04tRkFJTFVSRSBpcworIyAgIGNhbGxlZCB1bmxlc3MgdGhlIHVzZXIgc3BlY2lmaWVkIC0td2l0aC1nY2MtYXJjaCBtYW51YWxseS4KKyMKKyMgICBSZXF1aXJlcyBtYWNyb3M6IEFYX0NIRUNLX0NPTVBJTEVSX0ZMQUdTLCBBWF9HQ0NfWDg2X0NQVUlECisjCisjICAgKFRoZSBtYWluIGVtcGhhc2lzIGhlcmUgaXMgb24gcmVjZW50IENQVXMsIG9uIHRoZSBwcmluY2lwbGUgdGhhdCBkb2luZworIyAgIGhpZ2gtcGVyZm9ybWFuY2UgY29tcHV0aW5nIG9uIG9sZCBoYXJkd2FyZSBpcyB1bmNvbW1vbi4pCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAwOCBNYXR0ZW8gRnJpZ28KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgOAorCitBQ19ERUZVTihbQVhfR0NDX0FSQ0hGTEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKKworQUNfQVJHX1dJVEgoZ2NjLWFyY2gsIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWdjYy1hcmNoPTxhcmNoPl0sIFt1c2UgYXJjaGl0ZWN0dXJlIDxhcmNoPiBmb3IgZ2NjIC1tYXJjaC8tbXR1bmUsIGluc3RlYWQgb2YgZ3Vlc3NpbmddKV0sCisJYXhfZ2NjX2FyY2g9JHdpdGh2YWwsIGF4X2djY19hcmNoPXllcykKKworQUNfTVNHX0NIRUNLSU5HKFtmb3IgZ2NjIGFyY2hpdGVjdHVyZSBmbGFnXSkKK0FDX01TR19SRVNVTFQoW10pCitBQ19DQUNIRV9WQUwoYXhfY3ZfZ2NjX2FyY2hmbGFnLAorWworYXhfY3ZfZ2NjX2FyY2hmbGFnPSJ1bmtub3duIgorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCitpZiB0ZXN0ICJ4JGF4X2djY19hcmNoIiA9IHh5ZXM7IHRoZW4KK2F4X2djY19hcmNoPSIiCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG5vOyB0aGVuCitjYXNlICRob3N0X2NwdSBpbgorICBpW1szNDU2XV04Nip8eDg2XzY0KikgIyB1c2UgY3B1aWQgY29kZXMsIGluIHBhcnQgZnJvbSB4ODZpbmZvLTEuNyBieSBELiBKb25lcworICAgICBBWF9HQ0NfWDg2X0NQVUlEKDApCisgICAgIEFYX0dDQ19YODZfQ1BVSUQoMSkKKyAgICAgY2FzZSAkYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8wIGluCisgICAgICAgKjo3NTZlNjU0NzoqOiopICMgSW50ZWwKKyAgICAgICAgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzEgaW4KKwkgICAgKjVbWzQ4XV0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bS1tbXggcGVudGl1bSIgOzsKKwkgICAgKjU/PzoqOio6KikgYXhfZ2NjX2FyY2g9cGVudGl1bSA7OworCSAgICAqNltbMzQ1Nl1dPzoqOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW0yIHBlbnRpdW1wcm8iIDs7CisJICAgICo2YT86KltbMDFdXToqOiopIGF4X2djY19hcmNoPSJwZW50aXVtMiBwZW50aXVtcHJvIiA7OworCSAgICAqNmE/OipbWzIzNF1dOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW0zIHBlbnRpdW1wcm8iIDs7CisJICAgICo2W1s5ZF1dPzoqOio6KikgYXhfZ2NjX2FyY2g9InBlbnRpdW0tbSBwZW50aXVtMyBwZW50aXVtcHJvIiA7OworCSAgICAqNltbNzhiXV0/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTMgcGVudGl1bXBybyIgOzsKKwkgICAgKjY/PzoqOio6KikgYXhfZ2NjX2FyY2g9cGVudGl1bXBybyA7OworICAgICAgICAgICAgKmYzW1szNDddXToqOio6KnwqZjRbMTM0N106KjoqOiopCisJCWNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgICAgICAgICB4ODZfNjQqKSBheF9nY2NfYXJjaD0ibm9jb25hIHBlbnRpdW00IHBlbnRpdW1wcm8iIDs7CisgICAgICAgICAgICAgICAgICAqKSBheF9nY2NfYXJjaD0icHJlc2NvdHQgcGVudGl1bTQgcGVudGl1bXBybyIgOzsKKyAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAqZj8/Oio6KjoqKSBheF9nY2NfYXJjaD0icGVudGl1bTQgcGVudGl1bXBybyI7OworICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAqOjY4NzQ3NTQxOio6KikgIyBBTUQKKyAgICAgICAgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzEgaW4KKwkgICAgKjVbWzY3XV0/Oio6KjoqKSBheF9nY2NfYXJjaD1rNiA7OworCSAgICAqNVtbOGRdXT86KjoqOiopIGF4X2djY19hcmNoPSJrNi0yIGs2IiA7OworCSAgICAqNVtbOV1dPzoqOio6KikgYXhfZ2NjX2FyY2g9Ims2LTMgazYiIDs7CisJICAgICo2MD86KjoqOiopIGF4X2djY19hcmNoPWs3IDs7CisJICAgICo2W1sxMl1dPzoqOio6KikgYXhfZ2NjX2FyY2g9ImF0aGxvbiBrNyIgOzsKKwkgICAgKjZbWzM0XV0/Oio6KjoqKSBheF9nY2NfYXJjaD0iYXRobG9uLXRiaXJkIGs3IiA7OworCSAgICAqNjc/Oio6KjoqKSBheF9nY2NfYXJjaD0iYXRobG9uLTQgYXRobG9uIGs3IiA7OworCSAgICAqNltbNjhhXV0/Oio6KjoqKQorCSAgICAgICBBWF9HQ0NfWDg2X0NQVUlEKDB4ODAwMDAwMDYpICMgTDIgY2FjaGUgc2l6ZQorCSAgICAgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzB4ODAwMDAwMDYgaW4KKyAgICAgICAgICAgICAgICAgKjoqOipbWzEtOWEtZl1dPz8/Pz8/OiopICMgKEwyID0gZWN4ID4+IDE2KSA+PSAyNTYKKwkJCWF4X2djY19hcmNoPSJhdGhsb24teHAgYXRobG9uLTQgYXRobG9uIGs3IiA7OworICAgICAgICAgICAgICAgICAqKSBheF9nY2NfYXJjaD0iYXRobG9uLTQgYXRobG9uIGs3IiA7OworCSAgICAgICBlc2FjIDs7CisJICAgICpmW1s0Y2VmOGJdXT86KjoqOiopIGF4X2djY19hcmNoPSJhdGhsb242NCBrOCIgOzsKKwkgICAgKmY1PzoqOio6KikgYXhfZ2NjX2FyY2g9Im9wdGVyb24gazgiIDs7CisJICAgICpmNz86KjoqOiopIGF4X2djY19hcmNoPSJhdGhsb24tZnggb3B0ZXJvbiBrOCIgOzsKKwkgICAgKmY/PzoqOio6KikgYXhfZ2NjX2FyY2g9Ims4IiA7OworICAgICAgICAgIGVzYWMgOzsKKwkqOjc0NmU2NTQzOio6KikgIyBJRFQKKwkgICBjYXNlICRheF9jdl9nY2NfeDg2X2NwdWlkXzEgaW4KKwkgICAgICo1ND86KjoqOiopIGF4X2djY19hcmNoPXdpbmNoaXAtYzYgOzsKKwkgICAgICo1OD86KjoqOiopIGF4X2djY19hcmNoPXdpbmNoaXAyIDs7CisJICAgICAqNltbNzhdXT86KjoqOiopIGF4X2djY19hcmNoPWMzIDs7CisJICAgICAqNjk/Oio6KjoqKSBheF9nY2NfYXJjaD0iYzMtMiBjMyIgOzsKKwkgICBlc2FjIDs7CisgICAgIGVzYWMKKyAgICAgaWYgdGVzdCB4IiRheF9nY2NfYXJjaCIgPSB4OyB0aGVuICMgZmFsbGJhY2sKKwljYXNlICRob3N0X2NwdSBpbgorCSAgaTU4NiopIGF4X2djY19hcmNoPXBlbnRpdW0gOzsKKwkgIGk2ODYqKSBheF9nY2NfYXJjaD1wZW50aXVtcHJvIDs7CisgICAgICAgIGVzYWMKKyAgICAgZmkKKyAgICAgOzsKKworICBzcGFyYyopCisgICAgIEFDX1BBVEhfUFJPRyhbUFJURElBR10sIFtwcnRkaWFnXSwgW3BydGRpYWddLCBbJFBBVEg6L3Vzci9wbGF0Zm9ybS9gdW5hbWUgLWlgL3NiaW4vOi91c3IvcGxhdGZvcm0vYHVuYW1lIC1tYC9zYmluL10pCisgICAgIGNwdXR5cGU9YCgoKGdyZXAgY3B1IC9wcm9jL2NwdWluZm8gfCBjdXQgLWQ6IC1mMikgOyAoJFBSVERJQUcgLXYgfGdyZXAgLWkgc3BhcmMpIDsgZ3JlcCAtaSBjcHUgL3Zhci9ydW4vZG1lc2cuYm9vdCApIHwgaGVhZCAtbiAxKSAyPiAvZGV2L251bGxgCisgICAgIGNwdXR5cGU9YGVjaG8gIiRjcHV0eXBlIiB8IHRyIC1kICcgLScgfHRyICRhc19jcl9MRVRURVJTICRhc19jcl9sZXR0ZXJzYAorICAgICBjYXNlICRjcHV0eXBlIGluCisgICAgICAgICAqdWx0cmFzcGFyY2l2KikgYXhfZ2NjX2FyY2g9InVsdHJhc3BhcmM0IHVsdHJhc3BhcmMzIHVsdHJhc3BhcmMgdjkiIDs7CisgICAgICAgICAqdWx0cmFzcGFyY2lpaSopIGF4X2djY19hcmNoPSJ1bHRyYXNwYXJjMyB1bHRyYXNwYXJjIHY5IiA7OworICAgICAgICAgKnVsdHJhc3BhcmMqKSBheF9nY2NfYXJjaD0idWx0cmFzcGFyYyB2OSIgOzsKKyAgICAgICAgICpzdXBlcnNwYXJjKnwqdG1zMzkwejVbWzA1XV0qKSBheF9nY2NfYXJjaD0ic3VwZXJzcGFyYyB2OCIgOzsKKyAgICAgICAgICpoeXBlcnNwYXJjKnwqcnQ2MltbMDU2XV0qKSBheF9nY2NfYXJjaD0iaHlwZXJzcGFyYyB2OCIgOzsKKyAgICAgICAgICpjeXByZXNzKikgYXhfZ2NjX2FyY2g9Y3lwcmVzcyA7OworICAgICBlc2FjIDs7CisKKyAgYWxwaGFldjUpIGF4X2djY19hcmNoPWV2NSA7OworICBhbHBoYWV2NTYpIGF4X2djY19hcmNoPWV2NTYgOzsKKyAgYWxwaGFwY2E1NikgYXhfZ2NjX2FyY2g9InBjYTU2IGV2NTYiIDs7CisgIGFscGhhcGNhNTcpIGF4X2djY19hcmNoPSJwY2E1NyBwY2E1NiBldjU2IiA7OworICBhbHBoYWV2NikgYXhfZ2NjX2FyY2g9ZXY2IDs7CisgIGFscGhhZXY2NykgYXhfZ2NjX2FyY2g9ZXY2NyA7OworICBhbHBoYWV2NjgpIGF4X2djY19hcmNoPSJldjY4IGV2NjciIDs7CisgIGFscGhhZXY2OSkgYXhfZ2NjX2FyY2g9ImV2NjkgZXY2OCBldjY3IiA7OworICBhbHBoYWV2NykgYXhfZ2NjX2FyY2g9ImV2NyBldjY5IGV2NjggZXY2NyIgOzsKKyAgYWxwaGFldjc5KSBheF9nY2NfYXJjaD0iZXY3OSBldjcgZXY2OSBldjY4IGV2NjciIDs7CisKKyAgcG93ZXJwYyopCisgICAgIGNwdXR5cGU9YCgoZ3JlcCBjcHUgL3Byb2MvY3B1aW5mbyB8IGhlYWQgLW4gMSB8IGN1dCAtZDogLWYyIHwgY3V0IC1kLCAtZjEgfCBzZWQgJ3MvIC8vZycpIDsgL3Vzci9iaW4vbWFjaGluZSA7IC9iaW4vbWFjaGluZTsgZ3JlcCBDUFUgL3Zhci9ydW4vZG1lc2cuYm9vdCB8IGhlYWQgLW4gMSB8IGN1dCAtZCIgIiAtZjIpIDI+IC9kZXYvbnVsbGAKKyAgICAgY3B1dHlwZT1gZWNobyAkY3B1dHlwZSB8IHNlZCAtZSAncy9wcGMvL2c7cy8gKi8vZydgCisgICAgIGNhc2UgJGNwdXR5cGUgaW4KKyAgICAgICAqNzUwKikgYXhfZ2NjX2FyY2g9Ijc1MCBHMyIgOzsKKyAgICAgICAqNzQwW1swLTldXSopIGF4X2djY19hcmNoPSIkY3B1dHlwZSA3NDAwIEc0IiA7OworICAgICAgICo3NFtbNC01XV1bWzAtOV1dKikgYXhfZ2NjX2FyY2g9IiRjcHV0eXBlIDc0NTAgRzQiIDs7CisgICAgICAgKjc0W1swLTldXVtbMC05XV0qKSBheF9nY2NfYXJjaD0iJGNwdXR5cGUgRzQiIDs7CisgICAgICAgKjk3MCopIGF4X2djY19hcmNoPSI5NzAgRzUgcG93ZXI0Ijs7CisgICAgICAgKlBPV0VSNCp8KnBvd2VyNCp8KmdxKikgYXhfZ2NjX2FyY2g9InBvd2VyNCA5NzAiOzsKKyAgICAgICAqUE9XRVI1KnwqcG93ZXI1KnwqZ3IqfCpncyopIGF4X2djY19hcmNoPSJwb3dlcjUgcG93ZXI0IDk3MCI7OworICAgICAgIDYwM2V2fDgyNDApIGF4X2djY19hcmNoPSIkY3B1dHlwZSA2MDNlIDYwMyI7OworICAgICAgICopIGF4X2djY19hcmNoPSRjcHV0eXBlIDs7CisgICAgIGVzYWMKKyAgICAgYXhfZ2NjX2FyY2g9IiRheF9nY2NfYXJjaCBwb3dlcnBjIgorICAgICA7OworZXNhYworZmkgIyBub3QgY3Jvc3MtY29tcGlsaW5nCitmaSAjIGd1ZXNzIGFyY2gKKworaWYgdGVzdCAieCRheF9nY2NfYXJjaCIgIT0geCAtYSAieCRheF9nY2NfYXJjaCIgIT0geG5vOyB0aGVuCitmb3IgYXJjaCBpbiAkYXhfZ2NjX2FyY2g7IGRvCisgIGlmIHRlc3QgInhbXW00X2RlZmF1bHQoWyQxXSx5ZXMpIiA9IHh5ZXM7IHRoZW4gIyBpZiB3ZSByZXF1aXJlIHBvcnRhYmxlIGNvZGUKKyAgICBmbGFncz0iLW10dW5lPSRhcmNoIgorICAgICMgLW1jcHU9JGFyY2ggYW5kIG0kYXJjaCBnZW5lcmF0ZSBub25wb3J0YWJsZSBjb2RlIG9uIGV2ZXJ5IGFyY2ggZXhjZXB0CisgICAgIyB4ODYuICBBbmQgc29tZSBvdGhlciBhcmNoZXMgKGUuZy4gQWxwaGEpIGRvbid0IGFjY2VwdCAtbXR1bmUuICBHcnJyLgorICAgIGNhc2UgJGhvc3RfY3B1IGluIGkqODZ8eDg2XzY0KikgZmxhZ3M9IiRmbGFncyAtbWNwdT0kYXJjaCAtbSRhcmNoIjs7IGVzYWMKKyAgZWxzZQorICAgIGZsYWdzPSItbWFyY2g9JGFyY2ggLW1jcHU9JGFyY2ggLW0kYXJjaCIKKyAgZmkKKyAgZm9yIGZsYWcgaW4gJGZsYWdzOyBkbworICAgIEFYX0NIRUNLX0NPTVBJTEVSX0ZMQUdTKCRmbGFnLCBbYXhfY3ZfZ2NjX2FyY2hmbGFnPSRmbGFnOyBicmVha10pCisgIGRvbmUKKyAgdGVzdCAieCRheF9jdl9nY2NfYXJjaGZsYWciID0geHVua25vd24gfHwgYnJlYWsKK2RvbmUKK2ZpCisKK2ZpICMgJEdDQz15ZXMKK10pCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnY2MgYXJjaGl0ZWN0dXJlIGZsYWddKQorQUNfTVNHX1JFU1VMVCgkYXhfY3ZfZ2NjX2FyY2hmbGFnKQoraWYgdGVzdCAieCRheF9jdl9nY2NfYXJjaGZsYWciID0geHVua25vd247IHRoZW4KKyAgbTRfZGVmYXVsdChbJDNdLDopCitlbHNlCisgIG00X2RlZmF1bHQoWyQyXSwgW0NGTEFHUz0iJENGTEFHUyAkYXhfY3ZfZ2NjX2FyY2hmbGFnIl0pCitmaQorXSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9nY2NfeDg2X2NwdWlkLm00IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2F4X2djY194ODZfY3B1aWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0NmZlZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9heF9nY2NfeDg2X2NwdWlkLm00CkBAIC0wLDAgKzEsNzkgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9nY2NfeDg2X2NwdWlkLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfR0NDX1g4Nl9DUFVJRChPUCkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBPbiBQZW50aXVtIGFuZCBsYXRlciB4ODYgcHJvY2Vzc29ycywgd2l0aCBnY2Mgb3IgYSBjb21waWxlciB0aGF0IGhhcyBhCisjICAgY29tcGF0aWJsZSBzeW50YXggZm9yIGlubGluZSBhc3NlbWJseSBpbnN0cnVjdGlvbnMsIHJ1biBhIHNtYWxsIHByb2dyYW0KKyMgICB0aGF0IGV4ZWN1dGVzIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiB3aXRoIGlucHV0IE9QLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisjICAgZGV0ZWN0IHRoZSBDUFUgdHlwZS4KKyMKKyMgICBPbiBvdXRwdXQsIHRoZSB2YWx1ZXMgb2YgdGhlIGVheCwgZWJ4LCBlY3gsIGFuZCBlZHggcmVnaXN0ZXJzIGFyZSBzdG9yZWQKKyMgICBhcyBoZXhhZGVjaW1hbCBzdHJpbmdzIGFzICJlYXg6ZWJ4OmVjeDplZHgiIGluIHRoZSBjYWNoZSB2YXJpYWJsZQorIyAgIGF4X2N2X2djY194ODZfY3B1aWRfT1AuCisjCisjICAgSWYgdGhlIGNwdWlkIGluc3RydWN0aW9uIGZhaWxzIChiZWNhdXNlIHlvdSBhcmUgcnVubmluZyBhCisjICAgY3Jvc3MtY29tcGlsZXIsIG9yIGJlY2F1c2UgeW91IGFyZSBub3QgdXNpbmcgZ2NjLCBvciBiZWNhdXNlIHlvdSBhcmUgb24KKyMgICBhIHByb2Nlc3NvciB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGlzIGluc3RydWN0aW9uKSwgYXhfY3ZfZ2NjX3g4Nl9jcHVpZF9PUAorIyAgIGlzIHNldCB0byB0aGUgc3RyaW5nICJ1bmtub3duIi4KKyMKKyMgICBUaGlzIG1hY3JvIG1haW5seSBleGlzdHMgdG8gYmUgdXNlZCBpbiBBWF9HQ0NfQVJDSEZMQUcuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggU3RldmVuIEcuIEpvaG5zb24gPHN0ZXZlbmpAYWx1bS5taXQuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAwOCBNYXR0ZW8gRnJpZ28KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgNworCitBQ19ERUZVTihbQVhfR0NDX1g4Nl9DUFVJRF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCitBQ19MQU5HX1BVU0goW0NdKQorQUNfQ0FDSEVfQ0hFQ0soZm9yIHg4NiBjcHVpZCAkMSBvdXRwdXQsIGF4X2N2X2djY194ODZfY3B1aWRfJDEsCisgW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHN0ZGlvLmg+XSwgWworICAgICBpbnQgb3AgPSAkMSwgZWF4LCBlYngsIGVjeCwgZWR4OworICAgICBGSUxFICpmOworICAgICAgX19hc21fXygiY3B1aWQiCisgICAgICAgIDogIj1hIiAoZWF4KSwgIj1iIiAoZWJ4KSwgIj1jIiAoZWN4KSwgIj1kIiAoZWR4KQorICAgICAgICA6ICJhIiAob3ApKTsKKyAgICAgZiA9IGZvcGVuKCJjb25mdGVzdF9jcHVpZCIsICJ3Iik7IGlmICghZikgcmV0dXJuIDE7CisgICAgIGZwcmludGYoZiwgIiV4OiV4OiV4OiV4XG4iLCBlYXgsIGVieCwgZWN4LCBlZHgpOworICAgICBmY2xvc2UoZik7CisgICAgIHJldHVybiAwOworXSldLAorICAgICBbYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8kMT1gY2F0IGNvbmZ0ZXN0X2NwdWlkYDsgcm0gLWYgY29uZnRlc3RfY3B1aWRdLAorICAgICBbYXhfY3ZfZ2NjX3g4Nl9jcHVpZF8kMT11bmtub3duOyBybSAtZiBjb25mdGVzdF9jcHVpZF0sCisgICAgIFtheF9jdl9nY2NfeDg2X2NwdWlkXyQxPXVua25vd25dKV0pCitBQ19MQU5HX1BPUChbQ10pCitdKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2xpYnRvb2wubTQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbTQvbGlidG9vbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODEyNTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2xpYnRvb2wubTQKQEAgLTAsMCArMSw3ODMxIEBACisjIGxpYnRvb2wubTQgLSBDb25maWd1cmUgbGlidG9vbCBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAtKi1BdXRvY29uZi0qLQorIworIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyAgICAgICAgICAgICAgICAgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCittNF9kZWZpbmUoW19MVF9DT1BZSU5HXSwgW2RubAorIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyAgICAgICAgICAgICAgICAgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKKyMKKyMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbC4KKyMKKyMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwgb3IKKyMgb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KK10pCisKKyMgc2VyaWFsIDU3IExUX0lOSVQKKworCisjIExUX1BSRVJFUShWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGxhaW4gYW5kIGV4aXQgaWYgdGhpcyBsaWJ0b29sIHZlcnNpb24gaXMgbGVzcyB0aGF0IFZFUlNJT04uCittNF9kZWZ1bihbTFRfUFJFUkVRXSwKK1ttNF9pZihtNF92ZXJzaW9uX2NvbXBhcmUobTRfZGVmbihbTFRfUEFDS0FHRV9WRVJTSU9OXSksIFskMV0pLCAtMSwKKyAgICAgICBbbTRfZGVmYXVsdChbJDNdLAorCQkgICBbbTRfZmF0YWwoW0xpYnRvb2wgdmVyc2lvbiAkMSBvciBoaWdoZXIgaXMgcmVxdWlyZWRdLAorCQkgICAgICAgICAgICAgNjMpXSldLAorICAgICAgIFskMl0pXSkKKworCisjIF9MVF9DSEVDS19CVUlMRERJUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGxhaW4gaWYgdGhlIGFic29sdXRlIGJ1aWxkIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycworbTRfZGVmdW4oW19MVF9DSEVDS19CVUlMRERJUl0sCitbY2FzZSBgcHdkYCBpbgorICAqXCAqIHwgKlwJKikKKyAgICBBQ19NU0dfV0FSTihbTGlidG9vbCBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCB3aGl0ZXNwYWNlIGluIGBwd2RgXSkgOzsKK2VzYWMKK10pCisKKworIyBMVF9JTklUKFtPUFRJT05TXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfSU5JVF0sCitbQUNfUFJFUkVRKFsyLjU4XSlkbmwgV2UgdXNlIEFDX0lOQ0xVREVTX0RFRkFVTFQKK0FDX1JFUVVJUkUoW0FDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRdKWRubAorQUNfQkVGT1JFKFskMF0sIFtMVF9MQU5HXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRETF9JTklUXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19CVUlMRERJUl0pZG5sCisKK2RubCBBdXRvY29uZiBkb2Vzbid0IGNhdGNoIHVuZXhwYW5kZWQgTFRfIG1hY3JvcyBieSBkZWZhdWx0OgorbTRfcGF0dGVybl9mb3JiaWQoW15fP0xUX1tBLVpfXSskXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW14oX0xUX0VPRnxMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XfExUX01VTFRJX01PRFVMRSkkXSlkbmwKK2RubCBhY2xvY2FsIGRvZXNuJ3QgcHVsbCBsdG9wdGlvbnMubTQsIGx0c3VnYXIubTQsIG9yIGx0dmVyc2lvbi5tNAorZG5sIHVubGVzcyB3ZSByZXF1aXJlIGFuIEFDX0RFRlVOZWQgbWFjcm86CitBQ19SRVFVSVJFKFtMVE9QVElPTlNfVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtMVFNVR0FSX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRWRVJTSU9OX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRPQlNPTEVURV9WRVJTSU9OXSlkbmwKK200X3JlcXVpcmUoW19MVF9QUk9HX0xUTUFJTl0pZG5sCisKK19MVF9TSEVMTF9JTklUKFtTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofV0pCisKK2RubCBQYXJzZSBPUFRJT05TCitfTFRfU0VUX09QVElPTlMoWyQwXSwgWyQxXSkKKworIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAorTElCVE9PTF9ERVBTPSIkbHRtYWluIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCitBQ19TVUJTVChMSUJUT09MKWRubAorCitfTFRfU0VUVVAKKworIyBPbmx5IGV4cGFuZCBvbmNlOgorbTRfZGVmaW5lKFtMVF9JTklUXSkKK10pIyBMVF9JTklUCisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FDX1BST0dfTElCVE9PTF0sIFtMVF9JTklUXSkKK0FVX0FMSUFTKFtBTV9QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX0xJQlRPT0xdLCBbXSkKKworCisjIF9MVF9DQ19CQVNFTkFNRShDQykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxjdWxhdGUgY2NfYmFzZW5hbWUuICBTa2lwIGtub3duIGNvbXBpbGVyIHdyYXBwZXJzIGFuZCBjcm9zcy1wcmVmaXguCittNF9kZWZ1bihbX0xUX0NDX0JBU0VOQU1FXSwKK1tmb3IgY2NfdGVtcCBpbiAkMSIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbW1xcL11dY29tcGlsZSB8IGNjYWNoZSB8ICpbW1xcL11dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1tcXC9dXWRpc3RjYyB8IHB1cmlmeSB8ICpbW1xcL11dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIiRjY190ZW1wIiB8ICRTRUQgInMlLiovJSU7IHMlXiRob3N0X2FsaWFzLSUlImAKK10pCisKKworIyBfTFRfRklMRVVUSUxTX0RFRkFVTFRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSXQgaXMgb2theSB0byB1c2UgdGhlc2UgZmlsZSBjb21tYW5kcyBhbmQgYXNzdW1lIHRoZXkgaGF2ZSBiZWVuIHNldAorIyBzZW5zaWJseSBhZnRlciBgbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pJy4KK200X2RlZnVuKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSwKK1s6ICR7Q1A9ImNwIC1mIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9CitdKSMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUworCisKKyMgX0xUX1NFVFVQCisjIC0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9TRVRVUF0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK0FDX1JFUVVJUkUoW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSlkbmwKK0FDX1JFUVVJUkUoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSlkbmwKKworX0xUX0RFQ0woW10sIFtob3N0X2FsaWFzXSwgWzBdLCBbVGhlIGhvc3Qgc3lzdGVtXSlkbmwKK19MVF9ERUNMKFtdLCBbaG9zdF0sIFswXSlkbmwKK19MVF9ERUNMKFtdLCBbaG9zdF9vc10sIFswXSlkbmwKK2RubAorX0xUX0RFQ0woW10sIFtidWlsZF9hbGlhc10sIFswXSwgW1RoZSBidWlsZCBzeXN0ZW1dKWRubAorX0xUX0RFQ0woW10sIFtidWlsZF0sIFswXSlkbmwKK19MVF9ERUNMKFtdLCBbYnVpbGRfb3NdLCBbMF0pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKK2RubAorQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKK19MVF9ERUNMKFtdLCBbTE5fU10sIFsxXSwgW1doZXRoZXIgd2UgbmVlZCBzb2Z0IG9yIGhhcmQgbGlua3NdKWRubAorZG5sCitBQ19SRVFVSVJFKFtMVF9DTURfTUFYX0xFTl0pZG5sCitfTFRfREVDTChbb2JqZXh0XSwgW2FjX29iamV4dF0sIFswXSwgW09iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKV0pZG5sCitfTFRfREVDTChbXSwgW2V4ZWV4dF0sIFswXSwgW0V4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKV0pZG5sCitkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTXSlkbmwKK200X3JlcXVpcmUoW19MVF9QQVRIX0NPTlZFUlNJT05fRlVOQ1RJT05TXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfUkVMT0FEXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19NQUdJQ19NRVRIT0RdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUJdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9PTERfQVJDSElWRV0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSlkbmwKK200X3JlcXVpcmUoW19MVF9XSVRIX1NZU1JPT1RdKWRubAorCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbCisjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyCisjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcyBJTklULgoraWYgdGVzdCAtbiAiXCR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKK10pCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCisKK19MVF9DSEVDS19PQkpESVIKKworbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisgICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KKyAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIEdsb2JhbCB2YXJpYWJsZXM6CitvZmlsZT1saWJ0b29sCitjYW5fYnVpbGRfc2hhcmVkPXllcworCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTVNWQywKKyMgd2hpY2ggbmVlZHMgJy5saWInKS4KK2xpYmV4dD1hCisKK3dpdGhfZ251X2xkPSIkbHRfY3ZfcHJvZ19nbnVfbGQiCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRDQyIgJiYgQ0M9Y2MKK3Rlc3QgLXogIiRMVENDIiAmJiBMVENDPSRDQwordGVzdCAteiAiJExUQ0ZMQUdTIiAmJiBMVENGTEFHUz0kQ0ZMQUdTCit0ZXN0IC16ICIkTEQiICYmIExEPWxkCit0ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bworCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAordGVzdCAteiAiJE1BR0lDX0NNRCIgJiYgTUFHSUNfQ01EPWZpbGUKK2Nhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCitmaWxlX21hZ2ljKikKKyAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgorICAgIF9MVF9QQVRIX01BR0lDCisgIGZpCisgIDs7Citlc2FjCisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0CitMVF9TVVBQT1JURURfVEFHKFtDQ10pCitfTFRfTEFOR19DX0NPTkZJRworX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKK19MVF9DT05GSUdfQ09NTUFORFMKK10pIyBfTFRfU0VUVVAKKworCisjIF9MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBhIGZldyBzZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscCB1cyBkbyByb2J1c3QgcXVvdGluZy4KK200X2RlZnVuKFtfTFRfUFJFUEFSRV9TRURfUVVPVEVfVkFSU10sCitbIyBCYWNrc2xhc2hpZnkgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbgorIyBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbWyJgJFxcXV1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1siYFxcXV1cKS9cXFwxL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCisjIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCitkZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2luZ2xlIHF1b3RlLgorZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0PSdzLydcJycvJ1wnXFxcXFxcXCdcJycvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCitub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKK10pCisKKyMgX0xUX1BST0dfTFRNQUlOCisjIC0tLS0tLS0tLS0tLS0tLQorIyBOb3RlIHRoYXQgdGhpcyBjb2RlIGlzIGNhbGxlZCBib3RoIGZyb20gYGNvbmZpZ3VyZScsIGFuZCBgY29uZmlnLnN0YXR1cycKKyMgbm93IHRoYXQgd2UgdXNlIEFDX0NPTkZJR19DT01NQU5EUyB0byBnZW5lcmF0ZSBsaWJ0b29sLiAgTm90YWJseSwKKyMgYGNvbmZpZy5zdGF0dXMnIGhhcyBubyB2YWx1ZSBmb3IgYWNfYXV4X2RpciB1bmxlc3Mgd2UgYXJlIHVzaW5nIEF1dG9tYWtlLAorIyBzbyB3ZSBwYXNzIGEgY29weSBhbG9uZyB0byBtYWtlIHN1cmUgaXQgaGFzIGEgc2Vuc2libGUgdmFsdWUgYW55d2F5LgorbTRfZGVmdW4oW19MVF9QUk9HX0xUTUFJTl0sCitbbTRfaWZkZWYoW0FDX1JFUVVJUkVfQVVYX0ZJTEVdLCBbQUNfUkVRVUlSRV9BVVhfRklMRShbbHRtYWluLnNoXSldKWRubAorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW2FjX2F1eF9kaXI9JyRhY19hdXhfZGlyJ10pCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKK10pIyBfTFRfUFJPR19MVE1BSU4KKworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBBY2N1bXVsYXRlIGNvZGUgZm9yIGNyZWF0aW5nIGxpYnRvb2wuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgU28gdGhhdCB3ZSBjYW4gcmVjcmVhdGUgYSBmdWxsIGxpYnRvb2wgc2NyaXB0IGluY2x1ZGluZyBhZGRpdGlvbmFsCisjIHRhZ3MsIHdlIGFjY3VtdWxhdGUgdGhlIGNodW5rcyBvZiBjb2RlIHRvIHNlbmQgdG8gQUNfQ09ORklHX0NPTU1BTkRTCisjIGluIG1hY3JvcyBhbmQgdGhlbiBtYWtlIGEgc2luZ2xlIGNhbGwgYXQgdGhlIGVuZCB1c2luZyB0aGUgYGxpYnRvb2wnCisjIGxhYmVsLgorCisKKyMgX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW0lOSVQtQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlZ2lzdGVyIElOSVQtQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KK200X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MX0lOSVRdLAorW200X2lmdmFsKFskMV0sCisgICAgICAgICAgW200X2FwcGVuZChbX0xUX09VVFBVVF9MSUJUT09MX0lOSVRdLAorICAgICAgICAgICAgICAgICAgICAgWyQxCitdKV0pXSkKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0pCisKKworIyBfTFRfQ09ORklHX0xJQlRPT0woW0NPTU1BTkRTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlZ2lzdGVyIENPTU1BTkRTIHRvIGJlIHBhc3NlZCB0byBBQ19DT05GSUdfQ09NTUFORFMgbGF0ZXIuCittNF9kZWZpbmUoW19MVF9DT05GSUdfTElCVE9PTF0sCitbbTRfaWZ2YWwoWyQxXSwKKyAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdLAorICAgICAgICAgICAgICAgICAgICAgWyQxCitdKV0pXSkKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdKQorCisKKyMgX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTKFtDT01NQU5EU10sIFtJTklUX0NPTU1BTkRTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09ORklHX1NBVkVfQ09NTUFORFNdLAorW19MVF9DT05GSUdfTElCVE9PTChbJDFdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoWyQyXSkKK10pCisKKworIyBfTFRfRk9STUFUX0NPTU1FTlQoW0NPTU1FTlRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgbGVhZGluZyBjb21tZW50IG1hcmtzIHRvIHRoZSBzdGFydCBvZiBlYWNoIGxpbmUsIGFuZCBhIHRyYWlsaW5nCisjIGZ1bGwtc3RvcCB0byB0aGUgd2hvbGUgY29tbWVudCBpZiBvbmUgaXMgbm90IHByZXNlbnQgYWxyZWFkeS4KK200X2RlZmluZShbX0xUX0ZPUk1BVF9DT01NRU5UXSwKK1ttNF9pZnZhbChbJDFdLCBbCittNF9icGF0c3Vic3QoW200X2JwYXRzdWJzdChbJDFdLCBbXiAqXSwgWyMgXSldLAorICAgICAgICAgICAgICBbWydgJFxdXSwgW1xcXCZdKV1tNF9ibWF0Y2goWyQxXSwgW1shPy5dJF0sIFtdLCBbLl0pCispXSkKKworCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgRklYTUU6IEVsaW1pbmF0ZSBWQVJOQU1FICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworCisjIF9MVF9ERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0sIFtJUy1UQUdHRUQ/XSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDT05GSUdOQU1FIGlzIHRoZSBuYW1lIGdpdmVuIHRvIHRoZSB2YWx1ZSBpbiB0aGUgbGlidG9vbCBzY3JpcHQuCisjIFZBUk5BTUUgaXMgdGhlIChiYXNlKSBuYW1lIHVzZWQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCisjIFZBTFVFIG1heSBiZSAwLCAxIG9yIDIgZm9yIGEgY29tcHV0ZWQgcXVvdGUgZXNjYXBlZCB2YWx1ZSBiYXNlZCBvbgorIyBWQVJOQU1FLiAgQW55IG90aGVyIHZhbHVlIHdpbGwgYmUgdXNlZCBkaXJlY3RseS4KK200X2RlZmluZShbX0xUX0RFQ0xdLAorW2x0X2lmX2FwcGVuZF91bmlxKFtsdF9kZWNsX3Zhcm5hbWVzXSwgWyQyXSwgWywgXSwKKyAgICBbbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbbGlidG9vbF9uYW1lXSwKKwlbbTRfaWZ2YWwoWyQxXSwgWyQxXSwgWyQyXSldKQorICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW3ZhbHVlXSwgWyQzXSkKKyAgICBtNF9pZnZhbChbJDRdLAorCVtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtkZXNjcmlwdGlvbl0sIFskNF0pXSkKKyAgICBsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sCisJW3RhZ2dlZD9dLCBbbTRfaWZ2YWwoWyQ1XSwgW3llc10sIFtub10pXSldKQorXSkKKworCisjIF9MVF9UQUdERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9UQUdERUNMXSwgW19MVF9ERUNMKFskMV0sIFskMl0sIFskM10sIFskNF0sIFt5ZXNdKV0pCisKKworIyBsdF9kZWNsX3RhZ192YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfdGFnX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3RhZ2dlZD9dLCBbeWVzXSwgJEApXSkKKworCisjIF9sdF9kZWNsX2ZpbHRlcihTVUJLRVksIFZBTFVFLCBbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX2x0X2RlY2xfZmlsdGVyXSwKK1ttNF9jYXNlKFskI10sCisgIFswXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjXSldLAorICBbMV0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkIzogJDFdKV0sCisgIFsyXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbXSwgbHRfZGVjbF92YXJuYW1lcyldLAorICBbM10sIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgWyQxXSwgWyQyXSwgWyQzXSwgbHRfZGVjbF92YXJuYW1lcyldLAorICBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sICRAKV0pW11kbmwKK10pCisKKworIyBsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzFdLCAkQCldKQorCisKKyMgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX2RxdW90ZV92YXJuYW1lc10sCitbX2x0X2RlY2xfZmlsdGVyKFt2YWx1ZV0sIFsyXSwgJEApXSkKKworCisjIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAorW200X2Fzc2VydChbJCMgPD0gMl0pZG5sCitfJDAobTRfcXVvdGUobTRfZGVmYXVsdChbJDFdLCBbWywgXV0pKSwKKyAgICBtNF9pZnZhbChbJDJdLCBbWyQyXV0sIFttNF9kcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpXSksCisgICAgbTRfc3BsaXQobTRfbm9ybWFsaXplKG00X3F1b3RlKF9MVF9UQUdTKSksIFsgXSkpXSkKK200X2RlZmluZShbX2x0X2RlY2xfdmFybmFtZXNfdGFnZ2VkXSwKK1ttNF9pZnZhbChbJDNdLCBbbHRfY29tYmluZShbJDFdLCBbJDJdLCBbX10sICQzKV0pXSkKKworCisjIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF9hbGxfdmFybmFtZXNdLAorW18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAorICAgICBtNF9pZihbJDJdLCBbXSwKKwkgICBtNF9xdW90ZShsdF9kZWNsX3Zhcm5hbWVzKSwKKwltNF9xdW90ZShtNF9zaGlmdCgkQCkpKSlbXWRubAorXSkKK200X2RlZmluZShbX2x0X2RlY2xfYWxsX3Zhcm5hbWVzXSwKK1tsdF9qb2luKCRALCBsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZChbJDFdLAorCQkJbHRfZGVjbF90YWdfdmFybmFtZXMoW1ssIF1dLCBtNF9zaGlmdCgkQCkpKSlkbmwKK10pCisKKworIyBfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKFtWQVJOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFF1b3RlIGEgdmFyaWFibGUgdmFsdWUsIGFuZCBmb3J3YXJkIGl0IHRvIGBjb25maWcuc3RhdHVzJyBzbyB0aGF0IGl0cworIyBkZWNsYXJhdGlvbiB0aGVyZSB3aWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgaW4gYGNvbmZpZ3VyZScuICBWQVJOQU1FCisjIG11c3QgaGF2ZSBhIHNpbmdsZSBxdW90ZSBkZWxpbWl0ZWQgdmFsdWUgZm9yIHRoaXMgdG8gd29yay4KK200X2RlZmluZShbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRV0sCitbJDE9J2AkRUNITyAiJF1bJDEiIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJ10pCisKKworIyBfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdlIGRlbGltaXQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzIHdpdGggc2luZ2xlIHF1b3Rlcywgc28gd2hlbgorIyB3ZSB3cml0ZSB0aGVtIHRvIGNvbmZpZy5zdGF0dXMsIHdlIGhhdmUgdG8gYmUgc3VyZSB0byBxdW90ZSBhbGwKKyMgZW1iZWRkZWQgc2luZ2xlIHF1b3RlcyBwcm9wZXJseS4gIEluIGNvbmZpZ3VyZSwgdGhpcyBtYWNybyBleHBhbmRzCisjIGVhY2ggdmFyaWFibGUgZGVjbGFyZWQgd2l0aCBfTFRfREVDTCAoYW5kIF9MVF9UQUdERUNMKSBpbnRvOgorIworIyAgICA8dmFyPj0nYCRFQ0hPICIkPHZhcj4iIHwgJFNFRCAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbTRfZGVmdW4oW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sIG00X3F1b3RlKGx0X2RlY2xfYWxsX3Zhcm5hbWVzKSwKKyAgICBbbTRfbihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRShfbHRfdmFyKV0pXSldKQorCisKKyMgX0xUX0xJQlRPT0xfVEFHUworIyAtLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCBjb21tZW50IGFuZCBsaXN0IG9mIHRhZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBzY3JpcHQKK200X2RlZnVuKFtfTFRfTElCVE9PTF9UQUdTXSwKK1tfTFRfRk9STUFUX0NPTU1FTlQoW1RoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdF0pZG5sCithdmFpbGFibGVfdGFncz0iX0xUX1RBR1MiZG5sCitdKQorCisKKyMgX0xUX0xJQlRPT0xfREVDTEFSRShWQVJOQU1FLCBbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXh0cmFjdCB0aGUgZGljdGlvbmFyeSB2YWx1ZXMgZm9yIFZBUk5BTUUgKG9wdGlvbmFsbHkgd2l0aCBUQUcpIGFuZAorIyBleHBhbmQgdG8gYSBjb21tZW50ZWQgc2hlbGwgdmFyaWFibGUgc2V0dGluZzoKKyMKKyMgICAgIyBTb21lIGNvbW1lbnQgYWJvdXQgd2hhdCBWQVIgaXMgZm9yLgorIyAgICB2aXNpYmxlX25hbWU9JGx0X2ludGVybmFsX25hbWUKK200X2RlZmluZShbX0xUX0xJQlRPT0xfREVDTEFSRV0sCitbX0xUX0ZPUk1BVF9DT01NRU5UKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sCisJCQkJCSAgIFtkZXNjcmlwdGlvbl0pKSlbXWRubAorbTRfcHVzaGRlZihbX2xpYnRvb2xfbmFtZV0sCisgICAgbTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW2xpYnRvb2xfbmFtZV0pKSlbXWRubAorbTRfY2FzZShtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKSksCisgICAgWzBdLCBbX2xpYnRvb2xfbmFtZT1bJF0kMV0sCisgICAgWzFdLCBbX2xpYnRvb2xfbmFtZT0kbHRfW10kMV0sCisgICAgWzJdLCBbX2xpYnRvb2xfbmFtZT0kbHRfW10kMV0sCisgICAgW19saWJ0b29sX25hbWU9bHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW3ZhbHVlXSldKVtdZG5sCittNF9pZnZhbChbJDJdLCBbXyQyXSlbXW00X3BvcGRlZihbX2xpYnRvb2xfbmFtZV0pW11kbmwKK10pCisKKworIyBfTFRfTElCVE9PTF9DT05GSUdfVkFSUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIGNvbW1lbnRlZCBkZWNsYXJhdGlvbnMgb2Ygbm9uLXRhZ2dlZCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMKKyMgc3VpdGFibGUgZm9yIGluc2VydGlvbiBpbiB0aGUgTElCVE9PTCBDT05GSUcgc2VjdGlvbiBvZiB0aGUgYGxpYnRvb2wnCisjIHNjcmlwdC4gIFRhZ2dlZCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgKGV2ZW4gZm9yIHRoZSBMSUJUT09MIENPTkZJRworIyBzZWN0aW9uKSBhcmUgcHJvZHVjZWQgYnkgX0xUX0xJQlRPT0xfVEFHX1ZBUlMuCittNF9kZWZ1bihbX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlNdLAorW200X2ZvcmVhY2goW19sdF92YXJdLAorICAgIG00X3F1b3RlKF9sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFtub10sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKSksCisgICAgW200X24oW19MVF9MSUJUT09MX0RFQ0xBUkUoX2x0X3ZhcildKV0pXSkKKworCisjIF9MVF9MSUJUT09MX1RBR19WQVJTKFRBRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9UQUdfVkFSU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sIG00X3F1b3RlKGx0X2RlY2xfdGFnX3Zhcm5hbWVzKSwKKyAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyLCBbJDFdKV0pXSldKQorCisKKyMgX0xUX1RBR1ZBUihWQVJOQU1FLCBbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfVEFHVkFSXSwgW200X2lmdmFsKFskMl0sIFskMV8kMl0sIFskMV0pXSkKKworCisjIF9MVF9DT05GSUdfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZW5kIGFjY3VtdWxhdGVkIG91dHB1dCB0byAkQ09ORklHX1NUQVRVUy4gIFRoYW5rcyB0byB0aGUgbGlzdHMgb2YKKyMgdmFyaWFibGVzIGZvciBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZSBlc2NhcGluZyB3ZSBzYXZlZCBmcm9tIGNhbGxzCisjIHRvIF9MVF9ERUNMLCB3ZSBjYW4gcHV0IHF1b3RlIGVzY2FwZWQgdmFyaWFibGVzIGRlY2xhcmF0aW9ucworIyBpbnRvIGBjb25maWcuc3RhdHVzJywgYW5kIHRoZW4gdGhlIHNoZWxsIGNvZGUgdG8gcXVvdGUgZXNjYXBlIHRoZW0gaW4KKyMgZm9yIGxvb3BzIGluIGBjb25maWcuc3RhdHVzJy4gIEZpbmFsbHksIGFueSBhZGRpdGlvbmFsIGNvZGUgYWNjdW11bGF0ZWQKKyMgZnJvbSBjYWxscyB0byBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVCBpcyBleHBhbmRlZC4KK200X2RlZnVuKFtfTFRfQ09ORklHX0NPTU1BTkRTXSwKK1tBQ19QUk9WSURFX0lGRUxTRShbTFRfT1VUUFVUXSwKKwlkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGhhcyBiZWVuIHBsYWNlZCBpbiAkQ09ORklHX0xULAorCWRubCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0IGFsbCBvdmVyIGFnYWluIGludG8gY29uZmlnLnN0YXR1cywKKwlkbmwgdGhlbiB3ZSB3aWxsIGhhdmUgY29uZmlnLnN0YXR1cyBydW4gJENPTkZJR19MVCBsYXRlciwgc28gaXQKKwlkbmwgbmVlZHMgdG8ga25vdyB3aGF0IG5hbWUgaXMgc3RvcmVkIHRoZXJlOgorICAgICAgICBbQUNfQ09ORklHX0NPTU1BTkRTKFtsaWJ0b29sXSwKKyAgICAgICAgICAgIFskU0hFTEwgJENPTkZJR19MVCB8fCBBU19FWElUKDEpXSwgW0NPTkZJR19MVD0nJENPTkZJR19MVCddKV0sCisgICAgZG5sIElmIHRoZSBsaWJ0b29sIGdlbmVyYXRpb24gY29kZSBpcyBkZXN0aW5lZCBmb3IgY29uZmlnLnN0YXR1cywKKyAgICBkbmwgZXhwYW5kIHRoZSBhY2N1bXVsYXRlZCBjb21tYW5kcyBhbmQgaW5pdCBjb2RlIG5vdzoKKyAgICBbQUNfQ09ORklHX0NPTU1BTkRTKFtsaWJ0b29sXSwKKyAgICAgICAgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sIFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVF0pXSkKK10pI19MVF9DT05GSUdfQ09NTUFORFMKKworCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSwKK1sKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JworZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKK19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUworTFRDQz0nJExUQ0MnCitMVENGTEFHUz0nJExUQ0ZMQUdTJworY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJworCisjIEEgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gcHJpbnQgYnVpbHRpbiBvciBwcmludGYuCitmdW5jX2ZhbGxiYWNrX2VjaG8gKCkKK3sKKyAgZXZhbCAnY2F0IDw8X0xURUNIT19FT0YKK1wkW10xCitfTFRFQ0hPX0VPRicKK30KKworIyBRdW90ZSBldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMpOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gXFxcXCIiXFxcXFwkXCR2YXIiXFxcXCJcYCBpbgorICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiXFxcJFwkdmFyXFwiIHwgXFxcJFNFRCBcXCJcXFwkc2VkX3F1b3RlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworZG9uZQorCisjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCitmb3IgdmFyIGluIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtbIFwKK11dLCBsdF9kZWNsX2RxdW90ZV92YXJuYW1lcyk7IGRvCisgICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyBcXFxcIiJcXFxcXCRcJHZhciJcXFxcIlxgIGluCisgICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJcXFwkXCR2YXJcXCIgfCBcXFwkU0VEIC1lIFxcIlxcXCRkb3VibGVfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkZGVsYXlfdmFyaWFibGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKK19MVF9PVVRQVVRfTElCVE9PTF9JTklUCitdKQorCisjIF9MVF9HRU5FUkFURURfRklMRV9JTklUKEZJTEUsIFtDT01NRU5UXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEdlbmVyYXRlIGEgY2hpbGQgc2NyaXB0IEZJTEUgd2l0aCBhbGwgaW5pdGlhbGl6YXRpb24gbmVjZXNzYXJ5IHRvCisjIHJldXNlIHRoZSBlbnZpcm9ubWVudCBsZWFybmVkIGJ5IHRoZSBwYXJlbnQgc2NyaXB0LCBhbmQgbWFrZSB0aGUKKyMgZmlsZSBleGVjdXRhYmxlLiAgSWYgQ09NTUVOVCBpcyBzdXBwbGllZCwgaXQgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlCisjIGAjIScgc2VxdWVuY2UgYnV0IGJlZm9yZSBpbml0aWFsaXphdGlvbiB0ZXh0IGJlZ2lucy4gIEFmdGVyIHRoaXMKKyMgbWFjcm8sIGFkZGl0aW9uYWwgdGV4dCBjYW4gYmUgYXBwZW5kZWQgdG8gRklMRSB0byBmb3JtIHRoZSBib2R5IG9mCisjIHRoZSBjaGlsZCBzY3JpcHQuICBUaGUgbWFjcm8gZW5kcyB3aXRoIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGUKKyMgZmlsZSBjb3VsZCBub3QgYmUgZnVsbHkgd3JpdHRlbiAoc3VjaCBhcyBpZiB0aGUgZGlzayBpcyBmdWxsKS4KK200X2lmZGVmKFtBU19JTklUX0dFTkVSQVRFRF0sCitbbTRfZGVmdW4oW19MVF9HRU5FUkFURURfRklMRV9JTklUXSxbQVNfSU5JVF9HRU5FUkFURUQoJEApXSldLAorW200X2RlZnVuKFtfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVF0sCitbbTRfcmVxdWlyZShbQVNfUFJFUEFSRV0pXWRubAorW200X3B1c2hkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSldZG5sCitbbHRfd3JpdGVfZmFpbD0wCitjYXQgPiQxIDw8X0FTRU9GIHx8IGx0X3dyaXRlX2ZhaWw9MQorIyEgJFNIRUxMCisjIEdlbmVyYXRlZCBieSAkYXNfbWUuCiskMgorU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK2V4cG9ydCBTSEVMTAorX0FTRU9GCitjYXQgPj4kMSA8PFxfQVNFT0YgfHwgbHRfd3JpdGVfZmFpbD0xCitBU19TSEVMTF9TQU5JVElaRQorX0FTX1BSRVBBUkUKK2V4ZWMgQVNfTUVTU0FHRV9GRD4mMQorX0FTRU9GCit0ZXN0ICRsdF93cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkMVtdZG5sCittNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSldKV0pIyBfTFRfR0VORVJBVEVEX0ZJTEVfSU5JVAorCisjIExUX09VVFBVVAorIyAtLS0tLS0tLS0KKyMgVGhpcyBtYWNybyBhbGxvd3MgZWFybHkgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQgKGJlZm9yZQorIyBBQ19PVVRQVVQgaXMgY2FsbGVkKSwgaW5jYXNlIGl0IGlzIHVzZWQgaW4gY29uZmlndXJlIGZvciBjb21waWxhdGlvbgorIyB0ZXN0cy4KK0FDX0RFRlVOKFtMVF9PVVRQVVRdLAorWzogJHtDT05GSUdfTFQ9Li9jb25maWcubHR9CitBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkQ09ORklHX0xUXSkKK19MVF9HRU5FUkFURURfRklMRV9JTklUKFsiJENPTkZJR19MVCJdLAorWyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSBhIGxpYnRvb2wgc3R1YiB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXSkKKworY2F0ID4+IiRDT05GSUdfTFQiIDw8XF9MVEVPRgorbHRfY2xfc2lsZW50PWZhbHNlCitleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgQVNfQk9YKFtSdW5uaW5nICRhc19tZS5dKQorfSA+JkFTX01FU1NBR0VfTE9HX0ZECisKK2x0X2NsX2hlbHA9IlwKK1xgJGFzX21lJyBjcmVhdGVzIGEgbG9jYWwgbGlidG9vbCBzdHViIGZyb20gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwKK2ZvciB1c2UgaW4gZnVydGhlciBjb25maWd1cmUgdGltZSB0ZXN0cyBiZWZvcmUgdGhlIHJlYWwgbGlidG9vbCBpcworZ2VuZXJhdGVkLgorCitVc2FnZTogJFswXSBbW09QVElPTlNdXQorCisgIC1oLCAtLWhlbHAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCAgICAgZG8gbm90IHByaW50IHByb2dyZXNzIG1lc3NhZ2VzCisgIC1kLCAtLWRlYnVnICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisKK1JlcG9ydCBidWdzIHRvIDxidWctbGlidG9vbEBnbnUub3JnPi4iCisKK2x0X2NsX3ZlcnNpb249IlwKK200X2lmc2V0KFtBQ19QQUNLQUdFX05BTUVdLCBbQUNfUEFDS0FHRV9OQU1FIF0pY29uZmlnLmx0W11kbmwKK200X2lmc2V0KFtBQ19QQUNLQUdFX1ZFUlNJT05dLCBbIEFDX1BBQ0tBR0VfVkVSU0lPTl0pCitjb25maWd1cmVkIGJ5ICRbMF0sIGdlbmVyYXRlZCBieSBtNF9QQUNLQUdFX1NUUklORy4KKworQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcubHQgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNpb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKword2hpbGUgdGVzdCAkWyNdICE9IDAKK2RvCisgIGNhc2UgJFsxXSBpbgorICAgIC0tdmVyc2lvbiB8IC0tdiogfCAtViApCisgICAgICBlY2hvICIkbHRfY2xfdmVyc2lvbiI7IGV4aXQgMCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICBlY2hvICIkbHRfY2xfaGVscCI7IGV4aXQgMCA7OworICAgIC0tZGVidWcgfCAtLWQqIHwgLWQgKQorICAgICAgZGVidWc9OiA7OworICAgIC0tcXVpZXQgfCAtLXEqIHwgLS1zaWxlbnQgfCAtLXMqIHwgLXEgKQorICAgICAgbHRfY2xfc2lsZW50PTogOzsKKworICAgIC0qKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBvcHRpb246ICRbMV0KK1RyeSBcYCRbMF0gLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5dKSA7OworCisgICAgKikgQUNfTVNHX0VSUk9SKFt1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICRbMV0KK1RyeSBcYCRbMF0gLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5dKSA7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2lmICRsdF9jbF9zaWxlbnQ7IHRoZW4KKyAgZXhlYyBBU19NRVNTQUdFX0ZEPi9kZXYvbnVsbAorZmkKK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxfTFRFT0YKK19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUCitfTFRFT0YKKworY2F0ID4+IiRDT05GSUdfTFQiIDw8XF9MVEVPRgorQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJG9maWxlXSkKK19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EUworQVNfRVhJVCgwKQorX0xURU9GCitjaG1vZCAreCAiJENPTkZJR19MVCIKKworIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBidXQgY29uZmlnLmx0IGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwKKyMgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2csIHdoaWNoIGZhaWxzIG9uIERPUywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0CisjIG9wZW4gYnkgY29uZmlndXJlLiAgSGVyZSB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsIGVmZmVjdGl2ZWx5IGNsb3NpbmcKKyMgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5sdC4KK2x0X2NsX3N1Y2Nlc3M9OgordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgbHRfY29uZmlnX2x0X2FyZ3M9IiRsdF9jb25maWdfbHRfYXJncyAtLXF1aWV0IgorZXhlYyBBU19NRVNTQUdFX0xPR19GRD4vZGV2L251bGwKKyRTSEVMTCAiJENPTkZJR19MVCIgJGx0X2NvbmZpZ19sdF9hcmdzIHx8IGx0X2NsX3N1Y2Nlc3M9ZmFsc2UKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKKyRsdF9jbF9zdWNjZXNzIHx8IEFTX0VYSVQoMSkKK10pIyBMVF9PVVRQVVQKKworCisjIF9MVF9DT05GSUcoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgSWYgVEFHIGlzIHRoZSBidWlsdC1pbiB0YWcsIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0IHdpdGggYQorIyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UgYWRkIGNvZGUKKyMgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5IFRBRyBmcm9tIHRoZQorIyBtYXRjaGluZyB0YWdnZWQgY29uZmlnIHZhcnMuCittNF9kZWZ1bihbX0xUX0NPTkZJR10sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCitfTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoWworICBtNF9kZWZpbmUoW19MVF9UQUddLCBtNF9pZihbJDFdLCBbXSwgW0NdLCBbJDFdKSlkbmwKKyAgbTRfaWYoX0xUX1RBRywgW0NdLCBbCisgICAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgorICAgICMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICAgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICAgIGZpCisKKyAgICBjZmdmaWxlPSIke29maWxlfVQiCisgICAgdHJhcCAiJFJNIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKKyAgICAkUk0gIiRjZmdmaWxlIgorCisgICAgY2F0IDw8X0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisjISAkU0hFTEwKKworIyBgJEVDSE8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJGFzX21lICgkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KKyMKK19MVF9DT1BZSU5HCitfTFRfTElCVE9PTF9UQUdTCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCitfTFRfTElCVE9PTF9DT05GSUdfVkFSUworX0xUX0xJQlRPT0xfVEFHX1ZBUlMKKyMgIyMjIEVORCBMSUJUT09MIENPTkZJRworCitfTFRfRU9GCisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICBjYXQgPDxcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorX0xUX0VPRgorICAgIDs7CisgIGVzYWMKKworICBfTFRfUFJPR19MVE1BSU4KKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiBcCisgICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgX0xUX1BST0dfUkVQTEFDRV9TSEVMTEZOUworCisgICBtdiAtZiAiJGNmZ2ZpbGUiICIkb2ZpbGUiIHx8CisgICAgKHJtIC1mICIkb2ZpbGUiICYmIGNwICIkY2ZnZmlsZSIgIiRvZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlIikKKyAgY2htb2QgK3ggIiRvZmlsZSIKK10sCitbY2F0IDw8X0xUX0VPRiA+PiAiJG9maWxlIgorCitkbmwgVW5mb3J0dW5hdGVseSB3ZSBoYXZlIHRvIHVzZSAkMSBoZXJlLCBzaW5jZSBfTFRfVEFHIGlzIG5vdCBleHBhbmRlZAorZG5sIGluIGEgY29tbWVudCAoaWUgYWZ0ZXIgYSAjKS4KKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJDEKK19MVF9MSUJUT09MX1RBR19WQVJTKF9MVF9UQUcpCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkMQorX0xUX0VPRgorXSlkbmwgL200X2lmCitdLAorW200X2lmKFskMV0sIFtdLCBbCisgICAgUEFDS0FHRT0nJFBBQ0tBR0UnCisgICAgVkVSU0lPTj0nJFZFUlNJT04nCisgICAgVElNRVNUQU1QPSckVElNRVNUQU1QJworICAgIFJNPSckUk0nCisgICAgb2ZpbGU9JyRvZmlsZSddLCBbXSkKK10pZG5sIC9fTFRfQ09ORklHX1NBVkVfQ09NTUFORFMKK10pIyBfTFRfQ09ORklHCisKKworIyBMVF9TVVBQT1JURURfVEFHKFRBRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyYWNlIHRoaXMgbWFjcm8gdG8gZGlzY292ZXIgd2hhdCB0YWdzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGxpYnRvb2wKKyMgLS10YWcgb3B0aW9uLCB1c2luZzoKKyMgICAgYXV0b2NvbmYgLS10cmFjZSAnTFRfU1VQUE9SVEVEX1RBRzokMScKK0FDX0RFRlVOKFtMVF9TVVBQT1JURURfVEFHXSwgW10pCisKKworIyBDIHN1cHBvcnQgaXMgYnVpbHQtaW4gZm9yIG5vdworbTRfZGVmaW5lKFtfTFRfTEFOR19DX2VuYWJsZWRdLCBbXSkKK200X2RlZmluZShbX0xUX1RBR1NdLCBbXSkKKworCisjIExUX0xBTkcoTEFORykKKyMgLS0tLS0tLS0tLS0tLQorIyBFbmFibGUgbGlidG9vbCBzdXBwb3J0IGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaWYgbm90IGFscmVhZHkgZW5hYmxlZC4KK0FDX0RFRlVOKFtMVF9MQU5HXSwKK1tBQ19CRUZPUkUoWyQwXSwgW0xUX09VVFBVVF0pZG5sCittNF9jYXNlKFskMV0sCisgIFtDXSwJCQlbX0xUX0xBTkcoQyldLAorICBbQysrXSwJCVtfTFRfTEFORyhDWFgpXSwKKyAgW0phdmFdLAkJW19MVF9MQU5HKEdDSildLAorICBbRm9ydHJhbiA3N10sCQlbX0xUX0xBTkcoRjc3KV0sCisgIFtGb3J0cmFuXSwJCVtfTFRfTEFORyhGQyldLAorICBbV2luZG93cyBSZXNvdXJjZV0sCVtfTFRfTEFORyhSQyldLAorICBbbTRfaWZkZWYoW19MVF9MQU5HX10kMVtfQ09ORklHXSwKKyAgICBbX0xUX0xBTkcoJDEpXSwKKyAgICBbbTRfZmF0YWwoWyQwOiB1bnN1cHBvcnRlZCBsYW5ndWFnZTogIiQxIl0pXSldKWRubAorXSkjIExUX0xBTkcKKworCisjIF9MVF9MQU5HKExBTkdOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfTEFOR10sCitbbTRfaWZkZWYoW19MVF9MQU5HX10kMVtfZW5hYmxlZF0sIFtdLAorICBbTFRfU1VQUE9SVEVEX1RBRyhbJDFdKWRubAorICBtNF9hcHBlbmQoW19MVF9UQUdTXSwgWyQxIF0pZG5sCisgIG00X2RlZmluZShbX0xUX0xBTkdfXSQxW19lbmFibGVkXSwgW10pZG5sCisgIF9MVF9MQU5HXyQxX0NPTkZJRygkMSldKWRubAorXSkjIF9MVF9MQU5HCisKKworIyBfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9MQU5HX0RFRkFVTFRfQ09ORklHXSwKK1tBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAorICBbTFRfTEFORyhDWFgpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19DWFhdLCBkZWZuKFtBQ19QUk9HX0NYWF0pW0xUX0xBTkcoQ1hYKV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRjc3XSwKKyAgW0xUX0xBTkcoRjc3KV0sCisgIFttNF9kZWZpbmUoW0FDX1BST0dfRjc3XSwgZGVmbihbQUNfUFJPR19GNzddKVtMVF9MQU5HKEY3NyldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0ZDXSwKKyAgW0xUX0xBTkcoRkMpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19GQ10sIGRlZm4oW0FDX1BST0dfRkNdKVtMVF9MQU5HKEZDKV0pXSkKKworZG5sIFRoZSBjYWxsIHRvIFtBXVtNX1BST0dfR0NKXSBpcyBxdW90ZWQgbGlrZSB0aGF0IHRvIHN0b3AgYWNsb2NhbAorZG5sIHB1bGxpbmcgdGhpbmdzIGluIG5lZWRsZXNzbHkuCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19HQ0pdLAorICBbTFRfTEFORyhHQ0opXSwKKyAgW0FDX1BST1ZJREVfSUZFTFNFKFtBXVtNX1BST0dfR0NKXSwKKyAgICBbTFRfTEFORyhHQ0opXSwKKyAgICBbQUNfUFJPVklERV9JRkVMU0UoW0xUX1BST0dfR0NKXSwKKyAgICAgIFtMVF9MQU5HKEdDSildLAorICAgICAgW200X2lmZGVmKFtBQ19QUk9HX0dDSl0sCisJW200X2RlZmluZShbQUNfUFJPR19HQ0pdLCBkZWZuKFtBQ19QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSkKKyAgICAgICBtNF9pZmRlZihbQV1bTV9QUk9HX0dDSl0sCisJW200X2RlZmluZShbQV1bTV9QUk9HX0dDSl0sIGRlZm4oW0FdW01fUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pCisgICAgICAgbTRfaWZkZWYoW0xUX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtMVF9QUk9HX0dDSl0sIGRlZm4oW0xUX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKV0pXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19SQ10sCisgIFtMVF9MQU5HKFJDKV0sCisgIFttNF9kZWZpbmUoW0xUX1BST0dfUkNdLCBkZWZuKFtMVF9QUk9HX1JDXSlbTFRfTEFORyhSQyldKV0pCitdKSMgX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKKworIyBPYnNvbGV0ZSBtYWNyb3M6CitBVV9ERUZVTihbQUNfTElCVE9PTF9DWFhdLCBbTFRfTEFORyhDKyspXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0Y3N10sIFtMVF9MQU5HKEZvcnRyYW4gNzcpXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0ZDXSwgW0xUX0xBTkcoRm9ydHJhbildKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfR0NKXSwgW0xUX0xBTkcoSmF2YSldKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfUkNdLCBbTFRfTEFORyhXaW5kb3dzIFJlc291cmNlKV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRkNdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9HQ0pdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9SQ10sIFtdKQorCisKKyMgX0xUX1RBR19DT01QSUxFUgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1RBR19DT01QSUxFUl0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisKK19MVF9ERUNMKFtMVENDXSwgW0NDXSwgWzFdLCBbQSBDIGNvbXBpbGVyXSlkbmwKK19MVF9ERUNMKFtMVENGTEFHU10sIFtDRkxBR1NdLCBbMV0sIFtMVENDIGNvbXBpbGVyIGZsYWdzXSlkbmwKK19MVF9UQUdERUNMKFtDQ10sIFtjb21waWxlcl0sIFsxXSwgW0EgbGFuZ3VhZ2Ugc3BlY2lmaWMgY29tcGlsZXJdKWRubAorX0xUX1RBR0RFQ0woW3dpdGhfZ2NjXSwgW0dDQ10sIFswXSwgW0lzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyP10pZG5sCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKK10pIyBfTFRfVEFHX0NPTVBJTEVSCisKKworIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBjb21waWxlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGNvbXBpbGVyIHRlc3QgY29kZS4KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSBjb25mdGVzdCoKK10pIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKworCisjIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgbGlua2VyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCisjIHRoZSBzaW1wbGUgbGluayB0ZXN0IGNvZGUuCittNF9kZWZ1bihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSAtciBjb25mdGVzdCoKK10pIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1MKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW5fb25jZShbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdLFsKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbiopCisgICAgQUNfQ0hFQ0tfVE9PTChbRFNZTVVUSUxdLCBbZHN5bXV0aWxdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbTk1FRElUXSwgW25tZWRpdF0sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtMSVBPXSwgW2xpcG9dLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbT1RPT0xdLCBbb3Rvb2xdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbT1RPT0w2NF0sIFtvdG9vbDY0XSwgWzpdKQorICAgIF9MVF9ERUNMKFtdLCBbRFNZTVVUSUxdLCBbMV0sCisgICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGFyY2hpdmVkIERXQVJGIGRlYnVnIHN5bWJvbCBmaWxlcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtOTUVESVRdLCBbMV0sCisgICAgICBbVG9vbCB0byBjaGFuZ2UgZ2xvYmFsIHRvIGxvY2FsIHN5bWJvbHMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbTElQT10sIFsxXSwKKyAgICAgIFtUb29sIHRvIG1hbmlwdWxhdGUgZmF0IG9iamVjdHMgYW5kIGFyY2hpdmVzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW09UT09MXSwgWzFdLAorICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW09UT09MNjRdLCBbMV0sCisgICAgICBbbGRkL3JlYWRlbGYgbGlrZSB0b29sIGZvciA2NCBiaXQgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYIDEwLjRdKQorCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZ10sW2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2RdLAorICAgICAgW2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KKyAgICAgIGlmIHRlc3QgLXogIiR7TFRfTVVMVElfTU9EVUxFfSI7IHRoZW4KKwkjIEJ5IGRlZmF1bHQgd2Ugd2lsbCBhZGQgdGhlIC1zaW5nbGVfbW9kdWxlIGZsYWcuIFlvdSBjYW4gb3ZlcnJpZGUKKwkjIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVF9NVUxUSV9NT0RVTEUKKwkjIG5vbi1lbXB0eSBhdCBjb25maWd1cmUgdGltZSwgb3IgYnkgYWRkaW5nIC1tdWx0aV9tb2R1bGUgdG8gdGhlCisJIyBsaW5rIGZsYWdzLgorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwllY2hvICJpbnQgZm9vKHZvaWQpe3JldHVybiAxO30iID4gY29uZnRlc3QuYworCWVjaG8gIiRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCistZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAorCSRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCisJICAtZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyAyPmNvbmZ0ZXN0LmVycgorICAgICAgICBfbHRfcmVzdWx0PSQ/CisJaWYgdGVzdCAtZiBsaWJjb25mdGVzdC5keWxpYiAmJiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyICYmIHRlc3QgJF9sdF9yZXN1bHQgPSAwOyB0aGVuCisJICBsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPXllcworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorCWZpCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIGZpXSkKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWddLAorICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdF0sCisgICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCisgICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQorICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgorICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAorCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9eWVzXSwKKwlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vXSkKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIF0pCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtZm9yY2VfbG9hZCBsaW5rZXIgZmxhZ10sW2x0X2N2X2xkX2ZvcmNlX2xvYWRdLAorICAgICAgW2x0X2N2X2xkX2ZvcmNlX2xvYWQ9bm8KKyAgICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDwgX0xUX0VPRgoraW50IGZvcmNlZF9sb2FkZWQoKSB7IHJldHVybiAyO30KK19MVF9FT0YKKyAgICAgIGVjaG8gIiRMVENDICRMVENGTEFHUyAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRMVENDICRMVENGTEFHUyAtYyAtbyBjb25mdGVzdC5vIGNvbmZ0ZXN0LmMgMj4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGVjaG8gIiRBUiBjcnUgbGliY29uZnRlc3QuYSBjb25mdGVzdC5vIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAkQVIgY3J1IGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QubyAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZWNobyAiJFJBTkxJQiBsaWJjb25mdGVzdC5hIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAkUkFOTElCIGxpYmNvbmZ0ZXN0LmEgMj4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDwgX0xUX0VPRgoraW50IG1haW4oKSB7IHJldHVybiAwO30KK19MVF9FT0YKKyAgICAgIGVjaG8gIiRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1XbCwtZm9yY2VfbG9hZCwuL2xpYmNvbmZ0ZXN0LmEiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1XbCwtZm9yY2VfbG9hZCwuL2xpYmNvbmZ0ZXN0LmEgMj5jb25mdGVzdC5lcnIKKyAgICAgIF9sdF9yZXN1bHQ9JD8KKyAgICAgIGlmIHRlc3QgLWYgY29uZnRlc3QgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMCAmJiAkR1JFUCBmb3JjZWRfbG9hZCBjb25mdGVzdCAyPiYxID4vZGV2L251bGw7IHRoZW4KKwlsdF9jdl9sZF9mb3JjZV9sb2FkPXllcworICAgICAgZWxzZQorCWNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICAgICAgcm0gLWYgY29uZnRlc3QuZXJyIGxpYmNvbmZ0ZXN0LmEgY29uZnRlc3QgY29uZnRlc3QuYworICAgICAgICBybSAtcmYgY29uZnRlc3QuZFNZTQorICAgIF0pCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4xLiopCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCisgICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCisgICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAorICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/CisgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCisJMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bWzkxXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworCTEwLltbMDEyXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworCTEwLiopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisgICAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX3NpbmdsZV9tb2Q9JyRzaW5nbGVfbW9kdWxlJworICAgIGZpCisgICAgaWYgdGVzdCAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nICR7d2x9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCwkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltJworICAgIGVsc2UKKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9J34kTk1FRElUIC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgaWYgdGVzdCAiJERTWU1VVElMIiAhPSAiOiIgJiYgdGVzdCAiJGx0X2N2X2xkX2ZvcmNlX2xvYWQiID0gIm5vIjsgdGhlbgorICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKKyAgICBlbHNlCisgICAgICBfbHRfZHN5bXV0aWw9CisgICAgZmkKKyAgICA7OworICBlc2FjCitdKQorCisKKyMgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2tzIGZvciBsaW5rZXIgYW5kIGNvbXBpbGVyIGZlYXR1cmVzIG9uIGRhcndpbgorbTRfZGVmdW4oW19MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTXSwKK1sKKyAgbTRfcmVxdWlyZShbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdKQorICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcworICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZm9yY2VfbG9hZCIgPSAieWVzIjsgdGhlbgorICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlICR7d2x9LWZvcmNlX2xvYWQsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAnCisgIGVsc2UKKyAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKKyAgZmkKKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICBpZm9ydCopIF9sdF9kYXJfY2FuX3NoYXJlZD15ZXMgOzsKKyAgICAgKikgX2x0X2Rhcl9jYW5fc2hhcmVkPSRHQ0MgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkX2x0X2Rhcl9jYW5fc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZnVuY19lY2hvX2FsbAorICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgbTRfaWYoWyQxXSwgW0NYWF0sCitbICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiICE9ICJ5ZXMiOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSJcJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZHN5bXV0aWx9IgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgZmkKK10sW10pCisgIGVsc2UKKyAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICBmaQorXSkKKworIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KKyMgU3RvcmUgdGhlIHJlc3VsdHMgZnJvbSB0aGUgZGlmZmVyZW50IGNvbXBpbGVycyBmb3IgZWFjaCBUQUdOQU1FLgorIyBBbGxvdyB0byBvdmVycmlkZSB0aGVtIGZvciBhbGwgdGFncyB0aHJvdWdoIGx0X2N2X2FpeF9saWJwYXRoLgorbTRfZGVmdW4oW19MVF9TWVNfTU9EVUxFX1BBVEhfQUlYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAoraWYgdGVzdCAiJHtsdF9jdl9haXhfbGlicGF0aCtzZXR9IiA9IHNldDsgdGhlbgorICBhaXhfbGlicGF0aD0kbHRfY3ZfYWl4X2xpYnBhdGgKK2Vsc2UKKyAgQUNfQ0FDSEVfVkFMKFtfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKV0sCisgIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNXSxbCisgIGx0X2FpeF9saWJwYXRoX3NlZD0nWworICAgICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geworCSAgL14wLyB7CisJICAgICAgcy9eMCAgKlwoW14gXSpcKSAqJC9cMS8KKwkgICAgICBwCisJICB9CisgICAgICB9XScKKyAgX0xUX1RBR1ZBUihbbHRfY3ZfYWl4X2xpYnBhdGhfXSwgWyQxXSk9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCisgICMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pIjsgdGhlbgorICAgIF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorICBmaV0sW10pCisgIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKSI7IHRoZW4KKyAgICBfTFRfVEFHVkFSKFtsdF9jdl9haXhfbGlicGF0aF9dLCBbJDFdKT0iL3Vzci9saWI6L2xpYiIKKyAgZmkKKyAgXSkKKyAgYWl4X2xpYnBhdGg9JF9MVF9UQUdWQVIoW2x0X2N2X2FpeF9saWJwYXRoX10sIFskMV0pCitmaQorXSkjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisKKworIyBfTFRfU0hFTExfSU5JVChBUkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1NIRUxMX0lOSVRdLAorW200X2RpdmVydF90ZXh0KFtNNFNILUlOSVRdLCBbJDEKK10pXSkjIF9MVF9TSEVMTF9JTklUCisKKworCisjIF9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgaG93IHdlIGNhbiBmYWtlIGFuIGVjaG8gY29tbWFuZCB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2guCisjIEluIHBhcnRpY3VsYXIsIHdpdGggQXV0b2NvbmYgMi42MCBvciBsYXRlciB3ZSBhZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydAorIyBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggd2lsbCBmaW5kIGEgc2hlbGwgd2l0aCBhIGJ1aWx0aW4KKyMgcHJpbnRmICh3aGljaCB3ZSBjYW4gdXNlIGFzIGFuIGVjaG8gY29tbWFuZCkuCittNF9kZWZ1bihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAorW0VDSE89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCitFQ0hPPSRFQ0hPJEVDSE8kRUNITyRFQ0hPJEVDSE8KK0VDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIHByaW50IHN0cmluZ3NdKQorIyBUZXN0IHByaW50IGZpcnN0LCBiZWNhdXNlIGl0IHdpbGwgYmUgYSBidWlsdGluIGlmIHByZXNlbnQuCitpZiB0ZXN0ICJYYCggcHJpbnQgLXIgLS0gLW4gKSAyPi9kZXYvbnVsbGAiID0gWC1uICYmIFwKKyAgIHRlc3QgIlhgcHJpbnQgLXIgLS0gJEVDSE8gMj4vZGV2L251bGxgIiA9ICJYJEVDSE8iOyB0aGVuCisgIEVDSE89J3ByaW50IC1yIC0tJworZWxpZiB0ZXN0ICJYYHByaW50ZiAlcyAkRUNITyAyPi9kZXYvbnVsbGAiID0gIlgkRUNITyI7IHRoZW4KKyAgRUNITz0ncHJpbnRmICVzXG4nCitlbHNlCisgICMgVXNlIHRoaXMgZnVuY3Rpb24gYXMgYSBmYWxsYmFjayB0aGF0IGFsd2F5cyB3b3Jrcy4KKyAgZnVuY19mYWxsYmFja19lY2hvICgpCisgIHsKKyAgICBldmFsICdjYXQgPDxfTFRFQ0hPX0VPRgorJFtdMQorX0xURUNIT19FT0YnCisgIH0KKyAgRUNITz0nZnVuY19mYWxsYmFja19lY2hvJworZmkKKworIyBmdW5jX2VjaG9fYWxsIGFyZy4uLgorIyBJbnZva2UgJEVDSE8gd2l0aCBhbGwgYXJncywgc3BhY2Utc2VwYXJhdGVkLgorZnVuY19lY2hvX2FsbCAoKQoreworICAgICRFQ0hPICIkKiIgCit9CisKK2Nhc2UgIiRFQ0hPIiBpbgorICBwcmludGYqKSBBQ19NU0dfUkVTVUxUKFtwcmludGZdKSA7OworICBwcmludCopIEFDX01TR19SRVNVTFQoW3ByaW50IC1yXSkgOzsKKyAgKikgQUNfTVNHX1JFU1VMVChbY2F0XSkgOzsKK2VzYWMKKworbTRfaWZkZWYoW19BU19ERVRFQ1RfU1VHR0VTVEVEXSwKK1tfQVNfREVURUNUX1NVR0dFU1RFRChbCisgIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSR7QkFTSF9WRVJTSU9OK3NldH0iIHx8ICgKKyAgICBFQ0hPPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITworICAgIEVDSE89JEVDSE8kRUNITyRFQ0hPJEVDSE8kRUNITyRFQ0hPCisgICAgUEFUSD0vZW1wdHkgRlBBVEg9L2VtcHR5OyBleHBvcnQgUEFUSCBGUEFUSAorICAgIHRlc3QgIlhgcHJpbnRmICVzICRFQ0hPYCIgPSAiWCRFQ0hPIiBcCisgICAgICB8fCB0ZXN0ICJYYHByaW50IC1yIC0tICRFQ0hPYCIgPSAiWCRFQ0hPIiApXSldKQorCitfTFRfREVDTChbXSwgW1NIRUxMXSwgWzFdLCBbU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0c10pCitfTFRfREVDTChbXSwgW0VDSE9dLCBbMV0sIFtBbiBlY2hvIHByb2dyYW0gdGhhdCBwcm90ZWN0cyBiYWNrc2xhc2hlc10pCitdKSMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKworCisjIF9MVF9XSVRIX1NZU1JPT1QKKyMgLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9XSVRIX1NZU1JPT1RdLAorW0FDX01TR19DSEVDS0lORyhbZm9yIHN5c3Jvb3RdKQorQUNfQVJHX1dJVEgoW3N5c3Jvb3RdLAorWyAgLS13aXRoLXN5c3Jvb3RbPURJUl0gU2VhcmNoIGZvciBkZXBlbmRlbnQgbGlicmFyaWVzIHdpdGhpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgIChvciB0aGUgY29tcGlsZXIncyBzeXNyb290IGlmIG5vdCBzcGVjaWZpZWQpLl0sCitbXSwgW3dpdGhfc3lzcm9vdD1ub10pCisKK2RubCBsdF9zeXNyb290IHdpbGwgYWx3YXlzIGJlIHBhc3NlZCB1bnF1b3RlZC4gIFdlIHF1b3RlIGl0IGhlcmUKK2RubCBpbiBjYXNlIHRoZSB1c2VyIHBhc3NlZCBhIGRpcmVjdG9yeSBuYW1lLgorbHRfc3lzcm9vdD0KK2Nhc2UgJHt3aXRoX3N5c3Jvb3R9IGluICMoCisgeWVzKQorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgbHRfc3lzcm9vdD1gJENDIC0tcHJpbnQtc3lzcm9vdCAyPi9kZXYvbnVsbGAKKyAgIGZpCisgICA7OyAjKAorIC8qKQorICAgbHRfc3lzcm9vdD1gZWNobyAiJHdpdGhfc3lzcm9vdCIgfCBzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgOzsgIygKKyBub3wnJykKKyAgIDs7ICMoCisgKikKKyAgIEFDX01TR19SRVNVTFQoWyR7d2l0aF9zeXNyb290fV0pCisgICBBQ19NU0dfRVJST1IoW1RoZSBzeXNyb290IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC5dKQorICAgOzsKK2VzYWMKKworIEFDX01TR19SRVNVTFQoWyR7bHRfc3lzcm9vdDotbm99XSkKK19MVF9ERUNMKFtdLCBbbHRfc3lzcm9vdF0sIFswXSwgW1RoZSByb290IHdoZXJlIHRvIHNlYXJjaCBmb3IgXWRubAorW2RlcGVuZGVudCBsaWJyYXJpZXMsIGFuZCBpbiB3aGljaCBvdXIgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQuXSldKQorCisjIF9MVF9FTkFCTEVfTE9DSworIyAtLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfRU5BQkxFX0xPQ0tdLAorW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCisgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCisgICAgW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgoraWE2NC0qLWhwdXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICAgKkVMRi0zMiopCisJSFBVWF9JQTY0X01PREU9IjMyIgorCTs7CisgICAgICAqRUxGLTY0KikKKwlIUFVYX0lBNjRfTU9ERT0iNjQiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSAnJExJTkVOTycgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKwkqMzItYml0KikKKwkgIExEPSIke0xELWxkfSAtMzIiCisJICA7OworCSpOMzIqKQorCSAgTEQ9IiR7TEQtbGR9IC1uMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwkgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKK3MzOTAqLSpsaW51eCp8czM5MCotKnRwZip8c3BhcmMqLSpsaW51eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgICAqMzItYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4Nl9mYnNkIgorCSAgICA7OworCSAgeDg2XzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKKwkgICAgOzsKKwkgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgorCSAgICA7OworCSAgczM5MHgtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgorCSAgICA7OworCSAgc3BhcmM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqNjQtYml0KikKKwljYXNlICRob3N0IGluCisJICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisJICAgIDs7CisJICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorCSAgICA7OworCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisJICAgIDs7CisJICBzcGFyYyotKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKKyAgICBbQUNfTEFOR19QVVNIKEMpCisgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSxbW11dKV0sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCisgICAgIEFDX0xBTkdfUE9QXSkKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKK3NwYXJjKi0qc29sYXJpcyopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgKjY0LWJpdCopCisgICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgorICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OworICAgICAgKikKKwlpZiAke0xELWxkfSAtNjQgLXIgLW8gY29uZnRlc3QyLm8gY29uZnRlc3QubyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIExEPSIke0xELWxkfSAtNjQiCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKK2VzYWMKKworbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCitdKSMgX0xUX0VOQUJMRV9MT0NLCisKKworIyBfTFRfUFJPR19BUgorIyAtLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9QUk9HX0FSXSwKK1tBQ19DSEVDS19UT09MUyhBUiwgW2FyXSwgZmFsc2UpCis6ICR7QVI9YXJ9Cis6ICR7QVJfRkxBR1M9Y3J1fQorX0xUX0RFQ0woW10sIFtBUl0sIFsxXSwgW1RoZSBhcmNoaXZlcl0pCitfTFRfREVDTChbXSwgW0FSX0ZMQUdTXSwgWzFdLCBbRmxhZ3MgdG8gY3JlYXRlIGFuIGFyY2hpdmVdKQorCitBQ19DQUNIRV9DSEVDSyhbZm9yIGFyY2hpdmVyIEBGSUxFIHN1cHBvcnRdLCBbbHRfY3ZfYXJfYXRfZmlsZV0sCisgIFtsdF9jdl9hcl9hdF9maWxlPW5vCisgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNXSwKKyAgICAgW2VjaG8gY29uZnRlc3QuJGFjX29iamV4dCA+IGNvbmZ0ZXN0LmxzdAorICAgICAgbHRfYXJfdHJ5PSckQVIgJEFSX0ZMQUdTIGxpYmNvbmZ0ZXN0LmEgQGNvbmZ0ZXN0LmxzdCA+JkFTX01FU1NBR0VfTE9HX0ZEJworICAgICAgQUNfVFJZX0VWQUwoW2x0X2FyX3RyeV0pCisgICAgICBpZiB0ZXN0ICIkYWNfc3RhdHVzIiAtZXEgMDsgdGhlbgorCSMgRW5zdXJlIHRoZSBhcmNoaXZlciBmYWlscyB1cG9uIGJvZ3VzIGZpbGUgbmFtZXMuCisJcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBsaWJjb25mdGVzdC5hCisJQUNfVFJZX0VWQUwoW2x0X2FyX3RyeV0pCisJaWYgdGVzdCAiJGFjX3N0YXR1cyIgLW5lIDA7IHRoZW4KKyAgICAgICAgICBsdF9jdl9hcl9hdF9maWxlPUAKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgICBybSAtZiBjb25mdGVzdC4qIGxpYmNvbmZ0ZXN0LmEKKyAgICAgXSkKKyAgXSkKKworaWYgdGVzdCAieCRsdF9jdl9hcl9hdF9maWxlIiA9IHhubzsgdGhlbgorICBhcmNoaXZlcl9saXN0X3NwZWM9CitlbHNlCisgIGFyY2hpdmVyX2xpc3Rfc3BlYz0kbHRfY3ZfYXJfYXRfZmlsZQorZmkKK19MVF9ERUNMKFtdLCBbYXJjaGl2ZXJfbGlzdF9zcGVjXSwgWzFdLAorICBbSG93IHRvIGZlZWQgYSBmaWxlIGxpc3RpbmcgdG8gdGhlIGFyY2hpdmVyXSkKK10pIyBfTFRfUFJPR19BUgorCisKKyMgX0xUX0NNRF9PTERfQVJDSElWRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9PTERfQVJDSElWRV0sCitbX0xUX1BST0dfQVIKKworQUNfQ0hFQ0tfVE9PTChTVFJJUCwgc3RyaXAsIDopCit0ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKK19MVF9ERUNMKFtdLCBbU1RSSVBdLCBbMV0sIFtBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbV0pCisKK0FDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCit0ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgorX0xUX0RFQ0woW10sIFtSQU5MSUJdLCBbMV0sCisgICAgW0NvbW1hbmRzIHVzZWQgdG8gaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZV0pCisKKyMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgorb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQorCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG9wZW5ic2QqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCisgICAgOzsKKyAgKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCitmaQorCitjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgbG9ja19vbGRfYXJjaGl2ZV9leHRyYWN0aW9uPXllcyA7OworICAqKQorICAgIGxvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbj1ubyA7OworZXNhYworX0xUX0RFQ0woW10sIFtvbGRfcG9zdGluc3RhbGxfY21kc10sIFsyXSkKK19MVF9ERUNMKFtdLCBbb2xkX3Bvc3R1bmluc3RhbGxfY21kc10sIFsyXSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW2xvY2tfb2xkX2FyY2hpdmVfZXh0cmFjdGlvbl0sIFswXSwKKyAgICBbV2hldGhlciB0byB1c2UgYSBsb2NrIGZvciBvbGQgYXJjaGl2ZSBleHRyYWN0aW9uXSkKK10pIyBfTFRfQ01EX09MRF9BUkNISVZFCisKKworIyBfTFRfQ09NUElMRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAorIwkJW09VVFBVVC1GSUxFXSwgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb21waWxlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtfTFRfQ09NUElMRVJfT1BUSU9OXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAorICBbJDI9bm8KKyAgIG00X2lmKFskNF0sICwgW2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dF0sIFthY19vdXRmaWxlPSQ0XSkKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJDMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICQyPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSBjb25mdGVzdCoKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgbTRfaWYoWyQ1XSwgLCA6LCBbJDVdKQorZWxzZQorICAgIG00X2lmKFskNl0sICwgOiwgWyQ2XSkKK2ZpCitdKSMgX0xUX0NPTVBJTEVSX09QVElPTgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW19MVF9DT01QSUxFUl9PUFRJT05dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sIFtdKQorCisKKyMgX0xUX0xJTktFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjICAgICAgICAgICAgICAgICAgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBsaW5rZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbX0xUX0xJTktFUl9PUFRJT05dLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgIExERkxBR1M9IiRMREZMQUdTICQzIgorICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICRFQ0hPICIkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgJDI9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgICQyPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCitdKQorCitpZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgorICAgIG00X2lmKFskNF0sICwgOiwgWyQ0XSkKK2Vsc2UKKyAgICBtNF9pZihbJDVdLCAsIDosIFskNV0pCitmaQorXSkjIF9MVF9MSU5LRVJfT1BUSU9OCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwgW19MVF9MSU5LRVJfT1BUSU9OXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwgW10pCisKKworIyBMVF9DTURfTUFYX0xFTgorIy0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX0NNRF9NQVhfTEVOXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCisjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK0FDX01TR19DSEVDS0lORyhbdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHNdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfbWF4X2NtZF9sZW5dLCBbZG5sCisgIGk9MAorICB0ZXN0c3RyaW5nPSJBQkNEIgorCisgIGNhc2UgJGJ1aWxkX29zIGluCisgIG1zZG9zZGpncHAqKQorICAgICMgT24gREpHUFAsIHRoaXMgdGVzdCBjYW4gYmxvdyB1cCBwcmV0dHkgYmFkbHkgZHVlIHRvIHByb2JsZW1zIGluIGxpYmMKKyAgICAjIChhbnkgc2luZ2xlIGFyZ3VtZW50IGV4Y2VlZGluZyAyMDAwIGJ5dGVzIGNhdXNlcyBhIGJ1ZmZlciBvdmVycnVuCisgICAgIyBkdXJpbmcgZ2xvYiBleHBhbnNpb24pLiAgRXZlbiBpZiBpdCB3ZXJlIGZpeGVkLCB0aGUgcmVzdWx0IG9mIHRoaXMKKyAgICAjIGNoZWNrIHdvdWxkIGJlIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTIyODg7ICAgICMgMTJLIGlzIGFib3V0IHJpZ2h0CisgICAgOzsKKworICBnbnUqKQorICAgICMgVW5kZXIgR05VIEh1cmQsIHRoaXMgdGVzdCBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSBpcworICAgICMgbm8gbGltaXQgdG8gdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICMgTGlidG9vbCB3aWxsIGludGVycHJldCAtMSBhcyBubyBsaW1pdCB3aGF0c29ldmVyCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xOworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKKyAgICAjIE9uIFdpbjl4L01FLCB0aGlzIHRlc3QgYmxvd3MgdXAgLS0gaXQgc3VjY2VlZHMsIGJ1dCB0YWtlcworICAgICMgYWJvdXQgNSBtaW51dGVzIGFzIHRoZSB0ZXN0c3RyaW5nIGdyb3dzIGV4cG9uZW50aWFsbHkuCisgICAgIyBXb3JzZSwgc2luY2UgOXgvTUUgYXJlIG5vdCBwcmUtZW1wdGl2ZWx5IG11bHRpdGFza2luZywKKyAgICAjIHlvdSBlbmQgdXAgd2l0aCBhICJmcm96ZW4iIGNvbXB1dGVyLCBldmVuIHRob3VnaCB3aXRoIHBhdGllbmNlCisgICAgIyB0aGUgdGVzdCBldmVudHVhbGx5IHN1Y2NlZWRzICh3aXRoIGEgbWF4IGxpbmUgbGVuZ3RoIG9mIDI1NmspLgorICAgICMgSW5zdGVhZCwgbGV0J3MganVzdCBwdW50OiB1c2UgdGhlIG1pbmltdW0gbGluZWxlbmd0aCByZXBvcnRlZCBieQorICAgICMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zOiA4MTkyIChvbiBOVC8ySy9YUCkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBtaW50KikKKyAgICAjIE9uIE1pTlQgdGhpcyBjYW4gdGFrZSBhIGxvbmcgdGltZSBhbmQgcnVuIG91dCBvZiBtZW1vcnkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCisgICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG5ldGJzZCogfCBmcmVlYnNkKiB8IG9wZW5ic2QqIHwgZGFyd2luKiB8IGRyYWdvbmZseSopCisgICAgIyBUaGlzIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSAzODZCU0QsIGF0IGxlYXN0LiAgTGlrZWx5IGZ1cnRoZXIuCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsaWYgdGVzdCAteCAvdXNyL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC91c3Ivc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTY1NTM2CSMgdXNhYmxlIGRlZmF1bHQgZm9yIGFsbCBCU0RzCisgICAgZmkKKyAgICAjIEFuZCBhZGQgYSBzYWZldHkgem9uZQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICA7OworCisgIGludGVyaXgqKQorICAgICMgV2Uga25vdyB0aGUgdmFsdWUgMjYyMTQ0IGFuZCBoYXJkY29kZSBpdCB3aXRoIGEgc2FmZXR5IHpvbmUgKGxpa2UgQlNEKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbCSBdXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIGVsc2UKKyAgICAgICMgTWFrZSB0ZXN0c3RyaW5nIGEgbGl0dGxlIGJpZ2dlciBiZWZvcmUgd2UgZG8gYW55dGhpbmcgd2l0aCBpdC4KKyAgICAgICMgYSAxSyBzdHJpbmcgc2hvdWxkIGJlIGEgcmVhc29uYWJsZSBzdGFydC4KKyAgICAgIGZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA7IGRvCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgU0hFTEw9JHtTSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0KKyAgICAgICMgSWYgdGVzdCBpcyBub3QgYSBzaGVsbCBidWlsdC1pbiwgd2UnbGwgcHJvYmFibHkgZW5kIHVwIGNvbXB1dGluZyBhCisgICAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICAgIyB3ZSBjYW4ndCB0ZWxsLgorICAgICAgd2hpbGUgeyB0ZXN0ICJYImBmdW5jX2ZhbGxiYWNrX2VjaG8gIiR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCisJICAgICAgICAgPSAiWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciOyB9ID4vZGV2L251bGwgMj4mMSAmJgorCSAgICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAorICAgICAgZG8KKyAgICAgICAgaT1gZXhwciAkaSArIDFgCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgIyBPbmx5IGNoZWNrIHRoZSBzdHJpbmcgbGVuZ3RoIG91dHNpZGUgdGhlIGxvb3AuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgIlgkdGVzdHN0cmluZyIgOiAiLioiIDI+JjFgCisgICAgICB0ZXN0c3RyaW5nPQorICAgICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbgorICAgICAgIyBtYXNzaXZlIGFtb3VudHMgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUKKyAgICAgICMgbGlua2VyLiAgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK10pCitpZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJGx0X2N2X3N5c19tYXhfY21kX2xlbikKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KK19MVF9ERUNMKFtdLCBbbWF4X2NtZF9sZW5dLCBbMF0sCisgICAgW1doYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD9dKQorXSkjIExUX0NNRF9NQVhfTEVOCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbTFRfQ01EX01BWF9MRU5dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sIFtdKQorCisKKyMgX0xUX0hFQURFUl9ETEZDTgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0hFQURFUl9ETEZDTl0sCitbQUNfQ0hFQ0tfSEVBREVSUyhbZGxmY24uaF0sIFtdLCBbXSwgW0FDX0lOQ0xVREVTX0RFRkFVTFRdKWRubAorXSkjIF9MVF9IRUFERVJfRExGQ04KKworCisjIF9MVF9UUllfRExPUEVOX1NFTEYgKEFDVElPTi1JRi1UUlVFLCBBQ1RJT04tSUYtVFJVRS1XLVVTQ09SRSwKKyMgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OLUlGLUZBTFNFLCBBQ1RJT04tSUYtQ1JPU1MtQ09NUElMSU5HKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1RSWV9ETE9QRU5fU0VMRl0sCitbbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIFskNF0KK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorWyNsaW5lICRMSU5FTk8gImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdoZW4gLWZ2aXNiaWxpdHk9aGlkZGVuIGlzIHVzZWQsIGFzc3VtZSB0aGUgY29kZSBoYXMgYmVlbiBhbm5vdGF0ZWQKKyAgIGNvcnJlc3BvbmRpbmdseSBmb3IgdGhlIHN5bWJvbHMgbmVlZGVkLiAgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDMpKQoraW50IGZub3JkICgpIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpOworI2VuZGlmCisKK2ludCBmbm9yZCAoKSB7IHJldHVybiA0MjsgfQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZQorICAgICAgICB7CisJICBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSAgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAgICAgZWxzZSBwdXRzIChkbGVycm9yICgpKTsKKwl9CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwdXRzIChkbGVycm9yICgpKTsKKworICByZXR1cm4gc3RhdHVzOworfV0KK19MVF9FT0YKKyAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSAkMSA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSAkMiA7OworICAgICAgeCRsdF9kbHVua25vd258eCopICQzIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgICQzCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorXSkjIF9MVF9UUllfRExPUEVOX1NFTEYKKworCisjIExUX1NZU19ETE9QRU5fU0VMRgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9TWVNfRExPUEVOX1NFTEZdLAorW200X3JlcXVpcmUoW19MVF9IRUFERVJfRExGQ05dKWRubAoraWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCisgIGVuYWJsZV9kbG9wZW49dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KK2Vsc2UKKyAgbHRfY3ZfZGxvcGVuPW5vCisgIGx0X2N2X2Rsb3Blbl9saWJzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYmVvcyopCisgICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICA7OworCisgIG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBjeWd3aW4qKQorICAgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIDs7CisKKyAgZGFyd2luKikKKyAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKKyAgICBBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSxbCisgICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIF0pCisgICAgOzsKKworICAqKQorICAgIEFDX0NIRUNLX0ZVTkMoW3NobF9sb2FkXSwKKwkgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIl0sCisgICAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbc2hsX2xvYWRdLAorCSAgICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIl0sCisJW0FDX0NIRUNLX0ZVTkMoW2Rsb3Blbl0sCisJICAgICAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIl0sCisJICBbQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAorCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sCisJICAgIFtBQ19DSEVDS19MSUIoW3N2bGRdLCBbZGxvcGVuXSwKKwkJICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiXSwKKwkgICAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbZGxkX2xpbmtdLAorCQkgICAgW2x0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCJdKQorCSAgICAgIF0pCisJICAgIF0pCisJICBdKQorCV0pCisgICAgICBdKQorICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKKworICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorCisgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAorCSAgbHRfY3ZfZGxvcGVuX3NlbGYsIFtkbmwKKwkgIF9MVF9UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubywgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MpCisgICAgXSkKKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAorCSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljLCBbZG5sCisJICBfTFRfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8sICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MpCisgICAgICBdKQorICAgIGZpCisKKyAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZiBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKKyAgZXNhYworZmkKK19MVF9ERUNMKFtkbG9wZW5fc3VwcG9ydF0sIFtlbmFibGVfZGxvcGVuXSwgWzBdLAorCSBbV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkXSkKK19MVF9ERUNMKFtkbG9wZW5fc2VsZl0sIFtlbmFibGVfZGxvcGVuX3NlbGZdLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWRdKQorX0xUX0RFQ0woW2Rsb3Blbl9zZWxmX3N0YXRpY10sIFtlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljXSwgWzBdLAorCSBbV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkXSkKK10pIyBMVF9TWVNfRExPUEVOX1NFTEYKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0RMT1BFTl9TRUxGXSwgW0xUX1NZU19ETE9QRU5fU0VMRl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbXSkKKworCisjIF9MVF9DT01QSUxFUl9DX08oW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLWMgYW5kIC1vIGFyZSBzaW11bHRhbmVvdXNseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIuCisjIFRoaXMgbWFjcm8gZG9lcyBub3QgaGFyZCBjb2RlIHRoZSBjb21waWxlciBsaWtlIEFDX1BST0dfQ0NfQ19PLgorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9DX09dLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2lmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHRdLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpXSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT1ubworICAgJFJNIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkU0VEICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICRSTSBjb25mdGVzdCoKKyAgICMgU0dJIEMrKyBjb21waWxlciB3aWxsIGNyZWF0ZSBkaXJlY3Rvcnkgb3V0L2lpX2ZpbGVzLyBmb3IKKyAgICMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgorICAgdGVzdCAtZCBvdXQvaWlfZmlsZXMgJiYgJFJNIG91dC9paV9maWxlcy8qICYmIHJtZGlyIG91dC9paV9maWxlcworICAgJFJNIG91dC8qICYmIHJtZGlyIG91dAorICAgY2QgLi4KKyAgICRSTSAtciBjb25mdGVzdAorICAgJFJNIGNvbmZ0ZXN0KgorXSkKK19MVF9UQUdERUNMKFtjb21waWxlcl9jX29dLCBbbHRfY3ZfcHJvZ19jb21waWxlcl9jX29dLCBbMV0sCisJW0RvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz9dKQorXSkjIF9MVF9DT01QSUxFUl9DX08KKworCisjIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIGhhcmQgbGlua3MgdG8gbG9jayBzb21lIGZpbGVzIGlmIG5lZWRlZAorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9GSUxFX0xPQ0tTXSwKK1ttNF9yZXF1aXJlKFtfTFRfRU5BQkxFX0xPQ0tdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCitfTFRfQ09NUElMRVJfQ19PKFskMV0pCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSkiID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rc10pCisgIGhhcmRfbGlua3M9eWVzCisgICRSTSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIEFDX01TR19SRVNVTFQoWyRoYXJkX2xpbmtzXSkKKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBgLWMgLW8nLCBzbyBgbWFrZSAtaicgbWF5IGJlIHVuc2FmZV0pCisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCitfTFRfREVDTChbXSwgW25lZWRfbG9ja3NdLCBbMV0sIFtNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj9dKQorXSkjIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTCisKKworIyBfTFRfQ0hFQ0tfT0JKRElSCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ0hFQ0tfT0JKRElSXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yIG9iamRpcl0sIFtsdF9jdl9vYmpkaXJdLAorW3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBsdF9jdl9vYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgbHRfY3Zfb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGxdKQorb2JqZGlyPSRsdF9jdl9vYmpkaXIKK19MVF9ERUNMKFtdLCBbb2JqZGlyXSwgWzBdLAorICAgICAgICAgW1RoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlc10pZG5sCittNF9wYXR0ZXJuX2FsbG93KFtMVF9PQkpESVJdKWRubAorQUNfREVGSU5FX1VOUVVPVEVEKExUX09CSkRJUiwgIiRsdF9jdl9vYmpkaXIvIiwKKyAgW0RlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSBpbiB3aGljaCBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuXSkKK10pIyBfTFRfQ0hFQ0tfT0JKRElSCisKKworIyBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBoYXJkY29kaW5nIGF0dHJpYnV0ZXMuCittNF9kZWZ1bihbX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXNdKQorX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT0KK2lmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSIgfHwKKyAgIHRlc3QgLW4gIiRfTFRfVEFHVkFSKHJ1bnBhdGhfdmFyLCAkMSkiIHx8CisgICB0ZXN0ICJYJF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSkiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGVudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSkiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT11bnN1cHBvcnRlZAorZmkKK0FDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpXSkKKworaWYgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSkiID0gcmVsaW5rIHx8CisgICB0ZXN0ICIkX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSkiID0geWVzOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9hY3Rpb25dLCBbMF0sCisgICAgW0hvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlXSkKK10pIyBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgKKworCisjIF9MVF9DTURfU1RSSVBMSUIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DTURfU1RSSVBMSUJdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK3N0cmlwbGliPQorb2xkX3N0cmlwbGliPQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGVdKQoraWYgdGVzdCAtbiAiJFNUUklQIiAmJiAkU1RSSVAgLVYgMj4mMSB8ICRHUkVQICJHTlUgc3RyaXAiID4vZGV2L251bGw7IHRoZW4KKyAgdGVzdCAteiAiJG9sZF9zdHJpcGxpYiIgJiYgb2xkX3N0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC1kZWJ1ZyIKKyAgdGVzdCAteiAiJHN0cmlwbGliIiAmJiBzdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtdW5uZWVkZWQiCisgIEFDX01TR19SRVNVTFQoW3llc10pCitlbHNlCisjIEZJWE1FIC0gaW5zZXJ0IHNvbWUgcmVhbCB0ZXN0cywgaG9zdF9vcyBpc24ndCByZWFsbHkgZ29vZCBlbm91Z2gKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCisgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgorICAgICAgb2xkX3N0cmlwbGliPSIkU1RSSVAgLVMiCisgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgIGVsc2UKKyAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICBmaQorICAgIDs7CisgICopCisgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIDs7CisgIGVzYWMKK2ZpCitfTFRfREVDTChbXSwgW29sZF9zdHJpcGxpYl0sIFsxXSwgW0NvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3N0cmlwbGliXSwgWzFdKQorXSkjIF9MVF9DTURfU1RSSVBMSUIKKworCisjIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCittNF9kZWZ1bihbX0xUX1NZU19EWU5BTUlDX0xJTktFUl0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdKWRubAorQUNfTVNHX0NIRUNLSU5HKFtkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3NdKQorbTRfaWYoWyQxXSwKKwlbXSwgWworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGRhcndpbiopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8sL0xSLyIgOzsKKyAgICAqKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovIiA7OworICBlc2FjCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyogfCBjZWdjYyopIGx0X3NlZF9zdHJpcF9lcT0icyw9XChbW0EtWmEtel1dOlwpLFwxLGciIDs7CisgICAgKikgbHRfc2VkX3N0cmlwX2VxPSJzLD0vLC8sZyIgOzsKKyAgZXNhYworICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgYXdrICRsdF9hd2tfYXJnIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAkbHRfc2VkX3N0cmlwX2VxYAorICBjYXNlICRsdF9zZWFyY2hfcGF0aF9zcGVjIGluCisgICpcOyopCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICdzLzsvIC9nJ2AKKyAgICA7OworICAqKQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgIDs7CisgIGVzYWMKKyAgIyBPaywgbm93IHdlIGhhdmUgdGhlIHBhdGgsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHdlIGNhbiBzdGVwIHRocm91Z2ggaXQKKyAgIyBhbmQgYWRkIG11bHRpbGliIGRpciBpZiBuZWNlc3NhcnkuCisgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPQorICBsdF9tdWx0aV9vc19kaXI9YCRDQyAkQ1BQRkxBR1MgJENGTEFHUyAkTERGTEFHUyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5IDI+L2Rldi9udWxsYAorICBmb3IgbHRfc3lzX3BhdGggaW4gJGx0X3NlYXJjaF9wYXRoX3NwZWM7IGRvCisgICAgaWYgdGVzdCAtZCAiJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiOyB0aGVuCisgICAgICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIgorICAgIGVsc2UKKyAgICAgIHRlc3QgLWQgIiRsdF9zeXNfcGF0aCIgJiYgXAorCWx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoIgorICAgIGZpCisgIGRvbmUKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCBhd2sgJworQkVHSU4ge1JTPSIgIjsgRlM9Ii98XG4iO30geworICBsdF9mb289IiI7CisgIGx0X2NvdW50PTA7CisgIGZvciAobHRfaSA9IE5GOyBsdF9pID4gMDsgbHRfaS0tKSB7CisgICAgaWYgKCRsdF9pICE9ICIiICYmICRsdF9pICE9ICIuIikgeworICAgICAgaWYgKCRsdF9pID09ICIuLiIpIHsKKyAgICAgICAgbHRfY291bnQrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsdF9jb3VudCA9PSAwKSB7CisgICAgICAgICAgbHRfZm9vPSIvIiAkbHRfaSBsdF9mb287CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbHRfY291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobHRfZm9vICE9ICIiKSB7IGx0X2ZyZXFbW2x0X2Zvb11dKys7IH0KKyAgaWYgKGx0X2ZyZXFbW2x0X2Zvb11dID09IDEpIHsgcHJpbnQgbHRfZm9vOyB9Cit9J2AKKyAgIyBBV0sgcHJvZ3JhbSBhYm92ZSBlcnJvbmVvdXNseSBwcmVwZW5kcyAnLycgdG8gQzovZG9zL3BhdGhzCisgICMgZm9yIHRoZXNlIGhvc3RzLgorICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqIHwgY2VnY2MqKSBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHxcCisgICAgICAkU0VEICdzLC9cKFtbQS1aYS16XV06XCksXDEsZydgIDs7CisgIGVzYWMKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJGx0X05MMlNQYAorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaV0pCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4W1s0LTldXSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LltbMDFdXSB8IGFpeDQuW1swMV1dLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgJEdSRVAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIHBvd2VycGMpCisgICAgIyBTaW5jZSBKdWx5IDIwMDcgQW1pZ2FPUzQgb2ZmaWNpYWxseSBzdXBwb3J0cyAuc28gbGlicmFyaWVzLgorICAgICMgV2hlbiBjb21waWxpbmcgdGhlIGV4ZWN1dGFibGUsIGFkZCAtdXNlLWR5bmxkIC1Mc29ianM6IHRvIHRoZSBjb21waWxlbGluZS4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICA7OworICBtNjhrKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YGZ1bmNfZWNob19hbGwgIiRsaWIiIHwgJFNFRCAnXCcncyVeLiovXChbW14vXV0qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJFJNIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICAgIDs7CisgIGVzYWMKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworCisgIGNhc2UgJEdDQywkY2NfYmFzZW5hbWUgaW4KKyAgeWVzLCopCisgICAgIyBnY2MKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBpZiB0ZXN0IC1uICdcJyckc3RyaXBtZSdcJycgJiYgdGVzdCAtbiAnXCcnJHN0cmlwbGliJ1wnJzsgdGhlbgorICAgICAgICBldmFsICdcJyckc3RyaXBsaWIgXCRkbGRpci8kZGxuYW1lJ1wnJyB8fCBleGl0IFwkPzsKKyAgICAgIGZpJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRSTSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCittNF9pZihbJDFdLCBbXSxbCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL3Vzci9saWIvdzMyYXBpIl0pCisgICAgICA7OworICAgIG1pbmd3KiB8IGNlZ2NjKikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgICA7OworCisgICosY2wqKQorICAgICMgTmF0aXZlIE1TVkMKKyAgICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5kbGwubGliJworCisgICAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgICBtaW5ndyopCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9CisgICAgICBsdF9zYXZlX2lmcz0kSUZTCisgICAgICBJRlM9JzsnCisgICAgICBmb3IgbHRfcGF0aCBpbiAkTElCCisgICAgICBkbworICAgICAgICBJRlM9JGx0X3NhdmVfaWZzCisgICAgICAgICMgTGV0IERPUyB2YXJpYWJsZSBleHBhbnNpb24gcHJpbnQgdGhlIHNob3J0IDguMyBzdHlsZSBmaWxlIG5hbWUuCisgICAgICAgIGx0X3BhdGg9YGNkICIkbHRfcGF0aCIgMj4vZGV2L251bGwgJiYgY21kIC8vQyAiZm9yICVpIGluICgiLiIpIGRvIEBlY2hvICV+c2kiYAorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgJGx0X3BhdGgiCisgICAgICBkb25lCisgICAgICBJRlM9JGx0X3NhdmVfaWZzCisgICAgICAjIENvbnZlcnQgdG8gTVNZUyBzdHlsZS4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgc2VkIC1lICdzfFxcXFx8L3xnJyAtZSAnc3wgXFwoW1thLXpBLVpdXVxcKTp8IC9cXDF8ZycgLWUgJ3N8XiB8fCdgCisgICAgICA7OworICAgIGN5Z3dpbiopCisgICAgICAjIENvbnZlcnQgdG8gdW5peCBmb3JtLCB0aGVuIHRvIGRvcyBmb3JtLCB0aGVuIGJhY2sgdG8gdW5peCBmb3JtCisgICAgICAjIGJ1dCB0aGlzIHRpbWUgZG9zIHN0eWxlIChubyBzcGFjZXMhKSBzbyB0aGF0IHRoZSB1bml4IGZvcm0gbG9va3MKKyAgICAgICMgbGlrZSAvY3lnZHJpdmUvYy9QUk9HUkF+MTovY3lnZHIuLi4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkTElCImAKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gY3lncGF0aCAtLXBhdGggLS1kb3MgIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIDI+L2Rldi9udWxsYAorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJExJQiIKKyAgICAgIGlmICRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IFskR1JFUCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGxdOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICAjIEZJWE1FOiBmaW5kIHRoZSBzaG9ydCBuYW1lIG9yIHRoZSBwYXRoIGNvbXBvbmVudHMsIGFzIHNwYWNlcyBhcmUKKyAgICAgICMgY29tbW9uLiAoZS5nLiAiUHJvZ3JhbSBGaWxlcyIgLT4gIlBST0dSQX4xIikKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRSTSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxpbmsuZXhlJworICAgIDs7CisKKyAgKikKKyAgICAjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICAgOzsKKyAgZXNhYworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCittNF9pZihbJDFdLCBbXSxbCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xvY2FsL2xpYiJdKQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFtbMTIzXV0qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLltbMDFdXSogfCBmcmVlYnNkZWxmMy5bWzAxXV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1syLTldXSogfCBmcmVlYnNkZWxmMy5bWzItOV1dKiB8IFwKKyAgZnJlZWJzZDQuW1swLTVdXSB8IGZyZWVic2RlbGY0LltbMC01XV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hhaWt1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIHJ1bnRpbWVfbG9hZGVyIgorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy9ib290L2hvbWUvY29uZmlnL2xpYiAvYm9vdC9jb21tb24vbGliIC9ib290L3N5c3RlbS9saWInCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICBocHBhKjY0KikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUsIC4uLgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgIyBvciBmYWlscyBvdXRyaWdodCwgc28gb3ZlcnJpZGUgYXRvbWljYWxseToKKyAgaW5zdGFsbF9vdmVycmlkZV9tb2RlPTU1NQorICA7OworCitpbnRlcml4W1szLTldXSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKworICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKKyAgQUNfQ0FDSEVfVkFMKFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGhdLAorICAgIFtsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICBzYXZlX2xpYmRpcj0kbGliZGlyCisgICAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpXCI7IFwKKwkgTERGTEFHUz1cIlwkTERGTEFHUyAkX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSlcIiIKKyAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCisgICAgICBbQVNfSUYoWyAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGxdLAorCSBbbHRfY3Zfc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllc10pXSkKKyAgICBMREZMQUdTPSRzYXZlX0xERkxBR1MKKyAgICBsaWJkaXI9JHNhdmVfbGliZGlyCisgICAgXSkKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRsdF9jdl9zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyAyPi9kZXYvbnVsbCIsIFxbJF0yKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcWyRdMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLzsvXlsJIF0qaHdjYXBbCSBdL2Q7cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7cy8iLy9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuW1s4OV1dIHwgb3BlbmJzZDIuW1s4OV1dLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCityZG9zKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJworICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit0cGYqKQorICAjIFRQRiBpcyBhIGNyb3NzLXRhcmdldCBvbmx5LiAgUHJlZmVycmVkIGNyb3NzLWhvc3QgPSBHTlUvTGludXguCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorZmkKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCisKK19MVF9ERUNMKFtdLCBbdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmtdLCBbMV0sCisgICAgW1ZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorICAgIHJlc3RvcmVkIGF0IGxpbmsgdGltZV0pCitfTFRfREVDTChbXSwgW25lZWRfbGliX3ByZWZpeF0sIFswXSwKKyAgICBbRG8gd2UgbmVlZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzP10pCitfTFRfREVDTChbXSwgW25lZWRfdmVyc2lvbl0sIFswXSwgW0RvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/XSkKK19MVF9ERUNMKFtdLCBbdmVyc2lvbl90eXBlXSwgWzBdLCBbTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGVdKQorX0xUX0RFQ0woW10sIFtydW5wYXRoX3Zhcl0sIFswXSwgIFtTaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGVdKQorX0xUX0RFQ0woW10sIFtzaGxpYnBhdGhfdmFyXSwgWzBdLFtTaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoXSwgWzBdLAorICAgIFtJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/XSkKK19MVF9ERUNMKFtdLCBbbGlibmFtZV9zcGVjXSwgWzFdLCBbRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXhdKQorX0xUX0RFQ0woW10sIFtsaWJyYXJ5X25hbWVzX3NwZWNdLCBbMV0sCisgICAgW1tMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorICAgIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUVdXSkKK19MVF9ERUNMKFtdLCBbc29uYW1lX3NwZWNdLCBbMV0sCisgICAgW1tUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZV1dKQorX0xUX0RFQ0woW10sIFtpbnN0YWxsX292ZXJyaWRlX21vZGVdLCBbMV0sCisgICAgW1Blcm1pc3Npb24gbW9kZSBvdmVycmlkZSBmb3IgaW5zdGFsbGF0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtwb3N0aW5zdGFsbF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kIHRvIHVzZSBhZnRlciBpbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW3Bvc3R1bmluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgdW5pbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW2ZpbmlzaF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnldKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfZXZhbF0sIFsxXSwKKyAgICBbW0FzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorICAgIG5vdCBzaG93bl1dKQorX0xUX0RFQ0woW10sIFtoYXJkY29kZV9pbnRvX2xpYnNdLCBbMF0sCisgICAgW1doZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNdLCBbMl0sCisgICAgW0NvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitdKSMgX0xUX1NZU19EWU5BTUlDX0xJTktFUgorCisKKyMgX0xUX1BBVEhfVE9PTF9QUkVGSVgoVE9PTCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbX0xUX1BBVEhfVE9PTF9QUkVGSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKK1tjYXNlICRNQUdJQ19DTUQgaW4KK1tbXFwvKl0gfCAgPzpbXFwvXSpdKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitkbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KK2RubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKK2RubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCisgIGFjX2R1bW15PSJtNF9pZihbJDJdLCAsICRQQVRILCBbJDJdKSIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJDE7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyQxIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworX0xUX0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWNdKQorTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRNQUdJQ19DTUQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorX0xUX0RFQ0woW10sIFtNQUdJQ19DTURdLCBbMF0sCisJIFtVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiXSlkbmwKK10pIyBfTFRfUEFUSF9UT09MX1BSRUZJWAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX1BBVEhfVE9PTF9QUkVGSVhdLCBbX0xUX1BBVEhfVE9PTF9QUkVGSVhdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW10pCisKKworIyBfTFRfUEFUSF9NQUdJQworIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pemUgYSBzaGFyZWQgbGlicmFyeQorbTRfZGVmdW4oW19MVF9QQVRIX01BR0lDXSwKK1tfTFRfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCitpZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBfTFRfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQorICBlbHNlCisgICAgTUFHSUNfQ01EPToKKyAgZmkKK2ZpCitdKSMgX0xUX1BBVEhfTUFHSUMKKworCisjIExUX1BBVEhfTEQKKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCitBQ19ERUZVTihbTFRfUEFUSF9MRF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSlkbmwKKworQUNfQVJHX1dJVEgoW2dudS1sZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251LWxkXSwKKwlbYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIEA8OkBkZWZhdWx0PW5vQDo+QF0pXSwKKyAgICBbdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzXSwKKyAgICBbd2l0aF9nbnVfbGQ9bm9dKWRubAorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSAkQ0NdKQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKKyAgICAgIHJlX2RpcmVsdD0nL1tbXi9dXVtbXi9dXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitfTFRfUEFUSF9MRF9HTlUKK0FDX1NVQlNUKFtMRF0pCisKK19MVF9UQUdERUNMKFtdLCBbTERdLCBbMV0sIFtUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzXSkKK10pIyBMVF9QQVRIX0xECisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitBVV9BTElBUyhbQUNfUFJPR19MRF0sIFtMVF9QQVRIX0xEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xEXSwgW10pCisKKworIyBfTFRfUEFUSF9MRF9HTlUKKyMtIC0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BBVEhfTERfR05VXSwKK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWNdKQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCitdKSMgX0xUX1BBVEhfTERfR05VCisKKworIyBfTFRfQ01EX1JFTE9BRAorIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIHJlbG9hZCBmbGFnIGZvciBsaW5rZXIKKyMgICAtLSBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgorbTRfZGVmdW4oW19MVF9DTURfUkVMT0FEXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAorICBbbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJ10pCityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9ZmFsc2UKKyAgICBmaQorICAgIDs7CisgIGRhcndpbiopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBlbHNlCisgICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZmkKKyAgICA7OworZXNhYworX0xUX1RBR0RFQ0woW10sIFtyZWxvYWRfZmxhZ10sIFsxXSwgW0hvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXNdKWRubAorX0xUX1RBR0RFQ0woW10sIFtyZWxvYWRfY21kc10sIFsyXSlkbmwKK10pIyBfTFRfQ01EX1JFTE9BRAorCisKKyMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCittNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSkKK0FDX0NBQ0hFX0NIRUNLKFtob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXNdLAorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QsCitbbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4W1s0LTldXSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpW1s0NV1dKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLAorICAjIHVubGVzcyB3ZSBmaW5kICdmaWxlJywgZm9yIGV4YW1wbGUgYmVjYXVzZSB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLgorICAjIGZ1bmNfd2luMzJfbGliaWQgYXNzdW1lcyBCU0Qgbm0sIHNvIGRpc2FsbG93IGl0IGlmIHVzaW5nIE1TIGR1bXBiaW4uCisgIGlmICggdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiQlNEIG5tIiAmJiBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICBlbHNlCisgICAgIyBLZWVwIHRoaXMgcGF0dGVybiBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiBmdW5jX3dpbjMyX2xpYmlkLgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IChwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpP3xwZS1hcm0td2luY2V8cGUteDg2LTY0KScKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIGZpCisgIDs7CisKK2NlZ2NjKikKKyAgIyB1c2UgdGhlIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4gU2VlIG1pbmd3Ki4KKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGUtYXJtLS4qbGl0dGxlKC4qYXJjaGl0ZWN0dXJlOiBhcm0pPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgaSo4NiApCisgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgorICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KKyAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pW1szLTldXTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JworICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICBmaQorICA7OworCitnbnUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitoYWlrdSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfEVMRi1bWzAtOV1dW1swLTldXSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEZbIC1dWzAtOV1bMC05XSkoLWJpdCk/KCBbTE1dU0IpPyBzaGFyZWQgb2JqZWN0KCBmaWxlKT9bLCAtXSogUEEtUklTQyBbMC05XVwuWzAtOV0nXQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAorICAgIDs7CisgICopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV1cLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgICA7OworICBlc2FjCisgIDs7CisKK2ludGVyaXhbWzMtOV1dKikKKyAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfFwuYSkkJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRMRCBpbgorICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OworICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7CisgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK25ldGJzZCopCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworbmV3b3M2KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbworICA7OworCisqbnRvKiB8ICpxbngqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitvcGVuYnNkKikKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworcmRvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NvbGFyaXMqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bWzAtOV1dW1swLTldXSogVmVyc2lvbiBbWzAtOV1dJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIHNpZW1lbnMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBwYykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKwordHBmKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKK2VzYWMKK10pCisKK2ZpbGVfbWFnaWNfZ2xvYj0KK3dhbnRfbm9jYXNlZ2xvYj1ubworaWYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBtaW5ndyogfCBwdzMyKikKKyAgICBpZiAoIHNob3B0IHwgZ3JlcCBub2Nhc2VnbG9iICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB3YW50X25vY2FzZWdsb2I9eWVzCisgICAgZWxzZQorICAgICAgZmlsZV9tYWdpY19nbG9iPWBlY2hvIGFBYkJjQ2REZUVmRmdHaEhpSWpKa0tsTG1Nbk5vT3BQcVFyUnNTdFR1VXZWd1d4WHlZelogfCAkU0VEIC1lICJzL1woLi5cKS9zXC9bW1wxXV1cL1tbXDFdXVwvZzsvZyJgCisgICAgZmkKKyAgICA7OworICBlc2FjCitmaQorCitmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAordGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCisKK19MVF9ERUNMKFtdLCBbZGVwbGlic19jaGVja19tZXRob2RdLCBbMV0sCisgICAgW01ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzXSkKK19MVF9ERUNMKFtdLCBbZmlsZV9tYWdpY19jbWRdLCBbMV0sCisgICAgW0NvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyJdKQorX0xUX0RFQ0woW10sIFtmaWxlX21hZ2ljX2dsb2JdLCBbMV0sCisgICAgW0hvdyB0byBmaW5kIHBvdGVudGlhbCBmaWxlcyB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID0gImZpbGVfbWFnaWMiXSkKK19MVF9ERUNMKFtdLCBbd2FudF9ub2Nhc2VnbG9iXSwgWzFdLAorICAgIFtGaW5kIHBvdGVudGlhbCBmaWxlcyB1c2luZyBub2Nhc2VnbG9iIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPSAiZmlsZV9tYWdpYyJdKQorXSkjIF9MVF9DSEVDS19NQUdJQ19NRVRIT0QKKworCisjIExUX1BBVEhfTk0KKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byBhIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgorQUNfREVGVU4oW0xUX1BBVEhfTk1dLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKV0sIGx0X2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIDogJHtsdF9jdl9wYXRoX05NPW5vfQorZmldKQoraWYgdGVzdCAiJGx0X2N2X3BhdGhfTk0iICE9ICJubyI7IHRoZW4KKyAgTk09IiRsdF9jdl9wYXRoX05NIgorZWxzZQorICAjIERpZG4ndCBmaW5kIGFueSBCU0QgY29tcGF0aWJsZSBuYW1lIGxpc3RlciwgbG9vayBmb3IgZHVtcGJpbi4KKyAgaWYgdGVzdCAtbiAiJERVTVBCSU4iOyB0aGVuIDoKKyAgICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgZWxzZQorICAgIEFDX0NIRUNLX1RPT0xTKERVTVBCSU4sIFtkdW1wYmluICJsaW5rIC1kdW1wIl0sIDopCisgICAgY2FzZSBgJERVTVBCSU4gLXN5bWJvbHMgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKyAgICAqQ09GRiopCisgICAgICBEVU1QQklOPSIkRFVNUEJJTiAtc3ltYm9scyIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIERVTVBCSU49OgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIEFDX1NVQlNUKFtEVU1QQklOXSkKKyAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgorICAgIE5NPSIkRFVNUEJJTiIKKyAgZmkKK2ZpCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCitBQ19TVUJTVChbTk1dKQorX0xUX0RFQ0woW10sIFtOTV0sIFsxXSwgW0EgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyXSlkbmwKKworQUNfQ0FDSEVfQ0hFQ0soW3RoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2VdLCBbbHRfY3Zfbm1faW50ZXJmYWNlXSwKKyAgW2x0X2N2X25tX2ludGVyZmFjZT0iQlNEIG5tIgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOiRMSU5FTk86ICRhY19jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6JExJTkVOTzogJE5NIFxcXCJjb25mdGVzdC4kYWNfb2JqZXh0XFxcIlwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAoZXZhbCAiJE5NIFwiY29uZnRlc3QuJGFjX29iamV4dFwiIiAyPmNvbmZ0ZXN0LmVyciA+IGNvbmZ0ZXN0Lm91dCkKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIChldmFsIGVjaG8gIlwiXCRhc19tZTokTElORU5POiBvdXRwdXRcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgY2F0IGNvbmZ0ZXN0Lm91dCA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGlmICRHUkVQICdFeHRlcm5hbC4qc29tZV92YXJpYWJsZScgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3Zfbm1faW50ZXJmYWNlPSJNUyBkdW1wYmluIgorICBmaQorICBybSAtZiBjb25mdGVzdCpdKQorXSkjIExUX1BBVEhfTk0KKworIyBPbGQgbmFtZXM6CitBVV9BTElBUyhbQU1fUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK0FVX0FMSUFTKFtBQ19QUk9HX05NXSwgW0xUX1BBVEhfTk1dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX05NXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX1BST0dfTk1dLCBbXSkKKworIyBfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBob3cgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeQorIyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBsaW5rIGxpYnJhcnkuCisjICAtLSBQT1JUTUUgZmlsbCBpbiB3aXRoIHRoZSBkeW5hbWljIGxpYnJhcnkgY2hhcmFjdGVyaXN0aWNzCittNF9kZWZ1bihbX0xUX0NIRUNLX1NIQVJFRExJQl9GUk9NX0xJTktMSUJdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKQorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRExMVE9PTF0pCitBQ19DQUNIRV9DSEVDSyhbaG93IHRvIGFzc29jaWF0ZSBydW50aW1lIGFuZCBsaW5rIGxpYnJhcmllc10sCitsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZCwKK1tsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0ndW5rbm93bicKKworY2FzZSAkaG9zdF9vcyBpbgorY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAjIHR3byBkaWZmZXJlbnQgc2hlbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gbHRtYWluLnNoCisgICMgZGVjaWRlIHdoaWNoIHRvIHVzZSBiYXNlZCBvbiBjYXBhYmlsaXRpZXMgb2YgJERMTFRPT0wKKyAgY2FzZSBgJERMTFRPT0wgLS1oZWxwIDI+JjFgIGluCisgICotLWlkZW50aWZ5LXN0cmljdCopCisgICAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9ZnVuY19jeWdtaW5nX2RsbF9mb3JfaW1wbGliCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD1mdW5jX2N5Z21pbmdfZGxsX2Zvcl9pbXBsaWJfZmFsbGJhY2sKKyAgICA7OworICBlc2FjCisgIDs7CisqKQorICAjIGZhbGxiYWNrOiBhc3N1bWUgbGlua2xpYiBJUyBzaGFyZWRsaWIKKyAgbHRfY3Zfc2hhcmVkbGliX2Zyb21fbGlua2xpYl9jbWQ9IiRFQ0hPIgorICA7OworZXNhYworXSkKK3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kPSRsdF9jdl9zaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZAordGVzdCAteiAiJHNoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kIiAmJiBzaGFyZWRsaWJfZnJvbV9saW5rbGliX2NtZD0kRUNITworCitfTFRfREVDTChbXSwgW3NoYXJlZGxpYl9mcm9tX2xpbmtsaWJfY21kXSwgWzFdLAorICAgIFtDb21tYW5kIHRvIGFzc29jaWF0ZSBzaGFyZWQgYW5kIGxpbmsgbGlicmFyaWVzXSkKK10pIyBfTFRfQ0hFQ0tfU0hBUkVETElCX0ZST01fTElOS0xJQgorCisKKyMgX0xUX1BBVEhfTUFOSUZFU1RfVE9PTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGxvY2F0ZSB0aGUgbWFuaWZlc3QgdG9vbAorbTRfZGVmdW4oW19MVF9QQVRIX01BTklGRVNUX1RPT0xdLAorW0FDX0NIRUNLX1RPT0woTUFOSUZFU1RfVE9PTCwgbXQsIDopCit0ZXN0IC16ICIkTUFOSUZFU1RfVE9PTCIgJiYgTUFOSUZFU1RfVE9PTD1tdAorQUNfQ0FDSEVfQ0hFQ0soW2lmICRNQU5JRkVTVF9UT09MIGlzIGEgbWFuaWZlc3QgdG9vbF0sIFtsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2xdLAorICBbbHRfY3ZfcGF0aF9tYWluZmVzdF90b29sPW5vCisgIGVjaG8gIiRhc19tZTokTElORU5POiAkTUFOSUZFU1RfVE9PTCAnLT8nIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICRNQU5JRkVTVF9UT09MICctPycgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGlmICRHUkVQICdNYW5pZmVzdCBUb29sJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX21haW5mZXN0X3Rvb2w9eWVzCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0Kl0pCitpZiB0ZXN0ICJ4JGx0X2N2X3BhdGhfbWFpbmZlc3RfdG9vbCIgIT0geHllczsgdGhlbgorICBNQU5JRkVTVF9UT09MPToKK2ZpCitfTFRfREVDTChbXSwgW01BTklGRVNUX1RPT0xdLCBbMV0sIFtNYW5pZmVzdCB0b29sXSlkbmwKK10pIyBfTFRfUEFUSF9NQU5JRkVTVF9UT09MCisKKworIyBMVF9MSUJfTQorIyAtLS0tLS0tLQorIyBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CitBQ19ERUZVTihbTFRfTElCX01dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0xJQk09CitjYXNlICRob3N0IGluCisqLSotYmVvcyogfCAqLSotY2VnY2MqIHwgKi0qLWN5Z3dpbiogfCAqLSotaGFpa3UqIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCisgICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAorICA7OworKi1uY3Itc3lzdjQuMyopCisgIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSIkTElCTSAtbG0iKQorICA7OworKikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iLWxtIikKKyAgOzsKK2VzYWMKK0FDX1NVQlNUKFtMSUJNXSkKK10pIyBMVF9MSUJfTQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0NIRUNLX0xJQk1dLCBbTFRfTElCX01dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwgW10pCisKKworIyBfTFRfQ09NUElMRVJfTk9fUlRUSShbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfTk9fUlRUSV0sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgbnZjYyopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLVhjb21waWxlciAtZm5vLWJ1aWx0aW4nIDs7CisgICopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJyA7OworICBlc2FjCisKKyAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLAorICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zLAorICAgIFstZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW10sCisgICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIl0pCitmaQorX0xUX1RBR0RFQ0woW25vX2J1aWx0aW5fZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFsxXSwKKwlbQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9uc10pCitdKSMgX0xUX0NPTVBJTEVSX05PX1JUVEkKKworCisjIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK0FDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdF0pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLAorWworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtbX0EtWmEtel1dW1tfQS1aYS16MC05XV0qXCknCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbW0JDRFRdXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKKyAgOzsKK2hwdXgqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgIHN5bWNvZGU9J1tbQUJDREVHUlNUXV0nCisgIGZpCisgIDs7Citpcml4KiB8IG5vbnN0b3B1eCopCisgIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKKyAgOzsKK29zZiopCisgIHN5bWNvZGU9J1tbQkNERUdRUlNUXV0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW1tCRFJUXV0nCisgIDs7CitzY28zLjJ2NSopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y0LjJ1dzIqKQorICBzeW1jb2RlPSdbW0RUXV0nCisgIDs7CitzeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICBzeW1jb2RlPSdbW0FCRFRdXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbW0RGTlNUVV1dJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2Nhc2UgYCROTSAtViAyPiYxYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJyA7OworZXNhYworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgorIyBTb21lIHN5c3RlbXMgKGVzcC4gb24gaWE2NCkgbGluayBkYXRhIGFuZCBjb2RlIHN5bWJvbHMgZGlmZmVyZW50bHksCisjIHNvIHVzZSB0aGlzIGdlbmVyYWwgYXBwcm9hY2guCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXClbWyBdXSokLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKVtbIF1dKiQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChsaWJbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wibGliXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGJ1aWxkX29zIGluCittaW5ndyopCisgIG9wdF9jcj1gJEVDSE8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcnNjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGlmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgICAgIyBGYWtlIGl0IGZvciBkdW1wYmluIGFuZCBzYXkgVCBmb3IgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24KKyAgICAjIGFuZCBEIGZvciBhbnkgZ2xvYmFsIHZhcmlhYmxlLgorICAgICMgQWxzbyBmaW5kIEMrKyBhbmQgX19mYXN0Y2FsbCBzeW1ib2xzIGZyb20gTVNWQysrLAorICAgICMgd2hpY2ggc3RhcnQgd2l0aCBAIG9yID8uCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJEFXSyBbJyJcCisiICAgICB7bGFzdF9zZWN0aW9uPXNlY3Rpb247IHNlY3Rpb249XCQgM307IlwKKyIgICAgIC9TZWN0aW9uIGxlbmd0aCAuKiNyZWxvY3MuKihwaWNrIGFueSkve2hpZGVbbGFzdF9zZWN0aW9uXT0xfTsiXAorIiAgICAgXCQgMCF+L0V4dGVybmFsICpcfC97bmV4dH07IlwKKyIgICAgIC8gMCsgVU5ERUYgL3tuZXh0fTsgLyBVTkRFRiBcKFtefF1cKSooKS97bmV4dH07IlwKKyIgICAgIHtpZihoaWRlW3NlY3Rpb25dKSBuZXh0fTsiXAorIiAgICAge2Y9MH07IFwkIDB+L1woXCkuKlx8L3tmPTF9OyB7cHJpbnRmIGYgPyBcIlQgXCIgOiBcIkQgXCJ9OyJcCisiICAgICB7c3BsaXQoXCQgMCwgYSwgL1x8fFxyLyk7IHNwbGl0KGFbMl0sIHMpfTsiXAorIiAgICAgc1sxXX4vXltAP10ve3ByaW50IHNbMV0sIHNbMV07IG5leHR9OyJcCisiICAgICBzWzFdfnByZngge3NwbGl0KHNbMV0sdCxcIkBcIik7IHByaW50IHRbMV0sIHN1YnN0cih0WzFdLGxlbmd0aChwcmZ4KSl9IlwKKyIgICAgICcgcHJmeD1eJGFjX3N5bXByZnhdIgorICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKltbCSBdXVwoJHN5bWNvZGUkc3ltY29kZSpcKVtbCSBdXVtbCSBdXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKyAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJy8gX19nbnVfbHRvL2QnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCk7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KK19MVF9FT0YKKworICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiIFw+ICRubGlzdCkgJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKy8qIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgYmV0d2VlbiBsaWJ0b29sLm00LCBsdG1haW4sIGx0X3N5c3RlbS5oLCBhbmQgdGVzdHMuICAqLworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkKKy8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UgcnVudGltZQorICAgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uIG9uIHBzZXVkby1yZWxvY3MuICAqLworIyBkZWZpbmUgTFRAJnRAX0RMU1lNX0NPTlNUCisjZWxpZiBkZWZpbmVkKF9fb3NmX18pCisvKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhLiAgKi8KKyMgZGVmaW5lIExUQCZ0QF9ETFNZTV9DT05TVAorI2Vsc2UKKyMgZGVmaW5lIExUQCZ0QF9ETFNZTV9DT05TVCBjb25zdAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX0xUX0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8X0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK0xUQCZ0QF9ETFNZTV9DT05TVCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICAgICAgICphZGRyZXNzOworfQorbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tbXV0gPQoreworICB7ICJAUFJPR1JBTUAiLCAodm9pZCAqKSAwIH0sCitfTFRfRU9GCisJICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKKwkgIGNhdCA8PFxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyAgezAsICh2b2lkICopIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitfTFRfRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0CisJICBsdF9nbG9ic3ltX3NhdmVfTElCUz0kTElCUworCSAgbHRfZ2xvYnN5bV9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisJICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSIKKwkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKwkgICAgcGlwZV93b3Jrcz15ZXMKKwkgIGZpCisJICBMSUJTPSRsdF9nbG9ic3ltX3NhdmVfTElCUworCSAgQ0ZMQUdTPSRsdF9nbG9ic3ltX3NhdmVfQ0ZMQUdTCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCogY29uZnRzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGJyZWFrCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorXSkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KK2ZpCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChmYWlsZWQpCitlbHNlCisgIEFDX01TR19SRVNVTFQob2spCitmaQorCisjIFJlc3BvbnNlIGZpbGUgc3VwcG9ydC4KK2lmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZWxpZiAkTk0gLS1oZWxwIDI+L2Rldi9udWxsIHwgZ3JlcCAnW1tAXV1GSUxFJyA+L2Rldi9udWxsOyB0aGVuCisgIG5tX2ZpbGVfbGlzdF9zcGVjPSdAJworZmkKKworX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfcGlwZV0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwgWzFdLAorICAgIFtUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwKKyAgICBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcl0pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4XSwKKyAgICBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyIHdoZW4gbGliIHByZWZpeCBpcyBuZWVkZWRdKQorX0xUX0RFQ0woW10sIFtubV9maWxlX2xpc3Rfc3BlY10sIFsxXSwKKyAgICBbU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzIGZvciAkTk1dKQorXSkgIyBfTFRfQ01EX0dMT0JBTF9TWU1CT0xTCisKKworIyBfTFRfQ09NUElMRVJfUElDKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX1BJQ10sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0KK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKworbTRfaWYoWyQxXSwgW0NYWF0sIFsKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKyAgICAqZGpncHAqKQorICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgICA7OworICAgIGhhaWt1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBIYWlrdS4KKyAgICAgICMgVGhlICItc3RhdGljIiBmbGFnIGV4aXN0cywgYnV0IGlzIGJyb2tlbi4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKyAgICAgIDs7CisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqcW54KiB8ICpudG8qKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeFtbNC05XV0qKQorCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisJZmkKKwk7OworICAgICAgY2hvcnVzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCWN4Y2g2OCopCisJICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgIyBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorCSMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKwkjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorCW00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwkgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorCTs7CisgICAgICBkZ3V4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZWMrKyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKwkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCisJOzsKKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICBmaQorCSAgICA7OworCSAgYUNDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGludGVyaXgqKQorCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQorCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgICMgS0FJIEMrKyBDb21waWxlcgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJICAgIDs7CisJICBlY3BjKiApCisJICAgICMgb2xkIEludGVsIEMrKyBmb3IgeDg2XzY0IHdoaWNoIHN0aWxsIHN1cHBvcnRlZCAtS1BJQy4KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKwkgICAgOzsKKwkgIGljcGMqICkKKwkgICAgIyBJbnRlbCBDKyssIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgorCSAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKwkgICAgOzsKKwkgIHBnQ0MqIHwgcGdjcHAqKQorCSAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgeGxjKiB8IHhsQyogfCBiZ3hsW1tjQ11dKiB8IG1waXhsW1tjQ11dKikKKwkgICAgIyBJQk0gWEwgOC4wLCA5LjAgb24gUFBDIGFuZCBCbHVlR2VuZQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcXBpYycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctcXN0YXRpY2xpbmsnCisJICAgIDs7CisJICAqKQorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkgICAgKlN1blwgQyopCisJICAgICAgIyBTdW4gQysrIDUuOQorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGx5bnhvcyopCisJOzsKKyAgICAgIG04OGsqKQorCTs7CisgICAgICBtdnMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBjeHgqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1XIGMsZXhwb3J0YWxsJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIG5ldGJzZCopCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKiB8IHN1bkNDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworCTs7CisgICAgZXNhYworICBmaQorXSwKK1sKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBoYWlrdSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSGFpa3UuCisgICAgICAjIFRoZSAiLXN0YXRpYyIgZmxhZyBleGlzdHMsIGJ1dCBpcyBicm9rZW4uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisgICAgICA7OworCisgICAgaHB1eCopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgNjQtYml0IFBBIEhQLVVYLCBidXQgbm90IGZvciAzMi1iaXQKKyAgICAgICMgUEEgSFAtVVguICBPbiBJQTY0IEhQLVVYLCBQSUMgaXMgdGhlIGRlZmF1bHQgYnV0IHRoZSBwaWMgZmxhZworICAgICAgIyBzZXRzIHRoZSBkZWZhdWx0IFRMUyBtb2RlbCBhbmQgYWZmZWN0cyBpbmxpbmluZy4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgIG52Y2MqKSAjIEN1ZGEgQ29tcGlsZXIgRHJpdmVyIDIuMgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1YbGlua2VyICcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVhjb21waWxlciAtZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251IHwga29wZW5zb2xhcmlzKi1nbnUpCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgIyBvbGQgSW50ZWwgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisgICAgICBlY2MqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBpY2MgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisgICAgICAjIElDQyAxMCBkb2Vzbid0IGFjY2VwdCAtS1BJQyBhbnkgbW9yZS4KKyAgICAgIGljYyogfCBpZm9ydCopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIExhaGV5IEZvcnRyYW4gOC4xLgorICAgICAgbGY5NSopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctLXNoYXJlZCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy0tc3RhdGljJworCTs7CisgICAgICBuYWdmb3IqKQorCSMgTkFHIEZvcnRyYW4gY29tcGlsZXIKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLC1XbCwsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCTs7CisgICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KiB8IHBnZm9ydHJhbiopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICB4bCogfCBiZ3hsKiB8IGJnZiogfCBtcGl4bCopCisJIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xLCAxMS4xIG9uIFBQQyBhbmQgQmx1ZUdlbmUKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJworCTs7CisgICAgICAqKQorCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEYqIHwgKlN1bipGb3J0cmFuKikKKwkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9JycKKwkgIDs7CisJKlN1blwgQyopCisJICAjIFN1biBDIDUuOQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHJkb3MqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGY3NyogfCBmOTAqIHwgZjk1KiB8IHN1bmY3NyogfCBzdW5mOTAqIHwgc3VuZjk1KikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJzs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJzs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtjb25mb3JtX3BpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICB1bmljb3MqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICA7OworICAqKQorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pIgorICAgIDs7Citlc2FjCisKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQ10sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljLCAkMSldLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSldKQorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSRfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgd29ya3NdLAorICAgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSldLAorICAgIFskX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpQCZ0QG00X2lmKFskMV0sW10sWyAtRFBJQ10sW200X2lmKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKKyAgICBbY2FzZSAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKKyAgICAgZXNhY10sCisgICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCitmaQorX0xUX1RBR0RFQ0woW3BpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgWzFdLAorCVtBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHNdKQorCitfTFRfVEFHREVDTChbd2xdLCBbbHRfcHJvZ19jb21waWxlcl93bF0sIFsxXSwKKwlbSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlcl0pCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpXCIKK19MVF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sCisgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MsICQxKSwKKyAgJGx0X3RtcF9zdGF0aWNfZmxhZywKKyAgW10sCisgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9XSkKK19MVF9UQUdERUNMKFtsaW5rX3N0YXRpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgWzFdLAorCVtDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nXSkKK10pIyBfTFRfQ09NUElMRVJfUElDCisKKworIyBfTFRfTElOS0VSX1NITElCUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK200X2RlZnVuKFtfTFRfTElOS0VSX1NITElCU10sCitbQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKK200X3JlcXVpcmUoW19MVF9QQVRIX01BTklGRVNUX1RPT0xdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKK200X2lmKFskMV0sIFtDWFhdLCBbCisgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQorICBjYXNlICRob3N0X29zIGluCisgIGFpeFtbNC05XV0qKQorICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKyAgICAjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwgZGVmaW5lZAorICAgICMgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisgICAgaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGZpCisgICAgOzsKKyAgcHczMiopCisgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9IiRsdGRsbF9jbWRzIgorICAgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICBjbCopIDs7CisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvO3MvXi4qW1sgXV1fX25tX19cKFtbXiBdXSpcKVtbIF1dW1teIF1dKi9cMSBEQVRBLzsvXklbWyBdXS9kOy9eW1tBSVRXXV1bWyBdXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAgICAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ1tfXStHTE9CQUxfT0ZGU0VUX1RBQkxFX3xbX10rR0xPQkFMX19bRklEXV8uKnxbX10raGVhZF9bQS1aYS16MC05X10rX2RsbHxbQS1aYS16MC05X10rX2RsbF9pbmFtZSddCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICAqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgOzsKKyAgZXNhYworXSwgWworICBydW5wYXRoX3Zhcj0KKyAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCisgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KKyAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKKyAgX0xUX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KKyAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisgICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KKyAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0CisgICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCisgICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCisgICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KK2RubCBOb3RlIGFsc28gYWRqdXN0IGV4Y2x1ZGVfZXhwc3ltcyBmb3IgQysrIGFib3ZlLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBlc2FjCisKKyAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKworICAjIE9uIHNvbWUgdGFyZ2V0cywgR05VIGxkIGlzIGNvbXBhdGlibGUgZW5vdWdoIHdpdGggdGhlIG5hdGl2ZSBsaW5rZXIKKyAgIyB0aGF0IHdlJ3JlIGJldHRlciBvZmYgdXNpbmcgdGhlIG5hdGl2ZSBpbnRlcmZhY2UgZm9yIGJvdGguCisgIGx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPW5vCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorCSMgVGhlIEFJWCBwb3J0IG9mIEdOVSBsZCBoYXMgYWx3YXlzIGFzcGlyZWQgdG8gY29tcGF0aWJpbGl0eQorCSMgd2l0aCB0aGUgbmF0aXZlIGxpbmtlci4gIEhvd2V2ZXIsIGFzIHRoZSB3YXJuaW5nIGluIHRoZSBHTlUgbGQKKwkjIGJsb2NrIHNheXMsIHZlcnNpb25zIGJlZm9yZSAyLjE5LjUqIGNvdWxkbid0IHJlYWxseSBjcmVhdGUgd29ya2luZworCSMgc2hhcmVkIGxpYnJhcmllcywgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJmYWNlIHVzZWQuCisJY2FzZSBgJExEIC12IDI+JjFgIGluCisJICAqXCBcKEdOVVwgQmludXRpbHNcKVwgMi4xOS41KikgOzsKKwkgICpcIFwoR05VXCBCaW51dGlsc1wpXCAyLltbMi05XV0qKSA7OworCSAgKlwgXChHTlVcIEJpbnV0aWxzXClcIFtbMy05XV0qKSA7OworCSAgKikKKwkgICAgbHRfdXNlX2dudV9sZF9pbnRlcmZhY2U9eWVzCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqKQorCWx0X3VzZV9nbnVfbGRfaW50ZXJmYWNlPXllcworCTs7CisgICAgZXNhYworICBmaQorCisgIGlmIHRlc3QgIiRsdF91c2VfZ251X2xkX2ludGVyZmFjZSIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCisgICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCisgICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgorICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgKkdOVVwgZ29sZCopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4W1szLTldXSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjE5LCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIGluc3RhbGwgYmludXRpbHMKKyoqKiAyLjIwIG9yIGFib3ZlLCBvciBtb2RpZnkgeW91ciBQQVRIIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZC4KKyoqKiBZb3Ugd2lsbCB0aGVuIG5lZWQgdG8gcmVzdGFydCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLgorCitfTFRfRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPScnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtYWxsLXN5bWJvbHMnCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS87cy9eLipbWyBdXV9fbm1fX1woW1teIF1dKlwpW1sgXV1bW14gXV0qL1wxIERBVEEvOy9eSVtbIF1dL2Q7L15bW0FJVFddXVtbIF1dL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnW19dK0dMT0JBTF9PRkZTRVRfVEFCTEVffFtfXStHTE9CQUxfX1tGSURdXy4qfFtfXStoZWFkX1tBLVphLXowLTlfXStfZGxsfFtBLVphLXowLTlfXStfZGxsX2luYW1lJ10KKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwllbHNlCisJICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZml+CisJJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBoYWlrdSopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIDs7CisKKyAgICBnbnUqIHwgbGludXgqIHwgdHBmKiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgICAgIHRtcF9kaWV0PW5vCisgICAgICBpZiB0ZXN0ICIkaG9zdF9vcyIgPSBsaW51eC1kaWV0bGliYzsgdGhlbgorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBkaWV0XCAqKSB0bXBfZGlldD15ZXM7OwkjIGxpbnV4LWRpZXRsaWJjIHdpdGggc3RhdGljIGxpbmtpbmcgKCFkaWV0LWR5bikKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEVHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGwgXAorCSAmJiB0ZXN0ICIkdG1wX2RpZXQiID0gbm8KKyAgICAgIHRoZW4KKwl0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwl0bXBfc2hhcmVkZmxhZz0nLXNoYXJlZCcKKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKyAgICAgICAgcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSogfCBwZ2ZvcnRyYW4qKQorCQkJCQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycworCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJbGY5NSopCQkJCSMgTGFoZXkgRm9ydHJhbiA4LjEKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKwkgIHRtcF9zaGFyZWRmbGFnPSctLXNoYXJlZCcgOzsKKwl4bFtbY0NdXSogfCBiZ3hsW1tjQ11dKiB8IG1waXhsW1tjQ11dKikgIyBJQk0gWEwgQyA4LjAgb24gUFBDIChkZWFsIHdpdGggeGxmIGJlbG93KQorCSAgdG1wX3NoYXJlZGZsYWc9Jy1xbWtzaHJvYmonCisJICB0bXBfYWRkZmxhZz0gOzsKKwludmNjKikJIyBDdWRhIENvbXBpbGVyIERyaXZlciAyLjIKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCSAgOzsKKwllc2FjCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCQkJIyBTdW4gQyA1LjkKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyBmdW5jX2VjaG9fYWxsIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJKlN1blwgRiopCQkJIyBTdW4gRm9ydHJhbiA4LjMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwllc2FjCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworICAgICAgICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisgICAgICAgIGZpCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCXhsZiogfCBiZ2YqIHwgYmd4bGYqIHwgbXBpeGxmKikKKwkgICMgSUJNIFhMIEZvcnRyYW4gMTAuMSBvbiBQUEMgY2Fubm90IGNyZWF0ZSBzaGFyZWQgbGlicyBpdHNlbGYKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlIC0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgLW8gJGxpYicKKwkgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgICRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgIGZpCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGlmICRMRCAtdiAyPiYxIHwgJEdSRVAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xW1swLTVdXS4qKQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKwkgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisJICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworCSAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFtbNC05XV0qKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwkjIEFsc28sIEFJWCBubSB0cmVhdHMgd2VhayBkZWZpbmVkIHN5bWJvbHMgbGlrZSBvdGhlciBnbG9iYWwKKwkjIGRlZmluZWQgc3ltYm9scywgd2hlcmVhcyBHTlUgbm0gbWFya3MgdGhlbSBhcyAiVyIuCisJaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpIHx8IChcJCAyID09ICJXIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJleHBhbGwnCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKyAgICAgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQorICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGZ1bmNfZWNob19hbGwgIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisJZWxzZQorCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKwkgIyBlbXB0eSBleGVjdXRhYmxlLgorCSBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWChbJDFdKQorCSBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJworCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorCSAgICAjIFdlIG9ubHkgdXNlIHRoaXMgY29kZSBmb3IgR05VIGxkcyB0aGF0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgZWxzZQorCSAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCisJICBmaQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJzZGlbWzQ1XV0qKQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgY2wqKQorCSMgTmF0aXZlIE1TVkMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwlfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworCV9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nQCcKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWJzIC1XbCwtZGxsfmxpbmtuYW1lcz0nCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgIHNlZCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBlbHNlCisJICAgIHNlZCAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICBmaX4KKwkgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgIGxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYnVpbGQgYSBzdGF0aWMgbGliIGlmIHdlIGJ1aWxkIGEgRExMLgorCSMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9J3RydWUnCisJX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEsREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bW0FJVFddXVtbIF1dL3MvLipbWyBdXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCSMgRG9uJ3QgdXNlIHJhbmxpYgorCV9MVF9UQUdWQVIob2xkX3Bvc3RpbnN0YWxsX2NtZHMsICQxKT0nY2htb2QgNjQ0ICRvbGRsaWInCisJX0xUX1RBR1ZBUihwb3N0bGlua19jbWRzLCAkMSk9J2x0X291dHB1dGZpbGU9IkBPVVRQVVRAIn4KKwkgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iQFRPT0xfT1VUUFVUQCJ+CisJICBjYXNlICRsdF9vdXRwdXRmaWxlIGluCisJICAgICouZXhlfCouRVhFKSA7OworCSAgICAqKQorCSAgICAgIGx0X291dHB1dGZpbGU9IiRsdF9vdXRwdXRmaWxlLmV4ZSIKKwkgICAgICBsdF90b29sX291dHB1dGZpbGU9IiRsdF90b29sX291dHB1dGZpbGUuZXhlIgorCSAgICAgIDs7CisJICBlc2FjfgorCSAgaWYgdGVzdCAiJE1BTklGRVNUX1RPT0wiICE9ICI6IiAmJiB0ZXN0IC1mICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7IHRoZW4KKwkgICAgJE1BTklGRVNUX1RPT0wgLW1hbmlmZXN0ICIkbHRfdG9vbF9vdXRwdXRmaWxlLm1hbmlmZXN0IiAtb3V0cHV0cmVzb3VyY2U6IiRsdF90b29sX291dHB1dGZpbGUiIHx8IGV4aXQgMTsKKwkgICAgJFJNICIkbHRfb3V0cHV0ZmlsZS5tYW5pZmVzdCI7CisJICBmaScKKwk7OworICAgICAgKikKKwkjIEFzc3VtZSBNU1ZDIHdyYXBwZXIKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCWxpYmV4dD1saWIKKwkjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKwlzaHJleHRfY21kcz0iLmRsbCIKKwkjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBmdW5jX2VjaG9fYWxsICIkZGVwbGlicyIgfCAkU0VEICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisJIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKwlfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKwkjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorCV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisJX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBmcmVlYnNkMSopCisgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nK2IgJGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCW00X2lmKCQxLCBbXSwgWworCSAgIyBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgMTEuMDAgY29tcGlsZXIgZG8gbm90IHVuZGVyc3RhbmQgLWIgeWV0CisJICAjIChIUDkyNDUzLTAxIEEuMTEuMDEuMjAgZG9lc24ndCwgSFA5MjQ1My0wMSBCLjExLlguMzUxNzUtMzUxNzYuR1AgZG9lcykKKwkgIF9MVF9MSU5LRVJfT1BUSU9OKFtpZiAkQ0MgdW5kZXJzdGFuZHMgLWJdLAorCSAgICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfX2IsICQxKSwgWy1iXSwKKwkgICAgW19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJ10sCisJICAgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJ10pXSwKKwkgIFtfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyddKQorCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKwkjIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgbGFuZ3VhZ2VzLCBzbyBubyBwZXItdGFnIGNhY2hlIHZhcmlhYmxlLgorCUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSAkaG9zdF9vcyBsaW5rZXIgYWNjZXB0cyAtZXhwb3J0ZWRfc3ltYm9sXSwKKwkgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbF0sCisJICBbc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKwkgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisJICAgQUNfTElOS19JRkVMU0UoCisJICAgICBbQUNfTEFOR19TT1VSQ0UoCisJICAgICAgICBbQUNfTEFOR19DQVNFKFtDXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbQysrXSwgW1tpbnQgZm9vICh2b2lkKSB7IHJldHVybiAwOyB9XV0sCisJCQkgICAgICBbRm9ydHJhbiA3N10sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0sCisJCQkgICAgICBbRm9ydHJhbl0sIFtbCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgZW5kXV0pXSldLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD15ZXNdLAorCSAgICAgIFtsdF9jdl9pcml4X2V4cG9ydGVkX3N5bWJvbD1ub10pCisgICAgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiXSkKKwlpZiB0ZXN0ICIkbHRfY3ZfaXJpeF9leHBvcnRlZF9zeW1ib2wiID0geWVzOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgIDs7CisKKyAgICBvcGVuYnNkKikKKyAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwllbHNlCisJICBjYXNlICRob3N0X29zIGluCisJICAgb3BlbmJzZFtbMDFdXS4qIHwgb3BlbmJzZDIuW1swLTddXSB8IG9wZW5ic2QyLltbMC03XV0uKikKKwkgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICAgOzsKKwkgICAqKQorCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgICA7OworCSAgZXNhYworCWZpCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckRUNITyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZWNobyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICA7OworCisgICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IHByaW50ZiAiJXNcXG4iICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAkY29tcGlsZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JFJNICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXogZGVmcycKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJd2xhcmM9JyR7d2x9JworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQgJHBpY19mbGFnICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisgICAgICBlbHNlCisJY2FzZSBgJENDIC1WIDI+JjFgIGluCisJKiJDb21waWxlcnMgNS4wIiopCisJICB3bGFyYz0nJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwkqKQorCSAgd2xhcmM9JyR7d2x9JworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKyAgICAgICopCisJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLiAgR0NDIGRpc2NhcmRzIGl0IHdpdGhvdXQgYCR3bCcsCisJIyBidXQgaXMgY2FyZWZ1bCBlbm91Z2ggbm90IHRvIHJlb3JkZXIuCisJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwlpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJZWxzZQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCisJIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubworCSMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCkKKyAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisJc25pKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorCTs7CisgICAgICBlc2FjCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgICAjIGFzIC16IGRlZnMuCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0IHgkaG9zdF92ZW5kb3IgPSB4c25pOyB0aGVuCisgICAgICBjYXNlICRob3N0IGluCisgICAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmxhcmdlZHluc3ltJworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKK10pCitBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCit0ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK19MVF9UQUdWQVIod2l0aF9nbnVfbGQsICQxKT0kd2l0aF9nbnVfbGQKKworX0xUX0RFQ0woW10sIFtsaWJleHRdLCBbMF0sIFtPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIildKWRubAorX0xUX0RFQ0woW10sIFtzaHJleHRfY21kc10sIFsxXSwgW1NoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpXSlkbmwKK19MVF9ERUNMKFtdLCBbZXh0cmFjdF9leHBzeW1zX2NtZHNdLCBbMl0sCisgICAgW1RoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmVdKQorCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKSIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgY2FzZSAkX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW5dLAorCVtsdF9jdl9dX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpLAorCVskUk0gY29uZnRlc3QqCisJZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKwlpZiBBQ19UUllfRVZBTChhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorCSAgc29uYW1lPWNvbmZ0ZXN0CisJICBsaWI9Y29uZnRlc3QKKwkgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorCSAgZGVwbGlicz0KKwkgIHdsPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKQorCSAgcGljX2ZsYWc9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKQorCSAgY29tcGlsZXJfZmxhZ3M9LXYKKwkgIGxpbmtlcl9mbGFncz0tdgorCSAgdmVyc3RyaW5nPQorCSAgb3V0cHV0X29iamRpcj0uCisJICBsaWJuYW1lPWNvbmZ0ZXN0CisJICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKwkgIGlmIEFDX1RSWV9FVkFMKF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpCisJICB0aGVuCisJICAgIGx0X2N2X1tdX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisJICBlbHNlCisJICAgIGx0X2N2X1tdX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgZmkKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorCWZpCisJJFJNIGNvbmZ0ZXN0KgorCV0pCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9JGx0X2N2X1tdX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworX0xUX1RBR0RFQ0woW2J1aWxkX2xpYnRvb2xfbmVlZF9sY10sIFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFswXSwKKyAgICBbV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllc10pCitfTFRfVEFHREVDTChbYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwKKyAgICBbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFswXSwKKyAgICBbV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpY10pCitfTFRfVEFHREVDTChbXSwgW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVuc10pCitfTFRfVEFHREVDTChbXSwgW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXNdKQorX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9uZWVkc19vYmplY3RdLCBbMV0sCisgICAgW1doZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5XSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFsyXSwKKyAgICBbQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgWzJdLAorICAgIFtDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX1RBR0RFQ0woW10sIFthcmNoaXZlX2NtZHNdLCBbMl0sIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX1RBR0RFQ0woW10sIFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworICAgIGEgc2hhcmVkIGFyY2hpdmUuXSkKK19MVF9UQUdERUNMKFtdLCBbbW9kdWxlX2V4cHN5bV9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFt3aXRoX2dudV9sZF0sIFsxXSwKKyAgICBbV2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBHTlUgbGQgb3Igbm90XSkKK19MVF9UQUdERUNMKFtdLCBbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbMV0sCisgICAgW0ZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0XSkKK19MVF9UQUdERUNMKFtdLCBbbm9fdW5kZWZpbmVkX2ZsYWddLCBbMV0sCisgICAgW0ZsYWcgdGhhdCBlbmZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9sc10pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbMV0sCisgICAgW0ZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorICAgIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbMV0sCisgICAgW1tJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkKKyAgICBkdXJpbmcgbGlua2luZy4gIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdF1dKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0XSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcworICAgICJhYnNvbHV0ZSIsIGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nICR7c2hsaWJwYXRoX3Zhcn0gaWYgdGhlCisgICAgbGlicmFyeSBpcyByZWxvY2F0ZWRdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9taW51c19MXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIGxpYnJhcnkgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkCisgICAgYWdhaW5zdCBpdF0pCitfTFRfVEFHREVDTChbXSwgW2luaGVyaXRfcnBhdGhdLCBbMF0sCisgICAgW1NldCB0byB5ZXMgaWYgbGlua2VyIGFkZHMgcnVudGltZSBwYXRocyBvZiBkZXBlbmRlbnQgbGlicmFyaWVzCisgICAgdG8gcnVudGltZSBwYXRoIGxpc3RdKQorX0xUX1RBR0RFQ0woW10sIFtsaW5rX2FsbF9kZXBsaWJzXSwgWzBdLAorICAgIFtXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXNdKQorX0xUX1RBR0RFQ0woW10sIFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZF0pCitfTFRfVEFHREVDTChbXSwgW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbMl0sCisgICAgW1RoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtleGNsdWRlX2V4cHN5bXNdLCBbMV0sCisgICAgW1N5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtpbmNsdWRlX2V4cHN5bXNdLCBbMV0sCisgICAgW1N5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZF0pCitfTFRfVEFHREVDTChbXSwgW3ByZWxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXNdKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0bGlua19jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGZpbmlzaGluZyBsaW5raW5nIHByb2dyYW1zXSkKK19MVF9UQUdERUNMKFtdLCBbZmlsZV9saXN0X3NwZWNdLCBbMV0sCisgICAgW1NwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlc10pCitkbmwgRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKK2RubCBfTFRfVEFHREVDTChbXSwgW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFsxXSwKK2RubCAgICBbQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQgc2FmZSBvYmplY3RzXSkKK10pIyBfTFRfTElOS0VSX1NITElCUworCisKKyMgX0xUX0xBTkdfQ19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgQyBjb21waWxlciBhcmUgc3VpdGFibHkKKyMgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRyB0byB3cml0ZQorIyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfQ19DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK2x0X3NhdmVfQ0M9IiRDQyIKK0FDX0xBTkdfUFVTSChDKQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKCl7cmV0dXJuKDApO30nCisKK19MVF9UQUdfQ09NUElMRVIKKyMgU2F2ZSB0aGUgZGVmYXVsdCBjb21waWxlciwgc2luY2UgaXQgZ2V0cyBvdmVyd3JpdHRlbiB3aGVuIHRoZSBvdGhlcgorIyB0YWdzIGFyZSBiZWluZyB0ZXN0ZWQsIGFuZCBfTFRfVEFHVkFSKGNvbXBpbGVyLCBbXSkgaXMgYSBOT1AuCitjb21waWxlcl9ERUZBVUxUPSRDQworCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgoraWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisgIExUX1NZU19ETE9QRU5fU0VMRgorICBfTFRfQ01EX1NUUklQTElCCisKKyAgIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0CisgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgZmkKKyAgICA7OworCisgIGFpeFtbNC05XV0qKQorICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgIF9MVF9DT05GSUcoJDEpCitmaQorQUNfTEFOR19QT1AKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBfTFRfTEFOR19DX0NPTkZJRworCisKKyMgX0xUX0xBTkdfQ1hYX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMrKyBjb21waWxlciBhcmUgc3VpdGFibHkKKyMgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRyB0byB3cml0ZQorIyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfQ1hYX0NPTkZJR10sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfUEFUSF9NQU5JRkVTVF9UT09MXSlkbmwKK2lmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIEFDX1BST0dfQ1hYQ1BQCitlbHNlCisgIF9sdF9jYXVnaHRfQ1hYX2Vycm9yPXllcworZmkKKworQUNfTEFOR19QVVNIKEMrKykKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKHJlbG9hZF9mbGFnLCAkMSk9JHJlbG9hZF9mbGFnCitfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JHJlbG9hZF9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQysrIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jcHAKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMrKyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIENYWCBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oaW50LCBjaGFyICpbW11dKSB7IHJldHVybigwKTsgfScKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9JENDCisgIGx0X3NhdmVfQ0ZMQUdTPSRDRkxBR1MKKyAgbHRfc2F2ZV9MRD0kTEQKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBHQ0M9JEdYWAorICBsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorICBsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCisgIGZpCisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wYXRoX0xECisgIGZpCisgIHRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCisgIENDPSR7Q1hYLSJjKysifQorICBDRkxBR1M9JENYWEZMQUdTCisgIGNvbXBpbGVyPSRDQworICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCisgIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdoZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisgICAgIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQorICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCisgICAgZWxzZQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KKworICAgICAgTFRfUEFUSF9MRAorCisgICAgICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKKyAgICAgICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgJHBpY19mbGFnIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDICRwaWNfZmxhZyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKyAgICAgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAgICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bworICAgICAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQorICAgICAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8CisJICAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgICAgIGZpCisgICAgICBlbHNlCisgICAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICAgIHdsYXJjPQorCisgICAgICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCisgICAgICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCisgICAgICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgorICAgICAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgICBmaQorCisgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCisgICAgZWxzZQorICAgICAgR1hYPW5vCisgICAgICB3aXRoX2dudV9sZD1ubworICAgICAgd2xhcmM9CisgICAgZmkKKworICAgICMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKyAgICAgIGFpeFtbNC05XV0qKQorICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKyAgICAgICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKyAgICAgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzIzXV18YWl4NC5bWzIzXV0uKnxhaXhbWzUtOV1dKikKKwkgICAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICAgICAgY2FzZSAkbGRfZmxhZyBpbgorCSAgICAgICotYnJ0bCopCisJICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICAgICAgYnJlYWsKKwkgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIDs7CisgICAgICAgICAgZXNhYworCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICAgIGZpCisKKyAgICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nJHt3bH0tZiwnCisKKyAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKyAgICAgICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKyAgICAgICAgICAjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8ICRHUkVQIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCSAgdGhlbgorCSAgICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwkgICAgOgorCSAgZWxzZQorCSAgICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKKwkgICAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorCSAgZmkKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgIyBub3QgdXNpbmcgZ2NjCisgICAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJICAjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworICAgICAgICAgIGVsc2UKKwkgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICAgIGVsc2UKKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgICBmaQorICAgICAgICAgIGZpCisgICAgICAgIGZpCisKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmV4cGFsbCcKKyAgICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0bworCSMgZXhwb3J0LgorICAgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKyAgICAgICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisgICAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCisgICAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5CisgICAgICAgICAgIyBleGVjdXRhYmxlLgorICAgICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYKFskMV0pCisgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisKKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZnVuY19lY2hvX2FsbCAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorICAgICAgICAgIGVsc2UKKwkgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgoWyQxXSkKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJworCSAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisJICAgICAgIyBXZSBvbmx5IHVzZSB0aGlzIGNvZGUgZm9yIEdOVSBsZHMgdGhhdCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZS4KKwkgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICBlbHNlCisJICAgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCisJICAgIGZpCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkgICAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkCisJICAgICMgbGlicmFyaWVzLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIDs7CisKKyAgICAgIGJlb3MqKQorCWlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWVsc2UKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisKKyAgICAgIGNob3J1cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgKikKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJY2FzZSAkR1hYLCRjY19iYXNlbmFtZSBpbgorCSxjbCogfCBubyxjbCopCisJICAjIE5hdGl2ZSBNU1ZDCisJICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisJICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyAnCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9J0AnCisJICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorCSAgbGliZXh0PWxpYgorCSAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisJICBzaHJleHRfY21kcz0iLmRsbCIKKwkgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRjb21waWxlcl9mbGFncyAkZGVwbGlicyAtV2wsLWRsbH5saW5rbmFtZXM9JworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgICAgJFNFRCAtbiAtZSAncy9cXFxcXFxcKC4qXFxcXFxcXCkvLWxpbmtcXFwgLUVYUE9SVDpcXFxcXFxcMS8nIC1lICcxXFxcIXAnIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHA7CisJICAgIGVsc2UKKwkgICAgICAkU0VEIC1lICdzL1xcXFxcXFwoLipcXFxcXFxcKS8tbGlua1xcXCAtRVhQT1JUOlxcXFxcXFwxLycgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cDsKKwkgICAgZml+CisJICAgICRDQyAtbyAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZSAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgJGRlcGxpYnMgIkAkdG9vbF9vdXRwdXRfb2JqZGlyJHNvbmFtZS5leHAiIC1XbCwtRExMLC1JTVBMSUI6IiR0b29sX291dHB1dF9vYmpkaXIkbGlibmFtZS5kbGwubGliIn4KKwkgICAgbGlua25hbWVzPScKKwkgICMgVGhlIGxpbmtlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgc3RhdGljIGxpYiBpZiB3ZSBidWlsZCBhIERMTC4KKwkgICMgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9J3RydWUnCisJICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKwkgICMgRG9uJ3QgdXNlIHJhbmxpYgorCSAgX0xUX1RBR1ZBUihvbGRfcG9zdGluc3RhbGxfY21kcywgJDEpPSdjaG1vZCA2NDQgJG9sZGxpYicKKwkgIF9MVF9UQUdWQVIocG9zdGxpbmtfY21kcywgJDEpPSdsdF9vdXRwdXRmaWxlPSJAT1VUUFVUQCJ+CisJICAgIGx0X3Rvb2xfb3V0cHV0ZmlsZT0iQFRPT0xfT1VUUFVUQCJ+CisJICAgIGNhc2UgJGx0X291dHB1dGZpbGUgaW4KKwkgICAgICAqLmV4ZXwqLkVYRSkgOzsKKwkgICAgICAqKQorCQlsdF9vdXRwdXRmaWxlPSIkbHRfb3V0cHV0ZmlsZS5leGUiCisJCWx0X3Rvb2xfb3V0cHV0ZmlsZT0iJGx0X3Rvb2xfb3V0cHV0ZmlsZS5leGUiCisJCTs7CisJICAgIGVzYWN+CisJICAgIGZ1bmNfdG9fdG9vbF9maWxlICIkbHRfb3V0cHV0ZmlsZSJ+CisJICAgIGlmIHRlc3QgIiRNQU5JRkVTVF9UT09MIiAhPSAiOiIgJiYgdGVzdCAtZiAiJGx0X291dHB1dGZpbGUubWFuaWZlc3QiOyB0aGVuCisJICAgICAgJE1BTklGRVNUX1RPT0wgLW1hbmlmZXN0ICIkbHRfdG9vbF9vdXRwdXRmaWxlLm1hbmlmZXN0IiAtb3V0cHV0cmVzb3VyY2U6IiRsdF90b29sX291dHB1dGZpbGUiIHx8IGV4aXQgMTsKKwkgICAgICAkUk0gIiRsdF9vdXRwdXRmaWxlLm1hbmlmZXN0IjsKKwkgICAgZmknCisJICA7OworCSopCisJICAjIGcrKworCSAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKwkgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1hbGwtc3ltYm9scycKKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworCSAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisKKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSAgICAjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgICAgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgZWxzZQorCSAgICAgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgIGZpfgorCSAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJICBlbHNlCisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgIGZpCisJICA7OworCWVzYWMKKwk7OworICAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCisJOzsKKworICAgICAgZGd1eCopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgZWMrKyopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBmcmVlYnNkW1sxMl1dKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZQorCSMgc3dpdGNoIHRvIEVMRgorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QtZWxmKikKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAgICAgIyBjb252ZW50aW9ucworICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgICAgICA7OworCisgICAgICBnbnUqKQorICAgICAgICA7OworCisgICAgICBoYWlrdSopCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDkqKQorICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkgICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKyAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICBhQ0MqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorICAgICAgICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKyAgICAgICAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICMgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBocHV4MTAqfGhwdXgxMSopCisgICAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworICAgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisJICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGFDQyopCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgaHBwYSo2NCopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgIGlhNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICAqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGZ1bmNfZWNob19hbGwgIiRsaXN0IicKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICBpYTY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHBpY19mbGFnICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgICopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwaWNfZmxhZyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICBlc2FjCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBpbnRlcml4W1szLTldXSopCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisJIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorCSMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKwkjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisJIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworCSMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU0dJIEMrKworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtYWxsIC1tdWx0aWdvdCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICItc2V0X3ZlcnNpb24gJHZlcnN0cmluZyJgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZnVuY19lY2hvX2FsbCAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nImAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICBlbHNlCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAtbyAkbGliJworCSAgICAgIGZpCisJICAgIGZpCisJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUgfCBrb3BlbnNvbGFyaXMqLWdudSkKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgJEdSRVAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBmdW5jX2VjaG9fYWxsICIkbGlzdCInCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqICkKKwkgICAgIyBJbnRlbCBDKysKKwkgICAgd2l0aF9nbnVfbGQ9eWVzCisJICAgICMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCisJICAgICMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCisJICAgICMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCisJICAgIGNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSAgICAgICoiVmVyc2lvbiA3LiIqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgICAqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgorCSAgICAgICAgdG1wX2lkeW49CisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCQkgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKKwkJZXNhYworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICBlc2FjCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICA7OworICAgICAgICAgIHBnQ0MqIHwgcGdjcHAqKQorICAgICAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgY2FzZSBgJENDIC1WYCBpbgorCSAgICAqcGdDQ1wgW1sxLTVdXS4qIHwgKnBnY3BwXCBbWzEtNV1dLiopCisJICAgICAgX0xUX1RBR1ZBUihwcmVsaW5rX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9ianMgJGxpYm9ianMgJGNvbXBpbGVfZGVwbGlic34KKwkJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgIicKKwkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9sZG9ianMkb2xkX2RlcGxpYnN+CisJCSRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgfgorCQkkUkFOTElCICRvbGRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgorCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgorCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8IHNvcnQgfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICAgIDs7CisJICAgICopICMgVmVyc2lvbiA2IGFuZCBhYm92ZSB1c2Ugd2VhayBzeW1ib2xzCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgZXNhYworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgZnVuY19lY2hvX2FsbCBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgICAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJworCisJICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCJgOyB0ZW1wbGlzdD1gZnVuY19lY2hvX2FsbCAiJHRlbXBsaXN0IiB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiWCRsaXN0IiB8ICRYc2VkJworCSAgICA7OworCSAgeGwqIHwgbXBpeGwqIHwgYmd4bCopCisJICAgICMgSUJNIFhMIDguMCBvbiBQUEMsIHdpdGggR05VIGxkCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQllY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICAgIGZpCisJICAgIDs7CisJICAqKQorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkgICAgKlN1blwgQyopCisJICAgICAgIyBTdW4gQysrIDUuOQorCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzJworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7IGZ1bmNfZWNob19hbGwgXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCisKKwkgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgc29tZXRoaW5nIGJhc2VkIG9uCisJICAgICAgIyAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMQorCSAgICAgICMgd291bGQgYmUgYmV0dGVyLgorCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdmdW5jX2VjaG9fYWxsJworCisJICAgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisKKyAgICAgIGx5bnhvcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworCisgICAgICBtODhrKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworCisgICAgICBtdnMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGN4eCopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisJICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBuZXRic2QqKQorICAgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCisJICB3bGFyYz0KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlmaQorCSMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCBjb25mdGVzdC4kb2JqZXh0IHwgJFNFRCAtZSAiczotbGdjYyAtbGMgLWxnY2M6OiInCisJOzsKKworICAgICAgKm50byogfCAqcW54KikKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKwk7OworCisgICAgICBvcGVuYnNkMiopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGZhaXJseSBicm9rZW4KKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgb3BlbmJzZCopCisJaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGZpCisJICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1mdW5jX2VjaG9fYWxsCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIEtDQyopCisJICAgICMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSAgICAjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJICAgICMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkgICAgIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICIkbGliIiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKSBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgICAgKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICBlc2FjCisJICAgIDs7CisgICAgICAgICAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBjeHgqKQorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopCisJICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmciYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCQk7OworCSAgICAgICopCisJICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgICAgICAgICAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIi1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nImAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgICAgICAgICAkUk0gJGxpYi5leHAnCisJICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJCTs7CisJICAgIGVzYWMKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGZ1bmNfZWNob19hbGwgIiR0ZW1wbGlzdCIgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZnVuY19lY2hvX2FsbCAiJGxpc3QiJworCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICBvc2YzKikKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBmdW5jX2VjaG9fYWxsICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgICAqKQorCSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGZ1bmNfZWNob19hbGwgIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyJgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICBlc2FjCisKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBwc29zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgc3Vub3M0KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBzb2xhcmlzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyogfCBzdW5DQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsJDEpPXllcworCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAgICAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0tTSAke3dsfSRsaWIuZXhwIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJICAgICAgKikKKwkJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4KKwkgICAgICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJCV9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2Z1bmNfZWNob19hbGwnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJICAgICMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0teiAke3dsfWRlZnMnCisJICAgICAgaWYgJENDIC0tdmVyc2lvbiB8ICRHUkVQIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgLXYgIl5Db25maWd1cmVkIHdpdGg6IiB8ICRHUkVQICJcLUwiJworCSAgICAgIGVsc2UKKwkgICAgICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKKwkgICAgICAgICMgcGxhdGZvcm0uCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAtdiAiXkNvbmZpZ3VyZWQgd2l0aDoiIHwgJEdSRVAgIlwtTCInCisJICAgICAgZmkKKworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICR3bCRsaWJkaXInCisJICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCQlzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworCQkqKQorCQkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCQkgIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgIENDKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKwkjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorCSMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKwkjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKwkjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisJIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisJIyBhcyAteiBkZWZzLgorCV9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiwkbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworCV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCisJcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1UcHJlbGlua19vYmplY3RzICRvbGRvYmpzfgorCSAgICAgICciJF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIgorCSAgICBfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtVHByZWxpbmtfb2JqZWN0cyAkcmVsb2FkX29ianN+CisJICAgICAgJyIkX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpIgorCSAgICA7OworCSAgKikKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICA7OworCWVzYWMKKyAgICAgIDs7CisKKyAgICAgIHRhbmRlbSopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICB2eHdvcmtzKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCisgICAgdGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEdYWCIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoJDEpCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgQ0M9JGx0X3NhdmVfQ0MKKyAgQ0ZMQUdTPSRsdF9zYXZlX0NGTEFHUworICBMRENYWD0kTEQKKyAgTEQ9JGx0X3NhdmVfTEQKKyAgR0NDPSRsdF9zYXZlX0dDQworICB3aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorICBsdF9jdl9wYXRoX0xEQ1hYPSRsdF9jdl9wYXRoX0xECisgIGx0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAorICBsdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKK2ZpICMgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19DWFhfQ09ORklHCisKKworIyBfTFRfRlVOQ19TVFJJUE5BTUVfQ05GCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZnVuY19zdHJpcG5hbWVfY25mIHByZWZpeCBzdWZmaXggbmFtZQorIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KKyMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCisjIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKKyMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KKyMKKyMgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIChub24tWFNJKSB2ZXJzaW9uIG9mIGZ1bmNfc3RyaXBuYW1lLAorIyBleGNlcHQgdGhpcyBvbmUgY2FuIGJlIHVzZWQgYnkgbTQgY29kZSB0aGF0IG1heSBiZSBleGVjdXRlZCBieSBjb25maWd1cmUsCisjIHJhdGhlciB0aGFuIHRoZSBsaWJ0b29sIHNjcmlwdC4KK200X2RlZnVuKFtfTFRfRlVOQ19TVFJJUE5BTUVfQ05GXSxbZG5sCitBQ19SRVFVSVJFKFtfTFRfREVDTF9TRURdKQorQUNfUkVRVUlSRShbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdKQorZnVuY19zdHJpcG5hbWVfY25mICgpCit7CisgIGNhc2UgJHsyfSBpbgorICAuKikgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlXFxcXCR7Mn1cJCUlImA7OworICAqKSAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiJHszfSIgfCAkU0VEICJzJV4kezF9JSU7IHMlJHsyfVwkJSUiYDs7CisgIGVzYWMKK30gIyBmdW5jX3N0cmlwbmFtZV9jbmYKK10pIyBfTFRfRlVOQ19TVFJJUE5BTUVfQ05GCisKKyMgX0xUX1NZU19ISURERU5fTElCREVQUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWd1cmUgb3V0ICJoaWRkZW4iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZyb20gdmVyYm9zZQorIyBjb21waWxlciBvdXRwdXQgd2hlbiBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCittNF9kZWZ1bihbX0xUX1NZU19ISURERU5fTElCREVQU10sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCitBQ19SRVFVSVJFKFtfTFRfRlVOQ19TVFJJUE5BTUVfQ05GXSlkbmwKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CitfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9CitfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPQorX0xUX1RBR1ZBUihwcmVkZXBzLCAkMSk9CitfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9CitfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPQorCitkbmwgd2UgY2FuJ3QgdXNlIHRoZSBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUgaGVyZSwKK2RubCBiZWNhdXNlIGl0IGNvbnRhaW5zIGNvZGUgaW50ZW5kZWQgZm9yIGFuIGV4ZWN1dGFibGUsCitkbmwgbm90IGEgbGlicmFyeS4gIEl0J3MgcG9zc2libGUgd2Ugc2hvdWxkIGxldCBlYWNoCitkbmwgdGFnIGRlZmluZSBhIG5ldyBsdF8/Pz8/X2xpbmtfdGVzdF9jb2RlIHZhcmlhYmxlLAorZG5sIGJ1dCBpdCdzIG9ubHkgdXNlZCBoZXJlLi4uCittNF9pZihbJDFdLCBbXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitpbnQgYTsKK3ZvaWQgZm9vICh2b2lkKSB7IGEgPSAwOyB9CitfTFRfRU9GCitdLCBbJDFdLCBbQ1hYXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitjbGFzcyBGb28KK3sKK3B1YmxpYzoKKyAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Citwcml2YXRlOgorICBpbnQgYTsKK307CitfTFRfRU9GCitdLCBbJDFdLCBbRjc3XSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlcio0IGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK19MVF9FT0YKK10sIFskMV0sIFtGQ10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgYQorICAgICAgYT0wCisgICAgICByZXR1cm4KKyAgICAgIGVuZAorX0xUX0VPRgorXSwgWyQxXSwgW0dDSl0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorcHVibGljIGNsYXNzIGZvbyB7CisgIHByaXZhdGUgaW50IGE7CisgIHB1YmxpYyB2b2lkIGJhciAodm9pZCkgeworICAgIGEgPSAwOworICB9Cit9OworX0xUX0VPRgorXSkKKworX2x0X2xpYmRlcHNfc2F2ZV9DRkxBR1M9JENGTEFHUworY2FzZSAiJENDICRDRkxBR1MgIiBpbiAjKAorKlwgLWZsdG8qXCAqKSBDRkxBR1M9IiRDRkxBR1MgLWZuby1sdG8iIDs7CisqXCAtZndob3ByKlwgKikgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8td2hvcHIiIDs7Citlc2FjCisKK2RubCBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKK2RubCBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCitpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgZm9yIHAgaW4gYGV2YWwgIiRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCJgOyBkbworICAgIGNhc2UgJHtwcmV2fSR7cH0gaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiB8fAorICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgIyBFeHBhbmQgdGhlIHN5c3Jvb3QgdG8gZWFzZSBleHRyYWN0aW5nIHRoZSBkaXJlY3RvcmllcyBsYXRlci4KKyAgICAgICBpZiB0ZXN0IC16ICIkcHJldiI7IHRoZW4KKyAgICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICAgIC1MKikgZnVuY19zdHJpcG5hbWVfY25mICctTCcgJycgIiRwIjsgcHJldj0tTDsgcD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisgICAgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lX2NuZiAnLVInICcnICIkcCI7IHByZXY9LVI7IHA9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgICAgLWwqKSBmdW5jX3N0cmlwbmFtZV9jbmYgJy1sJyAnJyAiJHAiOyBwcmV2PS1sOyBwPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBmaQorICAgICAgIGNhc2UgJHAgaW4KKyAgICAgICA9KikgZnVuY19zdHJpcG5hbWVfY25mICc9JyAnJyAiJHAiOyBwPSRsdF9zeXNyb290JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCA7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICR7cHJldn0gaW4KKwkgLUwgfCAtUikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKSI7IHRoZW4KKwkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICBwcmV2PQorICAgICAgIDs7CisKKyAgICAqLmx0by4kb2JqZXh0KSA7OyAjIElnbm9yZSBHQ0MgTFRPIG9iamVjdHMKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgJDEgdGVzdCBwcm9ncmFtIgorZmkKKworJFJNIC1mIGNvbmZlc3QuJG9iamV4dAorQ0ZMQUdTPSRfbHRfbGliZGVwc19zYXZlX0NGTEFHUworCisjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgorbTRfaWYoWyQxXSwgW0NYWF0sCitbY2FzZSAkaG9zdF9vcyBpbgoraW50ZXJpeFtbMy05XV0qKQorICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCisgICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCisgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsJDEpPQorICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywkMSk9CisgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPQorICA7OworCitsaW51eCopCisgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorICAqU3VuXCBDKikKKyAgICAjIFN1biBDKysgNS45CisKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7CisKK3NvbGFyaXMqKQorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBDQyogfCBzdW5DQyopCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7Citlc2FjCitdKQorCitjYXNlICIgJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSAiIGluCisqIiAtbGMgIiopIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubyA7OworZXNhYworIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9CitpZiB0ZXN0IC1uICIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IjsgdGhlbgorIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9YGVjaG8gIiAke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IiB8ICR7U0VEfSAtZSAncyEgLUwhICFnJyAtZSAncyFeICEhJ2AKK2ZpCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlyc10sIFsxXSwKKyAgICBbVGhlIGRpcmVjdG9yaWVzIHNlYXJjaGVkIGJ5IHRoaXMgY29tcGlsZXIgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcHJlZGVwX29iamVjdHNdLCBbMV0sCisgICAgW0RlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworICAgIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGRlcF9vYmplY3RzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVkZXBzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0ZGVwc10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgWzFdLAorICAgIFtUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworICAgIGEgc2hhcmVkIGxpYnJhcnldKQorXSkjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMKKworCisjIF9MVF9MQU5HX0Y3N19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIDc3IGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GNzdfQ09ORklHXSwKK1tBQ19MQU5HX1BVU0goRm9ydHJhbiA3NykKK2lmIHRlc3QgLXogIiRGNzciIHx8IHRlc3QgIlgkRjc3IiA9ICJYbm8iOyB0aGVuCisgIF9sdF9kaXNhYmxlX0Y3Nz15ZXMKK2ZpCisKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmNzcgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWYKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGY3NyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIEY3NyBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iXAorICAgICAgc3Vicm91dGluZSB0CisgICAgICByZXR1cm4KKyAgICAgIGVuZAorIgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAorICAgICAgcHJvZ3JhbSB0CisgICAgICBlbmQKKyIKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9IiRDQyIKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisgIENDPSR7Rjc3LSJmNzcifQorICBDRkxBR1M9JEZGTEFHUworICBjb21waWxlcj0kQ0MKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisgIEdDQz0kRzc3CisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgICAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgICAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICAgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisJICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworCWZpCisgICAgICAgIDs7CisgICAgZXNhYworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyAgICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkRzc3IgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgR0NDPSRsdF9zYXZlX0dDQworICBDQz0iJGx0X3NhdmVfQ0MiCisgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRjc3IiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19GNzdfQ09ORklHCisKKworIyBfTFRfTEFOR19GQ19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEZvcnRyYW4gY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0ZDX0NPTkZJR10sCitbQUNfTEFOR19QVVNIKEZvcnRyYW4pCisKK2lmIHRlc3QgLXogIiRGQyIgfHwgdGVzdCAiWCRGQyIgPSAiWG5vIjsgdGhlbgorICBfbHRfZGlzYWJsZV9GQz15ZXMKK2ZpCisKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIocmVsb2FkX2ZsYWcsICQxKT0kcmVsb2FkX2ZsYWcKK19MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0kcmVsb2FkX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmYyB0ZXN0IHNvdXJjZXMuCithY19leHQ9JHthY19mY19zcmNleHQtZn0KKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGZjIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgRkMgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfZGlzYWJsZV9GQyIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iXAorICAgICAgc3Vicm91dGluZSB0CisgICAgICByZXR1cm4KKyAgICAgIGVuZAorIgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAorICAgICAgcHJvZ3JhbSB0CisgICAgICBlbmQKKyIKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9IiRDQyIKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCisgIENDPSR7RkMtImY5NSJ9CisgIENGTEFHUz0kRkNGTEFHUworICBjb21waWxlcj0kQ0MKKyAgR0NDPSRhY19jdl9mY19jb21waWxlcl9nbnUKKworICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCisgIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisJaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKwlmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJGFjX2N2X2ZjX2NvbXBpbGVyX2dudSIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoJDEpCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgR0NDPSRsdF9zYXZlX0dDQworICBDQz0kbHRfc2F2ZV9DQworICBDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCitmaSAjIHRlc3QgIiRfbHRfZGlzYWJsZV9GQyIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfRkNfQ09ORklHCisKKworIyBfTFRfTEFOR19HQ0pfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBHTlUgSmF2YSBDb21waWxlciBjb21waWxlcgorIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfR0NKX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19HQ0pdKWRubAorQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBKYXZhIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1qYXZhCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBKYXZhIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iY2xhc3MgZm9vIHt9IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbW11dIGFyZ3YpIHt9OyB9JworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9JENDCitsdF9zYXZlX0NGTEFHUz0kQ0ZMQUdTCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9eWVzCitDQz0ke0dDSi0iZ2NqIn0KK0NGTEFHUz0kR0NKRkxBR1MKK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihyZWxvYWRfZmxhZywgJDEpPSRyZWxvYWRfZmxhZworX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSRyZWxvYWRfY21kcworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgIF9MVF9DT05GSUcoJDEpCitmaQorCitBQ19MQU5HX1JFU1RPUkUKKworR0NDPSRsdF9zYXZlX0dDQworQ0M9JGx0X3NhdmVfQ0MKK0NGTEFHUz0kbHRfc2F2ZV9DRkxBR1MKK10pIyBfTFRfTEFOR19HQ0pfQ09ORklHCisKKworIyBfTFRfTEFOR19SQ19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgV2luZG93cyByZXNvdXJjZSBjb21waWxlcgorIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfUkNfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtMVF9QUk9HX1JDXSlkbmwKK0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgUkMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PXJjCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBSQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9J3NhbXBsZSBNRU5VIHsgTUVOVUlURU0gIiZTb3VwIiwgMTAwLCBDSEVDS0VEIH0nCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9UQUdfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorbHRfc2F2ZV9DRkxBR1M9JENGTEFHUworbHRfc2F2ZV9HQ0M9JEdDQworR0NDPQorQ0M9JHtSQy0id2luZHJlcyJ9CitDRkxBR1M9Citjb21waWxlcj0kQ0MKK19MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKK19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKworaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICA6CisgIF9MVF9DT05GSUcoJDEpCitmaQorCitHQ0M9JGx0X3NhdmVfR0NDCitBQ19MQU5HX1JFU1RPUkUKK0NDPSRsdF9zYXZlX0NDCitDRkxBR1M9JGx0X3NhdmVfQ0ZMQUdTCitdKSMgX0xUX0xBTkdfUkNfQ09ORklHCisKKworIyBMVF9QUk9HX0dDSgorIyAtLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfR0NKXSwKK1ttNF9pZmRlZihbQUNfUFJPR19HQ0pdLCBbQUNfUFJPR19HQ0pdLAorICBbbTRfaWZkZWYoW0FdW01fUFJPR19HQ0pdLCBbQV1bTV9QUk9HX0dDSl0sCisgICAgW0FDX0NIRUNLX1RPT0woR0NKLCBnY2osKQorICAgICAgdGVzdCAieCR7R0NKRkxBR1Mrc2V0fSIgPSB4c2V0IHx8IEdDSkZMQUdTPSItZyAtTzIiCisgICAgICBBQ19TVUJTVChHQ0pGTEFHUyldKV0pW11kbmwKK10pCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbTFRfQUNfUFJPR19HQ0pdLCBbTFRfUFJPR19HQ0pdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX0dDSl0sIFtdKQorCisKKyMgTFRfUFJPR19SQworIyAtLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfUFJPR19SQ10sCitbQUNfQ0hFQ0tfVE9PTChSQywgd2luZHJlcywpCitdKQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfUkNdLCBbTFRfUFJPR19SQ10pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfUkNdLCBbXSkKKworCisjIF9MVF9ERUNMX0VHUkVQCisjIC0tLS0tLS0tLS0tLS0tCisjIElmIHdlIGRvbid0IGhhdmUgYSBuZXcgZW5vdWdoIEF1dG9jb25mIHRvIGNob29zZSB0aGUgYmVzdCBncmVwCisjIGF2YWlsYWJsZSwgY2hvb3NlIHRoZSBvbmUgZmlyc3QgaW4gdGhlIHVzZXIncyBQQVRILgorbTRfZGVmdW4oW19MVF9ERUNMX0VHUkVQXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfRkdSRVBdKWRubAordGVzdCAteiAiJEdSRVAiICYmIEdSRVA9Z3JlcAorX0xUX0RFQ0woW10sIFtHUkVQXSwgWzFdLCBbQSBncmVwIHByb2dyYW0gdGhhdCBoYW5kbGVzIGxvbmcgbGluZXNdKQorX0xUX0RFQ0woW10sIFtFR1JFUF0sIFsxXSwgW0FuIEVSRSBtYXRjaGVyXSkKK19MVF9ERUNMKFtdLCBbRkdSRVBdLCBbMV0sIFtBIGxpdGVyYWwgc3RyaW5nIG1hdGNoZXJdKQorZG5sIE5vbi1ibGVlZGluZy1lZGdlIGF1dG9jb25mIGRvZXNuJ3Qgc3Vic3QgR1JFUCwgc28gZG8gaXQgaGVyZSB0b28KK0FDX1NVQlNUKFtHUkVQXSkKK10pCisKKworIyBfTFRfREVDTF9PQkpEVU1QCisjIC0tLS0tLS0tLS0tLS0tCisjIElmIHdlIGRvbid0IGhhdmUgYSBuZXcgZW5vdWdoIEF1dG9jb25mIHRvIGNob29zZSB0aGUgYmVzdCBvYmpkdW1wCisjIGF2YWlsYWJsZSwgY2hvb3NlIHRoZSBvbmUgZmlyc3QgaW4gdGhlIHVzZXIncyBQQVRILgorbTRfZGVmdW4oW19MVF9ERUNMX09CSkRVTVBdLAorW0FDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCitfTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMV0sIFtBbiBvYmplY3Qgc3ltYm9sIGR1bXBlcl0pCitBQ19TVUJTVChbT0JKRFVNUF0pCitdKQorCisjIF9MVF9ERUNMX0RMTFRPT0wKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgRExMVE9PTCB2YXJpYWJsZSBpcyBzZXQuCittNF9kZWZ1bihbX0xUX0RFQ0xfRExMVE9PTF0sCitbQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK19MVF9ERUNMKFtdLCBbRExMVE9PTF0sIFsxXSwgW0RMTCBjcmVhdGlvbiBwcm9ncmFtXSkKK0FDX1NVQlNUKFtETExUT09MXSkKK10pCisKKyMgX0xUX0RFQ0xfU0VECisjIC0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgYSBmdWxseS1mdW5jdGlvbmFsIHNlZCBwcm9ncmFtLCB0aGF0IHRydW5jYXRlcworIyBhcyBmZXcgY2hhcmFjdGVycyBhcyBwb3NzaWJsZS4gIFByZWZlciBHTlUgc2VkIGlmIGZvdW5kLgorbTRfZGVmdW4oW19MVF9ERUNMX1NFRF0sCitbQUNfUFJPR19TRUQKK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKK19MVF9ERUNMKFtdLCBbU0VEXSwgWzFdLCBbQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitfTFRfREVDTChbXSwgW1hzZWRdLCBbIlwkU0VEIC1lIDFzL15YLy8iXSwKKyAgICBbU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW5dKQorXSkjIF9MVF9ERUNMX1NFRAorCittNF9pZm5kZWYoW0FDX1BST0dfU0VEXSwgWworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PVEU6IFRoaXMgbWFjcm8gaGFzIGJlZW4gc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW50byAgICMKKyMgIEdOVSBBdXRvY29uZiBhcyBBQ19QUk9HX1NFRC4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgIworIyAgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIEF1dG9jb25mIHdlIHNob3VsZCByZW1vdmUgdGhpcyAgICAjCisjICBtYWNybyBhbmQgdXNlIGl0IGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCittNF9kZWZ1bihbQUNfUFJPR19TRURdLAorW0FDX01TR19DSEVDS0lORyhbZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX1NFRCwKK1sjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KKyMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICBmaQorICAgIGRvbmUKKyAgZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworbHRfYWNfbWF4PTAKK2x0X2FjX2NvdW50PTAKKyMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCisjIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgorZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCisgIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCisgIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgorICBsdF9hY19jb3VudD0wCisgIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgorICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgYnJlYWsKKyAgZmkKKyAgd2hpbGUgdHJ1ZTsgZG8KKyAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAorICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgorICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCisgICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCisgICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKKyAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCisgICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKKyAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgorICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAorICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGZpCisgIGRvbmUKK2RvbmUKK10pCitTRUQ9JGx0X2N2X3BhdGhfU0VECitBQ19TVUJTVChbU0VEXSkKK0FDX01TR19SRVNVTFQoWyRTRURdKQorXSkjQUNfUFJPR19TRUQKK10pI200X2lmbmRlZgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfU0VEXSwgW0FDX1BST0dfU0VEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbTFRfQUNfUFJPR19TRURdLCBbXSkKKworCisjIF9MVF9DSEVDS19TSEVMTF9GRUFUVVJFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmluZCBvdXQgd2hldGhlciB0aGUgc2hlbGwgaXMgQm91cm5lIG9yIFhTSSBjb21wYXRpYmxlLAorIyBvciBoYXMgc29tZSBvdGhlciB1c2VmdWwgZmVhdHVyZXMuCittNF9kZWZ1bihbX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIHNvbWUgWFNJIGNvbnN0cnVjdHNdKQorIyBUcnkgc29tZSBYU0kgZmVhdHVyZXMKK3hzaV9zaGVsbD1ubworKCBfbHRfZHVtbXk9ImEvYi9jIgorICB0ZXN0ICIke19sdF9kdW1teSMjKi99LCR7X2x0X2R1bW15JS8qfSwke19sdF9kdW1teSM/P30iJHtfbHRfZHVtbXklIiRfbHRfZHVtbXkifSwgXAorICAgICAgPSBjLGEvYixiL2MsIFwKKyAgICAmJiBldmFsICd0ZXN0ICQoKCAxICsgMSApKSAtZXEgMiBcCisgICAgJiYgdGVzdCAiJHsjX2x0X2R1bW15fSIgLWVxIDUnICkgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgeHNpX3NoZWxsPXllcworQUNfTVNHX1JFU1VMVChbJHhzaV9zaGVsbF0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbeHNpX3NoZWxsPSckeHNpX3NoZWxsJ10pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgIis9Il0pCitsdF9zaGVsbF9hcHBlbmQ9bm8KKyggZm9vPWJhcjsgc2V0IGZvbyBiYXo7IGV2YWwgIiRbMV0rPVwkWzJdIiAmJiB0ZXN0ICIkZm9vIiA9IGJhcmJheiApIFwKKyAgICA+L2Rldi9udWxsIDI+JjEgXAorICAmJiBsdF9zaGVsbF9hcHBlbmQ9eWVzCitBQ19NU0dfUkVTVUxUKFskbHRfc2hlbGxfYXBwZW5kXSkKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFtsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnXSkKKworaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGx0X3Vuc2V0PXVuc2V0CitlbHNlCisgIGx0X3Vuc2V0PWZhbHNlCitmaQorX0xUX0RFQ0woW10sIFtsdF91bnNldF0sIFswXSwgW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICJ1bnNldCJdKWRubAorCisjIHRlc3QgRUJDRElDIG9yIEFTQ0lJCitjYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCisgQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KKyAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCisgIGx0X1NQMk5MPSd0ciBcMDQwIFwwMTInCisgIGx0X05MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKyAgOzsKKyAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KKyAgbHRfU1AyTkw9J3RyIFwxMDAgXG4nCisgIGx0X05MMlNQPSd0ciBcclxuIFwxMDBcMTAwJworICA7OworZXNhYworX0xUX0RFQ0woW1NQMk5MXSwgW2x0X1NQMk5MXSwgWzFdLCBbdHVybiBzcGFjZXMgaW50byBuZXdsaW5lc10pZG5sCitfTFRfREVDTChbTkwyU1BdLCBbbHRfTkwyU1BdLCBbMV0sIFt0dXJuIG5ld2xpbmVzIGludG8gc3BhY2VzXSlkbmwKK10pIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKKworCisjIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UgKEZVTkNOQU1FLCBSRVBMQUNFTUVOVC1CT0RZKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW4gYCRjZmdmaWxlJywgbG9vayBmb3IgZnVuY3Rpb24gRlVOQ05BTUUgZGVsaW1pdGVkIGJ5IGBeRlVOQ05BTUUgKCkkJyBhbmQKKyMgJ159IEZVTkNOQU1FICcsIGFuZCByZXBsYWNlIGl0cyBib2R5IHdpdGggUkVQTEFDRU1FTlQtQk9EWS4KK200X2RlZnVuKFtfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFXSwKK1tkbmwgeworc2VkIC1lICcvXiQxICgpJC8sL159ICMgJDEgL2NcCiskMSAoKVwKK3tcCittNF9icGF0c3Vic3RzKFskMl0sIFskXSwgW1xcXSwgW15cKFsJIF1cKV0sIFtcXFwxXSkKK30gIyBFeHRlbmRlZC1zaGVsbCAkMSBpbXBsZW1lbnRhdGlvbicgIiRjZmdmaWxlIiA+ICRjZmdmaWxlLnRtcCBcCisgICYmIG12IC1mICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiICYmIGNwICIkY2ZnZmlsZS50bXAiICIkY2ZnZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlLnRtcCIpCit0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorXSkKKworCisjIF9MVF9QUk9HX1JFUExBQ0VfU0hFTExGTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZXBsYWNlIGV4aXN0aW5nIHBvcnRhYmxlIGltcGxlbWVudGF0aW9ucyBvZiBzZXZlcmFsIHNoZWxsIGZ1bmN0aW9ucyB3aXRoCisjIGVxdWl2YWxlbnQgZXh0ZW5kZWQgc2hlbGwgaW1wbGVtZW50YXRpb25zIHdoZXJlIHRob3NlIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUuLgorbTRfZGVmdW4oW19MVF9QUk9HX1JFUExBQ0VfU0hFTExGTlNdLAorW2lmIHRlc3QgeCIkeHNpX3NoZWxsIiA9IHh5ZXM7IHRoZW4KKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19kaXJuYW1lXSwgW2RubAorICAgIGNhc2UgJHsxfSBpbgorICAgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKKyAgICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgICBlc2FjXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2Jhc2VuYW1lXSwgW2RubAorICAgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSJdKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWVdLCBbZG5sCisgICAgY2FzZSAkezF9IGluCisgICAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OworICAgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OworICAgIGVzYWMKKyAgICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX3N0cmlwbmFtZV0sIFtkbmwKKyAgICAjIHBka3NoIDUuMi4xNCBkb2VzIG5vdCBkbyAke1glJFl9IGNvcnJlY3RseSBpZiBib3RoIFggYW5kIFkgYXJlCisgICAgIyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHNvIGFzc2lnbiBvbmUgdG8gb3JkaW5hcnkgcGFyYW1ldGVyIGZpcnN0LgorICAgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9CisgICAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0IyIkezF9In0KKyAgICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQlIiR7Mn0ifV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19zcGxpdF9sb25nX29wdF0sIFtkbmwKKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X25hbWU9JHsxJSU9Kn0KKyAgICBmdW5jX3NwbGl0X2xvbmdfb3B0X2FyZz0kezEjKj19XSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX3NwbGl0X3Nob3J0X29wdF0sIFtkbmwKKyAgICBmdW5jX3NwbGl0X3Nob3J0X29wdF9hcmc9JHsxIz8/fQorICAgIGZ1bmNfc3BsaXRfc2hvcnRfb3B0X25hbWU9JHsxJSIkZnVuY19zcGxpdF9zaG9ydF9vcHRfYXJnIn1dKQorCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfbG8yb10sIFtkbmwKKyAgICBjYXNlICR7MX0gaW4KKyAgICAgICoubG8pIGZ1bmNfbG8yb19yZXN1bHQ9JHsxJS5sb30uJHtvYmpleHR9IDs7CisgICAgICAqKSAgICBmdW5jX2xvMm9fcmVzdWx0PSR7MX0gOzsKKyAgICBlc2FjXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX3hmb3JtXSwgWyAgICBmdW5jX3hmb3JtX3Jlc3VsdD0kezElLip9LmxvXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2FyaXRoXSwgWyAgICBmdW5jX2FyaXRoX3Jlc3VsdD0kKCggJFsqXSApKV0pCisKKyAgX0xUX1BST0dfRlVOQ1RJT05fUkVQTEFDRShbZnVuY19sZW5dLCBbICAgIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfV0pCitmaQorCitpZiB0ZXN0IHgiJGx0X3NoZWxsX2FwcGVuZCIgPSB4eWVzOyB0aGVuCisgIF9MVF9QUk9HX0ZVTkNUSU9OX1JFUExBQ0UoW2Z1bmNfYXBwZW5kXSwgWyAgICBldmFsICIkezF9Kz1cXCR7Mn0iXSkKKworICBfTFRfUFJPR19GVU5DVElPTl9SRVBMQUNFKFtmdW5jX2FwcGVuZF9xdW90ZWRdLCBbZG5sCisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHsyfSIKK2RubCBtNCBleHBhbnNpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgdGhlbiB0aGUgc2hlbGwgZXZhbCB0dXJucyB0aGF0IGludG8gXAorICAgIGV2YWwgIiR7MX0rPVxcXFwgXFwkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiXSkKKworICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgd2hlcmUgcG9zc2libGUgYnkgZGlyZWN0IHVzZSBvZiAnKz0nCisgIHNlZCAtZSAncyVmdW5jX2FwcGVuZCBcKFtbYS16QS1aX11dXHsxLFx9XCkgIiVcMSs9IiVnJyAkY2ZnZmlsZSA+ICRjZmdmaWxlLnRtcCBcCisgICAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQorICB0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorZWxzZQorICAjIFNhdmUgYSBgZnVuY19hcHBlbmQnIGZ1bmN0aW9uIGNhbGwgZXZlbiB3aGVuICcrPScgaXMgbm90IGF2YWlsYWJsZQorICBzZWQgLWUgJ3MlZnVuY19hcHBlbmQgXChbW2EtekEtWl9dXVx7MSxcfVwpICIlXDE9IiRcMSVnJyAkY2ZnZmlsZSA+ICRjZmdmaWxlLnRtcCBcCisgICAgJiYgbXYgLWYgIiRjZmdmaWxlLnRtcCIgIiRjZmdmaWxlIiBcCisgICAgICB8fCAocm0gLWYgIiRjZmdmaWxlIiAmJiBjcCAiJGNmZ2ZpbGUudG1wIiAiJGNmZ2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZS50bXAiKQorICB0ZXN0IDAgLWVxICQ/IHx8IF9sdF9mdW5jdGlvbl9yZXBsYWNlX2ZhaWw9OgorZmkKKworaWYgdGVzdCB4IiRfbHRfZnVuY3Rpb25fcmVwbGFjZV9mYWlsIiA9IHgiOiI7IHRoZW4KKyAgQUNfTVNHX1dBUk4oW1VuYWJsZSB0byBzdWJzdGl0dXRlIGV4dGVuZGVkIHNoZWxsIGZ1bmN0aW9ucyBpbiAkb2ZpbGVdKQorZmkKK10pCisKKyMgX0xUX1BBVEhfQ09OVkVSU0lPTl9GVU5DVElPTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGV0ZXJtaW5lIHdoaWNoIGZpbGUgbmFtZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBieQorIyBmdW5jX3RvX2hvc3RfZmlsZSAoYW5kLCBpbXBsaWNpdGx5LCBieSBmdW5jX3RvX2hvc3RfcGF0aCkuICBUaGVzZSBhcmUgbmVlZGVkCisjIGZvciBjZXJ0YWluIGNyb3NzLWNvbXBpbGUgY29uZmlndXJhdGlvbnMgYW5kIG5hdGl2ZSBtaW5ndy4KK200X2RlZnVuKFtfTFRfUEFUSF9DT05WRVJTSU9OX0ZVTkNUSU9OU10sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIGNvbnZlcnQgJGJ1aWxkIGZpbGUgbmFtZXMgdG8gJGhvc3QgZm9ybWF0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl90b19ob3N0X2ZpbGVfY21kLAorW2Nhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KiApCisgICAgY2FzZSAkYnVpbGQgaW4KKyAgICAgICotKi1taW5ndyogKSAjIGFjdHVhbGx5IG1zeXMKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9tc3lzX3RvX3czMgorICAgICAgICA7OworICAgICAgKi0qLWN5Z3dpbiogKQorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX2N5Z3dpbl90b193MzIKKyAgICAgICAgOzsKKyAgICAgICogKSAjIG90aGVyd2lzZSwgYXNzdW1lICpuaXgKKyAgICAgICAgbHRfY3ZfdG9faG9zdF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9uaXhfdG9fdzMyCisgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgICotKi1jeWd3aW4qICkKKyAgICBjYXNlICRidWlsZCBpbgorICAgICAgKi0qLW1pbmd3KiApICMgYWN0dWFsbHkgbXN5cworICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX21zeXNfdG9fY3lnd2luCisgICAgICAgIDs7CisgICAgICAqLSotY3lnd2luKiApCisgICAgICAgIGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbm9vcAorICAgICAgICA7OworICAgICAgKiApICMgb3RoZXJ3aXNlLCBhc3N1bWUgKm5peAorICAgICAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25peF90b19jeWd3aW4KKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgKiApICMgdW5oYW5kbGVkIGhvc3RzIChhbmQgIm5vcm1hbCIgbmF0aXZlIGJ1aWxkcykKKyAgICBsdF9jdl90b19ob3N0X2ZpbGVfY21kPWZ1bmNfY29udmVydF9maWxlX25vb3AKKyAgICA7OworZXNhYworXSkKK3RvX2hvc3RfZmlsZV9jbWQ9JGx0X2N2X3RvX2hvc3RfZmlsZV9jbWQKK0FDX01TR19SRVNVTFQoWyRsdF9jdl90b19ob3N0X2ZpbGVfY21kXSkKK19MVF9ERUNMKFt0b19ob3N0X2ZpbGVfY21kXSwgW2x0X2N2X3RvX2hvc3RfZmlsZV9jbWRdLAorICAgICAgICAgWzBdLCBbY29udmVydCAkYnVpbGQgZmlsZSBuYW1lcyB0byAkaG9zdCBmb3JtYXRdKWRubAorCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjb252ZXJ0ICRidWlsZCBmaWxlIG5hbWVzIHRvIHRvb2xjaGFpbiBmb3JtYXRdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQsCitbI2Fzc3VtZSBvcmRpbmFyeSBjcm9zcyB0b29scywgb3IgbmF0aXZlIGJ1aWxkLgorbHRfY3ZfdG9fdG9vbF9maWxlX2NtZD1mdW5jX2NvbnZlcnRfZmlsZV9ub29wCitjYXNlICRob3N0IGluCisgICotKi1taW5ndyogKQorICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAqLSotbWluZ3cqICkgIyBhY3R1YWxseSBtc3lzCisgICAgICAgIGx0X2N2X3RvX3Rvb2xfZmlsZV9jbWQ9ZnVuY19jb252ZXJ0X2ZpbGVfbXN5c190b193MzIKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKK2VzYWMKK10pCit0b190b29sX2ZpbGVfY21kPSRsdF9jdl90b190b29sX2ZpbGVfY21kCitBQ19NU0dfUkVTVUxUKFskbHRfY3ZfdG9fdG9vbF9maWxlX2NtZF0pCitfTFRfREVDTChbdG9fdG9vbF9maWxlX2NtZF0sIFtsdF9jdl90b190b29sX2ZpbGVfY21kXSwKKyAgICAgICAgIFswXSwgW2NvbnZlcnQgJGJ1aWxkIGZpbGVzIHRvIHRvb2xjaGFpbiBmb3JtYXRdKWRubAorXSkjIF9MVF9QQVRIX0NPTlZFUlNJT05fRlVOQ1RJT05TCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbTQvbHRvcHRpb25zLm00IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2x0b3B0aW9ucy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NmZDUxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2x0b3B0aW9ucy5tNApAQCAtMCwwICsxLDM2OSBAQAorIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgICBJbmMuCisjICAgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA3IGx0b3B0aW9ucy5tNAorCisjIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgorQUNfREVGVU4oW0xUT1BUSU9OU19WRVJTSU9OXSwgW200X2lmKFsxXSldKQorCisKKyMgX0xUX01BTkdMRV9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfTUFOR0xFX09QVElPTl0sCitbW19MVF9PUFRJT05fXW00X2JwYXRzdWJzdCgkMV9fJDIsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCisKKworIyBfTFRfU0VUX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvcHRpb24gT1BUSU9OLU5BTUUgZm9yIG1hY3JvIE1BQ1JPLU5BTUUsIGFuZCBpZiB0aGVyZSBpcyBhCisjIG1hdGNoaW5nIGhhbmRsZXIgZGVmaW5lZCwgZGlzcGF0Y2ggdG8gaXQuICBPdGhlciBPUFRJT04tTkFNRXMgYXJlCisjIHNhdmVkIGFzIGEgZmxhZy4KK200X2RlZmluZShbX0xUX1NFVF9PUFRJT05dLAorW200X2RlZmluZShfTFRfTUFOR0xFX09QVElPTihbJDFdLCBbJDJdKSlkbmwKK200X2lmZGVmKF9MVF9NQU5HTEVfREVGVU4oWyQxXSwgWyQyXSksCisgICAgICAgIF9MVF9NQU5HTEVfREVGVU4oWyQxXSwgWyQyXSksCisgICAgW200X3dhcm5pbmcoW1Vua25vd24gJDEgb3B0aW9uIGAkMiddKV0pW11kbmwKK10pCisKKworIyBfTFRfSUZfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgorbTRfZGVmaW5lKFtfTFRfSUZfT1BUSU9OXSwKK1ttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBbJDJdKSwgWyQzXSwgWyQ0XSldKQorCisKKyMgX0xUX1VOTEVTU19PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNULCBJRi1OT1QtU0VUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtTk9ULVNFVCB1bmxlc3MgYWxsIG9wdGlvbnMgaW4gT1BUSU9OLUxJU1QgZm9yIE1BQ1JPLU5BTUUKKyMgYXJlIHNldC4KK200X2RlZmluZShbX0xUX1VOTEVTU19PUFRJT05TXSwKK1ttNF9mb3JlYWNoKFtfTFRfT3B0aW9uXSwgbTRfc3BsaXQobTRfbm9ybWFsaXplKFskMl0pKSwKKwkgICAgW200X2lmZGVmKF9MVF9NQU5HTEVfT1BUSU9OKFskMV0sIF9MVF9PcHRpb24pLAorCQkgICAgICBbbTRfZGVmaW5lKFskMF9mb3VuZF0pXSldKVtdZG5sCittNF9pZmRlZihbJDBfZm91bmRdLCBbbTRfdW5kZWZpbmUoWyQwX2ZvdW5kXSldLCBbJDMKK10pW11kbmwKK10pCisKKworIyBfTFRfU0VUX09QVElPTlMoTUFDUk8tTkFNRSwgT1BUSU9OLUxJU1QpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1BUSU9OLUxJU1QgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBMaWJ0b29sIG9wdGlvbnMgYXNzb2NpYXRlZAorIyB3aXRoIE1BQ1JPLU5BTUUuICBJZiBhbnkgT1BUSU9OIGhhcyBhIG1hdGNoaW5nIGhhbmRsZXIgZGVjbGFyZWQgd2l0aAorIyBMVF9PUFRJT05fREVGSU5FLCBkaXNwYXRjaCB0byB0aGF0IG1hY3JvOyBvdGhlcndpc2UgY29tcGxhaW4gYWJvdXQKKyMgdGhlIHVua25vd24gb3B0aW9uIGFuZCBleGl0LgorbTRfZGVmdW4oW19MVF9TRVRfT1BUSU9OU10sCitbIyBTZXQgb3B0aW9ucworbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisgICAgW19MVF9TRVRfT1BUSU9OKFskMV0sIF9MVF9PcHRpb24pXSkKKworbTRfaWYoWyQxXSxbTFRfSU5JVF0sWworICBkbmwKKyAgZG5sIFNpbXBseSBzZXQgc29tZSBkZWZhdWx0IHZhbHVlcyAoaS5lIG9mZikgaWYgYm9vbGVhbiBvcHRpb25zIHdlcmUgbm90CisgIGRubCBzcGVjaWZpZWQ6CisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtkbG9wZW5dLCBbZW5hYmxlX2Rsb3Blbj1ubworICBdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwgW2VuYWJsZV93aW4zMl9kbGw9bm8KKyAgXSkKKyAgZG5sCisgIGRubCBJZiBubyByZWZlcmVuY2Ugd2FzIG1hZGUgdG8gdmFyaW91cyBwYWlycyBvZiBvcHBvc2luZyBvcHRpb25zLCB0aGVuCisgIGRubCB3ZSBydW4gdGhlIGRlZmF1bHQgbW9kZSBoYW5kbGVyIGZvciB0aGUgcGFpci4gIEZvciBleGFtcGxlLCBpZiBuZWl0aGVyCisgIGRubCBgc2hhcmVkJyBub3IgYGRpc2FibGUtc2hhcmVkJyB3YXMgcGFzc2VkLCB3ZSBlbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkCisgIGRubCBhcmNoaXZlcyBieSBkZWZhdWx0OgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbc2hhcmVkIGRpc2FibGUtc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3N0YXRpYyBkaXNhYmxlLXN0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtwaWMtb25seSBuby1waWNdLCBbX0xUX1dJVEhfUElDXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW2Zhc3QtaW5zdGFsbCBkaXNhYmxlLWZhc3QtaW5zdGFsbF0sCisgIAkJICAgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMXSkKKyAgXSkKK10pIyBfTFRfU0VUX09QVElPTlMKKworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1hY3JvcyB0byBoYW5kbGUgTFRfSU5JVCBvcHRpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgX0xUX01BTkdMRV9ERUZVTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9ERUZVTl0sCitbW19MVF9PUFRJT05fREVGVU5fXW00X2JwYXRzdWJzdChtNF90b3VwcGVyKFskMV9fJDJdKSwgW1teQS1aMC05X11dLCBbX10pXSkKKworCisjIExUX09QVElPTl9ERUZJTkUoTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUsIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW0xUX09QVElPTl9ERUZJTkVdLAorW200X2RlZmluZShfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLCBbJDNdKVtdZG5sCitdKSMgTFRfT1BUSU9OX0RFRklORQorCisKKyMgZGxvcGVuCisjIC0tLS0tLQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkbG9wZW5dLCBbZW5hYmxlX2Rsb3Blbj15ZXMKK10pCisKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGxvcGVuXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91CitwdXQgdGhlIGBkbG9wZW4nIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLCBbXSkKKworCisjIHdpbjMyLWRsbAorIyAtLS0tLS0tLS0KKyMgRGVjbGFyZSBwYWNrYWdlIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpbjMyIGRsbCdzLgorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFt3aW4zMi1kbGxdLAorW2VuYWJsZV93aW4zMl9kbGw9eWVzCisKK2Nhc2UgJGhvc3QgaW4KKyotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1jZWdjYyopCisgIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKKyAgQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKKyAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKKyAgOzsKK2VzYWMKKwordGVzdCAteiAiJEFTIiAmJiBBUz1hcworX0xUX0RFQ0woW10sIFtBU10sICAgICAgWzFdLCBbQXNzZW1ibGVyIHByb2dyYW1dKWRubAorCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCitfTFRfREVDTChbXSwgW0RMTFRPT0xdLCBbMV0sIFtETEwgY3JlYXRpb24gcHJvZ3JhbV0pZG5sCisKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKK19MVF9ERUNMKFtdLCBbT0JKRFVNUF0sIFsxXSwgW09iamVjdCBkdW1wZXIgcHJvZ3JhbV0pZG5sCitdKSMgd2luMzItZGxsCisKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbd2luMzItZGxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91CitwdXQgdGhlIGB3aW4zMi1kbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLCBbXSkKKworCisjIF9MVF9FTkFCTEVfU0hBUkVEKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnLCBhbmQgc3VwcG9ydHMgdGhlIGBzaGFyZWQnIGFuZAorIyBgZGlzYWJsZS1zaGFyZWQnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NIQVJFRF0sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbc2hhcmVkXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNoYXJlZEA8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc2hhcmVkPXllcyA7OworICAgIG5vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc2hhcmVkPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zaGFyZWQ9XV9MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFQpCisKKyAgICBfTFRfREVDTChbYnVpbGRfbGlidG9vbF9saWJzXSwgW2VuYWJsZV9zaGFyZWRdLCBbMF0sCisJW1doZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorXSkjIF9MVF9FTkFCTEVfU0hBUkVECisKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEKFt5ZXNdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEKFtub10pXSkKKworIyBPbGQgbmFtZXM6CitBQ19ERUZVTihbQUNfRU5BQkxFX1NIQVJFRF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtzaGFyZWRdKQorXSkKKworQUNfREVGVU4oW0FDX0RJU0FCTEVfU0hBUkVEXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLXNoYXJlZF0pCitdKQorCitBVV9ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtBQ19FTkFCTEVfU0hBUkVEKCRAKV0pCitBVV9ERUZVTihbQU1fRElTQUJMRV9TSEFSRURdLCBbQUNfRElTQUJMRV9TSEFSRUQoJEApXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW10pCisKKworCisjIF9MVF9FTkFCTEVfU1RBVElDKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYHN0YXRpYycgYW5kCisjIGBkaXNhYmxlLXN0YXRpYycgTFRfSU5JVCBvcHRpb25zLgorIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCittNF9kZWZpbmUoW19MVF9FTkFCTEVfU1RBVElDXSwKK1ttNF9kZWZpbmUoW19MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCitBQ19BUkdfRU5BQkxFKFtzdGF0aWNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHN0YXRpYyBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKKyAgICAqKQorICAgICBlbmFibGVfc3RhdGljPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3N0YXRpYz15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfc3RhdGljPV1fTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKQorCisgICAgX0xUX0RFQ0woW2J1aWxkX29sZF9saWJzXSwgW2VuYWJsZV9zdGF0aWNdLCBbMF0sCisJW1doZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorXSkjIF9MVF9FTkFCTEVfU1RBVElDCisKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbc3RhdGljXSwgW19MVF9FTkFCTEVfU1RBVElDKFt5ZXNdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtc3RhdGljXSwgW19MVF9FTkFCTEVfU1RBVElDKFtub10pXSkKKworIyBPbGQgbmFtZXM6CitBQ19ERUZVTihbQUNfRU5BQkxFX1NUQVRJQ10sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtzdGF0aWNdKQorXSkKKworQUNfREVGVU4oW0FDX0RJU0FCTEVfU1RBVElDXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLXN0YXRpY10pCitdKQorCitBVV9ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sIFtBQ19FTkFCTEVfU1RBVElDKCRAKV0pCitBVV9ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbQUNfRElTQUJMRV9TVEFUSUMoJEApXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9FTkFCTEVfU1RBVElDXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW10pCisKKworCisjIF9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYGZhc3QtaW5zdGFsbCcKKyMgYW5kIGBkaXNhYmxlLWZhc3QtaW5zdGFsbCcgTFRfSU5JVCBvcHRpb25zLgorIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCittNF9kZWZpbmUoW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMXSwKK1ttNF9kZWZpbmUoW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCitBQ19BUkdfRU5BQkxFKFtmYXN0LWluc3RhbGxdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZmFzdC1pbnN0YWxsQDw6QD1QS0dTQDo+QF0sCisgICAgW29wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKKyAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfZmFzdF9pbnN0YWxsPV1fTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKQorCitfTFRfREVDTChbZmFzdF9pbnN0YWxsXSwgW2VuYWJsZV9mYXN0X2luc3RhbGxdLCBbMF0sCisJIFtXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb25dKWRubAorXSkjIF9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMCisKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZmFzdC1pbnN0YWxsXSwgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFt5ZXNdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtZmFzdC1pbnN0YWxsXSwgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFtub10pXSkKKworIyBPbGQgbmFtZXM6CitBVV9ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtmYXN0LWluc3RhbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UgcHV0Cit0aGUgYGZhc3QtaW5zdGFsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworQVVfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLWZhc3QtaW5zdGFsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdSBwdXQKK3RoZSBgZGlzYWJsZS1mYXN0LWluc3RhbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sIFtdKQorCisKKyMgX0xUX1dJVEhfUElDKFtNT0RFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLXdpdGgtcGljIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgcGljLW9ubHknIGFuZCBgbm8tcGljJworIyBMVF9JTklUIG9wdGlvbnMuCisjIE1PREUgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgYm90aCcuCittNF9kZWZpbmUoW19MVF9XSVRIX1BJQ10sCitbQUNfQVJHX1dJVEgoW3BpY10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtcGljXSwKKwlbdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9dXNlIGJvdGhAOj5AXSldLAorICAgIFtwaWNfbW9kZT0iJHdpdGh2YWwiXSwKKyAgICBbcGljX21vZGU9ZGVmYXVsdF0pCisKK3Rlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9bTRfZGVmYXVsdChbJDFdLCBbZGVmYXVsdF0pCisKK19MVF9ERUNMKFtdLCBbcGljX21vZGVdLCBbMF0sIFtXaGF0IHR5cGUgb2Ygb2JqZWN0cyB0byBidWlsZF0pZG5sCitdKSMgX0xUX1dJVEhfUElDCisKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbcGljLW9ubHldLCBbX0xUX1dJVEhfUElDKFt5ZXNdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW25vLXBpY10sIFtfTFRfV0lUSF9QSUMoW25vXSldKQorCisjIE9sZCBuYW1lOgorQVVfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbcGljLW9ubHldKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UKK3B1dCB0aGUgYHBpYy1vbmx5JyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sIFtdKQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTFRETF9JTklUIE9wdGlvbnMgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisKK200X2RlZmluZShbX0xURExfTU9ERV0sIFtdKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW25vbnJlY3Vyc2l2ZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW25vbnJlY3Vyc2l2ZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtyZWN1cnNpdmVdLAorCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtyZWN1cnNpdmVdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbc3VicHJvamVjdF0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW3N1YnByb2plY3RdKV0pCisKK200X2RlZmluZShbX0xURExfVFlQRV0sIFtdKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW2luc3RhbGxhYmxlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbaW5zdGFsbGFibGVdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbY29udmVuaWVuY2VdLAorCQkgW200X2RlZmluZShbX0xURExfVFlQRV0sIFtjb252ZW5pZW5jZV0pXSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9sdHN1Z2FyLm00IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2x0c3VnYXIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwMGEwNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9sdHN1Z2FyLm00CkBAIC0wLDAgKzEsMTIzIEBACisjIGx0c3VnYXIubTQgLS0gbGlidG9vbCBtNCBiYXNlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAtKi1BdXRvY29uZi0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNiBsdHN1Z2FyLm00CisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRTVUdBUl9WRVJTSU9OXSwgW200X2lmKFswLjFdKV0pCisKKworIyBsdF9qb2luKFNFUCwgQVJHMSwgW0FSRzIuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIEFSRzFTRVBBUkcyLi4uU0VQQVJHbiwgb21pdHRpbmcgW10gYXJndW1lbnRzIGFuZCB0aGVpcgorIyBhc3NvY2lhdGVkIHNlcGFyYXRvci4KKyMgTmVlZGVkIHVudGlsIHdlIGNhbiByZWx5IG9uIG00X2pvaW4gZnJvbSBBdXRvY29uZiAyLjYyLCBzaW5jZSBhbGwgZWFybGllcgorIyB2ZXJzaW9ucyBpbiBtNHN1Z2FyIGhhZCBidWdzLgorbTRfZGVmaW5lKFtsdF9qb2luXSwKK1ttNF9pZihbJCNdLCBbMV0sIFtdLAorICAgICAgIFskI10sIFsyXSwgW1skMl1dLAorICAgICAgIFttNF9pZihbJDJdLCBbXSwgW10sIFtbJDJdX10pJDAoWyQxXSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSldKV0pCittNF9kZWZpbmUoW19sdF9qb2luXSwKK1ttNF9pZihbJCMkMl0sIFsyXSwgW10sCisgICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMSQyXV0pJDAoWyQxXSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSldKV0pCisKKworIyBsdF9jYXIoTElTVCkKKyMgbHRfY2RyKExJU1QpCisjIC0tLS0tLS0tLS0tLQorIyBNYW5pcHVsYXRlIG00IGxpc3RzLgorIyBUaGVzZSBtYWNyb3MgYXJlIG5lY2Vzc2FyeSBhcyBsb25nIGFzIHdpbGwgc3RpbGwgbmVlZCB0byBzdXBwb3J0CisjIEF1dG9jb25mLTIuNTkgd2hpY2ggcXVvdGVzIGRpZmZlcmVudGx5LgorbTRfZGVmaW5lKFtsdF9jYXJdLCBbWyQxXV0pCittNF9kZWZpbmUoW2x0X2Nkcl0sCitbbTRfaWYoWyQjXSwgMCwgW200X2ZhdGFsKFskMDogY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50c10pXSwKKyAgICAgICBbJCNdLCAxLCBbXSwKKyAgICAgICBbbTRfZHF1b3RlKG00X3NoaWZ0KCRAKSldKV0pCittNF9kZWZpbmUoW2x0X3VucXVvdGVdLCAkMSkKKworCisjIGx0X2FwcGVuZChNQUNSTy1OQU1FLCBTVFJJTkcsIFtTRVBBUkFUT1JdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVkZWZpbmUgTUFDUk8tTkFNRSB0byBob2xkIGl0cyBmb3JtZXIgY29udGVudCBwbHVzIGBTRVBBUkFUT1InYFNUUklORycuCisjIE5vdGUgdGhhdCBuZWl0aGVyIFNFUEFSQVRPUiBub3IgU1RSSU5HIGFyZSBleHBhbmRlZDsgdGhleSBhcmUgYXBwZW5kZWQKKyMgdG8gTUFDUk8tTkFNRSBhcyBpcyAobGVhdmluZyB0aGUgZXhwYW5zaW9uIGZvciB3aGVuIE1BQ1JPLU5BTUUgaXMgaW52b2tlZCkuCisjIE5vIFNFUEFSQVRPUiBpcyBvdXRwdXQgaWYgTUFDUk8tTkFNRSB3YXMgcHJldmlvdXNseSB1bmRlZmluZWQgKGRpZmZlcmVudAorIyB0aGFuIGRlZmluZWQgYW5kIGVtcHR5KS4KKyMKKyMgVGhpcyBtYWNybyBpcyBuZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gQXV0b2NvbmYgMi42Miwgc2luY2UgZWFybGllcgorIyB2ZXJzaW9ucyBvZiBtNHN1Z2FyIG1pc3Rha2VubHkgZXhwYW5kZWQgU0VQQVJBVE9SIGJ1dCBub3QgU1RSSU5HLgorbTRfZGVmaW5lKFtsdF9hcHBlbmRdLAorW200X2RlZmluZShbJDFdLAorCSAgIG00X2lmZGVmKFskMV0sIFttNF9kZWZuKFskMV0pWyQzXV0pWyQyXSldKQorCisKKworIyBsdF9jb21iaW5lKFNFUCwgUFJFRklYLUxJU1QsIElORklYLCBTVUZGSVgxLCBbU1VGRklYMi4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBhIFNFUCBkZWxpbWl0ZWQgbGlzdCBvZiBhbGwgcGFpcmVkIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBvZgorIyBQUkVGSVgtTElTVCB3aXRoIFNVRkZJWDEgdGhyb3VnaCBTVUZGSVhuLiAgRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0CisjIGhhcyB0aGUgZm9ybSBQUkVGSVhtSU5GSVhTVUZGSVhuLgorIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfY29tYmluZSBhZGRlZCBpbiBBdXRvY29uZiAyLjYyLgorbTRfZGVmaW5lKFtsdF9jb21iaW5lXSwKK1ttNF9pZihtNF9ldmFsKFskIyA+IDNdKSwgWzFdLAorICAgICAgIFttNF9wdXNoZGVmKFtfTHRfc2VwXSwgW200X2RlZmluZShbX0x0X3NlcF0sIG00X2RlZm4oW2x0X2Nhcl0pKV0pXV1kbmwKK1tbbTRfZm9yZWFjaChbX0x0X3ByZWZpeF0sIFskMl0sCisJICAgICBbbTRfZm9yZWFjaChbX0x0X3N1ZmZpeF0sCisJCV1tNF9kcXVvdGUobTRfZHF1b3RlKG00X3NoaWZ0KG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpKSlbLAorCVtfTHRfc2VwKFskMV0pW11tNF9kZWZuKFtfTHRfcHJlZml4XSlbJDNdbTRfZGVmbihbX0x0X3N1ZmZpeF0pXSldKV0pXSkKKworCisjIGx0X2lmX2FwcGVuZF91bmlxKE1BQ1JPLU5BTUUsIFZBUk5BTUUsIFtTRVBBUkFUT1JdLCBbVU5JUV0sIFtOT1QtVU5JUV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElmZiBNQUNSTy1OQU1FIGRvZXMgbm90IHlldCBjb250YWluIFZBUk5BTUUsIHRoZW4gYXBwZW5kIGl0IChkZWxpbWl0ZWQKKyMgYnkgU0VQQVJBVE9SIGlmIHN1cHBsaWVkKSBhbmQgZXhwYW5kIFVOSVEsIGVsc2UgTk9ULVVOSVEuCittNF9kZWZpbmUoW2x0X2lmX2FwcGVuZF91bmlxXSwKK1ttNF9pZmRlZihbJDFdLAorCSAgW200X2lmKG00X2luZGV4KFskM11tNF9kZWZuKFskMV0pWyQzXSwgWyQzJDIkM10pLCBbLTFdLAorCQkgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSwKKwkJIFskNV0pXSwKKwkgIFtsdF9hcHBlbmQoWyQxXSwgWyQyXSwgWyQzXSkkNF0pXSkKKworCisjIGx0X2RpY3RfYWRkKERJQ1QsIEtFWSwgVkFMVUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfYWRkXSwKK1ttNF9kZWZpbmUoWyQxKCQyKV0sIFskM10pXSkKKworCisjIGx0X2RpY3RfYWRkX3N1YmtleShESUNULCBLRVksIFNVQktFWSwgVkFMVUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfYWRkX3N1YmtleV0sCitbbTRfZGVmaW5lKFskMSgkMjokMyldLCBbJDRdKV0pCisKKworIyBsdF9kaWN0X2ZldGNoKERJQ1QsIEtFWSwgW1NVQktFWV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9mZXRjaF0sCitbbTRfaWZ2YWwoWyQzXSwKKwltNF9pZmRlZihbJDEoJDI6JDMpXSwgW200X2RlZm4oWyQxKCQyOiQzKV0pXSksCisgICAgbTRfaWZkZWYoWyQxKCQyKV0sIFttNF9kZWZuKFskMSgkMildKV0pKV0pCisKKworIyBsdF9pZl9kaWN0X2ZldGNoKERJQ1QsIEtFWSwgW1NVQktFWV0sIFZBTFVFLCBJRi1UUlVFLCBbSUYtRkFMU0VdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9pZl9kaWN0X2ZldGNoXSwKK1ttNF9pZihsdF9kaWN0X2ZldGNoKFskMV0sIFskMl0sIFskM10pLCBbJDRdLAorCVskNV0sCisgICAgWyQ2XSldKQorCisKKyMgbHRfZGljdF9maWx0ZXIoRElDVCwgW1NVQktFWV0sIFZBTFVFLCBbU0VQQVJBVE9SXSwgS0VZLCBbLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9maWx0ZXJdLAorW200X2lmKFskNV0sIFtdLCBbXSwKKyAgW2x0X2pvaW4obTRfcXVvdGUobTRfZGVmYXVsdChbJDRdLCBbWywgXV0pKSwKKyAgICAgICAgICAgbHRfdW5xdW90ZShtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfZm9yZWFjaChfTHRfa2V5LCBsdF9jYXIoW200X3NoaWZ0big0LCAkQCldKSwKKwkJICAgICAgW2x0X2lmX2RpY3RfZmV0Y2goWyQxXSwgX0x0X2tleSwgWyQyXSwgWyQzXSwgW19MdF9rZXkgXSldKSkpKSldKVtdZG5sCitdKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2x0dmVyc2lvbi5tNCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9sdHZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3YjVkNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9sdHZlcnNpb24ubTQKQEAgLTAsMCArMSwyMyBAQAorIyBsdHZlcnNpb24ubTQgLS0gdmVyc2lvbiBudW1iZXJzCQkJLSotIEF1dG9jb25mIC0qLQorIworIyAgIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQsIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgc2VyaWFsIDMyOTMgbHR2ZXJzaW9uLm00CisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sCisKK200X2RlZmluZShbTFRfUEFDS0FHRV9WRVJTSU9OXSwgWzIuNF0pCittNF9kZWZpbmUoW0xUX1BBQ0tBR0VfUkVWSVNJT05dLCBbMS4zMjkzXSkKKworQUNfREVGVU4oW0xUVkVSU0lPTl9WRVJTSU9OXSwKK1ttYWNyb192ZXJzaW9uPScyLjQnCittYWNyb19yZXZpc2lvbj0nMS4zMjkzJworX0xUX0RFQ0woLCBtYWNyb192ZXJzaW9uLCAwLCBbV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkP10pCitfTFRfREVDTCgsIG1hY3JvX3JldmlzaW9uLCAwKQorXSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9sdH5vYnNvbGV0ZS5tNCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tNC9sdH5vYnNvbGV0ZS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTczZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL200L2x0fm9ic29sZXRlLm00CkBAIC0wLDAgKzEsOTggQEAKKyMgbHR+b2Jzb2xldGUubTQgLS0gYWNsb2NhbCBzYXRpc2Z5aW5nIG9ic29sZXRlIGRlZmluaXRpb25zLiAgICAtKi1BdXRvY29uZi0qLQorIworIyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQsIDIwMDQuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNSBsdH5vYnNvbGV0ZS5tNAorCisjIFRoZXNlIGV4aXN0IGVudGlyZWx5IHRvIGZvb2wgYWNsb2NhbCB3aGVuIGJvb3RzdHJhcHBpbmcgbGlidG9vbC4KKyMKKyMgSW4gdGhlIHBhc3QgbGlidG9vbC5tNCBoYXMgcHJvdmlkZWQgbWFjcm9zIHZpYSBBQ19ERUZVTiAob3IgQVVfREVGVU4pCisjIHdoaWNoIGhhdmUgbGF0ZXIgYmVlbiBjaGFuZ2VkIHRvIG00X2RlZmluZSBhcyB0aGV5IGFyZW4ndCBwYXJ0IG9mIHRoZQorIyBleHBvcnRlZCBBUEksIG9yIG1vdmVkIHRvIEF1dG9jb25mIG9yIEF1dG9tYWtlIHdoZXJlIHRoZXkgYmVsb25nLgorIworIyBUaGUgdHJvdWJsZSBpcywgYWNsb2NhbCBpcyBhIGJpdCB0aGljay4gIEl0J2xsIHNlZSB0aGUgb2xkIEFDX0RFRlVOCisjIGluIC91c3Ivc2hhcmUvYWNsb2NhbC9saWJ0b29sLm00IGFuZCByZW1lbWJlciBpdCwgdGhlbiB3aGVuIGl0IHNlZXMgdXMKKyMgdXNpbmcgYSBtYWNybyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gb3VyIGxvY2FsIG00L2xpYnRvb2wubTQgaXQnbGwKKyMgcHVsbCB0aGUgb2xkIGxpYnRvb2wubTQgaW4gKGl0IGRvZXNuJ3Qgc2VlIG91ciBzaGlueSBuZXcgbTRfZGVmaW5lCisjIGFuZCBkb2Vzbid0IGtub3cgYWJvdXQgQXV0b2NvbmYgbWFjcm9zIGF0IGFsbC4pCisjCisjIFNvIHdlIHByb3ZpZGUgdGhpcyBmaWxlLCB3aGljaCBoYXMgYSBzaWxseSBmaWxlbmFtZSBzbyBpdCdzIGFsd2F5cworIyBpbmNsdWRlZCBhZnRlciBldmVyeXRoaW5nIGVsc2UuICBUaGlzIHByb3ZpZGVzIGFjbG9jYWwgd2l0aCB0aGUKKyMgQUNfREVGVU5zIGl0IHdhbnRzLCBidXQgd2hlbiBtNCBwcm9jZXNzZXMgaXQsIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcKKyMgYmVjYXVzZSB0aG9zZSBtYWNyb3MgYWxyZWFkeSBleGlzdCwgb3Igd2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlci4KKyMgV2UgdXNlIEFDX0RFRlVOIG92ZXIgQVVfREVGVU4gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhY2xvY2FsLTEuNi4gCisjCisjIEFueXRpbWUgd2Ugd2l0aGRyYXcgYW4gQUNfREVGVU4gb3IgQVVfREVGVU4sIHJlbWVtYmVyIHRvIGFkZCBpdCBoZXJlLgorIyBZZXMsIHRoYXQgbWVhbnMgZXZlcnkgbmFtZSBvbmNlIHRha2VuIHdpbGwgbmVlZCB0byByZW1haW4gaGVyZSB1bnRpbAorIyB3ZSBnaXZlIHVwIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBiZWZvcmUgMS43LCBhdCB3aGljaCBwb2ludAorIyB3ZSBuZWVkIHRvIGtlZXAgb25seSB0aG9zZSBuYW1lcyB3aGljaCB3ZSBzdGlsbCByZWZlciB0by4KKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9CU09MRVRFX1ZFUlNJT05dLCBbbTRfaWYoWzFdKV0pCisKK200X2lmbmRlZihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dKV0pCittNF9pZm5kZWYoW0FDX1BST0dfRUdSRVBdLAkJW0FDX0RFRlVOKFtBQ19QUk9HX0VHUkVQXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCVtBQ19ERUZVTihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdKV0pCittNF9pZm5kZWYoW19MVF9BQ19TSEVMTF9JTklUXSwJCVtBQ19ERUZVTihbX0xUX0FDX1NIRUxMX0lOSVRdKV0pCittNF9pZm5kZWYoW19MVF9BQ19TWVNfTElCUEFUSF9BSVhdLAlbQUNfREVGVU4oW19MVF9BQ19TWVNfTElCUEFUSF9BSVhdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0xUTUFJTl0sCQlbQUNfREVGVU4oW19MVF9QUk9HX0xUTUFJTl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RBR1ZBUl0sCQlbQUNfREVGVU4oW19MVF9BQ19UQUdWQVJdKV0pCittNF9pZm5kZWYoW0FDX0xURExfRU5BQkxFX0lOU1RBTExdLAlbQUNfREVGVU4oW0FDX0xURExfRU5BQkxFX0lOU1RBTExdKV0pCittNF9pZm5kZWYoW0FDX0xURExfUFJFT1BFTl0sCQlbQUNfREVGVU4oW0FDX0xURExfUFJFT1BFTl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NZU19DT01QSUxFUl0sCVtBQ19ERUZVTihbX0xUX0FDX1NZU19DT01QSUxFUl0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xPQ0tdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTE9DS10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfT0xEX0FSQ0hJVkVdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX09MRF9BUkNISVZFXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSwJW0FDX0RFRlVOKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ0NfQ19PXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ0NfQ19PXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9PQkpESVJdLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX09CSkRJUl0pXSkKK200X2lmbmRlZihbQUNfTFRETF9PQkpESVJdLAkJW0FDX0RFRlVOKFtBQ19MVERMX09CSkRJUl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0pXSkKK200X2lmbmRlZihbQUNfUEFUSF9NQUdJQ10sCQlbQUNfREVGVU4oW0FDX1BBVEhfTUFHSUNdKV0pCittNF9pZm5kZWYoW0FDX1BST0dfTERfR05VXSwJCVtBQ19ERUZVTihbQUNfUFJPR19MRF9HTlVdKV0pCittNF9pZm5kZWYoW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddLAlbQUNfREVGVU4oW0FDX1BST0dfTERfUkVMT0FEX0ZMQUddKV0pCittNF9pZm5kZWYoW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSwJW0FDX0RFRlVOKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUF0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUF0pXSkKK200X2lmbmRlZihbTFRfQUNfUFJPR19FR1JFUF0sCQlbQUNfREVGVU4oW0xUX0FDX1BST0dfRUdSRVBdKV0pCittNF9pZm5kZWYoW0xUX0FDX1BST0dfU0VEXSwJCVtBQ19ERUZVTihbTFRfQUNfUFJPR19TRURdKV0pCittNF9pZm5kZWYoW19MVF9DQ19CQVNFTkFNRV0sCQlbQUNfREVGVU4oW19MVF9DQ19CQVNFTkFNRV0pXSkKK200X2lmbmRlZihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwJW0FDX0RFRlVOKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdKV0pCittNF9pZm5kZWYoW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAlbQUNfREVGVU4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdKV0pCittNF9pZm5kZWYoW19BQ19QUk9HX0xJQlRPT0xdLAkJW0FDX0RFRlVOKFtfQUNfUFJPR19MSUJUT09MXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NFVFVQXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TRVRVUF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0NIRUNLX0RMRkNOXSwJCVtBQ19ERUZVTihbX0xUX0FDX0NIRUNLX0RMRkNOXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdKV0pCittNF9pZm5kZWYoW19MVF9BQ19UQUdDT05GSUddLAkJW0FDX0RFRlVOKFtfTFRfQUNfVEFHQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCVtBQ19ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NYWF0sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfRjc3XSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3XSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19HQ0pdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0NPTkZJR10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfRklMRV9MVERMTF9DXSwJW0FDX0RFRlVOKFtfTFRfQUNfRklMRV9MVERMTF9DXSldKQorbTRfaWZuZGVmKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10sCVtBQ19ERUZVTihbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdKV0pCittNF9pZm5kZWYoW19MVF9BQ19QUk9HX0NYWENQUF0sCQlbQUNfREVGVU4oW19MVF9BQ19QUk9HX0NYWENQUF0pXSkKK200X2lmbmRlZihbX0xUX1BSRVBBUkVfU0VEX1FVT1RFX1ZBUlNdLAlbQUNfREVGVU4oW19MVF9QUkVQQVJFX1NFRF9RVU9URV9WQVJTXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCVtBQ19ERUZVTihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdKV0pCittNF9pZm5kZWYoW19MVF9QUk9HX0Y3N10sCQlbQUNfREVGVU4oW19MVF9QUk9HX0Y3N10pXSkKK200X2lmbmRlZihbX0xUX1BST0dfRkNdLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19GQ10pXSkKK200X2lmbmRlZihbX0xUX1BST0dfQ1hYXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfQ1hYXSldKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21hbi9NYWtlZmlsZS5hbSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tYW4vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxOTI3NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tYW4vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACisjIyBQcm9jZXNzIHRoaXMgd2l0aCBhdXRvbWFrZSB0byBjcmVhdGUgTWFrZWZpbGUuaW4KKworQVVUT01BS0VfT1BUSU9OUz1mb3JlaWduCisKK0VYVFJBX0RJU1QgPSBmZmkuMyBmZmlfY2FsbC4zIGZmaV9wcmVwX2NpZi4zCisKK21hbl9NQU5TID0gZmZpLjMgZmZpX2NhbGwuMyBmZmlfcHJlcF9jaWYuMworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbWFuL01ha2VmaWxlLmluIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21hbi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I1ZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21hbi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ2NiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK3N1YmRpciA9IG1hbgorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9heF9jY19tYXhvcHQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2ZsYWdzX3dhcm5fYWxsLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NvbXBpbGVyX3ZlbmRvci5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jb25maWd1cmVfYXJncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9lbmFibGVfYnVpbGRkaXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfZ2NjX2FyY2hmbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2djY194ODZfY3B1aWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCAkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00ICQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9mZmljb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCittYW4zZGlyID0gJChtYW5kaXIpL21hbjMKK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChtYW4zZGlyKSIKK05ST0ZGID0gbnJvZmYKK01BTlMgPSAkKG1hbl9NQU5TKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0xUTERGTEFHUyA9IEBBTV9MVExERkxBR1NACitBTV9SVU5URVNURkxBR1MgPSBAQU1fUlVOVEVTVEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0RFUE1PREUgPSBAQ0NBU0RFUE1PREVACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSA9IEBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitIQVZFX0xPTkdfRE9VQkxFID0gQEhBVkVfTE9OR19ET1VCTEVACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BSVERJQUcgPSBAUFJURElBR0AKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVEFSR0VUID0gQFRBUkdFVEAKK1RBUkdFVERJUiA9IEBUQVJHRVRESVJACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitheF9lbmFibGVfYnVpbGRkaXJfc2VkID0gQGF4X2VuYWJsZV9idWlsZGRpcl9zZWRACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzX3N5bWJvbF91bmRlcnNjb3JlID0gQHN5c19zeW1ib2xfdW5kZXJzY29yZUAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldCA9IEB0YXJnZXRACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAordGFyZ2V0X29zID0gQHRhcmdldF9vc0AKK3RhcmdldF92ZW5kb3IgPSBAdGFyZ2V0X3ZlbmRvckAKK3Rvb2xleGVjZGlyID0gQHRvb2xleGVjZGlyQAordG9vbGV4ZWNsaWJkaXIgPSBAdG9vbGV4ZWNsaWJkaXJACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24KK0VYVFJBX0RJU1QgPSBmZmkuMyBmZmlfY2FsbC4zIGZmaV9wcmVwX2NpZi4zCittYW5fTUFOUyA9IGZmaS4zIGZmaV9jYWxsLjMgZmZpX3ByZXBfY2lmLjMKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiBtYW4vTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduIG1hbi9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtbWFuMzogJChtYW5fTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKG1hbjNkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtYW4zZGlyKSIKKwlAbGlzdD0nJzsgdGVzdCAtbiAiJChtYW4zZGlyKSIgfHwgZXhpdCAwOyBcCisJeyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBlY2hvICIkJGkiOyBkb25lIHwgXAorCSAgc2VkIC1uICcvXC4zW2Etel0qJCQvcCc7IFwKKwl9IHwgd2hpbGUgcmVhZCBwOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAnbjtzLC4qLywsO3A7aDtzLC4qXC4sLDtzLF5bXjNdWzAtOWEtel0qJCQsMyw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJyB8IFwKKwlzZWQgJ047TjtzLFxuLCAsZycgfCB7IFwKKwlsaXN0PTsgd2hpbGUgcmVhZCBmaWxlIGJhc2UgaW5zdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRiYXNlIiA9ICIkJGluc3QiOyB0aGVuIGxpc3Q9IiQkbGlzdCAkJGZpbGUiOyBlbHNlIFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuM2RpcikvJCRpbnN0JyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW4zZGlyKS8kJGluc3QiIHx8IGV4aXQgJCQ/OyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKG1hbjNkaXIpJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKG1hbjNkaXIpIiB8fCBleGl0ICQkPzsgfTsgXAorCWRvbmU7IH0KKwordW5pbnN0YWxsLW1hbjM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJzsgdGVzdCAtbiAiJChtYW4zZGlyKSIgfHwgZXhpdCAwOyBcCisJZmlsZXM9YHsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gZWNobyAiJCRpIjsgZG9uZSB8IFwKKwkgIHNlZCAtbiAnL1wuM1thLXpdKiQkL3AnOyBcCisJfSB8IHNlZCAtZSAncywuKi8sLDtoO3MsLipcLiwsO3MsXlteM11bMC05YS16XSokJCwzLDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnYDsgXAorCXRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgZWNobyAiICggY2QgJyQoREVTVERJUikkKG1hbjNkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwkgIGNkICIkKERFU1RESVIpJChtYW4zZGlyKSIgJiYgcm0gLWYgJCRmaWxlczsgfQordGFnczogVEFHUworVEFHUzoKKworY3RhZ3M6IENUQUdTCitDVEFHUzoKKworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAbGlzdD0nJChNQU5TKSc7IGlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVsc2UgOjsgZmk7IGRvbmVgOyBcCisJICBpZiB0ZXN0IC1uICIkJGxpc3QiICYmIFwKKwkgICAgZ3JlcCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgPi9kZXYvbnVsbDsgdGhlbiBcCisJICAgIGVjaG8gImVycm9yOiBmb3VuZCBtYW4gcGFnZXMgY29udGFpbmluZyB0aGUgXGBtaXNzaW5nIGhlbHAybWFuJyByZXBsYWNlbWVudCB0ZXh0OiIgPiYyOyBcCisJICAgIGdyZXAgLWwgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0IHwgc2VkICdzL14vICAgICAgICAgLycgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0byBmaXggdGhlbSwgaW5zdGFsbCBoZWxwMm1hbiwgcmVtb3ZlIGFuZCByZWdlbmVyYXRlIHRoZSBtYW4gcGFnZXM7IiA+JjI7IFwKKwkgICAgZWNobyAiICAgICAgIHR5cGljYWxseSBcYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgd2lsbCByZW1vdmUgdGhlbSIgPiYyOyBcCisJICAgIGV4aXQgMTsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWVsc2UgOjsgZmkKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKE1BTlMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChtYW4zZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjMKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuCisKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW4zCisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLW1hbjMgXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuMworCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tYW4vZmZpLjMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbWFuL2ZmaS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjVkNWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbWFuL2ZmaS4zCkBAIC0wLDAgKzEsMzEgQEAKKy5EZCBGZWJydWFyeSAxNSwgMjAwOAorLkR0IEZGSSAzCisuU2ggTkFNRQorLk5tIEZGSQorLk5kIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCisuU2ggTElCUkFSWQorbGliZmZpLCAtbGZmaQorLlNoIFNZTk9QU0lTCisuSW4gZmZpLmgKKy5GdCBmZmlfc3RhdHVzCisuRm8gZmZpX3ByZXBfY2lmCisuRmEgImZmaV9jaWYgKmNpZiIKKy5GYSAiZmZpX2FiaSBhYmkiCisuRmEgInVuc2lnbmVkIGludCBuYXJncyIKKy5GYSAiZmZpX3R5cGUgKnJ0eXBlIgorLkZhICJmZmlfdHlwZSAqKmF0eXBlcyIKKy5GYworLkZ0IHZvaWQKKy5GbyBmZmlfY2FsbAorLkZhICJmZmlfY2lmICpjaWYiCisuRmEgInZvaWQgKCpmbikodm9pZCkiCisuRmEgInZvaWQgKnJ2YWx1ZSIKKy5GYSAidm9pZCAqKmF2YWx1ZSIKKy5GYworLlNoIERFU0NSSVBUSU9OCitUaGUgZm9yZWlnbiBmdW5jdGlvbiBpbnRlcmZhY2UgcHJvdmlkZXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggYSBmdW5jdGlvbiBjYW4KK2dlbmVyYXRlIGEgY2FsbCB0byBhbm90aGVyIGZ1bmN0aW9uIGF0IHJ1bnRpbWUgd2l0aG91dCByZXF1aXJpbmcga25vd2xlZGdlIG9mCit0aGUgY2FsbGVkIGZ1bmN0aW9uJ3MgaW50ZXJmYWNlIGF0IGNvbXBpbGUgdGltZS4KKy5TaCBTRUUgQUxTTworLlhyIGZmaV9wcmVwX2NpZiAzICwKKy5YciBmZmlfY2FsbCAzCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbWFuL2ZmaV9jYWxsLjMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbWFuL2ZmaV9jYWxsLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1MTUxMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tYW4vZmZpX2NhbGwuMwpAQCAtMCwwICsxLDEwMyBAQAorLkRkIEZlYnJ1YXJ5IDE1LCAyMDA4CisuRHQgZmZpX2NhbGwgMworLlNoIE5BTUUKKy5ObSBmZmlfY2FsbAorLk5kIEludm9rZSBhIGZvcmVpZ24gZnVuY3Rpb24uCisuU2ggU1lOT1BTSVMKKy5JbiBmZmkuaAorLkZ0IHZvaWQKKy5GbyBmZmlfY2FsbAorLkZhICJmZmlfY2lmICpjaWYiCisuRmEgInZvaWQgKCpmbikodm9pZCkiCisuRmEgInZvaWQgKnJ2YWx1ZSIKKy5GYSAidm9pZCAqKmF2YWx1ZSIKKy5GYworLlNoIERFU0NSSVBUSU9OCitUaGUKKy5ObSBmZmlfY2FsbAorZnVuY3Rpb24gcHJvdmlkZXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIHdpdGhvdXQKK3JlcXVpcmluZyBrbm93bGVkZ2Ugb2YgdGhlIGZ1bmN0aW9uJ3MgaW50ZXJmYWNlIGF0IGNvbXBpbGUgdGltZS4KKy5GYSBmbgoraXMgY2FsbGVkIHdpdGggdGhlIHZhbHVlcyByZXRyaWV2ZWQgZnJvbSB0aGUgcG9pbnRlcnMgaW4gdGhlCisuRmEgYXZhbHVlCithcnJheS4gVGhlIHJldHVybiB2YWx1ZSBmcm9tCisuRmEgZm4KK2lzIHBsYWNlZCBpbiBzdG9yYWdlIHBvaW50ZWQgdG8gYnkKKy5GYSBydmFsdWUgLgorLkZhIGNpZgorY29udGFpbnMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgZGF0YSB0eXBlcywgc2l6ZXMgYW5kIGFsaWdubWVudHMgb2YgdGhlCithcmd1bWVudHMgdG8gYW5kIHJldHVybiB2YWx1ZSBmcm9tCisuRmEgZm4gLAorYW5kIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aAorLk5tIGZmaV9wcmVwX2NpZgorYmVmb3JlIGl0IGlzIHVzZWQgd2l0aAorLk5tIGZmaV9jYWxsIC4KKy5QcAorLkZhIHJ2YWx1ZQorbXVzdCBwb2ludCB0byBzdG9yYWdlIHRoYXQgaXMgc2l6ZW9mKGZmaV9hcmcpIG9yIGxhcmdlciBmb3Igbm9uLWZsb2F0aW5nIHBvaW50Cit0eXBlcy4gRm9yIHNtYWxsZXItc2l6ZWQgcmV0dXJuIHZhbHVlIHR5cGVzLCB0aGUKKy5ObSBmZmlfYXJnCitvcgorLk5tIGZmaV9zYXJnCitpbnRlZ3JhbCB0eXBlIG11c3QgYmUgdXNlZCB0byBob2xkCit0aGUgcmV0dXJuIHZhbHVlLgorLlNoIEVYQU1QTEVTCisuQmQgLWxpdGVyYWwKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit1bnNpZ25lZCBjaGFyCitmb28odW5zaWduZWQgaW50LCBmbG9hdCk7CisKK2ludAorbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisgICAgZmZpX2NpZiBjaWY7CisgICAgZmZpX3R5cGUgKmFyZ190eXBlc1syXTsKKyAgICB2b2lkICphcmdfdmFsdWVzWzJdOworICAgIGZmaV9zdGF0dXMgc3RhdHVzOworCisgICAgLy8gQmVjYXVzZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gZm9vKCkgaXMgc21hbGxlciB0aGFuIHNpemVvZihsb25nKSwgaXQKKyAgICAvLyBtdXN0IGJlIHBhc3NlZCBhcyBmZmlfYXJnIG9yIGZmaV9zYXJnLgorICAgIGZmaV9hcmcgcmVzdWx0OworCisgICAgLy8gU3BlY2lmeSB0aGUgZGF0YSB0eXBlIG9mIGVhY2ggYXJndW1lbnQuIEF2YWlsYWJsZSB0eXBlcyBhcmUgZGVmaW5lZAorICAgIC8vIGluIDxmZmkvZmZpLmg+LgorICAgIGFyZ190eXBlc1swXSA9ICZmZmlfdHlwZV91aW50OworICAgIGFyZ190eXBlc1sxXSA9ICZmZmlfdHlwZV9mbG9hdDsKKworICAgIC8vIFByZXBhcmUgdGhlIGZmaV9jaWYgc3RydWN0dXJlLgorICAgIGlmICgoc3RhdHVzID0gZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwKKyAgICAgICAgMiwgJmZmaV90eXBlX3VpbnQ4LCBhcmdfdHlwZXMpKSAhPSBGRklfT0spCisgICAgeworICAgICAgICAvLyBIYW5kbGUgdGhlIGZmaV9zdGF0dXMgZXJyb3IuCisgICAgfQorCisgICAgLy8gU3BlY2lmeSB0aGUgdmFsdWVzIG9mIGVhY2ggYXJndW1lbnQuCisgICAgdW5zaWduZWQgaW50IGFyZzEgPSA0MjsKKyAgICBmbG9hdCBhcmcyID0gNS4xOworCisgICAgYXJnX3ZhbHVlc1swXSA9ICZhcmcxOworICAgIGFyZ192YWx1ZXNbMV0gPSAmYXJnMjsKKworICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24uCisgICAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGZvbyksICZyZXN1bHQsIGFyZ192YWx1ZXMpOworCisgICAgLy8gVGhlIGZmaV9hcmcgJ3Jlc3VsdCcgbm93IGNvbnRhaW5zIHRoZSB1bnNpZ25lZCBjaGFyIHJldHVybmVkIGZyb20gZm9vKCksCisgICAgLy8gd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IGEgdHlwZWNhc3QuCisgICAgcHJpbnRmKCJyZXN1bHQgaXMgJWhodSIsICh1bnNpZ25lZCBjaGFyKXJlc3VsdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLy8gVGhlIHRhcmdldCBmdW5jdGlvbi4KK3Vuc2lnbmVkIGNoYXIKK2Zvbyh1bnNpZ25lZCBpbnQgeCwgZmxvYXQgeSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHJlc3VsdCA9IHggLSB5OworICAgIHJldHVybiByZXN1bHQ7Cit9CisuRWQKKy5TaCBTRUUgQUxTTworLlhyIGZmaSAzICwKKy5YciBmZmlfcHJlcF9jaWYgMwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21hbi9mZmlfcHJlcF9jaWYuMyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tYW4vZmZpX3ByZXBfY2lmLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzNmIzMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9tYW4vZmZpX3ByZXBfY2lmLjMKQEAgLTAsMCArMSw2NiBAQAorLkRkIEZlYnJ1YXJ5IDE1LCAyMDA4CisuRHQgZmZpX3ByZXBfY2lmIDMKKy5TaCBOQU1FCisuTm0gZmZpX3ByZXBfY2lmCisuTmQgUHJlcGFyZSBhCisuTm0gZmZpX2NpZgorc3RydWN0dXJlIGZvciB1c2Ugd2l0aAorLk5tIGZmaV9jYWxsIAorLgorLlNoIFNZTk9QU0lTCisuSW4gZmZpLmgKKy5GdCBmZmlfc3RhdHVzCisuRm8gZmZpX3ByZXBfY2lmCisuRmEgImZmaV9jaWYgKmNpZiIKKy5GYSAiZmZpX2FiaSBhYmkiCisuRmEgInVuc2lnbmVkIGludCBuYXJncyIKKy5GYSAiZmZpX3R5cGUgKnJ0eXBlIgorLkZhICJmZmlfdHlwZSAqKmF0eXBlcyIKKy5GYworLlNoIERFU0NSSVBUSU9OCitUaGUKKy5ObSBmZmlfcHJlcF9jaWYKK2Z1bmN0aW9uIHByZXBhcmVzIGEKKy5ObSBmZmlfY2lmCitzdHJ1Y3R1cmUgZm9yIHVzZSB3aXRoIAorLk5tIGZmaV9jYWxsCisuCisuRmEgYWJpCitzcGVjaWZpZXMgYSBzZXQgb2YgY2FsbGluZyBjb252ZW50aW9ucyB0byB1c2UuCisuRmEgYXR5cGVzCitpcyBhbiBhcnJheSBvZgorLkZhIG5hcmdzCitwb2ludGVycyB0bworLk5tIGZmaV90eXBlCitzdHJ1Y3RzIHRoYXQgZGVzY3JpYmUgdGhlIGRhdGEgdHlwZSwgc2l6ZSBhbmQgYWxpZ25tZW50IG9mIGVhY2ggYXJndW1lbnQuCisuRmEgcnR5cGUKK3BvaW50cyB0byBhbgorLk5tIGZmaV90eXBlCit0aGF0IGRlc2NyaWJlcyB0aGUgZGF0YSB0eXBlLCBzaXplIGFuZCBhbGlnbm1lbnQgb2YgdGhlCityZXR1cm4gdmFsdWUuCisuU2ggUkVUVVJOIFZBTFVFUworVXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24sCisuTm0gZmZpX3ByZXBfY2lmCityZXR1cm5zCisuTm0gRkZJX09LIC4KK0l0IHdpbGwgcmV0dXJuCisuTm0gRkZJX0JBRF9UWVBFREVGCitpZgorLkZhIGNpZgoraXMKKy5ObSBOVUxMCitvcgorLkZhIGF0eXBlcworb3IKKy5GYSBydHlwZQoraXMgbWFsZm9ybWVkLiBJZgorLkZhIGFiaQorZG9lcyBub3QgcmVmZXIgdG8gYSB2YWxpZCBBQkksCisuTm0gRkZJX0JBRF9BQkkKK3dpbGwgYmUgcmV0dXJuZWQuIEF2YWlsYWJsZSBBQklzIGFyZQorZGVmaW5lZCBpbgorLk5tIDxmZml0YXJnZXQuaD4KKy4KKy5TaCBTRUUgQUxTTworLlhyIGZmaSAzICwKKy5YciBmZmlfY2FsbCAzIApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21kYXRlLXNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21kYXRlLXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTE2YzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbWRhdGUtc2gKQEAgLTAsMCArMSwyMDEgQEAKKyMhL2Jpbi9zaAorIyBHZXQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgcHJldHR5LXByaW50IGl0LgorCitzY3JpcHR2ZXJzaW9uPTIwMDUtMDYtMjkuMjIKKworIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjIHdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCBKdW5lIDE5OTUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0CisjIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KKyMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBmaWxlLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IG1kYXRlLXNoIFstLWhlbHBdIFstLXZlcnNpb25dIEZJTEUKKworUHJldHR5LXByaW50IHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBGSUxFLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgorRU9GCisgICAgZXhpdCAkPworICAgIDs7CisgIC12IHwgLS12KikKKyAgICBlY2hvICJtZGF0ZS1zaCAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0ICQ/CisgICAgOzsKK2VzYWMKKworIyBQcmV2ZW50IGRhdGUgZ2l2aW5nIHJlc3BvbnNlIGluIGFub3RoZXIgbGFuZ3VhZ2UuCitMQU5HPUMKK2V4cG9ydCBMQU5HCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTENfVElNRT1DCitleHBvcnQgTENfVElNRQorCisjIEdOVSBscyBjaGFuZ2VzIGl0cyB0aW1lIGZvcm1hdCBpbiByZXNwb25zZSB0byB0aGUgVElNRV9TVFlMRQorIyB2YXJpYWJsZS4gIFNpbmNlIHdlIGNhbm5vdCBhc3N1bWUgYHVuc2V0JyB3b3JrcywgcmV2ZXJ0IHRoaXMKKyMgdmFyaWFibGUgdG8gaXRzIGRvY3VtZW50ZWQgZGVmYXVsdC4KK2lmIHRlc3QgIiR7VElNRV9TVFlMRStzZXR9IiA9IHNldDsgdGhlbgorICBUSU1FX1NUWUxFPXBvc2l4LWxvbmctaXNvCisgIGV4cG9ydCBUSU1FX1NUWUxFCitmaQorCitzYXZlX2FyZzE9JDEKKworIyBGaW5kIG91dCBob3cgdG8gZ2V0IHRoZSBleHRlbmRlZCBscyBvdXRwdXQgb2YgYSBmaWxlIG9yIGRpcmVjdG9yeS4KK2lmIGxzIC1MIC9kZXYvbnVsbCAxPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGxzX2NvbW1hbmQ9J2xzIC1MIC1sIC1kJworZWxzZQorICBsc19jb21tYW5kPSdscyAtbCAtZCcKK2ZpCisKKyMgQSBgbHMgLWwnIGxpbmUgbG9va3MgYXMgZm9sbG93cyBvbiBPUy8yLgorIyAgZHJ3eHJ3eC0tLSAgICAgICAgMCBBdWcgMTEgIDIwMDEgZm9vCisjIFRoaXMgZGlmZmVycyBmcm9tIFVuaXgsIHdoaWNoIGFkZHMgb3duZXJzaGlwIGluZm9ybWF0aW9uLgorIyAgZHJ3eHJ3eC0tLSAgIDIgcm9vdCAgcm9vdCAgICAgIDQwOTYgQXVnIDExICAyMDAxIGZvbworIworIyBUbyBmaW5kIHRoZSBkYXRlLCB3ZSBzcGxpdCB0aGUgbGluZSBvbiBzcGFjZXMgYW5kIGl0ZXJhdGUgb24gd29yZHMKKyMgdW50aWwgd2UgZmluZCBhIG1vbnRoLiAgVGhpcyBjYW5ub3Qgd29yayB3aXRoIGZpbGVzIHdob3NlIG93bmVyIGlzIGEKKyMgdXNlciBuYW1lZCBgSmFuJywgb3IgYEZlYicsIGV0Yy4gIEhvd2V2ZXIsIGl0J3MgdW5saWtlbHkgdGhhdCBgLycKKyMgd2lsbCBiZSBvd25lZCBieSBhIHVzZXIgd2hvc2UgbmFtZSBpcyBhIG1vbnRoLiAgU28gd2UgZmlyc3QgbG9vayBhdAorIyB0aGUgZXh0ZW5kZWQgbHMgb3V0cHV0IG9mIHRoZSByb290IGRpcmVjdG9yeSB0byBkZWNpZGUgaG93IG1hbnkKKyMgd29yZHMgc2hvdWxkIGJlIHNraXBwZWQgdG8gZ2V0IHRoZSBkYXRlLgorCisjIE9uIEhQVVggL2Jpbi9zaCwgInNldCIgaW50ZXJwcmV0cyAiLXJ3LXItLXItLSIgYXMgb3B0aW9ucywgc28gdGhlICJ4IiBiZWxvdy4KK3NldCB4YGxzIC1sIC1kIC9gCisKKyMgRmluZCB3aGljaCBhcmd1bWVudCBpcyB0aGUgbW9udGguCittb250aD0KK2NvbW1hbmQ9Cit1bnRpbCB0ZXN0ICRtb250aAorZG8KKyAgc2hpZnQKKyAgIyBBZGQgYW5vdGhlciBzaGlmdCB0byB0aGUgY29tbWFuZC4KKyAgY29tbWFuZD0iJGNvbW1hbmQgc2hpZnQ7IgorICBjYXNlICQxIGluCisgICAgSmFuKSBtb250aD1KYW51YXJ5OyBudW1tb250aD0xOzsKKyAgICBGZWIpIG1vbnRoPUZlYnJ1YXJ5OyBudW1tb250aD0yOzsKKyAgICBNYXIpIG1vbnRoPU1hcmNoOyBudW1tb250aD0zOzsKKyAgICBBcHIpIG1vbnRoPUFwcmlsOyBudW1tb250aD00OzsKKyAgICBNYXkpIG1vbnRoPU1heTsgbnVtbW9udGg9NTs7CisgICAgSnVuKSBtb250aD1KdW5lOyBudW1tb250aD02OzsKKyAgICBKdWwpIG1vbnRoPUp1bHk7IG51bW1vbnRoPTc7OworICAgIEF1ZykgbW9udGg9QXVndXN0OyBudW1tb250aD04OzsKKyAgICBTZXApIG1vbnRoPVNlcHRlbWJlcjsgbnVtbW9udGg9OTs7CisgICAgT2N0KSBtb250aD1PY3RvYmVyOyBudW1tb250aD0xMDs7CisgICAgTm92KSBtb250aD1Ob3ZlbWJlcjsgbnVtbW9udGg9MTE7OworICAgIERlYykgbW9udGg9RGVjZW1iZXI7IG51bW1vbnRoPTEyOzsKKyAgZXNhYworZG9uZQorCisjIEdldCB0aGUgZXh0ZW5kZWQgbHMgb3V0cHV0IG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeS4KK3NldCBkdW1teSB4YGV2YWwgIiRsc19jb21tYW5kIFwiXCRzYXZlX2FyZzFcIiJgCisKKyMgUmVtb3ZlIGFsbCBwcmVjZWRpbmcgYXJndW1lbnRzCitldmFsICRjb21tYW5kCisKKyMgQmVjYXVzZSBvZiB0aGUgZHVtbXkgYXJndW1lbnQgYWJvdmUsIG1vbnRoIGlzIGluICQyLgorIworIyBPbiBhIFBPU0lYIHN5c3RlbSwgd2Ugc2hvdWxkIGhhdmUKKyMKKyMgJCMgPSA1CisjICQxID0gZmlsZSBzaXplCisjICQyID0gbW9udGgKKyMgJDMgPSBkYXkKKyMgJDQgPSB5ZWFyIG9yIHRpbWUKKyMgJDUgPSBmaWxlbmFtZQorIworIyBPbiBEYXJ3aW4gNy43LjAgYW5kIDcuNi4wLCB3ZSBoYXZlCisjCisjICQjID0gNAorIyAkMSA9IGRheQorIyAkMiA9IG1vbnRoCisjICQzID0geWVhciBvciB0aW1lCisjICQ0ID0gZmlsZW5hbWUKKworIyBHZXQgdGhlIG1vbnRoLgorY2FzZSAkMiBpbgorICBKYW4pIG1vbnRoPUphbnVhcnk7IG51bW1vbnRoPTE7OworICBGZWIpIG1vbnRoPUZlYnJ1YXJ5OyBudW1tb250aD0yOzsKKyAgTWFyKSBtb250aD1NYXJjaDsgbnVtbW9udGg9Mzs7CisgIEFwcikgbW9udGg9QXByaWw7IG51bW1vbnRoPTQ7OworICBNYXkpIG1vbnRoPU1heTsgbnVtbW9udGg9NTs7CisgIEp1bikgbW9udGg9SnVuZTsgbnVtbW9udGg9Njs7CisgIEp1bCkgbW9udGg9SnVseTsgbnVtbW9udGg9Nzs7CisgIEF1ZykgbW9udGg9QXVndXN0OyBudW1tb250aD04OzsKKyAgU2VwKSBtb250aD1TZXB0ZW1iZXI7IG51bW1vbnRoPTk7OworICBPY3QpIG1vbnRoPU9jdG9iZXI7IG51bW1vbnRoPTEwOzsKKyAgTm92KSBtb250aD1Ob3ZlbWJlcjsgbnVtbW9udGg9MTE7OworICBEZWMpIG1vbnRoPURlY2VtYmVyOyBudW1tb250aD0xMjs7Citlc2FjCisKK2Nhc2UgJDMgaW4KKyAgPz8/KikgZGF5PSQxOzsKKyAgKikgZGF5PSQzOyBzaGlmdDs7Citlc2FjCisKKyMgSGVyZSB3ZSBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSBscyBvdXRwdXQgZ2l2ZXMgZWl0aGVyCisjIHRoZSB0aW1lIG9mIGRheSBvciB0aGUgeWVhci4KK2Nhc2UgJDMgaW4KKyAgKjoqKSBzZXQgYGRhdGVgOyBldmFsIHllYXI9XCQkIworICAgICAgIGNhc2UgJDIgaW4KKwkgSmFuKSBudW1tb250aHRvZD0xOzsKKwkgRmViKSBudW1tb250aHRvZD0yOzsKKwkgTWFyKSBudW1tb250aHRvZD0zOzsKKwkgQXByKSBudW1tb250aHRvZD00OzsKKwkgTWF5KSBudW1tb250aHRvZD01OzsKKwkgSnVuKSBudW1tb250aHRvZD02OzsKKwkgSnVsKSBudW1tb250aHRvZD03OzsKKwkgQXVnKSBudW1tb250aHRvZD04OzsKKwkgU2VwKSBudW1tb250aHRvZD05OzsKKwkgT2N0KSBudW1tb250aHRvZD0xMDs7CisJIE5vdikgbnVtbW9udGh0b2Q9MTE7OworCSBEZWMpIG51bW1vbnRodG9kPTEyOzsKKyAgICAgICBlc2FjCisgICAgICAgIyBGb3IgdGhlIGZpcnN0IHNpeCBtb250aCBvZiB0aGUgeWVhciB0aGUgdGltZSBub3RhdGlvbiBjYW4gYWxzbworICAgICAgICMgYmUgdXNlZCBmb3IgZmlsZXMgbW9kaWZpZWQgaW4gdGhlIGxhc3QgeWVhci4KKyAgICAgICBpZiAoZXhwciAkbnVtbW9udGggXD4gJG51bW1vbnRodG9kKSA+IC9kZXYvbnVsbDsKKyAgICAgICB0aGVuCisJIHllYXI9YGV4cHIgJHllYXIgLSAxYAorICAgICAgIGZpOzsKKyAgKikgeWVhcj0kMzs7Citlc2FjCisKKyMgVGhlIHJlc3VsdC4KK2VjaG8gJGRheSAkbW9udGggJHllYXIKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21pc3NpbmcgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODA1NWQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21pc3NpbmcKQEAgLTAsMCArMSwzNzYgQEAKKyMhIC9iaW4vc2gKKyMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCisKK3NjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisjIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICBleGl0IDEKK2ZpCisKK3J1bj06CitzZWRfb3V0cHV0PSdzLy4qIC0tb3V0cHV0WyA9XVwoW14gXSpcKS4qL1wxL3AnCitzZWRfbWludXNvPSdzLy4qIC1vIFwoW14gXSpcKS4qL1wxL3AnCisKKyMgSW4gdGhlIGNhc2VzIHdoZXJlIHRoaXMgbWF0dGVycywgYG1pc3NpbmcnIGlzIGJlaW5nIHJ1biBpbiB0aGUKKyMgc3JjZGlyIGFscmVhZHkuCitpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5hYzsgdGhlbgorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmFjCitlbHNlCisgIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuaW4KK2ZpCisKK21zZz0ibWlzc2luZyBvbiB5b3VyIHN5c3RlbSIKKworY2FzZSAkMSBpbgorLS1ydW4pCisgICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KKyAgcnVuPQorICBzaGlmdAorICAiJEAiICYmIGV4aXQgMAorICAjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zCisgICMgd2hlbiB0aGUgdXNlciB0cnkgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24KKyAgIyBhIGZpbGUgdGhhdCByZXF1aXJlcyBhIG1pbmltdW0gdmVyc2lvbi4gIEluIHRoaXMgY2FzZSB3ZQorICAjIHdlIHNob3VsZCBwcm9jZWVkIGhhcyBpZiB0aGUgcHJvZ3JhbSBoYWQgYmVlbiBhYnNlbnQsIG9yCisgICMgaWYgLS1ydW4gaGFkbid0IGJlZW4gcGFzc2VkLgorICBpZiB0ZXN0ICQ/ID0gNjM7IHRoZW4KKyAgICBydW49OgorICAgIG1zZz0icHJvYmFibHkgdG9vIG9sZCIKKyAgZmkKKyAgOzsKKworICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisgICAgZWNobyAiXAorJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCisKK0hhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KK2Vycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKKworU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgorICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCisgIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJworICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJworICBhdXRvbTR0ZSAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlLCBvciBjcmVhdGUgYSBzdHViIG9uZQorICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCisgIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKyAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCisgIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKworVmVyc2lvbiBzdWZmaXhlcyB0byBQUk9HUkFNIGFzIHdlbGwgYXMgdGhlIHByZWZpeGVzIFxgZ251LScsIFxgZ251JywgYW5kCitcYGcnIGFyZSBpZ25vcmVkIHdoZW4gY2hlY2tpbmcgdGhlIG5hbWUuCisKK1NlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQorICAgIGVjaG8gIm1pc3NpbmcgJHNjcmlwdHZlcnNpb24gKEdOVSBBdXRvbWFrZSkiCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLSopCisgICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCisgICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICAgIGV4aXQgMQorICAgIDs7CisKK2VzYWMKKworIyBub3JtYWxpemUgcHJvZ3JhbSBuYW1lIHRvIGNoZWNrIGZvci4KK3Byb2dyYW09YGVjaG8gIiQxIiB8IHNlZCAnCisgIHMvXmdudS0vLzsgdAorICBzL15nbnUvLzsgdAorICBzL15nLy87IHQnYAorCisjIE5vdyBleGl0IGlmIHdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuICBBbHNvIGV4aXQgbm93IGlmIHdlCisjIGRvbid0IGhhdmUgaXQgYW5kIC0tdmVyc2lvbiB3YXMgcGFzc2VkIChtb3N0IGxpa2VseSB0byBkZXRlY3QKKyMgdGhlIHByb2dyYW0pLiAgVGhpcyBpcyBhYm91dCBub24tR05VIHByb2dyYW1zLCBzbyB1c2UgJDEgbm90CisjICRwcm9ncmFtLgorY2FzZSAkMSBpbgorICBsZXgqfHlhY2MqKQorICAgICMgTm90IEdOVSBwcm9ncmFtcywgdGhleSBkb24ndCBoYXZlIC0tdmVyc2lvbi4KKyAgICA7OworCisgIHRhciopCisgICAgaWYgdGVzdCAtbiAiJHJ1biI7IHRoZW4KKyAgICAgICBlY2hvIDE+JjIgIkVSUk9SOiBcYHRhcicgcmVxdWlyZXMgLS1ydW4iCisgICAgICAgZXhpdCAxCisgICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgorICAgICAgIGV4aXQgMQorICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCisgICAgICAgIyBDb3VsZCBub3QgcnVuIC0tdmVyc2lvbiBvciAtLWhlbHAuICBUaGlzIGlzIHByb2JhYmx5IHNvbWVvbmUKKyAgICAgICAjIHJ1bm5pbmcgYCRUT09MIC0tdmVyc2lvbicgb3IgYCRUT09MIC0taGVscCcgdG8gY2hlY2sgd2hldGhlcgorICAgICAgICMgJFRPT0wgZXhpc3RzIGFuZCBub3Qga25vd2luZyAkVE9PTCB1c2VzIG1pc3NpbmcuCisgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICA7OworZXNhYworCisjIElmIGl0IGRvZXMgbm90IGV4aXN0LCBvciBmYWlscyB0byBydW4gKHBvc3NpYmx5IGFuIG91dGRhdGVkIHZlcnNpb24pLAorIyB0cnkgdG8gZW11bGF0ZSBpdC4KK2Nhc2UgJHByb2dyYW0gaW4KKyAgYWNsb2NhbCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KKyAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBhY2xvY2FsLm00CisgICAgOzsKKworICBhdXRvY29uZiopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQorICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKKyAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCisgICAgdG91Y2ggY29uZmlndXJlCisgICAgOzsKKworICBhdXRvaGVhZGVyKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KKyAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyAke2NvbmZpZ3VyZV9hY31gCisgICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCisgICAgdG91Y2hfZmlsZXM9CisgICAgZm9yIGYgaW4gJGZpbGVzOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKKwkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7CisgICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIHRvdWNoICR0b3VjaF9maWxlcworICAgIDs7CisKKyAgYXV0b21ha2UqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCisgICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KKyAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAorCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8CisJICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCisgICAgOzsKKworICBhdXRvbTR0ZSopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGJ1dCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLgorICAgICAgICAgWW91IGNhbiBnZXQgXGAkMScgYXMgcGFydCBvZiBcYEF1dG9jb25mJyBmcm9tIGFueSBHTlUKKyAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCisKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiIyEgL2Jpbi9zaCIKKwllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKKwllY2hvICIjICAkICRAIgorCWVjaG8gImV4aXQgMCIKKwljaG1vZCAreCAkZmlsZQorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBiaXNvbip8eWFjYyopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKKyAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKKyAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAorICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAkTEFTVEFSRyBpbgorCSoueSkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCisJICAgIGZpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgorCWVjaG8gPnkudGFiLmgKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCisgICAgZmkKKyAgICA7OworCisgIGxleCp8ZmxleCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiBsZXgueXkuYworICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAkTEFTVEFSRyBpbgorCSoubCkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYworCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgbGV4Lnl5LmM7IHRoZW4KKwllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCisgICAgZmkKKyAgICA7OworCisgIGhlbHAybWFuKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCisJIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQorCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAorICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKKyAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgorCWV4aXQgJD8KKyAgICBmaQorICAgIDs7CisKKyAgbWFrZWluZm8qKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQorICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCisgICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAorICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCisgICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgICMgVGhlIGZpbGUgdG8gdG91Y2ggaXMgdGhhdCBzcGVjaWZpZWQgd2l0aCAtbyAuLi4KKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCisgICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KKyAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAorICAgICAgZmlsZT1gc2VkIC1uICcKKwkvXkBzZXRmaWxlbmFtZS97CisJICBzLy4qIFwoW14gXSpcKSAqJC9cMS8KKwkgIHAKKwkgIHEKKwl9JyAkaW5maWxlYAorICAgICAgIyAuLi4gb3IgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgbmFtZSAoZGlyL2YudGV4aSBiZWNvbWVzIGYuaW5mbykKKyAgICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkaW5maWxlIiB8IHNlZCAncywuKi8sLDtzLC5bXi5dKiQsLCdgLmluZm8KKyAgICBmaQorICAgICMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSB1c2VyIHJlYWxseSBuZWVkcyBtYWtlaW5mbzsKKyAgICAjIGxldCdzIGZhaWwgd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZy4KKyAgICB0ZXN0IC1mICRmaWxlIHx8IGV4aXQgMQorICAgIHRvdWNoICRmaWxlCisgICAgOzsKKworICB0YXIqKQorICAgIHNoaWZ0CisKKyAgICAjIFdlIGhhdmUgYWxyZWFkeSB0cmllZCB0YXIgaW4gdGhlIGdlbmVyaWMgcGFydC4KKyAgICAjIExvb2sgZm9yIGdudXRhci9ndGFyIGJlZm9yZSBpbnZvY2F0aW9uIHRvIGF2b2lkIHVnbHkgZXJyb3IKKyAgICAjIG1lc3NhZ2VzLgorICAgIGlmIChnbnV0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgICAgZ251dGFyICIkQCIgJiYgZXhpdCAwCisgICAgZmkKKyAgICBpZiAoZ3RhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgICBndGFyICIkQCIgJiYgZXhpdCAwCisgICAgZmkKKyAgICBmaXJzdGFyZz0iJDEiCisgICAgaWYgc2hpZnQ7IHRoZW4KKwljYXNlICRmaXJzdGFyZyBpbgorCSpvKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9vLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKwljYXNlICRmaXJzdGFyZyBpbgorCSpoKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKyAgICBmaQorCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCisgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAorICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZworICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKKyAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKKyAgICBleGl0IDEKKyAgICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21zdmNjLnNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL21zdmNjLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjZGJlYWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvbXN2Y2Muc2gKQEAgLTAsMCArMSwxOTcgQEAKKyMhL2Jpbi9zaAorCisjICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKKyMgVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwgMi4xCisjCisjIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgorIyAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyMKKyMgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKKyMgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCisjIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCisjIExpY2Vuc2UuCisjCisjIFRoZSBPcmlnaW5hbCBDb2RlIGlzIHRoZSBNU1ZDIHdyYXBwaWZpY2F0b3IuCisjCisjIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcworIyBUaW1vdGh5IFdhbGwgPHR3YWxsamF2YUBkZXYuamF2YS5uZXQ+LgorIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA5CisjIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgQ29udHJpYnV0b3Iocyk6CisjICAgRGFuaWVsIFdpdHRlIDxkd2l0dGVAbW96aWxsYS5jb20+CisjCisjIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisjIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgorIyB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKKyMgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIG9yIHRoZSBMR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQKKyMgb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bworIyB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1QTCwgaW5kaWNhdGUgeW91cgorIyBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorIyBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQorIyB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisjIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBNUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCisjCisjICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqCisKKyMKKyMgR0NDLWNvbXBhdGlibGUgd3JhcHBlciBmb3IgY2wuZXhlIGFuZCBtbC5leGUuIEFyZ3VtZW50cyBhcmUgZ2l2ZW4gaW4gR0NDCisjIGZvcm1hdCBhbmQgdHJhbnNsYXRlZCBpbnRvIHNvbWV0aGluZyBzZW5zaWJsZSBmb3IgY2wgb3IgbWwuCisjCisKK2FyZ3M9Ii1ub2xvZ28gLVczIgorbWQ9LU1ECitjbD0iY2wiCittbD0ibWwiCitzYWZlc2VoPSItc2FmZXNlaCIKK291dHB1dD0KKword2hpbGUgWyAkIyAtZ3QgMCBdCitkbworICBjYXNlICQxCisgIGluCisgICAgLWZleGNlcHRpb25zKQorICAgICAgIyBEb24ndCBlbmFibGUgZXhjZXB0aW9ucyBmb3Igbm93LgorICAgICAgI2FyZ3M9IiRhcmdzIC1FSGFjIgorICAgICAgc2hpZnQgMQorICAgIDs7CisgICAgLW0zMikKKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICAgIC1tNjQpCisgICAgICBjbD0iY2wiICAgIyAiJE1TVkMveDg2X2FtZDY0L2NsIgorICAgICAgbWw9Im1sNjQiICMgIiRNU1ZDL3g4Nl9hbWQ2NC9tbDY0IgorICAgICAgc2FmZXNlaD0KKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICAgIC1PMCkKKyAgICAgIGFyZ3M9IiRhcmdzIC1PZCIKKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICAgIC1PKikKKyAgICAgICMgSWYgd2UncmUgb3B0aW1pemluZywgbWFrZSBzdXJlIHdlIGV4cGxpY2l0bHkgdHVybiBvbiBzb21lIG9wdGltaXphdGlvbnMKKyAgICAgICMgdGhhdCBhcmUgaW1wbGljaXRseSBkaXNhYmxlZCBieSBkZWJ1ZyBzeW1ib2xzICgtWmkpLgorICAgICAgYXJncz0iJGFyZ3MgJDEgLU9QVDpSRUYgLU9QVDpJQ0YgLUlOQ1JFTUVOVEFMOk5PIgorICAgICAgc2hpZnQgMQorICAgIDs7CisgICAgLWcpCisgICAgICAjIEVuYWJsZSBkZWJ1ZyBzeW1ib2wgZ2VuZXJhdGlvbi4KKyAgICAgIGFyZ3M9IiRhcmdzIC1aaSAtREVCVUciCisgICAgICBzaGlmdCAxCisgICAgOzsKKyAgICAtREZGSV9ERUJVRykKKyAgICAgICMgTGluayBhZ2FpbnN0IGRlYnVnIENSVCBhbmQgZW5hYmxlIHJ1bnRpbWUgZXJyb3IgY2hlY2tzLgorICAgICAgYXJncz0iJGFyZ3MgLVJUQzEiCisgICAgICBkZWZpbmVzPSIkZGVmaW5lcyAkMSIKKyAgICAgIG1kPS1NRGQKKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICAgIC1jKQorICAgICAgYXJncz0iJGFyZ3MgLWMiCisgICAgICBhcmdzPSIkKGVjaG8gJGFyZ3MgfCBzZWQgJ3MlL0ZlJS9GbyVnJykiCisgICAgICBzaW5nbGU9Ii1jIgorICAgICAgc2hpZnQgMQorICAgIDs7CisgICAgLUQqPSopCisgICAgICBuYW1lPSIkKGVjaG8gJDF8c2VkICdzLy1EXChbXj1dW149XSpcKT0uKi9cMS9nJykiCisgICAgICB2YWx1ZT0iJChlY2hvICQxfHNlZCAncy8tRFtePV1bXj1dKj0vL2cnKSIKKyAgICAgIGFyZ3M9IiRhcmdzIC1EJHtuYW1lfT0nJHZhbHVlJyIKKyAgICAgIGRlZmluZXM9IiRkZWZpbmVzIC1EJHtuYW1lfT0nJHZhbHVlJyIKKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICAgIC1EKikKKyAgICAgIGFyZ3M9IiRhcmdzICQxIgorICAgICAgZGVmaW5lcz0iJGRlZmluZXMgJDEiCisgICAgICBzaGlmdCAxCisgICAgOzsKKyAgICAtSSkKKyAgICAgIGFyZ3M9IiRhcmdzIC1JJDIiCisgICAgICBpbmNsdWRlcz0iJGluY2x1ZGVzIC1JJDIiCisgICAgICBzaGlmdCAyCisgICAgOzsKKyAgICAtSSopCisgICAgICBhcmdzPSIkYXJncyAkMSIKKyAgICAgIGluY2x1ZGVzPSIkaW5jbHVkZXMgJDEiCisgICAgICBzaGlmdCAxCisgICAgOzsKKyAgICAtV3wtV2V4dHJhKQorICAgICAgIyBUT0RPIG1hcCBleHRyYSB3YXJuaW5ncworICAgICAgc2hpZnQgMQorICAgIDs7CisgICAgLVdhbGwpCisgICAgICAjIC1XYWxsIG9uIE1TVkMgaXMgb3ZlcnplYWxvdXMsIGFuZCB3ZSBhbHJlYWR5IGJ1aWxkIHdpdGggLVczLiBOb3RoaW5nCisgICAgICAjIHRvIGRvIGhlcmUuCisgICAgICBzaGlmdCAxCisgICAgOzsKKyAgICAtV2Vycm9yKQorICAgICAgYXJncz0iJGFyZ3MgLVdYIgorICAgICAgc2hpZnQgMQorICAgIDs7CisgICAgLVcqKQorICAgICAgIyBUT0RPIG1hcCBzcGVjaWZpYyB3YXJuaW5ncworICAgICAgc2hpZnQgMQorICAgIDs7CisgICAgLVMpCisgICAgICBhcmdzPSIkYXJncyAtRkFzIgorICAgICAgc2hpZnQgMQorICAgIDs7CisgICAgLW8pCisgICAgICBvdXRkaXI9IiQoZGlybmFtZSAkMikiCisgICAgICBiYXNlPSIkKGJhc2VuYW1lICQyfHNlZCAncy9cLlteLl0qLy9nJykiCisgICAgICBpZiBbIC1uICIkc2luZ2xlIiBdOyB0aGVuIAorICAgICAgICBvdXRwdXQ9Ii1GbyQyIgorICAgICAgZWxzZQorICAgICAgICBvdXRwdXQ9Ii1GZSQyIgorICAgICAgZmkKKyAgICAgIGlmIFsgLW4gIiRhc3NlbWJseSIgXTsgdGhlbgorICAgICAgICBhcmdzPSIkYXJncyAkb3V0cHV0IgorICAgICAgZWxzZQorICAgICAgICBhcmdzPSIkYXJncyAkb3V0cHV0IC1GZCRvdXRkaXIvJGJhc2UgLUZwJG91dGRpci8kYmFzZSAtRmEkb3V0ZGlyLyRiYXNlIgorICAgICAgZmkKKyAgICAgIHNoaWZ0IDIKKyAgICA7OworICAgICouUykKKyAgICAgIHNyYz0kMQorICAgICAgYXNzZW1ibHk9InRydWUiCisgICAgICBzaGlmdCAxCisgICAgOzsKKyAgICAqLmMpCisgICAgICBhcmdzPSIkYXJncyAkMSIKKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICAgICopCisgICAgICAjIEFzc3VtZSBpdCdzIGFuIE1TVkMgYXJndW1lbnQsIGFuZCBwYXNzIGl0IHRocm91Z2guCisgICAgICBhcmdzPSIkYXJncyAkMSIKKyAgICAgIHNoaWZ0IDEKKyAgICA7OworICBlc2FjCitkb25lCisKK2lmIFsgLW4gIiRhc3NlbWJseSIgXTsgdGhlbgorICAgIGlmIFsgLXogIiRvdXRkaXIiIF07IHRoZW4KKyAgICAgIG91dGRpcj0iLiIKKyAgICBmaQorICAgIHBwc3JjPSIkb3V0ZGlyLyQoYmFzZW5hbWUgJHNyY3xzZWQgJ3MvLlMkLy5hc20vZycpIgorICAgIGVjaG8gIiRjbCAtbm9sb2dvIC1FUCAkaW5jbHVkZXMgJGRlZmluZXMgJHNyYyA+ICRwcHNyYyIKKyAgICAiJGNsIiAtbm9sb2dvIC1FUCAkaW5jbHVkZXMgJGRlZmluZXMgJHNyYyA+ICRwcHNyYyB8fCBleGl0ICQ/CisgICAgb3V0cHV0PSIkKGVjaG8gJG91dHB1dCB8IHNlZCAncyUvRltkcGFdW14gXSolJWcnKSIKKyAgICBhcmdzPSItbm9sb2dvICRzYWZlc2VoICRzaW5nbGUgJG91dHB1dCAkcHBzcmMiCisKKyAgICBlY2hvICIkbWwgJGFyZ3MiCisgICAgZXZhbCAiXCIkbWxcIiAkYXJncyIKKyAgICByZXN1bHQ9JD8KKworICAgICMgcmVxdWlyZWQgdG8gZml4IG1sNjQgYnJva2VuIG91dHB1dD8KKyAgICAjbXYgKi5vYmogJG91dGRpcgorZWxzZQorICAgIGFyZ3M9IiRtZCAkYXJncyIKKyAgICBlY2hvICIkY2wgJGFyZ3MiCisgICAgZXZhbCAiXCIkY2xcIiAkYXJncyIKKyAgICByZXN1bHQ9JD8KK2ZpCisKK2V4aXQgJHJlc3VsdAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2FscGhhL2ZmaS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hbHBoYS9mZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZiMmJhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hbHBoYS9mZmkuYwpAQCAtMCwwICsxLDI4NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDAxLCAyMDA3LCAyMDA4ICBSZWQgSGF0LCBJbmMuCisgICAKKyAgIEFscGhhIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBGb3JjZSBGRklfVFlQRV9MT05HRE9VQkxFIHRvIGJlIGRpZmZlcmVudCB0aGFuIEZGSV9UWVBFX0RPVUJMRTsKKyAgIGFsbCBmdXJ0aGVyIHVzZXMgaW4gdGhpcyBmaWxlIHdpbGwgcmVmZXIgdG8gdGhlIDEyOC1iaXQgdHlwZS4gICovCisjaWYgZGVmaW5lZChfX0xPTkdfRE9VQkxFXzEyOF9fKQorIyBpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IDQKKyMgIGVycm9yIEZGSV9UWVBFX0xPTkdET1VCTEUgb3V0IG9mIGRhdGUKKyMgZW5kaWYKKyNlbHNlCisjIHVuZGVmIEZGSV9UWVBFX0xPTkdET1VCTEUKKyMgZGVmaW5lIEZGSV9UWVBFX0xPTkdET1VCTEUgNAorI2VuZGlmCisKK2V4dGVybiB2b2lkIGZmaV9jYWxsX29zZih2b2lkICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkLCB2b2lkICosIHZvaWQgKCopKHZvaWQpKQorICBGRklfSElEREVOOworZXh0ZXJuIHZvaWQgZmZpX2Nsb3N1cmVfb3NmKHZvaWQpIEZGSV9ISURERU47CisKKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworICAvKiBBZGp1c3QgY2lmLT5ieXRlcyB0byByZXByZXNlbnQgYSBtaW5pbXVtIDYgd29yZHMgZm9yIHRoZSB0ZW1wb3JhcnkKKyAgICAgcmVnaXN0ZXIgYXJndW1lbnQgbG9hZGluZyBhcmVhLiAgKi8KKyAgaWYgKGNpZi0+Ynl0ZXMgPCA2KkZGSV9TSVpFT0ZfQVJHKQorICAgIGNpZi0+Ynl0ZXMgPSA2KkZGSV9TSVpFT0ZfQVJHOworCisgIC8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZyAqLworICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgICBjaWYtPmZsYWdzID0gY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorICAgICAgLyogMTI4LWJpdCBsb25nIGRvdWJsZSBpcyByZXR1cm5lZCBpbiBtZW1vcnksIGxpa2UgYSBzdHJ1Y3QuICAqLworICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisgICAgICBicmVhazsKKyAgICB9CisgIAorICByZXR1cm4gRkZJX09LOworfQorCisKK3ZvaWQKK2ZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICB1bnNpZ25lZCBsb25nICpzdGFjaywgKmFyZ3A7CisgIGxvbmcgaSwgYXZuOworICBmZmlfdHlwZSAqKmFyZ190eXBlczsKKyAgCisgIC8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4KKyAgICAgdmFsdWUgYWRkcmVzcyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBvbmUuICAqLworICBpZiAocnZhbHVlID09IE5VTEwgJiYgY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgcnZhbHVlID0gYWxsb2NhKGNpZi0+cnR5cGUtPnNpemUpOworCisgIC8qIEFsbG9jYXRlIHRoZSBzcGFjZSBmb3IgdGhlIGFyZ3VtZW50cywgcGx1cyA0IHdvcmRzIG9mIHRlbXAKKyAgICAgc3BhY2UgZm9yIGZmaV9jYWxsX29zZi4gICovCisgIGFyZ3AgPSBzdGFjayA9IGFsbG9jYShjaWYtPmJ5dGVzICsgNCpGRklfU0laRU9GX0FSRyk7CisKKyAgaWYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgICoodm9pZCAqKikgYXJncCsrID0gcnZhbHVlOworCisgIGkgPSAwOworICBhdm4gPSBjaWYtPm5hcmdzOworICBhcmdfdHlwZXMgPSBjaWYtPmFyZ190eXBlczsKKworICB3aGlsZSAoaSA8IGF2bikKKyAgICB7CisgICAgICBzaXplX3Qgc2l6ZSA9ICgqYXJnX3R5cGVzKS0+c2l6ZTsKKworICAgICAgc3dpdGNoICgoKmFyZ190eXBlcyktPnR5cGUpCisJeworCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICAqKFNJTlQ2NCAqKSBhcmdwID0gKihTSU5UOCAqKSgqIGF2YWx1ZSk7CisJICBicmVhazsKKwkJICAKKwljYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgKihTSU5UNjQgKikgYXJncCA9ICooVUlOVDggKikoKiBhdmFsdWUpOworCSAgYnJlYWs7CisJCSAgCisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAqKFNJTlQ2NCAqKSBhcmdwID0gKihTSU5UMTYgKikoKiBhdmFsdWUpOworCSAgYnJlYWs7CisJCSAgCisJY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAqKFNJTlQ2NCAqKSBhcmdwID0gKihVSU5UMTYgKikoKiBhdmFsdWUpOworCSAgYnJlYWs7CisJCSAgCisJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICAvKiBOb3RlIHRoYXQgdW5zaWduZWQgMzItYml0IHF1YW50aXRpZXMgYXJlIHNpZ24gZXh0ZW5kZWQuICAqLworCSAgKihTSU5UNjQgKikgYXJncCA9ICooU0lOVDMyICopKCogYXZhbHVlKTsKKwkgIGJyZWFrOworCQkgIAorCWNhc2UgRkZJX1RZUEVfU0lOVDY0OgorCWNhc2UgRkZJX1RZUEVfVUlOVDY0OgorCWNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKwkgICooVUlOVDY0ICopIGFyZ3AgPSAqKFVJTlQ2NCAqKSgqIGF2YWx1ZSk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJICBpZiAoYXJncCAtIHN0YWNrIDwgNikKKwkgICAgeworCSAgICAgIC8qIE5vdGUgdGhlIGNvbnZlcnNpb24gLS0gYWxsIHRoZSBmcCByZWdzIGFyZSBsb2FkZWQgYXMKKwkJIGRvdWJsZXMuICBUaGUgaW4tcmVnaXN0ZXIgZm9ybWF0IGlzIHRoZSBzYW1lLiAgKi8KKwkgICAgICAqKGRvdWJsZSAqKSBhcmdwID0gKihmbG9hdCAqKSgqIGF2YWx1ZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgKihmbG9hdCAqKSBhcmdwID0gKihmbG9hdCAqKSgqIGF2YWx1ZSk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgKihkb3VibGUgKikgYXJncCA9ICooZG91YmxlICopKCogYXZhbHVlKTsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgLyogMTI4LWJpdCBsb25nIGRvdWJsZSBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlLiAgKi8KKwkgICoobG9uZyBkb3VibGUgKiopIGFyZ3AgPSAobG9uZyBkb3VibGUgKikoKiBhdmFsdWUpOworCSAgc2l6ZSA9IHNpemVvZiAobG9uZyBkb3VibGUgKik7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgbWVtY3B5KGFyZ3AsICphdmFsdWUsICgqYXJnX3R5cGVzKS0+c2l6ZSk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBGRklfQVNTRVJUKDApOworCX0KKworICAgICAgYXJncCArPSBBTElHTihzaXplLCBGRklfU0laRU9GX0FSRykgLyBGRklfU0laRU9GX0FSRzsKKyAgICAgIGkrKywgYXJnX3R5cGVzKyssIGF2YWx1ZSsrOworICAgIH0KKworICBmZmlfY2FsbF9vc2Yoc3RhY2ssIGNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsIHJ2YWx1ZSwgZm4pOworfQorCisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmVfbG9jIChmZmlfY2xvc3VyZSogY2xvc3VyZSwKKwkJICAgICAgZmZpX2NpZiogY2lmLAorCQkgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKiwgdm9pZCosIHZvaWQqKiwgdm9pZCopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCSAgICAgIHZvaWQgKmNvZGVsb2MpCit7CisgIHVuc2lnbmVkIGludCAqdHJhbXA7CisKKyAgdHJhbXAgPSAodW5zaWduZWQgaW50ICopICZjbG9zdXJlLT50cmFtcFswXTsKKyAgdHJhbXBbMF0gPSAweDQ3ZmIwNDAxOwkvKiBtb3YgJDI3LCQxCQkqLworICB0cmFtcFsxXSA9IDB4YTc3YjAwMTA7CS8qIGxkcSAkMjcsMTYoJDI3KQkqLworICB0cmFtcFsyXSA9IDB4NmJmYjAwMDA7CS8qIGptcCAkMzEsKCQyNyksMAkqLworICB0cmFtcFszXSA9IDB4NDdmZjA0MWY7CS8qIG5vcAkJCSovCisgICoodm9pZCAqKikgJnRyYW1wWzRdID0gZmZpX2Nsb3N1cmVfb3NmOworCisgIGNsb3N1cmUtPmNpZiA9IGNpZjsKKyAgY2xvc3VyZS0+ZnVuID0gZnVuOworICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisKKyAgLyogRmx1c2ggdGhlIEljYWNoZS4KKworICAgICBUcnU2NCBVTklYIGFzIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgaW1iIG1uZW1vbmljLCBzbyB1c2UgY2FsbF9wYWwKKyAgICAgaW5zdGVhZCwgc2luY2UgYm90aCBDb21wYXEgYXMgYW5kIGdhcyBjYW4gaGFuZGxlIGl0LgorCisgICAgIDB4ODYgaXMgUEFMX2ltYiBpbiBUcnU2NCBVTklYIDxhbHBoYS9wYWwuaD4uICAqLworICBhc20gdm9sYXRpbGUgKCJjYWxsX3BhbCAweDg2IiA6IDogOiAibWVtb3J5Iik7CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworCitsb25nIEZGSV9ISURERU4KK2ZmaV9jbG9zdXJlX29zZl9pbm5lcihmZmlfY2xvc3VyZSAqY2xvc3VyZSwgdm9pZCAqcnZhbHVlLCB1bnNpZ25lZCBsb25nICphcmdwKQoreworICBmZmlfY2lmICpjaWY7CisgIHZvaWQgKiphdmFsdWU7CisgIGZmaV90eXBlICoqYXJnX3R5cGVzOworICBsb25nIGksIGF2biwgYXJnbjsKKworICBjaWYgPSBjbG9zdXJlLT5jaWY7CisgIGF2YWx1ZSA9IGFsbG9jYShjaWYtPm5hcmdzICogc2l6ZW9mKHZvaWQgKikpOworCisgIGFyZ24gPSAwOworCisgIC8qIENvcHkgdGhlIGNhbGxlcidzIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcyB0byB0aGF0IHRoZSBjbG9zdXJlCisgICAgIHJldHVybnMgdGhlIGRhdGEgZGlyZWN0bHkgdG8gdGhlIGNhbGxlci4gICovCisgIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICBydmFsdWUgPSAodm9pZCAqKSBhcmdwWzBdOworICAgICAgYXJnbiA9IDE7CisgICAgfQorCisgIGkgPSAwOworICBhdm4gPSBjaWYtPm5hcmdzOworICBhcmdfdHlwZXMgPSBjaWYtPmFyZ190eXBlczsKKyAgCisgIC8qIEdyYWIgdGhlIGFkZHJlc3NlcyBvZiB0aGUgYXJndW1lbnRzIGZyb20gdGhlIHN0YWNrIGZyYW1lLiAgKi8KKyAgd2hpbGUgKGkgPCBhdm4pCisgICAgeworICAgICAgc2l6ZV90IHNpemUgPSBhcmdfdHlwZXNbaV0tPnNpemU7CisKKyAgICAgIHN3aXRjaCAoYXJnX3R5cGVzW2ldLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgYXZhbHVlW2ldID0gJmFyZ3BbYXJnbl07CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJICBpZiAoYXJnbiA8IDYpCisJICAgIHsKKwkgICAgICAvKiBGbG9hdHMgY29taW5nIGZyb20gcmVnaXN0ZXJzIG5lZWQgY29udmVyc2lvbiBmcm9tIGRvdWJsZQorCSAgICAgICAgIGJhY2sgdG8gZmxvYXQgZm9ybWF0LiAgKi8KKwkgICAgICAqKGZsb2F0ICopJmFyZ3BbYXJnbiAtIDZdID0gKihkb3VibGUgKikmYXJncFthcmduIC0gNl07CisJICAgICAgYXZhbHVlW2ldID0gJmFyZ3BbYXJnbiAtIDZdOworCSAgICB9CisJICBlbHNlCisJICAgIGF2YWx1ZVtpXSA9ICZhcmdwW2FyZ25dOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgIGF2YWx1ZVtpXSA9ICZhcmdwW2FyZ24gLSAoYXJnbiA8IDYgPyA2IDogMCldOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICAvKiAxMjgtYml0IGxvbmcgZG91YmxlIGlzIHBhc3NlZCBieSByZWZlcmVuY2UuICAqLworCSAgYXZhbHVlW2ldID0gKGxvbmcgZG91YmxlICopIGFyZ3BbYXJnbl07CisJICBzaXplID0gc2l6ZW9mIChsb25nIGRvdWJsZSAqKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgYXJnbiArPSBBTElHTihzaXplLCBGRklfU0laRU9GX0FSRykgLyBGRklfU0laRU9GX0FSRzsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgLyogSW52b2tlIHRoZSBjbG9zdXJlLiAgKi8KKyAgY2xvc3VyZS0+ZnVuIChjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIC8qIFRlbGwgZmZpX2Nsb3N1cmVfb3NmIGhvdyB0byBwZXJmb3JtIHJldHVybiB0eXBlIHByb21vdGlvbnMuICAqLworICByZXR1cm4gY2lmLT5ydHlwZS0+dHlwZTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYWxwaGEvZmZpdGFyZ2V0LmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2FscGhhL2ZmaXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDZlYjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2FscGhhL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIEFscGhhLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICisjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAorCisjaWZuZGVmIExJQkZGSV9BU00KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBmZmlfYXJnOwordHlwZWRlZiBzaWduZWQgbG9uZyAgICAgICAgICAgIGZmaV9zYXJnOworCit0eXBlZGVmIGVudW0gZmZpX2FiaSB7CisgIEZGSV9GSVJTVF9BQkkgPSAwLAorICBGRklfT1NGLAorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9PU0YKK30gZmZpX2FiaTsKKyNlbmRpZgorCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMjQKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2FscGhhL29zZi5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hbHBoYS9vc2YuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjlmNGRmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hbHBoYS9vc2YuUwpAQCAtMCwwICsxLDM4NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIG9zZi5TIC0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDAxLCAyMDA3LCAyMDA4LCAyMDExIFJlZCBIYXQKKyAgIAorICAgQWxwaGEvT1NGIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00JCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKwkuYXJjaCBldjYKKwkudGV4dAorCisvKiBmZmlfY2FsbF9vc2YgKHZvaWQgKmFyZ3MsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsIHVuc2lnbmVkIGZsYWdzLAorCQkgdm9pZCAqcmFkZHIsIHZvaWQgKCpmbmFkZHIpKHZvaWQpKTsKKworICAgQml0IG8gdHJpY2tpbmVzcyBoZXJlIC0tIEFSR1MrQllURVMgaXMgdGhlIGJhc2Ugb2YgdGhlIHN0YWNrIGZyYW1lCisgICBmb3IgdGhpcyBmdW5jdGlvbi4gIFRoaXMgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IGZmaV9jYWxsLiAgV2UgYWxzbworICAgZGVhbGxvY2F0ZSBzb21lIG9mIHRoZSBzdGFjayB0aGF0IGhhcyBiZWVuIGFsbG9jYSdkLiAgKi8KKworCS5hbGlnbgkzCisJLmdsb2JsCWZmaV9jYWxsX29zZgorCS5lbnQJZmZpX2NhbGxfb3NmCisJRkZJX0hJRERFTihmZmlfY2FsbF9vc2YpCisKK2ZmaV9jYWxsX29zZjoKKwkuZnJhbWUJJDE1LCAzMiwgJDI2LCAwCisJLm1hc2sgICAweDQwMDgwMDAsIC0zMgorJExGQjE6CisJYWRkcQkkMTYsJDE3LCQxCisJbW92CSQxNiwgJDMwCisJc3RxCSQyNiwgMCgkMSkKKwlzdHEJJDE1LCA4KCQxKQorCXN0cQkkMTgsIDE2KCQxKQorCW1vdgkkMSwgJDE1CiskTENGSTE6CisJLnByb2xvZ3VlIDAKKworCXN0cQkkMTksIDI0KCQxKQorCW1vdgkkMjAsICQyNworCisJIyBMb2FkIHVwIGFsbCBvZiB0aGUgKHBvdGVudGlhbCkgYXJndW1lbnQgcmVnaXN0ZXJzLgorCWxkcQkkMTYsIDAoJDMwKQorCWxkdAkkZjE2LCAwKCQzMCkKKwlsZHQJJGYxNywgOCgkMzApCisJbGRxCSQxNywgOCgkMzApCisJbGR0CSRmMTgsIDE2KCQzMCkKKwlsZHEJJDE4LCAxNigkMzApCisJbGR0CSRmMTksIDI0KCQzMCkKKwlsZHEJJDE5LCAyNCgkMzApCisJbGR0CSRmMjAsIDMyKCQzMCkKKwlsZHEJJDIwLCAzMigkMzApCisJbGR0CSRmMjEsIDQwKCQzMCkKKwlsZHEJJDIxLCA0MCgkMzApCisKKwkjIERlYWxsb2NhdGUgdGhlIHJlZ2lzdGVyIGFyZ3VtZW50IGFyZWEuCisJbGRhCSQzMCwgNDgoJDMwKQorCisJanNyCSQyNiwgKCQyNyksIDAKKwlsZGdwCSQyOSwgMCgkMjYpCisKKwkjIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgorCWxkcQkkMTksIDI0KCQxNSkKKwlsZHEJJDE4LCAxNigkMTUpCisJbGRxCSQyNiwgMCgkMTUpCiskTENGSTI6CisJYmVxCSQxOSwgJG5vcmV0dmFsCisKKwkjIFN0b3JlIHRoZSByZXR1cm4gdmFsdWUgb3V0IGluIHRoZSBwcm9wZXIgdHlwZS4KKwljbXBlcQkkMTgsIEZGSV9UWVBFX0lOVCwgJDEKKwlibmUJJDEsICRyZXRpbnQKKwljbXBlcQkkMTgsIEZGSV9UWVBFX0ZMT0FULCAkMgorCWJuZQkkMiwgJHJldGZsb2F0CisJY21wZXEJJDE4LCBGRklfVFlQRV9ET1VCTEUsICQzCisJYm5lCSQzLCAkcmV0ZG91YmxlCisKKwkuYWxpZ24JMworJG5vcmV0dmFsOgorCWxkcQkkMTUsIDgoJDE1KQorCXJldAorCisJLmFsaWduCTQKKyRyZXRpbnQ6CisJc3RxCSQwLCAwKCQxOSkKKwlub3AKKwlsZHEJJDE1LCA4KCQxNSkKKwlyZXQKKworCS5hbGlnbgk0CiskcmV0ZmxvYXQ6CisJc3RzCSRmMCwgMCgkMTkpCisJbm9wCisJbGRxCSQxNSwgOCgkMTUpCisJcmV0CisKKwkuYWxpZ24JNAorJHJldGRvdWJsZToKKwlzdHQJJGYwLCAwKCQxOSkKKwlub3AKKwlsZHEJJDE1LCA4KCQxNSkKKwlyZXQKKyRMRkUxOgorCisJLmVuZAlmZmlfY2FsbF9vc2YKKworLyogZmZpX2Nsb3N1cmVfb3NmKC4uLikKKworICAgUmVjZWl2ZXMgdGhlIGNsb3N1cmUgYXJndW1lbnQgaW4gJDEuICAgKi8KKworCS5hbGlnbgkzCisJLmdsb2JsCWZmaV9jbG9zdXJlX29zZgorCS5lbnQJZmZpX2Nsb3N1cmVfb3NmCisJRkZJX0hJRERFTihmZmlfY2xvc3VyZV9vc2YpCisKK2ZmaV9jbG9zdXJlX29zZjoKKwkuZnJhbWUJJDMwLCAxNio4LCAkMjYsIDAKKwkubWFzawkweDQwMDAwMDAsIC0xNio4CiskTEZCMjoKKwlsZGdwCSQyOSwgMCgkMjcpCisJc3VicQkkMzAsIDE2KjgsICQzMAorJExDRkk1OgorCXN0cQkkMjYsIDAoJDMwKQorJExDRkk2OgorCS5wcm9sb2d1ZSAxCisKKwkjIFN0b3JlIGFsbCBvZiB0aGUgcG90ZW50aWFsIGFyZ3VtZW50IHJlZ2lzdGVycyBpbiB2YV9saXN0IGZvcm1hdC4KKwlzdHQJJGYxNiwgNCo4KCQzMCkKKwlzdHQJJGYxNywgNSo4KCQzMCkKKwlzdHQJJGYxOCwgNio4KCQzMCkKKwlzdHQJJGYxOSwgNyo4KCQzMCkKKwlzdHQJJGYyMCwgOCo4KCQzMCkKKwlzdHQJJGYyMSwgOSo4KCQzMCkKKwlzdHEJJDE2LCAxMCo4KCQzMCkKKwlzdHEJJDE3LCAxMSo4KCQzMCkKKwlzdHEJJDE4LCAxMio4KCQzMCkKKwlzdHEJJDE5LCAxMyo4KCQzMCkKKwlzdHEJJDIwLCAxNCo4KCQzMCkKKwlzdHEJJDIxLCAxNSo4KCQzMCkKKworCSMgQ2FsbCBmZmlfY2xvc3VyZV9vc2ZfaW5uZXIgdG8gZG8gdGhlIGJ1bGsgb2YgdGhlIHdvcmsuCisJbW92CSQxLCAkMTYKKwlsZGEJJDE3LCAyKjgoJDMwKQorCWxkYQkkMTgsIDEwKjgoJDMwKQorCWpzcgkkMjYsIGZmaV9jbG9zdXJlX29zZl9pbm5lcgorCWxkZ3AJJDI5LCAwKCQyNikKKwlsZHEJJDI2LCAwKCQzMCkKKworCSMgTG9hZCB1cCB0aGUgcmV0dXJuIHZhbHVlIGluIHRoZSBwcm9wZXIgdHlwZS4KKwlsZGEJJDEsICRsb2FkX3RhYmxlCisJczRhZGRxCSQwLCAkMSwgJDEKKwlsZGwJJDEsIDAoJDEpCisJYWRkcQkkMSwgJDI5LCAkMQorCWptcAkkMzEsICgkMSksICRsb2FkXzMyCisKKwkuYWxpZ24gNAorJGxvYWRfbm9uZToKKwlhZGRxCSQzMCwgMTYqOCwgJDMwCisJcmV0CisKKwkuYWxpZ24gNAorJGxvYWRfZmxvYXQ6CisJbGRzCSRmMCwgMTYoJDMwKQorCW5vcAorCWFkZHEJJDMwLCAxNio4LCAkMzAKKwlyZXQKKworCS5hbGlnbiA0CiskbG9hZF9kb3VibGU6CisJbGR0CSRmMCwgMTYoJDMwKQorCW5vcAorCWFkZHEJJDMwLCAxNio4LCAkMzAKKwlyZXQKKworCS5hbGlnbiA0CiskbG9hZF91ODoKKyNpZmRlZiBfX2FscGhhX2J3eF9fCisJbGRidQkkMCwgMTYoJDMwKQorCW5vcAorI2Vsc2UKKwlsZHEJJDAsIDE2KCQzMCkKKwlhbmQJJDAsIDI1NSwgJDAKKyNlbmRpZgorCWFkZHEJJDMwLCAxNio4LCAkMzAKKwlyZXQKKworCS5hbGlnbiA0CiskbG9hZF9zODoKKyNpZmRlZiBfX2FscGhhX2J3eF9fCisJbGRidQkkMCwgMTYoJDMwKQorCXNleHRiCSQwLCAkMAorI2Vsc2UKKwlsZHEJJDAsIDE2KCQzMCkKKwlzbGwJJDAsIDU2LCAkMAorCXNyYQkkMCwgNTYsICQwCisjZW5kaWYKKwlhZGRxCSQzMCwgMTYqOCwgJDMwCisJcmV0CisKKwkuYWxpZ24gNAorJGxvYWRfdTE2OgorI2lmZGVmIF9fYWxwaGFfYnd4X18KKwlsZHd1CSQwLCAxNigkMzApCisJbm9wCisjZWxzZQorCWxkcQkkMCwgMTYoJDMwKQorCXphcG5vdAkkMCwgMywgJDAKKyNlbmRpZgorCWFkZHEJJDMwLCAxNio4LCAkMzAKKwlyZXQKKworCS5hbGlnbiA0CiskbG9hZF9zMTY6CisjaWZkZWYgX19hbHBoYV9id3hfXworCWxkd3UJJDAsIDE2KCQzMCkKKwlzZXh0dwkkMCwgJDAKKyNlbHNlCisJbGRxCSQwLCAxNigkMzApCisJc2xsCSQwLCA0OCwgJDAKKwlzcmEJJDAsIDQ4LCAkMAorI2VuZGlmCisJYWRkcQkkMzAsIDE2KjgsICQzMAorCXJldAorCisJLmFsaWduIDQKKyRsb2FkXzMyOgorCWxkbAkkMCwgMTYoJDMwKQorCW5vcAorCWFkZHEJJDMwLCAxNio4LCAkMzAKKwlyZXQKKworCS5hbGlnbiA0CiskbG9hZF82NDoKKwlsZHEJJDAsIDE2KCQzMCkKKwlub3AKKwlhZGRxCSQzMCwgMTYqOCwgJDMwCisJcmV0CiskTEZFMjoKKworCS5lbmQJZmZpX2Nsb3N1cmVfb3NmCisKKyNpZmRlZiBfX0VMRl9fCisuc2VjdGlvbiAucm9kYXRhCisjZWxzZQorLnJkYXRhCisjZW5kaWYKKyRsb2FkX3RhYmxlOgorCS5ncHJlbDMyICRsb2FkX25vbmUJIyBGRklfVFlQRV9WT0lECisJLmdwcmVsMzIgJGxvYWRfMzIJIyBGRklfVFlQRV9JTlQKKwkuZ3ByZWwzMiAkbG9hZF9mbG9hdAkjIEZGSV9UWVBFX0ZMT0FUCisJLmdwcmVsMzIgJGxvYWRfZG91YmxlCSMgRkZJX1RZUEVfRE9VQkxFCisJLmdwcmVsMzIgJGxvYWRfbm9uZQkjIEZGSV9UWVBFX0xPTkdET1VCTEUKKwkuZ3ByZWwzMiAkbG9hZF91OAkjIEZGSV9UWVBFX1VJTlQ4CisJLmdwcmVsMzIgJGxvYWRfczgJIyBGRklfVFlQRV9TSU5UOAorCS5ncHJlbDMyICRsb2FkX3UxNgkjIEZGSV9UWVBFX1VJTlQxNgorCS5ncHJlbDMyICRsb2FkX3MxNgkjIEZGSV9UWVBFX1NJTlQxNgorCS5ncHJlbDMyICRsb2FkXzMyCSMgRkZJX1RZUEVfVUlOVDMyCisJLmdwcmVsMzIgJGxvYWRfMzIJIyBGRklfVFlQRV9TSU5UMzIKKwkuZ3ByZWwzMiAkbG9hZF82NAkjIEZGSV9UWVBFX1VJTlQ2NAorCS5ncHJlbDMyICRsb2FkXzY0CSMgRkZJX1RZUEVfU0lOVDY0CisJLmdwcmVsMzIgJGxvYWRfbm9uZQkjIEZGSV9UWVBFX1NUUlVDVAorCS5ncHJlbDMyICRsb2FkXzY0CSMgRkZJX1RZUEVfUE9JTlRFUgorCisvKiBBc3NlcnQgdGhhdCB0aGUgdGFibGUgYWJvdmUgaXMgaW4gc3luYyB3aXRoIGZmaS5oLiAgKi8KKworI2lmCSAgIEZGSV9UWVBFX0ZMT0FUICE9IDIJCVwKKwl8fCBGRklfVFlQRV9ET1VCTEUgIT0gMwkJXAorCXx8IEZGSV9UWVBFX1VJTlQ4ICE9IDUJCVwKKwl8fCBGRklfVFlQRV9TSU5UOCAhPSA2CQlcCisJfHwgRkZJX1RZUEVfVUlOVDE2ICE9IDcJCVwKKwl8fCBGRklfVFlQRV9TSU5UMTYgIT0gOAkJXAorCXx8IEZGSV9UWVBFX1VJTlQzMiAhPSA5CQlcCisJfHwgRkZJX1RZUEVfU0lOVDMyICE9IDEwCVwKKwl8fCBGRklfVFlQRV9VSU5UNjQgIT0gMTEJXAorCXx8IEZGSV9UWVBFX1NJTlQ2NCAhPSAxMglcCisJfHwgRkZJX1RZUEVfU1RSVUNUICE9IDEzCVwKKwl8fCBGRklfVFlQRV9QT0lOVEVSICE9IDE0CVwKKwl8fCBGRklfVFlQRV9MQVNUICE9IDE0CisjZXJyb3IgIm9zZi5TIG91dCBvZiBzeW5jIHdpdGggZmZpLmgiCisjZW5kaWYKKworI2lmZGVmIF9fRUxGX18KKyMgZGVmaW5lIFVBX1NJCQkuNGJ5dGUKKyMgZGVmaW5lIEZERV9FTkNPRElORwkweDFiCS8qIHBjcmVsIHNkYXRhNCAqLworIyBkZWZpbmUgRkRFX0VOQ09ERShYKQkuNGJ5dGUgWC0uCisjIGRlZmluZSBGREVfQVJBTkdFKFgpCS40Ynl0ZSBYCisjZWxpZiBkZWZpbmVkIF9fb3NmX18KKyMgZGVmaW5lIFVBX1NJCQkuYWxpZ24gMDsgLmxvbmcKKyMgZGVmaW5lIEZERV9FTkNPRElORwkweDUwCS8qIGFsaWduZWQgYWJzb2x1dGUgKi8KKyMgZGVmaW5lIEZERV9FTkNPREUoWCkJLmFsaWduIDM7IC5xdWFkIFgKKyMgZGVmaW5lIEZERV9BUkFOR0UoWCkJLmFsaWduIDA7IC5xdWFkIFgKKyNlbmRpZgorCisjaWZkZWYgX19FTEZfXworCS5zZWN0aW9uCS5laF9mcmFtZSxFSF9GUkFNRV9GTEFHUyxAcHJvZ2JpdHMKKyNlbGlmIGRlZmluZWQgX19vc2ZfXworCS5kYXRhCisJLmFsaWduIDMKKwkuZ2xvYmwgX0dMT0JBTF9fRl9mZmlfY2FsbF9vc2YKK19HTE9CQUxfX0ZfZmZpX2NhbGxfb3NmOgorI2VuZGlmCitfX0ZSQU1FX0JFR0lOX186CisJVUFfU0kJJExFQ0lFMS0kTFNDSUUxCSMgTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQorJExTQ0lFMToKKwlVQV9TSQkweDAJCSMgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCQkjIENJRSBWZXJzaW9uCisJLmFzY2lpICJ6UlwwIgkJIyBDSUUgQXVnbWVudGF0aW9uCisJLmJ5dGUJMHgxCQkjIHVsZWIxMjggMHgxOyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJMHg3OAkJIyBzbGViMTI4IC04OyBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJMjYJCSMgQ0lFIFJBIENvbHVtbgorCS5ieXRlCTB4MQkJIyB1bGViMTI4IDB4MTsgQXVnbWVudGF0aW9uIHNpemUKKwkuYnl0ZQlGREVfRU5DT0RJTkcJIyBGREUgRW5jb2RpbmcKKwkuYnl0ZQkweGMJCSMgRFdfQ0ZBX2RlZl9jZmEKKwkuYnl0ZQkzMAkJIyB1bGViMTI4IGNvbHVtbiAzMAorCS5ieXRlCTAJCSMgdWxlYjEyOCBvZmZzZXQgMAorCS5hbGlnbiAzCiskTEVDSUUxOgorJExTRkRFMToKKwlVQV9TSQkkTEVGREUxLSRMQVNGREUxCQkjIEZERSBMZW5ndGgKKyRMQVNGREUxOgorCVVBX1NJCSRMQVNGREUxLV9fRlJBTUVfQkVHSU5fXwkjIEZERSBDSUUgb2Zmc2V0CisJRkRFX0VOQ09ERSgkTEZCMSkJCQkjIEZERSBpbml0aWFsIGxvY2F0aW9uCisJRkRFX0FSQU5HRSgkTEZFMS0kTEZCMSkJCQkjIEZERSBhZGRyZXNzIHJhbmdlCisJLmJ5dGUJMHgwCQkjIHVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZQorCisJLmJ5dGUJMHg0CQkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwlVQV9TSQkkTENGSTEtJExGQjEKKwkuYnl0ZQkweDlhCQkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAyNgorCS5ieXRlCTQJCSMgdWxlYjEyOCA0Ki04CisJLmJ5dGUJMHg4ZgkJIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMTUKKwkuYnl0ZQkweDMJCSMgdWxlYjEyOCAzKi04CisJLmJ5dGUJMHhjCQkjIERXX0NGQV9kZWZfY2ZhCisJLmJ5dGUJMTUJCSMgdWxlYjEyOCBjb2x1bW4gMTUKKwkuYnl0ZQkzMgkJIyB1bGViMTI4IG9mZnNldCAzMgorCisJLmJ5dGUJMHg0CQkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwlVQV9TSQkkTENGSTItJExDRkkxCisJLmJ5dGUJMHhkYQkJIyBEV19DRkFfcmVzdG9yZSwgY29sdW1uIDI2CisJLmFsaWduIDMKKyRMRUZERTE6CisKKyRMU0ZERTM6CisJVUFfU0kJJExFRkRFMy0kTEFTRkRFMwkJIyBGREUgTGVuZ3RoCiskTEFTRkRFMzoKKwlVQV9TSQkkTEFTRkRFMy1fX0ZSQU1FX0JFR0lOX18JIyBGREUgQ0lFIG9mZnNldAorCUZERV9FTkNPREUoJExGQjIpCQkJIyBGREUgaW5pdGlhbCBsb2NhdGlvbgorCUZERV9BUkFOR0UoJExGRTItJExGQjIpCQkJIyBGREUgYWRkcmVzcyByYW5nZQorCS5ieXRlCTB4MAkJIyB1bGViMTI4IDB4MDsgQXVnbWVudGF0aW9uIHNpemUKKworCS5ieXRlCTB4NAkJIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJVUFfU0kJJExDRkk1LSRMRkIyCisJLmJ5dGUJMHhlCQkjIERXX0NGQV9kZWZfY2ZhX29mZnNldAorCS5ieXRlCTB4ODAsMHgxCSMgdWxlYjEyOCAxMjgKKworCS5ieXRlCTB4NAkJIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJVUFfU0kJJExDRkk2LSRMQ0ZJNQorCS5ieXRlCTB4OWEJCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDI2CisJLmJ5dGUJMTYJCSMgdWxlYjEyOCBvZmZzZXQgMTYqLTgKKwkuYWxpZ24gMworJExFRkRFMzoKKyNpZiBkZWZpbmVkIF9fb3NmX18KKwkuYWxpZ24gMAorCS5sb25nCTAJCSMgRW5kIG9mIFRhYmxlCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19FTEZfXyAmJiBkZWZpbmVkIF9fbGludXhfXworCS5zZWN0aW9uCS5ub3RlLkdOVS1zdGFjaywiIixAcHJvZ2JpdHMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hcm0vZmZpLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2FybS9mZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU3NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hcm0vZmZpLmMKQEAgLTAsMCArMSw3MjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAxMSBQbGF1c2libGUgTGFicyBDb29wZXJhdGl2ZSwgSW5jLgorICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTEgQW50aG9ueSBHcmVlbgorCSAgIENvcHlyaWdodCAoYykgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4LCAyMDExICBSZWQgSGF0LCBJbmMuCisJICAgCisgICBBUk0gRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogRm9yd2FyZCBkZWNsYXJlcy4gKi8KK3N0YXRpYyBpbnQgdmZwX3R5cGVfcCAoZmZpX3R5cGUgKik7CitzdGF0aWMgdm9pZCBsYXlvdXRfdmZwX2FyZ3MgKGZmaV9jaWYgKik7CisKKy8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKKyAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzCisgICAKKyAgIFRoZSB2ZnBfc3BhY2UgcGFyYW1ldGVyIGlzIHRoZSBsb2FkIGFyZWEgZm9yIFZGUCByZWdzLCB0aGUgcmV0dXJuCisgICB2YWx1ZSBpcyBjaWYtPnZmcF91c2VkICh3b3JkIGJpdHNldCBvZiBWRlAgcmVncyB1c2VkIGZvciBwYXNzaW5nCisgICBhcmd1bWVudHMpLiBUaGVzZSBhcmUgb25seSB1c2VkIGZvciB0aGUgVkZQIGhhcmQtZmxvYXQgQUJJLgorKi8KK2ludCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYsIGZsb2F0ICp2ZnBfc3BhY2UpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpLCB2aSA9IDA7CisgIHJlZ2lzdGVyIHZvaWQgKipwX2FyZ3Y7CisgIHJlZ2lzdGVyIGNoYXIgKmFyZ3A7CisgIHJlZ2lzdGVyIGZmaV90eXBlICoqcF9hcmc7CisKKyAgYXJncCA9IHN0YWNrOworCisgIGlmICggZWNpZi0+Y2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QgKSB7CisgICAgKih2b2lkICoqKSBhcmdwID0gZWNpZi0+cnZhbHVlOworICAgIGFyZ3AgKz0gNDsKKyAgfQorCisgIHBfYXJndiA9IGVjaWYtPmF2YWx1ZTsKKworICBmb3IgKGkgPSBlY2lmLT5jaWYtPm5hcmdzLCBwX2FyZyA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOworICAgICAgIChpICE9IDApOworICAgICAgIGktLSwgcF9hcmcrKykKKyAgICB7CisgICAgICBzaXplX3QgejsKKworICAgICAgLyogQWxsb2NhdGVkIGluIFZGUCByZWdpc3RlcnMuICovCisgICAgICBpZiAoZWNpZi0+Y2lmLT5hYmkgPT0gRkZJX1ZGUAorCSAgJiYgdmkgPCBlY2lmLT5jaWYtPnZmcF9uYXJncyAmJiB2ZnBfdHlwZV9wICgqcF9hcmcpKQorCXsKKwkgIGZsb2F0KiB2ZnBfc2xvdCA9IHZmcF9zcGFjZSArIGVjaWYtPmNpZi0+dmZwX2FyZ3NbdmkrK107CisJICBpZiAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisJICAgICooKGZsb2F0Kil2ZnBfc2xvdCkgPSAqKChmbG9hdCopKnBfYXJndik7CisJICBlbHNlIGlmICgoKnBfYXJnKS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisJICAgICooKGRvdWJsZSopdmZwX3Nsb3QpID0gKigoZG91YmxlKikqcF9hcmd2KTsKKwkgIGVsc2UKKwkgICAgbWVtY3B5KHZmcF9zbG90LCAqcF9hcmd2LCAoKnBfYXJnKS0+c2l6ZSk7CisJICBwX2FyZ3YrKzsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoKCgqcF9hcmcpLT5hbGlnbm1lbnQgLSAxKSAmICh1bnNpZ25lZCkgYXJncCkgeworCWFyZ3AgPSAoY2hhciAqKSBBTElHTihhcmdwLCAoKnBfYXJnKS0+YWxpZ25tZW50KTsKKyAgICAgIH0KKworICAgICAgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKwlhcmdwID0gKGNoYXIgKikgQUxJR04oYXJncCwgNCk7CisKKwkgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKwkgIGlmICh6IDwgc2l6ZW9mKGludCkpCisJICAgIHsKKwkgICAgICB6ID0gc2l6ZW9mKGludCk7CisJICAgICAgc3dpdGNoICgoKnBfYXJnKS0+dHlwZSkKKwkJeworCQljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCQkgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpKihTSU5UOCAqKSgqIHBfYXJndik7CisJCSAgYnJlYWs7CisJCSAgCisJCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJCSAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UOCAqKSgqIHBfYXJndik7CisJCSAgYnJlYWs7CisJCSAgCisJCWNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCQkgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpKihTSU5UMTYgKikoKiBwX2FyZ3YpOworCQkgIGJyZWFrOworCQkgIAorCQljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkJICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQxNiAqKSgqIHBfYXJndik7CisJCSAgYnJlYWs7CisJCSAgCisJCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCQkgIG1lbWNweShhcmdwLCAqcF9hcmd2LCAoKnBfYXJnKS0+c2l6ZSk7CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICBGRklfQVNTRVJUKDApOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHogPT0gc2l6ZW9mKGludCkpCisJICAgIHsKKwkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQzMiAqKSgqIHBfYXJndik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1lbWNweShhcmdwLCAqcF9hcmd2LCB6KTsKKwkgICAgfQorCSAgcF9hcmd2Kys7CisJICBhcmdwICs9IHo7CisgICAgfQorCisgIC8qIEluZGljYXRlIHRoZSBWRlAgcmVnaXN0ZXJzIHVzZWQuICovCisgIHJldHVybiBlY2lmLT5jaWYtPnZmcF91c2VkOworfQorCisvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCitmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZl9tYWNoZGVwKGZmaV9jaWYgKmNpZikKK3sKKyAgaW50IHR5cGVfY29kZTsKKyAgLyogUm91bmQgdGhlIHN0YWNrIHVwIHRvIGEgbXVsdGlwbGUgb2YgOCBieXRlcy4gIFRoaXMgaXNuJ3QgbmVlZGVkIAorICAgICBldmVyeXdoZXJlLCBidXQgaXQgaXMgb24gc29tZSBwbGF0Zm9ybXMsIGFuZCBpdCBkb2Vzbid0IGhhcm0gYW55dGhpbmcKKyAgICAgd2hlbiBpdCBpc24ndCBuZWVkZWQuICAqLworICBjaWYtPmJ5dGVzID0gKGNpZi0+Ynl0ZXMgKyA3KSAmIH43OworCisgIC8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZyAqLworICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorICAgICAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKSBGRklfVFlQRV9TSU5UNjQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgaWYgKGNpZi0+YWJpID09IEZGSV9WRlAKKwkgICYmICh0eXBlX2NvZGUgPSB2ZnBfdHlwZV9wIChjaWYtPnJ0eXBlKSkgIT0gMCkKKwl7CisJICAvKiBBIENvbXBvc2l0ZSBUeXBlIHBhc3NlZCBpbiBWRlAgcmVnaXN0ZXJzLCBlaXRoZXIKKwkgICAgIEZGSV9UWVBFX1NUUlVDVF9WRlBfRkxPQVQgb3IgRkZJX1RZUEVfU1RSVUNUX1ZGUF9ET1VCTEUuICovCisJICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKSB0eXBlX2NvZGU7CisJfQorICAgICAgZWxzZSBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA8PSA0KQorCS8qIEEgQ29tcG9zaXRlIFR5cGUgbm90IGxhcmdlciB0aGFuIDQgYnl0ZXMgaXMgcmV0dXJuZWQgaW4gcjAuICAqLworCWNpZi0+ZmxhZ3MgPSAodW5zaWduZWQpRkZJX1RZUEVfSU5UOworICAgICAgZWxzZQorCS8qIEEgQ29tcG9zaXRlIFR5cGUgbGFyZ2VyIHRoYW4gNCBieXRlcywgb3Igd2hvc2Ugc2l6ZSBjYW5ub3QKKwkgICBiZSBkZXRlcm1pbmVkIHN0YXRpY2FsbHkgLi4uIGlzIHN0b3JlZCBpbiBtZW1vcnkgYXQgYW4KKwkgICBhZGRyZXNzIHBhc3NlZCBbaW4gcjBdLiAgKi8KKwljaWYtPmZsYWdzID0gKHVuc2lnbmVkKUZGSV9UWVBFX1NUUlVDVDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogTWFwIG91dCB0aGUgcmVnaXN0ZXIgcGxhY2VtZW50cyBvZiBWRlAgcmVnaXN0ZXIgYXJncy4KKyAgICAgVGhlIFZGUCBoYXJkLWZsb2F0IGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHNsaWdodGx5IG1vcmUgc29waGlzdGljYXRlZCB0aGFuCisgICAgIHRoZSBiYXNlIGNhbGxpbmcgY29udmVudGlvbnMsIHNvIHdlIGRvIGl0IGhlcmUgaW5zdGVhZCBvZiBpbiBmZmlfcHJlcF9hcmdzKCkuICovCisgIGlmIChjaWYtPmFiaSA9PSBGRklfVkZQKQorICAgIGxheW91dF92ZnBfYXJncyAoY2lmKTsKKworICByZXR1cm4gRkZJX09LOworfQorCisvKiBQcm90b3R5cGVzIGZvciBhc3NlbWJseSBmdW5jdGlvbnMsIGluIHN5c3YuUyAqLworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfU1lTViAodm9pZCAoKmZuKSh2b2lkKSwgZXh0ZW5kZWRfY2lmICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQgKik7CitleHRlcm4gdm9pZCBmZmlfY2FsbF9WRlAgKHZvaWQgKCpmbikodm9pZCksIGV4dGVuZGVkX2NpZiAqLCB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkICopOworCit2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKworICBpbnQgc21hbGxfc3RydWN0ID0gKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfSU5UIAorCQkgICAgICAmJiBjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCk7CisgIGludCB2ZnBfc3RydWN0ID0gKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUX1ZGUF9GTE9BVAorCQkgICAgfHwgY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1RfVkZQX0RPVUJMRSk7CisKKyAgZWNpZi5jaWYgPSBjaWY7CisgIGVjaWYuYXZhbHVlID0gYXZhbHVlOworCisgIHVuc2lnbmVkIGludCB0ZW1wOworICAKKyAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybgkqLworICAvKiB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZQkJICAgICAgICAqLworCisgIGlmICgocnZhbHVlID09IE5VTEwpICYmIAorICAgICAgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKSkKKyAgICB7CisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICB9CisgIGVsc2UgaWYgKHNtYWxsX3N0cnVjdCkKKyAgICBlY2lmLnJ2YWx1ZSA9ICZ0ZW1wOworICBlbHNlIGlmICh2ZnBfc3RydWN0KQorICAgIHsKKyAgICAgIC8qIExhcmdlc3QgY2FzZSBpcyBkb3VibGUgeCA0LiAqLworICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EoMzIpOworICAgIH0KKyAgZWxzZQorICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOworCisgIHN3aXRjaCAoY2lmLT5hYmkpIAorICAgIHsKKyAgICBjYXNlIEZGSV9TWVNWOgorICAgICAgZmZpX2NhbGxfU1lTViAoZm4sICZlY2lmLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1ZGUDoKKyAgICAgIGZmaV9jYWxsX1ZGUCAoZm4sICZlY2lmLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorICBpZiAoc21hbGxfc3RydWN0KQorICAgIG1lbWNweSAocnZhbHVlLCAmdGVtcCwgY2lmLT5ydHlwZS0+c2l6ZSk7CisgIGVsc2UgaWYgKHZmcF9zdHJ1Y3QpCisgICAgbWVtY3B5IChydmFsdWUsIGVjaWYucnZhbHVlLCBjaWYtPnJ0eXBlLT5zaXplKTsKK30KKworLyoqIHByaXZhdGUgbWVtYmVycyAqKi8KKworc3RhdGljIHZvaWQgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWIChjaGFyICpzdGFjaywgdm9pZCAqKnJldCwKKwkJCQkJIHZvaWQqKiBhcmdzLCBmZmlfY2lmKiBjaWYsIGZsb2F0ICp2ZnBfc3RhY2spOworCit2b2lkIGZmaV9jbG9zdXJlX1NZU1YgKGZmaV9jbG9zdXJlICopOworCit2b2lkIGZmaV9jbG9zdXJlX1ZGUCAoZmZpX2Nsb3N1cmUgKik7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMganVtcGVkIHRvIGJ5IHRoZSB0cmFtcG9saW5lICovCisKK3Vuc2lnbmVkIGludAorZmZpX2Nsb3N1cmVfU1lTVl9pbm5lciAoY2xvc3VyZSwgcmVzcHAsIGFyZ3MsIHZmcF9hcmdzKQorICAgICBmZmlfY2xvc3VyZSAqY2xvc3VyZTsKKyAgICAgdm9pZCAqKnJlc3BwOworICAgICB2b2lkICphcmdzOworICAgICB2b2lkICp2ZnBfYXJnczsKK3sKKyAgLy8gb3VyIHZhcmlvdXMgdGhpbmdzLi4uCisgIGZmaV9jaWYgICAgICAgKmNpZjsKKyAgdm9pZCAgICAgICAgICoqYXJnX2FyZWE7CisKKyAgY2lmICAgICAgICAgPSBjbG9zdXJlLT5jaWY7CisgIGFyZ19hcmVhICAgID0gKHZvaWQqKikgYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkKikpOyAgCisKKyAgLyogdGhpcyBjYWxsIHdpbGwgaW5pdGlhbGl6ZSBBUkdfQVJFQSwgc3VjaCB0aGF0IGVhY2gKKyAgICogZWxlbWVudCBpbiB0aGF0IGFycmF5IHBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyAKKyAgICogdmFsdWUgb24gdGhlIHN0YWNrOyBhbmQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgICogYSBzdHJ1Y3R1cmUsIGl0IHdpbGwgcmUtc2V0IFJFU1AgdG8gcG9pbnQgdG8gdGhlCisgICAqIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcy4gICovCisKKyAgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGFyZ3MsIHJlc3BwLCBhcmdfYXJlYSwgY2lmLCB2ZnBfYXJncyk7CisKKyAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgKnJlc3BwLCBhcmdfYXJlYSwgY2xvc3VyZS0+dXNlcl9kYXRhKTsKKworICByZXR1cm4gY2lmLT5mbGFnczsKK30KKworLypALWV4cG9ydGhlYWRlckAqLworc3RhdGljIHZvaWQgCitmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoY2hhciAqc3RhY2ssIHZvaWQgKipydmFsdWUsCisJCQkgICAgdm9pZCAqKmF2YWx1ZSwgZmZpX2NpZiAqY2lmLAorCQkJICAgIC8qIFVzZWQgb25seSB1bmRlciBWRlAgaGFyZC1mbG9hdCBBQkkuICovCisJCQkgICAgZmxvYXQgKnZmcF9zdGFjaykKKy8qQD1leHBvcnRoZWFkZXJAKi8KK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGksIHZpID0gMDsKKyAgcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKKyAgcmVnaXN0ZXIgY2hhciAqYXJncDsKKyAgcmVnaXN0ZXIgZmZpX3R5cGUgKipwX2FyZzsKKworICBhcmdwID0gc3RhY2s7CisKKyAgaWYgKCBjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCApIHsKKyAgICAqcnZhbHVlID0gKih2b2lkICoqKSBhcmdwOworICAgIGFyZ3AgKz0gNDsKKyAgfQorCisgIHBfYXJndiA9IGF2YWx1ZTsKKworICBmb3IgKGkgPSBjaWYtPm5hcmdzLCBwX2FyZyA9IGNpZi0+YXJnX3R5cGVzOyAoaSAhPSAwKTsgaS0tLCBwX2FyZysrKQorICAgIHsKKyAgICAgIHNpemVfdCB6OworICAgICAgc2l6ZV90IGFsaWdubWVudDsKKyAgCisgICAgICBpZiAoY2lmLT5hYmkgPT0gRkZJX1ZGUAorCSAgJiYgdmkgPCBjaWYtPnZmcF9uYXJncyAmJiB2ZnBfdHlwZV9wICgqcF9hcmcpKQorCXsKKwkgICpwX2FyZ3YrKyA9ICh2b2lkKikodmZwX3N0YWNrICsgY2lmLT52ZnBfYXJnc1t2aSsrXSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGFsaWdubWVudCA9ICgqcF9hcmcpLT5hbGlnbm1lbnQ7CisgICAgICBpZiAoYWxpZ25tZW50IDwgNCkKKwlhbGlnbm1lbnQgPSA0OworICAgICAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoKGFsaWdubWVudCAtIDEpICYgKHVuc2lnbmVkKSBhcmdwKSB7CisJYXJncCA9IChjaGFyICopIEFMSUdOKGFyZ3AsIGFsaWdubWVudCk7CisgICAgICB9CisKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKworICAgICAgLyogYmVjYXVzZSB3ZSdyZSBsaXR0bGUgZW5kaWFuLCB0aGlzIGlzIHdoYXQgaXQgdHVybnMgaW50by4gICAqLworCisgICAgICAqcF9hcmd2ID0gKHZvaWQqKSBhcmdwOworCisgICAgICBwX2FyZ3YrKzsKKyAgICAgIGFyZ3AgKz0gejsKKyAgICB9CisgIAorICByZXR1cm47Cit9CisKKy8qIEhvdyB0byBtYWtlIGEgdHJhbXBvbGluZS4gICovCisKKyNpZiBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFCisKKyNpbmNsdWRlIDxtYWNoL21hY2guaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworZXh0ZXJuIHZvaWQgKmZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGVfcGFnZTsKKwordHlwZWRlZiBzdHJ1Y3QgZmZpX3RyYW1wb2xpbmVfdGFibGUgZmZpX3RyYW1wb2xpbmVfdGFibGU7Cit0eXBlZGVmIHN0cnVjdCBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeTsKKworc3RydWN0IGZmaV90cmFtcG9saW5lX3RhYmxlIHsKKyAgLyogY29udGlnaW91cyB3cml0YWJsZSBhbmQgZXhlY3V0YWJsZSBwYWdlcyAqLworICB2bV9hZGRyZXNzX3QgY29uZmlnX3BhZ2U7CisgIHZtX2FkZHJlc3NfdCB0cmFtcG9saW5lX3BhZ2U7CisKKyAgLyogZnJlZSBsaXN0IHRyYWNraW5nICovCisgIHVpbnQxNl90IGZyZWVfY291bnQ7CisgIGZmaV90cmFtcG9saW5lX3RhYmxlX2VudHJ5ICpmcmVlX2xpc3Q7CisgIGZmaV90cmFtcG9saW5lX3RhYmxlX2VudHJ5ICpmcmVlX2xpc3RfcG9vbDsKKworICBmZmlfdHJhbXBvbGluZV90YWJsZSAqcHJldjsKKyAgZmZpX3RyYW1wb2xpbmVfdGFibGUgKm5leHQ7Cit9OworCitzdHJ1Y3QgZmZpX3RyYW1wb2xpbmVfdGFibGVfZW50cnkgeworICB2b2lkICooKnRyYW1wb2xpbmUpKCk7CisgIGZmaV90cmFtcG9saW5lX3RhYmxlX2VudHJ5ICpuZXh0OworfTsKKworLyogT3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGFyY2hpdGVjdHVyZSB0cmFtcG9saW5lIHNpemUgKi8KKy8vIFhYWCBUT0RPIC0gRml4CisjdW5kZWYgRkZJX1RSQU1QT0xJTkVfU0laRQorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDEyCisKKy8qIFRoZSB0cmFtcG9saW5lIGNvbmZpZ3VyYXRpb24gaXMgcGxhY2VkIGF0IDQwODAgYnl0ZXMgcHJpb3IgdG8gdGhlIHRyYW1wb2xpbmUncyBlbnRyeSBwb2ludCAqLworI2RlZmluZSBGRklfVFJBTVBPTElORV9DT0RFTE9DX0NPTkZJRyhjb2RlbG9jKSAoKHZvaWQgKiopICgoKHVpbnQ4X3QgKikgY29kZWxvYykgLSA0MDgwKSk7CisKKy8qIFRoZSBmaXJzdCAxNiBieXRlcyBvZiB0aGUgY29uZmlnIHBhZ2UgYXJlIHVudXNlZCwgYXMgdGhleSBhcmUgdW5hZGRyZXNzYWJsZSBmcm9tIHRoZSB0cmFtcG9saW5lIHBhZ2UuICovCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX0NPTkZJR19QQUdFX09GRlNFVCAxNgorCisvKiBUb3RhbCBudW1iZXIgb2YgdHJhbXBvbGluZXMgdGhhdCBmaXQgaW4gb25lIHRyYW1wb2xpbmUgdGFibGUgKi8KKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfQ09VTlQgKChQQUdFX1NJWkUgLSBGRklfVFJBTVBPTElORV9DT05GSUdfUEFHRV9PRkZTRVQpIC8gRkZJX1RSQU1QT0xJTkVfU0laRSkKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBmZmlfdHJhbXBvbGluZV9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBmZmlfdHJhbXBvbGluZV90YWJsZSAqZmZpX3RyYW1wb2xpbmVfdGFibGVzID0gTlVMTDsKKworc3RhdGljIGZmaV90cmFtcG9saW5lX3RhYmxlICoKK2ZmaV90cmFtcG9saW5lX3RhYmxlX2FsbG9jICgpCit7CisgIGZmaV90cmFtcG9saW5lX3RhYmxlICp0YWJsZSA9IE5VTEw7CisKKyAgLyogTG9vcCB1bnRpbCB3ZSBjYW4gYWxsb2NhdGUgdHdvIGNvbnRpZ2lvdXMgcGFnZXMgKi8KKyAgd2hpbGUgKHRhYmxlID09IE5VTEwpIHsKKyAgICB2bV9hZGRyZXNzX3QgY29uZmlnX3BhZ2UgPSAweDA7CisgICAga2Vybl9yZXR1cm5fdCBrdDsKKworICAgIC8qIFRyeSB0byBhbGxvY2F0ZSB0d28gcGFnZXMgKi8KKyAgICBrdCA9IHZtX2FsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgJmNvbmZpZ19wYWdlLCBQQUdFX1NJWkUqMiwgVk1fRkxBR1NfQU5ZV0hFUkUpOworICAgIGlmIChrdCAhPSBLRVJOX1NVQ0NFU1MpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidm1fYWxsb2NhdGUoKSBmYWlsdXJlOiAlZCBhdCAlczolZFxuIiwga3QsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBOb3cgZHJvcCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGFsbG9jYXRpb24gdG8gbWFrZSByb29tIGZvciB0aGUgdHJhbXBvbGluZSB0YWJsZSAqLworICAgIHZtX2FkZHJlc3NfdCB0cmFtcG9saW5lX3BhZ2UgPSBjb25maWdfcGFnZStQQUdFX1NJWkU7CisgICAga3QgPSB2bV9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgdHJhbXBvbGluZV9wYWdlLCBQQUdFX1NJWkUpOworICAgIGlmIChrdCAhPSBLRVJOX1NVQ0NFU1MpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidm1fZGVhbGxvY2F0ZSgpIGZhaWx1cmU6ICVkIGF0ICVzOiVkXG4iLCBrdCwgX19GSUxFX18sIF9fTElORV9fKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFJlbWFwIHRoZSB0cmFtcG9saW5lIHRhYmxlIHRvIGRpcmVjdGx5IGZvbGxvdyB0aGUgY29uZmlnIHBhZ2UgKi8KKyAgICB2bV9wcm90X3QgY3VyX3Byb3Q7CisgICAgdm1fcHJvdF90IG1heF9wcm90OworCisgICAga3QgPSB2bV9yZW1hcCAobWFjaF90YXNrX3NlbGYgKCksICZ0cmFtcG9saW5lX3BhZ2UsIFBBR0VfU0laRSwgMHgwLCBGQUxTRSwgbWFjaF90YXNrX3NlbGYgKCksICh2bV9hZGRyZXNzX3QpICZmZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlX3BhZ2UsIEZBTFNFLCAmY3VyX3Byb3QsICZtYXhfcHJvdCwgVk1fSU5IRVJJVF9TSEFSRSk7CisKKyAgICAvKiBJZiB3ZSBsb3N0IGFjY2VzcyB0byB0aGUgZGVzdGluYXRpb24gdHJhbXBvbGluZSBwYWdlLCBkcm9wIG91ciBjb25maWcgYWxsb2NhdGlvbiBtYXBwaW5nIGFuZCByZXRyeSAqLworICAgIGlmIChrdCAhPSBLRVJOX1NVQ0NFU1MpIHsKKyAgICAgIC8qIExvZyB1bmV4cGVjdGVkIGZhaWx1cmVzICovCisgICAgICBpZiAoa3QgIT0gS0VSTl9OT19TUEFDRSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInZtX3JlbWFwKCkgZmFpbHVyZTogJWQgYXQgJXM6JWRcbiIsIGt0LCBfX0ZJTEVfXywgX19MSU5FX18pOworICAgICAgfQorCisgICAgICB2bV9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgY29uZmlnX3BhZ2UsIFBBR0VfU0laRSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBXZSBoYXZlIHZhbGlkIHRyYW1wb2xpbmUgYW5kIGNvbmZpZyBwYWdlcyAqLworICAgIHRhYmxlID0gY2FsbG9jICgxLCBzaXplb2YoZmZpX3RyYW1wb2xpbmVfdGFibGUpKTsKKyAgICB0YWJsZS0+ZnJlZV9jb3VudCA9IEZGSV9UUkFNUE9MSU5FX0NPVU5UOworICAgIHRhYmxlLT5jb25maWdfcGFnZSA9IGNvbmZpZ19wYWdlOworICAgIHRhYmxlLT50cmFtcG9saW5lX3BhZ2UgPSB0cmFtcG9saW5lX3BhZ2U7CisKKyAgICAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIGZyZWUgbGlzdCAqLworICAgIHRhYmxlLT5mcmVlX2xpc3RfcG9vbCA9IGNhbGxvYyhGRklfVFJBTVBPTElORV9DT1VOVCwgc2l6ZW9mKGZmaV90cmFtcG9saW5lX3RhYmxlX2VudHJ5KSk7CisKKyAgICB1aW50MTZfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+ZnJlZV9jb3VudDsgaSsrKSB7CisgICAgICBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSAqZW50cnkgPSAmdGFibGUtPmZyZWVfbGlzdF9wb29sW2ldOworICAgICAgZW50cnktPnRyYW1wb2xpbmUgPSAodm9pZCAqKSAodGFibGUtPnRyYW1wb2xpbmVfcGFnZSArIChpICogRkZJX1RSQU1QT0xJTkVfU0laRSkpOworCisgICAgICBpZiAoaSA8IHRhYmxlLT5mcmVlX2NvdW50IC0gMSkKKyAgICAgICAgZW50cnktPm5leHQgPSAmdGFibGUtPmZyZWVfbGlzdF9wb29sW2krMV07CisgICAgfQorCisgICAgdGFibGUtPmZyZWVfbGlzdCA9IHRhYmxlLT5mcmVlX2xpc3RfcG9vbDsKKyAgfQorCisgIHJldHVybiB0YWJsZTsKK30KKwordm9pZCAqCitmZmlfY2xvc3VyZV9hbGxvYyAoc2l6ZV90IHNpemUsIHZvaWQgKipjb2RlKQoreworICAvKiBDcmVhdGUgdGhlIGNsb3N1cmUgKi8KKyAgZmZpX2Nsb3N1cmUgKmNsb3N1cmUgPSBtYWxsb2Moc2l6ZSk7CisgIGlmIChjbG9zdXJlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZmZmlfdHJhbXBvbGluZV9sb2NrKTsKKworICAvKiBDaGVjayBmb3IgYW4gYWN0aXZlIHRyYW1wb2xpbmUgdGFibGUgd2l0aCBhdmFpbGFibGUgZW50cmllcy4gKi8KKyAgZmZpX3RyYW1wb2xpbmVfdGFibGUgKnRhYmxlID0gZmZpX3RyYW1wb2xpbmVfdGFibGVzOworICBpZiAodGFibGUgPT0gTlVMTCB8fCB0YWJsZS0+ZnJlZV9saXN0ID09IE5VTEwpIHsKKyAgICB0YWJsZSA9IGZmaV90cmFtcG9saW5lX3RhYmxlX2FsbG9jICgpOworICAgIGlmICh0YWJsZSA9PSBOVUxMKSB7CisgICAgICBmcmVlKGNsb3N1cmUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogSW5zZXJ0IHRoZSBuZXcgdGFibGUgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCAqLworICAgIHRhYmxlLT5uZXh0ID0gZmZpX3RyYW1wb2xpbmVfdGFibGVzOworICAgIGlmICh0YWJsZS0+bmV4dCAhPSBOVUxMKQorICAgICAgICB0YWJsZS0+bmV4dC0+cHJldiA9IHRhYmxlOworCisgICAgZmZpX3RyYW1wb2xpbmVfdGFibGVzID0gdGFibGU7CisgIH0KKworICAvKiBDbGFpbSB0aGUgZnJlZSBlbnRyeSAqLworICBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSAqZW50cnkgPSBmZmlfdHJhbXBvbGluZV90YWJsZXMtPmZyZWVfbGlzdDsKKyAgZmZpX3RyYW1wb2xpbmVfdGFibGVzLT5mcmVlX2xpc3QgPSBlbnRyeS0+bmV4dDsKKyAgZmZpX3RyYW1wb2xpbmVfdGFibGVzLT5mcmVlX2NvdW50LS07CisgIGVudHJ5LT5uZXh0ID0gTlVMTDsKKworICBwdGhyZWFkX211dGV4X3VubG9jaygmZmZpX3RyYW1wb2xpbmVfbG9jayk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgcmV0dXJuIHZhbHVlcyAqLworICAqY29kZSA9IGVudHJ5LT50cmFtcG9saW5lOworICBjbG9zdXJlLT50cmFtcG9saW5lX3RhYmxlID0gdGFibGU7CisgIGNsb3N1cmUtPnRyYW1wb2xpbmVfdGFibGVfZW50cnkgPSBlbnRyeTsKKworICByZXR1cm4gY2xvc3VyZTsKK30KKwordm9pZAorZmZpX2Nsb3N1cmVfZnJlZSAodm9pZCAqcHRyKQoreworICBmZmlfY2xvc3VyZSAqY2xvc3VyZSA9IHB0cjsKKworICBwdGhyZWFkX211dGV4X2xvY2soJmZmaV90cmFtcG9saW5lX2xvY2spOworCisgIC8qIEZldGNoIHRoZSB0YWJsZSBhbmQgZW50cnkgcmVmZXJlbmNlcyAqLworICBmZmlfdHJhbXBvbGluZV90YWJsZSAqdGFibGUgPSBjbG9zdXJlLT50cmFtcG9saW5lX3RhYmxlOworICBmZmlfdHJhbXBvbGluZV90YWJsZV9lbnRyeSAqZW50cnkgPSBjbG9zdXJlLT50cmFtcG9saW5lX3RhYmxlX2VudHJ5OworCisgIC8qIFJldHVybiB0aGUgZW50cnkgdG8gdGhlIGZyZWUgbGlzdCAqLworICBlbnRyeS0+bmV4dCA9IHRhYmxlLT5mcmVlX2xpc3Q7CisgIHRhYmxlLT5mcmVlX2xpc3QgPSBlbnRyeTsKKyAgdGFibGUtPmZyZWVfY291bnQrKzsKKworICAvKiBJZiBhbGwgdHJhbXBvbGluZXMgd2l0aGluIHRoaXMgdGFibGUgYXJlIGZyZWUsIGFuZCBhdCBsZWFzdCBvbmUgb3RoZXIgdGFibGUgZXhpc3RzLCBkZWFsbG9jYXRlCisgICAqIHRoZSB0YWJsZSAqLworICBpZiAodGFibGUtPmZyZWVfY291bnQgPT0gRkZJX1RSQU1QT0xJTkVfQ09VTlQgJiYgZmZpX3RyYW1wb2xpbmVfdGFibGVzICE9IHRhYmxlKSB7CisgICAgLyogUmVtb3ZlIGZyb20gdGhlIGxpc3QgKi8KKyAgICBpZiAodGFibGUtPnByZXYgIT0gTlVMTCkKKyAgICAgIHRhYmxlLT5wcmV2LT5uZXh0ID0gdGFibGUtPm5leHQ7CisKKyAgICBpZiAodGFibGUtPm5leHQgIT0gTlVMTCkKKyAgICAgIHRhYmxlLT5uZXh0LT5wcmV2ID0gdGFibGUtPnByZXY7CisKKyAgICAvKiBEZWFsbG9jYXRlIHBhZ2VzICovCisgICAga2Vybl9yZXR1cm5fdCBrdDsKKyAgICBrdCA9IHZtX2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLCB0YWJsZS0+Y29uZmlnX3BhZ2UsIFBBR0VfU0laRSk7CisgICAgaWYgKGt0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidm1fZGVhbGxvY2F0ZSgpIGZhaWx1cmU6ICVkIGF0ICVzOiVkXG4iLCBrdCwgX19GSUxFX18sIF9fTElORV9fKTsKKworICAgIGt0ID0gdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHRhYmxlLT50cmFtcG9saW5lX3BhZ2UsIFBBR0VfU0laRSk7CisgICAgaWYgKGt0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidm1fZGVhbGxvY2F0ZSgpIGZhaWx1cmU6ICVkIGF0ICVzOiVkXG4iLCBrdCwgX19GSUxFX18sIF9fTElORV9fKTsKKworICAgIC8qIERlYWxsb2NhdGUgZnJlZSBsaXN0ICovCisgICAgZnJlZSAodGFibGUtPmZyZWVfbGlzdF9wb29sKTsKKyAgICBmcmVlICh0YWJsZSk7CisgIH0gZWxzZSBpZiAoZmZpX3RyYW1wb2xpbmVfdGFibGVzICE9IHRhYmxlKSB7CisgICAgLyogT3RoZXJ3aXNlLCBidW1wIHRoaXMgdGFibGUgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCAqLworICAgIHRhYmxlLT5wcmV2ID0gTlVMTDsKKyAgICB0YWJsZS0+bmV4dCA9IGZmaV90cmFtcG9saW5lX3RhYmxlczsKKyAgICBpZiAoZmZpX3RyYW1wb2xpbmVfdGFibGVzICE9IE5VTEwpCisgICAgICBmZmlfdHJhbXBvbGluZV90YWJsZXMtPnByZXYgPSB0YWJsZTsKKworICAgIGZmaV90cmFtcG9saW5lX3RhYmxlcyA9IHRhYmxlOworICB9CisKKyAgcHRocmVhZF9tdXRleF91bmxvY2sgKCZmZmlfdHJhbXBvbGluZV9sb2NrKTsKKworICAvKiBGcmVlIHRoZSBjbG9zdXJlICovCisgIGZyZWUgKGNsb3N1cmUpOworfQorCisjZWxzZQorCisjZGVmaW5lIEZGSV9JTklUX1RSQU1QT0xJTkUoVFJBTVAsRlVOLENUWCkJCQkJXAorKHsgdW5zaWduZWQgY2hhciAqX190cmFtcCA9ICh1bnNpZ25lZCBjaGFyKikoVFJBTVApOwkJCVwKKyAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOwkJCQlcCisgICB1bnNpZ25lZCBpbnQgIF9fY3R4ID0gKHVuc2lnbmVkIGludCkoQ1RYKTsJCQkJXAorICAgdW5zaWduZWQgY2hhciAqaW5zbnMgPSAodW5zaWduZWQgY2hhciAqKShDVFgpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKih1bnNpZ25lZCBpbnQqKSAmX190cmFtcFswXSA9IDB4ZTkyZDAwMGY7IC8qIHN0bWZkIHNwISwge3IwLXIzfSAqLwlcCisgICAqKHVuc2lnbmVkIGludCopICZfX3RyYW1wWzRdID0gMHhlNTlmMDAwMDsgLyogbGRyIHIwLCBbcGNdICovCVwKKyAgICoodW5zaWduZWQgaW50KikgJl9fdHJhbXBbOF0gPSAweGU1OWZmMDAwOyAvKiBsZHIgcGMsIFtwY10gKi8JXAorICAgKih1bnNpZ25lZCBpbnQqKSAmX190cmFtcFsxMl0gPSBfX2N0eDsJCQkJXAorICAgKih1bnNpZ25lZCBpbnQqKSAmX190cmFtcFsxNl0gPSBfX2Z1bjsJCQkJXAorICAgX19jbGVhcl9jYWNoZSgoJl9fdHJhbXBbMF0pLCAoJl9fdHJhbXBbMTldKSk7IC8qIENsZWFyIGRhdGEgbWFwcGluZy4gICovIFwKKyAgIF9fY2xlYXJfY2FjaGUoaW5zbnMsIGluc25zICsgMyAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciBpbnN0cnVjdGlvbiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLiAgKi8gICAgICAgIFwKKyB9KQorCisjZW5kaWYKKworLyogdGhlIGNpZiBtdXN0IGFscmVhZHkgYmUgcHJlcCdlZCAqLworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqIGNsb3N1cmUsCisJCSAgICAgIGZmaV9jaWYqIGNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkgICAgICB2b2lkICpjb2RlbG9jKQoreworICB2b2lkICgqY2xvc3VyZV9mdW5jKShmZmlfY2xvc3VyZSopID0gTlVMTDsKKworICBpZiAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpCisgICAgY2xvc3VyZV9mdW5jID0gJmZmaV9jbG9zdXJlX1NZU1Y7CisgIGVsc2UgaWYgKGNpZi0+YWJpID09IEZGSV9WRlApCisgICAgY2xvc3VyZV9mdW5jID0gJmZmaV9jbG9zdXJlX1ZGUDsKKyAgZWxzZQorICAgIHJldHVybiBGRklfQkFEX0FCSTsKKyAgICAKKyNpZiBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFCisgIHZvaWQgKipjb25maWcgPSBGRklfVFJBTVBPTElORV9DT0RFTE9DX0NPTkZJRyhjb2RlbG9jKTsKKyAgY29uZmlnWzBdID0gY2xvc3VyZTsKKyAgY29uZmlnWzFdID0gY2xvc3VyZV9mdW5jOworI2Vsc2UKKyAgRkZJX0lOSVRfVFJBTVBPTElORSAoJmNsb3N1cmUtPnRyYW1wWzBdLCBcCisJCSAgICAgICBjbG9zdXJlX2Z1bmMsICBcCisJCSAgICAgICBjb2RlbG9jKTsKKyNlbmRpZgorCisgIGNsb3N1cmUtPmNpZiAgPSBjaWY7CisgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgY2xvc3VyZS0+ZnVuICA9IGZ1bjsKKworICByZXR1cm4gRkZJX09LOworfQorCisvKiBCZWxvdyBhcmUgcm91dGluZXMgZm9yIFZGUCBoYXJkLWZsb2F0IHN1cHBvcnQuICovCisKK3N0YXRpYyBpbnQgcmVjX3ZmcF90eXBlX3AgKGZmaV90eXBlICp0LCBpbnQgKmVsdCwgaW50ICplbG51bSkKK3sKKyAgc3dpdGNoICh0LT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorICAgICAgKmVsdCA9IChpbnQpIHQtPnR5cGU7CisgICAgICAqZWxudW0gPSAxOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVF9WRlBfRkxPQVQ6CisgICAgICAqZWx0ID0gRkZJX1RZUEVfRkxPQVQ7CisgICAgICAqZWxudW0gPSB0LT5zaXplIC8gc2l6ZW9mIChmbG9hdCk7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUX1ZGUF9ET1VCTEU6CisgICAgICAqZWx0ID0gRkZJX1RZUEVfRE9VQkxFOworICAgICAgKmVsbnVtID0gdC0+c2l6ZSAvIHNpemVvZiAoZG91YmxlKTsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6OworICAgICAgeworCWludCBiYXNlX2VsdCA9IDAsIHRvdGFsX2VsbnVtID0gMDsKKwlmZmlfdHlwZSAqKmVsID0gdC0+ZWxlbWVudHM7CisJd2hpbGUgKCplbCkKKwkgIHsKKwkgICAgaW50IGVsX2VsdCA9IDAsIGVsX2VsbnVtID0gMDsKKwkgICAgaWYgKCEgcmVjX3ZmcF90eXBlX3AgKCplbCwgJmVsX2VsdCwgJmVsX2VsbnVtKQorCQl8fCAoYmFzZV9lbHQgJiYgYmFzZV9lbHQgIT0gZWxfZWx0KQorCQl8fCB0b3RhbF9lbG51bSArIGVsX2VsbnVtID4gNCkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgYmFzZV9lbHQgPSBlbF9lbHQ7CisJICAgIHRvdGFsX2VsbnVtICs9IGVsX2VsbnVtOworCSAgICBlbCsrOworCSAgfQorCSplbG51bSA9IHRvdGFsX2VsbnVtOworCSplbHQgPSBiYXNlX2VsdDsKKwlyZXR1cm4gMTsKKyAgICAgIH0KKyAgICBkZWZhdWx0OiA7CisgICAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZnBfdHlwZV9wIChmZmlfdHlwZSAqdCkKK3sKKyAgaW50IGVsdCwgZWxudW07CisgIGlmIChyZWNfdmZwX3R5cGVfcCAodCwgJmVsdCwgJmVsbnVtKSkKKyAgICB7CisgICAgICBpZiAodC0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisJeworCSAgaWYgKGVsbnVtID09IDEpCisJICAgIHQtPnR5cGUgPSBlbHQ7CisJICBlbHNlCisJICAgIHQtPnR5cGUgPSAoZWx0ID09IEZGSV9UWVBFX0ZMT0FUCisJCSAgICAgICA/IEZGSV9UWVBFX1NUUlVDVF9WRlBfRkxPQVQKKwkJICAgICAgIDogRkZJX1RZUEVfU1RSVUNUX1ZGUF9ET1VCTEUpOworCX0KKyAgICAgIHJldHVybiAoaW50KSB0LT50eXBlOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBsYWNlX3ZmcF9hcmcgKGZmaV9jaWYgKmNpZiwgZmZpX3R5cGUgKnQpCit7CisgIGludCByZWcgPSBjaWYtPnZmcF9yZWdfZnJlZTsKKyAgaW50IG5yZWdzID0gdC0+c2l6ZSAvIHNpemVvZiAoZmxvYXQpOworICBpbnQgYWxpZ24gPSAoKHQtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUX1ZGUF9GTE9BVAorCQl8fCB0LT50eXBlID09IEZGSV9UWVBFX0ZMT0FUKSA/IDEgOiAyKTsKKyAgLyogQWxpZ24gcmVnaXN0ZXIgbnVtYmVyLiAqLworICBpZiAoKHJlZyAmIDEpICYmIGFsaWduID09IDIpCisgICAgcmVnKys7CisgIHdoaWxlIChyZWcgKyBucmVncyA8PSAxNikKKyAgICB7CisgICAgICBpbnQgcywgbmV3X3VzZWQgPSAwOworICAgICAgZm9yIChzID0gcmVnOyBzIDwgcmVnICsgbnJlZ3M7IHMrKykKKwl7CisJICBuZXdfdXNlZCB8PSAoMSA8PCBzKTsKKwkgIGlmIChjaWYtPnZmcF91c2VkICYgKDEgPDwgcykpCisJICAgIHsKKwkgICAgICByZWcgKz0gYWxpZ247CisJICAgICAgZ290byBuZXh0X3JlZzsKKwkgICAgfQorCX0KKyAgICAgIC8qIEZvdW5kIHJlZ3MgdG8gYWxsb2NhdGUuICovCisgICAgICBjaWYtPnZmcF91c2VkIHw9IG5ld191c2VkOworICAgICAgY2lmLT52ZnBfYXJnc1tjaWYtPnZmcF9uYXJncysrXSA9IHJlZzsKKworICAgICAgLyogVXBkYXRlIHZmcF9yZWdfZnJlZS4gKi8KKyAgICAgIGlmIChjaWYtPnZmcF91c2VkICYgKDEgPDwgY2lmLT52ZnBfcmVnX2ZyZWUpKQorCXsKKwkgIHJlZyArPSBucmVnczsKKwkgIHdoaWxlIChjaWYtPnZmcF91c2VkICYgKDEgPDwgcmVnKSkKKwkgICAgcmVnICs9IDE7CisJICBjaWYtPnZmcF9yZWdfZnJlZSA9IHJlZzsKKwl9CisgICAgICByZXR1cm47CisgICAgbmV4dF9yZWc6IDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxheW91dF92ZnBfYXJncyAoZmZpX2NpZiAqY2lmKQoreworICBpbnQgaTsKKyAgLyogSW5pdCBWRlAgZmllbGRzICovCisgIGNpZi0+dmZwX3VzZWQgPSAwOworICBjaWYtPnZmcF9uYXJncyA9IDA7CisgIGNpZi0+dmZwX3JlZ19mcmVlID0gMDsKKyAgbWVtc2V0IChjaWYtPnZmcF9hcmdzLCAtMSwgMTYpOyAvKiBJbml0IHRvIC0xLiAqLworCisgIGZvciAoaSA9IDA7IGkgPCBjaWYtPm5hcmdzOyBpKyspCisgICAgeworICAgICAgZmZpX3R5cGUgKnQgPSBjaWYtPmFyZ190eXBlc1tpXTsKKyAgICAgIGlmICh2ZnBfdHlwZV9wICh0KSkKKwlwbGFjZV92ZnBfYXJnIChjaWYsIHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXJtL2ZmaXRhcmdldC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hcm0vZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNWIyMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXJtL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCBDb2RlU291cmNlcnkKKworICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBBUk0uCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKKyNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICisKKyNpZm5kZWYgTElCRkZJX0FTTQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7Cit0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CisKK3R5cGVkZWYgZW51bSBmZmlfYWJpIHsKKyAgRkZJX0ZJUlNUX0FCSSA9IDAsCisgIEZGSV9TWVNWLAorICBGRklfVkZQLAorICBGRklfTEFTVF9BQkksCisjaWZkZWYgX19BUk1fUENTX1ZGUAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfVkZQLAorI2Vsc2UKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YsCisjZW5kaWYKK30gZmZpX2FiaTsKKyNlbmRpZgorCisjZGVmaW5lIEZGSV9FWFRSQV9DSUZfRklFTERTCQkJXAorICBpbnQgdmZwX3VzZWQ7CQkJCQlcCisgIHNob3J0IHZmcF9yZWdfZnJlZSwgdmZwX25hcmdzOwkJXAorICBzaWduZWQgY2hhciB2ZnBfYXJnc1sxNl0JCQlcCisKKy8qIEludGVybmFsbHkgdXNlZC4gKi8KKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX1ZGUF9GTE9BVCAgKEZGSV9UWVBFX0xBU1QgKyAxKQorI2RlZmluZSBGRklfVFlQRV9TVFJVQ1RfVkZQX0RPVUJMRSAoRkZJX1RZUEVfTEFTVCArIDIpCisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIGNsb3N1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRkZJX0NMT1NVUkVTIDEKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAyMAorI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hcm0vZ2VudHJhbXAuc2ggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2FybS9nZW50cmFtcC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGYwYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hcm0vZ2VudHJhbXAuc2gKQEAgLTAsMCArMSwxMTggQEAKKyMhL2Jpbi9zaAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICBnZW50cmFtcC5zaCAtIENvcHlyaWdodCAoYykgMjAxMCwgUGxhdXNpYmxlIExhYnMgQ29vcGVyYXRpdmUsIEluYy4KKyMgIAorIyAgQVJNIFRyYW1wb2xpbmUgUGFnZSBHZW5lcmF0b3IKKyMKKyMgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyMgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorIyAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisjICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyMgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorIyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorIyAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUFJPR05BTUU9JDAKKworIyBFYWNoIHRyYW1wb2xpbmUgaXMgZXhhY3RseSAzIGluc3RydWN0aW9ucywgb3IgMTIgYnl0ZXMuIElmIGFueSBvZiB0aGVzZSB2YWx1ZXMgY2hhbmdlLAorIyB0aGUgZW50aXJlIGFybSB0cmFtcG9saW5lIGltcGxlbWVudGF0aW9uIG11c3QgYmUgdXBkYXRlZCB0byBtYXRjaCwgdG9vLgorCisjIFNpemUgb2YgYW4gaW5kaXZpZHVhbCB0cmFtcG9saW5lLCBpbiBieXRlcworVFJBTVBPTElORV9TSVpFPTEyCisKKyMgUGFnZSBzaXplLCBpbiBieXRlcworUEFHRV9TSVpFPTQwOTYKKworIyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSByZWFjaGFibGUgY29uZmlnIHBhZ2U7IFRoZSBmaXJzdCAxNiBieXRlcyBvZiB0aGUgY29uZmlnIHBhZ2UKKyMgYXJlIHVucmVhY2hhYmxlIGR1ZSB0byBvdXIgbWF4aW11bSBwYy1yZWxhdGl2ZSBsZHIgb2Zmc2V0LgorUEFHRV9BVkFJTD1gZXhwciAkUEFHRV9TSVpFIC0gMTZgCisKKyMgQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIG9mIGF2YWlsYWJsZSB0cmFtcG9saW5lcy4gCitUUkFNUE9MSU5FX0NPVU5UPWBleHByICRQQUdFX0FWQUlMIC8gJFRSQU1QT0xJTkVfU0laRWAKKworaGVhZGVyICgpIHsKKyAgICBlY2hvICIjIEdFTkVSQVRFRCBDT0RFIC0gRE8gTk9UIEVESVQiCisgICAgZWNobyAiIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkUFJPR05BTUUiCisgICAgZWNobyAiIgorCisgICAgIyBXcml0ZSBvdXQgdGhlIGxpY2Vuc2UgaGVhZGVyCitjYXQgPDwgRU9GCisjICBDb3B5cmlnaHQgKGMpIDIwMTAsIFBsYXVzaWJsZSBMYWJzIENvb3BlcmF0aXZlLCBJbmMuCisjICAKKyMgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyMgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorIyAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisjICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyMgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorIyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorIyAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRU9GCisKKyAgICAjIFdyaXRlIG91dCB0aGUgdHJhbXBvbGluZSB0YWJsZSwgYWxpZ25lZCB0byB0aGUgcGFnZSBib3VuZGFyeQorICAgIGVjaG8gIi50ZXh0IgorICAgIGVjaG8gIi5hbGlnbiAxMiIKKyAgICBlY2hvICIuZ2xvYmwgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGVfcGFnZSIKKyAgICBlY2hvICJfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZV9wYWdlOiIKK30KKworCisjIFdBUk5JTkcgLSBEb24ndCBtb2RpZnkgdGhlIHRyYW1wb2xpbmUgY29kZSBzaXplIHdpdGhvdXQgYWxzbyB1cGRhdGluZyB0aGUgcmVsZXZlbnQgbGliZmZpIGNvZGUKK3RyYW1wb2xpbmUgKCkgeworICAgIGNhdCA8PCBFTkQKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCitFTkQKK30KKworbWFpbiAoKSB7CisgICAgIyBXcml0ZSBvdXQgdGhlIGhlYWRlcgorICAgIGhlYWRlcgorCisgICAgIyBXcml0ZSBvdXQgdGhlIHRyYW1wb2xpbmVzCisgICAgbG9jYWwgaT0wCisgICAgd2hpbGUgWyAkaSAtbHQgJHtUUkFNUE9MSU5FX0NPVU5UfSBdOyBkbworICAgICAgICB0cmFtcG9saW5lCisgICAgICAgIGxvY2FsIGk9YGV4cHIgJGkgKyAxYAorICAgIGRvbmUKK30KKworbWFpbgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hcm0vc3lzdi5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hcm0vc3lzdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTdmMDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2FybS9zeXN2LlMKQEAgLTAsMCArMSw0OTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzeXN2LlMgLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDgsIDIwMTEgUmVkIEhhdCwgSW5jLgorCSAgICBDb3B5cmlnaHQgKGMpIDIwMTEgUGxhdXNpYmxlIExhYnMgQ29vcGVyYXRpdmUsIEluYy4KKyAgIAorICAgQVJNIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00JCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisjaWZkZWYgSEFWRV9NQUNISU5FX0FTTV9ICisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKyNlbHNlCisjaWZkZWYgX19VU0VSX0xBQkVMX1BSRUZJWF9fCisjZGVmaW5lIENPTkNBVDEoYSwgYikgQ09OQ0FUMihhLCBiKQorI2RlZmluZSBDT05DQVQyKGEsIGIpIGEgIyMgYgorCisvKiBVc2UgdGhlIHJpZ2h0IHByZWZpeCBmb3IgZ2xvYmFsIGxhYmVscy4gICovCisjZGVmaW5lIENOQU1FKHgpIENPTkNBVDEgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgeCkKKyNlbHNlCisjZGVmaW5lIENOQU1FKHgpIHgKKyNlbmRpZgorI2lmZGVmIF9fQVBQTEVfXworI2RlZmluZSBFTlRSWSh4KSAuZ2xvYmwgQ05BTUUoeCk7IENOQU1FKHgpOgorI2Vsc2UKKyNkZWZpbmUgRU5UUlkoeCkgLmdsb2JsIENOQU1FKHgpOyAudHlwZSBDTkFNRSh4KSwlZnVuY3Rpb247IENOQU1FKHgpOgorI2VuZGlmIC8qIF9fQVBQTEVfXyAqLworI2VuZGlmCisKKyNpZmRlZiBfX0VMRl9fCisjZGVmaW5lIExTWU0oeCkgLngKKyNlbHNlCisjZGVmaW5lIExTWU0oeCkgeAorI2VuZGlmCisKKy8qIFVzZSB0aGUgU09GVEZQIHJldHVybiB2YWx1ZSBBQkkgb24gTWFjIE9TIFgsIGFzIHBlciB0aGUgaU9TIEFCSQorICBGdW5jdGlvbiBDYWxsIEd1aWRlICovCisjaWZkZWYgX19BUFBMRV9fCisjZGVmaW5lIF9fU09GVEZQX18KKyNlbmRpZgorCisvKiBXZSBuZWVkIGEgYmV0dGVyIHdheSBvZiB0ZXN0aW5nIGZvciB0aGlzLCBidXQgZm9yIG5vdywgdGhpcyBpcyBhbGwgCisgICB3ZSBjYW4gZG8uICAqLworQCBUaGlzIHNlbGVjdHMgdGhlIG1pbmltdW0gYXJjaGl0ZWN0dXJlIGxldmVsIHJlcXVpcmVkLgorI2RlZmluZSBfX0FSTV9BUkNIX18gMworCisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzRfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pCisjIHVuZGVmIF9fQVJNX0FSQ0hfXworIyBkZWZpbmUgX19BUk1fQVJDSF9fIDQKKyNlbmRpZgorICAgICAgICAKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykgXAorCXx8IGRlZmluZWQoX19BUk1fQVJDSF81RV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIFwKKwl8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFSl9fKQorIyB1bmRlZiBfX0FSTV9BUkNIX18KKyMgZGVmaW5lIF9fQVJNX0FSQ0hfXyA1CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Sl9fKSBcCisgICAgICAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82S19fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpfXykgXAorICAgICAgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpLX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgXAorCXx8IGRlZmluZWQoX19BUk1fQVJDSF82TV9fKQorIyB1bmRlZiBfX0FSTV9BUkNIX18KKyMgZGVmaW5lIF9fQVJNX0FSQ0hfXyA2CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF83X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83QV9fKSBcCisgICAgICAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF83Ul9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN01fXykgXAorCXx8IGRlZmluZWQoX19BUk1fQVJDSF83RU1fXykKKyMgdW5kZWYgX19BUk1fQVJDSF9fCisjIGRlZmluZSBfX0FSTV9BUkNIX18gNworI2VuZGlmCisKKyNpZiBfX0FSTV9BUkNIX18gPj0gNQorIyBkZWZpbmUgY2FsbF9yZWcoeCkJYmx4CXgKKyNlbGlmIGRlZmluZWQgKF9fQVJNX0FSQ0hfNFRfXykKKyMgZGVmaW5lIGNhbGxfcmVnKHgpCW1vdglsciwgcGMgOyBieAl4CisjIGlmIGRlZmluZWQoX190aHVtYl9fKSB8fCBkZWZpbmVkKF9fVEhVTUJfSU5URVJXT1JLX18pCisjICBkZWZpbmUgX19JTlRFUldPUktJTkdfXworIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIGNhbGxfcmVnKHgpCW1vdglsciwgcGMgOyBtb3YJcGMsIHgKKyNlbmRpZgorCisvKiBDb25kaXRpb25hbGx5IGNvbXBpbGUgdW53aW5kZXIgZGlyZWN0aXZlcy4gICovCisjaWZkZWYgX19BUk1fRUFCSV9fCisjZGVmaW5lIFVOV0lORAorI2Vsc2UKKyNkZWZpbmUgVU5XSU5EIEAKKyNlbmRpZgkKKworCQorI2lmIGRlZmluZWQoX190aHVtYl9fKSAmJiAhZGVmaW5lZChfX1RIVU1CX0lOVEVSV09SS19fKQorLm1hY3JvCUFSTV9GVU5DX1NUQVJUIG5hbWUKKwkudGV4dAorCS5hbGlnbiAwCisJLnRodW1iCisJLnRodW1iX2Z1bmMKKyNpZmRlZiBfX0FQUExFX18KKwlFTlRSWSgkMCkKKyNlbHNlCisJRU5UUlkoXG5hbWUpCisjZW5kaWYKKwlieAlwYworCW5vcAorCS5hcm0KKwlVTldJTkQgLmZuc3RhcnQKKy8qIEEgaG9vayB0byB0ZWxsIGdkYiB0aGF0IHdlJ3ZlIHN3aXRjaGVkIHRvIEFSTSBtb2RlLiAgQWxzbyB1c2VkIHRvIGNhbGwKKyAgIGRpcmVjdGx5IGZyb20gb3RoZXIgbG9jYWwgYXJtIHJvdXRpbmVzLiAgKi8KKyNpZmRlZiBfX0FQUExFX18KK19MX18kMDoKKyNlbHNlCitfTF9fXG5hbWU6CisjZW5kaWYKKy5lbmRtCisjZWxzZQorLm1hY3JvCUFSTV9GVU5DX1NUQVJUIG5hbWUKKwkudGV4dAorCS5hbGlnbiAwCisJLmFybQorI2lmZGVmIF9fQVBQTEVfXworCUVOVFJZKCQwKQorI2Vsc2UKKwlFTlRSWShcbmFtZSkKKyNlbmRpZgorCVVOV0lORCAuZm5zdGFydAorLmVuZG0KKyNlbmRpZgorCisubWFjcm8JUkVUTERNCXJlZ3M9LCBjb25kPSwgZGlybj1pYQorI2lmIGRlZmluZWQgKF9fSU5URVJXT1JLSU5HX18pCisJLmlmYyAiXHJlZ3MiLCIiCisJbGRyXGNvbmQJbHIsIFtzcF0sICM0CisJLmVsc2UKKwlsZG1cY29uZFxkaXJuCXNwISwge1xyZWdzLCBscn0KKwkuZW5kaWYKKwlieFxjb25kCWxyCisjZWxzZQorCS5pZmMgIlxyZWdzIiwiIgorCWxkclxjb25kCXBjLCBbc3BdLCAjNAorCS5lbHNlCisJbGRtXGNvbmRcZGlybglzcCEsIHtccmVncywgcGN9CisJLmVuZGlmCisjZW5kaWYKKy5lbmRtCisKKwlAIHIwOiAgIGZmaV9wcmVwX2FyZ3MKKwlAIHIxOiAgICZlY2lmCisJQCByMjogICBjaWYtPmJ5dGVzCisJQCByMzogICBmaWctPmZsYWdzCisJQCBzcCswOiBlY2lmLnJ2YWx1ZQorCisJQCBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KK0FSTV9GVU5DX1NUQVJUIGZmaV9jYWxsX1NZU1YKKwlAIFNhdmUgcmVnaXN0ZXJzCisgICAgICAgIHN0bWZkCXNwISwge3IwLXIzLCBmcCwgbHJ9CisJVU5XSU5EIC5zYXZlCXtyMC1yMywgZnAsIGxyfQorCW1vdglmcCwgc3AKKworCVVOV0lORCAuc2V0ZnAJZnAsIHNwCisKKwlAIE1ha2Ugcm9vbSBmb3IgYWxsIG9mIHRoZSBuZXcgYXJncy4KKwlzdWIJc3AsIGZwLCByMgorCisJQCBQbGFjZSBhbGwgb2YgdGhlIGZmaV9wcmVwX2FyZ3MgaW4gcG9zaXRpb24KKwltb3YJcjAsIHNwCisJQCAgICAgcjEgYWxyZWFkeSBzZXQKKworCUAgQ2FsbCBmZmlfcHJlcF9hcmdzKHN0YWNrLCAmZWNpZikKKwlibAlmZmlfcHJlcF9hcmdzCisKKwlAIG1vdmUgZmlyc3QgNCBwYXJhbWV0ZXJzIGluIHJlZ2lzdGVycworCWxkbWlhCXNwLCB7cjAtcjN9CisKKwlAIGFuZCBhZGp1c3Qgc3RhY2sKKwlzdWIJbHIsIGZwLCBzcAlAIGNpZi0+Ynl0ZXMgPT0gZnAgLSBzcAorCWxkcglpcCwgW2ZwXQlAIGxvYWQgZm4oKSBpbiBhZHZhbmNlCisJY21wCWxyLCAjMTYKKwltb3ZocwlsciwgIzE2CisJYWRkCXNwLCBzcCwgbHIKKworCUAgY2FsbCAoZm4pICguLi4pCisJY2FsbF9yZWcoaXApCisJCisJQCBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MKKwltb3YJc3AsIGZwCisKKwlAIExvYWQgcjIgd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisJbGRyCXIyLCBbc3AsICMyNF0KKworCUAgTG9hZCByMyB3aXRoIHRoZSByZXR1cm4gdHlwZSBjb2RlIAorCWxkcglyMywgW3NwLCAjMTJdCisKKwlAIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgorCWNtcAlyMiwgIzAKKwliZXEJTFNZTShMZXBpbG9ndWUpCisKK0AgcmV0dXJuIElOVAorCWNtcAlyMywgI0ZGSV9UWVBFX0lOVAorI2lmIGRlZmluZWQoX19TT0ZURlBfXykgfHwgZGVmaW5lZChfX0FSTV9FQUJJX18pCisJY21wbmUJcjMsICNGRklfVFlQRV9GTE9BVAorI2VuZGlmCisJc3RyZXEJcjAsIFtyMl0KKwliZXEJTFNZTShMZXBpbG9ndWUpCisKKwlAIHJldHVybiBJTlQ2NAorCWNtcAlyMywgI0ZGSV9UWVBFX1NJTlQ2NAorI2lmIGRlZmluZWQoX19TT0ZURlBfXykgfHwgZGVmaW5lZChfX0FSTV9FQUJJX18pCisJY21wbmUJcjMsICNGRklfVFlQRV9ET1VCTEUKKyNlbmRpZgorCXN0bWVxaWEJcjIsIHtyMCwgcjF9CisKKyNpZiAhZGVmaW5lZChfX1NPRlRGUF9fKSAmJiAhZGVmaW5lZChfX0FSTV9FQUJJX18pCisJYmVxCUxTWU0oTGVwaWxvZ3VlKQorCitAIHJldHVybiBGTE9BVAorCWNtcAlyMywgI0ZGSV9UWVBFX0ZMT0FUCisJc3RmZXFzCWYwLCBbcjJdCisJYmVxCUxTWU0oTGVwaWxvZ3VlKQorCitAIHJldHVybiBET1VCTEUgb3IgTE9OR0RPVUJMRQorCWNtcAlyMywgI0ZGSV9UWVBFX0RPVUJMRQorCXN0ZmVxZAlmMCwgW3IyXQorI2VuZGlmCisKK0xTWU0oTGVwaWxvZ3VlKToKKyNpZiBkZWZpbmVkIChfX0lOVEVSV09SS0lOR19fKQorCWxkbWlhICAgc3AhLCB7cjAtcjMsZnAsIGxyfQorCWJ4CWxyCisjZWxzZQorCWxkbWlhICAgc3AhLCB7cjAtcjMsZnAsIHBjfQorI2VuZGlmCisKKy5mZmlfY2FsbF9TWVNWX2VuZDoKKwlVTldJTkQgLmZuZW5kCisjaWZkZWYgX19FTEZfXworICAgICAgICAuc2l6ZSAgICBDTkFNRShmZmlfY2FsbF9TWVNWKSwuZmZpX2NhbGxfU1lTVl9lbmQtQ05BTUUoZmZpX2NhbGxfU1lTVikKKyNlbmRpZgorCisKKy8qCisJdW5zaWduZWQgaW50IEZGSV9ISURERU4KKwlmZmlfY2xvc3VyZV9TWVNWX2lubmVyIChjbG9zdXJlLCByZXNwcCwgYXJncykKKwkgICAgIGZmaV9jbG9zdXJlICpjbG9zdXJlOworCSAgICAgdm9pZCAqKnJlc3BwOworICAJICAgICB2b2lkICphcmdzOworKi8KKworQVJNX0ZVTkNfU1RBUlQgZmZpX2Nsb3N1cmVfU1lTVgorCVVOV0lORCAucGFkICMxNgorCWFkZAlpcCwgc3AsICMxNgorCXN0bWZkCXNwISwge2lwLCBscn0KKwlVTldJTkQgLnNhdmUJe3IwLCBscn0KKwlhZGQJcjIsIHNwLCAjOAorCVVOV0lORCAucGFkICMxNgorCXN1YglzcCwgc3AsICMxNgorCXN0cglzcCwgW3NwLCAjOF0KKwlhZGQJcjEsIHNwLCAjOAorCWJsCUNOQU1FKGZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIpCisJY21wCXIwLCAjRkZJX1RZUEVfSU5UCisJYmVxCS5McmV0aW50CisKKwljbXAJcjAsICNGRklfVFlQRV9GTE9BVAorI2lmIGRlZmluZWQoX19TT0ZURlBfXykgfHwgZGVmaW5lZChfX0FSTV9FQUJJX18pCisJYmVxCS5McmV0aW50CisjZWxzZQorCWJlcQkuTHJldGZsb2F0CisjZW5kaWYKKworCWNtcAlyMCwgI0ZGSV9UWVBFX0RPVUJMRQorI2lmIGRlZmluZWQoX19TT0ZURlBfXykgfHwgZGVmaW5lZChfX0FSTV9FQUJJX18pCisJYmVxCS5McmV0bG9uZ2xvbmcKKyNlbHNlCisJYmVxCS5McmV0ZG91YmxlCisjZW5kaWYKKworCWNtcAlyMCwgI0ZGSV9UWVBFX0xPTkdET1VCTEUKKyNpZiBkZWZpbmVkKF9fU09GVEZQX18pIHx8IGRlZmluZWQoX19BUk1fRUFCSV9fKQorCWJlcQkuTHJldGxvbmdsb25nCisjZWxzZQorCWJlcQkuTHJldGxvbmdkb3VibGUKKyNlbmRpZgorCisJY21wCXIwLCAjRkZJX1RZUEVfU0lOVDY0CisJYmVxCS5McmV0bG9uZ2xvbmcKKy5MY2xvc3VyZV9lcGlsb2d1ZToKKwlhZGQJc3AsIHNwLCAjMTYKKwlsZG1mZAlzcCwge3NwLCBwY30KKy5McmV0aW50OgorCWxkcglyMCwgW3NwXQorCWIJLkxjbG9zdXJlX2VwaWxvZ3VlCisuTHJldGxvbmdsb25nOgorCWxkcglyMCwgW3NwXQorCWxkcglyMSwgW3NwLCAjNF0KKwliCS5MY2xvc3VyZV9lcGlsb2d1ZQorCisjaWYgIWRlZmluZWQoX19TT0ZURlBfXykgJiYgIWRlZmluZWQoX19BUk1fRUFCSV9fKQorLkxyZXRmbG9hdDoKKwlsZGZzCWYwLCBbc3BdCisJYgkuTGNsb3N1cmVfZXBpbG9ndWUKKy5McmV0ZG91YmxlOgorCWxkZmQJZjAsIFtzcF0KKwliCS5MY2xvc3VyZV9lcGlsb2d1ZQorLkxyZXRsb25nZG91YmxlOgorCWxkZmQJZjAsIFtzcF0KKwliCS5MY2xvc3VyZV9lcGlsb2d1ZQorI2VuZGlmCisKKy5mZmlfY2xvc3VyZV9TWVNWX2VuZDoKKwlVTldJTkQgLmZuZW5kCisjaWZkZWYgX19FTEZfXworICAgICAgICAuc2l6ZSAgICBDTkFNRShmZmlfY2xvc3VyZV9TWVNWKSwuZmZpX2Nsb3N1cmVfU1lTVl9lbmQtQ05BTUUoZmZpX2Nsb3N1cmVfU1lTVikKKyNlbmRpZgorCisKKy8qIEJlbG93IGFyZSBWRlAgaGFyZC1mbG9hdCBBQkkgY2FsbCBhbmQgY2xvc3VyZSBpbXBsZW1lbnRhdGlvbnMuCisgICBBZGQgVkZQIEZQVSBkaXJlY3RpdmUgaGVyZS4gKi8KKwkuZnB1CXZmcAorCisJQCByMDogICBmbgorCUAgcjE6ICAgJmVjaWYKKwlAIHIyOiAgIGNpZi0+Ynl0ZXMKKwlAIHIzOiAgIGZpZy0+ZmxhZ3MKKwlAIHNwKzA6IGVjaWYucnZhbHVlCisKK0FSTV9GVU5DX1NUQVJUIGZmaV9jYWxsX1ZGUAorCUAgU2F2ZSByZWdpc3RlcnMKKyAgICAgICAgc3RtZmQJc3AhLCB7cjAtcjMsIGZwLCBscn0KKwlVTldJTkQgLnNhdmUJe3IwLXIzLCBmcCwgbHJ9CisJbW92CWZwLCBzcAorCVVOV0lORCAuc2V0ZnAJZnAsIHNwCisKKwlAIE1ha2Ugcm9vbSBmb3IgYWxsIG9mIHRoZSBuZXcgYXJncy4KKwlzdWIJc3AsIHNwLCByMgorCisJQCBNYWtlIHJvb20gZm9yIGxvYWRpbmcgVkZQIGFyZ3MKKwlzdWIJc3AsIHNwLCAjNjQKKworCUAgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCisJbW92CXIwLCBzcAorCUAgICAgIHIxIGFscmVhZHkgc2V0CisJc3ViCXIyLCBmcCwgIzY0ICAgQCBWRlAgc2NyYXRjaCBzcGFjZQorCisJQCBDYWxsIGZmaV9wcmVwX2FyZ3Moc3RhY2ssICZlY2lmLCB2ZnBfc3BhY2UpCisJYmwJZmZpX3ByZXBfYXJncworCisJQCBMb2FkIFZGUCByZWdpc3RlciBhcmdzIGlmIG5lZWRlZAorCWNtcAlyMCwgIzAKKwliZXEJTFNZTShMYmFzZV9hcmdzKQorCisJQCBMb2FkIG9ubHkgZDAgaWYgcG9zc2libGUKKwljbXAJcjAsICMzCisJc3ViCWlwLCBmcCwgIzY0CisJZmxkZGxlCWQwLCBbaXBdCisJZmxkbWlhZGd0CWlwLCB7ZDAtZDd9CisKK0xTWU0oTGJhc2VfYXJncyk6CisJQCBtb3ZlIGZpcnN0IDQgcGFyYW1ldGVycyBpbiByZWdpc3RlcnMKKwlsZG1pYQlzcCwge3IwLXIzfQorCisJQCBhbmQgYWRqdXN0IHN0YWNrCisJc3ViCWxyLCBpcCwgc3AJQCBjaWYtPmJ5dGVzID09IChmcCAtIDY0KSAtIHNwCisJbGRyCWlwLCBbZnBdCUAgbG9hZCBmbigpIGluIGFkdmFuY2UKKyAgICAgICAgY21wCWxyLCAjMTYKKwltb3ZocwlsciwgIzE2CisgICAgICAgIGFkZAlzcCwgc3AsIGxyCisKKwlAIGNhbGwgKGZuKSAoLi4uKQorCWNhbGxfcmVnKGlwKQorCisJQCBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MKKwltb3YJc3AsIGZwCisKKwlAIExvYWQgcjIgd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvcgorCUAgdGhlIHJldHVybiB2YWx1ZQorCWxkcglyMiwgW3NwLCAjMjRdCisKKwlAIExvYWQgcjMgd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZSAKKwlsZHIJcjMsIFtzcCwgIzEyXQorCisJQCBJZiB0aGUgcmV0dXJuIHZhbHVlIHBvaW50ZXIgaXMgTlVMTCwKKwlAIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCisJY21wCXIyLCAjMAorCWJlcQlMU1lNKExlcGlsb2d1ZV92ZnApCisKKwljbXAJcjMsICNGRklfVFlQRV9JTlQKKwlzdHJlcQlyMCwgW3IyXQorCWJlcQlMU1lNKExlcGlsb2d1ZV92ZnApCisKKwljbXAJcjMsICNGRklfVFlQRV9TSU5UNjQKKwlzdG1lcWlhCXIyLCB7cjAsIHIxfQorCWJlcQlMU1lNKExlcGlsb2d1ZV92ZnApCisKKwljbXAJcjMsICNGRklfVFlQRV9GTE9BVAorCWZzdHNlcQlzMCwgW3IyXQorCWJlcQlMU1lNKExlcGlsb2d1ZV92ZnApCisJCisJY21wCXIzLCAjRkZJX1RZUEVfRE9VQkxFCisJZnN0ZGVxCWQwLCBbcjJdCisJYmVxCUxTWU0oTGVwaWxvZ3VlX3ZmcCkKKworCWNtcAlyMywgI0ZGSV9UWVBFX1NUUlVDVF9WRlBfRkxPQVQKKwljbXBuZQlyMywgI0ZGSV9UWVBFX1NUUlVDVF9WRlBfRE9VQkxFCisJZnN0bWlhZGVxCXIyLCB7ZDAtZDN9CisKK0xTWU0oTGVwaWxvZ3VlX3ZmcCk6CisJUkVUTERNCSJyMC1yMyxmcCIKKworLmZmaV9jYWxsX1ZGUF9lbmQ6CisJVU5XSU5EIC5mbmVuZAorICAgICAgICAuc2l6ZSAgICBDTkFNRShmZmlfY2FsbF9WRlApLC5mZmlfY2FsbF9WRlBfZW5kLUNOQU1FKGZmaV9jYWxsX1ZGUCkKKworCitBUk1fRlVOQ19TVEFSVCBmZmlfY2xvc3VyZV9WRlAKKwlmc3RtZmRkCXNwISwge2QwLWQ3fQorCUAgcjAtcjMsIHRoZW4gZDAtZDcKKwlVTldJTkQgLnBhZCAjODAKKwlhZGQJaXAsIHNwLCAjODAKKwlzdG1mZAlzcCEsIHtpcCwgbHJ9CisJVU5XSU5EIC5zYXZlCXtyMCwgbHJ9CisJYWRkCXIyLCBzcCwgIzcyCisJYWRkCXIzLCBzcCwgIzgKKwlVTldJTkQgLnBhZCAjNzIKKwlzdWIJc3AsIHNwLCAjNzIKKwlzdHIJc3AsIFtzcCwgIzY0XQorCWFkZAlyMSwgc3AsICM2NAorCWJsCWZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIKKworCWNtcAlyMCwgI0ZGSV9UWVBFX0lOVAorCWJlcQkuTHJldGludF92ZnAKKworCWNtcAlyMCwgI0ZGSV9UWVBFX0ZMT0FUCisJYmVxCS5McmV0ZmxvYXRfdmZwCisKKwljbXAJcjAsICNGRklfVFlQRV9ET1VCTEUKKwljbXBuZQlyMCwgI0ZGSV9UWVBFX0xPTkdET1VCTEUKKwliZXEJLkxyZXRkb3VibGVfdmZwCisKKwljbXAJcjAsICNGRklfVFlQRV9TSU5UNjQKKwliZXEJLkxyZXRsb25nbG9uZ192ZnAKKworCWNtcAlyMCwgI0ZGSV9UWVBFX1NUUlVDVF9WRlBfRkxPQVQKKwliZXEJLkxyZXRmbG9hdF9zdHJ1Y3RfdmZwCisKKwljbXAJcjAsICNGRklfVFlQRV9TVFJVQ1RfVkZQX0RPVUJMRQorCWJlcQkuTHJldGRvdWJsZV9zdHJ1Y3RfdmZwCisJCisuTGNsb3N1cmVfZXBpbG9ndWVfdmZwOgorCWFkZAlzcCwgc3AsICM3MgorCWxkbWZkCXNwLCB7c3AsIHBjfQorCisuTHJldGZsb2F0X3ZmcDoKKwlmbGRzCXMwLCBbc3BdCisJYgkuTGNsb3N1cmVfZXBpbG9ndWVfdmZwCisuTHJldGRvdWJsZV92ZnA6CisJZmxkZAlkMCwgW3NwXQorCWIJLkxjbG9zdXJlX2VwaWxvZ3VlX3ZmcAorLkxyZXRpbnRfdmZwOgorCWxkcglyMCwgW3NwXQorCWIJLkxjbG9zdXJlX2VwaWxvZ3VlX3ZmcAorLkxyZXRsb25nbG9uZ192ZnA6CisJbGRtaWEJc3AsIHtyMCwgcjF9CisJYgkuTGNsb3N1cmVfZXBpbG9ndWVfdmZwCisuTHJldGZsb2F0X3N0cnVjdF92ZnA6CisJZmxkbWlhZAlzcCwge2QwLWQxfQorCWIJLkxjbG9zdXJlX2VwaWxvZ3VlX3ZmcAorLkxyZXRkb3VibGVfc3RydWN0X3ZmcDoKKwlmbGRtaWFkCXNwLCB7ZDAtZDN9CisJYgkuTGNsb3N1cmVfZXBpbG9ndWVfdmZwCisKKy5mZmlfY2xvc3VyZV9WRlBfZW5kOgorCVVOV0lORCAuZm5lbmQKKyAgICAgICAgLnNpemUgICAgQ05BTUUoZmZpX2Nsb3N1cmVfVkZQKSwuZmZpX2Nsb3N1cmVfVkZQX2VuZC1DTkFNRShmZmlfY2xvc3VyZV9WRlApCisKKyNpZiBkZWZpbmVkIF9fRUxGX18gJiYgZGVmaW5lZCBfX2xpbnV4X18KKwkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsJXByb2diaXRzCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXJtL3RyYW1wb2xpbmUuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXJtL3RyYW1wb2xpbmUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQ3NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hcm0vdHJhbXBvbGluZS5TCkBAIC0wLDAgKzEsNDQ1MCBAQAorIyBHRU5FUkFURUQgQ09ERSAtIERPIE5PVCBFRElUCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IC4vZ2VudHJhbXAuc2gKKworIyAgQ29weXJpZ2h0IChjKSAyMDEwLCBQbGF1c2libGUgTGFicyBDb29wZXJhdGl2ZSwgSW5jLgorIyAgCisjICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyMgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIyAgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIyAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisjICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyMgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisjICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisjICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyMgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorIyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorIyAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLnRleHQKKy5hbGlnbiAxMgorLmdsb2JsIF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlX3BhZ2UKK19mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlX3BhZ2U6CisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKworCisgICAgLy8gdHJhbXBvbGluZQorICAgIC8vIFNhdmUgdG8gc3RhY2sKKyAgICBzdG1mZCBzcCEsIHtyMC1yM30KKworICAgIC8vIExvYWQgdGhlIGNvbnRleHQgYXJndW1lbnQgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGZpcnN0IHVzYWJsZSBjb25maWcgdmFsdWUgYXQgX2ZmaV9jbG9zdXJlX3RyYW1wb2xpbmVfdGFibGUtNDA4MAorICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSBhYm92ZSA0LWJ5dGUgc3RtZmQgaW5zdHJ1Y3Rpb24sIHBsdXMgOCBieXRlcyBjb25zdGFudCB3aGVuIGxvYWRpbmcgZnJvbSBwYy4KKyAgICBsZHIgcjAsIFtwYywgIy00MDkyXQorCisgICAgLy8gTG9hZCB0aGUganVtcCBhZGRyZXNzIGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIGxkciBwYywgW3BjLCAjLTQwOTJdCisKKworICAgIC8vIHRyYW1wb2xpbmUKKyAgICAvLyBTYXZlIHRvIHN0YWNrCisgICAgc3RtZmQgc3AhLCB7cjAtcjN9CisKKyAgICAvLyBMb2FkIHRoZSBjb250ZXh0IGFyZ3VtZW50IGZyb20gdGhlIGNvbmZpZyBwYWdlLgorICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBmaXJzdCB1c2FibGUgY29uZmlnIHZhbHVlIGF0IF9mZmlfY2xvc3VyZV90cmFtcG9saW5lX3RhYmxlLTQwODAKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgYWJvdmUgNC1ieXRlIHN0bWZkIGluc3RydWN0aW9uLCBwbHVzIDggYnl0ZXMgY29uc3RhbnQgd2hlbiBsb2FkaW5nIGZyb20gcGMuCisgICAgbGRyIHIwLCBbcGMsICMtNDA5Ml0KKworICAgIC8vIExvYWQgdGhlIGp1bXAgYWRkcmVzcyBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICBsZHIgcGMsIFtwYywgIy00MDkyXQorCisKKyAgICAvLyB0cmFtcG9saW5lCisgICAgLy8gU2F2ZSB0byBzdGFjaworICAgIHN0bWZkIHNwISwge3IwLXIzfQorCisgICAgLy8gTG9hZCB0aGUgY29udGV4dCBhcmd1bWVudCBmcm9tIHRoZSBjb25maWcgcGFnZS4KKyAgICAvLyBUaGlzIHBsYWNlcyB0aGUgZmlyc3QgdXNhYmxlIGNvbmZpZyB2YWx1ZSBhdCBfZmZpX2Nsb3N1cmVfdHJhbXBvbGluZV90YWJsZS00MDgwCisgICAgLy8gVGhpcyBhY2NvdW50cyBmb3IgdGhlIGFib3ZlIDQtYnl0ZSBzdG1mZCBpbnN0cnVjdGlvbiwgcGx1cyA4IGJ5dGVzIGNvbnN0YW50IHdoZW4gbG9hZGluZyBmcm9tIHBjLgorICAgIGxkciByMCwgW3BjLCAjLTQwOTJdCisKKyAgICAvLyBMb2FkIHRoZSBqdW1wIGFkZHJlc3MgZnJvbSB0aGUgY29uZmlnIHBhZ2UuCisgICAgbGRyIHBjLCBbcGMsICMtNDA5Ml0KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hdnIzMi9mZmkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXZyMzIvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0MzM5NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXZyMzIvZmZpLmMKQEAgLTAsMCArMSw0MjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAxMSAgQW50aG9ueSBHcmVlbgorICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgIEJyYWRsZXkgU21pdGggPGJyYWRAYnJhZC1zbWl0aC5jby51az4KKworICAgQVZSMzIgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisvKiAjZGVmaW5lIERFQlVHICovCisKK2V4dGVybiB2b2lkIGZmaV9jYWxsX1NZU1Yodm9pZCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksIGV4dGVuZGVkX2NpZiAqLAorICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQqLCB1bnNpZ25lZCBpbnQsCisgICAgdm9pZCAoKmZuKSh2b2lkKSk7CitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV9TWVNWIChmZmlfY2xvc3VyZSAqKTsKKwordW5zaWduZWQgaW50IHBhc3Nfc3RydWN0X29uX3N0YWNrKGZmaV90eXBlICp0eXBlKQoreworICAgIGlmKHR5cGUtPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKHR5cGUtPmFsaWdubWVudCA8IHR5cGUtPnNpemUgJiYKKyAgICAgICAgISh0eXBlLT5zaXplID09IDQgfHwgdHlwZS0+c2l6ZSA9PSA4KSAmJgorICAgICAgICAhKHR5cGUtPnNpemUgPT0gOCAmJiB0eXBlLT5hbGlnbm1lbnQgPj0gNCkpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYodHlwZS0+c2l6ZSA9PSAzIHx8IHR5cGUtPnNpemUgPT0gNSB8fCB0eXBlLT5zaXplID09IDYgfHwKKyAgICAgICAgdHlwZS0+c2l6ZSA9PSA3KQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCisvKiBmZmlfcHJlcF9hcmdzIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibHkgcm91dGluZSBvbmNlIHN0YWNrIHNwYWNlCisgKiBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cworICoKKyAqIFRoaXMgaXMgYW5ub3lpbmdseSBjb21wbGV4IHNpbmNlIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB1c2VkCisgKiByZWdpc3RlcnMuCisgKi8KKwordm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdm9pZCAqKnBfYXJndjsKKyAgICBmZmlfdHlwZSAqKnBfYXJnOworICAgIGNoYXIgKnJlZ19iYXNlID0gc3RhY2s7CisgICAgY2hhciAqc3RhY2tfYmFzZSA9IHN0YWNrICsgMjA7CisgICAgdW5zaWduZWQgaW50IHN0YWNrX29mZnNldCA9IDA7CisgICAgdW5zaWduZWQgaW50IHJlZ19tYXNrID0gMDsKKworICAgIHBfYXJndiA9IGVjaWYtPmF2YWx1ZTsKKworICAgIC8qIElmIGNpZi0+ZmxhZ3MgaXMgc3RydWN0IHRoZW4gd2Uga25vdyBpdCdzIG5vdCBwYXNzZWQgaW4gcmVnaXN0ZXJzICovCisgICAgaWYoZWNpZi0+Y2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgeworICAgICAgICAqKHZvaWQqKilyZWdfYmFzZSA9IGVjaWYtPnJ2YWx1ZTsKKyAgICAgICAgcmVnX21hc2sgfD0gMTsKKyAgICB9CisKKyAgICBmb3IoaSA9IDAsIHBfYXJnID0gZWNpZi0+Y2lmLT5hcmdfdHlwZXM7IGkgPCBlY2lmLT5jaWYtPm5hcmdzOworICAgICAgICBpKyssIHBfYXJnKyspCisgICAgeworICAgICAgICBzaXplX3QgeiA9ICgqcF9hcmcpLT5zaXplOworICAgICAgICBpbnQgYWxpZ25tZW50ID0gKCpwX2FyZyktPmFsaWdubWVudDsKKyAgICAgICAgaW50IHR5cGUgPSAoKnBfYXJnKS0+dHlwZTsKKyAgICAgICAgY2hhciAqYWRkciA9IDA7CisKKyAgICAgICAgaWYoeiAlIDQgIT0gMCkKKyAgICAgICAgICAgIHogKz0gKDQgLSB6ICUgNCk7CisKKyAgICAgICAgaWYocmVnX21hc2sgIT0gMHgxZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYocGFzc19zdHJ1Y3Rfb25fc3RhY2soKnBfYXJnKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyID0gc3RhY2tfYmFzZSArIHN0YWNrX29mZnNldDsKKyAgICAgICAgICAgICAgICBzdGFja19vZmZzZXQgKz0gejsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoeiA9PSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGluZGV4ID0gMDsKKworICAgICAgICAgICAgICAgIHdoaWxlKChyZWdfbWFzayA+PiBpbmRleCkgJiAxKQorICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworCisgICAgICAgICAgICAgICAgYWRkciA9IHJlZ19iYXNlICsgKGluZGV4ICogNCk7CisgICAgICAgICAgICAgICAgcmVnX21hc2sgfD0gKDEgPDwgaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZih6ID09IDIgKiBzaXplb2YoaW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZighKChyZWdfbWFzayA+PiAxKSAmIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHJlZ19iYXNlICsgNDsKKyAgICAgICAgICAgICAgICAgICAgcmVnX21hc2sgfD0gKDMgPDwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoISgocmVnX21hc2sgPj4gMykgJiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSByZWdfYmFzZSArIDEyOworICAgICAgICAgICAgICAgICAgICByZWdfbWFzayB8PSAoMyA8PCAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZighYWRkcikKKyAgICAgICAgeworICAgICAgICAgICAgYWRkciA9IHN0YWNrX2Jhc2UgKyBzdGFja19vZmZzZXQ7CisgICAgICAgICAgICBzdGFja19vZmZzZXQgKz0gejsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUICYmICgqcF9hcmcpLT5lbGVtZW50c1sxXSA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZSA9ICgqcF9hcmcpLT5lbGVtZW50c1swXS0+dHlwZTsKKworICAgICAgICBzd2l0Y2godHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgKih1bnNpZ25lZCBpbnQgKilhZGRyID0gKHVuc2lnbmVkIGludCkqKFVJTlQ4ICopKCpwX2FyZ3YpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICAgICAgICAqKHNpZ25lZCBpbnQgKilhZGRyID0gKHNpZ25lZCBpbnQpKihTSU5UOCAqKSgqcF9hcmd2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgICoodW5zaWduZWQgaW50ICopYWRkciA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMTYgKikoKnBfYXJndik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisgICAgICAgICAgICAqKHNpZ25lZCBpbnQgKilhZGRyID0gKHNpZ25lZCBpbnQpKihTSU5UMTYgKikoKnBfYXJndik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1lbWNweShhZGRyLCAqcF9hcmd2LCB6KTsKKyAgICAgICAgfQorCisgICAgICAgIHBfYXJndisrOworICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgLyogRGVidWdnaW5nICovCisgICAgZm9yKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoKHJlZ19tYXNrICYgKDEgPDwgaSkpID09IDApCisgICAgICAgICAgICBwcmludGYoInIlZDogKHVudXNlZClcbiIsIDEyIC0gaSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiciVkOiAweCUwOHhcbiIsIDEyIC0gaSwgKCh1bnNpZ25lZCBpbnQqKXJlZ19iYXNlKVtpXSk7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgc3RhY2tfb2Zmc2V0IC8gNDsgaSsrKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJzcCslZDogMHglMDh4XG4iLCBpKjQsICgodW5zaWduZWQgaW50KilzdGFja19iYXNlKVtpXSk7CisgICAgfQorI2VuZGlmCit9CisKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KK2ZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworICAgIC8qIFJvdW5kIHRoZSBzdGFjayB1cCB0byBhIG11bHRpcGxlIG9mIDggYnl0ZXMuICBUaGlzIGlzbid0IG5lZWRlZAorICAgICAqIGV2ZXJ5d2hlcmUsIGJ1dCBpdCBpcyBvbiBzb21lIHBsYXRmb3JtcywgYW5kIGl0IGRvZXNuJ3QgaGFybQorICAgICAqIGFueXRoaW5nIHdoZW4gaXQgaXNuJ3QgbmVlZGVkLiAqLworICAgIGNpZi0+Ynl0ZXMgPSAoY2lmLT5ieXRlcyArIDcpICYgfjc7CisKKyAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgaGUgcmV0dXJuIHZhbHVlIGlzIGluIGZhY3QgYSBzdHJ1Y3QgKi8KKyAgICBjaWYtPnJzdHJ1Y3RfZmxhZyA9IDA7CisKKyAgICAvKiBTZXQgdGhlIHJldHVybiB0eXBlIGZsYWcgKi8KKyAgICBzd2l0Y2goY2lmLT5ydHlwZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKUZGSV9UWVBFX1VJTlQ4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyAgICAgICAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZClGRklfVFlQRV9VSU5UMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorICAgICAgICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKUZGSV9UWVBFX1VJTlQzMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNpZi0+ZmxhZ3MgPSAodW5zaWduZWQpRkZJX1RZUEVfVUlOVDY0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyAgICAgICAgY2lmLT5yc3RydWN0X2ZsYWcgPSAxOworICAgICAgICBpZighcGFzc19zdHJ1Y3Rfb25fc3RhY2soY2lmLT5ydHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGNpZi0+cnR5cGUtPnNpemUgPD0gMSkKKyAgICAgICAgICAgICAgICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKUZGSV9UWVBFX1VJTlQ4OworICAgICAgICAgICAgZWxzZSBpZihjaWYtPnJ0eXBlLT5zaXplIDw9IDIpCisgICAgICAgICAgICAgICAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZClGRklfVFlQRV9VSU5UMTY7CisgICAgICAgICAgICBlbHNlIGlmKGNpZi0+cnR5cGUtPnNpemUgPD0gNCkKKyAgICAgICAgICAgICAgICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKUZGSV9UWVBFX1VJTlQzMjsKKyAgICAgICAgICAgIGVsc2UgaWYoY2lmLT5ydHlwZS0+c2l6ZSA8PSA4KQorICAgICAgICAgICAgICAgIGNpZi0+ZmxhZ3MgPSAodW5zaWduZWQpRkZJX1RZUEVfVUlOVDY0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNpZi0+ZmxhZ3MgPSAodW5zaWduZWQpY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKWNpZi0+cnR5cGUtPnR5cGU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNpZi0+ZmxhZ3MgPSAodW5zaWduZWQpY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEZGSV9PSzsKK30KKwordm9pZCBmZmlfY2FsbChmZmlfY2lmICpjaWYsIHZvaWQgKCpmbikodm9pZCksIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZSkKK3sKKyAgICBleHRlbmRlZF9jaWYgZWNpZjsKKworICAgIHVuc2lnbmVkIGludCBzaXplID0gMCwgaSA9IDA7CisgICAgZmZpX3R5cGUgKipwX2FyZzsKKworICAgIGVjaWYuY2lmID0gY2lmOworICAgIGVjaWYuYXZhbHVlID0gYXZhbHVlOworCisgICAgZm9yKGkgPSAwLCBwX2FyZyA9IGNpZi0+YXJnX3R5cGVzOyBpIDwgY2lmLT5uYXJnczsgaSsrLCBwX2FyZysrKQorICAgICAgICBzaXplICs9ICgqcF9hcmcpLT5zaXplICsgKDQgLSAoKnBfYXJnKS0+c2l6ZSAlIDQpOworCisgICAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybiB2YWx1ZQorICAgICAqIGFkZHJlc3MgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lICovCisKKyAgICAvKiBJZiBjaWYtPmZsYWdzIGlzIHN0cnVjdCB0aGVuIGl0J3Mgbm90IHN1aXRhYmxlIGZvciByZWdpc3RlcnMgKi8KKyAgICBpZigocnZhbHVlID09IE5VTEwpICYmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkpCisgICAgICAgIGVjaWYucnZhbHVlID0gYWxsb2NhKGNpZi0+cnR5cGUtPnNpemUpOworICAgIGVsc2UKKyAgICAgICAgZWNpZi5ydmFsdWUgPSBydmFsdWU7CisKKyAgICBzd2l0Y2goY2lmLT5hYmkpCisgICAgeworICAgIGNhc2UgRkZJX1NZU1Y6CisgICAgICAgIGZmaV9jYWxsX1NZU1YoZmZpX3ByZXBfYXJncywgJmVjaWYsIHNpemUsIGNpZi0+ZmxhZ3MsCisgICAgICAgICAgICBlY2lmLnJ2YWx1ZSwgY2lmLT5yc3RydWN0X2ZsYWcsIGZuKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgRkZJX0FTU0VSVCgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoY2hhciAqc3RhY2ssIHZvaWQgKipydmFsdWUsCisgICAgdm9pZCAqKmF2YWx1ZSwgZmZpX2NpZiAqY2lmKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpLCByZWdfbWFzayA9IDA7CisgICAgcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKKyAgICByZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOworICAgIHJlZ2lzdGVyIGNoYXIgKnJlZ19iYXNlID0gc3RhY2s7CisgICAgcmVnaXN0ZXIgY2hhciAqc3RhY2tfYmFzZSA9IHN0YWNrICsgMjA7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHN0YWNrX29mZnNldCA9IDA7CisKKyNpZmRlZiBERUJVRworICAgIC8qIERlYnVnZ2luZyAqLworICAgIGZvcihpID0gMDsgaSA8IGNpZi0+bmFyZ3MgKyA3OyBpKyspCisgICAgeworICAgICAgICBwcmludGYoInNwKyVkOiAweCUwOHhcbiIsIGkqNCwgKCh1bnNpZ25lZCBpbnQqKXN0YWNrKVtpXSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBJZiBjaWYtPmZsYWdzIGlzIHN0cnVjdCB0aGVuIHdlIGtub3cgaXQncyBub3QgcGFzc2VkIGluIHJlZ2lzdGVycyAqLworICAgIGlmKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHsKKyAgICAgICAgKnJ2YWx1ZSA9ICoodm9pZCAqKilyZWdfYmFzZTsKKyAgICAgICAgcmVnX21hc2sgfD0gMTsKKyAgICB9CisKKyAgICBwX2FyZ3YgPSBhdmFsdWU7CisKKyAgICBmb3IoaSA9IDAsIHBfYXJnID0gY2lmLT5hcmdfdHlwZXM7IGkgPCBjaWYtPm5hcmdzOyBpKyssIHBfYXJnKyspCisgICAgeworICAgICAgICBzaXplX3QgeiA9ICgqcF9hcmcpLT5zaXplOworICAgICAgICBpbnQgYWxpZ25tZW50ID0gKCpwX2FyZyktPmFsaWdubWVudDsKKworICAgICAgICAqcF9hcmd2ID0gMDsKKworICAgICAgICBpZih6ICUgNCAhPSAwKQorICAgICAgICAgICAgeiArPSAoNCAtIHogJSA0KTsKKworICAgICAgICBpZihyZWdfbWFzayAhPSAweDFmKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwYXNzX3N0cnVjdF9vbl9zdGFjaygqcF9hcmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwX2FyZ3YgPSAodm9pZCopc3RhY2tfYmFzZSArIHN0YWNrX29mZnNldDsKKyAgICAgICAgICAgICAgICBzdGFja19vZmZzZXQgKz0gejsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoeiA8PSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGluZGV4ID0gMDsKKworICAgICAgICAgICAgICAgIHdoaWxlKChyZWdfbWFzayA+PiBpbmRleCkgJiAxKQorICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworCisgICAgICAgICAgICAgICAgKnBfYXJndiA9ICh2b2lkKilyZWdfYmFzZSArIChpbmRleCAqIDQpOworICAgICAgICAgICAgICAgIHJlZ19tYXNrIHw9ICgxIDw8IGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoeiA9PSAyICogc2l6ZW9mKGludCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoISgocmVnX21hc2sgPj4gMSkgJiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwX2FyZ3YgPSAodm9pZCopcmVnX2Jhc2UgKyA0OworICAgICAgICAgICAgICAgICAgICByZWdfbWFzayB8PSAoMyA8PCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZighKChyZWdfbWFzayA+PiAzKSAmIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBfYXJndiA9ICh2b2lkKilyZWdfYmFzZSArIDEyOworICAgICAgICAgICAgICAgICAgICByZWdfbWFzayB8PSAoMyA8PCAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZighKnBfYXJndikKKyAgICAgICAgeworICAgICAgICAgICAgKnBfYXJndiA9ICh2b2lkKilzdGFja19iYXNlICsgc3RhY2tfb2Zmc2V0OworICAgICAgICAgICAgc3RhY2tfb2Zmc2V0ICs9IHo7CisgICAgICAgIH0KKworICAgICAgICBpZigoKnBfYXJnKS0+dHlwZSAhPSBGRklfVFlQRV9TVFJVQ1QgfHwKKyAgICAgICAgICAgICgqcF9hcmcpLT5lbGVtZW50c1sxXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZihhbGlnbm1lbnQgPT0gMSkKKyAgICAgICAgICAgICAgICAqKih1bnNpZ25lZCBpbnQqKilwX2FyZ3YgPDw9IDI0OworICAgICAgICAgICAgZWxzZSBpZihhbGlnbm1lbnQgPT0gMikKKyAgICAgICAgICAgICAgICAqKih1bnNpZ25lZCBpbnQqKilwX2FyZ3YgPDw9IDE2OworICAgICAgICB9CisKKyAgICAgICAgcF9hcmd2Kys7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICAvKiBEZWJ1Z2dpbmcgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBjaWYtPm5hcmdzOyBpKyspCisgICAgeworICAgICAgICBwcmludGYoInNwKyVkOiAweCUwOHhcbiIsIGkqNCwgKigoKHVuc2lnbmVkIGludCoqKWF2YWx1ZSlbaV0pKTsKKyAgICB9CisjZW5kaWYKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBqdW1wZWQgdG8gYnkgdGhlIHRyYW1wb2xpbmUgKi8KKwordW5zaWduZWQgaW50IGZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsIHZvaWQgKipyZXNwcCwKKyAgICB2b2lkICphcmdzKQoreworICAgIGZmaV9jaWYgKmNpZjsKKyAgICB2b2lkICoqYXJnX2FyZWE7CisgICAgdW5zaWduZWQgaW50IGksIHNpemUgPSAwOworICAgIGZmaV90eXBlICoqcF9hcmc7CisKKyAgICBjaWYgPSBjbG9zdXJlLT5jaWY7CisKKyAgICBmb3IoaSA9IDAsIHBfYXJnID0gY2lmLT5hcmdfdHlwZXM7IGkgPCBjaWYtPm5hcmdzOyBpKyssIHBfYXJnKyspCisgICAgICAgIHNpemUgKz0gKCpwX2FyZyktPnNpemUgKyAoNCAtICgqcF9hcmcpLT5zaXplICUgNCk7CisKKyAgICBhcmdfYXJlYSA9ICh2b2lkICoqKWFsbG9jYShzaXplKTsKKworICAgIC8qIHRoaXMgY2FsbCB3aWxsIGluaXRpYWxpemUgQVJHX0FSRUEsIHN1Y2ggdGhhdCBlYWNoIGVsZW1lbnQgaW4gdGhhdAorICAgICAqIGFycmF5IHBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvbiB0aGUgc3RhY2s7IGFuZCBpZiB0aGUKKyAgICAgKiBmdW5jdGlvbiByZXR1cm5zIGEgc3RydWN0dXJlLCBpdCB3aWxsIHJlLXNldCBSRVNQIHRvIHBvaW50IHRvIHRoZQorICAgICAqIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcy4gKi8KKworICAgIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVihhcmdzLCByZXNwcCwgYXJnX2FyZWEsIGNpZik7CisKKyAgICAoY2xvc3VyZS0+ZnVuKShjaWYsICpyZXNwcCwgYXJnX2FyZWEsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgICByZXR1cm4gY2lmLT5mbGFnczsKK30KKworZmZpX3N0YXR1cyBmZmlfcHJlcF9jbG9zdXJlX2xvYyhmZmlfY2xvc3VyZSogY2xvc3VyZSwgZmZpX2NpZiogY2lmLAorICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLCB2b2lkKiwgdm9pZCoqLCB2b2lkKiksIHZvaWQgKnVzZXJfZGF0YSwKKyAgICB2b2lkICpjb2RlbG9jKQoreworICAgIGlmIChjaWYtPmFiaSAhPSBGRklfU1lTVikKKyAgICAgIHJldHVybiBGRklfQkFEX0FCSTsKKworICAgIHVuc2lnbmVkIGNoYXIgKl9fdHJhbXAgPSAodW5zaWduZWQgY2hhciopKCZjbG9zdXJlLT50cmFtcFswXSk7CisgICAgdW5zaWduZWQgaW50ICBfX2Z1biA9ICh1bnNpZ25lZCBpbnQpKCZmZmlfY2xvc3VyZV9TWVNWKTsKKyAgICB1bnNpZ25lZCBpbnQgIF9fY3R4ID0gKHVuc2lnbmVkIGludCkoY29kZWxvYyk7CisgICAgdW5zaWduZWQgaW50ICBfX3JzdHJ1Y3RfZmxhZyA9ICh1bnNpZ25lZCBpbnQpKGNpZi0+cnN0cnVjdF9mbGFnKTsKKyAgICB1bnNpZ25lZCBpbnQgIF9faW5uZXIgPSAodW5zaWduZWQgaW50KSgmZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcik7CisgICAgKih1bnNpZ25lZCBpbnQqKSAmX190cmFtcFswXSA9IDB4ZWJjZDFmMDA7ICAgIC8qIHB1c2htICByOC1yMTIgKi8KKyAgICAqKHVuc2lnbmVkIGludCopICZfX3RyYW1wWzRdID0gMHhmZWZjMDAxMDsgICAgLyogbGQudyAgIHIxMiwgcGNbMTZdICovCisgICAgKih1bnNpZ25lZCBpbnQqKSAmX190cmFtcFs4XSA9IDB4ZmVmYjAwMTA7ICAgIC8qIGxkLncgICByMTEsIHBjWzE2XSAqLworICAgICoodW5zaWduZWQgaW50KikgJl9fdHJhbXBbMTJdID0gMHhmZWZhMDAxMDsgICAvKiBsZC53ICAgcjEwLCBwY1sxNl0gKi8KKyAgICAqKHVuc2lnbmVkIGludCopICZfX3RyYW1wWzE2XSA9IDB4ZmVmZjAwMTA7ICAgLyogbGQudyAgIHBjLCBwY1sxNl0gKi8KKyAgICAqKHVuc2lnbmVkIGludCopICZfX3RyYW1wWzIwXSA9IF9fY3R4OworICAgICoodW5zaWduZWQgaW50KikgJl9fdHJhbXBbMjRdID0gX19yc3RydWN0X2ZsYWc7CisgICAgKih1bnNpZ25lZCBpbnQqKSAmX190cmFtcFsyOF0gPSBfX2lubmVyOworICAgICoodW5zaWduZWQgaW50KikgJl9fdHJhbXBbMzJdID0gX19mdW47CisgICAgc3lzY2FsbChfX05SX2NhY2hlZmx1c2gsIDAsICgmX190cmFtcFswXSksIDM2KTsKKworICAgIGNsb3N1cmUtPmNpZiA9IGNpZjsKKyAgICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgICAgY2xvc3VyZS0+ZnVuICA9IGZ1bjsKKworICAgIHJldHVybiBGRklfT0s7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXZyMzIvZmZpdGFyZ2V0LmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2F2cjMyL2ZmaXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NWQwNjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2F2cjMyL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAwOSAgQnJhZGxleSBTbWl0aCA8YnJhZEBicmFkLXNtaXRoLmNvLnVrPgorICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBBVlIzMi4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAorI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKKworI2lmbmRlZiBMSUJGRklfQVNNCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZmZpX2FyZzsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgICAgICAgICAgICBmZmlfc2FyZzsKKwordHlwZWRlZiBlbnVtIGZmaV9hYmkgeworICBGRklfRklSU1RfQUJJID0gMCwKKyAgRkZJX1NZU1YsCisgIEZGSV9MQVNUX0FCSSwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YKK30gZmZpX2FiaTsKKyNlbmRpZgorCisjZGVmaW5lIEZGSV9FWFRSQV9DSUZfRklFTERTIHVuc2lnbmVkIGludCByc3RydWN0X2ZsYWcKKworLyogRGVmaW5pdGlvbnMgZm9yIGNsb3N1cmVzICovCisKKyNkZWZpbmUgRkZJX0NMT1NVUkVTIDEKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAzNgorI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXZyMzIvc3lzdi5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9hdnIzMi9zeXN2LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4NGIzYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvYXZyMzIvc3lzdi5TCkBAIC0wLDAgKzEsMjA4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDA5ICBCcmFkbGV5IFNtaXRoIDxicmFkQGJyYWQtc21pdGguY28udWs+CisKKyAgIEFWUjMyIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgICBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKyAgICAvKiByMTI6ICBmZmlfcHJlcF9hcmdzCisgICAgICogcjExOiAgJmVjaWYKKyAgICAgKiByMTA6ICBzaXplCisgICAgICogcjk6ICAgY2lmLT5mbGFncworICAgICAqIHI4OiAgIGVjaWYucnZhbHVlCisgICAgICogc3ArMDogY2lmLT5yc3RydWN0X2ZsYWcKKyAgICAgKiBzcCs0OiBmbiAqLworCisgICAgLnRleHQKKyAgICAuYWxpZ24gIDEKKyAgICAuZ2xvYmwgIGZmaV9jYWxsX1NZU1YKKyAgICAudHlwZSAgIGZmaV9jYWxsX1NZU1YsIEBmdW5jdGlvbgorZmZpX2NhbGxfU1lTVjoKKyAgICBzdG0gICAgIC0tc3AsIHIwLHIxLGxyCisgICAgc3RtICAgICAtLXNwLCByOC1yMTIKKyAgICBtb3YgICAgIHIwLCBzcAorCisgICAgLyogTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLiAqLworICAgIHN1YiAgICAgc3AsIHIxMAorICAgIC8qIFBhZCB0byBtYWtlIHdheSBmb3IgcG90ZW50aWFsIHNraXBwZWQgcmVnaXN0ZXJzICovCisgICAgc3ViICAgICBzcCwgMjAKKworICAgIC8qIENhbGwgZmZpX3ByZXBfYXJncyhzdGFjaywgJmVjaWYpLiAqLworICAgIC8qIHIxMSBhbHJlYWR5IHNldCAqLworICAgIG1vdiAgICAgcjEsIHIxMgorICAgIG1vdiAgICAgcjEyLCBzcAorICAgIGljYWxsICAgcjEKKworICAgIC8qIFNhdmUgbmV3IGFyZ3VtZW50IHNpemUgKi8KKyAgICBtb3YgICAgIHIxLCByMTIKKworICAgIC8qIE1vdmUgZmlyc3QgNSBwYXJhbWV0ZXJzIGluIHJlZ2lzdGVycy4gKi8KKyAgICBsZG0gICAgIHNwKyssIHI4LXIxMgorCisgICAgLyogY2FsbCAoZm4pICguLi4pLiAqLworICAgIGxkLncgICAgcjEsIHIwWzM2XQorICAgIGljYWxsICAgcjEKKworICAgIC8qIFJlbW92ZSB0aGUgc3BhY2Ugd2UgcHVzaGVkIGZvciB0aGUgYXJncy4gKi8KKyAgICBtb3YgICAgIHNwLCByMAorCisgICAgLyogTG9hZCByMSB3aXRoIHRoZSByc3RydWN0IGZsYWcuICovCisgICAgbGQudyAgICByMSwgc3BbMzJdCisKKyAgICAvKiBMb2FkIHI5IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUuICovCisgICAgbGQudyAgICByOSwgc3BbMTJdCisKKyAgICAvKiBMb2FkIHI4IHdpdGggdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyLiAqLworICAgIGxkLncgICAgcjgsIHNwWzE2XQorCisgICAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuICovCisgICAgY3AudyAgICByOCwgMAorICAgIGJyZXEgICAgLkxlbmQKKworICAgIC8qIENoZWNrIGlmIHJldHVybiB0eXBlIGlzIGFjdHVhbGx5IGEgc3RydWN0ICovCisgICAgY3AudyAgICByMSwgMAorICAgIGJyZXEgICAgMWYKKworICAgIC8qIFJldHVybiA4Yml0ICovCisgICAgY3AudyAgICByOSwgRkZJX1RZUEVfVUlOVDgKKyAgICBicmVxICAgIC5Mc3RvcmU4CisKKyAgICAvKiBSZXR1cm4gMTZiaXQgKi8KKyAgICBjcC53ICAgIHI5LCBGRklfVFlQRV9VSU5UMTYKKyAgICBicmVxICAgIC5Mc3RvcmUxNgorCisxOgorICAgIC8qIFJldHVybiAzMmJpdCAqLworICAgIGNwLncgICAgcjksIEZGSV9UWVBFX1VJTlQzMgorICAgIGJyZXEgICAgLkxzdG9yZTMyCisgICAgY3AudyAgICByOSwgRkZJX1RZUEVfVUlOVDE2CisgICAgYnJlcSAgICAuTHN0b3JlMzIKKyAgICBjcC53ICAgIHI5LCBGRklfVFlQRV9VSU5UOAorICAgIGJyZXEgICAgLkxzdG9yZTMyCisKKyAgICAvKiBSZXR1cm4gNjRiaXQgKi8KKyAgICBjcC53ICAgIHI5LCBGRklfVFlQRV9VSU5UNjQKKyAgICBicmVxICAgIC5Mc3RvcmU2NAorCisgICAgLyogRGlkbid0IG1hdGNoIGFueXRoaW5nICovCisgICAgYnJhbCAgICAuTGVuZAorCisuTHN0b3JlNjQ6CisgICAgc3QudyAgICByOFswXSwgcjExCisgICAgc3QudyAgICByOFs0XSwgcjEwCisgICAgYnJhbCAgICAuTGVuZAorCisuTHN0b3JlMzI6CisgICAgc3QudyAgICByOFswXSwgcjEyCisgICAgYnJhbCAgICAuTGVuZAorCisuTHN0b3JlMTY6CisgICAgc3QuaCAgICByOFswXSwgcjEyCisgICAgYnJhbCAgICAuTGVuZAorCisuTHN0b3JlODoKKyAgICBzdC5iICAgIHI4WzBdLCByMTIKKyAgICBicmFsICAgIC5MZW5kCisKKy5MZW5kOgorICAgIHN1YiAgICAgc3AsIC0yMAorICAgIGxkbSAgICAgc3ArKywgcjAscjEscGMKKworICAgIC5zaXplICAgZmZpX2NhbGxfU1lTViwgLiAtIGZmaV9jYWxsX1NZU1YKKworCisgICAgLyogcjEyOiAgX19jdHgKKyAgICAgKiByMTE6ICBfX3JzdHJ1Y3RfZmxhZworICAgICAqIHIxMDogIF9faW5uZXIgKi8KKworICAgIC5hbGlnbiAgMQorICAgIC5nbG9ibCAgZmZpX2Nsb3N1cmVfU1lTVgorICAgIC50eXBlICAgZmZpX2Nsb3N1cmVfU1lTViwgQGZ1bmN0aW9uCitmZmlfY2xvc3VyZV9TWVNWOgorICAgIHN0bSAgICAgLS1zcCwgcjAsbHIKKyAgICBtb3YgICAgIHIwLCByMTEKKyAgICBtb3YgICAgIHI4LCByMTAKKyAgICBzdWIgICAgIHIxMCwgc3AsIC04CisgICAgc3ViICAgICBzcCwgMTIKKyAgICBzdC53ICAgIHNwWzhdLCBzcAorICAgIHN1YiAgICAgcjExLCBzcCwgLTgKKyAgICBpY2FsbCAgIHI4CisKKyAgICAvKiBDaGVjayBpZiByZXR1cm4gdHlwZSBpcyBhY3R1YWxseSBhIHN0cnVjdCAqLworICAgIGNwLncgICAgcjAsIDAKKyAgICBicmVxICAgIDFmCisKKyAgICAvKiBSZXR1cm4gOGJpdCAqLworICAgIGNwLncgICAgcjEyLCBGRklfVFlQRV9VSU5UOAorICAgIGJyZXEgICAgLkxnZXQ4CisKKyAgICAvKiBSZXR1cm4gMTZiaXQgKi8KKyAgICBjcC53ICAgIHIxMiwgRkZJX1RZUEVfVUlOVDE2CisgICAgYnJlcSAgICAuTGdldDE2CisKKzE6CisgICAgLyogUmV0dXJuIDMyYml0ICovCisgICAgY3AudyAgICByMTIsIEZGSV9UWVBFX1VJTlQzMgorICAgIGJyZXEgICAgLkxnZXQzMgorICAgIGNwLncgICAgcjEyLCBGRklfVFlQRV9VSU5UMTYKKyAgICBicmVxICAgIC5MZ2V0MzIKKyAgICBjcC53ICAgIHIxMiwgRkZJX1RZUEVfVUlOVDgKKyAgICBicmVxICAgIC5MZ2V0MzIKKworICAgIC8qIFJldHVybiA2NGJpdCAqLworICAgIGNwLncgICAgcjEyLCBGRklfVFlQRV9VSU5UNjQKKyAgICBicmVxICAgIC5MZ2V0NjQKKworICAgIC8qIERpZG4ndCBtYXRjaCBhbnl0aGluZyAqLworICAgIGJyYWwgICAgLkxjbGVuZAorCisuTGdldDY0OgorICAgIGxkLncgICAgcjExLCBzcFswXQorICAgIGxkLncgICAgcjEwLCBzcFs0XQorICAgIGJyYWwgICAgLkxjbGVuZAorCisuTGdldDMyOgorICAgIGxkLncgICAgcjEyLCBzcFswXQorICAgIGJyYWwgICAgLkxjbGVuZAorCisuTGdldDE2OgorICAgIGxkLnVoICAgcjEyLCBzcFswXQorICAgIGJyYWwgICAgLkxjbGVuZAorCisuTGdldDg6CisgICAgbGQudWIgICByMTIsIHNwWzBdCisgICAgYnJhbCAgICAuTGNsZW5kCisKKy5MY2xlbmQ6CisgICAgc3ViICAgICBzcCwgLTEyCisgICAgbGRtICAgICBzcCsrLCByMCxscgorICAgIHN1YiAgICAgc3AsIC0yMAorICAgIG1vdiAgICAgcGMsIGxyCisKKyAgICAuc2l6ZSAgIGZmaV9jbG9zdXJlX1NZU1YsIC4gLSBmZmlfY2xvc3VyZV9TWVNWCisKKyNpZiBkZWZpbmVkIF9fRUxGX18gJiYgZGVmaW5lZCBfX2xpbnV4X18KKyAgICAuc2VjdGlvbiAgICAubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvY2xvc3VyZXMuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvY2xvc3VyZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM3ODI3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9jbG9zdXJlcy5jCkBAIC0wLDAgKzEsNjE1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgY2xvc3VyZXMuYyAtIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSwgMjAxMCAgUmVkIEhhdCwgSW5jLgorICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYworICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMSBQbGF1c2libGUgTGFicyBDb29wZXJhdGl2ZSwgSW5jLgorCisgICBDb2RlIHRvIGFsbG9jYXRlIGFuZCBkZWFsbG9jYXRlIG1lbW9yeSBmb3IgY2xvc3VyZXMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkIF9fbGludXhfXyAmJiAhZGVmaW5lZCBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRSAxCisjZW5kaWYKKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KKworI2lmICFGRklfTU1BUF9FWEVDX1dSSVQgJiYgIUZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUKKyMgaWYgX19nbnVfbGludXhfXworLyogVGhpcyBtYWNybyBpbmRpY2F0ZXMgaXQgbWF5IGJlIGZvcmJpZGRlbiB0byBtYXAgYW5vbnltb3VzIG1lbW9yeQorICAgd2l0aCBib3RoIHdyaXRlIGFuZCBleGVjdXRlIHBlcm1pc3Npb24uICBDb2RlIGNvbXBpbGVkIHdoZW4gdGhpcworICAgb3B0aW9uIGlzIGRlZmluZWQgd2lsbCBhdHRlbXB0IHRvIG1hcCBzdWNoIHBhZ2VzIG9uY2UsIGJ1dCBpZiBpdAorICAgZmFpbHMsIGl0IGZhbGxzIGJhY2sgdG8gY3JlYXRpbmcgYSB0ZW1wb3JhcnkgZmlsZSBpbiBhIHdyaXRhYmxlIGFuZAorICAgZXhlY3V0YWJsZSBmaWxlc3lzdGVtIGFuZCBtYXBwaW5nIHBhZ2VzIGZyb20gaXQgaW50byBzZXBhcmF0ZQorICAgbG9jYXRpb25zIGluIHRoZSB2aXJ0dWFsIG1lbW9yeSBzcGFjZSwgb25lIGxvY2F0aW9uIHdyaXRhYmxlIGFuZAorICAgYW5vdGhlciBleGVjdXRhYmxlLiAgKi8KKyMgIGRlZmluZSBGRklfTU1BUF9FWEVDX1dSSVQgMQorIyAgZGVmaW5lIEhBVkVfTU5URU5UIDEKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X1dJTjY0KSB8fCBkZWZpbmVkKF9fT1MyX18pCisvKiBXaW5kb3dzIHN5c3RlbXMgbWF5IGhhdmUgRGF0YSBFeGVjdXRpb24gUHJvdGVjdGlvbiAoREVQKSBlbmFibGVkLCAKKyAgIHdoaWNoIHJlcXVpcmVzIHRoZSB1c2Ugb2YgVmlydHVhbE1hbGxvYy9WaXJ0dWFsRnJlZSB0byBhbGxvYy9mcmVlCisgICBleGVjdXRhYmxlIG1lbW9yeS4gKi8KKyMgIGRlZmluZSBGRklfTU1BUF9FWEVDX1dSSVQgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBGRklfTU1BUF9FWEVDX1dSSVQgJiYgIWRlZmluZWQgRkZJX01NQVBfRVhFQ19TRUxJTlVYCisjIGlmZGVmIF9fbGludXhfXworLyogV2hlbiBkZWZpbmVkIHRvIDEgY2hlY2sgZm9yIFNFTGludXggYW5kIGlmIFNFTGludXggaXMgYWN0aXZlLAorICAgZG9uJ3QgYXR0ZW1wdCBQUk9UX0VYRUN8UFJPVF9XUklURSBtYXBwaW5nIGF0IGFsbCwgYXMgdGhhdAorICAgbWlnaHQgY2F1c2UgYXVkaXQgbWVzc2FnZXMuICAqLworIyAgZGVmaW5lIEZGSV9NTUFQX0VYRUNfU0VMSU5VWCAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmIEZGSV9DTE9TVVJFUworCisjIGlmIEZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUKKworLy8gUGVyLXRhcmdldCBpbXBsZW1lbnRhdGlvbjsgSXQncyB1bmNsZWFyIHdoYXQgY2FuIHJlYXNvbmFibGUgYmUgc2hhcmVkIGJldHdlZW4gdHdvIE9TL2FyY2hpdGVjdHVyZSBpbXBsZW1lbnRhdGlvbnMuCisKKyMgZWxpZiBGRklfTU1BUF9FWEVDX1dSSVQgLyogIUZGSV9FWEVDX1RSQU1QT0xJTkVfVEFCTEUgKi8KKworI2RlZmluZSBVU0VfTE9DS1MgMQorI2RlZmluZSBVU0VfRExfUFJFRklYIDEKKyNpZmRlZiBfX0dOVUNfXworI2lmbmRlZiBVU0VfQlVJTFRJTl9GRlMKKyNkZWZpbmUgVVNFX0JVSUxUSU5fRkZTIDEKKyNlbmRpZgorI2VuZGlmCisKKy8qIFdlIG5lZWQgdG8gdXNlIG1tYXAsIG5vdCBzYnJrLiAgKi8KKyNkZWZpbmUgSEFWRV9NT1JFQ09SRSAwCisKKy8qIFdlIGNvdWxkLCBpbiB0aGVvcnksIHN1cHBvcnQgbXJlbWFwLCBidXQgaXQgd291bGRuJ3QgYnV5IHVzIGFueXRoaW5nLiAgKi8KKyNkZWZpbmUgSEFWRV9NUkVNQVAgMAorCisvKiBXZSBoYXZlIG5vIHVzZSBmb3IgdGhpcywgc28gc2F2ZSBzb21lIGNvZGUgYW5kIGRhdGEuICAqLworI2RlZmluZSBOT19NQUxMSU5GTyAxCisKKy8qIFdlIG5lZWQgYWxsIGFsbG9jYXRpb25zIHRvIGJlIGluIHJlZ3VsYXIgc2VnbWVudHMsIG90aGVyd2lzZSB3ZQorICAgbG9zZSB0cmFjayBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGFkZHJlc3MuICAqLworI2RlZmluZSBERUZBVUxUX01NQVBfVEhSRVNIT0xEIE1BWF9TSVpFX1QKKworLyogRG9uJ3QgYWxsb2NhdGUgbW9yZSB0aGFuIGEgcGFnZSB1bmxlc3MgbmVlZGVkLiAgKi8KKyNkZWZpbmUgREVGQVVMVF9HUkFOVUxBUklUWSAoKHNpemVfdCltYWxsb2NfZ2V0cGFnZXNpemUpCisKKyNpZiBGRklfQ0xPU1VSRV9URVNUCisvKiBEb24ndCByZWxlYXNlIHNpbmdsZSBwYWdlcywgdG8gYXZvaWQgYSB3b3JzdC1jYXNlIHNjZW5hcmlvIG9mCisgICBjb250aW51b3VzbHkgYWxsb2NhdGluZyBhbmQgcmVsZWFzaW5nIHNpbmdsZSBwYWdlcywgYnV0IHJlbGVhc2UKKyAgIHBhaXJzIG9mIHBhZ2VzLCB3aGljaCBzaG91bGQgZG8ganVzdCBhcyB3ZWxsIGdpdmVuIHRoYXQgYWxsb2NhdGlvbnMKKyAgIGFyZSBsaWtlbHkgdG8gYmUgc21hbGwuICAqLworI2RlZmluZSBERUZBVUxUX1RSSU1fVEhSRVNIT0xEICgoc2l6ZV90KW1hbGxvY19nZXRwYWdlc2l6ZSkKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgJiYgIWRlZmluZWQoWDg2X1dJTjY0KQorI2lmZGVmIEhBVkVfTU5URU5UCisjaW5jbHVkZSA8bW50ZW50Lmg+CisjZW5kaWYgLyogSEFWRV9NTlRFTlQgKi8KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8qIFdlIGRvbid0IHdhbnQgc3lzL21tYW4uaCB0byBiZSBpbmNsdWRlZCBhZnRlciB3ZSByZWRlZmluZSBtbWFwIGFuZAorICAgZGxtdW5tYXAuICAqLworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZGVmaW5lIExBQ0tTX1NZU19NTUFOX0ggMQorCisjaWYgRkZJX01NQVBfRVhFQ19TRUxJTlVYCisjaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgaW50IHNlbGludXhfZW5hYmxlZCA9IC0xOworCitzdGF0aWMgaW50CitzZWxpbnV4X2VuYWJsZWRfY2hlY2sgKHZvaWQpCit7CisgIHN0cnVjdCBzdGF0ZnMgc2ZzOworICBGSUxFICpmOworICBjaGFyICpidWYgPSBOVUxMOworICBzaXplX3QgbGVuID0gMDsKKworICBpZiAoc3RhdGZzICgiL3NlbGludXgiLCAmc2ZzKSA+PSAwCisgICAgICAmJiAodW5zaWduZWQgaW50KSBzZnMuZl90eXBlID09IDB4Zjk3Y2ZmOGNVKQorICAgIHJldHVybiAxOworICBmID0gZm9wZW4gKCIvcHJvYy9tb3VudHMiLCAiciIpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHJldHVybiAwOworICB3aGlsZSAoZ2V0bGluZSAoJmJ1ZiwgJmxlbiwgZikgPj0gMCkKKyAgICB7CisgICAgICBjaGFyICpwID0gc3RyY2hyIChidWYsICcgJyk7CisgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICAgIHAgPSBzdHJjaHIgKHAgKyAxLCAnICcpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoc3RybmNtcCAocCArIDEsICJzZWxpbnV4ZnMgIiwgMTApID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmcmVlIChidWYpOworICAgICAgICAgIGZjbG9zZSAoZik7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgIGZyZWUgKGJ1Zik7CisgIGZjbG9zZSAoZik7CisgIHJldHVybiAwOworfQorCisjZGVmaW5lIGlzX3NlbGludXhfZW5hYmxlZCgpIChzZWxpbnV4X2VuYWJsZWQgPj0gMCA/IHNlbGludXhfZW5hYmxlZCBcCisJCQkgICAgICA6IChzZWxpbnV4X2VuYWJsZWQgPSBzZWxpbnV4X2VuYWJsZWRfY2hlY2sgKCkpKQorCisjZWxzZQorCisjZGVmaW5lIGlzX3NlbGludXhfZW5hYmxlZCgpIDAKKworI2VuZGlmIC8qICFGRklfTU1BUF9FWEVDX1NFTElOVVggKi8KKworI2VsaWYgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0lOVEVSSVgpCisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBDeWd3aW4gaXMgTGludXgtbGlrZSwgYnV0IG5vdCBxdWl0ZSB0aGF0IExpbnV4LWxpa2UuICAqLworI2RlZmluZSBpc19zZWxpbnV4X2VuYWJsZWQoKSAwCisKKyNlbmRpZiAvKiAhZGVmaW5lZChYODZfV0lOMzIpICYmICFkZWZpbmVkKFg4Nl9XSU42NCkgKi8KKworLyogRGVjbGFyZSBhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gZGxtYWxsb2MuYyBhcyBzdGF0aWMuICAqLworc3RhdGljIHZvaWQgKmRsbWFsbG9jKHNpemVfdCk7CitzdGF0aWMgdm9pZCBkbGZyZWUodm9pZCopOworc3RhdGljIHZvaWQgKmRsY2FsbG9jKHNpemVfdCwgc2l6ZV90KSBNQVlCRV9VTlVTRUQ7CitzdGF0aWMgdm9pZCAqZGxyZWFsbG9jKHZvaWQgKiwgc2l6ZV90KSBNQVlCRV9VTlVTRUQ7CitzdGF0aWMgdm9pZCAqZGxtZW1hbGlnbihzaXplX3QsIHNpemVfdCkgTUFZQkVfVU5VU0VEOworc3RhdGljIHZvaWQgKmRsdmFsbG9jKHNpemVfdCkgTUFZQkVfVU5VU0VEOworc3RhdGljIGludCBkbG1hbGxvcHQoaW50LCBpbnQpIE1BWUJFX1VOVVNFRDsKK3N0YXRpYyBzaXplX3QgZGxtYWxsb2NfZm9vdHByaW50KHZvaWQpIE1BWUJFX1VOVVNFRDsKK3N0YXRpYyBzaXplX3QgZGxtYWxsb2NfbWF4X2Zvb3RwcmludCh2b2lkKSBNQVlCRV9VTlVTRUQ7CitzdGF0aWMgdm9pZCoqIGRsaW5kZXBlbmRlbnRfY2FsbG9jKHNpemVfdCwgc2l6ZV90LCB2b2lkKiopIE1BWUJFX1VOVVNFRDsKK3N0YXRpYyB2b2lkKiogZGxpbmRlcGVuZGVudF9jb21hbGxvYyhzaXplX3QsIHNpemVfdCosIHZvaWQqKikgTUFZQkVfVU5VU0VEOworc3RhdGljIHZvaWQgKmRscHZhbGxvYyhzaXplX3QpIE1BWUJFX1VOVVNFRDsKK3N0YXRpYyBpbnQgZGxtYWxsb2NfdHJpbShzaXplX3QpIE1BWUJFX1VOVVNFRDsKK3N0YXRpYyBzaXplX3QgZGxtYWxsb2NfdXNhYmxlX3NpemUodm9pZCopIE1BWUJFX1VOVVNFRDsKK3N0YXRpYyB2b2lkIGRsbWFsbG9jX3N0YXRzKHZvaWQpIE1BWUJFX1VOVVNFRDsKKworI2lmICEoZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X1dJTjY0KSB8fCBkZWZpbmVkKF9fT1MyX18pKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fSU5URVJJWCkKKy8qIFVzZSB0aGVzZSBmb3IgbW1hcCBhbmQgbXVubWFwIHdpdGhpbiBkbG1hbGxvYy5jLiAgKi8KK3N0YXRpYyB2b2lkICpkbG1tYXAodm9pZCAqLCBzaXplX3QsIGludCwgaW50LCBpbnQsIG9mZl90KTsKK3N0YXRpYyBpbnQgZGxtdW5tYXAodm9pZCAqLCBzaXplX3QpOworI2VuZGlmIC8qICEoZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X1dJTjY0KSB8fCBkZWZpbmVkKF9fT1MyX18pKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fSU5URVJJWCkgKi8KKworI2RlZmluZSBtbWFwIGRsbW1hcAorI2RlZmluZSBtdW5tYXAgZGxtdW5tYXAKKworI2luY2x1ZGUgImRsbWFsbG9jLmMiCisKKyN1bmRlZiBtbWFwCisjdW5kZWYgbXVubWFwCisKKyNpZiAhKGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKFg4Nl9XSU42NCkgfHwgZGVmaW5lZChfX09TMl9fKSkgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0lOVEVSSVgpCisKKy8qIEEgbXV0ZXggdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gKmV4ZWMqIHZhcmlhYmxlcyBpbiB0aGlzIGZpbGUuICAqLworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBvcGVuX3RlbXBfZXhlY19maWxlX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyogQSBmaWxlIGRlc2NyaXB0b3Igb2YgYSB0ZW1wb3JhcnkgZmlsZSBmcm9tIHdoaWNoIHdlJ2xsIG1hcAorICAgZXhlY3V0YWJsZSBwYWdlcy4gICovCitzdGF0aWMgaW50IGV4ZWNmZCA9IC0xOworCisvKiBUaGUgYW1vdW50IG9mIHNwYWNlIGFscmVhZHkgYWxsb2NhdGVkIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KK3N0YXRpYyBzaXplX3QgZXhlY3NpemUgPSAwOworCisvKiBPcGVuIGEgdGVtcG9yYXJ5IGZpbGUgbmFtZSwgYW5kIGltbWVkaWF0ZWx5IHVubGluayBpdC4gICovCitzdGF0aWMgaW50CitvcGVuX3RlbXBfZXhlY19maWxlX25hbWUgKGNoYXIgKm5hbWUpCit7CisgIGludCBmZCA9IG1rc3RlbXAgKG5hbWUpOworCisgIGlmIChmZCAhPSAtMSkKKyAgICB1bmxpbmsgKG5hbWUpOworCisgIHJldHVybiBmZDsKK30KKworLyogT3BlbiBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBuYW1lZCBkaXJlY3RvcnkuICAqLworc3RhdGljIGludAorb3Blbl90ZW1wX2V4ZWNfZmlsZV9kaXIgKGNvbnN0IGNoYXIgKmRpcikKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgc3VmZml4W10gPSAiL2ZmaVhYWFhYWCI7CisgIGludCBsZW5kaXIgPSBzdHJsZW4gKGRpcik7CisgIGNoYXIgKnRlbXBuYW1lID0gX19idWlsdGluX2FsbG9jYSAobGVuZGlyICsgc2l6ZW9mIChzdWZmaXgpKTsKKworICBpZiAoIXRlbXBuYW1lKQorICAgIHJldHVybiAtMTsKKworICBtZW1jcHkgKHRlbXBuYW1lLCBkaXIsIGxlbmRpcik7CisgIG1lbWNweSAodGVtcG5hbWUgKyBsZW5kaXIsIHN1ZmZpeCwgc2l6ZW9mIChzdWZmaXgpKTsKKworICByZXR1cm4gb3Blbl90ZW1wX2V4ZWNfZmlsZV9uYW1lICh0ZW1wbmFtZSk7Cit9CisKKy8qIE9wZW4gYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGluIHRoZSBuYW1lZCBlbnZpcm9ubWVudAorICAgdmFyaWFibGUuICAqLworc3RhdGljIGludAorb3Blbl90ZW1wX2V4ZWNfZmlsZV9lbnYgKGNvbnN0IGNoYXIgKmVudnZhcikKK3sKKyAgY29uc3QgY2hhciAqdmFsdWUgPSBnZXRlbnYgKGVudnZhcik7CisKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIG9wZW5fdGVtcF9leGVjX2ZpbGVfZGlyICh2YWx1ZSk7Cit9CisKKyNpZmRlZiBIQVZFX01OVEVOVAorLyogT3BlbiBhIHRlbXBvcmFyeSBmaWxlIGluIGFuIGV4ZWN1dGFibGUgYW5kIHdyaXRhYmxlIG1vdW50IHBvaW50CisgICBsaXN0ZWQgaW4gdGhlIG1vdW50cyBmaWxlLiAgU3Vic2VxdWVudCBjYWxscyB3aXRoIHRoZSBzYW1lIG1vdW50cworICAga2VlcCBzZWFyY2hpbmcgZm9yIG1vdW50IHBvaW50cyBpbiB0aGUgc2FtZSBmaWxlLiAgUHJvdmlkaW5nIE5VTEwKKyAgIGFzIHRoZSBtb3VudHMgZmlsZSBjbG9zZXMgdGhlIGZpbGUuICAqLworc3RhdGljIGludAorb3Blbl90ZW1wX2V4ZWNfZmlsZV9tbnQgKGNvbnN0IGNoYXIgKm1vdW50cykKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmxhc3RfbW91bnRzOworICBzdGF0aWMgRklMRSAqbGFzdF9tbnRlbnQ7CisKKyAgaWYgKG1vdW50cyAhPSBsYXN0X21vdW50cykKKyAgICB7CisgICAgICBpZiAobGFzdF9tbnRlbnQpCisJZW5kbW50ZW50IChsYXN0X21udGVudCk7CisKKyAgICAgIGxhc3RfbW91bnRzID0gbW91bnRzOworCisgICAgICBpZiAobW91bnRzKQorCWxhc3RfbW50ZW50ID0gc2V0bW50ZW50IChtb3VudHMsICJyIik7CisgICAgICBlbHNlCisJbGFzdF9tbnRlbnQgPSBOVUxMOworICAgIH0KKworICBpZiAoIWxhc3RfbW50ZW50KQorICAgIHJldHVybiAtMTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGludCBmZDsKKyAgICAgIHN0cnVjdCBtbnRlbnQgbW50OworICAgICAgY2hhciBidWZbTUFYUEFUSExFTiAqIDNdOworCisgICAgICBpZiAoZ2V0bW50ZW50X3IgKGxhc3RfbW50ZW50LCAmbW50LCBidWYsIHNpemVvZiAoYnVmKSkgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKyAgICAgIGlmIChoYXNtbnRvcHQgKCZtbnQsICJybyIpCisJICB8fCBoYXNtbnRvcHQgKCZtbnQsICJub2V4ZWMiKQorCSAgfHwgYWNjZXNzIChtbnQubW50X2RpciwgV19PSykpCisJY29udGludWU7CisKKyAgICAgIGZkID0gb3Blbl90ZW1wX2V4ZWNfZmlsZV9kaXIgKG1udC5tbnRfZGlyKTsKKworICAgICAgaWYgKGZkICE9IC0xKQorCXJldHVybiBmZDsKKyAgICB9Cit9CisjZW5kaWYgLyogSEFWRV9NTlRFTlQgKi8KKworLyogSW5zdHJ1Y3Rpb25zIHRvIGxvb2sgZm9yIGEgbG9jYXRpb24gdG8gaG9sZCBhIHRlbXBvcmFyeSBmaWxlIHRoYXQKKyAgIGNhbiBiZSBtYXBwZWQgaW4gZm9yIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgc3RydWN0Cit7CisgIGludCAoKmZ1bmMpKGNvbnN0IGNoYXIgKik7CisgIGNvbnN0IGNoYXIgKmFyZzsKKyAgaW50IHJlcGVhdDsKK30gb3Blbl90ZW1wX2V4ZWNfZmlsZV9vcHRzW10gPSB7CisgIHsgb3Blbl90ZW1wX2V4ZWNfZmlsZV9lbnYsICJUTVBESVIiLCAwIH0sCisgIHsgb3Blbl90ZW1wX2V4ZWNfZmlsZV9kaXIsICIvdG1wIiwgMCB9LAorICB7IG9wZW5fdGVtcF9leGVjX2ZpbGVfZGlyLCAiL3Zhci90bXAiLCAwIH0sCisgIHsgb3Blbl90ZW1wX2V4ZWNfZmlsZV9kaXIsICIvZGV2L3NobSIsIDAgfSwKKyAgeyBvcGVuX3RlbXBfZXhlY19maWxlX2VudiwgIkhPTUUiLCAwIH0sCisjaWZkZWYgSEFWRV9NTlRFTlQKKyAgeyBvcGVuX3RlbXBfZXhlY19maWxlX21udCwgIi9ldGMvbXRhYiIsIDEgfSwKKyAgeyBvcGVuX3RlbXBfZXhlY19maWxlX21udCwgIi9wcm9jL21vdW50cyIsIDEgfSwKKyNlbmRpZiAvKiBIQVZFX01OVEVOVCAqLworfTsKKworLyogQ3VycmVudCBpbmRleCBpbnRvIG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0cy4gICovCitzdGF0aWMgaW50IG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c19pZHggPSAwOworCisvKiBSZXNldCBhIGN1cnJlbnQgbXVsdGktY2FsbCBmdW5jLCB0aGVuIGFkdmFuY2VzIHRvIHRoZSBuZXh0IGVudHJ5LgorICAgSWYgd2UncmUgYXQgdGhlIGxhc3QsIGdvIGJhY2sgdG8gdGhlIGZpcnN0IGFuZCByZXR1cm4gbm9uemVybywKKyAgIG90aGVyd2lzZSByZXR1cm4gemVyby4gICovCitzdGF0aWMgaW50CitvcGVuX3RlbXBfZXhlY19maWxlX29wdHNfbmV4dCAodm9pZCkKK3sKKyAgaWYgKG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c1tvcGVuX3RlbXBfZXhlY19maWxlX29wdHNfaWR4XS5yZXBlYXQpCisgICAgb3Blbl90ZW1wX2V4ZWNfZmlsZV9vcHRzW29wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c19pZHhdLmZ1bmMgKE5VTEwpOworCisgIG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c19pZHgrKzsKKyAgaWYgKG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c19pZHgKKyAgICAgID09IChzaXplb2YgKG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0cykKKwkgIC8gc2l6ZW9mICgqb3Blbl90ZW1wX2V4ZWNfZmlsZV9vcHRzKSkpCisgICAgeworICAgICAgb3Blbl90ZW1wX2V4ZWNfZmlsZV9vcHRzX2lkeCA9IDA7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBvZiBhIHRlbXBvcmFyeSB6ZXJvLXNpemVkIGZpbGUgaW4gYQorICAgd3JpdGFibGUgYW5kIGV4ZXh1dGFibGUgZmlsZXN5c3RlbS4gICovCitzdGF0aWMgaW50CitvcGVuX3RlbXBfZXhlY19maWxlICh2b2lkKQoreworICBpbnQgZmQ7CisKKyAgZG8KKyAgICB7CisgICAgICBmZCA9IG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c1tvcGVuX3RlbXBfZXhlY19maWxlX29wdHNfaWR4XS5mdW5jCisJKG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c1tvcGVuX3RlbXBfZXhlY19maWxlX29wdHNfaWR4XS5hcmcpOworCisgICAgICBpZiAoIW9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c1tvcGVuX3RlbXBfZXhlY19maWxlX29wdHNfaWR4XS5yZXBlYXQKKwkgIHx8IGZkID09IC0xKQorCXsKKwkgIGlmIChvcGVuX3RlbXBfZXhlY19maWxlX29wdHNfbmV4dCAoKSkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgd2hpbGUgKGZkID09IC0xKTsKKworICByZXR1cm4gZmQ7Cit9CisKKy8qIE1hcCBpbiBhIGNodW5rIG9mIG1lbW9yeSBmcm9tIHRoZSB0ZW1wb3JhcnkgZXhlYyBmaWxlIGludG8gc2VwYXJhdGUKKyAgIGxvY2F0aW9ucyBpbiB0aGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBzcGFjZSwgb25lIHdyaXRhYmxlIGFuZCBvbmUKKyAgIGV4ZWN1dGFibGUuICBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSB3cml0YWJsZSBwb3J0aW9uLCBhZnRlcgorICAgc3RvcmluZyBhbiBvZmZzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZXhlY3V0YWJsZSBwb3J0aW9uIGF0IHRoZQorICAgbGFzdCB3b3JkIG9mIHRoZSByZXF1ZXN0ZWQgY2h1bmsuICAqLworc3RhdGljIHZvaWQgKgorZGxtbWFwX2xvY2tlZCAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LCBpbnQgZmxhZ3MsIG9mZl90IG9mZnNldCkKK3sKKyAgdm9pZCAqcHRyOworCisgIGlmIChleGVjZmQgPT0gLTEpCisgICAgeworICAgICAgb3Blbl90ZW1wX2V4ZWNfZmlsZV9vcHRzX2lkeCA9IDA7CisgICAgcmV0cnlfb3BlbjoKKyAgICAgIGV4ZWNmZCA9IG9wZW5fdGVtcF9leGVjX2ZpbGUgKCk7CisgICAgICBpZiAoZXhlY2ZkID09IC0xKQorCXJldHVybiBNRkFJTDsKKyAgICB9CisKKyAgb2Zmc2V0ID0gZXhlY3NpemU7CisKKyAgaWYgKGZ0cnVuY2F0ZSAoZXhlY2ZkLCBvZmZzZXQgKyBsZW5ndGgpKQorICAgIHJldHVybiBNRkFJTDsKKworICBmbGFncyAmPSB+KE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUyk7CisgIGZsYWdzIHw9IE1BUF9TSEFSRUQ7CisKKyAgcHRyID0gbW1hcCAoTlVMTCwgbGVuZ3RoLCAocHJvdCAmIH5QUk9UX1dSSVRFKSB8IFBST1RfRVhFQywKKwkgICAgICBmbGFncywgZXhlY2ZkLCBvZmZzZXQpOworICBpZiAocHRyID09IE1GQUlMKQorICAgIHsKKyAgICAgIGlmICghb2Zmc2V0KQorCXsKKwkgIGNsb3NlIChleGVjZmQpOworCSAgZ290byByZXRyeV9vcGVuOworCX0KKyAgICAgIGZ0cnVuY2F0ZSAoZXhlY2ZkLCBvZmZzZXQpOworICAgICAgcmV0dXJuIE1GQUlMOworICAgIH0KKyAgZWxzZSBpZiAoIW9mZnNldAorCSAgICYmIG9wZW5fdGVtcF9leGVjX2ZpbGVfb3B0c1tvcGVuX3RlbXBfZXhlY19maWxlX29wdHNfaWR4XS5yZXBlYXQpCisgICAgb3Blbl90ZW1wX2V4ZWNfZmlsZV9vcHRzX25leHQgKCk7CisKKyAgc3RhcnQgPSBtbWFwIChzdGFydCwgbGVuZ3RoLCBwcm90LCBmbGFncywgZXhlY2ZkLCBvZmZzZXQpOworCisgIGlmIChzdGFydCA9PSBNRkFJTCkKKyAgICB7CisgICAgICBtdW5tYXAgKHB0ciwgbGVuZ3RoKTsKKyAgICAgIGZ0cnVuY2F0ZSAoZXhlY2ZkLCBvZmZzZXQpOworICAgICAgcmV0dXJuIHN0YXJ0OworICAgIH0KKworICBtbWFwX2V4ZWNfb2Zmc2V0ICgoY2hhciAqKXN0YXJ0LCBsZW5ndGgpID0gKGNoYXIqKXB0ciAtIChjaGFyKilzdGFydDsKKworICBleGVjc2l6ZSArPSBsZW5ndGg7CisKKyAgcmV0dXJuIHN0YXJ0OworfQorCisvKiBNYXAgaW4gYSB3cml0YWJsZSBhbmQgZXhlY3V0YWJsZSBjaHVuayBvZiBtZW1vcnkgaWYgcG9zc2libGUuCisgICBGYWlsaW5nIHRoYXQsIGZhbGwgYmFjayB0byBkbG1tYXBfbG9ja2VkLiAgKi8KK3N0YXRpYyB2b2lkICoKK2RsbW1hcCAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LAorCWludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpCit7CisgIHZvaWQgKnB0cjsKKworICBhc3NlcnQgKHN0YXJ0ID09IE5VTEwgJiYgbGVuZ3RoICUgbWFsbG9jX2dldHBhZ2VzaXplID09IDAKKwkgICYmIHByb3QgPT0gKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpCisJICAmJiBmbGFncyA9PSAoTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTKQorCSAgJiYgZmQgPT0gLTEgJiYgb2Zmc2V0ID09IDApOworCisjaWYgRkZJX0NMT1NVUkVfVEVTVAorICBwcmludGYgKCJtYXBwaW5nIGluICV6aVxuIiwgbGVuZ3RoKTsKKyNlbmRpZgorCisgIGlmIChleGVjZmQgPT0gLTEgJiYgIWlzX3NlbGludXhfZW5hYmxlZCAoKSkKKyAgICB7CisgICAgICBwdHIgPSBtbWFwIChzdGFydCwgbGVuZ3RoLCBwcm90IHwgUFJPVF9FWEVDLCBmbGFncywgZmQsIG9mZnNldCk7CisKKyAgICAgIGlmIChwdHIgIT0gTUZBSUwgfHwgKGVycm5vICE9IEVQRVJNICYmIGVycm5vICE9IEVBQ0NFUykpCisJLyogQ29vbCwgbm8gbmVlZCB0byBtZXNzIHdpdGggc2VwYXJhdGUgc2VnbWVudHMuICAqLworCXJldHVybiBwdHI7CisKKyAgICAgIC8qIElmIE1SRU1BUF9EVVAgaXMgZXZlciBpbnRyb2R1Y2VkIGFuZCBpbXBsZW1lbnRlZCwgdHJ5IG1tYXAKKwkgd2l0aCAoKHByb3QgJiB+UFJPVF9XUklURSkgfCBQUk9UX0VYRUMpIGFuZCBtcmVtYXAgd2l0aAorCSBNUkVNQVBfRFVQIGFuZCBwcm90IGF0IHRoaXMgcG9pbnQuICAqLworICAgIH0KKworICBpZiAoZXhlY3NpemUgPT0gMCB8fCBleGVjZmQgPT0gLTEpCisgICAgeworICAgICAgcHRocmVhZF9tdXRleF9sb2NrICgmb3Blbl90ZW1wX2V4ZWNfZmlsZV9tdXRleCk7CisgICAgICBwdHIgPSBkbG1tYXBfbG9ja2VkIChzdGFydCwgbGVuZ3RoLCBwcm90LCBmbGFncywgb2Zmc2V0KTsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmb3Blbl90ZW1wX2V4ZWNfZmlsZV9tdXRleCk7CisKKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisgIHJldHVybiBkbG1tYXBfbG9ja2VkIChzdGFydCwgbGVuZ3RoLCBwcm90LCBmbGFncywgb2Zmc2V0KTsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcKKyAgIGV4ZWN1dGFibGUgcGFnZSBpZiBpdCdzIHNlcGFyYXRlLiAgKi8KK3N0YXRpYyBpbnQKK2RsbXVubWFwICh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgLyogV2UgZG9uJ3QgYm90aGVyIGRlY3JlYXNpbmcgZXhlY3NpemUgb3IgdHJ1bmNhdGluZyB0aGUgZmlsZSwgc2luY2UKKyAgICAgd2UgY2FuJ3QgcXVpdGUgdGVsbCB3aGV0aGVyIHdlJ3JlIHVubWFwcGluZyB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgICBXZSBkb24ndCBleHBlY3QgZnJlcXVlbnQgZGVhbGxvY2F0aW9uIGFueXdheS4gIElmIHdlIGRpZCwgd2UKKyAgICAgY291bGQgbG9jYXRlIHBhZ2VzIGluIHRoZSBmaWxlIGJ5IHdyaXRpbmcgdG8gdGhlIHBhZ2VzIGJlaW5nCisgICAgIGRlYWxsb2NhdGVkIGFuZCBjaGVja2luZyB0aGF0IHRoZSBmaWxlIGNvbnRlbnRzIGNoYW5nZS4KKyAgICAgWXVjay4gICovCisgIG1zZWdtZW50cHRyIHNlZyA9IHNlZ21lbnRfaG9sZGluZyAoZ20sIHN0YXJ0KTsKKyAgdm9pZCAqY29kZTsKKworI2lmIEZGSV9DTE9TVVJFX1RFU1QKKyAgcHJpbnRmICgidW5tYXBwaW5nICV6aVxuIiwgbGVuZ3RoKTsKKyNlbmRpZgorCisgIGlmIChzZWcgJiYgKGNvZGUgPSBhZGRfc2VnbWVudF9leGVjX29mZnNldCAoc3RhcnQsIHNlZykpICE9IHN0YXJ0KQorICAgIHsKKyAgICAgIGludCByZXQgPSBtdW5tYXAgKGNvZGUsIGxlbmd0aCk7CisgICAgICBpZiAocmV0KQorCXJldHVybiByZXQ7CisgICAgfQorCisgIHJldHVybiBtdW5tYXAgKHN0YXJ0LCBsZW5ndGgpOworfQorCisjaWYgRkZJX0NMT1NVUkVfRlJFRV9DT0RFCisvKiBSZXR1cm4gc2VnbWVudCBob2xkaW5nIGdpdmVuIGNvZGUgYWRkcmVzcy4gICovCitzdGF0aWMgbXNlZ21lbnRwdHIKK3NlZ21lbnRfaG9sZGluZ19jb2RlIChtc3RhdGUgbSwgY2hhciogYWRkcikKK3sKKyAgbXNlZ21lbnRwdHIgc3AgPSAmbS0+c2VnOworICBmb3IgKDs7KSB7CisgICAgaWYgKGFkZHIgPj0gYWRkX3NlZ21lbnRfZXhlY19vZmZzZXQgKHNwLT5iYXNlLCBzcCkKKwkmJiBhZGRyIDwgYWRkX3NlZ21lbnRfZXhlY19vZmZzZXQgKHNwLT5iYXNlLCBzcCkgKyBzcC0+c2l6ZSkKKyAgICAgIHJldHVybiBzcDsKKyAgICBpZiAoKHNwID0gc3AtPm5leHQpID09IDApCisgICAgICByZXR1cm4gMDsKKyAgfQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhKGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKFg4Nl9XSU42NCkgfHwgZGVmaW5lZChfX09TMl9fKSkgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0lOVEVSSVgpICovCisKKy8qIEFsbG9jYXRlIGEgY2h1bmsgb2YgbWVtb3J5IHdpdGggdGhlIGdpdmVuIHNpemUuICBSZXR1cm5zIGEgcG9pbnRlcgorICAgdG8gdGhlIHdyaXRhYmxlIGFkZHJlc3MsIGFuZCBzZXRzICpDT0RFIHRvIHRoZSBleGVjdXRhYmxlCisgICBjb3JyZXNwb25kaW5nIHZpcnR1YWwgYWRkcmVzcy4gICovCit2b2lkICoKK2ZmaV9jbG9zdXJlX2FsbG9jIChzaXplX3Qgc2l6ZSwgdm9pZCAqKmNvZGUpCit7CisgIHZvaWQgKnB0cjsKKworICBpZiAoIWNvZGUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcHRyID0gZGxtYWxsb2MgKHNpemUpOworCisgIGlmIChwdHIpCisgICAgeworICAgICAgbXNlZ21lbnRwdHIgc2VnID0gc2VnbWVudF9ob2xkaW5nIChnbSwgcHRyKTsKKworICAgICAgKmNvZGUgPSBhZGRfc2VnbWVudF9leGVjX29mZnNldCAocHRyLCBzZWcpOworICAgIH0KKworICByZXR1cm4gcHRyOworfQorCisvKiBSZWxlYXNlIGEgY2h1bmsgb2YgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIGZmaV9jbG9zdXJlX2FsbG9jLiAgSWYKKyAgIEZGSV9DTE9TVVJFX0ZSRUVfQ09ERSBpcyBub256ZXJvLCB0aGUgZ2l2ZW4gYWRkcmVzcyBjYW4gYmUgdGhlCisgICB3cml0YWJsZSBvciB0aGUgZXhlY3V0YWJsZSBhZGRyZXNzIGdpdmVuLiAgT3RoZXJ3aXNlLCBvbmx5IHRoZQorICAgd3JpdGFibGUgYWRkcmVzcyBjYW4gYmUgcHJvdmlkZWQgaGVyZS4gICovCit2b2lkCitmZmlfY2xvc3VyZV9mcmVlICh2b2lkICpwdHIpCit7CisjaWYgRkZJX0NMT1NVUkVfRlJFRV9DT0RFCisgIG1zZWdtZW50cHRyIHNlZyA9IHNlZ21lbnRfaG9sZGluZ19jb2RlIChnbSwgcHRyKTsKKworICBpZiAoc2VnKQorICAgIHB0ciA9IHN1Yl9zZWdtZW50X2V4ZWNfb2Zmc2V0IChwdHIsIHNlZyk7CisjZW5kaWYKKworICBkbGZyZWUgKHB0cik7Cit9CisKKworI2lmIEZGSV9DTE9TVVJFX1RFU1QKKy8qIERvIHNvbWUgaW50ZXJuYWwgc2FuaXR5IHRlc3RpbmcgdG8gbWFrZSBzdXJlIGFsbG9jYXRpb24gYW5kCisgICBkZWFsbG9jYXRpb24gb2YgcGFnZXMgYXJlIHdvcmtpbmcgYXMgaW50ZW5kZWQuICAqLworaW50IG1haW4gKCkKK3sKKyAgdm9pZCAqcFszXTsKKyNkZWZpbmUgR0VUKGlkeCwgbGVuKSBkbyB7IHBbaWR4XSA9IGRsbWFsbG9jIChsZW4pOyBwcmludGYgKCJhbGxvY2F0ZWQgJXppIGZvciBwWyVpXVxuIiwgKGxlbiksIChpZHgpKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUFVUKGlkeCkgZG8geyBwcmludGYgKCJmcmVlaW5nIHBbJWldXG4iLCAoaWR4KSk7IGRsZnJlZSAocFtpZHhdKTsgfSB3aGlsZSAoMCkKKyAgR0VUICgwLCBtYWxsb2NfZ2V0cGFnZXNpemUgLyAyKTsKKyAgR0VUICgxLCAyICogbWFsbG9jX2dldHBhZ2VzaXplIC0gNjQgKiBzaXplb2YgKHZvaWQqKSk7CisgIFBVVCAoMSk7CisgIEdFVCAoMSwgMiAqIG1hbGxvY19nZXRwYWdlc2l6ZSk7CisgIEdFVCAoMiwgbWFsbG9jX2dldHBhZ2VzaXplIC8gMik7CisgIFBVVCAoMSk7CisgIFBVVCAoMCk7CisgIFBVVCAoMik7CisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIEZGSV9DTE9TVVJFX1RFU1QgKi8KKyMgZWxzZSAvKiAhIEZGSV9NTUFQX0VYRUNfV1JJVCAqLworCisvKiBPbiBtYW55IHN5c3RlbXMsIG1lbW9yeSByZXR1cm5lZCBieSBtYWxsb2MgaXMgd3JpdGFibGUgYW5kCisgICBleGVjdXRhYmxlLCBzbyBqdXN0IHVzZSBpdC4gICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordm9pZCAqCitmZmlfY2xvc3VyZV9hbGxvYyAoc2l6ZV90IHNpemUsIHZvaWQgKipjb2RlKQoreworICBpZiAoIWNvZGUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuICpjb2RlID0gbWFsbG9jIChzaXplKTsKK30KKwordm9pZAorZmZpX2Nsb3N1cmVfZnJlZSAodm9pZCAqcHRyKQoreworICBmcmVlIChwdHIpOworfQorCisjIGVuZGlmIC8qICEgRkZJX01NQVBfRVhFQ19XUklUICovCisjZW5kaWYgLyogRkZJX0NMT1NVUkVTICovCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2NyaXMvZmZpLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2NyaXMvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1ZDdiNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvY3Jpcy9mZmkuYwpAQCAtMCwwICsxLDM4MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk4IEN5Z251cyBTb2x1dGlvbnMKKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IFNpbW9uIFBvc25qYWsKKwkgICBDb3B5cmlnaHQgKGMpIDIwMDUgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorCSAgIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgQ1JJUyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFNJTU9OIFBPU05KQUsgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjZGVmaW5lIFNUQUNLX0FSR19TSVpFKHgpIEFMSUdOKHgsIEZGSV9TSVpFT0ZfQVJHKQorCitzdGF0aWMgZmZpX3N0YXR1cworaW5pdGlhbGl6ZV9hZ2dyZWdhdGVfcGFja2VkX3N0cnVjdCAoZmZpX3R5cGUgKiBhcmcpCit7CisgIGZmaV90eXBlICoqcHRyOworCisgIEZGSV9BU1NFUlQgKGFyZyAhPSBOVUxMKTsKKworICBGRklfQVNTRVJUIChhcmctPmVsZW1lbnRzICE9IE5VTEwpOworICBGRklfQVNTRVJUIChhcmctPnNpemUgPT0gMCk7CisgIEZGSV9BU1NFUlQgKGFyZy0+YWxpZ25tZW50ID09IDApOworCisgIHB0ciA9ICYoYXJnLT5lbGVtZW50c1swXSk7CisKKyAgd2hpbGUgKCgqcHRyKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgoKCpwdHIpLT5zaXplID09IDApCisJICAmJiAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGVfcGFja2VkX3N0cnVjdCAoKCpwdHIpKSAhPSBGRklfT0spKQorCXJldHVybiBGRklfQkFEX1RZUEVERUY7CisKKyAgICAgIEZGSV9BU1NFUlQgKGZmaV90eXBlX3Rlc3QgKCgqcHRyKSkpOworCisgICAgICBhcmctPnNpemUgKz0gKCpwdHIpLT5zaXplOworCisgICAgICBhcmctPmFsaWdubWVudCA9IChhcmctPmFsaWdubWVudCA+ICgqcHRyKS0+YWxpZ25tZW50KSA/CisJYXJnLT5hbGlnbm1lbnQgOiAoKnB0ciktPmFsaWdubWVudDsKKworICAgICAgcHRyKys7CisgICAgfQorCisgIGlmIChhcmctPnNpemUgPT0gMCkKKyAgICByZXR1cm4gRkZJX0JBRF9UWVBFREVGOworICBlbHNlCisgICAgcmV0dXJuIEZGSV9PSzsKK30KKworaW50CitmZmlfcHJlcF9hcmdzIChjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICogZWNpZikKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBzdHJ1Y3RfY291bnQgPSAwOworICB2b2lkICoqcF9hcmd2OworICBjaGFyICphcmdwOworICBmZmlfdHlwZSAqKnBfYXJnOworCisgIGFyZ3AgPSBzdGFjazsKKworICBwX2FyZ3YgPSBlY2lmLT5hdmFsdWU7CisKKyAgZm9yIChpID0gZWNpZi0+Y2lmLT5uYXJncywgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsKKyAgICAgICAoaSAhPSAwKTsgaS0tLCBwX2FyZysrKQorICAgIHsKKyAgICAgIHNpemVfdCB6OworCisgICAgICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIHsKKwkgICAgeiA9ICgqcF9hcmcpLT5zaXplOworCSAgICBpZiAoeiA8PSA0KQorCSAgICAgIHsKKwkJbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKwkJeiA9IDQ7CisJICAgICAgfQorCSAgICBlbHNlIGlmICh6IDw9IDgpCisJICAgICAgeworCQltZW1jcHkgKGFyZ3AsICpwX2FyZ3YsIHopOworCQl6ID0gODsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCXVuc2lnbmVkIGludCB1aUxvY09uU3RhY2s7CisJCXogPSBzaXplb2YgKHZvaWQgKik7CisJCXVpTG9jT25TdGFjayA9IDQgKiBlY2lmLT5jaWYtPm5hcmdzICsgc3RydWN0X2NvdW50OworCQlzdHJ1Y3RfY291bnQgPSBzdHJ1Y3RfY291bnQgKyAoKnBfYXJnKS0+c2l6ZTsKKwkJKih1bnNpZ25lZCBpbnQgKikgYXJncCA9CisJCSAgKHVuc2lnbmVkIGludCkgKFVJTlQzMiAqKSAoc3RhY2sgKyB1aUxvY09uU3RhY2spOworCQltZW1jcHkgKChzdGFjayArIHVpTG9jT25TdGFjayksICpwX2FyZ3YsICgqcF9hcmcpLT5zaXplKTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorCWRlZmF1bHQ6CisJICB6ID0gKCpwX2FyZyktPnNpemU7CisJICBpZiAoeiA8IHNpemVvZiAoaW50KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJCXsKKwkJY2FzZSBGRklfVFlQRV9TSU5UODoKKwkJICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSAqKFNJTlQ4ICopICgqcF9hcmd2KTsKKwkJICBicmVhazsKKworCQljYXNlIEZGSV9UWVBFX1VJTlQ4OgorCQkgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPQorCQkgICAgKHVuc2lnbmVkIGludCkgKihVSU5UOCAqKSAoKnBfYXJndik7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJCSAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAoc2lnbmVkIGludCkgKihTSU5UMTYgKikgKCpwX2FyZ3YpOworCQkgIGJyZWFrOworCisJCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCQkgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPQorCQkgICAgKHVuc2lnbmVkIGludCkgKihVSU5UMTYgKikgKCpwX2FyZ3YpOworCQkgIGJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgRkZJX0FTU0VSVCAoMCk7CisJCX0KKwkgICAgICB6ID0gc2l6ZW9mIChpbnQpOworCSAgICB9CisJICBlbHNlIGlmICh6ID09IHNpemVvZiAoaW50KSkKKwkgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpICooVUlOVDMyICopICgqcF9hcmd2KTsKKwkgIGVsc2UKKwkgICAgbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHBfYXJndisrOworICAgICAgYXJncCArPSB6OworICAgIH0KKworICByZXR1cm4gKHN0cnVjdF9jb3VudCk7Cit9CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2NpZiAoZmZpX2NpZiAqIGNpZiwKKwkgICAgICBmZmlfYWJpIGFiaSwgdW5zaWduZWQgaW50IG5hcmdzLAorCSAgICAgIGZmaV90eXBlICogcnR5cGUsIGZmaV90eXBlICoqIGF0eXBlcykKK3sKKyAgdW5zaWduZWQgYnl0ZXMgPSAwOworICB1bnNpZ25lZCBpbnQgaTsKKyAgZmZpX3R5cGUgKipwdHI7CisKKyAgRkZJX0FTU0VSVCAoY2lmICE9IE5VTEwpOworICBGRklfQVNTRVJUIChhYmkgPiBGRklfRklSU1RfQUJJICYmIGFiaSA8IEZGSV9MQVNUX0FCSSk7CisKKyAgY2lmLT5hYmkgPSBhYmk7CisgIGNpZi0+YXJnX3R5cGVzID0gYXR5cGVzOworICBjaWYtPm5hcmdzID0gbmFyZ3M7CisgIGNpZi0+cnR5cGUgPSBydHlwZTsKKworICBjaWYtPmZsYWdzID0gMDsKKworICBpZiAoKGNpZi0+cnR5cGUtPnNpemUgPT0gMCkKKyAgICAgICYmIChpbml0aWFsaXplX2FnZ3JlZ2F0ZV9wYWNrZWRfc3RydWN0IChjaWYtPnJ0eXBlKSAhPSBGRklfT0spKQorICAgIHJldHVybiBGRklfQkFEX1RZUEVERUY7CisKKyAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFIChjaWYtPnJ0eXBlKTsKKworICBmb3IgKHB0ciA9IGNpZi0+YXJnX3R5cGVzLCBpID0gY2lmLT5uYXJnczsgaSA+IDA7IGktLSwgcHRyKyspCisgICAgeworICAgICAgaWYgKCgoKnB0ciktPnNpemUgPT0gMCkKKwkgICYmIChpbml0aWFsaXplX2FnZ3JlZ2F0ZV9wYWNrZWRfc3RydWN0ICgoKnB0cikpICE9IEZGSV9PSykpCisJcmV0dXJuIEZGSV9CQURfVFlQRURFRjsKKworICAgICAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFICgqcHRyKTsKKworICAgICAgaWYgKCgoKnB0ciktPmFsaWdubWVudCAtIDEpICYgYnl0ZXMpCisJYnl0ZXMgPSBBTElHTiAoYnl0ZXMsICgqcHRyKS0+YWxpZ25tZW50KTsKKyAgICAgIGlmICgoKnB0ciktPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorCXsKKwkgIGlmICgoKnB0ciktPnNpemUgPiA4KQorCSAgICB7CisJICAgICAgYnl0ZXMgKz0gKCpwdHIpLT5zaXplOworCSAgICAgIGJ5dGVzICs9IHNpemVvZiAodm9pZCAqKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCgqcHRyKS0+c2l6ZSA+IDQpCisJCWJ5dGVzICs9IDg7CisJICAgICAgZWxzZQorCQlieXRlcyArPSA0OworCSAgICB9CisJfQorICAgICAgZWxzZQorCWJ5dGVzICs9IFNUQUNLX0FSR19TSVpFICgoKnB0ciktPnNpemUpOworICAgIH0KKworICBjaWYtPmJ5dGVzID0gYnl0ZXM7CisKKyAgcmV0dXJuIGZmaV9wcmVwX2NpZl9tYWNoZGVwIChjaWYpOworfQorCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jaWZfbWFjaGRlcCAoZmZpX2NpZiAqIGNpZikKK3sKKyAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKyAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKyAgICAgIGNpZi0+ZmxhZ3MgPSAodW5zaWduZWQpIGNpZi0+cnR5cGUtPnR5cGU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfSU5UOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBGRklfT0s7Cit9CisKK2V4dGVybiB2b2lkIGZmaV9jYWxsX1NZU1YgKGludCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksCisJCQkgICBleHRlbmRlZF9jaWYgKiwKKwkJCSAgIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQgKiwgdm9pZCAoKmZuKSAoKSkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fICgiaGlkZGVuIikpKTsKKwordm9pZAorZmZpX2NhbGwgKGZmaV9jaWYgKiBjaWYsIHZvaWQgKCpmbikgKCksIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZSkKK3sKKyAgZXh0ZW5kZWRfY2lmIGVjaWY7CisKKyAgZWNpZi5jaWYgPSBjaWY7CisgIGVjaWYuYXZhbHVlID0gYXZhbHVlOworCisgIGlmICgocnZhbHVlID09IE5VTEwpICYmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkpCisgICAgeworICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EgKGNpZi0+cnR5cGUtPnNpemUpOworICAgIH0KKyAgZWxzZQorICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOworCisgIHN3aXRjaCAoY2lmLT5hYmkpCisgICAgeworICAgIGNhc2UgRkZJX1NZU1Y6CisgICAgICBmZmlfY2FsbF9TWVNWIChmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywKKwkJICAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQgKDApOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBCZWNhdXNlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBub3QgZXhwb3J0ZWQgb3V0c2lkZSBsaWJmZmksIHdlCisgICBtYXJrIHRoZW0gaGlkZGVuLiAgKi8KKworLyogQXNzZW1ibHkgY29kZSBmb3IgdGhlIGp1bXAgc3R1Yi4gICovCitleHRlcm4gY29uc3QgY2hhciBmZmlfY3Jpc190cmFtcG9saW5lX3RlbXBsYXRlW10KKyBfX2F0dHJpYnV0ZV9fICgoX192aXNpYmlsaXR5X18gKCJoaWRkZW4iKSkpOworCisvKiBPZmZzZXQgaW50byBmZmlfY3Jpc190cmFtcG9saW5lX3RlbXBsYXRlIG9mIHdoZXJlIHRvIHB1dCB0aGUKKyAgIGZmaV9wcmVwX2Nsb3N1cmVfaW5uZXIgZnVuY3Rpb24uICAqLworZXh0ZXJuIGNvbnN0IGludCBmZmlfY3Jpc190cmFtcG9saW5lX2ZuX29mZnNldAorIF9fYXR0cmlidXRlX18gKChfX3Zpc2liaWxpdHlfXyAoImhpZGRlbiIpKSk7CisKKy8qIE9mZnNldCBpbnRvIGZmaV9jcmlzX3RyYW1wb2xpbmVfdGVtcGxhdGUgb2Ygd2hlcmUgdG8gcHV0IHRoZQorICAgY2xvc3VyZSBkYXRhLiAgKi8KK2V4dGVybiBjb25zdCBpbnQgZmZpX2NyaXNfdHJhbXBvbGluZV9jbG9zdXJlX29mZnNldAorIF9fYXR0cmlidXRlX18gKChfX3Zpc2liaWxpdHlfXyAoImhpZGRlbiIpKSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgc2libGluZy1jYWxsZWQgKGp1bXBlZCB0bykgYnkgdGhlIGNsb3N1cmUKKyAgIHRyYW1wb2xpbmUuICBXZSBnZXQgUjEwLi5SMTMgYXQgUEFSQU1TWzAuLjNdIGFuZCBhIGNvcHkgb2YgW1NQXSBhdAorICAgUEFSQU1TWzRdIHRvIHNpbXBsaWZ5IGhhbmRsaW5nIG9mIGEgc3RyYWRkbGluZyBwYXJhbWV0ZXIuICBBIGNvcHkKKyAgIG9mIFI5IGlzIGF0IFBBUkFNU1s1XSBhbmQgU1AgYXQgUEFSQU1TWzZdLiAgVGhlc2UgcGFyYW1ldGVycyBhcmUKKyAgIHB1dCBhdCB0aGUgYXBwcm9wcmlhdGUgcGxhY2UgaW4gQ0xPU1VSRSB3aGljaCBpcyB0aGVuIGV4ZWN1dGVkIGFuZAorICAgdGhlIHJldHVybiB2YWx1ZSBpcyBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZworZmZpX3ByZXBfY2xvc3VyZV9pbm5lciAodm9pZCAqKnBhcmFtcywgZmZpX2Nsb3N1cmUqIGNsb3N1cmUpCit7CisgIGNoYXIgKnJlZ2lzdGVyX2FyZ3MgPSAoY2hhciAqKSBwYXJhbXM7CisgIHZvaWQgKnN0cnVjdF9yZXQgPSBwYXJhbXNbNV07CisgIGNoYXIgKnN0YWNrX2FyZ3MgPSBwYXJhbXNbNl07CisgIGNoYXIgKnB0ciA9IHJlZ2lzdGVyX2FyZ3M7CisgIGZmaV9jaWYgKmNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgZmZpX3R5cGUgKiphcmdfdHlwZXMgPSBjaWYtPmFyZ190eXBlczsKKworICAvKiBNYXggcm9vbSBuZWVkZWQgaXMgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcyA2NC1iaXQgdmFsdWVzLiAgKi8KKyAgdm9pZCAqKmF2YWx1ZSA9IGFsbG9jYSAoY2xvc3VyZS0+Y2lmLT5uYXJncyAqIHNpemVvZih2b2lkICopKTsKKyAgaW50IGk7CisgIGludCBkb2luZ19yZWdzOworICBsb25nIGxvbmcgbGxyZXQgPSAwOworCisgIC8qIEZpbmQgdGhlIGFkZHJlc3Mgb2YgZWFjaCBhcmd1bWVudC4gICovCisgIGZvciAoaSA9IDAsIGRvaW5nX3JlZ3MgPSAxOyBpIDwgY2lmLT5uYXJnczsgaSsrKQorICAgIHsKKyAgICAgIC8qIFR5cGVzIHVwIHRvIGFuZCBpbmNsdWRpbmcgOCBieXRlcyBnbyBieS12YWx1ZS4gICovCisgICAgICBpZiAoYXJnX3R5cGVzW2ldLT5zaXplIDw9IDQpCisJeworCSAgYXZhbHVlW2ldID0gcHRyOworCSAgcHRyICs9IDQ7CisJfQorICAgICAgZWxzZSBpZiAoYXJnX3R5cGVzW2ldLT5zaXplIDw9IDgpCisJeworCSAgYXZhbHVlW2ldID0gcHRyOworCSAgcHRyICs9IDg7CisJfQorICAgICAgZWxzZQorCXsKKwkgIEZGSV9BU1NFUlQgKGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpOworCisJICAvKiBQYXNzZWQgYnktcmVmZXJlbmNlLCBzbyBjb3B5IHRoZSBwb2ludGVyLiAgKi8KKwkgIGF2YWx1ZVtpXSA9ICoodm9pZCAqKikgcHRyOworCSAgcHRyICs9IDQ7CisJfQorCisgICAgICAvKiBJZiB3ZSd2ZSBoYW5kbGVkIG1vcmUgYXJndW1lbnRzIHRoYW4gZml0IGluIHJlZ2lzdGVycywgc3RhcnQKKwkgbG9va2luZyBhdCB0aGUgdGhvc2UgcGFzc2VkIG9uIHRoZSBzdGFjay4gIFN0ZXAgb3ZlciB0aGUKKwkgZmlyc3Qgb25lIGlmIHdlIGhhZCBhIHN0cmFkZGxpbmcgcGFyYW1ldGVyLiAgKi8KKyAgICAgIGlmIChkb2luZ19yZWdzICYmIHB0ciA+PSByZWdpc3Rlcl9hcmdzICsgNCo0KQorCXsKKwkgIHB0ciA9IHN0YWNrX2FyZ3MgKyAoKHB0ciA+IHJlZ2lzdGVyX2FyZ3MgKyA0KjQpID8gNCA6IDApOworCSAgZG9pbmdfcmVncyA9IDA7CisJfQorICAgIH0KKworICAvKiBJbnZva2UgdGhlIGNsb3N1cmUuICAqLworICAoY2xvc3VyZS0+ZnVuKSAoY2lmLAorCisJCSAgY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKKwkJICAvKiBUaGUgY2FsbGVyIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIHJldHVybgorCQkgICAgIHN0cnVjdHVyZSwgYW5kIHBhc3NlZCBhIHBvaW50ZXIgdG8gdGhpcyBzcGFjZSBpbgorCQkgICAgIFI5LiAgKi8KKwkJICA/IHN0cnVjdF9yZXQKKworCQkgIC8qIFdlIHRha2UgYWR2YW50YWdlIG9mIGJlaW5nIGFibGUgdG8gaWdub3JlIHRoYXQKKwkJICAgICB0aGUgaGlnaCBwYXJ0IGlzbid0IHNldCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzCisJCSAgICAgbm90IGluIFIxMDpSMTEsIGJ1dCBpbiBSMTAgb25seS4gICovCisJCSAgOiAodm9pZCAqKSAmbGxyZXQsCisKKwkJICBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgcmV0dXJuIGxscmV0OworfQorCisvKiBBUEkgZnVuY3Rpb246IFByZXBhcmUgdGhlIHRyYW1wb2xpbmUuICAqLworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqIGNsb3N1cmUsCisJCSAgICAgIGZmaV9jaWYqIGNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiAqLCB2b2lkICosIHZvaWQgKiosIHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkgICAgICB2b2lkICpjb2RlbG9jKQoreworICB2b2lkICppbm5lcmZuID0gZmZpX3ByZXBfY2xvc3VyZV9pbm5lcjsKKyAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpOworICBjbG9zdXJlLT5jaWYgID0gY2lmOworICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIGNsb3N1cmUtPmZ1biAgPSBmdW47CisgIG1lbWNweSAoY2xvc3VyZS0+dHJhbXAsIGZmaV9jcmlzX3RyYW1wb2xpbmVfdGVtcGxhdGUsCisJICBGRklfQ1JJU19UUkFNUE9MSU5FX0NPREVfUEFSVF9TSVpFKTsKKyAgbWVtY3B5IChjbG9zdXJlLT50cmFtcCArIGZmaV9jcmlzX3RyYW1wb2xpbmVfZm5fb2Zmc2V0LAorCSAgJmlubmVyZm4sIHNpemVvZiAodm9pZCAqKSk7CisgIG1lbWNweSAoY2xvc3VyZS0+dHJhbXAgKyBmZmlfY3Jpc190cmFtcG9saW5lX2Nsb3N1cmVfb2Zmc2V0LAorCSAgJmNvZGVsb2MsIHNpemVvZiAodm9pZCAqKSk7CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvY3Jpcy9mZml0YXJnZXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvY3Jpcy9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTM3MDVkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9jcmlzL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIENSSVMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKKyNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICisKKyNpZm5kZWYgTElCRkZJX0FTTQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7Cit0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CisKK3R5cGVkZWYgZW51bSBmZmlfYWJpIHsKKyAgRkZJX0ZJUlNUX0FCSSA9IDAsCisgIEZGSV9TWVNWLAorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWCit9IGZmaV9hYmk7CisjZW5kaWYKKworLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgY2xvc3VyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGRklfQ0xPU1VSRVMgMQorI2RlZmluZSBGRklfQ1JJU19UUkFNUE9MSU5FX0NPREVfUEFSVF9TSVpFIDM2CisjZGVmaW5lIEZGSV9DUklTX1RSQU1QT0xJTkVfREFUQV9QQVJUX1NJWkUgKDcqNCkKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSBcCisgKEZGSV9DUklTX1RSQU1QT0xJTkVfQ09ERV9QQVJUX1NJWkUgKyBGRklfQ1JJU19UUkFNUE9MSU5FX0RBVEFfUEFSVF9TSVpFKQorI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvY3Jpcy9zeXN2LlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2NyaXMvc3lzdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWJhZWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2NyaXMvc3lzdi5TCkBAIC0wLDAgKzEsMjE1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDA0IFNpbW9uIFBvc25qYWsKKwkgICAgQ29weXJpZ2h0IChjKSAyMDA1IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKworICAgQ1JJUyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFNJTU9OIFBPU05KQUsgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmkuaD4KKyNkZWZpbmUgQ09OQ0FUKHgseSkgeCAjIyB5CisjZGVmaW5lIFhDT05DQVQoeCx5KSBDT05DQVQgKHgsIHkpCisjZGVmaW5lIEwoeCkgWENPTkNBVCAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCB4KQorCisJLnRleHQKKworCTs7IE9LLCB3aGVuIHdlIGdldCBjYWxsZWQgd2Ugc2hvdWxkIGhhdmUgdGhpcyAoYWNjb3JkaW5nIHRvCisJOzsgQVhJUyBFVFJBWCAxMDBMWCBQcm9ncmFtbWVyJ3MgTWFudWFsIGNoYXB0ZXIgNi4zKS4KKwk7OworCTs7IFIxMDoJIGZmaV9wcmVwX2FyZ3MgKGZ1bmMuIHBvaW50ZXIpCisJOzsgUjExOiAgJmVjaWYKKwk7OyBSMTI6ICBjaWYtPmJ5dGVzCisJOzsgUjEzOiAgZmlnLT5mbGFncworCTs7IHNwKzA6IGVjaWYucnZhbHVlCisJOzsgc3ArNDogZm4gKGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgd2UgbmVlZCB0byBjYWxsKQorCisJLmdsb2JsICBMKGZmaV9jYWxsX1NZU1YpCisJLnR5cGUgICBMKGZmaV9jYWxsX1NZU1YpLEBmdW5jdGlvbgorCS5oaWRkZW4JTChmZmlfY2FsbF9TWVNWKQorCitMKGZmaV9jYWxsX1NZU1YpOgorCTs7IFNhdmUgdGhlIHJlZ3MgdG8gdGhlIHN0YWNrLgorCXB1c2ggJHNycAorCTs7IFVzZWQgZm9yIHN0YWNrIHBvaW50ZXIgc2F2aW5nLgorCXB1c2ggJHI2CisJOzsgVXNlZCBmb3IgZnVuY3Rpb24gYWRkcmVzcyBwb2ludGVyLgorCXB1c2ggJHI3CisJOzsgVXNlZCBmb3Igc3RhY2sgcG9pbnRlciBzYXZpbmcuCisJcHVzaCAkcjgKKwk7OyBXZSBzYXZlIGZpZy0+ZmxhZ3MgdG8gc3RhY2sgd2Ugd2lsbCBuZWVkIHRoZW0gYWZ0ZXIgd2UKKwk7OyBjYWxsIFRoZSBGdW5jdGlvbi4KKwlwdXNoICRyMTMKKworCTs7IFNhdmluZyBjdXJyZW50IHN0YWNrIHBvaW50ZXIuCisJbW92ZS5kICRzcCwkcjgKKwltb3ZlLmQgJHNwLCRyNgorCisJOzsgTW92ZSBhZGRyZXNzIG9mIGZmaV9wcmVwX2FyZ3MgdG8gcjEzLgorCW1vdmUuZCAkcjEwLCRyMTMKKworCTs7IE1ha2Ugcm9vbSBvbiB0aGUgc3RhY2sgZm9yIHRoZSBhcmdzIG9mIGZuLgorCXN1Yi5kICAkcjEyLCRzcAorCisJOzsgRnVuY3Rpb24gdm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpIHBhcmFtZXRlcnMgYXJlOgorCTs7IAlyMTAgPC0tIHN0YWNrIHBvaW50ZXIKKwk7OyAJcjExIDwtLSAmZWNpZiAoYWxyZWFkeSB0aGVyZSkKKwltb3ZlLmQgJHNwLCRyMTAKKworCTs7IENhbGwgdGhlIGZ1bmN0aW9uLgorCWpzciAkcjEzCisKKwk7OyBTYXZlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBwYXNzZWQgb24gc3RhY2suCisJbW92ZS5kICRyMTAsJHI3CisKKwk7OyBNb3ZlIGZpcnN0IGZvdXIgYXJncyBpbiB0byByMTAuLnIxMy4KKwltb3ZlLmQgWyRzcCswXSwkcjEwCisJbW92ZS5kIFskc3ArNF0sJHIxMQorCW1vdmUuZCBbJHNwKzhdLCRyMTIKKwltb3ZlLmQgWyRzcCsxMl0sJHIxMworCisJOzsgQWRqdXN0IHRoZSBzdGFjayBhbmQgY2hlY2sgaWYgYW55IHBhcmFtZXRlcnMgYXJlIGdpdmVuIG9uIHN0YWNrLgorCWFkZHEgMTYsJHNwCisJc3ViLmQgJHI3LCRyNgorCWNtcC5kICRzcCwkcjYKKworCWJwbCBnb19vbgorCW5vcAorCitnb19vbl9ub19wYXJhbXNfb25fc3RhY2s6CisJbW92ZS5kICRyNiwkc3AKKworZ29fb246CisJOzsgRGlzY292ZXIgaWYgd2UgbmVlZCB0byBwdXQgcnZhbCBhZGRyZXNzIGluIHRvIHI5LgorCW1vdmUuZCBbJHI4KzBdLCRyNworCWNtcHEgRkZJX1RZUEVfU1RSVUNULCRyNworCWJuZSBjYWxsX25vdworCW5vcAorCisJOzsgTW92ZSBydmFsIGFkZHJlc3MgdG8gJHI5LgorCW1vdmUuZCBbJHI4KzIwXSwkcjkKKworY2FsbF9ub3c6CisJOzsgTW92ZSBhZGRyZXNzIG9mIFRoZSBGdW5jdGlvbiBpbiB0byByNy4KKwltb3ZlLmQgWyRyOCsyNF0sJHI3CisKKwk7OyBDYWxsIFRoZSBGdW5jdGlvbi4KKwlqc3IgJHI3CisKKwk7OyBSZXNldCBzdGFjay4KKwltb3ZlLmQgJHI4LCRzcAorCisJOzsgTG9hZCBydmFsIHR5cGUgKGZpZy0+ZmxhZ3MpIGluIHRvIHIxMy4KKwlwb3AgJHIxMworCisJOzsgRGV0ZWN0IHJ2YWwgdHlwZS4KKwljbXBxIEZGSV9UWVBFX1ZPSUQsJHIxMworCWJlcSBlcGlsb2d1ZQorCisJY21wcSBGRklfVFlQRV9TVFJVQ1QsJHIxMworCWJlcSBlcGlsb2d1ZQorCisJY21wcSBGRklfVFlQRV9ET1VCTEUsJHIxMworCWJlcSByZXR1cm5fZG91YmxlX29yX2xvbmdsb25nCisKKwljbXBxIEZGSV9UWVBFX1VJTlQ2NCwkcjEzCisJYmVxIHJldHVybl9kb3VibGVfb3JfbG9uZ2xvbmcKKworCWNtcHEgRkZJX1RZUEVfU0lOVDY0LCRyMTMKKwliZXEgcmV0dXJuX2RvdWJsZV9vcl9sb25nbG9uZworCW5vcAorCisJOzsgSnVzdCByZXR1cm4gdGhlIDMyIGJpdCB2YWx1ZS4KKwliYSByZXR1cm4KKwlub3AKKworcmV0dXJuX2RvdWJsZV9vcl9sb25nbG9uZzoKKwk7OyBMb2FkIGhhbGYgb2YgdGhlIHJ2YWwgdG8gcjEwIGFuZCB0aGUgb3RoZXIgaGFsZiB0byByMTEuCisJbW92ZS5kIFskc3ArMTZdLCRyMTMKKwltb3ZlLmQgJHIxMCxbJHIxM10KKwlhZGRxIDQsJHIxMworCW1vdmUuZCAkcjExLFskcjEzXQorCWJhIGVwaWxvZ3VlCisJbm9wCisKK3JldHVybjoKKwk7OyBMb2FkIHRoZSBydmFsIHRvIHIxMC4KKwltb3ZlLmQgWyRzcCsxNl0sJHIxMworCW1vdmUuZCAkcjEwLFskcjEzXQorCitlcGlsb2d1ZToKKwlwb3AgJHI4CisJcG9wICRyNworCXBvcCAkcjYKKwlKdW1wIFskc3ArXQorCisJLnNpemUgICBmZmlfY2FsbF9TWVNWLC4tZmZpX2NhbGxfU1lTVgorCisvKiBTYXZlIFIxMC4uUjEzIGludG8gYW4gYXJyYXksIHNvbWV3aGF0IGxpa2UgdmFyYXJncy4gIENvcHkgdGhlIG5leHQKKyAgIGFyZ3VtZW50IHRvbywgdG8gc2ltcGxpZnkgaGFuZGxpbmcgb2YgYW55IHN0cmFkZGxpbmcgcGFyYW1ldGVyLgorICAgU2F2ZSBSOSBhbmQgU1AgYWZ0ZXIgdGhvc2UuICBKdW1wIHRvIGZ1bmN0aW9uIGhhbmRsaW5nIHRoZSByZXN0LgorICAgU2luY2UgdGhpcyBpcyBhIHRlbXBsYXRlLCBjb3BpZWQgYW5kIHRoZSBtYWluIGZ1bmN0aW9uIGZpbGxlZCBpbiBieQorICAgdGhlIHVzZXIuICAqLworCisJLmdsb2JsCUwoZmZpX2NyaXNfdHJhbXBvbGluZV90ZW1wbGF0ZSkKKwkudHlwZQlMKGZmaV9jcmlzX3RyYW1wb2xpbmVfdGVtcGxhdGUpLEBmdW5jdGlvbgorCS5oaWRkZW4JTChmZmlfY3Jpc190cmFtcG9saW5lX3RlbXBsYXRlKQorCitMKGZmaV9jcmlzX3RyYW1wb2xpbmVfdGVtcGxhdGUpOgorMDoKKwkvKiBUaGUgdmFsdWUgd2UgZ2V0IGZvciAiUEMiIGlzIHJpZ2h0IGFmdGVyIHRoZSBwcmVmaXggaW5zdHJ1Y3Rpb24sCisJICAgdHdvIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZywgaS5lLiAwYisyLiAqLworCW1vdmUuZCAkcjEwLFskcGMrMmYtKDBiKzIpXQorCW1vdmUuZCAkcGMsJHIxMAorMToKKwlhZGRxIDJmLTFiKzQsJHIxMAorCW1vdmUuZCAkcjExLFskcjEwK10KKwltb3ZlLmQgJHIxMixbJHIxMCtdCisJbW92ZS5kICRyMTMsWyRyMTArXQorCW1vdmUuZCBbJHNwXSwkcjExCisJbW92ZS5kICRyMTEsWyRyMTArXQorCW1vdmUuZCAkcjksWyRyMTArXQorCW1vdmUuZCAkc3AsWyRyMTArXQorCXN1YnEgRkZJX0NSSVNfVFJBTVBPTElORV9EQVRBX1BBUlRfU0laRSwkcjEwCisJbW92ZS5kIDAsJHIxMQorMzoKKyAgICAgICAganVtcCAwCisyOgorCS5zaXplCWZmaV9jcmlzX3RyYW1wb2xpbmVfdGVtcGxhdGUsLi0wYgorCisvKiBUaGlzIG1hY3JvIGNyZWF0ZSBhIGNvbnN0YW50IHVzYWJsZSBhcyAiZXh0ZXJuIGNvbnN0IGludCBcbmFtZSIgaW4KKyAgIEMgZnJvbSB3aXRoaW4gbGliZmZpLCB3aGVuIFxuYW1lIGhhcyBubyBwcmVmaXggZGVjb3JhdGlvbi4gICovCisKKwkubWFjcm8gY29uc3QgbmFtZSx2YWx1ZQorCS5nbG9ibAlcbmFtZQorCS50eXBlCVxuYW1lLEBvYmplY3QKKwkuaGlkZGVuCVxuYW1lCitcbmFtZToKKwkuZHdvcmQgIFx2YWx1ZQorCS5zaXplCVxuYW1lLDQKKwkuZW5kbQorCisvKiBDb25zdGFudHMgZm9yIG9mZnNldHMgd2l0aGluIHRoZSB0cmFtcG9saW5lLiAgV2UgY291bGQgZG8gdGhpcyB3aXRoCisgICBqdXN0IHN5bWJvbHMsIGF2b2lkaW5nIG1lbW9yeSBjb250ZW50cyBhbmQgbWVtb3J5IGFjY2Vzc2VzLCBidXQgdGhlCisgICBDIHVzYWdlIGNvZGUgd291bGQgbG9vayBhIGJpdCBzdHJhbmdlci4gICovCisKKwljb25zdCBMKGZmaV9jcmlzX3RyYW1wb2xpbmVfZm5fb2Zmc2V0KSwyYi00LTBiCisJY29uc3QgTChmZmlfY3Jpc190cmFtcG9saW5lX2Nsb3N1cmVfb2Zmc2V0KSwzYi00LTBiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2RlYnVnLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkY2ZjZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvZGVidWcuYwpAQCAtMCwwICsxLDU5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZGVidWcuYyAtIENvcHlyaWdodCAoYykgMTk5NiBSZWQgSGF0LCBJbmMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogR2VuZXJhbCBkZWJ1Z2dpbmcgcm91dGluZXMgKi8KKwordm9pZCBmZmlfc3RvcF9oZXJlKHZvaWQpCit7CisgIC8qIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgICAgUGxhY2UgYSBicmVha3BvaW50IG9uIGZmaV9zdG9wX2hlcmUgdG8gYmUgbm90aWZpZWQgb2YKKyAgICAgc2lnbmlmaWNhbnQgZXZlbnRzLiAqLworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB2aWEgdGhlIEZGSV9BU1NFUlQoKSBtYWNybyAqLworCit2b2lkIGZmaV9hc3NlcnQoY2hhciAqZXhwciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisgIGZwcmludGYoc3RkZXJyLCAiQVNTRVJUSU9OIEZBSUxVUkU6ICVzIGF0ICVzOiVkXG4iLCBleHByLCBmaWxlLCBsaW5lKTsKKyAgZmZpX3N0b3BfaGVyZSgpOworICBhYm9ydCgpOworfQorCisvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIGFuIGZmaV90eXBlIHN0cnVjdHVyZSAqLworCit2b2lkIGZmaV90eXBlX3Rlc3QoZmZpX3R5cGUgKmEsIGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICBGRklfQVNTRVJUX0FUKGEgIT0gTlVMTCwgZmlsZSwgbGluZSk7CisKKyAgRkZJX0FTU0VSVF9BVChhLT50eXBlIDw9IEZGSV9UWVBFX0xBU1QsIGZpbGUsIGxpbmUpOworICBGRklfQVNTRVJUX0FUKGEtPnR5cGUgPT0gRkZJX1RZUEVfVk9JRCB8fCBhLT5zaXplID4gMCwgZmlsZSwgbGluZSk7CisgIEZGSV9BU1NFUlRfQVQoYS0+dHlwZSA9PSBGRklfVFlQRV9WT0lEIHx8IGEtPmFsaWdubWVudCA+IDAsIGZpbGUsIGxpbmUpOworICBGRklfQVNTRVJUX0FUKGEtPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUIHx8IGEtPmVsZW1lbnRzICE9IE5VTEwsIGZpbGUsIGxpbmUpOworCit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2RsbWFsbG9jLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2RsbWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5ZjljMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvZGxtYWxsb2MuYwpAQCAtMCwwICsxLDUxNjEgQEAKKy8qCisgIFRoaXMgaXMgYSB2ZXJzaW9uIChha2EgZGxtYWxsb2MpIG9mIG1hbGxvYy9mcmVlL3JlYWxsb2Mgd3JpdHRlbiBieQorICBEb3VnIExlYSBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9wdWJsaWNkb21haW4uICBTZW5kIHF1ZXN0aW9ucywKKyAgY29tbWVudHMsIGNvbXBsYWludHMsIHBlcmZvcm1hbmNlIGRhdGEsIGV0YyB0byBkbEBjcy5vc3dlZ28uZWR1CisKKyogVmVyc2lvbiAyLjguMyBUaHUgU2VwIDIyIDExOjE2OjE1IDIwMDUgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorCisgICBOb3RlOiBUaGVyZSBtYXkgYmUgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFsbG9jIG9idGFpbmFibGUgYXQKKyAgICAgICAgICAgZnRwOi8vZ2VlLmNzLm9zd2Vnby5lZHUvcHViL21pc2MvbWFsbG9jLmMKKyAgICAgICAgIENoZWNrIGJlZm9yZSBpbnN0YWxsaW5nIQorCisqIFF1aWNrc3RhcnQKKworICBUaGlzIGxpYnJhcnkgaXMgYWxsIGluIG9uZSBmaWxlIHRvIHNpbXBsaWZ5IHRoZSBtb3N0IGNvbW1vbiB1c2FnZToKKyAgZnRwIGl0LCBjb21waWxlIGl0ICgtTzMpLCBhbmQgbGluayBpdCBpbnRvIGFub3RoZXIgcHJvZ3JhbS4gQWxsIG9mCisgIHRoZSBjb21waWxlLXRpbWUgb3B0aW9ucyBkZWZhdWx0IHRvIHJlYXNvbmFibGUgdmFsdWVzIGZvciB1c2Ugb24KKyAgbW9zdCBwbGF0Zm9ybXMuICBZb3UgbWlnaHQgbGF0ZXIgd2FudCB0byBzdGVwIHRocm91Z2ggdmFyaW91cworICBjb21waWxlLXRpbWUgYW5kIGR5bmFtaWMgdHVuaW5nIG9wdGlvbnMuCisKKyAgRm9yIGNvbnZlbmllbmNlLCBhbiBpbmNsdWRlIGZpbGUgZm9yIGNvZGUgdXNpbmcgdGhpcyBtYWxsb2MgaXMgYXQ6CisgICAgIGZ0cDovL2dlZS5jcy5vc3dlZ28uZWR1L3B1Yi9taXNjL21hbGxvYy0yLjguMy5oCisgIFlvdSBkb24ndCByZWFsbHkgbmVlZCB0aGlzIC5oIGZpbGUgdW5sZXNzIHlvdSBjYWxsIGZ1bmN0aW9ucyBub3QKKyAgZGVmaW5lZCBpbiB5b3VyIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgVGhlIC5oIGZpbGUgY29udGFpbnMgb25seSB0aGUKKyAgZXhjZXJwdHMgZnJvbSB0aGlzIGZpbGUgbmVlZGVkIGZvciB1c2luZyB0aGlzIG1hbGxvYyBvbiBBTlNJIEMvQysrCisgIHN5c3RlbXMsIHNvIGxvbmcgYXMgeW91IGhhdmVuJ3QgY2hhbmdlZCBjb21waWxlLXRpbWUgb3B0aW9ucyBhYm91dAorICBuYW1pbmcgYW5kIHR1bmluZyBwYXJhbWV0ZXJzLiAgSWYgeW91IGRvLCB0aGVuIHlvdSBjYW4gY3JlYXRlIHlvdXIKKyAgb3duIG1hbGxvYy5oIHRoYXQgZG9lcyBpbmNsdWRlIGFsbCBzZXR0aW5ncyBieSBjdXR0aW5nIGF0IHRoZSBwb2ludAorICBpbmRpY2F0ZWQgYmVsb3cuIE5vdGUgdGhhdCB5b3UgbWF5IGFscmVhZHkgYnkgZGVmYXVsdCBiZSB1c2luZyBhIEMKKyAgbGlicmFyeSBjb250YWluaW5nIGEgbWFsbG9jIHRoYXQgaXMgYmFzZWQgb24gc29tZSB2ZXJzaW9uIG9mIHRoaXMKKyAgbWFsbG9jIChmb3IgZXhhbXBsZSBpbiBsaW51eCkuIFlvdSBtaWdodCBzdGlsbCB3YW50IHRvIHVzZSB0aGUgb25lCisgIGluIHRoaXMgZmlsZSB0byBjdXN0b21pemUgc2V0dGluZ3Mgb3IgdG8gYXZvaWQgb3ZlcmhlYWRzIGFzc29jaWF0ZWQKKyAgd2l0aCBsaWJyYXJ5IHZlcnNpb25zLgorCisqIFZpdGFsIHN0YXRpc3RpY3M6CisKKyAgU3VwcG9ydGVkIHBvaW50ZXIvc2l6ZV90IHJlcHJlc2VudGF0aW9uOiAgICAgICA0IG9yIDggYnl0ZXMKKyAgICAgICBzaXplX3QgTVVTVCBiZSBhbiB1bnNpZ25lZCB0eXBlIG9mIHRoZSBzYW1lIHdpZHRoIGFzCisgICAgICAgcG9pbnRlcnMuIChJZiB5b3UgYXJlIHVzaW5nIGFuIGFuY2llbnQgc3lzdGVtIHRoYXQgZGVjbGFyZXMKKyAgICAgICBzaXplX3QgYXMgYSBzaWduZWQgdHlwZSwgb3IgbmVlZCBpdCB0byBiZSBhIGRpZmZlcmVudCB3aWR0aAorICAgICAgIHRoYW4gcG9pbnRlcnMsIHlvdSBjYW4gdXNlIGEgcHJldmlvdXMgcmVsZWFzZSBvZiB0aGlzIG1hbGxvYworICAgICAgIChlLmcuIDIuNy4yKSBzdXBwb3J0aW5nIHRoZXNlLikKKworICBBbGlnbm1lbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggYnl0ZXMgKGRlZmF1bHQpCisgICAgICAgVGhpcyBzdWZmaWNlcyBmb3IgbmVhcmx5IGFsbCBjdXJyZW50IG1hY2hpbmVzIGFuZCBDIGNvbXBpbGVycy4KKyAgICAgICBIb3dldmVyLCB5b3UgY2FuIGRlZmluZSBNQUxMT0NfQUxJR05NRU5UIHRvIGJlIHdpZGVyIHRoYW4gdGhpcworICAgICAgIGlmIG5lY2Vzc2FyeSAodXAgdG8gMTI4Ynl0ZXMpLCBhdCB0aGUgZXhwZW5zZSBvZiB1c2luZyBtb3JlIHNwYWNlLgorCisgIE1pbmltdW0gb3ZlcmhlYWQgcGVyIGFsbG9jYXRlZCBjaHVuazogICA0IG9yICA4IGJ5dGVzIChpZiA0Ynl0ZSBzaXplcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggb3IgMTYgYnl0ZXMgKGlmIDhieXRlIHNpemVzKQorICAgICAgIEVhY2ggbWFsbG9jZWQgY2h1bmsgaGFzIGEgaGlkZGVuIHdvcmQgb2Ygb3ZlcmhlYWQgaG9sZGluZyBzaXplCisgICAgICAgYW5kIHN0YXR1cyBpbmZvcm1hdGlvbiwgYW5kIGFkZGl0aW9uYWwgY3Jvc3MtY2hlY2sgd29yZAorICAgICAgIGlmIEZPT1RFUlMgaXMgZGVmaW5lZC4KKworICBNaW5pbXVtIGFsbG9jYXRlZCBzaXplOiA0LWJ5dGUgcHRyczogIDE2IGJ5dGVzICAgIChpbmNsdWRpbmcgb3ZlcmhlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDgtYnl0ZSBwdHJzOiAgMzIgYnl0ZXMgICAgKGluY2x1ZGluZyBvdmVyaGVhZCkKKworICAgICAgIEV2ZW4gYSByZXF1ZXN0IGZvciB6ZXJvIGJ5dGVzIChpLmUuLCBtYWxsb2MoMCkpIHJldHVybnMgYQorICAgICAgIHBvaW50ZXIgdG8gc29tZXRoaW5nIG9mIHRoZSBtaW5pbXVtIGFsbG9jYXRhYmxlIHNpemUuCisgICAgICAgVGhlIG1heGltdW0gb3ZlcmhlYWQgd2FzdGFnZSAoaS5lLiwgbnVtYmVyIG9mIGV4dHJhIGJ5dGVzCisgICAgICAgYWxsb2NhdGVkIHRoYW4gd2VyZSByZXF1ZXN0ZWQgaW4gbWFsbG9jKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwKKyAgICAgICB0byB0aGUgbWluaW11bSBzaXplLCBleGNlcHQgZm9yIHJlcXVlc3RzID49IG1tYXBfdGhyZXNob2xkIHRoYXQKKyAgICAgICBhcmUgc2VydmljZWQgdmlhIG1tYXAoKSwgd2hlcmUgdGhlIHdvcnN0IGNhc2Ugd2FzdGFnZSBpcyBhYm91dAorICAgICAgIDMyIGJ5dGVzIHBsdXMgdGhlIHJlbWFpbmRlciBmcm9tIGEgc3lzdGVtIHBhZ2UgKHRoZSBtaW5pbWFsCisgICAgICAgbW1hcCB1bml0KTsgdHlwaWNhbGx5IDQwOTYgb3IgODE5MiBieXRlcy4KKworICBTZWN1cml0eTogc3RhdGljLXNhZmU7IG9wdGlvbmFsbHkgbW9yZSBvciBsZXNzCisgICAgICAgVGhlICJzZWN1cml0eSIgb2YgbWFsbG9jIHJlZmVycyB0byB0aGUgYWJpbGl0eSBvZiBtYWxpY2lvdXMKKyAgICAgICBjb2RlIHRvIGFjY2VudHVhdGUgdGhlIGVmZmVjdHMgb2YgZXJyb3JzIChmb3IgZXhhbXBsZSwgZnJlZWluZworICAgICAgIHNwYWNlIHRoYXQgaXMgbm90IGN1cnJlbnRseSBtYWxsb2MnZWQgb3Igb3ZlcndyaXRpbmcgcGFzdCB0aGUKKyAgICAgICBlbmRzIG9mIGNodW5rcykgaW4gY29kZSB0aGF0IGNhbGxzIG1hbGxvYy4gIFRoaXMgbWFsbG9jCisgICAgICAgZ3VhcmFudGVlcyBub3QgdG8gbW9kaWZ5IGFueSBtZW1vcnkgbG9jYXRpb25zIGJlbG93IHRoZSBiYXNlIG9mCisgICAgICAgaGVhcCwgaS5lLiwgc3RhdGljIHZhcmlhYmxlcywgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgdXNhZ2UKKyAgICAgICBlcnJvcnMuICBUaGUgcm91dGluZXMgYWRkaXRpb25hbGx5IGRldGVjdCBtb3N0IGltcHJvcGVyIGZyZWVzCisgICAgICAgYW5kIHJlYWxsb2NzLiAgQWxsIHRoaXMgaG9sZHMgYXMgbG9uZyBhcyB0aGUgc3RhdGljIGJvb2trZWVwaW5nCisgICAgICAgZm9yIG1hbGxvYyBpdHNlbGYgaXMgbm90IGNvcnJ1cHRlZCBieSBzb21lIG90aGVyIG1lYW5zLiAgVGhpcworICAgICAgIGlzIG9ubHkgb25lIGFzcGVjdCBvZiBzZWN1cml0eSAtLSB0aGVzZSBjaGVja3MgZG8gbm90LCBhbmQKKyAgICAgICBjYW5ub3QsIGRldGVjdCBhbGwgcG9zc2libGUgcHJvZ3JhbW1pbmcgZXJyb3JzLgorCisgICAgICAgSWYgRk9PVEVSUyBpcyBkZWZpbmVkIG5vbnplcm8sIHRoZW4gZWFjaCBhbGxvY2F0ZWQgY2h1bmsKKyAgICAgICBjYXJyaWVzIGFuIGFkZGl0aW9uYWwgY2hlY2sgd29yZCB0byB2ZXJpZnkgdGhhdCBpdCB3YXMgbWFsbG9jZWQKKyAgICAgICBmcm9tIGl0cyBzcGFjZS4gIFRoZXNlIGNoZWNrIHdvcmRzIGFyZSB0aGUgc2FtZSB3aXRoaW4gZWFjaAorICAgICAgIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0gdXNpbmcgbWFsbG9jLCBidXQgZGlmZmVyIGFjcm9zcworICAgICAgIGV4ZWN1dGlvbnMsIHNvIGV4dGVybmFsbHkgY3JhZnRlZCBmYWtlIGNodW5rcyBjYW5ub3QgYmUKKyAgICAgICBmcmVlZC4gVGhpcyBpbXByb3ZlcyBzZWN1cml0eSBieSByZWplY3RpbmcgZnJlZXMvcmVhbGxvY3MgdGhhdAorICAgICAgIGNvdWxkIGNvcnJ1cHQgaGVhcCBtZW1vcnksIGluIGFkZGl0aW9uIHRvIHRoZSBjaGVja3MgcHJldmVudGluZworICAgICAgIHdyaXRlcyB0byBzdGF0aWNzIHRoYXQgYXJlIGFsd2F5cyBvbi4gIFRoaXMgbWF5IGZ1cnRoZXIgaW1wcm92ZQorICAgICAgIHNlY3VyaXR5IGF0IHRoZSBleHBlbnNlIG9mIHRpbWUgYW5kIHNwYWNlIG92ZXJoZWFkLiAgKE5vdGUgdGhhdAorICAgICAgIEZPT1RFUlMgbWF5IGFsc28gYmUgd29ydGggdXNpbmcgd2l0aCBNU1BBQ0VTLikKKworICAgICAgIEJ5IGRlZmF1bHQgZGV0ZWN0ZWQgZXJyb3JzIGNhdXNlIHRoZSBwcm9ncmFtIHRvIGFib3J0IChjYWxsaW5nCisgICAgICAgImFib3J0KCkiKS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIHRvIGluc3RlYWQgcHJvY2VlZCBwYXN0CisgICAgICAgZXJyb3JzIGJ5IGRlZmluaW5nIFBST0NFRURfT05fRVJST1IuICBJbiB0aGlzIGNhc2UsIGEgYmFkIGZyZWUKKyAgICAgICBoYXMgbm8gZWZmZWN0LCBhbmQgYSBtYWxsb2MgdGhhdCBlbmNvdW50ZXJzIGEgYmFkIGFkZHJlc3MKKyAgICAgICBjYXVzZWQgYnkgdXNlciBvdmVyd3JpdGVzIHdpbGwgaWdub3JlIHRoZSBiYWQgYWRkcmVzcyBieQorICAgICAgIGRyb3BwaW5nIHBvaW50ZXJzIGFuZCBpbmRpY2VzIHRvIGFsbCBrbm93biBtZW1vcnkuIFRoaXMgbWF5CisgICAgICAgYmUgYXBwcm9wcmlhdGUgZm9yIHByb2dyYW1zIHRoYXQgc2hvdWxkIGNvbnRpbnVlIGlmIGF0IGFsbAorICAgICAgIHBvc3NpYmxlIGluIHRoZSBmYWNlIG9mIHByb2dyYW1taW5nIGVycm9ycywgYWx0aG91Z2ggdGhleSBtYXkKKyAgICAgICBydW4gb3V0IG9mIG1lbW9yeSBiZWNhdXNlIGRyb3BwZWQgbWVtb3J5IGlzIG5ldmVyIHJlY2xhaW1lZC4KKworICAgICAgIElmIHlvdSBkb24ndCBsaWtlIGVpdGhlciBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGRlZmluZQorICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OIGFuZCBVU0FHRV9FUlJPUl9BQ1RJT04gdG8gZG8gYW55dGhpbmcKKyAgICAgICBlbHNlLiBBbmQgaWYgaWYgeW91IGFyZSBzdXJlIHRoYXQgeW91ciBwcm9ncmFtIHVzaW5nIG1hbGxvYyBoYXMKKyAgICAgICBubyBlcnJvcnMgb3IgdnVsbmVyYWJpbGl0aWVzLCB5b3UgY2FuIGRlZmluZSBJTlNFQ1VSRSB0byAxLAorICAgICAgIHdoaWNoIG1pZ2h0IChvciBtaWdodCBub3QpIHByb3ZpZGUgYSBzbWFsbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4KKworICBUaHJlYWQtc2FmZXR5OiBOT1QgdGhyZWFkLXNhZmUgdW5sZXNzIFVTRV9MT0NLUyBkZWZpbmVkCisgICAgICAgV2hlbiBVU0VfTE9DS1MgaXMgZGVmaW5lZCwgZWFjaCBwdWJsaWMgY2FsbCB0byBtYWxsb2MsIGZyZWUsCisgICAgICAgZXRjIGlzIHN1cnJvdW5kZWQgd2l0aCBlaXRoZXIgYSBwdGhyZWFkIG11dGV4IG9yIGEgd2luMzIKKyAgICAgICBzcGlubG9jayAoZGVwZW5kaW5nIG9uIFdJTjMyKS4gVGhpcyBpcyBub3QgZXNwZWNpYWxseSBmYXN0LCBhbmQKKyAgICAgICBjYW4gYmUgYSBtYWpvciBib3R0bGVuZWNrLiAgSXQgaXMgZGVzaWduZWQgb25seSB0byBwcm92aWRlCisgICAgICAgbWluaW1hbCBwcm90ZWN0aW9uIGluIGNvbmN1cnJlbnQgZW52aXJvbm1lbnRzLCBhbmQgdG8gcHJvdmlkZSBhCisgICAgICAgYmFzaXMgZm9yIGV4dGVuc2lvbnMuICBJZiB5b3UgYXJlIHVzaW5nIG1hbGxvYyBpbiBhIGNvbmN1cnJlbnQKKyAgICAgICBwcm9ncmFtLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIHB0bWFsbG9jLCB3aGljaCBpcyBkZXJpdmVkIGZyb20KKyAgICAgICBhIHZlcnNpb24gb2YgdGhpcyBtYWxsb2MuIChTZWUgaHR0cDovL3d3dy5tYWxsb2MuZGUpLgorCisgIFN5c3RlbSByZXF1aXJlbWVudHM6IEFueSBjb21iaW5hdGlvbiBvZiBNT1JFQ09SRSBhbmQvb3IgTU1BUC9NVU5NQVAKKyAgICAgICBUaGlzIG1hbGxvYyBjYW4gdXNlIHVuaXggc2JyayBvciBhbnkgZW11bGF0aW9uIChpbnZva2VkIHVzaW5nCisgICAgICAgdGhlIENBTExfTU9SRUNPUkUgbWFjcm8pIGFuZC9vciBtbWFwL211bm1hcCBvciBhbnkgZW11bGF0aW9uCisgICAgICAgKGludm9rZWQgdXNpbmcgQ0FMTF9NTUFQL0NBTExfTVVOTUFQKSB0byBnZXQgYW5kIHJlbGVhc2Ugc3lzdGVtCisgICAgICAgbWVtb3J5LiAgT24gbW9zdCB1bml4IHN5c3RlbXMsIGl0IHRlbmRzIHRvIHdvcmsgYmVzdCBpZiBib3RoCisgICAgICAgTU9SRUNPUkUgYW5kIE1NQVAgYXJlIGVuYWJsZWQuICBPbiBXaW4zMiwgaXQgdXNlcyBlbXVsYXRpb25zCisgICAgICAgYmFzZWQgb24gVmlydHVhbEFsbG9jLiBJdCBhbHNvIHVzZXMgY29tbW9uIEMgbGlicmFyeSBmdW5jdGlvbnMKKyAgICAgICBsaWtlIG1lbXNldC4KKworICBDb21wbGlhbmNlOiBJIGJlbGlldmUgaXQgaXMgY29tcGxpYW50IHdpdGggdGhlIFNpbmdsZSBVbml4IFNwZWNpZmljYXRpb24KKyAgICAgICAoU2VlIGh0dHA6Ly93d3cudW5peC5vcmcpLiBBbHNvIFNWSUQvWFBHLCBBTlNJIEMsIGFuZCBwcm9iYWJseQorICAgICAgIG90aGVycyBhcyB3ZWxsLgorCisqIE92ZXJ2aWV3IG9mIGFsZ29yaXRobXMKKworICBUaGlzIGlzIG5vdCB0aGUgZmFzdGVzdCwgbW9zdCBzcGFjZS1jb25zZXJ2aW5nLCBtb3N0IHBvcnRhYmxlLCBvcgorICBtb3N0IHR1bmFibGUgbWFsbG9jIGV2ZXIgd3JpdHRlbi4gSG93ZXZlciBpdCBpcyBhbW9uZyB0aGUgZmFzdGVzdAorICB3aGlsZSBhbHNvIGJlaW5nIGFtb25nIHRoZSBtb3N0IHNwYWNlLWNvbnNlcnZpbmcsIHBvcnRhYmxlIGFuZAorICB0dW5hYmxlLiAgQ29uc2lzdGVudCBiYWxhbmNlIGFjcm9zcyB0aGVzZSBmYWN0b3JzIHJlc3VsdHMgaW4gYSBnb29kCisgIGdlbmVyYWwtcHVycG9zZSBhbGxvY2F0b3IgZm9yIG1hbGxvYy1pbnRlbnNpdmUgcHJvZ3JhbXMuCisKKyAgSW4gbW9zdCB3YXlzLCB0aGlzIG1hbGxvYyBpcyBhIGJlc3QtZml0IGFsbG9jYXRvci4gR2VuZXJhbGx5LCBpdAorICBjaG9vc2VzIHRoZSBiZXN0LWZpdHRpbmcgZXhpc3RpbmcgY2h1bmsgZm9yIGEgcmVxdWVzdCwgd2l0aCB0aWVzCisgIGJyb2tlbiBpbiBhcHByb3hpbWF0ZWx5IGxlYXN0LXJlY2VudGx5LXVzZWQgb3JkZXIuIChUaGlzIHN0cmF0ZWd5CisgIG5vcm1hbGx5IG1haW50YWlucyBsb3cgZnJhZ21lbnRhdGlvbi4pIEhvd2V2ZXIsIGZvciByZXF1ZXN0cyBsZXNzCisgIHRoYW4gMjU2Ynl0ZXMsIGl0IGRldmlhdGVzIGZyb20gYmVzdC1maXQgd2hlbiB0aGVyZSBpcyBub3QgYW4KKyAgZXhhY3RseSBmaXR0aW5nIGF2YWlsYWJsZSBjaHVuayBieSBwcmVmZXJyaW5nIHRvIHVzZSBzcGFjZSBhZGphY2VudAorICB0byB0aGF0IHVzZWQgZm9yIHRoZSBwcmV2aW91cyBzbWFsbCByZXF1ZXN0LCBhcyB3ZWxsIGFzIGJ5IGJyZWFraW5nCisgIHRpZXMgaW4gYXBwcm94aW1hdGVseSBtb3N0LXJlY2VudGx5LXVzZWQgb3JkZXIuIChUaGVzZSBlbmhhbmNlCisgIGxvY2FsaXR5IG9mIHNlcmllcyBvZiBzbWFsbCBhbGxvY2F0aW9ucy4pICBBbmQgZm9yIHZlcnkgbGFyZ2UgcmVxdWVzdHMKKyAgKD49IDI1NktiIGJ5IGRlZmF1bHQpLCBpdCByZWxpZXMgb24gc3lzdGVtIG1lbW9yeSBtYXBwaW5nCisgIGZhY2lsaXRpZXMsIGlmIHN1cHBvcnRlZC4gIChUaGlzIGhlbHBzIGF2b2lkIGNhcnJ5aW5nIGFyb3VuZCBhbmQKKyAgcG9zc2libHkgZnJhZ21lbnRpbmcgbWVtb3J5IHVzZWQgb25seSBmb3IgbGFyZ2UgY2h1bmtzLikKKworICBBbGwgb3BlcmF0aW9ucyAoZXhjZXB0IG1hbGxvY19zdGF0cyBhbmQgbWFsbGluZm8pIGhhdmUgZXhlY3V0aW9uCisgIHRpbWVzIHRoYXQgYXJlIGJvdW5kZWQgYnkgYSBjb25zdGFudCBmYWN0b3Igb2YgdGhlIG51bWJlciBvZiBiaXRzIGluCisgIGEgc2l6ZV90LCBub3QgY291bnRpbmcgYW55IGNsZWFyaW5nIGluIGNhbGxvYyBvciBjb3B5aW5nIGluIHJlYWxsb2MsCisgIG9yIGFjdGlvbnMgc3Vycm91bmRpbmcgTU9SRUNPUkUgYW5kIE1NQVAgdGhhdCBoYXZlIHRpbWVzCisgIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIG5vbi1jb250aWd1b3VzIHJlZ2lvbnMgcmV0dXJuZWQgYnkKKyAgc3lzdGVtIGFsbG9jYXRpb24gcm91dGluZXMsIHdoaWNoIGlzIG9mdGVuIGp1c3QgMS4KKworICBUaGUgaW1wbGVtZW50YXRpb24gaXMgbm90IHZlcnkgbW9kdWxhciBhbmQgc2VyaW91c2x5IG92ZXJ1c2VzCisgIG1hY3Jvcy4gUGVyaGFwcyBzb21lZGF5IGFsbCBDIGNvbXBpbGVycyB3aWxsIGRvIGFzIGdvb2QgYSBqb2IKKyAgaW5saW5pbmcgbW9kdWxhciBjb2RlIGFzIGNhbiBub3cgYmUgZG9uZSBieSBicnV0ZS1mb3JjZSBleHBhbnNpb24sCisgIGJ1dCBub3csIGVub3VnaCBvZiB0aGVtIHNlZW0gbm90IHRvLgorCisgIFNvbWUgY29tcGlsZXJzIGlzc3VlIGEgbG90IG9mIHdhcm5pbmdzIGFib3V0IGNvZGUgdGhhdCBpcworICBkZWFkL3VucmVhY2hhYmxlIG9ubHkgb24gc29tZSBwbGF0Zm9ybXMsIGFuZCBhbHNvIGFib3V0IGludGVudGlvbmFsCisgIHVzZXMgb2YgbmVnYXRpb24gb24gdW5zaWduZWQgdHlwZXMuIEFsbCBrbm93biBjYXNlcyBvZiBlYWNoIGNhbiBiZQorICBpZ25vcmVkLgorCisgIEZvciBhIGxvbmdlciBidXQgb3V0IG9mIGRhdGUgaGlnaC1sZXZlbCBkZXNjcmlwdGlvbiwgc2VlCisgICAgIGh0dHA6Ly9nZWUuY3Mub3N3ZWdvLmVkdS9kbC9odG1sL21hbGxvYy5odG1sCisKKyogTVNQQUNFUworICBJZiBNU1BBQ0VTIGlzIGRlZmluZWQsIHRoZW4gaW4gYWRkaXRpb24gdG8gbWFsbG9jLCBmcmVlLCBldGMuLAorICB0aGlzIGZpbGUgYWxzbyBkZWZpbmVzIG1zcGFjZV9tYWxsb2MsIG1zcGFjZV9mcmVlLCBldGMuIFRoZXNlCisgIGFyZSB2ZXJzaW9ucyBvZiBtYWxsb2Mgcm91dGluZXMgdGhhdCB0YWtlIGFuICJtc3BhY2UiIGFyZ3VtZW50CisgIG9idGFpbmVkIHVzaW5nIGNyZWF0ZV9tc3BhY2UsIHRvIGNvbnRyb2wgYWxsIGludGVybmFsIGJvb2trZWVwaW5nLgorICBJZiBPTkxZX01TUEFDRVMgaXMgZGVmaW5lZCwgb25seSB0aGVzZSB2ZXJzaW9ucyBhcmUgY29tcGlsZWQuCisgIFNvIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0aGlzIGFsbG9jYXRvciBmb3Igb25seSBzb21lIGFsbG9jYXRpb25zLAorICBhbmQgeW91ciBzeXN0ZW0gbWFsbG9jIGZvciBvdGhlcnMsIHlvdSBjYW4gY29tcGlsZSB3aXRoCisgIE9OTFlfTVNQQUNFUyBhbmQgdGhlbiBkbyBzb21ldGhpbmcgbGlrZS4uLgorICAgIHN0YXRpYyBtc3BhY2UgbXltc3BhY2UgPSBjcmVhdGVfbXNwYWNlKDAsMCk7IC8vIGZvciBleGFtcGxlCisgICAgI2RlZmluZSBteW1hbGxvYyhieXRlcykgIG1zcGFjZV9tYWxsb2MobXltc3BhY2UsIGJ5dGVzKQorCisgIChOb3RlOiBJZiB5b3Ugb25seSBuZWVkIG9uZSBpbnN0YW5jZSBvZiBhbiBtc3BhY2UsIHlvdSBjYW4gaW5zdGVhZAorICB1c2UgIlVTRV9ETF9QUkVGSVgiIHRvIHJlbGFiZWwgdGhlIGdsb2JhbCBtYWxsb2MuKQorCisgIFlvdSBjYW4gc2ltaWxhcmx5IGNyZWF0ZSB0aHJlYWQtbG9jYWwgYWxsb2NhdG9ycyBieSBzdG9yaW5nCisgIG1zcGFjZXMgYXMgdGhyZWFkLWxvY2Fscy4gRm9yIGV4YW1wbGU6CisgICAgc3RhdGljIF9fdGhyZWFkIG1zcGFjZSB0bG1zID0gMDsKKyAgICB2b2lkKiAgdGxtYWxsb2Moc2l6ZV90IGJ5dGVzKSB7CisgICAgICBpZiAodGxtcyA9PSAwKSB0bG1zID0gY3JlYXRlX21zcGFjZSgwLCAwKTsKKyAgICAgIHJldHVybiBtc3BhY2VfbWFsbG9jKHRsbXMsIGJ5dGVzKTsKKyAgICB9CisgICAgdm9pZCAgdGxmcmVlKHZvaWQqIG1lbSkgeyBtc3BhY2VfZnJlZSh0bG1zLCBtZW0pOyB9CisKKyAgVW5sZXNzIEZPT1RFUlMgaXMgZGVmaW5lZCwgZWFjaCBtc3BhY2UgaXMgY29tcGxldGVseSBpbmRlcGVuZGVudC4KKyAgWW91IGNhbm5vdCBhbGxvY2F0ZSBmcm9tIG9uZSBhbmQgZnJlZSB0byBhbm90aGVyIChhbHRob3VnaAorICBjb25mb3JtYW5jZSBpcyBvbmx5IHdlYWtseSBjaGVja2VkLCBzbyB1c2FnZSBlcnJvcnMgYXJlIG5vdCBhbHdheXMKKyAgY2F1Z2h0KS4gSWYgRk9PVEVSUyBpcyBkZWZpbmVkLCB0aGVuIGVhY2ggY2h1bmsgY2FycmllcyBhcm91bmQgYSB0YWcKKyAgaW5kaWNhdGluZyBpdHMgb3JpZ2luYXRpbmcgbXNwYWNlLCBhbmQgZnJlZXMgYXJlIGRpcmVjdGVkIHRvIHRoZWlyCisgIG9yaWdpbmF0aW5nIHNwYWNlcy4KKworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIENvbXBpbGUtdGltZSBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZSBjYXJlZnVsIGluIHNldHRpbmcgI2RlZmluZSB2YWx1ZXMgZm9yIG51bWVyaWNhbCBjb25zdGFudHMgb2YgdHlwZQorc2l6ZV90LiBPbiBzb21lIHN5c3RlbXMsIGxpdGVyYWwgdmFsdWVzIGFyZSBub3QgYXV0b21hdGljYWxseSBleHRlbmRlZAordG8gc2l6ZV90IHByZWNpc2lvbiB1bmxlc3MgdGhleSBhcmUgZXhwbGljaXRseSBjYXN0ZWQuCisKK1dJTjMyICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBkZWZpbmVkIGlmIF9XSU4zMiBkZWZpbmVkCisgIERlZmluaW5nIFdJTjMyIHNldHMgdXAgZGVmYXVsdHMgZm9yIE1TIGVudmlyb25tZW50IGFuZCBjb21waWxlcnMuCisgIE90aGVyd2lzZSBkZWZhdWx0cyBhcmUgZm9yIHVuaXguCisKK01BTExPQ19BTElHTk1FTlQgICAgICAgICBkZWZhdWx0OiAoc2l6ZV90KTgKKyAgQ29udHJvbHMgdGhlIG1pbmltdW0gYWxpZ25tZW50IGZvciBtYWxsb2MnZWQgY2h1bmtzLiAgSXQgbXVzdCBiZSBhCisgIHBvd2VyIG9mIHR3byBhbmQgYXQgbGVhc3QgOCwgZXZlbiBvbiBtYWNoaW5lcyBmb3Igd2hpY2ggc21hbGxlcgorICBhbGlnbm1lbnRzIHdvdWxkIHN1ZmZpY2UuIEl0IG1heSBiZSBkZWZpbmVkIGFzIGxhcmdlciB0aGFuIHRoaXMKKyAgdGhvdWdoLiBOb3RlIGhvd2V2ZXIgdGhhdCBjb2RlIGFuZCBkYXRhIHN0cnVjdHVyZXMgYXJlIG9wdGltaXplZCBmb3IKKyAgdGhlIGNhc2Ugb2YgOC1ieXRlIGFsaWdubWVudC4KKworTVNQQUNFUyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAgKGZhbHNlKQorICBJZiB0cnVlLCBjb21waWxlIGluIHN1cHBvcnQgZm9yIGluZGVwZW5kZW50IGFsbG9jYXRpb24gc3BhY2VzLgorICBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGlmIEhBVkVfTU1BUCBpcyB0cnVlLgorCitPTkxZX01TUEFDRVMgICAgICAgICAgICAgZGVmYXVsdDogMCAoZmFsc2UpCisgIElmIHRydWUsIG9ubHkgY29tcGlsZSBpbiBtc3BhY2UgdmVyc2lvbnMsIG5vdCByZWd1bGFyIHZlcnNpb25zLgorCitVU0VfTE9DS1MgICAgICAgICAgICAgICAgZGVmYXVsdDogMCAoZmFsc2UpCisgIENhdXNlcyBlYWNoIGNhbGwgdG8gZWFjaCBwdWJsaWMgcm91dGluZSB0byBiZSBzdXJyb3VuZGVkIHdpdGgKKyAgcHRocmVhZCBvciBXSU4zMiBtdXRleCBsb2NrL3VubG9jay4gKElmIHNldCB0cnVlLCB0aGlzIGNhbiBiZQorICBvdmVycmlkZGVuIG9uIGEgcGVyLW1zcGFjZSBiYXNpcyBmb3IgbXNwYWNlIHZlcnNpb25zLikKKworRk9PVEVSUyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAKKyAgSWYgdHJ1ZSwgcHJvdmlkZSBleHRyYSBjaGVja2luZyBhbmQgZGlzcGF0Y2hpbmcgYnkgcGxhY2luZworICBpbmZvcm1hdGlvbiBpbiB0aGUgZm9vdGVycyBvZiBhbGxvY2F0ZWQgY2h1bmtzLiBUaGlzIGFkZHMKKyAgc3BhY2UgYW5kIHRpbWUgb3ZlcmhlYWQuCisKK0lOU0VDVVJFICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwCisgIElmIHRydWUsIG9taXQgY2hlY2tzIGZvciB1c2FnZSBlcnJvcnMgYW5kIGhlYXAgc3BhY2Ugb3ZlcndyaXRlcy4KKworVVNFX0RMX1BSRUZJWCAgICAgICAgICAgIGRlZmF1bHQ6IE5PVCBkZWZpbmVkCisgIENhdXNlcyBjb21waWxlciB0byBwcmVmaXggYWxsIHB1YmxpYyByb3V0aW5lcyB3aXRoIHRoZSBzdHJpbmcgJ2RsJy4KKyAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IG9ubHkgd2FudCB0byB1c2UgdGhpcyBtYWxsb2MgaW4gb25lIHBhcnQKKyAgb2YgYSBwcm9ncmFtLCB1c2luZyB5b3VyIHJlZ3VsYXIgc3lzdGVtIG1hbGxvYyBlbHNld2hlcmUuCisKK0FCT1JUICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBkZWZpbmVkIGFzIGFib3J0KCkKKyAgRGVmaW5lcyBob3cgdG8gYWJvcnQgb24gZmFpbGVkIGNoZWNrcy4gIE9uIG1vc3Qgc3lzdGVtcywgYSBmYWlsZWQKKyAgY2hlY2sgY2Fubm90IGRpZSB3aXRoIGFuICJhc3NlcnQiIG9yIGV2ZW4gcHJpbnQgYW4gaW5mb3JtYXRpdmUKKyAgbWVzc2FnZSwgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBwcmludCByb3V0aW5lcyBpbiB0dXJuIGNhbGwgbWFsbG9jLAorICB3aGljaCB3aWxsIGZhaWwgYWdhaW4uICBHZW5lcmFsbHksIHRoZSBiZXN0IHBvbGljeSBpcyB0byBzaW1wbHkgY2FsbAorICBhYm9ydCgpLiBJdCdzIG5vdCB2ZXJ5IHVzZWZ1bCB0byBkbyBtb3JlIHRoYW4gdGhpcyBiZWNhdXNlIG1hbnkKKyAgZXJyb3JzIGR1ZSB0byBvdmVyd3JpdGluZyB3aWxsIHNob3cgdXAgYXMgYWRkcmVzcyBmYXVsdHMgKG51bGwsIG9kZAorICBhZGRyZXNzZXMgZXRjKSByYXRoZXIgdGhhbiBtYWxsb2MtdHJpZ2dlcmVkIGNoZWNrcywgc28gd2lsbCBhbHNvCisgIGFib3J0LiAgQWxzbywgbW9zdCBjb21waWxlcnMga25vdyB0aGF0IGFib3J0KCkgZG9lcyBub3QgcmV0dXJuLCBzbworICBjYW4gYmV0dGVyIG9wdGltaXplIGNvZGUgY29uZGl0aW9uYWxseSBjYWxsaW5nIGl0LgorCitQUk9DRUVEX09OX0VSUk9SICAgICAgICAgICBkZWZhdWx0OiBkZWZpbmVkIGFzIDAgKGZhbHNlKQorICBDb250cm9scyB3aGV0aGVyIGRldGVjdGVkIGJhZCBhZGRyZXNzZXMgY2F1c2UgdGhlbSB0byBieXBhc3NlZAorICByYXRoZXIgdGhhbiBhYm9ydGluZy4gSWYgc2V0LCBkZXRlY3RlZCBiYWQgYXJndW1lbnRzIHRvIGZyZWUgYW5kCisgIHJlYWxsb2MgYXJlIGlnbm9yZWQuIEFuZCBhbGwgYm9va2tlZXBpbmcgaW5mb3JtYXRpb24gaXMgemVyb2VkIG91dAorICB1cG9uIGEgZGV0ZWN0ZWQgb3ZlcndyaXRlIG9mIGZyZWVkIGhlYXAgc3BhY2UsIHRodXMgbG9zaW5nIHRoZQorICBhYmlsaXR5IHRvIGV2ZXIgcmV0dXJuIGl0IGZyb20gbWFsbG9jIGFnYWluLCBidXQgZW5hYmxpbmcgdGhlCisgIGFwcGxpY2F0aW9uIHRvIHByb2NlZWQuIElmIFBST0NFRURfT05fRVJST1IgaXMgZGVmaW5lZCwgdGhlCisgIHN0YXRpYyB2YXJpYWJsZSBtYWxsb2NfY29ycnVwdGlvbl9lcnJvcl9jb3VudCBpcyBjb21waWxlZCBpbgorICBhbmQgY2FuIGJlIGV4YW1pbmVkIHRvIHNlZSBpZiBlcnJvcnMgaGF2ZSBvY2N1cnJlZC4gVGhpcyBvcHRpb24KKyAgZ2VuZXJhdGVzIHNsb3dlciBjb2RlIHRoYW4gdGhlIGRlZmF1bHQgYWJvcnQgcG9saWN5LgorCitERUJVRyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogTk9UIGRlZmluZWQKKyAgVGhlIERFQlVHIHNldHRpbmcgaXMgbWFpbmx5IGludGVuZGVkIGZvciBwZW9wbGUgdHJ5aW5nIHRvIG1vZGlmeQorICB0aGlzIGNvZGUgb3IgZGlhZ25vc2UgcHJvYmxlbXMgd2hlbiBwb3J0aW5nIHRvIG5ldyBwbGF0Zm9ybXMuCisgIEhvd2V2ZXIsIGl0IG1heSBhbHNvIGJlIGFibGUgdG8gYmV0dGVyIGlzb2xhdGUgdXNlciBlcnJvcnMgdGhhbiBqdXN0CisgIHVzaW5nIHJ1bnRpbWUgY2hlY2tzLiAgVGhlIGFzc2VydGlvbnMgaW4gdGhlIGNoZWNrIHJvdXRpbmVzIHNwZWxsCisgIG91dCBpbiBtb3JlIGRldGFpbCB0aGUgYXNzdW1wdGlvbnMgYW5kIGludmFyaWFudHMgdW5kZXJseWluZyB0aGUKKyAgYWxnb3JpdGhtcy4gIFRoZSBjaGVja2luZyBpcyBmYWlybHkgZXh0ZW5zaXZlLCBhbmQgd2lsbCBzbG93IGRvd24KKyAgZXhlY3V0aW9uIG5vdGljZWFibHkuIENhbGxpbmcgbWFsbG9jX3N0YXRzIG9yIG1hbGxpbmZvIHdpdGggREVCVUcKKyAgc2V0IHdpbGwgYXR0ZW1wdCB0byBjaGVjayBldmVyeSBub24tbW1hcHBlZCBhbGxvY2F0ZWQgYW5kIGZyZWUgY2h1bmsKKyAgaW4gdGhlIGNvdXJzZSBvZiBjb21wdXRpbmcgdGhlIHN1bW1hcmllcy4KKworQUJPUlRfT05fQVNTRVJUX0ZBSUxVUkUgICBkZWZhdWx0OiBkZWZpbmVkIGFzIDEgKHRydWUpCisgIERlYnVnZ2luZyBhc3NlcnRpb24gZmFpbHVyZXMgY2FuIGJlIG5lYXJseSBpbXBvc3NpYmxlIGlmIHlvdXIKKyAgdmVyc2lvbiBvZiB0aGUgYXNzZXJ0IG1hY3JvIGNhdXNlcyBtYWxsb2MgdG8gYmUgY2FsbGVkLCB3aGljaCB3aWxsCisgIGxlYWQgdG8gYSBjYXNjYWRlIG9mIGZ1cnRoZXIgZmFpbHVyZXMsIGJsb3dpbmcgdGhlIHJ1bnRpbWUgc3RhY2suCisgIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFIGNhdXNlIGFzc2VydGlvbnMgZmFpbHVyZXMgdG8gY2FsbCBhYm9ydCgpLAorICB3aGljaCB3aWxsIHVzdWFsbHkgbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyLgorCitNQUxMT0NfRkFJTFVSRV9BQ1RJT04gICAgIGRlZmF1bHQ6IHNldHMgZXJybm8gdG8gRU5PTUVNLCBvciBuby1vcCBvbiB3aW4zMgorICBUaGUgYWN0aW9uIHRvIHRha2UgYmVmb3JlICJyZXR1cm4gMCIgd2hlbiBtYWxsb2MgZmFpbHMgdG8gYmUgYWJsZSB0bworICByZXR1cm4gbWVtb3J5IGJlY2F1c2UgdGhlcmUgaXMgbm9uZSBhdmFpbGFibGUuCisKK0hBVkVfTU9SRUNPUkUgICAgICAgICAgICAgZGVmYXVsdDogMSAodHJ1ZSkgdW5sZXNzIHdpbjMyIG9yIE9OTFlfTVNQQUNFUworICBUcnVlIGlmIHRoaXMgc3lzdGVtIHN1cHBvcnRzIHNicmsgb3IgYW4gZW11bGF0aW9uIG9mIGl0LgorCitNT1JFQ09SRSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHNicmsKKyAgVGhlIG5hbWUgb2YgdGhlIHNicmstc3R5bGUgc3lzdGVtIHJvdXRpbmUgdG8gY2FsbCB0byBvYnRhaW4gbW9yZQorICBtZW1vcnkuICBTZWUgYmVsb3cgZm9yIGd1aWRhbmNlIG9uIHdyaXRpbmcgY3VzdG9tIE1PUkVDT1JFCisgIGZ1bmN0aW9ucy4gVGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIHNicmsvTU9SRUNPUkUgdmFyaWVzIGFjcm9zcworICBzeXN0ZW1zLiAgSXQgY2Fubm90IGJlIHNpemVfdCwgYmVjYXVzZSBpdCBzdXBwb3J0cyBuZWdhdGl2ZQorICBhcmd1bWVudHMsIHNvIGl0IGlzIG5vcm1hbGx5IHRoZSBzaWduZWQgdHlwZSBvZiB0aGUgc2FtZSB3aWR0aCBhcworICBzaXplX3QgKHNvbWV0aW1lcyBkZWNsYXJlZCBhcyAiaW50cHRyX3QiKS4gIEl0IGRvZXNuJ3QgbXVjaCBtYXR0ZXIKKyAgdGhvdWdoLiBJbnRlcm5hbGx5LCB3ZSBvbmx5IGNhbGwgaXQgd2l0aCBhcmd1bWVudHMgbGVzcyB0aGFuIGhhbGYKKyAgdGhlIG1heCB2YWx1ZSBvZiBhIHNpemVfdCwgd2hpY2ggc2hvdWxkIHdvcmsgYWNyb3NzIGFsbCByZWFzb25hYmxlCisgIHBvc3NpYmlsaXRpZXMsIGFsdGhvdWdoIHNvbWV0aW1lcyBnZW5lcmF0aW5nIGNvbXBpbGVyIHdhcm5pbmdzLiAgU2VlCisgIG5lYXIgdGhlIGVuZCBvZiB0aGlzIGZpbGUgZm9yIGd1aWRlbGluZXMgZm9yIGNyZWF0aW5nIGEgY3VzdG9tCisgIHZlcnNpb24gb2YgTU9SRUNPUkUuCisKK01PUkVDT1JFX0NPTlRJR1VPVVMgICAgICAgZGVmYXVsdDogMSAodHJ1ZSkKKyAgSWYgdHJ1ZSwgdGFrZSBhZHZhbnRhZ2Ugb2YgZmFjdCB0aGF0IGNvbnNlY3V0aXZlIGNhbGxzIHRvIE1PUkVDT1JFCisgIHdpdGggcG9zaXRpdmUgYXJndW1lbnRzIGFsd2F5cyByZXR1cm4gY29udGlndW91cyBpbmNyZWFzaW5nCisgIGFkZHJlc3Nlcy4gIFRoaXMgaXMgdHJ1ZSBvZiB1bml4IHNicmsuIEl0IGRvZXMgbm90IGh1cnQgdG9vIG11Y2ggdG8KKyAgc2V0IGl0IHRydWUgYW55d2F5LCBzaW5jZSBtYWxsb2MgY29wZXMgd2l0aCBub24tY29udGlndWl0aWVzLgorICBTZXR0aW5nIGl0IGZhbHNlIHdoZW4gZGVmaW5pdGVseSBub24tY29udGlndW91cyBzYXZlcyB0aW1lCisgIGFuZCBwb3NzaWJseSB3YXN0ZWQgc3BhY2UgaXQgd291bGQgdGFrZSB0byBkaXNjb3ZlciB0aGlzIHRob3VnaC4KKworTU9SRUNPUkVfQ0FOTk9UX1RSSU0gICAgICBkZWZhdWx0OiBOT1QgZGVmaW5lZAorICBUcnVlIGlmIE1PUkVDT1JFIGNhbm5vdCByZWxlYXNlIHNwYWNlIGJhY2sgdG8gdGhlIHN5c3RlbSB3aGVuIGdpdmVuCisgIG5lZ2F0aXZlIGFyZ3VtZW50cy4gVGhpcyBpcyBnZW5lcmFsbHkgbmVjZXNzYXJ5IG9ubHkgaWYgeW91IGFyZQorICB1c2luZyBhIGhhbmQtY3JhZnRlZCBNT1JFQ09SRSBmdW5jdGlvbiB0aGF0IGNhbm5vdCBoYW5kbGUgbmVnYXRpdmUKKyAgYXJndW1lbnRzLgorCitIQVZFX01NQVAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEgKHRydWUpCisgIFRydWUgaWYgdGhpcyBzeXN0ZW0gc3VwcG9ydHMgbW1hcCBvciBhbiBlbXVsYXRpb24gb2YgaXQuICBJZiBzbywgYW5kCisgIEhBVkVfTU9SRUNPUkUgaXMgbm90IHRydWUsIE1NQVAgaXMgdXNlZCBmb3IgYWxsIHN5c3RlbQorICBhbGxvY2F0aW9uLiBJZiBzZXQgYW5kIEhBVkVfTU9SRUNPUkUgaXMgdHJ1ZSBhcyB3ZWxsLCBNTUFQIGlzCisgIHByaW1hcmlseSB1c2VkIHRvIGRpcmVjdGx5IGFsbG9jYXRlIHZlcnkgbGFyZ2UgYmxvY2tzLiBJdCBpcyBhbHNvCisgIHVzZWQgYXMgYSBiYWNrdXAgc3RyYXRlZ3kgaW4gY2FzZXMgd2hlcmUgTU9SRUNPUkUgZmFpbHMgdG8gcHJvdmlkZQorICBzcGFjZSBmcm9tIHN5c3RlbS4gTm90ZTogQSBzaW5nbGUgY2FsbCB0byBNVU5NQVAgaXMgYXNzdW1lZCB0byBiZQorICBhYmxlIHRvIHVubWFwIG1lbW9yeSB0aGF0IG1heSBoYXZlIGJlIGFsbG9jYXRlZCB1c2luZyBtdWx0aXBsZSBjYWxscworICB0byBNTUFQLCBzbyBsb25nIGFzIHRoZXkgYXJlIGFkamFjZW50LgorCitIQVZFX01SRU1BUCAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEgb24gbGludXgsIGVsc2UgMAorICBJZiB0cnVlIHJlYWxsb2MoKSB1c2VzIG1yZW1hcCgpIHRvIHJlLWFsbG9jYXRlIGxhcmdlIGJsb2NrcyBhbmQKKyAgZXh0ZW5kIG9yIHNocmluayBhbGxvY2F0aW9uIHNwYWNlcy4KKworTU1BUF9DTEVBUlMgICAgICAgICAgICAgICBkZWZhdWx0OiAxIG9uIHVuaXgKKyAgVHJ1ZSBpZiBtbWFwIGNsZWFycyBtZW1vcnkgc28gY2FsbG9jIGRvZXNuJ3QgbmVlZCB0by4gVGhpcyBpcyB0cnVlCisgIGZvciBzdGFuZGFyZCB1bml4IG1tYXAgdXNpbmcgL2Rldi96ZXJvLgorCitVU0VfQlVJTFRJTl9GRlMgICAgICAgICAgICBkZWZhdWx0OiAwIChpLmUuLCBub3QgdXNlZCkKKyAgQ2F1c2VzIG1hbGxvYyB0byB1c2UgdGhlIGJ1aWx0aW4gZmZzKCkgZnVuY3Rpb24gdG8gY29tcHV0ZSBpbmRpY2VzLgorICBTb21lIGNvbXBpbGVycyBtYXkgcmVjb2duaXplIGFuZCBpbnRyaW5zaWZ5IGZmcyB0byBiZSBmYXN0ZXIgdGhhbiB0aGUKKyAgc3VwcGxpZWQgQyB2ZXJzaW9uLiBBbHNvLCB0aGUgY2FzZSBvZiB4ODYgdXNpbmcgZ2NjIGlzIHNwZWNpYWwtY2FzZWQKKyAgdG8gYW4gYXNtIGluc3RydWN0aW9uLCBzbyBpcyBhbHJlYWR5IGFzIGZhc3QgYXMgaXQgY2FuIGJlLCBhbmQgc28KKyAgdGhpcyBzZXR0aW5nIGhhcyBubyBlZmZlY3QuIChPbiBtb3N0IHg4NnMsIHRoZSBhc20gdmVyc2lvbiBpcyBvbmx5CisgIHNsaWdodGx5IGZhc3RlciB0aGFuIHRoZSBDIHZlcnNpb24uKQorCittYWxsb2NfZ2V0cGFnZXNpemUgICAgICAgICBkZWZhdWx0OiBkZXJpdmUgZnJvbSBzeXN0ZW0gaW5jbHVkZXMsIG9yIDQwOTYuCisgIFRoZSBzeXN0ZW0gcGFnZSBzaXplLiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlLCB0aGlzIG1hbGxvYyBtYW5hZ2VzCisgIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0gaW4gcGFnZS1zaXplIHVuaXRzLiAgVGhpcyBtYXkgYmUgKGFuZAorICB1c3VhbGx5IGlzKSBhIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGEgY29uc3RhbnQuIFRoaXMgaXMgaWdub3JlZAorICBpZiBXSU4zMiwgd2hlcmUgcGFnZSBzaXplIGlzIGRldGVybWluZWQgdXNpbmcgZ2V0U3lzdGVtSW5mbyBkdXJpbmcKKyAgaW5pdGlhbGl6YXRpb24uCisKK1VTRV9ERVZfUkFORE9NICAgICAgICAgICAgIGRlZmF1bHQ6IDAgKGkuZS4sIG5vdCB1c2VkKQorICBDYXVzZXMgbWFsbG9jIHRvIHVzZSAvZGV2L3JhbmRvbSB0byBpbml0aWFsaXplIHNlY3VyZSBtYWdpYyBzZWVkIGZvcgorICBzdGFtcGluZyBmb290ZXJzLiBPdGhlcndpc2UsIHRoZSBjdXJyZW50IHRpbWUgaXMgdXNlZC4KKworTk9fTUFMTElORk8gICAgICAgICAgICAgICAgZGVmYXVsdDogMAorICBJZiBkZWZpbmVkLCBkb24ndCBjb21waWxlICJtYWxsaW5mbyIuIFRoaXMgY2FuIGJlIGEgc2ltcGxlIHdheQorICBvZiBkZWFsaW5nIHdpdGggbWlzbWF0Y2hlcyBiZXR3ZWVuIHN5c3RlbSBkZWNsYXJhdGlvbnMgYW5kCisgIHRob3NlIGluIHRoaXMgZmlsZS4KKworTUFMTElORk9fRklFTERfVFlQRSAgICAgICAgZGVmYXVsdDogc2l6ZV90CisgIFRoZSB0eXBlIG9mIHRoZSBmaWVsZHMgaW4gdGhlIG1hbGxpbmZvIHN0cnVjdC4gVGhpcyB3YXMgb3JpZ2luYWxseQorICBkZWZpbmVkIGFzICJpbnQiIGluIFNWSUQgZXRjLCBidXQgaXMgbW9yZSB1c2VmdWxseSBkZWZpbmVkIGFzCisgIHNpemVfdC4gVGhlIHZhbHVlIGlzIHVzZWQgb25seSBpZiAgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCBpcyBub3Qgc2V0CisKK1JFQUxMT0NfWkVST19CWVRFU19GUkVFUyAgICBkZWZhdWx0OiBub3QgZGVmaW5lZAorICBUaGlzIHNob3VsZCBiZSBzZXQgaWYgYSBjYWxsIHRvIHJlYWxsb2Mgd2l0aCB6ZXJvIGJ5dGVzIHNob3VsZCAKKyAgYmUgdGhlIHNhbWUgYXMgYSBjYWxsIHRvIGZyZWUuIFNvbWUgcGVvcGxlIHRoaW5rIGl0IHNob3VsZC4gT3RoZXJ3aXNlLCAKKyAgc2luY2UgdGhpcyBtYWxsb2MgcmV0dXJucyBhIHVuaXF1ZSBwb2ludGVyIGZvciBtYWxsb2MoMCksIHNvIGRvZXMgCisgIHJlYWxsb2MocCwgMCkuCisKK0xBQ0tTX1VOSVNURF9ILCBMQUNLU19GQ05UTF9ILCBMQUNLU19TWVNfUEFSQU1fSCwgTEFDS1NfU1lTX01NQU5fSAorTEFDS1NfU1RSSU5HU19ILCBMQUNLU19TVFJJTkdfSCwgTEFDS1NfU1lTX1RZUEVTX0gsICBMQUNLU19FUlJOT19ICitMQUNLU19TVERMSUJfSCAgICAgICAgICAgICAgICBkZWZhdWx0OiBOT1QgZGVmaW5lZCB1bmxlc3Mgb24gV0lOMzIKKyAgRGVmaW5lIHRoZXNlIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlc2UgaGVhZGVyIGZpbGVzLgorICBZb3UgbWlnaHQgbmVlZCB0byBtYW51YWxseSBpbnNlcnQgc29tZSBvZiB0aGUgZGVjbGFyYXRpb25zIHRoZXkgcHJvdmlkZS4KKworREVGQVVMVF9HUkFOVUxBUklUWSAgICAgICAgZGVmYXVsdDogcGFnZSBzaXplIGlmIE1PUkVDT1JFX0NPTlRJR1VPVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9pbmZvLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5IGluIFdJTjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgNjRLLgorICAgICAgQWxzbyBzZXR0YWJsZSB1c2luZyBtYWxsb3B0KE1fR1JBTlVMQVJJVFksIHgpCisgIFRoZSB1bml0IGZvciBhbGxvY2F0aW5nIGFuZCBkZWFsbG9jYXRpbmcgbWVtb3J5IGZyb20gdGhlIHN5c3RlbS4gIE9uCisgIG1vc3Qgc3lzdGVtcyB3aXRoIGNvbnRpZ3VvdXMgTU9SRUNPUkUsIHRoZXJlIGlzIG5vIHJlYXNvbiB0bworICBtYWtlIHRoaXMgbW9yZSB0aGFuIGEgcGFnZS4gSG93ZXZlciwgc3lzdGVtcyB3aXRoIE1NQVAgdGVuZCB0bworICBlaXRoZXIgcmVxdWlyZSBvciBlbmNvdXJhZ2UgbGFyZ2VyIGdyYW51bGFyaXRpZXMuICBZb3UgY2FuIGluY3JlYXNlCisgIHRoaXMgdmFsdWUgdG8gcHJldmVudCBzeXN0ZW0gYWxsb2NhdGlvbiBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHNvCisgIG9mdGVuLCBlc3BlY2lhbGx5IGlmIHRoZXkgYXJlIHNsb3cuICBUaGUgdmFsdWUgbXVzdCBiZSBhdCBsZWFzdCBvbmUKKyAgcGFnZSBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIFNldHRpbmcgdG8gMCBjYXVzZXMgaW5pdGlhbGl6YXRpb24KKyAgdG8gZWl0aGVyIHBhZ2Ugc2l6ZSBvciB3aW4zMiByZWdpb24gc2l6ZS4gIChOb3RlOiBJbiBwcmV2aW91cworICB2ZXJzaW9ucyBvZiBtYWxsb2MsIHRoZSBlcXVpdmFsZW50IG9mIHRoaXMgb3B0aW9uIHdhcyBjYWxsZWQKKyAgIlRPUF9QQUQiKQorCitERUZBVUxUX1RSSU1fVEhSRVNIT0xEICAgIGRlZmF1bHQ6IDJNQgorICAgICAgQWxzbyBzZXR0YWJsZSB1c2luZyBtYWxsb3B0KE1fVFJJTV9USFJFU0hPTEQsIHgpCisgIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB1bnVzZWQgdG9wLW1vc3QgbWVtb3J5IHRvIGtlZXAgYmVmb3JlCisgIHJlbGVhc2luZyB2aWEgbWFsbG9jX3RyaW0gaW4gZnJlZSgpLiAgQXV0b21hdGljIHRyaW1taW5nIGlzIG1haW5seQorICB1c2VmdWwgaW4gbG9uZy1saXZlZCBwcm9ncmFtcyB1c2luZyBjb250aWd1b3VzIE1PUkVDT1JFLiAgQmVjYXVzZQorICB0cmltbWluZyB2aWEgc2JyayBjYW4gYmUgc2xvdyBvbiBzb21lIHN5c3RlbXMsIGFuZCBjYW4gc29tZXRpbWVzIGJlCisgIHdhc3RlZnVsIChpbiBjYXNlcyB3aGVyZSBwcm9ncmFtcyBpbW1lZGlhdGVseSBhZnRlcndhcmQgYWxsb2NhdGUKKyAgbW9yZSBsYXJnZSBjaHVua3MpIHRoZSB2YWx1ZSBzaG91bGQgYmUgaGlnaCBlbm91Z2ggc28gdGhhdCB5b3VyCisgIG92ZXJhbGwgc3lzdGVtIHBlcmZvcm1hbmNlIHdvdWxkIGltcHJvdmUgYnkgcmVsZWFzaW5nIHRoaXMgbXVjaAorICBtZW1vcnkuICBBcyBhIHJvdWdoIGd1aWRlLCB5b3UgbWlnaHQgc2V0IHRvIGEgdmFsdWUgY2xvc2UgdG8gdGhlCisgIGF2ZXJhZ2Ugc2l6ZSBvZiBhIHByb2Nlc3MgKHByb2dyYW0pIHJ1bm5pbmcgb24geW91ciBzeXN0ZW0uCisgIFJlbGVhc2luZyB0aGlzIG11Y2ggbWVtb3J5IHdvdWxkIGFsbG93IHN1Y2ggYSBwcm9jZXNzIHRvIHJ1biBpbgorICBtZW1vcnkuICBHZW5lcmFsbHksIGl0IGlzIHdvcnRoIHR1bmluZyB0cmltIHRocmVzaG9sZHMgd2hlbiBhCisgIHByb2dyYW0gdW5kZXJnb2VzIHBoYXNlcyB3aGVyZSBzZXZlcmFsIGxhcmdlIGNodW5rcyBhcmUgYWxsb2NhdGVkCisgIGFuZCByZWxlYXNlZCBpbiB3YXlzIHRoYXQgY2FuIHJldXNlIGVhY2ggb3RoZXIncyBzdG9yYWdlLCBwZXJoYXBzCisgIG1peGVkIHdpdGggcGhhc2VzIHdoZXJlIHRoZXJlIGFyZSBubyBzdWNoIGNodW5rcyBhdCBhbGwuIFRoZSB0cmltCisgIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHBhZ2Ugc2l6ZSB0byBoYXZlIGFueSB1c2VmdWwgZWZmZWN0LiAgVG8KKyAgZGlzYWJsZSB0cmltbWluZyBjb21wbGV0ZWx5LCB5b3UgY2FuIHNldCB0byBNQVhfU0laRV9ULiBOb3RlIHRoYXQgdGhlIHRyaWNrCisgIHNvbWUgcGVvcGxlIHVzZSBvZiBtYWxsb2NpbmcgYSBodWdlIHNwYWNlIGFuZCB0aGVuIGZyZWVpbmcgaXQgYXQKKyAgcHJvZ3JhbSBzdGFydHVwLCBpbiBhbiBhdHRlbXB0IHRvIHJlc2VydmUgc3lzdGVtIG1lbW9yeSwgZG9lc24ndAorICBoYXZlIHRoZSBpbnRlbmRlZCBlZmZlY3QgdW5kZXIgYXV0b21hdGljIHRyaW1taW5nLCBzaW5jZSB0aGF0IG1lbW9yeQorICB3aWxsIGltbWVkaWF0ZWx5IGJlIHJldHVybmVkIHRvIHRoZSBzeXN0ZW0uCisKK0RFRkFVTFRfTU1BUF9USFJFU0hPTEQgICAgICAgZGVmYXVsdDogMjU2SworICAgICAgQWxzbyBzZXR0YWJsZSB1c2luZyBtYWxsb3B0KE1fTU1BUF9USFJFU0hPTEQsIHgpCisgIFRoZSByZXF1ZXN0IHNpemUgdGhyZXNob2xkIGZvciB1c2luZyBNTUFQIHRvIGRpcmVjdGx5IHNlcnZpY2UgYQorICByZXF1ZXN0LiBSZXF1ZXN0cyBvZiBhdCBsZWFzdCB0aGlzIHNpemUgdGhhdCBjYW5ub3QgYmUgYWxsb2NhdGVkCisgIHVzaW5nIGFscmVhZHktZXhpc3Rpbmcgc3BhY2Ugd2lsbCBiZSBzZXJ2aWNlZCB2aWEgbW1hcC4gIChJZiBlbm91Z2gKKyAgbm9ybWFsIGZyZWVkIHNwYWNlIGFscmVhZHkgZXhpc3RzIGl0IGlzIHVzZWQgaW5zdGVhZC4pICBVc2luZyBtbWFwCisgIHNlZ3JlZ2F0ZXMgcmVsYXRpdmVseSBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5IHNvIHRoYXQgdGhleSBjYW4gYmUKKyAgaW5kaXZpZHVhbGx5IG9idGFpbmVkIGFuZCByZWxlYXNlZCBmcm9tIHRoZSBob3N0IHN5c3RlbS4gQSByZXF1ZXN0CisgIHNlcnZpY2VkIHRocm91Z2ggbW1hcCBpcyBuZXZlciByZXVzZWQgYnkgYW55IG90aGVyIHJlcXVlc3QgKGF0IGxlYXN0CisgIG5vdCBkaXJlY3RseTsgdGhlIHN5c3RlbSBtYXkganVzdCBzbyBoYXBwZW4gdG8gcmVtYXAgc3VjY2Vzc2l2ZQorICByZXF1ZXN0cyB0byB0aGUgc2FtZSBsb2NhdGlvbnMpLiAgU2VncmVnYXRpbmcgc3BhY2UgaW4gdGhpcyB3YXkgaGFzCisgIHRoZSBiZW5lZml0cyB0aGF0OiBNbWFwcGVkIHNwYWNlIGNhbiBhbHdheXMgYmUgaW5kaXZpZHVhbGx5IHJlbGVhc2VkCisgIGJhY2sgdG8gdGhlIHN5c3RlbSwgd2hpY2ggaGVscHMga2VlcCB0aGUgc3lzdGVtIGxldmVsIG1lbW9yeSBkZW1hbmRzCisgIG9mIGEgbG9uZy1saXZlZCBwcm9ncmFtIGxvdy4gIEFsc28sIG1hcHBlZCBtZW1vcnkgZG9lc24ndCBiZWNvbWUKKyAgYGxvY2tlZCcgYmV0d2VlbiBvdGhlciBjaHVua3MsIGFzIGNhbiBoYXBwZW4gd2l0aCBub3JtYWxseSBhbGxvY2F0ZWQKKyAgY2h1bmtzLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gdHJpbW1pbmcgdmlhIG1hbGxvY190cmltIHdvdWxkIG5vdAorICByZWxlYXNlIHRoZW0uICBIb3dldmVyLCBpdCBoYXMgdGhlIGRpc2FkdmFudGFnZSB0aGF0IHRoZSBzcGFjZQorICBjYW5ub3QgYmUgcmVjbGFpbWVkLCBjb25zb2xpZGF0ZWQsIGFuZCB0aGVuIHVzZWQgdG8gc2VydmljZSBsYXRlcgorICByZXF1ZXN0cywgYXMgaGFwcGVucyB3aXRoIG5vcm1hbCBjaHVua3MuICBUaGUgYWR2YW50YWdlcyBvZiBtbWFwCisgIG5lYXJseSBhbHdheXMgb3V0d2VpZ2ggZGlzYWR2YW50YWdlcyBmb3IgImxhcmdlIiBjaHVua3MsIGJ1dCB0aGUKKyAgdmFsdWUgb2YgImxhcmdlIiBtYXkgdmFyeSBhY3Jvc3Mgc3lzdGVtcy4gIFRoZSBkZWZhdWx0IGlzIGFuCisgIGVtcGlyaWNhbGx5IGRlcml2ZWQgdmFsdWUgdGhhdCB3b3JrcyB3ZWxsIGluIG1vc3Qgc3lzdGVtcy4gWW91IGNhbgorICBkaXNhYmxlIG1tYXAgYnkgc2V0dGluZyB0byBNQVhfU0laRV9ULgorCisqLworCisjaWZuZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFdJTjMyIDEKKyNlbmRpZiAgLyogX1dJTjMyICovCisjZW5kaWYgIC8qIFdJTjMyICovCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNkZWZpbmUgSEFWRV9NTUFQIDEKKyNkZWZpbmUgSEFWRV9NT1JFQ09SRSAwCisjZGVmaW5lIExBQ0tTX1VOSVNURF9ICisjZGVmaW5lIExBQ0tTX1NZU19QQVJBTV9ICisjZGVmaW5lIExBQ0tTX1NZU19NTUFOX0gKKyNkZWZpbmUgTEFDS1NfU1RSSU5HX0gKKyNkZWZpbmUgTEFDS1NfU1RSSU5HU19ICisjZGVmaW5lIExBQ0tTX1NZU19UWVBFU19ICisjZGVmaW5lIExBQ0tTX0VSUk5PX0gKKyNkZWZpbmUgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OCisjZGVmaW5lIE1NQVBfQ0xFQVJTIDAgLyogV0lOQ0UgYW5kIHNvbWUgb3RoZXJzIGFwcGFyZW50bHkgZG9uJ3QgY2xlYXIgKi8KKyNlbmRpZiAgLyogV0lOMzIgKi8KKworI2lmZGVmIF9fT1MyX18KKyNkZWZpbmUgSU5DTF9ET1MKKyNpbmNsdWRlIDxvczIuaD4KKyNkZWZpbmUgSEFWRV9NTUFQIDEKKyNkZWZpbmUgSEFWRV9NT1JFQ09SRSAwCisjZGVmaW5lIExBQ0tTX1NZU19NTUFOX0gKKyNlbmRpZiAgLyogX19PUzJfXyAqLworCisjaWYgZGVmaW5lZChEQVJXSU4pIHx8IGRlZmluZWQoX0RBUldJTikKKy8qIE1hYyBPU1ggZG9jcyBhZHZpc2Ugbm90IHRvIHVzZSBzYnJrOyBpdCBzZWVtcyBiZXR0ZXIgdG8gdXNlIG1tYXAgKi8KKyNpZm5kZWYgSEFWRV9NT1JFQ09SRQorI2RlZmluZSBIQVZFX01PUkVDT1JFIDAKKyNkZWZpbmUgSEFWRV9NTUFQIDEKKyNlbmRpZiAgLyogSEFWRV9NT1JFQ09SRSAqLworI2VuZGlmICAvKiBEQVJXSU4gKi8KKworI2lmbmRlZiBMQUNLU19TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgLyogRm9yIHNpemVfdCAqLworI2VuZGlmICAvKiBMQUNLU19TWVNfVFlQRVNfSCAqLworCisvKiBUaGUgbWF4aW11bSBwb3NzaWJsZSBzaXplX3QgdmFsdWUgaGFzIGFsbCBiaXRzIHNldCAqLworI2RlZmluZSBNQVhfU0laRV9UICAgICAgICAgICAofihzaXplX3QpMCkKKworI2lmbmRlZiBPTkxZX01TUEFDRVMKKyNkZWZpbmUgT05MWV9NU1BBQ0VTIDAKKyNlbmRpZiAgLyogT05MWV9NU1BBQ0VTICovCisjaWZuZGVmIE1TUEFDRVMKKyNpZiBPTkxZX01TUEFDRVMKKyNkZWZpbmUgTVNQQUNFUyAxCisjZWxzZSAgIC8qIE9OTFlfTVNQQUNFUyAqLworI2RlZmluZSBNU1BBQ0VTIDAKKyNlbmRpZiAgLyogT05MWV9NU1BBQ0VTICovCisjZW5kaWYgIC8qIE1TUEFDRVMgKi8KKyNpZm5kZWYgTUFMTE9DX0FMSUdOTUVOVAorI2RlZmluZSBNQUxMT0NfQUxJR05NRU5UICgoc2l6ZV90KThVKQorI2VuZGlmICAvKiBNQUxMT0NfQUxJR05NRU5UICovCisjaWZuZGVmIEZPT1RFUlMKKyNkZWZpbmUgRk9PVEVSUyAwCisjZW5kaWYgIC8qIEZPT1RFUlMgKi8KKyNpZm5kZWYgQUJPUlQKKyNkZWZpbmUgQUJPUlQgIGFib3J0KCkKKyNlbmRpZiAgLyogQUJPUlQgKi8KKyNpZm5kZWYgQUJPUlRfT05fQVNTRVJUX0ZBSUxVUkUKKyNkZWZpbmUgQUJPUlRfT05fQVNTRVJUX0ZBSUxVUkUgMQorI2VuZGlmICAvKiBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRSAqLworI2lmbmRlZiBQUk9DRUVEX09OX0VSUk9SCisjZGVmaW5lIFBST0NFRURfT05fRVJST1IgMAorI2VuZGlmICAvKiBQUk9DRUVEX09OX0VSUk9SICovCisjaWZuZGVmIFVTRV9MT0NLUworI2RlZmluZSBVU0VfTE9DS1MgMAorI2VuZGlmICAvKiBVU0VfTE9DS1MgKi8KKyNpZm5kZWYgSU5TRUNVUkUKKyNkZWZpbmUgSU5TRUNVUkUgMAorI2VuZGlmICAvKiBJTlNFQ1VSRSAqLworI2lmbmRlZiBIQVZFX01NQVAKKyNkZWZpbmUgSEFWRV9NTUFQIDEKKyNlbmRpZiAgLyogSEFWRV9NTUFQICovCisjaWZuZGVmIE1NQVBfQ0xFQVJTCisjZGVmaW5lIE1NQVBfQ0xFQVJTIDEKKyNlbmRpZiAgLyogTU1BUF9DTEVBUlMgKi8KKyNpZm5kZWYgSEFWRV9NUkVNQVAKKyNpZmRlZiBsaW51eAorI2RlZmluZSBIQVZFX01SRU1BUCAxCisjZWxzZSAgIC8qIGxpbnV4ICovCisjZGVmaW5lIEhBVkVfTVJFTUFQIDAKKyNlbmRpZiAgLyogbGludXggKi8KKyNlbmRpZiAgLyogSEFWRV9NUkVNQVAgKi8KKyNpZm5kZWYgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OCisjZGVmaW5lIE1BTExPQ19GQUlMVVJFX0FDVElPTiAgZXJybm8gPSBFTk9NRU07CisjZW5kaWYgIC8qIE1BTExPQ19GQUlMVVJFX0FDVElPTiAqLworI2lmbmRlZiBIQVZFX01PUkVDT1JFCisjaWYgT05MWV9NU1BBQ0VTCisjZGVmaW5lIEhBVkVfTU9SRUNPUkUgMAorI2Vsc2UgICAvKiBPTkxZX01TUEFDRVMgKi8KKyNkZWZpbmUgSEFWRV9NT1JFQ09SRSAxCisjZW5kaWYgIC8qIE9OTFlfTVNQQUNFUyAqLworI2VuZGlmICAvKiBIQVZFX01PUkVDT1JFICovCisjaWYgIUhBVkVfTU9SRUNPUkUKKyNkZWZpbmUgTU9SRUNPUkVfQ09OVElHVU9VUyAwCisjZWxzZSAgIC8qICFIQVZFX01PUkVDT1JFICovCisjaWZuZGVmIE1PUkVDT1JFCisjZGVmaW5lIE1PUkVDT1JFIHNicmsKKyNlbmRpZiAgLyogTU9SRUNPUkUgKi8KKyNpZm5kZWYgTU9SRUNPUkVfQ09OVElHVU9VUworI2RlZmluZSBNT1JFQ09SRV9DT05USUdVT1VTIDEKKyNlbmRpZiAgLyogTU9SRUNPUkVfQ09OVElHVU9VUyAqLworI2VuZGlmICAvKiBIQVZFX01PUkVDT1JFICovCisjaWZuZGVmIERFRkFVTFRfR1JBTlVMQVJJVFkKKyNpZiBNT1JFQ09SRV9DT05USUdVT1VTCisjZGVmaW5lIERFRkFVTFRfR1JBTlVMQVJJVFkgKDApICAvKiAwIG1lYW5zIHRvIGNvbXB1dGUgaW4gaW5pdF9tcGFyYW1zICovCisjZWxzZSAgIC8qIE1PUkVDT1JFX0NPTlRJR1VPVVMgKi8KKyNkZWZpbmUgREVGQVVMVF9HUkFOVUxBUklUWSAoKHNpemVfdCk2NFUgKiAoc2l6ZV90KTEwMjRVKQorI2VuZGlmICAvKiBNT1JFQ09SRV9DT05USUdVT1VTICovCisjZW5kaWYgIC8qIERFRkFVTFRfR1JBTlVMQVJJVFkgKi8KKyNpZm5kZWYgREVGQVVMVF9UUklNX1RIUkVTSE9MRAorI2lmbmRlZiBNT1JFQ09SRV9DQU5OT1RfVFJJTQorI2RlZmluZSBERUZBVUxUX1RSSU1fVEhSRVNIT0xEICgoc2l6ZV90KTJVICogKHNpemVfdCkxMDI0VSAqIChzaXplX3QpMTAyNFUpCisjZWxzZSAgIC8qIE1PUkVDT1JFX0NBTk5PVF9UUklNICovCisjZGVmaW5lIERFRkFVTFRfVFJJTV9USFJFU0hPTEQgTUFYX1NJWkVfVAorI2VuZGlmICAvKiBNT1JFQ09SRV9DQU5OT1RfVFJJTSAqLworI2VuZGlmICAvKiBERUZBVUxUX1RSSU1fVEhSRVNIT0xEICovCisjaWZuZGVmIERFRkFVTFRfTU1BUF9USFJFU0hPTEQKKyNpZiBIQVZFX01NQVAKKyNkZWZpbmUgREVGQVVMVF9NTUFQX1RIUkVTSE9MRCAoKHNpemVfdCkyNTZVICogKHNpemVfdCkxMDI0VSkKKyNlbHNlICAgLyogSEFWRV9NTUFQICovCisjZGVmaW5lIERFRkFVTFRfTU1BUF9USFJFU0hPTEQgTUFYX1NJWkVfVAorI2VuZGlmICAvKiBIQVZFX01NQVAgKi8KKyNlbmRpZiAgLyogREVGQVVMVF9NTUFQX1RIUkVTSE9MRCAqLworI2lmbmRlZiBVU0VfQlVJTFRJTl9GRlMKKyNkZWZpbmUgVVNFX0JVSUxUSU5fRkZTIDAKKyNlbmRpZiAgLyogVVNFX0JVSUxUSU5fRkZTICovCisjaWZuZGVmIFVTRV9ERVZfUkFORE9NCisjZGVmaW5lIFVTRV9ERVZfUkFORE9NIDAKKyNlbmRpZiAgLyogVVNFX0RFVl9SQU5ET00gKi8KKyNpZm5kZWYgTk9fTUFMTElORk8KKyNkZWZpbmUgTk9fTUFMTElORk8gMAorI2VuZGlmICAvKiBOT19NQUxMSU5GTyAqLworI2lmbmRlZiBNQUxMSU5GT19GSUVMRF9UWVBFCisjZGVmaW5lIE1BTExJTkZPX0ZJRUxEX1RZUEUgc2l6ZV90CisjZW5kaWYgIC8qIE1BTExJTkZPX0ZJRUxEX1RZUEUgKi8KKworLyoKKyAgbWFsbG9wdCB0dW5pbmcgb3B0aW9ucy4gIFNWSUQvWFBHIGRlZmluZXMgZm91ciBzdGFuZGFyZCBwYXJhbWV0ZXIKKyAgbnVtYmVycyBmb3IgbWFsbG9wdCwgbm9ybWFsbHkgZGVmaW5lZCBpbiBtYWxsb2MuaC4gIE5vbmUgb2YgdGhlc2UKKyAgYXJlIHVzZWQgaW4gdGhpcyBtYWxsb2MsIHNvIHNldHRpbmcgdGhlbSBoYXMgbm8gZWZmZWN0LiBCdXQgdGhpcworICBtYWxsb2MgZG9lcyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3B0aW9ucy4KKyovCisKKyNkZWZpbmUgTV9UUklNX1RIUkVTSE9MRCAgICAgKC0xKQorI2RlZmluZSBNX0dSQU5VTEFSSVRZICAgICAgICAoLTIpCisjZGVmaW5lIE1fTU1BUF9USFJFU0hPTEQgICAgICgtMykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbGxpbmZvIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICFOT19NQUxMSU5GTworLyoKKyAgVGhpcyB2ZXJzaW9uIG9mIG1hbGxvYyBzdXBwb3J0cyB0aGUgc3RhbmRhcmQgU1ZJRC9YUEcgbWFsbGluZm8KKyAgcm91dGluZSB0aGF0IHJldHVybnMgYSBzdHJ1Y3QgY29udGFpbmluZyB1c2FnZSBwcm9wZXJ0aWVzIGFuZAorICBzdGF0aXN0aWNzLiBJdCBzaG91bGQgd29yayBvbiBhbnkgc3lzdGVtIHRoYXQgaGFzIGEKKyAgL3Vzci9pbmNsdWRlL21hbGxvYy5oIGRlZmluaW5nIHN0cnVjdCBtYWxsaW5mby4gIFRoZSBtYWluCisgIGRlY2xhcmF0aW9uIG5lZWRlZCBpcyB0aGUgbWFsbGluZm8gc3RydWN0IHRoYXQgaXMgcmV0dXJuZWQgKGJ5LWNvcHkpCisgIGJ5IG1hbGxpbmZvKCkuICBUaGUgbWFsbG9pbmZvIHN0cnVjdCBjb250YWlucyBhIGJ1bmNoIG9mIGZpZWxkcyB0aGF0CisgIGFyZSBub3QgZXZlbiBtZWFuaW5nZnVsIGluIHRoaXMgdmVyc2lvbiBvZiBtYWxsb2MuICBUaGVzZSBmaWVsZHMgYXJlCisgIGFyZSBpbnN0ZWFkIGZpbGxlZCBieSBtYWxsaW5mbygpIHdpdGggb3RoZXIgbnVtYmVycyB0aGF0IG1pZ2h0IGJlIG9mCisgIGludGVyZXN0LgorCisgIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggc2hvdWxkIGJlIHNldCBpZiB5b3UgaGF2ZSBhCisgIC91c3IvaW5jbHVkZS9tYWxsb2MuaCBmaWxlIHRoYXQgaW5jbHVkZXMgYSBkZWNsYXJhdGlvbiBvZiBzdHJ1Y3QKKyAgbWFsbGluZm8uICBJZiBzbywgaXQgaXMgaW5jbHVkZWQ7IGVsc2UgYSBjb21wbGlhbnQgdmVyc2lvbiBpcworICBkZWNsYXJlZCBiZWxvdy4gIFRoZXNlIG11c3QgYmUgcHJlY2lzZWx5IHRoZSBzYW1lIGZvciBtYWxsaW5mbygpIHRvCisgIHdvcmsuICBUaGUgb3JpZ2luYWwgU1ZJRCB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0LCBkZWZpbmVkIG9uIG1vc3QKKyAgc3lzdGVtcyB3aXRoIG1hbGxpbmZvLCBkZWNsYXJlcyBhbGwgZmllbGRzIGFzIGludHMuIEJ1dCBzb21lIG90aGVycworICBkZWZpbmUgYXMgdW5zaWduZWQgbG9uZy4gSWYgeW91ciBzeXN0ZW0gZGVmaW5lcyB0aGUgZmllbGRzIHVzaW5nIGEKKyAgdHlwZSBvZiBkaWZmZXJlbnQgd2lkdGggdGhhbiBsaXN0ZWQgaGVyZSwgeW91IE1VU1QgI2luY2x1ZGUgeW91cgorICBzeXN0ZW0gdmVyc2lvbiBhbmQgI2RlZmluZSBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19ILgorKi8KKworLyogI2RlZmluZSBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IICovCisKKyNpZmRlZiBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19ICisjaW5jbHVkZSAiL3Vzci9pbmNsdWRlL21hbGxvYy5oIgorI2Vsc2UgLyogSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCAqLworCisvKiBIUC1VWCdzIHN0ZGxpYi5oIHJlZGVmaW5lcyBtYWxsaW5mbyB1bmxlc3MgX1NUUlVDVF9NQUxMSU5GTyBpcyBkZWZpbmVkICovCisjZGVmaW5lIF9TVFJVQ1RfTUFMTElORk8KKworc3RydWN0IG1hbGxpbmZvIHsKKyAgTUFMTElORk9fRklFTERfVFlQRSBhcmVuYTsgICAgLyogbm9uLW1tYXBwZWQgc3BhY2UgYWxsb2NhdGVkIGZyb20gc3lzdGVtICovCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgb3JkYmxrczsgIC8qIG51bWJlciBvZiBmcmVlIGNodW5rcyAqLworICBNQUxMSU5GT19GSUVMRF9UWVBFIHNtYmxrczsgICAvKiBhbHdheXMgMCAqLworICBNQUxMSU5GT19GSUVMRF9UWVBFIGhibGtzOyAgICAvKiBhbHdheXMgMCAqLworICBNQUxMSU5GT19GSUVMRF9UWVBFIGhibGtoZDsgICAvKiBzcGFjZSBpbiBtbWFwcGVkIHJlZ2lvbnMgKi8KKyAgTUFMTElORk9fRklFTERfVFlQRSB1c21ibGtzOyAgLyogbWF4aW11bSB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UgKi8KKyAgTUFMTElORk9fRklFTERfVFlQRSBmc21ibGtzOyAgLyogYWx3YXlzIDAgKi8KKyAgTUFMTElORk9fRklFTERfVFlQRSB1b3JkYmxrczsgLyogdG90YWwgYWxsb2NhdGVkIHNwYWNlICovCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgZm9yZGJsa3M7IC8qIHRvdGFsIGZyZWUgc3BhY2UgKi8KKyAgTUFMTElORk9fRklFTERfVFlQRSBrZWVwY29zdDsgLyogcmVsZWFzYWJsZSAodmlhIG1hbGxvY190cmltKSBzcGFjZSAqLworfTsKKworI2VuZGlmIC8qIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKi8KKyNlbmRpZiAvKiBOT19NQUxMSU5GTyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpZiAhT05MWV9NU1BBQ0VTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRGVjbGFyYXRpb25zIG9mIHB1YmxpYyByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgVVNFX0RMX1BSRUZJWAorI2RlZmluZSBkbGNhbGxvYyAgICAgICAgICAgICAgIGNhbGxvYworI2RlZmluZSBkbGZyZWUgICAgICAgICAgICAgICAgIGZyZWUKKyNkZWZpbmUgZGxtYWxsb2MgICAgICAgICAgICAgICBtYWxsb2MKKyNkZWZpbmUgZGxtZW1hbGlnbiAgICAgICAgICAgICBtZW1hbGlnbgorI2RlZmluZSBkbHJlYWxsb2MgICAgICAgICAgICAgIHJlYWxsb2MKKyNkZWZpbmUgZGx2YWxsb2MgICAgICAgICAgICAgICB2YWxsb2MKKyNkZWZpbmUgZGxwdmFsbG9jICAgICAgICAgICAgICBwdmFsbG9jCisjZGVmaW5lIGRsbWFsbGluZm8gICAgICAgICAgICAgbWFsbGluZm8KKyNkZWZpbmUgZGxtYWxsb3B0ICAgICAgICAgICAgICBtYWxsb3B0CisjZGVmaW5lIGRsbWFsbG9jX3RyaW0gICAgICAgICAgbWFsbG9jX3RyaW0KKyNkZWZpbmUgZGxtYWxsb2Nfc3RhdHMgICAgICAgICBtYWxsb2Nfc3RhdHMKKyNkZWZpbmUgZGxtYWxsb2NfdXNhYmxlX3NpemUgICBtYWxsb2NfdXNhYmxlX3NpemUKKyNkZWZpbmUgZGxtYWxsb2NfZm9vdHByaW50ICAgICBtYWxsb2NfZm9vdHByaW50CisjZGVmaW5lIGRsbWFsbG9jX21heF9mb290cHJpbnQgbWFsbG9jX21heF9mb290cHJpbnQKKyNkZWZpbmUgZGxpbmRlcGVuZGVudF9jYWxsb2MgICBpbmRlcGVuZGVudF9jYWxsb2MKKyNkZWZpbmUgZGxpbmRlcGVuZGVudF9jb21hbGxvYyBpbmRlcGVuZGVudF9jb21hbGxvYworI2VuZGlmIC8qIFVTRV9ETF9QUkVGSVggKi8KKworCisvKgorICBtYWxsb2Moc2l6ZV90IG4pCisgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGNodW5rIG9mIGF0IGxlYXN0IG4gYnl0ZXMsIG9yCisgIG51bGwgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLCBpbiB3aGljaCBjYXNlIGVycm5vIGlzIHNldCB0byBFTk9NRU0KKyAgb24gQU5TSSBDIHN5c3RlbXMuCisKKyAgSWYgbiBpcyB6ZXJvLCBtYWxsb2MgcmV0dXJucyBhIG1pbmltdW0tc2l6ZWQgY2h1bmsuIChUaGUgbWluaW11bQorICBzaXplIGlzIDE2IGJ5dGVzIG9uIG1vc3QgMzJiaXQgc3lzdGVtcywgYW5kIDMyIGJ5dGVzIG9uIDY0Yml0CisgIHN5c3RlbXMuKSAgTm90ZSB0aGF0IHNpemVfdCBpcyBhbiB1bnNpZ25lZCB0eXBlLCBzbyBjYWxscyB3aXRoCisgIGFyZ3VtZW50cyB0aGF0IHdvdWxkIGJlIG5lZ2F0aXZlIGlmIHNpZ25lZCBhcmUgaW50ZXJwcmV0ZWQgYXMKKyAgcmVxdWVzdHMgZm9yIGh1Z2UgYW1vdW50cyBvZiBzcGFjZSwgd2hpY2ggd2lsbCBvZnRlbiBmYWlsLiBUaGUKKyAgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgb2YgbiBkaWZmZXJzIGFjcm9zcyBzeXN0ZW1zLCBidXQgaXMgaW4gYWxsCisgIGNhc2VzIGxlc3MgdGhhbiB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlIG9mIGEgc2l6ZV90LgorKi8KK3ZvaWQqIGRsbWFsbG9jKHNpemVfdCk7CisKKy8qCisgIGZyZWUodm9pZCogcCkKKyAgUmVsZWFzZXMgdGhlIGNodW5rIG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHAsIHRoYXQgaGFkIGJlZW4gcHJldmlvdXNseQorICBhbGxvY2F0ZWQgdXNpbmcgbWFsbG9jIG9yIGEgcmVsYXRlZCByb3V0aW5lIHN1Y2ggYXMgcmVhbGxvYy4KKyAgSXQgaGFzIG5vIGVmZmVjdCBpZiBwIGlzIG51bGwuIElmIHAgd2FzIG5vdCBtYWxsb2NlZCBvciBhbHJlYWR5CisgIGZyZWVkLCBmcmVlKHApIHdpbGwgYnkgZGVmYXVsdCBjYXVzZSB0aGUgY3VycmVudCBwcm9ncmFtIHRvIGFib3J0LgorKi8KK3ZvaWQgIGRsZnJlZSh2b2lkKik7CisKKy8qCisgIGNhbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1lbnRfc2l6ZSk7CisgIFJldHVybnMgYSBwb2ludGVyIHRvIG5fZWxlbWVudHMgKiBlbGVtZW50X3NpemUgYnl0ZXMsIHdpdGggYWxsIGxvY2F0aW9ucworICBzZXQgdG8gemVyby4KKyovCit2b2lkKiBkbGNhbGxvYyhzaXplX3QsIHNpemVfdCk7CisKKy8qCisgIHJlYWxsb2Modm9pZCogcCwgc2l6ZV90IG4pCisgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgY2h1bmsgb2Ygc2l6ZSBuIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgZGF0YQorICBhcyBkb2VzIGNodW5rIHAgdXAgdG8gdGhlIG1pbmltdW0gb2YgKG4sIHAncyBzaXplKSBieXRlcywgb3IgbnVsbAorICBpZiBubyBzcGFjZSBpcyBhdmFpbGFibGUuCisKKyAgVGhlIHJldHVybmVkIHBvaW50ZXIgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgcC4gVGhlIGFsZ29yaXRobQorICBwcmVmZXJzIGV4dGVuZGluZyBwIGluIG1vc3QgY2FzZXMgd2hlbiBwb3NzaWJsZSwgb3RoZXJ3aXNlIGl0CisgIGVtcGxveXMgdGhlIGVxdWl2YWxlbnQgb2YgYSBtYWxsb2MtY29weS1mcmVlIHNlcXVlbmNlLgorCisgIElmIHAgaXMgbnVsbCwgcmVhbGxvYyBpcyBlcXVpdmFsZW50IHRvIG1hbGxvYy4KKworICBJZiBzcGFjZSBpcyBub3QgYXZhaWxhYmxlLCByZWFsbG9jIHJldHVybnMgbnVsbCwgZXJybm8gaXMgc2V0IChpZiBvbgorICBBTlNJKSBhbmQgcCBpcyBOT1QgZnJlZWQuCisKKyAgaWYgbiBpcyBmb3IgZmV3ZXIgYnl0ZXMgdGhhbiBhbHJlYWR5IGhlbGQgYnkgcCwgdGhlIG5ld2x5IHVudXNlZAorICBzcGFjZSBpcyBsb3BwZWQgb2ZmIGFuZCBmcmVlZCBpZiBwb3NzaWJsZS4gIHJlYWxsb2Mgd2l0aCBhIHNpemUKKyAgYXJndW1lbnQgb2YgemVybyAocmUpYWxsb2NhdGVzIGEgbWluaW11bS1zaXplZCBjaHVuay4KKworICBUaGUgb2xkIHVuaXggcmVhbGxvYyBjb252ZW50aW9uIG9mIGFsbG93aW5nIHRoZSBsYXN0LWZyZWUnZCBjaHVuaworICB0byBiZSB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIHJlYWxsb2MgaXMgbm90IHN1cHBvcnRlZC4KKyovCisKK3ZvaWQqIGRscmVhbGxvYyh2b2lkKiwgc2l6ZV90KTsKKworLyoKKyAgbWVtYWxpZ24oc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IG4pOworICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBuIGJ5dGVzLCBhbGlnbmVkCisgIGluIGFjY29yZCB3aXRoIHRoZSBhbGlnbm1lbnQgYXJndW1lbnQuCisKKyAgVGhlIGFsaWdubWVudCBhcmd1bWVudCBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28uIElmIHRoZSBhcmd1bWVudCBpcworICBub3QgYSBwb3dlciBvZiB0d28sIHRoZSBuZWFyZXN0IGdyZWF0ZXIgcG93ZXIgaXMgdXNlZC4KKyAgOC1ieXRlIGFsaWdubWVudCBpcyBndWFyYW50ZWVkIGJ5IG5vcm1hbCBtYWxsb2MgY2FsbHMsIHNvIGRvbid0CisgIGJvdGhlciBjYWxsaW5nIG1lbWFsaWduIHdpdGggYW4gYXJndW1lbnQgb2YgOCBvciBsZXNzLgorCisgIE92ZXJyZWxpYW5jZSBvbiBtZW1hbGlnbiBpcyBhIHN1cmUgd2F5IHRvIGZyYWdtZW50IHNwYWNlLgorKi8KK3ZvaWQqIGRsbWVtYWxpZ24oc2l6ZV90LCBzaXplX3QpOworCisvKgorICB2YWxsb2Moc2l6ZV90IG4pOworICBFcXVpdmFsZW50IHRvIG1lbWFsaWduKHBhZ2VzaXplLCBuKSwgd2hlcmUgcGFnZXNpemUgaXMgdGhlIHBhZ2UKKyAgc2l6ZSBvZiB0aGUgc3lzdGVtLiBJZiB0aGUgcGFnZXNpemUgaXMgdW5rbm93biwgNDA5NiBpcyB1c2VkLgorKi8KK3ZvaWQqIGRsdmFsbG9jKHNpemVfdCk7CisKKy8qCisgIG1hbGxvcHQoaW50IHBhcmFtZXRlcl9udW1iZXIsIGludCBwYXJhbWV0ZXJfdmFsdWUpCisgIFNldHMgdHVuYWJsZSBwYXJhbWV0ZXJzIFRoZSBmb3JtYXQgaXMgdG8gcHJvdmlkZSBhCisgIChwYXJhbWV0ZXItbnVtYmVyLCBwYXJhbWV0ZXItdmFsdWUpIHBhaXIuICBtYWxsb3B0IHRoZW4gc2V0cyB0aGUKKyAgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgdG8gdGhlIGFyZ3VtZW50IHZhbHVlIGlmIGl0IGNhbiAoaS5lLiwgc28KKyAgbG9uZyBhcyB0aGUgdmFsdWUgaXMgbWVhbmluZ2Z1bCksIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBlbHNlCisgIDAuICBTVklEL1hQRy9BTlNJIGRlZmluZXMgZm91ciBzdGFuZGFyZCBwYXJhbSBudW1iZXJzIGZvciBtYWxsb3B0LAorICBub3JtYWxseSBkZWZpbmVkIGluIG1hbGxvYy5oLiAgTm9uZSBvZiB0aGVzZSBhcmUgdXNlIGluIHRoaXMgbWFsbG9jLAorICBzbyBzZXR0aW5nIHRoZW0gaGFzIG5vIGVmZmVjdC4gQnV0IHRoaXMgbWFsbG9jIGFsc28gc3VwcG9ydHMgb3RoZXIKKyAgb3B0aW9ucyBpbiBtYWxsb3B0LiBTZWUgYmVsb3cgZm9yIGRldGFpbHMuICBCcmllZmx5LCBzdXBwb3J0ZWQKKyAgcGFyYW1ldGVycyBhcmUgYXMgZm9sbG93cyAobGlzdGVkIGRlZmF1bHRzIGFyZSBmb3IgInR5cGljYWwiCisgIGNvbmZpZ3VyYXRpb25zKS4KKworICBTeW1ib2wgICAgICAgICAgICBwYXJhbSAjICBkZWZhdWx0ICAgIGFsbG93ZWQgcGFyYW0gdmFsdWVzCisgIE1fVFJJTV9USFJFU0hPTEQgICAgIC0xICAgMioxMDI0KjEwMjQgICBhbnkgICAoTUFYX1NJWkVfVCBkaXNhYmxlcykKKyAgTV9HUkFOVUxBUklUWSAgICAgICAgLTIgICAgIHBhZ2Ugc2l6ZSAgIGFueSBwb3dlciBvZiAyID49IHBhZ2Ugc2l6ZQorICBNX01NQVBfVEhSRVNIT0xEICAgICAtMyAgICAgIDI1NioxMDI0ICAgYW55ICAgKG9yIDAgaWYgbm8gTU1BUCBzdXBwb3J0KQorKi8KK2ludCBkbG1hbGxvcHQoaW50LCBpbnQpOworCisvKgorICBtYWxsb2NfZm9vdHByaW50KCk7CisgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvYnRhaW5lZCBmcm9tIHRoZSBzeXN0ZW0uICBUaGUgdG90YWwKKyAgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBieSBtYWxsb2MsIHJlYWxsb2MgZXRjLiwgaXMgbGVzcyB0aGFuIHRoaXMKKyAgdmFsdWUuIFVubGlrZSBtYWxsaW5mbywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9ubHkgYSBwcmVjb21wdXRlZAorICByZXN1bHQsIHNvIGNhbiBiZSBjYWxsZWQgZnJlcXVlbnRseSB0byBtb25pdG9yIG1lbW9yeSBjb25zdW1wdGlvbi4KKyAgRXZlbiBpZiBsb2NrcyBhcmUgb3RoZXJ3aXNlIGRlZmluZWQsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdXNlIHRoZW0sCisgIHNvIHJlc3VsdHMgbWlnaHQgbm90IGJlIHVwIHRvIGRhdGUuCisqLworc2l6ZV90IGRsbWFsbG9jX2Zvb3RwcmludCh2b2lkKTsKKworLyoKKyAgbWFsbG9jX21heF9mb290cHJpbnQoKTsKKyAgUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb2J0YWluZWQgZnJvbSB0aGUgc3lzdGVtLiBUaGlzCisgIHZhbHVlIHdpbGwgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgZm9vdHByaW50IGlmIGRlYWxsb2NhdGVkIHNwYWNlCisgIGhhcyBiZWVuIHJlY2xhaW1lZCBieSB0aGUgc3lzdGVtLiBUaGUgcGVhayBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkCisgIGJ5IG1hbGxvYywgcmVhbGxvYyBldGMuLCBpcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gVW5saWtlIG1hbGxpbmZvLAorICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgb25seSBhIHByZWNvbXB1dGVkIHJlc3VsdCwgc28gY2FuIGJlIGNhbGxlZAorICBmcmVxdWVudGx5IHRvIG1vbml0b3IgbWVtb3J5IGNvbnN1bXB0aW9uLiAgRXZlbiBpZiBsb2NrcyBhcmUKKyAgb3RoZXJ3aXNlIGRlZmluZWQsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdXNlIHRoZW0sIHNvIHJlc3VsdHMgbWlnaHQKKyAgbm90IGJlIHVwIHRvIGRhdGUuCisqLworc2l6ZV90IGRsbWFsbG9jX21heF9mb290cHJpbnQodm9pZCk7CisKKyNpZiAhTk9fTUFMTElORk8KKy8qCisgIG1hbGxpbmZvKCkKKyAgUmV0dXJucyAoYnkgY29weSkgYSBzdHJ1Y3QgY29udGFpbmluZyB2YXJpb3VzIHN1bW1hcnkgc3RhdGlzdGljczoKKworICBhcmVuYTogICAgIGN1cnJlbnQgdG90YWwgbm9uLW1tYXBwZWQgYnl0ZXMgYWxsb2NhdGVkIGZyb20gc3lzdGVtCisgIG9yZGJsa3M6ICAgdGhlIG51bWJlciBvZiBmcmVlIGNodW5rcworICBzbWJsa3M6ICAgIGFsd2F5cyB6ZXJvLgorICBoYmxrczogICAgIGN1cnJlbnQgbnVtYmVyIG9mIG1tYXBwZWQgcmVnaW9ucworICBoYmxraGQ6ICAgIHRvdGFsIGJ5dGVzIGhlbGQgaW4gbW1hcHBlZCByZWdpb25zCisgIHVzbWJsa3M6ICAgdGhlIG1heGltdW0gdG90YWwgYWxsb2NhdGVkIHNwYWNlLiBUaGlzIHdpbGwgYmUgZ3JlYXRlcgorICAgICAgICAgICAgICAgIHRoYW4gY3VycmVudCB0b3RhbCBpZiB0cmltbWluZyBoYXMgb2NjdXJyZWQuCisgIGZzbWJsa3M6ICAgYWx3YXlzIHplcm8KKyAgdW9yZGJsa3M6ICBjdXJyZW50IHRvdGFsIGFsbG9jYXRlZCBzcGFjZSAobm9ybWFsIG9yIG1tYXBwZWQpCisgIGZvcmRibGtzOiAgdG90YWwgZnJlZSBzcGFjZQorICBrZWVwY29zdDogIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIGlkZWFsbHkgYmUgcmVsZWFzZWQKKyAgICAgICAgICAgICAgIGJhY2sgdG8gc3lzdGVtIHZpYSBtYWxsb2NfdHJpbS4gKCJpZGVhbGx5IiBtZWFucyB0aGF0CisgICAgICAgICAgICAgICBpdCBpZ25vcmVzIHBhZ2UgcmVzdHJpY3Rpb25zIGV0Yy4pCisKKyAgQmVjYXVzZSB0aGVzZSBmaWVsZHMgYXJlIGludHMsIGJ1dCBpbnRlcm5hbCBib29ra2VlcGluZyBtYXkKKyAgYmUga2VwdCBhcyBsb25ncywgdGhlIHJlcG9ydGVkIHZhbHVlcyBtYXkgd3JhcCBhcm91bmQgemVybyBhbmQKKyAgdGh1cyBiZSBpbmFjY3VyYXRlLgorKi8KK3N0cnVjdCBtYWxsaW5mbyBkbG1hbGxpbmZvKHZvaWQpOworI2VuZGlmIC8qIE5PX01BTExJTkZPICovCisKKy8qCisgIGluZGVwZW5kZW50X2NhbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwgdm9pZCogY2h1bmtzW10pOworCisgIGluZGVwZW5kZW50X2NhbGxvYyBpcyBzaW1pbGFyIHRvIGNhbGxvYywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGEKKyAgc2luZ2xlIGNsZWFyZWQgc3BhY2UsIGl0IHJldHVybnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gbl9lbGVtZW50cworICBpbmRlcGVuZGVudCBlbGVtZW50cyB0aGF0IGNhbiBob2xkIGNvbnRlbnRzIG9mIHNpemUgZWxlbV9zaXplLCBlYWNoCisgIG9mIHdoaWNoIHN0YXJ0cyBvdXQgY2xlYXJlZCwgYW5kIGNhbiBiZSBpbmRlcGVuZGVudGx5IGZyZWVkLAorICByZWFsbG9jJ2VkIGV0Yy4gVGhlIGVsZW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGFkamFjZW50bHkKKyAgYWxsb2NhdGVkICh0aGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIG9jY3VyIHdpdGggbXVsdGlwbGUgY2FsbG9jcyBvcgorICBtYWxsb2NzKSwgd2hpY2ggbWF5IGFsc28gaW1wcm92ZSBjYWNoZSBsb2NhbGl0eSBpbiBzb21lCisgIGFwcGxpY2F0aW9ucy4KKworICBUaGUgImNodW5rcyIgYXJndW1lbnQgaXMgb3B0aW9uYWwgKGkuZS4sIG1heSBiZSBudWxsLCB3aGljaCBpcworICBwcm9iYWJseSB0aGUgbW9zdCB0eXBpY2FsIHVzYWdlKS4gSWYgaXQgaXMgbnVsbCwgdGhlIHJldHVybmVkIGFycmF5CisgIGlzIGl0c2VsZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIHNob3VsZCBhbHNvIGJlIGZyZWVkIHdoZW4gaXQgaXMKKyAgbm8gbG9uZ2VyIG5lZWRlZC4gT3RoZXJ3aXNlLCB0aGUgY2h1bmtzIGFycmF5IG11c3QgYmUgb2YgYXQgbGVhc3QKKyAgbl9lbGVtZW50cyBpbiBsZW5ndGguIEl0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBwb2ludGVycyB0byB0aGUKKyAgY2h1bmtzLgorCisgIEluIGVpdGhlciBjYXNlLCBpbmRlcGVuZGVudF9jYWxsb2MgcmV0dXJucyB0aGlzIHBvaW50ZXIgYXJyYXksIG9yCisgIG51bGwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLiAgSWYgbl9lbGVtZW50cyBpcyB6ZXJvIGFuZCAiY2h1bmtzIgorICBpcyBudWxsLCBpdCByZXR1cm5zIGEgY2h1bmsgcmVwcmVzZW50aW5nIGFuIGFycmF5IHdpdGggemVybyBlbGVtZW50cworICAod2hpY2ggc2hvdWxkIGJlIGZyZWVkIGlmIG5vdCB3YW50ZWQpLgorCisgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGluZGl2aWR1YWxseSBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlcgorICBuZWVkZWQuIElmIHlvdSdkIGxpa2UgdG8gaW5zdGVhZCBiZSBhYmxlIHRvIGZyZWUgYWxsIGF0IG9uY2UsIHlvdQorICBzaG91bGQgaW5zdGVhZCB1c2UgcmVndWxhciBjYWxsb2MgYW5kIGFzc2lnbiBwb2ludGVycyBpbnRvIHRoaXMKKyAgc3BhY2UgdG8gcmVwcmVzZW50IGVsZW1lbnRzLiAgKEluIHRoaXMgY2FzZSB0aG91Z2gsIHlvdSBjYW5ub3QKKyAgaW5kZXBlbmRlbnRseSBmcmVlIGVsZW1lbnRzLikKKworICBpbmRlcGVuZGVudF9jYWxsb2Mgc2ltcGxpZmllcyBhbmQgc3BlZWRzIHVwIGltcGxlbWVudGF0aW9ucyBvZiBtYW55CisgIGtpbmRzIG9mIHBvb2xzLiAgSXQgbWF5IGFsc28gYmUgdXNlZnVsIHdoZW4gY29uc3RydWN0aW5nIGxhcmdlIGRhdGEKKyAgc3RydWN0dXJlcyB0aGF0IGluaXRpYWxseSBoYXZlIGEgZml4ZWQgbnVtYmVyIG9mIGZpeGVkLXNpemVkIG5vZGVzLAorICBidXQgdGhlIG51bWJlciBpcyBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLCBhbmQgc29tZSBvZiB0aGUgbm9kZXMKKyAgbWF5IGxhdGVyIG5lZWQgdG8gYmUgZnJlZWQuIEZvciBleGFtcGxlOgorCisgIHN0cnVjdCBOb2RlIHsgaW50IGl0ZW07IHN0cnVjdCBOb2RlKiBuZXh0OyB9OworCisgIHN0cnVjdCBOb2RlKiBidWlsZF9saXN0KCkgeworICAgIHN0cnVjdCBOb2RlKiogcG9vbDsKKyAgICBpbnQgbiA9IHJlYWRfbnVtYmVyX29mX25vZGVzX25lZWRlZCgpOworICAgIGlmIChuIDw9IDApIHJldHVybiAwOworICAgIHBvb2wgPSAoc3RydWN0IE5vZGUqKikoaW5kZXBlbmRlbnRfY2FsbG9jKG4sIHNpemVvZihzdHJ1Y3QgTm9kZSksIDApOworICAgIGlmIChwb29sID09IDApIGRpZSgpOworICAgIC8vIG9yZ2FuaXplIGludG8gYSBsaW5rZWQgbGlzdC4uLgorICAgIHN0cnVjdCBOb2RlKiBmaXJzdCA9IHBvb2xbMF07CisgICAgZm9yIChpID0gMDsgaSA8IG4tMTsgKytpKQorICAgICAgcG9vbFtpXS0+bmV4dCA9IHBvb2xbaSsxXTsKKyAgICBmcmVlKHBvb2wpOyAgICAgLy8gQ2FuIG5vdyBmcmVlIHRoZSBhcnJheSAob3Igbm90LCBpZiBpdCBpcyBuZWVkZWQgbGF0ZXIpCisgICAgcmV0dXJuIGZpcnN0OworICB9CisqLwordm9pZCoqIGRsaW5kZXBlbmRlbnRfY2FsbG9jKHNpemVfdCwgc2l6ZV90LCB2b2lkKiopOworCisvKgorICBpbmRlcGVuZGVudF9jb21hbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IHNpemVzW10sIHZvaWQqIGNodW5rc1tdKTsKKworICBpbmRlcGVuZGVudF9jb21hbGxvYyBhbGxvY2F0ZXMsIGFsbCBhdCBvbmNlLCBhIHNldCBvZiBuX2VsZW1lbnRzCisgIGNodW5rcyB3aXRoIHNpemVzIGluZGljYXRlZCBpbiB0aGUgInNpemVzIiBhcnJheS4gICAgSXQgcmV0dXJucworICBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0aGVzZSBlbGVtZW50cywgZWFjaCBvZiB3aGljaCBjYW4gYmUKKyAgaW5kZXBlbmRlbnRseSBmcmVlZCwgcmVhbGxvYydlZCBldGMuIFRoZSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZCB0bworICBiZSBhZGphY2VudGx5IGFsbG9jYXRlZCAodGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBvY2N1ciB3aXRoCisgIG11bHRpcGxlIGNhbGxvY3Mgb3IgbWFsbG9jcyksIHdoaWNoIG1heSBhbHNvIGltcHJvdmUgY2FjaGUgbG9jYWxpdHkKKyAgaW4gc29tZSBhcHBsaWNhdGlvbnMuCisKKyAgVGhlICJjaHVua3MiIGFyZ3VtZW50IGlzIG9wdGlvbmFsIChpLmUuLCBtYXkgYmUgbnVsbCkuIElmIGl0IGlzIG51bGwKKyAgdGhlIHJldHVybmVkIGFycmF5IGlzIGl0c2VsZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIHNob3VsZCBhbHNvCisgIGJlIGZyZWVkIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gT3RoZXJ3aXNlLCB0aGUgY2h1bmtzIGFycmF5CisgIG11c3QgYmUgb2YgYXQgbGVhc3Qgbl9lbGVtZW50cyBpbiBsZW5ndGguIEl0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZQorICBwb2ludGVycyB0byB0aGUgY2h1bmtzLgorCisgIEluIGVpdGhlciBjYXNlLCBpbmRlcGVuZGVudF9jb21hbGxvYyByZXR1cm5zIHRoaXMgcG9pbnRlciBhcnJheSwgb3IKKyAgbnVsbCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQuICBJZiBuX2VsZW1lbnRzIGlzIHplcm8gYW5kIGNodW5rcyBpcworICBudWxsLCBpdCByZXR1cm5zIGEgY2h1bmsgcmVwcmVzZW50aW5nIGFuIGFycmF5IHdpdGggemVybyBlbGVtZW50cworICAod2hpY2ggc2hvdWxkIGJlIGZyZWVkIGlmIG5vdCB3YW50ZWQpLgorCisgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGluZGl2aWR1YWxseSBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlcgorICBuZWVkZWQuIElmIHlvdSdkIGxpa2UgdG8gaW5zdGVhZCBiZSBhYmxlIHRvIGZyZWUgYWxsIGF0IG9uY2UsIHlvdQorICBzaG91bGQgaW5zdGVhZCB1c2UgYSBzaW5nbGUgcmVndWxhciBtYWxsb2MsIGFuZCBhc3NpZ24gcG9pbnRlcnMgYXQKKyAgcGFydGljdWxhciBvZmZzZXRzIGluIHRoZSBhZ2dyZWdhdGUgc3BhY2UuIChJbiB0aGlzIGNhc2UgdGhvdWdoLCB5b3UKKyAgY2Fubm90IGluZGVwZW5kZW50bHkgZnJlZSBlbGVtZW50cy4pCisKKyAgaW5kZXBlbmRlbnRfY29tYWxsYWMgZGlmZmVycyBmcm9tIGluZGVwZW5kZW50X2NhbGxvYyBpbiB0aGF0IGVhY2gKKyAgZWxlbWVudCBtYXkgaGF2ZSBhIGRpZmZlcmVudCBzaXplLCBhbmQgYWxzbyB0aGF0IGl0IGRvZXMgbm90CisgIGF1dG9tYXRpY2FsbHkgY2xlYXIgZWxlbWVudHMuCisKKyAgaW5kZXBlbmRlbnRfY29tYWxsb2MgY2FuIGJlIHVzZWQgdG8gc3BlZWQgdXAgYWxsb2NhdGlvbiBpbiBjYXNlcworICB3aGVyZSBzZXZlcmFsIHN0cnVjdHMgb3Igb2JqZWN0cyBtdXN0IGFsd2F5cyBiZSBhbGxvY2F0ZWQgYXQgdGhlCisgIHNhbWUgdGltZS4gIEZvciBleGFtcGxlOgorCisgIHN0cnVjdCBIZWFkIHsgLi4uIH0KKyAgc3RydWN0IEZvb3QgeyAuLi4gfQorCisgIHZvaWQgc2VuZF9tZXNzYWdlKGNoYXIqIG1zZykgeworICAgIGludCBtc2dsZW4gPSBzdHJsZW4obXNnKTsKKyAgICBzaXplX3Qgc2l6ZXNbM10gPSB7IHNpemVvZihzdHJ1Y3QgSGVhZCksIG1zZ2xlbiwgc2l6ZW9mKHN0cnVjdCBGb290KSB9OworICAgIHZvaWQqIGNodW5rc1szXTsKKyAgICBpZiAoaW5kZXBlbmRlbnRfY29tYWxsb2MoMywgc2l6ZXMsIGNodW5rcykgPT0gMCkKKyAgICAgIGRpZSgpOworICAgIHN0cnVjdCBIZWFkKiBoZWFkID0gKHN0cnVjdCBIZWFkKikoY2h1bmtzWzBdKTsKKyAgICBjaGFyKiAgICAgICAgYm9keSA9IChjaGFyKikoY2h1bmtzWzFdKTsKKyAgICBzdHJ1Y3QgRm9vdCogZm9vdCA9IChzdHJ1Y3QgRm9vdCopKGNodW5rc1syXSk7CisgICAgLy8gLi4uCisgIH0KKworICBJbiBnZW5lcmFsIHRob3VnaCwgaW5kZXBlbmRlbnRfY29tYWxsb2MgaXMgd29ydGggdXNpbmcgb25seSBmb3IKKyAgbGFyZ2VyIHZhbHVlcyBvZiBuX2VsZW1lbnRzLiBGb3Igc21hbGwgdmFsdWVzLCB5b3UgcHJvYmFibHkgd29uJ3QKKyAgZGV0ZWN0IGVub3VnaCBkaWZmZXJlbmNlIGZyb20gc2VyaWVzIG9mIG1hbGxvYyBjYWxscyB0byBib3RoZXIuCisKKyAgT3ZlcnVzZSBvZiBpbmRlcGVuZGVudF9jb21hbGxvYyBjYW4gaW5jcmVhc2Ugb3ZlcmFsbCBtZW1vcnkgdXNhZ2UsCisgIHNpbmNlIGl0IGNhbm5vdCByZXVzZSBleGlzdGluZyBub25jb250aWd1b3VzIHNtYWxsIGNodW5rcyB0aGF0CisgIG1pZ2h0IGJlIGF2YWlsYWJsZSBmb3Igc29tZSBvZiB0aGUgZWxlbWVudHMuCisqLwordm9pZCoqIGRsaW5kZXBlbmRlbnRfY29tYWxsb2Moc2l6ZV90LCBzaXplX3QqLCB2b2lkKiopOworCisKKy8qCisgIHB2YWxsb2Moc2l6ZV90IG4pOworICBFcXVpdmFsZW50IHRvIHZhbGxvYyhtaW5pbXVtLXBhZ2UtdGhhdC1ob2xkcyhuKSksIHRoYXQgaXMsCisgIHJvdW5kIHVwIG4gdG8gbmVhcmVzdCBwYWdlc2l6ZS4KKyAqLwordm9pZCogIGRscHZhbGxvYyhzaXplX3QpOworCisvKgorICBtYWxsb2NfdHJpbShzaXplX3QgcGFkKTsKKworICBJZiBwb3NzaWJsZSwgZ2l2ZXMgbWVtb3J5IGJhY2sgdG8gdGhlIHN5c3RlbSAodmlhIG5lZ2F0aXZlIGFyZ3VtZW50cworICB0byBzYnJrKSBpZiB0aGVyZSBpcyB1bnVzZWQgbWVtb3J5IGF0IHRoZSBgaGlnaCcgZW5kIG9mIHRoZSBtYWxsb2MKKyAgcG9vbCBvciBpbiB1bnVzZWQgTU1BUCBzZWdtZW50cy4gWW91IGNhbiBjYWxsIHRoaXMgYWZ0ZXIgZnJlZWluZworICBsYXJnZSBibG9ja3Mgb2YgbWVtb3J5IHRvIHBvdGVudGlhbGx5IHJlZHVjZSB0aGUgc3lzdGVtLWxldmVsIG1lbW9yeQorICByZXF1aXJlbWVudHMgb2YgYSBwcm9ncmFtLiBIb3dldmVyLCBpdCBjYW5ub3QgZ3VhcmFudGVlIHRvIHJlZHVjZQorICBtZW1vcnkuIFVuZGVyIHNvbWUgYWxsb2NhdGlvbiBwYXR0ZXJucywgc29tZSBsYXJnZSBmcmVlIGJsb2NrcyBvZgorICBtZW1vcnkgd2lsbCBiZSBsb2NrZWQgYmV0d2VlbiB0d28gdXNlZCBjaHVua3MsIHNvIHRoZXkgY2Fubm90IGJlCisgIGdpdmVuIGJhY2sgdG8gdGhlIHN5c3RlbS4KKworICBUaGUgYHBhZCcgYXJndW1lbnQgdG8gbWFsbG9jX3RyaW0gcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIGZyZWUKKyAgdHJhaWxpbmcgc3BhY2UgdG8gbGVhdmUgdW50cmltbWVkLiBJZiB0aGlzIGFyZ3VtZW50IGlzIHplcm8sIG9ubHkKKyAgdGhlIG1pbmltdW0gYW1vdW50IG9mIG1lbW9yeSB0byBtYWludGFpbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMKKyAgd2lsbCBiZSBsZWZ0LiBOb24temVybyBhcmd1bWVudHMgY2FuIGJlIHN1cHBsaWVkIHRvIG1haW50YWluIGVub3VnaAorICB0cmFpbGluZyBzcGFjZSB0byBzZXJ2aWNlIGZ1dHVyZSBleHBlY3RlZCBhbGxvY2F0aW9ucyB3aXRob3V0IGhhdmluZworICB0byByZS1vYnRhaW4gbWVtb3J5IGZyb20gdGhlIHN5c3RlbS4KKworICBNYWxsb2NfdHJpbSByZXR1cm5zIDEgaWYgaXQgYWN0dWFsbHkgcmVsZWFzZWQgYW55IG1lbW9yeSwgZWxzZSAwLgorKi8KK2ludCAgZGxtYWxsb2NfdHJpbShzaXplX3QpOworCisvKgorICBtYWxsb2NfdXNhYmxlX3NpemUodm9pZCogcCk7CisKKyAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSBjYW4gYWN0dWFsbHkgdXNlIGluCisgIGFuIGFsbG9jYXRlZCBjaHVuaywgd2hpY2ggbWF5IGJlIG1vcmUgdGhhbiB5b3UgcmVxdWVzdGVkIChhbHRob3VnaAorICBvZnRlbiBub3QpIGR1ZSB0byBhbGlnbm1lbnQgYW5kIG1pbmltdW0gc2l6ZSBjb25zdHJhaW50cy4KKyAgWW91IGNhbiB1c2UgdGhpcyBtYW55IGJ5dGVzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQKKyAgb3ZlcndyaXRpbmcgb3RoZXIgYWxsb2NhdGVkIG9iamVjdHMuIFRoaXMgaXMgbm90IGEgcGFydGljdWxhcmx5IGdyZWF0CisgIHByb2dyYW1taW5nIHByYWN0aWNlLiBtYWxsb2NfdXNhYmxlX3NpemUgY2FuIGJlIG1vcmUgdXNlZnVsIGluCisgIGRlYnVnZ2luZyBhbmQgYXNzZXJ0aW9ucywgZm9yIGV4YW1wbGU6CisKKyAgcCA9IG1hbGxvYyhuKTsKKyAgYXNzZXJ0KG1hbGxvY191c2FibGVfc2l6ZShwKSA+PSAyNTYpOworKi8KK3NpemVfdCBkbG1hbGxvY191c2FibGVfc2l6ZSh2b2lkKik7CisKKy8qCisgIG1hbGxvY19zdGF0cygpOworICBQcmludHMgb24gc3RkZXJyIHRoZSBhbW91bnQgb2Ygc3BhY2Ugb2J0YWluZWQgZnJvbSB0aGUgc3lzdGVtIChib3RoCisgIHZpYSBzYnJrIGFuZCBtbWFwKSwgdGhlIG1heGltdW0gYW1vdW50ICh3aGljaCBtYXkgYmUgbW9yZSB0aGFuCisgIGN1cnJlbnQgaWYgbWFsbG9jX3RyaW0gYW5kL29yIG11bm1hcCBnb3QgY2FsbGVkKSwgYW5kIHRoZSBjdXJyZW50CisgIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgdmlhIG1hbGxvYyAob3IgcmVhbGxvYywgZXRjKSBidXQgbm90IHlldAorICBmcmVlZC4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQsIG5vdCB0aGUKKyAgbnVtYmVyIHJlcXVlc3RlZC4gSXQgd2lsbCBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIHJlcXVlc3RlZAorICBiZWNhdXNlIG9mIGFsaWdubWVudCBhbmQgYm9va2tlZXBpbmcgb3ZlcmhlYWQuIEJlY2F1c2UgaXQgaW5jbHVkZXMKKyAgYWxpZ25tZW50IHdhc3RhZ2UgYXMgYmVpbmcgaW4gdXNlLCB0aGlzIGZpZ3VyZSBtYXkgYmUgZ3JlYXRlciB0aGFuCisgIHplcm8gZXZlbiB3aGVuIG5vIHVzZXItbGV2ZWwgY2h1bmtzIGFyZSBhbGxvY2F0ZWQuCisKKyAgVGhlIHJlcG9ydGVkIGN1cnJlbnQgYW5kIG1heGltdW0gc3lzdGVtIG1lbW9yeSBjYW4gYmUgaW5hY2N1cmF0ZSBpZgorICBhIHByb2dyYW0gbWFrZXMgb3RoZXIgY2FsbHMgdG8gc3lzdGVtIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucworICAobm9ybWFsbHkgc2Jyaykgb3V0c2lkZSBvZiBtYWxsb2MuCisKKyAgbWFsbG9jX3N0YXRzIHByaW50cyBvbmx5IHRoZSBtb3N0IGNvbW1vbmx5IGludGVyZXN0aW5nIHN0YXRpc3RpY3MuCisgIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcgbWFsbGluZm8uCisqLwordm9pZCAgZGxtYWxsb2Nfc3RhdHModm9pZCk7CisKKyNlbmRpZiAvKiBPTkxZX01TUEFDRVMgKi8KKworI2lmIE1TUEFDRVMKKworLyoKKyAgbXNwYWNlIGlzIGFuIG9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhbiBpbmRlcGVuZGVudAorICByZWdpb24gb2Ygc3BhY2UgdGhhdCBzdXBwb3J0cyBtc3BhY2VfbWFsbG9jLCBldGMuCisqLwordHlwZWRlZiB2b2lkKiBtc3BhY2U7CisKKy8qCisgIGNyZWF0ZV9tc3BhY2UgY3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbmRlcGVuZGVudCBzcGFjZSB3aXRoIHRoZQorICBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LCBvciwgaWYgMCwgdGhlIGRlZmF1bHQgZ3JhbnVsYXJpdHkgc2l6ZS4gIEl0CisgIHJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBzeXN0ZW0gbWVtb3J5IGF2YWlsYWJsZSB0byBjcmVhdGUgdGhlCisgIHNwYWNlLiAgSWYgYXJndW1lbnQgbG9ja2VkIGlzIG5vbi16ZXJvLCB0aGUgc3BhY2UgdXNlcyBhIHNlcGFyYXRlCisgIGxvY2sgdG8gY29udHJvbCBhY2Nlc3MuIFRoZSBjYXBhY2l0eSBvZiB0aGUgc3BhY2Ugd2lsbCBncm93CisgIGR5bmFtaWNhbGx5IGFzIG5lZWRlZCB0byBzZXJ2aWNlIG1zcGFjZV9tYWxsb2MgcmVxdWVzdHMuICBZb3UgY2FuCisgIGNvbnRyb2wgdGhlIHNpemVzIG9mIGluY3JlbWVudGFsIGluY3JlYXNlcyBvZiB0aGlzIHNwYWNlIGJ5CisgIGNvbXBpbGluZyB3aXRoIGEgZGlmZmVyZW50IERFRkFVTFRfR1JBTlVMQVJJVFkgb3IgZHluYW1pY2FsbHkKKyAgc2V0dGluZyB3aXRoIG1hbGxvcHQoTV9HUkFOVUxBUklUWSwgdmFsdWUpLgorKi8KK21zcGFjZSBjcmVhdGVfbXNwYWNlKHNpemVfdCBjYXBhY2l0eSwgaW50IGxvY2tlZCk7CisKKy8qCisgIGRlc3Ryb3lfbXNwYWNlIGRlc3Ryb3lzIHRoZSBnaXZlbiBzcGFjZSwgYW5kIGF0dGVtcHRzIHRvIHJldHVybiBhbGwKKyAgb2YgaXRzIG1lbW9yeSBiYWNrIHRvIHRoZSBzeXN0ZW0sIHJldHVybmluZyB0aGUgdG90YWwgbnVtYmVyIG9mCisgIGJ5dGVzIGZyZWVkLiBBZnRlciBkZXN0cnVjdGlvbiwgdGhlIHJlc3VsdHMgb2YgYWNjZXNzIHRvIGFsbCBtZW1vcnkKKyAgdXNlZCBieSB0aGUgc3BhY2UgYmVjb21lIHVuZGVmaW5lZC4KKyovCitzaXplX3QgZGVzdHJveV9tc3BhY2UobXNwYWNlIG1zcCk7CisKKy8qCisgIGNyZWF0ZV9tc3BhY2Vfd2l0aF9iYXNlIHVzZXMgdGhlIG1lbW9yeSBzdXBwbGllZCBhcyB0aGUgaW5pdGlhbCBiYXNlCisgIG9mIGEgbmV3IG1zcGFjZS4gUGFydCAobGVzcyB0aGFuIDEyOCpzaXplb2Yoc2l6ZV90KSBieXRlcykgb2YgdGhpcworICBzcGFjZSBpcyB1c2VkIGZvciBib29ra2VlcGluZywgc28gdGhlIGNhcGFjaXR5IG11c3QgYmUgYXQgbGVhc3QgdGhpcworICBsYXJnZS4gKE90aGVyd2lzZSAwIGlzIHJldHVybmVkLikgV2hlbiB0aGlzIGluaXRpYWwgc3BhY2UgaXMKKyAgZXhoYXVzdGVkLCBhZGRpdGlvbmFsIG1lbW9yeSB3aWxsIGJlIG9idGFpbmVkIGZyb20gdGhlIHN5c3RlbS4KKyAgRGVzdHJveWluZyB0aGlzIHNwYWNlIHdpbGwgZGVhbGxvY2F0ZSBhbGwgYWRkaXRpb25hbGx5IGFsbG9jYXRlZAorICBzcGFjZSAoaWYgcG9zc2libGUpIGJ1dCBub3QgdGhlIGluaXRpYWwgYmFzZS4KKyovCittc3BhY2UgY3JlYXRlX21zcGFjZV93aXRoX2Jhc2Uodm9pZCogYmFzZSwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgbG9ja2VkKTsKKworLyoKKyAgbXNwYWNlX21hbGxvYyBiZWhhdmVzIGFzIG1hbGxvYywgYnV0IG9wZXJhdGVzIHdpdGhpbgorICB0aGUgZ2l2ZW4gc3BhY2UuCisqLwordm9pZCogbXNwYWNlX21hbGxvYyhtc3BhY2UgbXNwLCBzaXplX3QgYnl0ZXMpOworCisvKgorICBtc3BhY2VfZnJlZSBiZWhhdmVzIGFzIGZyZWUsIGJ1dCBvcGVyYXRlcyB3aXRoaW4KKyAgdGhlIGdpdmVuIHNwYWNlLgorCisgIElmIGNvbXBpbGVkIHdpdGggRk9PVEVSUz09MSwgbXNwYWNlX2ZyZWUgaXMgbm90IGFjdHVhbGx5IG5lZWRlZC4KKyAgZnJlZSBtYXkgYmUgY2FsbGVkIGluc3RlYWQgb2YgbXNwYWNlX2ZyZWUgYmVjYXVzZSBmcmVlZCBjaHVua3MgZnJvbQorICBhbnkgc3BhY2UgYXJlIGhhbmRsZWQgYnkgdGhlaXIgb3JpZ2luYXRpbmcgc3BhY2VzLgorKi8KK3ZvaWQgbXNwYWNlX2ZyZWUobXNwYWNlIG1zcCwgdm9pZCogbWVtKTsKKworLyoKKyAgbXNwYWNlX3JlYWxsb2MgYmVoYXZlcyBhcyByZWFsbG9jLCBidXQgb3BlcmF0ZXMgd2l0aGluCisgIHRoZSBnaXZlbiBzcGFjZS4KKworICBJZiBjb21waWxlZCB3aXRoIEZPT1RFUlM9PTEsIG1zcGFjZV9yZWFsbG9jIGlzIG5vdCBhY3R1YWxseQorICBuZWVkZWQuICByZWFsbG9jIG1heSBiZSBjYWxsZWQgaW5zdGVhZCBvZiBtc3BhY2VfcmVhbGxvYyBiZWNhdXNlCisgIHJlYWxsb2NlZCBjaHVua3MgZnJvbSBhbnkgc3BhY2UgYXJlIGhhbmRsZWQgYnkgdGhlaXIgb3JpZ2luYXRpbmcKKyAgc3BhY2VzLgorKi8KK3ZvaWQqIG1zcGFjZV9yZWFsbG9jKG1zcGFjZSBtc3AsIHZvaWQqIG1lbSwgc2l6ZV90IG5ld3NpemUpOworCisvKgorICBtc3BhY2VfY2FsbG9jIGJlaGF2ZXMgYXMgY2FsbG9jLCBidXQgb3BlcmF0ZXMgd2l0aGluCisgIHRoZSBnaXZlbiBzcGFjZS4KKyovCit2b2lkKiBtc3BhY2VfY2FsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbV9zaXplKTsKKworLyoKKyAgbXNwYWNlX21lbWFsaWduIGJlaGF2ZXMgYXMgbWVtYWxpZ24sIGJ1dCBvcGVyYXRlcyB3aXRoaW4KKyAgdGhlIGdpdmVuIHNwYWNlLgorKi8KK3ZvaWQqIG1zcGFjZV9tZW1hbGlnbihtc3BhY2UgbXNwLCBzaXplX3QgYWxpZ25tZW50LCBzaXplX3QgYnl0ZXMpOworCisvKgorICBtc3BhY2VfaW5kZXBlbmRlbnRfY2FsbG9jIGJlaGF2ZXMgYXMgaW5kZXBlbmRlbnRfY2FsbG9jLCBidXQKKyAgb3BlcmF0ZXMgd2l0aGluIHRoZSBnaXZlbiBzcGFjZS4KKyovCit2b2lkKiogbXNwYWNlX2luZGVwZW5kZW50X2NhbGxvYyhtc3BhY2UgbXNwLCBzaXplX3Qgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbGVtX3NpemUsIHZvaWQqIGNodW5rc1tdKTsKKworLyoKKyAgbXNwYWNlX2luZGVwZW5kZW50X2NvbWFsbG9jIGJlaGF2ZXMgYXMgaW5kZXBlbmRlbnRfY29tYWxsb2MsIGJ1dAorICBvcGVyYXRlcyB3aXRoaW4gdGhlIGdpdmVuIHNwYWNlLgorKi8KK3ZvaWQqKiBtc3BhY2VfaW5kZXBlbmRlbnRfY29tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplc1tdLCB2b2lkKiBjaHVua3NbXSk7CisKKy8qCisgIG1zcGFjZV9mb290cHJpbnQoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2J0YWluZWQgZnJvbSB0aGUKKyAgc3lzdGVtIGZvciB0aGlzIHNwYWNlLgorKi8KK3NpemVfdCBtc3BhY2VfZm9vdHByaW50KG1zcGFjZSBtc3ApOworCisvKgorICBtc3BhY2VfbWF4X2Zvb3RwcmludCgpIHJldHVybnMgdGhlIHBlYWsgbnVtYmVyIG9mIGJ5dGVzIG9idGFpbmVkIGZyb20gdGhlCisgIHN5c3RlbSBmb3IgdGhpcyBzcGFjZS4KKyovCitzaXplX3QgbXNwYWNlX21heF9mb290cHJpbnQobXNwYWNlIG1zcCk7CisKKworI2lmICFOT19NQUxMSU5GTworLyoKKyAgbXNwYWNlX21hbGxpbmZvIGJlaGF2ZXMgYXMgbWFsbGluZm8sIGJ1dCByZXBvcnRzIHByb3BlcnRpZXMgb2YKKyAgdGhlIGdpdmVuIHNwYWNlLgorKi8KK3N0cnVjdCBtYWxsaW5mbyBtc3BhY2VfbWFsbGluZm8obXNwYWNlIG1zcCk7CisjZW5kaWYgLyogTk9fTUFMTElORk8gKi8KKworLyoKKyAgbXNwYWNlX21hbGxvY19zdGF0cyBiZWhhdmVzIGFzIG1hbGxvY19zdGF0cywgYnV0IHJlcG9ydHMKKyAgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gc3BhY2UuCisqLwordm9pZCBtc3BhY2VfbWFsbG9jX3N0YXRzKG1zcGFjZSBtc3ApOworCisvKgorICBtc3BhY2VfdHJpbSBiZWhhdmVzIGFzIG1hbGxvY190cmltLCBidXQKKyAgb3BlcmF0ZXMgd2l0aGluIHRoZSBnaXZlbiBzcGFjZS4KKyovCitpbnQgbXNwYWNlX3RyaW0obXNwYWNlIG1zcCwgc2l6ZV90IHBhZCk7CisKKy8qCisgIEFuIGFsaWFzIGZvciBtYWxsb3B0LgorKi8KK2ludCBtc3BhY2VfbWFsbG9wdChpbnQsIGludCk7CisKKyNlbmRpZiAvKiBNU1BBQ0VTICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgIC8qIGVuZCBvZiBleHRlcm4gIkMiICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFRvIG1ha2UgYSBmdWxseSBjdXN0b21pemFibGUgbWFsbG9jLmggaGVhZGVyIGZpbGUsIGN1dCBldmVyeXRoaW5nCisgIGFib3ZlIHRoaXMgbGluZSwgcHV0IGludG8gZmlsZSBtYWxsb2MuaCwgZWRpdCB0byBzdWl0LCBhbmQgI2luY2x1ZGUgaXQKKyAgb24gdGhlIG5leHQgbGluZSwgYXMgd2VsbCBhcyBpbiBwcm9ncmFtcyB0aGF0IHVzZSB0aGlzIG1hbGxvYy4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKiAjaW5jbHVkZSAibWFsbG9jLmgiICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGludGVybmFsICNpbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDE0NiApIC8qIG5vICJ1bnNpZ25lZCIgd2FybmluZ3MgKi8KKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgLyogZm9yIHByaW50aW5nIGluIG1hbGxvY19zdGF0cyAqLworCisjaWZuZGVmIExBQ0tTX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPiAgICAgICAvKiBmb3IgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICovCisjZW5kaWYgLyogTEFDS1NfRVJSTk9fSCAqLworI2lmIEZPT1RFUlMKKyNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAvKiBmb3IgbWFnaWMgaW5pdGlhbGl6YXRpb24gKi8KKyNlbmRpZiAvKiBGT09URVJTICovCisjaWZuZGVmIExBQ0tTX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAgLyogZm9yIGFib3J0KCkgKi8KKyNlbmRpZiAvKiBMQUNLU19TVERMSUJfSCAqLworI2lmZGVmIERFQlVHCisjaWYgQUJPUlRfT05fQVNTRVJUX0ZBSUxVUkUKKyNkZWZpbmUgYXNzZXJ0KHgpIGlmKCEoeCkpIEFCT1JUCisjZWxzZSAvKiBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRSAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmIC8qIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFICovCisjZWxzZSAgLyogREVCVUcgKi8KKyNkZWZpbmUgYXNzZXJ0KHgpCisjZW5kaWYgLyogREVCVUcgKi8KKyNpZm5kZWYgTEFDS1NfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAvKiBmb3IgbWVtc2V0IGV0YyAqLworI2VuZGlmICAvKiBMQUNLU19TVFJJTkdfSCAqLworI2lmIFVTRV9CVUlMVElOX0ZGUworI2lmbmRlZiBMQUNLU19TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+ICAgICAvKiBmb3IgZmZzICovCisjZW5kaWYgLyogTEFDS1NfU1RSSU5HU19IICovCisjZW5kaWYgLyogVVNFX0JVSUxUSU5fRkZTICovCisjaWYgSEFWRV9NTUFQCisjaWZuZGVmIExBQ0tTX1NZU19NTUFOX0gKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPiAgICAvKiBmb3IgbW1hcCAqLworI2VuZGlmIC8qIExBQ0tTX1NZU19NTUFOX0ggKi8KKyNpZm5kZWYgTEFDS1NfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYgLyogTEFDS1NfRkNOVExfSCAqLworI2VuZGlmIC8qIEhBVkVfTU1BUCAqLworI2lmIEhBVkVfTU9SRUNPUkUKKyNpZm5kZWYgTEFDS1NfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgIC8qIGZvciBzYnJrICovCisjZWxzZSAvKiBMQUNLU19VTklTVERfSCAqLworI2lmICFkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiAhZGVmaW5lZChfX09wZW5CU0RfXykgJiYgIWRlZmluZWQoX19OZXRCU0RfXykKK2V4dGVybiB2b2lkKiAgICAgc2JyayhwdHJkaWZmX3QpOworI2VuZGlmIC8qIEZyZWVCU0QgZXRjICovCisjZW5kaWYgLyogTEFDS1NfVU5JU1REX0ggKi8KKyNlbmRpZiAvKiBIQVZFX01NQVAgKi8KKworI2lmbmRlZiBXSU4zMgorI2lmbmRlZiBtYWxsb2NfZ2V0cGFnZXNpemUKKyMgIGlmZGVmIF9TQ19QQUdFU0laRSAgICAgICAgIC8qIHNvbWUgU1ZSNCBzeXN0ZW1zIG9taXQgYW4gdW5kZXJzY29yZSAqLworIyAgICBpZm5kZWYgX1NDX1BBR0VfU0laRQorIyAgICAgIGRlZmluZSBfU0NfUEFHRV9TSVpFIF9TQ19QQUdFU0laRQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9TQ19QQUdFX1NJWkUKKyMgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpCisjICBlbHNlCisjICAgIGlmIGRlZmluZWQoQlNEKSB8fCBkZWZpbmVkKERHVVgpIHx8IGRlZmluZWQoSEFWRV9HRVRQQUdFU0laRSkKKyAgICAgICBleHRlcm4gc2l6ZV90IGdldHBhZ2VzaXplKCk7CisjICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBnZXRwYWdlc2l6ZSgpCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBXSU4zMiAvKiB1c2Ugc3VwcGxpZWQgZW11bGF0aW9uIG9mIGdldHBhZ2VzaXplICovCisjICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIGdldHBhZ2VzaXplKCkKKyMgICAgICBlbHNlCisjICAgICAgICBpZm5kZWYgTEFDS1NfU1lTX1BBUkFNX0gKKyMgICAgICAgICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgICAgICBlbmRpZgorIyAgICAgICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIEVYRUNfUEFHRVNJWkUKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgaWZkZWYgTkJQRworIyAgICAgICAgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgTkJQRworIyAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgKE5CUEcgKiBDTFNJWkUpCisjICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgIGlmZGVmIE5CUEMKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgTkJQQworIyAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgUEFHRVNJWkUKKyMgICAgICAgICAgICAgIGVsc2UgLyoganVzdCBndWVzcyAqLworIyAgICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplICgoc2l6ZV90KTQwOTZVKQorIyAgICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gc2l6ZV90IGFuZCBhbGlnbm1lbnQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGUgYnl0ZSBhbmQgYml0IHNpemUgb2YgYSBzaXplX3QgKi8KKyNkZWZpbmUgU0laRV9UX1NJWkUgICAgICAgICAoc2l6ZW9mKHNpemVfdCkpCisjZGVmaW5lIFNJWkVfVF9CSVRTSVpFICAgICAgKHNpemVvZihzaXplX3QpIDw8IDMpCisKKy8qIFNvbWUgY29uc3RhbnRzIGNvZXJjZWQgdG8gc2l6ZV90ICovCisvKiBBbm5veWluZyBidXQgbmVjZXNzYXJ5IHRvIGF2b2lkIGVycm9ycyBvbiBzb21lIHBsYWZ0b3JtcyAqLworI2RlZmluZSBTSVpFX1RfWkVSTyAgICAgICAgICgoc2l6ZV90KTApCisjZGVmaW5lIFNJWkVfVF9PTkUgICAgICAgICAgKChzaXplX3QpMSkKKyNkZWZpbmUgU0laRV9UX1RXTyAgICAgICAgICAoKHNpemVfdCkyKQorI2RlZmluZSBUV09fU0laRV9UX1NJWkVTICAgIChTSVpFX1RfU0laRTw8MSkKKyNkZWZpbmUgRk9VUl9TSVpFX1RfU0laRVMgICAoU0laRV9UX1NJWkU8PDIpCisjZGVmaW5lIFNJWF9TSVpFX1RfU0laRVMgICAgKEZPVVJfU0laRV9UX1NJWkVTK1RXT19TSVpFX1RfU0laRVMpCisjZGVmaW5lIEhBTEZfTUFYX1NJWkVfVCAgICAgKE1BWF9TSVpFX1QgLyAyVSkKKworLyogVGhlIGJpdCBtYXNrIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gTUFMTE9DX0FMSUdOTUVOVCAqLworI2RlZmluZSBDSFVOS19BTElHTl9NQVNLICAgIChNQUxMT0NfQUxJR05NRU5UIC0gU0laRV9UX09ORSkKKworLyogVHJ1ZSBpZiBhZGRyZXNzIGEgaGFzIGFjY2VwdGFibGUgYWxpZ25tZW50ICovCisjZGVmaW5lIGlzX2FsaWduZWQoQSkgICAgICAgKCgoc2l6ZV90KSgoQSkpICYgKENIVU5LX0FMSUdOX01BU0spKSA9PSAwKQorCisvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG9mZnNldCBhbiBhZGRyZXNzIHRvIGFsaWduIGl0ICovCisjZGVmaW5lIGFsaWduX29mZnNldChBKVwKKyAoKCgoc2l6ZV90KShBKSAmIENIVU5LX0FMSUdOX01BU0spID09IDApPyAwIDpcCisgICgoTUFMTE9DX0FMSUdOTUVOVCAtICgoc2l6ZV90KShBKSAmIENIVU5LX0FMSUdOX01BU0spKSAmIENIVU5LX0FMSUdOX01BU0spKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNTUFQIHByZWxpbWluYXJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICAgSWYgSEFWRV9NT1JFQ09SRSBvciBIQVZFX01NQVAgYXJlIGZhbHNlLCB3ZSBqdXN0IGRlZmluZSBjYWxscyBhbmQKKyAgIGNoZWNrcyB0byBmYWlsIHNvIGNvbXBpbGVyIG9wdGltaXplciBjYW4gZGVsZXRlIGNvZGUgcmF0aGVyIHRoYW4KKyAgIHVzaW5nIHNvIG1hbnkgIiNpZiJzLgorKi8KKworCisvKiBNT1JFQ09SRSBhbmQgTU1BUCBtdXN0IHJldHVybiBNRkFJTCBvbiBmYWlsdXJlICovCisjZGVmaW5lIE1GQUlMICAgICAgICAgICAgICAgICgodm9pZCopKE1BWF9TSVpFX1QpKQorI2RlZmluZSBDTUZBSUwgICAgICAgICAgICAgICAoKGNoYXIqKShNRkFJTCkpIC8qIGRlZmluZWQgZm9yIGNvbnZlbmllbmNlICovCisKKyNpZiAhSEFWRV9NTUFQCisjZGVmaW5lIElTX01NQVBQRURfQklUICAgICAgIChTSVpFX1RfWkVSTykKKyNkZWZpbmUgVVNFX01NQVBfQklUICAgICAgICAgKFNJWkVfVF9aRVJPKQorI2RlZmluZSBDQUxMX01NQVAocykgICAgICAgICBNRkFJTAorI2RlZmluZSBDQUxMX01VTk1BUChhLCBzKSAgICAoLTEpCisjZGVmaW5lIERJUkVDVF9NTUFQKHMpICAgICAgIE1GQUlMCisKKyNlbHNlIC8qIEhBVkVfTU1BUCAqLworI2RlZmluZSBJU19NTUFQUEVEX0JJVCAgICAgICAoU0laRV9UX09ORSkKKyNkZWZpbmUgVVNFX01NQVBfQklUICAgICAgICAgKFNJWkVfVF9PTkUpCisKKyNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQgKF9fT1MyX18pCisjZGVmaW5lIENBTExfTVVOTUFQKGEsIHMpICAgIG11bm1hcCgoYSksIChzKSkKKyNkZWZpbmUgTU1BUF9QUk9UICAgICAgICAgICAgKFBST1RfUkVBRHxQUk9UX1dSSVRFKQorI2lmICFkZWZpbmVkKE1BUF9BTk9OWU1PVVMpICYmIGRlZmluZWQoTUFQX0FOT04pCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMgICAgICAgIE1BUF9BTk9OCisjZW5kaWYgLyogTUFQX0FOT04gKi8KKyNpZmRlZiBNQVBfQU5PTllNT1VTCisjZGVmaW5lIE1NQVBfRkxBR1MgICAgICAgICAgIChNQVBfUFJJVkFURXxNQVBfQU5PTllNT1VTKQorI2RlZmluZSBDQUxMX01NQVAocykgICAgICAgICBtbWFwKDAsIChzKSwgTU1BUF9QUk9ULCBNTUFQX0ZMQUdTLCAtMSwgMCkKKyNlbHNlIC8qIE1BUF9BTk9OWU1PVVMgKi8KKy8qCisgICBOZWFybHkgYWxsIHZlcnNpb25zIG9mIG1tYXAgc3VwcG9ydCBNQVBfQU5PTllNT1VTLCBzbyB0aGUgZm9sbG93aW5nCisgICBpcyB1bmxpa2VseSB0byBiZSBuZWVkZWQsIGJ1dCBpcyBzdXBwbGllZCBqdXN0IGluIGNhc2UuCisqLworI2RlZmluZSBNTUFQX0ZMQUdTICAgICAgICAgICAoTUFQX1BSSVZBVEUpCitzdGF0aWMgaW50IGRldl96ZXJvX2ZkID0gLTE7IC8qIENhY2hlZCBmaWxlIGRlc2NyaXB0b3IgZm9yIC9kZXYvemVyby4gKi8KKyNkZWZpbmUgQ0FMTF9NTUFQKHMpICgoZGV2X3plcm9fZmQgPCAwKSA/IFwKKyAgICAgICAgICAgKGRldl96ZXJvX2ZkID0gb3BlbigiL2Rldi96ZXJvIiwgT19SRFdSKSwgXAorICAgICAgICAgICAgbW1hcCgwLCAocyksIE1NQVBfUFJPVCwgTU1BUF9GTEFHUywgZGV2X3plcm9fZmQsIDApKSA6IFwKKyAgICAgICAgICAgIG1tYXAoMCwgKHMpLCBNTUFQX1BST1QsIE1NQVBfRkxBR1MsIGRldl96ZXJvX2ZkLCAwKSkKKyNlbmRpZiAvKiBNQVBfQU5PTllNT1VTICovCisKKyNkZWZpbmUgRElSRUNUX01NQVAocykgICAgICAgQ0FMTF9NTUFQKHMpCisKKyNlbGlmIGRlZmluZWQoX19PUzJfXykKKworLyogT1MvMiBNTUFQIHZpYSBEb3NBbGxvY01lbSAqLworc3RhdGljIHZvaWQqIG9zMm1tYXAoc2l6ZV90IHNpemUpIHsKKyAgdm9pZCogcHRyOworICBpZiAoRG9zQWxsb2NNZW0oJnB0ciwgc2l6ZSwgT0JKX0FOWXxQQUdfQ09NTUlUfFBBR19SRUFEfFBBR19XUklURSkgJiYKKyAgICAgIERvc0FsbG9jTWVtKCZwdHIsIHNpemUsIFBBR19DT01NSVR8UEFHX1JFQUR8UEFHX1dSSVRFKSkKKyAgICByZXR1cm4gTUZBSUw7CisgIHJldHVybiBwdHI7Cit9CisKKyNkZWZpbmUgb3MyZGlyZWN0X21tYXAobikgICAgIG9zMm1tYXAobikKKworLyogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyByZWxlYXNpbmcgY29hbGVzZWQgc2VnbWVudHMgKi8KK3N0YXRpYyBpbnQgb3MybXVubWFwKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKKyAgd2hpbGUgKHNpemUpIHsKKyAgICBVTE9ORyB1bFNpemUgPSBzaXplOworICAgIFVMT05HIHVsRmxhZ3MgPSAwOworICAgIGlmIChEb3NRdWVyeU1lbShwdHIsICZ1bFNpemUsICZ1bEZsYWdzKSAhPSAwKQorICAgICAgcmV0dXJuIC0xOworICAgIGlmICgodWxGbGFncyAmIFBBR19CQVNFKSA9PSAwIHx8KHVsRmxhZ3MgJiBQQUdfQ09NTUlUKSA9PSAwIHx8CisgICAgICAgIHVsU2l6ZSA+IHNpemUpCisgICAgICByZXR1cm4gLTE7CisgICAgaWYgKERvc0ZyZWVNZW0ocHRyKSAhPSAwKQorICAgICAgcmV0dXJuIC0xOworICAgIHB0ciA9ICggdm9pZCAqICkgKCAoIGNoYXIgKiApIHB0ciArIHVsU2l6ZSApOworICAgIHNpemUgLT0gdWxTaXplOworICB9CisgIHJldHVybiAwOworfQorCisjZGVmaW5lIENBTExfTU1BUChzKSAgICAgICAgIG9zMm1tYXAocykKKyNkZWZpbmUgQ0FMTF9NVU5NQVAoYSwgcykgICAgb3MybXVubWFwKChhKSwgKHMpKQorI2RlZmluZSBESVJFQ1RfTU1BUChzKSAgICAgICBvczJkaXJlY3RfbW1hcChzKQorCisjZWxzZSAvKiBXSU4zMiAqLworCisvKiBXaW4zMiBNTUFQIHZpYSBWaXJ0dWFsQWxsb2MgKi8KK3N0YXRpYyB2b2lkKiB3aW4zMm1tYXAoc2l6ZV90IHNpemUpIHsKKyAgdm9pZCogcHRyID0gVmlydHVhbEFsbG9jKDAsIHNpemUsIE1FTV9SRVNFUlZFfE1FTV9DT01NSVQsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOworICByZXR1cm4gKHB0ciAhPSAwKT8gcHRyOiBNRkFJTDsKK30KKworLyogRm9yIGRpcmVjdCBNTUFQLCB1c2UgTUVNX1RPUF9ET1dOIHRvIG1pbmltaXplIGludGVyZmVyZW5jZSAqLworc3RhdGljIHZvaWQqIHdpbjMyZGlyZWN0X21tYXAoc2l6ZV90IHNpemUpIHsKKyAgdm9pZCogcHRyID0gVmlydHVhbEFsbG9jKDAsIHNpemUsIE1FTV9SRVNFUlZFfE1FTV9DT01NSVR8TUVNX1RPUF9ET1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSk7CisgIHJldHVybiAocHRyICE9IDApPyBwdHI6IE1GQUlMOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHJlbGVhc2luZyBjb2FsZXNlZCBzZWdtZW50cyAqLworc3RhdGljIGludCB3aW4zMm11bm1hcCh2b2lkKiBwdHIsIHNpemVfdCBzaXplKSB7CisgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtaW5mbzsKKyAgY2hhciogY3B0ciA9IHB0cjsKKyAgd2hpbGUgKHNpemUpIHsKKyAgICBpZiAoVmlydHVhbFF1ZXJ5KGNwdHIsICZtaW5mbywgc2l6ZW9mKG1pbmZvKSkgPT0gMCkKKyAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobWluZm8uQmFzZUFkZHJlc3MgIT0gY3B0ciB8fCBtaW5mby5BbGxvY2F0aW9uQmFzZSAhPSBjcHRyIHx8CisgICAgICAgIG1pbmZvLlN0YXRlICE9IE1FTV9DT01NSVQgfHwgbWluZm8uUmVnaW9uU2l6ZSA+IHNpemUpCisgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFZpcnR1YWxGcmVlKGNwdHIsIDAsIE1FTV9SRUxFQVNFKSA9PSAwKQorICAgICAgcmV0dXJuIC0xOworICAgIGNwdHIgKz0gbWluZm8uUmVnaW9uU2l6ZTsKKyAgICBzaXplIC09IG1pbmZvLlJlZ2lvblNpemU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0FMTF9NTUFQKHMpICAgICAgICAgd2luMzJtbWFwKHMpCisjZGVmaW5lIENBTExfTVVOTUFQKGEsIHMpICAgIHdpbjMybXVubWFwKChhKSwgKHMpKQorI2RlZmluZSBESVJFQ1RfTU1BUChzKSAgICAgICB3aW4zMmRpcmVjdF9tbWFwKHMpCisjZW5kaWYgLyogV0lOMzIgKi8KKyNlbmRpZiAvKiBIQVZFX01NQVAgKi8KKworI2lmIEhBVkVfTU1BUCAmJiBIQVZFX01SRU1BUAorI2RlZmluZSBDQUxMX01SRU1BUChhZGRyLCBvc3osIG5zeiwgbXYpIG1yZW1hcCgoYWRkciksIChvc3opLCAobnN6KSwgKG12KSkKKyNlbHNlICAvKiBIQVZFX01NQVAgJiYgSEFWRV9NUkVNQVAgKi8KKyNkZWZpbmUgQ0FMTF9NUkVNQVAoYWRkciwgb3N6LCBuc3osIG12KSBNRkFJTAorI2VuZGlmIC8qIEhBVkVfTU1BUCAmJiBIQVZFX01SRU1BUCAqLworCisjaWYgSEFWRV9NT1JFQ09SRQorI2RlZmluZSBDQUxMX01PUkVDT1JFKFMpICAgICBNT1JFQ09SRShTKQorI2Vsc2UgIC8qIEhBVkVfTU9SRUNPUkUgKi8KKyNkZWZpbmUgQ0FMTF9NT1JFQ09SRShTKSAgICAgTUZBSUwKKyNlbmRpZiAvKiBIQVZFX01PUkVDT1JFICovCisKKy8qIG1zdGF0ZSBiaXQgc2V0IGlmIGNvbnRpbmd1b3VzIG1vcmVjb3JlIGRpc2FibGVkIG9yIGZhaWxlZCAqLworI2RlZmluZSBVU0VfTk9OQ09OVElHVU9VU19CSVQgKDRVKQorCisvKiBzZWdtZW50IGJpdCBzZXQgaW4gY3JlYXRlX21zcGFjZV93aXRoX2Jhc2UgKi8KKyNkZWZpbmUgRVhURVJOX0JJVCAgICAgICAgICAgICg4VSkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTG9jayBwcmVsaW1pbmFyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgVVNFX0xPQ0tTCisKKy8qCisgIFdoZW4gbG9ja3MgYXJlIGRlZmluZWQsIHRoZXJlIGFyZSB1cCB0byB0d28gZ2xvYmFsIGxvY2tzOgorCisgICogSWYgSEFWRV9NT1JFQ09SRSwgbW9yZWNvcmVfbXV0ZXggcHJvdGVjdHMgc2VxdWVuY2VzIG9mIGNhbGxzIHRvCisgICAgTU9SRUNPUkUuICBJbiBtYW55IGNhc2VzIHN5c19hbGxvYyByZXF1aXJlcyB0d28gY2FsbHMsIHRoYXQgc2hvdWxkCisgICAgbm90IGJlIGludGVybGVhdmVkIHdpdGggY2FsbHMgYnkgb3RoZXIgdGhyZWFkcy4gIFRoaXMgZG9lcyBub3QKKyAgICBwcm90ZWN0IGFnYWluc3QgZGlyZWN0IGNhbGxzIHRvIE1PUkVDT1JFIGJ5IG90aGVyIHRocmVhZHMgbm90CisgICAgdXNpbmcgdGhpcyBsb2NrLCBzbyB0aGVyZSBpcyBzdGlsbCBjb2RlIHRvIGNvcGUgdGhlIGJlc3Qgd2UgY2FuIG9uCisgICAgaW50ZXJmZXJlbmNlLgorCisgICogbWFnaWNfaW5pdF9tdXRleCBlbnN1cmVzIHRoYXQgbXBhcmFtcy5tYWdpYyBhbmQgb3RoZXIKKyAgICB1bmlxdWUgbXBhcmFtcyB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KKyovCisKKyNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19PUzJfXykKKy8qIEJ5IGRlZmF1bHQgdXNlIHBvc2l4IGxvY2tzICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2RlZmluZSBNTE9DS19UIHB0aHJlYWRfbXV0ZXhfdAorI2RlZmluZSBJTklUSUFMX0xPQ0sobCkgICAgICBwdGhyZWFkX211dGV4X2luaXQobCwgTlVMTCkKKyNkZWZpbmUgQUNRVUlSRV9MT0NLKGwpICAgICAgcHRocmVhZF9tdXRleF9sb2NrKGwpCisjZGVmaW5lIFJFTEVBU0VfTE9DSyhsKSAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKGwpCisKKyNpZiBIQVZFX01PUkVDT1JFCitzdGF0aWMgTUxPQ0tfVCBtb3JlY29yZV9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjZW5kaWYgLyogSEFWRV9NT1JFQ09SRSAqLworCitzdGF0aWMgTUxPQ0tfVCBtYWdpY19pbml0X211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworI2VsaWYgZGVmaW5lZChfX09TMl9fKQorI2RlZmluZSBNTE9DS19UIEhNVFgKKyNkZWZpbmUgSU5JVElBTF9MT0NLKGwpICAgICAgRG9zQ3JlYXRlTXV0ZXhTZW0oMCwgbCwgMCwgRkFMU0UpCisjZGVmaW5lIEFDUVVJUkVfTE9DSyhsKSAgICAgIERvc1JlcXVlc3RNdXRleFNlbSgqbCwgU0VNX0lOREVGSU5JVEVfV0FJVCkKKyNkZWZpbmUgUkVMRUFTRV9MT0NLKGwpICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKCpsKQorI2lmIEhBVkVfTU9SRUNPUkUKK3N0YXRpYyBNTE9DS19UIG1vcmVjb3JlX211dGV4OworI2VuZGlmIC8qIEhBVkVfTU9SRUNPUkUgKi8KK3N0YXRpYyBNTE9DS19UIG1hZ2ljX2luaXRfbXV0ZXg7CisKKyNlbHNlIC8qIFdJTjMyICovCisvKgorICAgQmVjYXVzZSBsb2NrLXByb3RlY3RlZCByZWdpb25zIGhhdmUgYm91bmRlZCB0aW1lcywgYW5kIHRoZXJlCisgICBhcmUgbm8gcmVjdXJzaXZlIGxvY2sgY2FsbHMsIHdlIGNhbiB1c2Ugc2ltcGxlIHNwaW5sb2Nrcy4KKyovCisKKyNkZWZpbmUgTUxPQ0tfVCBsb25nCitzdGF0aWMgaW50IHdpbjMyX2FjcXVpcmVfbG9jayAoTUxPQ0tfVCAqc2wpIHsKKyAgZm9yICg7OykgeworI2lmZGVmIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcgorICAgIGlmICghSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2Uoc2wsIDEsIDApKQorICAgICAgcmV0dXJuIDA7CisjZWxzZSAgLyogVXNlIG9sZGVyIHZvaWQqIHZlcnNpb24gKi8KKyAgICBpZiAoIUludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCh2b2lkKiopc2wsICh2b2lkKikxLCAodm9pZCopMCkpCisgICAgICByZXR1cm4gMDsKKyNlbmRpZiAvKiBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIgKi8KKyAgICBTbGVlcCAoMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgd2luMzJfcmVsZWFzZV9sb2NrIChNTE9DS19UICpzbCkgeworICBJbnRlcmxvY2tlZEV4Y2hhbmdlIChzbCwgMCk7Cit9CisKKyNkZWZpbmUgSU5JVElBTF9MT0NLKGwpICAgICAgKihsKT0wCisjZGVmaW5lIEFDUVVJUkVfTE9DSyhsKSAgICAgIHdpbjMyX2FjcXVpcmVfbG9jayhsKQorI2RlZmluZSBSRUxFQVNFX0xPQ0sobCkgICAgICB3aW4zMl9yZWxlYXNlX2xvY2sobCkKKyNpZiBIQVZFX01PUkVDT1JFCitzdGF0aWMgTUxPQ0tfVCBtb3JlY29yZV9tdXRleDsKKyNlbmRpZiAvKiBIQVZFX01PUkVDT1JFICovCitzdGF0aWMgTUxPQ0tfVCBtYWdpY19pbml0X211dGV4OworI2VuZGlmIC8qIFdJTjMyICovCisKKyNkZWZpbmUgVVNFX0xPQ0tfQklUICAgICAgICAgICAgICAgKDJVKQorI2Vsc2UgIC8qIFVTRV9MT0NLUyAqLworI2RlZmluZSBVU0VfTE9DS19CSVQgICAgICAgICAgICAgICAoMFUpCisjZGVmaW5lIElOSVRJQUxfTE9DSyhsKQorI2VuZGlmIC8qIFVTRV9MT0NLUyAqLworCisjaWYgVVNFX0xPQ0tTICYmIEhBVkVfTU9SRUNPUkUKKyNkZWZpbmUgQUNRVUlSRV9NT1JFQ09SRV9MT0NLKCkgICAgQUNRVUlSRV9MT0NLKCZtb3JlY29yZV9tdXRleCk7CisjZGVmaW5lIFJFTEVBU0VfTU9SRUNPUkVfTE9DSygpICAgIFJFTEVBU0VfTE9DSygmbW9yZWNvcmVfbXV0ZXgpOworI2Vsc2UgLyogVVNFX0xPQ0tTICYmIEhBVkVfTU9SRUNPUkUgKi8KKyNkZWZpbmUgQUNRVUlSRV9NT1JFQ09SRV9MT0NLKCkKKyNkZWZpbmUgUkVMRUFTRV9NT1JFQ09SRV9MT0NLKCkKKyNlbmRpZiAvKiBVU0VfTE9DS1MgJiYgSEFWRV9NT1JFQ09SRSAqLworCisjaWYgVVNFX0xPQ0tTCisjZGVmaW5lIEFDUVVJUkVfTUFHSUNfSU5JVF9MT0NLKCkgIEFDUVVJUkVfTE9DSygmbWFnaWNfaW5pdF9tdXRleCk7CisjZGVmaW5lIFJFTEVBU0VfTUFHSUNfSU5JVF9MT0NLKCkgIFJFTEVBU0VfTE9DSygmbWFnaWNfaW5pdF9tdXRleCk7CisjZWxzZSAgLyogVVNFX0xPQ0tTICovCisjZGVmaW5lIEFDUVVJUkVfTUFHSUNfSU5JVF9MT0NLKCkKKyNkZWZpbmUgUkVMRUFTRV9NQUdJQ19JTklUX0xPQ0soKQorI2VuZGlmIC8qIFVTRV9MT0NLUyAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDaHVuayByZXByZXNlbnRhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIChUaGUgZm9sbG93aW5nIGluY2x1ZGVzIGxpZ2h0bHkgZWRpdGVkIGV4cGxhbmF0aW9ucyBieSBDb2xpbiBQbHVtYi4pCisKKyAgVGhlIG1hbGxvY19jaHVuayBkZWNsYXJhdGlvbiBiZWxvdyBpcyBtaXNsZWFkaW5nIChidXQgYWNjdXJhdGUgYW5kCisgIG5lY2Vzc2FyeSkuICBJdCBkZWNsYXJlcyBhICJ2aWV3IiBpbnRvIG1lbW9yeSBhbGxvd2luZyBhY2Nlc3MgdG8KKyAgbmVjZXNzYXJ5IGZpZWxkcyBhdCBrbm93biBvZmZzZXRzIGZyb20gYSBnaXZlbiBiYXNlLgorCisgIENodW5rcyBvZiBtZW1vcnkgYXJlIG1haW50YWluZWQgdXNpbmcgYSBgYm91bmRhcnkgdGFnJyBtZXRob2QgYXMKKyAgb3JpZ2luYWxseSBkZXNjcmliZWQgYnkgS251dGguICAoU2VlIHRoZSBwYXBlciBieSBQYXVsIFdpbHNvbgorICBmdHA6Ly9mdHAuY3MudXRleGFzLmVkdS9wdWIvZ2FyYmFnZS9hbGxvY3Nydi5wcyBmb3IgYSBzdXJ2ZXkgb2Ygc3VjaAorICB0ZWNobmlxdWVzLikgIFNpemVzIG9mIGZyZWUgY2h1bmtzIGFyZSBzdG9yZWQgYm90aCBpbiB0aGUgZnJvbnQgb2YKKyAgZWFjaCBjaHVuayBhbmQgYXQgdGhlIGVuZC4gIFRoaXMgbWFrZXMgY29uc29saWRhdGluZyBmcmFnbWVudGVkCisgIGNodW5rcyBpbnRvIGJpZ2dlciBjaHVua3MgZmFzdC4gIFRoZSBoZWFkIGZpZWxkcyBhbHNvIGhvbGQgYml0cworICByZXByZXNlbnRpbmcgd2hldGhlciBjaHVua3MgYXJlIGZyZWUgb3IgaW4gdXNlLgorCisgIEhlcmUgYXJlIHNvbWUgcGljdHVyZXMgdG8gbWFrZSBpdCBjbGVhcmVyLiAgVGhleSBhcmUgImV4cGxvZGVkIiB0bworICBzaG93IHRoYXQgdGhlIHN0YXRlIG9mIGEgY2h1bmsgY2FuIGJlIHRob3VnaHQgb2YgYXMgZXh0ZW5kaW5nIGZyb20KKyAgdGhlIGhpZ2ggMzEgYml0cyBvZiB0aGUgaGVhZCBmaWVsZCBvZiBpdHMgaGVhZGVyIHRocm91Z2ggdGhlCisgIHByZXZfZm9vdCBhbmQgUElOVVNFX0JJVCBiaXQgb2YgdGhlIGZvbGxvd2luZyBjaHVuayBoZWFkZXIuCisKKyAgQSBjaHVuayB0aGF0J3MgaW4gdXNlIGxvb2tzIGxpa2U6CisKKyAgIGNodW5rLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgfCBTaXplIG9mIHByZXZpb3VzIGNodW5rIChpZiBQID0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyB8UHwKKyAgICAgICAgIHwgU2l6ZSBvZiB0aGlzIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxfCArLSsKKyAgIG1lbS0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKKyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKworICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICstICAgICAgc2l6ZSAtIHNpemVvZihzaXplX3QpIGF2YWlsYWJsZSBwYXlsb2FkIGJ5dGVzICAgICAgICAgIC0rCisgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIGNodW5rLT4gKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKKyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyB8MXwKKyAgICAgICB8IFNpemUgb2YgbmV4dCBjaHVuayAobWF5IG9yIG1heSBub3QgYmUgaW4gdXNlKSAgICAgICAgICAgICAgIHwgKy0rCisgbWVtLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworICAgIEFuZCBpZiBpdCdzIGZyZWUsIGl0IGxvb2tzIGxpa2UgdGhpczoKKworICAgY2h1bmstPiArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKworICAgICAgICAgICB8IFVzZXIgcGF5bG9hZCAobXVzdCBiZSBpbiB1c2UsIG9yIHdlIHdvdWxkIGhhdmUgbWVyZ2VkISkgICAgICAgfAorICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIHxQfAorICAgICAgICAgfCBTaXplIG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB8ICstKworICAgbWVtLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgIHwgTmV4dCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgfCBQcmV2IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgKy0gICAgICBzaXplIC0gc2l6ZW9mKHN0cnVjdCBjaHVuaykgdW51c2VkIGJ5dGVzICAgICAgICAgICAgICAgLSsKKyAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgY2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgfCBTaXplIG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIHwwfAorICAgICAgIHwgU2l6ZSBvZiBuZXh0IGNodW5rIChtdXN0IGJlIGluIHVzZSwgb3Igd2Ugd291bGQgaGF2ZSBtZXJnZWQpfCArLSsKKyBtZW0tPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgKy0gVXNlciBwYXlsb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKKyAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8MHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstKworICBOb3RlIHRoYXQgc2luY2Ugd2UgYWx3YXlzIG1lcmdlIGFkamFjZW50IGZyZWUgY2h1bmtzLCB0aGUgY2h1bmtzCisgIGFkamFjZW50IHRvIGEgZnJlZSBjaHVuayBtdXN0IGJlIGluIHVzZS4KKworICBHaXZlbiBhIHBvaW50ZXIgdG8gYSBjaHVuayAod2hpY2ggY2FuIGJlIGRlcml2ZWQgdHJpdmlhbGx5IGZyb20gdGhlCisgIHBheWxvYWQgcG9pbnRlcikgd2UgY2FuLCBpbiBPKDEpIHRpbWUsIGZpbmQgb3V0IHdoZXRoZXIgdGhlIGFkamFjZW50CisgIGNodW5rcyBhcmUgZnJlZSwgYW5kIGlmIHNvLCB1bmxpbmsgdGhlbSBmcm9tIHRoZSBsaXN0cyB0aGF0IHRoZXkKKyAgYXJlIG9uIGFuZCBtZXJnZSB0aGVtIHdpdGggdGhlIGN1cnJlbnQgY2h1bmsuCisKKyAgQ2h1bmtzIGFsd2F5cyBiZWdpbiBvbiBldmVuIHdvcmQgYm91bmRhcmllcywgc28gdGhlIG1lbSBwb3J0aW9uCisgICh3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgdXNlcikgaXMgYWxzbyBvbiBhbiBldmVuIHdvcmQgYm91bmRhcnksIGFuZAorICB0aHVzIGF0IGxlYXN0IGRvdWJsZS13b3JkIGFsaWduZWQuCisKKyAgVGhlIFAgKFBJTlVTRV9CSVQpIGJpdCwgc3RvcmVkIGluIHRoZSB1bnVzZWQgbG93LW9yZGVyIGJpdCBvZiB0aGUKKyAgY2h1bmsgc2l6ZSAod2hpY2ggaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgdHdvIHdvcmRzKSwgaXMgYW4gaW4tdXNlCisgIGJpdCBmb3IgdGhlICpwcmV2aW91cyogY2h1bmsuICBJZiB0aGF0IGJpdCBpcyAqY2xlYXIqLCB0aGVuIHRoZQorICB3b3JkIGJlZm9yZSB0aGUgY3VycmVudCBjaHVuayBzaXplIGNvbnRhaW5zIHRoZSBwcmV2aW91cyBjaHVuaworICBzaXplLCBhbmQgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUgZnJvbnQgb2YgdGhlIHByZXZpb3VzIGNodW5rLgorICBUaGUgdmVyeSBmaXJzdCBjaHVuayBhbGxvY2F0ZWQgYWx3YXlzIGhhcyB0aGlzIGJpdCBzZXQsIHByZXZlbnRpbmcKKyAgYWNjZXNzIHRvIG5vbi1leGlzdGVudCAob3Igbm9uLW93bmVkKSBtZW1vcnkuIElmIHBpbnVzZSBpcyBzZXQgZm9yCisgIGFueSBnaXZlbiBjaHVuaywgdGhlbiB5b3UgQ0FOTk9UIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUKKyAgcHJldmlvdXMgY2h1bmssIGFuZCBtaWdodCBldmVuIGdldCBhIG1lbW9yeSBhZGRyZXNzaW5nIGZhdWx0IHdoZW4KKyAgdHJ5aW5nIHRvIGRvIHNvLgorCisgIFRoZSBDIChDSU5VU0VfQklUKSBiaXQsIHN0b3JlZCBpbiB0aGUgdW51c2VkIHNlY29uZC1sb3dlc3QgYml0IG9mCisgIHRoZSBjaHVuayBzaXplIHJlZHVuZGFudGx5IHJlY29yZHMgd2hldGhlciB0aGUgY3VycmVudCBjaHVuayBpcworICBpbnVzZS4gVGhpcyByZWR1bmRhbmN5IGVuYWJsZXMgdXNhZ2UgY2hlY2tzIHdpdGhpbiBmcmVlIGFuZCByZWFsbG9jLAorICBhbmQgcmVkdWNlcyBpbmRpcmVjdGlvbiB3aGVuIGZyZWVpbmcgYW5kIGNvbnNvbGlkYXRpbmcgY2h1bmtzLgorCisgIEVhY2ggZnJlc2hseSBhbGxvY2F0ZWQgY2h1bmsgbXVzdCBoYXZlIGJvdGggY2ludXNlIGFuZCBwaW51c2Ugc2V0LgorICBUaGF0IGlzLCBlYWNoIGFsbG9jYXRlZCBjaHVuayBib3JkZXJzIGVpdGhlciBhIHByZXZpb3VzbHkgYWxsb2NhdGVkCisgIGFuZCBzdGlsbCBpbi11c2UgY2h1bmssIG9yIHRoZSBiYXNlIG9mIGl0cyBtZW1vcnkgYXJlbmEuIFRoaXMgaXMKKyAgZW5zdXJlZCBieSBtYWtpbmcgYWxsIGFsbG9jYXRpb25zIGZyb20gdGhlIHRoZSBgbG93ZXN0JyBwYXJ0IG9mIGFueQorICBmb3VuZCBjaHVuay4gIEZ1cnRoZXIsIG5vIGZyZWUgY2h1bmsgcGh5c2ljYWxseSBib3JkZXJzIGFub3RoZXIgb25lLAorICBzbyBlYWNoIGZyZWUgY2h1bmsgaXMga25vd24gdG8gYmUgcHJlY2VkZWQgYW5kIGZvbGxvd2VkIGJ5IGVpdGhlcgorICBpbnVzZSBjaHVua3Mgb3IgdGhlIGVuZHMgb2YgbWVtb3J5LgorCisgIE5vdGUgdGhhdCB0aGUgYGZvb3QnIG9mIHRoZSBjdXJyZW50IGNodW5rIGlzIGFjdHVhbGx5IHJlcHJlc2VudGVkCisgIGFzIHRoZSBwcmV2X2Zvb3Qgb2YgdGhlIE5FWFQgY2h1bmsuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvCisgIGRlYWwgd2l0aCBhbGlnbm1lbnRzIGV0YyBidXQgY2FuIGJlIHZlcnkgY29uZnVzaW5nIHdoZW4gdHJ5aW5nCisgIHRvIGV4dGVuZCBvciBhZGFwdCB0aGlzIGNvZGUuCisKKyAgVGhlIGV4Y2VwdGlvbnMgdG8gYWxsIHRoaXMgYXJlCisKKyAgICAgMS4gVGhlIHNwZWNpYWwgY2h1bmsgYHRvcCcgaXMgdGhlIHRvcC1tb3N0IGF2YWlsYWJsZSBjaHVuayAoaS5lLiwKKyAgICAgICAgdGhlIG9uZSBib3JkZXJpbmcgdGhlIGVuZCBvZiBhdmFpbGFibGUgbWVtb3J5KS4gSXQgaXMgdHJlYXRlZAorICAgICAgICBzcGVjaWFsbHkuICBUb3AgaXMgbmV2ZXIgaW5jbHVkZWQgaW4gYW55IGJpbiwgaXMgdXNlZCBvbmx5IGlmCisgICAgICAgIG5vIG90aGVyIGNodW5rIGlzIGF2YWlsYWJsZSwgYW5kIGlzIHJlbGVhc2VkIGJhY2sgdG8gdGhlCisgICAgICAgIHN5c3RlbSBpZiBpdCBpcyB2ZXJ5IGxhcmdlIChzZWUgTV9UUklNX1RIUkVTSE9MRCkuICBJbiBlZmZlY3QsCisgICAgICAgIHRoZSB0b3AgY2h1bmsgaXMgdHJlYXRlZCBhcyBsYXJnZXIgKGFuZCB0aHVzIGxlc3Mgd2VsbAorICAgICAgICBmaXR0aW5nKSB0aGFuIGFueSBvdGhlciBhdmFpbGFibGUgY2h1bmsuICBUaGUgdG9wIGNodW5rCisgICAgICAgIGRvZXNuJ3QgdXBkYXRlIGl0cyB0cmFpbGluZyBzaXplIGZpZWxkIHNpbmNlIHRoZXJlIGlzIG5vIG5leHQKKyAgICAgICAgY29udGlndW91cyBjaHVuayB0aGF0IHdvdWxkIGhhdmUgdG8gaW5kZXggb2ZmIGl0LiBIb3dldmVyLAorICAgICAgICBzcGFjZSBpcyBzdGlsbCBhbGxvY2F0ZWQgZm9yIGl0IChUT1BfRk9PVF9TSVpFKSB0byBlbmFibGUKKyAgICAgICAgc2VwYXJhdGlvbiBvciBtZXJnaW5nIHdoZW4gc3BhY2UgaXMgZXh0ZW5kZWQuCisKKyAgICAgMy4gQ2h1bmtzIGFsbG9jYXRlZCB2aWEgbW1hcCwgd2hpY2ggaGF2ZSB0aGUgbG93ZXN0LW9yZGVyIGJpdAorICAgICAgICAoSVNfTU1BUFBFRF9CSVQpIHNldCBpbiB0aGVpciBwcmV2X2Zvb3QgZmllbGRzLCBhbmQgZG8gbm90IHNldAorICAgICAgICBQSU5VU0VfQklUIGluIHRoZWlyIGhlYWQgZmllbGRzLiAgQmVjYXVzZSB0aGV5IGFyZSBhbGxvY2F0ZWQKKyAgICAgICAgb25lLWJ5LW9uZSwgZWFjaCBtdXN0IGNhcnJ5IGl0cyBvd24gcHJldl9mb290IGZpZWxkLCB3aGljaCBpcworICAgICAgICBhbHNvIHVzZWQgdG8gaG9sZCB0aGUgb2Zmc2V0IHRoaXMgY2h1bmsgaGFzIHdpdGhpbiBpdHMgbW1hcHBlZAorICAgICAgICByZWdpb24sIHdoaWNoIGlzIG5lZWRlZCB0byBwcmVzZXJ2ZSBhbGlnbm1lbnQuIEVhY2ggbW1hcHBlZAorICAgICAgICBjaHVuayBpcyB0cmFpbGVkIGJ5IHRoZSBmaXJzdCB0d28gZmllbGRzIG9mIGEgZmFrZSBuZXh0LWNodW5rCisgICAgICAgIGZvciBzYWtlIG9mIHVzYWdlIGNoZWNrcy4KKworKi8KKworc3RydWN0IG1hbGxvY19jaHVuayB7CisgIHNpemVfdCAgICAgICAgICAgICAgIHByZXZfZm9vdDsgIC8qIFNpemUgb2YgcHJldmlvdXMgY2h1bmsgKGlmIGZyZWUpLiAgKi8KKyAgc2l6ZV90ICAgICAgICAgICAgICAgaGVhZDsgICAgICAgLyogU2l6ZSBhbmQgaW51c2UgYml0cy4gKi8KKyAgc3RydWN0IG1hbGxvY19jaHVuayogZmQ7ICAgICAgICAgLyogZG91YmxlIGxpbmtzIC0tIHVzZWQgb25seSBpZiBmcmVlLiAqLworICBzdHJ1Y3QgbWFsbG9jX2NodW5rKiBiazsKK307CisKK3R5cGVkZWYgc3RydWN0IG1hbGxvY19jaHVuayAgbWNodW5rOwordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX2NodW5rKiBtY2h1bmtwdHI7Cit0eXBlZGVmIHN0cnVjdCBtYWxsb2NfY2h1bmsqIHNiaW5wdHI7ICAvKiBUaGUgdHlwZSBvZiBiaW5zIG9mIGNodW5rcyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgYmluZGV4X3Q7ICAgICAgICAgLyogRGVzY3JpYmVkIGJlbG93ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBiaW5tYXBfdDsgICAgICAgICAvKiBEZXNjcmliZWQgYmVsb3cgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IGZsYWdfdDsgICAgICAgICAgIC8qIFRoZSB0eXBlIG9mIHZhcmlvdXMgYml0IGZsYWcgc2V0cyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIENodW5rcyBzaXplcyBhbmQgYWxpZ25tZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1DSFVOS19TSVpFICAgICAgICAgKHNpemVvZihtY2h1bmspKQorCisjaWYgRk9PVEVSUworI2RlZmluZSBDSFVOS19PVkVSSEVBRCAgICAgIChUV09fU0laRV9UX1NJWkVTKQorI2Vsc2UgLyogRk9PVEVSUyAqLworI2RlZmluZSBDSFVOS19PVkVSSEVBRCAgICAgIChTSVpFX1RfU0laRSkKKyNlbmRpZiAvKiBGT09URVJTICovCisKKy8qIE1NYXBwZWQgY2h1bmtzIG5lZWQgYSBzZWNvbmQgd29yZCBvZiBvdmVyaGVhZCAuLi4gKi8KKyNkZWZpbmUgTU1BUF9DSFVOS19PVkVSSEVBRCAoVFdPX1NJWkVfVF9TSVpFUykKKy8qIC4uLiBhbmQgYWRkaXRpb25hbCBwYWRkaW5nIGZvciBmYWtlIG5leHQtY2h1bmsgYXQgZm9vdCAqLworI2RlZmluZSBNTUFQX0ZPT1RfUEFEICAgICAgIChGT1VSX1NJWkVfVF9TSVpFUykKKworLyogVGhlIHNtYWxsZXN0IHNpemUgd2UgY2FuIG1hbGxvYyBpcyBhbiBhbGlnbmVkIG1pbmltYWwgY2h1bmsgKi8KKyNkZWZpbmUgTUlOX0NIVU5LX1NJWkVcCisgICgoTUNIVU5LX1NJWkUgKyBDSFVOS19BTElHTl9NQVNLKSAmIH5DSFVOS19BTElHTl9NQVNLKQorCisvKiBjb252ZXJzaW9uIGZyb20gbWFsbG9jIGhlYWRlcnMgdG8gdXNlciBwb2ludGVycywgYW5kIGJhY2sgKi8KKyNkZWZpbmUgY2h1bmsybWVtKHApICAgICAgICAoKHZvaWQqKSgoY2hhciopKHApICAgICAgICsgVFdPX1NJWkVfVF9TSVpFUykpCisjZGVmaW5lIG1lbTJjaHVuayhtZW0pICAgICAgKChtY2h1bmtwdHIpKChjaGFyKikobWVtKSAtIFRXT19TSVpFX1RfU0laRVMpKQorLyogY2h1bmsgYXNzb2NpYXRlZCB3aXRoIGFsaWduZWQgYWRkcmVzcyBBICovCisjZGVmaW5lIGFsaWduX2FzX2NodW5rKEEpICAgKG1jaHVua3B0cikoKEEpICsgYWxpZ25fb2Zmc2V0KGNodW5rMm1lbShBKSkpCisKKy8qIEJvdW5kcyBvbiByZXF1ZXN0IChub3QgY2h1bmspIHNpemVzLiAqLworI2RlZmluZSBNQVhfUkVRVUVTVCAgICAgICAgICgoLU1JTl9DSFVOS19TSVpFKSA8PCAyKQorI2RlZmluZSBNSU5fUkVRVUVTVCAgICAgICAgIChNSU5fQ0hVTktfU0laRSAtIENIVU5LX09WRVJIRUFEIC0gU0laRV9UX09ORSkKKworLyogcGFkIHJlcXVlc3QgYnl0ZXMgaW50byBhIHVzYWJsZSBzaXplICovCisjZGVmaW5lIHBhZF9yZXF1ZXN0KHJlcSkgXAorICAgKCgocmVxKSArIENIVU5LX09WRVJIRUFEICsgQ0hVTktfQUxJR05fTUFTSykgJiB+Q0hVTktfQUxJR05fTUFTSykKKworLyogcGFkIHJlcXVlc3QsIGNoZWNraW5nIGZvciBtaW5pbXVtIChidXQgbm90IG1heGltdW0pICovCisjZGVmaW5lIHJlcXVlc3Qyc2l6ZShyZXEpIFwKKyAgKCgocmVxKSA8IE1JTl9SRVFVRVNUKT8gTUlOX0NIVU5LX1NJWkUgOiBwYWRfcmVxdWVzdChyZXEpKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zIG9uIGhlYWQgYW5kIGZvb3QgZmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIFRoZSBoZWFkIGZpZWxkIG9mIGEgY2h1bmsgaXMgb3InZWQgd2l0aCBQSU5VU0VfQklUIHdoZW4gcHJldmlvdXMKKyAgYWRqYWNlbnQgY2h1bmsgaW4gdXNlLCBhbmQgb3InZWQgd2l0aCBDSU5VU0VfQklUIGlmIHRoaXMgY2h1bmsgaXMgaW4KKyAgdXNlLiBJZiB0aGUgY2h1bmsgd2FzIG9idGFpbmVkIHdpdGggbW1hcCwgdGhlIHByZXZfZm9vdCBmaWVsZCBoYXMKKyAgSVNfTU1BUFBFRF9CSVQgc2V0LCBvdGhlcndpc2UgaG9sZGluZyB0aGUgb2Zmc2V0IG9mIHRoZSBiYXNlIG9mIHRoZQorICBtbWFwcGVkIHJlZ2lvbiB0byB0aGUgYmFzZSBvZiB0aGUgY2h1bmsuCisqLworCisjZGVmaW5lIFBJTlVTRV9CSVQgICAgICAgICAgKFNJWkVfVF9PTkUpCisjZGVmaW5lIENJTlVTRV9CSVQgICAgICAgICAgKFNJWkVfVF9UV08pCisjZGVmaW5lIElOVVNFX0JJVFMgICAgICAgICAgKFBJTlVTRV9CSVR8Q0lOVVNFX0JJVCkKKworLyogSGVhZCB2YWx1ZSBmb3IgZmVuY2Vwb3N0cyAqLworI2RlZmluZSBGRU5DRVBPU1RfSEVBRCAgICAgIChJTlVTRV9CSVRTfFNJWkVfVF9TSVpFKQorCisvKiBleHRyYWN0aW9uIG9mIGZpZWxkcyBmcm9tIGhlYWQgd29yZHMgKi8KKyNkZWZpbmUgY2ludXNlKHApICAgICAgICAgICAoKHApLT5oZWFkICYgQ0lOVVNFX0JJVCkKKyNkZWZpbmUgcGludXNlKHApICAgICAgICAgICAoKHApLT5oZWFkICYgUElOVVNFX0JJVCkKKyNkZWZpbmUgY2h1bmtzaXplKHApICAgICAgICAoKHApLT5oZWFkICYgfihJTlVTRV9CSVRTKSkKKworI2RlZmluZSBjbGVhcl9waW51c2UocCkgICAgICgocCktPmhlYWQgJj0gflBJTlVTRV9CSVQpCisjZGVmaW5lIGNsZWFyX2NpbnVzZShwKSAgICAgKChwKS0+aGVhZCAmPSB+Q0lOVVNFX0JJVCkKKworLyogVHJlYXQgc3BhY2UgYXQgcHRyICsvLSBvZmZzZXQgYXMgYSBjaHVuayAqLworI2RlZmluZSBjaHVua19wbHVzX29mZnNldChwLCBzKSAgKChtY2h1bmtwdHIpKCgoY2hhciopKHApKSArIChzKSkpCisjZGVmaW5lIGNodW5rX21pbnVzX29mZnNldChwLCBzKSAoKG1jaHVua3B0cikoKChjaGFyKikocCkpIC0gKHMpKSkKKworLyogUHRyIHRvIG5leHQgb3IgcHJldmlvdXMgcGh5c2ljYWwgbWFsbG9jX2NodW5rLiAqLworI2RlZmluZSBuZXh0X2NodW5rKHApICgobWNodW5rcHRyKSggKChjaGFyKikocCkpICsgKChwKS0+aGVhZCAmIH5JTlVTRV9CSVRTKSkpCisjZGVmaW5lIHByZXZfY2h1bmsocCkgKChtY2h1bmtwdHIpKCAoKGNoYXIqKShwKSkgLSAoKHApLT5wcmV2X2Zvb3QpICkpCisKKy8qIGV4dHJhY3QgbmV4dCBjaHVuaydzIHBpbnVzZSBiaXQgKi8KKyNkZWZpbmUgbmV4dF9waW51c2UocCkgICgobmV4dF9jaHVuayhwKS0+aGVhZCkgJiBQSU5VU0VfQklUKQorCisvKiBHZXQvc2V0IHNpemUgYXQgZm9vdGVyICovCisjZGVmaW5lIGdldF9mb290KHAsIHMpICAoKChtY2h1bmtwdHIpKChjaGFyKikocCkgKyAocykpKS0+cHJldl9mb290KQorI2RlZmluZSBzZXRfZm9vdChwLCBzKSAgKCgobWNodW5rcHRyKSgoY2hhciopKHApICsgKHMpKSktPnByZXZfZm9vdCA9IChzKSkKKworLyogU2V0IHNpemUsIHBpbnVzZSBiaXQsIGFuZCBmb290ICovCisjZGVmaW5lIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhwLCBzKVwKKyAgKChwKS0+aGVhZCA9IChzfFBJTlVTRV9CSVQpLCBzZXRfZm9vdChwLCBzKSkKKworLyogU2V0IHNpemUsIHBpbnVzZSBiaXQsIGZvb3QsIGFuZCBjbGVhciBuZXh0IHBpbnVzZSAqLworI2RlZmluZSBzZXRfZnJlZV93aXRoX3BpbnVzZShwLCBzLCBuKVwKKyAgKGNsZWFyX3BpbnVzZShuKSwgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIHMpKQorCisjZGVmaW5lIGlzX21tYXBwZWQocClcCisgICghKChwKS0+aGVhZCAmIFBJTlVTRV9CSVQpICYmICgocCktPnByZXZfZm9vdCAmIElTX01NQVBQRURfQklUKSkKKworLyogR2V0IHRoZSBpbnRlcm5hbCBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggY2h1bmsgcCAqLworI2RlZmluZSBvdmVyaGVhZF9mb3IocClcCisgKGlzX21tYXBwZWQocCk/IE1NQVBfQ0hVTktfT1ZFUkhFQUQgOiBDSFVOS19PVkVSSEVBRCkKKworLyogUmV0dXJuIHRydWUgaWYgbWFsbG9jZWQgc3BhY2UgaXMgbm90IG5lY2Vzc2FyaWx5IGNsZWFyZWQgKi8KKyNpZiBNTUFQX0NMRUFSUworI2RlZmluZSBjYWxsb2NfbXVzdF9jbGVhcihwKSAoIWlzX21tYXBwZWQocCkpCisjZWxzZSAvKiBNTUFQX0NMRUFSUyAqLworI2RlZmluZSBjYWxsb2NfbXVzdF9jbGVhcihwKSAoMSkKKyNlbmRpZiAvKiBNTUFQX0NMRUFSUyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE92ZXJsYWlkIGRhdGEgc3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBXaGVuIGNodW5rcyBhcmUgbm90IGluIHVzZSwgdGhleSBhcmUgdHJlYXRlZCBhcyBub2RlcyBvZiBlaXRoZXIKKyAgbGlzdHMgb3IgdHJlZXMuCisKKyAgIlNtYWxsIiAgY2h1bmtzIGFyZSBzdG9yZWQgaW4gY2lyY3VsYXIgZG91Ymx5LWxpbmtlZCBsaXN0cywgYW5kIGxvb2sKKyAgbGlrZSB0aGlzOgorCisgICAgY2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBTaXplIG9mIHByZXZpb3VzIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgYGhlYWQ6JyB8ICAgICAgICAgICAgIFNpemUgb2YgY2h1bmssIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgIHxQfAorICAgICAgbWVtLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgRm9yd2FyZCBwb2ludGVyIHRvIG5leHQgY2h1bmsgaW4gbGlzdCAgICAgICAgICAgICB8CisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBCYWNrIHBvaW50ZXIgdG8gcHJldmlvdXMgY2h1bmsgaW4gbGlzdCAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIFVudXNlZCBzcGFjZSAobWF5IGJlIDAgYnl0ZXMgbG9uZykgICAgICAgICAgICAgICAgLgorICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CituZXh0Y2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIGBmb290OicgfCAgICAgICAgICAgICBTaXplIG9mIGNodW5rLCBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKyAgTGFyZ2VyIGNodW5rcyBhcmUga2VwdCBpbiBhIGZvcm0gb2YgYml0d2lzZSBkaWdpdGFsIHRyZWVzIChha2EKKyAgdHJpZXMpIGtleWVkIG9uIGNodW5rc2l6ZXMuICBCZWNhdXNlIG1hbGxvY190cmVlX2NodW5rcyBhcmUgb25seSBmb3IKKyAgZnJlZSBjaHVua3MgZ3JlYXRlciB0aGFuIDI1NiBieXRlcywgdGhlaXIgc2l6ZSBkb2Vzbid0IGltcG9zZSBhbnkKKyAgY29uc3RyYWludHMgb24gdXNlciBjaHVuayBzaXplcy4gIEVhY2ggbm9kZSBsb29rcyBsaWtlOgorCisgICAgY2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBTaXplIG9mIHByZXZpb3VzIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgYGhlYWQ6JyB8ICAgICAgICAgICAgIFNpemUgb2YgY2h1bmssIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgIHxQfAorICAgICAgbWVtLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgRm9yd2FyZCBwb2ludGVyIHRvIG5leHQgY2h1bmsgb2Ygc2FtZSBzaXplICAgICAgICB8CisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBCYWNrIHBvaW50ZXIgdG8gcHJldmlvdXMgY2h1bmsgb2Ygc2FtZSBzaXplICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIFBvaW50ZXIgdG8gbGVmdCBjaGlsZCAoY2hpbGRbMF0pICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgUG9pbnRlciB0byByaWdodCBjaGlsZCAoY2hpbGRbMV0pICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgfCAgICAgICAgICAgICBQb2ludGVyIHRvIHBhcmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIGJpbiBpbmRleCBvZiB0aGlzIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgVW51c2VkIHNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorbmV4dGNodW5rLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICBgZm9vdDonIHwgICAgICAgICAgICAgU2l6ZSBvZiBjaHVuaywgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisgIEVhY2ggdHJlZSBob2xkaW5nIHRyZWVub2RlcyBpcyBhIHRyZWUgb2YgdW5pcXVlIGNodW5rIHNpemVzLiAgQ2h1bmtzCisgIG9mIHRoZSBzYW1lIHNpemUgYXJlIGFycmFuZ2VkIGluIGEgY2lyY3VsYXJseS1saW5rZWQgbGlzdCwgd2l0aCBvbmx5CisgIHRoZSBvbGRlc3QgY2h1bmsgKHRoZSBuZXh0IHRvIGJlIHVzZWQsIGluIG91ciBGSUZPIG9yZGVyaW5nKQorICBhY3R1YWxseSBpbiB0aGUgdHJlZS4gIChUcmVlIG1lbWJlcnMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgYSBub24tbnVsbAorICBwYXJlbnQgcG9pbnRlci4pICBJZiBhIGNodW5rIHdpdGggdGhlIHNhbWUgc2l6ZSBhbiBhbiBleGlzdGluZyBub2RlCisgIGlzIGluc2VydGVkLCBpdCBpcyBsaW5rZWQgb2ZmIHRoZSBleGlzdGluZyBub2RlIHVzaW5nIHBvaW50ZXJzIHRoYXQKKyAgd29yayBpbiB0aGUgc2FtZSB3YXkgYXMgZmQvYmsgcG9pbnRlcnMgb2Ygc21hbGwgY2h1bmtzLgorCisgIEVhY2ggdHJlZSBjb250YWlucyBhIHBvd2VyIG9mIDIgc2l6ZWQgcmFuZ2Ugb2YgY2h1bmsgc2l6ZXMgKHRoZQorICBzbWFsbGVzdCBpcyAweDEwMCA8PSB4IDwgMHgxODApLCB3aGljaCBpcyBpcyBkaXZpZGVkIGluIGhhbGYgYXQgZWFjaAorICB0cmVlIGxldmVsLCB3aXRoIHRoZSBjaHVua3MgaW4gdGhlIHNtYWxsZXIgaGFsZiBvZiB0aGUgcmFuZ2UgKDB4MTAwCisgIDw9IHggPCAweDE0MCBmb3IgdGhlIHRvcCBub3NlKSBpbiB0aGUgbGVmdCBzdWJ0cmVlIGFuZCB0aGUgbGFyZ2VyCisgIGhhbGYgKDB4MTQwIDw9IHggPCAweDE4MCkgaW4gdGhlIHJpZ2h0IHN1YnRyZWUuICBUaGlzIGlzLCBvZiBjb3Vyc2UsCisgIGRvbmUgYnkgaW5zcGVjdGluZyBpbmRpdmlkdWFsIGJpdHMuCisKKyAgVXNpbmcgdGhlc2UgcnVsZXMsIGVhY2ggbm9kZSdzIGxlZnQgc3VidHJlZSBjb250YWlucyBhbGwgc21hbGxlcgorICBzaXplcyB0aGFuIGl0cyByaWdodCBzdWJ0cmVlLiAgSG93ZXZlciwgdGhlIG5vZGUgYXQgdGhlIHJvb3Qgb2YgZWFjaAorICBzdWJ0cmVlIGhhcyBubyBwYXJ0aWN1bGFyIG9yZGVyaW5nIHJlbGF0aW9uc2hpcCB0byBlaXRoZXIuICAoVGhlCisgIGRpdmlkaW5nIGxpbmUgYmV0d2VlbiB0aGUgc3VidHJlZSBzaXplcyBpcyBiYXNlZCBvbiB0cmllIHJlbGF0aW9uLikKKyAgSWYgd2UgcmVtb3ZlIHRoZSBsYXN0IGNodW5rIG9mIGEgZ2l2ZW4gc2l6ZSBmcm9tIHRoZSBpbnRlcmlvciBvZiB0aGUKKyAgdHJlZSwgd2UgbmVlZCB0byByZXBsYWNlIGl0IHdpdGggYSBsZWFmIG5vZGUuICBUaGUgdHJlZSBvcmRlcmluZworICBydWxlcyBwZXJtaXQgYSBub2RlIHRvIGJlIHJlcGxhY2VkIGJ5IGFueSBsZWFmIGJlbG93IGl0LgorCisgIFRoZSBzbWFsbGVzdCBjaHVuayBpbiBhIHRyZWUgKGEgY29tbW9uIG9wZXJhdGlvbiBpbiBhIGJlc3QtZml0CisgIGFsbG9jYXRvcikgY2FuIGJlIGZvdW5kIGJ5IHdhbGtpbmcgYSBwYXRoIHRvIHRoZSBsZWZ0bW9zdCBsZWFmIGluCisgIHRoZSB0cmVlLiAgVW5saWtlIGEgdXN1YWwgYmluYXJ5IHRyZWUsIHdoZXJlIHdlIGZvbGxvdyBsZWZ0IGNoaWxkCisgIHBvaW50ZXJzIHVudGlsIHdlIHJlYWNoIGEgbnVsbCwgaGVyZSB3ZSBmb2xsb3cgdGhlIHJpZ2h0IGNoaWxkCisgIHBvaW50ZXIgYW55IHRpbWUgdGhlIGxlZnQgb25lIGlzIG51bGwsIHVudGlsIHdlIHJlYWNoIGEgbGVhZiB3aXRoCisgIGJvdGggY2hpbGQgcG9pbnRlcnMgbnVsbC4gVGhlIHNtYWxsZXN0IGNodW5rIGluIHRoZSB0cmVlIHdpbGwgYmUKKyAgc29tZXdoZXJlIGFsb25nIHRoYXQgcGF0aC4KKworICBUaGUgd29yc3QgY2FzZSBudW1iZXIgb2Ygc3RlcHMgdG8gYWRkLCBmaW5kLCBvciByZW1vdmUgYSBub2RlIGlzCisgIGJvdW5kZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGRpZmZlcmVudGlhdGluZyBjaHVua3Mgd2l0aGluCisgIGJpbnMuIFVuZGVyIGN1cnJlbnQgYmluIGNhbGN1bGF0aW9ucywgdGhpcyByYW5nZXMgZnJvbSA2IHVwIHRvIDIxCisgIChmb3IgMzIgYml0IHNpemVzKSBvciB1cCB0byA1MyAoZm9yIDY0IGJpdCBzaXplcykuIFRoZSB0eXBpY2FsIGNhc2UKKyAgaXMgb2YgY291cnNlIG11Y2ggYmV0dGVyLgorKi8KKworc3RydWN0IG1hbGxvY190cmVlX2NodW5rIHsKKyAgLyogVGhlIGZpcnN0IGZvdXIgZmllbGRzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIG1hbGxvY19jaHVuayAqLworICBzaXplX3QgICAgICAgICAgICAgICAgICAgIHByZXZfZm9vdDsKKyAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBoZWFkOworICBzdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsqIGZkOworICBzdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsqIGJrOworCisgIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogY2hpbGRbMl07CisgIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogcGFyZW50OworICBiaW5kZXhfdCAgICAgICAgICAgICAgICAgIGluZGV4OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsgIHRjaHVuazsKK3R5cGVkZWYgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiB0Y2h1bmtwdHI7Cit0eXBlZGVmIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogdGJpbnB0cjsgLyogVGhlIHR5cGUgb2YgYmlucyBvZiB0cmVlcyAqLworCisvKiBBIGxpdHRsZSBoZWxwZXIgbWFjcm8gZm9yIHRyZWVzICovCisjZGVmaW5lIGxlZnRtb3N0X2NoaWxkKHQpICgodCktPmNoaWxkWzBdICE9IDA/ICh0KS0+Y2hpbGRbMF0gOiAodCktPmNoaWxkWzFdKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZWdtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBFYWNoIG1hbGxvYyBzcGFjZSBtYXkgaW5jbHVkZSBub24tY29udGlndW91cyBzZWdtZW50cywgaGVsZCBpbiBhCisgIGxpc3QgaGVhZGVkIGJ5IGFuIGVtYmVkZGVkIG1hbGxvY19zZWdtZW50IHJlY29yZCByZXByZXNlbnRpbmcgdGhlCisgIHRvcC1tb3N0IHNwYWNlLiBTZWdtZW50cyBhbHNvIGluY2x1ZGUgZmxhZ3MgaG9sZGluZyBwcm9wZXJ0aWVzIG9mCisgIHRoZSBzcGFjZS4gTGFyZ2UgY2h1bmtzIHRoYXQgYXJlIGRpcmVjdGx5IGFsbG9jYXRlZCBieSBtbWFwIGFyZSBub3QKKyAgaW5jbHVkZWQgaW4gdGhpcyBsaXN0LiBUaGV5IGFyZSBpbnN0ZWFkIGluZGVwZW5kZW50bHkgY3JlYXRlZCBhbmQKKyAgZGVzdHJveWVkIHdpdGhvdXQgb3RoZXJ3aXNlIGtlZXBpbmcgdHJhY2sgb2YgdGhlbS4KKworICBTZWdtZW50IG1hbmFnZW1lbnQgbWFpbmx5IGNvbWVzIGludG8gcGxheSBmb3Igc3BhY2VzIGFsbG9jYXRlZCBieQorICBNTUFQLiAgQW55IGNhbGwgdG8gTU1BUCBtaWdodCBvciBtaWdodCBub3QgcmV0dXJuIG1lbW9yeSB0aGF0IGlzCisgIGFkamFjZW50IHRvIGFuIGV4aXN0aW5nIHNlZ21lbnQuICBNT1JFQ09SRSBub3JtYWxseSBjb250aWd1b3VzbHkKKyAgZXh0ZW5kcyB0aGUgY3VycmVudCBzcGFjZSwgc28gdGhpcyBzcGFjZSBpcyBhbG1vc3QgYWx3YXlzIGFkamFjZW50LAorICB3aGljaCBpcyBzaW1wbGVyIGFuZCBmYXN0ZXIgdG8gZGVhbCB3aXRoLiAoVGhpcyBpcyB3aHkgTU9SRUNPUkUgaXMKKyAgdXNlZCBwcmVmZXJlbnRpYWxseSB0byBNTUFQIHdoZW4gYm90aCBhcmUgYXZhaWxhYmxlIC0tIHNlZQorICBzeXNfYWxsb2MuKSAgV2hlbiBhbGxvY2F0aW5nIHVzaW5nIE1NQVAsIHdlIGRvbid0IHVzZSBhbnkgb2YgdGhlCisgIGhpbnRpbmcgbWVjaGFuaXNtcyAoaW5jb25zaXN0ZW50bHkpIHN1cHBvcnRlZCBpbiB2YXJpb3VzCisgIGltcGxlbWVudGF0aW9ucyBvZiB1bml4IG1tYXAsIG9yIGRpc3Rpbmd1aXNoIHJlc2VydmluZyBmcm9tCisgIGNvbW1pdHRpbmcgbWVtb3J5LiBJbnN0ZWFkLCB3ZSBqdXN0IGFzayBmb3Igc3BhY2UsIGFuZCBleHBsb2l0CisgIGNvbnRpZ3VpdHkgd2hlbiB3ZSBnZXQgaXQuICBJdCBpcyBwcm9iYWJseSBwb3NzaWJsZSB0byBkbworICBiZXR0ZXIgdGhhbiB0aGlzIG9uIHNvbWUgc3lzdGVtcywgYnV0IG5vIGdlbmVyYWwgc2NoZW1lIHNlZW1zCisgIHRvIGJlIHNpZ25pZmljYW50bHkgYmV0dGVyLgorCisgIE1hbmFnZW1lbnQgZW50YWlscyBhIHNpbXBsZXIgdmFyaWFudCBvZiB0aGUgY29uc29saWRhdGlvbiBzY2hlbWUKKyAgdXNlZCBmb3IgY2h1bmtzIHRvIHJlZHVjZSBmcmFnbWVudGF0aW9uIC0tIG5ldyBhZGphY2VudCBtZW1vcnkgaXMKKyAgbm9ybWFsbHkgcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHRvIGFuIGV4aXN0aW5nIHNlZ21lbnQuIEhvd2V2ZXIsCisgIHRoZXJlIGFyZSBsaW1pdGF0aW9ucyBjb21wYXJlZCB0byBjaHVuayBjb25zb2xpZGF0aW9uIHRoYXQgbW9zdGx5CisgIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCBzZWdtZW50IHByb2Nlc3NpbmcgaXMgcmVsYXRpdmVseSBpbmZyZXF1ZW50CisgIChvY2N1cnJpbmcgb25seSB3aGVuIGdldHRpbmcgbWVtb3J5IGZyb20gc3lzdGVtKSBhbmQgdGhhdCB3ZQorICBkb24ndCBleHBlY3QgdG8gaGF2ZSBodWdlIG51bWJlcnMgb2Ygc2VnbWVudHM6CisKKyAgKiBTZWdtZW50cyBhcmUgbm90IGluZGV4ZWQsIHNvIHRyYXZlcnNhbCByZXF1aXJlcyBsaW5lYXIgc2NhbnMuICAoSXQKKyAgICB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbmRleCB0aGVzZSwgYnV0IGlzIG5vdCB3b3J0aCB0aGUgZXh0cmEKKyAgICBvdmVyaGVhZCBhbmQgY29tcGxleGl0eSBmb3IgbW9zdCBwcm9ncmFtcyBvbiBtb3N0IHBsYXRmb3Jtcy4pCisgICogTmV3IHNlZ21lbnRzIGFyZSBvbmx5IGFwcGVuZGVkIHRvIG9sZCBvbmVzIHdoZW4gaG9sZGluZyB0b3AtbW9zdAorICAgIG1lbW9yeTsgaWYgdGhleSBjYW5ub3QgYmUgcHJlcGVuZGVkIHRvIG90aGVycywgdGhleSBhcmUgaGVsZCBpbgorICAgIGRpZmZlcmVudCBzZWdtZW50cy4KKworICBFeGNlcHQgZm9yIHRoZSB0b3AtbW9zdCBzZWdtZW50IG9mIGFuIG1zdGF0ZSwgZWFjaCBzZWdtZW50IHJlY29yZAorICBpcyBrZXB0IGF0IHRoZSB0YWlsIG9mIGl0cyBzZWdtZW50LiBTZWdtZW50cyBhcmUgYWRkZWQgYnkgcHVzaGluZworICBzZWdtZW50IHJlY29yZHMgb250byB0aGUgbGlzdCBoZWFkZWQgYnkgJm1zdGF0ZS5zZWcgZm9yIHRoZQorICBjb250YWluaW5nIG1zdGF0ZS4KKworICBTZWdtZW50IGZsYWdzIGNvbnRyb2wgYWxsb2NhdGlvbi9tZXJnZS9kZWFsbG9jYXRpb24gcG9saWNpZXM6CisgICogSWYgRVhURVJOX0JJVCBzZXQsIHRoZW4gd2UgZGlkIG5vdCBhbGxvY2F0ZSB0aGlzIHNlZ21lbnQsCisgICAgYW5kIHNvIHNob3VsZCBub3QgdHJ5IHRvIGRlYWxsb2NhdGUgb3IgbWVyZ2Ugd2l0aCBvdGhlcnMuCisgICAgKFRoaXMgY3VycmVudGx5IGhvbGRzIG9ubHkgZm9yIHRoZSBpbml0aWFsIHNlZ21lbnQgcGFzc2VkCisgICAgaW50byBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZS4pCisgICogSWYgSVNfTU1BUFBFRF9CSVQgc2V0LCB0aGUgc2VnbWVudCBtYXkgYmUgbWVyZ2VkIHdpdGgKKyAgICBvdGhlciBzdXJyb3VuZGluZyBtbWFwcGVkIHNlZ21lbnRzIGFuZCB0cmltbWVkL2RlLWFsbG9jYXRlZAorICAgIHVzaW5nIG11bm1hcC4KKyAgKiBJZiBuZWl0aGVyIGJpdCBpcyBzZXQsIHRoZW4gdGhlIHNlZ21lbnQgd2FzIG9idGFpbmVkIHVzaW5nCisgICAgTU9SRUNPUkUgc28gY2FuIGJlIG1lcmdlZCB3aXRoIHN1cnJvdW5kaW5nIE1PUkVDT1JFJ2Qgc2VnbWVudHMKKyAgICBhbmQgZGVhbGxvY2F0ZWQvdHJpbW1lZCB1c2luZyBNT1JFQ09SRSB3aXRoIG5lZ2F0aXZlIGFyZ3VtZW50cy4KKyovCisKK3N0cnVjdCBtYWxsb2Nfc2VnbWVudCB7CisgIGNoYXIqICAgICAgICBiYXNlOyAgICAgICAgICAgICAvKiBiYXNlIGFkZHJlc3MgKi8KKyAgc2l6ZV90ICAgICAgIHNpemU7ICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzaXplICovCisgIHN0cnVjdCBtYWxsb2Nfc2VnbWVudCogbmV4dDsgICAvKiBwdHIgdG8gbmV4dCBzZWdtZW50ICovCisjaWYgRkZJX01NQVBfRVhFQ19XUklUCisgIC8qIFRoZSBtbWFwIG1hZ2ljIGlzIHN1cHBvc2VkIHRvIHN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBleGVjdXRhYmxlCisgICAgIHNlZ21lbnQgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSByZXF1ZXN0ZWQgYmxvY2suICAqLworCisjIGRlZmluZSBtbWFwX2V4ZWNfb2Zmc2V0KGIscykgKCoocHRyZGlmZl90KikoKGIpKyhzKS1zaXplb2YocHRyZGlmZl90KSkpCisKKyAgLyogV2UgY2FuIG9ubHkgbWVyZ2Ugc2VnbWVudHMgaWYgdGhlaXIgY29ycmVzcG9uZGluZyBleGVjdXRhYmxlCisgICAgIHNlZ21lbnRzIGFyZSBhdCBpZGVudGljYWwgb2Zmc2V0cy4gICovCisjIGRlZmluZSBjaGVja19zZWdtZW50X21lcmdlKFMsYixzKSBcCisgIChtbWFwX2V4ZWNfb2Zmc2V0KChiKSwocykpID09IChTKS0+ZXhlY19vZmZzZXQpCisKKyMgZGVmaW5lIGFkZF9zZWdtZW50X2V4ZWNfb2Zmc2V0KHAsUykgKChjaGFyKikocCkgKyAoUyktPmV4ZWNfb2Zmc2V0KQorIyBkZWZpbmUgc3ViX3NlZ21lbnRfZXhlY19vZmZzZXQocCxTKSAoKGNoYXIqKShwKSAtIChTKS0+ZXhlY19vZmZzZXQpCisKKyAgLyogVGhlIHJlbW92YWwgb2Ygc2ZsYWdzIG9ubHkgd29ya3Mgd2l0aCBIQVZFX01PUkVDT1JFID09IDAuICAqLworCisjIGRlZmluZSBnZXRfc2VnbWVudF9mbGFncyhTKSAgIChJU19NTUFQUEVEX0JJVCkKKyMgZGVmaW5lIHNldF9zZWdtZW50X2ZsYWdzKFMsdikgXAorICAoKCh2KSAhPSBJU19NTUFQUEVEX0JJVCkgPyAoQUJPUlQsICh2KSkgOgkJCQlcCisgICAoKChTKS0+ZXhlY19vZmZzZXQgPQkJCQkJCQlcCisgICAgIG1tYXBfZXhlY19vZmZzZXQoKFMpLT5iYXNlLCAoUyktPnNpemUpKSwJCQkJXAorICAgIChtbWFwX2V4ZWNfb2Zmc2V0KChTKS0+YmFzZSArIChTKS0+ZXhlY19vZmZzZXQsIChTKS0+c2l6ZSkgIT0JXAorICAgICAoUyktPmV4ZWNfb2Zmc2V0KSA/IChBQk9SVCwgKHYpKSA6CQkJCQlcCisgICAobW1hcF9leGVjX29mZnNldCgoUyktPmJhc2UsIChTKS0+c2l6ZSkgPSAwKSwgKHYpKSkKKworICAvKiBXZSB1c2UgYW4gb2Zmc2V0IGhlcmUsIGluc3RlYWQgb2YgYSBwb2ludGVyLCBiZWNhdXNlIHRoZW4sIHdoZW4KKyAgICAgYmFzZSBjaGFuZ2VzLCB3ZSBkb24ndCBoYXZlIHRvIG1vZGlmeSB0aGlzLiAgT24gYXJjaGl0ZWN0dXJlcworICAgICB3aXRoIHNlZ21lbnRlZCBhZGRyZXNzZXMsIHRoaXMgbWlnaHQgbm90IHdvcmsuICAqLworICBwdHJkaWZmX3QgICAgZXhlY19vZmZzZXQ7CisjZWxzZQorCisjIGRlZmluZSBnZXRfc2VnbWVudF9mbGFncyhTKSAgICgoUyktPnNmbGFncykKKyMgZGVmaW5lIHNldF9zZWdtZW50X2ZsYWdzKFMsdikgKChTKS0+c2ZsYWdzID0gKHYpKQorIyBkZWZpbmUgY2hlY2tfc2VnbWVudF9tZXJnZShTLGIscykgKDEpCisKKyAgZmxhZ190ICAgICAgIHNmbGFnczsgICAgICAgICAgIC8qIG1tYXAgYW5kIGV4dGVybiBmbGFnICovCisjZW5kaWYKK307CisKKyNkZWZpbmUgaXNfbW1hcHBlZF9zZWdtZW50KFMpICAoZ2V0X3NlZ21lbnRfZmxhZ3MoUykgJiBJU19NTUFQUEVEX0JJVCkKKyNkZWZpbmUgaXNfZXh0ZXJuX3NlZ21lbnQoUykgICAoZ2V0X3NlZ21lbnRfZmxhZ3MoUykgJiBFWFRFUk5fQklUKQorCit0eXBlZGVmIHN0cnVjdCBtYWxsb2Nfc2VnbWVudCAgbXNlZ21lbnQ7Cit0eXBlZGVmIHN0cnVjdCBtYWxsb2Nfc2VnbWVudCogbXNlZ21lbnRwdHI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWFsbG9jX3N0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgICBBIG1hbGxvY19zdGF0ZSBob2xkcyBhbGwgb2YgdGhlIGJvb2trZWVwaW5nIGZvciBhIHNwYWNlLgorICAgVGhlIG1haW4gZmllbGRzIGFyZToKKworICBUb3AKKyAgICBUaGUgdG9wbW9zdCBjaHVuayBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBzZWdtZW50LiBJdHMgc2l6ZSBpcworICAgIGNhY2hlZCBpbiB0b3BzaXplLiAgVGhlIGFjdHVhbCBzaXplIG9mIHRvcG1vc3Qgc3BhY2UgaXMKKyAgICB0b3BzaXplK1RPUF9GT09UX1NJWkUsIHdoaWNoIGluY2x1ZGVzIHNwYWNlIHJlc2VydmVkIGZvciBhZGRpbmcKKyAgICBmZW5jZXBvc3RzIGFuZCBzZWdtZW50IHJlY29yZHMgaWYgbmVjZXNzYXJ5IHdoZW4gZ2V0dGluZyBtb3JlCisgICAgc3BhY2UgZnJvbSB0aGUgc3lzdGVtLiAgVGhlIHNpemUgYXQgd2hpY2ggdG8gYXV0b3RyaW0gdG9wIGlzCisgICAgY2FjaGVkIGZyb20gbXBhcmFtcyBpbiB0cmltX2NoZWNrLCBleGNlcHQgdGhhdCBpdCBpcyBkaXNhYmxlZCBpZgorICAgIGFuIGF1dG90cmltIGZhaWxzLgorCisgIERlc2lnbmF0ZWQgdmljdGltIChkdikKKyAgICBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgY2h1bmsgZm9yIHNlcnZpY2luZyBzbWFsbCByZXF1ZXN0cyB0aGF0CisgICAgZG9uJ3QgaGF2ZSBleGFjdCBmaXRzLiAgSXQgaXMgbm9ybWFsbHkgdGhlIGNodW5rIHNwbGl0IG9mZiBtb3N0CisgICAgcmVjZW50bHkgdG8gc2VydmljZSBhbm90aGVyIHNtYWxsIHJlcXVlc3QuICBJdHMgc2l6ZSBpcyBjYWNoZWQgaW4KKyAgICBkdnNpemUuIFRoZSBsaW5rIGZpZWxkcyBvZiB0aGlzIGNodW5rIGFyZSBub3QgbWFpbnRhaW5lZCBzaW5jZSBpdAorICAgIGlzIG5vdCBrZXB0IGluIGEgYmluLgorCisgIFNtYWxsQmlucworICAgIEFuIGFycmF5IG9mIGJpbiBoZWFkZXJzIGZvciBmcmVlIGNodW5rcy4gIFRoZXNlIGJpbnMgaG9sZCBjaHVua3MKKyAgICB3aXRoIHNpemVzIGxlc3MgdGhhbiBNSU5fTEFSR0VfU0laRSBieXRlcy4gRWFjaCBiaW4gY29udGFpbnMKKyAgICBjaHVua3Mgb2YgYWxsIHRoZSBzYW1lIHNpemUsIHNwYWNlZCA4IGJ5dGVzIGFwYXJ0LiAgVG8gc2ltcGxpZnkKKyAgICB1c2UgaW4gZG91YmxlLWxpbmtlZCBsaXN0cywgZWFjaCBiaW4gaGVhZGVyIGFjdHMgYXMgYSBtYWxsb2NfY2h1bmsKKyAgICBwb2ludGluZyB0byB0aGUgcmVhbCBmaXJzdCBub2RlLCBpZiBpdCBleGlzdHMgKGVsc2UgcG9pbnRpbmcgdG8KKyAgICBpdHNlbGYpLiAgVGhpcyBhdm9pZHMgc3BlY2lhbC1jYXNpbmcgZm9yIGhlYWRlcnMuICBCdXQgdG8gYXZvaWQKKyAgICB3YXN0ZSwgd2UgYWxsb2NhdGUgb25seSB0aGUgZmQvYmsgcG9pbnRlcnMgb2YgYmlucywgYW5kIHRoZW4gdXNlCisgICAgcmVwb3NpdGlvbmluZyB0cmlja3MgdG8gdHJlYXQgdGhlc2UgYXMgdGhlIGZpZWxkcyBvZiBhIGNodW5rLgorCisgIFRyZWVCaW5zCisgICAgVHJlZWJpbnMgYXJlIHBvaW50ZXJzIHRvIHRoZSByb290cyBvZiB0cmVlcyBob2xkaW5nIGEgcmFuZ2Ugb2YKKyAgICBzaXplcy4gVGhlcmUgYXJlIDIgZXF1YWxseSBzcGFjZWQgdHJlZWJpbnMgZm9yIGVhY2ggcG93ZXIgb2YgdHdvCisgICAgZnJvbSBUUkVFX1NISUZUIHRvIFRSRUVfU0hJRlQrMTYuIFRoZSBsYXN0IGJpbiBob2xkcyBhbnl0aGluZworICAgIGxhcmdlci4KKworICBCaW4gbWFwcworICAgIFRoZXJlIGlzIG9uZSBiaXQgbWFwIGZvciBzbWFsbCBiaW5zICgic21hbGxtYXAiKSBhbmQgb25lIGZvcgorICAgIHRyZWViaW5zICgidHJlZW1hcCkuICBFYWNoIGJpbiBzZXRzIGl0cyBiaXQgd2hlbiBub24tZW1wdHksIGFuZAorICAgIGNsZWFycyB0aGUgYml0IHdoZW4gZW1wdHkuICBCaXQgb3BlcmF0aW9ucyBhcmUgdGhlbiB1c2VkIHRvIGF2b2lkCisgICAgYmluLWJ5LWJpbiBzZWFyY2hpbmcgLS0gbmVhcmx5IGFsbCAic2VhcmNoIiBpcyBkb25lIHdpdGhvdXQgZXZlcgorICAgIGxvb2tpbmcgYXQgYmlucyB0aGF0IHdvbid0IGJlIHNlbGVjdGVkLiAgVGhlIGJpdCBtYXBzCisgICAgY29uc2VydmF0aXZlbHkgdXNlIDMyIGJpdHMgcGVyIG1hcCB3b3JkLCBldmVuIGlmIG9uIDY0Yml0IHN5c3RlbS4KKyAgICBGb3IgYSBnb29kIGRlc2NyaXB0aW9uIG9mIHNvbWUgb2YgdGhlIGJpdC1iYXNlZCB0ZWNobmlxdWVzIHVzZWQKKyAgICBoZXJlLCBzZWUgSGVucnkgUy4gV2FycmVuIEpyJ3MgYm9vayAiSGFja2VyJ3MgRGVsaWdodCIgKGFuZAorICAgIHN1cHBsZW1lbnQgYXQgaHR0cDovL2hhY2tlcnNkZWxpZ2h0Lm9yZy8pLiBNYW55IG9mIHRoZXNlIGFyZQorICAgIGludGVuZGVkIHRvIHJlZHVjZSB0aGUgYnJhbmNoaW5lc3Mgb2YgcGF0aHMgdGhyb3VnaCBtYWxsb2MgZXRjLCBhcworICAgIHdlbGwgYXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbWVtb3J5IGxvY2F0aW9ucyByZWFkIG9yIHdyaXR0ZW4uCisKKyAgU2VnbWVudHMKKyAgICBBIGxpc3Qgb2Ygc2VnbWVudHMgaGVhZGVkIGJ5IGFuIGVtYmVkZGVkIG1hbGxvY19zZWdtZW50IHJlY29yZAorICAgIHJlcHJlc2VudGluZyB0aGUgaW5pdGlhbCBzcGFjZS4KKworICBBZGRyZXNzIGNoZWNrIHN1cHBvcnQKKyAgICBUaGUgbGVhc3RfYWRkciBmaWVsZCBpcyB0aGUgbGVhc3QgYWRkcmVzcyBldmVyIG9idGFpbmVkIGZyb20KKyAgICBNT1JFQ09SRSBvciBNTUFQLiBBdHRlbXB0ZWQgZnJlZXMgYW5kIHJlYWxsb2NzIG9mIGFueSBhZGRyZXNzIGxlc3MKKyAgICB0aGFuIHRoaXMgYXJlIHRyYXBwZWQgKHVubGVzcyBJTlNFQ1VSRSBpcyBkZWZpbmVkKS4KKworICBNYWdpYyB0YWcKKyAgICBBIGNyb3NzLWNoZWNrIGZpZWxkIHRoYXQgc2hvdWxkIGFsd2F5cyBob2xkIHNhbWUgdmFsdWUgYXMgbXBhcmFtcy5tYWdpYy4KKworICBGbGFncworICAgIEJpdHMgcmVjb3JkaW5nIHdoZXRoZXIgdG8gdXNlIE1NQVAsIGxvY2tzLCBvciBjb250aWd1b3VzIE1PUkVDT1JFCisKKyAgU3RhdGlzdGljcworICAgIEVhY2ggc3BhY2Uga2VlcHMgdHJhY2sgb2YgY3VycmVudCBhbmQgbWF4aW11bSBzeXN0ZW0gbWVtb3J5CisgICAgb2J0YWluZWQgdmlhIE1PUkVDT1JFIG9yIE1NQVAuCisKKyAgTG9ja2luZworICAgIElmIFVTRV9MT0NLUyBpcyBkZWZpbmVkLCB0aGUgIm11dGV4IiBsb2NrIGlzIGFjcXVpcmVkIGFuZCByZWxlYXNlZAorICAgIGFyb3VuZCBldmVyeSBwdWJsaWMgY2FsbCB1c2luZyB0aGlzIG1zcGFjZS4KKyovCisKKy8qIEJpbiB0eXBlcywgd2lkdGhzIGFuZCBzaXplcyAqLworI2RlZmluZSBOU01BTExCSU5TICAgICAgICAoMzJVKQorI2RlZmluZSBOVFJFRUJJTlMgICAgICAgICAoMzJVKQorI2RlZmluZSBTTUFMTEJJTl9TSElGVCAgICAoM1UpCisjZGVmaW5lIFNNQUxMQklOX1dJRFRIICAgIChTSVpFX1RfT05FIDw8IFNNQUxMQklOX1NISUZUKQorI2RlZmluZSBUUkVFQklOX1NISUZUICAgICAoOFUpCisjZGVmaW5lIE1JTl9MQVJHRV9TSVpFICAgIChTSVpFX1RfT05FIDw8IFRSRUVCSU5fU0hJRlQpCisjZGVmaW5lIE1BWF9TTUFMTF9TSVpFICAgIChNSU5fTEFSR0VfU0laRSAtIFNJWkVfVF9PTkUpCisjZGVmaW5lIE1BWF9TTUFMTF9SRVFVRVNUIChNQVhfU01BTExfU0laRSAtIENIVU5LX0FMSUdOX01BU0sgLSBDSFVOS19PVkVSSEVBRCkKKworc3RydWN0IG1hbGxvY19zdGF0ZSB7CisgIGJpbm1hcF90ICAgc21hbGxtYXA7CisgIGJpbm1hcF90ICAgdHJlZW1hcDsKKyAgc2l6ZV90ICAgICBkdnNpemU7CisgIHNpemVfdCAgICAgdG9wc2l6ZTsKKyAgY2hhciogICAgICBsZWFzdF9hZGRyOworICBtY2h1bmtwdHIgIGR2OworICBtY2h1bmtwdHIgIHRvcDsKKyAgc2l6ZV90ICAgICB0cmltX2NoZWNrOworICBzaXplX3QgICAgIG1hZ2ljOworICBtY2h1bmtwdHIgIHNtYWxsYmluc1soTlNNQUxMQklOUysxKSoyXTsKKyAgdGJpbnB0ciAgICB0cmVlYmluc1tOVFJFRUJJTlNdOworICBzaXplX3QgICAgIGZvb3RwcmludDsKKyAgc2l6ZV90ICAgICBtYXhfZm9vdHByaW50OworICBmbGFnX3QgICAgIG1mbGFnczsKKyNpZiBVU0VfTE9DS1MKKyAgTUxPQ0tfVCAgICBtdXRleDsgICAgIC8qIGxvY2F0ZSBsb2NrIGFtb25nIGZpZWxkcyB0aGF0IHJhcmVseSBjaGFuZ2UgKi8KKyNlbmRpZiAvKiBVU0VfTE9DS1MgKi8KKyAgbXNlZ21lbnQgICBzZWc7Cit9OworCit0eXBlZGVmIHN0cnVjdCBtYWxsb2Nfc3RhdGUqICAgIG1zdGF0ZTsKKworLyogLS0tLS0tLS0tLS0tLSBHbG9iYWwgbWFsbG9jX3N0YXRlIGFuZCBtYWxsb2NfcGFyYW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgbWFsbG9jX3BhcmFtcyBob2xkcyBnbG9iYWwgcHJvcGVydGllcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgY2FuIGJlCisgIGR5bmFtaWNhbGx5IHNldCB1c2luZyBtYWxsb3B0LiBUaGVyZSBpcyBhIHNpbmdsZSBpbnN0YW5jZSwgbXBhcmFtcywKKyAgaW5pdGlhbGl6ZWQgaW4gaW5pdF9tcGFyYW1zLgorKi8KKworc3RydWN0IG1hbGxvY19wYXJhbXMgeworICBzaXplX3QgbWFnaWM7CisgIHNpemVfdCBwYWdlX3NpemU7CisgIHNpemVfdCBncmFudWxhcml0eTsKKyAgc2l6ZV90IG1tYXBfdGhyZXNob2xkOworICBzaXplX3QgdHJpbV90aHJlc2hvbGQ7CisgIGZsYWdfdCBkZWZhdWx0X21mbGFnczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFsbG9jX3BhcmFtcyBtcGFyYW1zOworCisvKiBUaGUgZ2xvYmFsIG1hbGxvY19zdGF0ZSB1c2VkIGZvciBhbGwgbm9uLSJtc3BhY2UiIGNhbGxzICovCitzdGF0aWMgc3RydWN0IG1hbGxvY19zdGF0ZSBfZ21fOworI2RlZmluZSBnbSAgICAgICAgICAgICAgICAgKCZfZ21fKQorI2RlZmluZSBpc19nbG9iYWwoTSkgICAgICAgKChNKSA9PSAmX2dtXykKKyNkZWZpbmUgaXNfaW5pdGlhbGl6ZWQoTSkgICgoTSktPnRvcCAhPSAwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzeXN0ZW0gYWxsb2Mgc2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBPcGVyYXRpb25zIG9uIG1mbGFncyAqLworCisjZGVmaW5lIHVzZV9sb2NrKE0pICAgICAgICAgICAoKE0pLT5tZmxhZ3MgJiAgIFVTRV9MT0NLX0JJVCkKKyNkZWZpbmUgZW5hYmxlX2xvY2soTSkgICAgICAgICgoTSktPm1mbGFncyB8PSAgVVNFX0xPQ0tfQklUKQorI2RlZmluZSBkaXNhYmxlX2xvY2soTSkgICAgICAgKChNKS0+bWZsYWdzICY9IH5VU0VfTE9DS19CSVQpCisKKyNkZWZpbmUgdXNlX21tYXAoTSkgICAgICAgICAgICgoTSktPm1mbGFncyAmICAgVVNFX01NQVBfQklUKQorI2RlZmluZSBlbmFibGVfbW1hcChNKSAgICAgICAgKChNKS0+bWZsYWdzIHw9ICBVU0VfTU1BUF9CSVQpCisjZGVmaW5lIGRpc2FibGVfbW1hcChNKSAgICAgICAoKE0pLT5tZmxhZ3MgJj0gflVTRV9NTUFQX0JJVCkKKworI2RlZmluZSB1c2Vfbm9uY29udGlndW91cyhNKSAgKChNKS0+bWZsYWdzICYgICBVU0VfTk9OQ09OVElHVU9VU19CSVQpCisjZGVmaW5lIGRpc2FibGVfY29udGlndW91cyhNKSAoKE0pLT5tZmxhZ3MgfD0gIFVTRV9OT05DT05USUdVT1VTX0JJVCkKKworI2RlZmluZSBzZXRfbG9jayhNLEwpXAorICgoTSktPm1mbGFncyA9IChMKT9cCisgICgoTSktPm1mbGFncyB8IFVTRV9MT0NLX0JJVCkgOlwKKyAgKChNKS0+bWZsYWdzICYgflVTRV9MT0NLX0JJVCkpCisKKy8qIHBhZ2UtYWxpZ24gYSBzaXplICovCisjZGVmaW5lIHBhZ2VfYWxpZ24oUylcCisgKCgoUykgKyAobXBhcmFtcy5wYWdlX3NpemUpKSAmIH4obXBhcmFtcy5wYWdlX3NpemUgLSBTSVpFX1RfT05FKSkKKworLyogZ3JhbnVsYXJpdHktYWxpZ24gYSBzaXplICovCisjZGVmaW5lIGdyYW51bGFyaXR5X2FsaWduKFMpXAorICAoKChTKSArIChtcGFyYW1zLmdyYW51bGFyaXR5KSkgJiB+KG1wYXJhbXMuZ3JhbnVsYXJpdHkgLSBTSVpFX1RfT05FKSkKKworI2RlZmluZSBpc19wYWdlX2FsaWduZWQoUylcCisgICAoKChzaXplX3QpKFMpICYgKG1wYXJhbXMucGFnZV9zaXplIC0gU0laRV9UX09ORSkpID09IDApCisjZGVmaW5lIGlzX2dyYW51bGFyaXR5X2FsaWduZWQoUylcCisgICAoKChzaXplX3QpKFMpICYgKG1wYXJhbXMuZ3JhbnVsYXJpdHkgLSBTSVpFX1RfT05FKSkgPT0gMCkKKworLyogIFRydWUgaWYgc2VnbWVudCBTIGhvbGRzIGFkZHJlc3MgQSAqLworI2RlZmluZSBzZWdtZW50X2hvbGRzKFMsIEEpXAorICAoKGNoYXIqKShBKSA+PSBTLT5iYXNlICYmIChjaGFyKikoQSkgPCBTLT5iYXNlICsgUy0+c2l6ZSkKKworLyogUmV0dXJuIHNlZ21lbnQgaG9sZGluZyBnaXZlbiBhZGRyZXNzICovCitzdGF0aWMgbXNlZ21lbnRwdHIgc2VnbWVudF9ob2xkaW5nKG1zdGF0ZSBtLCBjaGFyKiBhZGRyKSB7CisgIG1zZWdtZW50cHRyIHNwID0gJm0tPnNlZzsKKyAgZm9yICg7OykgeworICAgIGlmIChhZGRyID49IHNwLT5iYXNlICYmIGFkZHIgPCBzcC0+YmFzZSArIHNwLT5zaXplKQorICAgICAgcmV0dXJuIHNwOworICAgIGlmICgoc3AgPSBzcC0+bmV4dCkgPT0gMCkKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHNlZ21lbnQgY29udGFpbnMgYSBzZWdtZW50IGxpbmsgKi8KK3N0YXRpYyBpbnQgaGFzX3NlZ21lbnRfbGluayhtc3RhdGUgbSwgbXNlZ21lbnRwdHIgc3MpIHsKKyAgbXNlZ21lbnRwdHIgc3AgPSAmbS0+c2VnOworICBmb3IgKDs7KSB7CisgICAgaWYgKChjaGFyKilzcCA+PSBzcy0+YmFzZSAmJiAoY2hhciopc3AgPCBzcy0+YmFzZSArIHNzLT5zaXplKQorICAgICAgcmV0dXJuIDE7CisgICAgaWYgKChzcCA9IHNwLT5uZXh0KSA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2lmbmRlZiBNT1JFQ09SRV9DQU5OT1RfVFJJTQorI2RlZmluZSBzaG91bGRfdHJpbShNLHMpICAoKHMpID4gKE0pLT50cmltX2NoZWNrKQorI2Vsc2UgIC8qIE1PUkVDT1JFX0NBTk5PVF9UUklNICovCisjZGVmaW5lIHNob3VsZF90cmltKE0scykgICgwKQorI2VuZGlmIC8qIE1PUkVDT1JFX0NBTk5PVF9UUklNICovCisKKy8qCisgIFRPUF9GT09UX1NJWkUgaXMgcGFkZGluZyBhdCB0aGUgZW5kIG9mIGEgc2VnbWVudCwgaW5jbHVkaW5nIHNwYWNlCisgIHRoYXQgbWF5IGJlIG5lZWRlZCB0byBwbGFjZSBzZWdtZW50IHJlY29yZHMgYW5kIGZlbmNlcG9zdHMgd2hlbiBuZXcKKyAgbm9uY29udGlndW91cyBzZWdtZW50cyBhcmUgYWRkZWQuCisqLworI2RlZmluZSBUT1BfRk9PVF9TSVpFXAorICAoYWxpZ25fb2Zmc2V0KGNodW5rMm1lbSgwKSkrcGFkX3JlcXVlc3Qoc2l6ZW9mKHN0cnVjdCBtYWxsb2Nfc2VnbWVudCkpK01JTl9DSFVOS19TSVpFKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEhvb2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIFBSRUFDVElPTiBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gMCBvbiBzdWNjZXNzLCBhbmQgbm9uemVybyBvbgorICBmYWlsdXJlLiBJZiB5b3UgYXJlIG5vdCB1c2luZyBsb2NraW5nLCB5b3UgY2FuIHJlZGVmaW5lIHRoZXNlIHRvIGRvCisgIGFueXRoaW5nIHlvdSBsaWtlLgorKi8KKworI2lmIFVTRV9MT0NLUworCisvKiBFbnN1cmUgbG9ja3MgYXJlIGluaXRpYWxpemVkICovCisjZGVmaW5lIEdMT0JBTExZX0lOSVRJQUxJWkUoKSAobXBhcmFtcy5wYWdlX3NpemUgPT0gMCAmJiBpbml0X21wYXJhbXMoKSkKKworI2RlZmluZSBQUkVBQ1RJT04oTSkgICgoR0xPQkFMTFlfSU5JVElBTElaRSgpIHx8IHVzZV9sb2NrKE0pKT8gQUNRVUlSRV9MT0NLKCYoTSktPm11dGV4KSA6IDApCisjZGVmaW5lIFBPU1RBQ1RJT04oTSkgeyBpZiAodXNlX2xvY2soTSkpIFJFTEVBU0VfTE9DSygmKE0pLT5tdXRleCk7IH0KKyNlbHNlIC8qIFVTRV9MT0NLUyAqLworCisjaWZuZGVmIFBSRUFDVElPTgorI2RlZmluZSBQUkVBQ1RJT04oTSkgKDApCisjZW5kaWYgIC8qIFBSRUFDVElPTiAqLworCisjaWZuZGVmIFBPU1RBQ1RJT04KKyNkZWZpbmUgUE9TVEFDVElPTihNKQorI2VuZGlmICAvKiBQT1NUQUNUSU9OICovCisKKyNlbmRpZiAvKiBVU0VfTE9DS1MgKi8KKworLyoKKyAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04gaXMgdHJpZ2dlcmVkIHVwb24gZGV0ZWN0ZWQgYmFkIGFkZHJlc3Nlcy4KKyAgVVNBR0VfRVJST1JfQUNUSU9OIGlzIHRyaWdnZXJlZCBvbiBkZXRlY3RlZCBiYWQgZnJlZXMgYW5kCisgIHJlYWxsb2NzLiBUaGUgYXJndW1lbnQgcCBpcyBhbiBhZGRyZXNzIHRoYXQgbWlnaHQgaGF2ZSB0cmlnZ2VyZWQgdGhlCisgIGZhdWx0LiBJdCBpcyBpZ25vcmVkIGJ5IHRoZSB0d28gcHJlZGVmaW5lZCBhY3Rpb25zLCBidXQgbWlnaHQgYmUKKyAgdXNlZnVsIGluIGN1c3RvbSBhY3Rpb25zIHRoYXQgdHJ5IHRvIGhlbHAgZGlhZ25vc2UgZXJyb3JzLgorKi8KKworI2lmIFBST0NFRURfT05fRVJST1IKKworLyogQSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGNvcnJ1cHRpb24gZXJyb3JzIGNhdXNpbmcgcmVzZXRzICovCitpbnQgbWFsbG9jX2NvcnJ1cHRpb25fZXJyb3JfY291bnQ7CisKKy8qIGRlZmF1bHQgY29ycnVwdGlvbiBhY3Rpb24gKi8KK3N0YXRpYyB2b2lkIHJlc2V0X29uX2Vycm9yKG1zdGF0ZSBtKTsKKworI2RlZmluZSBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihtKSAgcmVzZXRfb25fZXJyb3IobSkKKyNkZWZpbmUgVVNBR0VfRVJST1JfQUNUSU9OKG0sIHApCisKKyNlbHNlIC8qIFBST0NFRURfT05fRVJST1IgKi8KKworI2lmbmRlZiBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTgorI2RlZmluZSBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihtKSBBQk9SVAorI2VuZGlmIC8qIENPUlJVUFRJT05fRVJST1JfQUNUSU9OICovCisKKyNpZm5kZWYgVVNBR0VfRVJST1JfQUNUSU9OCisjZGVmaW5lIFVTQUdFX0VSUk9SX0FDVElPTihtLHApIEFCT1JUCisjZW5kaWYgLyogVVNBR0VfRVJST1JfQUNUSU9OICovCisKKyNlbmRpZiAvKiBQUk9DRUVEX09OX0VSUk9SICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlYnVnZ2luZyBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAhIERFQlVHCisKKyNkZWZpbmUgY2hlY2tfZnJlZV9jaHVuayhNLFApCisjZGVmaW5lIGNoZWNrX2ludXNlX2NodW5rKE0sUCkKKyNkZWZpbmUgY2hlY2tfbWFsbG9jZWRfY2h1bmsoTSxQLE4pCisjZGVmaW5lIGNoZWNrX21tYXBwZWRfY2h1bmsoTSxQKQorI2RlZmluZSBjaGVja19tYWxsb2Nfc3RhdGUoTSkKKyNkZWZpbmUgY2hlY2tfdG9wX2NodW5rKE0sUCkKKworI2Vsc2UgLyogREVCVUcgKi8KKyNkZWZpbmUgY2hlY2tfZnJlZV9jaHVuayhNLFApICAgICAgIGRvX2NoZWNrX2ZyZWVfY2h1bmsoTSxQKQorI2RlZmluZSBjaGVja19pbnVzZV9jaHVuayhNLFApICAgICAgZG9fY2hlY2tfaW51c2VfY2h1bmsoTSxQKQorI2RlZmluZSBjaGVja190b3BfY2h1bmsoTSxQKSAgICAgICAgZG9fY2hlY2tfdG9wX2NodW5rKE0sUCkKKyNkZWZpbmUgY2hlY2tfbWFsbG9jZWRfY2h1bmsoTSxQLE4pIGRvX2NoZWNrX21hbGxvY2VkX2NodW5rKE0sUCxOKQorI2RlZmluZSBjaGVja19tbWFwcGVkX2NodW5rKE0sUCkgICAgZG9fY2hlY2tfbW1hcHBlZF9jaHVuayhNLFApCisjZGVmaW5lIGNoZWNrX21hbGxvY19zdGF0ZShNKSAgICAgICBkb19jaGVja19tYWxsb2Nfc3RhdGUoTSkKKworc3RhdGljIHZvaWQgICBkb19jaGVja19hbnlfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKTsKK3N0YXRpYyB2b2lkICAgZG9fY2hlY2tfdG9wX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7CitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX21tYXBwZWRfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKTsKK3N0YXRpYyB2b2lkICAgZG9fY2hlY2tfaW51c2VfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKTsKK3N0YXRpYyB2b2lkICAgZG9fY2hlY2tfZnJlZV9jaHVuayhtc3RhdGUgbSwgbWNodW5rcHRyIHApOworc3RhdGljIHZvaWQgICBkb19jaGVja19tYWxsb2NlZF9jaHVuayhtc3RhdGUgbSwgdm9pZCogbWVtLCBzaXplX3Qgcyk7CitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX3RyZWUobXN0YXRlIG0sIHRjaHVua3B0ciB0KTsKK3N0YXRpYyB2b2lkICAgZG9fY2hlY2tfdHJlZWJpbihtc3RhdGUgbSwgYmluZGV4X3QgaSk7CitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX3NtYWxsYmluKG1zdGF0ZSBtLCBiaW5kZXhfdCBpKTsKK3N0YXRpYyB2b2lkICAgZG9fY2hlY2tfbWFsbG9jX3N0YXRlKG1zdGF0ZSBtKTsKK3N0YXRpYyBpbnQgICAgYmluX2ZpbmQobXN0YXRlIG0sIG1jaHVua3B0ciB4KTsKK3N0YXRpYyBzaXplX3QgdHJhdmVyc2VfYW5kX2NoZWNrKG1zdGF0ZSBtKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluZGV4aW5nIEJpbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIGlzX3NtYWxsKHMpICAgICAgICAgKCgocykgPj4gU01BTExCSU5fU0hJRlQpIDwgTlNNQUxMQklOUykKKyNkZWZpbmUgc21hbGxfaW5kZXgocykgICAgICAoKHMpICA+PiBTTUFMTEJJTl9TSElGVCkKKyNkZWZpbmUgc21hbGxfaW5kZXgyc2l6ZShpKSAoKGkpICA8PCBTTUFMTEJJTl9TSElGVCkKKyNkZWZpbmUgTUlOX1NNQUxMX0lOREVYICAgICAoc21hbGxfaW5kZXgoTUlOX0NIVU5LX1NJWkUpKQorCisvKiBhZGRyZXNzaW5nIGJ5IGluZGV4LiBTZWUgYWJvdmUgYWJvdXQgc21hbGxiaW4gcmVwb3NpdGlvbmluZyAqLworI2RlZmluZSBzbWFsbGJpbl9hdChNLCBpKSAgICgoc2JpbnB0cikoKGNoYXIqKSYoKE0pLT5zbWFsbGJpbnNbKGkpPDwxXSkpKQorI2RlZmluZSB0cmVlYmluX2F0KE0saSkgICAgICgmKChNKS0+dHJlZWJpbnNbaV0pKQorCisvKiBhc3NpZ24gdHJlZSBpbmRleCBmb3Igc2l6ZSBTIHRvIHZhcmlhYmxlIEkgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKGkzODYpCisjZGVmaW5lIGNvbXB1dGVfdHJlZV9pbmRleChTLCBJKVwKK3tcCisgIHNpemVfdCBYID0gUyA+PiBUUkVFQklOX1NISUZUO1wKKyAgaWYgKFggPT0gMClcCisgICAgSSA9IDA7XAorICBlbHNlIGlmIChYID4gMHhGRkZGKVwKKyAgICBJID0gTlRSRUVCSU5TLTE7XAorICBlbHNlIHtcCisgICAgdW5zaWduZWQgaW50IEs7XAorICAgIF9fYXNtX18oImJzcmwgJTEsJTBcblx0IiA6ICI9ciIgKEspIDogInJtIiAgKFgpKTtcCisgICAgSSA9ICAoYmluZGV4X3QpKChLIDw8IDEpICsgKChTID4+IChLICsgKFRSRUVCSU5fU0hJRlQtMSkpICYgMSkpKTtcCisgIH1cCit9CisjZWxzZSAvKiBHTlVDICovCisjZGVmaW5lIGNvbXB1dGVfdHJlZV9pbmRleChTLCBJKVwKK3tcCisgIHNpemVfdCBYID0gUyA+PiBUUkVFQklOX1NISUZUO1wKKyAgaWYgKFggPT0gMClcCisgICAgSSA9IDA7XAorICBlbHNlIGlmIChYID4gMHhGRkZGKVwKKyAgICBJID0gTlRSRUVCSU5TLTE7XAorICBlbHNlIHtcCisgICAgdW5zaWduZWQgaW50IFkgPSAodW5zaWduZWQgaW50KVg7XAorICAgIHVuc2lnbmVkIGludCBOID0gKChZIC0gMHgxMDApID4+IDE2KSAmIDg7XAorICAgIHVuc2lnbmVkIGludCBLID0gKCgoWSA8PD0gTikgLSAweDEwMDApID4+IDE2KSAmIDQ7XAorICAgIE4gKz0gSztcCisgICAgTiArPSBLID0gKCgoWSA8PD0gSykgLSAweDQwMDApID4+IDE2KSAmIDI7XAorICAgIEsgPSAxNCAtIE4gKyAoKFkgPDw9IEspID4+IDE1KTtcCisgICAgSSA9IChLIDw8IDEpICsgKChTID4+IChLICsgKFRSRUVCSU5fU0hJRlQtMSkpICYgMSkpO1wKKyAgfVwKK30KKyNlbmRpZiAvKiBHTlVDICovCisKKy8qIEJpdCByZXByZXNlbnRpbmcgbWF4aW11bSByZXNvbHZlZCBzaXplIGluIGEgdHJlZWJpbiBhdCBpICovCisjZGVmaW5lIGJpdF9mb3JfdHJlZV9pbmRleChpKSBcCisgICAoaSA9PSBOVFJFRUJJTlMtMSk/IChTSVpFX1RfQklUU0laRS0xKSA6ICgoKGkpID4+IDEpICsgVFJFRUJJTl9TSElGVCAtIDIpCisKKy8qIFNoaWZ0IHBsYWNpbmcgbWF4aW11bSByZXNvbHZlZCBiaXQgaW4gYSB0cmVlYmluIGF0IGkgYXMgc2lnbiBiaXQgKi8KKyNkZWZpbmUgbGVmdHNoaWZ0X2Zvcl90cmVlX2luZGV4KGkpIFwKKyAgICgoaSA9PSBOVFJFRUJJTlMtMSk/IDAgOiBcCisgICAgKChTSVpFX1RfQklUU0laRS1TSVpFX1RfT05FKSAtICgoKGkpID4+IDEpICsgVFJFRUJJTl9TSElGVCAtIDIpKSkKKworLyogVGhlIHNpemUgb2YgdGhlIHNtYWxsZXN0IGNodW5rIGhlbGQgaW4gYmluIHdpdGggaW5kZXggaSAqLworI2RlZmluZSBtaW5zaXplX2Zvcl90cmVlX2luZGV4KGkpIFwKKyAgICgoU0laRV9UX09ORSA8PCAoKChpKSA+PiAxKSArIFRSRUVCSU5fU0hJRlQpKSB8ICBcCisgICAoKChzaXplX3QpKChpKSAmIFNJWkVfVF9PTkUpKSA8PCAoKChpKSA+PiAxKSArIFRSRUVCSU5fU0hJRlQgLSAxKSkpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMgb24gYmluIG1hcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogYml0IGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gaW5kZXggKi8KKyNkZWZpbmUgaWR4MmJpdChpKSAgICAgICAgICAgICAgKChiaW5tYXBfdCkoMSkgPDwgKGkpKQorCisvKiBNYXJrL0NsZWFyIGJpdHMgd2l0aCBnaXZlbiBpbmRleCAqLworI2RlZmluZSBtYXJrX3NtYWxsbWFwKE0saSkgICAgICAoKE0pLT5zbWFsbG1hcCB8PSAgaWR4MmJpdChpKSkKKyNkZWZpbmUgY2xlYXJfc21hbGxtYXAoTSxpKSAgICAgKChNKS0+c21hbGxtYXAgJj0gfmlkeDJiaXQoaSkpCisjZGVmaW5lIHNtYWxsbWFwX2lzX21hcmtlZChNLGkpICgoTSktPnNtYWxsbWFwICYgICBpZHgyYml0KGkpKQorCisjZGVmaW5lIG1hcmtfdHJlZW1hcChNLGkpICAgICAgICgoTSktPnRyZWVtYXAgIHw9ICBpZHgyYml0KGkpKQorI2RlZmluZSBjbGVhcl90cmVlbWFwKE0saSkgICAgICAoKE0pLT50cmVlbWFwICAmPSB+aWR4MmJpdChpKSkKKyNkZWZpbmUgdHJlZW1hcF9pc19tYXJrZWQoTSxpKSAgKChNKS0+dHJlZW1hcCAgJiAgIGlkeDJiaXQoaSkpCisKKy8qIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gYml0ICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKGkzODYpCisjZGVmaW5lIGNvbXB1dGVfYml0MmlkeChYLCBJKVwKK3tcCisgIHVuc2lnbmVkIGludCBKO1wKKyAgX19hc21fXygiYnNmbCAlMSwlMFxuXHQiIDogIj1yIiAoSikgOiAicm0iIChYKSk7XAorICBJID0gKGJpbmRleF90KUo7XAorfQorCisjZWxzZSAvKiBHTlVDICovCisjaWYgIFVTRV9CVUlMVElOX0ZGUworI2RlZmluZSBjb21wdXRlX2JpdDJpZHgoWCwgSSkgSSA9IGZmcyhYKS0xCisKKyNlbHNlIC8qIFVTRV9CVUlMVElOX0ZGUyAqLworI2RlZmluZSBjb21wdXRlX2JpdDJpZHgoWCwgSSlcCit7XAorICB1bnNpZ25lZCBpbnQgWSA9IFggLSAxO1wKKyAgdW5zaWduZWQgaW50IEsgPSBZID4+ICgxNi00KSAmIDE2O1wKKyAgdW5zaWduZWQgaW50IE4gPSBLOyAgICAgICAgWSA+Pj0gSztcCisgIE4gKz0gSyA9IFkgPj4gKDgtMykgJiAgODsgIFkgPj49IEs7XAorICBOICs9IEsgPSBZID4+ICg0LTIpICYgIDQ7ICBZID4+PSBLO1wKKyAgTiArPSBLID0gWSA+PiAoMi0xKSAmICAyOyAgWSA+Pj0gSztcCisgIE4gKz0gSyA9IFkgPj4gKDEtMCkgJiAgMTsgIFkgPj49IEs7XAorICBJID0gKGJpbmRleF90KShOICsgWSk7XAorfQorI2VuZGlmIC8qIFVTRV9CVUlMVElOX0ZGUyAqLworI2VuZGlmIC8qIEdOVUMgKi8KKworLyogaXNvbGF0ZSB0aGUgbGVhc3Qgc2V0IGJpdCBvZiBhIGJpdG1hcCAqLworI2RlZmluZSBsZWFzdF9iaXQoeCkgICAgICAgICAoKHgpICYgLSh4KSkKKworLyogbWFzayB3aXRoIGFsbCBiaXRzIHRvIGxlZnQgb2YgbGVhc3QgYml0IG9mIHggb24gKi8KKyNkZWZpbmUgbGVmdF9iaXRzKHgpICAgICAgICAgKCh4PDwxKSB8IC0oeDw8MSkpCisKKy8qIG1hc2sgd2l0aCBhbGwgYml0cyB0byBsZWZ0IG9mIG9yIGVxdWFsIHRvIGxlYXN0IGJpdCBvZiB4IG9uICovCisjZGVmaW5lIHNhbWVfb3JfbGVmdF9iaXRzKHgpICgoeCkgfCAtKHgpKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJ1bnRpbWUgQ2hlY2sgU3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIEZvciBzZWN1cml0eSwgdGhlIG1haW4gaW52YXJpYW50IGlzIHRoYXQgbWFsbG9jL2ZyZWUvZXRjIG5ldmVyCisgIHdyaXRlcyB0byBhIHN0YXRpYyBhZGRyZXNzIG90aGVyIHRoYW4gbWFsbG9jX3N0YXRlLCB1bmxlc3Mgc3RhdGljCisgIG1hbGxvY19zdGF0ZSBpdHNlbGYgaGFzIGJlZW4gY29ycnVwdGVkLCB3aGljaCBjYW5ub3Qgb2NjdXIgdmlhCisgIG1hbGxvYyAoYmVjYXVzZSBvZiB0aGVzZSBjaGVja3MpLiBJbiBlc3NlbmNlIHRoaXMgbWVhbnMgdGhhdCB3ZQorICBiZWxpZXZlIGFsbCBwb2ludGVycywgc2l6ZXMsIG1hcHMgZXRjIGhlbGQgaW4gbWFsbG9jX3N0YXRlLCBidXQKKyAgY2hlY2sgYWxsIG9mIHRob3NlIGxpbmtlZCBvciBvZmZzZXR0ZWQgZnJvbSBvdGhlciBlbWJlZGRlZCBkYXRhCisgIHN0cnVjdHVyZXMuICBUaGVzZSBjaGVja3MgYXJlIGludGVyc3BlcnNlZCB3aXRoIG1haW4gY29kZSBpbiBhIHdheQorICB0aGF0IHRlbmRzIHRvIG1pbmltaXplIHRoZWlyIHJ1bi10aW1lIGNvc3QuCisKKyAgV2hlbiBGT09URVJTIGlzIGRlZmluZWQsIGluIGFkZGl0aW9uIHRvIHJhbmdlIGNoZWNraW5nLCB3ZSBhbHNvCisgIHZlcmlmeSBmb290ZXIgZmllbGRzIG9mIGludXNlIGNodW5rcywgd2hpY2ggY2FuIGJlIHVzZWQgZ3VhcmFudGVlCisgIHRoYXQgdGhlIG1zdGF0ZSBjb250cm9sbGluZyBtYWxsb2MvZnJlZSBpcyBpbnRhY3QuICBUaGlzIGlzIGEKKyAgc3RyZWFtbGluZWQgdmVyc2lvbiBvZiB0aGUgYXBwcm9hY2ggZGVzY3JpYmVkIGJ5IFdpbGxpYW0gUm9iZXJ0c29uCisgIGV0IGFsIGluICJSdW4tdGltZSBEZXRlY3Rpb24gb2YgSGVhcC1iYXNlZCBPdmVyZmxvd3MiIExJU0EnMDMKKyAgaHR0cDovL3d3dy51c2VuaXgub3JnL2V2ZW50cy9saXNhMDMvdGVjaC9yb2JlcnRzb24uaHRtbCBUaGUgZm9vdGVyCisgIG9mIGFuIGludXNlIGNodW5rIGhvbGRzIHRoZSB4b3Igb2YgaXRzIG1zdGF0ZSBhbmQgYSByYW5kb20gc2VlZCwKKyAgdGhhdCBpcyBjaGVja2VkIHVwb24gY2FsbHMgdG8gZnJlZSgpIGFuZCByZWFsbG9jKCkuICBUaGlzIGlzCisgIChwcm9iYWJsaXN0aWNhbGx5KSB1bmd1ZXNzYWJsZSBmcm9tIG91dHNpZGUgdGhlIHByb2dyYW0sIGJ1dCBjYW4gYmUKKyAgY29tcHV0ZWQgYnkgYW55IGNvZGUgc3VjY2Vzc2Z1bGx5IG1hbGxvYydpbmcgYW55IGNodW5rLCBzbyBkb2VzIG5vdAorICBpdHNlbGYgcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgY29kZSB0aGF0IGhhcyBhbHJlYWR5IGJyb2tlbgorICBzZWN1cml0eSB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMuICBVbmxpa2UgUm9iZXJ0c29uIGV0IGFsLCB3ZQorICBhbHdheXMgZHluYW1pY2FsbHkgY2hlY2sgYWRkcmVzc2VzIG9mIGFsbCBvZmZzZXQgY2h1bmtzIChwcmV2aW91cywKKyAgbmV4dCwgZXRjKS4gVGhpcyB0dXJucyBvdXQgdG8gYmUgY2hlYXBlciB0aGFuIHJlbHlpbmcgb24gaGFzaGVzLgorKi8KKworI2lmICFJTlNFQ1VSRQorLyogQ2hlY2sgaWYgYWRkcmVzcyBhIGlzIGF0IGxlYXN0IGFzIGhpZ2ggYXMgYW55IGZyb20gTU9SRUNPUkUgb3IgTU1BUCAqLworI2RlZmluZSBva19hZGRyZXNzKE0sIGEpICgoY2hhciopKGEpID49IChNKS0+bGVhc3RfYWRkcikKKy8qIENoZWNrIGlmIGFkZHJlc3Mgb2YgbmV4dCBjaHVuayBuIGlzIGhpZ2hlciB0aGFuIGJhc2UgY2h1bmsgcCAqLworI2RlZmluZSBva19uZXh0KHAsIG4pICAgICgoY2hhciopKHApIDwgKGNoYXIqKShuKSkKKy8qIENoZWNrIGlmIHAgaGFzIGl0cyBjaW51c2UgYml0IG9uICovCisjZGVmaW5lIG9rX2NpbnVzZShwKSAgICAgY2ludXNlKHApCisvKiBDaGVjayBpZiBwIGhhcyBpdHMgcGludXNlIGJpdCBvbiAqLworI2RlZmluZSBva19waW51c2UocCkgICAgIHBpbnVzZShwKQorCisjZWxzZSAvKiAhSU5TRUNVUkUgKi8KKyNkZWZpbmUgb2tfYWRkcmVzcyhNLCBhKSAoMSkKKyNkZWZpbmUgb2tfbmV4dChiLCBuKSAgICAoMSkKKyNkZWZpbmUgb2tfY2ludXNlKHApICAgICAoMSkKKyNkZWZpbmUgb2tfcGludXNlKHApICAgICAoMSkKKyNlbmRpZiAvKiAhSU5TRUNVUkUgKi8KKworI2lmIChGT09URVJTICYmICFJTlNFQ1VSRSkKKy8qIENoZWNrIGlmIChhbGxlZ2VkKSBtc3RhdGUgbSBoYXMgZXhwZWN0ZWQgbWFnaWMgZmllbGQgKi8KKyNkZWZpbmUgb2tfbWFnaWMoTSkgICAgICAoKE0pLT5tYWdpYyA9PSBtcGFyYW1zLm1hZ2ljKQorI2Vsc2UgIC8qIChGT09URVJTICYmICFJTlNFQ1VSRSkgKi8KKyNkZWZpbmUgb2tfbWFnaWMoTSkgICAgICAoMSkKKyNlbmRpZiAvKiAoRk9PVEVSUyAmJiAhSU5TRUNVUkUpICovCisKKworLyogSW4gZ2NjLCB1c2UgX19idWlsdGluX2V4cGVjdCB0byBtaW5pbWl6ZSBpbXBhY3Qgb2YgY2hlY2tzICovCisjaWYgIUlOU0VDVVJFCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMworI2RlZmluZSBSVENIRUNLKGUpICBfX2J1aWx0aW5fZXhwZWN0KGUsIDEpCisjZWxzZSAvKiBHTlVDICovCisjZGVmaW5lIFJUQ0hFQ0soZSkgIChlKQorI2VuZGlmIC8qIEdOVUMgKi8KKyNlbHNlIC8qICFJTlNFQ1VSRSAqLworI2RlZmluZSBSVENIRUNLKGUpICAoMSkKKyNlbmRpZiAvKiAhSU5TRUNVUkUgKi8KKworLyogbWFjcm9zIHRvIHNldCB1cCBpbnVzZSBjaHVua3Mgd2l0aCBvciB3aXRob3V0IGZvb3RlcnMgKi8KKworI2lmICFGT09URVJTCisKKyNkZWZpbmUgbWFya19pbnVzZV9mb290KE0scCxzKQorCisvKiBTZXQgY2ludXNlIGJpdCBhbmQgcGludXNlIGJpdCBvZiBuZXh0IGNodW5rICovCisjZGVmaW5lIHNldF9pbnVzZShNLHAscylcCisgICgocCktPmhlYWQgPSAoKChwKS0+aGVhZCAmIFBJTlVTRV9CSVQpfHN8Q0lOVVNFX0JJVCksXAorICAoKG1jaHVua3B0cikoKChjaGFyKikocCkpICsgKHMpKSktPmhlYWQgfD0gUElOVVNFX0JJVCkKKworLyogU2V0IGNpbnVzZSBhbmQgcGludXNlIG9mIHRoaXMgY2h1bmsgYW5kIHBpbnVzZSBvZiBuZXh0IGNodW5rICovCisjZGVmaW5lIHNldF9pbnVzZV9hbmRfcGludXNlKE0scCxzKVwKKyAgKChwKS0+aGVhZCA9IChzfFBJTlVTRV9CSVR8Q0lOVVNFX0JJVCksXAorICAoKG1jaHVua3B0cikoKChjaGFyKikocCkpICsgKHMpKSktPmhlYWQgfD0gUElOVVNFX0JJVCkKKworLyogU2V0IHNpemUsIGNpbnVzZSBhbmQgcGludXNlIGJpdCBvZiB0aGlzIGNodW5rICovCisjZGVmaW5lIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsoTSwgcCwgcylcCisgICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUfENJTlVTRV9CSVQpKQorCisjZWxzZSAvKiBGT09URVJTICovCisKKy8qIFNldCBmb290IG9mIGludXNlIGNodW5rIHRvIGJlIHhvciBvZiBtc3RhdGUgYW5kIHNlZWQgKi8KKyNkZWZpbmUgbWFya19pbnVzZV9mb290KE0scCxzKVwKKyAgKCgobWNodW5rcHRyKSgoY2hhciopKHApICsgKHMpKSktPnByZXZfZm9vdCA9ICgoc2l6ZV90KShNKSBeIG1wYXJhbXMubWFnaWMpKQorCisjZGVmaW5lIGdldF9tc3RhdGVfZm9yKHApXAorICAoKG1zdGF0ZSkoKChtY2h1bmtwdHIpKChjaGFyKikocCkgK1wKKyAgICAoY2h1bmtzaXplKHApKSkpLT5wcmV2X2Zvb3QgXiBtcGFyYW1zLm1hZ2ljKSkKKworI2RlZmluZSBzZXRfaW51c2UoTSxwLHMpXAorICAoKHApLT5oZWFkID0gKCgocCktPmhlYWQgJiBQSU5VU0VfQklUKXxzfENJTlVTRV9CSVQpLFwKKyAgKCgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgKyAocykpKS0+aGVhZCB8PSBQSU5VU0VfQklUKSwgXAorICBtYXJrX2ludXNlX2Zvb3QoTSxwLHMpKQorCisjZGVmaW5lIHNldF9pbnVzZV9hbmRfcGludXNlKE0scCxzKVwKKyAgKChwKS0+aGVhZCA9IChzfFBJTlVTRV9CSVR8Q0lOVVNFX0JJVCksXAorICAoKChtY2h1bmtwdHIpKCgoY2hhciopKHApKSArIChzKSkpLT5oZWFkIHw9IFBJTlVTRV9CSVQpLFwKKyBtYXJrX2ludXNlX2Zvb3QoTSxwLHMpKQorCisjZGVmaW5lIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsoTSwgcCwgcylcCisgICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUfENJTlVTRV9CSVQpLFwKKyAgbWFya19pbnVzZV9mb290KE0sIHAsIHMpKQorCisjZW5kaWYgLyogIUZPT1RFUlMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXR0aW5nIG1wYXJhbXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogSW5pdGlhbGl6ZSBtcGFyYW1zICovCitzdGF0aWMgaW50IGluaXRfbXBhcmFtcyh2b2lkKSB7CisgIGlmIChtcGFyYW1zLnBhZ2Vfc2l6ZSA9PSAwKSB7CisgICAgc2l6ZV90IHM7CisKKyAgICBtcGFyYW1zLm1tYXBfdGhyZXNob2xkID0gREVGQVVMVF9NTUFQX1RIUkVTSE9MRDsKKyAgICBtcGFyYW1zLnRyaW1fdGhyZXNob2xkID0gREVGQVVMVF9UUklNX1RIUkVTSE9MRDsKKyNpZiBNT1JFQ09SRV9DT05USUdVT1VTCisgICAgbXBhcmFtcy5kZWZhdWx0X21mbGFncyA9IFVTRV9MT0NLX0JJVHxVU0VfTU1BUF9CSVQ7CisjZWxzZSAgLyogTU9SRUNPUkVfQ09OVElHVU9VUyAqLworICAgIG1wYXJhbXMuZGVmYXVsdF9tZmxhZ3MgPSBVU0VfTE9DS19CSVR8VVNFX01NQVBfQklUfFVTRV9OT05DT05USUdVT1VTX0JJVDsKKyNlbmRpZiAvKiBNT1JFQ09SRV9DT05USUdVT1VTICovCisKKyNpZiAoRk9PVEVSUyAmJiAhSU5TRUNVUkUpCisgICAgeworI2lmIFVTRV9ERVZfUkFORE9NCisgICAgICBpbnQgZmQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZltzaXplb2Yoc2l6ZV90KV07CisgICAgICAvKiBUcnkgdG8gdXNlIC9kZXYvdXJhbmRvbSwgZWxzZSBmYWxsIGJhY2sgb24gdXNpbmcgdGltZSAqLworICAgICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKSkgPj0gMCAmJgorICAgICAgICAgIHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID09IHNpemVvZihidWYpKSB7CisgICAgICAgIHMgPSAqKChzaXplX3QgKikgYnVmKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmIC8qIFVTRV9ERVZfUkFORE9NICovCisgICAgICAgIHMgPSAoc2l6ZV90KSh0aW1lKDApIF4gKHNpemVfdCkweDU1NTU1NTU1VSk7CisKKyAgICAgIHMgfD0gKHNpemVfdCk4VTsgICAgLyogZW5zdXJlIG5vbnplcm8gKi8KKyAgICAgIHMgJj0gfihzaXplX3QpN1U7ICAgLyogaW1wcm92ZSBjaGFuY2VzIG9mIGZhdWx0IGZvciBiYWQgdmFsdWVzICovCisKKyAgICB9CisjZWxzZSAvKiAoRk9PVEVSUyAmJiAhSU5TRUNVUkUpICovCisgICAgcyA9IChzaXplX3QpMHg1ODU4NTg1OFU7CisjZW5kaWYgLyogKEZPT1RFUlMgJiYgIUlOU0VDVVJFKSAqLworICAgIEFDUVVJUkVfTUFHSUNfSU5JVF9MT0NLKCk7CisgICAgaWYgKG1wYXJhbXMubWFnaWMgPT0gMCkgeworICAgICAgbXBhcmFtcy5tYWdpYyA9IHM7CisgICAgICAvKiBTZXQgdXAgbG9jayBmb3IgbWFpbiBtYWxsb2MgYXJlYSAqLworICAgICAgSU5JVElBTF9MT0NLKCZnbS0+bXV0ZXgpOworICAgICAgZ20tPm1mbGFncyA9IG1wYXJhbXMuZGVmYXVsdF9tZmxhZ3M7CisgICAgfQorICAgIFJFTEVBU0VfTUFHSUNfSU5JVF9MT0NLKCk7CisKKyNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19PUzJfXykKKyAgICBtcGFyYW1zLnBhZ2Vfc2l6ZSA9IG1hbGxvY19nZXRwYWdlc2l6ZTsKKyAgICBtcGFyYW1zLmdyYW51bGFyaXR5ID0gKChERUZBVUxUX0dSQU5VTEFSSVRZICE9IDApPworICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9HUkFOVUxBUklUWSA6IG1wYXJhbXMucGFnZV9zaXplKTsKKyNlbGlmIGRlZmluZWQgKF9fT1MyX18pCisgLyogaWYgbG93LW1lbW9yeSBpcyB1c2VkLCBvczJtdW5tYXAoKSB3b3VsZCBicmVhaworICAgIGlmIGl0IHdlcmUgYW55dGhpbmcgb3RoZXIgdGhhbiA2NGsgKi8KKyAgICBtcGFyYW1zLnBhZ2Vfc2l6ZSA9IDQwOTZ1OworICAgIG1wYXJhbXMuZ3JhbnVsYXJpdHkgPSA2NTUzNnU7CisjZWxzZSAvKiBXSU4zMiAqLworICAgIHsKKyAgICAgIFNZU1RFTV9JTkZPIHN5c3RlbV9pbmZvOworICAgICAgR2V0U3lzdGVtSW5mbygmc3lzdGVtX2luZm8pOworICAgICAgbXBhcmFtcy5wYWdlX3NpemUgPSBzeXN0ZW1faW5mby5kd1BhZ2VTaXplOworICAgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9IHN5c3RlbV9pbmZvLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5OworICAgIH0KKyNlbmRpZiAvKiBXSU4zMiAqLworCisgICAgLyogU2FuaXR5LWNoZWNrIGNvbmZpZ3VyYXRpb246CisgICAgICAgc2l6ZV90IG11c3QgYmUgdW5zaWduZWQgYW5kIGFzIHdpZGUgYXMgcG9pbnRlciB0eXBlLgorICAgICAgIGludHMgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzLgorICAgICAgIGFsaWdubWVudCBtdXN0IGJlIGF0IGxlYXN0IDguCisgICAgICAgQWxpZ25tZW50LCBtaW4gY2h1bmsgc2l6ZSwgYW5kIHBhZ2Ugc2l6ZSBtdXN0IGFsbCBiZSBwb3dlcnMgb2YgMi4KKyAgICAqLworICAgIGlmICgoc2l6ZW9mKHNpemVfdCkgIT0gc2l6ZW9mKGNoYXIqKSkgfHwKKyAgICAgICAgKE1BWF9TSVpFX1QgPCBNSU5fQ0hVTktfU0laRSkgIHx8CisgICAgICAgIChzaXplb2YoaW50KSA8IDQpICB8fAorICAgICAgICAoTUFMTE9DX0FMSUdOTUVOVCA8IChzaXplX3QpOFUpIHx8CisgICAgICAgICgoTUFMTE9DX0FMSUdOTUVOVCAgICAmIChNQUxMT0NfQUxJR05NRU5ULVNJWkVfVF9PTkUpKSAgICAhPSAwKSB8fAorICAgICAgICAoKE1DSFVOS19TSVpFICAgICAgICAgJiAoTUNIVU5LX1NJWkUtU0laRV9UX09ORSkpICAgICAgICAgIT0gMCkgfHwKKyAgICAgICAgKChtcGFyYW1zLmdyYW51bGFyaXR5ICYgKG1wYXJhbXMuZ3JhbnVsYXJpdHktU0laRV9UX09ORSkpICE9IDApIHx8CisgICAgICAgICgobXBhcmFtcy5wYWdlX3NpemUgICAmIChtcGFyYW1zLnBhZ2Vfc2l6ZS1TSVpFX1RfT05FKSkgICAhPSAwKSkKKyAgICAgIEFCT1JUOworICB9CisgIHJldHVybiAwOworfQorCisvKiBzdXBwb3J0IGZvciBtYWxsb3B0ICovCitzdGF0aWMgaW50IGNoYW5nZV9tcGFyYW0oaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7CisgIHNpemVfdCB2YWwgPSAoc2l6ZV90KXZhbHVlOworICBpbml0X21wYXJhbXMoKTsKKyAgc3dpdGNoKHBhcmFtX251bWJlcikgeworICBjYXNlIE1fVFJJTV9USFJFU0hPTEQ6CisgICAgbXBhcmFtcy50cmltX3RocmVzaG9sZCA9IHZhbDsKKyAgICByZXR1cm4gMTsKKyAgY2FzZSBNX0dSQU5VTEFSSVRZOgorICAgIGlmICh2YWwgPj0gbXBhcmFtcy5wYWdlX3NpemUgJiYgKCh2YWwgJiAodmFsLTEpKSA9PSAwKSkgeworICAgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9IHZhbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgY2FzZSBNX01NQVBfVEhSRVNIT0xEOgorICAgIG1wYXJhbXMubW1hcF90aHJlc2hvbGQgPSB2YWw7CisgICAgcmV0dXJuIDE7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2lmIERFQlVHCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlYnVnZ2luZyBTdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGFueSBjaHVuaywgd2hldGhlciBmcmVlLCBpbnVzZSwgbW1hcHBlZCBldGMgICovCitzdGF0aWMgdm9pZCBkb19jaGVja19hbnlfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7CisgIGFzc2VydCgoaXNfYWxpZ25lZChjaHVuazJtZW0ocCkpKSB8fCAocC0+aGVhZCA9PSBGRU5DRVBPU1RfSEVBRCkpOworICBhc3NlcnQob2tfYWRkcmVzcyhtLCBwKSk7Cit9CisKKy8qIENoZWNrIHByb3BlcnRpZXMgb2YgdG9wIGNodW5rICovCitzdGF0aWMgdm9pZCBkb19jaGVja190b3BfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7CisgIG1zZWdtZW50cHRyIHNwID0gc2VnbWVudF9ob2xkaW5nKG0sIChjaGFyKilwKTsKKyAgc2l6ZV90ICBzeiA9IGNodW5rc2l6ZShwKTsKKyAgYXNzZXJ0KHNwICE9IDApOworICBhc3NlcnQoKGlzX2FsaWduZWQoY2h1bmsybWVtKHApKSkgfHwgKHAtPmhlYWQgPT0gRkVOQ0VQT1NUX0hFQUQpKTsKKyAgYXNzZXJ0KG9rX2FkZHJlc3MobSwgcCkpOworICBhc3NlcnQoc3ogPT0gbS0+dG9wc2l6ZSk7CisgIGFzc2VydChzeiA+IDApOworICBhc3NlcnQoc3ogPT0gKChzcC0+YmFzZSArIHNwLT5zaXplKSAtIChjaGFyKilwKSAtIFRPUF9GT09UX1NJWkUpOworICBhc3NlcnQocGludXNlKHApKTsKKyAgYXNzZXJ0KCFuZXh0X3BpbnVzZShwKSk7Cit9CisKKy8qIENoZWNrIHByb3BlcnRpZXMgb2YgKGludXNlKSBtbWFwcGVkIGNodW5rcyAqLworc3RhdGljIHZvaWQgZG9fY2hlY2tfbW1hcHBlZF9jaHVuayhtc3RhdGUgbSwgbWNodW5rcHRyIHApIHsKKyAgc2l6ZV90ICBzeiA9IGNodW5rc2l6ZShwKTsKKyAgc2l6ZV90IGxlbiA9IChzeiArIChwLT5wcmV2X2Zvb3QgJiB+SVNfTU1BUFBFRF9CSVQpICsgTU1BUF9GT09UX1BBRCk7CisgIGFzc2VydChpc19tbWFwcGVkKHApKTsKKyAgYXNzZXJ0KHVzZV9tbWFwKG0pKTsKKyAgYXNzZXJ0KChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpIHx8IChwLT5oZWFkID09IEZFTkNFUE9TVF9IRUFEKSk7CisgIGFzc2VydChva19hZGRyZXNzKG0sIHApKTsKKyAgYXNzZXJ0KCFpc19zbWFsbChzeikpOworICBhc3NlcnQoKGxlbiAmIChtcGFyYW1zLnBhZ2Vfc2l6ZS1TSVpFX1RfT05FKSkgPT0gMCk7CisgIGFzc2VydChjaHVua19wbHVzX29mZnNldChwLCBzeiktPmhlYWQgPT0gRkVOQ0VQT1NUX0hFQUQpOworICBhc3NlcnQoY2h1bmtfcGx1c19vZmZzZXQocCwgc3orU0laRV9UX1NJWkUpLT5oZWFkID09IDApOworfQorCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGludXNlIGNodW5rcyAqLworc3RhdGljIHZvaWQgZG9fY2hlY2tfaW51c2VfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7CisgIGRvX2NoZWNrX2FueV9jaHVuayhtLCBwKTsKKyAgYXNzZXJ0KGNpbnVzZShwKSk7CisgIGFzc2VydChuZXh0X3BpbnVzZShwKSk7CisgIC8qIElmIG5vdCBwaW51c2UgYW5kIG5vdCBtbWFwcGVkLCBwcmV2aW91cyBjaHVuayBoYXMgT0sgb2Zmc2V0ICovCisgIGFzc2VydChpc19tbWFwcGVkKHApIHx8IHBpbnVzZShwKSB8fCBuZXh0X2NodW5rKHByZXZfY2h1bmsocCkpID09IHApOworICBpZiAoaXNfbW1hcHBlZChwKSkKKyAgICBkb19jaGVja19tbWFwcGVkX2NodW5rKG0sIHApOworfQorCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGZyZWUgY2h1bmtzICovCitzdGF0aWMgdm9pZCBkb19jaGVja19mcmVlX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCkgeworICBzaXplX3Qgc3ogPSBwLT5oZWFkICYgfihQSU5VU0VfQklUfENJTlVTRV9CSVQpOworICBtY2h1bmtwdHIgbmV4dCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIHN6KTsKKyAgZG9fY2hlY2tfYW55X2NodW5rKG0sIHApOworICBhc3NlcnQoIWNpbnVzZShwKSk7CisgIGFzc2VydCghbmV4dF9waW51c2UocCkpOworICBhc3NlcnQgKCFpc19tbWFwcGVkKHApKTsKKyAgaWYgKHAgIT0gbS0+ZHYgJiYgcCAhPSBtLT50b3ApIHsKKyAgICBpZiAoc3ogPj0gTUlOX0NIVU5LX1NJWkUpIHsKKyAgICAgIGFzc2VydCgoc3ogJiBDSFVOS19BTElHTl9NQVNLKSA9PSAwKTsKKyAgICAgIGFzc2VydChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpOworICAgICAgYXNzZXJ0KG5leHQtPnByZXZfZm9vdCA9PSBzeik7CisgICAgICBhc3NlcnQocGludXNlKHApKTsKKyAgICAgIGFzc2VydCAobmV4dCA9PSBtLT50b3AgfHwgY2ludXNlKG5leHQpKTsKKyAgICAgIGFzc2VydChwLT5mZC0+YmsgPT0gcCk7CisgICAgICBhc3NlcnQocC0+YmstPmZkID09IHApOworICAgIH0KKyAgICBlbHNlICAvKiBtYXJrZXJzIGFyZSBhbHdheXMgb2Ygc2l6ZSBTSVpFX1RfU0laRSAqLworICAgICAgYXNzZXJ0KHN6ID09IFNJWkVfVF9TSVpFKTsKKyAgfQorfQorCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIG1hbGxvY2VkIGNodW5rcyBhdCB0aGUgcG9pbnQgdGhleSBhcmUgbWFsbG9jZWQgKi8KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX21hbGxvY2VkX2NodW5rKG1zdGF0ZSBtLCB2b2lkKiBtZW0sIHNpemVfdCBzKSB7CisgIGlmIChtZW0gIT0gMCkgeworICAgIG1jaHVua3B0ciBwID0gbWVtMmNodW5rKG1lbSk7CisgICAgc2l6ZV90IHN6ID0gcC0+aGVhZCAmIH4oUElOVVNFX0JJVHxDSU5VU0VfQklUKTsKKyAgICBkb19jaGVja19pbnVzZV9jaHVuayhtLCBwKTsKKyAgICBhc3NlcnQoKHN6ICYgQ0hVTktfQUxJR05fTUFTSykgPT0gMCk7CisgICAgYXNzZXJ0KHN6ID49IE1JTl9DSFVOS19TSVpFKTsKKyAgICBhc3NlcnQoc3ogPj0gcyk7CisgICAgLyogdW5sZXNzIG1tYXBwZWQsIHNpemUgaXMgbGVzcyB0aGFuIE1JTl9DSFVOS19TSVpFIG1vcmUgdGhhbiByZXF1ZXN0ICovCisgICAgYXNzZXJ0KGlzX21tYXBwZWQocCkgfHwgc3ogPCAocyArIE1JTl9DSFVOS19TSVpFKSk7CisgIH0KK30KKworLyogQ2hlY2sgYSB0cmVlIGFuZCBpdHMgc3VidHJlZXMuICAqLworc3RhdGljIHZvaWQgZG9fY2hlY2tfdHJlZShtc3RhdGUgbSwgdGNodW5rcHRyIHQpIHsKKyAgdGNodW5rcHRyIGhlYWQgPSAwOworICB0Y2h1bmtwdHIgdSA9IHQ7CisgIGJpbmRleF90IHRpbmRleCA9IHQtPmluZGV4OworICBzaXplX3QgdHNpemUgPSBjaHVua3NpemUodCk7CisgIGJpbmRleF90IGlkeDsKKyAgY29tcHV0ZV90cmVlX2luZGV4KHRzaXplLCBpZHgpOworICBhc3NlcnQodGluZGV4ID09IGlkeCk7CisgIGFzc2VydCh0c2l6ZSA+PSBNSU5fTEFSR0VfU0laRSk7CisgIGFzc2VydCh0c2l6ZSA+PSBtaW5zaXplX2Zvcl90cmVlX2luZGV4KGlkeCkpOworICBhc3NlcnQoKGlkeCA9PSBOVFJFRUJJTlMtMSkgfHwgKHRzaXplIDwgbWluc2l6ZV9mb3JfdHJlZV9pbmRleCgoaWR4KzEpKSkpOworCisgIGRvIHsgLyogdHJhdmVyc2UgdGhyb3VnaCBjaGFpbiBvZiBzYW1lLXNpemVkIG5vZGVzICovCisgICAgZG9fY2hlY2tfYW55X2NodW5rKG0sICgobWNodW5rcHRyKXUpKTsKKyAgICBhc3NlcnQodS0+aW5kZXggPT0gdGluZGV4KTsKKyAgICBhc3NlcnQoY2h1bmtzaXplKHUpID09IHRzaXplKTsKKyAgICBhc3NlcnQoIWNpbnVzZSh1KSk7CisgICAgYXNzZXJ0KCFuZXh0X3BpbnVzZSh1KSk7CisgICAgYXNzZXJ0KHUtPmZkLT5iayA9PSB1KTsKKyAgICBhc3NlcnQodS0+YmstPmZkID09IHUpOworICAgIGlmICh1LT5wYXJlbnQgPT0gMCkgeworICAgICAgYXNzZXJ0KHUtPmNoaWxkWzBdID09IDApOworICAgICAgYXNzZXJ0KHUtPmNoaWxkWzFdID09IDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGFzc2VydChoZWFkID09IDApOyAvKiBvbmx5IG9uZSBub2RlIG9uIGNoYWluIGhhcyBwYXJlbnQgKi8KKyAgICAgIGhlYWQgPSB1OworICAgICAgYXNzZXJ0KHUtPnBhcmVudCAhPSB1KTsKKyAgICAgIGFzc2VydCAodS0+cGFyZW50LT5jaGlsZFswXSA9PSB1IHx8CisgICAgICAgICAgICAgIHUtPnBhcmVudC0+Y2hpbGRbMV0gPT0gdSB8fAorICAgICAgICAgICAgICAqKCh0YmlucHRyKikodS0+cGFyZW50KSkgPT0gdSk7CisgICAgICBpZiAodS0+Y2hpbGRbMF0gIT0gMCkgeworICAgICAgICBhc3NlcnQodS0+Y2hpbGRbMF0tPnBhcmVudCA9PSB1KTsKKyAgICAgICAgYXNzZXJ0KHUtPmNoaWxkWzBdICE9IHUpOworICAgICAgICBkb19jaGVja190cmVlKG0sIHUtPmNoaWxkWzBdKTsKKyAgICAgIH0KKyAgICAgIGlmICh1LT5jaGlsZFsxXSAhPSAwKSB7CisgICAgICAgIGFzc2VydCh1LT5jaGlsZFsxXS0+cGFyZW50ID09IHUpOworICAgICAgICBhc3NlcnQodS0+Y2hpbGRbMV0gIT0gdSk7CisgICAgICAgIGRvX2NoZWNrX3RyZWUobSwgdS0+Y2hpbGRbMV0pOworICAgICAgfQorICAgICAgaWYgKHUtPmNoaWxkWzBdICE9IDAgJiYgdS0+Y2hpbGRbMV0gIT0gMCkgeworICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHUtPmNoaWxkWzBdKSA8IGNodW5rc2l6ZSh1LT5jaGlsZFsxXSkpOworICAgICAgfQorICAgIH0KKyAgICB1ID0gdS0+ZmQ7CisgIH0gd2hpbGUgKHUgIT0gdCk7CisgIGFzc2VydChoZWFkICE9IDApOworfQorCisvKiAgQ2hlY2sgYWxsIHRoZSBjaHVua3MgaW4gYSB0cmVlYmluLiAgKi8KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX3RyZWViaW4obXN0YXRlIG0sIGJpbmRleF90IGkpIHsKKyAgdGJpbnB0ciogdGIgPSB0cmVlYmluX2F0KG0sIGkpOworICB0Y2h1bmtwdHIgdCA9ICp0YjsKKyAgaW50IGVtcHR5ID0gKG0tPnRyZWVtYXAgJiAoMVUgPDwgaSkpID09IDA7CisgIGlmICh0ID09IDApCisgICAgYXNzZXJ0KGVtcHR5KTsKKyAgaWYgKCFlbXB0eSkKKyAgICBkb19jaGVja190cmVlKG0sIHQpOworfQorCisvKiAgQ2hlY2sgYWxsIHRoZSBjaHVua3MgaW4gYSBzbWFsbGJpbi4gICovCitzdGF0aWMgdm9pZCBkb19jaGVja19zbWFsbGJpbihtc3RhdGUgbSwgYmluZGV4X3QgaSkgeworICBzYmlucHRyIGIgPSBzbWFsbGJpbl9hdChtLCBpKTsKKyAgbWNodW5rcHRyIHAgPSBiLT5iazsKKyAgdW5zaWduZWQgaW50IGVtcHR5ID0gKG0tPnNtYWxsbWFwICYgKDFVIDw8IGkpKSA9PSAwOworICBpZiAocCA9PSBiKQorICAgIGFzc2VydChlbXB0eSk7CisgIGlmICghZW1wdHkpIHsKKyAgICBmb3IgKDsgcCAhPSBiOyBwID0gcC0+YmspIHsKKyAgICAgIHNpemVfdCBzaXplID0gY2h1bmtzaXplKHApOworICAgICAgbWNodW5rcHRyIHE7CisgICAgICAvKiBlYWNoIGNodW5rIGNsYWltcyB0byBiZSBmcmVlICovCisgICAgICBkb19jaGVja19mcmVlX2NodW5rKG0sIHApOworICAgICAgLyogY2h1bmsgYmVsb25ncyBpbiBiaW4gKi8KKyAgICAgIGFzc2VydChzbWFsbF9pbmRleChzaXplKSA9PSBpKTsKKyAgICAgIGFzc2VydChwLT5iayA9PSBiIHx8IGNodW5rc2l6ZShwLT5iaykgPT0gY2h1bmtzaXplKHApKTsKKyAgICAgIC8qIGNodW5rIGlzIGZvbGxvd2VkIGJ5IGFuIGludXNlIGNodW5rICovCisgICAgICBxID0gbmV4dF9jaHVuayhwKTsKKyAgICAgIGlmIChxLT5oZWFkICE9IEZFTkNFUE9TVF9IRUFEKQorICAgICAgICBkb19jaGVja19pbnVzZV9jaHVuayhtLCBxKTsKKyAgICB9CisgIH0KK30KKworLyogRmluZCB4IGluIGEgYmluLiBVc2VkIGluIG90aGVyIGNoZWNrIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyBpbnQgYmluX2ZpbmQobXN0YXRlIG0sIG1jaHVua3B0ciB4KSB7CisgIHNpemVfdCBzaXplID0gY2h1bmtzaXplKHgpOworICBpZiAoaXNfc21hbGwoc2l6ZSkpIHsKKyAgICBiaW5kZXhfdCBzaWR4ID0gc21hbGxfaW5kZXgoc2l6ZSk7CisgICAgc2JpbnB0ciBiID0gc21hbGxiaW5fYXQobSwgc2lkeCk7CisgICAgaWYgKHNtYWxsbWFwX2lzX21hcmtlZChtLCBzaWR4KSkgeworICAgICAgbWNodW5rcHRyIHAgPSBiOworICAgICAgZG8geworICAgICAgICBpZiAocCA9PSB4KQorICAgICAgICAgIHJldHVybiAxOworICAgICAgfSB3aGlsZSAoKHAgPSBwLT5mZCkgIT0gYik7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGJpbmRleF90IHRpZHg7CisgICAgY29tcHV0ZV90cmVlX2luZGV4KHNpemUsIHRpZHgpOworICAgIGlmICh0cmVlbWFwX2lzX21hcmtlZChtLCB0aWR4KSkgeworICAgICAgdGNodW5rcHRyIHQgPSAqdHJlZWJpbl9hdChtLCB0aWR4KTsKKyAgICAgIHNpemVfdCBzaXplYml0cyA9IHNpemUgPDwgbGVmdHNoaWZ0X2Zvcl90cmVlX2luZGV4KHRpZHgpOworICAgICAgd2hpbGUgKHQgIT0gMCAmJiBjaHVua3NpemUodCkgIT0gc2l6ZSkgeworICAgICAgICB0ID0gdC0+Y2hpbGRbKHNpemViaXRzID4+IChTSVpFX1RfQklUU0laRS1TSVpFX1RfT05FKSkgJiAxXTsKKyAgICAgICAgc2l6ZWJpdHMgPDw9IDE7CisgICAgICB9CisgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHRjaHVua3B0ciB1ID0gdDsKKyAgICAgICAgZG8geworICAgICAgICAgIGlmICh1ID09ICh0Y2h1bmtwdHIpeCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IHdoaWxlICgodSA9IHUtPmZkKSAhPSB0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRyYXZlcnNlIGVhY2ggY2h1bmsgYW5kIGNoZWNrIGl0OyByZXR1cm4gdG90YWwgKi8KK3N0YXRpYyBzaXplX3QgdHJhdmVyc2VfYW5kX2NoZWNrKG1zdGF0ZSBtKSB7CisgIHNpemVfdCBzdW0gPSAwOworICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKKyAgICBtc2VnbWVudHB0ciBzID0gJm0tPnNlZzsKKyAgICBzdW0gKz0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkU7CisgICAgd2hpbGUgKHMgIT0gMCkgeworICAgICAgbWNodW5rcHRyIHEgPSBhbGlnbl9hc19jaHVuayhzLT5iYXNlKTsKKyAgICAgIG1jaHVua3B0ciBsYXN0cSA9IDA7CisgICAgICBhc3NlcnQocGludXNlKHEpKTsKKyAgICAgIHdoaWxlIChzZWdtZW50X2hvbGRzKHMsIHEpICYmCisgICAgICAgICAgICAgcSAhPSBtLT50b3AgJiYgcS0+aGVhZCAhPSBGRU5DRVBPU1RfSEVBRCkgeworICAgICAgICBzdW0gKz0gY2h1bmtzaXplKHEpOworICAgICAgICBpZiAoY2ludXNlKHEpKSB7CisgICAgICAgICAgYXNzZXJ0KCFiaW5fZmluZChtLCBxKSk7CisgICAgICAgICAgZG9fY2hlY2tfaW51c2VfY2h1bmsobSwgcSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgYXNzZXJ0KHEgPT0gbS0+ZHYgfHwgYmluX2ZpbmQobSwgcSkpOworICAgICAgICAgIGFzc2VydChsYXN0cSA9PSAwIHx8IGNpbnVzZShsYXN0cSkpOyAvKiBOb3QgMiBjb25zZWN1dGl2ZSBmcmVlICovCisgICAgICAgICAgZG9fY2hlY2tfZnJlZV9jaHVuayhtLCBxKTsKKyAgICAgICAgfQorICAgICAgICBsYXN0cSA9IHE7CisgICAgICAgIHEgPSBuZXh0X2NodW5rKHEpOworICAgICAgfQorICAgICAgcyA9IHMtPm5leHQ7CisgICAgfQorICB9CisgIHJldHVybiBzdW07Cit9CisKKy8qIENoZWNrIGFsbCBwcm9wZXJ0aWVzIG9mIG1hbGxvY19zdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX21hbGxvY19zdGF0ZShtc3RhdGUgbSkgeworICBiaW5kZXhfdCBpOworICBzaXplX3QgdG90YWw7CisgIC8qIGNoZWNrIGJpbnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5TTUFMTEJJTlM7ICsraSkKKyAgICBkb19jaGVja19zbWFsbGJpbihtLCBpKTsKKyAgZm9yIChpID0gMDsgaSA8IE5UUkVFQklOUzsgKytpKQorICAgIGRvX2NoZWNrX3RyZWViaW4obSwgaSk7CisKKyAgaWYgKG0tPmR2c2l6ZSAhPSAwKSB7IC8qIGNoZWNrIGR2IGNodW5rICovCisgICAgZG9fY2hlY2tfYW55X2NodW5rKG0sIG0tPmR2KTsKKyAgICBhc3NlcnQobS0+ZHZzaXplID09IGNodW5rc2l6ZShtLT5kdikpOworICAgIGFzc2VydChtLT5kdnNpemUgPj0gTUlOX0NIVU5LX1NJWkUpOworICAgIGFzc2VydChiaW5fZmluZChtLCBtLT5kdikgPT0gMCk7CisgIH0KKworICBpZiAobS0+dG9wICE9IDApIHsgICAvKiBjaGVjayB0b3AgY2h1bmsgKi8KKyAgICBkb19jaGVja190b3BfY2h1bmsobSwgbS0+dG9wKTsKKyAgICBhc3NlcnQobS0+dG9wc2l6ZSA9PSBjaHVua3NpemUobS0+dG9wKSk7CisgICAgYXNzZXJ0KG0tPnRvcHNpemUgPiAwKTsKKyAgICBhc3NlcnQoYmluX2ZpbmQobSwgbS0+dG9wKSA9PSAwKTsKKyAgfQorCisgIHRvdGFsID0gdHJhdmVyc2VfYW5kX2NoZWNrKG0pOworICBhc3NlcnQodG90YWwgPD0gbS0+Zm9vdHByaW50KTsKKyAgYXNzZXJ0KG0tPmZvb3RwcmludCA8PSBtLT5tYXhfZm9vdHByaW50KTsKK30KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0aXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgIU5PX01BTExJTkZPCitzdGF0aWMgc3RydWN0IG1hbGxpbmZvIGludGVybmFsX21hbGxpbmZvKG1zdGF0ZSBtKSB7CisgIHN0cnVjdCBtYWxsaW5mbyBubSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBpZiAoIVBSRUFDVElPTihtKSkgeworICAgIGNoZWNrX21hbGxvY19zdGF0ZShtKTsKKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKKyAgICAgIHNpemVfdCBuZnJlZSA9IFNJWkVfVF9PTkU7IC8qIHRvcCBhbHdheXMgZnJlZSAqLworICAgICAgc2l6ZV90IG1mcmVlID0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkU7CisgICAgICBzaXplX3Qgc3VtID0gbWZyZWU7CisgICAgICBtc2VnbWVudHB0ciBzID0gJm0tPnNlZzsKKyAgICAgIHdoaWxlIChzICE9IDApIHsKKyAgICAgICAgbWNodW5rcHRyIHEgPSBhbGlnbl9hc19jaHVuayhzLT5iYXNlKTsKKyAgICAgICAgd2hpbGUgKHNlZ21lbnRfaG9sZHMocywgcSkgJiYKKyAgICAgICAgICAgICAgIHEgIT0gbS0+dG9wICYmIHEtPmhlYWQgIT0gRkVOQ0VQT1NUX0hFQUQpIHsKKyAgICAgICAgICBzaXplX3Qgc3ogPSBjaHVua3NpemUocSk7CisgICAgICAgICAgc3VtICs9IHN6OworICAgICAgICAgIGlmICghY2ludXNlKHEpKSB7CisgICAgICAgICAgICBtZnJlZSArPSBzejsKKyAgICAgICAgICAgICsrbmZyZWU7CisgICAgICAgICAgfQorICAgICAgICAgIHEgPSBuZXh0X2NodW5rKHEpOworICAgICAgICB9CisgICAgICAgIHMgPSBzLT5uZXh0OworICAgICAgfQorCisgICAgICBubS5hcmVuYSAgICA9IHN1bTsKKyAgICAgIG5tLm9yZGJsa3MgID0gbmZyZWU7CisgICAgICBubS5oYmxraGQgICA9IG0tPmZvb3RwcmludCAtIHN1bTsKKyAgICAgIG5tLnVzbWJsa3MgID0gbS0+bWF4X2Zvb3RwcmludDsKKyAgICAgIG5tLnVvcmRibGtzID0gbS0+Zm9vdHByaW50IC0gbWZyZWU7CisgICAgICBubS5mb3JkYmxrcyA9IG1mcmVlOworICAgICAgbm0ua2VlcGNvc3QgPSBtLT50b3BzaXplOworICAgIH0KKworICAgIFBPU1RBQ1RJT04obSk7CisgIH0KKyAgcmV0dXJuIG5tOworfQorI2VuZGlmIC8qICFOT19NQUxMSU5GTyAqLworCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9tYWxsb2Nfc3RhdHMobXN0YXRlIG0pIHsKKyAgaWYgKCFQUkVBQ1RJT04obSkpIHsKKyAgICBzaXplX3QgbWF4ZnAgPSAwOworICAgIHNpemVfdCBmcCA9IDA7CisgICAgc2l6ZV90IHVzZWQgPSAwOworICAgIGNoZWNrX21hbGxvY19zdGF0ZShtKTsKKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsKKyAgICAgIG1zZWdtZW50cHRyIHMgPSAmbS0+c2VnOworICAgICAgbWF4ZnAgPSBtLT5tYXhfZm9vdHByaW50OworICAgICAgZnAgPSBtLT5mb290cHJpbnQ7CisgICAgICB1c2VkID0gZnAgLSAobS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkUpOworCisgICAgICB3aGlsZSAocyAhPSAwKSB7CisgICAgICAgIG1jaHVua3B0ciBxID0gYWxpZ25fYXNfY2h1bmsocy0+YmFzZSk7CisgICAgICAgIHdoaWxlIChzZWdtZW50X2hvbGRzKHMsIHEpICYmCisgICAgICAgICAgICAgICBxICE9IG0tPnRvcCAmJiBxLT5oZWFkICE9IEZFTkNFUE9TVF9IRUFEKSB7CisgICAgICAgICAgaWYgKCFjaW51c2UocSkpCisgICAgICAgICAgICB1c2VkIC09IGNodW5rc2l6ZShxKTsKKyAgICAgICAgICBxID0gbmV4dF9jaHVuayhxKTsKKyAgICAgICAgfQorICAgICAgICBzID0gcy0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIm1heCBzeXN0ZW0gYnl0ZXMgPSAlMTBsdVxuIiwgKHVuc2lnbmVkIGxvbmcpKG1heGZwKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJzeXN0ZW0gYnl0ZXMgICAgID0gJTEwbHVcbiIsICh1bnNpZ25lZCBsb25nKShmcCkpOworICAgIGZwcmludGYoc3RkZXJyLCAiaW4gdXNlIGJ5dGVzICAgICA9ICUxMGx1XG4iLCAodW5zaWduZWQgbG9uZykodXNlZCkpOworCisgICAgUE9TVEFDVElPTihtKTsKKyAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zIG9uIHNtYWxsYmlucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBWYXJpb3VzIGZvcm1zIG9mIGxpbmtpbmcgYW5kIHVubGlua2luZyBhcmUgZGVmaW5lZCBhcyBtYWNyb3MuICBFdmVuCisgIHRoZSBvbmVzIGZvciB0cmVlcywgd2hpY2ggYXJlIHZlcnkgbG9uZyBidXQgaGF2ZSB2ZXJ5IHNob3J0IHR5cGljYWwKKyAgcGF0aHMuICBUaGlzIGlzIHVnbHkgYnV0IHJlZHVjZXMgcmVsaWFuY2Ugb24gaW5saW5pbmcgc3VwcG9ydCBvZgorICBjb21waWxlcnMuCisqLworCisvKiBMaW5rIGEgZnJlZSBjaHVuayBpbnRvIGEgc21hbGxiaW4gICovCisjZGVmaW5lIGluc2VydF9zbWFsbF9jaHVuayhNLCBQLCBTKSB7XAorICBiaW5kZXhfdCBJICA9IHNtYWxsX2luZGV4KFMpO1wKKyAgbWNodW5rcHRyIEIgPSBzbWFsbGJpbl9hdChNLCBJKTtcCisgIG1jaHVua3B0ciBGID0gQjtcCisgIGFzc2VydChTID49IE1JTl9DSFVOS19TSVpFKTtcCisgIGlmICghc21hbGxtYXBfaXNfbWFya2VkKE0sIEkpKVwKKyAgICBtYXJrX3NtYWxsbWFwKE0sIEkpO1wKKyAgZWxzZSBpZiAoUlRDSEVDSyhva19hZGRyZXNzKE0sIEItPmZkKSkpXAorICAgIEYgPSBCLT5mZDtcCisgIGVsc2Uge1wKKyAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgIH1cCisgIEItPmZkID0gUDtcCisgIEYtPmJrID0gUDtcCisgIFAtPmZkID0gRjtcCisgIFAtPmJrID0gQjtcCit9CisKKy8qIFVubGluayBhIGNodW5rIGZyb20gYSBzbWFsbGJpbiAgKi8KKyNkZWZpbmUgdW5saW5rX3NtYWxsX2NodW5rKE0sIFAsIFMpIHtcCisgIG1jaHVua3B0ciBGID0gUC0+ZmQ7XAorICBtY2h1bmtwdHIgQiA9IFAtPmJrO1wKKyAgYmluZGV4X3QgSSA9IHNtYWxsX2luZGV4KFMpO1wKKyAgYXNzZXJ0KFAgIT0gQik7XAorICBhc3NlcnQoUCAhPSBGKTtcCisgIGFzc2VydChjaHVua3NpemUoUCkgPT0gc21hbGxfaW5kZXgyc2l6ZShJKSk7XAorICBpZiAoRiA9PSBCKVwKKyAgICBjbGVhcl9zbWFsbG1hcChNLCBJKTtcCisgIGVsc2UgaWYgKFJUQ0hFQ0soKEYgPT0gc21hbGxiaW5fYXQoTSxJKSB8fCBva19hZGRyZXNzKE0sIEYpKSAmJlwKKyAgICAgICAgICAgICAgICAgICAoQiA9PSBzbWFsbGJpbl9hdChNLEkpIHx8IG9rX2FkZHJlc3MoTSwgQikpKSkge1wKKyAgICBGLT5iayA9IEI7XAorICAgIEItPmZkID0gRjtcCisgIH1cCisgIGVsc2Uge1wKKyAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgIH1cCit9CisKKy8qIFVubGluayB0aGUgZmlyc3QgY2h1bmsgZnJvbSBhIHNtYWxsYmluICovCisjZGVmaW5lIHVubGlua19maXJzdF9zbWFsbF9jaHVuayhNLCBCLCBQLCBJKSB7XAorICBtY2h1bmtwdHIgRiA9IFAtPmZkO1wKKyAgYXNzZXJ0KFAgIT0gQik7XAorICBhc3NlcnQoUCAhPSBGKTtcCisgIGFzc2VydChjaHVua3NpemUoUCkgPT0gc21hbGxfaW5kZXgyc2l6ZShJKSk7XAorICBpZiAoQiA9PSBGKVwKKyAgICBjbGVhcl9zbWFsbG1hcChNLCBJKTtcCisgIGVsc2UgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBGKSkpIHtcCisgICAgQi0+ZmQgPSBGO1wKKyAgICBGLT5iayA9IEI7XAorICB9XAorICBlbHNlIHtcCisgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAorICB9XAorfQorCisvKiBSZXBsYWNlIGR2IG5vZGUsIGJpbm5pbmcgdGhlIG9sZCBvbmUgKi8KKy8qIFVzZWQgb25seSB3aGVuIGR2c2l6ZSBrbm93biB0byBiZSBzbWFsbCAqLworI2RlZmluZSByZXBsYWNlX2R2KE0sIFAsIFMpIHtcCisgIHNpemVfdCBEVlMgPSBNLT5kdnNpemU7XAorICBpZiAoRFZTICE9IDApIHtcCisgICAgbWNodW5rcHRyIERWID0gTS0+ZHY7XAorICAgIGFzc2VydChpc19zbWFsbChEVlMpKTtcCisgICAgaW5zZXJ0X3NtYWxsX2NodW5rKE0sIERWLCBEVlMpO1wKKyAgfVwKKyAgTS0+ZHZzaXplID0gUztcCisgIE0tPmR2ID0gUDtcCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW9ucyBvbiB0cmVlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEluc2VydCBjaHVuayBpbnRvIHRyZWUgKi8KKyNkZWZpbmUgaW5zZXJ0X2xhcmdlX2NodW5rKE0sIFgsIFMpIHtcCisgIHRiaW5wdHIqIEg7XAorICBiaW5kZXhfdCBJO1wKKyAgY29tcHV0ZV90cmVlX2luZGV4KFMsIEkpO1wKKyAgSCA9IHRyZWViaW5fYXQoTSwgSSk7XAorICBYLT5pbmRleCA9IEk7XAorICBYLT5jaGlsZFswXSA9IFgtPmNoaWxkWzFdID0gMDtcCisgIGlmICghdHJlZW1hcF9pc19tYXJrZWQoTSwgSSkpIHtcCisgICAgbWFya190cmVlbWFwKE0sIEkpO1wKKyAgICAqSCA9IFg7XAorICAgIFgtPnBhcmVudCA9ICh0Y2h1bmtwdHIpSDtcCisgICAgWC0+ZmQgPSBYLT5iayA9IFg7XAorICB9XAorICBlbHNlIHtcCisgICAgdGNodW5rcHRyIFQgPSAqSDtcCisgICAgc2l6ZV90IEsgPSBTIDw8IGxlZnRzaGlmdF9mb3JfdHJlZV9pbmRleChJKTtcCisgICAgZm9yICg7Oykge1wKKyAgICAgIGlmIChjaHVua3NpemUoVCkgIT0gUykge1wKKyAgICAgICAgdGNodW5rcHRyKiBDID0gJihULT5jaGlsZFsoSyA+PiAoU0laRV9UX0JJVFNJWkUtU0laRV9UX09ORSkpICYgMV0pO1wKKyAgICAgICAgSyA8PD0gMTtcCisgICAgICAgIGlmICgqQyAhPSAwKVwKKyAgICAgICAgICBUID0gKkM7XAorICAgICAgICBlbHNlIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoTSwgQykpKSB7XAorICAgICAgICAgICpDID0gWDtcCisgICAgICAgICAgWC0+cGFyZW50ID0gVDtcCisgICAgICAgICAgWC0+ZmQgPSBYLT5iayA9IFg7XAorICAgICAgICAgIGJyZWFrO1wKKyAgICAgICAgfVwKKyAgICAgICAgZWxzZSB7XAorICAgICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKKyAgICAgICAgICBicmVhaztcCisgICAgICAgIH1cCisgICAgICB9XAorICAgICAgZWxzZSB7XAorICAgICAgICB0Y2h1bmtwdHIgRiA9IFQtPmZkO1wKKyAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBUKSAmJiBva19hZGRyZXNzKE0sIEYpKSkge1wKKyAgICAgICAgICBULT5mZCA9IEYtPmJrID0gWDtcCisgICAgICAgICAgWC0+ZmQgPSBGO1wKKyAgICAgICAgICBYLT5iayA9IFQ7XAorICAgICAgICAgIFgtPnBhcmVudCA9IDA7XAorICAgICAgICAgIGJyZWFrO1wKKyAgICAgICAgfVwKKyAgICAgICAgZWxzZSB7XAorICAgICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKKyAgICAgICAgICBicmVhaztcCisgICAgICAgIH1cCisgICAgICB9XAorICAgIH1cCisgIH1cCit9CisKKy8qCisgIFVubGluayBzdGVwczoKKworICAxLiBJZiB4IGlzIGEgY2hhaW5lZCBub2RlLCB1bmxpbmsgaXQgZnJvbSBpdHMgc2FtZS1zaXplZCBmZC9iayBsaW5rcworICAgICBhbmQgY2hvb3NlIGl0cyBiayBub2RlIGFzIGl0cyByZXBsYWNlbWVudC4KKyAgMi4gSWYgeCB3YXMgdGhlIGxhc3Qgbm9kZSBvZiBpdHMgc2l6ZSwgYnV0IG5vdCBhIGxlYWYgbm9kZSwgaXQgbXVzdAorICAgICBiZSByZXBsYWNlZCB3aXRoIGEgbGVhZiBub2RlIChub3QgbWVyZWx5IG9uZSB3aXRoIGFuIG9wZW4gbGVmdCBvcgorICAgICByaWdodCksIHRvIG1ha2Ugc3VyZSB0aGF0IGxlZnRzIGFuZCByaWdodHMgb2YgZGVzY2VuZGVudHMKKyAgICAgY29ycmVzcG9uZCBwcm9wZXJseSB0byBiaXQgbWFza3MuICBXZSB1c2UgdGhlIHJpZ2h0bW9zdCBkZXNjZW5kZW50CisgICAgIG9mIHguICBXZSBjb3VsZCB1c2UgYW55IG90aGVyIGxlYWYsIGJ1dCB0aGlzIGlzIGVhc3kgdG8gbG9jYXRlIGFuZAorICAgICB0ZW5kcyB0byBjb3VudGVyYWN0IHJlbW92YWwgb2YgbGVmdG1vc3RzIGVsc2V3aGVyZSwgYW5kIHNvIGtlZXBzCisgICAgIHBhdGhzIHNob3J0ZXIgdGhhbiBtaW5pbWFsbHkgZ3VhcmFudGVlZC4gIFRoaXMgZG9lc24ndCBsb29wIG11Y2gKKyAgICAgYmVjYXVzZSBvbiBhdmVyYWdlIGEgbm9kZSBpbiBhIHRyZWUgaXMgbmVhciB0aGUgYm90dG9tLgorICAzLiBJZiB4IGlzIHRoZSBiYXNlIG9mIGEgY2hhaW4gKGkuZS4sIGhhcyBwYXJlbnQgbGlua3MpIHJlbGluaworICAgICB4J3MgcGFyZW50IGFuZCBjaGlsZHJlbiB0byB4J3MgcmVwbGFjZW1lbnQgKG9yIG51bGwgaWYgbm9uZSkuCisqLworCisjZGVmaW5lIHVubGlua19sYXJnZV9jaHVuayhNLCBYKSB7XAorICB0Y2h1bmtwdHIgWFAgPSBYLT5wYXJlbnQ7XAorICB0Y2h1bmtwdHIgUjtcCisgIGlmIChYLT5iayAhPSBYKSB7XAorICAgIHRjaHVua3B0ciBGID0gWC0+ZmQ7XAorICAgIFIgPSBYLT5iaztcCisgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBGKSkpIHtcCisgICAgICBGLT5iayA9IFI7XAorICAgICAgUi0+ZmQgPSBGO1wKKyAgICB9XAorICAgIGVsc2Uge1wKKyAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKKyAgICB9XAorICB9XAorICBlbHNlIHtcCisgICAgdGNodW5rcHRyKiBSUDtcCisgICAgaWYgKCgoUiA9ICooUlAgPSAmKFgtPmNoaWxkWzFdKSkpICE9IDApIHx8XAorICAgICAgICAoKFIgPSAqKFJQID0gJihYLT5jaGlsZFswXSkpKSAhPSAwKSkge1wKKyAgICAgIHRjaHVua3B0ciogQ1A7XAorICAgICAgd2hpbGUgKCgqKENQID0gJihSLT5jaGlsZFsxXSkpICE9IDApIHx8XAorICAgICAgICAgICAgICgqKENQID0gJihSLT5jaGlsZFswXSkpICE9IDApKSB7XAorICAgICAgICBSID0gKihSUCA9IENQKTtcCisgICAgICB9XAorICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBSUCkpKVwKKyAgICAgICAgKlJQID0gMDtcCisgICAgICBlbHNlIHtcCisgICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKKyAgICAgIH1cCisgICAgfVwKKyAgfVwKKyAgaWYgKFhQICE9IDApIHtcCisgICAgdGJpbnB0ciogSCA9IHRyZWViaW5fYXQoTSwgWC0+aW5kZXgpO1wKKyAgICBpZiAoWCA9PSAqSCkge1wKKyAgICAgIGlmICgoKkggPSBSKSA9PSAwKSBcCisgICAgICAgIGNsZWFyX3RyZWVtYXAoTSwgWC0+aW5kZXgpO1wKKyAgICB9XAorICAgIGVsc2UgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBYUCkpKSB7XAorICAgICAgaWYgKFhQLT5jaGlsZFswXSA9PSBYKSBcCisgICAgICAgIFhQLT5jaGlsZFswXSA9IFI7XAorICAgICAgZWxzZSBcCisgICAgICAgIFhQLT5jaGlsZFsxXSA9IFI7XAorICAgIH1cCisgICAgZWxzZVwKKyAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wKKyAgICBpZiAoUiAhPSAwKSB7XAorICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBSKSkpIHtcCisgICAgICAgIHRjaHVua3B0ciBDMCwgQzE7XAorICAgICAgICBSLT5wYXJlbnQgPSBYUDtcCisgICAgICAgIGlmICgoQzAgPSBYLT5jaGlsZFswXSkgIT0gMCkge1wKKyAgICAgICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKE0sIEMwKSkpIHtcCisgICAgICAgICAgICBSLT5jaGlsZFswXSA9IEMwO1wKKyAgICAgICAgICAgIEMwLT5wYXJlbnQgPSBSO1wKKyAgICAgICAgICB9XAorICAgICAgICAgIGVsc2VcCisgICAgICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgICAgICAgIH1cCisgICAgICAgIGlmICgoQzEgPSBYLT5jaGlsZFsxXSkgIT0gMCkge1wKKyAgICAgICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKE0sIEMxKSkpIHtcCisgICAgICAgICAgICBSLT5jaGlsZFsxXSA9IEMxO1wKKyAgICAgICAgICAgIEMxLT5wYXJlbnQgPSBSO1wKKyAgICAgICAgICB9XAorICAgICAgICAgIGVsc2VcCisgICAgICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcCisgICAgICAgIH1cCisgICAgICB9XAorICAgICAgZWxzZVwKKyAgICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XAorICAgIH1cCisgIH1cCit9CisKKy8qIFJlbGF5cyB0byBsYXJnZSB2cyBzbWFsbCBiaW4gb3BlcmF0aW9ucyAqLworCisjZGVmaW5lIGluc2VydF9jaHVuayhNLCBQLCBTKVwKKyAgaWYgKGlzX3NtYWxsKFMpKSBpbnNlcnRfc21hbGxfY2h1bmsoTSwgUCwgUylcCisgIGVsc2UgeyB0Y2h1bmtwdHIgVFAgPSAodGNodW5rcHRyKShQKTsgaW5zZXJ0X2xhcmdlX2NodW5rKE0sIFRQLCBTKTsgfQorCisjZGVmaW5lIHVubGlua19jaHVuayhNLCBQLCBTKVwKKyAgaWYgKGlzX3NtYWxsKFMpKSB1bmxpbmtfc21hbGxfY2h1bmsoTSwgUCwgUylcCisgIGVsc2UgeyB0Y2h1bmtwdHIgVFAgPSAodGNodW5rcHRyKShQKTsgdW5saW5rX2xhcmdlX2NodW5rKE0sIFRQKTsgfQorCisKKy8qIFJlbGF5cyB0byBpbnRlcm5hbCBjYWxscyB0byBtYWxsb2MvZnJlZSBmcm9tIHJlYWxsb2MsIG1lbWFsaWduIGV0YyAqLworCisjaWYgT05MWV9NU1BBQ0VTCisjZGVmaW5lIGludGVybmFsX21hbGxvYyhtLCBiKSBtc3BhY2VfbWFsbG9jKG0sIGIpCisjZGVmaW5lIGludGVybmFsX2ZyZWUobSwgbWVtKSBtc3BhY2VfZnJlZShtLG1lbSk7CisjZWxzZSAvKiBPTkxZX01TUEFDRVMgKi8KKyNpZiBNU1BBQ0VTCisjZGVmaW5lIGludGVybmFsX21hbGxvYyhtLCBiKVwKKyAgIChtID09IGdtKT8gZGxtYWxsb2MoYikgOiBtc3BhY2VfbWFsbG9jKG0sIGIpCisjZGVmaW5lIGludGVybmFsX2ZyZWUobSwgbWVtKVwKKyAgIGlmIChtID09IGdtKSBkbGZyZWUobWVtKTsgZWxzZSBtc3BhY2VfZnJlZShtLG1lbSk7CisjZWxzZSAvKiBNU1BBQ0VTICovCisjZGVmaW5lIGludGVybmFsX21hbGxvYyhtLCBiKSBkbG1hbGxvYyhiKQorI2RlZmluZSBpbnRlcm5hbF9mcmVlKG0sIG1lbSkgZGxmcmVlKG1lbSkKKyNlbmRpZiAvKiBNU1BBQ0VTICovCisjZW5kaWYgLyogT05MWV9NU1BBQ0VTICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBEaXJlY3QtbW1hcHBpbmcgY2h1bmtzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIERpcmVjdGx5IG1tYXBwZWQgY2h1bmtzIGFyZSBzZXQgdXAgd2l0aCBhbiBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mCisgIHRoZSBtbWFwcGVkIHJlZ2lvbiBzdG9yZWQgaW4gdGhlIHByZXZfZm9vdCBmaWVsZCBvZiB0aGUgY2h1bmsuIFRoaXMKKyAgYWxsb3dzIHJlY29uc3RydWN0aW9uIG9mIHRoZSByZXF1aXJlZCBhcmd1bWVudCB0byBNVU5NQVAgd2hlbiBmcmVlZCwKKyAgYW5kIGFsc28gYWxsb3dzIGFkanVzdG1lbnQgb2YgdGhlIHJldHVybmVkIGNodW5rIHRvIG1lZXQgYWxpZ25tZW50CisgIHJlcXVpcmVtZW50cyAoZXNwZWNpYWxseSBpbiBtZW1hbGlnbikuICBUaGVyZSBpcyBhbHNvIGVub3VnaCBzcGFjZQorICBhbGxvY2F0ZWQgdG8gaG9sZCBhIGZha2UgbmV4dCBjaHVuayBvZiBzaXplIFNJWkVfVF9TSVpFIHRvIG1haW50YWluCisgIHRoZSBQSU5VU0UgYml0IHNvIGZyZWVzIGNhbiBiZSBjaGVja2VkLgorKi8KKworLyogTWFsbG9jIHVzaW5nIG1tYXAgKi8KK3N0YXRpYyB2b2lkKiBtbWFwX2FsbG9jKG1zdGF0ZSBtLCBzaXplX3QgbmIpIHsKKyAgc2l6ZV90IG1tc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgU0lYX1NJWkVfVF9TSVpFUyArIENIVU5LX0FMSUdOX01BU0spOworICBpZiAobW1zaXplID4gbmIpIHsgICAgIC8qIENoZWNrIGZvciB3cmFwIGFyb3VuZCAwICovCisgICAgY2hhciogbW0gPSAoY2hhciopKERJUkVDVF9NTUFQKG1tc2l6ZSkpOworICAgIGlmIChtbSAhPSBDTUZBSUwpIHsKKyAgICAgIHNpemVfdCBvZmZzZXQgPSBhbGlnbl9vZmZzZXQoY2h1bmsybWVtKG1tKSk7CisgICAgICBzaXplX3QgcHNpemUgPSBtbXNpemUgLSBvZmZzZXQgLSBNTUFQX0ZPT1RfUEFEOworICAgICAgbWNodW5rcHRyIHAgPSAobWNodW5rcHRyKShtbSArIG9mZnNldCk7CisgICAgICBwLT5wcmV2X2Zvb3QgPSBvZmZzZXQgfCBJU19NTUFQUEVEX0JJVDsKKyAgICAgIChwKS0+aGVhZCA9IChwc2l6ZXxDSU5VU0VfQklUKTsKKyAgICAgIG1hcmtfaW51c2VfZm9vdChtLCBwLCBwc2l6ZSk7CisgICAgICBjaHVua19wbHVzX29mZnNldChwLCBwc2l6ZSktPmhlYWQgPSBGRU5DRVBPU1RfSEVBRDsKKyAgICAgIGNodW5rX3BsdXNfb2Zmc2V0KHAsIHBzaXplK1NJWkVfVF9TSVpFKS0+aGVhZCA9IDA7CisKKyAgICAgIGlmIChtbSA8IG0tPmxlYXN0X2FkZHIpCisgICAgICAgIG0tPmxlYXN0X2FkZHIgPSBtbTsKKyAgICAgIGlmICgobS0+Zm9vdHByaW50ICs9IG1tc2l6ZSkgPiBtLT5tYXhfZm9vdHByaW50KQorICAgICAgICBtLT5tYXhfZm9vdHByaW50ID0gbS0+Zm9vdHByaW50OworICAgICAgYXNzZXJ0KGlzX2FsaWduZWQoY2h1bmsybWVtKHApKSk7CisgICAgICBjaGVja19tbWFwcGVkX2NodW5rKG0sIHApOworICAgICAgcmV0dXJuIGNodW5rMm1lbShwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJlYWxsb2MgdXNpbmcgbW1hcCAqLworc3RhdGljIG1jaHVua3B0ciBtbWFwX3Jlc2l6ZShtc3RhdGUgbSwgbWNodW5rcHRyIG9sZHAsIHNpemVfdCBuYikgeworICBzaXplX3Qgb2xkc2l6ZSA9IGNodW5rc2l6ZShvbGRwKTsKKyAgaWYgKGlzX3NtYWxsKG5iKSkgLyogQ2FuJ3Qgc2hyaW5rIG1tYXAgcmVnaW9ucyBiZWxvdyBzbWFsbCBzaXplICovCisgICAgcmV0dXJuIDA7CisgIC8qIEtlZXAgb2xkIGNodW5rIGlmIGJpZyBlbm91Z2ggYnV0IG5vdCB0b28gYmlnICovCisgIGlmIChvbGRzaXplID49IG5iICsgU0laRV9UX1NJWkUgJiYKKyAgICAgIChvbGRzaXplIC0gbmIpIDw9IChtcGFyYW1zLmdyYW51bGFyaXR5IDw8IDEpKQorICAgIHJldHVybiBvbGRwOworICBlbHNlIHsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gb2xkcC0+cHJldl9mb290ICYgfklTX01NQVBQRURfQklUOworICAgIHNpemVfdCBvbGRtbXNpemUgPSBvbGRzaXplICsgb2Zmc2V0ICsgTU1BUF9GT09UX1BBRDsKKyAgICBzaXplX3QgbmV3bW1zaXplID0gZ3JhbnVsYXJpdHlfYWxpZ24obmIgKyBTSVhfU0laRV9UX1NJWkVTICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hVTktfQUxJR05fTUFTSyk7CisgICAgY2hhciogY3AgPSAoY2hhciopQ0FMTF9NUkVNQVAoKGNoYXIqKW9sZHAgLSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkbW1zaXplLCBuZXdtbXNpemUsIDEpOworICAgIGlmIChjcCAhPSBDTUZBSUwpIHsKKyAgICAgIG1jaHVua3B0ciBuZXdwID0gKG1jaHVua3B0cikoY3AgKyBvZmZzZXQpOworICAgICAgc2l6ZV90IHBzaXplID0gbmV3bW1zaXplIC0gb2Zmc2V0IC0gTU1BUF9GT09UX1BBRDsKKyAgICAgIG5ld3AtPmhlYWQgPSAocHNpemV8Q0lOVVNFX0JJVCk7CisgICAgICBtYXJrX2ludXNlX2Zvb3QobSwgbmV3cCwgcHNpemUpOworICAgICAgY2h1bmtfcGx1c19vZmZzZXQobmV3cCwgcHNpemUpLT5oZWFkID0gRkVOQ0VQT1NUX0hFQUQ7CisgICAgICBjaHVua19wbHVzX29mZnNldChuZXdwLCBwc2l6ZStTSVpFX1RfU0laRSktPmhlYWQgPSAwOworCisgICAgICBpZiAoY3AgPCBtLT5sZWFzdF9hZGRyKQorICAgICAgICBtLT5sZWFzdF9hZGRyID0gY3A7CisgICAgICBpZiAoKG0tPmZvb3RwcmludCArPSBuZXdtbXNpemUgLSBvbGRtbXNpemUpID4gbS0+bWF4X2Zvb3RwcmludCkKKyAgICAgICAgbS0+bWF4X2Zvb3RwcmludCA9IG0tPmZvb3RwcmludDsKKyAgICAgIGNoZWNrX21tYXBwZWRfY2h1bmsobSwgbmV3cCk7CisgICAgICByZXR1cm4gbmV3cDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1zcGFjZSBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEluaXRpYWxpemUgdG9wIGNodW5rIGFuZCBpdHMgc2l6ZSAqLworc3RhdGljIHZvaWQgaW5pdF90b3AobXN0YXRlIG0sIG1jaHVua3B0ciBwLCBzaXplX3QgcHNpemUpIHsKKyAgLyogRW5zdXJlIGFsaWdubWVudCAqLworICBzaXplX3Qgb2Zmc2V0ID0gYWxpZ25fb2Zmc2V0KGNodW5rMm1lbShwKSk7CisgIHAgPSAobWNodW5rcHRyKSgoY2hhciopcCArIG9mZnNldCk7CisgIHBzaXplIC09IG9mZnNldDsKKworICBtLT50b3AgPSBwOworICBtLT50b3BzaXplID0gcHNpemU7CisgIHAtPmhlYWQgPSBwc2l6ZSB8IFBJTlVTRV9CSVQ7CisgIC8qIHNldCBzaXplIG9mIGZha2UgdHJhaWxpbmcgY2h1bmsgaG9sZGluZyBvdmVyaGVhZCBzcGFjZSBvbmx5IG9uY2UgKi8KKyAgY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpLT5oZWFkID0gVE9QX0ZPT1RfU0laRTsKKyAgbS0+dHJpbV9jaGVjayA9IG1wYXJhbXMudHJpbV90aHJlc2hvbGQ7IC8qIHJlc2V0IG9uIGVhY2ggdXBkYXRlICovCit9CisKKy8qIEluaXRpYWxpemUgYmlucyBmb3IgYSBuZXcgbXN0YXRlIHRoYXQgaXMgb3RoZXJ3aXNlIHplcm9lZCBvdXQgKi8KK3N0YXRpYyB2b2lkIGluaXRfYmlucyhtc3RhdGUgbSkgeworICAvKiBFc3RhYmxpc2ggY2lyY3VsYXIgbGlua3MgZm9yIHNtYWxsYmlucyAqLworICBiaW5kZXhfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgTlNNQUxMQklOUzsgKytpKSB7CisgICAgc2JpbnB0ciBiaW4gPSBzbWFsbGJpbl9hdChtLGkpOworICAgIGJpbi0+ZmQgPSBiaW4tPmJrID0gYmluOworICB9Cit9CisKKyNpZiBQUk9DRUVEX09OX0VSUk9SCisKKy8qIGRlZmF1bHQgY29ycnVwdGlvbiBhY3Rpb24gKi8KK3N0YXRpYyB2b2lkIHJlc2V0X29uX2Vycm9yKG1zdGF0ZSBtKSB7CisgIGludCBpOworICArK21hbGxvY19jb3JydXB0aW9uX2Vycm9yX2NvdW50OworICAvKiBSZWluaXRpYWxpemUgZmllbGRzIHRvIGZvcmdldCBhYm91dCBhbGwgbWVtb3J5ICovCisgIG0tPnNtYWxsYmlucyA9IG0tPnRyZWViaW5zID0gMDsKKyAgbS0+ZHZzaXplID0gbS0+dG9wc2l6ZSA9IDA7CisgIG0tPnNlZy5iYXNlID0gMDsKKyAgbS0+c2VnLnNpemUgPSAwOworICBtLT5zZWcubmV4dCA9IDA7CisgIG0tPnRvcCA9IG0tPmR2ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE5UUkVFQklOUzsgKytpKQorICAgICp0cmVlYmluX2F0KG0sIGkpID0gMDsKKyAgaW5pdF9iaW5zKG0pOworfQorI2VuZGlmIC8qIFBST0NFRURfT05fRVJST1IgKi8KKworLyogQWxsb2NhdGUgY2h1bmsgYW5kIHByZXBlbmQgcmVtYWluZGVyIHdpdGggY2h1bmsgaW4gc3VjY2Vzc29yIGJhc2UuICovCitzdGF0aWMgdm9pZCogcHJlcGVuZF9hbGxvYyhtc3RhdGUgbSwgY2hhciogbmV3YmFzZSwgY2hhciogb2xkYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYikgeworICBtY2h1bmtwdHIgcCA9IGFsaWduX2FzX2NodW5rKG5ld2Jhc2UpOworICBtY2h1bmtwdHIgb2xkZmlyc3QgPSBhbGlnbl9hc19jaHVuayhvbGRiYXNlKTsKKyAgc2l6ZV90IHBzaXplID0gKGNoYXIqKW9sZGZpcnN0IC0gKGNoYXIqKXA7CisgIG1jaHVua3B0ciBxID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICBzaXplX3QgcXNpemUgPSBwc2l6ZSAtIG5iOworICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHAsIG5iKTsKKworICBhc3NlcnQoKGNoYXIqKW9sZGZpcnN0ID4gKGNoYXIqKXEpOworICBhc3NlcnQocGludXNlKG9sZGZpcnN0KSk7CisgIGFzc2VydChxc2l6ZSA+PSBNSU5fQ0hVTktfU0laRSk7CisKKyAgLyogY29uc29saWRhdGUgcmVtYWluZGVyIHdpdGggZmlyc3QgY2h1bmsgb2Ygb2xkIGJhc2UgKi8KKyAgaWYgKG9sZGZpcnN0ID09IG0tPnRvcCkgeworICAgIHNpemVfdCB0c2l6ZSA9IG0tPnRvcHNpemUgKz0gcXNpemU7CisgICAgbS0+dG9wID0gcTsKKyAgICBxLT5oZWFkID0gdHNpemUgfCBQSU5VU0VfQklUOworICAgIGNoZWNrX3RvcF9jaHVuayhtLCBxKTsKKyAgfQorICBlbHNlIGlmIChvbGRmaXJzdCA9PSBtLT5kdikgeworICAgIHNpemVfdCBkc2l6ZSA9IG0tPmR2c2l6ZSArPSBxc2l6ZTsKKyAgICBtLT5kdiA9IHE7CisgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHEsIGRzaXplKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIWNpbnVzZShvbGRmaXJzdCkpIHsKKyAgICAgIHNpemVfdCBuc2l6ZSA9IGNodW5rc2l6ZShvbGRmaXJzdCk7CisgICAgICB1bmxpbmtfY2h1bmsobSwgb2xkZmlyc3QsIG5zaXplKTsKKyAgICAgIG9sZGZpcnN0ID0gY2h1bmtfcGx1c19vZmZzZXQob2xkZmlyc3QsIG5zaXplKTsKKyAgICAgIHFzaXplICs9IG5zaXplOworICAgIH0KKyAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShxLCBxc2l6ZSwgb2xkZmlyc3QpOworICAgIGluc2VydF9jaHVuayhtLCBxLCBxc2l6ZSk7CisgICAgY2hlY2tfZnJlZV9jaHVuayhtLCBxKTsKKyAgfQorCisgIGNoZWNrX21hbGxvY2VkX2NodW5rKG0sIGNodW5rMm1lbShwKSwgbmIpOworICByZXR1cm4gY2h1bmsybWVtKHApOworfQorCisKKy8qIEFkZCBhIHNlZ21lbnQgdG8gaG9sZCBhIG5ldyBub25jb250aWd1b3VzIHJlZ2lvbiAqLworc3RhdGljIHZvaWQgYWRkX3NlZ21lbnQobXN0YXRlIG0sIGNoYXIqIHRiYXNlLCBzaXplX3QgdHNpemUsIGZsYWdfdCBtbWFwcGVkKSB7CisgIC8qIERldGVybWluZSBsb2NhdGlvbnMgYW5kIHNpemVzIG9mIHNlZ21lbnQsIGZlbmNlcG9zdHMsIG9sZCB0b3AgKi8KKyAgY2hhciogb2xkX3RvcCA9IChjaGFyKiltLT50b3A7CisgIG1zZWdtZW50cHRyIG9sZHNwID0gc2VnbWVudF9ob2xkaW5nKG0sIG9sZF90b3ApOworICBjaGFyKiBvbGRfZW5kID0gb2xkc3AtPmJhc2UgKyBvbGRzcC0+c2l6ZTsKKyAgc2l6ZV90IHNzaXplID0gcGFkX3JlcXVlc3Qoc2l6ZW9mKHN0cnVjdCBtYWxsb2Nfc2VnbWVudCkpOworICBjaGFyKiByYXdzcCA9IG9sZF9lbmQgLSAoc3NpemUgKyBGT1VSX1NJWkVfVF9TSVpFUyArIENIVU5LX0FMSUdOX01BU0spOworICBzaXplX3Qgb2Zmc2V0ID0gYWxpZ25fb2Zmc2V0KGNodW5rMm1lbShyYXdzcCkpOworICBjaGFyKiBhc3AgPSByYXdzcCArIG9mZnNldDsKKyAgY2hhciogY3NwID0gKGFzcCA8IChvbGRfdG9wICsgTUlOX0NIVU5LX1NJWkUpKT8gb2xkX3RvcCA6IGFzcDsKKyAgbWNodW5rcHRyIHNwID0gKG1jaHVua3B0ciljc3A7CisgIG1zZWdtZW50cHRyIHNzID0gKG1zZWdtZW50cHRyKShjaHVuazJtZW0oc3ApKTsKKyAgbWNodW5rcHRyIHRuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQoc3AsIHNzaXplKTsKKyAgbWNodW5rcHRyIHAgPSB0bmV4dDsKKyAgaW50IG5mZW5jZXMgPSAwOworCisgIC8qIHJlc2V0IHRvcCB0byBuZXcgc3BhY2UgKi8KKyAgaW5pdF90b3AobSwgKG1jaHVua3B0cil0YmFzZSwgdHNpemUgLSBUT1BfRk9PVF9TSVpFKTsKKworICAvKiBTZXQgdXAgc2VnbWVudCByZWNvcmQgKi8KKyAgYXNzZXJ0KGlzX2FsaWduZWQoc3MpKTsKKyAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCBzcCwgc3NpemUpOworICAqc3MgPSBtLT5zZWc7IC8qIFB1c2ggY3VycmVudCByZWNvcmQgKi8KKyAgbS0+c2VnLmJhc2UgPSB0YmFzZTsKKyAgbS0+c2VnLnNpemUgPSB0c2l6ZTsKKyAgc2V0X3NlZ21lbnRfZmxhZ3MoJm0tPnNlZywgbW1hcHBlZCk7CisgIG0tPnNlZy5uZXh0ID0gc3M7CisKKyAgLyogSW5zZXJ0IHRyYWlsaW5nIGZlbmNlcG9zdHMgKi8KKyAgZm9yICg7OykgeworICAgIG1jaHVua3B0ciBuZXh0cCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIFNJWkVfVF9TSVpFKTsKKyAgICBwLT5oZWFkID0gRkVOQ0VQT1NUX0hFQUQ7CisgICAgKytuZmVuY2VzOworICAgIGlmICgoY2hhciopKCYobmV4dHAtPmhlYWQpKSA8IG9sZF9lbmQpCisgICAgICBwID0gbmV4dHA7CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgYXNzZXJ0KG5mZW5jZXMgPj0gMik7CisKKyAgLyogSW5zZXJ0IHRoZSByZXN0IG9mIG9sZCB0b3AgaW50byBhIGJpbiBhcyBhbiBvcmRpbmFyeSBmcmVlIGNodW5rICovCisgIGlmIChjc3AgIT0gb2xkX3RvcCkgeworICAgIG1jaHVua3B0ciBxID0gKG1jaHVua3B0cilvbGRfdG9wOworICAgIHNpemVfdCBwc2l6ZSA9IGNzcCAtIG9sZF90b3A7CisgICAgbWNodW5rcHRyIHRuID0gY2h1bmtfcGx1c19vZmZzZXQocSwgcHNpemUpOworICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHEsIHBzaXplLCB0bik7CisgICAgaW5zZXJ0X2NodW5rKG0sIHEsIHBzaXplKTsKKyAgfQorCisgIGNoZWNrX3RvcF9jaHVuayhtLCBtLT50b3ApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTeXN0ZW0gYWxsb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBHZXQgbWVtb3J5IGZyb20gc3lzdGVtIHVzaW5nIE1PUkVDT1JFIG9yIE1NQVAgKi8KK3N0YXRpYyB2b2lkKiBzeXNfYWxsb2MobXN0YXRlIG0sIHNpemVfdCBuYikgeworICBjaGFyKiB0YmFzZSA9IENNRkFJTDsKKyAgc2l6ZV90IHRzaXplID0gMDsKKyAgZmxhZ190IG1tYXBfZmxhZyA9IDA7CisKKyAgaW5pdF9tcGFyYW1zKCk7CisKKyAgLyogRGlyZWN0bHkgbWFwIGxhcmdlIGNodW5rcyAqLworICBpZiAodXNlX21tYXAobSkgJiYgbmIgPj0gbXBhcmFtcy5tbWFwX3RocmVzaG9sZCkgeworICAgIHZvaWQqIG1lbSA9IG1tYXBfYWxsb2MobSwgbmIpOworICAgIGlmIChtZW0gIT0gMCkKKyAgICAgIHJldHVybiBtZW07CisgIH0KKworICAvKgorICAgIFRyeSBnZXR0aW5nIG1lbW9yeSBpbiBhbnkgb2YgdGhyZWUgd2F5cyAoaW4gbW9zdC1wcmVmZXJyZWQgdG8KKyAgICBsZWFzdC1wcmVmZXJyZWQgb3JkZXIpOgorICAgIDEuIEEgY2FsbCB0byBNT1JFQ09SRSB0aGF0IGNhbiBub3JtYWxseSBjb250aWd1b3VzbHkgZXh0ZW5kIG1lbW9yeS4KKyAgICAgICAoZGlzYWJsZWQgaWYgbm90IE1PUkVDT1JFX0NPTlRJR1VPVVMgb3Igbm90IEhBVkVfTU9SRUNPUkUgb3IKKyAgICAgICBvciBtYWluIHNwYWNlIGlzIG1tYXBwZWQgb3IgYSBwcmV2aW91cyBjb250aWd1b3VzIGNhbGwgZmFpbGVkKQorICAgIDIuIEEgY2FsbCB0byBNTUFQIG5ldyBzcGFjZSAoZGlzYWJsZWQgaWYgbm90IEhBVkVfTU1BUCkuCisgICAgICAgTm90ZSB0aGF0IHVuZGVyIHRoZSBkZWZhdWx0IHNldHRpbmdzLCBpZiBNT1JFQ09SRSBpcyB1bmFibGUgdG8KKyAgICAgICBmdWxmaWxsIGEgcmVxdWVzdCwgYW5kIEhBVkVfTU1BUCBpcyB0cnVlLCB0aGVuIG1tYXAgaXMKKyAgICAgICB1c2VkIGFzIGEgbm9uY29udGlndW91cyBzeXN0ZW0gYWxsb2NhdG9yLiBUaGlzIGlzIGEgdXNlZnVsIGJhY2t1cAorICAgICAgIHN0cmF0ZWd5IGZvciBzeXN0ZW1zIHdpdGggaG9sZXMgaW4gYWRkcmVzcyBzcGFjZXMgLS0gaW4gdGhpcyBjYXNlCisgICAgICAgc2JyayBjYW5ub3QgY29udGlndW91c2x5IGV4cGFuZCB0aGUgaGVhcCwgYnV0IG1tYXAgbWF5IGJlIGFibGUgdG8KKyAgICAgICBmaW5kIHNwYWNlLgorICAgIDMuIEEgY2FsbCB0byBNT1JFQ09SRSB0aGF0IGNhbm5vdCB1c3VhbGx5IGNvbnRpZ3VvdXNseSBleHRlbmQgbWVtb3J5LgorICAgICAgIChkaXNhYmxlZCBpZiBub3QgSEFWRV9NT1JFQ09SRSkKKyAgKi8KKworICBpZiAoTU9SRUNPUkVfQ09OVElHVU9VUyAmJiAhdXNlX25vbmNvbnRpZ3VvdXMobSkpIHsKKyAgICBjaGFyKiBiciA9IENNRkFJTDsKKyAgICBtc2VnbWVudHB0ciBzcyA9IChtLT50b3AgPT0gMCk/IDAgOiBzZWdtZW50X2hvbGRpbmcobSwgKGNoYXIqKW0tPnRvcCk7CisgICAgc2l6ZV90IGFzaXplID0gMDsKKyAgICBBQ1FVSVJFX01PUkVDT1JFX0xPQ0soKTsKKworICAgIGlmIChzcyA9PSAwKSB7ICAvKiBGaXJzdCB0aW1lIHRocm91Z2ggb3IgcmVjb3ZlcnkgKi8KKyAgICAgIGNoYXIqIGJhc2UgPSAoY2hhciopQ0FMTF9NT1JFQ09SRSgwKTsKKyAgICAgIGlmIChiYXNlICE9IENNRkFJTCkgeworICAgICAgICBhc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgVE9QX0ZPT1RfU0laRSArIFNJWkVfVF9PTkUpOworICAgICAgICAvKiBBZGp1c3QgdG8gZW5kIG9uIGEgcGFnZSBib3VuZGFyeSAqLworICAgICAgICBpZiAoIWlzX3BhZ2VfYWxpZ25lZChiYXNlKSkKKyAgICAgICAgICBhc2l6ZSArPSAocGFnZV9hbGlnbigoc2l6ZV90KWJhc2UpIC0gKHNpemVfdCliYXNlKTsKKyAgICAgICAgLyogQ2FuJ3QgY2FsbCBNT1JFQ09SRSBpZiBzaXplIGlzIG5lZ2F0aXZlIHdoZW4gdHJlYXRlZCBhcyBzaWduZWQgKi8KKyAgICAgICAgaWYgKGFzaXplIDwgSEFMRl9NQVhfU0laRV9UICYmCisgICAgICAgICAgICAoYnIgPSAoY2hhciopKENBTExfTU9SRUNPUkUoYXNpemUpKSkgPT0gYmFzZSkgeworICAgICAgICAgIHRiYXNlID0gYmFzZTsKKyAgICAgICAgICB0c2l6ZSA9IGFzaXplOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogU3VidHJhY3Qgb3V0IGV4aXN0aW5nIGF2YWlsYWJsZSB0b3Agc3BhY2UgZnJvbSBNT1JFQ09SRSByZXF1ZXN0LiAqLworICAgICAgYXNpemUgPSBncmFudWxhcml0eV9hbGlnbihuYiAtIG0tPnRvcHNpemUgKyBUT1BfRk9PVF9TSVpFICsgU0laRV9UX09ORSk7CisgICAgICAvKiBVc2UgbWVtIGhlcmUgb25seSBpZiBpdCBkaWQgY29udGludW91c2x5IGV4dGVuZCBvbGQgc3BhY2UgKi8KKyAgICAgIGlmIChhc2l6ZSA8IEhBTEZfTUFYX1NJWkVfVCAmJgorICAgICAgICAgIChiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpKSA9PSBzcy0+YmFzZStzcy0+c2l6ZSkgeworICAgICAgICB0YmFzZSA9IGJyOworICAgICAgICB0c2l6ZSA9IGFzaXplOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0YmFzZSA9PSBDTUZBSUwpIHsgICAgLyogQ29wZSB3aXRoIHBhcnRpYWwgZmFpbHVyZSAqLworICAgICAgaWYgKGJyICE9IENNRkFJTCkgeyAgICAvKiBUcnkgdG8gdXNlL2V4dGVuZCB0aGUgc3BhY2Ugd2UgZGlkIGdldCAqLworICAgICAgICBpZiAoYXNpemUgPCBIQUxGX01BWF9TSVpFX1QgJiYKKyAgICAgICAgICAgIGFzaXplIDwgbmIgKyBUT1BfRk9PVF9TSVpFICsgU0laRV9UX09ORSkgeworICAgICAgICAgIHNpemVfdCBlc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgVE9QX0ZPT1RfU0laRSArIFNJWkVfVF9PTkUgLSBhc2l6ZSk7CisgICAgICAgICAgaWYgKGVzaXplIDwgSEFMRl9NQVhfU0laRV9UKSB7CisgICAgICAgICAgICBjaGFyKiBlbmQgPSAoY2hhciopQ0FMTF9NT1JFQ09SRShlc2l6ZSk7CisgICAgICAgICAgICBpZiAoZW5kICE9IENNRkFJTCkKKyAgICAgICAgICAgICAgYXNpemUgKz0gZXNpemU7CisgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAvKiBDYW4ndCB1c2U7IHRyeSB0byByZWxlYXNlICovCisgICAgICAgICAgICAgICh2b2lkKUNBTExfTU9SRUNPUkUoLWFzaXplKTsKKyAgICAgICAgICAgICAgYnIgPSBDTUZBSUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoYnIgIT0gQ01GQUlMKSB7ICAgIC8qIFVzZSB0aGUgc3BhY2Ugd2UgZGlkIGdldCAqLworICAgICAgICB0YmFzZSA9IGJyOworICAgICAgICB0c2l6ZSA9IGFzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBkaXNhYmxlX2NvbnRpZ3VvdXMobSk7IC8qIERvbid0IHRyeSBjb250aWd1b3VzIHBhdGggaW4gdGhlIGZ1dHVyZSAqLworICAgIH0KKworICAgIFJFTEVBU0VfTU9SRUNPUkVfTE9DSygpOworICB9CisKKyAgaWYgKEhBVkVfTU1BUCAmJiB0YmFzZSA9PSBDTUZBSUwpIHsgIC8qIFRyeSBNTUFQICovCisgICAgc2l6ZV90IHJlcSA9IG5iICsgVE9QX0ZPT1RfU0laRSArIFNJWkVfVF9PTkU7CisgICAgc2l6ZV90IHJzaXplID0gZ3JhbnVsYXJpdHlfYWxpZ24ocmVxKTsKKyAgICBpZiAocnNpemUgPiBuYikgeyAvKiBGYWlsIGlmIHdyYXBzIGFyb3VuZCB6ZXJvICovCisgICAgICBjaGFyKiBtcCA9IChjaGFyKikoQ0FMTF9NTUFQKHJzaXplKSk7CisgICAgICBpZiAobXAgIT0gQ01GQUlMKSB7CisgICAgICAgIHRiYXNlID0gbXA7CisgICAgICAgIHRzaXplID0gcnNpemU7CisgICAgICAgIG1tYXBfZmxhZyA9IElTX01NQVBQRURfQklUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChIQVZFX01PUkVDT1JFICYmIHRiYXNlID09IENNRkFJTCkgeyAvKiBUcnkgbm9uY29udGlndW91cyBNT1JFQ09SRSAqLworICAgIHNpemVfdCBhc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgVE9QX0ZPT1RfU0laRSArIFNJWkVfVF9PTkUpOworICAgIGlmIChhc2l6ZSA8IEhBTEZfTUFYX1NJWkVfVCkgeworICAgICAgY2hhciogYnIgPSBDTUZBSUw7CisgICAgICBjaGFyKiBlbmQgPSBDTUZBSUw7CisgICAgICBBQ1FVSVJFX01PUkVDT1JFX0xPQ0soKTsKKyAgICAgIGJyID0gKGNoYXIqKShDQUxMX01PUkVDT1JFKGFzaXplKSk7CisgICAgICBlbmQgPSAoY2hhciopKENBTExfTU9SRUNPUkUoMCkpOworICAgICAgUkVMRUFTRV9NT1JFQ09SRV9MT0NLKCk7CisgICAgICBpZiAoYnIgIT0gQ01GQUlMICYmIGVuZCAhPSBDTUZBSUwgJiYgYnIgPCBlbmQpIHsKKyAgICAgICAgc2l6ZV90IHNzaXplID0gZW5kIC0gYnI7CisgICAgICAgIGlmIChzc2l6ZSA+IG5iICsgVE9QX0ZPT1RfU0laRSkgeworICAgICAgICAgIHRiYXNlID0gYnI7CisgICAgICAgICAgdHNpemUgPSBzc2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICh0YmFzZSAhPSBDTUZBSUwpIHsKKworICAgIGlmICgobS0+Zm9vdHByaW50ICs9IHRzaXplKSA+IG0tPm1heF9mb290cHJpbnQpCisgICAgICBtLT5tYXhfZm9vdHByaW50ID0gbS0+Zm9vdHByaW50OworCisgICAgaWYgKCFpc19pbml0aWFsaXplZChtKSkgeyAvKiBmaXJzdC10aW1lIGluaXRpYWxpemF0aW9uICovCisgICAgICBtLT5zZWcuYmFzZSA9IG0tPmxlYXN0X2FkZHIgPSB0YmFzZTsKKyAgICAgIG0tPnNlZy5zaXplID0gdHNpemU7CisgICAgICBzZXRfc2VnbWVudF9mbGFncygmbS0+c2VnLCBtbWFwX2ZsYWcpOworICAgICAgbS0+bWFnaWMgPSBtcGFyYW1zLm1hZ2ljOworICAgICAgaW5pdF9iaW5zKG0pOworICAgICAgaWYgKGlzX2dsb2JhbChtKSkgCisgICAgICAgIGluaXRfdG9wKG0sIChtY2h1bmtwdHIpdGJhc2UsIHRzaXplIC0gVE9QX0ZPT1RfU0laRSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogT2Zmc2V0IHRvcCBieSBlbWJlZGRlZCBtYWxsb2Nfc3RhdGUgKi8KKyAgICAgICAgbWNodW5rcHRyIG1uID0gbmV4dF9jaHVuayhtZW0yY2h1bmsobSkpOworICAgICAgICBpbml0X3RvcChtLCBtbiwgKHNpemVfdCkoKHRiYXNlICsgdHNpemUpIC0gKGNoYXIqKW1uKSAtVE9QX0ZPT1RfU0laRSk7CisgICAgICB9CisgICAgfQorCisgICAgZWxzZSB7CisgICAgICAvKiBUcnkgdG8gbWVyZ2Ugd2l0aCBhbiBleGlzdGluZyBzZWdtZW50ICovCisgICAgICBtc2VnbWVudHB0ciBzcCA9ICZtLT5zZWc7CisgICAgICB3aGlsZSAoc3AgIT0gMCAmJiB0YmFzZSAhPSBzcC0+YmFzZSArIHNwLT5zaXplKQorICAgICAgICBzcCA9IHNwLT5uZXh0OworICAgICAgaWYgKHNwICE9IDAgJiYKKyAgICAgICAgICAhaXNfZXh0ZXJuX3NlZ21lbnQoc3ApICYmCisJICBjaGVja19zZWdtZW50X21lcmdlKHNwLCB0YmFzZSwgdHNpemUpICYmCisgICAgICAgICAgKGdldF9zZWdtZW50X2ZsYWdzKHNwKSAmIElTX01NQVBQRURfQklUKSA9PSBtbWFwX2ZsYWcgJiYKKyAgICAgICAgICBzZWdtZW50X2hvbGRzKHNwLCBtLT50b3ApKSB7IC8qIGFwcGVuZCAqLworICAgICAgICBzcC0+c2l6ZSArPSB0c2l6ZTsKKyAgICAgICAgaW5pdF90b3AobSwgbS0+dG9wLCBtLT50b3BzaXplICsgdHNpemUpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmICh0YmFzZSA8IG0tPmxlYXN0X2FkZHIpCisgICAgICAgICAgbS0+bGVhc3RfYWRkciA9IHRiYXNlOworICAgICAgICBzcCA9ICZtLT5zZWc7CisgICAgICAgIHdoaWxlIChzcCAhPSAwICYmIHNwLT5iYXNlICE9IHRiYXNlICsgdHNpemUpCisgICAgICAgICAgc3AgPSBzcC0+bmV4dDsKKyAgICAgICAgaWYgKHNwICE9IDAgJiYKKyAgICAgICAgICAgICFpc19leHRlcm5fc2VnbWVudChzcCkgJiYKKwkgICAgY2hlY2tfc2VnbWVudF9tZXJnZShzcCwgdGJhc2UsIHRzaXplKSAmJgorICAgICAgICAgICAgKGdldF9zZWdtZW50X2ZsYWdzKHNwKSAmIElTX01NQVBQRURfQklUKSA9PSBtbWFwX2ZsYWcpIHsKKyAgICAgICAgICBjaGFyKiBvbGRiYXNlID0gc3AtPmJhc2U7CisgICAgICAgICAgc3AtPmJhc2UgPSB0YmFzZTsKKyAgICAgICAgICBzcC0+c2l6ZSArPSB0c2l6ZTsKKyAgICAgICAgICByZXR1cm4gcHJlcGVuZF9hbGxvYyhtLCB0YmFzZSwgb2xkYmFzZSwgbmIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBhZGRfc2VnbWVudChtLCB0YmFzZSwgdHNpemUsIG1tYXBfZmxhZyk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5iIDwgbS0+dG9wc2l6ZSkgeyAvKiBBbGxvY2F0ZSBmcm9tIG5ldyBvciBleHRlbmRlZCB0b3Agc3BhY2UgKi8KKyAgICAgIHNpemVfdCByc2l6ZSA9IG0tPnRvcHNpemUgLT0gbmI7CisgICAgICBtY2h1bmtwdHIgcCA9IG0tPnRvcDsKKyAgICAgIG1jaHVua3B0ciByID0gbS0+dG9wID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgci0+aGVhZCA9IHJzaXplIHwgUElOVVNFX0JJVDsKKyAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgcCwgbmIpOworICAgICAgY2hlY2tfdG9wX2NodW5rKG0sIG0tPnRvcCk7CisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtLCBjaHVuazJtZW0ocCksIG5iKTsKKyAgICAgIHJldHVybiBjaHVuazJtZW0ocCk7CisgICAgfQorICB9CisKKyAgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OOworICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIHN5c3RlbSBkZWFsbG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVW5tYXAgYW5kIHVubGluayBhbnkgbW1hcHBlZCBzZWdtZW50cyB0aGF0IGRvbid0IGNvbnRhaW4gdXNlZCBjaHVua3MgKi8KK3N0YXRpYyBzaXplX3QgcmVsZWFzZV91bnVzZWRfc2VnbWVudHMobXN0YXRlIG0pIHsKKyAgc2l6ZV90IHJlbGVhc2VkID0gMDsKKyAgbXNlZ21lbnRwdHIgcHJlZCA9ICZtLT5zZWc7CisgIG1zZWdtZW50cHRyIHNwID0gcHJlZC0+bmV4dDsKKyAgd2hpbGUgKHNwICE9IDApIHsKKyAgICBjaGFyKiBiYXNlID0gc3AtPmJhc2U7CisgICAgc2l6ZV90IHNpemUgPSBzcC0+c2l6ZTsKKyAgICBtc2VnbWVudHB0ciBuZXh0ID0gc3AtPm5leHQ7CisgICAgaWYgKGlzX21tYXBwZWRfc2VnbWVudChzcCkgJiYgIWlzX2V4dGVybl9zZWdtZW50KHNwKSkgeworICAgICAgbWNodW5rcHRyIHAgPSBhbGlnbl9hc19jaHVuayhiYXNlKTsKKyAgICAgIHNpemVfdCBwc2l6ZSA9IGNodW5rc2l6ZShwKTsKKyAgICAgIC8qIENhbiB1bm1hcCBpZiBmaXJzdCBjaHVuayBob2xkcyBlbnRpcmUgc2VnbWVudCBhbmQgbm90IHBpbm5lZCAqLworICAgICAgaWYgKCFjaW51c2UocCkgJiYgKGNoYXIqKXAgKyBwc2l6ZSA+PSBiYXNlICsgc2l6ZSAtIFRPUF9GT09UX1NJWkUpIHsKKyAgICAgICAgdGNodW5rcHRyIHRwID0gKHRjaHVua3B0cilwOworICAgICAgICBhc3NlcnQoc2VnbWVudF9ob2xkcyhzcCwgKGNoYXIqKXNwKSk7CisgICAgICAgIGlmIChwID09IG0tPmR2KSB7CisgICAgICAgICAgbS0+ZHYgPSAwOworICAgICAgICAgIG0tPmR2c2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdW5saW5rX2xhcmdlX2NodW5rKG0sIHRwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ0FMTF9NVU5NQVAoYmFzZSwgc2l6ZSkgPT0gMCkgeworICAgICAgICAgIHJlbGVhc2VkICs9IHNpemU7CisgICAgICAgICAgbS0+Zm9vdHByaW50IC09IHNpemU7CisgICAgICAgICAgLyogdW5saW5rIG9ic29sZXRlZCByZWNvcmQgKi8KKyAgICAgICAgICBzcCA9IHByZWQ7CisgICAgICAgICAgc3AtPm5leHQgPSBuZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvKiBiYWNrIG91dCBpZiBjYW5ub3QgdW5tYXAgKi8KKyAgICAgICAgICBpbnNlcnRfbGFyZ2VfY2h1bmsobSwgdHAsIHBzaXplKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwcmVkID0gc3A7CisgICAgc3AgPSBuZXh0OworICB9CisgIHJldHVybiByZWxlYXNlZDsKK30KKworc3RhdGljIGludCBzeXNfdHJpbShtc3RhdGUgbSwgc2l6ZV90IHBhZCkgeworICBzaXplX3QgcmVsZWFzZWQgPSAwOworICBpZiAocGFkIDwgTUFYX1JFUVVFU1QgJiYgaXNfaW5pdGlhbGl6ZWQobSkpIHsKKyAgICBwYWQgKz0gVE9QX0ZPT1RfU0laRTsgLyogZW5zdXJlIGVub3VnaCByb29tIGZvciBzZWdtZW50IG92ZXJoZWFkICovCisKKyAgICBpZiAobS0+dG9wc2l6ZSA+IHBhZCkgeworICAgICAgLyogU2hyaW5rIHRvcCBzcGFjZSBpbiBncmFudWxhcml0eS1zaXplIHVuaXRzLCBrZWVwaW5nIGF0IGxlYXN0IG9uZSAqLworICAgICAgc2l6ZV90IHVuaXQgPSBtcGFyYW1zLmdyYW51bGFyaXR5OworICAgICAgc2l6ZV90IGV4dHJhID0gKChtLT50b3BzaXplIC0gcGFkICsgKHVuaXQgLSBTSVpFX1RfT05FKSkgLyB1bml0IC0KKyAgICAgICAgICAgICAgICAgICAgICBTSVpFX1RfT05FKSAqIHVuaXQ7CisgICAgICBtc2VnbWVudHB0ciBzcCA9IHNlZ21lbnRfaG9sZGluZyhtLCAoY2hhciopbS0+dG9wKTsKKworICAgICAgaWYgKCFpc19leHRlcm5fc2VnbWVudChzcCkpIHsKKyAgICAgICAgaWYgKGlzX21tYXBwZWRfc2VnbWVudChzcCkpIHsKKyAgICAgICAgICBpZiAoSEFWRV9NTUFQICYmCisgICAgICAgICAgICAgIHNwLT5zaXplID49IGV4dHJhICYmCisgICAgICAgICAgICAgICFoYXNfc2VnbWVudF9saW5rKG0sIHNwKSkgeyAvKiBjYW4ndCBzaHJpbmsgaWYgcGlubmVkICovCisgICAgICAgICAgICBzaXplX3QgbmV3c2l6ZSA9IHNwLT5zaXplIC0gZXh0cmE7CisgICAgICAgICAgICAvKiBQcmVmZXIgbXJlbWFwLCBmYWxsIGJhY2sgdG8gbXVubWFwICovCisgICAgICAgICAgICBpZiAoKENBTExfTVJFTUFQKHNwLT5iYXNlLCBzcC0+c2l6ZSwgbmV3c2l6ZSwgMCkgIT0gTUZBSUwpIHx8CisgICAgICAgICAgICAgICAgKENBTExfTVVOTUFQKHNwLT5iYXNlICsgbmV3c2l6ZSwgZXh0cmEpID09IDApKSB7CisgICAgICAgICAgICAgIHJlbGVhc2VkID0gZXh0cmE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEhBVkVfTU9SRUNPUkUpIHsKKyAgICAgICAgICBpZiAoZXh0cmEgPj0gSEFMRl9NQVhfU0laRV9UKSAvKiBBdm9pZCB3cmFwcGluZyBuZWdhdGl2ZSAqLworICAgICAgICAgICAgZXh0cmEgPSAoSEFMRl9NQVhfU0laRV9UKSArIFNJWkVfVF9PTkUgLSB1bml0OworICAgICAgICAgIEFDUVVJUkVfTU9SRUNPUkVfTE9DSygpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSBlbmQgb2YgbWVtb3J5IGlzIHdoZXJlIHdlIGxhc3Qgc2V0IGl0LiAqLworICAgICAgICAgICAgY2hhciogb2xkX2JyID0gKGNoYXIqKShDQUxMX01PUkVDT1JFKDApKTsKKyAgICAgICAgICAgIGlmIChvbGRfYnIgPT0gc3AtPmJhc2UgKyBzcC0+c2l6ZSkgeworICAgICAgICAgICAgICBjaGFyKiByZWxfYnIgPSAoY2hhciopKENBTExfTU9SRUNPUkUoLWV4dHJhKSk7CisgICAgICAgICAgICAgIGNoYXIqIG5ld19iciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRSgwKSk7CisgICAgICAgICAgICAgIGlmIChyZWxfYnIgIT0gQ01GQUlMICYmIG5ld19iciA8IG9sZF9icikKKyAgICAgICAgICAgICAgICByZWxlYXNlZCA9IG9sZF9iciAtIG5ld19icjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgUkVMRUFTRV9NT1JFQ09SRV9MT0NLKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHJlbGVhc2VkICE9IDApIHsKKyAgICAgICAgc3AtPnNpemUgLT0gcmVsZWFzZWQ7CisgICAgICAgIG0tPmZvb3RwcmludCAtPSByZWxlYXNlZDsKKyAgICAgICAgaW5pdF90b3AobSwgbS0+dG9wLCBtLT50b3BzaXplIC0gcmVsZWFzZWQpOworICAgICAgICBjaGVja190b3BfY2h1bmsobSwgbS0+dG9wKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVbm1hcCBhbnkgdW51c2VkIG1tYXBwZWQgc2VnbWVudHMgKi8KKyAgICBpZiAoSEFWRV9NTUFQKSAKKyAgICAgIHJlbGVhc2VkICs9IHJlbGVhc2VfdW51c2VkX3NlZ21lbnRzKG0pOworCisgICAgLyogT24gZmFpbHVyZSwgZGlzYWJsZSBhdXRvdHJpbSB0byBhdm9pZCByZXBlYXRlZCBmYWlsZWQgZnV0dXJlIGNhbGxzICovCisgICAgaWYgKHJlbGVhc2VkID09IDApCisgICAgICBtLT50cmltX2NoZWNrID0gTUFYX1NJWkVfVDsKKyAgfQorCisgIHJldHVybiAocmVsZWFzZWQgIT0gMCk/IDEgOiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1hbGxvYyBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBhbGxvY2F0ZSBhIGxhcmdlIHJlcXVlc3QgZnJvbSB0aGUgYmVzdCBmaXR0aW5nIGNodW5rIGluIGEgdHJlZWJpbiAqLworc3RhdGljIHZvaWQqIHRtYWxsb2NfbGFyZ2UobXN0YXRlIG0sIHNpemVfdCBuYikgeworICB0Y2h1bmtwdHIgdiA9IDA7CisgIHNpemVfdCByc2l6ZSA9IC1uYjsgLyogVW5zaWduZWQgbmVnYXRpb24gKi8KKyAgdGNodW5rcHRyIHQ7CisgIGJpbmRleF90IGlkeDsKKyAgY29tcHV0ZV90cmVlX2luZGV4KG5iLCBpZHgpOworCisgIGlmICgodCA9ICp0cmVlYmluX2F0KG0sIGlkeCkpICE9IDApIHsKKyAgICAvKiBUcmF2ZXJzZSB0cmVlIGZvciB0aGlzIGJpbiBsb29raW5nIGZvciBub2RlIHdpdGggc2l6ZSA9PSBuYiAqLworICAgIHNpemVfdCBzaXplYml0cyA9IG5iIDw8IGxlZnRzaGlmdF9mb3JfdHJlZV9pbmRleChpZHgpOworICAgIHRjaHVua3B0ciByc3QgPSAwOyAgLyogVGhlIGRlZXBlc3QgdW50YWtlbiByaWdodCBzdWJ0cmVlICovCisgICAgZm9yICg7OykgeworICAgICAgdGNodW5rcHRyIHJ0OworICAgICAgc2l6ZV90IHRyZW0gPSBjaHVua3NpemUodCkgLSBuYjsKKyAgICAgIGlmICh0cmVtIDwgcnNpemUpIHsKKyAgICAgICAgdiA9IHQ7CisgICAgICAgIGlmICgocnNpemUgPSB0cmVtKSA9PSAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcnQgPSB0LT5jaGlsZFsxXTsKKyAgICAgIHQgPSB0LT5jaGlsZFsoc2l6ZWJpdHMgPj4gKFNJWkVfVF9CSVRTSVpFLVNJWkVfVF9PTkUpKSAmIDFdOworICAgICAgaWYgKHJ0ICE9IDAgJiYgcnQgIT0gdCkKKyAgICAgICAgcnN0ID0gcnQ7CisgICAgICBpZiAodCA9PSAwKSB7CisgICAgICAgIHQgPSByc3Q7IC8qIHNldCB0IHRvIGxlYXN0IHN1YnRyZWUgaG9sZGluZyBzaXplcyA+IG5iICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc2l6ZWJpdHMgPDw9IDE7CisgICAgfQorICB9CisKKyAgaWYgKHQgPT0gMCAmJiB2ID09IDApIHsgLyogc2V0IHQgdG8gcm9vdCBvZiBuZXh0IG5vbi1lbXB0eSB0cmVlYmluICovCisgICAgYmlubWFwX3QgbGVmdGJpdHMgPSBsZWZ0X2JpdHMoaWR4MmJpdChpZHgpKSAmIG0tPnRyZWVtYXA7CisgICAgaWYgKGxlZnRiaXRzICE9IDApIHsKKyAgICAgIGJpbmRleF90IGk7CisgICAgICBiaW5tYXBfdCBsZWFzdGJpdCA9IGxlYXN0X2JpdChsZWZ0Yml0cyk7CisgICAgICBjb21wdXRlX2JpdDJpZHgobGVhc3RiaXQsIGkpOworICAgICAgdCA9ICp0cmVlYmluX2F0KG0sIGkpOworICAgIH0KKyAgfQorCisgIHdoaWxlICh0ICE9IDApIHsgLyogZmluZCBzbWFsbGVzdCBvZiB0cmVlIG9yIHN1YnRyZWUgKi8KKyAgICBzaXplX3QgdHJlbSA9IGNodW5rc2l6ZSh0KSAtIG5iOworICAgIGlmICh0cmVtIDwgcnNpemUpIHsKKyAgICAgIHJzaXplID0gdHJlbTsKKyAgICAgIHYgPSB0OworICAgIH0KKyAgICB0ID0gbGVmdG1vc3RfY2hpbGQodCk7CisgIH0KKworICAvKiAgSWYgZHYgaXMgYSBiZXR0ZXIgZml0LCByZXR1cm4gMCBzbyBtYWxsb2Mgd2lsbCB1c2UgaXQgKi8KKyAgaWYgKHYgIT0gMCAmJiByc2l6ZSA8IChzaXplX3QpKG0tPmR2c2l6ZSAtIG5iKSkgeworICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MobSwgdikpKSB7IC8qIHNwbGl0ICovCisgICAgICBtY2h1bmtwdHIgciA9IGNodW5rX3BsdXNfb2Zmc2V0KHYsIG5iKTsKKyAgICAgIGFzc2VydChjaHVua3NpemUodikgPT0gcnNpemUgKyBuYik7CisgICAgICBpZiAoUlRDSEVDSyhva19uZXh0KHYsIHIpKSkgeworICAgICAgICB1bmxpbmtfbGFyZ2VfY2h1bmsobSwgdik7CisgICAgICAgIGlmIChyc2l6ZSA8IE1JTl9DSFVOS19TSVpFKQorICAgICAgICAgIHNldF9pbnVzZV9hbmRfcGludXNlKG0sIHYsIChyc2l6ZSArIG5iKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgdiwgbmIpOworICAgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7CisgICAgICAgICAgaW5zZXJ0X2NodW5rKG0sIHIsIHJzaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2h1bmsybWVtKHYpOworICAgICAgfQorICAgIH0KKyAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihtKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgYSBzbWFsbCByZXF1ZXN0IGZyb20gdGhlIGJlc3QgZml0dGluZyBjaHVuayBpbiBhIHRyZWViaW4gKi8KK3N0YXRpYyB2b2lkKiB0bWFsbG9jX3NtYWxsKG1zdGF0ZSBtLCBzaXplX3QgbmIpIHsKKyAgdGNodW5rcHRyIHQsIHY7CisgIHNpemVfdCByc2l6ZTsKKyAgYmluZGV4X3QgaTsKKyAgYmlubWFwX3QgbGVhc3RiaXQgPSBsZWFzdF9iaXQobS0+dHJlZW1hcCk7CisgIGNvbXB1dGVfYml0MmlkeChsZWFzdGJpdCwgaSk7CisKKyAgdiA9IHQgPSAqdHJlZWJpbl9hdChtLCBpKTsKKyAgcnNpemUgPSBjaHVua3NpemUodCkgLSBuYjsKKworICB3aGlsZSAoKHQgPSBsZWZ0bW9zdF9jaGlsZCh0KSkgIT0gMCkgeworICAgIHNpemVfdCB0cmVtID0gY2h1bmtzaXplKHQpIC0gbmI7CisgICAgaWYgKHRyZW0gPCByc2l6ZSkgeworICAgICAgcnNpemUgPSB0cmVtOworICAgICAgdiA9IHQ7CisgICAgfQorICB9CisKKyAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhtLCB2KSkpIHsKKyAgICBtY2h1bmtwdHIgciA9IGNodW5rX3BsdXNfb2Zmc2V0KHYsIG5iKTsKKyAgICBhc3NlcnQoY2h1bmtzaXplKHYpID09IHJzaXplICsgbmIpOworICAgIGlmIChSVENIRUNLKG9rX25leHQodiwgcikpKSB7CisgICAgICB1bmxpbmtfbGFyZ2VfY2h1bmsobSwgdik7CisgICAgICBpZiAocnNpemUgPCBNSU5fQ0hVTktfU0laRSkKKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobSwgdiwgKHJzaXplICsgbmIpKTsKKyAgICAgIGVsc2UgeworICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHYsIG5iKTsKKyAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHIsIHJzaXplKTsKKyAgICAgICAgcmVwbGFjZV9kdihtLCByLCByc2l6ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gY2h1bmsybWVtKHYpOworICAgIH0KKyAgfQorCisgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKG0pOworICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlYWxsb2Mgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQqIGludGVybmFsX3JlYWxsb2MobXN0YXRlIG0sIHZvaWQqIG9sZG1lbSwgc2l6ZV90IGJ5dGVzKSB7CisgIGlmIChieXRlcyA+PSBNQVhfUkVRVUVTVCkgeworICAgIE1BTExPQ19GQUlMVVJFX0FDVElPTjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIVBSRUFDVElPTihtKSkgeworICAgIG1jaHVua3B0ciBvbGRwID0gbWVtMmNodW5rKG9sZG1lbSk7CisgICAgc2l6ZV90IG9sZHNpemUgPSBjaHVua3NpemUob2xkcCk7CisgICAgbWNodW5rcHRyIG5leHQgPSBjaHVua19wbHVzX29mZnNldChvbGRwLCBvbGRzaXplKTsKKyAgICBtY2h1bmtwdHIgbmV3cCA9IDA7CisgICAgdm9pZCogZXh0cmEgPSAwOworCisgICAgLyogVHJ5IHRvIGVpdGhlciBzaHJpbmsgb3IgZXh0ZW5kIGludG8gdG9wLiBFbHNlIG1hbGxvYy1jb3B5LWZyZWUgKi8KKworICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MobSwgb2xkcCkgJiYgb2tfY2ludXNlKG9sZHApICYmCisgICAgICAgICAgICAgICAgb2tfbmV4dChvbGRwLCBuZXh0KSAmJiBva19waW51c2UobmV4dCkpKSB7CisgICAgICBzaXplX3QgbmIgPSByZXF1ZXN0MnNpemUoYnl0ZXMpOworICAgICAgaWYgKGlzX21tYXBwZWQob2xkcCkpCisgICAgICAgIG5ld3AgPSBtbWFwX3Jlc2l6ZShtLCBvbGRwLCBuYik7CisgICAgICBlbHNlIGlmIChvbGRzaXplID49IG5iKSB7IC8qIGFscmVhZHkgYmlnIGVub3VnaCAqLworICAgICAgICBzaXplX3QgcnNpemUgPSBvbGRzaXplIC0gbmI7CisgICAgICAgIG5ld3AgPSBvbGRwOworICAgICAgICBpZiAocnNpemUgPj0gTUlOX0NIVU5LX1NJWkUpIHsKKyAgICAgICAgICBtY2h1bmtwdHIgcmVtYWluZGVyID0gY2h1bmtfcGx1c19vZmZzZXQobmV3cCwgbmIpOworICAgICAgICAgIHNldF9pbnVzZShtLCBuZXdwLCBuYik7CisgICAgICAgICAgc2V0X2ludXNlKG0sIHJlbWFpbmRlciwgcnNpemUpOworICAgICAgICAgIGV4dHJhID0gY2h1bmsybWVtKHJlbWFpbmRlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG5leHQgPT0gbS0+dG9wICYmIG9sZHNpemUgKyBtLT50b3BzaXplID4gbmIpIHsKKyAgICAgICAgLyogRXhwYW5kIGludG8gdG9wICovCisgICAgICAgIHNpemVfdCBuZXdzaXplID0gb2xkc2l6ZSArIG0tPnRvcHNpemU7CisgICAgICAgIHNpemVfdCBuZXd0b3BzaXplID0gbmV3c2l6ZSAtIG5iOworICAgICAgICBtY2h1bmtwdHIgbmV3dG9wID0gY2h1bmtfcGx1c19vZmZzZXQob2xkcCwgbmIpOworICAgICAgICBzZXRfaW51c2UobSwgb2xkcCwgbmIpOworICAgICAgICBuZXd0b3AtPmhlYWQgPSBuZXd0b3BzaXplIHxQSU5VU0VfQklUOworICAgICAgICBtLT50b3AgPSBuZXd0b3A7CisgICAgICAgIG0tPnRvcHNpemUgPSBuZXd0b3BzaXplOworICAgICAgICBuZXdwID0gb2xkcDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBVU0FHRV9FUlJPUl9BQ1RJT04obSwgb2xkbWVtKTsKKyAgICAgIFBPU1RBQ1RJT04obSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBQT1NUQUNUSU9OKG0pOworCisgICAgaWYgKG5ld3AgIT0gMCkgeworICAgICAgaWYgKGV4dHJhICE9IDApIHsKKyAgICAgICAgaW50ZXJuYWxfZnJlZShtLCBleHRyYSk7CisgICAgICB9CisgICAgICBjaGVja19pbnVzZV9jaHVuayhtLCBuZXdwKTsKKyAgICAgIHJldHVybiBjaHVuazJtZW0obmV3cCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdm9pZCogbmV3bWVtID0gaW50ZXJuYWxfbWFsbG9jKG0sIGJ5dGVzKTsKKyAgICAgIGlmIChuZXdtZW0gIT0gMCkgeworICAgICAgICBzaXplX3Qgb2MgPSBvbGRzaXplIC0gb3ZlcmhlYWRfZm9yKG9sZHApOworICAgICAgICBtZW1jcHkobmV3bWVtLCBvbGRtZW0sIChvYyA8IGJ5dGVzKT8gb2MgOiBieXRlcyk7CisgICAgICAgIGludGVybmFsX2ZyZWUobSwgb2xkbWVtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXdtZW07CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWVtYWxpZ24gc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCogaW50ZXJuYWxfbWVtYWxpZ24obXN0YXRlIG0sIHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBieXRlcykgeworICBpZiAoYWxpZ25tZW50IDw9IE1BTExPQ19BTElHTk1FTlQpICAgIC8qIENhbiBqdXN0IHVzZSBtYWxsb2MgKi8KKyAgICByZXR1cm4gaW50ZXJuYWxfbWFsbG9jKG0sIGJ5dGVzKTsKKyAgaWYgKGFsaWdubWVudCA8ICBNSU5fQ0hVTktfU0laRSkgLyogbXVzdCBiZSBhdCBsZWFzdCBhIG1pbmltdW0gY2h1bmsgc2l6ZSAqLworICAgIGFsaWdubWVudCA9IE1JTl9DSFVOS19TSVpFOworICBpZiAoKGFsaWdubWVudCAmIChhbGlnbm1lbnQtU0laRV9UX09ORSkpICE9IDApIHsvKiBFbnN1cmUgYSBwb3dlciBvZiAyICovCisgICAgc2l6ZV90IGEgPSBNQUxMT0NfQUxJR05NRU5UIDw8IDE7CisgICAgd2hpbGUgKGEgPCBhbGlnbm1lbnQpIGEgPDw9IDE7CisgICAgYWxpZ25tZW50ID0gYTsKKyAgfQorICAKKyAgaWYgKGJ5dGVzID49IE1BWF9SRVFVRVNUIC0gYWxpZ25tZW50KSB7CisgICAgaWYgKG0gIT0gMCkgIHsgLyogVGVzdCBpc24ndCBuZWVkZWQgYnV0IGF2b2lkcyBjb21waWxlciB3YXJuaW5nICovCisgICAgICBNQUxMT0NfRkFJTFVSRV9BQ1RJT047CisgICAgfQorICB9CisgIGVsc2UgeworICAgIHNpemVfdCBuYiA9IHJlcXVlc3Qyc2l6ZShieXRlcyk7CisgICAgc2l6ZV90IHJlcSA9IG5iICsgYWxpZ25tZW50ICsgTUlOX0NIVU5LX1NJWkUgLSBDSFVOS19PVkVSSEVBRDsKKyAgICBjaGFyKiBtZW0gPSAoY2hhciopaW50ZXJuYWxfbWFsbG9jKG0sIHJlcSk7CisgICAgaWYgKG1lbSAhPSAwKSB7CisgICAgICB2b2lkKiBsZWFkZXIgPSAwOworICAgICAgdm9pZCogdHJhaWxlciA9IDA7CisgICAgICBtY2h1bmtwdHIgcCA9IG1lbTJjaHVuayhtZW0pOworCisgICAgICBpZiAoUFJFQUNUSU9OKG0pKSByZXR1cm4gMDsKKyAgICAgIGlmICgoKChzaXplX3QpKG1lbSkpICUgYWxpZ25tZW50KSAhPSAwKSB7IC8qIG1pc2FsaWduZWQgKi8KKyAgICAgICAgLyoKKyAgICAgICAgICBGaW5kIGFuIGFsaWduZWQgc3BvdCBpbnNpZGUgY2h1bmsuICBTaW5jZSB3ZSBuZWVkIHRvIGdpdmUKKyAgICAgICAgICBiYWNrIGxlYWRpbmcgc3BhY2UgaW4gYSBjaHVuayBvZiBhdCBsZWFzdCBNSU5fQ0hVTktfU0laRSwgaWYKKyAgICAgICAgICB0aGUgZmlyc3QgY2FsY3VsYXRpb24gcGxhY2VzIHVzIGF0IGEgc3BvdCB3aXRoIGxlc3MgdGhhbgorICAgICAgICAgIE1JTl9DSFVOS19TSVpFIGxlYWRlciwgd2UgY2FuIG1vdmUgdG8gdGhlIG5leHQgYWxpZ25lZCBzcG90LgorICAgICAgICAgIFdlJ3ZlIGFsbG9jYXRlZCBlbm91Z2ggdG90YWwgcm9vbSBzbyB0aGF0IHRoaXMgaXMgYWx3YXlzCisgICAgICAgICAgcG9zc2libGUuCisgICAgICAgICovCisgICAgICAgIGNoYXIqIGJyID0gKGNoYXIqKW1lbTJjaHVuaygoc2l6ZV90KSgoKHNpemVfdCkobWVtICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVfVF9PTkUpKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYWxpZ25tZW50KSk7CisgICAgICAgIGNoYXIqIHBvcyA9ICgoc2l6ZV90KShiciAtIChjaGFyKikocCkpID49IE1JTl9DSFVOS19TSVpFKT8KKyAgICAgICAgICBiciA6IGJyK2FsaWdubWVudDsKKyAgICAgICAgbWNodW5rcHRyIG5ld3AgPSAobWNodW5rcHRyKXBvczsKKyAgICAgICAgc2l6ZV90IGxlYWRzaXplID0gcG9zIC0gKGNoYXIqKShwKTsKKyAgICAgICAgc2l6ZV90IG5ld3NpemUgPSBjaHVua3NpemUocCkgLSBsZWFkc2l6ZTsKKworICAgICAgICBpZiAoaXNfbW1hcHBlZChwKSkgeyAvKiBGb3IgbW1hcHBlZCBjaHVua3MsIGp1c3QgYWRqdXN0IG9mZnNldCAqLworICAgICAgICAgIG5ld3AtPnByZXZfZm9vdCA9IHAtPnByZXZfZm9vdCArIGxlYWRzaXplOworICAgICAgICAgIG5ld3AtPmhlYWQgPSAobmV3c2l6ZXxDSU5VU0VfQklUKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogT3RoZXJ3aXNlLCBnaXZlIGJhY2sgbGVhZGVyLCB1c2UgdGhlIHJlc3QgKi8KKyAgICAgICAgICBzZXRfaW51c2UobSwgbmV3cCwgbmV3c2l6ZSk7CisgICAgICAgICAgc2V0X2ludXNlKG0sIHAsIGxlYWRzaXplKTsKKyAgICAgICAgICBsZWFkZXIgPSBjaHVuazJtZW0ocCk7CisgICAgICAgIH0KKyAgICAgICAgcCA9IG5ld3A7CisgICAgICB9CisKKyAgICAgIC8qIEdpdmUgYmFjayBzcGFyZSByb29tIGF0IHRoZSBlbmQgKi8KKyAgICAgIGlmICghaXNfbW1hcHBlZChwKSkgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IGNodW5rc2l6ZShwKTsKKyAgICAgICAgaWYgKHNpemUgPiBuYiArIE1JTl9DSFVOS19TSVpFKSB7CisgICAgICAgICAgc2l6ZV90IHJlbWFpbmRlcl9zaXplID0gc2l6ZSAtIG5iOworICAgICAgICAgIG1jaHVua3B0ciByZW1haW5kZXIgPSBjaHVua19wbHVzX29mZnNldChwLCBuYik7CisgICAgICAgICAgc2V0X2ludXNlKG0sIHAsIG5iKTsKKyAgICAgICAgICBzZXRfaW51c2UobSwgcmVtYWluZGVyLCByZW1haW5kZXJfc2l6ZSk7CisgICAgICAgICAgdHJhaWxlciA9IGNodW5rMm1lbShyZW1haW5kZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFzc2VydCAoY2h1bmtzaXplKHApID49IG5iKTsKKyAgICAgIGFzc2VydCgoKChzaXplX3QpKGNodW5rMm1lbShwKSkpICUgYWxpZ25tZW50KSA9PSAwKTsKKyAgICAgIGNoZWNrX2ludXNlX2NodW5rKG0sIHApOworICAgICAgUE9TVEFDVElPTihtKTsKKyAgICAgIGlmIChsZWFkZXIgIT0gMCkgeworICAgICAgICBpbnRlcm5hbF9mcmVlKG0sIGxlYWRlcik7CisgICAgICB9CisgICAgICBpZiAodHJhaWxlciAhPSAwKSB7CisgICAgICAgIGludGVybmFsX2ZyZWUobSwgdHJhaWxlcik7CisgICAgICB9CisgICAgICByZXR1cm4gY2h1bmsybWVtKHApOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbWFsbG9jL2NvYWxsb2Mgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQqKiBpYWxsb2MobXN0YXRlIG0sCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0cywKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNodW5rc1tdKSB7CisgIC8qCisgICAgVGhpcyBwcm92aWRlcyBjb21tb24gc3VwcG9ydCBmb3IgaW5kZXBlbmRlbnRfWCByb3V0aW5lcywgaGFuZGxpbmcKKyAgICBhbGwgb2YgdGhlIGNvbWJpbmF0aW9ucyB0aGF0IGNhbiByZXN1bHQuCisKKyAgICBUaGUgb3B0cyBhcmcgaGFzOgorICAgIGJpdCAwIHNldCBpZiBhbGwgZWxlbWVudHMgYXJlIHNhbWUgc2l6ZSAodXNpbmcgc2l6ZXNbMF0pCisgICAgYml0IDEgc2V0IGlmIGVsZW1lbnRzIHNob3VsZCBiZSB6ZXJvZWQKKyAgKi8KKworICBzaXplX3QgICAgZWxlbWVudF9zaXplOyAgIC8qIGNodW5rc2l6ZSBvZiBlYWNoIGVsZW1lbnQsIGlmIGFsbCBzYW1lICovCisgIHNpemVfdCAgICBjb250ZW50c19zaXplOyAgLyogdG90YWwgc2l6ZSBvZiBlbGVtZW50cyAqLworICBzaXplX3QgICAgYXJyYXlfc2l6ZTsgICAgIC8qIHJlcXVlc3Qgc2l6ZSBvZiBwb2ludGVyIGFycmF5ICovCisgIHZvaWQqICAgICBtZW07ICAgICAgICAgICAgLyogbWFsbG9jZWQgYWdncmVnYXRlIHNwYWNlICovCisgIG1jaHVua3B0ciBwOyAgICAgICAgICAgICAgLyogY29ycmVzcG9uZGluZyBjaHVuayAqLworICBzaXplX3QgICAgcmVtYWluZGVyX3NpemU7IC8qIHJlbWFpbmluZyBieXRlcyB3aGlsZSBzcGxpdHRpbmcgKi8KKyAgdm9pZCoqICAgIG1hcnJheTsgICAgICAgICAvKiBlaXRoZXIgImNodW5rcyIgb3IgbWFsbG9jZWQgcHRyIGFycmF5ICovCisgIG1jaHVua3B0ciBhcnJheV9jaHVuazsgICAgLyogY2h1bmsgZm9yIG1hbGxvY2VkIHB0ciBhcnJheSAqLworICBmbGFnX3QgICAgd2FzX2VuYWJsZWQ7ICAgIC8qIHRvIGRpc2FibGUgbW1hcCAqLworICBzaXplX3QgICAgc2l6ZTsKKyAgc2l6ZV90ICAgIGk7CisKKyAgLyogY29tcHV0ZSBhcnJheSBsZW5ndGgsIGlmIG5lZWRlZCAqLworICBpZiAoY2h1bmtzICE9IDApIHsKKyAgICBpZiAobl9lbGVtZW50cyA9PSAwKQorICAgICAgcmV0dXJuIGNodW5rczsgLyogbm90aGluZyB0byBkbyAqLworICAgIG1hcnJheSA9IGNodW5rczsKKyAgICBhcnJheV9zaXplID0gMDsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBpZiBlbXB0eSByZXEsIG11c3Qgc3RpbGwgcmV0dXJuIGNodW5rIHJlcHJlc2VudGluZyBlbXB0eSBhcnJheSAqLworICAgIGlmIChuX2VsZW1lbnRzID09IDApCisgICAgICByZXR1cm4gKHZvaWQqKilpbnRlcm5hbF9tYWxsb2MobSwgMCk7CisgICAgbWFycmF5ID0gMDsKKyAgICBhcnJheV9zaXplID0gcmVxdWVzdDJzaXplKG5fZWxlbWVudHMgKiAoc2l6ZW9mKHZvaWQqKSkpOworICB9CisKKyAgLyogY29tcHV0ZSB0b3RhbCBlbGVtZW50IHNpemUgKi8KKyAgaWYgKG9wdHMgJiAweDEpIHsgLyogYWxsLXNhbWUtc2l6ZSAqLworICAgIGVsZW1lbnRfc2l6ZSA9IHJlcXVlc3Qyc2l6ZSgqc2l6ZXMpOworICAgIGNvbnRlbnRzX3NpemUgPSBuX2VsZW1lbnRzICogZWxlbWVudF9zaXplOworICB9CisgIGVsc2UgeyAvKiBhZGQgdXAgYWxsIHRoZSBzaXplcyAqLworICAgIGVsZW1lbnRfc2l6ZSA9IDA7CisgICAgY29udGVudHNfc2l6ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSAhPSBuX2VsZW1lbnRzOyArK2kpCisgICAgICBjb250ZW50c19zaXplICs9IHJlcXVlc3Qyc2l6ZShzaXplc1tpXSk7CisgIH0KKworICBzaXplID0gY29udGVudHNfc2l6ZSArIGFycmF5X3NpemU7CisKKyAgLyoKKyAgICAgQWxsb2NhdGUgdGhlIGFnZ3JlZ2F0ZSBjaHVuay4gIEZpcnN0IGRpc2FibGUgZGlyZWN0LW1tYXBwaW5nIHNvCisgICAgIG1hbGxvYyB3b24ndCB1c2UgaXQsIHNpbmNlIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGxhdGVyCisgICAgIGZyZWUvcmVhbGxvYyBzcGFjZSBpbnRlcm5hbCB0byBhIHNlZ3JlZ2F0ZWQgbW1hcCByZWdpb24uCisgICovCisgIHdhc19lbmFibGVkID0gdXNlX21tYXAobSk7CisgIGRpc2FibGVfbW1hcChtKTsKKyAgbWVtID0gaW50ZXJuYWxfbWFsbG9jKG0sIHNpemUgLSBDSFVOS19PVkVSSEVBRCk7CisgIGlmICh3YXNfZW5hYmxlZCkKKyAgICBlbmFibGVfbW1hcChtKTsKKyAgaWYgKG1lbSA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChQUkVBQ1RJT04obSkpIHJldHVybiAwOworICBwID0gbWVtMmNodW5rKG1lbSk7CisgIHJlbWFpbmRlcl9zaXplID0gY2h1bmtzaXplKHApOworCisgIGFzc2VydCghaXNfbW1hcHBlZChwKSk7CisKKyAgaWYgKG9wdHMgJiAweDIpIHsgICAgICAgLyogb3B0aW9uYWxseSBjbGVhciB0aGUgZWxlbWVudHMgKi8KKyAgICBtZW1zZXQoKHNpemVfdCopbWVtLCAwLCByZW1haW5kZXJfc2l6ZSAtIFNJWkVfVF9TSVpFIC0gYXJyYXlfc2l6ZSk7CisgIH0KKworICAvKiBJZiBub3QgcHJvdmlkZWQsIGFsbG9jYXRlIHRoZSBwb2ludGVyIGFycmF5IGFzIGZpbmFsIHBhcnQgb2YgY2h1bmsgKi8KKyAgaWYgKG1hcnJheSA9PSAwKSB7CisgICAgc2l6ZV90ICBhcnJheV9jaHVua19zaXplOworICAgIGFycmF5X2NodW5rID0gY2h1bmtfcGx1c19vZmZzZXQocCwgY29udGVudHNfc2l6ZSk7CisgICAgYXJyYXlfY2h1bmtfc2l6ZSA9IHJlbWFpbmRlcl9zaXplIC0gY29udGVudHNfc2l6ZTsKKyAgICBtYXJyYXkgPSAodm9pZCoqKSAoY2h1bmsybWVtKGFycmF5X2NodW5rKSk7CisgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCBhcnJheV9jaHVuaywgYXJyYXlfY2h1bmtfc2l6ZSk7CisgICAgcmVtYWluZGVyX3NpemUgPSBjb250ZW50c19zaXplOworICB9CisKKyAgLyogc3BsaXQgb3V0IGVsZW1lbnRzICovCisgIGZvciAoaSA9IDA7IDsgKytpKSB7CisgICAgbWFycmF5W2ldID0gY2h1bmsybWVtKHApOworICAgIGlmIChpICE9IG5fZWxlbWVudHMtMSkgeworICAgICAgaWYgKGVsZW1lbnRfc2l6ZSAhPSAwKQorICAgICAgICBzaXplID0gZWxlbWVudF9zaXplOworICAgICAgZWxzZQorICAgICAgICBzaXplID0gcmVxdWVzdDJzaXplKHNpemVzW2ldKTsKKyAgICAgIHJlbWFpbmRlcl9zaXplIC09IHNpemU7CisgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHAsIHNpemUpOworICAgICAgcCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIHNpemUpOworICAgIH0KKyAgICBlbHNlIHsgLyogdGhlIGZpbmFsIGVsZW1lbnQgYWJzb3JicyBhbnkgb3ZlcmFsbG9jYXRpb24gc2xvcCAqLworICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCBwLCByZW1haW5kZXJfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworI2lmIERFQlVHCisgIGlmIChtYXJyYXkgIT0gY2h1bmtzKSB7CisgICAgLyogZmluYWwgZWxlbWVudCBtdXN0IGhhdmUgZXhhY3RseSBleGhhdXN0ZWQgY2h1bmsgKi8KKyAgICBpZiAoZWxlbWVudF9zaXplICE9IDApIHsKKyAgICAgIGFzc2VydChyZW1haW5kZXJfc2l6ZSA9PSBlbGVtZW50X3NpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGFzc2VydChyZW1haW5kZXJfc2l6ZSA9PSByZXF1ZXN0MnNpemUoc2l6ZXNbaV0pKTsKKyAgICB9CisgICAgY2hlY2tfaW51c2VfY2h1bmsobSwgbWVtMmNodW5rKG1hcnJheSkpOworICB9CisgIGZvciAoaSA9IDA7IGkgIT0gbl9lbGVtZW50czsgKytpKQorICAgIGNoZWNrX2ludXNlX2NodW5rKG0sIG1lbTJjaHVuayhtYXJyYXlbaV0pKTsKKworI2VuZGlmIC8qIERFQlVHICovCisKKyAgUE9TVEFDVElPTihtKTsKKyAgcmV0dXJuIG1hcnJheTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwdWJsaWMgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgIU9OTFlfTVNQQUNFUworCit2b2lkKiBkbG1hbGxvYyhzaXplX3QgYnl0ZXMpIHsKKyAgLyoKKyAgICAgQmFzaWMgYWxnb3JpdGhtOgorICAgICBJZiBhIHNtYWxsIHJlcXVlc3QgKDwgMjU2IGJ5dGVzIG1pbnVzIHBlci1jaHVuayBvdmVyaGVhZCk6CisgICAgICAgMS4gSWYgb25lIGV4aXN0cywgdXNlIGEgcmVtYWluZGVybGVzcyBjaHVuayBpbiBhc3NvY2lhdGVkIHNtYWxsYmluLgorICAgICAgICAgIChSZW1haW5kZXJsZXNzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHRvbyBmZXcgZXhjZXNzIGJ5dGVzIHRvCisgICAgICAgICAgcmVwcmVzZW50IGFzIGEgY2h1bmsuKQorICAgICAgIDIuIElmIGl0IGlzIGJpZyBlbm91Z2gsIHVzZSB0aGUgZHYgY2h1bmssIHdoaWNoIGlzIG5vcm1hbGx5IHRoZQorICAgICAgICAgIGNodW5rIGFkamFjZW50IHRvIHRoZSBvbmUgdXNlZCBmb3IgdGhlIG1vc3QgcmVjZW50IHNtYWxsIHJlcXVlc3QuCisgICAgICAgMy4gSWYgb25lIGV4aXN0cywgc3BsaXQgdGhlIHNtYWxsZXN0IGF2YWlsYWJsZSBjaHVuayBpbiBhIGJpbiwKKyAgICAgICAgICBzYXZpbmcgcmVtYWluZGVyIGluIGR2LgorICAgICAgIDQuIElmIGl0IGlzIGJpZyBlbm91Z2gsIHVzZSB0aGUgdG9wIGNodW5rLgorICAgICAgIDUuIElmIGF2YWlsYWJsZSwgZ2V0IG1lbW9yeSBmcm9tIHN5c3RlbSBhbmQgdXNlIGl0CisgICAgIE90aGVyd2lzZSwgZm9yIGEgbGFyZ2UgcmVxdWVzdDoKKyAgICAgICAxLiBGaW5kIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgYmlubmVkIGNodW5rIHRoYXQgZml0cywgYW5kIHVzZSBpdAorICAgICAgICAgIGlmIGl0IGlzIGJldHRlciBmaXR0aW5nIHRoYW4gZHYgY2h1bmssIHNwbGl0dGluZyBpZiBuZWNlc3NhcnkuCisgICAgICAgMi4gSWYgYmV0dGVyIGZpdHRpbmcgdGhhbiBhbnkgYmlubmVkIGNodW5rLCB1c2UgdGhlIGR2IGNodW5rLgorICAgICAgIDMuIElmIGl0IGlzIGJpZyBlbm91Z2gsIHVzZSB0aGUgdG9wIGNodW5rLgorICAgICAgIDQuIElmIHJlcXVlc3Qgc2l6ZSA+PSBtbWFwIHRocmVzaG9sZCwgdHJ5IHRvIGRpcmVjdGx5IG1tYXAgdGhpcyBjaHVuay4KKyAgICAgICA1LiBJZiBhdmFpbGFibGUsIGdldCBtZW1vcnkgZnJvbSBzeXN0ZW0gYW5kIHVzZSBpdAorCisgICAgIFRoZSB1Z2x5IGdvdG8ncyBoZXJlIGVuc3VyZSB0aGF0IHBvc3RhY3Rpb24gb2NjdXJzIGFsb25nIGFsbCBwYXRocy4KKyAgKi8KKworICBpZiAoIVBSRUFDVElPTihnbSkpIHsKKyAgICB2b2lkKiBtZW07CisgICAgc2l6ZV90IG5iOworICAgIGlmIChieXRlcyA8PSBNQVhfU01BTExfUkVRVUVTVCkgeworICAgICAgYmluZGV4X3QgaWR4OworICAgICAgYmlubWFwX3Qgc21hbGxiaXRzOworICAgICAgbmIgPSAoYnl0ZXMgPCBNSU5fUkVRVUVTVCk/IE1JTl9DSFVOS19TSVpFIDogcGFkX3JlcXVlc3QoYnl0ZXMpOworICAgICAgaWR4ID0gc21hbGxfaW5kZXgobmIpOworICAgICAgc21hbGxiaXRzID0gZ20tPnNtYWxsbWFwID4+IGlkeDsKKworICAgICAgaWYgKChzbWFsbGJpdHMgJiAweDNVKSAhPSAwKSB7IC8qIFJlbWFpbmRlcmxlc3MgZml0IHRvIGEgc21hbGxiaW4uICovCisgICAgICAgIG1jaHVua3B0ciBiLCBwOworICAgICAgICBpZHggKz0gfnNtYWxsYml0cyAmIDE7ICAgICAgIC8qIFVzZXMgbmV4dCBiaW4gaWYgaWR4IGVtcHR5ICovCisgICAgICAgIGIgPSBzbWFsbGJpbl9hdChnbSwgaWR4KTsKKyAgICAgICAgcCA9IGItPmZkOworICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHApID09IHNtYWxsX2luZGV4MnNpemUoaWR4KSk7CisgICAgICAgIHVubGlua19maXJzdF9zbWFsbF9jaHVuayhnbSwgYiwgcCwgaWR4KTsKKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UoZ20sIHAsIHNtYWxsX2luZGV4MnNpemUoaWR4KSk7CisgICAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKKyAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOworICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKG5iID4gZ20tPmR2c2l6ZSkgeworICAgICAgICBpZiAoc21hbGxiaXRzICE9IDApIHsgLyogVXNlIGNodW5rIGluIG5leHQgbm9uZW1wdHkgc21hbGxiaW4gKi8KKyAgICAgICAgICBtY2h1bmtwdHIgYiwgcCwgcjsKKyAgICAgICAgICBzaXplX3QgcnNpemU7CisgICAgICAgICAgYmluZGV4X3QgaTsKKyAgICAgICAgICBiaW5tYXBfdCBsZWZ0Yml0cyA9IChzbWFsbGJpdHMgPDwgaWR4KSAmIGxlZnRfYml0cyhpZHgyYml0KGlkeCkpOworICAgICAgICAgIGJpbm1hcF90IGxlYXN0Yml0ID0gbGVhc3RfYml0KGxlZnRiaXRzKTsKKyAgICAgICAgICBjb21wdXRlX2JpdDJpZHgobGVhc3RiaXQsIGkpOworICAgICAgICAgIGIgPSBzbWFsbGJpbl9hdChnbSwgaSk7CisgICAgICAgICAgcCA9IGItPmZkOworICAgICAgICAgIGFzc2VydChjaHVua3NpemUocCkgPT0gc21hbGxfaW5kZXgyc2l6ZShpKSk7CisgICAgICAgICAgdW5saW5rX2ZpcnN0X3NtYWxsX2NodW5rKGdtLCBiLCBwLCBpKTsKKyAgICAgICAgICByc2l6ZSA9IHNtYWxsX2luZGV4MnNpemUoaSkgLSBuYjsKKyAgICAgICAgICAvKiBGaXQgaGVyZSBjYW5ub3QgYmUgcmVtYWluZGVybGVzcyBpZiA0Ynl0ZSBzaXplcyAqLworICAgICAgICAgIGlmIChTSVpFX1RfU0laRSAhPSA0ICYmIHJzaXplIDwgTUlOX0NIVU5LX1NJWkUpCisgICAgICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShnbSwgcCwgc21hbGxfaW5kZXgyc2l6ZShpKSk7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKGdtLCBwLCBuYik7CisgICAgICAgICAgICByID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHIsIHJzaXplKTsKKyAgICAgICAgICAgIHJlcGxhY2VfZHYoZ20sIHIsIHJzaXplKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVtID0gY2h1bmsybWVtKHApOworICAgICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKGdtLCBtZW0sIG5iKTsKKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChnbS0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX3NtYWxsKGdtLCBuYikpICE9IDApIHsKKyAgICAgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhnbSwgbWVtLCBuYik7CisgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzID49IE1BWF9SRVFVRVNUKQorICAgICAgbmIgPSBNQVhfU0laRV9UOyAvKiBUb28gYmlnIHRvIGFsbG9jYXRlLiBGb3JjZSBmYWlsdXJlIChpbiBzeXMgYWxsb2MpICovCisgICAgZWxzZSB7CisgICAgICBuYiA9IHBhZF9yZXF1ZXN0KGJ5dGVzKTsKKyAgICAgIGlmIChnbS0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX2xhcmdlKGdtLCBuYikpICE9IDApIHsKKyAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOworICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5iIDw9IGdtLT5kdnNpemUpIHsKKyAgICAgIHNpemVfdCByc2l6ZSA9IGdtLT5kdnNpemUgLSBuYjsKKyAgICAgIG1jaHVua3B0ciBwID0gZ20tPmR2OworICAgICAgaWYgKHJzaXplID49IE1JTl9DSFVOS19TSVpFKSB7IC8qIHNwbGl0IGR2ICovCisgICAgICAgIG1jaHVua3B0ciByID0gZ20tPmR2ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgICBnbS0+ZHZzaXplID0gcnNpemU7CisgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7CisgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsoZ20sIHAsIG5iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeyAvKiBleGhhdXN0IGR2ICovCisgICAgICAgIHNpemVfdCBkdnMgPSBnbS0+ZHZzaXplOworICAgICAgICBnbS0+ZHZzaXplID0gMDsKKyAgICAgICAgZ20tPmR2ID0gMDsKKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UoZ20sIHAsIGR2cyk7CisgICAgICB9CisgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7CisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhnbSwgbWVtLCBuYik7CisgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgfQorCisgICAgZWxzZSBpZiAobmIgPCBnbS0+dG9wc2l6ZSkgeyAvKiBTcGxpdCB0b3AgKi8KKyAgICAgIHNpemVfdCByc2l6ZSA9IGdtLT50b3BzaXplIC09IG5iOworICAgICAgbWNodW5rcHRyIHAgPSBnbS0+dG9wOworICAgICAgbWNodW5rcHRyIHIgPSBnbS0+dG9wID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgci0+aGVhZCA9IHJzaXplIHwgUElOVVNFX0JJVDsKKyAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsoZ20sIHAsIG5iKTsKKyAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKKyAgICAgIGNoZWNrX3RvcF9jaHVuayhnbSwgZ20tPnRvcCk7CisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhnbSwgbWVtLCBuYik7CisgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgfQorCisgICAgbWVtID0gc3lzX2FsbG9jKGdtLCBuYik7CisKKyAgcG9zdGFjdGlvbjoKKyAgICBQT1NUQUNUSU9OKGdtKTsKKyAgICByZXR1cm4gbWVtOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGxmcmVlKHZvaWQqIG1lbSkgeworICAvKgorICAgICBDb25zb2xpZGF0ZSBmcmVlZCBjaHVua3Mgd2l0aCBwcmVjZWRpbmcgb3Igc3VjY2VlZGluZyBib3JkZXJpbmcKKyAgICAgZnJlZSBjaHVua3MsIGlmIHRoZXkgZXhpc3QsIGFuZCB0aGVuIHBsYWNlIGluIGEgYmluLiAgSW50ZXJtaXhlZAorICAgICB3aXRoIHNwZWNpYWwgY2FzZXMgZm9yIHRvcCwgZHYsIG1tYXBwZWQgY2h1bmtzLCBhbmQgdXNhZ2UgZXJyb3JzLgorICAqLworCisgIGlmIChtZW0gIT0gMCkgeworICAgIG1jaHVua3B0ciBwICA9IG1lbTJjaHVuayhtZW0pOworI2lmIEZPT1RFUlMKKyAgICBtc3RhdGUgZm0gPSBnZXRfbXN0YXRlX2ZvcihwKTsKKyAgICBpZiAoIW9rX21hZ2ljKGZtKSkgeworICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKGZtLCBwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZWxzZSAvKiBGT09URVJTICovCisjZGVmaW5lIGZtIGdtCisjZW5kaWYgLyogRk9PVEVSUyAqLworICAgIGlmICghUFJFQUNUSU9OKGZtKSkgeworICAgICAgY2hlY2tfaW51c2VfY2h1bmsoZm0sIHApOworICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcCkgJiYgb2tfY2ludXNlKHApKSkgeworICAgICAgICBzaXplX3QgcHNpemUgPSBjaHVua3NpemUocCk7CisgICAgICAgIG1jaHVua3B0ciBuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpOworICAgICAgICBpZiAoIXBpbnVzZShwKSkgeworICAgICAgICAgIHNpemVfdCBwcmV2c2l6ZSA9IHAtPnByZXZfZm9vdDsKKyAgICAgICAgICBpZiAoKHByZXZzaXplICYgSVNfTU1BUFBFRF9CSVQpICE9IDApIHsKKyAgICAgICAgICAgIHByZXZzaXplICY9IH5JU19NTUFQUEVEX0JJVDsKKyAgICAgICAgICAgIHBzaXplICs9IHByZXZzaXplICsgTU1BUF9GT09UX1BBRDsKKyAgICAgICAgICAgIGlmIChDQUxMX01VTk1BUCgoY2hhciopcCAtIHByZXZzaXplLCBwc2l6ZSkgPT0gMCkKKyAgICAgICAgICAgICAgZm0tPmZvb3RwcmludCAtPSBwc2l6ZTsKKyAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtY2h1bmtwdHIgcHJldiA9IGNodW5rX21pbnVzX29mZnNldChwLCBwcmV2c2l6ZSk7CisgICAgICAgICAgICBwc2l6ZSArPSBwcmV2c2l6ZTsKKyAgICAgICAgICAgIHAgPSBwcmV2OworICAgICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcHJldikpKSB7IC8qIGNvbnNvbGlkYXRlIGJhY2t3YXJkICovCisgICAgICAgICAgICAgIGlmIChwICE9IGZtLT5kdikgeworICAgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgcCwgcHJldnNpemUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKChuZXh0LT5oZWFkICYgSU5VU0VfQklUUykgPT0gSU5VU0VfQklUUykgeworICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSBwc2l6ZTsKKyAgICAgICAgICAgICAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShwLCBwc2l6ZSwgbmV4dCk7CisgICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGdvdG8gZXJyb3JhY3Rpb247CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFJUQ0hFQ0sob2tfbmV4dChwLCBuZXh0KSAmJiBva19waW51c2UobmV4dCkpKSB7CisgICAgICAgICAgaWYgKCFjaW51c2UobmV4dCkpIHsgIC8qIGNvbnNvbGlkYXRlIGZvcndhcmQgKi8KKyAgICAgICAgICAgIGlmIChuZXh0ID09IGZtLT50b3ApIHsKKyAgICAgICAgICAgICAgc2l6ZV90IHRzaXplID0gZm0tPnRvcHNpemUgKz0gcHNpemU7CisgICAgICAgICAgICAgIGZtLT50b3AgPSBwOworICAgICAgICAgICAgICBwLT5oZWFkID0gdHNpemUgfCBQSU5VU0VfQklUOworICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgICBmbS0+ZHYgPSAwOworICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzaG91bGRfdHJpbShmbSwgdHNpemUpKQorICAgICAgICAgICAgICAgIHN5c190cmltKGZtLCAwKTsKKyAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgc2l6ZV90IGRzaXplID0gZm0tPmR2c2l6ZSArPSBwc2l6ZTsKKyAgICAgICAgICAgICAgZm0tPmR2ID0gcDsKKyAgICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIGRzaXplKTsKKyAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHNpemVfdCBuc2l6ZSA9IGNodW5rc2l6ZShuZXh0KTsKKyAgICAgICAgICAgICAgcHNpemUgKz0gbnNpemU7CisgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgbmV4dCwgbnNpemUpOworICAgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgcHNpemUpOworICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgICBmbS0+ZHZzaXplID0gcHNpemU7CisgICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHBzaXplLCBuZXh0KTsKKyAgICAgICAgICBpbnNlcnRfY2h1bmsoZm0sIHAsIHBzaXplKTsKKyAgICAgICAgICBjaGVja19mcmVlX2NodW5rKGZtLCBwKTsKKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBlcnJvcmFjdGlvbjoKKyAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihmbSwgcCk7CisgICAgcG9zdGFjdGlvbjoKKyAgICAgIFBPU1RBQ1RJT04oZm0pOworICAgIH0KKyAgfQorI2lmICFGT09URVJTCisjdW5kZWYgZm0KKyNlbmRpZiAvKiBGT09URVJTICovCit9CisKK3ZvaWQqIGRsY2FsbG9jKHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbV9zaXplKSB7CisgIHZvaWQqIG1lbTsKKyAgc2l6ZV90IHJlcSA9IDA7CisgIGlmIChuX2VsZW1lbnRzICE9IDApIHsKKyAgICByZXEgPSBuX2VsZW1lbnRzICogZWxlbV9zaXplOworICAgIGlmICgoKG5fZWxlbWVudHMgfCBlbGVtX3NpemUpICYgfihzaXplX3QpMHhmZmZmKSAmJgorICAgICAgICAocmVxIC8gbl9lbGVtZW50cyAhPSBlbGVtX3NpemUpKQorICAgICAgcmVxID0gTUFYX1NJWkVfVDsgLyogZm9yY2UgZG93bnN0cmVhbSBmYWlsdXJlIG9uIG92ZXJmbG93ICovCisgIH0KKyAgbWVtID0gZGxtYWxsb2MocmVxKTsKKyAgaWYgKG1lbSAhPSAwICYmIGNhbGxvY19tdXN0X2NsZWFyKG1lbTJjaHVuayhtZW0pKSkKKyAgICBtZW1zZXQobWVtLCAwLCByZXEpOworICByZXR1cm4gbWVtOworfQorCit2b2lkKiBkbHJlYWxsb2Modm9pZCogb2xkbWVtLCBzaXplX3QgYnl0ZXMpIHsKKyAgaWYgKG9sZG1lbSA9PSAwKQorICAgIHJldHVybiBkbG1hbGxvYyhieXRlcyk7CisjaWZkZWYgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTCisgIGlmIChieXRlcyA9PSAwKSB7CisgICAgZGxmcmVlKG9sZG1lbSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZiAvKiBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgKi8KKyAgZWxzZSB7CisjaWYgISBGT09URVJTCisgICAgbXN0YXRlIG0gPSBnbTsKKyNlbHNlIC8qIEZPT1RFUlMgKi8KKyAgICBtc3RhdGUgbSA9IGdldF9tc3RhdGVfZm9yKG1lbTJjaHVuayhvbGRtZW0pKTsKKyAgICBpZiAoIW9rX21hZ2ljKG0pKSB7CisgICAgICBVU0FHRV9FUlJPUl9BQ1RJT04obSwgb2xkbWVtKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZiAvKiBGT09URVJTICovCisgICAgcmV0dXJuIGludGVybmFsX3JlYWxsb2MobSwgb2xkbWVtLCBieXRlcyk7CisgIH0KK30KKwordm9pZCogZGxtZW1hbGlnbihzaXplX3QgYWxpZ25tZW50LCBzaXplX3QgYnl0ZXMpIHsKKyAgcmV0dXJuIGludGVybmFsX21lbWFsaWduKGdtLCBhbGlnbm1lbnQsIGJ5dGVzKTsKK30KKwordm9pZCoqIGRsaW5kZXBlbmRlbnRfY2FsbG9jKHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2h1bmtzW10pIHsKKyAgc2l6ZV90IHN6ID0gZWxlbV9zaXplOyAvKiBzZXJ2ZXMgYXMgMS1lbGVtZW50IGFycmF5ICovCisgIHJldHVybiBpYWxsb2MoZ20sIG5fZWxlbWVudHMsICZzeiwgMywgY2h1bmtzKTsKK30KKwordm9pZCoqIGRsaW5kZXBlbmRlbnRfY29tYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBzaXplc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjaHVua3NbXSkgeworICByZXR1cm4gaWFsbG9jKGdtLCBuX2VsZW1lbnRzLCBzaXplcywgMCwgY2h1bmtzKTsKK30KKwordm9pZCogZGx2YWxsb2Moc2l6ZV90IGJ5dGVzKSB7CisgIHNpemVfdCBwYWdlc3o7CisgIGluaXRfbXBhcmFtcygpOworICBwYWdlc3ogPSBtcGFyYW1zLnBhZ2Vfc2l6ZTsKKyAgcmV0dXJuIGRsbWVtYWxpZ24ocGFnZXN6LCBieXRlcyk7Cit9CisKK3ZvaWQqIGRscHZhbGxvYyhzaXplX3QgYnl0ZXMpIHsKKyAgc2l6ZV90IHBhZ2VzejsKKyAgaW5pdF9tcGFyYW1zKCk7CisgIHBhZ2VzeiA9IG1wYXJhbXMucGFnZV9zaXplOworICByZXR1cm4gZGxtZW1hbGlnbihwYWdlc3osIChieXRlcyArIHBhZ2VzeiAtIFNJWkVfVF9PTkUpICYgfihwYWdlc3ogLSBTSVpFX1RfT05FKSk7Cit9CisKK2ludCBkbG1hbGxvY190cmltKHNpemVfdCBwYWQpIHsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGlmICghUFJFQUNUSU9OKGdtKSkgeworICAgIHJlc3VsdCA9IHN5c190cmltKGdtLCBwYWQpOworICAgIFBPU1RBQ1RJT04oZ20pOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3NpemVfdCBkbG1hbGxvY19mb290cHJpbnQodm9pZCkgeworICByZXR1cm4gZ20tPmZvb3RwcmludDsKK30KKworc2l6ZV90IGRsbWFsbG9jX21heF9mb290cHJpbnQodm9pZCkgeworICByZXR1cm4gZ20tPm1heF9mb290cHJpbnQ7Cit9CisKKyNpZiAhTk9fTUFMTElORk8KK3N0cnVjdCBtYWxsaW5mbyBkbG1hbGxpbmZvKHZvaWQpIHsKKyAgcmV0dXJuIGludGVybmFsX21hbGxpbmZvKGdtKTsKK30KKyNlbmRpZiAvKiBOT19NQUxMSU5GTyAqLworCit2b2lkIGRsbWFsbG9jX3N0YXRzKCkgeworICBpbnRlcm5hbF9tYWxsb2Nfc3RhdHMoZ20pOworfQorCitzaXplX3QgZGxtYWxsb2NfdXNhYmxlX3NpemUodm9pZCogbWVtKSB7CisgIGlmIChtZW0gIT0gMCkgeworICAgIG1jaHVua3B0ciBwID0gbWVtMmNodW5rKG1lbSk7CisgICAgaWYgKGNpbnVzZShwKSkKKyAgICAgIHJldHVybiBjaHVua3NpemUocCkgLSBvdmVyaGVhZF9mb3IocCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBkbG1hbGxvcHQoaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7CisgIHJldHVybiBjaGFuZ2VfbXBhcmFtKHBhcmFtX251bWJlciwgdmFsdWUpOworfQorCisjZW5kaWYgLyogIU9OTFlfTVNQQUNFUyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB1c2VyIG1zcGFjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgTVNQQUNFUworCitzdGF0aWMgbXN0YXRlIGluaXRfdXNlcl9tc3RhdGUoY2hhciogdGJhc2UsIHNpemVfdCB0c2l6ZSkgeworICBzaXplX3QgbXNpemUgPSBwYWRfcmVxdWVzdChzaXplb2Yoc3RydWN0IG1hbGxvY19zdGF0ZSkpOworICBtY2h1bmtwdHIgbW47CisgIG1jaHVua3B0ciBtc3AgPSBhbGlnbl9hc19jaHVuayh0YmFzZSk7CisgIG1zdGF0ZSBtID0gKG1zdGF0ZSkoY2h1bmsybWVtKG1zcCkpOworICBtZW1zZXQobSwgMCwgbXNpemUpOworICBJTklUSUFMX0xPQ0soJm0tPm11dGV4KTsKKyAgbXNwLT5oZWFkID0gKG1zaXplfFBJTlVTRV9CSVR8Q0lOVVNFX0JJVCk7CisgIG0tPnNlZy5iYXNlID0gbS0+bGVhc3RfYWRkciA9IHRiYXNlOworICBtLT5zZWcuc2l6ZSA9IG0tPmZvb3RwcmludCA9IG0tPm1heF9mb290cHJpbnQgPSB0c2l6ZTsKKyAgbS0+bWFnaWMgPSBtcGFyYW1zLm1hZ2ljOworICBtLT5tZmxhZ3MgPSBtcGFyYW1zLmRlZmF1bHRfbWZsYWdzOworICBkaXNhYmxlX2NvbnRpZ3VvdXMobSk7CisgIGluaXRfYmlucyhtKTsKKyAgbW4gPSBuZXh0X2NodW5rKG1lbTJjaHVuayhtKSk7CisgIGluaXRfdG9wKG0sIG1uLCAoc2l6ZV90KSgodGJhc2UgKyB0c2l6ZSkgLSAoY2hhciopbW4pIC0gVE9QX0ZPT1RfU0laRSk7CisgIGNoZWNrX3RvcF9jaHVuayhtLCBtLT50b3ApOworICByZXR1cm4gbTsKK30KKworbXNwYWNlIGNyZWF0ZV9tc3BhY2Uoc2l6ZV90IGNhcGFjaXR5LCBpbnQgbG9ja2VkKSB7CisgIG1zdGF0ZSBtID0gMDsKKyAgc2l6ZV90IG1zaXplID0gcGFkX3JlcXVlc3Qoc2l6ZW9mKHN0cnVjdCBtYWxsb2Nfc3RhdGUpKTsKKyAgaW5pdF9tcGFyYW1zKCk7IC8qIEVuc3VyZSBwYWdlc2l6ZSBldGMgaW5pdGlhbGl6ZWQgKi8KKworICBpZiAoY2FwYWNpdHkgPCAoc2l6ZV90KSAtKG1zaXplICsgVE9QX0ZPT1RfU0laRSArIG1wYXJhbXMucGFnZV9zaXplKSkgeworICAgIHNpemVfdCBycyA9ICgoY2FwYWNpdHkgPT0gMCk/IG1wYXJhbXMuZ3JhbnVsYXJpdHkgOgorICAgICAgICAgICAgICAgICAoY2FwYWNpdHkgKyBUT1BfRk9PVF9TSVpFICsgbXNpemUpKTsKKyAgICBzaXplX3QgdHNpemUgPSBncmFudWxhcml0eV9hbGlnbihycyk7CisgICAgY2hhciogdGJhc2UgPSAoY2hhciopKENBTExfTU1BUCh0c2l6ZSkpOworICAgIGlmICh0YmFzZSAhPSBDTUZBSUwpIHsKKyAgICAgIG0gPSBpbml0X3VzZXJfbXN0YXRlKHRiYXNlLCB0c2l6ZSk7CisgICAgICBzZXRfc2VnbWVudF9mbGFncygmbS0+c2VnLCBJU19NTUFQUEVEX0JJVCk7CisgICAgICBzZXRfbG9jayhtLCBsb2NrZWQpOworICAgIH0KKyAgfQorICByZXR1cm4gKG1zcGFjZSltOworfQorCittc3BhY2UgY3JlYXRlX21zcGFjZV93aXRoX2Jhc2Uodm9pZCogYmFzZSwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgbG9ja2VkKSB7CisgIG1zdGF0ZSBtID0gMDsKKyAgc2l6ZV90IG1zaXplID0gcGFkX3JlcXVlc3Qoc2l6ZW9mKHN0cnVjdCBtYWxsb2Nfc3RhdGUpKTsKKyAgaW5pdF9tcGFyYW1zKCk7IC8qIEVuc3VyZSBwYWdlc2l6ZSBldGMgaW5pdGlhbGl6ZWQgKi8KKworICBpZiAoY2FwYWNpdHkgPiBtc2l6ZSArIFRPUF9GT09UX1NJWkUgJiYKKyAgICAgIGNhcGFjaXR5IDwgKHNpemVfdCkgLShtc2l6ZSArIFRPUF9GT09UX1NJWkUgKyBtcGFyYW1zLnBhZ2Vfc2l6ZSkpIHsKKyAgICBtID0gaW5pdF91c2VyX21zdGF0ZSgoY2hhciopYmFzZSwgY2FwYWNpdHkpOworICAgIHNldF9zZWdtZW50X2ZsYWdzKCZtLT5zZWcsIEVYVEVSTl9CSVQpOworICAgIHNldF9sb2NrKG0sIGxvY2tlZCk7CisgIH0KKyAgcmV0dXJuIChtc3BhY2UpbTsKK30KKworc2l6ZV90IGRlc3Ryb3lfbXNwYWNlKG1zcGFjZSBtc3ApIHsKKyAgc2l6ZV90IGZyZWVkID0gMDsKKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmIChva19tYWdpYyhtcykpIHsKKyAgICBtc2VnbWVudHB0ciBzcCA9ICZtcy0+c2VnOworICAgIHdoaWxlIChzcCAhPSAwKSB7CisgICAgICBjaGFyKiBiYXNlID0gc3AtPmJhc2U7CisgICAgICBzaXplX3Qgc2l6ZSA9IHNwLT5zaXplOworICAgICAgZmxhZ190IGZsYWcgPSBnZXRfc2VnbWVudF9mbGFncyhzcCk7CisgICAgICBzcCA9IHNwLT5uZXh0OworICAgICAgaWYgKChmbGFnICYgSVNfTU1BUFBFRF9CSVQpICYmICEoZmxhZyAmIEVYVEVSTl9CSVQpICYmCisgICAgICAgICAgQ0FMTF9NVU5NQVAoYmFzZSwgc2l6ZSkgPT0gMCkKKyAgICAgICAgZnJlZWQgKz0gc2l6ZTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKKyAgfQorICByZXR1cm4gZnJlZWQ7Cit9CisKKy8qCisgIG1zcGFjZSB2ZXJzaW9ucyBvZiByb3V0aW5lcyBhcmUgbmVhci1jbG9uZXMgb2YgdGhlIGdsb2JhbAorICB2ZXJzaW9ucy4gVGhpcyBpcyBub3Qgc28gbmljZSBidXQgYmV0dGVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4KKyovCisKKwordm9pZCogbXNwYWNlX21hbGxvYyhtc3BhY2UgbXNwLCBzaXplX3QgYnl0ZXMpIHsKKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmICghb2tfbWFnaWMobXMpKSB7CisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIVBSRUFDVElPTihtcykpIHsKKyAgICB2b2lkKiBtZW07CisgICAgc2l6ZV90IG5iOworICAgIGlmIChieXRlcyA8PSBNQVhfU01BTExfUkVRVUVTVCkgeworICAgICAgYmluZGV4X3QgaWR4OworICAgICAgYmlubWFwX3Qgc21hbGxiaXRzOworICAgICAgbmIgPSAoYnl0ZXMgPCBNSU5fUkVRVUVTVCk/IE1JTl9DSFVOS19TSVpFIDogcGFkX3JlcXVlc3QoYnl0ZXMpOworICAgICAgaWR4ID0gc21hbGxfaW5kZXgobmIpOworICAgICAgc21hbGxiaXRzID0gbXMtPnNtYWxsbWFwID4+IGlkeDsKKworICAgICAgaWYgKChzbWFsbGJpdHMgJiAweDNVKSAhPSAwKSB7IC8qIFJlbWFpbmRlcmxlc3MgZml0IHRvIGEgc21hbGxiaW4uICovCisgICAgICAgIG1jaHVua3B0ciBiLCBwOworICAgICAgICBpZHggKz0gfnNtYWxsYml0cyAmIDE7ICAgICAgIC8qIFVzZXMgbmV4dCBiaW4gaWYgaWR4IGVtcHR5ICovCisgICAgICAgIGIgPSBzbWFsbGJpbl9hdChtcywgaWR4KTsKKyAgICAgICAgcCA9IGItPmZkOworICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHApID09IHNtYWxsX2luZGV4MnNpemUoaWR4KSk7CisgICAgICAgIHVubGlua19maXJzdF9zbWFsbF9jaHVuayhtcywgYiwgcCwgaWR4KTsKKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobXMsIHAsIHNtYWxsX2luZGV4MnNpemUoaWR4KSk7CisgICAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKKyAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobXMsIG1lbSwgbmIpOworICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKG5iID4gbXMtPmR2c2l6ZSkgeworICAgICAgICBpZiAoc21hbGxiaXRzICE9IDApIHsgLyogVXNlIGNodW5rIGluIG5leHQgbm9uZW1wdHkgc21hbGxiaW4gKi8KKyAgICAgICAgICBtY2h1bmtwdHIgYiwgcCwgcjsKKyAgICAgICAgICBzaXplX3QgcnNpemU7CisgICAgICAgICAgYmluZGV4X3QgaTsKKyAgICAgICAgICBiaW5tYXBfdCBsZWZ0Yml0cyA9IChzbWFsbGJpdHMgPDwgaWR4KSAmIGxlZnRfYml0cyhpZHgyYml0KGlkeCkpOworICAgICAgICAgIGJpbm1hcF90IGxlYXN0Yml0ID0gbGVhc3RfYml0KGxlZnRiaXRzKTsKKyAgICAgICAgICBjb21wdXRlX2JpdDJpZHgobGVhc3RiaXQsIGkpOworICAgICAgICAgIGIgPSBzbWFsbGJpbl9hdChtcywgaSk7CisgICAgICAgICAgcCA9IGItPmZkOworICAgICAgICAgIGFzc2VydChjaHVua3NpemUocCkgPT0gc21hbGxfaW5kZXgyc2l6ZShpKSk7CisgICAgICAgICAgdW5saW5rX2ZpcnN0X3NtYWxsX2NodW5rKG1zLCBiLCBwLCBpKTsKKyAgICAgICAgICByc2l6ZSA9IHNtYWxsX2luZGV4MnNpemUoaSkgLSBuYjsKKyAgICAgICAgICAvKiBGaXQgaGVyZSBjYW5ub3QgYmUgcmVtYWluZGVybGVzcyBpZiA0Ynl0ZSBzaXplcyAqLworICAgICAgICAgIGlmIChTSVpFX1RfU0laRSAhPSA0ICYmIHJzaXplIDwgTUlOX0NIVU5LX1NJWkUpCisgICAgICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShtcywgcCwgc21hbGxfaW5kZXgyc2l6ZShpKSk7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG1zLCBwLCBuYik7CisgICAgICAgICAgICByID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHIsIHJzaXplKTsKKyAgICAgICAgICAgIHJlcGxhY2VfZHYobXMsIHIsIHJzaXplKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVtID0gY2h1bmsybWVtKHApOworICAgICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKG1zLCBtZW0sIG5iKTsKKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChtcy0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX3NtYWxsKG1zLCBuYikpICE9IDApIHsKKyAgICAgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7CisgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzID49IE1BWF9SRVFVRVNUKQorICAgICAgbmIgPSBNQVhfU0laRV9UOyAvKiBUb28gYmlnIHRvIGFsbG9jYXRlLiBGb3JjZSBmYWlsdXJlIChpbiBzeXMgYWxsb2MpICovCisgICAgZWxzZSB7CisgICAgICBuYiA9IHBhZF9yZXF1ZXN0KGJ5dGVzKTsKKyAgICAgIGlmIChtcy0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX2xhcmdlKG1zLCBuYikpICE9IDApIHsKKyAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobXMsIG1lbSwgbmIpOworICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5iIDw9IG1zLT5kdnNpemUpIHsKKyAgICAgIHNpemVfdCByc2l6ZSA9IG1zLT5kdnNpemUgLSBuYjsKKyAgICAgIG1jaHVua3B0ciBwID0gbXMtPmR2OworICAgICAgaWYgKHJzaXplID49IE1JTl9DSFVOS19TSVpFKSB7IC8qIHNwbGl0IGR2ICovCisgICAgICAgIG1jaHVua3B0ciByID0gbXMtPmR2ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgICBtcy0+ZHZzaXplID0gcnNpemU7CisgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7CisgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobXMsIHAsIG5iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeyAvKiBleGhhdXN0IGR2ICovCisgICAgICAgIHNpemVfdCBkdnMgPSBtcy0+ZHZzaXplOworICAgICAgICBtcy0+ZHZzaXplID0gMDsKKyAgICAgICAgbXMtPmR2ID0gMDsKKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobXMsIHAsIGR2cyk7CisgICAgICB9CisgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7CisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7CisgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgfQorCisgICAgZWxzZSBpZiAobmIgPCBtcy0+dG9wc2l6ZSkgeyAvKiBTcGxpdCB0b3AgKi8KKyAgICAgIHNpemVfdCByc2l6ZSA9IG1zLT50b3BzaXplIC09IG5iOworICAgICAgbWNodW5rcHRyIHAgPSBtcy0+dG9wOworICAgICAgbWNodW5rcHRyIHIgPSBtcy0+dG9wID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOworICAgICAgci0+aGVhZCA9IHJzaXplIHwgUElOVVNFX0JJVDsKKyAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobXMsIHAsIG5iKTsKKyAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsKKyAgICAgIGNoZWNrX3RvcF9jaHVuayhtcywgbXMtPnRvcCk7CisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7CisgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgfQorCisgICAgbWVtID0gc3lzX2FsbG9jKG1zLCBuYik7CisKKyAgcG9zdGFjdGlvbjoKKyAgICBQT1NUQUNUSU9OKG1zKTsKKyAgICByZXR1cm4gbWVtOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXNwYWNlX2ZyZWUobXNwYWNlIG1zcCwgdm9pZCogbWVtKSB7CisgIGlmIChtZW0gIT0gMCkgeworICAgIG1jaHVua3B0ciBwICA9IG1lbTJjaHVuayhtZW0pOworI2lmIEZPT1RFUlMKKyAgICBtc3RhdGUgZm0gPSBnZXRfbXN0YXRlX2ZvcihwKTsKKyNlbHNlIC8qIEZPT1RFUlMgKi8KKyAgICBtc3RhdGUgZm0gPSAobXN0YXRlKW1zcDsKKyNlbmRpZiAvKiBGT09URVJTICovCisgICAgaWYgKCFva19tYWdpYyhmbSkpIHsKKyAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihmbSwgcCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghUFJFQUNUSU9OKGZtKSkgeworICAgICAgY2hlY2tfaW51c2VfY2h1bmsoZm0sIHApOworICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcCkgJiYgb2tfY2ludXNlKHApKSkgeworICAgICAgICBzaXplX3QgcHNpemUgPSBjaHVua3NpemUocCk7CisgICAgICAgIG1jaHVua3B0ciBuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpOworICAgICAgICBpZiAoIXBpbnVzZShwKSkgeworICAgICAgICAgIHNpemVfdCBwcmV2c2l6ZSA9IHAtPnByZXZfZm9vdDsKKyAgICAgICAgICBpZiAoKHByZXZzaXplICYgSVNfTU1BUFBFRF9CSVQpICE9IDApIHsKKyAgICAgICAgICAgIHByZXZzaXplICY9IH5JU19NTUFQUEVEX0JJVDsKKyAgICAgICAgICAgIHBzaXplICs9IHByZXZzaXplICsgTU1BUF9GT09UX1BBRDsKKyAgICAgICAgICAgIGlmIChDQUxMX01VTk1BUCgoY2hhciopcCAtIHByZXZzaXplLCBwc2l6ZSkgPT0gMCkKKyAgICAgICAgICAgICAgZm0tPmZvb3RwcmludCAtPSBwc2l6ZTsKKyAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtY2h1bmtwdHIgcHJldiA9IGNodW5rX21pbnVzX29mZnNldChwLCBwcmV2c2l6ZSk7CisgICAgICAgICAgICBwc2l6ZSArPSBwcmV2c2l6ZTsKKyAgICAgICAgICAgIHAgPSBwcmV2OworICAgICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcHJldikpKSB7IC8qIGNvbnNvbGlkYXRlIGJhY2t3YXJkICovCisgICAgICAgICAgICAgIGlmIChwICE9IGZtLT5kdikgeworICAgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgcCwgcHJldnNpemUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKChuZXh0LT5oZWFkICYgSU5VU0VfQklUUykgPT0gSU5VU0VfQklUUykgeworICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSBwc2l6ZTsKKyAgICAgICAgICAgICAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShwLCBwc2l6ZSwgbmV4dCk7CisgICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGdvdG8gZXJyb3JhY3Rpb247CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFJUQ0hFQ0sob2tfbmV4dChwLCBuZXh0KSAmJiBva19waW51c2UobmV4dCkpKSB7CisgICAgICAgICAgaWYgKCFjaW51c2UobmV4dCkpIHsgIC8qIGNvbnNvbGlkYXRlIGZvcndhcmQgKi8KKyAgICAgICAgICAgIGlmIChuZXh0ID09IGZtLT50b3ApIHsKKyAgICAgICAgICAgICAgc2l6ZV90IHRzaXplID0gZm0tPnRvcHNpemUgKz0gcHNpemU7CisgICAgICAgICAgICAgIGZtLT50b3AgPSBwOworICAgICAgICAgICAgICBwLT5oZWFkID0gdHNpemUgfCBQSU5VU0VfQklUOworICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgICBmbS0+ZHYgPSAwOworICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzaG91bGRfdHJpbShmbSwgdHNpemUpKQorICAgICAgICAgICAgICAgIHN5c190cmltKGZtLCAwKTsKKyAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgc2l6ZV90IGRzaXplID0gZm0tPmR2c2l6ZSArPSBwc2l6ZTsKKyAgICAgICAgICAgICAgZm0tPmR2ID0gcDsKKyAgICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIGRzaXplKTsKKyAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHNpemVfdCBuc2l6ZSA9IGNodW5rc2l6ZShuZXh0KTsKKyAgICAgICAgICAgICAgcHNpemUgKz0gbnNpemU7CisgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgbmV4dCwgbnNpemUpOworICAgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgcHNpemUpOworICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsKKyAgICAgICAgICAgICAgICBmbS0+ZHZzaXplID0gcHNpemU7CisgICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHBzaXplLCBuZXh0KTsKKyAgICAgICAgICBpbnNlcnRfY2h1bmsoZm0sIHAsIHBzaXplKTsKKyAgICAgICAgICBjaGVja19mcmVlX2NodW5rKGZtLCBwKTsKKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBlcnJvcmFjdGlvbjoKKyAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihmbSwgcCk7CisgICAgcG9zdGFjdGlvbjoKKyAgICAgIFBPU1RBQ1RJT04oZm0pOworICAgIH0KKyAgfQorfQorCit2b2lkKiBtc3BhY2VfY2FsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbV9zaXplKSB7CisgIHZvaWQqIG1lbTsKKyAgc2l6ZV90IHJlcSA9IDA7CisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOworICBpZiAoIW9rX21hZ2ljKG1zKSkgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG5fZWxlbWVudHMgIT0gMCkgeworICAgIHJlcSA9IG5fZWxlbWVudHMgKiBlbGVtX3NpemU7CisgICAgaWYgKCgobl9lbGVtZW50cyB8IGVsZW1fc2l6ZSkgJiB+KHNpemVfdCkweGZmZmYpICYmCisgICAgICAgIChyZXEgLyBuX2VsZW1lbnRzICE9IGVsZW1fc2l6ZSkpCisgICAgICByZXEgPSBNQVhfU0laRV9UOyAvKiBmb3JjZSBkb3duc3RyZWFtIGZhaWx1cmUgb24gb3ZlcmZsb3cgKi8KKyAgfQorICBtZW0gPSBpbnRlcm5hbF9tYWxsb2MobXMsIHJlcSk7CisgIGlmIChtZW0gIT0gMCAmJiBjYWxsb2NfbXVzdF9jbGVhcihtZW0yY2h1bmsobWVtKSkpCisgICAgbWVtc2V0KG1lbSwgMCwgcmVxKTsKKyAgcmV0dXJuIG1lbTsKK30KKwordm9pZCogbXNwYWNlX3JlYWxsb2MobXNwYWNlIG1zcCwgdm9pZCogb2xkbWVtLCBzaXplX3QgYnl0ZXMpIHsKKyAgaWYgKG9sZG1lbSA9PSAwKQorICAgIHJldHVybiBtc3BhY2VfbWFsbG9jKG1zcCwgYnl0ZXMpOworI2lmZGVmIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUworICBpZiAoYnl0ZXMgPT0gMCkgeworICAgIG1zcGFjZV9mcmVlKG1zcCwgb2xkbWVtKTsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmIC8qIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAqLworICBlbHNlIHsKKyNpZiBGT09URVJTCisgICAgbWNodW5rcHRyIHAgID0gbWVtMmNodW5rKG9sZG1lbSk7CisgICAgbXN0YXRlIG1zID0gZ2V0X21zdGF0ZV9mb3IocCk7CisjZWxzZSAvKiBGT09URVJTICovCisgICAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisjZW5kaWYgLyogRk9PVEVSUyAqLworICAgIGlmICghb2tfbWFnaWMobXMpKSB7CisgICAgICBVU0FHRV9FUlJPUl9BQ1RJT04obXMsbXMpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBpbnRlcm5hbF9yZWFsbG9jKG1zLCBvbGRtZW0sIGJ5dGVzKTsKKyAgfQorfQorCit2b2lkKiBtc3BhY2VfbWVtYWxpZ24obXNwYWNlIG1zcCwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IGJ5dGVzKSB7CisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOworICBpZiAoIW9rX21hZ2ljKG1zKSkgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGludGVybmFsX21lbWFsaWduKG1zLCBhbGlnbm1lbnQsIGJ5dGVzKTsKK30KKwordm9pZCoqIG1zcGFjZV9pbmRlcGVuZGVudF9jYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZWxlbV9zaXplLCB2b2lkKiBjaHVua3NbXSkgeworICBzaXplX3Qgc3ogPSBlbGVtX3NpemU7IC8qIHNlcnZlcyBhcyAxLWVsZW1lbnQgYXJyYXkgKi8KKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmICghb2tfbWFnaWMobXMpKSB7CisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gaWFsbG9jKG1zLCBuX2VsZW1lbnRzLCAmc3osIDMsIGNodW5rcyk7Cit9CisKK3ZvaWQqKiBtc3BhY2VfaW5kZXBlbmRlbnRfY29tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplc1tdLCB2b2lkKiBjaHVua3NbXSkgeworICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKKyAgaWYgKCFva19tYWdpYyhtcykpIHsKKyAgICBVU0FHRV9FUlJPUl9BQ1RJT04obXMsbXMpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBpYWxsb2MobXMsIG5fZWxlbWVudHMsIHNpemVzLCAwLCBjaHVua3MpOworfQorCitpbnQgbXNwYWNlX3RyaW0obXNwYWNlIG1zcCwgc2l6ZV90IHBhZCkgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmIChva19tYWdpYyhtcykpIHsKKyAgICBpZiAoIVBSRUFDVElPTihtcykpIHsKKyAgICAgIHJlc3VsdCA9IHN5c190cmltKG1zLCBwYWQpOworICAgICAgUE9TVEFDVElPTihtcyk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBtc3BhY2VfbWFsbG9jX3N0YXRzKG1zcGFjZSBtc3ApIHsKKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7CisgIGlmIChva19tYWdpYyhtcykpIHsKKyAgICBpbnRlcm5hbF9tYWxsb2Nfc3RhdHMobXMpOworICB9CisgIGVsc2UgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgIH0KK30KKworc2l6ZV90IG1zcGFjZV9mb290cHJpbnQobXNwYWNlIG1zcCkgeworICBzaXplX3QgcmVzdWx0OworICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKKyAgaWYgKG9rX21hZ2ljKG1zKSkgeworICAgIHJlc3VsdCA9IG1zLT5mb290cHJpbnQ7CisgIH0KKyAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzaXplX3QgbXNwYWNlX21heF9mb290cHJpbnQobXNwYWNlIG1zcCkgeworICBzaXplX3QgcmVzdWx0OworICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsKKyAgaWYgKG9rX21hZ2ljKG1zKSkgeworICAgIHJlc3VsdCA9IG1zLT5tYXhfZm9vdHByaW50OworICB9CisgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworI2lmICFOT19NQUxMSU5GTworc3RydWN0IG1hbGxpbmZvIG1zcGFjZV9tYWxsaW5mbyhtc3BhY2UgbXNwKSB7CisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOworICBpZiAoIW9rX21hZ2ljKG1zKSkgeworICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7CisgIH0KKyAgcmV0dXJuIGludGVybmFsX21hbGxpbmZvKG1zKTsKK30KKyNlbmRpZiAvKiBOT19NQUxMSU5GTyAqLworCitpbnQgbXNwYWNlX21hbGxvcHQoaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7CisgIHJldHVybiBjaGFuZ2VfbXBhcmFtKHBhcmFtX251bWJlciwgdmFsdWUpOworfQorCisjZW5kaWYgLyogTVNQQUNFUyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBBbHRlcm5hdGl2ZSBNT1JFQ09SRSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICBHdWlkZWxpbmVzIGZvciBjcmVhdGluZyBhIGN1c3RvbSB2ZXJzaW9uIG9mIE1PUkVDT1JFOgorCisgICogRm9yIGJlc3QgcGVyZm9ybWFuY2UsIE1PUkVDT1JFIHNob3VsZCBhbGxvY2F0ZSBpbiBtdWx0aXBsZXMgb2YgcGFnZXNpemUuCisgICogTU9SRUNPUkUgbWF5IGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gcmVxdWVzdGVkLiAoT3IgZXZlbiBsZXNzLAorICAgICAgYnV0IHRoaXMgd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhIG1hbGxvYyBmYWlsdXJlLikKKyAgKiBNT1JFQ09SRSBtdXN0IG5vdCBhbGxvY2F0ZSBtZW1vcnkgd2hlbiBnaXZlbiBhcmd1bWVudCB6ZXJvLCBidXQKKyAgICAgIGluc3RlYWQgcmV0dXJuIG9uZSBwYXN0IHRoZSBlbmQgYWRkcmVzcyBvZiBtZW1vcnkgZnJvbSBwcmV2aW91cworICAgICAgbm9uemVybyBjYWxsLgorICAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBjb25zZWN1dGl2ZSBjYWxscyB0byBNT1JFQ09SRSB3aXRoIHBvc2l0aXZlCisgICAgICBhcmd1bWVudHMgc2hvdWxkIHJldHVybiBpbmNyZWFzaW5nIGFkZHJlc3NlcywgaW5kaWNhdGluZyB0aGF0CisgICAgICBzcGFjZSBoYXMgYmVlbiBjb250aWd1b3VzbHkgZXh0ZW5kZWQuCisgICogRXZlbiB0aG91Z2ggY29uc2VjdXRpdmUgY2FsbHMgdG8gTU9SRUNPUkUgbmVlZCBub3QgcmV0dXJuIGNvbnRpZ3VvdXMKKyAgICAgIGFkZHJlc3NlcywgaXQgbXVzdCBiZSBPSyBmb3IgbWFsbG9jJ2VkIGNodW5rcyB0byBzcGFuIG11bHRpcGxlCisgICAgICByZWdpb25zIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZXkgZG8gaGFwcGVuIHRvIGJlIGNvbnRpZ3VvdXMuCisgICogTU9SRUNPUkUgbmVlZCBub3QgaGFuZGxlIG5lZ2F0aXZlIGFyZ3VtZW50cyAtLSBpdCBtYXkgaW5zdGVhZAorICAgICAganVzdCByZXR1cm4gTUZBSUwgd2hlbiBnaXZlbiBuZWdhdGl2ZSBhcmd1bWVudHMuCisgICAgICBOZWdhdGl2ZSBhcmd1bWVudHMgYXJlIGFsd2F5cyBtdWx0aXBsZXMgb2YgcGFnZXNpemUuIE1PUkVDT1JFCisgICAgICBtdXN0IG5vdCBtaXNpbnRlcnByZXQgbmVnYXRpdmUgYXJncyBhcyBsYXJnZSBwb3NpdGl2ZSB1bnNpZ25lZAorICAgICAgYXJncy4gWW91IGNhbiBzdXBwcmVzcyBhbGwgc3VjaCBjYWxscyBmcm9tIGV2ZW4gb2NjdXJyaW5nIGJ5IGRlZmluaW5nCisgICAgICBNT1JFQ09SRV9DQU5OT1RfVFJJTSwKKworICBBcyBhbiBleGFtcGxlIGFsdGVybmF0aXZlIE1PUkVDT1JFLCBoZXJlIGlzIGEgY3VzdG9tIGFsbG9jYXRvcgorICBraW5kbHkgY29udHJpYnV0ZWQgZm9yIHByZS1PU1ggbWFjT1MuICBJdCB1c2VzIHZpcnR1YWxseSBidXQgbm90CisgIG5lY2Vzc2FyaWx5IHBoeXNpY2FsbHkgY29udGlndW91cyBub24tcGFnZWQgbWVtb3J5IChsb2NrZWQgaW4sCisgIHByZXNlbnQgYW5kIHdvbid0IGdldCBzd2FwcGVkIG91dCkuICBZb3UgY2FuIHVzZSBpdCBieSB1bmNvbW1lbnRpbmcKKyAgdGhpcyBzZWN0aW9uLCBhZGRpbmcgc29tZSAjaW5jbHVkZXMsIGFuZCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZQorICBkZWZpbmVzIGFib3ZlOgorCisgICAgICAjZGVmaW5lIE1PUkVDT1JFIG9zTW9yZUNvcmUKKworICBUaGVyZSBpcyBhbHNvIGEgc2h1dGRvd24gcm91dGluZSB0aGF0IHNob3VsZCBzb21laG93IGJlIGNhbGxlZCBmb3IKKyAgY2xlYW51cCB1cG9uIHByb2dyYW0gZXhpdC4KKworICAjZGVmaW5lIE1BWF9QT09MX0VOVFJJRVMgMTAwCisgICNkZWZpbmUgTUlOSU1VTV9NT1JFQ09SRV9TSVpFICAoNjQgKiAxMDI0VSkKKyAgc3RhdGljIGludCBuZXh0X29zX3Bvb2w7CisgIHZvaWQgKm91cl9vc19wb29sc1tNQVhfUE9PTF9FTlRSSUVTXTsKKworICB2b2lkICpvc01vcmVDb3JlKGludCBzaXplKQorICB7CisgICAgdm9pZCAqcHRyID0gMDsKKyAgICBzdGF0aWMgdm9pZCAqc2Jya190b3AgPSAwOworCisgICAgaWYgKHNpemUgPiAwKQorICAgIHsKKyAgICAgIGlmIChzaXplIDwgTUlOSU1VTV9NT1JFQ09SRV9TSVpFKQorICAgICAgICAgc2l6ZSA9IE1JTklNVU1fTU9SRUNPUkVfU0laRTsKKyAgICAgIGlmIChDdXJyZW50RXhlY3V0aW9uTGV2ZWwoKSA9PSBrVGFza0xldmVsKQorICAgICAgICAgcHRyID0gUG9vbEFsbG9jYXRlUmVzaWRlbnQoc2l6ZSArIFJNX1BBR0VfU0laRSwgMCk7CisgICAgICBpZiAocHRyID09IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAodm9pZCAqKSBNRkFJTDsKKyAgICAgIH0KKyAgICAgIC8vIHNhdmUgcHRycyBzbyB0aGV5IGNhbiBiZSBmcmVlZCBkdXJpbmcgY2xlYW51cAorICAgICAgb3VyX29zX3Bvb2xzW25leHRfb3NfcG9vbF0gPSBwdHI7CisgICAgICBuZXh0X29zX3Bvb2wrKzsKKyAgICAgIHB0ciA9ICh2b2lkICopICgoKChzaXplX3QpIHB0cikgKyBSTV9QQUdFX01BU0spICYgflJNX1BBR0VfTUFTSyk7CisgICAgICBzYnJrX3RvcCA9IChjaGFyICopIHB0ciArIHNpemU7CisgICAgICByZXR1cm4gcHRyOworICAgIH0KKyAgICBlbHNlIGlmIChzaXplIDwgMCkKKyAgICB7CisgICAgICAvLyB3ZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBzaHJpbmsgYmVoYXZpb3IKKyAgICAgIHJldHVybiAodm9pZCAqKSBNRkFJTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBzYnJrX3RvcDsKKyAgICB9CisgIH0KKworICAvLyBjbGVhbnVwIGFueSBhbGxvY2F0ZWQgbWVtb3J5IHBvb2xzCisgIC8vIGNhbGxlZCBhcyBsYXN0IHRoaW5nIGJlZm9yZSBzaHV0dGluZyBkb3duIGRyaXZlcgorCisgIHZvaWQgb3NDbGVhbnVwTWVtKHZvaWQpCisgIHsKKyAgICB2b2lkICoqcHRyOworCisgICAgZm9yIChwdHIgPSBvdXJfb3NfcG9vbHM7IHB0ciA8ICZvdXJfb3NfcG9vbHNbTUFYX1BPT0xfRU5UUklFU107IHB0cisrKQorICAgICAgaWYgKCpwdHIpCisgICAgICB7CisgICAgICAgICBQb29sRGVhbGxvY2F0ZSgqcHRyKTsKKyAgICAgICAgICpwdHIgPSAwOworICAgICAgfQorICB9CisKKyovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0hpc3Rvcnk6CisgICAgVjIuOC4zIFRodSBTZXAgMjIgMTE6MTY6MzIgMjAwNSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCisgICAgICAqIEFkZCBtYXhfZm9vdHByaW50IGZ1bmN0aW9ucworICAgICAgKiBFbnN1cmUgYWxsIGFwcHJvcHJpYXRlIGxpdGVyYWxzIGFyZSBzaXplX3QKKyAgICAgICogRml4IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHByb2JsZW0gZm9yIHNvbWUgI2RlZmluZSBzZXR0aW5ncworICAgICAgKiBBdm9pZCBjb25jYXRlbmF0aW5nIHNlZ21lbnRzIHdpdGggdGhlIG9uZSBwcm92aWRlZAorICAgICAgICBpbiBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZQorICAgICAgKiBSZW5hbWUgc29tZSB2YXJpYWJsZXMgdG8gYXZvaWQgY29tcGlsZXIgc2hhZG93aW5nIHdhcm5pbmdzCisgICAgICAqIFVzZSBleHBsaWNpdCBsb2NrIGluaXRpYWxpemF0aW9uLgorICAgICAgKiBCZXR0ZXIgaGFuZGxpbmcgb2Ygc2JyayBpbnRlcmZlcmVuY2UuCisgICAgICAqIFNpbXBsaWZ5IGFuZCBmaXggc2VnbWVudCBpbnNlcnRpb24sIHRyaW1taW5nIGFuZCBtc3BhY2VfZGVzdHJveQorICAgICAgKiBSZWluc3RhdGUgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTIG9wdGlvbiBmcm9tIDIuNy54CisgICAgICAqIFRoYW5rcyBlc3BlY2lhbGx5IHRvIERlbm5pcyBGbGFuYWdhbiBmb3IgaGVscCBvbiB0aGVzZS4KKworICAgIFYyLjguMiBTdW4gSnVuIDEyIDE2OjAxOjEwIDIwMDUgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorICAgICAgKiBGaXggbWVtYWxpZ24gYnJhY2UgZXJyb3IuCisKKyAgICBWMi44LjEgV2VkIEp1biAgOCAxNjoxMTo0NiAyMDA1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogRml4IGltcHJvcGVyICNlbmRpZiBuZXN0aW5nIGluIEMrKworICAgICAgKiBBZGQgZXhwbGljaXQgY2FzdHMgbmVlZGVkIGZvciBDKysKKworICAgIFYyLjguMCBNb24gTWF5IDMwIDE0OjA5OjAyIDIwMDUgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorICAgICAgKiBVc2UgdHJlZXMgZm9yIGxhcmdlIGJpbnMKKyAgICAgICogU3VwcG9ydCBtc3BhY2VzCisgICAgICAqIFVzZSBzZWdtZW50cyB0byB1bmlmeSBzYnJrLWJhc2VkIGFuZCBtbWFwLWJhc2VkIHN5c3RlbSBhbGxvY2F0aW9uLAorICAgICAgICByZW1vdmluZyBuZWVkIGZvciBlbXVsYXRpb24gb24gbW9zdCBwbGF0Zm9ybXMgd2l0aG91dCBzYnJrLgorICAgICAgKiBEZWZhdWx0IHNhZmV0eSBjaGVja3MKKyAgICAgICogT3B0aW9uYWwgZm9vdGVyIGNoZWNrcy4gVGhhbmtzIHRvIFdpbGxpYW0gUm9iZXJ0c29uIGZvciB0aGUgaWRlYS4KKyAgICAgICogSW50ZXJuYWwgY29kZSByZWZhY3RvcmluZworICAgICAgKiBJbmNvcnBvcmF0ZSBzdWdnZXN0aW9ucyBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgY2hhbmdlcy4KKyAgICAgICAgVGhhbmtzIHRvIERlbm5pcyBGbGFuYWdhbiwgQ29saW4gUGx1bWIsIE5pYWxsIERvdWdsYXMsCisgICAgICAgIEFhcm9uIEJhY2htYW5uLCAgRW1lcnkgQmVyZ2VyLCBhbmQgb3RoZXJzLgorICAgICAgKiBTcGVlZCB1cCBub24tZmFzdGJpbiBwcm9jZXNzaW5nIGVub3VnaCB0byByZW1vdmUgZmFzdGJpbnMuCisgICAgICAqIFJlbW92ZSB1c2VsZXNzIGNmcmVlKCkgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIgYXBwcy4KKyAgICAgICogUmVtb3ZlIGludGVybmFsIG1lbWNweSwgbWVtc2V0LiBDb21waWxlcnMgaGFuZGxlIGJ1aWx0aW5zIGJldHRlci4KKyAgICAgICogUmVtb3ZlIHNvbWUgb3B0aW9ucyB0aGF0IG5vIG9uZSBldmVyIHVzZWQgYW5kIHJlbmFtZSBvdGhlcnMuCisKKyAgICBWMi43LjIgU2F0IEF1ZyAxNyAwOTowNzozMCAyMDAyICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogRml4IG1hbGxvY19zdGF0ZSBiaXRtYXAgYXJyYXkgbWlzZGVjbGFyYXRpb24KKworICAgIFYyLjcuMSBUaHUgSnVsIDI1IDEwOjU4OjAzIDIwMDIgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorICAgICAgKiBBbGxvdyB0dW5pbmcgb2YgRklSU1RfU09SVEVEX0JJTl9TSVpFCisgICAgICAqIFVzZSBQVFJfVUlOVCBhcyB0eXBlIGZvciBhbGwgcHRyLT5pbnQgY2FzdHMuIFRoYW5rcyB0byBKb2huIEJlbG1vbnRlLgorICAgICAgKiBCZXR0ZXIgZGV0ZWN0aW9uIGFuZCBzdXBwb3J0IGZvciBub24tY29udGlndW91c25lc3Mgb2YgTU9SRUNPUkUuCisgICAgICAgIFRoYW5rcyB0byBBbmRyZWFzIE11ZWxsZXIsIENvbmFsIFdhbHNoLCBhbmQgV29sZnJhbSBHbG9nZXIKKyAgICAgICogQnlwYXNzIG1vc3Qgb2YgbWFsbG9jIGlmIG5vIGZyZWVzLiBUaGFua3MgVG8gRW1lcnkgQmVyZ2VyLgorICAgICAgKiBGaXggZnJlZWluZyBvZiBvbGQgdG9wIG5vbi1jb250aWd1b3VzIGNodW5rIGltIHN5c21hbGxvYy4KKyAgICAgICogUmFpc2VkIGRlZmF1bHQgdHJpbSBhbmQgbWFwIHRocmVzaG9sZHMgdG8gMjU2Sy4KKyAgICAgICogRml4IG1tYXAtcmVsYXRlZCAjZGVmaW5lcy4gVGhhbmtzIHRvIEx1Ym9zIEx1bmFrLgorICAgICAgKiBGaXggY29weSBtYWNyb3M7IGFkZGVkIExBQ0tTX0ZDTlRMX0guIFRoYW5rcyB0byBOZWFsIFdhbGZpZWxkLgorICAgICAgKiBCcmFuY2gtZnJlZSBiaW4gY2FsY3VsYXRpb24KKyAgICAgICogRGVmYXVsdCB0cmltIGFuZCBtbWFwIHRocmVzaG9sZHMgbm93IDI1NksuCisKKyAgICBWMi43LjAgU3VuIE1hciAxMSAxNDoxNDowNiAyMDAxICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogSW50cm9kdWNlIGluZGVwZW5kZW50X2NvbWFsbG9jIGFuZCBpbmRlcGVuZGVudF9jYWxsb2MuCisgICAgICAgIFRoYW5rcyB0byBNaWNoYWVsIFBhY2hvcyBmb3IgbW90aXZhdGlvbiBhbmQgaGVscC4KKyAgICAgICogTWFrZSBvcHRpb25hbCAuaCBmaWxlIGF2YWlsYWJsZQorICAgICAgKiBBbGxvdyA+IDJHQiByZXF1ZXN0cyBvbiAzMmJpdCBzeXN0ZW1zLgorICAgICAgKiBuZXcgV0lOMzIgc2JyaywgbW1hcCwgbXVubWFwLCBsb2NrIGNvZGUgZnJvbSA8V2FsdGVyQEdlTmVTeXMtZS5kZT4uCisgICAgICAgIFRoYW5rcyBhbHNvIHRvIEFuZHJlYXMgTXVlbGxlciA8YS5tdWVsbGVyIGF0IHBhcmFkYXRlYy5kZT4sCisgICAgICAgIGFuZCBBbm9ueW1vdXMuCisgICAgICAqIEFsbG93IG92ZXJyaWRlIG9mIE1BTExPQ19BTElHTk1FTlQgKFRoYW5rcyB0byBSdXVkIFdhaWogZm9yCisgICAgICAgIGhlbHBpbmcgdGVzdCB0aGlzLikKKyAgICAgICogbWVtYWxpZ246IGNoZWNrIGFsaWdubWVudCBhcmcKKyAgICAgICogcmVhbGxvYzogZG9uJ3QgdHJ5IHRvIHNoaWZ0IGNodW5rcyBiYWNrd2FyZHMsIHNpbmNlIHRoaXMKKyAgICAgICAgbGVhZHMgdG8gIG1vcmUgZnJhZ21lbnRhdGlvbiBpbiBzb21lIHByb2dyYW1zIGFuZCBkb2Vzbid0CisgICAgICAgIHNlZW0gdG8gaGVscCBpbiBhbnkgb3RoZXJzLgorICAgICAgKiBDb2xsZWN0IGFsbCBjYXNlcyBpbiBtYWxsb2MgcmVxdWlyaW5nIHN5c3RlbSBtZW1vcnkgaW50byBzeXNtYWxsb2MKKyAgICAgICogVXNlIG1tYXAgYXMgYmFja3VwIHRvIHNicmsKKyAgICAgICogUGxhY2UgYWxsIGludGVybmFsIHN0YXRlIGluIG1hbGxvY19zdGF0ZQorICAgICAgKiBJbnRyb2R1Y2UgZmFzdGJpbnMgKGFsdGhvdWdoIHNpbWlsYXIgdG8gMi41LjEpCisgICAgICAqIE1hbnkgbWlub3IgdHVuaW5ncyBhbmQgY29zbWV0aWMgaW1wcm92ZW1lbnRzCisgICAgICAqIEludHJvZHVjZSBVU0VfUFVCTElDX01BTExPQ19XUkFQUEVSUywgVVNFX01BTExPQ19MT0NLCisgICAgICAqIEludHJvZHVjZSBNQUxMT0NfRkFJTFVSRV9BQ1RJT04sIE1PUkVDT1JFX0NPTlRJR1VPVVMKKyAgICAgICAgVGhhbmtzIHRvIFRvbnkgRS4gQmVubmV0dCA8dGJlbm5ldHRAbnZpZGlhLmNvbT4gYW5kIG90aGVycy4KKyAgICAgICogSW5jbHVkZSBlcnJuby5oIHRvIHN1cHBvcnQgZGVmYXVsdCBmYWlsdXJlIGFjdGlvbi4KKworICAgIFYyLjYuNiBTdW4gRGVjICA1IDA3OjQyOjE5IDE5OTkgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorICAgICAgKiByZXR1cm4gbnVsbCBmb3IgbmVnYXRpdmUgYXJndW1lbnRzCisgICAgICAqIEFkZGVkIFNldmVyYWwgV0lOMzIgY2xlYW51cHMgZnJvbSBNYXJ0aW4gQy4gRm9uZyA8bWNmb25nIGF0IHlhaG9vLmNvbT4KKyAgICAgICAgICogQWRkICdMQUNLU19TWVNfUEFSQU1fSCcgZm9yIHRob3NlIHN5c3RlbXMgd2l0aG91dCAnc3lzL3BhcmFtLmgnCisgICAgICAgICAgKGUuZy4gV0lOMzIgcGxhdGZvcm1zKQorICAgICAgICAgKiBDbGVhbnVwIGhlYWRlciBmaWxlIGluY2x1c2lvbiBmb3IgV0lOMzIgcGxhdGZvcm1zCisgICAgICAgICAqIENsZWFudXAgY29kZSB0byBhdm9pZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21waWxlciBjb21wbGFpbnRzCisgICAgICAgICAqIEFkZCAnVVNFX0RMX1BSRUZJWCcgdG8gcXVpY2tseSBhbGxvdyBjby1leGlzdGVuY2Ugd2l0aCBleGlzdGluZworICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcworICAgICAgICAgKiBTZXQgJ21hbGxvY19nZXRwYWdlc2l6ZScgZm9yIFdJTjMyIHBsYXRmb3JtcyAobmVlZHMgbW9yZSB3b3JrKQorICAgICAgICAgKiBVc2UgJ2Fzc2VydCcgcmF0aGVyIHRoYW4gJ0FTU0VSVCcgaW4gV0lOMzIgY29kZSB0byBjb25mb3JtIHRvCisgICAgICAgICAgIHVzYWdlIG9mICdhc3NlcnQnIGluIG5vbi1XSU4zMiBjb2RlCisgICAgICAgICAqIEltcHJvdmUgV0lOMzIgJ3NicmsoKScgZW11bGF0aW9uJ3MgJ2ZpbmRSZWdpb24oKScgcm91dGluZSB0bworICAgICAgICAgICBhdm9pZCBpbmZpbml0ZSBsb29wCisgICAgICAqIEFsd2F5cyBjYWxsICdmUkVlKCknIHJhdGhlciB0aGFuICdmcmVlKCknCisKKyAgICBWMi42LjUgV2VkIEp1biAxNyAxNTo1NzozMSAxOTk4ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogRml4ZWQgb3JkZXJpbmcgcHJvYmxlbSB3aXRoIGJvdW5kYXJ5LXN0YW1waW5nCisKKyAgICBWMi42LjMgU3VuIE1heSAxOSAwODoxNzo1OCAxOTk2ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogQWRkZWQgcHZhbGxvYywgYXMgcmVjb21tZW5kZWQgYnkgSC5KLiBMaXUKKyAgICAgICogQWRkZWQgNjRiaXQgcG9pbnRlciBzdXBwb3J0IG1haW5seSBmcm9tIFdvbGZyYW0gR2xvZ2VyCisgICAgICAqIEFkZGVkIGFub255bW91c2x5IGRvbmF0ZWQgV0lOMzIgc2JyayBlbXVsYXRpb24KKyAgICAgICogTWFsbG9jLCBjYWxsb2MsIGdldHBhZ2VzaXplOiBhZGQgb3B0aW1pemF0aW9ucyBmcm9tIFJheW1vbmQgTmlqc3NlbgorICAgICAgKiBtYWxsb2NfZXh0ZW5kX3RvcDogZml4IG1hc2sgZXJyb3IgdGhhdCBjYXVzZWQgd2FzdGFnZSBhZnRlcgorICAgICAgICBmb3JlaWduIHNicmtzCisgICAgICAqIEFkZCBsaW51eCBtcmVtYXAgc3VwcG9ydCBjb2RlIGZyb20gSEogTGl1CisKKyAgICBWMi42LjIgVHVlIERlYyAgNSAwNjo1Mjo1NSAxOTk1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogSW50ZWdyYXRlZCBtb3N0IGRvY3VtZW50YXRpb24gd2l0aCB0aGUgY29kZS4KKyAgICAgICogQWRkIHN1cHBvcnQgZm9yIG1tYXAsIHdpdGggaGVscCBmcm9tCisgICAgICAgIFdvbGZyYW0gR2xvZ2VyIChHbG9nZXJAbHJ6LnVuaS1tdWVuY2hlbi5kZSkuCisgICAgICAqIFVzZSBsYXN0X3JlbWFpbmRlciBpbiBtb3JlIGNhc2VzLgorICAgICAgKiBQYWNrIGJpbnMgdXNpbmcgaWRlYSBmcm9tICBjb2xpbkBueXgxMC5jcy5kdS5lZHUKKyAgICAgICogVXNlIG9yZGVyZWQgYmlucyBpbnN0ZWFkIG9mIGJlc3QtZml0IHRocmVzaGhvbGQKKyAgICAgICogRWxpbWluYXRlIGJsb2NrLWxvY2FsIGRlY2xzIHRvIHNpbXBsaWZ5IHRyYWNpbmcgYW5kIGRlYnVnZ2luZy4KKyAgICAgICogU3VwcG9ydCBhbm90aGVyIGNhc2Ugb2YgcmVhbGxvYyB2aWEgbW92ZSBpbnRvIHRvcAorICAgICAgKiBGaXggZXJyb3Igb2NjdXJpbmcgd2hlbiBpbml0aWFsIHNicmtfYmFzZSBub3Qgd29yZC1hbGlnbmVkLgorICAgICAgKiBSZWx5IG9uIHBhZ2Ugc2l6ZSBmb3IgdW5pdHMgaW5zdGVhZCBvZiBTQlJLX1VOSVQgdG8KKyAgICAgICAgYXZvaWQgc3VycHJpc2VzIGFib3V0IHNicmsgYWxpZ25tZW50IGNvbnZlbnRpb25zLgorICAgICAgKiBBZGQgbWFsbGluZm8sIG1hbGxvcHQuIFRoYW5rcyB0byBSYXltb25kIE5panNzZW4KKyAgICAgICAgKHJheW1vbmRAZXMuZWxlLnR1ZS5ubCkgZm9yIHRoZSBzdWdnZXN0aW9uLgorICAgICAgKiBBZGQgYHBhZCcgYXJndW1lbnQgdG8gbWFsbG9jX3RyaW0gYW5kIHRvcF9wYWQgbWFsbG9wdCBwYXJhbWV0ZXIuCisgICAgICAqIE1vcmUgcHJlY2F1dGlvbnMgZm9yIGNhc2VzIHdoZXJlIG90aGVyIHJvdXRpbmVzIGNhbGwgc2JyaywKKyAgICAgICAgY291cnRlc3kgb2YgV29sZnJhbSBHbG9nZXIgKEdsb2dlckBscnoudW5pLW11ZW5jaGVuLmRlKS4KKyAgICAgICogQWRkZWQgbWFjcm9zIGV0Yy4sIGFsbG93aW5nIHVzZSBpbiBsaW51eCBsaWJjIGZyb20KKyAgICAgICAgSC5KLiBMdSAoaGpsQGdudS5haS5taXQuZWR1KQorICAgICAgKiBJbnZlcnRlZCB0aGlzIGhpc3RvcnkgbGlzdAorCisgICAgVjIuNi4xIFNhdCBEZWMgIDIgMTQ6MTA6NTcgMTk5NSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCisgICAgICAqIFJlLXR1bmVkIGFuZCBmaXhlZCB0byBiZWhhdmUgbW9yZSBuaWNlbHkgd2l0aCBWMi42LjAgY2hhbmdlcy4KKyAgICAgICogUmVtb3ZlZCBhbGwgcHJlYWxsb2NhdGlvbiBjb2RlIHNpbmNlIHVuZGVyIGN1cnJlbnQgc2NoZW1lCisgICAgICAgIHRoZSB3b3JrIHJlcXVpcmVkIHRvIHVuZG8gYmFkIHByZWFsbG9jYXRpb25zIGV4Y2VlZHMKKyAgICAgICAgdGhlIHdvcmsgc2F2ZWQgaW4gZ29vZCBjYXNlcyBmb3IgbW9zdCB0ZXN0IHByb2dyYW1zLgorICAgICAgKiBObyBsb25nZXIgdXNlIHJldHVybiBsaXN0IG9yIHVuY29uc29saWRhdGVkIGJpbnMgc2luY2UKKyAgICAgICAgbm8gc2NoZW1lIHVzaW5nIHRoZW0gY29uc2lzdGVudGx5IG91dHBlcmZvcm1zIHRob3NlIHRoYXQgZG9uJ3QKKyAgICAgICAgZ2l2ZW4gYWJvdmUgY2hhbmdlcy4KKyAgICAgICogVXNlIGJlc3QgZml0IGZvciB2ZXJ5IGxhcmdlIGNodW5rcyB0byBwcmV2ZW50IHNvbWUgd29yc3QtY2FzZXMuCisgICAgICAqIEFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgZGVidWdnaW5nCisKKyAgICBWMi42LjAgU2F0IE5vdiAgNCAwNzowNToyMyAxOTk1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKyAgICAgICogUmVtb3ZlZCBmb290ZXJzIHdoZW4gY2h1bmtzIGFyZSBpbiB1c2UuIFRoYW5rcyB0bworICAgICAgICBQYXVsIFdpbHNvbiAod2lsc29uQGNzLnRleGFzLmVkdSkgZm9yIHRoZSBzdWdnZXN0aW9uLgorCisgICAgVjIuNS40IFdlZCBOb3YgIDEgMDc6NTQ6NTEgMTk5NSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpCisgICAgICAqIEFkZGVkIG1hbGxvY190cmltLCB3aXRoIGhlbHAgZnJvbSBXb2xmcmFtIEdsb2dlcgorICAgICAgICAod21nbG9ARGVudC5NRUQuVW5pLU11ZW5jaGVuLkRFKS4KKworICAgIFYyLjUuMyBUdWUgQXByIDI2IDEwOjE2OjAxIDE5OTQgIERvdWcgTGVhICAoZGwgYXQgZykKKworICAgIFYyLjUuMiBUdWUgQXByICA1IDE2OjIwOjQwIDE5OTQgIERvdWcgTGVhICAoZGwgYXQgZykKKyAgICAgICogcmVhbGxvYzogdHJ5IHRvIGV4cGFuZCBpbiBib3RoIGRpcmVjdGlvbnMKKyAgICAgICogbWFsbG9jOiBzd2FwIG9yZGVyIG9mIGNsZWFuLWJpbiBzdHJhdGVneTsKKyAgICAgICogcmVhbGxvYzogb25seSBjb25kaXRpb25hbGx5IGV4cGFuZCBiYWNrd2FyZHMKKyAgICAgICogVHJ5IG5vdCB0byBzY2F2ZW5nZSB1c2VkIGJpbnMKKyAgICAgICogVXNlIGJpbiBjb3VudHMgYXMgYSBndWlkZSB0byBwcmVhbGxvY2F0aW9uCisgICAgICAqIE9jY2FzaW9uYWxseSBiaW4gcmV0dXJuIGxpc3QgY2h1bmtzIGluIGZpcnN0IHNjYW4KKyAgICAgICogQWRkIGEgZmV3IG9wdGltaXphdGlvbnMgZnJvbSBjb2xpbkBueXgxMC5jcy5kdS5lZHUKKworICAgIFYyLjUuMSBTYXQgQXVnIDE0IDE1OjQwOjQzIDE5OTMgIERvdWcgTGVhICAoZGwgYXQgZykKKyAgICAgICogZmFzdGVyIGJpbiBjb21wdXRhdGlvbiAmIHNsaWdodGx5IGRpZmZlcmVudCBiaW5uaW5nCisgICAgICAqIG1lcmdlZCBhbGwgY29uc29saWRhdGlvbnMgdG8gb25lIHBhcnQgb2YgbWFsbG9jIHByb3BlcgorICAgICAgICAgKGVsaW1pbmF0aW5nIG9sZCBtYWxsb2NfZmluZF9zcGFjZSAmIG1hbGxvY19jbGVhbl9iaW4pCisgICAgICAqIFNjYW4gMiByZXR1cm5zIGNodW5rcyAobm90IGp1c3QgMSkKKyAgICAgICogUHJvcGFnYXRlIGZhaWx1cmUgaW4gcmVhbGxvYyBpZiBtYWxsb2MgcmV0dXJucyAwCisgICAgICAqIEFkZCBzdHVmZiB0byBhbGxvdyBjb21waWxhdGlvbiBvbiBub24tQU5TSSBjb21waWxlcnMKKyAgICAgICAgICBmcm9tIGtwdkByZXNlYXJjaC5hdHQuY29tCisKKyAgICBWMi41IFNhdCBBdWcgIDcgMDc6NDE6NTkgMTk5MyAgRG91ZyBMZWEgIChkbCBhdCBnLm9zd2Vnby5lZHUpCisgICAgICAqIHJlbW92ZWQgcG90ZW50aWFsIGZvciBvZGQgYWRkcmVzcyBhY2Nlc3MgaW4gcHJldl9jaHVuaworICAgICAgKiByZW1vdmVkIGRlcGVuZGVuY3kgb24gZ2V0cGFnZXNpemUuaAorICAgICAgKiBtaXNjIGNvc21ldGljcyBhbmQgYSBiaXQgbW9yZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uCisgICAgICAqIGFudGljb3NtZXRpY3M6IG1hbmdsZWQgbmFtZXMgaW4gbWFjcm9zIHRvIGV2YWRlIGRlYnVnZ2VyIHN0cmFuZ2VuZXNzCisgICAgICAqIHRlc3RlZCBvbiBzcGFyYywgaHAtNzAwLCBkZWMtbWlwcywgcnM2MDAwCisgICAgICAgICAgd2l0aCBnY2MgJiBuYXRpdmUgY2MgKGhwLCBkZWMgb25seSkgYWxsb3dpbmcKKyAgICAgICAgICBEZXRsZWZzICYgWm9ybiBjb21wYXJpc29uIHN0dWR5IChpbiBTSUdQTEFOIE5vdGljZXMuKQorCisgICAgVHJpYWwgdmVyc2lvbiBGcmkgQXVnIDI4IDEzOjE0OjI5IDE5OTIgIERvdWcgTGVhICAoZGwgYXQgZy5vc3dlZ28uZWR1KQorICAgICAgKiBCYXNlZCBsb29zZWx5IG9uIGxpYmcrKy0xLjJYIG1hbGxvYy4gKEl0IHJldGFpbnMgc29tZSBvZiB0aGUgb3ZlcmFsbAorICAgICAgICAgc3RydWN0dXJlIG9mIG9sZCB2ZXJzaW9uLCAgYnV0IG1vc3QgZGV0YWlscyBkaWZmZXIuKQorIAorKi8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvZnJ2L2VhYmkuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvZnJ2L2VhYmkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzllYTRiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9mcnYvZWFiaS5TCkBAIC0wLDAgKzEsMTI4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZWFiaS5TIC0gQ29weXJpZ2h0IChjKSAyMDA0ICBBbnRob255IEdyZWVuCisgICAKKyAgIEZSLVYgQXNzZW1ibHkgZ2x1ZS4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisJLmdsb2JsIGZmaV9wcmVwX2FyZ3NfRUFCSQorCisJLnRleHQKKwkucDJhbGlnbiA0CisJLmdsb2JsIGZmaV9jYWxsX0VBQkkKKwkudHlwZSBmZmlfY2FsbF9FQUJJLCBAZnVuY3Rpb24KKworCSMgZ3I4IDogICBmZmlfcHJlcF9hcmdzCisJIyBncjkgOiAgICZlY2lmCisJIyBncjEwOiAgIGNpZi0+Ynl0ZXMKKwkjIGdyMTE6ICAgZmlnLT5mbGFncworCSMgZ3IxMjogICBlY2lmLnJ2YWx1ZQorCSMgZ3IxMzogICBmbgorCQorZmZpX2NhbGxfRUFCSToJCisJYWRkaQlzcCwgIy04MCwgc3AKKwlzdGkJZnAsIEAoc3AsICMyNCkKKwlhZGRpCXNwLCAjMjQsIGZwCisJbW92c2cJbHIsIGdyNQorCisJLyogTWFrZSByb29tIGZvciB0aGUgbmV3IGFyZ3VtZW50cy4gICovCisJLyogc3ViaQlzcCwgZnAsIGdyMTAgKi8KKwkKKwkvKiBTdG9yZSByZXR1cm4gYWRkcmVzcyBhbmQgaW5jb21pbmcgYXJncyBvbiBzdGFjay4gICovCisJc3RpCWdyNSwgQChmcCwgIzgpCisJc3RpCWdyOCwgQChmcCwgIy00KQorCXN0aQlncjksIEAoZnAsICMtOCkKKwlzdGkJZ3IxMCwgQChmcCwgIy0xMikKKwlzdGkJZ3IxMSwgQChmcCwgIy0xNikKKwlzdGkJZ3IxMiwgQChmcCwgIy0yMCkKKwlzdGkJZ3IxMywgQChmcCwgIy0yNCkKKworCXN1YiAgICAgc3AsIGdyMTAsIHNwCisJCisJLyogQ2FsbCBmZmlfcHJlcF9hcmdzLiAgKi8KKwlsZGkJQChmcCwgIy00KSwgZ3I0CisJYWRkaQlzcCwgIzAsIGdyOAorCWxkaQlAKGZwLCAjLTgpLCBncjkKKyNpZmRlZiBfX0ZSVl9GRFBJQ19fCisJbGRkCUAoZ3I0LCBncjApLCBncjE0CisJY2FsbGwJQChncjE0LCBncjApCisjZWxzZQorCWNhbGxsCUAoZ3I0LCBncjApCisjZW5kaWYJCisKKwkvKiBmZmlfcHJlcF9hcmdzIHJldHVybnMgdGhlIG5ldyBzdGFjayBwb2ludGVyLiAgKi8KKwltb3YJZ3I4LCBncjQKKwkJCisJbGRpCUAoc3AsICMwKSwgZ3I4CisJbGRpCUAoc3AsICM0KSwgZ3I5CisJbGRpCUAoc3AsICM4KSwgZ3IxMAorCWxkaQlAKHNwLCAjMTIpLCBncjExCisJbGRpCUAoc3AsICMxNiksIGdyMTIKKwlsZGkJQChzcCwgIzIwKSwgZ3IxMworCisJLyogQWx3YXlzIGNvcHkgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGludG8gdGhlIGhpZGRlbgorCSAgIHBhcmFtZXRlciByZWdpc3Rlci4gIFRoaXMgaXMgb25seSBzdHJpY3RseSBuZWNlc3NhcnkKKwkgICB3aGVuIHdlJ3JlIHJldHVybmluZyBhbiBhZ2dyZWdhdGUgdHlwZSwgYnV0IGl0IGRvZXNuJ3QKKwkgICBodXJ0IHRvIGRvIHRoaXMgYWxsIHRoZSB0aW1lLCBhbmQgaXQgc2F2ZXMgYSBicmFuY2guICAqLworCWxkaQlAKGZwLCAjLTIwKSwgZ3IzCisKKwkvKiBVc2UgdGhlIGZmaV9wcmVwX2FyZ3MgcmV0dXJuIHZhbHVlIGZvciB0aGUgbmV3IHNwLiAgKi8KKwltb3YJZ3I0LCBzcAorCQorCS8qIENhbGwgdGhlIHRhcmdldCBmdW5jdGlvbi4gICovCisJbGRpCUAoZnAsIC0yNCksIGdyNAorI2lmZGVmIF9fRlJWX0ZEUElDX18KKwlsZGQJQChncjQsIGdyMCksIGdyMTQKKwljYWxsbAlAKGdyMTQsIGdyMCkKKyNlbHNlCisJY2FsbGwJQChncjQsIGdyMCkKKyNlbmRpZgkKKworCS8qIFN0b3JlIHRoZSByZXN1bHQuICovCisJbGRpCUAoZnAsICMtMTYpLCBncjEwICAvKiBmaWctPmZsYWdzICovCisJbGRpCUAoZnAsICMtMjApLCBncjQgICAvKiBlY2lmLnJ2YWx1ZSAqLworCisJLyogSXMgdGhlIHJldHVybiB2YWx1ZSBzdG9yZWQgaW4gdHdvIHJlZ2lzdGVycz8gICovCisJY21waQlncjEwLCAjOCwgaWNjMAorCWJuZQlpY2MwLCAwLCAuTDIKKwkvKiAgIFllcywgc2F2ZSB0aGVtLiAgKi8KKwlzdGkJZ3I4LCBAKGdyNCwgIzApCisJc3RpCWdyOSwgQChncjQsICM0KQorCWJyYQkuTDMKKy5MMjoKKwkvKiBJcyB0aGUgcmV0dXJuIHZhbHVlIGEgc3RydWN0dXJlPyAgKi8KKwljbXBpCWdyMTAsICMtMSwgaWNjMAorCWJlcQlpY2MwLCAwLCAuTDMKKwkvKiAgIE5vLCBzYXZlIGEgNCBieXRlIHJldHVybiB2YWx1ZS4gICovCisJc3RpCWdyOCwgQChncjQsICMwKQorLkwzOgkKKworCS8qIFJlc3RvcmUgdGhlIHN0YWNrLCBhbmQgcmV0dXJuLiAgKi8KKwlsZGkJQChmcCwgOCksIGdyNQorCWxkCUAoZnAsIGdyMCksIGZwCisJYWRkaQlzcCwjODAsc3AKKwlqbXBsCUAoZ3I1LGdyMCkKKwkuc2l6ZSBmZmlfY2FsbF9FQUJJLCAuLWZmaV9jYWxsX0VBQkkKKwkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvZnJ2L2ZmaS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9mcnYvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5OGM4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvZnJ2L2ZmaS5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZmZpLmMgLSBDb3B5cmlnaHQgKEMpIDIwMDQgIEFudGhvbnkgR3JlZW4KKyAgIENvcHlyaWdodCAoQykgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisJICAgQ29weXJpZ2h0IChDKSAyMDA4ICBSZWQgSGF0LCBJbmMuCisgICAKKyAgIEZSLVYgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogZmZpX3ByZXBfYXJncyBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmx5IHJvdXRpbmUgb25jZSBzdGFjayBzcGFjZQorICAgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgKi8KKwordm9pZCAqZmZpX3ByZXBfYXJncyhjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKQoreworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKKyAgcmVnaXN0ZXIgY2hhciAqYXJncDsKKyAgcmVnaXN0ZXIgZmZpX3R5cGUgKipwX2FyZzsKKyAgcmVnaXN0ZXIgaW50IGNvdW50ID0gMDsKKworICBwX2FyZ3YgPSBlY2lmLT5hdmFsdWU7CisgIGFyZ3AgPSBzdGFjazsKKworICBmb3IgKGkgPSBlY2lmLT5jaWYtPm5hcmdzLCBwX2FyZyA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOworICAgICAgIChpICE9IDApOworICAgICAgIGktLSwgcF9hcmcrKykKKyAgICB7CisgICAgICBzaXplX3QgejsKKyAgICAgIAorICAgICAgeiA9ICgqcF9hcmcpLT5zaXplOworCisgICAgICBpZiAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorCXsKKwkgIHogPSBzaXplb2Yodm9pZCopOworCSAgKih2b2lkICoqKSBhcmdwID0gKnBfYXJndjsKKwl9IAorICAgICAgLyogICAgICBpZiAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisJeworCSAgaWYgKGNvdW50ID4gMjQpCisJICAgIHsKKwkgICAgICAvLyBUaGlzIGlzIGdvaW5nIG9uIHRoZSBzdGFjay4gIFR1cm4gaXQgaW50byBhIGRvdWJsZS4gIAorCSAgICAgICooZG91YmxlICopIGFyZ3AgPSAoZG91YmxlKSAqKGZsb2F0KikoKiBwX2FyZ3YpOworCSAgICAgIHogPSBzaXplb2YoZG91YmxlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICAqKHZvaWQgKiopIGFyZ3AgPSAqKHZvaWQgKiopKCogcF9hcmd2KTsKKwl9ICAqLworICAgICAgZWxzZSBpZiAoeiA8IHNpemVvZihpbnQpKQorCXsKKwkgIHogPSBzaXplb2YoaW50KTsKKwkgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDggKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgICAgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDggKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkgICAgICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDE2ICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKwkJICAKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMTYgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCQkgIAorCSAgICBkZWZhdWx0OgorCSAgICAgIEZGSV9BU1NFUlQoMCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICh6ID09IHNpemVvZihpbnQpKQorCXsKKwkgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDMyICopKCogcF9hcmd2KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWVtY3B5KGFyZ3AsICpwX2FyZ3YsIHopOworCX0KKyAgICAgIHBfYXJndisrOworICAgICAgYXJncCArPSB6OworICAgICAgY291bnQgKz0gejsKKyAgICB9CisKKyAgcmV0dXJuIChzdGFjayArICgoY291bnQgPiAyNCkgPyAyNCA6IEFMSUdOX0RPV04oY291bnQsIDgpKSk7Cit9CisKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KK2ZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworICBpZiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgY2lmLT5mbGFncyA9IC0xOworICBlbHNlCisgICAgY2lmLT5mbGFncyA9IGNpZi0+cnR5cGUtPnNpemU7CisKKyAgY2lmLT5ieXRlcyA9IEFMSUdOIChjaWYtPmJ5dGVzLCA4KTsKKworICByZXR1cm4gRkZJX09LOworfQorCitleHRlcm4gdm9pZCBmZmlfY2FsbF9FQUJJKHZvaWQgKigqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwgCisJCQkgIGV4dGVuZGVkX2NpZiAqLCAKKwkJCSAgdW5zaWduZWQsIHVuc2lnbmVkLCAKKwkJCSAgdW5zaWduZWQgKiwgCisJCQkgIHZvaWQgKCpmbikodm9pZCkpOworCit2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgCisJICAgICAgdm9pZCAoKmZuKSh2b2lkKSwgCisJICAgICAgdm9pZCAqcnZhbHVlLCAKKwkgICAgICB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisgIAorICAvKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0IGFuZCB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuCSovCisgIC8qIHZhbHVlIGFkZHJlc3MgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lCQkgICAgICAgICovCisKKyAgaWYgKChydmFsdWUgPT0gTlVMTCkgJiYgCisgICAgICAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpKQorICAgIHsKKyAgICAgIGVjaWYucnZhbHVlID0gYWxsb2NhKGNpZi0+cnR5cGUtPnNpemUpOworICAgIH0KKyAgZWxzZQorICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOworICAgIAorICAKKyAgc3dpdGNoIChjaWYtPmFiaSkgCisgICAgeworICAgIGNhc2UgRkZJX0VBQkk6CisgICAgICBmZmlfY2FsbF9FQUJJKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBjaWYtPmJ5dGVzLCAKKwkJICAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkZJX0FTU0VSVCgwKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBmZmlfY2xvc3VyZV9lYWJpICh1bnNpZ25lZCBhcmcxLCB1bnNpZ25lZCBhcmcyLCB1bnNpZ25lZCBhcmczLAorCQkgICAgICAgdW5zaWduZWQgYXJnNCwgdW5zaWduZWQgYXJnNSwgdW5zaWduZWQgYXJnNikKK3sKKyAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSB0cmFtcG9saW5lLiAgVGhlIHRyYW1wb2xpbmUgc3Rvd3MgYQorICAgICBwb2ludGVyIHRvIHRoZSBmZmlfY2xvc3VyZSBvYmplY3QgaW4gZ3I3LiAgV2UgbXVzdCBzYXZlIHRoaXMKKyAgICAgcG9pbnRlciBpbiBhIHBsYWNlIHRoYXQgd2lsbCBwZXJzaXN0IHdoaWxlIHdlIGRvIG91ciB3b3JrLiAgKi8KKyAgcmVnaXN0ZXIgZmZpX2Nsb3N1cmUgKmNyZWcgX19hc21fXyAoImdyNyIpOworICBmZmlfY2xvc3VyZSAqY2xvc3VyZSA9IGNyZWc7CisKKyAgLyogQXJndW1lbnRzIHRoYXQgZG9uJ3QgZml0IGluIHJlZ2lzdGVycyBhcmUgZm91bmQgb24gdGhlIHN0YWNrCisgICAgIGF0IGEgZml4ZWQgb2Zmc2V0IGFib3ZlIHRoZSBjdXJyZW50IGZyYW1lIHBvaW50ZXIuICAqLworICByZWdpc3RlciBjaGFyICpmcmFtZV9wb2ludGVyIF9fYXNtX18gKCJmcCIpOworICBjaGFyICpzdGFja19hcmdzID0gZnJhbWVfcG9pbnRlciArIDE2OworCisgIC8qIExheSB0aGUgcmVnaXN0ZXIgYXJndW1lbnRzIGRvd24gaW4gYSBjb250aW51b3VzIGNodW5rIG9mIG1lbW9yeS4gICovCisgIHVuc2lnbmVkIHJlZ2lzdGVyX2FyZ3NbNl0gPQorICAgIHsgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiB9OworCisgIGZmaV9jaWYgKmNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgZmZpX3R5cGUgKiphcmdfdHlwZXMgPSBjaWYtPmFyZ190eXBlczsKKyAgdm9pZCAqKmF2YWx1ZSA9IGFsbG9jYSAoY2lmLT5uYXJncyAqIHNpemVvZih2b2lkICopKTsKKyAgY2hhciAqcHRyID0gKGNoYXIgKikgcmVnaXN0ZXJfYXJnczsKKyAgaW50IGk7CisKKyAgLyogRmluZCB0aGUgYWRkcmVzcyBvZiBlYWNoIGFyZ3VtZW50LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNpZi0+bmFyZ3M7IGkrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKGFyZ190eXBlc1tpXS0+dHlwZSkKKwl7CisJY2FzZSBGRklfVFlQRV9TSU5UODoKKwljYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgYXZhbHVlW2ldID0gcHRyICsgMzsKKwkgIGJyZWFrOworCWNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgYXZhbHVlW2ldID0gcHRyICsgMjsKKwkgIGJyZWFrOworCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgorCWNhc2UgRkZJX1RZUEVfVUlOVDMyOgorCWNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJICBhdmFsdWVbaV0gPSBwdHI7CisJICBicmVhazsKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIGF2YWx1ZVtpXSA9ICoodm9pZCoqKXB0cjsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICAvKiBUaGlzIGlzIGFuIDgtYnl0ZSB2YWx1ZS4gICovCisJICBhdmFsdWVbaV0gPSBwdHI7CisJICBwdHIgKz0gNDsKKwkgIGJyZWFrOworCX0KKyAgICAgIHB0ciArPSA0OworCisgICAgICAvKiBJZiB3ZSd2ZSBoYW5kbGVkIG1vcmUgYXJndW1lbnRzIHRoYW4gZml0IGluIHJlZ2lzdGVycywKKwkgc3RhcnQgbG9va2luZyBhdCB0aGUgdGhvc2UgcGFzc2VkIG9uIHRoZSBzdGFjay4gICovCisgICAgICBpZiAocHRyID09ICgoY2hhciAqKXJlZ2lzdGVyX2FyZ3MgKyAoNio0KSkpCisJcHRyID0gc3RhY2tfYXJnczsKKyAgICB9CisKKyAgLyogSW52b2tlIHRoZSBjbG9zdXJlLiAgKi8KKyAgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHsKKyAgICAgIC8qIFRoZSBjYWxsZXIgYWxsb2NhdGVzIHNwYWNlIGZvciB0aGUgcmV0dXJuIHN0cnVjdHVyZSwgYW5kCisgICAgICAgcGFzc2VzIGEgcG9pbnRlciB0byB0aGlzIHNwYWNlIGluIGdyMy4gIFVzZSB0aGlzIHZhbHVlIGRpcmVjdGx5CisgICAgICAgYXMgdGhlIHJldHVybiB2YWx1ZS4gICovCisgICAgICByZWdpc3RlciB2b2lkICpyZXR1cm5fc3RydWN0X3B0ciBfX2FzbV9fKCJncjMiKTsKKyAgICAgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJldHVybl9zdHJ1Y3RfcHRyLCBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uLiAgKi8KKyAgICAgIGxvbmcgbG9uZyBydmFsdWU7CisgICAgICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCAmcnZhbHVlLCBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gNC1ieXRlIG9yIHNtYWxsZXIgcmVzdWx0cyBpbiBncjguICA4LWJ5dGUKKwkgdmFsdWVzIGFsc28gdXNlIGdyOS4gIFdlIGZpbGwgdGhlIGJvdGgsIGV2ZW4gZm9yIHNtYWxsIHJldHVybgorCSB2YWx1ZXMsIGp1c3QgdG8gYXZvaWQgYSBicmFuY2guICAqLyAKKyAgICAgIGFzbSAoImxkaSAgQCglMCwgIzApLCBncjgiIDogOiAiciIgKCZydmFsdWUpKTsKKyAgICAgIGFzbSAoImxkaSAgQCglMCwgIzApLCBncjkiIDogOiAiciIgKCYoKGludCAqKSAmcnZhbHVlKVsxXSkpOworICAgIH0KK30KKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2xvc3VyZV9sb2MgKGZmaV9jbG9zdXJlKiBjbG9zdXJlLAorCQkgICAgICBmZmlfY2lmKiBjaWYsCisJCSAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLCB2b2lkKiwgdm9pZCoqLCB2b2lkKiksCisJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJICAgICAgdm9pZCAqY29kZWxvYykKK3sKKyAgdW5zaWduZWQgaW50ICp0cmFtcCA9ICh1bnNpZ25lZCBpbnQgKikgJmNsb3N1cmUtPnRyYW1wWzBdOworICB1bnNpZ25lZCBsb25nIGZuID0gKGxvbmcpIGZmaV9jbG9zdXJlX2VhYmk7CisgIHVuc2lnbmVkIGxvbmcgY2xzID0gKGxvbmcpIGNvZGVsb2M7CisjaWZkZWYgX19GUlZfRkRQSUNfXworICByZWdpc3RlciB2b2lkICpnb3QgX19hc21fXygiZ3IxNSIpOworI2VuZGlmCisgIGludCBpOworCisgIGZuID0gKHVuc2lnbmVkIGxvbmcpIGZmaV9jbG9zdXJlX2VhYmk7CisKKyNpZmRlZiBfX0ZSVl9GRFBJQ19fCisgIHRyYW1wWzBdID0gJigodW5zaWduZWQgaW50ICopY29kZWxvYylbMl07CisgIHRyYW1wWzFdID0gZ290OworICB0cmFtcFsyXSA9IDB4OGNmYzAwMDAgKyAoZm4gICYgMHhmZmZmKTsgLyogc2V0bG9zIGxvKGZuKSwgZ3I2ICAgICovCisgIHRyYW1wWzNdID0gMHg4ZWZjMDAwMCArIChjbHMgJiAweGZmZmYpOyAvKiBzZXRsb3MgbG8oY2xzKSwgZ3I3ICAgKi8KKyAgdHJhbXBbNF0gPSAweDhjZjgwMDAwICsgKGZuICA+PiAxNik7CSAgLyogc2V0aGkgaGkoZm4pLCBncjYgICAgICovCisgIHRyYW1wWzVdID0gMHg4ZWY4MDAwMCArIChjbHMgPj4gMTYpOyAgICAvKiBzZXRoaSBoaShjbHMpLCBncjcgICAgKi8KKyAgdHJhbXBbNl0gPSAweDljYzg2MDAwOyAgICAgICAgICAgICAgICAgIC8qIGxkaSBAKGdyNiwgIzApLCBncjE0ICAqLworICB0cmFtcFs3XSA9IDB4ODAzMGUwMDA7ICAgICAgICAgICAgICAgICAgLyogam1wbCBAKGdyMTQsIGdyMCkgICAgICovCisjZWxzZQorICB0cmFtcFswXSA9IDB4OGNmYzAwMDAgKyAoZm4gICYgMHhmZmZmKTsgLyogc2V0bG9zIGxvKGZuKSwgZ3I2ICAgICovCisgIHRyYW1wWzFdID0gMHg4ZWZjMDAwMCArIChjbHMgJiAweGZmZmYpOyAvKiBzZXRsb3MgbG8oY2xzKSwgZ3I3ICAgKi8KKyAgdHJhbXBbMl0gPSAweDhjZjgwMDAwICsgKGZuICA+PiAxNik7CSAgLyogc2V0aGkgaGkoZm4pLCBncjYgICAgICovCisgIHRyYW1wWzNdID0gMHg4ZWY4MDAwMCArIChjbHMgPj4gMTYpOyAgICAvKiBzZXRoaSBoaShjbHMpLCBncjcgICAgKi8KKyAgdHJhbXBbNF0gPSAweDgwMzAwMDA2OyAgICAgICAgICAgICAgICAgIC8qIGptcGwgQChncjAsIGdyNikgICAgICAqLworI2VuZGlmCisKKyAgY2xvc3VyZS0+Y2lmID0gY2lmOworICBjbG9zdXJlLT5mdW4gPSBmdW47CisgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKworICAvKiBDYWNoZSBmbHVzaGluZy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBGRklfVFJBTVBPTElORV9TSVpFOyBpKyspCisgICAgX19hc21fXyB2b2xhdGlsZSAoImRjZiBAKCUwLCUxKVxuXHRpY2kgQCglMiwlMSkiIDo6ICJyIiAodHJhbXApLCAiciIgKGkpLAorCQkgICAgICAiciIgKGNvZGVsb2MpKTsKKworICByZXR1cm4gRkZJX09LOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9mcnYvZmZpdGFyZ2V0LmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2Zydi9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODM5MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9mcnYvZmZpdGFyZ2V0LmgKQEAgLTAsMCArMSw1NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgIFJlZCBIYXQsIEluYy4KKyAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgRlItVgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICisjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAorCisvKiAtLS0tIFN5c3RlbSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9BU00KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBmZmlfYXJnOwordHlwZWRlZiBzaWduZWQgbG9uZyAgICAgICAgICAgIGZmaV9zYXJnOworCit0eXBlZGVmIGVudW0gZmZpX2FiaSB7CisgIEZGSV9GSVJTVF9BQkkgPSAwLAorICBGRklfRUFCSSwKKyAgRkZJX0xBU1RfQUJJLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfRUFCSQorfSBmZmlfYWJpOworI2VuZGlmCisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIGNsb3N1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRkZJX0NMT1NVUkVTIDEKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKworI2lmZGVmIF9fRlJWX0ZEUElDX18KKy8qIFRyYW1wb2xpbmVzIGFyZSA4IDQtYnl0ZSBpbnN0cnVjdGlvbnMgbG9uZy4gICovCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgKDgqNCkKKyNlbHNlCisvKiBUcmFtcG9saW5lcyBhcmUgNSA0LWJ5dGUgaW5zdHJ1Y3Rpb25zIGxvbmcuICAqLworI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFICg1KjQpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2lhNjQvZmZpLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2lhNjQvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxMjBlZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvaWE2NC9mZmkuYwpAQCAtMCwwICsxLDU4MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDExIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwIEhld2xldHQgUGFja2FyZCBDb21wYW55CisgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5OCwgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCisJICAgCisgICBJQTY0IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJpYTY0X2ZsYWdzLmgiCisKKy8qIEEgNjQtYml0IHBvaW50ZXIgdmFsdWUuICBJbiBMUDY0IG1vZGUsIHRoaXMgaXMgZWZmZWN0aXZlbHkgYSBwbGFpbgorICAgcG9pbnRlci4gIEluIElMUDMyIG1vZGUsIGl0J3MgYSBwb2ludGVyIHRoYXQncyBiZWVuIGV4dGVuZGVkIHRvIAorICAgNjQgYml0cyBieSAiYWRkcDQiLiAgKi8KK3R5cGVkZWYgdm9pZCAqUFRSNjQgX19hdHRyaWJ1dGVfXygobW9kZShESSkpKTsKKworLyogTWVtb3J5IGltYWdlIG9mIGZwIHJlZ2lzdGVyIGNvbnRlbnRzLiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24KKyAgIHNwZWNpZmljIGZvcm1hdCB1c2VkIGJ5IGxkZi5maWxsL3N0Zi5zcGlsbC4gIEFsbCB3ZSBjYXJlIGFib3V0IGlzCisgICB0aGF0IGl0IHdhbnRzIGEgMTYgYnl0ZSBhbGlnbmVkIHNsb3QuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUlOVDY0IHhbMl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKK30gZnByZWc7CisKKworLyogVGhlIHN0YWNrIGxheW91dCBnaXZlbiB0byBmZmlfY2FsbF91bml4IGFuZCBmZmlfY2xvc3VyZV91bml4X2lubmVyLiAgKi8KKworc3RydWN0IGlhNjRfYXJncworeworICBmcHJlZyBmcF9yZWdzWzhdOwkvKiBDb250ZW50cyBvZiA4IGZwIGFyZyByZWdpc3RlcnMuICAqLworICBVSU5UNjQgZ3BfcmVnc1s4XTsJLyogQ29udGVudHMgb2YgOCBncCBhcmcgcmVnaXN0ZXJzLiAgKi8KKyAgVUlOVDY0IG90aGVyX2FyZ3NbXTsJLyogQXJndW1lbnRzIHBhc3NlZCBvbiBzdGFjaywgdmFyaWFibGUgc2l6ZS4gICovCit9OworCisKKy8qIEFkanVzdCBBRERSLCBhIHBvaW50ZXIgdG8gYW4gOCBieXRlIHNsb3QsIHRvIHBvaW50IHRvIHRoZSBsb3cgTEVOIGJ5dGVzLiAgKi8KKworc3RhdGljIGlubGluZSB2b2lkICoKK2VuZGlhbl9hZGp1c3QgKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pCit7CisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyAgcmV0dXJuIGFkZHIgKyAoOCAtIGxlbik7CisjZWxzZQorICByZXR1cm4gYWRkcjsKKyNlbmRpZgorfQorCisvKiBTdG9yZSBWQUxVRSB0byBBRERSIGluIHRoZSBjdXJyZW50IGNwdSBpbXBsZW1lbnRhdGlvbidzIGZwIHNwaWxsIGZvcm1hdC4KKyAgIFRoaXMgaXMgYSBtYWNybyBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24sIHNvIHRoYXQgaXQgd29ya3MgZm9yIGFsbCAzIGZsb2F0aW5nCisgICBwb2ludCB0eXBlcyB3aXRob3V0IHR5cGUgY29udmVyc2lvbnMuICBUeXBlIGNvbnZlcnNpb24gdG8gbG9uZyBkb3VibGUgYnJlYWtzCisgICB0aGUgZGVub3JtIHN1cHBvcnQuICAqLworCisjZGVmaW5lIHN0Zl9zcGlsbChhZGRyLCB2YWx1ZSkJXAorICBhc20gKCJzdGYuc3BpbGwgJTAgPSAlMSVQMCIgOiAiPW0iICgqYWRkcikgOiAiZiIodmFsdWUpKTsKKworLyogTG9hZCBhIHZhbHVlIGZyb20gQUREUiwgd2hpY2ggaXMgaW4gdGhlIGN1cnJlbnQgY3B1IGltcGxlbWVudGF0aW9uJ3MKKyAgIGZwIHNwaWxsIGZvcm1hdC4gIEFzIGFib3ZlLCB0aGlzIG11c3QgYWxzbyBiZSBhIG1hY3JvLiAgKi8KKworI2RlZmluZSBsZGZfZmlsbChyZXN1bHQsIGFkZHIpCVwKKyAgYXNtICgibGRmLmZpbGwgJTAgPSAlMSVQMSIgOiAiPWYiKHJlc3VsdCkgOiAibSIoKmFkZHIpKTsKKworLyogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBDIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHdpdGggVFlQRS4gIFdoaWNoIHdpbGwKKyAgIGJlIG9uZSBvZiB0aGUgRkZJX0lBNjRfVFlQRV9IRkFfKiB2YWx1ZXMuICAqLworCitzdGF0aWMgc2l6ZV90CitoZmFfdHlwZV9zaXplIChpbnQgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9JQTY0X1RZUEVfSEZBX0ZMT0FUOgorICAgICAgcmV0dXJuIHNpemVvZihmbG9hdCk7CisgICAgY2FzZSBGRklfSUE2NF9UWVBFX0hGQV9ET1VCTEU6CisgICAgICByZXR1cm4gc2l6ZW9mKGRvdWJsZSk7CisgICAgY2FzZSBGRklfSUE2NF9UWVBFX0hGQV9MRE9VQkxFOgorICAgICAgcmV0dXJuIHNpemVvZihfX2Zsb2F0ODApOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIExvYWQgZnJvbSBBRERSIGEgdmFsdWUgaW5kaWNhdGVkIGJ5IFRZUEUuICBXaGljaCB3aWxsIGJlIG9uZSBvZgorICAgdGhlIEZGSV9JQTY0X1RZUEVfSEZBXyogdmFsdWVzLiAgKi8KKworc3RhdGljIHZvaWQKK2hmYV90eXBlX2xvYWQgKGZwcmVnICpmcGFkZHIsIGludCB0eXBlLCB2b2lkICphZGRyKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgRkZJX0lBNjRfVFlQRV9IRkFfRkxPQVQ6CisgICAgICBzdGZfc3BpbGwgKGZwYWRkciwgKihmbG9hdCAqKSBhZGRyKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEZGSV9JQTY0X1RZUEVfSEZBX0RPVUJMRToKKyAgICAgIHN0Zl9zcGlsbCAoZnBhZGRyLCAqKGRvdWJsZSAqKSBhZGRyKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEZGSV9JQTY0X1RZUEVfSEZBX0xET1VCTEU6CisgICAgICBzdGZfc3BpbGwgKGZwYWRkciwgKihfX2Zsb2F0ODAgKikgYWRkcik7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogTG9hZCBWQUxVRSBpbnRvIEFERFIgYXMgaW5kaWNhdGVkIGJ5IFRZUEUuICBXaGljaCB3aWxsIGJlIG9uZSBvZgorICAgdGhlIEZGSV9JQTY0X1RZUEVfSEZBXyogdmFsdWVzLiAgKi8KKworc3RhdGljIHZvaWQKK2hmYV90eXBlX3N0b3JlIChpbnQgdHlwZSwgdm9pZCAqYWRkciwgZnByZWcgKmZwYWRkcikKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9JQTY0X1RZUEVfSEZBX0ZMT0FUOgorICAgICAgeworCWZsb2F0IHJlc3VsdDsKKwlsZGZfZmlsbCAocmVzdWx0LCBmcGFkZHIpOworCSooZmxvYXQgKikgYWRkciA9IHJlc3VsdDsKKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEZGSV9JQTY0X1RZUEVfSEZBX0RPVUJMRToKKyAgICAgIHsKKwlkb3VibGUgcmVzdWx0OworCWxkZl9maWxsIChyZXN1bHQsIGZwYWRkcik7CisJKihkb3VibGUgKikgYWRkciA9IHJlc3VsdDsKKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEZGSV9JQTY0X1RZUEVfSEZBX0xET1VCTEU6CisgICAgICB7CisJX19mbG9hdDgwIHJlc3VsdDsKKwlsZGZfZmlsbCAocmVzdWx0LCBmcGFkZHIpOworCSooX19mbG9hdDgwICopIGFkZHIgPSByZXN1bHQ7CisJYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogSXMgVFlQRSBhIHN0cnVjdCBjb250YWluaW5nIGZsb2F0cywgZG91Ymxlcywgb3IgZXh0ZW5kZWQgZG91YmxlcywKKyAgIGFsbCBvZiB0aGUgc2FtZSBmcCB0eXBlPyAgSWYgc28sIHJldHVybiB0aGUgZWxlbWVudCB0eXBlLiAgUmV0dXJuCisgICBGRklfVFlQRV9WT0lEIGlmIG5vdC4gICovCisKK3N0YXRpYyBpbnQKK2hmYV9lbGVtZW50X3R5cGUgKGZmaV90eXBlICp0eXBlLCBpbnQgbmVzdGVkKQoreworICBpbnQgZWxlbWVudCA9IEZGSV9UWVBFX1ZPSUQ7CisKKyAgc3dpdGNoICh0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgLyogV2Ugd2FudCB0byByZXR1cm4gVk9JRCBmb3IgcmF3IGZsb2F0aW5nLXBvaW50IHR5cGVzLCBidXQgdGhlCisJIHN5bnRoZXRpYyBIRkEgdHlwZSBpZiB3ZSdyZSBuZXN0ZWQgd2l0aGluIGFuIGFnZ3JlZ2F0ZS4gICovCisgICAgICBpZiAobmVzdGVkKQorCWVsZW1lbnQgPSBGRklfSUE2NF9UWVBFX0hGQV9GTE9BVDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgICAvKiBTaW1pbGFybHkuICAqLworICAgICAgaWYgKG5lc3RlZCkKKwllbGVtZW50ID0gRkZJX0lBNjRfVFlQRV9IRkFfRE9VQkxFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisgICAgICAvKiBTaW1pbGFybHksIGV4Y2VwdCB0aGF0IHRoYXQgSEZBIGlzIHRydWUgZm9yIGRvdWJsZSBleHRlbmRlZCwKKwkgYnV0IG5vdCBxdWFkIHByZWNpc2lvbi4gIEJvdGggaGF2ZSBzaXplb2YgPT0gMTYsIHNvIHRlbGwgdGhlCisJIGRpZmZlcmVuY2UgYmFzZWQgb24gdGhlIHByZWNpc2lvbi4gICovCisgICAgICBpZiAoTERCTF9NQU5UX0RJRyA9PSA2NCAmJiBuZXN0ZWQpCisJZWxlbWVudCA9IEZGSV9JQTY0X1RZUEVfSEZBX0xET1VCTEU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgeworCWZmaV90eXBlICoqcHRyID0gJnR5cGUtPmVsZW1lbnRzWzBdOworCisJZm9yIChwdHIgPSAmdHlwZS0+ZWxlbWVudHNbMF07ICpwdHIgOyBwdHIrKykKKwkgIHsKKwkgICAgaW50IHN1Yl9lbGVtZW50ID0gaGZhX2VsZW1lbnRfdHlwZSAoKnB0ciwgMSk7CisJICAgIGlmIChzdWJfZWxlbWVudCA9PSBGRklfVFlQRV9WT0lEKQorCSAgICAgIHJldHVybiBGRklfVFlQRV9WT0lEOworCisJICAgIGlmIChlbGVtZW50ID09IEZGSV9UWVBFX1ZPSUQpCisJICAgICAgZWxlbWVudCA9IHN1Yl9lbGVtZW50OworCSAgICBlbHNlIGlmIChlbGVtZW50ICE9IHN1Yl9lbGVtZW50KQorCSAgICAgIHJldHVybiBGRklfVFlQRV9WT0lEOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZGSV9UWVBFX1ZPSUQ7CisgICAgfQorCisgIHJldHVybiBlbGVtZW50OworfQorCisKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcuICovCisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2NpZl9tYWNoZGVwKGZmaV9jaWYgKmNpZikKK3sKKyAgaW50IGZsYWdzOworCisgIC8qIEFkanVzdCBjaWYtPmJ5dGVzIHRvIGluY2x1ZGUgc3BhY2UgZm9yIHRoZSBiaXRzIG9mIHRoZSBpYTY0X2FyZ3MgZnJhbWUKKyAgICAgdGhhdCBwcmVjZWRlcyB0aGUgaW50ZWdlciByZWdpc3RlciBwb3J0aW9uLiAgVGhlIGVzdGltYXRlIHRoYXQgdGhlCisgICAgIGdlbmVyaWMgYml0cyBkaWQgZm9yIHRoZSBhcmd1bWVudCBzcGFjZSByZXF1aXJlZCBpcyBnb29kIGVub3VnaCBmb3IgdGhlCisgICAgIGludGVnZXIgY29tcG9uZW50LiAgKi8KKyAgY2lmLT5ieXRlcyArPSBvZmZzZXRvZihzdHJ1Y3QgaWE2NF9hcmdzLCBncF9yZWdzWzBdKTsKKyAgaWYgKGNpZi0+Ynl0ZXMgPCBzaXplb2Yoc3RydWN0IGlhNjRfYXJncykpCisgICAgY2lmLT5ieXRlcyA9IHNpemVvZihzdHJ1Y3QgaWE2NF9hcmdzKTsKKworICAvKiBTZXQgdGhlIHJldHVybiB0eXBlIGZsYWcuICovCisgIGZsYWdzID0gY2lmLT5ydHlwZS0+dHlwZTsKKyAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisgICAgICAvKiBMZWF2ZSBGRklfVFlQRV9MT05HRE9VQkxFIGFzIG1lYW5pbmcgZG91YmxlIGV4dGVuZGVkIHByZWNpc2lvbiwKKwkgYW5kIGVuY29kZSBxdWFkIHByZWNpc2lvbiBhcyBhIHR3by13b3JkIGludGVnZXIgc3RydWN0dXJlLiAgKi8KKyAgICAgIGlmIChMREJMX01BTlRfRElHICE9IDY0KQorCWZsYWdzID0gRkZJX0lBNjRfVFlQRV9TTUFMTF9TVFJVQ1QgfCAoMTYgPDwgOCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IGNpZi0+cnR5cGUtPnNpemU7CisgIAlpbnQgaGZhX3R5cGUgPSBoZmFfZWxlbWVudF90eXBlIChjaWYtPnJ0eXBlLCAwKTsKKworCWlmIChoZmFfdHlwZSAhPSBGRklfVFlQRV9WT0lEKQorCSAgeworCSAgICBzaXplX3QgbmVsdHMgPSBzaXplIC8gaGZhX3R5cGVfc2l6ZSAoaGZhX3R5cGUpOworCSAgICBpZiAobmVsdHMgPD0gOCkKKwkgICAgICBmbGFncyA9IGhmYV90eXBlIHwgKHNpemUgPDwgOCk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAoc2l6ZSA8PSAzMikKKwkgICAgICBmbGFncyA9IEZGSV9JQTY0X1RZUEVfU01BTExfU1RSVUNUIHwgKHNpemUgPDwgOCk7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIGNpZi0+ZmxhZ3MgPSBmbGFnczsKKworICByZXR1cm4gRkZJX09LOworfQorCitleHRlcm4gaW50IGZmaV9jYWxsX3VuaXggKHN0cnVjdCBpYTY0X2FyZ3MgKiwgUFRSNjQsIHZvaWQgKCopKHZvaWQpLCBVSU5UNjQpOworCit2b2lkCitmZmlfY2FsbChmZmlfY2lmICpjaWYsIHZvaWQgKCpmbikodm9pZCksIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZSkKK3sKKyAgc3RydWN0IGlhNjRfYXJncyAqc3RhY2s7CisgIGxvbmcgaSwgYXZuLCBncGNvdW50LCBmcGNvdW50OworICBmZmlfdHlwZSAqKnBfYXJnOworCisgIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9VTklYKTsKKworICAvKiBJZiB3ZSBoYXZlIG5vIHNwb3QgZm9yIGEgcmV0dXJuIHZhbHVlLCBtYWtlIG9uZS4gICovCisgIGlmIChydmFsdWUgPT0gTlVMTCAmJiBjaWYtPnJ0eXBlLT50eXBlICE9IEZGSV9UWVBFX1ZPSUQpCisgICAgcnZhbHVlID0gYWxsb2NhIChjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICAKKyAgLyogQWxsb2NhdGUgdGhlIHN0YWNrIGZyYW1lLiAgKi8KKyAgc3RhY2sgPSBhbGxvY2EgKGNpZi0+Ynl0ZXMpOworCisgIGdwY291bnQgPSBmcGNvdW50ID0gMDsKKyAgYXZuID0gY2lmLT5uYXJnczsKKyAgZm9yIChpID0gMCwgcF9hcmcgPSBjaWYtPmFyZ190eXBlczsgaSA8IGF2bjsgaSsrLCBwX2FyZysrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJeworCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICBzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdID0gKihTSU5UOCAqKWF2YWx1ZVtpXTsKKwkgIGJyZWFrOworCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJICBzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdID0gKihVSU5UOCAqKWF2YWx1ZVtpXTsKKwkgIGJyZWFrOworCWNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCSAgc3RhY2stPmdwX3JlZ3NbZ3Bjb3VudCsrXSA9ICooU0lOVDE2ICopYXZhbHVlW2ldOworCSAgYnJlYWs7CisJY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICBzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdID0gKihVSU5UMTYgKilhdmFsdWVbaV07CisJICBicmVhazsKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwkgIHN0YWNrLT5ncF9yZWdzW2dwY291bnQrK10gPSAqKFNJTlQzMiAqKWF2YWx1ZVtpXTsKKwkgIGJyZWFrOworCWNhc2UgRkZJX1RZUEVfVUlOVDMyOgorCSAgc3RhY2stPmdwX3JlZ3NbZ3Bjb3VudCsrXSA9ICooVUlOVDMyICopYXZhbHVlW2ldOworCSAgYnJlYWs7CisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJICBzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdID0gKihVSU5UNjQgKilhdmFsdWVbaV07CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKwkgIHN0YWNrLT5ncF9yZWdzW2dwY291bnQrK10gPSAoVUlOVDY0KShQVFI2NCkgKih2b2lkICoqKWF2YWx1ZVtpXTsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgIGlmIChncGNvdW50IDwgOCAmJiBmcGNvdW50IDwgOCkKKwkgICAgc3RmX3NwaWxsICgmc3RhY2stPmZwX3JlZ3NbZnBjb3VudCsrXSwgKihmbG9hdCAqKWF2YWx1ZVtpXSk7CisJICBzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdID0gKihVSU5UMzIgKilhdmFsdWVbaV07CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgaWYgKGdwY291bnQgPCA4ICYmIGZwY291bnQgPCA4KQorCSAgICBzdGZfc3BpbGwgKCZzdGFjay0+ZnBfcmVnc1tmcGNvdW50KytdLCAqKGRvdWJsZSAqKWF2YWx1ZVtpXSk7CisJICBzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdID0gKihVSU5UNjQgKilhdmFsdWVbaV07CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKwkgIGlmIChncGNvdW50ICYgMSkKKwkgICAgZ3Bjb3VudCsrOworCSAgaWYgKExEQkxfTUFOVF9ESUcgPT0gNjQgJiYgZ3Bjb3VudCA8IDggJiYgZnBjb3VudCA8IDgpCisJICAgIHN0Zl9zcGlsbCAoJnN0YWNrLT5mcF9yZWdzW2ZwY291bnQrK10sICooX19mbG9hdDgwICopYXZhbHVlW2ldKTsKKwkgIG1lbWNweSAoJnN0YWNrLT5ncF9yZWdzW2dwY291bnRdLCBhdmFsdWVbaV0sIDE2KTsKKwkgIGdwY291bnQgKz0gMjsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICB7CisJICAgIHNpemVfdCBzaXplID0gKCpwX2FyZyktPnNpemU7CisJICAgIHNpemVfdCBhbGlnbiA9ICgqcF9hcmcpLT5hbGlnbm1lbnQ7CisJICAgIGludCBoZmFfdHlwZSA9IGhmYV9lbGVtZW50X3R5cGUgKCpwX2FyZywgMCk7CisKKwkgICAgRkZJX0FTU0VSVCAoYWxpZ24gPD0gMTYpOworCSAgICBpZiAoYWxpZ24gPT0gMTYgJiYgKGdwY291bnQgJiAxKSkKKwkgICAgICBncGNvdW50Kys7CisKKwkgICAgaWYgKGhmYV90eXBlICE9IEZGSV9UWVBFX1ZPSUQpCisJICAgICAgeworCQlzaXplX3QgaGZhX3NpemUgPSBoZmFfdHlwZV9zaXplIChoZmFfdHlwZSk7CisJCXNpemVfdCBvZmZzZXQgPSAwOworCQlzaXplX3QgZ3Bfb2Zmc2V0ID0gZ3Bjb3VudCAqIDg7CisKKwkJd2hpbGUgKGZwY291bnQgPCA4CisJCSAgICAgICAmJiBvZmZzZXQgPCBzaXplCisJCSAgICAgICAmJiBncF9vZmZzZXQgPCA4ICogOCkKKwkJICB7CisJCSAgICBoZmFfdHlwZV9sb2FkICgmc3RhY2stPmZwX3JlZ3NbZnBjb3VudF0sIGhmYV90eXBlLAorCQkJCSAgIGF2YWx1ZVtpXSArIG9mZnNldCk7CisJCSAgICBvZmZzZXQgKz0gaGZhX3NpemU7CisJCSAgICBncF9vZmZzZXQgKz0gaGZhX3NpemU7CisJCSAgICBmcGNvdW50ICs9IDE7CisJCSAgfQorCSAgICAgIH0KKworCSAgICBtZW1jcHkgKCZzdGFjay0+Z3BfcmVnc1tncGNvdW50XSwgYXZhbHVlW2ldLCBzaXplKTsKKwkgICAgZ3Bjb3VudCArPSAoc2l6ZSArIDcpIC8gODsKKwkgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgZmZpX2NhbGxfdW5peCAoc3RhY2ssIHJ2YWx1ZSwgZm4sIGNpZi0+ZmxhZ3MpOworfQorCisvKiBDbG9zdXJlcyByZXByZXNlbnQgYSBwYWlyIGNvbnNpc3Rpbmcgb2YgYSBmdW5jdGlvbiBwb2ludGVyLCBhbmQKKyAgIHNvbWUgdXNlciBkYXRhLiAgQSBjbG9zdXJlIGlzIGludm9rZWQgYnkgcmVpbnRlcnByZXRpbmcgdGhlIGNsb3N1cmUKKyAgIGFzIGEgZnVuY3Rpb24gcG9pbnRlciwgYW5kIGJyYW5jaGluZyB0byBpdC4gIFRodXMgd2UgY2FuIG1ha2UgYW4KKyAgIGludGVycHJldGVkIGZ1bmN0aW9uIGNhbGxhYmxlIGFzIGEgQyBmdW5jdGlvbjogV2UgdHVybiB0aGUKKyAgIGludGVycHJldGVyIGl0c2VsZiwgdG9nZXRoZXIgd2l0aCBhIHBvaW50ZXIgc3BlY2lmeWluZyB0aGUKKyAgIGludGVycHJldGVkIHByb2NlZHVyZSwgaW50byBhIGNsb3N1cmUuCisKKyAgIEZvciBJQTY0LCBmdW5jdGlvbiBwb2ludGVyIGFyZSBhbHJlYWR5IHBhaXJzIGNvbnNpc3Rpbmcgb2YgYSBjb2RlCisgICBwb2ludGVyLCBhbmQgYSBncCBwb2ludGVyLiAgVGhlIGxhdHRlciBpcyBuZWVkZWQgdG8gYWNjZXNzIGdsb2JhbAorICAgdmFyaWFibGVzLiAgSGVyZSB3ZSBzZXQgdXAgc3VjaCBhIHBhaXIgYXMgdGhlIGZpcnN0IHR3byB3b3JkcyBvZgorICAgdGhlIGNsb3N1cmUgKGluIHRoZSAidHJhbXBvbGluZSIgYXJlYSksIGJ1dCB3ZSByZXBsYWNlIHRoZSBncAorICAgcG9pbnRlciB3aXRoIGEgcG9pbnRlciB0byB0aGUgY2xvc3VyZSBpdHNlbGYuICBXZSBhbHNvIGFkZCB0aGUgcmVhbAorICAgZ3AgcG9pbnRlciB0byB0aGUgY2xvc3VyZS4gIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbiBlbnRyeSBjb2RlIHRvCisgICBib3RoIHJldHJpZXZlIHRoZSB1c2VyIGRhdGEsIGFuZCB0byByZXN0aXJlIHRoZSBjb3JyZWN0IGdwIHBvaW50ZXIuICAqLworCitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV91bml4ICgpOworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqIGNsb3N1cmUsCisJCSAgICAgIGZmaV9jaWYqIGNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkgICAgICB2b2lkICpjb2RlbG9jKQoreworICAvKiBUaGUgbGF5b3V0IG9mIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gIEEgQyBmdW5jdGlvbiBwb2ludGVyIHJlYWxseSAKKyAgICAgcG9pbnRzIHRvIG9uZSBvZiB0aGVzZS4gICovCisgIHN0cnVjdCBpYTY0X2ZkCisgIHsKKyAgICBVSU5UNjQgY29kZV9wb2ludGVyOworICAgIFVJTlQ2NCBncDsKKyAgfTsKKworICBzdHJ1Y3QgZmZpX2lhNjRfdHJhbXBvbGluZV9zdHJ1Y3QKKyAgeworICAgIFVJTlQ2NCBjb2RlX3BvaW50ZXI7CS8qIFBvaW50ZXIgdG8gZmZpX2Nsb3N1cmVfdW5peC4gICovCisgICAgVUlOVDY0IGZha2VfZ3A7CQkvKiBQb2ludGVyIHRvIGNsb3N1cmUsIGluc3RhbGxlZCBhcyBncC4gICovCisgICAgVUlOVDY0IHJlYWxfZ3A7CQkvKiBSZWFsIGdwIHZhbHVlLiAgKi8KKyAgfTsKKworICBzdHJ1Y3QgZmZpX2lhNjRfdHJhbXBvbGluZV9zdHJ1Y3QgKnRyYW1wOworICBzdHJ1Y3QgaWE2NF9mZCAqZmQ7CisKKyAgaWYgKGNpZi0+YWJpICE9IEZGSV9VTklYKQorICAgIHJldHVybiBGRklfQkFEX0FCSTsKKworICB0cmFtcCA9IChzdHJ1Y3QgZmZpX2lhNjRfdHJhbXBvbGluZV9zdHJ1Y3QgKiljbG9zdXJlLT50cmFtcDsKKyAgZmQgPSAoc3RydWN0IGlhNjRfZmQgKikodm9pZCAqKWZmaV9jbG9zdXJlX3VuaXg7CisKKyAgdHJhbXAtPmNvZGVfcG9pbnRlciA9IGZkLT5jb2RlX3BvaW50ZXI7CisgIHRyYW1wLT5yZWFsX2dwID0gZmQtPmdwOworICB0cmFtcC0+ZmFrZV9ncCA9IChVSU5UNjQpKFBUUjY0KWNvZGVsb2M7CisgIGNsb3N1cmUtPmNpZiA9IGNpZjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBjbG9zdXJlLT5mdW4gPSBmdW47CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworCitVSU5UNjQKK2ZmaV9jbG9zdXJlX3VuaXhfaW5uZXIgKGZmaV9jbG9zdXJlICpjbG9zdXJlLCBzdHJ1Y3QgaWE2NF9hcmdzICpzdGFjaywKKwkJCXZvaWQgKnJ2YWx1ZSwgdm9pZCAqcjgpCit7CisgIGZmaV9jaWYgKmNpZjsKKyAgdm9pZCAqKmF2YWx1ZTsKKyAgZmZpX3R5cGUgKipwX2FyZzsKKyAgbG9uZyBpLCBhdm4sIGdwY291bnQsIGZwY291bnQ7CisKKyAgY2lmID0gY2xvc3VyZS0+Y2lmOworICBhdm4gPSBjaWYtPm5hcmdzOworICBhdmFsdWUgPSBhbGxvY2EgKGF2biAqIHNpemVvZiAodm9pZCAqKSk7CisKKyAgLyogSWYgdGhlIHN0cnVjdHVyZSByZXR1cm4gdmFsdWUgaXMgcGFzc2VkIGluIG1lbW9yeSBnZXQgdGhhdCBsb2NhdGlvbgorICAgICBmcm9tIHI4IHNvIGFzIHRvIHBhc3MgdGhlIHZhbHVlIGRpcmVjdGx5IGJhY2sgdG8gdGhlIGNhbGxlci4gICovCisgIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICBydmFsdWUgPSByODsKKworICBncGNvdW50ID0gZnBjb3VudCA9IDA7CisgIGZvciAoaSA9IDAsIHBfYXJnID0gY2lmLT5hcmdfdHlwZXM7IGkgPCBhdm47IGkrKywgcF9hcmcrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJICBhdmFsdWVbaV0gPSBlbmRpYW5fYWRqdXN0KCZzdGFjay0+Z3BfcmVnc1tncGNvdW50KytdLCAxKTsKKwkgIGJyZWFrOworCWNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgYXZhbHVlW2ldID0gZW5kaWFuX2FkanVzdCgmc3RhY2stPmdwX3JlZ3NbZ3Bjb3VudCsrXSwgMik7CisJICBicmVhazsKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwkgIGF2YWx1ZVtpXSA9IGVuZGlhbl9hZGp1c3QoJnN0YWNrLT5ncF9yZWdzW2dwY291bnQrK10sIDQpOworCSAgYnJlYWs7CisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJICBhdmFsdWVbaV0gPSAmc3RhY2stPmdwX3JlZ3NbZ3Bjb3VudCsrXTsKKwkgIGJyZWFrOworCWNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKwkgIGF2YWx1ZVtpXSA9IGVuZGlhbl9hZGp1c3QoJnN0YWNrLT5ncF9yZWdzW2dwY291bnQrK10sIHNpemVvZih2b2lkKikpOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgaWYgKGdwY291bnQgPCA4ICYmIGZwY291bnQgPCA4KQorCSAgICB7CisJICAgICAgZnByZWcgKmFkZHIgPSAmc3RhY2stPmZwX3JlZ3NbZnBjb3VudCsrXTsKKwkgICAgICBmbG9hdCByZXN1bHQ7CisJICAgICAgYXZhbHVlW2ldID0gYWRkcjsKKwkgICAgICBsZGZfZmlsbCAocmVzdWx0LCBhZGRyKTsKKwkgICAgICAqKGZsb2F0ICopYWRkciA9IHJlc3VsdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICBhdmFsdWVbaV0gPSBlbmRpYW5fYWRqdXN0KCZzdGFjay0+Z3BfcmVnc1tncGNvdW50XSwgNCk7CisJICBncGNvdW50Kys7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgaWYgKGdwY291bnQgPCA4ICYmIGZwY291bnQgPCA4KQorCSAgICB7CisJICAgICAgZnByZWcgKmFkZHIgPSAmc3RhY2stPmZwX3JlZ3NbZnBjb3VudCsrXTsKKwkgICAgICBkb3VibGUgcmVzdWx0OworCSAgICAgIGF2YWx1ZVtpXSA9IGFkZHI7CisJICAgICAgbGRmX2ZpbGwgKHJlc3VsdCwgYWRkcik7CisJICAgICAgKihkb3VibGUgKilhZGRyID0gcmVzdWx0OworCSAgICB9CisJICBlbHNlCisJICAgIGF2YWx1ZVtpXSA9ICZzdGFjay0+Z3BfcmVnc1tncGNvdW50XTsKKwkgIGdwY291bnQrKzsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgaWYgKGdwY291bnQgJiAxKQorCSAgICBncGNvdW50Kys7CisJICBpZiAoTERCTF9NQU5UX0RJRyA9PSA2NCAmJiBncGNvdW50IDwgOCAmJiBmcGNvdW50IDwgOCkKKwkgICAgeworCSAgICAgIGZwcmVnICphZGRyID0gJnN0YWNrLT5mcF9yZWdzW2ZwY291bnQrK107CisJICAgICAgX19mbG9hdDgwIHJlc3VsdDsKKwkgICAgICBhdmFsdWVbaV0gPSBhZGRyOworCSAgICAgIGxkZl9maWxsIChyZXN1bHQsIGFkZHIpOworCSAgICAgICooX19mbG9hdDgwICopYWRkciA9IHJlc3VsdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICBhdmFsdWVbaV0gPSAmc3RhY2stPmdwX3JlZ3NbZ3Bjb3VudF07CisJICBncGNvdW50ICs9IDI7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgeworCSAgICBzaXplX3Qgc2l6ZSA9ICgqcF9hcmcpLT5zaXplOworCSAgICBzaXplX3QgYWxpZ24gPSAoKnBfYXJnKS0+YWxpZ25tZW50OworCSAgICBpbnQgaGZhX3R5cGUgPSBoZmFfZWxlbWVudF90eXBlICgqcF9hcmcsIDApOworCisJICAgIEZGSV9BU1NFUlQgKGFsaWduIDw9IDE2KTsKKwkgICAgaWYgKGFsaWduID09IDE2ICYmIChncGNvdW50ICYgMSkpCisJICAgICAgZ3Bjb3VudCsrOworCisJICAgIGlmIChoZmFfdHlwZSAhPSBGRklfVFlQRV9WT0lEKQorCSAgICAgIHsKKwkJc2l6ZV90IGhmYV9zaXplID0gaGZhX3R5cGVfc2l6ZSAoaGZhX3R5cGUpOworCQlzaXplX3Qgb2Zmc2V0ID0gMDsKKwkJc2l6ZV90IGdwX29mZnNldCA9IGdwY291bnQgKiA4OworCQl2b2lkICphZGRyID0gYWxsb2NhIChzaXplKTsKKworCQlhdmFsdWVbaV0gPSBhZGRyOworCisJCXdoaWxlIChmcGNvdW50IDwgOAorCQkgICAgICAgJiYgb2Zmc2V0IDwgc2l6ZQorCQkgICAgICAgJiYgZ3Bfb2Zmc2V0IDwgOCAqIDgpCisJCSAgeworCQkgICAgaGZhX3R5cGVfc3RvcmUgKGhmYV90eXBlLCBhZGRyICsgb2Zmc2V0LAorCQkJCSAgICAmc3RhY2stPmZwX3JlZ3NbZnBjb3VudF0pOworCQkgICAgb2Zmc2V0ICs9IGhmYV9zaXplOworCQkgICAgZ3Bfb2Zmc2V0ICs9IGhmYV9zaXplOworCQkgICAgZnBjb3VudCArPSAxOworCQkgIH0KKworCQlpZiAob2Zmc2V0IDwgc2l6ZSkKKwkJICBtZW1jcHkgKGFkZHIgKyBvZmZzZXQsIChjaGFyICopc3RhY2stPmdwX3JlZ3MgKyBncF9vZmZzZXQsCisJCQkgIHNpemUgLSBvZmZzZXQpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIGF2YWx1ZVtpXSA9ICZzdGFjay0+Z3BfcmVnc1tncGNvdW50XTsKKworCSAgICBncGNvdW50ICs9IChzaXplICsgNykgLyA4OworCSAgfQorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICBjbG9zdXJlLT5mdW4gKGNpZiwgcnZhbHVlLCBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgcmV0dXJuIGNpZi0+ZmxhZ3M7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2lhNjQvZmZpdGFyZ2V0LmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2lhNjQvZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyMDAxZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvaWE2NC9mZml0YXJnZXQuaApAQCAtMCwwICsxLDUwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBJQS02NC4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAorI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKKworI2lmbmRlZiBMSUJGRklfQVNNCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgICAgICBmZmlfYXJnOwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CisKK3R5cGVkZWYgZW51bSBmZmlfYWJpIHsKKyAgRkZJX0ZJUlNUX0FCSSA9IDAsCisgIEZGSV9VTklYLCAgIAkvKiBMaW51eCBhbmQgYWxsIFVuaXggdmFyaWFudHMgdXNlIHRoZSBzYW1lIGNvbnZlbnRpb25zCSovCisgIEZGSV9MQVNUX0FCSSwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1VOSVgKK30gZmZpX2FiaTsKKyNlbmRpZgorCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMjQgIC8qIFJlYWxseSB0aGUgZm9sbG93aW5nIHN0cnVjdCwgd2hpY2ggCSovCisJCQkJLyogY2FuIGJlIGludGVycHJldGVkIGFzIGEgQyBmdW5jdGlvbgkqLworCQkJCS8qIGRlc2NyaXB0b3I6CQkJCSovCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2lhNjQvaWE2NF9mbGFncy5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9pYTY0L2lhNjRfZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY1MmNlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9pYTY0L2lhNjRfZmxhZ3MuaApAQCAtMCwwICsxLDQwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgaWE2NF9mbGFncy5oIC0gQ29weXJpZ2h0IChjKSAyMDAwIEhld2xldHQgUGFja2FyZCBDb21wYW55CisgICAKKyAgIElBNjQvdW5peCBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKKworICAgT3JpZ2luYWwgYXV0aG9yOiBIYW5zIEJvZWhtLCBIUCBMYWJzCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICJUeXBlIiBjb2RlcyB1c2VkIGJldHdlZW4gYXNzZW1ibHkgYW5kIEMuICBXaGVuIHVzZWQgYXMgYSBwYXJ0IG9mCisgICBhIGNmaS0+ZmxhZ3MgdmFsdWUsIHRoZSBsb3cgYnl0ZSB3aWxsIGJlIHRoZXNlIGV4dHJhIHR5cGUgY29kZXMsCisgICBhbmQgYml0cyA4LTMxIHdpbGwgYmUgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSB0eXBlLiAgKi8KKworLyogU21hbGwgc3RydWN0dXJlcyBjb250YWluaW5nIE4gd29yZHMgaW4gaW50ZWdlciByZWdpc3RlcnMuICAqLworI2RlZmluZSBGRklfSUE2NF9UWVBFX1NNQUxMX1NUUlVDVAkoRkZJX1RZUEVfTEFTVCArIDEpCisKKy8qIEhvbW9nZW5lb3VzIEZsb2F0aW5nIFBvaW50IEFnZ3JlZ2F0ZXMgKEhGQXMpIHdoaWNoIGFyZSByZXR1cm5lZAorICAgaW4gRlAgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgRkZJX0lBNjRfVFlQRV9IRkFfRkxPQVQJCShGRklfVFlQRV9MQVNUICsgMikKKyNkZWZpbmUgRkZJX0lBNjRfVFlQRV9IRkFfRE9VQkxFCShGRklfVFlQRV9MQVNUICsgMykKKyNkZWZpbmUgRkZJX0lBNjRfVFlQRV9IRkFfTERPVUJMRQkoRkZJX1RZUEVfTEFTVCArIDQpCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2lhNjQvdW5peC5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9pYTY0L3VuaXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDJhODZkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9pYTY0L3VuaXguUwpAQCAtMCwwICsxLDU2MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHVuaXguUyAtIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBSZWQgSGF0LCBJbmMuCisgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAgSGV3bGV0dCBQYWNrYXJkIENvbXBhbnkKKyAgIAorICAgSUE2NC91bml4IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQcmltYXJ5IGF1dGhvcjogSGFucyBCb2VobSwgSFAgTGFicworCisgICBMb29zZWx5IG1vZGVsZWQgb24gQ3lnbnVzIGNvZGUgZm9yIG90aGVyIHBsYXRmb3Jtcy4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgImlhNjRfZmxhZ3MuaCIKKworCS5wcmVkLnNhZmVfYWNyb3NzX2NhbGxzIHAxLXA1LHAxNi1wNjMKKy50ZXh0CisKKy8qIGludCBmZmlfY2FsbF91bml4IChzdHJ1Y3QgaWE2NF9hcmdzICpzdGFjaywgUFRSNjQgcnZhbHVlLAorCQkgICAgICB2b2lkICgqZm4pKHZvaWQpLCBpbnQgZmxhZ3MpOworICovCisKKyAgICAgICAgLmFsaWduIDE2CisgICAgICAgIC5nbG9iYWwJZmZpX2NhbGxfdW5peAorICAgICAgICAucHJvYwlmZmlfY2FsbF91bml4CitmZmlfY2FsbF91bml4OgorCS5wcm9sb2d1ZQorCS8qIEJpdCBvIHRyaWNraW5lc3MuICBXZSBhY3R1YWxseSBzaGFyZSBhIHN0YWNrIGZyYW1lIHdpdGggZmZpX2NhbGwuCisJICAgUmVseSBvbiB0aGUgZmFjdCB0aGF0IGZmaV9jYWxsIHVzZXMgYSB2ZnJhbWUgYW5kIGRvbid0IGJvdGhlcgorCSAgIHRyYWNraW5nIG9uZSBoZXJlIGF0IGFsbC4gICovCisJLmZmcmFtZQkwCisJLnNhdmUJYXIucGZzLCByMzYgLy8gbG9jMAorCWFsbG9jICAgbG9jMCA9IGFyLnBmcywgNCwgMywgOCwgMAorCS5zYXZlCXJwLCBsb2MxCisJbW92IAlsb2MxID0gYjAKKwkuYm9keQorCWFkZAlyMTYgPSAxNiwgaW4wCisJbW92CWxvYzIgPSBncAorCW1vdglyOCA9IGluMQorCTs7CisKKwkvKiBMb2FkIHVwIGFsbCBvZiB0aGUgYXJndW1lbnQgcmVnaXN0ZXJzLiAgKi8KKwlsZGYuZmlsbCBmOCA9IFtpbjBdLCAzMgorCWxkZi5maWxsIGY5ID0gW3IxNl0sIDMyCisJOzsKKwlsZGYuZmlsbCBmMTAgPSBbaW4wXSwgMzIKKwlsZGYuZmlsbCBmMTEgPSBbcjE2XSwgMzIKKwk7OworCWxkZi5maWxsIGYxMiA9IFtpbjBdLCAzMgorCWxkZi5maWxsIGYxMyA9IFtyMTZdLCAzMgorCTs7CisJbGRmLmZpbGwgZjE0ID0gW2luMF0sIDMyCisJbGRmLmZpbGwgZjE1ID0gW3IxNl0sIDI0CisJOzsKKwlsZDgJb3V0MCA9IFtpbjBdLCAxNgorCWxkOAlvdXQxID0gW3IxNl0sIDE2CisJOzsKKwlsZDgJb3V0MiA9IFtpbjBdLCAxNgorCWxkOAlvdXQzID0gW3IxNl0sIDE2CisJOzsKKwlsZDgJb3V0NCA9IFtpbjBdLCAxNgorCWxkOAlvdXQ1ID0gW3IxNl0sIDE2CisJOzsKKwlsZDgJb3V0NiA9IFtpbjBdCisJbGQ4CW91dDcgPSBbcjE2XQorCTs7CisKKwkvKiBEZWFsbG9jYXRlIHRoZSByZWdpc3RlciBzYXZlIGFyZWEgZnJvbSB0aGUgc3RhY2sgZnJhbWUuICAqLworCW1vdglzcCA9IGluMAorCisJLyogQ2FsbCB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KKwlsZDgJcjE2ID0gW2luMl0sIDgKKwk7OworCWxkOAlncCA9IFtpbjJdCisJbW92CWI2ID0gcjE2CisJYnIuY2FsbC5zcHRrLm1hbnkgYjAgPSBiNgorCTs7CisKKwkvKiBEaXNwYXRjaCB0byBoYW5kbGUgcmV0dXJuIHZhbHVlLiAgKi8KKwltb3YJZ3AgPSBsb2MyCisJenh0MQlyMTYgPSBpbjMKKwk7OworCW1vdglhci5wZnMgPSBsb2MwCisJYWRkbAlyMTggPSBAbHRvZmZ4KC5Mc3RfdGFibGUpLCBncAorCTs7CisJbGQ4Lm1vdglyMTggPSBbcjE4XSwgLkxzdF90YWJsZQorCW1vdgliMCA9IGxvYzEKKwk7OworCXNobGFkZAlyMTggPSByMTYsIDMsIHIxOAorCTs7CisJbGQ4CXIxNyA9IFtyMThdCisJc2hyCWluMyA9IGluMywgOAorCTs7CisJYWRkCXIxNyA9IHIxNywgcjE4CisJOzsKKwltb3YJYjYgPSByMTcKKwlicgliNgorCTs7CisKKy5Mc3Rfdm9pZDoKKwlici5yZXQuc3B0ay5tYW55IGIwCisJOzsKKy5Mc3RfdWludDg6CisJenh0MQlyOCA9IHI4CisJOzsKKwlzdDgJW2luMV0gPSByOAorCWJyLnJldC5zcHRrLm1hbnkgYjAKKwk7OworLkxzdF9zaW50ODoKKwlzeHQxCXI4ID0gcjgKKwk7OworCXN0OAlbaW4xXSA9IHI4CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTHN0X3VpbnQxNjoKKwl6eHQyCXI4ID0gcjgKKwk7OworCXN0OAlbaW4xXSA9IHI4CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTHN0X3NpbnQxNjoKKwlzeHQyCXI4ID0gcjgKKwk7OworCXN0OAlbaW4xXSA9IHI4CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTHN0X3VpbnQzMjoKKwl6eHQ0CXI4ID0gcjgKKwk7OworCXN0OAlbaW4xXSA9IHI4CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTHN0X3NpbnQzMjoKKwlzeHQ0CXI4ID0gcjgKKwk7OworCXN0OAlbaW4xXSA9IHI4CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTHN0X2ludDY0OgorCXN0OAlbaW4xXSA9IHI4CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTHN0X2Zsb2F0OgorCXN0ZnMJW2luMV0gPSBmOAorCWJyLnJldC5zcHRrLm1hbnkgYjAKKwk7OworLkxzdF9kb3VibGU6CisJc3RmZAlbaW4xXSA9IGY4CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTHN0X2xkb3VibGU6CisJc3RmZQlbaW4xXSA9IGY4CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisKKy5Mc3Rfc21hbGxfc3RydWN0OgorCWFkZAlzcCA9IC0xNiwgc3AKKwljbXAubHQJcDYsIHAwID0gOCwgaW4zCisJY21wLmx0CXA3LCBwMCA9IDE2LCBpbjMKKwljbXAubHQJcDgsIHAwID0gMjQsIGluMworCTs7CisJYWRkCXIxNiA9IDgsIHNwCisJYWRkCXIxNyA9IDE2LCBzcAorCWFkZAlyMTggPSAyNCwgc3AKKwk7OworCXN0OAlbc3BdID0gcjgKKyhwNikJc3Q4CVtyMTZdID0gcjkKKwltb3YJb3V0MCA9IGluMQorKHA3KQlzdDgJW3IxN10gPSByMTAKKyhwOCkJc3Q4CVtyMThdID0gcjExCisJbW92CW91dDEgPSBzcAorCW1vdglvdXQyID0gaW4zCisJYnIuY2FsbC5zcHRrLm1hbnkgYjAgPSBtZW1jcHkjCisJOzsKKwltb3YJYXIucGZzID0gbG9jMAorCW1vdgliMCA9IGxvYzEKKwltb3YJZ3AgPSBsb2MyCisJYnIucmV0LnNwdGsubWFueSBiMAorCisuTHN0X2hmYV9mbG9hdDoKKwlhZGQJcjE2ID0gNCwgaW4xCisJY21wLmx0CXA2LCBwMCA9IDQsIGluMworCTs7CisJc3RmcwlbaW4xXSA9IGY4LCA4CisocDYpCXN0ZnMJW3IxNl0gPSBmOSwgOAorCWNtcC5sdAlwNywgcDAgPSA4LCBpbjMKKwljbXAubHQJcDgsIHAwID0gMTIsIGluMworCTs7CisocDcpCXN0ZnMJW2luMV0gPSBmMTAsIDgKKyhwOCkJc3RmcwlbcjE2XSA9IGYxMSwgOAorCWNtcC5sdAlwOSwgcDAgPSAxNiwgaW4zCisJY21wLmx0CXAxMCwgcDAgPSAyMCwgaW4zCisJOzsKKyhwOSkJc3RmcwlbaW4xXSA9IGYxMiwgOAorKHAxMCkJc3RmcwlbcjE2XSA9IGYxMywgOAorCWNtcC5sdAlwNiwgcDAgPSAyNCwgaW4zCisJY21wLmx0CXA3LCBwMCA9IDI4LCBpbjMKKwk7OworKHA2KQlzdGZzCVtpbjFdID0gZjE0CisocDcpCXN0ZnMJW3IxNl0gPSBmMTUKKwlici5yZXQuc3B0ay5tYW55IGIwCisJOzsKKworLkxzdF9oZmFfZG91YmxlOgorCWFkZAlyMTYgPSA4LCBpbjEKKwljbXAubHQJcDYsIHAwID0gOCwgaW4zCisJOzsKKwlzdGZkCVtpbjFdID0gZjgsIDE2CisocDYpCXN0ZmQJW3IxNl0gPSBmOSwgMTYKKwljbXAubHQJcDcsIHAwID0gMTYsIGluMworCWNtcC5sdAlwOCwgcDAgPSAyNCwgaW4zCisJOzsKKyhwNykJc3RmZAlbaW4xXSA9IGYxMCwgMTYKKyhwOCkJc3RmZAlbcjE2XSA9IGYxMSwgMTYKKwljbXAubHQJcDksIHAwID0gMzIsIGluMworCWNtcC5sdAlwMTAsIHAwID0gNDAsIGluMworCTs7CisocDkpCXN0ZmQJW2luMV0gPSBmMTIsIDE2CisocDEwKQlzdGZkCVtyMTZdID0gZjEzLCAxNgorCWNtcC5sdAlwNiwgcDAgPSA0OCwgaW4zCisJY21wLmx0CXA3LCBwMCA9IDU2LCBpbjMKKwk7OworKHA2KQlzdGZkCVtpbjFdID0gZjE0CisocDcpCXN0ZmQJW3IxNl0gPSBmMTUKKwlici5yZXQuc3B0ay5tYW55IGIwCisJOzsKKworLkxzdF9oZmFfbGRvdWJsZToKKwlhZGQJcjE2ID0gMTYsIGluMQorCWNtcC5sdAlwNiwgcDAgPSAxNiwgaW4zCisJOzsKKwlzdGZlCVtpbjFdID0gZjgsIDMyCisocDYpCXN0ZmUJW3IxNl0gPSBmOSwgMzIKKwljbXAubHQJcDcsIHAwID0gMzIsIGluMworCWNtcC5sdAlwOCwgcDAgPSA0OCwgaW4zCisJOzsKKyhwNykJc3RmZQlbaW4xXSA9IGYxMCwgMzIKKyhwOCkJc3RmZQlbcjE2XSA9IGYxMSwgMzIKKwljbXAubHQJcDksIHAwID0gNjQsIGluMworCWNtcC5sdAlwMTAsIHAwID0gODAsIGluMworCTs7CisocDkpCXN0ZmUJW2luMV0gPSBmMTIsIDMyCisocDEwKQlzdGZlCVtyMTZdID0gZjEzLCAzMgorCWNtcC5sdAlwNiwgcDAgPSA5NiwgaW4zCisJY21wLmx0CXA3LCBwMCA9IDExMiwgaW4zCisJOzsKKyhwNikJc3RmZQlbaW4xXSA9IGYxNAorKHA3KQlzdGZlCVtyMTZdID0gZjE1CisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisKKyAgICAgICAgLmVuZHAgZmZpX2NhbGxfdW5peAorCisgICAgICAgIC5hbGlnbiAxNgorICAgICAgICAuZ2xvYmFsIGZmaV9jbG9zdXJlX3VuaXgKKyAgICAgICAgLnByb2MgZmZpX2Nsb3N1cmVfdW5peAorCisjZGVmaW5lIEZSQU1FX1NJWkUJKDgqMTYgKyA4KjggKyA4KjE2KQorCitmZmlfY2xvc3VyZV91bml4OgorCS5wcm9sb2d1ZQorCS5zYXZlCWFyLnBmcywgcjQwIC8vIGxvYzAKKwlhbGxvYyAgIGxvYzAgPSBhci5wZnMsIDgsIDQsIDQsIDAKKwkuZmZyYW1lCUZSQU1FX1NJWkUKKwlhZGQJcjEyID0gLUZSQU1FX1NJWkUsIHIxMgorCS5zYXZlCXJwLCBsb2MxCisJbW92CWxvYzEgPSBiMAorCS5zYXZlCWFyLnVuYXQsIGxvYzIKKwltb3YJbG9jMiA9IGFyLnVuYXQKKwkuYm9keQorCisJLyogUmV0cmlldmUgY2xvc3VyZSBwb2ludGVyIGFuZCByZWFsIGdwLiAgKi8KKyNpZmRlZiBfSUxQMzIKKwlhZGRwNAlvdXQwID0gMCwgZ3AKKwlhZGRwNAlncCA9IDE2LCBncAorI2Vsc2UKKwltb3YJb3V0MCA9IGdwCisJYWRkCWdwID0gMTYsIGdwCisjZW5kaWYKKwk7OworCWxkOAlncCA9IFtncF0KKworCS8qIFNwaWxsIGFsbCBvZiB0aGUgcG9zc2libGUgYXJndW1lbnQgcmVnaXN0ZXJzLiAgKi8KKwlhZGQJcjE2ID0gMTYgKyA4KjE2LCBzcAorCWFkZAlyMTcgPSAxNiArIDgqMTYgKyAxNiwgc3AKKwk7OworCXN0Zi5zcGlsbCBbcjE2XSA9IGY4LCAzMgorCXN0Zi5zcGlsbCBbcjE3XSA9IGY5LCAzMgorCW1vdglsb2MzID0gZ3AKKwk7OworCXN0Zi5zcGlsbCBbcjE2XSA9IGYxMCwgMzIKKwlzdGYuc3BpbGwgW3IxN10gPSBmMTEsIDMyCisJOzsKKwlzdGYuc3BpbGwgW3IxNl0gPSBmMTIsIDMyCisJc3RmLnNwaWxsIFtyMTddID0gZjEzLCAzMgorCTs7CisJc3RmLnNwaWxsIFtyMTZdID0gZjE0LCAzMgorCXN0Zi5zcGlsbCBbcjE3XSA9IGYxNSwgMjQKKwk7OworCS5tZW0ub2Zmc2V0IDAsIDAKKwlzdDguc3BpbGwgW3IxNl0gPSBpbjAsIDE2CisJLm1lbS5vZmZzZXQgOCwgMAorCXN0OC5zcGlsbCBbcjE3XSA9IGluMSwgMTYKKwlhZGQJb3V0MSA9IDE2ICsgOCoxNiwgc3AKKwk7OworCS5tZW0ub2Zmc2V0IDAsIDAKKwlzdDguc3BpbGwgW3IxNl0gPSBpbjIsIDE2CisJLm1lbS5vZmZzZXQgOCwgMAorCXN0OC5zcGlsbCBbcjE3XSA9IGluMywgMTYKKwlhZGQJb3V0MiA9IDE2LCBzcAorCTs7CisJLm1lbS5vZmZzZXQgMCwgMAorCXN0OC5zcGlsbCBbcjE2XSA9IGluNCwgMTYKKwkubWVtLm9mZnNldCA4LCAwCisJc3Q4LnNwaWxsIFtyMTddID0gaW41LCAxNgorCW1vdglvdXQzID0gcjgKKwk7OworCS5tZW0ub2Zmc2V0IDAsIDAKKwlzdDguc3BpbGwgW3IxNl0gPSBpbjYKKwkubWVtLm9mZnNldCA4LCAwCisJc3Q4LnNwaWxsIFtyMTddID0gaW43CisKKwkvKiBJbnZva2UgZmZpX2Nsb3N1cmVfdW5peF9pbm5lciBmb3IgdGhlIGhhcmQgd29yay4gICovCisJYnIuY2FsbC5zcHRrLm1hbnkgYjAgPSBmZmlfY2xvc3VyZV91bml4X2lubmVyCisJOzsKKworCS8qIERpc3BhdGNoIHRvIGhhbmRsZSByZXR1cm4gdmFsdWUuICAqLworCW1vdglncCA9IGxvYzMKKwl6eHQxCXIxNiA9IHI4CisJOzsKKwlhZGRsCXIxOCA9IEBsdG9mZngoLkxsZF90YWJsZSksIGdwCisJbW92CWFyLnBmcyA9IGxvYzAKKwk7OworCWxkOC5tb3YJcjE4ID0gW3IxOF0sIC5MbGRfdGFibGUKKwltb3YJYjAgPSBsb2MxCisJOzsKKwlzaGxhZGQJcjE4ID0gcjE2LCAzLCByMTgKKwltb3YJYXIudW5hdCA9IGxvYzIKKwk7OworCWxkOAlyMTcgPSBbcjE4XQorCXNocglyOCA9IHI4LCA4CisJOzsKKwlhZGQJcjE3ID0gcjE3LCByMTgKKwlhZGQJcjE2ID0gMTYsIHNwCisJOzsKKwltb3YJYjYgPSByMTcKKwlicgliNgorCTs7CisJLmxhYmVsX3N0YXRlIDEKKworLkxsZF92b2lkOgorCS5yZXN0b3JlIHNwCisJYWRkCXNwID0gRlJBTUVfU0laRSwgc3AKKwlici5yZXQuc3B0ay5tYW55IGIwCisJOzsKKy5MbGRfaW50OgorCS5ib2R5CisJLmNvcHlfc3RhdGUgMQorCWxkOAlyOCA9IFtyMTZdCisJLnJlc3RvcmUgc3AKKwlhZGQJc3AgPSBGUkFNRV9TSVpFLCBzcAorCWJyLnJldC5zcHRrLm1hbnkgYjAKKwk7OworLkxsZF9mbG9hdDoKKwkuYm9keQorCS5jb3B5X3N0YXRlIDEKKwlsZGZzCWY4ID0gW3IxNl0KKwkucmVzdG9yZSBzcAorCWFkZAlzcCA9IEZSQU1FX1NJWkUsIHNwCisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTGxkX2RvdWJsZToKKwkuYm9keQorCS5jb3B5X3N0YXRlIDEKKwlsZGZkCWY4ID0gW3IxNl0KKwkucmVzdG9yZSBzcAorCWFkZAlzcCA9IEZSQU1FX1NJWkUsIHNwCisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisuTGxkX2xkb3VibGU6CisJLmJvZHkKKwkuY29weV9zdGF0ZSAxCisJbGRmZQlmOCA9IFtyMTZdCisJLnJlc3RvcmUgc3AKKwlhZGQJc3AgPSBGUkFNRV9TSVpFLCBzcAorCWJyLnJldC5zcHRrLm1hbnkgYjAKKwk7OworCisuTGxkX3NtYWxsX3N0cnVjdDoKKwkuYm9keQorCS5jb3B5X3N0YXRlIDEKKwlhZGQJcjE3ID0gOCwgcjE2CisJY21wLmx0CXA2LCBwMCA9IDgsIHI4CisJY21wLmx0CXA3LCBwMCA9IDE2LCByOAorCWNtcC5sdAlwOCwgcDAgPSAyNCwgcjgKKwk7OworCWxkOAlyOCA9IFtyMTZdLCAxNgorKHA2KQlsZDgJcjkgPSBbcjE3XSwgMTYKKwk7OworKHA3KQlsZDgJcjEwID0gW3IxNl0KKyhwOCkJbGQ4CXIxMSA9IFtyMTddCisJLnJlc3RvcmUgc3AKKwlhZGQJc3AgPSBGUkFNRV9TSVpFLCBzcAorCWJyLnJldC5zcHRrLm1hbnkgYjAKKwk7OworCisuTGxkX2hmYV9mbG9hdDoKKwkuYm9keQorCS5jb3B5X3N0YXRlIDEKKwlhZGQJcjE3ID0gNCwgcjE2CisJY21wLmx0CXA2LCBwMCA9IDQsIHI4CisJOzsKKwlsZGZzCWY4ID0gW3IxNl0sIDgKKyhwNikJbGRmcwlmOSA9IFtyMTddLCA4CisJY21wLmx0CXA3LCBwMCA9IDgsIHI4CisJY21wLmx0CXA4LCBwMCA9IDEyLCByOAorCTs7CisocDcpCWxkZnMJZjEwID0gW3IxNl0sIDgKKyhwOCkJbGRmcwlmMTEgPSBbcjE3XSwgOAorCWNtcC5sdAlwOSwgcDAgPSAxNiwgcjgKKwljbXAubHQJcDEwLCBwMCA9IDIwLCByOAorCTs7CisocDkpCWxkZnMJZjEyID0gW3IxNl0sIDgKKyhwMTApCWxkZnMJZjEzID0gW3IxN10sIDgKKwljbXAubHQJcDYsIHAwID0gMjQsIHI4CisJY21wLmx0CXA3LCBwMCA9IDI4LCByOAorCTs7CisocDYpCWxkZnMJZjE0ID0gW3IxNl0KKyhwNykJbGRmcwlmMTUgPSBbcjE3XQorCS5yZXN0b3JlIHNwCisJYWRkCXNwID0gRlJBTUVfU0laRSwgc3AKKwlici5yZXQuc3B0ay5tYW55IGIwCisJOzsKKworLkxsZF9oZmFfZG91YmxlOgorCS5ib2R5CisJLmNvcHlfc3RhdGUgMQorCWFkZAlyMTcgPSA4LCByMTYKKwljbXAubHQJcDYsIHAwID0gOCwgcjgKKwk7OworCWxkZmQJZjggPSBbcjE2XSwgMTYKKyhwNikJbGRmZAlmOSA9IFtyMTddLCAxNgorCWNtcC5sdAlwNywgcDAgPSAxNiwgcjgKKwljbXAubHQJcDgsIHAwID0gMjQsIHI4CisJOzsKKyhwNykJbGRmZAlmMTAgPSBbcjE2XSwgMTYKKyhwOCkJbGRmZAlmMTEgPSBbcjE3XSwgMTYKKwljbXAubHQJcDksIHAwID0gMzIsIHI4CisJY21wLmx0CXAxMCwgcDAgPSA0MCwgcjgKKwk7OworKHA5KQlsZGZkCWYxMiA9IFtyMTZdLCAxNgorKHAxMCkJbGRmZAlmMTMgPSBbcjE3XSwgMTYKKwljbXAubHQJcDYsIHAwID0gNDgsIHI4CisJY21wLmx0CXA3LCBwMCA9IDU2LCByOAorCTs7CisocDYpCWxkZmQJZjE0ID0gW3IxNl0KKyhwNykJbGRmZAlmMTUgPSBbcjE3XQorCS5yZXN0b3JlIHNwCisJYWRkCXNwID0gRlJBTUVfU0laRSwgc3AKKwlici5yZXQuc3B0ay5tYW55IGIwCisJOzsKKworLkxsZF9oZmFfbGRvdWJsZToKKwkuYm9keQorCS5jb3B5X3N0YXRlIDEKKwlhZGQJcjE3ID0gMTYsIHIxNgorCWNtcC5sdAlwNiwgcDAgPSAxNiwgcjgKKwk7OworCWxkZmUJZjggPSBbcjE2XSwgMzIKKyhwNikJbGRmZQlmOSA9IFtyMTddLCAzMgorCWNtcC5sdAlwNywgcDAgPSAzMiwgcjgKKwljbXAubHQJcDgsIHAwID0gNDgsIHI4CisJOzsKKyhwNykJbGRmZQlmMTAgPSBbcjE2XSwgMzIKKyhwOCkJbGRmZQlmMTEgPSBbcjE3XSwgMzIKKwljbXAubHQJcDksIHAwID0gNjQsIHI4CisJY21wLmx0CXAxMCwgcDAgPSA4MCwgcjgKKwk7OworKHA5KQlsZGZlCWYxMiA9IFtyMTZdLCAzMgorKHAxMCkJbGRmZQlmMTMgPSBbcjE3XSwgMzIKKwljbXAubHQJcDYsIHAwID0gOTYsIHI4CisJY21wLmx0CXA3LCBwMCA9IDExMiwgcjgKKwk7OworKHA2KQlsZGZlCWYxNCA9IFtyMTZdCisocDcpCWxkZmUJZjE1ID0gW3IxN10KKwkucmVzdG9yZSBzcAorCWFkZAlzcCA9IEZSQU1FX1NJWkUsIHNwCisJYnIucmV0LnNwdGsubWFueSBiMAorCTs7CisKKwkuZW5kcAlmZmlfY2xvc3VyZV91bml4CisKKwkuc2VjdGlvbiAucm9kYXRhCisJLmFsaWduCTgKKy5Mc3RfdGFibGU6CisJZGF0YTgJQHBjcmVsKC5Mc3Rfdm9pZCkJCS8vIEZGSV9UWVBFX1ZPSUQKKwlkYXRhOAlAcGNyZWwoLkxzdF9zaW50MzIpCQkvLyBGRklfVFlQRV9JTlQKKwlkYXRhOAlAcGNyZWwoLkxzdF9mbG9hdCkJCS8vIEZGSV9UWVBFX0ZMT0FUCisJZGF0YTgJQHBjcmVsKC5Mc3RfZG91YmxlKQkJLy8gRkZJX1RZUEVfRE9VQkxFCisJZGF0YTgJQHBjcmVsKC5Mc3RfbGRvdWJsZSkJCS8vIEZGSV9UWVBFX0xPTkdET1VCTEUKKwlkYXRhOAlAcGNyZWwoLkxzdF91aW50OCkJCS8vIEZGSV9UWVBFX1VJTlQ4CisJZGF0YTgJQHBjcmVsKC5Mc3Rfc2ludDgpCQkvLyBGRklfVFlQRV9TSU5UOAorCWRhdGE4CUBwY3JlbCguTHN0X3VpbnQxNikJCS8vIEZGSV9UWVBFX1VJTlQxNgorCWRhdGE4CUBwY3JlbCguTHN0X3NpbnQxNikJCS8vIEZGSV9UWVBFX1NJTlQxNgorCWRhdGE4CUBwY3JlbCguTHN0X3VpbnQzMikJCS8vIEZGSV9UWVBFX1VJTlQzMgorCWRhdGE4CUBwY3JlbCguTHN0X3NpbnQzMikJCS8vIEZGSV9UWVBFX1NJTlQzMgorCWRhdGE4CUBwY3JlbCguTHN0X2ludDY0KQkJLy8gRkZJX1RZUEVfVUlOVDY0CisJZGF0YTgJQHBjcmVsKC5Mc3RfaW50NjQpCQkvLyBGRklfVFlQRV9TSU5UNjQKKwlkYXRhOAlAcGNyZWwoLkxzdF92b2lkKQkJLy8gRkZJX1RZUEVfU1RSVUNUCisJZGF0YTgJQHBjcmVsKC5Mc3RfaW50NjQpCQkvLyBGRklfVFlQRV9QT0lOVEVSCisJZGF0YTggCUBwY3JlbCguTHN0X3NtYWxsX3N0cnVjdCkJLy8gRkZJX0lBNjRfVFlQRV9TTUFMTF9TVFJVQ1QKKwlkYXRhOAlAcGNyZWwoLkxzdF9oZmFfZmxvYXQpCQkvLyBGRklfSUE2NF9UWVBFX0hGQV9GTE9BVAorCWRhdGE4CUBwY3JlbCguTHN0X2hmYV9kb3VibGUpCQkvLyBGRklfSUE2NF9UWVBFX0hGQV9ET1VCTEUKKwlkYXRhOAlAcGNyZWwoLkxzdF9oZmFfbGRvdWJsZSkJLy8gRkZJX0lBNjRfVFlQRV9IRkFfTERPVUJMRQorCisuTGxkX3RhYmxlOgorCWRhdGE4CUBwY3JlbCguTGxkX3ZvaWQpCQkvLyBGRklfVFlQRV9WT0lECisJZGF0YTgJQHBjcmVsKC5MbGRfaW50KQkJLy8gRkZJX1RZUEVfSU5UCisJZGF0YTgJQHBjcmVsKC5MbGRfZmxvYXQpCQkvLyBGRklfVFlQRV9GTE9BVAorCWRhdGE4CUBwY3JlbCguTGxkX2RvdWJsZSkJCS8vIEZGSV9UWVBFX0RPVUJMRQorCWRhdGE4CUBwY3JlbCguTGxkX2xkb3VibGUpCQkvLyBGRklfVFlQRV9MT05HRE9VQkxFCisJZGF0YTgJQHBjcmVsKC5MbGRfaW50KQkJLy8gRkZJX1RZUEVfVUlOVDgKKwlkYXRhOAlAcGNyZWwoLkxsZF9pbnQpCQkvLyBGRklfVFlQRV9TSU5UOAorCWRhdGE4CUBwY3JlbCguTGxkX2ludCkJCS8vIEZGSV9UWVBFX1VJTlQxNgorCWRhdGE4CUBwY3JlbCguTGxkX2ludCkJCS8vIEZGSV9UWVBFX1NJTlQxNgorCWRhdGE4CUBwY3JlbCguTGxkX2ludCkJCS8vIEZGSV9UWVBFX1VJTlQzMgorCWRhdGE4CUBwY3JlbCguTGxkX2ludCkJCS8vIEZGSV9UWVBFX1NJTlQzMgorCWRhdGE4CUBwY3JlbCguTGxkX2ludCkJCS8vIEZGSV9UWVBFX1VJTlQ2NAorCWRhdGE4CUBwY3JlbCguTGxkX2ludCkJCS8vIEZGSV9UWVBFX1NJTlQ2NAorCWRhdGE4CUBwY3JlbCguTGxkX3ZvaWQpCQkvLyBGRklfVFlQRV9TVFJVQ1QKKwlkYXRhOAlAcGNyZWwoLkxsZF9pbnQpCQkvLyBGRklfVFlQRV9QT0lOVEVSCisJZGF0YTggCUBwY3JlbCguTGxkX3NtYWxsX3N0cnVjdCkJLy8gRkZJX0lBNjRfVFlQRV9TTUFMTF9TVFJVQ1QKKwlkYXRhOAlAcGNyZWwoLkxsZF9oZmFfZmxvYXQpCQkvLyBGRklfSUE2NF9UWVBFX0hGQV9GTE9BVAorCWRhdGE4CUBwY3JlbCguTGxkX2hmYV9kb3VibGUpCQkvLyBGRklfSUE2NF9UWVBFX0hGQV9ET1VCTEUKKwlkYXRhOAlAcGNyZWwoLkxsZF9oZmFfbGRvdWJsZSkJLy8gRkZJX0lBNjRfVFlQRV9IRkFfTERPVUJMRQorCisjaWYgZGVmaW5lZCBfX0VMRl9fICYmIGRlZmluZWQgX19saW51eF9fCisJLnNlY3Rpb24JLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL2phdmFfcmF3X2FwaS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9qYXZhX3Jhd19hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJjOGJmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9qYXZhX3Jhd19hcGkuYwpAQCAtMCwwICsxLDM1NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGphdmFfcmF3X2FwaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk5LCAyMDA3LCAyMDA4ICBSZWQgSGF0LCBJbmMuCisKKyAgIENsb25lZCBmcm9tIHJhd19hcGkuYworCisgICBSYXdfYXBpLmMgYXV0aG9yOiBLcmVzdGVuIEtyYWIgVGhvcnVwIDxrcmFiQGdudS5vcmc+CisgICBKYXZhX3Jhd19hcGkuYyBhdXRob3I6IEhhbnMtSi4gQm9laG0gPGhib2VobUBocGwuaHAuY29tPgorCisgICAkSWQgJAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGlzIGRlZmluZXMgYSBKYXZhLSBhbmQgNjQtYml0IHNwZWNpZmljIHZhcmlhbnQgb2YgdGhlIHJhdyBBUEkuCSovCisvKiBJdCBhc3N1bWVzIHRoYXQgInJhdyIgYXJndW1lbnQgYmxvY2tzIGxvb2sgbGlrZSBKYXZhIHN0YWNrcyBvbiBhCSovCisvKiA2NC1iaXQgbWFjaGluZS4gIEFyZ3VtZW50cyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gYSBzaW5nbGUgc3RhY2sJKi8KKy8qIHN0YWNrIHNsb3RzIChsb25ncywgZG91Ymxlcykgb2NjdXB5IDEyOCBiaXRzLCBidXQgb25seSB0aGUgZmlyc3QJKi8KKy8qIDY0IGJpdHMgYXJlIGFjdHVhbGx5IHVzZWQuCQkJCQkJKi8KKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmICFkZWZpbmVkKE5PX0pBVkFfUkFXX0FQSSkgJiYgIWRlZmluZWQoRkZJX05PX1JBV19BUEkpCisKK3NpemVfdAorZmZpX2phdmFfcmF3X3NpemUgKGZmaV9jaWYgKmNpZikKK3sKKyAgc2l6ZV90IHJlc3VsdCA9IDA7CisgIGludCBpOworCisgIGZmaV90eXBlICoqYXQgPSBjaWYtPmFyZ190eXBlczsKKworICBmb3IgKGkgPSBjaWYtPm5hcmdzLTE7IGkgPj0gMDsgaS0tLCBhdCsrKQorICAgIHsKKyAgICAgIHN3aXRjaCgoKmF0KSAtPiB0eXBlKSB7CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICByZXN1bHQgKz0gMiAqIEZGSV9TSVpFT0ZfSkFWQV9SQVc7CisJICBicmVhazsKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIC8qIE5vIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIGluIEphdmEuCSovCisJICBhYm9ydCgpOworCWRlZmF1bHQ6CisJICByZXN1bHQgKz0gRkZJX1NJWkVPRl9KQVZBX1JBVzsKKyAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkCitmZmlfamF2YV9yYXdfdG9fcHRyYXJyYXkgKGZmaV9jaWYgKmNpZiwgZmZpX2phdmFfcmF3ICpyYXcsIHZvaWQgKiphcmdzKQoreworICB1bnNpZ25lZCBpOworICBmZmlfdHlwZSAqKnRwID0gY2lmLT5hcmdfdHlwZXM7CisKKyNpZiBXT1JEU19CSUdFTkRJQU4KKworICBmb3IgKGkgPSAwOyBpIDwgY2lmLT5uYXJnczsgaSsrLCB0cCsrLCBhcmdzKyspCisgICAgeworICAgICAgc3dpdGNoICgoKnRwKS0+dHlwZSkKKwl7CisJY2FzZSBGRklfVFlQRV9VSU5UODoKKwljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCSAgKmFyZ3MgPSAodm9pZCopICgoY2hhciopKHJhdysrKSArIDMpOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkgICphcmdzID0gKHZvaWQqKSAoKGNoYXIqKShyYXcrKykgKyAyKTsKKwkgIGJyZWFrOworCisjaWYgRkZJX1NJWkVPRl9KQVZBX1JBVyA9PSA4CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICAqYXJncyA9ICh2b2lkICopcmF3OworCSAgcmF3ICs9IDI7CisJICBicmVhazsKKyNlbmRpZgorCisJY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorCSAgKmFyZ3MgPSAodm9pZCopICYocmF3KyspLT5wdHI7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAqYXJncyA9IHJhdzsKKwkgIHJhdyArPQorCSAgICBBTElHTiAoKCp0cCktPnNpemUsIHNpemVvZihmZmlfamF2YV9yYXcpKSAvIHNpemVvZihmZmlfamF2YV9yYXcpOworCX0KKyAgICB9CisKKyNlbHNlIC8qIFdPUkRTX0JJR0VORElBTiAqLworCisjaWYgIVBEUAorCisgIC8qIHRoZW4gYXNzdW1lIGxpdHRsZSBlbmRpYW4gKi8KKyAgZm9yIChpID0gMDsgaSA8IGNpZi0+bmFyZ3M7IGkrKywgdHArKywgYXJncysrKQorICAgIHsKKyNpZiBGRklfU0laRU9GX0pBVkFfUkFXID09IDgKKyAgICAgIHN3aXRjaCgoKnRwKS0+dHlwZSkgeworCWNhc2UgRkZJX1RZUEVfVUlOVDY0OgorCWNhc2UgRkZJX1RZUEVfU0lOVDY0OgorCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgKmFyZ3MgPSAodm9pZCopIHJhdzsKKwkgIHJhdyArPSAyOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICphcmdzID0gKHZvaWQqKSByYXcrKzsKKyAgICAgIH0KKyNlbHNlIC8qIEZGSV9TSVpFT0ZfSkFWQV9SQVcgIT0gOCAqLworCSphcmdzID0gKHZvaWQqKSByYXc7CisJcmF3ICs9CisJICBBTElHTiAoKCp0cCktPnNpemUsIHNpemVvZihmZmlfamF2YV9yYXcpKSAvIHNpemVvZihmZmlfamF2YV9yYXcpOworI2VuZGlmIC8qIEZGSV9TSVpFT0ZfSkFWQV9SQVcgPT0gOCAqLworICAgIH0KKworI2Vsc2UKKyNlcnJvciAicGRwIGVuZGlhbiBub3Qgc3VwcG9ydGVkIgorI2VuZGlmIC8qICEgUERQICovCisKKyNlbmRpZiAvKiBXT1JEU19CSUdFTkRJQU4gKi8KK30KKwordm9pZAorZmZpX2phdmFfcHRyYXJyYXlfdG9fcmF3IChmZmlfY2lmICpjaWYsIHZvaWQgKiphcmdzLCBmZmlfamF2YV9yYXcgKnJhdykKK3sKKyAgdW5zaWduZWQgaTsKKyAgZmZpX3R5cGUgKip0cCA9IGNpZi0+YXJnX3R5cGVzOworCisgIGZvciAoaSA9IDA7IGkgPCBjaWYtPm5hcmdzOyBpKyssIHRwKyssIGFyZ3MrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKCgqdHApLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1VJTlQ4OgorI2lmIFdPUkRTX0JJR0VORElBTgorCSAgKihVSU5UMzIqKShyYXcrKykgPSAqKFVJTlQ4KikgKCphcmdzKTsKKyNlbHNlCisJICAocmF3KyspLT51aW50ID0gKihVSU5UOCopICgqYXJncyk7CisjZW5kaWYKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TSU5UODoKKyNpZiBXT1JEU19CSUdFTkRJQU4KKwkgICooU0lOVDMyKikocmF3KyspID0gKihTSU5UOCopICgqYXJncyk7CisjZWxzZQorCSAgKHJhdysrKS0+c2ludCA9ICooU0lOVDgqKSAoKmFyZ3MpOworI2VuZGlmCisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorI2lmIFdPUkRTX0JJR0VORElBTgorCSAgKihVSU5UMzIqKShyYXcrKykgPSAqKFVJTlQxNiopICgqYXJncyk7CisjZWxzZQorCSAgKHJhdysrKS0+dWludCA9ICooVUlOVDE2KikgKCphcmdzKTsKKyNlbmRpZgorCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyNpZiBXT1JEU19CSUdFTkRJQU4KKwkgICooU0lOVDMyKikocmF3KyspID0gKihTSU5UMTYqKSAoKmFyZ3MpOworI2Vsc2UKKwkgIChyYXcrKyktPnNpbnQgPSAqKFNJTlQxNiopICgqYXJncyk7CisjZW5kaWYKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisjaWYgV09SRFNfQklHRU5ESUFOCisJICAqKFVJTlQzMiopKHJhdysrKSA9ICooVUlOVDMyKikgKCphcmdzKTsKKyNlbHNlCisJICAocmF3KyspLT51aW50ID0gKihVSU5UMzIqKSAoKmFyZ3MpOworI2VuZGlmCisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgorI2lmIFdPUkRTX0JJR0VORElBTgorCSAgKihTSU5UMzIqKShyYXcrKykgPSAqKFNJTlQzMiopICgqYXJncyk7CisjZWxzZQorCSAgKHJhdysrKS0+c2ludCA9ICooU0lOVDMyKikgKCphcmdzKTsKKyNlbmRpZgorCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgKHJhdysrKS0+Zmx0ID0gKihGTE9BVDMyKikgKCphcmdzKTsKKwkgIGJyZWFrOworCisjaWYgRkZJX1NJWkVPRl9KQVZBX1JBVyA9PSA4CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICByYXctPnVpbnQgPSAqKFVJTlQ2NCopICgqYXJncyk7CisJICByYXcgKz0gMjsKKwkgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJICAocmF3KyspLT5wdHIgPSAqKih2b2lkKioqKSBhcmdzOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorI2lmIEZGSV9TSVpFT0ZfSkFWQV9SQVcgPT0gOAorCSAgRkZJX0FTU0VSVCgwKTsJLyogU2hvdWxkIGhhdmUgY292ZXJlZCBhbGwgY2FzZXMgKi8KKyNlbHNlCisJICBtZW1jcHkgKCh2b2lkKikgcmF3LT5kYXRhLCAodm9pZCopKmFyZ3MsICgqdHApLT5zaXplKTsKKwkgIHJhdyArPQorCSAgICBBTElHTiAoKCp0cCktPnNpemUsIHNpemVvZihmZmlfamF2YV9yYXcpKSAvIHNpemVvZihmZmlfamF2YV9yYXcpOworI2VuZGlmCisJfQorICAgIH0KK30KKworI2lmICFGRklfTkFUSVZFX1JBV19BUEkKKworc3RhdGljIHZvaWQKK2ZmaV9qYXZhX3J2YWx1ZV90b19yYXcgKGZmaV9jaWYgKmNpZiwgdm9pZCAqcnZhbHVlKQoreworI2lmIFdPUkRTX0JJR0VORElBTiAmJiBGRklfU0laRU9GX0FSRyA9PSA4CisgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyAgICAgICooVUlOVDY0ICopcnZhbHVlIDw8PSAzMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKyAgICBjYXNlIEZGSV9UWVBFX0lOVDoKKyNpZiBGRklfU0laRU9GX0pBVkFfUkFXID09IDQKKyAgICBjYXNlIEZGSV9UWVBFX1BPSU5URVI6CisjZW5kaWYKKyAgICAgICooU0lOVDY0ICopcnZhbHVlIDw8PSAzMjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZmZpX2phdmFfcmF3X3RvX3J2YWx1ZSAoZmZpX2NpZiAqY2lmLCB2b2lkICpydmFsdWUpCit7CisjaWYgV09SRFNfQklHRU5ESUFOICYmIEZGSV9TSVpFT0ZfQVJHID09IDgKKyAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDMyOgorICAgICAgKihVSU5UNjQgKilydmFsdWUgPj49IDMyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorICAgIGNhc2UgRkZJX1RZUEVfSU5UOgorICAgICAgKihTSU5UNjQgKilydmFsdWUgPj49IDMyOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCit9CisKKy8qIFRoaXMgaXMgYSBnZW5lcmljIGRlZmluaXRpb24gb2YgZmZpX3Jhd19jYWxsLCB0byBiZSB1c2VkIGlmIHRoZQorICogbmF0aXZlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIGEgbWFjaGluZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KKyAqIEhhdmluZyB0aGlzLCBhbGxvd3MgY29kZSB0byBiZSB3cml0dGVuIGZvciB0aGUgcmF3IEFQSSwgd2l0aG91dAorICogdGhlIG5lZWQgZm9yIHN5c3RlbS1zcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSBpbnB1dCBpbiB0aGF0IGZvcm1hdDsKKyAqIHRoZXNlIGZvbGxvd2luZyBjb3VwbGUgb2YgZnVuY3Rpb25zIHdpbGwgaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBmb3J0aAorICogYW5kIGJhY2sgYXV0b21hdGljYWxseS4gKi8KKwordm9pZCBmZmlfamF2YV9yYXdfY2FsbCAoZmZpX2NpZiAqY2lmLCB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICpydmFsdWUsCisJCQlmZmlfamF2YV9yYXcgKnJhdykKK3sKKyAgdm9pZCAqKmF2YWx1ZSA9ICh2b2lkKiopIGFsbG9jYSAoY2lmLT5uYXJncyAqIHNpemVvZiAodm9pZCopKTsKKyAgZmZpX2phdmFfcmF3X3RvX3B0cmFycmF5IChjaWYsIHJhdywgYXZhbHVlKTsKKyAgZmZpX2NhbGwgKGNpZiwgZm4sIHJ2YWx1ZSwgYXZhbHVlKTsKKyAgZmZpX2phdmFfcnZhbHVlX3RvX3JhdyAoY2lmLCBydmFsdWUpOworfQorCisjaWYgRkZJX0NMT1NVUkVTCQkvKiBiYXNlIHN5c3RlbSBwcm92aWRlcyBjbG9zdXJlcyAqLworCitzdGF0aWMgdm9pZAorZmZpX2phdmFfdHJhbnNsYXRlX2FyZ3MgKGZmaV9jaWYgKmNpZiwgdm9pZCAqcnZhbHVlLAorCQkgICAgdm9pZCAqKmF2YWx1ZSwgdm9pZCAqdXNlcl9kYXRhKQoreworICBmZmlfamF2YV9yYXcgKnJhdyA9IChmZmlfamF2YV9yYXcqKWFsbG9jYSAoZmZpX2phdmFfcmF3X3NpemUgKGNpZikpOworICBmZmlfcmF3X2Nsb3N1cmUgKmNsID0gKGZmaV9yYXdfY2xvc3VyZSopdXNlcl9kYXRhOworCisgIGZmaV9qYXZhX3B0cmFycmF5X3RvX3JhdyAoY2lmLCBhdmFsdWUsIHJhdyk7CisgICgqY2wtPmZ1bikgKGNpZiwgcnZhbHVlLCAoZmZpX3JhdyopcmF3LCBjbC0+dXNlcl9kYXRhKTsKKyAgZmZpX2phdmFfcmF3X3RvX3J2YWx1ZSAoY2lmLCBydmFsdWUpOworfQorCitmZmlfc3RhdHVzCitmZmlfcHJlcF9qYXZhX3Jhd19jbG9zdXJlX2xvYyAoZmZpX2phdmFfcmF3X2Nsb3N1cmUqIGNsLAorCQkJICAgICAgIGZmaV9jaWYgKmNpZiwKKwkJCSAgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfamF2YV9yYXcqLHZvaWQqKSwKKwkJCSAgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCQkgICAgICAgdm9pZCAqY29kZWxvYykKK3sKKyAgZmZpX3N0YXR1cyBzdGF0dXM7CisKKyAgc3RhdHVzID0gZmZpX3ByZXBfY2xvc3VyZV9sb2MgKChmZmlfY2xvc3VyZSopIGNsLAorCQkJCSBjaWYsCisJCQkJICZmZmlfamF2YV90cmFuc2xhdGVfYXJncywKKwkJCQkgY29kZWxvYywKKwkJCQkgY29kZWxvYyk7CisgIGlmIChzdGF0dXMgPT0gRkZJX09LKQorICAgIHsKKyAgICAgIGNsLT5mdW4gICAgICAgPSBmdW47CisgICAgICBjbC0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICAgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKiBBZ2FpbiwgaGVyZSBpcyB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIGZmaV9wcmVwX3Jhd19jbG9zdXJlLCB3aGljaAorICogd2lsbCBpbnN0YWxsIGFuIGludGVybWVkaWF0ZSAiaHViIiBmb3IgdHJhbnNsYXRpb24gb2YgYXJndW1lbnRzIGZyb20KKyAqIHRoZSBwb2ludGVyLWFycmF5IGZvcm1hdCwgdG8gdGhlIHJhdyBmb3JtYXQgKi8KKworZmZpX3N0YXR1cworZmZpX3ByZXBfamF2YV9yYXdfY2xvc3VyZSAoZmZpX2phdmFfcmF3X2Nsb3N1cmUqIGNsLAorCQkJICAgZmZpX2NpZiAqY2lmLAorCQkJICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosZmZpX2phdmFfcmF3Kix2b2lkKiksCisJCQkgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIHJldHVybiBmZmlfcHJlcF9qYXZhX3Jhd19jbG9zdXJlX2xvYyAoY2wsIGNpZiwgZnVuLCB1c2VyX2RhdGEsIGNsKTsKK30KKworI2VuZGlmIC8qIEZGSV9DTE9TVVJFUyAqLworI2VuZGlmIC8qICFGRklfTkFUSVZFX1JBV19BUEkgKi8KKyNlbmRpZiAvKiAhRkZJX05PX1JBV19BUEkgKi8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTMyci9mZmkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTMyci9mZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDAwMDYzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9tMzJyL2ZmaS5jCkBAIC0wLDAgKzEsMjMyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDIwMDQgIFJlbmVzYXMgVGVjaG5vbG9neQorICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggIFJlZCBIYXQsIEluYy4KKyAgIAorICAgTTMyUiBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBSRU5FU0FTIFRFQ0hOT0xPR1kgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sKKyAgIHNwYWNlIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLiAgKi8KKwordm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCit7CisgIHVuc2lnbmVkIGludCBpOworICBpbnQgdG1wOworICB1bnNpZ25lZCBpbnQgYXZuOworICB2b2lkICoqcF9hcmd2OworICBjaGFyICphcmdwOworICBmZmlfdHlwZSAqKnBfYXJnOworCisgIHRtcCA9IDA7CisgIGFyZ3AgPSBzdGFjazsKKworICBpZiAoZWNpZi0+Y2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QgJiYgZWNpZi0+Y2lmLT5ydHlwZS0+c2l6ZSA+IDgpCisgICAgeworICAgICAgKih2b2lkICoqKSBhcmdwID0gZWNpZi0+cnZhbHVlOworICAgICAgYXJncCArPSA0OworICAgIH0KKworICBhdm4gPSBlY2lmLT5jaWYtPm5hcmdzOworICBwX2FyZ3YgPSBlY2lmLT5hdmFsdWU7CisKKyAgZm9yIChpID0gZWNpZi0+Y2lmLT5uYXJncywgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsKKyAgICAgICAoaSAhPSAwKSAmJiAoYXZuICE9IDApOworICAgICAgIGktLSwgcF9hcmcrKykKKyAgICB7CisgICAgICBzaXplX3QgejsKKworICAgICAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIGlmICgoKCpwX2FyZyktPmFsaWdubWVudCAtIDEpICYgKHVuc2lnbmVkKSBhcmdwKQorCWFyZ3AgPSAoY2hhciAqKSBBTElHTiAoYXJncCwgKCpwX2FyZyktPmFsaWdubWVudCk7CisKKyAgICAgIGlmIChhdm4gIT0gMCkgCisJeworCSAgYXZuLS07CisJICB6ID0gKCpwX2FyZyktPnNpemU7CisJICBpZiAoeiA8IHNpemVvZiAoaW50KSkKKwkgICAgeworCSAgICAgIHogPSBzaXplb2YgKGludCk7CisKKwkgICAgICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKQorCQl7CisJCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJCSAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAoc2lnbmVkIGludCkqKFNJTlQ4ICopKCogcF9hcmd2KTsKKwkJICBicmVhazsKKwkJICAKKwkJY2FzZSBGRklfVFlQRV9VSU5UODoKKwkJICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQ4ICopKCogcF9hcmd2KTsKKwkJICBicmVhazsKKwkJICAKKwkJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJCSAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAoc2lnbmVkIGludCkqKFNJTlQxNiAqKSgqIHBfYXJndik7CisJCSAgYnJlYWs7CisJCSAgCisJCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCQkgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDE2ICopKCogcF9hcmd2KTsKKwkJICBicmVhazsKKwkJICAKKwkJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAJICB6ID0gKCpwX2FyZyktPnNpemU7CisJICAJICBpZiAoKCpwX2FyZyktPmFsaWdubWVudCAhPSAxKQorCQkgICAgbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKwkJICBlbHNlCisJCSAgICBtZW1jcHkgKGFyZ3AgKyA0IC0geiwgKnBfYXJndiwgeik7CisJICAJICB6ID0gc2l6ZW9mIChpbnQpOworCQkgIGJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgRkZJX0FTU0VSVCgwKTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmICh6ID09IHNpemVvZiAoaW50KSkKKwkgICAgeworCSAgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQzMiAqKSgqIHBfYXJndik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgoKnBfYXJnKS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisJICAgICAgICB7CisJCSAgaWYgKHogPiA4KQorCQkgICAgeworCQkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkodm9pZCAqKSgqIHBfYXJndik7CisJCSAgICAgIHogPSBzaXplb2Yodm9pZCAqKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJICAgICAgICAgICAgICBtZW1jcHkoYXJncCwgKnBfYXJndiwgeik7CisJCSAgICAgIHogPSA4OworCQkgICAgfQorCSAgICAgICAgfQorCSAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAvKiBEb3VibGUgb3IgbG9uZyBsb25nIDY0Yml0LiAgKi8KKwkgICAgICAgICAgbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKwkgICAgICAgIH0KKwkgICAgfQorCSAgcF9hcmd2Kys7CisJICBhcmdwICs9IHo7CisJfQorICAgIH0KKyAgCisgIHJldHVybjsKK30KKworLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZy4gICovCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpCit7CisgIC8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZy4gICovCisgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgICAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA8PSA0KQorCWNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisKKyAgICAgIGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPD0gOCkKKwljaWYtPmZsYWdzID0gRkZJX1RZUEVfRE9VQkxFOworCisgICAgICBlbHNlCisJY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfRE9VQkxFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgIGRlZmF1bHQ6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfSU5UOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBGRklfT0s7Cit9CisKK2V4dGVybiB2b2lkIGZmaV9jYWxsX1NZU1Yodm9pZCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksIGV4dGVuZGVkX2NpZiAqLAorCQkJICB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkICosIHZvaWQgKCpmbikodm9pZCkpOworCit2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisgIAorICAvKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0IGFuZCB3ZSBkb24ndCBoYXZlCisgICAgIGEgcmV0dXJuIHZhbHVlIGFkZHJlc3MgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lLiAgKi8KKyAgaWYgKChydmFsdWUgPT0gTlVMTCkgJiYgCisgICAgICAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpKQorICAgIHsKKyAgICAgIGVjaWYucnZhbHVlID0gYWxsb2NhIChjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsgICAgCisgIAorICBzd2l0Y2ggKGNpZi0+YWJpKSAKKyAgICB7CisgICAgY2FzZSBGRklfU1lTVjoKKyAgICAgIGZmaV9jYWxsX1NZU1YoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsIAorCQkgICAgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKwl7CisJICBpbnQgc2l6ZSA9IGNpZi0+cnR5cGUtPnNpemU7CisJICBpbnQgYWxpZ24gPSBjaWYtPnJ0eXBlLT5hbGlnbm1lbnQ7CisKKwkgIGlmIChzaXplIDwgNCkKKwkgICAgeworCSAgICAgIGlmIChhbGlnbiA9PSAxKQorCSAgICAgICAgKih1bnNpZ25lZCBsb25nICopKGVjaWYucnZhbHVlKSA8PD0gKDQgLSBzaXplKSAqIDg7CisJICAgIH0KKwkgIGVsc2UgaWYgKDQgPCBzaXplICYmIHNpemUgPCA4KQorCSAgICB7CisJICAgICAgaWYgKGFsaWduID09IDEpCisJCXsKKwkJICBtZW1jcHkgKGVjaWYucnZhbHVlLCBlY2lmLnJ2YWx1ZSArIDgtc2l6ZSwgc2l6ZSk7CisJCX0KKwkgICAgICBlbHNlIGlmIChhbGlnbiA9PSAyKQorCQl7CisJCSAgaWYgKHNpemUgJiAxKQorCQkgICAgc2l6ZSArPSAxOworCisJCSAgaWYgKHNpemUgIT0gOCkKKwkJICAgIG1lbWNweSAoZWNpZi5ydmFsdWUsIGVjaWYucnZhbHVlICsgOC1zaXplLCBzaXplKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgRkZJX0FTU0VSVCgwKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTMyci9mZml0YXJnZXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTMyci9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTJlYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9tMzJyL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMjAwNCAgUmVuZXNhcyBUZWNobm9sb2d5LgorICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBNMzJSLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFJFTkVTQVMgVEVDSE5PTE9HWSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKKyNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICisKKy8qIC0tLS0gR2VuZXJpYyB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX0FTTQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7Cit0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CisKK3R5cGVkZWYgZW51bSBmZmlfYWJpCisgIHsKKyAgICBGRklfRklSU1RfQUJJID0gMCwKKyAgICBGRklfU1lTViwKKyAgICBGRklfTEFTVF9BQkksCisgICAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YKKyAgfSBmZmlfYWJpOworI2VuZGlmCisKKyNkZWZpbmUgRkZJX0NMT1NVUkVTIAkJMAorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFCTI0CisjZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAJMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTMyci9zeXN2LlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL20zMnIvc3lzdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Yjc1YzIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL20zMnIvc3lzdi5TCkBAIC0wLDAgKzEsMTIxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDA0IFJlbmVzYXMgVGVjaG5vbG9neQorICAgCisgICBNMzJSIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFJFTkVTQVMgVEVDSE5PTE9HWSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElCRkZJX0FTTQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorI2lmZGVmIEhBVkVfTUFDSElORV9BU01fSAorI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisjZWxzZQorLyogWFhYIHRoZXNlIGxvc2UgZm9yIHNvbWUgcGxhdGZvcm1zLCBJJ20gc3VyZS4gICovCisjZGVmaW5lIENOQU1FKHgpIHgKKyNkZWZpbmUgRU5UUlkoeCkgLmdsb2JsIENOQU1FKHgpISAudHlwZSBDTkFNRSh4KSwlZnVuY3Rpb24hIENOQU1FKHgpOgorI2VuZGlmCisKKy50ZXh0CisKKwkvKiBSMDogICBmZmlfcHJlcF9hcmdzICovCisJLyogUjE6ICAgJmVjaWYgKi8KKwkvKiBSMjogICBjaWYtPmJ5dGVzICovCisJLyogUjM6ICAgZmlnLT5mbGFncyAqLworCS8qIHNwKzA6IGVjaWYucnZhbHVlICovCisJLyogc3ArNDogZm4gKi8KKworCS8qIFRoaXMgYXNzdW1lcyB3ZSBhcmUgdXNpbmcgZ2FzLiAgKi8KK0VOVFJZKGZmaV9jYWxsX1NZU1YpCisJLyogU2F2ZSByZWdpc3RlcnMuICAqLworCXB1c2gJZnAKKwlwdXNoCWxyCisJcHVzaAlyMworCXB1c2gJcjIKKwlwdXNoCXIxCisJcHVzaAlyMAorCW12CWZwLCBzcAorCisJLyogTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLiAgKi8KKwlzdWIJc3AsIHIyCisKKwkvKiBQbGFjZSBhbGwgb2YgdGhlIGZmaV9wcmVwX2FyZ3MgaW4gcG9zaXRpb24uICAqLworCW12CWxyLCByMAkKKwltdglyMCwgc3AKKwkvKiBSMSBhbHJlYWR5IHNldC4gICovCisKKwkvKiBBbmQgY2FsbC4gICovCisJamwJbHIKKworCS8qIE1vdmUgZmlyc3QgNCBwYXJhbWV0ZXJzIGluIHJlZ2lzdGVycy4uLiAgKi8KKwlsZAlyMCwgQCgwLHNwKQorCWxkCXIxLCBAKDQsc3ApCisJbGQJcjIsIEAoOCxzcCkKKyAgICAgICAgbGQJcjMsIEAoMTIsc3ApCisKKwkvKiAuLi5hbmQgYWRqdXN0IHRoZSBzdGFjay4gICovCisJbGQJbHIsIEAoOCxmcCkKKyAgICAgICAgY21waQlsciwgIzE2CisJYmMJYWRqdXN0X3N0YWNrCisJbGRpCWxyLCAjMTYKK2FkanVzdF9zdGFjazoKKyAgICAgICAgYWRkCXNwLCBscgorCisJLyogQ2FsbCB0aGUgZnVuY3Rpb24uICAqLworCWxkCWxyLCBAKDI4LGZwKQorCWpsCWxyCQorCisJLyogUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzLiAgKi8KKwltdglzcCwgZnAJCisKKwkvKiBMb2FkIFIyIHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZS4gICovCisJbGQJcjIsIEAoMjQsc3ApCisKKwkvKiBMb2FkIFIzIHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUuICAqLworCWxkCXIzLCBAKDEyLHNwKQorCisJLyogSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuICAqLworCWJlcXoJcjIsIGVwaWxvZ3VlCisKKwkvKiBSZXR1cm4gSU5ULiAgKi8KKwlsZGkJcjQsICNGRklfVFlQRV9JTlQKKwlibmUJcjMsIHI0LCByZXR1cm5fZG91YmxlCisJc3QJcjAsIEByMgkKKwlicmEJZXBpbG9ndWUKKworcmV0dXJuX2RvdWJsZToKKwkvKiBSZXR1cm4gRE9VQkxFIG9yIExPTkdET1VCTEUuICAqLworCWxkaQlyNCwgI0ZGSV9UWVBFX0RPVUJMRQorCWJuZQlyMywgcjQsIGVwaWxvZ3VlCisJc3QJcjAsIEByMgkKKwlzdAlyMSwgQCg0LHIyKQorCitlcGlsb2d1ZToKKwlwb3AJcjAKKwlwb3AJcjEKKwlwb3AJcjIKKwlwb3AJcjMKKwlwb3AJbHIKKwlwb3AJZnAKKyAgICAgICAgam1wIGxyCisKKy5mZmlfY2FsbF9TWVNWX2VuZDoKKyAgICAgICAgLnNpemUgICAgQ05BTUUoZmZpX2NhbGxfU1lTViksLmZmaV9jYWxsX1NZU1ZfZW5kLUNOQU1FKGZmaV9jYWxsX1NZU1YpCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL202OGsvZmZpLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL202OGsvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0ZGYxZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTY4ay9mZmkuYwpAQCAtMCwwICsxLDI4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jCisgICAKKyAgIG02OGsgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgX19ydGVtc19fCit2b2lkIHJ0ZW1zX2NhY2hlX2ZsdXNoX211bHRpcGxlX2RhdGFfbGluZXMoIGNvbnN0IHZvaWQgKiwgc2l6ZV90ICk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CisjZW5kaWYKKwordm9pZCBmZmlfY2FsbF9TWVNWIChleHRlbmRlZF9jaWYgKiwKKwkJICAgIHVuc2lnbmVkLCB1bnNpZ25lZCwKKwkJICAgIHZvaWQgKiwgdm9pZCAoKmZuKSAoKSk7Cit2b2lkICpmZmlfcHJlcF9hcmdzICh2b2lkICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKTsKK3ZvaWQgZmZpX2Nsb3N1cmVfU1lTViAoZmZpX2Nsb3N1cmUgKik7Cit2b2lkIGZmaV9jbG9zdXJlX3N0cnVjdF9TWVNWIChmZmlfY2xvc3VyZSAqKTsKK3Vuc2lnbmVkIGludCBmZmlfY2xvc3VyZV9TWVNWX2lubmVyIChmZmlfY2xvc3VyZSAqY2xvc3VyZSwKKwkJCQkgICAgIHZvaWQgKnJlc3AsIHZvaWQgKmFyZ3MpOworCisvKiBmZmlfcHJlcF9hcmdzIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibHkgcm91dGluZSBvbmNlIHN0YWNrIHNwYWNlIGhhcworICAgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cy4gICovCisKK3ZvaWQgKgorZmZpX3ByZXBfYXJncyAodm9pZCAqc3RhY2ssIGV4dGVuZGVkX2NpZiAqZWNpZikKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIHZvaWQgKipwX2FyZ3Y7CisgIGNoYXIgKmFyZ3A7CisgIGZmaV90eXBlICoqcF9hcmc7CisgIHZvaWQgKnN0cnVjdF92YWx1ZV9wdHI7CisKKyAgYXJncCA9IHN0YWNrOworCisgIGlmIChlY2lmLT5jaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAorICAgICAgJiYgIWVjaWYtPmNpZi0+ZmxhZ3MpCisgICAgc3RydWN0X3ZhbHVlX3B0ciA9IGVjaWYtPnJ2YWx1ZTsKKyAgZWxzZQorICAgIHN0cnVjdF92YWx1ZV9wdHIgPSBOVUxMOworCisgIHBfYXJndiA9IGVjaWYtPmF2YWx1ZTsKKworICBmb3IgKGkgPSBlY2lmLT5jaWYtPm5hcmdzLCBwX2FyZyA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOworICAgICAgIGkgIT0gMDsKKyAgICAgICBpLS0sIHBfYXJnKyspCisgICAgeworICAgICAgc2l6ZV90IHo7CisKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKyAgICAgIGlmICh6IDwgc2l6ZW9mIChpbnQpKQorCXsKKwkgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSAqKFNJTlQ4ICopICpwX2FyZ3Y7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkgKihVSU5UOCAqKSAqcF9hcmd2OworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCSAgICAgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpICooU0lOVDE2ICopICpwX2FyZ3Y7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpICooVUlOVDE2ICopICpwX2FyZ3Y7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAgICAgbWVtY3B5IChhcmdwICsgc2l6ZW9mIChpbnQpIC0geiwgKnBfYXJndiwgeik7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBGRklfQVNTRVJUICgwKTsKKwkgICAgfQorCSAgeiA9IHNpemVvZiAoaW50KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKworCSAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIGlmICgoc2l6ZW9mKGludCkgLSAxKSAmIHopCisJICAgIHogPSBBTElHTih6LCBzaXplb2YoaW50KSk7CisJfQorCisgICAgICBwX2FyZ3YrKzsKKyAgICAgIGFyZ3AgKz0gejsKKyAgICB9CisKKyAgcmV0dXJuIHN0cnVjdF92YWx1ZV9wdHI7Cit9CisKKyNkZWZpbmUgQ0lGX0ZMQUdTX0lOVAkJMQorI2RlZmluZSBDSUZfRkxBR1NfRElOVAkJMgorI2RlZmluZSBDSUZfRkxBR1NfRkxPQVQJCTQKKyNkZWZpbmUgQ0lGX0ZMQUdTX0RPVUJMRQk4CisjZGVmaW5lIENJRl9GTEFHU19MRE9VQkxFCTE2CisjZGVmaW5lIENJRl9GTEFHU19QT0lOVEVSCTMyCisjZGVmaW5lIENJRl9GTEFHU19TVFJVQ1QxCTY0CisjZGVmaW5lIENJRl9GTEFHU19TVFJVQ1QyCTEyOAorCisvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jaWZfbWFjaGRlcCAoZmZpX2NpZiAqY2lmKQoreworICAvKiBTZXQgdGhlIHJldHVybiB0eXBlIGZsYWcgKi8KKyAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CisgICAgICBjaWYtPmZsYWdzID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnNpemUpCisJeworCWNhc2UgMToKKwkgIGNpZi0+ZmxhZ3MgPSBDSUZfRkxBR1NfU1RSVUNUMTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIGNpZi0+ZmxhZ3MgPSBDSUZfRkxBR1NfU1RSVUNUMjsKKwkgIGJyZWFrOworCWNhc2UgNDoKKwkgIGNpZi0+ZmxhZ3MgPSBDSUZfRkxBR1NfSU5UOworCSAgYnJlYWs7CisJY2FzZSA4OgorCSAgY2lmLT5mbGFncyA9IENJRl9GTEFHU19ESU5UOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGNpZi0+ZmxhZ3MgPSAwOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgY2lmLT5mbGFncyA9IENJRl9GTEFHU19GTE9BVDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX0RPVUJMRTsKKyAgICAgIGJyZWFrOworCisjaWYgKEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFKQorICAgIGNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyAgICAgIGNpZi0+ZmxhZ3MgPSBDSUZfRkxBR1NfTERPVUJMRTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIEZGSV9UWVBFX1BPSU5URVI6CisgICAgICBjaWYtPmZsYWdzID0gQ0lGX0ZMQUdTX1BPSU5URVI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgICAgY2lmLT5mbGFncyA9IENJRl9GTEFHU19ESU5UOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgY2lmLT5mbGFncyA9IENJRl9GTEFHU19JTlQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKwordm9pZAorZmZpX2NhbGwgKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSAoKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisKKyAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybiB2YWx1ZQorICAgICBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZS4gICovCisKKyAgaWYgKHJ2YWx1ZSA9PSBOVUxMCisgICAgICAmJiBjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAorICAgICAgJiYgY2lmLT5ydHlwZS0+c2l6ZSA+IDgpCisgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EgKGNpZi0+cnR5cGUtPnNpemUpOworICBlbHNlCisgICAgZWNpZi5ydmFsdWUgPSBydmFsdWU7CisKKyAgc3dpdGNoIChjaWYtPmFiaSkKKyAgICB7CisgICAgY2FzZSBGRklfU1lTVjoKKyAgICAgIGZmaV9jYWxsX1NZU1YgKCZlY2lmLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLAorCQkgICAgIGVjaWYucnZhbHVlLCBmbik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUICgwKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2ZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTViAoY2hhciAqc3RhY2ssIHZvaWQgKiphdmFsdWUsIGZmaV9jaWYgKmNpZikKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIHZvaWQgKipwX2FyZ3Y7CisgIGNoYXIgKmFyZ3A7CisgIGZmaV90eXBlICoqcF9hcmc7CisKKyAgYXJncCA9IHN0YWNrOworICBwX2FyZ3YgPSBhdmFsdWU7CisKKyAgZm9yIChpID0gY2lmLT5uYXJncywgcF9hcmcgPSBjaWYtPmFyZ190eXBlczsgKGkgIT0gMCk7IGktLSwgcF9hcmcrKykKKyAgICB7CisgICAgICBzaXplX3QgejsKKworICAgICAgeiA9ICgqcF9hcmcpLT5zaXplOworICAgICAgaWYgKHogPD0gNCkKKwl7CisJICAqcF9hcmd2ID0gKHZvaWQgKikgKGFyZ3AgKyA0IC0geik7CisKKwkgIHogPSA0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqcF9hcmd2ID0gKHZvaWQgKikgYXJncDsKKworCSAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5ICovCisJICBpZiAoKHNpemVvZihpbnQpIC0gMSkgJiB6KQorCSAgICB6ID0gQUxJR04oeiwgc2l6ZW9mKGludCkpOworCX0KKworICAgICAgcF9hcmd2Kys7CisgICAgICBhcmdwICs9IHo7CisgICAgfQorfQorCit1bnNpZ25lZCBpbnQKK2ZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIgKGZmaV9jbG9zdXJlICpjbG9zdXJlLCB2b2lkICpyZXNwLCB2b2lkICphcmdzKQoreworICBmZmlfY2lmICpjaWY7CisgIHZvaWQgKiphcmdfYXJlYTsKKworICBjaWYgPSBjbG9zdXJlLT5jaWY7CisgIGFyZ19hcmVhID0gKHZvaWQqKikgYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkICopKTsKKworICBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoYXJncywgYXJnX2FyZWEsIGNpZik7CisKKyAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgcmVzcCwgYXJnX2FyZWEsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgcmV0dXJuIGNpZi0+ZmxhZ3M7Cit9CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmVfbG9jIChmZmlfY2xvc3VyZSogY2xvc3VyZSwKKwkJICAgICAgZmZpX2NpZiogY2lmLAorCQkgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCSAgICAgIHZvaWQgKmNvZGVsb2MpCit7CisgIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9TWVNWKTsKKworICAqKHVuc2lnbmVkIHNob3J0ICopY2xvc3VyZS0+dHJhbXAgPSAweDIwN2M7CisgICoodm9pZCAqKikoY2xvc3VyZS0+dHJhbXAgKyAyKSA9IGNvZGVsb2M7CisgICoodW5zaWduZWQgc2hvcnQgKikoY2xvc3VyZS0+dHJhbXAgKyA2KSA9IDB4NGVmOTsKKyAgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAmJiAhY2lmLT5mbGFncykKKyAgICAqKHZvaWQgKiopKGNsb3N1cmUtPnRyYW1wICsgOCkgPSBmZmlfY2xvc3VyZV9zdHJ1Y3RfU1lTVjsKKyAgZWxzZQorICAgICoodm9pZCAqKikoY2xvc3VyZS0+dHJhbXAgKyA4KSA9IGZmaV9jbG9zdXJlX1NZU1Y7CisKKyNpZmRlZiBfX3J0ZW1zX18KKyAgcnRlbXNfY2FjaGVfZmx1c2hfbXVsdGlwbGVfZGF0YV9saW5lcyggY29kZWxvYywgRkZJX1RSQU1QT0xJTkVfU0laRSApOworI2Vsc2UKKyAgc3lzY2FsbChTWVNfY2FjaGVmbHVzaCwgY29kZWxvYywgRkxVU0hfU0NPUEVfTElORSwKKwkgIEZMVVNIX0NBQ0hFX0JPVEgsIEZGSV9UUkFNUE9MSU5FX1NJWkUpOworI2VuZGlmCisKKyAgY2xvc3VyZS0+Y2lmICA9IGNpZjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBjbG9zdXJlLT5mdW4gID0gZnVuOworCisgIHJldHVybiBGRklfT0s7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTY4ay9mZml0YXJnZXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTY4ay9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc3N2VkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9tNjhrL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DLSotCisgICBmZml0YXJnZXQuaCAtIENvcHlyaWdodCAoYykgMTk5Ni0yMDAzICBSZWQgSGF0LCBJbmMuCisgICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIE1vdG9yb2xhIDY4Sy4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAorI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKKworI2lmbmRlZiBMSUJGRklfQVNNCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZmZpX2FyZzsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgICAgICAgICAgICBmZmlfc2FyZzsKKwordHlwZWRlZiBlbnVtIGZmaV9hYmkgeworICBGRklfRklSU1RfQUJJID0gMCwKKyAgRkZJX1NZU1YsCisgIEZGSV9MQVNUX0FCSSwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YKK30gZmZpX2FiaTsKKyNlbmRpZgorCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMTYKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbTY4ay9zeXN2LlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL202OGsvc3lzdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODJmNTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL202OGsvc3lzdi5TCkBAIC0wLDAgKzEsMjcwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAxOTk4IEFuZHJlYXMgU2Nod2FiCisJICAgIENvcHlyaWdodCAoYykgMjAwOCBSZWQgSGF0LCBJbmMuIAorICAgCisgICBtNjhrIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00JCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKyNpZmRlZiBIQVZFX0FTX0NGSV9QU0VVRE9fT1AKKyNkZWZpbmUgQ0ZJX1NUQVJUUFJPQygpCQkuY2ZpX3N0YXJ0cHJvYworI2RlZmluZSBDRklfT0ZGU0VUKHJlZyxvZmYpCS5jZmlfb2Zmc2V0CXJlZyxvZmYKKyNkZWZpbmUgQ0ZJX0RFRl9DRkEocmVnLG9mZikJLmNmaV9kZWZfY2ZhCXJlZyxvZmYKKyNkZWZpbmUgQ0ZJX0VORFBST0MoKQkJLmNmaV9lbmRwcm9jCisjZWxzZQorI2RlZmluZSBDRklfU1RBUlRQUk9DKCkKKyNkZWZpbmUgQ0ZJX09GRlNFVChyZWcsb2ZmKQorI2RlZmluZSBDRklfREVGX0NGQShyZWcsb2ZmKQorI2RlZmluZSBDRklfRU5EUFJPQygpCisjZW5kaWYKKworCS50ZXh0CisKKwkuZ2xvYmwJZmZpX2NhbGxfU1lTVgorCS50eXBlCWZmaV9jYWxsX1NZU1YsQGZ1bmN0aW9uCisJLmFsaWduCTQKKworZmZpX2NhbGxfU1lTVjoKKwlDRklfU1RBUlRQUk9DKCkKKwlsaW5rCSVmcCwjMAorCUNGSV9PRkZTRVQoMTQsLTgpCisJQ0ZJX0RFRl9DRkEoMTQsOCkKKwltb3ZlLmwJJWQyLC0oJXNwKQorCUNGSV9PRkZTRVQoMiwtMTIpCisKKwl8IE1ha2Ugcm9vbSBmb3IgYWxsIG9mIHRoZSBuZXcgYXJncy4KKwlzdWIubAkxMiglZnApLCVzcAorCisJfCBDYWxsIGZmaV9wcmVwX2FyZ3MKKwltb3ZlLmwJOCglZnApLC0oJXNwKQorCXBlYQk0KCVzcCkKKyNpZiAhZGVmaW5lZCBfX1BJQ19fCisJanNyCWZmaV9wcmVwX2FyZ3MKKyNlbHNlCisJYnNyLmwJZmZpX3ByZXBfYXJnc0BQTFRQQworI2VuZGlmCisJYWRkcS5sCSM4LCVzcAkKKworCXwgUGFzcyBwb2ludGVyIHRvIHN0cnVjdCB2YWx1ZSwgaWYgYW55CisJbW92ZS5sCSVhMCwlYTEKKworCXwgQ2FsbCB0aGUgZnVuY3Rpb24KKwltb3ZlLmwJMjQoJWZwKSwlYTAKKwlqc3IJKCVhMCkKKworCXwgUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzCisJYWRkLmwJMTIoJWZwKSwlc3AKKworCXwgTG9hZCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisJbW92ZS5sCTIwKCVmcCksJWExCisKKwl8IExvYWQgdGhlIHJldHVybiB0eXBlIGNvZGUgCisJbW92ZS5sCTE2KCVmcCksJWQyCisKKwl8IElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgorCXwgTk9URTogT24gdGhlIG1jNjgwMDAsIHRzdCBvbiBhbiBhZGRyZXNzIHJlZ2lzdGVyIGlzIG5vdCBzdXBwb3J0ZWQuCisjaWYgZGVmaW5lZChfX21jNjgwMDBfXykgJiYgIWRlZmluZWQoX19tY29sZGZpcmVfXykKKwljbXAudwkjMCwgJWExCisjZWxzZQorCXRzdC5sCSVhMQorI2VuZGlmCisJamJlcQlub3JldHZhbAorCisJYnRzdAkjMCwlZDIKKwlqYmVxCXJldGxvbmdpbnQKKwltb3ZlLmwJJWQwLCglYTEpCisJamJyYQllcGlsb2d1ZQorCityZXRsb25naW50OgorCWJ0c3QJIzEsJWQyCisJamJlcQlyZXRmbG9hdAorCW1vdmUubAklZDAsKCVhMSkKKwltb3ZlLmwJJWQxLDQoJWExKQorCWpicmEJZXBpbG9ndWUKKworcmV0ZmxvYXQ6CisJYnRzdAkjMiwlZDIKKwlqYmVxCXJldGRvdWJsZQorI2lmIGRlZmluZWQoX19NQzY4ODgxX18pCisJZm1vdmUucwklZnAwLCglYTEpCisjZWxzZQorCW1vdmUubAklZDAsKCVhMSkKKyNlbmRpZgorCWpicmEJZXBpbG9ndWUKKworcmV0ZG91YmxlOgorCWJ0c3QJIzMsJWQyCisJamJlcQlyZXRsb25nZG91YmxlCisjaWYgZGVmaW5lZChfX01DNjg4ODFfXykKKwlmbW92ZS5kCSVmcDAsKCVhMSkKKyNlbHNlCisJbW92ZS5sCSVkMCwoJWExKSsKKwltb3ZlLmwJJWQxLCglYTEpCisjZW5kaWYKKwlqYnJhCWVwaWxvZ3VlCisKK3JldGxvbmdkb3VibGU6CisJYnRzdAkjNCwlZDIKKwlqYmVxCXJldHBvaW50ZXIKKyNpZiBkZWZpbmVkKF9fTUM2ODg4MV9fKQorCWZtb3ZlLngJJWZwMCwoJWExKQorI2Vsc2UKKwltb3ZlLmwJJWQwLCglYTEpKworCW1vdmUubAklZDEsKCVhMSkrCisJbW92ZS5sCSVkMiwoJWExKQorI2VuZGlmCisJamJyYQllcGlsb2d1ZQorCityZXRwb2ludGVyOgorCWJ0c3QJIzUsJWQyCisJamJlcQlyZXRzdHJ1Y3QxCisJbW92ZS5sCSVhMCwoJWExKQorCWpicmEJZXBpbG9ndWUKKworcmV0c3RydWN0MToKKwlidHN0CSM2LCVkMgorCWpiZXEJcmV0c3RydWN0MgorCW1vdmUuYgklZDAsKCVhMSkKKwlqYnJhCWVwaWxvZ3VlCisKK3JldHN0cnVjdDI6CisJYnRzdAkjNywlZDIKKwlqYmVxCW5vcmV0dmFsCisJbW92ZS53CSVkMCwoJWExKQorCitub3JldHZhbDoKK2VwaWxvZ3VlOgorCW1vdmUubAkoJXNwKSssJWQyCisJdW5sawklZnAKKwlydHMKKwlDRklfRU5EUFJPQygpCisJLnNpemUJZmZpX2NhbGxfU1lTViwuLWZmaV9jYWxsX1NZU1YKKworCS5nbG9ibAlmZmlfY2xvc3VyZV9TWVNWCisJLnR5cGUJZmZpX2Nsb3N1cmVfU1lTViwgQGZ1bmN0aW9uCisJLmFsaWduCTQKKworZmZpX2Nsb3N1cmVfU1lTVjoKKwlDRklfU1RBUlRQUk9DKCkKKwlsaW5rCSVmcCwjLTEyCisJQ0ZJX09GRlNFVCgxNCwtOCkKKwlDRklfREVGX0NGQSgxNCw4KQorCW1vdmUubAklc3AsLTEyKCVmcCkKKwlwZWEJOCglZnApCisJcGVhCS0xMiglZnApCisJbW92ZS5sCSVhMCwtKCVzcCkKKyNpZiAhZGVmaW5lZCBfX1BJQ19fCisJanNyCWZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIKKyNlbHNlCisJYnNyLmwJZmZpX2Nsb3N1cmVfU1lTVl9pbm5lckBQTFRQQworI2VuZGlmCisKKwlsc3IubAkjMSwlZDAKKwlqbmUJMWYKKwlqY2MJLkxjbHNfZXBpbG9ndWUKKwltb3ZlLmwJLTEyKCVmcCksJWQwCisuTGNsc19lcGlsb2d1ZToKKwl1bmxrCSVmcAorCXJ0cworMToKKwlsZWEJLTEyKCVmcCksJWEwCisJbHNyLmwJIzIsJWQwCisJam5lCTFmCisJamNzCS5MY2xzX3JldF9mbG9hdAorCW1vdmUubAkoJWEwKSssJWQwCisJbW92ZS5sCSglYTApLCVkMQorCWpyYQkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0X2Zsb2F0OgorI2lmIGRlZmluZWQoX19NQzY4ODgxX18pCisJZm1vdmUucwkoJWEwKSwlZnAwCisjZWxzZQorCW1vdmUubAkoJWEwKSwlZDAKKyNlbmRpZgorCWpyYQkuTGNsc19lcGlsb2d1ZQorMToKKwlsc3IubAkjMiwlZDAKKwlqbmUJMWYKKwlqY3MJLkxjbHNfcmV0X2xkb3VibGUKKyNpZiBkZWZpbmVkKF9fTUM2ODg4MV9fKQorCWZtb3ZlLmQJKCVhMCksJWZwMAorI2Vsc2UKKwltb3ZlLmwJKCVhMCkrLCVkMAorCW1vdmUubAkoJWEwKSwlZDEKKyNlbmRpZgorCWpyYQkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0X2xkb3VibGU6CisjaWYgZGVmaW5lZChfX01DNjg4ODFfXykKKwlmbW92ZS54CSglYTApLCVmcDAKKyNlbHNlCisJbW92ZS5sCSglYTApKywlZDAKKwltb3ZlLmwJKCVhMCkrLCVkMQorCW1vdmUubAkoJWEwKSwlZDIKKyNlbmRpZgorCWpyYQkuTGNsc19lcGlsb2d1ZQorMToKKwlsc3IubAkjMiwlZDAKKwlqbmUJLkxjbHNfcmV0X3N0cnVjdDIKKwlqY3MJLkxjbHNfcmV0X3N0cnVjdDEKKwltb3ZlLmwJKCVhMCksJWEwCisJbW92ZS5sCSVhMCwlZDAKKwlqcmEJLkxjbHNfZXBpbG9ndWUKKy5MY2xzX3JldF9zdHJ1Y3QxOgorCW1vdmUuYgkoJWEwKSwlZDAKKwlqcmEJLkxjbHNfZXBpbG9ndWUKKy5MY2xzX3JldF9zdHJ1Y3QyOgorCW1vdmUudwkoJWEwKSwlZDAKKwlqcmEJLkxjbHNfZXBpbG9ndWUKKwlDRklfRU5EUFJPQygpCisKKwkuc2l6ZQlmZmlfY2xvc3VyZV9TWVNWLC4tZmZpX2Nsb3N1cmVfU1lTVgorCisJLmdsb2JsCWZmaV9jbG9zdXJlX3N0cnVjdF9TWVNWCisJLnR5cGUJZmZpX2Nsb3N1cmVfc3RydWN0X1NZU1YsIEBmdW5jdGlvbgorCS5hbGlnbgk0CisKK2ZmaV9jbG9zdXJlX3N0cnVjdF9TWVNWOgorCUNGSV9TVEFSVFBST0MoKQorCWxpbmsJJWZwLCMwCisJQ0ZJX09GRlNFVCgxNCwtOCkKKwlDRklfREVGX0NGQSgxNCw4KQorCW1vdmUubAklc3AsLTEyKCVmcCkKKwlwZWEJOCglZnApCisJbW92ZS5sCSVhMSwtKCVzcCkKKwltb3ZlLmwJJWEwLC0oJXNwKQorI2lmICFkZWZpbmVkIF9fUElDX18KKwlqc3IJZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcgorI2Vsc2UKKwlic3IubAlmZmlfY2xvc3VyZV9TWVNWX2lubmVyQFBMVFBDCisjZW5kaWYKKwl1bmxrCSVmcAorCXJ0cworCUNGSV9FTkRQUk9DKCkKKwkuc2l6ZQlmZmlfY2xvc3VyZV9zdHJ1Y3RfU1lTViwuLWZmaV9jbG9zdXJlX3N0cnVjdF9TWVNWCisKKyNpZiBkZWZpbmVkIF9fRUxGX18gJiYgZGVmaW5lZCBfX2xpbnV4X18KKwkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbWlwcy9mZmkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbWlwcy9mZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2FjYjhhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9taXBzL2ZmaS5jCkBAIC0wLDAgKzEsMTAzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAyMDExICBBbnRob255IEdyZWVuCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOCAgRGF2aWQgRGFuZXkKKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LCAyMDA3LCAyMDA4LCAyMDExICBSZWQgSGF0LCBJbmMuCisgICAKKyAgIE1JUFMgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIF9fR05VQ19fCisjICBpZiAoX19HTlVDX18gPiA0KSB8fCAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkKKyMgICAgZGVmaW5lIFVTRV9fQlVJTFRJTl9fX0NMRUFSX0NBQ0hFIDEKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBVU0VfX0JVSUxUSU5fX19DTEVBUl9DQUNIRQorIyAgaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyMgICAgaW5jbHVkZSA8bWlwczY0L3N5c2FyY2guaD4KKyMgIGVsc2UKKyMgICAgaW5jbHVkZSA8c3lzL2NhY2hlY3RsLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBGRklfREVCVUcKKyMgZGVmaW5lIEZGSV9NSVBTX1NUT1BfSEVSRSgpIGZmaV9zdG9wX2hlcmUoKQorI2Vsc2UKKyMgZGVmaW5lIEZGSV9NSVBTX1NUT1BfSEVSRSgpIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIEZGSV9NSVBTX04zMgorI2RlZmluZSBGSVhfQVJHUCBcCitGRklfQVNTRVJUKGFyZ3AgPD0gJnN0YWNrW2J5dGVzXSk7IFwKK2lmIChhcmdwID09ICZzdGFja1tieXRlc10pIFwKK3sgXAorICBhcmdwID0gc3RhY2s7IFwKKyAgRkZJX01JUFNfU1RPUF9IRVJFKCk7IFwKK30KKyNlbHNlCisjZGVmaW5lIEZJWF9BUkdQIAorI2VuZGlmCisKKworLyogZmZpX3ByZXBfYXJncyBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmx5IHJvdXRpbmUgb25jZSBzdGFjayBzcGFjZQorICAgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgKi8KKworc3RhdGljIHZvaWQgZmZpX3ByZXBfYXJncyhjaGFyICpzdGFjaywgCisJCQkgIGV4dGVuZGVkX2NpZiAqZWNpZiwKKwkJCSAgaW50IGJ5dGVzLAorCQkJICBpbnQgZmxhZ3MpCit7CisgIGludCBpOworICB2b2lkICoqcF9hcmd2OworICBjaGFyICphcmdwOworICBmZmlfdHlwZSAqKnBfYXJnOworICBpbnQgZWNpZl90ZXN0OworCisjaWZkZWYgRkZJX01JUFNfTjMyCisgIC8qIElmIG1vcmUgdGhhbiA4IGRvdWJsZSB3b3JkcyBhcmUgdXNlZCwgdGhlIHJlbWFpbmRlciBnbworICAgICBvbiB0aGUgc3RhY2suIFdlIHJlb3JkZXIgc3R1ZmYgb24gdGhlIHN0YWNrIGhlcmUgdG8gCisgICAgIHN1cHBvcnQgdGhpcyBlYXNpbHkuICovCisgIGlmIChieXRlcyA+IDggKiBzaXplb2YoZmZpX2FyZykpCisgICAgYXJncCA9ICZzdGFja1tieXRlcyAtICg4ICogc2l6ZW9mKGZmaV9hcmcpKV07CisgIGVsc2UKKyAgICBhcmdwID0gc3RhY2s7CisjZWxzZQorICBhcmdwID0gc3RhY2s7CisjZW5kaWYKKworICBtZW1zZXQoc3RhY2ssIDAsIGJ5dGVzKTsKKworI2lmZGVmIEZGSV9NSVBTX04zMgorICBlY2lmX3Rlc3QgPSBlY2lmLT5jaWYtPnJzdHJ1Y3RfZmxhZyAhPSAwOworI2Vsc2UKKyAgZWNpZl90ZXN0ID0gZWNpZi0+Y2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1Q7CisjZW5kaWYgIAorICAgIGlmIChlY2lmX3Rlc3QpCisgICAgeworICAgICAgKihmZmlfYXJnICopIGFyZ3AgPSAoZmZpX2FyZykgZWNpZi0+cnZhbHVlOworICAgICAgYXJncCArPSBzaXplb2YoZmZpX2FyZyk7CisgICAgICBGSVhfQVJHUDsKKyAgICB9CisKKyAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworCisgIGZvciAoaSA9IDAsIHBfYXJnID0gZWNpZi0+Y2lmLT5hcmdfdHlwZXM7IGkgPCBlY2lmLT5jaWYtPm5hcmdzOyBpKyssIHBfYXJnKyspCisgICAgeworICAgICAgc2l6ZV90IHo7CisgICAgICB1bnNpZ25lZCBpbnQgYTsKKworICAgICAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIGEgPSAoKnBfYXJnKS0+YWxpZ25tZW50OworICAgICAgaWYgKGEgPCBzaXplb2YoZmZpX2FyZykpCisgICAgICAgIGEgPSBzaXplb2YoZmZpX2FyZyk7CisgICAgICAKKyAgICAgIGlmICgoYSAtIDEpICYgKHVuc2lnbmVkIGxvbmcpIGFyZ3ApCisJeworCSAgYXJncCA9IChjaGFyICopIEFMSUdOKGFyZ3AsIGEpOworCSAgRklYX0FSR1A7CisJfQorCisgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisgICAgICBpZiAoeiA8PSBzaXplb2YoZmZpX2FyZykpCisJeworICAgICAgICAgIGludCB0eXBlID0gKCpwX2FyZyktPnR5cGU7CisJICB6ID0gc2l6ZW9mKGZmaV9hcmcpOworCisgICAgICAgICAgLyogVGhlIHNpemUgb2YgYSBwb2ludGVyIGRlcGVuZHMgb24gdGhlIEFCSSAqLworICAgICAgICAgIGlmICh0eXBlID09IEZGSV9UWVBFX1BPSU5URVIpCisgICAgICAgICAgICB0eXBlID0gKGVjaWYtPmNpZi0+YWJpID09IEZGSV9ONjQKKwkJICAgIHx8IGVjaWYtPmNpZi0+YWJpID09IEZGSV9ONjRfU09GVF9GTE9BVCkKKwkgICAgICA/IEZGSV9UWVBFX1NJTlQ2NCA6IEZGSV9UWVBFX1NJTlQzMjsKKworCWlmIChpIDwgOCAmJiAoZWNpZi0+Y2lmLT5hYmkgPT0gRkZJX04zMl9TT0ZUX0ZMT0FUCisJCSAgICAgIHx8IGVjaWYtPmNpZi0+YWJpID09IEZGSV9ONjRfU09GVF9GTE9BVCkpCisJICB7CisJICAgIHN3aXRjaCAodHlwZSkKKwkgICAgICB7CisJICAgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkJdHlwZSA9IEZGSV9UWVBFX1VJTlQzMjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJCXR5cGUgPSBGRklfVFlQRV9VSU5UNjQ7CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKwkgIHN3aXRjaCAodHlwZSkKKwkgICAgeworCSAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisJCSooZmZpX2FyZyAqKWFyZ3AgPSAqKFNJTlQ4ICopKCogcF9hcmd2KTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorCQkqKGZmaV9hcmcgKilhcmdwID0gKihVSU5UOCAqKSgqIHBfYXJndik7CisJCWJyZWFrOworCQkgIAorCSAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCQkqKGZmaV9hcmcgKilhcmdwID0gKihTSU5UMTYgKikoKiBwX2FyZ3YpOworCQlicmVhazsKKwkJICAKKwkgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkJKihmZmlfYXJnICopYXJncCA9ICooVUlOVDE2ICopKCogcF9hcmd2KTsKKwkJYnJlYWs7CisJCSAgCisJICAgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJCSooZmZpX2FyZyAqKWFyZ3AgPSAqKFNJTlQzMiAqKSgqIHBfYXJndik7CisJCWJyZWFrOworCQkgIAorCSAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDMyOgorCQkqKGZmaV9hcmcgKilhcmdwID0gKihVSU5UMzIgKikoKiBwX2FyZ3YpOworCQlicmVhazsKKworCSAgICAgIC8qIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdpdGggNjRiaXQgc2xvdHMuICAqLworCSAgICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJCSooZmxvYXQgKikgYXJncCA9ICooZmxvYXQgKikoKiBwX2FyZ3YpOworCQlicmVhazsKKworCSAgICAgIC8qIEhhbmRsZSBzdHJ1Y3R1cmVzLiAgKi8KKwkgICAgICBkZWZhdWx0OgorCQltZW1jcHkoYXJncCwgKnBfYXJndiwgKCpwX2FyZyktPnNpemUpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisjaWZkZWYgRkZJX01JUFNfTzMyCisJICBtZW1jcHkoYXJncCwgKnBfYXJndiwgeik7CisjZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBsb25nIGVuZCA9ICh1bnNpZ25lZCBsb25nKSBhcmdwICsgejsKKwkgICAgdW5zaWduZWQgbG9uZyBjYXAgPSAodW5zaWduZWQgbG9uZykgc3RhY2sgKyBieXRlczsKKworCSAgICAvKiBDaGVjayBpZiB0aGUgZGF0YSB3aWxsIGZpdCB3aXRoaW4gdGhlIHJlZ2lzdGVyIHNwYWNlLgorCSAgICAgICBIYW5kbGUgaXQgaWYgaXQgZG9lc24ndC4gICovCisKKwkgICAgaWYgKGVuZCA8PSBjYXApCisJICAgICAgbWVtY3B5KGFyZ3AsICpwX2FyZ3YsIHopOworCSAgICBlbHNlCisJICAgICAgeworCQl1bnNpZ25lZCBsb25nIHBvcnRpb24gPSBjYXAgLSAodW5zaWduZWQgbG9uZylhcmdwOworCisJCW1lbWNweShhcmdwLCAqcF9hcmd2LCBwb3J0aW9uKTsKKwkJYXJncCA9IHN0YWNrOworICAgICAgICAgICAgICAgIHogLT0gcG9ydGlvbjsKKwkJbWVtY3B5KGFyZ3AsICh2b2lkKikoKHVuc2lnbmVkIGxvbmcpKCpwX2FyZ3YpICsgcG9ydGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgIHopOworCSAgICAgIH0KKwkgIH0KKyNlbmRpZgorICAgICAgfQorICAgICAgcF9hcmd2Kys7CisgICAgICBhcmdwICs9IHo7CisgICAgICBGSVhfQVJHUDsKKyAgICB9Cit9CisKKyNpZmRlZiBGRklfTUlQU19OMzIKKworLyogVGhlIG4zMiBzcGVjIHNheXMgdGhhdCBpZiAiYSBjaHVuayBjb25zaXN0cyBzb2xlbHkgb2YgYSBkb3VibGUgCisgICBmbG9hdCBmaWVsZCAoYnV0IG5vdCBhIGRvdWJsZSwgd2hpY2ggaXMgcGFydCBvZiBhIHVuaW9uKSwgaXQKKyAgIGlzIHBhc3NlZCBpbiBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiBBbnkgb3RoZXIgY2h1bmsgaXMKKyAgIHBhc3NlZCBpbiBhbiBpbnRlZ2VyIHJlZ2lzdGVyIi4gVGhpcyBjb2RlIHRyYXZlcnNlcyBzdHJ1Y3R1cmUKKyAgIGRlZmluaXRpb25zIGFuZCBnZW5lcmF0ZXMgdGhlIGFwcHJvcHJpYXRlIGZsYWdzLiAqLworCitzdGF0aWMgdW5zaWduZWQKK2NhbGNfbjMyX3N0cnVjdF9mbGFncyhpbnQgc29mdF9mbG9hdCwgZmZpX3R5cGUgKmFyZywKKwkJICAgICAgdW5zaWduZWQgKmxvYywgdW5zaWduZWQgKmFyZ19yZWcpCit7CisgIHVuc2lnbmVkIGZsYWdzID0gMDsKKyAgdW5zaWduZWQgaW5kZXggPSAwOworCisgIGZmaV90eXBlICplOworCisgIGlmIChzb2Z0X2Zsb2F0KQorICAgIHJldHVybiAwOworCisgIHdoaWxlICgoZSA9IGFyZy0+ZWxlbWVudHNbaW5kZXhdKSkKKyAgICB7CisgICAgICAvKiBBbGlnbiB0aGlzIG9iamVjdC4gICovCisgICAgICAqbG9jID0gQUxJR04oKmxvYywgZS0+YWxpZ25tZW50KTsKKyAgICAgIGlmIChlLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKwl7CisgICAgICAgICAgLyogQWxyZWFkeSBhbGlnbmVkIHRvIEZGSV9TSVpFT0ZfQVJHLiAgKi8KKyAgICAgICAgICAqYXJnX3JlZyA9ICpsb2MgLyBGRklfU0laRU9GX0FSRzsKKyAgICAgICAgICBpZiAoKmFyZ19yZWcgPiA3KQorICAgICAgICAgICAgYnJlYWs7CisJICBmbGFncyArPSAoRkZJX1RZUEVfRE9VQkxFIDw8ICgqYXJnX3JlZyAqIEZGSV9GTEFHX0JJVFMpKTsKKyAgICAgICAgICAqbG9jICs9IGUtPnNpemU7CisJfQorICAgICAgZWxzZQorICAgICAgICAqbG9jICs9IGUtPnNpemU7CisgICAgICBpbmRleCsrOworICAgIH0KKyAgLyogTmV4dCBBcmd1bWVudCByZWdpc3RlciBhdCBhbGlnbm1lbnQgb2YgRkZJX1NJWkVPRl9BUkcuICAqLworICAqYXJnX3JlZyA9IEFMSUdOKCpsb2MsIEZGSV9TSVpFT0ZfQVJHKSAvIEZGSV9TSVpFT0ZfQVJHOworCisgIHJldHVybiBmbGFnczsKK30KKworc3RhdGljIHVuc2lnbmVkCitjYWxjX24zMl9yZXR1cm5fc3RydWN0X2ZsYWdzKGludCBzb2Z0X2Zsb2F0LCBmZmlfdHlwZSAqYXJnKQoreworICB1bnNpZ25lZCBmbGFncyA9IDA7CisgIHVuc2lnbmVkIHNtYWxsID0gRkZJX1RZUEVfU01BTExTVFJVQ1Q7CisgIGZmaV90eXBlICplOworCisgIC8qIFJldHVybmluZyBzdHJ1Y3R1cmVzIHVuZGVyIG4zMiBpcyBhIHRyaWNreSB0aGluZy4KKyAgICAgQSBzdHJ1Y3Qgd2l0aCBvbmx5IG9uZSBvciB0d28gZmxvYXRpbmcgcG9pbnQgZmllbGRzIAorICAgICBpcyByZXR1cm5lZCBpbiAkZjAgKGFuZCAkZjIgaWYgbmVjZXNzYXJ5KS4gQW55IG90aGVyCisgICAgIHN0cnVjdCByZXN1bHRzIGF0IG1vc3QgMTI4IGJpdHMgYXJlIHJldHVybmVkIGluICQyCisgICAgICh0aGUgZmlyc3QgNjQgYml0cykgYW5kICQzIChyZW1haW5kZXIsIGlmIG5lY2Vzc2FyeSkuCisgICAgIExhcmdlciBzdHJ1Y3RzIGFyZSBoYW5kbGVkIG5vcm1hbGx5LiAqLworICAKKyAgaWYgKGFyZy0+c2l6ZSA+IDE2KQorICAgIHJldHVybiAwOworCisgIGlmIChhcmctPnNpemUgPiA4KQorICAgIHNtYWxsID0gRkZJX1RZUEVfU01BTExTVFJVQ1QyOworCisgIGUgPSBhcmctPmVsZW1lbnRzWzBdOworCisgIGlmIChlLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKyAgICBmbGFncyA9IEZGSV9UWVBFX0RPVUJMRTsKKyAgZWxzZSBpZiAoZS0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVCkKKyAgICBmbGFncyA9IEZGSV9UWVBFX0ZMT0FUOworCisgIGlmIChmbGFncyAmJiAoZSA9IGFyZy0+ZWxlbWVudHNbMV0pKQorICAgIHsKKyAgICAgIGlmIChlLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKwlmbGFncyArPSBGRklfVFlQRV9ET1VCTEUgPDwgRkZJX0ZMQUdfQklUUzsKKyAgICAgIGVsc2UgaWYgKGUtPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisJZmxhZ3MgKz0gRkZJX1RZUEVfRkxPQVQgPDwgRkZJX0ZMQUdfQklUUzsKKyAgICAgIGVsc2UgCisJcmV0dXJuIHNtYWxsOworCisgICAgICBpZiAoZmxhZ3MgJiYgKGFyZy0+ZWxlbWVudHNbMl0pKQorCXsKKwkgIC8qIFRoZXJlIGFyZSB0aHJlZSBhcmd1bWVudHMgYW5kIHRoZSBmaXJzdCB0d28gYXJlIAorCSAgICAgZmxvYXRzISBUaGlzIG11c3QgYmUgcGFzc2VkIHRoZSBvbGQgd2F5LiAqLworCSAgcmV0dXJuIHNtYWxsOworCX0KKyAgICAgIGlmIChzb2Z0X2Zsb2F0KQorCWZsYWdzICs9IEZGSV9UWVBFX1NUUlVDVF9TT0ZUOworICAgIH0KKyAgZWxzZQorICAgIGlmICghZmxhZ3MpCisgICAgICByZXR1cm4gc21hbGw7CisKKyAgcmV0dXJuIGZsYWdzOworfQorCisjZW5kaWYKKworLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZyAqLworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpCit7CisgIGNpZi0+ZmxhZ3MgPSAwOworCisjaWZkZWYgRkZJX01JUFNfTzMyCisgIC8qIFNldCB0aGUgZmxhZ3MgbmVjZXNzYXJ5IGZvciBPMzIgcHJvY2Vzc2luZy4gIEZGSV9PMzJfU09GVF9GTE9BVAorICAgKiBkb2VzIG5vdCBoYXZlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGZsb2F0aW5nIHBvaW50IGFyZ3MuCisgICAqLworCisgIGlmIChjaWYtPnJ0eXBlLT50eXBlICE9IEZGSV9UWVBFX1NUUlVDVCAmJiBjaWYtPmFiaSA9PSBGRklfTzMyKQorICAgIHsKKyAgICAgIGlmIChjaWYtPm5hcmdzID4gMCkKKwl7CisJICBzd2l0Y2ggKChjaWYtPmFyZ190eXBlcylbMF0tPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICAgICAgY2lmLT5mbGFncyArPSAoY2lmLT5hcmdfdHlwZXMpWzBdLT50eXBlOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmIChjaWYtPm5hcmdzID4gMSkKKwkgICAgeworCSAgICAgIC8qIE9ubHkgaGFuZGxlIHRoZSBzZWNvbmQgYXJndW1lbnQgaWYgdGhlIGZpcnN0CisJCSBpcyBhIGZsb2F0IG9yIGRvdWJsZS4gKi8KKwkgICAgICBpZiAoY2lmLT5mbGFncykKKwkJeworCQkgIHN3aXRjaCAoKGNpZi0+YXJnX3R5cGVzKVsxXS0+dHlwZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJCSAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkJICAgICAgY2lmLT5mbGFncyArPSAoY2lmLT5hcmdfdHlwZXMpWzFdLT50eXBlIDw8IEZGSV9GTEFHX0JJVFM7CisJCSAgICAgIGJyZWFrOworCQkgICAgICAKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgICAgCisgIC8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZyAqLworCisgIGlmIChjaWYtPmFiaSA9PSBGRklfTzMyX1NPRlRfRkxPQVQpCisgICAgeworICAgICAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKKyAgICAgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICAgICAgY2lmLT5mbGFncyArPSBjaWYtPnJ0eXBlLT50eXBlIDw8IChGRklfRkxBR19CSVRTICogMik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgICAgICBjaWYtPmZsYWdzICs9IEZGSV9UWVBFX1VJTlQ2NCA8PCAoRkZJX0ZMQUdfQklUUyAqIDIpOworICAgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2lmLT5mbGFncyArPSBGRklfVFlQRV9JTlQgPDwgKEZGSV9GTEFHX0JJVFMgKiAyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZGSV9PMzIgKi8gICAgICAKKyAgICAgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CisgICAgICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgICAgICBjaWYtPmZsYWdzICs9IGNpZi0+cnR5cGUtPnR5cGUgPDwgKEZGSV9GTEFHX0JJVFMgKiAyKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgY2lmLT5mbGFncyArPSBGRklfVFlQRV9VSU5UNjQgPDwgKEZGSV9GTEFHX0JJVFMgKiAyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNpZi0+ZmxhZ3MgKz0gRkZJX1RZUEVfSU5UIDw8IChGRklfRkxBR19CSVRTICogMik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEZGSV9NSVBTX04zMgorICAvKiBTZXQgdGhlIGZsYWdzIG5lY2Vzc2FyeSBmb3IgTjMyIHByb2Nlc3NpbmcgKi8KKyAgeworICAgIGludCB0eXBlOworICAgIHVuc2lnbmVkIGFyZ19yZWcgPSAwOworICAgIHVuc2lnbmVkIGxvYyA9IDA7CisgICAgdW5zaWduZWQgY291bnQgPSAoY2lmLT5uYXJncyA8IDgpID8gY2lmLT5uYXJncyA6IDg7CisgICAgdW5zaWduZWQgaW5kZXggPSAwOworCisgICAgdW5zaWduZWQgc3RydWN0X2ZsYWdzID0gMDsKKyAgICBpbnQgc29mdF9mbG9hdCA9IChjaWYtPmFiaSA9PSBGRklfTjMyX1NPRlRfRkxPQVQKKwkJICAgICAgfHwgY2lmLT5hYmkgPT0gRkZJX042NF9TT0ZUX0ZMT0FUKTsKKworICAgIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICAgIHsKKwlzdHJ1Y3RfZmxhZ3MgPSBjYWxjX24zMl9yZXR1cm5fc3RydWN0X2ZsYWdzKHNvZnRfZmxvYXQsIGNpZi0+cnR5cGUpOworCisJaWYgKHN0cnVjdF9mbGFncyA9PSAwKQorCSAgeworCSAgICAvKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHN0cnVjdHVyZSBpcyBiZWluZyBwYXNzZWQgYXMKKwkgICAgICAgYSBoaWRkZW4gYXJndW1lbnQgKi8KKworCSAgICBhcmdfcmVnID0gMTsKKwkgICAgY291bnQgPSAoY2lmLT5uYXJncyA8IDcpID8gY2lmLT5uYXJncyA6IDc7CisKKwkgICAgY2lmLT5yc3RydWN0X2ZsYWcgPSAhMDsKKwkgIH0KKwllbHNlCisJICAgIGNpZi0+cnN0cnVjdF9mbGFnID0gMDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBjaWYtPnJzdHJ1Y3RfZmxhZyA9IDA7CisKKyAgICB3aGlsZSAoY291bnQtLSA+IDAgJiYgYXJnX3JlZyA8IDgpCisgICAgICB7CisJdHlwZSA9IChjaWYtPmFyZ190eXBlcylbaW5kZXhdLT50eXBlOworCWlmIChzb2Z0X2Zsb2F0KQorCSAgeworCSAgICBzd2l0Y2ggKHR5cGUpCisJICAgICAgeworCSAgICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJCXR5cGUgPSBGRklfVFlQRV9VSU5UMzI7CisJCWJyZWFrOworCSAgICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCQl0eXBlID0gRkZJX1RZUEVfVUlOVDY0OworCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgICB9CisJICB9CisJc3dpdGNoICh0eXBlKQorCSAgeworCSAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgICBjaWYtPmZsYWdzICs9CisgICAgICAgICAgICAgICgoY2lmLT5hcmdfdHlwZXMpW2luZGV4XS0+dHlwZSA8PCAoYXJnX3JlZyAqIEZGSV9GTEFHX0JJVFMpKTsKKwkgICAgYXJnX3JlZysrOworCSAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisgICAgICAgICAgICAvKiBBbGlnbiBpdC4gICovCisgICAgICAgICAgICBhcmdfcmVnID0gQUxJR04oYXJnX3JlZywgMik7CisgICAgICAgICAgICAvKiBUcmVhdCBpdCBhcyB0d28gYWRqYWNlbnQgZG91Ymxlcy4gICovCisJICAgIGlmIChzb2Z0X2Zsb2F0KSAKKwkgICAgICB7CisJCWFyZ19yZWcgKz0gMjsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWNpZi0+ZmxhZ3MgKz0KKwkJICAoRkZJX1RZUEVfRE9VQkxFIDw8IChhcmdfcmVnICogRkZJX0ZMQUdfQklUUykpOworCQlhcmdfcmVnKys7CisJCWNpZi0+ZmxhZ3MgKz0KKwkJICAoRkZJX1RZUEVfRE9VQkxFIDw8IChhcmdfcmVnICogRkZJX0ZMQUdfQklUUykpOworCQlhcmdfcmVnKys7CisJICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKwkgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgICAgICAgbG9jID0gYXJnX3JlZyAqIEZGSV9TSVpFT0ZfQVJHOworCSAgICBjaWYtPmZsYWdzICs9IGNhbGNfbjMyX3N0cnVjdF9mbGFncyhzb2Z0X2Zsb2F0LAorCQkJCQkJKGNpZi0+YXJnX3R5cGVzKVtpbmRleF0sCisJCQkJCQkmbG9jLCAmYXJnX3JlZyk7CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBhcmdfcmVnKys7CisgICAgICAgICAgICBicmVhazsKKwkgIH0KKworCWluZGV4Kys7CisgICAgICB9CisKKyAgLyogU2V0IHRoZSByZXR1cm4gdHlwZSBmbGFnICovCisgICAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgICAgeworICAgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJeworCSAgaWYgKHN0cnVjdF9mbGFncyA9PSAwKQorCSAgICB7CisJICAgICAgLyogVGhlIHN0cnVjdHVyZSBpcyByZXR1cm5lZCB0aHJvdWdoIGEgaGlkZGVuCisJCSBmaXJzdCBhcmd1bWVudC4gRG8gbm90aGluZywgJ2NhdXNlIEZGSV9UWVBFX1ZPSUQgCisJCSBpcyAwICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoZSBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgdmlhIHNvbWUgdHJpY2t5CisJCSBtZWNoYW5pc20gKi8KKwkgICAgICBjaWYtPmZsYWdzICs9IEZGSV9UWVBFX1NUUlVDVCA8PCAoRkZJX0ZMQUdfQklUUyAqIDgpOworCSAgICAgIGNpZi0+ZmxhZ3MgKz0gc3RydWN0X2ZsYWdzIDw8ICg0ICsgKEZGSV9GTEFHX0JJVFMgKiA4KSk7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIAorICAgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorCS8qIERvIG5vdGhpbmcsICdjYXVzZSBGRklfVFlQRV9WT0lEIGlzIDAgKi8KKwlicmVhazsKKworICAgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorCWlmIChjaWYtPmFiaSA9PSBGRklfTjMyX1NPRlRfRkxPQVQgfHwgY2lmLT5hYmkgPT0gRkZJX04zMikKKwkgIGNpZi0+ZmxhZ3MgKz0gRkZJX1RZUEVfU0lOVDMyIDw8IChGRklfRkxBR19CSVRTICogOCk7CisJZWxzZQorCSAgY2lmLT5mbGFncyArPSBGRklfVFlQRV9JTlQgPDwgKEZGSV9GTEFHX0JJVFMgKiA4KTsKKwlicmVhazsKKworICAgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwlpZiAoc29mdF9mbG9hdCkKKwkgIHsKKwkgICAgY2lmLT5mbGFncyArPSBGRklfVFlQRV9TSU5UMzIgPDwgKEZGSV9GTEFHX0JJVFMgKiA4KTsKKwkgICAgYnJlYWs7CisJICB9CisJLyogZWxzZSBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCWlmIChzb2Z0X2Zsb2F0KQorCSAgY2lmLT5mbGFncyArPSBGRklfVFlQRV9JTlQgPDwgKEZGSV9GTEFHX0JJVFMgKiA4KTsKKwllbHNlCisJICBjaWYtPmZsYWdzICs9IGNpZi0+cnR5cGUtPnR5cGUgPDwgKEZGSV9GTEFHX0JJVFMgKiA4KTsKKwlicmVhazsKKworICAgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCS8qIExvbmcgZG91YmxlIGlzIHJldHVybmVkIGFzIGlmIGl0IHdlcmUgYSBzdHJ1Y3QgY29udGFpbmluZworCSAgIHR3byBkb3VibGVzLiAgKi8KKwlpZiAoc29mdF9mbG9hdCkKKwkgIHsKKwkgICAgY2lmLT5mbGFncyArPSBGRklfVFlQRV9TVFJVQ1QgPDwgKEZGSV9GTEFHX0JJVFMgKiA4KTsKKwkgICAgY2lmLT5mbGFncyArPSBGRklfVFlQRV9TTUFMTFNUUlVDVDIgPDwgKDQgKyAoRkZJX0ZMQUdfQklUUyAqIDgpKTsKKyAJICB9CisJZWxzZQorCSAgeworCSAgICBjaWYtPmZsYWdzICs9IEZGSV9UWVBFX1NUUlVDVCA8PCAoRkZJX0ZMQUdfQklUUyAqIDgpOworCSAgICBjaWYtPmZsYWdzICs9IChGRklfVFlQRV9ET1VCTEUKKwkJCSAgICsgKEZGSV9UWVBFX0RPVUJMRSA8PCBGRklfRkxBR19CSVRTKSkKKwkJCQkJICAgICAgPDwgKDQgKyAoRkZJX0ZMQUdfQklUUyAqIDgpKTsKKwkgIH0KKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJY2lmLT5mbGFncyArPSBGRklfVFlQRV9JTlQgPDwgKEZGSV9GTEFHX0JJVFMgKiA4KTsKKwlicmVhazsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisgIAorICByZXR1cm4gRkZJX09LOworfQorCisvKiBMb3cgbGV2ZWwgcm91dGluZSBmb3IgY2FsbGluZyBPMzIgZnVuY3Rpb25zICovCitleHRlcm4gaW50IGZmaV9jYWxsX08zMih2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqLCBpbnQsIGludCksIAorCQkJZXh0ZW5kZWRfY2lmICosIHVuc2lnbmVkLCAKKwkJCXVuc2lnbmVkLCB1bnNpZ25lZCAqLCB2b2lkICgqKSh2b2lkKSk7CisKKy8qIExvdyBsZXZlbCByb3V0aW5lIGZvciBjYWxsaW5nIE4zMiBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgZmZpX2NhbGxfTjMyKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICosIGludCwgaW50KSwgCisJCQlleHRlbmRlZF9jaWYgKiwgdW5zaWduZWQsIAorCQkJdW5zaWduZWQsIHZvaWQgKiwgdm9pZCAoKikodm9pZCkpOworCit2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisgIAorICAvKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0IGFuZCB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuCSovCisgIC8qIHZhbHVlIGFkZHJlc3MgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lCQkgICAgICAgICovCisgIAorICBpZiAoKHJ2YWx1ZSA9PSBOVUxMKSAmJiAKKyAgICAgIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkpCisgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSk7CisgIGVsc2UKKyAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKKyAgICAKKyAgc3dpdGNoIChjaWYtPmFiaSkgCisgICAgeworI2lmZGVmIEZGSV9NSVBTX08zMgorICAgIGNhc2UgRkZJX08zMjoKKyAgICBjYXNlIEZGSV9PMzJfU09GVF9GTE9BVDoKKyAgICAgIGZmaV9jYWxsX08zMihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywgCisJCSAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgRkZJX01JUFNfTjMyCisgICAgY2FzZSBGRklfTjMyOgorICAgIGNhc2UgRkZJX04zMl9TT0ZUX0ZMT0FUOgorICAgIGNhc2UgRkZJX042NDoKKyAgICBjYXNlIEZGSV9ONjRfU09GVF9GTE9BVDoKKyAgICAgIHsKKyAgICAgICAgaW50IGNvcHlfcnZhbHVlID0gMDsKKwlpbnQgY29weV9vZmZzZXQgPSAwOworICAgICAgICBjaGFyICpydmFsdWVfY29weSA9IGVjaWYucnZhbHVlOworICAgICAgICBpZiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QgJiYgY2lmLT5ydHlwZS0+c2l6ZSA8IDE2KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZvciBzdHJ1Y3R1cmVzIHNtYWxsZXIgdGhhbiAxNiBieXRlcyB3ZSBjbG9iYmVyIG1lbW9yeQorICAgICAgICAgICAgICAgaW4gOCBieXRlIGluY3JlbWVudHMuICBNYWtlIGEgY29weSBzbyB3ZSBkb24ndCBjbG9iYmVyCisgICAgICAgICAgICAgICB0aGUgY2FsbGVycyBtZW1vcnkgb3V0c2lkZSBvZiB0aGUgc3RydWN0IGJvdW5kcy4gICovCisgICAgICAgICAgICBydmFsdWVfY29weSA9IGFsbG9jYSgxNik7CisgICAgICAgICAgICBjb3B5X3J2YWx1ZSA9IDE7CisgICAgICAgICAgfQorCWVsc2UgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQKKwkJICYmIChjaWYtPmFiaSA9PSBGRklfTjY0X1NPRlRfRkxPQVQKKwkJICAgICB8fCBjaWYtPmFiaSA9PSBGRklfTjMyX1NPRlRfRkxPQVQpKQorCSAgeworCSAgICBydmFsdWVfY29weSA9IGFsbG9jYSAoOCk7CisJICAgIGNvcHlfcnZhbHVlID0gMTsKKyNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX01JUFNFQikKKwkgICAgY29weV9vZmZzZXQgPSA0OworI2VuZGlmCisJICB9CisgICAgICAgIGZmaV9jYWxsX04zMihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgIGNpZi0+ZmxhZ3MsIHJ2YWx1ZV9jb3B5LCBmbik7CisgICAgICAgIGlmIChjb3B5X3J2YWx1ZSkKKyAgICAgICAgICBtZW1jcHkoZWNpZi5ydmFsdWUsIHJ2YWx1ZV9jb3B5ICsgY29weV9vZmZzZXQsIGNpZi0+cnR5cGUtPnNpemUpOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisjaWYgRkZJX0NMT1NVUkVTCisjaWYgZGVmaW5lZChGRklfTUlQU19PMzIpCitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV9PMzIodm9pZCk7CisjZWxzZQorZXh0ZXJuIHZvaWQgZmZpX2Nsb3N1cmVfTjMyKHZvaWQpOworI2VuZGlmIC8qIEZGSV9NSVBTX08zMiAqLworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsCisJCSAgICAgIGZmaV9jaWYgKmNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkgICAgICB2b2lkICpjb2RlbG9jKQoreworICB1bnNpZ25lZCBpbnQgKnRyYW1wID0gKHVuc2lnbmVkIGludCAqKSAmY2xvc3VyZS0+dHJhbXBbMF07CisgIHZvaWQgKiBmbjsKKyAgY2hhciAqY2xlYXJfbG9jYXRpb24gPSAoY2hhciAqKSBjb2RlbG9jOworCisjaWYgZGVmaW5lZChGRklfTUlQU19PMzIpCisgIGlmIChjaWYtPmFiaSAhPSBGRklfTzMyICYmIGNpZi0+YWJpICE9IEZGSV9PMzJfU09GVF9GTE9BVCkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisgIGZuID0gZmZpX2Nsb3N1cmVfTzMyOworI2Vsc2UgLyogRkZJX01JUFNfTjMyICovCisgIGlmIChjaWYtPmFiaSAhPSBGRklfTjMyICYmIGNpZi0+YWJpICE9IEZGSV9ONjQpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOworICBmbiA9IGZmaV9jbG9zdXJlX04zMjsKKyNlbmRpZiAvKiBGRklfTUlQU19PMzIgKi8KKworI2lmIGRlZmluZWQoRkZJX01JUFNfTzMyKSB8fCAoX01JUFNfU0lNID09X0FCSU4zMikKKyAgLyogbHVpICAkMjUsaGlnaChmbikgKi8KKyAgdHJhbXBbMF0gPSAweDNjMTkwMDAwIHwgKCh1bnNpZ25lZClmbiA+PiAxNik7CisgIC8qIG9yaSAgJDI1LGxvdyhmbikgICovCisgIHRyYW1wWzFdID0gMHgzNzM5MDAwMCB8ICgodW5zaWduZWQpZm4gJiAweGZmZmYpOworICAvKiBsdWkgICQxMixoaWdoKGNvZGVsb2MpICovCisgIHRyYW1wWzJdID0gMHgzYzBjMDAwMCB8ICgodW5zaWduZWQpY29kZWxvYyA+PiAxNik7CisgIC8qIGpyICAgJDI1ICAgICAgICAgICovCisgIHRyYW1wWzNdID0gMHgwMzIwMDAwODsKKyAgLyogb3JpICAkMTIsbG93KGNvZGVsb2MpICAqLworICB0cmFtcFs0XSA9IDB4MzU4YzAwMDAgfCAoKHVuc2lnbmVkKWNvZGVsb2MgJiAweGZmZmYpOworI2Vsc2UKKyAgLyogTjY0IGhhcyBhIHNvbWV3aGF0IGxhcmdlciB0cmFtcG9saW5lLiAgKi8KKyAgLyogbHVpICAkMjUsaGlnaChmbikgKi8KKyAgdHJhbXBbMF0gPSAweDNjMTkwMDAwIHwgKCh1bnNpZ25lZCBsb25nKWZuID4+IDQ4KTsKKyAgLyogbHVpICAkMTIsaGlnaChjb2RlbG9jKSAqLworICB0cmFtcFsxXSA9IDB4M2MwYzAwMDAgfCAoKHVuc2lnbmVkIGxvbmcpY29kZWxvYyA+PiA0OCk7CisgIC8qIG9yaSAgJDI1LG1pZC1oaWdoKGZuKSAgKi8KKyAgdHJhbXBbMl0gPSAweDM3MzkwMDAwIHwgKCgodW5zaWduZWQgbG9uZylmbiA+PiAzMiApICYgMHhmZmZmKTsKKyAgLyogb3JpICAkMTIsbWlkLWhpZ2goY29kZWxvYykgICovCisgIHRyYW1wWzNdID0gMHgzNThjMDAwMCB8ICgoKHVuc2lnbmVkIGxvbmcpY29kZWxvYyA+PiAzMikgJiAweGZmZmYpOworICAvKiBkc2xsICQyNSwkMjUsMTYgKi8KKyAgdHJhbXBbNF0gPSAweDAwMTljYzM4OworICAvKiBkc2xsICQxMiwkMTIsMTYgKi8KKyAgdHJhbXBbNV0gPSAweDAwMGM2NDM4OworICAvKiBvcmkgICQyNSxtaWQtbG93KGZuKSAgKi8KKyAgdHJhbXBbNl0gPSAweDM3MzkwMDAwIHwgKCgodW5zaWduZWQgbG9uZylmbiA+PiAxNiApICYgMHhmZmZmKTsKKyAgLyogb3JpICAkMTIsbWlkLWxvdyhjb2RlbG9jKSAgKi8KKyAgdHJhbXBbN10gPSAweDM1OGMwMDAwIHwgKCgodW5zaWduZWQgbG9uZyljb2RlbG9jID4+IDE2KSAmIDB4ZmZmZik7CisgIC8qIGRzbGwgJDI1LCQyNSwxNiAqLworICB0cmFtcFs4XSA9IDB4MDAxOWNjMzg7CisgIC8qIGRzbGwgJDEyLCQxMiwxNiAqLworICB0cmFtcFs5XSA9IDB4MDAwYzY0Mzg7CisgIC8qIG9yaSAgJDI1LGxvdyhmbikgICovCisgIHRyYW1wWzEwXSA9IDB4MzczOTAwMDAgfCAoKHVuc2lnbmVkIGxvbmcpZm4gICYgMHhmZmZmKTsKKyAgLyoganIgICAkMjUgICAgICAgICAgKi8KKyAgdHJhbXBbMTFdID0gMHgwMzIwMDAwODsKKyAgLyogb3JpICAkMTIsbG93KGNvZGVsb2MpICAqLworICB0cmFtcFsxMl0gPSAweDM1OGMwMDAwIHwgKCh1bnNpZ25lZCBsb25nKWNvZGVsb2MgJiAweGZmZmYpOworCisjZW5kaWYKKworICBjbG9zdXJlLT5jaWYgPSBjaWY7CisgIGNsb3N1cmUtPmZ1biA9IGZ1bjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworCisjaWZkZWYgVVNFX19CVUlMVElOX19fQ0xFQVJfQ0FDSEUKKyAgX19idWlsdGluX19fY2xlYXJfY2FjaGUoY2xlYXJfbG9jYXRpb24sIGNsZWFyX2xvY2F0aW9uICsgRkZJX1RSQU1QT0xJTkVfU0laRSk7CisjZWxzZQorICBjYWNoZWZsdXNoIChjbGVhcl9sb2NhdGlvbiwgRkZJX1RSQU1QT0xJTkVfU0laRSwgSUNBQ0hFKTsKKyNlbmRpZgorICByZXR1cm4gRkZJX09LOworfQorCisvKgorICogRGVjb2RlcyB0aGUgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgc3RvcmVkIG9uIHRoZQorICogc3RhY2suIEFSIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVnZXIgYXJndW1lbnRzCisgKiAoYW5kLCBkZXBlbmRpbmcgdXBvbiB0aGUgYXJndW1lbnRzLCBzb21lIGZsb2F0aW5nLXBvaW50IGFyZ3VtZW50cworICogYXMgd2VsbCkuIEZQUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGFyZWEgd2hlcmUgZmxvYXRpbmcgcG9pbnQKKyAqIHJlZ2lzdGVycyBoYXZlIGJlZW4gc2F2ZWQsIGlmIGFueS4KKyAqCisgKiBSVkFMVUUgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgd2lsbCBiZQorICogc3RvcmVkLiBDTE9TVVJFIGlzIHRoZSBwcmVwYXJlZCBjbG9zdXJlIHRvIGludm9rZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGFzc2VtYmx5LCB3aGljaCBpcyBpbgorICogdHVybiBjYWxsZWQgZnJvbSBhIHRyYW1wb2xpbmUuCisgKgorICogUmV0dXJucyB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUuCisgKgorICogQmFzZWQgb24gdGhlIHNpbWlsYXIgcm91dGluZSBmb3Igc3BhcmMuCisgKi8KK2ludAorZmZpX2Nsb3N1cmVfbWlwc19pbm5lcl9PMzIgKGZmaV9jbG9zdXJlICpjbG9zdXJlLAorCQkJICAgIHZvaWQgKnJ2YWx1ZSwgZmZpX2FyZyAqYXIsCisJCQkgICAgZG91YmxlICpmcHIpCit7CisgIGZmaV9jaWYgKmNpZjsKKyAgdm9pZCAqKmF2YWx1ZXA7CisgIGZmaV9hcmcgKmF2YWx1ZTsKKyAgZmZpX3R5cGUgKiphcmdfdHlwZXM7CisgIGludCBpLCBhdm4sIGFyZ24sIHNlZW5faW50OworCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgYXZhbHVlID0gYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mIChmZmlfYXJnKSk7CisgIGF2YWx1ZXAgPSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKGZmaV9hcmcpKTsKKworICBzZWVuX2ludCA9IChjaWYtPmFiaSA9PSBGRklfTzMyX1NPRlRfRkxPQVQpOworICBhcmduID0gMDsKKworICBpZiAoKGNpZi0+ZmxhZ3MgPj4gKEZGSV9GTEFHX0JJVFMgKiAyKSkgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHsKKyAgICAgIHJ2YWx1ZSA9ICh2b2lkICopKFVJTlQzMilhclswXTsKKyAgICAgIGFyZ24gPSAxOworICAgIH0KKworICBpID0gMDsKKyAgYXZuID0gY2lmLT5uYXJnczsKKyAgYXJnX3R5cGVzID0gY2lmLT5hcmdfdHlwZXM7CisKKyAgd2hpbGUgKGkgPCBhdm4pCisgICAgeworICAgICAgaWYgKGkgPCAyICYmICFzZWVuX2ludCAmJgorCSAgKGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVCB8fAorCSAgIGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUgfHwKKwkgICBhcmdfdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkpCisJeworI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfTUlQU0VCKQorCSAgaWYgKGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVCkKKwkgICAgYXZhbHVlcFtpXSA9ICgoY2hhciAqKSAmZnByW2ldKSArIHNpemVvZiAoZmxvYXQpOworCSAgZWxzZQorI2VuZGlmCisJICAgIGF2YWx1ZXBbaV0gPSAoY2hhciAqKSAmZnByW2ldOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoYXJnX3R5cGVzW2ldLT5hbGlnbm1lbnQgPT0gOCAmJiAoYXJnbiAmIDB4MSkpCisJICAgIGFyZ24rKzsKKwkgIHN3aXRjaCAoYXJnX3R5cGVzW2ldLT50eXBlKQorCSAgICB7CisJICAgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkJYXZhbHVlcFtpXSA9ICZhdmFsdWVbaV07CisJCSooU0lOVDggKikgJmF2YWx1ZVtpXSA9IChTSU5UOCkgYXJbYXJnbl07CisJCWJyZWFrOworCisJICAgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkJYXZhbHVlcFtpXSA9ICZhdmFsdWVbaV07CisJCSooVUlOVDggKikgJmF2YWx1ZVtpXSA9IChVSU5UOCkgYXJbYXJnbl07CisJCWJyZWFrOworCQkgIAorCSAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCQlhdmFsdWVwW2ldID0gJmF2YWx1ZVtpXTsKKwkJKihTSU5UMTYgKikgJmF2YWx1ZVtpXSA9IChTSU5UMTYpIGFyW2FyZ25dOworCQlicmVhazsKKwkJICAKKwkgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkJYXZhbHVlcFtpXSA9ICZhdmFsdWVbaV07CisJCSooVUlOVDE2ICopICZhdmFsdWVbaV0gPSAoVUlOVDE2KSBhclthcmduXTsKKwkJYnJlYWs7CisKKwkgICAgICBkZWZhdWx0OgorCQlhdmFsdWVwW2ldID0gKGNoYXIgKikgJmFyW2FyZ25dOworCQlicmVhazsKKwkgICAgfQorCSAgc2Vlbl9pbnQgPSAxOworCX0KKyAgICAgIGFyZ24gKz0gQUxJR04oYXJnX3R5cGVzW2ldLT5zaXplLCBGRklfU0laRU9GX0FSRykgLyBGRklfU0laRU9GX0FSRzsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgLyogSW52b2tlIHRoZSBjbG9zdXJlLiAqLworICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCBydmFsdWUsIGF2YWx1ZXAsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgaWYgKGNpZi0+YWJpID09IEZGSV9PMzJfU09GVF9GTE9BVCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKyAgICAgICAgICByZXR1cm4gRkZJX1RZUEVfSU5UOworICAgICAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gRkZJX1RZUEVfVUlOVDY0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBjaWYtPnJ0eXBlLT50eXBlOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIGNpZi0+cnR5cGUtPnR5cGU7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChGRklfTUlQU19OMzIpCisKK3N0YXRpYyB2b2lkCitjb3B5X3N0cnVjdF9OMzIoY2hhciAqdGFyZ2V0LCB1bnNpZ25lZCBvZmZzZXQsIGZmaV9hYmkgYWJpLCBmZmlfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICBpbnQgYXJnbiwgdW5zaWduZWQgYXJnX29mZnNldCwgZmZpX2FyZyAqYXIsCisgICAgICAgICAgICAgICAgZmZpX2FyZyAqZnByLCBpbnQgc29mdF9mbG9hdCkKK3sKKyAgZmZpX3R5cGUgKiplbHRfdHlwZXAgPSB0eXBlLT5lbGVtZW50czsKKyAgd2hpbGUoKmVsdF90eXBlcCkKKyAgICB7CisgICAgICBmZmlfdHlwZSAqZWx0X3R5cGUgPSAqZWx0X3R5cGVwOworICAgICAgdW5zaWduZWQgbzsKKyAgICAgIGNoYXIgKnRwOworICAgICAgY2hhciAqYXJncDsKKyAgICAgIGNoYXIgKmZwcDsKKworICAgICAgbyA9IEFMSUdOKG9mZnNldCwgZWx0X3R5cGUtPmFsaWdubWVudCk7CisgICAgICBhcmdfb2Zmc2V0ICs9IG8gLSBvZmZzZXQ7CisgICAgICBvZmZzZXQgPSBvOworICAgICAgYXJnbiArPSBhcmdfb2Zmc2V0IC8gc2l6ZW9mKGZmaV9hcmcpOworICAgICAgYXJnX29mZnNldCA9IGFyZ19vZmZzZXQgJSBzaXplb2YoZmZpX2FyZyk7CisKKyAgICAgIGFyZ3AgPSAoY2hhciAqKShhciArIGFyZ24pOworICAgICAgZnBwID0gKGNoYXIgKikoYXJnbiA+PSA4ID8gYXIgKyBhcmduIDogZnByICsgYXJnbik7CisKKyAgICAgIHRwID0gdGFyZ2V0ICsgb2Zmc2V0OworCisgICAgICBpZiAoZWx0X3R5cGUtPnR5cGUgPT0gRkZJX1RZUEVfRE9VQkxFICYmICFzb2Z0X2Zsb2F0KQorICAgICAgICAqKGRvdWJsZSAqKXRwID0gKihkb3VibGUgKilmcHA7CisgICAgICBlbHNlCisgICAgICAgIG1lbWNweSh0cCwgYXJncCArIGFyZ19vZmZzZXQsIGVsdF90eXBlLT5zaXplKTsKKworICAgICAgb2Zmc2V0ICs9IGVsdF90eXBlLT5zaXplOworICAgICAgYXJnX29mZnNldCArPSBlbHRfdHlwZS0+c2l6ZTsKKyAgICAgIGVsdF90eXBlcCsrOworICAgICAgYXJnbiArPSBhcmdfb2Zmc2V0IC8gc2l6ZW9mKGZmaV9hcmcpOworICAgICAgYXJnX29mZnNldCA9IGFyZ19vZmZzZXQgJSBzaXplb2YoZmZpX2FyZyk7CisgICAgfQorfQorCisvKgorICogRGVjb2RlcyB0aGUgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgc3RvcmVkIG9uIHRoZQorICogc3RhY2suIEFSIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVnZXIKKyAqIGFyZ3VtZW50cy4gRlBSIGlzIGEgcG9pbnRlciB0byB0aGUgYXJlYSB3aGVyZSBmbG9hdGluZyBwb2ludAorICogcmVnaXN0ZXJzIGhhdmUgYmVlbiBzYXZlZC4KKyAqCisgKiBSVkFMVUUgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgd2lsbCBiZQorICogc3RvcmVkLiBDTE9TVVJFIGlzIHRoZSBwcmVwYXJlZCBjbG9zdXJlIHRvIGludm9rZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGFzc2VtYmx5LCB3aGljaCBpcyBpbgorICogdHVybiBjYWxsZWQgZnJvbSBhIHRyYW1wb2xpbmUuCisgKgorICogUmV0dXJucyB0aGUgZnVuY3Rpb24gcmV0dXJuIGZsYWdzLgorICoKKyAqLworaW50CitmZmlfY2xvc3VyZV9taXBzX2lubmVyX04zMiAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsCisJCQkgICAgdm9pZCAqcnZhbHVlLCBmZmlfYXJnICphciwKKwkJCSAgICBmZmlfYXJnICpmcHIpCit7CisgIGZmaV9jaWYgKmNpZjsKKyAgdm9pZCAqKmF2YWx1ZXA7CisgIGZmaV9hcmcgKmF2YWx1ZTsKKyAgZmZpX3R5cGUgKiphcmdfdHlwZXM7CisgIGludCBpLCBhdm4sIGFyZ247CisgIGludCBzb2Z0X2Zsb2F0OworICBmZmlfYXJnICphcmdwOworCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgc29mdF9mbG9hdCA9IGNpZi0+YWJpID09IEZGSV9ONjRfU09GVF9GTE9BVAorICAgIHx8IGNpZi0+YWJpID09IEZGSV9OMzJfU09GVF9GTE9BVDsKKyAgYXZhbHVlID0gYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mIChmZmlfYXJnKSk7CisgIGF2YWx1ZXAgPSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKGZmaV9hcmcpKTsKKworICBhcmduID0gMDsKKworICBpZiAoY2lmLT5yc3RydWN0X2ZsYWcpCisgICAgeworI2lmIF9NSVBTX1NJTT09X0FCSU4zMgorICAgICAgcnZhbHVlID0gKHZvaWQgKikoVUlOVDMyKWFyWzBdOworI2Vsc2UgLyogTjY0ICovCisgICAgICBydmFsdWUgPSAodm9pZCAqKWFyWzBdOworI2VuZGlmCisgICAgICBhcmduID0gMTsKKyAgICB9CisKKyAgaSA9IDA7CisgIGF2biA9IGNpZi0+bmFyZ3M7CisgIGFyZ190eXBlcyA9IGNpZi0+YXJnX3R5cGVzOworCisgIHdoaWxlIChpIDwgYXZuKQorICAgIHsKKyAgICAgIGlmIChhcmdfdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQKKwkgIHx8IGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUKKwkgIHx8IGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFKQorICAgICAgICB7CisgICAgICAgICAgYXJncCA9IChhcmduID49IDggfHwgc29mdF9mbG9hdCkgPyBhciArIGFyZ24gOiBmcHIgKyBhcmduOworICAgICAgICAgIGlmICgoYXJnX3R5cGVzW2ldLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpICYmICgodW5zaWduZWQpYXJncCAmIChhcmdfdHlwZXNbaV0tPmFsaWdubWVudC0xKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFyZ3A9KGZmaV9hcmcqKUFMSUdOKGFyZ3AsYXJnX3R5cGVzW2ldLT5hbGlnbm1lbnQpOworICAgICAgICAgICAgICBhcmduKys7CisgICAgICAgICAgICB9CisjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9NSVBTRUIpCisgICAgICAgICAgaWYgKGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVCAmJiBhcmduIDwgOCkKKyAgICAgICAgICAgIGF2YWx1ZXBbaV0gPSAoKGNoYXIgKikgYXJncCkgKyBzaXplb2YgKGZsb2F0KTsKKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIGF2YWx1ZXBbaV0gPSAoY2hhciAqKSBhcmdwOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCB0eXBlID0gYXJnX3R5cGVzW2ldLT50eXBlOworCisgICAgICAgICAgaWYgKGFyZ190eXBlc1tpXS0+YWxpZ25tZW50ID4gc2l6ZW9mKGZmaV9hcmcpKQorICAgICAgICAgICAgYXJnbiA9IEFMSUdOKGFyZ24sIGFyZ190eXBlc1tpXS0+YWxpZ25tZW50IC8gc2l6ZW9mKGZmaV9hcmcpKTsKKworICAgICAgICAgIGFyZ3AgPSBhciArIGFyZ247CisKKyAgICAgICAgICAvKiBUaGUgc2l6ZSBvZiBhIHBvaW50ZXIgZGVwZW5kcyBvbiB0aGUgQUJJICovCisgICAgICAgICAgaWYgKHR5cGUgPT0gRkZJX1RZUEVfUE9JTlRFUikKKyAgICAgICAgICAgIHR5cGUgPSAoY2lmLT5hYmkgPT0gRkZJX042NCB8fCBjaWYtPmFiaSA9PSBGRklfTjY0X1NPRlRfRkxPQVQpCisJICAgICAgPyBGRklfVFlQRV9TSU5UNjQgOiBGRklfVFlQRV9TSU5UMzI7CisKKwkgIGlmIChzb2Z0X2Zsb2F0ICYmIHR5cGUgPT0gIEZGSV9UWVBFX0ZMT0FUKQorCSAgICB0eXBlID0gRkZJX1RZUEVfVUlOVDMyOworCisgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKyAgICAgICAgICAgICAgYXZhbHVlcFtpXSA9ICZhdmFsdWVbaV07CisgICAgICAgICAgICAgICooU0lOVDggKikgJmF2YWx1ZVtpXSA9IChTSU5UOCkgKmFyZ3A7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgICBhdmFsdWVwW2ldID0gJmF2YWx1ZVtpXTsKKyAgICAgICAgICAgICAgKihVSU5UOCAqKSAmYXZhbHVlW2ldID0gKFVJTlQ4KSAqYXJncDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgICAgICAgICAgICBhdmFsdWVwW2ldID0gJmF2YWx1ZVtpXTsKKyAgICAgICAgICAgICAgKihTSU5UMTYgKikgJmF2YWx1ZVtpXSA9IChTSU5UMTYpICphcmdwOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICAgIGF2YWx1ZXBbaV0gPSAmYXZhbHVlW2ldOworICAgICAgICAgICAgICAqKFVJTlQxNiAqKSAmYXZhbHVlW2ldID0gKFVJTlQxNikgKmFyZ3A7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKyAgICAgICAgICAgICAgYXZhbHVlcFtpXSA9ICZhdmFsdWVbaV07CisgICAgICAgICAgICAgICooU0lOVDMyICopICZhdmFsdWVbaV0gPSAoU0lOVDMyKSAqYXJncDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgICBhdmFsdWVwW2ldID0gJmF2YWx1ZVtpXTsKKyAgICAgICAgICAgICAgKihVSU5UMzIgKikgJmF2YWx1ZVtpXSA9IChVSU5UMzIpICphcmdwOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICAgICAgICAgIGlmIChhcmduIDwgOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHN0cnVjdCBhcyBhdCBsZWFzdCBwYXJ0IG9mCisgICAgICAgICAgICAgICAgICAgICBpdCB3YXMgcGFzc2VkIGluIHJlZ2lzdGVycy4gICovCisgICAgICAgICAgICAgICAgICBhdmFsdWVwW2ldID0gYWxsb2NhKGFyZ190eXBlc1tpXS0+c2l6ZSk7CisgICAgICAgICAgICAgICAgICBjb3B5X3N0cnVjdF9OMzIoYXZhbHVlcFtpXSwgMCwgY2lmLT5hYmksIGFyZ190eXBlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmduLCAwLCBhciwgZnByLCBzb2Z0X2Zsb2F0KTsKKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBFbHNlIGZhbGwgdGhyb3VnaC4gICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBhdmFsdWVwW2ldID0gKGNoYXIgKikgYXJncDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGFyZ24gKz0gQUxJR04oYXJnX3R5cGVzW2ldLT5zaXplLCBzaXplb2YoZmZpX2FyZykpIC8gc2l6ZW9mKGZmaV9hcmcpOworICAgICAgaSsrOworICAgIH0KKworICAvKiBJbnZva2UgdGhlIGNsb3N1cmUuICovCisgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJ2YWx1ZSwgYXZhbHVlcCwgY2xvc3VyZS0+dXNlcl9kYXRhKTsKKworICByZXR1cm4gY2lmLT5mbGFncyA+PiAoRkZJX0ZMQUdfQklUUyAqIDgpOworfQorCisjZW5kaWYgLyogRkZJX01JUFNfTjMyICovCisKKyNlbmRpZiAvKiBGRklfQ0xPU1VSRVMgKi8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbWlwcy9mZml0YXJnZXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbWlwcy9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdhZGJmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9taXBzL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsMjQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBNSVBTLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICisjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAorCisjaWZkZWYgbGludXgKKyMgaW5jbHVkZSA8YXNtL3NnaWRlZnMuaD4KKyNlbGlmIGRlZmluZWQoX19ydGVtc19fKQorLyoKKyAqIFN1YnByb2dyYW0gY2FsbGluZyBjb252ZW50aW9uIC0gY29waWVkIGZyb20gc2dpZGVmcy5oCisgKi8KKyNkZWZpbmUgX01JUFNfU0lNX0FCSTMyCQkxCisjZGVmaW5lIF9NSVBTX1NJTV9OQUJJMzIJMgorI2RlZmluZSBfTUlQU19TSU1fQUJJNjQJCTMKKyNlbGlmICFkZWZpbmVkKF9fT3BlbkJTRF9fKQorIyBpbmNsdWRlIDxzZ2lkZWZzLmg+CisjZW5kaWYKKworIyAgaWZuZGVmIF9BQklOMzIKKyMgICAgZGVmaW5lIF9BQklOMzIgX01JUFNfU0lNX05BQkkzMgorIyAgZW5kaWYKKyMgIGlmbmRlZiBfQUJJNjQKKyMgICAgZGVmaW5lIF9BQkk2NCBfTUlQU19TSU1fQUJJNjQKKyMgIGVuZGlmCisjICBpZm5kZWYgX0FCSU8zMgorIyAgICBkZWZpbmUgX0FCSU8zMiBfTUlQU19TSU1fQUJJMzIKKyMgIGVuZGlmCisKKyNpZiAhZGVmaW5lZChfTUlQU19TSU0pCisjIGVycm9yIC0tIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nIC0tCisjZWxzZQorIyAgaWYgKF9NSVBTX1NJTT09X0FCSU4zMiAmJiBkZWZpbmVkKF9BQklOMzIpKSB8fCAoX01JUFNfU0lNPT1fQUJJNjQgJiYgZGVmaW5lZChfQUJJNjQpKQorIyAgICBkZWZpbmUgRkZJX01JUFNfTjMyCisjICBlbHNlCisjICAgIGlmIChfTUlQU19TSU09PV9BQklPMzIgJiYgZGVmaW5lZChfQUJJTzMyKSkKKyMgICAgICBkZWZpbmUgRkZJX01JUFNfTzMyCisjICAgIGVsc2UKKyMgICAgIGVycm9yIC0tIHRoaXMgaXMgYW4gdW5zdXBwb3J0ZWQgcGxhdGZvcm0gLS0KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEZGSV9NSVBTX08zMgorLyogTzMyIHN0YWNrIGZyYW1lcyBoYXZlIDMyYml0IGludGVnZXIgYXJncyAqLworIyAgZGVmaW5lIEZGSV9TSVpFT0ZfQVJHICAgIDQKKyNlbHNlCisvKiBOMzIgYW5kIE42NCBmcmFtZXMgaGF2ZSA2NGJpdCBpbnRlZ2VyIGFyZ3MgKi8KKyMgIGRlZmluZSBGRklfU0laRU9GX0FSRyAgICA4CisjICBpZiBfTUlQU19TSU0gPT0gX0FCSU4zMgorIyAgICBkZWZpbmUgRkZJX1NJWkVPRl9KQVZBX1JBVyAgNAorIyAgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEZGSV9GTEFHX0JJVFMgMgorCisvKiBTR0kncyBzdHJhbmdlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHdlIG11bHRpcGx5IGJ5IDQgcmF0aGVyIAorICAgdGhhbiBzaGlmdCBsZWZ0IGJ5IEZGSV9GTEFHX0JJVFMgKi8KKworI2RlZmluZSBGRklfQVJHU19EICAgRkZJX1RZUEVfRE9VQkxFCisjZGVmaW5lIEZGSV9BUkdTX0YgICBGRklfVFlQRV9GTE9BVAorI2RlZmluZSBGRklfQVJHU19ERCAgRkZJX1RZUEVfRE9VQkxFICogNCArIEZGSV9UWVBFX0RPVUJMRQorI2RlZmluZSBGRklfQVJHU19GRiAgRkZJX1RZUEVfRkxPQVQgKiA0ICsgIEZGSV9UWVBFX0ZMT0FUCisjZGVmaW5lIEZGSV9BUkdTX0ZEICBGRklfVFlQRV9ET1VCTEUgKiA0ICsgRkZJX1RZUEVfRkxPQVQKKyNkZWZpbmUgRkZJX0FSR1NfREYgIEZGSV9UWVBFX0ZMT0FUICogNCArIEZGSV9UWVBFX0RPVUJMRQorCisvKiBOZWVkZWQgZm9yIE4zMiBzdHJ1Y3R1cmUgcmV0dXJucyAqLworI2RlZmluZSBGRklfVFlQRV9TTUFMTFNUUlVDVCAgRkZJX1RZUEVfVUlOVDgKKyNkZWZpbmUgRkZJX1RZUEVfU01BTExTVFJVQ1QyIEZGSV9UWVBFX1NJTlQ4CisKKyNpZiAwCisvKiBUaGUgU0dJIGFzc2VtYmxlciBjYW4ndCBoYW5kbGUgdGhpcy4uICovCisjZGVmaW5lIEZGSV9UWVBFX1NUUlVDVF9ERCAoKCBGRklfQVJHU19ERCApIDw8IDQpICsgRkZJX1RZUEVfU1RSVUNUCisvKiAoYW5kIHNvIG9uKSAqLworI2Vsc2UKKy8qIC4uLnNvIHdlIGNhbGN1bGF0ZSB0aGVzZSBieSBoYW5kISAqLworI2RlZmluZSBGRklfVFlQRV9TVFJVQ1RfRCAgICAgIDYxCisjZGVmaW5lIEZGSV9UWVBFX1NUUlVDVF9GICAgICAgNDUKKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX0REICAgICAyNTMKKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX0ZGICAgICAxNzMKKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX0ZEICAgICAyMzcKKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX0RGICAgICAxODkKKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX1NNQUxMICA5MworI2RlZmluZSBGRklfVFlQRV9TVFJVQ1RfU01BTEwyIDEwOQorCisvKiBhbmQgZm9yIG4zMiBzb2Z0IGZsb2F0LCBhZGQgMTYgKiAyXjQgKi8KKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX0RfU09GVCAgICAgIDMxNworI2RlZmluZSBGRklfVFlQRV9TVFJVQ1RfRl9TT0ZUICAgICAgMzAxCisjZGVmaW5lIEZGSV9UWVBFX1NUUlVDVF9ERF9TT0ZUICAgICA1MDkKKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX0ZGX1NPRlQgICAgIDQyOQorI2RlZmluZSBGRklfVFlQRV9TVFJVQ1RfRkRfU09GVCAgICAgNDkzCisjZGVmaW5lIEZGSV9UWVBFX1NUUlVDVF9ERl9TT0ZUICAgICA0NDUKKyNkZWZpbmUgRkZJX1RZUEVfU1RSVUNUX1NPRlQgICAgICAgIDE2CisjZW5kaWYKKworI2lmZGVmIExJQkZGSV9BU00KKyNkZWZpbmUgdjAgJDIKKyNkZWZpbmUgdjEgJDMKKyNkZWZpbmUgYTAgJDQKKyNkZWZpbmUgYTEgJDUKKyNkZWZpbmUgYTIgJDYKKyNkZWZpbmUgYTMgJDcKKyNkZWZpbmUgYTQgJDgJCQorI2RlZmluZSBhNSAkOQkJCisjZGVmaW5lIGE2ICQxMAkJCisjZGVmaW5lIGE3ICQxMQkJCisjZGVmaW5lIHQwICQ4CisjZGVmaW5lIHQxICQ5CisjZGVmaW5lIHQyICQxMAorI2RlZmluZSB0MyAkMTEKKyNkZWZpbmUgdDQgJDEyCQkKKyNkZWZpbmUgdDUgJDEzCisjZGVmaW5lIHQ2ICQxNAkKKyNkZWZpbmUgdDcgJDE1CisjZGVmaW5lIHQ4ICQyNAorI2RlZmluZSB0OSAkMjUKKyNkZWZpbmUgcmEgJDMxCQkKKworI2lmZGVmIEZGSV9NSVBTX08zMgorIyBkZWZpbmUgUkVHX0wJbHcKKyMgZGVmaW5lIFJFR19TCXN3CisjIGRlZmluZSBTVUJVCXN1YnUKKyMgZGVmaW5lIEFERFUJYWRkdQorIyBkZWZpbmUgU1JMCXNybAorIyBkZWZpbmUgTEkJbGkKKyNlbHNlIC8qICFGRklfTUlQU19PMzIgKi8KKyMgZGVmaW5lIFJFR19MCWxkCisjIGRlZmluZSBSRUdfUwlzZAorIyBkZWZpbmUgU1VCVQlkc3VidQorIyBkZWZpbmUgQUREVQlkYWRkdQorIyBkZWZpbmUgU1JMCWRzcmwKKyMgZGVmaW5lIExJIAlkbGkKKyMgaWYgKF9NSVBTX1NJTT09X0FCSTY0KQorIyAgZGVmaW5lIExBIGRsYQorIyAgZGVmaW5lIEVIX0ZSQU1FX0FMSUdOIDMKKyMgIGRlZmluZSBGREVfQUREUl9CWVRFUyAuOGJ5dGUKKyMgZWxzZQorIyAgZGVmaW5lIExBIGxhCisjICBkZWZpbmUgRUhfRlJBTUVfQUxJR04gMgorIyAgZGVmaW5lIEZERV9BRERSX0JZVEVTIC40Ynl0ZQorIyBlbmRpZiAvKiBfTUlQU19TSU09PV9BQkk2NCAqLworI2VuZGlmIC8qICFGRklfTUlQU19PMzIgKi8KKyNlbHNlIC8qICFMSUJGRklfQVNNICovCisjIGlmZGVmIF9fR05VQ19fCisjICBpZmRlZiBGRklfTUlQU19PMzIKKy8qIE8zMiBzdGFjayBmcmFtZXMgaGF2ZSAzMmJpdCBpbnRlZ2VyIGFyZ3MgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBmZmlfYXJnIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKK3R5cGVkZWYgc2lnbmVkICAgaW50ICAgICBmZmlfc2FyZyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CisjZWxzZQorLyogTjMyIGFuZCBONjQgZnJhbWVzIGhhdmUgNjRiaXQgaW50ZWdlciBhcmdzICovCit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgZmZpX2FyZyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSk7Cit0eXBlZGVmIHNpZ25lZCAgIGludCAgICAgZmZpX3NhcmcgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpOworIyAgZW5kaWYKKyMgZWxzZQorIyAgaWZkZWYgRkZJX01JUFNfTzMyCisvKiBPMzIgc3RhY2sgZnJhbWVzIGhhdmUgMzJiaXQgaW50ZWdlciBhcmdzICovCit0eXBlZGVmIF9fdWludDMyX3QgZmZpX2FyZzsKK3R5cGVkZWYgX19pbnQzMl90IGZmaV9zYXJnOworIyAgZWxzZQorLyogTjMyIGFuZCBONjQgZnJhbWVzIGhhdmUgNjRiaXQgaW50ZWdlciBhcmdzICovCit0eXBlZGVmIF9fdWludDY0X3QgZmZpX2FyZzsKK3R5cGVkZWYgX19pbnQ2NF90IGZmaV9zYXJnOworIyAgZW5kaWYKKyMgZW5kaWYgLyogX19HTlVDX18gKi8KKwordHlwZWRlZiBlbnVtIGZmaV9hYmkgeworICBGRklfRklSU1RfQUJJID0gMCwKKyAgRkZJX08zMiwKKyAgRkZJX04zMiwKKyAgRkZJX042NCwKKyAgRkZJX08zMl9TT0ZUX0ZMT0FULAorICBGRklfTjMyX1NPRlRfRkxPQVQsCisgIEZGSV9ONjRfU09GVF9GTE9BVCwKKyAgRkZJX0xBU1RfQUJJLAorCisjaWZkZWYgRkZJX01JUFNfTzMyCisjaWZkZWYgX19taXBzX3NvZnRfZmxvYXQKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX08zMl9TT0ZUX0ZMT0FUCisjZWxzZQorICBGRklfREVGQVVMVF9BQkkgPSBGRklfTzMyCisjZW5kaWYKKyNlbHNlCisjIGlmIF9NSVBTX1NJTT09X0FCSTY0CisjICBpZmRlZiBfX21pcHNfc29mdF9mbG9hdAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfTjY0X1NPRlRfRkxPQVQKKyMgIGVsc2UKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX042NAorIyAgZW5kaWYKKyMgZWxzZQorIyAgaWZkZWYgX19taXBzX3NvZnRfZmxvYXQKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX04zMl9TT0ZUX0ZMT0FUCisjICBlbHNlCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9OMzIKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKK30gZmZpX2FiaTsKKworI2RlZmluZSBGRklfRVhUUkFfQ0lGX0ZJRUxEUyB1bnNpZ25lZCByc3RydWN0X2ZsYWcKKyNlbmRpZiAvKiAhTElCRkZJX0FTTSAqLworCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChGRklfTUlQU19PMzIpCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMjAKKyNlbHNlCisvKiBOMzIvTjY0LiAqLworIyBkZWZpbmUgRkZJX0NMT1NVUkVTIDEKKyNpZiBfTUlQU19TSU09PV9BQkk2NAorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDUyCisjZWxzZQorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDIwCisjZW5kaWYKKyNlbmRpZiAvKiBGRklfTUlQU19PMzIgKi8KKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbWlwcy9uMzIuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbWlwcy9uMzIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTIzMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9taXBzL24zMi5TCkBAIC0wLDAgKzEsNTkxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgbjMyLlMgLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTgsIDIwMDUsIDIwMDcsIDIwMDksIDIwMTAgIFJlZCBIYXQsIEluYy4KKyAgIAorICAgTUlQUyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisvKiBPbmx5IGJ1aWxkIHRoaXMgY29kZSBpZiB3ZSBhcmUgY29tcGlsaW5nIGZvciBuMzIgKi8JCisKKyNpZiBkZWZpbmVkKEZGSV9NSVBTX04zMikKKworI2RlZmluZSBjYWxsYmFjayBhMAorI2RlZmluZSBieXRlcwkgYTIKKyNkZWZpbmUgZmxhZ3MJIGEzCisjZGVmaW5lIHJhZGRyICAgIGE0CisjZGVmaW5lIGZuICAgICAgIGE1CisKKyNkZWZpbmUgU0laRU9GX0ZSQU1FCSggOCAqIEZGSV9TSVpFT0ZfQVJHICkKKworI2lmZGVmIF9fR05VQ19fCisJLmFiaWNhbGxzCisjZW5kaWYKKwkudGV4dAorCS5hbGlnbgkyCisJLmdsb2JsCWZmaV9jYWxsX04zMgorCS5lbnQJZmZpX2NhbGxfTjMyCitmZmlfY2FsbF9OMzI6CQorLkxGQjM6CisJLmZyYW1lCSRmcCwgU0laRU9GX0ZSQU1FLCByYQorCS5tYXNrCTB4YzAwMDAwMDAsLUZGSV9TSVpFT0ZfQVJHCisJLmZtYXNrCTB4MDAwMDAwMDAsMAorCisJIyBQcm9sb2d1ZQorCVNVQlUJJHNwLCBTSVpFT0ZfRlJBTUUJCQkjIEZyYW1lIHNpemUKKy5MQ0ZJMDoKKwlSRUdfUwkkZnAsIFNJWkVPRl9GUkFNRSAtIDIqRkZJX1NJWkVPRl9BUkcoJHNwKQkjIFNhdmUgZnJhbWUgcG9pbnRlcgorCVJFR19TCXJhLCBTSVpFT0ZfRlJBTUUgLSAxKkZGSV9TSVpFT0ZfQVJHKCRzcCkJIyBTYXZlIHJldHVybiBhZGRyZXNzCisuTENGSTE6CisJbW92ZQkkZnAsICRzcAorLkxDRkkzOgorCW1vdmUJdDksIGNhbGxiYWNrCSMgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorCVJFR19TCWJ5dGVzLCAyKkZGSV9TSVpFT0ZfQVJHKCRmcCkgIyBieXRlcworCVJFR19TCWZsYWdzLCAzKkZGSV9TSVpFT0ZfQVJHKCRmcCkgIyBmbGFncworCVJFR19TCXJhZGRyLCA0KkZGSV9TSVpFT0ZfQVJHKCRmcCkgIyByYWRkcgorCVJFR19TCWZuLCAgICA1KkZGSV9TSVpFT0ZfQVJHKCRmcCkgIyBmbgorCisJIyBBbGxvY2F0ZSBhdCBsZWFzdCA0IHdvcmRzIGluIHRoZSBhcmdzdGFjaworCW1vdmUJdjAsIGJ5dGVzCisJYmdlCWJ5dGVzLCA0ICogRkZJX1NJWkVPRl9BUkcsIGJpZ2dlcgkKKwlMSQl2MCwgNCAqIEZGSV9TSVpFT0ZfQVJHCisJYglzaXh0ZWVuCisKKwliaWdnZXI6CQorCUFERFUJdDQsIHYwLCAyICogRkZJX1NJWkVPRl9BUkcgLTEJIyBtYWtlIHN1cmUgaXQgaXMgYWxpZ25lZCAKKwlhbmQJdjAsIHQ0LCAtMiAqIEZGSV9TSVpFT0ZfQVJHCQkjIHRvIGEgcHJvcGVyIGJvdW5kcnkuCisKK3NpeHRlZW46CisJU1VCVQkkc3AsICRzcCwgdjAJIyBtb3ZlIHRoZSBzdGFjayBwb2ludGVyIHRvIHJlZmxlY3QgdGhlCisJCQkJIyBhcmcgc3BhY2UKKworCW1vdmUJYTAsICRzcCAgICAgICAgICMgNCAqIEZGSV9TSVpFT0ZfQVJHCisJQUREVQlhMywgJGZwLCAzICogRkZJX1NJWkVPRl9BUkcKKworCSMgQ2FsbCBmZmlfcHJlcF9hcmdzCisJamFsCXQ5CisJCisJIyBDb3B5IHRoZSBzdGFjayBwb2ludGVyIHRvIHQ5CisJbW92ZQl0OSwgJHNwCisJCisJIyBGaXggdGhlIHN0YWNrIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gOCA2NGJpdCBzbG90cyB3b3J0aAorCSMgb2YgYXJndW1lbnRzLgorCisJIyBMb2FkIHRoZSBudW1iZXIgb2YgYnl0ZXMKKwlSRUdfTAl0NiwgMipGRklfU0laRU9GX0FSRygkZnApCisKKwkjIElzIGl0IGJpZ2dlciB0aGFuIDggKiBGRklfU0laRU9GX0FSRz8KKwlkYWRkaXUJdDgsIHQ2LCAtKDggKiBGRklfU0laRU9GX0FSRykKKwlibHR6CXQ4LCBsb2FkcmVncworCisJQUREVQl0OSwgdDksIHQ4CisJCitsb2FkcmVnczoJCisKKwlSRUdfTAl0NiwgMypGRklfU0laRU9GX0FSRygkZnApICAjIGxvYWQgdGhlIGZsYWdzIHdvcmQgaW50byB0Ni4KKworCWFuZAl0NCwgdDYsICgoMTw8RkZJX0ZMQUdfQklUUyktMSkKKwlibmV6CXQ0LCBhcmcxX2Zsb2F0cAorCVJFR19MCWEwLCAwKkZGSV9TSVpFT0ZfQVJHKHQ5KQorCWIJYXJnMV9uZXh0CithcmcxX2Zsb2F0cDoJCisJYm5lCXQ0LCBGRklfVFlQRV9GTE9BVCwgYXJnMV9kb3VibGVwCisJbC5zCSRmMTIsIDAqRkZJX1NJWkVPRl9BUkcodDkpCisJYglhcmcxX25leHQKK2FyZzFfZG91YmxlcDoJCisJbC5kCSRmMTIsIDAqRkZJX1NJWkVPRl9BUkcodDkpCithcmcxX25leHQ6CQorCQorCVNSTAl0NCwgdDYsIDEqRkZJX0ZMQUdfQklUUworCWFuZAl0NCwgKCgxPDxGRklfRkxBR19CSVRTKS0xKQorCWJuZXoJdDQsIGFyZzJfZmxvYXRwCisJUkVHX0wJYTEsIDEqRkZJX1NJWkVPRl9BUkcodDkpCisJYglhcmcyX25leHQKK2FyZzJfZmxvYXRwOgorCWJuZQl0NCwgRkZJX1RZUEVfRkxPQVQsIGFyZzJfZG91YmxlcAorCWwucwkkZjEzLCAxKkZGSV9TSVpFT0ZfQVJHKHQ5KQkKKwliCWFyZzJfbmV4dAorYXJnMl9kb3VibGVwOgkKKwlsLmQJJGYxMywgMSpGRklfU0laRU9GX0FSRyh0OSkJCithcmcyX25leHQ6CQorCQorCVNSTAl0NCwgdDYsIDIqRkZJX0ZMQUdfQklUUworCWFuZAl0NCwgKCgxPDxGRklfRkxBR19CSVRTKS0xKQorCWJuZXoJdDQsIGFyZzNfZmxvYXRwCisJUkVHX0wJYTIsIDIqRkZJX1NJWkVPRl9BUkcodDkpCisJYglhcmczX25leHQKK2FyZzNfZmxvYXRwOgorCWJuZQl0NCwgRkZJX1RZUEVfRkxPQVQsIGFyZzNfZG91YmxlcAorCWwucwkkZjE0LCAyKkZGSV9TSVpFT0ZfQVJHKHQ5KQkKKwliCWFyZzNfbmV4dAorYXJnM19kb3VibGVwOgkKKwlsLmQJJGYxNCwgMipGRklfU0laRU9GX0FSRyh0OSkJCithcmczX25leHQ6CQorCQorCVNSTAl0NCwgdDYsIDMqRkZJX0ZMQUdfQklUUworCWFuZAl0NCwgKCgxPDxGRklfRkxBR19CSVRTKS0xKQorCWJuZXoJdDQsIGFyZzRfZmxvYXRwCisJUkVHX0wJYTMsIDMqRkZJX1NJWkVPRl9BUkcodDkpCisJYglhcmc0X25leHQKK2FyZzRfZmxvYXRwOgorCWJuZQl0NCwgRkZJX1RZUEVfRkxPQVQsIGFyZzRfZG91YmxlcAorCWwucwkkZjE1LCAzKkZGSV9TSVpFT0ZfQVJHKHQ5KQkKKwliCWFyZzRfbmV4dAorYXJnNF9kb3VibGVwOgkKKwlsLmQJJGYxNSwgMypGRklfU0laRU9GX0FSRyh0OSkJCithcmc0X25leHQ6CQorCQorCVNSTAl0NCwgdDYsIDQqRkZJX0ZMQUdfQklUUworCWFuZAl0NCwgKCgxPDxGRklfRkxBR19CSVRTKS0xKQorCWJuZXoJdDQsIGFyZzVfZmxvYXRwCisJUkVHX0wJYTQsIDQqRkZJX1NJWkVPRl9BUkcodDkpCisJYglhcmc1X25leHQKK2FyZzVfZmxvYXRwOgorCWJuZQl0NCwgRkZJX1RZUEVfRkxPQVQsIGFyZzVfZG91YmxlcAorCWwucwkkZjE2LCA0KkZGSV9TSVpFT0ZfQVJHKHQ5KQkKKwliCWFyZzVfbmV4dAorYXJnNV9kb3VibGVwOgkKKwlsLmQJJGYxNiwgNCpGRklfU0laRU9GX0FSRyh0OSkJCithcmc1X25leHQ6CQorCQorCVNSTAl0NCwgdDYsIDUqRkZJX0ZMQUdfQklUUworCWFuZAl0NCwgKCgxPDxGRklfRkxBR19CSVRTKS0xKQorCWJuZXoJdDQsIGFyZzZfZmxvYXRwCisJUkVHX0wJYTUsIDUqRkZJX1NJWkVPRl9BUkcodDkpCisJYglhcmc2X25leHQKK2FyZzZfZmxvYXRwOgorCWJuZQl0NCwgRkZJX1RZUEVfRkxPQVQsIGFyZzZfZG91YmxlcAorCWwucwkkZjE3LCA1KkZGSV9TSVpFT0ZfQVJHKHQ5KQkKKwliCWFyZzZfbmV4dAorYXJnNl9kb3VibGVwOgkKKwlsLmQJJGYxNywgNSpGRklfU0laRU9GX0FSRyh0OSkJCithcmc2X25leHQ6CQorCQorCVNSTAl0NCwgdDYsIDYqRkZJX0ZMQUdfQklUUworCWFuZAl0NCwgKCgxPDxGRklfRkxBR19CSVRTKS0xKQorCWJuZXoJdDQsIGFyZzdfZmxvYXRwCisJUkVHX0wJYTYsIDYqRkZJX1NJWkVPRl9BUkcodDkpCisJYglhcmc3X25leHQKK2FyZzdfZmxvYXRwOgorCWJuZQl0NCwgRkZJX1RZUEVfRkxPQVQsIGFyZzdfZG91YmxlcAorCWwucwkkZjE4LCA2KkZGSV9TSVpFT0ZfQVJHKHQ5KQkKKwliCWFyZzdfbmV4dAorYXJnN19kb3VibGVwOgkKKwlsLmQJJGYxOCwgNipGRklfU0laRU9GX0FSRyh0OSkJCithcmc3X25leHQ6CQorCQorCVNSTAl0NCwgdDYsIDcqRkZJX0ZMQUdfQklUUworCWFuZAl0NCwgKCgxPDxGRklfRkxBR19CSVRTKS0xKQorCWJuZXoJdDQsIGFyZzhfZmxvYXRwCisJUkVHX0wJYTcsIDcqRkZJX1NJWkVPRl9BUkcodDkpCisJYglhcmc4X25leHQKK2FyZzhfZmxvYXRwOgorCWJuZQl0NCwgRkZJX1RZUEVfRkxPQVQsIGFyZzhfZG91YmxlcAorIAlsLnMJJGYxOSwgNypGRklfU0laRU9GX0FSRyh0OSkJCisJYglhcmc4X25leHQKK2FyZzhfZG91YmxlcDoJCisgCWwuZAkkZjE5LCA3KkZGSV9TSVpFT0ZfQVJHKHQ5KQkKK2FyZzhfbmV4dDoJCisKK2NhbGxpdDoJCQorCSMgTG9hZCB0aGUgZnVuY3Rpb24gcG9pbnRlcgorCVJFR19MCXQ5LCA1KkZGSV9TSVpFT0ZfQVJHKCRmcCkKKworCSMgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCisJUkVHX0wJdDUsIDQqRkZJX1NJWkVPRl9BUkcoJGZwKQorCWJlcXoJdDUsIG5vcmV0dmFsCisKKwkjIFNoaWZ0IHRoZSByZXR1cm4gdHlwZSBmbGFnIG92ZXIKKwlTUkwJdDYsIDgqRkZJX0ZMQUdfQklUUworCisJYmVxCXQ2LCBGRklfVFlQRV9TSU5UMzIsIHJldGludAkKKwlibmUgICAgIHQ2LCBGRklfVFlQRV9JTlQsIHJldGZsb2F0CityZXRpbnQ6CisJamFsCXQ5CisJUkVHX0wJdDQsIDQqRkZJX1NJWkVPRl9BUkcoJGZwKQorCVJFR19TCXYwLCAwKHQ0KQorCWIJZXBpbG9ndWUKKworcmV0ZmxvYXQ6CisJYm5lICAgICB0NiwgRkZJX1RZUEVfRkxPQVQsIHJldGRvdWJsZQorCWphbAl0OQorCVJFR19MCXQ0LCA0KkZGSV9TSVpFT0ZfQVJHKCRmcCkKKwlzLnMJJGYwLCAwKHQ0KQorCWIJZXBpbG9ndWUKKworcmV0ZG91YmxlOgkKKwlibmUJdDYsIEZGSV9UWVBFX0RPVUJMRSwgcmV0c3RydWN0X2QKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJcy5kCSRmMCwgMCh0NCkKKwliCWVwaWxvZ3VlCisKK3JldHN0cnVjdF9kOgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9ELCByZXRzdHJ1Y3RfZgorCWphbAl0OQorCVJFR19MCXQ0LCA0KkZGSV9TSVpFT0ZfQVJHKCRmcCkKKwlzLmQJJGYwLCAwKHQ0KQorCWIJZXBpbG9ndWUKKwkKK3JldHN0cnVjdF9mOgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9GLCByZXRzdHJ1Y3RfZF9kCisJamFsCXQ5CisJUkVHX0wJdDQsIDQqRkZJX1NJWkVPRl9BUkcoJGZwKQorCXMucwkkZjAsIDAodDQpCisJYgllcGlsb2d1ZQorCQorcmV0c3RydWN0X2RfZDoJCisJYm5lCXQ2LCBGRklfVFlQRV9TVFJVQ1RfREQsIHJldHN0cnVjdF9mX2YKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJcy5kCSRmMCwgMCh0NCkKKwlzLmQJJGYyLCA4KHQ0KQorCWIJZXBpbG9ndWUKKwkKK3JldHN0cnVjdF9mX2Y6CQorCWJuZQl0NiwgRkZJX1RZUEVfU1RSVUNUX0ZGLCByZXRzdHJ1Y3RfZF9mCisJamFsCXQ5CisJUkVHX0wJdDQsIDQqRkZJX1NJWkVPRl9BUkcoJGZwKQorCXMucwkkZjAsIDAodDQpCisJcy5zCSRmMiwgNCh0NCkKKwliCWVwaWxvZ3VlCisJCityZXRzdHJ1Y3RfZF9mOgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9ERiwgcmV0c3RydWN0X2ZfZAorCWphbAl0OQorCVJFR19MCXQ0LCA0KkZGSV9TSVpFT0ZfQVJHKCRmcCkKKwlzLmQJJGYwLCAwKHQ0KQorCXMucwkkZjIsIDgodDQpCisJYgllcGlsb2d1ZQorCQorcmV0c3RydWN0X2ZfZDoJCisJYm5lCXQ2LCBGRklfVFlQRV9TVFJVQ1RfRkQsIHJldHN0cnVjdF9kX3NvZnQKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJcy5zCSRmMCwgMCh0NCkKKwlzLmQJJGYyLCA4KHQ0KQorCWIJZXBpbG9ndWUKKworcmV0c3RydWN0X2Rfc29mdDoKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9EX1NPRlQsIHJldHN0cnVjdF9mX3NvZnQKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJc2QJdjAsIDAodDQpCisJYgllcGlsb2d1ZQorCQorcmV0c3RydWN0X2Zfc29mdDoJCisJYm5lCXQ2LCBGRklfVFlQRV9TVFJVQ1RfRl9TT0ZULCByZXRzdHJ1Y3RfZF9kX3NvZnQKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJc3cJdjAsIDAodDQpCisJYgllcGlsb2d1ZQorCQorcmV0c3RydWN0X2RfZF9zb2Z0OgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9ERF9TT0ZULCByZXRzdHJ1Y3RfZl9mX3NvZnQKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJc2QJdjAsIDAodDQpCisJc2QJdjEsIDgodDQpCisJYgllcGlsb2d1ZQorCQorcmV0c3RydWN0X2ZfZl9zb2Z0OgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9GRl9TT0ZULCByZXRzdHJ1Y3RfZF9mX3NvZnQKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJc3cJdjAsIDAodDQpCisJc3cJdjEsIDQodDQpCisJYgllcGlsb2d1ZQorCQorcmV0c3RydWN0X2RfZl9zb2Z0OgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9ERl9TT0ZULCByZXRzdHJ1Y3RfZl9kX3NvZnQKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJc2QJdjAsIDAodDQpCisJc3cJdjEsIDgodDQpCisJYgllcGlsb2d1ZQorCQorcmV0c3RydWN0X2ZfZF9zb2Z0OgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9GRF9TT0ZULCByZXRzdHJ1Y3Rfc21hbGwKKwlqYWwJdDkKKwlSRUdfTAl0NCwgNCpGRklfU0laRU9GX0FSRygkZnApCisJc3cJdjAsIDAodDQpCisJc2QJdjEsIDgodDQpCisJYgllcGlsb2d1ZQorCQorcmV0c3RydWN0X3NtYWxsOgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9TTUFMTCwgcmV0c3RydWN0X3NtYWxsMgorCWphbAl0OQorCVJFR19MCXQ0LCA0KkZGSV9TSVpFT0ZfQVJHKCRmcCkKKwlSRUdfUwl2MCwgMCh0NCkKKwliCWVwaWxvZ3VlCisJCityZXRzdHJ1Y3Rfc21hbGwyOgkKKwlibmUJdDYsIEZGSV9UWVBFX1NUUlVDVF9TTUFMTDIsIHJldHN0cnVjdAorCWphbAl0OQorCVJFR19MCXQ0LCA0KkZGSV9TSVpFT0ZfQVJHKCRmcCkKKwlSRUdfUwl2MCwgMCh0NCkKKwlSRUdfUwl2MSwgOCh0NCkKKwliCWVwaWxvZ3VlCisJCityZXRzdHJ1Y3Q6CQorbm9yZXR2YWw6CQorCWphbAl0OQorCQorCSMgRXBpbG9ndWUKK2VwaWxvZ3VlOgkKKwltb3ZlCSRzcCwgJGZwCQorCVJFR19MCSRmcCwgU0laRU9GX0ZSQU1FIC0gMipGRklfU0laRU9GX0FSRygkc3ApICMgUmVzdG9yZSBmcmFtZSBwb2ludGVyCisJUkVHX0wJcmEsIFNJWkVPRl9GUkFNRSAtIDEqRkZJX1NJWkVPRl9BUkcoJHNwKSAgIyBSZXN0b3JlIHJldHVybiBhZGRyZXNzCisJQUREVQkkc3AsIFNJWkVPRl9GUkFNRQkJICAgICAgIyBGaXggc3RhY2sgcG9pbnRlcgorCWoJcmEKKworLkxGRTM6CisJLmVuZAlmZmlfY2FsbF9OMzIKKworLyogZmZpX2Nsb3N1cmVfTjMyLiBFeHBlY3RzIGFkZHJlc3Mgb2YgdGhlIHBhc3NlZC1pbiBmZmlfY2xvc3VyZSBpbiB0MAorICAgKCQxMikuIFN0b3JlcyBhbnkgYXJndW1lbnRzIHBhc3NlZCBpbiByZWdpc3RlcnMgb250byB0aGUgc3RhY2ssCisgICB0aGVuIGNhbGxzIGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTjMyLCB3aGljaCB0aGVuIGRlY29kZXMKKyAgIHRoZW0uCisJCisJU3RhY2sgbGF5b3V0OgorCisJMjAgLSBTdGFydCBvZiBwYXJhbWV0ZXJzLCBvcmlnaW5hbCBzcAorCTE5IC0gQ2FsbGVkIGZ1bmN0aW9uIGE3IHNhdmUKKwkxOCAtIENhbGxlZCBmdW5jdGlvbiBhNiBzYXZlCisJMTcgLSBDYWxsZWQgZnVuY3Rpb24gYTUgc2F2ZQorCTE2IC0gQ2FsbGVkIGZ1bmN0aW9uIGE0IHNhdmUKKwkxNSAtIENhbGxlZCBmdW5jdGlvbiBhMyBzYXZlCisJMTQgLSBDYWxsZWQgZnVuY3Rpb24gYTIgc2F2ZQorCTEzIC0gQ2FsbGVkIGZ1bmN0aW9uIGExIHNhdmUKKwkxMiAtIENhbGxlZCBmdW5jdGlvbiBhMCBzYXZlCisJMTEgLSBDYWxsZWQgZnVuY3Rpb24gZjE5CisJMTAgLSBDYWxsZWQgZnVuY3Rpb24gZjE4CisJIDkgLSBDYWxsZWQgZnVuY3Rpb24gZjE3CisJIDggLSBDYWxsZWQgZnVuY3Rpb24gZjE2CisJIDcgLSBDYWxsZWQgZnVuY3Rpb24gZjE1CisgICAgICAgICA2IC0gQ2FsbGVkIGZ1bmN0aW9uIGYxNAorICAgICAgICAgNSAtIENhbGxlZCBmdW5jdGlvbiBmMTMKKyAgICAgICAgIDQgLSBDYWxsZWQgZnVuY3Rpb24gZjEyCisJIDMgLSByZXR1cm4gdmFsdWUgaGlnaCAodjEgb3IgJGYyKQorCSAyIC0gcmV0dXJuIHZhbHVlIGxvdyAodjAgb3IgJGYwKQorCSAxIC0gcmEgc2F2ZQorCSAwIC0gZ3Agc2F2ZSBvdXIgc3AgIHBvaW50cyBoZXJlCisJICovCisKKyNkZWZpbmUgU0laRU9GX0ZSQU1FMgkoMjAgKiBGRklfU0laRU9GX0FSRykKKwkKKyNkZWZpbmUgQTdfT0ZGMgkJKDE5ICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEE2X09GRjIJCSgxOCAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBBNV9PRkYyCQkoMTcgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgQTRfT0ZGMgkJKDE2ICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEEzX09GRjIJCSgxNSAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBBMl9PRkYyCQkoMTQgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgQTFfT0ZGMgkJKDEzICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEEwX09GRjIJCSgxMiAqIEZGSV9TSVpFT0ZfQVJHKQkKKworI2RlZmluZSBGMTlfT0ZGMgkoMTEgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgRjE4X09GRjIJKDEwICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEYxN19PRkYyCSg5ICAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBGMTZfT0ZGMgkoOCAgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgRjE1X09GRjIJKDcgICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEYxNF9PRkYyCSg2ICAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBGMTNfT0ZGMgkoNSAgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgRjEyX09GRjIJKDQgICogRkZJX1NJWkVPRl9BUkcpCisKKyNkZWZpbmUgVjFfT0ZGMgkJKDMgICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIFYwX09GRjIJCSgyICAqIEZGSV9TSVpFT0ZfQVJHKQorCisjZGVmaW5lIFJBX09GRjIJCSgxICAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBHUF9PRkYyCQkoMCAgKiBGRklfU0laRU9GX0FSRykKKworCS5hbGlnbgkyCisJLmdsb2JsCWZmaV9jbG9zdXJlX04zMgorCS5lbnQJZmZpX2Nsb3N1cmVfTjMyCitmZmlfY2xvc3VyZV9OMzI6CisuTEZCMjoKKwkuZnJhbWUJJHNwLCBTSVpFT0ZfRlJBTUUyLCByYQorCS5tYXNrCTB4OTAwMDAwMDAsLShTSVpFT0ZfRlJBTUUyIC0gUkFfT0ZGMikKKwkuZm1hc2sJMHgwMDAwMDAwMCwwCisJU1VCVQkkc3AsIFNJWkVPRl9GUkFNRTIKKy5MQ0ZJNToKKwkuY3BzZXR1cCB0OSwgR1BfT0ZGMiwgZmZpX2Nsb3N1cmVfTjMyCisJUkVHX1MJcmEsIFJBX09GRjIoJHNwKQkjIFNhdmUgcmV0dXJuIGFkZHJlc3MKKy5MQ0ZJNjoKKwkjIFN0b3JlIGFsbCBwb3NzaWJsZSBhcmd1bWVudCByZWdpc3RlcnMuIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4KKwkjIGZpdCBpbiByZWdpc3RlcnMsIHRoZW4gdGhleSB3ZXJlIHN0b3JlZCBvbiB0aGUgc3RhY2suCisJUkVHX1MJYTAsIEEwX09GRjIoJHNwKQorCVJFR19TCWExLCBBMV9PRkYyKCRzcCkKKwlSRUdfUwlhMiwgQTJfT0ZGMigkc3ApCisJUkVHX1MJYTMsIEEzX09GRjIoJHNwKQorCVJFR19TCWE0LCBBNF9PRkYyKCRzcCkKKwlSRUdfUwlhNSwgQTVfT0ZGMigkc3ApCisJUkVHX1MJYTYsIEE2X09GRjIoJHNwKQorCVJFR19TCWE3LCBBN19PRkYyKCRzcCkKKworCSMgU3RvcmUgYWxsIHBvc3NpYmxlIGZsb2F0L2RvdWJsZSByZWdpc3RlcnMuCisJcy5kCSRmMTIsIEYxMl9PRkYyKCRzcCkKKwlzLmQJJGYxMywgRjEzX09GRjIoJHNwKQorCXMuZAkkZjE0LCBGMTRfT0ZGMigkc3ApCisJcy5kCSRmMTUsIEYxNV9PRkYyKCRzcCkKKwlzLmQJJGYxNiwgRjE2X09GRjIoJHNwKQorCXMuZAkkZjE3LCBGMTdfT0ZGMigkc3ApCisJcy5kCSRmMTgsIEYxOF9PRkYyKCRzcCkKKwlzLmQJJGYxOSwgRjE5X09GRjIoJHNwKQorCisJIyBDYWxsIGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTjMyIHRvIGRvIHRoZSByZWFsIHdvcmsuCisJTEEJdDksIGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTjMyCisJbW92ZQlhMCwgJDEyCSAjIFBvaW50ZXIgdG8gdGhlIGZmaV9jbG9zdXJlCisJQUREVQlhMSwgJHNwLCBWMF9PRkYyCisJQUREVQlhMiwgJHNwLCBBMF9PRkYyCisJQUREVQlhMywgJHNwLCBGMTJfT0ZGMgorCWphbHIJdDkKKworCSMgUmV0dXJuIGZsYWdzIGFyZSBpbiB2MAorCWJuZSAgICAgdjAsIEZGSV9UWVBFX1NJTlQzMiwgY2xzX3JldGludAorCWx3CXYwLCBWMF9PRkYyKCRzcCkKKwliCWNsc19lcGlsb2d1ZQorCitjbHNfcmV0aW50OgorCWJuZSAgICAgdjAsIEZGSV9UWVBFX0lOVCwgY2xzX3JldGZsb2F0CisJUkVHX0wJdjAsIFYwX09GRjIoJHNwKQorCWIJY2xzX2VwaWxvZ3VlCisKK2Nsc19yZXRmbG9hdDoKKwlibmUgICAgIHYwLCBGRklfVFlQRV9GTE9BVCwgY2xzX3JldGRvdWJsZQorCWwucwkkZjAsIFYwX09GRjIoJHNwKQorCWIJY2xzX2VwaWxvZ3VlCisKK2Nsc19yZXRkb3VibGU6CQorCWJuZQl2MCwgRkZJX1RZUEVfRE9VQkxFLCBjbHNfcmV0c3RydWN0X2QKKwlsLmQJJGYwLCBWMF9PRkYyKCRzcCkKKwliCWNsc19lcGlsb2d1ZQorCitjbHNfcmV0c3RydWN0X2Q6CQorCWJuZQl2MCwgRkZJX1RZUEVfU1RSVUNUX0QsIGNsc19yZXRzdHJ1Y3RfZgorCWwuZAkkZjAsIFYwX09GRjIoJHNwKQorCWIJY2xzX2VwaWxvZ3VlCisJCitjbHNfcmV0c3RydWN0X2Y6CQorCWJuZQl2MCwgRkZJX1RZUEVfU1RSVUNUX0YsIGNsc19yZXRzdHJ1Y3RfZF9kCisJbC5zCSRmMCwgVjBfT0ZGMigkc3ApCisJYgljbHNfZXBpbG9ndWUKKwkKK2Nsc19yZXRzdHJ1Y3RfZF9kOgkKKwlibmUJdjAsIEZGSV9UWVBFX1NUUlVDVF9ERCwgY2xzX3JldHN0cnVjdF9mX2YKKwlsLmQJJGYwLCBWMF9PRkYyKCRzcCkKKwlsLmQJJGYyLCBWMV9PRkYyKCRzcCkKKwliCWNsc19lcGlsb2d1ZQorCQorY2xzX3JldHN0cnVjdF9mX2Y6CQorCWJuZQl2MCwgRkZJX1RZUEVfU1RSVUNUX0ZGLCBjbHNfcmV0c3RydWN0X2RfZgorCWwucwkkZjAsIFYwX09GRjIoJHNwKQorCWwucwkkZjIsIFYxX09GRjIoJHNwKQorCWIJY2xzX2VwaWxvZ3VlCisJCitjbHNfcmV0c3RydWN0X2RfZjoJCisJYm5lCXYwLCBGRklfVFlQRV9TVFJVQ1RfREYsIGNsc19yZXRzdHJ1Y3RfZl9kCisJbC5kCSRmMCwgVjBfT0ZGMigkc3ApCisJbC5zCSRmMiwgVjFfT0ZGMigkc3ApCisJYgljbHNfZXBpbG9ndWUKKwkKK2Nsc19yZXRzdHJ1Y3RfZl9kOgkKKwlibmUJdjAsIEZGSV9UWVBFX1NUUlVDVF9GRCwgY2xzX3JldHN0cnVjdF9zbWFsbDIKKwlsLnMJJGYwLCBWMF9PRkYyKCRzcCkKKwlsLmQJJGYyLCBWMV9PRkYyKCRzcCkKKwliCWNsc19lcGlsb2d1ZQorCQorY2xzX3JldHN0cnVjdF9zbWFsbDI6CQorCVJFR19MCXYwLCBWMF9PRkYyKCRzcCkKKwlSRUdfTAl2MSwgVjFfT0ZGMigkc3ApCisJCisJIyBFcGlsb2d1ZQorY2xzX2VwaWxvZ3VlOgkKKwlSRUdfTAlyYSwgIFJBX09GRjIoJHNwKQkgIyBSZXN0b3JlIHJldHVybiBhZGRyZXNzCisJLmNwcmV0dXJuCisJQUREVQkkc3AsIFNJWkVPRl9GUkFNRTIKKwlqCXJhCisuTEZFMjoJCisJLmVuZAlmZmlfY2xvc3VyZV9OMzIKKworI2lmZGVmIF9fR05VQ19fCisgICAgICAgIC5zZWN0aW9uICAgICAgICAuZWhfZnJhbWUsImF3IixAcHJvZ2JpdHMKKy5MZnJhbWUxOgorICAgICAgICAuNGJ5dGUgIC5MRUNJRTEtLkxTQ0lFMQkJIyBsZW5ndGgKKy5MU0NJRTE6CisgICAgICAgIC40Ynl0ZSAgMHgwCQkJIyBDSUUKKyAgICAgICAgLmJ5dGUgICAweDEJCQkjIFZlcnNpb24gMQorICAgICAgICAuYXNjaWkgICJcMDAwIgkJCSMgQXVnbWVudGF0aW9uCisgICAgICAgIC51bGViMTI4IDB4MQkJCSMgQ29kZSBhbGlnbm1lbnQgMQorICAgICAgICAuc2xlYjEyOCAtNAkJCSMgRGF0YSBhbGlnbm1lbnQgLTQKKyAgICAgICAgLmJ5dGUgICAweDFmCQkJIyBSZXR1cm4gQWRkcmVzcyAkMzEKKyAgICAgICAgLmJ5dGUgICAweGMJCQkjIERXX0NGQV9kZWZfY2ZhCisgICAgICAgIC51bGViMTI4IDB4MWQJCQkjIGluICRzcAorICAgICAgICAudWxlYjEyOCAweDAJCQkjIG9mZnNldCAwCisgICAgICAgIC5hbGlnbiAgRUhfRlJBTUVfQUxJR04KKy5MRUNJRTE6CisKKy5MU0ZERTE6CisgICAgICAgIC40Ynl0ZSAgLkxFRkRFMS0uTEFTRkRFMQkjIGxlbmd0aC4KKy5MQVNGREUxOgorICAgICAgICAuNGJ5dGUgIC5MQVNGREUxLS5MZnJhbWUxCSMgQ0lFX3BvaW50ZXIuCisgICAgICAgIEZERV9BRERSX0JZVEVTICAuTEZCMwkJIyBpbml0aWFsX2xvY2F0aW9uLgorICAgICAgICBGREVfQUREUl9CWVRFUyAgLkxGRTMtLkxGQjMJIyBhZGRyZXNzX3JhbmdlLgorICAgICAgICAuYnl0ZSAgIDB4NAkJCSMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorICAgICAgICAuNGJ5dGUgIC5MQ0ZJMC0uTEZCMwkJIyB0byAuTENGSTAKKyAgICAgICAgLmJ5dGUgICAweGUJCQkjIERXX0NGQV9kZWZfY2ZhX29mZnNldAorICAgICAgICAudWxlYjEyOCBTSVpFT0ZfRlJBTUUJCSMgYWRqdXN0IHN0YWNrLmJ5IFNJWkVPRl9GUkFNRQorICAgICAgICAuYnl0ZSAgIDB4NAkJCSMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorICAgICAgICAuNGJ5dGUgIC5MQ0ZJMS0uTENGSTAJCSMgdG8gLkxDRkkxCisgICAgICAgIC5ieXRlICAgMHg5ZQkJCSMgRFdfQ0ZBX29mZnNldCBvZiAkZnAKKyAgICAgICAgLnVsZWIxMjggMipGRklfU0laRU9GX0FSRy80CSMgCisgICAgICAgIC5ieXRlICAgMHg5ZgkJCSMgRFdfQ0ZBX29mZnNldCBvZiByYQorICAgICAgICAudWxlYjEyOCAxKkZGSV9TSVpFT0ZfQVJHLzQJIyAKKyAgICAgICAgLmJ5dGUgICAweDQJCQkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKyAgICAgICAgLjRieXRlICAuTENGSTMtLkxDRkkxCQkjIHRvIC5MQ0ZJMworICAgICAgICAuYnl0ZSAgIDB4ZAkJCSMgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIKKyAgICAgICAgLnVsZWIxMjggMHgxZQkJCSMgaW4gJGZwCisgICAgICAgIC5hbGlnbiAgRUhfRlJBTUVfQUxJR04KKy5MRUZERTE6CisuTFNGREUzOgorCS40Ynl0ZQkuTEVGREUzLS5MQVNGREUzCSMgbGVuZ3RoCisuTEFTRkRFMzoKKwkuNGJ5dGUJLkxBU0ZERTMtLkxmcmFtZTEJIyBDSUVfcG9pbnRlci4KKwlGREVfQUREUl9CWVRFUwkuTEZCMgkJIyBpbml0aWFsX2xvY2F0aW9uLgorCUZERV9BRERSX0JZVEVTCS5MRkUyLS5MRkIyCSMgYWRkcmVzc19yYW5nZS4KKwkuYnl0ZQkweDQJCQkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJLkxDRkk1LS5MRkIyCQkjIHRvIC5MQ0ZJNQorCS5ieXRlCTB4ZQkJCSMgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0CisJLnVsZWIxMjggU0laRU9GX0ZSQU1FMgkJIyBhZGp1c3Qgc3RhY2suYnkgU0laRU9GX0ZSQU1FCisJLmJ5dGUJMHg0CQkJIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLjRieXRlCS5MQ0ZJNi0uTENGSTUJCSMgdG8gLkxDRkk2CisJLmJ5dGUJMHg5YwkJCSMgRFdfQ0ZBX29mZnNldCBvZiAkZ3AgKCQyOCkKKwkudWxlYjEyOCAoU0laRU9GX0ZSQU1FMiAtIEdQX09GRjIpLzQKKwkuYnl0ZQkweDlmCQkJIyBEV19DRkFfb2Zmc2V0IG9mIHJhICgkMzEpCisJLnVsZWIxMjggKFNJWkVPRl9GUkFNRTIgLSBSQV9PRkYyKS80CisJLmFsaWduCUVIX0ZSQU1FX0FMSUdOCisuTEVGREUzOgorI2VuZGlmIC8qIF9fR05VQ19fICovCQorCQorI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL21pcHMvbzMyLlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL21pcHMvbzMyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyNzk4MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbWlwcy9vMzIuUwpAQCAtMCwwICsxLDM4MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIG8zMi5TIC0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAyMDA1ICBSZWQgSGF0LCBJbmMuCisgICAKKyAgIE1JUFMgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElCRkZJX0FTTQkKKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworLyogT25seSBidWlsZCB0aGlzIGNvZGUgaWYgd2UgYXJlIGNvbXBpbGluZyBmb3IgbzMyICovCQorCisjaWYgZGVmaW5lZChGRklfTUlQU19PMzIpCisJCisjZGVmaW5lIGNhbGxiYWNrIGEwCisjZGVmaW5lIGJ5dGVzCSBhMgorI2RlZmluZSBmbGFncwkgYTMKKwkJCisjZGVmaW5lIFNJWkVPRl9GUkFNRQkoNCAqIEZGSV9TSVpFT0ZfQVJHICsgMiAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBBM19PRkYJCShTSVpFT0ZfRlJBTUUgKyAzICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEZQX09GRgkJKFNJWkVPRl9GUkFNRSAtIDIgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgUkFfT0ZGCQkoU0laRU9GX0ZSQU1FIC0gMSAqIEZGSV9TSVpFT0ZfQVJHKQorCisJLmFiaWNhbGxzCisJLnRleHQKKwkuYWxpZ24JMgorCS5nbG9ibAlmZmlfY2FsbF9PMzIKKwkuZW50CWZmaV9jYWxsX08zMgorZmZpX2NhbGxfTzMyOgkKKyRMRkIwOgorCSMgUHJvbG9ndWUKKwlTVUJVCSRzcCwgU0laRU9GX0ZSQU1FCSMgRnJhbWUgc2l6ZQorJExDRkkwOgorCVJFR19TCSRmcCwgRlBfT0ZGKCRzcCkJIyBTYXZlIGZyYW1lIHBvaW50ZXIKKyRMQ0ZJMToKKwlSRUdfUwlyYSwgUkFfT0ZGKCRzcCkJCSMgU2F2ZSByZXR1cm4gYWRkcmVzcworJExDRkkyOgorCW1vdmUJJGZwLCAkc3AKKworJExDRkkzOgorCW1vdmUJdDksIGNhbGxiYWNrCQkjIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKwlSRUdfUwlmbGFncywgQTNfT0ZGKCRmcCkJIyBmbGFncworCisJIyBBbGxvY2F0ZSBhdCBsZWFzdCA0IHdvcmRzIGluIHRoZSBhcmdzdGFjaworCUxJCXYwLCA0ICogRkZJX1NJWkVPRl9BUkcKKwlibHQJYnl0ZXMsIHYwLCBzaXh0ZWVuCisKKwlBRERVCXYwLCBieXRlcywgNwkjIG1ha2Ugc3VyZSBpdCBpcyBhbGlnbmVkIAorCWFuZAl2MCwgLTgJCSMgdG8gYW4gOCBieXRlIGJvdW5kcnkKKworc2l4dGVlbjoKKwlTVUJVCSRzcCwgdjAJCSMgbW92ZSB0aGUgc3RhY2sgcG9pbnRlciB0byByZWZsZWN0IHRoZQorCQkJCSMgYXJnIHNwYWNlCisKKwlBRERVCWEwLCAkc3AsIDQgKiBGRklfU0laRU9GX0FSRworCisJamFscgl0OQorCQorCVJFR19MCXQwLCBBM19PRkYoJGZwKQkJIyBsb2FkIHRoZSBmbGFncyB3b3JkCisJU1JMCXQyLCB0MCwgNAkJIyBzaGlmdCBvdXIgYXJnIGluZm8KKwlhbmQgICAgIHQwLCAoKDE8PDQpLTEpICAgICAgICAgICMgbWFzayBvdXQgdGhlIHJldHVybiB0eXBlCisJCQorCUFERFUJJHNwLCA0ICogRkZJX1NJWkVPRl9BUkcJCSMgYWRqdXN0ICRzcCB0byBuZXcgYXJncworCisJYm5legl0MCwgcGFzc19kCQkJIyBtYWtlIGl0IHF1aWNrIGZvciBpbnQKKwlSRUdfTAlhMCwgMCpGRklfU0laRU9GX0FSRygkc3ApCSMganVzdCBnbyBhaGVhZCBhbmQgbG9hZCB0aGUKKwlSRUdfTAlhMSwgMSpGRklfU0laRU9GX0FSRygkc3ApCSMgZm91ciByZWdzLgorCVJFR19MCWEyLCAyKkZGSV9TSVpFT0ZfQVJHKCRzcCkKKwlSRUdfTAlhMywgMypGRklfU0laRU9GX0FSRygkc3ApCisJYgljYWxsX2l0CisKK3Bhc3NfZDoKKwlibmUJdDAsIEZGSV9BUkdTX0QsIHBhc3NfZgorCWwuZAkkZjEyLCAwKkZGSV9TSVpFT0ZfQVJHKCRzcCkJIyBsb2FkICRmcCByZWdzIGZyb20gYXJncworCVJFR19MCWEyLCAgIDIqRkZJX1NJWkVPRl9BUkcoJHNwKQkjIHBhc3NpbmcgYSBkb3VibGUKKwlSRUdfTAlhMywgICAzKkZGSV9TSVpFT0ZfQVJHKCRzcCkKKwliCWNhbGxfaXQKKworcGFzc19mOgkKKwlibmUJdDAsIEZGSV9BUkdTX0YsIHBhc3NfZF9kCisJbC5zCSRmMTIsIDAqRkZJX1NJWkVPRl9BUkcoJHNwKQkjIGxvYWQgJGZwIHJlZ3MgZnJvbSBhcmdzCisJUkVHX0wJYTEsICAgMSpGRklfU0laRU9GX0FSRygkc3ApCSMgcGFzc2luZyBhIGZsb2F0CisJUkVHX0wJYTIsICAgMipGRklfU0laRU9GX0FSRygkc3ApCisJUkVHX0wJYTMsICAgMypGRklfU0laRU9GX0FSRygkc3ApCisJYgljYWxsX2l0CQkKKworcGFzc19kX2Q6CQkKKwlibmUJdDAsIEZGSV9BUkdTX0RELCBwYXNzX2ZfZgorCWwuZAkkZjEyLCAwKkZGSV9TSVpFT0ZfQVJHKCRzcCkJIyBsb2FkICRmcCByZWdzIGZyb20gYXJncworCWwuZAkkZjE0LCAyKkZGSV9TSVpFT0ZfQVJHKCRzcCkJIyBwYXNzaW5nIHR3byBkb3VibGVzCisJYgljYWxsX2l0CisKK3Bhc3NfZl9mOgkKKwlibmUJdDAsIEZGSV9BUkdTX0ZGLCBwYXNzX2RfZgorCWwucwkkZjEyLCAwKkZGSV9TSVpFT0ZfQVJHKCRzcCkJIyBsb2FkICRmcCByZWdzIGZyb20gYXJncworCWwucwkkZjE0LCAxKkZGSV9TSVpFT0ZfQVJHKCRzcCkJIyBwYXNzaW5nIHR3byBmbG9hdHMKKwlSRUdfTAlhMiwgICAyKkZGSV9TSVpFT0ZfQVJHKCRzcCkKKwlSRUdfTAlhMywgICAzKkZGSV9TSVpFT0ZfQVJHKCRzcCkKKwliCWNhbGxfaXQKKworcGFzc19kX2Y6CQkKKwlibmUJdDAsIEZGSV9BUkdTX0RGLCBwYXNzX2ZfZAorCWwuZAkkZjEyLCAwKkZGSV9TSVpFT0ZfQVJHKCRzcCkJIyBsb2FkICRmcCByZWdzIGZyb20gYXJncworCWwucwkkZjE0LCAyKkZGSV9TSVpFT0ZfQVJHKCRzcCkJIyBwYXNzaW5nIGRvdWJsZSBhbmQgZmxvYXQKKwlSRUdfTAlhMywgICAzKkZGSV9TSVpFT0ZfQVJHKCRzcCkKKwliCWNhbGxfaXQKKworcGFzc19mX2Q6CQkKKyAjIGFzc3VtZSB0aGF0IHRoZSBvbmx5IG90aGVyIGNvbWJpbmF0aW9uIG11c3QgYmUgZmxvYXQgdGhlbiBkb3VibGUKKyAjCWJuZQl0MCwgRkZJX0FSR1NfRl9ELCBjYWxsX2l0CisJbC5zCSRmMTIsIDAqRkZJX1NJWkVPRl9BUkcoJHNwKQkjIGxvYWQgJGZwIHJlZ3MgZnJvbSBhcmdzCisJbC5kCSRmMTQsIDIqRkZJX1NJWkVPRl9BUkcoJHNwKQkjIHBhc3NpbmcgZG91YmxlIGFuZCBmbG9hdAorCitjYWxsX2l0OgkKKwkjIExvYWQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIKKwlSRUdfTAl0OSwgU0laRU9GX0ZSQU1FICsgNSpGRklfU0laRU9GX0FSRygkZnApCisKKwkjIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgorCVJFR19MCXQxLCBTSVpFT0ZfRlJBTUUgKyA0KkZGSV9TSVpFT0ZfQVJHKCRmcCkKKwliZXF6CXQxLCBub3JldHZhbAorCisJYm5lICAgICB0MiwgRkZJX1RZUEVfSU5ULCByZXRsb25nbG9uZworCWphbHIJdDkKKwlSRUdfTAl0MCwgU0laRU9GX0ZSQU1FICsgNCpGRklfU0laRU9GX0FSRygkZnApCisJUkVHX1MJdjAsIDAodDApCisJYgllcGlsb2d1ZQorCityZXRsb25nbG9uZzoKKwkjIFJlYWxseSBhbnkgNjQtYml0IGludCwgc2lnbmVkIG9yIG5vdC4KKwlibmUJdDIsIEZGSV9UWVBFX1VJTlQ2NCwgcmV0ZmxvYXQKKwlqYWxyCXQ5CisJUkVHX0wJdDAsIFNJWkVPRl9GUkFNRSArIDQqRkZJX1NJWkVPRl9BUkcoJGZwKQorCVJFR19TCXYxLCA0KHQwKQorCVJFR19TCXYwLCAwKHQwKQorCWIJZXBpbG9ndWUKKworcmV0ZmxvYXQ6CisJYm5lICAgICB0MiwgRkZJX1RZUEVfRkxPQVQsIHJldGRvdWJsZQorCWphbHIJdDkKKwlSRUdfTAl0MCwgU0laRU9GX0ZSQU1FICsgNCpGRklfU0laRU9GX0FSRygkZnApCisJcy5zCSRmMCwgMCh0MCkKKwliCWVwaWxvZ3VlCisKK3JldGRvdWJsZToJCisJYm5lCXQyLCBGRklfVFlQRV9ET1VCTEUsIG5vcmV0dmFsCisJamFscgl0OQorCVJFR19MCXQwLCBTSVpFT0ZfRlJBTUUgKyA0KkZGSV9TSVpFT0ZfQVJHKCRmcCkKKwlzLmQJJGYwLCAwKHQwKQorCWIJZXBpbG9ndWUKKwkKK25vcmV0dmFsOgkKKwlqYWxyCXQ5CisJCisJIyBFcGlsb2d1ZQorZXBpbG9ndWU6CQorCW1vdmUJJHNwLCAkZnAJCisJUkVHX0wJJGZwLCBGUF9PRkYoJHNwKQkjIFJlc3RvcmUgZnJhbWUgcG9pbnRlcgorCVJFR19MCXJhLCBSQV9PRkYoJHNwKQkJIyBSZXN0b3JlIHJldHVybiBhZGRyZXNzCisJQUREVQkkc3AsIFNJWkVPRl9GUkFNRQkjIEZpeCBzdGFjayBwb2ludGVyCisJaglyYQorCiskTEZFMDoKKwkuZW5kCWZmaV9jYWxsX08zMgorCisKKy8qIGZmaV9jbG9zdXJlX08zMi4gRXhwZWN0cyBhZGRyZXNzIG9mIHRoZSBwYXNzZWQtaW4gZmZpX2Nsb3N1cmUKKwlpbiB0NCAoJDEyKS4gU3RvcmVzIGFueSBhcmd1bWVudHMgcGFzc2VkIGluIHJlZ2lzdGVycyBvbnRvIHRoZQorCXN0YWNrLCB0aGVuIGNhbGxzIGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTzMyLCB3aGljaAorCXRoZW4gZGVjb2RlcyB0aGVtLgorCQorCVN0YWNrIGxheW91dDoKKworCSAzIC0gYTMgc2F2ZQorCSAyIC0gYTIgc2F2ZQorCSAxIC0gYTEgc2F2ZQorCSAwIC0gYTAgc2F2ZSwgb3JpZ2luYWwgc3AKKwktMSAtIHJhIHNhdmUKKwktMiAtIGZwIHNhdmUKKwktMyAtICQxNiAoczApIHNhdmUKKwktNCAtIGNwcmVzdG9yZQorCS01IC0gcmV0dXJuIHZhbHVlIGhpZ2ggKHYxKQorCS02IC0gcmV0dXJuIHZhbHVlIGxvdyAodjApCisJLTcgLSBmMTQgKGxlIGhpZ2gsIGJlIGxvdykKKwktOCAtIGYxNCAobGUgbG93LCBiZSBoaWdoKQorCS05IC0gZjEyIChsZSBoaWdoLCBiZSBsb3cpCisgICAgICAgLTEwIC0gZjEyIChsZSBsb3csIGJlIGhpZ2gpCisgICAgICAgLTExIC0gQ2FsbGVkIGZ1bmN0aW9uIGEzIHNhdmUKKyAgICAgICAtMTIgLSBDYWxsZWQgZnVuY3Rpb24gYTIgc2F2ZQorICAgICAgIC0xMyAtIENhbGxlZCBmdW5jdGlvbiBhMSBzYXZlCisgICAgICAgLTE0IC0gQ2FsbGVkIGZ1bmN0aW9uIGEwIHNhdmUsIG91ciBzcCBhbmQgZnAgcG9pbnQgaGVyZQorCSAqLworCQorI2RlZmluZSBTSVpFT0ZfRlJBTUUyCSgxNCAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBBM19PRkYyCQkoU0laRU9GX0ZSQU1FMiArIDMgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgQTJfT0ZGMgkJKFNJWkVPRl9GUkFNRTIgKyAyICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEExX09GRjIJCShTSVpFT0ZfRlJBTUUyICsgMSAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBBMF9PRkYyCQkoU0laRU9GX0ZSQU1FMiArIDAgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgUkFfT0ZGMgkJKFNJWkVPRl9GUkFNRTIgLSAxICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEZQX09GRjIJCShTSVpFT0ZfRlJBTUUyIC0gMiAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBTMF9PRkYyCQkoU0laRU9GX0ZSQU1FMiAtIDMgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgR1BfT0ZGMgkJKFNJWkVPRl9GUkFNRTIgLSA0ICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIFYxX09GRjIJCShTSVpFT0ZfRlJBTUUyIC0gNSAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBWMF9PRkYyCQkoU0laRU9GX0ZSQU1FMiAtIDYgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgRkFfMV8xX09GRjIJKFNJWkVPRl9GUkFNRTIgLSA3ICogRkZJX1NJWkVPRl9BUkcpCisjZGVmaW5lIEZBXzFfMF9PRkYyCShTSVpFT0ZfRlJBTUUyIC0gOCAqIEZGSV9TSVpFT0ZfQVJHKQorI2RlZmluZSBGQV8wXzFfT0ZGMgkoU0laRU9GX0ZSQU1FMiAtIDkgKiBGRklfU0laRU9GX0FSRykKKyNkZWZpbmUgRkFfMF8wX09GRjIJKFNJWkVPRl9GUkFNRTIgLSAxMCAqIEZGSV9TSVpFT0ZfQVJHKQorCisJLnRleHQKKwkuYWxpZ24JMgorCS5nbG9ibAlmZmlfY2xvc3VyZV9PMzIKKwkuZW50CWZmaV9jbG9zdXJlX08zMgorZmZpX2Nsb3N1cmVfTzMyOgorJExGQjE6CisJIyBQcm9sb2d1ZQorCS5mcmFtZQkkZnAsIFNJWkVPRl9GUkFNRTIsIHJhCisJLnNldAlub3Jlb3JkZXIKKwkuY3Bsb2FkCXQ5CisJLnNldAlyZW9yZGVyCisJU1VCVQkkc3AsIFNJWkVPRl9GUkFNRTIKKwkuY3ByZXN0b3JlIEdQX09GRjIKKyRMQ0ZJNDoKKwlSRUdfUwkkMTYsIFMwX09GRjIoJHNwKQkgIyBTYXZlIHMwCisJUkVHX1MJJGZwLCBGUF9PRkYyKCRzcCkJICMgU2F2ZSBmcmFtZSBwb2ludGVyCisJUkVHX1MJcmEsIFJBX09GRjIoJHNwKQkgIyBTYXZlIHJldHVybiBhZGRyZXNzCiskTENGSTY6CisJbW92ZQkkZnAsICRzcAorCiskTENGSTc6CisJIyBTdG9yZSBhbGwgcG9zc2libGUgYXJndW1lbnQgcmVnaXN0ZXJzLiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuCisJIyBmb3VyIGFyZ3VtZW50cywgdGhlbiB0aGV5IGFyZSBzdG9yZWQgYWJvdmUgd2hlcmUgd2UgcHV0IGEzLgorCVJFR19TCWEwLCBBMF9PRkYyKCRmcCkKKwlSRUdfUwlhMSwgQTFfT0ZGMigkZnApCisJUkVHX1MJYTIsIEEyX09GRjIoJGZwKQorCVJFR19TCWEzLCBBM19PRkYyKCRmcCkKKworCSMgTG9hZCBBQkkgZW51bSB0byBzMAorCVJFR19MCSQxNiwgMjAoJDEyKQkjIGNpZiBwb2ludGVyIGZvbGxvd3MgdHJhbXAuCisJUkVHX0wJJDE2LCAwKCQxNikJIyBhYmkgaXMgZmlyc3QgbWVtYmVyLgorCisJbGkJJDEzLCAxCQkjIEZGSV9PMzIKKwlibmUJJDE2LCAkMTMsIDFmCSMgU2tpcCBmcCBzYXZlIGlmIEZGSV9PMzJfU09GVF9GTE9BVAorCQorCSMgU3RvcmUgYWxsIHBvc3NpYmxlIGZsb2F0L2RvdWJsZSByZWdpc3RlcnMuCisJcy5kCSRmMTIsIEZBXzBfMF9PRkYyKCRmcCkKKwlzLmQJJGYxNCwgRkFfMV8wX09GRjIoJGZwKQorMToJCisJIyBDYWxsIGZmaV9jbG9zdXJlX21pcHNfaW5uZXJfTzMyIHRvIGRvIHRoZSB3b3JrLgorCWxhCXQ5LCBmZmlfY2xvc3VyZV9taXBzX2lubmVyX08zMgorCW1vdmUJYTAsICQxMgkgIyBQb2ludGVyIHRvIHRoZSBmZmlfY2xvc3VyZQorCWFkZHUJYTEsICRmcCwgVjBfT0ZGMgorCWFkZHUJYTIsICRmcCwgQTBfT0ZGMgorCWFkZHUJYTMsICRmcCwgRkFfMF8wX09GRjIKKwlqYWxyCXQ5CisKKwkjIExvYWQgdGhlIHJldHVybiB2YWx1ZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3Rlci4KKwltb3ZlCSQ4LCAkMgorCWxpCSQ5LCBGRklfVFlQRV9WT0lECisJYmVxCSQ4LCAkOSwgY2xvc3VyZV9kb25lCisKKwlsaQkkMTMsIDEJCSMgRkZJX08zMgorCWJuZQkkMTYsICQxMywgMWYJIyBTa2lwIGZwIHJlc3RvcmUgaWYgRkZJX08zMl9TT0ZUX0ZMT0FUCisKKwlsaQkkOSwgRkZJX1RZUEVfRkxPQVQKKwlsLnMJJGYwLCBWMF9PRkYyKCRmcCkKKwliZXEJJDgsICQ5LCBjbG9zdXJlX2RvbmUKKworCWxpCSQ5LCBGRklfVFlQRV9ET1VCTEUKKwlsLmQJJGYwLCBWMF9PRkYyKCRmcCkKKwliZXEJJDgsICQ5LCBjbG9zdXJlX2RvbmUKKzE6CQorCVJFR19MCSQzLCBWMV9PRkYyKCRmcCkKKwlSRUdfTAkkMiwgVjBfT0ZGMigkZnApCisKK2Nsb3N1cmVfZG9uZToKKwkjIEVwaWxvZ3VlCisJbW92ZQkkc3AsICRmcAorCVJFR19MCSQxNiwgUzBfT0ZGMigkc3ApCSAjIFJlc3RvcmUgczAKKwlSRUdfTAkkZnAsIEZQX09GRjIoJHNwKQkgIyBSZXN0b3JlIGZyYW1lIHBvaW50ZXIKKwlSRUdfTAlyYSwgIFJBX09GRjIoJHNwKQkgIyBSZXN0b3JlIHJldHVybiBhZGRyZXNzCisJQUREVQkkc3AsIFNJWkVPRl9GUkFNRTIKKwlqCXJhCiskTEZFMToKKwkuZW5kCWZmaV9jbG9zdXJlX08zMgorCisvKiBEV0FSRi0yIHVud2luZCBpbmZvLiAqLworCisJLnNlY3Rpb24JLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKyRMZnJhbWUwOgorCS40Ynl0ZQkkTEVDSUUwLSRMU0NJRTAJICMgTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQorJExTQ0lFMDoKKwkuNGJ5dGUJMHgwCSAjIENJRSBJZGVudGlmaWVyIFRhZworCS5ieXRlCTB4MQkgIyBDSUUgVmVyc2lvbgorCS5hc2NpaSAielJcMCIJICMgQ0lFIEF1Z21lbnRhdGlvbgorCS51bGViMTI4IDB4MQkgIyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yCisJLnNsZWIxMjggNAkgIyBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJMHgxZgkgIyBDSUUgUkEgQ29sdW1uCisJLnVsZWIxMjggMHgxCSAjIEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHgwMAkgIyBGREUgRW5jb2RpbmcgKGFic3B0cikKKwkuYnl0ZQkweGMJICMgRFdfQ0ZBX2RlZl9jZmEKKwkudWxlYjEyOCAweDFkCisJLnVsZWIxMjggMHgwCisJLmFsaWduCTIKKyRMRUNJRTA6CiskTFNGREUwOgorCS40Ynl0ZQkkTEVGREUwLSRMQVNGREUwCSAjIEZERSBMZW5ndGgKKyRMQVNGREUwOgorCS40Ynl0ZQkkTEFTRkRFMC0kTGZyYW1lMAkgIyBGREUgQ0lFIG9mZnNldAorCS40Ynl0ZQkkTEZCMAkgIyBGREUgaW5pdGlhbCBsb2NhdGlvbgorCS40Ynl0ZQkkTEZFMC0kTEZCMAkgIyBGREUgYWRkcmVzcyByYW5nZQorCS51bGViMTI4IDB4MAkgIyBBdWdtZW50YXRpb24gc2l6ZQorCS5ieXRlCTB4NAkgIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLjRieXRlCSRMQ0ZJMC0kTEZCMAorCS5ieXRlCTB4ZQkgIyBEV19DRkFfZGVmX2NmYV9vZmZzZXQKKwkudWxlYjEyOCAweDE4CisJLmJ5dGUJMHg0CSAjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJJExDRkkyLSRMQ0ZJMAorCS5ieXRlCTB4MTEJICMgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZgorCS51bGViMTI4IDB4MWUJICMgJGZwCisJLnNsZWIxMjggLTIJICMgU0laRU9GX0ZSQU1FMiAtIDIqRkZJX1NJWkVPRl9BUkcoJHNwKQorCS5ieXRlCTB4MTEJICMgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZgorCS51bGViMTI4IDB4MWYJICMgJHJhCisJLnNsZWIxMjggLTEJICMgU0laRU9GX0ZSQU1FMiAtIDEqRkZJX1NJWkVPRl9BUkcoJHNwKQorCS5ieXRlCTB4NAkgIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLjRieXRlCSRMQ0ZJMy0kTENGSTIKKwkuYnl0ZQkweGMJICMgRFdfQ0ZBX2RlZl9jZmEKKwkudWxlYjEyOCAweDFlCisJLnVsZWIxMjggMHgxOAorCS5hbGlnbgkyCiskTEVGREUwOgorJExTRkRFMToKKwkuNGJ5dGUJJExFRkRFMS0kTEFTRkRFMQkgIyBGREUgTGVuZ3RoCiskTEFTRkRFMToKKwkuNGJ5dGUJJExBU0ZERTEtJExmcmFtZTAJICMgRkRFIENJRSBvZmZzZXQKKwkuNGJ5dGUJJExGQjEJICMgRkRFIGluaXRpYWwgbG9jYXRpb24KKwkuNGJ5dGUJJExGRTEtJExGQjEJICMgRkRFIGFkZHJlc3MgcmFuZ2UKKwkudWxlYjEyOCAweDAJICMgQXVnbWVudGF0aW9uIHNpemUKKwkuYnl0ZQkweDQJICMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS40Ynl0ZQkkTENGSTQtJExGQjEKKwkuYnl0ZQkweGUJICMgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0CisJLnVsZWIxMjggMHgzOAorCS5ieXRlCTB4NAkgIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLjRieXRlCSRMQ0ZJNi0kTENGSTQKKwkuYnl0ZQkweDExCSAjIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YKKwkudWxlYjEyOCAweDEwCSAjICQxNgorCS5zbGViMTI4IC0zCSAjIFNJWkVPRl9GUkFNRTIgLSAzKkZGSV9TSVpFT0ZfQVJHKCRzcCkKKwkuYnl0ZQkweDExCSAjIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YKKwkudWxlYjEyOCAweDFlCSAjICRmcAorCS5zbGViMTI4IC0yCSAjIFNJWkVPRl9GUkFNRTIgLSAyKkZGSV9TSVpFT0ZfQVJHKCRzcCkKKwkuYnl0ZQkweDExCSAjIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YKKwkudWxlYjEyOCAweDFmCSAjICRyYQorCS5zbGViMTI4IC0xCSAjIFNJWkVPRl9GUkFNRTIgLSAxKkZGSV9TSVpFT0ZfQVJHKCRzcCkKKwkuYnl0ZQkweDQJICMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS40Ynl0ZQkkTENGSTctJExDRkk2CisJLmJ5dGUJMHhjCSAjIERXX0NGQV9kZWZfY2ZhCisJLnVsZWIxMjggMHgxZQorCS51bGViMTI4IDB4MzgKKwkuYWxpZ24JMgorJExFRkRFMToKKworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL21veGllL2VhYmkuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvbW94aWUvZWFiaS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OWVhNGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL21veGllL2VhYmkuUwpAQCAtMCwwICsxLDEyOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGVhYmkuUyAtIENvcHlyaWdodCAoYykgMjAwNCAgQW50aG9ueSBHcmVlbgorICAgCisgICBGUi1WIEFzc2VtYmx5IGdsdWUuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElCRkZJX0FTTQkKKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworCS5nbG9ibCBmZmlfcHJlcF9hcmdzX0VBQkkKKworCS50ZXh0CisJLnAyYWxpZ24gNAorCS5nbG9ibCBmZmlfY2FsbF9FQUJJCisJLnR5cGUgZmZpX2NhbGxfRUFCSSwgQGZ1bmN0aW9uCisKKwkjIGdyOCA6ICAgZmZpX3ByZXBfYXJncworCSMgZ3I5IDogICAmZWNpZgorCSMgZ3IxMDogICBjaWYtPmJ5dGVzCisJIyBncjExOiAgIGZpZy0+ZmxhZ3MKKwkjIGdyMTI6ICAgZWNpZi5ydmFsdWUKKwkjIGdyMTM6ICAgZm4KKwkKK2ZmaV9jYWxsX0VBQkk6CQorCWFkZGkJc3AsICMtODAsIHNwCisJc3RpCWZwLCBAKHNwLCAjMjQpCisJYWRkaQlzcCwgIzI0LCBmcAorCW1vdnNnCWxyLCBncjUKKworCS8qIE1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBhcmd1bWVudHMuICAqLworCS8qIHN1YmkJc3AsIGZwLCBncjEwICovCisJCisJLyogU3RvcmUgcmV0dXJuIGFkZHJlc3MgYW5kIGluY29taW5nIGFyZ3Mgb24gc3RhY2suICAqLworCXN0aQlncjUsIEAoZnAsICM4KQorCXN0aQlncjgsIEAoZnAsICMtNCkKKwlzdGkJZ3I5LCBAKGZwLCAjLTgpCisJc3RpCWdyMTAsIEAoZnAsICMtMTIpCisJc3RpCWdyMTEsIEAoZnAsICMtMTYpCisJc3RpCWdyMTIsIEAoZnAsICMtMjApCisJc3RpCWdyMTMsIEAoZnAsICMtMjQpCisKKwlzdWIgICAgIHNwLCBncjEwLCBzcAorCQorCS8qIENhbGwgZmZpX3ByZXBfYXJncy4gICovCisJbGRpCUAoZnAsICMtNCksIGdyNAorCWFkZGkJc3AsICMwLCBncjgKKwlsZGkJQChmcCwgIy04KSwgZ3I5CisjaWZkZWYgX19GUlZfRkRQSUNfXworCWxkZAlAKGdyNCwgZ3IwKSwgZ3IxNAorCWNhbGxsCUAoZ3IxNCwgZ3IwKQorI2Vsc2UKKwljYWxsbAlAKGdyNCwgZ3IwKQorI2VuZGlmCQorCisJLyogZmZpX3ByZXBfYXJncyByZXR1cm5zIHRoZSBuZXcgc3RhY2sgcG9pbnRlci4gICovCisJbW92CWdyOCwgZ3I0CisJCQorCWxkaQlAKHNwLCAjMCksIGdyOAorCWxkaQlAKHNwLCAjNCksIGdyOQorCWxkaQlAKHNwLCAjOCksIGdyMTAKKwlsZGkJQChzcCwgIzEyKSwgZ3IxMQorCWxkaQlAKHNwLCAjMTYpLCBncjEyCisJbGRpCUAoc3AsICMyMCksIGdyMTMKKworCS8qIEFsd2F5cyBjb3B5IHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpbnRvIHRoZSBoaWRkZW4KKwkgICBwYXJhbWV0ZXIgcmVnaXN0ZXIuICBUaGlzIGlzIG9ubHkgc3RyaWN0bHkgbmVjZXNzYXJ5CisJICAgd2hlbiB3ZSdyZSByZXR1cm5pbmcgYW4gYWdncmVnYXRlIHR5cGUsIGJ1dCBpdCBkb2Vzbid0CisJICAgaHVydCB0byBkbyB0aGlzIGFsbCB0aGUgdGltZSwgYW5kIGl0IHNhdmVzIGEgYnJhbmNoLiAgKi8KKwlsZGkJQChmcCwgIy0yMCksIGdyMworCisJLyogVXNlIHRoZSBmZmlfcHJlcF9hcmdzIHJldHVybiB2YWx1ZSBmb3IgdGhlIG5ldyBzcC4gICovCisJbW92CWdyNCwgc3AKKwkKKwkvKiBDYWxsIHRoZSB0YXJnZXQgZnVuY3Rpb24uICAqLworCWxkaQlAKGZwLCAtMjQpLCBncjQKKyNpZmRlZiBfX0ZSVl9GRFBJQ19fCisJbGRkCUAoZ3I0LCBncjApLCBncjE0CisJY2FsbGwJQChncjE0LCBncjApCisjZWxzZQorCWNhbGxsCUAoZ3I0LCBncjApCisjZW5kaWYJCisKKwkvKiBTdG9yZSB0aGUgcmVzdWx0LiAqLworCWxkaQlAKGZwLCAjLTE2KSwgZ3IxMCAgLyogZmlnLT5mbGFncyAqLworCWxkaQlAKGZwLCAjLTIwKSwgZ3I0ICAgLyogZWNpZi5ydmFsdWUgKi8KKworCS8qIElzIHRoZSByZXR1cm4gdmFsdWUgc3RvcmVkIGluIHR3byByZWdpc3RlcnM/ICAqLworCWNtcGkJZ3IxMCwgIzgsIGljYzAKKwlibmUJaWNjMCwgMCwgLkwyCisJLyogICBZZXMsIHNhdmUgdGhlbS4gICovCisJc3RpCWdyOCwgQChncjQsICMwKQorCXN0aQlncjksIEAoZ3I0LCAjNCkKKwlicmEJLkwzCisuTDI6CisJLyogSXMgdGhlIHJldHVybiB2YWx1ZSBhIHN0cnVjdHVyZT8gICovCisJY21waQlncjEwLCAjLTEsIGljYzAKKwliZXEJaWNjMCwgMCwgLkwzCisJLyogICBObywgc2F2ZSBhIDQgYnl0ZSByZXR1cm4gdmFsdWUuICAqLworCXN0aQlncjgsIEAoZ3I0LCAjMCkKKy5MMzoJCisKKwkvKiBSZXN0b3JlIHRoZSBzdGFjaywgYW5kIHJldHVybi4gICovCisJbGRpCUAoZnAsIDgpLCBncjUKKwlsZAlAKGZwLCBncjApLCBmcAorCWFkZGkJc3AsIzgwLHNwCisJam1wbAlAKGdyNSxncjApCisJLnNpemUgZmZpX2NhbGxfRUFCSSwgLi1mZmlfY2FsbF9FQUJJCisJCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL21veGllL2ZmaS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9tb3hpZS9mZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGNiYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9tb3hpZS9mZmkuYwpAQCAtMCwwICsxLDI3NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChDKSAyMDA5ICBBbnRob255IEdyZWVuCisgICAKKyAgIE1veGllIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKKyAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzICovCisKK3ZvaWQgKmZmaV9wcmVwX2FyZ3MoY2hhciAqc3RhY2ssIGV4dGVuZGVkX2NpZiAqZWNpZikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgIHJlZ2lzdGVyIHZvaWQgKipwX2FyZ3Y7CisgIHJlZ2lzdGVyIGNoYXIgKmFyZ3A7CisgIHJlZ2lzdGVyIGZmaV90eXBlICoqcF9hcmc7CisgIHJlZ2lzdGVyIGludCBjb3VudCA9IDA7CisKKyAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworICBhcmdwID0gc3RhY2s7CisKKyAgZm9yIChpID0gZWNpZi0+Y2lmLT5uYXJncywgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsKKyAgICAgICAoaSAhPSAwKTsKKyAgICAgICBpLS0sIHBfYXJnKyspCisgICAgeworICAgICAgc2l6ZV90IHo7CisgICAgICAKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKworICAgICAgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKwl7CisJICB6ID0gc2l6ZW9mKHZvaWQqKTsKKwkgICoodm9pZCAqKikgYXJncCA9ICpwX2FyZ3Y7CisJfSAKKyAgICAgIC8qICAgICAgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX0ZMT0FUKQorCXsKKwkgIGlmIChjb3VudCA+IDI0KQorCSAgICB7CisJICAgICAgLy8gVGhpcyBpcyBnb2luZyBvbiB0aGUgc3RhY2suICBUdXJuIGl0IGludG8gYSBkb3VibGUuICAKKwkgICAgICAqKGRvdWJsZSAqKSBhcmdwID0gKGRvdWJsZSkgKihmbG9hdCopKCogcF9hcmd2KTsKKwkgICAgICB6ID0gc2l6ZW9mKGRvdWJsZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgKih2b2lkICoqKSBhcmdwID0gKih2b2lkICoqKSgqIHBfYXJndik7CisJfSAgKi8KKyAgICAgIGVsc2UgaWYgKHogPCBzaXplb2YoaW50KSkKKwl7CisJICB6ID0gc2l6ZW9mKGludCk7CisJICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKQorCSAgICB7CisJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICAgICAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAoc2lnbmVkIGludCkqKFNJTlQ4ICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQ4ICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAgICAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAoc2lnbmVkIGludCkqKFNJTlQxNiAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisJCSAgCisJICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgICAgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDE2ICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKwkJICAKKwkgICAgZGVmYXVsdDoKKwkgICAgICBGRklfQVNTRVJUKDApOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoeiA9PSBzaXplb2YoaW50KSkKKwl7CisJICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQzMiAqKSgqIHBfYXJndik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1lbWNweShhcmdwLCAqcF9hcmd2LCB6KTsKKwl9CisgICAgICBwX2FyZ3YrKzsKKyAgICAgIGFyZ3AgKz0gejsKKyAgICAgIGNvdW50ICs9IHo7CisgICAgfQorCisgIHJldHVybiAoc3RhY2sgKyAoKGNvdW50ID4gMjQpID8gMjQgOiBBTElHTl9ET1dOKGNvdW50LCA4KSkpOworfQorCisvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCitmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZl9tYWNoZGVwKGZmaV9jaWYgKmNpZikKK3sKKyAgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIGNpZi0+ZmxhZ3MgPSAtMTsKKyAgZWxzZQorICAgIGNpZi0+ZmxhZ3MgPSBjaWYtPnJ0eXBlLT5zaXplOworCisgIGNpZi0+Ynl0ZXMgPSBBTElHTiAoY2lmLT5ieXRlcywgOCk7CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfRUFCSSh2b2lkICooKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksIAorCQkJICBleHRlbmRlZF9jaWYgKiwgCisJCQkgIHVuc2lnbmVkLCB1bnNpZ25lZCwgCisJCQkgIHVuc2lnbmVkICosIAorCQkJICB2b2lkICgqZm4pKHZvaWQpKTsKKwordm9pZCBmZmlfY2FsbChmZmlfY2lmICpjaWYsIAorCSAgICAgIHZvaWQgKCpmbikodm9pZCksIAorCSAgICAgIHZvaWQgKnJ2YWx1ZSwgCisJICAgICAgdm9pZCAqKmF2YWx1ZSkKK3sKKyAgZXh0ZW5kZWRfY2lmIGVjaWY7CisKKyAgZWNpZi5jaWYgPSBjaWY7CisgIGVjaWYuYXZhbHVlID0gYXZhbHVlOworICAKKyAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybgkqLworICAvKiB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZQkJICAgICAgICAqLworCisgIGlmICgocnZhbHVlID09IE5VTEwpICYmIAorICAgICAgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSkKKyAgICB7CisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKKyAgICAKKyAgCisgIHN3aXRjaCAoY2lmLT5hYmkpIAorICAgIHsKKyAgICBjYXNlIEZGSV9FQUJJOgorICAgICAgZmZpX2NhbGxfRUFCSShmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywgCisJCSAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQoMCk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgZmZpX2Nsb3N1cmVfZWFiaSAodW5zaWduZWQgYXJnMSwgdW5zaWduZWQgYXJnMiwgdW5zaWduZWQgYXJnMywKKwkJICAgICAgIHVuc2lnbmVkIGFyZzQsIHVuc2lnbmVkIGFyZzUsIHVuc2lnbmVkIGFyZzYpCit7CisgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgdHJhbXBvbGluZS4gIFRoZSB0cmFtcG9saW5lIHN0b3dzIGEKKyAgICAgcG9pbnRlciB0byB0aGUgZmZpX2Nsb3N1cmUgb2JqZWN0IGluIGdyNy4gIFdlIG11c3Qgc2F2ZSB0aGlzCisgICAgIHBvaW50ZXIgaW4gYSBwbGFjZSB0aGF0IHdpbGwgcGVyc2lzdCB3aGlsZSB3ZSBkbyBvdXIgd29yay4gICovCisgIHJlZ2lzdGVyIGZmaV9jbG9zdXJlICpjcmVnIF9fYXNtX18gKCJncjciKTsKKyAgZmZpX2Nsb3N1cmUgKmNsb3N1cmUgPSBjcmVnOworCisgIC8qIEFyZ3VtZW50cyB0aGF0IGRvbid0IGZpdCBpbiByZWdpc3RlcnMgYXJlIGZvdW5kIG9uIHRoZSBzdGFjaworICAgICBhdCBhIGZpeGVkIG9mZnNldCBhYm92ZSB0aGUgY3VycmVudCBmcmFtZSBwb2ludGVyLiAgKi8KKyAgcmVnaXN0ZXIgY2hhciAqZnJhbWVfcG9pbnRlciBfX2FzbV9fICgiZnAiKTsKKyAgY2hhciAqc3RhY2tfYXJncyA9IGZyYW1lX3BvaW50ZXIgKyAxNjsKKworICAvKiBMYXkgdGhlIHJlZ2lzdGVyIGFyZ3VtZW50cyBkb3duIGluIGEgY29udGludW91cyBjaHVuayBvZiBtZW1vcnkuICAqLworICB1bnNpZ25lZCByZWdpc3Rlcl9hcmdzWzZdID0KKyAgICB7IGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYgfTsKKworICBmZmlfY2lmICpjaWYgPSBjbG9zdXJlLT5jaWY7CisgIGZmaV90eXBlICoqYXJnX3R5cGVzID0gY2lmLT5hcmdfdHlwZXM7CisgIHZvaWQgKiphdmFsdWUgPSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2Yodm9pZCAqKSk7CisgIGNoYXIgKnB0ciA9IChjaGFyICopIHJlZ2lzdGVyX2FyZ3M7CisgIGludCBpOworCisgIC8qIEZpbmQgdGhlIGFkZHJlc3Mgb2YgZWFjaCBhcmd1bWVudC4gICovCisgIGZvciAoaSA9IDA7IGkgPCBjaWYtPm5hcmdzOyBpKyspCisgICAgeworICAgICAgc3dpdGNoIChhcmdfdHlwZXNbaV0tPnR5cGUpCisJeworCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgIGF2YWx1ZVtpXSA9IHB0ciArIDM7CisJICBicmVhazsKKwljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkgIGF2YWx1ZVtpXSA9IHB0ciArIDI7CisJICBicmVhazsKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgYXZhbHVlW2ldID0gcHRyOworCSAgYnJlYWs7CisJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICBhdmFsdWVbaV0gPSAqKHZvaWQqKilwdHI7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgLyogVGhpcyBpcyBhbiA4LWJ5dGUgdmFsdWUuICAqLworCSAgYXZhbHVlW2ldID0gcHRyOworCSAgcHRyICs9IDQ7CisJICBicmVhazsKKwl9CisgICAgICBwdHIgKz0gNDsKKworICAgICAgLyogSWYgd2UndmUgaGFuZGxlZCBtb3JlIGFyZ3VtZW50cyB0aGFuIGZpdCBpbiByZWdpc3RlcnMsCisJIHN0YXJ0IGxvb2tpbmcgYXQgdGhlIHRob3NlIHBhc3NlZCBvbiB0aGUgc3RhY2suICAqLworICAgICAgaWYgKHB0ciA9PSAoKGNoYXIgKilyZWdpc3Rlcl9hcmdzICsgKDYqNCkpKQorCXB0ciA9IHN0YWNrX2FyZ3M7CisgICAgfQorCisgIC8qIEludm9rZSB0aGUgY2xvc3VyZS4gICovCisgIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICAvKiBUaGUgY2FsbGVyIGFsbG9jYXRlcyBzcGFjZSBmb3IgdGhlIHJldHVybiBzdHJ1Y3R1cmUsIGFuZAorICAgICAgIHBhc3NlcyBhIHBvaW50ZXIgdG8gdGhpcyBzcGFjZSBpbiBncjMuICBVc2UgdGhpcyB2YWx1ZSBkaXJlY3RseQorICAgICAgIGFzIHRoZSByZXR1cm4gdmFsdWUuICAqLworICAgICAgcmVnaXN0ZXIgdm9pZCAqcmV0dXJuX3N0cnVjdF9wdHIgX19hc21fXygiZ3IzIik7CisgICAgICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCByZXR1cm5fc3RydWN0X3B0ciwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlIGFuZCBjYWxsIHRoZSBmdW5jdGlvbi4gICovCisgICAgICBsb25nIGxvbmcgcnZhbHVlOworICAgICAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgJnJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIDQtYnl0ZSBvciBzbWFsbGVyIHJlc3VsdHMgaW4gZ3I4LiAgOC1ieXRlCisJIHZhbHVlcyBhbHNvIHVzZSBncjkuICBXZSBmaWxsIHRoZSBib3RoLCBldmVuIGZvciBzbWFsbCByZXR1cm4KKwkgdmFsdWVzLCBqdXN0IHRvIGF2b2lkIGEgYnJhbmNoLiAgKi8gCisgICAgICBhc20gKCJsZGkgIEAoJTAsICMwKSwgZ3I4IiA6IDogInIiICgmcnZhbHVlKSk7CisgICAgICBhc20gKCJsZGkgIEAoJTAsICMwKSwgZ3I5IiA6IDogInIiICgmKChpbnQgKikgJnJ2YWx1ZSlbMV0pKTsKKyAgICB9Cit9CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmVfbG9jIChmZmlfY2xvc3VyZSogY2xvc3VyZSwKKwkJICAgICAgZmZpX2NpZiogY2lmLAorCQkgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKiwgdm9pZCosIHZvaWQqKiwgdm9pZCopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCSAgICAgIHZvaWQgKmNvZGVsb2MpCit7CisgIHVuc2lnbmVkIGludCAqdHJhbXAgPSAodW5zaWduZWQgaW50ICopICZjbG9zdXJlLT50cmFtcFswXTsKKyAgdW5zaWduZWQgbG9uZyBmbiA9IChsb25nKSBmZmlfY2xvc3VyZV9lYWJpOworICB1bnNpZ25lZCBsb25nIGNscyA9IChsb25nKSBjb2RlbG9jOworICBpbnQgaTsKKworICBmbiA9ICh1bnNpZ25lZCBsb25nKSBmZmlfY2xvc3VyZV9lYWJpOworCisgIHRyYW1wWzBdID0gMHg4Y2ZjMDAwMCArIChmbiAgJiAweGZmZmYpOyAvKiBzZXRsb3MgbG8oZm4pLCBncjYgICAgKi8KKyAgdHJhbXBbMV0gPSAweDhlZmMwMDAwICsgKGNscyAmIDB4ZmZmZik7IC8qIHNldGxvcyBsbyhjbHMpLCBncjcgICAqLworICB0cmFtcFsyXSA9IDB4OGNmODAwMDAgKyAoZm4gID4+IDE2KTsJICAvKiBzZXRoaSBoaShmbiksIGdyNiAgICAgKi8KKyAgdHJhbXBbM10gPSAweDhlZjgwMDAwICsgKGNscyA+PiAxNik7ICAgIC8qIHNldGhpIGhpKGNscyksIGdyNyAgICAqLworICB0cmFtcFs0XSA9IDB4ODAzMDAwMDY7ICAgICAgICAgICAgICAgICAgLyogam1wbCBAKGdyMCwgZ3I2KSAgICAgICovCisKKyAgY2xvc3VyZS0+Y2lmID0gY2lmOworICBjbG9zdXJlLT5mdW4gPSBmdW47CisgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKworICAvKiBDYWNoZSBmbHVzaGluZy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBGRklfVFJBTVBPTElORV9TSVpFOyBpKyspCisgICAgX19hc21fXyB2b2xhdGlsZSAoImRjZiBAKCUwLCUxKVxuXHRpY2kgQCglMiwlMSkiIDo6ICJyIiAodHJhbXApLCAiciIgKGkpLAorCQkgICAgICAiciIgKGNvZGVsb2MpKTsKKworICByZXR1cm4gRkZJX09LOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wYS9mZmkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcGEvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlMmJjNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcGEvZmZpLmMKQEAgLTAsMCArMSw3MTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZmkuYyAtIChjKSAyMDExIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgKGMpIDIwMDggUmVkIEhhdCwgSW5jLgorCSAgIChjKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgICAgICAoYykgMjAwMy0yMDA0IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICAgICAgICAgICAKKyAgIEhQUEEgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKyAgIEhQLVVYIFBBIEFCSSBzdXBwb3J0IAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBST1VORF9VUCh2LCBhKSAgKCgoc2l6ZV90KSh2KSArIChhKSAtIDEpICYgfigoYSkgLSAxKSkKKworI2RlZmluZSBNSU5fU1RBQ0tfU0laRSAgNjQKKyNkZWZpbmUgRklSU1RfQVJHX1NMT1QgIDkKKyNkZWZpbmUgREVCVUdfTEVWRUwgICAwCisKKyNkZWZpbmUgZmxkdyhhZGRyLCBmcHJlZykgXAorICBfX2FzbV9fIHZvbGF0aWxlICgiZmxkdyAwKCUwKSwgJSUiICNmcHJlZyAiTCIgOiA6ICJyIihhZGRyKSA6ICNmcHJlZykKKyNkZWZpbmUgZnN0dyhmcHJlZywgYWRkcikgXAorICBfX2FzbV9fIHZvbGF0aWxlICgiZnN0dyAlJSIgI2ZwcmVnICJMLCAwKCUwKSIgOiA6ICJyIihhZGRyKSkKKyNkZWZpbmUgZmxkZChhZGRyLCBmcHJlZykgXAorICBfX2FzbV9fIHZvbGF0aWxlICgiZmxkZCAwKCUwKSwgJSUiICNmcHJlZyA6IDogInIiKGFkZHIpIDogI2ZwcmVnKQorI2RlZmluZSBmc3RkKGZwcmVnLCBhZGRyKSBcCisgIF9fYXNtX18gdm9sYXRpbGUgKCJmc3RkICUlIiAjZnByZWcgIkwsIDAoJTApIiA6IDogInIiKGFkZHIpKQorCisjZGVmaW5lIGRlYnVnKGx2bCwgeC4uLikgZG8geyBpZiAobHZsIDw9IERFQlVHX0xFVkVMKSB7IHByaW50Zih4KTsgfSB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmZmlfc3RydWN0X3R5cGUoZmZpX3R5cGUgKnQpCit7CisgIHNpemVfdCBzeiA9IHQtPnNpemU7CisKKyAgLyogU21hbGwgc3RydWN0dXJlIHJlc3VsdHMgYXJlIHBhc3NlZCBpbiByZWdpc3RlcnMsCisgICAgIGxhcmdlciBvbmVzIGFyZSBwYXNzZWQgYnkgcG9pbnRlci4gIE5vdGUgdGhhdAorICAgICBzbWFsbCBzdHJ1Y3R1cmVzIG9mIHNpemUgMiwgNCBhbmQgOCBkaWZmZXIgZnJvbQorICAgICB0aGUgY29ycmVzcG9uZGluZyBpbnRlZ2VyIHR5cGVzIGluIHRoYXQgdGhleSBoYXZlCisgICAgIGRpZmZlcmVudCBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLiAgKi8KKworICBpZiAoc3ogPD0gMSkKKyAgICByZXR1cm4gRkZJX1RZUEVfVUlOVDg7CisgIGVsc2UgaWYgKHN6ID09IDIpCisgICAgcmV0dXJuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDI7CisgIGVsc2UgaWYgKHN6ID09IDMpCisgICAgcmV0dXJuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDM7CisgIGVsc2UgaWYgKHN6ID09IDQpCisgICAgcmV0dXJuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDQ7CisgIGVsc2UgaWYgKHN6ID09IDUpCisgICAgcmV0dXJuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDU7CisgIGVsc2UgaWYgKHN6ID09IDYpCisgICAgcmV0dXJuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDY7CisgIGVsc2UgaWYgKHN6ID09IDcpCisgICAgcmV0dXJuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDc7CisgIGVsc2UgaWYgKHN6IDw9IDgpCisgICAgcmV0dXJuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDg7CisgIGVsc2UKKyAgICByZXR1cm4gRkZJX1RZUEVfU1RSVUNUOyAvKiBlbHNlLCB3ZSBwYXNzIGl0IGJ5IHBvaW50ZXIuICAqLworfQorCisvKiBQQSBoYXMgYSBkb3dud2FyZCBncm93aW5nIHN0YWNrLCB3aGljaCBsb29rcyBsaWtlIHRoaXM6CisKKyAgIE9mZnNldAorCVsgVmFyaWFibGUgYXJncyBdCisgICBTUCA9ICg0KihuKzkpKSAgICAgICBhcmcgd29yZCBOCisgICAuLi4KKyAgIFNQLTUyICAgICAgICAgICAgICAgIGFyZyB3b3JkIDQKKwlbIEZpeGVkIGFyZ3MgXQorICAgU1AtNDggICAgICAgICAgICAgICAgYXJnIHdvcmQgMworICAgU1AtNDQgICAgICAgICAgICAgICAgYXJnIHdvcmQgMgorICAgU1AtNDAgICAgICAgICAgICAgICAgYXJnIHdvcmQgMQorICAgU1AtMzYgICAgICAgICAgICAgICAgYXJnIHdvcmQgMAorCVsgRnJhbWUgbWFya2VyIF0KKyAgIC4uLgorICAgU1AtMjAgICAgICAgICAgICAgICAgUlAKKyAgIFNQLTQgICAgICAgICAgICAgICAgIHByZXZpb3VzIFNQCisKKyAgIFRoZSBmaXJzdCBmb3VyIGFyZ3VtZW50IHdvcmRzIG9uIHRoZSBzdGFjayBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieQorICAgdGhlIGNhbGxlZS4gIEluc3RlYWQsIHRoZSBnZW5lcmFsIGFuZCBmbG9hdGluZyByZWdpc3RlcnMgcmVwbGFjZQorICAgdGhlIGZpcnN0IGZvdXIgYXJndW1lbnQgc2xvdHMuICBOb24gRlAgYXJndW1lbnRzIGFyZSBwYXNzZWQgc29sZWx5CisgICBpbiB0aGUgZ2VuZXJhbCByZWdpc3RlcnMuICBGUCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBib3RoIGdlbmVyYWwKKyAgIGFuZCBmbG9hdGluZyByZWdpc3RlcnMgd2hlbiB1c2luZyBsaWJmZmkuCisKKyAgIE5vbi1GUCAzMi1iaXQgYXJncyBhcmUgcGFzc2VkIGluIGdyMjYsIGdyMjUsIGdyMjQgYW5kIGdyMjMuCisgICBOb24tRlAgNjQtYml0IGFyZ3MgYXJlIHBhc3NlZCBpbiByZWdpc3RlciBwYWlycywgc3RhcnRpbmcKKyAgIG9uIGFuIG9kZCBudW1iZXJlZCByZWdpc3RlciAoaS5lLiByMjUrcjI2IGFuZCByMjMrcjI0KS4KKyAgIEZQIDMyLWJpdCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBmcjRMLCBmcjVMLCBmcjZMIGFuZCBmcjdMLgorICAgRlAgNjQtYml0IGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIGZyNSBhbmQgZnI3LgorCisgICBUaGUgcmVnaXN0ZXJzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHN0YWNrIHNsb3RzLgorICAgVGhpcyBhbGxvd3MgdGhlIGNhbGxlZSB0byBzYXZlIGl0cyBhcmd1bWVudHMgb24gdGhlIHN0YWNrIGlmCisgICBuZWNlc3Nhcnk6CisKKyAgIGFyZyB3b3JkIDMgLT4gZ3IyMyBvciBmcjdMCisgICBhcmcgd29yZCAyIC0+IGdyMjQgb3IgZnI2TCBvciBmcjdSCisgICBhcmcgd29yZCAxIC0+IGdyMjUgb3IgZnI1TAorICAgYXJnIHdvcmQgMCAtPiBncjI2IG9yIGZyNEwgb3IgZnI1UgorCisgICBOb3RlIHRoYXQgZnI0UiBhbmQgZnI2UiBhcmUgbmV2ZXIgdXNlZCBmb3IgYXJndW1lbnRzIChpLmUuLAorICAgZG91YmxlcyBhcmUgbm90IHBhc3NlZCBpbiBmcjQgb3IgZnI2KS4KKworICAgVGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIG9uIHRoZSBzdGFjayBzdGFydGluZyBhdCBTUC01MiwKKyAgIGJ1dCA2NC1iaXQgYXJndW1lbnRzIG5lZWQgdG8gYmUgYWxpZ25lZCB0byBhbiA4LWJ5dGUgYm91bmRhcnkKKworICAgVGhpcyBtZWFucyB3ZSBjYW4gaGF2ZSBob2xlcyBlaXRoZXIgaW4gdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24sCisgICBvciBpbiB0aGUgc3RhY2suICAqLworCisvKiBmZmlfcHJlcF9hcmdzIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibHkgcm91dGluZSBvbmNlIHN0YWNrIHNwYWNlCisgICBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cworCisgICBUaGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwdXQgZXZlcnl0aGluZyBpbnRvIHRoZSBzdGFjayBmcmFtZQorICAgKHdoaWNoIHdhcyBhbGxvY2F0ZWQgYnkgdGhlIGFzbSByb3V0aW5lKSwgYW5kIG9uIHJldHVybgorICAgdGhlIGFzbSByb3V0aW5lIHdpbGwgbG9hZCB0aGUgYXJndW1lbnRzIHRoYXQgc2hvdWxkIGJlCisgICBwYXNzZWQgYnkgcmVnaXN0ZXIgaW50byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJzCisKKyAgIE5PVEU6IFdlIGxvYWQgZmxvYXRpbmcgcG9pbnQgYXJncyBpbiB0aGlzIGZ1bmN0aW9uLi4uIHRoYXQgbWVhbnMgd2UKKyAgIGFzc3VtZSBnY2Mgd2lsbCBub3QgbWVzcyB3aXRoIGZwIHJlZ3MgaW4gaGVyZS4gICovCisKK3ZvaWQgZmZpX3ByZXBfYXJnc19wYTMyKFVJTlQzMiAqc3RhY2ssIGV4dGVuZGVkX2NpZiAqZWNpZiwgdW5zaWduZWQgYnl0ZXMpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworICByZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOworICByZWdpc3RlciB2b2lkICoqcF9hcmd2OworICB1bnNpZ25lZCBpbnQgc2xvdCA9IEZJUlNUX0FSR19TTE9UOworICBjaGFyICpkZXN0X2NweTsKKyAgc2l6ZV90IGxlbjsKKworICBkZWJ1ZygxLCAiJXM6IHN0YWNrID0gJXAsIGVjaWYgPSAlcCwgYnl0ZXMgPSAldVxuIiwgX19GVU5DVElPTl9fLCBzdGFjaywKKwllY2lmLCBieXRlcyk7CisKKyAgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsKKyAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworCisgIGZvciAoaSA9IDA7IGkgPCBlY2lmLT5jaWYtPm5hcmdzOyBpKyspCisgICAgeworICAgICAgaW50IHR5cGUgPSAoKnBfYXJnKS0+dHlwZTsKKworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCSAgKihTSU5UMzIgKikoc3RhY2sgLSBzbG90KSA9ICooU0lOVDggKikoKnBfYXJndik7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJICAqKFVJTlQzMiAqKShzdGFjayAtIHNsb3QpID0gKihVSU5UOCAqKSgqcF9hcmd2KTsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAqKFNJTlQzMiAqKShzdGFjayAtIHNsb3QpID0gKihTSU5UMTYgKikoKnBfYXJndik7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgKihVSU5UMzIgKikoc3RhY2sgLSBzbG90KSA9ICooVUlOVDE2ICopKCpwX2FyZ3YpOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJICBkZWJ1ZygzLCAiU3RvcmluZyBVSU5UMzIgJXUgaW4gc2xvdCAldVxuIiwgKihVSU5UMzIgKikoKnBfYXJndiksCisJCXNsb3QpOworCSAgKihVSU5UMzIgKikoc3RhY2sgLSBzbG90KSA9ICooVUlOVDMyICopKCpwX2FyZ3YpOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKwljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKwkgIC8qIEFsaWduIHNsb3QgZm9yIDY0LWJpdCB0eXBlLiAgKi8KKwkgIHNsb3QgKz0gKHNsb3QgJiAxKSA/IDEgOiAyOworCSAgKihVSU5UNjQgKikoc3RhY2sgLSBzbG90KSA9ICooVUlOVDY0ICopKCpwX2FyZ3YpOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgLyogRmlyc3QgNCBhcmdzIGdvIGluIGZyNEwgLSBmcjdMLiAgKi8KKwkgIGRlYnVnKDMsICJTdG9yaW5nIFVJTlQzMihmbG9hdCkgaW4gc2xvdCAldVxuIiwgc2xvdCk7CisJICAqKFVJTlQzMiAqKShzdGFjayAtIHNsb3QpID0gKihVSU5UMzIgKikoKnBfYXJndik7CisJICBzd2l0Y2ggKHNsb3QgLSBGSVJTVF9BUkdfU0xPVCkKKwkgICAgeworCSAgICAvKiBGaXJzdCA0IGFyZ3MgZ28gaW4gZnI0TCAtIGZyN0wuICAqLworCSAgICBjYXNlIDA6IGZsZHcoc3RhY2sgLSBzbG90LCBmcjQpOyBicmVhazsKKwkgICAgY2FzZSAxOiBmbGR3KHN0YWNrIC0gc2xvdCwgZnI1KTsgYnJlYWs7CisJICAgIGNhc2UgMjogZmxkdyhzdGFjayAtIHNsb3QsIGZyNik7IGJyZWFrOworCSAgICBjYXNlIDM6IGZsZHcoc3RhY2sgLSBzbG90LCBmcjcpOyBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgIC8qIEFsaWduIHNsb3QgZm9yIDY0LWJpdCB0eXBlLiAgKi8KKwkgIHNsb3QgKz0gKHNsb3QgJiAxKSA/IDEgOiAyOworCSAgZGVidWcoMywgIlN0b3JpbmcgVUlOVDY0KGRvdWJsZSkgYXQgc2xvdCAldVxuIiwgc2xvdCk7CisJICAqKFVJTlQ2NCAqKShzdGFjayAtIHNsb3QpID0gKihVSU5UNjQgKikoKnBfYXJndik7CisJICBzd2l0Y2ggKHNsb3QgLSBGSVJTVF9BUkdfU0xPVCkKKwkgICAgeworCSAgICAgIC8qIEZpcnN0IDIgYXJncyBnbyBpbiBmcjUsIGZyNy4gICovCisJICAgICAgY2FzZSAxOiBmbGRkKHN0YWNrIC0gc2xvdCwgZnI1KTsgYnJlYWs7CisJICAgICAgY2FzZSAzOiBmbGRkKHN0YWNrIC0gc2xvdCwgZnI3KTsgYnJlYWs7CisJICAgIH0KKwkgIGJyZWFrOworCisjaWZkZWYgUEFfSFBVWAorCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKwkgIC8qIExvbmcgZG91YmxlcyBhcmUgcGFzc2VkIGluIHRoZSBzYW1lIG1hbm5lciBhcyBzdHJ1Y3R1cmVzCisJICAgICBsYXJnZXIgdGhhbiA4IGJ5dGVzLiAgKi8KKwkgICooVUlOVDMyICopKHN0YWNrIC0gc2xvdCkgPSAoVUlOVDMyKSgqcF9hcmd2KTsKKwkgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKworCSAgLyogU3RydWN0cyBzbWFsbGVyIG9yIGVxdWFsIHRoYW4gNCBieXRlcyBhcmUgcGFzc2VkIGluIG9uZQorCSAgICAgcmVnaXN0ZXIuIFN0cnVjdHMgc21hbGxlciBvciBlcXVhbCA4IGJ5dGVzIGFyZSBwYXNzZWQgaW4gdHdvCisJICAgICByZWdpc3RlcnMuIExhcmdlciBzdHJ1Y3R1cmVzIGFyZSBwYXNzZWQgYnkgcG9pbnRlci4gICovCisKKwkgIGxlbiA9ICgqcF9hcmcpLT5zaXplOworCSAgaWYgKGxlbiA8PSA0KQorCSAgICB7CisJICAgICAgZGVzdF9jcHkgPSAoY2hhciAqKShzdGFjayAtIHNsb3QpICsgNCAtIGxlbjsKKwkgICAgICBtZW1jcHkoZGVzdF9jcHksIChjaGFyICopKnBfYXJndiwgbGVuKTsKKwkgICAgfQorCSAgZWxzZSBpZiAobGVuIDw9IDgpCisJICAgIHsKKwkgICAgICBzbG90ICs9IChzbG90ICYgMSkgPyAxIDogMjsKKwkgICAgICBkZXN0X2NweSA9IChjaGFyICopKHN0YWNrIC0gc2xvdCkgKyA4IC0gbGVuOworCSAgICAgIG1lbWNweShkZXN0X2NweSwgKGNoYXIgKikqcF9hcmd2LCBsZW4pOworCSAgICB9CisJICBlbHNlCisJICAgICooVUlOVDMyICopKHN0YWNrIC0gc2xvdCkgPSAoVUlOVDMyKSgqcF9hcmd2KTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIEZGSV9BU1NFUlQoMCk7CisJfQorCisgICAgICBzbG90Kys7CisgICAgICBwX2FyZysrOworICAgICAgcF9hcmd2Kys7CisgICAgfQorCisgIC8qIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgbWVzcyB1cCBhbmQgc2NyaWJibGUgb24gdGhlIHN0YWNrLiAgKi8KKyAgeworICAgIHVuc2lnbmVkIGludCBuOworCisgICAgZGVidWcoNSwgIlN0YWNrIHNldHVwOlxuIik7CisgICAgZm9yIChuID0gMDsgbiA8IChieXRlcyArIDMpIC8gNDsgbisrKQorICAgICAgeworCWlmICgobiU0KSA9PSAwKSB7IGRlYnVnKDUsICJcbiUwOHg6ICIsICh1bnNpZ25lZCBpbnQpKHN0YWNrIC0gbikpOyB9CisJZGVidWcoNSwgIiUwOHggIiwgKihzdGFjayAtIG4pKTsKKyAgICAgIH0KKyAgICBkZWJ1Zyg1LCAiXG4iKTsKKyAgfQorCisgIEZGSV9BU1NFUlQoc2xvdCAqIDQgPD0gYnl0ZXMpOworCisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgZmZpX3NpemVfc3RhY2tfcGEzMihmZmlfY2lmICpjaWYpCit7CisgIGZmaV90eXBlICoqcHRyOworICBpbnQgaTsKKyAgaW50IHogPSAwOyAvKiAjIHN0YWNrIHNsb3RzICovCisKKyAgZm9yIChwdHIgPSBjaWYtPmFyZ190eXBlcywgaSA9IDA7IGkgPCBjaWYtPm5hcmdzOyBwdHIrKywgaSsrKQorICAgIHsKKyAgICAgIGludCB0eXBlID0gKCpwdHIpLT50eXBlOworCisgICAgICBzd2l0Y2ggKHR5cGUpCisJeworCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCWNhc2UgRkZJX1RZUEVfVUlOVDY0OgorCWNhc2UgRkZJX1RZUEVfU0lOVDY0OgorCSAgeiArPSAyICsgKHogJiAxKTsgLyogbXVzdCBzdGFydCBvbiBldmVuIHJlZ3MsIHNvIHdlIG1heSB3YXN0ZSBvbmUgKi8KKwkgIGJyZWFrOworCisjaWZkZWYgUEFfSFBVWAorCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyNlbmRpZgorCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgeiArPSAxOyAvKiBwYXNzIGJ5IHB0ciwgY2FsbGVlIHdpbGwgY29weSAqLworCSAgYnJlYWs7CisKKwlkZWZhdWx0OiAvKiA8PSAzMi1iaXQgdmFsdWVzICovCisJICB6Kys7CisJfQorICAgIH0KKworICAvKiBXZSBjYW4gZml0IHVwIHRvIDYgYXJncyBpbiB0aGUgZGVmYXVsdCA2NC1ieXRlIHN0YWNrIGZyYW1lLAorICAgICBpZiB3ZSBuZWVkIG1vcmUsIHdlIG5lZWQgbW9yZSBzdGFjay4gICovCisgIGlmICh6IDw9IDYpCisgICAgY2lmLT5ieXRlcyA9IE1JTl9TVEFDS19TSVpFOyAvKiBtaW4gc3RhY2sgc2l6ZSAqLworICBlbHNlCisgICAgY2lmLT5ieXRlcyA9IDY0ICsgUk9VTkRfVVAoKHogLSA2KSAqIHNpemVvZihVSU5UMzIpLCBNSU5fU1RBQ0tfU0laRSk7CisKKyAgZGVidWcoMywgIkNhbGN1bGF0ZWQgc3RhY2sgc2l6ZSBpcyAldSBieXRlc1xuIiwgY2lmLT5ieXRlcyk7Cit9CisKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcuICAqLworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpCit7CisgIC8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZyAqLworICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorICAgICAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgIGJyZWFrOworCisjaWZkZWYgUEFfSFBVWAorICAgIGNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyAgICAgIC8qIExvbmcgZG91YmxlcyBhcmUgdHJlYXRlZCBsaWtlIGEgc3RydWN0dXJlLiAgKi8KKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TVFJVQ1Q7CisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICAvKiBGb3IgdGhlIHJldHVybiB0eXBlIHdlIGhhdmUgdG8gY2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZXMuCisJIElmIHRoZSBzaXplIGlzIHNtYWxsZXIgb3IgZXF1YWwgNCBieXRlcywgdGhlIHJlc3VsdCBpcyBnaXZlbiBiYWNrCisJIGluIG9uZSByZWdpc3Rlci4gSWYgdGhlIHNpemUgaXMgc21hbGxlciBvciBlcXVhbCA4IGJ5dGVzIHRoYW4gd2UKKwkgcmV0dXJuIHRoZSByZXN1bHQgaW4gdHdvIHJlZ2lzdGVycy4gQnV0IGlmIHRoZSBzaXplIGlzIGJpZ2dlciB0aGFuCisJIDggYnl0ZXMsIHdlIHdvcmsgd2l0aCBwb2ludGVycy4gICovCisgICAgICBjaWYtPmZsYWdzID0gZmZpX3N0cnVjdF90eXBlKGNpZi0+cnR5cGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9VSU5UNjQ7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfSU5UOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIEx1Y2t5IHVzLCBiZWNhdXNlIG9mIHRoZSB1bmlxdWUgUEEgQUJJIHdlIGdldCB0byBkbyBvdXIKKyAgICAgb3duIHN0YWNrIHNpemluZy4gICovCisgIHN3aXRjaCAoY2lmLT5hYmkpCisgICAgeworICAgIGNhc2UgRkZJX1BBMzI6CisgICAgICBmZmlfc2l6ZV9zdGFja19wYTMyKGNpZik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBGRklfT0s7Cit9CisKK2V4dGVybiB2b2lkIGZmaV9jYWxsX3BhMzIodm9pZCAoKikoVUlOVDMyICosIGV4dGVuZGVkX2NpZiAqLCB1bnNpZ25lZCksCisJCQkgIGV4dGVuZGVkX2NpZiAqLCB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkICosCisJCQkgIHZvaWQgKCpmbikodm9pZCkpOworCit2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisKKyAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybgorICAgICB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZS4gICovCisKKyAgaWYgKHJ2YWx1ZSA9PSBOVUxMCisjaWZkZWYgUEFfSFBVWAorICAgICAgJiYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisJICB8fCBjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpKQorI2Vsc2UKKyAgICAgICYmIGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorI2VuZGlmCisgICAgeworICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSk7CisgICAgfQorICBlbHNlCisgICAgZWNpZi5ydmFsdWUgPSBydmFsdWU7CisKKworICBzd2l0Y2ggKGNpZi0+YWJpKQorICAgIHsKKyAgICBjYXNlIEZGSV9QQTMyOgorICAgICAgZGVidWcoMywgIkNhbGxpbmcgZmZpX2NhbGxfcGEzMjogZWNpZj0lcCwgYnl0ZXM9JXUsIGZsYWdzPSV1LCBydmFsdWU9JXAsIGZuPSVwXG4iLCAmZWNpZiwgY2lmLT5ieXRlcywgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsICh2b2lkICopZm4pOworICAgICAgZmZpX2NhbGxfcGEzMihmZmlfcHJlcF9hcmdzX3BhMzIsICZlY2lmLCBjaWYtPmJ5dGVzLAorCQkgICAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisjaWYgRkZJX0NMT1NVUkVTCisvKiBUaGlzIGlzIG1vcmUtb3ItbGVzcyBhbiBpbnZlcnNlIG9mIGZmaV9jYWxsIC0tIHdlIGhhdmUgYXJndW1lbnRzIG9uCisgICB0aGUgc3RhY2ssIGFuZCB3ZSBuZWVkIHRvIGZpbGwgdGhlbSBpbnRvIGEgY2lmIHN0cnVjdHVyZSBhbmQgaW52b2tlCisgICB0aGUgdXNlciBmdW5jdGlvbi4gVGhpcyByZWFsbHkgb3VnaHQgdG8gYmUgaW4gYXNtIHRvIG1ha2Ugc3VyZQorICAgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgZG8gdGhpbmdzIHdlIGRvbid0IGV4cGVjdC4gICovCitmZmlfc3RhdHVzIGZmaV9jbG9zdXJlX2lubmVyX3BhMzIoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsIFVJTlQzMiAqc3RhY2spCit7CisgIGZmaV9jaWYgKmNpZjsKKyAgdm9pZCAqKmF2YWx1ZTsKKyAgdm9pZCAqcnZhbHVlOworICBVSU5UMzIgcmV0WzJdOyAvKiBmdW5jdGlvbiBjYW4gcmV0dXJuIHVwIHRvIDY0LWJpdHMgaW4gcmVnaXN0ZXJzICovCisgIGZmaV90eXBlICoqcF9hcmc7CisgIGNoYXIgKnRtcDsKKyAgaW50IGksIGF2bjsKKyAgdW5zaWduZWQgaW50IHNsb3QgPSBGSVJTVF9BUkdfU0xPVDsKKyAgcmVnaXN0ZXIgVUlOVDMyIHIyOCBhc20oInIyOCIpOworCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKworICAvKiBJZiByZXR1cm5pbmcgdmlhIHN0cnVjdHVyZSwgY2FsbGVlIHdpbGwgd3JpdGUgdG8gb3VyIHBvaW50ZXIuICAqLworICBpZiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgcnZhbHVlID0gKHZvaWQgKilyMjg7CisgIGVsc2UKKyAgICBydmFsdWUgPSAmcmV0WzBdOworCisgIGF2YWx1ZSA9ICh2b2lkICoqKWFsbG9jYShjaWYtPm5hcmdzICogRkZJX1NJWkVPRl9BUkcpOworICBhdm4gPSBjaWYtPm5hcmdzOworICBwX2FyZyA9IGNpZi0+YXJnX3R5cGVzOworCisgIGZvciAoaSA9IDA7IGkgPCBhdm47IGkrKykKKyAgICB7CisgICAgICBpbnQgdHlwZSA9ICgqcF9hcmcpLT50eXBlOworCisgICAgICBzd2l0Y2ggKHR5cGUpCisJeworCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJY2FzZSBGRklfVFlQRV9VSU5UODoKKwljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJICBhdmFsdWVbaV0gPSAoY2hhciAqKShzdGFjayAtIHNsb3QpICsgc2l6ZW9mKFVJTlQzMikgLSAoKnBfYXJnKS0+c2l6ZTsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJICBzbG90ICs9IChzbG90ICYgMSkgPyAxIDogMjsKKwkgIGF2YWx1ZVtpXSA9ICh2b2lkICopKHN0YWNrIC0gc2xvdCk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRkxPQVQ6CisjaWZkZWYgUEFfTElOVVgKKwkgIC8qIFRoZSBjbG9zdXJlIGNhbGwgaXMgaW5kaXJlY3QuICBJbiBMaW51eCwgZmxvYXRpbmcgcG9pbnQKKwkgICAgIGFyZ3VtZW50cyBpbiBpbmRpcmVjdCBjYWxscyB3aXRoIGEgcHJvdG90eXBlIGFyZSBwYXNzZWQKKwkgICAgIGluIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaW5zdGVhZCBvZiB0aGUgZ2VuZXJhbAorCSAgICAgcmVnaXN0ZXJzLiAgU28sIHdlIG5lZWQgdG8gcmVwbGFjZSB3aGF0IHdhcyBwcmV2aW91c2x5CisJICAgICBzdG9yZWQgaW4gdGhlIGN1cnJlbnQgc2xvdCB3aXRoIHRoZSB2YWx1ZSBpbiB0aGUKKwkgICAgIGNvcnJlc3BvbmRpbmcgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLworCSAgc3dpdGNoIChzbG90IC0gRklSU1RfQVJHX1NMT1QpCisJICAgIHsKKwkgICAgY2FzZSAwOiBmc3R3KGZyNCwgKHZvaWQgKikoc3RhY2sgLSBzbG90KSk7IGJyZWFrOworCSAgICBjYXNlIDE6IGZzdHcoZnI1LCAodm9pZCAqKShzdGFjayAtIHNsb3QpKTsgYnJlYWs7CisJICAgIGNhc2UgMjogZnN0dyhmcjYsICh2b2lkICopKHN0YWNrIC0gc2xvdCkpOyBicmVhazsKKwkgICAgY2FzZSAzOiBmc3R3KGZyNywgKHZvaWQgKikoc3RhY2sgLSBzbG90KSk7IGJyZWFrOworCSAgICB9CisjZW5kaWYKKwkgIGF2YWx1ZVtpXSA9ICh2b2lkICopKHN0YWNrIC0gc2xvdCk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgc2xvdCArPSAoc2xvdCAmIDEpID8gMSA6IDI7CisjaWZkZWYgUEFfTElOVVgKKwkgIC8qIFNlZSBwcmV2aW91cyBjb21tZW50IGZvciBGRklfVFlQRV9GTE9BVC4gICovCisJICBzd2l0Y2ggKHNsb3QgLSBGSVJTVF9BUkdfU0xPVCkKKwkgICAgeworCSAgICBjYXNlIDE6IGZzdGQoZnI1LCAodm9pZCAqKShzdGFjayAtIHNsb3QpKTsgYnJlYWs7CisJICAgIGNhc2UgMzogZnN0ZChmcjcsICh2b2lkICopKHN0YWNrIC0gc2xvdCkpOyBicmVhazsKKwkgICAgfQorI2VuZGlmCisJICBhdmFsdWVbaV0gPSAodm9pZCAqKShzdGFjayAtIHNsb3QpOworCSAgYnJlYWs7CisKKyNpZmRlZiBQQV9IUFVYCisJY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgLyogTG9uZyBkb3VibGVzIGFyZSB0cmVhdGVkIGxpa2UgYSBiaWcgc3RydWN0dXJlLiAgKi8KKwkgIGF2YWx1ZVtpXSA9ICh2b2lkICopICooc3RhY2sgLSBzbG90KTsKKwkgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIC8qIFN0cnVjdHMgc21hbGxlciBvciBlcXVhbCB0aGFuIDQgYnl0ZXMgYXJlIHBhc3NlZCBpbiBvbmUKKwkgICAgIHJlZ2lzdGVyLiBTdHJ1Y3RzIHNtYWxsZXIgb3IgZXF1YWwgOCBieXRlcyBhcmUgcGFzc2VkIGluIHR3bworCSAgICAgcmVnaXN0ZXJzLiBMYXJnZXIgc3RydWN0dXJlcyBhcmUgcGFzc2VkIGJ5IHBvaW50ZXIuICAqLworCSAgaWYoKCpwX2FyZyktPnNpemUgPD0gNCkKKwkgICAgeworCSAgICAgIGF2YWx1ZVtpXSA9ICh2b2lkICopKHN0YWNrIC0gc2xvdCkgKyBzaXplb2YoVUlOVDMyKSAtCisJCSgqcF9hcmcpLT5zaXplOworCSAgICB9CisJICBlbHNlIGlmICgoKnBfYXJnKS0+c2l6ZSA8PSA4KQorCSAgICB7CisJICAgICAgc2xvdCArPSAoc2xvdCAmIDEpID8gMSA6IDI7CisJICAgICAgYXZhbHVlW2ldID0gKHZvaWQgKikoc3RhY2sgLSBzbG90KSArIHNpemVvZihVSU5UNjQpIC0KKwkJKCpwX2FyZyktPnNpemU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYXZhbHVlW2ldID0gKHZvaWQgKikgKihzdGFjayAtIHNsb3QpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgRkZJX0FTU0VSVCgwKTsKKwl9CisKKyAgICAgIHNsb3QrKzsKKyAgICAgIHBfYXJnKys7CisgICAgfQorCisgIC8qIEludm9rZSB0aGUgY2xvc3VyZS4gICovCisgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIGRlYnVnKDMsICJhZnRlciBjYWxsaW5nIGZ1bmN0aW9uLCByZXRbMF0gPSAlMDh4LCByZXRbMV0gPSAlMDh4XG4iLCByZXRbMF0sCisJcmV0WzFdKTsKKworICAvKiBTdG9yZSB0aGUgcmVzdWx0IHVzaW5nIHRoZSBsb3dlciAyIGJ5dGVzIG9mIHRoZSBmbGFncy4gICovCisgIHN3aXRjaCAoY2lmLT5mbGFncykKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKyAgICAgICooc3RhY2sgLSBGSVJTVF9BUkdfU0xPVCkgPSAoVUlOVDgpKHJldFswXSA+PiAyNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorICAgICAgKihzdGFjayAtIEZJUlNUX0FSR19TTE9UKSA9IChTSU5UOCkocmV0WzBdID4+IDI0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgICAgKihzdGFjayAtIEZJUlNUX0FSR19TTE9UKSA9IChVSU5UMTYpKHJldFswXSA+PiAxNik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICAgICooc3RhY2sgLSBGSVJTVF9BUkdfU0xPVCkgPSAoU0lOVDE2KShyZXRbMF0gPj4gMTYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9JTlQ6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgICAqKHN0YWNrIC0gRklSU1RfQVJHX1NMT1QpID0gcmV0WzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICAqKHN0YWNrIC0gRklSU1RfQVJHX1NMT1QpID0gcmV0WzBdOworICAgICAgKihzdGFjayAtIEZJUlNUX0FSR19TTE9UIC0gMSkgPSByZXRbMV07CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorICAgICAgZmxkZChydmFsdWUsIGZyNCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgICBmbGR3KHJ2YWx1ZSwgZnI0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICAvKiBEb24ndCBuZWVkIGEgcmV0dXJuIHZhbHVlLCBkb25lIGJ5IGNhbGxlci4gICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfU01BTExfU1RSVUNUMjoKKyAgICBjYXNlIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDM6CisgICAgY2FzZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q0OgorICAgICAgdG1wID0gKHZvaWQqKShzdGFjayAtICBGSVJTVF9BUkdfU0xPVCk7CisgICAgICB0bXAgKz0gNCAtIGNpZi0+cnR5cGUtPnNpemU7CisgICAgICBtZW1jcHkoKHZvaWQqKXRtcCwgJnJldFswXSwgY2lmLT5ydHlwZS0+c2l6ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfU01BTExfU1RSVUNUNToKKyAgICBjYXNlIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDY6CisgICAgY2FzZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q3OgorICAgIGNhc2UgRkZJX1RZUEVfU01BTExfU1RSVUNUODoKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgcmV0MlsyXTsKKwlpbnQgb2ZmOworCisJLyogUmlnaHQganVzdGlmeSByZXRbMF0gYW5kIHJldFsxXSAqLworCXN3aXRjaCAoY2lmLT5mbGFncykKKwkgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q1OiBvZmYgPSAzOyBicmVhazsKKwkgICAgY2FzZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q2OiBvZmYgPSAyOyBicmVhazsKKwkgICAgY2FzZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q3OiBvZmYgPSAxOyBicmVhazsKKwkgICAgZGVmYXVsdDogb2ZmID0gMDsgYnJlYWs7CisJICB9CisKKwltZW1zZXQgKHJldDIsIDAsIHNpemVvZiAocmV0MikpOworCW1lbWNweSAoKGNoYXIgKilyZXQyICsgb2ZmLCByZXQsIDggLSBvZmYpOworCisJKihzdGFjayAtIEZJUlNUX0FSR19TTE9UKSA9IHJldDJbMF07CisJKihzdGFjayAtIEZJUlNUX0FSR19TTE9UIC0gMSkgPSByZXQyWzFdOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX1BPSU5URVI6CisgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZGVidWcoMCwgImFzc2VydCB3aXRoIGNpZi0+ZmxhZ3M6ICVkXG4iLGNpZi0+ZmxhZ3MpOworICAgICAgRkZJX0FTU0VSVCgwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIEZGSV9PSzsKK30KKworLyogRmlsbCBpbiBhIGNsb3N1cmUgdG8gcmVmZXIgdG8gdGhlIHNwZWNpZmllZCBmdW4gYW5kIHVzZXJfZGF0YS4KKyAgIGNpZiBzcGVjaWZpZXMgdGhlIGFyZ3VtZW50IGFuZCByZXN1bHQgdHlwZXMgZm9yIGZ1bi4KKyAgIFRoZSBjaWYgbXVzdCBhbHJlYWR5IGJlIHByZXAnZWQuICAqLworCitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV9wYTMyKHZvaWQpOworCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqIGNsb3N1cmUsCisJCSAgICAgIGZmaV9jaWYqIGNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkgICAgICB2b2lkICpjb2RlbG9jKQoreworICBVSU5UMzIgKnRyYW1wID0gKFVJTlQzMiAqKShjbG9zdXJlLT50cmFtcCk7CisjaWZkZWYgUEFfSFBVWAorICBVSU5UMzIgKnRtcDsKKyNlbmRpZgorCisgIGlmIChjaWYtPmFiaSAhPSBGRklfUEEzMikKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisKKyAgLyogTWFrZSBhIHNtYWxsIHRyYW1wb2xpbmUgdGhhdCB3aWxsIGJyYW5jaCB0byBvdXIKKyAgICAgaGFuZGxlciBmdW5jdGlvbi4gVXNlIFBDLXJlbGF0aXZlIGFkZHJlc3NpbmcuICAqLworCisjaWZkZWYgUEFfTElOVVgKKyAgdHJhbXBbMF0gPSAweGVhYTAwMDAwOyAvKiBiLGwgLis4LCVyMjEgICAgICAgIDsgJXIyMSA8LSBwYys4ICovCisgIHRyYW1wWzFdID0gMHhkNmEwMWMxZTsgLyogZGVwaSAwLDMxLDIsJXIyMSAgICA7IG1hc2sgcHJpdiBiaXRzICovCisgIHRyYW1wWzJdID0gMHg0YWExMDAyODsgLyogbGR3IDIwKCVyMjEpLCVyMSAgICA7IGxvYWQgcGxhYmVsICovCisgIHRyYW1wWzNdID0gMHgzNmI1M2ZmMTsgLyogbGRvIC04KCVyMjEpLCVyMjEgICA7IGdldCBjbG9zdXJlIGFkZHIgKi8KKyAgdHJhbXBbNF0gPSAweDBjMjAxMDk2OyAvKiBsZHcgMCglcjEpLCVyMjIgICAgIDsgYWRkcmVzcyBvZiBoYW5kbGVyICovCisgIHRyYW1wWzVdID0gMHhlYWMwYzAwMDsgLyogYnYlcjAoJXIyMikgICAgICAgICA7IGJyYW5jaCB0byBoYW5kbGVyICovCisgIHRyYW1wWzZdID0gMHgwYzI4MTA5MzsgLyogbGR3IDQoJXIxKSwlcjE5ICAgICA7IEdQIG9mIGhhbmRsZXIgKi8KKyAgdHJhbXBbN10gPSAoKFVJTlQzMikoZmZpX2Nsb3N1cmVfcGEzMikgJiB+Mik7CisKKyAgLyogRmx1c2ggZC9pY2FjaGUgLS0gaGF2ZSB0byBmbHVzaCB1cCAyIHR3byBsaW5lcyBiZWNhdXNlIG9mCisgICAgIGFsaWdubWVudC4gICovCisgIF9fYXNtX18gdm9sYXRpbGUoCisJCSAgICJmZGMgMCglMClcblx0IgorCQkgICAiZmRjICUxKCUwKVxuXHQiCisJCSAgICJmaWMgMCglJXNyNCwgJTApXG5cdCIKKwkJICAgImZpYyAlMSglJXNyNCwgJTApXG5cdCIKKwkJICAgInN5bmNcblx0IgorCQkgICAibm9wXG5cdCIKKwkJICAgIm5vcFxuXHQiCisJCSAgICJub3Bcblx0IgorCQkgICAibm9wXG5cdCIKKwkJICAgIm5vcFxuXHQiCisJCSAgICJub3Bcblx0IgorCQkgICAibm9wXG4iCisJCSAgIDoKKwkJICAgOiAiciIoKHVuc2lnbmVkIGxvbmcpdHJhbXAgJiB+MzEpLAorCQkgICAgICJyIigzMiAvKiBzdHJpZGUgKi8pCisJCSAgIDogIm1lbW9yeSIpOworI2VuZGlmCisKKyNpZmRlZiBQQV9IUFVYCisgIHRyYW1wWzBdID0gMHhlYWEwMDAwMDsgLyogYixsIC4rOCwlcjIxICAgICAgICA7ICVyMjEgPC0gcGMrOCAgKi8KKyAgdHJhbXBbMV0gPSAweGQ2YTAxYzFlOyAvKiBkZXBpIDAsMzEsMiwlcjIxICAgIDsgbWFzayBwcml2IGJpdHMgICovCisgIHRyYW1wWzJdID0gMHg0YWExMDAzODsgLyogbGR3IDI4KCVyMjEpLCVyMSAgICA7IGxvYWQgcGxhYmVsICAqLworICB0cmFtcFszXSA9IDB4MzZiNTNmZjE7IC8qIGxkbyAtOCglcjIxKSwlcjIxICAgOyBnZXQgY2xvc3VyZSBhZGRyICAqLworICB0cmFtcFs0XSA9IDB4MGMyMDEwOTY7IC8qIGxkdyAwKCVyMSksJXIyMiAgICAgOyBhZGRyZXNzIG9mIGhhbmRsZXIgICovCisgIHRyYW1wWzVdID0gMHgwMmMwMTBiNDsgLyogbGRzaWQgKCVyMjIpLCVyMjAgICA7IGxvYWQgc3BhY2UgaWQgICovCisgIHRyYW1wWzZdID0gMHgwMDE0MTgyMDsgLyogbXRzcCAlcjIwLCVzcjAgICAgICA7IGludG8gJXNyMCAgKi8KKyAgdHJhbXBbN10gPSAweGUyYzAwMDAwOyAvKiBiZSAwKCVzcjAsJXIyMikgICAgIDsgYnJhbmNoIHRvIGhhbmRsZXIgICovCisgIHRyYW1wWzhdID0gMHgwYzI4MTA5MzsgLyogbGR3IDQoJXIxKSwlcjE5ICAgICA7IEdQIG9mIGhhbmRsZXIgICovCisgIHRyYW1wWzldID0gKChVSU5UMzIpKGZmaV9jbG9zdXJlX3BhMzIpICYgfjIpOworCisgIC8qIEZsdXNoIGQvaWNhY2hlIC0tIGhhdmUgdG8gZmx1c2ggdGhyZWUgbGluZXMgYmVjYXVzZSBvZiBhbGlnbm1lbnQuICAqLworICBfX2FzbV9fIHZvbGF0aWxlKAorCQkgICAiY29weSAlMSwlMFxuXHQiCisJCSAgICJmZGMsbSAlMiglMClcblx0IgorCQkgICAiZmRjLG0gJTIoJTApXG5cdCIKKwkJICAgImZkYyxtICUyKCUwKVxuXHQiCisJCSAgICJsZHNpZCAoJTEpLCUwXG5cdCIKKwkJICAgIm10c3AgJTAsJSVzcjBcblx0IgorCQkgICAiY29weSAlMSwlMFxuXHQiCisJCSAgICJmaWMsbSAlMiglJXNyMCwlMClcblx0IgorCQkgICAiZmljLG0gJTIoJSVzcjAsJTApXG5cdCIKKwkJICAgImZpYyxtICUyKCUlc3IwLCUwKVxuXHQiCisJCSAgICJzeW5jXG5cdCIKKwkJICAgIm5vcFxuXHQiCisJCSAgICJub3Bcblx0IgorCQkgICAibm9wXG5cdCIKKwkJICAgIm5vcFxuXHQiCisJCSAgICJub3Bcblx0IgorCQkgICAibm9wXG5cdCIKKwkJICAgIm5vcFxuIgorCQkgICA6ICI9JnIiICgodW5zaWduZWQgbG9uZyl0bXApCisJCSAgIDogInIiICgodW5zaWduZWQgbG9uZyl0cmFtcCAmIH4zMSksCisJCSAgICAgInIiICgzMi8qIHN0cmlkZSAqLykKKwkJICAgOiAibWVtb3J5Iik7CisjZW5kaWYKKworICBjbG9zdXJlLT5jaWYgID0gY2lmOworICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIGNsb3N1cmUtPmZ1biAgPSBmdW47CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wYS9mZml0YXJnZXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcGEvZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhMmY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcGEvZmZpdGFyZ2V0LmgKQEAgLTAsMCArMSw3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KKyAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgaHBwYS4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9UQVJHRVRfSAorI2RlZmluZSBMSUJGRklfVEFSR0VUX0gKKworLyogLS0tLSBTeXN0ZW0gc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfQVNNCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZmZpX2FyZzsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgICAgICAgICAgICBmZmlfc2FyZzsKKwordHlwZWRlZiBlbnVtIGZmaV9hYmkgeworICBGRklfRklSU1RfQUJJID0gMCwKKworI2lmZGVmIFBBX0xJTlVYCisgIEZGSV9QQTMyLAorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9QQTMyCisjZW5kaWYKKworI2lmZGVmIFBBX0hQVVgKKyAgRkZJX1BBMzIsCisgIEZGSV9MQVNUX0FCSSwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1BBMzIKKyNlbmRpZgorCisjaWZkZWYgUEE2NF9IUFVYCisjZXJyb3IgIlBBNjRfSFBVWCBGRkkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCIKKyAgRkZJX1BBNjQsCisgIEZGSV9MQVNUX0FCSSwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1BBNjQKKyNlbmRpZgorfSBmZmlfYWJpOworI2VuZGlmCisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIGNsb3N1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRkZJX0NMT1NVUkVTIDEKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKworI2lmZGVmIFBBX0xJTlVYCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMzIKKyNlbHNlCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgNDAKKyNlbmRpZgorCisjZGVmaW5lIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDIgLTEKKyNkZWZpbmUgRkZJX1RZUEVfU01BTExfU1RSVUNUMyAtMgorI2RlZmluZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q0IC0zCisjZGVmaW5lIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDUgLTQKKyNkZWZpbmUgRkZJX1RZUEVfU01BTExfU1RSVUNUNiAtNQorI2RlZmluZSBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q3IC02CisjZGVmaW5lIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDggLTcKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wYS9ocHV4MzIuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcGEvaHB1eDMyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1MjhiYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcGEvaHB1eDMyLlMKQEAgLTAsMCArMSwzNjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBocHV4MzIuUyAtIENvcHlyaWdodCAoYykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwkgICAgICAgICAgICAgICAgKGMpIDIwMDggUmVkIEhhdCwgSW5jLgorICAgYmFzZWQgb24gc3JjL3BhL2xpbnV4LlMKKworICAgSFAtVVggUEEgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKwkuTEVWRUwgMS4xCisJLlNQQUNFCSRQUklWQVRFJAorCS5JTVBPUlQJJGdsb2JhbCQsREFUQQorCS5JTVBPUlQJJCRkeW5jYWxsLE1JTExJQ09ERQorCS5TVUJTUEEJJERBVEEkCisJLmFsaWduCTQKKworCS8qIHZvaWQgZmZpX2NhbGxfcGEzMih2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwKKwkJCSAgICAgICBleHRlbmRlZF9jaWYgKmVjaWYsCisJCQkgICAgICAgdW5zaWduZWQgYnl0ZXMsCisJCQkgICAgICAgdW5zaWduZWQgZmxhZ3MsCisJCQkgICAgICAgdW5zaWduZWQgKnJ2YWx1ZSwKKwkJCSAgICAgICB2b2lkICgqZm4pKHZvaWQpKTsKKwkgKi8KKworCS5leHBvcnQJZmZpX2NhbGxfcGEzMixFTlRSWSxQUklWX0xFVj0zCisJLmltcG9ydAlmZmlfcHJlcF9hcmdzX3BhMzIsQ09ERQorCisJLlNQQUNFCSRURVhUJAorCS5TVUJTUEEgJENPREUkCisJLmFsaWduCTQKKworTCRGQjEKK2ZmaV9jYWxsX3BhMzIKKwkucHJvYworCS5jYWxsaW5mbwlGUkFNRT02NCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9NAorCS5lbnRyeQorCXN0dwklcnAsIC0yMCglc3ApCisJY29weQklcjMsICVyMQorTCRDRkkxMQorCWNvcHkJJXNwLCAlcjMKK0wkQ0ZJMTIKKworCS8qIFNldHVwIHRoZSBzdGFjayBmb3IgY2FsbGluZyBwcmVwX2FyZ3MuLi4KKwkgICBXZSB3YW50IHRoZSBzdGFjayB0byBsb29rIGxpa2UgdGhpczoKKworCSAgIFsgUHJldmlvdXMgc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA8LSAlcjMKKworCSAgIFsgNjQtYnl0ZXMgcmVnaXN0ZXIgc2F2ZSBhcmVhICAgICAgICAgICAgICAgXSA8LSAlcjQKKworCSAgIFsgU3RhY2sgc3BhY2UgZm9yIGFjdHVhbCBjYWxsLCBwYXNzZWQgYXMgICAgXSA8LSAlYXJnMAorCSAgIFsgICAgIGFyZzAgdG8gZmZpX3ByZXBfYXJnc19wYTMyICAgICAgICAgICBdCisKKwkgICBbIFN0YWNrIGZvciBjYWxsaW5nIHByZXBfYXJncyAgICAgICAgICAgICAgIF0gPC0gJXNwCisJICovCisKKwlzdHdtCSVyMSwgNjQoJXNwKQorCXN0dwklcjQsIDEyKCVyMykKK0wkQ0ZJMTMKKwljb3B5CSVzcCwgJXI0CisKKwlhZGRsCSVhcmcyLCAlcjQsICVhcmcwCTsgYXJnIHN0YWNrCisJc3R3CSVhcmczLCAtNDgoJXIzKQkJOyBzYXZlIGZsYWdzIHdlIG5lZWQgaXQgbGF0ZXIKKworCS8qIENhbGwgcHJlcF9hcmdzOgorCSAgICVhcmcwKHN0YWNrKSAtLSBzZXQgdXAgYWJvdmUKKwkgICAlYXJnMShlY2lmKSAgLS0gc2FtZSBhcyBpbmNvbWluZyBwYXJhbQorCSAgICVhcmcyKGJ5dGVzKSAtLSBzYW1lIGFzIGluY29taW5nIHBhcmFtICovCisJYmwJZmZpX3ByZXBfYXJnc19wYTMyLCVyMgorCWxkbwk2NCglYXJnMCksICVzcAorCWxkbwktNjQoJXNwKSwgJXNwCisKKwkvKiBub3cgJXNwIHNob3VsZCBwb2ludCB3aGVyZSAlYXJnMCB3YXMgcG9pbnRpbmcuICAqLworCisJLyogTG9hZCB0aGUgYXJndW1lbnRzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBpbiByZWdpc3RlcnMKKwkgICBUaGUgZnAgYXJncyBhcmUgbG9hZGVkIGJ5IHRoZSBwcmVwX2FyZ3MgZnVuY3Rpb24uICAqLworCWxkdwktMzYoJXNwKSwgJWFyZzAKKwlsZHcJLTQwKCVzcCksICVhcmcxCisJbGR3CS00NCglc3ApLCAlYXJnMgorCWxkdwktNDgoJXNwKSwgJWFyZzMKKworCS8qIGluIGNhc2UgdGhlIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIHJldHVybiBhIHN0cnVjdHVyZQorCSAgIHdlIG5lZWQgdG8gZ2l2ZSBpdCBhIHBsYWNlIHRvIHB1dCB0aGUgcmVzdWx0LiAgKi8KKwlsZHcJLTUyKCVyMyksICVyZXQwCQk7ICVyZXQwIDwtIHJ2YWx1ZQorCWxkdwktNTYoJXIzKSwgJXIyMgkJOyAlcjIyIDwtIGZ1bmN0aW9uIHRvIGNhbGwKKwlibAkkJGR5bmNhbGwsICVyMzEJCTsgQ2FsbCB0aGUgdXNlciBmdW5jdGlvbgorCWNvcHkJJXIzMSwgJXJwCisKKwkvKiBQcmVwYXJlIHRvIHN0b3JlIHRoZSByZXN1bHQ7IHdlIG5lZWQgdG8gcmVjb3ZlciBmbGFncyBhbmQgcnZhbHVlLiAgKi8KKwlsZHcJLTQ4KCVyMyksICVyMjEJCTsgcjIxIDwtIGZsYWdzCisJbGR3CS01MiglcjMpLCAlcjIwCQk7IHIyMCA8LSBydmFsdWUKKworCS8qIFN0b3JlIHRoZSByZXN1bHQgYWNjb3JkaW5nIHRvIHRoZSByZXR1cm4gdHlwZS4gIFRoZSBtb3N0CisJICAgbGlrZWx5IHR5cGVzIHNob3VsZCBjb21lIGZpcnN0LiAgKi8KKworTCRjaGVja2ludAorCWNvbWliLDw+LG4gRkZJX1RZUEVfSU5ULCAlcjIxLCBMJGNoZWNraW50OAorCWIJTCRkb25lCisJc3R3CSVyZXQwLCAwKCVyMjApCisKK0wkY2hlY2tpbnQ4CisJY29taWIsPD4sbiBGRklfVFlQRV9VSU5UOCwgJXIyMSwgTCRjaGVja2ludDE2CisJYglMJGRvbmUKKwlzdGIJJXJldDAsIDAoJXIyMCkKKworTCRjaGVja2ludDE2CisJY29taWIsPD4sbiBGRklfVFlQRV9VSU5UMTYsICVyMjEsIEwkY2hlY2tkYmwKKwliCUwkZG9uZQorCXN0aAklcmV0MCwgMCglcjIwKQorCitMJGNoZWNrZGJsCisJY29taWIsPD4sbiBGRklfVFlQRV9ET1VCTEUsICVyMjEsIEwkY2hlY2tmbG9hdAorCWIJTCRkb25lCisJZnN0ZAklZnI0LDAoJXIyMCkKKworTCRjaGVja2Zsb2F0CisJY29taWIsPD4sbiBGRklfVFlQRV9GTE9BVCwgJXIyMSwgTCRjaGVja2xsCisJYglMJGRvbmUKKwlmc3R3CSVmcjRMLDAoJXIyMCkKKworTCRjaGVja2xsCisJY29taWIsPD4sbiBGRklfVFlQRV9VSU5UNjQsICVyMjEsIEwkY2hlY2tzbXN0MgorCXN0dwklcmV0MCwgMCglcjIwKQorCWIJTCRkb25lCisJc3R3CSVyZXQxLCA0KCVyMjApCisKK0wkY2hlY2tzbXN0MgorCWNvbWliLDw+LG4gRkZJX1RZUEVfU01BTExfU1RSVUNUMiwgJXIyMSwgTCRjaGVja3Ntc3QzCisJLyogMi1ieXRlIHN0cnVjdHMgYXJlIHJldHVybmVkIGluIHJldDAgYXMgPz8/P3h4eXkuICAqLworCWV4dHJ1CSVyZXQwLCAyMywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWIJTCRkb25lCisJc3RiCSVyZXQwLCAwKCVyMjApCisKK0wkY2hlY2tzbXN0MworCWNvbWliLDw+LG4gRkZJX1RZUEVfU01BTExfU1RSVUNUMywgJXIyMSwgTCRjaGVja3Ntc3Q0CisJLyogMy1ieXRlIHN0cnVjdHMgYXJlIHJldHVybmVkIGluIHJldDAgYXMgPz94eHl5enouICAqLworCWV4dHJ1CSVyZXQwLCAxNSwgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQwLCAyMywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWIJTCRkb25lCisJc3RiCSVyZXQwLCAwKCVyMjApCisKK0wkY2hlY2tzbXN0NAorCWNvbWliLDw+LG4gRkZJX1RZUEVfU01BTExfU1RSVUNUNCwgJXIyMSwgTCRjaGVja3Ntc3Q1CisJLyogNC1ieXRlIHN0cnVjdHMgYXJlIHJldHVybmVkIGluIHJldDAgYXMgd3d4eHl5enouICAqLworCWV4dHJ1CSVyZXQwLCA3LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDAsIDE1LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDAsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJYglMJGRvbmUKKwlzdGIJJXJldDAsIDAoJXIyMCkKKworTCRjaGVja3Ntc3Q1CisJY29taWIsPD4sbiBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q1LCAlcjIxLCBMJGNoZWNrc21zdDYKKwkvKiA1IGJ5dGUgdmFsdWVzIGFyZSByZXR1cm5lZCByaWdodCBqdXN0aWZpZWQ6CisJICAgICAgcmV0MCAgICAgcmV0MQorCSAgIDU6ID8/Pz8/P2FhIGJiY2NkZGVlICovCisJc3RicyxtYQklcmV0MCwgMSglcjIwKQorCWV4dHJ1CSVyZXQxLCA3LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDE1LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJYglMJGRvbmUKKwlzdGIJJXJldDEsIDAoJXIyMCkKKworTCRjaGVja3Ntc3Q2CisJY29taWIsPD4sbiBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q2LCAlcjIxLCBMJGNoZWNrc21zdDcKKwkvKiA2IGJ5dGUgdmFsdWVzIGFyZSByZXR1cm5lZCByaWdodCBqdXN0aWZpZWQ6CisJICAgICAgcmV0MCAgICAgcmV0MQorCSAgIDY6ID8/Pz9hYWJiIGNjZGRlZWZmICovCisJZXh0cnUJJXJldDAsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJc3RicyxtYQklcmV0MCwgMSglcjIwKQorCWV4dHJ1CSVyZXQxLCA3LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDE1LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJYglMJGRvbmUKKwlzdGIJJXJldDEsIDAoJXIyMCkKKworTCRjaGVja3Ntc3Q3CisJY29taWIsPD4sbiBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q3LCAlcjIxLCBMJGNoZWNrc21zdDgKKwkvKiA3IGJ5dGUgdmFsdWVzIGFyZSByZXR1cm5lZCByaWdodCBqdXN0aWZpZWQ6CisJICAgICAgcmV0MCAgICAgcmV0MQorCSAgIDc6ID8/YWFiYmNjIGRkZWVmZmdnICovCisJZXh0cnUJJXJldDAsIDE1LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDAsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJc3RicyxtYQklcmV0MCwgMSglcjIwKQorCWV4dHJ1CSVyZXQxLCA3LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDE1LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJYglMJGRvbmUKKwlzdGIJJXJldDEsIDAoJXIyMCkKKworTCRjaGVja3Ntc3Q4CisJY29taWIsPD4sbiBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q4LCAlcjIxLCBMJGRvbmUKKwkvKiA4IGJ5dGUgdmFsdWVzIGFyZSByZXR1cm5lZCByaWdodCBqdXN0aWZpZWQ6CisJICAgICAgcmV0MCAgICAgcmV0MQorCSAgIDg6IGFhYmJjY2RkIGVlZmZnZ2hoICovCisJZXh0cnUJJXJldDAsIDcsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwlleHRydQklcmV0MCwgMTUsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwlleHRydQklcmV0MCwgMjMsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwlzdGJzLG1hCSVyZXQwLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDcsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwlleHRydQklcmV0MSwgMTUsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwlleHRydQklcmV0MSwgMjMsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwlzdGIJJXJldDEsIDAoJXIyMCkKKworTCRkb25lCisJLyogYWxsIGRvbmUsIHJldHVybiAqLworCWNvcHkJJXI0LCAlc3AJOyBwb3AgYXJnIHN0YWNrCisJbGR3CTEyKCVyMyksICVyNAorCWxkd20JLTY0KCVzcCksICVyMwk7IC4uIGFuZCBwb3Agc3RhY2sKKwlsZHcJLTIwKCVzcCksICVycAorCWJ2CSVyMCglcnApCisJbm9wCisJLmV4aXQKKwkucHJvY2VuZAorTCRGRTEKKworCS8qIHZvaWQgZmZpX2Nsb3N1cmVfcGEzMih2b2lkKTsKKwkgICBDYWxsZWQgd2l0aCBjbG9zdXJlIGFyZ3VtZW50IGluICVyMjEgKi8KKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCS5leHBvcnQgZmZpX2Nsb3N1cmVfcGEzMixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgorCS5pbXBvcnQgZmZpX2Nsb3N1cmVfaW5uZXJfcGEzMixDT0RFCisJLmFsaWduIDQKK0wkRkIyCitmZmlfY2xvc3VyZV9wYTMyCisJLnByb2MKKwkuY2FsbGluZm8gRlJBTUU9NjQsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKKwkuZW50cnkKKworCXN0dwklcnAsIC0yMCglc3ApCisJY29weQklcjMsICVyMQorTCRDRkkyMQorCWNvcHkJJXNwLCAlcjMKK0wkQ0ZJMjIKKwlzdHdtCSVyMSwgNjQoJXNwKQorCisJLyogUHV0IGFyZ3VtZW50cyBvbnRvIHRoZSBzdGFjayBhbmQgY2FsbCBmZmlfY2xvc3VyZV9pbm5lci4gICovCisJc3R3CSVhcmcwLCAtMzYoJXIzKQorCXN0dwklYXJnMSwgLTQwKCVyMykKKwlzdHcJJWFyZzIsIC00NCglcjMpCisJc3R3CSVhcmczLCAtNDgoJXIzKQorCisJY29weQklcjIxLCAlYXJnMAorCWJsCWZmaV9jbG9zdXJlX2lubmVyX3BhMzIsICVyMgorCWNvcHkgICAgJXIzLCAlYXJnMQorCWxkd20JLTY0KCVzcCksICVyMworCWxkdwktMjAoJXNwKSwgJXJwCisJbGR3CS0zNiglc3ApLCAlcmV0MAorCWJ2CSVyMCglcnApCisJbGR3CS00MCglc3ApLCAlcmV0MQorCS5leGl0CisJLnByb2NlbmQKK0wkRkUyOgorCisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgX0dMT0JBTF9fRl9mZmlfY2FsbF9wYTMyLERBVEEKK19HTE9CQUxfX0ZfZmZpX2NhbGxfcGEzMgorTCRmcmFtZTE6CisJLndvcmQgICBMJEVDSUUxLUwkU0NJRTEgOyMgTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQorTCRTQ0lFMToKKwkud29yZCAgIDB4MCAgICAgOyMgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUgICAweDEgICAgIDsjIENJRSBWZXJzaW9uCisJLmFzY2lpICJcMCIgICAgIDsjIENJRSBBdWdtZW50YXRpb24KKwkudWxlYjEyOCAweDEgICAgOyMgQ0lFIENvZGUgQWxpZ25tZW50IEZhY3RvcgorCS5zbGViMTI4IDQgICAgICA7IyBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUgICAweDIgICAgIDsjIENJRSBSQSBDb2x1bW4KKwkuYnl0ZSAgIDB4YyAgICAgOyMgRFdfQ0ZBX2RlZl9jZmEKKwkudWxlYjEyOCAweDFlCisJLnVsZWIxMjggMHgwCisJLmFsaWduIDQKK0wkRUNJRTE6CitMJFNGREUxOgorCS53b3JkICAgTCRFRkRFMS1MJEFTRkRFMSAgICAgICAgOyMgRkRFIExlbmd0aAorTCRBU0ZERTE6CisJLndvcmQgICBMJEFTRkRFMS1MJGZyYW1lMSAgICAgICA7IyBGREUgQ0lFIG9mZnNldAorCS53b3JkICAgTCRGQjEgICA7IyBGREUgaW5pdGlhbCBsb2NhdGlvbgorCS53b3JkICAgTCRGRTEtTCRGQjEgICAgIDsjIEZERSBhZGRyZXNzIHJhbmdlCisKKwkuYnl0ZSAgIDB4NCAgICAgOyMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS53b3JkICAgTCRDRkkxMS1MJEZCMQorCS5ieXRlCTB4ODMJOyMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4MworCS51bGViMTI4IDB4MAorCS5ieXRlICAgMHgxMSAgICA7IyBEV19DRkFfb2Zmc2V0X2V4dGVuZGVkX3NmOyBzYXZlIHIyIGF0IFtyMzAtMjBdCisJLnVsZWIxMjggMHgyCisJLnNsZWIxMjggLTUKKworCS5ieXRlICAgMHg0ICAgICA7IyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLndvcmQgICBMJENGSTEyLUwkQ0ZJMTEKKwkuYnl0ZSAgIDB4ZCAgICAgOyMgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgPSByMworCS51bGViMTI4IDB4MworCisJLmJ5dGUgICAweDQgICAgIDsjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkud29yZCAgIEwkQ0ZJMTMtTCRDRkkxMgorCS5ieXRlCTB4ODQJOyMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NAorCS51bGViMTI4IDB4MworCisJLmFsaWduIDQKK0wkRUZERTE6CisKK0wkU0ZERTI6CisJLndvcmQgICBMJEVGREUyLUwkQVNGREUyICAgICAgICA7IyBGREUgTGVuZ3RoCitMJEFTRkRFMjoKKwkud29yZCAgIEwkQVNGREUyLUwkZnJhbWUxICAgICAgIDsjIEZERSBDSUUgb2Zmc2V0CisJLndvcmQgICBMJEZCMiAgIDsjIEZERSBpbml0aWFsIGxvY2F0aW9uCisJLndvcmQgICBMJEZFMi1MJEZCMiAgICAgOyMgRkRFIGFkZHJlc3MgcmFuZ2UKKwkuYnl0ZSAgIDB4NCAgICAgOyMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS53b3JkICAgTCRDRkkyMS1MJEZCMgorCS5ieXRlICAgMHg4MyAgICA7IyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHgzCisJLnVsZWIxMjggMHgwCisJLmJ5dGUgICAweDExICAgIDsjIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YKKwkudWxlYjEyOCAweDIKKwkuc2xlYjEyOCAtNQorCisJLmJ5dGUgICAweDQgICAgIDsjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkud29yZCAgIEwkQ0ZJMjItTCRDRkkyMQorCS5ieXRlICAgMHhkICAgICA7IyBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciA9IHIzCisJLnVsZWIxMjggMHgzCisKKwkuYWxpZ24gNAorTCRFRkRFMjoKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcGEvbGludXguUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcGEvbGludXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFhZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wYS9saW51eC5TCkBAIC0wLDAgKzEsMzU3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgbGludXguUyAtIChjKSAyMDAzLTIwMDQgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+CisJICAgICAoYykgMjAwOCBSZWQgSGF0LCBJbmMuCisKKyAgIEhQUEEgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBSRU5FU0FTIFRFQ0hOT0xPR1kgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworCS50ZXh0CisJLmxldmVsIDEuMQorCS5hbGlnbiA0CisKKwkvKiB2b2lkIGZmaV9jYWxsX3BhMzIodm9pZCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksCisJCQkgICAgICAgZXh0ZW5kZWRfY2lmICplY2lmLAorCQkJICAgICAgIHVuc2lnbmVkIGJ5dGVzLAorCQkJICAgICAgIHVuc2lnbmVkIGZsYWdzLAorCQkJICAgICAgIHVuc2lnbmVkICpydmFsdWUsCisJCQkgICAgICAgdm9pZCAoKmZuKSh2b2lkKSk7CisJICovCisKKwkuZXhwb3J0IGZmaV9jYWxsX3BhMzIsY29kZQorCS5pbXBvcnQgZmZpX3ByZXBfYXJnc19wYTMyLGNvZGUKKworCS50eXBlIGZmaV9jYWxsX3BhMzIsIEBmdW5jdGlvbgorLkxGQjE6CitmZmlfY2FsbF9wYTMyOgorCS5wcm9jCisJLmNhbGxpbmZvIEZSQU1FPTY0LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj00CisJLmVudHJ5CisJc3R3ICVycCwgLTIwKCVzcCkKKwljb3B5ICVyMywgJXIxCisuTENGSTExOgorCisJY29weSAlc3AsICVyMworLkxDRkkxMjoKKworCS8qIFNldHVwIHRoZSBzdGFjayBmb3IgY2FsbGluZyBwcmVwX2FyZ3MuLi4KKwkgICBXZSB3YW50IHRoZSBzdGFjayB0byBsb29rIGxpa2UgdGhpczoKKworCSAgIFsgUHJldmlvdXMgc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA8LSAlcjMKKworCSAgIFsgNjQtYnl0ZXMgcmVnaXN0ZXIgc2F2ZSBhcmVhICAgICAgICAgICAgICAgXSA8LSAlcjQKKworCSAgIFsgU3RhY2sgc3BhY2UgZm9yIGFjdHVhbCBjYWxsLCBwYXNzZWQgYXMgICAgXSA8LSAlYXJnMAorCSAgIFsgICAgIGFyZzAgdG8gZmZpX3ByZXBfYXJnc19wYTMyICAgICAgICAgICBdCisKKwkgICBbIFN0YWNrIGZvciBjYWxsaW5nIHByZXBfYXJncyAgICAgICAgICAgICAgIF0gPC0gJXNwCisJICovCisKKwlzdHdtICVyMSwgNjQoJXNwKQorCXN0dyAlcjQsIDEyKCVyMykKKy5MQ0ZJMTM6CisJY29weSAlc3AsICVyNAorCisJYWRkbCAlYXJnMiwgJXI0LCAlYXJnMCAgICAgIC8qIGFyZyBzdGFjayAqLworCXN0dyAlYXJnMywgLTQ4KCVyMykgICAgICAgICAvKiBzYXZlIGZsYWdzOyB3ZSBuZWVkIGl0IGxhdGVyICovCisKKwkvKiBDYWxsIHByZXBfYXJnczoKKwkgICAlYXJnMChzdGFjaykgLS0gc2V0IHVwIGFib3ZlCisJICAgJWFyZzEoZWNpZikgLS0gc2FtZSBhcyBpbmNvbWluZyBwYXJhbQorCSAgICVhcmcyKGJ5dGVzKSAtLSBzYW1lIGFzIGluY29taW5nIHBhcmFtICovCisJYmwgZmZpX3ByZXBfYXJnc19wYTMyLCVyMgorCWxkbyA2NCglYXJnMCksICVzcAorCWxkbyAtNjQoJXNwKSwgJXNwCisKKwkvKiBub3cgJXNwIHNob3VsZCBwb2ludCB3aGVyZSAlYXJnMCB3YXMgcG9pbnRpbmcuICAqLworCisJLyogTG9hZCB0aGUgYXJndW1lbnRzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBpbiByZWdpc3RlcnMKKwkgICBUaGUgZnAgYXJncyB3ZXJlIGxvYWRlZCBieSB0aGUgcHJlcF9hcmdzIGZ1bmN0aW9uLiAgKi8KKwlsZHcgLTM2KCVzcCksICVhcmcwCisJbGR3IC00MCglc3ApLCAlYXJnMQorCWxkdyAtNDQoJXNwKSwgJWFyZzIKKwlsZHcgLTQ4KCVzcCksICVhcmczCisKKwkvKiBpbiBjYXNlIHRoZSBmdW5jdGlvbiBpcyBnb2luZyB0byByZXR1cm4gYSBzdHJ1Y3R1cmUKKwkgICB3ZSBuZWVkIHRvIGdpdmUgaXQgYSBwbGFjZSB0byBwdXQgdGhlIHJlc3VsdC4gICovCisJbGR3IC01MiglcjMpLCAlcmV0MCAgICAgICAgICAgICAgICAgICAgIC8qICVyZXQwIDwtIHJ2YWx1ZSAqLworCWxkdyAtNTYoJXIzKSwgJXIyMiAgICAgICAgICAgICAgICAgICAgICAvKiAlcjIyIDwtIGZ1bmN0aW9uIHRvIGNhbGwgKi8KKwlibCAkJGR5bmNhbGwsICVyMzEgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbCB0aGUgdXNlciBmdW5jdGlvbiAqLworCWNvcHkgJXIzMSwgJXJwCisKKwkvKiBQcmVwYXJlIHRvIHN0b3JlIHRoZSByZXN1bHQ7IHdlIG5lZWQgdG8gcmVjb3ZlciBmbGFncyBhbmQgcnZhbHVlLiAgKi8KKwlsZHcgLTQ4KCVyMyksICVyMjEgICAgICAgICAgICAgICAgICAgICAgLyogcjIxIDwtIGZsYWdzICovCisJbGR3IC01MiglcjMpLCAlcjIwICAgICAgICAgICAgICAgICAgICAgIC8qIHIyMCA8LSBydmFsdWUgKi8KKworCS8qIFN0b3JlIHRoZSByZXN1bHQgYWNjb3JkaW5nIHRvIHRoZSByZXR1cm4gdHlwZS4gICovCisKKy5MY2hlY2tpbnQ6CisJY29taWIsPD4sbiBGRklfVFlQRV9JTlQsICVyMjEsIC5MY2hlY2tpbnQ4CisJYgkuTGRvbmUKKwlzdHcJJXJldDAsIDAoJXIyMCkKKworLkxjaGVja2ludDg6CisJY29taWIsPD4sbiBGRklfVFlQRV9VSU5UOCwgJXIyMSwgLkxjaGVja2ludDE2CisJYgkuTGRvbmUKKwlzdGIJJXJldDAsIDAoJXIyMCkKKworLkxjaGVja2ludDE2OgorCWNvbWliLDw+LG4gRkZJX1RZUEVfVUlOVDE2LCAlcjIxLCAuTGNoZWNrZGJsCisJYgkuTGRvbmUKKwlzdGgJJXJldDAsIDAoJXIyMCkKKworLkxjaGVja2RibDoKKwljb21pYiw8PixuIEZGSV9UWVBFX0RPVUJMRSwgJXIyMSwgLkxjaGVja2Zsb2F0CisJYgkuTGRvbmUKKwlmc3RkCSVmcjQsMCglcjIwKQorCisuTGNoZWNrZmxvYXQ6CisJY29taWIsPD4sbiBGRklfVFlQRV9GTE9BVCwgJXIyMSwgLkxjaGVja2xsCisJYgkuTGRvbmUKKwlmc3R3CSVmcjRMLDAoJXIyMCkKKworLkxjaGVja2xsOgorCWNvbWliLDw+LG4gRkZJX1RZUEVfVUlOVDY0LCAlcjIxLCAuTGNoZWNrc21zdDIKKwlzdHcJJXJldDAsIDAoJXIyMCkKKwliCS5MZG9uZQorCXN0dwklcmV0MSwgNCglcjIwKQorCisuTGNoZWNrc21zdDI6CisJY29taWIsPD4sbiBGRklfVFlQRV9TTUFMTF9TVFJVQ1QyLCAlcjIxLCAuTGNoZWNrc21zdDMKKwkvKiAyLWJ5dGUgc3RydWN0cyBhcmUgcmV0dXJuZWQgaW4gcmV0MCBhcyA/Pz8/eHh5eS4gICovCisJZXh0cnUJJXJldDAsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJYgkuTGRvbmUKKwlzdGIJJXJldDAsIDAoJXIyMCkKKworLkxjaGVja3Ntc3QzOgorCWNvbWliLDw+LG4gRkZJX1RZUEVfU01BTExfU1RSVUNUMywgJXIyMSwgLkxjaGVja3Ntc3Q0CisJLyogMy1ieXRlIHN0cnVjdHMgYXJlIHJldHVybmVkIGluIHJldDAgYXMgPz94eHl5enouICAqLworCWV4dHJ1CSVyZXQwLCAxNSwgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQwLCAyMywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWIJLkxkb25lCisJc3RiCSVyZXQwLCAwKCVyMjApCisKKy5MY2hlY2tzbXN0NDoKKwljb21pYiw8PixuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDQsICVyMjEsIC5MY2hlY2tzbXN0NQorCS8qIDQtYnl0ZSBzdHJ1Y3RzIGFyZSByZXR1cm5lZCBpbiByZXQwIGFzIHd3eHh5eXp6LiAgKi8KKwlleHRydQklcmV0MCwgNywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQwLCAxNSwgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQwLCAyMywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWIJLkxkb25lCisJc3RiCSVyZXQwLCAwKCVyMjApCisKKy5MY2hlY2tzbXN0NToKKwljb21pYiw8PixuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDUsICVyMjEsIC5MY2hlY2tzbXN0NgorCS8qIDUgYnl0ZSB2YWx1ZXMgYXJlIHJldHVybmVkIHJpZ2h0IGp1c3RpZmllZDoKKwkgICAgICByZXQwICAgICByZXQxCisJICAgNTogPz8/Pz8/YWEgYmJjY2RkZWUgKi8KKwlzdGJzLG1hCSVyZXQwLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDcsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwlleHRydQklcmV0MSwgMTUsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwlleHRydQklcmV0MSwgMjMsIDgsICVyMjIKKwlzdGJzLG1hCSVyMjIsIDEoJXIyMCkKKwliCS5MZG9uZQorCXN0YgklcmV0MSwgMCglcjIwKQorCisuTGNoZWNrc21zdDY6CisJY29taWIsPD4sbiBGRklfVFlQRV9TTUFMTF9TVFJVQ1Q2LCAlcjIxLCAuTGNoZWNrc21zdDcKKwkvKiA2IGJ5dGUgdmFsdWVzIGFyZSByZXR1cm5lZCByaWdodCBqdXN0aWZpZWQ6CisJICAgICAgcmV0MCAgICAgcmV0MQorCSAgIDY6ID8/Pz9hYWJiIGNjZGRlZWZmICovCisJZXh0cnUJJXJldDAsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJc3RicyxtYQklcmV0MCwgMSglcjIwKQorCWV4dHJ1CSVyZXQxLCA3LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDE1LCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJZXh0cnUJJXJldDEsIDIzLCA4LCAlcjIyCisJc3RicyxtYQklcjIyLCAxKCVyMjApCisJYgkuTGRvbmUKKwlzdGIJJXJldDEsIDAoJXIyMCkKKworLkxjaGVja3Ntc3Q3OgorCWNvbWliLDw+LG4gRkZJX1RZUEVfU01BTExfU1RSVUNUNywgJXIyMSwgLkxjaGVja3Ntc3Q4CisJLyogNyBieXRlIHZhbHVlcyBhcmUgcmV0dXJuZWQgcmlnaHQganVzdGlmaWVkOgorCSAgICAgIHJldDAgICAgIHJldDEKKwkgICA3OiA/P2FhYmJjYyBkZGVlZmZnZyAqLworCWV4dHJ1CSVyZXQwLCAxNSwgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQwLCAyMywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCXN0YnMsbWEJJXJldDAsIDEoJXIyMCkKKwlleHRydQklcmV0MSwgNywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQxLCAxNSwgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQxLCAyMywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWIJLkxkb25lCisJc3RiCSVyZXQxLCAwKCVyMjApCisKKy5MY2hlY2tzbXN0ODoKKwljb21pYiw8PixuIEZGSV9UWVBFX1NNQUxMX1NUUlVDVDgsICVyMjEsIC5MZG9uZQorCS8qIDggYnl0ZSB2YWx1ZXMgYXJlIHJldHVybmVkIHJpZ2h0IGp1c3RpZmllZDoKKwkgICAgICByZXQwICAgICByZXQxCisJICAgODogYWFiYmNjZGQgZWVmZmdnaGggKi8KKwlleHRydQklcmV0MCwgNywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQwLCAxNSwgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQwLCAyMywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCXN0YnMsbWEJJXJldDAsIDEoJXIyMCkKKwlleHRydQklcmV0MSwgNywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQxLCAxNSwgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCWV4dHJ1CSVyZXQxLCAyMywgOCwgJXIyMgorCXN0YnMsbWEJJXIyMiwgMSglcjIwKQorCXN0YgklcmV0MSwgMCglcjIwKQorCisuTGRvbmU6CisJLyogYWxsIGRvbmUsIHJldHVybiAqLworCWNvcHkgJXI0LCAlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3AgYXJnIHN0YWNrICovCisJbGR3IDEyKCVyMyksICVyNAorCWxkd20gLTY0KCVzcCksICVyMyAgICAgICAgICAgICAgICAgICAgICAvKiAuLiBhbmQgcG9wIHN0YWNrICovCisJbGR3IC0yMCglc3ApLCAlcnAKKwlidiAlcjAoJXJwKQorCW5vcAorCS5leGl0CisJLnByb2NlbmQKKy5MRkUxOgorCisJLyogdm9pZCBmZmlfY2xvc3VyZV9wYTMyKHZvaWQpOworCSAgIENhbGxlZCB3aXRoIGNsb3N1cmUgYXJndW1lbnQgaW4gJXIyMSAqLworCS5leHBvcnQgZmZpX2Nsb3N1cmVfcGEzMixjb2RlCisJLmltcG9ydCBmZmlfY2xvc3VyZV9pbm5lcl9wYTMyLGNvZGUKKworCS50eXBlIGZmaV9jbG9zdXJlX3BhMzIsIEBmdW5jdGlvbgorLkxGQjI6CitmZmlfY2xvc3VyZV9wYTMyOgorCS5wcm9jCisJLmNhbGxpbmZvIEZSQU1FPTY0LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCisJLmVudHJ5CisKKwlzdHcgJXJwLCAtMjAoJXNwKQorLkxDRkkyMDoKKwljb3B5ICVyMywgJXIxCisuTENGSTIxOgorCWNvcHkgJXNwLCAlcjMKKy5MQ0ZJMjI6CisJc3R3bSAlcjEsIDY0KCVzcCkKKworCS8qIFB1dCBhcmd1bWVudHMgb250byB0aGUgc3RhY2sgYW5kIGNhbGwgZmZpX2Nsb3N1cmVfaW5uZXIuICAqLworCXN0dyAlYXJnMCwgLTM2KCVyMykKKwlzdHcgJWFyZzEsIC00MCglcjMpCisJc3R3ICVhcmcyLCAtNDQoJXIzKQorCXN0dyAlYXJnMywgLTQ4KCVyMykKKworCWNvcHkgJXIyMSwgJWFyZzAKKwlibCBmZmlfY2xvc3VyZV9pbm5lcl9wYTMyLCAlcjIKKwljb3B5ICVyMywgJWFyZzEKKworCWxkd20gLTY0KCVzcCksICVyMworCWxkdyAtMjAoJXNwKSwgJXJwCisJbGR3IC0zNiglc3ApLCAlcmV0MAorCWJ2ICVyMCglcjIpCisJbGR3IC00MCglc3ApLCAlcmV0MQorCisJLmV4aXQKKwkucHJvY2VuZAorLkxGRTI6CisKKwkuc2VjdGlvbiAgICAgICAgIi5laF9mcmFtZSIsRUhfRlJBTUVfRkxBR1MsQHByb2diaXRzCisuTGZyYW1lMToKKwkud29yZCAgIC5MRUNJRTEtLkxTQ0lFMSA7IyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5CisuTFNDSUUxOgorCS53b3JkICAgMHgwICAgICA7IyBDSUUgSWRlbnRpZmllciBUYWcKKwkuYnl0ZSAgIDB4MSAgICAgOyMgQ0lFIFZlcnNpb24KKwkuYXNjaWkgIlwwIiAgICAgOyMgQ0lFIEF1Z21lbnRhdGlvbgorCS51bGViMTI4IDB4MSAgICA7IyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yCisJLnNsZWIxMjggNCAgICAgIDsjIENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IKKwkuYnl0ZSAgIDB4MiAgICAgOyMgQ0lFIFJBIENvbHVtbgorCS5ieXRlICAgMHhjICAgICA7IyBEV19DRkFfZGVmX2NmYQorCS51bGViMTI4IDB4MWUKKwkudWxlYjEyOCAweDAKKwkuYWxpZ24gNAorLkxFQ0lFMToKKy5MU0ZERTE6CisJLndvcmQgICAuTEVGREUxLS5MQVNGREUxICAgICAgICA7IyBGREUgTGVuZ3RoCisuTEFTRkRFMToKKwkud29yZCAgIC5MQVNGREUxLS5MZnJhbWUxICAgICAgIDsjIEZERSBDSUUgb2Zmc2V0CisJLndvcmQgICAuTEZCMSAgIDsjIEZERSBpbml0aWFsIGxvY2F0aW9uCisJLndvcmQgICAuTEZFMS0uTEZCMSAgICAgOyMgRkRFIGFkZHJlc3MgcmFuZ2UKKworCS5ieXRlICAgMHg0ICAgICA7IyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLndvcmQgICAuTENGSTExLS5MRkIxCisJLmJ5dGUJMHg4Mwk7IyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHgzCisJLnVsZWIxMjggMHgwCisJLmJ5dGUgICAweDExICAgIDsjIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2Y7IHNhdmUgcjIgYXQgW3IzMC0yMF0KKwkudWxlYjEyOCAweDIKKwkuc2xlYjEyOCAtNQorCisJLmJ5dGUgICAweDQgICAgIDsjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkud29yZCAgIC5MQ0ZJMTItLkxDRkkxMQorCS5ieXRlICAgMHhkICAgICA7IyBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciA9IHIzCisJLnVsZWIxMjggMHgzCisKKwkuYnl0ZSAgIDB4NCAgICAgOyMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS53b3JkICAgLkxDRkkxMy0uTENGSTEyCisJLmJ5dGUJMHg4NAk7IyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg0CisJLnVsZWIxMjggMHgzCisKKwkuYWxpZ24gNAorLkxFRkRFMToKKworLkxTRkRFMjoKKwkud29yZCAgIC5MRUZERTItLkxBU0ZERTIgICAgICAgIDsjIEZERSBMZW5ndGgKKy5MQVNGREUyOgorCS53b3JkICAgLkxBU0ZERTItLkxmcmFtZTEgICAgICAgOyMgRkRFIENJRSBvZmZzZXQKKwkud29yZCAgIC5MRkIyICAgOyMgRkRFIGluaXRpYWwgbG9jYXRpb24KKwkud29yZCAgIC5MRkUyLS5MRkIyICAgICA7IyBGREUgYWRkcmVzcyByYW5nZQorCS5ieXRlICAgMHg0ICAgICA7IyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLndvcmQgICAuTENGSTIxLS5MRkIyCisJLmJ5dGUgICAweDgzICAgIDsjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDMKKwkudWxlYjEyOCAweDAKKwkuYnl0ZSAgIDB4MTEgICAgOyMgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZgorCS51bGViMTI4IDB4MgorCS5zbGViMTI4IC01CisKKwkuYnl0ZSAgIDB4NCAgICAgOyMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS53b3JkICAgLkxDRkkyMi0uTENGSTIxCisJLmJ5dGUgICAweGQgICAgIDsjIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyID0gcjMKKwkudWxlYjEyOCAweDMKKworCS5hbGlnbiA0CisuTEVGREUyOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2FpeC5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2FpeC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxM2YyZGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3Bvd2VycGMvYWl4LlMKQEAgLTAsMCArMSwzMjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBhaXguUyAtIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIGJhc2VkIG9uIGRhcndpbi5TIGJ5IEpvaG4gSG9ybmt2aXN0CisKKyAgIFBvd2VyUEMgQXNzZW1ibHkgZ2x1ZS4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS5zZXQgcjAsMAorCS5zZXQgcjEsMQorCS5zZXQgcjIsMgorCS5zZXQgcjMsMworCS5zZXQgcjQsNAorCS5zZXQgcjUsNQorCS5zZXQgcjYsNgorCS5zZXQgcjcsNworCS5zZXQgcjgsOAorCS5zZXQgcjksOQorCS5zZXQgcjEwLDEwCisJLnNldCByMTEsMTEKKwkuc2V0IHIxMiwxMgorCS5zZXQgcjEzLDEzCisJLnNldCByMTQsMTQKKwkuc2V0IHIxNSwxNQorCS5zZXQgcjE2LDE2CisJLnNldCByMTcsMTcKKwkuc2V0IHIxOCwxOAorCS5zZXQgcjE5LDE5CisJLnNldCByMjAsMjAKKwkuc2V0IHIyMSwyMQorCS5zZXQgcjIyLDIyCisJLnNldCByMjMsMjMKKwkuc2V0IHIyNCwyNAorCS5zZXQgcjI1LDI1CisJLnNldCByMjYsMjYKKwkuc2V0IHIyNywyNworCS5zZXQgcjI4LDI4CisJLnNldCByMjksMjkKKwkuc2V0IHIzMCwzMAorCS5zZXQgcjMxLDMxCisJLnNldCBmMCwwCisJLnNldCBmMSwxCisJLnNldCBmMiwyCisJLnNldCBmMywzCisJLnNldCBmNCw0CisJLnNldCBmNSw1CisJLnNldCBmNiw2CisJLnNldCBmNyw3CisJLnNldCBmOCw4CisJLnNldCBmOSw5CisJLnNldCBmMTAsMTAKKwkuc2V0IGYxMSwxMQorCS5zZXQgZjEyLDEyCisJLnNldCBmMTMsMTMKKwkuc2V0IGYxNCwxNAorCS5zZXQgZjE1LDE1CisJLnNldCBmMTYsMTYKKwkuc2V0IGYxNywxNworCS5zZXQgZjE4LDE4CisJLnNldCBmMTksMTkKKwkuc2V0IGYyMCwyMAorCS5zZXQgZjIxLDIxCisKKwkuZXh0ZXJuIC5mZmlfcHJlcF9hcmdzCisKKyNkZWZpbmUgTElCRkZJX0FTTQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorI2RlZmluZSBKVU1QVEFSR0VUKG5hbWUpIG5hbWUKKyNkZWZpbmUgTCh4KSB4CisJLmZpbGUgImFpeC5TIgorCS50b2MKKworCS8qIHZvaWQgZmZpX2NhbGxfQUlYKGV4dGVuZGVkX2NpZiAqZWNpZiwgdW5zaWduZWQgbG9uZyBieXRlcywKKwkgKgkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGludCAqcnZhbHVlLAorCSAqCQkgICAgIHZvaWQgKCpmbikoKSwKKwkgKgkJICAgICB2b2lkICgqcHJlcF9hcmdzKShleHRlbmRlZF9jaWYqLCB1bnNpZ25lZCAqY29uc3QpKTsKKwkgKiByMz1lY2lmLCByND1ieXRlcywgcjU9ZmxhZ3MsIHI2PXJ2YWx1ZSwgcjc9Zm4sIHI4PXByZXBfYXJncworCSAqLworCisuY3NlY3QgLnRleHRbUFJdCisJLmFsaWduIDIKKwkuZ2xvYmwgZmZpX2NhbGxfQUlYCisJLmdsb2JsIC5mZmlfY2FsbF9BSVgKKy5jc2VjdCBmZmlfY2FsbF9BSVhbRFNdCitmZmlfY2FsbF9BSVg6CisjaWZkZWYgX182NEJJVF9fCisJLmxsb25nIC5mZmlfY2FsbF9BSVgsIFRPQ1t0YzBdLCAwCisJLmNzZWN0IC50ZXh0W1BSXQorLmZmaV9jYWxsX0FJWDoKKwkvKiBTYXZlIHJlZ2lzdGVycyB3ZSB1c2UuICAqLworCW1mbHIJcjAKKworCXN0ZAlyMjgsLTMyKHIxKQorCXN0ZAlyMjksLTI0KHIxKQorCXN0ZAlyMzAsLTE2KHIxKQorCXN0ZAlyMzEsIC04KHIxKQorCisJc3RkCXIwLCAxNihyMSkKKwltcglyMjgsIHIxCQkvKiBvdXIgQVAuICAqLworCXN0ZHV4CXIxLCByMSwgcjQKKworCS8qIFNhdmUgYXJndW1lbnRzIG92ZXIgY2FsbC4uLiAgKi8KKwltcglyMzEsIHI1CS8qIGZsYWdzLCAqLworCW1yCXIzMCwgcjYJLyogcnZhbHVlLCAqLworCW1yCXIyOSwgcjcJLyogZnVuY3Rpb24gYWRkcmVzcy4gICovCisJc3RkCXIyLCA0MChyMSkKKworCS8qIENhbGwgZmZpX3ByZXBfYXJncy4gICovCisJbXIJcjQsIHIxCisJYmwJLmZmaV9wcmVwX2FyZ3MKKwlub3AKKworCS8qIE5vdyBkbyB0aGUgY2FsbC4gICovCisJbGQJcjAsIDAocjI5KQorCWxkCXIyLCA4KHIyOSkKKwlsZAlyMTEsIDE2KHIyOSkKKwkvKiBTZXQgdXAgY3IxIHdpdGggYml0cyA0LTcgb2YgdGhlIGZsYWdzLiAgKi8KKwltdGNyZgkweDQwLCByMzEKKwltdGN0cglyMAorCS8qIExvYWQgYWxsIHRob3NlIGFyZ3VtZW50IHJlZ2lzdGVycy4gICovCisJLy8gV2UgaGF2ZSBzZXQgdXAgYSBuaWNlIHN0YWNrIGZyYW1lLCBqdXN0IGxvYWQgaXQgaW50byByZWdpc3RlcnMuCisJbGQJcjMsIDQwKygxKjgpKHIxKQorCWxkCXI0LCA0MCsoMio4KShyMSkKKwlsZAlyNSwgNDArKDMqOCkocjEpCisJbGQJcjYsIDQwKyg0KjgpKHIxKQorCW5vcAorCWxkCXI3LCA0MCsoNSo4KShyMSkKKwlsZAlyOCwgNDArKDYqOCkocjEpCisJbGQJcjksIDQwKyg3KjgpKHIxKQorCWxkCXIxMCw0MCsoOCo4KShyMSkKKworTDE6CisJLyogTG9hZCBhbGwgdGhlIEZQIHJlZ2lzdGVycy4gICovCisJYmYJNixMMiAvLyAyZiArIDB4MTgKKwlsZmQJZjEsLTMyLSgxMyo4KShyMjgpCisJbGZkCWYyLC0zMi0oMTIqOCkocjI4KQorCWxmZAlmMywtMzItKDExKjgpKHIyOCkKKwlsZmQJZjQsLTMyLSgxMCo4KShyMjgpCisJbm9wCisJbGZkCWY1LC0zMi0oOSo4KShyMjgpCisJbGZkCWY2LC0zMi0oOCo4KShyMjgpCisJbGZkCWY3LC0zMi0oNyo4KShyMjgpCisJbGZkCWY4LC0zMi0oNio4KShyMjgpCisJbm9wCisJbGZkCWY5LC0zMi0oNSo4KShyMjgpCisJbGZkCWYxMCwtMzItKDQqOCkocjI4KQorCWxmZAlmMTEsLTMyLSgzKjgpKHIyOCkKKwlsZmQJZjEyLC0zMi0oMio4KShyMjgpCisJbm9wCisJbGZkCWYxMywtMzItKDEqOCkocjI4KQorCitMMjoKKwkvKiBNYWtlIHRoZSBjYWxsLiAgKi8KKwliY3RybAorCWxkCXIyLCA0MChyMSkKKworCS8qIE5vdywgZGVhbCB3aXRoIHRoZSByZXR1cm4gdmFsdWUuICAqLworCW10Y3JmCTB4MDEsIHIzMQorCisJYnQJMzAsIEwoZG9uZV9yZXR1cm5fdmFsdWUpCisJYnQJMjksIEwoZnBfcmV0dXJuX3ZhbHVlKQorCXN0ZAlyMywgMChyMzApCisKKwkvKiBGYWxsIHRocm91Z2guLi4gICovCisKK0woZG9uZV9yZXR1cm5fdmFsdWUpOgorCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVycyB3ZSB1c2VkIGFuZCByZXR1cm4uICAqLworCW1yCXIxLCByMjgKKwlsZAlyMCwgMTYocjI4KQorCWxkCXIyOCwgLTMyKHIxKQorCW10bHIJcjAKKwlsZAlyMjksIC0yNChyMSkKKwlsZAlyMzAsIC0xNihyMSkKKwlsZAlyMzEsIC04KHIxKQorCWJscgorCitMKGZwX3JldHVybl92YWx1ZSk6CisJYmYJMjgsIEwoZmxvYXRfcmV0dXJuX3ZhbHVlKQorCXN0ZmQJZjEsIDAocjMwKQorCWJmCTMxLCBMKGRvbmVfcmV0dXJuX3ZhbHVlKQorCXN0ZmQJZjIsIDgocjMwKQorCWIJTChkb25lX3JldHVybl92YWx1ZSkKK0woZmxvYXRfcmV0dXJuX3ZhbHVlKToKKwlzdGZzCWYxLCAwKHIzMCkKKwliCUwoZG9uZV9yZXR1cm5fdmFsdWUpCisKKyNlbHNlIC8qICEgX182NEJJVF9fICovCisJCisJLmxvbmcgLmZmaV9jYWxsX0FJWCwgVE9DW3RjMF0sIDAKKwkuY3NlY3QgLnRleHRbUFJdCisuZmZpX2NhbGxfQUlYOgorCS8qIFNhdmUgcmVnaXN0ZXJzIHdlIHVzZS4gICovCisJbWZscglyMAorCisJc3R3CXIyOCwtMTYocjEpCisJc3R3CXIyOSwtMTIocjEpCisJc3R3CXIzMCwgLTgocjEpCisJc3R3CXIzMSwgLTQocjEpCisKKwlzdHcJcjAsIDgocjEpCisJbXIJcjI4LCByMQkJLyogb3V0IEFQLiAgKi8KKwlzdHd1eAlyMSwgcjEsIHI0CisKKwkvKiBTYXZlIGFyZ3VtZW50cyBvdmVyIGNhbGwuLi4gICovCisJbXIJcjMxLCByNQkvKiBmbGFncywgKi8KKwltcglyMzAsIHI2CS8qIHJ2YWx1ZSwgKi8KKwltcglyMjksIHI3CS8qIGZ1bmN0aW9uIGFkZHJlc3MsICovCisJc3R3CXIyLCAyMChyMSkKKworCS8qIENhbGwgZmZpX3ByZXBfYXJncy4gICovCisJbXIJcjQsIHIxCisJYmwJLmZmaV9wcmVwX2FyZ3MKKwlub3AKKworCS8qIE5vdyBkbyB0aGUgY2FsbC4gICovCisJbHd6CXIwLCAwKHIyOSkKKwlsd3oJcjIsIDQocjI5KQorCWx3eglyMTEsIDgocjI5KQorCS8qIFNldCB1cCBjcjEgd2l0aCBiaXRzIDQtNyBvZiB0aGUgZmxhZ3MuICAqLworCW10Y3JmCTB4NDAsIHIzMQorCW10Y3RyCXIwCisJLyogTG9hZCBhbGwgdGhvc2UgYXJndW1lbnQgcmVnaXN0ZXJzLiAgKi8KKwkvLyBXZSBoYXZlIHNldCB1cCBhIG5pY2Ugc3RhY2sgZnJhbWUsIGp1c3QgbG9hZCBpdCBpbnRvIHJlZ2lzdGVycy4KKwlsd3oJcjMsIDIwKygxKjQpKHIxKQorCWx3eglyNCwgMjArKDIqNCkocjEpCisJbHd6CXI1LCAyMCsoMyo0KShyMSkKKwlsd3oJcjYsIDIwKyg0KjQpKHIxKQorCW5vcAorCWx3eglyNywgMjArKDUqNCkocjEpCisJbHd6CXI4LCAyMCsoNio0KShyMSkKKwlsd3oJcjksIDIwKyg3KjQpKHIxKQorCWx3eglyMTAsMjArKDgqNCkocjEpCisKK0wxOgorCS8qIExvYWQgYWxsIHRoZSBGUCByZWdpc3RlcnMuICAqLworCWJmCTYsTDIgLy8gMmYgKyAweDE4CisJbGZkCWYxLC0xNi0oMTMqOCkocjI4KQorCWxmZAlmMiwtMTYtKDEyKjgpKHIyOCkKKwlsZmQJZjMsLTE2LSgxMSo4KShyMjgpCisJbGZkCWY0LC0xNi0oMTAqOCkocjI4KQorCW5vcAorCWxmZAlmNSwtMTYtKDkqOCkocjI4KQorCWxmZAlmNiwtMTYtKDgqOCkocjI4KQorCWxmZAlmNywtMTYtKDcqOCkocjI4KQorCWxmZAlmOCwtMTYtKDYqOCkocjI4KQorCW5vcAorCWxmZAlmOSwtMTYtKDUqOCkocjI4KQorCWxmZAlmMTAsLTE2LSg0KjgpKHIyOCkKKwlsZmQJZjExLC0xNi0oMyo4KShyMjgpCisJbGZkCWYxMiwtMTYtKDIqOCkocjI4KQorCW5vcAorCWxmZAlmMTMsLTE2LSgxKjgpKHIyOCkKKworTDI6CisJLyogTWFrZSB0aGUgY2FsbC4gICovCisJYmN0cmwKKwlsd3oJcjIsIDIwKHIxKQorCisJLyogTm93LCBkZWFsIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gICovCisJbXRjcmYJMHgwMSwgcjMxCisKKwlidAkzMCwgTChkb25lX3JldHVybl92YWx1ZSkKKwlidAkyOSwgTChmcF9yZXR1cm5fdmFsdWUpCisJc3R3CXIzLCAwKHIzMCkKKwliZgkyOCwgTChkb25lX3JldHVybl92YWx1ZSkKKwlzdHcJcjQsIDQocjMwKQorCisJLyogRmFsbCB0aHJvdWdoLi4uICAqLworCitMKGRvbmVfcmV0dXJuX3ZhbHVlKToKKwkvKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgd2UgdXNlZCBhbmQgcmV0dXJuLiAgKi8KKwltcglyMSwgcjI4CisJbHd6CXIwLCA4KHIyOCkKKwlsd3oJcjI4LC0xNihyMSkKKwltdGxyCXIwCisJbHd6CXIyOSwtMTIocjEpCisJbHd6CXIzMCwgLTgocjEpCisJbHd6CXIzMSwgLTQocjEpCisJYmxyCisKK0woZnBfcmV0dXJuX3ZhbHVlKToKKwliZgkyOCwgTChmbG9hdF9yZXR1cm5fdmFsdWUpCisJc3RmZAlmMSwgMChyMzApCisJYglMKGRvbmVfcmV0dXJuX3ZhbHVlKQorTChmbG9hdF9yZXR1cm5fdmFsdWUpOgorCXN0ZnMJZjEsIDAocjMwKQorCWIJTChkb25lX3JldHVybl92YWx1ZSkKKyNlbmRpZgorCS5sb25nIDAKKwkuYnl0ZSAwLDAsMCwxLDEyOCw0LDAsMAorLy9FTkQoZmZpX2NhbGxfQUlYKQorCisuY3NlY3QgLnRleHRbUFJdCisJLmFsaWduIDIKKwkuZ2xvYmwgZmZpX2NhbGxfREFSV0lOCisJLmdsb2JsIC5mZmlfY2FsbF9EQVJXSU4KKy5jc2VjdCBmZmlfY2FsbF9EQVJXSU5bRFNdCitmZmlfY2FsbF9EQVJXSU46CisjaWZkZWYgX182NEJJVF9fCisJLmxsb25nIC5mZmlfY2FsbF9EQVJXSU4sIFRPQ1t0YzBdLCAwCisjZWxzZQorCS5sb25nIC5mZmlfY2FsbF9EQVJXSU4sIFRPQ1t0YzBdLCAwCisjZW5kaWYKKwkuY3NlY3QgLnRleHRbUFJdCisuZmZpX2NhbGxfREFSV0lOOgorCWJscgorCS5sb25nIDAKKwkuYnl0ZSAwLDAsMCwwLDAsMCwwLDAKKy8vRU5EKGZmaV9jYWxsX0RBUldJTikKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2FpeF9jbG9zdXJlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwNjAxNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9haXhfY2xvc3VyZS5TCkBAIC0wLDAgKzEsNDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgYWl4X2Nsb3N1cmUuUyAtIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIGJhc2VkIG9uIGRhcndpbl9jbG9zdXJlLlMKKworICAgUG93ZXJQQyBBc3NlbWJseSBnbHVlLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLnNldCByMCwwCisJLnNldCByMSwxCisJLnNldCByMiwyCisJLnNldCByMywzCisJLnNldCByNCw0CisJLnNldCByNSw1CisJLnNldCByNiw2CisJLnNldCByNyw3CisJLnNldCByOCw4CisJLnNldCByOSw5CisJLnNldCByMTAsMTAKKwkuc2V0IHIxMSwxMQorCS5zZXQgcjEyLDEyCisJLnNldCByMTMsMTMKKwkuc2V0IHIxNCwxNAorCS5zZXQgcjE1LDE1CisJLnNldCByMTYsMTYKKwkuc2V0IHIxNywxNworCS5zZXQgcjE4LDE4CisJLnNldCByMTksMTkKKwkuc2V0IHIyMCwyMAorCS5zZXQgcjIxLDIxCisJLnNldCByMjIsMjIKKwkuc2V0IHIyMywyMworCS5zZXQgcjI0LDI0CisJLnNldCByMjUsMjUKKwkuc2V0IHIyNiwyNgorCS5zZXQgcjI3LDI3CisJLnNldCByMjgsMjgKKwkuc2V0IHIyOSwyOQorCS5zZXQgcjMwLDMwCisJLnNldCByMzEsMzEKKwkuc2V0IGYwLDAKKwkuc2V0IGYxLDEKKwkuc2V0IGYyLDIKKwkuc2V0IGYzLDMKKwkuc2V0IGY0LDQKKwkuc2V0IGY1LDUKKwkuc2V0IGY2LDYKKwkuc2V0IGY3LDcKKwkuc2V0IGY4LDgKKwkuc2V0IGY5LDkKKwkuc2V0IGYxMCwxMAorCS5zZXQgZjExLDExCisJLnNldCBmMTIsMTIKKwkuc2V0IGYxMywxMworCS5zZXQgZjE0LDE0CisJLnNldCBmMTUsMTUKKwkuc2V0IGYxNiwxNgorCS5zZXQgZjE3LDE3CisJLnNldCBmMTgsMTgKKwkuc2V0IGYxOSwxOQorCS5zZXQgZjIwLDIwCisJLnNldCBmMjEsMjEKKworCS5leHRlcm4gLmZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4KKworI2RlZmluZSBMSUJGRklfQVNNCisjZGVmaW5lIEpVTVBUQVJHRVQobmFtZSkgbmFtZQorI2RlZmluZSBMKHgpIHgKKwkuZmlsZSAiYWl4X2Nsb3N1cmUuUyIKKwkudG9jCitMQy4uNjA6CisJLnRjIEwuLjYwW1RDXSxMLi42MAorCS5jc2VjdCAudGV4dFtQUl0KKwkuYWxpZ24gMgorCisuY3NlY3QgLnRleHRbUFJdCisJLmFsaWduIDIKKwkuZ2xvYmwgZmZpX2Nsb3N1cmVfQVNNCisJLmdsb2JsIC5mZmlfY2xvc3VyZV9BU00KKy5jc2VjdCBmZmlfY2xvc3VyZV9BU01bRFNdCitmZmlfY2xvc3VyZV9BU006CisjaWZkZWYgX182NEJJVF9fCisJLmxsb25nIC5mZmlfY2xvc3VyZV9BU00sIFRPQ1t0YzBdLCAwCisJLmNzZWN0IC50ZXh0W1BSXQorLmZmaV9jbG9zdXJlX0FTTToKKy8qIHdlIHdhbnQgdG8gYnVpbGQgdXAgYW4gYXJlYSBmb3IgdGhlIHBhcmFtZXRlcnMgcGFzc2VkICovCisvKiBpbiByZWdpc3RlcnMgKGJvdGggZmxvYXRpbmcgcG9pbnQgYW5kIGludGVnZXIpICovCisKKwkvKiB3ZSBzdG9yZSBncHIgMyB0byBncHIgMTAgKGFsaWduZWQgdG8gNCkKKwlpbiB0aGUgcGFyZW50cyBvdXRnb2luZyBhcmVhICAqLworCXN0ZCAgIHIzLCA0OCsoMCo4KShyMSkKKwlzdGQgICByNCwgNDgrKDEqOCkocjEpCisJc3RkICAgcjUsIDQ4KygyKjgpKHIxKQorCXN0ZCAgIHI2LCA0OCsoMyo4KShyMSkKKwltZmxyICByMAorCisJc3RkICAgcjcsIDQ4Kyg0KjgpKHIxKQorCXN0ZCAgIHI4LCA0OCsoNSo4KShyMSkKKwlzdGQgICByOSwgNDgrKDYqOCkocjEpCisJc3RkICAgcjEwLCA0OCsoNyo4KShyMSkKKwlzdGQgICByMCwgMTYocjEpCS8qIHNhdmUgdGhlIHJldHVybiBhZGRyZXNzICovCisKKworCS8qIDQ4ICBCeXRlcyAoTGlua2FnZSBBcmVhKSAqLworCS8qIDY0ICBCeXRlcyAocGFyYW1zKSAqLworCS8qIDE2ICBCeXRlcyAocmVzdWx0KSAqLworCS8qIDEwNCBCeXRlcyAoMTMqOCBmcm9tIEZQUikgKi8KKwkvKiA4ICAgQnl0ZXMgKGFsaWdubWVudCkgKi8KKwkvKiAyNDAgQnl0ZXMgKi8KKworCXN0ZHUgIHIxLCAtMjQwKHIxKQkvKiBza2lwIG92ZXIgY2FsbGVyIHNhdmUgYXJlYQorCQkJCSAgIGtlZXAgc3RhY2sgYWxpZ25lZCB0byAxNiAgKi8KKworCS8qIG5leHQgc2F2ZSBmcHIgMSB0byBmcHIgMTMgKGFsaWduZWQgdG8gOCkgKi8KKwlzdGZkICBmMSwgMTI4KygwKjgpKHIxKQorCXN0ZmQgIGYyLCAxMjgrKDEqOCkocjEpCisJc3RmZCAgZjMsIDEyOCsoMio4KShyMSkKKwlzdGZkICBmNCwgMTI4KygzKjgpKHIxKQorCXN0ZmQgIGY1LCAxMjgrKDQqOCkocjEpCisJc3RmZCAgZjYsIDEyOCsoNSo4KShyMSkKKwlzdGZkICBmNywgMTI4Kyg2KjgpKHIxKQorCXN0ZmQgIGY4LCAxMjgrKDcqOCkocjEpCisJc3RmZCAgZjksIDEyOCsoOCo4KShyMSkKKwlzdGZkICBmMTAsIDEyOCsoOSo4KShyMSkKKwlzdGZkICBmMTEsIDEyOCsoMTAqOCkocjEpCisJc3RmZCAgZjEyLCAxMjgrKDExKjgpKHIxKQorCXN0ZmQgIGYxMywgMTI4KygxMio4KShyMSkKKworCS8qIHNldCB1cCByZWdpc3RlcnMgZm9yIHRoZSByb3V0aW5lIHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgd29yayAqLworCS8qIGdldCB0aGUgY29udGV4dCBwb2ludGVyIGZyb20gdGhlIHRyYW1wb2xpbmUgKi8KKwltciByMywgcjExCisKKwkvKiBub3cgbG9hZCB1cCB0aGUgcG9pbnRlciB0byB0aGUgcmVzdWx0IHN0b3JhZ2UgKi8KKwlhZGRpIHI0LCByMSwgMTEyCisKKwkvKiBub3cgbG9hZCB1cCB0aGUgcG9pbnRlciB0byB0aGUgc2F2ZWQgZ3ByIHJlZ2lzdGVycyAqLworCWFkZGkgcjUsIHIxLCAyODgKKworCS8qIG5vdyBsb2FkIHVwIHRoZSBwb2ludGVyIHRvIHRoZSBzYXZlZCBmcHIgcmVnaXN0ZXJzICovCisJYWRkaSByNiwgcjEsIDEyOAorCisJLyogbWFrZSB0aGUgY2FsbCAqLworCWJsIC5mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOCisJbm9wCisKKwkvKiBub3cgcjMgY29udGFpbnMgdGhlIHJldHVybiB0eXBlICovCisJLyogc28gdXNlIGl0IHRvIGxvb2sgdXAgaW4gYSB0YWJsZSAqLworCS8qIHNvIHdlIGtub3cgaG93IHRvIGRlYWwgd2l0aCBlYWNoIHR5cGUgKi8KKworCS8qIGxvb2sgdXAgdGhlIHByb3BlciBzdGFydGluZyBwb2ludCBpbiB0YWJsZSAgKi8KKwkvKiBieSB1c2luZyByZXR1cm4gdHlwZSBhcyBvZmZzZXQgKi8KKwlsZAlyNCwgTEMuLjYwKDIpCS8qIGdldCBhZGRyZXNzIG9mIGp1bXAgdGFibGUgKi8KKwlzbGRpCXIzLCByMywgNAkvKiBub3cgbXVsdGlwbHkgcmV0dXJuIHR5cGUgYnkgMTYgKi8KKwlsZAlyMCwgMjQwKzE2KHIxKQkvKiBsb2FkIHJldHVybiBhZGRyZXNzICovCisJYWRkCXIzLCByMywgcjQJLyogYWRkIGNvbnRlbnRzIG9mIHRhYmxlIHRvIHRhYmxlIGFkZHJlc3MgKi8KKwltdGN0cglyMworCWJjdHIJCQkvKiBqdW1wIHRvIGl0ICovCisKKy8qIEVhY2ggZnJhZ21lbnQgbXVzdCBiZSBleGFjdGx5IDE2IGJ5dGVzIGxvbmcgKDQgaW5zdHJ1Y3Rpb25zKS4KKyAgIEFsaWduIHRvIDE2IGJ5dGUgYm91bmRhcnkgZm9yIGNhY2hlIGFuZCBkaXNwYXRjaCBlZmZpY2llbmN5LiAgKi8KKwkuYWxpZ24gNAorCitMLi42MDoKKy8qIGNhc2UgRkZJX1RZUEVfVk9JRCAqLworCW10bHIgcjAKKwlhZGRpIHIxLCByMSwgMjQwCisJYmxyCisJbm9wCisKKy8qIGNhc2UgRkZJX1RZUEVfSU5UICovCisJbHdhIHIzLCAxMTIrNChyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDI0MAorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX0ZMT0FUICovCisJbGZzIGYxLCAxMTIrMChyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDI0MAorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX0RPVUJMRSAqLworCWxmZCBmMSwgMTEyKzAocjEpCisJbXRsciByMAorCWFkZGkgcjEsIHIxLCAyNDAKKwlibHIKKworLyogY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFICovCisJbGZkIGYxLCAxMTIrMChyMSkKKwltdGxyIHIwCisJbGZkIGYyLCAxMTIrOChyMSkKKwliIEwuLmZpbmlzaAorCisvKiBjYXNlIEZGSV9UWVBFX1VJTlQ4ICovCisJbGJ6IHIzLCAxMTIrNyhyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDI0MAorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX1NJTlQ4ICovCisJbGJ6IHIzLCAxMTIrNyhyMSkKKwltdGxyIHIwCisJZXh0c2IgcjMsIHIzCisJYiBMLi5maW5pc2gKKworLyogY2FzZSBGRklfVFlQRV9VSU5UMTYgKi8KKwlsaHogcjMsIDExMis2KHIxKQorCW10bHIgcjAKK0wuLmZpbmlzaDoKKwlhZGRpIHIxLCByMSwgMjQwCisJYmxyCisKKy8qIGNhc2UgRkZJX1RZUEVfU0lOVDE2ICovCisJbGhhIHIzLCAxMTIrNihyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDI0MAorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX1VJTlQzMiAqLworCWx3eiByMywgMTEyKzQocjEpCisJbXRsciByMAorCWFkZGkgcjEsIHIxLCAyNDAKKwlibHIKKworLyogY2FzZSBGRklfVFlQRV9TSU5UMzIgKi8KKwlsd2EgcjMsIDExMis0KHIxKQorCW10bHIgcjAKKwlhZGRpIHIxLCByMSwgMjQwCisJYmxyCisKKy8qIGNhc2UgRkZJX1RZUEVfVUlOVDY0ICovCisJbGQgcjMsIDExMiswKHIxKQorCW10bHIgcjAKKwlhZGRpIHIxLCByMSwgMjQwCisJYmxyCisKKy8qIGNhc2UgRkZJX1RZUEVfU0lOVDY0ICovCisJbGQgcjMsIDExMiswKHIxKQorCW10bHIgcjAKKwlhZGRpIHIxLCByMSwgMjQwCisJYmxyCisKKy8qIGNhc2UgRkZJX1RZUEVfU1RSVUNUICovCisJbXRsciByMAorCWFkZGkgcjEsIHIxLCAyNDAKKwlibHIKKwlub3AKKworLyogY2FzZSBGRklfVFlQRV9QT0lOVEVSICovCisJbGQgcjMsIDExMiswKHIxKQorCW10bHIgcjAKKwlhZGRpIHIxLCByMSwgMjQwCisJYmxyCisKKyNlbHNlIC8qICEgX182NEJJVF9fICovCisJCisJLmxvbmcgLmZmaV9jbG9zdXJlX0FTTSwgVE9DW3RjMF0sIDAKKwkuY3NlY3QgLnRleHRbUFJdCisuZmZpX2Nsb3N1cmVfQVNNOgorLyogd2Ugd2FudCB0byBidWlsZCB1cCBhbiBhcmVhIGZvciB0aGUgcGFyYW1ldGVycyBwYXNzZWQgKi8KKy8qIGluIHJlZ2lzdGVycyAoYm90aCBmbG9hdGluZyBwb2ludCBhbmQgaW50ZWdlcikgKi8KKworCS8qIHdlIHN0b3JlIGdwciAzIHRvIGdwciAxMCAoYWxpZ25lZCB0byA0KQorCWluIHRoZSBwYXJlbnRzIG91dGdvaW5nIGFyZWEgICovCisJc3R3ICAgcjMsIDI0KygwKjQpKHIxKQorCXN0dyAgIHI0LCAyNCsoMSo0KShyMSkKKwlzdHcgICByNSwgMjQrKDIqNCkocjEpCisJc3R3ICAgcjYsIDI0KygzKjQpKHIxKQorCW1mbHIgIHIwCisKKwlzdHcgICByNywgMjQrKDQqNCkocjEpCisJc3R3ICAgcjgsIDI0Kyg1KjQpKHIxKQorCXN0dyAgIHI5LCAyNCsoNio0KShyMSkKKwlzdHcgICByMTAsIDI0Kyg3KjQpKHIxKQorCXN0dyAgIHIwLCA4KHIxKQorCisJLyogMjQgQnl0ZXMgKExpbmthZ2UgQXJlYSkgKi8KKwkvKiAzMiBCeXRlcyAocGFyYW1zKSAqLworCS8qIDE2ICBCeXRlcyAocmVzdWx0KSAqLworCS8qIDEwNCBCeXRlcyAoMTMqOCBmcm9tIEZQUikgKi8KKwkvKiAxNzYgQnl0ZXMgKi8KKworCXN0d3UgIHIxLCAtMTc2KHIxKQkvKiBza2lwIG92ZXIgY2FsbGVyIHNhdmUgYXJlYQorCQkJCSAgIGtlZXAgc3RhY2sgYWxpZ25lZCB0byAxNiAgKi8KKworCS8qIG5leHQgc2F2ZSBmcHIgMSB0byBmcHIgMTMgKGFsaWduZWQgdG8gOCkgKi8KKwlzdGZkICBmMSwgNzIrKDAqOCkocjEpCisJc3RmZCAgZjIsIDcyKygxKjgpKHIxKQorCXN0ZmQgIGYzLCA3MisoMio4KShyMSkKKwlzdGZkICBmNCwgNzIrKDMqOCkocjEpCisJc3RmZCAgZjUsIDcyKyg0KjgpKHIxKQorCXN0ZmQgIGY2LCA3MisoNSo4KShyMSkKKwlzdGZkICBmNywgNzIrKDYqOCkocjEpCisJc3RmZCAgZjgsIDcyKyg3KjgpKHIxKQorCXN0ZmQgIGY5LCA3MisoOCo4KShyMSkKKwlzdGZkICBmMTAsIDcyKyg5KjgpKHIxKQorCXN0ZmQgIGYxMSwgNzIrKDEwKjgpKHIxKQorCXN0ZmQgIGYxMiwgNzIrKDExKjgpKHIxKQorCXN0ZmQgIGYxMywgNzIrKDEyKjgpKHIxKQorCisJLyogc2V0IHVwIHJlZ2lzdGVycyBmb3IgdGhlIHJvdXRpbmUgdGhhdCBhY3R1YWxseSBkb2VzIHRoZSB3b3JrICovCisJLyogZ2V0IHRoZSBjb250ZXh0IHBvaW50ZXIgZnJvbSB0aGUgdHJhbXBvbGluZSAqLworCW1yIHIzLCByMTEKKworCS8qIG5vdyBsb2FkIHVwIHRoZSBwb2ludGVyIHRvIHRoZSByZXN1bHQgc3RvcmFnZSAqLworCWFkZGkgcjQsIHIxLCA1NgorCisJLyogbm93IGxvYWQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIHNhdmVkIGdwciByZWdpc3RlcnMgKi8KKwlhZGRpIHI1LCByMSwgMjAwCisKKwkvKiBub3cgbG9hZCB1cCB0aGUgcG9pbnRlciB0byB0aGUgc2F2ZWQgZnByIHJlZ2lzdGVycyAqLworCWFkZGkgcjYsIHIxLCA3MgorCisJLyogbWFrZSB0aGUgY2FsbCAqLworCWJsIC5mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOCisJbm9wCisKKwkvKiBub3cgcjMgY29udGFpbnMgdGhlIHJldHVybiB0eXBlICovCisJLyogc28gdXNlIGl0IHRvIGxvb2sgdXAgaW4gYSB0YWJsZSAqLworCS8qIHNvIHdlIGtub3cgaG93IHRvIGRlYWwgd2l0aCBlYWNoIHR5cGUgKi8KKworCS8qIGxvb2sgdXAgdGhlIHByb3BlciBzdGFydGluZyBwb2ludCBpbiB0YWJsZSAgKi8KKwkvKiBieSB1c2luZyByZXR1cm4gdHlwZSBhcyBvZmZzZXQgKi8KKwlsd3oJcjQsIExDLi42MCgyKQkvKiBnZXQgYWRkcmVzcyBvZiBqdW1wIHRhYmxlICovCisJc2x3aQlyMywgcjMsIDQJLyogbm93IG11bHRpcGx5IHJldHVybiB0eXBlIGJ5IDQgKi8KKwlsd3oJcjAsIDE3Nis4KHIxKQkvKiBsb2FkIHJldHVybiBhZGRyZXNzICovCisJYWRkCXIzLCByMywgcjQJLyogYWRkIGNvbnRlbnRzIG9mIHRhYmxlIHRvIHRhYmxlIGFkZHJlc3MgKi8KKwltdGN0cglyMworCWJjdHIJCQkvKiBqdW1wIHRvIGl0ICovCisKKy8qIEVhY2ggZnJhZ21lbnQgbXVzdCBiZSBleGFjdGx5IDE2IGJ5dGVzIGxvbmcgKDQgaW5zdHJ1Y3Rpb25zKS4KKyAgIEFsaWduIHRvIDE2IGJ5dGUgYm91bmRhcnkgZm9yIGNhY2hlIGFuZCBkaXNwYXRjaCBlZmZpY2llbmN5LiAgKi8KKwkuYWxpZ24gNAorCitMLi42MDoKKy8qIGNhc2UgRkZJX1RZUEVfVk9JRCAqLworCW10bHIgcjAKKwlhZGRpIHIxLCByMSwgMTc2CisJYmxyCisJbm9wCisKKy8qIGNhc2UgRkZJX1RZUEVfSU5UICovCisJbHd6IHIzLCA1NiswKHIxKQorCW10bHIgcjAKKwlhZGRpIHIxLCByMSwgMTc2CisJYmxyCisKKy8qIGNhc2UgRkZJX1RZUEVfRkxPQVQgKi8KKwlsZnMgZjEsIDU2KzAocjEpCisJbXRsciByMAorCWFkZGkgcjEsIHIxLCAxNzYKKwlibHIKKworLyogY2FzZSBGRklfVFlQRV9ET1VCTEUgKi8KKwlsZmQgZjEsIDU2KzAocjEpCisJbXRsciByMAorCWFkZGkgcjEsIHIxLCAxNzYKKwlibHIKKworLyogY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFICovCisJbGZkIGYxLCA1NiswKHIxKQorCW10bHIgcjAKKwlsZmQgZjIsIDU2KzgocjEpCisJYiBMLi5maW5pc2gKKworLyogY2FzZSBGRklfVFlQRV9VSU5UOCAqLworCWxieiByMywgNTYrMyhyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDE3NgorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX1NJTlQ4ICovCisJbGJ6IHIzLCA1NiszKHIxKQorCW10bHIgcjAKKwlleHRzYiByMywgcjMKKwliIEwuLmZpbmlzaAorCisvKiBjYXNlIEZGSV9UWVBFX1VJTlQxNiAqLworCWxoeiByMywgNTYrMihyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDE3NgorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX1NJTlQxNiAqLworCWxoYSByMywgNTYrMihyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDE3NgorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX1VJTlQzMiAqLworCWx3eiByMywgNTYrMChyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDE3NgorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX1NJTlQzMiAqLworCWx3eiByMywgNTYrMChyMSkKKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDE3NgorCWJscgorCisvKiBjYXNlIEZGSV9UWVBFX1VJTlQ2NCAqLworCWx3eiByMywgNTYrMChyMSkKKwltdGxyIHIwCisJbHd6IHI0LCA1Nis0KHIxKQorCWIgTC4uZmluaXNoCisKKy8qIGNhc2UgRkZJX1RZUEVfU0lOVDY0ICovCisJbHd6IHIzLCA1NiswKHIxKQorCW10bHIgcjAKKwlsd3ogcjQsIDU2KzQocjEpCisJYiBMLi5maW5pc2gKKworLyogY2FzZSBGRklfVFlQRV9TVFJVQ1QgKi8KKwltdGxyIHIwCisJYWRkaSByMSwgcjEsIDE3NgorCWJscgorCW5vcAorCisvKiBjYXNlIEZGSV9UWVBFX1BPSU5URVIgKi8KKwlsd3ogcjMsIDU2KzAocjEpCisJbXRsciByMAorTC4uZmluaXNoOgorCWFkZGkgcjEsIHIxLCAxNzYKKwlibHIKKyNlbmRpZgorLyogRU5EKGZmaV9jbG9zdXJlX0FTTSkgKi8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9hc20uaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRmNjJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2FzbS5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgYXNtLmggLSBDb3B5cmlnaHQgKGMpIDE5OTggR2VvZmZyZXkgS2VhdGluZworCisgICBQb3dlclBDIEFzc2VtYmx5IGdsdWUuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQVNNX0dMT0JBTF9ESVJFQ1RJVkUgLmdsb2JsCisKKworI2RlZmluZSBDX1NZTUJPTF9OQU1FKG5hbWUpIG5hbWUKKy8qIE1hY3JvIGZvciBhIGxhYmVsLiAgKi8KKyNpZmRlZglfX1NURENfXworI2RlZmluZSBDX0xBQkVMKG5hbWUpCQluYW1lIyM6CisjZWxzZQorI2RlZmluZSBDX0xBQkVMKG5hbWUpCQluYW1lLyoqLzoKKyNlbmRpZgorCisvKiBUaGlzIHNlZW1zIHRvIGFsd2F5cyBiZSB0aGUgY2FzZSBvbiBQUEMuICAqLworI2RlZmluZSBBTElHTkFSRyhsb2cyKSBsb2cyCisvKiBGb3IgRUxGIHdlIG5lZWQgdGhlIGAudHlwZScgZGlyZWN0aXZlIHRvIG1ha2Ugc2hhcmVkIGxpYnMgd29yayByaWdodC4gICovCisjZGVmaW5lIEFTTV9UWVBFX0RJUkVDVElWRShuYW1lLHR5cGVhcmcpIC50eXBlIG5hbWUsdHlwZWFyZzsKKyNkZWZpbmUgQVNNX1NJWkVfRElSRUNUSVZFKG5hbWUpIC5zaXplIG5hbWUsLi1uYW1lCisKKy8qIElmIGNvbXBpbGVkIGZvciBwcm9maWxpbmcsIGNhbGwgYF9tY291bnQnIGF0IHRoZSBzdGFydCBvZiBlYWNoIGZ1bmN0aW9uLiAgKi8KKyNpZmRlZglQUk9GCisvKiBUaGUgbWNvdW50IGNvZGUgcmVsaWVzIG9uIHRoZSByZXR1cm4gYWRkcmVzcyBiZWluZyBvbiB0aGUgc3RhY2sKKyAgIHRvIGxvY2F0ZSBvdXIgY2FsbGVyIGFuZCBzbyBpdCBjYW4gcmVzdG9yZSBpdDsgc28gc3RvcmUgb25lIGp1c3QKKyAgIGZvciBpdHMgYmVuZWZpdC4gICovCisjaWZkZWYgUElDCisjZGVmaW5lIENBTExfTUNPVU5UCQkJCQkJCSAgICAgIFwKKyAgLnB1c2hzZWN0aW9uOwkJCQkJCQkJICAgICAgXAorICAuc2VjdGlvbiAiLmRhdGEiOwkJCQkJCQkgICAgICBcCisgIC5hbGlnbiBBTElHTkFSRygyKTsJCQkJCQkJICAgICAgXAorMDoubG9uZyAwOwkJCQkJCQkJICAgICAgXAorICAucHJldmlvdXM7CQkJCQkJCQkgICAgICBcCisgIG1mbHIgICVyMDsJCQkJCQkJCSAgICAgIFwKKyAgc3R3ICAgJXIwLDQoJXIxKTsJCQkJCQkJICAgICAgXAorICBibCAgICBfR0xPQkFMX09GRlNFVF9UQUJMRV9AbG9jYWwtNDsJCQkJCSAgICAgIFwKKyAgbWZsciAgJXIxMTsJCQkJCQkJCSAgICAgIFwKKyAgbHd6ICAgJXIwLDBiQGdvdCglcjExKTsJCQkJCQkgICAgICBcCisgIGJsICAgIEpVTVBUQVJHRVQoX21jb3VudCk7CisjZWxzZSAgLyogUElDICovCisjZGVmaW5lIENBTExfTUNPVU5UCQkJCQkJCSAgICAgIFwKKyAgLnNlY3Rpb24gIi5kYXRhIjsJCQkJCQkJICAgICAgXAorICAuYWxpZ24gQUxJR05BUkcoMik7CQkJCQkJCSAgICAgIFwKKzA6LmxvbmcgMDsJCQkJCQkJCSAgICAgIFwKKyAgLnByZXZpb3VzOwkJCQkJCQkJICAgICAgXAorICBtZmxyICAlcjA7CQkJCQkJCQkgICAgICBcCisgIGxpcyAgICVyMTEsMGJAaGE7CQkJCQkJCSAgICAgIFwKKyAgc3R3ICAgJXIwLDQoJXIxKTsJCQkJCQkJICAgICAgXAorICBhZGRpICAlcjAsJXIxMSwwYkBsOwkJCQkJCQkgICAgICBcCisgIGJsICAgIEpVTVBUQVJHRVQoX21jb3VudCk7CisjZW5kaWYgLyogUElDICovCisjZWxzZSAgLyogUFJPRiAqLworI2RlZmluZSBDQUxMX01DT1VOVAkJLyogRG8gbm90aGluZy4gICovCisjZW5kaWYgLyogUFJPRiAqLworCisjZGVmaW5lCUVOVFJZKG5hbWUpCQkJCQkJCSAgICAgIFwKKyAgQVNNX0dMT0JBTF9ESVJFQ1RJVkUgQ19TWU1CT0xfTkFNRShuYW1lKTsJCQkJICAgICAgXAorICBBU01fVFlQRV9ESVJFQ1RJVkUgKENfU1lNQk9MX05BTUUobmFtZSksQGZ1bmN0aW9uKQkJCSAgICAgIFwKKyAgLmFsaWduIEFMSUdOQVJHKDIpOwkJCQkJCQkgICAgICBcCisgIENfTEFCRUwobmFtZSkJCQkJCQkJCSAgICAgIFwKKyAgQ0FMTF9NQ09VTlQKKworI2RlZmluZSBFQUxJR05fV18wICAvKiBObyB3b3JkcyB0byBpbnNlcnQuICAqLworI2RlZmluZSBFQUxJR05fV18xICBub3AKKyNkZWZpbmUgRUFMSUdOX1dfMiAgbm9wO25vcAorI2RlZmluZSBFQUxJR05fV18zICBub3A7bm9wO25vcAorI2RlZmluZSBFQUxJR05fV180ICBFQUxJR05fV18zO25vcAorI2RlZmluZSBFQUxJR05fV181ICBFQUxJR05fV180O25vcAorI2RlZmluZSBFQUxJR05fV182ICBFQUxJR05fV181O25vcAorI2RlZmluZSBFQUxJR05fV183ICBFQUxJR05fV182O25vcAorCisvKiBFQUxJR04gaXMgbGlrZSBFTlRSWSwgYnV0IGRvZXMgYWxpZ25tZW50IHRvICd3b3JkcycqNCBieXRlcworICAgcGFzdCBhIDJeYWxpZ24gYm91bmRhcnkuICAqLworI2lmZGVmIFBST0YKKyNkZWZpbmUgRUFMSUdOKG5hbWUsIGFsaWdudCwgd29yZHMpCQkJCQkgICAgICBcCisgIEFTTV9HTE9CQUxfRElSRUNUSVZFIENfU1lNQk9MX05BTUUobmFtZSk7CQkJCSAgICAgIFwKKyAgQVNNX1RZUEVfRElSRUNUSVZFIChDX1NZTUJPTF9OQU1FKG5hbWUpLEBmdW5jdGlvbikJCQkgICAgICBcCisgIC5hbGlnbiBBTElHTkFSRygyKTsJCQkJCQkJICAgICAgXAorICBDX0xBQkVMKG5hbWUpCQkJCQkJCQkgICAgICBcCisgIENBTExfTUNPVU5UCQkJCQkJCQkgICAgICBcCisgIGIgMGY7CQkJCQkJCQkJICAgICAgXAorICAuYWxpZ24gQUxJR05BUkcoYWxpZ250KTsJCQkJCQkgICAgICBcCisgIEVBTElHTl9XXyMjd29yZHM7CQkJCQkJCSAgICAgIFwKKyAgMDoKKyNlbHNlIC8qIFBST0YgKi8KKyNkZWZpbmUgRUFMSUdOKG5hbWUsIGFsaWdudCwgd29yZHMpCQkJCQkgICAgICBcCisgIEFTTV9HTE9CQUxfRElSRUNUSVZFIENfU1lNQk9MX05BTUUobmFtZSk7CQkJCSAgICAgIFwKKyAgQVNNX1RZUEVfRElSRUNUSVZFIChDX1NZTUJPTF9OQU1FKG5hbWUpLEBmdW5jdGlvbikJCQkgICAgICBcCisgIC5hbGlnbiBBTElHTkFSRyhhbGlnbnQpOwkJCQkJCSAgICAgIFwKKyAgRUFMSUdOX1dfIyN3b3JkczsJCQkJCQkJICAgICAgXAorICBDX0xBQkVMKG5hbWUpCisjZW5kaWYKKworI2RlZmluZSBFTkQobmFtZSkJCQkJCQkJICAgICAgXAorICBBU01fU0laRV9ESVJFQ1RJVkUobmFtZSkKKworI2lmZGVmIFBJQworI2RlZmluZSBKVU1QVEFSR0VUKG5hbWUpIG5hbWUjI0BwbHQKKyNlbHNlCisjZGVmaW5lIEpVTVBUQVJHRVQobmFtZSkgbmFtZQorI2VuZGlmCisKKy8qIExvY2FsIGxhYmVscyBzdHJpcHBlZCBvdXQgYnkgdGhlIGxpbmtlci4gICovCisjZGVmaW5lIEwoeCkgLkwjI3gKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW4uUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk4N2RjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbi5TCkBAIC0wLDAgKzEsMzgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZGFyd2luLlMgLSBDb3B5cmlnaHQgKGMpIDIwMDAgSm9obiBIb3Jua3Zpc3QKKwkgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFBvd2VyUEMgQXNzZW1ibHkgZ2x1ZS4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCisjaWYgZGVmaW5lZChfX3BwYzY0X18pCisjZGVmaW5lIE1PREVfQ0hPSUNFKHgsIHkpIHkKKyNlbHNlCisjZGVmaW5lIE1PREVfQ0hPSUNFKHgsIHkpIHgKKyNlbmRpZgorCisjZGVmaW5lIG1hY2hpbmVfY2hvaWNlCU1PREVfQ0hPSUNFKHBwYzc0MDAscHBjNjQpCisKKzsgRGVmaW5lIHNvbWUgcHNldWRvLW9wY29kZXMgZm9yIHNpemUtaW5kZXBlbmRlbnQgbG9hZCAmIHN0b3JlIG9mIEdQUnMgLi4uCisjZGVmaW5lIGxndQkJTU9ERV9DSE9JQ0UobHd6dSwgbGR1KQorI2RlZmluZSBsZwkJTU9ERV9DSE9JQ0UobHd6LGxkKQorI2RlZmluZSBzZwkJTU9ERV9DSE9JQ0Uoc3R3LHN0ZCkKKyNkZWZpbmUgc2d1CQlNT0RFX0NIT0lDRShzdHd1LHN0ZHUpCisjZGVmaW5lIHNndXgJCU1PREVfQ0hPSUNFKHN0d3V4LHN0ZHV4KQorCis7IC4uLiBhbmQgdGhlIHNpemUgb2YgR1BScyBhbmQgdGhlaXIgc3RvcmFnZSBpbmRpY2F0b3IuCisjZGVmaW5lIEdQUl9CWVRFUwlNT0RFX0NIT0lDRSg0LDgpCisjZGVmaW5lIExPRzJfR1BSX0JZVEVTCU1PREVfQ0hPSUNFKDIsMykJLyogbG9nMihHUFJfQllURVMpICovCisjZGVmaW5lIGdfbG9uZwkJTU9ERV9DSE9JQ0UobG9uZywgcXVhZCkJLyogdXNhZ2UgaXMgIi5nX2xvbmciICovCisKKzsgRnJvbSB0aGUgQUJJIGRvYzogIk1hYyBPUyBYIEFCSSBGdW5jdGlvbiBDYWxsIEd1aWRlIiBWZXJzaW9uIDIwMDktMDItMDQuCisjZGVmaW5lIExJTktBR0VfU0laRQlNT0RFX0NIT0lDRSgyNCw0OCkKKyNkZWZpbmUgUEFSQU1fQVJFQQlNT0RFX0NIT0lDRSgzMiw2NCkKKyNkZWZpbmUgU0FWRURfTFJfT0ZGU0VUCU1PREVfQ0hPSUNFKDgsMTYpCS8qIHNhdmUgcG9zaXRpb24gZm9yIGxyICovCisKKy8qIElmIHRoZXJlIGlzIGFueSBGUCBzdHVmZiB3ZSBtYWtlIHNwYWNlIGZvciBhbGwgb2YgdGhlIHJlZ3MuICAqLworI2RlZmluZSBTQVZFRF9GUFJfQ09VTlQgMTMKKyNkZWZpbmUgRlBSX1NJWkUJOAorI2RlZmluZSBSRVNVTFRfQllURVMJMTYKKworLyogVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzdGVwIHdpdGggdGhlIHNhbWUgdmFsdWUgaW4gZmZpX2Rhcndpbi5jLiAgKi8KKyNkZWZpbmUgQVNNX05FRURTX1JFR0lTVEVSUyA0CisjZGVmaW5lIFNBVkVfUkVHU19TSVpFIChBU01fTkVFRFNfUkVHSVNURVJTICogR1BSX0JZVEVTKQorCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKyNkZWZpbmUgSlVNUFRBUkdFVChuYW1lKSBuYW1lCisjZGVmaW5lIEwoeCkgeAorCisJLnRleHQKKwkuYWxpZ24gMgorCS5nbG9ibCBfZmZpX3ByZXBfYXJncworCisJLmFsaWduIDIKKwkuZ2xvYmwgX2ZmaV9jYWxsX0RBUldJTgorCisJLyogV2UgYXJyaXZlIGhlcmUgd2l0aDoKKwkgICByMyA9IHB0ciB0byBleHRlbmRlZCBjaWYuCisJICAgcjQgPSAtYnl0ZXMuCisJICAgcjUgPSBjaWYgZmxhZ3MuCisJICAgcjYgPSBwdHIgdG8gcmV0dXJuIHZhbHVlLgorCSAgIHI3ID0gZm4gcG9pbnRlciAodXNlciBmdW5jKS4KKwkgICByOCA9IGZuIHBvaW50ZXIgKGZmaV9wcmVwX2FyZ3MpLgorCSAgIHI5ID0gZmZpX3R5cGUqIGZvciB0aGUgcmV0IHZhbC4gICovCisKK19mZmlfY2FsbF9EQVJXSU46CitMc3RhcnRjb2RlOgorCW1yICAgCXIxMixyOAkvKiBXZSBvbmx5IG5lZWQgcjEyIHVudGlsIHRoZSBjYWxsLAorCQkJICAgc28gaXQgZG9lcyBub3QgaGF2ZSB0byBiZSBzYXZlZC4gICovCitMRkIxOgorCS8qIFNhdmUgdGhlIG9sZCBzdGFjayBwb2ludGVyIGFzIEFQLiAgKi8KKwltcglyOCxyMQorTENGSTA6CisJCisJLyogU2F2ZSB0aGUgcmV0dmFsIHR5cGUgaW4gcGFyZW50cyBmcmFtZS4gICovCisJc2cJcjksKExJTktBR0VfU0laRSs2KkdQUl9CWVRFUykocjgpCisKKwkvKiBBbGxvY2F0ZSB0aGUgc3RhY2sgc3BhY2Ugd2UgbmVlZC4gICovCisJc2d1eAlyMSxyMSxyNAorCisJLyogU2F2ZSByZWdpc3RlcnMgd2UgdXNlLiAgKi8KKwltZmxyCXI5CisJc2cJcjksU0FWRURfTFJfT0ZGU0VUKHI4KQorCisJc2cJcjI4LC0oNCAqIEdQUl9CWVRFUykocjgpCQorCXNnCXIyOSwtKDMgKiBHUFJfQllURVMpKHI4KQorCXNnCXIzMCwtKDIgKiBHUFJfQllURVMpKHI4KQorCXNnCXIzMSwtKCAgICBHUFJfQllURVMpKHI4KQorCisjaWYgIWRlZmluZWQoUE9XRVJQQ19EQVJXSU4pCisJLyogVGhlIFRPQyBzbG90IGlzIHJlc2VydmVkIGluIHRoZSBEYXJ3aW4gQUJJIGFuZCByMiBpcyB2b2xhdGlsZS4gICovCisJc2cJcjIsKDUgKiBHUFJfQllURVMpKHIxKQorI2VuZGlmCisKK0xDRkkxOgorCisJLyogU2F2ZSBhcmd1bWVudHMgb3ZlciBjYWxsLiAgKi8KKwltcglyMzEscjUJLyogZmxhZ3MsICAqLworCW1yCXIzMCxyNgkvKiBydmFsdWUsICAqLworCW1yCXIyOSxyNwkvKiBmdW5jdGlvbiBhZGRyZXNzLCAgKi8KKwltcglyMjgscjgJLyogb3VyIEFQLiAgKi8KK0xDRkkyOgorCS8qIENhbGwgZmZpX3ByZXBfYXJncy4gcjMgPSBleHRlbmRlZCBjaWYsIHI0ID0gc3RhY2sgcHRyIGNvcHkuICAqLworCW1yCXI0LHIxCisJbGkJcjksMAorCisJbXRjdHIJcjEyIC8qIHIxMiBob2xkcyBhZGRyZXNzIG9mIF9mZmlfcHJlcF9hcmdzLiAgKi8KKwliY3RybAorCisjaWYgIWRlZmluZWQoUE9XRVJQQ19EQVJXSU4pCisJLyogVGhlIFRPQyBzbG90IGlzIHJlc2VydmVkIGluIHRoZSBEYXJ3aW4gQUJJIGFuZCByMiBpcyB2b2xhdGlsZS4gICovCisJbGcgICAgIHIyLCg1ICogR1BSX0JZVEVTKShyMSkKKyNlbmRpZgorCS8qIE5vdyBkbyB0aGUgY2FsbC4KKwkgICBTZXQgdXAgY3IxIHdpdGggYml0cyA0LTcgb2YgdGhlIGZsYWdzLiAgKi8KKwltdGNyZgkweDQwLHIzMQorCS8qIEdldCB0aGUgYWRkcmVzcyB0byBjYWxsIGludG8gQ1RSLiAgKi8KKwltdGN0cglyMjkKKwkvKiBMb2FkIGFsbCB0aG9zZSBhcmd1bWVudCByZWdpc3RlcnMuCisJICAgV2UgaGF2ZSBzZXQgdXAgYSBuaWNlIHN0YWNrIGZyYW1lLCBqdXN0IGxvYWQgaXQgaW50byByZWdpc3RlcnMuICAqLworCWxnICAgICByMywgKExJTktBR0VfU0laRSAgICAgICAgICAgICAgICApKHIxKQorCWxnICAgICByNCwgKExJTktBR0VfU0laRSArICAgICBHUFJfQllURVMpKHIxKQorCWxnICAgICByNSwgKExJTktBR0VfU0laRSArIDIgKiBHUFJfQllURVMpKHIxKQorCWxnICAgICByNiwgKExJTktBR0VfU0laRSArIDMgKiBHUFJfQllURVMpKHIxKQorCW5vcAorCWxnICAgICByNywgKExJTktBR0VfU0laRSArIDQgKiBHUFJfQllURVMpKHIxKQorCWxnICAgICByOCwgKExJTktBR0VfU0laRSArIDUgKiBHUFJfQllURVMpKHIxKQorCWxnICAgICByOSwgKExJTktBR0VfU0laRSArIDYgKiBHUFJfQllURVMpKHIxKQorCWxnICAgICByMTAsKExJTktBR0VfU0laRSArIDcgKiBHUFJfQllURVMpKHIxKQorCitMMToKKwkvKiAuLi4gTG9hZCBhbGwgdGhlIEZQIHJlZ2lzdGVycy4gICovCisJYmYJNixMMgkvKiBObyBmbG9hdHMgdG8gbG9hZC4gICovCisJbGZkCWYxLCAtU0FWRV9SRUdTX1NJWkUtKDEzKkZQUl9TSVpFKShyMjgpCisJbGZkCWYyLCAtU0FWRV9SRUdTX1NJWkUtKDEyKkZQUl9TSVpFKShyMjgpCisJbGZkCWYzLCAtU0FWRV9SRUdTX1NJWkUtKDExKkZQUl9TSVpFKShyMjgpCisJbGZkCWY0LCAtU0FWRV9SRUdTX1NJWkUtKDEwKkZQUl9TSVpFKShyMjgpCisJbm9wCisJbGZkCWY1LCAtU0FWRV9SRUdTX1NJWkUtKCA5KkZQUl9TSVpFKShyMjgpCisJbGZkCWY2LCAtU0FWRV9SRUdTX1NJWkUtKCA4KkZQUl9TSVpFKShyMjgpCisJbGZkCWY3LCAtU0FWRV9SRUdTX1NJWkUtKCA3KkZQUl9TSVpFKShyMjgpCisJbGZkCWY4LCAtU0FWRV9SRUdTX1NJWkUtKCA2KkZQUl9TSVpFKShyMjgpCisJbm9wCisJbGZkICAgICBmOSwgLVNBVkVfUkVHU19TSVpFLSggNSpGUFJfU0laRSkocjI4KQorCWxmZCAgICAgZjEwLC1TQVZFX1JFR1NfU0laRS0oIDQqRlBSX1NJWkUpKHIyOCkKKwlsZmQgICAgIGYxMSwtU0FWRV9SRUdTX1NJWkUtKCAzKkZQUl9TSVpFKShyMjgpCisJbGZkICAgICBmMTIsLVNBVkVfUkVHU19TSVpFLSggMipGUFJfU0laRSkocjI4KQorCW5vcAorCWxmZCAgICAgZjEzLC1TQVZFX1JFR1NfU0laRS0oIDEqRlBSX1NJWkUpKHIyOCkKKworTDI6CisJbXIJcjEyLHIyOQkvKiBQdXQgdGhlIHRhcmdldCBhZGRyZXNzIGluIHIxMiBhcyBzcGVjaWZpZWQuICAqLworCW10Y3RyICAJcjEyCisJbm9wCisJbm9wCisKKwkvKiBNYWtlIHRoZSBjYWxsLiAgKi8KKwliY3RybAorCisJLyogTm93LCBkZWFsIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gICovCisKKwkvKiBtNjQgc3RydWN0dXJlIHJldHVybnMgY2FuIG9jY3VweSB0aGUgc2FtZSBzZXQgb2YgcmVnaXN0ZXJzIGFzCisJICAgd291bGQgYmUgdXNlZCB0byBwYXNzIHN1Y2ggYSBzdHJ1Y3R1cmUgYXMgYXJnMCAtIHNvIHRha2UgY2FyZSAKKwkgICBub3QgdG8gc3RlcCBvbiBhbnkgcG9zc2libHkgaG90IHJlZ3MuICAqLworCisJLyogR2V0IHRoZSBmbGFncy4uICovCisJbXRjcmYJMHgwMyxyMzEgOyB3ZSBuZWVkIGM2ICYgY3I3IG5vdy4KKwk7IEZMQUdfUkVUVVJOU19OT1RISU5HIGFsc28gY292ZXJzIHN0cnVjdCByZXQtYnktcmVmLgorCWJ0CTMwLEwoZG9uZV9yZXR1cm5fdmFsdWUpCSAgOyBGTEFHX1JFVFVSTlNfTk9USElORworCWJmCTI3LEwoc2NhbGFyX3JldHVybl92YWx1ZSkgOyBub3QgRkxBR19SRVRVUk5TX1NUUlVDVAorCQorCS8qIE9LLCBzbyB3ZSBoYXZlIGEgc3RydWN0LiAgKi8KKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwlidAkzMSxMKG1heWJlX3JldHVybl8xMjgpIDsgRkxBR19SRVRVUk5TXzEyOEJJVFMsIHNwZWNpYWwgY2FzZSAKKworCS8qIE9LLCB3ZSBoYXZlIHRvIG1hcCB0aGUgcmV0dXJuIGJhY2sgdG8gYSBtZW0gc3RydWN0LgorCSAgIFdlIGFyZSBhYm91dCB0byB0cmFtcGxlIHRoZSBwYXJlbnRzIHBhcmFtIGFyZWEsIHNvIHJlY292ZXIgdGhlCisJICAgcmV0dXJuIHR5cGUuICByMjkgaXMgZnJlZSwgc2luY2UgdGhlIGNhbGwgaXMgZG9uZS4gICovCisJbGcJcjI5LChMSU5LQUdFX1NJWkUgKyA2ICogR1BSX0JZVEVTKShyMjgpCisKKwlzZwlyMywgKExJTktBR0VfU0laRSAgICAgICAgICAgICAgICApKHIyOCkKKwlzZwlyNCwgKExJTktBR0VfU0laRSArICAgICBHUFJfQllURVMpKHIyOCkKKwlzZwlyNSwgKExJTktBR0VfU0laRSArIDIgKiBHUFJfQllURVMpKHIyOCkKKwlzZwlyNiwgKExJTktBR0VfU0laRSArIDMgKiBHUFJfQllURVMpKHIyOCkKKwlub3AKKwlzZwlyNywgKExJTktBR0VfU0laRSArIDQgKiBHUFJfQllURVMpKHIyOCkKKwlzZwlyOCwgKExJTktBR0VfU0laRSArIDUgKiBHUFJfQllURVMpKHIyOCkKKwlzZwlyOSwgKExJTktBR0VfU0laRSArIDYgKiBHUFJfQllURVMpKHIyOCkKKwlzZwlyMTAsKExJTktBR0VfU0laRSArIDcgKiBHUFJfQllURVMpKHIyOCkKKwkvKiBPSywgc28gZG8gdGhlIGJsb2NrIG1vdmUgLSB3ZSB0cnVzdCB0aGF0IG1lbWNweSB3aWxsIG5vdCB0cmFtcGxlCisJICAgdGhlIGZwcnMuLi4gICovCisJbXIgCXIzLHIzMCA7IGRlc3QKKwlhZGRpCXI0LHIyOCxMSU5LQUdFX1NJWkUgOyBzb3VyY2UKKwkvKiBUaGUgc2l6ZSBpcyBhIHNpemVfdCwgc2hvdWxkIGJlIGxvbmcuICAqLworCWxnCXI1LDAocjI5KQorCS8qIEZpZ3VyZSBvdXQgc21hbGwgc3RydWN0cyAqLworCWNtcGkJMCxyNSw0CisJYmd0CUwzCTsgMSwgMiBhbmQgNCBieXRlcyBoYXZlIHNwZWNpYWwgcnVsZXMuCisJY21waQkwLHI1LDMKKwliZXEJTDMJOyBub3QgMworCWFkZGkJcjQscjQsOAorCXN1YmYJcjQscjUscjQKK0wzOgorCWJsCV9tZW1jcHkKKwkKKwkvKiAuLi4gZG8gd2UgbmVlZCB0aGUgRlAgcmVnaXN0ZXJzPyAtIHJlY292ZXIgdGhlIGZsYWdzLi4gKi8KKwltdGNyZgkweDAzLHIzMSA7IHdlIG5lZWQgYzYgJiBjcjcgbm93LgorCWJmCTI5LEwoZG9uZV9yZXR1cm5fdmFsdWUpCS8qIE5vIGZsb2F0cyBpbiB0aGUgc3RydWN0LiAgKi8KKwlzdGZkCWYxLCAtU0FWRV9SRUdTX1NJWkUtKDEzKkZQUl9TSVpFKShyMjgpCisJc3RmZAlmMiwgLVNBVkVfUkVHU19TSVpFLSgxMipGUFJfU0laRSkocjI4KQorCXN0ZmQJZjMsIC1TQVZFX1JFR1NfU0laRS0oMTEqRlBSX1NJWkUpKHIyOCkKKwlzdGZkCWY0LCAtU0FWRV9SRUdTX1NJWkUtKDEwKkZQUl9TSVpFKShyMjgpCisJbm9wCisJc3RmZAlmNSwgLVNBVkVfUkVHU19TSVpFLSggOSpGUFJfU0laRSkocjI4KQorCXN0ZmQJZjYsIC1TQVZFX1JFR1NfU0laRS0oIDgqRlBSX1NJWkUpKHIyOCkKKwlzdGZkCWY3LCAtU0FWRV9SRUdTX1NJWkUtKCA3KkZQUl9TSVpFKShyMjgpCisJc3RmZAlmOCwgLVNBVkVfUkVHU19TSVpFLSggNipGUFJfU0laRSkocjI4KQorCW5vcAorCXN0ZmQJZjksIC1TQVZFX1JFR1NfU0laRS0oIDUqRlBSX1NJWkUpKHIyOCkKKwlzdGZkCWYxMCwtU0FWRV9SRUdTX1NJWkUtKCA0KkZQUl9TSVpFKShyMjgpCisJc3RmZAlmMTEsLVNBVkVfUkVHU19TSVpFLSggMypGUFJfU0laRSkocjI4KQorCXN0ZmQJZjEyLC1TQVZFX1JFR1NfU0laRS0oIDIqRlBSX1NJWkUpKHIyOCkKKwlub3AKKwlzdGZkCWYxMywtU0FWRV9SRUdTX1NJWkUtKCAxKkZQUl9TSVpFKShyMjgpCisKKwltcglyMyxyMjkJOyBmZmlfdHlwZSAqCisJbXIJcjQscjMwCTsgZGVzdAorCWFkZGkJcjUscjI4LC1TQVZFX1JFR1NfU0laRS0oMTMqRlBSX1NJWkUpIDsgZnBycworCXhvcglyNixyNixyNgorCXNnCXI2LChMSU5LQUdFX1NJWkUgKyA3ICogR1BSX0JZVEVTKShyMjgpCisJYWRkaQlyNixyMjgsKExJTktBR0VfU0laRSArIDcgKiBHUFJfQllURVMpIDsgcG9pbnQgdG8gYSB6ZXJvZWQgY291bnRlci4KKwlibCAJX2RhcndpbjY0X3N0cnVjdF9mbG9hdHNfdG9fbWVtCisKKwliIEwoZG9uZV9yZXR1cm5fdmFsdWUpCisjZWxzZQorCXN0dwlyMywwKHIzMCkgOyBtMzIgdGhlIG9ubHkgc3RydWN0IHJldHVybiBpbiByZWcgaXMgNCBieXRlcy4KKyNlbmRpZgorCWIgTChkb25lX3JldHVybl92YWx1ZSkKKworTChmcF9yZXR1cm5fdmFsdWUpOgorCS8qIERvIHdlIGhhdmUgbG9uZyBkb3VibGUgdG8gc3RvcmU/ICAqLworCWJmCTMxLEwoZmRfcmV0dXJuX3ZhbHVlKSA7IEZMQUdfUkVUVVJOU18xMjhCSVRTCisJc3RmZAlmMSwwKHIzMCkKKwlzdGZkCWYyLEZQUl9TSVpFKHIzMCkKKwliCUwoZG9uZV9yZXR1cm5fdmFsdWUpCisKK0woZmRfcmV0dXJuX3ZhbHVlKToKKwkvKiBEbyB3ZSBoYXZlIGRvdWJsZSB0byBzdG9yZT8gICovCisJYmYJMjgsTChmbG9hdF9yZXR1cm5fdmFsdWUpCisJc3RmZAlmMSwwKHIzMCkKKwliCUwoZG9uZV9yZXR1cm5fdmFsdWUpCisKK0woZmxvYXRfcmV0dXJuX3ZhbHVlKToKKwkvKiBXZSBvbmx5IGhhdmUgYSBmbG9hdCB0byBzdG9yZS4gICovCisJc3RmcwlmMSwwKHIzMCkKKwliCUwoZG9uZV9yZXR1cm5fdmFsdWUpCisKK0woc2NhbGFyX3JldHVybl92YWx1ZSk6CisJYnQJMjksTChmcF9yZXR1cm5fdmFsdWUpCTsgRkxBR19SRVRVUk5TX0ZQCisJOyBmZmlfYXJnIGlzIGRlZmluZWQgYXMgdW5zaWduZWQgbG9uZy4gCisJc2cJcjMsMChyMzApCQk7IFNhdmUgdGhlIHJlZy4KKwliZgkyOCxMKGRvbmVfcmV0dXJuX3ZhbHVlKSA7IG5vdCBGTEFHX1JFVFVSTlNfNjRCSVRTIAorCisjaWYgZGVmaW5lZChfX3BwYzY0X18pCitMKG1heWJlX3JldHVybl8xMjgpOgorCXN0ZAlyMywwKHIzMCkKKwliZgkzMSxMKGRvbmVfcmV0dXJuX3ZhbHVlKSA7IG5vdCBGTEFHX1JFVFVSTlNfMTI4QklUUyAKKwlzdGQJcjQsOChyMzApCisjZWxzZQorCXN0dwlyNCw0KHIzMCkKKyNlbmRpZgorCisJLyogRmFsbCB0aHJvdWdoLiAgKi8KKwkvKiBXZSB3YW50IHRoaXMgYXQgdGhlIGVuZCB0byBzaW1wbGlmeSBlaCBlcGlsb2cgY29tcHV0YXRpb24uICAqLworCitMKGRvbmVfcmV0dXJuX3ZhbHVlKToKKwkvKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgd2UgdXNlZCBhbmQgcmV0dXJuLiAgKi8KKwlsZwlyMjksU0FWRURfTFJfT0ZGU0VUKHIyOCkKKwk7IGVwaWxvZworCWxnCXIzMSwtKDEgKiBHUFJfQllURVMpKHIyOCkKKwltdGxyCXIyOQorCWxnCXIzMCwtKDIgKiBHUFJfQllURVMpKHIyOCkKKwlsZwlyMjksLSgzICogR1BSX0JZVEVTKShyMjgpCisJbGcJcjI4LC0oNCAqIEdQUl9CWVRFUykocjI4KQorCWxnCXIxLDAocjEpCisJYmxyCitMRkUxOgorCS5hbGlnbgkxCisvKiBFTkQoX2ZmaV9jYWxsX0RBUldJTikgICovCisKKy8qIFByb3ZpZGUgYSBudWxsIGRlZmluaXRpb24gb2YgX2ZmaV9jYWxsX0FJWC4gICovCisJLnRleHQKKwkuZ2xvYmwgX2ZmaV9jYWxsX0FJWAorCS5hbGlnbiAyCitfZmZpX2NhbGxfQUlYOgorCWJscgorLyogRU5EKF9mZmlfY2FsbF9BSVgpICAqLworCisvKiBFSCBzdHVmZi4gICovCisKKyNkZWZpbmUgRUhfREFUQV9BTElHTl9GQUNUIE1PREVfQ0hPSUNFKDB4N2MsMHg3OCkKKworCS5zdGF0aWNfZGF0YQorCS5hbGlnbiBMT0cyX0dQUl9CWVRFUworTExGQjAkbm9uX2xhenlfcHRyOgorCS5nX2xvbmcgTHN0YXJ0Y29kZQorCisJLnNlY3Rpb24gX19URVhULF9fZWhfZnJhbWUsY29hbGVzY2VkLG5vX3RvYytzdHJpcF9zdGF0aWNfc3ltcytsaXZlX3N1cHBvcnQKK0VIX2ZyYW1lMToKKwkuc2V0CUwkc2V0JDAsTEVDSUUxLUxTQ0lFMQorCS5sb25nCUwkc2V0JDAJOyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5CitMU0NJRTE6CisJLmxvbmcJMHgwCTsgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCTsgQ0lFIFZlcnNpb24KKwkuYXNjaWkJInpSXDAiCTsgQ0lFIEF1Z21lbnRhdGlvbgorCS5ieXRlCTB4MQk7IHVsZWIxMjggMHgxOyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJRUhfREFUQV9BTElHTl9GQUNUIDsgc2xlYjEyOCAtNDsgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvcgorCS5ieXRlCTB4NDEJOyBDSUUgUkEgQ29sdW1uCisJLmJ5dGUJMHgxCTsgdWxlYjEyOCAweDE7IEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHgxMAk7IEZERSBFbmNvZGluZyAoaW5kaXJlY3QgcGNyZWwpCisJLmJ5dGUJMHhjCTsgRFdfQ0ZBX2RlZl9jZmEKKwkuYnl0ZQkweDEJOyB1bGViMTI4IDB4MQorCS5ieXRlCTB4MAk7IHVsZWIxMjggMHgwCisJLmFsaWduCUxPRzJfR1BSX0JZVEVTCitMRUNJRTE6CisKKwkuZ2xvYmwgX2ZmaV9jYWxsX0RBUldJTi5laAorX2ZmaV9jYWxsX0RBUldJTi5laDoKK0xTRkRFMToKKwkuc2V0CUwkc2V0JDEsTEVGREUxLUxBU0ZERTEKKwkubG9uZwlMJHNldCQxCTsgRkRFIExlbmd0aAorTEFTRkRFMToKKwkubG9uZwlMQVNGREUxLUVIX2ZyYW1lMSA7IEZERSBDSUUgb2Zmc2V0CisJLmdfbG9uZwlMTEZCMCRub25fbGF6eV9wdHItLgk7IEZERSBpbml0aWFsIGxvY2F0aW9uCisJLnNldAlMJHNldCQzLExGRTEtTHN0YXJ0Y29kZQorCS5nX2xvbmcJTCRzZXQkMwk7IEZERSBhZGRyZXNzIHJhbmdlCisJLmJ5dGUgICAweDAgICAgIDsgdWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHg0CTsgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS5zZXQJTCRzZXQkNCxMQ0ZJMC1Mc3RhcnRjb2RlCisJLmxvbmcJTCRzZXQkNAorCS5ieXRlCTB4ZAk7IERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyCisJLmJ5dGUJMHgwOAk7IHVsZWIxMjggMHgwOAorCS5ieXRlCTB4NAk7IERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuc2V0CUwkc2V0JDUsTENGSTEtTENGSTAKKwkubG9uZwlMJHNldCQ1CisJLmJ5dGUgICAweDExICAgIDsgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZgorCS5ieXRlCTB4NDEJOyB1bGViMTI4IDB4NDEKKwkuYnl0ZSAgIDB4N2UgICAgOyBzbGViMTI4IC0yCisJLmJ5dGUJMHg5Zgk7IERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDFmCisJLmJ5dGUJMHgxCTsgdWxlYjEyOCAweDEKKwkuYnl0ZQkweDllCTsgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4MWUKKwkuYnl0ZQkweDIJOyB1bGViMTI4IDB4MgorCS5ieXRlCTB4OWQJOyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHgxZAorCS5ieXRlCTB4Mwk7IHVsZWIxMjggMHgzCisJLmJ5dGUJMHg5Ywk7IERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDFjCisJLmJ5dGUJMHg0CTsgdWxlYjEyOCAweDQKKwkuYnl0ZQkweDQJOyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLnNldAlMJHNldCQ2LExDRkkyLUxDRkkxCisJLmxvbmcJTCRzZXQkNgorCS5ieXRlCTB4ZAk7IERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyCisJLmJ5dGUJMHgxYwk7IHVsZWIxMjggMHgxYworCS5hbGlnbiBMT0cyX0dQUl9CWVRFUworTEVGREUxOgorCS5hbGlnbiAxCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyMGNmNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TCkBAIC0wLDAgKzEsNTc1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZGFyd2luX2Nsb3N1cmUuUyAtIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgMjAxMCwgCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCisgICBiYXNlZCBvbiBwcGNfY2xvc3VyZS5TCisKKyAgIFBvd2VyUEMgQXNzZW1ibHkgZ2x1ZS4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCisjZGVmaW5lIEwoeCkgeAorCisjaWYgZGVmaW5lZChfX3BwYzY0X18pCisjZGVmaW5lIE1PREVfQ0hPSUNFKHgsIHkpIHkKKyNlbHNlCisjZGVmaW5lIE1PREVfQ0hPSUNFKHgsIHkpIHgKKyNlbmRpZgorCisjZGVmaW5lIG1hY2hpbmVfY2hvaWNlCU1PREVfQ0hPSUNFKHBwYzc0MDAscHBjNjQpCisKKzsgRGVmaW5lIHNvbWUgcHNldWRvLW9wY29kZXMgZm9yIHNpemUtaW5kZXBlbmRlbnQgbG9hZCAmIHN0b3JlIG9mIEdQUnMgLi4uCisjZGVmaW5lIGxndQkJTU9ERV9DSE9JQ0UobHd6dSwgbGR1KQorI2RlZmluZSBsZwkJTU9ERV9DSE9JQ0UobHd6LGxkKQorI2RlZmluZSBzZwkJTU9ERV9DSE9JQ0Uoc3R3LHN0ZCkKKyNkZWZpbmUgc2d1CQlNT0RFX0NIT0lDRShzdHd1LHN0ZHUpCisKKzsgLi4uIGFuZCB0aGUgc2l6ZSBvZiBHUFJzIGFuZCB0aGVpciBzdG9yYWdlIGluZGljYXRvci4KKyNkZWZpbmUgR1BSX0JZVEVTCU1PREVfQ0hPSUNFKDQsOCkKKyNkZWZpbmUgTE9HMl9HUFJfQllURVMJTU9ERV9DSE9JQ0UoMiwzKQkvKiBsb2cyKEdQUl9CWVRFUykgKi8KKyNkZWZpbmUgZ19sb25nCQlNT0RFX0NIT0lDRShsb25nLCBxdWFkKQkvKiB1c2FnZSBpcyAiLmdfbG9uZyIgKi8KKworOyBGcm9tIHRoZSBBQkkgZG9jOiAiTWFjIE9TIFggQUJJIEZ1bmN0aW9uIENhbGwgR3VpZGUiIFZlcnNpb24gMjAwOS0wMi0wNC4KKyNkZWZpbmUgTElOS0FHRV9TSVpFCU1PREVfQ0hPSUNFKDI0LDQ4KQorI2RlZmluZSBQQVJBTV9BUkVBCU1PREVfQ0hPSUNFKDMyLDY0KQorCisjZGVmaW5lIFNBVkVEX0NSX09GRlNFVAlNT0RFX0NIT0lDRSg0LDgpCS8qIHNhdmUgcG9zaXRpb24gZm9yIENSICovCisjZGVmaW5lIFNBVkVEX0xSX09GRlNFVAlNT0RFX0NIT0lDRSg4LDE2KQkvKiBzYXZlIHBvc2l0aW9uIGZvciBsciAqLworCisvKiBXQVJOSU5HOiBpZiBmZmlfdHlwZSBpcyBjaGFuZ2VkLi4uIGhlcmUgYmUgbW9uc3RlcnMuICAKKyAgIE9mZnNldHMgb2YgaXRlbXMgd2l0aGluIHRoZSByZXN1bHQgdHlwZS4gICovCisjZGVmaW5lIEZGSV9UWVBFX1RZUEUJTU9ERV9DSE9JQ0UoNiwxMCkKKyNkZWZpbmUgRkZJX1RZUEVfRUxFTQlNT0RFX0NIT0lDRSg4LDE2KQorCisjZGVmaW5lIFNBVkVEX0ZQUl9DT1VOVCAxMworI2RlZmluZSBGUFJfU0laRQk4CisvKiBiaWdnZXN0IG02NCBzdHJ1Y3QgcmV0IGlzIDhHUFJTICsgMTNGUFJTID0gMTY4IGJ5dGVzIC0gcm91bmRlZCB0byAxNmJ5dGVzID0gMTc2LiAqLworI2RlZmluZSBSRVNVTFRfQllURVMJTU9ERV9DSE9JQ0UoMTYsMTc2KQorCis7IFRoZSB3aG9sZSBzdGFjayBmcmFtZSAqKk1VU1QqKiBiZSAxNmJ5dGUtYWxpZ25lZC4KKyNkZWZpbmUgU0FWRV9TSVpFICgoKExJTktBR0VfU0laRStQQVJBTV9BUkVBK1NBVkVEX0ZQUl9DT1VOVCpGUFJfU0laRStSRVNVTFRfQllURVMpKzE1KSAmIC0xNkxMKQorI2RlZmluZSBQQURfU0laRSAoU0FWRV9TSVpFLShMSU5LQUdFX1NJWkUrUEFSQU1fQVJFQStTQVZFRF9GUFJfQ09VTlQqRlBSX1NJWkUrUkVTVUxUX0JZVEVTKSkKKworI2RlZmluZSBQQVJFTlRfUEFSTV9CQVNFIChTQVZFX1NJWkUrTElOS0FHRV9TSVpFKQorI2RlZmluZSBGUF9TQVZFX0JBU0UgKExJTktBR0VfU0laRStQQVJBTV9BUkVBKQorCisjaWYgZGVmaW5lZChfX0VOVklST05NRU5UX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEX18pICYmIF9fRU5WSVJPTk1FTlRfTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRURfXyA+PSAxMDUwCis7IFdlIG5vIGxvbmdlciBuZWVkIHRoZSBwaWMgc3ltYm9sIHN0dWIgZm9yIERhcndpbiA+PSA5LgorI2RlZmluZSBCTENMU19IRUxQIF9mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOCisjZGVmaW5lIFNUUlVDVF9SRVRWQUxVRV9QIF9kYXJ3aW42NF9zdHJ1Y3RfcmV0X2J5X3ZhbHVlX3AKKyNkZWZpbmUgUEFTU19TVFJfRkxPQVRTIF9kYXJ3aW42NF9wYXNzX3N0cnVjdF9mbG9hdHMKKyN1bmRlZiBXQU5UX1NUVUIKKyNlbHNlCisjZGVmaW5lIEJMQ0xTX0hFTFAgTF9mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOJHN0dWIKKyNkZWZpbmUgU1RSVUNUX1JFVFZBTFVFX1AgTF9kYXJ3aW42NF9zdHJ1Y3RfcmV0X2J5X3ZhbHVlX3Akc3R1YgorI2RlZmluZSBQQVNTX1NUUl9GTE9BVFMgTF9kYXJ3aW42NF9wYXNzX3N0cnVjdF9mbG9hdHMkc3R1YgorI2RlZmluZSBXQU5UX1NUVUIKKyNlbmRpZgorCisvKiBtMzIvbTY0CisKKyAgIFRoZSBzdGFjayBsYXlvdXQgbG9va3MgbGlrZSB0aGlzOgorCisgICB8ICAgQWRkaXRpb25hbCBwYXJhbXMuLi4JCQl8IHwgICAgIEhpZ2hlciBhZGRyZXNzCisgICB+CQkJCQkJfiB+CisgICB8ICAgUGFyYW1ldGVycyAgICAgIChhdCBsZWFzdCA4KjQvOD0zMi82NCkJfCB8IE5VTV9HUFJfQVJHX1JFR0lTVEVSUworICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgVE9DPVIyIChBSVgpIFJlc2VydmVkIChEYXJ3aW4pICAgNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDIqNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgU3BhY2UgZm9yIGNhbGxlZWBzIExSCQk0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBTYXZlZCBDUiBbbG93IHdvcmQgZm9yIG02NF0gICAgICA0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBDdXJyZW50IGJhY2tjaGFpbiBwb2ludGVyCTQvOAl8LS8gUGFyZW50YHMgZnJhbWUuCisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IDwrIDw8PCBvbiBlbnRyeSB0bworICAgfCAgIFJlc3VsdCBCeXRlcwkJICAgICAgIDE2LzE3Ngl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfiAgIHBhZGRpbmcgdG8gMTYtYnl0ZSBhbGlnbm1lbnQJCX4gfgorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgTlVNX0ZQUl9BUkdfUkVHSVNURVJTIHNsb3RzCQl8IHwKKyAgIHwgICBoZXJlIGZwMTMgLi4gZnAxCQkgICAgICAgMTMqOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFIzLi5SMTAJCQkgIDgqNC84PTMyLzY0CXwgfCBOVU1fR1BSX0FSR19SRUdJU1RFUlMKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFRPQz1SMiAoQUlYKSBSZXNlcnZlZCAoRGFyd2luKSAgIDQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlzdGFjawl8CisgICB8ICAgUmVzZXJ2ZWQgW2NvbXBpbGVyLGJpbmRlcl0gICAgIDIqNC84CXwgfAlncm93cwl8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwJZG93bglWCisgICB8ICAgU3BhY2UgZm9yIGNhbGxlZXMgTFIJCTQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlsb3dlciBhZGRyZXNzZXMKKyAgIHwgICBTYXZlZCBDUiBbbG93IHdvcmQgZm9yIG02NF0gICAgICA0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgICAgIHN0YWNrIHBvaW50ZXIgaGVyZQorICAgfCAgIEN1cnJlbnQgYmFja2NoYWluIHBvaW50ZXIJNC84CXwtLwlkdXJpbmcKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICA8PDwJY2FsbC4KKworKi8KKworCS5maWxlCSJkYXJ3aW5fY2xvc3VyZS5TIgorCisJLm1hY2hpbmUgbWFjaGluZV9jaG9pY2UKKworCS50ZXh0CisJLmdsb2JsIF9mZmlfY2xvc3VyZV9BU00KKwkuYWxpZ24gTE9HMl9HUFJfQllURVMKK19mZmlfY2xvc3VyZV9BU006CitMRkIxOgorTHN0YXJ0Y29kZToKKwltZmxyCXIwCQkJLyogZXh0cmFjdCByZXR1cm4gYWRkcmVzcyAgKi8KKwlzZwlyMCxTQVZFRF9MUl9PRkZTRVQocjEpCS8qIHNhdmUgdGhlIHJldHVybiBhZGRyZXNzICAqLworTENGSTA6CisJc2d1CXIxLC1TQVZFX1NJWkUocjEpCS8qIHNraXAgb3ZlciBjYWxsZXIgc2F2ZSBhcmVhCisJCQkJCWtlZXAgc3RhY2sgYWxpZ25lZCB0byAxNi4gICovCitMQ0ZJMToKKwkvKiBXZSB3YW50IHRvIGJ1aWxkIHVwIGFuIGFyZWEgZm9yIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZAorCSAgIGluIHJlZ2lzdGVycy4gKGJvdGggZmxvYXRpbmcgcG9pbnQgYW5kIGludGVnZXIpICAqLworCisJLyogUHV0IGdwciAzIHRvIGdwciAxMCBpbiB0aGUgcGFyZW50cyBvdXRnb2luZyBhcmVhLi4uCisJICAgLi4uIHRoZSByZW1haW5kZXIgb2YgYW55IHBhcmFtcyB0aGF0IG92ZXJmbG93ZWQgdGhlIHJlZ3Mgd2lsbAorCSAgIGZvbGxvdyBoZXJlLiAgKi8KKwlzZwlyMywgKFBBUkVOVF9QQVJNX0JBU0UgICAgICAgICAgICAgICAgKShyMSkKKwlzZwlyNCwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgICAgKShyMSkKKwlzZwlyNSwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiAyKShyMSkKKwlzZwlyNiwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiAzKShyMSkKKwlzZwlyNywgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiA0KShyMSkKKwlzZwlyOCwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiA1KShyMSkKKwlzZwlyOSwgKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiA2KShyMSkKKwlzZwlyMTAsKFBBUkVOVF9QQVJNX0JBU0UgKyBHUFJfQllURVMgKiA3KShyMSkKKworCS8qIFdlIHNhdmUgZnByIDEgdG8gZnByIDE0IGluIG91ciBvd24gc2F2ZSBmcmFtZS4gICovCisJc3RmZAlmMSwgKEZQX1NBVkVfQkFTRSAgICAgICAgICAgICAgICAgKShyMSkKKwlzdGZkCWYyLCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICAgICApKHIxKQorCXN0ZmQJZjMsIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiAyICkocjEpCisJc3RmZAlmNCwgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDMgKShyMSkKKwlzdGZkCWY1LCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogNCApKHIxKQorCXN0ZmQJZjYsIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiA1ICkocjEpCisJc3RmZAlmNywgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDYgKShyMSkKKwlzdGZkCWY4LCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogNyApKHIxKQorCXN0ZmQJZjksIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiA4ICkocjEpCisJc3RmZAlmMTAsKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDkgKShyMSkKKwlzdGZkCWYxMSwoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogMTApKHIxKQorCXN0ZmQJZjEyLChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiAxMSkocjEpCisJc3RmZAlmMTMsKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDEyKShyMSkKKworCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHRoZSByb3V0aW5lIHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgd29yaworCSAgIGdldCB0aGUgY29udGV4dCBwb2ludGVyIGZyb20gdGhlIHRyYW1wb2xpbmUuICAqLworCW1yCXIzLHIxMQorCisJLyogTm93IGxvYWQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBzdG9yYWdlLiAgKi8KKwlhZGRpCXI0LHIxLChTQVZFX1NJWkUtUkVTVUxUX0JZVEVTKQorCisJLyogTm93IGxvYWQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIHNhdmVkIGdwciByZWdpc3RlcnMuICAqLworCWFkZGkJcjUscjEsUEFSRU5UX1BBUk1fQkFTRQorCisJLyogTm93IGxvYWQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIHNhdmVkIGZwciByZWdpc3RlcnMuICAqLworCWFkZGkJcjYscjEsRlBfU0FWRV9CQVNFCisKKwkvKiBNYWtlIHRoZSBjYWxsLiAgKi8KKwlibAlCTENMU19IRUxQCisKKwkvKiByMyBjb250YWlucyB0aGUgcnR5cGUgcG9pbnRlci4uLiBzYXZlIGl0IHNpbmNlIHdlIHdpbGwgbmVlZAorCSAgIGl0IGxhdGVyLiAgKi8KKwlzZwlyMyxMSU5LQUdFX1NJWkUocjEpCTsgZmZpX3R5cGUgKiByZXN1bHRfdHlwZQorCWxnCXIwLDAocjMpCQk7IHNpemUgPT4gcjAKKwlsaHoJcjMsRkZJX1RZUEVfVFlQRShyMykJOyB0eXBlID0+IHIzCisKKwkvKiBUaGUgaGVscGVyIHdpbGwgaGF2ZSBpbnRlcmNlcHRlZCBzdHJ1dHVyZSByZXR1cm5zIGFuZCBpbnNlcnRlZAorCSAgIHRoZSBjYWxsZXJgcyBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBzdHJ1Y3RzIHJldHVybmVkIGJ5IHJlZi4gICovCisKKwkvKiByMyBjb250YWlucyB0aGUgcmV0dXJuIHR5cGUgIHNvIHVzZSBpdCB0byBsb29rIHVwIGluIGEgdGFibGUKKwkgICBzbyB3ZSBrbm93IGhvdyB0byBkZWFsIHdpdGggZWFjaCB0eXBlLiAgKi8KKworCWFkZGkJcjUscjEsKFNBVkVfU0laRS1SRVNVTFRfQllURVMpIC8qIE90aGVyd2lzZSwgb3VyIHJldHVybiBpcyBoZXJlLiAgKi8KKwlibAlMZ2V0X3JldF90eXBlMF9hZGRyCS8qIEdldCBwb2ludGVyIHRvIExyZXRfdHlwZTAgaW50byBMUi4gICovCisJbWZscglyNAkJCS8qIE1vdmUgdG8gcjQuICAqLworCXNsd2kJcjMscjMsNAkJCS8qIE5vdyBtdWx0aXBseSByZXR1cm4gdHlwZSBieSAxNi4gICovCisJYWRkCXIzLHIzLHI0CQkvKiBBZGQgY29udGVudHMgb2YgdGFibGUgdG8gdGFibGUgYWRkcmVzcy4gICovCisJbXRjdHIJcjMKKwliY3RyCQkJIAkgLyogSnVtcCB0byBpdC4gICovCitMRkUxOgorLyogRWFjaCBvZiB0aGUgcmV0X3R5cGVYIGNvZGUgZnJhZ21lbnRzIGhhcyB0byBiZSBleGFjdGx5IDE2IGJ5dGVzIGxvbmcKKyAgICg0IGluc3RydWN0aW9ucykuIEZvciBjYWNoZSBlZmZlY3RpdmVuZXNzIHdlIGFsaWduIHRvIGEgMTYgYnl0ZSBib3VuZGFyeQorICAgZmlyc3QuICAqLworCisJLmFsaWduIDQKKworCW5vcAorCW5vcAorCW5vcAorTGdldF9yZXRfdHlwZTBfYWRkcjoKKwlibHJsCisKKy8qIGNhc2UgRkZJX1RZUEVfVk9JRCAgKi8KK0xyZXRfdHlwZTA6CisJYglMZmluaXNoCisJbm9wCisJbm9wCisJbm9wCisKKy8qIGNhc2UgRkZJX1RZUEVfSU5UICAqLworTHJldF90eXBlMToKKwlsZwlyMywwKHI1KQorCWIJTGZpbmlzaAorCW5vcAorCW5vcAorCisvKiBjYXNlIEZGSV9UWVBFX0ZMT0FUICAqLworTHJldF90eXBlMjoKKwlsZnMJZjEsMChyNSkKKwliCUxmaW5pc2gKKwlub3AKKwlub3AKKworLyogY2FzZSBGRklfVFlQRV9ET1VCTEUgICovCitMcmV0X3R5cGUzOgorCWxmZAlmMSwwKHI1KQorCWIJTGZpbmlzaAorCW5vcAorCW5vcAorCisvKiBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEUgICovCitMcmV0X3R5cGU0OgorCWxmZAlmMSwwKHI1KQorCWxmZAlmMiw4KHI1KQorCWIJTGZpbmlzaAorCW5vcAorCisvKiBjYXNlIEZGSV9UWVBFX1VJTlQ4ICAqLworTHJldF90eXBlNToKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwlsYnoJcjMsNyhyNSkKKyNlbHNlCisJbGJ6CXIzLDMocjUpCisjZW5kaWYKKwliCUxmaW5pc2gKKwlub3AKKwlub3AKKworLyogY2FzZSBGRklfVFlQRV9TSU5UOCAgKi8KK0xyZXRfdHlwZTY6CisjaWYgZGVmaW5lZChfX3BwYzY0X18pCisJbGJ6CXIzLDcocjUpCisjZWxzZQorCWxieglyMywzKHI1KQorI2VuZGlmCisJZXh0c2IJcjMscjMKKwliCUxmaW5pc2gKKwlub3AKKworLyogY2FzZSBGRklfVFlQRV9VSU5UMTYgICovCitMcmV0X3R5cGU3OgorI2lmIGRlZmluZWQoX19wcGM2NF9fKQorCWxoeglyMyw2KHI1KQorI2Vsc2UKKwlsaHoJcjMsMihyNSkKKyNlbmRpZgorCWIJTGZpbmlzaAorCW5vcAorCW5vcAorCisvKiBjYXNlIEZGSV9UWVBFX1NJTlQxNiAgKi8KK0xyZXRfdHlwZTg6CisjaWYgZGVmaW5lZChfX3BwYzY0X18pCisJbGhhCXIzLDYocjUpCisjZWxzZQorCWxoYQlyMywyKHI1KQorI2VuZGlmCisJYglMZmluaXNoCisJbm9wCisJbm9wCisKKy8qIGNhc2UgRkZJX1RZUEVfVUlOVDMyICAqLworTHJldF90eXBlOToKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwlsd3oJcjMsNChyNSkKKyNlbHNlCisJbHd6CXIzLDAocjUpCisjZW5kaWYKKwliCUxmaW5pc2gKKwlub3AKKwlub3AKKworLyogY2FzZSBGRklfVFlQRV9TSU5UMzIgICovCitMcmV0X3R5cGUxMDoKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwlsd3oJcjMsNChyNSkKKyNlbHNlCisJbHd6CXIzLDAocjUpCisjZW5kaWYKKwliCUxmaW5pc2gKKwlub3AKKwlub3AKKworLyogY2FzZSBGRklfVFlQRV9VSU5UNjQgICovCitMcmV0X3R5cGUxMToKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKKwlsZwlyMywwKHI1KQorCWIJTGZpbmlzaAorCW5vcAorI2Vsc2UKKwlsd3oJcjMsMChyNSkKKwlsd3oJcjQsNChyNSkKKwliCUxmaW5pc2gKKyNlbmRpZgorCW5vcAorCisvKiBjYXNlIEZGSV9UWVBFX1NJTlQ2NCAgKi8KK0xyZXRfdHlwZTEyOgorI2lmIGRlZmluZWQoX19wcGM2NF9fKQorCWxnCXIzLDAocjUpCisJYglMZmluaXNoCisJbm9wCisjZWxzZQorCWx3eglyMywwKHI1KQorCWx3eglyNCw0KHI1KQorCWIJTGZpbmlzaAorI2VuZGlmCisJbm9wCisKKy8qIGNhc2UgRkZJX1RZUEVfU1RSVUNUICAqLworTHJldF90eXBlMTM6CisjaWYgZGVmaW5lZChfX3BwYzY0X18pCisJbGcJcjMsMChyNSkJCTsgd2UgbmVlZCBhdCBsZWFzdCB0aGlzLi4uCisJY21waQkwLHIwLDQKKwliZ3QJTHN0cnVjdGVuZAkJOyBub3QgYSBzcGVjaWFsIHNtYWxsIGNhc2UKKwliCUxzbWFsbHN0cnVjdAkJOyBzZWUgaWYgd2UgbmVlZCBtb3JlLgorI2Vsc2UKKwljbXBpCTAscjAsNAorCWJndAlMZmluaXNoCQk7IG5vdCBieSB2YWx1ZQorCWxnCXIzLDAocjUpCisJYglMZmluaXNoCisjZW5kaWYKKy8qIGNhc2UgRkZJX1RZUEVfUE9JTlRFUiAgKi8KK0xyZXRfdHlwZTE0OgorCWxnCXIzLDAocjUpCisJYglMZmluaXNoCisJbm9wCisJbm9wCisKKyNpZiBkZWZpbmVkKF9fcHBjNjRfXykKK0xzbWFsbHN0cnVjdDoKKwliZXEJTGZvdXIJCQk7IGNvbnRpbnVhdGlvbiBvZiBMcmV0MTMuCisJY21waQkwLHIwLDMKKwliZXEJTGZpbmlzaAkJCTsgZG9uYHQgYWRqdXN0IHRoaXMgLSBjYW5gdCBiZSBhbnkgZmxvYXRzIGhlcmUuLi4KKwlzcmRpCXIzLHIzLDQ4CisJY21waQkwLHIwLDIKKwliZXEJTGZpbmlzaAkJCTsgLi4gb3IgaGVyZSAuLgorCXNyZGkJcjMscjMsOAorCWIgCUxmaW5pc2gJCQk7IC4uIG9yIGhlcmUuCisKK0xmb3VyOgorCWxnCXI2LExJTktBR0VfU0laRShyMSkJOyBnZXQgdGhlIHJlc3VsdCB0eXBlCisJbGcJcjYsRkZJX1RZUEVfRUxFTShyNikJOyBlbGVtZW50cyBhcnJheSBwb2ludGVyCisJbGcJcjYsMChyNikJCTsgZmlyc3QgZWxlbWVudAorCWxoeglyMCxGRklfVFlQRV9UWVBFKHI2KQk7IE9LIGdvIHRoZSB0eXBlCisJY21waQkwLHIwLDIJCQk7IEZGSV9UWVBFX0ZMT0FUCisJYm5lCUxmb3VyaW50CisJbGZzCWYxLDAocjUpCQk7IGp1c3Qgb25lIGZsb2F0IGluIHRoZSBzdHJ1Y3QuCisJYiAJTGZpbmlzaAorCitMZm91cmludDoKKwlzcmRpCXIzLHIzLDMyCQk7IGZvdXIgYnl0ZXMuCisJYiAJTGZpbmlzaAorCitMc3RydWN0ZW5kOgorCWxnCXIzLExJTktBR0VfU0laRShyMSkJOyBnZXQgdGhlIHJlc3VsdCB0eXBlCisJYmwJU1RSVUNUX1JFVFZBTFVFX1AKKwljbXBpCTAscjMsMAorCWJlcQlMZmluaXNoCQkJOyBub3BlLgorCS8qIFJlY292ZXIgYSBwb2ludGVyIHRvIHRoZSByZXN1bHRzLiAgKi8KKwlhZGRpCXIxMSxyMSwoU0FWRV9TSVpFLVJFU1VMVF9CWVRFUykKKwlsZwlyMywwKHIxMSkJCTsgd2UgbmVlZCBhdCBsZWFzdCB0aGlzLi4uCisJbGcJcjQsOChyMTEpCisJY21waQkwLHIwLDE2CisJYmVxCUxmaW5pc2gJCTsgc3BlY2lhbCBjYXNlIDE2IGJ5dGVzIHdlIGRvbid0IGNvbnNpZGVyIGZsb2F0cy4KKworCS8qIE9LLCBmcnVzdHJhdGluZ2x5LCB0aGUgcHJvY2VzcyBvZiBzYXZpbmcgdGhlIHN0cnVjdCB0byBtZW0gbWlnaHQgaGF2ZQorCSAgIG1lc3NlZCB3aXRoIHRoZSBGUFJzLCBzbyB3ZSBoYXZlIHRvIHJlLWxvYWQgdGhlbSA6KC4KKwkgICBXZWBsbCB1c2Ugb3VyIEZQUnMgc3BhY2UgYWdhaW4gLSBjYWxsaW5nOiAKKwkgICB2b2lkIGRhcndpbjY0X3Bhc3Nfc3RydWN0X2Zsb2F0cyAoZmZpX3R5cGUgKnMsIGNoYXIgKnNyYywgCisJCQkJCSAgICAgdW5zaWduZWQgKm5mcHIsIGRvdWJsZSAqKmZwcnMpIAorCSAgIFdlYGxsIHRlbXBvcmFyaWx5IHBpbmNoIHRoZSBmaXJzdCB0d28gc2xvdHMgb2YgdGhlIHBhcmFtIGFyZWEgZm9yIGxvY2FsCisJICAgdmFycyB1c2VkIGJ5IHRoZSByb3V0aW5lLiAgKi8KKwl4b3IJcjYscjYscjYKKwlhZGRpCXI1LHIxLFBBUkVOVF9QQVJNX0JBU0UJCTsgc29tZSBzcGFjZQorCXNnCXI2LDAocjUpCQkJOyAqbmZwciB6ZXJvZWQuCisJYWRkaQlyNixyNSw4CQkJCTsgKipmcHJzCisJYWRkaQlyMyxyMSxGUF9TQVZFX0JBU0UJCTsgcG9pbnRlciB0byBGUFJzIHNwYWNlCisJc2cJcjMsMChyNikKKwltcglyNCxyMTEJCQkJOyB0aGUgc3RydWN0IGlzIGhlcmUuLi4KKwlsZwlyMyxMSU5LQUdFX1NJWkUocjEpCQk7IGZmaV90eXBlICogcmVzdWx0X3R5cGUuCisJYmwJUEFTU19TVFJfRkxPQVRTCQkJOyBnZXQgc3RydWN0IGZsb2F0cyBpbnRvIEZQUiBzYXZlIHNwYWNlLgorCS8qIFNlZSBpZiB3ZSB1c2VkIGFueSBmbG9hdHMgICovCisJbHd6CXIwLChTQVZFX1NJWkUtUkVTVUxUX0JZVEVTKShyMSkJCisJY21waQkwLHIwLDAKKwliZXEJTHN0cnVjdGludHMJCQk7IG5vcGUuCisJLyogT0sgbG9hZCBgZW0gdXAuLi4gKi8KKwlsZmQJZjEsIChGUF9TQVZFX0JBU0UgICAgICAgICAgICAgICAgICkocjEpCisJbGZkCWYyLCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICAgICApKHIxKQorCWxmZAlmMywgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDIgKShyMSkKKwlsZmQJZjQsIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiAzICkocjEpCisJbGZkCWY1LCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogNCApKHIxKQorCWxmZAlmNiwgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDUgKShyMSkKKwlsZmQJZjcsIChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiA2ICkocjEpCisJbGZkCWY4LCAoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogNyApKHIxKQorCWxmZAlmOSwgKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDggKShyMSkKKwlsZmQJZjEwLChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiA5ICkocjEpCisJbGZkCWYxMSwoRlBfU0FWRV9CQVNFICsgIEZQUl9TSVpFICogMTApKHIxKQorCWxmZAlmMTIsKEZQX1NBVkVfQkFTRSArICBGUFJfU0laRSAqIDExKShyMSkKKwlsZmQJZjEzLChGUF9TQVZFX0JBU0UgKyAgRlBSX1NJWkUgKiAxMikocjEpCisKKwkvKiBwb2ludCBiYWNrIGF0IG91ciBzYXZlZCBzdHJ1Y3QuICAqLworTHN0cnVjdGludHM6CisJYWRkaQlyMTEscjEsKFNBVkVfU0laRS1SRVNVTFRfQllURVMpCisJbGcJcjMsMChyMTEpCQkJOyB3ZSBlbmQgdXAgcGlja2luZyB0aGUKKwlsZwlyNCw4KHIxMSkJCQk7IGZpcnN0IHR3byBhZ2Fpbi4KKwlsZwlyNSwxNihyMTEpCisJbGcJcjYsMjQocjExKQorCWxnCXI3LDMyKHIxMSkKKwlsZwlyOCw0MChyMTEpCisJbGcJcjksNDgocjExKQorCWxnCXIxMCw1NihyMTEpCisjZW5kaWYKKworLyogY2FzZSBkb25lICAqLworTGZpbmlzaDoKKwlhZGRpCXIxLHIxLFNBVkVfU0laRQkJLyogUmVzdG9yZSBzdGFjayBwb2ludGVyLiAgKi8KKwlsZwlyMCxTQVZFRF9MUl9PRkZTRVQocjEpCS8qIEdldCByZXR1cm4gYWRkcmVzcy4gICovCisJbXRscglyMAkJCS8qIFJlc2V0IGxpbmsgcmVnaXN0ZXIuICAqLworCWJscgorTGVuZGNvZGU6CisJLmFsaWduIDEKKwkKKy8qIEVORChmZmlfY2xvc3VyZV9BU00pICAqLworCisvKiBFSCBmcmFtZSBzdHVmZi4gICovCisjZGVmaW5lIEVIX0RBVEFfQUxJR05fRkFDVCBNT0RFX0NIT0lDRSgweDdjLDB4NzgpCisvKiAxNzYsIDQwMCAqLworI2RlZmluZSBFSF9GUkFNRV9PRkZTRVRBIE1PREVfQ0hPSUNFKDE3NiwweDkwKQorI2RlZmluZSBFSF9GUkFNRV9PRkZTRVRCIE1PREVfQ0hPSUNFKDEsMykKKworCS5zdGF0aWNfZGF0YQorCS5hbGlnbiBMT0cyX0dQUl9CWVRFUworTExGQjEkbm9uX2xhenlfcHRyOgorCS5nX2xvbmcgTHN0YXJ0Y29kZQorCisJLnNlY3Rpb24gX19URVhULF9fZWhfZnJhbWUsY29hbGVzY2VkLG5vX3RvYytzdHJpcF9zdGF0aWNfc3ltcytsaXZlX3N1cHBvcnQKK0VIX2ZyYW1lMToKKwkuc2V0CUwkc2V0JDAsTEVDSUUxLUxTQ0lFMQorCS5sb25nCUwkc2V0JDAJOyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5CitMU0NJRTE6CisJLmxvbmcJMHgwCTsgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCTsgQ0lFIFZlcnNpb24KKwkuYXNjaWkJInpSXDAiCTsgQ0lFIEF1Z21lbnRhdGlvbgorCS5ieXRlCTB4MQk7IHVsZWIxMjggMHgxOyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJRUhfREFUQV9BTElHTl9GQUNUIDsgc2xlYjEyOCAtNDsgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvcgorCS5ieXRlCTB4NDEJOyBDSUUgUkEgQ29sdW1uCisJLmJ5dGUJMHgxCTsgdWxlYjEyOCAweDE7IEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHgxMAk7IEZERSBFbmNvZGluZyAoaW5kaXJlY3QgcGNyZWwpCisJLmJ5dGUJMHhjCTsgRFdfQ0ZBX2RlZl9jZmEKKwkuYnl0ZQkweDEJOyB1bGViMTI4IDB4MQorCS5ieXRlCTB4MAk7IHVsZWIxMjggMHgwCisJLmFsaWduCUxPRzJfR1BSX0JZVEVTCitMRUNJRTE6CisJLmdsb2JsIF9mZmlfY2xvc3VyZV9BU00uZWgKK19mZmlfY2xvc3VyZV9BU00uZWg6CitMU0ZERTE6CisJLnNldAlMJHNldCQxLExFRkRFMS1MQVNGREUxCisJLmxvbmcJTCRzZXQkMQk7IEZERSBMZW5ndGgKKworTEFTRkRFMToKKwkubG9uZwlMQVNGREUxLUVIX2ZyYW1lMQk7IEZERSBDSUUgb2Zmc2V0CisJLmdfbG9uZwlMTEZCMSRub25fbGF6eV9wdHItLgk7IEZERSBpbml0aWFsIGxvY2F0aW9uCisJLnNldAlMJHNldCQzLExGRTEtTHN0YXJ0Y29kZQorCS5nX2xvbmcJTCRzZXQkMwk7IEZERSBhZGRyZXNzIHJhbmdlCisJLmJ5dGUgICAweDAgICAgIDsgdWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHg0CTsgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS5zZXQJTCRzZXQkMyxMQ0ZJMS1MQ0ZJMAorCS5sb25nCUwkc2V0JDMKKwkuYnl0ZQkweGUJOyBEV19DRkFfZGVmX2NmYV9vZmZzZXQKKwkuYnl0ZQlFSF9GUkFNRV9PRkZTRVRBLEVIX0ZSQU1FX09GRlNFVEIJOyB1bGViMTI4IDE3NiwxLzE5MCwzCisJLmJ5dGUJMHg0CTsgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS5zZXQJTCRzZXQkNCxMQ0ZJMC1Mc3RhcnRjb2RlCisJLmxvbmcJTCRzZXQkNAorCS5ieXRlICAgMHgxMSAgICA7IERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YKKwkuYnl0ZQkweDQxCTsgdWxlYjEyOCAweDQxCisJLmJ5dGUgICAweDdlICAgIDsgc2xlYjEyOCAtMgorCS5hbGlnbglMT0cyX0dQUl9CWVRFUworTEVGREUxOgorCS5hbGlnbiAJMQorCisjaWZkZWYgV0FOVF9TVFVCCisJLnNlY3Rpb24gX19URVhULF9fcGljc3ltYm9sc3R1YjEsc3ltYm9sX3N0dWJzLHB1cmVfaW5zdHJ1Y3Rpb25zLDMyCisJLmFsaWduIDUKK0xfZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTiRzdHViOgorCS5pbmRpcmVjdF9zeW1ib2wgX2ZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4KKwltZmxyIHIwCisJYmNsIDIwLDMxLCJMMDAwMDAwMDAwMDEkc3BiIgorIkwwMDAwMDAwMDAwMSRzcGIiOgorCW1mbHIgcjExCisJYWRkaXMgcjExLHIxMSxoYTE2KExfZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTiRsYXp5X3B0ci0iTDAwMDAwMDAwMDAxJHNwYiIpCisJbXRsciByMAorCWx3enUgcjEyLGxvMTYoTF9mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOJGxhenlfcHRyLSJMMDAwMDAwMDAwMDEkc3BiIikocjExKQorCW10Y3RyIHIxMgorCWJjdHIKKwkubGF6eV9zeW1ib2xfcG9pbnRlcgorTF9mZmlfY2xvc3VyZV9oZWxwZXJfREFSV0lOJGxhenlfcHRyOgorCS5pbmRpcmVjdF9zeW1ib2wgX2ZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4KKwkubG9uZwlkeWxkX3N0dWJfYmluZGluZ19oZWxwZXIKKworI2lmIGRlZmluZWQoX19wcGM2NF9fKQorCS5zZWN0aW9uIF9fVEVYVCxfX3BpY3N5bWJvbHN0dWIxLHN5bWJvbF9zdHVicyxwdXJlX2luc3RydWN0aW9ucywzMgorCS5hbGlnbiA1CitMX2RhcndpbjY0X3N0cnVjdF9yZXRfYnlfdmFsdWVfcCRzdHViOgorCS5pbmRpcmVjdF9zeW1ib2wgX2RhcndpbjY0X3N0cnVjdF9yZXRfYnlfdmFsdWVfcAorCW1mbHIgcjAKKwliY2wgMjAsMzEsIkwwMDAwMDAwMDAwMiRzcGIiCisiTDAwMDAwMDAwMDAyJHNwYiI6CisJbWZsciByMTEKKwlhZGRpcyByMTEscjExLGhhMTYoTF9kYXJ3aW42NF9zdHJ1Y3RfcmV0X2J5X3ZhbHVlX3AkbGF6eV9wdHItIkwwMDAwMDAwMDAwMiRzcGIiKQorCW10bHIgcjAKKwlsd3p1IHIxMixsbzE2KExfZGFyd2luNjRfc3RydWN0X3JldF9ieV92YWx1ZV9wJGxhenlfcHRyLSJMMDAwMDAwMDAwMDIkc3BiIikocjExKQorCW10Y3RyIHIxMgorCWJjdHIKKwkubGF6eV9zeW1ib2xfcG9pbnRlcgorTF9kYXJ3aW42NF9zdHJ1Y3RfcmV0X2J5X3ZhbHVlX3AkbGF6eV9wdHI6CisJLmluZGlyZWN0X3N5bWJvbCBfZGFyd2luNjRfc3RydWN0X3JldF9ieV92YWx1ZV9wCisJLmxvbmcJZHlsZF9zdHViX2JpbmRpbmdfaGVscGVyCisJLnNlY3Rpb24gX19URVhULF9fcGljc3ltYm9sc3R1YjEsc3ltYm9sX3N0dWJzLHB1cmVfaW5zdHJ1Y3Rpb25zLDMyCisJLmFsaWduIDUKK0xfZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzJHN0dWI6CisJLmluZGlyZWN0X3N5bWJvbCBfZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzCisJbWZsciByMAorCWJjbCAyMCwzMSwiTDAwMDAwMDAwMDAzJHNwYiIKKyJMMDAwMDAwMDAwMDMkc3BiIjoKKwltZmxyIHIxMQorCWFkZGlzIHIxMSxyMTEsaGExNihMX2RhcndpbjY0X3Bhc3Nfc3RydWN0X2Zsb2F0cyRsYXp5X3B0ci0iTDAwMDAwMDAwMDAzJHNwYiIpCisJbXRsciByMAorCWx3enUgcjEyLGxvMTYoTF9kYXJ3aW42NF9wYXNzX3N0cnVjdF9mbG9hdHMkbGF6eV9wdHItIkwwMDAwMDAwMDAwMyRzcGIiKShyMTEpCisJbXRjdHIgcjEyCisJYmN0cgorCS5sYXp5X3N5bWJvbF9wb2ludGVyCitMX2RhcndpbjY0X3Bhc3Nfc3RydWN0X2Zsb2F0cyRsYXp5X3B0cjoKKwkuaW5kaXJlY3Rfc3ltYm9sIF9kYXJ3aW42NF9wYXNzX3N0cnVjdF9mbG9hdHMKKwkubG9uZwlkeWxkX3N0dWJfYmluZGluZ19oZWxwZXIKKyMgIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9mZmkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9mZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjJhMzlmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaS5jCkBAIC0wLDAgKzEsMTQ0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChDKSAyMDExIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYworICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMKKwkgICBDb3B5cmlnaHQgKGMpIDE5OTggR2VvZmZyZXkgS2VhdGluZworCisgICBQb3dlclBDIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisKK2V4dGVybiB2b2lkIGZmaV9jbG9zdXJlX1NZU1YgKHZvaWQpOworZXh0ZXJuIHZvaWQgRkZJX0hJRERFTiBmZmlfY2xvc3VyZV9MSU5VWDY0ICh2b2lkKTsKKworZW51bSB7CisgIC8qIFRoZSBhc3NlbWJseSBkZXBlbmRzIG9uIHRoZXNlIGV4YWN0IGZsYWdzLiAgKi8KKyAgRkxBR19SRVRVUk5TX1NNU1QJPSAxIDw8ICgzMS0zMSksIC8qIFVzZWQgZm9yIEZGSV9TWVNWIHNtYWxsIHN0cnVjdHMuICAqLworICBGTEFHX1JFVFVSTlNfTk9USElORyAgPSAxIDw8ICgzMS0zMCksIC8qIFRoZXNlIGdvIGluIGNyNyAqLworICBGTEFHX1JFVFVSTlNfRlAgICAgICAgPSAxIDw8ICgzMS0yOSksCisgIEZMQUdfUkVUVVJOU182NEJJVFMgICA9IDEgPDwgKDMxLTI4KSwKKworICBGTEFHX1JFVFVSTlNfMTI4QklUUyAgPSAxIDw8ICgzMS0yNyksIC8qIGNyNiAgKi8KKyAgRkxBR19TWVNWX1NNU1RfUjQgICAgID0gMSA8PCAoMzEtMjYpLCAvKiB1c2UgcjQgZm9yIEZGSV9TWVNWIDggYnl0ZQorCQkJCQkgICBzdHJ1Y3RzLiAgKi8KKyAgRkxBR19TWVNWX1NNU1RfUjMgICAgID0gMSA8PCAoMzEtMjUpLCAvKiB1c2UgcjMgZm9yIEZGSV9TWVNWIDQgYnl0ZQorCQkJCQkgICBzdHJ1Y3RzLiAgKi8KKyAgLyogQml0cyAoMzEtMjQpIHRocm91Z2ggKDMxLTE5KSBzdG9yZSBzaGlmdCB2YWx1ZSBmb3IgU01TVCAqLworCisgIEZMQUdfQVJHX05FRURTX0NPUFkgICA9IDEgPDwgKDMxLSA3KSwKKyAgRkxBR19GUF9BUkdVTUVOVFMgICAgID0gMSA8PCAoMzEtIDYpLCAvKiBjcjEuZXE7IHNwZWNpZmllZCBieSBBQkkgKi8KKyAgRkxBR180X0dQUl9BUkdVTUVOVFMgID0gMSA8PCAoMzEtIDUpLAorICBGTEFHX1JFVFZBTF9SRUZFUkVOQ0UgPSAxIDw8ICgzMS0gNCkKK307CisKKy8qIEFib3V0IHRoZSBTWVNWIEFCSS4gICovCit1bnNpZ25lZCBpbnQgTlVNX0dQUl9BUkdfUkVHSVNURVJTID0gODsKKyNpZm5kZWYgX19OT19GUFJTX18KK3Vuc2lnbmVkIGludCBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSA4OworI2Vsc2UKK3Vuc2lnbmVkIGludCBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSAwOworI2VuZGlmCisKK2VudW0geyBBU01fTkVFRFNfUkVHSVNURVJTID0gNCB9OworCisvKiBmZmlfcHJlcF9hcmdzX1NZU1YgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKKyAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLgorCisgICBUaGUgc3RhY2sgbGF5b3V0IHdlIHdhbnQgbG9va3MgbGlrZSB0aGlzOgorCisgICB8ICAgUmV0dXJuIGFkZHJlc3MgZnJvbSBmZmlfY2FsbF9TWVNWIDRieXRlcwl8CWhpZ2hlciBhZGRyZXNzZXMKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgIHwgICBQcmV2aW91cyBiYWNrY2hhaW4gcG9pbnRlcgk0CXwgICAgICAgc3RhY2sgcG9pbnRlciBoZXJlCisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PCsgPDw8CW9uIGVudHJ5IHRvCisgICB8ICAgU2F2ZWQgcjI4LXIzMQkJCTQqNAl8IHwJZmZpX2NhbGxfU1lTVgorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgR1BSIHJlZ2lzdGVycyByMy1yMTAJCTgqNAl8IHwJZmZpX2NhbGxfU1lTVgorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgRlBSIHJlZ2lzdGVycyBmMS1mOCAob3B0aW9uYWwpCTgqOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlzdGFjawl8CisgICB8ICAgU3BhY2UgZm9yIGNvcGllZCBzdHJ1Y3R1cmVzCQl8IHwJZ3Jvd3MJfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CWRvd24gICAgVgorICAgfCAgIFBhcmFtZXRlcnMgdGhhdCBkaWRuJ3QgZml0IGluIHJlZ2lzdGVycyAgfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwJbG93ZXIgYWRkcmVzc2VzCisgICB8ICAgU3BhY2UgZm9yIGNhbGxlZSdzIExSCQk0CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CXN0YWNrIHBvaW50ZXIgaGVyZQorICAgfCAgIEN1cnJlbnQgYmFja2NoYWluIHBvaW50ZXIJNAl8LS8JZHVyaW5nCisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgPDw8CWZmaV9jYWxsX1NZU1YKKworKi8KKwordm9pZAorZmZpX3ByZXBfYXJnc19TWVNWIChleHRlbmRlZF9jaWYgKmVjaWYsIHVuc2lnbmVkICpjb25zdCBzdGFjaykKK3sKKyAgY29uc3QgdW5zaWduZWQgYnl0ZXMgPSBlY2lmLT5jaWYtPmJ5dGVzOworICBjb25zdCB1bnNpZ25lZCBmbGFncyA9IGVjaWYtPmNpZi0+ZmxhZ3M7CisKKyAgdHlwZWRlZiB1bmlvbiB7CisgICAgY2hhciAqYzsKKyAgICB1bnNpZ25lZCAqdTsKKyAgICBsb25nIGxvbmcgKmxsOworICAgIGZsb2F0ICpmOworICAgIGRvdWJsZSAqZDsKKyAgfSB2YWxwOworCisgIC8qICdzdGFja3RvcCcgcG9pbnRzIGF0IHRoZSBwcmV2aW91cyBiYWNrY2hhaW4gcG9pbnRlci4gICovCisgIHZhbHAgc3RhY2t0b3A7CisKKyAgLyogJ2dwcl9iYXNlJyBwb2ludHMgYXQgdGhlIHNwYWNlIGZvciBncHIzLCBhbmQgZ3Jvd3MgdXB3YXJkcyBhcworICAgICB3ZSB1c2UgR1BSIHJlZ2lzdGVycy4gICovCisgIHZhbHAgZ3ByX2Jhc2U7CisgIGludCBpbnRhcmdfY291bnQ7CisKKyAgLyogJ2Zwcl9iYXNlJyBwb2ludHMgYXQgdGhlIHNwYWNlIGZvciBmcHIxLCBhbmQgZ3Jvd3MgdXB3YXJkcyBhcworICAgICB3ZSB1c2UgRlBSIHJlZ2lzdGVycy4gICovCisgIHZhbHAgZnByX2Jhc2U7CisgIGludCBmcGFyZ19jb3VudDsKKworICAvKiAnY29weV9zcGFjZScgZ3Jvd3MgZG93biBhcyB3ZSBwdXQgc3RydWN0dXJlcyBpbiBpdC4gIEl0IHNob3VsZAorICAgICBzdGF5IDE2LWJ5dGUgYWxpZ25lZC4gICovCisgIHZhbHAgY29weV9zcGFjZTsKKworICAvKiAnbmV4dF9hcmcnIGdyb3dzIHVwIGFzIHdlIHB1dCBwYXJhbWV0ZXJzIGluIGl0LiAgKi8KKyAgdmFscCBuZXh0X2FyZzsKKworICBpbnQgaSwgaWkgTUFZQkVfVU5VU0VEOworICBmZmlfdHlwZSAqKnB0cjsKKyAgZG91YmxlIGRvdWJsZV90bXA7CisgIHVuaW9uIHsKKyAgICB2b2lkICoqdjsKKyAgICBjaGFyICoqYzsKKyAgICBzaWduZWQgY2hhciAqKnNjOworICAgIHVuc2lnbmVkIGNoYXIgKip1YzsKKyAgICBzaWduZWQgc2hvcnQgKipzczsKKyAgICB1bnNpZ25lZCBzaG9ydCAqKnVzOworICAgIHVuc2lnbmVkIGludCAqKnVpOworICAgIGxvbmcgbG9uZyAqKmxsOworICAgIGZsb2F0ICoqZjsKKyAgICBkb3VibGUgKipkOworICB9IHBfYXJndjsKKyAgc2l6ZV90IHN0cnVjdF9jb3B5X3NpemU7CisgIHVuc2lnbmVkIGdwcnZhbHVlOworCisgIGlmIChlY2lmLT5jaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKKyAgICBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSAwOworCisgIHN0YWNrdG9wLmMgPSAoY2hhciAqKSBzdGFjayArIGJ5dGVzOworICBncHJfYmFzZS51ID0gc3RhY2t0b3AudSAtIEFTTV9ORUVEU19SRUdJU1RFUlMgLSBOVU1fR1BSX0FSR19SRUdJU1RFUlM7CisgIGludGFyZ19jb3VudCA9IDA7CisgIGZwcl9iYXNlLmQgPSBncHJfYmFzZS5kIC0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTOworICBmcGFyZ19jb3VudCA9IDA7CisgIGNvcHlfc3BhY2UuYyA9ICgoZmxhZ3MgJiBGTEFHX0ZQX0FSR1VNRU5UUykgPyBmcHJfYmFzZS5jIDogZ3ByX2Jhc2UuYyk7CisgIG5leHRfYXJnLnUgPSBzdGFjayArIDI7CisKKyAgLyogQ2hlY2sgdGhhdCBldmVyeXRoaW5nIHN0YXJ0cyBhbGlnbmVkIHByb3Blcmx5LiAgKi8KKyAgRkZJX0FTU0VSVCAoKCh1bnNpZ25lZCkgKGNoYXIgKikgc3RhY2sgJiAweEYpID09IDApOworICBGRklfQVNTRVJUICgoKHVuc2lnbmVkKSBjb3B5X3NwYWNlLmMgJiAweEYpID09IDApOworICBGRklfQVNTRVJUICgoKHVuc2lnbmVkKSBzdGFja3RvcC5jICYgMHhGKSA9PSAwKTsKKyAgRkZJX0FTU0VSVCAoKGJ5dGVzICYgMHhGKSA9PSAwKTsKKyAgRkZJX0FTU0VSVCAoY29weV9zcGFjZS5jID49IG5leHRfYXJnLmMpOworCisgIC8qIERlYWwgd2l0aCByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIGFjdHVhbGx5IHBhc3MtYnktcmVmZXJlbmNlLiAgKi8KKyAgaWYgKGZsYWdzICYgRkxBR19SRVRWQUxfUkVGRVJFTkNFKQorICAgIHsKKyAgICAgICpncHJfYmFzZS51KysgPSAodW5zaWduZWQgbG9uZykgKGNoYXIgKikgZWNpZi0+cnZhbHVlOworICAgICAgaW50YXJnX2NvdW50Kys7CisgICAgfQorCisgIC8qIE5vdyBmb3IgdGhlIGFyZ3VtZW50cy4gICovCisgIHBfYXJndi52ID0gZWNpZi0+YXZhbHVlOworICBmb3IgKHB0ciA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzLCBpID0gZWNpZi0+Y2lmLT5uYXJnczsKKyAgICAgICBpID4gMDsKKyAgICAgICBpLS0sIHB0cisrLCBwX2FyZ3YudisrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKCpwdHIpLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgLyogV2l0aCBGRklfTElOVVhfU09GVF9GTE9BVCBmbG9hdHMgYXJlIGhhbmRsZWQgbGlrZSBVSU5UMzIuICAqLworCSAgaWYgKGVjaWYtPmNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQorCSAgICBnb3RvIHNvZnRfZmxvYXRfcHJlcDsKKwkgIGRvdWJsZV90bXAgPSAqKnBfYXJndi5mOworCSAgaWYgKGZwYXJnX2NvdW50ID49IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgeworCSAgICAgICpuZXh0X2FyZy5mID0gKGZsb2F0KSBkb3VibGVfdG1wOworCSAgICAgIG5leHRfYXJnLnUgKz0gMTsKKwkgICAgICBpbnRhcmdfY291bnQrKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICAqZnByX2Jhc2UuZCsrID0gZG91YmxlX3RtcDsKKwkgIGZwYXJnX2NvdW50Kys7CisJICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICAvKiBXaXRoIEZGSV9MSU5VWF9TT0ZUX0ZMT0FUIGRvdWJsZXMgYXJlIGhhbmRsZWQgbGlrZSBVSU5UNjQuICAqLworCSAgaWYgKGVjaWYtPmNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQorCSAgICBnb3RvIHNvZnRfZG91YmxlX3ByZXA7CisJICBkb3VibGVfdG1wID0gKipwX2FyZ3YuZDsKKworCSAgaWYgKGZwYXJnX2NvdW50ID49IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgeworCSAgICAgIGlmIChpbnRhcmdfY291bnQgPj0gTlVNX0dQUl9BUkdfUkVHSVNURVJTCisJCSAgJiYgaW50YXJnX2NvdW50ICUgMiAhPSAwKQorCQl7CisJCSAgaW50YXJnX2NvdW50Kys7CisJCSAgbmV4dF9hcmcudSsrOworCQl9CisJICAgICAgKm5leHRfYXJnLmQgPSBkb3VibGVfdG1wOworCSAgICAgIG5leHRfYXJnLnUgKz0gMjsKKwkgICAgfQorCSAgZWxzZQorCSAgICAqZnByX2Jhc2UuZCsrID0gZG91YmxlX3RtcDsKKwkgIGZwYXJnX2NvdW50Kys7CisJICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKKwkgIGJyZWFrOworCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwljYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICBpZiAoKGVjaWYtPmNpZi0+YWJpICE9IEZGSV9MSU5VWCkKKwkJJiYgKGVjaWYtPmNpZi0+YWJpICE9IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKSkKKwkgICAgZ290byBkb19zdHJ1Y3Q7CisJICAvKiBUaGUgc29mdCBmbG9hdCBBQkkgZm9yIGxvbmcgZG91YmxlcyB3b3JrcyBsaWtlIHRoaXMsCisJICAgICBhIGxvbmcgZG91YmxlIGlzIHBhc3NlZCBpbiBmb3VyIGNvbnNlY3V0aXZlIGdwcnMgaWYgYXZhaWxhYmxlLgorCSAgICAgQSBtYXhpbXVtIG9mIDIgbG9uZyBkb3VibGVzIGNhbiBiZSBwYXNzZWQgaW4gZ3Bycy4KKwkgICAgIElmIHdlIGRvIG5vdCBoYXZlIDQgZ3BycyBsZWZ0LCB0aGUgbG9uZyBkb3VibGUgaXMgcGFzc2VkIG9uIHRoZQorCSAgICAgc3RhY2ssIDQtYnl0ZSBhbGlnbmVkLiAgKi8KKwkgIGlmIChlY2lmLT5jaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCBpbnRfdG1wID0gKCpwX2FyZ3YudWkpWzBdOworCSAgICAgIGlmIChpbnRhcmdfY291bnQgPj0gTlVNX0dQUl9BUkdfUkVHSVNURVJTIC0gMykKKwkJeworCQkgIGlmIChpbnRhcmdfY291bnQgPCBOVU1fR1BSX0FSR19SRUdJU1RFUlMpCisJCSAgICBpbnRhcmdfY291bnQgKz0gTlVNX0dQUl9BUkdfUkVHSVNURVJTIC0gaW50YXJnX2NvdW50OworCQkgICpuZXh0X2FyZy51ID0gaW50X3RtcDsKKwkJICBuZXh0X2FyZy51Kys7CisJCSAgZm9yIChpaSA9IDE7IGlpIDwgNDsgaWkrKykKKwkJICAgIHsKKwkJICAgICAgaW50X3RtcCA9ICgqcF9hcmd2LnVpKVtpaV07CisJCSAgICAgICpuZXh0X2FyZy51ID0gaW50X3RtcDsKKwkJICAgICAgbmV4dF9hcmcudSsrOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgKmdwcl9iYXNlLnUrKyA9IGludF90bXA7CisJCSAgZm9yIChpaSA9IDE7IGlpIDwgNDsgaWkrKykKKwkJICAgIHsKKwkJICAgICAgaW50X3RtcCA9ICgqcF9hcmd2LnVpKVtpaV07CisJCSAgICAgICpncHJfYmFzZS51KysgPSBpbnRfdG1wOworCQkgICAgfQorCQl9CisJICAgICAgaW50YXJnX2NvdW50ICs9NDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZG91YmxlX3RtcCA9ICgqcF9hcmd2LmQpWzBdOworCisJICAgICAgaWYgKGZwYXJnX2NvdW50ID49IE5VTV9GUFJfQVJHX1JFR0lTVEVSUyAtIDEpCisJCXsKKwkJICBpZiAoaW50YXJnX2NvdW50ID49IE5VTV9HUFJfQVJHX1JFR0lTVEVSUworCQkgICAgICAmJiBpbnRhcmdfY291bnQgJSAyICE9IDApCisJCSAgICB7CisJCSAgICAgIGludGFyZ19jb3VudCsrOworCQkgICAgICBuZXh0X2FyZy51Kys7CisJCSAgICB9CisJCSAgKm5leHRfYXJnLmQgPSBkb3VibGVfdG1wOworCQkgIG5leHRfYXJnLnUgKz0gMjsKKwkJICBkb3VibGVfdG1wID0gKCpwX2FyZ3YuZClbMV07CisJCSAgKm5leHRfYXJnLmQgPSBkb3VibGVfdG1wOworCQkgIG5leHRfYXJnLnUgKz0gMjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgICpmcHJfYmFzZS5kKysgPSBkb3VibGVfdG1wOworCQkgIGRvdWJsZV90bXAgPSAoKnBfYXJndi5kKVsxXTsKKwkJICAqZnByX2Jhc2UuZCsrID0gZG91YmxlX3RtcDsKKwkJfQorCisJICAgICAgZnBhcmdfY291bnQgKz0gMjsKKwkgICAgICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKKwkgICAgfQorCSAgYnJlYWs7CisjZW5kaWYKKworCWNhc2UgRkZJX1RZUEVfVUlOVDY0OgorCWNhc2UgRkZJX1RZUEVfU0lOVDY0OgorCXNvZnRfZG91YmxlX3ByZXA6CisJICBpZiAoaW50YXJnX2NvdW50ID09IE5VTV9HUFJfQVJHX1JFR0lTVEVSUy0xKQorCSAgICBpbnRhcmdfY291bnQrKzsKKwkgIGlmIChpbnRhcmdfY291bnQgPj0gTlVNX0dQUl9BUkdfUkVHSVNURVJTKQorCSAgICB7CisJICAgICAgaWYgKGludGFyZ19jb3VudCAlIDIgIT0gMCkKKwkJeworCQkgIGludGFyZ19jb3VudCsrOworCQkgIG5leHRfYXJnLnUrKzsKKwkJfQorCSAgICAgICpuZXh0X2FyZy5sbCA9ICoqcF9hcmd2LmxsOworCSAgICAgIG5leHRfYXJnLnUgKz0gMjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogd2hvb3BzOiBhYmkgc3RhdGVzIG9ubHkgY2VydGFpbiByZWdpc3RlciBwYWlycworCSAgICAgICAqIGNhbiBiZSB1c2VkIGZvciBwYXNzaW5nIGxvbmcgbG9uZyBpbnQKKwkgICAgICAgKiBzcGVjaWZpY2FsbHkgKHIzLHI0KSwgKHI1LHI2KSwgKHI3LHI4KSwKKwkgICAgICAgKiAocjkscjEwKSBhbmQgaWYgbmV4dCBhcmcgaXMgbG9uZyBsb25nIGJ1dAorCSAgICAgICAqIG5vdCBjb3JyZWN0IHN0YXJ0aW5nIHJlZ2lzdGVyIG9mIHBhaXIgdGhlbiBza2lwCisJICAgICAgICogdW50aWwgdGhlIHByb3BlciBzdGFydGluZyByZWdpc3RlcgorCSAgICAgICAqLworCSAgICAgIGlmIChpbnRhcmdfY291bnQgJSAyICE9IDApCisJCXsKKwkJICBpbnRhcmdfY291bnQgKys7CisJCSAgZ3ByX2Jhc2UudSsrOworCQl9CisJICAgICAgKmdwcl9iYXNlLmxsKysgPSAqKnBfYXJndi5sbDsKKwkgICAgfQorCSAgaW50YXJnX2NvdW50ICs9IDI7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCisJZG9fc3RydWN0OgorI2VuZGlmCisJICBzdHJ1Y3RfY29weV9zaXplID0gKCgqcHRyKS0+c2l6ZSArIDE1KSAmIH4weEY7CisJICBjb3B5X3NwYWNlLmMgLT0gc3RydWN0X2NvcHlfc2l6ZTsKKwkgIG1lbWNweSAoY29weV9zcGFjZS5jLCAqcF9hcmd2LmMsICgqcHRyKS0+c2l6ZSk7CisKKwkgIGdwcnZhbHVlID0gKHVuc2lnbmVkIGxvbmcpIGNvcHlfc3BhY2UuYzsKKworCSAgRkZJX0FTU0VSVCAoY29weV9zcGFjZS5jID4gbmV4dF9hcmcuYyk7CisJICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfQVJHX05FRURTX0NPUFkpOworCSAgZ290byBwdXRncHI7CisKKwljYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgZ3BydmFsdWUgPSAqKnBfYXJndi51YzsKKwkgIGdvdG8gcHV0Z3ByOworCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnNjOworCSAgZ290byBwdXRncHI7CisJY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnVzOworCSAgZ290byBwdXRncHI7CisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnNzOworCSAgZ290byBwdXRncHI7CisKKwljYXNlIEZGSV9UWVBFX0lOVDoKKwljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJc29mdF9mbG9hdF9wcmVwOgorCisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnVpOworCisJcHV0Z3ByOgorCSAgaWYgKGludGFyZ19jb3VudCA+PSBOVU1fR1BSX0FSR19SRUdJU1RFUlMpCisJICAgICpuZXh0X2FyZy51KysgPSBncHJ2YWx1ZTsKKwkgIGVsc2UKKwkgICAgKmdwcl9iYXNlLnUrKyA9IGdwcnZhbHVlOworCSAgaW50YXJnX2NvdW50Kys7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgd2UgZGlkbid0IG92ZXJydW4gdGhlIHN0YWNrLi4uICAqLworICBGRklfQVNTRVJUIChjb3B5X3NwYWNlLmMgPj0gbmV4dF9hcmcuYyk7CisgIEZGSV9BU1NFUlQgKGdwcl9iYXNlLnUgPD0gc3RhY2t0b3AudSAtIEFTTV9ORUVEU19SRUdJU1RFUlMpOworICBGRklfQVNTRVJUIChmcHJfYmFzZS51CisJICAgICAgPD0gc3RhY2t0b3AudSAtIEFTTV9ORUVEU19SRUdJU1RFUlMgLSBOVU1fR1BSX0FSR19SRUdJU1RFUlMpOworICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfNF9HUFJfQVJHVU1FTlRTIHx8IGludGFyZ19jb3VudCA8PSA0KTsKK30KKworLyogQWJvdXQgdGhlIExJTlVYNjQgQUJJLiAgKi8KK2VudW0geworICBOVU1fR1BSX0FSR19SRUdJU1RFUlM2NCA9IDgsCisgIE5VTV9GUFJfQVJHX1JFR0lTVEVSUzY0ID0gMTMKK307CitlbnVtIHsgQVNNX05FRURTX1JFR0lTVEVSUzY0ID0gNCB9OworCisvKiBmZmlfcHJlcF9hcmdzNjQgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKKyAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLgorCisgICBUaGUgc3RhY2sgbGF5b3V0IHdlIHdhbnQgbG9va3MgbGlrZSB0aGlzOgorCisgICB8ICAgUmV0IGFkZHIgZnJvbSBmZmlfY2FsbF9MSU5VWDY0CThieXRlcwl8CWhpZ2hlciBhZGRyZXNzZXMKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgIHwgICBDUiBzYXZlIGFyZWEJCQk4Ynl0ZXMJfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgfCAgIFByZXZpb3VzIGJhY2tjaGFpbiBwb2ludGVyCTgJfAlzdGFjayBwb2ludGVyIGhlcmUKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8KyA8PDwJb24gZW50cnkgdG8KKyAgIHwgICBTYXZlZCByMjgtcjMxCQkJNCo4CXwgfAlmZmlfY2FsbF9MSU5VWDY0CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBHUFIgcmVnaXN0ZXJzIHIzLXIxMAkJOCo4CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgRlBSIHJlZ2lzdGVycyBmMS1mMTMgKG9wdGlvbmFsKQkxMyo4CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgUGFyYW1ldGVyIHNhdmUgYXJlYQkJICAgICAgICB8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFRPQyBzYXZlIGFyZWEJCQk4CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CXN0YWNrCXwKKyAgIHwgICBMaW5rZXIgZG91Ymxld29yZAkJOAl8IHwJZ3Jvd3MJfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CWRvd24JVgorICAgfCAgIENvbXBpbGVyIGRvdWJsZXdvcmQJCTgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwJbG93ZXIgYWRkcmVzc2VzCisgICB8ICAgU3BhY2UgZm9yIGNhbGxlZSdzIExSCQk4CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgQ1Igc2F2ZSBhcmVhCQkJOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlzdGFjayBwb2ludGVyIGhlcmUKKyAgIHwgICBDdXJyZW50IGJhY2tjaGFpbiBwb2ludGVyCTgJfC0vCWR1cmluZworICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgIDw8PAlmZmlfY2FsbF9MSU5VWDY0CisKKyovCisKK3ZvaWQgRkZJX0hJRERFTgorZmZpX3ByZXBfYXJnczY0IChleHRlbmRlZF9jaWYgKmVjaWYsIHVuc2lnbmVkIGxvbmcgKmNvbnN0IHN0YWNrKQoreworICBjb25zdCB1bnNpZ25lZCBsb25nIGJ5dGVzID0gZWNpZi0+Y2lmLT5ieXRlczsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBmbGFncyA9IGVjaWYtPmNpZi0+ZmxhZ3M7CisKKyAgdHlwZWRlZiB1bmlvbiB7CisgICAgY2hhciAqYzsKKyAgICB1bnNpZ25lZCBsb25nICp1bDsKKyAgICBmbG9hdCAqZjsKKyAgICBkb3VibGUgKmQ7CisgIH0gdmFscDsKKworICAvKiAnc3RhY2t0b3AnIHBvaW50cyBhdCB0aGUgcHJldmlvdXMgYmFja2NoYWluIHBvaW50ZXIuICAqLworICB2YWxwIHN0YWNrdG9wOworCisgIC8qICduZXh0X2FyZycgcG9pbnRzIGF0IHRoZSBzcGFjZSBmb3IgZ3ByMywgYW5kIGdyb3dzIHVwd2FyZHMgYXMKKyAgICAgd2UgdXNlIEdQUiByZWdpc3RlcnMsIHRoZW4gY29udGludWVzIGF0IHJlc3QuICAqLworICB2YWxwIGdwcl9iYXNlOworICB2YWxwIGdwcl9lbmQ7CisgIHZhbHAgcmVzdDsKKyAgdmFscCBuZXh0X2FyZzsKKworICAvKiAnZnByX2Jhc2UnIHBvaW50cyBhdCB0aGUgc3BhY2UgZm9yIGZwcjMsIGFuZCBncm93cyB1cHdhcmRzIGFzCisgICAgIHdlIHVzZSBGUFIgcmVnaXN0ZXJzLiAgKi8KKyAgdmFscCBmcHJfYmFzZTsKKyAgaW50IGZwYXJnX2NvdW50OworCisgIGludCBpLCB3b3JkczsKKyAgZmZpX3R5cGUgKipwdHI7CisgIGRvdWJsZSBkb3VibGVfdG1wOworICB1bmlvbiB7CisgICAgdm9pZCAqKnY7CisgICAgY2hhciAqKmM7CisgICAgc2lnbmVkIGNoYXIgKipzYzsKKyAgICB1bnNpZ25lZCBjaGFyICoqdWM7CisgICAgc2lnbmVkIHNob3J0ICoqc3M7CisgICAgdW5zaWduZWQgc2hvcnQgKip1czsKKyAgICBzaWduZWQgaW50ICoqc2k7CisgICAgdW5zaWduZWQgaW50ICoqdWk7CisgICAgdW5zaWduZWQgbG9uZyAqKnVsOworICAgIGZsb2F0ICoqZjsKKyAgICBkb3VibGUgKipkOworICB9IHBfYXJndjsKKyAgdW5zaWduZWQgbG9uZyBncHJ2YWx1ZTsKKworICBzdGFja3RvcC5jID0gKGNoYXIgKikgc3RhY2sgKyBieXRlczsKKyAgZ3ByX2Jhc2UudWwgPSBzdGFja3RvcC51bCAtIEFTTV9ORUVEU19SRUdJU1RFUlM2NCAtIE5VTV9HUFJfQVJHX1JFR0lTVEVSUzY0OworICBncHJfZW5kLnVsID0gZ3ByX2Jhc2UudWwgKyBOVU1fR1BSX0FSR19SRUdJU1RFUlM2NDsKKyAgcmVzdC51bCA9IHN0YWNrICsgNiArIE5VTV9HUFJfQVJHX1JFR0lTVEVSUzY0OworICBmcHJfYmFzZS5kID0gZ3ByX2Jhc2UuZCAtIE5VTV9GUFJfQVJHX1JFR0lTVEVSUzY0OworICBmcGFyZ19jb3VudCA9IDA7CisgIG5leHRfYXJnLnVsID0gZ3ByX2Jhc2UudWw7CisKKyAgLyogQ2hlY2sgdGhhdCBldmVyeXRoaW5nIHN0YXJ0cyBhbGlnbmVkIHByb3Blcmx5LiAgKi8KKyAgRkZJX0FTU0VSVCAoKCh1bnNpZ25lZCBsb25nKSAoY2hhciAqKSBzdGFjayAmIDB4RikgPT0gMCk7CisgIEZGSV9BU1NFUlQgKCgodW5zaWduZWQgbG9uZykgc3RhY2t0b3AuYyAmIDB4RikgPT0gMCk7CisgIEZGSV9BU1NFUlQgKChieXRlcyAmIDB4RikgPT0gMCk7CisKKyAgLyogRGVhbCB3aXRoIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgYWN0dWFsbHkgcGFzcy1ieS1yZWZlcmVuY2UuICAqLworICBpZiAoZmxhZ3MgJiBGTEFHX1JFVFZBTF9SRUZFUkVOQ0UpCisgICAgKm5leHRfYXJnLnVsKysgPSAodW5zaWduZWQgbG9uZykgKGNoYXIgKikgZWNpZi0+cnZhbHVlOworCisgIC8qIE5vdyBmb3IgdGhlIGFyZ3VtZW50cy4gICovCisgIHBfYXJndi52ID0gZWNpZi0+YXZhbHVlOworICBmb3IgKHB0ciA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzLCBpID0gZWNpZi0+Y2lmLT5uYXJnczsKKyAgICAgICBpID4gMDsKKyAgICAgICBpLS0sIHB0cisrLCBwX2FyZ3YudisrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKCpwdHIpLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgZG91YmxlX3RtcCA9ICoqcF9hcmd2LmY7CisJICAqbmV4dF9hcmcuZiA9IChmbG9hdCkgZG91YmxlX3RtcDsKKwkgIGlmICgrK25leHRfYXJnLnVsID09IGdwcl9lbmQudWwpCisJICAgIG5leHRfYXJnLnVsID0gcmVzdC51bDsKKwkgIGlmIChmcGFyZ19jb3VudCA8IE5VTV9GUFJfQVJHX1JFR0lTVEVSUzY0KQorCSAgICAqZnByX2Jhc2UuZCsrID0gZG91YmxlX3RtcDsKKwkgIGZwYXJnX2NvdW50Kys7CisJICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICBkb3VibGVfdG1wID0gKipwX2FyZ3YuZDsKKwkgICpuZXh0X2FyZy5kID0gZG91YmxlX3RtcDsKKwkgIGlmICgrK25leHRfYXJnLnVsID09IGdwcl9lbmQudWwpCisJICAgIG5leHRfYXJnLnVsID0gcmVzdC51bDsKKwkgIGlmIChmcGFyZ19jb3VudCA8IE5VTV9GUFJfQVJHX1JFR0lTVEVSUzY0KQorCSAgICAqZnByX2Jhc2UuZCsrID0gZG91YmxlX3RtcDsKKwkgIGZwYXJnX2NvdW50Kys7CisJICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKKwkgIGJyZWFrOworCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwljYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICBkb3VibGVfdG1wID0gKCpwX2FyZ3YuZClbMF07CisJICAqbmV4dF9hcmcuZCA9IGRvdWJsZV90bXA7CisJICBpZiAoKytuZXh0X2FyZy51bCA9PSBncHJfZW5kLnVsKQorCSAgICBuZXh0X2FyZy51bCA9IHJlc3QudWw7CisJICBpZiAoZnBhcmdfY291bnQgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlM2NCkKKwkgICAgKmZwcl9iYXNlLmQrKyA9IGRvdWJsZV90bXA7CisJICBmcGFyZ19jb3VudCsrOworCSAgZG91YmxlX3RtcCA9ICgqcF9hcmd2LmQpWzFdOworCSAgKm5leHRfYXJnLmQgPSBkb3VibGVfdG1wOworCSAgaWYgKCsrbmV4dF9hcmcudWwgPT0gZ3ByX2VuZC51bCkKKwkgICAgbmV4dF9hcmcudWwgPSByZXN0LnVsOworCSAgaWYgKGZwYXJnX2NvdW50IDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTNjQpCisJICAgICpmcHJfYmFzZS5kKysgPSBkb3VibGVfdG1wOworCSAgZnBhcmdfY291bnQrKzsKKwkgIEZGSV9BU1NFUlQgKF9fTERCTF9NQU5UX0RJR19fID09IDEwNik7CisJICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfRlBfQVJHVU1FTlRTKTsKKwkgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIHdvcmRzID0gKCgqcHRyKS0+c2l6ZSArIDcpIC8gODsKKwkgIGlmIChuZXh0X2FyZy51bCA+PSBncHJfYmFzZS51bCAmJiBuZXh0X2FyZy51bCArIHdvcmRzID4gZ3ByX2VuZC51bCkKKwkgICAgeworCSAgICAgIHNpemVfdCBmaXJzdCA9IGdwcl9lbmQuYyAtIG5leHRfYXJnLmM7CisJICAgICAgbWVtY3B5IChuZXh0X2FyZy5jLCAqcF9hcmd2LmMsIGZpcnN0KTsKKwkgICAgICBtZW1jcHkgKHJlc3QuYywgKnBfYXJndi5jICsgZmlyc3QsICgqcHRyKS0+c2l6ZSAtIGZpcnN0KTsKKwkgICAgICBuZXh0X2FyZy5jID0gcmVzdC5jICsgd29yZHMgKiA4IC0gZmlyc3Q7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNoYXIgKndoZXJlID0gbmV4dF9hcmcuYzsKKworCSAgICAgIC8qIFN0cnVjdHVyZXMgd2l0aCBzaXplIGxlc3MgdGhhbiBlaWdodCBieXRlcyBhcmUgcGFzc2VkCisJCSBsZWZ0LXBhZGRlZC4gICovCisJICAgICAgaWYgKCgqcHRyKS0+c2l6ZSA8IDgpCisJCXdoZXJlICs9IDggLSAoKnB0ciktPnNpemU7CisKKwkgICAgICBtZW1jcHkgKHdoZXJlLCAqcF9hcmd2LmMsICgqcHRyKS0+c2l6ZSk7CisJICAgICAgbmV4dF9hcmcudWwgKz0gd29yZHM7CisJICAgICAgaWYgKG5leHRfYXJnLnVsID09IGdwcl9lbmQudWwpCisJCW5leHRfYXJnLnVsID0gcmVzdC51bDsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgZ3BydmFsdWUgPSAqKnBfYXJndi51YzsKKwkgIGdvdG8gcHV0Z3ByOworCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnNjOworCSAgZ290byBwdXRncHI7CisJY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnVzOworCSAgZ290byBwdXRncHI7CisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnNzOworCSAgZ290byBwdXRncHI7CisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnVpOworCSAgZ290byBwdXRncHI7CisJY2FzZSBGRklfVFlQRV9JTlQ6CisJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnNpOworCSAgZ290byBwdXRncHI7CisKKwljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKwljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJICBncHJ2YWx1ZSA9ICoqcF9hcmd2LnVsOworCXB1dGdwcjoKKwkgICpuZXh0X2FyZy51bCsrID0gZ3BydmFsdWU7CisJICBpZiAobmV4dF9hcmcudWwgPT0gZ3ByX2VuZC51bCkKKwkgICAgbmV4dF9hcmcudWwgPSByZXN0LnVsOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBGRklfQVNTRVJUIChmbGFncyAmIEZMQUdfNF9HUFJfQVJHVU1FTlRTCisJICAgICAgfHwgKG5leHRfYXJnLnVsID49IGdwcl9iYXNlLnVsCisJCSAgJiYgbmV4dF9hcmcudWwgPD0gZ3ByX2Jhc2UudWwgKyA0KSk7Cit9CisKKworCisvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jaWZfbWFjaGRlcCAoZmZpX2NpZiAqY2lmKQoreworICAvKiBBbGwgdGhpcyBpcyBmb3IgdGhlIFNZU1YgYW5kIExJTlVYNjQgQUJJLiAgKi8KKyAgaW50IGk7CisgIGZmaV90eXBlICoqcHRyOworICB1bnNpZ25lZCBieXRlczsKKyAgaW50IGZwYXJnX2NvdW50ID0gMCwgaW50YXJnX2NvdW50ID0gMDsKKyAgdW5zaWduZWQgZmxhZ3MgPSAwOworICB1bnNpZ25lZCBzdHJ1Y3RfY29weV9zaXplID0gMDsKKyAgdW5zaWduZWQgdHlwZSA9IGNpZi0+cnR5cGUtPnR5cGU7CisgIHVuc2lnbmVkIHNpemUgPSBjaWYtPnJ0eXBlLT5zaXplOworCisgIGlmIChjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKKyAgICBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSAwOworCisgIGlmIChjaWYtPmFiaSAhPSBGRklfTElOVVg2NCkKKyAgICB7CisgICAgICAvKiBBbGwgdGhlIG1hY2hpbmUtaW5kZXBlbmRlbnQgY2FsY3VsYXRpb24gb2YgY2lmLT5ieXRlcyB3aWxsIGJlIHdyb25nLgorCSBSZWRvIHRoZSBjYWxjdWxhdGlvbiBmb3IgU1lTVi4gICovCisKKyAgICAgIC8qIFNwYWNlIGZvciB0aGUgZnJhbWUgcG9pbnRlciwgY2FsbGVlJ3MgTFIsIGFuZCB0aGUgYXNtJ3MgdGVtcCByZWdzLiAgKi8KKyAgICAgIGJ5dGVzID0gKDIgKyBBU01fTkVFRFNfUkVHSVNURVJTKSAqIHNpemVvZiAoaW50KTsKKworICAgICAgLyogU3BhY2UgZm9yIHRoZSBHUFIgcmVnaXN0ZXJzLiAgKi8KKyAgICAgIGJ5dGVzICs9IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAqIHNpemVvZiAoaW50KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiA2NC1iaXQgQUJJLiAgKi8KKworICAgICAgLyogU3BhY2UgZm9yIGJhY2tjaGFpbiwgQ1IsIExSLCBjYy9sZCBkb3VibGV3b3JkLCBUT0MgYW5kIHRoZSBhc20ncyB0ZW1wCisJIHJlZ3MuICAqLworICAgICAgYnl0ZXMgPSAoNiArIEFTTV9ORUVEU19SRUdJU1RFUlM2NCkgKiBzaXplb2YgKGxvbmcpOworCisgICAgICAvKiBTcGFjZSBmb3IgdGhlIG1hbmRhdG9yeSBwYXJtIHNhdmUgYXJlYSBhbmQgZ2VuZXJhbCByZWdpc3RlcnMuICAqLworICAgICAgYnl0ZXMgKz0gMiAqIE5VTV9HUFJfQVJHX1JFR0lTVEVSUzY0ICogc2l6ZW9mIChsb25nKTsKKyAgICB9CisKKyAgLyogUmV0dXJuIHZhbHVlIGhhbmRsaW5nLiAgVGhlIHJ1bGVzIGZvciBTWVNWIGFyZSBhcyBmb2xsb3dzOgorICAgICAtIDMyLWJpdCAob3IgbGVzcykgaW50ZWdlciB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGdwcjM7CisgICAgIC0gU3RydWN0dXJlcyBvZiBzaXplIDw9IDQgYnl0ZXMgYWxzbyByZXR1cm5lZCBpbiBncHIzOworICAgICAtIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBiZXR3ZWVuIDUgYW5kIDggYnl0ZXMgYXJlIHJldHVybmVkCisgICAgIGluIGdwcjMgYW5kIGdwcjQ7CisgICAgIC0gU2luZ2xlL2RvdWJsZSBGUCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGZwcjE7CisgICAgIC0gTGFyZ2VyIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBzcGFjZSBhbmQgYSBwb2ludGVyIGlzIHBhc3NlZCBhcworICAgICB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAgIC0gbG9uZyBkb3VibGVzIChpZiBub3QgZXF1aXZhbGVudCB0byBkb3VibGUpIGFyZSByZXR1cm5lZCBpbgorICAgICBmcHIxLGZwcjIgZm9yIExpbnV4IGFuZCBhcyBmb3IgbGFyZ2Ugc3RydWN0cyBmb3IgU3lzVi4KKyAgICAgRm9yIExJTlVYNjQ6CisgICAgIC0gaW50ZWdlciB2YWx1ZXMgaW4gZ3ByMzsKKyAgICAgLSBTdHJ1Y3R1cmVzL1VuaW9ucyBieSByZWZlcmVuY2U7CisgICAgIC0gU2luZ2xlL2RvdWJsZSBGUCB2YWx1ZXMgaW4gZnByMSwgbG9uZyBkb3VibGUgaW4gZnByMSxmcHIyLgorICAgICAtIHNvZnQtZmxvYXQgZmxvYXQvZG91YmxlcyBhcmUgdHJlYXRlZCBhcyBVSU5UMzIvVUlOVDY0IHJlc3BlY3RpdmxleS4KKyAgICAgLSBzb2Z0LWZsb2F0IGxvbmcgZG91YmxlcyBhcmUgcmV0dXJuZWQgaW4gZ3ByMy1ncHI2LiAgKi8KKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorICAgIGNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyAgICAgIGlmIChjaWYtPmFiaSAhPSBGRklfTElOVVggJiYgY2lmLT5hYmkgIT0gRkZJX0xJTlVYNjQKKwkmJiBjaWYtPmFiaSAhPSBGRklfTElOVVhfU09GVF9GTE9BVCkKKwlnb3RvIGJ5cmVmOworICAgICAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TXzEyOEJJVFM7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworI2VuZGlmCisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfNjRCSVRTOworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgLyogV2l0aCBGRklfTElOVVhfU09GVF9GTE9BVCBubyBmcCByZWdpc3RlcnMgYXJlIHVzZWQuICAqLworICAgICAgaWYgKGNpZi0+YWJpICE9IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQorCWZsYWdzIHw9IEZMQUdfUkVUVVJOU19GUDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfNjRCSVRTOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyAgICAgIGlmIChjaWYtPmFiaSA9PSBGRklfU1lTVikKKwl7CisJICAvKiBUaGUgZmluYWwgU1lTViBBQkkgc2F5cyB0aGF0IHN0cnVjdHVyZXMgc21hbGxlciBvciBlcXVhbCA4IGJ5dGVzCisJICAgICBhcmUgcmV0dXJuZWQgaW4gcjMvcjQuIFRoZSBGRklfR0NDX1NZU1YgQUJJIGluc3RlYWQgcmV0dXJucyB0aGVtCisJICAgICBpbiBtZW1vcnkuICAqLworCisJICAvKiBUcmVhdCBzdHJ1Y3RzIHdpdGggc2l6ZSA8PSA4IGJ5dGVzLiAgKi8KKwkgIGlmIChzaXplIDw9IDgpCisJICAgIHsKKwkgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfU01TVDsKKwkgICAgICAvKiBUaGVzZSBzdHJ1Y3RzIGFyZSByZXR1cm5lZCBpbiByMy4gV2UgcGFjayB0aGUgdHlwZSBhbmQgdGhlCisJCSBwcmVjYWxjdWxhdGVkIHNoaWZ0IHZhbHVlIChuZWVkZWQgaW4gdGhlIHN5c3YuUykgaW50byBmbGFncy4KKwkJIFRoZSBzYW1lIGFwcGxpZXMgZm9yIHRoZSBzdHJ1Y3RzIHJldHVybmVkIGluIHIzL3I0LiAgKi8KKwkgICAgICBpZiAoc2l6ZSA8PSA0KQorCQl7CisJCSAgZmxhZ3MgfD0gRkxBR19TWVNWX1NNU1RfUjM7CisJCSAgZmxhZ3MgfD0gOCAqICg0IC0gc2l6ZSkgPDwgODsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIC8qIFRoZXNlIHN0cnVjdHMgYXJlIHJldHVybmVkIGluIHIzIGFuZCByNC4gU2VlIGFib3ZlLiAgICovCisJICAgICAgaWYgIChzaXplIDw9IDgpCisJCXsKKwkJICBmbGFncyB8PSBGTEFHX1NZU1ZfU01TVF9SMyB8IEZMQUdfU1lTVl9TTVNUX1I0OworCQkgIGZsYWdzIHw9IDggKiAoOCAtIHNpemUpIDw8IDg7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorICAgIGJ5cmVmOgorI2VuZGlmCisgICAgICBpbnRhcmdfY291bnQrKzsKKyAgICAgIGZsYWdzIHw9IEZMQUdfUkVUVkFMX1JFRkVSRU5DRTsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgICAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TX05PVEhJTkc7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBSZXR1cm5zIDMyLWJpdCBpbnRlZ2VyLCBvciBzaW1pbGFyLiAgTm90aGluZyB0byBkbyBoZXJlLiAgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoY2lmLT5hYmkgIT0gRkZJX0xJTlVYNjQpCisgICAgLyogVGhlIGZpcnN0IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyB3b3JkcyBvZiBpbnRlZ2VyIGFyZ3VtZW50cywgYW5kIHRoZQorICAgICAgIGZpcnN0IE5VTV9GUFJfQVJHX1JFR0lTVEVSUyBmcCBhcmd1bWVudHMsIGdvIGluIHJlZ2lzdGVyczsgdGhlIHJlc3QKKyAgICAgICBnb2VzIG9uIHRoZSBzdGFjay4gIFN0cnVjdHVyZXMgYW5kIGxvbmcgZG91YmxlcyAoaWYgbm90IGVxdWl2YWxlbnQKKyAgICAgICB0byBkb3VibGUpIGFyZSBwYXNzZWQgYXMgYSBwb2ludGVyIHRvIGEgY29weSBvZiB0aGUgc3RydWN0dXJlLgorICAgICAgIFN0dWZmIG9uIHRoZSBzdGFjayBuZWVkcyB0byBrZWVwIHByb3BlciBhbGlnbm1lbnQuICAqLworICAgIGZvciAocHRyID0gY2lmLT5hcmdfdHlwZXMsIGkgPSBjaWYtPm5hcmdzOyBpID4gMDsgaS0tLCBwdHIrKykKKyAgICAgIHsKKwlzd2l0Y2ggKCgqcHRyKS0+dHlwZSkKKwkgIHsKKwkgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJICAgIC8qIFdpdGggRkZJX0xJTlVYX1NPRlRfRkxPQVQgZmxvYXRzIGFyZSBoYW5kbGVkIGxpa2UgVUlOVDMyLiAgKi8KKwkgICAgaWYgKGNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQorCSAgICAgIGdvdG8gc29mdF9mbG9hdF9jaWY7CisJICAgIGZwYXJnX2NvdW50Kys7CisJICAgIC8qIGZsb2F0aW5nIHNpbmdsZXMgYXJlIG5vdCA4LWFsaWduZWQgb24gc3RhY2sgKi8KKwkgICAgYnJlYWs7CisKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCSAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgICBpZiAoY2lmLT5hYmkgIT0gRkZJX0xJTlVYICYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQorCSAgICAgIGdvdG8gZG9fc3RydWN0OworCSAgICBpZiAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCisJICAgICAgeworCQlpZiAoaW50YXJnX2NvdW50ID49IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAtIDMKKwkJICB8fCBpbnRhcmdfY291bnQgPCBOVU1fR1BSX0FSR19SRUdJU1RFUlMpCisJCSAgLyogQSBsb25nIGRvdWJsZSBpbiBGRklfTElOVVhfU09GVF9GTE9BVCBjYW4gdXNlIG9ubHkKKwkJICAgICBhIHNldCBvZiBmb3VyIGNvbnNlY3V0aXZlIGdwcnMuIElmIHdlIGhhdmUgbm90IGVub3VnaCwKKwkJICAgICB3ZSBoYXZlIHRvIGFkanVzdCB0aGUgaW50YXJnX2NvdW50IHZhbHVlLiAgKi8KKwkJICBpbnRhcmdfY291bnQgKz0gTlVNX0dQUl9BUkdfUkVHSVNURVJTIC0gaW50YXJnX2NvdW50OworCQlpbnRhcmdfY291bnQgKz0gNDsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgZnBhcmdfY291bnQrKzsKKwkgICAgLyogRmFsbCB0aHJ1ICovCisjZW5kaWYKKwkgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgICAvKiBXaXRoIEZGSV9MSU5VWF9TT0ZUX0ZMT0FUIGRvdWJsZXMgYXJlIGhhbmRsZWQgbGlrZSBVSU5UNjQuICAqLworCSAgICBpZiAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCisJICAgICAgZ290byBzb2Z0X2RvdWJsZV9jaWY7CisJICAgIGZwYXJnX2NvdW50Kys7CisJICAgIC8qIElmIHRoaXMgRlAgYXJnIGlzIGdvaW5nIG9uIHRoZSBzdGFjaywgaXQgbXVzdCBiZQorCSAgICAgICA4LWJ5dGUtYWxpZ25lZC4gICovCisJICAgIGlmIChmcGFyZ19jb3VudCA+IE5VTV9GUFJfQVJHX1JFR0lTVEVSUworCQkmJiBpbnRhcmdfY291bnQgPj0gTlVNX0dQUl9BUkdfUkVHSVNURVJTCisJCSYmIGludGFyZ19jb3VudCAlIDIgIT0gMCkKKwkgICAgICBpbnRhcmdfY291bnQrKzsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorCSAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJICBzb2Z0X2RvdWJsZV9jaWY6CisJICAgIC8qICdsb25nIGxvbmcnIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGFzIHR3byB3b3JkcywgYnV0CisJICAgICAgIGVpdGhlciBib3RoIHdvcmRzIG11c3QgZml0IGluIHJlZ2lzdGVycyBvciBib3RoIGdvCisJICAgICAgIG9uIHRoZSBzdGFjay4gIElmIHRoZXkgZ28gb24gdGhlIHN0YWNrLCB0aGV5IG11c3QKKwkgICAgICAgYmUgOC1ieXRlLWFsaWduZWQuCisKKwkgICAgICAgQWxzbywgb25seSBjZXJ0YWluIHJlZ2lzdGVyIHBhaXJzIGNhbiBiZSB1c2VkIGZvcgorCSAgICAgICBwYXNzaW5nIGxvbmcgbG9uZyBpbnQgLS0gc3BlY2lmaWNhbGx5IChyMyxyNCksIChyNSxyNiksCisJICAgICAgIChyNyxyOCksIChyOSxyMTApLgorCSAgICAqLworCSAgICBpZiAoaW50YXJnX2NvdW50ID09IE5VTV9HUFJfQVJHX1JFR0lTVEVSUy0xCisJCXx8IGludGFyZ19jb3VudCAlIDIgIT0gMCkKKwkgICAgICBpbnRhcmdfY291bnQrKzsKKwkgICAgaW50YXJnX2NvdW50ICs9IDI7CisJICAgIGJyZWFrOworCisJICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCSAgZG9fc3RydWN0OgorI2VuZGlmCisJICAgIC8qIFdlIG11c3QgYWxsb2NhdGUgc3BhY2UgZm9yIGEgY29weSBvZiB0aGVzZSB0byBlbmZvcmNlCisJICAgICAgIHBhc3MtYnktdmFsdWUuICBQYWQgdGhlIHNwYWNlIHVwIHRvIGEgbXVsdGlwbGUgb2YgMTYKKwkgICAgICAgYnl0ZXMgKHRoZSBtYXhpbXVtIGFsaWdubWVudCByZXF1aXJlZCBmb3IgYW55dGhpbmcgdW5kZXIKKwkgICAgICAgdGhlIFNZU1YgQUJJKS4gICovCisJICAgIHN0cnVjdF9jb3B5X3NpemUgKz0gKCgqcHRyKS0+c2l6ZSArIDE1KSAmIH4weEY7CisJICAgIC8qIEZhbGwgdGhyb3VnaCAoYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwb2ludGVyKS4gICovCisKKwkgIGRlZmF1bHQ6CisJICBzb2Z0X2Zsb2F0X2NpZjoKKwkgICAgLyogRXZlcnl0aGluZyBlbHNlIGlzIHBhc3NlZCBhcyBhIDQtYnl0ZSB3b3JkIGluIGEgR1BSLCBlaXRoZXIKKwkgICAgICAgdGhlIG9iamVjdCBpdHNlbGYgb3IgYSBwb2ludGVyIHRvIGl0LiAgKi8KKwkgICAgaW50YXJnX2NvdW50Kys7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgfQorICBlbHNlCisgICAgZm9yIChwdHIgPSBjaWYtPmFyZ190eXBlcywgaSA9IGNpZi0+bmFyZ3M7IGkgPiAwOyBpLS0sIHB0cisrKQorICAgICAgeworCXN3aXRjaCAoKCpwdHIpLT50eXBlKQorCSAgeworI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCisJICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICAgIGlmIChjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKKwkgICAgICBpbnRhcmdfY291bnQgKz0gNDsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJZnBhcmdfY291bnQgKz0gMjsKKwkJaW50YXJnX2NvdW50ICs9IDI7CisJICAgICAgfQorCSAgICBicmVhazsKKyNlbmRpZgorCSAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgICBmcGFyZ19jb3VudCsrOworCSAgICBpbnRhcmdfY291bnQrKzsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgICBpbnRhcmdfY291bnQgKz0gKCgqcHRyKS0+c2l6ZSArIDcpIC8gODsKKwkgICAgYnJlYWs7CisKKwkgIGRlZmF1bHQ6CisJICAgIC8qIEV2ZXJ5dGhpbmcgZWxzZSBpcyBwYXNzZWQgYXMgYSA4LWJ5dGUgd29yZCBpbiBhIEdQUiwgZWl0aGVyCisJICAgICAgIHRoZSBvYmplY3QgaXRzZWxmIG9yIGEgcG9pbnRlciB0byBpdC4gICovCisJICAgIGludGFyZ19jb3VudCsrOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIH0KKworICBpZiAoZnBhcmdfY291bnQgIT0gMCkKKyAgICBmbGFncyB8PSBGTEFHX0ZQX0FSR1VNRU5UUzsKKyAgaWYgKGludGFyZ19jb3VudCA+IDQpCisgICAgZmxhZ3MgfD0gRkxBR180X0dQUl9BUkdVTUVOVFM7CisgIGlmIChzdHJ1Y3RfY29weV9zaXplICE9IDApCisgICAgZmxhZ3MgfD0gRkxBR19BUkdfTkVFRFNfQ09QWTsKKworICBpZiAoY2lmLT5hYmkgIT0gRkZJX0xJTlVYNjQpCisgICAgeworICAgICAgLyogU3BhY2UgZm9yIHRoZSBGUFIgcmVnaXN0ZXJzLCBpZiBuZWVkZWQuICAqLworICAgICAgaWYgKGZwYXJnX2NvdW50ICE9IDApCisJYnl0ZXMgKz0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTICogc2l6ZW9mIChkb3VibGUpOworCisgICAgICAvKiBTdGFjayBzcGFjZS4gICovCisgICAgICBpZiAoaW50YXJnX2NvdW50ID4gTlVNX0dQUl9BUkdfUkVHSVNURVJTKQorCWJ5dGVzICs9IChpbnRhcmdfY291bnQgLSBOVU1fR1BSX0FSR19SRUdJU1RFUlMpICogc2l6ZW9mIChpbnQpOworICAgICAgaWYgKGZwYXJnX2NvdW50ID4gTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCWJ5dGVzICs9IChmcGFyZ19jb3VudCAtIE5VTV9GUFJfQVJHX1JFR0lTVEVSUykgKiBzaXplb2YgKGRvdWJsZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogU3BhY2UgZm9yIHRoZSBGUFIgcmVnaXN0ZXJzLCBpZiBuZWVkZWQuICAqLworICAgICAgaWYgKGZwYXJnX2NvdW50ICE9IDApCisJYnl0ZXMgKz0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTNjQgKiBzaXplb2YgKGRvdWJsZSk7CisKKyAgICAgIC8qIFN0YWNrIHNwYWNlLiAgKi8KKyAgICAgIGlmIChpbnRhcmdfY291bnQgPiBOVU1fR1BSX0FSR19SRUdJU1RFUlM2NCkKKwlieXRlcyArPSAoaW50YXJnX2NvdW50IC0gTlVNX0dQUl9BUkdfUkVHSVNURVJTNjQpICogc2l6ZW9mIChsb25nKTsKKyAgICB9CisKKyAgLyogVGhlIHN0YWNrIHNwYWNlIGFsbG9jYXRlZCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLiAgKi8KKyAgYnl0ZXMgPSAoYnl0ZXMgKyAxNSkgJiB+MHhGOworCisgIC8qIEFkZCBpbiB0aGUgc3BhY2UgZm9yIHRoZSBjb3BpZWQgc3RydWN0dXJlcy4gICovCisgIGJ5dGVzICs9IHN0cnVjdF9jb3B5X3NpemU7CisKKyAgY2lmLT5mbGFncyA9IGZsYWdzOworICBjaWYtPmJ5dGVzID0gYnl0ZXM7CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfU1lTVihleHRlbmRlZF9jaWYgKiwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCAqLAorCQkJICB2b2lkICgqZm4pKHZvaWQpKTsKK2V4dGVybiB2b2lkIEZGSV9ISURERU4gZmZpX2NhbGxfTElOVVg2NChleHRlbmRlZF9jaWYgKiwgdW5zaWduZWQgbG9uZywKKwkJCQkJdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyAqLAorCQkJCQl2b2lkICgqZm4pKHZvaWQpKTsKKwordm9pZAorZmZpX2NhbGwoZmZpX2NpZiAqY2lmLCB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICpydmFsdWUsIHZvaWQgKiphdmFsdWUpCit7CisgIGV4dGVuZGVkX2NpZiBlY2lmOworCisgIGVjaWYuY2lmID0gY2lmOworICBlY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKKworICAvKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0IGFuZCB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuCSovCisgIC8qIHZhbHVlIGFkZHJlc3MgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lCQkgICAgICAgICovCisKKyAgaWYgKChydmFsdWUgPT0gTlVMTCkgJiYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSkKKyAgICB7CisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKKworCisgIHN3aXRjaCAoY2lmLT5hYmkpCisgICAgeworI2lmbmRlZiBQT1dFUlBDNjQKKyAgICBjYXNlIEZGSV9TWVNWOgorICAgIGNhc2UgRkZJX0dDQ19TWVNWOgorICAgIGNhc2UgRkZJX0xJTlVYOgorICAgIGNhc2UgRkZJX0xJTlVYX1NPRlRfRkxPQVQ6CisgICAgICBmZmlfY2FsbF9TWVNWICgmZWNpZiwgLWNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgY2FzZSBGRklfTElOVVg2NDoKKyAgICAgIGZmaV9jYWxsX0xJTlVYNjQgKCZlY2lmLCAtKGxvbmcpIGNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUICgwKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworCisjaWZuZGVmIFBPV0VSUEM2NAorI2RlZmluZSBNSU5fQ0FDSEVfTElORV9TSVpFIDgKKworc3RhdGljIHZvaWQKK2ZsdXNoX2ljYWNoZSAoY2hhciAqd3JhZGRyLCBjaGFyICp4YWRkciwgaW50IHNpemUpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBNSU5fQ0FDSEVfTElORV9TSVpFKQorICAgIF9fYXNtX18gdm9sYXRpbGUgKCJpY2JpIDAsJTA7IiAiZGNiZiAwLCUxOyIKKwkJICAgICAgOiA6ICJyIiAoeGFkZHIgKyBpKSwgInIiICh3cmFkZHIgKyBpKSA6ICJtZW1vcnkiKTsKKyAgX19hc21fXyB2b2xhdGlsZSAoImljYmkgMCwlMDsiICJkY2JmIDAsJTE7IiAic3luYzsiICJpc3luYzsiCisJCSAgICA6IDogInIiKHhhZGRyICsgc2l6ZSAtIDEpLCAiciIod3JhZGRyICsgc2l6ZSAtIDEpCisJCSAgICA6ICJtZW1vcnkiKTsKK30KKyNlbmRpZgorCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsCisJCSAgICAgIGZmaV9jaWYgKmNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikgKGZmaV9jaWYgKiwgdm9pZCAqLCB2b2lkICoqLCB2b2lkICopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCSAgICAgIHZvaWQgKmNvZGVsb2MpCit7CisjaWZkZWYgUE9XRVJQQzY0CisgIHZvaWQgKip0cmFtcCA9ICh2b2lkICoqKSAmY2xvc3VyZS0+dHJhbXBbMF07CisKKyAgaWYgKGNpZi0+YWJpICE9IEZGSV9MSU5VWDY0KQorICAgIHJldHVybiBGRklfQkFEX0FCSTsKKyAgLyogQ29weSBmdW5jdGlvbiBhZGRyZXNzIGFuZCBUT0MgZnJvbSBmZmlfY2xvc3VyZV9MSU5VWDY0LiAgKi8KKyAgbWVtY3B5ICh0cmFtcCwgKGNoYXIgKikgZmZpX2Nsb3N1cmVfTElOVVg2NCwgMTYpOworICB0cmFtcFsyXSA9IGNvZGVsb2M7CisjZWxzZQorICB1bnNpZ25lZCBpbnQgKnRyYW1wOworCisgIGlmICghIChjaWYtPmFiaSA9PSBGRklfR0NDX1NZU1YgCisJIHx8IGNpZi0+YWJpID09IEZGSV9TWVNWCisJIHx8IGNpZi0+YWJpID09IEZGSV9MSU5VWAorCSB8fCBjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkpCisgICAgcmV0dXJuIEZGSV9CQURfQUJJOworCisgIHRyYW1wID0gKHVuc2lnbmVkIGludCAqKSAmY2xvc3VyZS0+dHJhbXBbMF07CisgIHRyYW1wWzBdID0gMHg3YzA4MDJhNjsgIC8qICAgbWZsciAgICByMCAqLworICB0cmFtcFsxXSA9IDB4NDgwMDAwMGQ7ICAvKiAgIGJsICAgICAgMTAgPHRyYW1wb2xpbmVfaW5pdGlhbCsweDEwPiAqLworICB0cmFtcFs0XSA9IDB4N2Q2ODAyYTY7ICAvKiAgIG1mbHIgICAgcjExICovCisgIHRyYW1wWzVdID0gMHg3YzA4MDNhNjsgIC8qICAgbXRsciAgICByMCAqLworICB0cmFtcFs2XSA9IDB4ODAwYjAwMDA7ICAvKiAgIGx3eiAgICAgcjAsMChyMTEpICovCisgIHRyYW1wWzddID0gMHg4MTZiMDAwNDsgIC8qICAgbHd6ICAgICByMTEsNChyMTEpICovCisgIHRyYW1wWzhdID0gMHg3YzA5MDNhNjsgIC8qICAgbXRjdHIgICByMCAqLworICB0cmFtcFs5XSA9IDB4NGU4MDA0MjA7ICAvKiAgIGJjdHIgKi8KKyAgKih2b2lkICoqKSAmdHJhbXBbMl0gPSAodm9pZCAqKSBmZmlfY2xvc3VyZV9TWVNWOyAvKiBmdW5jdGlvbiAqLworICAqKHZvaWQgKiopICZ0cmFtcFszXSA9IGNvZGVsb2M7ICAgICAgICAgICAgICAgICAgIC8qIGNvbnRleHQgKi8KKworICAvKiBGbHVzaCB0aGUgaWNhY2hlLiAgKi8KKyAgZmx1c2hfaWNhY2hlICgoY2hhciAqKXRyYW1wLCAoY2hhciAqKWNvZGVsb2MsIEZGSV9UUkFNUE9MSU5FX1NJWkUpOworI2VuZGlmCisKKyAgY2xvc3VyZS0+Y2lmID0gY2lmOworICBjbG9zdXJlLT5mdW4gPSBmdW47CisgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKworICByZXR1cm4gRkZJX09LOworfQorCit0eXBlZGVmIHVuaW9uCit7CisgIGZsb2F0IGY7CisgIGRvdWJsZSBkOworfSBmZmlfZGJsZmw7CisKK2ludCBmZmlfY2xvc3VyZV9oZWxwZXJfU1lTViAoZmZpX2Nsb3N1cmUgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nICosCisJCQkgICAgIGZmaV9kYmxmbCAqLCB1bnNpZ25lZCBsb25nICopOworCisvKiBCYXNpY2FsbHkgdGhlIHRyYW1wb2xpbmUgaW52b2tlcyBmZmlfY2xvc3VyZV9TWVNWLCBhbmQgb24KKyAqIGVudHJ5LCByMTEgaG9sZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNsb3N1cmUuCisgKiBBZnRlciBzdG9yaW5nIHRoZSByZWdpc3RlcnMgdGhhdCBjb3VsZCBwb3NzaWJseSBjb250YWluCisgKiBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBzdGFjayBmcmFtZSBhbmQgc2V0dGluZworICogdXAgc3BhY2UgZm9yIGEgcmV0dXJuIHZhbHVlLCBmZmlfY2xvc3VyZV9TWVNWIGludm9rZXMgdGhlCisgKiBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9uIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmsKKyAqLworCitpbnQKK2ZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWIChmZmlfY2xvc3VyZSAqY2xvc3VyZSwgdm9pZCAqcnZhbHVlLAorCQkJIHVuc2lnbmVkIGxvbmcgKnBnciwgZmZpX2RibGZsICpwZnIsCisJCQkgdW5zaWduZWQgbG9uZyAqcHN0KQoreworICAvKiBydmFsdWUgaXMgdGhlIHBvaW50ZXIgdG8gc3BhY2UgZm9yIHJldHVybiB2YWx1ZSBpbiBjbG9zdXJlIGFzc2VtYmx5ICovCisgIC8qIHBnciBpcyB0aGUgcG9pbnRlciB0byB3aGVyZSByMy1yMTAgYXJlIHN0b3JlZCBpbiBmZmlfY2xvc3VyZV9TWVNWICovCisgIC8qIHBmciBpcyB0aGUgcG9pbnRlciB0byB3aGVyZSBmMS1mOCBhcmUgc3RvcmVkIGluIGZmaV9jbG9zdXJlX1NZU1YgICovCisgIC8qIHBzdCBpcyB0aGUgcG9pbnRlciB0byBvdXRnb2luZyBwYXJhbWV0ZXIgc3RhY2sgaW4gb3JpZ2luYWwgY2FsbGVyICovCisKKyAgdm9pZCAqKiAgICAgICAgICBhdmFsdWU7CisgIGZmaV90eXBlICoqICAgICAgYXJnX3R5cGVzOworICBsb25nICAgICAgICAgICAgIGksIGF2bjsKKyAgbG9uZyAgICAgICAgICAgICBuZjsgICAvKiBudW1iZXIgb2YgZmxvYXRpbmcgcmVnaXN0ZXJzIGFscmVhZHkgdXNlZCAqLworICBsb25nICAgICAgICAgICAgIG5nOyAgIC8qIG51bWJlciBvZiBnZW5lcmFsIHJlZ2lzdGVycyBhbHJlYWR5IHVzZWQgKi8KKyAgZmZpX2NpZiAqICAgICAgICBjaWY7CisgIGRvdWJsZSAgICAgICAgICAgdGVtcDsKKyAgdW5zaWduZWQgICAgICAgICBzaXplOworCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgYXZhbHVlID0gYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkICopKTsKKyAgc2l6ZSA9IGNpZi0+cnR5cGUtPnNpemU7CisKKyAgbmYgPSAwOworICBuZyA9IDA7CisKKyAgLyogQ29weSB0aGUgY2FsbGVyJ3Mgc3RydWN0dXJlIHJldHVybiB2YWx1ZSBhZGRyZXNzIHNvIHRoYXQgdGhlIGNsb3N1cmUKKyAgICAgcmV0dXJucyB0aGUgZGF0YSBkaXJlY3RseSB0byB0aGUgY2FsbGVyLgorICAgICBGb3IgRkZJX1NZU1YgdGhlIHJlc3VsdCBpcyBwYXNzZWQgaW4gcjMvcjQgaWYgdGhlIHN0cnVjdCBzaXplIGlzIGxlc3MKKyAgICAgb3IgZXF1YWwgOCBieXRlcy4gICovCisKKyAgaWYgKChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAorICAgICAgICYmICEoKGNpZi0+YWJpID09IEZGSV9TWVNWKSAmJiAoc2l6ZSA8PSA4KSkpCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKyAgICAgIHx8IChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUKKwkgICYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWCAmJiBjaWYtPmFiaSAhPSBGRklfTElOVVhfU09GVF9GTE9BVCkKKyNlbmRpZgorICAgICAgKQorICAgIHsKKyAgICAgIHJ2YWx1ZSA9ICh2b2lkICopICpwZ3I7CisgICAgICBuZysrOworICAgICAgcGdyKys7CisgICAgfQorCisgIGkgPSAwOworICBhdm4gPSBjaWYtPm5hcmdzOworICBhcmdfdHlwZXMgPSBjaWYtPmFyZ190eXBlczsKKworICAvKiBHcmFiIHRoZSBhZGRyZXNzZXMgb2YgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBzdGFjayBmcmFtZS4gICovCisgIHdoaWxlIChpIDwgYXZuKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYXJnX3R5cGVzW2ldLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJICAvKiB0aGVyZSBhcmUgOCBncHIgcmVnaXN0ZXJzIHVzZWQgdG8gcGFzcyB2YWx1ZXMgKi8KKwkgIGlmIChuZyA8IDgpCisJICAgIHsKKwkgICAgICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwZ3IgKyAzOworCSAgICAgIG5nKys7CisJICAgICAgcGdyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGF2YWx1ZVtpXSA9IChjaGFyICopIHBzdCArIDM7CisJICAgICAgcHN0Kys7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAvKiB0aGVyZSBhcmUgOCBncHIgcmVnaXN0ZXJzIHVzZWQgdG8gcGFzcyB2YWx1ZXMgKi8KKwkgIGlmIChuZyA8IDgpCisJICAgIHsKKwkgICAgICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwZ3IgKyAyOworCSAgICAgIG5nKys7CisJICAgICAgcGdyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGF2YWx1ZVtpXSA9IChjaGFyICopIHBzdCArIDI7CisJICAgICAgcHN0Kys7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorCXNvZnRfZmxvYXRfY2xvc3VyZToKKwkgIC8qIHRoZXJlIGFyZSA4IGdwciByZWdpc3RlcnMgdXNlZCB0byBwYXNzIHZhbHVlcyAqLworCSAgaWYgKG5nIDwgOCkKKwkgICAgeworCSAgICAgIGF2YWx1ZVtpXSA9IHBncjsKKwkgICAgICBuZysrOworCSAgICAgIHBncisrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhdmFsdWVbaV0gPSBwc3Q7CisJICAgICAgcHN0Kys7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwlkb19zdHJ1Y3Q6CisjZW5kaWYKKwkgIC8qIFN0cnVjdHMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFRoZSBhZGRyZXNzIHdpbGwgYXBwZWFyIGluIGEKKwkgICAgIGdwciBpZiBpdCBpcyBvbmUgb2YgdGhlIGZpcnN0IDggYXJndW1lbnRzLiAgKi8KKwkgIGlmIChuZyA8IDgpCisJICAgIHsKKwkgICAgICBhdmFsdWVbaV0gPSAodm9pZCAqKSAqcGdyOworCSAgICAgIG5nKys7CisJICAgICAgcGdyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGF2YWx1ZVtpXSA9ICh2b2lkICopICpwc3Q7CisJICAgICAgcHN0Kys7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJc29mdF9kb3VibGVfY2xvc3VyZToKKwkgIC8qIHBhc3NpbmcgbG9uZyBsb25nIGludHMgYXJlIGNvbXBsZXgsIHRoZXkgbXVzdAorCSAgICogYmUgcGFzc2VkIGluIHN1aXRhYmxlIHJlZ2lzdGVyIHBhaXJzIHN1Y2ggYXMKKwkgICAqIChyMyxyNCkgb3IgKHI1LHI2KSBvciAocjYscjcpLCBvciAocjcscjgpIG9yIChyOSxyMTApCisJICAgKiBhbmQgaWYgdGhlIGVudGlyZSBwYWlyIGFyZW4ndCBhdmFpbGFibGUgdGhlbiB0aGUgb3V0Z29pbmcKKwkgICAqIHBhcmFtZXRlciBzdGFjayBpcyB1c2VkIGZvciBib3RoIGJ1dCBhbiBhbGlnbm1lbnQgb2YgOAorCSAgICogbXVzdCB3aWxsIGJlIGtlcHQuICBTbyB3ZSBtdXN0IGVpdGhlciBsb29rIGluIHBncgorCSAgICogb3IgcHN0IHRvIGZpbmQgdGhlIGNvcnJlY3QgYWRkcmVzcyBmb3IgdGhpcyB0eXBlCisJICAgKiBvZiBwYXJhbWV0ZXIuCisJICAgKi8KKwkgIGlmIChuZyA8IDcpCisJICAgIHsKKwkgICAgICBpZiAobmcgJiAweDAxKQorCQl7CisJCSAgLyogc2tpcCByNCwgcjYsIHI4IGFzIHN0YXJ0aW5nIHBvaW50cyAqLworCQkgIG5nKys7CisJCSAgcGdyKys7CisJCX0KKwkgICAgICBhdmFsdWVbaV0gPSBwZ3I7CisJICAgICAgbmcgKz0gMjsKKwkgICAgICBwZ3IgKz0gMjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCgobG9uZykgcHN0KSAmIDQpCisJCXBzdCsrOworCSAgICAgIGF2YWx1ZVtpXSA9IHBzdDsKKwkgICAgICBwc3QgKz0gMjsKKwkgICAgICBuZyA9IDg7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgIC8qIFdpdGggRkZJX0xJTlVYX1NPRlRfRkxPQVQgZmxvYXRzIGFyZSBoYW5kbGVkIGxpa2UgVUlOVDMyLiAgKi8KKwkgIGlmIChjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKKwkgICAgZ290byBzb2Z0X2Zsb2F0X2Nsb3N1cmU7CisJICAvKiB1bmZvcnR1bmF0ZWx5IGZsb2F0IHZhbHVlcyBhcmUgc3RvcmVkIGFzIGRvdWJsZXMKKwkgICAqIGluIHRoZSBmZmlfY2xvc3VyZV9TWVNWIGNvZGUgKHNpbmNlIHdlIGRvbid0IGNoZWNrCisJICAgKiB0aGUgdHlwZSBpbiB0aGF0IHJvdXRpbmUpLgorCSAgICovCisKKwkgIC8qIHRoZXJlIGFyZSA4IDY0Yml0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworCisJICBpZiAobmYgPCA4KQorCSAgICB7CisJICAgICAgdGVtcCA9IHBmci0+ZDsKKwkgICAgICBwZnItPmYgPSAoZmxvYXQpIHRlbXA7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIG5mKys7CisJICAgICAgcGZyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEZJWE1FPyBoZXJlIHdlIGFyZSByZWFsbHkgY2hhbmdpbmcgdGhlIHZhbHVlcworCSAgICAgICAqIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgY2FsbGluZyByb3V0aW5lcyBvdXRnb2luZworCSAgICAgICAqIHBhcmFtZXRlciBzdGFjay4gIFRoaXMgaXMgcHJvYmFibHkgYSByZWFsbHkKKwkgICAgICAgKiBuYXVnaHR5IHRoaW5nIHRvIGRvIGJ1dC4uLgorCSAgICAgICAqLworCSAgICAgIGF2YWx1ZVtpXSA9IHBzdDsKKwkgICAgICBwc3QgKz0gMTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgIC8qIFdpdGggRkZJX0xJTlVYX1NPRlRfRkxPQVQgZG91YmxlcyBhcmUgaGFuZGxlZCBsaWtlIFVJTlQ2NC4gICovCisJICBpZiAoY2lmLT5hYmkgPT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCisJICAgIGdvdG8gc29mdF9kb3VibGVfY2xvc3VyZTsKKwkgIC8qIE9uIHRoZSBvdXRnb2luZyBzdGFjayBhbGwgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIDggKi8KKwkgIC8qIHRoZXJlIGFyZSA4IDY0Yml0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworCisJICBpZiAobmYgPCA4KQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIG5mKys7CisJICAgICAgcGZyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgoKGxvbmcpIHBzdCkgJiA0KQorCQlwc3QrKzsKKwkgICAgICBhdmFsdWVbaV0gPSBwc3Q7CisJICAgICAgcHN0ICs9IDI7CisJICAgIH0KKwkgIGJyZWFrOworCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwljYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICBpZiAoY2lmLT5hYmkgIT0gRkZJX0xJTlVYICYmIGNpZi0+YWJpICE9IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQorCSAgICBnb3RvIGRvX3N0cnVjdDsKKwkgIGlmIChjaWYtPmFiaSA9PSBGRklfTElOVVhfU09GVF9GTE9BVCkKKwkgICAgeyAvKiBUZXN0IGlmIGZvciB0aGUgd2hvbGUgbG9uZyBkb3VibGUsIDQgZ3BycyBhcmUgYXZhaWxhYmxlLgorCQkgb3RoZXJ3aXNlIHRoZSBzdHVmZiBlbmRzIHVwIG9uIHRoZSBzdGFjay4gICovCisJICAgICAgaWYgKG5nIDwgNSkKKwkJeworCQkgIGF2YWx1ZVtpXSA9IHBncjsKKwkJICBwZ3IgKz0gNDsKKwkJICBuZyArPSA0OworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgYXZhbHVlW2ldID0gcHN0OworCQkgIHBzdCArPSA0OworCQkgIG5nID0gODsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpZiAobmYgPCA3KQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIHBmciArPSAyOworCSAgICAgIG5mICs9IDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgoKGxvbmcpIHBzdCkgJiA0KQorCQlwc3QrKzsKKwkgICAgICBhdmFsdWVbaV0gPSBwc3Q7CisJICAgICAgcHN0ICs9IDQ7CisJICAgICAgbmYgPSA4OworCSAgICB9CisJICBicmVhazsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkgIEZGSV9BU1NFUlQgKDApOworCX0KKworICAgICAgaSsrOworICAgIH0KKworCisgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIC8qIFRlbGwgZmZpX2Nsb3N1cmVfU1lTViBob3cgdG8gcGVyZm9ybSByZXR1cm4gdHlwZSBwcm9tb3Rpb25zLgorICAgICBCZWNhdXNlIHRoZSBGRklfU1lTViBBQkkgcmV0dXJucyB0aGUgc3RydWN0dXJlcyA8PSA4IGJ5dGVzIGluIHIzL3I0CisgICAgIHdlIGhhdmUgdG8gdGVsbCBmZmlfY2xvc3VyZV9TWVNWIGhvdyB0byB0cmVhdCB0aGVtLiBXZSBjb21iaW5lIHRoZSBiYXNlCisgICAgIHR5cGUgRkZJX1NZU1ZfVFlQRV9TTUFMTF9TVFJVQ1QgLSAxICB3aXRoIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QuCisgICAgIFNvIGEgb25lIGJ5dGUgc3RydWN0IGdldHMgdGhlIHJldHVybiB0eXBlIDE2LiBSZXR1cm4gdHlwZSAxIHRvIDE1IGFyZQorICAgICBhbHJlYWR5IHVzZWQgYW5kIHdlIG5ldmVyIGhhdmUgYSBzdHJ1Y3Qgd2l0aCBzaXplIHplcm8uIFRoYXQgaXMgdGhlIHJlYXNvbgorICAgICBmb3IgdGhlIHN1YnRyYWN0aW9uIG9mIDEuIFNlZSB0aGUgY29tbWVudCBpbiBmZml0YXJnZXQuaCBhYm91dCBvcmRlcmluZy4KKyAgKi8KKyAgaWYgKGNpZi0+YWJpID09IEZGSV9TWVNWICYmIGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAmJiBzaXplIDw9IDgpCisgICAgcmV0dXJuIChGRklfU1lTVl9UWVBFX1NNQUxMX1NUUlVDVCAtIDEpICsgc2l6ZTsKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorICBlbHNlIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUKKwkgICAmJiBjaWYtPmFiaSAhPSBGRklfTElOVVggJiYgY2lmLT5hYmkgIT0gRkZJX0xJTlVYX1NPRlRfRkxPQVQpCisgICAgcmV0dXJuIEZGSV9UWVBFX1NUUlVDVDsKKyNlbmRpZgorICAvKiBXaXRoIEZGSV9MSU5VWF9TT0ZUX0ZMT0FUIGZsb2F0cyBhbmQgZG91YmxlcyBhcmUgaGFuZGxlZCBsaWtlIFVJTlQzMgorICAgICByZXNwZWN0aXZsZXkgVUlOVDY0LiAgKi8KKyAgaWYgKGNpZi0+YWJpID09IEZGSV9MSU5VWF9TT0ZUX0ZMT0FUKQorICAgIHsKKyAgICAgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKKwl7CisJY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgIHJldHVybiBGRklfVFlQRV9VSU5UMzI7CisJICBicmVhazsKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgIHJldHVybiBGRklfVFlQRV9VSU5UNjQ7CisJICBicmVhazsKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKwkgIHJldHVybiBGRklfVFlQRV9VSU5UMTI4OworCSAgYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCSAgcmV0dXJuIGNpZi0+cnR5cGUtPnR5cGU7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBjaWYtPnJ0eXBlLT50eXBlOworICAgIH0KK30KKworaW50IEZGSV9ISURERU4gZmZpX2Nsb3N1cmVfaGVscGVyX0xJTlVYNjQgKGZmaV9jbG9zdXJlICosIHZvaWQgKiwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyAqLCBmZmlfZGJsZmwgKik7CisKK2ludCBGRklfSElEREVOCitmZmlfY2xvc3VyZV9oZWxwZXJfTElOVVg2NCAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsIHZvaWQgKnJ2YWx1ZSwKKwkJCSAgICB1bnNpZ25lZCBsb25nICpwc3QsIGZmaV9kYmxmbCAqcGZyKQoreworICAvKiBydmFsdWUgaXMgdGhlIHBvaW50ZXIgdG8gc3BhY2UgZm9yIHJldHVybiB2YWx1ZSBpbiBjbG9zdXJlIGFzc2VtYmx5ICovCisgIC8qIHBzdCBpcyB0aGUgcG9pbnRlciB0byBwYXJhbWV0ZXIgc2F2ZSBhcmVhCisgICAgIChyMy1yMTAgYXJlIHN0b3JlZCBpbnRvIGl0cyBmaXJzdCA4IHNsb3RzIGJ5IGZmaV9jbG9zdXJlX0xJTlVYNjQpICovCisgIC8qIHBmciBpcyB0aGUgcG9pbnRlciB0byB3aGVyZSBmMS1mMTMgYXJlIHN0b3JlZCBpbiBmZmlfY2xvc3VyZV9MSU5VWDY0ICovCisKKyAgdm9pZCAqKmF2YWx1ZTsKKyAgZmZpX3R5cGUgKiphcmdfdHlwZXM7CisgIGxvbmcgaSwgYXZuOworICBmZmlfY2lmICpjaWY7CisgIGZmaV9kYmxmbCAqZW5kX3BmciA9IHBmciArIE5VTV9GUFJfQVJHX1JFR0lTVEVSUzY0OworCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgYXZhbHVlID0gYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkICopKTsKKworICAvKiBDb3B5IHRoZSBjYWxsZXIncyBzdHJ1Y3R1cmUgcmV0dXJuIHZhbHVlIGFkZHJlc3Mgc28gdGhhdCB0aGUgY2xvc3VyZQorICAgICByZXR1cm5zIHRoZSBkYXRhIGRpcmVjdGx5IHRvIHRoZSBjYWxsZXIuICAqLworICBpZiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgeworICAgICAgcnZhbHVlID0gKHZvaWQgKikgKnBzdDsKKyAgICAgIHBzdCsrOworICAgIH0KKworICBpID0gMDsKKyAgYXZuID0gY2lmLT5uYXJnczsKKyAgYXJnX3R5cGVzID0gY2lmLT5hcmdfdHlwZXM7CisKKyAgLyogR3JhYiB0aGUgYWRkcmVzc2VzIG9mIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2sgZnJhbWUuICAqLworICB3aGlsZSAoaSA8IGF2bikKKyAgICB7CisgICAgICBzd2l0Y2ggKGFyZ190eXBlc1tpXS0+dHlwZSkKKwl7CisJY2FzZSBGRklfVFlQRV9TSU5UODoKKwljYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgYXZhbHVlW2ldID0gKGNoYXIgKikgcHN0ICsgNzsKKwkgIHBzdCsrOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkgIGF2YWx1ZVtpXSA9IChjaGFyICopIHBzdCArIDY7CisJICBwc3QrKzsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwc3QgKyA0OworCSAgcHN0Kys7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfU0lOVDY0OgorCWNhc2UgRkZJX1RZUEVfVUlOVDY0OgorCWNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKwkgIGF2YWx1ZVtpXSA9IHBzdDsKKwkgIHBzdCsrOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIC8qIFN0cnVjdHVyZXMgd2l0aCBzaXplIGxlc3MgdGhhbiBlaWdodCBieXRlcyBhcmUgcGFzc2VkCisJICAgICBsZWZ0LXBhZGRlZC4gICovCisJICBpZiAoYXJnX3R5cGVzW2ldLT5zaXplIDwgOCkKKwkgICAgYXZhbHVlW2ldID0gKGNoYXIgKikgcHN0ICsgOCAtIGFyZ190eXBlc1tpXS0+c2l6ZTsKKwkgIGVsc2UKKwkgICAgYXZhbHVlW2ldID0gcHN0OworCSAgcHN0ICs9IChhcmdfdHlwZXNbaV0tPnNpemUgKyA3KSAvIDg7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJICAvKiB1bmZvcnR1bmF0ZWx5IGZsb2F0IHZhbHVlcyBhcmUgc3RvcmVkIGFzIGRvdWJsZXMKKwkgICAqIGluIHRoZSBmZmlfY2xvc3VyZV9MSU5VWDY0IGNvZGUgKHNpbmNlIHdlIGRvbid0IGNoZWNrCisJICAgKiB0aGUgdHlwZSBpbiB0aGF0IHJvdXRpbmUpLgorCSAgICovCisKKwkgIC8qIHRoZXJlIGFyZSAxMyA2NGJpdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKworCSAgaWYgKHBmciA8IGVuZF9wZnIpCisJICAgIHsKKwkgICAgICBkb3VibGUgdGVtcCA9IHBmci0+ZDsKKwkgICAgICBwZnItPmYgPSAoZmxvYXQpIHRlbXA7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIHBmcisrOworCSAgICB9CisJICBlbHNlCisJICAgIGF2YWx1ZVtpXSA9IHBzdDsKKwkgIHBzdCsrOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgIC8qIE9uIHRoZSBvdXRnb2luZyBzdGFjayBhbGwgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIDggKi8KKwkgIC8qIHRoZXJlIGFyZSAxMyA2NGJpdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKworCSAgaWYgKHBmciA8IGVuZF9wZnIpCisJICAgIHsKKwkgICAgICBhdmFsdWVbaV0gPSBwZnI7CisJICAgICAgcGZyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYXZhbHVlW2ldID0gcHN0OworCSAgcHN0Kys7CisJICBicmVhazsKKworI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCisJY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgaWYgKHBmciArIDEgPCBlbmRfcGZyKQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIHBmciArPSAyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAocGZyIDwgZW5kX3BmcikKKwkJeworCQkgIC8qIFBhc3NlZCBwYXJ0bHkgaW4gZjEzIGFuZCBwYXJ0bHkgb24gdGhlIHN0YWNrLgorCQkgICAgIE1vdmUgaXQgYWxsIHRvIHRoZSBzdGFjay4gICovCisJCSAgKnBzdCA9ICoodW5zaWduZWQgbG9uZyAqKSBwZnI7CisJCSAgcGZyKys7CisJCX0KKwkgICAgICBhdmFsdWVbaV0gPSBwc3Q7CisJICAgIH0KKwkgIHBzdCArPSAyOworCSAgYnJlYWs7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJICBGRklfQVNTRVJUICgwKTsKKwl9CisKKyAgICAgIGkrKzsKKyAgICB9CisKKworICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCBydmFsdWUsIGF2YWx1ZSwgY2xvc3VyZS0+dXNlcl9kYXRhKTsKKworICAvKiBUZWxsIGZmaV9jbG9zdXJlX0xJTlVYNjQgaG93IHRvIHBlcmZvcm0gcmV0dXJuIHR5cGUgcHJvbW90aW9ucy4gICovCisgIHJldHVybiBjaWYtPnJ0eXBlLT50eXBlOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwM2RhYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMKQEAgLTAsMCArMSwxMzU5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZmZpX2Rhcndpbi5jCisKKyAgIENvcHlyaWdodCAoQykgMTk5OCBHZW9mZnJleSBLZWF0aW5nCisgICBDb3B5cmlnaHQgKEMpIDIwMDEgSm9obiBIb3Jua3Zpc3QKKyAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgRkZJIHN1cHBvcnQgZm9yIERhcndpbiBhbmQgQUlYLgorICAgCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2V4dGVybiB2b2lkIGZmaV9jbG9zdXJlX0FTTSAodm9pZCk7CisKK2VudW0geworICAvKiBUaGUgYXNzZW1ibHkgZGVwZW5kcyBvbiB0aGVzZSBleGFjdCBmbGFncy4gIAorICAgICBGb3IgRGFyd2luNjQgKHdoZW4gRkxBR19SRVRVUk5TX1NUUlVDVCBpcyBzZXQpOgorICAgICAgIEZMQUdfUkVUVVJOU19GUCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RydWN0dXJlIGVtYmVkcyBGUCBkYXRhLgorICAgICAgIEZMQUdfUkVUVVJOU18xMjhCSVRTIHNpZ25hbHMgYSBzcGVjaWFsIHN0cnVjdCBzaXplIHRoYXQgaXMgbm90CisgICAgICAgZXhwYW5kZWQgZm9yIGZsb2F0IGNvbnRlbnQuICAqLworICBGTEFHX1JFVFVSTlNfMTI4QklUUwk9IDEgPDwgKDMxLTMxKSwgLyogVGhlc2UgZ28gaW4gY3I3ICAqLworICBGTEFHX1JFVFVSTlNfTk9USElORwk9IDEgPDwgKDMxLTMwKSwKKyAgRkxBR19SRVRVUk5TX0ZQCT0gMSA8PCAoMzEtMjkpLAorICBGTEFHX1JFVFVSTlNfNjRCSVRTCT0gMSA8PCAoMzEtMjgpLAorCisgIEZMQUdfUkVUVVJOU19TVFJVQ1QJPSAxIDw8ICgzMS0yNyksIC8qIFRoaXMgZ29lcyBpbiBjcjYgICovCisKKyAgRkxBR19BUkdfTkVFRFNfQ09QWSAgID0gMSA8PCAoMzEtIDcpLAorICBGTEFHX0ZQX0FSR1VNRU5UUyAgICAgPSAxIDw8ICgzMS0gNiksIC8qIGNyMS5lcTsgc3BlY2lmaWVkIGJ5IEFCSSAgKi8KKyAgRkxBR180X0dQUl9BUkdVTUVOVFMgID0gMSA8PCAoMzEtIDUpLAorICBGTEFHX1JFVFZBTF9SRUZFUkVOQ0UgPSAxIDw8ICgzMS0gNCkKK307CisKKy8qIEFib3V0IHRoZSBEQVJXSU4gQUJJLiAgKi8KK2VudW0geworICBOVU1fR1BSX0FSR19SRUdJU1RFUlMgPSA4LAorICBOVU1fRlBSX0FSR19SRUdJU1RFUlMgPSAxMywKKyAgTElOS0FHRV9BUkVBX0dQUlMgPSA2Cit9OworCitlbnVtIHsgQVNNX05FRURTX1JFR0lTVEVSUyA9IDQgfTsgLyogcjI4LXIzMSAqLworCisvKiBmZmlfcHJlcF9hcmdzIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibHkgcm91dGluZSBvbmNlIHN0YWNrIHNwYWNlCisgICBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cy4KKyAgIAorICAgbTMyL202NAorCisgICBUaGUgc3RhY2sgbGF5b3V0IHdlIHdhbnQgbG9va3MgbGlrZSB0aGlzOgorCisgICB8ICAgUmV0dXJuIGFkZHJlc3MgZnJvbSBmZmlfY2FsbF9EQVJXSU4gICAgICB8CWhpZ2hlciBhZGRyZXNzZXMKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgIHwgICBQcmV2aW91cyBiYWNrY2hhaW4gcG9pbnRlcgk0LzgJfAlzdGFjayBwb2ludGVyIGhlcmUKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8KyA8PDwJb24gZW50cnkgdG8KKyAgIHwgICBBU01fTkVFRFNfUkVHSVNURVJTPXIyOC1yMzEgICA0Kig0LzgpCXwgfAlmZmlfY2FsbF9EQVJXSU4KKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFdoZW4gd2UgaGF2ZSBhbnkgRlAgYWN0aXZpdHkuLi4gdGhlCXwgfAorICAgfCAgIEZQUnMgb2NjdXB5IE5VTV9GUFJfQVJHX1JFR0lTVEVSUyBzbG90cwl8IHwKKyAgIHwgICBoZXJlIGZwMTMgLi4gZnAxIGZyb20gaGlnaCB0byBsb3cgYWRkci4JfCB8CisgICB+CQkJCQkJfiB+CisgICB8ICAgUGFyYW1ldGVycyAgICAgIChhdCBsZWFzdCA4KjQvOD0zMi82NCkJfCB8IE5VTV9HUFJfQVJHX1JFR0lTVEVSUworICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgVE9DPVIyIChBSVgpIFJlc2VydmVkIChEYXJ3aW4pICAgNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CXN0YWNrCXwKKyAgIHwgICBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgMio0LzgJfCB8CWdyb3dzCXwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlkb3duCVYKKyAgIHwgICBTcGFjZSBmb3IgY2FsbGVlJ3MgTFIJCTQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAlsb3dlciBhZGRyZXNzZXMKKyAgIHwgICBTYXZlZCBDUiBbbG93IHdvcmQgZm9yIG02NF0gICAgICA0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgICAgIHN0YWNrIHBvaW50ZXIgaGVyZQorICAgfCAgIEN1cnJlbnQgYmFja2NoYWluIHBvaW50ZXIJNC84CXwtLwlkdXJpbmcKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICA8PDwJZmZpX2NhbGxfREFSV0lOCisKKyAgICovCisKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCitzdGF0aWMgdm9pZAorZGFyd2luNjRfcGFzc19zdHJ1Y3RfYnlfdmFsdWUgCisgIChmZmlfdHlwZSAqLCBjaGFyICosIHVuc2lnbmVkLCB1bnNpZ25lZCAqLCBkb3VibGUgKiosIHVuc2lnbmVkIGxvbmcgKiopOworI2VuZGlmCisKKy8qIFRoaXMgZGVwZW5kcyBvbiBHUFJfU0laRSA9IHNpemVvZiAodW5zaWduZWQgbG9uZykgKi8KKwordm9pZAorZmZpX3ByZXBfYXJncyAoZXh0ZW5kZWRfY2lmICplY2lmLCB1bnNpZ25lZCBsb25nICpjb25zdCBzdGFjaykKK3sKKyAgY29uc3QgdW5zaWduZWQgYnl0ZXMgPSBlY2lmLT5jaWYtPmJ5dGVzOworICBjb25zdCB1bnNpZ25lZCBmbGFncyA9IGVjaWYtPmNpZi0+ZmxhZ3M7CisgIGNvbnN0IHVuc2lnbmVkIG5hcmdzID0gZWNpZi0+Y2lmLT5uYXJnczsKKyNpZiAhZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KSAKKyAgY29uc3QgZmZpX2FiaSBhYmkgPSBlY2lmLT5jaWYtPmFiaTsKKyNlbmRpZgorCisgIC8qICdzdGFja3RvcCcgcG9pbnRzIGF0IHRoZSBwcmV2aW91cyBiYWNrY2hhaW4gcG9pbnRlci4gICovCisgIHVuc2lnbmVkIGxvbmcgKmNvbnN0IHN0YWNrdG9wID0gc3RhY2sgKyAoYnl0ZXMgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisgIC8qICdmcHJfYmFzZScgcG9pbnRzIGF0IHRoZSBzcGFjZSBmb3IgZnByMSwgYW5kIGdyb3dzIHVwd2FyZHMgYXMKKyAgICAgd2UgdXNlIEZQUiByZWdpc3RlcnMuICAqLworICBkb3VibGUgKmZwcl9iYXNlID0gKGRvdWJsZSAqKSAoc3RhY2t0b3AgLSBBU01fTkVFRFNfUkVHSVNURVJTKSAtIE5VTV9GUFJfQVJHX1JFR0lTVEVSUzsKKyAgaW50IGdwX2NvdW50ID0gMCwgZnBhcmdfY291bnQgPSAwOworCisgIC8qICduZXh0X2FyZycgZ3Jvd3MgdXAgYXMgd2UgcHV0IHBhcmFtZXRlcnMgaW4gaXQuICAqLworICB1bnNpZ25lZCBsb25nICpuZXh0X2FyZyA9IHN0YWNrICsgTElOS0FHRV9BUkVBX0dQUlM7IC8qIDYgcmVzZXJ2ZWQgcG9zaXRpb25zLiAgKi8KKworICBpbnQgaTsKKyAgZG91YmxlIGRvdWJsZV90bXA7CisgIHZvaWQgKipwX2FyZ3YgPSBlY2lmLT5hdmFsdWU7CisgIHVuc2lnbmVkIGxvbmcgZ3BydmFsdWU7CisgIGZmaV90eXBlKiogcHRyID0gZWNpZi0+Y2lmLT5hcmdfdHlwZXM7CisjaWYgIWRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkgCisgIGNoYXIgKmRlc3RfY3B5OworI2VuZGlmCisgIHVuc2lnbmVkIHNpemVfYWwgPSAwOworCisgIC8qIENoZWNrIHRoYXQgZXZlcnl0aGluZyBzdGFydHMgYWxpZ25lZCBwcm9wZXJseS4gICovCisgIEZGSV9BU1NFUlQoKCh1bnNpZ25lZCkgKGNoYXIgKikgc3RhY2sgJiAweEYpID09IDApOworICBGRklfQVNTRVJUKCgodW5zaWduZWQpIChjaGFyICopIHN0YWNrdG9wICYgMHhGKSA9PSAwKTsKKyAgRkZJX0FTU0VSVCgoYnl0ZXMgJiAweEYpID09IDApOworCisgIC8qIERlYWwgd2l0aCByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIGFjdHVhbGx5IHBhc3MtYnktcmVmZXJlbmNlLgorICAgICBSdWxlOgorICAgICBSZXR1cm4gdmFsdWVzIGFyZSByZWZlcmVuY2VkIGJ5IHIzLCBzbyByNCBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyLiAgKi8KKworICBpZiAoZmxhZ3MgJiBGTEFHX1JFVFZBTF9SRUZFUkVOQ0UpCisgICAgKm5leHRfYXJnKysgPSAodW5zaWduZWQgbG9uZykgKGNoYXIgKikgZWNpZi0+cnZhbHVlOworCisgIC8qIE5vdyBmb3IgdGhlIGFyZ3VtZW50cy4gICovCisgIGZvciAoaSA9IG5hcmdzOyBpID4gMDsgaS0tLCBwdHIrKywgcF9hcmd2KyspCisgICAgeworICAgICAgc3dpdGNoICgoKnB0ciktPnR5cGUpCisJeworCS8qIElmIGEgZmxvYXRpbmctcG9pbnQgcGFyYW1ldGVyIGFwcGVhcnMgYmVmb3JlIGFsbCBvZiB0aGUgZ2VuZXJhbC0KKwkgICBwdXJwb3NlIHJlZ2lzdGVycyBhcmUgZmlsbGVkLCB0aGUgY29ycmVzcG9uZGluZyBHUFJzIHRoYXQgbWF0Y2gKKwkgICB0aGUgc2l6ZSBvZiB0aGUgZmxvYXRpbmctcG9pbnQgcGFyYW1ldGVyIGFyZSBza2lwcGVkLiAgKi8KKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgZG91YmxlX3RtcCA9ICooZmxvYXQgKikgKnBfYXJndjsKKwkgIGlmIChmcGFyZ19jb3VudCA8IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgKmZwcl9iYXNlKysgPSBkb3VibGVfdG1wOworI2lmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU4pCisJICAqKGZsb2F0ICopbmV4dF9hcmcgPSAqKGZsb2F0ICopICpwX2FyZ3Y7CisjZWxzZQorCSAgKihkb3VibGUgKiluZXh0X2FyZyA9IGRvdWJsZV90bXA7CisjZW5kaWYKKwkgIG5leHRfYXJnKys7CisJICBncF9jb3VudCsrOworCSAgZnBhcmdfY291bnQrKzsKKwkgIEZGSV9BU1NFUlQoZmxhZ3MgJiBGTEFHX0ZQX0FSR1VNRU5UUyk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgZG91YmxlX3RtcCA9ICooZG91YmxlICopICpwX2FyZ3Y7CisJICBpZiAoZnBhcmdfY291bnQgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICpmcHJfYmFzZSsrID0gZG91YmxlX3RtcDsKKwkgICooZG91YmxlICopbmV4dF9hcmcgPSBkb3VibGVfdG1wOworI2lmZGVmIFBPV0VSUEM2NAorCSAgbmV4dF9hcmcrKzsKKwkgIGdwX2NvdW50Kys7CisjZWxzZQorCSAgbmV4dF9hcmcgKz0gMjsKKwkgIGdwX2NvdW50ICs9IDI7CisjZW5kaWYKKwkgIGZwYXJnX2NvdW50Kys7CisJICBGRklfQVNTRVJUKGZsYWdzICYgRkxBR19GUF9BUkdVTUVOVFMpOworCSAgYnJlYWs7CisKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCisJY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorIyAgaWYgZGVmaW5lZChQT1dFUlBDNjQpICYmICFkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisJICAvKiA/Pz8gVGhpcyB3aWxsIGV4Y2VlZCB0aGUgcmVncyBjb3VudCB3aGVuIHRoZSB2YWx1ZSBzdGFydHMgYXQgZnAxMworCSAgICAgYW5kIGl0IHdpbGwgbm90IHB1dCB0aGUgZXh0cmEgYml0IG9uIHRoZSBzdGFjay4gICovCisJICBpZiAoZnBhcmdfY291bnQgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICoobG9uZyBkb3VibGUgKikgZnByX2Jhc2UrKyA9ICoobG9uZyBkb3VibGUgKikgKnBfYXJndjsKKwkgIGVsc2UKKwkgICAgKihsb25nIGRvdWJsZSAqKSBuZXh0X2FyZyA9ICoobG9uZyBkb3VibGUgKikgKnBfYXJndjsKKwkgIG5leHRfYXJnICs9IDI7CisJICBmcGFyZ19jb3VudCArPSAyOworIyAgZWxzZQorCSAgZG91YmxlX3RtcCA9ICgoZG91YmxlICopICpwX2FyZ3YpWzBdOworCSAgaWYgKGZwYXJnX2NvdW50IDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCSAgICAqZnByX2Jhc2UrKyA9IGRvdWJsZV90bXA7CisJICAqKGRvdWJsZSAqKSBuZXh0X2FyZyA9IGRvdWJsZV90bXA7CisjICAgIGlmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKKwkgIG5leHRfYXJnKys7CisJICBncF9jb3VudCsrOworIyAgICBlbHNlCisJICBuZXh0X2FyZyArPSAyOworCSAgZ3BfY291bnQgKz0gMjsKKyMgICAgZW5kaWYKKwkgIGZwYXJnX2NvdW50Kys7CisJICBkb3VibGVfdG1wID0gKChkb3VibGUgKikgKnBfYXJndilbMV07CisJICBpZiAoZnBhcmdfY291bnQgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICpmcHJfYmFzZSsrID0gZG91YmxlX3RtcDsKKwkgICooZG91YmxlICopIG5leHRfYXJnID0gZG91YmxlX3RtcDsKKyMgICAgaWYgZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorCSAgbmV4dF9hcmcrKzsKKwkgIGdwX2NvdW50Kys7CisjICAgIGVsc2UKKwkgIG5leHRfYXJnICs9IDI7CisJICBncF9jb3VudCArPSAyOworIyAgICBlbmRpZgorCSAgZnBhcmdfY291bnQrKzsKKyMgIGVuZGlmCisJICBGRklfQVNTRVJUKGZsYWdzICYgRkxBR19GUF9BUkdVTUVOVFMpOworCSAgYnJlYWs7CisjZW5kaWYKKwljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKwljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyNpZmRlZiBQT1dFUlBDNjQKKwkgIGdwcnZhbHVlID0gKihsb25nIGxvbmcgKikgKnBfYXJndjsKKwkgIGdvdG8gcHV0Z3ByOworI2Vsc2UKKwkgICoobG9uZyBsb25nICopIG5leHRfYXJnID0gKihsb25nIGxvbmcgKikgKnBfYXJndjsKKwkgIG5leHRfYXJnICs9IDI7CisJICBncF9jb3VudCArPSAyOworI2VuZGlmCisJICBicmVhazsKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJICBncHJ2YWx1ZSA9ICoodW5zaWduZWQgbG9uZyAqKSAqcF9hcmd2OworCSAgZ290byBwdXRncHI7CisJY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgIGdwcnZhbHVlID0gKih1bnNpZ25lZCBjaGFyICopICpwX2FyZ3Y7CisJICBnb3RvIHB1dGdwcjsKKwljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCSAgZ3BydmFsdWUgPSAqKHNpZ25lZCBjaGFyICopICpwX2FyZ3Y7CisJICBnb3RvIHB1dGdwcjsKKwljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkgIGdwcnZhbHVlID0gKih1bnNpZ25lZCBzaG9ydCAqKSAqcF9hcmd2OworCSAgZ290byBwdXRncHI7CisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICBncHJ2YWx1ZSA9ICooc2lnbmVkIHNob3J0ICopICpwX2FyZ3Y7CisJICBnb3RvIHB1dGdwcjsKKworCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgc2l6ZV9hbCA9ICgqcHRyKS0+c2l6ZTsKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisJICBuZXh0X2FyZyA9ICh1bnNpZ25lZCBsb25nICopQUxJR04oKGNoYXIgKiluZXh0X2FyZywgKCpwdHIpLT5hbGlnbm1lbnQpOworCSAgZGFyd2luNjRfcGFzc19zdHJ1Y3RfYnlfdmFsdWUgKCpwdHIsIChjaGFyICopICpwX2FyZ3YsIAorCQkJCQkgKHVuc2lnbmVkKSBzaXplX2FsLAorCQkJCQkgKHVuc2lnbmVkIGludCAqKSAmZnBhcmdfY291bnQsCisJCQkJCSAmZnByX2Jhc2UsICZuZXh0X2FyZyk7CisjZWxzZQorCSAgZGVzdF9jcHkgPSAoY2hhciAqKSBuZXh0X2FyZzsKKworCSAgLyogSWYgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgc3RydWN0IGlzIGEgZG91YmxlLCB0aGVuIGluY2x1ZGUgZW5vdWdoCisJICAgICBwYWRkaW5nIGluIHRoZSBzdHJ1Y3Qgc2l6ZSB0byBhbGlnbiBpdCB0byBkb3VibGUtd29yZC4gICovCisJICBpZiAoKCpwdHIpLT5lbGVtZW50c1swXS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisJICAgIHNpemVfYWwgPSBBTElHTigoKnB0ciktPnNpemUsIDgpOworCisjICBpZiBkZWZpbmVkKFBPV0VSUEM2NCkgCisJICBGRklfQVNTRVJUIChhYmkgIT0gRkZJX0RBUldJTik7CisJICBtZW1jcHkgKChjaGFyICopIGRlc3RfY3B5LCAoY2hhciAqKSAqcF9hcmd2LCBzaXplX2FsKTsKKwkgIG5leHRfYXJnICs9IChzaXplX2FsICsgNykgLyA4OworIyAgZWxzZQorCSAgLyogU3RydWN0dXJlcyB0aGF0IG1hdGNoIHRoZSBiYXNpYyBtb2RlcyAoUUkgMSBieXRlLCBISSAyIGJ5dGVzLAorCSAgICAgU0kgNCBieXRlcykgYXJlIGFsaWduZWQgYXMgaWYgdGhleSB3ZXJlIHRob3NlIG1vZGVzLgorCSAgICAgU3RydWN0dXJlcyB3aXRoIDMgYnl0ZSBpbiBzaXplIGFyZSBwYWRkZWQgdXB3YXJkcy4gICovCisJICBpZiAoc2l6ZV9hbCA8IDMgJiYgYWJpID09IEZGSV9EQVJXSU4pCisJICAgIGRlc3RfY3B5ICs9IDQgLSBzaXplX2FsOworCisJICBtZW1jcHkoKGNoYXIgKikgZGVzdF9jcHksIChjaGFyICopICpwX2FyZ3YsIHNpemVfYWwpOworCSAgbmV4dF9hcmcgKz0gKHNpemVfYWwgKyAzKSAvIDQ7CisjICBlbmRpZgorI2VuZGlmCisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfSU5UOgorCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgorCSAgZ3BydmFsdWUgPSAqKHNpZ25lZCBpbnQgKikgKnBfYXJndjsKKwkgIGdvdG8gcHV0Z3ByOworCisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICBncHJ2YWx1ZSA9ICoodW5zaWduZWQgaW50ICopICpwX2FyZ3Y7CisJcHV0Z3ByOgorCSAgKm5leHRfYXJnKysgPSBncHJ2YWx1ZTsKKwkgIGdwX2NvdW50Kys7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBDaGVjayB0aGF0IHdlIGRpZG4ndCBvdmVycnVuIHRoZSBzdGFjay4uLiAgKi8KKyAgLy9GRklfQVNTRVJUKGdwcl9iYXNlIDw9IHN0YWNrdG9wIC0gQVNNX05FRURTX1JFR0lTVEVSUyk7CisgIC8vRkZJX0FTU0VSVCgodW5zaWduZWQgKilmcHJfYmFzZQorICAvLwkgICAgIDw9IHN0YWNrdG9wIC0gQVNNX05FRURTX1JFR0lTVEVSUyAtIE5VTV9HUFJfQVJHX1JFR0lTVEVSUyk7CisgIC8vRkZJX0FTU0VSVChmbGFncyAmIEZMQUdfNF9HUFJfQVJHVU1FTlRTIHx8IGludGFyZ19jb3VudCA8PSA0KTsKK30KKworI2lmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKKworLyogU2VlIGlmIHdlIGNhbiBwdXQgc29tZSBvZiB0aGUgc3RydWN0IGludG8gZnBycy4KKyAgIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIHN0cnVjdHVyZXMgb2Ygc2l6ZSAxNiBieXRlcywgc2luY2UgdGhlc2UgYXJlIG5vdAorICAgYnJva2VuIG91dCB0aGlzIHdheS4gICovCitzdGF0aWMgdm9pZAorZGFyd2luNjRfc2Nhbl9zdHJ1Y3RfZm9yX2Zsb2F0cyAoZmZpX3R5cGUgKnMsIHVuc2lnbmVkICpuZnByKQoreworICBpbnQgaTsKKworICBGRklfQVNTRVJUIChzLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKworICBmb3IgKGkgPSAwOyBzLT5lbGVtZW50c1tpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgZmZpX3R5cGUgKnAgPSBzLT5lbGVtZW50c1tpXTsKKyAgICAgIHN3aXRjaCAocC0+dHlwZSkKKwl7CisJICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgZGFyd2luNjRfc2Nhbl9zdHJ1Y3RfZm9yX2Zsb2F0cyAocCwgbmZwcik7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgICAoKm5mcHIpICs9IDI7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgICAoKm5mcHIpICs9IDE7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYnJlYWs7ICAgIAorCX0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2RhcndpbjY0X3N0cnVjdF9zaXplX2V4Y2VlZHNfZ3Byc19wIChmZmlfdHlwZSAqcywgY2hhciAqc3JjLCB1bnNpZ25lZCAqbmZwcikKK3sKKyAgdW5zaWduZWQgc3RydWN0X29mZnNldD0wLCBpOworCisgIGZvciAoaSA9IDA7IHMtPmVsZW1lbnRzW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBjaGFyICppdGVtX2Jhc2U7CisgICAgICBmZmlfdHlwZSAqcCA9IHMtPmVsZW1lbnRzW2ldOworICAgICAgLyogRmluZCB0aGUgc3RhcnQgb2YgdGhpcyBpdGVtICgwIGZvciB0aGUgZmlyc3Qgb25lKS4gICovCisgICAgICBpZiAoaSA+IDApCisgICAgICAgIHN0cnVjdF9vZmZzZXQgPSBBTElHTihzdHJ1Y3Rfb2Zmc2V0LCBwLT5hbGlnbm1lbnQpOworCisgICAgICBpdGVtX2Jhc2UgPSBzcmMgKyBzdHJ1Y3Rfb2Zmc2V0OworCisgICAgICBzd2l0Y2ggKHAtPnR5cGUpCisJeworCSAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAgIGlmIChkYXJ3aW42NF9zdHJ1Y3Rfc2l6ZV9leGNlZWRzX2dwcnNfcCAocCwgaXRlbV9iYXNlLCBuZnByKSkKKwkgICAgICByZXR1cm4gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICAgIGlmICgqbmZwciA+PSBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICAgcmV0dXJuIDE7CisJICAgICgqbmZwcikgKz0gMTsKKwkgICAgaXRlbV9iYXNlICs9IDg7CisJICAvKiBGQUxMIFRIUk9VR0ggKi8KKwkgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgICBpZiAoKm5mcHIgPj0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCSAgICAgIHJldHVybiAxOworCSAgICAoKm5mcHIpICs9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgICAgaWYgKCpuZnByID49IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgICByZXR1cm4gMTsKKwkgICAgKCpuZnByKSArPSAxOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIC8qIElmIHdlIHRyeSBhbmQgcGxhY2UgYW55IGl0ZW0sIHRoYXQgaXMgbm9uLWZsb2F0LCBvbmNlIHdlJ3ZlCisJICAgICAgIGV4Y2VlZGVkIHRoZSA4IEdQUiBtYXJrLCB0aGVuIHdlIGNhbid0IGZpdCB0aGUgc3RydWN0LiAgKi8KKwkgICAgaWYgKCh1bnNpZ25lZCBsb25nKWl0ZW1fYmFzZSA+PSA4KjgpIAorCSAgICAgIHJldHVybiAxOworCSAgICBicmVhazsgICAgCisJfQorICAgICAgLyogbm93IGNvdW50IHRoZSBzaXplIG9mIHdoYXQgd2UganVzdCB1c2VkLiAgKi8KKyAgICAgIHN0cnVjdF9vZmZzZXQgKz0gcC0+c2l6ZTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBDYW4gdGhpcyBzdHJ1Y3QgYmUgcmV0dXJuZWQgYnkgdmFsdWU/ICAqLworaW50IAorZGFyd2luNjRfc3RydWN0X3JldF9ieV92YWx1ZV9wIChmZmlfdHlwZSAqcykKK3sKKyAgdW5zaWduZWQgbmZwID0gMDsKKworICBGRklfQVNTRVJUIChzICYmIHMtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKTsKKyAgCisgIC8qIFRoZSBsYXJnZXN0IHN0cnVjdHVyZSB3ZSBjYW4gcmV0dXJuIGlzIDhsb25nICsgMTMgZG91Ymxlcy4gICovCisgIGlmIChzLT5zaXplID4gMTY4KQorICAgIHJldHVybiAwOworICAKKyAgLyogV2UgY2FuJ3QgcGFzcyBtb3JlIHRoYW4gMTMgZmxvYXRzLiAgKi8KKyAgZGFyd2luNjRfc2Nhbl9zdHJ1Y3RfZm9yX2Zsb2F0cyAocywgJm5mcCk7CisgIGlmIChuZnAgPiAxMykKKyAgICByZXR1cm4gMDsKKyAgCisgIC8qIElmIHRoZXJlIGFyZSBub3QgdG9vIG1hbnkgZmxvYXRzLCBhbmQgdGhlIHN0cnVjdCBpcworICAgICBzbWFsbCBlbm91Z2ggdG8gYWNjb21tb2RhdGUgaW4gdGhlIEdQUnMsIHRoZW4gaXQgbXVzdCBiZSBPSy4gICovCisgIGlmIChzLT5zaXplIDw9IDY0KQorICAgIHJldHVybiAxOworICAKKyAgLyogV2VsbCwgd2UgaGF2ZSB0byBsb29rIGhhcmRlci4gICovCisgIG5mcCA9IDA7CisgIGlmIChkYXJ3aW42NF9zdHJ1Y3Rfc2l6ZV9leGNlZWRzX2dwcnNfcCAocywgTlVMTCwgJm5mcCkpCisgICAgcmV0dXJuIDA7CisgIAorICByZXR1cm4gMTsKK30KKwordm9pZAorZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzIChmZmlfdHlwZSAqcywgY2hhciAqc3JjLCAKKwkJCSAgICAgdW5zaWduZWQgKm5mcHIsIGRvdWJsZSAqKmZwcnMpCit7CisgIGludCBpOworICBkb3VibGUgKmZwcl9iYXNlID0gKmZwcnM7CisgIHVuc2lnbmVkIHN0cnVjdF9vZmZzZXQgPSAwOworCisgIC8qIFdlIGRvbid0IGFzc3VtZSBhbnl0aGluZyBhYm91dCB0aGUgYWxpZ25tZW50IG9mIHRoZSBzb3VyY2UuICAqLworICBmb3IgKGkgPSAwOyBzLT5lbGVtZW50c1tpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgY2hhciAqaXRlbV9iYXNlOworICAgICAgZmZpX3R5cGUgKnAgPSBzLT5lbGVtZW50c1tpXTsKKyAgICAgIC8qIEZpbmQgdGhlIHN0YXJ0IG9mIHRoaXMgaXRlbSAoMCBmb3IgdGhlIGZpcnN0IG9uZSkuICAqLworICAgICAgaWYgKGkgPiAwKQorICAgICAgICBzdHJ1Y3Rfb2Zmc2V0ID0gQUxJR04oc3RydWN0X29mZnNldCwgcC0+YWxpZ25tZW50KTsKKyAgICAgIGl0ZW1fYmFzZSA9IHNyYyArIHN0cnVjdF9vZmZzZXQ7CisKKyAgICAgIHN3aXRjaCAocC0+dHlwZSkKKwl7CisJICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgZGFyd2luNjRfcGFzc19zdHJ1Y3RfZmxvYXRzIChwLCBpdGVtX2Jhc2UsIG5mcHIsCisJCQkJCSAgICZmcHJfYmFzZSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCSAgICBpZiAoKm5mcHIgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICAgKmZwcl9iYXNlKysgPSAqKGRvdWJsZSAqKWl0ZW1fYmFzZTsKKwkgICAgKCpuZnByKSArPSAxOworCSAgICBpdGVtX2Jhc2UgKz0gODsKKwkgIC8qIEZBTEwgVEhST1VHSCAqLworCSAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICAgIGlmICgqbmZwciA8IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgICAqZnByX2Jhc2UrKyA9ICooZG91YmxlICopaXRlbV9iYXNlOworCSAgICAoKm5mcHIpICs9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgICAgaWYgKCpuZnByIDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCSAgICAgICpmcHJfYmFzZSsrID0gKGRvdWJsZSkgKihmbG9hdCAqKWl0ZW1fYmFzZTsKKwkgICAgKCpuZnByKSArPSAxOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGJyZWFrOyAgICAKKwl9CisgICAgICAvKiBub3cgY291bnQgdGhlIHNpemUgb2Ygd2hhdCB3ZSBqdXN0IHVzZWQuICAqLworICAgICAgc3RydWN0X29mZnNldCArPSBwLT5zaXplOworICAgIH0KKyAgLyogVXBkYXRlIHRoZSBzY29yZXMuICAqLworICAqZnBycyA9IGZwcl9iYXNlOworfQorCisvKiBEYXJ3aW42NCBzcGVjaWFsIHJ1bGVzLgorICAgQnJlYWsgb3V0IGEgc3RydWN0IGludG8gcGFyYW1zIGFuZCBmbG9hdCByZWdpc3RlcnMuICAqLworc3RhdGljIHZvaWQKK2RhcndpbjY0X3Bhc3Nfc3RydWN0X2J5X3ZhbHVlIChmZmlfdHlwZSAqcywgY2hhciAqc3JjLCB1bnNpZ25lZCBzaXplLAorCQkJICAgICAgIHVuc2lnbmVkICpuZnByLCBkb3VibGUgKipmcHJzLCB1bnNpZ25lZCBsb25nICoqYXJnKQoreworICB1bnNpZ25lZCBsb25nICpuZXh0X2FyZyA9ICphcmc7CisgIGNoYXIgKmRlc3RfY3B5ID0gKGNoYXIgKiluZXh0X2FyZzsKKworICBGRklfQVNTRVJUIChzLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKworICBpZiAoIXNpemUpCisgICAgcmV0dXJuOworCisgIC8qIEZpcnN0Li4uIHNwZWNpYWwgY2FzZXMuICAqLworICBpZiAoc2l6ZSA8IDMKKyAgICAgIHx8IChzaXplID09IDQgCisJICAmJiBzLT5lbGVtZW50c1swXSAKKwkgICYmIHMtPmVsZW1lbnRzWzBdLT50eXBlICE9IEZGSV9UWVBFX0ZMT0FUKSkKKyAgICB7CisgICAgICAvKiBNdXN0IGJlIGF0IGxlYXN0IG9uZSBHUFIsIHBhZGRpbmcgaXMgdW5zcGVjaWZpZWQgaW4gdmFsdWUsIAorCSBsZXQncyBtYWtlIGl0IHplcm8uICAqLworICAgICAgKm5leHRfYXJnID0gMFVMOyAKKyAgICAgIGRlc3RfY3B5ICs9IDggLSBzaXplOworICAgICAgbWVtY3B5ICgoY2hhciAqKSBkZXN0X2NweSwgc3JjLCBzaXplKTsKKyAgICAgIG5leHRfYXJnKys7CisgICAgfQorICBlbHNlIGlmIChzaXplID09IDE2KQorICAgIHsKKyAgICAgIG1lbWNweSAoKGNoYXIgKikgZGVzdF9jcHksIHNyYywgc2l6ZSk7CisgICAgICBuZXh0X2FyZyArPSAyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIG5vdyB0aGUgZ2VuZXJhbCBjYXNlLCB3ZSBjb25zaWRlciBlbWJlZGRlZCBmbG9hdHMuICAqLworICAgICAgbWVtY3B5ICgoY2hhciAqKSBkZXN0X2NweSwgc3JjLCBzaXplKTsKKyAgICAgIGRhcndpbjY0X3Bhc3Nfc3RydWN0X2Zsb2F0cyAocywgc3JjLCBuZnByLCBmcHJzKTsKKyAgICAgIG5leHRfYXJnICs9IChzaXplKzcpLzg7CisgICAgfQorICAgIAorICAqYXJnID0gbmV4dF9hcmc7Cit9CisKK2RvdWJsZSAqCitkYXJ3aW42NF9zdHJ1Y3RfZmxvYXRzX3RvX21lbSAoZmZpX3R5cGUgKnMsIGNoYXIgKmRlc3QsIGRvdWJsZSAqZnBycywgdW5zaWduZWQgKm5mKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgc3RydWN0X29mZnNldCA9IDA7CisKKyAgLyogV2UgZG9uJ3QgYXNzdW1lIGFueXRoaW5nIGFib3V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIHNvdXJjZS4gICovCisgIGZvciAoaSA9IDA7IHMtPmVsZW1lbnRzW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBjaGFyICppdGVtX2Jhc2U7CisgICAgICBmZmlfdHlwZSAqcCA9IHMtPmVsZW1lbnRzW2ldOworICAgICAgLyogRmluZCB0aGUgc3RhcnQgb2YgdGhpcyBpdGVtICgwIGZvciB0aGUgZmlyc3Qgb25lKS4gICovCisgICAgICBpZiAoaSA+IDApCisgICAgICAgIHN0cnVjdF9vZmZzZXQgPSBBTElHTihzdHJ1Y3Rfb2Zmc2V0LCBwLT5hbGlnbm1lbnQpOworICAgICAgaXRlbV9iYXNlID0gZGVzdCArIHN0cnVjdF9vZmZzZXQ7CisKKyAgICAgIHN3aXRjaCAocC0+dHlwZSkKKwl7CisJICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgZnBycyA9IGRhcndpbjY0X3N0cnVjdF9mbG9hdHNfdG9fbWVtIChwLCBpdGVtX2Jhc2UsIGZwcnMsIG5mKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICAgIGlmICgqbmYgPCBOVU1fRlBSX0FSR19SRUdJU1RFUlMpCisJICAgICAgeworCQkqKGRvdWJsZSAqKWl0ZW1fYmFzZSA9ICpmcHJzKysgOworCQkoKm5mKSArPSAxOworCSAgICAgIH0KKwkgICAgaXRlbV9iYXNlICs9IDg7CisJICAvKiBGQUxMIFRIUk9VR0ggKi8KKwkgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgICBpZiAoKm5mIDwgTlVNX0ZQUl9BUkdfUkVHSVNURVJTKQorCSAgICAgIHsKKwkJKihkb3VibGUgKilpdGVtX2Jhc2UgPSAqZnBycysrIDsKKwkJKCpuZikgKz0gMTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgICAgaWYgKCpuZiA8IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkgICAgICB7CisJCSooZmxvYXQgKilpdGVtX2Jhc2UgPSAoZmxvYXQpICpmcHJzKysgOworCQkoKm5mKSArPSAxOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBicmVhazsgICAgCisJfQorICAgICAgLyogbm93IGNvdW50IHRoZSBzaXplIG9mIHdoYXQgd2UganVzdCB1c2VkLiAgKi8KKyAgICAgIHN0cnVjdF9vZmZzZXQgKz0gcC0+c2l6ZTsKKyAgICB9CisgIHJldHVybiBmcHJzOworfQorCisjZW5kaWYKKworLyogQWRqdXN0IHRoZSBzaXplIG9mIFMgdG8gYmUgY29ycmVjdCBmb3IgRGFyd2luLgorICAgT24gRGFyd2luIG0zMiwgdGhlIGZpcnN0IGZpZWxkIG9mIGEgc3RydWN0dXJlIGhhcyBuYXR1cmFsIGFsaWdubWVudC4gIAorICAgT24gRGFyd2luIG02NCwgYWxsIGZpZWxkcyBoYXZlIG5hdHVyYWwgYWxpZ25tZW50LiAgKi8KKworc3RhdGljIHZvaWQKK2Rhcndpbl9hZGp1c3RfYWdncmVnYXRlX3NpemVzIChmZmlfdHlwZSAqcykKK3sKKyAgaW50IGk7CisKKyAgaWYgKHMtPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHJldHVybjsKKworICBzLT5zaXplID0gMDsKKyAgZm9yIChpID0gMDsgcy0+ZWxlbWVudHNbaV0gIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGZmaV90eXBlICpwOworICAgICAgaW50IGFsaWduOworICAgICAgCisgICAgICBwID0gcy0+ZWxlbWVudHNbaV07CisgICAgICBpZiAocC0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisJZGFyd2luX2FkanVzdF9hZ2dyZWdhdGVfc2l6ZXMgKHApOworI2lmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKKyAgICAgIC8qIE5hdHVyYWwgYWxpZ25tZW50IGZvciBhbGwgaXRlbXMuICAqLworICAgICAgYWxpZ24gPSBwLT5hbGlnbm1lbnQ7CisjZWxzZQorICAgICAgLyogTmF0cnVhbCBhbGlnbm1lbnQgZm9yIHRoZSBmaXJzdCBpdGVtLi4uICovCisgICAgICBpZiAoaSA9PSAwKQorCWFsaWduID0gcC0+YWxpZ25tZW50OworICAgICAgZWxzZSBpZiAocC0+YWxpZ25tZW50ID09IDE2IHx8IHAtPmFsaWdubWVudCA8IDQpCisJLyogLi4gc3Vic2VxdWVudCBpdGVtcyB3aXRoIHZlY3RvciBvciBhbGlnbiA8IDQgaGF2ZSBuYXR1cmFsIGFsaWduLiAgKi8KKwlhbGlnbiA9IHAtPmFsaWdubWVudDsKKyAgICAgIGVsc2UKKwkvKiAuLiBvciBhbGlnbiBpcyA0LiAgKi8KKwlhbGlnbiA9IDQ7CisjZW5kaWYKKyAgICAgIC8qIFBhZCwgaWYgbmVjZXNzYXJ5LCBiZWZvcmUgYWRkaW5nIHRoZSBjdXJyZW50IGl0ZW0uICAqLworICAgICAgcy0+c2l6ZSA9IEFMSUdOKHMtPnNpemUsIGFsaWduKSArIHAtPnNpemU7CisgICAgfQorICAKKyAgcy0+c2l6ZSA9IEFMSUdOKHMtPnNpemUsIHMtPmFsaWdubWVudCk7CisgIAorICAvKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IG9uIG02NCwgYnV0IGhhcm1sZXNzLiAgKi8KKyAgaWYgKHMtPmVsZW1lbnRzWzBdLT50eXBlID09IEZGSV9UWVBFX1VJTlQ2NAorICAgICAgfHwgcy0+ZWxlbWVudHNbMF0tPnR5cGUgPT0gRkZJX1RZUEVfU0lOVDY0CisgICAgICB8fCBzLT5lbGVtZW50c1swXS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUKKyAgICAgIHx8IHMtPmVsZW1lbnRzWzBdLT5hbGlnbm1lbnQgPT0gOCkKKyAgICBzLT5hbGlnbm1lbnQgPSBzLT5hbGlnbm1lbnQgPiA4ID8gcy0+YWxpZ25tZW50IDogODsKKyAgLyogRG8gbm90IGFkZCBhZGRpdGlvbmFsIHRhaWwgcGFkZGluZy4gICovCit9CisKKy8qIEFkanVzdCB0aGUgc2l6ZSBvZiBTIHRvIGJlIGNvcnJlY3QgZm9yIEFJWC4KKyAgIFdvcmQtYWxpZ24gZG91YmxlIHVubGVzcyBpdCBpcyB0aGUgZmlyc3QgbWVtYmVyIG9mIGEgc3RydWN0dXJlLiAgKi8KKworc3RhdGljIHZvaWQKK2FpeF9hZGp1c3RfYWdncmVnYXRlX3NpemVzIChmZmlfdHlwZSAqcykKK3sKKyAgaW50IGk7CisKKyAgaWYgKHMtPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHJldHVybjsKKworICBzLT5zaXplID0gMDsKKyAgZm9yIChpID0gMDsgcy0+ZWxlbWVudHNbaV0gIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGZmaV90eXBlICpwOworICAgICAgaW50IGFsaWduOworICAgICAgCisgICAgICBwID0gcy0+ZWxlbWVudHNbaV07CisgICAgICBhaXhfYWRqdXN0X2FnZ3JlZ2F0ZV9zaXplcyAocCk7CisgICAgICBhbGlnbiA9IHAtPmFsaWdubWVudDsKKyAgICAgIGlmIChpICE9IDAgJiYgcC0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisJYWxpZ24gPSA0OworICAgICAgcy0+c2l6ZSA9IEFMSUdOKHMtPnNpemUsIGFsaWduKSArIHAtPnNpemU7CisgICAgfQorICAKKyAgcy0+c2l6ZSA9IEFMSUdOKHMtPnNpemUsIHMtPmFsaWdubWVudCk7CisgIAorICBpZiAocy0+ZWxlbWVudHNbMF0tPnR5cGUgPT0gRkZJX1RZUEVfVUlOVDY0CisgICAgICB8fCBzLT5lbGVtZW50c1swXS0+dHlwZSA9PSBGRklfVFlQRV9TSU5UNjQKKyAgICAgIHx8IHMtPmVsZW1lbnRzWzBdLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRQorICAgICAgfHwgcy0+ZWxlbWVudHNbMF0tPmFsaWdubWVudCA9PSA4KQorICAgIHMtPmFsaWdubWVudCA9IHMtPmFsaWdubWVudCA+IDggPyBzLT5hbGlnbm1lbnQgOiA4OworICAvKiBEbyBub3QgYWRkIGFkZGl0aW9uYWwgdGFpbCBwYWRkaW5nLiAgKi8KK30KKworLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZy4gICovCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jaWZfbWFjaGRlcCAoZmZpX2NpZiAqY2lmKQoreworICAvKiBBbGwgdGhpcyBpcyBmb3IgdGhlIERBUldJTiBBQkkuICAqLworICB1bnNpZ25lZCBpOworICBmZmlfdHlwZSAqKnB0cjsKKyAgdW5zaWduZWQgYnl0ZXM7CisgIHVuc2lnbmVkIGZwYXJnX2NvdW50ID0gMCwgaW50YXJnX2NvdW50ID0gMDsKKyAgdW5zaWduZWQgZmxhZ3MgPSAwOworICB1bnNpZ25lZCBzaXplX2FsID0gMDsKKworICAvKiBBbGwgdGhlIG1hY2hpbmUtaW5kZXBlbmRlbnQgY2FsY3VsYXRpb24gb2YgY2lmLT5ieXRlcyB3aWxsIGJlIHdyb25nLgorICAgICBBbGwgdGhlIGNhbGN1bGF0aW9uIG9mIHN0cnVjdHVyZSBzaXplcyB3aWxsIGFsc28gYmUgd3JvbmcuCisgICAgIFJlZG8gdGhlIGNhbGN1bGF0aW9uIGZvciBEQVJXSU4uICAqLworCisgIGlmIChjaWYtPmFiaSA9PSBGRklfREFSV0lOKQorICAgIHsKKyAgICAgIGRhcndpbl9hZGp1c3RfYWdncmVnYXRlX3NpemVzIChjaWYtPnJ0eXBlKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjaWYtPm5hcmdzOyBpKyspCisJZGFyd2luX2FkanVzdF9hZ2dyZWdhdGVfc2l6ZXMgKGNpZi0+YXJnX3R5cGVzW2ldKTsKKyAgICB9CisKKyAgaWYgKGNpZi0+YWJpID09IEZGSV9BSVgpCisgICAgeworICAgICAgYWl4X2FkanVzdF9hZ2dyZWdhdGVfc2l6ZXMgKGNpZi0+cnR5cGUpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNpZi0+bmFyZ3M7IGkrKykKKwlhaXhfYWRqdXN0X2FnZ3JlZ2F0ZV9zaXplcyAoY2lmLT5hcmdfdHlwZXNbaV0pOworICAgIH0KKworICAvKiBTcGFjZSBmb3IgdGhlIGZyYW1lIHBvaW50ZXIsIGNhbGxlZSdzIExSLCBDUiwgZXRjLCBhbmQgZm9yCisgICAgIHRoZSBhc20ncyB0ZW1wIHJlZ3MuICAqLworCisgIGJ5dGVzID0gKExJTktBR0VfQVJFQV9HUFJTICsgQVNNX05FRURTX1JFR0lTVEVSUykgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisKKyAgLyogUmV0dXJuIHZhbHVlIGhhbmRsaW5nLiAgCisgICAgVGhlIHJ1bGVzIG0zMiBhcmUgYXMgZm9sbG93czoKKyAgICAgLSAzMi1iaXQgKG9yIGxlc3MpIGludGVnZXIgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBncHIzOworICAgICAtIHN0cnVjdHVyZXMgb2Ygc2l6ZSA8PSA0IGJ5dGVzIGFsc28gcmV0dXJuZWQgaW4gZ3ByMzsKKyAgICAgLSA2NC1iaXQgaW50ZWdlciB2YWx1ZXMgWz8/PyBhbmQgc3RydWN0dXJlcyBiZXR3ZWVuIDUgYW5kIDggYnl0ZXNdIGFyZQorICAgICAgIHJldHVybmVkIGluIGdwcjMgYW5kIGdwcjQ7CisgICAgIC0gU2luZ2xlL2RvdWJsZSBGUCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGZwcjE7CisgICAgIC0gTG9uZyBkb3VibGUgRlAgKGlmIG5vdCBlcXVpdmFsZW50IHRvIGRvdWJsZSkgdmFsdWVzIGFyZSByZXR1cm5lZCBpbgorICAgICAgIGZwcjEgYW5kIGZwcjI7CisgICAgIG02NDoKKyAgICAgLSA2NC1iaXQgb3Igc21hbGxlciBpbnRlZ3JhbCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIEdQUjMKKyAgICAgLSBTaW5nbGUvZG91YmxlIEZQIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gZnByMTsKKyAgICAgLSBMb25nIGRvdWJsZSBGUCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGZwcjEgYW5kIGZwcjI7CisgICAgIG02NCBTdHJ1Y3R1cmVzOgorICAgICAtIElmIHRoZSBzdHJ1Y3R1cmUgY291bGQgYmUgYWNjb21tb2RhdGVkIGluIHJlZ2lzdGVycyB3ZXJlIGl0IHRvIGJlIHRoZQorICAgICAgIGZpcnN0IGFyZ3VtZW50IHRvIGEgcm91dGluZSwgdGhlbiBpdCBpcyByZXR1cm5lZCBpbiB0aG9zZSByZWdpc3RlcnMuCisgICAgIG0zMi9tNjQgc3RydWN0dXJlcyBvdGhlcndpc2U6CisgICAgIC0gTGFyZ2VyIHN0cnVjdHVyZXMgdmFsdWVzIGFyZSBhbGxvY2F0ZWQgc3BhY2UgYW5kIGEgcG9pbnRlciBpcyBwYXNzZWQKKyAgICAgICBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICAqLworICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCisgICAgeworCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKyAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfMTI4QklUUzsKKyAgICAgIGZsYWdzIHw9IEZMQUdfUkVUVVJOU19GUDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICAgIGZsYWdzIHw9IEZMQUdfUkVUVVJOU182NEJJVFM7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfRlA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorI2lmZGVmIFBPV0VSUEM2NAorICAgIGNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKyNlbmRpZgorICAgICAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TXzY0QklUUzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisjaWYgZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorICAgICAgeworCS8qIENhbiB3ZSBmaXQgdGhlIHN0cnVjdCBpbnRvIHJlZ3M/ICAqLworCWlmIChkYXJ3aW42NF9zdHJ1Y3RfcmV0X2J5X3ZhbHVlX3AgKGNpZi0+cnR5cGUpKQorCSAgeworCSAgICB1bnNpZ25lZCBuZnByID0gMDsKKwkgICAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TX1NUUlVDVDsKKwkgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgIT0gMTYpCisJICAgICAgZGFyd2luNjRfc2Nhbl9zdHJ1Y3RfZm9yX2Zsb2F0cyAoY2lmLT5ydHlwZSwgJm5mcHIpIDsKKwkgICAgZWxzZQorCSAgICAgIGZsYWdzIHw9IEZMQUdfUkVUVVJOU18xMjhCSVRTOworCSAgICAvKiBXaWxsIGJlIDAgZm9yIDE2Ynl0ZSBzdHJ1Y3QuICAqLworCSAgICBpZiAobmZwcikKKwkgICAgICBmbGFncyB8PSBGTEFHX1JFVFVSTlNfRlA7CisJICB9CisJZWxzZSAvKiBCeSByZWYuICovCisJICB7CisJICAgIGZsYWdzIHw9IEZMQUdfUkVUVkFMX1JFRkVSRU5DRTsKKwkgICAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TX05PVEhJTkc7CisJICAgIGludGFyZ19jb3VudCsrOworCSAgfQorICAgICAgfQorI2VsaWYgZGVmaW5lZChEQVJXSU5fUFBDKQorICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPD0gNCkKKwlmbGFncyB8PSBGTEFHX1JFVFVSTlNfU1RSVUNUOworICAgICAgZWxzZSAvKiBlbHNlIGJ5IHJlZmVyZW5jZS4gICovCisJeworCSAgZmxhZ3MgfD0gRkxBR19SRVRWQUxfUkVGRVJFTkNFOworCSAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TX05PVEhJTkc7CisJICBpbnRhcmdfY291bnQrKzsKKwl9CisjZWxzZSAvKiBhc3N1bWUgd2UgcGFzcyBieSByZWYuICAqLworICAgICAgZmxhZ3MgfD0gRkxBR19SRVRWQUxfUkVGRVJFTkNFOworICAgICAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TX05PVEhJTkc7CisgICAgICBpbnRhcmdfY291bnQrKzsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgICAgZmxhZ3MgfD0gRkxBR19SRVRVUk5TX05PVEhJTkc7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBSZXR1cm5zIDMyLWJpdCBpbnRlZ2VyLCBvciBzaW1pbGFyLiAgTm90aGluZyB0byBkbyBoZXJlLiAgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBUaGUgZmlyc3QgTlVNX0dQUl9BUkdfUkVHSVNURVJTIHdvcmRzIG9mIGludGVnZXIgYXJndW1lbnRzLCBhbmQgdGhlCisgICAgIGZpcnN0IE5VTV9GUFJfQVJHX1JFR0lTVEVSUyBmcCBhcmd1bWVudHMsIGdvIGluIHJlZ2lzdGVyczsgdGhlIHJlc3QKKyAgICAgZ29lcyBvbiB0aGUgc3RhY2suICAKKyAgICAgPz8/IFN0cnVjdHVyZXMgYXJlIHBhc3NlZCBhcyBhIHBvaW50ZXIgdG8gYSBjb3B5IG9mIHRoZSBzdHJ1Y3R1cmUuIAorICAgICBTdHVmZiBvbiB0aGUgc3RhY2sgbmVlZHMgdG8ga2VlcCBwcm9wZXIgYWxpZ25tZW50LiAgCisgICAgIEZvciBtNjQgdGhlIGNvdW50IGlzIGVmZmVjdGl2ZWx5IG9mIGhhbGYtR1BScy4gICovCisgIGZvciAocHRyID0gY2lmLT5hcmdfdHlwZXMsIGkgPSBjaWYtPm5hcmdzOyBpID4gMDsgaS0tLCBwdHIrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBhbGlnbl93b3JkczsKKyAgICAgIHN3aXRjaCAoKCpwdHIpLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgZnBhcmdfY291bnQrKzsKKyNpZiAhZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorCSAgLyogSWYgdGhpcyBGUCBhcmcgaXMgZ29pbmcgb24gdGhlIHN0YWNrLCBpdCBtdXN0IGJlCisJICAgICA4LWJ5dGUtYWxpZ25lZC4gICovCisJICBpZiAoZnBhcmdfY291bnQgPiBOVU1fRlBSX0FSR19SRUdJU1RFUlMKKwkgICAgICAmJiAoaW50YXJnX2NvdW50ICYgMHgwMSkgIT0gMCkKKwkgICAgaW50YXJnX2NvdW50Kys7CisjZW5kaWYKKwkgIGJyZWFrOworCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwljYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisJICBmcGFyZ19jb3VudCArPSAyOworCSAgLyogSWYgdGhpcyBGUCBhcmcgaXMgZ29pbmcgb24gdGhlIHN0YWNrLCBpdCBtdXN0IGJlCisJICAgICAxNi1ieXRlLWFsaWduZWQuICAqLworCSAgaWYgKGZwYXJnX2NvdW50ID49IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKyNpZiBkZWZpbmVkIChQT1dFUlBDNjQpCisJICAgIGludGFyZ19jb3VudCA9IEFMSUdOKGludGFyZ19jb3VudCwgMik7CisjZWxzZQorCSAgICBpbnRhcmdfY291bnQgPSBBTElHTihpbnRhcmdfY291bnQsIDQpOworI2VuZGlmCisJICBicmVhazsKKyNlbmRpZgorCisJY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisjaWYgZGVmaW5lZChQT1dFUlBDNjQpCisJICBpbnRhcmdfY291bnQrKzsKKyNlbHNlCisJICAvKiAnbG9uZyBsb25nJyBhcmd1bWVudHMgYXJlIHBhc3NlZCBhcyB0d28gd29yZHMsIGJ1dAorCSAgICAgZWl0aGVyIGJvdGggd29yZHMgbXVzdCBmaXQgaW4gcmVnaXN0ZXJzIG9yIGJvdGggZ28KKwkgICAgIG9uIHRoZSBzdGFjay4gIElmIHRoZXkgZ28gb24gdGhlIHN0YWNrLCB0aGV5IG11c3QKKwkgICAgIGJlIDgtYnl0ZS1hbGlnbmVkLiAgKi8KKwkgIGlmIChpbnRhcmdfY291bnQgPT0gTlVNX0dQUl9BUkdfUkVHSVNURVJTLTEKKwkgICAgICB8fCAoaW50YXJnX2NvdW50ID49IE5VTV9HUFJfQVJHX1JFR0lTVEVSUyAKKwkgICAgICAgICAgJiYgKGludGFyZ19jb3VudCAmIDB4MDEpICE9IDApKQorCSAgICBpbnRhcmdfY291bnQrKzsKKwkgIGludGFyZ19jb3VudCArPSAyOworI2VuZGlmCisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgc2l6ZV9hbCA9ICgqcHRyKS0+c2l6ZTsKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisJICBhbGlnbl93b3JkcyA9ICgqcHRyKS0+YWxpZ25tZW50ID4+IDM7CisJICBpZiAoYWxpZ25fd29yZHMpCisJICAgIGludGFyZ19jb3VudCA9IEFMSUdOKGludGFyZ19jb3VudCwgYWxpZ25fd29yZHMpOworCSAgLyogQmFzZSBzaXplIG9mIHRoZSBzdHJ1Y3QuICAqLworCSAgaW50YXJnX2NvdW50ICs9IChzaXplX2FsICsgNykgLyA4OworCSAgLyogSWYgMTYgYnl0ZXMgdGhlbiBkb24ndCB3b3JyeSBhYm91dCBmbG9hdHMuICAqLworCSAgaWYgKHNpemVfYWwgIT0gMTYpCisJICAgIC8qIFNjYW4gdGhyb3VnaCBmb3IgZmxvYXRzIHRvIGJlIHBsYWNlZCBpbiByZWdzLiAgKi8KKwkgICAgZGFyd2luNjRfc2Nhbl9zdHJ1Y3RfZm9yX2Zsb2F0cyAoKnB0ciwgJmZwYXJnX2NvdW50KSA7CisjZWxzZQorCSAgYWxpZ25fd29yZHMgPSAoKnB0ciktPmFsaWdubWVudCA+PiAyOworCSAgaWYgKGFsaWduX3dvcmRzKQorCSAgICBpbnRhcmdfY291bnQgPSBBTElHTihpbnRhcmdfY291bnQsIGFsaWduX3dvcmRzKTsKKwkgIC8qIElmIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIHN0cnVjdCBpcyBhIGRvdWJsZSwgdGhlbiBhbGlnbgorCSAgICAgdGhlIHN0cnVjdCB0byBkb3VibGUtd29yZC4gCisJICBpZiAoKCpwdHIpLT5lbGVtZW50c1swXS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisJICAgIHNpemVfYWwgPSBBTElHTigoKnB0ciktPnNpemUsIDgpOyAqLworIyAgaWZkZWYgUE9XRVJQQzY0CisJICBpbnRhcmdfY291bnQgKz0gKHNpemVfYWwgKyA3KSAvIDg7CisjICBlbHNlCisJICBpbnRhcmdfY291bnQgKz0gKHNpemVfYWwgKyAzKSAvIDQ7CisjICBlbmRpZgorI2VuZGlmCisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAvKiBFdmVyeXRoaW5nIGVsc2UgaXMgcGFzc2VkIGFzIGEgNC1ieXRlIHdvcmQgaW4gYSBHUFIsIGVpdGhlcgorCSAgICAgdGhlIG9iamVjdCBpdHNlbGYgb3IgYSBwb2ludGVyIHRvIGl0LiAgKi8KKwkgIGludGFyZ19jb3VudCsrOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoZnBhcmdfY291bnQgIT0gMCkKKyAgICBmbGFncyB8PSBGTEFHX0ZQX0FSR1VNRU5UUzsKKworI2lmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKKyAgLyogU3BhY2UgdG8gaW1hZ2UgdGhlIEZQUiByZWdpc3RlcnMsIGlmIG5lZWRlZCAtIHdoaWNoIGluY2x1ZGVzIHdoZW4gdGhleSBtaWdodCBiZQorICAgICB1c2VkIGluIGEgc3RydWN0IHJldHVybi4gICovCisgIGlmIChmcGFyZ19jb3VudCAhPSAwIAorICAgICAgfHwgKChmbGFncyAmIEZMQUdfUkVUVVJOU19TVFJVQ1QpCisJICAgJiYgKGZsYWdzICYgRkxBR19SRVRVUk5TX0ZQKSkpCisgICAgYnl0ZXMgKz0gTlVNX0ZQUl9BUkdfUkVHSVNURVJTICogc2l6ZW9mKGRvdWJsZSk7CisjZWxzZQorICAvKiBTcGFjZSBmb3IgdGhlIEZQUiByZWdpc3RlcnMsIGlmIG5lZWRlZC4gICovCisgIGlmIChmcGFyZ19jb3VudCAhPSAwKQorICAgIGJ5dGVzICs9IE5VTV9GUFJfQVJHX1JFR0lTVEVSUyAqIHNpemVvZihkb3VibGUpOworI2VuZGlmCisKKyAgLyogU3RhY2sgc3BhY2UuICAqLworI2lmZGVmIFBPV0VSUEM2NAorICBpZiAoKGludGFyZ19jb3VudCArIGZwYXJnX2NvdW50KSA+IE5VTV9HUFJfQVJHX1JFR0lTVEVSUykKKyAgICBieXRlcyArPSAoaW50YXJnX2NvdW50ICsgZnBhcmdfY291bnQpICogc2l6ZW9mKGxvbmcpOworI2Vsc2UKKyAgaWYgKChpbnRhcmdfY291bnQgKyAyICogZnBhcmdfY291bnQpID4gTlVNX0dQUl9BUkdfUkVHSVNURVJTKQorICAgIGJ5dGVzICs9IChpbnRhcmdfY291bnQgKyAyICogZnBhcmdfY291bnQpICogc2l6ZW9mKGxvbmcpOworI2VuZGlmCisgIGVsc2UKKyAgICBieXRlcyArPSBOVU1fR1BSX0FSR19SRUdJU1RFUlMgKiBzaXplb2YobG9uZyk7CisKKyAgLyogVGhlIHN0YWNrIHNwYWNlIGFsbG9jYXRlZCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLiAgKi8KKyAgYnl0ZXMgPSBBTElHTihieXRlcywgMTYpIDsKKworICBjaWYtPmZsYWdzID0gZmxhZ3M7CisgIGNpZi0+Ynl0ZXMgPSBieXRlczsKKworICByZXR1cm4gRkZJX09LOworfQorCitleHRlcm4gdm9pZCBmZmlfY2FsbF9BSVgoZXh0ZW5kZWRfY2lmICosIGxvbmcsIHVuc2lnbmVkLCB1bnNpZ25lZCAqLAorCQkJIHZvaWQgKCpmbikodm9pZCksIHZvaWQgKCpmbjIpKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfREFSV0lOKGV4dGVuZGVkX2NpZiAqLCBsb25nLCB1bnNpZ25lZCwgdW5zaWduZWQgKiwKKwkJCSAgICB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICgqZm4yKSh2b2lkKSwgZmZpX3R5cGUqKTsKKwordm9pZAorZmZpX2NhbGwgKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisKKyAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybgorICAgICB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZS4gICovCisKKyAgaWYgKChydmFsdWUgPT0gTlVMTCkgJiYKKyAgICAgIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkpCisgICAgeworICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EgKGNpZi0+cnR5cGUtPnNpemUpOworICAgIH0KKyAgZWxzZQorICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOworCisgIHN3aXRjaCAoY2lmLT5hYmkpCisgICAgeworICAgIGNhc2UgRkZJX0FJWDoKKyAgICAgIGZmaV9jYWxsX0FJWCgmZWNpZiwgLShsb25nKWNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbiwKKwkJICAgRkZJX0ZOKGZmaV9wcmVwX2FyZ3MpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX0RBUldJTjoKKyAgICAgIGZmaV9jYWxsX0RBUldJTigmZWNpZiwgLShsb25nKWNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbiwKKwkJICAgICAgRkZJX0ZOKGZmaV9wcmVwX2FyZ3MpLCBjaWYtPnJ0eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmbHVzaF9pY2FjaGUoY2hhciAqKTsKK3N0YXRpYyB2b2lkIGZsdXNoX3JhbmdlKGNoYXIgKiwgaW50KTsKKworLyogVGhlIGxheW91dCBvZiBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBBIEMgZnVuY3Rpb24gcG9pbnRlciByZWFsbHkKKyAgIHBvaW50cyB0byBvbmUgb2YgdGhlc2UuICAqLworCit0eXBlZGVmIHN0cnVjdCBhaXhfZmRfc3RydWN0IHsKKyAgdm9pZCAqY29kZV9wb2ludGVyOworICB2b2lkICp0b2M7Cit9IGFpeF9mZDsKKworLyogaGVyZSBJJ2QgbGlrZSB0byBhZGQgdGhlIHN0YWNrIGZyYW1lIGxheW91dCB3ZSB1c2UgaW4gZGFyd2luX2Nsb3N1cmUuUworICAgYW5kIGFpeF9jbG9zdXJlLlMKKworICAgbTMyL202NAorCisgICBUaGUgc3RhY2sgbGF5b3V0IGxvb2tzIGxpa2UgdGhpczoKKworICAgfCAgIEFkZGl0aW9uYWwgcGFyYW1zLi4uCQkJfCB8ICAgICBIaWdoZXIgYWRkcmVzcworICAgfgkJCQkJCX4gfgorICAgfCAgIFBhcmFtZXRlcnMgICAgICAoYXQgbGVhc3QgOCo0Lzg9MzIvNjQpCXwgfCBOVU1fR1BSX0FSR19SRUdJU1RFUlMKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFRPQz1SMiAoQUlYKSBSZXNlcnZlZCAoRGFyd2luKSAgIDQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAyKjQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIFNwYWNlIGZvciBjYWxsZWUncyBMUgkJNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgU2F2ZWQgQ1IgW2xvdyB3b3JkIGZvciBtNjRdICAgICAgNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CisgICB8ICAgQ3VycmVudCBiYWNrY2hhaW4gcG9pbnRlcgk0LzgJfC0vIFBhcmVudCdzIGZyYW1lLgorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCA8KyA8PDwgb24gZW50cnkgdG8gZmZpX2Nsb3N1cmVfQVNNCisgICB8ICAgUmVzdWx0IEJ5dGVzCQkJMTYJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIH4gICBwYWRkaW5nIHRvIDE2LWJ5dGUgYWxpZ25tZW50CQl+IH4KKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfAorICAgfCAgIE5VTV9GUFJfQVJHX1JFR0lTVEVSUyBzbG90cwkJfCB8CisgICB8ICAgaGVyZSBmcDEzIC4uIGZwMQkJICAgICAgIDEzKjgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBSMy4uUjEwCQkJICA4KjQvOD0zMi82NAl8IHwgTlVNX0dQUl9BUkdfUkVHSVNURVJTCisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwKKyAgIHwgICBUT0M9UjIgKEFJWCkgUmVzZXJ2ZWQgKERhcndpbikgICA0LzgJfCB8CisgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwJc3RhY2sJfAorICAgfCAgIFJlc2VydmVkIFtjb21waWxlcixiaW5kZXJdICAgICAyKjQvOAl8IHwJZ3Jvd3MJfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CWRvd24JVgorICAgfCAgIFNwYWNlIGZvciBjYWxsZWUncyBMUgkJNC84CXwgfAorICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8CWxvd2VyIGFkZHJlc3NlcworICAgfCAgIFNhdmVkIENSIFtsb3cgd29yZCBmb3IgbTY0XSAgICAgIDQvOAl8IHwKKyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCAgICAgc3RhY2sgcG9pbnRlciBoZXJlCisgICB8ICAgQ3VycmVudCBiYWNrY2hhaW4gcG9pbnRlcgk0LzgJfC0vCWR1cmluZworICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgIDw8PAlmZmlfY2xvc3VyZV9BU00uCisKKyovCisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmVfbG9jIChmZmlfY2xvc3VyZSogY2xvc3VyZSwKKwkJICAgICAgZmZpX2NpZiogY2lmLAorCQkgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKiwgdm9pZCosIHZvaWQqKiwgdm9pZCopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCSAgICAgIHZvaWQgKmNvZGVsb2MpCit7CisgIHVuc2lnbmVkIGludCAqdHJhbXA7CisgIHN0cnVjdCBmZmlfYWl4X3RyYW1wb2xpbmVfc3RydWN0ICp0cmFtcF9haXg7CisgIGFpeF9mZCAqZmQ7CisKKyAgc3dpdGNoIChjaWYtPmFiaSkKKyAgICB7CisgICAgICBjYXNlIEZGSV9EQVJXSU46CisKKwlGRklfQVNTRVJUIChjaWYtPmFiaSA9PSBGRklfREFSV0lOKTsKKworCXRyYW1wID0gKHVuc2lnbmVkIGludCAqKSAmY2xvc3VyZS0+dHJhbXBbMF07CisjaWYgZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorCXRyYW1wWzBdID0gMHg3YzA4MDJhNjsgIC8qICAgbWZsciAgICByMCAgKi8KKwl0cmFtcFsxXSA9IDB4NDI5ZjAwMTU7ICAvKiAgIGJjbC0gICAgMjAsNCpjcjcrc28sICArMHgxOCAoTDEpICAqLworCS8qIFdlIHB1dCB0aGUgYWRkcmVzc2VzIGhlcmUuICAqLworCXRyYW1wWzZdID0gMHg3ZDY4MDJhNjsgIC8qTDE6ICAgbWZsciAgICByMTEgICovCisJdHJhbXBbN10gPSAweGU5OGIwMDAwOyAgLyogICBsZCAgICAgcjEyLDAocjExKSBmdW5jdGlvbiBhZGRyZXNzICAqLworCXRyYW1wWzhdID0gMHg3YzA4MDNhNjsgIC8qICAgbXRsciAgICByMCAgICovCisJdHJhbXBbOV0gPSAweDdkODkwM2E2OyAgLyogICBtdGN0ciAgIHIxMiAgKi8KKwl0cmFtcFsxMF0gPSAweGU5NmIwMDA4OyAgLyogICBsd3ogICAgIHIxMSw4KHIxMSkgc3RhdGljIGNoYWluICAqLworCXRyYW1wWzExXSA9IDB4NGU4MDA0MjA7ICAvKiAgIGJjdHIgICovCisKKwkqKCh1bnNpZ25lZCBsb25nICopJnRyYW1wWzJdKSA9ICh1bnNpZ25lZCBsb25nKSBmZmlfY2xvc3VyZV9BU007IC8qIGZ1bmN0aW9uICAqLworCSooKHVuc2lnbmVkIGxvbmcgKikmdHJhbXBbNF0pID0gKHVuc2lnbmVkIGxvbmcpIGNvZGVsb2M7IC8qIGNvbnRleHQgICovCisjZWxzZQorCXRyYW1wWzBdID0gMHg3YzA4MDJhNjsgIC8qICAgbWZsciAgICByMCAgKi8KKwl0cmFtcFsxXSA9IDB4NDI5ZjAwMGQ7ICAvKiAgIGJjbC0gICAgMjAsNCpjcjcrc28sMHgxMCAgKi8KKwl0cmFtcFs0XSA9IDB4N2Q2ODAyYTY7ICAvKiAgIG1mbHIgICAgcjExICAqLworCXRyYW1wWzVdID0gMHg4MThiMDAwMDsgIC8qICAgbHd6ICAgICByMTIsMChyMTEpIGZ1bmN0aW9uIGFkZHJlc3MgICovCisJdHJhbXBbNl0gPSAweDdjMDgwM2E2OyAgLyogICBtdGxyICAgIHIwICAgKi8KKwl0cmFtcFs3XSA9IDB4N2Q4OTAzYTY7ICAvKiAgIG10Y3RyICAgcjEyICAqLworCXRyYW1wWzhdID0gMHg4MTZiMDAwNDsgIC8qICAgbHd6ICAgICByMTEsNChyMTEpIHN0YXRpYyBjaGFpbiAgKi8KKwl0cmFtcFs5XSA9IDB4NGU4MDA0MjA7ICAvKiAgIGJjdHIgICovCisJdHJhbXBbMl0gPSAodW5zaWduZWQgbG9uZykgZmZpX2Nsb3N1cmVfQVNNOyAvKiBmdW5jdGlvbiAgKi8KKwl0cmFtcFszXSA9ICh1bnNpZ25lZCBsb25nKSBjb2RlbG9jOyAvKiBjb250ZXh0ICAqLworI2VuZGlmCisJY2xvc3VyZS0+Y2lmID0gY2lmOworCWNsb3N1cmUtPmZ1biA9IGZ1bjsKKwljbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisKKwkvKiBGbHVzaCB0aGUgaWNhY2hlLiBPbmx5IG5lY2Vzc2FyeSBvbiBEYXJ3aW4uICAqLworCWZsdXNoX3JhbmdlKGNvZGVsb2MsIEZGSV9UUkFNUE9MSU5FX1NJWkUpOworCisJYnJlYWs7CisKKyAgICBjYXNlIEZGSV9BSVg6CisKKyAgICAgIHRyYW1wX2FpeCA9IChzdHJ1Y3QgZmZpX2FpeF90cmFtcG9saW5lX3N0cnVjdCAqKSAoY2xvc3VyZS0+dHJhbXApOworICAgICAgZmQgPSAoYWl4X2ZkICopKHZvaWQgKilmZmlfY2xvc3VyZV9BU007CisKKyAgICAgIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9BSVgpOworCisgICAgICB0cmFtcF9haXgtPmNvZGVfcG9pbnRlciA9IGZkLT5jb2RlX3BvaW50ZXI7CisgICAgICB0cmFtcF9haXgtPnRvYyA9IGZkLT50b2M7CisgICAgICB0cmFtcF9haXgtPnN0YXRpY19jaGFpbiA9IGNvZGVsb2M7CisgICAgICBjbG9zdXJlLT5jaWYgPSBjaWY7CisgICAgICBjbG9zdXJlLT5mdW4gPSBmdW47CisgICAgICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisKKyAgICBkZWZhdWx0OgorCisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gRkZJX09LOworfQorCitzdGF0aWMgdm9pZAorZmx1c2hfaWNhY2hlKGNoYXIgKmFkZHIpCit7CisjaWZuZGVmIF9BSVgKKyAgX19hc21fXyB2b2xhdGlsZSAoCisJCSJkY2JmIDAsJTBcbiIKKwkJIlx0c3luY1xuIgorCQkiXHRpY2JpIDAsJTBcbiIKKwkJIlx0c3luY1xuIgorCQkiXHRpc3luYyIKKwkJOiA6ICJyIihhZGRyKSA6ICJtZW1vcnkiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZmx1c2hfcmFuZ2UoY2hhciAqIGFkZHIxLCBpbnQgc2l6ZSkKK3sKKyNkZWZpbmUgTUlOX0xJTkVfU0laRSAzMgorICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gTUlOX0xJTkVfU0laRSkKKyAgICBmbHVzaF9pY2FjaGUoYWRkcjEraSk7CisgIGZsdXNoX2ljYWNoZShhZGRyMStzaXplLTEpOworfQorCit0eXBlZGVmIHVuaW9uCit7CisgIGZsb2F0IGY7CisgIGRvdWJsZSBkOworfSBmZmlfZGJsZmw7CisKK2ZmaV90eXBlICoKK2ZmaV9jbG9zdXJlX2hlbHBlcl9EQVJXSU4gKGZmaV9jbG9zdXJlICosIHZvaWQgKiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKiwgZmZpX2RibGZsICopOworCisvKiBCYXNpY2FsbHkgdGhlIHRyYW1wb2xpbmUgaW52b2tlcyBmZmlfY2xvc3VyZV9BU00sIGFuZCBvbgorICAgZW50cnksIHIxMSBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2xvc3VyZS4KKyAgIEFmdGVyIHN0b3JpbmcgdGhlIHJlZ2lzdGVycyB0aGF0IGNvdWxkIHBvc3NpYmx5IGNvbnRhaW4KKyAgIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIGludG8gdGhlIHN0YWNrIGZyYW1lIGFuZCBzZXR0aW5nCisgICB1cCBzcGFjZSBmb3IgYSByZXR1cm4gdmFsdWUsIGZmaV9jbG9zdXJlX0FTTSBpbnZva2VzIHRoZQorICAgZm9sbG93aW5nIGhlbHBlciBmdW5jdGlvbiB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgKi8KKworZmZpX3R5cGUgKgorZmZpX2Nsb3N1cmVfaGVscGVyX0RBUldJTiAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsIHZvaWQgKnJ2YWx1ZSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKnBnciwgZmZpX2RibGZsICpwZnIpCit7CisgIC8qIHJ2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byBzcGFjZSBmb3IgcmV0dXJuIHZhbHVlIGluIGNsb3N1cmUgYXNzZW1ibHkKKyAgICAgcGdyIGlzIHRoZSBwb2ludGVyIHRvIHdoZXJlIHIzLXIxMCBhcmUgc3RvcmVkIGluIGZmaV9jbG9zdXJlX0FTTQorICAgICBwZnIgaXMgdGhlIHBvaW50ZXIgdG8gd2hlcmUgZjEtZjEzIGFyZSBzdG9yZWQgaW4gZmZpX2Nsb3N1cmVfQVNNLiAgKi8KKworICB0eXBlZGVmIGRvdWJsZSBsZGJpdHNbMl07CisKKyAgdW5pb24gbGR1CisgIHsKKyAgICBsZGJpdHMgbGI7CisgICAgbG9uZyBkb3VibGUgbGQ7CisgIH07CisKKyAgdm9pZCAqKiAgICAgICAgICBhdmFsdWU7CisgIGZmaV90eXBlICoqICAgICAgYXJnX3R5cGVzOworICBsb25nICAgICAgICAgICAgIGksIGF2bjsKKyAgZmZpX2NpZiAqICAgICAgICBjaWY7CisgIGZmaV9kYmxmbCAqICAgICAgZW5kX3BmciA9IHBmciArIE5VTV9GUFJfQVJHX1JFR0lTVEVSUzsKKyAgdW5zaWduZWQgICAgICAgICBzaXplX2FsOworI2lmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKKyAgdW5zaWduZWQgCSAgIGZwc3VzZWQgPSAwOworI2VuZGlmCisKKyAgY2lmID0gY2xvc3VyZS0+Y2lmOworICBhdmFsdWUgPSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2Yodm9pZCAqKSk7CisKKyAgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHsKKyNpZiBkZWZpbmVkKFBPV0VSUENfREFSV0lONjQpCisgICAgICBpZiAoIWRhcndpbjY0X3N0cnVjdF9yZXRfYnlfdmFsdWVfcCAoY2lmLT5ydHlwZSkpCisJeworICAgIAkgIC8qIFdvbid0IGZpdCBpbnRvIHRoZSByZWdzIC0gcmV0dXJuIGJ5IHJlZi4gICovCisJICBydmFsdWUgPSAodm9pZCAqKSAqcGdyOworCSAgcGdyKys7CisJfQorI2VsaWYgZGVmaW5lZChEQVJXSU5fUFBDKQorICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPiA0KQorCXsKKwkgIHJ2YWx1ZSA9ICh2b2lkICopICpwZ3I7CisJICBwZ3IrKzsKKwl9CisjZWxzZSAvKiBhc3N1bWUgd2UgcmV0dXJuIGJ5IHJlZi4gICovCisgICAgICBydmFsdWUgPSAodm9pZCAqKSAqcGdyOworICAgICAgcGdyKys7CisjZW5kaWYKKyAgICB9CisKKyAgaSA9IDA7CisgIGF2biA9IGNpZi0+bmFyZ3M7CisgIGFyZ190eXBlcyA9IGNpZi0+YXJnX3R5cGVzOworCisgIC8qIEdyYWIgdGhlIGFkZHJlc3NlcyBvZiB0aGUgYXJndW1lbnRzIGZyb20gdGhlIHN0YWNrIGZyYW1lLiAgKi8KKyAgd2hpbGUgKGkgPCBhdm4pCisgICAgeworICAgICAgc3dpdGNoIChhcmdfdHlwZXNbaV0tPnR5cGUpCisJeworCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJY2FzZSBGRklfVFlQRV9VSU5UODoKKyNpZiAgZGVmaW5lZChQT1dFUlBDNjQpCisJICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwZ3IgKyA3OworI2Vsc2UKKwkgIGF2YWx1ZVtpXSA9IChjaGFyICopIHBnciArIDM7CisjZW5kaWYKKwkgIHBncisrOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwljYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyNpZiAgZGVmaW5lZChQT1dFUlBDNjQpCisJICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwZ3IgKyA2OworI2Vsc2UKKwkgIGF2YWx1ZVtpXSA9IChjaGFyICopIHBnciArIDI7CisjZW5kaWYKKwkgIHBncisrOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwljYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyNpZiAgZGVmaW5lZChQT1dFUlBDNjQpCisJICBhdmFsdWVbaV0gPSAoY2hhciAqKSBwZ3IgKyA0OworI2Vsc2UKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJICBhdmFsdWVbaV0gPSBwZ3I7CisjZW5kaWYKKwkgIHBncisrOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIHNpemVfYWwgPSBhcmdfdHlwZXNbaV0tPnNpemU7CisjaWYgZGVmaW5lZChQT1dFUlBDX0RBUldJTjY0KQorCSAgcGdyID0gKHVuc2lnbmVkIGxvbmcgKilBTElHTigoY2hhciAqKXBnciwgYXJnX3R5cGVzW2ldLT5hbGlnbm1lbnQpOworCSAgaWYgKHNpemVfYWwgPCAzIHx8IHNpemVfYWwgPT0gNCkKKwkgICAgeworCSAgICAgIGF2YWx1ZVtpXSA9ICgoY2hhciAqKXBncikrOC1zaXplX2FsOworCSAgICAgIGlmIChhcmdfdHlwZXNbaV0tPmVsZW1lbnRzWzBdLT50eXBlID09IEZGSV9UWVBFX0ZMT0FUCisJCSAgJiYgZnBzdXNlZCA8IE5VTV9GUFJfQVJHX1JFR0lTVEVSUykKKwkJeworCQkgICooZmxvYXQgKilwZ3IgPSAoZmxvYXQpICooZG91YmxlICopcGZyOworCQkgIHBmcisrOworCQkgIGZwc3VzZWQrKzsKKwkJfQorCSAgICB9CisJICBlbHNlIAorCSAgICB7CisJICAgICAgaWYgKHNpemVfYWwgIT0gMTYpCisJCXBmciA9IChmZmlfZGJsZmwgKikgCisJCSAgICBkYXJ3aW42NF9zdHJ1Y3RfZmxvYXRzX3RvX21lbSAoYXJnX3R5cGVzW2ldLCAoY2hhciAqKXBnciwKKwkJCQkJCSAgIChkb3VibGUgKilwZnIsICZmcHN1c2VkKTsKKwkgICAgICBhdmFsdWVbaV0gPSBwZ3I7CisJICAgIH0KKwkgIHBnciArPSAoc2l6ZV9hbCArIDcpIC8gODsKKyNlbHNlCisJICAvKiBJZiB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBzdHJ1Y3QgaXMgYSBkb3VibGUsIHRoZW4gYWxpZ24KKwkgICAgIHRoZSBzdHJ1Y3QgdG8gZG91YmxlLXdvcmQuICAqLworCSAgaWYgKGFyZ190eXBlc1tpXS0+ZWxlbWVudHNbMF0tPnR5cGUgPT0gRkZJX1RZUEVfRE9VQkxFKQorCSAgICBzaXplX2FsID0gQUxJR04oYXJnX3R5cGVzW2ldLT5zaXplLCA4KTsKKyMgIGlmIGRlZmluZWQoUE9XRVJQQzY0KQorCSAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgIT0gRkZJX0RBUldJTikKKwkgIGF2YWx1ZVtpXSA9IHBncjsKKwkgIHBnciArPSAoc2l6ZV9hbCArIDcpIC8gODsKKyMgIGVsc2UKKwkgIC8qIFN0cnVjdHVyZXMgdGhhdCBtYXRjaCB0aGUgYmFzaWMgbW9kZXMgKFFJIDEgYnl0ZSwgSEkgMiBieXRlcywKKwkgICAgIFNJIDQgYnl0ZXMpIGFyZSBhbGlnbmVkIGFzIGlmIHRoZXkgd2VyZSB0aG9zZSBtb2Rlcy4gICovCisJICBpZiAoc2l6ZV9hbCA8IDMgJiYgY2lmLT5hYmkgPT0gRkZJX0RBUldJTikKKwkgICAgYXZhbHVlW2ldID0gKGNoYXIqKSBwZ3IgKyA0IC0gc2l6ZV9hbDsKKwkgIGVsc2UKKwkgICAgYXZhbHVlW2ldID0gcGdyOworCSAgcGdyICs9IChzaXplX2FsICsgMykgLyA0OworIyAgZW5kaWYKKyNlbmRpZgorCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKwljYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKyNpZiAgZGVmaW5lZChQT1dFUlBDNjQpCisJY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorCSAgYXZhbHVlW2ldID0gcGdyOworCSAgcGdyKys7CisJICBicmVhazsKKyNlbHNlCisJICAvKiBMb25nIGxvbmcgaW50cyBhcmUgcGFzc2VkIGluIHR3byBncHIncy4gICovCisJICBhdmFsdWVbaV0gPSBwZ3I7CisJICBwZ3IgKz0gMjsKKwkgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgLyogQSBmbG9hdCB2YWx1ZSBjb25zdW1lcyBhIEdQUi4KKwkgICAgIFRoZXJlIGFyZSAxMyA2NGJpdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuICAqLworCSAgaWYgKHBmciA8IGVuZF9wZnIpCisJICAgIHsKKwkgICAgICBkb3VibGUgdGVtcCA9IHBmci0+ZDsKKwkgICAgICBwZnItPmYgPSAoZmxvYXQpIHRlbXA7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIHBmcisrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhdmFsdWVbaV0gPSBwZ3I7CisJICAgIH0KKwkgIHBncisrOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgIC8qIEEgZG91YmxlIHZhbHVlIGNvbnN1bWVzIHR3byBHUFJzLgorCSAgICAgVGhlcmUgYXJlIDEzIDY0Yml0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4gICovCisJICBpZiAocGZyIDwgZW5kX3BmcikKKwkgICAgeworCSAgICAgIGF2YWx1ZVtpXSA9IHBmcjsKKwkgICAgICBwZnIrKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gcGdyOworCSAgICB9CisjaWZkZWYgUE9XRVJQQzY0CisJICBwZ3IrKzsKKyNlbHNlCisJICBwZ3IgKz0gMjsKKyNlbmRpZgorCSAgYnJlYWs7CisKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCisJY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorI2lmZGVmIFBPV0VSUEM2NAorCSAgaWYgKHBmciArIDEgPCBlbmRfcGZyKQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIHBmciArPSAyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAocGZyIDwgZW5kX3BmcikKKwkJeworCQkgICpwZ3IgPSAqKHVuc2lnbmVkIGxvbmcgKikgcGZyOworCQkgIHBmcisrOworCQl9CisJICAgICAgYXZhbHVlW2ldID0gcGdyOworCSAgICB9CisJICBwZ3IgKz0gMjsKKyNlbHNlICAvKiBQT1dFUlBDNjQgKi8KKwkgIC8qIEEgbG9uZyBkb3VibGUgdmFsdWUgY29uc3VtZXMgZm91ciBHUFJzIGFuZCB0d28gRlBScy4KKwkgICAgIFRoZXJlIGFyZSAxMyA2NGJpdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuICAqLworCSAgaWYgKHBmciArIDEgPCBlbmRfcGZyKQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gcGZyOworCSAgICAgIHBmciArPSAyOworCSAgICB9CisJICAvKiBIZXJlIHdlIGhhdmUgdGhlIHNpdHVhdGlvbiB3aGVyZSBvbmUgcGFydCBvZiB0aGUgbG9uZyBkb3VibGUKKwkgICAgIGlzIHN0b3JlZCBpbiBmcHIxMyBhbmQgdGhlIG90aGVyIHBhcnQgaXMgYWxyZWFkeSBvbiB0aGUgc3RhY2suCisJICAgICBXZSB1c2UgYSB1bmlvbiB0byBwYXNzIHRoZSBsb25nIGRvdWJsZSB0byBhdmFsdWVbaV0uICAqLworCSAgZWxzZSBpZiAocGZyICsgMSA9PSBlbmRfcGZyKQorCSAgICB7CisJICAgICAgdW5pb24gbGR1IHRlbXBfbGQ7CisJICAgICAgbWVtY3B5ICgmdGVtcF9sZC5sYlswXSwgcGZyLCBzaXplb2YobGRiaXRzKSk7CisJICAgICAgbWVtY3B5ICgmdGVtcF9sZC5sYlsxXSwgcGdyICsgMiwgc2l6ZW9mKGxkYml0cykpOworCSAgICAgIGF2YWx1ZVtpXSA9ICZ0ZW1wX2xkLmxkOworCSAgICAgIHBmcisrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhdmFsdWVbaV0gPSBwZ3I7CisJICAgIH0KKwkgIHBnciArPSA0OworI2VuZGlmICAvKiBQT1dFUlBDNjQgKi8KKwkgIGJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkgIEZGSV9BU1NFUlQoMCk7CisJfQorICAgICAgaSsrOworICAgIH0KKworICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCBydmFsdWUsIGF2YWx1ZSwgY2xvc3VyZS0+dXNlcl9kYXRhKTsKKworICAvKiBUZWxsIGZmaV9jbG9zdXJlX0FTTSB0byBwZXJmb3JtIHJldHVybiB0eXBlIHByb21vdGlvbnMuICAqLworICByZXR1cm4gY2lmLT5ydHlwZTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9mZml0YXJnZXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdmNzMxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaXRhcmdldC5oCkBAIC0wLDAgKzEsMTM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jCisgICBUYXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MgZm9yIFBvd2VyUEMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKKyNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICisKKy8qIC0tLS0gU3lzdGVtIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkIChQT1dFUlBDKSAmJiBkZWZpbmVkIChfX3Bvd2VycGM2NF9fKQkvKiBsaW51eDY0ICovCisjaWZuZGVmIFBPV0VSUEM2NAorI2RlZmluZSBQT1dFUlBDNjQKKyNlbmRpZgorI2VsaWYgZGVmaW5lZCAoUE9XRVJQQ19EQVJXSU4pICYmIGRlZmluZWQgKF9fcHBjNjRfXykJLyogRGFyd2luNjQgKi8KKyNpZm5kZWYgUE9XRVJQQzY0CisjZGVmaW5lIFBPV0VSUEM2NAorI2VuZGlmCisjaWZuZGVmIFBPV0VSUENfREFSV0lONjQKKyNkZWZpbmUgUE9XRVJQQ19EQVJXSU42NAorI2VuZGlmCisjZWxpZiBkZWZpbmVkIChQT1dFUlBDX0FJWCkgJiYgZGVmaW5lZCAoX182NEJJVF9fKQkvKiBBSVg2NCAqLworI2lmbmRlZiBQT1dFUlBDNjQKKyNkZWZpbmUgUE9XRVJQQzY0CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIExJQkZGSV9BU00KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBmZmlfYXJnOwordHlwZWRlZiBzaWduZWQgbG9uZyAgICAgICAgICAgIGZmaV9zYXJnOworCit0eXBlZGVmIGVudW0gZmZpX2FiaSB7CisgIEZGSV9GSVJTVF9BQkkgPSAwLAorCisjaWZkZWYgUE9XRVJQQworICBGRklfU1lTViwKKyAgRkZJX0dDQ19TWVNWLAorICBGRklfTElOVVg2NCwKKyAgRkZJX0xJTlVYLAorICBGRklfTElOVVhfU09GVF9GTE9BVCwKKyMgaWZkZWYgUE9XRVJQQzY0CisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9MSU5VWDY0LAorIyBlbHNlCisjICBpZiAoIWRlZmluZWQoX19OT19GUFJTX18pICYmIChfX0xEQkxfTUFOVF9ESUdfXyA9PSAxMDYpKQorICBGRklfREVGQVVMVF9BQkkgPSBGRklfTElOVVgsCisjICBlbHNlCisjICAgaWZkZWYgX19OT19GUFJTX18KKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX0xJTlVYX1NPRlRfRkxPQVQsCisjICAgZWxzZQorICBGRklfREVGQVVMVF9BQkkgPSBGRklfR0NDX1NZU1YsCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFBPV0VSUENfQUlYCisgIEZGSV9BSVgsCisgIEZGSV9EQVJXSU4sCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9BSVgsCisjZW5kaWYKKworI2lmZGVmIFBPV0VSUENfREFSV0lOCisgIEZGSV9BSVgsCisgIEZGSV9EQVJXSU4sCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9EQVJXSU4sCisjZW5kaWYKKworI2lmZGVmIFBPV0VSUENfRlJFRUJTRAorICBGRklfU1lTViwKKyAgRkZJX0dDQ19TWVNWLAorICBGRklfTElOVVg2NCwKKyAgRkZJX0xJTlVYLAorICBGRklfTElOVVhfU09GVF9GTE9BVCwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YsCisjZW5kaWYKKworICBGRklfTEFTVF9BQkkKK30gZmZpX2FiaTsKKyNlbmRpZgorCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAwCisKKy8qIEZvciBhZGRpdGlvbmFsIHR5cGVzIGxpa2UgdGhlIGJlbG93LCB0YWtlIGNhcmUgYWJvdXQgdGhlIG9yZGVyIGluCisgICBwcGNfY2xvc3VyZXMuUy4gVGhleSBtdXN0IGZvbGxvdyBhZnRlciB0aGUgRkZJX1RZUEVfTEFTVC4gICovCisKKy8qIE5lZWRlZCBmb3Igc29mdC1mbG9hdCBsb25nLWRvdWJsZS0xMjggc3VwcG9ydC4gICovCisjZGVmaW5lIEZGSV9UWVBFX1VJTlQxMjggKEZGSV9UWVBFX0xBU1QgKyAxKQorCisvKiBOZWVkZWQgZm9yIEZGSV9TWVNWIHNtYWxsIHN0cnVjdHVyZSByZXR1cm5zLgorICAgV2UgdXNlIHR3byBmbGFnIGJpdHMsIChGTEFHX1NZU1ZfU01TVF9SMywgRkxBR19TWVNWX1NNU1RfUjQpIHdoaWNoIGFyZQorICAgZGVmaW5lZCBpbiBmZmkuYywgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdCByZXR1cm4gdHlwZSBhbmQgaXRzIHNpemUuICAqLworI2RlZmluZSBGRklfU1lTVl9UWVBFX1NNQUxMX1NUUlVDVCAoRkZJX1RZUEVfTEFTVCArIDIpCisKKyNpZiBkZWZpbmVkKFBPV0VSUEM2NCkgfHwgZGVmaW5lZChQT1dFUlBDX0FJWCkKKyMgIGlmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU42NCkKKyMgICAgZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgNDgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMjQKKyMgIGVuZGlmCisjZWxzZSAvKiBQT1dFUlBDIHx8IFBPV0VSUENfQUlYICovCisjICBkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSA0MAorI2VuZGlmCisKKyNpZm5kZWYgTElCRkZJX0FTTQorI2lmIGRlZmluZWQoUE9XRVJQQ19EQVJXSU4pIHx8IGRlZmluZWQoUE9XRVJQQ19BSVgpCitzdHJ1Y3QgZmZpX2FpeF90cmFtcG9saW5lX3N0cnVjdCB7CisgICAgdm9pZCAqIGNvZGVfcG9pbnRlcjsJLyogUG9pbnRlciB0byBmZmlfY2xvc3VyZV9BU00gKi8KKyAgICB2b2lkICogdG9jOwkJCS8qIFRPQyAqLworICAgIHZvaWQgKiBzdGF0aWNfY2hhaW47CS8qIFBvaW50ZXIgdG8gY2xvc3VyZSAqLworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2xpbnV4NjQuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9saW51eDY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiNTZjYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9saW51eDY0LlMKQEAgLTAsMCArMSwxODcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzeXN2LmggLSBDb3B5cmlnaHQgKGMpIDIwMDMgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4KKwkgICAgQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQsIEluYy4KKworICAgUG93ZXJQQzY0IEFzc2VtYmx5IGdsdWUuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElCRkZJX0FTTQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisjaWZkZWYgX19wb3dlcnBjNjRfXworCS5oaWRkZW4JZmZpX2NhbGxfTElOVVg2NCwgLmZmaV9jYWxsX0xJTlVYNjQKKwkuZ2xvYmwJZmZpX2NhbGxfTElOVVg2NCwgLmZmaV9jYWxsX0xJTlVYNjQKKwkuc2VjdGlvbgkiLm9wZCIsImF3IgorCS5hbGlnbgkzCitmZmlfY2FsbF9MSU5VWDY0OgorCS5xdWFkCS5mZmlfY2FsbF9MSU5VWDY0LC5UT0MuQHRvY2Jhc2UsMAorCS5zaXplCWZmaV9jYWxsX0xJTlVYNjQsMjQKKwkudHlwZQkuZmZpX2NhbGxfTElOVVg2NCxAZnVuY3Rpb24KKwkudGV4dAorLmZmaV9jYWxsX0xJTlVYNjQ6CisuTEZCMToKKwltZmxyCSVyMAorCXN0ZAklcjI4LCAtMzIoJXIxKQorCXN0ZAklcjI5LCAtMjQoJXIxKQorCXN0ZAklcjMwLCAtMTYoJXIxKQorCXN0ZAklcjMxLCAtOCglcjEpCisJc3RkCSVyMCwgMTYoJXIxKQorCisJbXIJJXIyOCwgJXIxCS8qIG91ciBBUC4gICovCisuTENGSTA6CisJc3RkdXgJJXIxLCAlcjEsICVyNAorCW1yCSVyMzEsICVyNQkvKiBmbGFncywgKi8KKwltcgklcjMwLCAlcjYJLyogcnZhbHVlLCAqLworCW1yCSVyMjksICVyNwkvKiBmdW5jdGlvbiBhZGRyZXNzLiAgKi8KKwlzdGQJJXIyLCA0MCglcjEpCisKKwkvKiBDYWxsIGZmaV9wcmVwX2FyZ3M2NC4gICovCisJbXIJJXI0LCAlcjEKKwlibAkuZmZpX3ByZXBfYXJnczY0CisKKwlsZAklcjAsIDAoJXIyOSkKKwlsZAklcjIsIDgoJXIyOSkKKwlsZAklcjExLCAxNiglcjI5KQorCisJLyogTm93IGRvIHRoZSBjYWxsLiAgKi8KKwkvKiBTZXQgdXAgY3IxIHdpdGggYml0cyA0LTcgb2YgdGhlIGZsYWdzLiAgKi8KKwltdGNyZgkweDQwLCAlcjMxCisKKwkvKiBHZXQgdGhlIGFkZHJlc3MgdG8gY2FsbCBpbnRvIENUUi4gICovCisJbXRjdHIJJXIwCisJLyogTG9hZCBhbGwgdGhvc2UgYXJndW1lbnQgcmVnaXN0ZXJzLiAgKi8KKwlsZAklcjMsIC0zMi0oOCo4KSglcjI4KQorCWxkCSVyNCwgLTMyLSg3KjgpKCVyMjgpCisJbGQJJXI1LCAtMzItKDYqOCkoJXIyOCkKKwlsZAklcjYsIC0zMi0oNSo4KSglcjI4KQorCWJmLQk1LCAxZgorCWxkCSVyNywgLTMyLSg0KjgpKCVyMjgpCisJbGQJJXI4LCAtMzItKDMqOCkoJXIyOCkKKwlsZAklcjksIC0zMi0oMio4KSglcjI4KQorCWxkCSVyMTAsIC0zMi0oMSo4KSglcjI4KQorMToKKworCS8qIExvYWQgYWxsIHRoZSBGUCByZWdpc3RlcnMuICAqLworCWJmLQk2LCAyZgorCWxmZAklZjEsIC0zMi0oMjEqOCkoJXIyOCkKKwlsZmQJJWYyLCAtMzItKDIwKjgpKCVyMjgpCisJbGZkCSVmMywgLTMyLSgxOSo4KSglcjI4KQorCWxmZAklZjQsIC0zMi0oMTgqOCkoJXIyOCkKKwlsZmQJJWY1LCAtMzItKDE3KjgpKCVyMjgpCisJbGZkCSVmNiwgLTMyLSgxNio4KSglcjI4KQorCWxmZAklZjcsIC0zMi0oMTUqOCkoJXIyOCkKKwlsZmQJJWY4LCAtMzItKDE0KjgpKCVyMjgpCisJbGZkCSVmOSwgLTMyLSgxMyo4KSglcjI4KQorCWxmZAklZjEwLCAtMzItKDEyKjgpKCVyMjgpCisJbGZkCSVmMTEsIC0zMi0oMTEqOCkoJXIyOCkKKwlsZmQJJWYxMiwgLTMyLSgxMCo4KSglcjI4KQorCWxmZAklZjEzLCAtMzItKDkqOCkoJXIyOCkKKzI6CisKKwkvKiBNYWtlIHRoZSBjYWxsLiAgKi8KKwliY3RybAorCisJLyogVGhpcyBtdXN0IGZvbGxvdyB0aGUgY2FsbCBpbW1lZGlhdGVseSwgdGhlIHVud2luZGVyCisJICAgdXNlcyB0aGlzIHRvIGZpbmQgb3V0IGlmIHIyIGhhcyBiZWVuIHNhdmVkIG9yIG5vdC4gICovCisJbGQJJXIyLCA0MCglcjEpCisKKwkvKiBOb3csIGRlYWwgd2l0aCB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KKwltdGNyZgkweDAxLCAlcjMxCisJYnQtCTMwLCAuTGRvbmVfcmV0dXJuX3ZhbHVlCisJYnQtCTI5LCAuTGZwX3JldHVybl92YWx1ZQorCXN0ZAklcjMsIDAoJXIzMCkKKwkvKiBGYWxsIHRocm91Z2guLi4gICovCisKKy5MZG9uZV9yZXR1cm5fdmFsdWU6CisJLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzIHdlIHVzZWQgYW5kIHJldHVybi4gICovCisJbXIJJXIxLCAlcjI4CisJbGQJJXIwLCAxNiglcjI4KQorCWxkCSVyMjgsIC0zMiglcjEpCisJbXRscgklcjAKKwlsZAklcjI5LCAtMjQoJXIxKQorCWxkCSVyMzAsIC0xNiglcjEpCisJbGQJJXIzMSwgLTgoJXIxKQorCWJscgorCisuTGZwX3JldHVybl92YWx1ZToKKwliZgkyOCwgLkxmbG9hdF9yZXR1cm5fdmFsdWUKKwlzdGZkCSVmMSwgMCglcjMwKQorCW10Y3JmCTB4MDIsICVyMzEgLyogY3I2ICAqLworCWJmCTI3LCAuTGRvbmVfcmV0dXJuX3ZhbHVlCisJc3RmZAklZjIsIDgoJXIzMCkKKwliCS5MZG9uZV9yZXR1cm5fdmFsdWUKKy5MZmxvYXRfcmV0dXJuX3ZhbHVlOgorCXN0ZnMJJWYxLCAwKCVyMzApCisJYgkuTGRvbmVfcmV0dXJuX3ZhbHVlCisuTEZFMToKKwkubG9uZwkwCisJLmJ5dGUJMCwxMiwwLDEsMTI4LDQsMCwwCisJLnNpemUJLmZmaV9jYWxsX0xJTlVYNjQsLi0uZmZpX2NhbGxfTElOVVg2NAorCisJLnNlY3Rpb24JLmVoX2ZyYW1lLEVIX0ZSQU1FX0ZMQUdTLEBwcm9nYml0cworLkxmcmFtZTE6CisJLjRieXRlCS5MRUNJRTEtLkxTQ0lFMQkgIyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5CisuTFNDSUUxOgorCS40Ynl0ZQkweDAJICMgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCSAjIENJRSBWZXJzaW9uCisJLmFzY2lpICJ6UlwwIgkgIyBDSUUgQXVnbWVudGF0aW9uCisJLnVsZWIxMjggMHgxCSAjIENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IKKwkuc2xlYjEyOCAtOAkgIyBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJMHg0MQkgIyBDSUUgUkEgQ29sdW1uCisJLnVsZWIxMjggMHgxCSAjIEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHgxNAkgIyBGREUgRW5jb2RpbmcgKHBjcmVsIHVkYXRhOCkKKwkuYnl0ZQkweGMJICMgRFdfQ0ZBX2RlZl9jZmEKKwkudWxlYjEyOCAweDEKKwkudWxlYjEyOCAweDAKKwkuYWxpZ24gMworLkxFQ0lFMToKKy5MU0ZERTE6CisJLjRieXRlCS5MRUZERTEtLkxBU0ZERTEJICMgRkRFIExlbmd0aAorLkxBU0ZERTE6CisJLjRieXRlCS5MQVNGREUxLS5MZnJhbWUxCSAjIEZERSBDSUUgb2Zmc2V0CisJLjhieXRlCS5MRkIxLS4JICMgRkRFIGluaXRpYWwgbG9jYXRpb24KKwkuOGJ5dGUJLkxGRTEtLkxGQjEJICMgRkRFIGFkZHJlc3MgcmFuZ2UKKwkudWxlYjEyOCAweDAJICMgQXVnbWVudGF0aW9uIHNpemUKKwkuYnl0ZQkweDIJICMgRFdfQ0ZBX2FkdmFuY2VfbG9jMQorCS5ieXRlCS5MQ0ZJMC0uTEZCMQorCS5ieXRlCTB4ZAkgIyBEV19DRkFfZGVmX2NmYV9yZWdpc3RlcgorCS51bGViMTI4IDB4MWMKKwkuYnl0ZQkweDExCSAjIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YKKwkudWxlYjEyOCAweDQxCisJLnNsZWIxMjggLTIKKwkuYnl0ZQkweDlmCSAjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDFmCisJLnVsZWIxMjggMHgxCisJLmJ5dGUJMHg5ZQkgIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHgxZQorCS51bGViMTI4IDB4MgorCS5ieXRlCTB4OWQJICMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4MWQKKwkudWxlYjEyOCAweDMKKwkuYnl0ZQkweDljCSAjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDFjCisJLnVsZWIxMjggMHg0CisJLmFsaWduIDMKKy5MRUZERTE6CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19FTEZfXyAmJiBkZWZpbmVkIF9fbGludXhfXworCS5zZWN0aW9uCS5ub3RlLkdOVS1zdGFjaywiIixAcHJvZ2JpdHMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL2xpbnV4NjRfY2xvc3VyZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWEyYzkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3Bvd2VycGMvbGludXg2NF9jbG9zdXJlLlMKQEAgLTAsMCArMSwyMzYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBzeXN2LmggLSBDb3B5cmlnaHQgKGMpIDIwMDMgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4KKwkgICAgQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQsIEluYy4KKworICAgUG93ZXJQQzY0IEFzc2VtYmx5IGdsdWUuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworCS5maWxlCSJsaW51eDY0X2Nsb3N1cmUuUyIKKworI2lmZGVmIF9fcG93ZXJwYzY0X18KKwlGRklfSElEREVOIChmZmlfY2xvc3VyZV9MSU5VWDY0KQorCUZGSV9ISURERU4gKC5mZmlfY2xvc3VyZV9MSU5VWDY0KQorCS5nbG9ibCAgZmZpX2Nsb3N1cmVfTElOVVg2NCwgLmZmaV9jbG9zdXJlX0xJTlVYNjQKKwkuc2VjdGlvbiAgICAgICAgIi5vcGQiLCJhdyIKKwkuYWxpZ24gIDMKK2ZmaV9jbG9zdXJlX0xJTlVYNjQ6CisJLnF1YWQgICAuZmZpX2Nsb3N1cmVfTElOVVg2NCwuVE9DLkB0b2NiYXNlLDAKKwkuc2l6ZSAgIGZmaV9jbG9zdXJlX0xJTlVYNjQsMjQKKwkudHlwZSAgIC5mZmlfY2xvc3VyZV9MSU5VWDY0LEBmdW5jdGlvbgorCS50ZXh0CisuZmZpX2Nsb3N1cmVfTElOVVg2NDoKKy5MRkIxOgorCSMgc2F2ZSBnZW5lcmFsIHJlZ3MgaW50byBwYXJtIHNhdmUgYXJlYQorCXN0ZAklcjMsIDQ4KCVyMSkKKwlzdGQJJXI0LCA1NiglcjEpCisJc3RkCSVyNSwgNjQoJXIxKQorCXN0ZAklcjYsIDcyKCVyMSkKKwltZmxyCSVyMAorCisJc3RkCSVyNywgODAoJXIxKQorCXN0ZAklcjgsIDg4KCVyMSkKKwlzdGQJJXI5LCA5NiglcjEpCisJc3RkCSVyMTAsIDEwNCglcjEpCisJc3RkCSVyMCwgMTYoJXIxKQorCisJIyBtYW5kYXRvcnkgNDggYnl0ZXMgc3BlY2lhbCByZWcgc2F2ZSBhcmVhICsgNjQgYnl0ZXMgcGFybSBzYXZlIGFyZWEKKwkjICsgMTYgYnl0ZXMgcmV0dmFsIGFyZWEgKyAxMyo4IGJ5dGVzIGZwciBzYXZlIGFyZWEgKyByb3VuZCB0byAxNgorCXN0ZHUJJXIxLCAtMjQwKCVyMSkKKy5MQ0ZJMDoKKworCSMgbmV4dCBzYXZlIGZwciAxIHRvIGZwciAxMworCXN0ZmQgICVmMSwgMTI4KygwKjgpKCVyMSkKKwlzdGZkICAlZjIsIDEyOCsoMSo4KSglcjEpCisJc3RmZCAgJWYzLCAxMjgrKDIqOCkoJXIxKQorCXN0ZmQgICVmNCwgMTI4KygzKjgpKCVyMSkKKwlzdGZkICAlZjUsIDEyOCsoNCo4KSglcjEpCisJc3RmZCAgJWY2LCAxMjgrKDUqOCkoJXIxKQorCXN0ZmQgICVmNywgMTI4Kyg2KjgpKCVyMSkKKwlzdGZkICAlZjgsIDEyOCsoNyo4KSglcjEpCisJc3RmZCAgJWY5LCAxMjgrKDgqOCkoJXIxKQorCXN0ZmQgICVmMTAsIDEyOCsoOSo4KSglcjEpCisJc3RmZCAgJWYxMSwgMTI4KygxMCo4KSglcjEpCisJc3RmZCAgJWYxMiwgMTI4KygxMSo4KSglcjEpCisJc3RmZCAgJWYxMywgMTI4KygxMio4KSglcjEpCisKKwkjIHNldCB1cCByZWdpc3RlcnMgZm9yIHRoZSByb3V0aW5lIHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgd29yaworCSMgZ2V0IHRoZSBjb250ZXh0IHBvaW50ZXIgZnJvbSB0aGUgdHJhbXBvbGluZQorCW1yICVyMywgJXIxMQorCisJIyBub3cgbG9hZCB1cCB0aGUgcG9pbnRlciB0byB0aGUgcmVzdWx0IHN0b3JhZ2UKKwlhZGRpICVyNCwgJXIxLCAxMTIKKworCSMgbm93IGxvYWQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlciBzYXZlIGFyZWEKKwkjIGluIHRoZSBwcmV2aW91cyBmcmFtZQorCWFkZGkgJXI1LCAlcjEsIDI0MCArIDQ4CisKKwkjIG5vdyBsb2FkIHVwIHRoZSBwb2ludGVyIHRvIHRoZSBzYXZlZCBmcHIgcmVnaXN0ZXJzICovCisJYWRkaSAlcjYsICVyMSwgMTI4CisKKwkjIG1ha2UgdGhlIGNhbGwKKwlibCAuZmZpX2Nsb3N1cmVfaGVscGVyX0xJTlVYNjQKKy5McmV0OgorCisJIyBub3cgcjMgY29udGFpbnMgdGhlIHJldHVybiB0eXBlCisJIyBzbyB1c2UgaXQgdG8gbG9vayB1cCBpbiBhIHRhYmxlCisJIyBzbyB3ZSBrbm93IGhvdyB0byBkZWFsIHdpdGggZWFjaCB0eXBlCisKKwkjIGxvb2sgdXAgdGhlIHByb3BlciBzdGFydGluZyBwb2ludCBpbiB0YWJsZQorCSMgYnkgdXNpbmcgcmV0dXJuIHR5cGUgYXMgb2Zmc2V0CisJbWZsciAlcjQJCSMgbW92ZSBhZGRyZXNzIG9mIC5McmV0IHRvIHI0CisJc2xkaSAlcjMsICVyMywgNAkjIG5vdyBtdWx0aXBseSByZXR1cm4gdHlwZSBieSAxNgorCWFkZGkgJXI0LCAlcjQsIC5McmV0X3R5cGUwIC0gLkxyZXQKKwlsZCAlcjAsIDI0MCsxNiglcjEpCisJYWRkICVyMywgJXIzLCAlcjQJIyBhZGQgY29udGVudHMgb2YgdGFibGUgdG8gdGFibGUgYWRkcmVzcworCW10Y3RyICVyMworCWJjdHIJCQkjIGp1bXAgdG8gaXQKKworIyBFYWNoIG9mIHRoZSByZXRfdHlwZVggY29kZSBmcmFnbWVudHMgaGFzIHRvIGJlIGV4YWN0bHkgMTYgYnl0ZXMgbG9uZworIyAoNCBpbnN0cnVjdGlvbnMpLiBGb3IgY2FjaGUgZWZmZWN0aXZlbmVzcyB3ZSBhbGlnbiB0byBhIDE2IGJ5dGUgYm91bmRhcnkKKyMgZmlyc3QuCisJLmFsaWduIDQKKworLkxyZXRfdHlwZTA6CisjIGNhc2UgRkZJX1RZUEVfVk9JRAorCW10bHIgJXIwCisJYWRkaSAlcjEsICVyMSwgMjQwCisJYmxyCisJbm9wCisjIGNhc2UgRkZJX1RZUEVfSU5UCisJbHdhICVyMywgMTEyKzQoJXIxKQorCW10bHIgJXIwCisJYWRkaSAlcjEsICVyMSwgMjQwCisJYmxyCisjIGNhc2UgRkZJX1RZUEVfRkxPQVQKKwlsZnMgJWYxLCAxMTIrMCglcjEpCisJbXRsciAlcjAKKwlhZGRpICVyMSwgJXIxLCAyNDAKKwlibHIKKyMgY2FzZSBGRklfVFlQRV9ET1VCTEUKKwlsZmQgJWYxLCAxMTIrMCglcjEpCisJbXRsciAlcjAKKwlhZGRpICVyMSwgJXIxLCAyNDAKKwlibHIKKyMgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFCisJbGZkICVmMSwgMTEyKzAoJXIxKQorCW10bHIgJXIwCisJbGZkICVmMiwgMTEyKzgoJXIxKQorCWIgLkxmaW5pc2gKKyMgY2FzZSBGRklfVFlQRV9VSU5UOAorCWxieiAlcjMsIDExMis3KCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCAlcjEsIDI0MAorCWJscgorIyBjYXNlIEZGSV9UWVBFX1NJTlQ4CisJbGJ6ICVyMywgMTEyKzcoJXIxKQorCWV4dHNiICVyMywlcjMKKwltdGxyICVyMAorCWIgLkxmaW5pc2gKKyMgY2FzZSBGRklfVFlQRV9VSU5UMTYKKwlsaHogJXIzLCAxMTIrNiglcjEpCisJbXRsciAlcjAKKy5MZmluaXNoOgorCWFkZGkgJXIxLCAlcjEsIDI0MAorCWJscgorIyBjYXNlIEZGSV9UWVBFX1NJTlQxNgorCWxoYSAlcjMsIDExMis2KCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCAlcjEsIDI0MAorCWJscgorIyBjYXNlIEZGSV9UWVBFX1VJTlQzMgorCWx3eiAlcjMsIDExMis0KCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCAlcjEsIDI0MAorCWJscgorIyBjYXNlIEZGSV9UWVBFX1NJTlQzMgorCWx3YSAlcjMsIDExMis0KCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCAlcjEsIDI0MAorCWJscgorIyBjYXNlIEZGSV9UWVBFX1VJTlQ2NAorCWxkICVyMywgMTEyKzAoJXIxKQorCW10bHIgJXIwCisJYWRkaSAlcjEsICVyMSwgMjQwCisJYmxyCisjIGNhc2UgRkZJX1RZUEVfU0lOVDY0CisJbGQgJXIzLCAxMTIrMCglcjEpCisJbXRsciAlcjAKKwlhZGRpICVyMSwgJXIxLCAyNDAKKwlibHIKKyMgY2FzZSBGRklfVFlQRV9TVFJVQ1QKKwltdGxyICVyMAorCWFkZGkgJXIxLCAlcjEsIDI0MAorCWJscgorCW5vcAorIyBjYXNlIEZGSV9UWVBFX1BPSU5URVIKKwlsZCAlcjMsIDExMiswKCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCAlcjEsIDI0MAorCWJscgorIyBlc2FjCisuTEZFMToKKwkubG9uZwkwCisJLmJ5dGUJMCwxMiwwLDEsMTI4LDAsMCwwCisJLnNpemUJLmZmaV9jbG9zdXJlX0xJTlVYNjQsLi0uZmZpX2Nsb3N1cmVfTElOVVg2NAorCisJLnNlY3Rpb24JLmVoX2ZyYW1lLEVIX0ZSQU1FX0ZMQUdTLEBwcm9nYml0cworLkxmcmFtZTE6CisJLjRieXRlCS5MRUNJRTEtLkxTQ0lFMQkgIyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5CisuTFNDSUUxOgorCS40Ynl0ZQkweDAJICMgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCSAjIENJRSBWZXJzaW9uCisJLmFzY2lpICJ6UlwwIgkgIyBDSUUgQXVnbWVudGF0aW9uCisJLnVsZWIxMjggMHgxCSAjIENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IKKwkuc2xlYjEyOCAtOAkgIyBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJMHg0MQkgIyBDSUUgUkEgQ29sdW1uCisJLnVsZWIxMjggMHgxCSAjIEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHgxNAkgIyBGREUgRW5jb2RpbmcgKHBjcmVsIHVkYXRhOCkKKwkuYnl0ZQkweGMJICMgRFdfQ0ZBX2RlZl9jZmEKKwkudWxlYjEyOCAweDEKKwkudWxlYjEyOCAweDAKKwkuYWxpZ24gMworLkxFQ0lFMToKKy5MU0ZERTE6CisJLjRieXRlCS5MRUZERTEtLkxBU0ZERTEJICMgRkRFIExlbmd0aAorLkxBU0ZERTE6CisJLjRieXRlCS5MQVNGREUxLS5MZnJhbWUxCSAjIEZERSBDSUUgb2Zmc2V0CisJLjhieXRlCS5MRkIxLS4JICMgRkRFIGluaXRpYWwgbG9jYXRpb24KKwkuOGJ5dGUJLkxGRTEtLkxGQjEJICMgRkRFIGFkZHJlc3MgcmFuZ2UKKwkudWxlYjEyOCAweDAJICMgQXVnbWVudGF0aW9uIHNpemUKKwkuYnl0ZQkweDIJICMgRFdfQ0ZBX2FkdmFuY2VfbG9jMQorCS5ieXRlCS5MQ0ZJMC0uTEZCMQorCS5ieXRlCTB4ZQkgIyBEV19DRkFfZGVmX2NmYV9vZmZzZXQKKwkudWxlYjEyOCAyNDAKKwkuYnl0ZQkweDExCSAjIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YKKwkudWxlYjEyOCAweDQxCisJLnNsZWIxMjggLTIKKwkuYWxpZ24gMworLkxFRkRFMToKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX0VMRl9fICYmIGRlZmluZWQgX19saW51eF9fCisJLnNlY3Rpb24JLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcG93ZXJwYy9wcGNfY2xvc3VyZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjdkMWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3Bvd2VycGMvcHBjX2Nsb3N1cmUuUwpAQCAtMCwwICsxLDMyNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHN5c3YuaCAtIENvcHlyaWdodCAoYykgMjAwMyBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPgorCSAgICBDb3B5cmlnaHQgKGMpIDIwMDggUmVkIEhhdCwgSW5jLgorCisgICBQb3dlclBDIEFzc2VtYmx5IGdsdWUuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxwb3dlcnBjL2FzbS5oPgorCisJLmZpbGUgICAicHBjX2Nsb3N1cmUuUyIKKworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCisKK0VOVFJZKGZmaV9jbG9zdXJlX1NZU1YpCisuTEZCMToKKwlzdHd1ICVyMSwtMTQ0KCVyMSkKKy5MQ0ZJMDoKKwltZmxyICVyMAorLkxDRkkxOgorCXN0dyAlcjAsMTQ4KCVyMSkKKworIyB3ZSB3YW50IHRvIGJ1aWxkIHVwIGFuIGFyZWFzIGZvciB0aGUgcGFyYW1ldGVycyBwYXNzZWQKKyMgaW4gcmVnaXN0ZXJzIChib3RoIGZsb2F0aW5nIHBvaW50IGFuZCBpbnRlZ2VyKQorCisJIyBzbyBmaXJzdCBzYXZlIGdwciAzIHRvIGdwciAxMCAoYWxpZ25lZCB0byA0KQorCXN0dyAgICVyMywgMTYoJXIxKQorCXN0dyAgICVyNCwgMjAoJXIxKQorCXN0dyAgICVyNSwgMjQoJXIxKQorCXN0dyAgICVyNiwgMjgoJXIxKQorCXN0dyAgICVyNywgMzIoJXIxKQorCXN0dyAgICVyOCwgMzYoJXIxKQorCXN0dyAgICVyOSwgNDAoJXIxKQorCXN0dyAgICVyMTAsNDQoJXIxKQorCisjaWZuZGVmIF9fTk9fRlBSU19fCisJIyBuZXh0IHNhdmUgZnByIDEgdG8gZnByIDggKGFsaWduZWQgdG8gOCkKKwlzdGZkICAlZjEsIDQ4KCVyMSkKKwlzdGZkICAlZjIsIDU2KCVyMSkKKwlzdGZkICAlZjMsIDY0KCVyMSkKKwlzdGZkICAlZjQsIDcyKCVyMSkKKwlzdGZkICAlZjUsIDgwKCVyMSkKKwlzdGZkICAlZjYsIDg4KCVyMSkKKwlzdGZkICAlZjcsIDk2KCVyMSkKKwlzdGZkICAlZjgsIDEwNCglcjEpCisjZW5kaWYKKworCSMgc2V0IHVwIHJlZ2lzdGVycyBmb3IgdGhlIHJvdXRpbmUgdGhhdCBhY3R1YWxseSBkb2VzIHRoZSB3b3JrCisJIyBnZXQgdGhlIGNvbnRleHQgcG9pbnRlciBmcm9tIHRoZSB0cmFtcG9saW5lCisJbXIgJXIzLCVyMTEKKworCSMgbm93IGxvYWQgdXAgdGhlIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBzdG9yYWdlCisJYWRkaSAlcjQsJXIxLDExMgorCisJIyBub3cgbG9hZCB1cCB0aGUgcG9pbnRlciB0byB0aGUgc2F2ZWQgZ3ByIHJlZ2lzdGVycworCWFkZGkgJXI1LCVyMSwxNgorCisJIyBub3cgbG9hZCB1cCB0aGUgcG9pbnRlciB0byB0aGUgc2F2ZWQgZnByIHJlZ2lzdGVycyAqLworCWFkZGkgJXI2LCVyMSw0OAorCisJIyBub3cgbG9hZCB1cCB0aGUgcG9pbnRlciB0byB0aGUgb3V0Z29pbmcgcGFyYW1ldGVyCisJIyBzdGFjayBpbiB0aGUgcHJldmlvdXMgZnJhbWUKKwkjIGkuZS4gdGhlIHByZXZpb3VzIGZyYW1lIHBvaW50ZXIgKyA4CisJYWRkaSAlcjcsJXIxLDE1MgorCisJIyBtYWtlIHRoZSBjYWxsCisJYmwgZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1ZAbG9jYWwKKy5McmV0OgorCSMgbm93IHIzIGNvbnRhaW5zIHRoZSByZXR1cm4gdHlwZQorCSMgc28gdXNlIGl0IHRvIGxvb2sgdXAgaW4gYSB0YWJsZQorCSMgc28gd2Uga25vdyBob3cgdG8gZGVhbCB3aXRoIGVhY2ggdHlwZQorCisJIyBsb29rIHVwIHRoZSBwcm9wZXIgc3RhcnRpbmcgcG9pbnQgaW4gdGFibGUKKwkjIGJ5IHVzaW5nIHJldHVybiB0eXBlIGFzIG9mZnNldAorCisJbWZsciAlcjQJCSMgbW92ZSBhZGRyZXNzIG9mIC5McmV0IHRvIHI0CisJc2x3aSAlcjMsJXIzLDQJCSMgbm93IG11bHRpcGx5IHJldHVybiB0eXBlIGJ5IDE2CisJYWRkaSAlcjQsICVyNCwgLkxyZXRfdHlwZTAgLSAuTHJldAorCWx3eiAlcjAsMTQ4KCVyMSkKKwlhZGQgJXIzLCVyMywlcjQJCSMgYWRkIGNvbnRlbnRzIG9mIHRhYmxlIHRvIHRhYmxlIGFkZHJlc3MKKwltdGN0ciAlcjMKKwliY3RyCQkJIyBqdW1wIHRvIGl0CisuTEZFMToKKworIyBFYWNoIG9mIHRoZSByZXRfdHlwZVggY29kZSBmcmFnbWVudHMgaGFzIHRvIGJlIGV4YWN0bHkgMTYgYnl0ZXMgbG9uZworIyAoNCBpbnN0cnVjdGlvbnMpLiBGb3IgY2FjaGUgZWZmZWN0aXZlbmVzcyB3ZSBhbGlnbiB0byBhIDE2IGJ5dGUgYm91bmRhcnkKKyMgZmlyc3QuCisJLmFsaWduIDQKKyMgY2FzZSBGRklfVFlQRV9WT0lECisuTHJldF90eXBlMDoKKwltdGxyICVyMAorCWFkZGkgJXIxLCVyMSwxNDQKKwlibHIKKwlub3AKKworIyBjYXNlIEZGSV9UWVBFX0lOVAorCWx3eiAlcjMsMTEyKzAoJXIxKQorCW10bHIgJXIwCisuTGZpbmlzaDoKKwlhZGRpICVyMSwlcjEsMTQ0CisJYmxyCisKKyMgY2FzZSBGRklfVFlQRV9GTE9BVAorCWxmcyAlZjEsMTEyKzAoJXIxKQorCW10bHIgJXIwCisJYWRkaSAlcjEsJXIxLDE0NAorCWJscgorCisjIGNhc2UgRkZJX1RZUEVfRE9VQkxFCisJbGZkICVmMSwxMTIrMCglcjEpCisJbXRsciAlcjAKKwlhZGRpICVyMSwlcjEsMTQ0CisJYmxyCisKKyMgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFCisJbGZkICVmMSwxMTIrMCglcjEpCisJbGZkICVmMiwxMTIrOCglcjEpCisJbXRsciAlcjAKKwliIC5MZmluaXNoCisKKyMgY2FzZSBGRklfVFlQRV9VSU5UOAorCWxieiAlcjMsMTEyKzMoJXIxKQorCW10bHIgJXIwCisJYWRkaSAlcjEsJXIxLDE0NAorCWJscgorCisjIGNhc2UgRkZJX1RZUEVfU0lOVDgKKwlsYnogJXIzLDExMiszKCVyMSkKKwlleHRzYiAlcjMsJXIzCisJbXRsciAlcjAKKwliIC5MZmluaXNoCisKKyMgY2FzZSBGRklfVFlQRV9VSU5UMTYKKwlsaHogJXIzLDExMisyKCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCVyMSwxNDQKKwlibHIKKworIyBjYXNlIEZGSV9UWVBFX1NJTlQxNgorCWxoYSAlcjMsMTEyKzIoJXIxKQorCW10bHIgJXIwCisJYWRkaSAlcjEsJXIxLDE0NAorCWJscgorCisjIGNhc2UgRkZJX1RZUEVfVUlOVDMyCisJbHd6ICVyMywxMTIrMCglcjEpCisJbXRsciAlcjAKKwlhZGRpICVyMSwlcjEsMTQ0CisJYmxyCisKKyMgY2FzZSBGRklfVFlQRV9TSU5UMzIKKwlsd3ogJXIzLDExMiswKCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCVyMSwxNDQKKwlibHIKKworIyBjYXNlIEZGSV9UWVBFX1VJTlQ2NAorCWx3eiAlcjMsMTEyKzAoJXIxKQorCWx3eiAlcjQsMTEyKzQoJXIxKQorCW10bHIgJXIwCisJYiAuTGZpbmlzaAorCisjIGNhc2UgRkZJX1RZUEVfU0lOVDY0CisJbHd6ICVyMywxMTIrMCglcjEpCisJbHd6ICVyNCwxMTIrNCglcjEpCisJbXRsciAlcjAKKwliIC5MZmluaXNoCisKKyMgY2FzZSBGRklfVFlQRV9TVFJVQ1QKKwltdGxyICVyMAorCWFkZGkgJXIxLCVyMSwxNDQKKwlibHIKKwlub3AKKworIyBjYXNlIEZGSV9UWVBFX1BPSU5URVIKKwlsd3ogJXIzLDExMiswKCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCVyMSwxNDQKKwlibHIKKworIyBjYXNlIEZGSV9UWVBFX1VJTlQxMjgKKwlsd3ogJXIzLDExMiswKCVyMSkKKwlsd3ogJXI0LDExMis0KCVyMSkKKwlsd3ogJXI1LDExMis4KCVyMSkKKwlibCAuTHVpbnQxMjgKKworIyBUaGUgcmV0dXJuIHR5cGVzIGJlbG93IGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgQUJJIHR5cGUgaXMgRkZJX1NZU1YuCisjIGNhc2UgRkZJX1NZU1ZfVFlQRV9TTUFMTF9TVFJVQ1QgKyAxLiBPbmUgYnl0ZSBzdHJ1Y3QuCisJbGJ6ICVyMywxMTIrMCglcjEpCisJbXRsciAlcjAKKwlhZGRpICVyMSwlcjEsMTQ0CisJYmxyCisKKyMgY2FzZSBGRklfU1lTVl9UWVBFX1NNQUxMX1NUUlVDVCArIDIuIFR3byBieXRlIHN0cnVjdC4KKwlsaHogJXIzLDExMiswKCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCVyMSwxNDQKKwlibHIKKworIyBjYXNlIEZGSV9TWVNWX1RZUEVfU01BTExfU1RSVUNUICsgMy4gVGhyZWUgYnl0ZSBzdHJ1Y3QuCisJbHd6ICVyMywxMTIrMCglcjEpCisJc3J3aSAlcjMsJXIzLDgKKwltdGxyICVyMAorCWIgLkxmaW5pc2gKKworIyBjYXNlIEZGSV9TWVNWX1RZUEVfU01BTExfU1RSVUNUICsgNC4gRm91ciBieXRlIHN0cnVjdC4KKwlsd3ogJXIzLDExMiswKCVyMSkKKwltdGxyICVyMAorCWFkZGkgJXIxLCVyMSwxNDQKKwlibHIKKworIyBjYXNlIEZGSV9TWVNWX1RZUEVfU01BTExfU1RSVUNUICsgNS4gRml2ZSBieXRlIHN0cnVjdC4KKwlsd3ogJXIzLDExMiswKCVyMSkKKwlsd3ogJXI0LDExMis0KCVyMSkKKwlsaSAlcjUsMjQKKwliIC5Mc3RydWN0NTY3CisKKyMgY2FzZSBGRklfU1lTVl9UWVBFX1NNQUxMX1NUUlVDVCArIDYuIFNpeCBieXRlIHN0cnVjdC4KKwlsd3ogJXIzLDExMiswKCVyMSkKKwlsd3ogJXI0LDExMis0KCVyMSkKKwlsaSAlcjUsMTYKKwliIC5Mc3RydWN0NTY3CisKKyMgY2FzZSBGRklfU1lTVl9UWVBFX1NNQUxMX1NUUlVDVCArIDcuIFNldmVuIGJ5dGUgc3RydWN0LgorCWx3eiAlcjMsMTEyKzAoJXIxKQorCWx3eiAlcjQsMTEyKzQoJXIxKQorCWxpICVyNSw4CisJYiAuTHN0cnVjdDU2NworCisjIGNhc2UgRkZJX1NZU1ZfVFlQRV9TTUFMTF9TVFJVQ1QgKyA4LiBFaWdodCBieXRlIHN0cnVjdC4KKwlsd3ogJXIzLDExMiswKCVyMSkKKwlsd3ogJXI0LDExMis0KCVyMSkKKwltdGxyICVyMAorCWIgLkxmaW5pc2gKKworLkxzdHJ1Y3Q1Njc6CisJc3ViZmljICVyNiwlcjUsMzIKKwlzcncgJXI0LCVyNCwlcjUKKwlzbHcgJXI2LCVyMywlcjYKKwlzcncgJXIzLCVyMywlcjUKKwlvciAlcjQsJXI2LCVyNAorCW10bHIgJXIwCisJYWRkaSAlcjEsJXIxLDE0NAorCWJscgorCisuTHVpbnQxMjg6CisJbHd6ICVyNiwxMTIrMTIoJXIxKQorCW10bHIgJXIwCisJYWRkaSAlcjEsJXIxLDE0NAorCWJscgorCitFTkQoZmZpX2Nsb3N1cmVfU1lTVikKKworCS5zZWN0aW9uCSIuZWhfZnJhbWUiLEVIX0ZSQU1FX0ZMQUdTLEBwcm9nYml0cworLkxmcmFtZTE6CisJLjRieXRlCS5MRUNJRTEtLkxTQ0lFMQkgIyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5CisuTFNDSUUxOgorCS40Ynl0ZQkweDAJICMgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCSAjIENJRSBWZXJzaW9uCisjaWYgZGVmaW5lZCBfUkVMT0NBVEFCTEUgfHwgZGVmaW5lZCBfX1BJQ19fCisJLmFzY2lpICJ6UlwwIgkgIyBDSUUgQXVnbWVudGF0aW9uCisjZWxzZQorCS5hc2NpaSAiXDAiCSAjIENJRSBBdWdtZW50YXRpb24KKyNlbmRpZgorCS51bGViMTI4IDB4MQkgIyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yCisJLnNsZWIxMjggLTQJICMgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvcgorCS5ieXRlCTB4NDEJICMgQ0lFIFJBIENvbHVtbgorI2lmIGRlZmluZWQgX1JFTE9DQVRBQkxFIHx8IGRlZmluZWQgX19QSUNfXworCS51bGViMTI4IDB4MQkgIyBBdWdtZW50YXRpb24gc2l6ZQorCS5ieXRlCTB4MWIJICMgRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpCisjZW5kaWYKKwkuYnl0ZQkweGMJICMgRFdfQ0ZBX2RlZl9jZmEKKwkudWxlYjEyOCAweDEKKwkudWxlYjEyOCAweDAKKwkuYWxpZ24gMgorLkxFQ0lFMToKKy5MU0ZERTE6CisJLjRieXRlCS5MRUZERTEtLkxBU0ZERTEJICMgRkRFIExlbmd0aAorLkxBU0ZERTE6CisJLjRieXRlCS5MQVNGREUxLS5MZnJhbWUxCSAjIEZERSBDSUUgb2Zmc2V0CisjaWYgZGVmaW5lZCBfUkVMT0NBVEFCTEUgfHwgZGVmaW5lZCBfX1BJQ19fCisJLjRieXRlCS5MRkIxLS4JICMgRkRFIGluaXRpYWwgbG9jYXRpb24KKyNlbHNlCisJLjRieXRlCS5MRkIxCSAjIEZERSBpbml0aWFsIGxvY2F0aW9uCisjZW5kaWYKKwkuNGJ5dGUJLkxGRTEtLkxGQjEJICMgRkRFIGFkZHJlc3MgcmFuZ2UKKyNpZiBkZWZpbmVkIF9SRUxPQ0FUQUJMRSB8fCBkZWZpbmVkIF9fUElDX18KKwkudWxlYjEyOCAweDAJICMgQXVnbWVudGF0aW9uIHNpemUKKyNlbmRpZgorCS5ieXRlCTB4NAkgIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLjRieXRlCS5MQ0ZJMC0uTEZCMQorCS5ieXRlCTB4ZQkgIyBEV19DRkFfZGVmX2NmYV9vZmZzZXQKKwkudWxlYjEyOCAxNDQKKwkuYnl0ZQkweDQJICMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS40Ynl0ZQkuTENGSTEtLkxDRkkwCisJLmJ5dGUJMHgxMQkgIyBEV19DRkFfb2Zmc2V0X2V4dGVuZGVkX3NmCisJLnVsZWIxMjggMHg0MQorCS5zbGViMTI4IC0xCisJLmFsaWduIDIKKy5MRUZERTE6CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX0VMRl9fICYmIGRlZmluZWQgX19saW51eF9fCisJLnNlY3Rpb24JLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3Bvd2VycGMvc3lzdi5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL3N5c3YuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmVhMjJiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9wb3dlcnBjL3N5c3YuUwpAQCAtMCwwICsxLDIxOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHN5c3YuUyAtIENvcHlyaWdodCAoYykgMTk5OCBHZW9mZnJleSBLZWF0aW5nCisgICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMKKworICAgUG93ZXJQQyBBc3NlbWJseSBnbHVlLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxwb3dlcnBjL2FzbS5oPgorCisjaWZuZGVmIF9fcG93ZXJwYzY0X18KKwkuZ2xvYmwgZmZpX3ByZXBfYXJnc19TWVNWCitFTlRSWShmZmlfY2FsbF9TWVNWKQorLkxGQjE6CisJLyogU2F2ZSB0aGUgb2xkIHN0YWNrIHBvaW50ZXIgYXMgQVAuICAqLworCW1yCSVyOCwlcjEKKworLkxDRkkwOgorCS8qIEFsbG9jYXRlIHRoZSBzdGFjayBzcGFjZSB3ZSBuZWVkLiAgKi8KKwlzdHd1eAklcjEsJXIxLCVyNAorCS8qIFNhdmUgcmVnaXN0ZXJzIHdlIHVzZS4gICovCisJbWZscgklcjkKKwlzdHcJJXIyOCwtMTYoJXI4KQorLkxDRkkxOgorCXN0dwklcjI5LC0xMiglcjgpCisuTENGSTI6CisJc3R3CSVyMzAsIC04KCVyOCkKKy5MQ0ZJMzoKKwlzdHcJJXIzMSwgLTQoJXI4KQorLkxDRkk0OgorCXN0dwklcjksICAgNCglcjgpCisuTENGSTU6CisKKwkvKiBTYXZlIGFyZ3VtZW50cyBvdmVyIGNhbGwuLi4gICovCisJbXIJJXIzMSwlcjUJLyogZmxhZ3MsICovCisJbXIJJXIzMCwlcjYJLyogcnZhbHVlLCAqLworCW1yCSVyMjksJXI3CS8qIGZ1bmN0aW9uIGFkZHJlc3MsICovCisJbXIJJXIyOCwlcjgJLyogb3VyIEFQLiAqLworLkxDRkk2OgorCisJLyogQ2FsbCBmZmlfcHJlcF9hcmdzX1NZU1YuICAqLworCW1yCSVyNCwlcjEKKwlibAlmZmlfcHJlcF9hcmdzX1NZU1ZAbG9jYWwKKworCS8qIE5vdyBkbyB0aGUgY2FsbC4gICovCisJLyogU2V0IHVwIGNyMSB3aXRoIGJpdHMgNC03IG9mIHRoZSBmbGFncy4gICovCisJbXRjcmYJMHg0MCwlcjMxCisJLyogR2V0IHRoZSBhZGRyZXNzIHRvIGNhbGwgaW50byBDVFIuICAqLworCW10Y3RyCSVyMjkKKwkvKiBMb2FkIGFsbCB0aG9zZSBhcmd1bWVudCByZWdpc3RlcnMuICAqLworCWx3egklcjMsLTE2LSg4KjQpKCVyMjgpCisJbHd6CSVyNCwtMTYtKDcqNCkoJXIyOCkKKwlsd3oJJXI1LC0xNi0oNio0KSglcjI4KQorCWx3egklcjYsLTE2LSg1KjQpKCVyMjgpCisJYmYtCTUsMWYKKwlub3AKKwlsd3oJJXI3LC0xNi0oNCo0KSglcjI4KQorCWx3egklcjgsLTE2LSgzKjQpKCVyMjgpCisJbHd6CSVyOSwtMTYtKDIqNCkoJXIyOCkKKwlsd3oJJXIxMCwtMTYtKDEqNCkoJXIyOCkKKwlub3AKKzE6CisKKwkvKiBMb2FkIGFsbCB0aGUgRlAgcmVnaXN0ZXJzLiAgKi8KKwliZi0JNiwyZgorCWxmZAklZjEsLTE2LSg4KjQpLSg4KjgpKCVyMjgpCisJbGZkCSVmMiwtMTYtKDgqNCktKDcqOCkoJXIyOCkKKwlsZmQJJWYzLC0xNi0oOCo0KS0oNio4KSglcjI4KQorCWxmZAklZjQsLTE2LSg4KjQpLSg1KjgpKCVyMjgpCisJbm9wCisJbGZkCSVmNSwtMTYtKDgqNCktKDQqOCkoJXIyOCkKKwlsZmQJJWY2LC0xNi0oOCo0KS0oMyo4KSglcjI4KQorCWxmZAklZjcsLTE2LSg4KjQpLSgyKjgpKCVyMjgpCisJbGZkCSVmOCwtMTYtKDgqNCktKDEqOCkoJXIyOCkKKzI6CisKKwkvKiBNYWtlIHRoZSBjYWxsLiAgKi8KKwliY3RybAorCisJLyogTm93LCBkZWFsIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gICovCisJbXRjcmYJMHgwMSwlcjMxIC8qIGNyNyAgKi8KKwlidC0JMzEsTChzbWFsbF9zdHJ1Y3RfcmV0dXJuX3ZhbHVlKQorCWJ0LQkzMCxMKGRvbmVfcmV0dXJuX3ZhbHVlKQorCWJ0LQkyOSxMKGZwX3JldHVybl92YWx1ZSkKKwlzdHcJJXIzLDAoJXIzMCkKKwliZisJMjgsTChkb25lX3JldHVybl92YWx1ZSkKKwlzdHcJJXI0LDQoJXIzMCkKKwltdGNyZgkweDAyLCVyMzEgLyogY3I2ICAqLworCWJmCTI3LEwoZG9uZV9yZXR1cm5fdmFsdWUpCisJc3R3ICAgICAlcjUsOCglcjMwKQorCXN0dwklcjYsMTIoJXIzMCkKKwkvKiBGYWxsIHRocm91Z2guLi4gICovCisKK0woZG9uZV9yZXR1cm5fdmFsdWUpOgorCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVycyB3ZSB1c2VkIGFuZCByZXR1cm4uICAqLworCWx3egklcjksICAgNCglcjI4KQorCWx3egklcjMxLCAtNCglcjI4KQorCW10bHIJJXI5CisJbHd6CSVyMzAsIC04KCVyMjgpCisJbHd6CSVyMjksLTEyKCVyMjgpCisJbHd6CSVyMjgsLTE2KCVyMjgpCisJbHd6CSVyMSwwKCVyMSkKKwlibHIKKworTChmcF9yZXR1cm5fdmFsdWUpOgorCWJmCTI4LEwoZmxvYXRfcmV0dXJuX3ZhbHVlKQorCXN0ZmQJJWYxLDAoJXIzMCkKKwltdGNyZiAgIDB4MDIsJXIzMSAvKiBjcjYgICovCisJYmYJMjcsTChkb25lX3JldHVybl92YWx1ZSkKKwlzdGZkCSVmMiw4KCVyMzApCisJYglMKGRvbmVfcmV0dXJuX3ZhbHVlKQorTChmbG9hdF9yZXR1cm5fdmFsdWUpOgorCXN0ZnMJJWYxLDAoJXIzMCkKKwliCUwoZG9uZV9yZXR1cm5fdmFsdWUpCisKK0woc21hbGxfc3RydWN0X3JldHVybl92YWx1ZSk6CisJZXh0cndpCSVyNiwlcjMxLDIsMTkgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgcGFkZGluZyA9IHNoaWZ0LzggKi8KKwltdGNyZgkweDAyLCVyMzEJICAgICAgLyogY29weSBmbGFncyB0byBjclsyNDoyN10gKGNyNikgKi8KKwlleHRyd2kJJXI1LCVyMzEsNSwxOSAgICAgICAgIC8qIHI1IDwtIG51bWJlciBvZiBiaXRzIG9mIHBhZGRpbmcgKi8KKwlzdWJmaWMgICVyNiwlcjYsNCAgICAgICAgICAgICAvKiByNiA8LSBudW1iZXIgb2YgdXNlZnVsIGJ5dGVzIGluIHIzICovCisJYmYtCTI1LEwoZG9uZV9yZXR1cm5fdmFsdWUpIC8qIHN0cnVjdCBpbiByMyA/IGlmIG5vdCwgZG9uZS4gKi8KKy8qIHNtc3Rfb25lX3JlZ2lzdGVyOiAqLworCXNsdwklcjMsJXIzLCVyNSAgICAgICAgICAgLyogTGVmdC1qdXN0aWZ5IHZhbHVlIGluIHIzICovCisJbXR4ZXIJJXI2ICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgYnl0ZSBjb3VudCB0byBYRVIgLi4uICovCisJc3Rzd3gJJXIzLDAsJXIzMCAgICAgICAgICAgIC8qIC4uLiBhbmQgc3RvcmUgdGhhdCBtYW55IGJ5dGVzICovCisJYmYrCTI2LEwoZG9uZV9yZXR1cm5fdmFsdWUpICAvKiBzdHJ1Y3QgaW4gcjM6cjQgPyAqLworCWFkZAklcjYsJXI2LCVyMzAgICAgICAgICAgLyogYWRqdXN0IHBvaW50ZXIgKi8KKwlzdHN3aQklcjQsJXI2LDQgICAgICAgICAgICAgLyogc3RvcmUgbGFzdCBmb3VyIGJ5dGVzICovCisJYglMKGRvbmVfcmV0dXJuX3ZhbHVlKQorCisuTEZFMToKK0VORChmZmlfY2FsbF9TWVNWKQorCisgICAgICAuc2VjdGlvbgkiLmVoX2ZyYW1lIixFSF9GUkFNRV9GTEFHUyxAcHJvZ2JpdHMKKy5MZnJhbWUxOgorICAgICAgLjRieXRlICAgIC5MRUNJRTEtLkxTQ0lFMSAgLyogIExlbmd0aCBvZiBDb21tb24gSW5mb3JtYXRpb24gRW50cnkgKi8KKy5MU0NJRTE6CisgICAgICAuNGJ5dGUgICAgMHgwICAgICAgLyogIENJRSBJZGVudGlmaWVyIFRhZyAqLworICAgICAgLmJ5dGUgICAgIDB4MSAgICAgIC8qICBDSUUgVmVyc2lvbiAqLworI2lmIGRlZmluZWQgX1JFTE9DQVRBQkxFIHx8IGRlZmluZWQgX19QSUNfXworICAgICAgLmFzY2lpCSJ6UlwwIiAgIC8qICBDSUUgQXVnbWVudGF0aW9uICovCisjZWxzZQorICAgICAgLmFzY2lpCSJcMCIJIC8qICBDSUUgQXVnbWVudGF0aW9uICovCisjZW5kaWYKKyAgICAgIC51bGViMTI4ICAweDEgICAgICAvKiAgQ0lFIENvZGUgQWxpZ25tZW50IEZhY3RvciAqLworICAgICAgLnNsZWIxMjggIC00CSAvKiAgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvciAqLworICAgICAgLmJ5dGUgICAgIDB4NDEgICAgIC8qICBDSUUgUkEgQ29sdW1uICovCisjaWYgZGVmaW5lZCBfUkVMT0NBVEFCTEUgfHwgZGVmaW5lZCBfX1BJQ19fCisgICAgICAudWxlYjEyOCAgMHgxICAgICAgLyogIEF1Z21lbnRhdGlvbiBzaXplICovCisgICAgICAuYnl0ZQkweDFiCSAvKiAgRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpICovCisjZW5kaWYKKyAgICAgIC5ieXRlICAgICAweGMgICAgICAvKiAgRFdfQ0ZBX2RlZl9jZmEgKi8KKyAgICAgIC51bGViMTI4ICAweDEKKyAgICAgIC51bGViMTI4ICAweDAKKyAgICAgIC5hbGlnbiAyCisuTEVDSUUxOgorLkxTRkRFMToKKyAgICAgIC40Ynl0ZSAgICAuTEVGREUxLS5MQVNGREUxICAgICAgICAgLyogIEZERSBMZW5ndGggKi8KKy5MQVNGREUxOgorICAgICAgLjRieXRlICAgIC5MQVNGREUxLS5MZnJhbWUxICAgICAgICAgLyogIEZERSBDSUUgb2Zmc2V0ICovCisjaWYgZGVmaW5lZCBfUkVMT0NBVEFCTEUgfHwgZGVmaW5lZCBfX1BJQ19fCisgICAgICAuNGJ5dGUgICAgLkxGQjEtLiAgLyogIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisjZWxzZQorICAgICAgLjRieXRlICAgIC5MRkIxICAgIC8qICBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLworI2VuZGlmCisgICAgICAuNGJ5dGUgICAgLkxGRTEtLkxGQjEgICAgICAvKiAgRkRFIGFkZHJlc3MgcmFuZ2UgKi8KKyNpZiBkZWZpbmVkIF9SRUxPQ0FUQUJMRSB8fCBkZWZpbmVkIF9fUElDX18KKyAgICAgIC51bGViMTI4ICAweDAJIC8qICBBdWdtZW50YXRpb24gc2l6ZSAqLworI2VuZGlmCisgICAgICAuYnl0ZSAgICAgMHg0ICAgICAgLyogIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKyAgICAgIC40Ynl0ZSAgICAuTENGSTAtLkxGQjEKKyAgICAgIC5ieXRlICAgICAweGQgICAgICAvKiAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgKi8KKyAgICAgIC51bGViMTI4ICAweDA4CisgICAgICAuYnl0ZSAgICAgMHg0ICAgICAgLyogIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKyAgICAgIC40Ynl0ZSAgICAuTENGSTUtLkxDRkkwCisgICAgICAuYnl0ZSAgICAgMHgxMSAgICAgLyogIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YgKi8KKyAgICAgIC51bGViMTI4ICAweDQxCisgICAgICAuc2xlYjEyOCAgLTEKKyAgICAgIC5ieXRlICAgICAweDlmICAgICAvKiAgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4MWYgKi8KKyAgICAgIC51bGViMTI4ICAweDEKKyAgICAgIC5ieXRlICAgICAweDllICAgICAvKiAgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4MWUgKi8KKyAgICAgIC51bGViMTI4ICAweDIKKyAgICAgIC5ieXRlICAgICAweDlkICAgICAvKiAgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4MWQgKi8KKyAgICAgIC51bGViMTI4ICAweDMKKyAgICAgIC5ieXRlICAgICAweDljICAgICAvKiAgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4MWMgKi8KKyAgICAgIC51bGViMTI4ICAweDQKKyAgICAgIC5ieXRlICAgICAweDQgICAgICAvKiAgRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworICAgICAgLjRieXRlICAgIC5MQ0ZJNi0uTENGSTUKKyAgICAgIC5ieXRlICAgICAweGQgICAgICAvKiAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgKi8KKyAgICAgIC51bGViMTI4ICAweDFjCisgICAgICAuYWxpZ24gMgorLkxFRkRFMToKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX0VMRl9fICYmIGRlZmluZWQgX19saW51eF9fCisJLnNlY3Rpb24JLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3ByZXBfY2lmLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3ByZXBfY2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0OGNmZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcHJlcF9jaWYuYwpAQCAtMCwwICsxLDE3NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHByZXBfY2lmLmMgLSBDb3B5cmlnaHQgKGMpIDIwMTEgIEFudGhvbnkgR3JlZW4KKyAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTgsIDIwMDcgIFJlZCBIYXQsIEluYy4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogUm91bmQgdXAgdG8gRkZJX1NJWkVPRl9BUkcuICovCisKKyNkZWZpbmUgU1RBQ0tfQVJHX1NJWkUoeCkgQUxJR04oeCwgRkZJX1NJWkVPRl9BUkcpCisKKy8qIFBlcmZvcm0gbWFjaGluZSBpbmRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBvZiBhZ2dyZWdhdGUgdHlwZQorICAgc3BlY2lmaWNhdGlvbnMuICovCisKK3N0YXRpYyBmZmlfc3RhdHVzIGluaXRpYWxpemVfYWdncmVnYXRlKGZmaV90eXBlICphcmcpCit7CisgIGZmaV90eXBlICoqcHRyOworCisgIGlmIChVTkxJS0VMWShhcmcgPT0gTlVMTCB8fCBhcmctPmVsZW1lbnRzID09IE5VTEwpKQorICAgIHJldHVybiBGRklfQkFEX1RZUEVERUY7CisKKyAgYXJnLT5zaXplID0gMDsKKyAgYXJnLT5hbGlnbm1lbnQgPSAwOworCisgIHB0ciA9ICYoYXJnLT5lbGVtZW50c1swXSk7CisKKyAgaWYgKFVOTElLRUxZKHB0ciA9PSAwKSkKKyAgICByZXR1cm4gRkZJX0JBRF9UWVBFREVGOworCisgIHdoaWxlICgoKnB0cikgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoVU5MSUtFTFkoKCgqcHRyKS0+c2l6ZSA9PSAwKQorCQkgICAgJiYgKGluaXRpYWxpemVfYWdncmVnYXRlKCgqcHRyKSkgIT0gRkZJX09LKSkpCisJcmV0dXJuIEZGSV9CQURfVFlQRURFRjsKKworICAgICAgLyogUGVyZm9ybSBhIHNhbml0eSBjaGVjayBvbiB0aGUgYXJndW1lbnQgdHlwZSAqLworICAgICAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFKCpwdHIpOworCisgICAgICBhcmctPnNpemUgPSBBTElHTihhcmctPnNpemUsICgqcHRyKS0+YWxpZ25tZW50KTsKKyAgICAgIGFyZy0+c2l6ZSArPSAoKnB0ciktPnNpemU7CisKKyAgICAgIGFyZy0+YWxpZ25tZW50ID0gKGFyZy0+YWxpZ25tZW50ID4gKCpwdHIpLT5hbGlnbm1lbnQpID8KKwlhcmctPmFsaWdubWVudCA6ICgqcHRyKS0+YWxpZ25tZW50OworCisgICAgICBwdHIrKzsKKyAgICB9CisKKyAgLyogU3RydWN0dXJlIHNpemUgaW5jbHVkZXMgdGFpbCBwYWRkaW5nLiAgVGhpcyBpcyBpbXBvcnRhbnQgZm9yCisgICAgIHN0cnVjdHVyZXMgdGhhdCBmaXQgaW4gb25lIHJlZ2lzdGVyIG9uIEFCSXMgbGlrZSB0aGUgUG93ZXJQQzY0CisgICAgIExpbnV4IEFCSSB0aGF0IHJpZ2h0IGp1c3RpZnkgc21hbGwgc3RydWN0cyBpbiBhIHJlZ2lzdGVyLgorICAgICBJdCdzIGFsc28gbmVlZGVkIGZvciBuZXN0ZWQgc3RydWN0dXJlIGxheW91dCwgZm9yIGV4YW1wbGUKKyAgICAgc3RydWN0IEEgeyBsb25nIGE7IGNoYXIgYjsgfTsgc3RydWN0IEIgeyBzdHJ1Y3QgQSB4OyBjaGFyIHk7IH07CisgICAgIHNob3VsZCBmaW5kIHkgYXQgYW4gb2Zmc2V0IG9mIDIqc2l6ZW9mKGxvbmcpIGFuZCByZXN1bHQgaW4gYQorICAgICB0b3RhbCBzaXplIG9mIDMqc2l6ZW9mKGxvbmcpLiAgKi8KKyAgYXJnLT5zaXplID0gQUxJR04gKGFyZy0+c2l6ZSwgYXJnLT5hbGlnbm1lbnQpOworCisgIGlmIChhcmctPnNpemUgPT0gMCkKKyAgICByZXR1cm4gRkZJX0JBRF9UWVBFREVGOworICBlbHNlCisgICAgcmV0dXJuIEZGSV9PSzsKK30KKworI2lmbmRlZiBfX0NSSVNfXworLyogVGhlIENSSVMgQUJJIHNwZWNpZmllcyBzdHJ1Y3R1cmUgZWxlbWVudHMgdG8gaGF2ZSBieXRlCisgICBhbGlnbm1lbnQgb25seSwgc28gaXQgY29tcGxldGVseSBvdmVycmlkZXMgdGhpcyBmdW5jdGlvbnMsCisgICB3aGljaCBhc3N1bWVzICJuYXR1cmFsIiBhbGlnbm1lbnQgYW5kIHBhZGRpbmcuICAqLworCisvKiBQZXJmb3JtIG1hY2hpbmUgaW5kZXBlbmRlbnQgZmZpX2NpZiBwcmVwYXJhdGlvbiwgdGhlbiBjYWxsCisgICBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lLiAqLworCitmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZihmZmlfY2lmICpjaWYsIGZmaV9hYmkgYWJpLCB1bnNpZ25lZCBpbnQgbmFyZ3MsCisJCQlmZmlfdHlwZSAqcnR5cGUsIGZmaV90eXBlICoqYXR5cGVzKQoreworICB1bnNpZ25lZCBieXRlcyA9IDA7CisgIHVuc2lnbmVkIGludCBpOworICBmZmlfdHlwZSAqKnB0cjsKKworICBGRklfQVNTRVJUKGNpZiAhPSBOVUxMKTsKKyAgaWYgKCEgKGFiaSA+IEZGSV9GSVJTVF9BQkkgJiYgYWJpIDwgRkZJX0xBU1RfQUJJKSkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisKKyAgY2lmLT5hYmkgPSBhYmk7CisgIGNpZi0+YXJnX3R5cGVzID0gYXR5cGVzOworICBjaWYtPm5hcmdzID0gbmFyZ3M7CisgIGNpZi0+cnR5cGUgPSBydHlwZTsKKworICBjaWYtPmZsYWdzID0gMDsKKworICAvKiBJbml0aWFsaXplIHRoZSByZXR1cm4gdHlwZSBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKChjaWYtPnJ0eXBlLT5zaXplID09IDApICYmIChpbml0aWFsaXplX2FnZ3JlZ2F0ZShjaWYtPnJ0eXBlKSAhPSBGRklfT0spKQorICAgIHJldHVybiBGRklfQkFEX1RZUEVERUY7CisKKyAgLyogUGVyZm9ybSBhIHNhbml0eSBjaGVjayBvbiB0aGUgcmV0dXJuIHR5cGUgKi8KKyAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFKGNpZi0+cnR5cGUpOworCisgIC8qIHg4NiwgeDg2LTY0IGFuZCBzMzkwIHN0YWNrIHNwYWNlIGFsbG9jYXRpb24gaXMgaGFuZGxlZCBpbiBwcmVwX21hY2hkZXAuICovCisjaWYgIWRlZmluZWQgTTY4SyAmJiAhZGVmaW5lZCBYODZfQU5ZICYmICFkZWZpbmVkIFMzOTAgJiYgIWRlZmluZWQgUEEKKyAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIHJldHVybiBzdHJ1Y3R1cmUgcG9pbnRlciAqLworICBpZiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKKyNpZmRlZiBTUEFSQworICAgICAgJiYgKGNpZi0+YWJpICE9IEZGSV9WOSB8fCBjaWYtPnJ0eXBlLT5zaXplID4gMzIpCisjZW5kaWYKKyAgICAgKQorICAgIGJ5dGVzID0gU1RBQ0tfQVJHX1NJWkUoc2l6ZW9mKHZvaWQqKSk7CisjZW5kaWYKKworICBmb3IgKHB0ciA9IGNpZi0+YXJnX3R5cGVzLCBpID0gY2lmLT5uYXJnczsgaSA+IDA7IGktLSwgcHRyKyspCisgICAgeworCisgICAgICAvKiBJbml0aWFsaXplIGFueSB1bmluaXRpYWxpemVkIGFnZ3JlZ2F0ZSB0eXBlIGRlZmluaXRpb25zICovCisgICAgICBpZiAoKCgqcHRyKS0+c2l6ZSA9PSAwKSAmJiAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGUoKCpwdHIpKSAhPSBGRklfT0spKQorCXJldHVybiBGRklfQkFEX1RZUEVERUY7CisKKyAgICAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIGFyZ3VtZW50IHR5cGUsIGRvIHRoaXMKKwkgY2hlY2sgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uLiAgKi8KKyAgICAgIEZGSV9BU1NFUlRfVkFMSURfVFlQRSgqcHRyKTsKKworI2lmICFkZWZpbmVkIFg4Nl9BTlkgJiYgIWRlZmluZWQgUzM5MCAmJiAhZGVmaW5lZCBQQQorI2lmZGVmIFNQQVJDCisgICAgICBpZiAoKCgqcHRyKS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKKwkgICAmJiAoKCpwdHIpLT5zaXplID4gMTYgfHwgY2lmLT5hYmkgIT0gRkZJX1Y5KSkKKwkgIHx8ICgoKnB0ciktPnR5cGUgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRQorCSAgICAgICYmIGNpZi0+YWJpICE9IEZGSV9WOSkpCisJYnl0ZXMgKz0gc2l6ZW9mKHZvaWQqKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorCXsKKwkgIC8qIEFkZCBhbnkgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8KKwkgIGlmICgoKCpwdHIpLT5hbGlnbm1lbnQgLSAxKSAmIGJ5dGVzKQorCSAgICBieXRlcyA9IEFMSUdOKGJ5dGVzLCAoKnB0ciktPmFsaWdubWVudCk7CisKKwkgIGJ5dGVzICs9IFNUQUNLX0FSR19TSVpFKCgqcHRyKS0+c2l6ZSk7CisJfQorI2VuZGlmCisgICAgfQorCisgIGNpZi0+Ynl0ZXMgPSBieXRlczsKKworICAvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCisgIHJldHVybiBmZmlfcHJlcF9jaWZfbWFjaGRlcChjaWYpOworfQorI2VuZGlmIC8qIG5vdCBfX0NSSVNfXyAqLworCisjaWYgRkZJX0NMT1NVUkVTCisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmUgKGZmaV9jbG9zdXJlKiBjbG9zdXJlLAorCQkgIGZmaV9jaWYqIGNpZiwKKwkJICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopLAorCQkgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgcmV0dXJuIGZmaV9wcmVwX2Nsb3N1cmVfbG9jIChjbG9zdXJlLCBjaWYsIGZ1biwgdXNlcl9kYXRhLCBjbG9zdXJlKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3Jhd19hcGkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvcmF3X2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjEzNzIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3Jhd19hcGkuYwpAQCAtMCwwICsxLDI1NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHJhd19hcGkuYyAtIENvcHlyaWdodCAoYykgMTk5OSwgMjAwOCAgUmVkIEhhdCwgSW5jLgorCisgICBBdXRob3I6IEtyZXN0ZW4gS3JhYiBUaG9ydXAgPGtyYWJAZ251Lm9yZz4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBmaWxlIGRlZmluZXMgZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoIHRoZSByYXcgYXBpLiAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaWYgIUZGSV9OT19SQVdfQVBJCisKK3NpemVfdAorZmZpX3Jhd19zaXplIChmZmlfY2lmICpjaWYpCit7CisgIHNpemVfdCByZXN1bHQgPSAwOworICBpbnQgaTsKKworICBmZmlfdHlwZSAqKmF0ID0gY2lmLT5hcmdfdHlwZXM7CisKKyAgZm9yIChpID0gY2lmLT5uYXJncy0xOyBpID49IDA7IGktLSwgYXQrKykKKyAgICB7CisjaWYgIUZGSV9OT19TVFJVQ1RTCisgICAgICBpZiAoKCphdCktPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorCXJlc3VsdCArPSBBTElHTiAoc2l6ZW9mICh2b2lkKiksIEZGSV9TSVpFT0ZfQVJHKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorCXJlc3VsdCArPSBBTElHTiAoKCphdCktPnNpemUsIEZGSV9TSVpFT0ZfQVJHKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkCitmZmlfcmF3X3RvX3B0cmFycmF5IChmZmlfY2lmICpjaWYsIGZmaV9yYXcgKnJhdywgdm9pZCAqKmFyZ3MpCit7CisgIHVuc2lnbmVkIGk7CisgIGZmaV90eXBlICoqdHAgPSBjaWYtPmFyZ190eXBlczsKKworI2lmIFdPUkRTX0JJR0VORElBTgorCisgIGZvciAoaSA9IDA7IGkgPCBjaWYtPm5hcmdzOyBpKyssIHRwKyssIGFyZ3MrKykKKyAgICB7CSAgCisgICAgICBzd2l0Y2ggKCgqdHApLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1VJTlQ4OgorCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICAqYXJncyA9ICh2b2lkKikgKChjaGFyKikocmF3KyspICsgRkZJX1NJWkVPRl9BUkcgLSAxKTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAqYXJncyA9ICh2b2lkKikgKChjaGFyKikocmF3KyspICsgRkZJX1NJWkVPRl9BUkcgLSAyKTsKKwkgIGJyZWFrOworCisjaWYgRkZJX1NJWkVPRl9BUkcgPj0gNAkgIAorCWNhc2UgRkZJX1RZUEVfVUlOVDMyOgorCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgorCSAgKmFyZ3MgPSAodm9pZCopICgoY2hhciopKHJhdysrKSArIEZGSV9TSVpFT0ZfQVJHIC0gNCk7CisJICBicmVhazsKKyNlbmRpZgorCQorI2lmICFGRklfTk9fU1RSVUNUUyAgCisJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAqYXJncyA9IChyYXcrKyktPnB0cjsKKwkgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJICAqYXJncyA9ICh2b2lkKikgJihyYXcrKyktPnB0cjsKKwkgIGJyZWFrOworCSAgCisJZGVmYXVsdDoKKwkgICphcmdzID0gcmF3OworCSAgcmF3ICs9IEFMSUdOICgoKnRwKS0+c2l6ZSwgRkZJX1NJWkVPRl9BUkcpIC8gRkZJX1NJWkVPRl9BUkc7CisJfQorICAgIH0KKworI2Vsc2UgLyogV09SRFNfQklHRU5ESUFOICovCisKKyNpZiAhUERQCisKKyAgLyogdGhlbiBhc3N1bWUgbGl0dGxlIGVuZGlhbiAqLworICBmb3IgKGkgPSAwOyBpIDwgY2lmLT5uYXJnczsgaSsrLCB0cCsrLCBhcmdzKyspCisgICAgewkgIAorI2lmICFGRklfTk9fU1RSVUNUUworICAgICAgaWYgKCgqdHApLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKwl7CisJICAqYXJncyA9IChyYXcrKyktPnB0cjsKKwl9CisgICAgICBlbHNlCisjZW5kaWYKKwl7CisJICAqYXJncyA9ICh2b2lkKikgcmF3OworCSAgcmF3ICs9IEFMSUdOICgoKnRwKS0+c2l6ZSwgc2l6ZW9mICh2b2lkKikpIC8gc2l6ZW9mICh2b2lkKik7CisJfQorICAgIH0KKworI2Vsc2UKKyNlcnJvciAicGRwIGVuZGlhbiBub3Qgc3VwcG9ydGVkIgorI2VuZGlmIC8qICEgUERQICovCisKKyNlbmRpZiAvKiBXT1JEU19CSUdFTkRJQU4gKi8KK30KKwordm9pZAorZmZpX3B0cmFycmF5X3RvX3JhdyAoZmZpX2NpZiAqY2lmLCB2b2lkICoqYXJncywgZmZpX3JhdyAqcmF3KQoreworICB1bnNpZ25lZCBpOworICBmZmlfdHlwZSAqKnRwID0gY2lmLT5hcmdfdHlwZXM7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpZi0+bmFyZ3M7IGkrKywgdHArKywgYXJncysrKQorICAgIHsJICAKKyAgICAgIHN3aXRjaCAoKCp0cCktPnR5cGUpCisJeworCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJICAocmF3KyspLT51aW50ID0gKihVSU5UOCopICgqYXJncyk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICAocmF3KyspLT5zaW50ID0gKihTSU5UOCopICgqYXJncyk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgKHJhdysrKS0+dWludCA9ICooVUlOVDE2KikgKCphcmdzKTsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAocmF3KyspLT5zaW50ID0gKihTSU5UMTYqKSAoKmFyZ3MpOworCSAgYnJlYWs7CisKKyNpZiBGRklfU0laRU9GX0FSRyA+PSA0CisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICAocmF3KyspLT51aW50ID0gKihVSU5UMzIqKSAoKmFyZ3MpOworCSAgYnJlYWs7CisKKwljYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwkgIChyYXcrKyktPnNpbnQgPSAqKFNJTlQzMiopICgqYXJncyk7CisJICBicmVhazsKKyNlbmRpZgorCisjaWYgIUZGSV9OT19TVFJVQ1RTCisJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAocmF3KyspLT5wdHIgPSAqYXJnczsKKwkgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIEZGSV9UWVBFX1BPSU5URVI6CisJICAocmF3KyspLT5wdHIgPSAqKih2b2lkKioqKSBhcmdzOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgbWVtY3B5ICgodm9pZCopIHJhdy0+ZGF0YSwgKHZvaWQqKSphcmdzLCAoKnRwKS0+c2l6ZSk7CisJICByYXcgKz0gQUxJR04gKCgqdHApLT5zaXplLCBGRklfU0laRU9GX0FSRykgLyBGRklfU0laRU9GX0FSRzsKKwl9CisgICAgfQorfQorCisjaWYgIUZGSV9OQVRJVkVfUkFXX0FQSQorCisKKy8qIFRoaXMgaXMgYSBnZW5lcmljIGRlZmluaXRpb24gb2YgZmZpX3Jhd19jYWxsLCB0byBiZSB1c2VkIGlmIHRoZQorICogbmF0aXZlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIGEgbWFjaGluZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KKyAqIEhhdmluZyB0aGlzLCBhbGxvd3MgY29kZSB0byBiZSB3cml0dGVuIGZvciB0aGUgcmF3IEFQSSwgd2l0aG91dAorICogdGhlIG5lZWQgZm9yIHN5c3RlbS1zcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSBpbnB1dCBpbiB0aGF0IGZvcm1hdDsKKyAqIHRoZXNlIGZvbGxvd2luZyBjb3VwbGUgb2YgZnVuY3Rpb25zIHdpbGwgaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBmb3J0aAorICogYW5kIGJhY2sgYXV0b21hdGljYWxseS4gKi8KKwordm9pZCBmZmlfcmF3X2NhbGwgKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCBmZmlfcmF3ICpyYXcpCit7CisgIHZvaWQgKiphdmFsdWUgPSAodm9pZCoqKSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQqKSk7CisgIGZmaV9yYXdfdG9fcHRyYXJyYXkgKGNpZiwgcmF3LCBhdmFsdWUpOworICBmZmlfY2FsbCAoY2lmLCBmbiwgcnZhbHVlLCBhdmFsdWUpOworfQorCisjaWYgRkZJX0NMT1NVUkVTCQkvKiBiYXNlIHN5c3RlbSBwcm92aWRlcyBjbG9zdXJlcyAqLworCitzdGF0aWMgdm9pZAorZmZpX3RyYW5zbGF0ZV9hcmdzIChmZmlfY2lmICpjaWYsIHZvaWQgKnJ2YWx1ZSwKKwkJICAgIHZvaWQgKiphdmFsdWUsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgZmZpX3JhdyAqcmF3ID0gKGZmaV9yYXcqKWFsbG9jYSAoZmZpX3Jhd19zaXplIChjaWYpKTsKKyAgZmZpX3Jhd19jbG9zdXJlICpjbCA9IChmZmlfcmF3X2Nsb3N1cmUqKXVzZXJfZGF0YTsKKworICBmZmlfcHRyYXJyYXlfdG9fcmF3IChjaWYsIGF2YWx1ZSwgcmF3KTsKKyAgKCpjbC0+ZnVuKSAoY2lmLCBydmFsdWUsIHJhdywgY2wtPnVzZXJfZGF0YSk7Cit9CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX3Jhd19jbG9zdXJlX2xvYyAoZmZpX3Jhd19jbG9zdXJlKiBjbCwKKwkJCSAgZmZpX2NpZiAqY2lmLAorCQkJICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfcmF3Kix2b2lkKiksCisJCQkgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCSAgdm9pZCAqY29kZWxvYykKK3sKKyAgZmZpX3N0YXR1cyBzdGF0dXM7CisKKyAgc3RhdHVzID0gZmZpX3ByZXBfY2xvc3VyZV9sb2MgKChmZmlfY2xvc3VyZSopIGNsLAorCQkJCSBjaWYsCisJCQkJICZmZmlfdHJhbnNsYXRlX2FyZ3MsCisJCQkJIGNvZGVsb2MsCisJCQkJIGNvZGVsb2MpOworICBpZiAoc3RhdHVzID09IEZGSV9PSykKKyAgICB7CisgICAgICBjbC0+ZnVuICAgICAgID0gZnVuOworICAgICAgY2wtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIEZGSV9DTE9TVVJFUyAqLworI2VuZGlmIC8qICFGRklfTkFUSVZFX1JBV19BUEkgKi8KKworI2lmIEZGSV9DTE9TVVJFUworCisvKiBBZ2FpbiwgaGVyZSBpcyB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIGZmaV9wcmVwX3Jhd19jbG9zdXJlLCB3aGljaAorICogd2lsbCBpbnN0YWxsIGFuIGludGVybWVkaWF0ZSAiaHViIiBmb3IgdHJhbnNsYXRpb24gb2YgYXJndW1lbnRzIGZyb20KKyAqIHRoZSBwb2ludGVyLWFycmF5IGZvcm1hdCwgdG8gdGhlIHJhdyBmb3JtYXQgKi8KKworZmZpX3N0YXR1cworZmZpX3ByZXBfcmF3X2Nsb3N1cmUgKGZmaV9yYXdfY2xvc3VyZSogY2wsCisJCSAgICAgIGZmaV9jaWYgKmNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosZmZpX3Jhdyosdm9pZCopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIHJldHVybiBmZmlfcHJlcF9yYXdfY2xvc3VyZV9sb2MgKGNsLCBjaWYsIGZ1biwgdXNlcl9kYXRhLCBjbCk7Cit9CisKKyNlbmRpZiAvKiBGRklfQ0xPU1VSRVMgKi8KKworI2VuZGlmIC8qICFGRklfTk9fUkFXX0FQSSAqLwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zMzkwL2ZmaS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zMzkwL2ZmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjY3NWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3MzOTAvZmZpLmMKQEAgLTAsMCArMSw3ODAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBTb2Z0d2FyZSBBRworICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggUmVkIEhhdCwgSW5jCisgCisgICBTMzkwIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCisgCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIAorICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIAorICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisgCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyAKKy8qPT09PT09PT09PT09PT09PT09PT09PSBFbmQgb2YgSW5jbHVkZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIEdQUnMgYXZhaWxhYmxlIGZvciBhcmd1bWVudCBwYXNzaW5nLiAgKi8gCisjZGVmaW5lIE1BWF9HUFJBUkdTIDUKKworLyogTWF4aW11bSBudW1iZXIgb2YgRlBScyBhdmFpbGFibGUgZm9yIGFyZ3VtZW50IHBhc3NpbmcuICAqLyAKKyNpZmRlZiBfX3MzOTB4X18KKyNkZWZpbmUgTUFYX0ZQUkFSR1MgNAorI2Vsc2UKKyNkZWZpbmUgTUFYX0ZQUkFSR1MgMgorI2VuZGlmCisKKy8qIFJvdW5kIHRvIG11bHRpcGxlIG9mIDE2LiAgKi8KKyNkZWZpbmUgUk9VTkRfU0laRShzaXplKSAoKChzaXplKSArIDE1KSAmIH4xNSkKKworLyogSWYgdGhlc2UgdmFsdWVzIGNoYW5nZSwgc3lzdi5TIG11c3QgYmUgYWRhcHRlZCEgICovCisjZGVmaW5lIEZGSTM5MF9SRVRfVk9JRAkJMAorI2RlZmluZSBGRkkzOTBfUkVUX1NUUlVDVAkxCisjZGVmaW5lIEZGSTM5MF9SRVRfRkxPQVQJMgorI2RlZmluZSBGRkkzOTBfUkVUX0RPVUJMRQkzCisjZGVmaW5lIEZGSTM5MF9SRVRfSU5UMzIJNAorI2RlZmluZSBGRkkzOTBfUkVUX0lOVDY0CTUKKworLyo9PT09PT09PT09PT09PT09PT09PT0gRW5kIG9mIERlZmluZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAKK3N0YXRpYyB2b2lkIGZmaV9wcmVwX2FyZ3MgKHVuc2lnbmVkIGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopOwordm9pZAorI2lmIF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+IDIpCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKKyNlbmRpZgorZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YgKGZmaV9jbG9zdXJlICosIHVuc2lnbmVkIGxvbmcgKiwgCisJCQkgdW5zaWduZWQgbG9uZyBsb25nICosIHVuc2lnbmVkIGxvbmcgKik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PSBFbmQgb2YgUHJvdG90eXBlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgCitleHRlcm4gdm9pZCBmZmlfY2FsbF9TWVNWKHVuc2lnbmVkLAorCQkJICBleHRlbmRlZF9jaWYgKiwKKwkJCSAgdm9pZCAoKikodW5zaWduZWQgY2hhciAqLCBleHRlbmRlZF9jaWYgKiksCisJCQkgIHVuc2lnbmVkLAorCQkJICB2b2lkICosCisJCQkgIHZvaWQgKCpmbikodm9pZCkpOworCitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV9TWVNWKHZvaWQpOworIAorLyo9PT09PT09PT09PT09PT09PT09PT09IEVuZCBvZiBFeHRlcm5hbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZSAgICAgLSBmZmlfY2hlY2tfc3RydWN0X3R5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIC0gRGV0ZXJtaW5lIGlmIGEgc3RydWN0dXJlIGNhbiBiZSBwYXNzZWQgd2l0aGluIGEgICAgICAgICAqLworLyogICAgICAgICAgICBnZW5lcmFsIHB1cnBvc2Ugb3IgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworIAorc3RhdGljIGludAorZmZpX2NoZWNrX3N0cnVjdF90eXBlIChmZmlfdHlwZSAqYXJnKQoreworICBzaXplX3Qgc2l6ZSA9IGFyZy0+c2l6ZTsKKworICAvKiBJZiB0aGUgc3RydWN0IGhhcyBqdXN0IG9uZSBlbGVtZW50LCBsb29rIGF0IHRoYXQgZWxlbWVudAorICAgICB0byBmaW5kIG91dCB3aGV0aGVyIHRvIGNvbnNpZGVyIHRoZSBzdHJ1Y3QgYXMgZmxvYXRpbmcgcG9pbnQuICAqLworICB3aGlsZSAoYXJnLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCAKKyAgICAgICAgICYmIGFyZy0+ZWxlbWVudHNbMF0gJiYgIWFyZy0+ZWxlbWVudHNbMV0pCisgICAgYXJnID0gYXJnLT5lbGVtZW50c1swXTsKKworICAvKiBTdHJ1Y3RzIG9mIHNpemUgMSwgMiwgNCwgYW5kIDggYXJlIHBhc3NlZCBpbiByZWdpc3RlcnMsCisgICAgIGp1c3QgbGlrZSB0aGUgY29ycmVzcG9uZGluZyBpbnQvZmxvYXQgdHlwZXMuICAqLworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gRkZJX1RZUEVfVUlOVDg7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgcmV0dXJuIEZGSV9UWVBFX1VJTlQxNjsKKworICAgICAgY2FzZSA0OgorCWlmIChhcmctPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisgICAgICAgICAgcmV0dXJuIEZGSV9UWVBFX0ZMT0FUOworCWVsc2UKKwkgIHJldHVybiBGRklfVFlQRV9VSU5UMzI7CisKKyAgICAgIGNhc2UgODoKKwlpZiAoYXJnLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKyAgICAgICAgICByZXR1cm4gRkZJX1RZUEVfRE9VQkxFOworCWVsc2UKKwkgIHJldHVybiBGRklfVFlQRV9VSU5UNjQ7CisKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorCisgIC8qIE90aGVyIHN0cnVjdHMgYXJlIHBhc3NlZCB2aWEgYSBwb2ludGVyIHRvIHRoZSBkYXRhLiAgKi8KKyAgcmV0dXJuIEZGSV9UWVBFX1BPSU5URVI7Cit9CisgCisvKj09PT09PT09PT09PT09PT09PT09PT09PSBFbmQgb2YgUm91dGluZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lICAgICAtIGZmaV9wcmVwX2FyZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRnVuY3Rpb24gLSBQcmVwYXJlIHBhcmFtZXRlcnMgZm9yIGNhbGwgdG8gZnVuY3Rpb24uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UgICAqLworLyogaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworIAorc3RhdGljIHZvaWQKK2ZmaV9wcmVwX2FyZ3MgKHVuc2lnbmVkIGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCit7CisgIC8qIFRoZSBzdGFjayBzcGFjZSB3aWxsIGJlIGZpbGxlZCB3aXRoIHRob3NlIGFyZWFzOgorCisJRlBSIGFyZ3VtZW50IHJlZ2lzdGVyIHNhdmUgYXJlYSAgICAgKGhpZ2hlc3QgYWRkcmVzc2VzKQorCUdQUiBhcmd1bWVudCByZWdpc3RlciBzYXZlIGFyZWEKKwl0ZW1wb3Jhcnkgc3RydWN0IGNvcGllcworCW92ZXJmbG93IGFyZ3VtZW50IGFyZWEgICAgICAgICAgICAgIChsb3dlc3QgYWRkcmVzc2VzKQorCisgICAgIFdlIHNldCB1cCB0aGUgZm9sbG93aW5nIHBvaW50ZXJzOgorCisgICAgICAgIHBfZnByOiBib3R0b20gb2YgdGhlIEZQUiBhcmVhIChncm93aW5nIHVwd2FyZHMpCisJcF9ncHI6IGJvdHRvbSBvZiB0aGUgR1BSIGFyZWEgKGdyb3dpbmcgdXB3YXJkcykKKwlwX292OiBib3R0b20gb2YgdGhlIG92ZXJmbG93IGFyZWEgKGdyb3dpbmcgdXB3YXJkcykKKwlwX3N0cnVjdDogdG9wIG9mIHRoZSBzdHJ1Y3QgY29weSBhcmVhIChncm93aW5nIGRvd253YXJkcykKKworICAgICBBbGwgYXJlYXMgYXJlIGtlcHQgYWxpZ25lZCB0byB0d2ljZSB0aGUgd29yZCBzaXplLiAgKi8KKworICBpbnQgZ3ByX29mZiA9IGVjaWYtPmNpZi0+Ynl0ZXM7CisgIGludCBmcHJfb2ZmID0gZ3ByX29mZiArIFJPVU5EX1NJWkUgKE1BWF9HUFJBUkdTICogc2l6ZW9mIChsb25nKSk7CisKKyAgdW5zaWduZWQgbG9uZyBsb25nICpwX2ZwciA9ICh1bnNpZ25lZCBsb25nIGxvbmcgKikoc3RhY2sgKyBmcHJfb2ZmKTsKKyAgdW5zaWduZWQgbG9uZyAqcF9ncHIgPSAodW5zaWduZWQgbG9uZyAqKShzdGFjayArIGdwcl9vZmYpOworICB1bnNpZ25lZCBjaGFyICpwX3N0cnVjdCA9ICh1bnNpZ25lZCBjaGFyICopcF9ncHI7CisgIHVuc2lnbmVkIGxvbmcgKnBfb3YgPSAodW5zaWduZWQgbG9uZyAqKXN0YWNrOworCisgIGludCBuX2ZwciA9IDA7CisgIGludCBuX2dwciA9IDA7CisgIGludCBuX292ID0gMDsKKworICBmZmlfdHlwZSAqKnB0cjsKKyAgdm9pZCAqKnBfYXJndiA9IGVjaWYtPmF2YWx1ZTsKKyAgaW50IGk7CisgCisgIC8qIElmIHdlIHJldHVybmluZyBhIHN0cnVjdHVyZSB0aGVuIHdlIHNldCB0aGUgZmlyc3QgcGFyYW1ldGVyIHJlZ2lzdGVyCisgICAgIHRvIHRoZSBhZGRyZXNzIG9mIHdoZXJlIHdlIGFyZSByZXR1cm5pbmcgdGhpcyBzdHJ1Y3R1cmUuICAqLworCisgIGlmIChlY2lmLT5jaWYtPmZsYWdzID09IEZGSTM5MF9SRVRfU1RSVUNUKQorICAgIHBfZ3ByW25fZ3ByKytdID0gKHVuc2lnbmVkIGxvbmcpIGVjaWYtPnJ2YWx1ZTsKKworICAvKiBOb3cgZm9yIHRoZSBhcmd1bWVudHMuICAqLworIAorICBmb3IgKHB0ciA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzLCBpID0gZWNpZi0+Y2lmLT5uYXJnczsKKyAgICAgICBpID4gMDsKKyAgICAgICBpLS0sIHB0cisrLCBwX2FyZ3YrKykKKyAgICB7CisgICAgICB2b2lkICphcmcgPSAqcF9hcmd2OworICAgICAgaW50IHR5cGUgPSAoKnB0ciktPnR5cGU7CisKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorICAgICAgLyogMTYtYnl0ZSBsb25nIGRvdWJsZSBpcyBwYXNzZWQgbGlrZSBhIHN0cnVjdC4gICovCisgICAgICBpZiAodHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFKQorCXR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisjZW5kaWYKKworICAgICAgLyogQ2hlY2sgaG93IGEgc3RydWN0dXJlIHR5cGUgaXMgcGFzc2VkLiAgKi8KKyAgICAgIGlmICh0eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKwl7CisJICB0eXBlID0gZmZpX2NoZWNrX3N0cnVjdF90eXBlICgqcHRyKTsKKworCSAgLyogSWYgd2UgcGFzcyB0aGUgc3RydWN0IHZpYSBwb2ludGVyLCBjb3B5IHRoZSBkYXRhLiAgKi8KKwkgIGlmICh0eXBlID09IEZGSV9UWVBFX1BPSU5URVIpCisJICAgIHsKKwkgICAgICBwX3N0cnVjdCAtPSBST1VORF9TSVpFICgoKnB0ciktPnNpemUpOworCSAgICAgIG1lbWNweSAocF9zdHJ1Y3QsIChjaGFyICopYXJnLCAoKnB0ciktPnNpemUpOworCSAgICAgIGFyZyA9ICZwX3N0cnVjdDsKKwkgICAgfQorCX0KKworICAgICAgLyogTm93IGhhbmRsZSBhbGwgcHJpbWl0aXZlIGludC9wb2ludGVyL2Zsb2F0IGRhdGEgdHlwZXMuICAqLworICAgICAgc3dpdGNoICh0eXBlKSAKKwl7CisJICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgICAgaWYgKG5fZnByIDwgTUFYX0ZQUkFSR1MpCisJICAgICAgcF9mcHJbbl9mcHIrK10gPSAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSBhcmc7CisJICAgIGVsc2UKKyNpZmRlZiBfX3MzOTB4X18KKwkgICAgICBwX292W25fb3YrK10gPSAqKHVuc2lnbmVkIGxvbmcgKikgYXJnOworI2Vsc2UKKwkgICAgICBwX292W25fb3YrK10gPSAoKHVuc2lnbmVkIGxvbmcgKikgYXJnKVswXSwKKwkgICAgICBwX292W25fb3YrK10gPSAoKHVuc2lnbmVkIGxvbmcgKikgYXJnKVsxXTsKKyNlbmRpZgorCSAgICBicmVhazsKKwkKKwkgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJICAgIGlmIChuX2ZwciA8IE1BWF9GUFJBUkdTKQorCSAgICAgIHBfZnByW25fZnByKytdID0gKGxvbmcgbG9uZykgKih1bnNpZ25lZCBpbnQgKikgYXJnIDw8IDMyOworCSAgICBlbHNlCisJICAgICAgcF9vdltuX292KytdID0gKih1bnNpZ25lZCBpbnQgKikgYXJnOworCSAgICBicmVhazsKKworCSAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorCSAgICBpZiAobl9ncHIgPCBNQVhfR1BSQVJHUykKKwkgICAgICBwX2dwcltuX2dwcisrXSA9ICh1bnNpZ25lZCBsb25nKSoodW5zaWduZWQgY2hhciAqKikgYXJnOworCSAgICBlbHNlCisJICAgICAgcF9vdltuX292KytdID0gKHVuc2lnbmVkIGxvbmcpKih1bnNpZ25lZCBjaGFyICoqKSBhcmc7CisJICAgIGJyZWFrOworIAorCSAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisJICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyNpZmRlZiBfX3MzOTB4X18KKwkgICAgaWYgKG5fZ3ByIDwgTUFYX0dQUkFSR1MpCisJICAgICAgcF9ncHJbbl9ncHIrK10gPSAqKHVuc2lnbmVkIGxvbmcgKikgYXJnOworCSAgICBlbHNlCisJICAgICAgcF9vdltuX292KytdID0gKih1bnNpZ25lZCBsb25nICopIGFyZzsKKyNlbHNlCisJICAgIGlmIChuX2dwciA9PSBNQVhfR1BSQVJHUy0xKQorCSAgICAgIG5fZ3ByID0gTUFYX0dQUkFSR1M7CisJICAgIGlmIChuX2dwciA8IE1BWF9HUFJBUkdTKQorCSAgICAgIHBfZ3ByW25fZ3ByKytdID0gKCh1bnNpZ25lZCBsb25nICopIGFyZylbMF0sCisJICAgICAgcF9ncHJbbl9ncHIrK10gPSAoKHVuc2lnbmVkIGxvbmcgKikgYXJnKVsxXTsKKwkgICAgZWxzZQorCSAgICAgIHBfb3Zbbl9vdisrXSA9ICgodW5zaWduZWQgbG9uZyAqKSBhcmcpWzBdLAorCSAgICAgIHBfb3Zbbl9vdisrXSA9ICgodW5zaWduZWQgbG9uZyAqKSBhcmcpWzFdOworI2VuZGlmCisJICAgIGJyZWFrOworIAorCSAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICAgIGlmIChuX2dwciA8IE1BWF9HUFJBUkdTKQorCSAgICAgIHBfZ3ByW25fZ3ByKytdID0gKih1bnNpZ25lZCBpbnQgKikgYXJnOworCSAgICBlbHNlCisJICAgICAgcF9vdltuX292KytdID0gKih1bnNpZ25lZCBpbnQgKikgYXJnOworCSAgICBicmVhazsKKyAKKwkgIGNhc2UgRkZJX1RZUEVfSU5UOgorCSAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJICAgIGlmIChuX2dwciA8IE1BWF9HUFJBUkdTKQorCSAgICAgIHBfZ3ByW25fZ3ByKytdID0gKihzaWduZWQgaW50ICopIGFyZzsKKwkgICAgZWxzZQorCSAgICAgIHBfb3Zbbl9vdisrXSA9ICooc2lnbmVkIGludCAqKSBhcmc7CisJICAgIGJyZWFrOworIAorCSAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAgIGlmIChuX2dwciA8IE1BWF9HUFJBUkdTKQorCSAgICAgIHBfZ3ByW25fZ3ByKytdID0gKih1bnNpZ25lZCBzaG9ydCAqKSBhcmc7CisJICAgIGVsc2UKKwkgICAgICBwX292W25fb3YrK10gPSAqKHVuc2lnbmVkIHNob3J0ICopIGFyZzsKKwkgICAgYnJlYWs7CisgCisJICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkgICAgaWYgKG5fZ3ByIDwgTUFYX0dQUkFSR1MpCisJICAgICAgcF9ncHJbbl9ncHIrK10gPSAqKHNpZ25lZCBzaG9ydCAqKSBhcmc7CisJICAgIGVsc2UKKwkgICAgICBwX292W25fb3YrK10gPSAqKHNpZ25lZCBzaG9ydCAqKSBhcmc7CisJICAgIGJyZWFrOworCisJICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgICBpZiAobl9ncHIgPCBNQVhfR1BSQVJHUykKKwkgICAgICBwX2dwcltuX2dwcisrXSA9ICoodW5zaWduZWQgY2hhciAqKSBhcmc7CisJICAgIGVsc2UKKwkgICAgICBwX292W25fb3YrK10gPSAqKHVuc2lnbmVkIGNoYXIgKikgYXJnOworCSAgICBicmVhazsKKyAKKwkgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICAgIGlmIChuX2dwciA8IE1BWF9HUFJBUkdTKQorCSAgICAgIHBfZ3ByW25fZ3ByKytdID0gKihzaWduZWQgY2hhciAqKSBhcmc7CisJICAgIGVsc2UKKwkgICAgICBwX292W25fb3YrK10gPSAqKHNpZ25lZCBjaGFyICopIGFyZzsKKwkgICAgYnJlYWs7CisgCisJICBkZWZhdWx0OgorCSAgICBGRklfQVNTRVJUICgwKTsKKwkgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09IEVuZCBvZiBSb3V0aW5lID09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWUgICAgIC0gZmZpX3ByZXBfY2lmX21hY2hkZXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGdW5jdGlvbiAtIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgQ0lGIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpCit7CisgIHNpemVfdCBzdHJ1Y3Rfc2l6ZSA9IDA7CisgIGludCBuX2dwciA9IDA7CisgIGludCBuX2ZwciA9IDA7CisgIGludCBuX292ID0gMDsKKworICBmZmlfdHlwZSAqKnB0cjsKKyAgaW50IGk7CisKKyAgLyogRGV0ZXJtaW5lIHJldHVybiB2YWx1ZSBoYW5kbGluZy4gICovIAorCisgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKKyAgICB7CisgICAgICAvKiBWb2lkIGlzIGVhc3kuICAqLworICAgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorCWNpZi0+ZmxhZ3MgPSBGRkkzOTBfUkVUX1ZPSUQ7CisJYnJlYWs7CisKKyAgICAgIC8qIFN0cnVjdHVyZXMgYXJlIHJldHVybmVkIHZpYSBhIGhpZGRlbiBwb2ludGVyLiAgKi8KKyAgICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCWNpZi0+ZmxhZ3MgPSBGRkkzOTBfUkVUX1NUUlVDVDsKKwluX2dwcisrOyAgLyogV2UgbmVlZCBvbmUgR1BSIHRvIHBhc3MgdGhlIHBvaW50ZXIuICAqLworCWJyZWFrOyAKKworICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBmcHIgMC4gICovCisgICAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorCWNpZi0+ZmxhZ3MgPSBGRkkzOTBfUkVUX0ZMT0FUOworCWJyZWFrOworCisgICAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKwljaWYtPmZsYWdzID0gRkZJMzkwX1JFVF9ET1VCTEU7CisJYnJlYWs7CisKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorICAgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorCWNpZi0+ZmxhZ3MgPSBGRkkzOTBfUkVUX1NUUlVDVDsKKwluX2dwcisrOworCWJyZWFrOworI2VuZGlmCisgICAgICAvKiBJbnRlZ2VyIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gZ3ByIDIgKGFuZCBncHIgMworCSBmb3IgNjQtYml0IHZhbHVlcyBvbiAzMS1iaXQgbWFjaGluZXMpLiAgKi8KKyAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisJY2lmLT5mbGFncyA9IEZGSTM5MF9SRVRfSU5UNjQ7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKyAgICAgIGNhc2UgRkZJX1RZUEVfSU5UOgorICAgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKyAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkvKiBUaGVzZSBhcmUgdG8gYmUgZXh0ZW5kZWQgdG8gd29yZCBzaXplLiAgKi8KKyNpZmRlZiBfX3MzOTB4X18KKwljaWYtPmZsYWdzID0gRkZJMzkwX1JFVF9JTlQ2NDsKKyNlbHNlCisJY2lmLT5mbGFncyA9IEZGSTM5MF9SRVRfSU5UMzI7CisjZW5kaWYKKwlicmVhazsKKyAKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEZGSV9BU1NFUlQgKDApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogTm93IGZvciB0aGUgYXJndW1lbnRzLiAgKi8KKyAKKyAgZm9yIChwdHIgPSBjaWYtPmFyZ190eXBlcywgaSA9IGNpZi0+bmFyZ3M7CisgICAgICAgaSA+IDA7CisgICAgICAgaS0tLCBwdHIrKykKKyAgICB7CisgICAgICBpbnQgdHlwZSA9ICgqcHRyKS0+dHlwZTsKKworI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCisgICAgICAvKiAxNi1ieXRlIGxvbmcgZG91YmxlIGlzIHBhc3NlZCBsaWtlIGEgc3RydWN0LiAgKi8KKyAgICAgIGlmICh0eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpCisJdHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyNlbmRpZgorCisgICAgICAvKiBDaGVjayBob3cgYSBzdHJ1Y3R1cmUgdHlwZSBpcyBwYXNzZWQuICAqLworICAgICAgaWYgKHR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorCXsKKwkgIHR5cGUgPSBmZmlfY2hlY2tfc3RydWN0X3R5cGUgKCpwdHIpOworCisJICAvKiBJZiB3ZSBwYXNzIHRoZSBzdHJ1Y3QgdmlhIHBvaW50ZXIsIHdlIG11c3QgcmVzZXJ2ZSBzcGFjZQorCSAgICAgdG8gY29weSBpdHMgZGF0YSBmb3IgcHJvcGVyIGNhbGwtYnktdmFsdWUgc2VtYW50aWNzLiAgKi8KKwkgIGlmICh0eXBlID09IEZGSV9UWVBFX1BPSU5URVIpCisJICAgIHN0cnVjdF9zaXplICs9IFJPVU5EX1NJWkUgKCgqcHRyKS0+c2l6ZSk7CisJfQorCisgICAgICAvKiBOb3cgaGFuZGxlIGFsbCBwcmltaXRpdmUgaW50L2Zsb2F0IGRhdGEgdHlwZXMuICAqLworICAgICAgc3dpdGNoICh0eXBlKSAKKwl7CisJICAvKiBUaGUgZmlyc3QgTUFYX0ZQUkFSR1MgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzCisJICAgICBnbyBpbiBGUFJzLCB0aGUgcmVzdCBvdmVyZmxvdyB0byB0aGUgc3RhY2suICAqLworCisJICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgICAgaWYgKG5fZnByIDwgTUFYX0ZQUkFSR1MpCisJICAgICAgbl9mcHIrKzsKKwkgICAgZWxzZQorCSAgICAgIG5fb3YgKz0gc2l6ZW9mIChkb3VibGUpIC8gc2l6ZW9mIChsb25nKTsKKwkgICAgYnJlYWs7CisJCisJICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgICBpZiAobl9mcHIgPCBNQVhfRlBSQVJHUykKKwkgICAgICBuX2ZwcisrOworCSAgICBlbHNlCisJICAgICAgbl9vdisrOworCSAgICBicmVhazsKKworCSAgLyogT24gMzEtYml0IG1hY2hpbmVzLCA2NC1iaXQgaW50ZWdlcnMgYXJlIHBhc3NlZCBpbiBHUFIgcGFpcnMsCisJICAgICBpZiBvbmUgaXMgc3RpbGwgYXZhaWxhYmxlLCBvciBlbHNlIG9uIHRoZSBzdGFjay4gIElmIG9ubHkgb25lCisJICAgICByZWdpc3RlciBpcyBmcmVlLCBza2lwIHRoZSByZWdpc3RlciAoaXQgd29uJ3QgYmUgdXNlZCBmb3IgYW55IAorCSAgICAgc3Vic2VxdWVudCBhcmd1bWVudCBlaXRoZXIpLiAgKi8KKwkgICAgICAKKyNpZm5kZWYgX19zMzkweF9fCisJICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKwkgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorCSAgICBpZiAobl9ncHIgPT0gTUFYX0dQUkFSR1MtMSkKKwkgICAgICBuX2dwciA9IE1BWF9HUFJBUkdTOworCSAgICBpZiAobl9ncHIgPCBNQVhfR1BSQVJHUykKKwkgICAgICBuX2dwciArPSAyOworCSAgICBlbHNlCisJICAgICAgbl9vdiArPSAyOworCSAgICBicmVhazsKKyNlbmRpZgorCisJICAvKiBFdmVyeXRoaW5nIGVsc2UgaXMgcGFzc2VkIGluIEdQUnMgKHVudGlsIE1BWF9HUFJBUkdTCisJICAgICBoYXZlIGJlZW4gdXNlZCkgb3Igb3ZlcmZsb3dzIHRvIHRoZSBzdGFjay4gICovCisKKwkgIGRlZmF1bHQ6IAorCSAgICBpZiAobl9ncHIgPCBNQVhfR1BSQVJHUykKKwkgICAgICBuX2dwcisrOworCSAgICBlbHNlCisJICAgICAgbl9vdisrOworCSAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBUb3RhbCBzdGFjayBzcGFjZSBhcyByZXF1aXJlZCBmb3Igb3ZlcmZsb3cgYXJndW1lbnRzCisgICAgIGFuZCB0ZW1wb3Jhcnkgc3RydWN0dXJlIGNvcGllcy4gICovCisKKyAgY2lmLT5ieXRlcyA9IFJPVU5EX1NJWkUgKG5fb3YgKiBzaXplb2YgKGxvbmcpKSArIHN0cnVjdF9zaXplOworIAorICByZXR1cm4gRkZJX09LOworfQorIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG9mIFJvdXRpbmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZSAgICAgLSBmZmlfY2FsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIC0gQ2FsbCB0aGUgRkZJIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAKK3ZvaWQKK2ZmaV9jYWxsKGZmaV9jaWYgKmNpZiwKKwkgdm9pZCAoKmZuKSh2b2lkKSwKKwkgdm9pZCAqcnZhbHVlLAorCSB2b2lkICoqYXZhbHVlKQoreworICBpbnQgcmV0X3R5cGUgPSBjaWYtPmZsYWdzOworICBleHRlbmRlZF9jaWYgZWNpZjsKKyAKKyAgZWNpZi5jaWYgICAgPSBjaWY7CisgIGVjaWYuYXZhbHVlID0gYXZhbHVlOworICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuIHZhbHVlLCB3ZSBuZWVkIHRvIGZha2Ugb25lLiAgKi8KKyAgaWYgKHJ2YWx1ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChyZXRfdHlwZSA9PSBGRkkzOTBfUkVUX1NUUlVDVCkKKwllY2lmLnJ2YWx1ZSA9IGFsbG9jYSAoY2lmLT5ydHlwZS0+c2l6ZSk7CisgICAgICBlbHNlCisJcmV0X3R5cGUgPSBGRkkzOTBfUkVUX1ZPSUQ7CisgICAgfSAKKworICBzd2l0Y2ggKGNpZi0+YWJpKQorICAgIHsKKyAgICAgIGNhc2UgRkZJX1NZU1Y6CisgICAgICAgIGZmaV9jYWxsX1NZU1YgKGNpZi0+Ynl0ZXMsICZlY2lmLCBmZmlfcHJlcF9hcmdzLAorCQkgICAgICAgcmV0X3R5cGUsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICAgIGJyZWFrOworIAorICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkZJX0FTU0VSVCAoMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKyAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09IEVuZCBvZiBSb3V0aW5lID09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZSAgICAgLSBmZmlfY2xvc3VyZV9oZWxwZXJfU1lTVi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIC0gQ2FsbCBhIEZGSSBjbG9zdXJlIHRhcmdldCBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAKK3ZvaWQKK2ZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWIChmZmlfY2xvc3VyZSAqY2xvc3VyZSwKKwkJCSB1bnNpZ25lZCBsb25nICpwX2dwciwKKwkJCSB1bnNpZ25lZCBsb25nIGxvbmcgKnBfZnByLAorCQkJIHVuc2lnbmVkIGxvbmcgKnBfb3YpCit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyByZXRfYnVmZmVyOworCisgIHZvaWQgKnJ2YWx1ZSA9ICZyZXRfYnVmZmVyOworICB2b2lkICoqYXZhbHVlOworICB2b2lkICoqcF9hcmc7CisKKyAgaW50IG5fZ3ByID0gMDsKKyAgaW50IG5fZnByID0gMDsKKyAgaW50IG5fb3YgPSAwOworCisgIGZmaV90eXBlICoqcHRyOworICBpbnQgaTsKKworICAvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIGFyZ3VtZW50IGxpc3QgcG9pbnRlcnMuICAqLworCisgIHBfYXJnID0gYXZhbHVlID0gYWxsb2NhIChjbG9zdXJlLT5jaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkICopKTsKKworICAvKiBJZiB3ZSByZXR1cm5pbmcgYSBzdHJ1Y3R1cmUsIHBhc3MgdGhlIHN0cnVjdHVyZSBhZGRyZXNzIAorICAgICBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgT3RoZXJ3aXNlLCBoYXZlIHRoZSB0YXJnZXQgCisgICAgIGZ1bmN0aW9uIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIEdQUiBzYXZlIGFyZWEuICAqLworCisgIGlmIChjbG9zdXJlLT5jaWYtPmZsYWdzID09IEZGSTM5MF9SRVRfU1RSVUNUKQorICAgIHJ2YWx1ZSA9ICh2b2lkICopIHBfZ3ByW25fZ3ByKytdOworCisgIC8qIE5vdyBmb3IgdGhlIGFyZ3VtZW50cy4gICovCisKKyAgZm9yIChwdHIgPSBjbG9zdXJlLT5jaWYtPmFyZ190eXBlcywgaSA9IGNsb3N1cmUtPmNpZi0+bmFyZ3M7CisgICAgICAgaSA+IDA7CisgICAgICAgaS0tLCBwX2FyZysrLCBwdHIrKykKKyAgICB7CisgICAgICBpbnQgZGVyZWZfc3RydWN0X3BvaW50ZXIgPSAwOworICAgICAgaW50IHR5cGUgPSAoKnB0ciktPnR5cGU7CisKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorICAgICAgLyogMTYtYnl0ZSBsb25nIGRvdWJsZSBpcyBwYXNzZWQgbGlrZSBhIHN0cnVjdC4gICovCisgICAgICBpZiAodHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFKQorCXR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisjZW5kaWYKKworICAgICAgLyogQ2hlY2sgaG93IGEgc3RydWN0dXJlIHR5cGUgaXMgcGFzc2VkLiAgKi8KKyAgICAgIGlmICh0eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKwl7CisJICB0eXBlID0gZmZpX2NoZWNrX3N0cnVjdF90eXBlICgqcHRyKTsKKworCSAgLyogSWYgd2UgcGFzcyB0aGUgc3RydWN0IHZpYSBwb2ludGVyLCByZW1lbWJlciB0byAKKwkgICAgIHJldHJpZXZlIHRoZSBwb2ludGVyIGxhdGVyLiAgKi8KKwkgIGlmICh0eXBlID09IEZGSV9UWVBFX1BPSU5URVIpCisJICAgIGRlcmVmX3N0cnVjdF9wb2ludGVyID0gMTsKKwl9CisKKyAgICAgIC8qIFBvaW50ZXJzIGFyZSBwYXNzZWQgbGlrZSBVSU5UcyBvZiB0aGUgc2FtZSBzaXplLiAgKi8KKyAgICAgIGlmICh0eXBlID09IEZGSV9UWVBFX1BPSU5URVIpCisjaWZkZWYgX19zMzkweF9fCisJdHlwZSA9IEZGSV9UWVBFX1VJTlQ2NDsKKyNlbHNlCisJdHlwZSA9IEZGSV9UWVBFX1VJTlQzMjsKKyNlbmRpZgorCisgICAgICAvKiBOb3cgaGFuZGxlIGFsbCBwcmltaXRpdmUgaW50L2Zsb2F0IGRhdGEgdHlwZXMuICAqLworICAgICAgc3dpdGNoICh0eXBlKSAKKwl7CisJICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKwkgICAgaWYgKG5fZnByIDwgTUFYX0ZQUkFSR1MpCisJICAgICAgKnBfYXJnID0gJnBfZnByW25fZnByKytdOworCSAgICBlbHNlCisJICAgICAgKnBfYXJnID0gJnBfb3Zbbl9vdl0sIAorCSAgICAgIG5fb3YgKz0gc2l6ZW9mIChkb3VibGUpIC8gc2l6ZW9mIChsb25nKTsKKwkgICAgYnJlYWs7CisJCisJICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgICBpZiAobl9mcHIgPCBNQVhfRlBSQVJHUykKKwkgICAgICAqcF9hcmcgPSAmcF9mcHJbbl9mcHIrK107CisJICAgIGVsc2UKKwkgICAgICAqcF9hcmcgPSAoY2hhciAqKSZwX292W25fb3YrK10gKyBzaXplb2YgKGxvbmcpIC0gNDsKKwkgICAgYnJlYWs7CisgCisJICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKwkgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorI2lmZGVmIF9fczM5MHhfXworCSAgICBpZiAobl9ncHIgPCBNQVhfR1BSQVJHUykKKwkgICAgICAqcF9hcmcgPSAmcF9ncHJbbl9ncHIrK107CisJICAgIGVsc2UKKwkgICAgICAqcF9hcmcgPSAmcF9vdltuX292KytdOworI2Vsc2UKKwkgICAgaWYgKG5fZ3ByID09IE1BWF9HUFJBUkdTLTEpCisJICAgICAgbl9ncHIgPSBNQVhfR1BSQVJHUzsKKwkgICAgaWYgKG5fZ3ByIDwgTUFYX0dQUkFSR1MpCisJICAgICAgKnBfYXJnID0gJnBfZ3ByW25fZ3ByXSwgbl9ncHIgKz0gMjsKKwkgICAgZWxzZQorCSAgICAgICpwX2FyZyA9ICZwX292W25fb3ZdLCBuX292ICs9IDI7CisjZW5kaWYKKwkgICAgYnJlYWs7CisgCisJICBjYXNlIEZGSV9UWVBFX0lOVDoKKwkgIGNhc2UgRkZJX1RZUEVfVUlOVDMyOgorCSAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJICAgIGlmIChuX2dwciA8IE1BWF9HUFJBUkdTKQorCSAgICAgICpwX2FyZyA9IChjaGFyICopJnBfZ3ByW25fZ3ByKytdICsgc2l6ZW9mIChsb25nKSAtIDQ7CisJICAgIGVsc2UKKwkgICAgICAqcF9hcmcgPSAoY2hhciAqKSZwX292W25fb3YrK10gKyBzaXplb2YgKGxvbmcpIC0gNDsKKwkgICAgYnJlYWs7CisgCisJICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCSAgICBpZiAobl9ncHIgPCBNQVhfR1BSQVJHUykKKwkgICAgICAqcF9hcmcgPSAoY2hhciAqKSZwX2dwcltuX2dwcisrXSArIHNpemVvZiAobG9uZykgLSAyOworCSAgICBlbHNlCisJICAgICAgKnBfYXJnID0gKGNoYXIgKikmcF9vdltuX292KytdICsgc2l6ZW9mIChsb25nKSAtIDI7CisJICAgIGJyZWFrOworCisJICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgaWYgKG5fZ3ByIDwgTUFYX0dQUkFSR1MpCisJICAgICAgKnBfYXJnID0gKGNoYXIgKikmcF9ncHJbbl9ncHIrK10gKyBzaXplb2YgKGxvbmcpIC0gMTsKKwkgICAgZWxzZQorCSAgICAgICpwX2FyZyA9IChjaGFyICopJnBfb3Zbbl9vdisrXSArIHNpemVvZiAobG9uZykgLSAxOworCSAgICBicmVhazsKKyAKKwkgIGRlZmF1bHQ6CisJICAgIEZGSV9BU1NFUlQgKDApOworCSAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAvKiBJZiB0aGlzIGlzIGEgc3RydWN0IHBhc3NlZCB2aWEgcG9pbnRlciwgd2UgbmVlZCB0bworCSBhY3R1YWxseSByZXRyaWV2ZSB0aGF0IHBvaW50ZXIuICAqLworICAgICAgaWYgKGRlcmVmX3N0cnVjdF9wb2ludGVyKQorCSpwX2FyZyA9ICoodm9pZCAqKikqcF9hcmc7CisgICAgfQorCisKKyAgLyogQ2FsbCB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KKyAgKGNsb3N1cmUtPmZ1bikgKGNsb3N1cmUtPmNpZiwgcnZhbHVlLCBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgLyogQ29udmVydCB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KKyAgc3dpdGNoIChjbG9zdXJlLT5jaWYtPnJ0eXBlLT50eXBlKQorICAgIHsKKyAgICAgIC8qIFZvaWQgaXMgZWFzeSwgYW5kIHNvIGlzIHN0cnVjdC4gICovCisgICAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CisgICAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorICAgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorI2VuZGlmCisJYnJlYWs7CisKKyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gZnByIDAuICAqLworICAgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKwlwX2ZwclswXSA9IChsb25nIGxvbmcpICoodW5zaWduZWQgaW50ICopIHJ2YWx1ZSA8PCAzMjsKKwlicmVhazsKKworICAgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJcF9mcHJbMF0gPSAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSBydmFsdWU7CisJYnJlYWs7CisKKyAgICAgIC8qIEludGVnZXIgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiBncHIgMiAoYW5kIGdwciAzCisJIGZvciA2NC1iaXQgdmFsdWVzIG9uIDMxLWJpdCBtYWNoaW5lcykuICAqLworICAgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyNpZmRlZiBfX3MzOTB4X18KKwlwX2dwclswXSA9ICoodW5zaWduZWQgbG9uZyAqKSBydmFsdWU7CisjZWxzZQorCXBfZ3ByWzBdID0gKCh1bnNpZ25lZCBsb25nICopIHJ2YWx1ZSlbMF0sCisJcF9ncHJbMV0gPSAoKHVuc2lnbmVkIGxvbmcgKikgcnZhbHVlKVsxXTsKKyNlbmRpZgorCWJyZWFrOworCisgICAgICBjYXNlIEZGSV9UWVBFX1BPSU5URVI6CisgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwlwX2dwclswXSA9ICoodW5zaWduZWQgbG9uZyAqKSBydmFsdWU7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgRkZJX1RZUEVfSU5UOgorICAgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisJcF9ncHJbMF0gPSAqKHNpZ25lZCBsb25nICopIHJ2YWx1ZTsKKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkZJX0FTU0VSVCAoMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKyAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09IEVuZCBvZiBSb3V0aW5lID09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZSAgICAgLSBmZmlfcHJlcF9jbG9zdXJlX2xvYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIC0gUHJlcGFyZSBhIEZGSSBjbG9zdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmVfbG9jIChmZmlfY2xvc3VyZSAqY2xvc3VyZSwKKwkJICAgICAgZmZpX2NpZiAqY2lmLAorCQkgICAgICB2b2lkICgqZnVuKSAoZmZpX2NpZiAqLCB2b2lkICosIHZvaWQgKiosIHZvaWQgKiksCisJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJICAgICAgdm9pZCAqY29kZWxvYykKK3sKKyAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpOworCisjaWZuZGVmIF9fczM5MHhfXworICAqKHNob3J0ICopJmNsb3N1cmUtPnRyYW1wIFswXSA9IDB4MGQxMDsgICAvKiBiYXNyICVyMSwwICovCisgICooc2hvcnQgKikmY2xvc3VyZS0+dHJhbXAgWzJdID0gMHg5ODAxOyAgIC8qIGxtICVyMCwlcjEsNiglcjEpICovCisgICooc2hvcnQgKikmY2xvc3VyZS0+dHJhbXAgWzRdID0gMHgxMDA2OworICAqKHNob3J0ICopJmNsb3N1cmUtPnRyYW1wIFs2XSA9IDB4MDdmMTsgICAvKiBiciAlcjEgKi8KKyAgKihsb25nICAqKSZjbG9zdXJlLT50cmFtcCBbOF0gPSAobG9uZyljb2RlbG9jOworICAqKGxvbmcgICopJmNsb3N1cmUtPnRyYW1wWzEyXSA9IChsb25nKSZmZmlfY2xvc3VyZV9TWVNWOworI2Vsc2UKKyAgKihzaG9ydCAqKSZjbG9zdXJlLT50cmFtcCBbMF0gPSAweDBkMTA7ICAgLyogYmFzciAlcjEsMCAqLworICAqKHNob3J0ICopJmNsb3N1cmUtPnRyYW1wIFsyXSA9IDB4ZWIwMTsgICAvKiBsbWcgJXIwLCVyMSwxNCglcjEpICovCisgICooc2hvcnQgKikmY2xvc3VyZS0+dHJhbXAgWzRdID0gMHgxMDBlOworICAqKHNob3J0ICopJmNsb3N1cmUtPnRyYW1wIFs2XSA9IDB4MDAwNDsKKyAgKihzaG9ydCAqKSZjbG9zdXJlLT50cmFtcCBbOF0gPSAweDA3ZjE7ICAgLyogYnIgJXIxICovCisgICoobG9uZyAgKikmY2xvc3VyZS0+dHJhbXBbMTZdID0gKGxvbmcpY29kZWxvYzsKKyAgKihsb25nICAqKSZjbG9zdXJlLT50cmFtcFsyNF0gPSAobG9uZykmZmZpX2Nsb3N1cmVfU1lTVjsKKyNlbmRpZiAKKyAKKyAgY2xvc3VyZS0+Y2lmID0gY2lmOworICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIGNsb3N1cmUtPmZ1biA9IGZ1bjsKKyAKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG9mIFJvdXRpbmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3MzOTAvZmZpdGFyZ2V0LmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3MzOTAvZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2MjY5MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvczM5MC9mZml0YXJnZXQuaApAQCAtMCwwICsxLDYyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBTMzkwLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICisjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAorCisjaWYgZGVmaW5lZCAoX19zMzkweF9fKQorI2lmbmRlZiBTMzkwWAorI2RlZmluZSBTMzkwWAorI2VuZGlmCisjZW5kaWYKKworLyogLS0tLSBTeXN0ZW0gc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfQVNNCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZmZpX2FyZzsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgICAgICAgICAgICBmZmlfc2FyZzsKKwordHlwZWRlZiBlbnVtIGZmaV9hYmkgeworICBGRklfRklSU1RfQUJJID0gMCwKKyAgRkZJX1NZU1YsCisgIEZGSV9MQVNUX0FCSSwKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YKK30gZmZpX2FiaTsKKyNlbmRpZgorCisKKy8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIGNsb3N1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRkZJX0NMT1NVUkVTIDEKKyNpZmRlZiBTMzkwWAorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDMyCisjZWxzZQorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDE2CisjZW5kaWYKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvczM5MC9zeXN2LlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3MzOTAvc3lzdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzFhMzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3MzOTAvc3lzdi5TCkBAIC0wLDAgKzEsNDM0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDAwIFNvZnR3YXJlIEFHCisgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggUmVkIEhhdCwgSW5jLgorIAorICAgUzM5MCBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQorIAorICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworI2lmbmRlZiBfX3MzOTB4X18KKyAKKy50ZXh0CisKKwkjIHIyOgljaWYtPmJ5dGVzCisJIyByMzoJJmVjaWYKKwkjIHI0OglmZmlfcHJlcF9hcmdzCisJIyByNToJcmV0X3R5cGUKKwkjIHI2OgllY2lmLnJ2YWx1ZQorCSMgb3Y6CWZuIAorIAorCSMgVGhpcyBhc3N1bWVzIHdlIGFyZSB1c2luZyBnYXMuCisJLmdsb2JsCWZmaV9jYWxsX1NZU1YKKwkudHlwZQlmZmlfY2FsbF9TWVNWLCVmdW5jdGlvbgorZmZpX2NhbGxfU1lTVjoKKy5MRkIxOgorCXN0bQklcjYsJXIxNSwyNCglcjE1KQkJIyBTYXZlIHJlZ2lzdGVycworLkxDRkkwOgorCWJhc3IJJXIxMywwCQkJCSMgU2V0IHVwIGJhc2UgcmVnaXN0ZXIKKy5MYmFzZToKKwlscgklcjExLCVyMTUJCQkjIFNldCB1cCBmcmFtZSBwb2ludGVyCisuTENGSTE6CisJc3IJJXIxNSwlcjIKKwlhaGkJJXIxNSwtOTYtNDgJCQkjIEFsbG9jYXRlIHN0YWNrCisJbHIJJXI4LCVyNgkJCQkjIFNhdmUgZWNpZi5ydmFsdWUKKwlzcgklcjksJXI5CisJaWMJJXI5LC5MdGFibGUtLkxiYXNlKCVyMTMsJXI1KQkjIExvYWQgZXBpbG9nIGFkZHJlc3MKKwlsCSVyNyw5NiglcjExKQkJCSMgTG9hZCBmdW5jdGlvbiBhZGRyZXNzCisJc3QJJXIxMSwwKCVyMTUpCQkJIyBTZXQgdXAgYmFjayBjaGFpbgorCWFoaQklcjExLC00OAkJCSMgUmVnaXN0ZXIgc2F2ZSBhcmVhCisuTENGSTI6CisKKwlsYQklcjIsOTYoJXIxNSkJCQkjIFNhdmUgYXJlYQorCQkJCQkJIyByMyBhbHJlYWR5IGhvbGRzICZlY2lmCisJYmFzcgklcjE0LCVyNAkJCSMgQ2FsbCBmZmlfcHJlcF9hcmdzCisKKwlsbQklcjIsJXI2LDAoJXIxMSkJCQkjIExvYWQgYXJndW1lbnRzCisJbGQJJWYwLDMyKCVyMTEpCisJbGQJJWYyLDQwKCVyMTEpCisJbGEJJXIxNCwwKCVyMTMsJXI5KQkJIyBTZXQgcmV0dXJuIGFkZHJlc3MKKwlicgklcjcJCQkJIyAuLi4gYW5kIGNhbGwgZnVuY3Rpb24KKworLkxyZXROb25lOgkJCQkJIyBSZXR1cm4gdm9pZAorCWwJJXI0LDQ4KzU2KCVyMTEpCisJbG0JJXI2LCVyMTUsNDgrMjQoJXIxMSkKKwlicgklcjQKKworLkxyZXRGbG9hdDoKKwlsCSVyNCw0OCs1NiglcjExKQorCXN0ZQklZjAsMCglcjgpCQkJIyBSZXR1cm4gZmxvYXQKKwlsbQklcjYsJXIxNSw0OCsyNCglcjExKQorCWJyCSVyNAorIAorLkxyZXREb3VibGU6CisJbAklcjQsNDgrNTYoJXIxMSkKKwlzdGQJJWYwLDAoJXI4KQkJCSMgUmV0dXJuIGRvdWJsZQorCWxtCSVyNiwlcjE1LDQ4KzI0KCVyMTEpCisJYnIJJXI0CisKKy5McmV0SW50MzI6CisJbAklcjQsNDgrNTYoJXIxMSkKKwlzdAklcjIsMCglcjgpCQkJIyBSZXR1cm4gaW50CisJbG0JJXI2LCVyMTUsNDgrMjQoJXIxMSkKKwlicgklcjQKKyAKKy5McmV0SW50NjQ6CisJbAklcjQsNDgrNTYoJXIxMSkKKwlzdG0JJXIyLCVyMywwKCVyOCkJCQkjIFJldHVybiBsb25nIGxvbmcKKwlsbQklcjYsJXIxNSw0OCsyNCglcjExKQorCWJyCSVyNAorIAorLkx0YWJsZToKKwkuYnl0ZQkuTHJldE5vbmUtLkxiYXNlCQkjIEZGSTM5MF9SRVRfVk9JRAorCS5ieXRlCS5McmV0Tm9uZS0uTGJhc2UJCSMgRkZJMzkwX1JFVF9TVFJVQ1QKKwkuYnl0ZQkuTHJldEZsb2F0LS5MYmFzZQkJIyBGRkkzOTBfUkVUX0ZMT0FUCisJLmJ5dGUJLkxyZXREb3VibGUtLkxiYXNlCQkjIEZGSTM5MF9SRVRfRE9VQkxFCisJLmJ5dGUJLkxyZXRJbnQzMi0uTGJhc2UJCSMgRkZJMzkwX1JFVF9JTlQzMgorCS5ieXRlCS5McmV0SW50NjQtLkxiYXNlCQkjIEZGSTM5MF9SRVRfSU5UNjQKKworLkxGRTE6IAorLmZmaV9jYWxsX1NZU1ZfZW5kOgorCS5zaXplCSBmZmlfY2FsbF9TWVNWLC5mZmlfY2FsbF9TWVNWX2VuZC1mZmlfY2FsbF9TWVNWCisKKworCS5nbG9ibAlmZmlfY2xvc3VyZV9TWVNWCisJLnR5cGUJZmZpX2Nsb3N1cmVfU1lTViwlZnVuY3Rpb24KK2ZmaV9jbG9zdXJlX1NZU1Y6CisuTEZCMjoKKwlzdG0JJXIxMiwlcjE1LDQ4KCVyMTUpCQkjIFNhdmUgcmVnaXN0ZXJzCisuTENGSTEwOgorCWJhc3IJJXIxMywwCQkJCSMgU2V0IHVwIGJhc2UgcmVnaXN0ZXIKKy5MY2Jhc2U6CisJc3RtCSVyMiwlcjYsOCglcjE1KQkJCSMgU2F2ZSBhcmd1bWVudHMKKwlzdGQJJWYwLDY0KCVyMTUpCisJc3RkCSVmMiw3MiglcjE1KQorCWxyCSVyMSwlcjE1CQkJIyBTZXQgdXAgc3RhY2sgZnJhbWUKKwlhaGkJJXIxNSwtOTYKKy5MQ0ZJMTE6CisJbAklcjEyLC5MY2hlbHBlci0uTGNiYXNlKCVyMTMpCSMgR2V0IGhlbHBlciBmdW5jdGlvbgorCWxyCSVyMiwlcjAJCQkJIyBDbG9zdXJlCisJbGEJJXIzLDgoJXIxKQkJCSMgR1BScworCWxhCSVyNCw2NCglcjEpCQkJIyBGUFJzCisJbGEJJXI1LDk2KCVyMSkJCQkjIE92ZXJmbG93CisJc3QJJXIxLDAoJXIxNSkJCQkjIFNldCB1cCBiYWNrIGNoYWluCisKKwliYXMJJXIxNCwwKCVyMTIsJXIxMykJCSMgQ2FsbCBoZWxwZXIKKworCWwJJXI0LDk2KzU2KCVyMTUpCisJbGQJJWYwLDk2KzY0KCVyMTUpCQkJIyBMb2FkIHJldHVybiByZWdpc3RlcnMKKwlsbQklcjIsJXIzLDk2KzgoJXIxNSkKKwlsbQklcjEyLCVyMTUsOTYrNDgoJXIxNSkKKwlicgklcjQKKworCS5hbGlnbiA0CisuTGNoZWxwZXI6CisJLmxvbmcJZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YtLkxjYmFzZQorCisuTEZFMjogCisKKy5mZmlfY2xvc3VyZV9TWVNWX2VuZDoKKwkuc2l6ZQkgZmZpX2Nsb3N1cmVfU1lTViwuZmZpX2Nsb3N1cmVfU1lTVl9lbmQtZmZpX2Nsb3N1cmVfU1lTVgorCisKKwkuc2VjdGlvbgkuZWhfZnJhbWUsRUhfRlJBTUVfRkxBR1MsQHByb2diaXRzCisuTGZyYW1lMToKKwkuNGJ5dGUJLkxFQ0lFMS0uTFNDSUUxCSMgTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQorLkxTQ0lFMToKKwkuNGJ5dGUJMHgwCSMgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCSMgQ0lFIFZlcnNpb24KKwkuYXNjaWkgInpSXDAiCSMgQ0lFIEF1Z21lbnRhdGlvbgorCS51bGViMTI4IDB4MQkjIENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IKKwkuc2xlYjEyOCAtNAkjIENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IKKwkuYnl0ZQkweGUJIyBDSUUgUkEgQ29sdW1uCisJLnVsZWIxMjggMHgxCSMgQXVnbWVudGF0aW9uIHNpemUKKwkuYnl0ZQkweDFiCSMgRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpCisJLmJ5dGUJMHhjCSMgRFdfQ0ZBX2RlZl9jZmEKKwkudWxlYjEyOCAweGYKKwkudWxlYjEyOCAweDYwCisJLmFsaWduCTQKKy5MRUNJRTE6CisuTFNGREUxOgorCS40Ynl0ZQkuTEVGREUxLS5MQVNGREUxCSMgRkRFIExlbmd0aAorLkxBU0ZERTE6CisJLjRieXRlCS5MQVNGREUxLS5MZnJhbWUxCSMgRkRFIENJRSBvZmZzZXQKKwkuNGJ5dGUJLkxGQjEtLgkjIEZERSBpbml0aWFsIGxvY2F0aW9uCisJLjRieXRlCS5MRkUxLS5MRkIxCSMgRkRFIGFkZHJlc3MgcmFuZ2UKKwkudWxlYjEyOCAweDAJIyBBdWdtZW50YXRpb24gc2l6ZQorCS5ieXRlCTB4NAkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJLkxDRkkwLS5MRkIxCisJLmJ5dGUJMHg4ZgkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGYKKwkudWxlYjEyOCAweDkKKwkuYnl0ZQkweDhlCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4ZQorCS51bGViMTI4IDB4YQorCS5ieXRlCTB4OGQJIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhkCisJLnVsZWIxMjggMHhiCisJLmJ5dGUJMHg4YwkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGMKKwkudWxlYjEyOCAweGMKKwkuYnl0ZQkweDhiCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4YgorCS51bGViMTI4IDB4ZAorCS5ieXRlCTB4OGEJIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhhCisJLnVsZWIxMjggMHhlCisJLmJ5dGUJMHg4OQkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDkKKwkudWxlYjEyOCAweGYKKwkuYnl0ZQkweDg4CSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OAorCS51bGViMTI4IDB4MTAKKwkuYnl0ZQkweDg3CSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NworCS51bGViMTI4IDB4MTEKKwkuYnl0ZQkweDg2CSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NgorCS51bGViMTI4IDB4MTIKKwkuYnl0ZQkweDQJIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLjRieXRlCS5MQ0ZJMS0uTENGSTAKKwkuYnl0ZQkweGQJIyBEV19DRkFfZGVmX2NmYV9yZWdpc3RlcgorCS51bGViMTI4IDB4YgorCS5ieXRlCTB4NAkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJLkxDRkkyLS5MQ0ZJMQorCS5ieXRlCTB4ZQkjIERXX0NGQV9kZWZfY2ZhX29mZnNldAorCS51bGViMTI4IDB4OTAKKwkuYWxpZ24JNAorLkxFRkRFMToKKy5MU0ZERTI6CisJLjRieXRlCS5MRUZERTItLkxBU0ZERTIJIyBGREUgTGVuZ3RoCisuTEFTRkRFMjoKKwkuNGJ5dGUJLkxBU0ZERTItLkxmcmFtZTEJIyBGREUgQ0lFIG9mZnNldAorCS40Ynl0ZQkuTEZCMi0uCSMgRkRFIGluaXRpYWwgbG9jYXRpb24KKwkuNGJ5dGUJLkxGRTItLkxGQjIJIyBGREUgYWRkcmVzcyByYW5nZQorCS51bGViMTI4IDB4MAkjIEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHg0CSMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS40Ynl0ZQkuTENGSTEwLS5MRkIyCisJLmJ5dGUJMHg4ZgkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGYKKwkudWxlYjEyOCAweDkKKwkuYnl0ZQkweDhlCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4ZQorCS51bGViMTI4IDB4YQorCS5ieXRlCTB4OGQJIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhkCisJLnVsZWIxMjggMHhiCisJLmJ5dGUJMHg4YwkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGMKKwkudWxlYjEyOCAweGMKKwkuYnl0ZQkweDQJIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLjRieXRlCS5MQ0ZJMTEtLkxDRkkxMAorCS5ieXRlCTB4ZQkjIERXX0NGQV9kZWZfY2ZhX29mZnNldAorCS51bGViMTI4IDB4YzAKKwkuYWxpZ24JNAorLkxFRkRFMjoKKworI2Vsc2UKKyAKKy50ZXh0CisgCisJIyByMjoJY2lmLT5ieXRlcworCSMgcjM6CSZlY2lmCisJIyByNDoJZmZpX3ByZXBfYXJncworCSMgcjU6CXJldF90eXBlCisJIyByNjoJZWNpZi5ydmFsdWUKKwkjIG92OglmbiAKKyAKKwkjIFRoaXMgYXNzdW1lcyB3ZSBhcmUgdXNpbmcgZ2FzLgorCS5nbG9ibAlmZmlfY2FsbF9TWVNWCisJLnR5cGUJZmZpX2NhbGxfU1lTViwlZnVuY3Rpb24KK2ZmaV9jYWxsX1NZU1Y6CisuTEZCMToKKwlzdG1nCSVyNiwlcjE1LDQ4KCVyMTUpCQkjIFNhdmUgcmVnaXN0ZXJzCisuTENGSTA6CisJbGFybAklcjEzLC5MYmFzZQkJCSMgU2V0IHVwIGJhc2UgcmVnaXN0ZXIKKwlsZ3IJJXIxMSwlcjE1CQkJIyBTZXQgdXAgZnJhbWUgcG9pbnRlcgorLkxDRkkxOgorCXNncgklcjE1LCVyMgorCWFnaGkJJXIxNSwtMTYwLTgwCQkJIyBBbGxvY2F0ZSBzdGFjaworCWxncgklcjgsJXI2CQkJCSMgU2F2ZSBlY2lmLnJ2YWx1ZQorCWxsZ2MJJXI5LC5MdGFibGUtLkxiYXNlKCVyMTMsJXI1KQkjIExvYWQgZXBpbG9nIGFkZHJlc3MKKwlsZwklcjcsMTYwKCVyMTEpCQkJIyBMb2FkIGZ1bmN0aW9uIGFkZHJlc3MKKwlzdGcJJXIxMSwwKCVyMTUpCQkJIyBTZXQgdXAgYmFjayBjaGFpbgorCWFnaGkJJXIxMSwtODAJCQkjIFJlZ2lzdGVyIHNhdmUgYXJlYQorLkxDRkkyOgorCisJbGEJJXIyLDE2MCglcjE1KQkJCSMgU2F2ZSBhcmVhCisJCQkJCQkjIHIzIGFscmVhZHkgaG9sZHMgJmVjaWYKKwliYXNyCSVyMTQsJXI0CQkJIyBDYWxsIGZmaV9wcmVwX2FyZ3MKKworCWxtZwklcjIsJXI2LDAoJXIxMSkJCQkjIExvYWQgYXJndW1lbnRzCisJbGQJJWYwLDQ4KCVyMTEpCisJbGQJJWYyLDU2KCVyMTEpCisJbGQJJWY0LDY0KCVyMTEpCisJbGQJJWY2LDcyKCVyMTEpCisJbGEJJXIxNCwwKCVyMTMsJXI5KQkJIyBTZXQgcmV0dXJuIGFkZHJlc3MKKwlicgklcjcJCQkJIyAuLi4gYW5kIGNhbGwgZnVuY3Rpb24KKworLkxiYXNlOgorLkxyZXROb25lOgkJCQkJIyBSZXR1cm4gdm9pZAorCWxnCSVyNCw4MCsxMTIoJXIxMSkKKwlsbWcJJXI2LCVyMTUsODArNDgoJXIxMSkKKwlicgklcjQKKworLkxyZXRGbG9hdDoKKwlsZwklcjQsODArMTEyKCVyMTEpCisJc3RlCSVmMCwwKCVyOCkJCQkjIFJldHVybiBmbG9hdAorCWxtZwklcjYsJXIxNSw4MCs0OCglcjExKQorCWJyCSVyNAorIAorLkxyZXREb3VibGU6CisJbGcJJXI0LDgwKzExMiglcjExKQorCXN0ZAklZjAsMCglcjgpCQkJIyBSZXR1cm4gZG91YmxlCisJbG1nCSVyNiwlcjE1LDgwKzQ4KCVyMTEpCisJYnIJJXI0CisKKy5McmV0SW50MzI6CisJbGcJJXI0LDgwKzExMiglcjExKQorCXN0CSVyMiwwKCVyOCkJCQkjIFJldHVybiBpbnQKKwlsbWcJJXI2LCVyMTUsODArNDgoJXIxMSkKKwlicgklcjQKKyAKKy5McmV0SW50NjQ6CisJbGcJJXI0LDgwKzExMiglcjExKQorCXN0ZwklcjIsMCglcjgpCQkJIyBSZXR1cm4gbG9uZworCWxtZwklcjYsJXIxNSw4MCs0OCglcjExKQorCWJyCSVyNAorIAorLkx0YWJsZToKKwkuYnl0ZQkuTHJldE5vbmUtLkxiYXNlCQkjIEZGSTM5MF9SRVRfVk9JRAorCS5ieXRlCS5McmV0Tm9uZS0uTGJhc2UJCSMgRkZJMzkwX1JFVF9TVFJVQ1QKKwkuYnl0ZQkuTHJldEZsb2F0LS5MYmFzZQkJIyBGRkkzOTBfUkVUX0ZMT0FUCisJLmJ5dGUJLkxyZXREb3VibGUtLkxiYXNlCQkjIEZGSTM5MF9SRVRfRE9VQkxFCisJLmJ5dGUJLkxyZXRJbnQzMi0uTGJhc2UJCSMgRkZJMzkwX1JFVF9JTlQzMgorCS5ieXRlCS5McmV0SW50NjQtLkxiYXNlCQkjIEZGSTM5MF9SRVRfSU5UNjQKKworLkxGRTE6IAorLmZmaV9jYWxsX1NZU1ZfZW5kOgorCS5zaXplCSBmZmlfY2FsbF9TWVNWLC5mZmlfY2FsbF9TWVNWX2VuZC1mZmlfY2FsbF9TWVNWCisKKworCS5nbG9ibAlmZmlfY2xvc3VyZV9TWVNWCisJLnR5cGUJZmZpX2Nsb3N1cmVfU1lTViwlZnVuY3Rpb24KK2ZmaV9jbG9zdXJlX1NZU1Y6CisuTEZCMjoKKwlzdG1nCSVyMTQsJXIxNSwxMTIoJXIxNSkJCSMgU2F2ZSByZWdpc3RlcnMKKy5MQ0ZJMTA6CisJc3RtZwklcjIsJXI2LDE2KCVyMTUpCQkjIFNhdmUgYXJndW1lbnRzCisJc3RkCSVmMCwxMjgoJXIxNSkKKwlzdGQJJWYyLDEzNiglcjE1KQorCXN0ZAklZjQsMTQ0KCVyMTUpCisJc3RkCSVmNiwxNTIoJXIxNSkKKwlsZ3IJJXIxLCVyMTUJCQkjIFNldCB1cCBzdGFjayBmcmFtZQorCWFnaGkJJXIxNSwtMTYwCisuTENGSTExOgorCWxncgklcjIsJXIwCQkJCSMgQ2xvc3VyZQorCWxhCSVyMywxNiglcjEpCQkJIyBHUFJzCisJbGEJJXI0LDEyOCglcjEpCQkJIyBGUFJzCisJbGEJJXI1LDE2MCglcjEpCQkJIyBPdmVyZmxvdworCXN0ZwklcjEsMCglcjE1KQkJCSMgU2V0IHVwIGJhY2sgY2hhaW4KKworCWJyYXNsCSVyMTQsZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YJIyBDYWxsIGhlbHBlcgorCisJbGcJJXIxNCwxNjArMTEyKCVyMTUpCisJbGQJJWYwLDE2MCsxMjgoJXIxNSkJCSMgTG9hZCByZXR1cm4gcmVnaXN0ZXJzCisJbGcJJXIyLDE2MCsxNiglcjE1KQorCWxhCSVyMTUsMTYwKCVyMTUpCisJYnIJJXIxNAorLkxGRTI6IAorCisuZmZpX2Nsb3N1cmVfU1lTVl9lbmQ6CisJLnNpemUJIGZmaV9jbG9zdXJlX1NZU1YsLmZmaV9jbG9zdXJlX1NZU1ZfZW5kLWZmaV9jbG9zdXJlX1NZU1YKKworCisKKwkuc2VjdGlvbgkuZWhfZnJhbWUsRUhfRlJBTUVfRkxBR1MsQHByb2diaXRzCisuTGZyYW1lMToKKwkuNGJ5dGUJLkxFQ0lFMS0uTFNDSUUxCSMgTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQorLkxTQ0lFMToKKwkuNGJ5dGUJMHgwCSMgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCSMgQ0lFIFZlcnNpb24KKwkuYXNjaWkgInpSXDAiCSMgQ0lFIEF1Z21lbnRhdGlvbgorCS51bGViMTI4IDB4MQkjIENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IKKwkuc2xlYjEyOCAtOAkjIENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IKKwkuYnl0ZQkweGUJIyBDSUUgUkEgQ29sdW1uCisJLnVsZWIxMjggMHgxCSMgQXVnbWVudGF0aW9uIHNpemUKKwkuYnl0ZQkweDFiCSMgRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpCisJLmJ5dGUJMHhjCSMgRFdfQ0ZBX2RlZl9jZmEKKwkudWxlYjEyOCAweGYKKwkudWxlYjEyOCAweGEwCisJLmFsaWduCTgKKy5MRUNJRTE6CisuTFNGREUxOgorCS40Ynl0ZQkuTEVGREUxLS5MQVNGREUxCSMgRkRFIExlbmd0aAorLkxBU0ZERTE6CisJLjRieXRlCS5MQVNGREUxLS5MZnJhbWUxCSMgRkRFIENJRSBvZmZzZXQKKwkuNGJ5dGUJLkxGQjEtLgkjIEZERSBpbml0aWFsIGxvY2F0aW9uCisJLjRieXRlCS5MRkUxLS5MRkIxCSMgRkRFIGFkZHJlc3MgcmFuZ2UKKwkudWxlYjEyOCAweDAJIyBBdWdtZW50YXRpb24gc2l6ZQorCS5ieXRlCTB4NAkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJLkxDRkkwLS5MRkIxCisJLmJ5dGUJMHg4ZgkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGYKKwkudWxlYjEyOCAweDUKKwkuYnl0ZQkweDhlCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4ZQorCS51bGViMTI4IDB4NgorCS5ieXRlCTB4OGQJIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhkCisJLnVsZWIxMjggMHg3CisJLmJ5dGUJMHg4YwkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGMKKwkudWxlYjEyOCAweDgKKwkuYnl0ZQkweDhiCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4YgorCS51bGViMTI4IDB4OQorCS5ieXRlCTB4OGEJIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhhCisJLnVsZWIxMjggMHhhCisJLmJ5dGUJMHg4OQkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDkKKwkudWxlYjEyOCAweGIKKwkuYnl0ZQkweDg4CSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OAorCS51bGViMTI4IDB4YworCS5ieXRlCTB4ODcJIyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg3CisJLnVsZWIxMjggMHhkCisJLmJ5dGUJMHg4NgkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDYKKwkudWxlYjEyOCAweGUKKwkuYnl0ZQkweDQJIyBEV19DRkFfYWR2YW5jZV9sb2M0CisJLjRieXRlCS5MQ0ZJMS0uTENGSTAKKwkuYnl0ZQkweGQJIyBEV19DRkFfZGVmX2NmYV9yZWdpc3RlcgorCS51bGViMTI4IDB4YgorCS5ieXRlCTB4NAkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJLkxDRkkyLS5MQ0ZJMQorCS5ieXRlCTB4ZQkjIERXX0NGQV9kZWZfY2ZhX29mZnNldAorCS51bGViMTI4IDB4ZjAKKwkuYWxpZ24JOAorLkxFRkRFMToKKy5MU0ZERTI6CisJLjRieXRlCS5MRUZERTItLkxBU0ZERTIJIyBGREUgTGVuZ3RoCisuTEFTRkRFMjoKKwkuNGJ5dGUJLkxBU0ZERTItLkxmcmFtZTEJIyBGREUgQ0lFIG9mZnNldAorCS40Ynl0ZQkuTEZCMi0uCSMgRkRFIGluaXRpYWwgbG9jYXRpb24KKwkuNGJ5dGUJLkxGRTItLkxGQjIJIyBGREUgYWRkcmVzcyByYW5nZQorCS51bGViMTI4IDB4MAkjIEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHg0CSMgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS40Ynl0ZQkuTENGSTEwLS5MRkIyCisJLmJ5dGUJMHg4ZgkjIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGYKKwkudWxlYjEyOCAweDUKKwkuYnl0ZQkweDhlCSMgRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4ZQorCS51bGViMTI4IDB4NgorCS5ieXRlCTB4NAkjIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJLkxDRkkxMS0uTENGSTEwCisJLmJ5dGUJMHhlCSMgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0CisJLnVsZWIxMjggMHgxNDAKKwkuYWxpZ24JOAorLkxFRkRFMjoKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fRUxGX18gJiYgZGVmaW5lZCBfX2xpbnV4X18KKwkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc2gvZmZpLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoL2ZmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmQwMjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoL2ZmaS5jCkBAIC0wLDAgKzEsNzE2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggS2F6IEtvamltYQorICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggUmVkIEhhdCwgSW5jLgorICAgCisgICBTdXBlckggRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBOR1JFR0FSRyA0CisjaWYgZGVmaW5lZChfX1NINF9fKQorI2RlZmluZSBORlJFR0FSRyA4CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ISVRBQ0hJX18pCisjZGVmaW5lIFNUUlVDVF9WQUxVRV9BRERSRVNTX1dJVEhfQVJHIDEKKyNlbHNlCisjZGVmaW5lIFNUUlVDVF9WQUxVRV9BRERSRVNTX1dJVEhfQVJHIDAKKyNlbmRpZgorCisvKiBJZiB0aGUgc3RydWN0dXJlIGhhcyBlc3NlbnRpYWx5IGFuIHVuaXF1ZSBlbGVtZW50LCByZXR1cm4gaXRzIHR5cGUuICAqLworc3RhdGljIGludAorc2ltcGxlX3R5cGUgKGZmaV90eXBlICphcmcpCit7CisgIGlmIChhcmctPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHJldHVybiBhcmctPnR5cGU7CisgIGVsc2UgaWYgKGFyZy0+ZWxlbWVudHNbMV0pCisgICAgcmV0dXJuIEZGSV9UWVBFX1NUUlVDVDsKKworICByZXR1cm4gc2ltcGxlX3R5cGUgKGFyZy0+ZWxlbWVudHNbMF0pOworfQorCitzdGF0aWMgaW50CityZXR1cm5fdHlwZSAoZmZpX3R5cGUgKmFyZykKK3sKKyAgdW5zaWduZWQgc2hvcnQgdHlwZTsKKworICBpZiAoYXJnLT50eXBlICE9IEZGSV9UWVBFX1NUUlVDVCkKKyAgICByZXR1cm4gYXJnLT50eXBlOworCisgIHR5cGUgPSBzaW1wbGVfdHlwZSAoYXJnLT5lbGVtZW50c1swXSk7CisgIGlmICghIGFyZy0+ZWxlbWVudHNbMV0pCisgICAgeworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1NJTlQ4OgorCWNhc2UgRkZJX1RZUEVfVUlOVDg6CisJY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICByZXR1cm4gRkZJX1RZUEVfSU5UOworCisJZGVmYXVsdDoKKwkgIHJldHVybiB0eXBlOworCX0KKyAgICB9CisKKyAgLyogZ2NjIHVzZXMgcjAvcjEgcGFpciBmb3Igc29tZSBraW5kIG9mIHN0cnVjdHVyZXMuICAqLworICBpZiAoYXJnLT5zaXplIDw9IDIgKiBzaXplb2YgKGludCkpCisgICAgeworICAgICAgaW50IGkgPSAwOworICAgICAgZmZpX3R5cGUgKmU7CisKKyAgICAgIHdoaWxlICgoZSA9IGFyZy0+ZWxlbWVudHNbaSsrXSkpCisJeworCSAgdHlwZSA9IHNpbXBsZV90eXBlIChlKTsKKwkgIHN3aXRjaCAodHlwZSkKKwkgICAgeworCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICAgIGNhc2UgRkZJX1RZUEVfSU5UOgorCSAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgICAgIHJldHVybiBGRklfVFlQRV9VSU5UNjQ7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIEZGSV9UWVBFX1NUUlVDVDsKK30KKworLyogZmZpX3ByZXBfYXJncyBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmx5IHJvdXRpbmUgb25jZSBzdGFjayBzcGFjZQorICAgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgKi8KKwordm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworICByZWdpc3RlciBpbnQgdG1wOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYXZuOworICByZWdpc3RlciB2b2lkICoqcF9hcmd2OworICByZWdpc3RlciBjaGFyICphcmdwOworICByZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOworICBpbnQgZ3JlZywgaXJlZzsKKyNpZiBkZWZpbmVkKF9fU0g0X18pCisgIGludCBmcmVnID0gMDsKKyNlbmRpZgorCisgIHRtcCA9IDA7CisgIGFyZ3AgPSBzdGFjazsKKworICBpZiAocmV0dXJuX3R5cGUgKGVjaWYtPmNpZi0+cnR5cGUpID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICAqKHZvaWQgKiopIGFyZ3AgPSBlY2lmLT5ydmFsdWU7CisgICAgICBhcmdwICs9IDQ7CisgICAgICBpcmVnID0gU1RSVUNUX1ZBTFVFX0FERFJFU1NfV0lUSF9BUkcgPyAxIDogMDsKKyAgICB9CisgIGVsc2UKKyAgICBpcmVnID0gMDsKKworICAvKiBTZXQgYXJndW1lbnRzIGZvciByZWdpc3RlcnMuICAqLworICBncmVnID0gaXJlZzsKKyAgYXZuID0gZWNpZi0+Y2lmLT5uYXJnczsKKyAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworCisgIGZvciAoaSA9IDAsIHBfYXJnID0gZWNpZi0+Y2lmLT5hcmdfdHlwZXM7IGkgPCBhdm47IGkrKywgcF9hcmcrKywgcF9hcmd2KyspCisgICAgeworICAgICAgc2l6ZV90IHo7CisKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKyAgICAgIGlmICh6IDwgc2l6ZW9mKGludCkpCisJeworCSAgaWYgKGdyZWcrKyA+PSBOR1JFR0FSRykKKwkgICAgY29udGludWU7CisKKwkgIHogPSBzaXplb2YoaW50KTsKKwkgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDggKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQ4ICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKyAgCisJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCSAgICAgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpKihTSU5UMTYgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMTYgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMzIgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgRkZJX0FTU0VSVCgwKTsKKwkgICAgfQorCSAgYXJncCArPSB6OworCX0KKyAgICAgIGVsc2UgaWYgKHogPT0gc2l6ZW9mKGludCkpCisJeworI2lmIGRlZmluZWQoX19TSDRfXykKKwkgIGlmICgoKnBfYXJnKS0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVCkKKwkgICAgeworCSAgICAgIGlmIChmcmVnKysgPj0gTkZSRUdBUkcpCisJCWNvbnRpbnVlOworCSAgICB9CisJICBlbHNlCisjZW5kaWYKKwkgICAgeworCSAgICAgIGlmIChncmVnKysgPj0gTkdSRUdBUkcpCisJCWNvbnRpbnVlOworCSAgICB9CisJICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQzMiAqKSgqIHBfYXJndik7CisJICBhcmdwICs9IHo7CisJfQorI2lmIGRlZmluZWQoX19TSDRfXykKKyAgICAgIGVsc2UgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKwl7CisJICBpZiAoZnJlZyArIDEgPj0gTkZSRUdBUkcpCisJICAgIGNvbnRpbnVlOworCSAgZnJlZyA9IChmcmVnICsgMSkgJiB+MTsKKwkgIGZyZWcgKz0gMjsKKwkgIG1lbWNweSAoYXJncCwgKnBfYXJndiwgeik7CisJICBhcmdwICs9IHo7CisJfQorI2VuZGlmCisgICAgICBlbHNlCisJeworCSAgaW50IG4gPSAoeiArIHNpemVvZiAoaW50KSAtIDEpIC8gc2l6ZW9mIChpbnQpOworI2lmIGRlZmluZWQoX19TSDRfXykKKwkgIGlmIChncmVnICsgbiAtIDEgPj0gTkdSRUdBUkcpCisJICAgIGNvbnRpbnVlOworI2Vsc2UKKwkgIGlmIChncmVnID49IE5HUkVHQVJHKQorCSAgICBjb250aW51ZTsKKyNlbmRpZgorCSAgZ3JlZyArPSBuOworCSAgbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKwkgIGFyZ3AgKz0gbiAqIHNpemVvZiAoaW50KTsKKwl9CisgICAgfQorCisgIC8qIFNldCBhcmd1bWVudHMgb24gc3RhY2suICAqLworICBncmVnID0gaXJlZzsKKyNpZiBkZWZpbmVkKF9fU0g0X18pCisgIGZyZWcgPSAwOworI2VuZGlmCisgIHBfYXJndiA9IGVjaWYtPmF2YWx1ZTsKKworICBmb3IgKGkgPSAwLCBwX2FyZyA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOyBpIDwgYXZuOyBpKyssIHBfYXJnKyssIHBfYXJndisrKQorICAgIHsKKyAgICAgIHNpemVfdCB6OworCisgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisgICAgICBpZiAoeiA8IHNpemVvZihpbnQpKQorCXsKKwkgIGlmIChncmVnKysgPCBOR1JFR0FSRykKKwkgICAgY29udGludWU7CisKKwkgIHogPSBzaXplb2YoaW50KTsKKwkgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDggKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQ4ICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKyAgCisJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCSAgICAgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpKihTSU5UMTYgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMTYgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMzIgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgRkZJX0FTU0VSVCgwKTsKKwkgICAgfQorCSAgYXJncCArPSB6OworCX0KKyAgICAgIGVsc2UgaWYgKHogPT0gc2l6ZW9mKGludCkpCisJeworI2lmIGRlZmluZWQoX19TSDRfXykKKwkgIGlmICgoKnBfYXJnKS0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVCkKKwkgICAgeworCSAgICAgIGlmIChmcmVnKysgPCBORlJFR0FSRykKKwkJY29udGludWU7CisJICAgIH0KKwkgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJICAgICAgaWYgKGdyZWcrKyA8IE5HUkVHQVJHKQorCQljb250aW51ZTsKKwkgICAgfQorCSAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMzIgKikoKiBwX2FyZ3YpOworCSAgYXJncCArPSB6OworCX0KKyNpZiBkZWZpbmVkKF9fU0g0X18pCisgICAgICBlbHNlIGlmICgoKnBfYXJnKS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisJeworCSAgaWYgKGZyZWcgKyAxIDwgTkZSRUdBUkcpCisJICAgIHsKKwkgICAgICBmcmVnID0gKGZyZWcgKyAxKSAmIH4xOworCSAgICAgIGZyZWcgKz0gMjsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKwkgIGFyZ3AgKz0gejsKKwl9CisjZW5kaWYKKyAgICAgIGVsc2UKKwl7CisJICBpbnQgbiA9ICh6ICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisJICBpZiAoZ3JlZyArIG4gLSAxIDwgTkdSRUdBUkcpCisJICAgIHsKKwkgICAgICBncmVnICs9IG47CisJICAgICAgY29udGludWU7CisJICAgIH0KKyNpZiAoISBkZWZpbmVkKF9fU0g0X18pKQorCSAgZWxzZSBpZiAoZ3JlZyA8IE5HUkVHQVJHKQorCSAgICB7CisJICAgICAgZ3JlZyA9IE5HUkVHQVJHOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisjZW5kaWYKKwkgIG1lbWNweSAoYXJncCwgKnBfYXJndiwgeik7CisJICBhcmdwICs9IG4gKiBzaXplb2YgKGludCk7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CisKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KK2ZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworICBpbnQgaSwgajsKKyAgaW50IHNpemUsIHR5cGU7CisgIGludCBuLCBtOworICBpbnQgZ3JlZzsKKyNpZiBkZWZpbmVkKF9fU0g0X18pCisgIGludCBmcmVnID0gMDsKKyNlbmRpZgorCisgIGNpZi0+ZmxhZ3MgPSAwOworCisgIGdyZWcgPSAoKHJldHVybl90eXBlIChjaWYtPnJ0eXBlKSA9PSBGRklfVFlQRV9TVFJVQ1QpICYmCisJICBTVFJVQ1RfVkFMVUVfQUREUkVTU19XSVRIX0FSRykgPyAxIDogMDsKKworI2lmIGRlZmluZWQoX19TSDRfXykKKyAgZm9yIChpID0gaiA9IDA7IGkgPCBjaWYtPm5hcmdzICYmIGogPCAxMjsgaSsrKQorICAgIHsKKyAgICAgIHR5cGUgPSAoY2lmLT5hcmdfdHlwZXMpW2ldLT50eXBlOworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgaWYgKGZyZWcgPj0gTkZSRUdBUkcpCisJICAgIGNvbnRpbnVlOworCSAgZnJlZysrOworCSAgY2lmLT5mbGFncyArPSAoKGNpZi0+YXJnX3R5cGVzKVtpXS0+dHlwZSkgPDwgKDIgKiBqKTsKKwkgIGorKzsKKwkgIGJyZWFrOworCisJY2FzZSBGRklfVFlQRV9ET1VCTEU6CisJICBpZiAoKGZyZWcgKyAxKSA+PSBORlJFR0FSRykKKwkgICAgY29udGludWU7CisJICBmcmVnID0gKGZyZWcgKyAxKSAmIH4xOworCSAgZnJlZyArPSAyOworCSAgY2lmLT5mbGFncyArPSAoKGNpZi0+YXJnX3R5cGVzKVtpXS0+dHlwZSkgPDwgKDIgKiBqKTsKKwkgIGorKzsKKwkgIGJyZWFrOworCSAgICAgIAorCWRlZmF1bHQ6CisJICBzaXplID0gKGNpZi0+YXJnX3R5cGVzKVtpXS0+c2l6ZTsKKwkgIG4gPSAoc2l6ZSArIHNpemVvZiAoaW50KSAtIDEpIC8gc2l6ZW9mIChpbnQpOworCSAgaWYgKGdyZWcgKyBuIC0gMSA+PSBOR1JFR0FSRykKKwkJY29udGludWU7CisJICBncmVnICs9IG47CisJICBmb3IgKG0gPSAwOyBtIDwgbjsgbSsrKQorCSAgICBjaWYtPmZsYWdzICs9IEZGSV9UWVBFX0lOVCA8PCAoMiAqIGorKyk7CisJICBicmVhazsKKwl9CisgICAgfQorI2Vsc2UKKyAgZm9yIChpID0gaiA9IDA7IGkgPCBjaWYtPm5hcmdzICYmIGogPCA0OyBpKyspCisgICAgeworICAgICAgc2l6ZSA9IChjaWYtPmFyZ190eXBlcylbaV0tPnNpemU7CisgICAgICBuID0gKHNpemUgKyBzaXplb2YgKGludCkgLSAxKSAvIHNpemVvZiAoaW50KTsKKyAgICAgIGlmIChncmVnID49IE5HUkVHQVJHKQorCWNvbnRpbnVlOworICAgICAgZWxzZSBpZiAoZ3JlZyArIG4gLSAxID49IE5HUkVHQVJHKQorCW4gPSBOR1JFR0FSRyAtIGdyZWc7CisgICAgICBncmVnICs9IG47CisgICAgICBmb3IgKG0gPSAwOyBtIDwgbjsgbSsrKQorICAgICAgICBjaWYtPmZsYWdzICs9IEZGSV9UWVBFX0lOVCA8PCAoMiAqIGorKyk7CisgICAgfQorI2VuZGlmCisKKyAgLyogU2V0IHRoZSByZXR1cm4gdHlwZSBmbGFnICovCisgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICBjaWYtPmZsYWdzICs9ICh1bnNpZ25lZCkgKHJldHVybl90eXBlIChjaWYtPnJ0eXBlKSkgPDwgMjQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgICAgY2lmLT5mbGFncyArPSAodW5zaWduZWQpIGNpZi0+cnR5cGUtPnR5cGUgPDwgMjQ7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBjaWYtPmZsYWdzICs9IEZGSV9UWVBFX0lOVCA8PCAyNDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gRkZJX09LOworfQorCitleHRlcm4gdm9pZCBmZmlfY2FsbF9TWVNWKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCBleHRlbmRlZF9jaWYgKiwKKwkJCSAgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCAqLCB2b2lkICgqZm4pKHZvaWQpKTsKKwordm9pZCBmZmlfY2FsbChmZmlfY2lmICpjaWYsIHZvaWQgKCpmbikodm9pZCksIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZSkKK3sKKyAgZXh0ZW5kZWRfY2lmIGVjaWY7CisgIFVJTlQ2NCB0cnZhbHVlOworCisgIGVjaWYuY2lmID0gY2lmOworICBlY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKKyAgCisgIC8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4JKi8KKyAgLyogdmFsdWUgYWRkcmVzcyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBvbmUJCSAgICAgICAgKi8KKworICBpZiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKKyAgICAgICYmIHJldHVybl90eXBlIChjaWYtPnJ0eXBlKSAhPSBGRklfVFlQRV9TVFJVQ1QpCisgICAgZWNpZi5ydmFsdWUgPSAmdHJ2YWx1ZTsKKyAgZWxzZSBpZiAoKHJ2YWx1ZSA9PSBOVUxMKSAmJiAKKyAgICAgIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkpCisgICAgeworICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSk7CisgICAgfQorICBlbHNlCisgICAgZWNpZi5ydmFsdWUgPSBydmFsdWU7CisKKyAgc3dpdGNoIChjaWYtPmFiaSkgCisgICAgeworICAgIGNhc2UgRkZJX1NZU1Y6CisgICAgICBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBjaWYtPmJ5dGVzLCBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwKKwkJICAgIGZuKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChydmFsdWUKKyAgICAgICYmIGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAmJiByZXR1cm5fdHlwZSAoY2lmLT5ydHlwZSkgIT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIG1lbWNweSAocnZhbHVlLCAmdHJ2YWx1ZSwgY2lmLT5ydHlwZS0+c2l6ZSk7Cit9CisKK2V4dGVybiB2b2lkIGZmaV9jbG9zdXJlX1NZU1YgKHZvaWQpOworI2lmIGRlZmluZWQoX19TSDRfXykKK2V4dGVybiB2b2lkIF9faWNfaW52YWxpZGF0ZSAodm9pZCAqbGluZSk7CisjZW5kaWYKKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2xvc3VyZV9sb2MgKGZmaV9jbG9zdXJlKiBjbG9zdXJlLAorCQkgICAgICBmZmlfY2lmKiBjaWYsCisJCSAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLCB2b2lkKiwgdm9pZCoqLCB2b2lkKiksCisJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJICAgICAgdm9pZCAqY29kZWxvYykKK3sKKyAgdW5zaWduZWQgaW50ICp0cmFtcDsKKyAgdW5zaWduZWQgaW50IGluc247CisKKyAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX0dDQ19TWVNWKTsKKworICB0cmFtcCA9ICh1bnNpZ25lZCBpbnQgKikgJmNsb3N1cmUtPnRyYW1wWzBdOworICAvKiBTZXQgVCBiaXQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJ1Y3QgcG9pbnRlZCB3aXRoIFIyLiAgKi8KKyAgaW5zbiA9IChyZXR1cm5fdHlwZSAoY2lmLT5ydHlwZSkgPT0gRkZJX1RZUEVfU1RSVUNUCisJICA/IDB4MDAxOCAvKiBzZXR0ICovCisJICA6IDB4MDAwOCAvKiBjbHJ0ICovKTsKKworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgIHRyYW1wWzBdID0gMHhkMzAxZDEwMjsKKyAgdHJhbXBbMV0gPSAweDAwMDA0MTJiIHwgKGluc24gPDwgMTYpOworI2Vsc2UKKyAgdHJhbXBbMF0gPSAweGQxMDJkMzAxOworICB0cmFtcFsxXSA9IDB4NDEyYjAwMDAgfCBpbnNuOworI2VuZGlmCisgICoodm9pZCAqKikgJnRyYW1wWzJdID0gKHZvaWQgKiljb2RlbG9jOyAgICAgICAgICAvKiBjdHggKi8KKyAgKih2b2lkICoqKSAmdHJhbXBbM10gPSAodm9pZCAqKWZmaV9jbG9zdXJlX1NZU1Y7IC8qIGZ1bmFkZHIgKi8KKworICBjbG9zdXJlLT5jaWYgPSBjaWY7CisgIGNsb3N1cmUtPmZ1biA9IGZ1bjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworCisjaWYgZGVmaW5lZChfX1NINF9fKQorICAvKiBGbHVzaCB0aGUgaWNhY2hlLiAgKi8KKyAgX19pY19pbnZhbGlkYXRlKGNvZGVsb2MpOworI2VuZGlmCisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworLyogQmFzaWNhbGx5IHRoZSB0cmFtcG9saW5lIGludm9rZXMgZmZpX2Nsb3N1cmVfU1lTViwgYW5kIG9uIAorICogZW50cnksIHIzIGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSBjbG9zdXJlLgorICogQWZ0ZXIgc3RvcmluZyB0aGUgcmVnaXN0ZXJzIHRoYXQgY291bGQgcG9zc2libHkgY29udGFpbgorICogcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgaW50byB0aGUgc3RhY2sgZnJhbWUgYW5kIHNldHRpbmcKKyAqIHVwIHNwYWNlIGZvciBhIHJldHVybiB2YWx1ZSwgZmZpX2Nsb3N1cmVfU1lTViBpbnZva2VzIHRoZSAKKyAqIGZvbGxvd2luZyBoZWxwZXIgZnVuY3Rpb24gdG8gZG8gbW9zdCBvZiB0aGUgd29yay4KKyAqLworCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyNkZWZpbmUgT0ZTX0lOVDgJMAorI2RlZmluZSBPRlNfSU5UMTYJMAorI2Vsc2UKKyNkZWZpbmUgT0ZTX0lOVDgJMworI2RlZmluZSBPRlNfSU5UMTYJMgorI2VuZGlmCisKK2ludAorZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YgKGZmaV9jbG9zdXJlICpjbG9zdXJlLCB2b2lkICpydmFsdWUsIAorCQkJIHVuc2lnbmVkIGxvbmcgKnBnciwgdW5zaWduZWQgbG9uZyAqcGZyLCAKKwkJCSB1bnNpZ25lZCBsb25nICpwc3QpCit7CisgIHZvaWQgKiphdmFsdWU7CisgIGZmaV90eXBlICoqcF9hcmc7CisgIGludCBpLCBhdm47CisgIGludCBpcmVnLCBncmVnID0gMDsKKyNpZiBkZWZpbmVkKF9fU0g0X18pCisgIGludCBmcmVnID0gMDsKKyNlbmRpZgorICBmZmlfY2lmICpjaWY7IAorCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgYXZhbHVlID0gYWxsb2NhKGNpZi0+bmFyZ3MgKiBzaXplb2Yodm9pZCAqKSk7CisKKyAgLyogQ29weSB0aGUgY2FsbGVyJ3Mgc3RydWN0dXJlIHJldHVybiB2YWx1ZSBhZGRyZXNzIHNvIHRoYXQgdGhlIGNsb3N1cmUKKyAgICAgcmV0dXJucyB0aGUgZGF0YSBkaXJlY3RseSB0byB0aGUgY2FsbGVyLiAgKi8KKyAgaWYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUICYmIFNUUlVDVF9WQUxVRV9BRERSRVNTX1dJVEhfQVJHKQorICAgIHsKKyAgICAgIHJ2YWx1ZSA9ICh2b2lkICopICpwZ3IrKzsKKyAgICAgIGlyZWcgPSAxOworICAgIH0KKyAgZWxzZQorICAgIGlyZWcgPSAwOworCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgZ3JlZyA9IGlyZWc7CisgIGF2biA9IGNpZi0+bmFyZ3M7CisKKyAgLyogR3JhYiB0aGUgYWRkcmVzc2VzIG9mIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2sgZnJhbWUuICAqLworICBmb3IgKGkgPSAwLCBwX2FyZyA9IGNpZi0+YXJnX3R5cGVzOyBpIDwgYXZuOyBpKyssIHBfYXJnKyspCisgICAgeworICAgICAgc2l6ZV90IHo7CisKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKyAgICAgIGlmICh6IDwgc2l6ZW9mKGludCkpCisJeworCSAgaWYgKGdyZWcrKyA+PSBOR1JFR0FSRykKKwkgICAgY29udGludWU7CisKKwkgIHogPSBzaXplb2YoaW50KTsKKwkgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgICAgICBhdmFsdWVbaV0gPSAoKChjaGFyICopcGdyKSArIE9GU19JTlQ4KTsKKwkgICAgICBicmVhazsKKyAgCisJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCSAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkgICAgICBhdmFsdWVbaV0gPSAoKChjaGFyICopcGdyKSArIE9GU19JTlQxNik7CisJICAgICAgYnJlYWs7CisgIAorCSAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgICBhdmFsdWVbaV0gPSBwZ3I7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBGRklfQVNTRVJUKDApOworCSAgICB9CisJICBwZ3IrKzsKKwl9CisgICAgICBlbHNlIGlmICh6ID09IHNpemVvZihpbnQpKQorCXsKKyNpZiBkZWZpbmVkKF9fU0g0X18pCisJICBpZiAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisJICAgIHsKKwkgICAgICBpZiAoZnJlZysrID49IE5GUkVHQVJHKQorCQljb250aW51ZTsKKwkgICAgICBhdmFsdWVbaV0gPSBwZnI7CisJICAgICAgcGZyKys7CisJICAgIH0KKwkgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJICAgICAgaWYgKGdyZWcrKyA+PSBOR1JFR0FSRykKKwkJY29udGludWU7CisJICAgICAgYXZhbHVlW2ldID0gcGdyOworCSAgICAgIHBncisrOworCSAgICB9CisJfQorI2lmIGRlZmluZWQoX19TSDRfXykKKyAgICAgIGVsc2UgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKwl7CisJICBpZiAoZnJlZyArIDEgPj0gTkZSRUdBUkcpCisJICAgIGNvbnRpbnVlOworCSAgaWYgKGZyZWcgJiAxKQorCSAgICBwZnIrKzsKKwkgIGZyZWcgPSAoZnJlZyArIDEpICYgfjE7CisJICBmcmVnICs9IDI7CisJICBhdmFsdWVbaV0gPSBwZnI7CisJICBwZnIgKz0gMjsKKwl9CisjZW5kaWYKKyAgICAgIGVsc2UKKwl7CisJICBpbnQgbiA9ICh6ICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisjaWYgZGVmaW5lZChfX1NINF9fKQorCSAgaWYgKGdyZWcgKyBuIC0gMSA+PSBOR1JFR0FSRykKKwkgICAgY29udGludWU7CisjZWxzZQorCSAgaWYgKGdyZWcgPj0gTkdSRUdBUkcpCisJICAgIGNvbnRpbnVlOworI2VuZGlmCisJICBncmVnICs9IG47CisJICBhdmFsdWVbaV0gPSBwZ3I7CisJICBwZ3IgKz0gbjsKKwl9CisgICAgfQorCisgIGdyZWcgPSBpcmVnOworI2lmIGRlZmluZWQoX19TSDRfXykKKyAgZnJlZyA9IDA7CisjZW5kaWYKKworICBmb3IgKGkgPSAwLCBwX2FyZyA9IGNpZi0+YXJnX3R5cGVzOyBpIDwgYXZuOyBpKyssIHBfYXJnKyspCisgICAgeworICAgICAgc2l6ZV90IHo7CisKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKyAgICAgIGlmICh6IDwgc2l6ZW9mKGludCkpCisJeworCSAgaWYgKGdyZWcrKyA8IE5HUkVHQVJHKQorCSAgICBjb250aW51ZTsKKworCSAgeiA9IHNpemVvZihpbnQpOworCSAgc3dpdGNoICgoKnBfYXJnKS0+dHlwZSkKKwkgICAgeworCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorCSAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgICAgIGF2YWx1ZVtpXSA9ICgoKGNoYXIgKilwc3QpICsgT0ZTX0lOVDgpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgICAgIGF2YWx1ZVtpXSA9ICgoKGNoYXIgKilwc3QpICsgT0ZTX0lOVDE2KTsKKwkgICAgICBicmVhazsKKyAgCisJICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgICAgIGF2YWx1ZVtpXSA9IHBzdDsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIEZGSV9BU1NFUlQoMCk7CisJICAgIH0KKwkgIHBzdCsrOworCX0KKyAgICAgIGVsc2UgaWYgKHogPT0gc2l6ZW9mKGludCkpCisJeworI2lmIGRlZmluZWQoX19TSDRfXykKKwkgIGlmICgoKnBfYXJnKS0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVCkKKwkgICAgeworCSAgICAgIGlmIChmcmVnKysgPCBORlJFR0FSRykKKwkJY29udGludWU7CisJICAgIH0KKwkgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJICAgICAgaWYgKGdyZWcrKyA8IE5HUkVHQVJHKQorCQljb250aW51ZTsKKwkgICAgfQorCSAgYXZhbHVlW2ldID0gcHN0OworCSAgcHN0Kys7CisJfQorI2lmIGRlZmluZWQoX19TSDRfXykKKyAgICAgIGVsc2UgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKwl7CisJICBpZiAoZnJlZyArIDEgPCBORlJFR0FSRykKKwkgICAgeworCSAgICAgIGZyZWcgPSAoZnJlZyArIDEpICYgfjE7CisJICAgICAgZnJlZyArPSAyOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBhdmFsdWVbaV0gPSBwc3Q7CisJICBwc3QgKz0gMjsKKwl9CisjZW5kaWYKKyAgICAgIGVsc2UKKwl7CisJICBpbnQgbiA9ICh6ICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisJICBpZiAoZ3JlZyArIG4gLSAxIDwgTkdSRUdBUkcpCisJICAgIHsKKwkgICAgICBncmVnICs9IG47CisJICAgICAgY29udGludWU7CisJICAgIH0KKyNpZiAoISBkZWZpbmVkKF9fU0g0X18pKQorCSAgZWxzZSBpZiAoZ3JlZyA8IE5HUkVHQVJHKQorCSAgICB7CisJICAgICAgZ3JlZyArPSBuOworCSAgICAgIHBzdCArPSBncmVnIC0gTkdSRUdBUkc7CisJICAgICAgY29udGludWU7CisJICAgIH0KKyNlbmRpZgorCSAgYXZhbHVlW2ldID0gcHN0OworCSAgcHN0ICs9IG47CisJfQorICAgIH0KKworICAoY2xvc3VyZS0+ZnVuKSAoY2lmLCBydmFsdWUsIGF2YWx1ZSwgY2xvc3VyZS0+dXNlcl9kYXRhKTsKKworICAvKiBUZWxsIGZmaV9jbG9zdXJlX1NZU1YgaG93IHRvIHBlcmZvcm0gcmV0dXJuIHR5cGUgcHJvbW90aW9ucy4gICovCisgIHJldHVybiByZXR1cm5fdHlwZSAoY2lmLT5ydHlwZSk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoL2ZmaXRhcmdldC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zaC9mZml0YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFmNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zaC9mZml0YXJnZXQuaApAQCAtMCwwICsxLDQ5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBTdXBlckguCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKKyNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICisKKy8qIC0tLS0gR2VuZXJpYyB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX0FTTQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7Cit0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CisKK3R5cGVkZWYgZW51bSBmZmlfYWJpIHsKKyAgRkZJX0ZJUlNUX0FCSSA9IDAsCisgIEZGSV9TWVNWLAorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWCit9IGZmaV9hYmk7CisjZW5kaWYKKworI2RlZmluZSBGRklfQ0xPU1VSRVMgMQorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDE2CisjZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAwCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoL3N5c3YuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc2gvc3lzdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTc1MTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoL3N5c3YuUwpAQCAtMCwwICsxLDg1MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHN5c3YuUyAtIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiwgMjAwOCBLYXogS29qaW1hCisgICAKKyAgIFN1cGVySCBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBMSUJGRklfQVNNCQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorI2lmZGVmIEhBVkVfTUFDSElORV9BU01fSAorI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisjZWxzZQorLyogWFhYIHRoZXNlIGxvc2UgZm9yIHNvbWUgcGxhdGZvcm1zLCBJJ20gc3VyZS4gKi8KKyNkZWZpbmUgQ05BTUUoeCkgeAorI2RlZmluZSBFTlRSWSh4KSAuZ2xvYmwgQ05BTUUoeCk7IC50eXBlIENOQU1FKHgpLCVmdW5jdGlvbjsgQ05BTUUoeCk6CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ISVRBQ0hJX18pCisjZGVmaW5lIFNUUlVDVF9WQUxVRV9BRERSRVNTX1dJVEhfQVJHIDEKKyNlbHNlCisjZGVmaW5lIFNUUlVDVF9WQUxVRV9BRERSRVNTX1dJVEhfQVJHIDAKKyNlbmRpZgorCisudGV4dAorCisJIyByNDoJZmZpX3ByZXBfYXJncworCSMgcjU6CSZlY2lmCisJIyByNjoJYnl0ZXMKKwkjIHI3OglmbGFncworCSMgc3ArMDogcnZhbHVlCisJIyBzcCs0OiBmbgorCisJIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KK0VOVFJZKGZmaV9jYWxsX1NZU1YpCisJIyBTYXZlIHJlZ2lzdGVycworLkxGQjE6CisJbW92LmwJcjgsQC1yMTUKKy5MQ0ZJMDoKKwltb3YubAlyOSxALXIxNQorLkxDRkkxOgorCW1vdi5sCXIxMCxALXIxNQorLkxDRkkyOgorCW1vdi5sCXIxMixALXIxNQorLkxDRkkzOgorCW1vdi5sCXIxNCxALXIxNQorLkxDRkk0OgorCXN0cy5sCXByLEAtcjE1CisuTENGSTU6CisJbW92CXIxNSxyMTQKKy5MQ0ZJNjoKKyNpZiBkZWZpbmVkKF9fU0g0X18pCisJbW92CXI2LHI4CisJbW92CXI3LHI5CisKKwlzdWIJcjYscjE1CisJYWRkCSMtMTYscjE1CisJbW92CSN+NyxyMAorCWFuZAlyMCxyMTUKKworCW1vdglyNCxyMAorCWpzcglAcjAKKwkgbW92CXIxNSxyNAorCisJbW92CXI5LHIxCisJc2hscjgJcjkKKwlzaGxyOAlyOQorCXNobHI4CXI5CisKKwltb3YJI0ZGSV9UWVBFX1NUUlVDVCxyMgorCWNtcC9lcQlyMixyOQorCWJmCTFmCisjaWYgU1RSVUNUX1ZBTFVFX0FERFJFU1NfV0lUSF9BUkcKKyAJbW92LmwJQHIxNSsscjQKKwlicmEJMmYKKwkgbW92CSM1LHIyCisjZWxzZQorIAltb3YubAlAcjE1KyxyMTAKKyNlbmRpZgorMToKKwltb3YJIzQscjIKKzI6CisJbW92CSM0LHIzCisKK0xfcGFzczoKKwljbXAvcGwJcjgKKwliZglMX2NhbGxfaXQKKworCW1vdglyMSxyMAorCWFuZAkjMyxyMAorCitMX3Bhc3NfZDoKKwljbXAvZXEJI0ZGSV9UWVBFX0RPVUJMRSxyMAorCWJmCUxfcGFzc19mCisKKwltb3YJcjMscjAKKwlhbmQJIzEscjAKKwl0c3QJcjAscjAKKwlidAkxZgorCWFkZAkjMSxyMworMToKKwltb3YJIzEyLHIwCisJY21wL2hzCXIwLHIzCisJYnQvcwkzZgorCSBzaGxyMglyMQorCWJzcglMX3BvcF9kCisJIG5vcAorMzoKKwlhZGQJIzIscjMKKwlicmEJTF9wYXNzCisJIGFkZAkjLTgscjgKKworTF9wb3BfZDoKKwltb3YJcjMscjAKKwlhZGQJcjAscjAKKwlhZGQJcjMscjAKKwlhZGQJIy0xMixyMAorCWJyYWYJcjAKKwkgbm9wCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKwlmbW92LnMJQHIxNSssZnI1CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjQKKwlmbW92LnMJQHIxNSssZnI3CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjYKKwlmbW92LnMJQHIxNSssZnI5CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjgKKwlmbW92LnMJQHIxNSssZnIxMQorCXJ0cworCSBmbW92LnMJQHIxNSssZnIxMAorI2Vsc2UKKwlmbW92LnMJQHIxNSssZnI0CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjUKKwlmbW92LnMJQHIxNSssZnI2CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjcKKwlmbW92LnMJQHIxNSssZnI4CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjkKKwlmbW92LnMJQHIxNSssZnIxMAorCXJ0cworCSBmbW92LnMJQHIxNSssZnIxMQorI2VuZGlmCisKK0xfcGFzc19mOgorCWNtcC9lcQkjRkZJX1RZUEVfRkxPQVQscjAKKwliZglMX3Bhc3NfaQorCisJbW92CSMxMixyMAorCWNtcC9ocwlyMCxyMworCWJ0L3MJMmYKKwkgc2hscjIJcjEKKwlic3IJTF9wb3BfZgorCSBub3AKKzI6CisJYWRkCSMxLHIzCisJYnJhCUxfcGFzcworCSBhZGQJIy00LHI4CisKK0xfcG9wX2Y6CisJbW92CXIzLHIwCisJc2hsbDIJcjAKKwlhZGQJIy0xNixyMAorCWJyYWYJcjAKKwkgbm9wCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKwlydHMKKwkgZm1vdi5zCUByMTUrLGZyNQorCXJ0cworCSBmbW92LnMJQHIxNSssZnI0CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjcKKwlydHMKKwkgZm1vdi5zCUByMTUrLGZyNgorCXJ0cworCSBmbW92LnMJQHIxNSssZnI5CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjgKKwlydHMKKwkgZm1vdi5zCUByMTUrLGZyMTEKKwlydHMKKwkgZm1vdi5zCUByMTUrLGZyMTAKKyNlbHNlCisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjQKKwlydHMKKwkgZm1vdi5zCUByMTUrLGZyNQorCXJ0cworCSBmbW92LnMJQHIxNSssZnI2CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjcKKwlydHMKKwkgZm1vdi5zCUByMTUrLGZyOAorCXJ0cworCSBmbW92LnMJQHIxNSssZnI5CisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjEwCisJcnRzCisJIGZtb3YucwlAcjE1KyxmcjExCisjZW5kaWYKKworTF9wYXNzX2k6CisJY21wL2VxCSNGRklfVFlQRV9JTlQscjAKKwliZglMX2NhbGxfaXQKKworCW1vdgkjOCxyMAorCWNtcC9ocwlyMCxyMgorCWJ0L3MJMmYKKwkgc2hscjIJcjEKKwlic3IJTF9wb3BfaQorCSBub3AKKzI6CisJYWRkCSMxLHIyCisJYnJhCUxfcGFzcworCSBhZGQJIy00LHI4CisKK0xfcG9wX2k6CisJbW92CXIyLHIwCisJc2hsbDIJcjAKKwlhZGQJIy0xNixyMAorCWJyYWYJcjAKKwkgbm9wCisJcnRzCisJIG1vdi5sCUByMTUrLHI0CisJcnRzCisJIG1vdi5sCUByMTUrLHI1CisJcnRzCisJIG1vdi5sCUByMTUrLHI2CisJcnRzCisJIG1vdi5sCUByMTUrLHI3CisKK0xfY2FsbF9pdDoKKwkjIGNhbGwgZnVuY3Rpb24KKyNpZiAoISBTVFJVQ1RfVkFMVUVfQUREUkVTU19XSVRIX0FSRykKKwltb3YJcjEwLCByMgorI2VuZGlmCisJbW92LmwgIEAoMjgscjE0KSxyMQorCWpzciAgICBAcjEKKwkgbm9wCisKK0xfcmV0X2Q6CisJbW92CSNGRklfVFlQRV9ET1VCTEUscjIKKwljbXAvZXEJcjIscjkKKwliZglMX3JldF9sbAorCisJbW92LmwJQCgyNCxyMTQpLHIxCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKwlmbW92LnMJZnIxLEByMQorCWFkZAkjNCxyMQorCWJyYQlMX2VwaWxvZ3VlCisJIGZtb3YucwlmcjAsQHIxCisjZWxzZQorCWZtb3YucwlmcjAsQHIxCisJYWRkCSM0LHIxCisJYnJhCUxfZXBpbG9ndWUKKwkgZm1vdi5zCWZyMSxAcjEKKyNlbmRpZgorCitMX3JldF9sbDoKKwltb3YJI0ZGSV9UWVBFX1NJTlQ2NCxyMgorCWNtcC9lcQlyMixyOQorCWJ0L3MJMWYKKwkgbW92CSNGRklfVFlQRV9VSU5UNjQscjIKKwljbXAvZXEJcjIscjkKKwliZglMX3JldF9mCisKKzE6CisJbW92LmwJQCgyNCxyMTQpLHIyCisJbW92LmwJcjAsQHIyCisJYnJhCUxfZXBpbG9ndWUKKwkgbW92LmwJcjEsQCg0LHIyKQorCitMX3JldF9mOgorCW1vdgkjRkZJX1RZUEVfRkxPQVQscjIKKwljbXAvZXEJcjIscjkKKwliZglMX3JldF9pCisKKwltb3YubAlAKDI0LHIxNCkscjEKKwlicmEJTF9lcGlsb2d1ZQorCSBmbW92LnMJZnIwLEByMQorCitMX3JldF9pOgorCW1vdgkjRkZJX1RZUEVfSU5ULHIyCisJY21wL2VxCXIyLHI5CisJYmYJTF9lcGlsb2d1ZQorCisJbW92LmwJQCgyNCxyMTQpLHIxCisJYnJhCUxfZXBpbG9ndWUKKwkgbW92LmwJcjAsQHIxCisKK0xfZXBpbG9ndWU6CisJIyBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MKKwltb3YgICByMTQscjE1CisKKwlsZHMubCAgQHIxNSsscHIKKwltb3YubCAgQHIxNSsscjE0CisJbW92LmwgIEByMTUrLHIxMgorCW1vdi5sICBAcjE1KyxyMTAKKwltb3YubCAgQHIxNSsscjkKKwlydHMKKwkgbW92LmwgIEByMTUrLHI4CisjZWxzZQorCW1vdglyNixyOAorCW1vdglyNyxyOQorCisJc3ViCXI2LHIxNQorCWFkZAkjLTE2LHIxNQorCW1vdgkjfjcscjAKKwlhbmQJcjAscjE1CisKKwltb3YJcjQscjAKKwlqc3IJQHIwCisJIG1vdglyMTUscjQKKworCW1vdglyOSxyMworCXNobHI4CXI5CisJc2hscjgJcjkKKwlzaGxyOAlyOQorCisJbW92CSNGRklfVFlQRV9TVFJVQ1QscjIKKwljbXAvZXEJcjIscjkKKwliZgkxZgorI2lmIFNUUlVDVF9WQUxVRV9BRERSRVNTX1dJVEhfQVJHCisJbW92LmwJQHIxNSsscjQKKwlicmEJMmYKKwkgbW92CSM1LHIyCisjZWxzZQorCW1vdi5sCUByMTUrLHIxMAorI2VuZGlmCisxOgorCW1vdgkjNCxyMgorMjoKKworTF9wYXNzOgorCWNtcC9wbAlyOAorCWJmCUxfY2FsbF9pdAorCisJbW92CXIzLHIwCisJYW5kCSMzLHIwCisKK0xfcGFzc19kOgorCWNtcC9lcQkjRkZJX1RZUEVfRE9VQkxFLHIwCisJYmYJTF9wYXNzX2kKKworCW1vdglyMTUscjAKKwlhbmQJIzcscjAKKwl0c3QJcjAscjAKKwlidAkxZgorCWFkZAkjNCxyMTUKKzE6CisJbW92CSM4LHIwCisJY21wL2hzCXIwLHIyCisJYnQvcwkyZgorCSBzaGxyMglyMworCWJzcglMX3BvcF9kCisJIG5vcAorMjoKKwlhZGQJIzIscjIKKwlicmEJTF9wYXNzCisJIGFkZAkjLTgscjgKKworTF9wb3BfZDoKKwltb3YJcjIscjAKKwlhZGQJcjAscjAKKwlhZGQJcjIscjAKKwlhZGQJIy0xMixyMAorCWFkZAlyMCxyMAorCWJyYWYJcjAKKwkgbm9wCisJbW92LmwJQHIxNSsscjQKKwlydHMKKwkgbW92LmwJQHIxNSsscjUKKwltb3YubAlAcjE1KyxyNQorCXJ0cworCSBtb3YubAlAcjE1KyxyNgorCW1vdi5sCUByMTUrLHI2CisJcnRzCisJIG1vdi5sCUByMTUrLHI3CisJcnRzCisJIG1vdi5sCUByMTUrLHI3CisKK0xfcGFzc19pOgorCWNtcC9lcQkjRkZJX1RZUEVfSU5ULHIwCisJYmYJTF9jYWxsX2l0CisKKwltb3YJIzgscjAKKwljbXAvaHMJcjAscjIKKwlidC9zCTJmCisJIHNobHIyCXIzCisJYnNyCUxfcG9wX2kKKwkgbm9wCisyOgorCWFkZAkjMSxyMgorCWJyYQlMX3Bhc3MKKwkgYWRkCSMtNCxyOAorCitMX3BvcF9pOgorCW1vdglyMixyMAorCXNobGwyCXIwCisJYWRkCSMtMTYscjAKKwlicmFmCXIwCisJIG5vcAorCXJ0cworCSBtb3YubAlAcjE1KyxyNAorCXJ0cworCSBtb3YubAlAcjE1KyxyNQorCXJ0cworCSBtb3YubAlAcjE1KyxyNgorCXJ0cworCSBtb3YubAlAcjE1KyxyNworCitMX2NhbGxfaXQ6CisJIyBjYWxsIGZ1bmN0aW9uCisjaWYgKCEgU1RSVUNUX1ZBTFVFX0FERFJFU1NfV0lUSF9BUkcpCisJbW92CXIxMCwgcjIKKyNlbmRpZgorCW1vdi5sICBAKDI4LHIxNCkscjEKKwlqc3IgICAgQHIxCisJIG5vcAorCitMX3JldF9kOgorCW1vdgkjRkZJX1RZUEVfRE9VQkxFLHIyCisJY21wL2VxCXIyLHI5CisJYmYJTF9yZXRfbGwKKworCW1vdi5sCUAoMjQscjE0KSxyMgorCW1vdi5sCXIwLEByMgorCWJyYQlMX2VwaWxvZ3VlCisJIG1vdi5sCXIxLEAoNCxyMikKKworTF9yZXRfbGw6CisJbW92CSNGRklfVFlQRV9TSU5UNjQscjIKKwljbXAvZXEJcjIscjkKKwlidC9zCTFmCisJIG1vdgkjRkZJX1RZUEVfVUlOVDY0LHIyCisJY21wL2VxCXIyLHI5CisJYmYJTF9yZXRfaQorCisxOgorCW1vdi5sCUAoMjQscjE0KSxyMgorCW1vdi5sCXIwLEByMgorCWJyYQlMX2VwaWxvZ3VlCisJIG1vdi5sCXIxLEAoNCxyMikKKworTF9yZXRfaToKKwltb3YJI0ZGSV9UWVBFX0ZMT0FULHIyCisJY21wL2VxCXIyLHI5CisJYnQJMWYKKwltb3YJI0ZGSV9UWVBFX0lOVCxyMgorCWNtcC9lcQlyMixyOQorCWJmCUxfZXBpbG9ndWUKKzE6CisJbW92LmwJQCgyNCxyMTQpLHIxCisJYnJhCUxfZXBpbG9ndWUKKwkgbW92LmwJcjAsQHIxCisKK0xfZXBpbG9ndWU6CisJIyBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MKKwltb3YgICByMTQscjE1CisKKwlsZHMubCAgQHIxNSsscHIKKwltb3YubCAgQHIxNSsscjE0CisJbW92LmwgIEByMTUrLHIxMgorCW1vdi5sICBAcjE1KyxyMTAKKwltb3YubCAgQHIxNSsscjkKKwlydHMKKwkgbW92LmwgIEByMTUrLHI4CisjZW5kaWYKKy5MRkUxOgorLmZmaV9jYWxsX1NZU1ZfZW5kOgorICAgICAgICAuc2l6ZSAgICBDTkFNRShmZmlfY2FsbF9TWVNWKSwuZmZpX2NhbGxfU1lTVl9lbmQtQ05BTUUoZmZpX2NhbGxfU1lTVikKKworLmdsb2JsCWZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWCisKK0VOVFJZKGZmaV9jbG9zdXJlX1NZU1YpCisuTEZCMjoKKwltb3YubAlyNyxALXIxNQorLkxDRkk3OgorCW1vdi5sCXI2LEAtcjE1CisuTENGSTg6CisJbW92LmwJcjUsQC1yMTUKKy5MQ0ZJOToKKwltb3YubAlyNCxALXIxNQorLkxDRklBOgorCW1vdi5sCXIxNCxALXIxNQorLkxDRklCOgorCXN0cy5sCXByLEAtcjE1CisKKwkvKiBTdGFjayBsYXlvdXQ6CQorCSAgIHh4IGJ5dGVzIChvbiBzdGFjayBwYXJhbWV0ZXJzKQorCSAgIDE2IGJ5dGVzIChyZWdpc3RlciBwYXJhbWV0ZXJzKQorCSAgICA0IGJ5dGVzIChzYXZlZCBmcmFtZSBwb2ludGVyKQorCSAgICA0IGJ5dGVzIChzYXZlZCByZXR1cm4gYWRkcmVzcykKKwkgICAzMiBieXRlcyAoZmxvYXRpbmcgcmVnaXN0ZXIgcGFyYW1ldGVycywgU0gtNCBvbmx5KQorCSAgICA4IGJ5dGVzIChyZXN1bHQpCisJICAgIDQgYnl0ZXMgKHBhZCkKKwkgICAgNCBieXRlcyAoNXRoIGFyZykKKwkgICA8LSBuZXcgc3RhY2sgcG9pbnRlcgorCSovCisuTENGSUM6CisjaWYgZGVmaW5lZChfX1NINF9fKQorCWFkZAkjLTQ4LHIxNQorI2Vsc2UKKwlhZGQJIy0xNixyMTUKKyNlbmRpZgorLkxDRklEOgorCW1vdglyMTUscjE0CisuTENGSUU6CisKKyNpZiBkZWZpbmVkKF9fU0g0X18pCisJbW92CXIxNCxyMQorCWFkZAkjNDgscjEKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworCWZtb3YucwlmcjEwLEAtcjEKKwlmbW92LnMJZnIxMSxALXIxCisJZm1vdi5zCWZyOCxALXIxCisJZm1vdi5zCWZyOSxALXIxCisJZm1vdi5zCWZyNixALXIxCisJZm1vdi5zCWZyNyxALXIxCisJZm1vdi5zCWZyNCxALXIxCisJZm1vdi5zCWZyNSxALXIxCisjZWxzZQorCWZtb3YucwlmcjExLEAtcjEKKwlmbW92LnMJZnIxMCxALXIxCisJZm1vdi5zCWZyOSxALXIxCisJZm1vdi5zCWZyOCxALXIxCisJZm1vdi5zCWZyNyxALXIxCisJZm1vdi5zCWZyNixALXIxCisJZm1vdi5zCWZyNSxALXIxCisJZm1vdi5zCWZyNCxALXIxCisjZW5kaWYKKwltb3YJcjEscjcKKwltb3YJcjE0LHI2CisJYWRkCSM1NixyNgorI2Vsc2UKKwltb3YJcjE0LHI2CisJYWRkCSMyNCxyNgorI2VuZGlmCisKKwlidC9zCTEwZgorCSBtb3YJcjIsIHI1CisJbW92CXIxNCxyMQorCWFkZAkjOCxyMQorCW1vdglyMSxyNQorMTA6CisKKwltb3YJcjE0LHIxCisjaWYgZGVmaW5lZChfX1NINF9fKQorCWFkZAkjNzIscjEKKyNlbHNlCisJYWRkCSM0MCxyMQorI2VuZGlmCisJbW92LmwJcjEsQHIxNAorCisjaWZkZWYgUElDCisJbW92LmwJTF9nb3QscjEKKwltb3ZhCUxfZ290LHIwCisJYWRkCXIwLHIxCisJbW92LmwJTF9oZWxwZXIscjAKKwlhZGQJcjEscjAKKyNlbHNlCisJbW92LmwJTF9oZWxwZXIscjAKKyNlbmRpZgorCWpzcglAcjAKKwkgbW92CXIzLHI0CisKKwlzaGxsCXIwCisJbW92CXIwLHIxCisJbW92YQlMX3RhYmxlLHIwCisJYWRkCXIxLHIwCisJbW92LncJQHIwLHIwCisJbW92CXIxNCxyMgorCWJyYWYJcjAKKwkgYWRkCSM4LHIyCiswOgorCS5hbGlnbiAyCisjaWZkZWYgUElDCitMX2dvdDoKKwkubG9uZwlfR0xPQkFMX09GRlNFVF9UQUJMRV8KK0xfaGVscGVyOgorCS5sb25nCWZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWQEdPVE9GRgorI2Vsc2UKK0xfaGVscGVyOgorCS5sb25nCWZmaV9jbG9zdXJlX2hlbHBlcl9TWVNWCisjZW5kaWYKK0xfdGFibGU6CisJLnNob3J0IExfY2FzZV92IC0gMGIJLyogRkZJX1RZUEVfVk9JRCAqLworCS5zaG9ydCBMX2Nhc2VfaSAtIDBiCS8qIEZGSV9UWVBFX0lOVCAqLworI2lmIGRlZmluZWQoX19TSDRfXykKKwkuc2hvcnQgTF9jYXNlX2YgLSAwYgkvKiBGRklfVFlQRV9GTE9BVCAqLworCS5zaG9ydCBMX2Nhc2VfZCAtIDBiCS8qIEZGSV9UWVBFX0RPVUJMRSAqLworCS5zaG9ydCBMX2Nhc2VfZCAtIDBiCS8qIEZGSV9UWVBFX0xPTkdET1VCTEUgKi8KKyNlbHNlCisJLnNob3J0IExfY2FzZV9pIC0gMGIJLyogRkZJX1RZUEVfRkxPQVQgKi8KKwkuc2hvcnQgTF9jYXNlX2xsIC0gMGIJLyogRkZJX1RZUEVfRE9VQkxFICovCisJLnNob3J0IExfY2FzZV9sbCAtIDBiCS8qIEZGSV9UWVBFX0xPTkdET1VCTEUgKi8KKyNlbmRpZgorCS5zaG9ydCBMX2Nhc2VfdXEgLSAwYgkvKiBGRklfVFlQRV9VSU5UOCAqLworCS5zaG9ydCBMX2Nhc2VfcSAtIDBiCS8qIEZGSV9UWVBFX1NJTlQ4ICovCisJLnNob3J0IExfY2FzZV91aCAtIDBiCS8qIEZGSV9UWVBFX1VJTlQxNiAqLworCS5zaG9ydCBMX2Nhc2VfaCAtIDBiCS8qIEZGSV9UWVBFX1NJTlQxNiAqLworCS5zaG9ydCBMX2Nhc2VfaSAtIDBiCS8qIEZGSV9UWVBFX1VJTlQzMiAqLworCS5zaG9ydCBMX2Nhc2VfaSAtIDBiCS8qIEZGSV9UWVBFX1NJTlQzMiAqLworCS5zaG9ydCBMX2Nhc2VfbGwgLSAwYgkvKiBGRklfVFlQRV9VSU5UNjQgKi8KKwkuc2hvcnQgTF9jYXNlX2xsIC0gMGIJLyogRkZJX1RZUEVfU0lOVDY0ICovCisJLnNob3J0IExfY2FzZV92IC0gMGIJLyogRkZJX1RZUEVfU1RSVUNUICovCisJLnNob3J0IExfY2FzZV9pIC0gMGIJLyogRkZJX1RZUEVfUE9JTlRFUiAqLworCisjaWYgZGVmaW5lZChfX1NINF9fKQorTF9jYXNlX2Q6CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKwlmbW92LnMJQHIyKyxmcjEKKwlicmEJTF9jYXNlX3YKKwkgZm1vdi5zCUByMixmcjAKKyNlbHNlCisJZm1vdi5zCUByMissZnIwCisJYnJhCUxfY2FzZV92CisJIGZtb3YucwlAcjIsZnIxCisjZW5kaWYKKworTF9jYXNlX2Y6CisJYnJhCUxfY2FzZV92CisJIGZtb3YucwlAcjIsZnIwCisjZW5kaWYKKwkKK0xfY2FzZV9sbDoKKwltb3YubAlAcjIrLHIwCisJYnJhCUxfY2FzZV92CisJIG1vdi5sCUByMixyMQorCQorTF9jYXNlX2k6CisJYnJhCUxfY2FzZV92CisJIG1vdi5sCUByMixyMAorCQorTF9jYXNlX3E6CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyNlbHNlCisJYWRkCSMzLHIyCisjZW5kaWYKKwlicmEJTF9jYXNlX3YKKwkgbW92LmIJQHIyLHIwCisKK0xfY2FzZV91cToKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworI2Vsc2UKKwlhZGQJIzMscjIKKyNlbmRpZgorCW1vdi5iCUByMixyMAorCWJyYQlMX2Nhc2VfdgorCSBleHR1LmIgcjAscjAKKworTF9jYXNlX2g6CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyNlbHNlCisJYWRkCSMyLHIyCisjZW5kaWYKKwlicmEJTF9jYXNlX3YKKwkgbW92LncJQHIyLHIwCisKK0xfY2FzZV91aDoKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworI2Vsc2UKKwlhZGQJIzIscjIKKyNlbmRpZgorCW1vdi53CUByMixyMAorCWV4dHUudwlyMCxyMAorCS8qIGZhbGwgdGhyb3VnaCAqLworCitMX2Nhc2VfdjoKKyNpZiBkZWZpbmVkKF9fU0g0X18pCisJYWRkCSM0OCxyMTUKKyNlbHNlCisJYWRkCSMxNixyMTUKKyNlbmRpZgorCWxkcy5sCUByMTUrLHByCisJbW92LmwJQHIxNSsscjE0CisJcnRzCisJIGFkZAkjMTYscjE1CisuTEZFMjoKKy5mZmlfY2xvc3VyZV9TWVNWX2VuZDoKKyAgICAgICAgLnNpemUgICAgQ05BTUUoZmZpX2Nsb3N1cmVfU1lTViksLmZmaV9jbG9zdXJlX1NZU1ZfZW5kLUNOQU1FKGZmaV9jbG9zdXJlX1NZU1YpCisKKyNpZiBkZWZpbmVkIF9fRUxGX18gJiYgZGVmaW5lZCBfX2xpbnV4X18KKwkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjZW5kaWYKKworCS5zZWN0aW9uCSIuZWhfZnJhbWUiLCJhdyIsQHByb2diaXRzCitfX0ZSQU1FX0JFR0lOX186CisJLjRieXRlCS5MRUNJRTEtLkxTQ0lFMQkvKiBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5ICovCisuTFNDSUUxOgorCS40Ynl0ZQkweDAJLyogQ0lFIElkZW50aWZpZXIgVGFnICovCisJLmJ5dGUJMHgxCS8qIENJRSBWZXJzaW9uICovCisjaWZkZWYgUElDCisJLmFzY2lpICJ6UlwwIgkvKiBDSUUgQXVnbWVudGF0aW9uICovCisjZWxzZQorCS5ieXRlCTB4MAkvKiBDSUUgQXVnbWVudGF0aW9uICovCisjZW5kaWYKKwkuYnl0ZQkweDEJLyogdWxlYjEyOCAweDE7IENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IgKi8KKwkuYnl0ZQkweDdjCS8qIHNsZWIxMjggLTQ7IENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IgKi8KKwkuYnl0ZQkweDExCS8qIENJRSBSQSBDb2x1bW4gKi8KKyNpZmRlZiBQSUMKKwkudWxlYjEyOCAweDEJLyogQXVnbWVudGF0aW9uIHNpemUgKi8KKwkuYnl0ZQkweDEwCS8qIEZERSBFbmNvZGluZyAocGNyZWwpICovCisjZW5kaWYKKwkuYnl0ZQkweGMJLyogRFdfQ0ZBX2RlZl9jZmEgKi8KKwkuYnl0ZQkweGYJLyogdWxlYjEyOCAweGYgKi8KKwkuYnl0ZQkweDAJLyogdWxlYjEyOCAweDAgKi8KKwkuYWxpZ24JMgorLkxFQ0lFMToKKy5MU0ZERTE6CisJLjRieXRlCS5MRUZERTEtLkxBU0ZERTEJLyogRkRFIExlbmd0aCAqLworLkxBU0ZERTE6CisJLjRieXRlCS5MQVNGREUxLV9fRlJBTUVfQkVHSU5fXwkvKiBGREUgQ0lFIG9mZnNldCAqLworI2lmZGVmIFBJQworCS40Ynl0ZQkuTEZCMS0uCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisjZWxzZQorCS40Ynl0ZQkuTEZCMQkvKiBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLworI2VuZGlmCisJLjRieXRlCS5MRkUxLS5MRkIxCSAvKiBGREUgYWRkcmVzcyByYW5nZSAqLworI2lmZGVmIFBJQworCS51bGViMTI4IDB4MAkvKiBBdWdtZW50YXRpb24gc2l6ZSAqLworI2VuZGlmCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJLkxDRkkwLS5MRkIxCisJLmJ5dGUJMHhlCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS5ieXRlCTB4NAkvKiB1bGViMTI4IDB4NCAqLworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLjRieXRlCS5MQ0ZJMS0uTENGSTAKKwkuYnl0ZQkweGUJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUJMHg4CS8qIHVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJLkxDRkkyLS5MQ0ZJMQorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweGMJLyogdWxlYjEyOCAweDQgKi8KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS40Ynl0ZQkuTENGSTMtLkxDRkkyCisJLmJ5dGUJMHhlCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS5ieXRlCTB4MTAJLyogdWxlYjEyOCAweDQgKi8KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS40Ynl0ZQkuTENGSTQtLkxDRkkzCisJLmJ5dGUJMHhlCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS5ieXRlCTB4MTQJLyogdWxlYjEyOCAweDQgKi8KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS40Ynl0ZQkuTENGSTUtLkxDRkk0CisJLmJ5dGUJMHhlCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS5ieXRlCTB4MTgJLyogdWxlYjEyOCAweDQgKi8KKwkuYnl0ZQkweDkxCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDExICovCisJLmJ5dGUJMHg2CS8qIHVsZWIxMjggMHg2ICovCisJLmJ5dGUJMHg4ZQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhlICovCisJLmJ5dGUJMHg1CS8qIHVsZWIxMjggMHg1ICovCisJLmJ5dGUJMHg4YwkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhjICovCisJLmJ5dGUJMHg0CS8qIHVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg4YQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhhICovCisJLmJ5dGUJMHgzCS8qIHVsZWIxMjggMHgzICovCisJLmJ5dGUJMHg4OQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg5ICovCisJLmJ5dGUJMHgyCS8qIHVsZWIxMjggMHgyICovCisJLmJ5dGUJMHg4OAkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4ICovCisJLmJ5dGUJMHgxCS8qIHVsZWIxMjggMHgxICovCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJLkxDRkk2LS5MQ0ZJNQorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciAqLworCS5ieXRlCTB4ZQkvKiB1bGViMTI4IDB4ZSAqLworCS5hbGlnbgkyCisuTEVGREUxOgorCisuTFNGREUzOgorCS40Ynl0ZQkuTEVGREUzLS5MQVNGREUzCS8qIEZERSBMZW5ndGggKi8KKy5MQVNGREUzOgorCS40Ynl0ZQkuTEFTRkRFMy1fX0ZSQU1FX0JFR0lOX18JLyogRkRFIENJRSBvZmZzZXQgKi8KKyNpZmRlZiBQSUMKKwkuNGJ5dGUJLkxGQjItLgkvKiBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLworI2Vsc2UKKwkuNGJ5dGUJLkxGQjIJLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbmRpZgorCS40Ynl0ZQkuTEZFMi0uTEZCMgkgLyogRkRFIGFkZHJlc3MgcmFuZ2UgKi8KKyNpZmRlZiBQSUMKKwkudWxlYjEyOCAweDAJLyogQXVnbWVudGF0aW9uIHNpemUgKi8KKyNlbmRpZgorCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLjRieXRlCS5MQ0ZJNy0uTEZCMgorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDQJLyogdWxlYjEyOCAweDQgKi8KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS40Ynl0ZQkuTENGSTgtLkxDRkk3CisJLmJ5dGUJMHhlCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS5ieXRlCTB4OAkvKiB1bGViMTI4IDB4NCAqLworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLjRieXRlCS5MQ0ZJOS0uTENGSTgKKwkuYnl0ZQkweGUJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUJMHhjCS8qIHVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJLkxDRklBLS5MQ0ZJOQorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDEwCS8qIHVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJLkxDRklCLS5MQ0ZJQQorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDE0CS8qIHVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJLkxDRklDLS5MQ0ZJQgorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDE4CS8qIHVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJLkxDRklELS5MQ0ZJQworCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKyNpZiBkZWZpbmVkKF9fU0g0X18pCisJLmJ5dGUJMjQrNDgJLyogdWxlYjEyOCAyNCs0OCAqLworI2Vsc2UKKwkuYnl0ZQkyNCsxNgkvKiB1bGViMTI4IDI0KzE2ICovCisjZW5kaWYKKwkuYnl0ZQkweDkxCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDExICovCisJLmJ5dGUJMHg2CS8qIHVsZWIxMjggMHg2ICovCisJLmJ5dGUJMHg4ZQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhlICovCisJLmJ5dGUJMHg1CS8qIHVsZWIxMjggMHg1ICovCisJLmJ5dGUJMHg4NAkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg0ICovCisJLmJ5dGUJMHg0CS8qIHVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg4NQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1ICovCisJLmJ5dGUJMHgzCS8qIHVsZWIxMjggMHgzICovCisJLmJ5dGUJMHg4NgkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg2ICovCisJLmJ5dGUJMHgyCS8qIHVsZWIxMjggMHgyICovCisJLmJ5dGUJMHg4NwkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg3ICovCisJLmJ5dGUJMHgxCS8qIHVsZWIxMjggMHgxICovCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJLkxDRklFLS5MQ0ZJRAorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciAqLworCS5ieXRlCTB4ZQkvKiB1bGViMTI4IDB4ZSAqLworCS5hbGlnbgkyCisuTEVGREUzOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zaDY0L2ZmaS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zaDY0L2ZmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYmMwNWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoNjQvZmZpLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNyBLYXogS29qaW1hCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOCBBbnRob255IEdyZWVuCisgICAKKyAgIFN1cGVySCBTSG1lZGlhIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgTkdSRUdBUkcgOAorI2RlZmluZSBORlJFR0FSRyAxMgorCitzdGF0aWMgaW50CityZXR1cm5fdHlwZSAoZmZpX3R5cGUgKmFyZykKK3sKKworICBpZiAoYXJnLT50eXBlICE9IEZGSV9UWVBFX1NUUlVDVCkKKyAgICByZXR1cm4gYXJnLT50eXBlOworCisgIC8qIGdjYyB1c2VzIHIyIGlmIHRoZSByZXN1bHQgY2FuIGJlIHBhY2tlZCBpbiBvbiByZWdpc3Rlci4gICovCisgIGlmIChhcmctPnNpemUgPD0gc2l6ZW9mIChVSU5UOCkpCisgICAgcmV0dXJuIEZGSV9UWVBFX1VJTlQ4OworICBlbHNlIGlmIChhcmctPnNpemUgPD0gc2l6ZW9mIChVSU5UMTYpKQorICAgIHJldHVybiBGRklfVFlQRV9VSU5UMTY7CisgIGVsc2UgaWYgKGFyZy0+c2l6ZSA8PSBzaXplb2YgKFVJTlQzMikpCisgICAgcmV0dXJuIEZGSV9UWVBFX1VJTlQzMjsKKyAgZWxzZSBpZiAoYXJnLT5zaXplIDw9IHNpemVvZiAoVUlOVDY0KSkKKyAgICByZXR1cm4gRkZJX1RZUEVfVUlOVDY0OworCisgIHJldHVybiBGRklfVFlQRV9TVFJVQ1Q7Cit9CisKKy8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKKyAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzICovCisKK3ZvaWQgZmZpX3ByZXBfYXJncyhjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKQoreworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGF2bjsKKyAgcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKKyAgcmVnaXN0ZXIgY2hhciAqYXJncDsKKyAgcmVnaXN0ZXIgZmZpX3R5cGUgKipwX2FyZzsKKworICBhcmdwID0gc3RhY2s7CisKKyAgaWYgKHJldHVybl90eXBlIChlY2lmLT5jaWYtPnJ0eXBlKSA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgeworICAgICAgKih2b2lkICoqKSBhcmdwID0gZWNpZi0+cnZhbHVlOworICAgICAgYXJncCArPSBzaXplb2YgKFVJTlQ2NCk7CisgICAgfQorCisgIGF2biA9IGVjaWYtPmNpZi0+bmFyZ3M7CisgIHBfYXJndiA9IGVjaWYtPmF2YWx1ZTsKKworICBmb3IgKGkgPSAwLCBwX2FyZyA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOyBpIDwgYXZuOyBpKyssIHBfYXJnKyssIHBfYXJndisrKQorICAgIHsKKyAgICAgIHNpemVfdCB6OworICAgICAgaW50IGFsaWduOworCisgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisgICAgICBhbGlnbiA9ICgqcF9hcmcpLT5hbGlnbm1lbnQ7CisgICAgICBpZiAoeiA8IHNpemVvZiAoVUlOVDMyKSkKKwl7CisJICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKQorCSAgICB7CisJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisJICAgICAgKihTSU5UNjQgKikgYXJncCA9IChTSU5UNjQpICooU0lOVDggKikoKnBfYXJndik7CisJICAgICAgYnJlYWs7CisgIAorCSAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorCSAgICAgICooVUlOVDY0ICopIGFyZ3AgPSAoVUlOVDY0KSAqKFVJTlQ4ICopKCpwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAgICAgKihTSU5UNjQgKikgYXJncCA9IChTSU5UNjQpICooU0lOVDE2ICopKCpwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAgICAgKihVSU5UNjQgKikgYXJncCA9IChVSU5UNjQpICooVUlOVDE2ICopKCpwX2FyZ3YpOworCSAgICAgIGJyZWFrOworICAKKwkgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICAgICAgbWVtY3B5IChhcmdwLCAqcF9hcmd2LCB6KTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIEZGSV9BU1NFUlQoMCk7CisJICAgIH0KKwkgIGFyZ3AgKz0gc2l6ZW9mIChVSU5UNjQpOworCX0KKyAgICAgIGVsc2UgaWYgKHogPT0gc2l6ZW9mIChVSU5UMzIpICYmIGFsaWduID09IHNpemVvZiAoVUlOVDMyKSkKKwl7CisJICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKQorCSAgICB7CisJICAgIGNhc2UgRkZJX1RZUEVfSU5UOgorCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKwkgICAgICAqKFNJTlQ2NCAqKSBhcmdwID0gKFNJTlQ2NCkgKihTSU5UMzIgKikgKCpwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisJICAgIGNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgICAgICooVUlOVDY0ICopIGFyZ3AgPSAoVUlOVDY0KSAqKFVJTlQzMiAqKSAoKnBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBGRklfQVNTRVJUKDApOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBhcmdwICs9IHNpemVvZiAoVUlOVDY0KTsKKwl9CisgICAgICBlbHNlIGlmICh6ID09IHNpemVvZiAoVUlOVDY0KQorCSAgICAgICAmJiBhbGlnbiA9PSBzaXplb2YgKFVJTlQ2NCkKKwkgICAgICAgJiYgKChpbnQpICpwX2FyZ3YgJiAoc2l6ZW9mIChVSU5UNjQpIC0gMSkpID09IDApCisJeworCSAgKihVSU5UNjQgKikgYXJncCA9ICooVUlOVDY0ICopICgqcF9hcmd2KTsKKwkgIGFyZ3AgKz0gc2l6ZW9mIChVSU5UNjQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgbiA9ICh6ICsgc2l6ZW9mIChVSU5UNjQpIC0gMSkgLyBzaXplb2YgKFVJTlQ2NCk7CisKKwkgIG1lbWNweSAoYXJncCwgKnBfYXJndiwgeik7CisJICBhcmdwICs9IG4gKiBzaXplb2YgKFVJTlQ2NCk7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CisKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KK2ZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworICBpbnQgaSwgajsKKyAgaW50IHNpemUsIHR5cGU7CisgIGludCBuLCBtOworICBpbnQgZ3JlZzsKKyAgaW50IGZyZWc7CisgIGludCBmcGFpciA9IC0xOworCisgIGdyZWcgPSAocmV0dXJuX3R5cGUgKGNpZi0+cnR5cGUpID09IEZGSV9UWVBFX1NUUlVDVCA/IDEgOiAwKTsKKyAgZnJlZyA9IDA7CisgIGNpZi0+ZmxhZ3MyID0gMDsKKworICBmb3IgKGkgPSBqID0gMDsgaSA8IGNpZi0+bmFyZ3M7IGkrKykKKyAgICB7CisgICAgICB0eXBlID0gKGNpZi0+YXJnX3R5cGVzKVtpXS0+dHlwZTsKKyAgICAgIHN3aXRjaCAodHlwZSkKKwl7CisJY2FzZSBGRklfVFlQRV9GTE9BVDoKKwkgIGdyZWcrKzsKKwkgIGNpZi0+Ynl0ZXMgKz0gc2l6ZW9mIChVSU5UNjQpIC0gc2l6ZW9mIChmbG9hdCk7CisJICBpZiAoZnJlZyA+PSBORlJFR0FSRyAtIDEpCisJICAgIGNvbnRpbnVlOworCSAgaWYgKGZwYWlyIDwgMCkKKwkgICAgeworCSAgICAgIGZwYWlyID0gZnJlZzsKKwkgICAgICBmcmVnICs9IDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZnBhaXIgPSAtMTsKKwkgIGNpZi0+ZmxhZ3MyICs9ICgoY2lmLT5hcmdfdHlwZXMpW2ldLT50eXBlKSA8PCAoMiAqIGorKyk7CisJICBicmVhazsKKworCWNhc2UgRkZJX1RZUEVfRE9VQkxFOgorCSAgaWYgKGdyZWcrKyA+PSBOR1JFR0FSRyAmJiAoZnJlZyArIDEpID49IE5GUkVHQVJHKQorCSAgICBjb250aW51ZTsKKwkgIGlmICgoZnJlZyArIDEpIDwgTkZSRUdBUkcpCisJICAgIHsKKwkgICAgICBmcmVnICs9IDI7CisJICAgICAgY2lmLT5mbGFnczIgKz0gKChjaWYtPmFyZ190eXBlcylbaV0tPnR5cGUpIDw8ICgyICogaisrKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBjaWYtPmZsYWdzMiArPSBGRklfVFlQRV9JTlQgPDwgKDIgKiBqKyspOworCSAgYnJlYWs7CisJICAgICAgCisJZGVmYXVsdDoKKwkgIHNpemUgPSAoY2lmLT5hcmdfdHlwZXMpW2ldLT5zaXplOworCSAgaWYgKHNpemUgPCBzaXplb2YgKFVJTlQ2NCkpCisJICAgIGNpZi0+Ynl0ZXMgKz0gc2l6ZW9mIChVSU5UNjQpIC0gc2l6ZTsKKwkgIG4gPSAoc2l6ZSArIHNpemVvZiAoVUlOVDY0KSAtIDEpIC8gc2l6ZW9mIChVSU5UNjQpOworCSAgaWYgKGdyZWcgPj0gTkdSRUdBUkcpCisJICAgIGNvbnRpbnVlOworCSAgZWxzZSBpZiAoZ3JlZyArIG4gLSAxID49IE5HUkVHQVJHKQorCSAgICBncmVnID0gTkdSRUdBUkc7CisJICBlbHNlCisJICAgIGdyZWcgKz0gbjsKKwkgIGZvciAobSA9IDA7IG0gPCBuOyBtKyspCisJICAgIGNpZi0+ZmxhZ3MyICs9IEZGSV9UWVBFX0lOVCA8PCAoMiAqIGorKyk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZyAqLworICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgY2lmLT5mbGFncyA9IHJldHVybl90eXBlIChjaWYtPnJ0eXBlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9WT0lEOgorICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICBjaWYtPmZsYWdzID0gY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworLypALWRlY2x1bmRlZkAqLworLypALWV4cG9ydGhlYWRlckAqLworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfU1lTVih2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwgCisJCQkgIC8qQG91dEAqLyBleHRlbmRlZF9jaWYgKiwgCisJCQkgIHVuc2lnbmVkLCB1bnNpZ25lZCwgbG9uZyBsb25nLAorCQkJICAvKkBvdXRAKi8gdW5zaWduZWQgKiwgCisJCQkgIHZvaWQgKCpmbikodm9pZCkpOworLypAPWRlY2x1bmRlZkAqLworLypAPWV4cG9ydGhlYWRlckAqLworCit2b2lkIGZmaV9jYWxsKC8qQGRlcGVuZGVudEAqLyBmZmlfY2lmICpjaWYsIAorCSAgICAgIHZvaWQgKCpmbikodm9pZCksIAorCSAgICAgIC8qQG91dEAqLyB2b2lkICpydmFsdWUsIAorCSAgICAgIC8qQGRlcGVuZGVudEAqLyB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKyAgVUlOVDY0IHRydmFsdWU7CisKKyAgZWNpZi5jaWYgPSBjaWY7CisgIGVjaWYuYXZhbHVlID0gYXZhbHVlOworICAKKyAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybgkqLworICAvKiB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZQkJICAgICAgICAqLworCisgIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAorICAgICAgJiYgcmV0dXJuX3R5cGUgKGNpZi0+cnR5cGUpICE9IEZGSV9UWVBFX1NUUlVDVCkKKyAgICBlY2lmLnJ2YWx1ZSA9ICZ0cnZhbHVlOworICBlbHNlIGlmICgocnZhbHVlID09IE5VTEwpICYmIAorICAgICAgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSkKKyAgICB7CisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKKworICBzd2l0Y2ggKGNpZi0+YWJpKSAKKyAgICB7CisgICAgY2FzZSBGRklfU1lTVjoKKyAgICAgIGZmaV9jYWxsX1NZU1YoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsIGNpZi0+ZmxhZ3MyLAorCQkgICAgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChydmFsdWUKKyAgICAgICYmIGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAmJiByZXR1cm5fdHlwZSAoY2lmLT5ydHlwZSkgIT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIG1lbWNweSAocnZhbHVlLCAmdHJ2YWx1ZSwgY2lmLT5ydHlwZS0+c2l6ZSk7Cit9CisKK2V4dGVybiB2b2lkIGZmaV9jbG9zdXJlX1NZU1YgKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pY19pbnZhbGlkYXRlICh2b2lkICpsaW5lKTsKKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2xvc3VyZV9sb2MgKGZmaV9jbG9zdXJlICpjbG9zdXJlLAorCQkgICAgICBmZmlfY2lmICpjaWYsCisJCSAgICAgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLCB2b2lkKiwgdm9pZCoqLCB2b2lkKiksCisJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJICAgICAgdm9pZCAqY29kZWxvYykKK3sKKyAgdW5zaWduZWQgaW50ICp0cmFtcDsKKworICBGRklfQVNTRVJUIChjaWYtPmFiaSA9PSBGRklfR0NDX1NZU1YpOworCisgIHRyYW1wID0gKHVuc2lnbmVkIGludCAqKSAmY2xvc3VyZS0+dHJhbXBbMF07CisgIC8qIFNpbmNlIGZmaV9jbG9zdXJlIGlzIGFuIGFsaWduZWQgb2JqZWN0LCB0aGUgZmZpIHRyYW1wb2xpbmUgaXMKKyAgICAgY2FsbGVkIGFzIGFuIFNIY29tcGFjdCBjb2RlLiAgU2lnaC4KKyAgICAgU0hjb21wYWN0IHBhcnQ6CisgICAgIG1vdmEgQCgxLHBjKSxyMDsgYWRkICMxLHIwOyBqbXAgQHIwOyBub3A7CisgICAgIFNIbWVkaWEgcGFydDoKKyAgICAgbW92aSBmbmFkZHIgPj4gMTYscjE7IHNob3JpIGZuYWRkcixyMTsgcHRhYnMvbCByMSx0cjAKKyAgICAgbW92aSBjeHQgPj4gMTYscjE7IHNob3JpIGN4dCxyMTsgYmxpbmsgdHIwLHI2MyAgKi8KKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICB0cmFtcFswXSA9IDB4NzAwMWM3MDE7CisgIHRyYW1wWzFdID0gMHgwMDA5NDAyYjsKKyNlbHNlCisgIHRyYW1wWzBdID0gMHhjNzAxNzAwMTsKKyAgdHJhbXBbMV0gPSAweDQwMmIwMDA5OworI2VuZGlmCisgIHRyYW1wWzJdID0gMHhjYzAwMDAxMCB8ICgoKFVJTlQzMikgZmZpX2Nsb3N1cmVfU1lTVikgPj4gMTYpIDw8IDEwOworICB0cmFtcFszXSA9IDB4YzgwMDAwMTAgfCAoKChVSU5UMzIpIGZmaV9jbG9zdXJlX1NZU1YpICYgMHhmZmZmKSA8PCAxMDsKKyAgdHJhbXBbNF0gPSAweDZiZjEwNjAwOworICB0cmFtcFs1XSA9IDB4Y2MwMDAwMTAgfCAoKChVSU5UMzIpIGNvZGVsb2MpID4+IDE2KSA8PCAxMDsKKyAgdHJhbXBbNl0gPSAweGM4MDAwMDEwIHwgKCgoVUlOVDMyKSBjb2RlbG9jKSAmIDB4ZmZmZikgPDwgMTA7CisgIHRyYW1wWzddID0gMHg0NDAxZmZmMDsKKworICBjbG9zdXJlLT5jaWYgPSBjaWY7CisgIGNsb3N1cmUtPmZ1biA9IGZ1bjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworCisgIC8qIEZsdXNoIHRoZSBpY2FjaGUuICAqLworICBhc20gdm9sYXRpbGUgKCJvY2J3YiAlMCwwOyBzeW5jbzsgaWNiaSAlMSwwOyBzeW5jaSIgOiA6ICJyIiAodHJhbXApLAorCQkiciIoY29kZWxvYykpOworCisgIHJldHVybiBGRklfT0s7Cit9CisKKy8qIEJhc2ljYWxseSB0aGUgdHJhbXBvbGluZSBpbnZva2VzIGZmaV9jbG9zdXJlX1NZU1YsIGFuZCBvbiAKKyAqIGVudHJ5LCByMyBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2xvc3VyZS4KKyAqIEFmdGVyIHN0b3JpbmcgdGhlIHJlZ2lzdGVycyB0aGF0IGNvdWxkIHBvc3NpYmx5IGNvbnRhaW4KKyAqIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIGludG8gdGhlIHN0YWNrIGZyYW1lIGFuZCBzZXR0aW5nCisgKiB1cCBzcGFjZSBmb3IgYSByZXR1cm4gdmFsdWUsIGZmaV9jbG9zdXJlX1NZU1YgaW52b2tlcyB0aGUgCisgKiBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9uIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmsuCisgKi8KKworaW50CitmZmlfY2xvc3VyZV9oZWxwZXJfU1lTViAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsIFVJTlQ2NCAqcnZhbHVlLCAKKwkJCSBVSU5UNjQgKnBnciwgVUlOVDY0ICpwZnIsIFVJTlQ2NCAqcHN0KQoreworICB2b2lkICoqYXZhbHVlOworICBmZmlfdHlwZSAqKnBfYXJnOworICBpbnQgaSwgYXZuOworICBpbnQgZ3JlZywgZnJlZzsKKyAgZmZpX2NpZiAqY2lmOworICBpbnQgZnBhaXIgPSAtMTsKKworICBjaWYgPSBjbG9zdXJlLT5jaWY7CisgIGF2YWx1ZSA9IGFsbG9jYSAoY2lmLT5uYXJncyAqIHNpemVvZiAodm9pZCAqKSk7CisKKyAgLyogQ29weSB0aGUgY2FsbGVyJ3Mgc3RydWN0dXJlIHJldHVybiB2YWx1ZSBhZGRyZXNzIHNvIHRoYXQgdGhlIGNsb3N1cmUKKyAgICAgcmV0dXJucyB0aGUgZGF0YSBkaXJlY3RseSB0byB0aGUgY2FsbGVyLiAgKi8KKyAgaWYgKHJldHVybl90eXBlIChjaWYtPnJ0eXBlKSA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgeworICAgICAgcnZhbHVlID0gKFVJTlQ2NCAqKSAqcGdyOworICAgICAgZ3JlZyA9IDE7CisgICAgfQorICBlbHNlCisgICAgZ3JlZyA9IDA7CisKKyAgZnJlZyA9IDA7CisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgYXZuID0gY2lmLT5uYXJnczsKKworICAvKiBHcmFiIHRoZSBhZGRyZXNzZXMgb2YgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBzdGFjayBmcmFtZS4gICovCisgIGZvciAoaSA9IDAsIHBfYXJnID0gY2lmLT5hcmdfdHlwZXM7IGkgPCBhdm47IGkrKywgcF9hcmcrKykKKyAgICB7CisgICAgICBzaXplX3QgejsKKyAgICAgIHZvaWQgKnA7CisKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKyAgICAgIGlmICh6IDwgc2l6ZW9mIChVSU5UMzIpKQorCXsKKwkgIHAgPSBwZ3IgKyBncmVnKys7CisKKwkgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworCSAgICAgIGF2YWx1ZVtpXSA9IHA7CisjZWxzZQorCSAgICAgIGF2YWx1ZVtpXSA9ICgoY2hhciAqKSBwKSArIHNpemVvZiAoVUlOVDMyKSAtIHo7CisjZW5kaWYKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIEZGSV9BU1NFUlQoMCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICh6ID09IHNpemVvZiAoVUlOVDMyKSkKKwl7CisJICBpZiAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisJICAgIHsKKwkgICAgICBpZiAoZnJlZyA8IE5GUkVHQVJHIC0gMSkKKwkJeworCQkgIGlmIChmcGFpciA+PSAwKQorCQkgICAgeworCQkgICAgICBhdmFsdWVbaV0gPSAoVUlOVDMyICopIHBmciArIGZwYWlyOworCQkgICAgICBmcGFpciA9IC0xOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworCQkgICAgICBmcGFpciA9IGZyZWc7CisJCSAgICAgIGF2YWx1ZVtpXSA9IChVSU5UMzIgKikgcGZyICsgKDEgXiBmcmVnKTsKKyNlbHNlCisJCSAgICAgIGZwYWlyID0gMSBeIGZyZWc7CisJCSAgICAgIGF2YWx1ZVtpXSA9IChVSU5UMzIgKikgcGZyICsgZnJlZzsKKyNlbmRpZgorCQkgICAgICBmcmVnICs9IDI7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKwkJYXZhbHVlW2ldID0gcGdyICsgZ3JlZzsKKyNlbHNlCisJCWF2YWx1ZVtpXSA9IChVSU5UMzIgKikgKHBnciArIGdyZWcpICsgMTsKKyNlbmRpZgorCSAgICB9CisJICBlbHNlCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKwkgICAgYXZhbHVlW2ldID0gcGdyICsgZ3JlZzsKKyNlbHNlCisJICAgIGF2YWx1ZVtpXSA9IChVSU5UMzIgKikgKHBnciArIGdyZWcpICsgMTsKKyNlbmRpZgorCSAgZ3JlZysrOworCX0KKyAgICAgIGVsc2UgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKwl7CisJICBpZiAoZnJlZyArIDEgPj0gTkZSRUdBUkcpCisJICAgIGF2YWx1ZVtpXSA9IHBnciArIGdyZWc7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhdmFsdWVbaV0gPSBwZnIgKyAoZnJlZyA+PiAxKTsKKwkgICAgICBmcmVnICs9IDI7CisJICAgIH0KKwkgIGdyZWcrKzsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IG4gPSAoeiArIHNpemVvZiAoVUlOVDY0KSAtIDEpIC8gc2l6ZW9mIChVSU5UNjQpOworCisJICBhdmFsdWVbaV0gPSBwZ3IgKyBncmVnOworCSAgZ3JlZyArPSBuOworCX0KKyAgICB9CisKKyAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgcnZhbHVlLCBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgLyogVGVsbCBmZmlfY2xvc3VyZV9TWVNWIGhvdyB0byBwZXJmb3JtIHJldHVybiB0eXBlIHByb21vdGlvbnMuICAqLworICByZXR1cm4gcmV0dXJuX3R5cGUgKGNpZi0+cnR5cGUpOworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoNjQvZmZpdGFyZ2V0LmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoNjQvZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzNWI4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc2g2NC9mZml0YXJnZXQuaApAQCAtMCwwICsxLDUzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQorICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBTdXBlckggLSBTSG1lZGlhLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX1RBUkdFVF9ICisjZGVmaW5lIExJQkZGSV9UQVJHRVRfSAorCisvKiAtLS0tIEdlbmVyaWMgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExJQkZGSV9BU00KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBmZmlfYXJnOwordHlwZWRlZiBzaWduZWQgbG9uZyAgICAgICAgICAgIGZmaV9zYXJnOworCit0eXBlZGVmIGVudW0gZmZpX2FiaSB7CisgIEZGSV9GSVJTVF9BQkkgPSAwLAorICBGRklfU1lTViwKKyAgRkZJX0xBU1RfQUJJLAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgorfSBmZmlfYWJpOworCisjZGVmaW5lIEZGSV9FWFRSQV9DSUZfRklFTERTIGxvbmcgbG9uZyBmbGFnczIKKyNlbmRpZgorCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMzIKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc2g2NC9zeXN2LlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoNjQvc3lzdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NTg3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NoNjQvc3lzdi5TCkBAIC0wLDAgKzEsNTM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA2LCAyMDA4IEtheiBLb2ppbWEKKyAgIAorICAgU3VwZXJIIFNIbWVkaWEgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworIAorICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElCRkZJX0FTTQkKKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKyNpZmRlZiBIQVZFX01BQ0hJTkVfQVNNX0gKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorI2Vsc2UKKy8qIFhYWCB0aGVzZSBsb3NlIGZvciBzb21lIHBsYXRmb3JtcywgSSdtIHN1cmUuICovCisjZGVmaW5lIENOQU1FKHgpIHgKKyNkZWZpbmUgRU5UUlkoeCkgLmdsb2JsIENOQU1FKHgpOyAudHlwZSBDTkFNRSh4KSwlZnVuY3Rpb247IENOQU1FKHgpOgorI2VuZGlmCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworI2RlZmluZSBPRlNfRkxUCTAKKyNlbHNlCisjZGVmaW5lIE9GU19GTFQJNAorI2VuZGlmCisKKwkuc2VjdGlvbgkudGV4dC4uU0htZWRpYTMyLCJheCIKKworCSMgcjI6CWZmaV9wcmVwX2FyZ3MKKwkjIHIzOgkmZWNpZgorCSMgcjQ6CWJ5dGVzCisJIyByNToJZmxhZ3MKKwkjIHI2OglmbGFnczIKKwkjIHI3OglydmFsdWUKKwkjIHI4OglmbgorCisJIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KKwkuYWxpZ24JNQorRU5UUlkoZmZpX2NhbGxfU1lTVikKKwkjIFNhdmUgcmVnaXN0ZXJzCisuTEZCMToKKwlhZGRpLmwJcjE1LCAtNDgsIHIxNQorLkxDRkkwOgorCXN0LnEJcjE1LCA0MCwgcjMyCisJc3QucQlyMTUsIDMyLCByMzEKKwlzdC5xCXIxNSwgMjQsIHIzMAorCXN0LnEJcjE1LCAxNiwgcjI5CisJc3QucQlyMTUsIDgsIHIyOAorCXN0LmwJcjE1LCA0LCByMTgKKwlzdC5sCXIxNSwgMCwgcjE0CisuTENGSTE6CisJYWRkLmwJcjE1LCByNjMsIHIxNAorLkxDRkkyOgorIwlhZGQJcjQsIHI2MywgcjI4CisJYWRkCXI1LCByNjMsIHIyOQorCWFkZAlyNiwgcjYzLCByMzAKKwlhZGQJcjcsIHI2MywgcjMxCisJYWRkCXI4LCByNjMsIHIzMgorCisJYWRkaQlyNCwgKDY0ICsgNyksIHI0CisJYW5kaQlyNCwgfjcsIHI0CisJc3ViLmwJcjE1LCByNCwgcjE1CisKKwlwdGFicy9sCXIyLCB0cjAKKwlhZGQJcjE1LCByNjMsIHIyCisJYmxpbmsJdHIwLCByMTgKKworCWFkZGkJcjE1LCA2NCwgcjIyCisJbW92aQkwLCByMAorCW1vdmkJMCwgcjEKKwltb3ZpCS0xLCByMjMKKworCXB0L2wJMWYsIHRyMQorCWJuZWkvbAlyMjksIEZGSV9UWVBFX1NUUlVDVCwgdHIxCisJbGQubAlyMTUsIDAsIHIxOQorCWFkZGkJcjE1LCA4LCByMTUKKwlhZGRpCXIwLCAxLCByMAorMToKKworLkxfcGFzczoKKwlhbmRpCXIzMCwgMywgcjIwCisJc2hscmkJcjMwLCAyLCByMzAKKworCXB0L2wJLkxfY2FsbF9pdCwgdHIwCisJcHQvbAkuTF9wYXNzX2ksIHRyMQorCXB0L2wJLkxfcGFzc19mLCB0cjIKKworCWJlcWkvbAlyMjAsIEZGSV9UWVBFX1ZPSUQsIHRyMAorCWJlcWkvbAlyMjAsIEZGSV9UWVBFX0lOVCwgdHIxCisJYmVxaS9sCXIyMCwgRkZJX1RZUEVfRkxPQVQsIHRyMgorCisuTF9wYXNzX2Q6CisJYWRkaQlyMCwgMSwgcjAKKwlwdC9sCTNmLCB0cjAKKwltb3ZpCTEyLCByMjAKKwliZ2UvbAlyMSwgcjIwLCB0cjAKKworCXB0L2wJLkxfcG9wX2QsIHRyMQorCXB0L2wJMmYsIHRyMAorCWJsaW5rCXRyMSwgcjYzCisyOgorCWFkZGkubAlyMTUsIDgsIHIxNQorMzoKKwlwdC9sCS5MX3Bhc3MsIHRyMAorCWFkZGkJcjEsIDIsIHIxCisJYmxpbmsJdHIwLCByNjMKKworLkxfcG9wX2Q6CisJcHQvbAkuTF9wb3BfZF90YmwsIHRyMQorCWdldHRyCXRyMSwgcjIwCisJc2hsbGkJcjEsIDIsIHIyMQorCWFkZAlyMjAsIHIyMSwgcjIwCisJcHRhYnMvbAlyMjAsIHRyMQorCWJsaW5rCXRyMSwgcjYzCisKKy5MX3BvcF9kX3RibDoKKwlmbGQuZAlyMTUsIDAsIGRyMAorCWJsaW5rCXRyMCwgcjYzCisJZmxkLmQJcjE1LCAwLCBkcjIKKwlibGluawl0cjAsIHI2MworCWZsZC5kCXIxNSwgMCwgZHI0CisJYmxpbmsJdHIwLCByNjMKKwlmbGQuZAlyMTUsIDAsIGRyNgorCWJsaW5rCXRyMCwgcjYzCisJZmxkLmQJcjE1LCAwLCBkcjgKKwlibGluawl0cjAsIHI2MworCWZsZC5kCXIxNSwgMCwgZHIxMAorCWJsaW5rCXRyMCwgcjYzCisKKy5MX3Bhc3NfZjoKKwlhZGRpCXIwLCAxLCByMAorCXB0L2wJM2YsIHRyMAorCW1vdmkJMTIsIHIyMAorCWJnZS9sCXIxLCByMjAsIHRyMAorCisJcHQvbAkuTF9wb3BfZiwgdHIxCisJcHQvbAkyZiwgdHIwCisJYmxpbmsJdHIxLCByNjMKKzI6CisJYWRkaS5sCXIxNSwgOCwgcjE1CiszOgorCXB0L2wJLkxfcGFzcywgdHIwCisJYmxpbmsJdHIwLCByNjMKKworLkxfcG9wX2Y6CisJcHQvbAkuTF9wb3BfZl90YmwsIHRyMQorCXB0L2wJNWYsIHRyMgorCWdldHRyCXRyMSwgcjIwCisJYmdlL2wJcjIzLCByNjMsIHRyMgorCWFkZAlyMSwgcjYzLCByMjMgCisJc2hsbGkJcjEsIDMsIHIyMQorCWFkZGkJcjEsIDIsIHIxCisJYWRkCXIyMCwgcjIxLCByMjAKKwlwdGFicy9sCXIyMCwgdHIxCisJYmxpbmsJdHIxLCByNjMKKzU6CisJYWRkaQlyMjMsIDEsIHIyMQorCW1vdmkJLTEsIHIyMworCXNobGxpCXIyMSwgMywgcjIxCisJYWRkCXIyMCwgcjIxLCByMjAKKwlwdGFicy9sCXIyMCwgdHIxCisJYmxpbmsJdHIxLCByNjMKKworLkxfcG9wX2ZfdGJsOgorCWZsZC5zCXIxNSwgT0ZTX0ZMVCwgZnIwCisJYmxpbmsJdHIwLCByNjMKKwlmbGQucwlyMTUsIE9GU19GTFQsIGZyMQorCWJsaW5rCXRyMCwgcjYzCisJZmxkLnMJcjE1LCBPRlNfRkxULCBmcjIKKwlibGluawl0cjAsIHI2MworCWZsZC5zCXIxNSwgT0ZTX0ZMVCwgZnIzCisJYmxpbmsJdHIwLCByNjMKKwlmbGQucwlyMTUsIE9GU19GTFQsIGZyNAorCWJsaW5rCXRyMCwgcjYzCisJZmxkLnMJcjE1LCBPRlNfRkxULCBmcjUKKwlibGluawl0cjAsIHI2MworCWZsZC5zCXIxNSwgT0ZTX0ZMVCwgZnI2CisJYmxpbmsJdHIwLCByNjMKKwlmbGQucwlyMTUsIE9GU19GTFQsIGZyNworCWJsaW5rCXRyMCwgcjYzCisJZmxkLnMJcjE1LCBPRlNfRkxULCBmcjgKKwlibGluawl0cjAsIHI2MworCWZsZC5zCXIxNSwgT0ZTX0ZMVCwgZnI5CisJYmxpbmsJdHIwLCByNjMKKwlmbGQucwlyMTUsIE9GU19GTFQsIGZyMTAKKwlibGluawl0cjAsIHI2MworCWZsZC5zCXIxNSwgT0ZTX0ZMVCwgZnIxMQorCWJsaW5rCXRyMCwgcjYzCisKKy5MX3Bhc3NfaToKKwlwdC9sCTNmLCB0cjAKKwltb3ZpCTgsIHIyMAorCWJnZS9sCXIwLCByMjAsIHRyMAorCisJcHQvbAkuTF9wb3BfaSwgdHIxCisJcHQvbAkyZiwgdHIwCisJYmxpbmsJdHIxLCByNjMKKzI6CisJYWRkaS5sCXIxNSwgOCwgcjE1CiszOgorCXB0L2wJLkxfcGFzcywgdHIwCisJYWRkaQlyMCwgMSwgcjAKKwlibGluawl0cjAsIHI2MworCisuTF9wb3BfaToKKwlwdC9sCS5MX3BvcF9pX3RibCwgdHIxCisJZ2V0dHIJdHIxLCByMjAKKwlzaGxsaQlyMCwgMywgcjIxCisJYWRkCXIyMCwgcjIxLCByMjAKKwlwdGFicy9sCXIyMCwgdHIxCisJYmxpbmsJdHIxLCByNjMKKworLkxfcG9wX2lfdGJsOgorCWxkLnEJcjE1LCAwLCByMgorCWJsaW5rCXRyMCwgcjYzCisJbGQucQlyMTUsIDAsIHIzCisJYmxpbmsJdHIwLCByNjMKKwlsZC5xCXIxNSwgMCwgcjQKKwlibGluawl0cjAsIHI2MworCWxkLnEJcjE1LCAwLCByNQorCWJsaW5rCXRyMCwgcjYzCisJbGQucQlyMTUsIDAsIHI2CisJYmxpbmsJdHIwLCByNjMKKwlsZC5xCXIxNSwgMCwgcjcKKwlibGluawl0cjAsIHI2MworCWxkLnEJcjE1LCAwLCByOAorCWJsaW5rCXRyMCwgcjYzCisJbGQucQlyMTUsIDAsIHI5CisJYmxpbmsJdHIwLCByNjMKKworLkxfY2FsbF9pdDoKKwkjIGNhbGwgZnVuY3Rpb24KKwlwdC9sCTFmLCB0cjEKKwlibmVpL2wJcjI5LCBGRklfVFlQRV9TVFJVQ1QsIHRyMQorCWFkZAlyMTksIHI2MywgcjIKKzE6CisJYWRkCXIyMiwgcjYzLCByMTUKKwlwdGFicy9sCXIzMiwgdHIwCisJYmxpbmsJdHIwLCByMTgKKworCXB0L2wJLkxfcmV0X2ksIHRyMAorCXB0L2wJLkxfcmV0X2xsLCB0cjEKKwlwdC9sCS5MX3JldF9kLCB0cjIKKwlwdC9sCS5MX3JldF9mLCB0cjMKKwlwdC9sCS5MX2VwaWxvZ3VlLCB0cjQKKworCWJlcWkvbAlyMjksIEZGSV9UWVBFX0lOVCwgdHIwCisJYmVxaS9sCXIyOSwgRkZJX1RZUEVfVUlOVDMyLCB0cjAKKwliZXFpL2wJcjI5LCBGRklfVFlQRV9TSU5UNjQsIHRyMQorCWJlcWkvbAlyMjksIEZGSV9UWVBFX1VJTlQ2NCwgdHIxCisJYmVxaS9sCXIyOSwgRkZJX1RZUEVfRE9VQkxFLCB0cjIKKwliZXFpL2wJcjI5LCBGRklfVFlQRV9GTE9BVCwgdHIzCisKKwlwdC9sCS5MX3JldF9xLCB0cjAKKwlwdC9sCS5MX3JldF9oLCB0cjEKKworCWJlcWkvbAlyMjksIEZGSV9UWVBFX1VJTlQ4LCB0cjAKKwliZXFpL2wJcjI5LCBGRklfVFlQRV9VSU5UMTYsIHRyMQorCWJsaW5rCXRyNCwgcjYzCisKKy5MX3JldF9kOgorCWZzdC5kCXIzMSwgMCwgZHIwCisJYmxpbmsJdHI0LCByNjMKKworLkxfcmV0X2xsOgorCXN0LnEJcjMxLCAwLCByMgorCWJsaW5rCXRyNCwgcjYzCisKKy5MX3JldF9mOgorCWZzdC5zCXIzMSwgT0ZTX0ZMVCwgZnIwCisJYmxpbmsJdHI0LCByNjMKKworLkxfcmV0X3E6CisJc3QuYglyMzEsIDAsIHIyCisJYmxpbmsJdHI0LCByNjMKKworLkxfcmV0X2g6CisJc3QudwlyMzEsIDAsIHIyCisJYmxpbmsJdHI0LCByNjMKKworLkxfcmV0X2k6CisJc3QubAlyMzEsIDAsIHIyCisJIyBGYWxsCisKKy5MX2VwaWxvZ3VlOgorCSMgUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzCisJYWRkCXIxNCwgcjYzLCByMTUKKworCWxkLmwJcjE1LCAwLCByMTQKKwlsZC5sCXIxNSwgNCwgcjE4CisJbGQucQlyMTUsIDgsIHIyOAorCWxkLnEJcjE1LCAxNiwgcjI5CisJbGQucQlyMTUsIDI0LCByMzAKKwlsZC5xCXIxNSwgMzIsIHIzMQorCWxkLnEJcjE1LCA0MCwgcjMyCisJYWRkaS5sCXIxNSwgNDgsIHIxNQorCXB0YWJzCXIxOCwgdHIwCisJYmxpbmsJdHIwLCByNjMKKworLkxGRTE6CisuZmZpX2NhbGxfU1lTVl9lbmQ6CisJLnNpemUJIENOQU1FKGZmaV9jYWxsX1NZU1YpLC5mZmlfY2FsbF9TWVNWX2VuZC1DTkFNRShmZmlfY2FsbF9TWVNWKQorCisJLmFsaWduCTUKK0VOVFJZKGZmaV9jbG9zdXJlX1NZU1YpCisuTEZCMjoKKwlhZGRpLmwJcjE1LCAtMTM2LCByMTUKKy5MQ0ZJMzoKKwlzdC5sCXIxNSwgMTIsIHIxOAorCXN0LmwJcjE1LCA4LCByMTQKKwlzdC5sCXIxNSwgNCwgcjEyCisuTENGSTQ6CisJYWRkCXIxNSwgcjYzLCByMTQKKy5MQ0ZJNToKKwkvKiBTdGFjayBsYXlvdXQ6CQorCSAgIC4uLgorCSAgIDY0IGJ5dGVzIChyZWdpc3RlciBwYXJhbWV0ZXJzKQorCSAgIDQ4IGJ5dGVzIChmbG9hdGluZyByZWdpc3RlciBwYXJhbWV0ZXJzKQorCSAgICA4IGJ5dGVzIChyZXN1bHQpCisJICAgIDQgYnl0ZXMgKHIxOCkKKwkgICAgNCBieXRlcyAocjE0KQorCSAgICA0IGJ5dGVzIChyMTIpCisJICAgIDQgYnl0ZXMgKGZvciBhbGlnbikKKwkgICA8LSBuZXcgc3RhY2sgcG9pbnRlcgorCSovCisJZnN0LmQJcjE0LCAyNCwgZHIwCisJZnN0LmQJcjE0LCAzMiwgZHIyCisJZnN0LmQJcjE0LCA0MCwgZHI0CisJZnN0LmQJcjE0LCA0OCwgZHI2CisJZnN0LmQJcjE0LCA1NiwgZHI4CisJZnN0LmQJcjE0LCA2NCwgZHIxMAorCXN0LnEJcjE0LCA3MiwgcjIKKwlzdC5xCXIxNCwgODAsIHIzCisJc3QucQlyMTQsIDg4LCByNAorCXN0LnEJcjE0LCA5NiwgcjUKKwlzdC5xCXIxNCwgMTA0LCByNgorCXN0LnEJcjE0LCAxMTIsIHI3CisJc3QucQlyMTQsIDEyMCwgcjgKKwlzdC5xCXIxNCwgMTI4LCByOQorCisJYWRkCXIxLCByNjMsIHIyCisJYWRkaQlyMTQsIDE2LCByMworCWFkZGkJcjE0LCA3MiwgcjQKKwlhZGRpCXIxNCwgMjQsIHI1CisJYWRkaQlyMTQsIDEzNiwgcjYKKyNpZmRlZiBQSUMKKwltb3ZpCSgoKGRhdGFsYWJlbCBfR0xPQkFMX09GRlNFVF9UQUJMRV8tKC5MUENTMC0uKSkgPj4gMTYpICYgNjU1MzUpLCByMTIKKyAgICAgICAgc2hvcmkJKChkYXRhbGFiZWwgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLSguTFBDUzAtLikpICYgNjU1MzUpLCByMTIKKy5MUENTMDoJcHRyZWwvdSByMTIsIHRyMAorCW1vdmkJKChmZmlfY2xvc3VyZV9oZWxwZXJfU1lTVkBHT1RQTFQpICYgNjU1MzUpLCByMQorCWdldHRyCXRyMCwgcjEyCisJbGR4LmwJcjEsIHIxMiwgcjEKKwlwdGFicwlyMSwgdHIwCisjZWxzZQorCXB0L2wJZmZpX2Nsb3N1cmVfaGVscGVyX1NZU1YsIHRyMAorI2VuZGlmCisJYmxpbmsJdHIwLCByMTgKKworCXNobGxpCXIyLCAxLCByMQorICAgICAgICBtb3ZpICAgICgoKGRhdGFsYWJlbCAuTF90YWJsZSkgPj4gMTYpICYgNjU1MzUpLCByMgorICAgICAgICBzaG9yaSAgICgoZGF0YWxhYmVsIC5MX3RhYmxlKSAmIDY1NTM1KSwgcjIKKyAgICAgICAgbGR4LncgICByMiwgcjEsIHIxCisgICAgICAgIGFkZCAgICAgcjEsIHIyLCByMQorCXB0L2wJLkxfY2FzZV92LCB0cjEKKyAgICAgICAgcHRhYnMgICByMSwgdHIwCisgICAgICAgIGJsaW5rICAgdHIwLCByNjMKKworICAgICAgICAuYWxpZ24gMgorLkxfdGFibGU6CisJLndvcmQJLkxfY2FzZV92IC0gZGF0YWxhYmVsIC5MX3RhYmxlCS8qIEZGSV9UWVBFX1ZPSUQgKi8KKwkud29yZAkuTF9jYXNlX2kgLSBkYXRhbGFiZWwgLkxfdGFibGUJLyogRkZJX1RZUEVfSU5UICovCisJLndvcmQJLkxfY2FzZV9mIC0gZGF0YWxhYmVsIC5MX3RhYmxlCS8qIEZGSV9UWVBFX0ZMT0FUICovCisJLndvcmQJLkxfY2FzZV9kIC0gZGF0YWxhYmVsIC5MX3RhYmxlCS8qIEZGSV9UWVBFX0RPVUJMRSAqLworCS53b3JkCS5MX2Nhc2VfZCAtIGRhdGFsYWJlbCAuTF90YWJsZQkvKiBGRklfVFlQRV9MT05HRE9VQkxFICovCisJLndvcmQJLkxfY2FzZV91cSAtIGRhdGFsYWJlbCAuTF90YWJsZQkvKiBGRklfVFlQRV9VSU5UOCAqLworCS53b3JkCS5MX2Nhc2VfcSAtIGRhdGFsYWJlbCAuTF90YWJsZQkvKiBGRklfVFlQRV9TSU5UOCAqLworCS53b3JkCS5MX2Nhc2VfdWggLSBkYXRhbGFiZWwgLkxfdGFibGUJLyogRkZJX1RZUEVfVUlOVDE2ICovCisJLndvcmQJLkxfY2FzZV9oIC0gZGF0YWxhYmVsIC5MX3RhYmxlCS8qIEZGSV9UWVBFX1NJTlQxNiAqLworCS53b3JkCS5MX2Nhc2VfaSAtIGRhdGFsYWJlbCAuTF90YWJsZQkvKiBGRklfVFlQRV9VSU5UMzIgKi8KKwkud29yZAkuTF9jYXNlX2kgLSBkYXRhbGFiZWwgLkxfdGFibGUJLyogRkZJX1RZUEVfU0lOVDMyICovCisJLndvcmQJLkxfY2FzZV9sbCAtIGRhdGFsYWJlbCAuTF90YWJsZQkvKiBGRklfVFlQRV9VSU5UNjQgKi8KKwkud29yZAkuTF9jYXNlX2xsIC0gZGF0YWxhYmVsIC5MX3RhYmxlCS8qIEZGSV9UWVBFX1NJTlQ2NCAqLworCS53b3JkCS5MX2Nhc2VfdiAtIGRhdGFsYWJlbCAuTF90YWJsZQkvKiBGRklfVFlQRV9TVFJVQ1QgKi8KKwkud29yZAkuTF9jYXNlX2kgLSBkYXRhbGFiZWwgLkxfdGFibGUJLyogRkZJX1RZUEVfUE9JTlRFUiAqLworCisgICAgICAgIC5hbGlnbiAyCisuTF9jYXNlX2Q6CisJZmxkLmQJcjE0LCAxNiwgZHIwCisJYmxpbmsJdHIxLCByNjMKKy5MX2Nhc2VfZjoKKwlmbGQucwlyMTQsIDE2LCBmcjAKKwlibGluawl0cjEsIHI2MworLkxfY2FzZV9sbDoKKwlsZC5xCXIxNCwgMTYsIHIyCisJYmxpbmsJdHIxLCByNjMKKy5MX2Nhc2VfaToKKwlsZC5sCXIxNCwgMTYsIHIyCisJYmxpbmsJdHIxLCByNjMKKy5MX2Nhc2VfcToKKwlsZC5iCXIxNCwgMTYsIHIyCisJYmxpbmsJdHIxLCByNjMKKy5MX2Nhc2VfdXE6CisJbGQudWIJcjE0LCAxNiwgcjIKKwlibGluawl0cjEsIHI2MworLkxfY2FzZV9oOgorCWxkLncJcjE0LCAxNiwgcjIKKwlibGluawl0cjEsIHI2MworLkxfY2FzZV91aDoKKwlsZC51dwlyMTQsIDE2LCByMgorCWJsaW5rCXRyMSwgcjYzCisuTF9jYXNlX3Y6CisJYWRkLmwJcjE0LCByNjMsIHIxNQorCWxkLmwJcjE1LCA0LCByMTIKKwlsZC5sCXIxNSwgOCwgcjE0CisJbGQubAlyMTUsIDEyLCByMTgKKwlhZGRpLmwJcjE1LCAxMzYsIHIxNQorCXB0YWJzCXIxOCwgdHIwCisJYmxpbmsJdHIwLCByNjMKKworLkxGRTI6CisuZmZpX2Nsb3N1cmVfU1lTVl9lbmQ6CisJLnNpemUJIENOQU1FKGZmaV9jbG9zdXJlX1NZU1YpLC5mZmlfY2xvc3VyZV9TWVNWX2VuZC1DTkFNRShmZmlfY2xvc3VyZV9TWVNWKQorCisjaWYgZGVmaW5lZCBfX0VMRl9fICYmIGRlZmluZWQgX19saW51eF9fCisJLnNlY3Rpb24JLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworI2VuZGlmCisKKwkuc2VjdGlvbgkiLmVoX2ZyYW1lIiwiYXciLEBwcm9nYml0cworX19GUkFNRV9CRUdJTl9fOgorCS40Ynl0ZQkuTEVDSUUxLS5MU0NJRTEJLyogTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeSAqLworLkxTQ0lFMToKKwkuNGJ5dGUJMHgwCS8qIENJRSBJZGVudGlmaWVyIFRhZyAqLworCS5ieXRlCTB4MQkvKiBDSUUgVmVyc2lvbiAqLworI2lmZGVmIFBJQworCS5hc2NpaSAielJcMCIJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworI2Vsc2UKKwkuYnl0ZQkweDAJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworI2VuZGlmCisJLnVsZWIxMjggMHgxCS8qIENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IgKi8KKwkuc2xlYjEyOCAtNAkvKiBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yICovCisJLmJ5dGUJMHgxMgkvKiBDSUUgUkEgQ29sdW1uICovCisjaWZkZWYgUElDCisJLnVsZWIxMjggMHgxCS8qIEF1Z21lbnRhdGlvbiBzaXplICovCisJLmJ5dGUJMHgxMAkvKiBGREUgRW5jb2RpbmcgKHBjcmVsKSAqLworI2VuZGlmCisJLmJ5dGUJMHhjCS8qIERXX0NGQV9kZWZfY2ZhICovCisJLnVsZWIxMjggMHhmCisJLnVsZWIxMjggMHgwCisJLmFsaWduCTIKKy5MRUNJRTE6CisuTFNGREUxOgorCS40Ynl0ZQlkYXRhbGFiZWwgLkxFRkRFMS1kYXRhbGFiZWwgLkxBU0ZERTEJLyogRkRFIExlbmd0aCAqLworLkxBU0ZERTE6CisJLjRieXRlCWRhdGFsYWJlbCAuTEFTRkRFMS1kYXRhbGFiZWwgX19GUkFNRV9CRUdJTl9fCisjaWZkZWYgUElDCisJLjRieXRlCS5MRkIxLS4JLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbHNlCisJLjRieXRlCS5MRkIxCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisjZW5kaWYKKwkuNGJ5dGUJZGF0YWxhYmVsIC5MRkUxLWRhdGFsYWJlbCAuTEZCMQkvKiBGREUgYWRkcmVzcyByYW5nZSAqLworI2lmZGVmIFBJQworCS51bGViMTI4IDB4MAkvKiBBdWdtZW50YXRpb24gc2l6ZSAqLworI2VuZGlmCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJZGF0YWxhYmVsIC5MQ0ZJMC1kYXRhbGFiZWwgLkxGQjEKKwkuYnl0ZQkweGUJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLnVsZWIxMjggMHgzMAorCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLjRieXRlCWRhdGFsYWJlbCAuTENGSTEtZGF0YWxhYmVsIC5MQ0ZJMAorCS5ieXRlICAgMHg4ZQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHhlICovCisJLnVsZWIxMjggMHhjCisJLmJ5dGUgICAweDkyCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDEyICovCisJLnVsZWIxMjggMHhiCisJLmJ5dGUgICAweDljCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDFjICovCisJLnVsZWIxMjggMHhhCisJLmJ5dGUgICAweDlkCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDFkICovCisJLnVsZWIxMjggMHg4CisJLmJ5dGUgICAweDllCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDFlICovCisJLnVsZWIxMjggMHg2CisJLmJ5dGUgICAweDlmCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDFmICovCisJLnVsZWIxMjggMHg0CisJLmJ5dGUgICAweGEwCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDIwICovCisJLnVsZWIxMjggMHgyCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJZGF0YWxhYmVsIC5MQ0ZJMi1kYXRhbGFiZWwgLkxDRkkxCisJLmJ5dGUJMHhkCS8qIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyICovCisJLnVsZWIxMjggMHhlCisJLmFsaWduCTIKKy5MRUZERTE6CisKKy5MU0ZERTM6CisJLjRieXRlCWRhdGFsYWJlbCAuTEVGREUzLWRhdGFsYWJlbCAuTEFTRkRFMwkvKiBGREUgTGVuZ3RoICovCisuTEFTRkRFMzoKKwkuNGJ5dGUJZGF0YWxhYmVsIC5MQVNGREUzLWRhdGFsYWJlbCBfX0ZSQU1FX0JFR0lOX18KKyNpZmRlZiBQSUMKKwkuNGJ5dGUJLkxGQjItLgkvKiBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLworI2Vsc2UKKwkuNGJ5dGUJLkxGQjIJLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbmRpZgorCS40Ynl0ZQlkYXRhbGFiZWwgLkxGRTItZGF0YWxhYmVsIC5MRkIyCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisjaWZkZWYgUElDCisJLnVsZWIxMjggMHgwCS8qIEF1Z21lbnRhdGlvbiBzaXplICovCisjZW5kaWYKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS40Ynl0ZQlkYXRhbGFiZWwgLkxDRkkzLWRhdGFsYWJlbCAuTEZCMgorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkudWxlYjEyOCAweDg4CisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuNGJ5dGUJZGF0YWxhYmVsIC5MQ0ZJNC1kYXRhbGFiZWwgLkxDRkkzCisJLmJ5dGUgICAweDhjCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGMgKi8KKwkudWxlYjEyOCAweDIxCisJLmJ5dGUgICAweDhlCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweGUgKi8KKwkudWxlYjEyOCAweDIwCisJLmJ5dGUgICAweDkyCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDEyICovCisJLnVsZWIxMjggMHgxZgorCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLjRieXRlCWRhdGFsYWJlbCAuTENGSTUtZGF0YWxhYmVsIC5MQ0ZJNAorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciAqLworCS51bGViMTI4IDB4ZQorCS5hbGlnbgkyCisuTEVGREUzOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zcGFyYy9mZmkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc3BhcmMvZmZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjNWQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc3BhcmMvZmZpLmMKQEAgLTAsMCArMSw2NjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMjAxMSBBbnRob255IEdyZWVuCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5NiwgMjAwMy0yMDA0LCAyMDA3LTIwMDggUmVkIEhhdCwgSW5jLgorICAgCisgICBTUEFSQyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKy8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKKyAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzICovCisKK3ZvaWQgZmZpX3ByZXBfYXJnc192OChjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKQoreworICBpbnQgaTsKKyAgdm9pZCAqKnBfYXJndjsKKyAgY2hhciAqYXJncDsKKyAgZmZpX3R5cGUgKipwX2FyZzsKKworICAvKiBTa2lwIDE2IHdvcmRzIGZvciB0aGUgd2luZG93IHNhdmUgYXJlYSAqLworICBhcmdwID0gc3RhY2sgKyAxNipzaXplb2YoaW50KTsKKworICAvKiBUaGlzIHNob3VsZCBvbmx5IHJlYWxseSBiZSBkb25lIHdoZW4gd2UgYXJlIHJldHVybmluZyBhIHN0cnVjdHVyZSwKKyAgICAgaG93ZXZlciwgaXQncyBmYXN0ZXIganVzdCB0byBkbyBpdCBhbGwgdGhlIHRpbWUuLi4KKworICBpZiAoIGVjaWYtPmNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUICkgKi8KKyAgKihpbnQgKikgYXJncCA9IChsb25nKWVjaWYtPnJ2YWx1ZTsKKworICAvKiBBbmQgMSB3b3JkIGZvciB0aGUgIHN0cnVjdHVyZSByZXR1cm4gdmFsdWUuICovCisgIGFyZ3AgKz0gc2l6ZW9mKGludCk7CisKKyNpZmRlZiBVU0lOR19QVVJJRlkKKyAgLyogUHVyaWZ5IHdpbGwgcHJvYmFibHkgY29tcGxhaW4gaW4gb3VyIGFzc2VtYmx5IHJvdXRpbmUsIHVubGVzcyB3ZQorICAgICB6ZXJvIG91dCB0aGlzIG1lbW9yeS4gKi8KKworICAoKGludCopYXJncClbMF0gPSAwOworICAoKGludCopYXJncClbMV0gPSAwOworICAoKGludCopYXJncClbMl0gPSAwOworICAoKGludCopYXJncClbM10gPSAwOworICAoKGludCopYXJncClbNF0gPSAwOworICAoKGludCopYXJncClbNV0gPSAwOworI2VuZGlmCisKKyAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworCisgIGZvciAoaSA9IGVjaWYtPmNpZi0+bmFyZ3MsIHBfYXJnID0gZWNpZi0+Y2lmLT5hcmdfdHlwZXM7IGk7IGktLSwgcF9hcmcrKykKKyAgICB7CisgICAgICBzaXplX3QgejsKKworCSAgaWYgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAorI2lmIEZGSV9UWVBFX0xPTkdET1VCTEUgIT0gRkZJX1RZUEVfRE9VQkxFCisJICAgICAgfHwgKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRQorI2VuZGlmCisJICAgICAgKQorCSAgICB7CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBsb25nKSgqIHBfYXJndik7CisJICAgICAgeiA9IHNpemVvZihpbnQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisJICAgICAgaWYgKHogPCBzaXplb2YoaW50KSkKKwkJeworCQkgIHogPSBzaXplb2YoaW50KTsKKwkJICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKQorCQkgICAgeworCQkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkJICAgICAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAqKFNJTlQ4ICopKCogcF9hcmd2KTsKKwkJICAgICAgYnJlYWs7CisJCSAgICAgIAorCQkgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICooVUlOVDggKikoKiBwX2FyZ3YpOworCQkgICAgICBicmVhazsKKwkJICAgICAgCisJCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkJICAgICAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAqKFNJTlQxNiAqKSgqIHBfYXJndik7CisJCSAgICAgIGJyZWFrOworCQkgICAgICAKKwkJICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCQkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKihVSU5UMTYgKikoKiBwX2FyZ3YpOworCQkgICAgICBicmVhazsKKworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgRkZJX0FTU0VSVCgwKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIG1lbWNweShhcmdwLCAqcF9hcmd2LCB6KTsKKwkJfQorCSAgICB9CisJICBwX2FyZ3YrKzsKKwkgIGFyZ3AgKz0gejsKKyAgICB9CisgIAorICByZXR1cm47Cit9CisKK2ludCBmZmlfcHJlcF9hcmdzX3Y5KGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCit7CisgIGludCBpLCByZXQgPSAwOworICBpbnQgdG1wOworICB2b2lkICoqcF9hcmd2OworICBjaGFyICphcmdwOworICBmZmlfdHlwZSAqKnBfYXJnOworCisgIHRtcCA9IDA7CisKKyAgLyogU2tpcCAxNiB3b3JkcyBmb3IgdGhlIHdpbmRvdyBzYXZlIGFyZWEgKi8KKyAgYXJncCA9IHN0YWNrICsgMTYqc2l6ZW9mKGxvbmcgbG9uZyk7CisKKyNpZmRlZiBVU0lOR19QVVJJRlkKKyAgLyogUHVyaWZ5IHdpbGwgcHJvYmFibHkgY29tcGxhaW4gaW4gb3VyIGFzc2VtYmx5IHJvdXRpbmUsIHVubGVzcyB3ZQorICAgICB6ZXJvIG91dCB0aGlzIG1lbW9yeS4gKi8KKworICAoKGxvbmcgbG9uZyopYXJncClbMF0gPSAwOworICAoKGxvbmcgbG9uZyopYXJncClbMV0gPSAwOworICAoKGxvbmcgbG9uZyopYXJncClbMl0gPSAwOworICAoKGxvbmcgbG9uZyopYXJncClbM10gPSAwOworICAoKGxvbmcgbG9uZyopYXJncClbNF0gPSAwOworICAoKGxvbmcgbG9uZyopYXJncClbNV0gPSAwOworI2VuZGlmCisKKyAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworCisgIGlmIChlY2lmLT5jaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCAmJgorICAgICAgZWNpZi0+Y2lmLT5ydHlwZS0+c2l6ZSA+IDMyKQorICAgIHsKKyAgICAgICoodW5zaWduZWQgbG9uZyBsb25nICopIGFyZ3AgPSAodW5zaWduZWQgbG9uZyllY2lmLT5ydmFsdWU7CisgICAgICBhcmdwICs9IHNpemVvZihsb25nIGxvbmcpOworICAgICAgdG1wID0gMTsKKyAgICB9CisKKyAgZm9yIChpID0gMCwgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsgaSA8IGVjaWYtPmNpZi0+bmFyZ3M7CisgICAgICAgaSsrLCBwX2FyZysrKQorICAgIHsKKyAgICAgIHNpemVfdCB6OworCisgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisgICAgICBzd2l0Y2ggKCgqcF9hcmcpLT50eXBlKQorCXsKKwljYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgIGlmICh6ID4gMTYpCisJICAgIHsKKwkgICAgICAvKiBGb3Igc3RydWN0dXJlcyBsYXJnZXIgdGhhbiAxNiBieXRlcyB3ZSBwYXNzIHJlZmVyZW5jZS4gICovCisJICAgICAgKih1bnNpZ25lZCBsb25nIGxvbmcgKikgYXJncCA9ICh1bnNpZ25lZCBsb25nKSogcF9hcmd2OworCSAgICAgIGFyZ3AgKz0gc2l6ZW9mKGxvbmcgbG9uZyk7CisJICAgICAgdG1wKys7CisJICAgICAgcF9hcmd2Kys7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBGRklfVFlQRV9GTE9BVDoKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyNlbmRpZgorCSAgcmV0ID0gMTsgLyogV2Ugc2hvdWxkIHByb21vdGUgaW50byBGUCByZWdzIGFzIHdlbGwgYXMgaW50ZWdlci4gICovCisJICBicmVhazsKKwl9CisgICAgICBpZiAoeiA8IHNpemVvZihsb25nIGxvbmcpKQorCXsKKwkgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgICAqKHNpZ25lZCBsb25nIGxvbmcgKikgYXJncCA9ICooU0lOVDggKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfVUlOVDg6CisJICAgICAgKih1bnNpZ25lZCBsb25nIGxvbmcgKikgYXJncCA9ICooVUlOVDggKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorCSAgICAgICooc2lnbmVkIGxvbmcgbG9uZyAqKSBhcmdwID0gKihTSU5UMTYgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorCSAgICAgICoodW5zaWduZWQgbG9uZyBsb25nICopIGFyZ3AgPSAqKFVJTlQxNiAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJICAgICAgKihzaWduZWQgbG9uZyBsb25nICopIGFyZ3AgPSAqKFNJTlQzMiAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICAgICAgKih1bnNpZ25lZCBsb25nIGxvbmcgKikgYXJncCA9ICooVUlOVDMyICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorCSAgICAgICooZmxvYXQgKikgKGFyZ3AgKyA0KSA9ICooRkxPQVQzMiAqKSgqIHBfYXJndik7IC8qIFJpZ2h0IGp1c3RpZnkgKi8KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgICBtZW1jcHkoYXJncCwgKnBfYXJndiwgeik7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBGRklfQVNTRVJUKDApOworCSAgICB9CisJICB6ID0gc2l6ZW9mKGxvbmcgbG9uZyk7CisJICB0bXArKzsKKwl9CisgICAgICBlbHNlIGlmICh6ID09IHNpemVvZihsb25nIGxvbmcpKQorCXsKKwkgIG1lbWNweShhcmdwLCAqcF9hcmd2LCB6KTsKKwkgIHogPSBzaXplb2YobG9uZyBsb25nKTsKKwkgIHRtcCsrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoKHRtcCAmIDEpICYmICgqcF9hcmcpLT5hbGlnbm1lbnQgPiA4KQorCSAgICB7CisJICAgICAgdG1wKys7CisJICAgICAgYXJncCArPSBzaXplb2YobG9uZyBsb25nKTsKKwkgICAgfQorCSAgbWVtY3B5KGFyZ3AsICpwX2FyZ3YsIHopOworCSAgeiA9IDIgKiBzaXplb2YobG9uZyBsb25nKTsKKwkgIHRtcCArPSAyOworCX0KKyAgICAgIHBfYXJndisrOworICAgICAgYXJncCArPSB6OworICAgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCitmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZl9tYWNoZGVwKGZmaV9jaWYgKmNpZikKK3sKKyAgaW50IHdvcmRzaXplOworCisgIGlmIChjaWYtPmFiaSAhPSBGRklfVjkpCisgICAgeworICAgICAgd29yZHNpemUgPSA0OworCisgICAgICAvKiBJZiB3ZSBhcmUgcmV0dXJuaW5nIGEgc3RydWN0LCB0aGlzIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gYWRkZWQuCisJIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGFkZCBpdCBiZWNhdXNlIGl0J3MgYWx3YXlzIGdvdCB0byBiZSB0aGVyZSEgKi8KKworICAgICAgaWYgKGNpZi0+cnR5cGUtPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUKQorCWNpZi0+Ynl0ZXMgKz0gd29yZHNpemU7CisKKyAgICAgIC8qIHNwYXJjIGNhbGwgZnJhbWVzIHJlcXVpcmUgdGhhdCBzcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIDYgYXJncywKKwkgZXZlbiBpZiB0aGV5IGFyZW4ndCB1c2VkLiBNYWtlIHRoYXQgc3BhY2UgaWYgbmVjZXNzYXJ5LiAqLworICAKKyAgICAgIGlmIChjaWYtPmJ5dGVzIDwgNCo2KzQpCisJY2lmLT5ieXRlcyA9IDQqNis0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdvcmRzaXplID0gODsKKworICAgICAgLyogc3BhcmMgY2FsbCBmcmFtZXMgcmVxdWlyZSB0aGF0IHNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgNiBhcmdzLAorCSBldmVuIGlmIHRoZXkgYXJlbid0IHVzZWQuIE1ha2UgdGhhdCBzcGFjZSBpZiBuZWNlc3NhcnkuICovCisgIAorICAgICAgaWYgKGNpZi0+Ynl0ZXMgPCA4KjYpCisJY2lmLT5ieXRlcyA9IDgqNjsKKyAgICB9CisKKyAgLyogQWRqdXN0IGNpZi0+Ynl0ZXMuIHRvIGluY2x1ZGUgMTYgd29yZHMgZm9yIHRoZSB3aW5kb3cgc2F2ZSBhcmVhLAorICAgICBhbmQgbWF5YmUgdGhlIHN0cnVjdC91bmlvbiByZXR1cm4gcG9pbnRlciBhcmVhLCAqLworCisgIGNpZi0+Ynl0ZXMgKz0gMTYgKiB3b3Jkc2l6ZTsKKworICAvKiBUaGUgc3RhY2sgbXVzdCBiZSAyIHdvcmQgYWxpZ25lZCwgc28gcm91bmQgYnl0ZXMgdXAKKyAgICAgYXBwcm9wcmlhdGVseS4gKi8KKworICBjaWYtPmJ5dGVzID0gQUxJR04oY2lmLT5ieXRlcywgMiAqIHdvcmRzaXplKTsKKworICAvKiBTZXQgdGhlIHJldHVybiB0eXBlIGZsYWcgKi8KKyAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CisgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKyAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorICAgIGNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyNlbmRpZgorICAgICAgY2lmLT5mbGFncyA9IGNpZi0+cnR5cGUtPnR5cGU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgaWYgKGNpZi0+YWJpID09IEZGSV9WOSAmJiBjaWYtPnJ0eXBlLT5zaXplID4gMzIpCisJY2lmLT5mbGFncyA9IEZGSV9UWVBFX1ZPSUQ7CisgICAgICBlbHNlCisJY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgICAgaWYgKGNpZi0+YWJpID09IEZGSV9WOSkKKwljaWYtPmZsYWdzID0gRkZJX1RZUEVfSU5UOworICAgICAgZWxzZQorCWNpZi0+ZmxhZ3MgPSBjaWYtPnJ0eXBlLT50eXBlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQ2NDoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKyAgICAgIGlmIChjaWYtPmFiaSA9PSBGRklfVjkpCisJY2lmLT5mbGFncyA9IEZGSV9UWVBFX0lOVDsKKyAgICAgIGVsc2UKKwljaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDY0OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX0lOVDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIEZGSV9PSzsKK30KKworaW50IGZmaV92OV9sYXlvdXRfc3RydWN0KGZmaV90eXBlICphcmcsIGludCBvZmYsIGNoYXIgKnJldCwgY2hhciAqaW50ZywgY2hhciAqZmx0KQoreworICBmZmlfdHlwZSAqKnB0ciA9ICZhcmctPmVsZW1lbnRzWzBdOworCisgIHdoaWxlICgqcHRyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKG9mZiAmICgoKnB0ciktPmFsaWdubWVudCAtIDEpKQorCW9mZiA9IEFMSUdOKG9mZiwgKCpwdHIpLT5hbGlnbm1lbnQpOworCisgICAgICBzd2l0Y2ggKCgqcHRyKS0+dHlwZSkKKwl7CisJY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisJICBvZmYgPSBmZmlfdjlfbGF5b3V0X3N0cnVjdCgqcHRyLCBvZmYsIHJldCwgaW50ZywgZmx0KTsKKwkgIG9mZiA9IEFMSUdOKG9mZiwgRkZJX1NJWkVPRl9BUkcpOworCSAgYnJlYWs7CisJY2FzZSBGRklfVFlQRV9GTE9BVDoKKwljYXNlIEZGSV9UWVBFX0RPVUJMRToKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCWNhc2UgRkZJX1RZUEVfTE9OR0RPVUJMRToKKyNlbmRpZgorCSAgbWVtbW92ZShyZXQgKyBvZmYsIGZsdCArIG9mZiwgKCpwdHIpLT5zaXplKTsKKwkgIG9mZiArPSAoKnB0ciktPnNpemU7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgbWVtbW92ZShyZXQgKyBvZmYsIGludGcgKyBvZmYsICgqcHRyKS0+c2l6ZSk7CisJICBvZmYgKz0gKCpwdHIpLT5zaXplOworCSAgYnJlYWs7CisJfQorICAgICAgcHRyKys7CisgICAgfQorICByZXR1cm4gb2ZmOworfQorCisKKyNpZmRlZiBTUEFSQzY0CitleHRlcm4gaW50IGZmaV9jYWxsX3Y5KHZvaWQgKiwgZXh0ZW5kZWRfY2lmICosIHVuc2lnbmVkLCAKKwkJICAgICAgIHVuc2lnbmVkLCB1bnNpZ25lZCAqLCB2b2lkICgqZm4pKHZvaWQpKTsKKyNlbHNlCitleHRlcm4gaW50IGZmaV9jYWxsX3Y4KHZvaWQgKiwgZXh0ZW5kZWRfY2lmICosIHVuc2lnbmVkLCAKKwkJICAgICAgIHVuc2lnbmVkLCB1bnNpZ25lZCAqLCB2b2lkICgqZm4pKHZvaWQpKTsKKyNlbmRpZgorCit2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKyAgdm9pZCAqcnZhbCA9IHJ2YWx1ZTsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisKKyAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybgkqLworICAvKiB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZQkJICAgICAgICAqLworCisgIGVjaWYucnZhbHVlID0gcnZhbHVlOworICBpZiAoY2lmLT5ydHlwZS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgeworICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPD0gMzIpCisJcnZhbCA9IGFsbG9jYSg2NCk7CisgICAgICBlbHNlCisJeworCSAgcnZhbCA9IE5VTEw7CisJICBpZiAocnZhbHVlID09IE5VTEwpCisJICAgIGVjaWYucnZhbHVlID0gYWxsb2NhKGNpZi0+cnR5cGUtPnNpemUpOworCX0KKyAgICB9CisKKyAgc3dpdGNoIChjaWYtPmFiaSkgCisgICAgeworICAgIGNhc2UgRkZJX1Y4OgorI2lmZGVmIFNQQVJDNjQKKyAgICAgIC8qIFdlIGRvbid0IHlldCBzdXBwb3J0IGNhbGxpbmcgMzJiaXQgY29kZSBmcm9tIDY0Yml0ICovCisgICAgICBGRklfQVNTRVJUKDApOworI2Vsc2UKKyAgICAgIGlmIChydmFsdWUgJiYgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwkgIHx8IGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRQorI2VuZGlmCisJICApKQorCXsKKwkgIC8qIEZvciB2OCwgd2UgbmVlZCBhbiAidW5pbXAiIHdpdGggc2l6ZSBvZiByZXR1cm5pbmcgc3RydWN0ICovCisJICAvKiBiZWhpbmQgImNhbGwiLCBzbyB3ZSBhbGxvYyBzb21lIGV4ZWN1dGFibGUgc3BhY2UgZm9yIGl0LiAqLworCSAgLyogbDcgaXMgdXNlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdjguUyBkb2Vzbid0IHVzZSAlbDcuICAgKi8KKwkgIHVuc2lnbmVkIGludCAqY2FsbF9zdHJ1Y3QgPSBOVUxMOworCSAgZmZpX2Nsb3N1cmVfYWxsb2MoMzIsICZjYWxsX3N0cnVjdCk7CisJICBpZiAoY2FsbF9zdHJ1Y3QpCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBsb25nIGYgPSAodW5zaWduZWQgbG9uZylmbjsKKwkgICAgICBjYWxsX3N0cnVjdFswXSA9IDB4YWUxMDAwMWY7CQkgLyogbW92ICAgJWk3LCAlbDcJICovCisJICAgICAgY2FsbF9zdHJ1Y3RbMV0gPSAweGJlMTAwMDBmOwkJIC8qIG1vdiAgICVvNywgJWk3CSAqLworCSAgICAgIGNhbGxfc3RydWN0WzJdID0gMHgwMzAwMDAwMCB8IGYgPj4gMTA7ICAgICAvKiBzZXRoaSAlaGkoZm4pLCAlZzEJICovCisJICAgICAgY2FsbF9zdHJ1Y3RbM10gPSAweDlmYzA2MDAwIHwgKGYgJiAweDNmZik7IC8qIGptcCAlZzErJWxvKGZuKSwgJW83ICovCisJICAgICAgY2FsbF9zdHJ1Y3RbNF0gPSAweDAxMDAwMDAwOwkJIC8qIG5vcAkJCSAqLworCSAgICAgIGlmIChjaWYtPnJ0eXBlLT5zaXplIDwgMHg3ZikKKwkJY2FsbF9zdHJ1Y3RbNV0gPSBjaWYtPnJ0eXBlLT5zaXplOwkgLyogdW5pbXAJCSAqLworCSAgICAgIGVsc2UKKwkJY2FsbF9zdHJ1Y3RbNV0gPSAweDAxMDAwMDAwOwkgICAgIAkgLyogbm9wCQkJICovCisJICAgICAgY2FsbF9zdHJ1Y3RbNl0gPSAweDgxYzdlMDA4OwkJIC8qIHJldAkJCSAqLworCSAgICAgIGNhbGxfc3RydWN0WzddID0gMHhiZTEwMDAxNzsJCSAvKiBtb3YgICAlbDcsICVpNwkgKi8KKwkgICAgICBhc20gdm9sYXRpbGUgKCJpZmx1c2ggJTA7IGlmbHVzaCAlMCs4OyBpZmx1c2ggJTArMTY7IGlmbHVzaCAlMCsyNCIgOiA6CisJCQkgICAgInIiIChjYWxsX3N0cnVjdCkgOiAibWVtb3J5Iik7CisJICAgICAgLyogU1BBUkMgdjggcmVxdWlyZXMgNSBpbnN0cnVjdGlvbnMgZm9yIGZsdXNoIHRvIGJlIHZpc2libGUgKi8KKwkgICAgICBhc20gdm9sYXRpbGUgKCJub3A7IG5vcDsgbm9wOyBub3A7IG5vcCIpOworCSAgICAgIGZmaV9jYWxsX3Y4KGZmaV9wcmVwX2FyZ3NfdjgsICZlY2lmLCBjaWYtPmJ5dGVzLAorCQkJICBjaWYtPmZsYWdzLCBydmFsdWUsIGNhbGxfc3RydWN0KTsKKwkgICAgICBmZmlfY2xvc3VyZV9mcmVlKGNhbGxfc3RydWN0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZmZpX2NhbGxfdjgoZmZpX3ByZXBfYXJnc192OCwgJmVjaWYsIGNpZi0+Ynl0ZXMsCisJCQkgIGNpZi0+ZmxhZ3MsIHJ2YWx1ZSwgZm4pOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZmaV9jYWxsX3Y4KGZmaV9wcmVwX2FyZ3NfdjgsICZlY2lmLCBjaWYtPmJ5dGVzLAorCQkgICAgICBjaWYtPmZsYWdzLCBydmFsdWUsIGZuKTsKKwl9CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZJX1Y5OgorI2lmZGVmIFNQQVJDNjQKKyAgICAgIGZmaV9jYWxsX3Y5KGZmaV9wcmVwX2FyZ3NfdjksICZlY2lmLCBjaWYtPmJ5dGVzLAorCQkgIGNpZi0+ZmxhZ3MsIHJ2YWwsIGZuKTsKKyAgICAgIGlmIChydmFsdWUgJiYgcnZhbCAmJiBjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkKKwlmZmlfdjlfbGF5b3V0X3N0cnVjdChjaWYtPnJ0eXBlLCAwLCAoY2hhciAqKXJ2YWx1ZSwgKGNoYXIgKilydmFsLCAoKGNoYXIgKilydmFsKSszMik7CisjZWxzZQorICAgICAgLyogQW5kIHZpY2UgdmVyc2EgKi8KKyAgICAgIEZGSV9BU1NFUlQoMCk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKyNpZmRlZiBTUEFSQzY0CitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV92OSh2b2lkKTsKKyNlbHNlCitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV92OCh2b2lkKTsKKyNlbmRpZgorCitmZmlfc3RhdHVzCitmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqIGNsb3N1cmUsCisJCSAgICAgIGZmaV9jaWYqIGNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosIHZvaWQqLCB2b2lkKiosIHZvaWQqKSwKKwkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkgICAgICB2b2lkICpjb2RlbG9jKQoreworICB1bnNpZ25lZCBpbnQgKnRyYW1wID0gKHVuc2lnbmVkIGludCAqKSAmY2xvc3VyZS0+dHJhbXBbMF07CisgIHVuc2lnbmVkIGxvbmcgZm47CisjaWZkZWYgU1BBUkM2NAorICAvKiBUcmFtcG9saW5lIGFkZHJlc3MgaXMgZXF1YWwgdG8gdGhlIGNsb3N1cmUgYWRkcmVzcy4gIFdlIHRha2UgYWR2YW50YWdlCisgICAgIG9mIHRoYXQgdG8gcmVkdWNlIHRoZSB0cmFtcG9saW5lIHNpemUgYnkgOCBieXRlcy4gKi8KKyAgaWYgKGNpZi0+YWJpICE9IEZGSV9WOSkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisgIGZuID0gKHVuc2lnbmVkIGxvbmcpIGZmaV9jbG9zdXJlX3Y5OworICB0cmFtcFswXSA9IDB4ODM0MTQwMDA7CS8qIHJkCSVwYywgJWcxCSovCisgIHRyYW1wWzFdID0gMHhjYTU4NjAxMDsJLyogbGR4CVslZzErMTZdLCAlZzUJKi8KKyAgdHJhbXBbMl0gPSAweDgxYzE0MDAwOwkvKiBqbXAJJWc1CQkqLworICB0cmFtcFszXSA9IDB4MDEwMDAwMDA7CS8qIG5vcAkJCSovCisgICooKHVuc2lnbmVkIGxvbmcgKikgJnRyYW1wWzRdKSA9IGZuOworI2Vsc2UKKyAgdW5zaWduZWQgbG9uZyBjdHggPSAodW5zaWduZWQgbG9uZykgY29kZWxvYzsKKyAgaWYgKGNpZi0+YWJpICE9IEZGSV9WOCkKKyAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisgIGZuID0gKHVuc2lnbmVkIGxvbmcpIGZmaV9jbG9zdXJlX3Y4OworICB0cmFtcFswXSA9IDB4MDMwMDAwMDAgfCBmbiA+PiAxMDsJLyogc2V0aGkgJWhpKGZuKSwgJWcxCSovCisgIHRyYW1wWzFdID0gMHgwNTAwMDAwMCB8IGN0eCA+PiAxMDsJLyogc2V0aGkgJWhpKGN0eCksICVnMgkqLworICB0cmFtcFsyXSA9IDB4ODFjMDYwMDAgfCAoZm4gJiAweDNmZik7CS8qIGptcCAgICVnMSslbG8oZm4pCSovCisgIHRyYW1wWzNdID0gMHg4NDEwYTAwMCB8IChjdHggJiAweDNmZik7Lyogb3IgICAgJWcyLCAlbG8oY3R4KQkqLworI2VuZGlmCisKKyAgY2xvc3VyZS0+Y2lmID0gY2lmOworICBjbG9zdXJlLT5mdW4gPSBmdW47CisgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKworICAvKiBGbHVzaCB0aGUgSWNhY2hlLiAgY2xvc3VyZSBpcyA4IGJ5dGVzIGFsaWduZWQuICAqLworI2lmZGVmIFNQQVJDNjQKKyAgYXNtIHZvbGF0aWxlICgiZmx1c2gJJTA7IGZsdXNoICUwKzgiIDogOiAiciIgKGNsb3N1cmUpIDogIm1lbW9yeSIpOworI2Vsc2UKKyAgYXNtIHZvbGF0aWxlICgiaWZsdXNoCSUwOyBpZmx1c2ggJTArOCIgOiA6ICJyIiAoY2xvc3VyZSkgOiAibWVtb3J5Iik7CisgIC8qIFNQQVJDIHY4IHJlcXVpcmVzIDUgaW5zdHJ1Y3Rpb25zIGZvciBmbHVzaCB0byBiZSB2aXNpYmxlICovCisgIGFzbSB2b2xhdGlsZSAoIm5vcDsgbm9wOyBub3A7IG5vcDsgbm9wIik7CisjZW5kaWYKKworICByZXR1cm4gRkZJX09LOworfQorCitpbnQKK2ZmaV9jbG9zdXJlX3NwYXJjX2lubmVyX3Y4KGZmaV9jbG9zdXJlICpjbG9zdXJlLAorICB2b2lkICpydmFsdWUsIHVuc2lnbmVkIGxvbmcgKmdwciwgdW5zaWduZWQgbG9uZyAqc2NyYXRjaCkKK3sKKyAgZmZpX2NpZiAqY2lmOworICBmZmlfdHlwZSAqKmFyZ190eXBlczsKKyAgdm9pZCAqKmF2YWx1ZTsKKyAgaW50IGksIGFyZ247CisKKyAgY2lmID0gY2xvc3VyZS0+Y2lmOworICBhcmdfdHlwZXMgPSBjaWYtPmFyZ190eXBlczsKKyAgYXZhbHVlID0gYWxsb2NhKGNpZi0+bmFyZ3MgKiBzaXplb2Yodm9pZCAqKSk7CisKKyAgLyogQ29weSB0aGUgY2FsbGVyJ3Mgc3RydWN0dXJlIHJldHVybiBhZGRyZXNzIHNvIHRoYXQgdGhlIGNsb3N1cmUKKyAgICAgcmV0dXJucyB0aGUgZGF0YSBkaXJlY3RseSB0byB0aGUgY2FsbGVyLiAgKi8KKyAgaWYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUgIAorICAgICAgfHwgY2lmLT5mbGFncyA9PSBGRklfVFlQRV9MT05HRE9VQkxFCisjZW5kaWYKKyAgICAgKQorICAgIHJ2YWx1ZSA9ICh2b2lkICopIGdwclswXTsKKworICAvKiBBbHdheXMgc2tpcCB0aGUgc3RydWN0dXJlIHJldHVybiBhZGRyZXNzLiAgKi8KKyAgYXJnbiA9IDE7CisKKyAgLyogR3JhYiB0aGUgYWRkcmVzc2VzIG9mIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2sgZnJhbWUuICAqLworICBmb3IgKGkgPSAwOyBpIDwgY2lmLT5uYXJnczsgaSsrKQorICAgIHsKKyAgICAgIGlmIChhcmdfdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwkgIHx8IGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFCisjZW5kaWYKKyAgICAgICAgICkKKwl7CisJICAvKiBTdHJhaWdodCBjb3B5IG9mIGludmlzaWJsZSByZWZlcmVuY2UuICAqLworCSAgYXZhbHVlW2ldID0gKHZvaWQgKilncHJbYXJnbisrXTsKKwl9CisgICAgICBlbHNlIGlmICgoYXJnX3R5cGVzW2ldLT50eXBlID09IEZGSV9UWVBFX0RPVUJMRQorCSAgICAgICB8fCBhcmdfdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfU0lOVDY0CisJICAgICAgIHx8IGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9VSU5UNjQpCisJICAgICAgIC8qIGdwciBpcyA4LWJ5dGUgYWxpZ25lZC4gICovCisJICAgICAgICYmIChhcmduICUgMikgIT0gMCkKKwl7CisJICAvKiBBbGlnbiBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gICovCisJICBzY3JhdGNoWzBdID0gZ3ByW2FyZ25dOworCSAgc2NyYXRjaFsxXSA9IGdwclthcmduKzFdOworCSAgYXZhbHVlW2ldID0gc2NyYXRjaDsKKwkgIHNjcmF0Y2ggLT0gMjsKKwkgIGFyZ24gKz0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogQWx3YXlzIHJpZ2h0LWp1c3RpZnkuICAqLworCSAgYXJnbiArPSBBTElHTihhcmdfdHlwZXNbaV0tPnNpemUsIEZGSV9TSVpFT0ZfQVJHKSAvIEZGSV9TSVpFT0ZfQVJHOworCSAgYXZhbHVlW2ldID0gKChjaGFyICopICZncHJbYXJnbl0pIC0gYXJnX3R5cGVzW2ldLT5zaXplOworCX0KKyAgICB9CisKKyAgLyogSW52b2tlIHRoZSBjbG9zdXJlLiAgKi8KKyAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgcnZhbHVlLCBhdmFsdWUsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgLyogVGVsbCBmZmlfY2xvc3VyZV9zcGFyYyBob3cgdG8gcGVyZm9ybSByZXR1cm4gdHlwZSBwcm9tb3Rpb25zLiAgKi8KKyAgcmV0dXJuIGNpZi0+cnR5cGUtPnR5cGU7Cit9CisKK2ludAorZmZpX2Nsb3N1cmVfc3BhcmNfaW5uZXJfdjkoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsCisgIHZvaWQgKnJ2YWx1ZSwgdW5zaWduZWQgbG9uZyAqZ3ByLCBkb3VibGUgKmZwcikKK3sKKyAgZmZpX2NpZiAqY2lmOworICBmZmlfdHlwZSAqKmFyZ190eXBlczsKKyAgdm9pZCAqKmF2YWx1ZTsKKyAgaW50IGksIGFyZ24sIGZwX3Nsb3RfbWF4OworCisgIGNpZiA9IGNsb3N1cmUtPmNpZjsKKyAgYXJnX3R5cGVzID0gY2lmLT5hcmdfdHlwZXM7CisgIGF2YWx1ZSA9IGFsbG9jYShjaWYtPm5hcmdzICogc2l6ZW9mKHZvaWQgKikpOworCisgIC8qIENvcHkgdGhlIGNhbGxlcidzIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcyBzbyB0aGF0IHRoZSBjbG9zdXJlCisgICAgIHJldHVybnMgdGhlIGRhdGEgZGlyZWN0bHkgdG8gdGhlIGNhbGxlci4gICovCisgIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1ZPSUQKKyAgICAgICYmIGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKQorICAgIHsKKyAgICAgIHJ2YWx1ZSA9ICh2b2lkICopIGdwclswXTsKKyAgICAgIC8qIFNraXAgdGhlIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcy4gICovCisgICAgICBhcmduID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICBhcmduID0gMDsKKworICBmcF9zbG90X21heCA9IDE2IC0gYXJnbjsKKworICAvKiBHcmFiIHRoZSBhZGRyZXNzZXMgb2YgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBzdGFjayBmcmFtZS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBjaWYtPm5hcmdzOyBpKyspCisgICAgeworICAgICAgaWYgKGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpCisJeworCSAgaWYgKGFyZ190eXBlc1tpXS0+c2l6ZSA+IDE2KQorCSAgICB7CisJICAgICAgLyogU3RyYWlnaHQgY29weSBvZiBpbnZpc2libGUgcmVmZXJlbmNlLiAgKi8KKwkgICAgICBhdmFsdWVbaV0gPSAodm9pZCAqKWdwclthcmduKytdOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBMZWZ0LWp1c3RpZnkuICAqLworCSAgICAgIGZmaV92OV9sYXlvdXRfc3RydWN0KGFyZ190eXBlc1tpXSwKKwkJCQkgICAwLAorCQkJCSAgIChjaGFyICopICZncHJbYXJnbl0sCisJCQkJICAgKGNoYXIgKikgJmdwclthcmduXSwKKwkJCQkgICAoY2hhciAqKSAmZnByW2FyZ25dKTsKKwkgICAgICBhdmFsdWVbaV0gPSAmZ3ByW2FyZ25dOworCSAgICAgIGFyZ24gKz0gQUxJR04oYXJnX3R5cGVzW2ldLT5zaXplLCBGRklfU0laRU9GX0FSRykgLyBGRklfU0laRU9GX0FSRzsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBSaWdodC1qdXN0aWZ5LiAgKi8KKwkgIGFyZ24gKz0gQUxJR04oYXJnX3R5cGVzW2ldLT5zaXplLCBGRklfU0laRU9GX0FSRykgLyBGRklfU0laRU9GX0FSRzsKKworCSAgLyogQWxpZ24gb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgKi8KKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCSAgaWYgKGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFICYmIChhcmduICUgMikgIT0gMCkKKwkgICAgYXJnbisrOworI2VuZGlmCisJICBpZiAoaSA8IGZwX3Nsb3RfbWF4CisJICAgICAgJiYgKGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9GTE9BVAorCQkgIHx8IGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCQkgIHx8IGFyZ190eXBlc1tpXS0+dHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFCisjZW5kaWYKKwkJICApKQorCSAgICBhdmFsdWVbaV0gPSAoKGNoYXIgKikgJmZwclthcmduXSkgLSBhcmdfdHlwZXNbaV0tPnNpemU7CisJICBlbHNlCisJICAgIGF2YWx1ZVtpXSA9ICgoY2hhciAqKSAmZ3ByW2FyZ25dKSAtIGFyZ190eXBlc1tpXS0+c2l6ZTsKKwl9CisgICAgfQorCisgIC8qIEludm9rZSB0aGUgY2xvc3VyZS4gICovCisgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIC8qIFRlbGwgZmZpX2Nsb3N1cmVfc3BhcmMgaG93IHRvIHBlcmZvcm0gcmV0dXJuIHR5cGUgcHJvbW90aW9ucy4gICovCisgIHJldHVybiBjaWYtPnJ0eXBlLT50eXBlOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zcGFyYy9mZml0YXJnZXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc3BhcmMvZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyNzVjYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc3BhcmMvZmZpdGFyZ2V0LmgKQEAgLTAsMCArMSw2OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMgIFJlZCBIYXQsIEluYy4KKyAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgU1BBUkMuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKKyNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICisKKy8qIC0tLS0gU3lzdGVtIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKF9fYXJjaDY0X18pIHx8IGRlZmluZWQoX19zcGFyY3Y5KQorI2lmbmRlZiBTUEFSQzY0CisjZGVmaW5lIFNQQVJDNjQKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTElCRkZJX0FTTQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7Cit0eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7CisKK3R5cGVkZWYgZW51bSBmZmlfYWJpIHsKKyAgRkZJX0ZJUlNUX0FCSSA9IDAsCisgIEZGSV9WOCwKKyAgRkZJX1Y4UExVUywKKyAgRkZJX1Y5LAorICBGRklfTEFTVF9BQkksCisjaWZkZWYgU1BBUkM2NAorICBGRklfREVGQVVMVF9BQkkgPSBGRklfVjkKKyNlbHNlCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9WOAorI2VuZGlmCit9IGZmaV9hYmk7CisjZW5kaWYKKworLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgY2xvc3VyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGRklfQ0xPU1VSRVMgMQorI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMAorCisjaWZkZWYgU1BBUkM2NAorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDI0CisjZWxzZQorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDE2CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc3BhcmMvdjguUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc3BhcmMvdjguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzRlYjYwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy9zcGFyYy92OC5TCkBAIC0wLDAgKzEsMzEzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgdjguUyAtIENvcHlyaWdodCAoYykgMTk5NiwgMTk5NywgMjAwMywgMjAwNCwgMjAwOCBSZWQgSGF0LCBJbmMuCisgICAKKyAgIFNQQVJDIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJQkZGSV9BU00JCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKyNkZWZpbmUgU1RBQ0tGUkFNRSA5NgkJLyogTWluaW11bSBzdGFjayBmcmFtZXNpemUgZm9yIFNQQVJDICovCisjZGVmaW5lIEFSR1MgKDY0KzQpCQkvKiBPZmZzZXQgb2YgcmVnaXN0ZXIgYXJlYSBpbiBmcmFtZSAqLworCisudGV4dAorICAgICAgICAuYWxpZ24gOAorLmdsb2JsIGZmaV9jYWxsX3Y4CisuZ2xvYmwgX2ZmaV9jYWxsX3Y4CisKK2ZmaV9jYWxsX3Y4OgorX2ZmaV9jYWxsX3Y4OgorLkxMRkIxOgorCXNhdmUJJXNwLCAtU1RBQ0tGUkFNRSwgJXNwCisuTExDRkkwOgorCQorCXN1Ygklc3AsICVpMiwgJXNwCSEgYWxsb2NhKCkgc3BhY2UgaW4gc3RhY2sgZm9yIGZyYW1lIHRvIHNldCB1cAorCWFkZAklc3AsIFNUQUNLRlJBTUUsICVsMAkhICVsMCBoYXMgc3RhcnQgb2YgCisJCQkJCSEgZnJhbWUgdG8gc2V0IHVwCisKKwltb3YJJWwwLCAlbzAJISBjYWxsIHJvdXRpbmUgdG8gc2V0IHVwIGZyYW1lCisJY2FsbAklaTAKKwltb3YJJWkxLCAlbzEJISAoZGVsYXkpCisKKwlsZAlbJWwwK0FSR1NdLCAlbzAJISBjYWxsIGZvcmVpZ24gZnVuY3Rpb24KKwlsZAlbJWwwK0FSR1MrNF0sICVvMQorCWxkCVslbDArQVJHUys4XSwgJW8yCisJbGQJWyVsMCtBUkdTKzEyXSwgJW8zCisJbGQJWyVsMCtBUkdTKzE2XSwgJW80CisJbGQJWyVsMCtBUkdTKzIwXSwgJW81CisJY2FsbAklaTUKKwltb3YJJWwwLCAlc3AJISAoZGVsYXkpIHN3aXRjaCB0byBmcmFtZQorCW5vcAkJCSEgU1RSVUNUIHJldHVybmluZyBmdW5jdGlvbnMgc2tpcCAxMiBpbnN0ZWFkIG9mIDggYnl0ZXMKKworCSEgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCisJdHN0CSVpNAorCWJ6CWRvbmUKKwlub3AKKworCWNtcAklaTMsIEZGSV9UWVBFX0lOVAorCWJlLGEJZG9uZQorCXN0CSVvMCwgWyVpNF0JISAoZGVsYXkpCisKKwljbXAJJWkzLCBGRklfVFlQRV9GTE9BVAorCWJlLGEJZG9uZQorCXN0CSVmMCwgWyVpNCswXQkhIChkZWxheSkKKworCWNtcAklaTMsIEZGSV9UWVBFX0RPVUJMRQorCWJlLGEJZG91YmxlCisJc3QJJWYwLCBbJWk0KzBdCSEgKGRlbGF5KQorCisJY21wCSVpMywgRkZJX1RZUEVfU0lOVDgKKwliZSxhCXNpbnQ4CisJc2xsCSVvMCwgMjQsICVvMAkhIChkZWxheSkKKworCWNtcAklaTMsIEZGSV9UWVBFX1VJTlQ4CisJYmUsYQl1aW50OAorCXNsbAklbzAsIDI0LCAlbzAJISAoZGVsYXkpCisKKwljbXAJJWkzLCBGRklfVFlQRV9TSU5UMTYKKwliZSxhCXNpbnQxNgorCXNsbAklbzAsIDE2LCAlbzAJISAoZGVsYXkpCisKKwljbXAJJWkzLCBGRklfVFlQRV9VSU5UMTYKKwliZSxhCXVpbnQxNgorCXNsbAklbzAsIDE2LCAlbzAJISAoZGVsYXkpCisKKwljbXAJJWkzLCBGRklfVFlQRV9TSU5UNjQKKwliZSxhCWxvbmdsb25nCisJc3QJJW8wLCBbJWk0KzBdCSEgKGRlbGF5KQorZG9uZToKKwlyZXQKKwlyZXN0b3JlCisKK2RvdWJsZToKKwlzdAklZjEsIFslaTQrNF0KKwlyZXQKKwlyZXN0b3JlCisKK3NpbnQ4OgorCXNyYQklbzAsIDI0LCAlbzAKKwlzdAklbzAsIFslaTQrMF0KKwlyZXQKKwlyZXN0b3JlCisKK3VpbnQ4OgorCXNybAklbzAsIDI0LCAlbzAKKwlzdAklbzAsIFslaTQrMF0KKwlyZXQKKwlyZXN0b3JlCisKK3NpbnQxNjoKKwlzcmEJJW8wLCAxNiwgJW8wCisJc3QJJW8wLCBbJWk0KzBdCisJcmV0CisJcmVzdG9yZQorCit1aW50MTY6CisJc3JsCSVvMCwgMTYsICVvMAorCXN0CSVvMCwgWyVpNCswXQorCXJldAorCXJlc3RvcmUKKworbG9uZ2xvbmc6CisJc3QJJW8xLCBbJWk0KzRdCisJcmV0CisJcmVzdG9yZQorLkxMRkUxOgorCisuZmZpX2NhbGxfdjhfZW5kOgorCS5zaXplCWZmaV9jYWxsX3Y4LC5mZmlfY2FsbF92OF9lbmQtZmZpX2NhbGxfdjgKKworCisjdW5kZWYgU1RBQ0tGUkFNRQorI2RlZmluZQlTVEFDS0ZSQU1FCTEwNAkvKiAxNio0IHJlZ2lzdGVyIHdpbmRvdyArCisJCQkJICAgMSo0IHN0cnVjdCByZXR1cm4gKwkKKwkJCQkgICA2KjQgYXJncyBiYWNraW5nIHN0b3JlICsKKwkJCQkgICAzKjQgbG9jYWxzICovCisKKy8qIGZmaV9jbG9zdXJlX3Y4KC4uLikKKworICAgUmVjZWl2ZXMgdGhlIGNsb3N1cmUgYXJndW1lbnQgaW4gJWcyLiAgICovCisKKwkudGV4dAorCS5hbGlnbiA4CisJLmdsb2JsIGZmaV9jbG9zdXJlX3Y4CisKK2ZmaV9jbG9zdXJlX3Y4OgorI2lmZGVmIEhBVkVfQVNfUkVHSVNURVJfUFNFVURPX09QCisJCS5yZWdpc3RlcgklZzIsICNzY3JhdGNoCisjZW5kaWYKKy5MTEZCMjoKKwkhIFJlc2VydmUgZnJhbWUgc3BhY2UgZm9yIGFsbCBhcmd1bWVudHMgaW4gY2FzZQorCSEgd2UgbmVlZCB0byBhbGlnbiB0aGVtIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LgorCWxkCVslZzIrRkZJX1RSQU1QT0xJTkVfU0laRV0sICVnMQorCWxkCVslZzErNF0sICVnMQorCXNsbAklZzEsIDMsICVnMQorCWFkZAklZzEsIFNUQUNLRlJBTUUsICVnMQorCSEgJWcxID09IFNUQUNLRlJBTUUgKyA4Km5hcmdzCisJbmVnCSVnMQorCXNhdmUJJXNwLCAlZzEsICVzcAorLkxMQ0ZJMToKKworCSEgU3RvcmUgYWxsIG9mIHRoZSBwb3RlbnRpYWwgYXJndW1lbnQgcmVnaXN0ZXJzIGluIHZhX2xpc3QgZm9ybWF0LgorCXN0CSVpMCwgWyVmcCs2OCswXQorCXN0CSVpMSwgWyVmcCs2OCs0XQorCXN0CSVpMiwgWyVmcCs2OCs4XQorCXN0CSVpMywgWyVmcCs2OCsxMl0KKwlzdAklaTQsIFslZnArNjgrMTZdCisJc3QJJWk1LCBbJWZwKzY4KzIwXQorCisJISBDYWxsIGZmaV9jbG9zdXJlX3NwYXJjX2lubmVyIHRvIGRvIHRoZSBidWxrIG9mIHRoZSB3b3JrLgorCW1vdgklZzIsICVvMAorCWFkZAklZnAsIC04LCAlbzEKKwlhZGQJJWZwLCAgNjQsICVvMgorCWNhbGwJZmZpX2Nsb3N1cmVfc3BhcmNfaW5uZXJfdjgKKwkgYWRkCSVmcCwgLTE2LCAlbzMKKworCSEgTG9hZCB1cCB0aGUgcmV0dXJuIHZhbHVlIGluIHRoZSBwcm9wZXIgdHlwZS4KKwkhIFNlZSBmZmlfcHJlcF9jaWZfbWFjaGRlcCBmb3IgdGhlIGxpc3Qgb2YgY2FzZXMuCisJY21wCSVvMCwgRkZJX1RZUEVfVk9JRAorCWJlCWRvbmUxCisKKwljbXAJJW8wLCBGRklfVFlQRV9JTlQKKwliZQlkb25lMQorCSBsZAlbJWZwLThdLCAlaTAKKworCWNtcAklbzAsIEZGSV9UWVBFX0ZMT0FUCisJYmUsYQlkb25lMQorCSBsZAlbJWZwLThdLCAlZjAKKworCWNtcAklbzAsIEZGSV9UWVBFX0RPVUJMRQorCWJlLGEJZG9uZTEKKwkgbGRkCVslZnAtOF0sICVmMAorCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKKwljbXAJJW8wLCBGRklfVFlQRV9MT05HRE9VQkxFCisJYmUJZG9uZTIKKyNlbmRpZgorCisJY21wCSVvMCwgRkZJX1RZUEVfU1RSVUNUCisJYmUJZG9uZTIKKworCWNtcAklbzAsIEZGSV9UWVBFX1NJTlQ2NAorCWJlLGEJZG9uZTEKKwkgbGRkCVslZnAtOF0sICVpMAorCisJbGQJWyVmcC04XSwgJWkwCitkb25lMToKKwlqbXAJJWk3KzgKKwkgcmVzdG9yZQorZG9uZTI6CisJISBTa2lwICd1bmltcCcuCisJam1wCSVpNysxMgorCSByZXN0b3JlCisuTExGRTI6CisKKy5mZmlfY2xvc3VyZV92OF9lbmQ6CisJLnNpemUJZmZpX2Nsb3N1cmVfdjgsLmZmaV9jbG9zdXJlX3Y4X2VuZC1mZmlfY2xvc3VyZV92OAorCisjaWZkZWYgU1BBUkM2NAorI2RlZmluZSBXUyA4CisjZGVmaW5lIG53b3JkCXh3b3JkCisjZGVmaW5lIHVhbndvcmQJdWF4d29yZAorI2Vsc2UKKyNkZWZpbmUgV1MgNAorI2RlZmluZSBud29yZAlsb25nCisjZGVmaW5lIHVhbndvcmQJdWF3b3JkCisjZW5kaWYKKworI2lmZGVmIEhBVkVfUk9fRUhfRlJBTUUKKwkuc2VjdGlvbgkiLmVoX2ZyYW1lIiwjYWxsb2MKKyNlbHNlCisJLnNlY3Rpb24JIi5laF9mcmFtZSIsI2FsbG9jLCN3cml0ZQorI2VuZGlmCisuTExmcmFtZTE6CisJLnVhd29yZAkuTExFQ0lFMS0uTExTQ0lFMQkhIExlbmd0aCBvZiBDb21tb24gSW5mb3JtYXRpb24gRW50cnkKKy5MTFNDSUUxOgorCS51YXdvcmQJMHgwCSEgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCSEgQ0lFIFZlcnNpb24KKwkuYXNjaWkgInpSXDAiCSEgQ0lFIEF1Z21lbnRhdGlvbgorCS5ieXRlCTB4MQkhIHVsZWIxMjggMHgxOyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJMHg4MC1XUwkhIHNsZWIxMjggLVdTOyBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJMHhmCSEgQ0lFIFJBIENvbHVtbgorCS5ieXRlCTB4MQkhIHVsZWIxMjggMHgxOyBBdWdtZW50YXRpb24gc2l6ZQorI2lmZGVmIEhBVkVfQVNfU1BBUkNfVUFfUENSRUwKKwkuYnl0ZQkweDFiCSEgRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpCisjZWxzZQorCS5ieXRlCTB4NTAJISBGREUgRW5jb2RpbmcgKGFsaWduZWQgYWJzb2x1dGUpCisjZW5kaWYKKwkuYnl0ZQkweGMJISBEV19DRkFfZGVmX2NmYQorCS5ieXRlCTB4ZQkhIHVsZWIxMjggMHhlCisJLmJ5dGUJMHgwCSEgdWxlYjEyOCAweDAKKwkuYWxpZ24JV1MKKy5MTEVDSUUxOgorLkxMU0ZERTE6CisJLnVhd29yZAkuTExFRkRFMS0uTExBU0ZERTEJISBGREUgTGVuZ3RoCisuTExBU0ZERTE6CisJLnVhd29yZAkuTExBU0ZERTEtLkxMZnJhbWUxCSEgRkRFIENJRSBvZmZzZXQKKyNpZmRlZiBIQVZFX0FTX1NQQVJDX1VBX1BDUkVMCisJLnVhd29yZAklcl9kaXNwMzIoLkxMRkIxKQorCS51YXdvcmQJLkxMRkUxLS5MTEZCMQkhIEZERSBhZGRyZXNzIHJhbmdlCisjZWxzZQorCS5hbGlnbglXUworCS5ud29yZAkuTExGQjEKKwkudWFud29yZCAuTExGRTEtLkxMRkIxCSEgRkRFIGFkZHJlc3MgcmFuZ2UKKyNlbmRpZgorCS5ieXRlCTB4MAkhIHVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZQorCS5ieXRlCTB4NAkhIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkudWF3b3JkCS5MTENGSTAtLkxMRkIxCisJLmJ5dGUJMHhkCSEgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIKKwkuYnl0ZQkweDFlCSEgdWxlYjEyOCAweDFlCisJLmJ5dGUJMHgyZAkhIERXX0NGQV9HTlVfd2luZG93X3NhdmUKKwkuYnl0ZQkweDkJISBEV19DRkFfcmVnaXN0ZXIKKwkuYnl0ZQkweGYJISB1bGViMTI4IDB4ZgorCS5ieXRlCTB4MWYJISB1bGViMTI4IDB4MWYKKwkuYWxpZ24JV1MKKy5MTEVGREUxOgorLkxMU0ZERTI6CisJLnVhd29yZAkuTExFRkRFMi0uTExBU0ZERTIJISBGREUgTGVuZ3RoCisuTExBU0ZERTI6CisJLnVhd29yZAkuTExBU0ZERTItLkxMZnJhbWUxCSEgRkRFIENJRSBvZmZzZXQKKyNpZmRlZiBIQVZFX0FTX1NQQVJDX1VBX1BDUkVMCisJLnVhd29yZAklcl9kaXNwMzIoLkxMRkIyKQorCS51YXdvcmQJLkxMRkUyLS5MTEZCMgkhIEZERSBhZGRyZXNzIHJhbmdlCisjZWxzZQorCS5hbGlnbglXUworCS5ud29yZAkuTExGQjIKKwkudWFud29yZCAuTExGRTItLkxMRkIyCSEgRkRFIGFkZHJlc3MgcmFuZ2UKKyNlbmRpZgorCS5ieXRlCTB4MAkhIHVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZQorCS5ieXRlCTB4NAkhIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkudWF3b3JkCS5MTENGSTEtLkxMRkIyCisJLmJ5dGUJMHhkCSEgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIKKwkuYnl0ZQkweDFlCSEgdWxlYjEyOCAweDFlCisJLmJ5dGUJMHgyZAkhIERXX0NGQV9HTlVfd2luZG93X3NhdmUKKwkuYnl0ZQkweDkJISBEV19DRkFfcmVnaXN0ZXIKKwkuYnl0ZQkweGYJISB1bGViMTI4IDB4ZgorCS5ieXRlCTB4MWYJISB1bGViMTI4IDB4MWYKKwkuYWxpZ24JV1MKKy5MTEVGREUyOgorCisjaWYgZGVmaW5lZCBfX0VMRl9fICYmIGRlZmluZWQgX19saW51eF9fCisJLnNlY3Rpb24JLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NwYXJjL3Y5LlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3NwYXJjL3Y5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5ZmYwMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvc3BhcmMvdjkuUwpAQCAtMCwwICsxLDMwNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHY5LlMgLSBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDggUmVkIEhhdCwgSW5jLgorICAgCisgICBTUEFSQyA2NC1iaXQgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTElCRkZJX0FTTQkKKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworI2lmZGVmIFNQQVJDNjQKKy8qIE9ubHkgY29tcGlsZSB0aGlzIGluIGZvciA2NGJpdCBidWlsZHMsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBvYmplY3QgZmlsZQorICAgd2lsbCBoYXZlIGlucHJvcGVyIGFyY2hpdGVjdHVyZSBkdWUgdG8gdXNlZCBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lIFNUQUNLRlJBTUUgMTI4CQkvKiBNaW5pbXVtIHN0YWNrIGZyYW1lc2l6ZSBmb3IgU1BBUkMgKi8KKyNkZWZpbmUgU1RBQ0tfQklBUyAyMDQ3CisjZGVmaW5lIEFSR1MgKDEyOCkJCS8qIE9mZnNldCBvZiByZWdpc3RlciBhcmVhIGluIGZyYW1lICovCisKKy50ZXh0CisgICAgICAgIC5hbGlnbiA4CisuZ2xvYmwgZmZpX2NhbGxfdjkKKy5nbG9ibCBfZmZpX2NhbGxfdjkKKworZmZpX2NhbGxfdjk6CitfZmZpX2NhbGxfdjk6CisuTExGQjE6CisJc2F2ZQklc3AsIC1TVEFDS0ZSQU1FLCAlc3AKKy5MTENGSTA6CisJCisJc3ViCSVzcCwgJWkyLCAlc3AJISBhbGxvY2EoKSBzcGFjZSBpbiBzdGFjayBmb3IgZnJhbWUgdG8gc2V0IHVwCisJYWRkCSVzcCwgU1RBQ0tGUkFNRStTVEFDS19CSUFTLCAlbDAJISAlbDAgaGFzIHN0YXJ0IG9mIAorCQkJCQkJISBmcmFtZSB0byBzZXQgdXAKKworCW1vdgklbDAsICVvMAkhIGNhbGwgcm91dGluZSB0byBzZXQgdXAgZnJhbWUKKwljYWxsCSVpMAorCSBtb3YJJWkxLCAlbzEJISAoZGVsYXkpCisJYnJ6LHB0CSVvMCwgMWYKKwkgbGR4CVslbDArQVJHU10sICVvMAkhIGNhbGwgZm9yZWlnbiBmdW5jdGlvbgorCisJbGRkCVslbDArQVJHU10sICVmMAorCWxkZAlbJWwwK0FSR1MrOF0sICVmMgorCWxkZAlbJWwwK0FSR1MrMTZdLCAlZjQKKwlsZGQJWyVsMCtBUkdTKzI0XSwgJWY2CisJbGRkCVslbDArQVJHUyszMl0sICVmOAorCWxkZAlbJWwwK0FSR1MrNDBdLCAlZjEwCisJbGRkCVslbDArQVJHUys0OF0sICVmMTIKKwlsZGQJWyVsMCtBUkdTKzU2XSwgJWYxNAorCWxkZAlbJWwwK0FSR1MrNjRdLCAlZjE2CisJbGRkCVslbDArQVJHUys3Ml0sICVmMTgKKwlsZGQJWyVsMCtBUkdTKzgwXSwgJWYyMAorCWxkZAlbJWwwK0FSR1MrODhdLCAlZjIyCisJbGRkCVslbDArQVJHUys5Nl0sICVmMjQKKwlsZGQJWyVsMCtBUkdTKzEwNF0sICVmMjYKKwlsZGQJWyVsMCtBUkdTKzExMl0sICVmMjgKKwlsZGQJWyVsMCtBUkdTKzEyMF0sICVmMzAKKworMToJbGR4CVslbDArQVJHUys4XSwgJW8xCisJbGR4CVslbDArQVJHUysxNl0sICVvMgorCWxkeAlbJWwwK0FSR1MrMjRdLCAlbzMKKwlsZHgJWyVsMCtBUkdTKzMyXSwgJW80CisJbGR4CVslbDArQVJHUys0MF0sICVvNQorCWNhbGwJJWk1CisJIHN1YgklbDAsIFNUQUNLX0JJQVMsICVzcAkhIChkZWxheSkgc3dpdGNoIHRvIGZyYW1lCisKKwkhIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgorCWJyeixwbgklaTQsIGRvbmUKKwkgbm9wCisKKwljbXAJJWkzLCBGRklfVFlQRV9JTlQKKwliZSxhLHB0CSVpY2MsIGRvbmUKKwkgc3R4CSVvMCwgWyVpNCswXQkhIChkZWxheSkKKworCWNtcAklaTMsIEZGSV9UWVBFX0ZMT0FUCisJYmUsYSxwbgklaWNjLCBkb25lCisJIHN0CSVmMCwgWyVpNCswXQkhIChkZWxheSkKKworCWNtcAklaTMsIEZGSV9UWVBFX0RPVUJMRQorCWJlLGEscG4JJWljYywgZG9uZQorCSBzdGQJJWYwLCBbJWk0KzBdCSEgKGRlbGF5KQorCisJY21wCSVpMywgRkZJX1RZUEVfU1RSVUNUCisJYmUscG4JJWljYywgZG9zdHJ1Y3QKKworCWNtcAklaTMsIEZGSV9UWVBFX0xPTkdET1VCTEUKKwlibmUscHQJJWljYywgZG9uZQorCSBub3AKKwlzdGQJJWYwLCBbJWk0KzBdCisJc3RkCSVmMiwgWyVpNCs4XQorCitkb25lOglyZXQKKwkgcmVzdG9yZQorCitkb3N0cnVjdDoKKwkvKiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciB1bmlvbnMuICovCisJc3R4CSVvMCwgWyVpNCswXQorCXN0eAklbzEsIFslaTQrOF0KKwlzdHgJJW8yLCBbJWk0KzE2XQorCXN0eAklbzMsIFslaTQrMjRdCisJc3RkCSVmMCwgWyVpNCszMl0KKwlzdGQJJWYyLCBbJWk0KzQwXQorCXN0ZAklZjQsIFslaTQrNDhdCisJc3RkCSVmNiwgWyVpNCs1Nl0KKwlyZXQKKwkgcmVzdG9yZQorLkxMRkUxOgorCisuZmZpX2NhbGxfdjlfZW5kOgorCS5zaXplCWZmaV9jYWxsX3Y5LC5mZmlfY2FsbF92OV9lbmQtZmZpX2NhbGxfdjkKKworCisjdW5kZWYgU1RBQ0tGUkFNRQorI2RlZmluZQlTVEFDS0ZSQU1FCSAzMzYJLyogMTYqOCByZWdpc3RlciB3aW5kb3cgKworCQkJCSAgIDYqOCBhcmdzIGJhY2tpbmcgc3RvcmUgKworCQkJCSAgIDIwKjggbG9jYWxzICovCisjZGVmaW5lCUZQCQklZnArU1RBQ0tfQklBUworCisvKiBmZmlfY2xvc3VyZV92OSguLi4pCisKKyAgIFJlY2VpdmVzIHRoZSBjbG9zdXJlIGFyZ3VtZW50IGluICVnMS4gICAqLworCisJLnRleHQKKwkuYWxpZ24gOAorCS5nbG9ibCBmZmlfY2xvc3VyZV92OQorCitmZmlfY2xvc3VyZV92OToKKy5MTEZCMjoKKwlzYXZlCSVzcCwgLVNUQUNLRlJBTUUsICVzcAorLkxMQ0ZJMToKKworCSEgU3RvcmUgYWxsIG9mIHRoZSBwb3RlbnRpYWwgYXJndW1lbnQgcmVnaXN0ZXJzIGluIHZhX2xpc3QgZm9ybWF0LgorCXN0eAklaTAsIFtGUCsxMjgrMF0KKwlzdHgJJWkxLCBbRlArMTI4KzhdCisJc3R4CSVpMiwgW0ZQKzEyOCsxNl0KKwlzdHgJJWkzLCBbRlArMTI4KzI0XQorCXN0eAklaTQsIFtGUCsxMjgrMzJdCisJc3R4CSVpNSwgW0ZQKzEyOCs0MF0KKworCSEgU3RvcmUgcG9zc2libGUgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnQgcmVnaXN0ZXJzIHRvby4KKwlzdGQJJWYwLCAgW0ZQLTEyOF0KKwlzdGQJJWYyLCAgW0ZQLTEyMF0KKwlzdGQJJWY0LCAgW0ZQLTExMl0KKwlzdGQJJWY2LCAgW0ZQLTEwNF0KKwlzdGQJJWY4LCAgW0ZQLTk2XQorCXN0ZAklZjEwLCBbRlAtODhdCisJc3RkICAgICAlZjEyLCBbRlAtODBdCisJc3RkICAgICAlZjE0LCBbRlAtNzJdCisJc3RkICAgICAlZjE2LCBbRlAtNjRdCisJc3RkICAgICAlZjE4LCBbRlAtNTZdCisJc3RkICAgICAlZjIwLCBbRlAtNDhdCisJc3RkICAgICAlZjIyLCBbRlAtNDBdCisJc3RkICAgICAlZjI0LCBbRlAtMzJdCisJc3RkICAgICAlZjI2LCBbRlAtMjRdCisJc3RkICAgICAlZjI4LCBbRlAtMTZdCisJc3RkICAgICAlZjMwLCBbRlAtOF0KKworCSEgQ2FsbCBmZmlfY2xvc3VyZV9zcGFyY19pbm5lciB0byBkbyB0aGUgYnVsayBvZiB0aGUgd29yay4KKwltb3YJJWcxLCAlbzAKKwlhZGQJJWZwLCBTVEFDS19CSUFTLTE2MCwgJW8xCisJYWRkCSVmcCwgU1RBQ0tfQklBUysxMjgsICVvMgorCWNhbGwJZmZpX2Nsb3N1cmVfc3BhcmNfaW5uZXJfdjkKKwkgYWRkCSVmcCwgU1RBQ0tfQklBUy0xMjgsICVvMworCisJISBMb2FkIHVwIHRoZSByZXR1cm4gdmFsdWUgaW4gdGhlIHByb3BlciB0eXBlLgorCSEgU2VlIGZmaV9wcmVwX2NpZl9tYWNoZGVwIGZvciB0aGUgbGlzdCBvZiBjYXNlcy4KKwljbXAJJW8wLCBGRklfVFlQRV9WT0lECisJYmUscG4JJWljYywgZG9uZTEKKworCWNtcAklbzAsIEZGSV9UWVBFX0lOVAorCWJlLHBuCSVpY2MsIGludGVnZXIKKworCWNtcAklbzAsIEZGSV9UWVBFX0ZMT0FUCisJYmUsYSxwbgklaWNjLCBkb25lMQorCSBsZAlbRlAtMTYwXSwgJWYwCisKKwljbXAJJW8wLCBGRklfVFlQRV9ET1VCTEUKKwliZSxhLHBuCSVpY2MsIGRvbmUxCisJIGxkZAlbRlAtMTYwXSwgJWYwCisKKyNpZiBGRklfVFlQRV9MT05HRE9VQkxFICE9IEZGSV9UWVBFX0RPVUJMRQorCWNtcAklbzAsIEZGSV9UWVBFX0xPTkdET1VCTEUKKwliZSxhLHBuCSVpY2MsIGxvbmdkb3VibGUxCisJIGxkZAlbRlAtMTYwXSwgJWYwCisjZW5kaWYKKworCSEgRkZJX1RZUEVfU1RSVUNUCisJbGR4CVtGUC0xNTJdLCAlaTEKKwlsZHgJW0ZQLTE0NF0sICVpMgorCWxkeAlbRlAtMTM2XSwgJWkzCisJbGRkCVtGUC0xNjBdLCAlZjAKKwlsZGQJW0ZQLTE1Ml0sICVmMgorCWxkZAlbRlAtMTQ0XSwgJWY0CisJbGRkCVtGUC0xMzZdLCAlZjYKKworaW50ZWdlcjoKKwlsZHgJW0ZQLTE2MF0sICVpMAorCitkb25lMToKKwlyZXQKKwkgcmVzdG9yZQorCisjaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKK2xvbmdkb3VibGUxOgorCWxkZAlbRlAtMTUyXSwgJWYyCisJcmV0CisJIHJlc3RvcmUKKyNlbmRpZgorLkxMRkUyOgorCisuZmZpX2Nsb3N1cmVfdjlfZW5kOgorCS5zaXplCWZmaV9jbG9zdXJlX3Y5LC5mZmlfY2xvc3VyZV92OV9lbmQtZmZpX2Nsb3N1cmVfdjkKKworI2lmZGVmIEhBVkVfUk9fRUhfRlJBTUUKKwkuc2VjdGlvbgkiLmVoX2ZyYW1lIiwjYWxsb2MKKyNlbHNlCisJLnNlY3Rpb24JIi5laF9mcmFtZSIsI2FsbG9jLCN3cml0ZQorI2VuZGlmCisuTExmcmFtZTE6CisJLnVhd29yZAkuTExFQ0lFMS0uTExTQ0lFMQkhIExlbmd0aCBvZiBDb21tb24gSW5mb3JtYXRpb24gRW50cnkKKy5MTFNDSUUxOgorCS51YXdvcmQJMHgwCSEgQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCSEgQ0lFIFZlcnNpb24KKwkuYXNjaWkgInpSXDAiCSEgQ0lFIEF1Z21lbnRhdGlvbgorCS5ieXRlCTB4MQkhIHVsZWIxMjggMHgxOyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yCisJLmJ5dGUJMHg3OAkhIHNsZWIxMjggLTg7IENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IKKwkuYnl0ZQkweGYJISBDSUUgUkEgQ29sdW1uCisJLmJ5dGUJMHgxCSEgdWxlYjEyOCAweDE7IEF1Z21lbnRhdGlvbiBzaXplCisjaWZkZWYgSEFWRV9BU19TUEFSQ19VQV9QQ1JFTAorCS5ieXRlCTB4MWIJISBGREUgRW5jb2RpbmcgKHBjcmVsIHNkYXRhNCkKKyNlbHNlCisJLmJ5dGUJMHg1MAkhIEZERSBFbmNvZGluZyAoYWxpZ25lZCBhYnNvbHV0ZSkKKyNlbmRpZgorCS5ieXRlCTB4YwkhIERXX0NGQV9kZWZfY2ZhCisJLmJ5dGUJMHhlCSEgdWxlYjEyOCAweGUKKwkuYnl0ZQkweGZmLDB4ZgkhIHVsZWIxMjggMHg3ZmYKKwkuYWxpZ24gOAorLkxMRUNJRTE6CisuTExTRkRFMToKKwkudWF3b3JkCS5MTEVGREUxLS5MTEFTRkRFMQkhIEZERSBMZW5ndGgKKy5MTEFTRkRFMToKKwkudWF3b3JkCS5MTEFTRkRFMS0uTExmcmFtZTEJISBGREUgQ0lFIG9mZnNldAorI2lmZGVmIEhBVkVfQVNfU1BBUkNfVUFfUENSRUwKKwkudWF3b3JkCSVyX2Rpc3AzMiguTExGQjEpCisJLnVhd29yZAkuTExGRTEtLkxMRkIxCQkhIEZERSBhZGRyZXNzIHJhbmdlCisjZWxzZQorCS5hbGlnbiA4CisJLnh3b3JkCS5MTEZCMQorCS51YXh3b3JkCS5MTEZFMS0uTExGQjEJISBGREUgYWRkcmVzcyByYW5nZQorI2VuZGlmCisJLmJ5dGUJMHgwCSEgdWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplCisJLmJ5dGUJMHg0CSEgRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS51YXdvcmQJLkxMQ0ZJMC0uTExGQjEKKwkuYnl0ZQkweGQJISBEV19DRkFfZGVmX2NmYV9yZWdpc3RlcgorCS5ieXRlCTB4MWUJISB1bGViMTI4IDB4MWUKKwkuYnl0ZQkweDJkCSEgRFdfQ0ZBX0dOVV93aW5kb3dfc2F2ZQorCS5ieXRlCTB4OQkhIERXX0NGQV9yZWdpc3RlcgorCS5ieXRlCTB4ZgkhIHVsZWIxMjggMHhmCisJLmJ5dGUJMHgxZgkhIHVsZWIxMjggMHgxZgorCS5hbGlnbiA4CisuTExFRkRFMToKKy5MTFNGREUyOgorCS51YXdvcmQJLkxMRUZERTItLkxMQVNGREUyCSEgRkRFIExlbmd0aAorLkxMQVNGREUyOgorCS51YXdvcmQJLkxMQVNGREUyLS5MTGZyYW1lMQkhIEZERSBDSUUgb2Zmc2V0CisjaWZkZWYgSEFWRV9BU19TUEFSQ19VQV9QQ1JFTAorCS51YXdvcmQJJXJfZGlzcDMyKC5MTEZCMikKKwkudWF3b3JkCS5MTEZFMi0uTExGQjIJCSEgRkRFIGFkZHJlc3MgcmFuZ2UKKyNlbHNlCisJLmFsaWduIDgKKwkueHdvcmQJLkxMRkIyCisJLnVheHdvcmQJLkxMRkUyLS5MTEZCMgkhIEZERSBhZGRyZXNzIHJhbmdlCisjZW5kaWYKKwkuYnl0ZQkweDAJISB1bGViMTI4IDB4MDsgQXVnbWVudGF0aW9uIHNpemUKKwkuYnl0ZQkweDQJISBEV19DRkFfYWR2YW5jZV9sb2M0CisJLnVhd29yZAkuTExDRkkxLS5MTEZCMgorCS5ieXRlCTB4ZAkhIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyCisJLmJ5dGUJMHgxZQkhIHVsZWIxMjggMHgxZQorCS5ieXRlCTB4MmQJISBEV19DRkFfR05VX3dpbmRvd19zYXZlCisJLmJ5dGUJMHg5CSEgRFdfQ0ZBX3JlZ2lzdGVyCisJLmJ5dGUJMHhmCSEgdWxlYjEyOCAweGYKKwkuYnl0ZQkweDFmCSEgdWxlYjEyOCAweDFmCisJLmFsaWduIDgKKy5MTEVGREUyOgorI2VuZGlmCisKKyNpZmRlZiBfX2xpbnV4X18KKwkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvdHlwZXMuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMvdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTExZWIwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy90eXBlcy5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB0eXBlcy5jIC0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4ICBSZWQgSGF0LCBJbmMuCisgICAKKyAgIFByZWRlZmluZWQgZmZpX3R5cGVzIG5lZWRlZCBieSBsaWJmZmkuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEhpZGUgdGhlIGJhc2ljIHR5cGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgaGVhZGVyIGZpbGUsIHNvIHRoYXQgd2UKKyAgIGNhbiByZWRlZmluZSB0aGVtIGhlcmUgYXMgImNvbnN0Ii4gICovCisjZGVmaW5lIExJQkZGSV9ISURFX0JBU0lDX1RZUEVTCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKy8qIFR5cGUgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBGRklfVFlQRURFRihuYW1lLCB0eXBlLCBpZCkJCVwKK3N0cnVjdCBzdHJ1Y3RfYWxpZ25fIyNuYW1lIHsJCQlcCisgIGNoYXIgYzsJCQkJCVwKKyAgdHlwZSB4OwkJCQkJXAorfTsJCQkJCQlcCitjb25zdCBmZmlfdHlwZSBmZmlfdHlwZV8jI25hbWUgPSB7CQlcCisgIHNpemVvZih0eXBlKSwJCQkJCVwKKyAgb2Zmc2V0b2Yoc3RydWN0IHN0cnVjdF9hbGlnbl8jI25hbWUsIHgpLAlcCisgIGlkLCBOVUxMCQkJCQlcCit9CisKKy8qIFNpemUgYW5kIGFsaWdubWVudCBhcmUgZmFrZSBoZXJlLiBUaGV5IG11c3Qgbm90IGJlIDAuICovCitjb25zdCBmZmlfdHlwZSBmZmlfdHlwZV92b2lkID0geworICAxLCAxLCBGRklfVFlQRV9WT0lELCBOVUxMCit9OworCitGRklfVFlQRURFRih1aW50OCwgVUlOVDgsIEZGSV9UWVBFX1VJTlQ4KTsKK0ZGSV9UWVBFREVGKHNpbnQ4LCBTSU5UOCwgRkZJX1RZUEVfU0lOVDgpOworRkZJX1RZUEVERUYodWludDE2LCBVSU5UMTYsIEZGSV9UWVBFX1VJTlQxNik7CitGRklfVFlQRURFRihzaW50MTYsIFNJTlQxNiwgRkZJX1RZUEVfU0lOVDE2KTsKK0ZGSV9UWVBFREVGKHVpbnQzMiwgVUlOVDMyLCBGRklfVFlQRV9VSU5UMzIpOworRkZJX1RZUEVERUYoc2ludDMyLCBTSU5UMzIsIEZGSV9UWVBFX1NJTlQzMik7CitGRklfVFlQRURFRih1aW50NjQsIFVJTlQ2NCwgRkZJX1RZUEVfVUlOVDY0KTsKK0ZGSV9UWVBFREVGKHNpbnQ2NCwgU0lOVDY0LCBGRklfVFlQRV9TSU5UNjQpOworCitGRklfVFlQRURFRihwb2ludGVyLCB2b2lkKiwgRkZJX1RZUEVfUE9JTlRFUik7CisKK0ZGSV9UWVBFREVGKGZsb2F0LCBmbG9hdCwgRkZJX1RZUEVfRkxPQVQpOworRkZJX1RZUEVERUYoZG91YmxlLCBkb3VibGUsIEZGSV9UWVBFX0RPVUJMRSk7CisKKyNpZmRlZiBfX2FscGhhX18KKy8qIEV2ZW4gaWYgd2UncmUgbm90IGNvbmZpZ3VyZWQgdG8gZGVmYXVsdCB0byAxMjgtYml0IGxvbmcgZG91YmxlLCAKKyAgIG1haW50YWluIGJpbmFyeSBjb21wYXRpYmlsaXR5LCBhcyAtbWxvbmctZG91YmxlLTEyOCBjYW4gYmUgdXNlZAorICAgYXQgYW55IHRpbWUuICAqLworLyogVmFsaWRhdGUgdGhlIGhhcmQtY29kZWQgbnVtYmVyIGJlbG93LiAgKi8KKyMgaWYgZGVmaW5lZChfX0xPTkdfRE9VQkxFXzEyOF9fKSAmJiBGRklfVFlQRV9MT05HRE9VQkxFICE9IDQKKyMgIGVycm9yIEZGSV9UWVBFX0xPTkdET1VCTEUgb3V0IG9mIGRhdGUKKyMgZW5kaWYKK2NvbnN0IGZmaV90eXBlIGZmaV90eXBlX2xvbmdkb3VibGUgPSB7IDE2LCAxNiwgNCwgTlVMTCB9OworI2VsaWYgRkZJX1RZUEVfTE9OR0RPVUJMRSAhPSBGRklfVFlQRV9ET1VCTEUKK0ZGSV9UWVBFREVGKGxvbmdkb3VibGUsIGxvbmcgZG91YmxlLCBGRklfVFlQRV9MT05HRE9VQkxFKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvZGFyd2luLlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni9kYXJ3aW4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjBmMDcwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvZGFyd2luLlMKQEAgLTAsMCArMSw0NDQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBkYXJ3aW4uUyAtIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSAgUmVkIEhhdCwgSW5jLgorCUNvcHlyaWdodCAoQykgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFg4NiBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKi8KKworI2lmbmRlZiBfX3g4Nl82NF9fCisKKyNkZWZpbmUgTElCRkZJX0FTTQkKKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworLnRleHQKKworLmdsb2JsIF9mZmlfcHJlcF9hcmdzCisKKwkuYWxpZ24gNAorLmdsb2JsIF9mZmlfY2FsbF9TWVNWCisKK19mZmlfY2FsbF9TWVNWOgorLkxGQjE6CisgICAgICAgIHB1c2hsICVlYnAKKy5MQ0ZJMDoKKyAgICAgICAgbW92bCAgJWVzcCwlZWJwCisuTENGSTE6CisgICAgICAgIHN1YmwgJDgsJWVzcAorCS8qIE1ha2Ugcm9vbSBmb3IgYWxsIG9mIHRoZSBuZXcgYXJncy4gICovCisJbW92bCAgMTYoJWVicCksJWVjeAorCXN1YmwgICVlY3gsJWVzcAorCisJbW92bCAgJWVzcCwlZWF4CisKKwkvKiBQbGFjZSBhbGwgb2YgdGhlIGZmaV9wcmVwX2FyZ3MgaW4gcG9zaXRpb24gICovCisJc3VibCAgJDgsJWVzcAorCXB1c2hsIDEyKCVlYnApCisJcHVzaGwgJWVheAorCWNhbGwgICo4KCVlYnApCisKKwkvKiBSZXR1cm4gc3RhY2sgdG8gcHJldmlvdXMgc3RhdGUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uICAqLworCWFkZGwgICQxNiwlZXNwCQorCisJY2FsbCAgKjI4KCVlYnApCisKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZSAgKi8KKwltb3ZsICAyMCglZWJwKSwlZWN4CQorCisJLyogUHJvdGVjdCAlZXNpLiAgV2UncmUgZ29pbmcgdG8gcG9wIGl0IGluIHRoZSBlcGlsb2d1ZS4gICovCisJcHVzaGwgJWVzaQorCisJLyogSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuICAqLworCWNtcGwgICQwLDI0KCVlYnApCisJam5lICAwZgorCisJLyogRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlIAorCSAgIG9ibGlnZWQgdG8gaGFuZGxlIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4gICovCisJY21wbCAgJEZGSV9UWVBFX0ZMT0FULCVlY3gKKwlqbmUgICBub3JldHZhbAorCWZzdHAgICVzdCgwKQorCisJam1wICAgZXBpbG9ndWUKKzA6CisJLmFsaWduIDQKKwljYWxsIDFmCisuTHN0b3JlX3RhYmxlOgorCS5sb25nICAgbm9yZXR2YWwtLkxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfVk9JRCAqLworCS5sb25nICAgcmV0aW50LS5Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX0lOVCAqLworCS5sb25nICAgcmV0ZmxvYXQtLkxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfRkxPQVQgKi8KKwkubG9uZyAgIHJldGRvdWJsZS0uTHN0b3JlX3RhYmxlCQkvKiBGRklfVFlQRV9ET1VCTEUgKi8KKwkubG9uZyAgIHJldGxvbmdkb3VibGUtLkxzdG9yZV90YWJsZSAgICAgLyogRkZJX1RZUEVfTE9OR0RPVUJMRSAqLworCS5sb25nICAgcmV0dWludDgtLkxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfVUlOVDggKi8KKwkubG9uZyAgIHJldHNpbnQ4LS5Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1NJTlQ4ICovCisJLmxvbmcgICByZXR1aW50MTYtLkxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfVUlOVDE2ICovCisJLmxvbmcgICByZXRzaW50MTYtLkxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfU0lOVDE2ICovCisJLmxvbmcgICByZXRpbnQtLkxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfVUlOVDMyICovCisJLmxvbmcgICByZXRpbnQtLkxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfU0lOVDMyICovCisJLmxvbmcgICByZXRpbnQ2NC0uTHN0b3JlX3RhYmxlCQkvKiBGRklfVFlQRV9VSU5UNjQgKi8KKwkubG9uZyAgIHJldGludDY0LS5Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1NJTlQ2NCAqLworCS5sb25nICAgcmV0c3RydWN0LS5Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1NUUlVDVCAqLworCS5sb25nICAgcmV0aW50LS5Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1BPSU5URVIgKi8KKwkubG9uZyAgIHJldHN0cnVjdDFiLS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfU01BTExfU1RSVUNUXzFCICovCisJLmxvbmcgICByZXRzdHJ1Y3QyYi0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8yQiAqLworMToKKwlwb3AgICVlc2kKKwlhZGQgICglZXNpLCAlZWN4LCA0KSwgJWVzaQorCWptcCAgKiVlc2kKKworCS8qIFNpZ24vemVybyBleHRlbmQgYXMgYXBwcm9wcmlhdGUuICAqLworcmV0c2ludDg6CisJbW92c2JsICAlYWwsICVlYXgKKwlqbXAgIHJldGludAorCityZXRzaW50MTY6CisJbW92c3dsICAlYXgsICVlYXgKKwlqbXAgIHJldGludAorCityZXR1aW50ODoKKwltb3Z6YmwgICVhbCwgJWVheAorCWptcCAgcmV0aW50CisKK3JldHVpbnQxNjoKKwltb3Z6d2wgICVheCwgJWVheAorCWptcCAgcmV0aW50CisKK3JldGZsb2F0OgorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAorCWZzdHBzICglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldGRvdWJsZToKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlICAqLworCW1vdmwgIDI0KCVlYnApLCVlY3gKKwlmc3RwbCAoJWVjeCkKKwlqbXAgICBlcGlsb2d1ZQorCityZXRsb25nZG91YmxlOgorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAorCWZzdHB0ICglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldGludDY0OgorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAorCW1vdmwgICVlYXgsMCglZWN4KQorCW1vdmwgICVlZHgsNCglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldHN0cnVjdDFiOgorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAorCW1vdmIgICVhbCwwKCVlY3gpCisJam1wICAgZXBpbG9ndWUKKworcmV0c3RydWN0MmI6CisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CisJbW92dyAgJWF4LDAoJWVjeCkKKwlqbXAgICBlcGlsb2d1ZQorCityZXRpbnQ6CisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CisJbW92bCAgJWVheCwwKCVlY3gpCisKK3JldHN0cnVjdDoKKwkvKiBOb3RoaW5nIHRvIGRvISAgKi8KKworbm9yZXR2YWw6CitlcGlsb2d1ZToKKwlwb3BsICVlc2kKKwltb3ZsICVlYnAsJWVzcAorCXBvcGwgJWVicAorCXJldAorCisuTEZFMToKKy5mZmlfY2FsbF9TWVNWX2VuZDoKKworCS5hbGlnbgk0CitGRklfSElEREVOIChmZmlfY2xvc3VyZV9TWVNWKQorLmdsb2JsIF9mZmlfY2xvc3VyZV9TWVNWCisKK19mZmlfY2xvc3VyZV9TWVNWOgorLkxGQjI6CisJcHVzaGwJJWVicAorLkxDRkkyOgorCW1vdmwJJWVzcCwgJWVicAorLkxDRkkzOgorCXN1YmwJJDQwLCAlZXNwCisJbGVhbAktMjQoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsIC0xMiglZWJwKQkvKiByZXNwICovCisJbGVhbAk4KCVlYnApLCAlZWR4CisJbW92bAklZWR4LCA0KCVlc3ApCS8qIGFyZ3MgPSBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpICovCisJbGVhbAktMTIoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsICglZXNwKQkvKiAmcmVzcCAqLworCW1vdmwJJWVieCwgOCglZXNwKQorLkxDRkk3OgorCWNhbGwJTF9mZmlfY2xvc3VyZV9TWVNWX2lubmVyJHN0dWIKKwltb3ZsCTgoJWVzcCksICVlYngKKwltb3ZsCS0xMiglZWJwKSwgJWVjeAorCWNtcGwJJEZGSV9UWVBFX0lOVCwgJWVheAorCWplCS5MY2xzX3JldGludAorCisJLyogSGFuZGxlIEZGSV9UWVBFX1VJTlQ4LCBGRklfVFlQRV9TSU5UOCwgRkZJX1RZUEVfVUlOVDE2LAorCSAgIEZGSV9UWVBFX1NJTlQxNiwgRkZJX1RZUEVfVUlOVDMyLCBGRklfVFlQRV9TSU5UMzIuICAqLworCWNtcGwJJEZGSV9UWVBFX1VJTlQ2NCwgJWVheAorCWpnZQkwZgorCWNtcGwJJEZGSV9UWVBFX1VJTlQ4LCAlZWF4CisJamdlCS5MY2xzX3JldGludAorCiswOgljbXBsCSRGRklfVFlQRV9GTE9BVCwgJWVheAorCWplCS5MY2xzX3JldGZsb2F0CisJY21wbAkkRkZJX1RZUEVfRE9VQkxFLCAlZWF4CisJamUJLkxjbHNfcmV0ZG91YmxlCisJY21wbAkkRkZJX1RZUEVfTE9OR0RPVUJMRSwgJWVheAorCWplCS5MY2xzX3JldGxkb3VibGUKKwljbXBsCSRGRklfVFlQRV9TSU5UNjQsICVlYXgKKwlqZQkuTGNsc19yZXRsbG9uZworCWNtcGwJJEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQiwgJWVheAorCWplCS5MY2xzX3JldHN0cnVjdDFiCisJY21wbAkkRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCLCAlZWF4CisJamUJLkxjbHNfcmV0c3RydWN0MmIKKwljbXBsCSRGRklfVFlQRV9TVFJVQ1QsICVlYXgKKwlqZQkuTGNsc19yZXRzdHJ1Y3QKKy5MY2xzX2VwaWxvZ3VlOgorCW1vdmwJJWVicCwgJWVzcAorCXBvcGwJJWVicAorCXJldAorLkxjbHNfcmV0aW50OgorCW1vdmwJKCVlY3gpLCAlZWF4CisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRmbG9hdDoKKwlmbGRzCSglZWN4KQorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0ZG91YmxlOgorCWZsZGwJKCVlY3gpCisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRsZG91YmxlOgorCWZsZHQJKCVlY3gpCisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRsbG9uZzoKKwltb3ZsCSglZWN4KSwgJWVheAorCW1vdmwJNCglZWN4KSwgJWVkeAorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0c3RydWN0MWI6CisJbW92c2JsCSglZWN4KSwgJWVheAorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0c3RydWN0MmI6CisJbW92c3dsCSglZWN4KSwgJWVheAorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0c3RydWN0OgorCWxlYSAtOCglZWJwKSwlZXNwCisJbW92bAklZWJwLCAlZXNwCisJcG9wbAklZWJwCisJcmV0ICQ0CisuTEZFMjoKKworI2lmICFGRklfTk9fUkFXX0FQSQorCisjZGVmaW5lIFJBV19DTE9TVVJFX0NJRl9PRkZTRVQgKChGRklfVFJBTVBPTElORV9TSVpFICsgMykgJiB+MykKKyNkZWZpbmUgUkFXX0NMT1NVUkVfRlVOX09GRlNFVCAoUkFXX0NMT1NVUkVfQ0lGX09GRlNFVCArIDQpCisjZGVmaW5lIFJBV19DTE9TVVJFX1VTRVJfREFUQV9PRkZTRVQgKFJBV19DTE9TVVJFX0ZVTl9PRkZTRVQgKyA0KQorI2RlZmluZSBDSUZfRkxBR1NfT0ZGU0VUIDIwCisKKwkuYWxpZ24JNAorRkZJX0hJRERFTiAoZmZpX2Nsb3N1cmVfcmF3X1NZU1YpCisuZ2xvYmwgX2ZmaV9jbG9zdXJlX3Jhd19TWVNWCisKK19mZmlfY2xvc3VyZV9yYXdfU1lTVjoKKy5MRkIzOgorCXB1c2hsCSVlYnAKKy5MQ0ZJNDoKKwltb3ZsCSVlc3AsICVlYnAKKy5MQ0ZJNToKKwlwdXNobAklZXNpCisuTENGSTY6CisJc3VibAkkMzYsICVlc3AKKwltb3ZsCVJBV19DTE9TVVJFX0NJRl9PRkZTRVQoJWVheCksICVlc2kJIC8qIGNsb3N1cmUtPmNpZiAqLworCW1vdmwJUkFXX0NMT1NVUkVfVVNFUl9EQVRBX09GRlNFVCglZWF4KSwgJWVkeCAvKiBjbG9zdXJlLT51c2VyX2RhdGEgKi8KKwltb3ZsCSVlZHgsIDEyKCVlc3ApCS8qIHVzZXJfZGF0YSAqLworCWxlYWwJOCglZWJwKSwgJWVkeAkvKiBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpICovCisJbW92bAklZWR4LCA4KCVlc3ApCS8qIHJhd19hcmdzICovCisJbGVhbAktMjQoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsIDQoJWVzcCkJLyogJnJlcyAqLworCW1vdmwJJWVzaSwgKCVlc3ApCS8qIGNpZiAqLworCWNhbGwJKlJBV19DTE9TVVJFX0ZVTl9PRkZTRVQoJWVheCkJCSAvKiBjbG9zdXJlLT5mdW4gKi8KKwltb3ZsCUNJRl9GTEFHU19PRkZTRVQoJWVzaSksICVlYXgJCSAvKiBydHlwZSAqLworCWNtcGwJJEZGSV9UWVBFX0lOVCwgJWVheAorCWplCS5McmNsc19yZXRpbnQKKworCS8qIEhhbmRsZSBGRklfVFlQRV9VSU5UOCwgRkZJX1RZUEVfU0lOVDgsIEZGSV9UWVBFX1VJTlQxNiwKKwkgICBGRklfVFlQRV9TSU5UMTYsIEZGSV9UWVBFX1VJTlQzMiwgRkZJX1RZUEVfU0lOVDMyLiAgKi8KKwljbXBsCSRGRklfVFlQRV9VSU5UNjQsICVlYXgKKwlqZ2UJMGYKKwljbXBsCSRGRklfVFlQRV9VSU5UOCwgJWVheAorCWpnZQkuTHJjbHNfcmV0aW50CiswOgorCWNtcGwJJEZGSV9UWVBFX0ZMT0FULCAlZWF4CisJamUJLkxyY2xzX3JldGZsb2F0CisJY21wbAkkRkZJX1RZUEVfRE9VQkxFLCAlZWF4CisJamUJLkxyY2xzX3JldGRvdWJsZQorCWNtcGwJJEZGSV9UWVBFX0xPTkdET1VCTEUsICVlYXgKKwlqZQkuTHJjbHNfcmV0bGRvdWJsZQorCWNtcGwJJEZGSV9UWVBFX1NJTlQ2NCwgJWVheAorCWplCS5McmNsc19yZXRsbG9uZworLkxyY2xzX2VwaWxvZ3VlOgorCWFkZGwJJDM2LCAlZXNwCisJcG9wbAklZXNpCisJcG9wbAklZWJwCisJcmV0CisuTHJjbHNfcmV0aW50OgorCW1vdmwJLTI0KCVlYnApLCAlZWF4CisJam1wCS5McmNsc19lcGlsb2d1ZQorLkxyY2xzX3JldGZsb2F0OgorCWZsZHMJLTI0KCVlYnApCisJam1wCS5McmNsc19lcGlsb2d1ZQorLkxyY2xzX3JldGRvdWJsZToKKwlmbGRsCS0yNCglZWJwKQorCWptcAkuTHJjbHNfZXBpbG9ndWUKKy5McmNsc19yZXRsZG91YmxlOgorCWZsZHQJLTI0KCVlYnApCisJam1wCS5McmNsc19lcGlsb2d1ZQorLkxyY2xzX3JldGxsb25nOgorCW1vdmwJLTI0KCVlYnApLCAlZWF4CisJbW92bAktMjAoJWVicCksICVlZHgKKwlqbXAJLkxyY2xzX2VwaWxvZ3VlCisuTEZFMzoKKyNlbmRpZgorCisuc2VjdGlvbiBfX0lNUE9SVCxfX2p1bXBfdGFibGUsc3ltYm9sX3N0dWJzLHNlbGZfbW9kaWZ5aW5nX2NvZGUrcHVyZV9pbnN0cnVjdGlvbnMsNQorTF9mZmlfY2xvc3VyZV9TWVNWX2lubmVyJHN0dWI6CisJLmluZGlyZWN0X3N5bWJvbCBfZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcgorCWhsdCA7IGhsdCA7IGhsdCA7IGhsdCA7IGhsdAorCisKKy5zZWN0aW9uIF9fVEVYVCxfX2VoX2ZyYW1lLGNvYWxlc2NlZCxub190b2Mrc3RyaXBfc3RhdGljX3N5bXMrbGl2ZV9zdXBwb3J0CitFSF9mcmFtZTE6CisJLnNldAlMJHNldCQwLExFQ0lFMS1MU0NJRTEKKwkubG9uZwlMJHNldCQwCitMU0NJRTE6CisJLmxvbmcJMHgwCisJLmJ5dGUJMHgxCisJLmFzY2lpICJ6UlwwIgorCS5ieXRlCTB4MQorCS5ieXRlCTB4N2MKKwkuYnl0ZQkweDgKKwkuYnl0ZQkweDEKKwkuYnl0ZQkweDEwCisJLmJ5dGUJMHhjCisJLmJ5dGUJMHg1CisJLmJ5dGUJMHg0CisJLmJ5dGUJMHg4OAorCS5ieXRlCTB4MQorCS5hbGlnbiAyCitMRUNJRTE6CisuZ2xvYmwgX2ZmaV9jYWxsX1NZU1YuZWgKK19mZmlfY2FsbF9TWVNWLmVoOgorTFNGREUxOgorCS5zZXQJTCRzZXQkMSxMRUZERTEtTEFTRkRFMQorCS5sb25nCUwkc2V0JDEKK0xBU0ZERTE6CisJLmxvbmcJTEFTRkRFMS1FSF9mcmFtZTEKKwkubG9uZwkuTEZCMS0uCisJLnNldCBMJHNldCQyLC5MRkUxLS5MRkIxCisJLmxvbmcgTCRzZXQkMgorCS5ieXRlCTB4MAorCS5ieXRlCTB4NAorCS5zZXQgTCRzZXQkMywuTENGSTAtLkxGQjEKKwkubG9uZyBMJHNldCQzCisJLmJ5dGUJMHhlCisJLmJ5dGUJMHg4CisJLmJ5dGUJMHg4NAorCS5ieXRlCTB4MgorCS5ieXRlCTB4NAorCS5zZXQgTCRzZXQkNCwuTENGSTEtLkxDRkkwCisJLmxvbmcgTCRzZXQkNAorCS5ieXRlCTB4ZAorCS5ieXRlCTB4NAorCS5hbGlnbiAyCitMRUZERTE6CisuZ2xvYmwgX2ZmaV9jbG9zdXJlX1NZU1YuZWgKK19mZmlfY2xvc3VyZV9TWVNWLmVoOgorTFNGREUyOgorCS5zZXQJTCRzZXQkNSxMRUZERTItTEFTRkRFMgorCS5sb25nCUwkc2V0JDUKK0xBU0ZERTI6CisJLmxvbmcJTEFTRkRFMi1FSF9mcmFtZTEKKwkubG9uZwkuTEZCMi0uCisJLnNldCBMJHNldCQ2LC5MRkUyLS5MRkIyCisJLmxvbmcgTCRzZXQkNgorCS5ieXRlCTB4MAorCS5ieXRlCTB4NAorCS5zZXQgTCRzZXQkNywuTENGSTItLkxGQjIKKwkubG9uZyBMJHNldCQ3CisJLmJ5dGUJMHhlCisJLmJ5dGUJMHg4CisJLmJ5dGUJMHg4NAorCS5ieXRlCTB4MgorCS5ieXRlCTB4NAorCS5zZXQgTCRzZXQkOCwuTENGSTMtLkxDRkkyCisJLmxvbmcgTCRzZXQkOAorCS5ieXRlCTB4ZAorCS5ieXRlCTB4NAorCS5hbGlnbiAyCitMRUZERTI6CisKKyNpZiAhRkZJX05PX1JBV19BUEkKKworLmdsb2JsIF9mZmlfY2xvc3VyZV9yYXdfU1lTVi5laAorX2ZmaV9jbG9zdXJlX3Jhd19TWVNWLmVoOgorTFNGREUzOgorCS5zZXQJTCRzZXQkMTAsTEVGREUzLUxBU0ZERTMKKwkubG9uZwlMJHNldCQxMAorTEFTRkRFMzoKKwkubG9uZwlMQVNGREUzLUVIX2ZyYW1lMQorCS5sb25nCS5MRkIzLS4KKwkuc2V0IEwkc2V0JDExLC5MRkUzLS5MRkIzCisJLmxvbmcgTCRzZXQkMTEKKwkuYnl0ZQkweDAKKwkuYnl0ZQkweDQKKwkuc2V0IEwkc2V0JDEyLC5MQ0ZJNC0uTEZCMworCS5sb25nIEwkc2V0JDEyCisJLmJ5dGUJMHhlCisJLmJ5dGUJMHg4CisJLmJ5dGUJMHg4NAorCS5ieXRlCTB4MgorCS5ieXRlCTB4NAorCS5zZXQgTCRzZXQkMTMsLkxDRkk1LS5MQ0ZJNAorCS5sb25nIEwkc2V0JDEzCisJLmJ5dGUJMHhkCisJLmJ5dGUJMHg0CisJLmJ5dGUJMHg0CisJLnNldCBMJHNldCQxNCwuTENGSTYtLkxDRkk1CisJLmxvbmcgTCRzZXQkMTQKKwkuYnl0ZQkweDg1CisJLmJ5dGUJMHgzCisJLmFsaWduIDIKK0xFRkRFMzoKKworI2VuZGlmCisKKyNlbmRpZiAvKiBpZm5kZWYgX194ODZfNjRfXyAqLwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvZGFyd2luNjQuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L2RhcndpbjY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3Mzk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L2RhcndpbjY0LlMKQEAgLTAsMCArMSw0MTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBkYXJ3aW42NC5TIC0gQ29weXJpZ2h0IChjKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCSAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQsIEluYy4KKyAgIGRlcml2ZWQgZnJvbSB1bml4NjQuUworCisgICB4ODYtNjQgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgZm9yIERhcndpbi4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgTElCRkZJX0FTTQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisJLmZpbGUgImRhcndpbjY0LlMiCisudGV4dAorCisvKiBmZmlfY2FsbF91bml4NjQgKHZvaWQgKmFyZ3MsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsIHVuc2lnbmVkIGZsYWdzLAorCQkgICAgdm9pZCAqcmFkZHIsIHZvaWQgKCpmbmFkZHIpKHZvaWQpKTsKKworICAgQml0IG8gdHJpY2tpbmVzcyBoZXJlIC0tIEFSR1MrQllURVMgaXMgdGhlIGJhc2Ugb2YgdGhlIHN0YWNrIGZyYW1lCisgICBmb3IgdGhpcyBmdW5jdGlvbi4gIFRoaXMgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IGZmaV9jYWxsLiAgV2UgYWxzbworICAgZGVhbGxvY2F0ZSBzb21lIG9mIHRoZSBzdGFjayB0aGF0IGhhcyBiZWVuIGFsbG9jYSdkLiAgKi8KKworCS5hbGlnbgkzCisJLmdsb2JsCV9mZmlfY2FsbF91bml4NjQKKworX2ZmaV9jYWxsX3VuaXg2NDoKK0xVVzA6CisJbW92cQkoJXJzcCksICVyMTAJCS8qIExvYWQgcmV0dXJuIGFkZHJlc3MuICAqLworCWxlYXEJKCVyZGksICVyc2kpLCAlcmF4CS8qIEZpbmQgbG9jYWwgc3RhY2sgYmFzZS4gICovCisJbW92cQklcmR4LCAoJXJheCkJCS8qIFNhdmUgZmxhZ3MuICAqLworCW1vdnEJJXJjeCwgOCglcmF4KQkJLyogU2F2ZSByYWRkci4gICovCisJbW92cQklcmJwLCAxNiglcmF4KQkJLyogU2F2ZSBvbGQgZnJhbWUgcG9pbnRlci4gICovCisJbW92cQklcjEwLCAyNCglcmF4KQkJLyogUmVsb2NhdGUgcmV0dXJuIGFkZHJlc3MuICAqLworCW1vdnEJJXJheCwgJXJicAkJLyogRmluYWxpemUgbG9jYWwgc3RhY2sgZnJhbWUuICAqLworTFVXMToKKwltb3ZxCSVyZGksICVyMTAJCS8qIFNhdmUgYSBjb3B5IG9mIHRoZSByZWdpc3RlciBhcmVhLiAqLworCW1vdnEJJXI4LCAlcjExCQkvKiBTYXZlIGEgY29weSBvZiB0aGUgdGFyZ2V0IGZuLiAgKi8KKwltb3ZsCSVyOWQsICVlYXgJCS8qIFNldCBudW1iZXIgb2YgU1NFIHJlZ2lzdGVycy4gICovCisKKwkvKiBMb2FkIHVwIGFsbCBhcmd1bWVudCByZWdpc3RlcnMuICAqLworCW1vdnEJKCVyMTApLCAlcmRpCisJbW92cQk4KCVyMTApLCAlcnNpCisJbW92cQkxNiglcjEwKSwgJXJkeAorCW1vdnEJMjQoJXIxMCksICVyY3gKKwltb3ZxCTMyKCVyMTApLCAlcjgKKwltb3ZxCTQwKCVyMTApLCAlcjkKKwl0ZXN0bAklZWF4LCAlZWF4CisJam56CUxsb2FkX3NzZQorTHJldF9mcm9tX2xvYWRfc3NlOgorCisJLyogRGVhbGxvY2F0ZSB0aGUgcmVnIGFyZyBhcmVhLiAgKi8KKwlsZWFxCTE3NiglcjEwKSwgJXJzcAorCisJLyogQ2FsbCB0aGUgdXNlciBmdW5jdGlvbi4gICovCisJY2FsbAkqJXIxMQorCisJLyogRGVhbGxvY2F0ZSBzdGFjayBhcmcgYXJlYTsgbG9jYWwgc3RhY2sgZnJhbWUgaW4gcmVkem9uZS4gICovCisJbGVhcQkyNCglcmJwKSwgJXJzcAorCisJbW92cQkwKCVyYnApLCAlcmN4CQkvKiBSZWxvYWQgZmxhZ3MuICAqLworCW1vdnEJOCglcmJwKSwgJXJkaQkJLyogUmVsb2FkIHJhZGRyLiAgKi8KKwltb3ZxCTE2KCVyYnApLCAlcmJwCQkvKiBSZWxvYWQgb2xkIGZyYW1lIHBvaW50ZXIuICAqLworTFVXMjoKKworCS8qIFRoZSBmaXJzdCBieXRlIG9mIHRoZSBmbGFncyBjb250YWlucyB0aGUgRkZJX1RZUEUuICAqLworCW1vdnpibAklY2wsICVyMTBkCisJbGVhcQlMc3RvcmVfdGFibGUoJXJpcCksICVyMTEKKwltb3ZzbHEJKCVyMTEsICVyMTAsIDQpLCAlcjEwCisJYWRkcQklcjExLCAlcjEwCisJam1wCSolcjEwCisKK0xzdG9yZV90YWJsZToKKwkubG9uZwlMc3Rfdm9pZC1Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1ZPSUQgKi8KKwkubG9uZwlMc3Rfc2ludDMyLUxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfSU5UICovCisJLmxvbmcJTHN0X2Zsb2F0LUxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfRkxPQVQgKi8KKwkubG9uZwlMc3RfZG91YmxlLUxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfRE9VQkxFICovCisJLmxvbmcJTHN0X2xkb3VibGUtTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX0xPTkdET1VCTEUgKi8KKwkubG9uZwlMc3RfdWludDgtTHN0b3JlX3RhYmxlCQkvKiBGRklfVFlQRV9VSU5UOCAqLworCS5sb25nCUxzdF9zaW50OC1Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1NJTlQ4ICovCisJLmxvbmcJTHN0X3VpbnQxNi1Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1VJTlQxNiAqLworCS5sb25nCUxzdF9zaW50MTYtTHN0b3JlX3RhYmxlCQkvKiBGRklfVFlQRV9TSU5UMTYgKi8KKwkubG9uZwlMc3RfdWludDMyLUxzdG9yZV90YWJsZQkJLyogRkZJX1RZUEVfVUlOVDMyICovCisJLmxvbmcJTHN0X3NpbnQzMi1Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1NJTlQzMiAqLworCS5sb25nCUxzdF9pbnQ2NC1Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1VJTlQ2NCAqLworCS5sb25nCUxzdF9pbnQ2NC1Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1NJTlQ2NCAqLworCS5sb25nCUxzdF9zdHJ1Y3QtTHN0b3JlX3RhYmxlCQkvKiBGRklfVFlQRV9TVFJVQ1QgKi8KKwkubG9uZwlMc3RfaW50NjQtTHN0b3JlX3RhYmxlCQkvKiBGRklfVFlQRV9QT0lOVEVSICovCisKKwkudGV4dAorCS5hbGlnbgkzCitMc3Rfdm9pZDoKKwlyZXQKKwkuYWxpZ24JMworTHN0X3VpbnQ4OgorCW1vdnpicQklYWwsICVyYXgKKwltb3ZxCSVyYXgsICglcmRpKQorCXJldAorCS5hbGlnbgkzCitMc3Rfc2ludDg6CisJbW92c2JxCSVhbCwgJXJheAorCW1vdnEJJXJheCwgKCVyZGkpCisJcmV0CisJLmFsaWduCTMKK0xzdF91aW50MTY6CisJbW92endxCSVheCwgJXJheAorCW1vdnEJJXJheCwgKCVyZGkpCisJLmFsaWduCTMKK0xzdF9zaW50MTY6CisJbW92c3dxCSVheCwgJXJheAorCW1vdnEJJXJheCwgKCVyZGkpCisJcmV0CisJLmFsaWduCTMKK0xzdF91aW50MzI6CisJbW92bAklZWF4LCAlZWF4CisJbW92cQklcmF4LCAoJXJkaSkKKwkuYWxpZ24JMworTHN0X3NpbnQzMjoKKwljbHRxCisJbW92cQklcmF4LCAoJXJkaSkKKwlyZXQKKwkuYWxpZ24JMworTHN0X2ludDY0OgorCW1vdnEJJXJheCwgKCVyZGkpCisJcmV0CisJLmFsaWduCTMKK0xzdF9mbG9hdDoKKwltb3ZzcwkleG1tMCwgKCVyZGkpCisJcmV0CisJLmFsaWduCTMKK0xzdF9kb3VibGU6CisJbW92c2QJJXhtbTAsICglcmRpKQorCXJldAorTHN0X2xkb3VibGU6CisJZnN0cHQJKCVyZGkpCisJcmV0CisJLmFsaWduCTMKK0xzdF9zdHJ1Y3Q6CisJbGVhcQktMjAoJXJzcCksICVyc2kJCS8qIFNjcmF0Y2ggYXJlYSBpbiByZWR6b25lLiAgKi8KKworCS8qIFdlIGhhdmUgdG8gbG9jYXRlIHRoZSB2YWx1ZXMgbm93LCBhbmQgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0bworCSAgIHdyaXRlIHRvbyBtdWNoIGRhdGEgaW50byB0aGUgdXNlcidzIHJldHVybiB2YWx1ZSwgd2Ugc3BpbGwgdGhlCisJICAgdmFsdWUgdG8gYSAxNiBieXRlIHNjcmF0Y2ggYXJlYSBmaXJzdC4gIEJpdHMgOCwgOSwgYW5kIDEwCisJICAgY29udHJvbCB3aGVyZSB0aGUgdmFsdWVzIGFyZSBsb2NhdGVkLiAgT25seSBvbmUgb2YgdGhlIHRocmVlCisJICAgYml0cyB3aWxsIGJlIHNldDsgc2VlIGZmaV9wcmVwX2NpZl9tYWNoZGVwIGZvciB0aGUgcGF0dGVybi4gICovCisJbW92ZAkleG1tMCwgJXIxMAorCW1vdmQJJXhtbTEsICVyMTEKKwl0ZXN0bAkkMHgxMDAsICVlY3gKKwljbW92bnoJJXJheCwgJXJkeAorCWNtb3ZuegklcjEwLCAlcmF4CisJdGVzdGwJJDB4MjAwLCAlZWN4CisJY21vdm56CSVyMTAsICVyZHgKKwl0ZXN0bAkkMHg0MDAsICVlY3gKKwljbW92bnoJJXIxMCwgJXJheAorCWNtb3ZuegklcjExLCAlcmR4CisJbW92cQklcmF4LCAoJXJzaSkKKwltb3ZxCSVyZHgsIDgoJXJzaSkKKworCS8qIEJpdHMgMTItMzEgY29udGFpbiB0aGUgdHJ1ZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUuICBDb3B5IGZyb20KKwkgICB0aGUgc2NyYXRjaCBhcmVhIHRvIHRoZSB0cnVlIGRlc3RpbmF0aW9uLiAgKi8KKwlzaHJsCSQxMiwgJWVjeAorCXJlcCBtb3ZzYgorCXJldAorCisJLyogTWFueSB0aW1lcyB3ZSBjYW4gYXZvaWQgbG9hZGluZyBhbnkgU1NFIHJlZ2lzdGVycyBhdCBhbGwuCisJICAgSXQncyBub3Qgd29ydGggYW4gaW5kaXJlY3QganVtcCB0byBsb2FkIHRoZSBleGFjdCBzZXQgb2YKKwkgICBTU0UgcmVnaXN0ZXJzIG5lZWRlZDsgemVybyBvciBhbGwgaXMgYSBnb29kIGNvbXByb21pc2UuICAqLworCS5hbGlnbgkzCitMVVczOgorTGxvYWRfc3NlOgorCW1vdmRxYQk0OCglcjEwKSwgJXhtbTAKKwltb3ZkcWEJNjQoJXIxMCksICV4bW0xCisJbW92ZHFhCTgwKCVyMTApLCAleG1tMgorCW1vdmRxYQk5NiglcjEwKSwgJXhtbTMKKwltb3ZkcWEJMTEyKCVyMTApLCAleG1tNAorCW1vdmRxYQkxMjgoJXIxMCksICV4bW01CisJbW92ZHFhCTE0NCglcjEwKSwgJXhtbTYKKwltb3ZkcWEJMTYwKCVyMTApLCAleG1tNworCWptcAlMcmV0X2Zyb21fbG9hZF9zc2UKKworTFVXNDoKKwkuYWxpZ24JMworCS5nbG9ibAlfZmZpX2Nsb3N1cmVfdW5peDY0CisKK19mZmlfY2xvc3VyZV91bml4NjQ6CitMVVc1OgorCS8qIFRoZSBjYXJyeSBmbGFnIGlzIHNldCBieSB0aGUgdHJhbXBvbGluZSBpZmYgU1NFIHJlZ2lzdGVycworCSAgIGFyZSB1c2VkLiAgRG9uJ3QgY2xvYmJlciBpdCBiZWZvcmUgdGhlIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCisJbGVhcSAgICAtMjAwKCVyc3ApLCAlcnNwCitMVVc2OgorCW1vdnEJJXJkaSwgKCVyc3ApCisJbW92cSAgICAlcnNpLCA4KCVyc3ApCisJbW92cSAgICAlcmR4LCAxNiglcnNwKQorCW1vdnEgICAgJXJjeCwgMjQoJXJzcCkKKwltb3ZxICAgICVyOCwgMzIoJXJzcCkKKwltb3ZxICAgICVyOSwgNDAoJXJzcCkKKwlqYyAgICAgIExzYXZlX3NzZQorTHJldF9mcm9tX3NhdmVfc3NlOgorCisJbW92cQklcjEwLCAlcmRpCisJbGVhcQkxNzYoJXJzcCksICVyc2kKKwltb3ZxCSVyc3AsICVyZHgKKwlsZWFxCTIwOCglcnNwKSwgJXJjeAorCWNhbGwJX2ZmaV9jbG9zdXJlX3VuaXg2NF9pbm5lcgorCisJLyogRGVhbGxvY2F0ZSBzdGFjayBmcmFtZSBlYXJseTsgcmV0dXJuIHZhbHVlIGlzIG5vdyBpbiByZWR6b25lLiAgKi8KKwlhZGRxCSQyMDAsICVyc3AKK0xVVzc6CisKKwkvKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmV0dXJuIHZhbHVlIGNvbnRhaW5zIHRoZSBGRklfVFlQRS4gICovCisJbW92emJsCSVhbCwgJXIxMGQKKwlsZWFxCUxsb2FkX3RhYmxlKCVyaXApLCAlcjExCisJbW92c2xxCSglcjExLCAlcjEwLCA0KSwgJXIxMAorCWFkZHEJJXIxMSwgJXIxMAorCWptcAkqJXIxMAorCitMbG9hZF90YWJsZToKKwkubG9uZwlMbGRfdm9pZC1MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfVk9JRCAqLworCS5sb25nCUxsZF9pbnQzMi1MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfSU5UICovCisJLmxvbmcJTGxkX2Zsb2F0LUxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9GTE9BVCAqLworCS5sb25nCUxsZF9kb3VibGUtTGxvYWRfdGFibGUJCS8qIEZGSV9UWVBFX0RPVUJMRSAqLworCS5sb25nCUxsZF9sZG91YmxlLUxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9MT05HRE9VQkxFICovCisJLmxvbmcJTGxkX2ludDgtTGxvYWRfdGFibGUJCS8qIEZGSV9UWVBFX1VJTlQ4ICovCisJLmxvbmcJTGxkX2ludDgtTGxvYWRfdGFibGUJCS8qIEZGSV9UWVBFX1NJTlQ4ICovCisJLmxvbmcJTGxkX2ludDE2LUxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9VSU5UMTYgKi8KKwkubG9uZwlMbGRfaW50MTYtTGxvYWRfdGFibGUJCS8qIEZGSV9UWVBFX1NJTlQxNiAqLworCS5sb25nCUxsZF9pbnQzMi1MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfVUlOVDMyICovCisJLmxvbmcJTGxkX2ludDMyLUxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9TSU5UMzIgKi8KKwkubG9uZwlMbGRfaW50NjQtTGxvYWRfdGFibGUJCS8qIEZGSV9UWVBFX1VJTlQ2NCAqLworCS5sb25nCUxsZF9pbnQ2NC1MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfU0lOVDY0ICovCisJLmxvbmcJTGxkX3N0cnVjdC1MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfU1RSVUNUICovCisJLmxvbmcJTGxkX2ludDY0LUxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9QT0lOVEVSICovCisKKwkudGV4dAorCS5hbGlnbgkzCitMbGRfdm9pZDoKKwlyZXQKKwkuYWxpZ24JMworTGxkX2ludDg6CisJbW92emJsCS0yNCglcnNwKSwgJWVheAorCXJldAorCS5hbGlnbgkzCitMbGRfaW50MTY6CisJbW92endsCS0yNCglcnNwKSwgJWVheAorCXJldAorCS5hbGlnbgkzCitMbGRfaW50MzI6CisJbW92bAktMjQoJXJzcCksICVlYXgKKwlyZXQKKwkuYWxpZ24JMworTGxkX2ludDY0OgorCW1vdnEJLTI0KCVyc3ApLCAlcmF4CisJcmV0CisJLmFsaWduCTMKK0xsZF9mbG9hdDoKKwltb3ZzcwktMjQoJXJzcCksICV4bW0wCisJcmV0CisJLmFsaWduCTMKK0xsZF9kb3VibGU6CisJbW92c2QJLTI0KCVyc3ApLCAleG1tMAorCXJldAorCS5hbGlnbgkzCitMbGRfbGRvdWJsZToKKwlmbGR0CS0yNCglcnNwKQorCXJldAorCS5hbGlnbgkzCitMbGRfc3RydWN0OgorCS8qIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmlsaXRpZXMgaGVyZSwgJXJheC8lcmR4LCAleG1tMC8lcmF4LAorCSAgICVyYXgvJXhtbTAsICV4bW0wLyV4bW0xLiAgV2UgY29sbGFwc2UgdHdvIGJ5IGFsd2F5cyBsb2FkaW5nCisJICAgYm90aCByZHggYW5kIHhtbTEgd2l0aCB0aGUgc2Vjb25kIHdvcmQuICBGb3IgdGhlIHJlbWFpbmluZywKKwkgICBiaXQgOCBzZXQgbWVhbnMgeG1tMCBnZXRzIHRoZSBzZWNvbmQgd29yZCwgYW5kIGJpdCA5IG1lYW5zCisJICAgdGhhdCByYXggZ2V0cyB0aGUgc2Vjb25kIHdvcmQuICAqLworCW1vdnEJLTI0KCVyc3ApLCAlcmN4CisJbW92cQktMTYoJXJzcCksICVyZHgKKwltb3ZxCS0xNiglcnNwKSwgJXhtbTEKKwl0ZXN0bAkkMHgxMDAsICVlYXgKKwljbW92bnoJJXJkeCwgJXJjeAorCW1vdmQJJXJjeCwgJXhtbTAKKwl0ZXN0bAkkMHgyMDAsICVlYXgKKwltb3ZxCS0yNCglcnNwKSwgJXJheAorCWNtb3ZuegklcmR4LCAlcmF4CisJcmV0CisKKwkvKiBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgTGxvYWRfc3NlOyB0aGUgc2FtZSBsb2dpYyBhcHBsaWVzIGhlcmUuICAqLworCS5hbGlnbgkzCitMVVc4OgorTHNhdmVfc3NlOgorCW1vdmRxYQkleG1tMCwgNDgoJXJzcCkKKwltb3ZkcWEJJXhtbTEsIDY0KCVyc3ApCisJbW92ZHFhCSV4bW0yLCA4MCglcnNwKQorCW1vdmRxYQkleG1tMywgOTYoJXJzcCkKKwltb3ZkcWEJJXhtbTQsIDExMiglcnNwKQorCW1vdmRxYQkleG1tNSwgMTI4KCVyc3ApCisJbW92ZHFhCSV4bW02LCAxNDQoJXJzcCkKKwltb3ZkcWEJJXhtbTcsIDE2MCglcnNwKQorCWptcAlMcmV0X2Zyb21fc2F2ZV9zc2UKKworTFVXOToKKy5zZWN0aW9uIF9fVEVYVCxfX2VoX2ZyYW1lLGNvYWxlc2NlZCxub190b2Mrc3RyaXBfc3RhdGljX3N5bXMrbGl2ZV9zdXBwb3J0CitFSF9mcmFtZTE6CisJLnNldAlMJHNldCQwLExFQ0lFMS1MU0NJRTEJCS8qIENJRSBMZW5ndGggKi8KKwkubG9uZwlMJHNldCQwCitMU0NJRTE6CisJLmxvbmcJMHgwCQkvKiBDSUUgSWRlbnRpZmllciBUYWcgKi8KKwkuYnl0ZQkweDEJCS8qIENJRSBWZXJzaW9uICovCisJLmFzY2lpCSJ6UlwwIgkJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworCS5ieXRlCTB4MQkJLyogdWxlYjEyOCAweDE7IENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IgKi8KKwkuYnl0ZQkweDc4CQkvKiBzbGViMTI4IC04OyBDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yICovCisJLmJ5dGUJMHgxMAkJLyogQ0lFIFJBIENvbHVtbiAqLworCS5ieXRlCTB4MQkJLyogdWxlYjEyOCAweDE7IEF1Z21lbnRhdGlvbiBzaXplICovCisJLmJ5dGUJMHgxMAkJLyogRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpICovCisJLmJ5dGUJMHhjCQkvKiBEV19DRkFfZGVmX2NmYSwgJXJzcCBvZmZzZXQgOCAqLworCS5ieXRlCTB4NwkJLyogdWxlYjEyOCAweDcgKi8KKwkuYnl0ZQkweDgJCS8qIHVsZWIxMjggMHg4ICovCisJLmJ5dGUJMHg5MAkJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4MTAgKi8KKwkuYnl0ZQkweDEKKwkuYWxpZ24JMworTEVDSUUxOgorCS5nbG9ibCBfZmZpX2NhbGxfdW5peDY0LmVoCitfZmZpX2NhbGxfdW5peDY0LmVoOgorTFNGREUxOgorCS5zZXQJTCRzZXQkMSxMRUZERTEtTEFTRkRFMQkvKiBGREUgTGVuZ3RoICovCisJLmxvbmcJTCRzZXQkMQorTEFTRkRFMToKKwkubG9uZwlMQVNGREUxLUVIX2ZyYW1lMQkvKiBGREUgQ0lFIG9mZnNldCAqLworCS5xdWFkCUxVVzAtLgkJCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisJLnNldAlMJHNldCQyLExVVzQtTFVXMAkvKiBGREUgYWRkcmVzcyByYW5nZSAqLworCS5xdWFkCUwkc2V0JDIKKwkuYnl0ZQkweDAJCQkvKiBBdWdtZW50YXRpb24gc2l6ZSAqLworCS5ieXRlCTB4NAkJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuc2V0CUwkc2V0JDMsTFVXMS1MVVcwCisJLmxvbmcJTCRzZXQkMworCisJLyogTmV3IHN0YWNrIGZyYW1lIGJhc2VkIG9mZiByYnAuICBUaGlzIGlzIGEgaXR0eSBiaXQgb2YgdW53aW5kCisJICAgdHJpY2tlcnkgaW4gdGhhdCB0aGUgQ0ZBICpoYXMqIGNoYW5nZWQuICBUaGVyZSBpcyBubyBlYXN5IHdheQorCSAgIHRvIGRlc2NyaWJlIGl0IGNvcnJlY3RseSBvbiBlbnRyeSB0byB0aGUgZnVuY3Rpb24uICBGb3J0dW5hdGVseSwKKwkgICBpdCBkb2Vzbid0IG1hdHRlciB0b28gbXVjaCBzaW5jZSBhdCBhbGwgcG9pbnRzIHdlIGNhbiBjb3JyZWN0bHkKKwkgICB1bndpbmQgYmFjayB0byBmZmlfY2FsbC4gIE5vdGUgdGhhdCB0aGUgbG9jYXRpb24gdG8gd2hpY2ggd2UKKwkgICBtb3ZlZCB0aGUgcmV0dXJuIGFkZHJlc3MgaXMgKHRoZSBuZXcpIENGQS04LCBzbyBmcm9tIHRoZQorCSAgIHBlcnNwZWN0aXZlIG9mIHRoZSB1bndpbmQgaW5mbywgaXQgaGFzbid0IG1vdmVkLiAgKi8KKwkuYnl0ZQkweGMJCQkvKiBEV19DRkFfZGVmX2NmYSwgJXJicCBvZmZzZXQgMzIgKi8KKwkuYnl0ZQkweDYKKwkuYnl0ZQkweDIwCisJLmJ5dGUJMHg4MCs2CQkJLyogRFdfQ0ZBX29mZnNldCwgJXJicCBvZmZzZXQgMiotOCAqLworCS5ieXRlCTB4MgorCS5ieXRlCTB4YQkJCS8qIERXX0NGQV9yZW1lbWJlcl9zdGF0ZSAqLworCisJLmJ5dGUJMHg0CQkJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5zZXQJTCRzZXQkNCxMVVcyLUxVVzEKKwkubG9uZwlMJHNldCQ0CisJLmJ5dGUJMHhjCQkJLyogRFdfQ0ZBX2RlZl9jZmEsICVyc3Agb2Zmc2V0IDggKi8KKwkuYnl0ZQkweDcKKwkuYnl0ZQkweDgKKwkuYnl0ZQkweGMwKzYJCQkvKiBEV19DRkFfcmVzdG9yZSwgJXJicCAqLworCisJLmJ5dGUJMHg0CQkJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5zZXQJTCRzZXQkNSxMVVczLUxVVzIKKwkubG9uZwlMJHNldCQ1CisJLmJ5dGUJMHhiCQkJLyogRFdfQ0ZBX3Jlc3RvcmVfc3RhdGUgKi8KKworCS5hbGlnbgkzCitMRUZERTE6CisJLmdsb2JsIF9mZmlfY2xvc3VyZV91bml4NjQuZWgKK19mZmlfY2xvc3VyZV91bml4NjQuZWg6CitMU0ZERTM6CisJLnNldAlMJHNldCQ2LExFRkRFMy1MQVNGREUzCS8qIEZERSBMZW5ndGggKi8KKwkubG9uZwlMJHNldCQ2CitMQVNGREUzOgorCS5sb25nCUxBU0ZERTMtRUhfZnJhbWUxCS8qIEZERSBDSUUgb2Zmc2V0ICovCisJLnF1YWQJTFVXNS0uCQkJLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKwkuc2V0CUwkc2V0JDcsTFVXOS1MVVc1CS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisJLnF1YWQJTCRzZXQkNworCS5ieXRlCTB4MAkJCS8qIEF1Z21lbnRhdGlvbiBzaXplICovCisKKwkuYnl0ZQkweDQJCQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLnNldAlMJHNldCQ4LExVVzYtTFVXNQorCS5sb25nCUwkc2V0JDgKKwkuYnl0ZQkweGUJCQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkyMDgsMQkJCS8qIHVsZWIxMjggMjA4ICovCisJLmJ5dGUJMHhhCQkJLyogRFdfQ0ZBX3JlbWVtYmVyX3N0YXRlICovCisKKwkuYnl0ZQkweDQJCQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLnNldAlMJHNldCQ5LExVVzctTFVXNgorCS5sb25nCUwkc2V0JDkKKwkuYnl0ZQkweGUJCQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDgKKworCS5ieXRlCTB4NAkJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkuc2V0CUwkc2V0JDEwLExVVzgtTFVXNworCS5sb25nCUwkc2V0JDEwCisJLmJ5dGUJMHhiCQkJLyogRFdfQ0ZBX3Jlc3RvcmVfc3RhdGUgKi8KKworCS5hbGlnbgkzCitMRUZERTM6CisJLnN1YnNlY3Rpb25zX3ZpYV9zeW1ib2xzCisKKyNlbmRpZiAvKiBfX3g4Nl82NF9fICovCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni9mZmkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L2ZmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjljNjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni9mZmkuYwpAQCAtMCwwICsxLDY0NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAxOTk5LCAyMDAxLCAyMDA3LCAyMDA4ICBSZWQgSGF0LCBJbmMuCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiAgUmFuaml0IE1hdGhldworICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgIEJvIFRob3JzZW4KKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyICBSb2dlciBTYXlsZQorICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMTAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICB4ODYgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICFkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX1dJTjY0KQorCisjaWZkZWYgX1dJTjY0CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogZmZpX3ByZXBfYXJncyBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmx5IHJvdXRpbmUgb25jZSBzdGFjayBzcGFjZQorICAgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgKi8KKwordm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworICByZWdpc3RlciB2b2lkICoqcF9hcmd2OworICByZWdpc3RlciBjaGFyICphcmdwOworICByZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOworCisgIGFyZ3AgPSBzdGFjazsKKworICBpZiAoZWNpZi0+Y2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QKKyNpZmRlZiBYODZfV0lONjQKKyAgICAgICYmIChlY2lmLT5jaWYtPnJ0eXBlLT5zaXplICE9IDEgJiYgZWNpZi0+Y2lmLT5ydHlwZS0+c2l6ZSAhPSAyCisgICAgICAgICAgJiYgZWNpZi0+Y2lmLT5ydHlwZS0+c2l6ZSAhPSA0ICYmIGVjaWYtPmNpZi0+cnR5cGUtPnNpemUgIT0gOCkKKyNlbmRpZgorICAgICAgKQorICAgIHsKKyAgICAgICoodm9pZCAqKikgYXJncCA9IGVjaWYtPnJ2YWx1ZTsKKyAgICAgIGFyZ3AgKz0gc2l6ZW9mKHZvaWQqKTsKKyAgICB9CisKKyAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOworCisgIGZvciAoaSA9IGVjaWYtPmNpZi0+bmFyZ3MsIHBfYXJnID0gZWNpZi0+Y2lmLT5hcmdfdHlwZXM7CisgICAgICAgaSAhPSAwOworICAgICAgIGktLSwgcF9hcmcrKykKKyAgICB7CisgICAgICBzaXplX3QgejsKKworICAgICAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoKHNpemVvZih2b2lkKikgLSAxKSAmIChzaXplX3QpIGFyZ3ApCisgICAgICAgIGFyZ3AgPSAoY2hhciAqKSBBTElHTihhcmdwLCBzaXplb2Yodm9pZCopKTsKKworICAgICAgeiA9ICgqcF9hcmcpLT5zaXplOworI2lmZGVmIFg4Nl9XSU42NAorICAgICAgaWYgKHogPiBzaXplb2YoZmZpX2FyZykKKyAgICAgICAgICB8fCAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAgICAgICAgICYmICh6ICE9IDEgJiYgeiAhPSAyICYmIHogIT0gNCAmJiB6ICE9IDgpKQorI2lmIEZGSV9UWVBFX0RPVUJMRSAhPSBGRklfVFlQRV9MT05HRE9VQkxFCisgICAgICAgICAgfHwgKCgqcF9hcmcpLT50eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpCisjZW5kaWYKKyAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICB6ID0gc2l6ZW9mKGZmaV9hcmcpOworICAgICAgICAgICoodm9pZCAqKilhcmdwID0gKnBfYXJndjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisgICAgICAgIHsKKyAgICAgICAgICBtZW1jcHkoYXJncCwgKnBfYXJndiwgeik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHogPCBzaXplb2YoZmZpX2FyZykpCisgICAgICAgIHsKKyAgICAgICAgICB6ID0gc2l6ZW9mKGZmaV9hcmcpOworICAgICAgICAgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorICAgICAgICAgICAgICAqKGZmaV9zYXJnICopIGFyZ3AgPSAoZmZpX3NhcmcpKihTSU5UOCAqKSgqIHBfYXJndik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgICAqKGZmaV9hcmcgKikgYXJncCA9IChmZmlfYXJnKSooVUlOVDggKikoKiBwX2FyZ3YpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisgICAgICAgICAgICAgICooZmZpX3NhcmcgKikgYXJncCA9IChmZmlfc2FyZykqKFNJTlQxNiAqKSgqIHBfYXJndik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgICAgKihmZmlfYXJnICopIGFyZ3AgPSAoZmZpX2FyZykqKFVJTlQxNiAqKSgqIHBfYXJndik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQzMjoKKyAgICAgICAgICAgICAgKihmZmlfc2FyZyAqKSBhcmdwID0gKGZmaV9zYXJnKSooU0lOVDMyICopKCogcF9hcmd2KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgICAqKGZmaV9hcmcgKikgYXJncCA9IChmZmlfYXJnKSooVUlOVDMyICopKCogcF9hcmd2KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgICAgICAgICAqKGZmaV9hcmcgKikgYXJncCA9ICooZmZpX2FyZyAqKSgqIHBfYXJndik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBGRklfQVNTRVJUKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBtZW1jcHkoYXJncCwgKnBfYXJndiwgeik7CisgICAgICAgIH0KKyAgICAgIHBfYXJndisrOworI2lmZGVmIFg4Nl9XSU42NAorICAgICAgYXJncCArPSAoeiArIHNpemVvZih2b2lkKikgLSAxKSAmIH4oc2l6ZW9mKHZvaWQqKSAtIDEpOworI2Vsc2UKKyAgICAgIGFyZ3AgKz0gejsKKyNlbmRpZgorICAgIH0KKyAgCisgIHJldHVybjsKK30KKworLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZyAqLworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpCit7CisgIHVuc2lnbmVkIGludCBpOworICBmZmlfdHlwZSAqKnB0cjsKKworICAvKiBTZXQgdGhlIHJldHVybiB0eXBlIGZsYWcgKi8KKyAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CisgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorI2lmZGVmIFg4Nl9XSU42NAorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDMyOgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorI2VuZGlmCisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKyAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyNpZm5kZWYgWDg2X1dJTjY0CisjaWYgRkZJX1RZUEVfRE9VQkxFICE9IEZGSV9UWVBFX0xPTkdET1VCTEUKKyAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisjZW5kaWYKKyNlbmRpZgorICAgICAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisjaWZkZWYgWDg2X1dJTjY0CisgICAgY2FzZSBGRklfVFlQRV9QT0lOVEVSOgorI2VuZGlmCisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDY0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyNpZm5kZWYgWDg2CisgICAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQjsgLyogc2FtZSBhcyBjaGFyIHNpemUgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8yQjsgLyogc2FtZSBhcyBzaG9ydCBzaXplICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gNCkKKyAgICAgICAgeworI2lmZGVmIFg4Nl9XSU42NAorICAgICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEI7CisjZWxzZQorICAgICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9JTlQ7IC8qIHNhbWUgYXMgaW50IHR5cGUgKi8KKyNlbmRpZgorICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDgpCisgICAgICAgIHsKKyAgICAgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDY0OyAvKiBzYW1lIGFzIGludDY0IHR5cGUgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU1RSVUNUOworICAgICAgICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciByZXR1cm4gdmFsdWUgcG9pbnRlciAqLworICAgICAgICAgIGNpZi0+Ynl0ZXMgKz0gQUxJR04oc2l6ZW9mKHZvaWQqKSwgRkZJX1NJWkVPRl9BUkcpOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisjaWZkZWYgWDg2X1dJTjY0CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRklfVFlQRV9JTlQ6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDMyOworI2Vsc2UKKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKworICBmb3IgKHB0ciA9IGNpZi0+YXJnX3R5cGVzLCBpID0gY2lmLT5uYXJnczsgaSA+IDA7IGktLSwgcHRyKyspCisgICAgeworICAgICAgaWYgKCgoKnB0ciktPmFsaWdubWVudCAtIDEpICYgY2lmLT5ieXRlcykKKyAgICAgICAgY2lmLT5ieXRlcyA9IEFMSUdOKGNpZi0+Ynl0ZXMsICgqcHRyKS0+YWxpZ25tZW50KTsKKyAgICAgIGNpZi0+Ynl0ZXMgKz0gQUxJR04oKCpwdHIpLT5zaXplLCBGRklfU0laRU9GX0FSRyk7CisgICAgfQorCisjaWZkZWYgWDg2X1dJTjY0CisgIC8qIGVuc3VyZSBzcGFjZSBmb3Igc3RvcmluZyBmb3VyIHJlZ2lzdGVycyAqLworICBjaWYtPmJ5dGVzICs9IDQgKiBzaXplb2YoZmZpX2FyZyk7CisjZW5kaWYKKworI2lmZGVmIFg4Nl9EQVJXSU4KKyAgY2lmLT5ieXRlcyA9IChjaWYtPmJ5dGVzICsgMTUpICYgfjB4RjsKKyNlbmRpZgorCisgIHJldHVybiBGRklfT0s7Cit9CisKKyNpZmRlZiBYODZfV0lONjQKK2V4dGVybiBpbnQKK2ZmaV9jYWxsX3dpbjY0KHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCBleHRlbmRlZF9jaWYgKiwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQgKiwgdm9pZCAoKmZuKSh2b2lkKSk7CisjZWxpZiBkZWZpbmVkKFg4Nl9XSU4zMikKK2V4dGVybiB2b2lkCitmZmlfY2FsbF93aW4zMih2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwgZXh0ZW5kZWRfY2lmICosCisgICAgICAgICAgICAgICB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkICosIHZvaWQgKCpmbikodm9pZCkpOworI2Vsc2UKK2V4dGVybiB2b2lkIGZmaV9jYWxsX1NZU1Yodm9pZCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksIGV4dGVuZGVkX2NpZiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkICosIHZvaWQgKCpmbikodm9pZCkpOworI2VuZGlmCisKK3ZvaWQgZmZpX2NhbGwoZmZpX2NpZiAqY2lmLCB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICpydmFsdWUsIHZvaWQgKiphdmFsdWUpCit7CisgIGV4dGVuZGVkX2NpZiBlY2lmOworCisgIGVjaWYuY2lmID0gY2lmOworICBlY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKKyAgCisgIC8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4gKi8KKyAgLyogdmFsdWUgYWRkcmVzcyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBvbmUgICAgICAgICAgICAgICAgICAgICAqLworCisjaWZkZWYgWDg2X1dJTjY0CisgIGlmIChydmFsdWUgPT0gTlVMTAorICAgICAgJiYgY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QKKyAgICAgICYmIGNpZi0+cnR5cGUtPnNpemUgIT0gMSAmJiBjaWYtPnJ0eXBlLT5zaXplICE9IDIKKyAgICAgICYmIGNpZi0+cnR5cGUtPnNpemUgIT0gNCAmJiBjaWYtPnJ0eXBlLT5zaXplICE9IDgpCisgICAgeworICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EoKGNpZi0+cnR5cGUtPnNpemUgKyAweEYpICYgfjB4Rik7CisgICAgfQorI2Vsc2UKKyAgaWYgKHJ2YWx1ZSA9PSBOVUxMCisgICAgICAmJiBjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOworICAgIAorICAKKyAgc3dpdGNoIChjaWYtPmFiaSkgCisgICAgeworI2lmZGVmIFg4Nl9XSU42NAorICAgIGNhc2UgRkZJX1dJTjY0OgorICAgICAgZmZpX2NhbGxfd2luNjQoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsCisgICAgICAgICAgICAgICAgICAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgYnJlYWs7CisjZWxpZiBkZWZpbmVkKFg4Nl9XSU4zMikKKyAgICBjYXNlIEZGSV9TWVNWOgorICAgIGNhc2UgRkZJX1NURENBTEw6CisgICAgICBmZmlfY2FsbF93aW4zMihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywgY2lmLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgIGVjaWYucnZhbHVlLCBmbik7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgY2FzZSBGRklfU1lTVjoKKyAgICAgIGZmaV9jYWxsX1NZU1YoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBmbik7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKy8qKiBwcml2YXRlIG1lbWJlcnMgKiovCisKKy8qIFRoZSBmb2xsb3dpbmcgX19hdHRyaWJ1dGVfXygocmVncGFybSgxKSkpIGRlY29yYXRpb25zIHdpbGwgaGF2ZSBubyBlZmZlY3QKKyAgIG9uIE1TVkMgLSBzdGFuZGFyZCBjZGVjbCBjb252ZW50aW9uIGFwcGxpZXMuICovCitzdGF0aWMgdm9pZCBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YgKGNoYXIgKnN0YWNrLCB2b2lkICoqcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogYXJncywgZmZpX2NpZiogY2lmKTsKK3ZvaWQgRkZJX0hJRERFTiBmZmlfY2xvc3VyZV9TWVNWIChmZmlfY2xvc3VyZSAqKQorICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOwordW5zaWduZWQgaW50IEZGSV9ISURERU4gZmZpX2Nsb3N1cmVfU1lTVl9pbm5lciAoZmZpX2Nsb3N1cmUgKiwgdm9pZCAqKiwgdm9pZCAqKQorICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOwordm9pZCBGRklfSElEREVOIGZmaV9jbG9zdXJlX3Jhd19TWVNWIChmZmlfcmF3X2Nsb3N1cmUgKikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKKyNpZmRlZiBYODZfV0lOMzIKK3ZvaWQgRkZJX0hJRERFTiBmZmlfY2xvc3VyZV9TVERDQUxMIChmZmlfY2xvc3VyZSAqKQorICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOworI2VuZGlmCisjaWZkZWYgWDg2X1dJTjY0Cit2b2lkIEZGSV9ISURERU4gZmZpX2Nsb3N1cmVfd2luNjQgKGZmaV9jbG9zdXJlICopOworI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMganVtcGVkIHRvIGJ5IHRoZSB0cmFtcG9saW5lICovCisKKyNpZmRlZiBYODZfV0lONjQKK3ZvaWQgKiBGRklfSElEREVOCitmZmlfY2xvc3VyZV93aW42NF9pbm5lciAoZmZpX2Nsb3N1cmUgKmNsb3N1cmUsIHZvaWQgKmFyZ3MpIHsKKyAgZmZpX2NpZiAgICAgICAqY2lmOworICB2b2lkICAgICAgICAgKiphcmdfYXJlYTsKKyAgdm9pZCAgICAgICAgICAqcmVzdWx0OworICB2b2lkICAgICAgICAgICpyZXNwID0gJnJlc3VsdDsKKworICBjaWYgICAgICAgICA9IGNsb3N1cmUtPmNpZjsKKyAgYXJnX2FyZWEgICAgPSAodm9pZCoqKSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQqKSk7ICAKKworICAvKiB0aGlzIGNhbGwgd2lsbCBpbml0aWFsaXplIEFSR19BUkVBLCBzdWNoIHRoYXQgZWFjaAorICAgKiBlbGVtZW50IGluIHRoYXQgYXJyYXkgcG9pbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIAorICAgKiB2YWx1ZSBvbiB0aGUgc3RhY2s7IGFuZCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucworICAgKiBhIHN0cnVjdHVyZSwgaXQgd2lsbCBjaGFuZ2UgUkVTUCB0byBwb2ludCB0byB0aGUKKyAgICogc3RydWN0dXJlIHJldHVybiBhZGRyZXNzLiAgKi8KKworICBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoYXJncywgJnJlc3AsIGFyZ19hcmVhLCBjaWYpOworICAKKyAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgcmVzcCwgYXJnX2FyZWEsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgLyogVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbiByYXguICBUaGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvcgorICAgICByZXN1bHQgdHlwZXMgZXhjZXB0IGZvciBmbG9hdHM7IHdlIGhhdmUgdG8gJ21vdiB4bW0wLCByYXgnIGluIHRoZQorICAgICBjYWxsZXIgdG8gY29ycmVjdCB0aGlzLgorICAgICBUT0RPOiBzdHJ1Y3R1cmUgc2l6ZXMgb2YgMyA1IDYgNyBhcmUgcmV0dXJuZWQgYnkgcmVmZXJlbmNlLCB0b28hISEKKyAgKi8KKyAgcmV0dXJuIGNpZi0+cnR5cGUtPnNpemUgPiBzaXplb2Yodm9pZCAqKSA/IHJlc3AgOiAqKHZvaWQgKiopcmVzcDsKK30KKworI2Vsc2UKK3Vuc2lnbmVkIGludCBGRklfSElEREVOIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDEpKSkKK2ZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIgKGZmaV9jbG9zdXJlICpjbG9zdXJlLCB2b2lkICoqcmVzcHAsIHZvaWQgKmFyZ3MpCit7CisgIC8qIG91ciB2YXJpb3VzIHRoaW5ncy4uLiAgKi8KKyAgZmZpX2NpZiAgICAgICAqY2lmOworICB2b2lkICAgICAgICAgKiphcmdfYXJlYTsKKworICBjaWYgICAgICAgICA9IGNsb3N1cmUtPmNpZjsKKyAgYXJnX2FyZWEgICAgPSAodm9pZCoqKSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQqKSk7ICAKKworICAvKiB0aGlzIGNhbGwgd2lsbCBpbml0aWFsaXplIEFSR19BUkVBLCBzdWNoIHRoYXQgZWFjaAorICAgKiBlbGVtZW50IGluIHRoYXQgYXJyYXkgcG9pbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIAorICAgKiB2YWx1ZSBvbiB0aGUgc3RhY2s7IGFuZCBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucworICAgKiBhIHN0cnVjdHVyZSwgaXQgd2lsbCBjaGFuZ2UgUkVTUCB0byBwb2ludCB0byB0aGUKKyAgICogc3RydWN0dXJlIHJldHVybiBhZGRyZXNzLiAgKi8KKworICBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoYXJncywgcmVzcHAsIGFyZ19hcmVhLCBjaWYpOworCisgIChjbG9zdXJlLT5mdW4pIChjaWYsICpyZXNwcCwgYXJnX2FyZWEsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgcmV0dXJuIGNpZi0+ZmxhZ3M7Cit9CisjZW5kaWYgLyogIVg4Nl9XSU42NCAqLworCitzdGF0aWMgdm9pZAorZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGNoYXIgKnN0YWNrLCB2b2lkICoqcnZhbHVlLCB2b2lkICoqYXZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV9jaWYgKmNpZikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgIHJlZ2lzdGVyIHZvaWQgKipwX2FyZ3Y7CisgIHJlZ2lzdGVyIGNoYXIgKmFyZ3A7CisgIHJlZ2lzdGVyIGZmaV90eXBlICoqcF9hcmc7CisKKyAgYXJncCA9IHN0YWNrOworCisjaWZkZWYgWDg2X1dJTjY0CisgIGlmIChjaWYtPnJ0eXBlLT5zaXplID4gc2l6ZW9mKGZmaV9hcmcpCisgICAgICB8fCAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QKKyAgICAgICAgICAmJiAoY2lmLT5ydHlwZS0+c2l6ZSAhPSAxICYmIGNpZi0+cnR5cGUtPnNpemUgIT0gMgorICAgICAgICAgICAgICAmJiBjaWYtPnJ0eXBlLT5zaXplICE9IDQgJiYgY2lmLT5ydHlwZS0+c2l6ZSAhPSA4KSkpIHsKKyAgICAqcnZhbHVlID0gKih2b2lkICoqKSBhcmdwOworICAgIGFyZ3AgKz0gc2l6ZW9mKHZvaWQgKik7CisgIH0KKyNlbHNlCisgIGlmICggY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QgKSB7CisgICAgKnJ2YWx1ZSA9ICoodm9pZCAqKikgYXJncDsKKyAgICBhcmdwICs9IHNpemVvZih2b2lkICopOworICB9CisjZW5kaWYKKworICBwX2FyZ3YgPSBhdmFsdWU7CisKKyAgZm9yIChpID0gY2lmLT5uYXJncywgcF9hcmcgPSBjaWYtPmFyZ190eXBlczsgKGkgIT0gMCk7IGktLSwgcF9hcmcrKykKKyAgICB7CisgICAgICBzaXplX3QgejsKKworICAgICAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoKHNpemVvZih2b2lkKikgLSAxKSAmIChzaXplX3QpIGFyZ3ApIHsKKyAgICAgICAgYXJncCA9IChjaGFyICopIEFMSUdOKGFyZ3AsIHNpemVvZih2b2lkKikpOworICAgICAgfQorCisjaWZkZWYgWDg2X1dJTjY0CisgICAgICBpZiAoKCpwX2FyZyktPnNpemUgPiBzaXplb2YoZmZpX2FyZykKKyAgICAgICAgICB8fCAoKCpwX2FyZyktPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAgICAgICAgICYmICgoKnBfYXJnKS0+c2l6ZSAhPSAxICYmICgqcF9hcmcpLT5zaXplICE9IDIKKyAgICAgICAgICAgICAgICAgICYmICgqcF9hcmcpLT5zaXplICE9IDQgJiYgKCpwX2FyZyktPnNpemUgIT0gOCkpKQorICAgICAgICB7CisgICAgICAgICAgeiA9IHNpemVvZih2b2lkICopOworICAgICAgICAgICpwX2FyZ3YgPSAqKHZvaWQgKiopYXJncDsKKyAgICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisgICAgICAgICAgCisgICAgICAgICAgLyogYmVjYXVzZSB3ZSdyZSBsaXR0bGUgZW5kaWFuLCB0aGlzIGlzIHdoYXQgaXQgdHVybnMgaW50by4gICAqLworICAgICAgICAgIAorICAgICAgICAgICpwX2FyZ3YgPSAodm9pZCopIGFyZ3A7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgIHBfYXJndisrOworI2lmZGVmIFg4Nl9XSU42NAorICAgICAgYXJncCArPSAoeiArIHNpemVvZih2b2lkKikgLSAxKSAmIH4oc2l6ZW9mKHZvaWQqKSAtIDEpOworI2Vsc2UKKyAgICAgIGFyZ3AgKz0gejsKKyNlbmRpZgorICAgIH0KKyAgCisgIHJldHVybjsKK30KKworI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FX1dJTjY0KFRSQU1QLEZVTixDVFgsTUFTSykgXAoreyB1bnNpZ25lZCBjaGFyICpfX3RyYW1wID0gKHVuc2lnbmVkIGNoYXIqKShUUkFNUCk7IFwKKyAgIHZvaWQqICBfX2Z1biA9ICh2b2lkKikoRlVOKTsgXAorICAgdm9pZCogIF9fY3R4ID0gKHZvaWQqKShDVFgpOyBcCisgICAqKHVuc2lnbmVkIGNoYXIqKSAmX190cmFtcFswXSA9IDB4NDE7IFwKKyAgICoodW5zaWduZWQgY2hhciopICZfX3RyYW1wWzFdID0gMHhiYjsgXAorICAgKih1bnNpZ25lZCBpbnQqKSAmX190cmFtcFsyXSA9IE1BU0s7IC8qIG1vdiAkbWFzaywgJXIxMSAqLyBcCisgICAqKHVuc2lnbmVkIGNoYXIqKSAmX190cmFtcFs2XSA9IDB4NDg7IFwKKyAgICoodW5zaWduZWQgY2hhciopICZfX3RyYW1wWzddID0gMHhiODsgXAorICAgKih2b2lkKiopICZfX3RyYW1wWzhdID0gX19jdHg7IC8qIG1vdiBfX2N0eCwgJXJheCAqLyBcCisgICAqKHVuc2lnbmVkIGNoYXIgKikgICZfX3RyYW1wWzE2XSA9IDB4NDk7IFwKKyAgICoodW5zaWduZWQgY2hhciAqKSAgJl9fdHJhbXBbMTddID0gMHhiYTsgXAorICAgKih2b2lkKiopICZfX3RyYW1wWzE4XSA9IF9fZnVuOyAvKiBtb3YgX19mdW4sICVyMTAgKi8gXAorICAgKih1bnNpZ25lZCBjaGFyICopICAmX190cmFtcFsyNl0gPSAweDQxOyBcCisgICAqKHVuc2lnbmVkIGNoYXIgKikgICZfX3RyYW1wWzI3XSA9IDB4ZmY7IFwKKyAgICoodW5zaWduZWQgY2hhciAqKSAgJl9fdHJhbXBbMjhdID0gMHhlMjsgLyogam1wICVyMTAgKi8gXAorIH0KKworLyogSG93IHRvIG1ha2UgYSB0cmFtcG9saW5lLiAgRGVyaXZlZCBmcm9tIGdjYy9jb25maWcvaTM4Ni9pMzg2LmMuICovCisKKyNkZWZpbmUgRkZJX0lOSVRfVFJBTVBPTElORShUUkFNUCxGVU4sQ1RYKSBcCit7IHVuc2lnbmVkIGNoYXIgKl9fdHJhbXAgPSAodW5zaWduZWQgY2hhciopKFRSQU1QKTsgXAorICAgdW5zaWduZWQgaW50ICBfX2Z1biA9ICh1bnNpZ25lZCBpbnQpKEZVTik7IFwKKyAgIHVuc2lnbmVkIGludCAgX19jdHggPSAodW5zaWduZWQgaW50KShDVFgpOyBcCisgICB1bnNpZ25lZCBpbnQgIF9fZGlzID0gX19mdW4gLSAoX19jdHggKyAxMCk7ICBcCisgICAqKHVuc2lnbmVkIGNoYXIqKSAmX190cmFtcFswXSA9IDB4Yjg7IFwKKyAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzFdID0gX19jdHg7IC8qIG1vdmwgX19jdHgsICVlYXggKi8gXAorICAgKih1bnNpZ25lZCBjaGFyICopICAmX190cmFtcFs1XSA9IDB4ZTk7IFwKKyAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzZdID0gX19kaXM7IC8qIGptcCBfX2Z1biAgKi8gXAorIH0KKworI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FX1NURENBTEwoVFJBTVAsRlVOLENUWCxTSVpFKSAgXAoreyB1bnNpZ25lZCBjaGFyICpfX3RyYW1wID0gKHVuc2lnbmVkIGNoYXIqKShUUkFNUCk7IFwKKyAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOyBcCisgICB1bnNpZ25lZCBpbnQgIF9fY3R4ID0gKHVuc2lnbmVkIGludCkoQ1RYKTsgXAorICAgdW5zaWduZWQgaW50ICBfX2RpcyA9IF9fZnVuIC0gKF9fY3R4ICsgMTApOyBcCisgICB1bnNpZ25lZCBzaG9ydCBfX3NpemUgPSAodW5zaWduZWQgc2hvcnQpKFNJWkUpOyBcCisgICAqKHVuc2lnbmVkIGNoYXIqKSAmX190cmFtcFswXSA9IDB4Yjg7IFwKKyAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzFdID0gX19jdHg7IC8qIG1vdmwgX19jdHgsICVlYXggKi8gXAorICAgKih1bnNpZ25lZCBjaGFyICopICAmX190cmFtcFs1XSA9IDB4ZTg7IFwKKyAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzZdID0gX19kaXM7IC8qIGNhbGwgX19mdW4gICovIFwKKyAgICoodW5zaWduZWQgY2hhciAqKSAgJl9fdHJhbXBbMTBdID0gMHhjMjsgXAorICAgKih1bnNpZ25lZCBzaG9ydCopICAmX190cmFtcFsxMV0gPSBfX3NpemU7IC8qIHJldCBfX3NpemUgICovIFwKKyB9CisKKy8qIHRoZSBjaWYgbXVzdCBhbHJlYWR5IGJlIHByZXAnZWQgKi8KKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2xvc3VyZV9sb2MgKGZmaV9jbG9zdXJlKiBjbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgIGZmaV9jaWYqIGNpZiwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb2RlbG9jKQoreworI2lmZGVmIFg4Nl9XSU42NAorI2RlZmluZSBJU0ZMT0FUKElEWCkgKGNpZi0+YXJnX3R5cGVzW0lEWF0tPnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQgfHwgY2lmLT5hcmdfdHlwZXNbSURYXS0+dHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisjZGVmaW5lIEZMQUcoSURYKSAoY2lmLT5uYXJncz4oSURYKSYmSVNGTE9BVChJRFgpPygxPDwoSURYKSk6MCkKKyAgaWYgKGNpZi0+YWJpID09IEZGSV9XSU42NCkgCisgICAgeworICAgICAgaW50IG1hc2sgPSBGTEFHKDApfEZMQUcoMSl8RkxBRygyKXxGTEFHKDMpOworICAgICAgRkZJX0lOSVRfVFJBTVBPTElORV9XSU42NCAoJmNsb3N1cmUtPnRyYW1wWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmaV9jbG9zdXJlX3dpbjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWxvYywgbWFzayk7CisgICAgICAvKiBtYWtlIHN1cmUgd2UgY2FuIGV4ZWN1dGUgaGVyZSAqLworICAgIH0KKyNlbHNlCisgIGlmIChjaWYtPmFiaSA9PSBGRklfU1lTVikKKyAgICB7CisgICAgICBGRklfSU5JVF9UUkFNUE9MSU5FICgmY2xvc3VyZS0+dHJhbXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZpX2Nsb3N1cmVfU1lTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiljb2RlbG9jKTsKKyAgICB9CisjaWZkZWYgWDg2X1dJTjMyCisgIGVsc2UgaWYgKGNpZi0+YWJpID09IEZGSV9TVERDQUxMKQorICAgIHsKKyAgICAgIEZGSV9JTklUX1RSQU1QT0xJTkVfU1REQ0FMTCAoJmNsb3N1cmUtPnRyYW1wWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZpX2Nsb3N1cmVfU1REQ0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWNvZGVsb2MsIGNpZi0+Ynl0ZXMpOworICAgIH0KKyNlbmRpZiAvKiBYODZfV0lOMzIgKi8KKyNlbmRpZiAvKiAhWDg2X1dJTjY0ICovCisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gRkZJX0JBRF9BQkk7CisgICAgfQorICAgIAorICBjbG9zdXJlLT5jaWYgID0gY2lmOworICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIGNsb3N1cmUtPmZ1biAgPSBmdW47CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworLyogLS0tLS0tLSBOYXRpdmUgcmF3IEFQSSBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAhRkZJX05PX1JBV19BUEkKKworZmZpX3N0YXR1cworZmZpX3ByZXBfcmF3X2Nsb3N1cmVfbG9jIChmZmlfcmF3X2Nsb3N1cmUqIGNsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV9jaWYqIGNpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosZmZpX3Jhdyosdm9pZCopLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvZGVsb2MpCit7CisgIGludCBpOworCisgIGlmIChjaWYtPmFiaSAhPSBGRklfU1lTVikgeworICAgIHJldHVybiBGRklfQkFEX0FCSTsKKyAgfQorCisgIC8qIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGNlcnRhaW4ga2luZHMgb2YgYXJndW1lbnRzIGZvciByYXcKKyAgICAgY2xvc3VyZXMuICBUaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhIHNlcGFyYXRlIGFzc2VtYmx5CisgICAgIGxhbmd1YWdlIHJvdXRpbmUsIHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgYXJndW1lbnQgcHJvY2Vzc2luZywKKyAgICAgc29tZXRoaW5nIHdlIGRvbid0IGRvIG5vdyBmb3IgcGVyZm9ybWFuY2UuICAqLworCisgIGZvciAoaSA9IGNpZi0+bmFyZ3MtMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgRkZJX0FTU0VSVCAoY2lmLT5hcmdfdHlwZXNbaV0tPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUKTsKKyAgICAgIEZGSV9BU1NFUlQgKGNpZi0+YXJnX3R5cGVzW2ldLT50eXBlICE9IEZGSV9UWVBFX0xPTkdET1VCTEUpOworICAgIH0KKyAgCisKKyAgRkZJX0lOSVRfVFJBTVBPTElORSAoJmNsb3N1cmUtPnRyYW1wWzBdLCAmZmZpX2Nsb3N1cmVfcmF3X1NZU1YsCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGVsb2MpOworICAgIAorICBjbG9zdXJlLT5jaWYgID0gY2lmOworICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIGNsb3N1cmUtPmZ1biAgPSBmdW47CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworc3RhdGljIHZvaWQgCitmZmlfcHJlcF9hcmdzX3JhdyhjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKQoreworICBtZW1jcHkgKHN0YWNrLCBlY2lmLT5hdmFsdWUsIGVjaWYtPmNpZi0+Ynl0ZXMpOworfQorCisvKiB3ZSBib3Jyb3cgdGhpcyByb3V0aW5lIGZyb20gbGliZmZpIChpdCBtdXN0IGJlIGNoYW5nZWQsIHRob3VnaCwgdG8KKyAqIGFjdHVhbGx5IGNhbGwgdGhlIGZ1bmN0aW9uIHBhc3NlZCBpbiB0aGUgZmlyc3QgYXJndW1lbnQuICBhcyBvZgorICogbGliZmZpLTEuMjAsIHRoaXMgaXMgbm90IHRoZSBjYXNlLikKKyAqLworCit2b2lkCitmZmlfcmF3X2NhbGwoZmZpX2NpZiAqY2lmLCB2b2lkICgqZm4pKHZvaWQpLCB2b2lkICpydmFsdWUsIGZmaV9yYXcgKmZha2VfYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKyAgdm9pZCAqKmF2YWx1ZSA9ICh2b2lkICoqKWZha2VfYXZhbHVlOworCisgIGVjaWYuY2lmID0gY2lmOworICBlY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKKyAgCisgIC8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4gKi8KKyAgLyogdmFsdWUgYWRkcmVzcyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBvbmUgICAgICAgICAgICAgICAgICAgICAqLworCisgIGlmICgocnZhbHVlID09IE5VTEwpICYmIAorICAgICAgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSkKKyAgICB7CisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKKyAgICAKKyAgCisgIHN3aXRjaCAoY2lmLT5hYmkpIAorICAgIHsKKyNpZmRlZiBYODZfV0lOMzIKKyAgICBjYXNlIEZGSV9TWVNWOgorICAgIGNhc2UgRkZJX1NURENBTEw6CisgICAgICBmZmlfY2FsbF93aW4zMihmZmlfcHJlcF9hcmdzX3JhdywgJmVjaWYsIGNpZi0+Ynl0ZXMsIGNpZi0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgYnJlYWs7CisjZWxzZQorICAgIGNhc2UgRkZJX1NZU1Y6CisgICAgICBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3NfcmF3LCAmZWNpZiwgY2lmLT5ieXRlcywgY2lmLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQoMCk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogIV9feDg2XzY0X18gIHx8IFg4Nl9XSU42NCAqLworCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni9mZmk2NC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvZmZpNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGViNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvZmZpNjQuYwpAQCAtMCwwICsxLDYzNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaTY0LmMgLSBDb3B5cmlnaHQgKGMpIDIwMDExICBBbnRob255IEdyZWVuCisgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwICBSZWQgSGF0LCBJbmMuCisgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA3ICBCbyBUaG9yc2VuIDxib0BzdXNlLmRlPgorICAgICAgICAgICAgIAorICAgeDg2LTY0IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBfX3g4Nl82NF9fCisKKyNkZWZpbmUgTUFYX0dQUl9SRUdTIDYKKyNkZWZpbmUgTUFYX1NTRV9SRUdTIDgKKworc3RydWN0IHJlZ2lzdGVyX2FyZ3MKK3sKKyAgLyogUmVnaXN0ZXJzIGZvciBhcmd1bWVudCBwYXNzaW5nLiAgKi8KKyAgVUlOVDY0IGdwcltNQVhfR1BSX1JFR1NdOworICBfX2ludDEyOF90IHNzZVtNQVhfU1NFX1JFR1NdOworfTsKKworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfdW5peDY0ICh2b2lkICphcmdzLCB1bnNpZ25lZCBsb25nIGJ5dGVzLCB1bnNpZ25lZCBmbGFncywKKwkJCSAgICAgdm9pZCAqcmFkZHIsIHZvaWQgKCpmbmFkZHIpKHZvaWQpLCB1bnNpZ25lZCBzc2Vjb3VudCk7CisKKy8qIEFsbCByZWZlcmVuY2UgdG8gcmVnaXN0ZXIgY2xhc3NlcyBoZXJlIGlzIGlkZW50aWNhbCB0byB0aGUgY29kZSBpbgorICAgZ2NjL2NvbmZpZy9pMzg2L2kzODYuYy4gRG8gKm5vdCogY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCisKKy8qIFJlZ2lzdGVyIGNsYXNzIHVzZWQgZm9yIHBhc3NpbmcgZ2l2ZW4gNjRiaXQgcGFydCBvZiB0aGUgYXJndW1lbnQuCisgICBUaGVzZSByZXByZXNlbnQgY2xhc3NlcyBhcyBkb2N1bWVudGVkIGJ5IHRoZSBQUyBBQkksIHdpdGggdGhlCisgICBleGNlcHRpb24gb2YgU1NFU0YsIFNTRURGIGNsYXNzZXMsIHRoYXQgYXJlIGJhc2ljYWxseSBTU0UgY2xhc3MsCisgICBqdXN0IGdjYyB3aWxsIHVzZSBTRiBvciBERm1vZGUgbW92ZSBpbnN0ZWFkIG9mIERJbW9kZSB0byBhdm9pZAorICAgcmVmb3JtYXR0aW5nIHBlbmFsdGllcy4KKworICAgU2ltaWxhcnkgd2UgcGxheSBnYW1lcyB3aXRoIElOVEVHRVJTSV9DTEFTUyB0byB1c2UgY2hlYXBlciBTSW1vZGUgbW92ZXMKKyAgIHdoZW5ldmVyIHBvc3NpYmxlICh1cHBlciBoYWxmIGRvZXMgY29udGFpbiBwYWRkaW5nKS4gICovCitlbnVtIHg4Nl82NF9yZWdfY2xhc3MKKyAgeworICAgIFg4Nl82NF9OT19DTEFTUywKKyAgICBYODZfNjRfSU5URUdFUl9DTEFTUywKKyAgICBYODZfNjRfSU5URUdFUlNJX0NMQVNTLAorICAgIFg4Nl82NF9TU0VfQ0xBU1MsCisgICAgWDg2XzY0X1NTRVNGX0NMQVNTLAorICAgIFg4Nl82NF9TU0VERl9DTEFTUywKKyAgICBYODZfNjRfU1NFVVBfQ0xBU1MsCisgICAgWDg2XzY0X1g4N19DTEFTUywKKyAgICBYODZfNjRfWDg3VVBfQ0xBU1MsCisgICAgWDg2XzY0X0NPTVBMRVhfWDg3X0NMQVNTLAorICAgIFg4Nl82NF9NRU1PUllfQ0xBU1MKKyAgfTsKKworI2RlZmluZSBNQVhfQ0xBU1NFUyA0CisKKyNkZWZpbmUgU1NFX0NMQVNTX1AoWCkJKChYKSA+PSBYODZfNjRfU1NFX0NMQVNTICYmIFggPD0gWDg2XzY0X1NTRVVQX0NMQVNTKQorCisvKiB4ODYtNjQgcmVnaXN0ZXIgcGFzc2luZyBpbXBsZW1lbnRhdGlvbi4gIFNlZSB4ODYtNjQgQUJJIGZvciBkZXRhaWxzLiAgR29hbAorICAgb2YgdGhpcyBjb2RlIGlzIHRvIGNsYXNzaWZ5IGVhY2ggOGJ5dGVzIG9mIGluY29taW5nIGFyZ3VtZW50IGJ5IHRoZSByZWdpc3RlcgorICAgY2xhc3MgYW5kIGFzc2lnbiByZWdpc3RlcnMgYWNjb3JkaW5nbHkuICAqLworCisvKiBSZXR1cm4gdGhlIHVuaW9uIGNsYXNzIG9mIENMQVNTMSBhbmQgQ0xBU1MyLgorICAgU2VlIHRoZSB4ODYtNjQgUFMgQUJJIGZvciBkZXRhaWxzLiAgKi8KKworc3RhdGljIGVudW0geDg2XzY0X3JlZ19jbGFzcworbWVyZ2VfY2xhc3NlcyAoZW51bSB4ODZfNjRfcmVnX2NsYXNzIGNsYXNzMSwgZW51bSB4ODZfNjRfcmVnX2NsYXNzIGNsYXNzMikKK3sKKyAgLyogUnVsZSAjMTogSWYgYm90aCBjbGFzc2VzIGFyZSBlcXVhbCwgdGhpcyBpcyB0aGUgcmVzdWx0aW5nIGNsYXNzLiAgKi8KKyAgaWYgKGNsYXNzMSA9PSBjbGFzczIpCisgICAgcmV0dXJuIGNsYXNzMTsKKworICAvKiBSdWxlICMyOiBJZiBvbmUgb2YgdGhlIGNsYXNzZXMgaXMgTk9fQ0xBU1MsIHRoZSByZXN1bHRpbmcgY2xhc3MgaXMKKyAgICAgdGhlIG90aGVyIGNsYXNzLiAgKi8KKyAgaWYgKGNsYXNzMSA9PSBYODZfNjRfTk9fQ0xBU1MpCisgICAgcmV0dXJuIGNsYXNzMjsKKyAgaWYgKGNsYXNzMiA9PSBYODZfNjRfTk9fQ0xBU1MpCisgICAgcmV0dXJuIGNsYXNzMTsKKworICAvKiBSdWxlICMzOiBJZiBvbmUgb2YgdGhlIGNsYXNzZXMgaXMgTUVNT1JZLCB0aGUgcmVzdWx0IGlzIE1FTU9SWS4gICovCisgIGlmIChjbGFzczEgPT0gWDg2XzY0X01FTU9SWV9DTEFTUyB8fCBjbGFzczIgPT0gWDg2XzY0X01FTU9SWV9DTEFTUykKKyAgICByZXR1cm4gWDg2XzY0X01FTU9SWV9DTEFTUzsKKworICAvKiBSdWxlICM0OiBJZiBvbmUgb2YgdGhlIGNsYXNzZXMgaXMgSU5URUdFUiwgdGhlIHJlc3VsdCBpcyBJTlRFR0VSLiAgKi8KKyAgaWYgKChjbGFzczEgPT0gWDg2XzY0X0lOVEVHRVJTSV9DTEFTUyAmJiBjbGFzczIgPT0gWDg2XzY0X1NTRVNGX0NMQVNTKQorICAgICAgfHwgKGNsYXNzMiA9PSBYODZfNjRfSU5URUdFUlNJX0NMQVNTICYmIGNsYXNzMSA9PSBYODZfNjRfU1NFU0ZfQ0xBU1MpKQorICAgIHJldHVybiBYODZfNjRfSU5URUdFUlNJX0NMQVNTOworICBpZiAoY2xhc3MxID09IFg4Nl82NF9JTlRFR0VSX0NMQVNTIHx8IGNsYXNzMSA9PSBYODZfNjRfSU5URUdFUlNJX0NMQVNTCisgICAgICB8fCBjbGFzczIgPT0gWDg2XzY0X0lOVEVHRVJfQ0xBU1MgfHwgY2xhc3MyID09IFg4Nl82NF9JTlRFR0VSU0lfQ0xBU1MpCisgICAgcmV0dXJuIFg4Nl82NF9JTlRFR0VSX0NMQVNTOworCisgIC8qIFJ1bGUgIzU6IElmIG9uZSBvZiB0aGUgY2xhc3NlcyBpcyBYODcsIFg4N1VQLCBvciBDT01QTEVYX1g4NyBjbGFzcywKKyAgICAgTUVNT1JZIGlzIHVzZWQuICAqLworICBpZiAoY2xhc3MxID09IFg4Nl82NF9YODdfQ0xBU1MKKyAgICAgIHx8IGNsYXNzMSA9PSBYODZfNjRfWDg3VVBfQ0xBU1MKKyAgICAgIHx8IGNsYXNzMSA9PSBYODZfNjRfQ09NUExFWF9YODdfQ0xBU1MKKyAgICAgIHx8IGNsYXNzMiA9PSBYODZfNjRfWDg3X0NMQVNTCisgICAgICB8fCBjbGFzczIgPT0gWDg2XzY0X1g4N1VQX0NMQVNTCisgICAgICB8fCBjbGFzczIgPT0gWDg2XzY0X0NPTVBMRVhfWDg3X0NMQVNTKQorICAgIHJldHVybiBYODZfNjRfTUVNT1JZX0NMQVNTOworCisgIC8qIFJ1bGUgIzY6IE90aGVyd2lzZSBjbGFzcyBTU0UgaXMgdXNlZC4gICovCisgIHJldHVybiBYODZfNjRfU1NFX0NMQVNTOworfQorCisvKiBDbGFzc2lmeSB0aGUgYXJndW1lbnQgb2YgdHlwZSBUWVBFIGFuZCBtb2RlIE1PREUuCisgICBDTEFTU0VTIHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSByZWdpc3RlciBjbGFzcyB1c2VkIHRvIHBhc3MgZWFjaCB3b3JkCisgICBvZiB0aGUgb3BlcmFuZC4gIFRoZSBudW1iZXIgb2Ygd29yZHMgaXMgcmV0dXJuZWQuICBJbiBjYXNlIHRoZSBwYXJhbWV0ZXIKKyAgIHNob3VsZCBiZSBwYXNzZWQgaW4gbWVtb3J5LCAwIGlzIHJldHVybmVkLiBBcyBhIHNwZWNpYWwgY2FzZSBmb3IgemVybworICAgc2l6ZWQgY29udGFpbmVycywgY2xhc3Nlc1swXSB3aWxsIGJlIE5PX0NMQVNTIGFuZCAxIGlzIHJldHVybmVkLgorCisgICBTZWUgdGhlIHg4Ni02NCBQUyBBQkkgZm9yIGRldGFpbHMuCisqLworc3RhdGljIGludAorY2xhc3NpZnlfYXJndW1lbnQgKGZmaV90eXBlICp0eXBlLCBlbnVtIHg4Nl82NF9yZWdfY2xhc3MgY2xhc3Nlc1tdLAorCQkgICBzaXplX3QgYnl0ZV9vZmZzZXQpCit7CisgIHN3aXRjaCAodHlwZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKyAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDE2OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDE2OgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDMyOgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorICAgIGNhc2UgRkZJX1RZUEVfVUlOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfUE9JTlRFUjoKKyAgICAgIHsKKwlpbnQgc2l6ZSA9IGJ5dGVfb2Zmc2V0ICsgdHlwZS0+c2l6ZTsKKworCWlmIChzaXplIDw9IDQpCisJICB7CisJICAgIGNsYXNzZXNbMF0gPSBYODZfNjRfSU5URUdFUlNJX0NMQVNTOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwllbHNlIGlmIChzaXplIDw9IDgpCisJICB7CisJICAgIGNsYXNzZXNbMF0gPSBYODZfNjRfSU5URUdFUl9DTEFTUzsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJZWxzZSBpZiAoc2l6ZSA8PSAxMikKKwkgIHsKKwkgICAgY2xhc3Nlc1swXSA9IFg4Nl82NF9JTlRFR0VSX0NMQVNTOworCSAgICBjbGFzc2VzWzFdID0gWDg2XzY0X0lOVEVHRVJTSV9DTEFTUzsKKwkgICAgcmV0dXJuIDI7CisJICB9CisJZWxzZSBpZiAoc2l6ZSA8PSAxNikKKwkgIHsKKwkgICAgY2xhc3Nlc1swXSA9IGNsYXNzZXNbMV0gPSBYODZfNjRfSU5URUdFUlNJX0NMQVNTOworCSAgICByZXR1cm4gMjsKKwkgIH0KKwllbHNlCisJICBGRklfQVNTRVJUICgwKTsKKyAgICAgIH0KKyAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgorICAgICAgaWYgKCEoYnl0ZV9vZmZzZXQgJSA4KSkKKwljbGFzc2VzWzBdID0gWDg2XzY0X1NTRVNGX0NMQVNTOworICAgICAgZWxzZQorCWNsYXNzZXNbMF0gPSBYODZfNjRfU1NFX0NMQVNTOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgICBjbGFzc2VzWzBdID0gWDg2XzY0X1NTRURGX0NMQVNTOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorICAgICAgY2xhc3Nlc1swXSA9IFg4Nl82NF9YODdfQ0xBU1M7CisgICAgICBjbGFzc2VzWzFdID0gWDg2XzY0X1g4N1VQX0NMQVNTOworICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBGRklfVFlQRV9TVFJVQ1Q6CisgICAgICB7CisJY29uc3QgaW50IFVOSVRTX1BFUl9XT1JEID0gODsKKwlpbnQgd29yZHMgPSAodHlwZS0+c2l6ZSArIFVOSVRTX1BFUl9XT1JEIC0gMSkgLyBVTklUU19QRVJfV09SRDsKKwlmZmlfdHlwZSAqKnB0cjsgCisJaW50IGk7CisJZW51bSB4ODZfNjRfcmVnX2NsYXNzIHN1YmNsYXNzZXNbTUFYX0NMQVNTRVNdOworCisJLyogSWYgdGhlIHN0cnVjdCBpcyBsYXJnZXIgdGhhbiAzMiBieXRlcywgcGFzcyBpdCBvbiB0aGUgc3RhY2suICAqLworCWlmICh0eXBlLT5zaXplID4gMzIpCisJICByZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKQorCSAgY2xhc3Nlc1tpXSA9IFg4Nl82NF9OT19DTEFTUzsKKworCS8qIFplcm8gc2l6ZWQgYXJyYXlzIG9yIHN0cnVjdHVyZXMgYXJlIE5PX0NMQVNTLiAgV2UgcmV0dXJuIDAgdG8KKwkgICBzaWduYWxpemUgbWVtb3J5IGNsYXNzLCBzbyBoYW5kbGUgaXQgYXMgc3BlY2lhbCBjYXNlLiAgKi8KKwlpZiAoIXdvcmRzKQorCSAgeworCSAgICBjbGFzc2VzWzBdID0gWDg2XzY0X05PX0NMQVNTOworCSAgICByZXR1cm4gMTsKKwkgIH0KKworCS8qIE1lcmdlIHRoZSBmaWVsZHMgb2Ygc3RydWN0dXJlLiAgKi8KKwlmb3IgKHB0ciA9IHR5cGUtPmVsZW1lbnRzOyAqcHRyICE9IE5VTEw7IHB0cisrKQorCSAgeworCSAgICBpbnQgbnVtOworCisJICAgIGJ5dGVfb2Zmc2V0ID0gQUxJR04gKGJ5dGVfb2Zmc2V0LCAoKnB0ciktPmFsaWdubWVudCk7CisKKwkgICAgbnVtID0gY2xhc3NpZnlfYXJndW1lbnQgKCpwdHIsIHN1YmNsYXNzZXMsIGJ5dGVfb2Zmc2V0ICUgOCk7CisJICAgIGlmIChudW0gPT0gMCkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCSAgICAgIHsKKwkJaW50IHBvcyA9IGJ5dGVfb2Zmc2V0IC8gODsKKwkJY2xhc3Nlc1tpICsgcG9zXSA9CisJCSAgbWVyZ2VfY2xhc3NlcyAoc3ViY2xhc3Nlc1tpXSwgY2xhc3Nlc1tpICsgcG9zXSk7CisJICAgICAgfQorCisJICAgIGJ5dGVfb2Zmc2V0ICs9ICgqcHRyKS0+c2l6ZTsKKwkgIH0KKworCWlmICh3b3JkcyA+IDIpCisJICB7CisJICAgIC8qIFdoZW4gc2l6ZSA+IDE2IGJ5dGVzLCBpZiB0aGUgZmlyc3Qgb25lIGlzbid0CisJICAgICAgIFg4Nl82NF9TU0VfQ0xBU1Mgb3IgYW55IG90aGVyIG9uZXMgYXJlbid0CisJICAgICAgIFg4Nl82NF9TU0VVUF9DTEFTUywgZXZlcnl0aGluZyBzaG91bGQgYmUgcGFzc2VkIGluCisJICAgICAgIG1lbW9yeS4gICovCisJICAgIGlmIChjbGFzc2VzWzBdICE9IFg4Nl82NF9TU0VfQ0xBU1MpCisJICAgICAgcmV0dXJuIDA7CisKKwkgICAgZm9yIChpID0gMTsgaSA8IHdvcmRzOyBpKyspCisJICAgICAgaWYgKGNsYXNzZXNbaV0gIT0gWDg2XzY0X1NTRVVQX0NMQVNTKQorCQlyZXR1cm4gMDsKKwkgIH0KKworCS8qIEZpbmFsIG1lcmdlciBjbGVhbnVwLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykKKwkgIHsKKwkgICAgLyogSWYgb25lIGNsYXNzIGlzIE1FTU9SWSwgZXZlcnl0aGluZyBzaG91bGQgYmUgcGFzc2VkIGluCisJICAgICAgIG1lbW9yeS4gICovCisJICAgIGlmIChjbGFzc2VzW2ldID09IFg4Nl82NF9NRU1PUllfQ0xBU1MpCisJICAgICAgcmV0dXJuIDA7CisKKwkgICAgLyogVGhlIFg4Nl82NF9TU0VVUF9DTEFTUyBzaG91bGQgYmUgYWx3YXlzIHByZWNlZGVkIGJ5CisJICAgICAgIFg4Nl82NF9TU0VfQ0xBU1Mgb3IgWDg2XzY0X1NTRVVQX0NMQVNTLiAgKi8KKwkgICAgaWYgKGNsYXNzZXNbaV0gPT0gWDg2XzY0X1NTRVVQX0NMQVNTCisJCSYmIGNsYXNzZXNbaSAtIDFdICE9IFg4Nl82NF9TU0VfQ0xBU1MKKwkJJiYgY2xhc3Nlc1tpIC0gMV0gIT0gWDg2XzY0X1NTRVVQX0NMQVNTKQorCSAgICAgIHsKKwkJLyogVGhlIGZpcnN0IG9uZSBzaG91bGQgbmV2ZXIgYmUgWDg2XzY0X1NTRVVQX0NMQVNTLiAgKi8KKwkJRkZJX0FTU0VSVCAoaSAhPSAwKTsKKwkJY2xhc3Nlc1tpXSA9IFg4Nl82NF9TU0VfQ0xBU1M7CisJICAgICAgfQorCisJICAgIC8qICBJZiBYODZfNjRfWDg3VVBfQ0xBU1MgaXNuJ3QgcHJlY2VkZWQgYnkgWDg2XzY0X1g4N19DTEFTUywKKwkJZXZlcnl0aGluZyBzaG91bGQgYmUgcGFzc2VkIGluIG1lbW9yeS4gICovCisJICAgIGlmIChjbGFzc2VzW2ldID09IFg4Nl82NF9YODdVUF9DTEFTUworCQkmJiAoY2xhc3Nlc1tpIC0gMV0gIT0gWDg2XzY0X1g4N19DTEFTUykpCisJICAgICAgeworCQkvKiBUaGUgZmlyc3Qgb25lIHNob3VsZCBuZXZlciBiZSBYODZfNjRfWDg3VVBfQ0xBU1MuICAqLworCQlGRklfQVNTRVJUIChpICE9IDApOworCQlyZXR1cm4gMDsKKwkgICAgICB9CisJICB9CisJcmV0dXJuIHdvcmRzOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQoMCk7CisgICAgfQorICByZXR1cm4gMDsgLyogTmV2ZXIgcmVhY2hlZC4gICovCit9CisKKy8qIEV4YW1pbmUgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gc2V0IG51bWJlciBvZiByZWdpc3RlciByZXF1aXJlZCBpbiBlYWNoCisgICBjbGFzcy4gIFJldHVybiB6ZXJvIGlmZiBwYXJhbWV0ZXIgc2hvdWxkIGJlIHBhc3NlZCBpbiBtZW1vcnksIG90aGVyd2lzZQorICAgdGhlIG51bWJlciBvZiByZWdpc3RlcnMuICAqLworCitzdGF0aWMgaW50CitleGFtaW5lX2FyZ3VtZW50IChmZmlfdHlwZSAqdHlwZSwgZW51bSB4ODZfNjRfcmVnX2NsYXNzIGNsYXNzZXNbTUFYX0NMQVNTRVNdLAorCQkgIF9Cb29sIGluX3JldHVybiwgaW50ICpwbmdwciwgaW50ICpwbnNzZSkKK3sKKyAgaW50IGksIG4sIG5ncHIsIG5zc2U7CisKKyAgbiA9IGNsYXNzaWZ5X2FyZ3VtZW50ICh0eXBlLCBjbGFzc2VzLCAwKTsKKyAgaWYgKG4gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBuZ3ByID0gbnNzZSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisgICAgc3dpdGNoIChjbGFzc2VzW2ldKQorICAgICAgeworICAgICAgY2FzZSBYODZfNjRfSU5URUdFUl9DTEFTUzoKKyAgICAgIGNhc2UgWDg2XzY0X0lOVEVHRVJTSV9DTEFTUzoKKwluZ3ByKys7CisJYnJlYWs7CisgICAgICBjYXNlIFg4Nl82NF9TU0VfQ0xBU1M6CisgICAgICBjYXNlIFg4Nl82NF9TU0VTRl9DTEFTUzoKKyAgICAgIGNhc2UgWDg2XzY0X1NTRURGX0NMQVNTOgorCW5zc2UrKzsKKwlicmVhazsKKyAgICAgIGNhc2UgWDg2XzY0X05PX0NMQVNTOgorICAgICAgY2FzZSBYODZfNjRfU1NFVVBfQ0xBU1M6CisJYnJlYWs7CisgICAgICBjYXNlIFg4Nl82NF9YODdfQ0xBU1M6CisgICAgICBjYXNlIFg4Nl82NF9YODdVUF9DTEFTUzoKKyAgICAgIGNhc2UgWDg2XzY0X0NPTVBMRVhfWDg3X0NMQVNTOgorCXJldHVybiBpbl9yZXR1cm4gIT0gMDsKKyAgICAgIGRlZmF1bHQ6CisJYWJvcnQgKCk7CisgICAgICB9CisKKyAgKnBuZ3ByID0gbmdwcjsKKyAgKnBuc3NlID0gbnNzZTsKKworICByZXR1cm4gbjsKK30KKworLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZy4gICovCisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2NpZl9tYWNoZGVwIChmZmlfY2lmICpjaWYpCit7CisgIGludCBncHJjb3VudCwgc3NlY291bnQsIGksIGF2biwgbiwgbmdwciwgbnNzZSwgZmxhZ3M7CisgIGVudW0geDg2XzY0X3JlZ19jbGFzcyBjbGFzc2VzW01BWF9DTEFTU0VTXTsKKyAgc2l6ZV90IGJ5dGVzOworCisgIGdwcmNvdW50ID0gc3NlY291bnQgPSAwOworCisgIGZsYWdzID0gY2lmLT5ydHlwZS0+dHlwZTsKKyAgaWYgKGZsYWdzICE9IEZGSV9UWVBFX1ZPSUQpCisgICAgeworICAgICAgbiA9IGV4YW1pbmVfYXJndW1lbnQgKGNpZi0+cnR5cGUsIGNsYXNzZXMsIDEsICZuZ3ByLCAmbnNzZSk7CisgICAgICBpZiAobiA9PSAwKQorCXsKKwkgIC8qIFRoZSByZXR1cm4gdmFsdWUgaXMgcGFzc2VkIGluIG1lbW9yeS4gIEEgcG9pbnRlciB0byB0aGF0CisJICAgICBtZW1vcnkgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LiAgQWxsb2NhdGUgYSByZWdpc3RlciBmb3IgaXQuICAqLworCSAgZ3ByY291bnQrKzsKKwkgIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgaW4gYXNtIGZvciB0aGUgcmV0dXJuLiAgKi8KKwkgIGZsYWdzID0gRkZJX1RZUEVfVk9JRDsKKwl9CisgICAgICBlbHNlIGlmIChmbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QpCisJeworCSAgLyogTWFyayB3aGljaCByZWdpc3RlcnMgdGhlIHJlc3VsdCBhcHBlYXJzIGluLiAgKi8KKwkgIF9Cb29sIHNzZTAgPSBTU0VfQ0xBU1NfUCAoY2xhc3Nlc1swXSk7CisJICBfQm9vbCBzc2UxID0gbiA9PSAyICYmIFNTRV9DTEFTU19QIChjbGFzc2VzWzFdKTsKKwkgIGlmIChzc2UwICYmICFzc2UxKQorCSAgICBmbGFncyB8PSAxIDw8IDg7CisJICBlbHNlIGlmICghc3NlMCAmJiBzc2UxKQorCSAgICBmbGFncyB8PSAxIDw8IDk7CisJICBlbHNlIGlmIChzc2UwICYmIHNzZTEpCisJICAgIGZsYWdzIHw9IDEgPDwgMTA7CisJICAvKiBNYXJrIHRoZSB0cnVlIHNpemUgb2YgdGhlIHN0cnVjdHVyZS4gICovCisJICBmbGFncyB8PSBjaWYtPnJ0eXBlLT5zaXplIDw8IDEyOworCX0KKyAgICB9CisKKyAgLyogR28gb3ZlciBhbGwgYXJndW1lbnRzIGFuZCBkZXRlcm1pbmUgdGhlIHdheSB0aGV5IHNob3VsZCBiZSBwYXNzZWQuCisgICAgIElmIGl0J3MgaW4gYSByZWdpc3RlciBhbmQgdGhlcmUgaXMgc3BhY2UgZm9yIGl0LCBsZXQgdGhhdCBiZSBzby4gSWYKKyAgICAgbm90LCBhZGQgaXQncyBzaXplIHRvIHRoZSBzdGFjayBieXRlIGNvdW50LiAgKi8KKyAgZm9yIChieXRlcyA9IDAsIGkgPSAwLCBhdm4gPSBjaWYtPm5hcmdzOyBpIDwgYXZuOyBpKyspCisgICAgeworICAgICAgaWYgKGV4YW1pbmVfYXJndW1lbnQgKGNpZi0+YXJnX3R5cGVzW2ldLCBjbGFzc2VzLCAwLCAmbmdwciwgJm5zc2UpID09IDAKKwkgIHx8IGdwcmNvdW50ICsgbmdwciA+IE1BWF9HUFJfUkVHUworCSAgfHwgc3NlY291bnQgKyBuc3NlID4gTUFYX1NTRV9SRUdTKQorCXsKKwkgIGxvbmcgYWxpZ24gPSBjaWYtPmFyZ190eXBlc1tpXS0+YWxpZ25tZW50OworCisJICBpZiAoYWxpZ24gPCA4KQorCSAgICBhbGlnbiA9IDg7CisKKwkgIGJ5dGVzID0gQUxJR04gKGJ5dGVzLCBhbGlnbik7CisJICBieXRlcyArPSBjaWYtPmFyZ190eXBlc1tpXS0+c2l6ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZ3ByY291bnQgKz0gbmdwcjsKKwkgIHNzZWNvdW50ICs9IG5zc2U7CisJfQorICAgIH0KKyAgaWYgKHNzZWNvdW50KQorICAgIGZsYWdzIHw9IDEgPDwgMTE7CisgIGNpZi0+ZmxhZ3MgPSBmbGFnczsKKyAgY2lmLT5ieXRlcyA9IEFMSUdOIChieXRlcywgOCk7CisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKwordm9pZAorZmZpX2NhbGwgKGZmaV9jaWYgKmNpZiwgdm9pZCAoKmZuKSh2b2lkKSwgdm9pZCAqcnZhbHVlLCB2b2lkICoqYXZhbHVlKQoreworICBlbnVtIHg4Nl82NF9yZWdfY2xhc3MgY2xhc3Nlc1tNQVhfQ0xBU1NFU107CisgIGNoYXIgKnN0YWNrLCAqYXJncDsKKyAgZmZpX3R5cGUgKiphcmdfdHlwZXM7CisgIGludCBncHJjb3VudCwgc3NlY291bnQsIG5ncHIsIG5zc2UsIGksIGF2bjsKKyAgX0Jvb2wgcmV0X2luX21lbW9yeTsKKyAgc3RydWN0IHJlZ2lzdGVyX2FyZ3MgKnJlZ19hcmdzOworCisgIC8qIENhbid0IGNhbGwgMzItYml0IG1vZGUgZnJvbSA2NC1iaXQgbW9kZS4gICovCisgIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9VTklYNjQpOworCisgIC8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4gdmFsdWUKKyAgICAgYWRkcmVzcyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBvbmUuICBOb3RlIHRoZSBzZXR0aW5nIG9mIGZsYWdzIHRvCisgICAgIFZPSUQgYWJvdmUgaW4gZmZpX3ByZXBfY2lmX21hY2hkZXAuICAqLworICByZXRfaW5fbWVtb3J5ID0gKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCisJCSAgICYmIChjaWYtPmZsYWdzICYgMHhmZikgPT0gRkZJX1RZUEVfVk9JRCk7CisgIGlmIChydmFsdWUgPT0gTlVMTCAmJiByZXRfaW5fbWVtb3J5KQorICAgIHJ2YWx1ZSA9IGFsbG9jYSAoY2lmLT5ydHlwZS0+c2l6ZSk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHNwYWNlIGZvciB0aGUgYXJndW1lbnRzLCBwbHVzIDQgd29yZHMgb2YgdGVtcCBzcGFjZS4gICovCisgIHN0YWNrID0gYWxsb2NhIChzaXplb2YgKHN0cnVjdCByZWdpc3Rlcl9hcmdzKSArIGNpZi0+Ynl0ZXMgKyA0KjgpOworICByZWdfYXJncyA9IChzdHJ1Y3QgcmVnaXN0ZXJfYXJncyAqKSBzdGFjazsKKyAgYXJncCA9IHN0YWNrICsgc2l6ZW9mIChzdHJ1Y3QgcmVnaXN0ZXJfYXJncyk7CisKKyAgZ3ByY291bnQgPSBzc2Vjb3VudCA9IDA7CisKKyAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwYXNzZWQgaW4gbWVtb3J5LCBhZGQgdGhlIHBvaW50ZXIgYXMgdGhlCisgICAgIGZpcnN0IGludGVnZXIgYXJndW1lbnQuICAqLworICBpZiAocmV0X2luX21lbW9yeSkKKyAgICByZWdfYXJncy0+Z3ByW2dwcmNvdW50KytdID0gKGxvbmcpIHJ2YWx1ZTsKKworICBhdm4gPSBjaWYtPm5hcmdzOworICBhcmdfdHlwZXMgPSBjaWYtPmFyZ190eXBlczsKKworICBmb3IgKGkgPSAwOyBpIDwgYXZuOyArK2kpCisgICAgeworICAgICAgc2l6ZV90IHNpemUgPSBhcmdfdHlwZXNbaV0tPnNpemU7CisgICAgICBpbnQgbjsKKworICAgICAgbiA9IGV4YW1pbmVfYXJndW1lbnQgKGFyZ190eXBlc1tpXSwgY2xhc3NlcywgMCwgJm5ncHIsICZuc3NlKTsKKyAgICAgIGlmIChuID09IDAKKwkgIHx8IGdwcmNvdW50ICsgbmdwciA+IE1BWF9HUFJfUkVHUworCSAgfHwgc3NlY291bnQgKyBuc3NlID4gTUFYX1NTRV9SRUdTKQorCXsKKwkgIGxvbmcgYWxpZ24gPSBhcmdfdHlwZXNbaV0tPmFsaWdubWVudDsKKworCSAgLyogU3RhY2sgYXJndW1lbnRzIGFyZSAqYWx3YXlzKiBhdCBsZWFzdCA4IGJ5dGUgYWxpZ25lZC4gICovCisJICBpZiAoYWxpZ24gPCA4KQorCSAgICBhbGlnbiA9IDg7CisKKwkgIC8qIFBhc3MgdGhpcyBhcmd1bWVudCBpbiBtZW1vcnkuICAqLworCSAgYXJncCA9ICh2b2lkICopIEFMSUdOIChhcmdwLCBhbGlnbik7CisJICBtZW1jcHkgKGFyZ3AsIGF2YWx1ZVtpXSwgc2l6ZSk7CisJICBhcmdwICs9IHNpemU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZSBhcmd1bWVudCBpcyBwYXNzZWQgZW50aXJlbHkgaW4gcmVnaXN0ZXJzLiAgKi8KKwkgIGNoYXIgKmEgPSAoY2hhciAqKSBhdmFsdWVbaV07CisJICBpbnQgajsKKworCSAgZm9yIChqID0gMDsgaiA8IG47IGorKywgYSArPSA4LCBzaXplIC09IDgpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNsYXNzZXNbal0pCisJCXsKKwkJY2FzZSBYODZfNjRfSU5URUdFUl9DTEFTUzoKKwkJY2FzZSBYODZfNjRfSU5URUdFUlNJX0NMQVNTOgorCQkgIHJlZ19hcmdzLT5ncHJbZ3ByY291bnRdID0gMDsKKwkJICBtZW1jcHkgKCZyZWdfYXJncy0+Z3ByW2dwcmNvdW50XSwgYSwgc2l6ZSA8IDggPyBzaXplIDogOCk7CisJCSAgZ3ByY291bnQrKzsKKwkJICBicmVhazsKKwkJY2FzZSBYODZfNjRfU1NFX0NMQVNTOgorCQljYXNlIFg4Nl82NF9TU0VERl9DTEFTUzoKKwkJICByZWdfYXJncy0+c3NlW3NzZWNvdW50KytdID0gKihVSU5UNjQgKikgYTsKKwkJICBicmVhazsKKwkJY2FzZSBYODZfNjRfU1NFU0ZfQ0xBU1M6CisJCSAgcmVnX2FyZ3MtPnNzZVtzc2Vjb3VudCsrXSA9ICooVUlOVDMyICopIGE7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgYWJvcnQoKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICBmZmlfY2FsbF91bml4NjQgKHN0YWNrLCBjaWYtPmJ5dGVzICsgc2l6ZW9mIChzdHJ1Y3QgcmVnaXN0ZXJfYXJncyksCisJCSAgIGNpZi0+ZmxhZ3MsIHJ2YWx1ZSwgZm4sIHNzZWNvdW50KTsKK30KKworCitleHRlcm4gdm9pZCBmZmlfY2xvc3VyZV91bml4NjQodm9pZCk7CisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmVfbG9jIChmZmlfY2xvc3VyZSogY2xvc3VyZSwKKwkJICAgICAgZmZpX2NpZiogY2lmLAorCQkgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKiwgdm9pZCosIHZvaWQqKiwgdm9pZCopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCSAgICAgIHZvaWQgKmNvZGVsb2MpCit7CisgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICp0cmFtcDsKKworICAvKiBTYW5pdHkgY2hlY2sgb24gdGhlIGNpZiBBQkkuICAqLworICB7CisgICAgaW50IGFiaSA9IGNpZi0+YWJpOworICAgIGlmIChVTkxJS0VMWSAoISAoYWJpID4gRkZJX0ZJUlNUX0FCSSAmJiBhYmkgPCBGRklfTEFTVF9BQkkpKSkKKyAgICAgIHJldHVybiBGRklfQkFEX0FCSTsKKyAgfQorCisgIHRyYW1wID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopICZjbG9zdXJlLT50cmFtcFswXTsKKworICB0cmFtcFswXSA9IDB4YmI0OTsJCS8qIG1vdiA8Y29kZT4sICVyMTEJKi8KKyAgKih2b2lkICogdm9sYXRpbGUgKikgJnRyYW1wWzFdID0gZmZpX2Nsb3N1cmVfdW5peDY0OworICB0cmFtcFs1XSA9IDB4YmE0OTsJCS8qIG1vdiA8ZGF0YT4sICVyMTAJKi8KKyAgKih2b2lkICogdm9sYXRpbGUgKikgJnRyYW1wWzZdID0gY29kZWxvYzsKKworICAvKiBTZXQgdGhlIGNhcnJ5IGJpdCBpZmYgdGhlIGZ1bmN0aW9uIHVzZXMgYW55IHNzZSByZWdpc3RlcnMuCisgICAgIFRoaXMgaXMgY2xjIG9yIHN0YywgdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgam1wLiAgKi8KKyAgdHJhbXBbMTBdID0gY2lmLT5mbGFncyAmICgxIDw8IDExKSA/IDB4NDlmOSA6IDB4NDlmODsKKworICB0cmFtcFsxMV0gPSAweGUzZmY7CQkJLyogam1wIColcjExICAgICovCisKKyAgY2xvc3VyZS0+Y2lmID0gY2lmOworICBjbG9zdXJlLT5mdW4gPSBmdW47CisgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKworICByZXR1cm4gRkZJX09LOworfQorCitpbnQKK2ZmaV9jbG9zdXJlX3VuaXg2NF9pbm5lcihmZmlfY2xvc3VyZSAqY2xvc3VyZSwgdm9pZCAqcnZhbHVlLAorCQkJIHN0cnVjdCByZWdpc3Rlcl9hcmdzICpyZWdfYXJncywgY2hhciAqYXJncCkKK3sKKyAgZmZpX2NpZiAqY2lmOworICB2b2lkICoqYXZhbHVlOworICBmZmlfdHlwZSAqKmFyZ190eXBlczsKKyAgbG9uZyBpLCBhdm47CisgIGludCBncHJjb3VudCwgc3NlY291bnQsIG5ncHIsIG5zc2U7CisgIGludCByZXQ7CisKKyAgY2lmID0gY2xvc3VyZS0+Y2lmOworICBhdmFsdWUgPSBhbGxvY2EoY2lmLT5uYXJncyAqIHNpemVvZih2b2lkICopKTsKKyAgZ3ByY291bnQgPSBzc2Vjb3VudCA9IDA7CisKKyAgcmV0ID0gY2lmLT5ydHlwZS0+dHlwZTsKKyAgaWYgKHJldCAhPSBGRklfVFlQRV9WT0lEKQorICAgIHsKKyAgICAgIGVudW0geDg2XzY0X3JlZ19jbGFzcyBjbGFzc2VzW01BWF9DTEFTU0VTXTsKKyAgICAgIGludCBuID0gZXhhbWluZV9hcmd1bWVudCAoY2lmLT5ydHlwZSwgY2xhc3NlcywgMSwgJm5ncHIsICZuc3NlKTsKKyAgICAgIGlmIChuID09IDApCisJeworCSAgLyogVGhlIHJldHVybiB2YWx1ZSBnb2VzIGluIG1lbW9yeS4gIEFycmFuZ2UgZm9yIHRoZSBjbG9zdXJlCisJICAgICByZXR1cm4gdmFsdWUgdG8gZ28gZGlyZWN0bHkgYmFjayB0byB0aGUgb3JpZ2luYWwgY2FsbGVyLiAgKi8KKwkgIHJ2YWx1ZSA9ICh2b2lkICopIHJlZ19hcmdzLT5ncHJbZ3ByY291bnQrK107CisJICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGluIGFzbSBmb3IgdGhlIHJldHVybi4gICovCisJICByZXQgPSBGRklfVFlQRV9WT0lEOworCX0KKyAgICAgIGVsc2UgaWYgKHJldCA9PSBGRklfVFlQRV9TVFJVQ1QgJiYgbiA9PSAyKQorCXsKKwkgIC8qIE1hcmsgd2hpY2ggcmVnaXN0ZXIgdGhlIHNlY29uZCB3b3JkIG9mIHRoZSBzdHJ1Y3R1cmUgZ29lcyBpbi4gICovCisJICBfQm9vbCBzc2UwID0gU1NFX0NMQVNTX1AgKGNsYXNzZXNbMF0pOworCSAgX0Jvb2wgc3NlMSA9IFNTRV9DTEFTU19QIChjbGFzc2VzWzFdKTsKKwkgIGlmICghc3NlMCAmJiBzc2UxKQorCSAgICByZXQgfD0gMSA8PCA4OworCSAgZWxzZSBpZiAoc3NlMCAmJiAhc3NlMSkKKwkgICAgcmV0IHw9IDEgPDwgOTsKKwl9CisgICAgfQorCisgIGF2biA9IGNpZi0+bmFyZ3M7CisgIGFyZ190eXBlcyA9IGNpZi0+YXJnX3R5cGVzOworICAKKyAgZm9yIChpID0gMDsgaSA8IGF2bjsgKytpKQorICAgIHsKKyAgICAgIGVudW0geDg2XzY0X3JlZ19jbGFzcyBjbGFzc2VzW01BWF9DTEFTU0VTXTsKKyAgICAgIGludCBuOworCisgICAgICBuID0gZXhhbWluZV9hcmd1bWVudCAoYXJnX3R5cGVzW2ldLCBjbGFzc2VzLCAwLCAmbmdwciwgJm5zc2UpOworICAgICAgaWYgKG4gPT0gMAorCSAgfHwgZ3ByY291bnQgKyBuZ3ByID4gTUFYX0dQUl9SRUdTCisJICB8fCBzc2Vjb3VudCArIG5zc2UgPiBNQVhfU1NFX1JFR1MpCisJeworCSAgbG9uZyBhbGlnbiA9IGFyZ190eXBlc1tpXS0+YWxpZ25tZW50OworCisJICAvKiBTdGFjayBhcmd1bWVudHMgYXJlICphbHdheXMqIGF0IGxlYXN0IDggYnl0ZSBhbGlnbmVkLiAgKi8KKwkgIGlmIChhbGlnbiA8IDgpCisJICAgIGFsaWduID0gODsKKworCSAgLyogUGFzcyB0aGlzIGFyZ3VtZW50IGluIG1lbW9yeS4gICovCisJICBhcmdwID0gKHZvaWQgKikgQUxJR04gKGFyZ3AsIGFsaWduKTsKKwkgIGF2YWx1ZVtpXSA9IGFyZ3A7CisJICBhcmdwICs9IGFyZ190eXBlc1tpXS0+c2l6ZTsKKwl9CisgICAgICAvKiBJZiB0aGUgYXJndW1lbnQgaXMgaW4gYSBzaW5nbGUgcmVnaXN0ZXIsIG9yIHR3byBjb25zZWN1dGl2ZQorCSBpbnRlZ2VyIHJlZ2lzdGVycywgdGhlbiB3ZSBjYW4gdXNlIHRoYXQgYWRkcmVzcyBkaXJlY3RseS4gICovCisgICAgICBlbHNlIGlmIChuID09IDEKKwkgICAgICAgfHwgKG4gPT0gMiAmJiAhKFNTRV9DTEFTU19QIChjbGFzc2VzWzBdKQorCQkJICAgICAgIHx8IFNTRV9DTEFTU19QIChjbGFzc2VzWzFdKSkpKQorCXsKKwkgIC8qIFRoZSBhcmd1bWVudCBpcyBpbiBhIHNpbmdsZSByZWdpc3Rlci4gICovCisJICBpZiAoU1NFX0NMQVNTX1AgKGNsYXNzZXNbMF0pKQorCSAgICB7CisJICAgICAgYXZhbHVlW2ldID0gJnJlZ19hcmdzLT5zc2Vbc3NlY291bnRdOworCSAgICAgIHNzZWNvdW50ICs9IG47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGF2YWx1ZVtpXSA9ICZyZWdfYXJncy0+Z3ByW2dwcmNvdW50XTsKKwkgICAgICBncHJjb3VudCArPSBuOworCSAgICB9CisJfQorICAgICAgLyogT3RoZXJ3aXNlLCBhbGxvY2F0ZSBzcGFjZSB0byBtYWtlIHRoZW0gY29uc2VjdXRpdmUuICAqLworICAgICAgZWxzZQorCXsKKwkgIGNoYXIgKmEgPSBhbGxvY2EgKDE2KTsKKwkgIGludCBqOworCisJICBhdmFsdWVbaV0gPSBhOworCSAgZm9yIChqID0gMDsgaiA8IG47IGorKywgYSArPSA4KQorCSAgICB7CisJICAgICAgaWYgKFNTRV9DTEFTU19QIChjbGFzc2VzW2pdKSkKKwkJbWVtY3B5IChhLCAmcmVnX2FyZ3MtPnNzZVtzc2Vjb3VudCsrXSwgOCk7CisJICAgICAgZWxzZQorCQltZW1jcHkgKGEsICZyZWdfYXJncy0+Z3ByW2dwcmNvdW50KytdLCA4KTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSW52b2tlIHRoZSBjbG9zdXJlLiAgKi8KKyAgY2xvc3VyZS0+ZnVuIChjaWYsIHJ2YWx1ZSwgYXZhbHVlLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIC8qIFRlbGwgYXNzZW1ibHkgaG93IHRvIHBlcmZvcm0gcmV0dXJuIHR5cGUgcHJvbW90aW9ucy4gICovCisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBfX3g4Nl82NF9fICovCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni9mZml0YXJnZXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L2ZmaXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmU2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni9mZml0YXJnZXQuaApAQCAtMCwwICsxLDEyMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KKyAgIGZmaXRhcmdldC5oIC0gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDMsIDIwMTAgIFJlZCBIYXQsIEluYy4KKyAgIENvcHlyaWdodCAoQykgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRhcmdldCBjb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgeDg2IGFuZCB4ODYtNjQuCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKKyNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICisKKy8qIC0tLS0gU3lzdGVtIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEZvciBjb2RlIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zIG9uIHg4NiBhbmQgeDg2XzY0LiAqLworI2RlZmluZSBYODZfQU5ZCisKKyNpZiBkZWZpbmVkIChYODZfNjQpICYmIGRlZmluZWQgKF9faTM4Nl9fKQorI3VuZGVmIFg4Nl82NAorI2RlZmluZSBYODYKKyNlbmRpZgorCisjaWZkZWYgWDg2X1dJTjY0CisjZGVmaW5lIEZGSV9TSVpFT0ZfQVJHIDgKKyNkZWZpbmUgVVNFX0JVSUxUSU5fRkZTIDAgLyogbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtaW5ndy02NCAqLworI2VuZGlmCisKKy8qIC0tLS0gR2VuZXJpYyB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElCRkZJX0FTTQorI2lmZGVmIFg4Nl9XSU42NAorI2lmZGVmIF9NU0NfVkVSCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgICAgZmZpX2FyZzsKK3R5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICAgICBmZmlfc2FyZzsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgZmZpX2FyZzsKK3R5cGVkZWYgbG9uZyBsb25nICAgICAgICAgICAgICBmZmlfc2FyZzsKKyNlbmRpZgorI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBmZmlfYXJnOwordHlwZWRlZiBzaWduZWQgbG9uZyAgICAgICAgICAgIGZmaV9zYXJnOworI2VuZGlmCisKK3R5cGVkZWYgZW51bSBmZmlfYWJpIHsKKyAgRkZJX0ZJUlNUX0FCSSA9IDAsCisKKyAgLyogLS0tLSBJbnRlbCB4ODYgV2luMzIgLS0tLS0tLS0tLSAqLworI2lmZGVmIFg4Nl9XSU4zMgorICBGRklfU1lTViwKKyAgRkZJX1NURENBTEwsCisgIEZGSV9MQVNUX0FCSSwKKyAgLyogVE9ETzogQWRkIGZhc3RjYWxsIHN1cHBvcnQgZm9yIHRoZSBzYWtlIG9mIGNvbXBsZXRlbmVzcyAqLworICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgorCisjZWxpZiBkZWZpbmVkKFg4Nl9XSU42NCkKKyAgRkZJX1dJTjY0LAorICBGRklfTEFTVF9BQkksCisgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9XSU42NAorCisjZWxzZQorICAvKiAtLS0tIEludGVsIHg4NiBhbmQgQU1EIHg4Ni02NCAtICovCisgIEZGSV9TWVNWLAorICBGRklfVU5JWDY0LCAgIC8qIFVuaXggdmFyaWFudHMgYWxsIHVzZSB0aGUgc2FtZSBBQkkgZm9yIHg4Ni02NCAgKi8KKyAgRkZJX0xBU1RfQUJJLAorI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pMzg2KQorICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTVgorI2Vsc2UKKyAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1VOSVg2NAorI2VuZGlmCisjZW5kaWYKK30gZmZpX2FiaTsKKyNlbmRpZgorCisvKiAtLS0tIERlZmluaXRpb25zIGZvciBjbG9zdXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEZGSV9DTE9TVVJFUyAxCisjZGVmaW5lIEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQiAoRkZJX1RZUEVfTEFTVCArIDEpCisjZGVmaW5lIEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8yQiAoRkZJX1RZUEVfTEFTVCArIDIpCisjZGVmaW5lIEZGSV9UWVBFX1NNQUxMX1NUUlVDVF80QiAoRkZJX1RZUEVfTEFTVCArIDMpCisKKyNpZiBkZWZpbmVkIChYODZfNjQpIHx8IChkZWZpbmVkIChfX3g4Nl82NF9fKSAmJiBkZWZpbmVkIChYODZfREFSV0lOKSkKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAyNAorI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMAorI2Vsc2UKKyNpZmRlZiBYODZfV0lOMzIKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAxMworI2Vsc2UKKyNpZmRlZiBYODZfV0lONjQKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAyOQorI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMAorI2RlZmluZSBGRklfTk9fUkFXX0FQSSAxCisjZWxzZQorI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDEwCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBYODZfV0lONjQKKyNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDEJLyogeDg2IGhhcyBuYXRpdmUgcmF3IGFwaSBzdXBwb3J0ICovCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvZnJlZWJzZC5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvZnJlZWJzZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZGU1MTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni9mcmVlYnNkLlMKQEAgLTAsMCArMSw0NTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBmcmVlYnNkLlMgLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTgsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIFJlZCBIYXQsIEluYy4KKwkgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4ICBCasO2cm4gS8O2bmlnCisJCisgICBYODYgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgZm9yIEZyZWVCU0QKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICAgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfX3g4Nl82NF9fCisKKyNkZWZpbmUgTElCRkZJX0FTTQkKKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworLnRleHQKKworLmdsb2JsIGZmaV9wcmVwX2FyZ3MKKworCS5hbGlnbiA0CisuZ2xvYmwgZmZpX2NhbGxfU1lTVgorICAgICAgICAudHlwZSAgICBmZmlfY2FsbF9TWVNWLEBmdW5jdGlvbgorCitmZmlfY2FsbF9TWVNWOgorLkxGQjE6CisgICAgICAgIHB1c2hsICVlYnAKKy5MQ0ZJMDoKKyAgICAgICAgbW92bCAgJWVzcCwlZWJwCisuTENGSTE6CisJLyogTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLiAgKi8KKwltb3ZsICAxNiglZWJwKSwlZWN4CisJc3VibCAgJWVjeCwlZXNwCisKKwltb3ZsICAlZXNwLCVlYXgKKworCS8qIFBsYWNlIGFsbCBvZiB0aGUgZmZpX3ByZXBfYXJncyBpbiBwb3NpdGlvbiAgKi8KKwlwdXNobCAxMiglZWJwKQorCXB1c2hsICVlYXgKKwljYWxsICAqOCglZWJwKQorCisJLyogUmV0dXJuIHN0YWNrIHRvIHByZXZpb3VzIHN0YXRlIGFuZCBjYWxsIHRoZSBmdW5jdGlvbiAgKi8KKwlhZGRsICAkOCwlZXNwCQorCisJY2FsbCAgKjI4KCVlYnApCisKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZSAgKi8KKwltb3ZsICAyMCglZWJwKSwlZWN4CQorCisJLyogUHJvdGVjdCAlZXNpLiAgV2UncmUgZ29pbmcgdG8gcG9wIGl0IGluIHRoZSBlcGlsb2d1ZS4gICovCisJcHVzaGwgJWVzaQorCisJLyogSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuICAqLworCWNtcGwgICQwLDI0KCVlYnApCisJam5lICAwZgorCisJLyogRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlIAorCSAgIG9ibGlnZWQgdG8gaGFuZGxlIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4gICovCisJY21wbCAgJEZGSV9UWVBFX0ZMT0FULCVlY3gKKwlqbmUgICBub3JldHZhbAorCWZzdHAgICVzdCgwKQorCisgICAgICAgIGptcCAgIGVwaWxvZ3VlCisKKzA6CisJY2FsbCAgMWYKKworLkxzdG9yZV90YWJsZToKKwkubG9uZwlub3JldHZhbC0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1ZPSUQgKi8KKwkubG9uZwlyZXRpbnQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9JTlQgKi8KKwkubG9uZwlyZXRmbG9hdC0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX0ZMT0FUICovCisJLmxvbmcJcmV0ZG91YmxlLS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfRE9VQkxFICovCisJLmxvbmcJcmV0bG9uZ2RvdWJsZS0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX0xPTkdET1VCTEUgKi8KKwkubG9uZwlyZXR1aW50OC0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1VJTlQ4ICovCisJLmxvbmcJcmV0c2ludDgtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TSU5UOCAqLworCS5sb25nCXJldHVpbnQxNi0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1VJTlQxNiAqLworCS5sb25nCXJldHNpbnQxNi0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1NJTlQxNiAqLworCS5sb25nCXJldGludC0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1VJTlQzMiAqLworCS5sb25nCXJldGludC0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1NJTlQzMiAqLworCS5sb25nCXJldGludDY0LS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfVUlOVDY0ICovCisJLmxvbmcJcmV0aW50NjQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TSU5UNjQgKi8KKwkubG9uZwlyZXRzdHJ1Y3QtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TVFJVQ1QgKi8KKwkubG9uZwlyZXRpbnQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9QT0lOVEVSICovCisJLmxvbmcgICByZXRzdHJ1Y3QxYi0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQiAqLworCS5sb25nICAgcmV0c3RydWN0MmItLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIgKi8KKworMToKKwlwb3AgICVlc2kKKwlhZGQgICglZXNpLCAlZWN4LCA0KSwgJWVzaQorCWptcCAgKiVlc2kKKworCS8qIFNpZ24vemVybyBleHRlbmQgYXMgYXBwcm9wcmlhdGUuICAqLworcmV0c2ludDg6CisJbW92c2JsICAlYWwsICVlYXgKKwlqbXAgIHJldGludAorCityZXRzaW50MTY6CisJbW92c3dsICAlYXgsICVlYXgKKwlqbXAgIHJldGludAorCityZXR1aW50ODoKKwltb3Z6YmwgICVhbCwgJWVheAorCWptcCAgcmV0aW50CisKK3JldHVpbnQxNjoKKwltb3Z6d2wgICVheCwgJWVheAorCWptcCAgcmV0aW50CisKK3JldGZsb2F0OgorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAkKKwlmc3RwcyAoJWVjeCkKKwlqbXAgICBlcGlsb2d1ZQorCityZXRkb3VibGU6CisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CQorCWZzdHBsICglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldGxvbmdkb3VibGU6CisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CQorCWZzdHB0ICglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisJCityZXRpbnQ2NDoJCisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CQorCW1vdmwgICVlYXgsMCglZWN4KQorCW1vdmwgICVlZHgsNCglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisJCityZXRzdHJ1Y3QxYjoKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlICAqLworCW1vdmwgIDI0KCVlYnApLCVlY3gKKwltb3ZiICAlYWwsMCglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldHN0cnVjdDJiOgorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAorCW1vdncgICVheCwwKCVlY3gpCisJam1wICAgZXBpbG9ndWUKKworcmV0aW50OgorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAkKKwltb3ZsICAlZWF4LDAoJWVjeCkKKworcmV0c3RydWN0OgorCS8qIE5vdGhpbmcgdG8gZG8hICAqLworCitub3JldHZhbDoKK2VwaWxvZ3VlOgorICAgICAgICBwb3BsICVlc2kKKyAgICAgICAgbW92bCAlZWJwLCVlc3AKKyAgICAgICAgcG9wbCAlZWJwCisgICAgICAgIHJldAorLkxGRTE6CisuZmZpX2NhbGxfU1lTVl9lbmQ6CisgICAgICAgIC5zaXplICAgIGZmaV9jYWxsX1NZU1YsLmZmaV9jYWxsX1NZU1ZfZW5kLWZmaV9jYWxsX1NZU1YKKworCS5hbGlnbgk0CitGRklfSElEREVOIChmZmlfY2xvc3VyZV9TWVNWKQorLmdsb2JsIGZmaV9jbG9zdXJlX1NZU1YKKwkudHlwZQlmZmlfY2xvc3VyZV9TWVNWLCBAZnVuY3Rpb24KKworZmZpX2Nsb3N1cmVfU1lTVjoKKy5MRkIyOgorCXB1c2hsCSVlYnAKKy5MQ0ZJMjoKKwltb3ZsCSVlc3AsICVlYnAKKy5MQ0ZJMzoKKwlzdWJsCSQ0MCwgJWVzcAorCWxlYWwJLTI0KCVlYnApLCAlZWR4CisJbW92bAklZWR4LCAtMTIoJWVicCkJLyogcmVzcCAqLworCWxlYWwJOCglZWJwKSwgJWVkeAorCW1vdmwJJWVkeCwgNCglZXNwKQkvKiBhcmdzID0gX19idWlsdGluX2R3YXJmX2NmYSAoKSAqLworCWxlYWwJLTEyKCVlYnApLCAlZWR4CisJbW92bAklZWR4LCAoJWVzcCkJLyogJnJlc3AgKi8KKyNpZiBkZWZpbmVkIEhBVkVfSElEREVOX1ZJU0lCSUxJVFlfQVRUUklCVVRFIHx8ICFkZWZpbmVkIF9fUElDX18KKwljYWxsCWZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIKKyNlbHNlCisJbW92bAklZWJ4LCA4KCVlc3ApCisuTENGSTc6CisJY2FsbAkxZgorMToJcG9wbAklZWJ4CisJYWRkbAkkX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLTFiXSwgJWVieAorCWNhbGwJZmZpX2Nsb3N1cmVfU1lTVl9pbm5lckBQTFQKKwltb3ZsCTgoJWVzcCksICVlYngKKyNlbmRpZgorCW1vdmwJLTEyKCVlYnApLCAlZWN4CisJY21wbAkkRkZJX1RZUEVfSU5ULCAlZWF4CisJamUJLkxjbHNfcmV0aW50CisKKwkvKiBIYW5kbGUgRkZJX1RZUEVfVUlOVDgsIEZGSV9UWVBFX1NJTlQ4LCBGRklfVFlQRV9VSU5UMTYsCisJICAgRkZJX1RZUEVfU0lOVDE2LCBGRklfVFlQRV9VSU5UMzIsIEZGSV9UWVBFX1NJTlQzMi4gICovCisJY21wbAkkRkZJX1RZUEVfVUlOVDY0LCAlZWF4CisJamdlCTBmCisJY21wbAkkRkZJX1RZUEVfVUlOVDgsICVlYXgKKwlqZ2UJLkxjbHNfcmV0aW50CisJCiswOgljbXBsCSRGRklfVFlQRV9GTE9BVCwgJWVheAorCWplCS5MY2xzX3JldGZsb2F0CisJY21wbAkkRkZJX1RZUEVfRE9VQkxFLCAlZWF4CisJamUJLkxjbHNfcmV0ZG91YmxlCisJY21wbAkkRkZJX1RZUEVfTE9OR0RPVUJMRSwgJWVheAorCWplCS5MY2xzX3JldGxkb3VibGUKKwljbXBsCSRGRklfVFlQRV9TSU5UNjQsICVlYXgKKwlqZQkuTGNsc19yZXRsbG9uZworCWNtcGwJJEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQiwgJWVheAorCWplCS5MY2xzX3JldHN0cnVjdDFiCisJY21wbAkkRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCLCAlZWF4CisJamUJLkxjbHNfcmV0c3RydWN0MmIKKwljbXBsCSRGRklfVFlQRV9TVFJVQ1QsICVlYXgKKwlqZQkuTGNsc19yZXRzdHJ1Y3QKKy5MY2xzX2VwaWxvZ3VlOgorCW1vdmwJJWVicCwgJWVzcAorCXBvcGwJJWVicAorCXJldAorLkxjbHNfcmV0aW50OgorCW1vdmwJKCVlY3gpLCAlZWF4CisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRmbG9hdDoKKwlmbGRzCSglZWN4KQorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0ZG91YmxlOgorCWZsZGwJKCVlY3gpCisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRsZG91YmxlOgorCWZsZHQJKCVlY3gpCisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRsbG9uZzoKKwltb3ZsCSglZWN4KSwgJWVheAorCW1vdmwJNCglZWN4KSwgJWVkeAorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0c3RydWN0MWI6CisJbW92c2JsCSglZWN4KSwgJWVheAorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0c3RydWN0MmI6CisJbW92c3dsCSglZWN4KSwgJWVheAorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0c3RydWN0OgorCW1vdmwJJWVicCwgJWVzcAorCXBvcGwJJWVicAorCXJldAkkNAorLkxGRTI6CisJLnNpemUJZmZpX2Nsb3N1cmVfU1lTViwgLi1mZmlfY2xvc3VyZV9TWVNWCisKKyNpZiAhRkZJX05PX1JBV19BUEkKKworI2RlZmluZSBSQVdfQ0xPU1VSRV9DSUZfT0ZGU0VUICgoRkZJX1RSQU1QT0xJTkVfU0laRSArIDMpICYgfjMpCisjZGVmaW5lIFJBV19DTE9TVVJFX0ZVTl9PRkZTRVQgKFJBV19DTE9TVVJFX0NJRl9PRkZTRVQgKyA0KQorI2RlZmluZSBSQVdfQ0xPU1VSRV9VU0VSX0RBVEFfT0ZGU0VUIChSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUICsgNCkKKyNkZWZpbmUgQ0lGX0ZMQUdTX09GRlNFVCAyMAorCisJLmFsaWduCTQKK0ZGSV9ISURERU4gKGZmaV9jbG9zdXJlX3Jhd19TWVNWKQorLmdsb2JsIGZmaV9jbG9zdXJlX3Jhd19TWVNWCisJLnR5cGUJZmZpX2Nsb3N1cmVfcmF3X1NZU1YsIEBmdW5jdGlvbgorCitmZmlfY2xvc3VyZV9yYXdfU1lTVjoKKy5MRkIzOgorCXB1c2hsCSVlYnAKKy5MQ0ZJNDoKKwltb3ZsCSVlc3AsICVlYnAKKy5MQ0ZJNToKKwlwdXNobAklZXNpCisuTENGSTY6CisJc3VibAkkMzYsICVlc3AKKwltb3ZsCVJBV19DTE9TVVJFX0NJRl9PRkZTRVQoJWVheCksICVlc2kJIC8qIGNsb3N1cmUtPmNpZiAqLworCW1vdmwJUkFXX0NMT1NVUkVfVVNFUl9EQVRBX09GRlNFVCglZWF4KSwgJWVkeCAvKiBjbG9zdXJlLT51c2VyX2RhdGEgKi8KKwltb3ZsCSVlZHgsIDEyKCVlc3ApCS8qIHVzZXJfZGF0YSAqLworCWxlYWwJOCglZWJwKSwgJWVkeAkvKiBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpICovCisJbW92bAklZWR4LCA4KCVlc3ApCS8qIHJhd19hcmdzICovCisJbGVhbAktMjQoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsIDQoJWVzcCkJLyogJnJlcyAqLworCW1vdmwJJWVzaSwgKCVlc3ApCS8qIGNpZiAqLworCWNhbGwJKlJBV19DTE9TVVJFX0ZVTl9PRkZTRVQoJWVheCkJCSAvKiBjbG9zdXJlLT5mdW4gKi8KKwltb3ZsCUNJRl9GTEFHU19PRkZTRVQoJWVzaSksICVlYXgJCSAvKiBydHlwZSAqLworCWNtcGwJJEZGSV9UWVBFX0lOVCwgJWVheAorCWplCS5McmNsc19yZXRpbnQKKworCS8qIEhhbmRsZSBGRklfVFlQRV9VSU5UOCwgRkZJX1RZUEVfU0lOVDgsIEZGSV9UWVBFX1VJTlQxNiwKKwkgICBGRklfVFlQRV9TSU5UMTYsIEZGSV9UWVBFX1VJTlQzMiwgRkZJX1RZUEVfU0lOVDMyLiAgKi8KKwljbXBsCSRGRklfVFlQRV9VSU5UNjQsICVlYXgKKwlqZ2UJMGYKKwljbXBsCSRGRklfVFlQRV9VSU5UOCwgJWVheAorCWpnZQkuTHJjbHNfcmV0aW50CiswOgorCWNtcGwJJEZGSV9UWVBFX0ZMT0FULCAlZWF4CisJamUJLkxyY2xzX3JldGZsb2F0CisJY21wbAkkRkZJX1RZUEVfRE9VQkxFLCAlZWF4CisJamUJLkxyY2xzX3JldGRvdWJsZQorCWNtcGwJJEZGSV9UWVBFX0xPTkdET1VCTEUsICVlYXgKKwlqZQkuTHJjbHNfcmV0bGRvdWJsZQorCWNtcGwJJEZGSV9UWVBFX1NJTlQ2NCwgJWVheAorCWplCS5McmNsc19yZXRsbG9uZworLkxyY2xzX2VwaWxvZ3VlOgorCWFkZGwJJDM2LCAlZXNwCisJcG9wbAklZXNpCisJcG9wbAklZWJwCisJcmV0CisuTHJjbHNfcmV0aW50OgorCW1vdmwJLTI0KCVlYnApLCAlZWF4CisJam1wCS5McmNsc19lcGlsb2d1ZQorLkxyY2xzX3JldGZsb2F0OgorCWZsZHMJLTI0KCVlYnApCisJam1wCS5McmNsc19lcGlsb2d1ZQorLkxyY2xzX3JldGRvdWJsZToKKwlmbGRsCS0yNCglZWJwKQorCWptcAkuTHJjbHNfZXBpbG9ndWUKKy5McmNsc19yZXRsZG91YmxlOgorCWZsZHQJLTI0KCVlYnApCisJam1wCS5McmNsc19lcGlsb2d1ZQorLkxyY2xzX3JldGxsb25nOgorCW1vdmwJLTI0KCVlYnApLCAlZWF4CisJbW92bAktMjAoJWVicCksICVlZHgKKwlqbXAJLkxyY2xzX2VwaWxvZ3VlCisuTEZFMzoKKwkuc2l6ZQlmZmlfY2xvc3VyZV9yYXdfU1lTViwgLi1mZmlfY2xvc3VyZV9yYXdfU1lTVgorI2VuZGlmCisKKwkuc2VjdGlvbgkuZWhfZnJhbWUsRUhfRlJBTUVfRkxBR1MsQHByb2diaXRzCisuTGZyYW1lMToKKwkubG9uZwkuTEVDSUUxLS5MU0NJRTEJLyogTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeSAqLworLkxTQ0lFMToKKwkubG9uZwkweDAJLyogQ0lFIElkZW50aWZpZXIgVGFnICovCisJLmJ5dGUJMHgxCS8qIENJRSBWZXJzaW9uICovCisjaWZkZWYgX19QSUNfXworCS5hc2NpaSAielJcMCIJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworI2Vsc2UKKwkuYXNjaWkgIlwwIgkvKiBDSUUgQXVnbWVudGF0aW9uICovCisjZW5kaWYKKwkuYnl0ZQkweDEJLyogLnVsZWIxMjggMHgxOyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yICovCisJLmJ5dGUJMHg3YwkvKiAuc2xlYjEyOCAtNDsgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvciAqLworCS5ieXRlCTB4OAkvKiBDSUUgUkEgQ29sdW1uICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MQkvKiAudWxlYjEyOCAweDE7IEF1Z21lbnRhdGlvbiBzaXplICovCisJLmJ5dGUJMHgxYgkvKiBGREUgRW5jb2RpbmcgKHBjcmVsIHNkYXRhNCkgKi8KKyNlbmRpZgorCS5ieXRlCTB4YwkvKiBEV19DRkFfZGVmX2NmYSAqLworCS5ieXRlCTB4NAkvKiAudWxlYjEyOCAweDQgKi8KKwkuYnl0ZQkweDQJLyogLnVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg4OAkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4ICovCisJLmJ5dGUJMHgxCS8qIC51bGViMTI4IDB4MSAqLworCS5hbGlnbiA0CisuTEVDSUUxOgorLkxTRkRFMToKKwkubG9uZwkuTEVGREUxLS5MQVNGREUxCS8qIEZERSBMZW5ndGggKi8KKy5MQVNGREUxOgorCS5sb25nCS5MQVNGREUxLS5MZnJhbWUxCS8qIEZERSBDSUUgb2Zmc2V0ICovCisjaWZkZWYgX19QSUNfXworCS5sb25nCS5MRkIxLS4JLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbHNlCisJLmxvbmcJLkxGQjEJLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbmRpZgorCS5sb25nCS5MRkUxLS5MRkIxCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MAkvKiAudWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplICovCisjZW5kaWYKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMC0uTEZCMQorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDgJLyogLnVsZWIxMjggMHg4ICovCisJLmJ5dGUJMHg4NQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1ICovCisJLmJ5dGUJMHgyCS8qIC51bGViMTI4IDB4MiAqLworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxDRkkxLS5MQ0ZJMAorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciAqLworCS5ieXRlCTB4NQkvKiAudWxlYjEyOCAweDUgKi8KKwkuYWxpZ24gNAorLkxFRkRFMToKKy5MU0ZERTI6CisJLmxvbmcJLkxFRkRFMi0uTEFTRkRFMgkvKiBGREUgTGVuZ3RoICovCisuTEFTRkRFMjoKKwkubG9uZwkuTEFTRkRFMi0uTGZyYW1lMQkvKiBGREUgQ0lFIG9mZnNldCAqLworI2lmZGVmIF9fUElDX18KKwkubG9uZwkuTEZCMi0uCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisjZWxzZQorCS5sb25nCS5MRkIyCisjZW5kaWYKKwkubG9uZwkuTEZFMi0uTEZCMgkvKiBGREUgYWRkcmVzcyByYW5nZSAqLworI2lmZGVmIF9fUElDX18KKwkuYnl0ZQkweDAJLyogLnVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZSAqLworI2VuZGlmCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTENGSTItLkxGQjIKKwkuYnl0ZQkweGUJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUJMHg4CS8qIC51bGViMTI4IDB4OCAqLworCS5ieXRlCTB4ODUJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NSAqLworCS5ieXRlCTB4MgkvKiAudWxlYjEyOCAweDIgKi8KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMy0uTENGSTIKKwkuYnl0ZQkweGQJLyogRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgKi8KKwkuYnl0ZQkweDUJLyogLnVsZWIxMjggMHg1ICovCisjaWYgIWRlZmluZWQgSEFWRV9ISURERU5fVklTSUJJTElUWV9BVFRSSUJVVEUgJiYgZGVmaW5lZCBfX1BJQ19fCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTENGSTctLkxDRkkzCisJLmJ5dGUJMHg4MwkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHgzICovCisJLmJ5dGUJMHhhCS8qIC51bGViMTI4IDB4YSAqLworI2VuZGlmCisJLmFsaWduIDQKKy5MRUZERTI6CisKKyNpZiAhRkZJX05PX1JBV19BUEkKKworLkxTRkRFMzoKKwkubG9uZwkuTEVGREUzLS5MQVNGREUzCS8qIEZERSBMZW5ndGggKi8KKy5MQVNGREUzOgorCS5sb25nCS5MQVNGREUzLS5MZnJhbWUxCS8qIEZERSBDSUUgb2Zmc2V0ICovCisjaWZkZWYgX19QSUNfXworCS5sb25nCS5MRkIzLS4JLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbHNlCisJLmxvbmcJLkxGQjMKKyNlbmRpZgorCS5sb25nCS5MRkUzLS5MRkIzCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MAkvKiAudWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplICovCisjZW5kaWYKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJNC0uTEZCMworCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDgJLyogLnVsZWIxMjggMHg4ICovCisJLmJ5dGUJMHg4NQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1ICovCisJLmJ5dGUJMHgyCS8qIC51bGViMTI4IDB4MiAqLworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxDRkk1LS5MQ0ZJNAorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciAqLworCS5ieXRlCTB4NQkvKiAudWxlYjEyOCAweDUgKi8KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJNi0uTENGSTUKKwkuYnl0ZQkweDg2CS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDYgKi8KKwkuYnl0ZQkweDMJLyogLnVsZWIxMjggMHgzICovCisJLmFsaWduIDQKKy5MRUZERTM6CisKKyNlbmRpZgorCisjZW5kaWYgLyogaWZuZGVmIF9feDg2XzY0X18gKi8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L3N5c3YuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L3N5c3YuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA4ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvc3lzdi5TCkBAIC0wLDAgKzEsNDY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc3lzdi5TIC0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAyMDAxLTIwMDMsIDIwMDUsIDIwMDgsIDIwMTAgIFJlZCBIYXQsIEluYy4KKyAgIAorICAgWDg2IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9feDg2XzY0X18KKworI2RlZmluZSBMSUJGRklfQVNNCQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisudGV4dAorCisuZ2xvYmwgZmZpX3ByZXBfYXJncworCisJLmFsaWduIDQKKy5nbG9ibCBmZmlfY2FsbF9TWVNWCisgICAgICAgIC50eXBlICAgIGZmaV9jYWxsX1NZU1YsQGZ1bmN0aW9uCisKK2ZmaV9jYWxsX1NZU1Y6CisuTEZCMToKKyAgICAgICAgcHVzaGwgJWVicAorLkxDRkkwOgorICAgICAgICBtb3ZsICAlZXNwLCVlYnAKKy5MQ0ZJMToKKwkvKiBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuICAqLworCW1vdmwgIDE2KCVlYnApLCVlY3gKKwlzdWJsICAlZWN4LCVlc3AKKworICAgICAgICAvKiBBbGlnbiB0aGUgc3RhY2sgcG9pbnRlciB0byAxNi1ieXRlcyAqLworICAgICAgICBhbmRsICAkMHhmZmZmZmZmMCwgJWVzcAorCisJbW92bCAgJWVzcCwlZWF4CisKKwkvKiBQbGFjZSBhbGwgb2YgdGhlIGZmaV9wcmVwX2FyZ3MgaW4gcG9zaXRpb24gICovCisJcHVzaGwgMTIoJWVicCkKKwlwdXNobCAlZWF4CisJY2FsbCAgKjgoJWVicCkKKworCS8qIFJldHVybiBzdGFjayB0byBwcmV2aW91cyBzdGF0ZSBhbmQgY2FsbCB0aGUgZnVuY3Rpb24gICovCisJYWRkbCAgJDgsJWVzcAkKKworCWNhbGwgICoyOCglZWJwKQorCisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUgICovCisJbW92bCAgMjAoJWVicCksJWVjeAkKKworCS8qIFByb3RlY3QgJWVzaS4gIFdlJ3JlIGdvaW5nIHRvIHBvcCBpdCBpbiB0aGUgZXBpbG9ndWUuICAqLworCXB1c2hsICVlc2kKKworCS8qIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLiAgKi8KKwljbXBsICAkMCwyNCglZWJwKQorCWpuZSAgMGYKKworCS8qIEV2ZW4gaWYgdGhlcmUgaXMgbm8gc3BhY2UgZm9yIHRoZSByZXR1cm4gdmFsdWUsIHdlIGFyZSAKKwkgICBvYmxpZ2VkIHRvIGhhbmRsZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMuICAqLworCWNtcGwgICRGRklfVFlQRV9GTE9BVCwlZWN4CisJam5lICAgbm9yZXR2YWwKKwlmc3RwICAlc3QoMCkKKworICAgICAgICBqbXAgICBlcGlsb2d1ZQorCiswOgorCWNhbGwgIDFmCisKKy5Mc3RvcmVfdGFibGU6CisJLmxvbmcJbm9yZXR2YWwtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9WT0lEICovCisJLmxvbmcJcmV0aW50LS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfSU5UICovCisJLmxvbmcJcmV0ZmxvYXQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9GTE9BVCAqLworCS5sb25nCXJldGRvdWJsZS0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX0RPVUJMRSAqLworCS5sb25nCXJldGxvbmdkb3VibGUtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9MT05HRE9VQkxFICovCisJLmxvbmcJcmV0dWludDgtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9VSU5UOCAqLworCS5sb25nCXJldHNpbnQ4LS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfU0lOVDggKi8KKwkubG9uZwlyZXR1aW50MTYtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9VSU5UMTYgKi8KKwkubG9uZwlyZXRzaW50MTYtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TSU5UMTYgKi8KKwkubG9uZwlyZXRpbnQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9VSU5UMzIgKi8KKwkubG9uZwlyZXRpbnQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TSU5UMzIgKi8KKwkubG9uZwlyZXRpbnQ2NC0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1VJTlQ2NCAqLworCS5sb25nCXJldGludDY0LS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfU0lOVDY0ICovCisJLmxvbmcJcmV0c3RydWN0LS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfU1RSVUNUICovCisJLmxvbmcJcmV0aW50LS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfUE9JTlRFUiAqLworCisxOgorCXBvcCAgJWVzaQorCWFkZCAgKCVlc2ksICVlY3gsIDQpLCAlZXNpCisJam1wICAqJWVzaQorCisJLyogU2lnbi96ZXJvIGV4dGVuZCBhcyBhcHByb3ByaWF0ZS4gICovCityZXRzaW50ODoKKwltb3ZzYmwgICVhbCwgJWVheAorCWptcCAgcmV0aW50CisKK3JldHNpbnQxNjoKKwltb3Zzd2wgICVheCwgJWVheAorCWptcCAgcmV0aW50CisKK3JldHVpbnQ4OgorCW1vdnpibCAgJWFsLCAlZWF4CisJam1wICByZXRpbnQKKworcmV0dWludDE2OgorCW1vdnp3bCAgJWF4LCAlZWF4CisJam1wICByZXRpbnQKKworcmV0ZmxvYXQ6CisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CQorCWZzdHBzICglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldGRvdWJsZToKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlICAqLworCW1vdmwgIDI0KCVlYnApLCVlY3gJCisJZnN0cGwgKCVlY3gpCisJam1wICAgZXBpbG9ndWUKKworcmV0bG9uZ2RvdWJsZToKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlICAqLworCW1vdmwgIDI0KCVlYnApLCVlY3gJCisJZnN0cHQgKCVlY3gpCisJam1wICAgZXBpbG9ndWUKKwkKK3JldGludDY0OgkKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlICAqLworCW1vdmwgIDI0KCVlYnApLCVlY3gJCisJbW92bCAgJWVheCwwKCVlY3gpCisJbW92bCAgJWVkeCw0KCVlY3gpCisJam1wICAgZXBpbG9ndWUKKwkKK3JldGludDoKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlICAqLworCW1vdmwgIDI0KCVlYnApLCVlY3gJCisJbW92bCAgJWVheCwwKCVlY3gpCisKK3JldHN0cnVjdDoKKwkvKiBOb3RoaW5nIHRvIGRvISAgKi8KKworbm9yZXR2YWw6CitlcGlsb2d1ZToKKyAgICAgICAgcG9wbCAlZXNpCisgICAgICAgIG1vdmwgJWVicCwlZXNwCisgICAgICAgIHBvcGwgJWVicAorICAgICAgICByZXQKKy5MRkUxOgorLmZmaV9jYWxsX1NZU1ZfZW5kOgorICAgICAgICAuc2l6ZSAgICBmZmlfY2FsbF9TWVNWLC5mZmlfY2FsbF9TWVNWX2VuZC1mZmlfY2FsbF9TWVNWCisKKwkuYWxpZ24JNAorRkZJX0hJRERFTiAoZmZpX2Nsb3N1cmVfU1lTVikKKy5nbG9ibCBmZmlfY2xvc3VyZV9TWVNWCisJLnR5cGUJZmZpX2Nsb3N1cmVfU1lTViwgQGZ1bmN0aW9uCisKK2ZmaV9jbG9zdXJlX1NZU1Y6CisuTEZCMjoKKwlwdXNobAklZWJwCisuTENGSTI6CisJbW92bAklZXNwLCAlZWJwCisuTENGSTM6CisJc3VibAkkNDAsICVlc3AKKwlsZWFsCS0yNCglZWJwKSwgJWVkeAorCW1vdmwJJWVkeCwgLTEyKCVlYnApCS8qIHJlc3AgKi8KKwlsZWFsCTgoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsIDQoJWVzcCkJLyogYXJncyA9IF9fYnVpbHRpbl9kd2FyZl9jZmEgKCkgKi8KKwlsZWFsCS0xMiglZWJwKSwgJWVkeAorCW1vdmwJJWVkeCwgKCVlc3ApCS8qICZyZXNwICovCisjaWYgZGVmaW5lZCBIQVZFX0hJRERFTl9WSVNJQklMSVRZX0FUVFJJQlVURSB8fCAhZGVmaW5lZCBfX1BJQ19fCisJY2FsbAlmZmlfY2xvc3VyZV9TWVNWX2lubmVyCisjZWxzZQorCW1vdmwJJWVieCwgOCglZXNwKQorLkxDRkk3OgorCWNhbGwJMWYKKzE6CXBvcGwJJWVieAorCWFkZGwJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0xYl0sICVlYngKKwljYWxsCWZmaV9jbG9zdXJlX1NZU1ZfaW5uZXJAUExUCisJbW92bAk4KCVlc3ApLCAlZWJ4CisjZW5kaWYKKwltb3ZsCS0xMiglZWJwKSwgJWVjeAorCWNtcGwJJEZGSV9UWVBFX0lOVCwgJWVheAorCWplCS5MY2xzX3JldGludAorCisJLyogSGFuZGxlIEZGSV9UWVBFX1VJTlQ4LCBGRklfVFlQRV9TSU5UOCwgRkZJX1RZUEVfVUlOVDE2LAorCSAgIEZGSV9UWVBFX1NJTlQxNiwgRkZJX1RZUEVfVUlOVDMyLCBGRklfVFlQRV9TSU5UMzIuICAqLworCWNtcGwJJEZGSV9UWVBFX1VJTlQ2NCwgJWVheAorCWpnZQkwZgorCWNtcGwJJEZGSV9UWVBFX1VJTlQ4LCAlZWF4CisJamdlCS5MY2xzX3JldGludAorCQorMDoJY21wbAkkRkZJX1RZUEVfRkxPQVQsICVlYXgKKwlqZQkuTGNsc19yZXRmbG9hdAorCWNtcGwJJEZGSV9UWVBFX0RPVUJMRSwgJWVheAorCWplCS5MY2xzX3JldGRvdWJsZQorCWNtcGwJJEZGSV9UWVBFX0xPTkdET1VCTEUsICVlYXgKKwlqZQkuTGNsc19yZXRsZG91YmxlCisJY21wbAkkRkZJX1RZUEVfU0lOVDY0LCAlZWF4CisJamUJLkxjbHNfcmV0bGxvbmcKKwljbXBsCSRGRklfVFlQRV9TVFJVQ1QsICVlYXgKKwlqZQkuTGNsc19yZXRzdHJ1Y3QKKy5MY2xzX2VwaWxvZ3VlOgorCW1vdmwJJWVicCwgJWVzcAorCXBvcGwJJWVicAorCXJldAorLkxjbHNfcmV0aW50OgorCW1vdmwJKCVlY3gpLCAlZWF4CisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRmbG9hdDoKKwlmbGRzCSglZWN4KQorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0ZG91YmxlOgorCWZsZGwJKCVlY3gpCisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRsZG91YmxlOgorCWZsZHQJKCVlY3gpCisJam1wCS5MY2xzX2VwaWxvZ3VlCisuTGNsc19yZXRsbG9uZzoKKwltb3ZsCSglZWN4KSwgJWVheAorCW1vdmwJNCglZWN4KSwgJWVkeAorCWptcAkuTGNsc19lcGlsb2d1ZQorLkxjbHNfcmV0c3RydWN0OgorCW1vdmwJJWVicCwgJWVzcAorCXBvcGwJJWVicAorCXJldAkkNAorLkxGRTI6CisJLnNpemUJZmZpX2Nsb3N1cmVfU1lTViwgLi1mZmlfY2xvc3VyZV9TWVNWCisKKyNpZiAhRkZJX05PX1JBV19BUEkKKworLyogUHJlY2FsY3VsYXRlIGZvciBlLmcuIHRoZSBTb2xhcmlzIDEwL3g4NiBhc3NlbWJsZXIuICAqLworI2lmIEZGSV9UUkFNUE9MSU5FX1NJWkUgPT0gMTAKKyNkZWZpbmUgUkFXX0NMT1NVUkVfQ0lGX09GRlNFVCAxMgorI2RlZmluZSBSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUIDE2CisjZGVmaW5lIFJBV19DTE9TVVJFX1VTRVJfREFUQV9PRkZTRVQgMjAKKyNlbGlmIEZGSV9UUkFNUE9MSU5FX1NJWkUgPT0gMjQKKyNkZWZpbmUgUkFXX0NMT1NVUkVfQ0lGX09GRlNFVCAyNAorI2RlZmluZSBSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUIDI4CisjZGVmaW5lIFJBV19DTE9TVVJFX1VTRVJfREFUQV9PRkZTRVQgMzIKKyNlbHNlCisjZGVmaW5lIFJBV19DTE9TVVJFX0NJRl9PRkZTRVQgKChGRklfVFJBTVBPTElORV9TSVpFICsgMykgJiB+MykKKyNkZWZpbmUgUkFXX0NMT1NVUkVfRlVOX09GRlNFVCAoUkFXX0NMT1NVUkVfQ0lGX09GRlNFVCArIDQpCisjZGVmaW5lIFJBV19DTE9TVVJFX1VTRVJfREFUQV9PRkZTRVQgKFJBV19DTE9TVVJFX0ZVTl9PRkZTRVQgKyA0KQorI2VuZGlmCisjZGVmaW5lIENJRl9GTEFHU19PRkZTRVQgMjAKKworCS5hbGlnbgk0CitGRklfSElEREVOIChmZmlfY2xvc3VyZV9yYXdfU1lTVikKKy5nbG9ibCBmZmlfY2xvc3VyZV9yYXdfU1lTVgorCS50eXBlCWZmaV9jbG9zdXJlX3Jhd19TWVNWLCBAZnVuY3Rpb24KKworZmZpX2Nsb3N1cmVfcmF3X1NZU1Y6CisuTEZCMzoKKwlwdXNobAklZWJwCisuTENGSTQ6CisJbW92bAklZXNwLCAlZWJwCisuTENGSTU6CisJcHVzaGwJJWVzaQorLkxDRkk2OgorCXN1YmwJJDM2LCAlZXNwCisJbW92bAlSQVdfQ0xPU1VSRV9DSUZfT0ZGU0VUKCVlYXgpLCAlZXNpCSAvKiBjbG9zdXJlLT5jaWYgKi8KKwltb3ZsCVJBV19DTE9TVVJFX1VTRVJfREFUQV9PRkZTRVQoJWVheCksICVlZHggLyogY2xvc3VyZS0+dXNlcl9kYXRhICovCisJbW92bAklZWR4LCAxMiglZXNwKQkvKiB1c2VyX2RhdGEgKi8KKwlsZWFsCTgoJWVicCksICVlZHgJLyogX19idWlsdGluX2R3YXJmX2NmYSAoKSAqLworCW1vdmwJJWVkeCwgOCglZXNwKQkvKiByYXdfYXJncyAqLworCWxlYWwJLTI0KCVlYnApLCAlZWR4CisJbW92bAklZWR4LCA0KCVlc3ApCS8qICZyZXMgKi8KKwltb3ZsCSVlc2ksICglZXNwKQkvKiBjaWYgKi8KKwljYWxsCSpSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUKCVlYXgpCQkgLyogY2xvc3VyZS0+ZnVuICovCisJbW92bAlDSUZfRkxBR1NfT0ZGU0VUKCVlc2kpLCAlZWF4CQkgLyogcnR5cGUgKi8KKwljbXBsCSRGRklfVFlQRV9JTlQsICVlYXgKKwlqZQkuTHJjbHNfcmV0aW50CisKKwkvKiBIYW5kbGUgRkZJX1RZUEVfVUlOVDgsIEZGSV9UWVBFX1NJTlQ4LCBGRklfVFlQRV9VSU5UMTYsCisJICAgRkZJX1RZUEVfU0lOVDE2LCBGRklfVFlQRV9VSU5UMzIsIEZGSV9UWVBFX1NJTlQzMi4gICovCisJY21wbAkkRkZJX1RZUEVfVUlOVDY0LCAlZWF4CisJamdlCTBmCisJY21wbAkkRkZJX1RZUEVfVUlOVDgsICVlYXgKKwlqZ2UJLkxyY2xzX3JldGludAorMDoKKwljbXBsCSRGRklfVFlQRV9GTE9BVCwgJWVheAorCWplCS5McmNsc19yZXRmbG9hdAorCWNtcGwJJEZGSV9UWVBFX0RPVUJMRSwgJWVheAorCWplCS5McmNsc19yZXRkb3VibGUKKwljbXBsCSRGRklfVFlQRV9MT05HRE9VQkxFLCAlZWF4CisJamUJLkxyY2xzX3JldGxkb3VibGUKKwljbXBsCSRGRklfVFlQRV9TSU5UNjQsICVlYXgKKwlqZQkuTHJjbHNfcmV0bGxvbmcKKy5McmNsc19lcGlsb2d1ZToKKwlhZGRsCSQzNiwgJWVzcAorCXBvcGwJJWVzaQorCXBvcGwJJWVicAorCXJldAorLkxyY2xzX3JldGludDoKKwltb3ZsCS0yNCglZWJwKSwgJWVheAorCWptcAkuTHJjbHNfZXBpbG9ndWUKKy5McmNsc19yZXRmbG9hdDoKKwlmbGRzCS0yNCglZWJwKQorCWptcAkuTHJjbHNfZXBpbG9ndWUKKy5McmNsc19yZXRkb3VibGU6CisJZmxkbAktMjQoJWVicCkKKwlqbXAJLkxyY2xzX2VwaWxvZ3VlCisuTHJjbHNfcmV0bGRvdWJsZToKKwlmbGR0CS0yNCglZWJwKQorCWptcAkuTHJjbHNfZXBpbG9ndWUKKy5McmNsc19yZXRsbG9uZzoKKwltb3ZsCS0yNCglZWJwKSwgJWVheAorCW1vdmwJLTIwKCVlYnApLCAlZWR4CisJam1wCS5McmNsc19lcGlsb2d1ZQorLkxGRTM6CisJLnNpemUJZmZpX2Nsb3N1cmVfcmF3X1NZU1YsIC4tZmZpX2Nsb3N1cmVfcmF3X1NZU1YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1BJQ19fCisjIGlmIGRlZmluZWQgX19zdW5fXyAmJiBkZWZpbmVkIF9fc3ZyNF9fCisvKiAzMi1iaXQgU29sYXJpcyAyL3g4NiB1c2VzIGRhdGFyZWwgZW5jb2RpbmcgZm9yIFBJQy4gIEdOVSBsZCBiZWZvcmUgMi4yMgorICAgZG9lc24ndCBjb3JyZWN0bHkgc29ydCAuZWhfZnJhbWVfaGRyIHdpdGggbWl4ZWQgZW5jb2RpbmdzLCBzbyBtYXRjaCB0aGlzLiAgKi8KKyMgIGRlZmluZSBGREVfRU5DT0RJTkcJCTB4MzAJLyogZGF0YXJlbCAqLworIyAgZGVmaW5lIEZERV9FTkNPREUoWCkJCVhAR09UT0ZGCisjIGVsc2UKKyMgIGRlZmluZSBGREVfRU5DT0RJTkcJCTB4MWIJLyogcGNyZWwgc2RhdGE0ICovCisjICBpZiBkZWZpbmVkIEhBVkVfQVNfWDg2X1BDUkVMCisjICAgZGVmaW5lIEZERV9FTkNPREUoWCkJWC0uCisjICBlbHNlCisjICAgZGVmaW5lIEZERV9FTkNPREUoWCkJWEByZWwKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgRkRFX0VOQ09ESU5HCQkwCS8qIGFic29sdXRlICovCisjIGRlZmluZSBGREVfRU5DT0RFKFgpCQlYCisjZW5kaWYKKworCS5zZWN0aW9uCS5laF9mcmFtZSxFSF9GUkFNRV9GTEFHUyxAcHJvZ2JpdHMKKy5MZnJhbWUxOgorCS5sb25nCS5MRUNJRTEtLkxTQ0lFMQkvKiBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5ICovCisuTFNDSUUxOgorCS5sb25nCTB4MAkvKiBDSUUgSWRlbnRpZmllciBUYWcgKi8KKwkuYnl0ZQkweDEJLyogQ0lFIFZlcnNpb24gKi8KKyNpZmRlZiBIQVZFX0FTX0FTQ0lJX1BTRVVET19PUAorI2lmZGVmIF9fUElDX18KKwkuYXNjaWkgInpSXDAiCS8qIENJRSBBdWdtZW50YXRpb24gKi8KKyNlbHNlCisJLmFzY2lpICJcMCIJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworI2VuZGlmCisjZWxpZiBkZWZpbmVkIEhBVkVfQVNfU1RSSU5HX1BTRVVET19PUAorI2lmZGVmIF9fUElDX18KKwkuc3RyaW5nICJ6UiIJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworI2Vsc2UKKwkuc3RyaW5nICIiCS8qIENJRSBBdWdtZW50YXRpb24gKi8KKyNlbmRpZgorI2Vsc2UKKyNlcnJvciBtaXNzaW5nIC5hc2NpaS8uc3RyaW5nCisjZW5kaWYKKwkuYnl0ZQkweDEJLyogLnVsZWIxMjggMHgxOyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yICovCisJLmJ5dGUJMHg3YwkvKiAuc2xlYjEyOCAtNDsgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvciAqLworCS5ieXRlCTB4OAkvKiBDSUUgUkEgQ29sdW1uICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MQkvKiAudWxlYjEyOCAweDE7IEF1Z21lbnRhdGlvbiBzaXplICovCisJLmJ5dGUJRkRFX0VOQ09ESU5HCisjZW5kaWYKKwkuYnl0ZQkweGMJLyogRFdfQ0ZBX2RlZl9jZmEgKi8KKwkuYnl0ZQkweDQJLyogLnVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg0CS8qIC51bGViMTI4IDB4NCAqLworCS5ieXRlCTB4ODgJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OCAqLworCS5ieXRlCTB4MQkvKiAudWxlYjEyOCAweDEgKi8KKwkuYWxpZ24gNAorLkxFQ0lFMToKKy5MU0ZERTE6CisJLmxvbmcJLkxFRkRFMS0uTEFTRkRFMQkvKiBGREUgTGVuZ3RoICovCisuTEFTRkRFMToKKwkubG9uZwkuTEFTRkRFMS0uTGZyYW1lMQkvKiBGREUgQ0lFIG9mZnNldCAqLworCS5sb25nCUZERV9FTkNPREUoLkxGQjEpCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisJLmxvbmcJLkxGRTEtLkxGQjEJCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MAkvKiAudWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplICovCisjZW5kaWYKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMC0uTEZCMQorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDgJLyogLnVsZWIxMjggMHg4ICovCisJLmJ5dGUJMHg4NQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1ICovCisJLmJ5dGUJMHgyCS8qIC51bGViMTI4IDB4MiAqLworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxDRkkxLS5MQ0ZJMAorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciAqLworCS5ieXRlCTB4NQkvKiAudWxlYjEyOCAweDUgKi8KKwkuYWxpZ24gNAorLkxFRkRFMToKKy5MU0ZERTI6CisJLmxvbmcJLkxFRkRFMi0uTEFTRkRFMgkvKiBGREUgTGVuZ3RoICovCisuTEFTRkRFMjoKKwkubG9uZwkuTEFTRkRFMi0uTGZyYW1lMQkvKiBGREUgQ0lFIG9mZnNldCAqLworCS5sb25nCUZERV9FTkNPREUoLkxGQjIpCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisJLmxvbmcJLkxGRTItLkxGQjIJCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MAkvKiAudWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplICovCisjZW5kaWYKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMi0uTEZCMgorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDgJLyogLnVsZWIxMjggMHg4ICovCisJLmJ5dGUJMHg4NQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1ICovCisJLmJ5dGUJMHgyCS8qIC51bGViMTI4IDB4MiAqLworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxDRkkzLS5MQ0ZJMgorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciAqLworCS5ieXRlCTB4NQkvKiAudWxlYjEyOCAweDUgKi8KKyNpZiAhZGVmaW5lZCBIQVZFX0hJRERFTl9WSVNJQklMSVRZX0FUVFJJQlVURSAmJiBkZWZpbmVkIF9fUElDX18KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJNy0uTENGSTMKKwkuYnl0ZQkweDgzCS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDMgKi8KKwkuYnl0ZQkweGEJLyogLnVsZWIxMjggMHhhICovCisjZW5kaWYKKwkuYWxpZ24gNAorLkxFRkRFMjoKKworI2lmICFGRklfTk9fUkFXX0FQSQorCisuTFNGREUzOgorCS5sb25nCS5MRUZERTMtLkxBU0ZERTMJLyogRkRFIExlbmd0aCAqLworLkxBU0ZERTM6CisJLmxvbmcJLkxBU0ZERTMtLkxmcmFtZTEJLyogRkRFIENJRSBvZmZzZXQgKi8KKwkubG9uZwlGREVfRU5DT0RFKC5MRkIzKQkvKiBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLworCS5sb25nCS5MRkUzLS5MRkIzCQkvKiBGREUgYWRkcmVzcyByYW5nZSAqLworI2lmZGVmIF9fUElDX18KKwkuYnl0ZQkweDAJLyogLnVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZSAqLworI2VuZGlmCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTENGSTQtLkxGQjMKKwkuYnl0ZQkweGUJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUJMHg4CS8qIC51bGViMTI4IDB4OCAqLworCS5ieXRlCTB4ODUJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NSAqLworCS5ieXRlCTB4MgkvKiAudWxlYjEyOCAweDIgKi8KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJNS0uTENGSTQKKwkuYnl0ZQkweGQJLyogRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgKi8KKwkuYnl0ZQkweDUJLyogLnVsZWIxMjggMHg1ICovCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTENGSTYtLkxDRkk1CisJLmJ5dGUJMHg4NgkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg2ICovCisJLmJ5dGUJMHgzCS8qIC51bGViMTI4IDB4MyAqLworCS5hbGlnbiA0CisuTEVGREUzOgorCisjZW5kaWYKKworI2VuZGlmIC8qIGlmbmRlZiBfX3g4Nl82NF9fICovCisKKyNpZiBkZWZpbmVkIF9fRUxGX18gJiYgZGVmaW5lZCBfX2xpbnV4X18KKwkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L3VuaXg2NC5TIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvdW5peDY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2NjE5YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L3VuaXg2NC5TCkBAIC0wLDAgKzEsNDI2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgdW5peDY0LlMgLSBDb3B5cmlnaHQgKGMpIDIwMDIgIEJvIFRob3JzZW4gPGJvQHN1c2UuZGU+CisJICAgICAgQ29weXJpZ2h0IChjKSAyMDA4ICBSZWQgSGF0LCBJbmMKKworICAgeDg2LTY0IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgICBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgICBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBMSUJGRklfQVNNCQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorCisudGV4dAorCisvKiBmZmlfY2FsbF91bml4NjQgKHZvaWQgKmFyZ3MsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsIHVuc2lnbmVkIGZsYWdzLAorCSAgICAgICAgICAgIHZvaWQgKnJhZGRyLCB2b2lkICgqZm5hZGRyKSh2b2lkKSk7CisKKyAgIEJpdCBvIHRyaWNraW5lc3MgaGVyZSAtLSBBUkdTK0JZVEVTIGlzIHRoZSBiYXNlIG9mIHRoZSBzdGFjayBmcmFtZQorICAgZm9yIHRoaXMgZnVuY3Rpb24uICBUaGlzIGhhcyBiZWVuIGFsbG9jYXRlZCBieSBmZmlfY2FsbC4gIFdlIGFsc28KKyAgIGRlYWxsb2NhdGUgc29tZSBvZiB0aGUgc3RhY2sgdGhhdCBoYXMgYmVlbiBhbGxvY2EnZC4gICovCisKKwkuYWxpZ24JMgorCS5nbG9ibAlmZmlfY2FsbF91bml4NjQKKwkudHlwZQlmZmlfY2FsbF91bml4NjQsQGZ1bmN0aW9uCisKK2ZmaV9jYWxsX3VuaXg2NDoKKy5MVVcwOgorCW1vdnEJKCVyc3ApLCAlcjEwCQkvKiBMb2FkIHJldHVybiBhZGRyZXNzLiAgKi8KKwlsZWFxCSglcmRpLCAlcnNpKSwgJXJheAkvKiBGaW5kIGxvY2FsIHN0YWNrIGJhc2UuICAqLworCW1vdnEJJXJkeCwgKCVyYXgpCQkvKiBTYXZlIGZsYWdzLiAgKi8KKwltb3ZxCSVyY3gsIDgoJXJheCkJCS8qIFNhdmUgcmFkZHIuICAqLworCW1vdnEJJXJicCwgMTYoJXJheCkJCS8qIFNhdmUgb2xkIGZyYW1lIHBvaW50ZXIuICAqLworCW1vdnEJJXIxMCwgMjQoJXJheCkJCS8qIFJlbG9jYXRlIHJldHVybiBhZGRyZXNzLiAgKi8KKwltb3ZxCSVyYXgsICVyYnAJCS8qIEZpbmFsaXplIGxvY2FsIHN0YWNrIGZyYW1lLiAgKi8KKy5MVVcxOgorCW1vdnEJJXJkaSwgJXIxMAkJLyogU2F2ZSBhIGNvcHkgb2YgdGhlIHJlZ2lzdGVyIGFyZWEuICovCisJbW92cQklcjgsICVyMTEJCS8qIFNhdmUgYSBjb3B5IG9mIHRoZSB0YXJnZXQgZm4uICAqLworCW1vdmwJJXI5ZCwgJWVheAkJLyogU2V0IG51bWJlciBvZiBTU0UgcmVnaXN0ZXJzLiAgKi8KKworCS8qIExvYWQgdXAgYWxsIGFyZ3VtZW50IHJlZ2lzdGVycy4gICovCisJbW92cQkoJXIxMCksICVyZGkKKwltb3ZxCTgoJXIxMCksICVyc2kKKwltb3ZxCTE2KCVyMTApLCAlcmR4CisJbW92cQkyNCglcjEwKSwgJXJjeAorCW1vdnEJMzIoJXIxMCksICVyOAorCW1vdnEJNDAoJXIxMCksICVyOQorCXRlc3RsCSVlYXgsICVlYXgKKwlqbnoJLkxsb2FkX3NzZQorLkxyZXRfZnJvbV9sb2FkX3NzZToKKworCS8qIERlYWxsb2NhdGUgdGhlIHJlZyBhcmcgYXJlYS4gICovCisJbGVhcQkxNzYoJXIxMCksICVyc3AKKworCS8qIENhbGwgdGhlIHVzZXIgZnVuY3Rpb24uICAqLworCWNhbGwJKiVyMTEKKworCS8qIERlYWxsb2NhdGUgc3RhY2sgYXJnIGFyZWE7IGxvY2FsIHN0YWNrIGZyYW1lIGluIHJlZHpvbmUuICAqLworCWxlYXEJMjQoJXJicCksICVyc3AKKworCW1vdnEJMCglcmJwKSwgJXJjeAkJLyogUmVsb2FkIGZsYWdzLiAgKi8KKwltb3ZxCTgoJXJicCksICVyZGkJCS8qIFJlbG9hZCByYWRkci4gICovCisJbW92cQkxNiglcmJwKSwgJXJicAkJLyogUmVsb2FkIG9sZCBmcmFtZSBwb2ludGVyLiAgKi8KKy5MVVcyOgorCisJLyogVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZsYWdzIGNvbnRhaW5zIHRoZSBGRklfVFlQRS4gICovCisJbW92emJsCSVjbCwgJXIxMGQKKwlsZWFxCS5Mc3RvcmVfdGFibGUoJXJpcCksICVyMTEKKwltb3ZzbHEJKCVyMTEsICVyMTAsIDQpLCAlcjEwCisJYWRkcQklcjExLCAlcjEwCisJam1wCSolcjEwCisKKy5Mc3RvcmVfdGFibGU6CisJLmxvbmcJLkxzdF92b2lkLS5Mc3RvcmVfdGFibGUJCS8qIEZGSV9UWVBFX1ZPSUQgKi8KKwkubG9uZwkuTHN0X3NpbnQzMi0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX0lOVCAqLworCS5sb25nCS5Mc3RfZmxvYXQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9GTE9BVCAqLworCS5sb25nCS5Mc3RfZG91YmxlLS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfRE9VQkxFICovCisJLmxvbmcJLkxzdF9sZG91YmxlLS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfTE9OR0RPVUJMRSAqLworCS5sb25nCS5Mc3RfdWludDgtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9VSU5UOCAqLworCS5sb25nCS5Mc3Rfc2ludDgtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TSU5UOCAqLworCS5sb25nCS5Mc3RfdWludDE2LS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfVUlOVDE2ICovCisJLmxvbmcJLkxzdF9zaW50MTYtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TSU5UMTYgKi8KKwkubG9uZwkuTHN0X3VpbnQzMi0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1VJTlQzMiAqLworCS5sb25nCS5Mc3Rfc2ludDMyLS5Mc3RvcmVfdGFibGUJLyogRkZJX1RZUEVfU0lOVDMyICovCisJLmxvbmcJLkxzdF9pbnQ2NC0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1VJTlQ2NCAqLworCS5sb25nCS5Mc3RfaW50NjQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9TSU5UNjQgKi8KKwkubG9uZwkuTHN0X3N0cnVjdC0uTHN0b3JlX3RhYmxlCS8qIEZGSV9UWVBFX1NUUlVDVCAqLworCS5sb25nCS5Mc3RfaW50NjQtLkxzdG9yZV90YWJsZQkvKiBGRklfVFlQRV9QT0lOVEVSICovCisKKwkuYWxpZ24gMgorLkxzdF92b2lkOgorCXJldAorCS5hbGlnbiAyCisKKy5Mc3RfdWludDg6CisJbW92emJxCSVhbCwgJXJheAorCW1vdnEJJXJheCwgKCVyZGkpCisJcmV0CisJLmFsaWduIDIKKy5Mc3Rfc2ludDg6CisJbW92c2JxCSVhbCwgJXJheAorCW1vdnEJJXJheCwgKCVyZGkpCisJcmV0CisJLmFsaWduIDIKKy5Mc3RfdWludDE2OgorCW1vdnp3cQklYXgsICVyYXgKKwltb3ZxCSVyYXgsICglcmRpKQorCS5hbGlnbiAyCisuTHN0X3NpbnQxNjoKKwltb3Zzd3EJJWF4LCAlcmF4CisJbW92cQklcmF4LCAoJXJkaSkKKwlyZXQKKwkuYWxpZ24gMgorLkxzdF91aW50MzI6CisJbW92bAklZWF4LCAlZWF4CisJbW92cQklcmF4LCAoJXJkaSkKKwkuYWxpZ24gMgorLkxzdF9zaW50MzI6CisJY2x0cQorCW1vdnEJJXJheCwgKCVyZGkpCisJcmV0CisJLmFsaWduIDIKKy5Mc3RfaW50NjQ6CisJbW92cQklcmF4LCAoJXJkaSkKKwlyZXQKKworCS5hbGlnbiAyCisuTHN0X2Zsb2F0OgorCW1vdnNzCSV4bW0wLCAoJXJkaSkKKwlyZXQKKwkuYWxpZ24gMgorLkxzdF9kb3VibGU6CisJbW92c2QJJXhtbTAsICglcmRpKQorCXJldAorLkxzdF9sZG91YmxlOgorCWZzdHB0CSglcmRpKQorCXJldAorCisJLmFsaWduIDIKKy5Mc3Rfc3RydWN0OgorCWxlYXEJLTIwKCVyc3ApLCAlcnNpCQkvKiBTY3JhdGNoIGFyZWEgaW4gcmVkem9uZS4gICovCisKKwkvKiBXZSBoYXZlIHRvIGxvY2F0ZSB0aGUgdmFsdWVzIG5vdywgYW5kIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8KKwkgICB3cml0ZSB0b28gbXVjaCBkYXRhIGludG8gdGhlIHVzZXIncyByZXR1cm4gdmFsdWUsIHdlIHNwaWxsIHRoZQorCSAgIHZhbHVlIHRvIGEgMTYgYnl0ZSBzY3JhdGNoIGFyZWEgZmlyc3QuICBCaXRzIDgsIDksIGFuZCAxMAorCSAgIGNvbnRyb2wgd2hlcmUgdGhlIHZhbHVlcyBhcmUgbG9jYXRlZC4gIE9ubHkgb25lIG9mIHRoZSB0aHJlZQorCSAgIGJpdHMgd2lsbCBiZSBzZXQ7IHNlZSBmZmlfcHJlcF9jaWZfbWFjaGRlcCBmb3IgdGhlIHBhdHRlcm4uICAqLworCW1vdmQJJXhtbTAsICVyMTAKKwltb3ZkCSV4bW0xLCAlcjExCisJdGVzdGwJJDB4MTAwLCAlZWN4CisJY21vdm56CSVyYXgsICVyZHgKKwljbW92bnoJJXIxMCwgJXJheAorCXRlc3RsCSQweDIwMCwgJWVjeAorCWNtb3ZuegklcjEwLCAlcmR4CisJdGVzdGwJJDB4NDAwLCAlZWN4CisJY21vdm56CSVyMTAsICVyYXgKKwljbW92bnoJJXIxMSwgJXJkeAorCW1vdnEJJXJheCwgKCVyc2kpCisJbW92cQklcmR4LCA4KCVyc2kpCisKKwkvKiBCaXRzIDEyLTMxIGNvbnRhaW4gdGhlIHRydWUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlLiAgQ29weSBmcm9tCisJICAgdGhlIHNjcmF0Y2ggYXJlYSB0byB0aGUgdHJ1ZSBkZXN0aW5hdGlvbi4gICovCisJc2hybAkkMTIsICVlY3gKKwlyZXAgbW92c2IKKwlyZXQKKworCS8qIE1hbnkgdGltZXMgd2UgY2FuIGF2b2lkIGxvYWRpbmcgYW55IFNTRSByZWdpc3RlcnMgYXQgYWxsLgorCSAgIEl0J3Mgbm90IHdvcnRoIGFuIGluZGlyZWN0IGp1bXAgdG8gbG9hZCB0aGUgZXhhY3Qgc2V0IG9mCisJICAgU1NFIHJlZ2lzdGVycyBuZWVkZWQ7IHplcm8gb3IgYWxsIGlzIGEgZ29vZCBjb21wcm9taXNlLiAgKi8KKwkuYWxpZ24gMgorLkxVVzM6CisuTGxvYWRfc3NlOgorCW1vdmRxYQk0OCglcjEwKSwgJXhtbTAKKwltb3ZkcWEJNjQoJXIxMCksICV4bW0xCisJbW92ZHFhCTgwKCVyMTApLCAleG1tMgorCW1vdmRxYQk5NiglcjEwKSwgJXhtbTMKKwltb3ZkcWEJMTEyKCVyMTApLCAleG1tNAorCW1vdmRxYQkxMjgoJXIxMCksICV4bW01CisJbW92ZHFhCTE0NCglcjEwKSwgJXhtbTYKKwltb3ZkcWEJMTYwKCVyMTApLCAleG1tNworCWptcAkuTHJldF9mcm9tX2xvYWRfc3NlCisKKy5MVVc0OgorCS5zaXplICAgIGZmaV9jYWxsX3VuaXg2NCwuLWZmaV9jYWxsX3VuaXg2NAorCisJLmFsaWduCTIKKwkuZ2xvYmwgZmZpX2Nsb3N1cmVfdW5peDY0CisJLnR5cGUJZmZpX2Nsb3N1cmVfdW5peDY0LEBmdW5jdGlvbgorCitmZmlfY2xvc3VyZV91bml4NjQ6CisuTFVXNToKKwkvKiBUaGUgY2FycnkgZmxhZyBpcyBzZXQgYnkgdGhlIHRyYW1wb2xpbmUgaWZmIFNTRSByZWdpc3RlcnMKKwkgICBhcmUgdXNlZC4gIERvbid0IGNsb2JiZXIgaXQgYmVmb3JlIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24uICAqLworCWxlYXEgICAgLTIwMCglcnNwKSwgJXJzcAorLkxVVzY6CisJbW92cQklcmRpLCAoJXJzcCkKKwltb3ZxICAgICVyc2ksIDgoJXJzcCkKKwltb3ZxICAgICVyZHgsIDE2KCVyc3ApCisJbW92cSAgICAlcmN4LCAyNCglcnNwKQorCW1vdnEgICAgJXI4LCAzMiglcnNwKQorCW1vdnEgICAgJXI5LCA0MCglcnNwKQorCWpjICAgICAgLkxzYXZlX3NzZQorLkxyZXRfZnJvbV9zYXZlX3NzZToKKworCW1vdnEJJXIxMCwgJXJkaQorCWxlYXEJMTc2KCVyc3ApLCAlcnNpCisJbW92cQklcnNwLCAlcmR4CisJbGVhcQkyMDgoJXJzcCksICVyY3gKKwljYWxsCWZmaV9jbG9zdXJlX3VuaXg2NF9pbm5lckBQTFQKKworCS8qIERlYWxsb2NhdGUgc3RhY2sgZnJhbWUgZWFybHk7IHJldHVybiB2YWx1ZSBpcyBub3cgaW4gcmVkem9uZS4gICovCisJYWRkcQkkMjAwLCAlcnNwCisuTFVXNzoKKworCS8qIFRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXR1cm4gdmFsdWUgY29udGFpbnMgdGhlIEZGSV9UWVBFLiAgKi8KKwltb3Z6YmwJJWFsLCAlcjEwZAorCWxlYXEJLkxsb2FkX3RhYmxlKCVyaXApLCAlcjExCisJbW92c2xxCSglcjExLCAlcjEwLCA0KSwgJXIxMAorCWFkZHEJJXIxMSwgJXIxMAorCWptcAkqJXIxMAorCisuTGxvYWRfdGFibGU6CisJLmxvbmcJLkxsZF92b2lkLS5MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfVk9JRCAqLworCS5sb25nCS5MbGRfaW50MzItLkxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9JTlQgKi8KKwkubG9uZwkuTGxkX2Zsb2F0LS5MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfRkxPQVQgKi8KKwkubG9uZwkuTGxkX2RvdWJsZS0uTGxvYWRfdGFibGUJLyogRkZJX1RZUEVfRE9VQkxFICovCisJLmxvbmcJLkxsZF9sZG91YmxlLS5MbG9hZF90YWJsZQkvKiBGRklfVFlQRV9MT05HRE9VQkxFICovCisJLmxvbmcJLkxsZF9pbnQ4LS5MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfVUlOVDggKi8KKwkubG9uZwkuTGxkX2ludDgtLkxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9TSU5UOCAqLworCS5sb25nCS5MbGRfaW50MTYtLkxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9VSU5UMTYgKi8KKwkubG9uZwkuTGxkX2ludDE2LS5MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfU0lOVDE2ICovCisJLmxvbmcJLkxsZF9pbnQzMi0uTGxvYWRfdGFibGUJCS8qIEZGSV9UWVBFX1VJTlQzMiAqLworCS5sb25nCS5MbGRfaW50MzItLkxsb2FkX3RhYmxlCQkvKiBGRklfVFlQRV9TSU5UMzIgKi8KKwkubG9uZwkuTGxkX2ludDY0LS5MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfVUlOVDY0ICovCisJLmxvbmcJLkxsZF9pbnQ2NC0uTGxvYWRfdGFibGUJCS8qIEZGSV9UWVBFX1NJTlQ2NCAqLworCS5sb25nCS5MbGRfc3RydWN0LS5MbG9hZF90YWJsZQkvKiBGRklfVFlQRV9TVFJVQ1QgKi8KKwkubG9uZwkuTGxkX2ludDY0LS5MbG9hZF90YWJsZQkJLyogRkZJX1RZUEVfUE9JTlRFUiAqLworCisJLmFsaWduIDIKKy5MbGRfdm9pZDoKKwlyZXQKKworCS5hbGlnbiAyCisuTGxkX2ludDg6CisJbW92emJsCS0yNCglcnNwKSwgJWVheAorCXJldAorCS5hbGlnbiAyCisuTGxkX2ludDE2OgorCW1vdnp3bAktMjQoJXJzcCksICVlYXgKKwlyZXQKKwkuYWxpZ24gMgorLkxsZF9pbnQzMjoKKwltb3ZsCS0yNCglcnNwKSwgJWVheAorCXJldAorCS5hbGlnbiAyCisuTGxkX2ludDY0OgorCW1vdnEJLTI0KCVyc3ApLCAlcmF4CisJcmV0CisKKwkuYWxpZ24gMgorLkxsZF9mbG9hdDoKKwltb3ZzcwktMjQoJXJzcCksICV4bW0wCisJcmV0CisJLmFsaWduIDIKKy5MbGRfZG91YmxlOgorCW1vdnNkCS0yNCglcnNwKSwgJXhtbTAKKwlyZXQKKwkuYWxpZ24gMgorLkxsZF9sZG91YmxlOgorCWZsZHQJLTI0KCVyc3ApCisJcmV0CisKKwkuYWxpZ24gMgorLkxsZF9zdHJ1Y3Q6CisJLyogVGhlcmUgYXJlIGZvdXIgcG9zc2liaWxpdGllcyBoZXJlLCAlcmF4LyVyZHgsICV4bW0wLyVyYXgsCisJICAgJXJheC8leG1tMCwgJXhtbTAvJXhtbTEuICBXZSBjb2xsYXBzZSB0d28gYnkgYWx3YXlzIGxvYWRpbmcKKwkgICBib3RoIHJkeCBhbmQgeG1tMSB3aXRoIHRoZSBzZWNvbmQgd29yZC4gIEZvciB0aGUgcmVtYWluaW5nLAorCSAgIGJpdCA4IHNldCBtZWFucyB4bW0wIGdldHMgdGhlIHNlY29uZCB3b3JkLCBhbmQgYml0IDkgbWVhbnMKKwkgICB0aGF0IHJheCBnZXRzIHRoZSBzZWNvbmQgd29yZC4gICovCisJbW92cQktMjQoJXJzcCksICVyY3gKKwltb3ZxCS0xNiglcnNwKSwgJXJkeAorCW1vdnEJLTE2KCVyc3ApLCAleG1tMQorCXRlc3RsCSQweDEwMCwgJWVheAorCWNtb3ZuegklcmR4LCAlcmN4CisJbW92ZAklcmN4LCAleG1tMAorCXRlc3RsCSQweDIwMCwgJWVheAorCW1vdnEJLTI0KCVyc3ApLCAlcmF4CisJY21vdm56CSVyZHgsICVyYXgKKwlyZXQKKworCS8qIFNlZSB0aGUgY29tbWVudCBhYm92ZSAuTGxvYWRfc3NlOyB0aGUgc2FtZSBsb2dpYyBhcHBsaWVzIGhlcmUuICAqLworCS5hbGlnbiAyCisuTFVXODoKKy5Mc2F2ZV9zc2U6CisJbW92ZHFhCSV4bW0wLCA0OCglcnNwKQorCW1vdmRxYQkleG1tMSwgNjQoJXJzcCkKKwltb3ZkcWEJJXhtbTIsIDgwKCVyc3ApCisJbW92ZHFhCSV4bW0zLCA5NiglcnNwKQorCW1vdmRxYQkleG1tNCwgMTEyKCVyc3ApCisJbW92ZHFhCSV4bW01LCAxMjgoJXJzcCkKKwltb3ZkcWEJJXhtbTYsIDE0NCglcnNwKQorCW1vdmRxYQkleG1tNywgMTYwKCVyc3ApCisJam1wCS5McmV0X2Zyb21fc2F2ZV9zc2UKKworLkxVVzk6CisJLnNpemUJZmZpX2Nsb3N1cmVfdW5peDY0LC4tZmZpX2Nsb3N1cmVfdW5peDY0CisKKyNpZmRlZiBIQVZFX0FTX1g4Nl82NF9VTldJTkRfU0VDVElPTl9UWVBFCisJLnNlY3Rpb24JLmVoX2ZyYW1lLCJhIixAdW53aW5kCisjZWxzZQorCS5zZWN0aW9uCS5laF9mcmFtZSwiYSIsQHByb2diaXRzCisjZW5kaWYKKy5MZnJhbWUxOgorCS5sb25nCS5MRUNJRTEtLkxTQ0lFMQkJLyogQ0lFIExlbmd0aCAqLworLkxTQ0lFMToKKwkubG9uZwkwCQkJLyogQ0lFIElkZW50aWZpZXIgVGFnICovCisJLmJ5dGUJMQkJCS8qIENJRSBWZXJzaW9uICovCisJLmFzY2lpICJ6UlwwIgkJCS8qIENJRSBBdWdtZW50YXRpb24gKi8KKwkudWxlYjEyOCAxCQkJLyogQ0lFIENvZGUgQWxpZ25tZW50IEZhY3RvciAqLworCS5zbGViMTI4IC04CQkJLyogQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvciAqLworCS5ieXRlCTB4MTAJCQkvKiBDSUUgUkEgQ29sdW1uICovCisJLnVsZWIxMjggMQkJCS8qIEF1Z21lbnRhdGlvbiBzaXplICovCisJLmJ5dGUJMHgxYgkJCS8qIEZERSBFbmNvZGluZyAocGNyZWwgc2RhdGE0KSAqLworCS5ieXRlCTB4YwkJCS8qIERXX0NGQV9kZWZfY2ZhLCAlcnNwIG9mZnNldCA4ICovCisJLnVsZWIxMjggNworCS51bGViMTI4IDgKKwkuYnl0ZQkweDgwKzE2CQkJLyogRFdfQ0ZBX29mZnNldCwgJXJpcCBvZmZzZXQgMSotOCAqLworCS51bGViMTI4IDEKKwkuYWxpZ24gOAorLkxFQ0lFMToKKy5MU0ZERTE6CisJLmxvbmcJLkxFRkRFMS0uTEFTRkRFMQkvKiBGREUgTGVuZ3RoICovCisuTEFTRkRFMToKKwkubG9uZwkuTEFTRkRFMS0uTGZyYW1lMQkvKiBGREUgQ0lFIG9mZnNldCAqLworI2lmIEhBVkVfQVNfWDg2X1BDUkVMCisJLmxvbmcJLkxVVzAtLgkJCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisjZWxzZQorCS5sb25nCS5MVVcwQHJlbAorI2VuZGlmCisJLmxvbmcJLkxVVzQtLkxVVzAJCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisJLnVsZWIxMjggMHgwCQkJLyogQXVnbWVudGF0aW9uIHNpemUgKi8KKworCS5ieXRlCTB4NAkJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTFVXMS0uTFVXMAorCisJLyogTmV3IHN0YWNrIGZyYW1lIGJhc2VkIG9mZiByYnAuICBUaGlzIGlzIGEgaXR0eSBiaXQgb2YgdW53aW5kCisJICAgdHJpY2tlcnkgaW4gdGhhdCB0aGUgQ0ZBICpoYXMqIGNoYW5nZWQuICBUaGVyZSBpcyBubyBlYXN5IHdheQorCSAgIHRvIGRlc2NyaWJlIGl0IGNvcnJlY3RseSBvbiBlbnRyeSB0byB0aGUgZnVuY3Rpb24uICBGb3J0dW5hdGVseSwKKwkgICBpdCBkb2Vzbid0IG1hdHRlciB0b28gbXVjaCBzaW5jZSBhdCBhbGwgcG9pbnRzIHdlIGNhbiBjb3JyZWN0bHkKKwkgICB1bndpbmQgYmFjayB0byBmZmlfY2FsbC4gIE5vdGUgdGhhdCB0aGUgbG9jYXRpb24gdG8gd2hpY2ggd2UKKwkgICBtb3ZlZCB0aGUgcmV0dXJuIGFkZHJlc3MgaXMgKHRoZSBuZXcpIENGQS04LCBzbyBmcm9tIHRoZQorCSAgIHBlcnNwZWN0aXZlIG9mIHRoZSB1bndpbmQgaW5mbywgaXQgaGFzbid0IG1vdmVkLiAgKi8KKwkuYnl0ZQkweGMJCQkvKiBEV19DRkFfZGVmX2NmYSwgJXJicCBvZmZzZXQgMzIgKi8KKwkudWxlYjEyOCA2CisJLnVsZWIxMjggMzIKKwkuYnl0ZQkweDgwKzYJCQkvKiBEV19DRkFfb2Zmc2V0LCAlcmJwIG9mZnNldCAyKi04ICovCisJLnVsZWIxMjggMgorCS5ieXRlCTB4YQkJCS8qIERXX0NGQV9yZW1lbWJlcl9zdGF0ZSAqLworCisJLmJ5dGUJMHg0CQkJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MVVcyLS5MVVcxCisJLmJ5dGUJMHhjCQkJLyogRFdfQ0ZBX2RlZl9jZmEsICVyc3Agb2Zmc2V0IDggKi8KKwkudWxlYjEyOCA3CisJLnVsZWIxMjggOAorCS5ieXRlCTB4YzArNgkJCS8qIERXX0NGQV9yZXN0b3JlLCAlcmJwICovCisKKwkuYnl0ZQkweDQJCQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxVVzMtLkxVVzIKKwkuYnl0ZQkweGIJCQkvKiBEV19DRkFfcmVzdG9yZV9zdGF0ZSAqLworCisJLmFsaWduIDgKKy5MRUZERTE6CisuTFNGREUzOgorCS5sb25nCS5MRUZERTMtLkxBU0ZERTMJLyogRkRFIExlbmd0aCAqLworLkxBU0ZERTM6CisJLmxvbmcJLkxBU0ZERTMtLkxmcmFtZTEJLyogRkRFIENJRSBvZmZzZXQgKi8KKyNpZiBIQVZFX0FTX1g4Nl9QQ1JFTAorCS5sb25nCS5MVVc1LS4JCQkvKiBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLworI2Vsc2UKKwkubG9uZwkuTFVXNUByZWwKKyNlbmRpZgorCS5sb25nCS5MVVc5LS5MVVc1CQkvKiBGREUgYWRkcmVzcyByYW5nZSAqLworCS51bGViMTI4IDB4MAkJCS8qIEF1Z21lbnRhdGlvbiBzaXplICovCisKKwkuYnl0ZQkweDQJCQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxVVzYtLkxVVzUKKwkuYnl0ZQkweGUJCQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkudWxlYjEyOCAyMDgKKwkuYnl0ZQkweGEJCQkvKiBEV19DRkFfcmVtZW1iZXJfc3RhdGUgKi8KKworCS5ieXRlCTB4NAkJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTFVXNy0uTFVXNgorCS5ieXRlCTB4ZQkJCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS51bGViMTI4IDgKKworCS5ieXRlCTB4NAkJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTFVXOC0uTFVXNworCS5ieXRlCTB4YgkJCS8qIERXX0NGQV9yZXN0b3JlX3N0YXRlICovCisKKwkuYWxpZ24gOAorLkxFRkRFMzoKKworI2VuZGlmIC8qIF9feDg2XzY0X18gKi8KKworI2lmIGRlZmluZWQgX19FTEZfXyAmJiBkZWZpbmVkIF9fbGludXhfXworCS5zZWN0aW9uCS5ub3RlLkdOVS1zdGFjaywiIixAcHJvZ2JpdHMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3NyYy94ODYvd2luMzIuUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L3dpbjMyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjODkzZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L3dpbjMyLlMKQEAgLTAsMCArMSwxMDY1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgd2luMzIuUyAtIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMjAwMSwgMjAwMiwgMjAwOSAgUmVkIEhhdCwgSW5jLgorCSAgICAgQ29weXJpZ2h0IChjKSAyMDAxICBKb2huIEJlbml0b24KKwkgICAgIENvcHlyaWdodCAoYykgMjAwMiAgUmFuaml0IE1hdGhldworCSAgICAgQ29weXJpZ2h0IChjKSAyMDA5ICBEYW5pZWwgV2l0dGUKKwkJCQorIAorICAgWDg2IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCisgCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIAorICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIAorICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAgIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqLworIAorI2RlZmluZSBMSUJGRklfQVNNCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKyNpZmRlZiBfTVNDX1ZFUgorCisuMzg2CisuTU9ERUwgRkxBVCwgQworCitFWFRSTiBmZmlfY2xvc3VyZV9TWVNWX2lubmVyOk5FQVIKKworX1RFWFQgU0VHTUVOVAorCitmZmlfY2FsbF93aW4zMiBQUk9DIE5FQVIsCisgICAgZmZpX3ByZXBfYXJncyA6IE5FQVIgUFRSIERXT1JELAorICAgIGVjaWYgICAgICAgICAgOiBORUFSIFBUUiBEV09SRCwKKyAgICBjaWZfYnl0ZXMgICAgIDogRFdPUkQsCisgICAgY2lmX2ZsYWdzICAgICA6IERXT1JELAorICAgIHJ2YWx1ZSAgICAgICAgOiBORUFSIFBUUiBEV09SRCwKKyAgICBmbiAgICAgICAgICAgIDogTkVBUiBQVFIgRFdPUkQKKworICAgICAgICA7OyBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuCisgICAgICAgIG1vdiAgZWN4LCBjaWZfYnl0ZXMKKyAgICAgICAgc3ViICBlc3AsIGVjeAorCisgICAgICAgIG1vdiAgZWF4LCBlc3AKKworICAgICAgICA7OyBQbGFjZSBhbGwgb2YgdGhlIGZmaV9wcmVwX2FyZ3MgaW4gcG9zaXRpb24KKyAgICAgICAgcHVzaCBlY2lmCisgICAgICAgIHB1c2ggZWF4CisgICAgICAgIGNhbGwgZmZpX3ByZXBfYXJncworCisgICAgICAgIDs7IFJldHVybiBzdGFjayB0byBwcmV2aW91cyBzdGF0ZSBhbmQgY2FsbCB0aGUgZnVuY3Rpb24KKyAgICAgICAgYWRkICBlc3AsIDgKKworICAgICAgICBjYWxsIGZuCisKKyAgICAgICAgOzsgY2RlY2w6ICAgd2UgcmVzdG9yZSBlc3AgaW4gdGhlIGVwaWxvZ3VlLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8KKyAgICAgICAgOzsgICAgICAgICAgcmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzLgorICAgICAgICA7OyBzdGRjYWxsOiB0aGUgY2FsbGVlIGhhcyBhbHJlYWR5IGNsZWFuZWQgdGhlIHN0YWNrLgorCisgICAgICAgIDs7IExvYWQgZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUKKyAgICAgICAgbW92ICBlY3gsIGNpZl9mbGFncworCisgICAgICAgIDs7IElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgorICAgICAgICBjbXAgIHJ2YWx1ZSwgMAorICAgICAgICBqbmUgIGNhX2p1bXB0YWJsZQorCisgICAgICAgIDs7IEV2ZW4gaWYgdGhlcmUgaXMgbm8gc3BhY2UgZm9yIHRoZSByZXR1cm4gdmFsdWUsIHdlIGFyZQorICAgICAgICA7OyBvYmxpZ2VkIHRvIGhhbmRsZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgICAgICAgIGNtcCAgZWN4LCBGRklfVFlQRV9GTE9BVAorICAgICAgICBqbmUgIGNhX2VwaWxvZ3VlCisgICAgICAgIGZzdHAgc3QoMCkKKworICAgICAgICBqbXAgIGNhX2VwaWxvZ3VlCisKK2NhX2p1bXB0YWJsZToKKyAgICAgICAgam1wICBbY2FfanVtcGRhdGEgKyA0ICogZWN4XQorY2FfanVtcGRhdGE6CisgICAgICAgIDs7IERvIG5vdCBpbnNlcnQgYW55dGhpbmcgaGVyZSBiZXR3ZWVuIGxhYmVsIGFuZCBqdW1wIHRhYmxlLgorICAgICAgICBkZCBvZmZzZXQgY2FfZXBpbG9ndWUgICAgICAgOzsgRkZJX1RZUEVfVk9JRAorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfSU5UCisgICAgICAgIGRkIG9mZnNldCBjYV9yZXRmbG9hdCAgICAgICA7OyBGRklfVFlQRV9GTE9BVAorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0ZG91YmxlICAgICAgOzsgRkZJX1RZUEVfRE9VQkxFCisgICAgICAgIGRkIG9mZnNldCBjYV9yZXRsb25nZG91YmxlICA7OyBGRklfVFlQRV9MT05HRE9VQkxFCisgICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9VSU5UOAorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50OCAgICAgICAgOzsgRkZJX1RZUEVfU0lOVDgKKyAgICAgICAgZGQgb2Zmc2V0IGNhX3JldGludDE2ICAgICAgIDs7IEZGSV9UWVBFX1VJTlQxNgorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50MTYgICAgICAgOzsgRkZJX1RZUEVfU0lOVDE2CisgICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9VSU5UMzIKKyAgICAgICAgZGQgb2Zmc2V0IGNhX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1NJTlQzMgorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50NjQgICAgICAgOzsgRkZJX1RZUEVfVUlOVDY0CisgICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQ2NCAgICAgICA7OyBGRklfVFlQRV9TSU5UNjQKKyAgICAgICAgZGQgb2Zmc2V0IGNhX2VwaWxvZ3VlICAgICAgIDs7IEZGSV9UWVBFX1NUUlVDVAorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfUE9JTlRFUgorICAgICAgICBkZCBvZmZzZXQgY2FfcmV0aW50OCAgICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzFCCisgICAgICAgIGRkIG9mZnNldCBjYV9yZXRpbnQxNiAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIKKyAgICAgICAgZGQgb2Zmc2V0IGNhX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF80QgorCitjYV9yZXRpbnQ4OgorICAgICAgICA7OyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgIG1vdiAgIGVjeCwgcnZhbHVlCisgICAgICAgIG1vdiAgIFtlY3ggKyAwXSwgYWwKKyAgICAgICAgam1wICAgY2FfZXBpbG9ndWUKKworY2FfcmV0aW50MTY6CisgICAgICAgIDs7IExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92ICAgZWN4LCBydmFsdWUKKyAgICAgICAgbW92ICAgW2VjeCArIDBdLCBheAorICAgICAgICBqbXAgICBjYV9lcGlsb2d1ZQorCitjYV9yZXRpbnQ6CisgICAgICAgIDs7IExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92ICAgZWN4LCBydmFsdWUKKyAgICAgICAgbW92ICAgW2VjeCArIDBdLCBlYXgKKyAgICAgICAgam1wICAgY2FfZXBpbG9ndWUKKworY2FfcmV0aW50NjQ6CisgICAgICAgIDs7IExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92ICAgZWN4LCBydmFsdWUKKyAgICAgICAgbW92ICAgW2VjeCArIDBdLCBlYXgKKyAgICAgICAgbW92ICAgW2VjeCArIDRdLCBlZHgKKyAgICAgICAgam1wICAgY2FfZXBpbG9ndWUKKworY2FfcmV0ZmxvYXQ6CisgICAgICAgIDs7IExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92ICAgZWN4LCBydmFsdWUKKyAgICAgICAgZnN0cCAgRFdPUkQgUFRSIFtlY3hdCisgICAgICAgIGptcCAgIGNhX2VwaWxvZ3VlCisKK2NhX3JldGRvdWJsZToKKyAgICAgICAgOzsgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3YgICBlY3gsIHJ2YWx1ZQorICAgICAgICBmc3RwICBRV09SRCBQVFIgW2VjeF0KKyAgICAgICAgam1wICAgY2FfZXBpbG9ndWUKKworY2FfcmV0bG9uZ2RvdWJsZToKKyAgICAgICAgOzsgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3YgICBlY3gsIHJ2YWx1ZQorICAgICAgICBmc3RwICBUQllURSBQVFIgW2VjeF0KKyAgICAgICAgam1wICAgY2FfZXBpbG9ndWUKKworY2FfZXBpbG9ndWU6CisgICAgICAgIDs7IEVwaWxvZ3VlIGNvZGUgaXMgYXV0b2dlbmVyYXRlZC4KKyAgICAgICAgcmV0CitmZmlfY2FsbF93aW4zMiBFTkRQCisKK2ZmaV9jbG9zdXJlX1NZU1YgUFJPQyBORUFSIDxGT1JDRUZSQU1FPgorICAgIDs7IHRoZSBmZmlfY2xvc3VyZSBjdHggaXMgcGFzc2VkIGluIGVheCBieSB0aGUgdHJhbXBvbGluZS4KKworICAgICAgICBzdWIgIGVzcCwgNDAKKyAgICAgICAgbGVhICBlZHgsIFtlYnAgLSAyNF0KKyAgICAgICAgbW92ICBbZWJwIC0gMTJdLCBlZHggICAgICAgICA7OyByZXNwCisgICAgICAgIGxlYSAgZWR4LCBbZWJwICsgOF0KKyAgICAgICAgbW92ICBbZXNwICsgOF0sIGVkeCAgICAgICAgICA7OyBhcmdzCisgICAgICAgIGxlYSAgZWR4LCBbZWJwIC0gMTJdCisgICAgICAgIG1vdiAgW2VzcCArIDRdLCBlZHggICAgICAgICAgOzsgJnJlc3AKKyAgICAgICAgbW92ICBbZXNwXSwgZWF4ICAgICAgICAgICAgICA7OyBjbG9zdXJlCisgICAgICAgIGNhbGwgZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcgorICAgICAgICBtb3YgIGVjeCwgW2VicCAtIDEyXQorCitjc19qdW1wdGFibGU6CisgICAgICAgIGptcCAgW2NzX2p1bXBkYXRhICsgNCAqIGVheF0KK2NzX2p1bXBkYXRhOgorICAgICAgICA7OyBEbyBub3QgaW5zZXJ0IGFueXRoaW5nIGhlcmUgYmV0d2VlbiB0aGUgbGFiZWwgYW5kIGp1bXAgdGFibGUuCisgICAgICAgIGRkIG9mZnNldCBjc19lcGlsb2d1ZSAgICAgICA7OyBGRklfVFlQRV9WT0lECisgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9JTlQKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldGZsb2F0ICAgICAgIDs7IEZGSV9UWVBFX0ZMT0FUCisgICAgICAgIGRkIG9mZnNldCBjc19yZXRkb3VibGUgICAgICA7OyBGRklfVFlQRV9ET1VCTEUKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldGxvbmdkb3VibGUgIDs7IEZGSV9UWVBFX0xPTkdET1VCTEUKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldGludDggICAgICAgIDs7IEZGSV9UWVBFX1VJTlQ4CisgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9TSU5UOAorICAgICAgICBkZCBvZmZzZXQgY3NfcmV0aW50MTYgICAgICAgOzsgRkZJX1RZUEVfVUlOVDE2CisgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQxNiAgICAgICA7OyBGRklfVFlQRV9TSU5UMTYKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1VJTlQzMgorICAgICAgICBkZCBvZmZzZXQgY3NfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfU0lOVDMyCisgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQ2NCAgICAgICA7OyBGRklfVFlQRV9VSU5UNjQKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldGludDY0ICAgICAgIDs7IEZGSV9UWVBFX1NJTlQ2NAorICAgICAgICBkZCBvZmZzZXQgY3NfcmV0c3RydWN0ICAgICAgOzsgRkZJX1RZUEVfU1RSVUNUCisgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9QT0lOVEVSCisgICAgICAgIGRkIG9mZnNldCBjc19yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIKKyAgICAgICAgZGQgb2Zmc2V0IGNzX3JldGludDE2ICAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8yQgorICAgICAgICBkZCBvZmZzZXQgY3NfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzRCCisKK2NzX3JldGludDg6CisgICAgICAgIG1vdiAgIGFsLCBbZWN4XQorICAgICAgICBqbXAgICBjc19lcGlsb2d1ZQorCitjc19yZXRpbnQxNjoKKyAgICAgICAgbW92ICAgYXgsIFtlY3hdCisgICAgICAgIGptcCAgIGNzX2VwaWxvZ3VlCisKK2NzX3JldGludDoKKyAgICAgICAgbW92ICAgZWF4LCBbZWN4XQorICAgICAgICBqbXAgICBjc19lcGlsb2d1ZQorCitjc19yZXRpbnQ2NDoKKyAgICAgICAgbW92ICAgZWF4LCBbZWN4ICsgMF0KKyAgICAgICAgbW92ICAgZWR4LCBbZWN4ICsgNF0KKyAgICAgICAgam1wICAgY3NfZXBpbG9ndWUKKworY3NfcmV0ZmxvYXQ6CisgICAgICAgIGZsZCAgIERXT1JEIFBUUiBbZWN4XQorICAgICAgICBqbXAgICBjc19lcGlsb2d1ZQorCitjc19yZXRkb3VibGU6CisgICAgICAgIGZsZCAgIFFXT1JEIFBUUiBbZWN4XQorICAgICAgICBqbXAgICBjc19lcGlsb2d1ZQorCitjc19yZXRsb25nZG91YmxlOgorICAgICAgICBmbGQgICBUQllURSBQVFIgW2VjeF0KKyAgICAgICAgam1wICAgY3NfZXBpbG9ndWUKKworY3NfcmV0c3RydWN0OgorICAgICAgICA7OyBDYWxsZXIgZXhwZWN0cyB1cyB0byBwb3Agc3RydWN0IHJldHVybiB2YWx1ZSBwb2ludGVyIGhpZGRlbiBhcmcuCisgICAgICAgIDs7IEVwaWxvZ3VlIGNvZGUgaXMgYXV0b2dlbmVyYXRlZC4KKyAgICAgICAgcmV0CTQKKworY3NfZXBpbG9ndWU6CisgICAgICAgIDs7IEVwaWxvZ3VlIGNvZGUgaXMgYXV0b2dlbmVyYXRlZC4KKyAgICAgICAgcmV0CitmZmlfY2xvc3VyZV9TWVNWIEVORFAKKworI2lmICFGRklfTk9fUkFXX0FQSQorCisjZGVmaW5lIFJBV19DTE9TVVJFX0NJRl9PRkZTRVQgKChGRklfVFJBTVBPTElORV9TSVpFICsgMykgQU5EIE5PVCAzKQorI2RlZmluZSBSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUIChSQVdfQ0xPU1VSRV9DSUZfT0ZGU0VUICsgNCkKKyNkZWZpbmUgUkFXX0NMT1NVUkVfVVNFUl9EQVRBX09GRlNFVCAoUkFXX0NMT1NVUkVfRlVOX09GRlNFVCArIDQpCisjZGVmaW5lIENJRl9GTEFHU19PRkZTRVQgMjAKKworZmZpX2Nsb3N1cmVfcmF3X1NZU1YgUFJPQyBORUFSIFVTRVMgZXNpCisgICAgOzsgdGhlIGZmaV9jbG9zdXJlIGN0eCBpcyBwYXNzZWQgaW4gZWF4IGJ5IHRoZSB0cmFtcG9saW5lLgorCisgICAgICAgIHN1YiAgZXNwLCA0MAorICAgICAgICBtb3YgIGVzaSwgW2VheCArIFJBV19DTE9TVVJFX0NJRl9PRkZTRVRdICAgICAgICA7OyBjbG9zdXJlLT5jaWYKKyAgICAgICAgbW92ICBlZHgsIFtlYXggKyBSQVdfQ0xPU1VSRV9VU0VSX0RBVEFfT0ZGU0VUXSAgOzsgY2xvc3VyZS0+dXNlcl9kYXRhCisgICAgICAgIG1vdiAgW2VzcCArIDEyXSwgZWR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHVzZXJfZGF0YQorICAgICAgICBsZWEgIGVkeCwgW2VicCArIDhdCisgICAgICAgIG1vdiAgW2VzcCArIDhdLCBlZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHJhd19hcmdzCisgICAgICAgIGxlYSAgZWR4LCBbZWJwIC0gMjRdCisgICAgICAgIG1vdiAgW2VzcCArIDRdLCBlZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7ICZyZXMKKyAgICAgICAgbW92ICBbZXNwXSwgZXNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgY2lmCisgICAgICAgIGNhbGwgRFdPUkQgUFRSIFtlYXggKyBSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUXSAgIDs7IGNsb3N1cmUtPmZ1bgorICAgICAgICBtb3YgIGVheCwgW2VzaSArIENJRl9GTEFHU19PRkZTRVRdICAgICAgICAgICAgICA7OyBjaWYtPmZsYWdzCisgICAgICAgIGxlYSAgZWN4LCBbZWJwIC0gMjRdCisKK2NyX2p1bXB0YWJsZToKKyAgICAgICAgam1wICBbY3JfanVtcGRhdGEgKyA0ICogZWF4XQorY3JfanVtcGRhdGE6CisgICAgICAgIDs7IERvIG5vdCBpbnNlcnQgYW55dGhpbmcgaGVyZSBiZXR3ZWVuIHRoZSBsYWJlbCBhbmQganVtcCB0YWJsZS4KKyAgICAgICAgZGQgb2Zmc2V0IGNyX2VwaWxvZ3VlICAgICAgIDs7IEZGSV9UWVBFX1ZPSUQKKyAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX0lOVAorICAgICAgICBkZCBvZmZzZXQgY3JfcmV0ZmxvYXQgICAgICAgOzsgRkZJX1RZUEVfRkxPQVQKKyAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGRvdWJsZSAgICAgIDs7IEZGSV9UWVBFX0RPVUJMRQorICAgICAgICBkZCBvZmZzZXQgY3JfcmV0bG9uZ2RvdWJsZSAgOzsgRkZJX1RZUEVfTE9OR0RPVUJMRQorICAgICAgICBkZCBvZmZzZXQgY3JfcmV0aW50OCAgICAgICAgOzsgRkZJX1RZUEVfVUlOVDgKKyAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludDggICAgICAgIDs7IEZGSV9UWVBFX1NJTlQ4CisgICAgICAgIGRkIG9mZnNldCBjcl9yZXRpbnQxNiAgICAgICA7OyBGRklfVFlQRV9VSU5UMTYKKyAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludDE2ICAgICAgIDs7IEZGSV9UWVBFX1NJTlQxNgorICAgICAgICBkZCBvZmZzZXQgY3JfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfVUlOVDMyCisgICAgICAgIGRkIG9mZnNldCBjcl9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9TSU5UMzIKKyAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludDY0ICAgICAgIDs7IEZGSV9UWVBFX1VJTlQ2NAorICAgICAgICBkZCBvZmZzZXQgY3JfcmV0aW50NjQgICAgICAgOzsgRkZJX1RZUEVfU0lOVDY0CisgICAgICAgIGRkIG9mZnNldCBjcl9lcGlsb2d1ZSAgICAgICA7OyBGRklfVFlQRV9TVFJVQ1QKKyAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1BPSU5URVIKKyAgICAgICAgZGQgb2Zmc2V0IGNyX3JldGludDggICAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQgorICAgICAgICBkZCBvZmZzZXQgY3JfcmV0aW50MTYgICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCCisgICAgICAgIGRkIG9mZnNldCBjcl9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIKKworY3JfcmV0aW50ODoKKyAgICAgICAgbW92ICAgYWwsIFtlY3hdCisgICAgICAgIGptcCAgIGNyX2VwaWxvZ3VlCisKK2NyX3JldGludDE2OgorICAgICAgICBtb3YgICBheCwgW2VjeF0KKyAgICAgICAgam1wICAgY3JfZXBpbG9ndWUKKworY3JfcmV0aW50OgorICAgICAgICBtb3YgICBlYXgsIFtlY3hdCisgICAgICAgIGptcCAgIGNyX2VwaWxvZ3VlCisKK2NyX3JldGludDY0OgorICAgICAgICBtb3YgICBlYXgsIFtlY3ggKyAwXQorICAgICAgICBtb3YgICBlZHgsIFtlY3ggKyA0XQorICAgICAgICBqbXAgICBjcl9lcGlsb2d1ZQorCitjcl9yZXRmbG9hdDoKKyAgICAgICAgZmxkICAgRFdPUkQgUFRSIFtlY3hdCisgICAgICAgIGptcCAgIGNyX2VwaWxvZ3VlCisKK2NyX3JldGRvdWJsZToKKyAgICAgICAgZmxkICAgUVdPUkQgUFRSIFtlY3hdCisgICAgICAgIGptcCAgIGNyX2VwaWxvZ3VlCisKK2NyX3JldGxvbmdkb3VibGU6CisgICAgICAgIGZsZCAgIFRCWVRFIFBUUiBbZWN4XQorICAgICAgICBqbXAgICBjcl9lcGlsb2d1ZQorCitjcl9lcGlsb2d1ZToKKyAgICAgICAgOzsgRXBpbG9ndWUgY29kZSBpcyBhdXRvZ2VuZXJhdGVkLgorICAgICAgICByZXQKK2ZmaV9jbG9zdXJlX3Jhd19TWVNWIEVORFAKKworI2VuZGlmIC8qICFGRklfTk9fUkFXX0FQSSAqLworCitmZmlfY2xvc3VyZV9TVERDQUxMIFBST0MgTkVBUiA8Rk9SQ0VGUkFNRT4KKyAgICA7OyB0aGUgZmZpX2Nsb3N1cmUgY3R4IGlzIHBhc3NlZCBpbiBlYXggYnkgdGhlIHRyYW1wb2xpbmUuCisKKyAgICAgICAgc3ViICBlc3AsIDQwCisgICAgICAgIGxlYSAgZWR4LCBbZWJwIC0gMjRdCisgICAgICAgIG1vdiAgW2VicCAtIDEyXSwgZWR4ICAgICAgICAgOzsgcmVzcAorICAgICAgICBsZWEgIGVkeCwgW2VicCArIDEyXSAgICAgICAgIDs7IGFjY291bnQgZm9yIHN0dWIgcmV0dXJuIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgbW92ICBbZXNwICsgOF0sIGVkeCAgICAgICAgICA7OyBhcmdzCisgICAgICAgIGxlYSAgZWR4LCBbZWJwIC0gMTJdCisgICAgICAgIG1vdiAgW2VzcCArIDRdLCBlZHggICAgICAgICAgOzsgJnJlc3AKKyAgICAgICAgbW92ICBbZXNwXSwgZWF4ICAgICAgICAgICAgICA7OyBjbG9zdXJlCisgICAgICAgIGNhbGwgZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcgorICAgICAgICBtb3YgIGVjeCwgW2VicCAtIDEyXQorCitjZF9qdW1wdGFibGU6CisgICAgICAgIGptcCAgW2NkX2p1bXBkYXRhICsgNCAqIGVheF0KK2NkX2p1bXBkYXRhOgorICAgICAgICA7OyBEbyBub3QgaW5zZXJ0IGFueXRoaW5nIGhlcmUgYmV0d2VlbiB0aGUgbGFiZWwgYW5kIGp1bXAgdGFibGUuCisgICAgICAgIGRkIG9mZnNldCBjZF9lcGlsb2d1ZSAgICAgICA7OyBGRklfVFlQRV9WT0lECisgICAgICAgIGRkIG9mZnNldCBjZF9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9JTlQKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGZsb2F0ICAgICAgIDs7IEZGSV9UWVBFX0ZMT0FUCisgICAgICAgIGRkIG9mZnNldCBjZF9yZXRkb3VibGUgICAgICA7OyBGRklfVFlQRV9ET1VCTEUKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGxvbmdkb3VibGUgIDs7IEZGSV9UWVBFX0xPTkdET1VCTEUKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludDggICAgICAgIDs7IEZGSV9UWVBFX1VJTlQ4CisgICAgICAgIGRkIG9mZnNldCBjZF9yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9TSU5UOAorICAgICAgICBkZCBvZmZzZXQgY2RfcmV0aW50MTYgICAgICAgOzsgRkZJX1RZUEVfVUlOVDE2CisgICAgICAgIGRkIG9mZnNldCBjZF9yZXRpbnQxNiAgICAgICA7OyBGRklfVFlQRV9TSU5UMTYKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludCAgICAgICAgIDs7IEZGSV9UWVBFX1VJTlQzMgorICAgICAgICBkZCBvZmZzZXQgY2RfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfU0lOVDMyCisgICAgICAgIGRkIG9mZnNldCBjZF9yZXRpbnQ2NCAgICAgICA7OyBGRklfVFlQRV9VSU5UNjQKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludDY0ICAgICAgIDs7IEZGSV9UWVBFX1NJTlQ2NAorICAgICAgICBkZCBvZmZzZXQgY2RfZXBpbG9ndWUgICAgICAgOzsgRkZJX1RZUEVfU1RSVUNUCisgICAgICAgIGRkIG9mZnNldCBjZF9yZXRpbnQgICAgICAgICA7OyBGRklfVFlQRV9QT0lOVEVSCisgICAgICAgIGRkIG9mZnNldCBjZF9yZXRpbnQ4ICAgICAgICA7OyBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIKKyAgICAgICAgZGQgb2Zmc2V0IGNkX3JldGludDE2ICAgICAgIDs7IEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8yQgorICAgICAgICBkZCBvZmZzZXQgY2RfcmV0aW50ICAgICAgICAgOzsgRkZJX1RZUEVfU01BTExfU1RSVUNUXzRCCisKK2NkX3JldGludDg6CisgICAgICAgIG1vdiAgIGFsLCBbZWN4XQorICAgICAgICBqbXAgICBjZF9lcGlsb2d1ZQorCitjZF9yZXRpbnQxNjoKKyAgICAgICAgbW92ICAgYXgsIFtlY3hdCisgICAgICAgIGptcCAgIGNkX2VwaWxvZ3VlCisKK2NkX3JldGludDoKKyAgICAgICAgbW92ICAgZWF4LCBbZWN4XQorICAgICAgICBqbXAgICBjZF9lcGlsb2d1ZQorCitjZF9yZXRpbnQ2NDoKKyAgICAgICAgbW92ICAgZWF4LCBbZWN4ICsgMF0KKyAgICAgICAgbW92ICAgZWR4LCBbZWN4ICsgNF0KKyAgICAgICAgam1wICAgY2RfZXBpbG9ndWUKKworY2RfcmV0ZmxvYXQ6CisgICAgICAgIGZsZCAgIERXT1JEIFBUUiBbZWN4XQorICAgICAgICBqbXAgICBjZF9lcGlsb2d1ZQorCitjZF9yZXRkb3VibGU6CisgICAgICAgIGZsZCAgIFFXT1JEIFBUUiBbZWN4XQorICAgICAgICBqbXAgICBjZF9lcGlsb2d1ZQorCitjZF9yZXRsb25nZG91YmxlOgorICAgICAgICBmbGQgICBUQllURSBQVFIgW2VjeF0KKyAgICAgICAgam1wICAgY2RfZXBpbG9ndWUKKworY2RfZXBpbG9ndWU6CisgICAgICAgIDs7IEVwaWxvZ3VlIGNvZGUgaXMgYXV0b2dlbmVyYXRlZC4KKyAgICAgICAgcmV0CitmZmlfY2xvc3VyZV9TVERDQUxMIEVORFAKKworX1RFWFQgRU5EUworRU5ECisKKyNlbHNlCisKKwkudGV4dAorIAorICAgICAgICAjIFRoaXMgYXNzdW1lcyB3ZSBhcmUgdXNpbmcgZ2FzLgorICAgICAgICAuYmFsaWduIDE2CisJLmdsb2JsCV9mZmlfY2FsbF93aW4zMgorI2lmbmRlZiBfX09TMl9fCisJLmRlZglfZmZpX2NhbGxfd2luMzI7CS5zY2wJMjsJLnR5cGUJMzI7CS5lbmRlZgorI2VuZGlmCitfZmZpX2NhbGxfd2luMzI6CisuTEZCMToKKyAgICAgICAgcHVzaGwgJWVicAorLkxDRkkwOgorICAgICAgICBtb3ZsICAlZXNwLCVlYnAKKy5MQ0ZJMToKKyAgICAgICAgIyBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuCisgICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBzdWJsICAlZWN4LCVlc3AKKyAKKyAgICAgICAgbW92bCAgJWVzcCwlZWF4CisgCisgICAgICAgICMgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCisgICAgICAgIHB1c2hsIDEyKCVlYnApCisgICAgICAgIHB1c2hsICVlYXgKKyAgICAgICAgY2FsbCAgKjgoJWVicCkKKyAKKyAgICAgICAgIyBSZXR1cm4gc3RhY2sgdG8gcHJldmlvdXMgc3RhdGUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uCisgICAgICAgIGFkZGwgICQ4LCVlc3AKKyAKKyAgICAgICAgIyBGSVhNRTogQWxpZ24gdGhlIHN0YWNrIHRvIGEgMTI4LWJpdCBib3VuZGFyeSB0byBhdm9pZAorICAgICAgICAjIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBoaXRzLgorCisgICAgICAgIGNhbGwgICoyOCglZWJwKQorIAorICAgICAgICAjIHN0ZGNhbGwgZnVuY3Rpb25zIHBvcCBhcmd1bWVudHMgb2ZmIHRoZSBzdGFjayB0aGVtc2VsdmVzCisKKyAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZQorICAgICAgICBtb3ZsICAyMCglZWJwKSwlZWN4CisgCisgICAgICAgICMgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCisgICAgICAgIGNtcGwgICQwLDI0KCVlYnApCisgICAgICAgIGpuZSAgIDBmCisgCisgICAgICAgICMgRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlCisgICAgICAgICMgb2JsaWdlZCB0byBoYW5kbGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorICAgICAgICBjbXBsICAkRkZJX1RZUEVfRkxPQVQsJWVjeAorICAgICAgICBqbmUgICAuTG5vcmV0dmFsCisgICAgICAgIGZzdHAgICVzdCgwKQorIAorICAgICAgICBqbXAgICAuTGVwaWxvZ3VlCisKKzA6CisJY2FsbAkxZgorCSMgRG8gbm90IGluc2VydCBhbnl0aGluZyBoZXJlIGJldHdlZW4gdGhlIGNhbGwgYW5kIHRoZSBqdW1wIHRhYmxlLgorLkxzdG9yZV90YWJsZToKKwkubG9uZwkuTG5vcmV0dmFsCQkvKiBGRklfVFlQRV9WT0lEICovCisJLmxvbmcJLkxyZXRpbnQJCS8qIEZGSV9UWVBFX0lOVCAqLworCS5sb25nCS5McmV0ZmxvYXQJCS8qIEZGSV9UWVBFX0ZMT0FUICovCisJLmxvbmcJLkxyZXRkb3VibGUJCS8qIEZGSV9UWVBFX0RPVUJMRSAqLworCS5sb25nCS5McmV0bG9uZ2RvdWJsZQkJLyogRkZJX1RZUEVfTE9OR0RPVUJMRSAqLworCS5sb25nCS5McmV0dWludDgJCS8qIEZGSV9UWVBFX1VJTlQ4ICovCisJLmxvbmcJLkxyZXRzaW50OAkJLyogRkZJX1RZUEVfU0lOVDggKi8KKwkubG9uZwkuTHJldHVpbnQxNgkJLyogRkZJX1RZUEVfVUlOVDE2ICovCisJLmxvbmcJLkxyZXRzaW50MTYJCS8qIEZGSV9UWVBFX1NJTlQxNiAqLworCS5sb25nCS5McmV0aW50CQkvKiBGRklfVFlQRV9VSU5UMzIgKi8KKwkubG9uZwkuTHJldGludAkJLyogRkZJX1RZUEVfU0lOVDMyICovCisJLmxvbmcJLkxyZXRpbnQ2NAkJLyogRkZJX1RZUEVfVUlOVDY0ICovCisJLmxvbmcJLkxyZXRpbnQ2NAkJLyogRkZJX1RZUEVfU0lOVDY0ICovCisJLmxvbmcJLkxyZXRzdHJ1Y3QJCS8qIEZGSV9UWVBFX1NUUlVDVCAqLworCS5sb25nCS5McmV0aW50CQkvKiBGRklfVFlQRV9QT0lOVEVSICovCisJLmxvbmcJLkxyZXRzdHJ1Y3QxYgkJLyogRkZJX1RZUEVfU01BTExfU1RSVUNUXzFCICovCisJLmxvbmcJLkxyZXRzdHJ1Y3QyYgkJLyogRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCICovCisJLmxvbmcJLkxyZXRzdHJ1Y3Q0YgkJLyogRkZJX1RZUEVfU01BTExfU1RSVUNUXzRCICovCisxOgorCWFkZAklZWN4LCAlZWN4CisJYWRkCSVlY3gsICVlY3gKKwlhZGQJKCVlc3ApLCVlY3gKKwlhZGQJJDQsICVlc3AKKwlqbXAJKiglZWN4KQorCisJLyogU2lnbi96ZXJvIGV4dGVuZCBhcyBhcHByb3ByaWF0ZS4gICovCisuTHJldHNpbnQ4OgorCW1vdnNibAklYWwsICVlYXgKKwlqbXAJLkxyZXRpbnQKKworLkxyZXRzaW50MTY6CisJbW92c3dsCSVheCwgJWVheAorCWptcAkuTHJldGludAorCisuTHJldHVpbnQ4OgorCW1vdnpibAklYWwsICVlYXgKKwlqbXAJLkxyZXRpbnQKKworLkxyZXR1aW50MTY6CisJbW92endsCSVheCwgJWVheAorCWptcAkuTHJldGludAorCisuTHJldGludDoKKyAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgbW92bCAgJWVheCwwKCVlY3gpCisgICAgICAgIGptcCAgIC5MZXBpbG9ndWUKKyAKKy5McmV0ZmxvYXQ6CisgICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBmc3RwcyAoJWVjeCkKKyAgICAgICAgam1wICAgLkxlcGlsb2d1ZQorIAorLkxyZXRkb3VibGU6CisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIGZzdHBsICglZWN4KQorICAgICAgICBqbXAgICAuTGVwaWxvZ3VlCisgCisuTHJldGxvbmdkb3VibGU6CisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIGZzdHB0ICglZWN4KQorICAgICAgICBqbXAgICAuTGVwaWxvZ3VlCisgCisuTHJldGludDY0OgorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3ZsICAlZWF4LDAoJWVjeCkKKyAgICAgICAgbW92bCAgJWVkeCw0KCVlY3gpCisJam1wICAgLkxlcGlsb2d1ZQorCisuTHJldHN0cnVjdDFiOgorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3ZiICAlYWwsMCglZWN4KQorICAgICAgICBqbXAgICAuTGVwaWxvZ3VlCisgCisuTHJldHN0cnVjdDJiOgorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3Z3ICAlYXgsMCglZWN4KQorICAgICAgICBqbXAgICAuTGVwaWxvZ3VlCisKKy5McmV0c3RydWN0NGI6CisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIG1vdmwgICVlYXgsMCglZWN4KQorICAgICAgICBqbXAgICAuTGVwaWxvZ3VlCisKKy5McmV0c3RydWN0OgorICAgICAgICAjIE5vdGhpbmcgdG8gZG8hCisgCisuTG5vcmV0dmFsOgorLkxlcGlsb2d1ZToKKyAgICAgICAgbW92bCAlZWJwLCVlc3AKKyAgICAgICAgcG9wbCAlZWJwCisgICAgICAgIHJldAorLmZmaV9jYWxsX3dpbjMyX2VuZDoKKy5MRkUxOgorCisgICAgICAgICMgVGhpcyBhc3N1bWVzIHdlIGFyZSB1c2luZyBnYXMuCisgICAgICAgIC5iYWxpZ24gMTYKKwkuZ2xvYmwJX2ZmaV9jbG9zdXJlX1NZU1YKKyNpZm5kZWYgX19PUzJfXworCS5kZWYJX2ZmaV9jbG9zdXJlX1NZU1Y7CS5zY2wJMjsJLnR5cGUJMzI7CS5lbmRlZgorI2VuZGlmCitfZmZpX2Nsb3N1cmVfU1lTVjoKKy5MRkIzOgorCXB1c2hsCSVlYnAKKy5MQ0ZJNDoKKwltb3ZsCSVlc3AsICVlYnAKKy5MQ0ZJNToKKwlzdWJsCSQ0MCwgJWVzcAorCWxlYWwJLTI0KCVlYnApLCAlZWR4CisJbW92bAklZWR4LCAtMTIoJWVicCkJLyogcmVzcCAqLworCWxlYWwJOCglZWJwKSwgJWVkeAorCW1vdmwJJWVkeCwgNCglZXNwKQkvKiBhcmdzID0gX19idWlsdGluX2R3YXJmX2NmYSAoKSAqLworCWxlYWwJLTEyKCVlYnApLCAlZWR4CisJbW92bAklZWR4LCAoJWVzcCkJLyogJnJlc3AgKi8KKwljYWxsCV9mZmlfY2xvc3VyZV9TWVNWX2lubmVyCisJbW92bAktMTIoJWVicCksICVlY3gKKworMDoKKwljYWxsCTFmCisJIyBEbyBub3QgaW5zZXJ0IGFueXRoaW5nIGhlcmUgYmV0d2VlbiB0aGUgY2FsbCBhbmQgdGhlIGp1bXAgdGFibGUuCisuTGNsc19zdG9yZV90YWJsZToKKwkubG9uZwkuTGNsc19ub3JldHZhbAkJLyogRkZJX1RZUEVfVk9JRCAqLworCS5sb25nCS5MY2xzX3JldGludAkJLyogRkZJX1RZUEVfSU5UICovCisJLmxvbmcJLkxjbHNfcmV0ZmxvYXQJCS8qIEZGSV9UWVBFX0ZMT0FUICovCisJLmxvbmcJLkxjbHNfcmV0ZG91YmxlCQkvKiBGRklfVFlQRV9ET1VCTEUgKi8KKwkubG9uZwkuTGNsc19yZXRsZG91YmxlCS8qIEZGSV9UWVBFX0xPTkdET1VCTEUgKi8KKwkubG9uZwkuTGNsc19yZXR1aW50OAkJLyogRkZJX1RZUEVfVUlOVDggKi8KKwkubG9uZwkuTGNsc19yZXRzaW50OAkJLyogRkZJX1RZUEVfU0lOVDggKi8KKwkubG9uZwkuTGNsc19yZXR1aW50MTYJCS8qIEZGSV9UWVBFX1VJTlQxNiAqLworCS5sb25nCS5MY2xzX3JldHNpbnQxNgkJLyogRkZJX1RZUEVfU0lOVDE2ICovCisJLmxvbmcJLkxjbHNfcmV0aW50CQkvKiBGRklfVFlQRV9VSU5UMzIgKi8KKwkubG9uZwkuTGNsc19yZXRpbnQJCS8qIEZGSV9UWVBFX1NJTlQzMiAqLworCS5sb25nCS5MY2xzX3JldGxsb25nCQkvKiBGRklfVFlQRV9VSU5UNjQgKi8KKwkubG9uZwkuTGNsc19yZXRsbG9uZwkJLyogRkZJX1RZUEVfU0lOVDY0ICovCisJLmxvbmcJLkxjbHNfcmV0c3RydWN0CQkvKiBGRklfVFlQRV9TVFJVQ1QgKi8KKwkubG9uZwkuTGNsc19yZXRpbnQJCS8qIEZGSV9UWVBFX1BPSU5URVIgKi8KKwkubG9uZwkuTGNsc19yZXRzdHJ1Y3QxCS8qIEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQiAqLworCS5sb25nCS5MY2xzX3JldHN0cnVjdDIJLyogRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCICovCisJLmxvbmcJLkxjbHNfcmV0c3RydWN0NAkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIgKi8KKworMToKKwlhZGQJJWVheCwgJWVheAorCWFkZAklZWF4LCAlZWF4CisJYWRkCSglZXNwKSwlZWF4CisJYWRkCSQ0LCAlZXNwCisJam1wCSooJWVheCkKKworCS8qIFNpZ24vemVybyBleHRlbmQgYXMgYXBwcm9wcmlhdGUuICAqLworLkxjbHNfcmV0c2ludDg6CisJbW92c2JsCSglZWN4KSwgJWVheAorCWptcAkuTGNsc19lcGlsb2d1ZQorCisuTGNsc19yZXRzaW50MTY6CisJbW92c3dsCSglZWN4KSwgJWVheAorCWptcAkuTGNsc19lcGlsb2d1ZQorCisuTGNsc19yZXR1aW50ODoKKwltb3Z6YmwJKCVlY3gpLCAlZWF4CisJam1wCS5MY2xzX2VwaWxvZ3VlCisKKy5MY2xzX3JldHVpbnQxNjoKKwltb3Z6d2wJKCVlY3gpLCAlZWF4CisJam1wCS5MY2xzX2VwaWxvZ3VlCisKKy5MY2xzX3JldGludDoKKwltb3ZsCSglZWN4KSwgJWVheAorCWptcAkuTGNsc19lcGlsb2d1ZQorCisuTGNsc19yZXRmbG9hdDoKKwlmbGRzCSglZWN4KQorCWptcAkuTGNsc19lcGlsb2d1ZQorCisuTGNsc19yZXRkb3VibGU6CisJZmxkbAkoJWVjeCkKKwlqbXAJLkxjbHNfZXBpbG9ndWUKKworLkxjbHNfcmV0bGRvdWJsZToKKwlmbGR0CSglZWN4KQorCWptcAkuTGNsc19lcGlsb2d1ZQorCisuTGNsc19yZXRsbG9uZzoKKwltb3ZsCSglZWN4KSwgJWVheAorCW1vdmwJNCglZWN4KSwgJWVkeAorCWptcAkuTGNsc19lcGlsb2d1ZQorCisuTGNsc19yZXRzdHJ1Y3QxOgorCW1vdnNibAkoJWVjeCksICVlYXgKKwlqbXAJLkxjbHNfZXBpbG9ndWUKKworLkxjbHNfcmV0c3RydWN0MjoKKwltb3Zzd2wJKCVlY3gpLCAlZWF4CisJam1wCS5MY2xzX2VwaWxvZ3VlCisKKy5MY2xzX3JldHN0cnVjdDQ6CisJbW92bAkoJWVjeCksICVlYXgKKwlqbXAJLkxjbHNfZXBpbG9ndWUKKworLkxjbHNfcmV0c3RydWN0OgorICAgICAgICAjIENhbGxlciBleHBlY3RzIHVzIHRvIHBvcCBzdHJ1Y3QgcmV0dXJuIHZhbHVlIHBvaW50ZXIgaGlkZGVuIGFyZy4KKwltb3ZsCSVlYnAsICVlc3AKKwlwb3BsCSVlYnAKKwlyZXQJJDB4NAorCisuTGNsc19ub3JldHZhbDoKKy5MY2xzX2VwaWxvZ3VlOgorCW1vdmwJJWVicCwgJWVzcAorCXBvcGwJJWVicAorCXJldAorLmZmaV9jbG9zdXJlX1NZU1ZfZW5kOgorLkxGRTM6CisKKyNpZiAhRkZJX05PX1JBV19BUEkKKworI2RlZmluZSBSQVdfQ0xPU1VSRV9DSUZfT0ZGU0VUICgoRkZJX1RSQU1QT0xJTkVfU0laRSArIDMpICYgfjMpCisjZGVmaW5lIFJBV19DTE9TVVJFX0ZVTl9PRkZTRVQgKFJBV19DTE9TVVJFX0NJRl9PRkZTRVQgKyA0KQorI2RlZmluZSBSQVdfQ0xPU1VSRV9VU0VSX0RBVEFfT0ZGU0VUIChSQVdfQ0xPU1VSRV9GVU5fT0ZGU0VUICsgNCkKKyNkZWZpbmUgQ0lGX0ZMQUdTX09GRlNFVCAyMAorCisgICAgICAgICMgVGhpcyBhc3N1bWVzIHdlIGFyZSB1c2luZyBnYXMuCisgICAgICAgIC5iYWxpZ24gMTYKKwkuZ2xvYmwJX2ZmaV9jbG9zdXJlX3Jhd19TWVNWCisjaWZuZGVmIF9fT1MyX18KKwkuZGVmCV9mZmlfY2xvc3VyZV9yYXdfU1lTVjsJLnNjbAkyOwkudHlwZQkzMjsJLmVuZGVmCisjZW5kaWYKK19mZmlfY2xvc3VyZV9yYXdfU1lTVjoKKy5MRkI0OgorCXB1c2hsCSVlYnAKKy5MQ0ZJNjoKKwltb3ZsCSVlc3AsICVlYnAKKy5MQ0ZJNzoKKwlwdXNobAklZXNpCisuTENGSTg6CisJc3VibAkkMzYsICVlc3AKKwltb3ZsCVJBV19DTE9TVVJFX0NJRl9PRkZTRVQoJWVheCksICVlc2kJIC8qIGNsb3N1cmUtPmNpZiAqLworCW1vdmwJUkFXX0NMT1NVUkVfVVNFUl9EQVRBX09GRlNFVCglZWF4KSwgJWVkeCAvKiBjbG9zdXJlLT51c2VyX2RhdGEgKi8KKwltb3ZsCSVlZHgsIDEyKCVlc3ApCS8qIHVzZXJfZGF0YSAqLworCWxlYWwJOCglZWJwKSwgJWVkeAkvKiBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpICovCisJbW92bAklZWR4LCA4KCVlc3ApCS8qIHJhd19hcmdzICovCisJbGVhbAktMjQoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsIDQoJWVzcCkJLyogJnJlcyAqLworCW1vdmwJJWVzaSwgKCVlc3ApCS8qIGNpZiAqLworCWNhbGwJKlJBV19DTE9TVVJFX0ZVTl9PRkZTRVQoJWVheCkJCSAvKiBjbG9zdXJlLT5mdW4gKi8KKwltb3ZsCUNJRl9GTEFHU19PRkZTRVQoJWVzaSksICVlYXgJCSAvKiBydHlwZSAqLworMDoKKwljYWxsCTFmCisJIyBEbyBub3QgaW5zZXJ0IGFueXRoaW5nIGhlcmUgYmV0d2VlbiB0aGUgY2FsbCBhbmQgdGhlIGp1bXAgdGFibGUuCisuTHJjbHNfc3RvcmVfdGFibGU6CisJLmxvbmcJLkxyY2xzX25vcmV0dmFsCQkvKiBGRklfVFlQRV9WT0lEICovCisJLmxvbmcJLkxyY2xzX3JldGludAkJLyogRkZJX1RZUEVfSU5UICovCisJLmxvbmcJLkxyY2xzX3JldGZsb2F0CQkvKiBGRklfVFlQRV9GTE9BVCAqLworCS5sb25nCS5McmNsc19yZXRkb3VibGUJLyogRkZJX1RZUEVfRE9VQkxFICovCisJLmxvbmcJLkxyY2xzX3JldGxkb3VibGUJLyogRkZJX1RZUEVfTE9OR0RPVUJMRSAqLworCS5sb25nCS5McmNsc19yZXR1aW50OAkJLyogRkZJX1RZUEVfVUlOVDggKi8KKwkubG9uZwkuTHJjbHNfcmV0c2ludDgJCS8qIEZGSV9UWVBFX1NJTlQ4ICovCisJLmxvbmcJLkxyY2xzX3JldHVpbnQxNgkvKiBGRklfVFlQRV9VSU5UMTYgKi8KKwkubG9uZwkuTHJjbHNfcmV0c2ludDE2CS8qIEZGSV9UWVBFX1NJTlQxNiAqLworCS5sb25nCS5McmNsc19yZXRpbnQJCS8qIEZGSV9UWVBFX1VJTlQzMiAqLworCS5sb25nCS5McmNsc19yZXRpbnQJCS8qIEZGSV9UWVBFX1NJTlQzMiAqLworCS5sb25nCS5McmNsc19yZXRsbG9uZwkJLyogRkZJX1RZUEVfVUlOVDY0ICovCisJLmxvbmcJLkxyY2xzX3JldGxsb25nCQkvKiBGRklfVFlQRV9TSU5UNjQgKi8KKwkubG9uZwkuTHJjbHNfcmV0c3RydWN0CS8qIEZGSV9UWVBFX1NUUlVDVCAqLworCS5sb25nCS5McmNsc19yZXRpbnQJCS8qIEZGSV9UWVBFX1BPSU5URVIgKi8KKwkubG9uZwkuTHJjbHNfcmV0c3RydWN0MQkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIgKi8KKwkubG9uZwkuTHJjbHNfcmV0c3RydWN0MgkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIgKi8KKwkubG9uZwkuTHJjbHNfcmV0c3RydWN0NAkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIgKi8KKzE6CisJYWRkCSVlYXgsICVlYXgKKwlhZGQJJWVheCwgJWVheAorCWFkZAkoJWVzcCksJWVheAorCWFkZAkkNCwgJWVzcAorCWptcAkqKCVlYXgpCisKKwkvKiBTaWduL3plcm8gZXh0ZW5kIGFzIGFwcHJvcHJpYXRlLiAgKi8KKy5McmNsc19yZXRzaW50ODoKKwltb3ZzYmwJLTI0KCVlYnApLCAlZWF4CisJam1wCS5McmNsc19lcGlsb2d1ZQorCisuTHJjbHNfcmV0c2ludDE2OgorCW1vdnN3bAktMjQoJWVicCksICVlYXgKKwlqbXAJLkxyY2xzX2VwaWxvZ3VlCisKKy5McmNsc19yZXR1aW50ODoKKwltb3Z6YmwJLTI0KCVlYnApLCAlZWF4CisJam1wCS5McmNsc19lcGlsb2d1ZQorCisuTHJjbHNfcmV0dWludDE2OgorCW1vdnp3bAktMjQoJWVicCksICVlYXgKKwlqbXAJLkxyY2xzX2VwaWxvZ3VlCisKKy5McmNsc19yZXRpbnQ6CisJbW92bAktMjQoJWVicCksICVlYXgKKwlqbXAJLkxyY2xzX2VwaWxvZ3VlCisKKy5McmNsc19yZXRmbG9hdDoKKwlmbGRzCS0yNCglZWJwKQorCWptcAkuTHJjbHNfZXBpbG9ndWUKKworLkxyY2xzX3JldGRvdWJsZToKKwlmbGRsCS0yNCglZWJwKQorCWptcAkuTHJjbHNfZXBpbG9ndWUKKworLkxyY2xzX3JldGxkb3VibGU6CisJZmxkdAktMjQoJWVicCkKKwlqbXAJLkxyY2xzX2VwaWxvZ3VlCisKKy5McmNsc19yZXRsbG9uZzoKKwltb3ZsCS0yNCglZWJwKSwgJWVheAorCW1vdmwJLTIwKCVlYnApLCAlZWR4CisJam1wCS5McmNsc19lcGlsb2d1ZQorCisuTHJjbHNfcmV0c3RydWN0MToKKwltb3ZzYmwJLTI0KCVlYnApLCAlZWF4CisJam1wCS5McmNsc19lcGlsb2d1ZQorCisuTHJjbHNfcmV0c3RydWN0MjoKKwltb3Zzd2wJLTI0KCVlYnApLCAlZWF4CisJam1wCS5McmNsc19lcGlsb2d1ZQorCisuTHJjbHNfcmV0c3RydWN0NDoKKwltb3ZsCS0yNCglZWJwKSwgJWVheAorCWptcAkuTHJjbHNfZXBpbG9ndWUKKworLkxyY2xzX3JldHN0cnVjdDoKKwkjIE5vdGhpbmcgdG8gZG8hCisKKy5McmNsc19ub3JldHZhbDoKKy5McmNsc19lcGlsb2d1ZToKKwlhZGRsCSQzNiwgJWVzcAorCXBvcGwJJWVzaQorCXBvcGwJJWVicAorCXJldAorLmZmaV9jbG9zdXJlX3Jhd19TWVNWX2VuZDoKKy5MRkU0OgorCisjZW5kaWYgLyogIUZGSV9OT19SQVdfQVBJICovCisKKyAgICAgICAgIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KKwkuYmFsaWduCTE2CisJLmdsb2JsCV9mZmlfY2xvc3VyZV9TVERDQUxMCisjaWZuZGVmIF9fT1MyX18KKwkuZGVmCV9mZmlfY2xvc3VyZV9TVERDQUxMOwkuc2NsCTI7CS50eXBlCTMyOwkuZW5kZWYKKyNlbmRpZgorX2ZmaV9jbG9zdXJlX1NURENBTEw6CisuTEZCNToKKwlwdXNobAklZWJwCisuTENGSTk6CisJbW92bAklZXNwLCAlZWJwCisuTENGSTEwOgorCXN1YmwJJDQwLCAlZXNwCisJbGVhbAktMjQoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsIC0xMiglZWJwKQkvKiByZXNwICovCisJbGVhbAkxMiglZWJwKSwgJWVkeCAgLyogYWNjb3VudCBmb3Igc3R1YiByZXR1cm4gYWRkcmVzcyBvbiBzdGFjayAqLworCW1vdmwJJWVkeCwgNCglZXNwKQkvKiBhcmdzICovCisJbGVhbAktMTIoJWVicCksICVlZHgKKwltb3ZsCSVlZHgsICglZXNwKQkvKiAmcmVzcCAqLworCWNhbGwJX2ZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIKKwltb3ZsCS0xMiglZWJwKSwgJWVjeAorMDoKKwljYWxsCTFmCisJIyBEbyBub3QgaW5zZXJ0IGFueXRoaW5nIGhlcmUgYmV0d2VlbiB0aGUgY2FsbCBhbmQgdGhlIGp1bXAgdGFibGUuCisuTHNjbHNfc3RvcmVfdGFibGU6CisJLmxvbmcJLkxzY2xzX25vcmV0dmFsCQkvKiBGRklfVFlQRV9WT0lEICovCisJLmxvbmcJLkxzY2xzX3JldGludAkJLyogRkZJX1RZUEVfSU5UICovCisJLmxvbmcJLkxzY2xzX3JldGZsb2F0CQkvKiBGRklfVFlQRV9GTE9BVCAqLworCS5sb25nCS5Mc2Nsc19yZXRkb3VibGUJLyogRkZJX1RZUEVfRE9VQkxFICovCisJLmxvbmcJLkxzY2xzX3JldGxkb3VibGUJLyogRkZJX1RZUEVfTE9OR0RPVUJMRSAqLworCS5sb25nCS5Mc2Nsc19yZXR1aW50OAkJLyogRkZJX1RZUEVfVUlOVDggKi8KKwkubG9uZwkuTHNjbHNfcmV0c2ludDgJCS8qIEZGSV9UWVBFX1NJTlQ4ICovCisJLmxvbmcJLkxzY2xzX3JldHVpbnQxNgkvKiBGRklfVFlQRV9VSU5UMTYgKi8KKwkubG9uZwkuTHNjbHNfcmV0c2ludDE2CS8qIEZGSV9UWVBFX1NJTlQxNiAqLworCS5sb25nCS5Mc2Nsc19yZXRpbnQJCS8qIEZGSV9UWVBFX1VJTlQzMiAqLworCS5sb25nCS5Mc2Nsc19yZXRpbnQJCS8qIEZGSV9UWVBFX1NJTlQzMiAqLworCS5sb25nCS5Mc2Nsc19yZXRsbG9uZwkJLyogRkZJX1RZUEVfVUlOVDY0ICovCisJLmxvbmcJLkxzY2xzX3JldGxsb25nCQkvKiBGRklfVFlQRV9TSU5UNjQgKi8KKwkubG9uZwkuTHNjbHNfcmV0c3RydWN0CS8qIEZGSV9UWVBFX1NUUlVDVCAqLworCS5sb25nCS5Mc2Nsc19yZXRpbnQJCS8qIEZGSV9UWVBFX1BPSU5URVIgKi8KKwkubG9uZwkuTHNjbHNfcmV0c3RydWN0MQkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIgKi8KKwkubG9uZwkuTHNjbHNfcmV0c3RydWN0MgkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMkIgKi8KKwkubG9uZwkuTHNjbHNfcmV0c3RydWN0NAkvKiBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIgKi8KKzE6CisJYWRkCSVlYXgsICVlYXgKKwlhZGQJJWVheCwgJWVheAorCWFkZAkoJWVzcCksJWVheAorCWFkZAkkNCwgJWVzcAorCWptcAkqKCVlYXgpCisKKwkvKiBTaWduL3plcm8gZXh0ZW5kIGFzIGFwcHJvcHJpYXRlLiAgKi8KKy5Mc2Nsc19yZXRzaW50ODoKKwltb3ZzYmwJKCVlY3gpLCAlZWF4CisJam1wCS5Mc2Nsc19lcGlsb2d1ZQorCisuTHNjbHNfcmV0c2ludDE2OgorCW1vdnN3bAkoJWVjeCksICVlYXgKKwlqbXAJLkxzY2xzX2VwaWxvZ3VlCisKKy5Mc2Nsc19yZXR1aW50ODoKKwltb3Z6YmwJKCVlY3gpLCAlZWF4CisJam1wCS5Mc2Nsc19lcGlsb2d1ZQorCisuTHNjbHNfcmV0dWludDE2OgorCW1vdnp3bAkoJWVjeCksICVlYXgKKwlqbXAJLkxzY2xzX2VwaWxvZ3VlCisKKy5Mc2Nsc19yZXRpbnQ6CisJbW92bAkoJWVjeCksICVlYXgKKwlqbXAJLkxzY2xzX2VwaWxvZ3VlCisKKy5Mc2Nsc19yZXRmbG9hdDoKKwlmbGRzCSglZWN4KQorCWptcAkuTHNjbHNfZXBpbG9ndWUKKworLkxzY2xzX3JldGRvdWJsZToKKwlmbGRsCSglZWN4KQorCWptcAkuTHNjbHNfZXBpbG9ndWUKKworLkxzY2xzX3JldGxkb3VibGU6CisJZmxkdAkoJWVjeCkKKwlqbXAJLkxzY2xzX2VwaWxvZ3VlCisKKy5Mc2Nsc19yZXRsbG9uZzoKKwltb3ZsCSglZWN4KSwgJWVheAorCW1vdmwJNCglZWN4KSwgJWVkeAorCWptcAkuTHNjbHNfZXBpbG9ndWUKKworLkxzY2xzX3JldHN0cnVjdDE6CisJbW92c2JsCSglZWN4KSwgJWVheAorCWptcAkuTHNjbHNfZXBpbG9ndWUKKworLkxzY2xzX3JldHN0cnVjdDI6CisJbW92c3dsCSglZWN4KSwgJWVheAorCWptcAkuTHNjbHNfZXBpbG9ndWUKKworLkxzY2xzX3JldHN0cnVjdDQ6CisJbW92bAkoJWVjeCksICVlYXgKKwlqbXAJLkxzY2xzX2VwaWxvZ3VlCisKKy5Mc2Nsc19yZXRzdHJ1Y3Q6CisJIyBOb3RoaW5nIHRvIGRvIQorCisuTHNjbHNfbm9yZXR2YWw6CisuTHNjbHNfZXBpbG9ndWU6CisJbW92bAklZWJwLCAlZXNwCisJcG9wbAklZWJwCisJcmV0CisuZmZpX2Nsb3N1cmVfU1REQ0FMTF9lbmQ6CisuTEZFNToKKworI2lmbmRlZiBfX09TMl9fCisJLnNlY3Rpb24JLmVoX2ZyYW1lLCJ3IgorI2VuZGlmCisuTGZyYW1lMToKKy5MU0NJRTE6CisJLmxvbmcJLkxFQ0lFMS0uTEFTQ0lFMSAgLyogTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeSAqLworLkxBU0NJRTE6CisJLmxvbmcJMHgwCS8qIENJRSBJZGVudGlmaWVyIFRhZyAqLworCS5ieXRlCTB4MQkvKiBDSUUgVmVyc2lvbiAqLworI2lmZGVmIF9fUElDX18KKwkuYXNjaWkgInpSXDAiCS8qIENJRSBBdWdtZW50YXRpb24gKi8KKyNlbHNlCisJLmFzY2lpICJcMCIJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworI2VuZGlmCisJLmJ5dGUJMHgxCS8qIC51bGViMTI4IDB4MTsgQ0lFIENvZGUgQWxpZ25tZW50IEZhY3RvciAqLworCS5ieXRlCTB4N2MJLyogLnNsZWIxMjggLTQ7IENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IgKi8KKwkuYnl0ZQkweDgJLyogQ0lFIFJBIENvbHVtbiAqLworI2lmZGVmIF9fUElDX18KKwkuYnl0ZQkweDEJLyogLnVsZWIxMjggMHgxOyBBdWdtZW50YXRpb24gc2l6ZSAqLworCS5ieXRlCTB4MWIJLyogRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpICovCisjZW5kaWYKKwkuYnl0ZQkweGMJLyogRFdfQ0ZBX2RlZl9jZmEgQ0ZBID0gcjQgKyA0ID0gNCglZXNwKSAqLworCS5ieXRlCTB4NAkvKiAudWxlYjEyOCAweDQgKi8KKwkuYnl0ZQkweDQJLyogLnVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg4OAkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4ICVlaXAgYXQgQ0ZBICsgMSAqIC00ICovCisJLmJ5dGUJMHgxCS8qIC51bGViMTI4IDB4MSAqLworCS5hbGlnbiA0CisuTEVDSUUxOgorCisuTFNGREUxOgorCS5sb25nCS5MRUZERTEtLkxBU0ZERTEJLyogRkRFIExlbmd0aCAqLworLkxBU0ZERTE6CisJLmxvbmcJLkxBU0ZERTEtLkxmcmFtZTEJLyogRkRFIENJRSBvZmZzZXQgKi8KKyNpZiBkZWZpbmVkIF9fUElDX18gJiYgZGVmaW5lZCBIQVZFX0FTX1g4Nl9QQ1JFTAorCS5sb25nCS5MRkIxLS4JLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbHNlCisJLmxvbmcJLkxGQjEKKyNlbmRpZgorCS5sb25nCS5MRkUxLS5MRkIxCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MAkvKiAudWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplICovCisjZW5kaWYKKwkvKiBEV19DRkFfeHh4IENGSSBpbnN0cnVjdGlvbnMgZ28gaGVyZS4gICovCisKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMC0uTEZCMQorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgQ0ZBID0gcjQgKyA4ID0gOCglZXNwKSAqLworCS5ieXRlCTB4OAkvKiAudWxlYjEyOCAweDggKi8KKwkuYnl0ZQkweDg1CS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDUgJWVicCBhdCBDRkEgKyAyICogLTQgKi8KKwkuYnl0ZQkweDIJLyogLnVsZWIxMjggMHgyICovCisKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMS0uTENGSTAKKwkuYnl0ZQkweGQJLyogRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgQ0ZBID0gcjUgPSAlZWJwICovCisJLmJ5dGUJMHg1CS8qIC51bGViMTI4IDB4NSAqLworCisJLyogRW5kIG9mIERXX0NGQV94eHggQ0ZJIGluc3RydWN0aW9ucy4gICovCisJLmFsaWduIDQKKy5MRUZERTE6CisKKworLkxTRkRFMzoKKwkubG9uZwkuTEVGREUzLS5MQVNGREUzCS8qIEZERSBMZW5ndGggKi8KKy5MQVNGREUzOgorCS5sb25nCS5MQVNGREUzLS5MZnJhbWUxCS8qIEZERSBDSUUgb2Zmc2V0ICovCisjaWYgZGVmaW5lZCBfX1BJQ19fICYmIGRlZmluZWQgSEFWRV9BU19YODZfUENSRUwKKwkubG9uZwkuTEZCMy0uCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisjZWxzZQorCS5sb25nCS5MRkIzCisjZW5kaWYKKwkubG9uZwkuTEZFMy0uTEZCMwkvKiBGREUgYWRkcmVzcyByYW5nZSAqLworI2lmZGVmIF9fUElDX18KKwkuYnl0ZQkweDAJLyogLnVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZSAqLworI2VuZGlmCisJLyogRFdfQ0ZBX3h4eCBDRkkgaW5zdHJ1Y3Rpb25zIGdvIGhlcmUuICAqLworCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTENGSTQtLkxGQjMKKwkuYnl0ZQkweGUJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0IENGQSA9IHI0ICsgOCA9IDgoJWVzcCkgKi8KKwkuYnl0ZQkweDgJLyogLnVsZWIxMjggMHg4ICovCisJLmJ5dGUJMHg4NQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1ICVlYnAgYXQgQ0ZBICsgMiAqIC00ICovCisJLmJ5dGUJMHgyCS8qIC51bGViMTI4IDB4MiAqLworCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTENGSTUtLkxDRkk0CisJLmJ5dGUJMHhkCS8qIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyIENGQSA9IHI1ID0gJWVicCAqLworCS5ieXRlCTB4NQkvKiAudWxlYjEyOCAweDUgKi8KKworCS8qIEVuZCBvZiBEV19DRkFfeHh4IENGSSBpbnN0cnVjdGlvbnMuICAqLworCS5hbGlnbiA0CisuTEVGREUzOgorCisjaWYgIUZGSV9OT19SQVdfQVBJCisKKy5MU0ZERTQ6CisJLmxvbmcJLkxFRkRFNC0uTEFTRkRFNAkvKiBGREUgTGVuZ3RoICovCisuTEFTRkRFNDoKKwkubG9uZwkuTEFTRkRFNC0uTGZyYW1lMQkvKiBGREUgQ0lFIG9mZnNldCAqLworI2lmIGRlZmluZWQgX19QSUNfXyAmJiBkZWZpbmVkIEhBVkVfQVNfWDg2X1BDUkVMCisJLmxvbmcJLkxGQjQtLgkvKiBGREUgaW5pdGlhbCBsb2NhdGlvbiAqLworI2Vsc2UKKwkubG9uZwkuTEZCNAorI2VuZGlmCisJLmxvbmcJLkxGRTQtLkxGQjQJLyogRkRFIGFkZHJlc3MgcmFuZ2UgKi8KKyNpZmRlZiBfX1BJQ19fCisJLmJ5dGUJMHgwCS8qIC51bGViMTI4IDB4MDsgQXVnbWVudGF0aW9uIHNpemUgKi8KKyNlbmRpZgorCS8qIERXX0NGQV94eHggQ0ZJIGluc3RydWN0aW9ucyBnbyBoZXJlLiAgKi8KKworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxDRkk2LS5MRkI0CisJLmJ5dGUJMHhlCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCBDRkEgPSByNCArIDggPSA4KCVlc3ApICovCisJLmJ5dGUJMHg4CS8qIC51bGViMTI4IDB4OCAqLworCS5ieXRlCTB4ODUJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NSAlZWJwIGF0IENGQSArIDIgKiAtNCAqLworCS5ieXRlCTB4MgkvKiAudWxlYjEyOCAweDIgKi8KKworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxDRkk3LS5MQ0ZJNgorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciBDRkEgPSByNSA9ICVlYnAgKi8KKwkuYnl0ZQkweDUJLyogLnVsZWIxMjggMHg1ICovCisKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJOC0uTENGSTcKKwkuYnl0ZQkweDg2CS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDYgJWVzaSBhdCBDRkEgKyAzICogLTQgKi8KKwkuYnl0ZQkweDMJLyogLnVsZWIxMjggMHgzICovCisKKwkvKiBFbmQgb2YgRFdfQ0ZBX3h4eCBDRkkgaW5zdHJ1Y3Rpb25zLiAgKi8KKwkuYWxpZ24gNAorLkxFRkRFNDoKKworI2VuZGlmIC8qICFGRklfTk9fUkFXX0FQSSAqLworCisuTFNGREU1OgorCS5sb25nCS5MRUZERTUtLkxBU0ZERTUJLyogRkRFIExlbmd0aCAqLworLkxBU0ZERTU6CisJLmxvbmcJLkxBU0ZERTUtLkxmcmFtZTEJLyogRkRFIENJRSBvZmZzZXQgKi8KKyNpZiBkZWZpbmVkIF9fUElDX18gJiYgZGVmaW5lZCBIQVZFX0FTX1g4Nl9QQ1JFTAorCS5sb25nCS5MRkI1LS4JLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbHNlCisJLmxvbmcJLkxGQjUKKyNlbmRpZgorCS5sb25nCS5MRkU1LS5MRkI1CS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MAkvKiAudWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplICovCisjZW5kaWYKKwkvKiBEV19DRkFfeHh4IENGSSBpbnN0cnVjdGlvbnMgZ28gaGVyZS4gICovCisKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJOS0uTEZCNQorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgQ0ZBID0gcjQgKyA4ID0gOCglZXNwKSAqLworCS5ieXRlCTB4OAkvKiAudWxlYjEyOCAweDggKi8KKwkuYnl0ZQkweDg1CS8qIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDUgJWVicCBhdCBDRkEgKyAyICogLTQgKi8KKwkuYnl0ZQkweDIJLyogLnVsZWIxMjggMHgyICovCisKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMTAtLkxDRkk5CisJLmJ5dGUJMHhkCS8qIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyIENGQSA9IHI1ID0gJWVicCAqLworCS5ieXRlCTB4NQkvKiAudWxlYjEyOCAweDUgKi8KKworCS8qIEVuZCBvZiBEV19DRkFfeHh4IENGSSBpbnN0cnVjdGlvbnMuICAqLworCS5hbGlnbiA0CisuTEVGREU1OgorCisjZW5kaWYgLyogIV9NU0NfVkVSICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS9zcmMveDg2L3dpbjY0LlMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni93aW42NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGIyNzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvc3JjL3g4Ni93aW42NC5TCkBAIC0wLDAgKzEsNDY4IEBACisjZGVmaW5lIExJQkZGSV9BU00KKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKwkKKy8qIENvbnN0YW50cyBmb3IgZmZpX2NhbGxfd2luNjQgKi8JCisjZGVmaW5lIFNUQUNLIDAKKyNkZWZpbmUgUFJFUF9BUkdTX0ZOIDMyCisjZGVmaW5lIEVDSUYgNDAKKyNkZWZpbmUgQ0lGX0JZVEVTIDQ4CisjZGVmaW5lIENJRl9GTEFHUyA1NgorI2RlZmluZSBSVkFMVUUgNjQKKyNkZWZpbmUgRk4gNzIKKworLyogZmZpX2NhbGxfd2luNjQgKHZvaWQgKCpwcmVwX2FyZ3NfZm4pKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLAorICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2NpZiAqZWNpZiwgdW5zaWduZWQgYnl0ZXMsIHVuc2lnbmVkIGZsYWdzLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpydmFsdWUsIHZvaWQgKCpmbikoKSk7CisgKi8KKworI2lmZGVmIF9NU0NfVkVSCitQVUJMSUMJZmZpX2NhbGxfd2luNjQKKworRVhUUk4JX19jaGtzdGs6TkVBUgorRVhUUk4JZmZpX2Nsb3N1cmVfd2luNjRfaW5uZXI6TkVBUgorCitfVEVYVAlTRUdNRU5UCisKKzs7OyBmZmlfY2xvc3VyZV93aW42NCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZXNlIHJlZ2lzdGVycyBzZXQ6Cis7OzsgICAgcmF4IHBvaW50cyB0byAnY2xvc3VyZScKKzs7OyAgICByMTEgY29udGFpbnMgYSBiaXQgbWFzayB0aGF0IHNwZWNpZmllcyB3aGljaCBvZiB0aGUKKzs7OyAgICBmaXJzdCBmb3VyIHBhcmFtZXRlcnMgYXJlIGZsb2F0IG9yIGRvdWJsZQorOzs7Cis7OzsgSXQgbXVzdCBtb3ZlIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbiByZWdpc3RlcnMgdG8gdGhlaXIgc3RhY2sgbG9jYXRpb24sCis7OzsgY2FsbCBmZmlfY2xvc3VyZV93aW42NF9pbm5lciBmb3IgdGhlIGFjdHVhbCB3b3JrLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0LgorOzs7IAorZmZpX2Nsb3N1cmVfd2luNjQgUFJPQyBGUkFNRQorCTs7IGNvcHkgcmVnaXN0ZXIgYXJndW1lbnRzIG9udG8gc3RhY2sKKwl0ZXN0CXIxMSwgMQorCWpuZQlmaXJzdF9pc19mbG9hdAkKKwltb3YJUVdPUkQgUFRSIFtyc3ArOF0sIHJjeAorCWptcAlzZWNvbmQKK2ZpcnN0X2lzX2Zsb2F0OgorCW1vdmxwZAlRV09SRCBQVFIgW3JzcCs4XSwgeG1tMAorCitzZWNvbmQ6CisJdGVzdAlyMTEsIDIKKwlqbmUJc2Vjb25kX2lzX2Zsb2F0CQorCW1vdglRV09SRCBQVFIgW3JzcCsxNl0sIHJkeAorCWptcAl0aGlyZAorc2Vjb25kX2lzX2Zsb2F0OgorCW1vdmxwZAlRV09SRCBQVFIgW3JzcCsxNl0sIHhtbTEKKwordGhpcmQ6CisJdGVzdAlyMTEsIDQKKwlqbmUJdGhpcmRfaXNfZmxvYXQJCisJbW92CVFXT1JEIFBUUiBbcnNwKzI0XSwgcjgKKwlqbXAJZm91cnRoCit0aGlyZF9pc19mbG9hdDoKKwltb3ZscGQJUVdPUkQgUFRSIFtyc3ArMjRdLCB4bW0yCisKK2ZvdXJ0aDoKKwl0ZXN0CXIxMSwgOAorCWpuZQlmb3VydGhfaXNfZmxvYXQJCisJbW92CVFXT1JEIFBUUiBbcnNwKzMyXSwgcjkKKwlqbXAJZG9uZQorZm91cnRoX2lzX2Zsb2F0OgorCW1vdmxwZAlRV09SRCBQVFIgW3JzcCszMl0sIHhtbTMKKworZG9uZToKKyAgICAgICAgLkFMTE9DU1RBQ0sgNDAKKwlzdWIJcnNwLCA0MAorICAgICAgICAuRU5EUFJPTE9HCisJbW92CXJjeCwgcmF4CTsgY29udGV4dCBpcyBmaXJzdCBwYXJhbWV0ZXIKKwltb3YJcmR4LCByc3AJOyBzdGFjayBpcyBzZWNvbmQgcGFyYW1ldGVyCisJYWRkCXJkeCwgNDgJCTsgcG9pbnQgdG8gc3RhcnQgb2YgYXJndW1lbnRzCisJbW92CXJheCwgZmZpX2Nsb3N1cmVfd2luNjRfaW5uZXIKKwljYWxsCXJheAkJOyBjYWxsIHRoZSByZWFsIGNsb3N1cmUgZnVuY3Rpb24KKwlhZGQJcnNwLCA0MAorCW1vdmQJeG1tMCwgcmF4CTsgSWYgdGhlIGNsb3N1cmUgcmV0dXJuZWQgYSBmbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBmZmlfY2xvc3VyZV93aW42NF9pbm5lciB3cm90ZSBpdCB0byByYXgKKwlyZXQJMAorZmZpX2Nsb3N1cmVfd2luNjQgRU5EUAorCitmZmlfY2FsbF93aW42NCBQUk9DIEZSQU1FCisgICAgICAgIDs7IGNvcHkgcmVnaXN0ZXJzIG9udG8gc3RhY2sKKwltb3YJUVdPUkQgUFRSIFtyc3ArMzJdLCByOQorCW1vdglRV09SRCBQVFIgW3JzcCsyNF0sIHI4CisJbW92CVFXT1JEIFBUUiBbcnNwKzE2XSwgcmR4CisJbW92CVFXT1JEIFBUUiBbcnNwKzhdLCByY3gKKyAgICAgICAgLlBVU0hSRUcgcmJwCisJcHVzaAlyYnAKKyAgICAgICAgLkFMTE9DU1RBQ0sgNDgKKwlzdWIJcnNwLCA0OAkJCQkJOyAwMDAwMDAzMEgKKyAgICAgICAgLlNFVEZSQU1FIHJicCwgMzIKKwlsZWEJcmJwLCBRV09SRCBQVFIgW3JzcCszMl0KKyAgICAgICAgLkVORFBST0xPRworCisJbW92CWVheCwgRFdPUkQgUFRSIENJRl9CWVRFU1tyYnBdCisJYWRkCXJheCwgMTUKKwlhbmQJcmF4LCAtMTYKKwljYWxsCV9fY2hrc3RrCisJc3ViCXJzcCwgcmF4CisJbGVhCXJheCwgUVdPUkQgUFRSIFtyc3ArMzJdCisJbW92CVFXT1JEIFBUUiBTVEFDS1tyYnBdLCByYXgKKworCW1vdglyZHgsIFFXT1JEIFBUUiBFQ0lGW3JicF0KKwltb3YJcmN4LCBRV09SRCBQVFIgU1RBQ0tbcmJwXQorCWNhbGwJUVdPUkQgUFRSIFBSRVBfQVJHU19GTltyYnBdCisKKwltb3YJcnNwLCBRV09SRCBQVFIgU1RBQ0tbcmJwXQorCisJbW92bHBkCXhtbTMsIFFXT1JEIFBUUiBbcnNwKzI0XQorCW1vdmQJcjksIHhtbTMKKworCW1vdmxwZAl4bW0yLCBRV09SRCBQVFIgW3JzcCsxNl0KKwltb3ZkCXI4LCB4bW0yCisKKwltb3ZscGQJeG1tMSwgUVdPUkQgUFRSIFtyc3ArOF0KKwltb3ZkCXJkeCwgeG1tMQorCisJbW92bHBkCXhtbTAsIFFXT1JEIFBUUiBbcnNwXQorCW1vdmQJcmN4LCB4bW0wCisKKwljYWxsCVFXT1JEIFBUUiBGTltyYnBdCityZXRfc3RydWN0NGIkOgorIAljbXAJRFdPUkQgUFRSIENJRl9GTEFHU1tyYnBdLCBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIKKyAJam5lCXJldF9zdHJ1Y3QyYiQKKworCW1vdglyY3gsIFFXT1JEIFBUUiBSVkFMVUVbcmJwXQorCW1vdglEV09SRCBQVFIgW3JjeF0sIGVheAorCWptcAlyZXRfdm9pZCQKKworcmV0X3N0cnVjdDJiJDoKKyAJY21wCURXT1JEIFBUUiBDSUZfRkxBR1NbcmJwXSwgRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCCisgCWpuZQlyZXRfc3RydWN0MWIkCisKKwltb3YJcmN4LCBRV09SRCBQVFIgUlZBTFVFW3JicF0KKwltb3YJV09SRCBQVFIgW3JjeF0sIGF4CisJam1wCXJldF92b2lkJAorCityZXRfc3RydWN0MWIkOgorIAljbXAJRFdPUkQgUFRSIENJRl9GTEFHU1tyYnBdLCBGRklfVFlQRV9TTUFMTF9TVFJVQ1RfMUIKKyAJam5lCXJldF91aW50OCQKKworCW1vdglyY3gsIFFXT1JEIFBUUiBSVkFMVUVbcmJwXQorCW1vdglCWVRFIFBUUiBbcmN4XSwgYWwKKwlqbXAJcmV0X3ZvaWQkCisKK3JldF91aW50OCQ6CisgCWNtcAlEV09SRCBQVFIgQ0lGX0ZMQUdTW3JicF0sIEZGSV9UWVBFX1VJTlQ4CisgCWpuZQlyZXRfc2ludDgkCisKKwltb3YJcmN4LCBRV09SRCBQVFIgUlZBTFVFW3JicF0KKwltb3Z6eCAgIHJheCwgYWwKKwltb3YJUVdPUkQgUFRSIFtyY3hdLCByYXgKKwlqbXAJcmV0X3ZvaWQkCisKK3JldF9zaW50OCQ6CisgCWNtcAlEV09SRCBQVFIgQ0lGX0ZMQUdTW3JicF0sIEZGSV9UWVBFX1NJTlQ4CisgCWpuZQlyZXRfdWludDE2JAorCisJbW92CXJjeCwgUVdPUkQgUFRSIFJWQUxVRVtyYnBdCisJbW92c3ggICByYXgsIGFsCisJbW92CVFXT1JEIFBUUiBbcmN4XSwgcmF4CisJam1wCXJldF92b2lkJAorCityZXRfdWludDE2JDoKKyAJY21wCURXT1JEIFBUUiBDSUZfRkxBR1NbcmJwXSwgRkZJX1RZUEVfVUlOVDE2CisgCWpuZQlyZXRfc2ludDE2JAorCisJbW92CXJjeCwgUVdPUkQgUFRSIFJWQUxVRVtyYnBdCisJbW92enggICByYXgsIGF4CisJbW92CVFXT1JEIFBUUiBbcmN4XSwgcmF4CisJam1wCVNIT1JUIHJldF92b2lkJAorCityZXRfc2ludDE2JDoKKyAJY21wCURXT1JEIFBUUiBDSUZfRkxBR1NbcmJwXSwgRkZJX1RZUEVfU0lOVDE2CisgCWpuZQlyZXRfdWludDMyJAorCisJbW92CXJjeCwgUVdPUkQgUFRSIFJWQUxVRVtyYnBdCisJbW92c3ggICByYXgsIGF4CisJbW92CVFXT1JEIFBUUiBbcmN4XSwgcmF4CisJam1wCVNIT1JUIHJldF92b2lkJAorCityZXRfdWludDMyJDoKKyAJY21wCURXT1JEIFBUUiBDSUZfRkxBR1NbcmJwXSwgRkZJX1RZUEVfVUlOVDMyCisgCWpuZQlyZXRfc2ludDMyJAorCisJbW92CXJjeCwgUVdPUkQgUFRSIFJWQUxVRVtyYnBdCisJbW92ICAgICBlYXgsIGVheAorCW1vdglRV09SRCBQVFIgW3JjeF0sIHJheAorCWptcAlTSE9SVCByZXRfdm9pZCQKKworcmV0X3NpbnQzMiQ6CisgCWNtcAlEV09SRCBQVFIgQ0lGX0ZMQUdTW3JicF0sIEZGSV9UWVBFX1NJTlQzMgorIAlqbmUJcmV0X2Zsb2F0JAorCisJbW92CXJjeCwgUVdPUkQgUFRSIFJWQUxVRVtyYnBdCisJY2RxZQorCW1vdglRV09SRCBQVFIgW3JjeF0sIHJheAorCWptcAlTSE9SVCByZXRfdm9pZCQKKworcmV0X2Zsb2F0JDoKKyAJY21wCURXT1JEIFBUUiBDSUZfRkxBR1NbcmJwXSwgRkZJX1RZUEVfRkxPQVQKKyAJam5lCVNIT1JUIHJldF9kb3VibGUkCisKKyAJbW92CXJheCwgUVdPUkQgUFRSIFJWQUxVRVtyYnBdCisgCW1vdnNzCURXT1JEIFBUUiBbcmF4XSwgeG1tMAorIAlqbXAJU0hPUlQgcmV0X3ZvaWQkCisKK3JldF9kb3VibGUkOgorIAljbXAJRFdPUkQgUFRSIENJRl9GTEFHU1tyYnBdLCBGRklfVFlQRV9ET1VCTEUKKyAJam5lCVNIT1JUIHJldF9zaW50NjQkCisKKyAJbW92CXJheCwgUVdPUkQgUFRSIFJWQUxVRVtyYnBdCisgCW1vdmxwZAlRV09SRCBQVFIgW3JheF0sIHhtbTAKKyAJam1wCVNIT1JUIHJldF92b2lkJAorCityZXRfc2ludDY0JDoKKyAgCWNtcAlEV09SRCBQVFIgQ0lGX0ZMQUdTW3JicF0sIEZGSV9UWVBFX1NJTlQ2NAorICAJam5lCXJldF92b2lkJAorCisgCW1vdglyY3gsIFFXT1JEIFBUUiBSVkFMVUVbcmJwXQorIAltb3YJUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAJam1wCVNIT1JUIHJldF92b2lkJAorCQorcmV0X3ZvaWQkOgorCXhvcglyYXgsIHJheAorCisJbGVhCXJzcCwgUVdPUkQgUFRSIFtyYnArMTZdCisJcG9wCXJicAorCXJldAkwCitmZmlfY2FsbF93aW42NCBFTkRQCitfVEVYVAlFTkRTCitFTkQKKworI2Vsc2UKKworI2lmZGVmIFNZTUJPTF9VTkRFUlNDT1JFCisjZGVmaW5lIFNZTUJPTF9OQU1FKG5hbWUpIF8jI25hbWUKKyNlbHNlCisjZGVmaW5lIFNZTUJPTF9OQU1FKG5hbWUpIG5hbWUKKyNlbmRpZgorCisudGV4dAorCisuZXh0ZXJuIFNZTUJPTF9OQU1FKGZmaV9jbG9zdXJlX3dpbjY0X2lubmVyKQorCisjIGZmaV9jbG9zdXJlX3dpbjY0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlc2UgcmVnaXN0ZXJzIHNldDoKKyMgICAgcmF4IHBvaW50cyB0byAnY2xvc3VyZScKKyMgICAgcjExIGNvbnRhaW5zIGEgYml0IG1hc2sgdGhhdCBzcGVjaWZpZXMgd2hpY2ggb2YgdGhlCisjICAgIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgZmxvYXQgb3IgZG91YmxlCisjCisjIEl0IG11c3QgbW92ZSB0aGUgcGFyYW1ldGVycyBwYXNzZWQgaW4gcmVnaXN0ZXJzIHRvIHRoZWlyIHN0YWNrIGxvY2F0aW9uLAorIyBjYWxsIGZmaV9jbG9zdXJlX3dpbjY0X2lubmVyIGZvciB0aGUgYWN0dWFsIHdvcmssIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQuCisjIAorCS5iYWxpZ24gMTYKKyAgICAgICAgLmdsb2JsIFNZTUJPTF9OQU1FKGZmaV9jbG9zdXJlX3dpbjY0KQorU1lNQk9MX05BTUUoZmZpX2Nsb3N1cmVfd2luNjQpOgorCSMgY29weSByZWdpc3RlciBhcmd1bWVudHMgb250byBzdGFjaworCXRlc3QJJDEsJXIxMQorCWpuZQkuTGZpcnN0X2lzX2Zsb2F0CQorCW1vdgklcmN4LCA4KCVyc3ApCisJam1wCS5Mc2Vjb25kCisuTGZpcnN0X2lzX2Zsb2F0OgorCW1vdmxwZAkleG1tMCwgOCglcnNwKQorCisuTHNlY29uZDoKKwl0ZXN0CSQyLCAlcjExCisJam5lCS5Mc2Vjb25kX2lzX2Zsb2F0CQorCW1vdgklcmR4LCAxNiglcnNwKQorCWptcAkuTHRoaXJkCisuTHNlY29uZF9pc19mbG9hdDoKKwltb3ZscGQJJXhtbTEsIDE2KCVyc3ApCisKKy5MdGhpcmQ6CisJdGVzdAkkNCwgJXIxMQorCWpuZQkuTHRoaXJkX2lzX2Zsb2F0CQorCW1vdgklcjgsMjQoJXJzcCkKKwlqbXAJLkxmb3VydGgKKy5MdGhpcmRfaXNfZmxvYXQ6CisJbW92bHBkCSV4bW0yLCAyNCglcnNwKQorCisuTGZvdXJ0aDoKKwl0ZXN0CSQ4LCAlcjExCisJam5lCS5MZm91cnRoX2lzX2Zsb2F0CQorCW1vdgklcjksIDMyKCVyc3ApCisJam1wCS5MZG9uZQorLkxmb3VydGhfaXNfZmxvYXQ6CisJbW92bHBkCSV4bW0zLCAzMiglcnNwKQorCisuTGRvbmU6CisjLkFMTE9DU1RBQ0sgNDAKKwlzdWIJJDQwLCAlcnNwCisjLkVORFBST0xPRworCW1vdgklcmF4LCAlcmN4CSMgY29udGV4dCBpcyBmaXJzdCBwYXJhbWV0ZXIKKwltb3YJJXJzcCwgJXJkeAkjIHN0YWNrIGlzIHNlY29uZCBwYXJhbWV0ZXIKKwlhZGQJJDQ4LCAlcmR4CSMgcG9pbnQgdG8gc3RhcnQgb2YgYXJndW1lbnRzCisJbW92CSRTWU1CT0xfTkFNRShmZmlfY2xvc3VyZV93aW42NF9pbm5lciksICVyYXgKKwljYWxscQkqJXJheAkJIyBjYWxsIHRoZSByZWFsIGNsb3N1cmUgZnVuY3Rpb24KKwlhZGQJJDQwLCAlcnNwCisJbW92cQklcmF4LCAleG1tMAkjIElmIHRoZSBjbG9zdXJlIHJldHVybmVkIGEgZmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmZpX2Nsb3N1cmVfd2luNjRfaW5uZXIgd3JvdGUgaXQgdG8gcmF4CisJcmV0cQorLmZmaV9jbG9zdXJlX3dpbjY0X2VuZDoKKworCS5iYWxpZ24gMTYKKyAgICAgICAgLmdsb2JsCVNZTUJPTF9OQU1FKGZmaV9jYWxsX3dpbjY0KQorU1lNQk9MX05BTUUoZmZpX2NhbGxfd2luNjQpOgorICAgICAgICAjIGNvcHkgcmVnaXN0ZXJzIG9udG8gc3RhY2sKKwltb3YJJXI5LDMyKCVyc3ApCisJbW92CSVyOCwyNCglcnNwKQorCW1vdgklcmR4LDE2KCVyc3ApCisJbW92CSVyY3gsOCglcnNwKQorICAgICAgICAjLlBVU0hSRUcgcmJwCisJcHVzaAklcmJwCisgICAgICAgICMuQUxMT0NTVEFDSyA0OAorCXN1YgkkNDgsJXJzcAorICAgICAgICAjLlNFVEZSQU1FIHJicCwgMzIKKwlsZWEJMzIoJXJzcCksJXJicAorICAgICAgICAjLkVORFBST0xPRworCisJbW92CUNJRl9CWVRFUyglcmJwKSwlZWF4CisJYWRkCSQxNSwgJXJheAorCWFuZAkkLTE2LCAlcmF4CisJY21wcQkkMHgxMDAwLCAlcmF4CisJamIJTGNoX2RvbmUKK0xjaF9wcm9iZToKKwlzdWJxCSQweDEwMDAsJXJzcAorCW9ybAkkMHgwLCAoJXJzcCkKKwlzdWJxCSQweDEwMDAsJXJheAorCWNtcHEJJDB4MTAwMCwlcmF4CisJamEJTGNoX3Byb2JlCitMY2hfZG9uZToKKwlzdWJxCSVyYXgsICVyc3AKKwlvcmwJJDB4MCwgKCVyc3ApCisJbGVhCTMyKCVyc3ApLCAlcmF4CisJbW92CSVyYXgsIFNUQUNLKCVyYnApCisKKwltb3YJRUNJRiglcmJwKSwgJXJkeAorCW1vdglTVEFDSyglcmJwKSwgJXJjeAorCWNhbGxxCSpQUkVQX0FSR1NfRk4oJXJicCkKKworCW1vdglTVEFDSyglcmJwKSwgJXJzcAorCisJbW92bHBkCTI0KCVyc3ApLCAleG1tMworCW1vdmQJJXhtbTMsICVyOQorCisJbW92bHBkCTE2KCVyc3ApLCAleG1tMgorCW1vdmQJJXhtbTIsICVyOAorCisJbW92bHBkCTgoJXJzcCksICV4bW0xCisJbW92ZAkleG1tMSwgJXJkeAorCisJbW92bHBkCSglcnNwKSwgJXhtbTAKKwltb3ZkCSV4bW0wLCAlcmN4CisKKwljYWxscQkqRk4oJXJicCkKKy5McmV0X3N0cnVjdDRiOgorIAljbXBsCSRGRklfVFlQRV9TTUFMTF9TVFJVQ1RfNEIsIENJRl9GTEFHUyglcmJwKQorIAlqbmUgLkxyZXRfc3RydWN0MmIKKworCW1vdglSVkFMVUUoJXJicCksICVyY3gKKwltb3YJJWVheCwgKCVyY3gpCisJam1wCS5McmV0X3ZvaWQKKworLkxyZXRfc3RydWN0MmI6CisJY21wbAkkRkZJX1RZUEVfU01BTExfU1RSVUNUXzJCLCBDSUZfRkxBR1MoJXJicCkKKwlqbmUgLkxyZXRfc3RydWN0MWIKKwkKKwltb3YJUlZBTFVFKCVyYnApLCAlcmN4CisJbW92CSVheCwgKCVyY3gpCisJam1wIC5McmV0X3ZvaWQKKwkKKy5McmV0X3N0cnVjdDFiOgorCWNtcGwJJEZGSV9UWVBFX1NNQUxMX1NUUlVDVF8xQiwgQ0lGX0ZMQUdTKCVyYnApCisJam5lIC5McmV0X3VpbnQ4CisJCisJbW92CVJWQUxVRSglcmJwKSwgJXJjeAorCW1vdgklYWwsICglcmN4KQorCWptcCAuTHJldF92b2lkCisKKy5McmV0X3VpbnQ4OgorCWNtcGwJJEZGSV9UWVBFX1VJTlQ4LCBDSUZfRkxBR1MoJXJicCkKKwlqbmUgLkxyZXRfc2ludDgKKwkKKyAgICAgICAgbW92ICAgICBSVkFMVUUoJXJicCksICVyY3gKKyAgICAgICAgbW92emJxICAlYWwsICVyYXgKKwltb3ZxICAgICVyYXgsICglcmN4KQorCWptcCAuTHJldF92b2lkCisKKy5McmV0X3NpbnQ4OgorCWNtcGwJJEZGSV9UWVBFX1NJTlQ4LCBDSUZfRkxBR1MoJXJicCkKKwlqbmUgLkxyZXRfdWludDE2CisJCisgICAgICAgIG1vdiAgICAgUlZBTFVFKCVyYnApLCAlcmN4CisgICAgICAgIG1vdnNicSAgJWFsLCAlcmF4CisJbW92cSAgICAlcmF4LCAoJXJjeCkKKwlqbXAgLkxyZXRfdm9pZAorCisuTHJldF91aW50MTY6CisJY21wbAkkRkZJX1RZUEVfVUlOVDE2LCBDSUZfRkxBR1MoJXJicCkKKwlqbmUgLkxyZXRfc2ludDE2CisJCisgICAgICAgIG1vdiAgICAgUlZBTFVFKCVyYnApLCAlcmN4CisgICAgICAgIG1vdnp3cSAgJWF4LCAlcmF4CisJbW92cSAgICAlcmF4LCAoJXJjeCkKKwlqbXAgLkxyZXRfdm9pZAorCisuTHJldF9zaW50MTY6CisJY21wbAkkRkZJX1RZUEVfU0lOVDE2LCBDSUZfRkxBR1MoJXJicCkKKwlqbmUgLkxyZXRfdWludDMyCisJCisgICAgICAgIG1vdiAgICAgUlZBTFVFKCVyYnApLCAlcmN4CisgICAgICAgIG1vdnN3cSAgJWF4LCAlcmF4CisJbW92cSAgICAlcmF4LCAoJXJjeCkKKwlqbXAgLkxyZXRfdm9pZAorCisuTHJldF91aW50MzI6CisJY21wbAkkRkZJX1RZUEVfVUlOVDMyLCBDSUZfRkxBR1MoJXJicCkKKwlqbmUgLkxyZXRfc2ludDMyCisJCisgICAgICAgIG1vdiAgICAgUlZBTFVFKCVyYnApLCAlcmN4CisgICAgICAgIG1vdmwgICAgJWVheCwgJWVheAorCW1vdnEgICAgJXJheCwgKCVyY3gpCisJam1wIC5McmV0X3ZvaWQKKworLkxyZXRfc2ludDMyOgorIAljbXBsCSRGRklfVFlQRV9TSU5UMzIsIENJRl9GTEFHUyglcmJwKQorIAlqbmUJLkxyZXRfZmxvYXQKKworCW1vdglSVkFMVUUoJXJicCksICVyY3gKKwljbHRxCisJbW92cQklcmF4LCAoJXJjeCkKKwlqbXAJLkxyZXRfdm9pZAorCisuTHJldF9mbG9hdDoKKyAJY21wbAkkRkZJX1RZUEVfRkxPQVQsIENJRl9GTEFHUyglcmJwKQorIAlqbmUJLkxyZXRfZG91YmxlCisKKyAJbW92CVJWQUxVRSglcmJwKSwgJXJheAorIAltb3ZzcwkleG1tMCwgKCVyYXgpCisgCWptcAkuTHJldF92b2lkCisKKy5McmV0X2RvdWJsZToKKyAJY21wbAkkRkZJX1RZUEVfRE9VQkxFLCBDSUZfRkxBR1MoJXJicCkKKyAJam5lCS5McmV0X3NpbnQ2NAorCisgCW1vdglSVkFMVUUoJXJicCksICVyYXgKKyAJbW92bHBkCSV4bW0wLCAoJXJheCkKKyAJam1wCS5McmV0X3ZvaWQKKworLkxyZXRfc2ludDY0OgorICAJY21wbAkkRkZJX1RZUEVfU0lOVDY0LCBDSUZfRkxBR1MoJXJicCkKKyAgCWpuZQkuTHJldF92b2lkCisKKyAJbW92CVJWQUxVRSglcmJwKSwgJXJjeAorIAltb3YJJXJheCwgKCVyY3gpCisgCWptcAkuTHJldF92b2lkCisJCisuTHJldF92b2lkOgorCXhvcgklcmF4LCAlcmF4CisKKwlsZWEJMTYoJXJicCksICVyc3AKKwlwb3AJJXJicAorCXJldHEKKy5mZmlfY2FsbF93aW42NF9lbmQ6CisjZW5kaWYgLyogIV9NU0NfVkVSICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvTWFrZWZpbGUuYW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDFkZjQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODAgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbi4KKworQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24gZGVqYWdudQorCisjIFNldHVwIHRoZSB0ZXN0aW5nIGZyYW1ld29yaywgaWYgeW91IGhhdmUgb25lCitFWFBFQ1QgPSBgaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCisgICAgICAgICAgICBlY2hvICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IDsgXAorICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKKworUlVOVEVTVCA9IGBpZiBbIC1mICQodG9wX3NyY2RpcikvLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKKwkgICAgICAgZWNobyAkKHRvcF9zcmNkaXIpLy4uL2RlamFnbnUvcnVudGVzdCA7IFwKKwkgICAgZWxzZSBlY2hvIHJ1bnRlc3Q7IGZpYAorCitBTV9SVU5URVNURkxBR1MgPQorCitDTEVBTkZJTEVTID0gKi5leGUgY29yZSogKi5sb2cgKi5zdW0KKworRVhUUkFfRElTVCA9IGxpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwCVwKK2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3RfZmZpX2NhbGwuY2MgbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdC5jYyBcCitsaWJmZmkuc3BlY2lhbC9mZml0ZXN0Y3h4LmggY29uZmlnL2RlZmF1bHQuZXhwIGxpYi90YXJnZXQtbGlicGF0aC5leHAgXAorbGliL2xpYmZmaS5leHAgbGliL3dyYXBwZXIuZXhwIGxpYmZmaS5jYWxsL2Zsb2F0LmMgXAorbGliZmZpLmNhbGwvY2xzX211bHRpX3NjaGFyLmMgbGliZmZpLmNhbGwvZmxvYXQzLmMgXAorbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYyBsaWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYyBcCitsaWJmZmkuY2FsbC9jbHNfNV8xX2J5dGUuYyBsaWJmZmkuY2FsbC9zdHJldF9tZWRpdW0uYyBcCitsaWJmZmkuY2FsbC9wcm9tb3Rpb24uYyBsaWJmZmkuY2FsbC9jbHNfZGJsc19zdHJ1Y3QuYyBcCitsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmMgbGliZmZpLmNhbGwvY2xvc3VyZV9mbjEuYyBcCitsaWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jIGxpYmZmaS5jYWxsL2Nsc19mbG9hdC5jIFwKK2xpYmZmaS5jYWxsL2Nsc18yYnl0ZS5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm40LmMgXAorbGliZmZpLmNhbGwvcmV0dXJuX2ZsMi5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q3LmMgXAorbGliZmZpLmNhbGwvY2xzX3VpbnQuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDY0LmMgXAorbGliZmZpLmNhbGwvZmxvYXQxLmMgbGliZmZpLmNhbGwvY2xzXzE5Ynl0ZS5jIFwKK2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxLmMgbGliZmZpLmNhbGwvY2xzXzRieXRlLmMgXAorbGliZmZpLmNhbGwvcmV0dXJuX2ZsMS5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl9wb2ludGVyLmMgXAorbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0My5jIFwKK2xpYmZmaS5jYWxsL3N0cnVjdDcuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jIFwKK2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYyBsaWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMgXAorbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfdWNoYXIuYyBcCitsaWJmZmkuY2FsbC90ZXN0Y2xvc3VyZS5jIGxpYmZmaS5jYWxsL2Nsc18zYnl0ZTEuYyBcCitsaWJmZmkuY2FsbC9zdHJ1Y3Q2LmMgbGliZmZpLmNhbGwvcmV0dXJuX3VjLmMgbGliZmZpLmNhbGwvcmV0dXJuX2xsMS5jIFwKK2xpYmZmaS5jYWxsL2Nsc191c2hvcnQuYyBsaWJmZmkuY2FsbC9zdHJldF9tZWRpdW0yLmMgXAorbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydGNoYXIuYyBsaWJmZmkuY2FsbC9yZXR1cm5fZGJsMi5jIFwKK2xpYmZmaS5jYWxsL2Nsb3N1cmVfbG9jX2ZuMC5jIGxpYmZmaS5jYWxsL3JldHVybl9zYy5jIFwKK2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q4LmMgbGliZmZpLmNhbGwvY2xzXzdfMV9ieXRlLmMJXAorbGliZmZpLmNhbGwvcmV0dXJuX2xsLmMgbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYyBcCitsaWJmZmkuY2FsbC9lcnJfYmFkX2FiaS5jIGxpYmZmaS5jYWxsL3JldHVybl9kYmwxLmMgXAorbGliZmZpLmNhbGwvY2FsbC5leHAgbGliZmZpLmNhbGwvZmZpdGVzdC5oIGxpYmZmaS5jYWxsL3N0cmxlbi5jCVwKK2xpYmZmaS5jYWxsL3JldHVybl9zbC5jIGxpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmMgXAorbGliZmZpLmNhbGwvc3RydWN0MS5jIGxpYmZmaS5jYWxsL2Nsc182NGJ5dGUuYyBsaWJmZmkuY2FsbC9yZXR1cm5fdWwuYyBcCitsaWJmZmkuY2FsbC9jbHNfZG91YmxlLmMgbGliZmZpLmNhbGwvbWFueV93aW4zMi5jIFwKK2xpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fZG91YmxlLmMJXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQxNi5jIGxpYmZmaS5jYWxsL2Nsc185Ynl0ZTEuYwlcCitsaWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0Y2hhci5jIGxpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnQuYyBcCitsaWJmZmkuY2FsbC9jbG9zdXJlX3N0ZGNhbGwuYyBsaWJmZmkuY2FsbC9yZXR1cm5fZmwuYyBcCitsaWJmZmkuY2FsbC9zdHJsZW5fd2luMzIuYyBsaWJmZmkuY2FsbC9yZXR1cm5fbGRsLmMgXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMgbGliZmZpLmNhbGwvc3RydWN0My5jIFwKK2xpYmZmaS5jYWxsL2Nsc191Y2hhci5jIGxpYmZmaS5jYWxsL2Nsc19zaW50LmMgbGliZmZpLmNhbGwvZmxvYXQyLmMgXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQuYyBcCitsaWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jIGxpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnQuYyBcCitsaWJmZmkuY2FsbC9zdHJldF9sYXJnZS5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MTYuYyBcCitsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jIGxpYmZmaS5jYWxsL2Nsc181Ynl0ZS5jIFwKK2xpYmZmaS5jYWxsL3JldHVybl9kYmwuYyBsaWJmZmkuY2FsbC9jbHNfMjBieXRlLmMgXAorbGliZmZpLmNhbGwvY2xzXzhieXRlLmMgbGliZmZpLmNhbGwvcHlvYmpjLXRjLmMJXAorbGliZmZpLmNhbGwvY2xzXzI0Ynl0ZS5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0Mi5jIFwKK2xpYmZmaS5jYWxsL2Nsc182XzFfYnl0ZS5jIGxpYmZmaS5jYWxsL2Nsc19zY2hhci5jIFwKK2xpYmZmaS5jYWxsL2Nsc18xOGJ5dGUuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuMy5jIFwKK2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMJXAorbGliZmZpLmNhbGwvc3RydWN0Mi5jIGxpYmZmaS5jYWxsL2Nsc18zYnl0ZTIuYyBcCitsaWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jIGxpYmZmaS5jYWxsL2Nsc18yMGJ5dGUxLmMgXAorbGliZmZpLmNhbGwvcmV0dXJuX2ZsMy5jIGxpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MzIuYwlcCitsaWJmZmkuY2FsbC9wcm9ibGVtMS5jIGxpYmZmaS5jYWxsL2Zsb2F0NC5jIFwKK2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYyBsaWJmZmkuY2FsbC9zdHJ1Y3Q5LmMgXAorbGliZmZpLmNhbGwvY2xvc3VyZV9mbjUuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMgXAorbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuNi5jIFwKK2xpYmZmaS5jYWxsL3N0cnVjdDQuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Mi5jIFwKK2xpYmZmaS5jYWxsL2Nsc182Ynl0ZS5jIGxpYmZmaS5jYWxsL2Nsc183Ynl0ZS5jIGxpYmZmaS5jYWxsL21hbnkuYyBcCitsaWJmZmkuY2FsbC9zdHJ1Y3Q4LmMgbGliZmZpLmNhbGwvbmVnaW50LmMgbGliZmZpLmNhbGwvc3RydWN0NS5jIFwKK2xpYmZmaS5jYWxsL2Nsc18xMmJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfZG91YmxlX3ZhLmMgXAorbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGUuYyBsaWJmZmkuY2FsbC9jbHNfOWJ5dGUyLmMgXAorbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEwLmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYyBcCitsaWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL01ha2VmaWxlLmluIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RlOWMwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDUwMCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK3N1YmRpciA9IHRlc3RzdWl0ZQorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9heF9jY19tYXhvcHQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfY2ZsYWdzX3dhcm5fYWxsLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NoZWNrX2NvbXBpbGVyX2ZsYWdzLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2NvbXBpbGVyX3ZlbmRvci5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9jb25maWd1cmVfYXJncy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9heF9lbmFibGVfYnVpbGRkaXIubTQgXAorCSQodG9wX3NyY2RpcikvbTQvYXhfZ2NjX2FyY2hmbGFnLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2F4X2djY194ODZfY3B1aWQubTQgXAorCSQodG9wX3NyY2RpcikvbTQvbGlidG9vbC5tNCAkKHRvcF9zcmNkaXIpL200L2x0b3B0aW9ucy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9sdHN1Z2FyLm00ICQodG9wX3NyY2RpcikvbTQvbHR2ZXJzaW9uLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2x0fm9ic29sZXRlLm00ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9mZmljb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitERUpBVE9PTCA9ICQoUEFDS0FHRSkKK1JVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJCR0b29sIC0tc3JjZGlyICQkc3JjZGlyCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fTFRMREZMQUdTID0gQEFNX0xUTERGTEFHU0AKK0FNX1JVTlRFU1RGTEFHUyA9IAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0RFUE1PREUgPSBAQ0NBU0RFUE1PREVACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkZJX0VYRUNfVFJBTVBPTElORV9UQUJMRSA9IEBGRklfRVhFQ19UUkFNUE9MSU5FX1RBQkxFQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitIQVZFX0xPTkdfRE9VQkxFID0gQEhBVkVfTE9OR19ET1VCTEVACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNQU5JRkVTVF9UT09MID0gQE1BTklGRVNUX1RPT0xACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1VSTCA9IEBQQUNLQUdFX1VSTEAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BSVERJQUcgPSBAUFJURElBR0AKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVEFSR0VUID0gQFRBUkdFVEAKK1RBUkdFVERJUiA9IEBUQVJHRVRESVJACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9BUiA9IEBhY19jdF9BUkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitheF9lbmFibGVfYnVpbGRkaXJfc2VkID0gQGF4X2VuYWJsZV9idWlsZGRpcl9zZWRACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3lzX3N5bWJvbF91bmRlcnNjb3JlID0gQHN5c19zeW1ib2xfdW5kZXJzY29yZUAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldCA9IEB0YXJnZXRACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAordGFyZ2V0X29zID0gQHRhcmdldF9vc0AKK3RhcmdldF92ZW5kb3IgPSBAdGFyZ2V0X3ZlbmRvckAKK3Rvb2xleGVjZGlyID0gQHRvb2xleGVjZGlyQAordG9vbGV4ZWNsaWJkaXIgPSBAdG9vbGV4ZWNsaWJkaXJACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24gZGVqYWdudQorCisjIFNldHVwIHRoZSB0ZXN0aW5nIGZyYW1ld29yaywgaWYgeW91IGhhdmUgb25lCitFWFBFQ1QgPSBgaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCisgICAgICAgICAgICBlY2hvICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IDsgXAorICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKKworUlVOVEVTVCA9IGBpZiBbIC1mICQodG9wX3NyY2RpcikvLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKKwkgICAgICAgZWNobyAkKHRvcF9zcmNkaXIpLy4uL2RlamFnbnUvcnVudGVzdCA7IFwKKwkgICAgZWxzZSBlY2hvIHJ1bnRlc3Q7IGZpYAorCitDTEVBTkZJTEVTID0gKi5leGUgY29yZSogKi5sb2cgKi5zdW0KK0VYVFJBX0RJU1QgPSBsaWJmZmkuc3BlY2lhbC9zcGVjaWFsLmV4cAlcCitsaWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0X2ZmaV9jYWxsLmNjIGxpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2MgXAorbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oIGNvbmZpZy9kZWZhdWx0LmV4cCBsaWIvdGFyZ2V0LWxpYnBhdGguZXhwIFwKK2xpYi9saWJmZmkuZXhwIGxpYi93cmFwcGVyLmV4cCBsaWJmZmkuY2FsbC9mbG9hdC5jIFwKK2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zY2hhci5jIGxpYmZmaS5jYWxsL2Zsb2F0My5jIFwKK2xpYmZmaS5jYWxsL2Nsc18zXzFieXRlLmMgbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMgXAorbGliZmZpLmNhbGwvY2xzXzVfMV9ieXRlLmMgbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtLmMgXAorbGliZmZpLmNhbGwvcHJvbW90aW9uLmMgbGliZmZpLmNhbGwvY2xzX2RibHNfc3RydWN0LmMgXAorbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdC5jIGxpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMgXAorbGliZmZpLmNhbGwvY2xzXzRfMWJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfZmxvYXQuYyBcCitsaWJmZmkuY2FsbC9jbHNfMmJ5dGUuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuNC5jIFwKK2xpYmZmaS5jYWxsL3JldHVybl9mbDIuYyBsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ny5jIFwKK2xpYmZmaS5jYWxsL2Nsc191aW50LmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQ2NC5jIFwKK2xpYmZmaS5jYWxsL2Zsb2F0MS5jIGxpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYyBcCitsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MS5jIGxpYmZmaS5jYWxsL2Nsc180Ynl0ZS5jIFwKK2xpYmZmaS5jYWxsL3JldHVybl9mbDEuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jIFwKK2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q0LmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDMuYyBcCitsaWJmZmkuY2FsbC9zdHJ1Y3Q3LmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDkuYyBcCitsaWJmZmkuY2FsbC9jbHNfc3Nob3J0LmMgbGliZmZpLmNhbGwvY2xzX3Vsb25nbG9uZy5jIFwKK2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMgbGliZmZpLmNhbGwvY2xzX211bHRpX3VjaGFyLmMgXAorbGliZmZpLmNhbGwvdGVzdGNsb3N1cmUuYyBsaWJmZmkuY2FsbC9jbHNfM2J5dGUxLmMgXAorbGliZmZpLmNhbGwvc3RydWN0Ni5jIGxpYmZmaS5jYWxsL3JldHVybl91Yy5jIGxpYmZmaS5jYWxsL3JldHVybl9sbDEuYyBcCitsaWJmZmkuY2FsbC9jbHNfdXNob3J0LmMgbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jIFwKK2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnRjaGFyLmMgbGliZmZpLmNhbGwvcmV0dXJuX2RibDIuYyBcCitsaWJmZmkuY2FsbC9jbG9zdXJlX2xvY19mbjAuYyBsaWJmZmkuY2FsbC9yZXR1cm5fc2MuYyBcCitsaWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OC5jIGxpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jCVwKK2xpYmZmaS5jYWxsL3JldHVybl9sbC5jIGxpYmZmaS5jYWxsL2Nsc19wb2ludGVyLmMgXAorbGliZmZpLmNhbGwvZXJyX2JhZF9hYmkuYyBsaWJmZmkuY2FsbC9yZXR1cm5fZGJsMS5jIFwKK2xpYmZmaS5jYWxsL2NhbGwuZXhwIGxpYmZmaS5jYWxsL2ZmaXRlc3QuaCBsaWJmZmkuY2FsbC9zdHJsZW4uYwlcCitsaWJmZmkuY2FsbC9yZXR1cm5fc2wuYyBsaWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jIFwKK2xpYmZmaS5jYWxsL3N0cnVjdDEuYyBsaWJmZmkuY2FsbC9jbHNfNjRieXRlLmMgbGliZmZpLmNhbGwvcmV0dXJuX3VsLmMgXAorbGliZmZpLmNhbGwvY2xzX2RvdWJsZS5jIGxpYmZmaS5jYWxsL21hbnlfd2luMzIuYyBcCitsaWJmZmkuY2FsbC9jbHNfMTZieXRlLmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX2RvdWJsZS5jCVwKK2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MTYuYyBsaWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmMJXAorbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydGNoYXIuYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0LmMgXAorbGliZmZpLmNhbGwvY2xvc3VyZV9zdGRjYWxsLmMgbGliZmZpLmNhbGwvcmV0dXJuX2ZsLmMgXAorbGliZmZpLmNhbGwvc3RybGVuX3dpbjMyLmMgbGliZmZpLmNhbGwvcmV0dXJuX2xkbC5jIFwKK2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9mbG9hdC5jIGxpYmZmaS5jYWxsL3N0cnVjdDMuYyBcCitsaWJmZmkuY2FsbC9jbHNfdWNoYXIuYyBsaWJmZmkuY2FsbC9jbHNfc2ludC5jIGxpYmZmaS5jYWxsL2Zsb2F0Mi5jIFwKK2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0LmMgXAorbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYyBsaWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0LmMgXAorbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDE2LmMgXAorbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYyBsaWJmZmkuY2FsbC9jbHNfNWJ5dGUuYyBcCitsaWJmZmkuY2FsbC9yZXR1cm5fZGJsLmMgbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jIFwKK2xpYmZmaS5jYWxsL2Nsc184Ynl0ZS5jIGxpYmZmaS5jYWxsL3B5b2JqYy10Yy5jCVwKK2xpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdDIuYyBcCitsaWJmZmkuY2FsbC9jbHNfNl8xX2J5dGUuYyBsaWJmZmkuY2FsbC9jbHNfc2NoYXIuYyBcCitsaWJmZmkuY2FsbC9jbHNfMThieXRlLmMgbGliZmZpLmNhbGwvY2xvc3VyZV9mbjMuYyBcCitsaWJmZmkuY2FsbC9lcnJfYmFkX3R5cGVkZWYuYyBsaWJmZmkuY2FsbC9jbG9zdXJlX2ZuMi5jCVwKK2xpYmZmaS5jYWxsL3N0cnVjdDIuYyBsaWJmZmkuY2FsbC9jbHNfM2J5dGUyLmMgXAorbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYyBsaWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jIFwKK2xpYmZmaS5jYWxsL3JldHVybl9mbDMuYyBsaWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDMyLmMJXAorbGliZmZpLmNhbGwvcHJvYmxlbTEuYyBsaWJmZmkuY2FsbC9mbG9hdDQuYyBcCitsaWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDY0LmMgbGliZmZpLmNhbGwvc3RydWN0OS5jIFwKK2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm41LmMgbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQzMi5jIFwKK2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4wLmMgbGliZmZpLmNhbGwvY2xvc3VyZV9mbjYuYyBcCitsaWJmZmkuY2FsbC9zdHJ1Y3Q0LmMgbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDIuYyBcCitsaWJmZmkuY2FsbC9jbHNfNmJ5dGUuYyBsaWJmZmkuY2FsbC9jbHNfN2J5dGUuYyBsaWJmZmkuY2FsbC9tYW55LmMgXAorbGliZmZpLmNhbGwvc3RydWN0OC5jIGxpYmZmaS5jYWxsL25lZ2ludC5jIGxpYmZmaS5jYWxsL3N0cnVjdDUuYyBcCitsaWJmZmkuY2FsbC9jbHNfMTJieXRlLmMgbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jIFwKK2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmMgbGliZmZpLmNhbGwvY2xzXzlieXRlMi5jIFwKK2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMC5jIGxpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q1LmMgXAorbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYworCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gdGVzdHN1aXRlL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiB0ZXN0c3VpdGUvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2NoZWNrLURFSkFHTlU6IHNpdGUuZXhwCisJc3JjZGlyPWAkKGFtX19jZCkgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNkaXI7IFwKKwlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCisJcnVudGVzdD0kKFJVTlRFU1QpOyBcCisJaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgZXhpdF9zdGF0dXM9MDsgbD0nJChERUpBVE9PTCknOyBmb3IgdG9vbCBpbiAkJGw7IGRvIFwKKwkgICAgaWYgJCRydW50ZXN0ICQoQU1fUlVOVEVTVEZMQUdTKSAkKFJVTlRFU1RERUZBVUxURkxBR1MpICQoUlVOVEVTVEZMQUdTKTsgXAorCSAgICB0aGVuIDo7IGVsc2UgZXhpdF9zdGF0dXM9MTsgZmk7IFwKKwkgIGRvbmU7IFwKKwllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAorCWZpOyBcCisJZXhpdCAkJGV4aXRfc3RhdHVzCitzaXRlLmV4cDogTWFrZWZpbGUKKwlAZWNobyAnTWFraW5nIGEgbmV3IHNpdGUuZXhwIGZpbGUuLi4nCisJQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPnNpdGUudG1wCisJQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj5zaXRlLnRtcAorCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj5zaXRlLnRtcAorCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj5zaXRlLnRtcAorCUBlY2hvICJzZXQgb2JqZGlyIGBwd2RgIiA+PnNpdGUudG1wCisJQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAiJChidWlsZF9hbGlhcykiJyA+PnNpdGUudG1wCisJQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfdHJpcGxldCknID4+c2l0ZS50bXAKKwlAZWNobyAnc2V0IGhvc3RfYWxpYXMgIiQoaG9zdF9hbGlhcykiJyA+PnNpdGUudG1wCisJQGVjaG8gJ3NldCBob3N0X3RyaXBsZXQgJChob3N0X3RyaXBsZXQpJyA+PnNpdGUudG1wCisJQGVjaG8gJ3NldCB0YXJnZXRfYWxpYXMgIiQodGFyZ2V0X2FsaWFzKSInID4+c2l0ZS50bXAKKwlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PnNpdGUudG1wCisJQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PnNpdGUudG1wCisJQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBcCisJICBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+IHNpdGUudG1wCisJQC1ybSAtZiBzaXRlLmJhaworCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgbXYgc2l0ZS5leHAgc2l0ZS5iYWsKKwlAbXYgc2l0ZS50bXAgc2l0ZS5leHAKKworZGlzdGNsZWFuLURFSkFHTlU6CisJLXJtIC1mIHNpdGUuZXhwIHNpdGUuYmFrCisJLWw9JyQoREVKQVRPT0wpJzsgZm9yIHRvb2wgaW4gJCRsOyBkbyBcCisJICBybSAtZiAkJHRvb2wuc3VtICQkdG9vbC5sb2c7IFwKKwlkb25lCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLURFSkFHTlUKK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tREVKQUdOVSBkaXN0Y2xlYW4tZ2VuZXJpYworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGNoZWNrLWFtIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stREVKQUdOVSBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJ0b29sIGRpc3RjbGVhbiBkaXN0Y2xlYW4tREVKQUdOVSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTY3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cApAQCAtMCwwICsxIEBACitsb2FkX2xpYiAic3RhbmRhcmQuZXhwIgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWIvbGliZmZpLWRnLmV4cCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZDJmNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliL2xpYmZmaS1kZy5leHAKQEAgLTAsMCArMSwzMDAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworcHJvYyBsb2FkX2djY19saWIgeyBmaWxlbmFtZSB9IHsKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgbG9hZF9maWxlICRzcmNkaXIvbGliLyRmaWxlbmFtZQorfQorCitsb2FkX2xpYiBkZy5leHAKK2xvYWRfbGliIGxpYmdsb3NzLmV4cAorbG9hZF9nY2NfbGliIHRhcmdldC1saWJwYXRoLmV4cAorbG9hZF9nY2NfbGliIHdyYXBwZXIuZXhwCisKKworIyBEZWZpbmUgbGliZmZpIGNhbGxiYWNrcyBmb3IgZGcuZXhwLgorCitwcm9jIGxpYmZmaS1kZy10ZXN0LTEgeyB0YXJnZXRfY29tcGlsZSBwcm9nIGRvX3doYXQgZXh0cmFfdG9vbF9mbGFncyB9IHsKKworICAgICMgVG8gZ2V0IGFsbCBcbiBpbiBkZy1vdXRwdXQgdGVzdCBzdHJpbmdzIHRvIG1hdGNoIHByaW50ZiBvdXRwdXQKKyAgICAjIGluIGEgc3lzdGVtIHRoYXQgb3V0cHV0cyBpdCBhcyBcMDE1XDAxMiAoaS5lLiBub3QganVzdCBcMDEyKSwgd2UKKyAgICAjIG5lZWQgdG8gY2hhbmdlIGFsbCBcbiBpbnRvIFxyP1xuLiAgQXMgdGhlcmUgaXMgbm8gZGVqYWdudSBmbGFnCisgICAgIyBvciBob29rIHRvIGRvIHRoYXQsIHdlIHNpbXBseSBjaGFuZ2UgdGhlIHRleHQgYmVpbmcgdGVzdGVkLgorICAgICMgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byBrbm93IHRoYXQgdGhlIHZhcmlhYmxlIGlzIGNhbGxlZAorICAgICMgZGctb3V0cHV0LXRleHQgYW5kIGxpdmVzIGluIHRoZSBjYWxsZXIgb2YgbGliZmZpLWRnLXRlc3QsIHdoaWNoCisgICAgIyBpcyB0d28gY2FsbHMgdXAuICBPdmVycmlkaW5nIHByb2MgZGctb3V0cHV0IHdvdWxkIGJlIGxvbmdlciBhbmQKKyAgICAjIHdvdWxkIG5lY2Vzc2FyaWx5IGhhdmUgdGhlIHNhbWUgYXNzdW1wdGlvbi4KKyAgICB1cHZhciAyIGRnLW91dHB1dC10ZXh0IG91dHB1dF9tYXRjaAorCisgICAgaWYgeyBbbGxlbmd0aCAkb3V0cHV0X21hdGNoXSA+IDEgfSB7CisJcmVnc3ViIC1hbGwgIlxuIiBbbGluZGV4ICRvdXRwdXRfbWF0Y2ggMV0gIlxyP1xuIiB4CisJc2V0IG91dHB1dF9tYXRjaCBbbHJlcGxhY2UgJG91dHB1dF9tYXRjaCAxIDEgJHhdCisgICAgfQorCisgICAgIyBTZXQgdXAgdGhlIGNvbXBpbGVyIGZsYWdzLCBiYXNlZCBvbiB3aGF0IHdlJ3JlIGdvaW5nIHRvIGRvLgorCisgICAgc2V0IG9wdGlvbnMgW2xpc3RdCisgICAgc3dpdGNoICRkb193aGF0IHsKKwkiY29tcGlsZSIgeworCSAgICBzZXQgY29tcGlsZV90eXBlICJhc3NlbWJseSIKKwkgICAgc2V0IG91dHB1dF9maWxlICJbZmlsZSByb290bmFtZSBbZmlsZSB0YWlsICRwcm9nXV0ucyIKKwl9CisJImxpbmsiIHsKKwkgICAgc2V0IGNvbXBpbGVfdHlwZSAiZXhlY3V0YWJsZSIKKwkgICAgc2V0IG91dHB1dF9maWxlICJbZmlsZSByb290bmFtZSBbZmlsZSB0YWlsICRwcm9nXV0uZXhlIgorCSAgICAjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBuZWVkZWQgZm9yIHRhcmdldHMgbGlrZSB0aGUgaTk2MCB3aGVyZQorCSAgICAjIHRoZSBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIGIub3V0LiAgU2lnaC4KKwl9CisJInJ1biIgeworCSAgICBzZXQgY29tcGlsZV90eXBlICJleGVjdXRhYmxlIgorCSAgICAjIEZJWE1FOiAiLi8iIGlzIHRvIGNvcGUgd2l0aCAiLiIgbm90IGJlaW5nIGluICRQQVRILgorCSAgICAjIFNob3VsZCB0aGlzIGJlIGhhbmRsZWQgZWxzZXdoZXJlPworCSAgICAjIFlFUy4KKwkgICAgc2V0IG91dHB1dF9maWxlICIuL1tmaWxlIHJvb3RuYW1lIFtmaWxlIHRhaWwgJHByb2ddXS5leGUiCisJICAgICMgVGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYXJlIGlmIGFuIGV4ZWN1dGFibGUgd2FzCisJICAgICMgY3JlYXRlZCBvciBub3QuICBJZiBpdCB3YXMsIGRnLmV4cCB3aWxsIHRyeSB0byBydW4gaXQuCisJICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAkb3V0cHV0X2ZpbGU7CisJfQorCWRlZmF1bHQgeworCSAgICBwZXJyb3IgIiRkb193aGF0OiBub3QgYSB2YWxpZCBkZy1kbyBrZXl3b3JkIgorCSAgICByZXR1cm4gIiIKKwl9CisgICAgfQorCisgICAgaWYgeyAkZXh0cmFfdG9vbF9mbGFncyAhPSAiIiB9IHsKKwlsYXBwZW5kIG9wdGlvbnMgImFkZGl0aW9uYWxfZmxhZ3M9JGV4dHJhX3Rvb2xfZmxhZ3MiCisgICAgfQorCisgICAgc2V0IGNvbXBfb3V0cHV0IFtsaWJmZmlfdGFyZ2V0X2NvbXBpbGUgIiRwcm9nIiAiJG91dHB1dF9maWxlIiAiJGNvbXBpbGVfdHlwZSIgJG9wdGlvbnNdOworCisKKyAgICByZXR1cm4gW2xpc3QgJGNvbXBfb3V0cHV0ICRvdXRwdXRfZmlsZV0KK30KKworCitwcm9jIGxpYmZmaS1kZy10ZXN0IHsgcHJvZyBkb193aGF0IGV4dHJhX3Rvb2xfZmxhZ3MgfSB7CisgICAgcmV0dXJuIFtsaWJmZmktZGctdGVzdC0xIHRhcmdldF9jb21waWxlICRwcm9nICRkb193aGF0ICRleHRyYV90b29sX2ZsYWdzXQorfQorCitwcm9jIGxpYmZmaS1pbml0IHsgYXJncyB9IHsKKyAgICBnbG9iYWwgZ2x1ZWZpbGUgd3JhcF9mbGFnczsKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGJsZGRpcmZmaQorICAgIGdsb2JhbCBvYmpkaXIKKyAgICBnbG9iYWwgVE9PTF9PUFRJT05TCisgICAgZ2xvYmFsIHRvb2wKKyAgICBnbG9iYWwgbGliZmZpX2luY2x1ZGUKKyAgICBnbG9iYWwgbGliZmZpX2xpbmtfZmxhZ3MKKyAgICBnbG9iYWwgdG9vbF9yb290X2RpcgorICAgIGdsb2JhbCBsZF9saWJyYXJ5X3BhdGgKKworICAgIHNldCBibGRkaXJmZmkgW3B3ZF0vLi4KKyAgICB2ZXJib3NlICJsaWJmZmkgJGJsZGRpcmZmaSIKKworICAgIHNldCBnY2NkaXIgW2xvb2tmb3JfZmlsZSAkdG9vbF9yb290X2RpciBnY2MvbGliZ2NjLmFdCisgICAgaWYgeyRnY2NkaXIgIT0gIiJ9IHsKKwlzZXQgZ2NjZGlyIFtmaWxlIGRpcm5hbWUgJGdjY2Rpcl0KKyAgICB9CisgICAgdmVyYm9zZSAiZ2NjZGlyICRnY2NkaXIiCisKKyAgICBzZXQgbGRfbGlicmFyeV9wYXRoICIuIgorICAgIGFwcGVuZCBsZF9saWJyYXJ5X3BhdGggIjoke2djY2Rpcn0iCisKKyAgICBzZXQgY29tcGlsZXIgIiR7Z2NjZGlyfS94Z2NjIgorICAgIGlmIHsgW2lzX3JlbW90ZSBob3N0XSA9PSAwICYmIFt3aGljaCAkY29tcGlsZXJdICE9IDAgfSB7CisJZm9yZWFjaCBpICJbZXhlYyAkY29tcGlsZXIgLS1wcmludC1tdWx0aS1saWJdIiB7CisJICAgIHNldCBtbGRpciAiIgorCSAgICByZWdleHAgLS0gIlxbYS16MC05PV8vXC4tXF0qOyIgJGkgbWxkaXIKKwkgICAgc2V0IG1sZGlyIFtzdHJpbmcgdHJpbXJpZ2h0ICRtbGRpciAiXDtAIl0KKwkgICAgaWYgeyAiJG1sZGlyIiA9PSAiLiIgfSB7CisJCWNvbnRpbnVlCisJICAgIH0KKwkgICAgaWYgeyBbbGxlbmd0aCBbZ2xvYiAtbm9jb21wbGFpbiAke2djY2Rpcn0vJHttbGRpcn0vbGliZ2NjX3MqLnNvLipdXSA+PSAxIH0geworCQlhcHBlbmQgbGRfbGlicmFyeV9wYXRoICI6JHtnY2NkaXJ9LyR7bWxkaXJ9IgorCSAgICB9CisJfQorICAgIH0KKyAgICAjIGFkZCB0aGUgbGlicmFyeSBwYXRoIGZvciBsaWJmZmkuCisgICAgYXBwZW5kIGxkX2xpYnJhcnlfcGF0aCAiOiR7YmxkZGlyZmZpfS8ubGlicyIKKworICAgIHZlcmJvc2UgImxkX2xpYnJhcnlfcGF0aDogJGxkX2xpYnJhcnlfcGF0aCIKKworICAgICMgUG9pbnQgdG8gdGhlIExpYmZmaSBoZWFkZXJzIGluIGxpYmZmaS4KKyAgICBzZXQgbGliZmZpX2luY2x1ZGUgIiR7YmxkZGlyZmZpfS9pbmNsdWRlIgorICAgIHZlcmJvc2UgImxpYmZmaV9pbmNsdWRlICRsaWJmZmlfaW5jbHVkZSIKKworICAgIHNldCBsaWJmZmlfZGlyICAiJHtibGRkaXJmZml9Ly5saWJzIgorICAgIHZlcmJvc2UgImxpYmZmaV9kaXIgJGxpYmZmaV9kaXIiCisgICAgaWYgeyAkbGliZmZpX2RpciAhPSAiIiB9IHsKKwlzZXQgbGliZmZpX2RpciBbZmlsZSBkaXJuYW1lICR7bGliZmZpX2Rpcn1dCisJc2V0IGxpYmZmaV9saW5rX2ZsYWdzICItTCR7bGliZmZpX2Rpcn0vLmxpYnMiCisgICAgfQorCisgICAgc2V0X2xkX2xpYnJhcnlfcGF0aF9lbnZfdmFycworICAgIGxpYmZmaV9tYXliZV9idWlsZF93cmFwcGVyICIke29iamRpcn0vdGVzdGdsdWUubyIKK30KKworcHJvYyBsaWJmZmlfZXhpdCB7IH0geworICAgIGdsb2JhbCBnbHVlZmlsZTsKKworICAgIGlmIFtpbmZvIGV4aXN0cyBnbHVlZmlsZV0geworCWZpbGVfb25fYnVpbGQgZGVsZXRlICRnbHVlZmlsZTsKKwl1bnNldCBnbHVlZmlsZTsKKyAgICB9Cit9CisKK3Byb2MgbGliZmZpX3RhcmdldF9jb21waWxlIHsgc291cmNlIGRlc3QgdHlwZSBvcHRpb25zIH0geworICAgIGdsb2JhbCBnbHVlZmlsZSB3cmFwX2ZsYWdzOworICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgYmxkZGlyZmZpCisgICAgZ2xvYmFsIFRPT0xfT1BUSU9OUworICAgIGdsb2JhbCBsaWJmZmlfbGlua19mbGFncworICAgIGdsb2JhbCBsaWJmZmlfaW5jbHVkZQorICAgIGdsb2JhbCB0YXJnZXRfdHJpcGxldAorCisKKyAgICBpZiB7IFt0YXJnZXRfaW5mbyBuZWVkc19zdGF0dXNfd3JhcHBlcl0hPSIiICYmIFtpbmZvIGV4aXN0cyBnbHVlZmlsZV0gfSB7CisJbGFwcGVuZCBvcHRpb25zICJsaWJzPSR7Z2x1ZWZpbGV9IgorCWxhcHBlbmQgb3B0aW9ucyAibGRmbGFncz0kd3JhcF9mbGFncyIKKyAgICB9CisKKyAgICAjIFRPT0xfT1BUSU9OUyBtdXN0IGNvbWUgZmlyc3QsIHNvIHRoYXQgaXQgZG9lc24ndCBvdmVycmlkZSB0ZXN0Y2FzZQorICAgICMgc3BlY2lmaWMgb3B0aW9ucy4KKyAgICBpZiBbaW5mbyBleGlzdHMgVE9PTF9PUFRJT05TXSB7CisJbGFwcGVuZCAgb3B0aW9ucyBbY29uY2F0ICJhZGRpdGlvbmFsX2ZsYWdzPSRUT09MX09QVElPTlMiICRvcHRpb25zXTsKKyAgICB9CisKKyAgICAjIHNlYXJjaCBmb3IgZmZpX21pcHMuaCBpbiBzcmNkaXIsIHRvbworICAgIGxhcHBlbmQgb3B0aW9ucyAiYWRkaXRpb25hbF9mbGFncz0tSSR7bGliZmZpX2luY2x1ZGV9IC1JJHtzcmNkaXJ9Ly4uL2luY2x1ZGUgIC1JJHtsaWJmZmlfaW5jbHVkZX0vLi4iCisgICAgbGFwcGVuZCBvcHRpb25zICJhZGRpdGlvbmFsX2ZsYWdzPSR7bGliZmZpX2xpbmtfZmxhZ3N9IgorCisgICAgIyBEYXJ3aW4gbmVlZHMgYSBzdGFjayBleGVjdXRpb24gYWxsb3dlZCBmbGFnLgorCisgICAgaWYgeyBbaXN0YXJnZXQgIiotKi1kYXJ3aW45KiJdIHx8IFtpc3RhcmdldCAiKi0qLWRhcndpbjEqIl0KKwkgfHwgW2lzdGFyZ2V0ICIqLSotZGFyd2luMioiXSB9IHsKKwlsYXBwZW5kIG9wdGlvbnMgImFkZGl0aW9uYWxfZmxhZ3M9LVdsLC1hbGxvd19zdGFja19leGVjdXRlIgorICAgIH0KKworICAgICMgSWYgeW91J3JlIGJ1aWxkaW5nIHRoZSBjb21waWxlciB3aXRoIC0tcHJlZml4IHNldCB0byBhIHBsYWNlCisgICAgIyB3aGVyZSBpdCdzIG5vdCB5ZXQgaW5zdGFsbGVkLCB0aGVuIHRoZSBsaW5rZXIgd29uJ3QgYmUgYWJsZSB0bworICAgICMgZmluZCB0aGUgbGliZ2NjIHVzZWQgYnkgbGliZmZpLmR5bGliLiAgV2UgY291bGQgcGFzcyB0aGUKKyAgICAjIC1keWxpYl9maWxlIG9wdGlvbiwgYnV0IHRoYXQncyBjb21wbGljYXRlZCwgYW5kIGl0J3MgbXVjaCBlYXNpZXIKKyAgICAjIHRvIGp1c3QgbWFrZSB0aGUgbGlua2VyIGZpbmQgbGliZ2NjIHVzaW5nIC1MIG9wdGlvbnMuCisgICAgaWYgeyBbc3RyaW5nIG1hdGNoICIqLSotZGFyd2luKiIgJHRhcmdldF90cmlwbGV0XSB9IHsKKwlsYXBwZW5kIG9wdGlvbnMgImxpYnM9IC1zaGFyZWQtbGliZ2NjIgorICAgIH0KKworICAgIGlmIHsgW3N0cmluZyBtYXRjaCAiKi0qLW9wZW5ic2QqIiAkdGFyZ2V0X3RyaXBsZXRdIH0geworCWxhcHBlbmQgb3B0aW9ucyAibGlicz0gLWxwdGhyZWFkIgorICAgIH0KKworICAgIGxhcHBlbmQgb3B0aW9ucyAibGlicz0gLWxmZmkiCisKKyAgICB2ZXJib3NlICJvcHRpb25zOiAkb3B0aW9ucyIKKyAgICByZXR1cm4gW3RhcmdldF9jb21waWxlICRzb3VyY2UgJGRlc3QgJHR5cGUgJG9wdGlvbnNdCit9CisKKyMgVXRpbGl0eSByb3V0aW5lcy4KKworIworIyBzZWFyY2hfZm9yIC0tIGxvb2tzIGZvciBhIHN0cmluZyBtYXRjaCBpbiBhIGZpbGUKKyMKK3Byb2Mgc2VhcmNoX2ZvciB7IGZpbGUgcGF0dGVybiB9IHsKKyAgICBzZXQgZmQgW29wZW4gJGZpbGUgcl0KKyAgICB3aGlsZSB7IFtnZXRzICRmZCBjdXJfbGluZV0+PTAgfSB7CisJaWYgW3N0cmluZyBtYXRjaCAiKiRwYXR0ZXJuKiIgJGN1cl9saW5lXSB0aGVuIHsKKwkgICAgY2xvc2UgJGZkCisJICAgIHJldHVybiAxCisJfQorICAgIH0KKyAgICBjbG9zZSAkZmQKKyAgICByZXR1cm4gMAorfQorCisjIE1vZGlmaWVkIGRnLXJ1bnRlc3QgdGhhdCBjYW4gY3ljbGUgdGhyb3VnaCBhIGxpc3Qgb2Ygb3B0aW1pemF0aW9uIG9wdGlvbnMKKyMgYXMgYy10b3J0dXJlIGRvZXMuCitwcm9jIGxpYmZmaS1kZy1ydW50ZXN0IHsgdGVzdGNhc2VzIGRlZmF1bHQtZXh0cmEtZmxhZ3MgfSB7CisgICAgZ2xvYmFsIHJ1bnRlc3RzCisKKyAgICBmb3JlYWNoIHRlc3QgJHRlc3RjYXNlcyB7CisJIyBJZiB3ZSdyZSBvbmx5IHRlc3Rpbmcgc3BlY2lmaWMgZmlsZXMgYW5kIHRoaXMgaXNuJ3Qgb25lIG9mCisJIyB0aGVtLCBza2lwIGl0LgorCWlmICFbcnVudGVzdF9maWxlX3AgJHJ1bnRlc3RzICR0ZXN0XSB7CisJICAgIGNvbnRpbnVlCisJfQorCisJIyBMb29rIGZvciBhIGxvb3Agd2l0aGluIHRoZSBzb3VyY2UgY29kZSAtIGlmIHdlIGRvbid0IGZpbmQgb25lLAorCSMgZG9uJ3QgcGFzcyAtZnVucm9sbFstYWxsXS1sb29wcy4KKwlnbG9iYWwgdG9ydHVyZV93aXRoX2xvb3BzIHRvcnR1cmVfd2l0aG91dF9sb29wcworCWlmIFtleHByIFtzZWFyY2hfZm9yICR0ZXN0ICJmb3IqKCJdK1tzZWFyY2hfZm9yICR0ZXN0ICJ3aGlsZSooIl1dIHsKKwkgICAgc2V0IG9wdGlvbl9saXN0ICR0b3J0dXJlX3dpdGhfbG9vcHMKKwl9IGVsc2UgeworCSAgICBzZXQgb3B0aW9uX2xpc3QgJHRvcnR1cmVfd2l0aG91dF9sb29wcworCX0KKworCXNldCBuc2hvcnQgW2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lICR0ZXN0XV0vW2ZpbGUgdGFpbCAkdGVzdF0KKworCWZvcmVhY2ggZmxhZ3MgJG9wdGlvbl9saXN0IHsKKwkgICAgdmVyYm9zZSAiVGVzdGluZyAkbnNob3J0LCAkZmxhZ3MiIDEKKwkgICAgZGctdGVzdCAkdGVzdCAkZmxhZ3MgJHtkZWZhdWx0LWV4dHJhLWZsYWdzfQorCX0KKyAgICB9Cit9CisKKworIyBMaWtlIGNoZWNrX2NvbmRpdGlvbmFsX3hmYWlsLCBidXQgY2FsbGFibGUgZnJvbSBhIGRnIHRlc3QuCisKK3Byb2MgZGcteGZhaWwtaWYgeyBhcmdzIH0geworICAgIHNldCBhcmdzIFtscmVwbGFjZSAkYXJncyAwIDBdCisgICAgc2V0IHNlbGVjdG9yICJ0YXJnZXQgW2pvaW4gW2xpbmRleCAkYXJncyAxXV0iCisgICAgaWYgeyBbZGctcHJvY2Vzcy10YXJnZXQgJHNlbGVjdG9yXSA9PSAiUyIgfSB7CisJZ2xvYmFsIGNvbXBpbGVyX2NvbmRpdGlvbmFsX3hmYWlsX2RhdGEKKwlzZXQgY29tcGlsZXJfY29uZGl0aW9uYWxfeGZhaWxfZGF0YSAkYXJncworICAgIH0KK30KKworCisjIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWRkaXRpb25hbF9maWxlcyBhbmQgYWRkaXRpb25hbF9zb3VyY2VzCisjIGFyZSBib3RoIGNsZWFyZWQgb3V0IGFmdGVyIGV2ZXJ5IHRlc3QuICBJdCBpcyBub3QgZW5vdWdoIHRvIGNsZWFyCisjIHRoZW0gb3V0ICpiZWZvcmUqIHRoZSBuZXh0IHRlc3QgcnVuIGJlY2F1c2UgZ2NjLXRhcmdldC1jb21waWxlIGdldHMKKyMgcnVuIGRpcmVjdGx5IGZyb20gc29tZSAuZXhwIGZpbGVzIChvdXRzaWRlIG9mIGFueSB0ZXN0KS4gIChUaG9zZQorIyB1c2VzIHNob3VsZCBldmVudHVhbGx5IGJlIGVsaW1pbmF0ZWQuKQorCisjIEJlY2F1c2UgdGhlIERHIGZyYW1ld29yayBkb2Vzbid0IHByb3ZpZGUgYSBob29rIHRoYXQgaXMgcnVuIGF0IHRoZQorIyBlbmQgb2YgYSB0ZXN0LCB3ZSBtdXN0IHJlcGxhY2UgZGctdGVzdCB3aXRoIGEgd3JhcHBlci4KKworaWYgeyBbaW5mbyBwcm9jcyBzYXZlZC1kZy10ZXN0XSA9PSBbbGlzdF0gfSB7CisgICAgcmVuYW1lIGRnLXRlc3Qgc2F2ZWQtZGctdGVzdAorCisgICAgcHJvYyBkZy10ZXN0IHsgYXJncyB9IHsKKwlnbG9iYWwgYWRkaXRpb25hbF9maWxlcworCWdsb2JhbCBhZGRpdGlvbmFsX3NvdXJjZXMKKwlnbG9iYWwgZXJyb3JJbmZvCisKKwlpZiB7IFsgY2F0Y2ggeyBldmFsIHNhdmVkLWRnLXRlc3QgJGFyZ3MgfSBlcnJtc2cgXSB9IHsKKwkgICAgc2V0IHNhdmVkX2luZm8gJGVycm9ySW5mbworCSAgICBzZXQgYWRkaXRpb25hbF9maWxlcyAiIgorCSAgICBzZXQgYWRkaXRpb25hbF9zb3VyY2VzICIiCisJICAgIGVycm9yICRlcnJtc2cgJHNhdmVkX2luZm8KKwl9CisJc2V0IGFkZGl0aW9uYWxfZmlsZXMgIiIKKwlzZXQgYWRkaXRpb25hbF9zb3VyY2VzICIiCisgICAgfQorfQorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgdGNsLWluZGVudC1sZXZlbDo0CisjIEVuZDoKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliL2xpYmZmaS5leHAgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYi9saWJmZmkuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjVlZDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYi9saWJmZmkuZXhwCkBAIC0wLDAgKzEsMzUwIEBACisjICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisjIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworcHJvYyBsb2FkX2djY19saWIgeyBmaWxlbmFtZSB9IHsKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgbG9hZF9maWxlICRzcmNkaXIvbGliLyRmaWxlbmFtZQorfQorCitsb2FkX2xpYiBkZy5leHAKK2xvYWRfbGliIGxpYmdsb3NzLmV4cAorbG9hZF9nY2NfbGliIHRhcmdldC1saWJwYXRoLmV4cAorbG9hZF9nY2NfbGliIHdyYXBwZXIuZXhwCisKKworIyBEZWZpbmUgbGliZmZpIGNhbGxiYWNrcyBmb3IgZGcuZXhwLgorCitwcm9jIGxpYmZmaS1kZy10ZXN0LTEgeyB0YXJnZXRfY29tcGlsZSBwcm9nIGRvX3doYXQgZXh0cmFfdG9vbF9mbGFncyB9IHsKKworICAgICMgVG8gZ2V0IGFsbCBcbiBpbiBkZy1vdXRwdXQgdGVzdCBzdHJpbmdzIHRvIG1hdGNoIHByaW50ZiBvdXRwdXQKKyAgICAjIGluIGEgc3lzdGVtIHRoYXQgb3V0cHV0cyBpdCBhcyBcMDE1XDAxMiAoaS5lLiBub3QganVzdCBcMDEyKSwgd2UKKyAgICAjIG5lZWQgdG8gY2hhbmdlIGFsbCBcbiBpbnRvIFxyP1xuLiAgQXMgdGhlcmUgaXMgbm8gZGVqYWdudSBmbGFnCisgICAgIyBvciBob29rIHRvIGRvIHRoYXQsIHdlIHNpbXBseSBjaGFuZ2UgdGhlIHRleHQgYmVpbmcgdGVzdGVkLgorICAgICMgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byBrbm93IHRoYXQgdGhlIHZhcmlhYmxlIGlzIGNhbGxlZAorICAgICMgZGctb3V0cHV0LXRleHQgYW5kIGxpdmVzIGluIHRoZSBjYWxsZXIgb2YgbGliZmZpLWRnLXRlc3QsIHdoaWNoCisgICAgIyBpcyB0d28gY2FsbHMgdXAuICBPdmVycmlkaW5nIHByb2MgZGctb3V0cHV0IHdvdWxkIGJlIGxvbmdlciBhbmQKKyAgICAjIHdvdWxkIG5lY2Vzc2FyaWx5IGhhdmUgdGhlIHNhbWUgYXNzdW1wdGlvbi4KKyAgICB1cHZhciAyIGRnLW91dHB1dC10ZXh0IG91dHB1dF9tYXRjaAorCisgICAgaWYgeyBbbGxlbmd0aCAkb3V0cHV0X21hdGNoXSA+IDEgfSB7CisJcmVnc3ViIC1hbGwgIlxuIiBbbGluZGV4ICRvdXRwdXRfbWF0Y2ggMV0gIlxyP1xuIiB4CisJc2V0IG91dHB1dF9tYXRjaCBbbHJlcGxhY2UgJG91dHB1dF9tYXRjaCAxIDEgJHhdCisgICAgfQorCisgICAgIyBTZXQgdXAgdGhlIGNvbXBpbGVyIGZsYWdzLCBiYXNlZCBvbiB3aGF0IHdlJ3JlIGdvaW5nIHRvIGRvLgorCisgICAgc2V0IG9wdGlvbnMgW2xpc3RdCisgICAgc3dpdGNoICRkb193aGF0IHsKKwkiY29tcGlsZSIgeworCSAgICBzZXQgY29tcGlsZV90eXBlICJhc3NlbWJseSIKKwkgICAgc2V0IG91dHB1dF9maWxlICJbZmlsZSByb290bmFtZSBbZmlsZSB0YWlsICRwcm9nXV0ucyIKKwl9CisJImxpbmsiIHsKKwkgICAgc2V0IGNvbXBpbGVfdHlwZSAiZXhlY3V0YWJsZSIKKwkgICAgc2V0IG91dHB1dF9maWxlICJbZmlsZSByb290bmFtZSBbZmlsZSB0YWlsICRwcm9nXV0uZXhlIgorCSAgICAjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBuZWVkZWQgZm9yIHRhcmdldHMgbGlrZSB0aGUgaTk2MCB3aGVyZQorCSAgICAjIHRoZSBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIGIub3V0LiAgU2lnaC4KKwl9CisJInJ1biIgeworCSAgICBzZXQgY29tcGlsZV90eXBlICJleGVjdXRhYmxlIgorCSAgICAjIEZJWE1FOiAiLi8iIGlzIHRvIGNvcGUgd2l0aCAiLiIgbm90IGJlaW5nIGluICRQQVRILgorCSAgICAjIFNob3VsZCB0aGlzIGJlIGhhbmRsZWQgZWxzZXdoZXJlPworCSAgICAjIFlFUy4KKwkgICAgc2V0IG91dHB1dF9maWxlICIuL1tmaWxlIHJvb3RuYW1lIFtmaWxlIHRhaWwgJHByb2ddXS5leGUiCisJICAgICMgVGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYXJlIGlmIGFuIGV4ZWN1dGFibGUgd2FzCisJICAgICMgY3JlYXRlZCBvciBub3QuICBJZiBpdCB3YXMsIGRnLmV4cCB3aWxsIHRyeSB0byBydW4gaXQuCisJICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAkb3V0cHV0X2ZpbGU7CisJfQorCWRlZmF1bHQgeworCSAgICBwZXJyb3IgIiRkb193aGF0OiBub3QgYSB2YWxpZCBkZy1kbyBrZXl3b3JkIgorCSAgICByZXR1cm4gIiIKKwl9CisgICAgfQorCisgICAgaWYgeyAkZXh0cmFfdG9vbF9mbGFncyAhPSAiIiB9IHsKKwlsYXBwZW5kIG9wdGlvbnMgImFkZGl0aW9uYWxfZmxhZ3M9JGV4dHJhX3Rvb2xfZmxhZ3MiCisgICAgfQorCisgICAgc2V0IGNvbXBfb3V0cHV0IFtsaWJmZmlfdGFyZ2V0X2NvbXBpbGUgIiRwcm9nIiAiJG91dHB1dF9maWxlIiAiJGNvbXBpbGVfdHlwZSIgJG9wdGlvbnNdOworCisKKyAgICByZXR1cm4gW2xpc3QgJGNvbXBfb3V0cHV0ICRvdXRwdXRfZmlsZV0KK30KKworCitwcm9jIGxpYmZmaS1kZy10ZXN0IHsgcHJvZyBkb193aGF0IGV4dHJhX3Rvb2xfZmxhZ3MgfSB7CisgICAgcmV0dXJuIFtsaWJmZmktZGctdGVzdC0xIHRhcmdldF9jb21waWxlICRwcm9nICRkb193aGF0ICRleHRyYV90b29sX2ZsYWdzXQorfQorCitwcm9jIGxpYmZmaS1pbml0IHsgYXJncyB9IHsKKyAgICBnbG9iYWwgZ2x1ZWZpbGUgd3JhcF9mbGFnczsKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGJsZGRpcmZmaQorICAgIGdsb2JhbCBvYmpkaXIKKyAgICBnbG9iYWwgVE9PTF9PUFRJT05TCisgICAgZ2xvYmFsIHRvb2wKKyAgICBnbG9iYWwgbGliZmZpX2luY2x1ZGUKKyAgICBnbG9iYWwgbGliZmZpX2xpbmtfZmxhZ3MKKyAgICBnbG9iYWwgdG9vbF9yb290X2RpcgorICAgIGdsb2JhbCBsZF9saWJyYXJ5X3BhdGgKKworICAgIHNldCBibGRkaXJmZmkgW3B3ZF0vLi4gCisgICAgdmVyYm9zZSAibGliZmZpICRibGRkaXJmZmkiCisKKyAgICBzZXQgZ2NjZGlyIFtsb29rZm9yX2ZpbGUgJHRvb2xfcm9vdF9kaXIgZ2NjL2xpYmdjYy5hXQorICAgIGlmIHskZ2NjZGlyICE9ICIifSB7CisJc2V0IGdjY2RpciBbZmlsZSBkaXJuYW1lICRnY2NkaXJdCisgICAgfQorICAgIHZlcmJvc2UgImdjY2RpciAkZ2NjZGlyIgorCisgICAgc2V0IGxkX2xpYnJhcnlfcGF0aCAiLiIKKyAgICBhcHBlbmQgbGRfbGlicmFyeV9wYXRoICI6JHtnY2NkaXJ9IgorCisgICAgc2V0IGNvbXBpbGVyICIke2djY2Rpcn0veGdjYyIKKyAgICBpZiB7IFtpc19yZW1vdGUgaG9zdF0gPT0gMCAmJiBbd2hpY2ggJGNvbXBpbGVyXSAhPSAwIH0geworCWZvcmVhY2ggaSAiW2V4ZWMgJGNvbXBpbGVyIC0tcHJpbnQtbXVsdGktbGliXSIgeworCSAgICBzZXQgbWxkaXIgIiIKKwkgICAgcmVnZXhwIC0tICJcW2EtejAtOT1fL1wuLVxdKjsiICRpIG1sZGlyCisJICAgIHNldCBtbGRpciBbc3RyaW5nIHRyaW1yaWdodCAkbWxkaXIgIlw7QCJdCisJICAgIGlmIHsgIiRtbGRpciIgPT0gIi4iIH0geworCQljb250aW51ZQorCSAgICB9CisJICAgIGlmIHsgW2xsZW5ndGggW2dsb2IgLW5vY29tcGxhaW4gJHtnY2NkaXJ9LyR7bWxkaXJ9L2xpYmdjY19zKi5zby4qXV0gPj0gMSB9IHsKKwkJYXBwZW5kIGxkX2xpYnJhcnlfcGF0aCAiOiR7Z2NjZGlyfS8ke21sZGlyfSIKKwkgICAgfQorCX0KKyAgICB9CisgICAgIyBhZGQgdGhlIGxpYnJhcnkgcGF0aCBmb3IgbGliZmZpLgorICAgIGFwcGVuZCBsZF9saWJyYXJ5X3BhdGggIjoke2JsZGRpcmZmaX0vLmxpYnMiCisKKyAgICB2ZXJib3NlICJsZF9saWJyYXJ5X3BhdGg6ICRsZF9saWJyYXJ5X3BhdGgiCisKKyAgICAjIFBvaW50IHRvIHRoZSBMaWJmZmkgaGVhZGVycyBpbiBsaWJmZmkuCisgICAgc2V0IGxpYmZmaV9pbmNsdWRlICIke2JsZGRpcmZmaX0vaW5jbHVkZSIKKyAgICB2ZXJib3NlICJsaWJmZmlfaW5jbHVkZSAkbGliZmZpX2luY2x1ZGUiCisKKyAgICBzZXQgbGliZmZpX2RpciAgIiR7YmxkZGlyZmZpfS8ubGlicyIKKyAgICB2ZXJib3NlICJsaWJmZmlfZGlyICRsaWJmZmlfZGlyIgorICAgIGlmIHsgJGxpYmZmaV9kaXIgIT0gIiIgfSB7CisJc2V0IGxpYmZmaV9kaXIgW2ZpbGUgZGlybmFtZSAke2xpYmZmaV9kaXJ9XQorCXNldCBsaWJmZmlfbGlua19mbGFncyAiLUwke2xpYmZmaV9kaXJ9Ly5saWJzIgorICAgIH0KKworICAgIHNldF9sZF9saWJyYXJ5X3BhdGhfZW52X3ZhcnMKKyAgICBsaWJmZmlfbWF5YmVfYnVpbGRfd3JhcHBlciAiJHtvYmpkaXJ9L3Rlc3RnbHVlLm8iCit9CisKK3Byb2MgbGliZmZpX2V4aXQgeyB9IHsKKyAgICBnbG9iYWwgZ2x1ZWZpbGU7CisKKyAgICBpZiBbaW5mbyBleGlzdHMgZ2x1ZWZpbGVdIHsKKwlmaWxlX29uX2J1aWxkIGRlbGV0ZSAkZ2x1ZWZpbGU7CisJdW5zZXQgZ2x1ZWZpbGU7CisgICAgfQorfQorCitwcm9jIGxpYmZmaV90YXJnZXRfY29tcGlsZSB7IHNvdXJjZSBkZXN0IHR5cGUgb3B0aW9ucyB9IHsKKyAgICBnbG9iYWwgZ2x1ZWZpbGUgd3JhcF9mbGFnczsKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGJsZGRpcmZmaQorICAgIGdsb2JhbCBUT09MX09QVElPTlMKKyAgICBnbG9iYWwgbGliZmZpX2xpbmtfZmxhZ3MKKyAgICBnbG9iYWwgbGliZmZpX2luY2x1ZGUKKyAgICBnbG9iYWwgdGFyZ2V0X3RyaXBsZXQKKworCisgICAgaWYgeyBbdGFyZ2V0X2luZm8gbmVlZHNfc3RhdHVzX3dyYXBwZXJdIT0iIiAmJiBbaW5mbyBleGlzdHMgZ2x1ZWZpbGVdIH0geworCWxhcHBlbmQgb3B0aW9ucyAibGlicz0ke2dsdWVmaWxlfSIKKwlsYXBwZW5kIG9wdGlvbnMgImxkZmxhZ3M9JHdyYXBfZmxhZ3MiCisgICAgfQorCisgICAgIyBUT09MX09QVElPTlMgbXVzdCBjb21lIGZpcnN0LCBzbyB0aGF0IGl0IGRvZXNuJ3Qgb3ZlcnJpZGUgdGVzdGNhc2UKKyAgICAjIHNwZWNpZmljIG9wdGlvbnMuCisgICAgaWYgW2luZm8gZXhpc3RzIFRPT0xfT1BUSU9OU10geworCWxhcHBlbmQgIG9wdGlvbnMgW2NvbmNhdCAiYWRkaXRpb25hbF9mbGFncz0kVE9PTF9PUFRJT05TIiAkb3B0aW9uc107CisgICAgfQorCisgICAgIyBzZWFyY2ggZm9yIGZmaV9taXBzLmggaW4gc3JjZGlyLCB0b28KKyAgICBsYXBwZW5kIG9wdGlvbnMgImFkZGl0aW9uYWxfZmxhZ3M9LUkke2xpYmZmaV9pbmNsdWRlfSAtSSR7c3JjZGlyfS8uLi9pbmNsdWRlICAtSSR7bGliZmZpX2luY2x1ZGV9Ly4uIgorICAgIGxhcHBlbmQgb3B0aW9ucyAiYWRkaXRpb25hbF9mbGFncz0ke2xpYmZmaV9saW5rX2ZsYWdzfSIKKworICAgICMgRGFyd2luIG5lZWRzIGEgc3RhY2sgZXhlY3V0aW9uIGFsbG93ZWQgZmxhZy4KKworICAgIGlmIHsgW2lzdGFyZ2V0ICIqLSotZGFyd2luOSoiXSB8fCBbaXN0YXJnZXQgIiotKi1kYXJ3aW4xKiJdCisJIHx8IFtpc3RhcmdldCAiKi0qLWRhcndpbjIqIl0gfSB7CisJbGFwcGVuZCBvcHRpb25zICJhZGRpdGlvbmFsX2ZsYWdzPS1XbCwtYWxsb3dfc3RhY2tfZXhlY3V0ZSIKKyAgICB9CisKKyAgICAjIElmIHlvdSdyZSBidWlsZGluZyB0aGUgY29tcGlsZXIgd2l0aCAtLXByZWZpeCBzZXQgdG8gYSBwbGFjZQorICAgICMgd2hlcmUgaXQncyBub3QgeWV0IGluc3RhbGxlZCwgdGhlbiB0aGUgbGlua2VyIHdvbid0IGJlIGFibGUgdG8KKyAgICAjIGZpbmQgdGhlIGxpYmdjYyB1c2VkIGJ5IGxpYmZmaS5keWxpYi4gIFdlIGNvdWxkIHBhc3MgdGhlCisgICAgIyAtZHlsaWJfZmlsZSBvcHRpb24sIGJ1dCB0aGF0J3MgY29tcGxpY2F0ZWQsIGFuZCBpdCdzIG11Y2ggZWFzaWVyCisgICAgIyB0byBqdXN0IG1ha2UgdGhlIGxpbmtlciBmaW5kIGxpYmdjYyB1c2luZyAtTCBvcHRpb25zLgorICAgIGlmIHsgW3N0cmluZyBtYXRjaCAiKi0qLWRhcndpbioiICR0YXJnZXRfdHJpcGxldF0gfSB7CisJbGFwcGVuZCBvcHRpb25zICJsaWJzPSAtc2hhcmVkLWxpYmdjYyIKKyAgICB9CisKKyAgICBpZiB7IFtzdHJpbmcgbWF0Y2ggIiotKi1vcGVuYnNkKiIgJHRhcmdldF90cmlwbGV0XSB9IHsKKwlsYXBwZW5kIG9wdGlvbnMgImxpYnM9IC1scHRocmVhZCIKKyAgICB9CisKKyAgICBsYXBwZW5kIG9wdGlvbnMgImxpYnM9IC1sZmZpIgorCisgICAgdmVyYm9zZSAib3B0aW9uczogJG9wdGlvbnMiCisgICAgcmV0dXJuIFt0YXJnZXRfY29tcGlsZSAkc291cmNlICRkZXN0ICR0eXBlICRvcHRpb25zXQorfQorCisjIFV0aWxpdHkgcm91dGluZXMuCisKKyMKKyMgc2VhcmNoX2ZvciAtLSBsb29rcyBmb3IgYSBzdHJpbmcgbWF0Y2ggaW4gYSBmaWxlCisjCitwcm9jIHNlYXJjaF9mb3IgeyBmaWxlIHBhdHRlcm4gfSB7CisgICAgc2V0IGZkIFtvcGVuICRmaWxlIHJdCisgICAgd2hpbGUgeyBbZ2V0cyAkZmQgY3VyX2xpbmVdPj0wIH0geworCWlmIFtzdHJpbmcgbWF0Y2ggIiokcGF0dGVybioiICRjdXJfbGluZV0gdGhlbiB7CisJICAgIGNsb3NlICRmZAorCSAgICByZXR1cm4gMQorCX0KKyAgICB9CisgICAgY2xvc2UgJGZkCisgICAgcmV0dXJuIDAKK30KKworIyBNb2RpZmllZCBkZy1ydW50ZXN0IHRoYXQgY2FuIGN5Y2xlIHRocm91Z2ggYSBsaXN0IG9mIG9wdGltaXphdGlvbiBvcHRpb25zCisjIGFzIGMtdG9ydHVyZSBkb2VzLgorcHJvYyBsaWJmZmktZGctcnVudGVzdCB7IHRlc3RjYXNlcyBkZWZhdWx0LWV4dHJhLWZsYWdzIH0geworICAgIGdsb2JhbCBydW50ZXN0cworCisgICAgZm9yZWFjaCB0ZXN0ICR0ZXN0Y2FzZXMgeworCSMgSWYgd2UncmUgb25seSB0ZXN0aW5nIHNwZWNpZmljIGZpbGVzIGFuZCB0aGlzIGlzbid0IG9uZSBvZgorCSMgdGhlbSwgc2tpcCBpdC4KKwlpZiAhW3J1bnRlc3RfZmlsZV9wICRydW50ZXN0cyAkdGVzdF0geworCSAgICBjb250aW51ZQorCX0KKworCSMgTG9vayBmb3IgYSBsb29wIHdpdGhpbiB0aGUgc291cmNlIGNvZGUgLSBpZiB3ZSBkb24ndCBmaW5kIG9uZSwKKwkjIGRvbid0IHBhc3MgLWZ1bnJvbGxbLWFsbF0tbG9vcHMuCisJZ2xvYmFsIHRvcnR1cmVfd2l0aF9sb29wcyB0b3J0dXJlX3dpdGhvdXRfbG9vcHMKKwlpZiBbZXhwciBbc2VhcmNoX2ZvciAkdGVzdCAiZm9yKigiXStbc2VhcmNoX2ZvciAkdGVzdCAid2hpbGUqKCJdXSB7CisJICAgIHNldCBvcHRpb25fbGlzdCAkdG9ydHVyZV93aXRoX2xvb3BzCisJfSBlbHNlIHsKKwkgICAgc2V0IG9wdGlvbl9saXN0ICR0b3J0dXJlX3dpdGhvdXRfbG9vcHMKKwl9CisKKwlzZXQgbnNob3J0IFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSAkdGVzdF1dL1tmaWxlIHRhaWwgJHRlc3RdCisKKwlmb3JlYWNoIGZsYWdzICRvcHRpb25fbGlzdCB7CisJICAgIHZlcmJvc2UgIlRlc3RpbmcgJG5zaG9ydCwgJGZsYWdzIiAxCisJICAgIGRnLXRlc3QgJHRlc3QgJGZsYWdzICR7ZGVmYXVsdC1leHRyYS1mbGFnc30KKwl9CisgICAgfQorfQorCisKKyMgTGlrZSBjaGVja19jb25kaXRpb25hbF94ZmFpbCwgYnV0IGNhbGxhYmxlIGZyb20gYSBkZyB0ZXN0LgorCitwcm9jIGRnLXhmYWlsLWlmIHsgYXJncyB9IHsKKyAgICBzZXQgYXJncyBbbHJlcGxhY2UgJGFyZ3MgMCAwXQorICAgIHNldCBzZWxlY3RvciAidGFyZ2V0IFtqb2luIFtsaW5kZXggJGFyZ3MgMV1dIgorICAgIGlmIHsgW2RnLXByb2Nlc3MtdGFyZ2V0ICRzZWxlY3Rvcl0gPT0gIlMiIH0geworCWdsb2JhbCBjb21waWxlcl9jb25kaXRpb25hbF94ZmFpbF9kYXRhCisJc2V0IGNvbXBpbGVyX2NvbmRpdGlvbmFsX3hmYWlsX2RhdGEgJGFyZ3MKKyAgICB9Cit9CisKK3Byb2MgY2hlY2stZmxhZ3MgeyBhcmdzIH0geworCisgICAgIyBUaGUgYXJncyBhcmUgd2l0aGluIGFub3RoZXIgbGlzdDsgcHVsbCB0aGVtIG91dC4KKyAgICBzZXQgYXJncyBbbGluZGV4ICRhcmdzIDBdCisKKyAgICAjIFRoZSBuZXh0IHR3byBhcmd1bWVudHMgYXJlIG9wdGlvbmFsLiAgSWYgdGhleSB3ZXJlIG5vdCBzcGVjaWZpZWQsCisgICAgIyB1c2UgdGhlIGRlZmF1bHRzLgorICAgIGlmIHsgW2xsZW5ndGggJGFyZ3NdID09IDIgfSB7CisJbGFwcGVuZCAkYXJncyBbbGlzdCAiKiJdCisgICAgfQorICAgIGlmIHsgW2xsZW5ndGggJGFyZ3NdID09IDMgfSB7CisJbGFwcGVuZCAkYXJncyBbbGlzdCAiIl0KKyAgICB9CisKKyAgICAjIElmIHRoZSBvcHRpb24gc3RyaW5ncyBhcmUgdGhlIGRlZmF1bHRzLCBvciB0aGUgc2FtZSBhcyB0aGUKKyAgICAjIGRlZmF1bHRzLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgY2hlY2tfY29uZGl0aW9uYWxfeGZhaWwgdG8KKyAgICAjIGNvbXBhcmUgdGhlbSB0byB0aGUgYWN0dWFsIG9wdGlvbnMuCisgICAgaWYgeyBbc3RyaW5nIGNvbXBhcmUgW2xpbmRleCAkYXJncyAyXSAiKiJdID09IDAKKwkgJiYgW3N0cmluZyBjb21wYXJlIFtsaW5kZXggJGFyZ3MgM10gIiIgXSA9PSAwIH0geworCXNldCByZXN1bHQgMSAgICAKKyAgICB9IGVsc2UgeworCSMgVGhlIHRhcmdldCBsaXN0IG1pZ2h0IGJlIGFuIGVmZmVjdGl2ZS10YXJnZXQga2V5d29yZCwgc28gcmVwbGFjZQorCSMgdGhlIG9yaWdpbmFsIGxpc3Qgd2l0aCAiKi0qLSoiLCBzaW5jZSB3ZSBhbHJlYWR5IGtub3cgaXQgbWF0Y2hlcy4KKwlzZXQgcmVzdWx0IFtjaGVja19jb25kaXRpb25hbF94ZmFpbCBbbHJlcGxhY2UgJGFyZ3MgMSAxICIqLSotKiJdXQorICAgIH0KKworICAgIHJldHVybiAkcmVzdWx0Cit9CisKK3Byb2MgZGctc2tpcC1pZiB7IGFyZ3MgfSB7CisgICAgIyBWZXJpZnkgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuICBUaGUgbGFzdCB0d28gYXJlIG9wdGlvbmFsLgorICAgIHNldCBhcmdzIFtscmVwbGFjZSAkYXJncyAwIDBdCisgICAgaWYgeyBbbGxlbmd0aCAkYXJnc10gPCAyIHx8IFtsbGVuZ3RoICRhcmdzXSA+IDQgfSB7CisgICAgICAgIGVycm9yICJkZy1za2lwLWlmIDI6IG5lZWQgMiwgMywgb3IgNCBhcmd1bWVudHMiCisgICAgfQorCisgICAgIyBEb24ndCBib3RoZXIgaWYgd2UncmUgYWxyZWFkeSBza2lwcGluZyB0aGUgdGVzdC4KKyAgICB1cHZhciBkZy1kby13aGF0IGRnLWRvLXdoYXQKKyAgICBpZiB7IFtsaW5kZXggJHtkZy1kby13aGF0fSAxXSA9PSAiTiIgfSB7CisgICAgICByZXR1cm4KKyAgICB9CisKKyAgICBzZXQgc2VsZWN0b3IgW2xpc3QgdGFyZ2V0IFtsaW5kZXggJGFyZ3MgMV1dCisgICAgaWYgeyBbZGctcHJvY2Vzcy10YXJnZXQgJHNlbGVjdG9yXSA9PSAiUyIgfSB7CisgICAgICAgIGlmIFtjaGVjay1mbGFncyAkYXJnc10geworICAgICAgICAgICAgdXB2YXIgZGctZG8td2hhdCBkZy1kby13aGF0CisgICAgICAgICAgICBzZXQgZGctZG8td2hhdCBbbGlzdCBbbGluZGV4ICR7ZGctZG8td2hhdH0gMF0gIk4iICJQIl0KKyAgICAgICAgfQorICAgIH0KK30KKworIyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFkZGl0aW9uYWxfZmlsZXMgYW5kIGFkZGl0aW9uYWxfc291cmNlcworIyBhcmUgYm90aCBjbGVhcmVkIG91dCBhZnRlciBldmVyeSB0ZXN0LiAgSXQgaXMgbm90IGVub3VnaCB0byBjbGVhcgorIyB0aGVtIG91dCAqYmVmb3JlKiB0aGUgbmV4dCB0ZXN0IHJ1biBiZWNhdXNlIGdjYy10YXJnZXQtY29tcGlsZSBnZXRzCisjIHJ1biBkaXJlY3RseSBmcm9tIHNvbWUgLmV4cCBmaWxlcyAob3V0c2lkZSBvZiBhbnkgdGVzdCkuICAoVGhvc2UKKyMgdXNlcyBzaG91bGQgZXZlbnR1YWxseSBiZSBlbGltaW5hdGVkLikKKworIyBCZWNhdXNlIHRoZSBERyBmcmFtZXdvcmsgZG9lc24ndCBwcm92aWRlIGEgaG9vayB0aGF0IGlzIHJ1biBhdCB0aGUKKyMgZW5kIG9mIGEgdGVzdCwgd2UgbXVzdCByZXBsYWNlIGRnLXRlc3Qgd2l0aCBhIHdyYXBwZXIuCisKK2lmIHsgW2luZm8gcHJvY3Mgc2F2ZWQtZGctdGVzdF0gPT0gW2xpc3RdIH0geworICAgIHJlbmFtZSBkZy10ZXN0IHNhdmVkLWRnLXRlc3QKKworICAgIHByb2MgZGctdGVzdCB7IGFyZ3MgfSB7CisJZ2xvYmFsIGFkZGl0aW9uYWxfZmlsZXMKKwlnbG9iYWwgYWRkaXRpb25hbF9zb3VyY2VzCisJZ2xvYmFsIGVycm9ySW5mbworCisJaWYgeyBbIGNhdGNoIHsgZXZhbCBzYXZlZC1kZy10ZXN0ICRhcmdzIH0gZXJybXNnIF0gfSB7CisJICAgIHNldCBzYXZlZF9pbmZvICRlcnJvckluZm8KKwkgICAgc2V0IGFkZGl0aW9uYWxfZmlsZXMgIiIKKwkgICAgc2V0IGFkZGl0aW9uYWxfc291cmNlcyAiIgorCSAgICBlcnJvciAkZXJybXNnICRzYXZlZF9pbmZvCisJfQorCXNldCBhZGRpdGlvbmFsX2ZpbGVzICIiCisJc2V0IGFkZGl0aW9uYWxfc291cmNlcyAiIgorICAgIH0KK30KKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIHRjbC1pbmRlbnQtbGV2ZWw6NAorIyBFbmQ6CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYi90YXJnZXQtbGlicGF0aC5leHAgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYi90YXJnZXQtbGlicGF0aC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5OWFhNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliL3RhcmdldC1saWJwYXRoLmV4cApAQCAtMCwwICsxLDI2MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKyMgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIFRoaXMgZmlsZSB3YXMgY29udHJpYnV0ZWQgYnkgSm9obiBEYXZpZCBBbmdsaW4gKGRhdmUuYW5nbGluQG5yYy1jbnJjLmdjLmNhKQorCitzZXQgb3JpZ19lbnZpcm9ubWVudF9zYXZlZCAwCitzZXQgb3JpZ19sZF9saWJyYXJ5X3BhdGhfc2F2ZWQgMAorc2V0IG9yaWdfbGRfcnVuX3BhdGhfc2F2ZWQgMAorc2V0IG9yaWdfc2hsaWJfcGF0aF9zYXZlZCAwCitzZXQgb3JpZ19sZF9saWJyYXJ5bjMyX3BhdGhfc2F2ZWQgMAorc2V0IG9yaWdfbGRfbGlicmFyeTY0X3BhdGhfc2F2ZWQgMAorc2V0IG9yaWdfbGRfbGlicmFyeV9wYXRoXzMyX3NhdmVkIDAKK3NldCBvcmlnX2xkX2xpYnJhcnlfcGF0aF82NF9zYXZlZCAwCitzZXQgb3JpZ19keWxkX2xpYnJhcnlfcGF0aF9zYXZlZCAwCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHByb2Mgc2V0X2xkX2xpYnJhcnlfcGF0aF9lbnZfdmFycyB7IH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitwcm9jIHNldF9sZF9saWJyYXJ5X3BhdGhfZW52X3ZhcnMgeyB9IHsKKyAgZ2xvYmFsIGxkX2xpYnJhcnlfcGF0aAorICBnbG9iYWwgb3JpZ19lbnZpcm9ubWVudF9zYXZlZAorICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5X3BhdGhfc2F2ZWQKKyAgZ2xvYmFsIG9yaWdfbGRfcnVuX3BhdGhfc2F2ZWQKKyAgZ2xvYmFsIG9yaWdfc2hsaWJfcGF0aF9zYXZlZAorICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5bjMyX3BhdGhfc2F2ZWQKKyAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeTY0X3BhdGhfc2F2ZWQKKyAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoXzMyX3NhdmVkCisgIGdsb2JhbCBvcmlnX2xkX2xpYnJhcnlfcGF0aF82NF9zYXZlZAorICBnbG9iYWwgb3JpZ19keWxkX2xpYnJhcnlfcGF0aF9zYXZlZAorICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5X3BhdGgKKyAgZ2xvYmFsIG9yaWdfbGRfcnVuX3BhdGgKKyAgZ2xvYmFsIG9yaWdfc2hsaWJfcGF0aAorICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5bjMyX3BhdGgKKyAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeTY0X3BhdGgKKyAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoXzMyCisgIGdsb2JhbCBvcmlnX2xkX2xpYnJhcnlfcGF0aF82NAorICBnbG9iYWwgb3JpZ19keWxkX2xpYnJhcnlfcGF0aAorICBnbG9iYWwgR0NDX0VYRUNfUFJFRklYCisKKyAgIyBTZXQgdGhlIHJlbG9jYXRlZCBjb21waWxlciBwcmVmaXgsIGJ1dCBvbmx5IGlmIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgb25lLgorICBpZiB7IFtpbmZvIGV4aXN0cyBHQ0NfRVhFQ19QUkVGSVhdICYmICFbaW5mbyBleGlzdHMgZW52KEdDQ19FWEVDX1BSRUZJWCldIH0geworICAgIHNldGVudiBHQ0NfRVhFQ19QUkVGSVggIiRHQ0NfRVhFQ19QUkVGSVgiCisgIH0KKworICAjIFNldHRpbmcgdGhlIGxkIGxpYnJhcnkgcGF0aCBjYXVzZXMgdHJvdWJsZSB3aGVuIHRlc3RpbmcgY3Jvc3MtY29tcGlsZXJzLgorICBpZiB7IFtpc19yZW1vdGUgdGFyZ2V0XSB9IHsKKyAgICByZXR1cm4KKyAgfQorCisgIGlmIHsgJG9yaWdfZW52aXJvbm1lbnRfc2F2ZWQgPT0gMCB9IHsKKyAgICBnbG9iYWwgZW52CisKKyAgICBzZXQgb3JpZ19lbnZpcm9ubWVudF9zYXZlZCAxCisKKyAgICAjIFNhdmUgdGhlIG9yaWdpbmFsIGVudmlyb25tZW50LgorICAgIGlmIFtpbmZvIGV4aXN0cyBlbnYoTERfTElCUkFSWV9QQVRIKV0geworICAgICAgc2V0IG9yaWdfbGRfbGlicmFyeV9wYXRoICIkZW52KExEX0xJQlJBUllfUEFUSCkiCisgICAgICBzZXQgb3JpZ19sZF9saWJyYXJ5X3BhdGhfc2F2ZWQgMQorICAgIH0KKyAgICBpZiBbaW5mbyBleGlzdHMgZW52KExEX1JVTl9QQVRIKV0geworICAgICAgc2V0IG9yaWdfbGRfcnVuX3BhdGggIiRlbnYoTERfUlVOX1BBVEgpIgorICAgICAgc2V0IG9yaWdfbGRfcnVuX3BhdGhfc2F2ZWQgMQorICAgIH0KKyAgICBpZiBbaW5mbyBleGlzdHMgZW52KFNITElCX1BBVEgpXSB7CisgICAgICBzZXQgb3JpZ19zaGxpYl9wYXRoICIkZW52KFNITElCX1BBVEgpIgorICAgICAgc2V0IG9yaWdfc2hsaWJfcGF0aF9zYXZlZCAxCisgICAgfQorICAgIGlmIFtpbmZvIGV4aXN0cyBlbnYoTERfTElCUkFSWU4zMl9QQVRIKV0geworICAgICAgc2V0IG9yaWdfbGRfbGlicmFyeW4zMl9wYXRoICIkZW52KExEX0xJQlJBUllOMzJfUEFUSCkiCisgICAgICBzZXQgb3JpZ19sZF9saWJyYXJ5bjMyX3BhdGhfc2F2ZWQgMQorICAgIH0KKyAgICBpZiBbaW5mbyBleGlzdHMgZW52KExEX0xJQlJBUlk2NF9QQVRIKV0geworICAgICAgc2V0IG9yaWdfbGRfbGlicmFyeTY0X3BhdGggIiRlbnYoTERfTElCUkFSWTY0X1BBVEgpIgorICAgICAgc2V0IG9yaWdfbGRfbGlicmFyeTY0X3BhdGhfc2F2ZWQgMQorICAgIH0KKyAgICBpZiBbaW5mbyBleGlzdHMgZW52KExEX0xJQlJBUllfUEFUSF8zMildIHsKKyAgICAgIHNldCBvcmlnX2xkX2xpYnJhcnlfcGF0aF8zMiAiJGVudihMRF9MSUJSQVJZX1BBVEhfMzIpIgorICAgICAgc2V0IG9yaWdfbGRfbGlicmFyeV9wYXRoXzMyX3NhdmVkIDEKKyAgICB9CisgICAgaWYgW2luZm8gZXhpc3RzIGVudihMRF9MSUJSQVJZX1BBVEhfNjQpXSB7CisgICAgICBzZXQgb3JpZ19sZF9saWJyYXJ5X3BhdGhfNjQgIiRlbnYoTERfTElCUkFSWV9QQVRIXzY0KSIKKyAgICAgIHNldCBvcmlnX2xkX2xpYnJhcnlfcGF0aF82NF9zYXZlZCAxCisgICAgfQorICAgIGlmIFtpbmZvIGV4aXN0cyBlbnYoRFlMRF9MSUJSQVJZX1BBVEgpXSB7CisgICAgICBzZXQgb3JpZ19keWxkX2xpYnJhcnlfcGF0aCAiJGVudihEWUxEX0xJQlJBUllfUEFUSCkiCisgICAgICBzZXQgb3JpZ19keWxkX2xpYnJhcnlfcGF0aF9zYXZlZCAxCisgICAgfQorICB9CisKKyAgIyBXZSBuZWVkIHRvIHNldCBsZCBsaWJyYXJ5IHBhdGggaW4gdGhlIGVudmlyb25tZW50LiAgQ3VycmVudGx5LAorICAjIHVuaXguZXhwIGRvZXNuJ3Qgc2V0IHRoZSBlbnZpcm9ubWVudCBjb3JyZWN0bHkgZm9yIGFsbCBzeXN0ZW1zLgorICAjIEl0IG9ubHkgc2V0cyBTSExJQl9QQVRIIGFuZCBMRF9MSUJSQVJZX1BBVEggd2hlbiBpdCBleGVjdXRlcyBhCisgICMgcHJvZ3JhbS4gIFdlIGFsc28gbmVlZCB0aGUgZW52aXJvbm1lbnQgc2V0IGZvciBjb21waWxhdGlvbnMsIGV0Yy4KKyAgIworICAjIE9uIElSSVggNiwgd2UgaGF2ZSB0byBzZXQgdmFyaWFibGVzIGFraW4gdG8gTERfTElCUkFSWV9QQVRILCBidXQKKyAgIyBjYWxsZWQgTERfTElCUkFSWU4zMl9QQVRIIChmb3IgdGhlIE4zMiBBQkkpIGFuZCBMRF9MSUJSQVJZNjRfUEFUSAorICAjIChmb3IgdGhlIDY0LWJpdCBBQkkpLiAgVGhlIHNhbWUgYXBwbGllcyB0byBEYXJ3aW4gKERZTERfTElCUkFSWV9QQVRIKSwKKyAgIyBTb2xhcmlzIDMyIGJpdCAoTERfTElCUkFSWV9QQVRIXzMyKSwgU29sYXJpcyA2NCBiaXQgKExEX0xJQlJBUllfUEFUSF82NCksCisgICMgYW5kIEhQLVVYIChTSExJQl9QQVRIKS4gIEluIHNvbWUgY2FzZXMsIHRoZSB2YXJpYWJsZXMgYXJlIGluZGVwZW5kZW50CisgICMgb2YgTERfTElCUkFSWV9QQVRILCBhbmQgaW4gb3RoZXIgY2FzZXMgTERfTElCUkFSWV9QQVRIIGlzIHVzZWQgaWYgdGhlCisgICMgdmFyaWFibGUgaXMgbm90IGRlZmluZWQuCisgICMKKyAgIyBEb2luZyB0aGlzIGlzIHNvbWV3aGF0IG9mIGEgaGFjayBhcyBsZF9saWJyYXJ5X3BhdGggZ2V0cyByZXBlYXRlZCBpbgorICAjIFNITElCX1BBVEggYW5kIExEX0xJQlJBUllfUEFUSCB3aGVuIHVuaXhfbG9hZCBzZXRzIHRoZXNlIHZhcmlhYmxlcy4KKyAgaWYgeyAkb3JpZ19sZF9saWJyYXJ5X3BhdGhfc2F2ZWQgfSB7CisgICAgc2V0ZW52IExEX0xJQlJBUllfUEFUSCAiJGxkX2xpYnJhcnlfcGF0aDokb3JpZ19sZF9saWJyYXJ5X3BhdGgiCisgIH0gZWxzZSB7CisgICAgc2V0ZW52IExEX0xJQlJBUllfUEFUSCAiJGxkX2xpYnJhcnlfcGF0aCIKKyAgfQorICBpZiB7ICRvcmlnX2xkX3J1bl9wYXRoX3NhdmVkIH0geworICAgIHNldGVudiBMRF9SVU5fUEFUSCAiJGxkX2xpYnJhcnlfcGF0aDokb3JpZ19sZF9ydW5fcGF0aCIKKyAgfSBlbHNlIHsKKyAgICBzZXRlbnYgTERfUlVOX1BBVEggIiRsZF9saWJyYXJ5X3BhdGgiCisgIH0KKyAgIyBUaGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBkeW5hbWljIHBhdGggc2VhcmNoIGZvciA2NC1iaXQKKyAgIyBIUC1VWCBleGVjdXRhYmxlcyBzZWFyY2hlcyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIFNITElCX1BBVEguCisgICMgTERfTElCUkFSWV9QQVRIIGlzbid0IHVzZWQgZm9yIDMyLWJpdCBleGVjdXRhYmxlcy4gIFRodXMsIHdlCisgICMgc2V0IExEX0xJQlJBUllfUEFUSCBhbmQgU0hMSUJfUEFUSCBhcyBpZiB0aGV5IHdlcmUgaW5kZXBlbmRlbnQuCisgIGlmIHsgJG9yaWdfc2hsaWJfcGF0aF9zYXZlZCB9IHsKKyAgICBzZXRlbnYgU0hMSUJfUEFUSCAiJGxkX2xpYnJhcnlfcGF0aDokb3JpZ19zaGxpYl9wYXRoIgorICB9IGVsc2UgeworICAgIHNldGVudiBTSExJQl9QQVRIICIkbGRfbGlicmFyeV9wYXRoIgorICB9CisgIGlmIHsgJG9yaWdfbGRfbGlicmFyeW4zMl9wYXRoX3NhdmVkIH0geworICAgIHNldGVudiBMRF9MSUJSQVJZTjMyX1BBVEggIiRsZF9saWJyYXJ5X3BhdGg6JG9yaWdfbGRfbGlicmFyeW4zMl9wYXRoIgorICB9IGVsc2VpZiB7ICRvcmlnX2xkX2xpYnJhcnlfcGF0aF9zYXZlZCB9IHsKKyAgICBzZXRlbnYgTERfTElCUkFSWU4zMl9QQVRIICIkbGRfbGlicmFyeV9wYXRoOiRvcmlnX2xkX2xpYnJhcnlfcGF0aCIKKyAgfSBlbHNlIHsKKyAgICBzZXRlbnYgTERfTElCUkFSWU4zMl9QQVRIICIkbGRfbGlicmFyeV9wYXRoIgorICB9CisgIGlmIHsgJG9yaWdfbGRfbGlicmFyeTY0X3BhdGhfc2F2ZWQgfSB7CisgICAgc2V0ZW52IExEX0xJQlJBUlk2NF9QQVRIICIkbGRfbGlicmFyeV9wYXRoOiRvcmlnX2xkX2xpYnJhcnk2NF9wYXRoIgorICB9IGVsc2VpZiB7ICRvcmlnX2xkX2xpYnJhcnlfcGF0aF9zYXZlZCB9IHsKKyAgICBzZXRlbnYgTERfTElCUkFSWTY0X1BBVEggIiRsZF9saWJyYXJ5X3BhdGg6JG9yaWdfbGRfbGlicmFyeV9wYXRoIgorICB9IGVsc2UgeworICAgIHNldGVudiBMRF9MSUJSQVJZNjRfUEFUSCAiJGxkX2xpYnJhcnlfcGF0aCIKKyAgfQorICBpZiB7ICRvcmlnX2xkX2xpYnJhcnlfcGF0aF8zMl9zYXZlZCB9IHsKKyAgICBzZXRlbnYgTERfTElCUkFSWV9QQVRIXzMyICIkbGRfbGlicmFyeV9wYXRoOiRvcmlnX2xkX2xpYnJhcnlfcGF0aF8zMiIKKyAgfSBlbHNlaWYgeyAkb3JpZ19sZF9saWJyYXJ5X3BhdGhfc2F2ZWQgfSB7CisgICAgc2V0ZW52IExEX0xJQlJBUllfUEFUSF8zMiAiJGxkX2xpYnJhcnlfcGF0aDokb3JpZ19sZF9saWJyYXJ5X3BhdGgiCisgIH0gZWxzZSB7CisgICAgc2V0ZW52IExEX0xJQlJBUllfUEFUSF8zMiAiJGxkX2xpYnJhcnlfcGF0aCIKKyAgfQorICBpZiB7ICRvcmlnX2xkX2xpYnJhcnlfcGF0aF82NF9zYXZlZCB9IHsKKyAgICBzZXRlbnYgTERfTElCUkFSWV9QQVRIXzY0ICIkbGRfbGlicmFyeV9wYXRoOiRvcmlnX2xkX2xpYnJhcnlfcGF0aF82NCIKKyAgfSBlbHNlaWYgeyAkb3JpZ19sZF9saWJyYXJ5X3BhdGhfc2F2ZWQgfSB7CisgICAgc2V0ZW52IExEX0xJQlJBUllfUEFUSF82NCAiJGxkX2xpYnJhcnlfcGF0aDokb3JpZ19sZF9saWJyYXJ5X3BhdGgiCisgIH0gZWxzZSB7CisgICAgc2V0ZW52IExEX0xJQlJBUllfUEFUSF82NCAiJGxkX2xpYnJhcnlfcGF0aCIKKyAgfQorICBpZiB7ICRvcmlnX2R5bGRfbGlicmFyeV9wYXRoX3NhdmVkIH0geworICAgIHNldGVudiBEWUxEX0xJQlJBUllfUEFUSCAiJGxkX2xpYnJhcnlfcGF0aDokb3JpZ19keWxkX2xpYnJhcnlfcGF0aCIKKyAgfSBlbHNlIHsKKyAgICBzZXRlbnYgRFlMRF9MSUJSQVJZX1BBVEggIiRsZF9saWJyYXJ5X3BhdGgiCisgIH0KKworICB2ZXJib3NlIC1sb2cgInNldF9sZF9saWJyYXJ5X3BhdGhfZW52X3ZhcnM6IGxkX2xpYnJhcnlfcGF0aD0kbGRfbGlicmFyeV9wYXRoIgorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcHJvYyByZXN0b3JlX2xkX2xpYnJhcnlfcGF0aF9lbnZfdmFycyB7IH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitwcm9jIHJlc3RvcmVfbGRfbGlicmFyeV9wYXRoX2Vudl92YXJzIHsgfSB7CisgIGdsb2JhbCBvcmlnX2Vudmlyb25tZW50X3NhdmVkCisgIGdsb2JhbCBvcmlnX2xkX2xpYnJhcnlfcGF0aF9zYXZlZAorICBnbG9iYWwgb3JpZ19sZF9ydW5fcGF0aF9zYXZlZAorICBnbG9iYWwgb3JpZ19zaGxpYl9wYXRoX3NhdmVkCisgIGdsb2JhbCBvcmlnX2xkX2xpYnJhcnluMzJfcGF0aF9zYXZlZAorICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5NjRfcGF0aF9zYXZlZAorICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5X3BhdGhfMzJfc2F2ZWQKKyAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoXzY0X3NhdmVkCisgIGdsb2JhbCBvcmlnX2R5bGRfbGlicmFyeV9wYXRoX3NhdmVkCisgIGdsb2JhbCBvcmlnX2xkX2xpYnJhcnlfcGF0aAorICBnbG9iYWwgb3JpZ19sZF9ydW5fcGF0aAorICBnbG9iYWwgb3JpZ19zaGxpYl9wYXRoCisgIGdsb2JhbCBvcmlnX2xkX2xpYnJhcnluMzJfcGF0aAorICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5NjRfcGF0aAorICBnbG9iYWwgb3JpZ19sZF9saWJyYXJ5X3BhdGhfMzIKKyAgZ2xvYmFsIG9yaWdfbGRfbGlicmFyeV9wYXRoXzY0CisgIGdsb2JhbCBvcmlnX2R5bGRfbGlicmFyeV9wYXRoCisKKyAgaWYgeyAkb3JpZ19lbnZpcm9ubWVudF9zYXZlZCA9PSAwIH0geworICAgIHJldHVybgorICB9CisKKyAgaWYgeyAkb3JpZ19sZF9saWJyYXJ5X3BhdGhfc2F2ZWQgfSB7CisgICAgc2V0ZW52IExEX0xJQlJBUllfUEFUSCAiJG9yaWdfbGRfbGlicmFyeV9wYXRoIgorICB9IGVsc2VpZiBbaW5mbyBleGlzdHMgZW52KExEX0xJQlJBUllfUEFUSCldIHsKKyAgICB1bnNldGVudiBMRF9MSUJSQVJZX1BBVEgKKyAgfQorICBpZiB7ICRvcmlnX2xkX3J1bl9wYXRoX3NhdmVkIH0geworICAgIHNldGVudiBMRF9SVU5fUEFUSCAiJG9yaWdfbGRfcnVuX3BhdGgiCisgIH0gZWxzZWlmIFtpbmZvIGV4aXN0cyBlbnYoTERfUlVOX1BBVEgpXSB7CisgICAgdW5zZXRlbnYgTERfUlVOX1BBVEgKKyAgfQorICBpZiB7ICRvcmlnX3NobGliX3BhdGhfc2F2ZWQgfSB7CisgICAgc2V0ZW52IFNITElCX1BBVEggIiRvcmlnX3NobGliX3BhdGgiCisgIH0gZWxzZWlmIFtpbmZvIGV4aXN0cyBlbnYoU0hMSUJfUEFUSCldIHsKKyAgICB1bnNldGVudiBTSExJQl9QQVRICisgIH0KKyAgaWYgeyAkb3JpZ19sZF9saWJyYXJ5bjMyX3BhdGhfc2F2ZWQgfSB7CisgICAgc2V0ZW52IExEX0xJQlJBUllOMzJfUEFUSCAiJG9yaWdfbGRfbGlicmFyeW4zMl9wYXRoIgorICB9IGVsc2VpZiBbaW5mbyBleGlzdHMgZW52KExEX0xJQlJBUllOMzJfUEFUSCldIHsKKyAgICB1bnNldGVudiBMRF9MSUJSQVJZTjMyX1BBVEgKKyAgfQorICBpZiB7ICRvcmlnX2xkX2xpYnJhcnk2NF9wYXRoX3NhdmVkIH0geworICAgIHNldGVudiBMRF9MSUJSQVJZNjRfUEFUSCAiJG9yaWdfbGRfbGlicmFyeTY0X3BhdGgiCisgIH0gZWxzZWlmIFtpbmZvIGV4aXN0cyBlbnYoTERfTElCUkFSWTY0X1BBVEgpXSB7CisgICAgdW5zZXRlbnYgTERfTElCUkFSWTY0X1BBVEgKKyAgfQorICBpZiB7ICRvcmlnX2xkX2xpYnJhcnlfcGF0aF8zMl9zYXZlZCB9IHsKKyAgICBzZXRlbnYgTERfTElCUkFSWV9QQVRIXzMyICIkb3JpZ19sZF9saWJyYXJ5X3BhdGhfMzIiCisgIH0gZWxzZWlmIFtpbmZvIGV4aXN0cyBlbnYoTERfTElCUkFSWV9QQVRIXzMyKV0geworICAgIHVuc2V0ZW52IExEX0xJQlJBUllfUEFUSF8zMgorICB9CisgIGlmIHsgJG9yaWdfbGRfbGlicmFyeV9wYXRoXzY0X3NhdmVkIH0geworICAgIHNldGVudiBMRF9MSUJSQVJZX1BBVEhfNjQgIiRvcmlnX2xkX2xpYnJhcnlfcGF0aF82NCIKKyAgfSBlbHNlaWYgW2luZm8gZXhpc3RzIGVudihMRF9MSUJSQVJZX1BBVEhfNjQpXSB7CisgICAgdW5zZXRlbnYgTERfTElCUkFSWV9QQVRIXzY0CisgIH0KKyAgaWYgeyAkb3JpZ19keWxkX2xpYnJhcnlfcGF0aF9zYXZlZCB9IHsKKyAgICBzZXRlbnYgRFlMRF9MSUJSQVJZX1BBVEggIiRvcmlnX2R5bGRfbGlicmFyeV9wYXRoIgorICB9IGVsc2VpZiBbaW5mbyBleGlzdHMgZW52KERZTERfTElCUkFSWV9QQVRIKV0geworICAgIHVuc2V0ZW52IERZTERfTElCUkFSWV9QQVRICisgIH0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHByb2MgZ2V0X3NobGliX2V4dGVuc2lvbiB7IH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitwcm9jIGdldF9zaGxpYl9leHRlbnNpb24geyB9IHsKKyAgICBnbG9iYWwgc2hsaWJfZXh0CisKKyAgICBpZiB7IFsgaXN0YXJnZXQgKi0qLWRhcndpbiogXSB9IHsKKwlzZXQgc2hsaWJfZXh0ICJkeWxpYiIKKyAgICB9IGVsc2VpZiB7IFsgaXN0YXJnZXQgKi0qLWN5Z3dpbiogXSB8fCBbIGlzdGFyZ2V0ICotKi1taW5ndyogXSB9IHsKKwlzZXQgc2hsaWJfZXh0ICJkbGwiCisgICAgfSBlbHNlaWYgeyBbIGlzdGFyZ2V0IGhwcGEqLSotaHB1eCogXSB9IHsKKwlzZXQgc2hsaWJfZXh0ICJzbCIKKyAgICB9IGVsc2UgeworCXNldCBzaGxpYl9leHQgInNvIgorICAgIH0KKyAgICByZXR1cm4gJHNobGliX2V4dAorfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYi93cmFwcGVyLmV4cCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliL3dyYXBwZXIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNWFlNDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYi93cmFwcGVyLmV4cApAQCAtMCwwICsxLDQ1IEBACisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKyMgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIFRoaXMgZmlsZSBjb250YWlucyBHQ0Mtc3BlY2lmaWNzIGZvciBzdGF0dXMgd3JhcHBlcnMgZm9yIHRlc3QgcHJvZ3JhbXMuCisKKyMgJHt0b29sfV9tYXliZV9idWlsZF93cmFwcGVyIC0tIEJ1aWxkIHdyYXBwZXIgb2JqZWN0IGlmIHRoZSB0YXJnZXQKKyMgbmVlZHMgaXQuICBGSUxFTkFNRSBpcyB0aGUgcGF0aCB0byB0aGUgd3JhcHBlciBmaWxlLiAgSWYgdGhlcmUgYXJlCisjIGFkZGl0aW9uYWwgYXJndW1lbnRzLCB0aGV5IGFyZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBwcm92aWRlIHRvCisjIHRoZSBjb21waWxlciB3aGVuIGNvbXBpbGluZyBGSUxFTkFNRS4KKworcHJvYyAke3Rvb2x9X21heWJlX2J1aWxkX3dyYXBwZXIgeyBmaWxlbmFtZSBhcmdzIH0geworICAgIGdsb2JhbCBnbHVlZmlsZSB3cmFwX2ZsYWdzCisKKyAgICBpZiB7IFt0YXJnZXRfaW5mbyBuZWVkc19zdGF0dXNfd3JhcHBlcl0gIT0gIiIgXAorIAkgJiYgW3RhcmdldF9pbmZvIG5lZWRzX3N0YXR1c193cmFwcGVyXSAhPSAiMCIgXAorCSAmJiAhW2luZm8gZXhpc3RzIGdsdWVmaWxlXSB9IHsKKwlzZXQgc2F2ZWRfd3JhcF9jb21waWxlX2ZsYWdzIFt0YXJnZXRfaW5mbyB3cmFwX2NvbXBpbGVfZmxhZ3NdCisJc2V0IGZsYWdzIFtqb2luICRhcmdzICIgIl0KKwkjIFRoZSB3cmFwcGVyIGNvZGUgbWF5IGNvbnRhaW4gY29kZSB0aGF0IGdjYyBvYmplY3RzIG9uLiAgVGhpcworCSMgYmVjYW1lIHRydWUgZm9yIGRlamFnbnUtMS40LjQuICBUaGUgc2V0IG9mIHdhcm5pbmdzIGFuZCBjb2RlCisJIyB0aGF0IGdjYyBvYmplY3RzIG9uIG1heSBjaGFuZ2UsIHNvIGp1c3QgbWFrZSBzdXJlIC13IGlzIGFsd2F5cworCSMgcGFzc2VkIHRvIHR1cm4gb2ZmIGFsbCB3YXJuaW5ncy4KKwlzZXRfY3VycnRhcmdldF9pbmZvIHdyYXBfY29tcGlsZV9mbGFncyBcCisJICAgICIkc2F2ZWRfd3JhcF9jb21waWxlX2ZsYWdzIC13ICRmbGFncyIKKwlzZXQgcmVzdWx0IFtidWlsZF93cmFwcGVyICRmaWxlbmFtZV0KKwlzZXRfY3VycnRhcmdldF9pbmZvIHdyYXBfY29tcGlsZV9mbGFncyAiJHNhdmVkX3dyYXBfY29tcGlsZV9mbGFncyIKKwlpZiB7ICRyZXN1bHQgIT0gIiIgfSB7CisJICAgIHNldCBnbHVlZmlsZSBbbGluZGV4ICRyZXN1bHQgMF0KKwkgICAgc2V0IHdyYXBfZmxhZ3MgW2xpbmRleCAkcmVzdWx0IDFdCisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2FsbC5leHAgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2NhbGwuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWNkODEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2NhbGwuZXhwCkBAIC0wLDAgKzEsMzIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisjIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworZGctaW5pdAorbGliZmZpLWluaXQKKworZ2xvYmFsIHNyY2RpciBzdWJkaXIKKworZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyouXFtjU1xdXV0gIi1PMCAtVyAtV2FsbCIgIiIKK2RnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItTzIiICIiCitkZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5cW2NTXF1dXSAiLU8zIiAiIgorZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyouXFtjU1xdXV0gIi1PcyIgIiIKK2RnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLlxbY1NcXV1dICItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiICIiCisKK2RnLWZpbmlzaAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgdGNsLWluZGVudC1sZXZlbDo0CisjIEVuZDoKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTc5ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMC5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIEFyZWE6CWNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgbXVsdGlwbGUgdmFsdWVzIHBhc3NpbmcgZnJvbSBkaWZmZXJlbnQgdHlwZS4KKwkJQWxzbywgZXhjZWVkIHRoZSBsaW1pdCBvZiBncHIgYW5kIGZwciByZWdpc3RlcnMgb24gUG93ZXJQQworCQlEYXJ3aW4uCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKworCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3N0YXRpYyB2b2lkCitjbG9zdXJlX3Rlc3RfZm4wKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJIHZvaWQqIHVzZXJkYXRhKQoreworICAqKGZmaV9hcmcqKXJlc3AgPQorICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzBdICsgKGludCkoKihpbnQgKilhcmdzWzFdKSArCisgICAgKGludCkoKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzJdKSArIChpbnQpKihpbnQgKilhcmdzWzNdICsKKyAgICAoaW50KSgqKHNpZ25lZCBzaG9ydCAqKWFyZ3NbNF0pICsKKyAgICAoaW50KSgqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbNV0pICsKKyAgICAoaW50KSooaW50ICopYXJnc1s2XSArIChpbnQpKCooaW50ICopYXJnc1s3XSkgKworICAgIChpbnQpKCooZG91YmxlICopYXJnc1s4XSkgKyAoaW50KSooaW50ICopYXJnc1s5XSArCisgICAgKGludCkoKihpbnQgKilhcmdzWzEwXSkgKyAoaW50KSgqKGZsb2F0ICopYXJnc1sxMV0pICsKKyAgICAoaW50KSooaW50ICopYXJnc1sxMl0gKyAoaW50KSgqKGludCAqKWFyZ3NbMTNdKSArCisgICAgKGludCkoKihpbnQgKilhcmdzWzE0XSkgKyAgKihpbnQgKilhcmdzWzE1XSArIChpbnRwdHJfdCl1c2VyZGF0YTsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkOiAlZFxuIiwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMF0sIChpbnQpKCooaW50ICopYXJnc1sxXSksCisJIChpbnQpKCoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1syXSksCisJIChpbnQpKihpbnQgKilhcmdzWzNdLCAoaW50KSgqKHNpZ25lZCBzaG9ydCAqKWFyZ3NbNF0pLAorCSAoaW50KSgqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbNV0pLAorCSAoaW50KSooaW50ICopYXJnc1s2XSwgKGludCkoKihpbnQgKilhcmdzWzddKSwKKwkgKGludCkoKihkb3VibGUgKilhcmdzWzhdKSwgKGludCkqKGludCAqKWFyZ3NbOV0sCisJIChpbnQpKCooaW50ICopYXJnc1sxMF0pLCAoaW50KSgqKGZsb2F0ICopYXJnc1sxMV0pLAorCSAoaW50KSooaW50ICopYXJnc1sxMl0sIChpbnQpKCooaW50ICopYXJnc1sxM10pLAorCSAoaW50KSgqKGludCAqKWFyZ3NbMTRdKSwqKGludCAqKWFyZ3NbMTVdLAorCSAoaW50KShpbnRwdHJfdCl1c2VyZGF0YSwgKGludCkqKGZmaV9hcmcgKilyZXNwKTsKKworfQorCit0eXBlZGVmIGludCAoKmNsb3N1cmVfdGVzdF90eXBlMCkodW5zaWduZWQgbG9uZyBsb25nLCBpbnQsIHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCQkgIGludCwgc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nIGxvbmcsIGludCwKKwkJCQkgIGludCwgZG91YmxlLCBpbnQsIGludCwgZmxvYXQsIGludCwgaW50LAorCQkJCSAgaW50LCBpbnQpOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKiBjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1sxN107CisgIGludCByZXM7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1syXSA9ICZmZmlfdHlwZV91aW50NjQ7CisgIGNsX2FyZ190eXBlc1szXSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbNF0gPSAmZmZpX3R5cGVfc3Nob3J0OworICBjbF9hcmdfdHlwZXNbNV0gPSAmZmZpX3R5cGVfdWludDY0OworICBjbF9hcmdfdHlwZXNbNl0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzddID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1s4XSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsX2FyZ190eXBlc1s5XSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTBdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsX2FyZ190eXBlc1sxMl0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzEzXSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTRdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxNV0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzE2XSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDE2LAorCQkgICAgICZmZmlfdHlwZV9zaW50LCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbG9zdXJlX3Rlc3RfZm4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAzIC8qIHVzZXJkYXRhICovLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlcyA9ICgqKChjbG9zdXJlX3Rlc3RfdHlwZTApY29kZSkpCisgICAgKDFMTCwgMiwgM0xMLCA0LCAxMjcsIDQyOUxMLCA3LCA4LCA5LjUsIDEwLCAxMSwgMTIsIDEzLAorICAgICAxOSwgMjEsIDEpOworICAvKiB7IGRnLW91dHB1dCAiMSAyIDMgNCAxMjcgNDI5IDcgOCA5IDEwIDExIDEyIDEzIDE5IDIxIDEgMzogNjgwIiB9ICovCisgIHByaW50ZigicmVzOiAlZFxuIixyZXMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDY4MCIgfSAqLworICAgICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjMxNzMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4xLmMKQEAgLTAsMCArMSw4MSBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsLgorICAgUHVycG9zZToJQ2hlY2sgbXVsdGlwbGUgdmFsdWVzIHBhc3NpbmcgZnJvbSBkaWZmZXJlbnQgdHlwZS4KKwkJQWxzbywgZXhjZWVkIHRoZSBsaW1pdCBvZiBncHIgYW5kIGZwciByZWdpc3RlcnMgb24gUG93ZXJQQworCQlEYXJ3aW4uCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKKworc3RhdGljIHZvaWQgY2xvc3VyZV90ZXN0X2ZuMShmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCQkgICAgIHZvaWQqIHVzZXJkYXRhKQoreworICAqKGZmaV9hcmcqKXJlc3AgPQorICAgIChpbnQpKihmbG9hdCAqKWFyZ3NbMF0gKyhpbnQpKCooZmxvYXQgKilhcmdzWzFdKSArCisgICAgKGludCkoKihmbG9hdCAqKWFyZ3NbMl0pICsgKGludCkqKGZsb2F0ICopYXJnc1szXSArCisgICAgKGludCkoKihzaWduZWQgc2hvcnQgKilhcmdzWzRdKSArIChpbnQpKCooZmxvYXQgKilhcmdzWzVdKSArCisgICAgKGludCkqKGZsb2F0ICopYXJnc1s2XSArIChpbnQpKCooaW50ICopYXJnc1s3XSkgKworICAgIChpbnQpKCooZG91YmxlKilhcmdzWzhdKSArIChpbnQpKihpbnQgKilhcmdzWzldICsKKyAgICAoaW50KSgqKGludCAqKWFyZ3NbMTBdKSArIChpbnQpKCooZmxvYXQgKilhcmdzWzExXSkgKworICAgIChpbnQpKihpbnQgKilhcmdzWzEyXSArIChpbnQpKCooaW50ICopYXJnc1sxM10pICsKKyAgICAoaW50KSgqKGludCAqKWFyZ3NbMTRdKSArICooaW50ICopYXJnc1sxNV0gKyAoaW50cHRyX3QpdXNlcmRhdGE7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZDogJWRcbiIsCisJIChpbnQpKihmbG9hdCAqKWFyZ3NbMF0sIChpbnQpKCooZmxvYXQgKilhcmdzWzFdKSwKKwkgKGludCkoKihmbG9hdCAqKWFyZ3NbMl0pLCAoaW50KSooZmxvYXQgKilhcmdzWzNdLAorCSAoaW50KSgqKHNpZ25lZCBzaG9ydCAqKWFyZ3NbNF0pLCAoaW50KSgqKGZsb2F0ICopYXJnc1s1XSksCisJIChpbnQpKihmbG9hdCAqKWFyZ3NbNl0sIChpbnQpKCooaW50ICopYXJnc1s3XSksCisJIChpbnQpKCooZG91YmxlICopYXJnc1s4XSksIChpbnQpKihpbnQgKilhcmdzWzldLAorCSAoaW50KSgqKGludCAqKWFyZ3NbMTBdKSwgKGludCkoKihmbG9hdCAqKWFyZ3NbMTFdKSwKKwkgKGludCkqKGludCAqKWFyZ3NbMTJdLCAoaW50KSgqKGludCAqKWFyZ3NbMTNdKSwKKwkgKGludCkoKihpbnQgKilhcmdzWzE0XSksICooaW50ICopYXJnc1sxNV0sCisJIChpbnQpKGludHB0cl90KXVzZXJkYXRhLCAoaW50KSooZmZpX2FyZyAqKXJlc3ApOworfQorCit0eXBlZGVmIGludCAoKmNsb3N1cmVfdGVzdF90eXBlMSkoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIHNpZ25lZCBzaG9ydCwKKwkJCQkgIGZsb2F0LCBmbG9hdCwgaW50LCBkb3VibGUsIGludCwgaW50LCBmbG9hdCwKKwkJCQkgIGludCwgaW50LCBpbnQsIGludCk7CitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlICogY2xfYXJnX3R5cGVzWzE3XTsKKyAgaW50IHJlczsKKworICBjbF9hcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsX2FyZ190eXBlc1sxXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbF9hcmdfdHlwZXNbM10gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsX2FyZ190eXBlc1s0XSA9ICZmZmlfdHlwZV9zc2hvcnQ7CisgIGNsX2FyZ190eXBlc1s1XSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzZdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbF9hcmdfdHlwZXNbN10gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzhdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzldID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzExXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzEyXSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTNdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxNF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzE1XSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTZdID0gTlVMTDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMTYsCisJCSAgICAgJmZmaV90eXBlX3NpbnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsb3N1cmVfdGVzdF9mbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIDMgLyogdXNlcmRhdGEgKi8sIGNvZGUpICA9PSBGRklfT0spOworCisgIHJlcyA9ICgqKChjbG9zdXJlX3Rlc3RfdHlwZTEpY29kZSkpCisgICAgKDEuMSwgMi4yLCAzLjMsIDQuNCwgMTI3LCA1LjUsIDYuNiwgOCwgOSwgMTAsIDExLCAxMi4wLCAxMywKKyAgICAgMTksIDIxLCAxKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEgMiAzIDQgMTI3IDUgNiA4IDkgMTAgMTEgMTIgMTMgMTkgMjEgMSAzOiAyNTUiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMjU1IiB9ICovCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmZjlkOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjIuYwpAQCAtMCwwICsxLDgxIEBACisvKiBBcmVhOgljbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIG11bHRpcGxlIHZhbHVlcyBwYXNzaW5nIGZyb20gZGlmZmVyZW50IHR5cGUuCisJCUFsc28sIGV4Y2VlZCB0aGUgbGltaXQgb2YgZ3ByIGFuZCBmcHIgcmVnaXN0ZXJzIG9uIFBvd2VyUEMKKwkJRGFyd2luLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwODI4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZCBjbG9zdXJlX3Rlc3RfZm4yKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJCSAgICAgdm9pZCogdXNlcmRhdGEpCit7CisgICooZmZpX2FyZyopcmVzcCA9CisgICAgKGludCkqKGRvdWJsZSAqKWFyZ3NbMF0gKyhpbnQpKCooZG91YmxlICopYXJnc1sxXSkgKworICAgIChpbnQpKCooZG91YmxlICopYXJnc1syXSkgKyAoaW50KSooZG91YmxlICopYXJnc1szXSArCisgICAgKGludCkoKihzaWduZWQgc2hvcnQgKilhcmdzWzRdKSArIChpbnQpKCooZG91YmxlICopYXJnc1s1XSkgKworICAgIChpbnQpKihkb3VibGUgKilhcmdzWzZdICsgKGludCkoKihpbnQgKilhcmdzWzddKSArCisgICAgKGludCkoKihkb3VibGUgKilhcmdzWzhdKSArIChpbnQpKihpbnQgKilhcmdzWzldICsKKyAgICAoaW50KSgqKGludCAqKWFyZ3NbMTBdKSArIChpbnQpKCooZmxvYXQgKilhcmdzWzExXSkgKworICAgIChpbnQpKihpbnQgKilhcmdzWzEyXSArIChpbnQpKCooZmxvYXQgKilhcmdzWzEzXSkgKworICAgIChpbnQpKCooaW50ICopYXJnc1sxNF0pICsgKihpbnQgKilhcmdzWzE1XSArIChpbnRwdHJfdCl1c2VyZGF0YTsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkOiAlZFxuIiwKKwkgKGludCkqKGRvdWJsZSAqKWFyZ3NbMF0sIChpbnQpKCooZG91YmxlICopYXJnc1sxXSksCisJIChpbnQpKCooZG91YmxlICopYXJnc1syXSksIChpbnQpKihkb3VibGUgKilhcmdzWzNdLAorCSAoaW50KSgqKHNpZ25lZCBzaG9ydCAqKWFyZ3NbNF0pLCAoaW50KSgqKGRvdWJsZSAqKWFyZ3NbNV0pLAorCSAoaW50KSooZG91YmxlICopYXJnc1s2XSwgKGludCkoKihpbnQgKilhcmdzWzddKSwKKwkgKGludCkoKihkb3VibGUqKWFyZ3NbOF0pLCAoaW50KSooaW50ICopYXJnc1s5XSwKKwkgKGludCkoKihpbnQgKilhcmdzWzEwXSksIChpbnQpKCooZmxvYXQgKilhcmdzWzExXSksCisJIChpbnQpKihpbnQgKilhcmdzWzEyXSwgKGludCkoKihmbG9hdCAqKWFyZ3NbMTNdKSwKKwkgKGludCkoKihpbnQgKilhcmdzWzE0XSksICooaW50ICopYXJnc1sxNV0sIChpbnQpKGludHB0cl90KXVzZXJkYXRhLAorCSAoaW50KSooZmZpX2FyZyAqKXJlc3ApOworfQorCit0eXBlZGVmIGludCAoKmNsb3N1cmVfdGVzdF90eXBlMikoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBzaWduZWQgc2hvcnQsCisJCQkJICBkb3VibGUsIGRvdWJsZSwgaW50LCBkb3VibGUsIGludCwgaW50LCBmbG9hdCwKKwkJCQkgIGludCwgZmxvYXQsIGludCwgaW50KTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1sxN107CisgIGludCByZXM7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzNdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzRdID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgY2xfYXJnX3R5cGVzWzVdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzZdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzddID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1s4XSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsX2FyZ190eXBlc1s5XSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTBdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsX2FyZ190eXBlc1sxMl0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzEzXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzE0XSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTVdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxNl0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxNiwKKwkJICAgICAmZmZpX3R5cGVfc2ludCwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xvc3VyZV90ZXN0X2ZuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgMyAvKiB1c2VyZGF0YSAqLywgY29kZSkgPT0gRkZJX09LKTsKKworICByZXMgPSAoKigoY2xvc3VyZV90ZXN0X3R5cGUyKWNvZGUpKQorICAgICgxLCAyLCAzLCA0LCAxMjcsIDUsIDYsIDgsIDksIDEwLCAxMSwgMTIuMCwgMTMsCisgICAgIDE5LjAsIDIxLCAxKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEgMiAzIDQgMTI3IDUgNiA4IDkgMTAgMTEgMTIgMTMgMTkgMjEgMSAzOiAyNTUiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMjU1IiB9ICovCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4zLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm4zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjMuYwpAQCAtMCwwICsxLDgyIEBACisvKiBBcmVhOgljbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIG11bHRpcGxlIHZhbHVlcyBwYXNzaW5nIGZyb20gZGlmZmVyZW50IHR5cGUuCisJCUFsc28sIGV4Y2VlZCB0aGUgbGltaXQgb2YgZ3ByIGFuZCBmcHIgcmVnaXN0ZXJzIG9uIFBvd2VyUEMKKwkJRGFyd2luLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwODI4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZCBjbG9zdXJlX3Rlc3RfZm4zKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJCSAgICAgdm9pZCogdXNlcmRhdGEpCisgeworICAgKihmZmlfYXJnKilyZXNwID0KKyAgICAgKGludCkqKGZsb2F0ICopYXJnc1swXSArKGludCkoKihmbG9hdCAqKWFyZ3NbMV0pICsKKyAgICAgKGludCkoKihmbG9hdCAqKWFyZ3NbMl0pICsgKGludCkqKGZsb2F0ICopYXJnc1szXSArCisgICAgIChpbnQpKCooZmxvYXQgKilhcmdzWzRdKSArIChpbnQpKCooZmxvYXQgKilhcmdzWzVdKSArCisgICAgIChpbnQpKihmbG9hdCAqKWFyZ3NbNl0gKyAoaW50KSgqKGZsb2F0ICopYXJnc1s3XSkgKworICAgICAoaW50KSgqKGRvdWJsZSAqKWFyZ3NbOF0pICsgKGludCkqKGludCAqKWFyZ3NbOV0gKworICAgICAoaW50KSgqKGZsb2F0ICopYXJnc1sxMF0pICsgKGludCkoKihmbG9hdCAqKWFyZ3NbMTFdKSArCisgICAgIChpbnQpKihpbnQgKilhcmdzWzEyXSArIChpbnQpKCooZmxvYXQgKilhcmdzWzEzXSkgKworICAgICAoaW50KSgqKGZsb2F0ICopYXJnc1sxNF0pICsgICooaW50ICopYXJnc1sxNV0gKyAoaW50cHRyX3QpdXNlcmRhdGE7CisKKyAgIHByaW50ZigiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQ6ICVkXG4iLAorCSAgKGludCkqKGZsb2F0ICopYXJnc1swXSwgKGludCkoKihmbG9hdCAqKWFyZ3NbMV0pLAorCSAgKGludCkoKihmbG9hdCAqKWFyZ3NbMl0pLCAoaW50KSooZmxvYXQgKilhcmdzWzNdLAorCSAgKGludCkoKihmbG9hdCAqKWFyZ3NbNF0pLCAoaW50KSgqKGZsb2F0ICopYXJnc1s1XSksCisJICAoaW50KSooZmxvYXQgKilhcmdzWzZdLCAoaW50KSgqKGZsb2F0ICopYXJnc1s3XSksCisJICAoaW50KSgqKGRvdWJsZSAqKWFyZ3NbOF0pLCAoaW50KSooaW50ICopYXJnc1s5XSwKKwkgIChpbnQpKCooZmxvYXQgKilhcmdzWzEwXSksIChpbnQpKCooZmxvYXQgKilhcmdzWzExXSksCisJICAoaW50KSooaW50ICopYXJnc1sxMl0sIChpbnQpKCooZmxvYXQgKilhcmdzWzEzXSksCisJICAoaW50KSgqKGZsb2F0ICopYXJnc1sxNF0pLCAqKGludCAqKWFyZ3NbMTVdLCAoaW50KShpbnRwdHJfdCl1c2VyZGF0YSwKKwkgIChpbnQpKihmZmlfYXJnICopcmVzcCk7CisKKyB9CisKK3R5cGVkZWYgaW50ICgqY2xvc3VyZV90ZXN0X3R5cGUzKShmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LAorCQkJCSAgZmxvYXQsIGZsb2F0LCBkb3VibGUsIGludCwgZmxvYXQsIGZsb2F0LCBpbnQsCisJCQkJICBmbG9hdCwgZmxvYXQsIGludCk7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbMTddOworICBpbnQgcmVzOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbF9hcmdfdHlwZXNbMl0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsX2FyZ190eXBlc1szXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzRdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbF9hcmdfdHlwZXNbNV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsX2FyZ190eXBlc1s2XSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzddID0gJmZmaV90eXBlX2Zsb2F0OworICBjbF9hcmdfdHlwZXNbOF0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbF9hcmdfdHlwZXNbOV0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzEwXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzExXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzEyXSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTNdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbF9hcmdfdHlwZXNbMTRdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbF9hcmdfdHlwZXNbMTVdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxNl0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxNiwKKwkJICAgICAmZmZpX3R5cGVfc2ludCwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xvc3VyZV90ZXN0X2ZuMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgMyAvKiB1c2VyZGF0YSAqLywgY29kZSkgID09IEZGSV9PSyk7CisKKyAgcmVzID0gKCooKGNsb3N1cmVfdGVzdF90eXBlMyljb2RlKSkKKyAgICAoMS4xLCAyLjIsIDMuMywgNC40LCA1LjUsIDYuNiwgNy43LCA4LjgsIDksIDEwLCAxMS4xMSwgMTIuMCwgMTMsCisgICAgIDE5LjE5LCAyMS4yMSwgMSk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxOSAyMSAxIDM6IDEzNSIgfSAqLworICBwcmludGYoInJlczogJWRcbiIscmVzKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMzUiIH0gKi8KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjQuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGExNTMwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNC5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIEFyZWE6CWNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgbXVsdGlwbGUgbG9uZyBsb25nIHZhbHVlcyBwYXNzaW5nLgorCQlBbHNvLCBleGNlZWQgdGhlIGxpbWl0IG9mIGdwciBhbmQgZnByIHJlZ2lzdGVycyBvbiBQb3dlclBDCisJCURhcndpbi4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMTAyNgkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZAorY2xvc3VyZV90ZXN0X2ZuMChmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSB2b2lkKiB1c2VyZGF0YSkKK3sKKyAgKihmZmlfYXJnKilyZXNwID0KKyAgICAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1swXSArIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzFdICsKKyAgICAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1syXSArIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzNdICsKKyAgICAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1s0XSArIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzVdICsKKyAgICAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1s2XSArIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzddICsKKyAgICAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1s4XSArIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzldICsKKyAgICAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1sxMF0gKworICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzExXSArCisgICAgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMTJdICsKKyAgICAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1sxM10gKworICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzE0XSArCisgICAgKihpbnQgKilhcmdzWzE1XSArIChpbnRwdHJfdCl1c2VyZGF0YTsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkOiAlZFxuIiwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMF0sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzFdLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1syXSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbM10sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzRdLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1s1XSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbNl0sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzddLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1s4XSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbOV0sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzEwXSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMTFdLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1sxMl0sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzEzXSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMTRdLAorCSAqKGludCAqKWFyZ3NbMTVdLAorCSAoaW50KShpbnRwdHJfdCl1c2VyZGF0YSwgKGludCkqKGZmaV9hcmcgKilyZXNwKTsKKworfQorCit0eXBlZGVmIGludCAoKmNsb3N1cmVfdGVzdF90eXBlMCkodW5zaWduZWQgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nIGxvbmcsCisJCQkJICB1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nIGxvbmcsCisJCQkJICB1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nIGxvbmcsCisJCQkJICB1bnNpZ25lZCBsb25nIGxvbmcsIGludCk7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbMTddOworICBpbnQgaSwgcmVzOworCisgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgY2xfYXJnX3R5cGVzW2ldID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgfQorICBjbF9hcmdfdHlwZXNbMTVdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxNl0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxNiwKKwkJICAgICAmZmZpX3R5cGVfc2ludCwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xvc3VyZV90ZXN0X2ZuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgMyAvKiB1c2VyZGF0YSAqLywgY29kZSkgPT0gRkZJX09LKTsKKworICByZXMgPSAoKigoY2xvc3VyZV90ZXN0X3R5cGUwKWNvZGUpKQorICAgICgxTEwsIDJMTCwgM0xMLCA0TEwsIDEyN0xMLCA0MjlMTCwgN0xMLCA4TEwsIDlMTCwgMTBMTCwgMTFMTCwgMTJMTCwKKyAgICAgMTNMTCwgMTlMTCwgMjFMTCwgMSk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDIgMyA0IDEyNyA0MjkgNyA4IDkgMTAgMTEgMTIgMTMgMTkgMjEgMSAzOiA2ODAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogNjgwIiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTA3NDQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2ZuNS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIEFyZWE6CWNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgbXVsdGlwbGUgbG9uZyBsb25nIHZhbHVlcyBwYXNzaW5nLgorCQlFeGNlZWQgdGhlIGxpbWl0IG9mIGdwciByZWdpc3RlcnMgb24gUG93ZXJQQworCQlEYXJ3aW4uCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzEwMjYJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3N0YXRpYyB2b2lkCitjbG9zdXJlX3Rlc3RfZm41KGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJIHZvaWQqIHVzZXJkYXRhKQoreworICAqKGZmaV9hcmcqKXJlc3AgPQorICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzBdICsgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMV0gKworICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzJdICsgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbM10gKworICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzRdICsgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbNV0gKworICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzZdICsgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbN10gKworICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzhdICsgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbOV0gKworICAgIChpbnQpKihpbnQgKilhcmdzWzEwXSArCisgICAgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMTFdICsKKyAgICAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1sxMl0gKworICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzEzXSArCisgICAgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMTRdICsKKyAgICAqKGludCAqKWFyZ3NbMTVdICsgKGludHB0cl90KXVzZXJkYXRhOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQ6ICVkXG4iLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1swXSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMV0sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzJdLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1szXSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbNF0sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzVdLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1s2XSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbN10sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzhdLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1s5XSwKKwkgKGludCkqKGludCAqKWFyZ3NbMTBdLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1sxMV0sCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzEyXSwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMTNdLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1sxNF0sCisJICooaW50ICopYXJnc1sxNV0sCisJIChpbnQpKGludHB0cl90KXVzZXJkYXRhLCAoaW50KSooZmZpX2FyZyAqKXJlc3ApOworCit9CisKK3R5cGVkZWYgaW50ICgqY2xvc3VyZV90ZXN0X3R5cGUwKSh1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nIGxvbmcsCisJCQkJICB1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nLAorCQkJCSAgaW50LCB1bnNpZ25lZCBsb25nIGxvbmcsCisJCQkJICB1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbG9uZywgaW50KTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1sxN107CisgIGludCBpLCByZXM7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBjbF9hcmdfdHlwZXNbaV0gPSAmZmZpX3R5cGVfdWludDY0OworICB9CisgIGNsX2FyZ190eXBlc1sxMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgZm9yIChpID0gMTE7IGkgPCAxNTsgaSsrKSB7CisgICAgY2xfYXJnX3R5cGVzW2ldID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgfQorICBjbF9hcmdfdHlwZXNbMTVdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxNl0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxNiwKKwkJICAgICAmZmZpX3R5cGVfc2ludCwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xvc3VyZV90ZXN0X2ZuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgMyAvKiB1c2VyZGF0YSAqLywgY29kZSkgPT0gRkZJX09LKTsKKworICByZXMgPSAoKigoY2xvc3VyZV90ZXN0X3R5cGUwKWNvZGUpKQorICAgICgxTEwsIDJMTCwgM0xMLCA0TEwsIDEyN0xMLCA0MjlMTCwgN0xMLCA4TEwsIDlMTCwgMTBMTCwgMTEsIDEyTEwsCisgICAgIDEzTEwsIDE5TEwsIDIxTEwsIDEpOworICAvKiB7IGRnLW91dHB1dCAiMSAyIDMgNCAxMjcgNDI5IDcgOCA5IDEwIDExIDEyIDEzIDE5IDIxIDEgMzogNjgwIiB9ICovCisgIHByaW50ZigicmVzOiAlZFxuIixyZXMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDY4MCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm42LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfZm42LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjNTRmZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9mbjYuYwpAQCAtMCwwICsxLDkwIEBACisvKiBBcmVhOgljbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIG11bHRpcGxlIHZhbHVlcyBwYXNzaW5nIGZyb20gZGlmZmVyZW50IHR5cGUuCisJCUFsc28sIGV4Y2VlZCB0aGUgbGltaXQgb2YgZ3ByIGFuZCBmcHIgcmVnaXN0ZXJzIG9uIFBvd2VyUEMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJUFIyMzQwNAorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDA1MDgzMAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHZvaWQKK2Nsb3N1cmVfdGVzdF9mbjAoZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgdm9pZCogdXNlcmRhdGEpCit7CisgICooZmZpX2FyZyopcmVzcCA9CisgICAgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMF0gKworICAgIChpbnQpKCoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1sxXSkgKworICAgIChpbnQpKCoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1syXSkgKworICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzNdICsKKyAgICAoaW50KSgqKGludCAqKWFyZ3NbNF0pICsgKGludCkoKihkb3VibGUgKilhcmdzWzVdKSArCisgICAgKGludCkqKGRvdWJsZSAqKWFyZ3NbNl0gKyAoaW50KSgqKGZsb2F0ICopYXJnc1s3XSkgKworICAgIChpbnQpKCooZG91YmxlICopYXJnc1s4XSkgKyAoaW50KSooZG91YmxlICopYXJnc1s5XSArCisgICAgKGludCkoKihpbnQgKilhcmdzWzEwXSkgKyAoaW50KSgqKGZsb2F0ICopYXJnc1sxMV0pICsKKyAgICAoaW50KSooaW50ICopYXJnc1sxMl0gKyAoaW50KSgqKGludCAqKWFyZ3NbMTNdKSArCisgICAgKGludCkoKihkb3VibGUgKilhcmdzWzE0XSkgKyAgKGludCkqKGRvdWJsZSAqKWFyZ3NbMTVdICsKKyAgICAoaW50cHRyX3QpdXNlcmRhdGE7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZDogJWRcbiIsCisJIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgICopYXJnc1swXSwKKwkgKGludCkoKih1bnNpZ25lZCBsb25nIGxvbmcgICopYXJnc1sxXSksCisJIChpbnQpKCoodW5zaWduZWQgbG9uZyBsb25nICAqKWFyZ3NbMl0pLAorCSAoaW50KSoodW5zaWduZWQgbG9uZyBsb25nICAqKWFyZ3NbM10sCisJIChpbnQpKCooaW50ICopYXJnc1s0XSksIChpbnQpKCooZG91YmxlICopYXJnc1s1XSksCisJIChpbnQpKihkb3VibGUgKilhcmdzWzZdLCAoaW50KSgqKGZsb2F0ICopYXJnc1s3XSksCisJIChpbnQpKCooZG91YmxlICopYXJnc1s4XSksIChpbnQpKihkb3VibGUgKilhcmdzWzldLAorCSAoaW50KSgqKGludCAqKWFyZ3NbMTBdKSwgKGludCkoKihmbG9hdCAqKWFyZ3NbMTFdKSwKKwkgKGludCkqKGludCAqKWFyZ3NbMTJdLCAoaW50KSgqKGludCAqKWFyZ3NbMTNdKSwKKwkgKGludCkoKihkb3VibGUgKilhcmdzWzE0XSksIChpbnQpKCooZG91YmxlICopYXJnc1sxNV0pLAorCSAoaW50KShpbnRwdHJfdCl1c2VyZGF0YSwgKGludCkqKGZmaV9hcmcgKilyZXNwKTsKKworfQorCit0eXBlZGVmIGludCAoKmNsb3N1cmVfdGVzdF90eXBlMCkodW5zaWduZWQgbG9uZyBsb25nLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nLAorCQkJCSAgaW50LCBkb3VibGUsIGRvdWJsZSwgZmxvYXQsIGRvdWJsZSwgZG91YmxlLAorCQkJCSAgaW50LCBmbG9hdCwgaW50LCBpbnQsIGRvdWJsZSwgZG91YmxlKTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1sxN107CisgIGludCByZXM7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgY2xfYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgY2xfYXJnX3R5cGVzWzNdID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgY2xfYXJnX3R5cGVzWzRdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1s1XSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsX2FyZ190eXBlc1s2XSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsX2FyZ190eXBlc1s3XSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzhdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzldID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xfYXJnX3R5cGVzWzEwXSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTFdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbF9hcmdfdHlwZXNbMTJdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxM10gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzE0XSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsX2FyZ190eXBlc1sxNV0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbF9hcmdfdHlwZXNbMTZdID0gTlVMTDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMTYsCisJCSAgICAgJmZmaV90eXBlX3NpbnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsb3N1cmVfdGVzdF9mbjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIDMgLyogdXNlcmRhdGEgKi8sIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzID0gKCooKGNsb3N1cmVfdGVzdF90eXBlMCljb2RlKSkKKyAgICAoMSwgMiwgMywgNCwgMTI3LCA0MjkuLCA3LiwgOC4sIDkuNSwgMTAuLCAxMSwgMTIuLCAxMywKKyAgICAgMTksIDIxLiwgMS4pOworICAvKiB7IGRnLW91dHB1dCAiMSAyIDMgNCAxMjcgNDI5IDcgOCA5IDEwIDExIDEyIDEzIDE5IDIxIDEgMzogNjgwIiB9ICovCisgIHByaW50ZigicmVzOiAlZFxuIixyZXMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDY4MCIgfSAqLworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX2xvY19mbjAuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9sb2NfZm4wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhZmEwYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV9sb2NfZm4wLmMKQEAgLTAsMCArMSw5NSBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBtdWx0aXBsZSB2YWx1ZXMgcGFzc2luZyBmcm9tIGRpZmZlcmVudCB0eXBlLgorCQlBbHNvLCBleGNlZWQgdGhlIGxpbWl0IG9mIGdwciBhbmQgZnByIHJlZ2lzdGVycyBvbiBQb3dlclBDCisJCURhcndpbi4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworCisKKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHZvaWQKK2Nsb3N1cmVfbG9jX3Rlc3RfZm4wKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJIHZvaWQqIHVzZXJkYXRhKQoreworICAqKGZmaV9hcmcqKXJlc3AgPQorICAgIChpbnQpKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzBdICsgKGludCkoKihpbnQgKilhcmdzWzFdKSArCisgICAgKGludCkoKih1bnNpZ25lZCBsb25nIGxvbmcgKilhcmdzWzJdKSArIChpbnQpKihpbnQgKilhcmdzWzNdICsKKyAgICAoaW50KSgqKHNpZ25lZCBzaG9ydCAqKWFyZ3NbNF0pICsKKyAgICAoaW50KSgqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbNV0pICsKKyAgICAoaW50KSooaW50ICopYXJnc1s2XSArIChpbnQpKCooaW50ICopYXJnc1s3XSkgKworICAgIChpbnQpKCooZG91YmxlICopYXJnc1s4XSkgKyAoaW50KSooaW50ICopYXJnc1s5XSArCisgICAgKGludCkoKihpbnQgKilhcmdzWzEwXSkgKyAoaW50KSgqKGZsb2F0ICopYXJnc1sxMV0pICsKKyAgICAoaW50KSooaW50ICopYXJnc1sxMl0gKyAoaW50KSgqKGludCAqKWFyZ3NbMTNdKSArCisgICAgKGludCkoKihpbnQgKilhcmdzWzE0XSkgKyAgKihpbnQgKilhcmdzWzE1XSArIChpbnRwdHJfdCl1c2VyZGF0YTsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkOiAlZFxuIiwKKwkgKGludCkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMF0sIChpbnQpKCooaW50ICopYXJnc1sxXSksCisJIChpbnQpKCoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1syXSksCisJIChpbnQpKihpbnQgKilhcmdzWzNdLCAoaW50KSgqKHNpZ25lZCBzaG9ydCAqKWFyZ3NbNF0pLAorCSAoaW50KSgqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbNV0pLAorCSAoaW50KSooaW50ICopYXJnc1s2XSwgKGludCkoKihpbnQgKilhcmdzWzddKSwKKwkgKGludCkoKihkb3VibGUgKilhcmdzWzhdKSwgKGludCkqKGludCAqKWFyZ3NbOV0sCisJIChpbnQpKCooaW50ICopYXJnc1sxMF0pLCAoaW50KSgqKGZsb2F0ICopYXJnc1sxMV0pLAorCSAoaW50KSooaW50ICopYXJnc1sxMl0sIChpbnQpKCooaW50ICopYXJnc1sxM10pLAorCSAoaW50KSgqKGludCAqKWFyZ3NbMTRdKSwqKGludCAqKWFyZ3NbMTVdLAorCSAoaW50KShpbnRwdHJfdCl1c2VyZGF0YSwgKGludCkqKGZmaV9hcmcgKilyZXNwKTsKKworfQorCit0eXBlZGVmIGludCAoKmNsb3N1cmVfbG9jX3Rlc3RfdHlwZTApKHVuc2lnbmVkIGxvbmcgbG9uZywgaW50LCB1bnNpZ25lZCBsb25nIGxvbmcsCisJCQkJICBpbnQsIHNpZ25lZCBzaG9ydCwgdW5zaWduZWQgbG9uZyBsb25nLCBpbnQsCisJCQkJICBpbnQsIGRvdWJsZSwgaW50LCBpbnQsIGZsb2F0LCBpbnQsIGludCwKKwkJCQkgIGludCwgaW50KTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfY2xvc3VyZSAqcGNsOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1sxN107CisgIGludCByZXM7CisgIHZvaWQgKmNvZGVsb2M7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1syXSA9ICZmZmlfdHlwZV91aW50NjQ7CisgIGNsX2FyZ190eXBlc1szXSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbNF0gPSAmZmZpX3R5cGVfc3Nob3J0OworICBjbF9hcmdfdHlwZXNbNV0gPSAmZmZpX3R5cGVfdWludDY0OworICBjbF9hcmdfdHlwZXNbNl0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzddID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1s4XSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsX2FyZ190eXBlc1s5XSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTBdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsX2FyZ190eXBlc1sxMl0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzEzXSA9ICZmZmlfdHlwZV9zaW50OworICBjbF9hcmdfdHlwZXNbMTRdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsX2FyZ190eXBlc1sxNV0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzE2XSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDE2LAorCQkgICAgICZmZmlfdHlwZV9zaW50LCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGVsb2MpOworICBDSEVDSyhwY2wgIT0gTlVMTCk7CisgIENIRUNLKGNvZGVsb2MgIT0gTlVMTCk7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbG9zdXJlX2xvY190ZXN0X2ZuMCwKKwkJCSAodm9pZCAqKSAzIC8qIHVzZXJkYXRhICovLCBjb2RlbG9jKSA9PSBGRklfT0spOworICAKKyAgQ0hFQ0sobWVtY21wKHBjbCwgY29kZWxvYywgc2l6ZW9mKCpwY2wpKSA9PSAwKTsKKworICByZXMgPSAoKigoY2xvc3VyZV9sb2NfdGVzdF90eXBlMCljb2RlbG9jKSkKKyAgICAoMUxMLCAyLCAzTEwsIDQsIDEyNywgNDI5TEwsIDcsIDgsIDkuNSwgMTAsIDExLCAxMiwgMTMsCisgICAgIDE5LCAyMSwgMSk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDIgMyA0IDEyNyA0MjkgNyA4IDkgMTAgMTEgMTIgMTMgMTkgMjEgMSAzOiA2ODAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogNjgwIiB9ICovCisgICAgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsb3N1cmVfc3RkY2FsbC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3N0ZGNhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmZjYzFmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbG9zdXJlX3N0ZGNhbGwuYwpAQCAtMCwwICsxLDY0IEBACisvKiBBcmVhOgljbG9zdXJlX2NhbGwgKHN0ZGNhbGwgY29udmVudGlvbikKKyAgIFB1cnBvc2U6CUNoZWNrIGhhbmRsaW5nIHdoZW4gY2FsbGVyIGV4cGVjdHMgc3RkY2FsbCBjYWxsZWUKKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPHR3YWxsamF2YUBkZXYuamF2YS5uZXQ+ICovCisKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi1jeWd3aW4qIGk/ODYtKi1taW5ndyogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZAorY2xvc3VyZV90ZXN0X3N0ZGNhbGwoZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgdm9pZCogdXNlcmRhdGEpCit7CisgICooZmZpX2FyZyopcmVzcCA9CisgICAgKGludCkqKGludCAqKWFyZ3NbMF0gKyAoaW50KSgqKGludCAqKWFyZ3NbMV0pCisgICAgKyAoaW50KSgqKGludCAqKWFyZ3NbMl0pICArIChpbnQpKCooaW50ICopYXJnc1szXSkKKyAgICArIChpbnQpKGludHB0cl90KXVzZXJkYXRhOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQ6ICVkXG4iLAorCSAoaW50KSooaW50ICopYXJnc1swXSwgKGludCkoKihpbnQgKilhcmdzWzFdKSwKKwkgKGludCkoKihpbnQgKilhcmdzWzJdKSwgKGludCkoKihpbnQgKilhcmdzWzNdKSwKKyAgICAgICAgIChpbnQpKihmZmlfYXJnICopcmVzcCk7CisKK30KKwordHlwZWRlZiBpbnQgKF9fc3RkY2FsbCAqY2xvc3VyZV90ZXN0X3R5cGUwKShpbnQsIGludCwgaW50LCBpbnQpOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlICogY2xfYXJnX3R5cGVzWzE3XTsKKyAgaW50IHJlczsKKyAgdm9pZCogc3BfcHJlOworICB2b2lkKiBzcF9wb3N0OworICBjaGFyIGJ1ZlsxMDI0XTsKKworICBjbF9hcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3VpbnQ7CisgIGNsX2FyZ190eXBlc1syXSA9ICZmZmlfdHlwZV91aW50OworICBjbF9hcmdfdHlwZXNbM10gPSAmZmZpX3R5cGVfdWludDsKKyAgY2xfYXJnX3R5cGVzWzRdID0gTlVMTDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9TVERDQUxMLCA0LAorCQkgICAgICZmZmlfdHlwZV9zaW50LCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbG9zdXJlX3Rlc3Rfc3RkY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgMyAvKiB1c2VyZGF0YSAqLywgY29kZSkgPT0gRkZJX09LKTsKKworICBhc20gdm9sYXRpbGUgKCIgbW92bCAlJWVzcCwlMCIgOiAiPWciIChzcF9wcmUpKTsKKyAgcmVzID0gKCooY2xvc3VyZV90ZXN0X3R5cGUwKWNvZGUpKDAsIDEsIDIsIDMpOworICBhc20gdm9sYXRpbGUgKCIgbW92bCAlJWVzcCwlMCIgOiAiPWciIChzcF9wb3N0KSk7CisgIC8qIHsgZGctb3V0cHV0ICIwIDEgMiAzOiA5IiB9ICovCisKKyAgcHJpbnRmKCJyZXM6ICVkXG4iLHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogOSIgfSAqLworCisgIHNwcmludGYoYnVmLCAibWlzbWF0Y2g6IHByZT0lcCB2cyBwb3N0PSVwIiwgc3BfcHJlLCBzcF9wb3N0KTsKKyAgcHJpbnRmKCJzdGFjayBwb2ludGVyICVzXG4iLCAoc3BfcHJlID09IHNwX3Bvc3QgPyAibWF0Y2giIDogYnVmKSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnN0YWNrIHBvaW50ZXIgbWF0Y2giIH0gKi8KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzEyYnl0ZS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTJieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhMzM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzEyYnl0ZS5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBwYXNzaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwODI4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0XzEyYnl0ZSB7CisgIGludCBhOworICBpbnQgYjsKKyAgaW50IGM7Cit9IGNsc19zdHJ1Y3RfMTJieXRlOworCitjbHNfc3RydWN0XzEyYnl0ZSBjbHNfc3RydWN0XzEyYnl0ZV9mbihzdHJ1Y3QgY2xzX3N0cnVjdF8xMmJ5dGUgYjEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfMTJieXRlIGIyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xMmJ5dGUgcmVzdWx0OworCisgIHJlc3VsdC5hID0gYjEuYSArIGIyLmE7CisgIHJlc3VsdC5iID0gYjEuYiArIGIyLmI7CisgIHJlc3VsdC5jID0gYjEuYyArIGIyLmM7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZCAlZCAlZDogJWQgJWQgJWRcbiIsIGIxLmEsIGIxLmIsIGIxLmMsIGIyLmEsIGIyLmIsIGIyLmMsCisJIHJlc3VsdC5hLCByZXN1bHQuYiwgcmVzdWx0LmMpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGNsc19zdHJ1Y3RfMTJieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLAorCQkJCSB2b2lkKiogYXJncyAsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzEyYnl0ZSBiMSwgYjI7CisKKyAgYjEgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzEyYnl0ZSopKGFyZ3NbMF0pOworICBiMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMTJieXRlKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0XzEyYnl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfMTJieXRlX2ZuKGIxLCBiMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s0XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTJieXRlIGhfZGJsID0geyA3LCA0LCA5IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzEyYnl0ZSBqX2RibCA9IHsgMSwgNSwgMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xMmJ5dGUgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9zaW50OworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9zaW50OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9zaW50OworICBjbHNfc3RydWN0X2ZpZWxkc1szXSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmaF9kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmpfZGJsOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfMTJieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjcgNCA5IDEgNSAzOiA4IDkgMTIiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA4IDkgMTIiIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfMTJieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwuYSA9IDA7CisgIHJlc19kYmwuYiA9IDA7CisgIHJlc19kYmwuYyA9IDA7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF8xMmJ5dGUoKikoY2xzX3N0cnVjdF8xMmJ5dGUsIGNsc19zdHJ1Y3RfMTJieXRlKSkoY29kZSkpKGhfZGJsLCBqX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjcgNCA5IDEgNSAzOiA4IDkgMTIiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA4IDkgMTIiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTZieXRlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xNmJ5dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjkyOTJhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTZieXRlLmMKQEAgLTAsMCArMSw5NSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBvdmVybGFwcGluZy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUgeworICBpbnQgYTsKKyAgZG91YmxlIGI7CisgIGludCBjOworfSBjbHNfc3RydWN0XzE2Ynl0ZTsKKworY2xzX3N0cnVjdF8xNmJ5dGUgY2xzX3N0cnVjdF8xNmJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlIGIxLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZSBiMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGIxLmEgKyBiMi5hOworICByZXN1bHQuYiA9IGIxLmIgKyBiMi5iOworICByZXN1bHQuYyA9IGIxLmMgKyBiMi5jOworCisgIHByaW50ZigiJWQgJWcgJWQgJWQgJWcgJWQ6ICVkICVnICVkXG4iLCBiMS5hLCBiMS5iLCBiMS5jLCBiMi5hLCBiMi5iLCBiMi5jLAorCSByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBjbHNfc3RydWN0XzE2Ynl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwKKwkJCQkgdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZSBiMSwgYjI7CisKKyAgYjEgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZSopKGFyZ3NbMF0pOworICBiMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0XzE2Ynl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfMTZieXRlX2ZuKGIxLCBiMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s0XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlIGhfZGJsID0geyA3LCA4LjAsIDkgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlIGpfZGJsID0geyAxLCA5LjAsIDMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9zaW50OworICBjbHNfc3RydWN0X2ZpZWxkc1szXSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmaF9kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmpfZGJsOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfMTZieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjcgOCA5IDEgOSAzOiA4IDE3IDEyIiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZyAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogOCAxNyAxMiIgfSAqLworCisgIHJlc19kYmwuYSA9IDA7CisgIHJlc19kYmwuYiA9IDAuMDsKKyAgcmVzX2RibC5jID0gMDsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfMTZieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfMTZieXRlKCopKGNsc19zdHJ1Y3RfMTZieXRlLCBjbHNfc3RydWN0XzE2Ynl0ZSkpKGNvZGUpKShoX2RibCwgal9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG43IDggOSAxIDkgMzogOCAxNyAxMiIgfSAqLworICBwcmludGYoInJlczogJWQgJWcgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDggMTcgMTIiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMThieXRlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOGJ5dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGM4YzZkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMThieXRlLmMKQEAgLTAsMCArMSw5NiBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBEb3VibGUgYWxpZ25tZW50IGNoZWNrIG9uIGRhcndpbi4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDkxNQkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF8xOGJ5dGUgeworICBkb3VibGUgYTsKKyAgdW5zaWduZWQgY2hhciBiOworICB1bnNpZ25lZCBjaGFyIGM7CisgIGRvdWJsZSBkOworfSBjbHNfc3RydWN0XzE4Ynl0ZTsKKworY2xzX3N0cnVjdF8xOGJ5dGUgY2xzX3N0cnVjdF8xOGJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfMThieXRlIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzE4Ynl0ZSBhMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMThieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworICByZXN1bHQuZCA9IGExLmQgKyBhMi5kOworCisKKyAgcHJpbnRmKCIlZyAlZCAlZCAlZyAlZyAlZCAlZCAlZzogJWcgJWQgJWQgJWdcbiIsIGExLmEsIGExLmIsIGExLmMsIGExLmQsCisJIGEyLmEsIGEyLmIsIGEyLmMsIGEyLmQsCisJIHJlc3VsdC5hLCByZXN1bHQuYiwgcmVzdWx0LmMsIHJlc3VsdC5kKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfMThieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xOGJ5dGUgYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8xOGJ5dGUqKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzE4Ynl0ZSopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF8xOGJ5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzE4Ynl0ZV9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNV07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0XzE4Ynl0ZSBnX2RibCA9IHsgMS4wLCAxMjcsIDEyNiwgMy4wIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzE4Ynl0ZSBmX2RibCA9IHsgNC4wLCAxMjUsIDEyNCwgNS4wIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzE4Ynl0ZSByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1szXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzRdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF8xOGJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMSAxMjcgMTI2IDMgNCAxMjUgMTI0IDU6IDUgMjUyIDI1MCA4IiB9ICovCisgIHByaW50ZigicmVzOiAlZyAlZCAlZCAlZ1xuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYywgcmVzX2RibC5kKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA1IDI1MiAyNTAgOCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF8xOGJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF8xOGJ5dGUoKikoY2xzX3N0cnVjdF8xOGJ5dGUsIGNsc19zdHJ1Y3RfMThieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgMTI3IDEyNiAzIDQgMTI1IDEyNCA1OiA1IDI1MiAyNTAgOCIgfSAqLworICBwcmludGYoInJlczogJWcgJWQgJWQgJWdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsIHJlc19kYmwuZCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogNSAyNTIgMjUwIDgiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTlieXRlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xOWJ5dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTY0MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMTlieXRlLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBwYXNzaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQlEZXBlbmRpbmcgb24gdGhlIEFCSS4gRG91YmxlIGFsaWdubWVudCBjaGVjayBvbiBkYXJ3aW4uCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA5MTUJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfMTlieXRlIHsKKyAgZG91YmxlIGE7CisgIHVuc2lnbmVkIGNoYXIgYjsKKyAgdW5zaWduZWQgY2hhciBjOworICBkb3VibGUgZDsKKyAgdW5zaWduZWQgY2hhciBlOworfSBjbHNfc3RydWN0XzE5Ynl0ZTsKKworY2xzX3N0cnVjdF8xOWJ5dGUgY2xzX3N0cnVjdF8xOWJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfMTlieXRlIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzE5Ynl0ZSBhMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTlieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworICByZXN1bHQuZCA9IGExLmQgKyBhMi5kOworICByZXN1bHQuZSA9IGExLmUgKyBhMi5lOworCisKKyAgcHJpbnRmKCIlZyAlZCAlZCAlZyAlZCAlZyAlZCAlZCAlZyAlZDogJWcgJWQgJWQgJWcgJWRcbiIsCisJIGExLmEsIGExLmIsIGExLmMsIGExLmQsIGExLmUsCisJIGEyLmEsIGEyLmIsIGEyLmMsIGEyLmQsIGEyLmUsCisJIHJlc3VsdC5hLCByZXN1bHQuYiwgcmVzdWx0LmMsIHJlc3VsdC5kLCByZXN1bHQuZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzE5Ynl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTlieXRlIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMTlieXRlKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8xOWJ5dGUqKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfMTlieXRlKilyZXNwID0gY2xzX3N0cnVjdF8xOWJ5dGVfZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFszXTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzZdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xOWJ5dGUgZ19kYmwgPSB7IDEuMCwgMTI3LCAxMjYsIDMuMCwgMTIwIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzE5Ynl0ZSBmX2RibCA9IHsgNC4wLCAxMjUsIDEyNCwgNS4wLCAxMTkgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTlieXRlIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbNF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzVdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF8xOWJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMSAxMjcgMTI2IDMgMTIwIDQgMTI1IDEyNCA1IDExOTogNSAyNTIgMjUwIDggMjM5IiB9ICovCisgIHByaW50ZigicmVzOiAlZyAlZCAlZCAlZyAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYywKKwkgcmVzX2RibC5kLCByZXNfZGJsLmUpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDUgMjUyIDI1MCA4IDIzOSIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF8xOWJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF8xOWJ5dGUoKikoY2xzX3N0cnVjdF8xOWJ5dGUsIGNsc19zdHJ1Y3RfMTlieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgMTI3IDEyNiAzIDEyMCA0IDEyNSAxMjQgNSAxMTk6IDUgMjUyIDI1MCA4IDIzOSIgfSAqLworICBwcmludGYoInJlczogJWcgJWQgJWQgJWcgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsCisJIHJlc19kYmwuZCwgcmVzX2RibC5lKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA1IDI1MiAyNTAgOCAyMzkiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMV8xYnl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDAyZDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18xXzFieXRlLmMKQEAgLTAsMCArMSw4OSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCUVzcGVjaWFsbHkgd2l0aCBzbWFsbCBzdHJ1Y3R1cmVzIHdoaWNoIG1heSBmaXQgaW4gb25lCisJCXJlZ2lzdGVyLiBEZXBlbmRpbmcgb24gdGhlIEFCSS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDkwMgkgKi8KKworCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfMV8xYnl0ZSB7CisgIHVuc2lnbmVkIGNoYXIgYTsKK30gY2xzX3N0cnVjdF8xXzFieXRlOworCitjbHNfc3RydWN0XzFfMWJ5dGUgY2xzX3N0cnVjdF8xXzFieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzFfMWJ5dGUgYTEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfMV8xYnl0ZSBhMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMV8xYnl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKworICBwcmludGYoIiVkICVkOiAlZFxuIiwgYTEuYSwgYTIuYSwgcmVzdWx0LmEpOworCisgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF8xXzFieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xXzFieXRlIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMV8xYnl0ZSopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMV8xYnl0ZSopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF8xXzFieXRlKilyZXNwID0gY2xzX3N0cnVjdF8xXzFieXRlX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1syXTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMV8xYnl0ZSBnX2RibCA9IHsgMTIgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMV8xYnl0ZSBmX2RibCA9IHsgMTc4IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzFfMWJ5dGUgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzFfMWJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMTIgMTc4OiAxOTAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLCByZXNfZGJsLmEpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDE5MCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF8xXzFieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfMV8xYnl0ZSgqKShjbHNfc3RydWN0XzFfMWJ5dGUsIGNsc19zdHJ1Y3RfMV8xYnl0ZSkpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMiAxNzg6IDE5MCIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsIHJlc19kYmwuYSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTkwIiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkZDdhYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzIwYnl0ZS5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBwYXNzaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQlEZXBlbmRpbmcgb24gdGhlIEFCSS4gQ2hlY2sgb3ZlcmxhcHBpbmcuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIHsKKyAgZG91YmxlIGE7CisgIGRvdWJsZSBiOworICBpbnQgYzsKK30gY2xzX3N0cnVjdF8yMGJ5dGU7CisKK2Nsc19zdHJ1Y3RfMjBieXRlIGNsc19zdHJ1Y3RfMjBieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSBhMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUgYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKworICBwcmludGYoIiVnICVnICVkICVnICVnICVkOiAlZyAlZyAlZFxuIiwgYTEuYSwgYTEuYiwgYTEuYywgYTIuYSwgYTIuYiwgYTIuYywKKwkgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzIwYnl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUqKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfMjBieXRlKilyZXNwID0gY2xzX3N0cnVjdF8yMGJ5dGVfZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzRdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUgZ19kYmwgPSB7IDEuMCwgMi4wLCAzIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSBmX2RibCA9IHsgNC4wLCA1LjAsIDcgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF8yMGJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMSAyIDMgNCA1IDc6IDUgNyAxMCIgfSAqLworICBwcmludGYoInJlczogJWcgJWcgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDUgNyAxMCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF8yMGJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF8yMGJ5dGUoKikoY2xzX3N0cnVjdF8yMGJ5dGUsIGNsc19zdHJ1Y3RfMjBieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgMiAzIDQgNSA3OiA1IDcgMTAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVnICVnICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA1IDcgMTAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjBieXRlMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYmNiYmYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yMGJ5dGUxLmMKQEAgLTAsMCArMSw5MyBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBvdmVybGFwcGluZy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIHsKKyAgaW50IGE7CisgIGRvdWJsZSBiOworICBkb3VibGUgYzsKK30gY2xzX3N0cnVjdF8yMGJ5dGU7CisKK2Nsc19zdHJ1Y3RfMjBieXRlIGNsc19zdHJ1Y3RfMjBieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSBhMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUgYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKworICBwcmludGYoIiVkICVnICVnICVkICVnICVnOiAlZCAlZyAlZ1xuIiwgYTEuYSwgYTEuYiwgYTEuYywgYTIuYSwgYTIuYiwgYTIuYywKKwkgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzIwYnl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUqKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfMjBieXRlKilyZXNwID0gY2xzX3N0cnVjdF8yMGJ5dGVfZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFszXTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzRdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8yMGJ5dGUgZ19kYmwgPSB7IDEsIDIuMCwgMy4wIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzIwYnl0ZSBmX2RibCA9IHsgNCwgNS4wLCA3LjAgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjBieXRlIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF8yMGJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMSAyIDMgNCA1IDc6IDUgNyAxMCIgfSAqLworICBwcmludGYoInJlczogJWQgJWcgJWdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDUgNyAxMCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF8yMGJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF8yMGJ5dGUoKikoY2xzX3N0cnVjdF8yMGJ5dGUsIGNsc19zdHJ1Y3RfMjBieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgMiAzIDQgNSA3OiA1IDcgMTAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVnICVnXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA1IDcgMTAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjRieXRlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18yNGJ5dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmE2ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMjRieXRlLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBwYXNzaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQlEZXBlbmRpbmcgb24gdGhlIEFCSS4gQ2hlY2sgb3ZlcmxhcHBpbmcuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlIHsKKyAgZG91YmxlIGE7CisgIGRvdWJsZSBiOworICBpbnQgYzsKKyAgZmxvYXQgZDsKK30gY2xzX3N0cnVjdF8yNGJ5dGU7CisKK2Nsc19zdHJ1Y3RfMjRieXRlIGNsc19zdHJ1Y3RfMjRieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzI0Ynl0ZSBiMCwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF8yNGJ5dGUgYjEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlIGIyLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzI0Ynl0ZSBiMykKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGIwLmEgKyBiMS5hICsgYjIuYSArIGIzLmE7CisgIHJlc3VsdC5iID0gYjAuYiArIGIxLmIgKyBiMi5iICsgYjMuYjsKKyAgcmVzdWx0LmMgPSBiMC5jICsgYjEuYyArIGIyLmMgKyBiMy5jOworICByZXN1bHQuZCA9IGIwLmQgKyBiMS5kICsgYjIuZCArIGIzLmQ7CisKKyAgcHJpbnRmKCIlZyAlZyAlZCAlZyAlZyAlZyAlZCAlZyAlZyAlZyAlZCAlZyAlZyAlZyAlZCAlZzogJWcgJWcgJWQgJWdcbiIsCisJIGIwLmEsIGIwLmIsIGIwLmMsIGIwLmQsCisJIGIxLmEsIGIxLmIsIGIxLmMsIGIxLmQsCisJIGIyLmEsIGIyLmIsIGIyLmMsIGIyLmQsCisJIGIzLmEsIGIzLmIsIGIzLmMsIGIyLmQsCisJIHJlc3VsdC5hLCByZXN1bHQuYiwgcmVzdWx0LmMsIHJlc3VsdC5kKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF8yNGJ5dGVfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzI0Ynl0ZSBiMCwgYjEsIGIyLCBiMzsKKworICBiMCA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlKikoYXJnc1swXSk7CisgIGIxID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8yNGJ5dGUqKShhcmdzWzFdKTsKKyAgYjIgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzI0Ynl0ZSopKGFyZ3NbMl0pOworICBiMyA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlKikoYXJnc1szXSk7CisKKyAgKihjbHNfc3RydWN0XzI0Ynl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfMjRieXRlX2ZuKGIwLCBiMSwgYjIsIGIzKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzVdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8yNGJ5dGUgZV9kYmwgPSB7IDkuMCwgMi4wLCA2LCA1LjAgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlIGZfZGJsID0geyAxLjAsIDIuMCwgMywgNy4wIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzI0Ynl0ZSBnX2RibCA9IHsgNC4wLCA1LjAsIDcsIDkuMCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8yNGJ5dGUgaF9kYmwgPSB7IDguMCwgNi4wLCAxLCA0LjAgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMjRieXRlIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbHNfc3RydWN0X2ZpZWxkc1s0XSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1szXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbNF0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDQsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gJmdfZGJsOworICBhcmdzX2RibFszXSA9ICZoX2RibDsKKyAgYXJnc19kYmxbNF0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzI0Ynl0ZV9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICI5IDIgNiA1IDEgMiAzIDcgNCA1IDcgOSA4IDYgMSA5OiAyMiAxNSAxNyAyNSIgfSAqLworICBwcmludGYoInJlczogJWcgJWcgJWQgJWdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsIHJlc19kYmwuZCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMjIgMTUgMTcgMjUiIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfMjRieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfMjRieXRlKCopKGNsc19zdHJ1Y3RfMjRieXRlLAorCQkJCSAgIGNsc19zdHJ1Y3RfMjRieXRlLAorCQkJCSAgIGNsc19zdHJ1Y3RfMjRieXRlLAorCQkJCSAgIGNsc19zdHJ1Y3RfMjRieXRlKSkKKwkgICAgIChjb2RlKSkoZV9kYmwsIGZfZGJsLCBnX2RibCwgaF9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG45IDIgNiA1IDEgMiAzIDcgNCA1IDcgOSA4IDYgMSA5OiAyMiAxNSAxNyAyNSIgfSAqLworICBwcmludGYoInJlczogJWcgJWcgJWQgJWdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsIHJlc19kYmwuZCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMjIgMTUgMTcgMjUiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfMmJ5dGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxZTEzMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzJieXRlLmMKQEAgLTAsMCArMSw5MCBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCUVzcGVjaWFsbHkgd2l0aCBzbWFsbCBzdHJ1Y3R1cmVzIHdoaWNoIG1heSBmaXQgaW4gb25lCisJCXJlZ2lzdGVyLiBEZXBlbmRpbmcgb24gdGhlIEFCSS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF8yYnl0ZSB7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgdW5zaWduZWQgY2hhciBiOworfSBjbHNfc3RydWN0XzJieXRlOworCitjbHNfc3RydWN0XzJieXRlIGNsc19zdHJ1Y3RfMmJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfMmJ5dGUgYTEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfMmJ5dGUgYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzJieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQ6ICVkICVkXG4iLCBhMS5hLCBhMS5iLCBhMi5hLCBhMi5iLCByZXN1bHQuYSwgcmVzdWx0LmIpOworCisgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF8yYnl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0XzJieXRlIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfMmJ5dGUqKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzJieXRlKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0XzJieXRlKilyZXNwID0gY2xzX3N0cnVjdF8yYnl0ZV9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNF07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0XzJieXRlIGdfZGJsID0geyAxMiwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzJieXRlIGZfZGJsID0geyAxLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8yYnl0ZSByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzJieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyIDEyNyAxIDEzOiAxMyAxNDAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYik7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTMgMTQwIiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0XzJieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfMmJ5dGUoKikoY2xzX3N0cnVjdF8yYnl0ZSwgY2xzX3N0cnVjdF8yYnl0ZSkpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMiAxMjcgMSAxMzogMTMgMTQwIiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zXzFieXRlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zXzFieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3ODBjMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNfMWJ5dGUuYwpAQCAtMCwwICsxLDk1IEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJRXNwZWNpYWxseSB3aXRoIHNtYWxsIHN0cnVjdHVyZXMgd2hpY2ggbWF5IGZpdCBpbiBvbmUKKwkJcmVnaXN0ZXIuIERlcGVuZGluZyBvbiB0aGUgQUJJLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwOTAyCSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0XzNfMWJ5dGUgeworICB1bnNpZ25lZCBjaGFyIGE7CisgIHVuc2lnbmVkIGNoYXIgYjsKKyAgdW5zaWduZWQgY2hhciBjOworfSBjbHNfc3RydWN0XzNfMWJ5dGU7CisKK2Nsc19zdHJ1Y3RfM18xYnl0ZSBjbHNfc3RydWN0XzNfMWJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfM18xYnl0ZSBhMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF8zXzFieXRlIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF8zXzFieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQgJWQgJWQ6ICVkICVkICVkXG4iLCBhMS5hLCBhMS5iLCBhMS5jLAorCSBhMi5hLCBhMi5iLCBhMi5jLAorCSByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jKTsKKworICByZXR1cm4gIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfM18xYnl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfM18xYnl0ZSBhMSwgYTI7CisKKyAgYTEgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzNfMWJ5dGUqKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzNfMWJ5dGUqKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfM18xYnl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfM18xYnl0ZV9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNF07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0XzNfMWJ5dGUgZ19kYmwgPSB7IDEyLCAxMywgMTQgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfM18xYnl0ZSBmX2RibCA9IHsgMTc4LCAxNzksIDE4MCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF8zXzFieXRlIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbM10gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzNfMWJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMTIgMTMgMTQgMTc4IDE3OSAxODA6IDE5MCAxOTIgMTk0IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTkwIDE5MiAxOTQiIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfM18xYnl0ZV9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0XzNfMWJ5dGUoKikoY2xzX3N0cnVjdF8zXzFieXRlLCBjbHNfc3RydWN0XzNfMWJ5dGUpKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMTIgMTMgMTQgMTc4IDE3OSAxODA6IDE5MCAxOTIgMTk0IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTkwIDE5MiAxOTQiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUxLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA1Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfM2J5dGUxLmMKQEAgLTAsMCArMSw5MCBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCUVzcGVjaWFsbHkgd2l0aCBzbWFsbCBzdHJ1Y3R1cmVzIHdoaWNoIG1heSBmaXQgaW4gb25lCisJCXJlZ2lzdGVyLiBEZXBlbmRpbmcgb24gdGhlIEFCSS4gQ2hlY2sgb3ZlcmxhcHBpbmcuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGUgeworICB1bnNpZ25lZCBzaG9ydCBhOworICB1bnNpZ25lZCBjaGFyIGI7Cit9IGNsc19zdHJ1Y3RfM2J5dGU7CisKK2Nsc19zdHJ1Y3RfM2J5dGUgY2xzX3N0cnVjdF8zYnl0ZV9mbihzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZSBhMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZSBhMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGUgcmVzdWx0OworCisgIHJlc3VsdC5hID0gYTEuYSArIGEyLmE7CisgIHJlc3VsdC5iID0gYTEuYiArIGEyLmI7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZDogJWQgJWRcbiIsIGExLmEsIGExLmIsIGEyLmEsIGEyLmIsIHJlc3VsdC5hLCByZXN1bHQuYik7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzNieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGUgYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZSopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGUqKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfM2J5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzNieXRlX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s0XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGUgZ19kYmwgPSB7IDEyLCAxMTkgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGUgZl9kYmwgPSB7IDEsIDE1IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzNieXRlIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdXNob3J0OworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzNieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyIDExOSAxIDE1OiAxMyAxMzQiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYik7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTMgMTM0IiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0XzNieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfM2J5dGUoKikoY2xzX3N0cnVjdF8zYnl0ZSwgY2xzX3N0cnVjdF8zYnl0ZSkpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMiAxMTkgMSAxNTogMTMgMTM0IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDEzNCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzNieXRlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzcwYTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc18zYnl0ZTIuYwpAQCAtMCwwICsxLDkwIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJRXNwZWNpYWxseSB3aXRoIHNtYWxsIHN0cnVjdHVyZXMgd2hpY2ggbWF5IGZpdCBpbiBvbmUKKwkJcmVnaXN0ZXIuIERlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBvdmVybGFwcGluZy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZV8xIHsKKyAgdW5zaWduZWQgY2hhciBhOworICB1bnNpZ25lZCBzaG9ydCBiOworfSBjbHNfc3RydWN0XzNieXRlXzE7CisKK2Nsc19zdHJ1Y3RfM2J5dGVfMSBjbHNfc3RydWN0XzNieXRlX2ZuMShzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZV8xIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzNieXRlXzEgYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzNieXRlXzEgcmVzdWx0OworCisgIHJlc3VsdC5hID0gYTEuYSArIGEyLmE7CisgIHJlc3VsdC5iID0gYTEuYiArIGEyLmI7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZDogJWQgJWRcbiIsIGExLmEsIGExLmIsIGEyLmEsIGEyLmIsIHJlc3VsdC5hLCByZXN1bHQuYik7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzNieXRlX2duMShmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZV8xIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGVfMSopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfM2J5dGVfMSopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF8zYnl0ZV8xKilyZXNwID0gY2xzX3N0cnVjdF8zYnl0ZV9mbjEoYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzRdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8zYnl0ZV8xIGdfZGJsID0geyAxNSwgMTI1IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzNieXRlXzEgZl9kYmwgPSB7IDksIDE5IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzNieXRlXzEgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdXNob3J0OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmZ19kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmZfZGJsOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfM2J5dGVfZm4xKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjE1IDEyNSA5IDE5OiAyNCAxNDQiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYik7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMjQgMTQ0IiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0XzNieXRlX2duMSwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0XzNieXRlXzEoKikoY2xzX3N0cnVjdF8zYnl0ZV8xLCBjbHNfc3RydWN0XzNieXRlXzEpKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMTUgMTI1IDkgMTk6IDI0IDE0NCIgfSAqLworICBwcmludGYoInJlczogJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyNCAxNDQiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNF8xYnl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODA2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc180XzFieXRlLmMKQEAgLTAsMCArMSw5OCBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCUVzcGVjaWFsbHkgd2l0aCBzbWFsbCBzdHJ1Y3R1cmVzIHdoaWNoIG1heSBmaXQgaW4gb25lCisJCXJlZ2lzdGVyLiBEZXBlbmRpbmcgb24gdGhlIEFCSS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDkwMgkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF80XzFieXRlIHsKKyAgdW5zaWduZWQgY2hhciBhOworICB1bnNpZ25lZCBjaGFyIGI7CisgIHVuc2lnbmVkIGNoYXIgYzsKKyAgdW5zaWduZWQgY2hhciBkOworfSBjbHNfc3RydWN0XzRfMWJ5dGU7CisKK2Nsc19zdHJ1Y3RfNF8xYnl0ZSBjbHNfc3RydWN0XzRfMWJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfNF8xYnl0ZSBhMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF80XzFieXRlIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF80XzFieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworICByZXN1bHQuZCA9IGExLmQgKyBhMi5kOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQ6ICVkICVkICVkICVkXG4iLCBhMS5hLCBhMS5iLCBhMS5jLCBhMS5kLAorCSBhMi5hLCBhMi5iLCBhMi5jLCBhMi5kLAorCSByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jLCByZXN1bHQuZCk7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzRfMWJ5dGVfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0XzRfMWJ5dGUgYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF80XzFieXRlKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF80XzFieXRlKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0XzRfMWJ5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzRfMWJ5dGVfZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzVdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF80XzFieXRlIGdfZGJsID0geyAxMiwgMTMsIDE0LCAxNSB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF80XzFieXRlIGZfZGJsID0geyAxNzgsIDE3OSwgMTgwLCAxODEgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNF8xYnl0ZSByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1s0XSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmZ19kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmZfZGJsOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfNF8xYnl0ZV9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxMiAxMyAxNCAxNSAxNzggMTc5IDE4MCAxODE6IDE5MCAxOTIgMTk0IDE5NiIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsIHJlc19kYmwuZCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTkwIDE5MiAxOTQgMTk2IiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0XzRfMWJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF80XzFieXRlKCopKGNsc19zdHJ1Y3RfNF8xYnl0ZSwgY2xzX3N0cnVjdF80XzFieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEyIDEzIDE0IDE1IDE3OCAxNzkgMTgwIDE4MTogMTkwIDE5MiAxOTQgMTk2IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZCAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYywgcmVzX2RibC5kKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxOTAgMTkyIDE5NCAxOTYiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNGJ5dGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhYmEzYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzRieXRlLmMKQEAgLTAsMCArMSw5MCBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBvdmVybGFwcGluZy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0XzRieXRlIHsKKyAgdW5zaWduZWQgc2hvcnQgYTsKKyAgdW5zaWduZWQgc2hvcnQgYjsKK30gY2xzX3N0cnVjdF80Ynl0ZTsKKworY2xzX3N0cnVjdF80Ynl0ZSBjbHNfc3RydWN0XzRieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzRieXRlIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzRieXRlIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF80Ynl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKworICBwcmludGYoIiVkICVkICVkICVkOiAlZCAlZFxuIiwgYTEuYSwgYTEuYiwgYTIuYSwgYTIuYiwgcmVzdWx0LmEsIHJlc3VsdC5iKTsKKworICByZXR1cm4gIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfNGJ5dGVfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF80Ynl0ZSBhMSwgYTI7CisKKyAgYTEgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzRieXRlKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF80Ynl0ZSopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF80Ynl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfNGJ5dGVfZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzRdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF80Ynl0ZSBnX2RibCA9IHsgMTI3LCAxMjAgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNGJ5dGUgZl9kYmwgPSB7IDEyLCAxMjggfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNGJ5dGUgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VzaG9ydDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzRieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyNyAxMjAgMTIgMTI4OiAxMzkgMjQ4IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzOSAyNDgiIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfNGJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF80Ynl0ZSgqKShjbHNfc3RydWN0XzRieXRlLCBjbHNfc3RydWN0XzRieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEyNyAxMjAgMTIgMTI4OiAxMzkgMjQ4IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzOSAyNDgiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNV8xX2J5dGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVfMV9ieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlYmEzZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVfMV9ieXRlLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBwYXNzaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQlEZXBlbmRpbmcgb24gdGhlIEFCSS4gQ2hlY2sgb3ZlcmxhcHBpbmcuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwNTA3MDgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgeworICB1bnNpZ25lZCBjaGFyIGE7CisgIHVuc2lnbmVkIGNoYXIgYjsKKyAgdW5zaWduZWQgY2hhciBjOworICB1bnNpZ25lZCBjaGFyIGQ7CisgIHVuc2lnbmVkIGNoYXIgZTsKK30gY2xzX3N0cnVjdF81Ynl0ZTsKKworY2xzX3N0cnVjdF81Ynl0ZSBjbHNfc3RydWN0XzVieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzVieXRlIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzVieXRlIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKyAgcmVzdWx0LmQgPSBhMS5kICsgYTIuZDsKKyAgcmVzdWx0LmUgPSBhMS5lICsgYTIuZTsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkOiAlZCAlZCAlZCAlZCAlZFxuIiwKKwkgYTEuYSwgYTEuYiwgYTEuYywgYTEuZCwgYTEuZSwKKwkgYTIuYSwgYTIuYiwgYTIuYywgYTIuZCwgYTIuZSwKKwkgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYywgcmVzdWx0LmQsIHJlc3VsdC5lKTsKKworICByZXR1cm4gIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfNWJ5dGVfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSBhMSwgYTI7CisKKyAgYTEgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzVieXRlKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF81Ynl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfNWJ5dGVfZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzZdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSBnX2RibCA9IHsgMTI3LCAxMjAsIDEsIDMsIDQgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgZl9kYmwgPSB7IDEyLCAxMjgsIDksIDMsIDQgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgcmVzX2RibCA9IHsgMCwgMCwgMCwgMCwgMCB9OworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1s0XSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbNV0gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzVieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyNyAxMjAgMSAzIDQgMTIgMTI4IDkgMyA0OiAxMzkgMjQ4IDEwIDYgOCIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsCisJIHJlc19kYmwuZCwgcmVzX2RibC5lKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMzkgMjQ4IDEwIDYgOCIgfSAqLworCisgIHJlc19kYmwuYSA9IDA7CisgIHJlc19kYmwuYiA9IDA7CisgIHJlc19kYmwuYyA9IDA7CisgIHJlc19kYmwuZCA9IDA7CisgIHJlc19kYmwuZSA9IDA7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0XzVieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfNWJ5dGUoKikoY2xzX3N0cnVjdF81Ynl0ZSwgY2xzX3N0cnVjdF81Ynl0ZSkpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMjcgMTIwIDEgMyA0IDEyIDEyOCA5IDMgNDogMTM5IDI0OCAxMCA2IDgiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkICVkICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jLAorCSByZXNfZGJsLmQsIHJlc19kYmwuZSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTM5IDI0OCAxMCA2IDgiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNWJ5dGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkNTk1YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzVieXRlLmMKQEAgLTAsMCArMSw5OCBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBvdmVybGFwcGluZy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSB7CisgIHVuc2lnbmVkIHNob3J0IGE7CisgIHVuc2lnbmVkIHNob3J0IGI7CisgIHVuc2lnbmVkIGNoYXIgYzsKK30gY2xzX3N0cnVjdF81Ynl0ZTsKKworY2xzX3N0cnVjdF81Ynl0ZSBjbHNfc3RydWN0XzVieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzVieXRlIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzVieXRlIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkOiAlZCAlZCAlZFxuIiwgYTEuYSwgYTEuYiwgYTEuYywKKwkgYTIuYSwgYTIuYiwgYTIuYywKKwkgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYyk7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzVieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF81Ynl0ZSopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUqKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfNWJ5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzVieXRlX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s0XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNWJ5dGUgZ19kYmwgPSB7IDEyNywgMTIwLCAxIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzVieXRlIGZfZGJsID0geyAxMiwgMTI4LCA5IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzVieXRlIHJlc19kYmwgPSB7IDAsIDAsIDAgfTsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VzaG9ydDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF81Ynl0ZV9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxMjcgMTIwIDEgMTIgMTI4IDk6IDEzOSAyNDggMTAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMzkgMjQ4IDEwIiB9ICovCisKKyAgcmVzX2RibC5hID0gMDsKKyAgcmVzX2RibC5iID0gMDsKKyAgcmVzX2RibC5jID0gMDsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfNWJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF81Ynl0ZSgqKShjbHNfc3RydWN0XzVieXRlLCBjbHNfc3RydWN0XzVieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEyNyAxMjAgMSAxMiAxMjggOTogMTM5IDI0OCAxMCIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzOSAyNDggMTAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNjRieXRlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182NGJ5dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzZlYmUwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNjRieXRlLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBwYXNzaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQlEZXBlbmRpbmcgb24gdGhlIEFCSS4gQ2hlY2sgYmlnZ2VyIHN0cnVjdCB3aGljaCBvdmVybGFwcworCQl0aGUgZ3AgYW5kIGZwIHJlZ2lzdGVyIGNvdW50IG9uIERhcndpbi9BSVgvcHBjNjQuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfNjRieXRlIHsKKyAgZG91YmxlIGE7CisgIGRvdWJsZSBiOworICBkb3VibGUgYzsKKyAgZG91YmxlIGQ7CisgIGRvdWJsZSBlOworICBkb3VibGUgZjsKKyAgZG91YmxlIGc7CisgIGRvdWJsZSBoOworfSBjbHNfc3RydWN0XzY0Ynl0ZTsKKworY2xzX3N0cnVjdF82NGJ5dGUgY2xzX3N0cnVjdF82NGJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfNjRieXRlIGIwLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzY0Ynl0ZSBiMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF82NGJ5dGUgYjIsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfNjRieXRlIGIzKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF82NGJ5dGUgcmVzdWx0OworCisgIHJlc3VsdC5hID0gYjAuYSArIGIxLmEgKyBiMi5hICsgYjMuYTsKKyAgcmVzdWx0LmIgPSBiMC5iICsgYjEuYiArIGIyLmIgKyBiMy5iOworICByZXN1bHQuYyA9IGIwLmMgKyBiMS5jICsgYjIuYyArIGIzLmM7CisgIHJlc3VsdC5kID0gYjAuZCArIGIxLmQgKyBiMi5kICsgYjMuZDsKKyAgcmVzdWx0LmUgPSBiMC5lICsgYjEuZSArIGIyLmUgKyBiMy5lOworICByZXN1bHQuZiA9IGIwLmYgKyBiMS5mICsgYjIuZiArIGIzLmY7CisgIHJlc3VsdC5nID0gYjAuZyArIGIxLmcgKyBiMi5nICsgYjMuZzsKKyAgcmVzdWx0LmggPSBiMC5oICsgYjEuaCArIGIyLmggKyBiMy5oOworCisgIHByaW50ZigiJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWdcbiIsIHJlc3VsdC5hLCByZXN1bHQuYiwgcmVzdWx0LmMsCisJIHJlc3VsdC5kLCByZXN1bHQuZSwgcmVzdWx0LmYsIHJlc3VsdC5nLCByZXN1bHQuaCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfNjRieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF82NGJ5dGUgYjAsIGIxLCBiMiwgYjM7CisKKyAgYjAgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzY0Ynl0ZSopKGFyZ3NbMF0pOworICBiMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfNjRieXRlKikoYXJnc1sxXSk7CisgIGIyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF82NGJ5dGUqKShhcmdzWzJdKTsKKyAgYjMgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzY0Ynl0ZSopKGFyZ3NbM10pOworCisgICooY2xzX3N0cnVjdF82NGJ5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzY0Ynl0ZV9mbihiMCwgYjEsIGIyLCBiMyk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s5XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNjRieXRlIGVfZGJsID0geyA5LjAsIDIuMCwgNi4wLCA1LjAsIDMuMCwgNC4wLCA4LjAsIDEuMCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF82NGJ5dGUgZl9kYmwgPSB7IDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA1LjAsIDYuMCwgNy4wIH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzY0Ynl0ZSBnX2RibCA9IHsgNC4wLCA1LjAsIDcuMCwgOS4wLCAxLjAsIDEuMCwgMi4wLCA5LjAgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNjRieXRlIGhfZGJsID0geyA4LjAsIDYuMCwgMS4wLCA0LjAsIDAuMCwgMy4wLCAzLjAsIDEuMCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF82NGJ5dGUgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1szXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzRdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbNV0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1s2XSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzddID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbOF0gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbM10gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzRdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA0LCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmZV9kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmZfZGJsOworICBhcmdzX2RibFsyXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbM10gPSAmaF9kYmw7CisgIGFyZ3NfZGJsWzRdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF82NGJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMjIgMTUgMTcgMjUgNiAxMyAxOSAxOCIgfSAqLworICBwcmludGYoInJlczogJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsCisJIHJlc19kYmwuZCwgcmVzX2RibC5lLCByZXNfZGJsLmYsIHJlc19kYmwuZywgcmVzX2RibC5oKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyMiAxNSAxNyAyNSA2IDEzIDE5IDE4IiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0XzY0Ynl0ZV9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0XzY0Ynl0ZSgqKShjbHNfc3RydWN0XzY0Ynl0ZSwKKwkJCQkgICBjbHNfc3RydWN0XzY0Ynl0ZSwKKwkJCQkgICBjbHNfc3RydWN0XzY0Ynl0ZSwKKwkJCQkgICBjbHNfc3RydWN0XzY0Ynl0ZSkpCisJICAgICAoY29kZSkpKGVfZGJsLCBmX2RibCwgZ19kYmwsIGhfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMjIgMTUgMTcgMjUgNiAxMyAxOSAxOCIgfSAqLworICBwcmludGYoInJlczogJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsCisJIHJlc19kYmwuZCwgcmVzX2RibC5lLCByZXNfZGJsLmYsIHJlc19kYmwuZywgcmVzX2RibC5oKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyMiAxNSAxNyAyNSA2IDEzIDE5IDE4IiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzZfMV9ieXRlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182XzFfYnl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMmVmZjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182XzFfYnl0ZS5jCkBAIC0wLDAgKzEsMTEzIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJRGVwZW5kaW5nIG9uIHRoZSBBQkkuIENoZWNrIG92ZXJsYXBwaW5nLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDUwNzA4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIHsKKyAgdW5zaWduZWQgY2hhciBhOworICB1bnNpZ25lZCBjaGFyIGI7CisgIHVuc2lnbmVkIGNoYXIgYzsKKyAgdW5zaWduZWQgY2hhciBkOworICB1bnNpZ25lZCBjaGFyIGU7CisgIHVuc2lnbmVkIGNoYXIgZjsKK30gY2xzX3N0cnVjdF82Ynl0ZTsKKworY2xzX3N0cnVjdF82Ynl0ZSBjbHNfc3RydWN0XzZieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF82Ynl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKyAgcmVzdWx0LmQgPSBhMS5kICsgYTIuZDsKKyAgcmVzdWx0LmUgPSBhMS5lICsgYTIuZTsKKyAgcmVzdWx0LmYgPSBhMS5mICsgYTIuZjsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkOiAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkgYTEuYSwgYTEuYiwgYTEuYywgYTEuZCwgYTEuZSwgYTEuZiwKKwkgYTIuYSwgYTIuYiwgYTIuYywgYTIuZCwgYTIuZSwgYTIuZiwKKwkgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYywgcmVzdWx0LmQsIHJlc3VsdC5lLCByZXN1bHQuZik7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzZieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUgYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF82Ynl0ZSopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUqKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfNmJ5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzZieXRlX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s3XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUgZ19kYmwgPSB7IDEyNywgMTIwLCAxLCAzLCA0LCA1IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGZfZGJsID0geyAxMiwgMTI4LCA5LCAzLCA0LCA1IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIHJlc19kYmwgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1szXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbNF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzVdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1s2XSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmZ19kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmZfZGJsOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfNmJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMTI3IDEyMCAxIDMgNCA1IDEyIDEyOCA5IDMgNCA1OiAxMzkgMjQ4IDEwIDYgOCAxMCIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWQgJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsCisJIHJlc19kYmwuZCwgcmVzX2RibC5lLCByZXNfZGJsLmYpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzOSAyNDggMTAgNiA4IDEwIiB9ICovCisKKyAgcmVzX2RibC5hID0gMDsKKyAgcmVzX2RibC5iID0gMDsKKyAgcmVzX2RibC5jID0gMDsKKyAgcmVzX2RibC5kID0gMDsKKyAgcmVzX2RibC5lID0gMDsKKyAgcmVzX2RibC5mID0gMDsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfNmJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF82Ynl0ZSgqKShjbHNfc3RydWN0XzZieXRlLCBjbHNfc3RydWN0XzZieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEyNyAxMjAgMSAzIDQgNSAxMiAxMjggOSAzIDQgNTogMTM5IDI0OCAxMCA2IDggMTAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkICVkICVkICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jLAorCSByZXNfZGJsLmQsIHJlc19kYmwuZSwgcmVzX2RibC5mKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMzkgMjQ4IDEwIDYgOCAxMCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc182Ynl0ZS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNmJ5dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzI1N2IwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfNmJ5dGUuYwpAQCAtMCwwICsxLDk5IEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJRGVwZW5kaW5nIG9uIHRoZSBBQkkuIENoZWNrIG92ZXJsYXBwaW5nLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwODI4CSAqLworCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUgeworICB1bnNpZ25lZCBzaG9ydCBhOworICB1bnNpZ25lZCBzaG9ydCBiOworICB1bnNpZ25lZCBjaGFyIGM7CisgIHVuc2lnbmVkIGNoYXIgZDsKK30gY2xzX3N0cnVjdF82Ynl0ZTsKKworY2xzX3N0cnVjdF82Ynl0ZSBjbHNfc3RydWN0XzZieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF82Ynl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKyAgcmVzdWx0LmQgPSBhMS5kICsgYTIuZDsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkOiAlZCAlZCAlZCAlZFxuIiwgYTEuYSwgYTEuYiwgYTEuYywgYTEuZCwKKwkgYTIuYSwgYTIuYiwgYTIuYywgYTIuZCwKKwkgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYywgcmVzdWx0LmQpOworCisgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF82Ynl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUqKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzZieXRlKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0XzZieXRlKilyZXNwID0gY2xzX3N0cnVjdF82Ynl0ZV9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNV07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGdfZGJsID0geyAxMjcsIDEyMCwgMSwgMTI4IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzZieXRlIGZfZGJsID0geyAxMiwgMTI4LCA5LCAxMjcgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfNmJ5dGUgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VzaG9ydDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1s0XSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmZ19kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmZfZGJsOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfNmJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMTI3IDEyMCAxIDEyOCAxMiAxMjggOSAxMjc6IDEzOSAyNDggMTAgMjU1IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZCAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYywgcmVzX2RibC5kKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMzkgMjQ4IDEwIDI1NSIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF82Ynl0ZV9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0XzZieXRlKCopKGNsc19zdHJ1Y3RfNmJ5dGUsIGNsc19zdHJ1Y3RfNmJ5dGUpKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMTI3IDEyMCAxIDEyOCAxMiAxMjggOSAxMjc6IDEzOSAyNDggMTAgMjU1IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZCAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYywgcmVzX2RibC5kKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMzkgMjQ4IDEwIDI1NSIgfSAqLworCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdfMV9ieXRlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDA5YzkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc183XzFfYnl0ZS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJRGVwZW5kaW5nIG9uIHRoZSBBQkkuIENoZWNrIG92ZXJsYXBwaW5nLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDUwNzA4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIHsKKyAgdW5zaWduZWQgY2hhciBhOworICB1bnNpZ25lZCBjaGFyIGI7CisgIHVuc2lnbmVkIGNoYXIgYzsKKyAgdW5zaWduZWQgY2hhciBkOworICB1bnNpZ25lZCBjaGFyIGU7CisgIHVuc2lnbmVkIGNoYXIgZjsKKyAgdW5zaWduZWQgY2hhciBnOworfSBjbHNfc3RydWN0XzdieXRlOworCitjbHNfc3RydWN0XzdieXRlIGNsc19zdHJ1Y3RfN2J5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUgYTEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUgYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworICByZXN1bHQuZCA9IGExLmQgKyBhMi5kOworICByZXN1bHQuZSA9IGExLmUgKyBhMi5lOworICByZXN1bHQuZiA9IGExLmYgKyBhMi5mOworICByZXN1bHQuZyA9IGExLmcgKyBhMi5nOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQ6ICVkICVkICVkICVkICVkICVkICVkXG4iLAorCSBhMS5hLCBhMS5iLCBhMS5jLCBhMS5kLCBhMS5lLCBhMS5mLCBhMS5nLAorCSBhMi5hLCBhMi5iLCBhMi5jLCBhMi5kLCBhMi5lLCBhMi5mLCBhMi5nLAorCSByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jLCByZXN1bHQuZCwgcmVzdWx0LmUsIHJlc3VsdC5mLCByZXN1bHQuZyk7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzdieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUgYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF83Ynl0ZSopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUqKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfN2J5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzdieXRlX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s4XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUgZ19kYmwgPSB7IDEyNywgMTIwLCAxLCAzLCA0LCA1LCA2IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGZfZGJsID0geyAxMiwgMTI4LCA5LCAzLCA0LCA1LCA2IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIHJlc19kYmwgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1szXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbNF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzVdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1s2XSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbN10gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzdieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyNyAxMjAgMSAzIDQgNSA2IDEyIDEyOCA5IDMgNCA1IDY6IDEzOSAyNDggMTAgNiA4IDEwIDEyIiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYywKKwkgcmVzX2RibC5kLCByZXNfZGJsLmUsIHJlc19kYmwuZiwgcmVzX2RibC5nKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMzkgMjQ4IDEwIDYgOCAxMCAxMiIgfSAqLworCisgIHJlc19kYmwuYSA9IDA7CisgIHJlc19kYmwuYiA9IDA7CisgIHJlc19kYmwuYyA9IDA7CisgIHJlc19kYmwuZCA9IDA7CisgIHJlc19kYmwuZSA9IDA7CisgIHJlc19kYmwuZiA9IDA7CisgIHJlc19kYmwuZyA9IDA7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0XzdieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfN2J5dGUoKikoY2xzX3N0cnVjdF83Ynl0ZSwgY2xzX3N0cnVjdF83Ynl0ZSkpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMjcgMTIwIDEgMyA0IDUgNiAxMiAxMjggOSAzIDQgNSA2OiAxMzkgMjQ4IDEwIDYgOCAxMCAxMiIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsCisJIHJlc19kYmwuZCwgcmVzX2RibC5lLCByZXNfZGJsLmYsIHJlc19kYmwuZyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTM5IDI0OCAxMCA2IDggMTAgMTIiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfN2J5dGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMDAwMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzdieXRlLmMKQEAgLTAsMCArMSw5NyBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBvdmVybGFwcGluZy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF83Ynl0ZSB7CisgIHVuc2lnbmVkIHNob3J0IGE7CisgIHVuc2lnbmVkIHNob3J0IGI7CisgIHVuc2lnbmVkIGNoYXIgYzsKKyAgdW5zaWduZWQgc2hvcnQgZDsKK30gY2xzX3N0cnVjdF83Ynl0ZTsKKworY2xzX3N0cnVjdF83Ynl0ZSBjbHNfc3RydWN0XzdieXRlX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF83Ynl0ZSByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKyAgcmVzdWx0LmQgPSBhMS5kICsgYTIuZDsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkOiAlZCAlZCAlZCAlZFxuIiwgYTEuYSwgYTEuYiwgYTEuYywgYTEuZCwKKwkgYTIuYSwgYTIuYiwgYTIuYywgYTIuZCwKKwkgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYywgcmVzdWx0LmQpOworCisgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF83Ynl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUqKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzdieXRlKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0XzdieXRlKilyZXNwID0gY2xzX3N0cnVjdF83Ynl0ZV9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNV07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGdfZGJsID0geyAxMjcsIDEyMCwgMSwgMjU0IH07CisgIHN0cnVjdCBjbHNfc3RydWN0XzdieXRlIGZfZGJsID0geyAxMiwgMTI4LCA5LCAyNTUgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfN2J5dGUgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VzaG9ydDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX3VzaG9ydDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbNF0gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzdieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyNyAxMjAgMSAyNTQgMTIgMTI4IDkgMjU1OiAxMzkgMjQ4IDEwIDUwOSIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsIHJlc19kYmwuZCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTM5IDI0OCAxMCA1MDkiIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfN2J5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF83Ynl0ZSgqKShjbHNfc3RydWN0XzdieXRlLCBjbHNfc3RydWN0XzdieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEyNyAxMjAgMSAyNTQgMTIgMTI4IDkgMjU1OiAxMzkgMjQ4IDEwIDUwOSIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsIHJlc19kYmwuZCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTM5IDI0OCAxMCA1MDkiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOGJ5dGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhOTlkMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzhieXRlLmMKQEAgLTAsMCArMSw4OCBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBvdmVybGFwcGluZy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF84Ynl0ZSB7CisgIGludCBhOworICBmbG9hdCBiOworfSBjbHNfc3RydWN0XzhieXRlOworCitjbHNfc3RydWN0XzhieXRlIGNsc19zdHJ1Y3RfOGJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfOGJ5dGUgYTEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfOGJ5dGUgYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzhieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworCisgIHByaW50ZigiJWQgJWcgJWQgJWc6ICVkICVnXG4iLCBhMS5hLCBhMS5iLCBhMi5hLCBhMi5iLCByZXN1bHQuYSwgcmVzdWx0LmIpOworCisgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF84Ynl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0XzhieXRlIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfOGJ5dGUqKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzhieXRlKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0XzhieXRlKilyZXNwID0gY2xzX3N0cnVjdF84Ynl0ZV9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNF07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0XzhieXRlIGdfZGJsID0geyAxLCAyLjAgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfOGJ5dGUgZl9kYmwgPSB7IDQsIDUuMCB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF84Ynl0ZSByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmZ19kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmZfZGJsOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfOGJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMSAyIDQgNTogNSA3IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZ1xuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDUgNyIgfSAqLworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfOGJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF84Ynl0ZSgqKShjbHNfc3RydWN0XzhieXRlLCBjbHNfc3RydWN0XzhieXRlKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgMiA0IDU6IDUgNyIgfSAqLworICBwcmludGYoInJlczogJWQgJWdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA1IDciIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzVlOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfOWJ5dGUxLmMKQEAgLTAsMCArMSw5MCBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBEYXJ3aW4vQUlYIGRvIGRvdWJsZS13b3JkCisJCWFsaWdubWVudCBvZiB0aGUgc3RydWN0IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGEgZG91YmxlLgorCQlDaGVjayB0aGF0IGl0IGRvZXMgbm90IGhlcmUuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA5MTQJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgeworICBpbnQgYTsKKyAgZG91YmxlIGI7Cit9IGNsc19zdHJ1Y3RfOWJ5dGU7CisKK2Nsc19zdHJ1Y3RfOWJ5dGUgY2xzX3N0cnVjdF85Ynl0ZV9mbihzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSBiMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSBiMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgcmVzdWx0OworCisgIHJlc3VsdC5hID0gYjEuYSArIGIyLmE7CisgIHJlc3VsdC5iID0gYjEuYiArIGIyLmI7CisKKyAgcHJpbnRmKCIlZCAlZyAlZCAlZzogJWQgJWdcbiIsIGIxLmEsIGIxLmIsICBiMi5hLCBiMi5iLAorCSByZXN1bHQuYSwgcmVzdWx0LmIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGNsc19zdHJ1Y3RfOWJ5dGVfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsCisJCQkJdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIGIxLCBiMjsKKworICBiMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUqKShhcmdzWzBdKTsKKyAgYjIgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzlieXRlKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0XzlieXRlKilyZXNwID0gY2xzX3N0cnVjdF85Ynl0ZV9mbihiMSwgYjIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbM107CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIGhfZGJsID0geyA3LCA4LjB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSBqX2RibCA9IHsgMSwgOS4wfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9zaW50OworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZoX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmal9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF85Ynl0ZV9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICI3IDggMSA5OiA4IDE3IiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZ1xuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDggMTciIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfOWJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF85Ynl0ZSgqKShjbHNfc3RydWN0XzlieXRlLCBjbHNfc3RydWN0XzlieXRlKSkoY29kZSkpKGhfZGJsLCBqX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjcgOCAxIDk6IDggMTciIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVnXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYik7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogOCAxNyIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzXzlieXRlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMGJhMGQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc185Ynl0ZTIuYwpAQCAtMCwwICsxLDkxIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJRGVwZW5kaW5nIG9uIHRoZSBBQkkuIERhcndpbi9BSVggZG8gZG91YmxlLXdvcmQKKwkJYWxpZ25tZW50IG9mIHRoZSBzdHJ1Y3QgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBkb3VibGUuCisJCUNoZWNrIHRoYXQgaXQgZG9lcyBoZXJlLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwOTE0CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIHsKKyAgZG91YmxlIGE7CisgIGludCBiOworfSBjbHNfc3RydWN0XzlieXRlOworCitjbHNfc3RydWN0XzlieXRlIGNsc19zdHJ1Y3RfOWJ5dGVfZm4oc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgYjEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgYjIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGIxLmEgKyBiMi5hOworICByZXN1bHQuYiA9IGIxLmIgKyBiMi5iOworCisgIHByaW50ZigiJWcgJWQgJWcgJWQ6ICVnICVkXG4iLCBiMS5hLCBiMS5iLCAgYjIuYSwgYjIuYiwKKwkgcmVzdWx0LmEsIHJlc3VsdC5iKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBjbHNfc3RydWN0XzlieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLAorCQkJCXZvaWQqKiBhcmdzLCB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSBiMSwgYjI7CisKKyAgYjEgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzlieXRlKikoYXJnc1swXSk7CisgIGIyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF85Ynl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfOWJ5dGVfZm4oYjEsIGIyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFszXTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzNdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF85Ynl0ZSBoX2RibCA9IHsgNy4wLCA4fTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfOWJ5dGUgal9kYmwgPSB7IDEuMCwgOX07CisgIHN0cnVjdCBjbHNfc3RydWN0XzlieXRlIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9zaW50OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmaF9kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmpfZGJsOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfOWJ5dGVfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiNyA4IDEgOTogOCAxNyIgfSAqLworICBwcmludGYoInJlczogJWcgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA4IDE3IiB9ICovCisKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfOWJ5dGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF85Ynl0ZSgqKShjbHNfc3RydWN0XzlieXRlLCBjbHNfc3RydWN0XzlieXRlKSkoY29kZSkpKGhfZGJsLCBqX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjcgOCAxIDk6IDggMTciIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVnICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYik7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogOCAxNyIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9kb3VibGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2RvdWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjk0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9kb3VibGUuYwpAQCAtMCwwICsxLDkzIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgYWxpZ25tZW50IG9mIGRvdWJsZS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGhvc0B0YW1hbmVnaS5vcmc+IDIwMDMxMjAzCSAqLworCisKKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiB7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgZG91YmxlIGI7CisgIHVuc2lnbmVkIGNoYXIgYzsKK30gY2xzX3N0cnVjdF9hbGlnbjsKKworY2xzX3N0cnVjdF9hbGlnbiBjbHNfc3RydWN0X2FsaWduX2ZuKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKworICBwcmludGYoIiVkICVnICVkICVkICVnICVkOiAlZCAlZyAlZFxuIiwgYTEuYSwgYTEuYiwgYTEuYywgYTIuYSwgYTIuYiwgYTIuYywgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYyk7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0X2FsaWduX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfYWxpZ24qKXJlc3AgPSBjbHNfc3RydWN0X2FsaWduX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s0XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCA0OTUxLCAxMjcgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsIDkzMjAsIDEzIH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF9hbGlnbl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJWcgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MjcxIDE0MCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF9hbGlnbl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0X2FsaWduKCopKGNsc19zdHJ1Y3RfYWxpZ24sIGNsc19zdHJ1Y3RfYWxpZ24pKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMTIgNDk1MSAxMjcgMSA5MzIwIDEzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVnICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fZmxvYXQuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2MzdmMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2Zsb2F0LmMKQEAgLTAsMCArMSw5MSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIGFsaWdubWVudCBvZiBmbG9hdC4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGhvc0B0YW1hbmVnaS5vcmc+IDIwMDMxMjAzCSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHsKKyAgdW5zaWduZWQgY2hhciBhOworICBmbG9hdCBiOworICB1bnNpZ25lZCBjaGFyIGM7Cit9IGNsc19zdHJ1Y3RfYWxpZ247CisKK2Nsc19zdHJ1Y3RfYWxpZ24gY2xzX3N0cnVjdF9hbGlnbl9mbihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzdWx0OworCisgIHJlc3VsdC5hID0gYTEuYSArIGEyLmE7CisgIHJlc3VsdC5iID0gYTEuYiArIGEyLmI7CisgIHJlc3VsdC5jID0gYTEuYyArIGEyLmM7CisKKyAgcHJpbnRmKCIlZCAlZyAlZCAlZCAlZyAlZDogJWQgJWcgJWRcbiIsIGExLmEsIChkb3VibGUpYTEuYiwgYTEuYywgYTIuYSwgKGRvdWJsZSlhMi5iLCBhMi5jLCByZXN1bHQuYSwgKGRvdWJsZSlyZXN1bHQuYiwgcmVzdWx0LmMpOworCisgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF9hbGlnbl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0X2FsaWduKilyZXNwID0gY2xzX3N0cnVjdF9hbGlnbl9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNF07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgNDk1MSwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCA5MzIwLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF9hbGlnbl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJWcgJWRcbiIsIHJlc19kYmwuYSwgKGRvdWJsZSlyZXNfZGJsLmIsIHJlc19kYmwuYyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTMgMTQyNzEgMTQwIiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0X2FsaWduX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfYWxpZ24oKikoY2xzX3N0cnVjdF9hbGlnbiwgY2xzX3N0cnVjdF9hbGlnbikpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJWcgJWRcbiIsIHJlc19kYmwuYSwgKGRvdWJsZSlyZXNfZGJsLmIsIHJlc19kYmwuYyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTMgMTQyNzEgMTQwIiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjM4MDYwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBhbGlnbm1lbnQgb2YgbG9uZyBkb3VibGUuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxob3NAdGFtYW5lZ2kub3JnPiAyMDAzMTIwMwkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHsKKyAgdW5zaWduZWQgY2hhciBhOworICBsb25nIGRvdWJsZSBiOworICB1bnNpZ25lZCBjaGFyIGM7Cit9IGNsc19zdHJ1Y3RfYWxpZ247CisKK2Nsc19zdHJ1Y3RfYWxpZ24gY2xzX3N0cnVjdF9hbGlnbl9mbihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzdWx0OworCisgIHJlc3VsdC5hID0gYTEuYSArIGEyLmE7CisgIHJlc3VsdC5iID0gYTEuYiArIGEyLmI7CisgIHJlc3VsdC5jID0gYTEuYyArIGEyLmM7CisKKyAgcHJpbnRmKCIlZCAlZyAlZCAlZCAlZyAlZDogJWQgJWcgJWRcbiIsIGExLmEsIChkb3VibGUpYTEuYiwgYTEuYywgYTIuYSwgKGRvdWJsZSlhMi5iLCBhMi5jLCByZXN1bHQuYSwgKGRvdWJsZSlyZXN1bHQuYiwgcmVzdWx0LmMpOworCisgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF9hbGlnbl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0X2FsaWduKilyZXNwID0gY2xzX3N0cnVjdF9hbGlnbl9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNF07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgNDk1MSwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCA5MzIwLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbM10gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0X2FsaWduX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyIDQ5NTEgMTI3IDEgOTMyMCAxMzogMTMgMTQyNzEgMTQwIiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZyAlZFxuIiwgcmVzX2RibC5hLCAoZG91YmxlKXJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfYWxpZ25fZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoY2xzX3N0cnVjdF9hbGlnbigqKShjbHNfc3RydWN0X2FsaWduLCBjbHNfc3RydWN0X2FsaWduKSkoY29kZSkpKGdfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEyIDQ5NTEgMTI3IDEgOTMyMCAxMzogMTMgMTQyNzEgMTQwIiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZyAlZFxuIiwgcmVzX2RibC5hLCAoZG91YmxlKXJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fbG9uZ2RvdWJsZV9zcGxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzMyYmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0LmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBhbGlnbm1lbnQgb2YgbG9uZyBkb3VibGUuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxob3NAdGFtYW5lZ2kub3JnPiAyMDAzMTIwMwkgKi8KKworLyogeyBkZy1leGNlc3MtZXJyb3JzICJubyBsb25nIGRvdWJsZSBmb3JtYXQiIHsgeGZhaWwgeDg2XzY0LSotbWluZ3cqIHg4Nl82NC0qLWN5Z3dpbiogfSB9ICovCisvKiB7IGRnLWRvIHJ1biB7IHhmYWlsIHN0cm9uZ2FybSotKi0qIHhzY2FsZSotKi0qIH0gfSAqLworLyogeyBkZy1vcHRpb25zIC1tbG9uZy1kb3VibGUtMTI4IHsgdGFyZ2V0IHBvd2VycGM2NCotKi1saW51eCogfSB9ICovCisvKiB7IGRnLW91dHB1dCAiIiB7IHhmYWlsIHg4Nl82NC0qLW1pbmd3KiB4ODZfNjQtKi1jeWd3aW4qIH0gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHsKKyAgbG9uZyBkb3VibGUgYTsKKyAgbG9uZyBkb3VibGUgYjsKKyAgbG9uZyBkb3VibGUgYzsKKyAgbG9uZyBkb3VibGUgZDsKKyAgbG9uZyBkb3VibGUgZTsKKyAgbG9uZyBkb3VibGUgZjsKKyAgbG9uZyBkb3VibGUgZzsKK30gY2xzX3N0cnVjdF9hbGlnbjsKKworY2xzX3N0cnVjdF9hbGlnbiBjbHNfc3RydWN0X2FsaWduX2ZuKAorCWNsc19zdHJ1Y3RfYWxpZ24JYTEsCisJY2xzX3N0cnVjdF9hbGlnbglhMikKK3sKKwlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByOworCisJci5hID0gYTEuYSArIGEyLmE7CisJci5iID0gYTEuYiArIGEyLmI7CisJci5jID0gYTEuYyArIGEyLmM7CisJci5kID0gYTEuZCArIGEyLmQ7CisJci5lID0gYTEuZSArIGEyLmU7CisJci5mID0gYTEuZiArIGEyLmY7CisJci5nID0gYTEuZyArIGEyLmc7CisKKwlwcmludGYoIiVMZyAlTGcgJUxnICVMZyAlTGcgJUxnICVMZyAlTGcgJUxnICVMZyAlTGcgJUxnICVMZyAlTGc6ICIKKwkJIiVMZyAlTGcgJUxnICVMZyAlTGcgJUxnICVMZ1xuIiwKKwkJYTEuYSwgYTEuYiwgYTEuYywgYTEuZCwgYTEuZSwgYTEuZiwgYTEuZywKKwkJYTIuYSwgYTIuYiwgYTIuYywgYTIuZCwgYTIuZSwgYTIuZiwgYTIuZywKKwkJci5hLCByLmIsIHIuYywgci5kLCByLmUsIHIuZiwgci5nKTsKKworCXJldHVybiByOworfQorCitjbHNfc3RydWN0X2FsaWduIGNsc19zdHJ1Y3RfYWxpZ25fZm4yKAorCWNsc19zdHJ1Y3RfYWxpZ24JYTEpCit7CisJc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcjsKKworCXIuYSA9IGExLmEgKyAxOworCXIuYiA9IGExLmIgKyAxOworCXIuYyA9IGExLmMgKyAxOworCXIuZCA9IGExLmQgKyAxOworCXIuZSA9IGExLmUgKyAxOworCXIuZiA9IGExLmYgKyAxOworCXIuZyA9IGExLmcgKyAxOworCisJcHJpbnRmKCIlTGcgJUxnICVMZyAlTGcgJUxnICVMZyAlTGc6ICIKKwkJIiVMZyAlTGcgJUxnICVMZyAlTGcgJUxnICVMZ1xuIiwKKwkJYTEuYSwgYTEuYiwgYTEuYywgYTEuZCwgYTEuZSwgYTEuZiwgYTEuZywKKwkJci5hLCByLmIsIHIuYywgci5kLCByLmUsIHIuZiwgci5nKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF9hbGlnbl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsIAorCQkgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKwlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMSwgYTI7CisKKwlhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzBdKTsKKwlhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzFdKTsKKworCSooY2xzX3N0cnVjdF9hbGlnbiopcmVzcCA9IGNsc19zdHJ1Y3RfYWxpZ25fZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisJZmZpX2NpZiBjaWY7CisgICAgICAgIHZvaWQgKmNvZGU7CisJZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKwl2b2lkKiBhcmdzX2RibFszXTsKKwlmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbOF07CisJZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworCWZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOworCisJY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworCWNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworCWNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworCWNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisJc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcgfTsKKwlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0IH07CisJc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKworCWNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbNF0gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s1XSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzZdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbN10gPSBOVUxMOworCisJZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKwlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlLAorCQlkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisJYXJnc19kYmxbMF0gPSAmZ19kYmw7CisJYXJnc19kYmxbMV0gPSAmZl9kYmw7CisJYXJnc19kYmxbMl0gPSBOVUxMOworCisJZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfYWxpZ25fZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworCS8qIHsgZGctb3V0cHV0ICIxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNDogOSAxMSAxMyAxNSAxNyAxOSAyMSIgfSAqLworCXByaW50ZigicmVzOiAlTGcgJUxnICVMZyAlTGcgJUxnICVMZyAlTGdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLAorCQlyZXNfZGJsLmMsIHJlc19kYmwuZCwgcmVzX2RibC5lLCByZXNfZGJsLmYsIHJlc19kYmwuZyk7CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiA5IDExIDEzIDE1IDE3IDE5IDIxIiB9ICovCisKKwlDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfYWxpZ25fZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKwlyZXNfZGJsID0gKChjbHNfc3RydWN0X2FsaWduKCopKGNsc19zdHJ1Y3RfYWxpZ24sIGNsc19zdHJ1Y3RfYWxpZ24pKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKwkvKiB7IGRnLW91dHB1dCAiXG4xIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNDogOSAxMSAxMyAxNSAxNyAxOSAyMSIgfSAqLworCXByaW50ZigicmVzOiAlTGcgJUxnICVMZyAlTGcgJUxnICVMZyAlTGdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLAorCQlyZXNfZGJsLmMsIHJlc19kYmwuZCwgcmVzX2RibC5lLCByZXNfZGJsLmYsIHJlc19kYmwuZyk7CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiA5IDExIDEzIDE1IDE3IDE5IDIxIiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX2xvbmdkb3VibGVfc3BsaXQyLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTBmNzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9sb25nZG91YmxlX3NwbGl0Mi5jCkBAIC0wLDAgKzEsMTE3IEBACisvKglBcmVhOgkJCWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKwlQdXJwb3NlOgkJQ2hlY2sgc3RydWN0dXJlIGFsaWdubWVudCBvZiBsb25nIGRvdWJsZS4KKwlMaW1pdGF0aW9uczoJbm9uZS4KKwlQUjoJCQkJbm9uZS4KKwlPcmlnaW5hdG9yOgkJQmxha2UgQ2hhZmZpbgk2LzE4LzIwMDcKKyovCisKKy8qIHsgZGctZXhjZXNzLWVycm9ycyAibm8gbG9uZyBkb3VibGUgZm9ybWF0IiB7IHhmYWlsIHg4Nl82NC0qLW1pbmd3KiB4ODZfNjQtKi1jeWd3aW4qIH0gfSAqLworLyogeyBkZy1kbyBydW4geyB4ZmFpbCBzdHJvbmdhcm0qLSotKiB9IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAtbWxvbmctZG91YmxlLTEyOCB7IHRhcmdldCBwb3dlcnBjNjQqLSotbGludXgqIH0gfSAqLworLyogeyBkZy1vdXRwdXQgIiIgeyB4ZmFpbCB4ODZfNjQtKi1taW5ndyogeDg2XzY0LSotY3lnd2luKiB9IH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiB7CisgIGxvbmcgZG91YmxlIGE7CisgIGxvbmcgZG91YmxlIGI7CisgIGxvbmcgZG91YmxlIGM7CisgIGxvbmcgZG91YmxlIGQ7CisgIGxvbmcgZG91YmxlIGU7CisgIGRvdWJsZSBmOworICBsb25nIGRvdWJsZSBnOworfSBjbHNfc3RydWN0X2FsaWduOworCitjbHNfc3RydWN0X2FsaWduIGNsc19zdHJ1Y3RfYWxpZ25fZm4oCisJY2xzX3N0cnVjdF9hbGlnbglhMSwKKwljbHNfc3RydWN0X2FsaWduCWEyKQoreworCXN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHI7CisKKwlyLmEgPSBhMS5hICsgYTIuYTsKKwlyLmIgPSBhMS5iICsgYTIuYjsKKwlyLmMgPSBhMS5jICsgYTIuYzsKKwlyLmQgPSBhMS5kICsgYTIuZDsKKwlyLmUgPSBhMS5lICsgYTIuZTsKKwlyLmYgPSBhMS5mICsgYTIuZjsKKwlyLmcgPSBhMS5nICsgYTIuZzsKKworCXByaW50ZigiJUxnICVMZyAlTGcgJUxnICVMZyAlZyAlTGcgJUxnICVMZyAlTGcgJUxnICVMZyAlZyAlTGc6ICIKKwkJIiVMZyAlTGcgJUxnICVMZyAlTGcgJWcgJUxnXG4iLAorCQlhMS5hLCBhMS5iLCBhMS5jLCBhMS5kLCBhMS5lLCBhMS5mLCBhMS5nLAorCQlhMi5hLCBhMi5iLCBhMi5jLCBhMi5kLCBhMi5lLCBhMi5mLCBhMi5nLAorCQlyLmEsIHIuYiwgci5jLCByLmQsIHIuZSwgci5mLCByLmcpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0X2FsaWduX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywgCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCXN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLCBhMjsKKworCWExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiopKGFyZ3NbMF0pOworCWEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiopKGFyZ3NbMV0pOworCisJKihjbHNfc3RydWN0X2FsaWduKilyZXNwID0gY2xzX3N0cnVjdF9hbGlnbl9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKwlmZmlfY2lmIGNpZjsKKyAgICAgICAgdm9pZCAqY29kZTsKKwlmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworCXZvaWQqIGFyZ3NfZGJsWzNdOworCWZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s4XTsKKwlmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisJZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CisKKwljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisJY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisJY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKwlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNyB9OworCXN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQgfTsKKwlzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCisJY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbM10gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s0XSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzVdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s2XSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzddID0gTlVMTDsKKworCWRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworCWRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworCWRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisJQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworCWFyZ3NfZGJsWzBdID0gJmdfZGJsOworCWFyZ3NfZGJsWzFdID0gJmZfZGJsOworCWFyZ3NfZGJsWzJdID0gTlVMTDsKKworCWZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0X2FsaWduX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKwkvKiB7IGRnLW91dHB1dCAiMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQ6IDkgMTEgMTMgMTUgMTcgMTkgMjEiIH0gKi8KKwlwcmludGYoInJlczogJUxnICVMZyAlTGcgJUxnICVMZyAlZyAlTGdcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLAorCQlyZXNfZGJsLmMsIHJlc19kYmwuZCwgcmVzX2RibC5lLCByZXNfZGJsLmYsIHJlc19kYmwuZyk7CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiA5IDExIDEzIDE1IDE3IDE5IDIxIiB9ICovCisKKwlDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfYWxpZ25fZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKwlyZXNfZGJsID0gKChjbHNfc3RydWN0X2FsaWduKCopKGNsc19zdHJ1Y3RfYWxpZ24sIGNsc19zdHJ1Y3RfYWxpZ24pKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKwkvKiB7IGRnLW91dHB1dCAiXG4xIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNDogOSAxMSAxMyAxNSAxNyAxOSAyMSIgfSAqLworCXByaW50ZigicmVzOiAlTGcgJUxnICVMZyAlTGcgJUxnICVnICVMZ1xuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsCisJCXJlc19kYmwuYywgcmVzX2RibC5kLCByZXNfZGJsLmUsIHJlc19kYmwuZiwgcmVzX2RibC5nKTsKKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDkgMTEgMTMgMTUgMTcgMTkgMjEiIH0gKi8KKworICBleGl0KDApOworfQorCisKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fcG9pbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzRmOTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9wb2ludGVyLmMKQEAgLTAsMCArMSw5NSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIGFsaWdubWVudCBvZiBwb2ludGVyLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8aG9zQHRhbWFuZWdpLm9yZz4gMjAwMzEyMDMJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24geworICB1bnNpZ25lZCBjaGFyIGE7CisgIHZvaWQgKmI7CisgIHVuc2lnbmVkIGNoYXIgYzsKK30gY2xzX3N0cnVjdF9hbGlnbjsKKworY2xzX3N0cnVjdF9hbGlnbiBjbHNfc3RydWN0X2FsaWduX2ZuKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSAodm9pZCAqKSgodWludHB0cl90KWExLmIgKyAodWludHB0cl90KWEyLmIpOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworCisgIHByaW50ZigiJWQgJSIgUFJJdVBUUiAiICVkICVkICUiIFBSSXVQVFIgIiAlZDogJWQgJSIgUFJJdVBUUiAiICVkXG4iLCAKKyAgICAgICAgIGExLmEsICh1aW50cHRyX3QpYTEuYiwgYTEuYywKKwkgYTIuYSwgKHVpbnRwdHJfdClhMi5iLCBhMi5jLAorICAgICAgICAgcmVzdWx0LmEsICh1aW50cHRyX3QpcmVzdWx0LmIsCisJIHJlc3VsdC5jKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF9hbGlnbl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0X2FsaWduKilyZXNwID0gY2xzX3N0cnVjdF9hbGlnbl9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNF07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgKHZvaWQgKik0OTUxLCAxMjcgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsICh2b2lkICopOTMyMCwgMTMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfcG9pbnRlcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF9hbGlnbl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJSIgUFJJdVBUUiAiICVkXG4iLCByZXNfZGJsLmEsICh1aW50cHRyX3QpcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MjcxIDE0MCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF9hbGlnbl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0X2FsaWduKCopKGNsc19zdHJ1Y3RfYWxpZ24sIGNsc19zdHJ1Y3RfYWxpZ24pKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMTIgNDk1MSAxMjcgMSA5MzIwIDEzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICUiIFBSSXVQVFIgIiAlZFxuIiwgcmVzX2RibC5hLCAodWludHB0cl90KXJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDE2LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNlYTQxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDE2LmMKQEAgLTAsMCArMSw5MSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIGFsaWdubWVudCBvZiBzaW50MTYuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxob3NAdGFtYW5lZ2kub3JnPiAyMDAzMTIwMwkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiB7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgc2lnbmVkIHNob3J0IGI7CisgIHVuc2lnbmVkIGNoYXIgYzsKK30gY2xzX3N0cnVjdF9hbGlnbjsKKworY2xzX3N0cnVjdF9hbGlnbiBjbHNfc3RydWN0X2FsaWduX2ZuKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkOiAlZCAlZCAlZFxuIiwgYTEuYSwgYTEuYiwgYTEuYywgYTIuYSwgYTIuYiwgYTIuYywgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYyk7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0X2FsaWduX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfYWxpZ24qKXJlc3AgPSBjbHNfc3RydWN0X2FsaWduX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s0XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCA0OTUxLCAxMjcgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsIDkzMjAsIDEzIH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF9hbGlnbl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MjcxIDE0MCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF9hbGlnbl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0X2FsaWduKCopKGNsc19zdHJ1Y3RfYWxpZ24sIGNsc19zdHJ1Y3RfYWxpZ24pKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMTIgNDk1MSAxMjcgMSA5MzIwIDEzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVkNzhjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fc2ludDMyLmMKQEAgLTAsMCArMSw5MSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIGFsaWdubWVudCBvZiBzaW50MzIuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxob3NAdGFtYW5lZ2kub3JnPiAyMDAzMTIwMwkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiB7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgc2lnbmVkIGludCBiOworICB1bnNpZ25lZCBjaGFyIGM7Cit9IGNsc19zdHJ1Y3RfYWxpZ247CisKK2Nsc19zdHJ1Y3RfYWxpZ24gY2xzX3N0cnVjdF9hbGlnbl9mbihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzdWx0OworCisgIHJlc3VsdC5hID0gYTEuYSArIGEyLmE7CisgIHJlc3VsdC5iID0gYTEuYiArIGEyLmI7CisgIHJlc3VsdC5jID0gYTEuYyArIGEyLmM7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZCAlZCAlZDogJWQgJWQgJWRcbiIsIGExLmEsIGExLmIsIGExLmMsIGEyLmEsIGEyLmIsIGEyLmMsIHJlc3VsdC5hLCByZXN1bHQuYiwgcmVzdWx0LmMpOworCisgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF9hbGlnbl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLCBhMjsKKworICBhMSA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzBdKTsKKyAgYTIgPSAqKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduKikoYXJnc1sxXSk7CisKKyAgKihjbHNfc3RydWN0X2FsaWduKilyZXNwID0gY2xzX3N0cnVjdF9hbGlnbl9mbihhMSwgYTIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbNF07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGdfZGJsID0geyAxMiwgNDk1MSwgMTI3IH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGZfZGJsID0geyAxLCA5MzIwLCAxMyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9zaW50OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbM10gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0X2FsaWduX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyIDQ5NTEgMTI3IDEgOTMyMCAxMzogMTMgMTQyNzEgMTQwIiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTMgMTQyNzEgMTQwIiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0X2FsaWduX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfYWxpZ24oKikoY2xzX3N0cnVjdF9hbGlnbiwgY2xzX3N0cnVjdF9hbGlnbikpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MjcxIDE0MCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3NpbnQ2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDUzYWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl9zaW50NjQuYwpAQCAtMCwwICsxLDkyIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgYWxpZ25tZW50IG9mIHNpbnQ2NC4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGhvc0B0YW1hbmVnaS5vcmc+IDIwMDMxMjAzCSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1Xbm8tZm9ybWF0IiB7IHRhcmdldCBhbHBoYSotZGVjLW9zZiogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHsKKyAgdW5zaWduZWQgY2hhciBhOworICBzaWduZWQgbG9uZyBsb25nIGI7CisgIHVuc2lnbmVkIGNoYXIgYzsKK30gY2xzX3N0cnVjdF9hbGlnbjsKKworY2xzX3N0cnVjdF9hbGlnbiBjbHNfc3RydWN0X2FsaWduX2ZuKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGExLAorCQkJICAgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIGEyKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiByZXN1bHQ7CisKKyAgcmVzdWx0LmEgPSBhMS5hICsgYTIuYTsKKyAgcmVzdWx0LmIgPSBhMS5iICsgYTIuYjsKKyAgcmVzdWx0LmMgPSBhMS5jICsgYTIuYzsKKworICBwcmludGYoIiVkICUiIFBSSWRMTCAiICVkICVkICUiIFBSSWRMTCAiICVkOiAlZCAlIiBQUklkTEwgIiAlZFxuIiwgYTEuYSwgYTEuYiwgYTEuYywgYTIuYSwgYTIuYiwgYTIuYywgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYyk7CisKKyAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0X2FsaWduX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTEsIGEyOworCisgIGExID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiopKGFyZ3NbMF0pOworICBhMiA9ICooc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24qKShhcmdzWzFdKTsKKworICAqKGNsc19zdHJ1Y3RfYWxpZ24qKXJlc3AgPSBjbHNfc3RydWN0X2FsaWduX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNV07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1s0XTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s1XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZ19kYmwgPSB7IDEyLCA0OTUxLCAxMjcgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gZl9kYmwgPSB7IDEsIDkzMjAsIDEzIH07CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3NpbnQ2NDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF9hbGlnbl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJSIgUFJJZExMICIgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MjcxIDE0MCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF9hbGlnbl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0X2FsaWduKCopKGNsc19zdHJ1Y3RfYWxpZ24sIGNsc19zdHJ1Y3RfYWxpZ24pKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMTIgNDk1MSAxMjcgMSA5MzIwIDEzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICUiIFBSSWRMTCAiICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDE2LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjZiNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDE2LmMKQEAgLTAsMCArMSw5MSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIGFsaWdubWVudCBvZiB1aW50MTYuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxob3NAdGFtYW5lZ2kub3JnPiAyMDAzMTIwMwkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiB7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgdW5zaWduZWQgc2hvcnQgYjsKKyAgdW5zaWduZWQgY2hhciBjOworfSBjbHNfc3RydWN0X2FsaWduOworCitjbHNfc3RydWN0X2FsaWduIGNsc19zdHJ1Y3RfYWxpZ25fZm4oc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQgJWQgJWQ6ICVkICVkICVkXG4iLCBhMS5hLCBhMS5iLCBhMS5jLCBhMi5hLCBhMi5iLCBhMi5jLCByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jKTsKKworICByZXR1cm4gIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfYWxpZ25fZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMSwgYTI7CisKKyAgYTEgPSAqKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF9hbGlnbiopcmVzcCA9IGNsc19zdHJ1Y3RfYWxpZ25fZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzRdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdXNob3J0OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbM10gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0X2FsaWduX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyIDQ5NTEgMTI3IDEgOTMyMCAxMzogMTMgMTQyNzEgMTQwIiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlZCAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTMgMTQyNzEgMTQwIiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0X2FsaWduX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfYWxpZ24oKikoY2xzX3N0cnVjdF9hbGlnbiwgY2xzX3N0cnVjdF9hbGlnbikpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MjcxIDE0MCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MzIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2FsaWduX3VpbnQzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTNkM2UKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50MzIuYwpAQCAtMCwwICsxLDkxIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgYWxpZ25tZW50IG9mIHVpbnQzMi4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGhvc0B0YW1hbmVnaS5vcmc+IDIwMDMxMjAzCSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHsKKyAgdW5zaWduZWQgY2hhciBhOworICB1bnNpZ25lZCBpbnQgYjsKKyAgdW5zaWduZWQgY2hhciBjOworfSBjbHNfc3RydWN0X2FsaWduOworCitjbHNfc3RydWN0X2FsaWduIGNsc19zdHJ1Y3RfYWxpZ25fZm4oc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQgJWQgJWQ6ICVkICVkICVkXG4iLCBhMS5hLCBhMS5iLCBhMS5jLCBhMi5hLCBhMi5iLCBhMi5jLCByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jKTsKKworICByZXR1cm4gIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfYWxpZ25fZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMSwgYTI7CisKKyAgYTEgPSAqKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF9hbGlnbiopcmVzcCA9IGNsc19zdHJ1Y3RfYWxpZ25fZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzRdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWludDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZjbHNfc3RydWN0X3R5cGUsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF9hbGlnbl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJWQgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MjcxIDE0MCIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF9hbGlnbl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0X2FsaWduKCopKGNsc19zdHJ1Y3RfYWxpZ24sIGNsc19zdHJ1Y3RfYWxpZ24pKShjb2RlKSkoZ19kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMTIgNDk1MSAxMjcgMSA5MzIwIDEzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkICVkICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMyAxNDI3MSAxNDAiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDY0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19hbGlnbl91aW50NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTVjNzlmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfYWxpZ25fdWludDY0LmMKQEAgLTAsMCArMSw5MyBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIGFsaWdubWVudCBvZiB1aW50NjQuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxob3NAdGFtYW5lZ2kub3JnPiAyMDAzMTIwMwkgKi8KKworCisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1Xbm8tZm9ybWF0IiB7IHRhcmdldCBhbHBoYSotZGVjLW9zZiogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHsKKyAgdW5zaWduZWQgY2hhciBhOworICB1bnNpZ25lZCBsb25nIGxvbmcgYjsKKyAgdW5zaWduZWQgY2hhciBjOworfSBjbHNfc3RydWN0X2FsaWduOworCitjbHNfc3RydWN0X2FsaWduIGNsc19zdHJ1Y3RfYWxpZ25fZm4oc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTEsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gYTIpCit7CisgIHN0cnVjdCBjbHNfc3RydWN0X2FsaWduIHJlc3VsdDsKKworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworCisgIHByaW50ZigiJWQgJSIgUFJJZExMICIgJWQgJWQgJSIgUFJJZExMICIgJWQ6ICVkICUiIFBSSWRMTCAiICVkXG4iLCBhMS5hLCBhMS5iLCBhMS5jLCBhMi5hLCBhMi5iLCBhMi5jLCByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jKTsKKworICByZXR1cm4gIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfYWxpZ25fZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBhMSwgYTI7CisKKyAgYTEgPSAqKHN0cnVjdCBjbHNfc3RydWN0X2FsaWduKikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiopKGFyZ3NbMV0pOworCisgICooY2xzX3N0cnVjdF9hbGlnbiopcmVzcCA9IGNsc19zdHJ1Y3RfYWxpZ25fZm4oYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzRdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBnX2RibCA9IHsgMTIsIDQ5NTEsIDEyNyB9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9hbGlnbiBmX2RibCA9IHsgMSwgOTMyMCwgMTMgfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfYWxpZ24gcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWludDY0OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbM10gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmdfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0X2FsaWduX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEyIDQ5NTEgMTI3IDEgOTMyMCAxMzogMTMgMTQyNzEgMTQwIiB9ICovCisgIHByaW50ZigicmVzOiAlZCAlIiBQUklkTEwgIiAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTMgMTQyNzEgMTQwIiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0X2FsaWduX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfYWxpZ24oKikoY2xzX3N0cnVjdF9hbGlnbiwgY2xzX3N0cnVjdF9hbGlnbikpKGNvZGUpKShnX2RibCwgZl9kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xMiA0OTUxIDEyNyAxIDkzMjAgMTM6IDEzIDE0MjcxIDE0MCIgfSAqLworICBwcmludGYoInJlczogJWQgJSIgUFJJZExMICIgJWRcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEzIDE0MjcxIDE0MCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kYmxzX3N0cnVjdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZGJsc19zdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjBkYWJiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZGJsc19zdHJ1Y3QuYwpAQCAtMCwwICsxLDY2IEBACisvKiBBcmVhOgkJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJCUNoZWNrIGRvdWJsZSBhcmd1bWVudHMgaW4gc3RydWN0cy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUJsYWtlIENoYWZmaW4gNi8yMy8yMDA3CSovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRGJscyB7CisJZG91YmxlIHg7CisJZG91YmxlIHk7Cit9IERibHM7CisKK3ZvaWQKK2Nsb3N1cmVfdGVzdF9mbihEYmxzIHApCit7CisJcHJpbnRmKCIlLjFmICUuMWZcbiIsIHAueCwgcC55KTsKK30KKwordm9pZAorY2xvc3VyZV90ZXN0X2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwIF9fVU5VU0VEX18sCisJCXZvaWQqKiBhcmdzLCB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCWNsb3N1cmVfdGVzdF9mbigqKERibHMqKWFyZ3NbMF0pOworfQorCitpbnQgbWFpbihpbnQgYXJnYyBfX1VOVVNFRF9fLCBjaGFyKiogYXJndiBfX1VOVVNFRF9fKQoreworCWZmaV9jaWYgY2lmOworCisgICAgICAgIHZvaWQgKmNvZGU7CisJZmZpX2Nsb3N1cmUqCXBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKwlmZmlfdHlwZSoJCWNsX2FyZ190eXBlc1sxXTsKKworCWZmaV90eXBlCXRzMV90eXBlOworCWZmaV90eXBlKgl0czFfdHlwZV9lbGVtZW50c1s0XTsKKworCXRzMV90eXBlLnNpemUgPSAwOworCXRzMV90eXBlLmFsaWdubWVudCA9IDA7CisJdHMxX3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKwl0czFfdHlwZS5lbGVtZW50cyA9IHRzMV90eXBlX2VsZW1lbnRzOworCisJdHMxX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworCXRzMV90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKwl0czFfdHlwZV9lbGVtZW50c1syXSA9IE5VTEw7CisKKwljbF9hcmdfdHlwZXNbMF0gPSAmdHMxX3R5cGU7CisKKwlEYmxzIGFyZyA9IHsgMS4wLCAyLjAgfTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworCUNIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsCisJCQkJICZmZmlfdHlwZV92b2lkLCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKwlDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsb3N1cmVfdGVzdF9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworCSgodm9pZCooKikoRGJscykpKGNvZGUpKShhcmcpOworCS8qIHsgZGctb3V0cHV0ICIxLjAgMi4wXG4iIH0gKi8KKworCWNsb3N1cmVfdGVzdF9mbihhcmcpOworCS8qIHsgZGctb3V0cHV0ICIxLjAgMi4wXG4iIH0gKi8KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFkNGNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZG91YmxlLmMKQEAgLTAsMCArMSw0MyBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgZG91YmxlLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwODI4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZCBjbHNfcmV0X2RvdWJsZV9mbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCQkgICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQorIHsKKyAgICooZG91YmxlICopcmVzcCA9ICooZG91YmxlICopYXJnc1swXTsKKworICAgcHJpbnRmKCIlZjogJWZcbiIsKihkb3VibGUgKilhcmdzWzBdLAorCSAgKihkb3VibGUgKilyZXNwKTsKKyB9Cit0eXBlZGVmIGRvdWJsZSAoKmNsc19yZXRfZG91YmxlKShkb3VibGUpOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlICogY2xfYXJnX3R5cGVzWzJdOworICBkb3VibGUgcmVzOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsX2FyZ190eXBlc1sxXSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsCisJCSAgICAgJmZmaV90eXBlX2RvdWJsZSwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3JldF9kb3VibGVfZm4sIE5VTEwsIGNvZGUpICA9PSBGRklfT0spOworCisgIHJlcyA9ICgqKChjbHNfcmV0X2RvdWJsZSljb2RlKSkoMjE0NzQuNzg5KTsKKyAgLyogeyBkZy1vdXRwdXQgIjIxNDc0Ljc4OTAwMDogMjE0NzQuNzg5MDAwIiB9ICovCisgIHByaW50ZigicmVzOiAlLjZmXG4iLCByZXMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDIxNDc0Ljc4OTAwMCIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGVfdmEuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2RvdWJsZV92YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjljYWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19kb3VibGVfdmEuYwpAQCAtMCwwICsxLDYwIEBACisvKiBBcmVhOgkJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJCVRlc3QgZG91YmxlcyBwYXNzZWQgaW4gdmFyaWFibGUgYXJndW1lbnQgbGlzdHMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJCW5vbmUuCisgICBPcmlnaW5hdG9yOglCbGFrZSBDaGFmZmluIDYvNi8yMDA3CSAqLworCisvKiB7IGRnLWRvIHJ1biB7IHhmYWlsIHN0cm9uZ2FybSotKi0qIHhzY2FsZSotKi0qIH0gfSAqLworLyogeyBkZy1vdXRwdXQgIiIgeyB4ZmFpbCBhdnIzMiotKi0qIH0gfSAqLworLyogeyBkZy1vdXRwdXQgIiIgeyB4ZmFpbCBtaXBzLXNnaS1pcml4NiogfSB9IFBSIGxpYmZmaS80NjY2MCAqLworLyogeyBkZy1za2lwLWlmICIiIGFybSotKi0qIHsgIi1tZmxvYXQtYWJpPWhhcmQiIH0geyAiIiB9IH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHZvaWQKK2Nsc19kb3VibGVfdmFfZm4oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIAorCQkgdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisJY2hhcioJZm9ybWF0CQk9ICooY2hhcioqKWFyZ3NbMF07CisJZG91YmxlCWRvdWJsZVZhbHVlCT0gKihkb3VibGUqKWFyZ3NbMV07CisKKwkqKGZmaV9hcmcqKXJlc3AgPSBwcmludGYoZm9ybWF0LCBkb3VibGVWYWx1ZSk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworCWZmaV9jaWYgY2lmOworICAgICAgICB2b2lkICpjb2RlOworCWZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisJdm9pZCogYXJnc1szXTsKKwlmZmlfdHlwZSogYXJnX3R5cGVzWzNdOworCisJY2hhcioJZm9ybWF0CQk9ICIlLjFmXG4iOworCWRvdWJsZQlkb3VibGVBcmcJPSA3OworCWZmaV9hcmcJcmVzCQkJPSAwOworCisJYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3BvaW50ZXI7CisJYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKwlhcmdfdHlwZXNbMl0gPSBOVUxMOworCisJQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmZmaV90eXBlX3NpbnQsCisJCWFyZ190eXBlcykgPT0gRkZJX09LKTsKKworCWFyZ3NbMF0gPSAmZm9ybWF0OworCWFyZ3NbMV0gPSAmZG91YmxlQXJnOworCWFyZ3NbMl0gPSBOVUxMOworCisJZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHByaW50ZiksICZyZXMsIGFyZ3MpOworCS8vIHsgZGctb3V0cHV0ICI3LjAiIH0KKwlwcmludGYoInJlczogJWRcbiIsIChpbnQpIHJlcyk7CisJLy8geyBkZy1vdXRwdXQgIlxucmVzOiA0IiB9CisKKwlDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19kb3VibGVfdmFfZm4sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKwlyZXMJPSAoKGludCgqKShjaGFyKiwgZG91YmxlKSkoY29kZSkpKGZvcm1hdCwgZG91YmxlQXJnKTsKKwkvLyB7IGRnLW91dHB1dCAiXG43LjAiIH0KKwlwcmludGYoInJlczogJWRcbiIsIChpbnQpIHJlcyk7CisJLy8geyBkZy1vdXRwdXQgIlxucmVzOiA0IiB9CisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfZmxvYXQuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2Zsb2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MGZlZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2Zsb2F0LmMKQEAgLTAsMCArMSw0MiBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgZmxvYXQuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3N0YXRpYyB2b2lkIGNsc19yZXRfZmxvYXRfZm4oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkJICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQorIHsKKyAgICooZmxvYXQgKilyZXNwID0gKihmbG9hdCAqKWFyZ3NbMF07CisKKyAgIHByaW50ZigiJWc6ICVnXG4iLCooZmxvYXQgKilhcmdzWzBdLAorCSAgKihmbG9hdCAqKXJlc3ApOworIH0KKwordHlwZWRlZiBmbG9hdCAoKmNsc19yZXRfZmxvYXQpKGZsb2F0KTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1syXTsKKyAgZmxvYXQgcmVzOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gTlVMTDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwKKwkJICAgICAmZmZpX3R5cGVfZmxvYXQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19yZXRfZmxvYXRfZm4sIE5VTEwsIGNvZGUpICA9PSBGRklfT0spOworICByZXMgPSAoKCgoY2xzX3JldF9mbG9hdCljb2RlKSgtMjEyMi4xMikpKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxcLTIxMjIuMTI6IFxcLTIxMjIuMTIiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICUuNmZcbiIsIHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogXC0yMTIyLjEyMDExNyIgfSAqLworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YmFjMWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19sb25nZG91YmxlLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIEFyZWE6CQlmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOgkJQ2hlY2sgbG9uZyBkb3VibGUgYXJndW1lbnRzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjoJQmxha2UgQ2hhZmZpbgkqLworCisvKiB7IGRnLWV4Y2Vzcy1lcnJvcnMgIm5vIGxvbmcgZG91YmxlIGZvcm1hdCIgeyB4ZmFpbCB4ODZfNjQtKi1taW5ndyogeDg2XzY0LSotY3lnd2luKiB9IH0gKi8KKy8qIHsgZGctZG8gcnVuIHsgeGZhaWwgYXJtKi0qLSogc3Ryb25nYXJtKi0qLSogeHNjYWxlKi0qLSogfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgLW1sb25nLWRvdWJsZS0xMjggeyB0YXJnZXQgcG93ZXJwYzY0Ki0qLWxpbnV4KiB9IH0gKi8KKy8qIHsgZGctb3V0cHV0ICIiIHsgeGZhaWwgeDg2XzY0LSotbWluZ3cqIHg4Nl82NC0qLWN5Z3dpbiogfSB9ICovCisKKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK2xvbmcgZG91YmxlIGNsc19sZG91YmxlX2ZuKAorCWxvbmcgZG91YmxlCWExLAorCWxvbmcgZG91YmxlCWEyLAorCWxvbmcgZG91YmxlCWEzLAorCWxvbmcgZG91YmxlCWE0LAorCWxvbmcgZG91YmxlCWE1LAorCWxvbmcgZG91YmxlCWE2LAorCWxvbmcgZG91YmxlCWE3LAorCWxvbmcgZG91YmxlCWE4KQoreworCWxvbmcgZG91YmxlCXIgPSBhMSArIGEyICsgYTMgKyBhNCArIGE1ICsgYTYgKyBhNyArIGE4OworCisJcHJpbnRmKCIlTGcgJUxnICVMZyAlTGcgJUxnICVMZyAlTGcgJUxnOiAlTGdcbiIsCisJCWExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgcik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQKK2Nsc19sZG91YmxlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCAKKwkgICAgICAgdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisJbG9uZyBkb3VibGUJYTEJPSAqKGxvbmcgZG91YmxlKilhcmdzWzBdOworCWxvbmcgZG91YmxlCWEyCT0gKihsb25nIGRvdWJsZSopYXJnc1sxXTsKKwlsb25nIGRvdWJsZQlhMwk9ICoobG9uZyBkb3VibGUqKWFyZ3NbMl07CisJbG9uZyBkb3VibGUJYTQJPSAqKGxvbmcgZG91YmxlKilhcmdzWzNdOworCWxvbmcgZG91YmxlCWE1CT0gKihsb25nIGRvdWJsZSopYXJnc1s0XTsKKwlsb25nIGRvdWJsZQlhNgk9ICoobG9uZyBkb3VibGUqKWFyZ3NbNV07CisJbG9uZyBkb3VibGUJYTcJPSAqKGxvbmcgZG91YmxlKilhcmdzWzZdOworCWxvbmcgZG91YmxlCWE4CT0gKihsb25nIGRvdWJsZSopYXJnc1s3XTsKKworCSoobG9uZyBkb3VibGUqKXJlc3AgPSBjbHNfbGRvdWJsZV9mbigKKwkJYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlmZmlfY2lmCWNpZjsKKyAgICAgICAgdm9pZCogY29kZTsKKwlmZmlfY2xvc3VyZSoJcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworCXZvaWQqCQkJYXJnc1s5XTsKKwlmZmlfdHlwZSoJCWFyZ190eXBlc1s5XTsKKwlsb25nIGRvdWJsZQkJcmVzCT0gMDsKKworCWxvbmcgZG91YmxlCWFyZzEJPSAxOworCWxvbmcgZG91YmxlCWFyZzIJPSAyOworCWxvbmcgZG91YmxlCWFyZzMJPSAzOworCWxvbmcgZG91YmxlCWFyZzQJPSA0OworCWxvbmcgZG91YmxlCWFyZzUJPSA1OworCWxvbmcgZG91YmxlCWFyZzYJPSA2OworCWxvbmcgZG91YmxlCWFyZzcJPSA3OworCWxvbmcgZG91YmxlCWFyZzgJPSA4OworCisJYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJYXJnX3R5cGVzWzNdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJYXJnX3R5cGVzWzRdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJYXJnX3R5cGVzWzVdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJYXJnX3R5cGVzWzZdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJYXJnX3R5cGVzWzddID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJYXJnX3R5cGVzWzhdID0gTlVMTDsKKworCUNIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDgsICZmZmlfdHlwZV9sb25nZG91YmxlLAorCQlhcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKwlhcmdzWzBdID0gJmFyZzE7CisJYXJnc1sxXSA9ICZhcmcyOworCWFyZ3NbMl0gPSAmYXJnMzsKKwlhcmdzWzNdID0gJmFyZzQ7CisJYXJnc1s0XSA9ICZhcmc1OworCWFyZ3NbNV0gPSAmYXJnNjsKKwlhcmdzWzZdID0gJmFyZzc7CisJYXJnc1s3XSA9ICZhcmc4OworCWFyZ3NbOF0gPSBOVUxMOworCisJZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19sZG91YmxlX2ZuKSwgJnJlcywgYXJncyk7CisJLyogeyBkZy1vdXRwdXQgIjEgMiAzIDQgNSA2IDcgODogMzYiIH0gKi8KKwlwcmludGYoInJlczogJUxnXG4iLCByZXMpOworCS8qIHsgZGctb3V0cHV0ICJcbnJlczogMzYiIH0gKi8KKworCUNIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX2xkb3VibGVfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKwlyZXMgPSAoKGxvbmcgZG91YmxlKCopKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUsIGxvbmcgZG91YmxlLAorCQlsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUsIGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSkpKGNvZGUpKShhcmcxLCBhcmcyLAorCQlhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4KTsKKwkvKiB7IGRnLW91dHB1dCAiXG4xIDIgMyA0IDUgNiA3IDg6IDM2IiB9ICovCisJcHJpbnRmKCJyZXM6ICVMZ1xuIiwgcmVzKTsKKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDM2IiB9ICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX2xvbmdkb3VibGVfdmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzc4MGVkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbG9uZ2RvdWJsZV92YS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEFyZWE6CQlmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOgkJVGVzdCBsb25nIGRvdWJsZXMgcGFzc2VkIGluIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3RzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjoJQmxha2UgQ2hhZmZpbiA2LzYvMjAwNwkgKi8KKworLyogeyBkZy1kbyBydW4geyB4ZmFpbCBzdHJvbmdhcm0qLSotKiB4c2NhbGUqLSotKiB9IH0gKi8KKy8qIHsgZGctb3V0cHV0ICIiIHsgeGZhaWwgYXZyMzIqLSotKiB4ODZfNjQtKi1taW5ndyogfSB9ICovCisvKiB7IGRnLW91dHB1dCAiIiB7IHhmYWlsIG1pcHMtc2dpLWlyaXg2KiB9IH0gUFIgbGliZmZpLzQ2NjYwICovCisvKiB7IGRnLXNraXAtaWYgIiIgYXJtKi0qLSogeyAiLW1mbG9hdC1hYmk9aGFyZCIgfSB7ICIiIH0gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZAorY2xzX2xvbmdkb3VibGVfdmFfZm4oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIAorCQkgICAgIHZvaWQqKiBhcmdzLCB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCWNoYXIqCQlmb3JtYXQJPSAqKGNoYXIqKilhcmdzWzBdOworCWxvbmcgZG91YmxlCWxkVmFsdWUJPSAqKGxvbmcgZG91YmxlKilhcmdzWzFdOworCisJKihmZmlfYXJnKilyZXNwID0gcHJpbnRmKGZvcm1hdCwgbGRWYWx1ZSk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworCWZmaV9jaWYgY2lmOworICAgICAgICB2b2lkICpjb2RlOworCWZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisJdm9pZCogYXJnc1szXTsKKwlmZmlfdHlwZSogYXJnX3R5cGVzWzNdOworCisJY2hhcioJCWZvcm1hdAk9ICIlLjFMZlxuIjsKKwlsb25nIGRvdWJsZQlsZEFyZwk9IDc7CisJZmZpX2FyZwkJcmVzCQk9IDA7CisKKwlhcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfcG9pbnRlcjsKKwlhcmdfdHlwZXNbMV0gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKwlhcmdfdHlwZXNbMl0gPSBOVUxMOworCisJQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmZmaV90eXBlX3NpbnQsCisJCWFyZ190eXBlcykgPT0gRkZJX09LKTsKKworCWFyZ3NbMF0gPSAmZm9ybWF0OworCWFyZ3NbMV0gPSAmbGRBcmc7CisJYXJnc1syXSA9IE5VTEw7CisKKwlmZmlfY2FsbCgmY2lmLCBGRklfRk4ocHJpbnRmKSwgJnJlcywgYXJncyk7CisJLy8geyBkZy1vdXRwdXQgIjcuMCIgfQorCXByaW50ZigicmVzOiAlZFxuIiwgKGludCkgcmVzKTsKKwkvLyB7IGRnLW91dHB1dCAiXG5yZXM6IDQiIH0KKworCUNIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX2xvbmdkb3VibGVfdmFfZm4sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKwlyZXMJPSAoKGludCgqKShjaGFyKiwgbG9uZyBkb3VibGUpKShjb2RlKSkoZm9ybWF0LCBsZEFyZyk7CisJLy8geyBkZy1vdXRwdXQgIlxuNy4wIiB9CisJcHJpbnRmKCJyZXM6ICVkXG4iLCAoaW50KSByZXMpOworCS8vIHsgZGctb3V0cHV0ICJcbnJlczogNCIgfQorCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NjaGFyLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zY2hhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGY3YjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zY2hhci5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHBhc3Npbmcgb2YgbXVsdGlwbGUgc2lnbmVkIGNoYXIgdmFsdWVzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCVBSMTMyMjEuCisgICBPcmlnaW5hdG9yOgk8aG9zQHRhbWFuZWdpLm9yZz4gMjAwMzExMjkgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3NpZ25lZCBjaGFyIHRlc3RfZnVuY19mbihzaWduZWQgY2hhciBhMSwgc2lnbmVkIGNoYXIgYTIpCit7CisgIHNpZ25lZCBjaGFyIHJlc3VsdDsKKworICByZXN1bHQgPSBhMSArIGEyOworCisgIHByaW50ZigiJWQgJWQ6ICVkXG4iLCBhMSwgYTIsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2Z1bmNfZ24oZmZpX2NpZiAqY2lmIF9fVU5VU0VEX18sIHZvaWQgKnJ2YWwsIHZvaWQgKiphdmFscywKKwkJCSB2b2lkICpkYXRhIF9fVU5VU0VEX18pCit7CisgIHNpZ25lZCBjaGFyIGExLCBhMjsKKworICBhMSA9ICooc2lnbmVkIGNoYXIgKilhdmFsc1swXTsKKyAgYTIgPSAqKHNpZ25lZCBjaGFyICopYXZhbHNbMV07CisKKyAgKihmZmlfYXJnICopcnZhbCA9IHRlc3RfZnVuY19mbihhMSwgYTIpOworCit9CisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgKCp0ZXN0X3R5cGUpKHNpZ25lZCBjaGFyLCBzaWduZWQgY2hhcik7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCAqIGFyZ3NfZGJsWzNdOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1szXTsKKyAgZmZpX2FyZyByZXNfY2FsbDsKKyAgc2lnbmVkIGNoYXIgYSwgYiwgcmVzX2Nsb3N1cmU7CisKKyAgYSA9IDI7CisgIGIgPSAxMjU7CisKKyAgYXJnc19kYmxbMF0gPSAmYTsKKyAgYXJnc19kYmxbMV0gPSAmYjsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV9zY2hhcjsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3NjaGFyOworICBjbF9hcmdfdHlwZXNbMl0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLAorCQkgICAgICZmZmlfdHlwZV9zY2hhciwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTih0ZXN0X2Z1bmNfZm4pLCAmcmVzX2NhbGwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjIgMTI1OiAxMjciIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLCAoc2lnbmVkIGNoYXIpcmVzX2NhbGwpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDEyNyIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgdGVzdF9mdW5jX2duLCBOVUxMLCBjb2RlKSAgPT0gRkZJX09LKTsKKworICByZXNfY2xvc3VyZSA9ICgqKCh0ZXN0X3R5cGUpY29kZSkpKDIsIDEyNSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjIgMTI1OiAxMjciIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLCByZXNfY2xvc3VyZSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTI3IiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfc3Nob3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzOTE1MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydC5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHBhc3Npbmcgb2YgbXVsdGlwbGUgc2lnbmVkIHNob3J0IHZhbHVlcy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlQUjEzMjIxLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMTEyOSAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc2lnbmVkIHNob3J0IHRlc3RfZnVuY19mbihzaWduZWQgc2hvcnQgYTEsIHNpZ25lZCBzaG9ydCBhMikKK3sKKyAgc2lnbmVkIHNob3J0IHJlc3VsdDsKKworICByZXN1bHQgPSBhMSArIGEyOworCisgIHByaW50ZigiJWQgJWQ6ICVkXG4iLCBhMSwgYTIsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2Z1bmNfZ24oZmZpX2NpZiAqY2lmIF9fVU5VU0VEX18sIHZvaWQgKnJ2YWwsIHZvaWQgKiphdmFscywKKwkJCSB2b2lkICpkYXRhIF9fVU5VU0VEX18pCit7CisgIHNpZ25lZCBzaG9ydCBhMSwgYTI7CisKKyAgYTEgPSAqKHNpZ25lZCBzaG9ydCAqKWF2YWxzWzBdOworICBhMiA9ICooc2lnbmVkIHNob3J0ICopYXZhbHNbMV07CisKKyAgKihmZmlfYXJnICopcnZhbCA9IHRlc3RfZnVuY19mbihhMSwgYTIpOworCit9CisKK3R5cGVkZWYgc2lnbmVkIHNob3J0ICgqdGVzdF90eXBlKShzaWduZWQgc2hvcnQsIHNpZ25lZCBzaG9ydCk7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCAqIGFyZ3NfZGJsWzNdOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1szXTsKKyAgZmZpX2FyZyByZXNfY2FsbDsKKyAgdW5zaWduZWQgc2hvcnQgYSwgYiwgcmVzX2Nsb3N1cmU7CisKKyAgYSA9IDI7CisgIGIgPSAzMjc2NTsKKworICBhcmdzX2RibFswXSA9ICZhOworICBhcmdzX2RibFsxXSA9ICZiOworICBhcmdzX2RibFsyXSA9IE5VTEw7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgY2xfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwKKwkJICAgICAmZmZpX3R5cGVfc3Nob3J0LCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHRlc3RfZnVuY19mbiksICZyZXNfY2FsbCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMiAzMjc2NTogMzI3NjciIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLCAodW5zaWduZWQgc2hvcnQpcmVzX2NhbGwpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDMyNzY3IiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCB0ZXN0X2Z1bmNfZ24sIE5VTEwsIGNvZGUpICA9PSBGRklfT0spOworCisgIHJlc19jbG9zdXJlID0gKCooKHRlc3RfdHlwZSljb2RlKSkoMiwgMzI3NjUpOworICAvKiB7IGRnLW91dHB1dCAiXG4yIDMyNzY1OiAzMjc2NyIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsIHJlc19jbG9zdXJlKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAzMjc2NyIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnRjaGFyLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV9zc2hvcnRjaGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzYWViNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3NzaG9ydGNoYXIuYwpAQCAtMCwwICsxLDg2IEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBwYXNzaW5nIG9mIG11bHRpcGxlIHNpZ25lZCBzaG9ydC9jaGFyIHZhbHVlcy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlQUjEzMjIxLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMTEyOSAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc2lnbmVkIHNob3J0IHRlc3RfZnVuY19mbihzaWduZWQgY2hhciBhMSwgc2lnbmVkIHNob3J0IGEyLAorCQkJICBzaWduZWQgY2hhciBhMywgc2lnbmVkIHNob3J0IGE0KQoreworICBzaWduZWQgc2hvcnQgcmVzdWx0OworCisgIHJlc3VsdCA9IGExICsgYTIgKyBhMyArIGE0OworCisgIHByaW50ZigiJWQgJWQgJWQgJWQ6ICVkXG4iLCBhMSwgYTIsIGEzLCBhNCwgcmVzdWx0KTsKKworICByZXR1cm4gcmVzdWx0OworCit9CisKK3N0YXRpYyB2b2lkIHRlc3RfZnVuY19nbihmZmlfY2lmICpjaWYgX19VTlVTRURfXywgdm9pZCAqcnZhbCwgdm9pZCAqKmF2YWxzLAorCQkJIHZvaWQgKmRhdGEgX19VTlVTRURfXykKK3sKKyAgc2lnbmVkIGNoYXIgYTEsIGEzOworICBzaWduZWQgc2hvcnQgYTIsIGE0OworCisgIGExID0gKihzaWduZWQgY2hhciAqKWF2YWxzWzBdOworICBhMiA9ICooc2lnbmVkIHNob3J0ICopYXZhbHNbMV07CisgIGEzID0gKihzaWduZWQgY2hhciAqKWF2YWxzWzJdOworICBhNCA9ICooc2lnbmVkIHNob3J0ICopYXZhbHNbM107CisKKyAgKihmZmlfYXJnICopcnZhbCA9IHRlc3RfZnVuY19mbihhMSwgYTIsIGEzLCBhNCk7CisKK30KKwordHlwZWRlZiBzaWduZWQgc2hvcnQgKCp0ZXN0X3R5cGUpKHNpZ25lZCBjaGFyLCBzaWduZWQgc2hvcnQsCisJCQkJICBzaWduZWQgY2hhciwgc2lnbmVkIHNob3J0KTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkICogYXJnc19kYmxbNV07CisgIGZmaV90eXBlICogY2xfYXJnX3R5cGVzWzVdOworICBmZmlfYXJnIHJlc19jYWxsOworICBzaWduZWQgY2hhciBhLCBjOworICBzaWduZWQgc2hvcnQgYiwgZCwgcmVzX2Nsb3N1cmU7CisKKyAgYSA9IDE7CisgIGIgPSAzMjc2NTsKKyAgYyA9IDEyNzsKKyAgZCA9IC0xMjg7CisKKyAgYXJnc19kYmxbMF0gPSAmYTsKKyAgYXJnc19kYmxbMV0gPSAmYjsKKyAgYXJnc19kYmxbMl0gPSAmYzsKKyAgYXJnc19kYmxbM10gPSAmZDsKKyAgYXJnc19kYmxbNF0gPSBOVUxMOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV9zY2hhcjsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgY2xfYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX3NjaGFyOworICBjbF9hcmdfdHlwZXNbM10gPSAmZmZpX3R5cGVfc3Nob3J0OworICBjbF9hcmdfdHlwZXNbNF0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA0LAorCQkgICAgICZmZmlfdHlwZV9zc2hvcnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4odGVzdF9mdW5jX2ZuKSwgJnJlc19jYWxsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDMyNzY1IDEyNyAtMTI4OiAzMjc2NSIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsIChzaWduZWQgc2hvcnQpcmVzX2NhbGwpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDMyNzY1IiB9ICovCisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCB0ZXN0X2Z1bmNfZ24sIE5VTEwsIGNvZGUpICA9PSBGRklfT0spOworCisgIHJlc19jbG9zdXJlID0gKCooKHRlc3RfdHlwZSljb2RlKSkoMSwgMzI3NjUsIDEyNywgLTEyOCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgMzI3NjUgMTI3IC0xMjg6IDMyNzY1IiB9ICovCisgIHByaW50ZigicmVzOiAlZFxuIiwgcmVzX2Nsb3N1cmUpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDMyNzY1IiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VjaGFyLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91Y2hhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOWMwMmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91Y2hhci5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHBhc3Npbmcgb2YgbXVsdGlwbGUgdW5zaWduZWQgY2hhciB2YWx1ZXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJUFIxMzIyMS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzExMjkgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3Vuc2lnbmVkIGNoYXIgdGVzdF9mdW5jX2ZuKHVuc2lnbmVkIGNoYXIgYTEsIHVuc2lnbmVkIGNoYXIgYTIsCisJCQkgICB1bnNpZ25lZCBjaGFyIGEzLCB1bnNpZ25lZCBjaGFyIGE0KQoreworICB1bnNpZ25lZCBjaGFyIHJlc3VsdDsKKworICByZXN1bHQgPSBhMSArIGEyICsgYTMgKyBhNDsKKworICBwcmludGYoIiVkICVkICVkICVkOiAlZFxuIiwgYTEsIGEyLCBhMywgYTQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2Z1bmNfZ24oZmZpX2NpZiAqY2lmIF9fVU5VU0VEX18sIHZvaWQgKnJ2YWwsIHZvaWQgKiphdmFscywKKwkJCSB2b2lkICpkYXRhIF9fVU5VU0VEX18pCit7CisgIHVuc2lnbmVkIGNoYXIgYTEsIGEyLCBhMywgYTQ7CisKKyAgYTEgPSAqKHVuc2lnbmVkIGNoYXIgKilhdmFsc1swXTsKKyAgYTIgPSAqKHVuc2lnbmVkIGNoYXIgKilhdmFsc1sxXTsKKyAgYTMgPSAqKHVuc2lnbmVkIGNoYXIgKilhdmFsc1syXTsKKyAgYTQgPSAqKHVuc2lnbmVkIGNoYXIgKilhdmFsc1szXTsKKworICAqKGZmaV9hcmcgKilydmFsID0gdGVzdF9mdW5jX2ZuKGExLCBhMiwgYTMsIGE0KTsKKworfQorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKCp0ZXN0X3R5cGUpKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIsCisJCQkJICAgdW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhcik7CisKK3ZvaWQgdGVzdF9mdW5jKGZmaV9jaWYgKmNpZiBfX1VOVVNFRF9fLCB2b2lkICpydmFsIF9fVU5VU0VEX18sIHZvaWQgKiphdmFscywKKwkgICAgICAgdm9pZCAqZGF0YSBfX1VOVVNFRF9fKQoreworICBwcmludGYoIiVkICVkICVkICVkXG4iLCAqKHVuc2lnbmVkIGNoYXIgKilhdmFsc1swXSwKKwkgKih1bnNpZ25lZCBjaGFyICopYXZhbHNbMV0sICoodW5zaWduZWQgY2hhciAqKWF2YWxzWzJdLAorCSAqKHVuc2lnbmVkIGNoYXIgKilhdmFsc1szXSk7Cit9CitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQgKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbNV07CisgIGZmaV9hcmcgcmVzX2NhbGw7CisgIHVuc2lnbmVkIGNoYXIgYSwgYiwgYywgZCwgcmVzX2Nsb3N1cmU7CisKKyAgYSA9IDE7CisgIGIgPSAyOworICBjID0gMTI3OworICBkID0gMTI1OworCisgIGFyZ3NfZGJsWzBdID0gJmE7CisgIGFyZ3NfZGJsWzFdID0gJmI7CisgIGFyZ3NfZGJsWzJdID0gJmM7CisgIGFyZ3NfZGJsWzNdID0gJmQ7CisgIGFyZ3NfZGJsWzRdID0gTlVMTDsKKworICBjbF9hcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsX2FyZ190eXBlc1sxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xfYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX3VjaGFyOworICBjbF9hcmdfdHlwZXNbM10gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsX2FyZ190eXBlc1s0XSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDQsCisJCSAgICAgJmZmaV90eXBlX3VjaGFyLCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHRlc3RfZnVuY19mbiksICZyZXNfY2FsbCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMSAyIDEyNyAxMjU6IDI1NSIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsICh1bnNpZ25lZCBjaGFyKXJlc19jYWxsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyNTUiIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIHRlc3RfZnVuY19nbiwgTlVMTCwgY29kZSkgID09IEZGSV9PSyk7CisKKyAgcmVzX2Nsb3N1cmUgPSAoKigodGVzdF90eXBlKWNvZGUpKSgxLCAyLCAxMjcsIDEyNSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgMiAxMjcgMTI1OiAyNTUiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLCByZXNfY2xvc3VyZSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMjU1IiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxMGNhNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX211bHRpX3VzaG9ydC5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHBhc3Npbmcgb2YgbXVsdGlwbGUgdW5zaWduZWQgc2hvcnQgdmFsdWVzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCVBSMTMyMjEuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMxMTI5ICAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit1bnNpZ25lZCBzaG9ydCB0ZXN0X2Z1bmNfZm4odW5zaWduZWQgc2hvcnQgYTEsIHVuc2lnbmVkIHNob3J0IGEyKQoreworICB1bnNpZ25lZCBzaG9ydCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gYTEgKyBhMjsKKworICBwcmludGYoIiVkICVkOiAlZFxuIiwgYTEsIGEyLCByZXN1bHQpOworCisgIHJldHVybiByZXN1bHQ7CisKK30KKworc3RhdGljIHZvaWQgdGVzdF9mdW5jX2duKGZmaV9jaWYgKmNpZiBfX1VOVVNFRF9fLCB2b2lkICpydmFsLCB2b2lkICoqYXZhbHMsCisJCQkgdm9pZCAqZGF0YSBfX1VOVVNFRF9fKQoreworICB1bnNpZ25lZCBzaG9ydCBhMSwgYTI7CisKKyAgYTEgPSAqKHVuc2lnbmVkIHNob3J0ICopYXZhbHNbMF07CisgIGEyID0gKih1bnNpZ25lZCBzaG9ydCAqKWF2YWxzWzFdOworCisgICooZmZpX2FyZyAqKXJ2YWwgPSB0ZXN0X2Z1bmNfZm4oYTEsIGEyKTsKKworfQorCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICgqdGVzdF90eXBlKSh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQgKiBhcmdzX2RibFszXTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbM107CisgIGZmaV9hcmcgcmVzX2NhbGw7CisgIHVuc2lnbmVkIHNob3J0IGEsIGIsIHJlc19jbG9zdXJlOworCisgIGEgPSAyOworICBiID0gMzI3NjU7CisKKyAgYXJnc19kYmxbMF0gPSAmYTsKKyAgYXJnc19kYmxbMV0gPSAmYjsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGNsX2FyZ190eXBlc1sxXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIGNsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsCisJCSAgICAgJmZmaV90eXBlX3VzaG9ydCwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTih0ZXN0X2Z1bmNfZm4pLCAmcmVzX2NhbGwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjIgMzI3NjU6IDMyNzY3IiB9ICovCisgIHByaW50ZigicmVzOiAlZFxuIiwgKHVuc2lnbmVkIHNob3J0KXJlc19jYWxsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAzMjc2NyIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgdGVzdF9mdW5jX2duLCBOVUxMLCBjb2RlKSAgPT0gRkZJX09LKTsKKworICByZXNfY2xvc3VyZSA9ICgqKCh0ZXN0X3R5cGUpY29kZSkpKDIsIDMyNzY1KTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMiAzMjc2NTogMzI3NjciIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLCByZXNfY2xvc3VyZSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMzI3NjciIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0Y2hhci5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfbXVsdGlfdXNob3J0Y2hhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODhlOTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19tdWx0aV91c2hvcnRjaGFyLmMKQEAgLTAsMCArMSw4NiBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcGFzc2luZyBvZiBtdWx0aXBsZSB1bnNpZ25lZCBzaG9ydC9jaGFyIHZhbHVlcy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlQUjEzMjIxLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMTEyOSAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordW5zaWduZWQgc2hvcnQgdGVzdF9mdW5jX2ZuKHVuc2lnbmVkIGNoYXIgYTEsIHVuc2lnbmVkIHNob3J0IGEyLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgYTMsIHVuc2lnbmVkIHNob3J0IGE0KQoreworICB1bnNpZ25lZCBzaG9ydCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gYTEgKyBhMiArIGEzICsgYTQ7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZDogJWRcbiIsIGExLCBhMiwgYTMsIGE0LCByZXN1bHQpOworCisgIHJldHVybiByZXN1bHQ7CisKK30KKworc3RhdGljIHZvaWQgdGVzdF9mdW5jX2duKGZmaV9jaWYgKmNpZiBfX1VOVVNFRF9fLCB2b2lkICpydmFsLCB2b2lkICoqYXZhbHMsCisJCQkgdm9pZCAqZGF0YSBfX1VOVVNFRF9fKQoreworICB1bnNpZ25lZCBjaGFyIGExLCBhMzsKKyAgdW5zaWduZWQgc2hvcnQgYTIsIGE0OworCisgIGExID0gKih1bnNpZ25lZCBjaGFyICopYXZhbHNbMF07CisgIGEyID0gKih1bnNpZ25lZCBzaG9ydCAqKWF2YWxzWzFdOworICBhMyA9ICoodW5zaWduZWQgY2hhciAqKWF2YWxzWzJdOworICBhNCA9ICoodW5zaWduZWQgc2hvcnQgKilhdmFsc1szXTsKKworICAqKGZmaV9hcmcgKilydmFsID0gdGVzdF9mdW5jX2ZuKGExLCBhMiwgYTMsIGE0KTsKKworfQorCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICgqdGVzdF90eXBlKSh1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBzaG9ydCwKKwkJCQkgICB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBzaG9ydCk7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCAqIGFyZ3NfZGJsWzVdOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1s1XTsKKyAgZmZpX2FyZyByZXNfY2FsbDsKKyAgdW5zaWduZWQgY2hhciBhLCBjOworICB1bnNpZ25lZCBzaG9ydCBiLCBkLCByZXNfY2xvc3VyZTsKKworICBhID0gMTsKKyAgYiA9IDI7CisgIGMgPSAxMjc7CisgIGQgPSAxMjg7CisKKyAgYXJnc19kYmxbMF0gPSAmYTsKKyAgYXJnc19kYmxbMV0gPSAmYjsKKyAgYXJnc19kYmxbMl0gPSAmYzsKKyAgYXJnc19kYmxbM10gPSAmZDsKKyAgYXJnc19kYmxbNF0gPSBOVUxMOworCisgIGNsX2FyZ190eXBlc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3VzaG9ydDsKKyAgY2xfYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX3VjaGFyOworICBjbF9hcmdfdHlwZXNbM10gPSAmZmZpX3R5cGVfdXNob3J0OworICBjbF9hcmdfdHlwZXNbNF0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA0LAorCQkgICAgICZmZmlfdHlwZV91c2hvcnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4odGVzdF9mdW5jX2ZuKSwgJnJlc19jYWxsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDIgMTI3IDEyODogMjU4IiB9ICovCisgIHByaW50ZigicmVzOiAlZFxuIiwgKHVuc2lnbmVkIHNob3J0KXJlc19jYWxsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyNTgiIH0gKi8KKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIHRlc3RfZnVuY19nbiwgTlVMTCwgY29kZSkgID09IEZGSV9PSyk7CisKKyAgcmVzX2Nsb3N1cmUgPSAoKigodGVzdF90eXBlKWNvZGUpKSgxLCAyLCAxMjcsIDEyOCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgMiAxMjcgMTI4OiAyNTgiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLCByZXNfY2xvc3VyZSk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMjU4IiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAzOTkzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfcG9pbnRlci5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEFyZWE6CQlmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOgkJQ2hlY2sgcG9pbnRlciBhcmd1bWVudHMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJCW5vbmUuCisgICBPcmlnaW5hdG9yOglCbGFrZSBDaGFmZmluIDYvNi8yMDA3CSovCisKKy8qIHsgZGctZG8gcnVuIHsgeGZhaWwgc3Ryb25nYXJtKi0qLSogeHNjYWxlKi0qLSogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit2b2lkKiBjbHNfcG9pbnRlcl9mbih2b2lkKiBhMSwgdm9pZCogYTIpCit7CisJdm9pZCoJcmVzdWx0CT0gKHZvaWQqKSgoaW50cHRyX3QpYTEgKyAoaW50cHRyX3QpYTIpOworCisJcHJpbnRmKCIweCUwOHggMHglMDh4OiAweCUwOHhcbiIsIAorCSAgICAgICAodW5zaWduZWQgaW50KSh1aW50cHRyX3QpIGExLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkodWludHB0cl90KSBhMiwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKHVpbnRwdHJfdCkgcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfcG9pbnRlcl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgCisJICAgICAgIHZvaWQqKiBhcmdzLCB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworCXZvaWQqCWExCT0gKih2b2lkKiopKGFyZ3NbMF0pOworCXZvaWQqCWEyCT0gKih2b2lkKiopKGFyZ3NbMV0pOworCisJKih2b2lkKiopcmVzcCA9IGNsc19wb2ludGVyX2ZuKGExLCBhMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworCWZmaV9jaWYJY2lmOworICAgICAgICB2b2lkICpjb2RlOworCWZmaV9jbG9zdXJlKglwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisJdm9pZCoJCQlhcmdzWzNdOworLy8JZmZpX3R5cGUJCWNsc19wb2ludGVyX3R5cGU7CisJZmZpX3R5cGUqCQlhcmdfdHlwZXNbM107CisKKy8qCWNsc19wb2ludGVyX3R5cGUuc2l6ZSA9IHNpemVvZih2b2lkKik7CisJY2xzX3BvaW50ZXJfdHlwZS5hbGlnbm1lbnQgPSAwOworCWNsc19wb2ludGVyX3R5cGUudHlwZSA9IEZGSV9UWVBFX1BPSU5URVI7CisJY2xzX3BvaW50ZXJfdHlwZS5lbGVtZW50cyA9IE5VTEw7Ki8KKworCXZvaWQqCWFyZzEJPSAodm9pZCopMHgxMjM0NTY3ODsKKwl2b2lkKglhcmcyCT0gKHZvaWQqKTB4ODlhYmNkZWY7CisJZmZpX2FyZwlyZXMJCT0gMDsKKworCWFyZ190eXBlc1swXSA9ICZmZmlfdHlwZV9wb2ludGVyOworCWFyZ190eXBlc1sxXSA9ICZmZmlfdHlwZV9wb2ludGVyOworCWFyZ190eXBlc1syXSA9IE5VTEw7CisKKwlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmZmZpX3R5cGVfcG9pbnRlciwKKwkJYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisJYXJnc1swXSA9ICZhcmcxOworCWFyZ3NbMV0gPSAmYXJnMjsKKwlhcmdzWzJdID0gTlVMTDsKKworCWZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfcG9pbnRlcl9mbiksICZyZXMsIGFyZ3MpOworCS8qIHsgZGctb3V0cHV0ICIweDEyMzQ1Njc4IDB4ODlhYmNkZWY6IDB4OWJlMDI0NjciIH0gKi8KKwlwcmludGYoInJlczogMHglMDh4XG4iLCAodW5zaWduZWQgaW50KSByZXMpOworCS8qIHsgZGctb3V0cHV0ICJcbnJlczogMHg5YmUwMjQ2NyIgfSAqLworCisJQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfcG9pbnRlcl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworCXJlcyA9IChmZmlfYXJnKSh1aW50cHRyX3QpKCh2b2lkKigqKSh2b2lkKiwgdm9pZCopKShjb2RlKSkoYXJnMSwgYXJnMik7CisJLyogeyBkZy1vdXRwdXQgIlxuMHgxMjM0NTY3OCAweDg5YWJjZGVmOiAweDliZTAyNDY3IiB9ICovCisJcHJpbnRmKCJyZXM6IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCkgcmVzKTsKKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDB4OWJlMDI0NjciIH0gKi8KKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19wb2ludGVyX3N0YWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzMWNmOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3BvaW50ZXJfc3RhY2suYwpAQCAtMCwwICsxLDE0MCBAQAorLyogQXJlYToJCWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CQlDaGVjayBwb2ludGVyIGFyZ3VtZW50cyBhY3Jvc3MgbXVsdGlwbGUgaGlkZW91cyBzdGFjayBmcmFtZXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJCW5vbmUuCisgICBPcmlnaW5hdG9yOglCbGFrZSBDaGFmZmluIDYvNy8yMDA3CSovCisKKy8qIHsgZGctZG8gcnVuIHsgeGZhaWwgc3Ryb25nYXJtKi0qLSogeHNjYWxlKi0qLSogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMJbG9uZyBkdW1teVZhcjsKKworbG9uZyBkdW1teV9mdW5jKAorCWxvbmcgZG91YmxlIGExLCBjaGFyIGIxLAorCWxvbmcgZG91YmxlIGEyLCBjaGFyIGIyLAorCWxvbmcgZG91YmxlIGEzLCBjaGFyIGIzLAorCWxvbmcgZG91YmxlIGE0LCBjaGFyIGI0KQoreworCXJldHVybiBhMSArIGIxICsgYTIgKyBiMiArIGEzICsgYjMgKyBhNCArIGI0OworfQorCit2b2lkKiBjbHNfcG9pbnRlcl9mbjIodm9pZCogYTEsIHZvaWQqIGEyKQoreworCWxvbmcgZG91YmxlCXRyYW1wbGUxCT0gKGludHB0cl90KWExICsgKGludHB0cl90KWEyOworCWNoYXIJCXRyYW1wbGUyCT0gKChjaGFyKikmYTEpWzBdICsgKChjaGFyKikmYTIpWzBdOworCWxvbmcgZG91YmxlCXRyYW1wbGUzCT0gKGludHB0cl90KXRyYW1wbGUxICsgKGludHB0cl90KWExOworCWNoYXIJCXRyYW1wbGU0CT0gdHJhbXBsZTIgKyAoKGNoYXIqKSZhMSlbMV07CisJbG9uZyBkb3VibGUJdHJhbXBsZTUJPSAoaW50cHRyX3QpdHJhbXBsZTMgKyAoaW50cHRyX3QpYTI7CisJY2hhcgkJdHJhbXBsZTYJPSB0cmFtcGxlNCArICgoY2hhciopJmEyKVsxXTsKKwlsb25nIGRvdWJsZQl0cmFtcGxlNwk9IChpbnRwdHJfdCl0cmFtcGxlNSArIChpbnRwdHJfdCl0cmFtcGxlMTsKKwljaGFyCQl0cmFtcGxlOAk9IHRyYW1wbGU2ICsgdHJhbXBsZTI7CisKKwlkdW1teVZhcgk9IGR1bW15X2Z1bmModHJhbXBsZTEsIHRyYW1wbGUyLCB0cmFtcGxlMywgdHJhbXBsZTQsCisJCXRyYW1wbGU1LCB0cmFtcGxlNiwgdHJhbXBsZTcsIHRyYW1wbGU4KTsKKworCXZvaWQqCXJlc3VsdAk9ICh2b2lkKikoKGludHB0cl90KWExICsgKGludHB0cl90KWEyKTsKKworCXByaW50ZigiMHglMDh4IDB4JTA4eDogMHglMDh4XG4iLCAKKwkgICAgICAgKHVuc2lnbmVkIGludCkodWludHB0cl90KSBhMSwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKHVpbnRwdHJfdCkgYTIsCisgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSh1aW50cHRyX3QpIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkKiBjbHNfcG9pbnRlcl9mbjEodm9pZCogYTEsIHZvaWQqIGEyKQoreworCWxvbmcgZG91YmxlCXRyYW1wbGUxCT0gKGludHB0cl90KWExICsgKGludHB0cl90KWEyOworCWNoYXIJCXRyYW1wbGUyCT0gKChjaGFyKikmYTEpWzBdICsgKChjaGFyKikmYTIpWzBdOworCWxvbmcgZG91YmxlCXRyYW1wbGUzCT0gKGludHB0cl90KXRyYW1wbGUxICsgKGludHB0cl90KWExOworCWNoYXIJCXRyYW1wbGU0CT0gdHJhbXBsZTIgKyAoKGNoYXIqKSZhMSlbMV07CisJbG9uZyBkb3VibGUJdHJhbXBsZTUJPSAoaW50cHRyX3QpdHJhbXBsZTMgKyAoaW50cHRyX3QpYTI7CisJY2hhcgkJdHJhbXBsZTYJPSB0cmFtcGxlNCArICgoY2hhciopJmEyKVsxXTsKKwlsb25nIGRvdWJsZQl0cmFtcGxlNwk9IChpbnRwdHJfdCl0cmFtcGxlNSArIChpbnRwdHJfdCl0cmFtcGxlMTsKKwljaGFyCQl0cmFtcGxlOAk9IHRyYW1wbGU2ICsgdHJhbXBsZTI7CisKKwlkdW1teVZhcgk9IGR1bW15X2Z1bmModHJhbXBsZTEsIHRyYW1wbGUyLCB0cmFtcGxlMywgdHJhbXBsZTQsCisJCXRyYW1wbGU1LCB0cmFtcGxlNiwgdHJhbXBsZTcsIHRyYW1wbGU4KTsKKworCXZvaWQqCXJlc3VsdAk9ICh2b2lkKikoKGludHB0cl90KWExICsgKGludHB0cl90KWEyKTsKKworCXByaW50ZigiMHglMDh4IDB4JTA4eDogMHglMDh4XG4iLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoaW50cHRyX3QpIGExLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoaW50cHRyX3QpIGEyLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoaW50cHRyX3QpIHJlc3VsdCk7CisKKwlyZXN1bHQJPSBjbHNfcG9pbnRlcl9mbjIocmVzdWx0LCBhMSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3BvaW50ZXJfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIAorCSAgICAgICB2b2lkKiogYXJncywgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKwl2b2lkKglhMQk9ICoodm9pZCoqKShhcmdzWzBdKTsKKwl2b2lkKglhMgk9ICoodm9pZCoqKShhcmdzWzFdKTsKKworCWxvbmcgZG91YmxlCXRyYW1wbGUxCT0gKGludHB0cl90KWExICsgKGludHB0cl90KWEyOworCWNoYXIJCXRyYW1wbGUyCT0gKChjaGFyKikmYTEpWzBdICsgKChjaGFyKikmYTIpWzBdOworCWxvbmcgZG91YmxlCXRyYW1wbGUzCT0gKGludHB0cl90KXRyYW1wbGUxICsgKGludHB0cl90KWExOworCWNoYXIJCXRyYW1wbGU0CT0gdHJhbXBsZTIgKyAoKGNoYXIqKSZhMSlbMV07CisJbG9uZyBkb3VibGUJdHJhbXBsZTUJPSAoaW50cHRyX3QpdHJhbXBsZTMgKyAoaW50cHRyX3QpYTI7CisJY2hhcgkJdHJhbXBsZTYJPSB0cmFtcGxlNCArICgoY2hhciopJmEyKVsxXTsKKwlsb25nIGRvdWJsZQl0cmFtcGxlNwk9IChpbnRwdHJfdCl0cmFtcGxlNSArIChpbnRwdHJfdCl0cmFtcGxlMTsKKwljaGFyCQl0cmFtcGxlOAk9IHRyYW1wbGU2ICsgdHJhbXBsZTI7CisKKwlkdW1teVZhcgk9IGR1bW15X2Z1bmModHJhbXBsZTEsIHRyYW1wbGUyLCB0cmFtcGxlMywgdHJhbXBsZTQsCisJCXRyYW1wbGU1LCB0cmFtcGxlNiwgdHJhbXBsZTcsIHRyYW1wbGU4KTsKKworCSoodm9pZCoqKXJlc3AgPSBjbHNfcG9pbnRlcl9mbjEoYTEsIGEyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisJZmZpX2NpZgljaWY7CisgICAgICAgIHZvaWQgKmNvZGU7CisJZmZpX2Nsb3N1cmUqCXBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKwl2b2lkKgkJCWFyZ3NbM107CisvLwlmZmlfdHlwZQkJY2xzX3BvaW50ZXJfdHlwZTsKKwlmZmlfdHlwZSoJCWFyZ190eXBlc1szXTsKKworLyoJY2xzX3BvaW50ZXJfdHlwZS5zaXplID0gc2l6ZW9mKHZvaWQqKTsKKwljbHNfcG9pbnRlcl90eXBlLmFsaWdubWVudCA9IDA7CisJY2xzX3BvaW50ZXJfdHlwZS50eXBlID0gRkZJX1RZUEVfUE9JTlRFUjsKKwljbHNfcG9pbnRlcl90eXBlLmVsZW1lbnRzID0gTlVMTDsqLworCisJdm9pZCoJYXJnMQk9ICh2b2lkKikweDAxMjM0NTY3OworCXZvaWQqCWFyZzIJPSAodm9pZCopMHg4OWFiY2RlZjsKKwlmZmlfYXJnCXJlcwkJPSAwOworCisJYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3BvaW50ZXI7CisJYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX3BvaW50ZXI7CisJYXJnX3R5cGVzWzJdID0gTlVMTDsKKworCUNIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZmZmlfdHlwZV9wb2ludGVyLAorCQlhcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKwlhcmdzWzBdID0gJmFyZzE7CisJYXJnc1sxXSA9ICZhcmcyOworCWFyZ3NbMl0gPSBOVUxMOworCisJcHJpbnRmKCJcbiIpOworCWZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfcG9pbnRlcl9mbjEpLCAmcmVzLCBhcmdzKTsKKworCXByaW50ZigicmVzOiAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIHJlcyk7CisJLy8geyBkZy1vdXRwdXQgIlxuMHgwMTIzNDU2NyAweDg5YWJjZGVmOiAweDhhY2YxMzU2IiB9CisJLy8geyBkZy1vdXRwdXQgIlxuMHg4YWNmMTM1NiAweDAxMjM0NTY3OiAweDhiZjI1OGJkIiB9CisJLy8geyBkZy1vdXRwdXQgIlxucmVzOiAweDhiZjI1OGJkIiB9CisKKwlDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19wb2ludGVyX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisJcmVzID0gKGZmaV9hcmcpKHVpbnRwdHJfdCkoKHZvaWQqKCopKHZvaWQqLCB2b2lkKikpKGNvZGUpKShhcmcxLCBhcmcyKTsKKworCXByaW50ZigicmVzOiAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIHJlcyk7CisJLy8geyBkZy1vdXRwdXQgIlxuMHgwMTIzNDU2NyAweDg5YWJjZGVmOiAweDhhY2YxMzU2IiB9CisJLy8geyBkZy1vdXRwdXQgIlxuMHg4YWNmMTM1NiAweDAxMjM0NTY3OiAweDhiZjI1OGJkIiB9CisJLy8geyBkZy1vdXRwdXQgIlxucmVzOiAweDhiZjI1OGJkIiB9CisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc2NoYXIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NjaGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5ODZiMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NjaGFyLmMKQEAgLTAsMCArMSw0NCBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgc2NoYXIuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzExMDgJICovCisKKworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZCBjbHNfcmV0X3NjaGFyX2ZuKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJCSAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKyAgKihmZmlfYXJnKilyZXNwID0gKihzaWduZWQgY2hhciAqKWFyZ3NbMF07CisgIHByaW50ZigiJWQ6ICVkXG4iLCooc2lnbmVkIGNoYXIgKilhcmdzWzBdLAorCSAoaW50KSooZmZpX2FyZyAqKShyZXNwKSk7Cit9Cit0eXBlZGVmIHNpZ25lZCBjaGFyICgqY2xzX3JldF9zY2hhcikoc2lnbmVkIGNoYXIpOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlICogY2xfYXJnX3R5cGVzWzJdOworICBzaWduZWQgY2hhciByZXM7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3NjaGFyOworICBjbF9hcmdfdHlwZXNbMV0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLAorCQkgICAgICZmZmlfdHlwZV9zY2hhciwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3JldF9zY2hhcl9mbiwgTlVMTCwgY29kZSkgID09IEZGSV9PSyk7CisKKyAgcmVzID0gKCooKGNsc19yZXRfc2NoYXIpY29kZSkpKDEyNyk7CisgIC8qIHsgZGctb3V0cHV0ICIxMjc6IDEyNyIgfSAqLworICBwcmludGYoInJlczogJWRcbiIsIHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogMTI3IiB9ICovCisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NpbnQuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3NpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2UxM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc2ludC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIEFyZWE6CWNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIHNpbnQzMi4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMTEwOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHZvaWQgY2xzX3JldF9zaW50X2ZuKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICAqKGZmaV9hcmcqKXJlc3AgPSAqKHNpZ25lZCBpbnQgKilhcmdzWzBdOworICBwcmludGYoIiVkOiAlZFxuIiwqKHNpZ25lZCBpbnQgKilhcmdzWzBdLAorCSAoaW50KSooZmZpX2FyZyAqKShyZXNwKSk7Cit9Cit0eXBlZGVmIHNpZ25lZCBpbnQgKCpjbHNfcmV0X3NpbnQpKHNpZ25lZCBpbnQpOworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlICogY2xfYXJnX3R5cGVzWzJdOworICBzaWduZWQgaW50IHJlczsKKworICBjbF9hcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gTlVMTDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwKKwkJICAgICAmZmZpX3R5cGVfc2ludCwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3JldF9zaW50X2ZuLCBOVUxMLCBjb2RlKSAgPT0gRkZJX09LKTsKKworICByZXMgPSAoKigoY2xzX3JldF9zaW50KWNvZGUpKSg2NTUzNCk7CisgIC8qIHsgZGctb3V0cHV0ICI2NTUzNDogNjU1MzQiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVkXG4iLHJlcyk7CisgIC8qIHsgZGctb3V0cHV0ICJcbnJlczogNjU1MzQiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc3Nob3J0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc19zc2hvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDZkNTdlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfc3Nob3J0LmMKQEAgLTAsMCArMSw0MiBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgc3Nob3J0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMxMTA4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZCBjbHNfcmV0X3NzaG9ydF9mbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCQkgICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICAqKGZmaV9hcmcqKXJlc3AgPSAqKHNpZ25lZCBzaG9ydCAqKWFyZ3NbMF07CisgIHByaW50ZigiJWQ6ICVkXG4iLCooc2lnbmVkIHNob3J0ICopYXJnc1swXSwKKwkgKGludCkqKGZmaV9hcmcgKikocmVzcCkpOworfQordHlwZWRlZiBzaWduZWQgc2hvcnQgKCpjbHNfcmV0X3NzaG9ydCkoc2lnbmVkIHNob3J0KTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1syXTsKKyAgc2lnbmVkIHNob3J0IHJlczsKKworICBjbF9hcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfc3Nob3J0OworICBjbF9hcmdfdHlwZXNbMV0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLAorCQkgICAgICZmZmlfdHlwZV9zc2hvcnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19yZXRfc3Nob3J0X2ZuLCBOVUxMLCBjb2RlKSAgPT0gRkZJX09LKTsKKworICByZXMgPSAoKigoY2xzX3JldF9zc2hvcnQpY29kZSkpKDI1NSk7CisgIC8qIHsgZGctb3V0cHV0ICIyNTU6IDI1NSIgfSAqLworICBwcmludGYoInJlczogJWRcbiIscmVzKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyNTUiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWNoYXIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzMTdlNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xzX3VjaGFyLmMKQEAgLTAsMCArMSw0MiBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgdWNoYXIuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3N0YXRpYyB2b2lkIGNsc19yZXRfdWNoYXJfZm4oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkJICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICAqKGZmaV9hcmcqKXJlc3AgPSAqKHVuc2lnbmVkIGNoYXIgKilhcmdzWzBdOworICBwcmludGYoIiVkOiAlZFxuIiwqKHVuc2lnbmVkIGNoYXIgKilhcmdzWzBdLAorCSAoaW50KSooZmZpX2FyZyAqKShyZXNwKSk7Cit9Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKCpjbHNfcmV0X3VjaGFyKSh1bnNpZ25lZCBjaGFyKTsKKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICBmZmlfdHlwZSAqIGNsX2FyZ190eXBlc1syXTsKKyAgdW5zaWduZWQgY2hhciByZXM7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICBjbF9hcmdfdHlwZXNbMV0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLAorCQkgICAgICZmZmlfdHlwZV91Y2hhciwgY2xfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3JldF91Y2hhcl9mbiwgTlVMTCwgY29kZSkgID09IEZGSV9PSyk7CisKKyAgcmVzID0gKCooKGNsc19yZXRfdWNoYXIpY29kZSkpKDEyNyk7CisgIC8qIHsgZGctb3V0cHV0ICIxMjc6IDEyNyIgfSAqLworICBwcmludGYoInJlczogJWRcbiIscmVzKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAxMjciIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWludC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NWNmZjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191aW50LmMKQEAgLTAsMCArMSw0MyBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgdWludC4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHZvaWQgY2xzX3JldF91aW50X2ZuKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJCSAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICAqKGZmaV9hcmcgKilyZXNwID0gKih1bnNpZ25lZCBpbnQgKilhcmdzWzBdOworCisgIHByaW50ZigiJWQ6ICVkXG4iLCoodW5zaWduZWQgaW50ICopYXJnc1swXSwKKwkgKGludCkqKGZmaV9hcmcgKikocmVzcCkpOworfQordHlwZWRlZiB1bnNpZ25lZCBpbnQgKCpjbHNfcmV0X3VpbnQpKHVuc2lnbmVkIGludCk7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbMl07CisgIHVuc2lnbmVkIGludCByZXM7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3VpbnQ7CisgIGNsX2FyZ190eXBlc1sxXSA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsCisJCSAgICAgJmZmaV90eXBlX3VpbnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19yZXRfdWludF9mbiwgTlVMTCwgY29kZSkgID09IEZGSV9PSyk7CisKKyAgcmVzID0gKCooKGNsc19yZXRfdWludCljb2RlKSkoMjE0NzQ4MzY0Nyk7CisgIC8qIHsgZGctb3V0cHV0ICIyMTQ3NDgzNjQ3OiAyMTQ3NDgzNjQ3IiB9ICovCisgIHByaW50ZigicmVzOiAlZFxuIixyZXMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDIxNDc0ODM2NDciIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191bG9uZ2xvbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzVhYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdWxvbmdsb25nLmMKQEAgLTAsMCArMSw0NyBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgbG9uZyBsb25nLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwODI4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1Xbm8tZm9ybWF0IiB7IHRhcmdldCBhbHBoYSotZGVjLW9zZiogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZCBjbHNfcmV0X3Vsb25nbG9uZ19mbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwKKwkJCQkgdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgICoodW5zaWduZWQgbG9uZyBsb25nICopcmVzcD0gICoodW5zaWduZWQgbG9uZyBsb25nICopYXJnc1swXTsKKworICBwcmludGYoIiUiIFBSSXVMTCAiOiAlIiBQUkl1TEwgIlxuIiwqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFyZ3NbMF0sCisJICoodW5zaWduZWQgbG9uZyBsb25nICopKHJlc3ApKTsKK30KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICgqY2xzX3JldF91bG9uZ2xvbmcpKHVuc2lnbmVkIGxvbmcgbG9uZyk7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbMl07CisgIHVuc2lnbmVkIGxvbmcgbG9uZyByZXM7CisKKyAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgY2xfYXJnX3R5cGVzWzFdID0gTlVMTDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwKKwkJICAgICAmZmZpX3R5cGVfdWludDY0LCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3JldF91bG9uZ2xvbmdfZm4sIE5VTEwsIGNvZGUpICA9PSBGRklfT0spOworICByZXMgPSAoKigoY2xzX3JldF91bG9uZ2xvbmcpY29kZSkpKDIxNExMKTsKKyAgLyogeyBkZy1vdXRwdXQgIjIxNDogMjE0IiB9ICovCisgIHByaW50ZigicmVzOiAlIiBQUklkTEwgIlxuIiwgcmVzKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyMTQiIH0gKi8KKworICByZXMgPSAoKigoY2xzX3JldF91bG9uZ2xvbmcpY29kZSkpKDkyMjMzNzIwMzU4NTQ3NzU4MDhMTCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjkyMjMzNzIwMzU4NTQ3NzU4MDg6IDkyMjMzNzIwMzU4NTQ3NzU4MDgiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICUiIFBSSWRMTCAiXG4iLCByZXMpOworICAvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDkyMjMzNzIwMzU4NTQ3NzU4MDgiIH0gKi8KKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdXNob3J0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Nsc191c2hvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAxMDBlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9jbHNfdXNob3J0LmMKQEAgLTAsMCArMSw0MyBAQAorLyogQXJlYToJY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgdXNob3J0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDMwODI4CSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZCBjbHNfcmV0X3VzaG9ydF9mbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJCQkgICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICAqKGZmaV9hcmcqKXJlc3AgPSAqKHVuc2lnbmVkIHNob3J0ICopYXJnc1swXTsKKworICBwcmludGYoIiVkOiAlZFxuIiwqKHVuc2lnbmVkIHNob3J0ICopYXJnc1swXSwKKwkgKGludCkqKGZmaV9hcmcgKikocmVzcCkpOworfQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAoKmNsc19yZXRfdXNob3J0KSh1bnNpZ25lZCBzaG9ydCk7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbMl07CisgIHVuc2lnbmVkIHNob3J0IHJlczsKKworICBjbF9hcmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfdXNob3J0OworICBjbF9hcmdfdHlwZXNbMV0gPSBOVUxMOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLAorCQkgICAgICZmZmlfdHlwZV91c2hvcnQsIGNsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19yZXRfdXNob3J0X2ZuLCBOVUxMLCBjb2RlKSAgPT0gRkZJX09LKTsKKworICByZXMgPSAoKigoY2xzX3JldF91c2hvcnQpY29kZSkpKDY1NTM1KTsKKyAgLyogeyBkZy1vdXRwdXQgIjY1NTM1OiA2NTUzNSIgfSAqLworICBwcmludGYoInJlczogJWRcbiIscmVzKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiA2NTUzNSIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfYWJpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNzMxNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZXJyX2JhZF9hYmkuYwpAQCAtMCwwICsxLDM2IEBACisvKiBBcmVhOgkJZmZpX3ByZXBfY2lmLCBmZmlfcHJlcF9jbG9zdXJlCisgICBQdXJwb3NlOgkJVGVzdCBlcnJvciByZXR1cm4gZm9yIGJhZCBBQklzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjoJQmxha2UgQ2hhZmZpbiA2LzYvMjAwNwkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgdm9pZAorZHVtbXlfZm4oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AgX19VTlVTRURfXywgCisJIHZvaWQqKiBhcmdzIF9fVU5VU0VEX18sIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7fQorCitpbnQgbWFpbiAodm9pZCkKK3sKKwlmZmlfY2lmIGNpZjsKKyAgICAgICAgdm9pZCAqY29kZTsKKwlmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworCWZmaV90eXBlKiBhcmdfdHlwZXNbMV07CisKKwlhcmdfdHlwZXNbMF0gPSBOVUxMOworCisJQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIDI1NSwgMCwgJmZmaV90eXBlX3ZvaWQsCisJCWFyZ190eXBlcykgPT0gRkZJX0JBRF9BQkkpOworCisJQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMCwgJmZmaV90eXBlX3ZvaWQsCisJCWFyZ190eXBlcykgPT0gRkZJX09LKTsKKworCWNpZi5hYmk9IDI1NTsKKworCUNIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgZHVtbXlfZm4sIE5VTEwsIGNvZGUpID09IEZGSV9CQURfQUJJKTsKKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Vycl9iYWRfdHlwZWRlZi5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX3R5cGVkZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTM5MjczCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9lcnJfYmFkX3R5cGVkZWYuYwpAQCAtMCwwICsxLDI2IEBACisvKiBBcmVhOgkJZmZpX3ByZXBfY2lmCisgICBQdXJwb3NlOgkJVGVzdCBlcnJvciByZXR1cm4gZm9yIGJhZCB0eXBlZGVmcy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUJsYWtlIENoYWZmaW4gNi82LzIwMDcJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworaW50IG1haW4gKHZvaWQpCit7CisJZmZpX2NpZiBjaWY7CisJZmZpX3R5cGUqIGFyZ190eXBlc1sxXTsKKworCWFyZ190eXBlc1swXSA9IE5VTEw7CisKKwlmZmlfdHlwZQliYWRUeXBlCT0gZmZpX3R5cGVfdm9pZDsKKworCWJhZFR5cGUuc2l6ZSA9IDA7CisKKwlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAwLCAmYmFkVHlwZSwKKwkJYXJnX3R5cGVzKSA9PSBGRklfQkFEX1RZUEVERUYpOworCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mZml0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5NWUxNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmZpdGVzdC5oCkBAIC0wLDAgKzEsMTUzIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgImZmaWNvbmZpZy5oIgorCisjaWYgZGVmaW5lZCBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjZGVmaW5lIE1BWF9BUkdTIDI1NgorCisjZGVmaW5lIENIRUNLKHgpICEoeCkgPyBhYm9ydCgpIDogMAorCisvKiBEZWZpbmUgX19VTlVTRURfXyB0aGF0IGFsc28gb3RoZXIgY29tcGlsZXJzIHRoYW4gZ2NjIGNhbiBydW4gdGhlIHRlc3RzLiAgKi8KKyN1bmRlZiBfX1VOVVNFRF9fCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgX19VTlVTRURfXyBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbHNlCisjZGVmaW5lIF9fVU5VU0VEX18KKyNlbmRpZgorCisvKiBQcmVmZXIgTUFQX0FOT04oWU1PVVMpIHRvIC9kZXYvemVybywgc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGEKKyAgIGZpbGUgb3Blbi4gICovCisjaWZkZWYgSEFWRV9NTUFQX0FOT04KKyMgdW5kZWYgSEFWRV9NTUFQX0RFVl9aRVJPCisKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgaWZuZGVmIE1BUF9GQUlMRUQKKyMgIGRlZmluZSBNQVBfRkFJTEVEIC0xCisjIGVuZGlmCisjIGlmICFkZWZpbmVkIChNQVBfQU5PTllNT1VTKSAmJiBkZWZpbmVkIChNQVBfQU5PTikKKyMgIGRlZmluZSBNQVBfQU5PTllNT1VTIE1BUF9BTk9OCisjIGVuZGlmCisjIGRlZmluZSBVU0lOR19NTUFQCisKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9NTUFQX0RFVl9aRVJPCisKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgaWZuZGVmIE1BUF9GQUlMRUQKKyMgIGRlZmluZSBNQVBfRkFJTEVEIC0xCisjIGVuZGlmCisjIGRlZmluZSBVU0lOR19NTUFQCisKKyNlbmRpZgorCisvKiBNaW5HVyBrbHVkZ2UuICAqLworI2lmZGVmIF9XSU42NAorI2RlZmluZSBQUklkTEwgIkk2NGQiCisjZGVmaW5lIFBSSXVMTCAiSTY0dSIKKyNlbHNlCisjZGVmaW5lIFBSSWRMTCAibGxkIgorI2RlZmluZSBQUkl1TEwgImxsdSIKKyNlbmRpZgorCisvKiBUcnU2NCBVTklYIGtsdWRnZS4gICovCisjaWYgZGVmaW5lZChfX2FscGhhX18pICYmIGRlZmluZWQoX19vc2ZfXykKKy8qIFRydTY0IFVOSVggVjQuMCBkb2Vzbid0IHN1cHBvcnQgJWxsZC8lbGxkLCBidXQgbG9uZyBpcyA2NC1iaXQuICAqLworI3VuZGVmIFBSSWRMTAorI2RlZmluZSBQUklkTEwgImxkIgorI3VuZGVmIFBSSXVMTAorI2RlZmluZSBQUkl1TEwgImx1IgorI2RlZmluZSBQUklkOCAiaGQiCisjZGVmaW5lIFBSSXU4ICJodSIKKyNkZWZpbmUgUFJJZDY0ICJsZCIKKyNkZWZpbmUgUFJJdTY0ICJsdSIKKyNkZWZpbmUgUFJJdVBUUiAibHUiCisjZW5kaWYKKworLyogUEEgSFAtVVgga2x1ZGdlLiAgKi8KKyNpZiBkZWZpbmVkKF9faHBwYV9fKSAmJiBkZWZpbmVkKF9faHB1eF9fKSAmJiAhZGVmaW5lZChQUkl1UFRSKQorI2RlZmluZSBQUkl1UFRSICJsdSIKKyNlbmRpZgorCisvKiBJUklYIGtsdWRnZS4gICovCisjaWYgZGVmaW5lZChfX3NnaSkKKy8qIElSSVggNi41IDxpbnR0eXBlcy5oPiBwcm92aWRlcyBhbGwgZGVmaW5pdGlvbnMsIGJ1dCBvbmx5IGZvciBDOTkKKyAgIGNvbXBpbGF0aW9ucy4gICovCisjZGVmaW5lIFBSSWQ4ICJoaGQiCisjZGVmaW5lIFBSSXU4ICJoaHUiCisjaWYgKF9NSVBTX1NaTE9ORyA9PSAzMikKKyNkZWZpbmUgUFJJZDY0ICJsbGQiCisjZGVmaW5lIFBSSXU2NCAibGx1IgorI2VuZGlmCisvKiBUaGlzIGRvZXNuJ3QgbWF0Y2ggPGludHR5cGVzLmg+LCB3aGljaCBhbHdheXMgaGFzICJsbGQiIGhlcmUsIGJ1dCB0aGUKKyAgIGFyZ3VtZW50cyBhcmUgdWludDY0X3QsIGludDY0X3QsIHdoaWNoIGFyZSB1bnNpZ25lZCBsb25nLCBsb25nIGZvcgorICAgNjQtYml0IGluIDxzZ2lkZWZzLmg+LiAgKi8KKyNpZiAoX01JUFNfU1pMT05HID09IDY0KQorI2RlZmluZSBQUklkNjQgImxkIgorI2RlZmluZSBQUkl1NjQgImx1IgorI2VuZGlmCisvKiBUaGlzIGRvZXNuJ3QgbWF0Y2ggPGludHR5cGVzLmg+LCB3aGljaCBoYXMgInUiIGhlcmUsIGJ1dCB0aGUgYXJndW1lbnRzCisgICBhcmUgdWludHB0cl90LCB3aGljaCBpcyBhbHdheXMgdW5zaWduZWQgbG9uZy4gICovCisjZGVmaW5lIFBSSXVQVFIgImx1IgorI2VuZGlmCisKKy8qIFNvbGFyaXMgPCAxMCBrbHVkZ2UuICAqLworI2lmIGRlZmluZWQoX19zdW5fXykgJiYgZGVmaW5lZChfX3N2cjRfXykgJiYgIWRlZmluZWQoUFJJdVBUUikKKyNpZiBkZWZpbmVkKF9fYXJjaDY0X18pIHx8IGRlZmluZWQgKF9feDg2XzY0X18pCisjZGVmaW5lIFBSSXVQVFIgImx1IgorI2Vsc2UKKyNkZWZpbmUgUFJJdVBUUiAidSIKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBVU0lOR19NTUFQCitzdGF0aWMgaW5saW5lIHZvaWQgKgorYWxsb2NhdGVfbW1hcCAoc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKnBhZ2U7CisjaWYgZGVmaW5lZCAoSEFWRV9NTUFQX0RFVl9aRVJPKQorICBzdGF0aWMgaW50IGRldl96ZXJvX2ZkID0gLTE7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTU1BUF9ERVZfWkVSTworICBpZiAoZGV2X3plcm9fZmQgPT0gLTEpCisgICAgeworICAgICAgZGV2X3plcm9fZmQgPSBvcGVuICgiL2Rldi96ZXJvIiwgT19SRE9OTFkpOworICAgICAgaWYgKGRldl96ZXJvX2ZkID09IC0xKQorCXsKKwkgIHBlcnJvciAoIm9wZW4gL2Rldi96ZXJvOiAlbSIpOworCSAgZXhpdCAoMSk7CisJfQorICAgIH0KKyNlbmRpZgorCisKKyNpZmRlZiBIQVZFX01NQVBfQU5PTgorICBwYWdlID0gbW1hcCAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKwkgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX01NQVBfREVWX1pFUk8KKyAgcGFnZSA9IG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCisJICAgICAgIE1BUF9QUklWQVRFLCBkZXZfemVyb19mZCwgMCk7CisjZW5kaWYKKworICBpZiAocGFnZSA9PSAodm9pZCAqKSBNQVBfRkFJTEVEKQorICAgIHsKKyAgICAgIHBlcnJvciAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiBwYWdlOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmMyNzJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgZmxvYXQuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgaW50IGZsb2F0aW5nKGludCBhLCBmbG9hdCBiLCBkb3VibGUgYywgbG9uZyBkb3VibGUgZCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IChpbnQpICgoZmxvYXQpYS9iICsgKChmbG9hdCljLyhmbG9hdClkKSk7CisKKyAgcmV0dXJuIGk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBmZmlfYXJnIHJpbnQ7CisKKyAgZmxvYXQgZjsKKyAgc2lnbmVkIGludCBzaTE7CisgIGRvdWJsZSBkOworICBsb25nIGRvdWJsZSBsZDsKKworICBhcmdzWzBdID0gJmZmaV90eXBlX3NpbnQ7CisgIHZhbHVlc1swXSA9ICZzaTE7CisgIGFyZ3NbMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIHZhbHVlc1sxXSA9ICZmOworICBhcmdzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgdmFsdWVzWzJdID0gJmQ7CisgIGFyZ3NbM10gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKyAgdmFsdWVzWzNdID0gJmxkOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA0LAorCQkgICAgICZmZmlfdHlwZV9zaW50LCBhcmdzKSA9PSBGRklfT0spOworCisgIHNpMSA9IDY7CisgIGYgPSAzLjE0MTU5OworICBkID0gKGRvdWJsZSkxLjAvKGRvdWJsZSkzLjA7CisgIGxkID0gMi43MTgyODE4Mjg0Nkw7CisKKyAgZmxvYXRpbmcgKHNpMSwgZiwgZCwgbGQpOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihmbG9hdGluZyksICZyaW50LCB2YWx1ZXMpOworCisgIHByaW50ZiAoIiVkIHZzICVkXG4iLCAoaW50KXJpbnQsIGZsb2F0aW5nIChzaTEsIGYsIGQsIGxkKSk7CisKKyAgQ0hFQ0soKGludClyaW50ID09IGZsb2F0aW5nKHNpMSwgZiwgZCwgbGQpKTsKKworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQxLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MWQwNTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0MS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgZG91YmxlLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisjaW5jbHVkZSAiZmxvYXQuaCIKKwordHlwZWRlZiB1bmlvbgoreworICBkb3VibGUgZDsKKyAgdW5zaWduZWQgY2hhciBjW3NpemVvZiAoZG91YmxlKV07Cit9IHZhbHVlX3R5cGU7CisKKyNkZWZpbmUgQ0FOQVJZIDB4YmEKKworc3RhdGljIGRvdWJsZSBkYmxpdChmbG9hdCBmKQoreworICByZXR1cm4gZi8zLjA7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBmbG9hdCBmOworICB2YWx1ZV90eXBlIHJlc3VsdFsyXTsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdmFsdWVzWzBdID0gJmY7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsCisJCSAgICAgJmZmaV90eXBlX2RvdWJsZSwgYXJncykgPT0gRkZJX09LKTsKKworICBmID0gMy4xNDE1OTsKKworICAvKiBQdXQgYSBjYW5hcnkgaW4gdGhlIHJldHVybiBhcnJheS4gIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yCisgICAgIGEgYnVmZmVyIG92ZXJydW4uICAqLworICBtZW1zZXQocmVzdWx0WzFdLmMsIENBTkFSWSwgc2l6ZW9mIChkb3VibGUpKTsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oZGJsaXQpLCAmcmVzdWx0WzBdLmQsIHZhbHVlcyk7CisKKyAgLyogVGhlc2UgYXJlIG5vdCBhbHdheXMgdGhlIHNhbWUhISBDaGVjayBmb3IgYSByZWFzb25hYmxlIGRlbHRhICovCisKKyAgQ0hFQ0socmVzdWx0WzBdLmQgLSBkYmxpdChmKSA8IERCTF9FUFNJTE9OKTsKKworICAvKiBDaGVjayB0aGUgY2FuYXJ5LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZG91YmxlKTsgKytpKQorICAgIENIRUNLKHJlc3VsdFsxXS5jW2ldID09IENBTkFSWSk7CisKKyAgZXhpdCgwKTsKKworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiMjk2YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQyLmMKQEAgLTAsMCArMSw1OCBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHJldHVybiB2YWx1ZSBsb25nIGRvdWJsZS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJRnJvbSB0aGUgb3JpZ2luYWwgZmZpdGVzdC5jICAqLworCisvKiB7IGRnLWV4Y2Vzcy1lcnJvcnMgImZhaWxzIiB7IHRhcmdldCB4ODZfNjQtKi1taW5ndyogeDg2XzY0LSotY3lnd2luKiB9IH0gKi8KKy8qIHsgZGctZG8gcnVuIHsgeGZhaWwgeDg2XzY0LSotbWluZ3cqIHg4Nl82NC0qLWN5Z3dpbiogfSB9ICovCisKKyNpbmNsdWRlICJmZml0ZXN0LmgiCisjaW5jbHVkZSAiZmxvYXQuaCIKKworc3RhdGljIGxvbmcgZG91YmxlIGxkYmxpdChmbG9hdCBmKQoreworICByZXR1cm4gKGxvbmcgZG91YmxlKSAoKChsb25nIGRvdWJsZSkgZikvIChsb25nIGRvdWJsZSkgMy4wKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZsb2F0IGY7CisgIGxvbmcgZG91YmxlIGxkOworCisgIGFyZ3NbMF0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIHZhbHVlc1swXSA9ICZmOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLAorCQkgICAgICZmZmlfdHlwZV9sb25nZG91YmxlLCBhcmdzKSA9PSBGRklfT0spOworCisgIGYgPSAzLjE0MTU5OworCisjaWYgMQorICAvKiBUaGlzIGlzIGlmZGVmJ2Qgb3V0IGZvciBub3cuIGxvbmcgZG91YmxlIHN1cHBvcnQgdW5kZXIgU3VuT1MvZ2NjCisgICAgIGlzIHByZXR0eSBtdWNoIG5vbi1leGlzdGVudC4gIFlvdSdsbCBnZXQgdGhlIG9kZCBidXMgZXJyb3IgaW4gbGlicmFyeQorICAgICByb3V0aW5lcyBsaWtlIHByaW50ZigpLiAgKi8KKyAgcHJpbnRmICgiJUxmXG4iLCBsZGJsaXQoZikpOworI2VuZGlmCisgIGxkID0gNjY2OworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obGRibGl0KSwgJmxkLCB2YWx1ZXMpOworCisjaWYgMQorICAvKiBUaGlzIGlzIGlmZGVmJ2Qgb3V0IGZvciBub3cuIGxvbmcgZG91YmxlIHN1cHBvcnQgdW5kZXIgU3VuT1MvZ2NjCisgICAgIGlzIHByZXR0eSBtdWNoIG5vbi1leGlzdGVudC4gIFlvdSdsbCBnZXQgdGhlIG9kZCBidXMgZXJyb3IgaW4gbGlicmFyeQorICAgICByb3V0aW5lcyBsaWtlIHByaW50ZigpLiAgKi8KKyAgcHJpbnRmICgiJUxmLCAlTGYsICVMZiwgJUxmXG4iLCBsZCwgbGRibGl0KGYpLCBsZCAtIGxkYmxpdChmKSwgTERCTF9FUFNJTE9OKTsKKyNlbmRpZgorCisgIC8qIFRoZXNlIGFyZSBub3QgYWx3YXlzIHRoZSBzYW1lISEgQ2hlY2sgZm9yIGEgcmVhc29uYWJsZSBkZWx0YSAqLworICBpZiAobGQgLSBsZGJsaXQoZikgPCBMREJMX0VQU0lMT04pCisgICAgcHV0cygibG9uZyBkb3VibGUgcmV0dXJuIHZhbHVlIHRlc3RzIG9rISIpOworICBlbHNlCisgICAgQ0hFQ0soMCk7CisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvZmxvYXQzLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmQ1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0My5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBmbG9hdCBhcmd1bWVudHMgd2l0aCBkaWZmZXJlbnQgb3JkZXJzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKyNpbmNsdWRlICJmbG9hdC5oIgorCitzdGF0aWMgZG91YmxlIGZsb2F0aW5nXzEoZmxvYXQgYSwgZG91YmxlIGIsIGxvbmcgZG91YmxlIGMpCit7CisgIHJldHVybiAoZG91YmxlKSBhICsgYiArIChkb3VibGUpIGM7Cit9CisKK3N0YXRpYyBkb3VibGUgZmxvYXRpbmdfMihsb25nIGRvdWJsZSBhLCBkb3VibGUgYiwgZmxvYXQgYykKK3sKKyAgcmV0dXJuIChkb3VibGUpIGEgKyBiICsgKGRvdWJsZSkgYzsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGRvdWJsZSByZDsKKworICBmbG9hdCBmOworICBkb3VibGUgZDsKKyAgbG9uZyBkb3VibGUgbGQ7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdmFsdWVzWzBdID0gJmY7CisgIGFyZ3NbMV0gPSAmZmZpX3R5cGVfZG91YmxlOworICB2YWx1ZXNbMV0gPSAmZDsKKyAgYXJnc1syXSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOworICB2YWx1ZXNbMl0gPSAmbGQ7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDMsCisJCSAgICAgJmZmaV90eXBlX2RvdWJsZSwgYXJncykgPT0gRkZJX09LKTsKKworICBmID0gMy4xNDE1OTsKKyAgZCA9IChkb3VibGUpMS4wLyhkb3VibGUpMy4wOworICBsZCA9IDIuNzE4MjgxODI4NDZMOworCisgIGZsb2F0aW5nXzEgKGYsIGQsIGxkKTsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oZmxvYXRpbmdfMSksICZyZCwgdmFsdWVzKTsKKworICBDSEVDSyhyZCAtIGZsb2F0aW5nXzEoZiwgZCwgbGQpIDwgREJMX0VQU0lMT04pOworCisgIGFyZ3NbMF0gPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKyAgdmFsdWVzWzBdID0gJmxkOworICBhcmdzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgdmFsdWVzWzFdID0gJmQ7CisgIGFyZ3NbMl0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIHZhbHVlc1syXSA9ICZmOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAzLAorCQkgICAgICZmZmlfdHlwZV9kb3VibGUsIGFyZ3MpID09IEZGSV9PSyk7CisKKyAgZmxvYXRpbmdfMiAobGQsIGQsIGYpOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihmbG9hdGluZ18yKSwgJnJkLCB2YWx1ZXMpOworCisgIENIRUNLKHJkIC0gZmxvYXRpbmdfMihsZCwgZCwgZikgPCBEQkxfRVBTSUxPTik7CisKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL2Zsb2F0NC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ2ZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9mbG9hdDQuYwpAQCAtMCwwICsxLDYyIEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgZGVub3JtIGRvdWJsZSB2YWx1ZS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlQUjI2NDgzLgorICAgT3JpZ2luYXRvcjoJRnJvbSB0aGUgb3JpZ2luYWwgZmZpdGVzdC5jICAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1taWVlZSIgeyB0YXJnZXQgYWxwaGEqLSotKiB9IH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKyNpbmNsdWRlICJmbG9hdC5oIgorCit0eXBlZGVmIHVuaW9uCit7CisgIGRvdWJsZSBkOworICB1bnNpZ25lZCBjaGFyIGNbc2l6ZW9mIChkb3VibGUpXTsKK30gdmFsdWVfdHlwZTsKKworI2RlZmluZSBDQU5BUlkgMHhiYQorCitzdGF0aWMgZG91YmxlIGRibGl0KGRvdWJsZSBkKQoreworICByZXR1cm4gZDsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGRvdWJsZSBkOworICB2YWx1ZV90eXBlIHJlc3VsdFsyXTsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIHZhbHVlc1swXSA9ICZkOworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsCisJCSAgICAgJmZmaV90eXBlX2RvdWJsZSwgYXJncykgPT0gRkZJX09LKTsKKyAgCisgIGQgPSBEQkxfTUlOIC8gMjsKKyAgCisgIC8qIFB1dCBhIGNhbmFyeSBpbiB0aGUgcmV0dXJuIGFycmF5LiAgVGhpcyBpcyBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IKKyAgICAgYSBidWZmZXIgb3ZlcnJ1bi4gICovCisgIG1lbXNldChyZXN1bHRbMV0uYywgQ0FOQVJZLCBzaXplb2YgKGRvdWJsZSkpOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihkYmxpdCksICZyZXN1bHRbMF0uZCwgdmFsdWVzKTsKKyAgCisgIC8qIFRoZSBzdGFuZGFyZCBkZWx0YSBjaGVjayBkb2Vzbid0IHdvcmsgZm9yIGRlbm9ybXMuICBTaW5jZSB3ZSBkaWRuJ3QgZG8KKyAgICAgYW55IGFyaXRobWV0aWMsIHdlIHNob3VsZCBnZXQgdGhlIG9yaWdpbmFsIHJlc3VsdCBiYWNrLCBhbmQgaGVuY2UgYW4KKyAgICAgZXhhY3QgY2hlY2sgc2hvdWxkIGJlIE9LIGhlcmUuICAqLworIAorICBDSEVDSyhyZXN1bHRbMF0uZCA9PSBkYmxpdChkKSk7CisKKyAgLyogQ2hlY2sgdGhlIGNhbmFyeS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRvdWJsZSk7ICsraSkKKyAgICBDSEVDSyhyZXN1bHRbMV0uY1tpXSA9PSBDQU5BUlkpOworCisgIGV4aXQoMCk7CisKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvaHVnZV9zdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDRlMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9odWdlX3N0cnVjdC5jCkBAIC0wLDAgKzEsMzQyIEBACisvKglBcmVhOgkJCWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKwlQdXJwb3NlOgkJQ2hlY2sgbGFyZ2Ugc3RydWN0dXJlIHJldHVybnMuCisJTGltaXRhdGlvbnM6CW5vbmUuCisJUFI6CQkJCW5vbmUuCisJT3JpZ2luYXRvcjoJCUJsYWtlIENoYWZmaW4JNi8xOC8yMDA3CisqLworCisvKiB7IGRnLWV4Y2Vzcy1lcnJvcnMgIiIgeyB0YXJnZXQgeDg2XzY0LSotbWluZ3cqIHg4Nl82NC0qLWN5Z3dpbiogfSB9ICovCisvKiB7IGRnLWRvIHJ1biB7IHhmYWlsIHN0cm9uZ2FybSotKi0qIHhzY2FsZSotKi0qIH0gfSAqLworLyogeyBkZy1vcHRpb25zIC1tbG9uZy1kb3VibGUtMTI4IHsgdGFyZ2V0IHBvd2VycGM2NCotKi1saW51eCogfSB9ICovCisvKiB7IGRnLW91dHB1dCAiIiB7IHhmYWlsIHg4Nl82NC0qLW1pbmd3KiB4ODZfNjQtKi1jeWd3aW4qIH0gfSAqLworCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmCXN0cnVjdCBCaWdTdHJ1Y3R7CisJdWludDhfdAkJYTsKKwlpbnQ4X3QJCWI7CisJdWludDE2X3QJYzsKKwlpbnQxNl90CQlkOworCXVpbnQzMl90CWU7CisJaW50MzJfdAkJZjsKKwl1aW50NjRfdAlnOworCWludDY0X3QJCWg7CisJZmxvYXQJCWk7CisJZG91YmxlCQlqOworCWxvbmcgZG91YmxlCWs7CisJY2hhcioJCWw7CisJdWludDhfdAkJbTsKKwlpbnQ4X3QJCW47CisJdWludDE2X3QJbzsKKwlpbnQxNl90CQlwOworCXVpbnQzMl90CXE7CisJaW50MzJfdAkJcjsKKwl1aW50NjRfdAlzOworCWludDY0X3QJCXQ7CisJZmxvYXQJCXU7CisJZG91YmxlCQl2OworCWxvbmcgZG91YmxlCXc7CisJY2hhcioJCXg7CisJdWludDhfdAkJeTsKKwlpbnQ4X3QJCXo7CisJdWludDE2X3QJYWE7CisJaW50MTZfdAkJYmI7CisJdWludDMyX3QJY2M7CisJaW50MzJfdAkJZGQ7CisJdWludDY0X3QJZWU7CisJaW50NjRfdAkJZmY7CisJZmxvYXQJCWdnOworCWRvdWJsZQkJaGg7CisJbG9uZyBkb3VibGUJaWk7CisJY2hhcioJCWpqOworCXVpbnQ4X3QJCWtrOworCWludDhfdAkJbGw7CisJdWludDE2X3QJbW07CisJaW50MTZfdAkJbm47CisJdWludDMyX3QJb287CisJaW50MzJfdAkJcHA7CisJdWludDY0X3QJcXE7CisJaW50NjRfdAkJcnI7CisJZmxvYXQJCXNzOworCWRvdWJsZQkJdHQ7CisJbG9uZyBkb3VibGUJdXU7CisJY2hhcioJCXZ2OworCXVpbnQ4X3QJCXd3OworCWludDhfdAkJeHg7Cit9IEJpZ1N0cnVjdDsKKworQmlnU3RydWN0Cit0ZXN0X2xhcmdlX2ZuKAorCXVpbnQ4X3QJCXVpOF8xLAorCWludDhfdAkJc2k4XzEsCisJdWludDE2X3QJdWkxNl8xLAorCWludDE2X3QJCXNpMTZfMSwKKwl1aW50MzJfdAl1aTMyXzEsCisJaW50MzJfdAkJc2kzMl8xLAorCXVpbnQ2NF90CXVpNjRfMSwKKwlpbnQ2NF90CQlzaTY0XzEsCisJZmxvYXQJCWZfMSwKKwlkb3VibGUJCWRfMSwKKwlsb25nIGRvdWJsZQlsZF8xLAorCWNoYXIqCQlwXzEsCisJdWludDhfdAkJdWk4XzIsCisJaW50OF90CQlzaThfMiwKKwl1aW50MTZfdAl1aTE2XzIsCisJaW50MTZfdAkJc2kxNl8yLAorCXVpbnQzMl90CXVpMzJfMiwKKwlpbnQzMl90CQlzaTMyXzIsCisJdWludDY0X3QJdWk2NF8yLAorCWludDY0X3QJCXNpNjRfMiwKKwlmbG9hdAkJZl8yLAorCWRvdWJsZQkJZF8yLAorCWxvbmcgZG91YmxlCWxkXzIsCisJY2hhcioJCXBfMiwKKwl1aW50OF90CQl1aThfMywKKwlpbnQ4X3QJCXNpOF8zLAorCXVpbnQxNl90CXVpMTZfMywKKwlpbnQxNl90CQlzaTE2XzMsCisJdWludDMyX3QJdWkzMl8zLAorCWludDMyX3QJCXNpMzJfMywKKwl1aW50NjRfdAl1aTY0XzMsCisJaW50NjRfdAkJc2k2NF8zLAorCWZsb2F0CQlmXzMsCisJZG91YmxlCQlkXzMsCisJbG9uZyBkb3VibGUJbGRfMywKKwljaGFyKgkJcF8zLAorCXVpbnQ4X3QJCXVpOF80LAorCWludDhfdAkJc2k4XzQsCisJdWludDE2X3QJdWkxNl80LAorCWludDE2X3QJCXNpMTZfNCwKKwl1aW50MzJfdAl1aTMyXzQsCisJaW50MzJfdAkJc2kzMl80LAorCXVpbnQ2NF90CXVpNjRfNCwKKwlpbnQ2NF90CQlzaTY0XzQsCisJZmxvYXQJCWZfNCwKKwlkb3VibGUJCWRfNCwKKwlsb25nIGRvdWJsZQlsZF80LAorCWNoYXIqCQlwXzQsCisJdWludDhfdAkJdWk4XzUsCisJaW50OF90CQlzaThfNSkKK3sKKwlCaWdTdHJ1Y3QJcmV0VmFsCT0geworCQl1aThfMSArIDEsIHNpOF8xICsgMSwgdWkxNl8xICsgMSwgc2kxNl8xICsgMSwgdWkzMl8xICsgMSwgc2kzMl8xICsgMSwKKwkJCXVpNjRfMSArIDEsIHNpNjRfMSArIDEsIGZfMSArIDEsIGRfMSArIDEsIGxkXzEgKyAxLCAoY2hhciopKChpbnRwdHJfdClwXzEgKyAxKSwgCisJCXVpOF8yICsgMiwgc2k4XzIgKyAyLCB1aTE2XzIgKyAyLCBzaTE2XzIgKyAyLCB1aTMyXzIgKyAyLCBzaTMyXzIgKyAyLAorCQkJdWk2NF8yICsgMiwgc2k2NF8yICsgMiwgZl8yICsgMiwgZF8yICsgMiwgbGRfMiArIDIsIChjaGFyKikoKGludHB0cl90KXBfMiArIDIpLCAKKwkJdWk4XzMgKyAzLCBzaThfMyArIDMsIHVpMTZfMyArIDMsIHNpMTZfMyArIDMsIHVpMzJfMyArIDMsIHNpMzJfMyArIDMsCisJCQl1aTY0XzMgKyAzLCBzaTY0XzMgKyAzLCBmXzMgKyAzLCBkXzMgKyAzLCBsZF8zICsgMywgKGNoYXIqKSgoaW50cHRyX3QpcF8zICsgMyksIAorCQl1aThfNCArIDQsIHNpOF80ICsgNCwgdWkxNl80ICsgNCwgc2kxNl80ICsgNCwgdWkzMl80ICsgNCwgc2kzMl80ICsgNCwKKwkJCXVpNjRfNCArIDQsIHNpNjRfNCArIDQsIGZfNCArIDQsIGRfNCArIDQsIGxkXzQgKyA0LCAoY2hhciopKChpbnRwdHJfdClwXzQgKyA0KSwgCisJCXVpOF81ICsgNSwgc2k4XzUgKyA1fTsKKworCXByaW50ZigiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggJSIgUFJJdTggIiAlIiBQUklkOCAiOiAiCisJCSIlIiBQUkl1OCAiICUiIFBSSWQ4ICIgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCisJCSIlIiBQUkl1OCAiICUiIFBSSWQ4ICIgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCisJCSIlIiBQUkl1OCAiICUiIFBSSWQ4ICIgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAiCisJCSIlIiBQUkl1OCAiICUiIFBSSWQ4ICIgJWh1ICVoZCAldSAlZCAlIiBQUkl1NjQgIiAlIiBQUklkNjQgIiAlLjBmICUuMGYgJS4wTGYgJSNseCAlIiBQUkl1OCAiICUiIFBSSWQ4ICJcbiIsCisJICAgICAgIHVpOF8xLCBzaThfMSwgdWkxNl8xLCBzaTE2XzEsIHVpMzJfMSwgc2kzMl8xLCB1aTY0XzEsIHNpNjRfMSwgZl8xLCBkXzEsIGxkXzEsICh1bnNpZ25lZCBsb25nKXBfMSwKKwkJdWk4XzIsIHNpOF8yLCB1aTE2XzIsIHNpMTZfMiwgdWkzMl8yLCBzaTMyXzIsIHVpNjRfMiwgc2k2NF8yLCBmXzIsIGRfMiwgbGRfMiwgKHVuc2lnbmVkIGxvbmcpcF8yLAorCQl1aThfMywgc2k4XzMsIHVpMTZfMywgc2kxNl8zLCB1aTMyXzMsIHNpMzJfMywgdWk2NF8zLCBzaTY0XzMsIGZfMywgZF8zLCBsZF8zLCAodW5zaWduZWQgbG9uZylwXzMsCisJCXVpOF80LCBzaThfNCwgdWkxNl80LCBzaTE2XzQsIHVpMzJfNCwgc2kzMl80LCB1aTY0XzQsIHNpNjRfNCwgZl80LCBkXzQsIGxkXzQsICh1bnNpZ25lZCBsb25nKXBfNCwgdWk4XzUsIHNpOF81LAorCQlyZXRWYWwuYSwgcmV0VmFsLmIsIHJldFZhbC5jLCByZXRWYWwuZCwgcmV0VmFsLmUsIHJldFZhbC5mLAorCSAgICAgICByZXRWYWwuZywgcmV0VmFsLmgsIHJldFZhbC5pLCByZXRWYWwuaiwgcmV0VmFsLmssICh1bnNpZ25lZCBsb25nKXJldFZhbC5sLAorCQlyZXRWYWwubSwgcmV0VmFsLm4sIHJldFZhbC5vLCByZXRWYWwucCwgcmV0VmFsLnEsIHJldFZhbC5yLAorCSAgICAgICByZXRWYWwucywgcmV0VmFsLnQsIHJldFZhbC51LCByZXRWYWwudiwgcmV0VmFsLncsICh1bnNpZ25lZCBsb25nKXJldFZhbC54LAorCQlyZXRWYWwueSwgcmV0VmFsLnosIHJldFZhbC5hYSwgcmV0VmFsLmJiLCByZXRWYWwuY2MsIHJldFZhbC5kZCwKKwkgICAgICAgcmV0VmFsLmVlLCByZXRWYWwuZmYsIHJldFZhbC5nZywgcmV0VmFsLmhoLCByZXRWYWwuaWksICh1bnNpZ25lZCBsb25nKXJldFZhbC5qaiwKKwkJcmV0VmFsLmtrLCByZXRWYWwubGwsIHJldFZhbC5tbSwgcmV0VmFsLm5uLCByZXRWYWwub28sIHJldFZhbC5wcCwKKwkgICAgICAgcmV0VmFsLnFxLCByZXRWYWwucnIsIHJldFZhbC5zcywgcmV0VmFsLnR0LCByZXRWYWwudXUsICh1bnNpZ25lZCBsb25nKXJldFZhbC52diwgcmV0VmFsLnd3LCByZXRWYWwueHgpOworCisJcmV0dXJuCXJldFZhbDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19sYXJnZV9mbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisJdWludDhfdAkJdWk4XzEJPSAqKHVpbnQ4X3QqKWFyZ3NbMF07CisJaW50OF90CQlzaThfMQk9ICooaW50OF90KilhcmdzWzFdOworCXVpbnQxNl90CXVpMTZfMQk9ICoodWludDE2X3QqKWFyZ3NbMl07CisJaW50MTZfdAkJc2kxNl8xCT0gKihpbnQxNl90KilhcmdzWzNdOworCXVpbnQzMl90CXVpMzJfMQk9ICoodWludDMyX3QqKWFyZ3NbNF07CisJaW50MzJfdAkJc2kzMl8xCT0gKihpbnQzMl90KilhcmdzWzVdOworCXVpbnQ2NF90CXVpNjRfMQk9ICoodWludDY0X3QqKWFyZ3NbNl07CisJaW50NjRfdAkJc2k2NF8xCT0gKihpbnQ2NF90KilhcmdzWzddOworCWZsb2F0CQlmXzEJCT0gKihmbG9hdCopYXJnc1s4XTsKKwlkb3VibGUJCWRfMQkJPSAqKGRvdWJsZSopYXJnc1s5XTsKKwlsb25nIGRvdWJsZQlsZF8xCT0gKihsb25nIGRvdWJsZSopYXJnc1sxMF07CisJY2hhcioJCXBfMQkJPSAqKGNoYXIqKilhcmdzWzExXTsKKwl1aW50OF90CQl1aThfMgk9ICoodWludDhfdCopYXJnc1sxMl07CisJaW50OF90CQlzaThfMgk9ICooaW50OF90KilhcmdzWzEzXTsKKwl1aW50MTZfdAl1aTE2XzIJPSAqKHVpbnQxNl90KilhcmdzWzE0XTsKKwlpbnQxNl90CQlzaTE2XzIJPSAqKGludDE2X3QqKWFyZ3NbMTVdOworCXVpbnQzMl90CXVpMzJfMgk9ICoodWludDMyX3QqKWFyZ3NbMTZdOworCWludDMyX3QJCXNpMzJfMgk9ICooaW50MzJfdCopYXJnc1sxN107CisJdWludDY0X3QJdWk2NF8yCT0gKih1aW50NjRfdCopYXJnc1sxOF07CisJaW50NjRfdAkJc2k2NF8yCT0gKihpbnQ2NF90KilhcmdzWzE5XTsKKwlmbG9hdAkJZl8yCQk9ICooZmxvYXQqKWFyZ3NbMjBdOworCWRvdWJsZQkJZF8yCQk9ICooZG91YmxlKilhcmdzWzIxXTsKKwlsb25nIGRvdWJsZQlsZF8yCT0gKihsb25nIGRvdWJsZSopYXJnc1syMl07CisJY2hhcioJCXBfMgkJPSAqKGNoYXIqKilhcmdzWzIzXTsKKwl1aW50OF90CQl1aThfMwk9ICoodWludDhfdCopYXJnc1syNF07CisJaW50OF90CQlzaThfMwk9ICooaW50OF90KilhcmdzWzI1XTsKKwl1aW50MTZfdAl1aTE2XzMJPSAqKHVpbnQxNl90KilhcmdzWzI2XTsKKwlpbnQxNl90CQlzaTE2XzMJPSAqKGludDE2X3QqKWFyZ3NbMjddOworCXVpbnQzMl90CXVpMzJfMwk9ICoodWludDMyX3QqKWFyZ3NbMjhdOworCWludDMyX3QJCXNpMzJfMwk9ICooaW50MzJfdCopYXJnc1syOV07CisJdWludDY0X3QJdWk2NF8zCT0gKih1aW50NjRfdCopYXJnc1szMF07CisJaW50NjRfdAkJc2k2NF8zCT0gKihpbnQ2NF90KilhcmdzWzMxXTsKKwlmbG9hdAkJZl8zCQk9ICooZmxvYXQqKWFyZ3NbMzJdOworCWRvdWJsZQkJZF8zCQk9ICooZG91YmxlKilhcmdzWzMzXTsKKwlsb25nIGRvdWJsZQlsZF8zCT0gKihsb25nIGRvdWJsZSopYXJnc1szNF07CisJY2hhcioJCXBfMwkJPSAqKGNoYXIqKilhcmdzWzM1XTsKKwl1aW50OF90CQl1aThfNAk9ICoodWludDhfdCopYXJnc1szNl07CisJaW50OF90CQlzaThfNAk9ICooaW50OF90KilhcmdzWzM3XTsKKwl1aW50MTZfdAl1aTE2XzQJPSAqKHVpbnQxNl90KilhcmdzWzM4XTsKKwlpbnQxNl90CQlzaTE2XzQJPSAqKGludDE2X3QqKWFyZ3NbMzldOworCXVpbnQzMl90CXVpMzJfNAk9ICoodWludDMyX3QqKWFyZ3NbNDBdOworCWludDMyX3QJCXNpMzJfNAk9ICooaW50MzJfdCopYXJnc1s0MV07CisJdWludDY0X3QJdWk2NF80CT0gKih1aW50NjRfdCopYXJnc1s0Ml07CisJaW50NjRfdAkJc2k2NF80CT0gKihpbnQ2NF90KilhcmdzWzQzXTsKKwlmbG9hdAkJZl80CQk9ICooZmxvYXQqKWFyZ3NbNDRdOworCWRvdWJsZQkJZF80CQk9ICooZG91YmxlKilhcmdzWzQ1XTsKKwlsb25nIGRvdWJsZQlsZF80CT0gKihsb25nIGRvdWJsZSopYXJnc1s0Nl07CisJY2hhcioJCXBfNAkJPSAqKGNoYXIqKilhcmdzWzQ3XTsKKwl1aW50OF90CQl1aThfNQk9ICoodWludDhfdCopYXJnc1s0OF07CisJaW50OF90CQlzaThfNQk9ICooaW50OF90KilhcmdzWzQ5XTsKKworCSooQmlnU3RydWN0KilyZXNwID0gdGVzdF9sYXJnZV9mbigKKwkJdWk4XzEsIHNpOF8xLCB1aTE2XzEsIHNpMTZfMSwgdWkzMl8xLCBzaTMyXzEsIHVpNjRfMSwgc2k2NF8xLCBmXzEsIGRfMSwgbGRfMSwgcF8xLAorCQl1aThfMiwgc2k4XzIsIHVpMTZfMiwgc2kxNl8yLCB1aTMyXzIsIHNpMzJfMiwgdWk2NF8yLCBzaTY0XzIsIGZfMiwgZF8yLCBsZF8yLCBwXzIsCisJCXVpOF8zLCBzaThfMywgdWkxNl8zLCBzaTE2XzMsIHVpMzJfMywgc2kzMl8zLCB1aTY0XzMsIHNpNjRfMywgZl8zLCBkXzMsIGxkXzMsIHBfMywKKwkJdWk4XzQsIHNpOF80LCB1aTE2XzQsIHNpMTZfNCwgdWkzMl80LCBzaTMyXzQsIHVpNjRfNCwgc2k2NF80LCBmXzQsIGRfNCwgbGRfNCwgcF80LAorCQl1aThfNSwgc2k4XzUpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MgX19VTlVTRURfXywgY29uc3QgY2hhcioqIGFyZ3YgX19VTlVTRURfXykKK3sKKyAgICAgICAgdm9pZCAqY29kZTsKKwlmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworCisJZmZpX2NpZgkJY2lmOworCWZmaV90eXBlKglhcmdUeXBlc1s1MV07CisJdm9pZCoJCWFyZ1ZhbHVlc1s1MV07CisKKwlmZmlfdHlwZQlyZXRfc3RydWN0X3R5cGU7CisJZmZpX3R5cGUqCXN0X2ZpZWxkc1s1MV07CisJQmlnU3RydWN0CXJldFZhbDsKKworCW1lbXNldCAoJnJldFZhbCwgMCwgc2l6ZW9mKHJldFZhbCkpOworCisJcmV0X3N0cnVjdF90eXBlLnNpemUgPSAwOworCXJldF9zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworCXJldF9zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworCXJldF9zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IHN0X2ZpZWxkczsKKworCXN0X2ZpZWxkc1swXQk9IHN0X2ZpZWxkc1sxMl0JPSBzdF9maWVsZHNbMjRdCT0gc3RfZmllbGRzWzM2XQk9IHN0X2ZpZWxkc1s0OF0JPSAmZmZpX3R5cGVfdWludDg7CisJc3RfZmllbGRzWzFdCT0gc3RfZmllbGRzWzEzXQk9IHN0X2ZpZWxkc1syNV0JPSBzdF9maWVsZHNbMzddCT0gc3RfZmllbGRzWzQ5XQk9ICZmZmlfdHlwZV9zaW50ODsKKwlzdF9maWVsZHNbMl0JPSBzdF9maWVsZHNbMTRdCT0gc3RfZmllbGRzWzI2XQk9IHN0X2ZpZWxkc1szOF0JPSAmZmZpX3R5cGVfdWludDE2OworCXN0X2ZpZWxkc1szXQk9IHN0X2ZpZWxkc1sxNV0JPSBzdF9maWVsZHNbMjddCT0gc3RfZmllbGRzWzM5XQk9ICZmZmlfdHlwZV9zaW50MTY7CisJc3RfZmllbGRzWzRdCT0gc3RfZmllbGRzWzE2XQk9IHN0X2ZpZWxkc1syOF0JPSBzdF9maWVsZHNbNDBdCT0gJmZmaV90eXBlX3VpbnQzMjsKKwlzdF9maWVsZHNbNV0JPSBzdF9maWVsZHNbMTddCT0gc3RfZmllbGRzWzI5XQk9IHN0X2ZpZWxkc1s0MV0JPSAmZmZpX3R5cGVfc2ludDMyOworCXN0X2ZpZWxkc1s2XQk9IHN0X2ZpZWxkc1sxOF0JPSBzdF9maWVsZHNbMzBdCT0gc3RfZmllbGRzWzQyXQk9ICZmZmlfdHlwZV91aW50NjQ7CisJc3RfZmllbGRzWzddCT0gc3RfZmllbGRzWzE5XQk9IHN0X2ZpZWxkc1szMV0JPSBzdF9maWVsZHNbNDNdCT0gJmZmaV90eXBlX3NpbnQ2NDsKKwlzdF9maWVsZHNbOF0JPSBzdF9maWVsZHNbMjBdCT0gc3RfZmllbGRzWzMyXQk9IHN0X2ZpZWxkc1s0NF0JPSAmZmZpX3R5cGVfZmxvYXQ7CisJc3RfZmllbGRzWzldCT0gc3RfZmllbGRzWzIxXQk9IHN0X2ZpZWxkc1szM10JPSBzdF9maWVsZHNbNDVdCT0gJmZmaV90eXBlX2RvdWJsZTsKKwlzdF9maWVsZHNbMTBdCT0gc3RfZmllbGRzWzIyXQk9IHN0X2ZpZWxkc1szNF0JPSBzdF9maWVsZHNbNDZdCT0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisJc3RfZmllbGRzWzExXQk9IHN0X2ZpZWxkc1syM10JPSBzdF9maWVsZHNbMzVdCT0gc3RfZmllbGRzWzQ3XQk9ICZmZmlfdHlwZV9wb2ludGVyOworCisJc3RfZmllbGRzWzUwXSA9IE5VTEw7CisKKwl1aW50OF90CQl1aTgJCT0gMTsKKwlpbnQ4X3QJCXNpOAkJPSAyOworCXVpbnQxNl90CXVpMTYJPSAzOworCWludDE2X3QJCXNpMTYJPSA0OworCXVpbnQzMl90CXVpMzIJPSA1OworCWludDMyX3QJCXNpMzIJPSA2OworCXVpbnQ2NF90CXVpNjQJPSA3OworCWludDY0X3QJCXNpNjQJPSA4OworCWZsb2F0CQlmCQk9IDk7CisJZG91YmxlCQlkCQk9IDEwOworCWxvbmcgZG91YmxlCWxkCQk9IDExOworCWNoYXIqCQlwCQk9IChjaGFyKikweDEyMzQ1Njc4OworCisJYXJnVHlwZXNbMF0JCT0gYXJnVHlwZXNbMTJdCT0gYXJnVHlwZXNbMjRdCT0gYXJnVHlwZXNbMzZdCT0gYXJnVHlwZXNbNDhdCT0gJmZmaV90eXBlX3VpbnQ4OworCWFyZ1ZhbHVlc1swXQk9IGFyZ1ZhbHVlc1sxMl0JPSBhcmdWYWx1ZXNbMjRdCT0gYXJnVmFsdWVzWzM2XQk9IGFyZ1ZhbHVlc1s0OF0JPSAmdWk4OworCWFyZ1R5cGVzWzFdCQk9IGFyZ1R5cGVzWzEzXQk9IGFyZ1R5cGVzWzI1XQk9IGFyZ1R5cGVzWzM3XQk9IGFyZ1R5cGVzWzQ5XQk9ICZmZmlfdHlwZV9zaW50ODsKKwlhcmdWYWx1ZXNbMV0JPSBhcmdWYWx1ZXNbMTNdCT0gYXJnVmFsdWVzWzI1XQk9IGFyZ1ZhbHVlc1szN10JPSBhcmdWYWx1ZXNbNDldCT0gJnNpODsKKwlhcmdUeXBlc1syXQkJPSBhcmdUeXBlc1sxNF0JPSBhcmdUeXBlc1syNl0JPSBhcmdUeXBlc1szOF0JPSAmZmZpX3R5cGVfdWludDE2OworCWFyZ1ZhbHVlc1syXQk9IGFyZ1ZhbHVlc1sxNF0JPSBhcmdWYWx1ZXNbMjZdCT0gYXJnVmFsdWVzWzM4XQk9ICZ1aTE2OworCWFyZ1R5cGVzWzNdCQk9IGFyZ1R5cGVzWzE1XQk9IGFyZ1R5cGVzWzI3XQk9IGFyZ1R5cGVzWzM5XQk9ICZmZmlfdHlwZV9zaW50MTY7CisJYXJnVmFsdWVzWzNdCT0gYXJnVmFsdWVzWzE1XQk9IGFyZ1ZhbHVlc1syN10JPSBhcmdWYWx1ZXNbMzldCT0gJnNpMTY7CisJYXJnVHlwZXNbNF0JCT0gYXJnVHlwZXNbMTZdCT0gYXJnVHlwZXNbMjhdCT0gYXJnVHlwZXNbNDBdCT0gJmZmaV90eXBlX3VpbnQzMjsKKwlhcmdWYWx1ZXNbNF0JPSBhcmdWYWx1ZXNbMTZdCT0gYXJnVmFsdWVzWzI4XQk9IGFyZ1ZhbHVlc1s0MF0JPSAmdWkzMjsKKwlhcmdUeXBlc1s1XQkJPSBhcmdUeXBlc1sxN10JPSBhcmdUeXBlc1syOV0JPSBhcmdUeXBlc1s0MV0JPSAmZmZpX3R5cGVfc2ludDMyOworCWFyZ1ZhbHVlc1s1XQk9IGFyZ1ZhbHVlc1sxN10JPSBhcmdWYWx1ZXNbMjldCT0gYXJnVmFsdWVzWzQxXQk9ICZzaTMyOworCWFyZ1R5cGVzWzZdCQk9IGFyZ1R5cGVzWzE4XQk9IGFyZ1R5cGVzWzMwXQk9IGFyZ1R5cGVzWzQyXQk9ICZmZmlfdHlwZV91aW50NjQ7CisJYXJnVmFsdWVzWzZdCT0gYXJnVmFsdWVzWzE4XQk9IGFyZ1ZhbHVlc1szMF0JPSBhcmdWYWx1ZXNbNDJdCT0gJnVpNjQ7CisJYXJnVHlwZXNbN10JCT0gYXJnVHlwZXNbMTldCT0gYXJnVHlwZXNbMzFdCT0gYXJnVHlwZXNbNDNdCT0gJmZmaV90eXBlX3NpbnQ2NDsKKwlhcmdWYWx1ZXNbN10JPSBhcmdWYWx1ZXNbMTldCT0gYXJnVmFsdWVzWzMxXQk9IGFyZ1ZhbHVlc1s0M10JPSAmc2k2NDsKKwlhcmdUeXBlc1s4XQkJPSBhcmdUeXBlc1syMF0JPSBhcmdUeXBlc1szMl0JPSBhcmdUeXBlc1s0NF0JPSAmZmZpX3R5cGVfZmxvYXQ7CisJYXJnVmFsdWVzWzhdCT0gYXJnVmFsdWVzWzIwXQk9IGFyZ1ZhbHVlc1szMl0JPSBhcmdWYWx1ZXNbNDRdCT0gJmY7CisJYXJnVHlwZXNbOV0JCT0gYXJnVHlwZXNbMjFdCT0gYXJnVHlwZXNbMzNdCT0gYXJnVHlwZXNbNDVdCT0gJmZmaV90eXBlX2RvdWJsZTsKKwlhcmdWYWx1ZXNbOV0JPSBhcmdWYWx1ZXNbMjFdCT0gYXJnVmFsdWVzWzMzXQk9IGFyZ1ZhbHVlc1s0NV0JPSAmZDsKKwlhcmdUeXBlc1sxMF0JPSBhcmdUeXBlc1syMl0JPSBhcmdUeXBlc1szNF0JPSBhcmdUeXBlc1s0Nl0JPSAmZmZpX3R5cGVfbG9uZ2RvdWJsZTsKKwlhcmdWYWx1ZXNbMTBdCT0gYXJnVmFsdWVzWzIyXQk9IGFyZ1ZhbHVlc1szNF0JPSBhcmdWYWx1ZXNbNDZdCT0gJmxkOworCWFyZ1R5cGVzWzExXQk9IGFyZ1R5cGVzWzIzXQk9IGFyZ1R5cGVzWzM1XQk9IGFyZ1R5cGVzWzQ3XQk9ICZmZmlfdHlwZV9wb2ludGVyOworCWFyZ1ZhbHVlc1sxMV0JPSBhcmdWYWx1ZXNbMjNdCT0gYXJnVmFsdWVzWzM1XQk9IGFyZ1ZhbHVlc1s0N10JPSAmcDsKKworCWFyZ1R5cGVzWzUwXQk9IE5VTEw7CisJYXJnVmFsdWVzWzUwXQk9IE5VTEw7CisKKwlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA1MCwgJnJldF9zdHJ1Y3RfdHlwZSwgYXJnVHlwZXMpID09IEZGSV9PSyk7CisKKwlmZmlfY2FsbCgmY2lmLCBGRklfRk4odGVzdF9sYXJnZV9mbiksICZyZXRWYWwsIGFyZ1ZhbHVlcyk7CisJLy8geyBkZy1vdXRwdXQgIjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDB4MTIzNDU2NzggMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMHgxMjM0NTY3OCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAweDEyMzQ1Njc4IDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDB4MTIzNDU2NzggMSAyOiAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMHgxMjM0NTY3OSAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDB4MTIzNDU2N2EgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMHgxMjM0NTY3YiA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMHgxMjM0NTY3YyA2IDciIH0KKwlwcmludGYoInJlczogJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggIgorCQkiJSIgUFJJdTggIiAlIiBQUklkOCAiICVodSAlaGQgJXUgJWQgJSIgUFJJdTY0ICIgJSIgUFJJZDY0ICIgJS4wZiAlLjBmICUuMExmICUjbHggJSIgUFJJdTggIiAlIiBQUklkOCAiXG4iLAorCQlyZXRWYWwuYSwgcmV0VmFsLmIsIHJldFZhbC5jLCByZXRWYWwuZCwgcmV0VmFsLmUsIHJldFZhbC5mLAorCSAgICAgICByZXRWYWwuZywgcmV0VmFsLmgsIHJldFZhbC5pLCByZXRWYWwuaiwgcmV0VmFsLmssICh1bnNpZ25lZCBsb25nKXJldFZhbC5sLAorCQlyZXRWYWwubSwgcmV0VmFsLm4sIHJldFZhbC5vLCByZXRWYWwucCwgcmV0VmFsLnEsIHJldFZhbC5yLAorCSAgICAgICByZXRWYWwucywgcmV0VmFsLnQsIHJldFZhbC51LCByZXRWYWwudiwgcmV0VmFsLncsICh1bnNpZ25lZCBsb25nKXJldFZhbC54LAorCQlyZXRWYWwueSwgcmV0VmFsLnosIHJldFZhbC5hYSwgcmV0VmFsLmJiLCByZXRWYWwuY2MsIHJldFZhbC5kZCwKKwkgICAgICAgcmV0VmFsLmVlLCByZXRWYWwuZmYsIHJldFZhbC5nZywgcmV0VmFsLmhoLCByZXRWYWwuaWksICh1bnNpZ25lZCBsb25nKXJldFZhbC5qaiwKKwkJcmV0VmFsLmtrLCByZXRWYWwubGwsIHJldFZhbC5tbSwgcmV0VmFsLm5uLCByZXRWYWwub28sIHJldFZhbC5wcCwKKwkgICAgICAgcmV0VmFsLnFxLCByZXRWYWwucnIsIHJldFZhbC5zcywgcmV0VmFsLnR0LCByZXRWYWwudXUsICh1bnNpZ25lZCBsb25nKXJldFZhbC52diwgcmV0VmFsLnd3LCByZXRWYWwueHgpOworCS8vIHsgZGctb3V0cHV0ICJcbnJlczogMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDB4MTIzNDU2NzkgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAweDEyMzQ1NjdhIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDB4MTIzNDU2N2IgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDB4MTIzNDU2N2MgNiA3IiB9CisKKwlDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19sYXJnZV9mbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworCXJldFZhbAk9ICgoQmlnU3RydWN0KCopKAorCQl1aW50OF90LCBpbnQ4X3QsIHVpbnQxNl90LCBpbnQxNl90LCB1aW50MzJfdCwgaW50MzJfdCwgdWludDY0X3QsIGludDY0X3QsIGZsb2F0LCBkb3VibGUsIGxvbmcgZG91YmxlLCBjaGFyKiwKKwkJdWludDhfdCwgaW50OF90LCB1aW50MTZfdCwgaW50MTZfdCwgdWludDMyX3QsIGludDMyX3QsIHVpbnQ2NF90LCBpbnQ2NF90LCBmbG9hdCwgZG91YmxlLCBsb25nIGRvdWJsZSwgY2hhciosCisJCXVpbnQ4X3QsIGludDhfdCwgdWludDE2X3QsIGludDE2X3QsIHVpbnQzMl90LCBpbnQzMl90LCB1aW50NjRfdCwgaW50NjRfdCwgZmxvYXQsIGRvdWJsZSwgbG9uZyBkb3VibGUsIGNoYXIqLAorCQl1aW50OF90LCBpbnQ4X3QsIHVpbnQxNl90LCBpbnQxNl90LCB1aW50MzJfdCwgaW50MzJfdCwgdWludDY0X3QsIGludDY0X3QsIGZsb2F0LCBkb3VibGUsIGxvbmcgZG91YmxlLCBjaGFyKiwKKwkJdWludDhfdCwgaW50OF90KSkoY29kZSkpKAorCQl1aTgsIHNpOCwgdWkxNiwgc2kxNiwgdWkzMiwgc2kzMiwgdWk2NCwgc2k2NCwgZiwgZCwgbGQsIHAsCisJCXVpOCwgc2k4LCB1aTE2LCBzaTE2LCB1aTMyLCBzaTMyLCB1aTY0LCBzaTY0LCBmLCBkLCBsZCwgcCwKKwkJdWk4LCBzaTgsIHVpMTYsIHNpMTYsIHVpMzIsIHNpMzIsIHVpNjQsIHNpNjQsIGYsIGQsIGxkLCBwLAorCQl1aTgsIHNpOCwgdWkxNiwgc2kxNiwgdWkzMiwgc2kzMiwgdWk2NCwgc2k2NCwgZiwgZCwgbGQsIHAsCisJCXVpOCwgc2k4KTsKKwkvLyB7IGRnLW91dHB1dCAiXG4xIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAweDEyMzQ1Njc4IDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDB4MTIzNDU2NzggMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMHgxMjM0NTY3OCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAweDEyMzQ1Njc4IDEgMjogMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDB4MTIzNDU2NzkgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAweDEyMzQ1NjdhIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDB4MTIzNDU2N2IgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDB4MTIzNDU2N2MgNiA3IiB9CisJcHJpbnRmKCJyZXM6ICUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICIKKwkJIiUiIFBSSXU4ICIgJSIgUFJJZDggIiAlaHUgJWhkICV1ICVkICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiICUuMGYgJS4wZiAlLjBMZiAlI2x4ICUiIFBSSXU4ICIgJSIgUFJJZDggIlxuIiwKKwkJcmV0VmFsLmEsIHJldFZhbC5iLCByZXRWYWwuYywgcmV0VmFsLmQsIHJldFZhbC5lLCByZXRWYWwuZiwKKwkgICAgICAgcmV0VmFsLmcsIHJldFZhbC5oLCByZXRWYWwuaSwgcmV0VmFsLmosIHJldFZhbC5rLCAodW5zaWduZWQgbG9uZylyZXRWYWwubCwKKwkJcmV0VmFsLm0sIHJldFZhbC5uLCByZXRWYWwubywgcmV0VmFsLnAsIHJldFZhbC5xLCByZXRWYWwuciwKKwkgICAgICAgcmV0VmFsLnMsIHJldFZhbC50LCByZXRWYWwudSwgcmV0VmFsLnYsIHJldFZhbC53LCAodW5zaWduZWQgbG9uZylyZXRWYWwueCwKKwkJcmV0VmFsLnksIHJldFZhbC56LCByZXRWYWwuYWEsIHJldFZhbC5iYiwgcmV0VmFsLmNjLCByZXRWYWwuZGQsCisJICAgICAgIHJldFZhbC5lZSwgcmV0VmFsLmZmLCByZXRWYWwuZ2csIHJldFZhbC5oaCwgcmV0VmFsLmlpLCAodW5zaWduZWQgbG9uZylyZXRWYWwuamosCisJCXJldFZhbC5raywgcmV0VmFsLmxsLCByZXRWYWwubW0sIHJldFZhbC5ubiwgcmV0VmFsLm9vLCByZXRWYWwucHAsCisJICAgICAgIHJldFZhbC5xcSwgcmV0VmFsLnJyLCByZXRWYWwuc3MsIHJldFZhbC50dCwgcmV0VmFsLnV1LCAodW5zaWduZWQgbG9uZylyZXRWYWwudnYsIHJldFZhbC53dywgcmV0VmFsLnh4KTsKKwkvLyB7IGRnLW91dHB1dCAiXG5yZXM6IDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAweDEyMzQ1Njc5IDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMHgxMjM0NTY3YSA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAweDEyMzQ1NjdiIDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAweDEyMzQ1NjdjIDYgNyIgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnkuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbWFueS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjliYTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnkuYwpAQCAtMCwwICsxLDY5IEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIGZsb2F0LCB3aXRoIG1hbnkgYXJndW1lbnRzCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKK3N0YXRpYyBmbG9hdCBtYW55KGZsb2F0IGYxLAorCQkgIGZsb2F0IGYyLAorCQkgIGZsb2F0IGYzLAorCQkgIGZsb2F0IGY0LAorCQkgIGZsb2F0IGY1LAorCQkgIGZsb2F0IGY2LAorCQkgIGZsb2F0IGY3LAorCQkgIGZsb2F0IGY4LAorCQkgIGZsb2F0IGY5LAorCQkgIGZsb2F0IGYxMCwKKwkJICBmbG9hdCBmMTEsCisJCSAgZmxvYXQgZjEyLAorCQkgIGZsb2F0IGYxMykKK3sKKyNpZiAwCisgIHByaW50ZigiJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWYgJWZcbiIsCisJIChkb3VibGUpIGYxLCAoZG91YmxlKSBmMiwgKGRvdWJsZSkgZjMsIChkb3VibGUpIGY0LCAoZG91YmxlKSBmNSwgCisJIChkb3VibGUpIGY2LCAoZG91YmxlKSBmNywgKGRvdWJsZSkgZjgsIChkb3VibGUpIGY5LCAoZG91YmxlKSBmMTAsCisJIChkb3VibGUpIGYxMSwgKGRvdWJsZSkgZjEyLCAoZG91YmxlKSBmMTMpOworI2VuZGlmCisKKyAgcmV0dXJuICgoZjEvZjIrZjMvZjQrZjUvZjYrZjcvZjgrZjkvZjEwK2YxMS9mMTIpICogZjEzKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1sxM107CisgIHZvaWQgKnZhbHVlc1sxM107CisgIGZsb2F0IGZhWzEzXTsKKyAgZmxvYXQgZiwgZmY7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorICAgIHsKKyAgICAgIGFyZ3NbaV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgICAgICB2YWx1ZXNbaV0gPSAmZmFbaV07CisgICAgICBmYVtpXSA9IChmbG9hdCkgaTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxMywgCisJCSAgICAgICAmZmZpX3R5cGVfZmxvYXQsIGFyZ3MpID09IEZGSV9PSyk7CisKKyAgICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obWFueSksICZmLCB2YWx1ZXMpOworCisgICAgZmYgPSAgbWFueShmYVswXSwgZmFbMV0sCisJICAgICAgIGZhWzJdLCBmYVszXSwKKwkgICAgICAgZmFbNF0sIGZhWzVdLAorCSAgICAgICBmYVs2XSwgZmFbN10sCisJICAgICAgIGZhWzhdLCBmYVs5XSwKKwkgICAgICAgZmFbMTBdLGZhWzExXSxmYVsxMl0pOworCisgICAgaWYgKGYgLSBmZiA8IEZMVF9FUFNJTE9OKQorICAgICAgZXhpdCgwKTsKKyAgICBlbHNlCisgICAgICBhYm9ydCgpOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9tYW55X3dpbjMyLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL21hbnlfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjI2MzMyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9tYW55X3dpbjMyLmMKQEAgLTAsMCArMSw2MyBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0ZGNhbGwgbWFueSBjYWxsIG9uIFg4Nl9XSU4zMiBzeXN0ZW1zLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi1jeWd3aW4qIGk/ODYtKi1taW5ndyogfSB9ICovCisKKyNpbmNsdWRlICJmZml0ZXN0LmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKHN0ZGNhbGwpKSBzdGRjYWxsX21hbnkoZmxvYXQgZjEsCisJCQkJCQkgICBmbG9hdCBmMiwKKwkJCQkJCSAgIGZsb2F0IGYzLAorCQkJCQkJICAgZmxvYXQgZjQsCisJCQkJCQkgICBmbG9hdCBmNSwKKwkJCQkJCSAgIGZsb2F0IGY2LAorCQkJCQkJICAgZmxvYXQgZjcsCisJCQkJCQkgICBmbG9hdCBmOCwKKwkJCQkJCSAgIGZsb2F0IGY5LAorCQkJCQkJICAgZmxvYXQgZjEwLAorCQkJCQkJICAgZmxvYXQgZjExLAorCQkJCQkJICAgZmxvYXQgZjEyLAorCQkJCQkJICAgZmxvYXQgZjEzKQoreworICByZXR1cm4gKChmMS9mMitmMy9mNCtmNS9mNitmNy9mOCtmOS9mMTArZjExL2YxMikgKiBmMTMpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzWzEzXTsKKyAgdm9pZCAqdmFsdWVzWzEzXTsKKyAgZmxvYXQgZmFbMTNdOworICBmbG9hdCBmLCBmZjsKKyAgdW5zaWduZWQgbG9uZyB1bDsKKworICBmb3IgKHVsID0gMDsgdWwgPCAxMzsgdWwrKykKKyAgICB7CisgICAgICBhcmdzW3VsXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgICAgIHZhbHVlc1t1bF0gPSAmZmFbdWxdOworCWZhW3VsXSA9IChmbG9hdCkgdWw7CisgICAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX1NURENBTEwsIDEzLAorCQkgICAgICZmZmlfdHlwZV9mbG9hdCwgYXJncykgPT0gRkZJX09LKTsKKworICBmZiA9ICBzdGRjYWxsX21hbnkoZmFbMF0sIGZhWzFdLAorCQkgICAgIGZhWzJdLCBmYVszXSwKKwkJICAgICBmYVs0XSwgZmFbNV0sCisJCSAgICAgZmFbNl0sIGZhWzddLAorCQkgICAgIGZhWzhdLCBmYVs5XSwKKwkJICAgICBmYVsxMF0sIGZhWzExXSwgZmFbMTJdKTsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oc3RkY2FsbF9tYW55KSwgJmYsIHZhbHVlcyk7CisKKyAgaWYgKGYgLSBmZiA8IEZMVF9FUFNJTE9OKQorICAgIHByaW50Zigic3RkY2FsbCBtYW55IGFyZyB0ZXN0cyBvayFcbiIpOworICBlbHNlCisgICAgQ0hFQ0soMCk7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lZ2ludC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZWdpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY4MTEzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZWdpbnQuYwpAQCAtMCwwICsxLDUzIEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgdGhhdCBuZWdhdGl2ZSBpbnRlZ2VycyBhcmUgcGFzc2VkIGNvcnJlY3RseS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJRnJvbSB0aGUgb3JpZ2luYWwgZmZpdGVzdC5jICAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLW9wdGlvbnMgLU8yIH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIGludCBjaGVja2luZyhpbnQgYSwgc2hvcnQgYiwgc2lnbmVkIGNoYXIgYykKK3sKKworICByZXR1cm4gKGEgPCAwICYmIGIgPCAwICYmIGMgPCAwKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV9hcmcgcmludDsKKworICBzaWduZWQgaW50IHNpOworICBzaWduZWQgc2hvcnQgc3M7CisgIHNpZ25lZCBjaGFyIHNjOworCisgIGFyZ3NbMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgdmFsdWVzWzBdID0gJnNpOworICBhcmdzWzFdID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgdmFsdWVzWzFdID0gJnNzOworICBhcmdzWzJdID0gJmZmaV90eXBlX3NjaGFyOworICB2YWx1ZXNbMl0gPSAmc2M7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDMsCisJCSAgICAgJmZmaV90eXBlX3NpbnQsIGFyZ3MpID09IEZGSV9PSyk7CisKKyAgc2kgPSAtNjsKKyAgc3MgPSAtMTI7CisgIHNjID0gLTE7CisKKyAgY2hlY2tpbmcgKHNpLCBzcywgc2MpOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjaGVja2luZyksICZyaW50LCB2YWx1ZXMpOworCisgIHByaW50ZiAoIiVkIHZzICVkXG4iLCAoaW50KXJpbnQsIGNoZWNraW5nIChzaSwgc3MsIHNjKSk7CisKKyAgQ0hFQ0socmludCAhPSAwKTsKKworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdC5jCkBAIC0wLDAgKzEsMTUyIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJQ29udGFpbnMgc3RydWN0cyBhcyBwYXJhbWV0ZXIgb2YgdGhlIHN0cnVjdCBpdHNlbGYuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMSB7CisgIGRvdWJsZSBhOworICBmbG9hdCBiOworICBpbnQgYzsKK30gY2xzX3N0cnVjdF8xNmJ5dGUxOworCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTIgeworICBpbnQgaWk7CisgIGRvdWJsZSBkZDsKKyAgZmxvYXQgZmY7Cit9IGNsc19zdHJ1Y3RfMTZieXRlMjsKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCB7CisgIGNsc19zdHJ1Y3RfMTZieXRlMSBkOworICBjbHNfc3RydWN0XzE2Ynl0ZTIgZTsKK30gY2xzX3N0cnVjdF9jb21iaW5lZDsKKworY2xzX3N0cnVjdF9jb21iaW5lZCBjbHNfc3RydWN0X2NvbWJpbmVkX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEgYjAsCisJCQkgICAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMiBiMSwKKwkJCSAgICBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCBiMikKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQgcmVzdWx0OworCisgIHJlc3VsdC5kLmEgPSBiMC5hICsgYjEuZGQgKyBiMi5kLmE7CisgIHJlc3VsdC5kLmIgPSBiMC5iICsgYjEuZmYgKyBiMi5kLmI7CisgIHJlc3VsdC5kLmMgPSBiMC5jICsgYjEuaWkgKyBiMi5kLmM7CisgIHJlc3VsdC5lLmlpID0gYjAuYyArIGIxLmlpICsgYjIuZS5paTsKKyAgcmVzdWx0LmUuZGQgPSBiMC5hICsgYjEuZGQgKyBiMi5lLmRkOworICByZXN1bHQuZS5mZiA9IGIwLmIgKyBiMS5mZiArIGIyLmUuZmY7CisKKyAgcHJpbnRmKCIlZyAlZyAlZCAlZCAlZyAlZyAlZyAlZyAlZCAlZCAlZyAlZzogJWcgJWcgJWQgJWQgJWcgJWdcbiIsCisJIGIwLmEsIGIwLmIsIGIwLmMsCisJIGIxLmlpLCBiMS5kZCwgYjEuZmYsCisJIGIyLmQuYSwgYjIuZC5iLCBiMi5kLmMsCisJIGIyLmUuaWksIGIyLmUuZGQsIGIyLmUuZmYsCisJIHJlc3VsdC5kLmEsIHJlc3VsdC5kLmIsIHJlc3VsdC5kLmMsCisJIHJlc3VsdC5lLmlpLCByZXN1bHQuZS5kZCwgcmVzdWx0LmUuZmYpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0X2NvbWJpbmVkX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKwkJICAgICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEgYjA7CisgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTIgYjE7CisgIHN0cnVjdCBjbHNfc3RydWN0X2NvbWJpbmVkIGIyOworCisgIGIwID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUxKikoYXJnc1swXSk7CisgIGIxID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUyKikoYXJnc1sxXSk7CisgIGIyID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCopKGFyZ3NbMl0pOworCisKKyAgKihjbHNfc3RydWN0X2NvbWJpbmVkKilyZXNwID0gY2xzX3N0cnVjdF9jb21iaW5lZF9mbihiMCwgYjEsIGIyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHMxWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHMyWzVdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGUsIGNsc19zdHJ1Y3RfdHlwZTEsIGNsc19zdHJ1Y3RfdHlwZTI7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBjbHNfc3RydWN0X3R5cGUxLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUxLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlMS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMTsKKworICBjbHNfc3RydWN0X3R5cGUyLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUyLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlMi5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMjsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUxIGVfZGJsID0geyA5LjAsIDIuMCwgNn07CisgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTIgZl9kYmwgPSB7IDEsIDIuMCwgMy4wfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQgZ19kYmwgPSB7ezQuMCwgNS4wLCA2fSwKKwkJCQkgICAgICB7MywgMS4wLCA4LjB9fTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9zaW50OworICBjbHNfc3RydWN0X2ZpZWxkc1szXSA9IE5VTEw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzBdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzMVsxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzMVsyXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzNdID0gTlVMTDsKKworICBjbHNfc3RydWN0X2ZpZWxkczJbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBjbHNfc3RydWN0X2ZpZWxkczJbMV0gPSAmY2xzX3N0cnVjdF90eXBlMTsKKyAgY2xzX3N0cnVjdF9maWVsZHMyWzJdID0gTlVMTDsKKworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTE7CisgIGRibF9hcmdfdHlwZXNbMl0gPSAmY2xzX3N0cnVjdF90eXBlMjsKKyAgZGJsX2FyZ190eXBlc1szXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMywgJmNsc19zdHJ1Y3RfdHlwZTIsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gJmdfZGJsOworICBhcmdzX2RibFszXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfY29tYmluZWRfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiOSAyIDYgMSAyIDMgNCA1IDYgMyAxIDg6IDE1IDEwIDEzIDEwIDEyIDEzIiB9ICovCisgIENIRUNLKCByZXNfZGJsLmQuYSA9PSAoZV9kYmwuYSArIGZfZGJsLmRkICsgZ19kYmwuZC5hKSk7CisgIENIRUNLKCByZXNfZGJsLmQuYiA9PSAoZV9kYmwuYiArIGZfZGJsLmZmICsgZ19kYmwuZC5iKSk7CisgIENIRUNLKCByZXNfZGJsLmQuYyA9PSAoZV9kYmwuYyArIGZfZGJsLmlpICsgZ19kYmwuZC5jKSk7CisgIENIRUNLKCByZXNfZGJsLmUuaWkgPT0gKGVfZGJsLmMgKyBmX2RibC5paSArIGdfZGJsLmUuaWkpKTsKKyAgQ0hFQ0soIHJlc19kYmwuZS5kZCA9PSAoZV9kYmwuYSArIGZfZGJsLmRkICsgZ19kYmwuZS5kZCkpOworICBDSEVDSyggcmVzX2RibC5lLmZmID09IChlX2RibC5iICsgZl9kYmwuZmYgKyBnX2RibC5lLmZmKSk7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0X2NvbWJpbmVkX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKGNsc19zdHJ1Y3RfY29tYmluZWQoKikoY2xzX3N0cnVjdF8xNmJ5dGUxLAorCQkJCSAgICAgY2xzX3N0cnVjdF8xNmJ5dGUyLAorCQkJCSAgICAgY2xzX3N0cnVjdF9jb21iaW5lZCkpCisJICAgICAoY29kZSkpKGVfZGJsLCBmX2RibCwgZ19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG45IDIgNiAxIDIgMyA0IDUgNiAzIDEgODogMTUgMTAgMTMgMTAgMTIgMTMiIH0gKi8KKyAgQ0hFQ0soIHJlc19kYmwuZC5hID09IChlX2RibC5hICsgZl9kYmwuZGQgKyBnX2RibC5kLmEpKTsKKyAgQ0hFQ0soIHJlc19kYmwuZC5iID09IChlX2RibC5iICsgZl9kYmwuZmYgKyBnX2RibC5kLmIpKTsKKyAgQ0hFQ0soIHJlc19kYmwuZC5jID09IChlX2RibC5jICsgZl9kYmwuaWkgKyBnX2RibC5kLmMpKTsKKyAgQ0hFQ0soIHJlc19kYmwuZS5paSA9PSAoZV9kYmwuYyArIGZfZGJsLmlpICsgZ19kYmwuZS5paSkpOworICBDSEVDSyggcmVzX2RibC5lLmRkID09IChlX2RibC5hICsgZl9kYmwuZGQgKyBnX2RibC5lLmRkKSk7CisgIENIRUNLKCByZXNfZGJsLmUuZmYgPT0gKGVfZGJsLmIgKyBmX2RibC5mZiArIGdfZGJsLmUuZmYpKTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTlmNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MS5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJQ29udGFpbnMgc3RydWN0cyBhcyBwYXJhbWV0ZXIgb2YgdGhlIHN0cnVjdCBpdHNlbGYuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA4MjgJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMSB7CisgIGRvdWJsZSBhOworICBmbG9hdCBiOworICBpbnQgYzsKK30gY2xzX3N0cnVjdF8xNmJ5dGUxOworCit0eXBlZGVmIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTIgeworICBpbnQgaWk7CisgIGRvdWJsZSBkZDsKKyAgZmxvYXQgZmY7Cit9IGNsc19zdHJ1Y3RfMTZieXRlMjsKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCB7CisgIGNsc19zdHJ1Y3RfMTZieXRlMSBkOworICBjbHNfc3RydWN0XzE2Ynl0ZTIgZTsKK30gY2xzX3N0cnVjdF9jb21iaW5lZDsKKworY2xzX3N0cnVjdF9jb21iaW5lZCBjbHNfc3RydWN0X2NvbWJpbmVkX2ZuKHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEgYjAsCisJCQkJCSAgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTIgYjEsCisJCQkJCSAgIHN0cnVjdCBjbHNfc3RydWN0X2NvbWJpbmVkIGIyLAorCQkJCQkgICBzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUxIGIzKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCByZXN1bHQ7CisKKyAgcmVzdWx0LmQuYSA9IGIwLmEgKyBiMS5kZCArIGIyLmQuYTsKKyAgcmVzdWx0LmQuYiA9IGIwLmIgKyBiMS5mZiArIGIyLmQuYjsKKyAgcmVzdWx0LmQuYyA9IGIwLmMgKyBiMS5paSArIGIyLmQuYzsKKyAgcmVzdWx0LmUuaWkgPSBiMC5jICsgYjEuaWkgKyBiMi5lLmlpOworICByZXN1bHQuZS5kZCA9IGIwLmEgKyBiMS5kZCArIGIyLmUuZGQ7CisgIHJlc3VsdC5lLmZmID0gYjAuYiArIGIxLmZmICsgYjIuZS5mZjsKKworICBwcmludGYoIiVnICVnICVkICVkICVnICVnICVnICVnICVkICVkICVnICVnICVnICVnICVkOiAlZyAlZyAlZCAlZCAlZyAlZ1xuIiwKKwkgYjAuYSwgYjAuYiwgYjAuYywKKwkgYjEuaWksIGIxLmRkLCBiMS5mZiwKKwkgYjIuZC5hLCBiMi5kLmIsIGIyLmQuYywKKwkgYjIuZS5paSwgYjIuZS5kZCwgYjIuZS5mZiwKKwkgYjMuYSwgYjMuYiwgYjMuYywKKwkgcmVzdWx0LmQuYSwgcmVzdWx0LmQuYiwgcmVzdWx0LmQuYywKKwkgcmVzdWx0LmUuaWksIHJlc3VsdC5lLmRkLCByZXN1bHQuZS5mZik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2Nsc19zdHJ1Y3RfY29tYmluZWRfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorCQkgICAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMSBiMDsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMiBiMTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQgYjI7CisgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEgYjM7CisKKyAgYjAgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTEqKShhcmdzWzBdKTsKKyAgYjEgPSAqKHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTIqKShhcmdzWzFdKTsKKyAgYjIgPSAqKHN0cnVjdCBjbHNfc3RydWN0X2NvbWJpbmVkKikoYXJnc1syXSk7CisgIGIzID0gKihzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUxKikoYXJnc1szXSk7CisKKworICAqKGNsc19zdHJ1Y3RfY29tYmluZWQqKXJlc3AgPSBjbHNfc3RydWN0X2NvbWJpbmVkX2ZuKGIwLCBiMSwgYjIsIGIzKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs1XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHMxWzVdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHMyWzVdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGUsIGNsc19zdHJ1Y3RfdHlwZTEsIGNsc19zdHJ1Y3RfdHlwZTI7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBjbHNfc3RydWN0X3R5cGUxLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUxLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlMS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMTsKKworICBjbHNfc3RydWN0X3R5cGUyLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUyLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlMi5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMjsKKworICBzdHJ1Y3QgY2xzX3N0cnVjdF8xNmJ5dGUxIGVfZGJsID0geyA5LjAsIDIuMCwgNn07CisgIHN0cnVjdCBjbHNfc3RydWN0XzE2Ynl0ZTIgZl9kYmwgPSB7IDEsIDIuMCwgMy4wfTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQgZ19kYmwgPSB7ezQuMCwgNS4wLCA2fSwKKwkJCQkgICAgICB7MywgMS4wLCA4LjB9fTsKKyAgc3RydWN0IGNsc19zdHJ1Y3RfMTZieXRlMSBoX2RibCA9IHsgMy4wLCAyLjAsIDR9OworICBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX3NpbnQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzNdID0gTlVMTDsKKworICBjbHNfc3RydWN0X2ZpZWxkczFbMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzJdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbHNfc3RydWN0X2ZpZWxkczFbM10gPSBOVUxMOworCisgIGNsc19zdHJ1Y3RfZmllbGRzMlswXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzMlsxXSA9ICZjbHNfc3RydWN0X3R5cGUxOworICBjbHNfc3RydWN0X2ZpZWxkczJbMl0gPSBOVUxMOworCisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlMTsKKyAgZGJsX2FyZ190eXBlc1syXSA9ICZjbHNfc3RydWN0X3R5cGUyOworICBkYmxfYXJnX3R5cGVzWzNdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1s0XSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgNCwgJmNsc19zdHJ1Y3RfdHlwZTIsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gJmdfZGJsOworICBhcmdzX2RibFszXSA9ICZoX2RibDsKKyAgYXJnc19kYmxbNF0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0X2NvbWJpbmVkX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjkgMiA2IDEgMiAzIDQgNSA2IDMgMSA4IDMgMiA0OiAxNSAxMCAxMyAxMCAxMiAxMyIgfSAqLworICBDSEVDSyggcmVzX2RibC5kLmEgPT0gKGVfZGJsLmEgKyBmX2RibC5kZCArIGdfZGJsLmQuYSkpOworICBDSEVDSyggcmVzX2RibC5kLmIgPT0gKGVfZGJsLmIgKyBmX2RibC5mZiArIGdfZGJsLmQuYikpOworICBDSEVDSyggcmVzX2RibC5kLmMgPT0gKGVfZGJsLmMgKyBmX2RibC5paSArIGdfZGJsLmQuYykpOworICBDSEVDSyggcmVzX2RibC5lLmlpID09IChlX2RibC5jICsgZl9kYmwuaWkgKyBnX2RibC5lLmlpKSk7CisgIENIRUNLKCByZXNfZGJsLmUuZGQgPT0gKGVfZGJsLmEgKyBmX2RibC5kZCArIGdfZGJsLmUuZGQpKTsKKyAgQ0hFQ0soIHJlc19kYmwuZS5mZiA9PSAoZV9kYmwuYiArIGZfZGJsLmZmICsgZ19kYmwuZS5mZikpOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF9jb21iaW5lZF9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChjbHNfc3RydWN0X2NvbWJpbmVkKCopKGNsc19zdHJ1Y3RfMTZieXRlMSwKKwkJCQkgICAgIGNsc19zdHJ1Y3RfMTZieXRlMiwKKwkJCQkgICAgIGNsc19zdHJ1Y3RfY29tYmluZWQsCisJCQkJICAgICBjbHNfc3RydWN0XzE2Ynl0ZTEpKQorCSAgICAgKGNvZGUpKShlX2RibCwgZl9kYmwsIGdfZGJsLCBoX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjkgMiA2IDEgMiAzIDQgNSA2IDMgMSA4IDMgMiA0OiAxNSAxMCAxMyAxMCAxMiAxMyIgfSAqLworICBDSEVDSyggcmVzX2RibC5kLmEgPT0gKGVfZGJsLmEgKyBmX2RibC5kZCArIGdfZGJsLmQuYSkpOworICBDSEVDSyggcmVzX2RibC5kLmIgPT0gKGVfZGJsLmIgKyBmX2RibC5mZiArIGdfZGJsLmQuYikpOworICBDSEVDSyggcmVzX2RibC5kLmMgPT0gKGVfZGJsLmMgKyBmX2RibC5paSArIGdfZGJsLmQuYykpOworICBDSEVDSyggcmVzX2RibC5lLmlpID09IChlX2RibC5jICsgZl9kYmwuaWkgKyBnX2RibC5lLmlpKSk7CisgIENIRUNLKCByZXNfZGJsLmUuZGQgPT0gKGVfZGJsLmEgKyBmX2RibC5kZCArIGdfZGJsLmUuZGQpKTsKKyAgQ0hFQ0soIHJlc19kYmwuZS5mZiA9PSAoZV9kYmwuYiArIGZfZGJsLmZmICsgZ19kYmwuZS5mZikpOworICAvLyAgQ0hFQ0soIDEgPT0gMCk7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QxMC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE3MThiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0MTAuYwpAQCAtMCwwICsxLDEzMyBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCUNvbnRhaW5zIHN0cnVjdHMgYXMgcGFyYW1ldGVyIG9mIHRoZSBzdHJ1Y3QgaXRzZWxmLgorCQlTYW1wbGUgdGFrZW4gZnJvbSBBbGFuIE1vZHJhcyBwYXRjaCB0byBzcmMvcHJlcF9jaWYuYy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDA1MTAxMAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQSB7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBhOworICB1bnNpZ25lZCBjaGFyIGI7Cit9IEE7CisKK3R5cGVkZWYgc3RydWN0IEIgeworICB1bnNpZ25lZCBjaGFyIHk7CisgIHN0cnVjdCBBIHg7CisgIHVuc2lnbmVkIGludCB6OworfSBCOworCit0eXBlZGVmIHN0cnVjdCBDIHsKKyAgdW5zaWduZWQgbG9uZyBsb25nIGQ7CisgIHVuc2lnbmVkIGNoYXIgZTsKK30gQzsKKworc3RhdGljIEIgQl9mbihzdHJ1Y3QgQSBiMiwgc3RydWN0IEIgYjMsIHN0cnVjdCBDIGI0KQoreworICBzdHJ1Y3QgQiByZXN1bHQ7CisKKyAgcmVzdWx0LnguYSA9IGIyLmEgKyBiMy54LmEgKyBiMy56ICsgYjQuZDsKKyAgcmVzdWx0LnguYiA9IGIyLmIgKyBiMy54LmIgKyBiMy55ICsgYjQuZTsKKyAgcmVzdWx0LnkgPSBiMi5iICsgYjMueC5iICsgYjQuZTsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkOiAlZCAlZCAlZFxuIiwgKGludCliMi5hLCBiMi5iLAorCSAoaW50KWIzLnguYSwgYjMueC5iLCBiMy55LCBiMy56LCAoaW50KWI0LmQsIGI0LmUsCisJIChpbnQpcmVzdWx0LnguYSwgcmVzdWx0LnguYiwgcmVzdWx0LnkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitCX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKyAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKyAgc3RydWN0IEEgYjA7CisgIHN0cnVjdCBCIGIxOworICBzdHJ1Y3QgQyBiMjsKKworICBiMCA9ICooc3RydWN0IEEqKShhcmdzWzBdKTsKKyAgYjEgPSAqKHN0cnVjdCBCKikoYXJnc1sxXSk7CisgIGIyID0gKihzdHJ1Y3QgQyopKGFyZ3NbMl0pOworCisgICooQiopcmVzcCA9IEJfZm4oYjAsIGIxLCBiMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNF07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1szXTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzMVs0XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzMlszXTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlLCBjbHNfc3RydWN0X3R5cGUxLCBjbHNfc3RydWN0X3R5cGUyOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s0XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgY2xzX3N0cnVjdF90eXBlMS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUxLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZTEuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczE7CisKKyAgY2xzX3N0cnVjdF90eXBlMi5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMi5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZTIuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczI7CisKKyAgc3RydWN0IEEgZV9kYmwgPSB7IDFMTCwgN307CisgIHN0cnVjdCBCIGZfZGJsID0geyA5OSwgezEyTEwgLCAxMjd9LCAyNTV9OworICBzdHJ1Y3QgQyBnX2RibCA9IHsgMkxMLCA5fTsKKworICBzdHJ1Y3QgQiByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX3VpbnQ2NDsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKKworICBjbHNfc3RydWN0X2ZpZWxkczFbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzMVsxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzMVsyXSA9ICZmZmlfdHlwZV91aW50OworICBjbHNfc3RydWN0X2ZpZWxkczFbM10gPSBOVUxMOworCisgIGNsc19zdHJ1Y3RfZmllbGRzMlswXSA9ICZmZmlfdHlwZV91aW50NjQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzMlsxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHMyWzJdID0gTlVMTDsKKworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTE7CisgIGRibF9hcmdfdHlwZXNbMl0gPSAmY2xzX3N0cnVjdF90eXBlMjsKKyAgZGJsX2FyZ190eXBlc1szXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMywgJmNsc19zdHJ1Y3RfdHlwZTEsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gJmdfZGJsOworICBhcmdzX2RibFszXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKEJfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMSA3IDEyIDEyNyA5OSAyNTUgMiA5OiAyNzAgMjQyIDE0MyIgfSAqLworICBDSEVDSyggcmVzX2RibC54LmEgPT0gKGVfZGJsLmEgKyBmX2RibC54LmEgKyBmX2RibC56ICsgZ19kYmwuZCkpOworICBDSEVDSyggcmVzX2RibC54LmIgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBmX2RibC55ICsgZ19kYmwuZSkpOworICBDSEVDSyggcmVzX2RibC55ID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZ19kYmwuZSkpOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgQl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChCKCopKEEsIEIsIEMpKShjb2RlKSkoZV9kYmwsIGZfZGJsLCBnX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgNyAxMiAxMjcgOTkgMjU1IDIgOTogMjcwIDI0MiAxNDMiIH0gKi8KKyAgQ0hFQ0soIHJlc19kYmwueC5hID09IChlX2RibC5hICsgZl9kYmwueC5hICsgZl9kYmwueiArIGdfZGJsLmQpKTsKKyAgQ0hFQ0soIHJlc19kYmwueC5iID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZl9kYmwueSArIGdfZGJsLmUpKTsKKyAgQ0hFQ0soIHJlc19kYmwueSA9PSAoZV9kYmwuYiArIGZfZGJsLnguYiArIGdfZGJsLmUpKTsKKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Mi5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTU4NGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QyLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBwYXNzaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQlDb250YWlucyBzdHJ1Y3RzIGFzIHBhcmFtZXRlciBvZiB0aGUgc3RydWN0IGl0c2VsZi4KKwkJU2FtcGxlIHRha2VuIGZyb20gQWxhbiBNb2RyYXMgcGF0Y2ggdG8gc3JjL3ByZXBfY2lmLmMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwMzA5MTEJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IEEgeworICB1bnNpZ25lZCBsb25nIGE7CisgIHVuc2lnbmVkIGNoYXIgYjsKK30gQTsKKwordHlwZWRlZiBzdHJ1Y3QgQiB7CisgIHN0cnVjdCBBIHg7CisgIHVuc2lnbmVkIGNoYXIgeTsKK30gQjsKKworQiBCX2ZuKHN0cnVjdCBBIGIwLCBzdHJ1Y3QgQiBiMSkKK3sKKyAgc3RydWN0IEIgcmVzdWx0OworCisgIHJlc3VsdC54LmEgPSBiMC5hICsgYjEueC5hOworICByZXN1bHQueC5iID0gYjAuYiArIGIxLnguYiArIGIxLnk7CisgIHJlc3VsdC55ID0gYjAuYiArIGIxLnguYjsKKworICBwcmludGYoIiVsdSAlZCAlbHUgJWQgJWQ6ICVsdSAlZCAlZFxuIiwgYjAuYSwgYjAuYiwgYjEueC5hLCBiMS54LmIsIGIxLnksCisJIHJlc3VsdC54LmEsIHJlc3VsdC54LmIsIHJlc3VsdC55KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorQl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisgICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBBIGIwOworICBzdHJ1Y3QgQiBiMTsKKworICBiMCA9ICooc3RydWN0IEEqKShhcmdzWzBdKTsKKyAgYjEgPSAqKHN0cnVjdCBCKikoYXJnc1sxXSk7CisKKyAgKihCKilyZXNwID0gQl9mbihiMCwgYjEpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbM107CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkczFbM107CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIGNsc19zdHJ1Y3RfdHlwZTEuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUxLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMxOworCisgIHN0cnVjdCBBIGVfZGJsID0geyAxLCA3fTsKKyAgc3RydWN0IEIgZl9kYmwgPSB7ezEyICwgMTI3fSwgOTl9OworCisgIHN0cnVjdCBCIHJlc19kYmw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfdWxvbmc7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkczFbMl0gPSBOVUxMOworCisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlMTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZTEsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oQl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDcgMTIgMTI3IDk5OiAxMyAyMzMgMTM0IiB9ICovCisgIENIRUNLKCByZXNfZGJsLnguYSA9PSAoZV9kYmwuYSArIGZfZGJsLnguYSkpOworICBDSEVDSyggcmVzX2RibC54LmIgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBmX2RibC55KSk7CisgIENIRUNLKCByZXNfZGJsLnkgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIpKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIEJfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoQigqKShBLCBCKSkoY29kZSkpKGVfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgNyAxMiAxMjcgOTk6IDEzIDIzMyAxMzQiIH0gKi8KKyAgQ0hFQ0soIHJlc19kYmwueC5hID09IChlX2RibC5hICsgZl9kYmwueC5hKSk7CisgIENIRUNLKCByZXNfZGJsLnguYiA9PSAoZV9kYmwuYiArIGZfZGJsLnguYiArIGZfZGJsLnkpKTsKKyAgQ0hFQ0soIHJlc19kYmwueSA9PSAoZV9kYmwuYiArIGZfZGJsLnguYikpOworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3QzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhYTg1MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDMuYwpAQCAtMCwwICsxLDExMSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCUNvbnRhaW5zIHN0cnVjdHMgYXMgcGFyYW1ldGVyIG9mIHRoZSBzdHJ1Y3QgaXRzZWxmLgorCQlTYW1wbGUgdGFrZW4gZnJvbSBBbGFuIE1vZHJhcyBwYXRjaCB0byBzcmMvcHJlcF9jaWYuYy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDkxMQkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQSB7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBhOworICB1bnNpZ25lZCBjaGFyIGI7Cit9IEE7CisKK3R5cGVkZWYgc3RydWN0IEIgeworICBzdHJ1Y3QgQSB4OworICB1bnNpZ25lZCBjaGFyIHk7Cit9IEI7CisKK0IgQl9mbihzdHJ1Y3QgQSBiMCwgc3RydWN0IEIgYjEpCit7CisgIHN0cnVjdCBCIHJlc3VsdDsKKworICByZXN1bHQueC5hID0gYjAuYSArIGIxLnguYTsKKyAgcmVzdWx0LnguYiA9IGIwLmIgKyBiMS54LmIgKyBiMS55OworICByZXN1bHQueSA9IGIwLmIgKyBiMS54LmI7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZCAlZDogJWQgJWQgJWRcbiIsIChpbnQpYjAuYSwgYjAuYiwKKwkgKGludCliMS54LmEsIGIxLnguYiwgYjEueSwKKwkgKGludClyZXN1bHQueC5hLCByZXN1bHQueC5iLCByZXN1bHQueSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK0JfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICBzdHJ1Y3QgQSBiMDsKKyAgc3RydWN0IEIgYjE7CisKKyAgYjAgPSAqKHN0cnVjdCBBKikoYXJnc1swXSk7CisgIGIxID0gKihzdHJ1Y3QgQiopKGFyZ3NbMV0pOworCisgICooQiopcmVzcCA9IEJfZm4oYjAsIGIxKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFszXTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHMxWzNdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGUsIGNsc19zdHJ1Y3RfdHlwZTE7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBjbHNfc3RydWN0X3R5cGUxLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUxLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlMS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMTsKKworICBzdHJ1Y3QgQSBlX2RibCA9IHsgMUxMLCA3fTsKKyAgc3RydWN0IEIgZl9kYmwgPSB7ezEyTEwgLCAxMjd9LCA5OX07CisKKyAgc3RydWN0IEIgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91aW50NjQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkczFbMl0gPSBOVUxMOworCisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlMTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZTEsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oQl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDcgMTIgMTI3IDk5OiAxMyAyMzMgMTM0IiB9ICovCisgIENIRUNLKCByZXNfZGJsLnguYSA9PSAoZV9kYmwuYSArIGZfZGJsLnguYSkpOworICBDSEVDSyggcmVzX2RibC54LmIgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBmX2RibC55KSk7CisgIENIRUNLKCByZXNfZGJsLnkgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIpKTsKKworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgQl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChCKCopKEEsIEIpKShjb2RlKSkoZV9kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMSA3IDEyIDEyNyA5OTogMTMgMjMzIDEzNCIgfSAqLworICBDSEVDSyggcmVzX2RibC54LmEgPT0gKGVfZGJsLmEgKyBmX2RibC54LmEpKTsKKyAgQ0hFQ0soIHJlc19kYmwueC5iID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZl9kYmwueSkpOworICBDSEVDSyggcmVzX2RibC55ID09IChlX2RibC5iICsgZl9kYmwueC5iKSk7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlNDkxZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDQuYwpAQCAtMCwwICsxLDExMSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCUNvbnRhaW5zIHN0cnVjdHMgYXMgcGFyYW1ldGVyIG9mIHRoZSBzdHJ1Y3QgaXRzZWxmLgorCQlTYW1wbGUgdGFrZW4gZnJvbSBBbGFuIE1vZHJhcyBwYXRjaCB0byBzcmMvcHJlcF9jaWYuYy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlQUiAyNTYzMC4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwNTEwMTAJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IEEgeworICBkb3VibGUgYTsKKyAgdW5zaWduZWQgY2hhciBiOworfSBBOworCit0eXBlZGVmIHN0cnVjdCBCIHsKKyAgc3RydWN0IEEgeDsKKyAgdW5zaWduZWQgY2hhciB5OworfSBCOworCitzdGF0aWMgQiBCX2ZuKHN0cnVjdCBBIGIyLCBzdHJ1Y3QgQiBiMykKK3sKKyAgc3RydWN0IEIgcmVzdWx0OworCisgIHJlc3VsdC54LmEgPSBiMi5hICsgYjMueC5hOworICByZXN1bHQueC5iID0gYjIuYiArIGIzLnguYiArIGIzLnk7CisgIHJlc3VsdC55ID0gYjIuYiArIGIzLnguYjsKKworICBwcmludGYoIiVkICVkICVkICVkICVkOiAlZCAlZCAlZFxuIiwgKGludCliMi5hLCBiMi5iLAorCSAoaW50KWIzLnguYSwgYjMueC5iLCBiMy55LAorCSAoaW50KXJlc3VsdC54LmEsIHJlc3VsdC54LmIsIHJlc3VsdC55KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorQl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisgICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBBIGIwOworICBzdHJ1Y3QgQiBiMTsKKworICBiMCA9ICooc3RydWN0IEEqKShhcmdzWzBdKTsKKyAgYjEgPSAqKHN0cnVjdCBCKikoYXJnc1sxXSk7CisKKyAgKihCKilyZXNwID0gQl9mbihiMCwgYjEpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbM107CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkczFbM107CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIGNsc19zdHJ1Y3RfdHlwZTEuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUxLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMxOworCisgIHN0cnVjdCBBIGVfZGJsID0geyAxLjAsIDd9OworICBzdHJ1Y3QgQiBmX2RibCA9IHt7MTIuMCAsIDEyN30sIDk5fTsKKworICBzdHJ1Y3QgQiByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKKworICBjbHNfc3RydWN0X2ZpZWxkczFbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBjbHNfc3RydWN0X2ZpZWxkczFbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzMVsyXSA9IE5VTEw7CisKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGUxOworICBkYmxfYXJnX3R5cGVzWzJdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLCAmY2xzX3N0cnVjdF90eXBlMSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmVfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihCX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEgNyAxMiAxMjcgOTk6IDEzIDIzMyAxMzQiIH0gKi8KKyAgQ0hFQ0soIHJlc19kYmwueC5hID09IChlX2RibC5hICsgZl9kYmwueC5hKSk7CisgIENIRUNLKCByZXNfZGJsLnguYiA9PSAoZV9kYmwuYiArIGZfZGJsLnguYiArIGZfZGJsLnkpKTsKKyAgQ0hFQ0soIHJlc19kYmwueSA9PSAoZV9kYmwuYiArIGZfZGJsLnguYikpOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgQl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChCKCopKEEsIEIpKShjb2RlKSkoZV9kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMSA3IDEyIDEyNyA5OTogMTMgMjMzIDEzNCIgfSAqLworICBDSEVDSyggcmVzX2RibC54LmEgPT0gKGVfZGJsLmEgKyBmX2RibC54LmEpKTsKKyAgQ0hFQ0soIHJlc19kYmwueC5iID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZl9kYmwueSkpOworICBDSEVDSyggcmVzX2RibC55ID09IChlX2RibC5iICsgZl9kYmwueC5iKSk7CisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGUzNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0NS5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJQ29udGFpbnMgc3RydWN0cyBhcyBwYXJhbWV0ZXIgb2YgdGhlIHN0cnVjdCBpdHNlbGYuCisJCVNhbXBsZSB0YWtlbiBmcm9tIEFsYW4gTW9kcmFzIHBhdGNoIHRvIHNyYy9wcmVwX2NpZi5jLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDUxMDEwCSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBBIHsKKyAgbG9uZyBkb3VibGUgYTsKKyAgdW5zaWduZWQgY2hhciBiOworfSBBOworCit0eXBlZGVmIHN0cnVjdCBCIHsKKyAgc3RydWN0IEEgeDsKKyAgdW5zaWduZWQgY2hhciB5OworfSBCOworCitzdGF0aWMgQiBCX2ZuKHN0cnVjdCBBIGIyLCBzdHJ1Y3QgQiBiMykKK3sKKyAgc3RydWN0IEIgcmVzdWx0OworCisgIHJlc3VsdC54LmEgPSBiMi5hICsgYjMueC5hOworICByZXN1bHQueC5iID0gYjIuYiArIGIzLnguYiArIGIzLnk7CisgIHJlc3VsdC55ID0gYjIuYiArIGIzLnguYjsKKworICBwcmludGYoIiVkICVkICVkICVkICVkOiAlZCAlZCAlZFxuIiwgKGludCliMi5hLCBiMi5iLAorCSAoaW50KWIzLnguYSwgYjMueC5iLCBiMy55LAorCSAoaW50KXJlc3VsdC54LmEsIHJlc3VsdC54LmIsIHJlc3VsdC55KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorQl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisgICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBBIGIwOworICBzdHJ1Y3QgQiBiMTsKKworICBiMCA9ICooc3RydWN0IEEqKShhcmdzWzBdKTsKKyAgYjEgPSAqKHN0cnVjdCBCKikoYXJnc1sxXSk7CisKKyAgKihCKilyZXNwID0gQl9mbihiMCwgYjEpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbM107CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkczFbM107CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMTsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbM107CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIGNsc19zdHJ1Y3RfdHlwZTEuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUxLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMxOworCisgIHN0cnVjdCBBIGVfZGJsID0geyAxLjAsIDd9OworICBzdHJ1Y3QgQiBmX2RibCA9IHt7MTIuMCAsIDEyN30sIDk5fTsKKworICBzdHJ1Y3QgQiByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2xvbmdkb3VibGU7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkczFbMl0gPSBOVUxMOworCisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlMTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZTEsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oQl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDcgMTIgMTI3IDk5OiAxMyAyMzMgMTM0IiB9ICovCisgIENIRUNLKCByZXNfZGJsLnguYSA9PSAoZV9kYmwuYSArIGZfZGJsLnguYSkpOworICBDSEVDSyggcmVzX2RibC54LmIgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBmX2RibC55KSk7CisgIENIRUNLKCByZXNfZGJsLnkgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIpKTsKKworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgQl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChCKCopKEEsIEIpKShjb2RlKSkoZV9kYmwsIGZfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMSA3IDEyIDEyNyA5OTogMTMgMjMzIDEzNCIgfSAqLworICBDSEVDSyggcmVzX2RibC54LmEgPT0gKGVfZGJsLmEgKyBmX2RibC54LmEpKTsKKyAgQ0hFQ0soIHJlc19kYmwueC5iID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZl9kYmwueSkpOworICBDSEVDSyggcmVzX2RibC55ID09IChlX2RibC5iICsgZl9kYmwueC5iKSk7CisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjJiMjVhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ni5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJQ29udGFpbnMgc3RydWN0cyBhcyBwYXJhbWV0ZXIgb2YgdGhlIHN0cnVjdCBpdHNlbGYuCisJCVNhbXBsZSB0YWtlbiBmcm9tIEFsYW4gTW9kcmFzIHBhdGNoIHRvIHNyYy9wcmVwX2NpZi5jLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCVBSIDI1NjMwLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDA1MTAxMAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQSB7CisgIGRvdWJsZSBhOworICB1bnNpZ25lZCBjaGFyIGI7Cit9IEE7CisKK3R5cGVkZWYgc3RydWN0IEIgeworICBzdHJ1Y3QgQSB4OworICB1bnNpZ25lZCBjaGFyIHk7Cit9IEI7CisKK3R5cGVkZWYgc3RydWN0IEMgeworICBsb25nIGQ7CisgIHVuc2lnbmVkIGNoYXIgZTsKK30gQzsKKworc3RhdGljIEIgQl9mbihzdHJ1Y3QgQSBiMiwgc3RydWN0IEIgYjMsIHN0cnVjdCBDIGI0KQoreworICBzdHJ1Y3QgQiByZXN1bHQ7CisKKyAgcmVzdWx0LnguYSA9IGIyLmEgKyBiMy54LmEgKyBiNC5kOworICByZXN1bHQueC5iID0gYjIuYiArIGIzLnguYiArIGIzLnkgKyBiNC5lOworICByZXN1bHQueSA9IGIyLmIgKyBiMy54LmIgKyBiNC5lOworCisgIHByaW50ZigiJWQgJWQgJWQgJWQgJWQgJWQgJWQ6ICVkICVkICVkXG4iLCAoaW50KWIyLmEsIGIyLmIsCisJIChpbnQpYjMueC5hLCBiMy54LmIsIGIzLnksIChpbnQpYjQuZCwgYjQuZSwKKwkgKGludClyZXN1bHQueC5hLCByZXN1bHQueC5iLCByZXN1bHQueSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK0JfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICBzdHJ1Y3QgQSBiMDsKKyAgc3RydWN0IEIgYjE7CisgIHN0cnVjdCBDIGIyOworCisgIGIwID0gKihzdHJ1Y3QgQSopKGFyZ3NbMF0pOworICBiMSA9ICooc3RydWN0IEIqKShhcmdzWzFdKTsKKyAgYjIgPSAqKHN0cnVjdCBDKikoYXJnc1syXSk7CisKKyAgKihCKilyZXNwID0gQl9mbihiMCwgYjEsIGIyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFs0XTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHMxWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHMyWzNdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGUsIGNsc19zdHJ1Y3RfdHlwZTEsIGNsc19zdHJ1Y3RfdHlwZTI7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzRdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBjbHNfc3RydWN0X3R5cGUxLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUxLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlMS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMTsKKworICBjbHNfc3RydWN0X3R5cGUyLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUyLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlMi5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMjsKKworICBzdHJ1Y3QgQSBlX2RibCA9IHsgMS4wLCA3fTsKKyAgc3RydWN0IEIgZl9kYmwgPSB7ezEyLjAgLCAxMjd9LCA5OX07CisgIHN0cnVjdCBDIGdfZGJsID0geyAyLCA5fTsKKworICBzdHJ1Y3QgQiByZXNfZGJsOworCisgIGNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzJdID0gTlVMTDsKKworICBjbHNfc3RydWN0X2ZpZWxkczFbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBjbHNfc3RydWN0X2ZpZWxkczFbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzMVsyXSA9IE5VTEw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHMyWzBdID0gJmZmaV90eXBlX3Nsb25nOworICBjbHNfc3RydWN0X2ZpZWxkczJbMV0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIGNsc19zdHJ1Y3RfZmllbGRzMlsyXSA9IE5VTEw7CisKKworICBkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGUxOworICBkYmxfYXJnX3R5cGVzWzJdID0gJmNsc19zdHJ1Y3RfdHlwZTI7CisgIGRibF9hcmdfdHlwZXNbM10gPSBOVUxMOworCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDMsICZjbHNfc3RydWN0X3R5cGUxLAorCQkgICAgIGRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc19kYmxbMF0gPSAmZV9kYmw7CisgIGFyZ3NfZGJsWzFdID0gJmZfZGJsOworICBhcmdzX2RibFsyXSA9ICZnX2RibDsKKyAgYXJnc19kYmxbM10gPSBOVUxMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihCX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjEgNyAxMiAxMjcgOTkgMiA5OiAxNSAyNDIgMTQzIiB9ICovCisgIENIRUNLKCByZXNfZGJsLnguYSA9PSAoZV9kYmwuYSArIGZfZGJsLnguYSArIGdfZGJsLmQpKTsKKyAgQ0hFQ0soIHJlc19kYmwueC5iID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZl9kYmwueSArIGdfZGJsLmUpKTsKKyAgQ0hFQ0soIHJlc19kYmwueSA9PSAoZV9kYmwuYiArIGZfZGJsLnguYiArIGdfZGJsLmUpKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIEJfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoQigqKShBLCBCLCBDKSkoY29kZSkpKGVfZGJsLCBmX2RibCwgZ19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiXG4xIDcgMTIgMTI3IDk5IDIgOTogMTUgMjQyIDE0MyIgfSAqLworICBDSEVDSyggcmVzX2RibC54LmEgPT0gKGVfZGJsLmEgKyBmX2RibC54LmEgKyBnX2RibC5kKSk7CisgIENIRUNLKCByZXNfZGJsLnguYiA9PSAoZV9kYmwuYiArIGZfZGJsLnguYiArIGZfZGJsLnkgKyBnX2RibC5lKSk7CisgIENIRUNLKCByZXNfZGJsLnkgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBnX2RibC5lKSk7CisKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDcuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGM3MDIzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0Ny5jCkBAIC0wLDAgKzEsMTExIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJQ29udGFpbnMgc3RydWN0cyBhcyBwYXJhbWV0ZXIgb2YgdGhlIHN0cnVjdCBpdHNlbGYuCisJCVNhbXBsZSB0YWtlbiBmcm9tIEFsYW4gTW9kcmFzIHBhdGNoIHRvIHNyYy9wcmVwX2NpZi5jLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDUxMDEwCSAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBBIHsKKyAgdW5zaWduZWQgbG9uZyBsb25nIGE7CisgIHVuc2lnbmVkIGNoYXIgYjsKK30gQTsKKwordHlwZWRlZiBzdHJ1Y3QgQiB7CisgIHN0cnVjdCBBIHg7CisgIHVuc2lnbmVkIGNoYXIgeTsKK30gQjsKKworc3RhdGljIEIgQl9mbihzdHJ1Y3QgQSBiMiwgc3RydWN0IEIgYjMpCit7CisgIHN0cnVjdCBCIHJlc3VsdDsKKworICByZXN1bHQueC5hID0gYjIuYSArIGIzLnguYTsKKyAgcmVzdWx0LnguYiA9IGIyLmIgKyBiMy54LmIgKyBiMy55OworICByZXN1bHQueSA9IGIyLmIgKyBiMy54LmI7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZCAlZDogJWQgJWQgJWRcbiIsIChpbnQpYjIuYSwgYjIuYiwKKwkgKGludCliMy54LmEsIGIzLnguYiwgYjMueSwKKwkgKGludClyZXN1bHQueC5hLCByZXN1bHQueC5iLCByZXN1bHQueSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK0JfZ24oZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsIHZvaWQqKiBhcmdzLAorICAgICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICBzdHJ1Y3QgQSBiMDsKKyAgc3RydWN0IEIgYjE7CisKKyAgYjAgPSAqKHN0cnVjdCBBKikoYXJnc1swXSk7CisgIGIxID0gKihzdHJ1Y3QgQiopKGFyZ3NbMV0pOworCisgICooQiopcmVzcCA9IEJfZm4oYjAsIGIxKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICB2b2lkICpjb2RlOworICBmZmlfY2xvc3VyZSAqcGNsID0gZmZpX2Nsb3N1cmVfYWxsb2Moc2l6ZW9mKGZmaV9jbG9zdXJlKSwgJmNvZGUpOworICB2b2lkKiBhcmdzX2RibFszXTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzNdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHMxWzNdOworICBmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGUsIGNsc19zdHJ1Y3RfdHlwZTE7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzNdOworCisgIGNsc19zdHJ1Y3RfdHlwZS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczsKKworICBjbHNfc3RydWN0X3R5cGUxLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUxLmFsaWdubWVudCA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlMS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzMTsKKworICBzdHJ1Y3QgQSBlX2RibCA9IHsgMUxMLCA3fTsKKyAgc3RydWN0IEIgZl9kYmwgPSB7ezEyLjAgLCAxMjd9LCA5OX07CisKKyAgc3RydWN0IEIgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91aW50NjQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkczFbMl0gPSBOVUxMOworCisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlMTsKKyAgZGJsX2FyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJmNsc19zdHJ1Y3RfdHlwZTEsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oQl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDcgMTIgMTI3IDk5OiAxMyAyMzMgMTM0IiB9ICovCisgIENIRUNLKCByZXNfZGJsLnguYSA9PSAoZV9kYmwuYSArIGZfZGJsLnguYSkpOworICBDSEVDSyggcmVzX2RibC54LmIgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBmX2RibC55KSk7CisgIENIRUNLKCByZXNfZGJsLnkgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIpKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIEJfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgcmVzX2RibCA9ICgoQigqKShBLCBCKSkoY29kZSkpKGVfZGJsLCBmX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgNyAxMiAxMjcgOTk6IDEzIDIzMyAxMzQiIH0gKi8KKyAgQ0hFQ0soIHJlc19kYmwueC5hID09IChlX2RibC5hICsgZl9kYmwueC5hKSk7CisgIENIRUNLKCByZXNfZGJsLnguYiA9PSAoZV9kYmwuYiArIGZfZGJsLnguYiArIGZfZGJsLnkpKTsKKyAgQ0hFQ0soIHJlc19kYmwueSA9PSAoZV9kYmwuYiArIGZfZGJsLnguYikpOworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q4LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3N2VhZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvbmVzdGVkX3N0cnVjdDguYwpAQCAtMCwwICsxLDEzMSBAQAorLyogQXJlYToJZmZpX2NhbGwsIGNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgc3RydWN0dXJlIHBhc3Npbmcgd2l0aCBkaWZmZXJlbnQgc3RydWN0dXJlIHNpemUuCisJCUNvbnRhaW5zIHN0cnVjdHMgYXMgcGFyYW1ldGVyIG9mIHRoZSBzdHJ1Y3QgaXRzZWxmLgorCQlTYW1wbGUgdGFrZW4gZnJvbSBBbGFuIE1vZHJhcyBwYXRjaCB0byBzcmMvcHJlcF9jaWYuYy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDA1MTAxMAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQSB7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBhOworICB1bnNpZ25lZCBjaGFyIGI7Cit9IEE7CisKK3R5cGVkZWYgc3RydWN0IEIgeworICBzdHJ1Y3QgQSB4OworICB1bnNpZ25lZCBjaGFyIHk7Cit9IEI7CisKK3R5cGVkZWYgc3RydWN0IEMgeworICB1bnNpZ25lZCBsb25nIGxvbmcgZDsKKyAgdW5zaWduZWQgY2hhciBlOworfSBDOworCitzdGF0aWMgQiBCX2ZuKHN0cnVjdCBBIGIyLCBzdHJ1Y3QgQiBiMywgc3RydWN0IEMgYjQpCit7CisgIHN0cnVjdCBCIHJlc3VsdDsKKworICByZXN1bHQueC5hID0gYjIuYSArIGIzLnguYSArIGI0LmQ7CisgIHJlc3VsdC54LmIgPSBiMi5iICsgYjMueC5iICsgYjMueSArIGI0LmU7CisgIHJlc3VsdC55ID0gYjIuYiArIGIzLnguYiArIGI0LmU7CisKKyAgcHJpbnRmKCIlZCAlZCAlZCAlZCAlZCAlZCAlZDogJWQgJWQgJWRcbiIsIChpbnQpYjIuYSwgYjIuYiwKKwkgKGludCliMy54LmEsIGIzLnguYiwgYjMueSwgKGludCliNC5kLCBiNC5lLAorCSAoaW50KXJlc3VsdC54LmEsIHJlc3VsdC54LmIsIHJlc3VsdC55KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorQl9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisgICAgIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHN0cnVjdCBBIGIwOworICBzdHJ1Y3QgQiBiMTsKKyAgc3RydWN0IEMgYjI7CisKKyAgYjAgPSAqKHN0cnVjdCBBKikoYXJnc1swXSk7CisgIGIxID0gKihzdHJ1Y3QgQiopKGFyZ3NbMV0pOworICBiMiA9ICooc3RydWN0IEMqKShhcmdzWzJdKTsKKworICAqKEIqKXJlc3AgPSBCX2ZuKGIwLCBiMSwgYjIpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NfZGJsWzRdOworICBmZmlfdHlwZSogY2xzX3N0cnVjdF9maWVsZHNbM107CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkczFbM107CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkczJbM107CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZSwgY2xzX3N0cnVjdF90eXBlMSwgY2xzX3N0cnVjdF90eXBlMjsKKyAgZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNF07CisKKyAgY2xzX3N0cnVjdF90eXBlLnNpemUgPSAwOworICBjbHNfc3RydWN0X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZS5lbGVtZW50cyA9IGNsc19zdHJ1Y3RfZmllbGRzOworCisgIGNsc19zdHJ1Y3RfdHlwZTEuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTEuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUxLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMxOworCisgIGNsc19zdHJ1Y3RfdHlwZTIuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTIuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMi50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUyLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMyOworCisgIHN0cnVjdCBBIGVfZGJsID0geyAxTEwsIDd9OworICBzdHJ1Y3QgQiBmX2RibCA9IHt7MTJMTCAsIDEyN30sIDk5fTsKKyAgc3RydWN0IEMgZ19kYmwgPSB7IDJMTCwgOX07CisKKyAgc3RydWN0IEIgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91aW50NjQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkczFbMl0gPSBOVUxMOworCisgIGNsc19zdHJ1Y3RfZmllbGRzMlswXSA9ICZmZmlfdHlwZV91aW50NjQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzMlsxXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHMyWzJdID0gTlVMTDsKKworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworICBkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTE7CisgIGRibF9hcmdfdHlwZXNbMl0gPSAmY2xzX3N0cnVjdF90eXBlMjsKKyAgZGJsX2FyZ190eXBlc1szXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMywgJmNsc19zdHJ1Y3RfdHlwZTEsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBhcmdzX2RibFswXSA9ICZlX2RibDsKKyAgYXJnc19kYmxbMV0gPSAmZl9kYmw7CisgIGFyZ3NfZGJsWzJdID0gJmdfZGJsOworICBhcmdzX2RibFszXSA9IE5VTEw7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKEJfZm4pLCAmcmVzX2RibCwgYXJnc19kYmwpOworICAvKiB7IGRnLW91dHB1dCAiMSA3IDEyIDEyNyA5OSAyIDk6IDE1IDI0MiAxNDMiIH0gKi8KKyAgQ0hFQ0soIHJlc19kYmwueC5hID09IChlX2RibC5hICsgZl9kYmwueC5hICsgZ19kYmwuZCkpOworICBDSEVDSyggcmVzX2RibC54LmIgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBmX2RibC55ICsgZ19kYmwuZSkpOworICBDSEVDSyggcmVzX2RibC55ID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZ19kYmwuZSkpOworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgQl9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXNfZGJsID0gKChCKCopKEEsIEIsIEMpKShjb2RlKSkoZV9kYmwsIGZfZGJsLCBnX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICJcbjEgNyAxMiAxMjcgOTkgMiA5OiAxNSAyNDIgMTQzIiB9ICovCisgIENIRUNLKCByZXNfZGJsLnguYSA9PSAoZV9kYmwuYSArIGZfZGJsLnguYSArIGdfZGJsLmQpKTsKKyAgQ0hFQ0soIHJlc19kYmwueC5iID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZl9kYmwueSArIGdfZGJsLmUpKTsKKyAgQ0hFQ0soIHJlc19kYmwueSA9PSAoZV9kYmwuYiArIGZfZGJsLnguYiArIGdfZGJsLmUpKTsKKworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9uZXN0ZWRfc3RydWN0OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZjU0MWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL25lc3RlZF9zdHJ1Y3Q5LmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIEFyZWE6CWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZSBwYXNzaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQlDb250YWlucyBzdHJ1Y3RzIGFzIHBhcmFtZXRlciBvZiB0aGUgc3RydWN0IGl0c2VsZi4KKwkJU2FtcGxlIHRha2VuIGZyb20gQWxhbiBNb2RyYXMgcGF0Y2ggdG8gc3JjL3ByZXBfY2lmLmMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwNTEwMTAJICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IEEgeworICB1bnNpZ25lZCBjaGFyIGE7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBiOworfSBBOworCit0eXBlZGVmIHN0cnVjdCBCIHsKKyAgc3RydWN0IEEgeDsKKyAgdW5zaWduZWQgY2hhciB5OworfSBCOworCit0eXBlZGVmIHN0cnVjdCBDIHsKKyAgdW5zaWduZWQgbG9uZyBkOworICB1bnNpZ25lZCBjaGFyIGU7Cit9IEM7CisKK3N0YXRpYyBCIEJfZm4oc3RydWN0IEEgYjIsIHN0cnVjdCBCIGIzLCBzdHJ1Y3QgQyBiNCkKK3sKKyAgc3RydWN0IEIgcmVzdWx0OworCisgIHJlc3VsdC54LmEgPSBiMi5hICsgYjMueC5hICsgYjQuZDsKKyAgcmVzdWx0LnguYiA9IGIyLmIgKyBiMy54LmIgKyBiMy55ICsgYjQuZTsKKyAgcmVzdWx0LnkgPSBiMi5iICsgYjMueC5iICsgYjQuZTsKKworICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkOiAlZCAlZCAlZFxuIiwgYjIuYSwgKGludCliMi5iLAorCSBiMy54LmEsIChpbnQpYjMueC5iLCBiMy55LCAoaW50KWI0LmQsIGI0LmUsCisJIHJlc3VsdC54LmEsIChpbnQpcmVzdWx0LnguYiwgcmVzdWx0LnkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitCX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywKKyAgICAgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKyAgc3RydWN0IEEgYjA7CisgIHN0cnVjdCBCIGIxOworICBzdHJ1Y3QgQyBiMjsKKworICBiMCA9ICooc3RydWN0IEEqKShhcmdzWzBdKTsKKyAgYjEgPSAqKHN0cnVjdCBCKikoYXJnc1sxXSk7CisgIGIyID0gKihzdHJ1Y3QgQyopKGFyZ3NbMl0pOworCisgICooQiopcmVzcCA9IEJfZm4oYjAsIGIxLCBiMik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IGZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgdm9pZCogYXJnc19kYmxbNF07CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkc1szXTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzMVszXTsKKyAgZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzMlszXTsKKyAgZmZpX3R5cGUgY2xzX3N0cnVjdF90eXBlLCBjbHNfc3RydWN0X3R5cGUxLCBjbHNfc3RydWN0X3R5cGUyOworICBmZmlfdHlwZSogZGJsX2FyZ190eXBlc1s0XTsKKworICBjbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKyAgY2xzX3N0cnVjdF90eXBlMS5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMS5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUxLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZTEuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczE7CisKKyAgY2xzX3N0cnVjdF90eXBlMi5zaXplID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMi5hbGlnbm1lbnQgPSAwOworICBjbHNfc3RydWN0X3R5cGUyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIGNsc19zdHJ1Y3RfdHlwZTIuZWxlbWVudHMgPSBjbHNfc3RydWN0X2ZpZWxkczI7CisKKyAgc3RydWN0IEEgZV9kYmwgPSB7IDEsIDdMTH07CisgIHN0cnVjdCBCIGZfZGJsID0ge3sxMi4wICwgMTI3fSwgOTl9OworICBzdHJ1Y3QgQyBnX2RibCA9IHsgMiwgOX07CisKKyAgc3RydWN0IEIgcmVzX2RibDsKKworICBjbHNfc3RydWN0X2ZpZWxkc1swXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgY2xzX3N0cnVjdF9maWVsZHNbMV0gPSAmZmZpX3R5cGVfdWludDY0OworICBjbHNfc3RydWN0X2ZpZWxkc1syXSA9IE5VTEw7CisKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKyAgY2xzX3N0cnVjdF9maWVsZHMxWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkczFbMl0gPSBOVUxMOworCisgIGNsc19zdHJ1Y3RfZmllbGRzMlswXSA9ICZmZmlfdHlwZV91bG9uZzsKKyAgY2xzX3N0cnVjdF9maWVsZHMyWzFdID0gJmZmaV90eXBlX3VjaGFyOworICBjbHNfc3RydWN0X2ZpZWxkczJbMl0gPSBOVUxMOworCisKKyAgZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisgIGRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlMTsKKyAgZGJsX2FyZ190eXBlc1syXSA9ICZjbHNfc3RydWN0X3R5cGUyOworICBkYmxfYXJnX3R5cGVzWzNdID0gTlVMTDsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAzLCAmY2xzX3N0cnVjdF90eXBlMSwKKwkJICAgICBkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIGFyZ3NfZGJsWzBdID0gJmVfZGJsOworICBhcmdzX2RibFsxXSA9ICZmX2RibDsKKyAgYXJnc19kYmxbMl0gPSAmZ19kYmw7CisgIGFyZ3NfZGJsWzNdID0gTlVMTDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oQl9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDcgMTIgMTI3IDk5IDIgOTogMTUgMjQyIDE0MyIgfSAqLworICBDSEVDSyggcmVzX2RibC54LmEgPT0gKGVfZGJsLmEgKyBmX2RibC54LmEgKyBnX2RibC5kKSk7CisgIENIRUNLKCByZXNfZGJsLnguYiA9PSAoZV9kYmwuYiArIGZfZGJsLnguYiArIGZfZGJsLnkgKyBnX2RibC5lKSk7CisgIENIRUNLKCByZXNfZGJsLnkgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBnX2RibC5lKSk7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBCX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisgIHJlc19kYmwgPSAoKEIoKikoQSwgQiwgQykpKGNvZGUpKShlX2RibCwgZl9kYmwsIGdfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuMSA3IDEyIDEyNyA5OSAyIDk6IDE1IDI0MiAxNDMiIH0gKi8KKyAgQ0hFQ0soIHJlc19kYmwueC5hID09IChlX2RibC5hICsgZl9kYmwueC5hICsgZ19kYmwuZCkpOworICBDSEVDSyggcmVzX2RibC54LmIgPT0gKGVfZGJsLmIgKyBmX2RibC54LmIgKyBmX2RibC55ICsgZ19kYmwuZSkpOworICBDSEVDSyggcmVzX2RibC55ID09IChlX2RibC5iICsgZl9kYmwueC5iICsgZ19kYmwuZSkpOworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Byb2JsZW0xLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3Byb2JsZW0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5MTU1NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcHJvYmxlbTEuYwpAQCAtMCwwICsxLDkwIEBACisvKiBBcmVhOglmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmUgcGFzc2luZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDAzMDgyOAkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgbXlfZmZpX3N0cnVjdCB7CisgIGRvdWJsZSBhOworICBkb3VibGUgYjsKKyAgZG91YmxlIGM7Cit9IG15X2ZmaV9zdHJ1Y3Q7CisKK215X2ZmaV9zdHJ1Y3QgY2FsbGVlKHN0cnVjdCBteV9mZmlfc3RydWN0IGExLCBzdHJ1Y3QgbXlfZmZpX3N0cnVjdCBhMikKK3sKKyAgc3RydWN0IG15X2ZmaV9zdHJ1Y3QgcmVzdWx0OworICByZXN1bHQuYSA9IGExLmEgKyBhMi5hOworICByZXN1bHQuYiA9IGExLmIgKyBhMi5iOworICByZXN1bHQuYyA9IGExLmMgKyBhMi5jOworCisKKyAgcHJpbnRmKCIlZyAlZyAlZyAlZyAlZyAlZzogJWcgJWcgJWdcbiIsIGExLmEsIGExLmIsIGExLmMsCisJIGEyLmEsIGEyLmIsIGEyLmMsIHJlc3VsdC5hLCByZXN1bHQuYiwgcmVzdWx0LmMpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgc3R1YihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsCisJICB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICBzdHJ1Y3QgbXlfZmZpX3N0cnVjdCBhMTsKKyAgc3RydWN0IG15X2ZmaV9zdHJ1Y3QgYTI7CisKKyAgYTEgPSAqKHN0cnVjdCBteV9mZmlfc3RydWN0KikoYXJnc1swXSk7CisgIGEyID0gKihzdHJ1Y3QgbXlfZmZpX3N0cnVjdCopKGFyZ3NbMV0pOworCisgICoobXlfZmZpX3N0cnVjdCAqKXJlc3AgPSBjYWxsZWUoYTEsIGEyKTsKK30KKworCitpbnQgbWFpbih2b2lkKQoreworICBmZmlfdHlwZSogbXlfZmZpX3N0cnVjdF9maWVsZHNbNF07CisgIGZmaV90eXBlIG15X2ZmaV9zdHJ1Y3RfdHlwZTsKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIHZvaWQqIGFyZ3NbNF07CisgIGZmaV90eXBlKiBhcmdfdHlwZXNbM107CisKKyAgc3RydWN0IG15X2ZmaV9zdHJ1Y3QgZyA9IHsgMS4wLCAyLjAsIDMuMCB9OworICBzdHJ1Y3QgbXlfZmZpX3N0cnVjdCBmID0geyAxLjAsIDIuMCwgMy4wIH07CisgIHN0cnVjdCBteV9mZmlfc3RydWN0IHJlczsKKworICBteV9mZmlfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisgIG15X2ZmaV9zdHJ1Y3RfdHlwZS5hbGlnbm1lbnQgPSAwOworICBteV9mZmlfc3RydWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgbXlfZmZpX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gbXlfZmZpX3N0cnVjdF9maWVsZHM7CisKKyAgbXlfZmZpX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworICBteV9mZmlfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIG15X2ZmaV9zdHJ1Y3RfZmllbGRzWzJdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgbXlfZmZpX3N0cnVjdF9maWVsZHNbM10gPSBOVUxMOworCisgIGFyZ190eXBlc1swXSA9ICZteV9mZmlfc3RydWN0X3R5cGU7CisgIGFyZ190eXBlc1sxXSA9ICZteV9mZmlfc3RydWN0X3R5cGU7CisgIGFyZ190eXBlc1syXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwgJm15X2ZmaV9zdHJ1Y3RfdHlwZSwKKwkJICAgICBhcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgYXJnc1swXSA9ICZnOworICBhcmdzWzFdID0gJmY7CisgIGFyZ3NbMl0gPSBOVUxMOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2FsbGVlKSwgJnJlcywgYXJncyk7CisgIC8qIHsgZGctb3V0cHV0ICIxIDIgMyAxIDIgMzogMiA0IDYiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVnICVnICVnXG4iLCByZXMuYSwgcmVzLmIsIHJlcy5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyIDQgNiIgfSAqLworCisgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgc3R1YiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworICByZXMgPSAoKG15X2ZmaV9zdHJ1Y3QoKikoc3RydWN0IG15X2ZmaV9zdHJ1Y3QsIHN0cnVjdCBteV9mZmlfc3RydWN0KSkoY29kZSkpKGcsIGYpOworICAvKiB7IGRnLW91dHB1dCAiXG4xIDIgMyAxIDIgMzogMiA0IDYiIH0gKi8KKyAgcHJpbnRmKCJyZXM6ICVnICVnICVnXG4iLCByZXMuYSwgcmVzLmIsIHJlcy5jKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyIDQgNiIgfSAqLworCisgIGV4aXQoMCk7OworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9wcm9tb3Rpb24uYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcHJvbW90aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1NjE2MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcHJvbW90aW9uLmMKQEAgLTAsMCArMSw1OSBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CVByb21vdGlvbiB0ZXN0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCitzdGF0aWMgaW50IHByb21vdGlvbihzaWduZWQgY2hhciBzYywgc2lnbmVkIHNob3J0IHNzLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgdWMsIHVuc2lnbmVkIHNob3J0IHVzKQoreworICBpbnQgciA9IChpbnQpIHNjICsgKGludCkgc3MgKyAoaW50KSB1YyArIChpbnQpIHVzOworCisgIHJldHVybiByOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZmZpX2FyZyByaW50OworICBzaWduZWQgY2hhciBzYzsKKyAgdW5zaWduZWQgY2hhciB1YzsKKyAgc2lnbmVkIHNob3J0IHNzOworICB1bnNpZ25lZCBzaG9ydCB1czsKKyAgdW5zaWduZWQgbG9uZyB1bDsKKworICBhcmdzWzBdID0gJmZmaV90eXBlX3NjaGFyOworICBhcmdzWzFdID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgYXJnc1syXSA9ICZmZmlfdHlwZV91Y2hhcjsKKyAgYXJnc1szXSA9ICZmZmlfdHlwZV91c2hvcnQ7CisgIHZhbHVlc1swXSA9ICZzYzsKKyAgdmFsdWVzWzFdID0gJnNzOworICB2YWx1ZXNbMl0gPSAmdWM7CisgIHZhbHVlc1szXSA9ICZ1czsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgNCwKKwkJICAgICAmZmZpX3R5cGVfc2ludCwgYXJncykgPT0gRkZJX09LKTsKKworICB1cyA9IDA7CisgIHVsID0gMDsKKworICBmb3IgKHNjID0gKHNpZ25lZCBjaGFyKSAtMTI3OworICAgICAgIHNjIDw9IChzaWduZWQgY2hhcikgMTIwOyBzYyArPSAxKQorICAgIGZvciAoc3MgPSAtMzAwMDA7IHNzIDw9IDMwMDAwOyBzcyArPSAxMDAwMCkKKyAgICAgIGZvciAodWMgPSAodW5zaWduZWQgY2hhcikgMDsKKwkgICB1YyA8PSAodW5zaWduZWQgY2hhcikgMjAwOyB1YyArPSAyMCkKKwlmb3IgKHVzID0gMDsgdXMgPD0gNjAwMDA7IHVzICs9IDEwMDAwKQorCSAgeworCSAgICB1bCsrOworCSAgICBmZmlfY2FsbCgmY2lmLCBGRklfRk4ocHJvbW90aW9uKSwgJnJpbnQsIHZhbHVlcyk7CisJICAgIENIRUNLKChpbnQpcmludCA9PSAoc2lnbmVkIGNoYXIpIHNjICsgKHNpZ25lZCBzaG9ydCkgc3MgKworCQkgICh1bnNpZ25lZCBjaGFyKSB1YyArICh1bnNpZ25lZCBzaG9ydCkgdXMpOworCSAgfQorICBwcmludGYoIiVsdSBwcm9tb3Rpb24gdGVzdHMgcnVuXG4iLCB1bCk7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3B5b2JqYy10Yy5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9weW9iamMtdGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjliZDZjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9weW9iamMtdGMuYwpAQCAtMCwwICsxLDExNCBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIGRpZmZlcmVudCBzdHJ1Y3R1cmVzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglSb25hbGQgT3Vzc29yZW4gPG91c3NvcmVuQGNpc3Ryb24ubmw+IDIwMDMwODI0CSovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IFBvaW50IHsKKwlmbG9hdCB4OworCWZsb2F0IHk7Cit9IFBvaW50OworCit0eXBlZGVmIHN0cnVjdCBTaXplIHsKKwlmbG9hdCBoOworCWZsb2F0IHc7Cit9IFNpemU7CisKK3R5cGVkZWYgc3RydWN0IFJlY3QgeworCVBvaW50IG87CisJU2l6ZSAgczsKK30gUmVjdDsKKworaW50IGRvaXQoaW50IG8sIGNoYXIqIHMsIFBvaW50IHAsIFJlY3QgciwgaW50IGxhc3QpCit7CisJcHJpbnRmKCJDQUxMRUQgV0lUSCAlZCAlcyB7JWYgJWZ9IHt7JWYgJWZ9IHslZiAlZn19ICVkXG4iLAorCQlvLCBzLCBwLngsIHAueSwgci5vLngsIHIuby55LCByLnMuaCwgci5zLncsIGxhc3QpOworCXJldHVybiA0MjsKK30KKworCitpbnQgbWFpbih2b2lkKQoreworCWZmaV90eXBlIHBvaW50X3R5cGU7CisJZmZpX3R5cGUgc2l6ZV90eXBlOworCWZmaV90eXBlIHJlY3RfdHlwZTsKKwlmZmlfY2lmIGNpZjsKKwlmZmlfdHlwZSogYXJnbGlzdFs2XTsKKwl2b2lkKiB2YWx1ZXNbNl07CisJaW50IHI7CisKKwkvKgorCSAqICBGaXJzdCBzZXQgdXAgRkZJIHR5cGVzIGZvciB0aGUgMyBzdHJ1Y3QgdHlwZXMKKwkgKi8KKworCXBvaW50X3R5cGUuc2l6ZSA9IDA7IC8qc2l6ZW9mKFBvaW50KTsqLworCXBvaW50X3R5cGUuYWxpZ25tZW50ID0gMDsgLypfX2FsaWdub2ZfXyhQb2ludCk7Ki8KKwlwb2ludF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJcG9pbnRfdHlwZS5lbGVtZW50cyA9IG1hbGxvYygzICogc2l6ZW9mKGZmaV90eXBlKikpOworCXBvaW50X3R5cGUuZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfZmxvYXQ7CisJcG9pbnRfdHlwZS5lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV9mbG9hdDsKKwlwb2ludF90eXBlLmVsZW1lbnRzWzJdID0gTlVMTDsKKworCXNpemVfdHlwZS5zaXplID0gMDsvKiBzaXplb2YoU2l6ZSk7Ki8KKwlzaXplX3R5cGUuYWxpZ25tZW50ID0gMDsvKiBfX2FsaWdub2ZfXyhTaXplKTsqLworCXNpemVfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworCXNpemVfdHlwZS5lbGVtZW50cyA9IG1hbGxvYygzICogc2l6ZW9mKGZmaV90eXBlKikpOworCXNpemVfdHlwZS5lbGVtZW50c1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKwlzaXplX3R5cGUuZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisJc2l6ZV90eXBlLmVsZW1lbnRzWzJdID0gTlVMTDsKKworCXJlY3RfdHlwZS5zaXplID0gMDsvKnNpemVvZihSZWN0KTsqLworCXJlY3RfdHlwZS5hbGlnbm1lbnQgPTA7LyogX19hbGlnbm9mX18oUmVjdCk7Ki8KKwlyZWN0X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKwlyZWN0X3R5cGUuZWxlbWVudHMgPSBtYWxsb2MoMyAqIHNpemVvZihmZmlfdHlwZSopKTsKKwlyZWN0X3R5cGUuZWxlbWVudHNbMF0gPSAmcG9pbnRfdHlwZTsKKwlyZWN0X3R5cGUuZWxlbWVudHNbMV0gPSAmc2l6ZV90eXBlOworCXJlY3RfdHlwZS5lbGVtZW50c1syXSA9IE5VTEw7CisKKwkvKgorCSAqIENyZWF0ZSBhIENJRgorCSAqLworCWFyZ2xpc3RbMF0gPSAmZmZpX3R5cGVfc2ludDsKKwlhcmdsaXN0WzFdID0gJmZmaV90eXBlX3BvaW50ZXI7CisJYXJnbGlzdFsyXSA9ICZwb2ludF90eXBlOworCWFyZ2xpc3RbM10gPSAmcmVjdF90eXBlOworCWFyZ2xpc3RbNF0gPSAmZmZpX3R5cGVfc2ludDsKKwlhcmdsaXN0WzVdID0gTlVMTDsKKworCXIgPSBmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLAorCQkJNSwgJmZmaV90eXBlX3NpbnQsIGFyZ2xpc3QpOworCWlmIChyICE9IEZGSV9PSykgeworCQlhYm9ydCgpOworCX0KKworCisJLyogQW5kIGNhbGwgdGhlIGZ1bmN0aW9uIHRocm91Z2ggdGhlIENJRiAqLworCisJeworCVBvaW50IHAgPSB7IDEuMCwgMi4wIH07CisJUmVjdCAgciA9IHsgeyA5LjAsIDEwLjB9LCB7IC0xLjAsIC0yLjAgfSB9OworCWludCAgIG8gPSAwOworCWludCAgIGwgPSA0MjsKKwljaGFyKiBtID0gIm15TWV0aG9kIjsKKwlmZmlfYXJnIHJlc3VsdDsKKworCXZhbHVlc1swXSA9ICZvOworCXZhbHVlc1sxXSA9ICZtOworCXZhbHVlc1syXSA9ICZwOworCXZhbHVlc1szXSA9ICZyOworCXZhbHVlc1s0XSA9ICZsOworCXZhbHVlc1s1XSA9IE5VTEw7CisKKwlwcmludGYoIkNBTExJTkcgV0lUSCAlZCAlcyB7JWYgJWZ9IHt7JWYgJWZ9IHslZiAlZn19ICVkXG4iLAorCQlvLCBtLCBwLngsIHAueSwgci5vLngsIHIuby55LCByLnMuaCwgci5zLncsIGwpOworCisJZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGRvaXQpLCAmcmVzdWx0LCB2YWx1ZXMpOworCisJcHJpbnRmICgiVGhlIHJlc3VsdCBpcyAlZFxuIiwgKGludClyZXN1bHQpOworCisJfQorCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2RibC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYWI0MDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwuYwpAQCAtMCwwICsxLDM1IEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIGRvdWJsZS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDA1MDIxMiAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIGRvdWJsZSByZXR1cm5fZGJsKGRvdWJsZSBkYmwpCit7CisgIHJldHVybiAyICogZGJsOworfQoraW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGRvdWJsZSBkYmwsIHJkYmw7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIHZhbHVlc1swXSA9ICZkYmw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsCisJCSAgICAgJmZmaV90eXBlX2RvdWJsZSwgYXJncykgPT0gRkZJX09LKTsKKworICBmb3IgKGRibCA9IC0xMjcuMzsgZGJsIDwgIDEyNzsgZGJsKyspCisgICAgeworICAgICAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHJldHVybl9kYmwpLCAmcmRibCwgdmFsdWVzKTsKKyAgICAgIHByaW50ZiAoIiVmIHZzICVmXG4iLCByZGJsLCByZXR1cm5fZGJsKGRibCkpOworICAgICAgQ0hFQ0socmRibCA9PSAyICogZGJsKTsKKyAgICB9CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwxLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhNWQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2RibDEuYwpAQCAtMCwwICsxLDQzIEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIGRvdWJsZS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDA1MDIxMiAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIGRvdWJsZSByZXR1cm5fZGJsKGRvdWJsZSBkYmwxLCBmbG9hdCBmbDIsIHVuc2lnbmVkIGludCBpbjMsIGRvdWJsZSBkYmw0KQoreworICByZXR1cm4gZGJsMSArIGZsMiArIGluMyArIGRibDQ7Cit9CitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZG91YmxlIGRibDEsIGRibDQsIHJkYmw7CisgIGZsb2F0IGZsMjsKKyAgdW5zaWduZWQgaW50IGluMzsKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIGFyZ3NbMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGFyZ3NbMl0gPSAmZmZpX3R5cGVfdWludDsKKyAgYXJnc1szXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIHZhbHVlc1swXSA9ICZkYmwxOworICB2YWx1ZXNbMV0gPSAmZmwyOworICB2YWx1ZXNbMl0gPSAmaW4zOworICB2YWx1ZXNbM10gPSAmZGJsNDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgNCwKKwkJICAgICAmZmZpX3R5cGVfZG91YmxlLCBhcmdzKSA9PSBGRklfT0spOworICBkYmwxID0gMTI3LjA7CisgIGZsMiA9IDEyOC4wOworICBpbjMgPSAyNTU7CisgIGRibDQgPSA1MTIuNzsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4ocmV0dXJuX2RibCksICZyZGJsLCB2YWx1ZXMpOworICBwcmludGYgKCIlZiB2cyAlZlxuIiwgcmRibCwgcmV0dXJuX2RibChkYmwxLCBmbDIsIGluMywgZGJsNCkpOworICBDSEVDSyhyZGJsID09ICBkYmwxICsgZmwyICsgaW4zICsgZGJsNCk7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwyLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9kYmwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4MThmOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2RibDIuYwpAQCAtMCwwICsxLDQyIEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIGRvdWJsZS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDA1MDIxMiAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIGRvdWJsZSByZXR1cm5fZGJsKGRvdWJsZSBkYmwxLCBkb3VibGUgZGJsMiwgdW5zaWduZWQgaW50IGluMywgZG91YmxlIGRibDQpCit7CisgIHJldHVybiBkYmwxICsgZGJsMiArIGluMyArIGRibDQ7Cit9CitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZG91YmxlIGRibDEsIGRibDIsIGRibDQsIHJkYmw7CisgIHVuc2lnbmVkIGludCBpbjM7CisgIGFyZ3NbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworICBhcmdzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgYXJnc1syXSA9ICZmZmlfdHlwZV91aW50OworICBhcmdzWzNdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgdmFsdWVzWzBdID0gJmRibDE7CisgIHZhbHVlc1sxXSA9ICZkYmwyOworICB2YWx1ZXNbMl0gPSAmaW4zOworICB2YWx1ZXNbM10gPSAmZGJsNDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgNCwKKwkJICAgICAmZmZpX3R5cGVfZG91YmxlLCBhcmdzKSA9PSBGRklfT0spOworICBkYmwxID0gMTI3LjA7CisgIGRibDIgPSAxMjguMDsKKyAgaW4zID0gMjU1OworICBkYmw0ID0gNTEyLjc7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHJldHVybl9kYmwpLCAmcmRibCwgdmFsdWVzKTsKKyAgcHJpbnRmICgiJWYgdnMgJWZcbiIsIHJkYmwsIHJldHVybl9kYmwoZGJsMSwgZGJsMiwgaW4zLCBkYmw0KSk7CisgIENIRUNLKHJkYmwgPT0gIGRibDEgKyBkYmwyICsgaW4zICsgZGJsNCk7CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9mbC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhhMDllCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZmwuYwpAQCAtMCwwICsxLDM1IEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIGZsb2F0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDUwMjEyICAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgZmxvYXQgcmV0dXJuX2ZsKGZsb2F0IGZsKQoreworICByZXR1cm4gMiAqIGZsOworfQoraW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZsb2F0IGZsLCByZmw7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdmFsdWVzWzBdID0gJmZsOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLAorCQkgICAgICZmZmlfdHlwZV9mbG9hdCwgYXJncykgPT0gRkZJX09LKTsKKworICBmb3IgKGZsID0gLTEyNy4wOyBmbCA8ICAxMjc7IGZsKyspCisgICAgeworICAgICAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHJldHVybl9mbCksICZyZmwsIHZhbHVlcyk7CisgICAgICBwcmludGYgKCIlZiB2cyAlZlxuIiwgcmZsLCByZXR1cm5fZmwoZmwpKTsKKyAgICAgIENIRUNLKHJmbCA9PSAgMiAqIGZsKTsKKyAgICB9CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9mbDEuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2ZsMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDkyYzIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9mbDEuYwpAQCAtMCwwICsxLDM2IEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIGZsb2F0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDUwMjEyICAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgZmxvYXQgcmV0dXJuX2ZsKGZsb2F0IGZsMSwgZmxvYXQgZmwyKQoreworICByZXR1cm4gZmwxICsgZmwyOworfQoraW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZsb2F0IGZsMSwgZmwyLCByZmw7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgYXJnc1sxXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdmFsdWVzWzBdID0gJmZsMTsKKyAgdmFsdWVzWzFdID0gJmZsMjsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwKKwkJICAgICAmZmZpX3R5cGVfZmxvYXQsIGFyZ3MpID09IEZGSV9PSyk7CisgIGZsMSA9IDEyNy4wOworICBmbDIgPSAxMjguMDsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4ocmV0dXJuX2ZsKSwgJnJmbCwgdmFsdWVzKTsKKyAgcHJpbnRmICgiJWYgdnMgJWZcbiIsIHJmbCwgcmV0dXJuX2ZsKGZsMSwgZmwyKSk7CisgIENIRUNLKHJmbCA9PSAgZmwxICsgZmwyKTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2ZsMi5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZmwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiOTc2YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2ZsMi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgZmxvYXQuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwNTAyMTIgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKKy8qIFVzZSB2b2xhdGlsZSBmbG9hdCB0byBhdm9pZCBmYWxzZSBuZWdhdGl2ZSBvbiBpeDg2LiAgU2VlIFBSIHRhcmdldC8zMjMuICAqLworc3RhdGljIGZsb2F0IHJldHVybl9mbChmbG9hdCBmbDEsIGZsb2F0IGZsMiwgZmxvYXQgZmwzLCBmbG9hdCBmbDQpCit7CisgIHZvbGF0aWxlIGZsb2F0IHN1bTsKKworICBzdW0gPSBmbDEgKyBmbDIgKyBmbDMgKyBmbDQ7CisgIHJldHVybiBzdW07Cit9CitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZmxvYXQgZmwxLCBmbDIsIGZsMywgZmw0LCByZmw7CisgIHZvbGF0aWxlIGZsb2F0IHN1bTsKKworICBhcmdzWzBdID0gJmZmaV90eXBlX2Zsb2F0OworICBhcmdzWzFdID0gJmZmaV90eXBlX2Zsb2F0OworICBhcmdzWzJdID0gJmZmaV90eXBlX2Zsb2F0OworICBhcmdzWzNdID0gJmZmaV90eXBlX2Zsb2F0OworICB2YWx1ZXNbMF0gPSAmZmwxOworICB2YWx1ZXNbMV0gPSAmZmwyOworICB2YWx1ZXNbMl0gPSAmZmwzOworICB2YWx1ZXNbM10gPSAmZmw0OworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA0LAorCQkgICAgICZmZmlfdHlwZV9mbG9hdCwgYXJncykgPT0gRkZJX09LKTsKKyAgZmwxID0gMTI3LjA7CisgIGZsMiA9IDEyOC4wOworICBmbDMgPSAyNTUuMTsKKyAgZmw0ID0gNTEyLjc7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHJldHVybl9mbCksICZyZmwsIHZhbHVlcyk7CisgIHByaW50ZiAoIiVmIHZzICVmXG4iLCByZmwsIHJldHVybl9mbChmbDEsIGZsMiwgZmwzLCBmbDQpKTsKKworICBzdW0gPSBmbDEgKyBmbDIgKyBmbDMgKyBmbDQ7CisgIENIRUNLKHJmbCA9PSBzdW0pOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZmwzLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9mbDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc4NzdiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fZmwzLmMKQEAgLTAsMCArMSw0MiBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHJldHVybiB2YWx1ZSBmbG9hdC4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGFuZHJlYXN0QGdjYy5nbnUub3JnPiAyMDA1MDIxMiAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIGZsb2F0IHJldHVybl9mbChmbG9hdCBmbDEsIGZsb2F0IGZsMiwgdW5zaWduZWQgaW50IGluMywgZmxvYXQgZmw0KQoreworICByZXR1cm4gZmwxICsgZmwyICsgaW4zICsgZmw0OworfQoraW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZsb2F0IGZsMSwgZmwyLCBmbDQsIHJmbDsKKyAgdW5zaWduZWQgaW50IGluMzsKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgYXJnc1sxXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgYXJnc1syXSA9ICZmZmlfdHlwZV91aW50OworICBhcmdzWzNdID0gJmZmaV90eXBlX2Zsb2F0OworICB2YWx1ZXNbMF0gPSAmZmwxOworICB2YWx1ZXNbMV0gPSAmZmwyOworICB2YWx1ZXNbMl0gPSAmaW4zOworICB2YWx1ZXNbM10gPSAmZmw0OworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA0LAorCQkgICAgICZmZmlfdHlwZV9mbG9hdCwgYXJncykgPT0gRkZJX09LKTsKKyAgZmwxID0gMTI3LjA7CisgIGZsMiA9IDEyOC4wOworICBpbjMgPSAyNTU7CisgIGZsNCA9IDUxMi43OworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihyZXR1cm5fZmwpLCAmcmZsLCB2YWx1ZXMpOworICBwcmludGYgKCIlZiB2cyAlZlxuIiwgcmZsLCByZXR1cm5fZmwoZmwxLCBmbDIsIGluMywgZmw0KSk7CisgIENIRUNLKHJmbCA9PSAgZmwxICsgZmwyICsgaW4zICsgZmw0KTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2xkbC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fbGRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyZmU2NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2xkbC5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgbG9uZyBkb3VibGUuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CTxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwNzExMTMgICovCisKKy8qIHsgZGctZG8gcnVuIHsgeGZhaWwgeDg2XzY0LSotbWluZ3cqIHg4Nl82NC0qLWN5Z3dpbiogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCitzdGF0aWMgbG9uZyBkb3VibGUgcmV0dXJuX2xkbChsb25nIGRvdWJsZSBsZGwpCit7CisgIHJldHVybiAyKmxkbDsKK30KK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBsb25nIGRvdWJsZSBsZGwsIHJsZGw7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9sb25nZG91YmxlOworICB2YWx1ZXNbMF0gPSAmbGRsOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLAorCQkgICAgICZmZmlfdHlwZV9sb25nZG91YmxlLCBhcmdzKSA9PSBGRklfT0spOworCisgIGZvciAobGRsID0gLTEyNy4wOyBsZGwgPCAgMTI3LjA7IGxkbCsrKQorICAgIHsKKyAgICAgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihyZXR1cm5fbGRsKSwgJnJsZGwsIHZhbHVlcyk7CisgICAgICBDSEVDSyhybGRsID09ICAyICogbGRsKTsKKyAgICB9CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sbC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRhMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fbGwuYwpAQCAtMCwwICsxLDQxIEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIGxvbmcgbG9uZy4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJRnJvbSB0aGUgb3JpZ2luYWwgZmZpdGVzdC5jICAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorc3RhdGljIGxvbmcgbG9uZyByZXR1cm5fbGwobG9uZyBsb25nIGxsKQoreworICByZXR1cm4gbGw7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBsb25nIGxvbmcgcmxvbmdsb25nOworICBsb25nIGxvbmcgbGw7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9zaW50NjQ7CisgIHZhbHVlc1swXSA9ICZsbDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwKKwkJICAgICAmZmZpX3R5cGVfc2ludDY0LCBhcmdzKSA9PSBGRklfT0spOworCisgIGZvciAobGwgPSAwTEw7IGxsIDwgMTAwTEw7IGxsKyspCisgICAgeworICAgICAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHJldHVybl9sbCksICZybG9uZ2xvbmcsIHZhbHVlcyk7CisgICAgICBDSEVDSyhybG9uZ2xvbmcgPT0gbGwpOworICAgIH0KKworICBmb3IgKGxsID0gNTU1NTU1NTU1NTUwMDBMTDsgbGwgPCA1NTU1NTU1NTU1NTEwMExMOyBsbCsrKQorICAgIHsKKyAgICAgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihyZXR1cm5fbGwpLCAmcmxvbmdsb25nLCB2YWx1ZXMpOworICAgICAgQ0hFQ0socmxvbmdsb25nID09IGxsKTsKKyAgICB9CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sbDEuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX2xsMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2U4YTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9sbDEuYwpAQCAtMCwwICsxLDQzIEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgaWYgbG9uZyBsb25nIGFyZSBwYXNzZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVncyBvbiBwcGMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJMjAxMDQuCisgICBPcmlnaW5hdG9yOgk8YW5kcmVhc3RAZ2NjLmdudS5vcmc+IDIwMDUwMjIyICAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1Xbm8tZm9ybWF0IiB7IHRhcmdldCBhbHBoYSotZGVjLW9zZiogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorc3RhdGljIGxvbmcgbG9uZyByZXR1cm5fbGwoaW50IGxsMCwgbG9uZyBsb25nIGxsMSwgaW50IGxsMikKK3sKKyAgcmV0dXJuIGxsMCArIGxsMSArIGxsMjsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGxvbmcgbG9uZyBybG9uZ2xvbmc7CisgIGxvbmcgbG9uZyBsbDE7CisgIHVuc2lnbmVkIGxsMCwgbGwyOworCisgIGFyZ3NbMF0gPSAmZmZpX3R5cGVfc2ludDsKKyAgYXJnc1sxXSA9ICZmZmlfdHlwZV9zaW50NjQ7CisgIGFyZ3NbMl0gPSAmZmZpX3R5cGVfc2ludDsKKyAgdmFsdWVzWzBdID0gJmxsMDsKKyAgdmFsdWVzWzFdID0gJmxsMTsKKyAgdmFsdWVzWzJdID0gJmxsMjsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMywKKwkJICAgICAmZmZpX3R5cGVfc2ludDY0LCBhcmdzKSA9PSBGRklfT0spOworCisgIGxsMCA9IDExMTExMTExOworICBsbDEgPSAxMTExMTExMTExMTAwMExMOworICBsbDIgPSAxMTExMTExMTsKKworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4ocmV0dXJuX2xsKSwgJnJsb25nbG9uZywgdmFsdWVzKTsKKyAgcHJpbnRmKCJyZXM6ICUiIFBSSWRMTCAiLCAlIiBQUklkTEwgIlxuIiwgcmxvbmdsb25nLCBsbDAgKyBsbDEgKyBsbDIpOworICAvKiB7IGRnLW91dHB1dCAicmVzOiAxMTExMTEzMzMzMzIyMiwgMTExMTExMzMzMzMyMjIiIH0gKi8KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX3NjLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjA4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zYy5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayByZXR1cm4gdmFsdWUgc2lnbmVkIGNoYXIuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHNpZ25lZCBjaGFyIHJldHVybl9zYyhzaWduZWQgY2hhciBzYykKK3sKKyAgcmV0dXJuIHNjOworfQoraW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV9hcmcgcmludDsKKyAgc2lnbmVkIGNoYXIgc2M7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9zY2hhcjsKKyAgdmFsdWVzWzBdID0gJnNjOworCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLAorCQkgICAgICZmZmlfdHlwZV9zY2hhciwgYXJncykgPT0gRkZJX09LKTsKKworICBmb3IgKHNjID0gKHNpZ25lZCBjaGFyKSAtMTI3OworICAgICAgIHNjIDwgKHNpZ25lZCBjaGFyKSAxMjc7IHNjKyspCisgICAgeworICAgICAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHJldHVybl9zYyksICZyaW50LCB2YWx1ZXMpOworICAgICAgQ0hFQ0socmludCA9PSAoZmZpX2FyZykgc2MpOworICAgIH0KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvcmV0dXJuX3NsLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZmQzNDUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl9zbC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBpZiBsb25nIGFzIHJldHVybiB0eXBlIGlzIGhhbmRsZWQgY29ycmVjdGx5LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKK3N0YXRpYyBsb25nIHJldHVybl9zbChsb25nIGwxLCBsb25nIGwyKQoreworICByZXR1cm4gbDEgLSBsMjsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV9hcmcgcmVzOworICB1bnNpZ25lZCBsb25nIGwxLCBsMjsKKworICBhcmdzWzBdID0gJmZmaV90eXBlX3Nsb25nOworICBhcmdzWzFdID0gJmZmaV90eXBlX3Nsb25nOworICB2YWx1ZXNbMF0gPSAmbDE7CisgIHZhbHVlc1sxXSA9ICZsMjsKKworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAyLAorCQkgICAgICZmZmlfdHlwZV9zbG9uZywgYXJncykgPT0gRkZJX09LKTsKKworICBsMSA9IDEwNzM3NDE4MjNMOworICBsMiA9IDEwNzM3NDE4MjRMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihyZXR1cm5fc2wpLCAmcmVzLCB2YWx1ZXMpOworICBwcmludGYoInJlczogJWxkLCAlbGRcbiIsIChsb25nKXJlcywgbDEgLSBsMik7CisgIC8qIHsgZGctb3V0cHV0ICJyZXM6IC0xLCAtMSIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl91Yy5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M0NWRlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWMuYwpAQCAtMCwwICsxLDM4IEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIHVuc2lnbmVkIGNoYXIuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmV0dXJuX3VjKHVuc2lnbmVkIGNoYXIgdWMpCit7CisgIHJldHVybiB1YzsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV9hcmcgcmludDsKKworICB1bnNpZ25lZCBjaGFyIHVjOworCisgIGFyZ3NbMF0gPSAmZmZpX3R5cGVfdWNoYXI7CisgIHZhbHVlc1swXSA9ICZ1YzsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwKKwkJICAgICAmZmZpX3R5cGVfdWNoYXIsIGFyZ3MpID09IEZGSV9PSyk7CisKKyAgZm9yICh1YyA9ICh1bnNpZ25lZCBjaGFyKSAnXHgwMCc7CisgICAgICAgdWMgPCAodW5zaWduZWQgY2hhcikgJ1x4ZmYnOyB1YysrKQorICAgIHsKKyAgICAgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihyZXR1cm5fdWMpLCAmcmludCwgdmFsdWVzKTsKKyAgICAgIENIRUNLKHJpbnQgPT0gKHNpZ25lZCBpbnQpIHVjKTsKKyAgICB9CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3JldHVybl91bC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmIyNjZmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9yZXR1cm5fdWwuYwpAQCAtMCwwICsxLDM4IEBACisvKiBBcmVhOglmZmlfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgaWYgdW5zaWduZWQgbG9uZyBhcyByZXR1cm4gdHlwZSBpcyBoYW5kbGVkIGNvcnJlY3RseS4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQlub25lLgorICAgT3JpZ2luYXRvcjoJPGthZmZlZXRpc2NoIGF0IGdteCBkb3QgZGU+IDIwMDYwNzI0ICAqLworCisvKiB7IGRnLWRvIHJ1biB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorc3RhdGljIHVuc2lnbmVkIGxvbmcgcmV0dXJuX3VsKHVuc2lnbmVkIGxvbmcgdWwxLCB1bnNpZ25lZCBsb25nIHVsMikKK3sKKyAgcmV0dXJuIHVsMSArIHVsMjsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV9hcmcgcmVzOworICB1bnNpZ25lZCBsb25nIHVsMSwgdWwyOworCisgIGFyZ3NbMF0gPSAmZmZpX3R5cGVfdWxvbmc7CisgIGFyZ3NbMV0gPSAmZmZpX3R5cGVfdWxvbmc7CisgIHZhbHVlc1swXSA9ICZ1bDE7CisgIHZhbHVlc1sxXSA9ICZ1bDI7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMiwKKwkJICAgICAmZmZpX3R5cGVfdWxvbmcsIGFyZ3MpID09IEZGSV9PSyk7CisKKyAgdWwxID0gMTA3Mzc0MTgyM0w7CisgIHVsMiA9IDEwNzM3NDE4MjRMOworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihyZXR1cm5fdWwpLCAmcmVzLCB2YWx1ZXMpOworICBwcmludGYoInJlczogJWx1LCAlbHVcbiIsICh1bnNpZ25lZCBsb25nKXJlcywgdWwxICsgdWwyKTsKKyAgLyogeyBkZy1vdXRwdXQgInJlczogMjE0NzQ4MzY0NywgMjE0NzQ4MzY0NyIgfSAqLworCisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X2xhcmdlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X2xhcmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhOTNiOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UuYwpAQCAtMCwwICsxLDE0NSBAQAorLyogQXJlYToJCWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CQlDaGVjayBzdHJ1Y3R1cmUgcmV0dXJuaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQkJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBiaWdnZXIgc3RydWN0IHdoaWNoIG92ZXJsYXBzCisJCQkJdGhlIGdwIGFuZCBmcCByZWdpc3RlciBjb3VudCBvbiBEYXJ3aW4vQUlYL3BwYzY0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjoJQmxha2UgQ2hhZmZpbgk2LzIxLzIwMDcJKi8KKworLyogeyBkZy1kbyBydW4geyB4ZmFpbCBzdHJvbmdhcm0qLSotKiB4c2NhbGUqLSotKiAgfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCisvLyAxMyBGUFJzOiAxMDQgYnl0ZXMKKy8vIDE0IEZQUnM6IDExMiBieXRlcworCit0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfMTA4Ynl0ZSB7CisJZG91YmxlIGE7CisJZG91YmxlIGI7CisJZG91YmxlIGM7CisJZG91YmxlIGQ7CisJZG91YmxlIGU7CisJZG91YmxlIGY7CisJZG91YmxlIGc7CisJZG91YmxlIGg7CisJZG91YmxlIGk7CisJZG91YmxlIGo7CisJZG91YmxlIGs7CisJZG91YmxlIGw7CisJZG91YmxlIG07CisJaW50IG47Cit9IHN0cnVjdF8xMDhieXRlOworCitzdHJ1Y3RfMTA4Ynl0ZSBjbHNfc3RydWN0XzEwOGJ5dGVfZm4oCisJc3RydWN0XzEwOGJ5dGUgYjAsCisJc3RydWN0XzEwOGJ5dGUgYjEsCisJc3RydWN0XzEwOGJ5dGUgYjIsCisJc3RydWN0XzEwOGJ5dGUgYjMpCit7CisJc3RydWN0XzEwOGJ5dGUJcmVzdWx0OworCisJcmVzdWx0LmEgPSBiMC5hICsgYjEuYSArIGIyLmEgKyBiMy5hOworCXJlc3VsdC5iID0gYjAuYiArIGIxLmIgKyBiMi5iICsgYjMuYjsKKwlyZXN1bHQuYyA9IGIwLmMgKyBiMS5jICsgYjIuYyArIGIzLmM7CisJcmVzdWx0LmQgPSBiMC5kICsgYjEuZCArIGIyLmQgKyBiMy5kOworCXJlc3VsdC5lID0gYjAuZSArIGIxLmUgKyBiMi5lICsgYjMuZTsKKwlyZXN1bHQuZiA9IGIwLmYgKyBiMS5mICsgYjIuZiArIGIzLmY7CisJcmVzdWx0LmcgPSBiMC5nICsgYjEuZyArIGIyLmcgKyBiMy5nOworCXJlc3VsdC5oID0gYjAuaCArIGIxLmggKyBiMi5oICsgYjMuaDsKKwlyZXN1bHQuaSA9IGIwLmkgKyBiMS5pICsgYjIuaSArIGIzLmk7CisJcmVzdWx0LmogPSBiMC5qICsgYjEuaiArIGIyLmogKyBiMy5qOworCXJlc3VsdC5rID0gYjAuayArIGIxLmsgKyBiMi5rICsgYjMuazsKKwlyZXN1bHQubCA9IGIwLmwgKyBiMS5sICsgYjIubCArIGIzLmw7CisJcmVzdWx0Lm0gPSBiMC5tICsgYjEubSArIGIyLm0gKyBiMy5tOworCXJlc3VsdC5uID0gYjAubiArIGIxLm4gKyBiMi5uICsgYjMubjsKKworCXByaW50ZigiJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWRcbiIsIHJlc3VsdC5hLCByZXN1bHQuYiwgcmVzdWx0LmMsCisJCXJlc3VsdC5kLCByZXN1bHQuZSwgcmVzdWx0LmYsIHJlc3VsdC5nLCByZXN1bHQuaCwgcmVzdWx0LmksCisJCXJlc3VsdC5qLCByZXN1bHQuaywgcmVzdWx0LmwsIHJlc3VsdC5tLCByZXN1bHQubik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF8xMDhieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKwlzdHJ1Y3RfMTA4Ynl0ZQliMCwgYjEsIGIyLCBiMzsKKworCWIwID0gKihzdHJ1Y3RfMTA4Ynl0ZSopKGFyZ3NbMF0pOworCWIxID0gKihzdHJ1Y3RfMTA4Ynl0ZSopKGFyZ3NbMV0pOworCWIyID0gKihzdHJ1Y3RfMTA4Ynl0ZSopKGFyZ3NbMl0pOworCWIzID0gKihzdHJ1Y3RfMTA4Ynl0ZSopKGFyZ3NbM10pOworCisJKihzdHJ1Y3RfMTA4Ynl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfMTA4Ynl0ZV9mbihiMCwgYjEsIGIyLCBiMyk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworCWZmaV9jaWYgY2lmOworICAgICAgICB2b2lkICpjb2RlOworCWZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisJdm9pZCogYXJnc19kYmxbNV07CisJZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzE1XTsKKwlmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisJZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKwljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisJY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisJY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKwlzdHJ1Y3RfMTA4Ynl0ZSBlX2RibCA9IHsgOS4wLCAyLjAsIDYuMCwgNS4wLCAzLjAsIDQuMCwgOC4wLCAxLjAsIDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA3IH07CisJc3RydWN0XzEwOGJ5dGUgZl9kYmwgPSB7IDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA1LjAsIDYuMCwgNy4wLCA0LjAsIDUuMCwgNy4wLCA5LjAsIDEuMCwgNCB9OworCXN0cnVjdF8xMDhieXRlIGdfZGJsID0geyA0LjAsIDUuMCwgNy4wLCA5LjAsIDEuMCwgMS4wLCAyLjAsIDkuMCwgOC4wLCA2LjAsIDEuMCwgNC4wLCAwLjAsIDMgfTsKKwlzdHJ1Y3RfMTA4Ynl0ZSBoX2RibCA9IHsgOC4wLCA2LjAsIDEuMCwgNC4wLCAwLjAsIDMuMCwgMy4wLCAxLjAsIDkuMCwgMi4wLCA2LjAsIDUuMCwgMy4wLCAyIH07CisJc3RydWN0XzEwOGJ5dGUgcmVzX2RibDsKKworCWNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s0XSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbNV0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzZdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s3XSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbOF0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzldID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1sxMF0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzExXSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbMTJdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1sxM10gPSAmZmZpX3R5cGVfc2ludDMyOworCWNsc19zdHJ1Y3RfZmllbGRzWzE0XSA9IE5VTEw7CisKKwlkYmxfYXJnX3R5cGVzWzBdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKwlkYmxfYXJnX3R5cGVzWzFdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKwlkYmxfYXJnX3R5cGVzWzJdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKwlkYmxfYXJnX3R5cGVzWzNdID0gJmNsc19zdHJ1Y3RfdHlwZTsKKwlkYmxfYXJnX3R5cGVzWzRdID0gTlVMTDsKKworCUNIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDQsICZjbHNfc3RydWN0X3R5cGUsCisJCWRibF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKwlhcmdzX2RibFswXSA9ICZlX2RibDsKKwlhcmdzX2RibFsxXSA9ICZmX2RibDsKKwlhcmdzX2RibFsyXSA9ICZnX2RibDsKKwlhcmdzX2RibFszXSA9ICZoX2RibDsKKwlhcmdzX2RibFs0XSA9IE5VTEw7CisKKwlmZmlfY2FsbCgmY2lmLCBGRklfRk4oY2xzX3N0cnVjdF8xMDhieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKwkvKiB7IGRnLW91dHB1dCAiMjIgMTUgMTcgMjUgNiAxMyAxOSAxOCAyMiAxNSAxNyAyNSA2IDE2IiB9ICovCisJcHJpbnRmKCJyZXM6ICVnICVnICVnICVnICVnICVnICVnICVnICVnICVnICVnICVnICVnICVkXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwKKwkJcmVzX2RibC5jLCByZXNfZGJsLmQsIHJlc19kYmwuZSwgcmVzX2RibC5mLCByZXNfZGJsLmcsIHJlc19kYmwuaCwgcmVzX2RibC5pLAorCQlyZXNfZGJsLmosIHJlc19kYmwuaywgcmVzX2RibC5sLCByZXNfZGJsLm0sIHJlc19kYmwubik7CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyMiAxNSAxNyAyNSA2IDEzIDE5IDE4IDIyIDE1IDE3IDI1IDYgMTYiIH0gKi8KKworCUNIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF8xMDhieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisJcmVzX2RibCA9ICgoc3RydWN0XzEwOGJ5dGUoKikoc3RydWN0XzEwOGJ5dGUsIHN0cnVjdF8xMDhieXRlLAorCQlzdHJ1Y3RfMTA4Ynl0ZSwgc3RydWN0XzEwOGJ5dGUpKShjb2RlKSkoZV9kYmwsIGZfZGJsLCBnX2RibCwgaF9kYmwpOworCS8qIHsgZGctb3V0cHV0ICJcbjIyIDE1IDE3IDI1IDYgMTMgMTkgMTggMjIgMTUgMTcgMjUgNiAxNiIgfSAqLworCXByaW50ZigicmVzOiAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsCisJCXJlc19kYmwuYywgcmVzX2RibC5kLCByZXNfZGJsLmUsIHJlc19kYmwuZiwgcmVzX2RibC5nLCByZXNfZGJsLmgsIHJlc19kYmwuaSwKKwkJcmVzX2RibC5qLCByZXNfZGJsLmssIHJlc19kYmwubCwgcmVzX2RibC5tLCByZXNfZGJsLm4pOworCS8qIHsgZGctb3V0cHV0ICJcbnJlczogMjIgMTUgMTcgMjUgNiAxMyAxOSAxOCAyMiAxNSAxNyAyNSA2IDE2IiB9ICovCisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9sYXJnZTIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1OTlkMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbGFyZ2UyLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIEFyZWE6CQlmZmlfY2FsbCwgY2xvc3VyZV9jYWxsCisgICBQdXJwb3NlOgkJQ2hlY2sgc3RydWN0dXJlIHJldHVybmluZyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZS4KKwkJCQlEZXBlbmRpbmcgb24gdGhlIEFCSS4gQ2hlY2sgYmlnZ2VyIHN0cnVjdCB3aGljaCBvdmVybGFwcworCQkJCXRoZSBncCBhbmQgZnAgcmVnaXN0ZXIgY291bnQgb24gRGFyd2luL0FJWC9wcGM2NC4KKyAgIExpbWl0YXRpb25zOglub25lLgorICAgUFI6CQkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUJsYWtlIENoYWZmaW4JNi8yMS8yMDA3CSovCisKKy8qIHsgZGctZG8gcnVuIHsgeGZhaWwgc3Ryb25nYXJtKi0qLSogeHNjYWxlKi0qLSogIH0gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworLy8gMTMgRlBSczogMTA0IGJ5dGVzCisvLyAxNCBGUFJzOiAxMTIgYnl0ZXMKKwordHlwZWRlZiBzdHJ1Y3Qgc3RydWN0XzExNmJ5dGUgeworCWRvdWJsZSBhOworCWRvdWJsZSBiOworCWRvdWJsZSBjOworCWRvdWJsZSBkOworCWRvdWJsZSBlOworCWRvdWJsZSBmOworCWRvdWJsZSBnOworCWRvdWJsZSBoOworCWRvdWJsZSBpOworCWRvdWJsZSBqOworCWRvdWJsZSBrOworCWRvdWJsZSBsOworCWRvdWJsZSBtOworCWRvdWJsZSBuOworCWludCBvOworfSBzdHJ1Y3RfMTE2Ynl0ZTsKKworc3RydWN0XzExNmJ5dGUgY2xzX3N0cnVjdF8xMTZieXRlX2ZuKAorCXN0cnVjdF8xMTZieXRlIGIwLAorCXN0cnVjdF8xMTZieXRlIGIxLAorCXN0cnVjdF8xMTZieXRlIGIyLAorCXN0cnVjdF8xMTZieXRlIGIzKQoreworCXN0cnVjdF8xMTZieXRlCXJlc3VsdDsKKworCXJlc3VsdC5hID0gYjAuYSArIGIxLmEgKyBiMi5hICsgYjMuYTsKKwlyZXN1bHQuYiA9IGIwLmIgKyBiMS5iICsgYjIuYiArIGIzLmI7CisJcmVzdWx0LmMgPSBiMC5jICsgYjEuYyArIGIyLmMgKyBiMy5jOworCXJlc3VsdC5kID0gYjAuZCArIGIxLmQgKyBiMi5kICsgYjMuZDsKKwlyZXN1bHQuZSA9IGIwLmUgKyBiMS5lICsgYjIuZSArIGIzLmU7CisJcmVzdWx0LmYgPSBiMC5mICsgYjEuZiArIGIyLmYgKyBiMy5mOworCXJlc3VsdC5nID0gYjAuZyArIGIxLmcgKyBiMi5nICsgYjMuZzsKKwlyZXN1bHQuaCA9IGIwLmggKyBiMS5oICsgYjIuaCArIGIzLmg7CisJcmVzdWx0LmkgPSBiMC5pICsgYjEuaSArIGIyLmkgKyBiMy5pOworCXJlc3VsdC5qID0gYjAuaiArIGIxLmogKyBiMi5qICsgYjMuajsKKwlyZXN1bHQuayA9IGIwLmsgKyBiMS5rICsgYjIuayArIGIzLms7CisJcmVzdWx0LmwgPSBiMC5sICsgYjEubCArIGIyLmwgKyBiMy5sOworCXJlc3VsdC5tID0gYjAubSArIGIxLm0gKyBiMi5tICsgYjMubTsKKwlyZXN1bHQubiA9IGIwLm4gKyBiMS5uICsgYjIubiArIGIzLm47CisJcmVzdWx0Lm8gPSBiMC5vICsgYjEubyArIGIyLm8gKyBiMy5vOworCisJcHJpbnRmKCIlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZFxuIiwgcmVzdWx0LmEsIHJlc3VsdC5iLCByZXN1bHQuYywKKwkJcmVzdWx0LmQsIHJlc3VsdC5lLCByZXN1bHQuZiwgcmVzdWx0LmcsIHJlc3VsdC5oLCByZXN1bHQuaSwKKwkJcmVzdWx0LmosIHJlc3VsdC5rLCByZXN1bHQubCwgcmVzdWx0Lm0sIHJlc3VsdC5uLCByZXN1bHQubyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorY2xzX3N0cnVjdF8xMTZieXRlX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwLCB2b2lkKiogYXJncywgdm9pZCogdXNlcmRhdGEgX19VTlVTRURfXykKK3sKKwlzdHJ1Y3RfMTE2Ynl0ZQliMCwgYjEsIGIyLCBiMzsKKworCWIwID0gKihzdHJ1Y3RfMTE2Ynl0ZSopKGFyZ3NbMF0pOworCWIxID0gKihzdHJ1Y3RfMTE2Ynl0ZSopKGFyZ3NbMV0pOworCWIyID0gKihzdHJ1Y3RfMTE2Ynl0ZSopKGFyZ3NbMl0pOworCWIzID0gKihzdHJ1Y3RfMTE2Ynl0ZSopKGFyZ3NbM10pOworCisJKihzdHJ1Y3RfMTE2Ynl0ZSopcmVzcCA9IGNsc19zdHJ1Y3RfMTE2Ynl0ZV9mbihiMCwgYjEsIGIyLCBiMyk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworCWZmaV9jaWYgY2lmOworICAgICAgICB2b2lkICpjb2RlOworCWZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisJdm9pZCogYXJnc19kYmxbNV07CisJZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzE2XTsKKwlmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisJZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKwljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisJY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisJY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKwlzdHJ1Y3RfMTE2Ynl0ZSBlX2RibCA9IHsgOS4wLCAyLjAsIDYuMCwgNS4wLCAzLjAsIDQuMCwgOC4wLCAxLjAsIDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA1LjAsIDcgfTsKKwlzdHJ1Y3RfMTE2Ynl0ZSBmX2RibCA9IHsgMS4wLCAyLjAsIDMuMCwgNy4wLCAyLjAsIDUuMCwgNi4wLCA3LjAsIDQuMCwgNS4wLCA3LjAsIDkuMCwgMS4wLCA2LjAsIDQgfTsKKwlzdHJ1Y3RfMTE2Ynl0ZSBnX2RibCA9IHsgNC4wLCA1LjAsIDcuMCwgOS4wLCAxLjAsIDEuMCwgMi4wLCA5LjAsIDguMCwgNi4wLCAxLjAsIDQuMCwgMC4wLCA3LjAsIDMgfTsKKwlzdHJ1Y3RfMTE2Ynl0ZSBoX2RibCA9IHsgOC4wLCA2LjAsIDEuMCwgNC4wLCAwLjAsIDMuMCwgMy4wLCAxLjAsIDkuMCwgMi4wLCA2LjAsIDUuMCwgMy4wLCA4LjAsIDIgfTsKKwlzdHJ1Y3RfMTE2Ynl0ZSByZXNfZGJsOworCisJY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbM10gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzRdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s1XSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbNl0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzddID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s4XSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbOV0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzEwXSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbMTFdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1sxMl0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzEzXSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbMTRdID0gJmZmaV90eXBlX3NpbnQzMjsKKwljbHNfc3RydWN0X2ZpZWxkc1sxNV0gPSBOVUxMOworCisJZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1syXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1szXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1s0XSA9IE5VTEw7CisKKwlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA0LCAmY2xzX3N0cnVjdF90eXBlLAorCQlkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisJYXJnc19kYmxbMF0gPSAmZV9kYmw7CisJYXJnc19kYmxbMV0gPSAmZl9kYmw7CisJYXJnc19kYmxbMl0gPSAmZ19kYmw7CisJYXJnc19kYmxbM10gPSAmaF9kYmw7CisJYXJnc19kYmxbNF0gPSBOVUxMOworCisJZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfMTE2Ynl0ZV9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisJLyogeyBkZy1vdXRwdXQgIjIyIDE1IDE3IDI1IDYgMTMgMTkgMTggMjIgMTUgMTcgMjUgNiAyNiAxNiIgfSAqLworCXByaW50ZigicmVzOiAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsCisJCXJlc19kYmwuYywgcmVzX2RibC5kLCByZXNfZGJsLmUsIHJlc19kYmwuZiwgcmVzX2RibC5nLCByZXNfZGJsLmgsIHJlc19kYmwuaSwKKwkJcmVzX2RibC5qLCByZXNfZGJsLmssIHJlc19kYmwubCwgcmVzX2RibC5tLCByZXNfZGJsLm4sIHJlc19kYmwubyk7CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyMiAxNSAxNyAyNSA2IDEzIDE5IDE4IDIyIDE1IDE3IDI1IDYgMjYgMTYiIH0gKi8KKworCUNIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xzX3N0cnVjdF8xMTZieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisJcmVzX2RibCA9ICgoc3RydWN0XzExNmJ5dGUoKikoc3RydWN0XzExNmJ5dGUsIHN0cnVjdF8xMTZieXRlLAorCQlzdHJ1Y3RfMTE2Ynl0ZSwgc3RydWN0XzExNmJ5dGUpKShjb2RlKSkoZV9kYmwsIGZfZGJsLCBnX2RibCwgaF9kYmwpOworCS8qIHsgZGctb3V0cHV0ICJcbjIyIDE1IDE3IDI1IDYgMTMgMTkgMTggMjIgMTUgMTcgMjUgNiAyNiAxNiIgfSAqLworCXByaW50ZigicmVzOiAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZFxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsCisJCXJlc19kYmwuYywgcmVzX2RibC5kLCByZXNfZGJsLmUsIHJlc19kYmwuZiwgcmVzX2RibC5nLCByZXNfZGJsLmgsIHJlc19kYmwuaSwKKwkJcmVzX2RibC5qLCByZXNfZGJsLmssIHJlc19kYmwubCwgcmVzX2RibC5tLCByZXNfZGJsLm4sIHJlc19kYmwubyk7CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyMiAxNSAxNyAyNSA2IDEzIDE5IDE4IDIyIDE1IDE3IDI1IDYgMjYgMTYiIH0gKi8KKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9tZWRpdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM2YTllCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJldF9tZWRpdW0uYwpAQCAtMCwwICsxLDEyNCBAQAorLyogQXJlYToJCWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CQlDaGVjayBzdHJ1Y3R1cmUgcmV0dXJuaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQkJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBiaWdnZXIgc3RydWN0IHdoaWNoIG92ZXJsYXBzCisJCQkJdGhlIGdwIGFuZCBmcCByZWdpc3RlciBjb3VudCBvbiBEYXJ3aW4vQUlYL3BwYzY0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjoJQmxha2UgQ2hhZmZpbgk2LzIxLzIwMDcJKi8KKworLyogeyBkZy1kbyBydW4geyB4ZmFpbCBzdHJvbmdhcm0qLSotKiB4c2NhbGUqLSotKiAgfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfNzJieXRlIHsKKwlkb3VibGUgYTsKKwlkb3VibGUgYjsKKwlkb3VibGUgYzsKKwlkb3VibGUgZDsKKwlkb3VibGUgZTsKKwlkb3VibGUgZjsKKwlkb3VibGUgZzsKKwlkb3VibGUgaDsKKwlkb3VibGUgaTsKK30gc3RydWN0XzcyYnl0ZTsKKworc3RydWN0XzcyYnl0ZSBjbHNfc3RydWN0XzcyYnl0ZV9mbigKKwlzdHJ1Y3RfNzJieXRlIGIwLAorCXN0cnVjdF83MmJ5dGUgYjEsCisJc3RydWN0XzcyYnl0ZSBiMiwKKwlzdHJ1Y3RfNzJieXRlIGIzKQoreworCXN0cnVjdF83MmJ5dGUJcmVzdWx0OworCisJcmVzdWx0LmEgPSBiMC5hICsgYjEuYSArIGIyLmEgKyBiMy5hOworCXJlc3VsdC5iID0gYjAuYiArIGIxLmIgKyBiMi5iICsgYjMuYjsKKwlyZXN1bHQuYyA9IGIwLmMgKyBiMS5jICsgYjIuYyArIGIzLmM7CisJcmVzdWx0LmQgPSBiMC5kICsgYjEuZCArIGIyLmQgKyBiMy5kOworCXJlc3VsdC5lID0gYjAuZSArIGIxLmUgKyBiMi5lICsgYjMuZTsKKwlyZXN1bHQuZiA9IGIwLmYgKyBiMS5mICsgYjIuZiArIGIzLmY7CisJcmVzdWx0LmcgPSBiMC5nICsgYjEuZyArIGIyLmcgKyBiMy5nOworCXJlc3VsdC5oID0gYjAuaCArIGIxLmggKyBiMi5oICsgYjMuaDsKKwlyZXN1bHQuaSA9IGIwLmkgKyBiMS5pICsgYjIuaSArIGIzLmk7CisKKwlwcmludGYoIiVnICVnICVnICVnICVnICVnICVnICVnICVnXG4iLCByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jLAorCQlyZXN1bHQuZCwgcmVzdWx0LmUsIHJlc3VsdC5mLCByZXN1bHQuZywgcmVzdWx0LmgsIHJlc3VsdC5pKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzcyYnl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisJc3RydWN0XzcyYnl0ZQliMCwgYjEsIGIyLCBiMzsKKworCWIwID0gKihzdHJ1Y3RfNzJieXRlKikoYXJnc1swXSk7CisJYjEgPSAqKHN0cnVjdF83MmJ5dGUqKShhcmdzWzFdKTsKKwliMiA9ICooc3RydWN0XzcyYnl0ZSopKGFyZ3NbMl0pOworCWIzID0gKihzdHJ1Y3RfNzJieXRlKikoYXJnc1szXSk7CisKKwkqKHN0cnVjdF83MmJ5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzcyYnl0ZV9mbihiMCwgYjEsIGIyLCBiMyk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworCWZmaV9jaWYgY2lmOworICAgICAgICB2b2lkICpjb2RlOworCWZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisJdm9pZCogYXJnc19kYmxbNV07CisJZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzEwXTsKKwlmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisJZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKwljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisJY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisJY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKwlzdHJ1Y3RfNzJieXRlIGVfZGJsID0geyA5LjAsIDIuMCwgNi4wLCA1LjAsIDMuMCwgNC4wLCA4LjAsIDEuMCwgNy4wIH07CisJc3RydWN0XzcyYnl0ZSBmX2RibCA9IHsgMS4wLCAyLjAsIDMuMCwgNy4wLCAyLjAsIDUuMCwgNi4wLCA3LjAsIDQuMCB9OworCXN0cnVjdF83MmJ5dGUgZ19kYmwgPSB7IDQuMCwgNS4wLCA3LjAsIDkuMCwgMS4wLCAxLjAsIDIuMCwgOS4wLCAzLjAgfTsKKwlzdHJ1Y3RfNzJieXRlIGhfZGJsID0geyA4LjAsIDYuMCwgMS4wLCA0LjAsIDAuMCwgMy4wLCAzLjAsIDEuMCwgMi4wIH07CisJc3RydWN0XzcyYnl0ZSByZXNfZGJsOworCisJY2xzX3N0cnVjdF9maWVsZHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzFdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1syXSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbM10gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzRdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s1XSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbNl0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzddID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s4XSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbOV0gPSBOVUxMOworCisJZGJsX2FyZ190eXBlc1swXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1sxXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1syXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1szXSA9ICZjbHNfc3RydWN0X3R5cGU7CisJZGJsX2FyZ190eXBlc1s0XSA9IE5VTEw7CisKKwlDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCA0LCAmY2xzX3N0cnVjdF90eXBlLAorCQlkYmxfYXJnX3R5cGVzKSA9PSBGRklfT0spOworCisJYXJnc19kYmxbMF0gPSAmZV9kYmw7CisJYXJnc19kYmxbMV0gPSAmZl9kYmw7CisJYXJnc19kYmxbMl0gPSAmZ19kYmw7CisJYXJnc19kYmxbM10gPSAmaF9kYmw7CisJYXJnc19kYmxbNF0gPSBOVUxMOworCisJZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKGNsc19zdHJ1Y3RfNzJieXRlX2ZuKSwgJnJlc19kYmwsIGFyZ3NfZGJsKTsKKwkvKiB7IGRnLW91dHB1dCAiMjIgMTUgMTcgMjUgNiAxMyAxOSAxOCAxNiIgfSAqLworCXByaW50ZigicmVzOiAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZ1xuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYywKKwkJcmVzX2RibC5kLCByZXNfZGJsLmUsIHJlc19kYmwuZiwgcmVzX2RibC5nLCByZXNfZGJsLmgsIHJlc19kYmwuaSk7CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyMiAxNSAxNyAyNSA2IDEzIDE5IDE4IDE2IiB9ICovCisKKwlDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfNzJieXRlX2duLCBOVUxMLCBjb2RlKSA9PSBGRklfT0spOworCisJcmVzX2RibCA9ICgoc3RydWN0XzcyYnl0ZSgqKShzdHJ1Y3RfNzJieXRlLCBzdHJ1Y3RfNzJieXRlLAorCQlzdHJ1Y3RfNzJieXRlLCBzdHJ1Y3RfNzJieXRlKSkoY29kZSkpKGVfZGJsLCBmX2RibCwgZ19kYmwsIGhfZGJsKTsKKwkvKiB7IGRnLW91dHB1dCAiXG4yMiAxNSAxNyAyNSA2IDEzIDE5IDE4IDE2IiB9ICovCisJcHJpbnRmKCJyZXM6ICVnICVnICVnICVnICVnICVnICVnICVnICVnXG4iLCByZXNfZGJsLmEsIHJlc19kYmwuYiwgcmVzX2RibC5jLAorCQlyZXNfZGJsLmQsIHJlc19kYmwuZSwgcmVzX2RibC5mLCByZXNfZGJsLmcsIHJlc19kYmwuaCwgcmVzX2RibC5pKTsKKwkvKiB7IGRnLW91dHB1dCAiXG5yZXM6IDIyIDE1IDE3IDI1IDYgMTMgMTkgMTggMTYiIH0gKi8KKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RyZXRfbWVkaXVtMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMmYyZmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cmV0X21lZGl1bTIuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogQXJlYToJCWZmaV9jYWxsLCBjbG9zdXJlX2NhbGwKKyAgIFB1cnBvc2U6CQlDaGVjayBzdHJ1Y3R1cmUgcmV0dXJuaW5nIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplLgorCQkJCURlcGVuZGluZyBvbiB0aGUgQUJJLiBDaGVjayBiaWdnZXIgc3RydWN0IHdoaWNoIG92ZXJsYXBzCisJCQkJdGhlIGdwIGFuZCBmcCByZWdpc3RlciBjb3VudCBvbiBEYXJ3aW4vQUlYL3BwYzY0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCQlub25lLgorICAgT3JpZ2luYXRvcjoJQmxha2UgQ2hhZmZpbgk2LzIxLzIwMDcJKi8KKworLyogeyBkZy1kbyBydW4geyB4ZmFpbCBzdHJvbmdhcm0qLSotKiB4c2NhbGUqLSotKiAgfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1Xbm8tZm9ybWF0IiB7IHRhcmdldCBhbHBoYSotZGVjLW9zZiogfSB9ICovCisjaW5jbHVkZSAiZmZpdGVzdC5oIgorCit0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfNzJieXRlIHsKKwlkb3VibGUgYTsKKwlkb3VibGUgYjsKKwlkb3VibGUgYzsKKwlkb3VibGUgZDsKKwlkb3VibGUgZTsKKwlkb3VibGUgZjsKKwlkb3VibGUgZzsKKwlkb3VibGUgaDsKKwlsb25nIGxvbmcgaTsKK30gc3RydWN0XzcyYnl0ZTsKKworc3RydWN0XzcyYnl0ZSBjbHNfc3RydWN0XzcyYnl0ZV9mbigKKwlzdHJ1Y3RfNzJieXRlIGIwLAorCXN0cnVjdF83MmJ5dGUgYjEsCisJc3RydWN0XzcyYnl0ZSBiMiwKKwlzdHJ1Y3RfNzJieXRlIGIzKQoreworCXN0cnVjdF83MmJ5dGUJcmVzdWx0OworCisJcmVzdWx0LmEgPSBiMC5hICsgYjEuYSArIGIyLmEgKyBiMy5hOworCXJlc3VsdC5iID0gYjAuYiArIGIxLmIgKyBiMi5iICsgYjMuYjsKKwlyZXN1bHQuYyA9IGIwLmMgKyBiMS5jICsgYjIuYyArIGIzLmM7CisJcmVzdWx0LmQgPSBiMC5kICsgYjEuZCArIGIyLmQgKyBiMy5kOworCXJlc3VsdC5lID0gYjAuZSArIGIxLmUgKyBiMi5lICsgYjMuZTsKKwlyZXN1bHQuZiA9IGIwLmYgKyBiMS5mICsgYjIuZiArIGIzLmY7CisJcmVzdWx0LmcgPSBiMC5nICsgYjEuZyArIGIyLmcgKyBiMy5nOworCXJlc3VsdC5oID0gYjAuaCArIGIxLmggKyBiMi5oICsgYjMuaDsKKwlyZXN1bHQuaSA9IGIwLmkgKyBiMS5pICsgYjIuaSArIGIzLmk7CisKKwlwcmludGYoIiVnICVnICVnICVnICVnICVnICVnICVnICUiIFBSSWRMTCAiXG4iLCByZXN1bHQuYSwgcmVzdWx0LmIsIHJlc3VsdC5jLAorCQlyZXN1bHQuZCwgcmVzdWx0LmUsIHJlc3VsdC5mLCByZXN1bHQuZywgcmVzdWx0LmgsIHJlc3VsdC5pKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0XzcyYnl0ZV9nbihmZmlfY2lmKiBjaWYgX19VTlVTRURfXywgdm9pZCogcmVzcCwgdm9pZCoqIGFyZ3MsIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisJc3RydWN0XzcyYnl0ZQliMCwgYjEsIGIyLCBiMzsKKworCWIwID0gKihzdHJ1Y3RfNzJieXRlKikoYXJnc1swXSk7CisJYjEgPSAqKHN0cnVjdF83MmJ5dGUqKShhcmdzWzFdKTsKKwliMiA9ICooc3RydWN0XzcyYnl0ZSopKGFyZ3NbMl0pOworCWIzID0gKihzdHJ1Y3RfNzJieXRlKikoYXJnc1szXSk7CisKKwkqKHN0cnVjdF83MmJ5dGUqKXJlc3AgPSBjbHNfc3RydWN0XzcyYnl0ZV9mbihiMCwgYjEsIGIyLCBiMyk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworCWZmaV9jaWYgY2lmOworICAgICAgICB2b2lkICpjb2RlOworCWZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisJdm9pZCogYXJnc19kYmxbNV07CisJZmZpX3R5cGUqIGNsc19zdHJ1Y3RfZmllbGRzWzEwXTsKKwlmZmlfdHlwZSBjbHNfc3RydWN0X3R5cGU7CisJZmZpX3R5cGUqIGRibF9hcmdfdHlwZXNbNV07CisKKwljbHNfc3RydWN0X3R5cGUuc2l6ZSA9IDA7CisJY2xzX3N0cnVjdF90eXBlLmFsaWdubWVudCA9IDA7CisJY2xzX3N0cnVjdF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisJY2xzX3N0cnVjdF90eXBlLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHM7CisKKwlzdHJ1Y3RfNzJieXRlIGVfZGJsID0geyA5LjAsIDIuMCwgNi4wLCA1LjAsIDMuMCwgNC4wLCA4LjAsIDEuMCwgNyB9OworCXN0cnVjdF83MmJ5dGUgZl9kYmwgPSB7IDEuMCwgMi4wLCAzLjAsIDcuMCwgMi4wLCA1LjAsIDYuMCwgNy4wLCA0IH07CisJc3RydWN0XzcyYnl0ZSBnX2RibCA9IHsgNC4wLCA1LjAsIDcuMCwgOS4wLCAxLjAsIDEuMCwgMi4wLCA5LjAsIDMgfTsKKwlzdHJ1Y3RfNzJieXRlIGhfZGJsID0geyA4LjAsIDYuMCwgMS4wLCA0LjAsIDAuMCwgMy4wLCAzLjAsIDEuMCwgMiB9OworCXN0cnVjdF83MmJ5dGUgcmVzX2RibDsKKworCWNsc19zdHJ1Y3RfZmllbGRzWzBdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbMl0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzNdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s0XSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbNV0gPSAmZmZpX3R5cGVfZG91YmxlOworCWNsc19zdHJ1Y3RfZmllbGRzWzZdID0gJmZmaV90eXBlX2RvdWJsZTsKKwljbHNfc3RydWN0X2ZpZWxkc1s3XSA9ICZmZmlfdHlwZV9kb3VibGU7CisJY2xzX3N0cnVjdF9maWVsZHNbOF0gPSAmZmZpX3R5cGVfc2ludDY0OworCWNsc19zdHJ1Y3RfZmllbGRzWzldID0gTlVMTDsKKworCWRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlOworCWRibF9hcmdfdHlwZXNbMV0gPSAmY2xzX3N0cnVjdF90eXBlOworCWRibF9hcmdfdHlwZXNbMl0gPSAmY2xzX3N0cnVjdF90eXBlOworCWRibF9hcmdfdHlwZXNbM10gPSAmY2xzX3N0cnVjdF90eXBlOworCWRibF9hcmdfdHlwZXNbNF0gPSBOVUxMOworCisJQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgNCwgJmNsc19zdHJ1Y3RfdHlwZSwKKwkJZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworCWFyZ3NfZGJsWzBdID0gJmVfZGJsOworCWFyZ3NfZGJsWzFdID0gJmZfZGJsOworCWFyZ3NfZGJsWzJdID0gJmdfZGJsOworCWFyZ3NfZGJsWzNdID0gJmhfZGJsOworCWFyZ3NfZGJsWzRdID0gTlVMTDsKKworCWZmaV9jYWxsKCZjaWYsIEZGSV9GTihjbHNfc3RydWN0XzcyYnl0ZV9mbiksICZyZXNfZGJsLCBhcmdzX2RibCk7CisJLyogeyBkZy1vdXRwdXQgIjIyIDE1IDE3IDI1IDYgMTMgMTkgMTggMTYiIH0gKi8KKwlwcmludGYoInJlczogJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJSIgUFJJZExMICJcbiIsIHJlc19kYmwuYSwgcmVzX2RibC5iLCByZXNfZGJsLmMsCisJCXJlc19kYmwuZCwgcmVzX2RibC5lLCByZXNfZGJsLmYsIHJlc19kYmwuZywgcmVzX2RibC5oLCByZXNfZGJsLmkpOworCS8qIHsgZGctb3V0cHV0ICJcbnJlczogMjIgMTUgMTcgMjUgNiAxMyAxOSAxOCAxNiIgfSAqLworCisJQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbHNfc3RydWN0XzcyYnl0ZV9nbiwgTlVMTCwgY29kZSkgPT0gRkZJX09LKTsKKworCXJlc19kYmwgPSAoKHN0cnVjdF83MmJ5dGUoKikoc3RydWN0XzcyYnl0ZSwgc3RydWN0XzcyYnl0ZSwKKwkJc3RydWN0XzcyYnl0ZSwgc3RydWN0XzcyYnl0ZSkpKGNvZGUpKShlX2RibCwgZl9kYmwsIGdfZGJsLCBoX2RibCk7CisJLyogeyBkZy1vdXRwdXQgIlxuMjIgMTUgMTcgMjUgNiAxMyAxOSAxOCAxNiIgfSAqLworCXByaW50ZigicmVzOiAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlIiBQUklkTEwgIlxuIiwgcmVzX2RibC5hLCByZXNfZGJsLmIsIHJlc19kYmwuYywKKwkJcmVzX2RibC5kLCByZXNfZGJsLmUsIHJlc19kYmwuZiwgcmVzX2RibC5nLCByZXNfZGJsLmgsIHJlc19kYmwuaSk7CisJLyogeyBkZy1vdXRwdXQgIlxucmVzOiAyMiAxNSAxNyAyNSA2IDEzIDE5IDE4IDE2IiB9ICovCisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJsZW4uYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNDVkZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuLmMKQEAgLTAsMCArMSw0NCBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cmxlbiBmdW5jdGlvbiBjYWxsLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3N0YXRpYyBzaXplX3QgbXlfc3RybGVuKGNoYXIgKnMpCit7CisgIHJldHVybiAoc3RybGVuKHMpKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV9hcmcgcmludDsKKyAgY2hhciAqczsKKworICBhcmdzWzBdID0gJmZmaV90eXBlX3BvaW50ZXI7CisgIHZhbHVlc1swXSA9ICh2b2lkKikgJnM7CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwgCisJCSAgICAgJmZmaV90eXBlX3NpbnQsIGFyZ3MpID09IEZGSV9PSyk7CisgIAorICBzID0gImEiOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obXlfc3RybGVuKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gMSk7CisgIAorICBzID0gIjEyMzQ1NjciOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obXlfc3RybGVuKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gNyk7CisgIAorICBzID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUiOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obXlfc3RybGVuKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gMjUpOworICAKKyAgZXhpdCAoMCk7Cit9CisgIApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJsZW5fd2luMzIuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiY2M4NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RybGVuX3dpbjMyLmMKQEAgLTAsMCArMSw0NCBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0ZGNhbGwgc3RybGVuIGNhbGwgb24gWDg2X1dJTjMyIHN5c3RlbXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4geyB0YXJnZXQgaT84Ni0qLWN5Z3dpbiogaT84Ni0qLW1pbmd3KiB9IH0gKi8KKworI2luY2x1ZGUgImZmaXRlc3QuaCIKKworc3RhdGljIHNpemVfdCBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSkgbXlfc3RkY2FsbF9zdHJsZW4oY2hhciAqcykKK3sKKyAgcmV0dXJuIChzdHJsZW4ocykpOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZmZpX2FyZyByaW50OworICBjaGFyICpzOworICBhcmdzWzBdID0gJmZmaV90eXBlX3BvaW50ZXI7CisgIHZhbHVlc1swXSA9ICh2b2lkKikgJnM7CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9TVERDQUxMLCAxLAorCQkgICAgICAgJmZmaV90eXBlX3NpbnQsIGFyZ3MpID09IEZGSV9PSyk7CisgIAorICBzID0gImEiOworICBmZmlfY2FsbCgmY2lmLCBGRklfRk4obXlfc3RkY2FsbF9zdHJsZW4pLCAmcmludCwgdmFsdWVzKTsKKyAgQ0hFQ0socmludCA9PSAxKTsKKyAgCisgIHMgPSAiMTIzNDU2NyI7CisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihteV9zdGRjYWxsX3N0cmxlbiksICZyaW50LCB2YWx1ZXMpOworICBDSEVDSyhyaW50ID09IDcpOworICAKKyAgcyA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1IjsKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKG15X3N0ZGNhbGxfc3RybGVuKSwgJnJpbnQsIHZhbHVlcyk7CisgIENIRUNLKHJpbnQgPT0gMjUpOworICAKKyAgcHJpbnRmKCJzdGRjYWxsIHN0cmxlbiB0ZXN0cyBwYXNzZWRcbiIpOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QxLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTc2Yzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QxLmMKQEAgLTAsMCArMSw2NSBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciB1YzsKKyAgZG91YmxlIGQ7CisgIHVuc2lnbmVkIGludCB1aTsKK30gdGVzdF9zdHJ1Y3R1cmVfMTsKKworc3RhdGljIHRlc3Rfc3RydWN0dXJlXzEgc3RydWN0MSh0ZXN0X3N0cnVjdHVyZV8xIHRzKQoreworICB0cy51YysrOworICB0cy5kLS07CisgIHRzLnVpKys7CisKKyAgcmV0dXJuIHRzOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZmZpX3R5cGUgdHMxX3R5cGU7CisgIGZmaV90eXBlICp0czFfdHlwZV9lbGVtZW50c1s0XTsKKyAgdHMxX3R5cGUuc2l6ZSA9IDA7CisgIHRzMV90eXBlLmFsaWdubWVudCA9IDA7CisgIHRzMV90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIHRzMV90eXBlLmVsZW1lbnRzID0gdHMxX3R5cGVfZWxlbWVudHM7CisgIHRzMV90eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX3VjaGFyOworICB0czFfdHlwZV9lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIHRzMV90eXBlX2VsZW1lbnRzWzJdID0gJmZmaV90eXBlX3VpbnQ7CisgIHRzMV90eXBlX2VsZW1lbnRzWzNdID0gTlVMTDsKKyAgCisgIHRlc3Rfc3RydWN0dXJlXzEgdHMxX2FyZzsKKyAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCisgIHRlc3Rfc3RydWN0dXJlXzEgKnRzMV9yZXN1bHQgPSAKKyAgICAodGVzdF9zdHJ1Y3R1cmVfMSAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV8xKSk7CisgIAorICBhcmdzWzBdID0gJnRzMV90eXBlOworICB2YWx1ZXNbMF0gPSAmdHMxX2FyZzsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLCAKKwkJICAgICAmdHMxX3R5cGUsIGFyZ3MpID09IEZGSV9PSyk7CisgIAorICB0czFfYXJnLnVjID0gJ1x4MDEnOworICB0czFfYXJnLmQgPSAzLjE0MTU5OworICB0czFfYXJnLnVpID0gNTU1OworCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihzdHJ1Y3QxKSwgdHMxX3Jlc3VsdCwgdmFsdWVzKTsKKyAgCisgIENIRUNLKHRzMV9yZXN1bHQtPnVpID09IDU1Nik7CisgIENIRUNLKHRzMV9yZXN1bHQtPmQgPT0gMy4xNDE1OSAtIDEpOworIAorICBmcmVlICh0czFfcmVzdWx0KTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Mi5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiYzlmZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Mi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmVzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGRvdWJsZSBkMTsKKyAgZG91YmxlIGQyOworfSB0ZXN0X3N0cnVjdHVyZV8yOworCitzdGF0aWMgdGVzdF9zdHJ1Y3R1cmVfMiBzdHJ1Y3QyKHRlc3Rfc3RydWN0dXJlXzIgdHMpCit7CisgIHRzLmQxLS07CisgIHRzLmQyLS07CisKKyAgcmV0dXJuIHRzOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgdGVzdF9zdHJ1Y3R1cmVfMiB0czJfYXJnOworICBmZmlfdHlwZSB0czJfdHlwZTsKKyAgZmZpX3R5cGUgKnRzMl90eXBlX2VsZW1lbnRzWzNdOworICB0czJfdHlwZS5zaXplID0gMDsKKyAgdHMyX3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgdHMyX3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgdHMyX3R5cGUuZWxlbWVudHMgPSB0czJfdHlwZV9lbGVtZW50czsKKyAgdHMyX3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfZG91YmxlOworICB0czJfdHlwZV9lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV9kb3VibGU7CisgIHRzMl90eXBlX2VsZW1lbnRzWzJdID0gTlVMTDsKKworICAKKyAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCisgIHRlc3Rfc3RydWN0dXJlXzIgKnRzMl9yZXN1bHQgPSAKKyAgICAodGVzdF9zdHJ1Y3R1cmVfMiAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV8yKSk7CisgIAorICBhcmdzWzBdID0gJnRzMl90eXBlOworICB2YWx1ZXNbMF0gPSAmdHMyX2FyZzsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLCAmdHMyX3R5cGUsIGFyZ3MpID09IEZGSV9PSyk7CisgIAorICB0czJfYXJnLmQxID0gNS41NTsKKyAgdHMyX2FyZy5kMiA9IDYuNjY7CisgIAorICBwcmludGYgKCIlZ1xuIiwgdHMyX2FyZy5kMSk7CisgIHByaW50ZiAoIiVnXG4iLCB0czJfYXJnLmQyKTsKKyAgCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihzdHJ1Y3QyKSwgdHMyX3Jlc3VsdCwgdmFsdWVzKTsKKyAgCisgIHByaW50ZiAoIiVnXG4iLCB0czJfcmVzdWx0LT5kMSk7CisgIHByaW50ZiAoIiVnXG4iLCB0czJfcmVzdWx0LT5kMik7CisgIAorICBDSEVDSyh0czJfcmVzdWx0LT5kMSA9PSA1LjU1IC0gMSk7CisgIENIRUNLKHRzMl9yZXN1bHQtPmQyID09IDYuNjYgLSAxKTsKKyAgCisgIGZyZWUgKHRzMl9yZXN1bHQpOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QzLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGJiMDliCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3QzLmMKQEAgLTAsMCArMSw1OSBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IHNpOworfSB0ZXN0X3N0cnVjdHVyZV8zOworCitzdGF0aWMgdGVzdF9zdHJ1Y3R1cmVfMyBzdHJ1Y3QzKHRlc3Rfc3RydWN0dXJlXzMgdHMpCit7CisgIHRzLnNpID0gLSh0cy5zaSoyKTsKKworICByZXR1cm4gdHM7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBpbnQgY29tcGFyZV92YWx1ZTsKKyAgZmZpX3R5cGUgdHMzX3R5cGU7CisgIGZmaV90eXBlICp0czNfdHlwZV9lbGVtZW50c1syXTsKKyAgdHMzX3R5cGUuc2l6ZSA9IDA7CisgIHRzM190eXBlLmFsaWdubWVudCA9IDA7CisgIHRzM190eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIHRzM190eXBlLmVsZW1lbnRzID0gdHMzX3R5cGVfZWxlbWVudHM7CisgIHRzM190eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX3NpbnQ7CisgIHRzM190eXBlX2VsZW1lbnRzWzFdID0gTlVMTDsKKworICB0ZXN0X3N0cnVjdHVyZV8zIHRzM19hcmc7CisgIHRlc3Rfc3RydWN0dXJlXzMgKnRzM19yZXN1bHQgPSAKKyAgICAodGVzdF9zdHJ1Y3R1cmVfMyAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV8zKSk7CisgIAorICBhcmdzWzBdID0gJnRzM190eXBlOworICB2YWx1ZXNbMF0gPSAmdHMzX2FyZzsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGNpZiAqLworICBDSEVDSyhmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCAxLCAKKwkJICAgICAmdHMzX3R5cGUsIGFyZ3MpID09IEZGSV9PSyk7CisgIAorICB0czNfYXJnLnNpID0gLTEyMzsKKyAgY29tcGFyZV92YWx1ZSA9IHRzM19hcmcuc2k7CisgIAorICBmZmlfY2FsbCgmY2lmLCBGRklfRk4oc3RydWN0MyksIHRzM19yZXN1bHQsIHZhbHVlcyk7CisgIAorICBwcmludGYgKCIlZCAlZFxuIiwgdHMzX3Jlc3VsdC0+c2ksIC0oY29tcGFyZV92YWx1ZSoyKSk7CisgIAorICBDSEVDSyh0czNfcmVzdWx0LT5zaSA9PSAtKGNvbXBhcmVfdmFsdWUqMikpOworIAorICBmcmVlICh0czNfcmVzdWx0KTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0NC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMGE4MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0NC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmVzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIHVpMTsKKyAgdW5zaWduZWQgdWkyOworICB1bnNpZ25lZCB1aTM7Cit9IHRlc3Rfc3RydWN0dXJlXzQ7CisKK3N0YXRpYyB0ZXN0X3N0cnVjdHVyZV80IHN0cnVjdDQodGVzdF9zdHJ1Y3R1cmVfNCB0cykKK3sKKyAgdHMudWkzID0gdHMudWkxICogdHMudWkyICogdHMudWkzOworCisgIHJldHVybiB0czsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV90eXBlIHRzNF90eXBlOworICBmZmlfdHlwZSAqdHM0X3R5cGVfZWxlbWVudHNbNF07ICAKKyAgdHM0X3R5cGUuc2l6ZSA9IDA7CisgIHRzNF90eXBlLmFsaWdubWVudCA9IDA7CisgIHRzNF90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIHRlc3Rfc3RydWN0dXJlXzQgdHM0X2FyZzsKKyAgdHM0X3R5cGUuZWxlbWVudHMgPSB0czRfdHlwZV9lbGVtZW50czsKKyAgdHM0X3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgdHM0X3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfdWludDsKKyAgdHM0X3R5cGVfZWxlbWVudHNbMl0gPSAmZmZpX3R5cGVfdWludDsKKyAgdHM0X3R5cGVfZWxlbWVudHNbM10gPSBOVUxMOworCisgIAorICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KKyAgdGVzdF9zdHJ1Y3R1cmVfNCAqdHM0X3Jlc3VsdCA9IAorICAgICh0ZXN0X3N0cnVjdHVyZV80ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzQpKTsKKyAgCisgIGFyZ3NbMF0gPSAmdHM0X3R5cGU7CisgIHZhbHVlc1swXSA9ICZ0czRfYXJnOworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsICZ0czRfdHlwZSwgYXJncykgPT0gRkZJX09LKTsKKyAgCisgIHRzNF9hcmcudWkxID0gMjsKKyAgdHM0X2FyZy51aTIgPSAzOworICB0czRfYXJnLnVpMyA9IDQ7CisgIAorICBmZmlfY2FsbCAoJmNpZiwgRkZJX0ZOKHN0cnVjdDQpLCB0czRfcmVzdWx0LCB2YWx1ZXMpOworICAKKyAgQ0hFQ0sodHM0X3Jlc3VsdC0+dWkzID09IDJVICogM1UgKiA0VSk7CisgCisgIAorICBmcmVlICh0czRfcmVzdWx0KTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0NS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzY2M5NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0NS5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmVzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyIGMxOworICBjaGFyIGMyOworfSB0ZXN0X3N0cnVjdHVyZV81OworCitzdGF0aWMgdGVzdF9zdHJ1Y3R1cmVfNSBzdHJ1Y3Q1KHRlc3Rfc3RydWN0dXJlXzUgdHMxLCB0ZXN0X3N0cnVjdHVyZV81IHRzMikKK3sKKyAgdHMxLmMxICs9IHRzMi5jMTsKKyAgdHMxLmMyIC09IHRzMi5jMjsKKyAgCisgIHJldHVybiB0czE7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBmZmlfdHlwZSB0czVfdHlwZTsKKyAgZmZpX3R5cGUgKnRzNV90eXBlX2VsZW1lbnRzWzNdOworICB0czVfdHlwZS5zaXplID0gMDsKKyAgdHM1X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgdHM1X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgdHM1X3R5cGUuZWxlbWVudHMgPSB0czVfdHlwZV9lbGVtZW50czsKKyAgdHM1X3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfc2NoYXI7CisgIHRzNV90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX3NjaGFyOworICB0czVfdHlwZV9lbGVtZW50c1syXSA9IE5VTEw7CisKKyAgdGVzdF9zdHJ1Y3R1cmVfNSB0czVfYXJnMSwgdHM1X2FyZzI7CisgIAorICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KKyAgdGVzdF9zdHJ1Y3R1cmVfNSAqdHM1X3Jlc3VsdCA9IAorICAgICh0ZXN0X3N0cnVjdHVyZV81ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzUpKTsKKyAgCisgIGFyZ3NbMF0gPSAmdHM1X3R5cGU7CisgIGFyZ3NbMV0gPSAmdHM1X3R5cGU7CisgIHZhbHVlc1swXSA9ICZ0czVfYXJnMTsKKyAgdmFsdWVzWzFdID0gJnRzNV9hcmcyOworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDIsICZ0czVfdHlwZSwgYXJncykgPT0gRkZJX09LKTsKKyAgCisgIHRzNV9hcmcxLmMxID0gMjsKKyAgdHM1X2FyZzEuYzIgPSA2OworICB0czVfYXJnMi5jMSA9IDU7CisgIHRzNV9hcmcyLmMyID0gMzsKKyAgCisgIGZmaV9jYWxsICgmY2lmLCBGRklfRk4oc3RydWN0NSksIHRzNV9yZXN1bHQsIHZhbHVlcyk7CisgIAorICBDSEVDSyh0czVfcmVzdWx0LT5jMSA9PSA3KTsgCisgIENIRUNLKHRzNV9yZXN1bHQtPmMyID09IDMpOworICAKKyAgCisgIGZyZWUgKHRzNV9yZXN1bHQpOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q2LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RiOWFmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q2LmMKQEAgLTAsMCArMSw2NCBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKK3R5cGVkZWYgc3RydWN0Cit7CisgIGZsb2F0IGY7CisgIGRvdWJsZSBkOworfSB0ZXN0X3N0cnVjdHVyZV82OworCitzdGF0aWMgdGVzdF9zdHJ1Y3R1cmVfNiBzdHJ1Y3Q2ICh0ZXN0X3N0cnVjdHVyZV82IHRzKQoreworICB0cy5mICs9IDE7CisgIHRzLmQgKz0gMTsKKyAgCisgIHJldHVybiB0czsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV90eXBlIHRzNl90eXBlOworICBmZmlfdHlwZSAqdHM2X3R5cGVfZWxlbWVudHNbM107CisgIHRzNl90eXBlLnNpemUgPSAwOworICB0czZfdHlwZS5hbGlnbm1lbnQgPSAwOworICB0czZfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICB0czZfdHlwZS5lbGVtZW50cyA9IHRzNl90eXBlX2VsZW1lbnRzOworICB0czZfdHlwZV9lbGVtZW50c1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdHM2X3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfZG91YmxlOworICB0czZfdHlwZV9lbGVtZW50c1syXSA9IE5VTEw7CisKKworICB0ZXN0X3N0cnVjdHVyZV82IHRzNl9hcmc7CisKKyAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGEgcHJvcGVybHkgYWxpZ25lZCByZXN1bHQgYnVmZmVyICovCisgIHRlc3Rfc3RydWN0dXJlXzYgKnRzNl9yZXN1bHQgPSAKKyAgICAodGVzdF9zdHJ1Y3R1cmVfNiAqKSBtYWxsb2MgKHNpemVvZih0ZXN0X3N0cnVjdHVyZV82KSk7CisgIAorICBhcmdzWzBdID0gJnRzNl90eXBlOworICB2YWx1ZXNbMF0gPSAmdHM2X2FyZzsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwgJnRzNl90eXBlLCBhcmdzKSA9PSBGRklfT0spOworICAKKyAgdHM2X2FyZy5mID0gNS41NWY7CisgIHRzNl9hcmcuZCA9IDYuNjY7CisgIAorICBwcmludGYgKCIlZ1xuIiwgdHM2X2FyZy5mKTsKKyAgcHJpbnRmICgiJWdcbiIsIHRzNl9hcmcuZCk7CisKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHN0cnVjdDYpLCB0czZfcmVzdWx0LCB2YWx1ZXMpOworICAgIAorICBDSEVDSyh0czZfcmVzdWx0LT5mID09IDUuNTVmICsgMSk7CisgIENIRUNLKHRzNl9yZXN1bHQtPmQgPT0gNi42NiArIDEpOworICAgIAorICBmcmVlICh0czZfcmVzdWx0KTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ny5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhYWM0YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0Ny5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmVzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCit0eXBlZGVmIHN0cnVjdAoreworICBmbG9hdCBmMTsKKyAgZmxvYXQgZjI7CisgIGRvdWJsZSBkOworfSB0ZXN0X3N0cnVjdHVyZV83OworCitzdGF0aWMgdGVzdF9zdHJ1Y3R1cmVfNyBzdHJ1Y3Q3ICh0ZXN0X3N0cnVjdHVyZV83IHRzKQoreworICB0cy5mMSArPSAxOworICB0cy5mMiArPSAxOworICB0cy5kICs9IDE7CisKKyAgcmV0dXJuIHRzOworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZmZpX3R5cGUgdHM3X3R5cGU7CisgIGZmaV90eXBlICp0czdfdHlwZV9lbGVtZW50c1s0XTsKKyAgdHM3X3R5cGUuc2l6ZSA9IDA7CisgIHRzN190eXBlLmFsaWdubWVudCA9IDA7CisgIHRzN190eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgIHRzN190eXBlLmVsZW1lbnRzID0gdHM3X3R5cGVfZWxlbWVudHM7CisgIHRzN190eXBlX2VsZW1lbnRzWzBdID0gJmZmaV90eXBlX2Zsb2F0OworICB0czdfdHlwZV9lbGVtZW50c1sxXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdHM3X3R5cGVfZWxlbWVudHNbMl0gPSAmZmZpX3R5cGVfZG91YmxlOworICB0czdfdHlwZV9lbGVtZW50c1szXSA9IE5VTEw7CisKKworICB0ZXN0X3N0cnVjdHVyZV83IHRzN19hcmc7CisgIAorICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KKyAgdGVzdF9zdHJ1Y3R1cmVfNyAqdHM3X3Jlc3VsdCA9IAorICAgICh0ZXN0X3N0cnVjdHVyZV83ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzcpKTsKKyAgCisgIGFyZ3NbMF0gPSAmdHM3X3R5cGU7CisgIHZhbHVlc1swXSA9ICZ0czdfYXJnOworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsICZ0czdfdHlwZSwgYXJncykgPT0gRkZJX09LKTsKKyAgCisgIHRzN19hcmcuZjEgPSA1LjU1ZjsKKyAgdHM3X2FyZy5mMiA9IDU1LjVmOworICB0czdfYXJnLmQgPSA2LjY2OworCisgIHByaW50ZiAoIiVnXG4iLCB0czdfYXJnLmYxKTsKKyAgcHJpbnRmICgiJWdcbiIsIHRzN19hcmcuZjIpOworICBwcmludGYgKCIlZ1xuIiwgdHM3X2FyZy5kKTsKKyAgCisgIGZmaV9jYWxsKCZjaWYsIEZGSV9GTihzdHJ1Y3Q3KSwgdHM3X3Jlc3VsdCwgdmFsdWVzKTsKKworICBwcmludGYgKCIlZ1xuIiwgdHM3X3Jlc3VsdC0+ZjEpOworICBwcmludGYgKCIlZ1xuIiwgdHM3X3Jlc3VsdC0+ZjIpOworICBwcmludGYgKCIlZ1xuIiwgdHM3X3Jlc3VsdC0+ZCk7CisgIAorICBDSEVDSyh0czdfcmVzdWx0LT5mMSA9PSA1LjU1ZiArIDEpOworICBDSEVDSyh0czdfcmVzdWx0LT5mMiA9PSA1NS41ZiArIDEpOworICBDSEVDSyh0czdfcmVzdWx0LT5kID09IDYuNjYgKyAxKTsKKyAgCisgIGZyZWUgKHRzN19yZXN1bHQpOworICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q4LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5jYWxsL3N0cnVjdDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzczYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q4LmMKQEAgLTAsMCArMSw4MCBAQAorLyogQXJlYToJZmZpX2NhbGwKKyAgIFB1cnBvc2U6CUNoZWNrIHN0cnVjdHVyZXMuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUZyb20gdGhlIG9yaWdpbmFsIGZmaXRlc3QuYyAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKK3R5cGVkZWYgc3RydWN0Cit7CisgIGZsb2F0IGYxOworICBmbG9hdCBmMjsKKyAgZmxvYXQgZjM7CisgIGZsb2F0IGY0OworfSB0ZXN0X3N0cnVjdHVyZV84OworCitzdGF0aWMgdGVzdF9zdHJ1Y3R1cmVfOCBzdHJ1Y3Q4ICh0ZXN0X3N0cnVjdHVyZV84IHRzKQoreworICB0cy5mMSArPSAxOworICB0cy5mMiArPSAxOworICB0cy5mMyArPSAxOworICB0cy5mNCArPSAxOworCisgIHJldHVybiB0czsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGZmaV9jaWYgY2lmOworICBmZmlfdHlwZSAqYXJnc1tNQVhfQVJHU107CisgIHZvaWQgKnZhbHVlc1tNQVhfQVJHU107CisgIGZmaV90eXBlIHRzOF90eXBlOworICBmZmlfdHlwZSAqdHM4X3R5cGVfZWxlbWVudHNbNV07CisgIHRzOF90eXBlLnNpemUgPSAwOworICB0czhfdHlwZS5hbGlnbm1lbnQgPSAwOworICB0czhfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICB0czhfdHlwZS5lbGVtZW50cyA9IHRzOF90eXBlX2VsZW1lbnRzOworICB0czhfdHlwZV9lbGVtZW50c1swXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdHM4X3R5cGVfZWxlbWVudHNbMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIHRzOF90eXBlX2VsZW1lbnRzWzJdID0gJmZmaV90eXBlX2Zsb2F0OworICB0czhfdHlwZV9lbGVtZW50c1szXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgdHM4X3R5cGVfZWxlbWVudHNbNF0gPSBOVUxMOworCisgIHRlc3Rfc3RydWN0dXJlXzggdHM4X2FyZzsKKyAgCisgIC8qIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBhIHByb3Blcmx5IGFsaWduZWQgcmVzdWx0IGJ1ZmZlciAqLworICB0ZXN0X3N0cnVjdHVyZV84ICp0czhfcmVzdWx0ID0gCisgICAgKHRlc3Rfc3RydWN0dXJlXzggKikgbWFsbG9jIChzaXplb2YodGVzdF9zdHJ1Y3R1cmVfOCkpOworICAKKyAgYXJnc1swXSA9ICZ0czhfdHlwZTsKKyAgdmFsdWVzWzBdID0gJnRzOF9hcmc7CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwgJnRzOF90eXBlLCBhcmdzKSA9PSBGRklfT0spOworICAKKyAgdHM4X2FyZy5mMSA9IDUuNTVmOworICB0czhfYXJnLmYyID0gNTUuNWY7CisgIHRzOF9hcmcuZjMgPSAtNS41NWY7CisgIHRzOF9hcmcuZjQgPSAtNTUuNWY7CisKKyAgcHJpbnRmICgiJWdcbiIsIHRzOF9hcmcuZjEpOworICBwcmludGYgKCIlZ1xuIiwgdHM4X2FyZy5mMik7CisgIHByaW50ZiAoIiVnXG4iLCB0czhfYXJnLmYzKTsKKyAgcHJpbnRmICgiJWdcbiIsIHRzOF9hcmcuZjQpOworICAKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHN0cnVjdDgpLCB0czhfcmVzdWx0LCB2YWx1ZXMpOworCisgIHByaW50ZiAoIiVnXG4iLCB0czhfcmVzdWx0LT5mMSk7CisgIHByaW50ZiAoIiVnXG4iLCB0czhfcmVzdWx0LT5mMik7CisgIHByaW50ZiAoIiVnXG4iLCB0czhfcmVzdWx0LT5mMyk7CisgIHByaW50ZiAoIiVnXG4iLCB0czhfcmVzdWx0LT5mNCk7CisgIAorICBDSEVDSyh0czhfcmVzdWx0LT5mMSA9PSA1LjU1ZiArIDEpOworICBDSEVDSyh0czhfcmVzdWx0LT5mMiA9PSA1NS41ZiArIDEpOworICBDSEVDSyh0czhfcmVzdWx0LT5mMyA9PSAtNS41NWYgKyAxKTsKKyAgQ0hFQ0sodHM4X3Jlc3VsdC0+ZjQgPT0gLTU1LjVmICsgMSk7CisgIAorICBmcmVlICh0czhfcmVzdWx0KTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0OS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC9zdHJ1Y3Q5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwMDkxZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvc3RydWN0OS5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIEFyZWE6CWZmaV9jYWxsCisgICBQdXJwb3NlOglDaGVjayBzdHJ1Y3R1cmVzLgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCW5vbmUuCisgICBPcmlnaW5hdG9yOglGcm9tIHRoZSBvcmlnaW5hbCBmZml0ZXN0LmMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0LmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGZsb2F0IGY7CisgIGludCBpOworfSB0ZXN0X3N0cnVjdHVyZV85OworCitzdGF0aWMgdGVzdF9zdHJ1Y3R1cmVfOSBzdHJ1Y3Q5ICh0ZXN0X3N0cnVjdHVyZV85IHRzKQoreworICB0cy5mICs9IDE7CisgIHRzLmkgKz0gMTsKKworICByZXR1cm4gdHM7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgZmZpX3R5cGUgKmFyZ3NbTUFYX0FSR1NdOworICB2b2lkICp2YWx1ZXNbTUFYX0FSR1NdOworICBmZmlfdHlwZSB0czlfdHlwZTsKKyAgZmZpX3R5cGUgKnRzOV90eXBlX2VsZW1lbnRzWzNdOworICB0czlfdHlwZS5zaXplID0gMDsKKyAgdHM5X3R5cGUuYWxpZ25tZW50ID0gMDsKKyAgdHM5X3R5cGUudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKyAgdHM5X3R5cGUuZWxlbWVudHMgPSB0czlfdHlwZV9lbGVtZW50czsKKyAgdHM5X3R5cGVfZWxlbWVudHNbMF0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIHRzOV90eXBlX2VsZW1lbnRzWzFdID0gJmZmaV90eXBlX3NpbnQ7CisgIHRzOV90eXBlX2VsZW1lbnRzWzJdID0gTlVMTDsKKworICB0ZXN0X3N0cnVjdHVyZV85IHRzOV9hcmc7CisgIAorICAvKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBwcm9wZXJseSBhbGlnbmVkIHJlc3VsdCBidWZmZXIgKi8KKyAgdGVzdF9zdHJ1Y3R1cmVfOSAqdHM5X3Jlc3VsdCA9IAorICAgICh0ZXN0X3N0cnVjdHVyZV85ICopIG1hbGxvYyAoc2l6ZW9mKHRlc3Rfc3RydWN0dXJlXzkpKTsKKyAgCisgIGFyZ3NbMF0gPSAmdHM5X3R5cGU7CisgIHZhbHVlc1swXSA9ICZ0czlfYXJnOworICAKKyAgLyogSW5pdGlhbGl6ZSB0aGUgY2lmICovCisgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDEsICZ0czlfdHlwZSwgYXJncykgPT0gRkZJX09LKTsKKyAgCisgIHRzOV9hcmcuZiA9IDUuNTVmOworICB0czlfYXJnLmkgPSA1OworICAKKyAgcHJpbnRmICgiJWdcbiIsIHRzOV9hcmcuZik7CisgIHByaW50ZiAoIiVkXG4iLCB0czlfYXJnLmkpOworICAKKyAgZmZpX2NhbGwoJmNpZiwgRkZJX0ZOKHN0cnVjdDkpLCB0czlfcmVzdWx0LCB2YWx1ZXMpOworCisgIHByaW50ZiAoIiVnXG4iLCB0czlfcmVzdWx0LT5mKTsKKyAgcHJpbnRmICgiJWRcbiIsIHRzOV9yZXN1bHQtPmkpOworICAKKyAgQ0hFQ0sodHM5X3Jlc3VsdC0+ZiA9PSA1LjU1ZiArIDEpOworICBDSEVDSyh0czlfcmVzdWx0LT5pID09IDUgKyAxKTsKKworICBmcmVlICh0czlfcmVzdWx0KTsKKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdGVzdGNsb3N1cmUuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvdGVzdGNsb3N1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFjYzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuY2FsbC90ZXN0Y2xvc3VyZS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIEFyZWE6CWNsb3N1cmVfY2FsbAorICAgUHVycG9zZToJQ2hlY2sgcmV0dXJuIHZhbHVlIGZsb2F0LgorICAgTGltaXRhdGlvbnM6CW5vbmUuCisgICBQUjoJCTQxOTA4LgorICAgT3JpZ2luYXRvcjoJPHJmbUBnbnUub3JnPiAyMDA5MTEwMgkgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCB7CisgIGZsb2F0IGE7CisgIGZsb2F0IGI7CisgIGZsb2F0IGM7CisgIGZsb2F0IGQ7Cit9IGNsc19zdHJ1Y3RfY29tYmluZWQ7CisKK3ZvaWQgY2xzX3N0cnVjdF9jb21iaW5lZF9mbihzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCBhcmcpCit7CisgIHByaW50ZigiJWcgJWcgJWcgJWdcbiIsCisJIGFyZy5hLCBhcmcuYiwKKwkgYXJnLmMsIGFyZy5kKTsKKyAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitjbHNfc3RydWN0X2NvbWJpbmVkX2duKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwIF9fVU5VU0VEX18sCisgICAgICAgIHZvaWQqKiBhcmdzLCB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQoreworICBzdHJ1Y3QgY2xzX3N0cnVjdF9jb21iaW5lZCBhMDsKKworICBhMCA9ICooc3RydWN0IGNsc19zdHJ1Y3RfY29tYmluZWQqKShhcmdzWzBdKTsKKworICBjbHNfc3RydWN0X2NvbWJpbmVkX2ZuKGEwKTsKK30KKworCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNvZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhzaXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlKiBjbHNfc3RydWN0X2ZpZWxkczBbNV07CisgIGZmaV90eXBlIGNsc19zdHJ1Y3RfdHlwZTA7CisgIGZmaV90eXBlKiBkYmxfYXJnX3R5cGVzWzVdOworCisgIGNsc19zdHJ1Y3RfdHlwZTAuc2l6ZSA9IDA7CisgIGNsc19zdHJ1Y3RfdHlwZTAuYWxpZ25tZW50ID0gMDsKKyAgY2xzX3N0cnVjdF90eXBlMC50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICBjbHNfc3RydWN0X3R5cGUwLmVsZW1lbnRzID0gY2xzX3N0cnVjdF9maWVsZHMwOworCisgIHN0cnVjdCBjbHNfc3RydWN0X2NvbWJpbmVkIGdfZGJsID0gezQuMCwgNS4wLCAxLjAsIDguMH07CisKKyAgY2xzX3N0cnVjdF9maWVsZHMwWzBdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbHNfc3RydWN0X2ZpZWxkczBbMV0gPSAmZmZpX3R5cGVfZmxvYXQ7CisgIGNsc19zdHJ1Y3RfZmllbGRzMFsyXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgY2xzX3N0cnVjdF9maWVsZHMwWzNdID0gJmZmaV90eXBlX2Zsb2F0OworICBjbHNfc3RydWN0X2ZpZWxkczBbNF0gPSBOVUxMOworCisgIGRibF9hcmdfdHlwZXNbMF0gPSAmY2xzX3N0cnVjdF90eXBlMDsKKyAgZGJsX2FyZ190eXBlc1sxXSA9IE5VTEw7CisKKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMSwgJmZmaV90eXBlX3ZvaWQsCisJCSAgICAgZGJsX2FyZ190eXBlcykgPT0gRkZJX09LKTsKKworICBDSEVDSyhmZmlfcHJlcF9jbG9zdXJlX2xvYyhwY2wsICZjaWYsIGNsc19zdHJ1Y3RfY29tYmluZWRfZ24sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgKCh2b2lkKCopKGNsc19zdHJ1Y3RfY29tYmluZWQpKSAoY29kZSkpKGdfZGJsKTsKKyAgLyogeyBkZy1vdXRwdXQgIjQgNSAxIDgiIH0gKi8KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC9mZml0ZXN0Y3h4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmNTQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvZmZpdGVzdGN4eC5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSAiZmZpY29uZmlnLmgiCisKKyNkZWZpbmUgTUFYX0FSR1MgMjU2CisKKworLyogRGVmaW5lIF9fVU5VU0VEX18gdGhhdCBhbHNvIG90aGVyIGNvbXBpbGVycyB0aGFuIGdjYyBjYW4gcnVuIHRoZSB0ZXN0cy4gICovCisjdW5kZWYgX19VTlVTRURfXworI2lmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIF9fVU5VU0VEX18gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZWxzZQorI2RlZmluZSBfX1VOVVNFRF9fCisjZW5kaWYKKworI2RlZmluZSBDSEVDSyh4KSAoISh4KSA/IGFib3J0KCkgOiAodm9pZCkwKQorCisvKiBQcmVmZXIgTUFQX0FOT04oWU1PVVMpIHRvIC9kZXYvemVybywgc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGEKKyAgIGZpbGUgb3Blbi4gICovCisjaWZkZWYgSEFWRV9NTUFQX0FOT04KKyMgdW5kZWYgSEFWRV9NTUFQX0RFVl9aRVJPCisKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgaWZuZGVmIE1BUF9GQUlMRUQKKyMgIGRlZmluZSBNQVBfRkFJTEVEIC0xCisjIGVuZGlmCisjIGlmICFkZWZpbmVkIChNQVBfQU5PTllNT1VTKSAmJiBkZWZpbmVkIChNQVBfQU5PTikKKyMgIGRlZmluZSBNQVBfQU5PTllNT1VTIE1BUF9BTk9OCisjIGVuZGlmCisjIGRlZmluZSBVU0lOR19NTUFQCisKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9NTUFQX0RFVl9aRVJPCisKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgaWZuZGVmIE1BUF9GQUlMRUQKKyMgIGRlZmluZSBNQVBfRkFJTEVEIC0xCisjIGVuZGlmCisjIGRlZmluZSBVU0lOR19NTUFQCisKKyNlbmRpZgorCisKKy8qIE1pbkdXIGtsdWRnZS4gICovCisjaWZkZWYgX1dJTjY0CisjZGVmaW5lIFBSSWRMTCAiSTY0ZCIKKyNkZWZpbmUgUFJJdUxMICJJNjR1IgorI2Vsc2UKKyNkZWZpbmUgUFJJZExMICJsbGQiCisjZGVmaW5lIFBSSXVMTCAibGx1IgorI2VuZGlmCisKKyNpZmRlZiBVU0lOR19NTUFQCitzdGF0aWMgaW5saW5lIHZvaWQgKgorYWxsb2NhdGVfbW1hcCAoc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKnBhZ2U7CisjaWYgZGVmaW5lZCAoSEFWRV9NTUFQX0RFVl9aRVJPKQorICBzdGF0aWMgaW50IGRldl96ZXJvX2ZkID0gLTE7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTU1BUF9ERVZfWkVSTworICBpZiAoZGV2X3plcm9fZmQgPT0gLTEpCisgICAgeworICAgICAgZGV2X3plcm9fZmQgPSBvcGVuICgiL2Rldi96ZXJvIiwgT19SRE9OTFkpOworICAgICAgaWYgKGRldl96ZXJvX2ZkID09IC0xKQorCXsKKwkgIHBlcnJvciAoIm9wZW4gL2Rldi96ZXJvOiAlbSIpOworCSAgZXhpdCAoMSk7CisJfQorICAgIH0KKyNlbmRpZgorCisKKyNpZmRlZiBIQVZFX01NQVBfQU5PTgorICBwYWdlID0gbW1hcCAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKwkgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX01NQVBfREVWX1pFUk8KKyAgcGFnZSA9IG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCisJICAgICAgIE1BUF9QUklWQVRFLCBkZXZfemVyb19mZCwgMCk7CisjZW5kaWYKKworICBpZiAocGFnZSA9PSAoY2hhciAqKSBNQVBfRkFJTEVEKQorICAgIHsKKyAgICAgIHBlcnJvciAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiBwYWdlOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvc3BlY2lhbC5leHAgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjcxYjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3NwZWNpYWwuZXhwCkBAIC0wLDAgKzEsMzUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisjIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworZGctaW5pdAorbGliZmZpLWluaXQKKworZ2xvYmFsIHNyY2RpciBzdWJkaXIKKworZ2xvYmFsIGN4eF9vcHRpb25zCisKK3NldCBjeHhfb3B0aW9ucyAiIC1zaGFyZWQtbGliZ2NjIC1sc3RkYysrIgorCitkZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5jY11dICRjeHhfb3B0aW9ucyAiLU8wIC1XIC1XYWxsIgorZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyouY2NdXSAkY3h4X29wdGlvbnMgIi1PMiIKK2RnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLmNjXV0gJGN4eF9vcHRpb25zICItTzMiCitkZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5jY11dICRjeHhfb3B0aW9ucyAiLU9zIgorCitkZy1maW5pc2gKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIHRjbC1pbmRlbnQtbGV2ZWw6NAorIyBFbmQ6CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmZmQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXN0c3VpdGUvbGliZmZpLnNwZWNpYWwvdW53aW5kdGVzdC5jYwpAQCAtMCwwICsxLDEyNCBAQAorLyogQXJlYToJZmZpX2Nsb3N1cmUsIHVud2luZCBpbmZvCisgICBQdXJwb3NlOglDaGVjayBpZiB0aGUgdW53aW5kIGluZm9ybWF0aW9uIGlzIHBhc3NlZCBjb3JyZWN0bHkuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUplZmYgU3R1cm0gPGpzdHVybUBvbmUtcG9pbnQuY29tPiAgKi8KKworLyogeyBkZy1kbyBydW4gfSAqLworI2luY2x1ZGUgImZmaXRlc3RjeHguaCIKKworI2lmIGRlZmluZWQgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKwordm9pZAorY2xvc3VyZV90ZXN0X2ZuKGZmaV9jaWYqIGNpZiBfX1VOVVNFRF9fLCB2b2lkKiByZXNwIF9fVU5VU0VEX18sCisJCXZvaWQqKiBhcmdzIF9fVU5VU0VEX18sIHZvaWQqIHVzZXJkYXRhIF9fVU5VU0VEX18pCit7CisgIHRocm93IDk7Cit9CisKK3R5cGVkZWYgdm9pZCAoKmNsb3N1cmVfdGVzdF90eXBlKSgpOworCit2b2lkIGNsb3N1cmVfdGVzdF9mbjEoZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJlc3AsCisJCSAgICAgIHZvaWQqKiBhcmdzLCB2b2lkKiB1c2VyZGF0YSBfX1VOVVNFRF9fKQorIHsKKyAgICAqKGZmaV9hcmcqKXJlc3AgPQorICAgICAgKGludCkqKGZsb2F0ICopYXJnc1swXSArKGludCkoKihmbG9hdCAqKWFyZ3NbMV0pICsKKyAgICAgIChpbnQpKCooZmxvYXQgKilhcmdzWzJdKSArIChpbnQpKihmbG9hdCAqKWFyZ3NbM10gKworICAgICAgKGludCkoKihzaWduZWQgc2hvcnQgKilhcmdzWzRdKSArIChpbnQpKCooZmxvYXQgKilhcmdzWzVdKSArCisgICAgICAoaW50KSooZmxvYXQgKilhcmdzWzZdICsgKGludCkoKihpbnQgKilhcmdzWzddKSArCisgICAgICAoaW50KSgqKGRvdWJsZSopYXJnc1s4XSkgKyAoaW50KSooaW50ICopYXJnc1s5XSArCisgICAgICAoaW50KSgqKGludCAqKWFyZ3NbMTBdKSArIChpbnQpKCooZmxvYXQgKilhcmdzWzExXSkgKworICAgICAgKGludCkqKGludCAqKWFyZ3NbMTJdICsgKGludCkoKihpbnQgKilhcmdzWzEzXSkgKworICAgICAgKGludCkoKihpbnQgKilhcmdzWzE0XSkgKyAqKGludCAqKWFyZ3NbMTVdICsgKGludCkoaW50cHRyX3QpdXNlcmRhdGE7CisKKyAgICBwcmludGYoIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkOiAlZFxuIiwKKwkgICAoaW50KSooZmxvYXQgKilhcmdzWzBdLCAoaW50KSgqKGZsb2F0ICopYXJnc1sxXSksCisJICAgKGludCkoKihmbG9hdCAqKWFyZ3NbMl0pLCAoaW50KSooZmxvYXQgKilhcmdzWzNdLAorCSAgIChpbnQpKCooc2lnbmVkIHNob3J0ICopYXJnc1s0XSksIChpbnQpKCooZmxvYXQgKilhcmdzWzVdKSwKKwkgICAoaW50KSooZmxvYXQgKilhcmdzWzZdLCAoaW50KSgqKGludCAqKWFyZ3NbN10pLAorCSAgIChpbnQpKCooZG91YmxlICopYXJnc1s4XSksIChpbnQpKihpbnQgKilhcmdzWzldLAorCSAgIChpbnQpKCooaW50ICopYXJnc1sxMF0pLCAoaW50KSgqKGZsb2F0ICopYXJnc1sxMV0pLAorCSAgIChpbnQpKihpbnQgKilhcmdzWzEyXSwgKGludCkoKihpbnQgKilhcmdzWzEzXSksCisJICAgKGludCkoKihpbnQgKilhcmdzWzE0XSksICooaW50ICopYXJnc1sxNV0sCisJICAgKGludCkoaW50cHRyX3QpdXNlcmRhdGEsIChpbnQpKihmZmlfYXJnKilyZXNwKTsKKworICAgIHRocm93IChpbnQpKihmZmlfYXJnKilyZXNwOworfQorCit0eXBlZGVmIGludCAoKmNsb3N1cmVfdGVzdF90eXBlMSkoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIHNpZ25lZCBzaG9ydCwKKwkJCQkgIGZsb2F0LCBmbG9hdCwgaW50LCBkb3VibGUsIGludCwgaW50LCBmbG9hdCwKKwkJCQkgIGludCwgaW50LCBpbnQsIGludCk7CisKK2ludCBtYWluICh2b2lkKQoreworICBmZmlfY2lmIGNpZjsKKyAgdm9pZCAqY29kZTsKKyAgZmZpX2Nsb3N1cmUgKnBjbCA9IChmZmlfY2xvc3VyZSAqKWZmaV9jbG9zdXJlX2FsbG9jKHNpemVvZihmZmlfY2xvc3VyZSksICZjb2RlKTsKKyAgZmZpX3R5cGUgKiBjbF9hcmdfdHlwZXNbMTddOworCisgIHsKKyAgICBjbF9hcmdfdHlwZXNbMV0gPSBOVUxMOworCisgICAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMCwKKwkJICAgICAgICZmZmlfdHlwZV92b2lkLCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisgICAgQ0hFQ0soZmZpX3ByZXBfY2xvc3VyZV9sb2MocGNsLCAmY2lmLCBjbG9zdXJlX3Rlc3RfZm4sIE5VTEwsIGNvZGUpID09IEZGSV9PSyk7CisKKyAgICB0cnkKKyAgICAgIHsKKwkoKigoY2xvc3VyZV90ZXN0X3R5cGUpKGNvZGUpKSkoKTsKKyAgICAgIH0gY2F0Y2ggKGludCBleGNlcHRpb25fY29kZSkKKyAgICAgIHsKKwlDSEVDSyhleGNlcHRpb25fY29kZSA9PSA5KTsKKyAgICAgIH0KKworICAgIHByaW50ZigicGFydCBvbmUgT0tcbiIpOworICAgIC8qIHsgZGctb3V0cHV0ICJwYXJ0IG9uZSBPSyIgfSAqLworICAgIH0KKworICAgIHsKKworICAgICAgY2xfYXJnX3R5cGVzWzBdID0gJmZmaV90eXBlX2Zsb2F0OworICAgICAgY2xfYXJnX3R5cGVzWzFdID0gJmZmaV90eXBlX2Zsb2F0OworICAgICAgY2xfYXJnX3R5cGVzWzJdID0gJmZmaV90eXBlX2Zsb2F0OworICAgICAgY2xfYXJnX3R5cGVzWzNdID0gJmZmaV90eXBlX2Zsb2F0OworICAgICAgY2xfYXJnX3R5cGVzWzRdID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgICAgIGNsX2FyZ190eXBlc1s1XSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgICAgIGNsX2FyZ190eXBlc1s2XSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgICAgIGNsX2FyZ190eXBlc1s3XSA9ICZmZmlfdHlwZV91aW50OworICAgICAgY2xfYXJnX3R5cGVzWzhdID0gJmZmaV90eXBlX2RvdWJsZTsKKyAgICAgIGNsX2FyZ190eXBlc1s5XSA9ICZmZmlfdHlwZV91aW50OworICAgICAgY2xfYXJnX3R5cGVzWzEwXSA9ICZmZmlfdHlwZV91aW50OworICAgICAgY2xfYXJnX3R5cGVzWzExXSA9ICZmZmlfdHlwZV9mbG9hdDsKKyAgICAgIGNsX2FyZ190eXBlc1sxMl0gPSAmZmZpX3R5cGVfdWludDsKKyAgICAgIGNsX2FyZ190eXBlc1sxM10gPSAmZmZpX3R5cGVfdWludDsKKyAgICAgIGNsX2FyZ190eXBlc1sxNF0gPSAmZmZpX3R5cGVfdWludDsKKyAgICAgIGNsX2FyZ190eXBlc1sxNV0gPSAmZmZpX3R5cGVfdWludDsKKyAgICAgIGNsX2FyZ190eXBlc1sxNl0gPSBOVUxMOworCisgICAgICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgICAgIENIRUNLKGZmaV9wcmVwX2NpZigmY2lmLCBGRklfREVGQVVMVF9BQkksIDE2LAorCQkJICZmZmlfdHlwZV9zaW50LCBjbF9hcmdfdHlwZXMpID09IEZGSV9PSyk7CisKKyAgICAgIENIRUNLKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xvc3VyZV90ZXN0X2ZuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIDMgLyogdXNlcmRhdGEgKi8sIGNvZGUpICA9PSBGRklfT0spOworICAgICAgdHJ5CisJeworCSAgKCooKGNsb3N1cmVfdGVzdF90eXBlMSljb2RlKSkKKwkgICAgKDEuMSwgMi4yLCAzLjMsIDQuNCwgMTI3LCA1LjUsIDYuNiwgOCwgOSwgMTAsIDExLCAxMi4wLCAxMywKKwkgICAgIDE5LCAyMSwgMSk7CisJICAvKiB7IGRnLW91dHB1dCAiXG4xIDIgMyA0IDEyNyA1IDYgOCA5IDEwIDExIDEyIDEzIDE5IDIxIDEgMzogMjU1IiB9ICovCisJfSBjYXRjaCAoaW50IGV4Y2VwdGlvbl9jb2RlKQorCXsKKwkgIENIRUNLKGV4Y2VwdGlvbl9jb2RlID09IDI1NSk7CisJfQorICAgICAgcHJpbnRmKCJwYXJ0IHR3byBPS1xuIik7CisgICAgICAvKiB7IGRnLW91dHB1dCAiXG5wYXJ0IHR3byBPSyIgfSAqLworICAgIH0KKyAgICBleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0X2ZmaV9jYWxsLmNjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvbGliZmZpL3Rlc3RzdWl0ZS9saWJmZmkuc3BlY2lhbC91bndpbmR0ZXN0X2ZmaV9jYWxsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NzM5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGVzdHN1aXRlL2xpYmZmaS5zcGVjaWFsL3Vud2luZHRlc3RfZmZpX2NhbGwuY2MKQEAgLTAsMCArMSw1MyBAQAorLyogQXJlYToJZmZpX2NhbGwsIHVud2luZCBpbmZvCisgICBQdXJwb3NlOglDaGVjayBpZiB0aGUgdW53aW5kIGluZm9ybWF0aW9uIGlzIHBhc3NlZCBjb3JyZWN0bHkuCisgICBMaW1pdGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6CUFuZHJlYXMgVG9ibGVyIDxhbmRyZWFzdEBnY2MuZ251Lm9yZz4gMjAwNjEyMTMgICovCisKKy8qIHsgZGctZG8gcnVuIH0gKi8KKyNpbmNsdWRlICJmZml0ZXN0Y3h4LmgiCisKK3N0YXRpYyBpbnQgY2hlY2tpbmcoaW50IGEgX19VTlVTRURfXywgc2hvcnQgYiBfX1VOVVNFRF9fLAorCQkgICAgc2lnbmVkIGNoYXIgYyBfX1VOVVNFRF9fKQoreworICB0aHJvdyA5OworfQorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIGZmaV90eXBlICphcmdzW01BWF9BUkdTXTsKKyAgdm9pZCAqdmFsdWVzW01BWF9BUkdTXTsKKyAgZmZpX2FyZyByaW50OworCisgIHNpZ25lZCBpbnQgc2k7CisgIHNpZ25lZCBzaG9ydCBzczsKKyAgc2lnbmVkIGNoYXIgc2M7CisKKyAgYXJnc1swXSA9ICZmZmlfdHlwZV9zaW50OworICB2YWx1ZXNbMF0gPSAmc2k7CisgIGFyZ3NbMV0gPSAmZmZpX3R5cGVfc3Nob3J0OworICB2YWx1ZXNbMV0gPSAmc3M7CisgIGFyZ3NbMl0gPSAmZmZpX3R5cGVfc2NoYXI7CisgIHZhbHVlc1syXSA9ICZzYzsKKworICAvKiBJbml0aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYsIEZGSV9ERUZBVUxUX0FCSSwgMywKKwkJICAgICAmZmZpX3R5cGVfc2ludCwgYXJncykgPT0gRkZJX09LKTsKKworICBzaSA9IC02OworICBzcyA9IC0xMjsKKyAgc2MgPSAtMTsKKyAgeworICAgIHRyeQorICAgICAgeworCWZmaV9jYWxsKCZjaWYsIEZGSV9GTihjaGVja2luZyksICZyaW50LCB2YWx1ZXMpOworICAgICAgfSBjYXRjaCAoaW50IGV4Y2VwdGlvbl9jb2RlKQorICAgICAgeworCUNIRUNLKGV4Y2VwdGlvbl9jb2RlID09IDkpOworICAgICAgfQorICAgIHByaW50ZigicGFydCBvbmUgT0tcbiIpOworICAgIC8qIHsgZGctb3V0cHV0ICJwYXJ0IG9uZSBPSyIgfSAqLworICB9CisgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGV4aW5mby50ZXggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9saWJmZmkvdGV4aW5mby50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyYzQwNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL2xpYmZmaS90ZXhpbmZvLnRleApAQCAtMCwwICsxLDcyMTAgQEAKKyUgdGV4aW5mby50ZXggLS0gVGVYIG1hY3JvcyB0byBoYW5kbGUgVGV4aW5mbyBmaWxlcy4KKyUKKyUgTG9hZCBwbGFpbiBpZiBuZWNlc3NhcnksIGkuZS4sIGlmIHJ1bm5pbmcgdW5kZXIgaW5pdGV4LgorXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgZm10bmFtZVxlbmRjc25hbWVccmVsYXhcaW5wdXQgcGxhaW5cZmkKKyUKK1xkZWZcdGV4aW5mb3ZlcnNpb257MjAwNS0wNy0wNS4xOX0KKyUKKyUgQ29weXJpZ2h0IChDKSAxOTg1LCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LAorJSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUKKyUgRm91bmRhdGlvbiwgSW5jLgorJQorJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCislIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCislIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyUgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorJQorJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCislIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyUgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorJQorJSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorJSBhbG9uZyB3aXRoIHRoaXMgdGV4aW5mby50ZXggZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCislIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCislIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorJQorJSBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyByZWFkIGJ5IFRlWCB3aGVuIHByb2Nlc3NpbmcKKyUgYSBUZXhpbmZvIHNvdXJjZSBkb2N1bWVudCwgeW91IG1heSB1c2UgdGhlIHJlc3VsdCB3aXRob3V0CislIHJlc3RyaWN0aW9uLiAgKFRoaXMgaGFzIGJlZW4gb3VyIGludGVudCBzaW5jZSBUZXhpbmZvIHdhcyBpbnZlbnRlZC4pCislCislIFBsZWFzZSB0cnkgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRleGluZm8udGV4IGJlZm9yZSBzdWJtaXR0aW5nIGJ1ZworJSByZXBvcnRzOyB5b3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbToKKyUgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGV4aW5mby8gKHRoZSBUZXhpbmZvIGhvbWUgcGFnZSksIG9yCislICAgZnRwOi8vdHVnLm9yZy90ZXgvdGV4aW5mby50ZXgKKyUgICAgIChhbmQgYWxsIENUQU4gbWlycm9ycywgc2VlIGh0dHA6Ly93d3cuY3Rhbi5vcmcpLgorJSBUaGUgdGV4aW5mby50ZXggaW4gYW55IGdpdmVuIGRpc3RyaWJ1dGlvbiBjb3VsZCB3ZWxsIGJlIG91dAorJSBvZiBkYXRlLCBzbyBpZiB0aGF0J3Mgd2hhdCB5b3UncmUgdXNpbmcsIHBsZWFzZSBjaGVjay4KKyUKKyUgU2VuZCBidWcgcmVwb3J0cyB0byBidWctdGV4aW5mb0BnbnUub3JnLiAgUGxlYXNlIGluY2x1ZGUgaW5jbHVkaW5nIGEKKyUgY29tcGxldGUgZG9jdW1lbnQgaW4gZWFjaCBidWcgcmVwb3J0IHdpdGggd2hpY2ggd2UgY2FuIHJlcHJvZHVjZSB0aGUKKyUgcHJvYmxlbS4gIFBhdGNoZXMgYXJlLCBvZiBjb3Vyc2UsIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCislCislIFRvIHByb2Nlc3MgYSBUZXhpbmZvIG1hbnVhbCB3aXRoIFRlWCwgaXQncyBtb3N0IHJlbGlhYmxlIHRvIHVzZSB0aGUKKyUgdGV4aTJkdmkgc2hlbGwgc2NyaXB0IHRoYXQgY29tZXMgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgRm9yIGEgc2ltcGxlCislIG1hbnVhbCBmb28udGV4aSwgaG93ZXZlciwgeW91IGNhbiBnZXQgYXdheSB3aXRoIHRoaXM6CislICAgdGV4IGZvby50ZXhpCislICAgdGV4aW5kZXggZm9vLj8/CislICAgdGV4IGZvby50ZXhpCislICAgdGV4IGZvby50ZXhpCislICAgZHZpcHMgZm9vLmR2aSAtbyAgIyBvciB3aGF0ZXZlcjsgdGhpcyBtYWtlcyBmb28ucHMuCislIFRoZSBleHRyYSBUZVggcnVucyBnZXQgdGhlIGNyb3NzLXJlZmVyZW5jZSBpbmZvcm1hdGlvbiBjb3JyZWN0LgorJSBTb21ldGltZXMgb25lIHJ1biBhZnRlciB0ZXhpbmRleCBzdWZmaWNlcywgYW5kIHNvbWV0aW1lcyB5b3UgbmVlZCBtb3JlCislIHRoYW4gdHdvOyB0ZXhpMmR2aSBkb2VzIGl0IGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5LgorJQorJSBJdCBpcyBwb3NzaWJsZSB0byBhZGFwdCB0ZXhpbmZvLnRleCBmb3Igb3RoZXIgbGFuZ3VhZ2VzLCB0byBzb21lCislIGV4dGVudC4gIFlvdSBjYW4gZ2V0IHRoZSBleGlzdGluZyBsYW5ndWFnZS1zcGVjaWZpYyBmaWxlcyBmcm9tIHRoZQorJSBmdWxsIFRleGluZm8gZGlzdHJpYnV0aW9uLgorJQorJSBUaGUgR05VIFRleGluZm8gaG9tZSBwYWdlIGlzIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXhpbmZvLgorCisKK1xtZXNzYWdle0xvYWRpbmcgdGV4aW5mbyBbdmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dOn0KKworJSBJZiBpbiBhIC5mbXQgZmlsZSwgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyCislIGFuZCB0dXJuIG9uIGFjdGl2ZSBjaGFyYWN0ZXJzIHRoYXQgd2UgY291bGRuJ3QgZG8gZWFybGllciBiZWNhdXNlCislIHRoZXkgbWlnaHQgaGF2ZSBhcHBlYXJlZCBpbiB0aGUgaW5wdXQgZmlsZSBuYW1lLgorXGV2ZXJ5am9ie1xtZXNzYWdle1tUZXhpbmZvIHZlcnNpb24gXHRleGluZm92ZXJzaW9uXX0lCisgIFxjYXRjb2RlYCs9XGFjdGl2ZSBcY2F0Y29kZWBcXz1cYWN0aXZlfQorCitcbWVzc2FnZXtCYXNpY3MsfQorXGNoYXJkZWZcb3RoZXI9MTIKKworJSBXZSBuZXZlciB3YW50IHBsYWluJ3MgXG91dGVyIGRlZmluaXRpb24gb2YgXCsgaW4gVGV4aW5mby4KKyUgRm9yIEB0ZXgsIHdlIGNhbiB1c2UgXHRhYmFsaWduLgorXGxldFwrID0gXHJlbGF4CisKKyUgU2F2ZSBzb21lIHBsYWluIHRleCBtYWNyb3Mgd2hvc2UgbmFtZXMgd2Ugd2lsbCByZWRlZmluZS4KK1xsZXRccHRleGI9XGIKK1xsZXRccHRleGJ1bGxldD1cYnVsbGV0CitcbGV0XHB0ZXhjPVxjCitcbGV0XHB0ZXhjb21tYT1cLAorXGxldFxwdGV4ZG90PVwuCitcbGV0XHB0ZXhkb3RzPVxkb3RzCitcbGV0XHB0ZXhlbmQ9XGVuZAorXGxldFxwdGV4ZXF1aXY9XGVxdWl2CitcbGV0XHB0ZXhleGNsYW09XCEKK1xsZXRccHRleGZvb3Rub3RlPVxmb290bm90ZQorXGxldFxwdGV4Z3RyPT4KK1xsZXRccHRleGhhdD1eCitcbGV0XHB0ZXhpPVxpCitcbGV0XHB0ZXhpbmRlbnQ9XGluZGVudAorXGxldFxwdGV4aW5zZXJ0PVxpbnNlcnQKK1xsZXRccHRleGxicmFjZT1ceworXGxldFxwdGV4bGVzcz08CitcbGV0XHB0ZXhuZXd3cml0ZVxuZXd3cml0ZQorXGxldFxwdGV4bm9pbmRlbnQ9XG5vaW5kZW50CitcbGV0XHB0ZXhwbHVzPSsKK1xsZXRccHRleHJicmFjZT1cfQorXGxldFxwdGV4c2xhc2g9XC8KK1xsZXRccHRleHN0YXI9XCoKK1xsZXRccHRleHQ9XHQKKworJSBJZiB0aGlzIGNoYXJhY3RlciBhcHBlYXJzIGluIGFuIGVycm9yIG1lc3NhZ2Ugb3IgaGVscCBzdHJpbmcsIGl0CislIHN0YXJ0cyBhIG5ldyBsaW5lIGluIHRoZSBvdXRwdXQuCitcbmV3bGluZWNoYXIgPSBgXl5KCisKKyUgVXNlIFRlWCAzLjAncyBcaW5wdXRsaW5lbm8gdG8gZ2V0IHRoZSBsaW5lIG51bWJlciwgZm9yIGJldHRlciBlcnJvcgorJSBtZXNzYWdlcywgYnV0IGlmIHdlJ3JlIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mIFRlWCwgZG9uJ3QgZG8gYW55dGhpbmcuCislCitcaWZ4XGlucHV0bGluZW5vXHRoaXNpc3VuZGVmaW5lZAorICBcbGV0XGxpbmVudW1iZXIgPSBcZW1wdHkgJSBQcmUtMy4wLgorXGVsc2UKKyAgXGRlZlxsaW5lbnVtYmVye2wuXHRoZVxpbnB1dGxpbmVubzpcc3BhY2V9CitcZmkKKworJSBTZXQgdXAgZml4ZWQgd29yZHMgZm9yIEVuZ2xpc2ggaWYgbm90IGFscmVhZHkgc2V0LgorXGlmeFxwdXR3b3JkQXBwZW5kaXhcdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkQXBwZW5kaXh7QXBwZW5kaXh9XGZpCitcaWZ4XHB1dHdvcmRDaGFwdGVyXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmRDaGFwdGVye0NoYXB0ZXJ9XGZpCitcaWZ4XHB1dHdvcmRmaWxlXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRmaWxle2ZpbGV9XGZpCitcaWZ4XHB1dHdvcmRpblx1bmRlZmluZWQgICAgICAgIFxnZGVmXHB1dHdvcmRpbntpbn1cZmkKK1xpZnhccHV0d29yZEluZGV4SXNFbXB0eVx1bmRlZmluZWQgICAgIFxnZGVmXHB1dHdvcmRJbmRleElzRW1wdHl7KEluZGV4IGlzIGVtcHR5KX1cZmkKK1xpZnhccHV0d29yZEluZGV4Tm9uZXhpc3RlbnRcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRJbmRleE5vbmV4aXN0ZW50eyhJbmRleCBpcyBub25leGlzdGVudCl9XGZpCitcaWZ4XHB1dHdvcmRJbmZvXHVuZGVmaW5lZCAgICAgIFxnZGVmXHB1dHdvcmRJbmZve0luZm99XGZpCitcaWZ4XHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2ZcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2Z7SW5zdGFuY2UgVmFyaWFibGUgb2Z9XGZpCitcaWZ4XHB1dHdvcmRNZXRob2Rvblx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRNZXRob2RvbntNZXRob2Qgb259XGZpCitcaWZ4XHB1dHdvcmROb1RpdGxlXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmROb1RpdGxle05vIFRpdGxlfVxmaQorXGlmeFxwdXR3b3Jkb2ZcdW5kZWZpbmVkICAgICAgICBcZ2RlZlxwdXR3b3Jkb2Z7b2Z9XGZpCitcaWZ4XHB1dHdvcmRvblx1bmRlZmluZWQgICAgICAgIFxnZGVmXHB1dHdvcmRvbntvbn1cZmkKK1xpZnhccHV0d29yZHBhZ2VcdW5kZWZpbmVkICAgICAgXGdkZWZccHV0d29yZHBhZ2V7cGFnZX1cZmkKK1xpZnhccHV0d29yZHNlY3Rpb25cdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZHNlY3Rpb257c2VjdGlvbn1cZmkKK1xpZnhccHV0d29yZFNlY3Rpb25cdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZFNlY3Rpb257U2VjdGlvbn1cZmkKK1xpZnhccHV0d29yZHNlZVx1bmRlZmluZWQgICAgICAgXGdkZWZccHV0d29yZHNlZXtzZWV9XGZpCitcaWZ4XHB1dHdvcmRTZWVcdW5kZWZpbmVkICAgICAgIFxnZGVmXHB1dHdvcmRTZWV7U2VlfVxmaQorXGlmeFxwdXR3b3JkU2hvcnRUT0NcdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkU2hvcnRUT0N7U2hvcnQgQ29udGVudHN9XGZpCitcaWZ4XHB1dHdvcmRUT0NcdW5kZWZpbmVkICAgICAgIFxnZGVmXHB1dHdvcmRUT0N7VGFibGUgb2YgQ29udGVudHN9XGZpCislCitcaWZ4XHB1dHdvcmRNSmFuXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUphbntKYW51YXJ5fVxmaQorXGlmeFxwdXR3b3JkTUZlYlx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1GZWJ7RmVicnVhcnl9XGZpCitcaWZ4XHB1dHdvcmRNTWFyXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTU1hcntNYXJjaH1cZmkKK1xpZnhccHV0d29yZE1BcHJcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNQXBye0FwcmlsfVxmaQorXGlmeFxwdXR3b3JkTU1heVx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1NYXl7TWF5fVxmaQorXGlmeFxwdXR3b3JkTUp1blx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1KdW57SnVuZX1cZmkKK1xpZnhccHV0d29yZE1KdWxcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNSnVse0p1bHl9XGZpCitcaWZ4XHB1dHdvcmRNQXVnXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUF1Z3tBdWd1c3R9XGZpCitcaWZ4XHB1dHdvcmRNU2VwXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTVNlcHtTZXB0ZW1iZXJ9XGZpCitcaWZ4XHB1dHdvcmRNT2N0XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTU9jdHtPY3RvYmVyfVxmaQorXGlmeFxwdXR3b3JkTU5vdlx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1Ob3Z7Tm92ZW1iZXJ9XGZpCitcaWZ4XHB1dHdvcmRNRGVjXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTURlY3tEZWNlbWJlcn1cZmkKKyUKK1xpZnhccHV0d29yZERlZm1hY1x1bmRlZmluZWQgICAgXGdkZWZccHV0d29yZERlZm1hY3tNYWNyb31cZmkKK1xpZnhccHV0d29yZERlZnNwZWNcdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZERlZnNwZWN7U3BlY2lhbCBGb3JtfVxmaQorXGlmeFxwdXR3b3JkRGVmdmFyXHVuZGVmaW5lZCAgICBcZ2RlZlxwdXR3b3JkRGVmdmFye1ZhcmlhYmxlfVxmaQorXGlmeFxwdXR3b3JkRGVmb3B0XHVuZGVmaW5lZCAgICBcZ2RlZlxwdXR3b3JkRGVmb3B0e1VzZXIgT3B0aW9ufVxmaQorXGlmeFxwdXR3b3JkRGVmZnVuY1x1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkRGVmZnVuY3tGdW5jdGlvbn1cZmkKKworJSBJbiBzb21lIG1hY3Jvcywgd2UgY2Fubm90IHVzZSB0aGUgYFw/IG5vdGF0aW9uLS0tdGhlIGxlZnQgcXVvdGUgaXMKKyUgaW4gc29tZSBjYXNlcyB0aGUgZXNjYXBlIGNoYXIuCitcY2hhcmRlZlxiYWNrQ2hhciAgPSBgXFwKK1xjaGFyZGVmXGNvbG9uQ2hhciA9IGBcOgorXGNoYXJkZWZcY29tbWFDaGFyID0gYFwsCitcY2hhcmRlZlxkb3RDaGFyICAgPSBgXC4KK1xjaGFyZGVmXGV4Y2xhbUNoYXI9IGBcIQorXGNoYXJkZWZccGx1c0NoYXIgID0gYFwrCitcY2hhcmRlZlxxdWVzdENoYXIgPSBgXD8KK1xjaGFyZGVmXHNlbWlDaGFyICA9IGBcOworXGNoYXJkZWZcdW5kZXJDaGFyID0gYFxfCisKK1xjaGFyZGVmXHNwYWNlQ2hhciA9IGBcICUKK1xjaGFyZGVmXHNwYWNlY2F0ID0gMTAKK1xkZWZcc3BhY2Vpc3NwYWNle1xjYXRjb2RlXHNwYWNlQ2hhcj1cc3BhY2VjYXR9CisKK3slIGZvciBoZWxwIHdpdGggZGVidWdnaW5nLgorICUgZXhhbXBsZSB1c2FnZTogXGV4cGFuZGFmdGVyXHNob3dcYWN0aXZlYmFja3NsYXNoCisgXGNhdGNvZGVgXCEgPSAwIFxjYXRjb2RlYFxcID0gXGFjdGl2ZQorICFnbG9iYWwhZGVmIWFjdGl2ZWJhY2tzbGFzaHtcfQorfQorCislIElnbm9yZSBhIHRva2VuLgorJQorXGRlZlxnb2JibGUjMXt9CisKKyUgVGhlIGZvbGxvd2luZyBpcyB1c2VkIGluc2lkZSBzZXZlcmFsIFxlZGVmJ3MuCitcZGVmXG1ha2Vjc25hbWUjMXtcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lIzFcZW5kY3NuYW1lfQorCislIEh5cGhlbmF0aW9uIGZpeGVzLgorXGh5cGhlbmF0aW9ueworICBGbG9yLWktZGEgR2hvc3Qtc2NyaXB0IEdob3N0LXZpZXcgTWFjLU9TIFBvc3QtU2NyaXB0CisgIGFwLXBlbi1kaXggYml0LW1hcCBiaXQtbWFwcworICBkYXRhLWJhc2UgZGF0YS1iYXNlcyBlc2hlbGwgZmFsbC1pbmcgaGFsZi13YXkgbG9uZy1lc3QgbWFuLXUtc2NyaXB0CisgIG1hbi11LXNjcmlwdHMgbWluaS1idWYtZmVyIG1pbmktYnVmLWZlcnMgb3Zlci12aWV3IHBhci1hLWRpZ20KKyAgcGFyLWEtZGlnbXMgcmF0aC1lciByZWMtdGFuLWd1LWxhciByby1ib3QtaWNzIHNlLXZlcmUtbHkgc2V0LXVwIHNwYS1jZXMKKyAgc3BlbGwtaW5nIHNwZWxsLWluZ3MKKyAgc3RhbmQtYWxvbmUgc3Ryb25nLWVzdCB0aW1lLXN0YW1wIHRpbWUtc3RhbXBzIHdoaWNoLWV2ZXIgd2hpdGUtc3BhY2UKKyAgd2lkZS1zcHJlYWQgd3JhcC1hcm91bmQKK30KKworJSBNYXJnaW4gdG8gYWRkIHRvIHJpZ2h0IG9mIGV2ZW4gcGFnZXMsIHRvIGxlZnQgb2Ygb2RkIHBhZ2VzLgorXG5ld2RpbWVuXGJpbmRpbmdvZmZzZXQKK1xuZXdkaW1lblxub3JtYWxvZmZzZXQKK1xuZXdkaW1lblxwYWdld2lkdGggXG5ld2RpbWVuXHBhZ2VoZWlnaHQKKworJSBGb3IgYSBmaW5hbCBjb3B5LCB0YWtlIG91dCB0aGUgcmVjdGFuZ2xlcworJSB0aGF0IG1hcmsgb3ZlcmZ1bGwgYm94ZXMgKGluIGNhc2UgeW91IGhhdmUgZGVjaWRlZAorJSB0aGF0IHRoZSB0ZXh0IGxvb2tzIG9rIGV2ZW4gdGhvdWdoIGl0IHBhc3NlcyB0aGUgbWFyZ2luKS4KKyUKK1xkZWZcZmluYWxvdXR7XG92ZXJmdWxscnVsZT0wcHR9CisKKyUgQHwgaW5zZXJ0cyBhIGNoYW5nZWJhciB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBsaW5lLiAgSXQgc2hvdWxkCislIHN1cnJvdW5kIGFueSBjaGFuZ2VkIHRleHQuICBUaGlzIGFwcHJvYWNoIGRvZXMgKm5vdCogd29yayBpZiB0aGUKKyUgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiB0d28gbGluZXMgb2Ygb3V0cHV0LiAgVG8gaGFuZGxlIHRoYXQsIHdlIHdvdWxkCislIGhhdmUgYWRvcHQgYSBtdWNoIG1vcmUgZGlmZmljdWx0IGFwcHJvYWNoIChwdXR0aW5nIG1hcmtzIGludG8gdGhlIG1haW4KKyUgdmVydGljYWwgbGlzdCBmb3IgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggY2hhbmdlKS4KKyUKK1xkZWZcfHslCisgICUgXHZhZGp1c3QgY2FuIG9ubHkgYmUgdXNlZCBpbiBob3Jpem9udGFsIG1vZGUuCisgIFxsZWF2ZXZtb2RlCisgICUKKyAgJSBBcHBlbmQgdGhpcyB2ZXJ0aWNhbCBtb2RlIG1hdGVyaWFsIGFmdGVyIHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIG91dHB1dC4KKyAgXHZhZGp1c3R7JQorICAgICUgV2Ugd2FudCB0byBpbnNlcnQgYSBydWxlIHdpdGggdGhlIGhlaWdodCBhbmQgZGVwdGggb2YgdGhlIGN1cnJlbnQKKyAgICAlIGxlYWRpbmc7IHRoYXQgaXMgZXhhY3RseSB3aGF0IFxzdHJ1dGJveCBpcyBzdXBwb3NlZCB0byByZWNvcmQuCisgICAgXHZza2lwLVxiYXNlbGluZXNraXAKKyAgICAlCisgICAgJSBcdmFkanVzdC1pdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHlwZS4gIFNvCisgICAgJSB0aGUgXGxsYXAgaGVyZSBtb3ZlcyBvdXQgaW50byB0aGUgbGVmdC1oYW5kIG1hcmdpbi4KKyAgICBcbGxhcHslCisgICAgICAlCisgICAgICAlIEZvciBhIHRoaWNrZXIgb3IgdGhpbm5lciBiYXIsIGNoYW5nZSB0aGUgYDFwdCcuCisgICAgICBcdnJ1bGUgaGVpZ2h0XGJhc2VsaW5lc2tpcCB3aWR0aDFwdAorICAgICAgJQorICAgICAgJSBUaGlzIGlzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBiYXIgYW5kIHRoZSB0ZXh0LgorICAgICAgXGhza2lwIDEycHQKKyAgICB9JQorICB9JQorfQorCislIFNvbWV0aW1lcyBpdCBpcyBjb252ZW5pZW50IHRvIGhhdmUgZXZlcnl0aGluZyBpbiB0aGUgdHJhbnNjcmlwdCBmaWxlCislIGFuZCBub3RoaW5nIG9uIHRoZSB0ZXJtaW5hbC4gIFdlIGRvbid0IGp1c3QgY2FsbCBcdHJhY2luZ2FsbCBoZXJlLAorJSBzaW5jZSB0aGF0IHByb2R1Y2VzIHNvbWUgdXNlbGVzcyBvdXRwdXQgb24gdGhlIHRlcm1pbmFsLiAgV2UgYWxzbyBtYWtlCislIHNvbWUgZWZmb3J0IHRvIG9yZGVyIHRoZSB0cmFjaW5nIGNvbW1hbmRzIHRvIHJlZHVjZSBvdXRwdXQgaW4gdGhlIGxvZworJSBmaWxlOyBjZi4gdHJhY2Uuc3R5IGluIExhVGVYLgorJQorXGRlZlxnbG9nZ2luZ2FsbHtcYmVnaW5ncm91cCBcZ2xvYmFsZGVmcyA9IDEgXGxvZ2dpbmdhbGwgXGVuZGdyb3VwfSUKK1xkZWZcbG9nZ2luZ2FsbHslCisgIFx0cmFjaW5nc3RhdHMyCisgIFx0cmFjaW5ncGFnZXMxCisgIFx0cmFjaW5nbG9zdGNoYXJzMiAgJSAyIGdpdmVzIHVzIG1vcmUgaW4gZXRleAorICBcdHJhY2luZ3BhcmFncmFwaHMxCisgIFx0cmFjaW5nb3V0cHV0MQorICBcdHJhY2luZ21hY3JvczIKKyAgXHRyYWNpbmdyZXN0b3JlczEKKyAgXHNob3dib3hicmVhZHRoXG1heGRpbWVuIFxzaG93Ym94ZGVwdGhcbWF4ZGltZW4KKyAgXGlmeFxlVGVYdmVyc2lvblx1bmRlZmluZWRcZWxzZSAlIGV0ZXggZ2l2ZXMgdXMgbW9yZSBsb2dnaW5nCisgICAgXHRyYWNpbmdzY2FudG9rZW5zMQorICAgIFx0cmFjaW5naWZzMQorICAgIFx0cmFjaW5nZ3JvdXBzMQorICAgIFx0cmFjaW5nbmVzdGluZzIKKyAgICBcdHJhY2luZ2Fzc2lnbnMxCisgIFxmaQorICBcdHJhY2luZ2NvbW1hbmRzMyAgJSAzIGdpdmVzIHVzIG1vcmUgaW4gZXRleAorICBcZXJyb3Jjb250ZXh0bGluZXMxNgorfSUKKworJSBhZGQgY2hlY2sgZm9yIFxsYXN0cGVuYWx0eSB0byBwbGFpbidzIGRlZmluaXRpb25zLiAgSWYgdGhlIGxhc3QgdGhpbmcKKyUgd2UgZGlkIHdhcyBhIFxub2JyZWFrLCB3ZSBkb24ndCB3YW50IHRvIGluc2VydCBtb3JlIHNwYWNlLgorJQorXGRlZlxzbWFsbGJyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XHNtYWxsc2tpcGFtb3VudAorICBccmVtb3ZlbGFzdHNraXBccGVuYWx0eS01MFxzbWFsbHNraXBcZmlcZml9CitcZGVmXG1lZGJyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XG1lZHNraXBhbW91bnQKKyAgXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHktMTAwXG1lZHNraXBcZmlcZml9CitcZGVmXGJpZ2JyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XGJpZ3NraXBhbW91bnQKKyAgXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHktMjAwXGJpZ3NraXBcZmlcZml9CisKKyUgRm9yIEBjcm9wbWFya3MgY29tbWFuZC4KKyUgRG8gQGNyb3BtYXJrcyB0byBnZXQgY3JvcCBtYXJrcy4KKyUKK1xuZXdpZlxpZmNyb3BtYXJrcworXGxldFxjcm9wbWFya3MgPSBcY3JvcG1hcmtzdHJ1ZQorJQorJSBEaW1lbnNpb25zIHRvIGFkZCBjcm9wbWFya3MgYXQgY29ybmVycy4KKyUgQWRkZWQgYnkgUC4gQS4gTWFjS2F5LCAxMiBOb3YuIDE5ODYKKyUKK1xuZXdkaW1lblxvdXRlcmhzaXplIFxuZXdkaW1lblxvdXRlcnZzaXplICUgc2V0IGJ5IHRoZSBwYXBlciBzaXplIHJvdXRpbmVzCitcbmV3ZGltZW5cY29ybmVybG9uZyAgXGNvcm5lcmxvbmc9MXBjCitcbmV3ZGltZW5cY29ybmVydGhpY2sgXGNvcm5lcnRoaWNrPS4zcHQKK1xuZXdkaW1lblx0b3BhbmRib3R0b21tYXJnaW4gXHRvcGFuZGJvdHRvbW1hcmdpbj0uNzVpbgorCislIE1haW4gb3V0cHV0IHJvdXRpbmUuCitcY2hhcmRlZlxQQUdFID0gMjU1Citcb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19CisKK1xuZXdib3hcaGVhZGxpbmVib3gKK1xuZXdib3hcZm9vdGxpbmVib3gKKworJSBcb25lcGFnZW91dCB0YWtlcyBhIHZib3ggYXMgYW4gYXJndW1lbnQuICBOb3RlIHRoYXQgXHBhZ2Vjb250ZW50cworJSBkb2VzIGluc2VydGlvbnMsIGJ1dCB5b3UgaGF2ZSB0byBjYWxsIGl0IHlvdXJzZWxmLgorXGRlZlxvbmVwYWdlb3V0IzF7JQorICBcaWZjcm9wbWFya3MgXGhvZmZzZXQ9MHB0IFxlbHNlIFxob2Zmc2V0PVxub3JtYWxvZmZzZXQgXGZpCisgICUKKyAgXGlmb2RkXHBhZ2VubyAgXGFkdmFuY2VcaG9mZnNldCBieSBcYmluZGluZ29mZnNldAorICBcZWxzZSBcYWR2YW5jZVxob2Zmc2V0IGJ5IC1cYmluZGluZ29mZnNldFxmaQorICAlCisgICUgRG8gdGhpcyBvdXRzaWRlIG9mIHRoZSBcc2hpcG91dCBzbyBAY29kZSBldGMuIHdpbGwgYmUgZXhwYW5kZWQgaW4KKyAgJSB0aGUgaGVhZGxpbmUgYXMgdGhleSBzaG91bGQgYmUsIG5vdCB0YWtlbiBsaXRlcmFsbHkgKG91dHB1dHRpbmcgJydjb2RlKS4KKyAgXHNldGJveFxoZWFkbGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWhlYWRsaW5lfSUKKyAgXHNldGJveFxmb290bGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWZvb3RsaW5lfSUKKyAgJQorICB7JQorICAgICUgSGF2ZSB0byBkbyB0aGlzIHN0dWZmIG91dHNpZGUgdGhlIFxzaGlwb3V0IGJlY2F1c2Ugd2Ugd2FudCBpdCB0bworICAgICUgdGFrZSBlZmZlY3QgaW4gXHdyaXRlJ3MsIHlldCB0aGUgZ3JvdXAgZGVmaW5lZCBieSB0aGUgXHZib3ggZW5kcworICAgICUgYmVmb3JlIHRoZSBcc2hpcG91dCBydW5zLgorICAgICUKKyAgICBcaW5kZXhkdW1taWVzICAgICAgICAgJSBkb24ndCBleHBhbmQgY29tbWFuZHMgaW4gdGhlIG91dHB1dC4KKyAgICBcc2hpcG91dFx2Ym94eyUKKyAgICAgICUgRG8gdGhpcyBlYXJseSBzbyBwZGYgcmVmZXJlbmNlcyBnbyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWdlLgorICAgICAgXGlmcGRmbWFrZXBhZ2VkZXN0IFxwZGZkZXN0IG5hbWV7XHRoZVxwYWdlbm99IHh5elxmaQorICAgICAgJQorICAgICAgXGlmY3JvcG1hcmtzIFx2Ym94IHRvIFxvdXRlcnZzaXplXGJncm91cAorICAgICAgICBcaHNpemUgPSBcb3V0ZXJoc2l6ZQorICAgICAgICBcdnNraXAtXHRvcGFuZGJvdHRvbW1hcmdpbgorICAgICAgICBcdnRvcCB0bzBwdHslCisgICAgICAgICAgXGxpbmV7XGV3dG9wXGhmaWxcZXd0b3B9JQorICAgICAgICAgIFxub2ludGVybGluZXNraXAKKyAgICAgICAgICBcbGluZXslCisgICAgICAgICAgICBcdmJveHtcbW92ZWxlZnRcY29ybmVydGhpY2tcbnN0b3B9JQorICAgICAgICAgICAgXGhmaWxsCisgICAgICAgICAgICBcdmJveHtcbW92ZXJpZ2h0XGNvcm5lcnRoaWNrXG5zdG9wfSUKKyAgICAgICAgICB9JQorICAgICAgICAgIFx2c3N9JQorICAgICAgICBcdnNraXBcdG9wYW5kYm90dG9tbWFyZ2luCisgICAgICAgIFxsaW5lXGJncm91cAorICAgICAgICAgIFxoZmlsICUgY2VudGVyIHRoZSBwYWdlIHdpdGhpbiB0aGUgb3V0ZXIgKHBhZ2UpIGhzaXplLgorICAgICAgICAgIFxpZm9kZFxwYWdlbm9caHNraXBcYmluZGluZ29mZnNldFxmaQorICAgICAgICAgIFx2Ym94XGJncm91cAorICAgICAgXGZpCisgICAgICAlCisgICAgICBcdW52Ym94XGhlYWRsaW5lYm94CisgICAgICBccGFnZWJvZHl7IzF9JQorICAgICAgXGlmZGltXGh0XGZvb3RsaW5lYm94ID4gMHB0CisgICAgICAgICUgT25seSBsZWF2ZSB0aGlzIHNwYWNlIGlmIHRoZSBmb290bGluZSBpcyBub25lbXB0eS4KKyAgICAgICAgJSAoV2UgbGVzc2VuZWQgXHZzaXplIGZvciBpdCBpbiBcb2RkZm9vdGluZ3h4eC4pCisgICAgICAgICUgVGhlIFxiYXNlbGluZXNraXA9MjRwdCBpbiBwbGFpbidzIFxtYWtlZm9vdGxpbmUgaGFzIG5vIGVmZmVjdC4KKyAgICAgICAgXHZza2lwIDJcYmFzZWxpbmVza2lwCisgICAgICAgIFx1bnZib3hcZm9vdGxpbmVib3gKKyAgICAgIFxmaQorICAgICAgJQorICAgICAgXGlmY3JvcG1hcmtzCisgICAgICAgICAgXGVncm91cCAlIGVuZCBvZiBcdmJveFxiZ3JvdXAKKyAgICAgICAgXGhmaWxcZWdyb3VwICUgZW5kIG9mIChjZW50ZXJpbmcpIFxsaW5lXGJncm91cAorICAgICAgICBcdnNraXBcdG9wYW5kYm90dG9tbWFyZ2luIHBsdXMxZmlsbCBtaW51czFmaWxsCisgICAgICAgIFxib3htYXhkZXB0aCA9IFxjb3JuZXJ0aGljaworICAgICAgICBcdmJveCB0bzBwdHtcdnNzCisgICAgICAgICAgXGxpbmV7JQorICAgICAgICAgICAgXHZib3h7XG1vdmVsZWZ0XGNvcm5lcnRoaWNrXG5zYm90fSUKKyAgICAgICAgICAgIFxoZmlsbAorICAgICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc2JvdH0lCisgICAgICAgICAgfSUKKyAgICAgICAgICBcbm9pbnRlcmxpbmVza2lwCisgICAgICAgICAgXGxpbmV7XGV3Ym90XGhmaWxcZXdib3R9JQorICAgICAgICB9JQorICAgICAgXGVncm91cCAlIFx2Ym94IGZyb20gZmlyc3QgY3JvcG1hcmtzIGNsYXVzZQorICAgICAgXGZpCisgICAgfSUgZW5kIG9mIFxzaGlwb3V0XHZib3gKKyAgfSUgZW5kIG9mIGdyb3VwIHdpdGggXGluZGV4ZHVtbWllcworICBcYWR2YW5jZXBhZ2VubworICBcaWZudW1cb3V0cHV0cGVuYWx0eT4tMjAwMDAgXGVsc2VcZG9zdXBlcmVqZWN0XGZpCit9CisKK1xuZXdpbnNlcnRcbWFyZ2luIFxkaW1lblxtYXJnaW49XG1heGRpbWVuCisKK1xkZWZccGFnZWJvZHkjMXtcdmJveCB0b1xwYWdlaGVpZ2h0e1xib3htYXhkZXB0aD1cbWF4ZGVwdGggIzF9fQore1xjYXRjb2RlYFxAID0xMQorXGdkZWZccGFnZWNvbnRlbnRzIzF7XGlmdm9pZFx0b3BpbnNcZWxzZVx1bnZib3hcdG9waW5zXGZpCislIG1hcmdpbmFsIGhhY2tzLCBqdWhhQHZpaXNhLnV1Y3AgKEp1aGEgVGFrYWxhKQorXGlmdm9pZFxtYXJnaW5cZWxzZSAlIG1hcmdpbmFsIGluZm8gaXMgcHJlc2VudAorICBccmxhcHtca2Vyblxoc2l6ZVx2Ym94IHRvXHpAe1xrZXJuMXB0XGJveFxtYXJnaW4gXHZzc319XGZpCitcZGltZW5APVxkcCMxIFx1bnZib3gjMQorXGlmdm9pZFxmb290aW5zXGVsc2VcdnNraXBcc2tpcFxmb290aW5zXGZvb3Rub3RlcnVsZSBcdW52Ym94XGZvb3RpbnNcZmkKK1xpZnJAZ2dlZGJvdHRvbSBca2Vybi1cZGltZW5AIFx2ZmlsIFxmaX0KK30KKworJSBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIHRoZSBjcm9wbWFya3MuICBOb3RlIHRoYXQgdGhleSBhcmUKKyUgb2Zmc2V0IHNvIHRoYXQgdGhlIHNwYWNlIGJldHdlZW4gdGhlbSBpcyB0cnVseSBcb3V0ZXJoc2l6ZSBvciBcb3V0ZXJ2c2l6ZQorJSAoUC4gQS4gTWFjS2F5LCAxMiBOb3ZlbWJlciwgMTk4NikKKyUKK1xkZWZcZXd0b3B7XHZydWxlIGhlaWdodFxjb3JuZXJ0aGljayBkZXB0aDBwdCB3aWR0aFxjb3JuZXJsb25nfQorXGRlZlxuc3RvcHtcdmJveAorICB7XGhydWxlIGhlaWdodFxjb3JuZXJ0aGljayBkZXB0aFxjb3JuZXJsb25nIHdpZHRoXGNvcm5lcnRoaWNrfX0KK1xkZWZcZXdib3R7XHZydWxlIGhlaWdodDBwdCBkZXB0aFxjb3JuZXJ0aGljayB3aWR0aFxjb3JuZXJsb25nfQorXGRlZlxuc2JvdHtcdmJveAorICB7XGhydWxlIGhlaWdodFxjb3JuZXJsb25nIGRlcHRoXGNvcm5lcnRoaWNrIHdpZHRoXGNvcm5lcnRoaWNrfX0KKworJSBQYXJzZSBhbiBhcmd1bWVudCwgdGhlbiBwYXNzIGl0IHRvICMxLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSByZXN0IG9mCislIHRoZSBpbnB1dCBsaW5lIChleGNlcHQgd2UgcmVtb3ZlIGEgdHJhaWxpbmcgY29tbWVudCkuICAjMSBzaG91bGQgYmUgYQorJSBtYWNybyB3aGljaCBleHBlY3RzIGFuIG9yZGluYXJ5IHVuZGVsaW1pdGVkIFRlWCBhcmd1bWVudC4KKyUKK1xkZWZccGFyc2Vhcmd7XHBhcnNlYXJndXNpbmd7fX0KK1xkZWZccGFyc2Vhcmd1c2luZyMxIzJ7JQorICBcZGVmXG5leHR7IzJ9JQorICBcYmVnaW5ncm91cAorICAgIFxvYmV5bGluZXMKKyAgICBcc3BhY2Vpc3NwYWNlCisgICAgIzElCisgICAgXHBhcnNlYXJnbGluZVxlbXB0eSUgSW5zZXJ0IHRoZSBcZW1wdHkgdG9rZW4sIHNlZSBcZmluaXNocGFyc2VhcmcgYmVsb3cuCit9CisKK3tcb2JleWxpbmVzICUKKyAgXGdkZWZccGFyc2VhcmdsaW5lIzFeXk17JQorICAgIFxlbmRncm91cCAlIEVuZCBvZiB0aGUgZ3JvdXAgc3RhcnRlZCBpbiBccGFyc2VhcmcuCisgICAgXGFyZ3JlbW92ZWNvbW1lbnQgIzFcY29tbWVudFxBcmdUZXJtJQorICB9JQorfQorCislIEZpcnN0IHJlbW92ZSBhbnkgQGNvbW1lbnQsIHRoZW4gYW55IEBjIGNvbW1lbnQuCitcZGVmXGFyZ3JlbW92ZWNvbW1lbnQjMVxjb21tZW50IzJcQXJnVGVybXtcYXJncmVtb3ZlYyAjMVxjXEFyZ1Rlcm19CitcZGVmXGFyZ3JlbW92ZWMjMVxjIzJcQXJnVGVybXtcYXJnY2hlY2tzcGFjZXMjMVxeXk1cQXJnVGVybX0KKworJSBFYWNoIG9jY3VyZW5jZSBvZiBgXF5eTScgb3IgYDxzcGFjZT5cXl5NJyBpcyByZXBsYWNlZCBieSBhIHNpbmdsZSBzcGFjZS4KKyUKKyUgXGFyZ3JlbW92ZWMgbWlnaHQgbGVhdmUgdXMgd2l0aCB0cmFpbGluZyBzcGFjZSwgZS5nLiwKKyUgICAgQGVuZCBpdGVtaXplICBAYyBmb28KKyUgVGhpcyBzcGFjZSB0b2tlbiB1bmRlcmdvZXMgdGhlIHNhbWUgcHJvY2VkdXJlIGFuZCBpcyBldmVudHVhbGx5IHJlbW92ZWQKKyUgYnkgXGZpbmlzaHBhcnNlYXJnLgorJQorXGRlZlxhcmdjaGVja3NwYWNlcyMxXF5eTXtcYXJnY2hlY2tzcGFjZXNYIzFcXl5NIFxeXk19CitcZGVmXGFyZ2NoZWNrc3BhY2VzWCMxIFxeXk17XGFyZ2NoZWNrc3BhY2VzWSMxXF5eTX0KK1xkZWZcYXJnY2hlY2tzcGFjZXNZIzFcXl5NIzJcXl5NIzNcQXJnVGVybXslCisgIFxkZWZcdGVtcHsjM30lCisgIFxpZnhcdGVtcFxlbXB0eQorICAgICUgV2UgY2Fubm90IHVzZSBcbmV4dCBoZXJlLCBhcyBpdCBob2xkcyB0aGUgbWFjcm8gdG8gcnVuOworICAgICUgdGh1cyB3ZSByZXVzZSBcdGVtcC4KKyAgICBcbGV0XHRlbXBcZmluaXNocGFyc2VhcmcKKyAgXGVsc2UKKyAgICBcbGV0XHRlbXBcYXJnY2hlY2tzcGFjZXMKKyAgXGZpCisgICUgUHV0IHRoZSBzcGFjZSB0b2tlbiBpbjoKKyAgXHRlbXAjMSAjM1xBcmdUZXJtCit9CisKKyUgSWYgYSBfZGVsaW1pdGVkXyBhcmd1bWVudCBpcyBlbmNsb3NlZCBpbiBicmFjZXMsIHRoZXkgZ2V0IHN0cmlwcGVkOyBzbworJSB0byBnZXQgX2V4YWN0bHlfIHRoZSByZXN0IG9mIHRoZSBsaW5lLCB3ZSBoYWQgdG8gcHJldmVudCBzdWNoIHNpdHVhdGlvbi4KKyUgV2UgcHJlcGVuZGVkIGFuIFxlbXB0eSB0b2tlbiBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgYW5kIHdlIGV4cGFuZCBpdCBub3csCislIGp1c3QgYmVmb3JlIHBhc3NpbmcgdGhlIGNvbnRyb2wgdG8gXG5leHQuCislIChTaW1pbGFyaWx5LCB3ZSBoYXZlIHRvIHRoaW5rIGFib3V0ICMzIG9mIFxhcmdjaGVja3NwYWNlc1kgYWJvdmU6IGl0IGlzCislIGVpdGhlciB0aGUgbnVsbCBzdHJpbmcsIG9yIGl0IGVuZHMgd2l0aCBcXl5NLS0tdGh1cyB0aGVyZSBpcyBubyBkYW5nZXIKKyUgdGhhdCBhIHBhaXIgb2YgYnJhY2VzIHdvdWxkIGJlIHN0cmlwcGVkLgorJQorJSBCdXQgZmlyc3QsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZSB0b2tlbi4KKyUKK1xkZWZcZmluaXNocGFyc2VhcmcjMSBcQXJnVGVybXtcZXhwYW5kYWZ0ZXJcbmV4dFxleHBhbmRhZnRlcnsjMX19CisKKyUgXHBhcnNlYXJnZGVmXGZvb3suLi59CislCWlzIHJvdWdobHkgZXF1aXZhbGVudCB0bworJSBcZGVmXGZvb3tccGFyc2VhcmdcWGZvb30KKyUgXGRlZlxYZm9vIzF7Li4ufQorJQorJSBBY3R1YWxseSwgSSB1c2UgXGNzbmFtZVxzdHJpbmdcZm9vXGVuZGNzbmFtZSwgaWUuIFxcZm9vLCBhcyBpdCBpcyBteQorJSBmYXZvdXJpdGUgVGVYIHRyaWNrLiAgLS1rYXNhbCwgMTZub3YwMworCitcZGVmXHBhcnNlYXJnZGVmIzF7JQorICBcZXhwYW5kYWZ0ZXIgXGRvcGFyc2VhcmdkZWYgXGNzbmFtZVxzdHJpbmcjMVxlbmRjc25hbWUgIzElCit9CitcZGVmXGRvcGFyc2VhcmdkZWYjMSMyeyUKKyAgXGRlZiMye1xwYXJzZWFyZyMxfSUKKyAgXGRlZiMxIyMxJQorfQorCislIFNldmVyYWwgdXRpbGl0eSBkZWZpbml0aW9ucyB3aXRoIGFjdGl2ZSBzcGFjZToKK3sKKyAgXG9iZXlzcGFjZXMKKyAgXGdkZWZcb2JleWVkc3BhY2V7IH0KKworICAlIE1ha2UgZWFjaCBzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0IHByb2R1Y2UgYSBub3JtYWwgaW50ZXJ3b3JkCisgICUgc3BhY2UgaW4gdGhlIG91dHB1dC4gIERvbid0IGFsbG93IGEgbGluZSBicmVhayBhdCB0aGlzIHNwYWNlLCBhcyB0aGlzCisgICUgaXMgdXNlZCBvbmx5IGluIGVudmlyb25tZW50cyBsaWtlIEBleGFtcGxlLCB3aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQKKyAgJSBzaG91bGQgcHJvZHVjZSBhIGxpbmUgb2Ygb3V0cHV0IGFueXdheS4KKyAgJQorICBcZ2RlZlxzZXBzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cdGllfQorCisgICUgSWYgYW4gaW5kZXggY29tbWFuZCBpcyB1c2VkIGluIGFuIEBleGFtcGxlIGVudmlyb25tZW50LCBhbnkgc3BhY2VzCisgICUgdGhlcmVpbiBzaG91bGQgYmVjb21lIHJlZ3VsYXIgc3BhY2VzIGluIHRoZSByYXcgaW5kZXggZmlsZSwgbm90IHRoZQorICAlIGV4cGFuc2lvbiBvZiBcdGllIChcbGVhdmV2bW9kZSBccGVuYWx0eSBcQE0gXCApLgorICBcZ2RlZlx1bnNlcHNwYWNlc3tcbGV0ID1cc3BhY2V9Cit9CisKKworXGRlZlxmbHVzaGNye1xpZnhccGFyXGxpc3BwYXIgXGRlZlxuZXh0IyMxe31cZWxzZSBcbGV0XG5leHQ9XHJlbGF4IFxmaSBcbmV4dH0KKworJSBEZWZpbmUgdGhlIGZyYW1ld29yayBmb3IgZW52aXJvbm1lbnRzIGluIHRleGluZm8udGV4LiAgSXQncyB1c2VkIGxpa2UgdGhpczoKKyUKKyUgICBcZW52ZGVmXGZvb3suLi59CislICAgXGRlZlxFZm9vey4uLn0KKyUKKyUgSXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgXGVudmRlZiB0byBpbnNlcnQgXGJlZ2luZ3JvdXAgYmVmb3JlIHRoZQorJSBhY3R1YWwgYm9keTsgQGVuZCBjbG9zZXMgdGhlIGdyb3VwIGFmdGVyIGNhbGxpbmcgXEVmb28uICBcZW52ZGVmIGFsc28KKyUgZGVmaW5lcyBcdGhpc2Vudiwgc28gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMga25vd247IEBlbmQgY2hlY2tzCislIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IG5hbWUgbWF0Y2hlcy4gIFRoZSBcY2hlY2tlbnYgbWFjcm8gY2FuIGFsc28gYmUKKyUgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIHRoZSBvbmUgZXhwZWN0ZWQuCislCislIE5vbi1mYWxzZSBjb25kaXRpb25hbHMgKEBpZnRleCwgQGlmc2V0KSBkb24ndCBmaXQgaW50byB0aGlzLCBzbyB0aGV5CislIGFyZSBub3QgdHJlYXRlZCBhcyBlbnZpcm9tZW50czsgdGhleSBkb24ndCBvcGVuIGEgZ3JvdXAuICAoVGhlCislIGltcGxlbWVudGF0aW9uIG9mIEBlbmQgdGFrZXMgY2FyZSBub3QgdG8gY2FsbCBcZW5kZ3JvdXAgaW4gdGhpcworJSBzcGVjaWFsIGNhc2UuKQorCisKKyUgQXQgcnVudGltZSwgZW52aXJvbm1lbnRzIHN0YXJ0IHdpdGggdGhpczoKK1xkZWZcc3RhcnRlbnZpcm9ubWVudCMxe1xiZWdpbmdyb3VwXGRlZlx0aGlzZW52eyMxfX0KKyUgaW5pdGlhbGl6ZQorXGxldFx0aGlzZW52XGVtcHR5CisKKyUgLi4uIGJ1dCB0aGV5IGdldCBkZWZpbmVkIHZpYSBgYFxlbnZkZWZcZm9vey4uLn0nJzoKK1xsb25nXGRlZlxlbnZkZWYjMSMye1xkZWYjMXtcc3RhcnRlbnZpcm9ubWVudCMxIzJ9fQorXGRlZlxlbnZwYXJzZWFyZ2RlZiMxIzJ7XHBhcnNlYXJnZGVmIzF7XHN0YXJ0ZW52aXJvbm1lbnQjMSMyfX0KKworJSBDaGVjayB3aGV0aGVyIHdlJ3JlIGluIHRoZSByaWdodCBlbnZpcm9ubWVudDoKK1xkZWZcY2hlY2tlbnYjMXslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGhpc2Vudlx0ZW1wCisgIFxlbHNlCisgICAgXGJhZGVudmVycgorICBcZmkKK30KKworJSBFdmlyb25tZW50IG1pc21hdGNoLCAjMSBleHBlY3RlZDoKK1xkZWZcYmFkZW52ZXJyeyUKKyAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgXGVycm1lc3NhZ2V7VGhpcyBjb21tYW5kIGNhbiBhcHBlYXIgb25seSBcaW5lbnZpcm9ubWVudFx0ZW1wLAorICAgIG5vdCBcaW5lbnZpcm9ubWVudFx0aGlzZW52fSUKK30KK1xkZWZcaW5lbnZpcm9ubWVudCMxeyUKKyAgXGlmeCMxXGVtcHR5CisgICAgb3V0IG9mIGFueSBlbnZpcm9ubWVudCUKKyAgXGVsc2UKKyAgICBpbiBlbnZpcm9ubWVudCBcZXhwYW5kYWZ0ZXJcc3RyaW5nIzElCisgIFxmaQorfQorCislIEBlbmQgZm9vIGV4ZWN1dGVzIHRoZSBkZWZpbml0aW9uIG9mIFxFZm9vLgorJSBCdXQgZmlyc3QsIGl0IGV4ZWN1dGVzIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBcY2hlY2tlbnYKKyUKK1xwYXJzZWFyZ2RlZlxlbmR7JQorICBcaWYgMVxjc25hbWUgaXNjb25kLiMxXGVuZGNzbmFtZQorICBcZWxzZQorICAgICUgVGhlIGdlbmVyYWwgd29yZGluZyBvZiBcYmFkZW52ZXJyIG1heSBub3QgYmUgaWRlYWwsIGJ1dC4uLiAtLWthc2FsLCAwNm5vdjAzCisgICAgXGV4cGFuZGFmdGVyXGNoZWNrZW52XGNzbmFtZSMxXGVuZGNzbmFtZQorICAgIFxjc25hbWUgRSMxXGVuZGNzbmFtZQorICAgIFxlbmRncm91cAorICBcZmkKK30KKworXG5ld2hlbHBcRU1zaW1wbGV7UHJlc3MgUkVUVVJOIHRvIGNvbnRpbnVlLn0KKworCislJSBTaW1wbGUgc2luZ2xlLWNoYXJhY3RlciBAIGNvbW1hbmRzCisKKyUgQEAgcHJpbnRzIGFuIEAKKyUgS2x1ZGdlIHRoaXMgdW50aWwgdGhlIGZvbnRzIGFyZSByaWdodCAoZ3JyKS4KK1xkZWZcQHt7XHR0XGNoYXI2NH19CisKKyUgVGhpcyBpcyB0dXJuZWQgb2ZmIGJlY2F1c2UgaXQgd2FzIG5ldmVyIGRvY3VtZW50ZWQKKyUgYW5kIHlvdSBjYW4gdXNlIEB3ey4uLn0gYXJvdW5kIGEgcXVvdGUgdG8gc3VwcHJlc3MgbGlnYXR1cmVzLgorJSUgRGVmaW5lIEBgIGFuZCBAJyB0byBiZSB0aGUgc2FtZSBhcyBgIGFuZCAnCislJSBidXQgc3VwcHJlc3NpbmcgbGlnYXR1cmVzLgorJVxkZWZcYHt7YH19CislXGRlZlwne3snfX0KKworJSBVc2VkIHRvIGdlbmVyYXRlIHF1b3RlZCBicmFjZXMuCitcZGVmXG15bGJyYWNlIHt7XHR0XGNoYXIxMjN9fQorXGRlZlxteXJicmFjZSB7e1x0dFxjaGFyMTI1fX0KK1xsZXRcez1cbXlsYnJhY2UKK1xsZXRcfT1cbXlyYnJhY2UKK1xiZWdpbmdyb3VwCisgICUgRGVmaW5pdGlvbnMgdG8gcHJvZHVjZSBceyBhbmQgXH0gY29tbWFuZHMgZm9yIGluZGljZXMsCisgICUgYW5kIEB7IGFuZCBAfSBmb3IgdGhlIGF1eC90b2MgZmlsZXMuCisgIFxjYXRjb2RlYFx7ID0gXG90aGVyIFxjYXRjb2RlYFx9ID0gXG90aGVyCisgIFxjYXRjb2RlYFxbID0gMSBcY2F0Y29kZWBcXSA9IDIKKyAgXGNhdGNvZGVgXCEgPSAwIFxjYXRjb2RlYFxcID0gXG90aGVyCisgICFnZGVmIWxicmFjZWNtZFtce10lCisgICFnZGVmIXJicmFjZWNtZFtcfV0lCisgICFnZGVmIWxicmFjZWF0Y21kW0B7XSUKKyAgIWdkZWYhcmJyYWNlYXRjbWRbQH1dJQorIWVuZGdyb3VwCisKKyUgQGNvbW1he30gdG8gYXZvaWQgLCBwYXJzaW5nIHByb2JsZW1zLgorXGxldFxjb21tYSA9ICwKKworJSBBY2NlbnRzOiBALCBAZG90YWNjZW50IEByaW5nYWNjZW50IEB1YmFyYWNjZW50IEB1ZG90YWNjZW50CislIE90aGVycyBhcmUgZGVmaW5lZCBieSBwbGFpbiBUZVg6IEBgIEAnIEAiIEBeIEB+IEA9IEB1IEB2IEBILgorXGxldFwsID0gXGMKK1xsZXRcZG90YWNjZW50ID0gXC4KK1xkZWZccmluZ2FjY2VudCMxe3tcYWNjZW50MjMgIzF9fQorXGxldFx0aWVhY2NlbnQgPSBcdAorXGxldFx1YmFyYWNjZW50ID0gXGIKK1xsZXRcdWRvdGFjY2VudCA9IFxkCisKKyUgT3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzOiBAcXVlc3Rpb25kb3duIEBleGNsYW1kb3duIEBvcmRmIEBvcmRtCislIFBsYWluIFRlWCBkZWZpbmVzOiBAQUEgQEFFIEBPIEBPRSBATCAocGx1cyBsb3dlcmNhc2UgdmVyc2lvbnMpIEBzcy4KK1xkZWZccXVlc3Rpb25kb3duez9gfQorXGRlZlxleGNsYW1kb3dueyFgfQorXGRlZlxvcmRme1xsZWF2ZXZtb2RlXHJhaXNlMWV4XGhib3h7XHNlbGVjdGZvbnRzXGxsbHNpemUgXHVuZGVyYmFye2F9fX0KK1xkZWZcb3JkbXtcbGVhdmV2bW9kZVxyYWlzZTFleFxoYm94e1xzZWxlY3Rmb250c1xsbGxzaXplIFx1bmRlcmJhcntvfX19CisKKyUgRG90bGVzcyBpIGFuZCBkb3RsZXNzIGosIHVzZWQgZm9yIGFjY2VudHMuCitcZGVmXGltYWNyb3tpfQorXGRlZlxqbWFjcm97an0KK1xkZWZcZG90bGVzcyMxeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXGltYWNybyBccHRleGkKKyAgXGVsc2VcaWZ4XHRlbXBcam1hY3JvIFxqCisgIFxlbHNlIFxlcnJtZXNzYWdle0Bkb3RsZXNzIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBpIG9yIGp9JQorICBcZmlcZmkKK30KKworJSBUaGUgXFRlWHt9IGxvZ28sIGFzIGluIHBsYWluLCBidXQgcmVzZXR0aW5nIHRoZSBzcGFjaW5nIHNvIHRoYXQgYQorJSBwZXJpb2QgZm9sbG93aW5nIGNvdW50cyBhcyBlbmRpbmcgYSBzZW50ZW5jZS4gIChJZGVhIGZvdW5kIGluIGxhdGV4LikKKyUKK1xlZGVmXFRlWHtcVGVYIFxzcGFjZWZhY3Rvcj0xMDAwIH0KKworJSBATGFUZVh7fSBsb2dvLiAgTm90IHF1aXRlIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIGRlZmluaXRpb24gaW4KKyUgbGF0ZXgubHR4LCBzaW5jZSB3ZSB1c2UgYSBkaWZmZXJlbnQgZm9udCBmb3IgdGhlIHJhaXNlZCBBOyBpdCdzIG1vc3QKKyUgY29udmVuaWVudCBmb3IgdXMgdG8gdXNlIGFuIGV4cGxpY2l0bHkgc21hbGxlciBmb250LCByYXRoZXIgdGhhbiB1c2luZworJSB0aGUgXHNjcmlwdHN0eWxlIGZvbnQgKHNpbmNlIHdlIGRvbid0IHJlc2V0IFxzY3JpcHRzdHlsZSBhbmQKKyUgXHNjcmlwdHNjcmlwdHN0eWxlKS4KKyUKK1xkZWZcTGFUZVh7JQorICBMXGtlcm4tLjM2ZW0KKyAge1xzZXRib3gwPVxoYm94e1R9JQorICAgXHZib3ggdG8gXGh0MHtcaGJveHtcc2VsZWN0Zm9udHNcbGxsc2l6ZSBBfVx2c3N9fSUKKyAgXGtlcm4tLjE1ZW0KKyAgXFRlWAorfQorCislIEJlIHN1cmUgd2UncmUgaW4gaG9yaXpvbnRhbCBtb2RlIHdoZW4gZG9pbmcgYSB0aWUsIHNpbmNlIHdlIG1ha2Ugc3BhY2UKKyUgZXF1aXZhbGVudCB0byB0aGlzIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzLiBPdGhlcndpc2UsIGEgc3BhY2UKKyUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2lsbCBzdGFydCB3aXRoIFxwZW5hbHR5IC0tIGFuZAorJSBzaW5jZSBccGVuYWx0eSBpcyB2YWxpZCBpbiB2ZXJ0aWNhbCBtb2RlLCB3ZSdkIGVuZCB1cCBwdXR0aW5nIHRoZQorJSBwZW5hbHR5IG9uIHRoZSB2ZXJ0aWNhbCBsaXN0IGluc3RlYWQgb2YgaW4gdGhlIG5ldyBwYXJhZ3JhcGguCit7XGNhdGNvZGVgQCA9IDExCisgJSBBdm9pZCB1c2luZyBcQE0gZGlyZWN0bHksIGJlY2F1c2UgdGhhdCBjYXVzZXMgdHJvdWJsZQorICUgaWYgdGhlIGRlZmluaXRpb24gaXMgd3JpdHRlbiBpbnRvIGFuIGluZGV4IGZpbGUuCisgXGdsb2JhbFxsZXRcdGllcGVuYWx0eSA9IFxATQorIFxnZGVmXHRpZXtcbGVhdmV2bW9kZVxwZW5hbHR5XHRpZXBlbmFsdHlcIH0KK30KKworJSBAOiBmb3JjZXMgbm9ybWFsIHNpemUgd2hpdGVzcGFjZSBmb2xsb3dpbmcuCitcZGVmXDp7XHNwYWNlZmFjdG9yPTEwMDAgfQorCislIEAqIGZvcmNlcyBhIGxpbmUgYnJlYWsuCitcZGVmXCp7XGhmaWxcYnJlYWtcaGJveHt9XGlnbm9yZXNwYWNlc30KKworJSBALyBhbGxvd3MgYSBsaW5lIGJyZWFrLgorXGxldFwvPVxhbGxvd2JyZWFrCisKKyUgQC4gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHBlcmlvZC4KK1xkZWZcLnsuXHNwYWNlZmFjdG9yPVxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3Jcc3BhY2V9CisKKyUgQCEgaXMgYW4gZW5kLW9mLXNlbnRlbmNlIGJhbmcuCitcZGVmXCF7IVxzcGFjZWZhY3Rvcj1cZW5kb2ZzZW50ZW5jZXNwYWNlZmFjdG9yXHNwYWNlfQorCislIEA/IGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBxdWVyeS4KK1xkZWZcP3s/XHNwYWNlZmFjdG9yPVxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3Jcc3BhY2V9CisKKyUgQGZyZW5jaHNwYWNpbmcgb258b2ZmICBzYXlzIHdoZXRoZXIgdG8gcHV0IGV4dHJhIHNwYWNlIGFmdGVyIHB1bmN0dWF0aW9uLgorJSAKK1xkZWZcb253b3Jke29ufQorXGRlZlxvZmZ3b3Jke29mZn0KKyUKK1xwYXJzZWFyZ2RlZlxmcmVuY2hzcGFjaW5neyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXG9ud29yZCBccGxhaW5mcmVuY2hzcGFjaW5nCisgIFxlbHNlXGlmeFx0ZW1wXG9mZndvcmQgXHBsYWlubm9uZnJlbmNoc3BhY2luZworICBcZWxzZQorICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCisgICAgXGVycm1lc3NhZ2V7VW5rbm93biBAZnJlbmNoc3BhY2luZyBvcHRpb24gYFx0ZW1wJywgbXVzdCBiZSBvbi9vZmZ9JQorICBcZmlcZmkKK30KKworJSBAdyBwcmV2ZW50cyBhIHdvcmQgYnJlYWsuICBXaXRob3V0IHRoZSBcbGVhdmV2bW9kZSwgQHcgYXQgdGhlCislIGJlZ2lubmluZyBvZiBhIHBhcmFncmFwaCwgd2hlbiBUZVggaXMgc3RpbGwgaW4gdmVydGljYWwgbW9kZSwgd291bGQKKyUgcHJvZHVjZSBhIHdob2xlIGxpbmUgb2Ygb3V0cHV0IGluc3RlYWQgb2Ygc3RhcnRpbmcgdGhlIHBhcmFncmFwaC4KK1xkZWZcdyMxe1xsZWF2ZXZtb2RlXGhib3h7IzF9fQorCislIEBncm91cCAuLi4gQGVuZCBncm91cCBmb3JjZXMgLi4uIHRvIGJlIGFsbCBvbiBvbmUgcGFnZSwgYnkgZW5jbG9zaW5nCislIGl0IGluIGEgVGVYIHZib3guICBXZSB1c2UgXHZ0b3AgaW5zdGVhZCBvZiBcdmJveCB0byBjb25zdHJ1Y3QgdGhlIGJveAorJSB0byBrZWVwIGl0cyBoZWlnaHQgdGhhdCBvZiBhIG5vcm1hbCBsaW5lLiAgQWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IKKyUgXHRvcHNraXAgKHAuMTE0IG9mIHRoZSBUZVhib29rKSwgdGhlIGdsdWUgaW5zZXJ0ZWQgaXMKKyUgbWF4IChcdG9wc2tpcCAtIFxodCAoZmlyc3QgaXRlbSksIDApLiAgSWYgdGhhdCBoZWlnaHQgaXMgbGFyZ2UsCislIHRoZXJlZm9yZSwgbm8gZ2x1ZSBpcyBpbnNlcnRlZCwgYW5kIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBoZWFkbGluZSBhbmQKKyUgdGhlIHRleHQgaXMgc21hbGwsIHdoaWNoIGxvb2tzIGJhZC4KKyUKKyUgQW5vdGhlciBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgZ3JvdXAgbWlnaHQgYmUgdmVyeSBsYXJnZS4gIFRoaXMgY2FuCislIGNhdXNlIHRoZSBnbHVlIG9uIHRoZSBwcmV2aW91cyBwYWdlIHRvIGJlIHVuZHVseSBzdHJldGNoZWQsIGJlY2F1c2UgaXQKKyUgZG9lcyBub3QgaGF2ZSBtdWNoIG1hdGVyaWFsLiAgSW4gdGhpcyBjYXNlLCBpdCdzIGJldHRlciB0byBhZGQgYW4KKyUgZXhwbGljaXQgXHZmaWxsIHNvIHRoYXQgdGhlIGV4dHJhIHNwYWNlIGlzIGF0IHRoZSBib3R0b20uICBUaGUKKyUgdGhyZXNob2xkIGZvciBkb2luZyB0aGlzIGlzIGlmIHRoZSBncm91cCBpcyBtb3JlIHRoYW4gXHZmaWxsbGltaXQKKyUgcGVyY2VudCBvZiBhIHBhZ2UgKFx2ZmlsbGxpbWl0IGNhbiBiZSBjaGFuZ2VkIGluc2lkZSBvZiBAdGV4KS4KKyUKK1xuZXdib3hcZ3JvdXBib3gKK1xkZWZcdmZpbGxsaW1pdHswLjd9CislCitcZW52ZGVmXGdyb3VweyUKKyAgXGlmbnVtXGNhdGNvZGVgXF5eTT1cYWN0aXZlIFxlbHNlCisgICAgXGVycmhlbHAgPSBcZ3JvdXBpbnZhbGlkaGVscAorICAgIFxlcnJtZXNzYWdle0Bncm91cCBpbnZhbGlkIGluIGNvbnRleHQgd2hlcmUgZmlsbGluZyBpcyBlbmFibGVkfSUKKyAgXGZpCisgIFxzdGFydHNhdmluZ2luc2VydHMKKyAgJQorICBcc2V0Ym94XGdyb3VwYm94ID0gXHZ0b3BcYmdyb3VwCisgICAgJSBEbyBAY29tbWVudCBzaW5jZSB3ZSBhcmUgY2FsbGVkIGluc2lkZSBhbiBlbnZpcm9ubWVudCBzdWNoIGFzCisgICAgJSBAZXhhbXBsZSwgd2hlcmUgZWFjaCBlbmQtb2YtbGluZSBpbiB0aGUgaW5wdXQgY2F1c2VzIGFuCisgICAgJSBlbmQtb2YtbGluZSBpbiB0aGUgb3V0cHV0LiAgV2UgZG9uJ3Qgd2FudCB0aGUgZW5kLW9mLWxpbmUgYWZ0ZXIKKyAgICAlIHRoZSBgQGdyb3VwJyB0byBwdXQgZXh0cmEgc3BhY2UgaW4gdGhlIG91dHB1dC4gIFNpbmNlIEBncm91cAorICAgICUgc2hvdWxkIGFwcGVhciBvbiBhIGxpbmUgYnkgaXRzZWxmIChhY2NvcmRpbmcgdG8gdGhlIFRleGluZm8KKyAgICAlIG1hbnVhbCksIHdlIGRvbid0IHdvcnJ5IGFib3V0IGVhdGluZyBhbnkgdXNlciB0ZXh0LgorICAgIFxjb21tZW50Cit9CislCislIFRoZSBcdnRvcCBwcm9kdWNlcyBhIGJveCB3aXRoIG5vcm1hbCBoZWlnaHQgYW5kIGxhcmdlIGRlcHRoOyB0aHVzLCBUZVggcHV0cworJSBcYmFzZWxpbmVza2lwIGdsdWUgYmVmb3JlIGl0LCBhbmQgKHdoZW4gdGhlIG5leHQgbGluZSBvZiB0ZXh0IGlzIGRvbmUpCislIFxsaW5lc2tpcCBnbHVlIGFmdGVyIGl0LiAgVGh1cywgc3BhY2UgYmVsb3cgaXMgbm90IHF1aXRlIGVxdWFsIHRvIHNwYWNlCislIGFib3ZlLiAgQnV0IGl0J3MgcHJldHR5IGNsb3NlLgorXGRlZlxFZ3JvdXB7JQorICAgICUgVG8gZ2V0IGNvcnJlY3QgaW50ZXJsaW5lIHNwYWNlIGJldHdlZW4gdGhlIGxhc3QgbGluZSBvZiB0aGUgZ3JvdXAKKyAgICAlIGFuZCB0aGUgZmlyc3QgbGluZSBhZnRlcndhcmRzLCB3ZSBoYXZlIHRvIHByb3BhZ2F0ZSBccHJldmRlcHRoLgorICAgIFxlbmRncmFmICUgTm90IFxwYXIsIGFzIGl0IG1heSBoYXZlIGJlZW4gc2V0IHRvIFxsaXNwcGFyLgorICAgIFxnbG9iYWxcZGltZW4xID0gXHByZXZkZXB0aAorICBcZWdyb3VwICAgICAgICAgICAlIEVuZCB0aGUgXHZ0b3AuCisgICUgXGRpbWVuMCBpcyB0aGUgdmVydGljYWwgc2l6ZSBvZiB0aGUgZ3JvdXAncyBib3guCisgIFxkaW1lbjAgPSBcaHRcZ3JvdXBib3ggIFxhZHZhbmNlXGRpbWVuMCBieSBcZHBcZ3JvdXBib3gKKyAgJSBcZGltZW4yIGlzIGhvdyBtdWNoIHNwYWNlIGlzIGxlZnQgb24gdGhlIHBhZ2UgKG1vcmUgb3IgbGVzcykuCisgIFxkaW1lbjIgPSBccGFnZWhlaWdodCAgIFxhZHZhbmNlXGRpbWVuMiBieSAtXHBhZ2V0b3RhbAorICAlIGlmIHRoZSBncm91cCBkb2Vzbid0IGZpdCBvbiB0aGUgY3VycmVudCBwYWdlLCBhbmQgaXQncyBhIGJpZyBiaWcKKyAgJSBncm91cCwgZm9yY2UgYSBwYWdlIGJyZWFrLgorICBcaWZkaW0gXGRpbWVuMCA+IFxkaW1lbjIKKyAgICBcaWZkaW0gXHBhZ2V0b3RhbCA8IFx2ZmlsbGxpbWl0XHBhZ2VoZWlnaHQKKyAgICAgIFxwYWdlCisgICAgXGZpCisgIFxmaQorICBcYm94XGdyb3VwYm94CisgIFxwcmV2ZGVwdGggPSBcZGltZW4xCisgIFxjaGVja2luc2VydHMKK30KKyUKKyUgVGVYIHB1dHMgaW4gYW4gXGVzY2FwZWNoYXIgKGkuZS4sIGBAJykgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVscAorJSBtZXNzYWdlLCBzbyB0aGlzIGVuZHMgdXAgcHJpbnRpbmcgYEBncm91cCBjYW4gb25seSAuLi4nLgorJQorXG5ld2hlbHBcZ3JvdXBpbnZhbGlkaGVscHslCitncm91cCBjYW4gb25seSBiZSB1c2VkIGluIGVudmlyb25tZW50cyBzdWNoIGFzIEBleGFtcGxlLF5eSiUKK3doZXJlIGVhY2ggbGluZSBvZiBpbnB1dCBwcm9kdWNlcyBhIGxpbmUgb2Ygb3V0cHV0Ln0KKworJSBAbmVlZCBzcGFjZS1pbi1taWxzCislIGZvcmNlcyBhIHBhZ2UgYnJlYWsgaWYgdGhlcmUgaXMgbm90IHNwYWNlLWluLW1pbHMgcmVtYWluaW5nLgorCitcbmV3ZGltZW5cbWlsICBcbWlsPTAuMDAxaW4KKworJSBPbGQgZGVmaW5pdGlvbi0tZGlkbid0IHdvcmsuCislXHBhcnNlYXJnZGVmXG5lZWR7XHBhciAlCislJSBUaGlzIG1ldGhvZCB0cmllcyB0byBtYWtlIFRlWCBicmVhayB0aGUgcGFnZSBuYXR1cmFsbHkKKyUlIGlmIHRoZSBkZXB0aCBvZiB0aGUgYm94IGRvZXMgbm90IGZpdC4KKyV7XGJhc2VsaW5lc2tpcD0wcHQlCislXHZ0b3AgdG8gIzFcbWlse1x2ZmlsfVxrZXJuIC0jMVxtaWxcbm9icmVhaworJVxwcmV2ZGVwdGg9LTEwMDBwdAorJX19CisKK1xwYXJzZWFyZ2RlZlxuZWVkeyUKKyAgJSBFbnN1cmUgdmVydGljYWwgbW9kZSwgc28gd2UgZG9uJ3QgbWFrZSBhIGJpZyBib3ggaW4gdGhlIG1pZGRsZSBvZiBhCisgICUgcGFyYWdyYXBoLgorICBccGFyCisgICUKKyAgJSBJZiB0aGUgQG5lZWQgdmFsdWUgaXMgbGVzcyB0aGFuIG9uZSBsaW5lIHNwYWNlLCBpdCdzIHVzZWxlc3MuCisgIFxkaW1lbjAgPSAjMVxtaWwKKyAgXGRpbWVuMiA9IFxodFxzdHJ1dGJveAorICBcYWR2YW5jZVxkaW1lbjIgYnkgXGRwXHN0cnV0Ym94CisgIFxpZmRpbVxkaW1lbjAgPiBcZGltZW4yCisgICAgJQorICAgICUgRG8gYSBcc3RydXQganVzdCB0byBtYWtlIHRoZSBoZWlnaHQgb2YgdGhpcyBib3ggYmUgbm9ybWFsLCBzbyB0aGUKKyAgICAlIG5vcm1hbCBsZWFkaW5nIGlzIGluc2VydGVkIHJlbGF0aXZlIHRvIHRoZSBwcmVjZWRpbmcgbGluZS4KKyAgICAlIEFuZCBhIHBhZ2UgYnJlYWsgaGVyZSBpcyBmaW5lLgorICAgIFx2dG9wIHRvICMxXG1pbHtcc3RydXRcdmZpbH0lCisgICAgJQorICAgICUgVGVYIGRvZXMgbm90IGV2ZW4gY29uc2lkZXIgcGFnZSBicmVha3MgaWYgYSBwZW5hbHR5IGFkZGVkIHRvIHRoZQorICAgICUgbWFpbiB2ZXJ0aWNhbCBsaXN0IGlzIDEwMDAwIG9yIG1vcmUuICBCdXQgaW4gb3JkZXIgdG8gc2VlIGlmIHRoZQorICAgICUgZW1wdHkgYm94IHdlIGp1c3QgYWRkZWQgZml0cyBvbiB0aGUgcGFnZSwgd2UgbXVzdCBtYWtlIGl0IGNvbnNpZGVyCisgICAgJSBwYWdlIGJyZWFrcy4gIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBkb24ndCB3YW50IHRvIGFjdHVhbGx5IGJyZWFrIHRoZQorICAgICUgcGFnZSBhZnRlciB0aGUgZW1wdHkgYm94LiAgU28gd2UgdXNlIGEgcGVuYWx0eSBvZiA5OTk5LgorICAgICUKKyAgICAlIFRoZXJlIGlzIGFuIGV4dHJlbWVseSBzbWFsbCBjaGFuY2UgdGhhdCBUZVggd2lsbCBhY3R1YWxseSBicmVhayB0aGUKKyAgICAlIHBhZ2UgYXQgdGhpcyBccGVuYWx0eSwgaWYgdGhlcmUgYXJlIG5vIG90aGVyIGZlYXNpYmxlIGJyZWFrcG9pbnRzIGluCisgICAgJSBzaWdodC4gIChJZiB0aGUgdXNlciBpcyB1c2luZyBsb3RzIG9mIGJpZyBAZ3JvdXAgY29tbWFuZHMsIHdoaWNoCisgICAgJSBhbG1vc3QtYnV0LW5vdC1xdWl0ZSBmaWxsIHVwIGEgcGFnZSwgVGVYIHdpbGwgaGF2ZSBhIGhhcmQgdGltZSBkb2luZworICAgICUgZ29vZCBwYWdlIGJyZWFraW5nLCBmb3IgZXhhbXBsZS4pICBIb3dldmVyLCBJIGNvdWxkIG5vdCBjb25zdHJ1Y3QgYW4KKyAgICAlIGV4YW1wbGUgd2hlcmUgYSBwYWdlIGJyb2tlIGF0IHRoaXMgXHBlbmFsdHk7IGlmIGl0IGhhcHBlbnMgaW4gYSByZWFsCisgICAgJSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gcmVjb25zaWRlciBvdXIgc3RyYXRlZ3kuCisgICAgXHBlbmFsdHk5OTk5CisgICAgJQorICAgICUgQmFjayB1cCBieSB0aGUgc2l6ZSBvZiB0aGUgYm94LCB3aGV0aGVyIHdlIGRpZCBhIHBhZ2UgYnJlYWsgb3Igbm90LgorICAgIFxrZXJuIC0jMVxtaWwKKyAgICAlCisgICAgJSBEbyBub3QgYWxsb3cgYSBwYWdlIGJyZWFrIHJpZ2h0IGFmdGVyIHRoaXMga2Vybi4KKyAgICBcbm9icmVhaworICBcZmkKK30KKworJSBAYnIgICBmb3JjZXMgcGFyYWdyYXBoIGJyZWFrIChhbmQgaXMgdW5kb2N1bWVudGVkKS4KKworXGxldFxiciA9IFxwYXIKKworJSBAcGFnZSBmb3JjZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBhZ2UuCislCitcZGVmXHBhZ2V7XHBhclx2ZmlsbFxzdXBlcmVqZWN0fQorCislIEBleGRlbnQgdGV4dC4uLi4KKyUgb3V0cHV0cyB0ZXh0IG9uIHNlcGFyYXRlIGxpbmUgaW4gcm9tYW4gZm9udCwgc3RhcnRpbmcgYXQgc3RhbmRhcmQgcGFnZSBtYXJnaW4KKworJSBUaGlzIHJlY29yZHMgdGhlIGFtb3VudCBvZiBpbmRlbnQgaW4gdGhlIGlubmVybW9zdCBlbnZpcm9ubWVudC4KKyUgVGhhdCdzIGhvdyBtdWNoIFxleGRlbnQgc2hvdWxkIHRha2Ugb3V0LgorXG5ld3NraXBcZXhkZW50YW1vdW50CisKKyUgVGhpcyBkZWZuIGlzIHVzZWQgaW5zaWRlIGZpbGwgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGRlZnVuLgorXHBhcnNlYXJnZGVmXGV4ZGVudHtcaGZpbFxicmVha1xoYm94e1xrZXJuIC1cZXhkZW50YW1vdW50e1xybSMxfX1caGZpbFxicmVha30KKworJSBUaGlzIGRlZm4gaXMgdXNlZCBpbnNpZGUgbm9maWxsIGVudmlyb25tZW50cyBzdWNoIGFzIEBleGFtcGxlLgorXHBhcnNlYXJnZGVmXG5vZmlsbGV4ZGVudHt7XGFkdmFuY2UgXGxlZnRza2lwIGJ5IC1cZXhkZW50YW1vdW50CisgIFxsZWZ0bGluZXtcaHNraXBcbGVmdHNraXB7XHJtIzF9fX19CisKKyUgQGlubWFyZ2lue1dISUNIfXtURVhUfSBwdXRzIFRFWFQgaW4gdGhlIFdISUNIIG1hcmdpbiBuZXh0IHRvIHRoZSBjdXJyZW50CislIHBhcmFncmFwaC4gIEZvciBtb3JlIGdlbmVyYWwgcHVycG9zZXMsIHVzZSB0aGUgXG1hcmdpbiBpbnNlcnRpb24KKyUgY2xhc3MuICBXSElDSCBpcyBgbCcgb3IgYHInLgorJQorXG5ld3NraXBcaW5tYXJnaW5zcGFjaW5nIFxpbm1hcmdpbnNwYWNpbmc9MWNtCitcZGVmXHN0cnV0ZGVwdGh7XGRwXHN0cnV0Ym94fQorJQorXGRlZlxkb2lubWFyZ2luIzEjMntcc3RydXRcdmFkanVzdHslCisgIFxub2JyZWFrCisgIFxrZXJuLVxzdHJ1dGRlcHRoCisgIFx2dG9wIHRvIFxzdHJ1dGRlcHRoeyUKKyAgICBcYmFzZWxpbmVza2lwPVxzdHJ1dGRlcHRoCisgICAgXHZzcworICAgICUgaWYgeW91IGhhdmUgbXVsdGlwbGUgbGluZXMgb2Ygc3R1ZmYgdG8gcHV0IGhlcmUsIHlvdSdsbCBuZWVkIHRvCisgICAgJSBtYWtlIHRoZSB2Ym94IHlvdXJzZWxmIG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplLgorICAgIFxpZngjMWwlCisgICAgICBcbGxhcHtcaWdub3Jlc3BhY2VzICMyXGhza2lwXGlubWFyZ2luc3BhY2luZ30lCisgICAgXGVsc2UKKyAgICAgIFxybGFwe1xoc2tpcFxoc2l6ZSBcaHNraXBcaW5tYXJnaW5zcGFjaW5nIFxpZ25vcmVzcGFjZXMgIzJ9JQorICAgIFxmaQorICAgIFxudWxsCisgIH0lCit9fQorXGRlZlxpbmxlZnRtYXJnaW57XGRvaW5tYXJnaW4gbH0KK1xkZWZcaW5yaWdodG1hcmdpbntcZG9pbm1hcmdpbiByfQorJQorJSBAaW5tYXJnaW57VEVYVCBbLCBSSUdIVC1URVhUXX0KKyUgKGlmIFJJR0hULVRFWFQgaXMgZ2l2ZW4sIHVzZSBURVhUIGZvciBsZWZ0IHBhZ2UsIFJJR0hULVRFWFQgZm9yIHJpZ2h0OworJSBlbHNlIHVzZSBURVhUIGZvciBib3RoKS4KKyUKK1xkZWZcaW5tYXJnaW4jMXtccGFyc2Vpbm1hcmdpbiAjMSwsXGZpbmlzaH0KK1xkZWZccGFyc2Vpbm1hcmdpbiMxLCMyLCMzXGZpbmlzaHslIG5vdCBwZXJmZWN0LCBidXQgYmV0dGVyIHRoYW4gbm90aGluZy4KKyAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfSUKKyAgXGlmZGltXHdkMCA+IDBwdAorICAgIFxkZWZcbGVmdHRleHR7IzF9JSAgaGF2ZSBib3RoIHRleHRzCisgICAgXGRlZlxyaWdodHRleHR7IzJ9JQorICBcZWxzZQorICAgIFxkZWZcbGVmdHRleHR7IzF9JSAgaGF2ZSBvbmx5IG9uZSB0ZXh0CisgICAgXGRlZlxyaWdodHRleHR7IzF9JQorICBcZmkKKyAgJQorICBcaWZvZGRccGFnZW5vCisgICAgXGRlZlx0ZW1we1xpbnJpZ2h0bWFyZ2luXHJpZ2h0dGV4dH0lIG9kZCBwYWdlIC0+IG91dHNpZGUgaXMgcmlnaHQgbWFyZ2luCisgIFxlbHNlCisgICAgXGRlZlx0ZW1we1xpbmxlZnRtYXJnaW5cbGVmdHRleHR9JQorICBcZmkKKyAgXHRlbXAKK30KKworJSBAaW5jbHVkZSBmaWxlICAgIGluc2VydCB0ZXh0IG9mIHRoYXQgZmlsZSBhcyBpbnB1dC4KKyUKK1xkZWZcaW5jbHVkZXtccGFyc2Vhcmd1c2luZ1xmaWxlbmFtZWNhdGNvZGVzXGluY2x1ZGV6enp9CitcZGVmXGluY2x1ZGV6enojMXslCisgIFxwdXNodGhpc2ZpbGVzdGFjaworICBcZGVmXHRoaXNmaWxleyMxfSUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxkZWZcdGVtcHtcaW5wdXQgIzEgfSUKKyAgICBcZXhwYW5kYWZ0ZXIKKyAgfVx0ZW1wCisgIFxwb3B0aGlzZmlsZXN0YWNrCit9CitcZGVmXGZpbGVuYW1lY2F0Y29kZXN7JQorICBcY2F0Y29kZWBcXD1cb3RoZXIKKyAgXGNhdGNvZGVgfj1cb3RoZXIKKyAgXGNhdGNvZGVgXj1cb3RoZXIKKyAgXGNhdGNvZGVgXz1cb3RoZXIKKyAgXGNhdGNvZGVgfD1cb3RoZXIKKyAgXGNhdGNvZGVgPD1cb3RoZXIKKyAgXGNhdGNvZGVgPj1cb3RoZXIKKyAgXGNhdGNvZGVgKz1cb3RoZXIKKyAgXGNhdGNvZGVgLT1cb3RoZXIKK30KKworXGRlZlxwdXNodGhpc2ZpbGVzdGFja3slCisgIFxleHBhbmRhZnRlclxwdXNodGhpc2ZpbGVzdGFja1hccG9wdGhpc2ZpbGVzdGFja1xTdGFja1Rlcm0KK30KK1xkZWZccHVzaHRoaXNmaWxlc3RhY2tYeyUKKyAgXGV4cGFuZGFmdGVyXHB1c2h0aGlzZmlsZXN0YWNrWVx0aGlzZmlsZVxTdGFja1Rlcm0KK30KK1xkZWZccHVzaHRoaXNmaWxlc3RhY2tZICMxXFN0YWNrVGVybSAjMlxTdGFja1Rlcm0geyUKKyAgXGdkZWZccG9wdGhpc2ZpbGVzdGFja3tcZ2RlZlx0aGlzZmlsZXsjMX1cZ2RlZlxwb3B0aGlzZmlsZXN0YWNreyMyfX0lCit9CisKK1xkZWZccG9wdGhpc2ZpbGVzdGFja3tcZXJydGhpc2ZpbGVzdGFja2VtcHR5fQorXGRlZlxlcnJ0aGlzZmlsZXN0YWNrZW1wdHl7XGVycm1lc3NhZ2V7SW50ZXJuYWwgZXJyb3I6CisgIHRoZSBzdGFjayBvZiBmaWxlbmFtZXMgaXMgZW1wdHkufX0KKworXGRlZlx0aGlzZmlsZXt9CisKKyUgQGNlbnRlciBsaW5lCislIG91dHB1dHMgdGhhdCBsaW5lLCBjZW50ZXJlZC4KKyUKK1xwYXJzZWFyZ2RlZlxjZW50ZXJ7JQorICBcaWZobW9kZQorICAgIFxsZXRcbmV4dFxjZW50ZXJICisgIFxlbHNlCisgICAgXGxldFxuZXh0XGNlbnRlclYKKyAgXGZpCisgIFxuZXh0e1xoZmlsIFxpZ25vcmVzcGFjZXMjMVx1bnNraXAgXGhmaWx9JQorfQorXGRlZlxjZW50ZXJIIzF7JQorICB7JQorICAgIFxoZmlsXGJyZWFrCisgICAgXGFkdmFuY2VcaHNpemUgYnkgLVxsZWZ0c2tpcAorICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1ccmlnaHRza2lwCisgICAgXGxpbmV7IzF9JQorICAgIFxicmVhaworICB9JQorfQorXGRlZlxjZW50ZXJWIzF7XGxpbmV7XGtlcm5cbGVmdHNraXAgIzFca2VyblxyaWdodHNraXB9fQorCislIEBzcCBuICAgb3V0cHV0cyBuIGxpbmVzIG9mIHZlcnRpY2FsIHNwYWNlCisKK1xwYXJzZWFyZ2RlZlxzcHtcdnNraXAgIzFcYmFzZWxpbmVza2lwfQorCislIEBjb21tZW50IC4uLmxpbmUgd2hpY2ggaXMgaWdub3JlZC4uLgorJSBAYyBpcyB0aGUgc2FtZSBhcyBAY29tbWVudAorJSBAaWdub3JlIC4uLiBAZW5kIGlnbm9yZSAgaXMgYW5vdGhlciB3YXkgdG8gd3JpdGUgYSBjb21tZW50CisKK1xkZWZcY29tbWVudHtcYmVnaW5ncm91cCBcY2F0Y29kZWBcXl5NPVxvdGhlciUKK1xjYXRjb2RlYFxAPVxvdGhlciBcY2F0Y29kZWBcez1cb3RoZXIgXGNhdGNvZGVgXH09XG90aGVyJQorXGNvbW1lbnR4eHh9Cit7XGNhdGNvZGVgXF5eTT1cb3RoZXIgXGdkZWZcY29tbWVudHh4eCMxXl5Ne1xlbmRncm91cH19CisKK1xsZXRcYz1cY29tbWVudAorCislIEBwYXJhZ3JhcGhpbmRlbnQgTkNIQVJTCislIFdlJ2xsIHVzZSBlbXMgZm9yIE5DSEFSUywgY2xvc2UgZW5vdWdoLgorJSBOQ0hBUlMgY2FuIGFsc28gYmUgdGhlIHdvcmQgYGFzaXMnIG9yIGBub25lJy4KKyUgV2UgY2Fubm90IGZlYXNpYmx5IGltcGxlbWVudCBAcGFyYWdyYXBoaW5kZW50IGFzaXMsIHRob3VnaC4KKyUKK1xkZWZcYXNpc3dvcmR7YXNpc30gJSBubyB0cmFuc2xhdGlvbiwgdGhlc2UgYXJlIGtleXdvcmRzCitcZGVmXG5vbmV3b3Jke25vbmV9CislCitccGFyc2VhcmdkZWZccGFyYWdyYXBoaW5kZW50eyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXGFzaXN3b3JkCisgIFxlbHNlCisgICAgXGlmeFx0ZW1wXG5vbmV3b3JkCisgICAgICBcZGVmYXVsdHBhcmluZGVudCA9IDBwdAorICAgIFxlbHNlCisgICAgICBcZGVmYXVsdHBhcmluZGVudCA9ICMxZW0KKyAgICBcZmkKKyAgXGZpCisgIFxwYXJpbmRlbnQgPSBcZGVmYXVsdHBhcmluZGVudAorfQorCislIEBleGFtcGxlaW5kZW50IE5DSEFSUworJSBXZSdsbCB1c2UgZW1zIGZvciBOQ0hBUlMgbGlrZSBAcGFyYWdyYXBoaW5kZW50LgorJSBJdCBzZWVtcyBAZXhhbXBsZWluZGVudCBhc2lzIGlzbid0IG5lY2Vzc2FyeSwgYnV0CislIEkgcHJlc2VydmUgaXQgdG8gbWFrZSBpdCBzaW1pbGFyIHRvIEBwYXJhZ3JhcGhpbmRlbnQuCitccGFyc2VhcmdkZWZcZXhhbXBsZWluZGVudHslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxhc2lzd29yZAorICBcZWxzZQorICAgIFxpZnhcdGVtcFxub25ld29yZAorICAgICAgXGxpc3BuYXJyb3dpbmcgPSAwcHQKKyAgICBcZWxzZQorICAgICAgXGxpc3BuYXJyb3dpbmcgPSAjMWVtCisgICAgXGZpCisgIFxmaQorfQorCislIEBmaXJzdHBhcmFncmFwaGluZGVudCBXT1JECislIElmIFdPUkQgaXMgYG5vbmUnLCB0aGVuIHN1cHByZXNzIGluZGVudGF0aW9uIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGgKKyUgYWZ0ZXIgYSBzZWN0aW9uIGhlYWRpbmcuICBJZiBXT1JEIGlzIGBpbnNlcnQnLCB0aGVuIGRvIGluZGVudCBhdCBzdWNoCislIHBhcmFncmFwaHMuCislCislIFRoZSBwYXJhZ3JhcGggaW5kZW50YXRpb24gaXMgc3VwcHJlc3NlZCBvciBub3QgYnkgY2FsbGluZworJSBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudCwgd2hpY2ggdGhlIHNlY3Rpb25pbmcgY29tbWFuZHMgZG8uCislIFdlIHN3aXRjaCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGJhY2sgYW5kIGZvcnRoIGFjY29yZGluZyB0byBXT1JELgorJSBCeSBkZWZhdWx0LCB3ZSBzdXBwcmVzcyBpbmRlbnRhdGlvbi4KKyUKK1xkZWZcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudHtcZG9zdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50fQorXGRlZlxpbnNlcnR3b3Jke2luc2VydH0KKyUKK1xwYXJzZWFyZ2RlZlxmaXJzdHBhcmFncmFwaGluZGVudHslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxub25ld29yZAorICAgIFxsZXRcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudCA9IFxkb3N1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnQKKyAgXGVsc2VcaWZ4XHRlbXBcaW5zZXJ0d29yZAorICAgIFxsZXRcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudCA9IFxyZWxheAorICBcZWxzZQorICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCisgICAgXGVycm1lc3NhZ2V7VW5rbm93biBAZmlyc3RwYXJhZ3JhcGhpbmRlbnQgb3B0aW9uIGBcdGVtcCd9JQorICBcZmlcZmkKK30KKworJSBIZXJlIGlzIGhvdyB3ZSBhY3R1YWxseSBzdXBwcmVzcyBpbmRlbnRhdGlvbi4gIFJlZGVmaW5lIFxldmVyeXBhciB0bworJSBca2VybiBiYWNrd2FyZHMgYnkgXHBhcmluZGVudCwgYW5kIHRoZW4gcmVzZXQgaXRzZWxmIHRvIGVtcHR5LgorJQorJSBXZSBhbHNvIG1ha2UgXGluZGVudCBpdHNlbGYgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIHVudGlsIHRoZSBuZXh0CislIHBhcmFncmFwaC4KKyUKK1xnZGVmXGRvc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudHslCisgIFxnZGVmXGluZGVudHslCisgICAgXHJlc3RvcmVmaXJzdHBhcmFncmFwaGluZGVudAorICAgIFxpbmRlbnQKKyAgfSUKKyAgXGdkZWZcbm9pbmRlbnR7JQorICAgIFxyZXN0b3JlZmlyc3RwYXJhZ3JhcGhpbmRlbnQKKyAgICBcbm9pbmRlbnQKKyAgfSUKKyAgXGdsb2JhbFxldmVyeXBhciA9IHslCisgICAgXGtlcm4gLVxwYXJpbmRlbnQKKyAgICBccmVzdG9yZWZpcnN0cGFyYWdyYXBoaW5kZW50CisgIH0lCit9CisKK1xnZGVmXHJlc3RvcmVmaXJzdHBhcmFncmFwaGluZGVudHslCisgIFxnbG9iYWwgXGxldCBcaW5kZW50ID0gXHB0ZXhpbmRlbnQKKyAgXGdsb2JhbCBcbGV0IFxub2luZGVudCA9IFxwdGV4bm9pbmRlbnQKKyAgXGdsb2JhbCBcZXZlcnlwYXIgPSB7fSUKK30KKworCislIEBhc2lzIGp1c3QgeWllbGRzIGl0cyBhcmd1bWVudC4gIFVzZWQgd2l0aCBAdGFibGUsIGZvciBleGFtcGxlLgorJQorXGRlZlxhc2lzIzF7IzF9CisKKyUgQG1hdGggb3V0cHV0cyBpdHMgYXJndW1lbnQgaW4gbWF0aCBtb2RlLgorJQorJSBPbmUgY29tcGxpY2F0aW9uOiBfIHVzdWFsbHkgbWVhbnMgc3Vic2NyaXB0cywgYnV0IGl0IGNvdWxkIGFsc28gbWVhbgorJSBhbiBhY3R1YWwgXyBjaGFyYWN0ZXIsIGFzIGluIEBtYXRoe0B2YXJ7c29tZV92YXJpYWJsZX0gKyAxfS4gIFNvIG1ha2UKKyUgXyBhY3RpdmUsIGFuZCBkaXN0aW5ndWlzaCBieSBzZWVpbmcgaWYgdGhlIGN1cnJlbnQgZmFtaWx5IGlzIFxzbGZhbSwKKyUgd2hpY2ggaXMgd2hhdCBAdmFyIHVzZXMuCit7CisgIFxjYXRjb2RlXHVuZGVyQ2hhciA9IFxhY3RpdmUKKyAgXGdkZWZcbWF0aHVuZGVyc2NvcmV7JQorICAgIFxjYXRjb2RlXHVuZGVyQ2hhcj1cYWN0aXZlCisgICAgXGRlZl97XGlmbnVtXGZhbT1cc2xmYW0gXF9cZWxzZVxzYlxmaX0lCisgIH0KK30KKyUgQW5vdGhlciBjb21wbGljYXRpb246IHdlIHdhbnQgXFwgKGFuZCBAXCkgdG8gb3V0cHV0IGEgXCBjaGFyYWN0ZXIuCislIEZZSSwgcGxhaW4udGV4IHVzZXMgXFwgYXMgYSB0ZW1wb3JhcnkgY29udHJvbCBzZXF1ZW5jZSAod2h5PyksIGJ1dAorJSB0aGlzIGlzIG5vdCBhZHZlcnRpc2VkIGFuZCB3ZSBkb24ndCBjYXJlLiAgVGV4aW5mbyBkb2VzIG5vdAorJSBvdGhlcndpc2UgZGVmaW5lIEBcLgorJQorJSBUaGUgXG1hdGhjaGFyIGlzIGNsYXNzPTA9b3JkaW5hcnksIGZhbWlseT03PXR0ZmFtLCBwb3NpdGlvbj01Qz1cLgorXGRlZlxtYXRoYmFja3NsYXNoe1xpZm51bVxmYW09XHR0ZmFtIFxtYXRoY2hhciIwNzVDIFxlbHNlXGJhY2tzbGFzaCBcZml9CislCitcZGVmXG1hdGh7JQorICBcdGV4CisgIFxtYXRodW5kZXJzY29yZQorICBcbGV0XFwgPSBcbWF0aGJhY2tzbGFzaAorICBcbWF0aGFjdGl2ZQorICAkXGZpbmlzaG1hdGgKK30KK1xkZWZcZmluaXNobWF0aCMxeyMxJFxlbmRncm91cH0gICUgQ2xvc2UgdGhlIGdyb3VwIG9wZW5lZCBieSBcdGV4LgorCislIFNvbWUgYWN0aXZlIGNoYXJhY3RlcnMgKHN1Y2ggYXMgPCkgYXJlIHNwYWNlZCBkaWZmZXJlbnRseSBpbiBtYXRoLgorJSBXZSBoYXZlIHRvIHJlc2V0IHRoZWlyIGRlZmluaXRpb25zIGluIGNhc2UgdGhlIEBtYXRoIHdhcyBhbiBhcmd1bWVudAorJSB0byBhIGNvbW1hbmQgd2hpY2ggc2V0cyB0aGUgY2F0Y29kZXMgKHN1Y2ggYXMgQGl0ZW0gb3IgQHNlY3Rpb24pLgorJQoreworICBcY2F0Y29kZWBeID0gXGFjdGl2ZQorICBcY2F0Y29kZWA8ID0gXGFjdGl2ZQorICBcY2F0Y29kZWA+ID0gXGFjdGl2ZQorICBcY2F0Y29kZWArID0gXGFjdGl2ZQorICBcZ2RlZlxtYXRoYWN0aXZleyUKKyAgICBcbGV0XiA9IFxwdGV4aGF0CisgICAgXGxldDwgPSBccHRleGxlc3MKKyAgICBcbGV0PiA9IFxwdGV4Z3RyCisgICAgXGxldCsgPSBccHRleHBsdXMKKyAgfQorfQorCislIEBidWxsZXQgYW5kIEBtaW51cyBuZWVkIHRoZSBzYW1lIHRyZWF0bWVudCBhcyBAbWF0aCwganVzdCBhYm92ZS4KK1xkZWZcYnVsbGV0eyRccHRleGJ1bGxldCR9CitcZGVmXG1pbnVzeyQtJH0KKworJSBAZG90c3t9IG91dHB1dHMgYW4gZWxsaXBzaXMgdXNpbmcgdGhlIGN1cnJlbnQgZm9udC4KKyUgV2UgZG8gLjVlbSBwZXIgcGVyaW9kIHNvIHRoYXQgaXQgaGFzIHRoZSBzYW1lIHNwYWNpbmcgaW4gYSB0eXBld3JpdGVyCislIGZvbnQgYXMgdGhyZWUgYWN0dWFsIHBlcmlvZCBjaGFyYWN0ZXJzLgorJQorXGRlZlxkb3RzeyUKKyAgXGxlYXZldm1vZGUKKyAgXGhib3ggdG8gMS41ZW17JQorICAgIFxoc2tpcCAwcHQgcGx1cyAwLjI1ZmlsCisgICAgLlxoZmlsLlxoZmlsLiUKKyAgICBcaHNraXAgMHB0IHBsdXMgMC41ZmlsCisgIH0lCit9CisKKyUgQGVuZGRvdHN7fSBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgZWxsaXBzaXMuCislCitcZGVmXGVuZGRvdHN7JQorICBcZG90cworICBcc3BhY2VmYWN0b3I9XGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvcgorfQorCislIEBjb21tYXt9IGlzIHNvIGNvbW1hcyBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0ZXh0IHdpdGhvdXQgbWVzc2luZyB1cAorJSBUZXhpbmZvJ3MgcGFyc2luZy4KKyUKK1xsZXRcY29tbWEgPSAsCisKKyUgQHJlZmlsbCBpcyBhIG5vLW9wLgorXGxldFxyZWZpbGw9XHJlbGF4CisKKyUgSWYgd29ya2luZyBvbiBhIGxhcmdlIGRvY3VtZW50IGluIGNoYXB0ZXJzLCBpdCBpcyBjb252ZW5pZW50IHRvCislIGJlIGFibGUgdG8gZGlzYWJsZSBpbmRleGluZywgY3Jvc3MtcmVmZXJlbmNpbmcsIGFuZCBjb250ZW50cywgZm9yIHRlc3QgcnVucy4KKyUgVGhpcyBpcyBkb25lIHdpdGggQG5vdmFsaWRhdGUgKGJlZm9yZSBAc2V0ZmlsZW5hbWUpLgorJQorXG5ld2lmXGlmbGlua3MgXGxpbmtzdHJ1ZSAlIGJ5IGRlZmF1bHQgd2Ugd2FudCB0aGUgYXV4IGZpbGVzLgorXGxldFxub3ZhbGlkYXRlID0gXGxpbmtzZmFsc2UKKworJSBAc2V0ZmlsZW5hbWUgaXMgZG9uZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IHRleGluZm8gZmlsZS4KKyUgU28gb3BlbiBoZXJlIHRoZSBmaWxlcyB3ZSBuZWVkIHRvIGhhdmUgb3BlbiB3aGlsZSByZWFkaW5nIHRoZSBpbnB1dC4KKyUgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWtlIGEgLmZtdCBmaWxlIGZvciB0ZXhpbmZvLgorXGRlZlxzZXRmaWxlbmFtZXslCisgICBcZml4YmFja3NsYXNoICAlIFR1cm4gb2ZmIGhhY2sgdG8gc3dhbGxvdyBgXGlucHV0IHRleGluZm8nLgorICAgXGlmbGlua3MKKyAgICAgXHRyeWF1eGZpbGUKKyAgICAgJSBPcGVuIHRoZSBuZXcgYXV4IGZpbGUuICBUZVggd2lsbCBjbG9zZSBpdCBhdXRvbWF0aWNhbGx5IGF0IGV4aXQuCisgICAgIFxpbW1lZGlhdGVcb3Blbm91dFxhdXhmaWxlPVxqb2JuYW1lLmF1eAorICAgXGZpICUgXG9wZW5pbmRpY2VzIG5lZWRzIHRvIGRvIHNvbWUgd29yayBpbiBhbnkgY2FzZS4KKyAgIFxvcGVuaW5kaWNlcworICAgXGxldFxzZXRmaWxlbmFtZT1cY29tbWVudCAlIElnbm9yZSBleHRyYSBAc2V0ZmlsZW5hbWUgY21kcy4KKyAgICUKKyAgICUgSWYgdGV4aW5mby5jbmYgaXMgcHJlc2VudCBvbiB0aGUgc3lzdGVtLCByZWFkIGl0LgorICAgJSBVc2VmdWwgZm9yIHNpdGUtd2lkZSBAYWZvdXJwYXBlciwgZXRjLgorICAgXG9wZW5pbiAxIHRleGluZm8uY25mCisgICBcaWZlb2YgMSBcZWxzZSBcaW5wdXQgdGV4aW5mby5jbmYgXGZpCisgICBcY2xvc2VpbiAxCisgICAlCisgICBcY29tbWVudCAlIElnbm9yZSB0aGUgYWN0dWFsIGZpbGVuYW1lLgorfQorCislIENhbGxlZCBmcm9tIFxzZXRmaWxlbmFtZS4KKyUKK1xkZWZcb3BlbmluZGljZXN7JQorICBcbmV3aW5kZXh7Y3B9JQorICBcbmV3Y29kZWluZGV4e2ZufSUKKyAgXG5ld2NvZGVpbmRleHt2cn0lCisgIFxuZXdjb2RlaW5kZXh7dHB9JQorICBcbmV3Y29kZWluZGV4e2t5fSUKKyAgXG5ld2NvZGVpbmRleHtwZ30lCit9CisKKyUgQGJ5ZS4KK1xvdXRlclxkZWZcYnlle1xwYWdlYWxpZ25tYWNyb1x0cmFjaW5nc3RhdHM9MVxwdGV4ZW5kfQorCisKK1xtZXNzYWdle3BkZix9CislIGFkb2JlIGBwb3J0YWJsZScgZG9jdW1lbnQgZm9ybWF0CitcbmV3Y291bnRcdGVtcG51bQorXG5ld2NvdW50XGxua2NvdW50CitcbmV3dG9rc1xmaWxlbmFtZQorXG5ld2NvdW50XGZpbGVuYW1lbGVuZ3RoCitcbmV3Y291bnRccGduCitcbmV3dG9rc1x0b2tzQQorXG5ld3Rva3NcdG9rc0IKK1xuZXd0b2tzXHRva3NDCitcbmV3dG9rc1x0b2tzRAorXG5ld2JveFxib3hBCitcbmV3Y291bnRcY291bnRBCitcbmV3aWZcaWZwZGYKK1xuZXdpZlxpZnBkZm1ha2VwYWdlZGVzdAorCislIHdoZW4gcGRmdGV4IGlzIHJ1biBpbiBkdmkgbW9kZSwgXHBkZm91dHB1dCBpcyBkZWZpbmVkIChzbyBccGRmb3V0cHV0PTEKKyUgY2FuIGJlIHNldCkuICBTbyB3ZSB0ZXN0IGZvciBccmVsYXggYW5kIDAgYXMgd2VsbCBhcyBcdW5kZWZpbmVkLAorJSBib3Jyb3dlZCBmcm9tIGlmcGRmLnN0eS4KK1xpZnhccGRmb3V0cHV0XHVuZGVmaW5lZAorXGVsc2UKKyAgXGlmeFxwZGZvdXRwdXRccmVsYXgKKyAgXGVsc2UKKyAgICBcaWZjYXNlXHBkZm91dHB1dAorICAgIFxlbHNlCisgICAgICBccGRmdHJ1ZQorICAgIFxmaQorICBcZmkKK1xmaQorCislIFBERiB1c2VzIFBvc3RTY3JpcHQgc3RyaW5nIGNvbnN0YW50cyBmb3IgdGhlIG5hbWVzIG9mIHhyZWYgdGFyZ2V0cywgdG8KKyUgZm9yIGRpc3BsYXkgaW4gdGhlIG91dGxpbmVzLCBhbmQgaW4gb3RoZXIgcGxhY2VzLiAgVGh1cywgd2UgaGF2ZSB0bworJSBkb3VibGUgYW55IGJhY2tzbGFzaGVzLiAgT3RoZXJ3aXNlLCBhIG5hbWUgbGlrZSAiXG5vZGUiIHdpbGwgYmUKKyUgaW50ZXJwcmV0ZWQgYXMgYSBuZXdsaW5lIChcbiksIGZvbGxvd2VkIGJ5IG8sIGQsIGUuICBOb3QgZ29vZC4KKyUgaHR0cDovL3d3dy5udGcubmwvcGlwZXJtYWlsL250Zy1wZGZ0ZXgvMjAwNC1KdWx5LzAwMDY1NC5odG1sCislIChhbmQgcmVsYXRlZCBtZXNzYWdlcywgdGhlIGZpbmFsIG91dGNvbWUgaXMgdGhhdCBpdCBpcyB1cCB0byB0aGUgVGVYCislIHVzZXIgdG8gZG91YmxlIHRoZSBiYWNrc2xhc2hlcyBhbmQgb3RoZXJ3aXNlIG1ha2UgdGhlIHN0cmluZyB2YWxpZCwgc28KKyUgdGhhdCdzIHdlIGRvKS4KKworJSBkb3VibGUgYWN0aXZlIGJhY2tzbGFzaGVzLgorJSAKK3tcY2F0Y29kZWBcQD0wIFxjYXRjb2RlYFxcPVxhY3RpdmUKKyBAZ2RlZkBhY3RpdmViYWNrc2xhc2h7QGNhdGNvZGVgQFw9QGFjdGl2ZSBAb3RoZXJiYWNrc2xhc2h9CisgQGdkZWZAYWN0aXZlYmFja3NsYXNoZG91YmxleyUKKyAgIEBjYXRjb2RlQGJhY2tDaGFyPUBhY3RpdmUKKyAgIEBsZXRcPUBkb3VibGViYWNrc2xhc2h9Cit9CisKKyUgVG8gaGFuZGxlIHBhcmVucywgd2UgbXVzdCBhZG9wdCBhIGRpZmZlcmVudCBhcHByb2FjaCwgc2luY2UgcGFyZW5zIGFyZQorJSBub3QgYWN0aXZlIGNoYXJhY3RlcnMuICBoeXBlcnJlZi5kdHggKHdoaWNoIGhhcyB0aGUgc2FtZSBwcm9ibGVtIGFzCislIHVzKSBoYW5kbGVzIGl0IHdpdGggdGhpcyBhbWF6aW5nIG1hY3JvIHRvIHJlcGxhY2UgdG9rZW5zLiAgSSd2ZQorJSB0aW5rZXJlZCB3aXRoIGl0IGEgbGl0dGxlIGZvciB0ZXhpbmZvLCBidXQgaXQncyBkZWZpbml0ZWx5IGZyb20gdGhlcmUuCislIAorJSAjMSBpcyB0aGUgdG9rZW5zIHRvIHJlcGxhY2UuCislICMyIGlzIHRoZSByZXBsYWNlbWVudC4KKyUgIzMgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2Ugd2l0aCB0aGUgc3RyaW5nLgorJSAKK1xkZWZcSHlQc2RTdWJzdCMxIzIjM3slCisgIFxkZWZcSHlQc2RSZXBsYWNlIyMxIzEjIzJcRU5EeyUKKyAgICAjIzElCisgICAgXGlmeFxcIyMyXFwlCisgICAgXGVsc2UKKyAgICAgICMyJQorICAgICAgXEh5UmV0dXJuQWZ0ZXJGaXslCisgICAgICAgIFxIeVBzZFJlcGxhY2UjIzJcRU5ECisgICAgICB9JQorICAgIFxmaQorICB9JQorICBceGRlZiMze1xleHBhbmRhZnRlclxIeVBzZFJlcGxhY2UjMyMxXEVORH0lCit9CitcbG9uZ1xkZWZcSHlSZXR1cm5BZnRlckZpIzFcZml7XGZpIzF9CisKKyUgIzEgaXMgYSBjb250cm9sIHNlcXVlbmNlIGluIHdoaWNoIHRvIGRvIHRoZSByZXBsYWNlbWVudHMuCitcZGVmXGJhY2tzbGFzaHBhcmVucyMxeyUKKyAgXHhkZWYjMXsjMX0lIHJlZGVmaW5lIGl0IGFzIGl0cyBleHBhbnNpb247IHRoZSBkZWZpbml0aW9uIGlzIHNpbXBseQorICAgICAgICAgICAgICUgXGxhc3Rub2RlIHdoZW4gY2FsbGVkIGZyb20gXHNldHJlZiAtPiBccGRmbWtkZXN0LgorICBcSHlQc2RTdWJzdHsofXtcYmFja3NsYXNobHBhcmVufXsjMX0lCisgIFxIeVBzZFN1YnN0eyl9e1xiYWNrc2xhc2hycGFyZW59eyMxfSUKK30KKwore1xjYXRjb2RlXGV4Y2xhbUNoYXIgPSAwIFxjYXRjb2RlXGJhY2tDaGFyID0gXG90aGVyCisgIWdkZWYhYmFja3NsYXNobHBhcmVue1wofSUKKyAhZ2RlZiFiYWNrc2xhc2hycGFyZW57XCl9JQorfQorCitcaWZwZGYKKyAgXGlucHV0IHBkZmNvbG9yCisgIFxwZGZjYXRhbG9ney9QYWdlTW9kZSAvVXNlT3V0bGluZXN9JQorICBcZGVmXGRvcGRmaW1hZ2UjMSMyIzN7JQorICAgIFxkZWZcaW1hZ2V3aWR0aHsjMn0lCisgICAgXGRlZlxpbWFnZWhlaWdodHsjM30lCisgICAgJSB3aXRob3V0IFxpbW1lZGlhdGUsIHBkZnRleCBzZWcgZmF1bHRzIHdoZW4gdGhlIHNhbWUgaW1hZ2UgaXMKKyAgICAlIGluY2x1ZGVkIHR3aWNlLiAgKFZlcnNpb24gMy4xNDE1OS1wcmUtMS4wLXVub2ZmaWNpYWwtMjAwMTA3MDQuKQorICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uIDwgMTQKKyAgICAgIFxpbW1lZGlhdGVccGRmaW1hZ2UKKyAgICBcZWxzZQorICAgICAgXGltbWVkaWF0ZVxwZGZ4aW1hZ2UKKyAgICBcZmkKKyAgICAgIFxpZnhcZW1wdHlcaW1hZ2V3aWR0aFxlbHNlIHdpZHRoIFxpbWFnZXdpZHRoIFxmaQorICAgICAgXGlmeFxlbXB0eVxpbWFnZWhlaWdodFxlbHNlIGhlaWdodCBcaW1hZ2VoZWlnaHQgXGZpCisgICAgICBcaWZudW1ccGRmdGV4dmVyc2lvbjwxMworICAgICAgICAgIzEucGRmJQorICAgICAgIFxlbHNlCisgICAgICAgICB7IzEucGRmfSUKKyAgICAgICBcZmkKKyAgICBcaWZudW1ccGRmdGV4dmVyc2lvbiA8IDE0IFxlbHNlCisgICAgICBccGRmcmVmeGltYWdlIFxwZGZsYXN0eGltYWdlCisgICAgXGZpfQorICBcZGVmXHBkZm1rZGVzdCMxe3slCisgICAgJSBXZSBoYXZlIHRvIHNldCBkdW1taWVzIHNvIGNvbW1hbmRzIHN1Y2ggYXMgQGNvZGUsIGFuZCBjaGFyYWN0ZXJzCisgICAgJSBzdWNoIGFzIFwsIGFyZW4ndCBleHBhbmRlZCB3aGVuIHByZXNlbnQgaW4gYSBzZWN0aW9uIHRpdGxlLgorICAgIFxhdGR1bW1pZXMKKyAgICBcYWN0aXZlYmFja3NsYXNoZG91YmxlCisgICAgXGRlZlxwZGZkZXN0bmFtZXsjMX0lCisgICAgXGJhY2tzbGFzaHBhcmVuc1xwZGZkZXN0bmFtZQorICAgIFxwZGZkZXN0IG5hbWV7XHBkZmRlc3RuYW1lfSB4eXolCisgIH19JQorICAlCisgICUgdXNlZCB0byBtYXJrIHRhcmdldCBuYW1lczsgbXVzdCBiZSBleHBhbmRhYmxlLgorICBcZGVmXHBkZm1rcGduIzF7IzF9JQorICAlCisgIFxsZXRcbGlua2NvbG9yID0gXEJsdWUgICUgd2FzIEN5YW4sIGJ1dCB0aGF0IHNlZW1zIGxpZ2h0PworICBcZGVmXGVuZGxpbmt7XEJsYWNrXHBkZmVuZGxpbmt9CisgICUgQWRkaW5nIG91dGxpbmVzIHRvIFBERjsgbWFjcm9zIGZvciBjYWxjdWxhdGluZyBzdHJ1Y3R1cmUgb2Ygb3V0bGluZXMKKyAgJSBjb21lIGZyb20gUGV0ciBPbHNhaworICBcZGVmXGV4cG51bWJlciMxe1xleHBhbmRhZnRlclxpZnhcY3NuYW1lIzFcZW5kY3NuYW1lXHJlbGF4IDAlCisgICAgXGVsc2UgXGNzbmFtZSMxXGVuZGNzbmFtZSBcZml9CisgIFxkZWZcYWR2YW5jZW51bWJlciMxe1x0ZW1wbnVtPVxleHBudW1iZXJ7IzF9XHJlbGF4CisgICAgXGFkdmFuY2VcdGVtcG51bSBieSAxCisgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFcZW5kY3NuYW1le1x0aGVcdGVtcG51bX19CisgICUKKyAgJSAjMSBpcyB0aGUgc2VjdGlvbiB0ZXh0LCB3aGljaCBpcyB3aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZQorICAlIG91dGxpbmUgYnkgdGhlIHBkZiB2aWV3ZXIuICAjMiBpcyB0aGUgcGRmIGV4cHJlc3Npb24gZm9yIHRoZSBudW1iZXIKKyAgJSBvZiBzdWJlbnRyaWVzIChvciBlbXB0eSwgZm9yIHN1YnN1YnNlY3Rpb25zKS4gICMzIGlzIHRoZSBub2RlIHRleHQsCisgICUgd2hpY2ggbWlnaHQgYmUgZW1wdHkgaWYgdGhpcyB0b2MgZW50cnkgaGFkIG5vIGNvcnJlc3BvbmRpbmcgbm9kZS4KKyAgJSAjNCBpcyB0aGUgcGFnZSBudW1iZXIKKyAgJQorICBcZGVmXGRvcGRmb3V0bGluZSMxIzIjMyM0eyUKKyAgICAlIEdlbmVyYXRlIGEgbGluayB0byB0aGUgbm9kZSB0ZXh0IGlmIHRoYXQgZXhpc3RzOyBlbHNlLCB1c2UgdGhlCisgICAgJSBwYWdlIG51bWJlci4gIFdlIGNvdWxkIGdlbmVyYXRlIGEgZGVzdGluYXRpb24gZm9yIHRoZSBzZWN0aW9uCisgICAgJSB0ZXh0IGluIHRoZSBjYXNlIHdoZXJlIGEgc2VjdGlvbiBoYXMgbm8gbm9kZSwgYnV0IGl0IGRvZXNuJ3QKKyAgICAlIHNlZW0gd29ydGggdGhlIHRyb3VibGUsIHNpbmNlIG1vc3QgZG9jdW1lbnRzIGFyZSBub3JtYWxseSBzdHJ1Y3R1cmVkLgorICAgIFxkZWZccGRmb3V0bGluZWRlc3R7IzN9JQorICAgIFxpZnhccGRmb3V0bGluZWRlc3RcZW1wdHkKKyAgICAgIFxkZWZccGRmb3V0bGluZWRlc3R7IzR9JQorICAgIFxlbHNlCisgICAgICAlIERvdWJsZWQgYmFja3NsYXNoZXMgaW4gdGhlIG5hbWUuCisgICAgICB7XGFjdGl2ZWJhY2tzbGFzaGRvdWJsZSBceGRlZlxwZGZvdXRsaW5lZGVzdHsjM30lCisgICAgICAgXGJhY2tzbGFzaHBhcmVuc1xwZGZvdXRsaW5lZGVzdH0lCisgICAgXGZpCisgICAgJQorICAgICUgQWxzbyBkb3VibGUgdGhlIGJhY2tzbGFzaGVzIGluIHRoZSBkaXNwbGF5IHN0cmluZy4KKyAgICB7XGFjdGl2ZWJhY2tzbGFzaGRvdWJsZSBceGRlZlxwZGZvdXRsaW5ldGV4dHsjMX0lCisgICAgIFxiYWNrc2xhc2hwYXJlbnNccGRmb3V0bGluZXRleHR9JQorICAgICUKKyAgICBccGRmb3V0bGluZSBnb3RvIG5hbWV7XHBkZm1rcGdue1xwZGZvdXRsaW5lZGVzdH19IzJ7XHBkZm91dGxpbmV0ZXh0fSUKKyAgfQorICAlCisgIFxkZWZccGRmbWFrZW91dGxpbmVzeyUKKyAgICBcYmVnaW5ncm91cAorICAgICAgJSBUaGFuaCdzIGhhY2sgLyBwcm9wZXIgYnJhY2VzIGluIGJvb2ttYXJrcworICAgICAgXGVkZWZcbXlsYnJhY2V7XGlmdHJ1ZSBcc3RyaW5ne1xlbHNlfVxmaX1cbGV0XHs9XG15bGJyYWNlCisgICAgICBcZWRlZlxteXJicmFjZXtcaWZmYWxzZXtcZWxzZVxzdHJpbmd9XGZpfVxsZXRcfT1cbXlyYnJhY2UKKyAgICAgICUKKyAgICAgICUgUmVhZCB0b2Mgc2lsZW50bHksIHRvIGdldCBjb3VudHMgb2Ygc3ViZW50cmllcyBmb3IgXHBkZm91dGxpbmUuCisgICAgICBcZGVmXG51bWNoYXBlbnRyeSMjMSMjMiMjMyMjNHslCisJXGRlZlx0aGlzY2hhcG51bXsjIzJ9JQorCVxkZWZcdGhpc3NlY251bXswfSUKKwlcZGVmXHRoaXNzdWJzZWNudW17MH0lCisgICAgICB9JQorICAgICAgXGRlZlxudW1zZWNlbnRyeSMjMSMjMiMjMyMjNHslCisJXGFkdmFuY2VudW1iZXJ7Y2hhcFx0aGlzY2hhcG51bX0lCisJXGRlZlx0aGlzc2VjbnVteyMjMn0lCisJXGRlZlx0aGlzc3Vic2VjbnVtezB9JQorICAgICAgfSUKKyAgICAgIFxkZWZcbnVtc3Vic2VjZW50cnkjIzEjIzIjIzMjIzR7JQorCVxhZHZhbmNlbnVtYmVye3NlY1x0aGlzc2VjbnVtfSUKKwlcZGVmXHRoaXNzdWJzZWNudW17IyMyfSUKKyAgICAgIH0lCisgICAgICBcZGVmXG51bXN1YnN1YnNlY2VudHJ5IyMxIyMyIyMzIyM0eyUKKwlcYWR2YW5jZW51bWJlcntzdWJzZWNcdGhpc3N1YnNlY251bX0lCisgICAgICB9JQorICAgICAgXGRlZlx0aGlzY2hhcG51bXswfSUKKyAgICAgIFxkZWZcdGhpc3NlY251bXswfSUKKyAgICAgIFxkZWZcdGhpc3N1YnNlY251bXswfSUKKyAgICAgICUKKyAgICAgICUgdXNlIFxkZWYgcmF0aGVyIHRoYW4gXGxldCBoZXJlIGJlY2F1c2Ugd2UgcmVkZWZpbmUgXGNoYXBlbnRyeSBldAorICAgICAgJSBhbC4gYSBzZWNvbmQgdGltZSwgYmVsb3cuCisgICAgICBcZGVmXGFwcGVudHJ5e1xudW1jaGFwZW50cnl9JQorICAgICAgXGRlZlxhcHBzZWNlbnRyeXtcbnVtc2VjZW50cnl9JQorICAgICAgXGRlZlxhcHBzdWJzZWNlbnRyeXtcbnVtc3Vic2VjZW50cnl9JQorICAgICAgXGRlZlxhcHBzdWJzdWJzZWNlbnRyeXtcbnVtc3Vic3Vic2VjZW50cnl9JQorICAgICAgXGRlZlx1bm5jaGFwZW50cnl7XG51bWNoYXBlbnRyeX0lCisgICAgICBcZGVmXHVubnNlY2VudHJ5e1xudW1zZWNlbnRyeX0lCisgICAgICBcZGVmXHVubnN1YnNlY2VudHJ5e1xudW1zdWJzZWNlbnRyeX0lCisgICAgICBcZGVmXHVubnN1YnN1YnNlY2VudHJ5e1xudW1zdWJzdWJzZWNlbnRyeX0lCisgICAgICBccmVhZGRhdGFmaWxle3RvY30lCisgICAgICAlCisgICAgICAlIFJlYWQgdG9jIHNlY29uZCB0aW1lLCB0aGlzIHRpbWUgYWN0dWFsbHkgcHJvZHVjaW5nIHRoZSBvdXRsaW5lcy4KKyAgICAgICUgVGhlIGAtJyBtZWFucyB0YWtlIHRoZSBcZXhwbnVtYmVyIGFzIHRoZSBhYnNvbHV0ZSBudW1iZXIgb2YKKyAgICAgICUgc3ViZW50cmllcywgd2hpY2ggd2UgY2FsY3VsYXRlZCBvbiBvdXIgZmlyc3QgcmVhZCBvZiB0aGUgLnRvYyBhYm92ZS4KKyAgICAgICUKKyAgICAgICUgV2UgdXNlIHRoZSBub2RlIG5hbWVzIGFzIHRoZSBkZXN0aW5hdGlvbnMuCisgICAgICBcZGVmXG51bWNoYXBlbnRyeSMjMSMjMiMjMyMjNHslCisgICAgICAgIFxkb3BkZm91dGxpbmV7IyMxfXtjb3VudC1cZXhwbnVtYmVye2NoYXAjIzJ9fXsjIzN9eyMjNH19JQorICAgICAgXGRlZlxudW1zZWNlbnRyeSMjMSMjMiMjMyMjNHslCisgICAgICAgIFxkb3BkZm91dGxpbmV7IyMxfXtjb3VudC1cZXhwbnVtYmVye3NlYyMjMn19eyMjM317IyM0fX0lCisgICAgICBcZGVmXG51bXN1YnNlY2VudHJ5IyMxIyMyIyMzIyM0eyUKKyAgICAgICAgXGRvcGRmb3V0bGluZXsjIzF9e2NvdW50LVxleHBudW1iZXJ7c3Vic2VjIyMyfX17IyMzfXsjIzR9fSUKKyAgICAgIFxkZWZcbnVtc3Vic3Vic2VjZW50cnkjIzEjIzIjIzMjIzR7JSBjb3VudCBpcyBhbHdheXMgemVybworICAgICAgICBcZG9wZGZvdXRsaW5leyMjMX17fXsjIzN9eyMjNH19JQorICAgICAgJQorICAgICAgJSBQREYgb3V0bGluZXMgYXJlIGRpc3BsYXllZCB1c2luZyBzeXN0ZW0gZm9udHMsIGluc3RlYWQgb2YKKyAgICAgICUgZG9jdW1lbnQgZm9udHMuICBUaGVyZWZvcmUgd2UgY2Fubm90IHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMsCisgICAgICAlIHNpbmNlIHRoZSBlbmNvZGluZyBpcyB1bmtub3duLiAgRm9yIGV4YW1wbGUsIHRoZSBlb2dvbmVrIGZyb20KKyAgICAgICUgTGF0aW4gMiAoMHhlYSkgZ2V0cyB0cmFuc2xhdGVkIHRvIGEgfCBjaGFyYWN0ZXIuICBJbmZvIGZyb20KKyAgICAgICUgU3Rhc3playBXYXdyeWtpZXdpY3osIDE5IEphbiAyMDA0IDA0OjA5OjI0ICswMTAwLgorICAgICAgJQorICAgICAgJSB4eCB0byBkbyB0aGlzIHJpZ2h0LCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSA4LWJpdCBjaGFyYWN0ZXJzIHRvCisgICAgICAlIHRoZWlyICJiZXN0IiBlcXVpdmFsZW50LCBiYXNlZCBvbiB0aGUgQGRvY3VtZW50ZW5jb2RpbmcuICBSaWdodAorICAgICAgJSBub3csIEkgZ3Vlc3Mgd2UnbGwganVzdCBsZXQgdGhlIHBkZiByZWFkZXIgaGF2ZSBpdHMgd2F5LgorICAgICAgXGluZGV4bm9mb250cworICAgICAgXHNldHVwZGF0YWZpbGUKKyAgICAgIFxhY3RpdmViYWNrc2xhc2gKKyAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKKyAgICBcZW5kZ3JvdXAKKyAgfQorICAlCisgIFxkZWZcc2tpcHNwYWNlcyMxe1xkZWZcUFB7IzF9XGRlZlxEe3x9JQorICAgIFxpZnhcUFBcRFxsZXRcbmV4dHNwXHJlbGF4CisgICAgXGVsc2VcbGV0XG5leHRzcFxza2lwc3BhY2VzCisgICAgICBcaWZ4XHBcc3BhY2VcZWxzZVxhZGR0b2tlbnN7XGZpbGVuYW1lfXtcUFB9JQorICAgICAgICBcYWR2YW5jZVxmaWxlbmFtZWxlbmd0aCBieSAxCisgICAgICBcZmkKKyAgICBcZmkKKyAgICBcbmV4dHNwfQorICBcZGVmXGdldGZpbGVuYW1lIzF7XGZpbGVuYW1lbGVuZ3RoPTBcZXhwYW5kYWZ0ZXJcc2tpcHNwYWNlcyMxfFxyZWxheH0KKyAgXGlmbnVtXHBkZnRleHZlcnNpb24gPCAxNAorICAgIFxsZXQgXHN0YXJ0bGluayBccGRmYW5ub3RsaW5rCisgIFxlbHNlCisgICAgXGxldCBcc3RhcnRsaW5rIFxwZGZzdGFydGxpbmsKKyAgXGZpCisgIFxkZWZccGRmdXJsIzF7JQorICAgIFxiZWdpbmdyb3VwCisgICAgICBcbm9ybWFsdHVybm9mZmFjdGl2ZVxkZWZcQHtAfSUKKyAgICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCisgICAgICBcbGVhdmV2bW9kZVxSZWQKKyAgICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19JQorICAgICAgICB1c2Vyey9TdWJ0eXBlIC9MaW5rIC9BIDw8IC9TIC9VUkkgL1VSSSAoIzEpID4+fSUKKyAgICBcZW5kZ3JvdXB9CisgIFxkZWZccGRmZ2V0dG9rcyMxLntcc2V0Ym94XGJveEE9XGhib3h7XHRva3NBPXsjMS59XHRva3NCPXt9XG1ha2V0b2tzfX0KKyAgXGRlZlxhZGR0b2tlbnMjMSMye1xlZGVmXGFkZHRva3N7XG5vZXhwYW5kIzE9e1x0aGUjMSMyfX1cYWRkdG9rc30KKyAgXGRlZlxhZG4jMXtcYWRkdG9rZW5ze1x0b2tzQ317IzF9XGdsb2JhbFxjb3VudEE9MVxsZXRcbmV4dD1cbWFrZXRva3N9CisgIFxkZWZccG9wdG9rcyMxIzJ8RU5EVE9LU3x7XGxldFxmaXJzdD0jMVx0b2tzRD17IzF9XHRva3NBPXsjMn19CisgIFxkZWZcbWFrZXRva3N7JQorICAgIFxleHBhbmRhZnRlclxwb3B0b2tzXHRoZVx0b2tzQXxFTkRUT0tTfFxyZWxheAorICAgIFxpZnhcZmlyc3QwXGFkbjAKKyAgICBcZWxzZVxpZnhcZmlyc3QxXGFkbjEgXGVsc2VcaWZ4XGZpcnN0MlxhZG4yIFxlbHNlXGlmeFxmaXJzdDNcYWRuMworICAgIFxlbHNlXGlmeFxmaXJzdDRcYWRuNCBcZWxzZVxpZnhcZmlyc3Q1XGFkbjUgXGVsc2VcaWZ4XGZpcnN0NlxhZG42CisgICAgXGVsc2VcaWZ4XGZpcnN0N1xhZG43IFxlbHNlXGlmeFxmaXJzdDhcYWRuOCBcZWxzZVxpZnhcZmlyc3Q5XGFkbjkKKyAgICBcZWxzZQorICAgICAgXGlmbnVtMD1cY291bnRBXGVsc2VcbWFrZWxpbmtcZmkKKyAgICAgIFxpZnhcZmlyc3QuXGxldFxuZXh0PVxkb25lXGVsc2UKKyAgICAgICAgXGxldFxuZXh0PVxtYWtldG9rcworICAgICAgICBcYWRkdG9rZW5ze1x0b2tzQn17XHRoZVx0b2tzRH0KKyAgICAgICAgXGlmeFxmaXJzdCxcYWRkdG9rZW5ze1x0b2tzQn17XHNwYWNlfVxmaQorICAgICAgXGZpCisgICAgXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpCisgICAgXG5leHR9CisgIFxkZWZcbWFrZWxpbmt7XGFkZHRva2Vuc3tcdG9rc0J9JQorICAgIHtcbm9leHBhbmRccGRmbGlua3tcdGhlXHRva3NDfX1cdG9rc0M9e31cZ2xvYmFsXGNvdW50QT0wfQorICBcZGVmXHBkZmxpbmsjMXslCisgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0gZ290byBuYW1le1xwZGZta3BnbnsjMX19CisgICAgXGxpbmtjb2xvciAjMVxlbmRsaW5rfQorICBcZGVmXGRvbmV7XGVkZWZcc3R7XGdsb2JhbFxub2V4cGFuZFx0b2tzQT17XHRoZVx0b2tzQn19XHN0fQorXGVsc2UKKyAgXGxldFxwZGZta2Rlc3QgPSBcZ29iYmxlCisgIFxsZXRccGRmdXJsID0gXGdvYmJsZQorICBcbGV0XGVuZGxpbmsgPSBccmVsYXgKKyAgXGxldFxsaW5rY29sb3IgPSBccmVsYXgKKyAgXGxldFxwZGZtYWtlb3V0bGluZXMgPSBccmVsYXgKK1xmaSAgJSBcaWZ4XHBkZm91dHB1dAorCisKK1xtZXNzYWdle2ZvbnRzLH0KKworJSBDaGFuZ2UgdGhlIGN1cnJlbnQgZm9udCBzdHlsZSB0byAjMSwgcmVtZW1iZXJpbmcgaXQgaW4gXGN1cmZvbnRzdHlsZS4KKyUgRm9yIG5vdywgd2UgZG8gbm90IGFjY3VtdWxhdGUgZm9udCBzdHlsZXM6IEBie0Bpe2Zvb319IHByaW50cyBmb28gaW4KKyUgaXRhbGljcywgbm90IGJvbGQgaXRhbGljcy4KKyUKK1xkZWZcc2V0Zm9udHN0eWxlIzF7JQorICBcZGVmXGN1cmZvbnRzdHlsZXsjMX0lIG5vdCBhcyBhIGNvbnRyb2wgc2VxdWVuY2UsIGJlY2F1c2Ugd2UgYXJlIFxlZGVmJ2QuCisgIFxjc25hbWUgdGVuIzFcZW5kY3NuYW1lICAlIGNoYW5nZSB0aGUgY3VycmVudCBmb250Cit9CisKKyUgU2VsZWN0ICMxIGZvbnRzIHdpdGggdGhlIGN1cnJlbnQgc3R5bGUuCislCitcZGVmXHNlbGVjdGZvbnRzIzF7XGNzbmFtZSAjMWZvbnRzXGVuZGNzbmFtZSBcY3NuYW1lXGN1cmZvbnRzdHlsZVxlbmRjc25hbWV9CisKK1xkZWZccm17XGZhbT0wIFxzZXRmb250c3R5bGV7cm19fQorXGRlZlxpdHtcZmFtPVxpdGZhbSBcc2V0Zm9udHN0eWxle2l0fX0KK1xkZWZcc2x7XGZhbT1cc2xmYW0gXHNldGZvbnRzdHlsZXtzbH19CitcZGVmXGJme1xmYW09XGJmZmFtIFxzZXRmb250c3R5bGV7YmZ9fVxkZWZcYmZzdHlsZW5hbWV7YmZ9CitcZGVmXHR0e1xmYW09XHR0ZmFtIFxzZXRmb250c3R5bGV7dHR9fQorCislIFRleGluZm8gc29ydCBvZiBzdXBwb3J0cyB0aGUgc2FucyBzZXJpZiBmb250IHN0eWxlLCB3aGljaCBwbGFpbiBUZVggZG9lcyBub3QuCislIFNvIHdlIHNldCB1cCBhIFxzZi4KK1xuZXdmYW1cc2ZmYW0KK1xkZWZcc2Z7XGZhbT1cc2ZmYW0gXHNldGZvbnRzdHlsZXtzZn19CitcbGV0XGxpID0gXHNmICUgU29tZXRpbWVzIHdlIGNhbGwgaXQgXGxpLCBub3QgXHNmLgorCislIFdlIGRvbid0IG5lZWQgbWF0aCBmb3IgdGhpcyBmb250IHN0eWxlLgorXGRlZlx0dHNse1xzZXRmb250c3R5bGV7dHRzbH19CisKKyUgRGVmYXVsdCBsZWFkaW5nLgorXG5ld2RpbWVuXHRleHRsZWFkaW5nICBcdGV4dGxlYWRpbmcgPSAxMy4ycHQKKworJSBTZXQgdGhlIGJhc2VsaW5lc2tpcCB0byAjMSwgYW5kIHRoZSBsaW5lc2tpcCBhbmQgc3RydXQgc2l6ZQorJSBjb3JyZXNwb25kaW5nbHkuICBUaGVyZSBpcyBubyBkZWVwIG1lYW5pbmcgYmVoaW5kIHRoZXNlIG1hZ2ljIG51bWJlcnMKKyUgdXNlZCBhcyBmYWN0b3JzOyB0aGV5IGp1c3QgbWF0Y2ggKGNsb3NlbHkgZW5vdWdoKSB3aGF0IEtudXRoIGRlZmluZWQuCislCitcZGVmXGxpbmVza2lwZmFjdG9yey4wODMzM30KK1xkZWZcc3RydXRoZWlnaHRwZXJjZW50ey43MDgzM30KK1xkZWZcc3RydXRkZXB0aHBlcmNlbnQgey4yOTE2N30KKyUKK1xkZWZcc2V0bGVhZGluZyMxeyUKKyAgXG5vcm1hbGJhc2VsaW5lc2tpcCA9ICMxXHJlbGF4CisgIFxub3JtYWxsaW5lc2tpcCA9IFxsaW5lc2tpcGZhY3Rvclxub3JtYWxiYXNlbGluZXNraXAKKyAgXG5vcm1hbGJhc2VsaW5lcworICBcc2V0Ym94XHN0cnV0Ym94ID1caGJveHslCisgICAgXHZydWxlIHdpZHRoMHB0IGhlaWdodFxzdHJ1dGhlaWdodHBlcmNlbnRcYmFzZWxpbmVza2lwCisgICAgICAgICAgICAgICAgICAgIGRlcHRoIFxzdHJ1dGRlcHRocGVyY2VudCBcYmFzZWxpbmVza2lwCisgIH0lCit9CisKKyUgU2V0IHRoZSBmb250IG1hY3JvICMxIHRvIHRoZSBmb250IG5hbWVkICMyLCBhZGRpbmcgb24gdGhlCislIHNwZWNpZmllZCBmb250IHByZWZpeCAobm9ybWFsbHkgYGNtJykuCislICMzIGlzIHRoZSBmb250J3MgZGVzaWduIHNpemUsICM0IGlzIGEgc2NhbGUgZmFjdG9yCitcZGVmXHNldGZvbnQjMSMyIzMjNHtcZm9udCMxPVxmb250cHJlZml4IzIjMyBzY2FsZWQgIzR9CisKKyUgVXNlIGNtIGFzIHRoZSBkZWZhdWx0IGZvbnQgcHJlZml4LgorJSBUbyBzcGVjaWZ5IHRoZSBmb250IHByZWZpeCwgeW91IG11c3QgZGVmaW5lIFxmb250cHJlZml4CislIGJlZm9yZSB5b3UgcmVhZCBpbiB0ZXhpbmZvLnRleC4KK1xpZnhcZm9udHByZWZpeFx1bmRlZmluZWQKK1xkZWZcZm9udHByZWZpeHtjbX0KK1xmaQorJSBTdXBwb3J0IGZvbnQgZmFtaWxpZXMgdGhhdCBkb24ndCB1c2UgdGhlIHNhbWUgbmFtaW5nIHNjaGVtZSBhcyBDTS4KK1xkZWZccm1zaGFwZXtyfQorXGRlZlxybWJzaGFwZXtieH0gICAgICAgICAgICAgICAld2hlcmUgdGhlIG5vcm1hbCBmYWNlIGlzIGJvbGQKK1xkZWZcYmZzaGFwZXtifQorXGRlZlxieHNoYXBle2J4fQorXGRlZlx0dHNoYXBle3R0fQorXGRlZlx0dGJzaGFwZXt0dH0KK1xkZWZcdHRzbHNoYXBle3NsdHR9CitcZGVmXGl0c2hhcGV7dGl9CitcZGVmXGl0YnNoYXBle2J4dGl9CitcZGVmXHNsc2hhcGV7c2x9CitcZGVmXHNsYnNoYXBle2J4c2x9CitcZGVmXHNmc2hhcGV7c3N9CitcZGVmXHNmYnNoYXBle3NzfQorXGRlZlxzY3NoYXBle2NzY30KK1xkZWZcc2Nic2hhcGV7Y3NjfQorCislIFRleHQgZm9udHMgKDExLjJwdCwgbWFnc3RlcDEpLgorXGRlZlx0ZXh0bm9taW5hbHNpemV7MTFwdH0KK1xlZGVmXG1haW5tYWdzdGVwe1xtYWdzdGVwaGFsZn0KK1xzZXRmb250XHRleHRybVxybXNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0dHRcdHRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dGJmXGJmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRpdFxpdHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0c2xcc2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dHNmXHNmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRzY1xzY3NoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0dHRzbFx0dHNsc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xmb250XHRleHRpPWNtbWkxMCBzY2FsZWQgXG1haW5tYWdzdGVwCitcZm9udFx0ZXh0c3k9Y21zeTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKKworJSBBIGZldyBmb250cyBmb3IgQGRlZnVuIG5hbWVzIGFuZCBhcmdzLgorXHNldGZvbnRcZGVmYmZcYmZzaGFwZXsxMH17XG1hZ3N0ZXAxfQorXHNldGZvbnRcZGVmdHRcdHRzaGFwZXsxMH17XG1hZ3N0ZXAxfQorXHNldGZvbnRcZGVmdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMX0KK1xkZWZcZGZ7XGxldFx0ZW50dD1cZGVmdHQgXGxldFx0ZW5iZiA9IFxkZWZiZiBcbGV0XHRlbnR0c2w9XGRlZnR0c2wgXGJmfQorCislIEZvbnRzIGZvciBpbmRpY2VzLCBmb290bm90ZXMsIHNtYWxsIGV4YW1wbGVzICg5cHQpLgorXGRlZlxzbWFsbG5vbWluYWxzaXplezlwdH0KK1xzZXRmb250XHNtYWxscm1ccm1zaGFwZXs5fXsxMDAwfQorXHNldGZvbnRcc21hbGx0dFx0dHNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGJmXGJmc2hhcGV7MTB9ezkwMH0KK1xzZXRmb250XHNtYWxsaXRcaXRzaGFwZXs5fXsxMDAwfQorXHNldGZvbnRcc21hbGxzbFxzbHNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbHNmXHNmc2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHNtYWxsc2Ncc2NzaGFwZXsxMH17OTAwfQorXHNldGZvbnRcc21hbGx0dHNsXHR0c2xzaGFwZXsxMH17OTAwfQorXGZvbnRcc21hbGxpPWNtbWk5CitcZm9udFxzbWFsbHN5PWNtc3k5CisKKyUgRm9udHMgZm9yIHNtYWxsIGV4YW1wbGVzICg4cHQpLgorXGRlZlxzbWFsbGVybm9taW5hbHNpemV7OHB0fQorXHNldGZvbnRcc21hbGxlcnJtXHJtc2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJ0dFx0dHNoYXBlezh9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGVyYmZcYmZzaGFwZXsxMH17ODAwfQorXHNldGZvbnRcc21hbGxlcml0XGl0c2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJzbFxzbHNoYXBlezh9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGVyc2Zcc2ZzaGFwZXs4fXsxMDAwfQorXHNldGZvbnRcc21hbGxlcnNjXHNjc2hhcGV7MTB9ezgwMH0KK1xzZXRmb250XHNtYWxsZXJ0dHNsXHR0c2xzaGFwZXsxMH17ODAwfQorXGZvbnRcc21hbGxlcmk9Y21taTgKK1xmb250XHNtYWxsZXJzeT1jbXN5OAorCislIEZvbnRzIGZvciB0aXRsZSBwYWdlICgyMC40cHQpOgorXGRlZlx0aXRsZW5vbWluYWxzaXplezIwcHR9Citcc2V0Zm9udFx0aXRsZXJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDN9Citcc2V0Zm9udFx0aXRsZWl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDR9Citcc2V0Zm9udFx0aXRsZXNsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDR9Citcc2V0Zm9udFx0aXRsZXR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDN9Citcc2V0Zm9udFx0aXRsZXR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDR9Citcc2V0Zm9udFx0aXRsZXNmXHNmYnNoYXBlezE3fXtcbWFnc3RlcDF9CitcbGV0XHRpdGxlYmY9XHRpdGxlcm0KK1xzZXRmb250XHRpdGxlc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwNH0KK1xmb250XHRpdGxlaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMworXGZvbnRcdGl0bGVzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwNAorXGRlZlxhdXRob3JybXtcc2Vjcm19CitcZGVmXGF1dGhvcnR0e1xzZWN0dH0KKworJSBDaGFwdGVyIChhbmQgdW5udW1iZXJlZCkgZm9udHMgKDE3LjI4cHQpLgorXGRlZlxjaGFwbm9taW5hbHNpemV7MTdwdH0KK1xzZXRmb250XGNoYXBybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAyfQorXHNldGZvbnRcY2hhcGl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDN9Citcc2V0Zm9udFxjaGFwc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwM30KK1xzZXRmb250XGNoYXB0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAyfQorXHNldGZvbnRcY2hhcHR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDN9Citcc2V0Zm9udFxjaGFwc2Zcc2Zic2hhcGV7MTd9ezEwMDB9CitcbGV0XGNoYXBiZj1cY2hhcHJtCitcc2V0Zm9udFxjaGFwc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwM30KK1xmb250XGNoYXBpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAyCitcZm9udFxjaGFwc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDMKKworJSBTZWN0aW9uIGZvbnRzICgxNC40cHQpLgorXGRlZlxzZWNub21pbmFsc2l6ZXsxNHB0fQorXHNldGZvbnRcc2Vjcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwMX0KK1xzZXRmb250XHNlY2l0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxzZWNzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAyfQorXHNldGZvbnRcc2VjdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwMX0KK1xzZXRmb250XHNlY3R0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxzZWNzZlxzZmJzaGFwZXsxMn17XG1hZ3N0ZXAxfQorXGxldFxzZWNiZlxzZWNybQorXHNldGZvbnRcc2Vjc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwMn0KK1xmb250XHNlY2k9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDEKK1xmb250XHNlY3N5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXAyCisKKyUgU3Vic2VjdGlvbiBmb250cyAoMTMuMTVwdCkuCitcZGVmXHNzZWNub21pbmFsc2l6ZXsxM3B0fQorXHNldGZvbnRcc3NlY3JtXHJtYnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Citcc2V0Zm9udFxzc2VjaXRcaXRic2hhcGV7MTB9ezEzMTV9Citcc2V0Zm9udFxzc2Vjc2xcc2xic2hhcGV7MTB9ezEzMTV9Citcc2V0Zm9udFxzc2VjdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KK1xzZXRmb250XHNzZWN0dHNsXHR0c2xzaGFwZXsxMH17MTMxNX0KK1xzZXRmb250XHNzZWNzZlxzZmJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQorXGxldFxzc2VjYmZcc3NlY3JtCitcc2V0Zm9udFxzc2Vjc2Ncc2Nic2hhcGV7MTB9ezEzMTV9CitcZm9udFxzc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwaGFsZgorXGZvbnRcc3NlY3N5PWNtc3kxMCBzY2FsZWQgMTMxNQorCislIFJlZHVjZWQgZm9udHMgZm9yIEBhY3JvIGluIHRleHQgKDEwcHQpLgorXGRlZlxyZWR1Y2Vkbm9taW5hbHNpemV7MTBwdH0KK1xzZXRmb250XHJlZHVjZWRybVxybXNoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZHR0XHR0c2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2VkYmZcYmZzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRpdFxpdHNoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZHNsXHNsc2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2Vkc2Zcc2ZzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRzY1xzY3NoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZHR0c2xcdHRzbHNoYXBlezEwfXsxMDAwfQorXGZvbnRccmVkdWNlZGk9Y21taTEwCitcZm9udFxyZWR1Y2Vkc3k9Y21zeTEwCisKKyUgSW4gb3JkZXIgZm9yIHRoZSBmb250IGNoYW5nZXMgdG8gYWZmZWN0IG1vc3QgbWF0aCBzeW1ib2xzIGFuZCBsZXR0ZXJzLAorJSB3ZSBoYXZlIHRvIGRlZmluZSB0aGUgXHRleHRmb250IG9mIHRoZSBzdGFuZGFyZCBmYW1pbGllcy4gIFNpbmNlCislIHRleGluZm8gZG9lc24ndCBhbGxvdyBmb3IgcHJvZHVjaW5nIHN1YnNjcmlwdHMgYW5kIHN1cGVyc2NyaXB0cyBleGNlcHQKKyUgaW4gdGhlIG1haW4gdGV4dCwgd2UgZG9uJ3QgYm90aGVyIHRvIHJlc2V0IFxzY3JpcHRmb250IGFuZAorJSBcc2NyaXB0c2NyaXB0Zm9udCAod2hpY2ggd291bGQgYWxzbyByZXF1aXJlIGxvYWRpbmcgYSBsb3QgbW9yZSBmb250cykuCislCitcZGVmXHJlc2V0bWF0aGZvbnRzeyUKKyAgXHRleHRmb250MD1cdGVucm0gXHRleHRmb250MT1cdGVuaSBcdGV4dGZvbnQyPVx0ZW5zeQorICBcdGV4dGZvbnRcaXRmYW09XHRlbml0IFx0ZXh0Zm9udFxzbGZhbT1cdGVuc2wgXHRleHRmb250XGJmZmFtPVx0ZW5iZgorICBcdGV4dGZvbnRcdHRmYW09XHRlbnR0IFx0ZXh0Zm9udFxzZmZhbT1cdGVuc2YKK30KKworJSBUaGUgZm9udC1jaGFuZ2luZyBjb21tYW5kcyByZWRlZmluZSB0aGUgbWVhbmluZ3Mgb2YgXHRlblNUWUxFLCBpbnN0ZWFkCislIG9mIGp1c3QgXFNUWUxFLiAgV2UgZG8gdGhpcyBiZWNhdXNlIFxTVFlMRSBuZWVkcyB0byBhbHNvIHNldCB0aGUKKyUgY3VycmVudCBcZmFtIGZvciBtYXRoIG1vZGUuICBPdXIgXFNUWUxFIChlLmcuLCBccm0pIGNvbW1hbmRzIGhhcmR3aXJlCislIFx0ZW5TVFlMRSB0byBzZXQgdGhlIGN1cnJlbnQgZm9udC4KKyUKKyUgRWFjaCBmb250LWNoYW5naW5nIGNvbW1hbmQgYWxzbyBzZXRzIHRoZSBuYW1lcyBcbHNpemUgKG9uZSBzaXplIGxvd2VyKQorJSBhbmQgXGxsbHNpemUgKHRocmVlIHNpemVzIGxvd2VyKS4gIFRoZXNlIHJlbGF0aXZlIGNvbW1hbmRzIGFyZSB1c2VkIGluCislIHRoZSBMYVRlWCBsb2dvIGFuZCBhY3Jvbnltcy4KKyUKKyUgVGhpcyBhbGwgbmVlZHMgZ2VuZXJhbGl6aW5nLCBiYWRseS4KKyUKK1xkZWZcdGV4dGZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cdGV4dHJtIFxsZXRcdGVuaXQ9XHRleHRpdCBcbGV0XHRlbnNsPVx0ZXh0c2wKKyAgXGxldFx0ZW5iZj1cdGV4dGJmIFxsZXRcdGVudHQ9XHRleHR0dCBcbGV0XHNtYWxsY2Fwcz1cdGV4dHNjCisgIFxsZXRcdGVuc2Y9XHRleHRzZiBcbGV0XHRlbmk9XHRleHRpIFxsZXRcdGVuc3k9XHRleHRzeQorICBcbGV0XHRlbnR0c2w9XHRleHR0dHNsCisgIFxkZWZcY3VyZm9udHNpemV7dGV4dH0lCisgIFxkZWZcbHNpemV7cmVkdWNlZH1cZGVmXGxsbHNpemV7c21hbGxlcn0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3tcdGV4dGxlYWRpbmd9fQorXGRlZlx0aXRsZWZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cdGl0bGVybSBcbGV0XHRlbml0PVx0aXRsZWl0IFxsZXRcdGVuc2w9XHRpdGxlc2wKKyAgXGxldFx0ZW5iZj1cdGl0bGViZiBcbGV0XHRlbnR0PVx0aXRsZXR0IFxsZXRcc21hbGxjYXBzPVx0aXRsZXNjCisgIFxsZXRcdGVuc2Y9XHRpdGxlc2YgXGxldFx0ZW5pPVx0aXRsZWkgXGxldFx0ZW5zeT1cdGl0bGVzeQorICBcbGV0XHRlbnR0c2w9XHRpdGxldHRzbAorICBcZGVmXGN1cmZvbnRzaXple3RpdGxlfSUKKyAgXGRlZlxsc2l6ZXtjaGFwfVxkZWZcbGxsc2l6ZXtzdWJzZWN9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MjVwdH19CitcZGVmXHRpdGxlZm9udCMxe3tcdGl0bGVmb250c1xybSAjMX19CitcZGVmXGNoYXBmb250c3slCisgIFxsZXRcdGVucm09XGNoYXBybSBcbGV0XHRlbml0PVxjaGFwaXQgXGxldFx0ZW5zbD1cY2hhcHNsCisgIFxsZXRcdGVuYmY9XGNoYXBiZiBcbGV0XHRlbnR0PVxjaGFwdHQgXGxldFxzbWFsbGNhcHM9XGNoYXBzYworICBcbGV0XHRlbnNmPVxjaGFwc2YgXGxldFx0ZW5pPVxjaGFwaSBcbGV0XHRlbnN5PVxjaGFwc3kKKyAgXGxldFx0ZW50dHNsPVxjaGFwdHRzbAorICBcZGVmXGN1cmZvbnRzaXple2NoYXB9JQorICBcZGVmXGxzaXple3NlY31cZGVmXGxsbHNpemV7dGV4dH0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxOXB0fX0KK1xkZWZcc2VjZm9udHN7JQorICBcbGV0XHRlbnJtPVxzZWNybSBcbGV0XHRlbml0PVxzZWNpdCBcbGV0XHRlbnNsPVxzZWNzbAorICBcbGV0XHRlbmJmPVxzZWNiZiBcbGV0XHRlbnR0PVxzZWN0dCBcbGV0XHNtYWxsY2Fwcz1cc2Vjc2MKKyAgXGxldFx0ZW5zZj1cc2Vjc2YgXGxldFx0ZW5pPVxzZWNpIFxsZXRcdGVuc3k9XHNlY3N5CisgIFxsZXRcdGVudHRzbD1cc2VjdHRzbAorICBcZGVmXGN1cmZvbnRzaXple3NlY30lCisgIFxkZWZcbHNpemV7c3Vic2VjfVxkZWZcbGxsc2l6ZXtyZWR1Y2VkfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE2cHR9fQorXGRlZlxzdWJzZWNmb250c3slCisgIFxsZXRcdGVucm09XHNzZWNybSBcbGV0XHRlbml0PVxzc2VjaXQgXGxldFx0ZW5zbD1cc3NlY3NsCisgIFxsZXRcdGVuYmY9XHNzZWNiZiBcbGV0XHRlbnR0PVxzc2VjdHQgXGxldFxzbWFsbGNhcHM9XHNzZWNzYworICBcbGV0XHRlbnNmPVxzc2Vjc2YgXGxldFx0ZW5pPVxzc2VjaSBcbGV0XHRlbnN5PVxzc2Vjc3kKKyAgXGxldFx0ZW50dHNsPVxzc2VjdHRzbAorICBcZGVmXGN1cmZvbnRzaXple3NzZWN9JQorICBcZGVmXGxzaXple3RleHR9XGRlZlxsbGxzaXple3NtYWxsfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE1cHR9fQorXGxldFxzdWJzdWJzZWNmb250cyA9IFxzdWJzZWNmb250cworXGRlZlxyZWR1Y2VkZm9udHN7JQorICBcbGV0XHRlbnJtPVxyZWR1Y2Vkcm0gXGxldFx0ZW5pdD1ccmVkdWNlZGl0IFxsZXRcdGVuc2w9XHJlZHVjZWRzbAorICBcbGV0XHRlbmJmPVxyZWR1Y2VkYmYgXGxldFx0ZW50dD1ccmVkdWNlZHR0IFxsZXRccmVkdWNlZGNhcHM9XHJlZHVjZWRzYworICBcbGV0XHRlbnNmPVxyZWR1Y2Vkc2YgXGxldFx0ZW5pPVxyZWR1Y2VkaSBcbGV0XHRlbnN5PVxyZWR1Y2Vkc3kKKyAgXGxldFx0ZW50dHNsPVxyZWR1Y2VkdHRzbAorICBcZGVmXGN1cmZvbnRzaXple3JlZHVjZWR9JQorICBcZGVmXGxzaXple3NtYWxsfVxkZWZcbGxsc2l6ZXtzbWFsbGVyfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezEwLjVwdH19CitcZGVmXHNtYWxsZm9udHN7JQorICBcbGV0XHRlbnJtPVxzbWFsbHJtIFxsZXRcdGVuaXQ9XHNtYWxsaXQgXGxldFx0ZW5zbD1cc21hbGxzbAorICBcbGV0XHRlbmJmPVxzbWFsbGJmIFxsZXRcdGVudHQ9XHNtYWxsdHQgXGxldFxzbWFsbGNhcHM9XHNtYWxsc2MKKyAgXGxldFx0ZW5zZj1cc21hbGxzZiBcbGV0XHRlbmk9XHNtYWxsaSBcbGV0XHRlbnN5PVxzbWFsbHN5CisgIFxsZXRcdGVudHRzbD1cc21hbGx0dHNsCisgIFxkZWZcY3VyZm9udHNpemV7c21hbGx9JQorICBcZGVmXGxzaXple3NtYWxsZXJ9XGRlZlxsbGxzaXple3NtYWxsZXJ9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTAuNXB0fX0KK1xkZWZcc21hbGxlcmZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cc21hbGxlcnJtIFxsZXRcdGVuaXQ9XHNtYWxsZXJpdCBcbGV0XHRlbnNsPVxzbWFsbGVyc2wKKyAgXGxldFx0ZW5iZj1cc21hbGxlcmJmIFxsZXRcdGVudHQ9XHNtYWxsZXJ0dCBcbGV0XHNtYWxsY2Fwcz1cc21hbGxlcnNjCisgIFxsZXRcdGVuc2Y9XHNtYWxsZXJzZiBcbGV0XHRlbmk9XHNtYWxsZXJpIFxsZXRcdGVuc3k9XHNtYWxsZXJzeQorICBcbGV0XHRlbnR0c2w9XHNtYWxsZXJ0dHNsCisgIFxkZWZcY3VyZm9udHNpemV7c21hbGxlcn0lCisgIFxkZWZcbHNpemV7c21hbGxlcn1cZGVmXGxsbHNpemV7c21hbGxlcn0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3s5LjVwdH19CisKKyUgU2V0IHRoZSBmb250cyB0byB1c2Ugd2l0aCB0aGUgQHNtYWxsLi4uIGVudmlyb25tZW50cy4KK1xsZXRcc21hbGxleGFtcGxlZm9udHMgPSBcc21hbGxmb250cworCislIEFib3V0IFxzbWFsbGV4YW1wbGVmb250cy4gIElmIHdlIHVzZSBcc21hbGxmb250cyAoOXB0KSwgQHNtYWxsZXhhbXBsZQorJSBjYW4gZml0IHRoaXMgbWFueSBjaGFyYWN0ZXJzOgorJSAgIDguNXgxMT04NiAgIHNtYWxsYm9vaz03MiAgYTQ9OTAgIGE1PTY5CislIElmIHdlIHVzZSBcc2NyaXB0Zm9udHMgKDhwdCksIHRoZW4gd2UgY2FuIGZpdCB0aGlzIG1hbnkgY2hhcmFjdGVyczoKKyUgICA4LjV4MTE9OTArICBzbWFsbGJvb2s9ODAgIGE0PTkwKyAgYTU9NzcKKyUgRm9yIG1lLCBzdWJqZWN0aXZlbHksIHRoZSBmZXcgZXh0cmEgY2hhcmFjdGVycyB0aGF0IGZpdCBhcmVuJ3Qgd29ydGgKKyUgdGhlIGFkZGl0aW9uYWwgc21hbGxuZXNzIG9mIDhwdC4gIFNvIEknbSBtYWtpbmcgdGhlIGRlZmF1bHQgOXB0LgorJQorJSBCeSB0aGUgd2F5LCBmb3IgY29tcGFyaXNvbiwgaGVyZSdzIHdoYXQgZml0cyB3aXRoIEBleGFtcGxlICgxMHB0KToKKyUgICA4LjV4MTE9NzEgIHNtYWxsYm9vaz02MCAgYTQ9NzUgIGE1PTU4CislCislIEkgd2lzaCB0aGUgVVNBIHVzZWQgQTQgcGFwZXIuCislIC0ta2FybCwgMjRqYW4wMy4KKworCislIFNldCB1cCB0aGUgZGVmYXVsdCBmb250cywgc28gd2UgY2FuIHVzZSB0aGVtIGZvciBjcmVhdGluZyBib3hlcy4KKyUKK1x0ZXh0Zm9udHMgXHJtCisKKyUgRGVmaW5lIHRoZXNlIHNvIHRoZXkgY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGZvciBvdGhlciBmb250cy4KK1xkZWZcYW5nbGVsZWZ0eyRcbGFuZ2xlJH0KK1xkZWZcYW5nbGVyaWdodHskXHJhbmdsZSR9CisKKyUgQ291bnQgZGVwdGggaW4gZm9udC1jaGFuZ2VzLCBmb3IgZXJyb3IgY2hlY2tzCitcbmV3Y291bnRcZm9udGRlcHRoIFxmb250ZGVwdGg9MAorCislIEZvbnRzIGZvciBzaG9ydCB0YWJsZSBvZiBjb250ZW50cy4KK1xzZXRmb250XHNob3J0Y29udHJtXHJtc2hhcGV7MTJ9ezEwMDB9Citcc2V0Zm9udFxzaG9ydGNvbnRiZlxiZnNoYXBlezEwfXtcbWFnc3RlcDF9ICAlIG5vIGNtYjEyCitcc2V0Zm9udFxzaG9ydGNvbnRzbFxzbHNoYXBlezEyfXsxMDAwfQorXHNldGZvbnRcc2hvcnRjb250dHRcdHRzaGFwZXsxMn17MTAwMH0KKworJSUgQWRkIHNjcmliZS1saWtlIGZvbnQgZW52aXJvbm1lbnRzLCBwbHVzIEBsIGZvciBpbmxpbmUgbGlzcCAodXN1YWxseSBzYW5zCislJSBzZXJpZikgYW5kIEBpaSBmb3IgVGVYIGl0YWxpYworCislIFxzbWFydGl0YWxpY3tBUkd9IG91dHB1dHMgYXJnIGluIGl0YWxpY3MsIGZvbGxvd2VkIGJ5IGFuIGl0YWxpYyBjb3JyZWN0aW9uCislIHVubGVzcyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlciBpcyBzdWNoIGFzIG5vdCB0byBuZWVkIG9uZS4KK1xkZWZcc21hcnRpdGFsaWN4e1xpZnhcbmV4dCxcZWxzZVxpZnhcbmV4dC1cZWxzZVxpZnhcbmV4dC5cZWxzZQorICAgICAgICAgICAgICAgICAgICBccHRleHNsYXNoXGZpXGZpXGZpfQorXGRlZlxzbWFydHNsYW50ZWQjMXt7XGlmdXNpbmd0dFx0dHNsXHNsICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9CitcZGVmXHNtYXJ0aXRhbGljIzF7e1xpZnVzaW5ndHRcdHRzbFxpdCAjMX1cZnV0dXJlbGV0XG5leHRcc21hcnRpdGFsaWN4fQorCislIGxpa2UgXHNtYXJ0c2xhbnRlZCBleGNlcHQgdW5jb25kaXRpb25hbGx5IHVzZXMgXHR0c2wuCislIEB2YXIgaXMgc2V0IHRvIHRoaXMgZm9yIGRlZnVuIGFyZ3VtZW50cy4KK1xkZWZcdHRzbGFudGVkIzF7e1x0dHNsICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9CisKKyUgbGlrZSBcc21hcnRzbGFudGVkIGV4Y2VwdCB1bmNvbmRpdGlvbmFsbHkgdXNlIFxzbC4gIFdlIG5ldmVyIHdhbnQKKyUgdHRzbCBmb3IgYm9vayB0aXRsZXMsIGRvIHdlPworXGRlZlxjaXRlIzF7e1xzbCAjMX1cZnV0dXJlbGV0XG5leHRcc21hcnRpdGFsaWN4fQorCitcbGV0XGk9XHNtYXJ0aXRhbGljCitcbGV0XHNsYW50ZWQ9XHNtYXJ0c2xhbnRlZAorXGxldFx2YXI9XHNtYXJ0c2xhbnRlZAorXGxldFxkZm49XHNtYXJ0c2xhbnRlZAorXGxldFxlbXBoPVxzbWFydGl0YWxpYworCislIEBiLCBleHBsaWNpdCBib2xkLgorXGRlZlxiIzF7e1xiZiAjMX19CitcbGV0XHN0cm9uZz1cYgorCislIEBzYW5zc2VyaWYsIGV4cGxpY2l0IHNhbnMuCitcZGVmXHNhbnNzZXJpZiMxe3tcc2YgIzF9fQorCislIFdlIGNhbid0IGp1c3QgdXNlIFxleGh5cGhlbnBlbmFsdHksIGJlY2F1c2UgdGhhdCBvbmx5IGhhcyBlZmZlY3QgYXQKKyUgdGhlIGVuZCBvZiBhIHBhcmFncmFwaC4gIFJlc3RvcmUgbm9ybWFsIGh5cGhlbmF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlCislIGdyb3VwIHdpdGhpbiB3aGljaCBcbm9oeXBoZW5hdGlvbiBpcyBwcmVzdW1hYmx5IGNhbGxlZC4KKyUKK1xkZWZcbm9oeXBoZW5hdGlvbntcaHlwaGVuY2hhclxmb250ID0gLTEgIFxhZnRlcmdyb3VwXHJlc3RvcmVoeXBoZW5hdGlvbn0KK1xkZWZccmVzdG9yZWh5cGhlbmF0aW9ue1xoeXBoZW5jaGFyXGZvbnQgPSBgLSB9CisKKyUgU2V0IHNmY29kZSB0byBub3JtYWwgZm9yIHRoZSBjaGFycyB0aGF0IHVzdWFsbHkgaGF2ZSBhbm90aGVyIHZhbHVlLgorJSBDYW4ndCB1c2UgcGxhaW4ncyBcZnJlbmNoc3BhY2luZyBiZWNhdXNlIGl0IHVzZXMgdGhlIGBceCBub3RhdGlvbiwgYW5kCislIHNvbWV0aW1lcyBceCBoYXMgYW4gYWN0aXZlIGRlZmluaXRpb24gdGhhdCBtZXNzZXMgdGhpbmdzIHVwLgorJQorXGNhdGNvZGVgQD0xMQorICBcZGVmXHBsYWluZnJlbmNoc3BhY2luZ3slCisgICAgXHNmY29kZVxkb3RDaGFyICA9XEBtIFxzZmNvZGVccXVlc3RDaGFyPVxAbSBcc2Zjb2RlXGV4Y2xhbUNoYXI9XEBtCisgICAgXHNmY29kZVxjb2xvbkNoYXI9XEBtIFxzZmNvZGVcc2VtaUNoYXIgPVxAbSBcc2Zjb2RlXGNvbW1hQ2hhciA9XEBtCisgICAgXGRlZlxlbmRvZnNlbnRlbmNlc3BhY2VmYWN0b3J7MTAwMH0lIGZvciBALiBhbmQgZnJpZW5kcworICB9CisgIFxkZWZccGxhaW5ub25mcmVuY2hzcGFjaW5neyUKKyAgICBcc2Zjb2RlYFwuMzAwMFxzZmNvZGVgXD8zMDAwXHNmY29kZWBcITMwMDAKKyAgICBcc2Zjb2RlYFw6MjAwMFxzZmNvZGVgXDsxNTAwXHNmY29kZWBcLDEyNTAKKyAgICBcZGVmXGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvcnszMDAwfSUgZm9yIEAuIGFuZCBmcmllbmRzCisgIH0KK1xjYXRjb2RlYEA9XG90aGVyCitcZGVmXGVuZG9mc2VudGVuY2VzcGFjZWZhY3RvcnszMDAwfSUgZGVmYXVsdAorCitcZGVmXHQjMXslCisgIHtcdHQgXHJhd2JhY2tzbGFzaCBccGxhaW5mcmVuY2hzcGFjaW5nICMxfSUKKyAgXG51bGwKK30KK1xkZWZcc2FtcCMxe2BcdGNsb3NleyMxfSdcbnVsbH0KK1xzZXRmb250XGtleXJtXHJtc2hhcGV7OH17MTAwMH0KK1xmb250XGtleXN5PWNtc3k5CitcZGVmXGtleSMxe3tca2V5cm1cdGV4dGZvbnQyPVxrZXlzeSBcbGVhdmV2bW9kZVxoYm94eyUKKyAgXHJhaXNlMC40cHRcaGJveHtcYW5nbGVsZWZ0fVxrZXJuLS4wOGVtXHZ0b3B7JQorICAgIFx2Ym94e1xocnVsZVxrZXJuLTAuNHB0CisgICAgIFxoYm94e1xyYWlzZTAuNHB0XGhib3h7XHZwaGFudG9te1xhbmdsZWxlZnR9fSMxfX0lCisgICAgXGtlcm4tMC40cHRcaHJ1bGV9JQorICBca2Vybi0uMDZlbVxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlcmlnaHR9fX19CislIFRoZSBvbGQgZGVmaW5pdGlvbiwgd2l0aCBubyBsb3plbmdlOgorJVxkZWZca2V5ICMxe3tcdHRzbCBcbm9oeXBoZW5hdGlvbiBcdXBwZXJjYXNleyMxfX1cbnVsbH0KK1xkZWZcY3RybCAjMXt7XHR0IFxyYXdiYWNrc2xhc2ggXGhhdH0jMX0KKworJSBAZmlsZSwgQG9wdGlvbiBhcmUgdGhlIHNhbWUgYXMgQHNhbXAuCitcbGV0XGZpbGU9XHNhbXAKK1xsZXRcb3B0aW9uPVxzYW1wCisKKyUgQGNvZGUgaXMgYSBtb2RpZmljYXRpb24gb2YgQHQsCislIHdoaWNoIG1ha2VzIHNwYWNlcyB0aGUgc2FtZSBzaXplIGFzIG5vcm1hbCBpbiB0aGUgc3Vycm91bmRpbmcgdGV4dC4KK1xkZWZcdGNsb3NlIzF7JQorICB7JQorICAgICUgQ2hhbmdlIG5vcm1hbCBpbnRlcndvcmQgc3BhY2UgdG8gYmUgc2FtZSBhcyBmb3IgdGhlIGN1cnJlbnQgZm9udC4KKyAgICBcc3BhY2Vza2lwID0gXGZvbnRkaW1lbjJcZm9udAorICAgICUKKyAgICAlIFN3aXRjaCB0byB0eXBld3JpdGVyLgorICAgIFx0dAorICAgICUKKyAgICAlIEJ1dCBgXCAnIHByb2R1Y2VzIHRoZSBsYXJnZSB0eXBld3JpdGVyIGludGVyd29yZCBzcGFjZS4KKyAgICBcZGVmXCB7e1xzcGFjZXNraXAgPSAwcHR7fSB9fSUKKyAgICAlCisgICAgJSBUdXJuIG9mZiBoeXBoZW5hdGlvbi4KKyAgICBcbm9oeXBoZW5hdGlvbgorICAgICUKKyAgICBccmF3YmFja3NsYXNoCisgICAgXHBsYWluZnJlbmNoc3BhY2luZworICAgICMxJQorICB9JQorICBcbnVsbAorfQorCislIFdlICptdXN0KiB0dXJuIG9uIGh5cGhlbmF0aW9uIGF0IGAtJyBhbmQgYF8nIGluIEBjb2RlLgorJSBPdGhlcndpc2UsIGl0IGlzIHRvbyBoYXJkIHRvIGF2b2lkIG92ZXJmdWxsIGhib3hlcworJSBpbiB0aGUgRW1hY3MgbWFudWFsLCB0aGUgTGlicmFyeSBtYW51YWwsIGV0Yy4KKworJSBVbmZvcnR1bmF0ZWx5LCBUZVggdXNlcyBvbmUgcGFyYW1ldGVyIChcaHlwaGVuY2hhcikgdG8gY29udHJvbAorJSBib3RoIGh5cGhlbmF0aW9uIGF0IC0gYW5kIGh5cGhlbmF0aW9uIHdpdGhpbiB3b3Jkcy4KKyUgV2UgbXVzdCB0aGVyZWZvcmUgdHVybiB0aGVtIGJvdGggb2ZmIChcdGNsb3NlIGRvZXMgdGhhdCkKKyUgYW5kIGFycmFuZ2UgZXhwbGljaXRseSB0byBoeXBoZW5hdGUgYXQgYSBkYXNoLgorJSAgLS0gcm1zLgoreworICBcY2F0Y29kZWBcLT1cYWN0aXZlCisgIFxjYXRjb2RlYFxfPVxhY3RpdmUKKyAgJQorICBcZ2xvYmFsXGRlZlxjb2Rle1xiZWdpbmdyb3VwCisgICAgXGNhdGNvZGVgXC09XGFjdGl2ZSAgXGNhdGNvZGVgXF89XGFjdGl2ZQorICAgIFxpZmFsbG93Y29kZWJyZWFrcworICAgICBcbGV0LVxjb2RlZGFzaAorICAgICBcbGV0X1xjb2RldW5kZXIKKyAgICBcZWxzZQorICAgICBcbGV0LVxyZWFsZGFzaAorICAgICBcbGV0X1xyZWFsdW5kZXIKKyAgICBcZmkKKyAgICBcY29kZXgKKyAgfQorfQorCitcZGVmXHJlYWxkYXNoey19CitcZGVmXGNvZGVkYXNoey1cZGlzY3JldGlvbmFyeXt9e317fX0KK1xkZWZcY29kZXVuZGVyeyUKKyAgJSB0aGlzIGlzIGFsbCBzbyBAbWF0aHtAY29kZXt2YXJfbmFtZX0rMX0gY2FuIHdvcmsuICBJbiBtYXRoIG1vZGUsIF8KKyAgJSBpcyAiYWN0aXZlIiAobWF0aGNvZGUiODAwMCkgYW5kIFxub3JtYWx1bmRlcnNjb3JlIChvciBcY2hhcjk1LCBldGMuKQorICAlIHdpbGwgdGhlcmVmb3JlIGV4cGFuZCB0aGUgYWN0aXZlIGRlZmluaXRpb24gb2YgXywgd2hpY2ggaXMgdXMKKyAgJSAoaW5zaWRlIEBjb2RlIHRoYXQgaXMpLCB0aGVyZWZvcmUgYW4gZW5kbGVzcyBsb29wLgorICBcaWZ1c2luZ3R0e1xpZm1tb2RlCisgICAgICAgICAgICAgICBcbWF0aGNoYXIiMDc1RiAlIGNsYXNzIDA9b3JkaW5hcnksIGZhbWlseSA3PXR0ZmFtLCBwb3MgMHg1Rj1fLgorICAgICAgICAgICAgIFxlbHNlXG5vcm1hbHVuZGVyc2NvcmUgXGZpCisgICAgICAgICAgICAgXGRpc2NyZXRpb25hcnl7fXt9e319JQorICAgICAgICAgICAge1xffSUKK30KK1xkZWZcY29kZXggIzF7XHRjbG9zZXsjMX1cZW5kZ3JvdXB9CisKKyUgQW4gYWRkaXRpb25hbCBjb21wbGljYXRpb246IHRoZSBhYm92ZSB3aWxsIGFsbG93IGJyZWFrcyBhZnRlciwgZS5nLiwKKyUgZWFjaCBvZiB0aGUgZm91ciB1bmRlcnNjb3JlcyBpbiBfX3R5cGVvZl9fLiAgVGhpcyBpcyB1bmRlc2lyYWJsZSBpbgorJSBzb21lIG1hbnVhbHMsIGVzcGVjaWFsbHkgaWYgdGhleSBkb24ndCBoYXZlIGxvbmcgaWRlbnRpZmllcnMgaW4KKyUgZ2VuZXJhbC4gIEBhbGxvd2NvZGVicmVha3MgcHJvdmlkZXMgYSB3YXkgdG8gY29udHJvbCB0aGlzLgorJSAKK1xuZXdpZlxpZmFsbG93Y29kZWJyZWFrcyAgXGFsbG93Y29kZWJyZWFrc3RydWUKKworXGRlZlxrZXl3b3JkdHJ1ZXt0cnVlfQorXGRlZlxrZXl3b3JkZmFsc2V7ZmFsc2V9CisKK1xwYXJzZWFyZ2RlZlxhbGxvd2NvZGVicmVha3N7JQorICBcZGVmXHR4aWFyZ3sjMX0lCisgIFxpZnhcdHhpYXJnXGtleXdvcmR0cnVlCisgICAgXGFsbG93Y29kZWJyZWFrc3RydWUKKyAgXGVsc2VcaWZ4XHR4aWFyZ1xrZXl3b3JkZmFsc2UKKyAgICBcYWxsb3djb2RlYnJlYWtzZmFsc2UKKyAgXGVsc2UKKyAgICBcZXJyaGVscCA9IFxFTXNpbXBsZQorICAgIFxlcnJtZXNzYWdle1Vua25vd24gQGFsbG93Y29kZWJyZWFrcyBvcHRpb24gYFx0eGlhcmcnfSUKKyAgXGZpXGZpCit9CisKKyUgQGtiZCBpcyBsaWtlIEBjb2RlLCBleGNlcHQgdGhhdCBpZiB0aGUgYXJndW1lbnQgaXMganVzdCBvbmUgQGtleSBjb21tYW5kLAorJSB0aGVuIEBrYmQgaGFzIG5vIGVmZmVjdC4KKworJSBAa2JkaW5wdXRzdHlsZSAtLSBhcmcgaXMgYGRpc3RpbmN0JyAoQGtiZCB1c2VzIHNsYW50ZWQgdHR5IGZvbnQgYWx3YXlzKSwKKyUgICBgZXhhbXBsZScgKEBrYmQgdXNlcyB0dHNsIG9ubHkgaW5zaWRlIG9mIEBleGFtcGxlIGFuZCBmcmllbmRzKSwKKyUgICBvciBgY29kZScgKEBrYmQgdXNlcyBub3JtYWwgdHR5IGZvbnQgYWx3YXlzKS4KK1xwYXJzZWFyZ2RlZlxrYmRpbnB1dHN0eWxleyUKKyAgXGRlZlx0eGlhcmd7IzF9JQorICBcaWZ4XHR4aWFyZ1x3b3JkZGlzdGluY3QKKyAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dHNsfSUKKyAgXGVsc2VcaWZ4XHR4aWFyZ1x3b3JkZXhhbXBsZQorICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dHNsfVxnZGVmXGtiZGZvbnR7XHR0fSUKKyAgXGVsc2VcaWZ4XHR4aWFyZ1x3b3JkY29kZQorICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dH1cZ2RlZlxrYmRmb250e1x0dH0lCisgIFxlbHNlCisgICAgXGVycmhlbHAgPSBcRU1zaW1wbGUKKyAgICBcZXJybWVzc2FnZXtVbmtub3duIEBrYmRpbnB1dHN0eWxlIG9wdGlvbiBgXHR4aWFyZyd9JQorICBcZmlcZmlcZmkKK30KK1xkZWZcd29yZGRpc3RpbmN0e2Rpc3RpbmN0fQorXGRlZlx3b3JkZXhhbXBsZXtleGFtcGxlfQorXGRlZlx3b3JkY29kZXtjb2RlfQorCislIERlZmF1bHQgaXMgYGRpc3RpbmN0LicKK1xrYmRpbnB1dHN0eWxlIGRpc3RpbmN0CisKK1xkZWZceGtleXtca2V5fQorXGRlZlxrYmRmb28jMSMyIzNccGFye1xkZWZcb25leyMxfVxkZWZcdGhyZWV7IzN9XGRlZlx0aHJlZXh7Pz99JQorXGlmeFxvbmVceGtleVxpZnhcdGhyZWV4XHRocmVlIFxrZXl7IzJ9JQorXGVsc2V7XHRjbG9zZXtca2JkZm9udFxsb29rfX1cZmkKK1xlbHNle1x0Y2xvc2V7XGtiZGZvbnRcbG9va319XGZpfQorCislIEZvciBAaW5kaWNhdGV1cmwsIEBlbnYsIEBjb21tYW5kIHF1b3RlcyBzZWVtIHVubmVjZXNzYXJ5LCBzbyB1c2UgXGNvZGUuCitcbGV0XGluZGljYXRldXJsPVxjb2RlCitcbGV0XGVudj1cY29kZQorXGxldFxjb21tYW5kPVxjb2RlCisKKyUgQHVyZWYgKGFiYnJldmlhdGlvbiBmb3IgYHVybHJlZicpIHRha2VzIGFuIG9wdGlvbmFsIChjb21tYS1zZXBhcmF0ZWQpCislIHNlY29uZCBhcmd1bWVudCBzcGVjaWZ5aW5nIHRoZSB0ZXh0IHRvIGRpc3BsYXkgYW5kIGFuIG9wdGlvbmFsIHRoaXJkCislIGFyZyBhcyB0ZXh0IHRvIGRpc3BsYXkgaW5zdGVhZCBvZiAocmF0aGVyIHRoYW4gaW4gYWRkaXRpb24gdG8pIHRoZSB1cmwKKyUgaXRzZWxmLiAgRmlyc3QgKG1hbmRhdG9yeSkgYXJnIGlzIHRoZSB1cmwuICBQZXJoYXBzIGV2ZW50dWFsbHkgcHV0IGluCislIGEgaHlwZXJ0ZXggXHNwZWNpYWwgaGVyZS4KKyUKK1xkZWZcdXJlZiMxe1xkb3VyZWYgIzEsLCxcZmluaXNofQorXGRlZlxkb3VyZWYjMSwjMiwjMywjNFxmaW5pc2h7XGJlZ2luZ3JvdXAKKyAgXHVuc2Vwc3BhY2VzCisgIFxwZGZ1cmx7IzF9JQorICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzN9JQorICBcaWZkaW1cd2QwID4gMHB0CisgICAgXHVuaGJveDAgJSB0aGlyZCBhcmcgZ2l2ZW4sIHNob3cgb25seSB0aGF0CisgIFxlbHNlCisgICAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfSUKKyAgICBcaWZkaW1cd2QwID4gMHB0CisgICAgICBcaWZwZGYKKyAgICAgICAgXHVuaGJveDAgICAgICAgICAgICAgJSBQREY6IDJuZCBhcmcgZ2l2ZW4sIHNob3cgb25seSBpdAorICAgICAgXGVsc2UKKyAgICAgICAgXHVuaGJveDBcIChcY29kZXsjMX0pJSBEVkk6IDJuZCBhcmcgZ2l2ZW4sIHNob3cgYm90aCBpdCBhbmQgdXJsCisgICAgICBcZmkKKyAgICBcZWxzZQorICAgICAgXGNvZGV7IzF9JSBvbmx5IHVybCBnaXZlbiwgc28gc2hvdyBpdAorICAgIFxmaQorICBcZmkKKyAgXGVuZGxpbmsKK1xlbmRncm91cH0KKworJSBAdXJsIHN5bm9ueW0gZm9yIEB1cmVmLCBzaW5jZSB0aGF0J3MgaG93IGV2ZXJ5b25lIHVzZXMgaXQuCislCitcbGV0XHVybD1cdXJlZgorCislIHJtcyBkb2VzIG5vdCBsaWtlIGFuZ2xlIGJyYWNrZXRzIC0ta2FybCwgMTdtYXk5Ny4KKyUgU28gbm93IEBlbWFpbCBpcyBqdXN0IGxpa2UgQHVyZWYsIHVubGVzcyB3ZSBhcmUgcGRmLgorJQorJVxkZWZcZW1haWwjMXtcYW5nbGVsZWZ0e1x0dCAjMX1cYW5nbGVyaWdodH0KK1xpZnBkZgorICBcZGVmXGVtYWlsIzF7XGRvZW1haWwjMSwsXGZpbmlzaH0KKyAgXGRlZlxkb2VtYWlsIzEsIzIsIzNcZmluaXNoe1xiZWdpbmdyb3VwCisgICAgXHVuc2Vwc3BhY2VzCisgICAgXHBkZnVybHttYWlsdG86IzF9JQorICAgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn0lCisgICAgXGlmZGltXHdkMD4wcHRcdW5oYm94MFxlbHNlXGNvZGV7IzF9XGZpCisgICAgXGVuZGxpbmsKKyAgXGVuZGdyb3VwfQorXGVsc2UKKyAgXGxldFxlbWFpbD1cdXJlZgorXGZpCisKKyUgQ2hlY2sgaWYgd2UgYXJlIGN1cnJlbnRseSB1c2luZyBhIHR5cGV3cml0ZXIgZm9udC4gIFNpbmNlIGFsbCB0aGUKKyUgQ29tcHV0ZXIgTW9kZXJuIHR5cGV3cml0ZXIgZm9udHMgaGF2ZSB6ZXJvIGludGVyd29yZCBzdHJldGNoIChhbmQKKyUgc2hyaW5rKSwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0IGFsbCB0eXBld3JpdGVyIGZvbnRzIHRvIGhhdmUKKyUgdGhpcyBwcm9wZXJ0eSwgd2UgY2FuIGNoZWNrIHRoYXQgZm9udCBwYXJhbWV0ZXIuCislCitcZGVmXGlmbW9ub3NwYWNle1xpZmRpbVxmb250ZGltZW4zXGZvbnQ9MHB0IH0KKworJSBUeXBlc2V0IGEgZGltZW5zaW9uLCBlLmcuLCBgaW4nIG9yIGBwdCcuICBUaGUgb25seSByZWFzb24gZm9yIHRoZQorJSBhcmd1bWVudCBpcyB0byBtYWtlIHRoZSBpbnB1dCBsb29rIHJpZ2h0OiBAZG1ue3B0fSBpbnN0ZWFkIG9mIEBkbW57fXB0LgorJQorXGRlZlxkbW4jMXtcdGhpbnNwYWNlICMxfQorCitcZGVmXGtiZCMxe1xkZWZcbG9va3sjMX1cZXhwYW5kYWZ0ZXJca2JkZm9vXGxvb2s/P1xwYXJ9CisKKyUgQGwgd2FzIG5ldmVyIGRvY3VtZW50ZWQgdG8gbWVhbiBgYHN3aXRjaCB0byB0aGUgTGlzcCBmb250JycsCislIGFuZCBpdCBpcyBub3QgdXNlZCBhcyBzdWNoIGluIGFueSBtYW51YWwgSSBjYW4gZmluZC4gIFdlIG5lZWQgaXQgZm9yCislIFBvbGlzaCBzdXBwcmVzc2VkLWwuICAtLWthcmwsIDIyc2VwOTYuCislXGRlZlxsIzF7e1xsaSAjMX1cbnVsbH0KKworJSBFeHBsaWNpdCBmb250IGNoYW5nZXM6IEByLCBAc2MsIHVuZG9jdW1lbnRlZCBAaWkuCitcZGVmXHIjMXt7XHJtICMxfX0gICAgICAgICAgICAgICUgcm9tYW4gZm9udAorXGRlZlxzYyMxe3tcc21hbGxjYXBzIzF9fSAgICAgICAlIHNtYWxsY2FwcyBmb250CitcZGVmXGlpIzF7e1xpdCAjMX19ICAgICAgICAgICAgICUgaXRhbGljIGZvbnQKKworJSBAYWNyb255bSBmb3IgIkZCSSIsICJOQVRPIiwgYW5kIHRoZSBsaWtlLgorJSBXZSBwcmludCB0aGlzIG9uZSBwb2ludCBzaXplIHNtYWxsZXIsIHNpbmNlIGl0J3MgaW50ZW5kZWQgZm9yCislIGFsbC11cHBlcmNhc2UuCislIAorXGRlZlxhY3JvbnltIzF7XGRvYWNyb255bSAjMSwsXGZpbmlzaH0KK1xkZWZcZG9hY3JvbnltIzEsIzIsIzNcZmluaXNoeyUKKyAge1xzZWxlY3Rmb250c1xsc2l6ZSAjMX0lCisgIFxkZWZcdGVtcHsjMn0lCisgIFxpZnhcdGVtcFxlbXB0eSBcZWxzZQorICAgIFxzcGFjZSAoe1x1bnNlcHNwYWNlcyBcaWdub3Jlc3BhY2VzIFx0ZW1wIFx1bnNraXB9KSUKKyAgXGZpCit9CisKKyUgQGFiYnIgZm9yICJDb21wdXQuIEouIiBhbmQgdGhlIGxpa2UuCislIE5vIGZvbnQgY2hhbmdlLCBidXQgZG9uJ3QgZG8gZW5kLW9mLXNlbnRlbmNlIHNwYWNpbmcuCislIAorXGRlZlxhYmJyIzF7XGRvYWJiciAjMSwsXGZpbmlzaH0KK1xkZWZcZG9hYmJyIzEsIzIsIzNcZmluaXNoeyUKKyAge1xwbGFpbmZyZW5jaHNwYWNpbmcgIzF9JQorICBcZGVmXHRlbXB7IzJ9JQorICBcaWZ4XHRlbXBcZW1wdHkgXGVsc2UKKyAgICBcc3BhY2UgKHtcdW5zZXBzcGFjZXMgXGlnbm9yZXNwYWNlcyBcdGVtcCBcdW5za2lwfSklCisgIFxmaQorfQorCislIEBwb3VuZHN7fSBpcyBhIHN0ZXJsaW5nIHNpZ24sIHdoaWNoIEtudXRoIHB1dCBpbiB0aGUgQ00gaXRhbGljIGZvbnQuCislCitcZGVmXHBvdW5kc3t7XGl0XCR9fQorCislIEBldXJve30gY29tZXMgZnJvbSBhIHNlcGFyYXRlIGZvbnQsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdHlsZS4KKyUgV2UgdXNlIHRoZSBmcmVlIGZleW0qIGZvbnRzIGZyb20gdGhlIGV1cm9zeW0gcGFja2FnZSBieSBIZW5yaWsKKyUgVGhlaWxpbmcsIHdoaWNoIHN1cHBvcnQgcmVndWxhciwgc2xhbnRlZCwgYm9sZCBhbmQgYm9sZCBzbGFudGVkIChhbmQKKyUgIm91dGxpbmVkIiAoYmxhY2tib2FyZCBib2FyZCwgc29ydCBvZikgdmVyc2lvbnMsIHdoaWNoIHdlIGRvbid0IG5lZWQpLgorJSBJdCBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LmN0YW4ub3JnL3RleC1hcmNoaXZlL2ZvbnRzL2V1cm9zeW0uCislIAorJSBBbHRob3VnaCBvbmx5IHJlZ3VsYXIgaXMgdGhlIHRydWx5IG9mZmljaWFsIEV1cm8gc3ltYm9sLCB3ZSBpZ25vcmUKKyUgdGhhdC4gIFRoZSBFdXJvIGlzIGRlc2lnbmVkIHRvIGJlIHNsaWdodGx5IHRhbGxlciB0aGFuIHRoZSByZWd1bGFyCislIGZvbnQgaGVpZ2h0LgorJSAKKyUgZmV5bXIgLSByZWd1bGFyCislIGZleW1vIC0gc2xhbnRlZAorJSBmZXliciAtIGJvbGQKKyUgZmV5Ym8gLSBib2xkIHNsYW50ZWQKKyUgCislIFRoZXJlIGlzIG5vIGdvb2QgKGZyZWUpIHR5cGV3cml0ZXIgdmVyc2lvbiwgdG8gbXkga25vd2xlZGdlLgorJSBBIGZleW1yMTAgZXVybyBpcyB+Ny4zcHQgd2lkZSwgd2hpbGUgYSBub3JtYWwgY210dDEwIGNoYXIgaXMgfjUuMjVwdCB3aWRlLgorJSBIbW0uCislIAorJSBBbHNvIGRvZXNuJ3Qgd29yayBpbiBtYXRoLiAgRG8gd2UgbmVlZCB0byBkbyBtYXRoIHdpdGggZXVybyBzeW1ib2xzPworJSBIb3BlIG5vdC4KKyUgCislIAorXGRlZlxldXJve3tcZXVyb2ZvbnQgZX19CitcZGVmXGV1cm9mb250eyUKKyAgJSBXZSBzZXQgdGhlIGZvbnQgYXQgZWFjaCBjb21tYW5kLCByYXRoZXIgdGhhbiBwcmVkZWZpbmluZyBpdCBpbgorICAlIFx0ZXh0Zm9udHMgYW5kIHRoZSBvdGhlciBmb250LXN3aXRjaGluZyBjb21tYW5kcywgc28gdGhhdAorICAlIGluc3RhbGxhdGlvbnMgd2hpY2ggbmV2ZXIgbmVlZCB0aGUgc3ltYm9sIGRvbid0IGhhdmUgdG8gaGF2ZSB0aGUKKyAgJSBmb250IGluc3RhbGxlZC4KKyAgJSAKKyAgJSBUaGVyZSBpcyBvbmx5IG9uZSBkZXNpZ25lZCBzaXplIChub21pbmFsIDEwcHQpLCBzbyB3ZSBhbHdheXMgc2NhbGUKKyAgJSB0aGF0IHRvIHRoZSBjdXJyZW50IG5vbWluYWwgc2l6ZS4KKyAgJSAKKyAgJSBCeSB0aGUgd2F5LCBzaW1wbHkgdXNpbmcgImF0IDFlbSIgd29ya3MgZm9yIGNtcjEwIGFuZCB0aGUgbGlrZSwgYnV0CisgICUgZG9lcyBub3Qgd29yayBmb3IgY21ieDEwIGFuZCBvdGhlciBleHRlbmRlZC9zaHJ1bmtlbiBmb250cy4KKyAgJSAKKyAgXGRlZlxldXJvc2l6ZXtcY3NuYW1lXGN1cmZvbnRzaXplIG5vbWluYWxzaXplXGVuZGNzbmFtZX0lCisgICUKKyAgXGlmeFxjdXJmb250c3R5bGVcYmZzdHlsZW5hbWUgCisgICAgJSBib2xkOgorICAgIFxmb250XHRoaXNldXJvZm9udCA9IFxpZnVzaW5naXR7ZmV5Ym8xMH17ZmV5YnIxMH0gYXQgXGV1cm9zaXplCisgIFxlbHNlIAorICAgICUgcmVndWxhcjoKKyAgICBcZm9udFx0aGlzZXVyb2ZvbnQgPSBcaWZ1c2luZ2l0e2ZleW1vMTB9e2ZleW1yMTB9IGF0IFxldXJvc2l6ZQorICBcZmkKKyAgXHRoaXNldXJvZm9udAorfQorCislIEByZWdpc3RlcmVkc3ltYm9sIC0gUiBpbiBhIGNpcmNsZS4gIFRoZSBmb250IGZvciB0aGUgUiBzaG91bGQgcmVhbGx5CislIGJlIHNtYWxsZXIgeWV0LCBidXQgbGxsc2l6ZSBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8gZm9yIG5vdy4KKyUgQWRhcHRlZCBmcm9tIHRoZSBwbGFpbi50ZXggZGVmaW5pdGlvbiBvZiBcY29weXJpZ2h0LgorJQorXGRlZlxyZWdpc3RlcmVkc3ltYm9seyUKKyAgJF57e1xvb2FsaWdue1xoZmlsXHJhaXNlLjA3ZXhcaGJveHtcc2VsZWN0Zm9udHNcbGxsc2l6ZSBSfSUKKyAgICAgICAgICAgICAgIFxoZmlsXGNyY3JcT3JifX0lCisgICAgfSQlCit9CisKKyUgTGF1cmVudCBTaWViZW5tYW5uIHJlcG9ydHMgXE9yYiB1bmRlZmluZWQgd2l0aDoKKyUgIFRleHR1cmVzIDEuNy43IChwcmVsb2FkZWQgZm9ybWF0PXBsYWluIDkzLjEwLjE0KSAgKDY4SykgIDE2IEFQUiAyMDA0IDAyOjM4CislIHNvIHdlJ2xsIGRlZmluZSBpdCBpZiBuZWNlc3NhcnkuCislIAorXGlmeFxPcmJcdW5kZWZpbmVkCitcZGVmXE9yYntcbWF0aGhleGJveDIwRH0KK1xmaQorCisKK1xtZXNzYWdle3BhZ2UgaGVhZGluZ3MsfQorCitcbmV3c2tpcFx0aXRsZXBhZ2V0b3BnbHVlIFx0aXRsZXBhZ2V0b3BnbHVlID0gMS41aW4KK1xuZXdza2lwXHRpdGxlcGFnZWJvdHRvbWdsdWUgXHRpdGxlcGFnZWJvdHRvbWdsdWUgPSAycGMKKworJSBGaXJzdCB0aGUgdGl0bGUgcGFnZS4gIE11c3QgZG8gQHNldHRpdGxlIGJlZm9yZSBAdGl0bGVwYWdlLgorXG5ld2lmXGlmc2VlbmF1dGhvcgorXG5ld2lmXGlmZmluaXNoZWR0aXRsZXBhZ2UKKworJSBEbyBhbiBpbXBsaWNpdCBAY29udGVudHMgb3IgQHNob3J0Y29udGVudHMgYWZ0ZXIgQGVuZCB0aXRsZXBhZ2UgaWYgdGhlCislIHVzZXIgc2F5cyBAc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZSBvciBAc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlLgorJQorXG5ld2lmXGlmc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZQorIFxsZXRcc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZSA9IFxzZXRjb250ZW50c2FmdGVydGl0bGVwYWdldHJ1ZQorXG5ld2lmXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCisgXGxldFxzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UgPSBcc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdldHJ1ZQorCitccGFyc2VhcmdkZWZcc2hvcnR0aXRsZXBhZ2V7XGJlZ2luZ3JvdXBcaGJveHt9XHZza2lwIDEuNWluIFxjaGFwcm0gXGNlbnRlcmxpbmV7IzF9JQorICAgICAgICBcZW5kZ3JvdXBccGFnZVxoYm94e31ccGFnZX0KKworXGVudmRlZlx0aXRsZXBhZ2V7JQorICAlIE9wZW4gb25lIGV4dHJhIGdyb3VwLCBhcyB3ZSB3YW50IHRvIGNsb3NlIGl0IGluIHRoZSBtaWRkbGUgb2YgXEV0aXRsZXBhZ2UuCisgIFxiZWdpbmdyb3VwCisgICAgXHBhcmluZGVudD0wcHQgXHRleHRmb250cworICAgICUgTGVhdmUgc29tZSBzcGFjZSBhdCB0aGUgdmVyeSB0b3Agb2YgdGhlIHBhZ2UuCisgICAgXHZnbHVlXHRpdGxlcGFnZXRvcGdsdWUKKyAgICAlIE5vIHJ1bGUgYXQgcGFnZSBib3R0b20gdW5sZXNzIHdlIHByaW50IG9uZSBhdCB0aGUgdG9wIHdpdGggQHRpdGxlLgorICAgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKKyAgICAlCisgICAgJSBNb3N0IHRpdGxlIGBgcGFnZXMnJyBhcmUgYWN0dWFsbHkgdHdvIHBhZ2VzIGxvbmcsIHdpdGggc3BhY2UKKyAgICAlIGF0IHRoZSB0b3Agb2YgdGhlIHNlY29uZC4gIFdlIGRvbid0IHdhbnQgdGhlIHJhZ2dlZCBsZWZ0IG9uIHRoZSBzZWNvbmQuCisgICAgXGxldFxvbGRwYWdlID0gXHBhZ2UKKyAgICBcZGVmXHBhZ2V7JQorICAgICAgXGlmZmluaXNoZWR0aXRsZXBhZ2VcZWxzZQorCSBcZmluaXNodGl0bGVwYWdlCisgICAgICBcZmkKKyAgICAgIFxsZXRccGFnZSA9IFxvbGRwYWdlCisgICAgICBccGFnZQorICAgICAgXG51bGwKKyAgICB9JQorfQorCitcZGVmXEV0aXRsZXBhZ2V7JQorICAgIFxpZmZpbmlzaGVkdGl0bGVwYWdlXGVsc2UKKwlcZmluaXNodGl0bGVwYWdlCisgICAgXGZpCisgICAgJSBJdCBpcyBpbXBvcnRhbnQgdG8gZG8gdGhlIHBhZ2UgYnJlYWsgYmVmb3JlIGVuZGluZyB0aGUgZ3JvdXAsCisgICAgJSBiZWNhdXNlIHRoZSBoZWFkbGluZSBhbmQgZm9vdGxpbmUgYXJlIG9ubHkgZW1wdHkgaW5zaWRlIHRoZSBncm91cC4KKyAgICAlIElmIHdlIHVzZSB0aGUgbmV3IGRlZmluaXRpb24gb2YgXHBhZ2UsIHdlIGFsd2F5cyBnZXQgYSBibGFuayBwYWdlCisgICAgJSBhZnRlciB0aGUgdGl0bGUgcGFnZSwgd2hpY2ggd2UgY2VydGFpbmx5IGRvbid0IHdhbnQuCisgICAgXG9sZHBhZ2UKKyAgXGVuZGdyb3VwCisgICUKKyAgJSBOZWVkIHRoaXMgYmVmb3JlIHRoZSBcLi4uYWZ0ZXJ0aXRsZXBhZ2UgY2hlY2tzIHNvIHRoYXQgaWYgdGhleSBhcmUKKyAgJSBpbiBlZmZlY3QgdGhlIHRvYyBwYWdlcyB3aWxsIGNvbWUgb3V0IHdpdGggcGFnZSBudW1iZXJzLgorICBcSEVBRElOR1NvbgorICAlCisgICUgSWYgdGhleSB3YW50IHNob3J0LCB0aGV5IGNlcnRhaW5seSB3YW50IGxvbmcgdG9vLgorICBcaWZzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKKyAgICBcc2hvcnRjb250ZW50cworICAgIFxjb250ZW50cworICAgIFxnbG9iYWxcbGV0XHNob3J0Y29udGVudHMgPSBccmVsYXgKKyAgICBcZ2xvYmFsXGxldFxjb250ZW50cyA9IFxyZWxheAorICBcZmkKKyAgJQorICBcaWZzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlCisgICAgXGNvbnRlbnRzCisgICAgXGdsb2JhbFxsZXRcY29udGVudHMgPSBccmVsYXgKKyAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4CisgIFxmaQorfQorCitcZGVmXGZpbmlzaHRpdGxlcGFnZXslCisgIFx2c2tpcDRwdCBcaHJ1bGUgaGVpZ2h0IDJwdCB3aWR0aCBcaHNpemUKKyAgXHZza2lwXHRpdGxlcGFnZWJvdHRvbWdsdWUKKyAgXGZpbmlzaGVkdGl0bGVwYWdldHJ1ZQorfQorCislJSUgTWFjcm9zIHRvIGJlIHVzZWQgd2l0aGluIEB0aXRsZXBhZ2U6CisKK1xsZXRcc3VidGl0bGVybT1cdGVucm0KK1xkZWZcc3VidGl0bGVmb250e1xzdWJ0aXRsZXJtIFxub3JtYWxiYXNlbGluZXNraXAgPSAxM3B0IFxub3JtYWxiYXNlbGluZXN9CisKK1xkZWZcYXV0aG9yZm9udHtcYXV0aG9ycm0gXG5vcm1hbGJhc2VsaW5lc2tpcCA9IDE2cHQgXG5vcm1hbGJhc2VsaW5lcworCQlcbGV0XHR0PVxhdXRob3J0dH0KKworXHBhcnNlYXJnZGVmXHRpdGxleyUKKyAgXGNoZWNrZW52XHRpdGxlcGFnZQorICBcbGVmdGxpbmV7XHRpdGxlZm9udHNccm0gIzF9CisgICUgcHJpbnQgYSBydWxlIGF0IHRoZSBwYWdlIGJvdHRvbSBhbHNvLgorICBcZmluaXNoZWR0aXRsZXBhZ2VmYWxzZQorICBcdnNraXA0cHQgXGhydWxlIGhlaWdodCA0cHQgd2lkdGggXGhzaXplIFx2c2tpcDRwdAorfQorCitccGFyc2VhcmdkZWZcc3VidGl0bGV7JQorICBcY2hlY2tlbnZcdGl0bGVwYWdlCisgIHtcc3VidGl0bGVmb250IFxyaWdodGxpbmV7IzF9fSUKK30KKworJSBAYXV0aG9yIHNob3VsZCBjb21lIGxhc3QsIGJ1dCBtYXkgY29tZSBtYW55IHRpbWVzLgorJSBJdCBjYW4gYWxzbyBiZSB1c2VkIGluc2lkZSBAcXVvdGF0aW9uLgorJQorXHBhcnNlYXJnZGVmXGF1dGhvcnslCisgIFxkZWZcdGVtcHtccXVvdGF0aW9ufSUKKyAgXGlmeFx0aGlzZW52XHRlbXAKKyAgICBcZGVmXHF1b3RhdGlvbmF1dGhvcnsjMX0lIHByaW50ZWQgaW4gXEVxdW90YXRpb24uCisgIFxlbHNlCisgICAgXGNoZWNrZW52XHRpdGxlcGFnZQorICAgIFxpZnNlZW5hdXRob3JcZWxzZSBcdnNraXAgMHB0IHBsdXMgMWZpbGxsIFxzZWVuYXV0aG9ydHJ1ZSBcZmkKKyAgICB7XGF1dGhvcmZvbnQgXGxlZnRsaW5leyMxfX0lCisgIFxmaQorfQorCisKKyUlJSBTZXQgdXAgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MuCisKK1xsZXRcdGhpc3BhZ2U9XGZvbGlvCisKK1xuZXd0b2tzXGV2ZW5oZWFkbGluZSAgICAlIGhlYWRsaW5lIG9uIGV2ZW4gcGFnZXMKK1xuZXd0b2tzXG9kZGhlYWRsaW5lICAgICAlIGhlYWRsaW5lIG9uIG9kZCBwYWdlcworXG5ld3Rva3NcZXZlbmZvb3RsaW5lICAgICUgZm9vdGxpbmUgb24gZXZlbiBwYWdlcworXG5ld3Rva3Ncb2RkZm9vdGxpbmUgICAgICUgZm9vdGxpbmUgb24gb2RkIHBhZ2VzCisKKyUgTm93IG1ha2UgVGVYIHVzZSB0aG9zZSB2YXJpYWJsZXMKK1xoZWFkbGluZT17e1x0ZXh0Zm9udHNccm0gXGlmb2RkXHBhZ2VubyBcdGhlXG9kZGhlYWRsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVsc2UgXHRoZVxldmVuaGVhZGxpbmUgXGZpfX0KK1xmb290bGluZT17e1x0ZXh0Zm9udHNccm0gXGlmb2RkXHBhZ2VubyBcdGhlXG9kZGZvb3RsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVsc2UgXHRoZVxldmVuZm9vdGxpbmUgXGZpfVxIRUFESU5HU2hvb2t9CitcbGV0XEhFQURJTkdTaG9vaz1ccmVsYXgKKworJSBDb21tYW5kcyB0byBzZXQgdGhvc2UgdmFyaWFibGVzLgorJSBGb3IgZXhhbXBsZSwgdGhpcyBpcyB3aGF0ICBAaGVhZGluZ3Mgb24gIGRvZXMKKyUgQGV2ZW5oZWFkaW5nIEB0aGlzdGl0bGV8QHRoaXNwYWdlfEB0aGlzY2hhcHRlcgorJSBAb2RkaGVhZGluZyBAdGhpc2NoYXB0ZXJ8QHRoaXNwYWdlfEB0aGlzdGl0bGUKKyUgQGV2ZW5mb290aW5nIEB0aGlzZmlsZXx8CislIEBvZGRmb290aW5nIHx8QHRoaXNmaWxlCisKKworXGRlZlxldmVuaGVhZGluZ3tccGFyc2VhcmdcZXZlbmhlYWRpbmd4eHh9CitcZGVmXGV2ZW5oZWFkaW5neHh4ICMxe1xldmVuaGVhZGluZ3l5eSAjMVx8XHxcfFx8XGZpbmlzaH0KK1xkZWZcZXZlbmhlYWRpbmd5eXkgIzFcfCMyXHwjM1x8IzRcZmluaXNoeyUKK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19CisKK1xkZWZcb2RkaGVhZGluZ3tccGFyc2Vhcmdcb2RkaGVhZGluZ3h4eH0KK1xkZWZcb2RkaGVhZGluZ3h4eCAjMXtcb2RkaGVhZGluZ3l5eSAjMVx8XHxcfFx8XGZpbmlzaH0KK1xkZWZcb2RkaGVhZGluZ3l5eSAjMVx8IzJcfCMzXHwjNFxmaW5pc2h7JQorXGdsb2JhbFxvZGRoZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQorCitccGFyc2VhcmdkZWZcZXZlcnloZWFkaW5ne1xvZGRoZWFkaW5neHh4eyMxfVxldmVuaGVhZGluZ3h4eHsjMX19JQorCitcZGVmXGV2ZW5mb290aW5ne1xwYXJzZWFyZ1xldmVuZm9vdGluZ3h4eH0KK1xkZWZcZXZlbmZvb3Rpbmd4eHggIzF7XGV2ZW5mb290aW5neXl5ICMxXHxcfFx8XHxcZmluaXNofQorXGRlZlxldmVuZm9vdGluZ3l5eSAjMVx8IzJcfCMzXHwjNFxmaW5pc2h7JQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KKworXGRlZlxvZGRmb290aW5ne1xwYXJzZWFyZ1xvZGRmb290aW5neHh4fQorXGRlZlxvZGRmb290aW5neHh4ICMxe1xvZGRmb290aW5neXl5ICMxXHxcfFx8XHxcZmluaXNofQorXGRlZlxvZGRmb290aW5neXl5ICMxXHwjMlx8IzNcfCM0XGZpbmlzaHslCisgIFxnbG9iYWxcb2RkZm9vdGxpbmUgPSB7XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319JQorICAlCisgICUgTGVhdmUgc29tZSBzcGFjZSBmb3IgdGhlIGZvb3RsaW5lLiAgSG9wZWZ1bGx5IG9rIHRvIGFzc3VtZQorICAlIEBldmVuZm9vdGluZyB3aWxsIG5vdCBiZSB1c2VkIGJ5IGl0c2VsZi4KKyAgXGdsb2JhbFxhZHZhbmNlXHBhZ2VoZWlnaHQgYnkgLVxiYXNlbGluZXNraXAKKyAgXGdsb2JhbFxhZHZhbmNlXHZzaXplIGJ5IC1cYmFzZWxpbmVza2lwCit9CisKK1xwYXJzZWFyZ2RlZlxldmVyeWZvb3Rpbmd7XG9kZGZvb3Rpbmd4eHh7IzF9XGV2ZW5mb290aW5neHh4eyMxfX0KKworCislIEBoZWFkaW5ncyBkb3VibGUgICAgICB0dXJucyBoZWFkaW5ncyBvbiBmb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLgorJSBAaGVhZGluZ3Mgc2luZ2xlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIHNpbmdsZS1zaWRlZCBwcmludGluZy4KKyUgQGhlYWRpbmdzIG9mZiAgICAgICAgIHR1cm5zIHRoZW0gb2ZmLgorJSBAaGVhZGluZ3Mgb24gICAgICAgICAgc2FtZSBhcyBAaGVhZGluZ3MgZG91YmxlLCByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4KKyUgQGhlYWRpbmdzIGFmdGVyICAgICAgIHR1cm5zIG9uIGRvdWJsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCislIEBoZWFkaW5ncyBkb3VibGVhZnRlciB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgorJSBAaGVhZGluZ3Mgc2luZ2xlYWZ0ZXIgdHVybnMgb24gc2luZ2xlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KKyUgQnkgZGVmYXVsdCwgdGhleSBhcmUgb2ZmIGF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50LAorJSBhbmQgdHVybmVkIGBvbicgYWZ0ZXIgQGVuZCB0aXRsZXBhZ2UuCisKK1xkZWZcaGVhZGluZ3MgIzEge1xjc25hbWUgSEVBRElOR1MjMVxlbmRjc25hbWV9CisKK1xkZWZcSEVBRElOR1NvZmZ7JQorXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGhlYWRsaW5lPXtcaGZpbH0gXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9fQorXEhFQURJTkdTb2ZmCislIFdoZW4gd2UgdHVybiBoZWFkaW5ncyBvbiwgc2V0IHRoZSBwYWdlIG51bWJlciB0byAxLgorJSBGb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLCBwdXQgY3VycmVudCBmaWxlIG5hbWUgaW4gbG93ZXIgbGVmdCBjb3JuZXIsCislIGNoYXB0ZXIgbmFtZSBvbiBpbnNpZGUgdG9wIG9mIHJpZ2h0IGhhbmQgcGFnZXMsIGRvY3VtZW50CislIHRpdGxlIG9uIGluc2lkZSB0b3Agb2YgbGVmdCBoYW5kIHBhZ2VzLCBhbmQgcGFnZSBudW1iZXJzIG9uIG91dHNpZGUgdG9wCislIGVkZ2Ugb2YgYWxsIHBhZ2VzLgorXGRlZlxIRUFESU5HU2RvdWJsZXslCitcZ2xvYmFsXHBhZ2Vubz0xCitcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcZm9saW9caGZpbFx0aGlzdGl0bGV9fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCit9CitcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKKworJSBGb3Igc2luZ2xlLXNpZGVkIHByaW50aW5nLCBjaGFwdGVyIHRpdGxlIGdvZXMgYWNyb3NzIHRvcCBsZWZ0IG9mIHBhZ2UsCislIHBhZ2UgbnVtYmVyIG9uIHRvcCByaWdodC4KK1xkZWZcSEVBRElOR1NzaW5nbGV7JQorXGdsb2JhbFxwYWdlbm89MQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9CitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgorfQorXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU2RvdWJsZX0KKworXGRlZlxIRUFESU5HU2FmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU2RvdWJsZXh9CitcbGV0XEhFQURJTkdTZG91YmxlYWZ0ZXI9XEhFQURJTkdTYWZ0ZXIKK1xkZWZcSEVBRElOR1Nkb3VibGV4eyUKK1xnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1xmb2xpb1xoZmlsXHRoaXN0aXRsZX19CitcZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319CitcZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKK30KKworXGRlZlxIRUFESU5HU3NpbmdsZWFmdGVye1xsZXRcSEVBRElOR1Nob29rPVxIRUFESU5HU3NpbmdsZXh9CitcZGVmXEhFQURJTkdTc2luZ2xleHslCitcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319CitcZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319CitcZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCit9CisKKyUgU3Vicm91dGluZXMgdXNlZCBpbiBnZW5lcmF0aW5nIGhlYWRpbmdzCislIFRoaXMgcHJvZHVjZXMgRGF5IE1vbnRoIFllYXIgc3R5bGUgb2Ygb3V0cHV0LgorJSBPbmx5IGRlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLCBpbiBjYXNlIGEgdHhpLT8/LnRleCBmaWxlIGhhcyBzZXQKKyUgdXAgYSBkaWZmZXJlbnQgZm9ybWF0IChlLmcuLCB0eGktY3MudGV4IGRvZXMgdGhpcykuCitcaWZ4XHRvZGF5XHVuZGVmaW5lZAorXGRlZlx0b2RheXslCisgIFxudW1iZXJcZGF5XHNwYWNlCisgIFxpZmNhc2VcbW9udGgKKyAgXG9yXHB1dHdvcmRNSmFuXG9yXHB1dHdvcmRNRmViXG9yXHB1dHdvcmRNTWFyXG9yXHB1dHdvcmRNQXByCisgIFxvclxwdXR3b3JkTU1heVxvclxwdXR3b3JkTUp1blxvclxwdXR3b3JkTUp1bFxvclxwdXR3b3JkTUF1ZworICBcb3JccHV0d29yZE1TZXBcb3JccHV0d29yZE1PY3Rcb3JccHV0d29yZE1Ob3Zcb3JccHV0d29yZE1EZWMKKyAgXGZpCisgIFxzcGFjZVxudW1iZXJceWVhcn0KK1xmaQorCislIEBzZXR0aXRsZSBsaW5lLi4uICBzcGVjaWZpZXMgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCwgZm9yIGhlYWRpbmdzLgorJSBJdCBnZW5lcmF0ZXMgbm8gb3V0cHV0IG9mIGl0cyBvd24uCitcZGVmXHRoaXN0aXRsZXtccHV0d29yZE5vVGl0bGV9CitcZGVmXHNldHRpdGxle1xwYXJzZWFyZ3tcZ2RlZlx0aGlzdGl0bGV9fQorCisKK1xtZXNzYWdle3RhYmxlcyx9CislIFRhYmxlcyAtLSBAdGFibGUsIEBmdGFibGUsIEB2dGFibGUsIEBpdGVtKHgpLgorCislIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgdGFibGUgdGV4dAorXG5ld2RpbWVuXHRhYmxlaW5kZW50IFx0YWJsZWluZGVudD0uOGluCislIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgQGl0ZW1pemUgYW5kIEBlbnVtZXJhdGUgdGV4dAorXG5ld2RpbWVuXGl0ZW1pbmRlbnQgIFxpdGVtaW5kZW50PS4zaW4KKyUgbWFyZ2luIGJldHdlZW4gZW5kIG9mIHRhYmxlIGl0ZW0gYW5kIHN0YXJ0IG9mIHRhYmxlIHRleHQuCitcbmV3ZGltZW5caXRlbW1hcmdpbiAgXGl0ZW1tYXJnaW49LjFpbgorCislIHVzZWQgaW50ZXJuYWxseSBmb3IgXGl0ZW1pbmRlbnQgbWludXMgXGl0ZW1tYXJnaW4KK1xuZXdkaW1lblxpdGVtbWF4CisKKyUgTm90ZSBAdGFibGUsIEBmdGFibGUsIGFuZCBAdnRhYmxlIGRlZmluZSBAaXRlbSwgQGl0ZW14LCBldGMuLCB3aXRoCislIHRoZXNlIGRlZnMuCislIFRoZXkgYWxzbyBkZWZpbmUgXGl0ZW1pbmRleAorJSB0byBpbmRleCB0aGUgaXRlbSBuYW1lIGluIHdoYXRldmVyIG1hbm5lciBpcyBkZXNpcmVkIChwZXJoYXBzIG5vbmUpLgorCitcbmV3aWZcaWZpdGVteG5lZWRzbmVnYXRpdmV2c2tpcAorCitcZGVmXGl0ZW14cGFye1xwYXJcaWZpdGVteG5lZWRzbmVnYXRpdmV2c2tpcFxub2JyZWFrXHZza2lwLVxwYXJza2lwXG5vYnJlYWtcZml9CisKK1xkZWZcaW50ZXJuYWxCaXRlbXtcc21hbGxicmVhayBccGFyc2VhcmdcaXRlbXp6en0KK1xkZWZcaW50ZXJuYWxCaXRlbXh7XGl0ZW14cGFyIFxwYXJzZWFyZ1xpdGVtenp6fQorCitcZGVmXGl0ZW16enogIzF7XGJlZ2luZ3JvdXAgJQorICBcYWR2YW5jZVxoc2l6ZSBieSAtXHJpZ2h0c2tpcAorICBcYWR2YW5jZVxoc2l6ZSBieSAtXHRhYmxlaW5kZW50CisgIFxzZXRib3gwPVxoYm94e1xpdGVtaW5kaWNhdGV7IzF9fSUKKyAgXGl0ZW1pbmRleHsjMX0lCisgIFxub2JyZWFrICUgVGhpcyBwcmV2ZW50cyBhIGJyZWFrIGJlZm9yZSBAaXRlbXguCisgICUKKyAgJSBJZiB0aGUgaXRlbSB0ZXh0IGRvZXMgbm90IGZpdCBpbiB0aGUgc3BhY2Ugd2UgaGF2ZSwgcHV0IGl0IG9uIGEgbGluZQorICAlIGJ5IGl0c2VsZiwgYW5kIGRvIG5vdCBhbGxvdyBhIHBhZ2UgYnJlYWsgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGF0CisgICUgbGluZS4gIFdlIGRvIG5vdCBzdGFydCBhIHBhcmFncmFwaCBoZXJlIGJlY2F1c2UgdGhlbiBpZiB0aGUgbmV4dAorICAlIGNvbW1hbmQgaXMsIGUuZy4sIEBraW5kZXgsIHRoZSB3aGF0c2l0IHdvdWxkIGdldCBwdXQgaW50byB0aGUKKyAgJSBob3Jpem9udGFsIGxpc3Qgb24gYSBsaW5lIGJ5IGl0c2VsZiwgcmVzdWx0aW5nIGluIGV4dHJhIGJsYW5rIHNwYWNlLgorICBcaWZkaW0gXHdkMD5caXRlbW1heAorICAgICUKKyAgICAlIE1ha2UgdGhpcyBhIHBhcmFncmFwaCBzbyB3ZSBnZXQgdGhlIFxwYXJza2lwIGdsdWUgYW5kIHdyYXBwaW5nLAorICAgICUgYnV0IGxlYXZlIGl0IHJhZ2dlZC1yaWdodC4KKyAgICBcYmVnaW5ncm91cAorICAgICAgXGFkdmFuY2VcbGVmdHNraXAgYnktXHRhYmxlaW5kZW50CisgICAgICBcYWR2YW5jZVxoc2l6ZSBieVx0YWJsZWluZGVudAorICAgICAgXGFkdmFuY2VccmlnaHRza2lwIGJ5MHB0IHBsdXMxZmlsCisgICAgICBcbGVhdmV2bW9kZVx1bmhib3gwXHBhcgorICAgIFxlbmRncm91cAorICAgICUKKyAgICAlIFdlJ3JlIGdvaW5nIHRvIGJlIHN0YXJ0aW5nIGEgcGFyYWdyYXBoLCBidXQgd2UgZG9uJ3Qgd2FudCB0aGUKKyAgICAlIFxwYXJza2lwIGdsdWUgLS0gbG9naWNhbGx5IGl0J3MgcGFydCBvZiB0aGUgQGl0ZW0gd2UganVzdCBzdGFydGVkLgorICAgIFxub2JyZWFrIFx2c2tpcC1ccGFyc2tpcAorICAgICUKKyAgICAlIFN0b3AgYSBwYWdlIGJyZWFrIGF0IHRoZSBccGFyc2tpcCBnbHVlIGNvbWluZyB1cC4gIEhvd2V2ZXIsIGlmCisgICAgJSB3aGF0IGZvbGxvd3MgaXMgYW4gZW52aXJvbm1lbnQgc3VjaCBhcyBAZXhhbXBsZSwgdGhlcmUgd2lsbCBiZSBubworICAgICUgXHBhcnNraXAgZ2x1ZTsgdGhlbiB0aGUgbmVnYXRpdmUgdnNraXAgd2UganVzdCBpbnNlcnRlZCB3b3VsZAorICAgICUgY2F1c2UgdGhlIGV4YW1wbGUgYW5kIHRoZSBpdGVtIHRvIGNyYXNoIHRvZ2V0aGVyLiAgU28gd2UgdXNlIHRoaXMKKyAgICAlIGJpemFycmUgdmFsdWUgb2YgMTAwMDEgYXMgYSBzaWduYWwgdG8gXGFib3ZlZW52YnJlYWsgdG8gaW5zZXJ0CisgICAgJSBccGFyc2tpcCBnbHVlIGFmdGVyIGFsbC4gIFNlY3Rpb24gdGl0bGVzIGFyZSBoYW5kbGVkIHRoaXMgd2F5IGFsc28uCisgICAgJSAKKyAgICBccGVuYWx0eSAxMDAwMQorICAgIFxlbmRncm91cAorICAgIFxpdGVteG5lZWRzbmVnYXRpdmV2c2tpcGZhbHNlCisgIFxlbHNlCisgICAgJSBUaGUgaXRlbSB0ZXh0IGZpdHMgaW50byB0aGUgc3BhY2UuICBTdGFydCBhIHBhcmFncmFwaCwgc28gdGhhdCB0aGUKKyAgICAlIGZvbGxvd2luZyB0ZXh0IChpZiBhbnkpIHdpbGwgZW5kIHVwIG9uIHRoZSBzYW1lIGxpbmUuCisgICAgXG5vaW5kZW50CisgICAgJSBEbyB0aGlzIHdpdGgga2VybnMgYW5kIFx1bmhib3ggc28gdGhhdCBpZiB0aGVyZSBpcyBhIGZvb3Rub3RlIGluCisgICAgJSB0aGUgaXRlbSB0ZXh0LCBpdCBjYW4gbWlncmF0ZSB0byB0aGUgbWFpbiB2ZXJ0aWNhbCBsaXN0IGFuZAorICAgICUgZXZlbnR1YWxseSBiZSBwcmludGVkLgorICAgIFxub2JyZWFrXGtlcm4tXHRhYmxlaW5kZW50CisgICAgXGRpbWVuMCA9IFxpdGVtbWF4ICBcYWR2YW5jZVxkaW1lbjAgYnkgXGl0ZW1tYXJnaW4gXGFkdmFuY2VcZGltZW4wIGJ5IC1cd2QwCisgICAgXHVuaGJveDAKKyAgICBcbm9icmVha1xrZXJuXGRpbWVuMAorICAgIFxlbmRncm91cAorICAgIFxpdGVteG5lZWRzbmVnYXRpdmV2c2tpcHRydWUKKyAgXGZpCit9CisKK1xkZWZcaXRlbXtcZXJybWVzc2FnZXtAaXRlbSB3aGlsZSBub3QgaW4gYSBsaXN0IGVudmlyb25tZW50fX0KK1xkZWZcaXRlbXh7XGVycm1lc3NhZ2V7QGl0ZW14IHdoaWxlIG5vdCBpbiBhIGxpc3QgZW52aXJvbm1lbnR9fQorCislIEB0YWJsZSwgQGZ0YWJsZSwgQHZ0YWJsZS4KK1xlbnZkZWZcdGFibGV7JQorICBcbGV0XGl0ZW1pbmRleFxnb2JibGUKKyAgXHRhYmxlY2hlY2t7dGFibGV9JQorfQorXGVudmRlZlxmdGFibGV7JQorICBcZGVmXGl0ZW1pbmRleCAjIzF7XGRvaW5kIHtmbn17XGNvZGV7IyMxfX19JQorICBcdGFibGVjaGVja3tmdGFibGV9JQorfQorXGVudmRlZlx2dGFibGV7JQorICBcZGVmXGl0ZW1pbmRleCAjIzF7XGRvaW5kIHt2cn17XGNvZGV7IyMxfX19JQorICBcdGFibGVjaGVja3t2dGFibGV9JQorfQorXGRlZlx0YWJsZWNoZWNrIzF7JQorICBcaWZudW0gXHRoZVxjYXRjb2RlYFxeXk09XGFjdGl2ZQorICAgIFxlbmRncm91cAorICAgIFxlcnJtZXNzYWdle1RoaXMgY29tbWFuZCB3b24ndCB3b3JrIGluIHRoaXMgY29udGV4dDsgcGVyaGFwcyB0aGUgcHJvYmxlbSBpcworICAgICAgdGhhdCB3ZSBhcmUgXGluZW52aXJvbm1lbnRcdGhpc2Vudn0lCisgICAgXGRlZlxuZXh0e1xkb2lnbm9yZXsjMX19JQorICBcZWxzZQorICAgIFxsZXRcbmV4dFx0YWJsZXgKKyAgXGZpCisgIFxuZXh0Cit9CitcZGVmXHRhYmxleCMxeyUKKyAgXGRlZlxpdGVtaW5kaWNhdGV7IzF9JQorICBccGFyc2VhcmdcdGFibGV5Cit9CitcZGVmXHRhYmxleSMxeyUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxlZGVmXHRlbXB7XG5vZXhwYW5kXHRhYmxleiAjMVxzcGFjZVxzcGFjZVxzcGFjZX0lCisgICAgXGV4cGFuZGFmdGVyCisgIH1cdGVtcCBcZW5kdGFibGV6Cit9CitcZGVmXHRhYmxleiAjMSAjMiAjMyAjNFxlbmR0YWJsZXp7JQorICBcYWJvdmVlbnZicmVhaworICBcaWZudW0gMCMxPjAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5ICMxXG1pbCBcZmkKKyAgXGlmbnVtIDAjMj4wIFx0YWJsZWluZGVudD0jMlxtaWwgXGZpCisgIFxpZm51bSAwIzM+MCBcYWR2YW5jZSBccmlnaHRza2lwIGJ5ICMzXG1pbCBcZmkKKyAgXGl0ZW1tYXg9XHRhYmxlaW5kZW50CisgIFxhZHZhbmNlIFxpdGVtbWF4IGJ5IC1caXRlbW1hcmdpbgorICBcYWR2YW5jZSBcbGVmdHNraXAgYnkgXHRhYmxlaW5kZW50CisgIFxleGRlbnRhbW91bnQ9XHRhYmxlaW5kZW50CisgIFxwYXJpbmRlbnQgPSAwcHQKKyAgXHBhcnNraXAgPSBcc21hbGxza2lwYW1vdW50CisgIFxpZmRpbSBccGFyc2tpcD0wcHQgXHBhcnNraXA9MnB0IFxmaQorICBcbGV0XGl0ZW0gPSBcaW50ZXJuYWxCaXRlbQorICBcbGV0XGl0ZW14ID0gXGludGVybmFsQml0ZW14Cit9CitcZGVmXEV0YWJsZXtcZW5kZ3JhZlxhZnRlcmVudmJyZWFrfQorXGxldFxFZnRhYmxlXEV0YWJsZQorXGxldFxFdnRhYmxlXEV0YWJsZQorXGxldFxFaXRlbWl6ZVxFdGFibGUKK1xsZXRcRWVudW1lcmF0ZVxFdGFibGUKKworJSBUaGlzIGlzIHRoZSBjb3VudGVyIHVzZWQgYnkgQGVudW1lcmF0ZSwgd2hpY2ggaXMgcmVhbGx5IEBpdGVtaXplCisKK1xuZXdjb3VudCBcaXRlbW5vCisKK1xlbnZkZWZcaXRlbWl6ZXtccGFyc2VhcmdcZG9pdGVtaXplfQorCitcZGVmXGRvaXRlbWl6ZSMxeyUKKyAgXGFib3ZlZW52YnJlYWsKKyAgXGl0ZW1tYXg9XGl0ZW1pbmRlbnQKKyAgXGFkdmFuY2VcaXRlbW1heCBieSAtXGl0ZW1tYXJnaW4KKyAgXGFkdmFuY2VcbGVmdHNraXAgYnkgXGl0ZW1pbmRlbnQKKyAgXGV4ZGVudGFtb3VudD1caXRlbWluZGVudAorICBccGFyaW5kZW50PTBwdAorICBccGFyc2tpcD1cc21hbGxza2lwYW1vdW50CisgIFxpZmRpbVxwYXJza2lwPTBwdCBccGFyc2tpcD0ycHQgXGZpCisgIFxkZWZcaXRlbWNvbnRlbnRzeyMxfSUKKyAgJSBAaXRlbWl6ZSB3aXRoIG5vIGFyZyBpcyBlcXVpdmFsZW50IHRvIEBpdGVtaXplIEBidWxsZXQuCisgIFxpZnhcaXRlbWNvbnRlbnRzXGVtcHR5XGRlZlxpdGVtY29udGVudHN7XGJ1bGxldH1cZmkKKyAgXGxldFxpdGVtPVxpdGVtaXplaXRlbQorfQorCislIERlZmluaXRpb24gb2YgQGl0ZW0gd2hpbGUgaW5zaWRlIEBpdGVtaXplIGFuZCBAZW51bWVyYXRlLgorJQorXGRlZlxpdGVtaXplaXRlbXslCisgIFxhZHZhbmNlXGl0ZW1ubyBieSAxICAlIGZvciBlbnVtZXJhdGlvbnMKKyAge1xsZXRccGFyPVxlbmRncmFmIFxzbWFsbGJyZWFrfSUgcmVhc29uYWJsZSBwbGFjZSB0byBicmVhaworICB7JQorICAgJSBJZiB0aGUgZG9jdW1lbnQgaGFzIGFuIEBpdGVtaXplIGRpcmVjdGx5IGFmdGVyIGEgc2VjdGlvbiB0aXRsZSwgYQorICAgJSBcbm9icmVhayB3aWxsIGJlIGxhc3Qgb24gdGhlIGxpc3QsIGFuZCBcc2VjdGlvbmhlYWRpbmcgd2lsbCBoYXZlCisgICAlIGRvbmUgYSBcdnNraXAtXHBhcnNraXAuICBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gemVybworICAgJSBwYXJza2lwLCBvciB0aGUgaXRlbSB0ZXh0IHdpbGwgY3Jhc2ggd2l0aCB0aGUgaGVhZGluZy4gIE9uIHRoZQorICAgJSBvdGhlciBoYW5kLCB3aGVuIHRoZXJlIGlzIG5vcm1hbCB0ZXh0IHByZWNlZGluZyB0aGUgaXRlbSAoYXMgdGhlcmUKKyAgICUgdXN1YWxseSBpcyksIHdlIGRvIHdhbnQgdG8gemVybyBwYXJza2lwLCBvciB0aGVyZSB3b3VsZCBiZSB0b28gbXVjaAorICAgJSBzcGFjZS4gIEluIHRoYXQgY2FzZSwgd2Ugd29uJ3QgaGF2ZSBhIFxub2JyZWFrIGJlZm9yZS4gIEF0IGxlYXN0CisgICAlIHRoYXQncyB0aGUgdGhlb3J5LgorICAgXGlmbnVtXGxhc3RwZW5hbHR5PDEwMDAwIFxwYXJza2lwPTBpbiBcZmkKKyAgIFxub2luZGVudAorICAgXGhib3ggdG8gMHB0e1xoc3MgXGl0ZW1jb250ZW50cyBca2VyblxpdGVtbWFyZ2lufSUKKyAgIFx2YWRqdXN0e1xwZW5hbHR5IDEyMDB9fSUgbm90IGdvb2QgdG8gYnJlYWsgYWZ0ZXIgZmlyc3QgbGluZSBvZiBpdGVtLgorICBcZmx1c2hjcgorfQorCislIFxzcGxpdG9mZiBUT0tFTlNcZW5kbWFyayBkZWZpbmVzIFxmaXJzdCB0byBiZSB0aGUgZmlyc3QgdG9rZW4gaW4KKyUgVE9LRU5TLCBhbmQgXHJlc3QgdG8gYmUgdGhlIHJlbWFpbmRlci4KKyUKK1xkZWZcc3BsaXRvZmYjMSMyXGVuZG1hcmt7XGRlZlxmaXJzdHsjMX1cZGVmXHJlc3R7IzJ9fSUKKworJSBBbGxvdyBhbiBvcHRpb25hbCBhcmd1bWVudCBvZiBhbiB1cHBlcmNhc2UgbGV0dGVyLCBsb3dlcmNhc2UgbGV0dGVyLAorJSBvciBudW1iZXIsIHRvIHNwZWNpZnkgdGhlIGZpcnN0IGxhYmVsIGluIHRoZSBlbnVtZXJhdGVkIGxpc3QuICBObworJSBhcmd1bWVudCBpcyB0aGUgc2FtZSBhcyBgMScuCislCitcZW52cGFyc2VhcmdkZWZcZW51bWVyYXRle1xlbnVtZXJhdGV5ICMxICBcZW5kZW51bWVyYXRleX0KK1xkZWZcZW51bWVyYXRleSAjMSAjMlxlbmRlbnVtZXJhdGV5eyUKKyAgJSBJZiB3ZSB3ZXJlIGdpdmVuIG5vIGFyZ3VtZW50LCBwcmV0ZW5kIHdlIHdlcmUgZ2l2ZW4gYDEnLgorICBcZGVmXHRoZWFyZ3sjMX0lCisgIFxpZnhcdGhlYXJnXGVtcHR5IFxkZWZcdGhlYXJnezF9XGZpCisgICUKKyAgJSBEZXRlY3QgaWYgdGhlIGFyZ3VtZW50IGlzIGEgc2luZ2xlIHRva2VuLiAgSWYgc28sIGl0IG1pZ2h0IGJlIGEKKyAgJSBsZXR0ZXIuICBPdGhlcndpc2UsIHRoZSBvbmx5IHZhbGlkIHRoaW5nIGl0IGNhbiBiZSBpcyBhIG51bWJlci4KKyAgJSAoV2Ugd2lsbCBhbHdheXMgaGF2ZSBvbmUgdG9rZW4sIGJlY2F1c2Ugb2YgdGhlIHRlc3Qgd2UganVzdCBtYWRlLgorICAlIFRoaXMgaXMgYSBnb29kIHRoaW5nLCBzaW5jZSBcc3BsaXRvZmYgZG9lc24ndCB3b3JrIGdpdmVuIG5vdGhpbmcgYXQKKyAgJSBhbGwgLS0gdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB1bmRlbGltaXRlZC4pCisgIFxleHBhbmRhZnRlclxzcGxpdG9mZlx0aGVhcmdcZW5kbWFyaworICBcaWZ4XHJlc3RcZW1wdHkKKyAgICAlIE9ubHkgb25lIHRva2VuIGluIHRoZSBhcmd1bWVudC4gIEl0IGNvdWxkIHN0aWxsIGJlIGFueXRoaW5nLgorICAgICUgQSBgYGxvd2VyY2FzZSBsZXR0ZXInJyBpcyBvbmUgd2hvc2UgXGxjY29kZSBpcyBub256ZXJvLgorICAgICUgQW4gYGB1cHBlcmNhc2UgbGV0dGVyJycgaXMgb25lIHdob3NlIFxsY2NvZGUgaXMgYm90aCBub256ZXJvLCBhbmQKKyAgICAlICAgbm90IGVxdWFsIHRvIGl0c2VsZi4KKyAgICAlIE90aGVyd2lzZSwgd2UgYXNzdW1lIGl0J3MgYSBudW1iZXIuCisgICAgJQorICAgICUgV2UgbmVlZCB0aGUgXHJlbGF4IGF0IHRoZSBlbmQgb2YgdGhlIFxpZm51bSBsaW5lcyB0byBzdG9wIFRlWCBmcm9tCisgICAgJSBjb250aW51aW5nIHRvIGxvb2sgZm9yIGEgPG51bWJlcj4uCisgICAgJQorICAgIFxpZm51bVxsY2NvZGVcZXhwYW5kYWZ0ZXJgXHRoZWFyZz0wXHJlbGF4CisgICAgICBcbnVtZXJpY2VudW1lcmF0ZSAlIGEgbnVtYmVyICh3ZSBob3BlKQorICAgIFxlbHNlCisgICAgICAlIEl0J3MgYSBsZXR0ZXIuCisgICAgICBcaWZudW1cbGNjb2RlXGV4cGFuZGFmdGVyYFx0aGVhcmc9XGV4cGFuZGFmdGVyYFx0aGVhcmdccmVsYXgKKyAgICAgICAgXGxvd2VyY2FzZWVudW1lcmF0ZSAlIGxvd2VyY2FzZSBsZXR0ZXIKKyAgICAgIFxlbHNlCisgICAgICAgIFx1cHBlcmNhc2VlbnVtZXJhdGUgJSB1cHBlcmNhc2UgbGV0dGVyCisgICAgICBcZmkKKyAgICBcZmkKKyAgXGVsc2UKKyAgICAlIE11bHRpcGxlIHRva2VucyBpbiB0aGUgYXJndW1lbnQuICBXZSBob3BlIGl0J3MgYSBudW1iZXIuCisgICAgXG51bWVyaWNlbnVtZXJhdGUKKyAgXGZpCit9CisKKyUgQW4gQGVudW1lcmF0ZSB3aG9zZSBsYWJlbHMgYXJlIGludGVnZXJzLiAgVGhlIHN0YXJ0aW5nIGludGVnZXIgaXMKKyUgZ2l2ZW4gaW4gXHRoZWFyZy4KKyUKK1xkZWZcbnVtZXJpY2VudW1lcmF0ZXslCisgIFxpdGVtbm8gPSBcdGhlYXJnCisgIFxzdGFydGVudW1lcmF0aW9ue1x0aGVcaXRlbW5vfSUKK30KKworJSBUaGUgc3RhcnRpbmcgKGxvd2VyY2FzZSkgbGV0dGVyIGlzIGluIFx0aGVhcmcuCitcZGVmXGxvd2VyY2FzZWVudW1lcmF0ZXslCisgIFxpdGVtbm8gPSBcZXhwYW5kYWZ0ZXJgXHRoZWFyZworICBcc3RhcnRlbnVtZXJhdGlvbnslCisgICAgJSBCZSBzdXJlIHdlJ3JlIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYWxwaGFiZXQuCisgICAgXGlmbnVtXGl0ZW1ubz0wCisgICAgICBcZXJybWVzc2FnZXtObyBtb3JlIGxvd2VyY2FzZSBsZXR0ZXJzIGluIEBlbnVtZXJhdGU7IGdldCBhIGJpZ2dlcgorICAgICAgICAgICAgICAgICAgYWxwaGFiZXR9JQorICAgIFxmaQorICAgIFxjaGFyXGxjY29kZVxpdGVtbm8KKyAgfSUKK30KKworJSBUaGUgc3RhcnRpbmcgKHVwcGVyY2FzZSkgbGV0dGVyIGlzIGluIFx0aGVhcmcuCitcZGVmXHVwcGVyY2FzZWVudW1lcmF0ZXslCisgIFxpdGVtbm8gPSBcZXhwYW5kYWZ0ZXJgXHRoZWFyZworICBcc3RhcnRlbnVtZXJhdGlvbnslCisgICAgJSBCZSBzdXJlIHdlJ3JlIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYWxwaGFiZXQuCisgICAgXGlmbnVtXGl0ZW1ubz0wCisgICAgICBcZXJybWVzc2FnZXtObyBtb3JlIHVwcGVyY2FzZSBsZXR0ZXJzIGluIEBlbnVtZXJhdGU7IGdldCBhIGJpZ2dlcgorICAgICAgICAgICAgICAgICAgYWxwaGFiZXR9CisgICAgXGZpCisgICAgXGNoYXJcdWNjb2RlXGl0ZW1ubworICB9JQorfQorCislIENhbGwgXGRvaXRlbWl6ZSwgYWRkaW5nIGEgcGVyaW9kIHRvIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgc3VwcGx5aW5nIHRoZQorJSBjb21tb24gbGFzdCB0d28gYXJndW1lbnRzLiAgQWxzbyBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgaW5pdGlhbCB2YWx1ZSBpbgorJSBcaXRlbW5vLCBzaW5jZSBAaXRlbSBpbmNyZW1lbnRzIFxpdGVtbm8uCislCitcZGVmXHN0YXJ0ZW51bWVyYXRpb24jMXslCisgIFxhZHZhbmNlXGl0ZW1ubyBieSAtMQorICBcZG9pdGVtaXpleyMxLn1cZmx1c2hjcgorfQorCislIEBhbHBoYWVudW1lcmF0ZSBhbmQgQGNhcHNlbnVtZXJhdGUgYXJlIGFiYnJldmlhdGlvbnMgZm9yIGdpdmluZyBhbiBhcmcKKyUgdG8gQGVudW1lcmF0ZS4KKyUKK1xkZWZcYWxwaGFlbnVtZXJhdGV7XGVudW1lcmF0ZXthfX0KK1xkZWZcY2Fwc2VudW1lcmF0ZXtcZW51bWVyYXRle0F9fQorXGRlZlxFYWxwaGFlbnVtZXJhdGV7XEVlbnVtZXJhdGV9CitcZGVmXEVjYXBzZW51bWVyYXRle1xFZW51bWVyYXRlfQorCisKKyUgQG11bHRpdGFibGUgbWFjcm9zCislIEFteSBIZW5kcmlja3NvbiwgOC8xOC85NCwgMy82Lzk2CislCislIEBtdWx0aXRhYmxlIC4uLiBAZW5kIG11bHRpdGFibGUgd2lsbCBtYWtlIGFzIG1hbnkgY29sdW1ucyBhcyBkZXNpcmVkLgorJSBDb250ZW50cyBvZiBlYWNoIGNvbHVtbiB3aWxsIHdyYXAgYXQgd2lkdGggZ2l2ZW4gaW4gcHJlYW1ibGUuICBXaWR0aAorJSBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHNhbXBsZSB0ZXh0IGdpdmVuIGluIGEgdGVtcGxhdGUgbGluZSwKKyUgb3IgaW4gcGVyY2VudCBvZiBcaHNpemUsIHRoZSBjdXJyZW50IHdpZHRoIG9mIHRleHQgb24gcGFnZS4KKworJSBUYWJsZSBjYW4gY29udGludWUgb3ZlciBwYWdlcyBidXQgd2lsbCBvbmx5IGJyZWFrIGJldHdlZW4gbGluZXMuCisKKyUgVG8gbWFrZSBwcmVhbWJsZToKKyUKKyUgRWl0aGVyIGRlZmluZSB3aWR0aHMgb2YgY29sdW1ucyBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZToKKyUgICBAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC4yNSAuMyAuNDUKKyUgICBAaXRlbSAuLi4KKyUKKyUgICBOdW1iZXJzIGZvbGxvd2luZyBAY29sdW1uZnJhY3Rpb25zIGFyZSB0aGUgcGVyY2VudCBvZiB0aGUgdG90YWwKKyUgICBjdXJyZW50IGhzaXplIHRvIGJlIHVzZWQgZm9yIGVhY2ggY29sdW1uLiBZb3UgbWF5IHVzZSBhcyBtYW55CislICAgY29sdW1ucyBhcyBkZXNpcmVkLgorCisKKyUgT3IgdXNlIGEgdGVtcGxhdGU6CislICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9IHtDb2x1bW4gMyB0ZW1wbGF0ZX0KKyUgICBAaXRlbSAuLi4KKyUgICB1c2luZyB0aGUgd2lkZXN0IHRlcm0gZGVzaXJlZCBpbiBlYWNoIGNvbHVtbi4KKworJSBFYWNoIG5ldyB0YWJsZSBsaW5lIHN0YXJ0cyB3aXRoIEBpdGVtLCBlYWNoIHN1YnNlcXVlbnQgbmV3IGNvbHVtbgorJSBzdGFydHMgd2l0aCBAdGFiLiBFbXB0eSBjb2x1bW5zIG1heSBiZSBwcm9kdWNlZCBieSBzdXBwbHlpbmcgQHRhYidzCislIHdpdGggbm90aGluZyBiZXR3ZWVuIHRoZW0gZm9yIGFzIG1hbnkgdGltZXMgYXMgZW1wdHkgY29sdW1ucyBhcmUgbmVlZGVkLAorJSBpZSwgQHRhYkB0YWJAdGFiIHdpbGwgcHJvZHVjZSB0d28gZW1wdHkgY29sdW1ucy4KKworJSBAaXRlbSwgQHRhYiBkbyBub3QgbmVlZCB0byBiZSBvbiB0aGVpciBvd24gbGluZXMsIGJ1dCBpdCB3aWxsIG5vdCBodXJ0CislIGlmIHRoZXkgYXJlLgorCislIFNhbXBsZSBtdWx0aXRhYmxlOgorCislICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9IHtDb2x1bW4gMyB0ZW1wbGF0ZX0KKyUgICBAaXRlbSBmaXJzdCBjb2wgc3R1ZmYgQHRhYiBzZWNvbmQgY29sIHN0dWZmIEB0YWIgdGhpcmQgY29sCislICAgQGl0ZW0KKyUgICBmaXJzdCBjb2wgc3R1ZmYKKyUgICBAdGFiCislICAgc2Vjb25kIGNvbCBzdHVmZgorJSAgIEB0YWIKKyUgICB0aGlyZCBjb2wKKyUgICBAaXRlbSBmaXJzdCBjb2wgc3R1ZmYgQHRhYiBzZWNvbmQgY29sIHN0dWZmCislICAgQHRhYiBNYW55IHBhcmFncmFwaHMgb2YgdGV4dCBtYXkgYmUgdXNlZCBpbiBhbnkgY29sdW1uLgorJQorJSAgICAgICAgIFRoZXkgd2lsbCB3cmFwIGF0IHRoZSB3aWR0aCBkZXRlcm1pbmVkIGJ5IHRoZSB0ZW1wbGF0ZS4KKyUgICBAaXRlbUB0YWJAdGFiIFRoaXMgd2lsbCBiZSBpbiB0aGlyZCBjb2x1bW4uCislICAgQGVuZCBtdWx0aXRhYmxlCisKKyUgRGVmYXVsdCBkaW1lbnNpb25zIG1heSBiZSByZXNldCBieSB1c2VyLgorJSBAbXVsdGl0YWJsZXBhcnNraXAgaXMgdmVydGljYWwgc3BhY2UgYmV0d2VlbiBwYXJhZ3JhcGhzIGluIHRhYmxlLgorJSBAbXVsdGl0YWJsZXBhcmluZGVudCBpcyBwYXJhZ3JhcGggaW5kZW50IGluIHRhYmxlLgorJSBAbXVsdGl0YWJsZWNvbG1hcmdpbiBpcyBob3Jpem9udGFsIHNwYWNlIHRvIGJlIGxlZnQgYmV0d2VlbiBjb2x1bW5zLgorJSBAbXVsdGl0YWJsZWxpbmVzcGFjZSBpcyBzcGFjZSB0byBsZWF2ZSBiZXR3ZWVuIHRhYmxlIGl0ZW1zLCBiYXNlbGluZQorJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJhc2VsaW5lLgorJSAgIDBwdCBtZWFucyBpdCBkZXBlbmRzIG9uIGN1cnJlbnQgbm9ybWFsIGxpbmUgc3BhY2luZy4KKyUKK1xuZXdza2lwXG11bHRpdGFibGVwYXJza2lwCitcbmV3c2tpcFxtdWx0aXRhYmxlcGFyaW5kZW50CitcbmV3ZGltZW5cbXVsdGl0YWJsZWNvbHNwYWNlCitcbmV3c2tpcFxtdWx0aXRhYmxlbGluZXNwYWNlCitcbXVsdGl0YWJsZXBhcnNraXA9MHB0CitcbXVsdGl0YWJsZXBhcmluZGVudD02cHQKK1xtdWx0aXRhYmxlY29sc3BhY2U9MTJwdAorXG11bHRpdGFibGVsaW5lc3BhY2U9MHB0CisKKyUgTWFjcm9zIHVzZWQgdG8gc2V0IHVwIGhhbGlnbiBwcmVhbWJsZToKKyUKK1xsZXRcZW5kc2V0dXB0YWJsZVxyZWxheAorXGRlZlx4ZW5kc2V0dXB0YWJsZXtcZW5kc2V0dXB0YWJsZX0KK1xsZXRcY29sdW1uZnJhY3Rpb25zXHJlbGF4CitcZGVmXHhjb2x1bW5mcmFjdGlvbnN7XGNvbHVtbmZyYWN0aW9uc30KK1xuZXdpZlxpZnNldHBlcmNlbnQKKworJSAjMSBpcyB0aGUgQGNvbHVtbmZyYWN0aW9uLCB1c3VhbGx5IGEgZGVjaW1hbCBudW1iZXIgbGlrZSAuNSwgYnV0IG1pZ2h0CislIGJlIGp1c3QgMS4gIFdlIGp1c3QgdXNlIGl0LCB3aGF0ZXZlciBpdCBpcy4KKyUKK1xkZWZccGlja3Vwd2hvbGVmcmFjdGlvbiMxIHslCisgIFxnbG9iYWxcYWR2YW5jZVxjb2xjb3VudCBieSAxCisgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZXsjMVxoc2l6ZX0lCisgIFxzZXR1cHRhYmxlCit9CisKK1xuZXdjb3VudFxjb2xjb3VudAorXGRlZlxzZXR1cHRhYmxlIzF7JQorICBcZGVmXGZpcnN0YXJneyMxfSUKKyAgXGlmeFxmaXJzdGFyZ1x4ZW5kc2V0dXB0YWJsZQorICAgIFxsZXRcZ28gPSBccmVsYXgKKyAgXGVsc2UKKyAgICBcaWZ4XGZpcnN0YXJnXHhjb2x1bW5mcmFjdGlvbnMKKyAgICAgIFxnbG9iYWxcc2V0cGVyY2VudHRydWUKKyAgICBcZWxzZQorICAgICAgXGlmc2V0cGVyY2VudAorICAgICAgICAgXGxldFxnb1xwaWNrdXB3aG9sZWZyYWN0aW9uCisgICAgICBcZWxzZQorICAgICAgICAgXGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5IDEKKyAgICAgICAgIFxzZXRib3gwPVxoYm94eyMxXHVuc2tpcFxzcGFjZX0lIEFkZCBhIG5vcm1hbCB3b3JkIHNwYWNlIGFzIGEKKyAgICAgICAgICAgICAgICAgICAlIHNlcGFyYXRvcjsgdHlwaWNhbGx5IHRoYXQgaXMgYWx3YXlzIGluIHRoZSBpbnB1dCwgYW55d2F5LgorICAgICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1le1x0aGVcd2QwfSUKKyAgICAgIFxmaQorICAgIFxmaQorICAgIFxpZnhcZ29ccGlja3Vwd2hvbGVmcmFjdGlvbgorICAgICAgJSBQdXQgdGhlIGFyZ3VtZW50IGJhY2sgZm9yIHRoZSBccGlja3Vwd2hvbGVmcmFjdGlvbiBjYWxsLCBzbworICAgICAgJSB3ZSdsbCBhbHdheXMgaGF2ZSBhIHBlcmlvZCB0aGVyZSB0byBiZSBwYXJzZWQuCisgICAgICBcZGVmXGdve1xwaWNrdXB3aG9sZWZyYWN0aW9uIzF9JQorICAgIFxlbHNlCisgICAgICBcbGV0XGdvID0gXHNldHVwdGFibGUKKyAgICBcZmklCisgIFxmaQorICBcZ28KK30KKworJSBtdWx0aXRhYmxlLW9ubHkgY29tbWFuZHMuCislCislIEBoZWFkaXRlbSBzdGFydHMgYSBoZWFkaW5nIHJvdywgd2hpY2ggd2UgdHlwZXNldCBpbiBib2xkLgorJSBBc3NpZ25tZW50cyBoYXZlIHRvIGJlIGdsb2JhbCBzaW5jZSB3ZSBhcmUgaW5zaWRlIHRoZSBpbXBsaWNpdCBncm91cAorJSBvZiBhbiBhbGlnbm1lbnQgZW50cnkuICBOb3RlIHRoYXQgXGV2ZXJ5Y3IgcmVzZXRzIFxldmVyeXRhYi4KK1xkZWZcaGVhZGl0ZW17XGNoZWNrZW52XG11bHRpdGFibGUgXGNyY3IgXGdsb2JhbFxldmVyeXRhYj17XGJmfVx0aGVcZXZlcnl0YWJ9JQorJQorJSBBIFx0YWIgdXNlZCB0byBpbmNsdWRlIFxoc2tpcDFzcC4gIEJ1dCB0aGVuIHRoZSBzcGFjZSBpbiBhIHRlbXBsYXRlCislIGxpbmUgaXMgbm90IGVub3VnaC4gIFRoYXQgaXMgYmFkLiAgU28gbGV0J3MgZ28gYmFjayB0byBqdXN0IGAmJyB1bnRpbAorJSB3ZSBlbmNvdW50ZXIgdGhlIHByb2JsZW0gaXQgd2FzIGludGVuZGVkIHRvIHNvbHZlIGFnYWluLgorJQkJCQkJLS1rYXJsLCBuYXRoYW5AYWNtLm9yZywgMjBhcHI5OS4KK1xkZWZcdGFie1xjaGVja2VudlxtdWx0aXRhYmxlICZcdGhlXGV2ZXJ5dGFifSUKKworJSBAbXVsdGl0YWJsZSAuLi4gQGVuZCBtdWx0aXRhYmxlIGRlZmluaXRpb25zOgorJQorXG5ld3Rva3NcZXZlcnl0YWIgICUgaW5zZXJ0IGFmdGVyIGV2ZXJ5IHRhYi4KKyUKK1xlbnZkZWZcbXVsdGl0YWJsZXslCisgIFx2c2tpcFxwYXJza2lwCisgIFxzdGFydHNhdmluZ2luc2VydHMKKyAgJQorICAlIEBpdGVtIHdpdGhpbiBhIG11bHRpdGFibGUgc3RhcnRzIGEgbm9ybWFsIHJvdy4KKyAgJSBXZSB1c2UgXGRlZiBpbnN0ZWFkIG9mIFxsZXQgc28gdGhhdCBpZiBvbmUgb2YgdGhlIG11bHRpdGFibGUgZW50cmllcworICAlIGNvbnRhaW5zIGFuIEBpdGVtaXplLCB3ZSBkb24ndCBjaG9rZSBvbiB0aGUgXGl0ZW0gKHNlZW4gYXMgXGNyY3IgYWthCisgICUgXGVuZHRlbXBsYXRlKSBleHBhbmRpbmcgXGRvaXRlbWl6ZS4KKyAgXGRlZlxpdGVte1xjcmNyfSUKKyAgJQorICBcdG9sZXJhbmNlPTk1MDAKKyAgXGhiYWRuZXNzPTk1MDAKKyAgXHNldG11bHRpdGFibGVzcGFjaW5nCisgIFxwYXJza2lwPVxtdWx0aXRhYmxlcGFyc2tpcAorICBccGFyaW5kZW50PVxtdWx0aXRhYmxlcGFyaW5kZW50CisgIFxvdmVyZnVsbHJ1bGU9MHB0CisgIFxnbG9iYWxcY29sY291bnQ9MAorICAlCisgIFxldmVyeWNyID0geyUKKyAgICBcbm9hbGlnbnslCisgICAgICBcZ2xvYmFsXGV2ZXJ5dGFiPXt9JQorICAgICAgXGdsb2JhbFxjb2xjb3VudD0wICUgUmVzZXQgdGhlIGNvbHVtbiBjb3VudGVyLgorICAgICAgJSBDaGVjayBmb3Igc2F2ZWQgZm9vdG5vdGVzLCBldGMuCisgICAgICBcY2hlY2tpbnNlcnRzCisgICAgICAlIEtlZXBzIHVuZGVyZnVsbCBib3ggbWVzc2FnZXMgb2ZmIHdoZW4gdGFibGUgYnJlYWtzIG92ZXIgcGFnZXMuCisgICAgICAlXGZpbGJyZWFrCisJJSBNYXliZSBzbywgYnV0IGl0IGFsc28gY3JlYXRlcyByZWFsbHkgd2VpcmQgcGFnZSBicmVha3Mgd2hlbiB0aGUKKwklIHRhYmxlIGJyZWFrcyBvdmVyIHBhZ2VzLiBXb3VsZG4ndCBcdmZpbCBiZSBiZXR0ZXI/ICBXYWl0IHVudGlsIHRoZQorCSUgcHJvYmxlbSBtYW5pZmVzdHMgaXRzZWxmLCBzbyBpdCBjYW4gYmUgZml4ZWQgZm9yIHJlYWwgLS1rYXJsLgorICAgIH0lCisgIH0lCisgICUKKyAgXHBhcnNlYXJnXGRvbXVsdGl0YWJsZQorfQorXGRlZlxkb211bHRpdGFibGUjMXslCisgICUgVG8gcGFyc2UgZXZlcnl0aGluZyBiZXR3ZWVuIEBtdWx0aXRhYmxlIGFuZCBAaXRlbToKKyAgXHNldHVwdGFibGUjMSBcZW5kc2V0dXB0YWJsZQorICAlCisgICUgVGhpcyBwcmVhbWJsZSBzZXRzIHVwIGEgZ2VuZXJpYyBjb2x1bW4gZGVmaW5pdGlvbiwgd2hpY2ggd2lsbAorICAlIGJlIHVzZWQgYXMgbWFueSB0aW1lcyBhcyB1c2VyIGNhbGxzIGZvciBjb2x1bW5zLgorICAlIFx2dG9wIHdpbGwgc2V0IGEgc2luZ2xlIGxpbmUgYW5kIHdpbGwgYWxzbyBsZXQgdGV4dCB3cmFwIGFuZAorICAlIGNvbnRpbnVlIGZvciBtYW55IHBhcmFncmFwaHMgaWYgZGVzaXJlZC4KKyAgXGhhbGlnblxiZ3JvdXAgJiUKKyAgICBcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkgMQorICAgIFxtdWx0aXN0cnV0CisgICAgXHZ0b3B7JQorICAgICAgJSBVc2UgdGhlIGN1cnJlbnQgXGNvbGNvdW50IHRvIGZpbmQgdGhlIGNvcnJlY3QgY29sdW1uIHdpZHRoOgorICAgICAgXGhzaXplPVxleHBhbmRhZnRlclxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWUKKyAgICAgICUKKyAgICAgICUgSW4gb3JkZXIgdG8ga2VlcCBlbnRyaWVzIGZyb20gYnVtcGluZyBpbnRvIGVhY2ggb3RoZXIKKyAgICAgICUgd2Ugd2lsbCBhZGQgYSBcbGVmdHNraXAgb2YgXG11bHRpdGFibGVjb2xzcGFjZSB0byBhbGwgY29sdW1ucyBhZnRlcgorICAgICAgJSB0aGUgZmlyc3Qgb25lLgorICAgICAgJQorICAgICAgJSBJZiBhIHRlbXBsYXRlIGhhcyBiZWVuIHVzZWQsIHdlIHdpbGwgYWRkIFxtdWx0aXRhYmxlY29sc3BhY2UKKyAgICAgICUgdG8gdGhlIHdpZHRoIG9mIGVhY2ggdGVtcGxhdGUgZW50cnkuCisgICAgICAlCisgICAgICAlIElmIHRoZSB1c2VyIGhhcyBzZXQgcHJlYW1ibGUgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemUgd2Ugd2lsbAorICAgICAgJSB1c2UgdGhhdCBkaW1lbnNpb24gYXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4sIGFuZCB0aGUgXGxlZnRza2lwCisgICAgICAlIHdpbGwga2VlcCBlbnRyaWVzIGZyb20gYnVtcGluZyBpbnRvIGVhY2ggb3RoZXIuICBUYWJsZSB3aWxsIHN0YXJ0IGF0CisgICAgICAlIGxlZnQgbWFyZ2luIGFuZCBmaW5hbCBjb2x1bW4gd2lsbCBqdXN0aWZ5IGF0IHJpZ2h0IG1hcmdpbi4KKyAgICAgICUKKyAgICAgICUgTWFrZSBzdXJlIHdlIGRvbid0IGluaGVyaXQgXHJpZ2h0c2tpcCBmcm9tIHRoZSBvdXRlciBlbnZpcm9ubWVudC4KKyAgICAgIFxyaWdodHNraXA9MHB0CisgICAgICBcaWZudW1cY29sY291bnQ9MQorCSUgVGhlIGZpcnN0IGNvbHVtbiB3aWxsIGJlIGluZGVudGVkIHdpdGggdGhlIHN1cnJvdW5kaW5nIHRleHQuCisJXGFkdmFuY2VcaHNpemUgYnlcbGVmdHNraXAKKyAgICAgIFxlbHNlCisJXGlmc2V0cGVyY2VudCBcZWxzZQorCSAgJSBJZiB1c2VyIGhhcyBub3Qgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplCisJICAlIHdlIHdpbGwgYWR2YW5jZSBcaHNpemUgYnkgXG11bHRpdGFibGVjb2xzcGFjZS4KKwkgIFxhZHZhbmNlXGhzaXplIGJ5IFxtdWx0aXRhYmxlY29sc3BhY2UKKwlcZmkKKyAgICAgICAlIEluIGVpdGhlciBjYXNlIHdlIHdpbGwgbWFrZSBcbGVmdHNraXA9XG11bHRpdGFibGVjb2xzcGFjZToKKyAgICAgIFxsZWZ0c2tpcD1cbXVsdGl0YWJsZWNvbHNwYWNlCisgICAgICBcZmkKKyAgICAgICUgSWdub3Jpbmcgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIGF2b2lkcyBhbiBvY2Nhc2lvbmFsIHNwdXJpb3VzCisgICAgICAlIGJsYW5rIGxpbmUsIHdoZW4gVGVYIGRlY2lkZXMgdG8gYnJlYWsgdGhlIGxpbmUgYXQgdGhlIHNwYWNlIGJlZm9yZSB0aGUKKyAgICAgICUgYm94IGZyb20gdGhlIG11bHRpc3RydXQsIHNvIHRoZSBzdHJ1dCBlbmRzIHVwIG9uIGEgbGluZSBieSBpdHNlbGYuCisgICAgICAlIEZvciBleGFtcGxlOgorICAgICAgJSBAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC4xMSAuODkKKyAgICAgICUgQGl0ZW0gQGNvZGV7I30KKyAgICAgICUgQHRhYiBMZWdhbCBob2xpZGF5IHdoaWNoIGlzIHZhbGlkIGluIG1ham9yIHBhcnRzIG9mIHRoZSB3aG9sZSBjb3VudHJ5LgorICAgICAgJSBJcyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHdpdGggaGlnaGxpZ2h0aW5nIHNlcXVlbmNlcyByZXNwZWN0aXZlbHkKKyAgICAgICUgbWFya2luZyBjaGFyYWN0ZXJzLgorICAgICAgXG5vaW5kZW50XGlnbm9yZXNwYWNlcyMjXHVuc2tpcFxtdWx0aXN0cnV0CisgICAgfVxjcgorfQorXGRlZlxFbXVsdGl0YWJsZXslCisgIFxjcmNyCisgIFxlZ3JvdXAgJSBlbmQgdGhlIFxoYWxpZ24KKyAgXGdsb2JhbFxzZXRwZXJjZW50ZmFsc2UKK30KKworXGRlZlxzZXRtdWx0aXRhYmxlc3BhY2luZ3slCisgIFxkZWZcbXVsdGlzdHJ1dHtcc3RydXR9JSBqdXN0IHVzZSB0aGUgc3RhbmRhcmQgbGluZSBzcGFjaW5nCisgICUKKyAgJSBDb21wdXRlIFxtdWx0aXRhYmxlbGluZXNwYWNlIChpZiBub3QgZGVmaW5lZCBieSB1c2VyKSBmb3IgdXNlIGluCisgICUgXG11bHRpdGFibGVwYXJza2lwIGNhbGN1bGF0aW9uLiAgV2UgdXNlZCBkZWZpbmUgXG11bHRpc3RydXQgYmFzZWQgb24KKyAgJSB0aGlzLCBidXQgKGlyb25pY2FsbHkpIHRoYXQgY2F1c2VkIHRoZSBzcGFjaW5nIHRvIGJlIG9mZi4KKyAgJSBTZWUgYnVnLXRleGluZm8gcmVwb3J0IGZyb20gV2VybmVyIExlbWJlcmcsIDMxIE9jdCAyMDA0IDEyOjUyOjIwICswMTAwLgorXGlmZGltXG11bHRpdGFibGVsaW5lc3BhY2U9MHB0Citcc2V0Ym94MD1cdmJveHtYfVxnbG9iYWxcbXVsdGl0YWJsZWxpbmVzcGFjZT1cdGhlXGJhc2VsaW5lc2tpcAorXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVsaW5lc3BhY2UgYnktXGh0MAorXGZpCislJSBUZXN0IHRvIHNlZSBpZiBwYXJza2lwIGlzIGxhcmdlciB0aGFuIHNwYWNlIGJldHdlZW4gbGluZXMgb2YKKyUlIHRhYmxlLiBJZiBub3QsIGRvIG5vdGhpbmcuCislJSAgICAgICAgSWYgc28sIHNldCB0byBzYW1lIGRpbWVuc2lvbiBhcyBtdWx0aXRhYmxlbGluZXNwYWNlLgorXGlmZGltXG11bHRpdGFibGVwYXJza2lwPlxtdWx0aXRhYmxlbGluZXNwYWNlCitcZ2xvYmFsXG11bHRpdGFibGVwYXJza2lwPVxtdWx0aXRhYmxlbGluZXNwYWNlCitcZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlIHRoYW4gc2tpcCBiZXR3ZWVuIGxpbmVzIGluIHRoZSB0YWJsZS4KK1xmaSUKK1xpZmRpbVxtdWx0aXRhYmxlcGFyc2tpcD0wcHQKK1xnbG9iYWxcbXVsdGl0YWJsZXBhcnNraXA9XG11bHRpdGFibGVsaW5lc3BhY2UKK1xnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlcGFyc2tpcC03cHQgJSUgdG8ga2VlcCBwYXJza2lwIHNvbWV3aGF0IHNtYWxsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSUgdGhhbiBza2lwIGJldHdlZW4gbGluZXMgaW4gdGhlIHRhYmxlLgorXGZpfQorCisKK1xtZXNzYWdle2NvbmRpdGlvbmFscyx9CisKKyUgQGlmdGV4LCBAaWZub3Rkb2Nib29rLCBAaWZub3RodG1sLCBAaWZub3RpbmZvLCBAaWZub3RwbGFpbnRleHQsCislIEBpZm5vdHhtbCBhbHdheXMgc3VjY2VlZC4gIFRoZXkgY3VycmVudGx5IGRvIG5vdGhpbmc7IHdlIGRvbid0CislIGF0dGVtcHQgdG8gY2hlY2sgd2hldGhlciB0aGUgY29uZGl0aW9uYWxzIGFyZSBwcm9wZXJseSBuZXN0ZWQuICBCdXQgd2UKKyUgaGF2ZSB0byByZW1lbWJlciB0aGF0IHRoZXkgYXJlIGNvbmRpdGlvbmFscywgc28gdGhhdCBAZW5kIGRvZXNuJ3QKKyUgYXR0ZW1wdCB0byBjbG9zZSBhbiBlbnZpcm9ubWVudCBncm91cC4KKyUKK1xkZWZcbWFrZWNvbmQjMXslCisgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lICMxXGVuZGNzbmFtZSA9IFxyZWxheAorICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBpc2NvbmQuIzFcZW5kY3NuYW1lID0gMQorfQorXG1ha2Vjb25ke2lmdGV4fQorXG1ha2Vjb25ke2lmbm90ZG9jYm9va30KK1xtYWtlY29uZHtpZm5vdGh0bWx9CitcbWFrZWNvbmR7aWZub3RpbmZvfQorXG1ha2Vjb25ke2lmbm90cGxhaW50ZXh0fQorXG1ha2Vjb25ke2lmbm90eG1sfQorCislIElnbm9yZSBAaWdub3JlLCBAaWZodG1sLCBAaWZpbmZvLCBhbmQgdGhlIGxpa2UuCislCitcZGVmXGRpcmVudHJ5e1xkb2lnbm9yZXtkaXJlbnRyeX19CitcZGVmXGRvY3VtZW50ZGVzY3JpcHRpb257XGRvaWdub3Jle2RvY3VtZW50ZGVzY3JpcHRpb259fQorXGRlZlxkb2Nib29re1xkb2lnbm9yZXtkb2Nib29rfX0KK1xkZWZcaHRtbHtcZG9pZ25vcmV7aHRtbH19CitcZGVmXGlmZG9jYm9va3tcZG9pZ25vcmV7aWZkb2Nib29rfX0KK1xkZWZcaWZodG1se1xkb2lnbm9yZXtpZmh0bWx9fQorXGRlZlxpZmluZm97XGRvaWdub3Jle2lmaW5mb319CitcZGVmXGlmbm90dGV4e1xkb2lnbm9yZXtpZm5vdHRleH19CitcZGVmXGlmcGxhaW50ZXh0e1xkb2lnbm9yZXtpZnBsYWludGV4dH19CitcZGVmXGlmeG1se1xkb2lnbm9yZXtpZnhtbH19CitcZGVmXGlnbm9yZXtcZG9pZ25vcmV7aWdub3JlfX0KK1xkZWZcbWVudXtcZG9pZ25vcmV7bWVudX19CitcZGVmXHhtbHtcZG9pZ25vcmV7eG1sfX0KKworJSBJZ25vcmUgdGV4dCB1bnRpbCBhIGxpbmUgYEBlbmQgIzEnLCBrZWVwaW5nIHRyYWNrIG9mIG5lc3RlZCBjb25kaXRpb25hbHMuCislCislIEEgY291bnQgdG8gcmVtZW1iZXIgdGhlIGRlcHRoIG9mIG5lc3RpbmcuCitcbmV3Y291bnRcZG9pZ25vcmVjb3VudAorCitcZGVmXGRvaWdub3JlIzF7XGJlZ2luZ3JvdXAKKyAgJSBTY2FuIGluIGBgdmVyYmF0aW0nJyBtb2RlOgorICBcY2F0Y29kZWBcQCA9IFxvdGhlcgorICBcY2F0Y29kZWBceyA9IFxvdGhlcgorICBcY2F0Y29kZWBcfSA9IFxvdGhlcgorICAlCisgICUgTWFrZSBzdXJlIHRoYXQgc3BhY2VzIHR1cm4gaW50byB0b2tlbnMgdGhhdCBtYXRjaCB3aGF0IFxkb2lnbm9yZXRleHQgd2FudHMuCisgIFxzcGFjZWlzc3BhY2UKKyAgJQorICAlIENvdW50IG51bWJlciBvZiAjMSdzIHRoYXQgd2UndmUgc2Vlbi4KKyAgXGRvaWdub3JlY291bnQgPSAwCisgICUKKyAgJSBTd2FsbG93IHRleHQgdW50aWwgd2UgcmVhY2ggdGhlIG1hdGNoaW5nIGBAZW5kICMxJy4KKyAgXGRvZG9pZ25vcmV7IzF9JQorfQorCit7IFxjYXRjb2RlYF89MTEgJSBXZSB3YW50IHRvIHVzZSBcX1NUT1BfIHdoaWNoIGNhbm5vdCBhcHBlYXIgaW4gdGV4aW5mbyBzb3VyY2UuCisgIFxvYmV5bGluZXMgJQorICAlCisgIFxnZGVmXGRvZG9pZ25vcmUjMXslCisgICAgJSAjMSBjb250YWlucyB0aGUgY29tbWFuZCBuYW1lIGFzIGEgc3RyaW5nLCBlLmcuLCBgaWZpbmZvJy4KKyAgICAlCisgICAgJSBEZWZpbmUgYSBjb21tYW5kIHRvIGZpbmQgdGhlIG5leHQgYEBlbmQgIzEnLCB3aGljaCBtdXN0IGJlIG9uIGEgbGluZQorICAgICUgYnkgaXRzZWxmLgorICAgIFxsb25nXGRlZlxkb2lnbm9yZXRleHQjIzFeXk1AZW5kICMxe1xkb2lnbm9yZXRleHR5eXkjIzFeXk1AIzFcX1NUT1BffSUKKyAgICAlIEFuZCB0aGlzIGNvbW1hbmQgdG8gZmluZCBhbm90aGVyICMxIGNvbW1hbmQsIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorICAgICUgbGluZS4gIChPdGhlcndpc2UsIHdlIHdvdWxkIGNvbnNpZGVyIGEgbGluZSBgQGMgQGlmc2V0JywgZm9yCisgICAgJSBleGFtcGxlLCB0byBjb3VudCBhcyBhbiBAaWZzZXQgZm9yIG5lc3RpbmcuKQorICAgIFxsb25nXGRlZlxkb2lnbm9yZXRleHR5eXkjIzFeXk1AIzEjIzJcX1NUT1Bfe1xkb2lnbm9yZXl5eXsjIzJ9XF9TVE9QX30lCisgICAgJQorICAgICUgQW5kIG5vdyBleHBhbmQgdGhhdCBjb21tYW5kLgorICAgIFxvYmV5bGluZXMgJQorICAgIFxkb2lnbm9yZXRleHQgXl5NJQorICB9JQorfQorCitcZGVmXGRvaWdub3JleXl5IzF7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcZW1wdHkJCQklIE5vdGhpbmcgZm91bmQuCisgICAgXGxldFxuZXh0XGRvaWdub3JldGV4dHp6egorICBcZWxzZQkJCQkJJSBGb3VuZCBhIG5lc3RlZCBjb25kaXRpb24sIC4uLgorICAgIFxhZHZhbmNlXGRvaWdub3JlY291bnQgYnkgMQorICAgIFxsZXRcbmV4dFxkb2lnbm9yZXRleHR5eXkJCSUgLi4uLCBsb29rIGZvciBhbm90aGVyLgorICAgICUgSWYgd2UncmUgaGVyZSwgIzEgZW5kcyB3aXRoIF5eTVxpZmluZm8gKGZvciBleGFtcGxlKS4KKyAgXGZpCisgIFxuZXh0ICMxJSB0aGUgdG9rZW4gXF9TVE9QXyBpcyBwcmVzZW50IGp1c3QgYWZ0ZXIgdGhpcyBtYWNyby4KK30KKworJSBXZSBoYXZlIHRvIHN3YWxsb3cgdGhlIHJlbWFpbmluZyAiXF9TVE9QXyIuCislCitcZGVmXGRvaWdub3JldGV4dHp6eiMxeyUKKyAgXGlmbnVtXGRvaWdub3JlY291bnQgPSAwCSUgV2UgaGF2ZSBqdXN0IGZvdW5kIHRoZSBvdXRlcm1vc3QgQGVuZC4KKyAgICBcbGV0XG5leHRcZW5kZG9pZ25vcmUKKyAgXGVsc2UJCQkJJSBTdGlsbCBpbnNpZGUgYSBuZXN0ZWQgY29uZGl0aW9uLgorICAgIFxhZHZhbmNlXGRvaWdub3JlY291bnQgYnkgLTEKKyAgICBcbGV0XG5leHRcZG9pZ25vcmV0ZXh0ICAgICAgJSBMb29rIGZvciB0aGUgbmV4dCBAZW5kLgorICBcZmkKKyAgXG5leHQKK30KKworJSBGaW5pc2ggb2ZmIGlnbm9yZWQgdGV4dC4KK1xkZWZcZW5kZG9pZ25vcmV7XGVuZGdyb3VwXGlnbm9yZXNwYWNlc30KKworCislIEBzZXQgVkFSIHNldHMgdGhlIHZhcmlhYmxlIFZBUiB0byBhbiBlbXB0eSB2YWx1ZS4KKyUgQHNldCBWQVIgUkVTVC1PRi1MSU5FIHNldHMgVkFSIHRvIHRoZSB2YWx1ZSBSRVNULU9GLUxJTkUuCislCislIFNpbmNlIHdlIHdhbnQgdG8gc2VwYXJhdGUgVkFSIGZyb20gUkVTVC1PRi1MSU5FICh3aGljaCBtaWdodCBiZQorJSBlbXB0eSksIHdlIGNhbid0IGp1c3QgdXNlIFxwYXJzZWFyZzsgd2UgaGF2ZSB0byBpbnNlcnQgYSBzcGFjZSBvZiBvdXIKKyUgb3duIHRvIGRlbGltaXQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIGFuZCB0aGVuIHRha2UgaXQgb3V0IGFnYWluIGlmIHdlCislIGRpZG4ndCBuZWVkIGl0LgorJSBXZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgXHBhcnNlYXJnIHNldHMgXGNhdGNvZGVgXCA9MTAuCislCitccGFyc2VhcmdkZWZcc2V0e1xzZXR5eXkjMSBcZW5kc2V0eXl5fQorXGRlZlxzZXR5eXkjMSAjMlxlbmRzZXR5eXl7JQorICB7JQorICAgIFxtYWtldmFsdWVleHBhbmRhYmxlCisgICAgXGRlZlx0ZW1weyMyfSUKKyAgICBcZWRlZlxuZXh0e1xnZGVmXG1ha2Vjc25hbWV7U0VUIzF9fSUKKyAgICBcaWZ4XHRlbXBcZW1wdHkKKyAgICAgIFxuZXh0e30lCisgICAgXGVsc2UKKyAgICAgIFxzZXR6enojMlxlbmRzZXR6enoKKyAgICBcZmkKKyAgfSUKK30KKyUgUmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZSBcc2V0eHh4IGluc2VydGVkLgorXGRlZlxzZXR6enojMSBcZW5kc2V0enp6e1xuZXh0eyMxfX0KKworJSBAY2xlYXIgVkFSIGNsZWFycyAoaS5lLiwgdW5zZXRzKSB0aGUgdmFyaWFibGUgVkFSLgorJQorXHBhcnNlYXJnZGVmXGNsZWFyeyUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBTRVQjMVxlbmRjc25hbWU9XHJlbGF4CisgIH0lCit9CisKKyUgQHZhbHVle2Zvb30gZ2V0cyB0aGUgdGV4dCBzYXZlZCBpbiB2YXJpYWJsZSBmb28uCitcZGVmXHZhbHVle1xiZWdpbmdyb3VwXG1ha2V2YWx1ZWV4cGFuZGFibGVcdmFsdWV4eHh9CitcZGVmXHZhbHVleHh4IzF7XGV4cGFuZGFibGV2YWx1ZXsjMX1cZW5kZ3JvdXB9Cit7CisgIFxjYXRjb2RlYFwtID0gXGFjdGl2ZSBcY2F0Y29kZWBcXyA9IFxhY3RpdmUKKyAgJQorICBcZ2RlZlxtYWtldmFsdWVleHBhbmRhYmxleyUKKyAgICBcbGV0XHZhbHVlID0gXGV4cGFuZGFibGV2YWx1ZQorICAgICUgV2UgZG9uJ3Qgd2FudCB0aGVzZSBjaGFyYWN0ZXJzIGFjdGl2ZSwgLi4uCisgICAgXGNhdGNvZGVgXC09XG90aGVyIFxjYXRjb2RlYFxfPVxvdGhlcgorICAgICUgLi4uLCBidXQgd2UgbWlnaHQgZW5kIHVwIHdpdGggYWN0aXZlIG9uZXMgaW4gdGhlIGFyZ3VtZW50IGlmCisgICAgJSB3ZSdyZSBjYWxsZWQgZnJvbSBAY29kZSwgYXMgQGNvZGV7QHZhbHVle2Zvby1iYXJffX0sIHRob3VnaC4KKyAgICAlIFNvIFxsZXQgdGhlbSB0byB0aGVpciBub3JtYWwgZXF1aXZhbGVudHMuCisgICAgXGxldC1ccmVhbGRhc2ggXGxldF9cbm9ybWFsdW5kZXJzY29yZQorICB9Cit9CisKKyUgV2UgaGF2ZSB0aGlzIHN1YnJvdXRpbmUgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGF0IGxlYXN0IHNvbWUgQHZhbHVlJ3MKKyUgcHJvcGVybHkgaW4gaW5kZXhlcyAod2UgY2FsbCBcbWFrZXZhbHVlZXhwYW5kYWJsZSBpbiBcaW5kZXhkdW1taWVzKS4KKyUgVGhlIGNvbW1hbmQgaGFzIHRvIGJlIGZ1bGx5IGV4cGFuZGFibGUgKGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQpLCBzaW5jZQorJSB0aGUgcmVzdWx0IHdpbmRzIHVwIGluIHRoZSBpbmRleCBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IGlmIHRoZQorJSB2YXJpYWJsZSdzIHZhbHVlIGNvbnRhaW5zIG90aGVyIFRleGluZm8gY29tbWFuZHMsIGl0J3MgYWxtb3N0IGNlcnRhaW4KKyUgaXQgd2lsbCBmYWlsIChhbHRob3VnaCBwZXJoYXBzIHdlIGNvdWxkIGZpeCB0aGF0IHdpdGggc3VmZmljaWVudCB3b3JrCislIHRvIGRvIGEgb25lLWxldmVsIGV4cGFuc2lvbiBvbiB0aGUgcmVzdWx0LCBpbnN0ZWFkIG9mIGNvbXBsZXRlKS4KKyUKK1xkZWZcZXhwYW5kYWJsZXZhbHVlIzF7JQorICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKKyAgICB7W05vIHZhbHVlIGZvciBgYCMxJyddfSUKKyAgICBcbWVzc2FnZXtWYXJpYWJsZSBgIzEnLCB1c2VkIGluIEB2YWx1ZSwgaXMgbm90IHNldC59JQorICBcZWxzZQorICAgIFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lCisgIFxmaQorfQorCislIEBpZnNldCBWQVIgLi4uIEBlbmQgaWZzZXQgcmVhZHMgdGhlIGAuLi4nIGlmZiBWQVIgaGFzIGJlZW4gZGVmaW5lZAorJSB3aXRoIEBzZXQuCislCislIFRvIGdldCBzcGVjaWFsIHRyZWF0bWVudCBvZiBgQGVuZCBpZnNldCwnIGNhbGwgXG1ha2VvbmQgYW5kIHRoZSByZWRlZmluZS4KKyUKK1xtYWtlY29uZHtpZnNldH0KK1xkZWZcaWZzZXR7XHBhcnNlYXJne1xkb2lmc2V0e1xsZXRcbmV4dD1caWZzZXRmYWlsfX19CitcZGVmXGRvaWZzZXQjMSMyeyUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxsZXRcbmV4dD1cZW1wdHkKKyAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMlxlbmRjc25hbWVccmVsYXgKKyAgICAgICMxJSBJZiBub3Qgc2V0LCByZWRlZmluZSBcbmV4dC4KKyAgICBcZmkKKyAgICBcZXhwYW5kYWZ0ZXIKKyAgfVxuZXh0Cit9CitcZGVmXGlmc2V0ZmFpbHtcZG9pZ25vcmV7aWZzZXR9fQorCislIEBpZmNsZWFyIFZBUiAuLi4gQGVuZCBpZmNsZWFyIHJlYWRzIHRoZSBgLi4uJyBpZmYgVkFSIGhhcyBuZXZlciBiZWVuCislIGRlZmluZWQgd2l0aCBAc2V0LCBvciBoYXMgYmVlbiB1bmRlZmluZWQgd2l0aCBAY2xlYXIuCislCislIFRoZSBgXGVsc2UnIGluc2lkZSB0aGUgYFxkb2lmc2V0JyBwYXJhbWV0ZXIgaXMgYSB0cmljayB0byByZXVzZSB0aGUKKyUgYWJvdmUgY29kZTogaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBzZXQsIGRvIG5vdGhpbmcsIGlmIGl0IGlzIHNldCwKKyUgdGhlbiByZWRlZmluZSBcbmV4dCB0byBcaWZjbGVhcmZhaWwuCislCitcbWFrZWNvbmR7aWZjbGVhcn0KK1xkZWZcaWZjbGVhcntccGFyc2Vhcmd7XGRvaWZzZXR7XGVsc2UgXGxldFxuZXh0PVxpZmNsZWFyZmFpbH19fQorXGRlZlxpZmNsZWFyZmFpbHtcZG9pZ25vcmV7aWZjbGVhcn19CisKKyUgQGRpcmNhdGVnb3J5IENBVEVHT1JZICAtLSBzcGVjaWZ5IGEgY2F0ZWdvcnkgb2YgdGhlIGRpciBmaWxlCislIHdoaWNoIHRoaXMgZmlsZSBzaG91bGQgYmVsb25nIHRvLiAgSWdub3JlIHRoaXMgaW4gVGVYLgorXGxldFxkaXJjYXRlZ29yeT1cY29tbWVudAorCislIEBkZWZpbmluZm9lbmNsb3NlLgorXGxldFxkZWZpbmZvZW5jbG9zZT1cY29tbWVudAorCisKK1xtZXNzYWdle2luZGV4aW5nLH0KKyUgSW5kZXggZ2VuZXJhdGlvbiBmYWNpbGl0aWVzCisKKyUgRGVmaW5lIFxuZXd3cml0ZSB0byBiZSBpZGVudGljYWwgdG8gcGxhaW4gdGV4J3MgXG5ld3dyaXRlCislIGV4Y2VwdCBub3QgXG91dGVyLCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gbWFjcm9zIGFuZCBcaWYncy4KK1xlZGVmXG5ld3dyaXRle1xtYWtlY3NuYW1le3B0ZXhuZXd3cml0ZX19CisKKyUgXG5ld2luZGV4IHtmb299IGRlZmluZXMgYW4gaW5kZXggbmFtZWQgZm9vLgorJSBJdCBhdXRvbWF0aWNhbGx5IGRlZmluZXMgXGZvb2luZGV4IHN1Y2ggdGhhdAorJSBcZm9vaW5kZXggLi4ucmVzdCBvZiBsaW5lLi4uIHB1dHMgYW4gZW50cnkgaW4gdGhlIGluZGV4IGZvby4KKyUgSXQgYWxzbyBkZWZpbmVzIFxmb29pbmRmaWxlIHRvIGJlIHRoZSBudW1iZXIgb2YgdGhlIG91dHB1dCBjaGFubmVsIGZvcgorJSB0aGUgZmlsZSB0aGF0IGFjY3VtdWxhdGVzIHRoaXMgaW5kZXguICBUaGUgZmlsZSdzIGV4dGVuc2lvbiBpcyBmb28uCislIFRoZSBuYW1lIG9mIGFuIGluZGV4IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gMiBjaGFyYWN0ZXJzIGxvbmcKKyUgZm9yIHRoZSBzYWtlIG9mIHZtcy4KKyUKK1xkZWZcbmV3aW5kZXgjMXslCisgIFxpZmxpbmtzCisgICAgXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCisgICAgXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEgJSBPcGVuIHRoZSBmaWxlCisgIFxmaQorICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslICAgICAlIERlZmluZSBAIzFpbmRleAorICAgIFxub2V4cGFuZFxkb2luZGV4eyMxfX0KK30KKworJSBAZGVmaW5kZXggZm9vICA9PSAgXG5ld2luZGV4e2Zvb30KKyUKK1xkZWZcZGVmaW5kZXh7XHBhcnNlYXJnXG5ld2luZGV4fQorCislIERlZmluZSBAZGVmY29kZWluZGV4LCBsaWtlIEBkZWZpbmRleCBleGNlcHQgcHV0IGFsbCBlbnRyaWVzIGluIEBjb2RlLgorJQorXGRlZlxkZWZjb2RlaW5kZXh7XHBhcnNlYXJnXG5ld2NvZGVpbmRleH0KKyUKK1xkZWZcbmV3Y29kZWluZGV4IzF7JQorICBcaWZsaW5rcworICAgIFxleHBhbmRhZnRlclxuZXd3cml0ZSBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQorICAgIFxvcGVub3V0IFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lIFxqb2JuYW1lLiMxCisgIFxmaQorICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslCisgICAgXG5vZXhwYW5kXGRvY29kZWluZGV4eyMxfX0lCit9CisKKworJSBAc3luaW5kZXggZm9vIGJhciAgICBtYWtlcyBpbmRleCBmb28gZmVlZCBpbnRvIGluZGV4IGJhci4KKyUgRG8gdGhpcyBpbnN0ZWFkIG9mIEBkZWZpbmRleCBmb28gaWYgeW91IGRvbid0IHdhbnQgaXQgYXMgYSBzZXBhcmF0ZSBpbmRleC4KKyUKKyUgQHN5bmNvZGVpbmRleCBmb28gYmFyICAgc2ltaWxhciwgYnV0IHB1dCBhbGwgZW50cmllcyBtYWRlIGZvciBpbmRleCBmb28KKyUgaW5zaWRlIEBjb2RlLgorJQorXGRlZlxzeW5pbmRleCMxICMyIHtcZG9zeW5pbmRleFxkb2luZGV4eyMxfXsjMn19CitcZGVmXHN5bmNvZGVpbmRleCMxICMyIHtcZG9zeW5pbmRleFxkb2NvZGVpbmRleHsjMX17IzJ9fQorCislICMxIGlzIFxkb2luZGV4IG9yIFxkb2NvZGVpbmRleCwgIzIgdGhlIGluZGV4IGdldHRpbmcgcmVkZWZpbmVkIChmb28pLAorJSAjMyB0aGUgdGFyZ2V0IGluZGV4IChiYXIpLgorXGRlZlxkb3N5bmluZGV4IzEjMiMzeyUKKyAgJSBPbmx5IGRvIFxjbG9zZW91dCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBpdCwgZWxzZSB3ZSdsbCBlbmQgdXAKKyAgJSBjbG9zaW5nIHRoZSB0YXJnZXQgaW5kZXguCisgIFxleHBhbmRhZnRlciBcaWZ4XGNzbmFtZSBkb25lc3luaW5kZXgjMlxlbmRjc25hbWUgXHVuZGVmaW5lZAorICAgICUgVGhlIFxjbG9zZW91dCBoZWxwcyByZWR1Y2UgdW5uZWNlc3Nhcnkgb3BlbiBmaWxlczsgdGhlIGxpbWl0IG9uIHRoZQorICAgICUgQWNvcm4gUklTQyBPUyBpcyBhIG1lcmUgMTYgZmlsZXMuCisgICAgXGV4cGFuZGFmdGVyXGNsb3Nlb3V0XGNzbmFtZSMyaW5kZmlsZVxlbmRjc25hbWUKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZVxkb25lc3luaW5kZXgjMlxlbmRjc25hbWUgPSAxCisgIFxmaQorICAlIHJlZGVmaW5lIFxmb29pbmRmaWxlOgorICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXHRlbXBcZXhwYW5kYWZ0ZXI9XGNzbmFtZSMzaW5kZmlsZVxlbmRjc25hbWUKKyAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUjMmluZGZpbGVcZW5kY3NuYW1lPVx0ZW1wCisgICUgcmVkZWZpbmUgXGZvb2luZGV4OgorICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMmluZGV4XGVuZGNzbmFtZXtcbm9leHBhbmQjMXsjM319JQorfQorCislIERlZmluZSBcZG9pbmRleCwgdGhlIGRyaXZlciBmb3IgYWxsIFxmb29pbmRleCBtYWNyb3MuCislIEFyZ3VtZW50ICMxIGlzIGdlbmVyYXRlZCBieSB0aGUgY2FsbGluZyBcZm9vaW5kZXggbWFjcm8sCislICBhbmQgaXQgaXMgImZvbyIsIHRoZSBuYW1lIG9mIHRoZSBpbmRleC4KKworJSBcZG9pbmRleCBqdXN0IHVzZXMgXHBhcnNlYXJnOyBpdCBjYWxscyBcZG9pbmQgZm9yIHRoZSBhY3R1YWwgd29yay4KKyUgVGhpcyBpcyBiZWNhdXNlIFxkb2luZCBpcyBtb3JlIHVzZWZ1bCB0byBjYWxsIGZyb20gb3RoZXIgbWFjcm9zLgorCislIFRoZXJlIGlzIGFsc28gXGRvc3ViaW5kIHtpbmRleH17dG9waWN9e3N1YnRvcGljfQorJSB3aGljaCBtYWtlcyBhbiBlbnRyeSBpbiBhIHR3by1sZXZlbCBpbmRleCBzdWNoIGFzIHRoZSBvcGVyYXRpb24gaW5kZXguCisKK1xkZWZcZG9pbmRleCMxe1xlZGVmXGluZGV4bmFtZXsjMX1ccGFyc2Vhcmdcc2luZ2xlaW5kZXhlcn0KK1xkZWZcc2luZ2xlaW5kZXhlciAjMXtcZG9pbmR7XGluZGV4bmFtZX17IzF9fQorCislIGxpa2UgdGhlIHByZXZpb3VzIHR3bywgYnV0IHRoZXkgcHV0IEBjb2RlIGFyb3VuZCB0aGUgYXJndW1lbnQuCitcZGVmXGRvY29kZWluZGV4IzF7XGVkZWZcaW5kZXhuYW1leyMxfVxwYXJzZWFyZ1xzaW5nbGVjb2RlaW5kZXhlcn0KK1xkZWZcc2luZ2xlY29kZWluZGV4ZXIgIzF7XGRvaW5ke1xpbmRleG5hbWV9e1xjb2RleyMxfX19CisKKyUgVGFrZSBjYXJlIG9mIFRleGluZm8gY29tbWFuZHMgdGhhdCBjYW4gYXBwZWFyIGluIGFuIGluZGV4IGVudHJ5LgorJSBTaW5jZSB0aGVyZSBhcmUgc29tZSBjb21tYW5kcyB3ZSB3YW50IHRvIGV4cGFuZCwgYW5kIG90aGVycyB3ZSBkb24ndCwKKyUgd2UgaGF2ZSB0byBsYWJvcmlvdXNseSBwcmV2ZW50IGV4cGFuc2lvbiBmb3IgdGhvc2UgdGhhdCB3ZSBkb24ndC4KKyUKK1xkZWZcaW5kZXhkdW1taWVzeyUKKyAgXGVzY2FwZWNoYXIgPSBgXFwgICAgICUgdXNlIGJhY2tzbGFzaCBpbiBvdXRwdXQgZmlsZXMuCisgIFxkZWZcQHtAfSUgY2hhbmdlIHRvIEBAIHdoZW4gd2Ugc3dpdGNoIHRvIEAgYXMgZXNjYXBlIGNoYXIgaW4gaW5kZXggZmlsZXMuCisgIFxkZWZcIHtccmVhbGJhY2tzbGFzaFxzcGFjZSB9JQorICAlIE5lZWQgdGhlc2UgaW4gY2FzZSBcdGV4IGlzIGluIGVmZmVjdCBhbmQgXHsgaXMgYSBcZGVsaW1pdGVyIGFnYWluLgorICAlIEJ1dCBjYW4ndCB1c2UgXGxicmFjZWNtZCBhbmQgXHJicmFjZWNtZCBiZWNhdXNlIHRleGluZGV4IGFzc3VtZXMKKyAgJSBicmFjZXMgYW5kIGJhY2tzbGFzaGVzIGFyZSB1c2VkIG9ubHkgYXMgZGVsaW1pdGVycy4KKyAgXGxldFx7ID0gXG15bGJyYWNlCisgIFxsZXRcfSA9IFxteXJicmFjZQorICAlCisgICUgRG8gdGhlIHJlZGVmaW5pdGlvbnMuCisgIFxjb21tb25kdW1taWVzCit9CisKKyUgRm9yIHRoZSBhdXggYW5kIHRvYyBmaWxlcywgQCBpcyB0aGUgZXNjYXBlIGNoYXJhY3Rlci4gIFNvIHdlIHdhbnQgdG8KKyUgcmVkZWZpbmUgZXZlcnl0aGluZyB1c2luZyBAIGFzIHRoZSBlc2NhcGUgY2hhcmFjdGVyIChpbnN0ZWFkIG9mCislIFxyZWFsYmFja3NsYXNoLCBzdGlsbCB1c2VkIGZvciBpbmRleCBmaWxlcykuICBXaGVuIGV2ZXJ5dGhpbmcgdXNlcyBALAorJSB0aGlzIHdpbGwgYmUgc2ltcGxlci4KKyUKK1xkZWZcYXRkdW1taWVzeyUKKyAgXGRlZlxAe0BAfSUKKyAgXGRlZlwge0AgfSUKKyAgXGxldFx7ID0gXGxicmFjZWF0Y21kCisgIFxsZXRcfSA9IFxyYnJhY2VhdGNtZAorICAlCisgICUgRG8gdGhlIHJlZGVmaW5pdGlvbnMuCisgIFxjb21tb25kdW1taWVzCit9CisKKyUgQ2FsbGVkIGZyb20gXGluZGV4ZHVtbWllcyBhbmQgXGF0ZHVtbWllcy4KKyUKK1xkZWZcY29tbW9uZHVtbWllc3slCisgICUKKyAgJSBcZGVmaW5lZHVtbXl3b3JkIGRlZmluZXMgXCMxIGFzIFxzdHJpbmdcIzFcc3BhY2UsIHRodXMgZWZmZWN0aXZlbHkKKyAgJSBwcmV2ZW50aW5nIGl0cyBleHBhbnNpb24uICBUaGlzIGlzIHVzZWQgb25seSBmb3IgY29udHJvbCUgd29yZHMsCisgICUgbm90IGNvbnRyb2wgbGV0dGVycywgYmVjYXVzZSB0aGUgXHNwYWNlIHdvdWxkIGJlIGluY29ycmVjdCBmb3IKKyAgJSBjb250cm9sIGNoYXJhY3RlcnMsIGJ1dCBpcyBuZWVkZWQgdG8gc2VwYXJhdGUgdGhlIGNvbnRyb2wgd29yZAorICAlIGZyb20gd2hhdGV2ZXIgZm9sbG93cy4KKyAgJQorICAlIEZvciBjb250cm9sIGxldHRlcnMsIHdlIGhhdmUgXGRlZmluZWR1bW15bGV0dGVyLCB3aGljaCBvbWl0cyB0aGUKKyAgJSBzcGFjZS4KKyAgJQorICAlIFRoZXNlIGNhbiBiZSB1c2VkIGJvdGggZm9yIGNvbnRyb2wgd29yZHMgdGhhdCB0YWtlIGFuIGFyZ3VtZW50IGFuZAorICAlIHRob3NlIHRoYXQgZG8gbm90LiAgSWYgaXQgaXMgZm9sbG93ZWQgYnkge2FyZ30gaW4gdGhlIGlucHV0LCB0aGVuCisgICUgdGhhdCB3aWxsIGR1dGlmdWxseSBnZXQgd3JpdHRlbiB0byB0aGUgaW5kZXggKG9yIHdoZXJldmVyKS4KKyAgJQorICBcZGVmXGRlZmluZWR1bW15d29yZCAgIyMxe1xkZWYjIzF7XHN0cmluZyMjMVxzcGFjZX19JQorICBcZGVmXGRlZmluZWR1bW15bGV0dGVyIyMxe1xkZWYjIzF7XHN0cmluZyMjMX19JQorICBcbGV0XGRlZmluZWR1bW15YWNjZW50XGRlZmluZWR1bW15bGV0dGVyCisgICUKKyAgXGNvbW1vbmR1bW1pZXNub2ZvbnRzCisgICUKKyAgXGRlZmluZWR1bW15bGV0dGVyXF8lCisgICUKKyAgJSBOb24tRW5nbGlzaCBsZXR0ZXJzLgorICBcZGVmaW5lZHVtbXl3b3JkXEFBCisgIFxkZWZpbmVkdW1teXdvcmRcQUUKKyAgXGRlZmluZWR1bW15d29yZFxMCisgIFxkZWZpbmVkdW1teXdvcmRcT0UKKyAgXGRlZmluZWR1bW15d29yZFxPCisgIFxkZWZpbmVkdW1teXdvcmRcYWEKKyAgXGRlZmluZWR1bW15d29yZFxhZQorICBcZGVmaW5lZHVtbXl3b3JkXGwKKyAgXGRlZmluZWR1bW15d29yZFxvZQorICBcZGVmaW5lZHVtbXl3b3JkXG8KKyAgXGRlZmluZWR1bW15d29yZFxzcworICBcZGVmaW5lZHVtbXl3b3JkXGV4Y2xhbWRvd24KKyAgXGRlZmluZWR1bW15d29yZFxxdWVzdGlvbmRvd24KKyAgXGRlZmluZWR1bW15d29yZFxvcmRmCisgIFxkZWZpbmVkdW1teXdvcmRcb3JkbQorICAlCisgICUgQWx0aG91Z2ggdGhlc2UgaW50ZXJuYWwgY29tbWFuZHMgc2hvdWxkbid0IHNob3cgdXAsIHNvbWV0aW1lcyB0aGV5IGRvLgorICBcZGVmaW5lZHVtbXl3b3JkXGJmCisgIFxkZWZpbmVkdW1teXdvcmRcZ3RyCisgIFxkZWZpbmVkdW1teXdvcmRcaGF0CisgIFxkZWZpbmVkdW1teXdvcmRcbGVzcworICBcZGVmaW5lZHVtbXl3b3JkXHNmCisgIFxkZWZpbmVkdW1teXdvcmRcc2wKKyAgXGRlZmluZWR1bW15d29yZFx0Y2xvc2UKKyAgXGRlZmluZWR1bW15d29yZFx0dAorICAlCisgIFxkZWZpbmVkdW1teXdvcmRcTGFUZVgKKyAgXGRlZmluZWR1bW15d29yZFxUZVgKKyAgJQorICAlIEFzc29ydGVkIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgXGRlZmluZWR1bW15d29yZFxidWxsZXQKKyAgXGRlZmluZWR1bW15d29yZFxjb21tYQorICBcZGVmaW5lZHVtbXl3b3JkXGNvcHlyaWdodAorICBcZGVmaW5lZHVtbXl3b3JkXHJlZ2lzdGVyZWRzeW1ib2wKKyAgXGRlZmluZWR1bW15d29yZFxkb3RzCisgIFxkZWZpbmVkdW1teXdvcmRcZW5kZG90cworICBcZGVmaW5lZHVtbXl3b3JkXGVxdWl2CisgIFxkZWZpbmVkdW1teXdvcmRcZXJyb3IKKyAgXGRlZmluZWR1bW15d29yZFxldXJvCisgIFxkZWZpbmVkdW1teXdvcmRcZXhwYW5zaW9uCisgIFxkZWZpbmVkdW1teXdvcmRcbWludXMKKyAgXGRlZmluZWR1bW15d29yZFxwb3VuZHMKKyAgXGRlZmluZWR1bW15d29yZFxwb2ludAorICBcZGVmaW5lZHVtbXl3b3JkXHByaW50CisgIFxkZWZpbmVkdW1teXdvcmRccmVzdWx0CisgICUKKyAgJSBXZSB3YW50IHRvIGRpc2FibGUgYWxsIG1hY3JvcyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBleHBhbmRlZCBieSBcd3JpdGUuCisgIFxtYWNyb2xpc3QKKyAgJQorICBcbm9ybWFsdHVybm9mZmFjdGl2ZQorICAlCisgICUgSGFuZGxlIHNvbWUgY2FzZXMgb2YgQHZhbHVlIC0tIHdoZXJlIGl0IGRvZXMgbm90IGNvbnRhaW4gYW55CisgICUgKG5vbi1mdWxseS1leHBhbmRhYmxlKSBjb21tYW5kcy4KKyAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKK30KKworJSBcY29tbW9uZHVtbWllc25vZm9udHM6IGNvbW1vbiB0byBcY29tbW9uZHVtbWllcyBhbmQgXGluZGV4bm9mb250cy4KKyUKKyUgQmV0dGVyIGhhdmUgdGhpcyB3aXRob3V0IGFjdGl2ZSBjaGFycy4KK3sKKyAgXGNhdGNvZGVgXH49XG90aGVyCisgIFxnZGVmXGNvbW1vbmR1bW1pZXNub2ZvbnRzeyUKKyAgICAlIENvbnRyb2wgbGV0dGVycyBhbmQgYWNjZW50cy4KKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJcISUKKyAgICBcZGVmaW5lZHVtbXlhY2NlbnRcIiUKKyAgICBcZGVmaW5lZHVtbXlhY2NlbnRcJyUKKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJcKiUKKyAgICBcZGVmaW5lZHVtbXlhY2NlbnRcLCUKKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJcLiUKKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJcLyUKKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJcOiUKKyAgICBcZGVmaW5lZHVtbXlhY2NlbnRcPSUKKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJcPyUKKyAgICBcZGVmaW5lZHVtbXlhY2NlbnRcXiUKKyAgICBcZGVmaW5lZHVtbXlhY2NlbnRcYCUKKyAgICBcZGVmaW5lZHVtbXlhY2NlbnRcfiUKKyAgICBcZGVmaW5lZHVtbXl3b3JkXHUKKyAgICBcZGVmaW5lZHVtbXl3b3JkXHYKKyAgICBcZGVmaW5lZHVtbXl3b3JkXEgKKyAgICBcZGVmaW5lZHVtbXl3b3JkXGRvdGFjY2VudAorICAgIFxkZWZpbmVkdW1teXdvcmRccmluZ2FjY2VudAorICAgIFxkZWZpbmVkdW1teXdvcmRcdGllYWNjZW50CisgICAgXGRlZmluZWR1bW15d29yZFx1YmFyYWNjZW50CisgICAgXGRlZmluZWR1bW15d29yZFx1ZG90YWNjZW50CisgICAgXGRlZmluZWR1bW15d29yZFxkb3RsZXNzCisgICAgJQorICAgICUgVGV4aW5mbyBmb250IGNvbW1hbmRzLgorICAgIFxkZWZpbmVkdW1teXdvcmRcYgorICAgIFxkZWZpbmVkdW1teXdvcmRcaQorICAgIFxkZWZpbmVkdW1teXdvcmRccgorICAgIFxkZWZpbmVkdW1teXdvcmRcc2MKKyAgICBcZGVmaW5lZHVtbXl3b3JkXHQKKyAgICAlCisgICAgJSBDb21tYW5kcyB0aGF0IHRha2UgYXJndW1lbnRzLgorICAgIFxkZWZpbmVkdW1teXdvcmRcYWNyb255bQorICAgIFxkZWZpbmVkdW1teXdvcmRcY2l0ZQorICAgIFxkZWZpbmVkdW1teXdvcmRcY29kZQorICAgIFxkZWZpbmVkdW1teXdvcmRcY29tbWFuZAorICAgIFxkZWZpbmVkdW1teXdvcmRcZGZuCisgICAgXGRlZmluZWR1bW15d29yZFxlbXBoCisgICAgXGRlZmluZWR1bW15d29yZFxlbnYKKyAgICBcZGVmaW5lZHVtbXl3b3JkXGZpbGUKKyAgICBcZGVmaW5lZHVtbXl3b3JkXGtiZAorICAgIFxkZWZpbmVkdW1teXdvcmRca2V5CisgICAgXGRlZmluZWR1bW15d29yZFxtYXRoCisgICAgXGRlZmluZWR1bW15d29yZFxvcHRpb24KKyAgICBcZGVmaW5lZHVtbXl3b3JkXHNhbXAKKyAgICBcZGVmaW5lZHVtbXl3b3JkXHN0cm9uZworICAgIFxkZWZpbmVkdW1teXdvcmRcdGllCisgICAgXGRlZmluZWR1bW15d29yZFx1cmVmCisgICAgXGRlZmluZWR1bW15d29yZFx1cmwKKyAgICBcZGVmaW5lZHVtbXl3b3JkXHZhcgorICAgIFxkZWZpbmVkdW1teXdvcmRcdmVyYgorICAgIFxkZWZpbmVkdW1teXdvcmRcdworICB9Cit9CisKKyUgXGluZGV4bm9mb250cyBpcyB1c2VkIHdoZW4gb3V0cHV0dGluZyB0aGUgc3RyaW5ncyB0byBzb3J0IHRoZSBpbmRleAorJSBieSwgYW5kIHdoZW4gY29uc3RydWN0aW5nIGNvbnRyb2wgc2VxdWVuY2UgbmFtZXMuICBJdCBlbGltaW5hdGVzIGFsbAorJSBjb250cm9sIHNlcXVlbmNlcyBhbmQganVzdCB3cml0ZXMgd2hhdGV2ZXIgdGhlIGJlc3QgQVNDSUkgc29ydCBzdHJpbmcKKyUgd291bGQgYmUgZm9yIGEgZ2l2ZW4gY29tbWFuZCAodXN1YWxseSBpdHMgYXJndW1lbnQpLgorJQorXGRlZlxpbmRleG5vZm9udHN7JQorICAlIEFjY2VudCBjb21tYW5kcyBzaG91bGQgYmVjb21lIEBhc2lzLgorICBcZGVmXGRlZmluZWR1bW15YWNjZW50IyMxe1xsZXQjIzFcYXNpc30lCisgICUgV2UgY2FuIGp1c3QgaWdub3JlIG90aGVyIGNvbnRyb2wgbGV0dGVycy4KKyAgXGRlZlxkZWZpbmVkdW1teWxldHRlciMjMXtcbGV0IyMxXGVtcHR5fSUKKyAgJSBIb3BlZnVsbHksIGFsbCBjb250cm9sIHdvcmRzIGNhbiBiZWNvbWUgQGFzaXMuCisgIFxsZXRcZGVmaW5lZHVtbXl3b3JkXGRlZmluZWR1bW15YWNjZW50CisgICUKKyAgXGNvbW1vbmR1bW1pZXNub2ZvbnRzCisgICUKKyAgJSBEb24ndCBuby1vcCBcdHQsIHNpbmNlIGl0IGlzbid0IGEgdXNlci1sZXZlbCBjb21tYW5kCisgICUgYW5kIGlzIHVzZWQgaW4gdGhlIGRlZmluaXRpb25zIG9mIHRoZSBhY3RpdmUgY2hhcnMgbGlrZSA8LCA+LCB8LCBldGMuCisgICUgTGlrZXdpc2Ugd2l0aCB0aGUgb3RoZXIgcGxhaW4gdGV4IGZvbnQgY29tbWFuZHMuCisgICVcbGV0XHR0PVxhc2lzCisgICUKKyAgXGRlZlwgeyB9JQorICBcZGVmXEB7QH0lCisgICUgaG93IHRvIGhhbmRsZSBicmFjZXM/CisgIFxkZWZcX3tcbm9ybWFsdW5kZXJzY29yZX0lCisgICUKKyAgJSBOb24tRW5nbGlzaCBsZXR0ZXJzLgorICBcZGVmXEFBe0FBfSUKKyAgXGRlZlxBRXtBRX0lCisgIFxkZWZcTHtMfSUKKyAgXGRlZlxPRXtPRX0lCisgIFxkZWZcT3tPfSUKKyAgXGRlZlxhYXthYX0lCisgIFxkZWZcYWV7YWV9JQorICBcZGVmXGx7bH0lCisgIFxkZWZcb2V7b2V9JQorICBcZGVmXG97b30lCisgIFxkZWZcc3N7c3N9JQorICBcZGVmXGV4Y2xhbWRvd257IX0lCisgIFxkZWZccXVlc3Rpb25kb3duez99JQorICBcZGVmXG9yZGZ7YX0lCisgIFxkZWZcb3JkbXtvfSUKKyAgJQorICBcZGVmXExhVGVYe0xhVGVYfSUKKyAgXGRlZlxUZVh7VGVYfSUKKyAgJQorICAlIEFzc29ydGVkIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgJSAoVGhlIGZvbGxvd2luZyB7fSB3aWxsIGVuZCB1cCBpbiB0aGUgc29ydCBzdHJpbmcsIGJ1dCB0aGF0J3Mgb2suKQorICBcZGVmXGJ1bGxldHtidWxsZXR9JQorICBcZGVmXGNvbW1heyx9JQorICBcZGVmXGNvcHlyaWdodHtjb3B5cmlnaHR9JQorICBcZGVmXHJlZ2lzdGVyZWRzeW1ib2x7Un0lCisgIFxkZWZcZG90c3suLi59JQorICBcZGVmXGVuZGRvdHN7Li4ufSUKKyAgXGRlZlxlcXVpdns9PX0lCisgIFxkZWZcZXJyb3J7ZXJyb3J9JQorICBcZGVmXGV1cm97ZXVyb30lCisgIFxkZWZcZXhwYW5zaW9uez09Pn0lCisgIFxkZWZcbWludXN7LX0lCisgIFxkZWZccG91bmRze3BvdW5kc30lCisgIFxkZWZccG9pbnR7Ln0lCisgIFxkZWZccHJpbnR7LXx9JQorICBcZGVmXHJlc3VsdHs9Pn0lCisgICUKKyAgJSBXZSBuZWVkIHRvIGdldCByaWQgb2YgYWxsIG1hY3JvcywgbGVhdmluZyBvbmx5IHRoZSBhcmd1bWVudHMgKGlmIHByZXNlbnQpLgorICAlIE9mIGNvdXJzZSB0aGlzIGlzIG5vdCBuZWFybHkgY29ycmVjdCwgYnV0IGl0IGlzIHRoZSBiZXN0IHdlIGNhbiBkbyBmb3Igbm93LgorICAlIG1ha2VpbmZvIGRvZXMgbm90IGV4cGFuZCBtYWNyb3MgaW4gdGhlIGFyZ3VtZW50IHRvIEBkZWZmbiwgd2hpY2ggZW5kcyB1cAorICAlIHdyaXRpbmcgYW4gaW5kZXggZW50cnksIGFuZCB0ZXhpbmRleCBpc24ndCBwcmVwYXJlZCBmb3IgYW4gaW5kZXggc29ydCBlbnRyeQorICAlIHRoYXQgc3RhcnRzIHdpdGggXC4KKyAgJSAKKyAgJSBTaW5jZSBtYWNybyBpbnZvY2F0aW9ucyBhcmUgZm9sbG93ZWQgYnkgYnJhY2VzLCB3ZSBjYW4ganVzdCByZWRlZmluZSB0aGVtCisgICUgdG8gdGFrZSBhIHNpbmdsZSBUZVggYXJndW1lbnQuICBUaGUgY2FzZSBvZiBhIG1hY3JvIGludm9jYXRpb24gdGhhdAorICAlIGdvZXMgdG8gZW5kLW9mLWxpbmUgaXMgbm90IGhhbmRsZWQuCisgICUgCisgIFxtYWNyb2xpc3QKK30KKworXGxldFxpbmRleGJhY2tzbGFzaD0wICAlb3ZlcnJpZGRlbiBkdXJpbmcgXHByaW50aW5kZXguCitcbGV0XFNFVG1hcmdpbmluZGV4PVxyZWxheCAlIHB1dCBpbmRleCBlbnRyaWVzIGluIG1hcmdpbiAodW5kb2N1bWVudGVkKT8KKworJSBNb3N0IGluZGV4IGVudHJpZXMgZ28gdGhyb3VnaCBoZXJlLCBidXQgXGRvc3ViaW5kIGlzIHRoZSBnZW5lcmFsIGNhc2UuCislICMxIGlzIHRoZSBpbmRleCBuYW1lLCAjMiBpcyB0aGUgZW50cnkgdGV4dC4KK1xkZWZcZG9pbmQjMSMye1xkb3N1YmluZHsjMX17IzJ9e319CisKKyUgV29ya2hvcnNlIGZvciBhbGwgXGZvb2luZGV4ZXMuCislICMxIGlzIG5hbWUgb2YgaW5kZXgsICMyIGlzIHN0dWZmIHRvIHB1dCB0aGVyZSwgIzMgaXMgc3ViZW50cnkgLS0KKyUgZW1wdHkgaWYgY2FsbGVkIGZyb20gXGRvaW5kLCBhcyB3ZSB1c3VhbGx5IGFyZSAodGhlIG1haW4gZXhjZXB0aW9uCislIGlzIHdpdGggbW9zdCBkZWZ1bnMsIHdoaWNoIGNhbGwgdXMgZGlyZWN0bHkpLgorJQorXGRlZlxkb3N1YmluZCMxIzIjM3slCisgIFxpZmxpbmtzCisgIHslCisgICAgJSBTdG9yZSB0aGUgbWFpbiBpbmRleCBlbnRyeSB0ZXh0IChpbmNsdWRpbmcgdGhlIHRoaXJkIGFyZykuCisgICAgXHRva3MwID0geyMyfSUKKyAgICAlIElmIHRoaXJkIGFyZyBpcyBwcmVzZW50LCBwcmVjZWRlIGl0IHdpdGggYSBzcGFjZS4KKyAgICBcZGVmXHRoaXJkYXJneyMzfSUKKyAgICBcaWZ4XHRoaXJkYXJnXGVtcHR5IFxlbHNlCisgICAgICBcdG9rczAgPSBcZXhwYW5kYWZ0ZXJ7XHRoZVx0b2tzMCBcc3BhY2UgIzN9JQorICAgIFxmaQorICAgICUKKyAgICBcZWRlZlx3cml0ZXRve1xjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lfSUKKyAgICAlCisgICAgXGlmdm1vZGUKKyAgICAgIFxkb3N1YmluZHNhbml0aXplCisgICAgXGVsc2UKKyAgICAgIFxkb3N1YmluZHdyaXRlCisgICAgXGZpCisgIH0lCisgIFxmaQorfQorCislIFdyaXRlIHRoZSBlbnRyeSBpbiBcdG9rczAgdG8gdGhlIGluZGV4IGZpbGU6CislCitcZGVmXGRvc3ViaW5kd3JpdGV7JQorICAlIFB1dCB0aGUgaW5kZXggZW50cnkgaW4gdGhlIG1hcmdpbiBpZiBkZXNpcmVkLgorICBcaWZ4XFNFVG1hcmdpbmluZGV4XHJlbGF4XGVsc2UKKyAgICBcaW5zZXJ0XG1hcmdpbntcaGJveHtcdnJ1bGUgaGVpZ2h0OHB0IGRlcHRoM3B0IHdpZHRoMHB0IFx0aGVcdG9rczB9fSUKKyAgXGZpCisgICUKKyAgJSBSZW1lbWJlciwgd2UgYXJlIHdpdGhpbiBhIGdyb3VwLgorICBcaW5kZXhkdW1taWVzICUgTXVzdCBkbyB0aGlzIGhlcmUsIHNpbmNlIFxiZiwgZXRjIGV4cGFuZCBhdCB0aGlzIHN0YWdlCisgIFxkZWZcYmFja3NsYXNoY3VyZm9udHtcaW5kZXhiYWNrc2xhc2h9JSBcaW5kZXhiYWNrc2xhc2ggaXNuJ3QgZGVmaW5lZCBub3cKKyAgICAgICUgc28gaXQgd2lsbCBiZSBvdXRwdXQgYXMgaXM7IGFuZCBpdCB3aWxsIHByaW50IGFzIGJhY2tzbGFzaC4KKyAgJQorICAlIFByb2Nlc3MgdGhlIGluZGV4IGVudHJ5IHdpdGggYWxsIGZvbnQgY29tbWFuZHMgdHVybmVkIG9mZiwgdG8KKyAgJSBnZXQgdGhlIHN0cmluZyB0byBzb3J0IGJ5LgorICB7XGluZGV4bm9mb250cworICAgXGVkZWZcdGVtcHtcdGhlXHRva3MwfSUgbmVlZCBmdWxsIGV4cGFuc2lvbgorICAgXHhkZWZcaW5kZXhzb3J0dG1we1x0ZW1wfSUKKyAgfSUKKyAgJQorICAlIFNldCB1cCB0aGUgY29tcGxldGUgaW5kZXggZW50cnksIHdpdGggYm90aCB0aGUgc29ydCBrZXkgYW5kCisgICUgdGhlIG9yaWdpbmFsIHRleHQsIGluY2x1ZGluZyBhbnkgZm9udCBjb21tYW5kcy4gIFdlIHdyaXRlCisgICUgdGhyZWUgYXJndW1lbnRzIHRvIFxlbnRyeSB0byB0aGUgLj8/IGZpbGUgKGZvdXIgaW4gdGhlCisgICUgc3ViZW50cnkgY2FzZSksIHRleGluZGV4IHJlZHVjZXMgdG8gdHdvIHdoZW4gd3JpdGluZyB0aGUgLj8/cworICAlIHNvcnRlZCByZXN1bHQuCisgIFxlZGVmXHRlbXB7JQorICAgIFx3cml0ZVx3cml0ZXRveyUKKyAgICAgIFxzdHJpbmdcZW50cnl7XGluZGV4c29ydHRtcH17XG5vZXhwYW5kXGZvbGlvfXtcdGhlXHRva3MwfX0lCisgIH0lCisgIFx0ZW1wCit9CisKKyUgVGFrZSBjYXJlIG9mIHVud2FudGVkIHBhZ2UgYnJlYWtzOgorJQorJSBJZiBhIHNraXAgaXMgdGhlIGxhc3QgdGhpbmcgb24gdGhlIGxpc3Qgbm93LCBwcmVzZXJ2ZSBpdAorJSBieSBiYWNraW5nIHVwIGJ5IFxsYXN0c2tpcCwgZG9pbmcgdGhlIFx3cml0ZSwgdGhlbiBpbnNlcnRpbmcKKyUgdGhlIHNraXAgYWdhaW4uICBPdGhlcndpc2UsIHRoZSB3aGF0c2l0IGdlbmVyYXRlZCBieSB0aGUKKyUgXHdyaXRlIHdpbGwgbWFrZSBcbGFzdHNraXAgemVyby4gIFRoZSByZXN1bHQgaXMgdGhhdCBzZXF1ZW5jZXMKKyUgbGlrZSB0aGlzOgorJSBAZW5kIGRlZnVuCislIEB0aW5kZXggd2hhdGV2ZXIKKyUgQGRlZnVuIC4uLgorJSB3aWxsIGhhdmUgZXh0cmEgc3BhY2UgaW5zZXJ0ZWQsIGJlY2F1c2UgdGhlIFxtZWRicmVhayBpbiB0aGUKKyUgc3RhcnQgb2YgdGhlIEBkZWZ1biB3b24ndCBzZWUgdGhlIHNraXAgaW5zZXJ0ZWQgYnkgdGhlIEBlbmQgb2YKKyUgdGhlIHByZXZpb3VzIGRlZnVuLgorJQorJSBCdXQgZG9uJ3QgZG8gYW55IG9mIHRoaXMgaWYgd2UncmUgbm90IGluIHZlcnRpY2FsIG1vZGUuICBXZQorJSBkb24ndCB3YW50IHRvIGRvIGEgXHZza2lwIGFuZCBwcmVtYXR1cmVseSBlbmQgYSBwYXJhZ3JhcGguCislCislIEF2b2lkIHBhZ2UgYnJlYWtzIGR1ZSB0byB0aGVzZSBleHRyYSBza2lwcywgdG9vLgorJQorJSBCdXQgd2FpdCwgdGhlcmUgaXMgYSBjYXRjaCB0aGVyZToKKyUgV2UnbGwgaGF2ZSB0byBjaGVjayB3aGV0aGVyIFxsYXN0c2tpcCBpcyB6ZXJvIHNraXAuICBcaWZkaW0gaXMgbm90CislIHN1ZmZpY2llbnQgZm9yIHRoaXMgcHVycG9zZSwgYXMgaXQgaWdub3JlcyBzdHJldGNoIGFuZCBzaHJpbmsgcGFydHMKKyUgb2YgdGhlIHNraXAuICBUaGUgb25seSB3YXkgc2VlbXMgdG8gYmUgdG8gY2hlY2sgdGhlIHRleHR1YWwKKyUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNraXAuCislCislIFRoZSBmb2xsb3dpbmcgaXMgYWxtb3N0IGxpa2UgXGRlZlx6ZXJvc2tpcG1hY3JvezAuMHB0fSBleGNlcHQgdGhhdAorJSB0aGUgYGBwJycgYW5kIGBgdCcnIGNoYXJhY3RlcnMgaGF2ZSBjYXRjb2RlIFxvdGhlciwgbm90IDExIChsZXR0ZXIpLgorJQorXGVkZWZcemVyb3NraXBtYWNyb3tcZXhwYW5kYWZ0ZXJcdGhlXGNzbmFtZSB6QHNraXBcZW5kY3NuYW1lfQorJQorJSAuLi4sIHJlYWR5LCBHTzoKKyUKK1xkZWZcZG9zdWJpbmRzYW5pdGl6ZXslCisgICUgXGxhc3Rza2lwIGFuZCBcbGFzdHBlbmFsdHkgY2Fubm90IGJvdGggYmUgbm9uemVybyBzaW11bHRhbmVvdXNseS4KKyAgXHNraXAwID0gXGxhc3Rza2lwCisgIFxlZGVmXGxhc3Rza2lwbWFjcm97XHRoZVxsYXN0c2tpcH0lCisgIFxjb3VudDI1NSA9IFxsYXN0cGVuYWx0eQorICAlCisgICUgSWYgXGxhc3Rza2lwIGlzIG5vbnplcm8sIHRoYXQgbWVhbnMgdGhlIGxhc3QgaXRlbSB3YXMgYQorICAlIHNraXAuICBBbmQgc2luY2UgYSBza2lwIGlzIGRpc2NhcmRhYmxlLCB0aGF0IG1lYW5zIHRoaXMKKyAgJSAtXHNraXAwIGdsdWUgd2UncmUgaW5zZXJ0aW5nIGlzIHByZWNlZGVkIGJ5IGEKKyAgJSBub24tZGlzY2FyZGFibGUgaXRlbSwgdGhlcmVmb3JlIGl0IGlzIG5vdCBhIHBvdGVudGlhbAorICAlIGJyZWFrcG9pbnQsIHRoZXJlZm9yZSBubyBcbm9icmVhayBuZWVkZWQuCisgIFxpZnhcbGFzdHNraXBtYWNyb1x6ZXJvc2tpcG1hY3JvCisgIFxlbHNlCisgICAgXHZza2lwLVxza2lwMAorICBcZmkKKyAgJQorICBcZG9zdWJpbmR3cml0ZQorICAlCisgIFxpZnhcbGFzdHNraXBtYWNyb1x6ZXJvc2tpcG1hY3JvCisgICAgJSBJZiBcbGFzdHNraXAgd2FzIHplcm8sIHBlcmhhcHMgdGhlIGxhc3QgaXRlbSB3YXMgYSBwZW5hbHR5LCBhbmQKKyAgICAlIHBlcmhhcHMgaXQgd2FzID49MTAwMDAsIGUuZy4sIGEgXG5vYnJlYWsuICBJbiB0aGF0IGNhc2UsIHdlIHdhbnQKKyAgICAlIHRvIHJlLWluc2VydCB0aGUgc2FtZSBwZW5hbHR5ICh2YWx1ZXMgPjEwMDAwIGFyZSB1c2VkIGZvciB2YXJpb3VzCisgICAgJSBzaWduYWxzKTsgc2luY2Ugd2UganVzdCBpbnNlcnRlZCBhIG5vbi1kaXNjYXJkYWJsZSBpdGVtLCBhbnkKKyAgICAlIGZvbGxvd2luZyBnbHVlIChzdWNoIGFzIGEgXHBhcnNraXApIHdvdWxkIGJlIGEgYnJlYWtwb2ludC4gIEZvciBleGFtcGxlOgorICAgICUgCisgICAgJSAgIEBkZWZmbiBkZWZmbi13aGF0ZXZlcgorICAgICUgICBAdmluZGV4IGluZGV4LXdoYXRldmVyCisgICAgJSAgIERlc2NyaXB0aW9uLgorICAgICUgd291bGQgYWxsb3cgYSBicmVhayBiZXR3ZWVuIHRoZSBpbmRleC13aGF0ZXZlciB3aGF0c2l0CisgICAgJSBhbmQgdGhlICJEZXNjcmlwdGlvbi4iIHBhcmFncmFwaC4KKyAgICBcaWZudW1cY291bnQyNTU+OTk5OSBccGVuYWx0eVxjb3VudDI1NSBcZmkKKyAgXGVsc2UKKyAgICAlIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBoYWQgYSBub256ZXJvIFxsYXN0c2tpcCwKKyAgICAlIHRoaXMgbWFrZS11cCBnbHVlIHdvdWxkIGJlIHByZWNlZGVkIGJ5IGEgbm9uLWRpc2NhcmRhYmxlIGl0ZW0KKyAgICAlICh0aGUgd2hhdHNpdCBmcm9tIHRoZSBcd3JpdGUpLCBzbyB3ZSBtdXN0IGluc2VydCBhIFxub2JyZWFrLgorICAgIFxub2JyZWFrXHZza2lwXHNraXAwCisgIFxmaQorfQorCislIFRoZSBpbmRleCBlbnRyeSB3cml0dGVuIGluIHRoZSBmaWxlIGFjdHVhbGx5IGxvb2tzIGxpa2UKKyUgIFxlbnRyeSB7c29ydHN0cmluZ317cGFnZX17dG9waWN9CislIG9yCislICBcZW50cnkge3NvcnRzdHJpbmd9e3BhZ2V9e3RvcGljfXtzdWJ0b3BpY30KKyUgVGhlIHRleGluZGV4IHByb2dyYW0gcmVhZHMgaW4gdGhlc2UgZmlsZXMgYW5kIHdyaXRlcyBmaWxlcworJSBjb250YWluaW5nIHRoZXNlIGtpbmRzIG9mIGxpbmVzOgorJSAgXGluaXRpYWwge2N9CislICAgICBiZWZvcmUgdGhlIGZpcnN0IHRvcGljIHdob3NlIGluaXRpYWwgaXMgYworJSAgXGVudHJ5IHt0b3BpY317cGFnZWxpc3R9CislICAgICBmb3IgYSB0b3BpYyB0aGF0IGlzIHVzZWQgd2l0aG91dCBzdWJ0b3BpY3MKKyUgIFxwcmltYXJ5IHt0b3BpY30KKyUgICAgIGZvciB0aGUgYmVnaW5uaW5nIG9mIGEgdG9waWMgdGhhdCBpcyB1c2VkIHdpdGggc3VidG9waWNzCislICBcc2Vjb25kYXJ5IHtzdWJ0b3BpY317cGFnZWxpc3R9CislICAgICBmb3IgZWFjaCBzdWJ0b3BpYy4KKworJSBEZWZpbmUgdGhlIHVzZXItYWNjZXNzaWJsZSBpbmRleGluZyBjb21tYW5kcworJSBAZmluZGV4LCBAdmluZGV4LCBAa2luZGV4LCBAY2luZGV4LgorCitcZGVmXGZpbmRleCB7XGZuaW5kZXh9CitcZGVmXGtpbmRleCB7XGt5aW5kZXh9CitcZGVmXGNpbmRleCB7XGNwaW5kZXh9CitcZGVmXHZpbmRleCB7XHZyaW5kZXh9CitcZGVmXHRpbmRleCB7XHRwaW5kZXh9CitcZGVmXHBpbmRleCB7XHBnaW5kZXh9CisKK1xkZWZcY2luZGV4c3ViIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcY2luZGV4c3VifQore1xvYmV5bGluZXMgJQorXGdkZWZcY2luZGV4c3ViICIjMSIgIzJeXk17XGVuZGdyb3VwICUKK1xkb3N1YmluZHtjcH17IzJ9eyMxfX19CisKKyUgRGVmaW5lIHRoZSBtYWNyb3MgdXNlZCBpbiBmb3JtYXR0aW5nIG91dHB1dCBvZiB0aGUgc29ydGVkIGluZGV4IG1hdGVyaWFsLgorCislIEBwcmludGluZGV4IGNhdXNlcyBhIHBhcnRpY3VsYXIgaW5kZXggKHRoZSA/P3MgZmlsZSkgdG8gZ2V0IHByaW50ZWQuCislIEl0IGRvZXMgbm90IHByaW50IGFueSBjaGFwdGVyIGhlYWRpbmcgKHVzdWFsbHkgYW4gQHVubnVtYmVyZWQpLgorJQorXHBhcnNlYXJnZGVmXHByaW50aW5kZXh7XGJlZ2luZ3JvdXAKKyAgXGRvYnJlYWsgXGNoYXBoZWFkaW5nc2tpcHsxMDAwMH0lCisgICUKKyAgXHNtYWxsZm9udHMgXHJtCisgIFx0b2xlcmFuY2UgPSA5NTAwCisgIFxldmVyeXBhciA9IHt9JSBkb24ndCB3YW50IHRoZSBca2VyblwtcGFyaW5kZW50IGZyb20gaW5kZW50YXRpb24gc3VwcHJlc3Npb24uCisgICUKKyAgJSBTZWUgaWYgdGhlIGluZGV4IGZpbGUgZXhpc3RzIGFuZCBpcyBub25lbXB0eS4KKyAgJSBDaGFuZ2UgY2F0Y29kZSBvZiBAIGhlcmUgc28gdGhhdCBpZiB0aGUgaW5kZXggZmlsZSBjb250YWlucworICAlIFxpbml0aWFsIHtAfQorICAlIGFzIGl0cyBmaXJzdCBsaW5lLCBUZVggZG9lc24ndCBjb21wbGFpbiBhYm91dCBtaXNtYXRjaGVkIGJyYWNlcworICAlIChiZWNhdXNlIGl0IHRoaW5rcyBAfSBpcyBhIGNvbnRyb2wgc2VxdWVuY2UpLgorICBcY2F0Y29kZWBcQCA9IDExCisgIFxvcGVuaW4gMSBcam9ibmFtZS4jMXMKKyAgXGlmZW9mIDEKKyAgICAlIFxlbmRkb3VibGVjb2x1bW5zIGdldHMgY29uZnVzZWQgaWYgdGhlcmUgaXMgbm8gdGV4dCBpbiB0aGUgaW5kZXgsCisgICAgJSBhbmQgaXQgbG9zZXMgdGhlIGNoYXB0ZXIgdGl0bGUgYW5kIHRoZSBhdXggZmlsZSBlbnRyaWVzIGZvciB0aGUKKyAgICAlIGluZGV4LiAgVGhlIGVhc2llc3Qgd2F5IHRvIHByZXZlbnQgdGhpcyBwcm9ibGVtIGlzIHRvIG1ha2Ugc3VyZQorICAgICUgdGhlcmUgaXMgc29tZSB0ZXh0LgorICAgIFxwdXR3b3JkSW5kZXhOb25leGlzdGVudAorICBcZWxzZQorICAgICUKKyAgICAlIElmIHRoZSBpbmRleCBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHksIHRoZW4gXG9wZW5pbiBsZWF2ZXMgXGlmZW9mCisgICAgJSBmYWxzZS4gIFdlIGhhdmUgdG8gbWFrZSBUZVggdHJ5IHRvIHJlYWQgc29tZXRoaW5nIGZyb20gdGhlIGZpbGUsIHNvCisgICAgJSBpdCBjYW4gZGlzY292ZXIgaWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gaXQuCisgICAgXHJlYWQgMSB0byBcdGVtcAorICAgIFxpZmVvZiAxCisgICAgICBccHV0d29yZEluZGV4SXNFbXB0eQorICAgIFxlbHNlCisgICAgICAlIEluZGV4IGZpbGVzIGFyZSBhbG1vc3QgVGV4aW5mbyBzb3VyY2UsIGJ1dCB3ZSB1c2UgXCBhcyB0aGUgZXNjYXBlCisgICAgICAlIGNoYXJhY3Rlci4gIEl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgQCwgYnV0IHRoYXQncyB0b28gYmlnIGEgY2hhbmdlCisgICAgICAlIHRvIG1ha2UgcmlnaHQgbm93LgorICAgICAgXGRlZlxpbmRleGJhY2tzbGFzaHtcYmFja3NsYXNoY3VyZm9udH0lCisgICAgICBcY2F0Y29kZWBcXCA9IDAKKyAgICAgIFxlc2NhcGVjaGFyID0gYFxcCisgICAgICBcYmVnaW5kb3VibGVjb2x1bW5zCisgICAgICBcaW5wdXQgXGpvYm5hbWUuIzFzCisgICAgICBcZW5kZG91YmxlY29sdW1ucworICAgIFxmaQorICBcZmkKKyAgXGNsb3NlaW4gMQorXGVuZGdyb3VwfQorCislIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBieSB0aGUgc29ydGVkIGluZGV4IGZpbGUgaXRzZWxmLgorJSBDaGFuZ2UgdGhlbSB0byBjb250cm9sIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbmRleC4KKworXGRlZlxpbml0aWFsIzF7eyUKKyAgJSBTb21lIG1pbm9yIGZvbnQgY2hhbmdlcyBmb3IgdGhlIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgXGxldFx0ZW50dD1cc2VjdHQgXGxldFx0dD1cc2VjdHQgXGxldFxzZj1cc2VjdHQKKyAgJQorICAlIFJlbW92ZSBhbnkgZ2x1ZSB3ZSBtYXkgaGF2ZSwgd2UnbGwgYmUgaW5zZXJ0aW5nIG91ciBvd24uCisgIFxyZW1vdmVsYXN0c2tpcAorICAlCisgICUgV2UgbGlrZSBicmVha3MgYmVmb3JlIHRoZSBpbmRleCBpbml0aWFscywgc28gaW5zZXJ0IGEgYm9udXMuCisgIFxub2JyZWFrCisgIFx2c2tpcCAwcHQgcGx1cyAzXGJhc2VsaW5lc2tpcAorICBccGVuYWx0eSAwCisgIFx2c2tpcCAwcHQgcGx1cyAtM1xiYXNlbGluZXNraXAKKyAgJQorICAlIFR5cGVzZXQgdGhlIGluaXRpYWwuICBNYWtpbmcgdGhpcyBhZGQgdXAgdG8gYSB3aG9sZSBudW1iZXIgb2YKKyAgJSBiYXNlbGluZXNraXBzIGluY3JlYXNlcyB0aGUgY2hhbmNlIG9mIHRoZSBkb3RzIGxpbmluZyB1cCBmcm9tIGNvbHVtbgorICAlIHRvIGNvbHVtbi4gIEl0IHN0aWxsIHdvbid0IG9mdGVuIGJlIHBlcmZlY3QsIGJlY2F1c2Ugb2YgdGhlIHN0cmV0Y2gKKyAgJSB3ZSBuZWVkIGJlZm9yZSBlYWNoIGVudHJ5LCBidXQgaXQncyBiZXR0ZXIuCisgICUKKyAgJSBObyBzaHJpbmsgYmVjYXVzZSBpdCBjb25mdXNlcyBcYmFsYW5jZWNvbHVtbnMuCisgIFx2c2tpcCAxLjY3XGJhc2VsaW5lc2tpcCBwbHVzIC41XGJhc2VsaW5lc2tpcAorICBcbGVmdGxpbmV7XHNlY2JmICMxfSUKKyAgJSBEbyBvdXIgYmVzdCBub3QgdG8gYnJlYWsgYWZ0ZXIgdGhlIGluaXRpYWwuCisgIFxub2JyZWFrCisgIFx2c2tpcCAuMzNcYmFzZWxpbmVza2lwIHBsdXMgLjFcYmFzZWxpbmVza2lwCit9fQorCislIFxlbnRyeSB0eXBlc2V0cyBhIHBhcmFncmFwaCBjb25zaXN0aW5nIG9mIHRoZSB0ZXh0ICgjMSksIGRvdCBsZWFkZXJzLCBhbmQKKyUgdGhlbiBwYWdlIG51bWJlciAoIzIpIGZsdXNoZWQgdG8gdGhlIHJpZ2h0IG1hcmdpbi4gIEl0IGlzIHVzZWQgZm9yIGluZGV4CislIGFuZCB0YWJsZSBvZiBjb250ZW50cyBlbnRyaWVzLiAgVGhlIHBhcmFncmFwaCBpcyBpbmRlbnRlZCBieSBcbGVmdHNraXAuCislCislIEEgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIHdvdWxkIHN0YXJ0IGxpa2UgdGhpczoKKyUJXGRlZlxlbnRyeSMxIzJ7Li4uCislIEJ1dCB0aGlzIGZyb3plcyB0aGUgY2F0Y29kZXMgaW4gdGhlIGFyZ3VtZW50LCBhbmQgY2FuIGNhdXNlIHByb2JsZW1zIHRvCislIEBjb2RlLCB3aGljaCBzZXRzIC0gYWN0aXZlLiAgVGhpcyBwcm9ibGVtIHdhcyBmaXhlZCBieSBhIGtsdWRnZS0tLQorJSBgYC0nJyB3YXMgYWN0aXZlIHRocm91Z2hvdXQgd2hvbGUgaW5kZXgsIGJ1dCB0aGlzIGlzbid0IHJlYWxseSByaWdodC4KKyUKKyUgVGhlIHJpZ2h0IHNvbHV0aW9uIGlzIHRvIHByZXZlbnQgXGVudHJ5IGZyb20gc3dhbGxvd2luZyB0aGUgd2hvbGUgdGV4dC4KKyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWthc2FsLCAyMW5vdjAzCitcZGVmXGVudHJ5eyUKKyAgXGJlZ2luZ3JvdXAKKyAgICAlCisgICAgJSBTdGFydCBhIG5ldyBwYXJhZ3JhcGggaWYgbmVjZXNzYXJ5LCBzbyBvdXIgYXNzaWdubWVudHMgYmVsb3cgY2FuJ3QKKyAgICAlIGFmZmVjdCBwcmV2aW91cyB0ZXh0LgorICAgIFxwYXIKKyAgICAlCisgICAgJSBEbyBub3QgZmlsbCBvdXQgdGhlIGxhc3QgbGluZSB3aXRoIHdoaXRlIHNwYWNlLgorICAgIFxwYXJmaWxsc2tpcCA9IDBpbgorICAgICUKKyAgICAlIE5vIGV4dHJhIHNwYWNlIGFib3ZlIHRoaXMgcGFyYWdyYXBoLgorICAgIFxwYXJza2lwID0gMGluCisgICAgJQorICAgICUgRG8gbm90IHByZWZlciBhIHNlcGFyYXRlIGxpbmUgZW5kaW5nIHdpdGggYSBoeXBoZW4gdG8gZmV3ZXIgbGluZXMuCisgICAgXGZpbmFsaHlwaGVuZGVtZXJpdHMgPSAwCisgICAgJQorICAgICUgXGhhbmdpbmRlbnQgaXMgb25seSByZWxldmFudCB3aGVuIHRoZSBlbnRyeSB0ZXh0IGFuZCBwYWdlIG51bWJlcgorICAgICUgZG9uJ3QgYm90aCBmaXQgb24gb25lIGxpbmUuICBJbiB0aGF0IGNhc2UsIGJvYiBzdWdnZXN0cyBzdGFydGluZyB0aGUKKyAgICAlIGRvdHMgcHJldHR5IGZhciBvdmVyIG9uIHRoZSBsaW5lLiAgVW5mb3J0dW5hdGVseSwgYSBsYXJnZQorICAgICUgaW5kZW50YXRpb24gbG9va3Mgd3Jvbmcgd2hlbiB0aGUgZW50cnkgdGV4dCBpdHNlbGYgaXMgYnJva2VuIGFjcm9zcworICAgICUgbGluZXMuICBTbyB3ZSB1c2UgYSBzbWFsbCBpbmRlbnRhdGlvbiBhbmQgcHV0IHVwIHdpdGggbG9uZyBsZWFkZXJzLgorICAgICUKKyAgICAlIFxoYW5nYWZ0ZXIgaXMgcmVzZXQgdG8gMSAod2hpY2ggaXMgdGhlIHZhbHVlIHdlIHdhbnQpIGF0IHRoZSBzdGFydAorICAgICUgb2YgZWFjaCBwYXJhZ3JhcGgsIHNvIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIHdpdGggdGhhdC4KKyAgICBcaGFuZ2luZGVudCA9IDJlbQorICAgICUKKyAgICAlIFdoZW4gdGhlIGVudHJ5IHRleHQgbmVlZHMgdG8gYmUgYnJva2VuLCBqdXN0IGZpbGwgb3V0IHRoZSBmaXJzdCBsaW5lCisgICAgJSB3aXRoIGJsYW5rIHNwYWNlLgorICAgIFxyaWdodHNraXAgPSAwcHQgcGx1czFmaWwKKyAgICAlCisgICAgJSBBIGJpdCBvZiBzdHJldGNoIGJlZm9yZSBlYWNoIGVudHJ5IGZvciB0aGUgYmVuZWZpdCBvZiBiYWxhbmNpbmcKKyAgICAlIGNvbHVtbnMuCisgICAgXHZza2lwIDBwdCBwbHVzMXB0CisgICAgJQorICAgICUgU3dhbGxvdyB0aGUgbGVmdCBicmFjZSBvZiB0aGUgdGV4dCAoZmlyc3QgcGFyYW1ldGVyKToKKyAgICBcYWZ0ZXJhc3NpZ25tZW50XGRvZW50cnkKKyAgICBcbGV0XHRlbXAgPQorfQorXGRlZlxkb2VudHJ5eyUKKyAgICBcYmdyb3VwICUgSW5zdGVhZCBvZiB0aGUgc3dhbGxvd2VkIGJyYWNlLgorICAgICAgXG5vaW5kZW50CisgICAgICBcYWZ0ZXJncm91cFxmaW5pc2hlbnRyeQorICAgICAgJSBBbmQgbm93IGNvbWVzIHRoZSB0ZXh0IG9mIHRoZSBlbnRyeS4KK30KK1xkZWZcZmluaXNoZW50cnkjMXslCisgICAgJSAjMSBpcyB0aGUgcGFnZSBudW1iZXIuCisgICAgJQorICAgICUgVGhlIGZvbGxvd2luZyBpcyBrbHVkZ2VkIHRvIG5vdCBvdXRwdXQgYSBsaW5lIG9mIGRvdHMgaW4gdGhlIGluZGV4IGlmCisgICAgJSB0aGVyZSBhcmUgbm8gcGFnZSBudW1iZXJzLiAgVGhlIG5leHQgcGVyc29uIHdobyBicmVha3MgdGhpcyB3aWxsIGJlCisgICAgJSBjdXJzZWQgYnkgYSBVbml4IGRhZW1vbi4KKyAgICBcZGVmXHRlbXBhe3tccm0gfX0lCisgICAgXGRlZlx0ZW1wYnsjMX0lCisgICAgXGVkZWZcdGVtcGN7XHRlbXBhfSUKKyAgICBcZWRlZlx0ZW1wZHtcdGVtcGJ9JQorICAgIFxpZnhcdGVtcGNcdGVtcGQKKyAgICAgIFwgJQorICAgIFxlbHNlCisgICAgICAlCisgICAgICAlIElmIHdlIG11c3QsIHB1dCB0aGUgcGFnZSBudW1iZXIgb24gYSBsaW5lIG9mIGl0cyBvd24sIGFuZCBmaWxsIG91dAorICAgICAgJSB0aGlzIGxpbmUgd2l0aCBibGFuayBzcGFjZS4gIChUaGUgXGhmaWwgaXMgb3ZlcndoZWxtZWQgd2l0aCB0aGUKKyAgICAgICUgZmlsbCBsZWFkZXJzIGdsdWUgaW4gXGluZGV4ZG90ZmlsbCBpZiB0aGUgcGFnZSBudW1iZXIgZG9lcyBmaXQuKQorICAgICAgXGhmaWxccGVuYWx0eTUwCisgICAgICBcbnVsbFxub2JyZWFrXGluZGV4ZG90ZmlsbCAlIEhhdmUgbGVhZGVycyBiZWZvcmUgdGhlIHBhZ2UgbnVtYmVyLgorICAgICAgJQorICAgICAgJSBUaGUgYFwgJyBoZXJlIGlzIHJlbW92ZWQgYnkgdGhlIGltcGxpY2l0IFx1bnNraXAgdGhhdCBUZVggZG9lcyBhcworICAgICAgJSBwYXJ0IG9mICh0aGUgcHJpbWl0aXZlKSBccGFyLiAgV2l0aG91dCBpdCwgYSBzcHVyaW91cyB1bmRlcmZ1bGwKKyAgICAgICUgXGhib3ggZW5zdWVzLgorICAgICAgXGlmcGRmCisJXHBkZmdldHRva3MjMS4lCisJXCBcdGhlXHRva3NBCisgICAgICBcZWxzZQorCVwgIzElCisgICAgICBcZmkKKyAgICBcZmkKKyAgICBccGFyCisgIFxlbmRncm91cAorfQorCislIExpa2UgXGRvdGZpbGwgZXhjZXB0IHRha2VzIGF0IGxlYXN0IDEgZW0uCitcZGVmXGluZGV4ZG90ZmlsbHtcY2xlYWRlcnMKKyAgXGhib3h7JFxtYXRoc3Vycm91bmQ9MHB0IFxta2VybjEuNW11ICR7XGl0IC59JCBcbWtlcm4xLjVtdSR9XGhza2lwIDFlbSBwbHVzIDFmaWxsfQorCitcZGVmXHByaW1hcnkgIzF7XGxpbmV7IzFcaGZpbH19CisKK1xuZXdza2lwXHNlY29uZGFyeWluZGVudCBcc2Vjb25kYXJ5aW5kZW50PTAuNWNtCitcZGVmXHNlY29uZGFyeSMxIzJ7eyUKKyAgXHBhcmZpbGxza2lwPTBpbgorICBccGFyc2tpcD0waW4KKyAgXGhhbmdpbmRlbnQ9MWluCisgIFxoYW5nYWZ0ZXI9MQorICBcbm9pbmRlbnRcaHNraXBcc2Vjb25kYXJ5aW5kZW50XGhib3h7IzF9XGluZGV4ZG90ZmlsbAorICBcaWZwZGYKKyAgICBccGRmZ2V0dG9rcyMyLlwgXHRoZVx0b2tzQSAlIFRoZSBwYWdlIG51bWJlciBlbmRzIHRoZSBwYXJhZ3JhcGguCisgIFxlbHNlCisgICAgIzIKKyAgXGZpCisgIFxwYXIKK319CisKKyUgRGVmaW5lIHR3by1jb2x1bW4gbW9kZSwgd2hpY2ggd2UgdXNlIHRvIHR5cGVzZXQgaW5kZXhlcy4KKyUgQWRhcHRlZCBmcm9tIHRoZSBUZVhib29rLCBwYWdlIDQxNiwgd2hpY2ggaXMgdG8gc2F5LAorJSB0aGUgbWFubWFjLnRleCBmb3JtYXQgdXNlZCB0byBwcmludCB0aGUgVGVYYm9vayBpdHNlbGYuCitcY2F0Y29kZWBcQD0xMQorCitcbmV3Ym94XHBhcnRpYWxwYWdlCitcbmV3ZGltZW5cZG91YmxlY29sdW1uaHNpemUKKworXGRlZlxiZWdpbmRvdWJsZWNvbHVtbnN7XGJlZ2luZ3JvdXAgJSBlbmRlZCBieSBcZW5kZG91YmxlY29sdW1ucworICAlIEdyYWIgYW55IHNpbmdsZS1jb2x1bW4gbWF0ZXJpYWwgYWJvdmUgdXMuCisgIFxvdXRwdXQgPSB7JQorICAgICUKKyAgICAlIEhlcmUgaXMgYSBwb3NzaWJpbGl0eSBub3QgZm9yZXNlZW4gaW4gbWFubWFjOiBpZiB3ZSBhY2N1bXVsYXRlIGEKKyAgICAlIHdob2xlIGxvdCBvZiBtYXRlcmlhbCwgd2UgbWlnaHQgZW5kIHVwIGNhbGxpbmcgdGhpcyBcb3V0cHV0CisgICAgJSByb3V0aW5lIHR3aWNlIGluIGEgcm93IChzZWUgdGhlIGRvdWJsZWNvbC1sb3NlIHRlc3QsIHdoaWNoIGlzCisgICAgJSBlc3NlbnRpYWxseSBhIGNvdXBsZSBvZiBpbmRleGVzIHdpdGggQHNldGNoYXB0ZXJuZXdwYWdlIG9mZikuICBJbgorICAgICUgdGhhdCBjYXNlIHdlIGp1c3Qgc2hpcCBvdXQgd2hhdCBpcyBpbiBccGFydGlhbHBhZ2Ugd2l0aCB0aGUgbm9ybWFsCisgICAgJSBvdXRwdXQgcm91dGluZS4gIEdlbmVyYWxseSwgXHBhcnRpYWxwYWdlIHdpbGwgYmUgZW1wdHkgd2hlbiB0aGlzCisgICAgJSBydW5zIGFuZCB0aGlzIHdpbGwgYmUgYSBuby1vcC4gIFNlZSB0aGUgaW5kZXhzcHJlYWQudGV4IHRlc3QgY2FzZS4KKyAgICBcaWZ2b2lkXHBhcnRpYWxwYWdlIFxlbHNlCisgICAgICBcb25lcGFnZW91dHtccGFnZWNvbnRlbnRzXHBhcnRpYWxwYWdlfSUKKyAgICBcZmkKKyAgICAlCisgICAgXGdsb2JhbFxzZXRib3hccGFydGlhbHBhZ2UgPSBcdmJveHslCisgICAgICAlIFVudmJveCB0aGUgbWFpbiBvdXRwdXQgcGFnZS4KKyAgICAgIFx1bnZib3hcUEFHRQorICAgICAgXGtlcm4tXHRvcHNraXAgXGtlcm5cYmFzZWxpbmVza2lwCisgICAgfSUKKyAgfSUKKyAgXGVqZWN0ICUgcnVuIHRoYXQgb3V0cHV0IHJvdXRpbmUgdG8gc2V0IFxwYXJ0aWFscGFnZQorICAlCisgICUgVXNlIHRoZSBkb3VibGUtY29sdW1uIG91dHB1dCByb3V0aW5lIGZvciBzdWJzZXF1ZW50IHBhZ2VzLgorICBcb3V0cHV0ID0ge1xkb3VibGVjb2x1bW5vdXR9JQorICAlCisgICUgQ2hhbmdlIHRoZSBwYWdlIHNpemUgcGFyYW1ldGVycy4gIFdlIGNvdWxkIGRvIHRoaXMgb25jZSBvdXRzaWRlIHRoaXMKKyAgJSByb3V0aW5lLCBpbiBlYWNoIG9mIEBzbWFsbGJvb2ssIEBhZm91cnBhcGVyLCBhbmQgdGhlIGRlZmF1bHQgOC41eDExCisgICUgZm9ybWF0LCBidXQgdGhlbiB3ZSByZXBlYXQgdGhlIHNhbWUgY29tcHV0YXRpb24uICBSZXBlYXRpbmcgYSBjb3VwbGUKKyAgJSBvZiBhc3NpZ25tZW50cyBvbmNlIHBlciBpbmRleCBpcyBjbGVhcmx5IG1lYW5pbmdsZXNzIGZvciB0aGUKKyAgJSBleGVjdXRpb24gdGltZSwgc28gd2UgbWF5IGFzIHdlbGwgZG8gaXQgaW4gb25lIHBsYWNlLgorICAlCisgICUgRmlyc3Qgd2UgaGFsdmUgdGhlIGxpbmUgbGVuZ3RoLCBsZXNzIGEgbGl0dGxlIGZvciB0aGUgZ3V0dGVyIGJldHdlZW4KKyAgJSB0aGUgY29sdW1ucy4gIFdlIGNvbXB1dGUgdGhlIGd1dHRlciBiYXNlZCBvbiB0aGUgbGluZSBsZW5ndGgsIHNvIGl0CisgICUgY2hhbmdlcyBhdXRvbWF0aWNhbGx5IHdpdGggdGhlIHBhcGVyIGZvcm1hdC4gIFRoZSBtYWdpYyBjb25zdGFudAorICAlIGJlbG93IGlzIGNob3NlbiBzbyB0aGF0IHRoZSBndXR0ZXIgaGFzIHRoZSBzYW1lIHZhbHVlICh3ZWxsLCArLTwxcHQpCisgICUgYXMgaXQgZGlkIHdoZW4gd2UgaGFyZC1jb2RlZCBpdC4KKyAgJQorICAlIFdlIHB1dCB0aGUgcmVzdWx0IGluIGEgc2VwYXJhdGUgcmVnaXN0ZXIsIFxkb3VibGVjb2x1bWhzaXplLCBzbyB3ZQorICAlIGNhbiByZXN0b3JlIGl0IGluIFxwYWdlc29mYXIsIGFmdGVyIFxoc2l6ZSBpdHNlbGYgaGFzIChwb3RlbnRpYWxseSkKKyAgJSBiZWVuIGNsb2JiZXJlZC4KKyAgJQorICBcZG91YmxlY29sdW1uaHNpemUgPSBcaHNpemUKKyAgICBcYWR2YW5jZVxkb3VibGVjb2x1bW5oc2l6ZSBieSAtLjA0MTU0XGhzaXplCisgICAgXGRpdmlkZVxkb3VibGVjb2x1bW5oc2l6ZSBieSAyCisgIFxoc2l6ZSA9IFxkb3VibGVjb2x1bW5oc2l6ZQorICAlCisgICUgRG91YmxlIHRoZSBcdnNpemUgYXMgd2VsbC4gIChXZSBkb24ndCBuZWVkIGEgc2VwYXJhdGUgcmVnaXN0ZXIgaGVyZSwKKyAgJSBzaW5jZSBub2JvZHkgY2xvYmJlcnMgXHZzaXplLikKKyAgXHZzaXplID0gMlx2c2l6ZQorfQorCislIFRoZSBkb3VibGUtY29sdW1uIG91dHB1dCByb3V0aW5lIGZvciBhbGwgZG91YmxlLWNvbHVtbiBwYWdlcyBleGNlcHQKKyUgdGhlIGxhc3QuCislCitcZGVmXGRvdWJsZWNvbHVtbm91dHslCisgIFxzcGxpdHRvcHNraXA9XHRvcHNraXAgXHNwbGl0bWF4ZGVwdGg9XG1heGRlcHRoCisgICUgR2V0IHRoZSBhdmFpbGFibGUgc3BhY2UgZm9yIHRoZSBkb3VibGUgY29sdW1ucyAtLSB0aGUgbm9ybWFsCisgICUgKHVuZG91YmxlZCkgcGFnZSBoZWlnaHQgbWludXMgYW55IG1hdGVyaWFsIGxlZnQgb3ZlciBmcm9tIHRoZQorICAlIHByZXZpb3VzIHBhZ2UuCisgIFxkaW1lbkAgPSBcdnNpemUKKyAgXGRpdmlkZVxkaW1lbkAgYnkgMgorICBcYWR2YW5jZVxkaW1lbkAgYnkgLVxodFxwYXJ0aWFscGFnZQorICAlCisgICUgYm94MCB3aWxsIGJlIHRoZSBsZWZ0LWhhbmQgY29sdW1uLCBib3gyIHRoZSByaWdodC4KKyAgXHNldGJveDA9XHZzcGxpdDI1NSB0b1xkaW1lbkAgXHNldGJveDI9XHZzcGxpdDI1NSB0b1xkaW1lbkAKKyAgXG9uZXBhZ2VvdXRccGFnZXNvZmFyCisgIFx1bnZib3gyNTUKKyAgXHBlbmFsdHlcb3V0cHV0cGVuYWx0eQorfQorJQorJSBSZS1vdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgcGFnZSAtLSBhbnkgcHJldmlvdXMgbWF0ZXJpYWwsCislIGZvbGxvd2VkIGJ5IHRoZSB0d28gYm94ZXMgd2UganVzdCBzcGxpdCwgaW4gYm94MCBhbmQgYm94Mi4KK1xkZWZccGFnZXNvZmFyeyUKKyAgXHVudmJveFxwYXJ0aWFscGFnZQorICAlCisgIFxoc2l6ZSA9IFxkb3VibGVjb2x1bW5oc2l6ZQorICBcd2QwPVxoc2l6ZSBcd2QyPVxoc2l6ZQorICBcaGJveCB0b1xwYWdld2lkdGh7XGJveDBcaGZpbFxib3gyfSUKK30KKyUKKyUgQWxsIGRvbmUgd2l0aCBkb3VibGUgY29sdW1ucy4KK1xkZWZcZW5kZG91YmxlY29sdW1uc3slCisgIFxvdXRwdXQgPSB7JQorICAgICUgU3BsaXQgdGhlIGxhc3Qgb2YgdGhlIGRvdWJsZS1jb2x1bW4gbWF0ZXJpYWwuICBMZWF2ZSBpdCBvbiB0aGUKKyAgICAlIGN1cnJlbnQgcGFnZSwgbm8gYXV0b21hdGljIHBhZ2UgYnJlYWsuCisgICAgXGJhbGFuY2Vjb2x1bW5zCisgICAgJQorICAgICUgSWYgd2UgZW5kIHVwIHNwbGl0dGluZyB0b28gbXVjaCBtYXRlcmlhbCBmb3IgdGhlIGN1cnJlbnQgcGFnZSwKKyAgICAlIHRob3VnaCwgdGhlcmUgd2lsbCBiZSBhbm90aGVyIHBhZ2UgYnJlYWsgcmlnaHQgYWZ0ZXIgdGhpcyBcb3V0cHV0CisgICAgJSBpbnZvY2F0aW9uIGVuZHMuICBIYXZpbmcgY2FsbGVkIFxiYWxhbmNlY29sdW1ucyBvbmNlLCB3ZSBkbyBub3QKKyAgICAlIHdhbnQgdG8gY2FsbCBpdCBhZ2Fpbi4gIFRoZXJlZm9yZSwgcmVzZXQgXG91dHB1dCB0byBpdHMgbm9ybWFsCisgICAgJSBkZWZpbml0aW9uIHJpZ2h0IGF3YXkuICAoV2UgaG9wZSBcYmFsYW5jZWNvbHVtbnMgd2lsbCBuZXZlciBiZQorICAgICUgY2FsbGVkIG9uIHRvIGJhbGFuY2UgdG9vIG11Y2ggbWF0ZXJpYWwsIGJ1dCBpZiBpdCBpcywgdGhpcyBtYWtlcworICAgICUgdGhlIG91dHB1dCBzb21ld2hhdCBtb3JlIHBhbGF0YWJsZS4pCisgICAgXGdsb2JhbFxvdXRwdXQgPSB7XG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xQQUdFfX0lCisgIH0lCisgIFxlamVjdAorICBcZW5kZ3JvdXAgJSBzdGFydGVkIGluIFxiZWdpbmRvdWJsZWNvbHVtbnMKKyAgJQorICAlIFxwYWdlZ29hbCB3YXMgc2V0IHRvIHRoZSBkb3VibGVkIFx2c2l6ZSBhYm92ZSwgc2luY2Ugd2UgcmVzdGFydGVkCisgICUgdGhlIGN1cnJlbnQgcGFnZS4gIFdlJ3JlIG5vdyBiYWNrIHRvIG5vcm1hbCBzaW5nbGUtY29sdW1uCisgICUgdHlwZXNldHRpbmcsIHNvIHJlc2V0IFxwYWdlZ29hbCB0byB0aGUgbm9ybWFsIFx2c2l6ZSAoYWZ0ZXIgdGhlCisgICUgXGVuZGdyb3VwIHdoZXJlIFx2c2l6ZSBnb3QgcmVzdG9yZWQpLgorICBccGFnZWdvYWwgPSBcdnNpemUKK30KKyUKKyUgQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRvdWJsZSBjb2x1bW4gbWF0ZXJpYWwuCitcZGVmXGJhbGFuY2Vjb2x1bW5zeyUKKyAgXHNldGJveDAgPSBcdmJveHtcdW52Ym94MjU1fSUgbGlrZSBcYm94MjU1IGJ1dCBtb3JlIGVmZmljaWVudCwgc2VlIHAuMTIwLgorICBcZGltZW5AID0gXGh0MAorICBcYWR2YW5jZVxkaW1lbkAgYnkgXHRvcHNraXAKKyAgXGFkdmFuY2VcZGltZW5AIGJ5LVxiYXNlbGluZXNraXAKKyAgXGRpdmlkZVxkaW1lbkAgYnkgMiAlIHRhcmdldCB0byBzcGxpdCB0bworICAlZGVidWdcbWVzc2FnZXtmaW5hbCAyLWNvbHVtbiBtYXRlcmlhbCBoZWlnaHQ9XHRoZVxodDAsIHRhcmdldD1cdGhlXGRpbWVuQC59JQorICBcc3BsaXR0b3Bza2lwID0gXHRvcHNraXAKKyAgJSBMb29wIHVudGlsIHdlIGdldCBhIGRlY2VudCBicmVha3BvaW50LgorICB7JQorICAgIFx2YmFkbmVzcyA9IDEwMDAwCisgICAgXGxvb3AKKyAgICAgIFxnbG9iYWxcc2V0Ym94MyA9IFxjb3B5MAorICAgICAgXGdsb2JhbFxzZXRib3gxID0gXHZzcGxpdDMgdG8gXGRpbWVuQAorICAgIFxpZmRpbVxodDM+XGRpbWVuQAorICAgICAgXGdsb2JhbFxhZHZhbmNlXGRpbWVuQCBieSAxcHQKKyAgICBccmVwZWF0CisgIH0lCisgICVkZWJ1Z1xtZXNzYWdle3NwbGl0IHRvIFx0aGVcZGltZW5ALCBjb2x1bW4gaGVpZ2h0czogXHRoZVxodDEsIFx0aGVcaHQzLn0lCisgIFxzZXRib3gwPVx2Ym94IHRvXGRpbWVuQHtcdW52Ym94MX0lCisgIFxzZXRib3gyPVx2Ym94IHRvXGRpbWVuQHtcdW52Ym94M30lCisgICUKKyAgXHBhZ2Vzb2ZhcgorfQorXGNhdGNvZGVgXEAgPSBcb3RoZXIKKworCitcbWVzc2FnZXtzZWN0aW9uaW5nLH0KKyUgQ2hhcHRlcnMsIHNlY3Rpb25zLCBldGMuCisKKyUgXHVubnVtYmVyZWRubyBpcyBhbiBveHltb3Jvbiwgb2YgY291cnNlLiAgQnV0IHdlIGNvdW50IHRoZSB1bm51bWJlcmVkCislIHNlY3Rpb25zIHNvIHRoYXQgd2UgY2FuIHJlZmVyIHRvIHRoZW0gdW5hbWJpZ3VvdXNseSBpbiB0aGUgcGRmCislIG91dGxpbmVzIGJ5IHRoZWlyICJzZWN0aW9uIG51bWJlciIuICBXZSBhdm9pZCBjb2xsaXNpb25zIHdpdGggY2hhcHRlcgorJSBudW1iZXJzIGJ5IHN0YXJ0aW5nIHRoZW0gYXQgMTAwMDAuICAoSWYgYSBkb2N1bWVudCBldmVyIGhhcyAxMDAwMAorJSBjaGFwdGVycywgd2UncmUgaW4gdHJvdWJsZSBhbnl3YXksIEknbSBzdXJlLikKK1xuZXdjb3VudFx1bm51bWJlcmVkbm8gXHVubnVtYmVyZWRubyA9IDEwMDAwCitcbmV3Y291bnRcY2hhcG5vCitcbmV3Y291bnRcc2Vjbm8gICAgICAgIFxzZWNubz0wCitcbmV3Y291bnRcc3Vic2Vjbm8gICAgIFxzdWJzZWNubz0wCitcbmV3Y291bnRcc3Vic3Vic2Vjbm8gIFxzdWJzdWJzZWNubz0wCisKKyUgVGhpcyBjb3VudGVyIGlzIGZ1bm55IHNpbmNlIGl0IGNvdW50cyB0aHJvdWdoIGNoYXJjb2RlcyBvZiBsZXR0ZXJzIEEsIEIsIC4uLgorXG5ld2NvdW50XGFwcGVuZGl4bm8gIFxhcHBlbmRpeG5vID0gYFxACislCislIFxkZWZcYXBwZW5kaXhsZXR0ZXJ7XGNoYXJcdGhlXGFwcGVuZGl4bm99CislIFdlIGRvIHRoZSBmb2xsb3dpbmcgdWdseSBjb25kaXRpb25hbCBpbnN0ZWFkIG9mIHRoZSBhYm92ZSBzaW1wbGUKKyUgY29uc3RydWN0IGZvciB0aGUgc2FrZSBvZiBwZGZ0ZXgsIHdoaWNoIG5lZWRzIHRoZSBhY3R1YWwKKyUgbGV0dGVyIGluIHRoZSBleHBhbnNpb24sIG5vdCBqdXN0IHR5cGVzZXQuCislCitcZGVmXGFwcGVuZGl4bGV0dGVyeyUKKyAgXGlmbnVtXGFwcGVuZGl4bm89YEEgQSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gQiBCJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBDIEMlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEQgRCUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gRSBFJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBGIEYlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEcgRyUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gSCBIJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBJIEklCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEogSiUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gSyBLJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBMIEwlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YE0gTSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gTiBOJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBPIE8lCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFAgUCUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gUSBRJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBSIFIlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFMgUyUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gVCBUJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBVIFUlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFYgViUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gVyBXJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBYIFglCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFkgWSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gWiBaJQorICAlIFRoZSBcdGhlIGlzIG5lY2Vzc2FyeSwgZGVzcGl0ZSBhcHBlYXJhbmNlcywgYmVjYXVzZSBcYXBwZW5kaXhsZXR0ZXIgaXMKKyAgJSBleHBhbmRlZCB3aGlsZSB3cml0aW5nIHRoZSAudG9jIGZpbGUuICBcY2hhclxhcHBlbmRpeG5vIGlzIG5vdAorICAlIGV4cGFuZGFibGUsIHRodXMgaXQgaXMgd3JpdHRlbiBsaXRlcmFsbHksIHRodXMgYWxsIGFwcGVuZGl4ZXMgY29tZSBvdXQKKyAgJSB3aXRoIHRoZSBzYW1lIGxldHRlciAob3IgQCkgaW4gdGhlIHRvYyB3aXRob3V0IGl0LgorICBcZWxzZVxjaGFyXHRoZVxhcHBlbmRpeG5vCisgIFxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaVxmaQorICBcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZml9CisKKyUgRWFjaCBAY2hhcHRlciBkZWZpbmVzIHRoaXMgYXMgdGhlIG5hbWUgb2YgdGhlIGNoYXB0ZXIuCislIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzIGNhbiB1c2UgaXQuICBAc2VjdGlvbiBkb2VzIGxpa2V3aXNlLgorJSBIb3dldmVyLCB0aGV5IGFyZSBub3QgcmVsaWFibGUsIGJlY2F1c2Ugd2UgZG9uJ3QgdXNlIG1hcmtzLgorXGRlZlx0aGlzY2hhcHRlcnt9CitcZGVmXHRoaXNzZWN0aW9ue30KKworXG5ld2NvdW50XGFic3NlY2xldmVsICUgdXNlZCB0byBjYWxjdWxhdGUgcHJvcGVyIGhlYWRpbmcgbGV2ZWwKK1xuZXdjb3VudFxzZWNiYXNlXHNlY2Jhc2U9MCAlIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zIG1vZGlmeSB0aGlzIGNvdW50CisKKyUgQHJhaXNlc2VjdGlvbnM6IHRyZWF0IEBzZWN0aW9uIGFzIGNoYXB0ZXIsIEBzdWJzZWN0aW9uIGFzIHNlY3Rpb24sIGV0Yy4KK1xkZWZccmFpc2VzZWN0aW9uc3tcZ2xvYmFsXGFkdmFuY2Vcc2VjYmFzZSBieSAtMX0KK1xsZXRcdXA9XHJhaXNlc2VjdGlvbnMgJSBvcmlnaW5hbCBCRm94IG5hbWUKKworJSBAbG93ZXJzZWN0aW9uczogdHJlYXQgQGNoYXB0ZXIgYXMgc2VjdGlvbiwgQHNlY3Rpb24gYXMgc3Vic2VjdGlvbiwgZXRjLgorXGRlZlxsb3dlcnNlY3Rpb25ze1xnbG9iYWxcYWR2YW5jZVxzZWNiYXNlIGJ5IDF9CitcbGV0XGRvd249XGxvd2Vyc2VjdGlvbnMgJSBvcmlnaW5hbCBCRm94IG5hbWUKKworJSB3ZSBvbmx5IGhhdmUgc3Vic3ViLgorXGNoYXJkZWZcbWF4c2VjbGV2ZWwgPSAzCislCislIEEgbnVtYmVyZWQgc2VjdGlvbiB3aXRoaW4gYW4gdW5udW1iZXJlZCBjaGFuZ2VzIHRvIHVubnVtYmVyZWQgdG9vLgorJSBUbyBhY2hpdmUgdGhpcywgcmVtZW1iZXIgdGhlICJiaWdnZXN0IiB1bm51bS4gc2VjLiB3ZSBhcmUgY3VycmVudGx5IGluOgorXGNoYXJkZWZcdW5tbGV2ZWwgPSBcbWF4c2VjbGV2ZWwKKyUKKyUgVHJhY2Ugd2hldGhlciB0aGUgY3VycmVudCBjaGFwdGVyIGlzIGFuIGFwcGVuZGl4IG9yIG5vdDoKKyUgXGNoYXBoZWFkdHlwZSBpcyAiTiIgb3IgIkEiLCB1bm51bWJlcmVkIGNoYXB0ZXJzIGFyZSBpZ25vcmVkLgorXGRlZlxjaGFwaGVhZHR5cGV7Tn0KKworJSBDaG9vc2UgYSBoZWFkaW5nIG1hY3JvCislICMxIGlzIGhlYWRpbmcgdHlwZQorJSAjMiBpcyBoZWFkaW5nIGxldmVsCislICMzIGlzIHRleHQgZm9yIGhlYWRpbmcKK1xkZWZcZ2VuaGVhZCMxIzIjM3slCisgICUgQ29tcHV0ZSB0aGUgYWJzLiBzZWMuIGxldmVsOgorICBcYWJzc2VjbGV2ZWw9IzIKKyAgXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgXHNlY2Jhc2UKKyAgJSBNYWtlIHN1cmUgXGFic3NlY2xldmVsIGRvZXNuJ3QgZmFsbCBvdXRzaWRlIHRoZSByYW5nZToKKyAgXGlmbnVtIFxhYnNzZWNsZXZlbCA8IDAKKyAgICBcYWJzc2VjbGV2ZWwgPSAwCisgIFxlbHNlCisgICAgXGlmbnVtIFxhYnNzZWNsZXZlbCA+IDMKKyAgICAgIFxhYnNzZWNsZXZlbCA9IDMKKyAgICBcZmkKKyAgXGZpCisgICUgVGhlIGhlYWRpbmcgdHlwZToKKyAgXGRlZlxoZWFkdHlwZXsjMX0lCisgIFxpZiBcaGVhZHR5cGUgVSUKKyAgICBcaWZudW0gXGFic3NlY2xldmVsIDwgXHVubWxldmVsCisgICAgICBcY2hhcmRlZlx1bm1sZXZlbCA9IFxhYnNzZWNsZXZlbAorICAgIFxmaQorICBcZWxzZQorICAgICUgQ2hlY2sgZm9yIGFwcGVuZGl4IHNlY3Rpb25zOgorICAgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPSAwCisgICAgICBcZWRlZlxjaGFwaGVhZHR5cGV7XGhlYWR0eXBlfSUKKyAgICBcZWxzZQorICAgICAgXGlmIFxoZWFkdHlwZSBBXGlmIFxjaGFwaGVhZHR5cGUgTiUKKwlcZXJybWVzc2FnZXtAYXBwZW5kaXguLi4gd2l0aGluIGEgbm9uLWFwcGVuZGl4IGNoYXB0ZXJ9JQorICAgICAgXGZpXGZpCisgICAgXGZpCisgICAgJSBDaGVjayBmb3IgbnVtYmVyZWQgd2l0aGluIHVubnVtYmVyZWQ6CisgICAgXGlmbnVtIFxhYnNzZWNsZXZlbCA+IFx1bm1sZXZlbAorICAgICAgXGRlZlxoZWFkdHlwZXtVfSUKKyAgICBcZWxzZQorICAgICAgXGNoYXJkZWZcdW5tbGV2ZWwgPSAzCisgICAgXGZpCisgIFxmaQorICAlIE5vdyBwcmludCB0aGUgaGVhZGluZzoKKyAgXGlmIFxoZWFkdHlwZSBVJQorICAgIFxpZmNhc2VcYWJzc2VjbGV2ZWwKKwlcdW5udW1iZXJlZHp6ensjM30lCisgICAgXG9yIFx1bm51bWJlcmVkc2Vjenp6eyMzfSUKKyAgICBcb3IgXHVubnVtYmVyZWRzdWJzZWN6enp7IzN9JQorICAgIFxvciBcdW5udW1iZXJlZHN1YnN1YnNlY3p6ensjM30lCisgICAgXGZpCisgIFxlbHNlCisgICAgXGlmIFxoZWFkdHlwZSBBJQorICAgICAgXGlmY2FzZVxhYnNzZWNsZXZlbAorCSAgXGFwcGVuZGl4enp6eyMzfSUKKyAgICAgIFxvciBcYXBwZW5kaXhzZWN0aW9uenp6eyMzfSUKKyAgICAgIFxvciBcYXBwZW5kaXhzdWJzZWN6enp7IzN9JQorICAgICAgXG9yIFxhcHBlbmRpeHN1YnN1YnNlY3p6ensjM30lCisgICAgICBcZmkKKyAgICBcZWxzZQorICAgICAgXGlmY2FzZVxhYnNzZWNsZXZlbAorCSAgXGNoYXB0ZXJ6enp7IzN9JQorICAgICAgXG9yIFxzZWN6enp7IzN9JQorICAgICAgXG9yIFxudW1iZXJlZHN1YnNlY3p6ensjM30lCisgICAgICBcb3IgXG51bWJlcmVkc3Vic3Vic2Vjenp6eyMzfSUKKyAgICAgIFxmaQorICAgIFxmaQorICBcZmkKKyAgXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnQKK30KKworJSBhbiBpbnRlcmZhY2U6CitcZGVmXG51bWhlYWR7XGdlbmhlYWQgTn0KK1xkZWZcYXBwaGVhZHtcZ2VuaGVhZCBBfQorXGRlZlx1bm5taGVhZHtcZ2VuaGVhZCBVfQorCislIEBjaGFwdGVyLCBAYXBwZW5kaXgsIEB1bm51bWJlcmVkLiAgSW5jcmVtZW50IHRvcC1sZXZlbCBjb3VudGVyLCByZXNldAorJSBhbGwgbG93ZXItbGV2ZWwgc2VjdGlvbmluZyBjb3VudGVycyB0byB6ZXJvLgorJQorJSBBbHNvIHNldCBcY2hhcGxldmVscHJlZml4LCB3aGljaCB3ZSBwcmVwZW5kIHRvIEBmbG9hdCBzZXF1ZW5jZSBudW1iZXJzCislIChlLmcuLCBmaWd1cmVzKSwgcS52LiAgQnkgZGVmYXVsdCAoYmVmb3JlIGFueSBjaGFwdGVyKSwgdGhhdCBpcyBlbXB0eS4KK1xsZXRcY2hhcGxldmVscHJlZml4ID0gXGVtcHR5CislCitcb3V0ZXJccGFyc2VhcmdkZWZcY2hhcHRlcntcbnVtaGVhZDB7IzF9fSAlIG5vcm1hbGx5IG51bWhlYWQwIGNhbGxzIGNoYXB0ZXJ6enoKK1xkZWZcY2hhcHRlcnp6eiMxeyUKKyAgJSBzZWN0aW9uIHJlc2V0dGluZyBpcyBcZ2xvYmFsIGluIGNhc2UgdGhlIGNoYXB0ZXIgaXMgaW4gYSBncm91cCwgc3VjaAorICAlIGFzIGFuIEBpbmNsdWRlIGZpbGUuCisgIFxnbG9iYWxcc2Vjbm89MCBcZ2xvYmFsXHN1YnNlY25vPTAgXGdsb2JhbFxzdWJzdWJzZWNubz0wCisgICAgXGdsb2JhbFxhZHZhbmNlXGNoYXBubyBieSAxCisgICUKKyAgJSBVc2VkIGZvciBcZmxvYXQuCisgIFxnZGVmXGNoYXBsZXZlbHByZWZpeHtcdGhlXGNoYXBuby59JQorICBccmVzZXRhbGxmbG9hdG5vcworICAlCisgIFxtZXNzYWdle1xwdXR3b3JkQ2hhcHRlclxzcGFjZSBcdGhlXGNoYXBub30lCisgICUKKyAgJSBXcml0ZSB0aGUgYWN0dWFsIGhlYWRpbmcuCisgIFxjaGFwbWFjcm97IzF9e1ludW1iZXJlZH17XHRoZVxjaGFwbm99JQorICAlCisgICUgU28gQHNlY3Rpb24gYW5kIHRoZSBsaWtlIGFyZSBudW1iZXJlZCB1bmRlcm5lYXRoIHRoaXMgY2hhcHRlci4KKyAgXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFxudW1iZXJlZHNlYworICBcZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic2VjCisgIFxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzdWJzZWMKK30KKworXG91dGVyXHBhcnNlYXJnZGVmXGFwcGVuZGl4e1xhcHBoZWFkMHsjMX19ICUgbm9ybWFsbHkgYXBwaGVhZDAgY2FsbHMgYXBwZW5kaXh6enoKK1xkZWZcYXBwZW5kaXh6enojMXslCisgIFxnbG9iYWxcc2Vjbm89MCBcZ2xvYmFsXHN1YnNlY25vPTAgXGdsb2JhbFxzdWJzdWJzZWNubz0wCisgICAgXGdsb2JhbFxhZHZhbmNlXGFwcGVuZGl4bm8gYnkgMQorICBcZ2RlZlxjaGFwbGV2ZWxwcmVmaXh7XGFwcGVuZGl4bGV0dGVyLn0lCisgIFxyZXNldGFsbGZsb2F0bm9zCisgICUKKyAgXGRlZlxhcHBlbmRpeG51bXtccHV0d29yZEFwcGVuZGl4XHNwYWNlIFxhcHBlbmRpeGxldHRlcn0lCisgIFxtZXNzYWdle1xhcHBlbmRpeG51bX0lCisgICUKKyAgXGNoYXBtYWNyb3sjMX17WWFwcGVuZGl4fXtcYXBwZW5kaXhsZXR0ZXJ9JQorICAlCisgIFxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcYXBwZW5kaXhzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFxhcHBlbmRpeHN1YnNlYworICBcZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXGFwcGVuZGl4c3Vic3Vic2VjCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlx1bm51bWJlcmVke1x1bm5taGVhZDB7IzF9fSAlIG5vcm1hbGx5IHVubm1oZWFkMCBjYWxscyB1bm51bWJlcmVkenp6CitcZGVmXHVubnVtYmVyZWR6enojMXslCisgIFxnbG9iYWxcc2Vjbm89MCBcZ2xvYmFsXHN1YnNlY25vPTAgXGdsb2JhbFxzdWJzdWJzZWNubz0wCisgICAgXGdsb2JhbFxhZHZhbmNlXHVubnVtYmVyZWRubyBieSAxCisgICUKKyAgJSBTaW5jZSBhbiB1bm51bWJlcmVkIGhhcyBubyBudW1iZXIsIG5vIHByZWZpeCBmb3IgZmlndXJlcy4KKyAgXGdsb2JhbFxsZXRcY2hhcGxldmVscHJlZml4ID0gXGVtcHR5CisgIFxyZXNldGFsbGZsb2F0bm9zCisgICUKKyAgJSBUaGlzIHVzZWQgdG8gYmUgc2ltcGx5IFxtZXNzYWdleyMxfSwgYnV0IFRlWCBmdWxseSBleHBhbmRzIHRoZQorICAlIGFyZ3VtZW50IHRvIFxtZXNzYWdlLiAgVGhlcmVmb3JlLCBpZiAjMSBjb250YWluZWQgQC1jb21tYW5kcywgVGVYCisgICUgZXhwYW5kZWQgdGhlbS4gIEZvciBleGFtcGxlLCBpbiBgQHVubnVtYmVyZWQgVGhlIEBjaXRle0Jvb2t9JywgVGVYCisgICUgZXhwYW5kZWQgQGNpdGUgKHdoaWNoIHR1cm5zIG91dCB0byBjYXVzZSBlcnJvcnMgYmVjYXVzZSBcY2l0ZSBpcyBtZWFudAorICAlIHRvIGJlIGV4ZWN1dGVkLCBub3QgZXhwYW5kZWQpLgorICAlCisgICUgQW55d2F5LCB3ZSBkb24ndCB3YW50IHRoZSBmdWxseS1leHBhbmRlZCBkZWZpbml0aW9uIG9mIEBjaXRlIHRvIGFwcGVhcgorICAlIGFzIGEgcmVzdWx0IG9mIHRoZSBcbWVzc2FnZSwgd2UganVzdCB3YW50IGBAY2l0ZScgaXRzZWxmLiAgV2UgdXNlCisgICUgXHRoZTx0b2tzIHJlZ2lzdGVyPiB0byBhY2hpZXZlIHRoaXM6IFRlWCBleHBhbmRzIFx0aGU8dG9rcz4gb25seSBvbmNlLAorICAlIHNpbXBseSB5aWVsZGluZyB0aGUgY29udGVudHMgb2YgPHRva3MgcmVnaXN0ZXI+LiAgKFdlIGFsc28gZG8gdGhpcyBmb3IKKyAgJSB0aGUgdG9jIGVudHJpZXMuKQorICBcdG9rczAgPSB7IzF9JQorICBcbWVzc2FnZXsoXHRoZVx0b2tzMCl9JQorICAlCisgIFxjaGFwbWFjcm97IzF9e1lub3RoaW5nfXtcdGhlXHVubnVtYmVyZWRub30lCisgICUKKyAgXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFx1bm51bWJlcmVkc2VjCisgIFxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcdW5udW1iZXJlZHN1YnNlYworICBcZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXHVubnVtYmVyZWRzdWJzdWJzZWMKK30KKworJSBAY2VudGVyY2hhcCBpcyBsaWtlIEB1bm51bWJlcmVkLCBidXQgdGhlIGhlYWRpbmcgaXMgY2VudGVyZWQuCitcb3V0ZXJccGFyc2VhcmdkZWZcY2VudGVyY2hhcHslCisgICUgV2VsbCwgd2UgY291bGQgZG8gdGhlIGZvbGxvd2luZyBpbiBhIGdyb3VwLCBidXQgdGhhdCB3b3VsZCBicmVhaworICAlIGFuIGFzc3VtcHRpb24gdGhhdCBcY2hhcG1hY3JvIGlzIGNhbGxlZCBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsLgorICAlIFRodXMgd2UgYXJlIHNhZmVyIHRoaXMgd2F5OgkJLS1rYXNhbCwgMjRmZWIwNAorICBcbGV0XGNlbnRlcnBhcmFtZXRlcnNtYXliZSA9IFxjZW50ZXJwYXJhbWV0ZXJzCisgIFx1bm5taGVhZDB7IzF9JQorICBcbGV0XGNlbnRlcnBhcmFtZXRlcnNtYXliZSA9IFxyZWxheAorfQorCislIEB0b3AgaXMgbGlrZSBAdW5udW1iZXJlZC4KK1xsZXRcdG9wXHVubnVtYmVyZWQKKworJSBTZWN0aW9ucy4KK1xvdXRlclxwYXJzZWFyZ2RlZlxudW1iZXJlZHNlY3tcbnVtaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHNlY3p6egorXGRlZlxzZWN6enojMXslCisgIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c2VjfXtZbnVtYmVyZWR9e1x0aGVcY2hhcG5vLlx0aGVcc2Vjbm99JQorfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXhzZWN0aW9ue1xhcHBoZWFkMXsjMX19ICUgbm9ybWFsbHkgY2FsbHMgYXBwZW5kaXhzZWN0aW9uenp6CitcZGVmXGFwcGVuZGl4c2VjdGlvbnp6eiMxeyUKKyAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzZWN9e1lhcHBlbmRpeH17XGFwcGVuZGl4bGV0dGVyLlx0aGVcc2Vjbm99JQorfQorXGxldFxhcHBlbmRpeHNlY1xhcHBlbmRpeHNlY3Rpb24KKworXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWRzZWN7XHVubm1oZWFkMXsjMX19ICUgbm9ybWFsbHkgY2FsbHMgdW5udW1iZXJlZHNlY3p6egorXGRlZlx1bm51bWJlcmVkc2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnNlY25vPTAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3NlY317WW5vdGhpbmd9e1x0aGVcdW5udW1iZXJlZG5vLlx0aGVcc2Vjbm99JQorfQorCislIFN1YnNlY3Rpb25zLgorXG91dGVyXHBhcnNlYXJnZGVmXG51bWJlcmVkc3Vic2Vje1xudW1oZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgbnVtYmVyZWRzdWJzZWN6enoKK1xkZWZcbnVtYmVyZWRzdWJzZWN6enojMXslCisgIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHN1YnNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzZWN9e1ludW1iZXJlZH17XHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vfSUKK30KKworXG91dGVyXHBhcnNlYXJnZGVmXGFwcGVuZGl4c3Vic2Vje1xhcHBoZWFkMnsjMX19ICUgbm9ybWFsbHkgY2FsbHMgYXBwZW5kaXhzdWJzZWN6enoKK1xkZWZcYXBwZW5kaXhzdWJzZWN6enojMXslCisgIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHN1YnNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzZWN9e1lhcHBlbmRpeH0lCisgICAgICAgICAgICAgICAgIHtcYXBwZW5kaXhsZXR0ZXIuXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vfSUKK30KKworXG91dGVyXHBhcnNlYXJnZGVmXHVubnVtYmVyZWRzdWJzZWN7XHVubm1oZWFkMnsjMX19ICVub3JtYWxseSBjYWxscyB1bm51bWJlcmVkc3Vic2Vjenp6CitcZGVmXHVubnVtYmVyZWRzdWJzZWN6enojMXslCisgIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHN1YnNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzZWN9e1lub3RoaW5nfSUKKyAgICAgICAgICAgICAgICAge1x0aGVcdW5udW1iZXJlZG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNub30lCit9CisKKyUgU3Vic3Vic2VjdGlvbnMuCitcb3V0ZXJccGFyc2VhcmdkZWZcbnVtYmVyZWRzdWJzdWJzZWN7XG51bWhlYWQzeyMxfX0gJSBub3JtYWxseSBudW1iZXJlZHN1YnN1YnNlY3p6egorXGRlZlxudW1iZXJlZHN1YnN1YnNlY3p6eiMxeyUKKyAgXGdsb2JhbFxhZHZhbmNlXHN1YnN1YnNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzdWJzZWN9e1ludW1iZXJlZH0lCisgICAgICAgICAgICAgICAgIHtcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNub30lCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlxhcHBlbmRpeHN1YnN1YnNlY3tcYXBwaGVhZDN7IzF9fSAlIG5vcm1hbGx5IGFwcGVuZGl4c3Vic3Vic2Vjenp6CitcZGVmXGFwcGVuZGl4c3Vic3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXGFkdmFuY2Vcc3Vic3Vic2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnN1YnNlY317WWFwcGVuZGl4fSUKKyAgICAgICAgICAgICAgICAge1xhcHBlbmRpeGxldHRlci5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNub30lCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlx1bm51bWJlcmVkc3Vic3Vic2Vje1x1bm5taGVhZDN7IzF9fSAlbm9ybWFsbHkgdW5udW1iZXJlZHN1YnN1YnNlY3p6egorXGRlZlx1bm51bWJlcmVkc3Vic3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXGFkdmFuY2Vcc3Vic3Vic2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnN1YnNlY317WW5vdGhpbmd9JQorICAgICAgICAgICAgICAgICB7XHRoZVx1bm51bWJlcmVkbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm99JQorfQorCislIFRoZXNlIG1hY3JvcyBjb250cm9sIHdoYXQgdGhlIHNlY3Rpb24gY29tbWFuZHMgZG8sIGFjY29yZGluZworJSB0byB3aGF0IGtpbmQgb2YgY2hhcHRlciB3ZSBhcmUgaW4gKG9yZGluYXJ5LCBhcHBlbmRpeCwgb3IgdW5udW1iZXJlZCkuCislIERlZmluZSB0aGVtIGJ5IGRlZmF1bHQgZm9yIGEgbnVtYmVyZWQgY2hhcHRlci4KK1xsZXRcc2VjdGlvbiA9IFxudW1iZXJlZHNlYworXGxldFxzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic2VjCitcbGV0XHN1YnN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzdWJzZWMKKworJSBEZWZpbmUgQG1ham9yaGVhZGluZywgQGhlYWRpbmcgYW5kIEBzdWJoZWFkaW5nCisKKyUgTk9URSBvbiB1c2Ugb2YgXHZib3ggZm9yIGNoYXB0ZXIgaGVhZGluZ3MsIHNlY3Rpb24gaGVhZGluZ3MsIGFuZCBzdWNoOgorJSAgICAgICAxKSBXZSB1c2UgXHZib3ggcmF0aGVyIHRoYW4gdGhlIGVhcmxpZXIgXGxpbmUgdG8gcGVybWl0CislICAgICAgICAgIG92ZXJsb25nIGhlYWRpbmdzIHRvIGZvbGQuCislICAgICAgIDIpIFxoeXBoZW5wZW5hbHR5IGlzIHNldCB0byAxMDAwMCBiZWNhdXNlIGh5cGhlbmF0aW9uIGluIGEKKyUgICAgICAgICAgaGVhZGluZyBpcyBvYm5veGlvdXM7IHRoaXMgZm9yYmlkcyBpdC4KKyUgICAgICAgMykgTGlrZXdpc2UsIGhlYWRpbmdzIGxvb2sgYmVzdCBpZiBubyBccGFyaW5kZW50IGlzIHVzZWQsIGFuZAorJSAgICAgICAgICBpZiBqdXN0aWZpY2F0aW9uIGlzIG5vdCBhdHRlbXB0ZWQuICBIZW5jZSBccmFnZ2VkcmlnaHQuCisKKworXGRlZlxtYWpvcmhlYWRpbmd7JQorICB7XGFkdmFuY2VcY2hhcGhlYWRpbmdza2lwIGJ5IDEwcHQgXGNoYXBicmVhayB9JQorICBccGFyc2VhcmdcY2hhcGhlYWRpbmd6enoKK30KKworXGRlZlxjaGFwaGVhZGluZ3tcY2hhcGJyZWFrIFxwYXJzZWFyZ1xjaGFwaGVhZGluZ3p6en0KK1xkZWZcY2hhcGhlYWRpbmd6enojMXslCisgIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCisgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0CisgICAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19JQorICBcYmlnc2tpcCBccGFyXHBlbmFsdHkgMjAwXHJlbGF4CisgIFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50Cit9CisKKyUgQGhlYWRpbmcsIEBzdWJoZWFkaW5nLCBAc3Vic3ViaGVhZGluZy4KK1xwYXJzZWFyZ2RlZlxoZWFkaW5ne1xzZWN0aW9uaGVhZGluZ3sjMX17c2VjfXtZb21pdGZyb210b2N9e30KKyAgXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnR9CitccGFyc2VhcmdkZWZcc3ViaGVhZGluZ3tcc2VjdGlvbmhlYWRpbmd7IzF9e3N1YnNlY317WW9taXRmcm9tdG9jfXt9CisgIFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50fQorXHBhcnNlYXJnZGVmXHN1YnN1YmhlYWRpbmd7XHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzdWJzZWN9e1lvbWl0ZnJvbXRvY317fQorICBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudH0KKworJSBUaGVzZSBtYWNyb3MgZ2VuZXJhdGUgYSBjaGFwdGVyLCBzZWN0aW9uLCBldGMuIGhlYWRpbmcgb25seQorJSAoaW5jbHVkaW5nIHdoaXRlc3BhY2UsIGxpbmVicmVha2luZywgZXRjLiBhcm91bmQgaXQpLAorJSBnaXZlbiBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGNvbnZlbmllbnQsIHBhcnNlZCBmb3JtLgorCislJSUgQXJncyBhcmUgdGhlIHNraXAgYW5kIHBlbmFsdHkgKHVzdWFsbHkgbmVnYXRpdmUpCitcZGVmXGRvYnJlYWsjMSMye1xwYXJcaWZkaW1cbGFzdHNraXA8IzFccmVtb3ZlbGFzdHNraXBccGVuYWx0eSMyXHZza2lwIzFcZml9CisKKyUlJSBEZWZpbmUgcGxhaW4gY2hhcHRlciBzdGFydHMsIGFuZCBwYWdlIG9uL29mZiBzd2l0Y2hpbmcgZm9yIGl0CislIFBhcmFtZXRlciBjb250cm9sbGluZyBza2lwIGJlZm9yZSBjaGFwdGVyIGhlYWRpbmdzIChpZiBuZWVkZWQpCisKK1xuZXdza2lwXGNoYXBoZWFkaW5nc2tpcAorCitcZGVmXGNoYXBicmVha3tcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwIHstNDAwMH19CitcZGVmXGNoYXBwYWdlcntccGFyXHZmaWxsXHN1cGVyZWplY3R9CitcZGVmXGNoYXBvZGRwYWdle1xjaGFwcGFnZXIgXGlmb2RkXHBhZ2VubyBcZWxzZSBcaGJveCB0byAwcHR7fSBcY2hhcHBhZ2VyXGZpfQorCitcZGVmXHNldGNoYXB0ZXJuZXdwYWdlICMxIHtcY3NuYW1lIENIQVBQQUcjMVxlbmRjc25hbWV9CisKK1xkZWZcQ0hBUFBBR29mZnslCitcZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCitcZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwYnJlYWsKK1xnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwcGFnZXJ9CisKK1xkZWZcQ0hBUFBBR29ueyUKK1xnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKK1xnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBwYWdlcgorXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBwYWdlcgorXGdsb2JhbFxkZWZcSEVBRElOR1NvbntcSEVBRElOR1NzaW5nbGV9fQorCitcZGVmXENIQVBQQUdvZGR7JQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCitcZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwb2RkcGFnZQorXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBvZGRwYWdlCitcZ2xvYmFsXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU2RvdWJsZX19CisKK1xDSEFQUEFHb24KKworJSBDaGFwdGVyIG9wZW5pbmcuCislCislICMxIGlzIHRoZSB0ZXh0LCAjMiBpcyB0aGUgc2VjdGlvbiB0eXBlIChZbnVtYmVyZWQsIFlub3RoaW5nLAorJSBZYXBwZW5kaXgsIFlvbWl0ZnJvbXRvYyksICMzIHRoZSBjaGFwdGVyIG51bWJlci4KKyUKKyUgVG8gdGVzdCBhZ2FpbnN0IG91ciBhcmd1bWVudC4KK1xkZWZcWW5vdGhpbmdrZXl3b3Jke1lub3RoaW5nfQorXGRlZlxZb21pdGZyb210b2NrZXl3b3Jke1lvbWl0ZnJvbXRvY30KK1xkZWZcWWFwcGVuZGl4a2V5d29yZHtZYXBwZW5kaXh9CislCitcZGVmXGNoYXBtYWNybyMxIzIjM3slCisgIFxwY2hhcHNlcG1hY3JvCisgIHslCisgICAgXGNoYXBmb250cyBccm0KKyAgICAlCisgICAgJSBIYXZlIHRvIGRlZmluZSBcdGhpc3NlY3Rpb24gYmVmb3JlIGNhbGxpbmcgXGRvbm9kZXJlZiwgYmVjYXVzZSB0aGUKKyAgICAlIHhyZWYgY29kZSBldmVudHVhbGx5IHVzZXMgaXQuICBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaGFzIHRvIGJlIGNhbGxlZAorICAgICUgYWZ0ZXIgXHBjaGFwc2VwbWFjcm8sIG9yIHRoZSBoZWFkbGluZSB3aWxsIGNoYW5nZSB0b28gc29vbi4KKyAgICBcZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCisgICAgXGdkZWZcdGhpc2NoYXB0ZXJuYW1leyMxfSUKKyAgICAlCisgICAgJSBPbmx5IGluc2VydCB0aGUgc2VwYXJhdGluZyBzcGFjZSBpZiB3ZSBoYXZlIGEgY2hhcHRlci9hcHBlbmRpeAorICAgICUgbnVtYmVyLCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHVubnVtYmVyZWQgYGBudW1iZXInJy4KKyAgICBcZGVmXHRlbXB0eXBleyMyfSUKKyAgICBcaWZ4XHRlbXB0eXBlXFlub3RoaW5na2V5d29yZAorICAgICAgXHNldGJveDAgPSBcaGJveHt9JQorICAgICAgXGRlZlx0b2N0eXBle3VubmNoYXB9JQorICAgICAgXGdkZWZcdGhpc2NoYXB0ZXJ7IzF9JQorICAgIFxlbHNlXGlmeFx0ZW1wdHlwZVxZb21pdGZyb210b2NrZXl3b3JkCisgICAgICBcc2V0Ym94MCA9IFxoYm94e30lIGNvbnRlbnRzIGxpa2UgdW5udW1iZXJlZCwgYnV0IG5vIHRvYyBlbnRyeQorICAgICAgXGRlZlx0b2N0eXBle29taXR9JQorICAgICAgXGdkZWZcdGhpc2NoYXB0ZXJ7fSUKKyAgICBcZWxzZVxpZnhcdGVtcHR5cGVcWWFwcGVuZGl4a2V5d29yZAorICAgICAgXHNldGJveDAgPSBcaGJveHtccHV0d29yZEFwcGVuZGl4e30gIzNcZW5zcGFjZX0lCisgICAgICBcZGVmXHRvY3R5cGV7YXBwfSUKKyAgICAgICUgV2UgZG9uJ3Qgc3Vic3RpdHV0ZSB0aGUgYWN0dWFsIGNoYXB0ZXIgbmFtZSBpbnRvIFx0aGlzY2hhcHRlcgorICAgICAgJSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgaXRzIG1hY3JvcyBldmFsdWF0ZWQgbm93LiAgQW5kIHdlIGRvbid0CisgICAgICAlIHVzZSBcdGhpc3NlY3Rpb24gYmVjYXVzZSB0aGF0IGNoYW5nZXMgd2l0aCBlYWNoIHNlY3Rpb24uCisgICAgICAlCisgICAgICBceGRlZlx0aGlzY2hhcHRlcntccHV0d29yZEFwcGVuZGl4e30gXGFwcGVuZGl4bGV0dGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCisgICAgXGVsc2UKKyAgICAgIFxzZXRib3gwID0gXGhib3h7IzNcZW5zcGFjZX0lCisgICAgICBcZGVmXHRvY3R5cGV7bnVtY2hhcH0lCisgICAgICBceGRlZlx0aGlzY2hhcHRlcntccHV0d29yZENoYXB0ZXJ7fSBcdGhlXGNoYXBubzoKKyAgICAgICAgICAgICAgICAgICAgICAgIFxub2V4cGFuZFx0aGlzY2hhcHRlcm5hbWV9JQorICAgIFxmaVxmaVxmaQorICAgICUKKyAgICAlIFdyaXRlIHRoZSB0b2MgZW50cnkgZm9yIHRoaXMgY2hhcHRlci4gIE11c3QgY29tZSBiZWZvcmUgdGhlCisgICAgJSBcZG9ub2RlcmVmLCBiZWNhdXNlIHdlIGluY2x1ZGUgdGhlIGN1cnJlbnQgbm9kZSBuYW1lIGluIHRoZSB0b2MKKyAgICAlIGVudHJ5LCBhbmQgXGRvbm9kZXJlZiByZXNldHMgaXQgdG8gZW1wdHkuCisgICAgXHdyaXRldG9jZW50cnl7XHRvY3R5cGV9eyMxfXsjM30lCisgICAgJQorICAgICUgRm9yIHBkZnRleCwgd2UgaGF2ZSB0byB3cml0ZSBvdXQgdGhlIG5vZGUgZGVmaW5pdGlvbiAoYWthLCBtYWtlCisgICAgJSB0aGUgcGRmZGVzdCkgYWZ0ZXIgYW55IHBhZ2UgYnJlYWssIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0ZXh0IGhhcworICAgICUgYmVlbiB0eXBlc2V0LiAgSWYgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgcGRmIG91dGxpbmUgaXMgYWZ0ZXIgdGhlCisgICAgJSB0ZXh0LCB0aGVuIGp1bXBpbmcgZnJvbSB0aGUgb3V0bGluZSBtYXkgd2luZCB1cCB3aXRoIHRoZSB0ZXh0IG5vdAorICAgICUgYmVpbmcgdmlzaWJsZSwgZm9yIGluc3RhbmNlIHVuZGVyIGhpZ2ggbWFnbmlmaWNhdGlvbi4KKyAgICBcZG9ub2RlcmVmeyMyfSUKKyAgICAlCisgICAgJSBUeXBlc2V0IHRoZSBhY3R1YWwgaGVhZGluZy4KKyAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHJhZ2dlZHJpZ2h0CisgICAgICAgICAgXGhhbmdpbmRlbnQ9XHdkMCBcY2VudGVycGFyYW1ldGVyc21heWJlCisgICAgICAgICAgXHVuaGJveDAgIzFccGFyfSUKKyAgfSUKKyAgXG5vYnJlYWtcYmlnc2tpcCAlIG5vIHBhZ2UgYnJlYWsgYWZ0ZXIgYSBjaGFwdGVyIHRpdGxlCisgIFxub2JyZWFrCit9CisKKyUgQGNlbnRlcmNoYXAgLS0gY2VudGVyZWQgYW5kIHVubnVtYmVyZWQuCitcbGV0XGNlbnRlcnBhcmFtZXRlcnNtYXliZSA9IFxyZWxheAorXGRlZlxjZW50ZXJwYXJhbWV0ZXJzeyUKKyAgXGFkdmFuY2VccmlnaHRza2lwIGJ5IDNccmlnaHRza2lwCisgIFxsZWZ0c2tpcCA9IFxyaWdodHNraXAKKyAgXHBhcmZpbGxza2lwID0gMHB0Cit9CisKKworJSBJIGRvbid0IHRoaW5rIHRoaXMgY2hhcHRlciBzdHlsZSBpcyBzdXBwb3J0ZWQgYW55IG1vcmUsIHNvIEknbSBub3QKKyUgdXBkYXRpbmcgaXQgd2l0aCB0aGUgbmV3IG5vZGVyZWYgc3R1ZmYuICBXZSdsbCBzZWUuICAtLWthcmwsIDExYXVnMDMuCislCitcZGVmXHNldGNoYXB0ZXJzdHlsZSAjMSB7XGNzbmFtZSBDSEFQRiMxXGVuZGNzbmFtZX0KKyUKK1xkZWZcdW5uY2hmb3BlbiAjMXslCitcY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHRccmFnZ2VkcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKK30KK1xkZWZcY2hmb3BlbiAjMSMye1xjaGFwb2RkcGFnZSB7XGNoYXBmb250cworXHZib3ggdG8gM2lue1x2ZmlsIFxoYm94IHRvXGhzaXple1xoZmlsICMyfSBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMX0gXHZmaWx9fSUKK1xwYXJccGVuYWx0eSA1MDAwICUKK30KK1xkZWZcY2VudGVyY2hmb3BlbiAjMXslCitcY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHQKKyAgICAgICAgICAgICAgICAgICAgICAgXGhmaWxsIHtccm0gIzF9XGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKK30KK1xkZWZcQ0hBUEZvcGVueyUKKyAgXGdsb2JhbFxsZXRcY2hhcG1hY3JvPVxjaGZvcGVuCisgIFxnbG9iYWxcbGV0XGNlbnRlcmNoYXBtYWNybz1cY2VudGVyY2hmb3Blbn0KKworCislIFNlY3Rpb24gdGl0bGVzLiAgVGhlc2UgbWFjcm9zIGNvbWJpbmUgdGhlIHNlY3Rpb24gbnVtYmVyIHBhcnRzIGFuZAorJSBjYWxsIHRoZSBnZW5lcmljIFxzZWN0aW9uaGVhZGluZyB0byBkbyB0aGUgcHJpbnRpbmcuCislCitcbmV3c2tpcFxzZWNoZWFkaW5nc2tpcAorXGRlZlxzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHNlY2hlYWRpbmdza2lwey0xMDAwfX0KKworJSBTdWJzZWN0aW9uIHRpdGxlcy4KK1xuZXdza2lwXHN1YnNlY2hlYWRpbmdza2lwCitcZGVmXHN1YnNlY2hlYWRpbmdicmVha3tcZG9icmVhayBcc3Vic2VjaGVhZGluZ3NraXB7LTUwMH19CisKKyUgU3Vic3Vic2VjdGlvbiB0aXRsZXMuCitcZGVmXHN1YnN1YnNlY2hlYWRpbmdza2lwe1xzdWJzZWNoZWFkaW5nc2tpcH0KK1xkZWZcc3Vic3Vic2VjaGVhZGluZ2JyZWFre1xzdWJzZWNoZWFkaW5nYnJlYWt9CisKKworJSBQcmludCBhbnkgc2l6ZSwgYW55IHR5cGUsIHNlY3Rpb24gdGl0bGUuCislCislICMxIGlzIHRoZSB0ZXh0LCAjMiBpcyB0aGUgc2VjdGlvbiBsZXZlbCAoc2VjL3N1YnNlYy9zdWJzdWJzZWMpLCAjMyBpcworJSB0aGUgc2VjdGlvbiB0eXBlIGZvciB4cmVmcyAoWW51bWJlcmVkLCBZbm90aGluZywgWWFwcGVuZGl4KSwgIzQgaXMgdGhlCislIHNlY3Rpb24gbnVtYmVyLgorJQorXGRlZlxzZWN0aW9uaGVhZGluZyMxIzIjMyM0eyUKKyAgeyUKKyAgICAlIFN3aXRjaCB0byB0aGUgcmlnaHQgc2V0IG9mIGZvbnRzLgorICAgIFxjc25hbWUgIzJmb250c1xlbmRjc25hbWUgXHJtCisgICAgJQorICAgICUgSW5zZXJ0IHNwYWNlIGFib3ZlIHRoZSBoZWFkaW5nLgorICAgIFxjc25hbWUgIzJoZWFkaW5nYnJlYWtcZW5kY3NuYW1lCisgICAgJQorICAgICUgT25seSBpbnNlcnQgdGhlIHNwYWNlIGFmdGVyIHRoZSBudW1iZXIgaWYgd2UgaGF2ZSBhIHNlY3Rpb24gbnVtYmVyLgorICAgIFxkZWZcc2VjdGlvbmxldmVseyMyfSUKKyAgICBcZGVmXHRlbXB0eXBleyMzfSUKKyAgICAlCisgICAgXGlmeFx0ZW1wdHlwZVxZbm90aGluZ2tleXdvcmQKKyAgICAgIFxzZXRib3gwID0gXGhib3h7fSUKKyAgICAgIFxkZWZcdG9jdHlwZXt1bm59JQorICAgICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQorICAgIFxlbHNlXGlmeFx0ZW1wdHlwZVxZb21pdGZyb210b2NrZXl3b3JkCisgICAgICAlIGZvciBAaGVhZGluZ3MgLS0gbm8gc2VjdGlvbiBudW1iZXIsIGRvbid0IGluY2x1ZGUgaW4gdG9jLAorICAgICAgJSBhbmQgZG9uJ3QgcmVkZWZpbmUgXHRoaXNzZWN0aW9uLgorICAgICAgXHNldGJveDAgPSBcaGJveHt9JQorICAgICAgXGRlZlx0b2N0eXBle29taXR9JQorICAgICAgXGxldFxzZWN0aW9ubGV2ZWw9XGVtcHR5CisgICAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlhcHBlbmRpeGtleXdvcmQKKyAgICAgIFxzZXRib3gwID0gXGhib3h7IzRcZW5zcGFjZX0lCisgICAgICBcZGVmXHRvY3R5cGV7YXBwfSUKKyAgICAgIFxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKKyAgICBcZWxzZQorICAgICAgXHNldGJveDAgPSBcaGJveHsjNFxlbnNwYWNlfSUKKyAgICAgIFxkZWZcdG9jdHlwZXtudW19JQorICAgICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQorICAgIFxmaVxmaVxmaQorICAgICUKKyAgICAlIFdyaXRlIHRoZSB0b2MgZW50cnkgKGJlZm9yZSBcZG9ub2RlcmVmKS4gIFNlZSBjb21tZW50cyBpbiBcY2hmcGxhaW4uCisgICAgXHdyaXRldG9jZW50cnl7XHRvY3R5cGVcc2VjdGlvbmxldmVsfXsjMX17IzR9JQorICAgICUKKyAgICAlIFdyaXRlIHRoZSBub2RlIHJlZmVyZW5jZSAoPSBwZGYgZGVzdGluYXRpb24gZm9yIHBkZnRleCkuCisgICAgJSBBZ2Fpbiwgc2VlIGNvbW1lbnRzIGluIFxjaGZwbGFpbi4KKyAgICBcZG9ub2RlcmVmeyMzfSUKKyAgICAlCisgICAgJSBPdXRwdXQgdGhlIGFjdHVhbCBzZWN0aW9uIGhlYWRpbmcuCisgICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAorICAgICAgICAgIFxoYW5naW5kZW50PVx3ZDAgICUgemVybyBpZiBubyBzZWN0aW9uIG51bWJlcgorICAgICAgICAgIFx1bmhib3gwICMxfSUKKyAgfSUKKyAgJSBBZGQgZXh0cmEgc3BhY2UgYWZ0ZXIgdGhlIGhlYWRpbmcgLS0gaGFsZiBvZiB3aGF0ZXZlciBjYW1lIGFib3ZlIGl0LgorICAlIERvbid0IGFsbG93IHN0cmV0Y2gsIHRob3VnaC4KKyAgXGtlcm4gLjUgXGNzbmFtZSAjMmhlYWRpbmdza2lwXGVuZGNzbmFtZQorICAlCisgICUgRG8gbm90IGxldCB0aGUga2VybiBiZSBhIHBvdGVudGlhbCBicmVha3BvaW50LCBhcyBpdCB3b3VsZCBiZSBpZiBpdAorICAlIHdhcyBmb2xsb3dlZCBieSBnbHVlLgorICBcbm9icmVhaworICAlCisgICUgV2UnbGwgYWxtb3N0IGNlcnRhaW5seSBzdGFydCBhIHBhcmFncmFwaCBuZXh0LCBzbyBkb24ndCBsZXQgdGhhdAorICAlIGdsdWUgYWNjdW11bGF0ZS4gIChOb3QgYSBicmVha3BvaW50IGJlY2F1c2UgaXQncyBwcmVjZWRlZCBieSBhCisgICUgZGlzY2FyZGFibGUgaXRlbS4pCisgIFx2c2tpcC1ccGFyc2tpcAorICAlIAorICAlIFRoaXMgaXMgcHVyZWx5IHNvIHRoZSBsYXN0IGl0ZW0gb24gdGhlIGxpc3QgaXMgYSBrbm93biBccGVuYWx0eSA+CisgICUgMTAwMDAuICBUaGlzIGlzIHNvIFxzdGFydGRlZnVuIGNhbiBhdm9pZCBhbGxvd2luZyBicmVha3BvaW50cyBhZnRlcgorICAlIHNlY3Rpb24gaGVhZGluZ3MuICBPdGhlcndpc2UsIGl0IHdvdWxkIGluc2VydCBhIHZhbGlkIGJyZWFrcG9pbnQgYmV0d2VlbjoKKyAgJSAKKyAgJSAgIEBzZWN0aW9uIHNlYy13aGF0ZXZlcgorICAlICAgQGRlZmZuIGRlZi13aGF0ZXZlcgorICBccGVuYWx0eSAxMDAwMQorfQorCisKK1xtZXNzYWdle3RvYyx9CislIFRhYmxlIG9mIGNvbnRlbnRzLgorXG5ld3dyaXRlXHRvY2ZpbGUKKworJSBXcml0ZSBhbiBlbnRyeSB0byB0aGUgdG9jIGZpbGUsIG9wZW5pbmcgaXQgaWYgbmVjZXNzYXJ5LgorJSBDYWxsZWQgZnJvbSBAY2hhcHRlciwgZXRjLgorJQorJSBFeGFtcGxlIHVzYWdlOiBcd3JpdGV0b2NlbnRyeXtzZWN9e1NlY3Rpb24gTmFtZX17XHRoZVxjaGFwbm8uXHRoZVxzZWNub30KKyUgV2UgYXBwZW5kIHRoZSBjdXJyZW50IG5vZGUgbmFtZSAoaWYgYW55KSBhbmQgcGFnZSBudW1iZXIgYXMgYWRkaXRpb25hbAorJSBhcmd1bWVudHMgZm9yIHRoZSBce2NoYXAsc2VjLC4uLn1lbnRyeSBtYWNyb3Mgd2hpY2ggd2lsbCBldmVudHVhbGx5CislIHJlYWQgdGhpcy4gIFRoZSBub2RlIG5hbWUgaXMgdXNlZCBpbiB0aGUgcGRmIG91dGxpbmVzIGFzIHRoZQorJSBkZXN0aW5hdGlvbiB0byBqdW1wIHRvLgorJQorJSBXZSBvcGVuIHRoZSAudG9jIGZpbGUgZm9yIHdyaXRpbmcgaGVyZSBpbnN0ZWFkIG9mIGF0IEBzZXRmaWxlbmFtZSAob3IKKyUgYW55IG90aGVyIGZpeGVkIHRpbWUpIHNvIHRoYXQgQGNvbnRlbnRzIGNhbiBiZSBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQuCislIEJ1dCBpZiAjMSBpcyBgb21pdCcsIHRoZW4gd2UgZG9uJ3QgZG8gYW55dGhpbmcuICBUaGlzIGlzIHVzZWQgZm9yIHRoZQorJSB0YWJsZSBvZiBjb250ZW50cyBjaGFwdGVyIG9wZW5pbmdzIHRoZW1zZWx2ZXMuCislCitcbmV3aWZcaWZ0b2NmaWxlb3BlbmVkCitcZGVmXG9taXRrZXl3b3Jke29taXR9JQorJQorXGRlZlx3cml0ZXRvY2VudHJ5IzEjMiMzeyUKKyAgXGVkZWZcd3JpdGV0b2N0eXBleyMxfSUKKyAgXGlmeFx3cml0ZXRvY3R5cGVcb21pdGtleXdvcmQgXGVsc2UKKyAgICBcaWZ0b2NmaWxlb3BlbmVkXGVsc2UKKyAgICAgIFxpbW1lZGlhdGVcb3Blbm91dFx0b2NmaWxlID0gXGpvYm5hbWUudG9jCisgICAgICBcZ2xvYmFsXHRvY2ZpbGVvcGVuZWR0cnVlCisgICAgXGZpCisgICAgJQorICAgIFxpZmxpbmtzCisgICAgICB7XGF0ZHVtbWllcworICAgICAgIFxlZGVmXHRlbXB7JQorICAgICAgICAgXHdyaXRlXHRvY2ZpbGV7QCMxZW50cnl7IzJ9eyMzfXtcbGFzdG5vZGV9e1xub2V4cGFuZFxmb2xpb319fSUKKyAgICAgICBcdGVtcAorICAgICAgfQorICAgIFxmaQorICBcZmkKKyAgJQorICAlIFRlbGwgXHNoaXBvdXQgdG8gY3JlYXRlIGEgcGRmIGRlc3RpbmF0aW9uIG9uIGVhY2ggcGFnZSwgaWYgd2UncmUKKyAgJSB3cml0aW5nIHBkZi4gIFRoZXNlIGFyZSB1c2VkIGluIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIFdlIGNhbid0CisgICUganVzdCB3cml0ZSBvbmUgb24gZXZlcnkgcGFnZSBiZWNhdXNlIHRoZSB0aXRsZSBwYWdlcyBhcmUgbnVtYmVyZWQKKyAgJSAxIGFuZCAyICh0aGUgcGFnZSBudW1iZXJzIGFyZW4ndCBwcmludGVkKSwgYW5kIHNvIGFyZSB0aGUgZmlyc3QKKyAgJSB0d28gcGFnZXMgb2YgdGhlIGRvY3VtZW50LiAgVGh1cywgd2UnZCBoYXZlIHR3byBkZXN0aW5hdGlvbnMgbmFtZWQKKyAgJSBgMScsIGFuZCB0d28gbmFtZWQgYDInLgorICBcaWZwZGYgXGdsb2JhbFxwZGZtYWtlcGFnZWRlc3R0cnVlIFxmaQorfQorCisKKyUgVGhlc2UgY2hhcmFjdGVycyBkbyBub3QgcHJpbnQgcHJvcGVybHkgaW4gdGhlIENvbXB1dGVyIE1vZGVybiByb21hbgorJSBmb250cywgc28gd2UgbXVzdCB0YWtlIHNwZWNpYWwgY2FyZS4gIFRoaXMgaXMgbW9yZSBvciBsZXNzIHJlZHVuZGFudAorJSB3aXRoIHRoZSBUZXhpbmZvIGlucHV0IGZvcm1hdCBzZXR1cCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyUgCitcZGVmXGFjdGl2ZWNhdGNvZGVzeyUKKyAgXGNhdGNvZGVgXCI9XGFjdGl2ZQorICBcY2F0Y29kZWBcJD1cYWN0aXZlCisgIFxjYXRjb2RlYFw8PVxhY3RpdmUKKyAgXGNhdGNvZGVgXD49XGFjdGl2ZQorICBcY2F0Y29kZWBcXD1cYWN0aXZlCisgIFxjYXRjb2RlYFxePVxhY3RpdmUKKyAgXGNhdGNvZGVgXF89XGFjdGl2ZQorICBcY2F0Y29kZWBcfD1cYWN0aXZlCisgIFxjYXRjb2RlYFx+PVxhY3RpdmUKK30KKworCislIFJlYWQgdGhlIHRvYyBmaWxlLCB3aGljaCBpcyBlc3NlbnRpYWxseSBUZXhpbmZvIGlucHV0LgorXGRlZlxyZWFkdG9jZmlsZXslCisgIFxzZXR1cGRhdGFmaWxlCisgIFxhY3RpdmVjYXRjb2RlcworICBcaW5wdXQgXGpvYm5hbWUudG9jCit9CisKK1xuZXdza2lwXGNvbnRlbnRzcmlnaHRtYXJnaW4gXGNvbnRlbnRzcmlnaHRtYXJnaW49MWluCitcbmV3Y291bnRcc2F2ZXBhZ2VubworXG5ld2NvdW50XGxhc3RuZWdhdGl2ZXBhZ2VubyBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gLTEKKworJSBQcmVwYXJlIHRvIHJlYWQgd2hhdCB3ZSd2ZSB3cml0dGVuIHRvIFx0b2NmaWxlLgorJQorXGRlZlxzdGFydGNvbnRlbnRzIzF7JQorICAlIElmIEBzZXRjaGFwdGVybmV3cGFnZSBvbiwgYW5kIEBoZWFkaW5ncyBkb3VibGUsIHRoZSBjb250ZW50cyBzaG91bGQKKyAgJSBzdGFydCBvbiBhbiBvZGQgcGFnZSwgdW5saWtlIGNoYXB0ZXJzLiAgVGh1cywgd2UgbWFpbnRhaW4KKyAgJSBcY29udGVudHNhbGlnbm1hY3JvIGluIHBhcmFsbGVsIHdpdGggXHBhZ2VhbGlnbm1hY3JvLgorICAlIEZyb206IFRvcmJqb3JuIEdyYW5sdW5kIDx0ZWdlQG1hdGVtYXRpay5zdS5zZT4KKyAgXGNvbnRlbnRzYWxpZ25tYWNybworICBcaW1tZWRpYXRlXGNsb3Nlb3V0XHRvY2ZpbGUKKyAgJQorICAlIERvbid0IG5lZWQgdG8gcHV0IGBDb250ZW50cycgb3IgYFNob3J0IENvbnRlbnRzJyBpbiB0aGUgaGVhZGxpbmUuCisgICUgSXQgaXMgYWJ1bmRhbnRseSBjbGVhciB3aGF0IHRoZXkgYXJlLgorICBcZGVmXHRoaXNjaGFwdGVye30lCisgIFxjaGFwbWFjcm97IzF9e1lvbWl0ZnJvbXRvY317fSUKKyAgJQorICBcc2F2ZXBhZ2VubyA9IFxwYWdlbm8KKyAgXGJlZ2luZ3JvdXAgICAgICAgICAgICAgICAgICAlIFNldCB1cCB0byBoYW5kbGUgY29udGVudHMgZmlsZXMgcHJvcGVybHkuCisgICAgXHJhZ2dlZGJvdHRvbSAgICAgICAgICAgICAgJSBXb3JyeSBtb3JlIGFib3V0IGJyZWFrcG9pbnRzIHRoYW4gdGhlIGJvdHRvbS4KKyAgICBcYWR2YW5jZVxoc2l6ZSBieSAtXGNvbnRlbnRzcmlnaHRtYXJnaW4gJSBEb24ndCB1c2UgdGhlIGZ1bGwgbGluZSBsZW5ndGguCisgICAgJQorICAgICUgUm9tYW4gbnVtZXJhbHMgZm9yIHBhZ2UgbnVtYmVycy4KKyAgICBcaWZudW0gXHBhZ2Vubz4wIFxnbG9iYWxccGFnZW5vID0gXGxhc3RuZWdhdGl2ZXBhZ2VubyBcZmkKK30KKworCislIE5vcm1hbCAobG9uZykgdG9jLgorXGRlZlxjb250ZW50c3slCisgIFxzdGFydGNvbnRlbnRze1xwdXR3b3JkVE9DfSUKKyAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCisgICAgXGlmZW9mIDEgXGVsc2UKKyAgICAgIFxyZWFkdG9jZmlsZQorICAgIFxmaQorICAgIFx2ZmlsbCBcZWplY3QKKyAgICBcY29udGVudHNhbGlnbm1hY3JvICUgaW4gY2FzZSBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkIGlzIGluIGVmZmVjdAorICAgIFxpZmVvZiAxIFxlbHNlCisgICAgICBccGRmbWFrZW91dGxpbmVzCisgICAgXGZpCisgICAgXGNsb3NlaW4gMQorICBcZW5kZ3JvdXAKKyAgXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IFxwYWdlbm8KKyAgXGdsb2JhbFxwYWdlbm8gPSBcc2F2ZXBhZ2VubworfQorCislIEFuZCBqdXN0IHRoZSBjaGFwdGVycy4KK1xkZWZcc3VtbWFyeWNvbnRlbnRzeyUKKyAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRTaG9ydFRPQ30lCisgICAgJQorICAgIFxsZXRcbnVtY2hhcGVudHJ5ID0gXHNob3J0Y2hhcGVudHJ5CisgICAgXGxldFxhcHBlbnRyeSA9IFxzaG9ydGNoYXBlbnRyeQorICAgIFxsZXRcdW5uY2hhcGVudHJ5ID0gXHNob3J0dW5uY2hhcGVudHJ5CisgICAgJSBXZSB3YW50IGEgdHJ1ZSByb21hbiBoZXJlIGZvciB0aGUgcGFnZSBudW1iZXJzLgorICAgIFxzZWNmb250cworICAgIFxsZXRccm09XHNob3J0Y29udHJtIFxsZXRcYmY9XHNob3J0Y29udGJmCisgICAgXGxldFxzbD1cc2hvcnRjb250c2wgXGxldFx0dD1cc2hvcnRjb250dHQKKyAgICBccm0KKyAgICBcaHlwaGVucGVuYWx0eSA9IDEwMDAwCisgICAgXGFkdmFuY2VcYmFzZWxpbmVza2lwIGJ5IDFwdCAlIE9wZW4gaXQgdXAgYSBsaXR0bGUuCisgICAgXGRlZlxudW1zZWNlbnRyeSMjMSMjMiMjMyMjNHt9CisgICAgXGxldFxhcHBzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcdW5uc2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XG51bXN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFxhcHBzdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcdW5uc3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XG51bXN1YnN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFxhcHBzdWJzdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcdW5uc3Vic3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCisgICAgXGlmZW9mIDEgXGVsc2UKKyAgICAgIFxyZWFkdG9jZmlsZQorICAgIFxmaQorICAgIFxjbG9zZWluIDEKKyAgICBcdmZpbGwgXGVqZWN0CisgICAgXGNvbnRlbnRzYWxpZ25tYWNybyAlIGluIGNhc2UgQHNldGNoYXB0ZXJuZXdwYWdlIG9kZCBpcyBpbiBlZmZlY3QKKyAgXGVuZGdyb3VwCisgIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSBccGFnZW5vCisgIFxnbG9iYWxccGFnZW5vID0gXHNhdmVwYWdlbm8KK30KK1xsZXRcc2hvcnRjb250ZW50cyA9IFxzdW1tYXJ5Y29udGVudHMKKworJSBUeXBlc2V0IHRoZSBsYWJlbCBmb3IgYSBjaGFwdGVyIG9yIGFwcGVuZGl4IGZvciB0aGUgc2hvcnQgY29udGVudHMuCislIFRoZSBhcmcgaXMsIGUuZy4sIGBBJyBmb3IgYW4gYXBwZW5kaXgsIG9yIGAzJyBmb3IgYSBjaGFwdGVyLgorJQorXGRlZlxzaG9ydGNoYXBsYWJlbCMxeyUKKyAgJSBUaGlzIHNwYWNlIHNob3VsZCBiZSBlbm91Z2gsIHNpbmNlIGEgc2luZ2xlIG51bWJlciBpcyAuNWVtLCBhbmQgdGhlCisgICUgd2lkZXN0IGxldHRlciAoTSkgaXMgMWVtLCBhdCBsZWFzdCBpbiB0aGUgQ29tcHV0ZXIgTW9kZXJuIGZvbnRzLgorICAlIEJ1dCB1c2UgXGhzcyBqdXN0IGluIGNhc2UuCisgICUgKFRoaXMgc3BhY2UgZG9lc24ndCBpbmNsdWRlIHRoZSBleHRyYSBzcGFjZSB0aGF0IGdldHMgYWRkZWQgYWZ0ZXIKKyAgJSB0aGUgbGFiZWw7IHRoYXQgZ2V0cyBwdXQgaW4gYnkgXHNob3J0Y2hhcGVudHJ5IGFib3ZlLikKKyAgJQorICAlIFdlJ2QgbGlrZSB0byByaWdodC1qdXN0aWZ5IGNoYXB0ZXIgbnVtYmVycywgYnV0IHRoYXQgbG9va3Mgc3RyYW5nZQorICAlIHdpdGggYXBwZW5kaXggbGV0dGVycy4gIEFuZCByaWdodC1qdXN0aWZ5aW5nIG51bWJlcnMgYW5kCisgICUgbGVmdC1qdXN0aWZ5aW5nIGxldHRlcnMgbG9va3Mgc3RyYW5nZSB3aGVuIHRoZXJlIGlzIGxlc3MgdGhhbiAxMAorICAlIGNoYXB0ZXJzLiAgSGF2ZSB0byByZWFkIHRoZSB3aG9sZSB0b2Mgb25jZSB0byBrbm93IGhvdyBtYW55IGNoYXB0ZXJzCisgICUgdGhlcmUgYXJlIGJlZm9yZSBkZWNpZGluZyAuLi4KKyAgXGhib3ggdG8gMWVteyMxXGhzc30lCit9CisKKyUgVGhlc2UgbWFjcm9zIGdlbmVyYXRlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgdGFibGUgb2YgY29udGVudHMuCislIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY2hhcHRlciBvciBzZWN0aW9uIG5hbWUuCislIFRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBwYWdlIG51bWJlci4KKyUgVGhlIGFyZ3VtZW50cyBpbiBiZXR3ZWVuIGFyZSB0aGUgY2hhcHRlciBudW1iZXIsIHNlY3Rpb24gbnVtYmVyLCAuLi4KKworJSBDaGFwdGVycywgaW4gdGhlIG1haW4gY29udGVudHMuCitcZGVmXG51bWNoYXBlbnRyeSMxIzIjMyM0e1xkb2NoYXBlbnRyeXsjMlxsYWJlbHNwYWNlIzF9eyM0fX0KKyUKKyUgQ2hhcHRlcnMsIGluIHRoZSBzaG9ydCB0b2MuCislIFNlZSBjb21tZW50cyBpbiBcZG9jaGFwZW50cnkgcmUgdmJveCBhbmQgcmVsYXRlZCBzZXR0aW5ncy4KK1xkZWZcc2hvcnRjaGFwZW50cnkjMSMyIzMjNHslCisgIFx0b2NlbnRyeXtcc2hvcnRjaGFwbGFiZWx7IzJ9XGxhYmVsc3BhY2UgIzF9e1xkb3Nob3J0cGFnZW5vXGJncm91cCM0XGVncm91cH0lCit9CisKKyUgQXBwZW5kaWNlcywgaW4gdGhlIG1haW4gY29udGVudHMuCislIE5lZWQgdGhlIHdvcmQgQXBwZW5kaXgsIGFuZCBhIGZpeGVkLXNpemUgYm94LgorJQorXGRlZlxhcHBlbmRpeGJveCMxeyUKKyAgJSBXZSB1c2UgTSBzaW5jZSBpdCdzIHByb2JhYmx5IHRoZSB3aWRlc3QgbGV0dGVyLgorICBcc2V0Ym94MCA9IFxoYm94e1xwdXR3b3JkQXBwZW5kaXh7fSBNfSUKKyAgXGhib3ggdG8gXHdkMHtccHV0d29yZEFwcGVuZGl4e30gIzFcaHNzfX0KKyUKK1xkZWZcYXBwZW50cnkjMSMyIzMjNHtcZG9jaGFwZW50cnl7XGFwcGVuZGl4Ym94eyMyfVxsYWJlbHNwYWNlIzF9eyM0fX0KKworJSBVbm51bWJlcmVkIGNoYXB0ZXJzLgorXGRlZlx1bm5jaGFwZW50cnkjMSMyIzMjNHtcZG9jaGFwZW50cnl7IzF9eyM0fX0KK1xkZWZcc2hvcnR1bm5jaGFwZW50cnkjMSMyIzMjNHtcdG9jZW50cnl7IzF9e1xkb3Nob3J0cGFnZW5vXGJncm91cCM0XGVncm91cH19CisKKyUgU2VjdGlvbnMuCitcZGVmXG51bXNlY2VudHJ5IzEjMiMzIzR7XGRvc2VjZW50cnl7IzJcbGFiZWxzcGFjZSMxfXsjNH19CitcbGV0XGFwcHNlY2VudHJ5PVxudW1zZWNlbnRyeQorXGRlZlx1bm5zZWNlbnRyeSMxIzIjMyM0e1xkb3NlY2VudHJ5eyMxfXsjNH19CisKKyUgU3Vic2VjdGlvbnMuCitcZGVmXG51bXN1YnNlY2VudHJ5IzEjMiMzIzR7XGRvc3Vic2VjZW50cnl7IzJcbGFiZWxzcGFjZSMxfXsjNH19CitcbGV0XGFwcHN1YnNlY2VudHJ5PVxudW1zdWJzZWNlbnRyeQorXGRlZlx1bm5zdWJzZWNlbnRyeSMxIzIjMyM0e1xkb3N1YnNlY2VudHJ5eyMxfXsjNH19CisKKyUgQW5kIHN1YnN1YnNlY3Rpb25zLgorXGRlZlxudW1zdWJzdWJzZWNlbnRyeSMxIzIjMyM0e1xkb3N1YnN1YnNlY2VudHJ5eyMyXGxhYmVsc3BhY2UjMX17IzR9fQorXGxldFxhcHBzdWJzdWJzZWNlbnRyeT1cbnVtc3Vic3Vic2VjZW50cnkKK1xkZWZcdW5uc3Vic3Vic2VjZW50cnkjMSMyIzMjNHtcZG9zdWJzdWJzZWNlbnRyeXsjMX17IzR9fQorCislIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBsZXZlbHMuCislIFNhbWUgYXMgXGRlZmF1bHRwYXJpbmRlbnQuCitcbmV3ZGltZW5cdG9jaW5kZW50IFx0b2NpbmRlbnQgPSAxNXB0CisKKyUgTm93IGZvciB0aGUgYWN0dWFsIHR5cGVzZXR0aW5nLiBJbiBhbGwgdGhlc2UsICMxIGlzIHRoZSB0ZXh0IGFuZCAjMiBpcyB0aGUKKyUgcGFnZSBudW1iZXIuCislCislIElmIHRoZSB0b2MgaGFzIHRvIGJlIGJyb2tlbiBvdmVyIHBhZ2VzLCB3ZSB3YW50IGl0IHRvIGJlIGF0IGNoYXB0ZXJzCislIGlmIGF0IGFsbCBwb3NzaWJsZTsgaGVuY2UgdGhlIFxwZW5hbHR5LgorXGRlZlxkb2NoYXBlbnRyeSMxIzJ7JQorICAgXHBlbmFsdHktMzAwIFx2c2tpcDFcYmFzZWxpbmVza2lwIHBsdXMuMzNcYmFzZWxpbmVza2lwIG1pbnVzLjI1XGJhc2VsaW5lc2tpcAorICAgXGJlZ2luZ3JvdXAKKyAgICAgXGNoYXBlbnRyeWZvbnRzCisgICAgIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5vXGJncm91cCMyXGVncm91cH0lCisgICBcZW5kZ3JvdXAKKyAgIFxub2JyZWFrXHZza2lwIC4yNVxiYXNlbGluZXNraXAgcGx1cy4xXGJhc2VsaW5lc2tpcAorfQorCitcZGVmXGRvc2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCisgIFxzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD1cdG9jaW5kZW50CisgIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5vXGJncm91cCMyXGVncm91cH0lCitcZW5kZ3JvdXB9CisKK1xkZWZcZG9zdWJzZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKKyAgXHN1YnNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPTJcdG9jaW5kZW50CisgIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5vXGJncm91cCMyXGVncm91cH0lCitcZW5kZ3JvdXB9CisKK1xkZWZcZG9zdWJzdWJzZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKKyAgXHN1YnN1YnNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPTNcdG9jaW5kZW50CisgIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5vXGJncm91cCMyXGVncm91cH0lCitcZW5kZ3JvdXB9CisKKyUgV2UgdXNlIHRoZSBzYW1lIFxlbnRyeSBtYWNybyBhcyBmb3IgdGhlIGluZGV4IGVudHJpZXMuCitcbGV0XHRvY2VudHJ5ID0gXGVudHJ5CisKKyUgU3BhY2UgYmV0d2VlbiBjaGFwdGVyIChvciB3aGF0ZXZlcikgbnVtYmVyIGFuZCB0aGUgdGl0bGUuCitcZGVmXGxhYmVsc3BhY2V7XGhza2lwMWVtIFxyZWxheH0KKworXGRlZlxkb3BhZ2VubyMxe3tccm0gIzF9fQorXGRlZlxkb3Nob3J0cGFnZW5vIzF7e1xybSAjMX19CisKK1xkZWZcY2hhcGVudHJ5Zm9udHN7XHNlY2ZvbnRzIFxybX0KK1xkZWZcc2VjZW50cnlmb250c3tcdGV4dGZvbnRzfQorXGRlZlxzdWJzZWNlbnRyeWZvbnRze1x0ZXh0Zm9udHN9CitcZGVmXHN1YnN1YnNlY2VudHJ5Zm9udHN7XHRleHRmb250c30KKworCitcbWVzc2FnZXtlbnZpcm9ubWVudHMsfQorJSBAZm9vIC4uLiBAZW5kIGZvby4KKworJSBAcG9pbnR7fSwgQHJlc3VsdHt9LCBAZXhwYW5zaW9ue30sIEBwcmludHt9LCBAZXF1aXZ7fS4KKyUKKyUgU2luY2UgdGhlc2UgY2hhcmFjdGVycyBhcmUgdXNlZCBpbiBleGFtcGxlcywgaXQgc2hvdWxkIGJlIGFuIGV2ZW4gbnVtYmVyIG9mCislIFx0dCB3aWR0aHMuIEVhY2ggXHR0IGNoYXJhY3RlciBpcyAxZW4sIHNvIHR3byBtYWtlcyBpdCAxZW0uCislCitcZGVmXHBvaW50eyRcc3RhciR9CitcZGVmXHJlc3VsdHtcbGVhdmV2bW9kZVxyYWlzZS4xNWV4XGhib3ggdG8gMWVte1xoZmlsJFxSaWdodGFycm93JFxoZmlsfX0KK1xkZWZcZXhwYW5zaW9ue1xsZWF2ZXZtb2RlXHJhaXNlLjFleFxoYm94IHRvIDFlbXtcaGZpbCRcbWFwc3RvJFxoZmlsfX0KK1xkZWZccHJpbnR7XGxlYXZldm1vZGVcbG93ZXIuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxkYXNodiRcaGZpbH19CitcZGVmXGVxdWl2e1xsZWF2ZXZtb2RlXGxvd2VyLjFleFxoYm94IHRvIDFlbXtcaGZpbCRccHRleGVxdWl2JFxoZmlsfX0KKworJSBUaGUgQGVycm9ye30gY29tbWFuZC4KKyUgQWRhcHRlZCBmcm9tIHRoZSBUZVhib29rJ3MgXGJveGl0LgorJQorXG5ld2JveFxlcnJvcmJveAorJQore1x0ZW50dCBcZ2xvYmFsXGRpbWVuMCA9IDNlbX0lIFdpZHRoIG9mIHRoZSBib3guCitcZGltZW4yID0gLjU1cHQgJSBUaGlja25lc3Mgb2YgcnVsZXMKKyUgVGhlIHRleHQuIChgcicgaXMgb3BlbiBvbiB0aGUgcmlnaHQsIGBlJyBzb21ld2hhdCBsZXNzIHNvIG9uIHRoZSBsZWZ0LikKK1xzZXRib3gwID0gXGhib3h7XGtlcm4tLjc1cHQgXHRlbnNmIGVycm9yXGtlcm4tMS41cHR9CislCitcc2V0Ym94XGVycm9yYm94PVxoYm94IHRvIFxkaW1lbjB7XGhmaWwKKyAgIFxoc2l6ZSA9IFxkaW1lbjAgXGFkdmFuY2VcaHNpemUgYnkgLTUuOHB0ICUgU3BhY2UgdG8gbGVmdCtyaWdodC4KKyAgIFxhZHZhbmNlXGhzaXplIGJ5IC0yXGRpbWVuMiAlIFJ1bGVzLgorICAgXHZib3h7JQorICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjIKKyAgICAgIFxoYm94e1x2cnVsZSB3aWR0aFxkaW1lbjIgXGtlcm4zcHQgICAgICAgICAgJSBTcGFjZSB0byBsZWZ0IG9mIHRleHQuCisgICAgICAgICBcdnRvcHtca2VybjIuNHB0IFxib3gwIFxrZXJuMi40cHR9JSBTcGFjZSBhYm92ZS9iZWxvdy4KKyAgICAgICAgIFxrZXJuM3B0XHZydWxlIHdpZHRoXGRpbWVuMn0lIFNwYWNlIHRvIHJpZ2h0LgorICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjJ9CisgICAgXGhmaWx9CislCitcZGVmXGVycm9ye1xsZWF2ZXZtb2RlXGxvd2VyLjdleFxjb3B5XGVycm9yYm94fQorCislIEB0ZXggLi4uIEBlbmQgdGV4ICAgIGVzY2FwZXMgaW50byByYXcgVGV4IHRlbXBvcmFyaWx5LgorJSBPbmUgZXhjZXB0aW9uOiBAIGlzIHN0aWxsIGFuIGVzY2FwZSBjaGFyYWN0ZXIsIHNvIHRoYXQgQGVuZCB0ZXggd29ya3MuCislIEJ1dCBcQCBvciBAQCB3aWxsIGdldCBhIHBsYWluIHRleCBAIGNoYXJhY3Rlci4KKworXGVudmRlZlx0ZXh7JQorICBcY2F0Y29kZSBgXFw9MCBcY2F0Y29kZSBgXHs9MSBcY2F0Y29kZSBgXH09MgorICBcY2F0Y29kZSBgXCQ9MyBcY2F0Y29kZSBgXCY9NCBcY2F0Y29kZSBgXCM9NgorICBcY2F0Y29kZSBgXF49NyBcY2F0Y29kZSBgXF89OCBcY2F0Y29kZSBgXH49XGFjdGl2ZSBcbGV0fj1cdGllCisgIFxjYXRjb2RlIGBcJT0xNAorICBcY2F0Y29kZSBgXCs9XG90aGVyCisgIFxjYXRjb2RlIGBcIj1cb3RoZXIKKyAgXGNhdGNvZGUgYFx8PVxvdGhlcgorICBcY2F0Y29kZSBgXDw9XG90aGVyCisgIFxjYXRjb2RlIGBcPj1cb3RoZXIKKyAgXGVzY2FwZWNoYXI9YFxcCisgICUKKyAgXGxldFxiPVxwdGV4YgorICBcbGV0XGJ1bGxldD1ccHRleGJ1bGxldAorICBcbGV0XGM9XHB0ZXhjCisgIFxsZXRcLD1ccHRleGNvbW1hCisgIFxsZXRcLj1ccHRleGRvdAorICBcbGV0XGRvdHM9XHB0ZXhkb3RzCisgIFxsZXRcZXF1aXY9XHB0ZXhlcXVpdgorICBcbGV0XCE9XHB0ZXhleGNsYW0KKyAgXGxldFxpPVxwdGV4aQorICBcbGV0XGluZGVudD1ccHRleGluZGVudAorICBcbGV0XG5vaW5kZW50PVxwdGV4bm9pbmRlbnQKKyAgXGxldFx7PVxwdGV4bGJyYWNlCisgIFxsZXRcKz1cdGFiYWxpZ24KKyAgXGxldFx9PVxwdGV4cmJyYWNlCisgIFxsZXRcLz1ccHRleHNsYXNoCisgIFxsZXRcKj1ccHRleHN0YXIKKyAgXGxldFx0PVxwdGV4dAorICBcbGV0XGZyZW5jaHNwYWNpbmc9XHBsYWluZnJlbmNoc3BhY2luZworICAlCisgIFxkZWZcZW5kbGRvdHN7XG1hdGhpbm5lcntcbGRvdHNcbGRvdHNcbGRvdHNcbGRvdHN9fSUKKyAgXGRlZlxlbmRkb3Rze1xyZWxheFxpZm1tb2RlXGVuZGxkb3RzXGVsc2UkXG1hdGhzdXJyb3VuZD0wcHQgXGVuZGxkb3RzXCwkXGZpfSUKKyAgXGRlZlxAe0B9JQorfQorJSBUaGVyZSBpcyBubyBuZWVkIHRvIGRlZmluZSBcRXRleC4KKworJSBEZWZpbmUgQGxpc3AgLi4uIEBlbmQgbGlzcC4KKyUgQGxpc3AgZW52aXJvbm1lbnQgZm9ybXMgYSBncm91cCBzbyBpdCBjYW4gcmViaW5kIHRoaW5ncywKKyUgaW5jbHVkaW5nIHRoZSBkZWZpbml0aW9uIG9mIEBlbmQgbGlzcCAod2hpY2ggbm9ybWFsbHkgaXMgZXJyb25lb3VzKS4KKworJSBBbW91bnQgdG8gbmFycm93IHRoZSBtYXJnaW5zIGJ5IGZvciBAbGlzcC4KK1xuZXdza2lwXGxpc3BuYXJyb3dpbmcgXGxpc3BuYXJyb3dpbmc9MC40aW4KKworJSBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIHRoYXQgXl5NIGdldHMgaW5zaWRlIEBsaXNwLCBAZXhhbXBsZSwgYW5kIG90aGVyCislIHN1Y2ggZW52aXJvbm1lbnRzLiAgXG51bGwgaXMgYmV0dGVyIHRoYW4gYSBzcGFjZSwgc2luY2UgaXQgZG9lc24ndAorJSBoYXZlIGFueSB3aWR0aC4KK1xkZWZcbGlzcHBhcntcbnVsbFxlbmRncmFmfQorCislIFRoaXMgc3BhY2UgaXMgYWx3YXlzIHByZXNlbnQgYWJvdmUgYW5kIGJlbG93IGVudmlyb25tZW50cy4KK1xuZXdza2lwXGVudnNraXBhbW91bnQgXGVudnNraXBhbW91bnQgPSAwcHQKKworJSBNYWtlIHNwYWNpbmcgYW5kIGJlbG93IGVudmlyb25tZW50IHN5bW1ldHJpY2FsLiAgV2UgdXNlIFxwYXJza2lwIGhlcmUKKyUgdG8gaGVscCBpbiBkb2luZyB0aGF0LCBzaW5jZSBpbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50cyBccGFyc2tpcAorJSBpcyByZXNldCB0byB6ZXJvOyB0aHVzIHRoZSBcYWZ0ZXJlbnZicmVhayBpbnNlcnRzIG5vIHNwYWNlIC0tIGJ1dCB0aGUKKyUgc3RhcnQgb2YgdGhlIG5leHQgcGFyYWdyYXBoIHdpbGwgaW5zZXJ0IFxwYXJza2lwLgorJQorXGRlZlxhYm92ZWVudmJyZWFre3slCisgICUgPTEwMDAwIGluc3RlYWQgb2YgPDEwMDAwIGJlY2F1c2Ugb2YgYSBzcGVjaWFsIGNhc2UgaW4gXGl0ZW16enogYW5kCisgICUgXHNlY3Rpb25oZWFkaW5nLCBxLnYuCisgIFxpZm51bSBcbGFzdHBlbmFsdHk9MTAwMDAgXGVsc2UKKyAgICBcYWR2YW5jZVxlbnZza2lwYW1vdW50IGJ5IFxwYXJza2lwCisgICAgXGVuZGdyYWYKKyAgICBcaWZkaW1cbGFzdHNraXA8XGVudnNraXBhbW91bnQKKyAgICAgIFxyZW1vdmVsYXN0c2tpcAorICAgICAgJSBpdCdzIG5vdCBhIGdvb2QgcGxhY2UgdG8gYnJlYWsgaWYgdGhlIGxhc3QgcGVuYWx0eSB3YXMgXG5vYnJlYWsKKyAgICAgICUgb3IgYmV0dGVyIC4uLgorICAgICAgXGlmbnVtXGxhc3RwZW5hbHR5PDEwMDAwIFxwZW5hbHR5LTUwIFxmaQorICAgICAgXHZza2lwXGVudnNraXBhbW91bnQKKyAgICBcZmkKKyAgXGZpCit9fQorCitcbGV0XGFmdGVyZW52YnJlYWsgPSBcYWJvdmVlbnZicmVhaworCislIFxub25hcnJvd2luZyBpcyBhIGZsYWcuICBJZiAic2V0IiwgQGxpc3AgZXRjIGRvbid0IG5hcnJvdyBtYXJnaW5zOyBpdCB3aWxsCislIGFsc28gY2xlYXIgaXQsIHNvIHRoYXQgaXRzIGVtYmVkZGVkIGVudmlyb25tZW50cyBkbyB0aGUgbmFycm93aW5nIGFnYWluLgorXGxldFxub25hcnJvd2luZz1ccmVsYXgKKworJSBAY2FydG91Y2hlIC4uLiBAZW5kIGNhcnRvdWNoZTogZHJhdyByZWN0YW5nbGUgdy9yb3VuZGVkIGNvcm5lcnMgYXJvdW5kCislIGVudmlyb25tZW50IGNvbnRlbnRzLgorXGZvbnRcY2lyY2xlPWxjaXJjbGUxMAorXG5ld2RpbWVuXGNpcmN0aGljaworXG5ld2RpbWVuXGNhcnRvdXRlclxuZXdkaW1lblxjYXJ0aW5uZXIKK1xuZXdza2lwXG5vcm1ic2tpcFxuZXdza2lwXG5vcm1wc2tpcFxuZXdza2lwXG5vcm1sc2tpcAorXGNpcmN0aGljaz1cZm9udGRpbWVuOFxjaXJjbGUKKyUKK1xkZWZcY3Rse3tcY2lyY2xlXGNoYXInMDEzXGhza2lwIC02cHR9fSUgNnB0IGZyb20gcGwgZmlsZTogMS8yY2hhcndpZHRoCitcZGVmXGN0cnt7XGhza2lwIDZwdFxjaXJjbGVcY2hhcicwMTB9fQorXGRlZlxjYmx7e1xjaXJjbGVcY2hhcicwMTJcaHNraXAgLTZwdH19CitcZGVmXGNicnt7XGhza2lwIDZwdFxjaXJjbGVcY2hhcicwMTF9fQorXGRlZlxjYXJ0dG9we1xoYm94IHRvIFxjYXJ0b3V0ZXJ7XGhza2lwXGxza2lwCisgICAgICAgIFxjdGxcbGVhZGVyc1xocnVsZSBoZWlnaHRcY2lyY3RoaWNrXGhmaWxcY3RyCisgICAgICAgIFxoc2tpcFxyc2tpcH19CitcZGVmXGNhcnRib3R7XGhib3ggdG8gXGNhcnRvdXRlcntcaHNraXBcbHNraXAKKyAgICAgICAgXGNibFxsZWFkZXJzXGhydWxlIGhlaWdodFxjaXJjdGhpY2tcaGZpbFxjYnIKKyAgICAgICAgXGhza2lwXHJza2lwfX0KKyUKK1xuZXdza2lwXGxza2lwXG5ld3NraXBccnNraXAKKworXGVudmRlZlxjYXJ0b3VjaGV7JQorICBcaWZobW9kZVxwYXJcZmkgICUgY2FuJ3QgYmUgaW4gdGhlIG1pZHN0IG9mIGEgcGFyYWdyYXBoLgorICBcc3RhcnRzYXZpbmdpbnNlcnRzCisgIFxsc2tpcD1cbGVmdHNraXAgXHJza2lwPVxyaWdodHNraXAKKyAgXGxlZnRza2lwPTBwdFxyaWdodHNraXA9MHB0ICUgd2Ugd2FudCB0aGVzZSAqb3V0c2lkZSouCisgIFxjYXJ0aW5uZXI9XGhzaXplIFxhZHZhbmNlXGNhcnRpbm5lciBieS1cbHNraXAKKyAgXGFkdmFuY2VcY2FydGlubmVyIGJ5LVxyc2tpcAorICBcY2FydG91dGVyPVxoc2l6ZQorICBcYWR2YW5jZVxjYXJ0b3V0ZXIgYnkgMTguNHB0CSUgYWxsb3cgZm9yIDNwdCBrZXJucyBvbiBlaXRoZXIKKwkJCQklIHNpZGUsIGFuZCBmb3IgNnB0IHdhc3RlIGZyb20KKwkJCQklIGVhY2ggY29ybmVyIGNoYXIsIGFuZCBydWxlIHRoaWNrbmVzcworICBcbm9ybWJza2lwPVxiYXNlbGluZXNraXAgXG5vcm1wc2tpcD1ccGFyc2tpcCBcbm9ybWxza2lwPVxsaW5lc2tpcAorICAlIEZsYWcgdG8gdGVsbCBAbGlzcCwgZXRjLiwgbm90IHRvIG5hcnJvdyBtYXJnaW4uCisgIFxsZXRcbm9uYXJyb3dpbmcgPSB0JQorICBcdmJveFxiZ3JvdXAKKyAgICAgIFxiYXNlbGluZXNraXA9MHB0XHBhcnNraXA9MHB0XGxpbmVza2lwPTBwdAorICAgICAgXGNhcnR0b3AKKyAgICAgIFxoYm94XGJncm91cAorCSAgXGhza2lwXGxza2lwCisJICBcdnJ1bGVca2VybjNwdAorCSAgXHZib3hcYmdyb3VwCisJICAgICAgXGtlcm4zcHQKKwkgICAgICBcaHNpemU9XGNhcnRpbm5lcgorCSAgICAgIFxiYXNlbGluZXNraXA9XG5vcm1ic2tpcAorCSAgICAgIFxsaW5lc2tpcD1cbm9ybWxza2lwCisJICAgICAgXHBhcnNraXA9XG5vcm1wc2tpcAorCSAgICAgIFx2c2tpcCAtXHBhcnNraXAKKwkgICAgICBcY29tbWVudCAlIEZvciBleHBsYW5hdGlvbiwgc2VlIHRoZSBlbmQgb2YgXGRlZlxncm91cC4KK30KK1xkZWZcRWNhcnRvdWNoZXslCisgICAgICAgICAgICAgIFxpZmhtb2RlXHBhclxmaQorCSAgICAgIFxrZXJuM3B0CisJICBcZWdyb3VwCisJICBca2VybjNwdFx2cnVsZQorCSAgXGhza2lwXHJza2lwCisgICAgICBcZWdyb3VwCisgICAgICBcY2FydGJvdAorICBcZWdyb3VwCisgIFxjaGVja2luc2VydHMKK30KKworCislIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIHRoZSBAZXhhbXBsZSB2YXJpYW50cywKKyUgaW5zaWRlIGEgZ3JvdXAuCitcZGVmXG5vbmZpbGxzdGFydHslCisgIFxhYm92ZWVudmJyZWFrCisgIFxoZnV6eiA9IDEycHQgJSBEb24ndCBiZSBmdXNzeQorICBcc2Vwc3BhY2VzICUgTWFrZSBzcGFjZXMgYmUgd29yZC1zZXBhcmF0b3JzIHJhdGhlciB0aGFuIHNwYWNlIHRva2Vucy4KKyAgXGxldFxwYXIgPSBcbGlzcHBhciAlIGRvbid0IGlnbm9yZSBibGFuayBsaW5lcworICBcb2JleWxpbmVzICUgZWFjaCBsaW5lIG9mIGlucHV0IGlzIGEgbGluZSBvZiBvdXRwdXQKKyAgXHBhcnNraXAgPSAwcHQKKyAgXHBhcmluZGVudCA9IDBwdAorICBcZW1lcmdlbmN5c3RyZXRjaCA9IDBwdCAlIGRvbid0IHRyeSB0byBhdm9pZCBvdmVyZnVsbCBib3hlcworICBcaWZ4XG5vbmFycm93aW5nXHJlbGF4CisgICAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nCisgICAgXGV4ZGVudGFtb3VudD1cbGlzcG5hcnJvd2luZworICBcZWxzZQorICAgIFxsZXRcbm9uYXJyb3dpbmcgPSBccmVsYXgKKyAgXGZpCisgIFxsZXRcZXhkZW50PVxub2ZpbGxleGRlbnQKK30KKworJSBJZiB5b3Ugd2FudCBhbGwgZXhhbXBsZXMgZXRjLiBzbWFsbDogQHNldCBkaXNwZW52c2l6ZSBzbWFsbC4KKyUgSWYgeW91IHdhbnQgZXZlbiBzbWFsbCBleGFtcGxlcyB0aGUgZnVsbCBzaXplOiBAc2V0IGRpc3BlbnZzaXplIG5vc21hbGwuCislIFRoaXMgYWZmZWN0cyB0aGUgZm9sbG93aW5nIGRpc3BsYXllZCBlbnZpcm9ubWVudHM6CislICAgIEBleGFtcGxlLCBAZGlzcGxheSwgQGZvcm1hdCwgQGxpc3AKKyUKK1xkZWZcc21hbGx3b3Jke3NtYWxsfQorXGRlZlxub3NtYWxsd29yZHtub3NtYWxsfQorXGxldFxTRVRkaXNwZW52c2l6ZVxyZWxheAorXGRlZlxzZXRub3JtYWxkaXNwZW52eyUKKyAgXGlmeFxTRVRkaXNwZW52c2l6ZVxzbWFsbHdvcmQKKyAgICBcc21hbGxleGFtcGxlZm9udHMgXHJtCisgIFxmaQorfQorXGRlZlxzZXRzbWFsbGRpc3BlbnZ7JQorICBcaWZ4XFNFVGRpc3BlbnZzaXplXG5vc21hbGx3b3JkCisgIFxlbHNlCisgICAgXHNtYWxsZXhhbXBsZWZvbnRzIFxybQorICBcZmkKK30KKworJSBXZSBvZnRlbiBkZWZpbmUgdHdvIGVudmlyb25tZW50cywgQGZvbyBhbmQgQHNtYWxsZm9vLgorJSBMZXQncyBkbyBpdCBieSBvbmUgY29tbWFuZDoKK1xkZWZcbWFrZWRpc3BlbnYgIzEjMnsKKyAgXGV4cGFuZGFmdGVyXGVudmRlZlxjc25hbWUjMVxlbmRjc25hbWUge1xzZXRub3JtYWxkaXNwZW52ICMyfQorICBcZXhwYW5kYWZ0ZXJcZW52ZGVmXGNzbmFtZSBzbWFsbCMxXGVuZGNzbmFtZSB7XHNldHNtYWxsZGlzcGVudiAjMn0KKyAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgRSMxXGVuZGNzbmFtZSBcYWZ0ZXJlbnZicmVhaworICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBFc21hbGwjMVxlbmRjc25hbWUgXGFmdGVyZW52YnJlYWsKK30KKworJSBEZWZpbmUgdHdvIHN5bm9ueW1zOgorXGRlZlxtYWtldHdvZGlzcGVudnMgIzEjMiMzeworICBcbWFrZWRpc3BlbnZ7IzF9eyMzfQorICBcbWFrZWRpc3BlbnZ7IzJ9eyMzfQorfQorCislIEBsaXNwOiBpbmRlbnRlZCwgbmFycm93ZWQsIHR5cGV3cml0ZXIgZm9udDsgQGV4YW1wbGU6IHNhbWUgYXMgQGxpc3AuCislCislIEBzbWFsbGV4YW1wbGUgYW5kIEBzbWFsbGxpc3A6IHVzZSBzbWFsbGVyIGZvbnRzLgorJSBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IFBhdmVsQHhlcm94LgorJQorXG1ha2V0d29kaXNwZW52cyB7bGlzcH17ZXhhbXBsZX17JQorICBcbm9uZmlsbHN0YXJ0CisgIFx0dAorICBcbGV0XGtiZGZvbnQgPSBca2JkZXhhbXBsZWZvbnQgJSBBbGxvdyBAa2JkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsLgorICBcZ29iYmxlICAgICAgICUgZWF0IHJldHVybgorfQorCislIEBkaXNwbGF5L0BzbWFsbGRpc3BsYXk6IHNhbWUgYXMgQGxpc3AgZXhjZXB0IGtlZXAgY3VycmVudCBmb250LgorJQorXG1ha2VkaXNwZW52IHtkaXNwbGF5fXslCisgIFxub25maWxsc3RhcnQKKyAgXGdvYmJsZQorfQorCislIEBmb3JtYXQvQHNtYWxsZm9ybWF0OiBzYW1lIGFzIEBkaXNwbGF5IGV4Y2VwdCBkb24ndCBuYXJyb3cgbWFyZ2lucy4KKyUKK1xtYWtlZGlzcGVudntmb3JtYXR9eyUKKyAgXGxldFxub25hcnJvd2luZyA9IHQlCisgIFxub25maWxsc3RhcnQKKyAgXGdvYmJsZQorfQorCislIEBmbHVzaGxlZnQ6IHNhbWUgYXMgQGZvcm1hdCwgYnV0IGRvZXNuJ3Qgb2JleSBcU0VUZGlzcGVudnNpemUuCitcZW52ZGVmXGZsdXNobGVmdHslCisgIFxsZXRcbm9uYXJyb3dpbmcgPSB0JQorICBcbm9uZmlsbHN0YXJ0CisgIFxnb2JibGUKK30KK1xsZXRcRWZsdXNobGVmdCA9IFxhZnRlcmVudmJyZWFrCisKKyUgQGZsdXNocmlnaHQuCislCitcZW52ZGVmXGZsdXNocmlnaHR7JQorICBcbGV0XG5vbmFycm93aW5nID0gdCUKKyAgXG5vbmZpbGxzdGFydAorICBcYWR2YW5jZVxsZWZ0c2tpcCBieSAwcHQgcGx1cyAxZmlsbAorICBcZ29iYmxlCit9CitcbGV0XEVmbHVzaHJpZ2h0ID0gXGFmdGVyZW52YnJlYWsKKworCislIEBxdW90YXRpb24gZG9lcyBub3JtYWwgbGluZWJyZWFraW5nIChoZW5jZSB3ZSBjYW4ndCB1c2UgXG5vbmZpbGxzdGFydCkKKyUgYW5kIG5hcnJvd3MgdGhlIG1hcmdpbnMuICBXZSBrZWVwIFxwYXJza2lwIG5vbnplcm8gaW4gZ2VuZXJhbCwgc2luY2UKKyUgd2UncmUgZG9pbmcgbm9ybWFsIGZpbGxpbmcuICBTbywgd2hlbiB1c2luZyBcYWJvdmVlbnZicmVhayBhbmQKKyUgXGFmdGVyZW52YnJlYWssIHRlbXBvcmFyaWx5IG1ha2UgXHBhcnNraXAgMC4KKyUKK1xlbnZkZWZccXVvdGF0aW9ueyUKKyAge1xwYXJza2lwPTBwdCBcYWJvdmVlbnZicmVha30lIGJlY2F1c2UgXGFib3ZlZW52YnJlYWsgaW5zZXJ0cyBccGFyc2tpcAorICBccGFyaW5kZW50PTBwdAorICAlCisgICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZyBhdCBuZXh0IGxldmVsIGRvd24uCisgIFxpZnhcbm9uYXJyb3dpbmdccmVsYXgKKyAgICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZworICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSBcbGlzcG5hcnJvd2luZworICAgIFxleGRlbnRhbW91bnQgPSBcbGlzcG5hcnJvd2luZworICBcZWxzZQorICAgIFxsZXRcbm9uYXJyb3dpbmcgPSBccmVsYXgKKyAgXGZpCisgIFxwYXJzZWFyZ1xxdW90YXRpb25sYWJlbAorfQorCislIFdlIGhhdmUgcmV0YWluZWQgYSBub256ZXJvIHBhcnNraXAgZm9yIHRoZSBlbnZpcm9ubWVudCwgc2luY2Ugd2UncmUKKyUgZG9pbmcgbm9ybWFsIGZpbGxpbmcuCislCitcZGVmXEVxdW90YXRpb257JQorICBccGFyCisgIFxpZnhccXVvdGF0aW9uYXV0aG9yXHVuZGVmaW5lZFxlbHNlCisgICAgJSBpbmRlbnQgYSBiaXQuCisgICAgXGxlZnRsaW5le1xrZXJuIDJcbGVmdHNraXAgXHNsIC0tLVxxdW90YXRpb25hdXRob3J9JQorICBcZmkKKyAge1xwYXJza2lwPTBwdCBcYWZ0ZXJlbnZicmVha30lCit9CisKKyUgSWYgd2UncmUgZ2l2ZW4gYW4gYXJndW1lbnQsIHR5cGVzZXQgaXQgaW4gYm9sZCB3aXRoIGEgY29sb24gYWZ0ZXIuCitcZGVmXHF1b3RhdGlvbmxhYmVsIzF7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcZW1wdHkgXGVsc2UKKyAgICB7XGJmICMxOiB9JQorICBcZmkKK30KKworCislIExhVGVYLWxpa2UgQHZlcmJhdGltLi4uQGVuZCB2ZXJiYXRpbSBhbmQgQHZlcmJ7PGNoYXI+Li4uPGNoYXI+fQorJSBJZiB3ZSB3YW50IHRvIGFsbG93IGFueSA8Y2hhcj4gYXMgZGVsaW1pdGVyLAorJSB3ZSBuZWVkIHRoZSBjdXJseSBicmFjZXMgc28gdGhhdCBtYWtlaW5mbyBzZWVzIHRoZSBAdmVyYiBjb21tYW5kLCBlZzoKKyUgYEB2ZXJieC4uLngnIHdvdWxkIGxvb2sgbGlrZSB0aGUgJ0B2ZXJieCcgY29tbWFuZC4gIC0tamFubmVrZUBnbnUub3JnCislCislIFtLbnV0aF06IERvbmFsZCBFcnZpbiBLbnV0aCwgMTk5Ni4gIFRoZSBUZVhib29rLgorJQorJSBbS251dGhdIHAuMzQ0OyBvbmx5IHdlIG5lZWQgdG8gZG8gdGhlIG90aGVyIGNoYXJhY3RlcnMgVGV4aW5mbyBzZXRzCislIGFjdGl2ZSB0b28uICBPdGhlcndpc2UsIHRoZXkgZ2V0IGxvc3QgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvbiBhCislIHZlcmJhdGltIGxpbmUuCitcZGVmXGRvc3BlY2lhbHN7JQorICBcZG9cIFxkb1xcXGRvXHtcZG9cfVxkb1wkXGRvXCYlCisgIFxkb1wjXGRvXF5cZG9cXl5LXGRvXF9cZG9cXl5BXGRvXCVcZG9cfiUKKyAgXGRvXDxcZG9cPlxkb1x8XGRvXEBcZG8rXGRvXCIlCit9CislCislIFtLbnV0aF0gcC4gMzgwCitcZGVmXHVuY2F0Y29kZXNwZWNpYWxzeyUKKyAgXGRlZlxkbyMjMXtcY2F0Y29kZWAjIzE9XG90aGVyfVxkb3NwZWNpYWxzfQorJQorJSBbS251dGhdIHBwLiAzODAsMzgxLDM5MQorJSBEaXNhYmxlIFNwYW5pc2ggbGlnYXR1cmVzID9gIGFuZCAhYCBvZiBcdHQgZm9udAorXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXGA9XGFjdGl2ZVxnZGVmYHtccmVsYXhcbHF9CitcZW5kZ3JvdXAKKyUKKyUgU2V0dXAgZm9yIHRoZSBAdmVyYiBjb21tYW5kLgorJQorJSBFaWdodCBzcGFjZXMgZm9yIGEgdGFiCitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcXl5JPVxhY3RpdmUKKyAgXGdkZWZcdGFiZWlnaHRzcGFjZXN7XGNhdGNvZGVgXF5eST1cYWN0aXZlXGRlZl5eSXtcIFwgXCBcIFwgXCBcIFwgfX0KK1xlbmRncm91cAorJQorXGRlZlxzZXR1cHZlcmJ7JQorICBcdHQgICUgZWFzaWVzdCAoYW5kIGNvbnZlbnRpb25hbGx5IHVzZWQpIGZvbnQgZm9yIHZlcmJhdGltCisgIFxkZWZccGFye1xsZWF2ZXZtb2RlXGVuZGdyYWZ9JQorICBcY2F0Y29kZWBcYD1cYWN0aXZlCisgIFx0YWJlaWdodHNwYWNlcworICAlIFJlc3BlY3QgbGluZSBicmVha3MsCisgICUgcHJpbnQgc3BlY2lhbCBzeW1ib2xzIGFzIHRoZW1zZWx2ZXMsIGFuZAorICAlIG1ha2UgZWFjaCBzcGFjZSBjb3VudAorICAlIG11c3QgZG8gaW4gdGhpcyBvcmRlcjoKKyAgXG9iZXlsaW5lcyBcdW5jYXRjb2Rlc3BlY2lhbHMgXHNlcHNwYWNlcworfQorCislIFNldHVwIGZvciB0aGUgQHZlcmJhdGltIGVudmlyb25tZW50CislCislIFJlYWwgdGFiIGV4cGFuc2lvbgorXG5ld2RpbWVuXHRhYncgXHNldGJveDA9XGhib3h7XHR0XHNwYWNlfSBcdGFidz04XHdkMCAlIHRhYiBhbW91bnQKKyUKK1xkZWZcc3RhcnR0YWJib3h7XHNldGJveDA9XGhib3hcYmdyb3VwfQorXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXF5eST1cYWN0aXZlCisgIFxnZGVmXHRhYmV4cGFuZHslCisgICAgXGNhdGNvZGVgXF5eST1cYWN0aXZlCisgICAgXGRlZl5eSXtcbGVhdmV2bW9kZVxlZ3JvdXAKKyAgICAgIFxkaW1lbjA9XHdkMCAlIHRoZSB3aWR0aCBzbyBmYXIsIG9yIHNpbmNlIHRoZSBwcmV2aW91cyB0YWIKKyAgICAgIFxkaXZpZGVcZGltZW4wIGJ5XHRhYncKKyAgICAgIFxtdWx0aXBseVxkaW1lbjAgYnlcdGFidyAlIGNvbXB1dGUgcHJldmlvdXMgbXVsdGlwbGUgb2YgXHRhYncKKyAgICAgIFxhZHZhbmNlXGRpbWVuMCBieVx0YWJ3ICAlIGFkdmFuY2UgdG8gbmV4dCBtdWx0aXBsZSBvZiBcdGFidworICAgICAgXHdkMD1cZGltZW4wIFxib3gwIFxzdGFydHRhYmJveAorICAgIH0lCisgIH0KK1xlbmRncm91cAorXGRlZlxzZXR1cHZlcmJhdGlteyUKKyAgXGxldFxub25hcnJvd2luZyA9IHQlCisgIFxub25maWxsc3RhcnQKKyAgJSBFYXNpZXN0IChhbmQgY29udmVudGlvbmFsbHkgdXNlZCkgZm9udCBmb3IgdmVyYmF0aW0KKyAgXHR0CisgIFxkZWZccGFye1xsZWF2ZXZtb2RlXGVncm91cFxib3gwXGVuZGdyYWZ9JQorICBcY2F0Y29kZWBcYD1cYWN0aXZlCisgIFx0YWJleHBhbmQKKyAgJSBSZXNwZWN0IGxpbmUgYnJlYWtzLAorICAlIHByaW50IHNwZWNpYWwgc3ltYm9scyBhcyB0aGVtc2VsdmVzLCBhbmQKKyAgJSBtYWtlIGVhY2ggc3BhY2UgY291bnQKKyAgJSBtdXN0IGRvIGluIHRoaXMgb3JkZXI6CisgIFxvYmV5bGluZXMgXHVuY2F0Y29kZXNwZWNpYWxzIFxzZXBzcGFjZXMKKyAgXGV2ZXJ5cGFye1xzdGFydHRhYmJveH0lCit9CisKKyUgRG8gdGhlIEB2ZXJiIG1hZ2ljOiB2ZXJiYXRpbSB0ZXh0IGlzIHF1b3RlZCBieSB1bmlxdWUKKyUgZGVsaW1pdGVyIGNoYXJhY3RlcnMuICBCZWZvcmUgZmlyc3QgZGVsaW1pdGVyIGV4cGVjdCBhCislIHJpZ2h0IGJyYWNlLCBhZnRlciBsYXN0IGRlbGltaXRlciBleHBlY3QgY2xvc2luZyBicmFjZToKKyUKKyUgICAgXGRlZlxkb3ZlcmIneyc8Y2hhcj4jMTxjaGFyPid9J3sjMX0KKyUKKyUgW0tudXRoXSBwLiAzODI7IG9ubHkgZWF0IG91dGVyIHt9CitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBbPTFcY2F0Y29kZWBdPTJcY2F0Y29kZWBcez1cb3RoZXJcY2F0Y29kZWBcfT1cb3RoZXIKKyAgXGdkZWZcZG92ZXJieyMxW1xkZWZcbmV4dCMjMSMxfVsjIzFcZW5kZ3JvdXBdXG5leHRdCitcZW5kZ3JvdXAKKyUKK1xkZWZcdmVyYntcYmVnaW5ncm91cFxzZXR1cHZlcmJcZG92ZXJifQorJQorJQorJSBEbyB0aGUgQHZlcmJhdGltIG1hZ2ljOiBkZWZpbmUgdGhlIG1hY3JvIFxkb3ZlcmJhdGltIHNvIHRoYXQKKyUgdGhlIChmaXJzdCkgYXJndW1lbnQgZW5kcyB3aGVuICdAZW5kIHZlcmJhdGltJyBpcyByZWFjaGVkLCBpZToKKyUKKyUgICAgIFxkZWZcZG92ZXJiYXRpbSMxQGVuZCB2ZXJiYXRpbXsjMX0KKyUKKyUgRm9yIFRleGluZm8gaXQncyBhIGxvdCBlYXNpZXIgdGhhbiBmb3IgTGFUZVgsCislIGJlY2F1c2UgdGV4aW5mbydzIFx2ZXJiYXRpbSBkb2Vzbid0IHN0b3AgYXQgJ1xlbmR7dmVyYmF0aW19JzoKKyUgd2UgbmVlZCBub3QgcmVkZWZpbmUgJ1wnLCAneycgYW5kICd9Jy4KKyUKKyUgSW5zcGlyZWQgYnkgTGFUZVgncyB2ZXJiYXRpbSBjb21tYW5kIHNldCBbbGF0ZXgubHR4XQorJQorXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXCA9XGFjdGl2ZQorICBcb2JleWxpbmVzICUKKyAgJSBpZ25vcmUgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgXl5NLCB0aGF0J3MgdGhlIG5ld2xpbmUgYXQgdGhlIGVuZAorICAlIG9mIHRoZSBAdmVyYmF0aW0gaW5wdXQgbGluZSBpdHNlbGYuICBPdGhlcndpc2Ugd2UgZ2V0IGFuIGV4dHJhIGJsYW5rCisgICUgbGluZSBpbiB0aGUgb3V0cHV0LgorICBceGRlZlxkb3ZlcmJhdGltIzFeXk0jMkBlbmQgdmVyYmF0aW17IzJcbm9leHBhbmRcZW5kXGdvYmJsZSB2ZXJiYXRpbX0lCisgICUgV2UgcmVhbGx5IHdhbnQgey4uLlxlbmQgdmVyYmF0aW19IGluIHRoZSBib2R5IG9mIHRoZSBtYWNybywgYnV0CisgICUgd2l0aG91dCB0aGUgYWN0aXZlIHNwYWNlOyB0aHVzIHdlIGhhdmUgdG8gdXNlIFx4ZGVmIGFuZCBcZ29iYmxlLgorXGVuZGdyb3VwCislCitcZW52ZGVmXHZlcmJhdGlteyUKKyAgICBcc2V0dXB2ZXJiYXRpbVxkb3ZlcmJhdGltCit9CitcbGV0XEV2ZXJiYXRpbSA9IFxhZnRlcmVudmJyZWFrCisKKworJSBAdmVyYmF0aW1pbmNsdWRlIEZJTEUgLSBpbnNlcnQgdGV4dCBvZiBmaWxlIGluIHZlcmJhdGltIGVudmlyb25tZW50LgorJQorXGRlZlx2ZXJiYXRpbWluY2x1ZGV7XHBhcnNlYXJndXNpbmdcZmlsZW5hbWVjYXRjb2Rlc1xkb3ZlcmJhdGltaW5jbHVkZX0KKyUKK1xkZWZcZG92ZXJiYXRpbWluY2x1ZGUjMXslCisgIHslCisgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICBcc2V0dXB2ZXJiYXRpbQorICAgIFxpbnB1dCAjMQorICAgIFxhZnRlcmVudmJyZWFrCisgIH0lCit9CisKKyUgQGNvcHlpbmcgLi4uIEBlbmQgY29weWluZy4KKyUgU2F2ZSB0aGUgdGV4dCBhd2F5IGZvciBAaW5zZXJ0Y29weWluZyBsYXRlci4KKyUKKyUgV2Ugc2F2ZSB0aGUgdW5pbnRlcnByZXRlZCB0b2tlbnMsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgYm94LgorJSBTYXZpbmcgdGhlIHRleHQgaW4gYSBib3ggd291bGQgYmUgbXVjaCBlYXNpZXIsIGJ1dCB0aGVuIGFsbCB0aGUKKyUgdHlwZXNldHRpbmcgY29tbWFuZHMgKEBzbWFsbGJvb2ssIGZvbnQgY2hhbmdlcywgZXRjLikgaGF2ZSB0byBiZSBkb25lCislIGJlZm9yZWhhbmQgLS0gYW5kIGEpIHdlIHdhbnQgQGNvcHlpbmcgdG8gYmUgZG9uZSBmaXJzdCBpbiB0aGUgc291cmNlCislIGZpbGU7IGIpIGxldHRpbmcgdXNlcnMgZGVmaW5lIHRoZSBmcm9udG1hdHRlciBpbiBhcyBmbGV4aWJsZSBvcmRlciBhcworJSBwb3NzaWJsZSBpcyB2ZXJ5IGRlc2lyYWJsZS4KKyUKK1xkZWZcY29weWluZ3tcY2hlY2tlbnZ7fVxiZWdpbmdyb3VwXHNjYW5hcmdjdHh0XGRvY29weWluZ30KK1xkZWZcZG9jb3B5aW5nIzFAZW5kIGNvcHlpbmd7XGVuZGdyb3VwXGRlZlxjb3B5aW5ndGV4dHsjMX19CislCitcZGVmXGluc2VydGNvcHlpbmd7JQorICBcYmVnaW5ncm91cAorICAgIFxwYXJpbmRlbnQgPSAwcHQgICUgcGFyYWdyYXBoIGluZGVudGF0aW9uIGxvb2tzIHdyb25nIG9uIHRpdGxlIHBhZ2UKKyAgICBcc2NhbmV4cFxjb3B5aW5ndGV4dAorICBcZW5kZ3JvdXAKK30KKworXG1lc3NhZ2V7ZGVmdW5zLH0KKyUgQGRlZnVuIGV0Yy4KKworXG5ld3NraXBcZGVmYm9keWluZGVudCBcZGVmYm9keWluZGVudD0uNGluCitcbmV3c2tpcFxkZWZhcmdzaW5kZW50IFxkZWZhcmdzaW5kZW50PTUwcHQKK1xuZXdza2lwXGRlZmxhc3RhcmdtYXJnaW4gXGRlZmxhc3RhcmdtYXJnaW49MThwdAorCislIFN0YXJ0IHRoZSBwcm9jZXNzaW5nIG9mIEBkZWZmbjoKK1xkZWZcc3RhcnRkZWZ1bnslCisgIFxpZm51bVxsYXN0cGVuYWx0eTwxMDAwMAorICAgIFxtZWRicmVhaworICBcZWxzZQorICAgICUgSWYgdGhlcmUgYXJlIHR3byBAZGVmIGNvbW1hbmRzIGluIGEgcm93LCB3ZSdsbCBoYXZlIGEgXG5vYnJlYWssCisgICAgJSB3aGljaCBpcyB0aGVyZSB0byBrZWVwIHRoZSBmdW5jdGlvbiBkZXNjcmlwdGlvbiB0b2dldGhlciB3aXRoIGl0cworICAgICUgaGVhZGVyLiAgQnV0IGlmIHRoZXJlJ3Mgbm90aGluZyBidXQgaGVhZGVycywgd2UgbmVlZCB0byBhbGxvdyBhCisgICAgJSBicmVhayBzb21ld2hlcmUuICBDaGVjayBzcGVjaWZpY2FsbHkgZm9yIHBlbmFsdHkgMTAwMDIsIGluc2VydGVkCisgICAgJSBieSBcZGVmYXJnc2NvbW1vbmVuZGluZywgaW5zdGVhZCBvZiAxMDAwMCwgc2luY2UgdGhlIHNlY3Rpb25pbmcKKyAgICAlIGNvbW1hbmRzIGFsc28gaW5zZXJ0IGEgbm9icmVhayBwZW5hbHR5LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvdworICAgICUgYSBicmVhayBiZXR3ZWVuIGEgc2VjdGlvbiBoZWFkaW5nIGFuZCBhIGRlZnVuLgorICAgICUgCisgICAgXGlmbnVtXGxhc3RwZW5hbHR5PTEwMDAyIFxwZW5hbHR5MjAwMCBcZmkKKyAgICAlCisgICAgJSBTaW1pbGFybHksIGFmdGVyIGEgc2VjdGlvbiBoZWFkaW5nLCBkbyBub3QgYWxsb3cgYSBicmVhay4KKyAgICAlIEJ1dCBkbyBpbnNlcnQgdGhlIGdsdWUuCisgICAgXG1lZHNraXAgICUgcHJlY2VkZWQgYnkgZGlzY2FyZGFibGUgcGVuYWx0eSwgc28gbm90IGEgYnJlYWtwb2ludAorICBcZmkKKyAgJQorICBccGFyaW5kZW50PTBpbgorICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAorICBcZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Cit9CisKK1xkZWZcZG9kZWZ1bngjMXslCisgICUgRmlyc3QsIGNoZWNrIHdoZXRoZXIgd2UgYXJlIGluIHRoZSByaWdodCBlbnZpcm9ubWVudDoKKyAgXGNoZWNrZW52IzElCisgICUKKyAgJSBBcyBhYm92ZSwgYWxsb3cgbGluZSBicmVhayBpZiB3ZSBoYXZlIG11bHRpcGxlIHggaGVhZGVycyBpbiBhIHJvdy4KKyAgJSBJdCdzIG5vdCBhIGdyZWF0IHBsYWNlLCB0aG91Z2guCisgIFxpZm51bVxsYXN0cGVuYWx0eT0xMDAwMiBccGVuYWx0eTMwMDAgXGZpCisgICUKKyAgJSBBbmQgbm93LCBpdCdzIHRpbWUgdG8gcmV1c2UgdGhlIGJvZHkgb2YgdGhlIG9yaWdpbmFsIGRlZnVuOgorICBcZXhwYW5kYWZ0ZXJcZ29iYmxlZGVmdW4jMSUKK30KK1xkZWZcZ29iYmxlZGVmdW4jMVxzdGFydGRlZnVue30KKworJSBccHJpbnRkZWZ1bmxpbmUgXGRlZmZuaGVhZGVye3RleHR9CislCitcZGVmXHByaW50ZGVmdW5saW5lIzEjMnslCisgIFxiZWdpbmdyb3VwCisgICAgJSBjYWxsIFxkZWZmbmhlYWRlcjoKKyAgICAjMSMyIFxlbmRoZWFkZXIKKyAgICAlIGNvbW1vbiBlbmRpbmc6CisgICAgXGludGVybGluZXBlbmFsdHkgPSAxMDAwMAorICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSAwcHQgcGx1cyAxZmlsCisgICAgXGVuZGdyYWYKKyAgICBcbm9icmVha1x2c2tpcCAtXHBhcnNraXAKKyAgICBccGVuYWx0eSAxMDAwMiAgJSBzaWduYWwgdG8gXHN0YXJ0ZGVmdW4gYW5kIFxkb2RlZnVueAorICAgICUgU29tZSBvZiB0aGUgQGRlZnVuLXR5cGUgdGFncyBkbyBub3QgZW5hYmxlIG1hZ2ljIHBhcmVudGhlc2VzLAorICAgICUgcmVuZGVyaW5nIHRoZSBmb2xsb3dpbmcgY2hlY2sgcmVkdW5kYW50LiAgQnV0IHdlIGRvbid0IG9wdGltaXplLgorICAgIFxjaGVja3BhcmVuY291bnRzCisgIFxlbmRncm91cAorfQorCitcZGVmXEVkZWZ1bntcZW5kZ3JhZlxtZWRicmVha30KKworJSBcbWFrZWRlZnVue2RlZmZufSBjcmVhdGVzIFxkZWZmbiwgXGRlZmZueCBhbmQgXEVkZWZmbjsKKyUgdGhlIG9ubHkgdGhpbmcgcmVtYWlubmlnIGlzIHRvIGRlZmluZSBcZGVmZm5oZWFkZXIuCislCitcZGVmXG1ha2VkZWZ1biMxeyUKKyAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgRSMxXGVuZGNzbmFtZSA9IFxFZGVmdW4KKyAgXGVkZWZcdGVtcHtcbm9leHBhbmRcZG9tYWtlZGVmdW4KKyAgICBcbWFrZWNzbmFtZXsjMX1cbWFrZWNzbmFtZXsjMXh9XG1ha2Vjc25hbWV7IzFoZWFkZXJ9fSUKKyAgXHRlbXAKK30KKworJSBcZG9tYWtlZGVmdW4gXGRlZmZuIFxkZWZmbnggXGRlZmZuaGVhZGVyCislCislIERlZmluZSBcZGVmZm4gYW5kIFxkZWZmbngsIHdpdGhvdXQgcGFyYW1ldGVycy4KKyUgXGRlZmZuaGVhZGVyIGhhcyB0byBiZSBkZWZpbmVkIGV4cGxpY2l0bHkuCislCitcZGVmXGRvbWFrZWRlZnVuIzEjMiMzeyUKKyAgXGVudmRlZiMxeyUKKyAgICBcc3RhcnRkZWZ1bgorICAgIFxwYXJzZWFyZ3VzaW5nXGFjdGl2ZXBhcmVuc3tccHJpbnRkZWZ1bmxpbmUjM30lCisgIH0lCisgIFxkZWYjMntcZG9kZWZ1bngjMX0lCisgIFxkZWYjMyUKK30KKworJSUlIFVudHlwZWQgZnVuY3Rpb25zOgorCislIEBkZWZmbiBjYXRlZ29yeSBuYW1lIGFyZ3MKK1xtYWtlZGVmdW57ZGVmZm59e1xkZWZmbmdlbmVyYWx7fX0KKworJSBAZGVmZm4gY2F0ZWdvcnkgY2xhc3MgbmFtZSBhcmdzCitcbWFrZWRlZnVue2RlZm9wfSMxIHtcZGVmb3BvbnsjMVwgXHB1dHdvcmRvbn19CisKKyUgXGRlZm9wb24ge2NhdGVnb3J5IG9ufWNsYXNzIG5hbWUgYXJncworXGRlZlxkZWZvcG9uIzEjMiB7XGRlZmZuZ2VuZXJhbHtccHV0d29yZG9uXCBcY29kZXsjMn19eyMxXCBcY29kZXsjMn19IH0KKworJSBcZGVmZm5nZW5lcmFsIHtzdWJpbmR9Y2F0ZWdvcnkgbmFtZSBhcmdzCislCitcZGVmXGRlZmZuZ2VuZXJhbCMxIzIgIzMgIzRcZW5kaGVhZGVyeyUKKyAgJSBSZW1lbWJlciB0aGF0IFxkb3N1YmluZHtmbn17Zm9vfXt9IGlzIGVxdWl2YWxlbnQgdG8gXGRvaW5ke2ZufXtmb299LgorICBcZG9zdWJpbmR7Zm59e1xjb2RleyMzfX17IzF9JQorICBcZGVmbmFtZXsjMn17fXsjM31cbWFnaWNhbXBcZGVmdW5hcmdzeyM0XHVuc2tpcH0lCit9CisKKyUlJSBUeXBlZCBmdW5jdGlvbnM6CisKKyUgQGRlZnR5cGVmbiBjYXRlZ29yeSB0eXBlIG5hbWUgYXJncworXG1ha2VkZWZ1bntkZWZ0eXBlZm59e1xkZWZ0eXBlZm5nZW5lcmFse319CisKKyUgQGRlZnR5cGVvcCBjYXRlZ29yeSBjbGFzcyB0eXBlIG5hbWUgYXJncworXG1ha2VkZWZ1bntkZWZ0eXBlb3B9IzEge1xkZWZ0eXBlb3BvbnsjMVwgXHB1dHdvcmRvbn19CisKKyUgXGRlZnR5cGVvcG9uIHtjYXRlZ29yeSBvbn1jbGFzcyB0eXBlIG5hbWUgYXJncworXGRlZlxkZWZ0eXBlb3BvbiMxIzIge1xkZWZ0eXBlZm5nZW5lcmFse1xwdXR3b3Jkb25cIFxjb2RleyMyfX17IzFcIFxjb2RleyMyfX0gfQorCislIFxkZWZ0eXBlZm5nZW5lcmFsIHtzdWJpbmR9Y2F0ZWdvcnkgdHlwZSBuYW1lIGFyZ3MKKyUKK1xkZWZcZGVmdHlwZWZuZ2VuZXJhbCMxIzIgIzMgIzQgIzVcZW5kaGVhZGVyeyUKKyAgXGRvc3ViaW5ke2ZufXtcY29kZXsjNH19eyMxfSUKKyAgXGRlZm5hbWV7IzJ9eyMzfXsjNH1cZGVmdW5hcmdzeyM1XHVuc2tpcH0lCit9CisKKyUlJSBUeXBlZCB2YXJpYWJsZXM6CisKKyUgQGRlZnR5cGV2ciBjYXRlZ29yeSB0eXBlIHZhciBhcmdzCitcbWFrZWRlZnVue2RlZnR5cGV2cn17XGRlZnR5cGVjdmdlbmVyYWx7fX0KKworJSBAZGVmdHlwZWN2IGNhdGVnb3J5IGNsYXNzIHR5cGUgdmFyIGFyZ3MKK1xtYWtlZGVmdW57ZGVmdHlwZWN2fSMxIHtcZGVmdHlwZWN2b2Z7IzFcIFxwdXR3b3Jkb2Z9fQorCislIFxkZWZ0eXBlY3ZvZiB7Y2F0ZWdvcnkgb2Z9Y2xhc3MgdHlwZSB2YXIgYXJncworXGRlZlxkZWZ0eXBlY3ZvZiMxIzIge1xkZWZ0eXBlY3ZnZW5lcmFse1xwdXR3b3Jkb2ZcIFxjb2RleyMyfX17IzFcIFxjb2RleyMyfX0gfQorCislIFxkZWZ0eXBlY3ZnZW5lcmFsIHtzdWJpbmR9Y2F0ZWdvcnkgdHlwZSB2YXIgYXJncworJQorXGRlZlxkZWZ0eXBlY3ZnZW5lcmFsIzEjMiAjMyAjNCAjNVxlbmRoZWFkZXJ7JQorICBcZG9zdWJpbmR7dnJ9e1xjb2RleyM0fX17IzF9JQorICBcZGVmbmFtZXsjMn17IzN9eyM0fVxkZWZ1bmFyZ3N7IzVcdW5za2lwfSUKK30KKworJSUlIFVudHlwZWQgdmFyaWFibGVzOgorCislIEBkZWZ2ciBjYXRlZ29yeSB2YXIgYXJncworXG1ha2VkZWZ1bntkZWZ2cn0jMSB7XGRlZnR5cGV2cmhlYWRlcnsjMX0ge30gfQorCislIEBkZWZjdiBjYXRlZ29yeSBjbGFzcyB2YXIgYXJncworXG1ha2VkZWZ1bntkZWZjdn0jMSB7XGRlZmN2b2Z7IzFcIFxwdXR3b3Jkb2Z9fQorCislIFxkZWZjdm9mIHtjYXRlZ29yeSBvZn1jbGFzcyB2YXIgYXJncworXGRlZlxkZWZjdm9mIzEjMiB7XGRlZnR5cGVjdm9meyMxfSMyIHt9IH0KKworJSUlIFR5cGU6CislIEBkZWZ0cCBjYXRlZ29yeSBuYW1lIGFyZ3MKK1xtYWtlZGVmdW57ZGVmdHB9IzEgIzIgIzNcZW5kaGVhZGVyeyUKKyAgXGRvaW5ke3RwfXtcY29kZXsjMn19JQorICBcZGVmbmFtZXsjMX17fXsjMn1cZGVmdW5hcmdzeyMzXHVuc2tpcH0lCit9CisKKyUgUmVtYWluaW5nIEBkZWZ1bi1saWtlIHNob3J0Y3V0czoKK1xtYWtlZGVmdW57ZGVmdW59e1xkZWZmbmhlYWRlcntccHV0d29yZERlZmZ1bmN9IH0KK1xtYWtlZGVmdW57ZGVmbWFjfXtcZGVmZm5oZWFkZXJ7XHB1dHdvcmREZWZtYWN9IH0KK1xtYWtlZGVmdW57ZGVmc3BlY317XGRlZmZuaGVhZGVye1xwdXR3b3JkRGVmc3BlY30gfQorXG1ha2VkZWZ1bntkZWZ0eXBlZnVufXtcZGVmdHlwZWZuaGVhZGVye1xwdXR3b3JkRGVmZnVuY30gfQorXG1ha2VkZWZ1bntkZWZ2YXJ9e1xkZWZ2cmhlYWRlcntccHV0d29yZERlZnZhcn0gfQorXG1ha2VkZWZ1bntkZWZvcHR9e1xkZWZ2cmhlYWRlcntccHV0d29yZERlZm9wdH0gfQorXG1ha2VkZWZ1bntkZWZ0eXBldmFyfXtcZGVmdHlwZXZyaGVhZGVye1xwdXR3b3JkRGVmdmFyfSB9CitcbWFrZWRlZnVue2RlZm1ldGhvZH17XGRlZm9wb25ccHV0d29yZE1ldGhvZG9ufQorXG1ha2VkZWZ1bntkZWZ0eXBlbWV0aG9kfXtcZGVmdHlwZW9wb25ccHV0d29yZE1ldGhvZG9ufQorXG1ha2VkZWZ1bntkZWZpdmFyfXtcZGVmY3ZvZlxwdXR3b3JkSW5zdGFuY2VWYXJpYWJsZW9mfQorXG1ha2VkZWZ1bntkZWZ0eXBlaXZhcn17XGRlZnR5cGVjdm9mXHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2Z9CisKKyUgXGRlZm5hbWUsIHdoaWNoIGZvcm1hdHMgdGhlIG5hbWUgb2YgdGhlIEBkZWYgKG5vdCB0aGUgYXJncykuCislICMxIGlzIHRoZSBjYXRlZ29yeSwgc3VjaCBhcyAiRnVuY3Rpb24iLgorJSAjMiBpcyB0aGUgcmV0dXJuIHR5cGUsIGlmIGFueS4KKyUgIzMgaXMgdGhlIGZ1bmN0aW9uIG5hbWUuCislCislIFdlIGFyZSBmb2xsb3dlZCBieSAoYnV0IG5vdCBwYXNzZWQpIHRoZSBhcmd1bWVudHMsIGlmIGFueS4KKyUKK1xkZWZcZGVmbmFtZSMxIzIjM3slCisgICUgR2V0IHRoZSB2YWx1ZXMgb2YgXGxlZnRza2lwIGFuZCBccmlnaHRza2lwIGFzIHRoZXkgd2VyZSBvdXRzaWRlIHRoZSBAZGVmLi4uCisgIFxhZHZhbmNlXGxlZnRza2lwIGJ5IC1cZGVmYm9keWluZGVudAorICAlCisgICUgSG93IHdlJ2xsIGZvcm1hdCB0aGUgdHlwZSBuYW1lLiAgUHV0dGluZyBpdCBpbiBicmFja2V0cyBoZWxwcworICAlIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIGJvZHkgdGV4dCB0aGF0IG1heSBlbmQgdXAgb24gdGhlIG5leHQgbGluZQorICAlIGp1c3QgYmVsb3cgaXQuCisgIFxkZWZcdGVtcHsjMX0lCisgIFxzZXRib3gwPVxoYm94e1xrZXJuXGRlZmxhc3RhcmdtYXJnaW4gXGlmeFx0ZW1wXGVtcHR5XGVsc2UgW1xybVx0ZW1wXVxmaX0KKyAgJQorICAlIEZpZ3VyZSBvdXQgbGluZSBzaXplcyBmb3IgdGhlIHBhcmFncmFwaCBzaGFwZS4KKyAgJSBUaGUgZmlyc3QgbGluZSBuZWVkcyBzcGFjZSBmb3IgXGJveDA7IGJ1dCBpZiBccmlnaHRza2lwIGlzIG5vbnplcm8sCisgICUgd2UgbmVlZCBvbmx5IHNwYWNlIGZvciB0aGUgcGFydCBvZiBcYm94MCB3aGljaCBleGNlZWRzIGl0OgorICBcZGltZW4wPVxoc2l6ZSAgXGFkdmFuY2VcZGltZW4wIGJ5IC1cd2QwICBcYWR2YW5jZVxkaW1lbjAgYnkgXHJpZ2h0c2tpcAorICAlIFRoZSBjb250aW51YXRpb25zOgorICBcZGltZW4yPVxoc2l6ZSAgXGFkdmFuY2VcZGltZW4yIGJ5IC1cZGVmYXJnc2luZGVudAorICAlIChwbGFpbi50ZXggc2F5cyB0aGF0IFxkaW1lbjEgc2hvdWxkIGJlIHVzZWQgb25seSBhcyBnbG9iYWwuKQorICBccGFyc2hhcGUgMiAwaW4gXGRpbWVuMCBcZGVmYXJnc2luZGVudCBcZGltZW4yCisgICUKKyAgJSBQdXQgdGhlIHR5cGUgbmFtZSB0byB0aGUgcmlnaHQgbWFyZ2luLgorICBcbm9pbmRlbnQKKyAgXGhib3ggdG8gMHB0eyUKKyAgICBcaGZpbFxib3gwIFxrZXJuLVxoc2l6ZQorICAgICUgXGhzaXplIGhhcyB0byBiZSBzaG9ydGVuZWQgdGhpcyB3YXk6CisgICAgXGtlcm5cbGVmdHNraXAKKyAgICAlIEludGVudGlvbmFsbHkgZG8gbm90IHJlc3BlY3QgXHJpZ2h0c2tpcCwgc2luY2Ugd2UgbmVlZCB0aGUgc3BhY2UuCisgIH0lCisgICUKKyAgJSBBbGxvdyBhbGwgbGluZXMgdG8gYmUgdW5kZXJmdWxsIHdpdGhvdXQgY29tcGxhaW50OgorICBcdG9sZXJhbmNlPTEwMDAwIFxoYmFkbmVzcz0xMDAwMAorICBcZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50CisgIHslCisgICAgJSBkZWZ1biBmb250cy4gV2UgdXNlIHR5cGV3cml0ZXIgYnkgZGVmYXVsdCAodXNlZCB0byBiZSBib2xkKSBiZWNhdXNlOgorICAgICUgLiB3ZSdyZSBwcmludGluZyBpZGVudGlmaWVycywgdGhleSBzaG91bGQgYmUgaW4gdHQgaW4gcHJpbmNpcGxlLgorICAgICUgLiBpbiBsYW5ndWFnZXMgd2l0aCBtYW55IGFjY2VudHMsIHN1Y2ggYXMgQ3plY2ggb3IgRnJlbmNoLCBpdCdzCisgICAgJSAgIGNvbW1vbiB0byBsZWF2ZSBhY2NlbnRzIG9mZiBpZGVudGlmaWVycy4gIFRoZSByZXN1bHQgbG9va3Mgb2sgaW4KKyAgICAlICAgdHQsIGJ1dCBleGNlZWRpbmdseSBzdHJhbmdlIGluIHJtLgorICAgICUgLiB3ZSBkb24ndCB3YW50IC0tIGFuZCAtLS0gdG8gYmUgdHJlYXRlZCBhcyBsaWdhdHVyZXMuCisgICAgJSAuIHRoaXMgc3RpbGwgZG9lcyBub3QgZml4IHRoZSA/YCBhbmQgIWAgbGlnYXR1cmVzLCBidXQgc28gZmFyIG5vCisgICAgJSAgIG9uZSBoYXMgbWFkZSBpZGVudGlmaWVycyB1c2luZyB0aGVtIDopLgorICAgIFxkZiBcdHQKKyAgICBcZGVmXHRlbXB7IzJ9JSByZXR1cm4gdmFsdWUgdHlwZQorICAgIFxpZnhcdGVtcFxlbXB0eVxlbHNlIFx0Y2xvc2V7XHRlbXB9IFxmaQorICAgICMzJSBvdXRwdXQgZnVuY3Rpb24gbmFtZQorICB9JQorICB7XHJtXGVuc2tpcH0lIGhza2lwIDAuNSBlbSBvZiBcdGVucm0KKyAgJQorICBcYm9sZGJyYXgKKyAgJSBhcmd1bWVudHMgd2lsbCBiZSBvdXRwdXQgbmV4dCwgaWYgYW55LgorfQorCislIFByaW50IGFyZ3VtZW50cyBpbiBzbGFudGVkIHJvbWFuIChub3QgdHRzbCksIGluY29uc2lzdGVudGx5IHdpdGggdXNpbmcKKyUgdHQgZm9yIHRoZSBuYW1lLiAgVGhpcyBpcyBiZWNhdXNlIGxpdGVyYWwgdGV4dCBpcyBzb21ldGltZXMgbmVlZGVkIGluCislIHRoZSBhcmd1bWVudCBsaXN0IChncm9mZiBtYW51YWwpLCBhbmQgdHRzbCBhbmQgdHQgYXJlIG5vdCB2ZXJ5CislIGRpc3Rpbmd1aXNoYWJsZS4gIFByZXZlbnQgaHlwaGVuYXRpb24gYXQgYC0nIGNoYXJzLgorJQorXGRlZlxkZWZ1bmFyZ3MjMXslCisgICUgdXNlIHNsIGJ5IGRlZmF1bHQgKG5vdCB0dHNsKSwKKyAgJSB0dCBmb3IgdGhlIG5hbWVzLgorICBcZGYgXHNsIFxoeXBoZW5jaGFyXGZvbnQ9MAorICAlCisgICUgT24gdGhlIG90aGVyIGhhbmQsIGlmIGFuIGFyZ3VtZW50IGhhcyB0d28gZGFzaGVzIChmb3IgaW5zdGFuY2UpLCB3ZQorICAlIHdhbnQgYSB3YXkgdG8gZ2V0IHR0c2wuICBMZXQncyB0cnkgQHZhciBmb3IgdGhhdC4KKyAgXGxldFx2YXI9XHR0c2xhbnRlZAorICAjMSUKKyAgXHNsXGh5cGhlbmNoYXJcZm9udD00NQorfQorCislIFdlIHdhbnQgKCkmW10gdG8gcHJpbnQgc3BlY2lhbGx5IG9uIHRoZSBkZWZ1biBsaW5lLgorJQorXGRlZlxhY3RpdmVwYXJlbnN7JQorICBcY2F0Y29kZWBcKD1cYWN0aXZlIFxjYXRjb2RlYFwpPVxhY3RpdmUKKyAgXGNhdGNvZGVgXFs9XGFjdGl2ZSBcY2F0Y29kZWBcXT1cYWN0aXZlCisgIFxjYXRjb2RlYFwmPVxhY3RpdmUKK30KKworJSBNYWtlIGNvbnRyb2wgc2VxdWVuY2VzIHdoaWNoIGFjdCBsaWtlIG5vcm1hbCBwYXJlbnRoZXNpcyBjaGFycy4KK1xsZXRcbHBhcmVuID0gKCBcbGV0XHJwYXJlbiA9ICkKKworJSBCZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgYSBkZWZpbml0aW9uIGZvciBgKCcsIGV0Yy4gIEZvciBleGFtcGxlLAorJSBpZiB0aGUgZm4gbmFtZSBoYXMgcGFyZW5zIGluIGl0LCBcYm9sZGJyYXggd2lsbCBub3QgYmUgaW4gZWZmZWN0IHlldCwKKyUgc28gVGVYIHdvdWxkIG90aGVyd2lzZSBjb21wbGFpbiBhYm91dCB1bmRlZmluZWQgY29udHJvbCBzZXF1ZW5jZS4KK3sKKyAgXGFjdGl2ZXBhcmVucworICBcZ2xvYmFsXGxldCg9XGxwYXJlbiBcZ2xvYmFsXGxldCk9XHJwYXJlbgorICBcZ2xvYmFsXGxldFs9XGxicmFjayBcZ2xvYmFsXGxldF09XHJicmFjaworICBcZ2xvYmFsXGxldCYgPSBcJgorCisgIFxnZGVmXGJvbGRicmF4e1xsZXQoPVxvcG5yXGxldCk9XGNsbnJcbGV0Wz1cbGJyYlxsZXRdPVxyYnJifQorICBcZ2RlZlxtYWdpY2FtcHtcbGV0Jj1cYW1wcm19Cit9CisKK1xuZXdjb3VudFxwYXJlbmNvdW50CisKKyUgSWYgd2UgZW5jb3VudGVyICZmb28sIHRoZW4gdHVybiBvbiAoKS1oYWNraW5nIGFmdGVyd2FyZHMKK1xuZXdpZlxpZmFtcHNlZW4KK1xkZWZcYW1wcm0jMSB7XGFtcHNlZW50cnVle1xiZlwmIzEgfX0KKworXGRlZlxwYXJlbmZvbnR7JQorICBcaWZhbXBzZWVuCisgICAgJSBBdCB0aGUgZmlyc3QgbGV2ZWwsIHByaW50IHBhcmVucyBpbiByb21hbiwKKyAgICAlIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQgZm9udC4KKyAgICBcaWZudW0gXHBhcmVuY291bnQ9MSBccm0gXGZpCisgIFxlbHNlCisgICAgJSBUaGUgXHNmIHBhcmVucyAoaW4gXGJvbGRicmF4KSBhY3R1YWxseSBhcmUgYSBsaXR0bGUgYm9sZGVyIHRoYW4KKyAgICAlIHRoZSBjb250YWluZWQgdGV4dC4gIFRoaXMgaXMgZXNwZWNpYWxseSBuZWVkZWQgZm9yIFsgYW5kIF0gLgorICAgIFxzZgorICBcZmkKK30KK1xkZWZcaW5maXJzdGxldmVsIzF7JQorICBcaWZhbXBzZWVuCisgICAgXGlmbnVtXHBhcmVuY291bnQ9MQorICAgICAgIzElCisgICAgXGZpCisgIFxmaQorfQorXGRlZlxiZmFmdGVyd29yZCMxIHsjMSBcYmZ9CisKK1xkZWZcb3BucnslCisgIFxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IDEKKyAge1xwYXJlbmZvbnQofSUKKyAgXGluZmlyc3RsZXZlbCBcYmZhZnRlcndvcmQKK30KK1xkZWZcY2xucnslCisgIHtccGFyZW5mb250KX0lCisgIFxpbmZpcnN0bGV2ZWwgXHNsCisgIFxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IC0xCit9CisKK1xuZXdjb3VudFxicmFja2NvdW50CitcZGVmXGxicmJ7JQorICBcZ2xvYmFsXGFkdmFuY2VcYnJhY2tjb3VudCBieSAxCisgIHtcYmZbfSUKK30KK1xkZWZccmJyYnslCisgIHtcYmZdfSUKKyAgXGdsb2JhbFxhZHZhbmNlXGJyYWNrY291bnQgYnkgLTEKK30KKworXGRlZlxjaGVja3BhcmVuY291bnRzeyUKKyAgXGlmbnVtXHBhcmVuY291bnQ9MCBcZWxzZSBcYmFkcGFyZW5jb3VudCBcZmkKKyAgXGlmbnVtXGJyYWNrY291bnQ9MCBcZWxzZSBcYmFkYnJhY2tjb3VudCBcZmkKK30KK1xkZWZcYmFkcGFyZW5jb3VudHslCisgIFxlcnJtZXNzYWdle1VuYmFsYW5jZWQgcGFyZW50aGVzZXMgaW4gQGRlZn0lCisgIFxnbG9iYWxccGFyZW5jb3VudD0wCit9CitcZGVmXGJhZGJyYWNrY291bnR7JQorICBcZXJybWVzc2FnZXtVbmJhbGFuY2VkIHNxdWFyZSBicmFjZXMgaW4gQGRlZn0lCisgIFxnbG9iYWxcYnJhY2tjb3VudD0wCit9CisKKworXG1lc3NhZ2V7bWFjcm9zLH0KKyUgQG1hY3JvLgorCislIFRvIGRvIHRoaXMgcmlnaHQgd2UgbmVlZCBhIGZlYXR1cmUgb2YgZS1UZVgsIFxzY2FudG9rZW5zLAorJSB3aGljaCB3ZSBhcnJhbmdlIHRvIGVtdWxhdGUgd2l0aCBhIHRlbXBvcmFyeSBmaWxlIGluIG9yZGluYXJ5IFRlWC4KK1xpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkCisgIFxuZXd3cml0ZVxtYWNzY3JpYmJsZQorICBcZGVmXHNjYW50b2tlbnMjMXslCisgICAgXHRva3MwPXsjMX0lCisgICAgXGltbWVkaWF0ZVxvcGVub3V0XG1hY3NjcmliYmxlPVxqb2JuYW1lLnRtcAorICAgIFxpbW1lZGlhdGVcd3JpdGVcbWFjc2NyaWJibGV7XHRoZVx0b2tzMH0lCisgICAgXGltbWVkaWF0ZVxjbG9zZW91dFxtYWNzY3JpYmJsZQorICAgIFxpbnB1dCBcam9ibmFtZS50bXAKKyAgfQorXGZpCisKK1xkZWZcc2Nhbm1hY3JvIzF7JQorICBcYmVnaW5ncm91cAorICAgIFxuZXdsaW5lY2hhcmBcXl5NCisgICAgXGxldFx4ZWF0c3BhY2VzXGVhdHNwYWNlcworICAgICUgVW5kbyBjYXRjb2RlIGNoYW5nZXMgb2YgXHN0YXJ0Y29udGVudHMgYW5kIFxkb3ByaW50aW5kZXgKKyAgICAlIFdoZW4gY2FsbGVkIGZyb20gQGluc2VydGNvcHlpbmcgb3IgKHNob3J0KWNhcHRpb24sIHdlIG5lZWQgYWN0aXZlCisgICAgJSBiYWNrc2xhc2ggdG8gZ2V0IGl0IHByaW50ZWQgY29ycmVjdGx5LiAgUHJldmlvdXNseSwgd2UgaGFkCisgICAgJSBcY2F0Y29kZWBcXD1cb3RoZXIgaW5zdGVhZC4gIFdlJ2xsIHNlZSB3aGV0aGVyIGEgcHJvYmxlbSBhcHBlYXJzCisgICAgJSB3aXRoIG1hY3JvIGV4cGFuc2lvbi4JCQkJLS1rYXNhbCwgMTlhdWcwNAorICAgIFxjYXRjb2RlYFxAPTAgXGNhdGNvZGVgXFw9XGFjdGl2ZSBcZXNjYXBlY2hhcj1gXEAKKyAgICAlIC4uLiBhbmQgXGV4YW1wbGUKKyAgICBcc3BhY2Vpc3NwYWNlCisgICAgJQorICAgICUgQXBwZW5kIFxlbmRpbnB1dCB0byBtYWtlIHN1cmUgdGhhdCBUZVggZG9lcyBub3Qgc2VlIHRoZSBlbmRpbmcgbmV3bGluZS4KKyAgICAlCisgICAgJSBJJ3ZlIHZlcmlmaWVkIHRoYXQgaXQgaXMgbmVjZXNzYXJ5IGJvdGggZm9yIGUtVGVYIGFuZCBmb3Igb3JkaW5hcnkgVGVYCisgICAgJQkJCQkJCQktLWthc2FsLCAyOW5vdjAzCisgICAgXHNjYW50b2tlbnN7IzFcZW5kaW5wdXR9JQorICBcZW5kZ3JvdXAKK30KKworXGRlZlxzY2FuZXhwIzF7JQorICBcZWRlZlx0ZW1we1xub2V4cGFuZFxzY2FubWFjcm97IzF9fSUKKyAgXHRlbXAKK30KKworXG5ld2NvdW50XHBhcmFtbm8gICAlIENvdW50IG9mIHBhcmFtZXRlcnMKK1xuZXd0b2tzXG1hY25hbWUgICAgJSBNYWNybyBuYW1lCitcbmV3aWZcaWZyZWN1cnNpdmUgICUgSXMgaXQgcmVjdXJzaXZlPworCislIExpc3Qgb2YgYWxsIGRlZmluZWQgbWFjcm9zIGluIHRoZSBmb3JtCislICAgIFxkZWZpbmVkdW1teXdvcmRcbWFjcm8xXGRlZmluZWR1bW15d29yZFxtYWNybzIuLi4KKyUgQ3VycmVudGx5IGlzIGFsc28gY29udGFpbnMgYWxsIEBhbGlhc2VzOyB0aGUgbGlzdCBjYW4gYmUgc3BsaXQKKyUgaWYgdGhlcmUgaXMgYSBuZWVkLgorXGRlZlxtYWNyb2xpc3R7fQorCislIEFkZCB0aGUgbWFjcm8gdG8gXG1hY3JvbGlzdAorXGRlZlxhZGR0b21hY3JvbGlzdCMxe1xleHBhbmRhZnRlciBcYWRkdG9tYWNyb2xpc3R4eHggXGNzbmFtZSMxXGVuZGNzbmFtZX0KK1xkZWZcYWRkdG9tYWNyb2xpc3R4eHgjMXslCisgICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcbWFjcm9saXN0XGRlZmluZWR1bW15d29yZCMxfSUKKyAgICAgXHhkZWZcbWFjcm9saXN0e1x0aGVcdG9rczB9JQorfQorCislIFV0aWxpdHkgcm91dGluZXMuCislIFRoaXMgZG9lcyBcbGV0ICMxID0gIzIsIHdpdGggXGNzbmFtZXM7IHRoYXQgaXMsCislICAgXGxldCBcY3NuYW1lIzFcZW5kY3NuYW1lID0gXGNzbmFtZSMyXGVuZGNzbmFtZQorJSAoZXhjZXB0IG9mIGNvdXJzZSB3ZSBoYXZlIHRvIHBsYXkgZXhwYW5zaW9uIGdhbWVzKS4KKyUgCitcZGVmXGNzbGV0IzEjMnslCisgIFxleHBhbmRhZnRlclxsZXQKKyAgXGNzbmFtZSMxXGV4cGFuZGFmdGVyXGVuZGNzbmFtZQorICBcY3NuYW1lIzJcZW5kY3NuYW1lCit9CisKKyUgVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgb2ZmIGEgc3RyaW5nLgorJSBDb25jZXB0cyBmcm9tIGFyby1iZW5kIHByb2JsZW0gMTUgKHNlZSBDVEFOKS4KK3tcY2F0Y29kZWBcQD0xMQorXGdkZWZcZWF0c3BhY2VzICMxe1xleHBhbmRhZnRlclx0cmltQFxleHBhbmRhZnRlcnsjMSB9fQorXGdkZWZcdHJpbUAgIzF7XHRyaW1AQCBAIzEgQCAjMSBAIEBAfQorXGdkZWZcdHJpbUBAICMxQCAjMkAgIzNAQHtcdHJpbUBAQFxlbXB0eSAjMiBAfQorXGRlZlx1bmJyYWNlIzF7IzF9CitcdW5icmFjZXtcZ2RlZlx0cmltQEBAICMxIH0gIzJAeyMxfQorfQorCislIFRyaW0gYSBzaW5nbGUgdHJhaWxpbmcgXl5NIG9mZiBhIHN0cmluZy4KK3tcY2F0Y29kZWBcXl5NPVxvdGhlciBcY2F0Y29kZWBcUT0zJQorXGdkZWZcZWF0Y3IgIzF7XGVhdGNyYSAjMVFeXk1RfSUKK1xnZGVmXGVhdGNyYSMxXl5NUXtcZWF0Y3JiIzFRfSUKK1xnZGVmXGVhdGNyYiMxUSMyUXsjMX0lCit9CisKKyUgTWFjcm8gYm9kaWVzIGFyZSBhYnNvcmJlZCBhcyBhbiBhcmd1bWVudCBpbiBhIGNvbnRleHQgd2hlcmUKKyUgYWxsIGNoYXJhY3RlcnMgYXJlIGNhdGNvZGUgMTAsIDExIG9yIDEyLCBleGNlcHQgXCB3aGljaCBpcyBhY3RpdmUKKyUgKGFzIGluIG5vcm1hbCB0ZXhpbmZvKS4gSXQgaXMgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBcLgorCislIEl0J3MgbmVjZXNzYXJ5IHRvIGhhdmUgaGFyZCBDUnMgd2hlbiB0aGUgbWFjcm8gaXMgZXhlY3V0ZWQuIFRoaXMgaXMKKyUgZG9uZSBieSAgbWFraW5nIF5eTSAoXGVuZGxpbmVjaGFyKSBjYXRjb2RlIDEyIHdoZW4gcmVhZGluZyB0aGUgbWFjcm8KKyUgYm9keSwgYW5kIHRoZW4gbWFraW5nIGl0IHRoZSBcbmV3bGluZWNoYXIgaW4gXHNjYW5tYWNyby4KKworXGRlZlxzY2FuY3R4dHslCisgIFxjYXRjb2RlYFwiPVxvdGhlcgorICBcY2F0Y29kZWBcKz1cb3RoZXIKKyAgXGNhdGNvZGVgXDw9XG90aGVyCisgIFxjYXRjb2RlYFw+PVxvdGhlcgorICBcY2F0Y29kZWBcQD1cb3RoZXIKKyAgXGNhdGNvZGVgXF49XG90aGVyCisgIFxjYXRjb2RlYFxfPVxvdGhlcgorICBcY2F0Y29kZWBcfD1cb3RoZXIKKyAgXGNhdGNvZGVgXH49XG90aGVyCit9CisKK1xkZWZcc2NhbmFyZ2N0eHR7JQorICBcc2NhbmN0eHQKKyAgXGNhdGNvZGVgXFw9XG90aGVyCisgIFxjYXRjb2RlYFxeXk09XG90aGVyCit9CisKK1xkZWZcbWFjcm9ib2R5Y3R4dHslCisgIFxzY2FuY3R4dAorICBcY2F0Y29kZWBcez1cb3RoZXIKKyAgXGNhdGNvZGVgXH09XG90aGVyCisgIFxjYXRjb2RlYFxeXk09XG90aGVyCisgIFx1c2VtYm9keWJhY2tzbGFzaAorfQorCitcZGVmXG1hY3JvYXJnY3R4dHslCisgIFxzY2FuY3R4dAorICBcY2F0Y29kZWBcXD1cb3RoZXIKK30KKworJSBcbWJvZHliYWNrc2xhc2ggaXMgdGhlIGRlZmluaXRpb24gb2YgXCBpbiBAbWFjcm8gYm9kaWVzLgorJSBJdCBtYXBzIFxmb29cID0+IFxjc25hbWUgbWFjYXJnLmZvb1xlbmRjc25hbWUgPT4gI04KKyUgd2hlcmUgTiBpcyB0aGUgbWFjcm8gcGFyYW1ldGVyIG51bWJlci4KKyUgV2UgZGVmaW5lIFxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWUgdG8gYmUgXHJlYWxiYWNrc2xhc2gsIHNvCislIFxcIGluIG1hY3JvIHJlcGxhY2VtZW50IHRleHQgZ2V0cyB5b3UgYSBiYWNrc2xhc2guCisKK3tcY2F0Y29kZWBAPTAgQGNhdGNvZGVgQFw9QGFjdGl2ZQorIEBnZGVmQHVzZW1ib2R5YmFja3NsYXNoe0BsZXRcPUBtYm9keWJhY2tzbGFzaH0KKyBAZ2RlZkBtYm9keWJhY2tzbGFzaCMxXHtAY3NuYW1lIG1hY2FyZy4jMUBlbmRjc25hbWV9Cit9CitcZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSBtYWNhcmcuXGVuZGNzbmFtZXtccmVhbGJhY2tzbGFzaH0KKworXGRlZlxtYWNyb3tccmVjdXJzaXZlZmFsc2VccGFyc2VhcmdcbWFjcm94eHh9CitcZGVmXHJtYWNyb3tccmVjdXJzaXZldHJ1ZVxwYXJzZWFyZ1xtYWNyb3h4eH0KKworXGRlZlxtYWNyb3h4eCMxeyUKKyAgXGdldGFyZ3N7IzF9JSAgICAgICAgICAgbm93IFxtYWNuYW1lIGlzIHRoZSBtYWNuYW1lIGFuZCBcYXJnbCB0aGUgYXJnbGlzdAorICBcaWZ4XGFyZ2xcZW1wdHkgICAgICAgJSBubyBhcmd1bWVudHMKKyAgICAgXHBhcmFtbm89MCUKKyAgXGVsc2UKKyAgICAgXGV4cGFuZGFmdGVyXHBhcnNlbWFyZ2RlZiBcYXJnbDslCisgIFxmaQorICBcaWYxXGNzbmFtZSBpc21hY3JvLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUKKyAgICAgXG1lc3NhZ2V7V2FybmluZzogcmVkZWZpbmluZyBcdGhlXG1hY25hbWV9JQorICBcZWxzZQorICAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBcdGhlXG1hY25hbWVcZW5kY3NuYW1lIFxyZWxheAorICAgICBcZWxzZSBcZXJybWVzc2FnZXtNYWNybyBuYW1lIFx0aGVcbWFjbmFtZVxzcGFjZSBhbHJlYWR5IGRlZmluZWR9XGZpCisgICAgIFxnbG9iYWxcY3NsZXR7bWFjc2F2ZS5cdGhlXG1hY25hbWV9e1x0aGVcbWFjbmFtZX0lCisgICAgIFxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBpc21hY3JvLlx0aGVcbWFjbmFtZVxlbmRjc25hbWU9MSUKKyAgICAgXGFkZHRvbWFjcm9saXN0e1x0aGVcbWFjbmFtZX0lCisgIFxmaQorICBcYmVnaW5ncm91cCBcbWFjcm9ib2R5Y3R4dAorICBcaWZyZWN1cnNpdmUgXGV4cGFuZGFmdGVyXHBhcnNlcm1hY2JvZHkKKyAgXGVsc2UgXGV4cGFuZGFmdGVyXHBhcnNlbWFjYm9keQorICBcZml9CisKK1xwYXJzZWFyZ2RlZlx1bm1hY3JveyUKKyAgXGlmMVxjc25hbWUgaXNtYWNyby4jMVxlbmRjc25hbWUKKyAgICBcZ2xvYmFsXGNzbGV0eyMxfXttYWNzYXZlLiMxfSUKKyAgICBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldCBcY3NuYW1lIGlzbWFjcm8uIzFcZW5kY3NuYW1lPTAlCisgICAgJSBSZW1vdmUgdGhlIG1hY3JvIG5hbWUgZnJvbSBcbWFjcm9saXN0OgorICAgIFxiZWdpbmdyb3VwCisgICAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSMxXGVuZGNzbmFtZSBccmVsYXgKKyAgICAgIFxsZXRcZGVmaW5lZHVtbXl3b3JkXHVubWFjcm9kbworICAgICAgXHhkZWZcbWFjcm9saXN0e1xtYWNyb2xpc3R9JQorICAgIFxlbmRncm91cAorICBcZWxzZQorICAgIFxlcnJtZXNzYWdle01hY3JvICMxIG5vdCBkZWZpbmVkfSUKKyAgXGZpCit9CisKKyUgQ2FsbGVkIGJ5IFxkbyBmcm9tIFxkb3VubWFjcm8gb24gZWFjaCBtYWNyby4gIFRoZSBpZGVhIGlzIHRvIG9taXQgYW55CislIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gXHJlbGF4LgorJQorXGRlZlx1bm1hY3JvZG8jMXslCisgIFxpZnggIzFccmVsYXgKKyAgICAlIHJlbW92ZSB0aGlzCisgIFxlbHNlCisgICAgXG5vZXhwYW5kXGRlZmluZWR1bW15d29yZCBcbm9leHBhbmQjMSUKKyAgXGZpCit9CisKKyUgVGhpcyBtYWtlcyB1c2Ugb2YgdGhlIG9ic2N1cmUgZmVhdHVyZSB0aGF0IGlmIHRoZSBsYXN0IHRva2VuIG9mIGEKKyUgPHBhcmFtZXRlciBsaXN0PiBpcyAjLCB0aGVuIHRoZSBwcmVjZWRpbmcgYXJndW1lbnQgaXMgZGVsaW1pdGVkIGJ5CislIGFuIG9wZW5pbmcgYnJhY2UsIGFuZCB0aGF0IG9wZW5pbmcgYnJhY2UgaXMgbm90IGNvbnN1bWVkLgorXGRlZlxnZXRhcmdzIzF7XGdldGFyZ3N4eHgjMXt9fQorXGRlZlxnZXRhcmdzeHh4IzEje1xnZXRtYWNuYW1lICMxIFxyZWxheFxnZXRtYWNhcmdzfQorXGRlZlxnZXRtYWNuYW1lICMxICMyXHJlbGF4e1xtYWNuYW1lPXsjMX19CitcZGVmXGdldG1hY2FyZ3MjMXtcZGVmXGFyZ2x7IzF9fQorCislIFBhcnNlIHRoZSBvcHRpb25hbCB7cGFyYW1zfSBsaXN0LiAgU2V0IHVwIFxwYXJhbW5vIGFuZCBccGFyYW1saXN0CislIHNvIFxkZWZtYWNybyBrbm93cyB3aGF0IHRvIGRvLiAgRGVmaW5lIFxtYWNhcmcuYmxhaCBmb3IgZWFjaCBibGFoCislIGluIHRoZSBwYXJhbXMgbGlzdCwgdG8gYmUgIyNOIHdoZXJlIE4gaXMgdGhlIHBvc2l0aW9uIGluIHRoYXQgbGlzdC4KKyUgVGhhdCBnZXRzIHVzZWQgYnkgXG1ib2R5YmFja3NsYXNoIChhYm92ZSkuCisKKyUgV2UgbmVlZCB0byBnZXQgYG1hY3JvIHBhcmFtZXRlciBjaGFyICMnIGludG8gc2V2ZXJhbCBkZWZpbml0aW9ucy4KKyUgVGhlIHRlY2huaXF1ZSB1c2VkIGlzIHN0b2xlbiBmcm9tIExhVGVYOiAgbGV0IFxoYXNoIGJlIHNvbWV0aGluZworJSB1bmV4cGFuZGFibGUsIGluc2VydCB0aGF0IHdoZXJldmVyIHlvdSBuZWVkIGEgIywgYW5kIHRoZW4gcmVkZWZpbmUKKyUgaXQgdG8gIyBqdXN0IGJlZm9yZSB1c2luZyB0aGUgdG9rZW4gbGlzdCBwcm9kdWNlZC4KKyUKKyUgVGhlIHNhbWUgdGVjaG5pcXVlIGlzIHVzZWQgdG8gcHJvdGVjdCBcZWF0c3BhY2VzIHRpbGwganVzdCBiZWZvcmUKKyUgdGhlIG1hY3JvIGlzIHVzZWQuCisKK1xkZWZccGFyc2VtYXJnZGVmIzE7e1xwYXJhbW5vPTBcZGVmXHBhcmFtbGlzdHt9JQorICAgICAgICBcbGV0XGhhc2hccmVsYXhcbGV0XHhlYXRzcGFjZXNccmVsYXhccGFyc2VtYXJnZGVmeHh4IzEsOyx9CitcZGVmXHBhcnNlbWFyZ2RlZnh4eCMxLHslCisgIFxpZiMxO1xsZXRcbmV4dD1ccmVsYXgKKyAgXGVsc2UgXGxldFxuZXh0PVxwYXJzZW1hcmdkZWZ4eHgKKyAgICBcYWR2YW5jZVxwYXJhbW5vIGJ5IDElCisgICAgXGV4cGFuZGFmdGVyXGVkZWZcY3NuYW1lIG1hY2FyZy5cZWF0c3BhY2VzeyMxfVxlbmRjc25hbWUKKyAgICAgICAge1x4ZWF0c3BhY2Vze1xoYXNoXHRoZVxwYXJhbW5vfX0lCisgICAgXGVkZWZccGFyYW1saXN0e1xwYXJhbWxpc3RcaGFzaFx0aGVccGFyYW1ubyx9JQorICBcZmlcbmV4dH0KKworJSBUaGVzZSB0d28gY29tbWFuZHMgcmVhZCByZWN1cnNpdmUgYW5kIG5vbnJlY3Vyc2l2ZSBtYWNybyBib2RpZXMuCislIChUaGV5J3JlIGRpZmZlcmVudCBzaW5jZSByZWMgYW5kIG5vbnJlYyBtYWNyb3MgZW5kIGRpZmZlcmVudGx5LikKKworXGxvbmdcZGVmXHBhcnNlbWFjYm9keSMxQGVuZCBtYWNybyUKK3tceGRlZlx0ZW1we1xlYXRjcnsjMX19XGVuZGdyb3VwXGRlZm1hY3JvfSUKK1xsb25nXGRlZlxwYXJzZXJtYWNib2R5IzFAZW5kIHJtYWNybyUKK3tceGRlZlx0ZW1we1xlYXRjcnsjMX19XGVuZGdyb3VwXGRlZm1hY3JvfSUKKworJSBUaGlzIGRlZmluZXMgdGhlIG1hY3JvIGl0c2VsZi4gVGhlcmUgYXJlIHNpeCBjYXNlczogcmVjdXJzaXZlIGFuZAorJSBub25yZWN1cnNpdmUgbWFjcm9zIG9mIHplcm8sIG9uZSwgYW5kIG1hbnkgYXJndW1lbnRzLgorJSBNdWNoIG1hZ2ljIHdpdGggXGV4cGFuZGFmdGVyIGhlcmUuCislIFx4ZGVmIGlzIHVzZWQgc28gdGhhdCBtYWNybyBkZWZpbml0aW9ucyB3aWxsIHN1cnZpdmUgdGhlIGZpbGUKKyUgdGhleSdyZSBkZWZpbmVkIGluOyBAaW5jbHVkZSByZWFkcyB0aGUgZmlsZSBpbnNpZGUgYSBncm91cC4KK1xkZWZcZGVmbWFjcm97JQorICBcbGV0XGhhc2g9IyMlIGNvbnZlcnQgcGxhY2Vob2xkZXJzIHRvIG1hY3JvIHBhcmFtZXRlciBjaGFycworICBcaWZyZWN1cnNpdmUKKyAgICBcaWZjYXNlXHBhcmFtbm8KKyAgICAlIDAKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCisgICAgXG9yICUgMQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAorICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lCisgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWV9JQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUjIzF7JQorICAgICAgICAgXGVncm91cFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKKyAgICBcZWxzZSAlIG1hbnkKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICAgXGJncm91cFxub2V4cGFuZFxtYWNyb2FyZ2N0eHQKKyAgICAgICAgIFxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lfSUKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWUjIzF7JQorICAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKKyAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKKyAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUKKyAgICAgICAgICBccGFyYW1saXN0e1xlZ3JvdXBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCisgICAgXGZpCisgIFxlbHNlCisgICAgXGlmY2FzZVxwYXJhbW5vCisgICAgJSAwCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQorICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQorICAgIFxvciAlIDEKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICAgXGJncm91cFxub2V4cGFuZFxtYWNyb2FyZ2N0eHQKKyAgICAgICAgIFxub2V4cGFuZFxicmFjZW9ybGluZQorICAgICAgICAgXGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lfSUKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lIyMxeyUKKyAgICAgICAgXGVncm91cAorICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCisgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCisgICAgXGVsc2UgJSBtYW55CisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgIFxiZ3JvdXBcbm9leHBhbmRcbWFjcm9hcmdjdHh0CisgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4XGVuZGNzbmFtZX0lCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lIyMxeyUKKyAgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgIyMxLH0lCisgICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmCisgICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKKyAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZQorICAgICAgXHBhcmFtbGlzdHslCisgICAgICAgICAgXGVncm91cAorICAgICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKKyAgICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfVxlZ3JvdXB9JQorICAgIFxmaQorICBcZml9CisKK1xkZWZcbm9yZWN1cnNlIzF7XGJncm91cFxjc2xldHsjMX17bWFjc2F2ZS4jMX19CisKKyUgXGJyYWNlb3JsaW5lIGRlY2lkZXMgd2hldGhlciB0aGUgbmV4dCBub253aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhCislIHsuICBJZiBzbyBpdCByZWFkcyB1cCB0byB0aGUgY2xvc2luZyB9LCBpZiBub3QsIGl0IHJlYWRzIHRoZSB3aG9sZQorJSBsaW5lLiAgV2hhdGV2ZXIgd2FzIHJlYWQgaXMgdGhlbiBmZWQgdG8gdGhlIG5leHQgY29udHJvbCBzZXF1ZW5jZQorJSBhcyBhbiBhcmd1bWVudCAoYnkgXHBhcnNlYnJhY2Ugb3IgXHBhcnNlYXJnKQorXGRlZlxicmFjZW9ybGluZSMxe1xsZXRcbmV4dD0jMVxmdXR1cmVsZXRcbmNoYXJcYnJhY2VvcmxpbmV4eHh9CitcZGVmXGJyYWNlb3JsaW5leHh4eyUKKyAgXGlmeFxuY2hhclxiZ3JvdXBcZWxzZQorICAgIFxleHBhbmRhZnRlclxwYXJzZWFyZworICBcZmkgXG5leHR9CisKKworJSBAYWxpYXMuCislIFdlIG5lZWQgc29tZSB0cmlja2VyeSB0byByZW1vdmUgdGhlIG9wdGlvbmFsIHNwYWNlcyBhcm91bmQgdGhlIGVxdWFsCislIHNpZ24uICBKdXN0IG1ha2UgdGhlbSBhY3RpdmUgYW5kIHRoZW4gZXhwYW5kIHRoZW0gYWxsIHRvIG5vdGhpbmcuCitcZGVmXGFsaWFze1xwYXJzZWFyZ3VzaW5nXG9iZXlzcGFjZXNcYWxpYXN4eHh9CitcZGVmXGFsaWFzeHh4ICMxe1xhbGlhc3l5eSMxXHJlbGF4fQorXGRlZlxhbGlhc3l5eSAjMT0jMlxyZWxheHslCisgIHslCisgICAgXGV4cGFuZGFmdGVyXGxldFxvYmV5ZWRzcGFjZT1cZW1wdHkKKyAgICBcYWRkdG9tYWNyb2xpc3R7IzF9JQorICAgIFx4ZGVmXG5leHR7XGdsb2JhbFxsZXRcbWFrZWNzbmFtZXsjMX09XG1ha2Vjc25hbWV7IzJ9fSUKKyAgfSUKKyAgXG5leHQKK30KKworCitcbWVzc2FnZXtjcm9zcyByZWZlcmVuY2VzLH0KKworXG5ld3dyaXRlXGF1eGZpbGUKKworXG5ld2lmXGlmaGF2ZXhyZWZzICAgICUgVHJ1ZSBpZiB4cmVmIHZhbHVlcyBhcmUga25vd24uCitcbmV3aWZcaWZ3YXJuZWR4cmVmcyAgJSBUcnVlIGlmIHdlIHdhcm5lZCBvbmNlIHRoYXQgdGhleSBhcmVuJ3Qga25vd24uCisKKyUgQGluZm9yZWYgaXMgcmVsYXRpdmVseSBzaW1wbGUuCitcZGVmXGluZm9yZWYgIzF7XGluZm9yZWZ6enogIzEsLCwsKip9CitcZGVmXGluZm9yZWZ6enogIzEsIzIsIzMsIzQqKntccHV0d29yZFNlZXt9IFxwdXR3b3JkSW5mb3t9IFxwdXR3b3JkZmlsZXt9IFxmaWxle1xpZ25vcmVzcGFjZXMgIzN7fX0sCisgIG5vZGUgXHNhbXB7XGlnbm9yZXNwYWNlcyMxe319fQorCislIEBub2RlJ3Mgb25seSBqb2IgaW4gVGVYIGlzIHRvIGRlZmluZSBcbGFzdG5vZGUsIHdoaWNoIGlzIHVzZWQgaW4KKyUgY3Jvc3MtcmVmZXJlbmNlcy4gIFRoZSBAbm9kZSBsaW5lIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGNvbW1hcywgYW5kCislIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIHNwYWNlcyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hLCBsaWtlOgorJSBAbm9kZSBmb28gLCBiYXIgLCAuLi4KKyUgV2UgZG9uJ3Qgd2FudCBzdWNoIHRyYWlsaW5nIHNwYWNlcyBpbiB0aGUgbm9kZSBuYW1lLgorJQorXHBhcnNlYXJnZGVmXG5vZGV7XGNoZWNrZW52e31cZG9ub2RlICMxICxcZmluaXNobm9kZXBhcnNlfQorJQorJSBhbHNvIHJlbW92ZSBhIHRyYWlsaW5nIGNvbW1hLCBpbiBjYXNlIG9mIHNvbWV0aGluZyBsaWtlIHRoaXM6CislIEBub2RlIEhlbHAtQ3Jvc3MsICAsICAsIENyb3NzLXJlZnMKK1xkZWZcZG9ub2RlIzEgLCMyXGZpbmlzaG5vZGVwYXJzZXtcZG9kb25vZGUgIzEsXGZpbmlzaG5vZGVwYXJzZX0KK1xkZWZcZG9kb25vZGUjMSwjMlxmaW5pc2hub2RlcGFyc2V7XGdkZWZcbGFzdG5vZGV7IzF9fQorCitcbGV0XG53bm9kZT1cbm9kZQorXGxldFxsYXN0bm9kZT1cZW1wdHkKKworJSBXcml0ZSBhIGNyb3NzLXJlZmVyZW5jZSBkZWZpbml0aW9uIGZvciB0aGUgY3VycmVudCBub2RlLiAgIzEgaXMgdGhlCislIHR5cGUgKFludW1iZXJlZCwgWWFwcGVuZGl4LCBZbm90aGluZykuCislCitcZGVmXGRvbm9kZXJlZiMxeyUKKyAgXGlmeFxsYXN0bm9kZVxlbXB0eVxlbHNlCisgICAgXHNldHJlZntcbGFzdG5vZGV9eyMxfSUKKyAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1cZW1wdHkKKyAgXGZpCit9CisKKyUgQGFuY2hvcntOQU1FfSAtLSBkZWZpbmUgeHJlZiB0YXJnZXQgYXQgYXJiaXRyYXJ5IHBvaW50LgorJQorXG5ld2NvdW50XHNhdmVzZnJlZ2lzdGVyCislCitcZGVmXHNhdmVzZntccmVsYXggXGlmaG1vZGUgXHNhdmVzZnJlZ2lzdGVyPVxzcGFjZWZhY3RvciBcZml9CitcZGVmXHJlc3RvcmVzZntccmVsYXggXGlmaG1vZGUgXHNwYWNlZmFjdG9yPVxzYXZlc2ZyZWdpc3RlciBcZml9CitcZGVmXGFuY2hvciMxe1xzYXZlc2YgXHNldHJlZnsjMX17WW5vdGhpbmd9XHJlc3RvcmVzZiBcaWdub3Jlc3BhY2VzfQorCislIFxzZXRyZWZ7TkFNRX17U05UfSBkZWZpbmVzIGEgY3Jvc3MtcmVmZXJlbmNlIHBvaW50IE5BTUUgKGEgbm9kZSBvciBhbgorJSBhbmNob3IpLCB3aGljaCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0czoKKyUgMSkgTkFNRS10aXRsZSAtIHRoZSBjdXJyZW50IHNlY3Rpb25pbmcgbmFtZSB0YWtlbiBmcm9tIFx0aGlzc2VjdGlvbiwKKyUgICAgICAgICAgICAgICAgIG9yIHRoZSBhbmNob3IgbmFtZS4KKyUgMikgTkFNRS1zbnQgICAtIHNlY3Rpb24gbnVtYmVyIGFuZCB0eXBlLCBwYXNzZWQgYXMgdGhlIFNOVCBhcmcsIG9yCislICAgICAgICAgICAgICAgICBlbXB0eSBmb3IgYW5jaG9ycy4KKyUgMykgTkFNRS1wZyAgICAtIHRoZSBwYWdlIG51bWJlci4KKyUKKyUgVGhpcyBpcyBjYWxsZWQgZnJvbSBcZG9ub2RlcmVmLCBcYW5jaG9yLCBhbmQgXGRvZmxvYXQuICBJbiB0aGUgY2FzZSBvZgorJSBmbG9hdHMsIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFydCwgd2hpY2ggaXMgbm90IHdyaXR0ZW4gaGVyZToKKyUgNCkgTkFNRS1sb2YgICAtIHRoZSB0ZXh0IGFzIGl0IHNob3VsZCBhcHBlYXIgaW4gYSBAbGlzdG9mZmxvYXRzLgorJQorXGRlZlxzZXRyZWYjMSMyeyUKKyAgXHBkZm1rZGVzdHsjMX0lCisgIFxpZmxpbmtzCisgICAgeyUKKyAgICAgIFxhdGR1bW1pZXMgICUgcHJlc2VydmUgY29tbWFuZHMsIGJ1dCBkb24ndCBleHBhbmQgdGhlbQorICAgICAgXGVkZWZcd3JpdGV4cmRlZiMjMSMjMnslCisJXHdyaXRlXGF1eGZpbGV7QHhyZGVmeyMxLSUgIzEgb2YgXHNldHJlZiwgZXhwYW5kZWQgYnkgdGhlIFxlZGVmCisJICAjIzF9eyMjMn19JSB0aGVzZSBhcmUgcGFyYW1ldGVycyBvZiBcd3JpdGV4cmRlZgorICAgICAgfSUKKyAgICAgIFx0b2tzMCA9IFxleHBhbmRhZnRlcntcdGhpc3NlY3Rpb259JQorICAgICAgXGltbWVkaWF0ZSBcd3JpdGV4cmRlZnt0aXRsZX17XHRoZVx0b2tzMCB9JQorICAgICAgXGltbWVkaWF0ZSBcd3JpdGV4cmRlZntzbnR9e1xjc25hbWUgIzJcZW5kY3NuYW1lfSUgXFludW1iZXJlZCBldGMuCisgICAgICBcd3JpdGV4cmRlZntwZ317XGZvbGlvfSUgd2lsbCBiZSB3cml0dGVuIGxhdGVyLCBkdXJpbmcgXHNoaXBvdXQKKyAgICB9JQorICBcZmkKK30KKworJSBAeHJlZiwgQHB4cmVmLCBhbmQgQHJlZiBnZW5lcmF0ZSBjcm9zcy1yZWZlcmVuY2VzLiAgRm9yIFx4cmVmWCwgIzEgaXMKKyUgdGhlIG5vZGUgbmFtZSwgIzIgdGhlIG5hbWUgb2YgdGhlIEluZm8gY3Jvc3MtcmVmZXJlbmNlLCAjMyB0aGUgcHJpbnRlZAorJSBub2RlIG5hbWUsICM0IHRoZSBuYW1lIG9mIHRoZSBJbmZvIGZpbGUsICM1IHRoZSBuYW1lIG9mIHRoZSBwcmludGVkCislIG1hbnVhbC4gIEFsbCBidXQgdGhlIG5vZGUgbmFtZSBjYW4gYmUgb21pdHRlZC4KKyUKK1xkZWZccHhyZWYjMXtccHV0d29yZHNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQorXGRlZlx4cmVmIzF7XHB1dHdvcmRTZWV7fSBceHJlZlhbIzEsLCwsLCwsXX0KK1xkZWZccmVmIzF7XHhyZWZYWyMxLCwsLCwsLF19CitcZGVmXHhyZWZYWyMxLCMyLCMzLCM0LCM1LCM2XXtcYmVnaW5ncm91cAorICBcdW5zZXBzcGFjZXMKKyAgXGRlZlxwcmludGVkbWFudWFse1xpZ25vcmVzcGFjZXMgIzV9JQorICBcZGVmXHByaW50ZWRyZWZuYW1le1xpZ25vcmVzcGFjZXMgIzN9JQorICBcc2V0Ym94MT1caGJveHtccHJpbnRlZG1hbnVhbFx1bnNraXB9JQorICBcc2V0Ym94MD1caGJveHtccHJpbnRlZHJlZm5hbWVcdW5za2lwfSUKKyAgXGlmZGltIFx3ZDAgPSAwcHQKKyAgICAlIE5vIHByaW50ZWQgbm9kZSBuYW1lIHdhcyBleHBsaWNpdGx5IGdpdmVuLgorICAgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVHhyZWYtYXV0b21hdGljLXNlY3Rpb24tdGl0bGVcZW5kY3NuYW1lXHJlbGF4CisgICAgICAlIFVzZSB0aGUgbm9kZSBuYW1lIGluc2lkZSB0aGUgc3F1YXJlIGJyYWNrZXRzLgorICAgICAgXGRlZlxwcmludGVkcmVmbmFtZXtcaWdub3Jlc3BhY2VzICMxfSUKKyAgICBcZWxzZQorICAgICAgJSBVc2UgdGhlIGFjdHVhbCBjaGFwdGVyL3NlY3Rpb24gdGl0bGUgYXBwZWFyIGluc2lkZQorICAgICAgJSB0aGUgc3F1YXJlIGJyYWNrZXRzLiAgVXNlIHRoZSByZWFsIHNlY3Rpb24gdGl0bGUgaWYgd2UgaGF2ZSBpdC4KKyAgICAgIFxpZmRpbSBcd2QxID4gMHB0CisgICAgICAgICUgSXQgaXMgaW4gYW5vdGhlciBtYW51YWwsIHNvIHdlIGRvbid0IGhhdmUgaXQuCisgICAgICAgIFxkZWZccHJpbnRlZHJlZm5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCisgICAgICBcZWxzZQorICAgICAgICBcaWZoYXZleHJlZnMKKyAgICAgICAgICAlIFdlIGtub3cgdGhlIHJlYWwgdGl0bGUgaWYgd2UgaGF2ZSB0aGUgeHJlZiB2YWx1ZXMuCisgICAgICAgICAgXGRlZlxwcmludGVkcmVmbmFtZXtccmVmeHsjMS10aXRsZX17fX0lCisgICAgICAgIFxlbHNlCisgICAgICAgICAgJSBPdGhlcndpc2UganVzdCBjb3B5IHRoZSBJbmZvIG5vZGUgbmFtZS4KKyAgICAgICAgICBcZGVmXHByaW50ZWRyZWZuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQorICAgICAgICBcZmklCisgICAgICBcZmkKKyAgICBcZmkKKyAgXGZpCisgICUKKyAgJSBNYWtlIGxpbmsgaW4gcGRmIG91dHB1dC4KKyAgXGlmcGRmCisgICAgXGxlYXZldm1vZGUKKyAgICBcZ2V0ZmlsZW5hbWV7IzR9JQorICAgIHtcdHVybm9mZmFjdGl2ZQorICAgICAlIFNlZSBjb21tZW50cyBhdCBcYWN0aXZlYmFja3NsYXNoZG91YmxlLgorICAgICB7XGFjdGl2ZWJhY2tzbGFzaGRvdWJsZSBceGRlZlxwZGZ4cmVmZGVzdHsjMX0lCisgICAgICBcYmFja3NsYXNocGFyZW5zXHBkZnhyZWZkZXN0fSUKKyAgICAgJQorICAgICBcaWZudW1cZmlsZW5hbWVsZW5ndGg+MAorICAgICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19JQorICAgICAgICAgZ290byBmaWxle1x0aGVcZmlsZW5hbWUucGRmfSBuYW1le1xwZGZ4cmVmZGVzdH0lCisgICAgIFxlbHNlCisgICAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0lCisgICAgICAgICBnb3RvIG5hbWV7XHBkZm1rcGdue1xwZGZ4cmVmZGVzdH19JQorICAgICBcZmkKKyAgICB9JQorICAgIFxsaW5rY29sb3IKKyAgXGZpCisgICUKKyAgJSBGbG9hdCByZWZlcmVuY2VzIGFyZSBwcmludGVkIGNvbXBsZXRlbHkgZGlmZmVyZW50bHk6ICJGaWd1cmUgMS4yIgorICAlIGluc3RlYWQgb2YgIltzb21lbm9kZV0sIHAuMyIuICBXZSBkaXN0aW5ndWlzaCB0aGVtIGJ5IHRoZQorICAlIExBQkVMLXRpdGxlIGJlaW5nIHNldCB0byBhIG1hZ2ljIHN0cmluZy4KKyAgeyUKKyAgICAlIEhhdmUgdG8gb3RoZXJpZnkgZXZlcnl0aGluZyBzcGVjaWFsIHRvIGFsbG93IHRoZSBcY3NuYW1lIHRvCisgICAgJSBpbmNsdWRlIGFuIF8gaW4gdGhlIHhyZWYgbmFtZSwgZXRjLgorICAgIFxpbmRleG5vZm9udHMKKyAgICBcdHVybm9mZmFjdGl2ZQorICAgIFxleHBhbmRhZnRlclxnbG9iYWxcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXFh0aGlzcmVmdGl0bGUKKyAgICAgIFxjc25hbWUgWFIjMS10aXRsZVxlbmRjc25hbWUKKyAgfSUKKyAgXGlmZmxvYXRcWHRoaXNyZWZ0aXRsZQorICAgICUgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBwcmludCBuYW1lICh0aGlyZCBhcmcpIHRvIHRoZSByZWYsCisgICAgJSBwcmludCBpdCBpbnN0ZWFkIG9mIG91ciB1c3VhbCAiRmlndXJlIDEuMiIuCisgICAgXGlmZGltXHdkMCA9IDBwdAorICAgICAgXHJlZnh7IzEtc250fSUKKyAgICBcZWxzZQorICAgICAgXHByaW50ZWRyZWZuYW1lCisgICAgXGZpCisgICAgJQorICAgICUgaWYgdGhlIHVzZXIgYWxzbyBnYXZlIHRoZSBwcmludGVkIG1hbnVhbCBuYW1lIChmaWZ0aCBhcmcpLCBhcHBlbmQKKyAgICAlICJpbiBNQU5VQUxOQU1FIi4KKyAgICBcaWZkaW0gXHdkMSA+IDBwdAorICAgICAgXHNwYWNlIFxwdXR3b3JkaW57fSBcY2l0ZXtccHJpbnRlZG1hbnVhbH0lCisgICAgXGZpCisgIFxlbHNlCisgICAgJSBub2RlL2FuY2hvciAobm9uLWZsb2F0KSByZWZlcmVuY2VzLgorICAgICUKKyAgICAlIElmIHdlIHVzZSBcdW5oYm94MCBhbmQgXHVuaGJveDEgdG8gcHJpbnQgdGhlIG5vZGUgbmFtZXMsIFRlWCBkb2VzIG5vdAorICAgICUgaW5zZXJ0IGVtcHR5IGRpc2NyZXRpb25hcmllcyBhZnRlciBoeXBoZW5zLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwKKyAgICAlIG5vdCBmaW5kIGEgbGluZSBicmVhayBhdCBhIGh5cGhlbiBpbiBhIG5vZGUgbmFtZXMuICBTaW5jZSBzb21lIG1hbnVhbHMKKyAgICAlIGFyZSBiZXN0IHdyaXR0ZW4gd2l0aCBmYWlybHkgbG9uZyBub2RlIG5hbWVzLCBjb250YWluaW5nIGh5cGhlbnMsIHRoaXMKKyAgICAlIGlzIGEgbG9zcy4gIFRoZXJlZm9yZSwgd2UgZ2l2ZSB0aGUgdGV4dCBvZiB0aGUgbm9kZSBuYW1lIGFnYWluLCBzbyBpdAorICAgICUgaXMgYXMgaWYgVGVYIGlzIHNlZWluZyBpdCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgXGlmZGltIFx3ZDEgPiAwcHQKKyAgICAgIFxwdXR3b3Jkc2VjdGlvbnt9IGBgXHByaW50ZWRyZWZuYW1lJycgXHB1dHdvcmRpbnt9IFxjaXRle1xwcmludGVkbWFudWFsfSUKKyAgICBcZWxzZQorICAgICAgJSBfIChmb3IgZXhhbXBsZSkgaGFzIHRvIGJlIHRoZSBjaGFyYWN0ZXIgXyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZQorICAgICAgJSBjb250cm9sIHNlcXVlbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGUsIGJ1dCBpdCBoYXMgdG8gZXhwYW5kCisgICAgICAlIGludG8gdGhlIHVzdWFsIFxsZWF2ZXZtb2RlLi4uXHZydWxlIHN0dWZmIGZvciBwdXJwb3NlcyBvZgorICAgICAgJSBwcmludGluZy4gU28gd2UgXHR1cm5vZmZhY3RpdmUgZm9yIHRoZSBccmVmeC1zbnQsIGJhY2sgb24gZm9yIHRoZQorICAgICAgJSBwcmludGluZywgYmFjayBvZmYgZm9yIHRoZSBccmVmeC1wZy4KKyAgICAgIHtcdHVybm9mZmFjdGl2ZQorICAgICAgICUgT25seSBvdXRwdXQgYSBmb2xsb3dpbmcgc3BhY2UgaWYgdGhlIC1zbnQgcmVmIGlzIG5vbmVtcHR5OyBmb3IKKyAgICAgICAlIEB1bm51bWJlcmVkIGFuZCBAYW5jaG9yLCBpdCB3b24ndCBiZS4KKyAgICAgICBcc2V0Ym94MiA9IFxoYm94e1xpZ25vcmVzcGFjZXMgXHJlZnh7IzEtc250fXt9fSUKKyAgICAgICBcaWZkaW0gXHdkMiA+IDBwdCBccmVmeHsjMS1zbnR9XHNwYWNlXGZpCisgICAgICB9JQorICAgICAgJSBvdXRwdXQgdGhlIGBbbXlub2RlXScgdmlhIGEgbWFjcm8gc28gaXQgY2FuIGJlIG92ZXJyaWRkZW4uCisgICAgICBceHJlZnByaW50bm9kZW5hbWVccHJpbnRlZHJlZm5hbWUKKyAgICAgICUKKyAgICAgICUgQnV0IHdlIGFsd2F5cyB3YW50IGEgY29tbWEgYW5kIGEgc3BhY2U6CisgICAgICAsXHNwYWNlCisgICAgICAlCisgICAgICAlIG91dHB1dCB0aGUgYHBhZ2UgMycuCisgICAgICBcdHVybm9mZmFjdGl2ZSBccHV0d29yZHBhZ2VcdGllXHJlZnh7IzEtcGd9e30lCisgICAgXGZpCisgIFxmaQorICBcZW5kbGluaworXGVuZGdyb3VwfQorCislIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGZyb20gXHhyZWZYIGZvciB0aGUgYFtub2RlbmFtZV0nIHBhcnQgb2YgeHJlZgorJSBvdXRwdXQuICBJdCdzIGEgc2VwYXJhdGUgbWFjcm8gb25seSBzbyBpdCBjYW4gYmUgY2hhbmdlZCBtb3JlIGVhc2lseSwKKyUgc2luY2Ugc3F1YXJlIGJyYWNrZXRzIGRvbid0IHdvcmsgd2VsbCBpbiBzb21lIGRvY3VtZW50cy4gIFBhcnRpY3VsYXJseQorJSBvbmUgdGhhdCBCb2IgaXMgd29ya2luZyBvbiA6KS4KKyUKK1xkZWZceHJlZnByaW50bm9kZW5hbWUjMXtbIzFdfQorCislIFRoaW5ncyByZWZlcnJlZCB0byBieSBcc2V0cmVmLgorJQorXGRlZlxZbm90aGluZ3t9CitcZGVmXFlvbWl0ZnJvbXRvY3t9CitcZGVmXFludW1iZXJlZHslCisgIFxpZm51bVxzZWNubz0wCisgICAgXHB1dHdvcmRDaGFwdGVyQHRpZSBcdGhlXGNoYXBubworICBcZWxzZSBcaWZudW1cc3Vic2Vjbm89MAorICAgIFxwdXR3b3JkU2VjdGlvbkB0aWUgXHRoZVxjaGFwbm8uXHRoZVxzZWNubworICBcZWxzZSBcaWZudW1cc3Vic3Vic2Vjbm89MAorICAgIFxwdXR3b3JkU2VjdGlvbkB0aWUgXHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vCisgIFxlbHNlCisgICAgXHB1dHdvcmRTZWN0aW9uQHRpZSBcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNubworICBcZmlcZmlcZmkKK30KK1xkZWZcWWFwcGVuZGl4eyUKKyAgXGlmbnVtXHNlY25vPTAKKyAgICAgXHB1dHdvcmRBcHBlbmRpeEB0aWUgQGNoYXJcdGhlXGFwcGVuZGl4bm97fSUKKyAgXGVsc2UgXGlmbnVtXHN1YnNlY25vPTAKKyAgICAgXHB1dHdvcmRTZWN0aW9uQHRpZSBAY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vCisgIFxlbHNlIFxpZm51bVxzdWJzdWJzZWNubz0wCisgICAgXHB1dHdvcmRTZWN0aW9uQHRpZSBAY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8KKyAgXGVsc2UKKyAgICBccHV0d29yZFNlY3Rpb25AdGllCisgICAgICBAY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNubworICBcZmlcZmlcZmkKK30KKworJSBEZWZpbmUgXHJlZnh7TkFNRX17U1VGRklYfSB0byByZWZlcmVuY2UgYSBjcm9zcy1yZWZlcmVuY2Ugc3RyaW5nIG5hbWVkIE5BTUUuCislIElmIGl0cyB2YWx1ZSBpcyBub25lbXB0eSwgU1VGRklYIGlzIG91dHB1dCBhZnRlcndhcmQuCislCitcZGVmXHJlZngjMSMyeyUKKyAgeyUKKyAgICBcaW5kZXhub2ZvbnRzCisgICAgXG90aGVyYmFja3NsYXNoCisgICAgXGV4cGFuZGFmdGVyXGdsb2JhbFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcdGhpc3JlZlgKKyAgICAgIFxjc25hbWUgWFIjMVxlbmRjc25hbWUKKyAgfSUKKyAgXGlmeFx0aGlzcmVmWFxyZWxheAorICAgICUgSWYgbm90IGRlZmluZWQsIHNheSBzb21ldGhpbmcgYXQgbGVhc3QuCisgICAgXGFuZ2xlbGVmdCB1blwtZGVcLWZpbmVkXGFuZ2xlcmlnaHQKKyAgICBcaWZsaW5rcworICAgICAgXGlmaGF2ZXhyZWZzCisgICAgICAgIFxtZXNzYWdle1xsaW5lbnVtYmVyIFVuZGVmaW5lZCBjcm9zcyByZWZlcmVuY2UgYCMxJy59JQorICAgICAgXGVsc2UKKyAgICAgICAgXGlmd2FybmVkeHJlZnNcZWxzZQorICAgICAgICAgIFxnbG9iYWxcd2FybmVkeHJlZnN0cnVlCisgICAgICAgICAgXG1lc3NhZ2V7Q3Jvc3MgcmVmZXJlbmNlIHZhbHVlcyB1bmtub3duOyB5b3UgbXVzdCBydW4gVGVYIGFnYWluLn0lCisgICAgICAgIFxmaQorICAgICAgXGZpCisgICAgXGZpCisgIFxlbHNlCisgICAgJSBJdCdzIGRlZmluZWQsIHNvIGp1c3QgdXNlIGl0LgorICAgIFx0aGlzcmVmWAorICBcZmkKKyAgIzIlIE91dHB1dCB0aGUgc3VmZml4IGluIGFueSBjYXNlLgorfQorCislIFRoaXMgaXMgdGhlIG1hY3JvIGludm9rZWQgYnkgZW50cmllcyBpbiB0aGUgYXV4IGZpbGUuICBVc3VhbGx5IGl0J3MKKyUganVzdCBhIFxkZWYgKHdlIHByZXBlbmQgWFIgdG8gdGhlIGNvbnRyb2wgc2VxdWVuY2UgbmFtZSB0byBhdm9pZAorJSBjb2xsaXNpb25zKS4gIEJ1dCBpZiB0aGlzIGlzIGEgZmxvYXQgdHlwZSwgd2UgaGF2ZSBtb3JlIHdvcmsgdG8gZG8uCislCitcZGVmXHhyZGVmIzEjMnslCisgIFxleHBhbmRhZnRlclxnZGVmXGNzbmFtZSBYUiMxXGVuZGNzbmFtZXsjMn0lIHJlbWVtYmVyIHRoaXMgeHJlZiB2YWx1ZS4KKyAgJQorICAlIFdhcyB0aGF0IHhyZWYgY29udHJvbCBzZXF1ZW5jZSB0aGF0IHdlIGp1c3QgZGVmaW5lZCBmb3IgYSBmbG9hdD8KKyAgXGV4cGFuZGFmdGVyXGlmZmxvYXRcY3NuYW1lIFhSIzFcZW5kY3NuYW1lCisgICAgJSBpdCB3YXMgYSBmbG9hdCwgYW5kIHdlIGhhdmUgdGhlIChzYWZlKSBmbG9hdCB0eXBlIGluIFxpZmZsb2F0dHlwZS4KKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXGZsb2F0bGlzdAorICAgICAgXGNzbmFtZSBmbG9hdGxpc3RcaWZmbG9hdHR5cGVcZW5kY3NuYW1lCisgICAgJQorICAgICUgSXMgdGhpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoaXMgZmxvYXQgdHlwZT8KKyAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGZsb2F0bGlzdFxyZWxheAorICAgICAgXHRva3MwID0ge1xkb30lIHllcywgc28ganVzdCBcZG8KKyAgICBcZWxzZQorICAgICAgJSBoYWQgaXQgYmVmb3JlLCBzbyBwcmVzZXJ2ZSBwcmV2aW91cyBlbGVtZW50cyBpbiBsaXN0LgorICAgICAgXHRva3MwID0gXGV4cGFuZGFmdGVye1xmbG9hdGxpc3RcZG99JQorICAgIFxmaQorICAgICUKKyAgICAlIFJlbWVtYmVyIHRoaXMgeHJlZiBpbiB0aGUgY29udHJvbCBzZXF1ZW5jZSBcZmxvYXRsaXN0RkxPQVRUWVBFLAorICAgICUgZm9yIGxhdGVyIHVzZSBpbiBcbGlzdG9mZmxvYXRzLgorICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBmbG9hdGxpc3RcaWZmbG9hdHR5cGVcZW5kY3NuYW1le1x0aGVcdG9rczB7IzF9fSUKKyAgXGZpCit9CisKKyUgUmVhZCB0aGUgbGFzdCBleGlzdGluZyBhdXggZmlsZSwgaWYgYW55LiAgTm8gZXJyb3IgaWYgbm9uZSBleGlzdHMuCislCitcZGVmXHRyeWF1eGZpbGV7JQorICBcb3BlbmluIDEgXGpvYm5hbWUuYXV4CisgIFxpZmVvZiAxIFxlbHNlCisgICAgXHJlYWRkYXRhZmlsZXthdXh9JQorICAgIFxnbG9iYWxcaGF2ZXhyZWZzdHJ1ZQorICBcZmkKKyAgXGNsb3NlaW4gMQorfQorCitcZGVmXHNldHVwZGF0YWZpbGV7JQorICBcY2F0Y29kZWBcXl5APVxvdGhlcgorICBcY2F0Y29kZWBcXl5BPVxvdGhlcgorICBcY2F0Y29kZWBcXl5CPVxvdGhlcgorICBcY2F0Y29kZWBcXl5DPVxvdGhlcgorICBcY2F0Y29kZWBcXl5EPVxvdGhlcgorICBcY2F0Y29kZWBcXl5FPVxvdGhlcgorICBcY2F0Y29kZWBcXl5GPVxvdGhlcgorICBcY2F0Y29kZWBcXl5HPVxvdGhlcgorICBcY2F0Y29kZWBcXl5IPVxvdGhlcgorICBcY2F0Y29kZWBcXl5LPVxvdGhlcgorICBcY2F0Y29kZWBcXl5MPVxvdGhlcgorICBcY2F0Y29kZWBcXl5OPVxvdGhlcgorICBcY2F0Y29kZWBcXl5QPVxvdGhlcgorICBcY2F0Y29kZWBcXl5RPVxvdGhlcgorICBcY2F0Y29kZWBcXl5SPVxvdGhlcgorICBcY2F0Y29kZWBcXl5TPVxvdGhlcgorICBcY2F0Y29kZWBcXl5UPVxvdGhlcgorICBcY2F0Y29kZWBcXl5VPVxvdGhlcgorICBcY2F0Y29kZWBcXl5WPVxvdGhlcgorICBcY2F0Y29kZWBcXl5XPVxvdGhlcgorICBcY2F0Y29kZWBcXl5YPVxvdGhlcgorICBcY2F0Y29kZWBcXl5aPVxvdGhlcgorICBcY2F0Y29kZWBcXl5bPVxvdGhlcgorICBcY2F0Y29kZWBcXl5cPVxvdGhlcgorICBcY2F0Y29kZWBcXl5dPVxvdGhlcgorICBcY2F0Y29kZWBcXl5ePVxvdGhlcgorICBcY2F0Y29kZWBcXl5fPVxvdGhlcgorICAlIEl0IHdhcyBzdWdnZXN0ZWQgdG8gc2V0IHRoZSBjYXRjb2RlIG9mIF4gdG8gNywgd2hpY2ggd291bGQgYWxsb3cgXl5lNCBldGMuCisgICUgaW4geHJlZiB0YWdzLCBpLmUuLCBub2RlIG5hbWVzLiAgQnV0IHNpbmNlIF5eZTQgbm90YXRpb24gaXNuJ3QKKyAgJSBzdXBwb3J0ZWQgaW4gdGhlIG1haW4gdGV4dCwgaXQgZG9lc24ndCBzZWVtIGRlc2lyYWJsZS4gIEZ1cnRoZXJtb3JlLAorICAlIHRoYXQgaXMgbm90IGVub3VnaDogZm9yIG5vZGUgbmFtZXMgdGhhdCBhY3R1YWxseSBjb250YWluIGEgXgorICAlIGNoYXJhY3Rlciwgd2Ugd291bGQgZW5kIHVwIHdyaXRpbmcgYSBsaW5lIGxpa2UgdGhpczogJ3hyZGVmIHsnaGF0CisgICUgYi10aXRsZX17J2hhdCBifSBhbmQgXHhyZGVmIGRvZXMgYSBcY3NuYW1lLi4uXGVuZGNzbmFtZSBvbiB0aGUgZmlyc3QKKyAgJSBhcmd1bWVudCwgYW5kIFxoYXQgaXMgbm90IGFuIGV4cGFuZGFibGUgY29udHJvbCBzZXF1ZW5jZS4gIEl0IGNvdWxkCisgICUgYWxsIGJlIHdvcmtlZCBvdXQsIGJ1dCB3aHk/ICBFaXRoZXIgd2Ugc3VwcG9ydCBeXiBvciB3ZSBkb24ndC4KKyAgJQorICAlIFRoZSBvdGhlciBjaGFuZ2UgbmVjZXNzYXJ5IGZvciB0aGlzIHdhcyB0byBkZWZpbmUgXGF1eGhhdDoKKyAgJSBcZGVmXGF1eGhhdHtcZGVmXnsnaGF0IH19JSBleHRyYSBzcGFjZSBzbyBvayBpZiBmb2xsb3dlZCBieSBsZXR0ZXIKKyAgJSBhbmQgdGhlbiB0byBjYWxsIFxhdXhoYXQgaW4gXHNldHEuCisgICUKKyAgXGNhdGNvZGVgXF49XG90aGVyCisgICUKKyAgJSBTcGVjaWFsIGNoYXJhY3RlcnMuICBTaG91bGQgYmUgdHVybmVkIG9mZiBhbnl3YXksIGJ1dC4uLgorICBcY2F0Y29kZWBcfj1cb3RoZXIKKyAgXGNhdGNvZGVgXFs9XG90aGVyCisgIFxjYXRjb2RlYFxdPVxvdGhlcgorICBcY2F0Y29kZWBcIj1cb3RoZXIKKyAgXGNhdGNvZGVgXF89XG90aGVyCisgIFxjYXRjb2RlYFx8PVxvdGhlcgorICBcY2F0Y29kZWBcPD1cb3RoZXIKKyAgXGNhdGNvZGVgXD49XG90aGVyCisgIFxjYXRjb2RlYFwkPVxvdGhlcgorICBcY2F0Y29kZWBcIz1cb3RoZXIKKyAgXGNhdGNvZGVgXCY9XG90aGVyCisgIFxjYXRjb2RlYFwlPVxvdGhlcgorICBcY2F0Y29kZWArPVxvdGhlciAlIGF2b2lkIFwrIGZvciBwYXJhbm9pYSBldmVuIHRob3VnaCB3ZSd2ZSB0dXJuZWQgaXQgb2ZmCisgICUKKyAgJSBUaGlzIGlzIHRvIHN1cHBvcnQgXCBpbiBub2RlIG5hbWVzIGFuZCB0aXRsZXMsIHNpbmNlIHRoZSBcCisgICUgY2hhcmFjdGVycyBlbmQgdXAgaW4gYSBcY3NuYW1lLiAgSXQncyBlYXNpZXIgdGhhbgorICAlIGxlYXZpbmcgaXQgYWN0aXZlIGFuZCBtYWtpbmcgaXRzIGFjdGl2ZSBkZWZpbml0aW9uIGFuIGFjdHVhbCBcCisgICUgY2hhcmFjdGVyLiAgV2hhdCBJIGRvbid0IHVuZGVyc3RhbmQgaXMgd2h5IGl0IHdvcmtzIGluIHRoZSAqdmFsdWUqCisgICUgb2YgdGhlIHhyZGVmLiAgU2VlbXMgbGlrZSBpdCBzaG91bGQgYmUgYSBjYXRjb2RlMTIgXCwgYW5kIHRoYXQKKyAgJSBzaG91bGQgbm90IHR5cGVzZXQgcHJvcGVybHkuICBCdXQgaXQgd29ya3MsIHNvIEknbSBtb3Zpbmcgb24gZm9yCisgICUgbm93LiAgLS1rYXJsLCAxNWphbjA0LgorICBcY2F0Y29kZWBcXD1cb3RoZXIKKyAgJQorICAlIE1ha2UgdGhlIGNoYXJhY3RlcnMgMTI4LTI1NSBiZSBwcmludGluZyBjaGFyYWN0ZXJzLgorICB7JQorICAgIFxjb3VudDE9MTI4CisgICAgXGRlZlxsb29weyUKKyAgICAgIFxjYXRjb2RlXGNvdW50MT1cb3RoZXIKKyAgICAgIFxhZHZhbmNlXGNvdW50MSBieSAxCisgICAgICBcaWZudW0gXGNvdW50MTwyNTYgXGxvb3AgXGZpCisgICAgfSUKKyAgfSUKKyAgJQorICAlIEAgaXMgb3VyIGVzY2FwZSBjaGFyYWN0ZXIgaW4gLmF1eCBmaWxlcywgYW5kIHdlIG5lZWQgYnJhY2VzLgorICBcY2F0Y29kZWBcez0xCisgIFxjYXRjb2RlYFx9PTIKKyAgXGNhdGNvZGVgXEA9MAorfQorCitcZGVmXHJlYWRkYXRhZmlsZSMxeyUKK1xiZWdpbmdyb3VwCisgIFxzZXR1cGRhdGFmaWxlCisgIFxpbnB1dFxqb2JuYW1lLiMxCitcZW5kZ3JvdXB9CisKK1xtZXNzYWdle2luc2VydGlvbnMsfQorJSBpbmNsdWRpbmcgZm9vdG5vdGVzLgorCitcbmV3Y291bnQgXGZvb3Rub3Rlbm8KKworJSBUaGUgdHJhaWxpbmcgc3BhY2UgaW4gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGZvciBzdXBlcmVqZWN0IGlzCislIHZpdGFsIGZvciBwcm9wZXIgZmlsbGluZzsgcGFnZXMgY29tZSBvdXQgdW5hbGlnbmVkIHdoZW4geW91IGRvIGEKKyUgcGFnZWFsaWdubWFjcm8gY2FsbCBpZiB0aGF0IHNwYWNlIGJlZm9yZSB0aGUgY2xvc2luZyBicmFjZSBpcworJSByZW1vdmVkLiAoR2VuZXJhbGx5LCBudW1lcmljIGNvbnN0YW50cyBzaG91bGQgYWx3YXlzIGJlIGZvbGxvd2VkIGJ5IGEKKyUgc3BhY2UgdG8gcHJldmVudCBzdHJhbmdlIGV4cGFuc2lvbiBlcnJvcnMuKQorXGRlZlxzdXBlcmVqZWN0e1xwYXJccGVuYWx0eSAtMjAwMDBcZm9vdG5vdGVubyA9MCB9CisKKyUgQGZvb3Rub3Rlc3R5bGUgaXMgbWVhbmluZ2Z1bCBmb3IgaW5mbyBvdXRwdXQgb25seS4KK1xsZXRcZm9vdG5vdGVzdHlsZT1cY29tbWVudAorCit7XGNhdGNvZGUgYFxAPTExCislCislIEF1dG8tbnVtYmVyIGZvb3Rub3Rlcy4gIE90aGVyd2lzZSBsaWtlIHBsYWluLgorXGdkZWZcZm9vdG5vdGV7JQorICBcbGV0XGluZGVudD1ccHRleGluZGVudAorICBcbGV0XG5vaW5kZW50PVxwdGV4bm9pbmRlbnQKKyAgXGdsb2JhbFxhZHZhbmNlXGZvb3Rub3Rlbm8gYnkgXEBuZQorICBcZWRlZlx0aGlzZm9vdG5veyRee1x0aGVcZm9vdG5vdGVub30kfSUKKyAgJQorICAlIEluIGNhc2UgdGhlIGZvb3Rub3RlIGNvbWVzIGF0IHRoZSBlbmQgb2YgYSBzZW50ZW5jZSwgcHJlc2VydmUgdGhlCisgICUgZXh0cmEgc3BhY2luZyBhZnRlciB3ZSBkbyB0aGUgZm9vdG5vdGUgbnVtYmVyLgorICBcbGV0XEBzZlxlbXB0eQorICBcaWZobW9kZVxlZGVmXEBzZntcc3BhY2VmYWN0b3JcdGhlXHNwYWNlZmFjdG9yfVxwdGV4c2xhc2hcZmkKKyAgJQorICAlIFJlbW92ZSBpbmFkdmVydGVudCBibGFuayBzcGFjZSBiZWZvcmUgdHlwZXNldHRpbmcgdGhlIGZvb3Rub3RlIG51bWJlci4KKyAgXHVuc2tpcAorICBcdGhpc2Zvb3Rub1xAc2YKKyAgXGRvZm9vdG5vdGUKK30lCisKKyUgRG9uJ3QgYm90aGVyIHdpdGggdGhlIHRyaWNrZXJ5IGluIHBsYWluLnRleCB0byBub3QgcmVxdWlyZSB0aGUKKyUgZm9vdG5vdGUgdGV4dCBhcyBhIHBhcmFtZXRlci4gIE91ciBmb290bm90ZXMgZG9uJ3QgbmVlZCB0byBiZSBzbyBnZW5lcmFsLgorJQorJSBPaCB5ZXMsIHRoZXkgZG87IG90aGVyd2lzZSwgQGlmc2V0IChhbmQgYW55dGhpbmcgZWxzZSB0aGF0IHVzZXMKKyUgXHBhcnNlYXJnbGluZSkgZmFpbHMgaW5zaWRlIGZvb3Rub3RlcyBiZWNhdXNlIHRoZSB0b2tlbnMgYXJlIGZpeGVkIHdoZW4KKyUgdGhlIGZvb3Rub3RlIGlzIHJlYWQuICAtLWthcmwsIDE2bm92OTYuCislCitcZ2RlZlxkb2Zvb3Rub3RleyUKKyAgXGluc2VydFxmb290aW5zXGJncm91cAorICAlIFdlIHdhbnQgdG8gdHlwZXNldCB0aGlzIHRleHQgYXMgYSBub3JtYWwgcGFyYWdyYXBoLCBldmVuIGlmIHRoZQorICAlIGZvb3Rub3RlIHJlZmVyZW5jZSBvY2N1cnMgaW4gKGZvciBleGFtcGxlKSBhIGRpc3BsYXkgZW52aXJvbm1lbnQuCisgICUgU28gcmVzZXQgc29tZSBwYXJhbWV0ZXJzLgorICBcaHNpemU9XHBhZ2V3aWR0aAorICBcaW50ZXJsaW5lcGVuYWx0eVxpbnRlcmZvb3Rub3RlbGluZXBlbmFsdHkKKyAgXHNwbGl0dG9wc2tpcFxodFxzdHJ1dGJveCAlIHRvcCBiYXNlbGluZSBmb3IgYnJva2VuIGZvb3Rub3RlcworICBcc3BsaXRtYXhkZXB0aFxkcFxzdHJ1dGJveAorICBcZmxvYXRpbmdwZW5hbHR5XEBNTQorICBcbGVmdHNraXBcekBza2lwCisgIFxyaWdodHNraXBcekBza2lwCisgIFxzcGFjZXNraXBcekBza2lwCisgIFx4c3BhY2Vza2lwXHpAc2tpcAorICBccGFyaW5kZW50XGRlZmF1bHRwYXJpbmRlbnQKKyAgJQorICBcc21hbGxmb250cyBccm0KKyAgJQorICAlIEJlY2F1c2Ugd2UgdXNlIGhhbmdpbmcgaW5kZW50YXRpb24gaW4gZm9vdG5vdGVzLCBhIEBub2luZGVudCBhcHBlYXJzCisgICUgdG8gZXhkZW50IHRoaXMgdGV4dCwgc28gbWFrZSBpdCBiZSBhIG5vLW9wLiAgbWFrZWluZm8gZG9lcyBub3QgdXNlCisgICUgaGFuZ2luZyBpbmRlbnRhdGlvbiBzbyBAbm9pbmRlbnQgY2FuIHN0aWxsIGJlIG5lZWRlZCB3aXRoaW4gZm9vdG5vdGUKKyAgJSB0ZXh0IGFmdGVyIGFuIEBleGFtcGxlIG9yIHRoZSBsaWtlIChub3QgdGhhdCB0aGlzIGlzIGdvb2Qgc3R5bGUpLgorICBcbGV0XG5vaW5kZW50ID0gXHJlbGF4CisgICUKKyAgJSBIYW5nIHRoZSBmb290bm90ZSB0ZXh0IG9mZiB0aGUgbnVtYmVyLiAgVXNlIFxldmVyeXBhciBpbiBjYXNlIHRoZQorICAlIGZvb3Rub3RlIGV4dGVuZHMgZm9yIG1vcmUgdGhhbiBvbmUgcGFyYWdyYXBoLgorICBcZXZlcnlwYXIgPSB7XGhhbmd9JQorICBcdGV4dGluZGVudHtcdGhpc2Zvb3Rub30lCisgICUKKyAgJSBEb24ndCBjcmFzaCBpbnRvIHRoZSBsaW5lIGFib3ZlIHRoZSBmb290bm90ZSB0ZXh0LiAgU2luY2UgdGhpcworICAlIGV4cGFuZHMgaW50byBhIGJveCwgaXQgbXVzdCBjb21lIHdpdGhpbiB0aGUgcGFyYWdyYXBoLCBsZXN0IGl0CisgICUgcHJvdmlkZSBhIHBsYWNlIHdoZXJlIFRlWCBjYW4gc3BsaXQgdGhlIGZvb3Rub3RlLgorICBcZm9vdHN0cnV0CisgIFxmdXR1cmVsZXRcbmV4dFxmb0B0Cit9Cit9JWVuZCBcY2F0Y29kZSBgXEA9MTEKKworJSBJbiBjYXNlIGEgQGZvb3Rub3RlIGFwcGVhcnMgaW4gYSB2Ym94LCBzYXZlIHRoZSBmb290bm90ZSB0ZXh0IGFuZCBjcmVhdGUKKyUgdGhlIHJlYWwgXGluc2VydCBqdXN0IGFmdGVyIHRoZSB2Ym94IGZpbmlzaGVkLiAgT3RoZXJ3aXNlLCB0aGUgaW5zZXJ0aW9uCislIHdvdWxkIGJlIGxvc3QuCislIFNpbWlsYXJpbHksIGlmIGEgQGZvb3Rub3RlIGFwcGVhcnMgaW5zaWRlIGFuIGFsaWdubWVudCwgc2F2ZSB0aGUgZm9vdG5vdGUKKyUgdGV4dCB0byBhIGJveCBhbmQgbWFrZSB0aGUgXGluc2VydCB3aGVuIGEgcm93IG9mIHRoZSB0YWJsZSBpcyBmaW5pc2hlZC4KKyUgQW5kIHRoZSBzYW1lIGNhbiBiZSBkb25lIGZvciBvdGhlciBpbnNlcnQgY2xhc3Nlcy4gIC0ta2FzYWwsIDE2bm92MDMuCisKKyUgUmVwbGFjZSB0aGUgXGluc2VydCBwcmltaXRpdmUgYnkgYSBjaGVhdGluZyBtYWNyby4KKyUgRGVlcGVyIGluc2lkZSwganVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgc2F2ZWQgaW5zZXJ0aW9ucyBhcmUgbm90IHNwaWxsZWQKKyUgb3V0IHByZW1hdHVyZWx5LgorJQorXGRlZlxzdGFydHNhdmluZ2luc2VydHN7JQorICBcaWZ4IFxpbnNlcnRccHRleGluc2VydAorICAgIFxsZXRcaW5zZXJ0XHNhdmVpbnNlcnQKKyAgXGVsc2UKKyAgICBcbGV0XGNoZWNraW5zZXJ0c1xyZWxheAorICBcZmkKK30KKworJSBUaGlzIFxpbnNlcnQgcmVwbGFjZW1lbnQgd29ya3MgZm9yIGJvdGggXGluc2VydFxmb290aW5ze2Zvb30gYW5kCislIFxpbnNlcnRcZm9vdGluc1xiZ3JvdXAgZm9vXGVncm91cCwgYnV0IGl0IGRvZXNuJ3Qgd29yayBmb3IgXGluc2VydDI3e2Zvb30uCislCitcZGVmXHNhdmVpbnNlcnQjMXslCisgIFxlZGVmXG5leHR7XG5vZXhwYW5kXHNhdmV0b2JveCBcbWFrZVNBVkVuYW1lIzF9JQorICBcYWZ0ZXJhc3NpZ25tZW50XG5leHQKKyAgJSBzd2FsbG93IHRoZSBsZWZ0IGJyYWNlCisgIFxsZXRcdGVtcCA9Cit9CitcZGVmXG1ha2VTQVZFbmFtZSMxe1xtYWtlY3NuYW1le1NBVkVcZXhwYW5kYWZ0ZXJcZ29iYmxlXHN0cmluZyMxfX0KK1xkZWZcc2F2ZXRvYm94IzF7XGdsb2JhbFxzZXRib3gjMSA9IFx2Ym94XGJncm91cCBcdW52Ym94IzF9CisKK1xkZWZcY2hlY2tzYXZlaW5zIzF7XGlmdm9pZCMxXGVsc2UgXHBsYWNlc2F2ZWlucyMxXGZpfQorCitcZGVmXHBsYWNlc2F2ZWlucyMxeyUKKyAgXHB0ZXhpbnNlcnQgXGNzbmFtZVxleHBhbmRhZnRlclxnb2JibGVzYXZlXHN0cmluZyMxXGVuZGNzbmFtZQorICAgIHtcYm94IzF9JQorfQorCislIGVhdCBAU0FWRSAtLSBiZXdhcmUsIGFsbCBvZiB0aGVtIGhhdmUgY2F0Y29kZSBcb3RoZXI6Cit7CisgIFxkZWZcZG9zcGVjaWFsc3tcZG8gU1xkbyBBXGRvIFZcZG8gRX0gXHVuY2F0Y29kZXNwZWNpYWxzICAlICA7LSkKKyAgXGdkZWZcZ29iYmxlc2F2ZSBAU0FWRXt9Cit9CisKKyUgaW5pdGlhbGl6YXRpb246CitcZGVmXG5ld3NhdmVpbnMgIzF7JQorICBcZWRlZlxuZXh0e1xub2V4cGFuZFxuZXdzYXZlaW5zWCBcbWFrZVNBVkVuYW1lIzF9JQorICBcbmV4dAorfQorXGRlZlxuZXdzYXZlaW5zWCAjMXslCisgIFxjc25hbWUgbmV3Ym94XGVuZGNzbmFtZSAjMSUKKyAgXGV4cGFuZGFmdGVyXGRlZlxleHBhbmRhZnRlclxjaGVja2luc2VydHNcZXhwYW5kYWZ0ZXJ7XGNoZWNraW5zZXJ0cworICAgIFxjaGVja3NhdmVpbnMgIzF9JQorfQorCislIGluaXRpYWxpemU6CitcbGV0XGNoZWNraW5zZXJ0c1xlbXB0eQorXG5ld3NhdmVpbnNcZm9vdGlucworXG5ld3NhdmVpbnNcbWFyZ2luCisKKworJSBAaW1hZ2UuICBXZSB1c2UgdGhlIG1hY3JvcyBmcm9tIGVwc2YudGV4IHRvIHN1cHBvcnQgdGhpcy4KKyUgSWYgZXBzZi50ZXggaXMgbm90IGluc3RhbGxlZCBhbmQgQGltYWdlIGlzIHVzZWQsIHdlIGNvbXBsYWluLgorJQorJSBDaGVjayBmb3IgYW5kIHJlYWQgZXBzZi50ZXggdXAgZnJvbnQuICBJZiB3ZSByZWFkIGl0IG9ubHkgYXQgQGltYWdlCislIHRpbWUsIHdlIG1pZ2h0IGJlIGluc2lkZSBhIGdyb3VwLCBhbmQgdGhlbiBpdHMgZGVmaW5pdGlvbnMgd291bGQgZ2V0CislIHVuZG9uZSBhbmQgdGhlIG5leHQgaW1hZ2Ugd291bGQgZmFpbC4KK1xvcGVuaW4gMSA9IGVwc2YudGV4CitcaWZlb2YgMSBcZWxzZQorICAlIERvIG5vdCBib3RoZXIgc2hvd2luZyBiYW5uZXIgd2l0aCBlcHNmLnRleCB2Mi43ayAoYXZhaWxhYmxlIGluCisgICUgZG9jL2Vwc2YudGV4IGFuZCBvbiBjdGFuKS4KKyAgXGRlZlxlcHNmYW5ub3VuY2V7XHRva3MwID0gfSUKKyAgXGlucHV0IGVwc2YudGV4CitcZmkKK1xjbG9zZWluIDEKKyUKKyUgV2Ugd2lsbCBvbmx5IGNvbXBsYWluIG9uY2UgYWJvdXQgbGFjayBvZiBlcHNmLnRleC4KK1xuZXdpZlxpZndhcm5lZG5vZXBzZgorXG5ld2hlbHBcbm9lcHNmaGVscHtlcHNmLnRleCBtdXN0IGJlIGluc3RhbGxlZCBmb3IgaW1hZ2VzIHRvCisgIHdvcmsuICBJdCBpcyBhbHNvIGluY2x1ZGVkIGluIHRoZSBUZXhpbmZvIGRpc3RyaWJ1dGlvbiwgb3IgeW91IGNhbiBnZXQKKyAgaXQgZnJvbSBmdHA6Ly90dWcub3JnL3RleC9lcHNmLnRleC59CislCitcZGVmXGltYWdlIzF7JQorICBcaWZ4XGVwc2Zib3hcdW5kZWZpbmVkCisgICAgXGlmd2FybmVkbm9lcHNmIFxlbHNlCisgICAgICBcZXJyaGVscCA9IFxub2Vwc2ZoZWxwCisgICAgICBcZXJybWVzc2FnZXtlcHNmLnRleCBub3QgZm91bmQsIGltYWdlcyB3aWxsIGJlIGlnbm9yZWR9JQorICAgICAgXGdsb2JhbFx3YXJuZWRub2Vwc2Z0cnVlCisgICAgXGZpCisgIFxlbHNlCisgICAgXGltYWdleHh4ICMxLCwsLCxcZmluaXNoCisgIFxmaQorfQorJQorJSBBcmd1bWVudHMgdG8gQGltYWdlOgorJSAjMSBpcyAobWFuZGF0b3J5KSBpbWFnZSBmaWxlbmFtZTsgd2UgdGFjayBvbiAuZXBzIGV4dGVuc2lvbi4KKyUgIzIgaXMgKG9wdGlvbmFsKSB3aWR0aCwgIzMgaXMgKG9wdGlvbmFsKSBoZWlnaHQuCislICM0IGlzIChpZ25vcmVkIG9wdGlvbmFsKSBodG1sIGFsdCB0ZXh0LgorJSAjNSBpcyAoaWdub3JlZCBvcHRpb25hbCkgZXh0ZW5zaW9uLgorJSAjNiBpcyBqdXN0IHRoZSB1c3VhbCBleHRyYSBpZ25vcmVkIGFyZyBmb3IgcGFyc2luZyB0aGlzIHN0dWZmLgorXG5ld2lmXGlmaW1hZ2V2bW9kZQorXGRlZlxpbWFnZXh4eCMxLCMyLCMzLCM0LCM1LCM2XGZpbmlzaHtcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcXl5NID0gNSAgICAgJSBpbiBjYXNlIHdlJ3JlIGluc2lkZSBhbiBleGFtcGxlCisgIFxub3JtYWx0dXJub2ZmYWN0aXZlICAlIGFsbG93IF8gZXQgYWwuIGluIG5hbWVzCisgICUgSWYgdGhlIGltYWdlIGlzIGJ5IGl0c2VsZiwgY2VudGVyIGl0LgorICBcaWZ2bW9kZQorICAgIFxpbWFnZXZtb2RldHJ1ZQorICAgIFxub2JyZWFrXGJpZ3NraXAKKyAgICAlIFVzdWFsbHkgd2UnbGwgaGF2ZSB0ZXh0IGFmdGVyIHRoZSBpbWFnZSB3aGljaCB3aWxsIGluc2VydAorICAgICUgXHBhcnNraXAgZ2x1ZSwgc28gaW5zZXJ0IGl0IGhlcmUgdG9vIHRvIGVxdWFsaXplIHRoZSBzcGFjZQorICAgICUgYWJvdmUgYW5kIGJlbG93LgorICAgIFxub2JyZWFrXHZza2lwXHBhcnNraXAKKyAgICBcbm9icmVhaworICAgIFxsaW5lXGJncm91cFxoc3MKKyAgXGZpCisgICUKKyAgJSBPdXRwdXQgdGhlIGltYWdlLgorICBcaWZwZGYKKyAgICBcZG9wZGZpbWFnZXsjMX17IzJ9eyMzfSUKKyAgXGVsc2UKKyAgICAlIFxlcHNmYm94IGl0c2VsZiByZXNldHMgXGVwc2Y/c2l6ZSBhdCBlYWNoIGZpZ3VyZS4KKyAgICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9XGlmZGltXHdkMCA+IDBwdCBcZXBzZnhzaXplPSMyXHJlbGF4IFxmaQorICAgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjM31caWZkaW1cd2QwID4gMHB0IFxlcHNmeXNpemU9IzNccmVsYXggXGZpCisgICAgXGVwc2Zib3h7IzEuZXBzfSUKKyAgXGZpCisgICUKKyAgXGlmaW1hZ2V2bW9kZSBcaHNzIFxlZ3JvdXAgXGJpZ2JyZWFrIFxmaSAgJSBzcGFjZSBhZnRlciB0aGUgaW1hZ2UKK1xlbmRncm91cH0KKworCislIEBmbG9hdCBGTE9BVFRZUEUsTEFCRUwsTE9DIC4uLiBAZW5kIGZsb2F0IGZvciBkaXNwbGF5ZWQgZmlndXJlcywgdGFibGVzLAorJSBldGMuICBXZSBkb24ndCBhY3R1YWxseSBpbXBsZW1lbnQgZmxvYXRpbmcgeWV0LCB3ZSBhbHdheXMgaW5jbHVkZSB0aGUKKyUgZmxvYXQgImhlcmUiLiAgQnV0IGl0IHNlZW1lZCB0aGUgYmVzdCBuYW1lIGZvciB0aGUgZnV0dXJlLgorJQorXGVudnBhcnNlYXJnZGVmXGZsb2F0e1xlYXRjb21tYXNwYWNlXGVhdGNvbW1hc3BhY2VcZG9mbG9hdCMxLCAsICxcZmluaXNofQorCislIFRoZXJlIG1heSBiZSBhIHNwYWNlIGJlZm9yZSBzZWNvbmQgYW5kL29yIHRoaXJkIHBhcmFtZXRlcjsgZGVsZXRlIGl0LgorXGRlZlxlYXRjb21tYXNwYWNlIzEsIHsjMSx9CisKKyUgIzEgaXMgdGhlIG9wdGlvbmFsIEZMT0FUVFlQRSwgdGhlIHRleHQgbGFiZWwgZm9yIHRoaXMgZmxvYXQsIHR5cGljYWxseQorJSAiRmlndXJlIiwgIlRhYmxlIiwgIkV4YW1wbGUiLCBldGMuICBDYW4ndCBjb250YWluIGNvbW1hcy4gIElmIG9taXR0ZWQsCislIHRoaXMgZmxvYXQgd2lsbCBub3QgYmUgbnVtYmVyZWQgYW5kIGNhbm5vdCBiZSByZWZlcnJlZCB0by4KKyUKKyUgIzIgaXMgdGhlIG9wdGlvbmFsIHhyZWYgbGFiZWwuICBBbHNvIG11c3QgYmUgcHJlc2VudCBmb3IgdGhlIGZsb2F0IHRvCislIGJlIHJlZmVyYWJsZS4KKyUKKyUgIzMgaXMgdGhlIG9wdGlvbmFsIHBvc2l0aW9uaW5nIGFyZ3VtZW50OyBmb3Igbm93LCBpdCBpcyBpZ25vcmVkLiAgSXQKKyUgd2lsbCBzb21laG93IHNwZWNpZnkgdGhlIHBvc2l0aW9ucyBhbGxvd2VkIHRvIGZsb2F0IHRvIChoZXJlLCB0b3AsIGJvdHRvbSkuCislCislIFdlIGtlZXAgYSBzZXBhcmF0ZSBjb3VudGVyIGZvciBlYWNoIEZMT0FUVFlQRSwgd2hpY2ggd2UgcmVzZXQgYXQgZWFjaAorJSBjaGFwdGVyLWxldmVsIGNvbW1hbmQuCitcbGV0XHJlc2V0YWxsZmxvYXRub3M9XGVtcHR5CislCitcZGVmXGRvZmxvYXQjMSwjMiwjMywjNFxmaW5pc2h7JQorICBcbGV0XHRoaXNjYXB0aW9uPVxlbXB0eQorICBcbGV0XHRoaXNzaG9ydGNhcHRpb249XGVtcHR5CisgICUKKyAgJSBkb24ndCBsb3NlIGZvb3Rub3RlcyBpbnNpZGUgQGZsb2F0LgorICAlCisgICUgQkVXQVJFOiB3aGVuIHRoZSBmbG9hdHMgc3RhcnQgZmxvYXQsIHdlIGhhdmUgdG8gaXNzdWUgd2FybmluZyB3aGVuZXZlciBhbgorICAlIGluc2VydCBhcHBlYXJzIGluc2lkZSBhIGZsb2F0IHdoaWNoIGNvdWxkIHBvc3NpYmx5IGZsb2F0LiAtLWthc2FsLCAyNm1heTA0CisgICUKKyAgXHN0YXJ0c2F2aW5naW5zZXJ0cworICAlCisgICUgV2UgY2FuJ3QgYmUgdXNlZCBpbnNpZGUgYSBwYXJhZ3JhcGguCisgIFxwYXIKKyAgJQorICBcdnRvcFxiZ3JvdXAKKyAgICBcZGVmXGZsb2F0dHlwZXsjMX0lCisgICAgXGRlZlxmbG9hdGxhYmVseyMyfSUKKyAgICBcZGVmXGZsb2F0bG9jeyMzfSUgd2UgZG8gbm90aGluZyB3aXRoIHRoaXMgeWV0LgorICAgICUKKyAgICBcaWZ4XGZsb2F0dHlwZVxlbXB0eQorICAgICAgXGxldFxzYWZlZmxvYXR0eXBlPVxlbXB0eQorICAgIFxlbHNlCisgICAgICB7JQorICAgICAgICAlIHRoZSBmbG9hdHR5cGUgbWlnaHQgaGF2ZSBhY2NlbnRzIG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycywKKyAgICAgICAgJSBidXQgd2UgbmVlZCB0byB1c2UgaXQgaW4gYSBjb250cm9sIHNlcXVlbmNlIG5hbWUuCisgICAgICAgIFxpbmRleG5vZm9udHMKKyAgICAgICAgXHR1cm5vZmZhY3RpdmUKKyAgICAgICAgXHhkZWZcc2FmZWZsb2F0dHlwZXtcZmxvYXR0eXBlfSUKKyAgICAgIH0lCisgICAgXGZpCisgICAgJQorICAgICUgSWYgbGFiZWwgaXMgZ2l2ZW4gYnV0IG5vIHR5cGUsIHdlIGhhbmRsZSB0aGF0IGFzIHRoZSBlbXB0eSB0eXBlLgorICAgIFxpZnhcZmxvYXRsYWJlbFxlbXB0eSBcZWxzZQorICAgICAgJSBXZSB3YW50IGVhY2ggRkxPQVRUWVBFIHRvIGJlIG51bWJlcmVkIHNlcGFyYXRlbHkgKEZpZ3VyZSAxLAorICAgICAgJSBUYWJsZSAxLCBGaWd1cmUgMiwgLi4uKS4gIChBbmQgaWYgbm8gbGFiZWwsIG5vIG51bWJlci4pCisgICAgICAlCisgICAgICBcZXhwYW5kYWZ0ZXJcZ2V0ZmxvYXRub1xjc25hbWVcc2FmZWZsb2F0dHlwZSBmbG9hdG5vXGVuZGNzbmFtZQorICAgICAgXGdsb2JhbFxhZHZhbmNlXGZsb2F0bm8gYnkgMQorICAgICAgJQorICAgICAgeyUKKyAgICAgICAgJSBUaGlzIG1hZ2ljIHZhbHVlIGZvciBcdGhpc3NlY3Rpb24gaXMgb3V0cHV0IGJ5IFxzZXRyZWYgYXMgdGhlCisgICAgICAgICUgWFJFRkxBQkVMLXRpdGxlIHZhbHVlLiAgXHhyZWZYIHVzZXMgaXQgdG8gZGlzdGluZ3Vpc2ggZmxvYXQKKyAgICAgICAgJSBsYWJlbHMgKHdoaWNoIGhhdmUgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBvdXRwdXQgZm9ybWF0KSBmcm9tCisgICAgICAgICUgbm9kZSBhbmQgYW5jaG9yIGxhYmVscy4gIEFuZCBceHJkZWYgdXNlcyBpdCB0byBjb25zdHJ1Y3QgdGhlCisgICAgICAgICUgbGlzdHMgb2YgZmxvYXRzLgorICAgICAgICAlCisgICAgICAgIFxlZGVmXHRoaXNzZWN0aW9ue1xmbG9hdG1hZ2ljPVxzYWZlZmxvYXR0eXBlfSUKKyAgICAgICAgXHNldHJlZntcZmxvYXRsYWJlbH17WWZsb2F0fSUKKyAgICAgIH0lCisgICAgXGZpCisgICAgJQorICAgICUgc3RhcnQgd2l0aCBccGFyc2tpcCBnbHVlLCBJIGd1ZXNzLgorICAgIFx2c2tpcFxwYXJza2lwCisgICAgJQorICAgICUgRG9uJ3Qgc3VwcHJlc3MgaW5kZW50YXRpb24gaWYgYSBmbG9hdCBoYXBwZW5zIHRvIHN0YXJ0IGEgc2VjdGlvbi4KKyAgICBccmVzdG9yZWZpcnN0cGFyYWdyYXBoaW5kZW50Cit9CisKKyUgd2UgaGF2ZSB0aGVzZSBwb3NzaWJpbGl0aWVzOgorJSBAZmxvYXQgRm9vLGxibCAmIEBjYXB0aW9ue0NhcH06IEZvbyAxLjE6IENhcAorJSBAZmxvYXQgRm9vLGxibCAmIG5vIGNhcHRpb246ICAgIEZvbyAxLjEKKyUgQGZsb2F0IEZvbyAmIEBjYXB0aW9ue0NhcH06ICAgICBGb286IENhcAorJSBAZmxvYXQgRm9vICYgbm8gY2FwdGlvbjogICAgICAgIEZvbworJSBAZmxvYXQgLGxibCAmIENhcHRpb257Q2FwfTogICAgIDEuMTogQ2FwCislIEBmbG9hdCAsbGJsICYgbm8gY2FwdGlvbjogICAgICAgMS4xCislIEBmbG9hdCAmIEBjYXB0aW9ue0NhcH06ICAgICAgICAgQ2FwCislIEBmbG9hdCAmIG5vIGNhcHRpb246CislCitcZGVmXEVmbG9hdHslCisgICAgXGxldFxmbG9hdGlkZW50ID0gXGVtcHR5CisgICAgJQorICAgICUgSW4gYWxsIGNhc2VzLCBpZiB3ZSBoYXZlIGEgZmxvYXQgdHlwZSwgaXQgY29tZXMgZmlyc3QuCisgICAgXGlmeFxmbG9hdHR5cGVcZW1wdHkgXGVsc2UgXGRlZlxmbG9hdGlkZW50e1xmbG9hdHR5cGV9XGZpCisgICAgJQorICAgICUgSWYgd2UgaGF2ZSBhbiB4cmVmIGxhYmVsLCB0aGUgbnVtYmVyIGNvbWVzIG5leHQuCisgICAgXGlmeFxmbG9hdGxhYmVsXGVtcHR5IFxlbHNlCisgICAgICBcaWZ4XGZsb2F0dHlwZVxlbXB0eSBcZWxzZSAlIGlmIGFsc28gaGFkIGZsb2F0IHR5cGUsIG5lZWQgdGllIGZpcnN0LgorICAgICAgICBcYXBwZW5kdG9tYWNyb1xmbG9hdGlkZW50e1x0aWV9JQorICAgICAgXGZpCisgICAgICAlIHRoZSBudW1iZXIuCisgICAgICBcYXBwZW5kdG9tYWNyb1xmbG9hdGlkZW50e1xjaGFwbGV2ZWxwcmVmaXhcdGhlXGZsb2F0bm99JQorICAgIFxmaQorICAgICUKKyAgICAlIFN0YXJ0IHRoZSBwcmludGVkIGNhcHRpb24gd2l0aCB3aGF0IHdlJ3ZlIGNvbnN0cnVjdGVkIGluCisgICAgJSBcZmxvYXRpZGVudCwgYnV0IGtlZXAgaXQgc2VwYXJhdGU7IHdlIG5lZWQgXGZsb2F0aWRlbnQgYWdhaW4uCisgICAgXGxldFxjYXB0aW9ubGluZSA9IFxmbG9hdGlkZW50CisgICAgJQorICAgIFxpZnhcdGhpc2NhcHRpb25cZW1wdHkgXGVsc2UKKyAgICAgIFxpZnhcZmxvYXRpZGVudFxlbXB0eSBcZWxzZQorCVxhcHBlbmR0b21hY3JvXGNhcHRpb25saW5lezogfSUgaGFkIGlkZW50LCBzbyBuZWVkIGEgY29sb24gYmV0d2VlbgorICAgICAgXGZpCisgICAgICAlCisgICAgICAlIGNhcHRpb24gdGV4dC4KKyAgICAgIFxhcHBlbmR0b21hY3JvXGNhcHRpb25saW5le1xzY2FuZXhwXHRoaXNjYXB0aW9ufSUKKyAgICBcZmkKKyAgICAlCisgICAgJSBJZiB3ZSBoYXZlIGFueXRoaW5nIHRvIHByaW50LCBwcmludCBpdCwgd2l0aCBzcGFjZSBiZWZvcmUuCisgICAgJSBFdmVudHVhbGx5IHRoaXMgbmVlZHMgdG8gYmVjb21lIGFuIFxpbnNlcnQuCisgICAgXGlmeFxjYXB0aW9ubGluZVxlbXB0eSBcZWxzZQorICAgICAgXHZza2lwLjVccGFyc2tpcAorICAgICAgXGNhcHRpb25saW5lCisgICAgICAlCisgICAgICAlIFNwYWNlIGJlbG93IGNhcHRpb24uCisgICAgICBcdnNraXBccGFyc2tpcAorICAgIFxmaQorICAgICUKKyAgICAlIElmIGhhdmUgYW4geHJlZiBsYWJlbCwgd3JpdGUgdGhlIGxpc3Qgb2YgZmxvYXRzIGluZm8uICBEbyB0aGlzCisgICAgJSBhZnRlciB0aGUgY2FwdGlvbiwgdG8gYXZvaWQgY2hhbmNlIG9mIGl0IGJlaW5nIGEgYnJlYWtwb2ludC4KKyAgICBcaWZ4XGZsb2F0bGFiZWxcZW1wdHkgXGVsc2UKKyAgICAgICUgV3JpdGUgdGhlIHRleHQgdGhhdCBnb2VzIGluIHRoZSBsb2YgdG8gdGhlIGF1eCBmaWxlIGFzCisgICAgICAlIFxmbG9hdGxhYmVsLWxvZi4gIEJlc2lkZXMgXGZsb2F0aWRlbnQsIHdlIGluY2x1ZGUgdGhlIHNob3J0CisgICAgICAlIGNhcHRpb24gaWYgc3BlY2lmaWVkLCBlbHNlIHRoZSBmdWxsIGNhcHRpb24gaWYgc3BlY2lmaWVkLCBlbHNlIG5vdGhpbmcuCisgICAgICB7JQorICAgICAgICBcYXRkdW1taWVzCisgICAgICAgICUgc2luY2Ugd2UgcmVhZCB0aGUgY2FwdGlvbiB0ZXh0IGluIHRoZSBtYWNybyB3b3JsZCwgd2hlcmUgXl5NCisgICAgICAgICUgaXMgdHVybmVkIGludG8gYSBub3JtYWwgY2hhcmFjdGVyLCB3ZSBoYXZlIHRvIHNjYW4gaXQgYmFjaywgc28KKyAgICAgICAgJSB3ZSBkb24ndCB3cml0ZSB0aGUgbGl0ZXJhbCB0aHJlZSBjaGFyYWN0ZXJzICJeXk0iIGludG8gdGhlIGF1eCBmaWxlLgorCVxzY2FuZXhweyUKKwkgIFx4ZGVmXG5vZXhwYW5kXGd0ZW1weyUKKwkgICAgXGlmeFx0aGlzc2hvcnRjYXB0aW9uXGVtcHR5CisJICAgICAgXHRoaXNjYXB0aW9uCisJICAgIFxlbHNlCisJICAgICAgXHRoaXNzaG9ydGNhcHRpb24KKwkgICAgXGZpCisJICB9JQorCX0lCisgICAgICAgIFxpbW1lZGlhdGVcd3JpdGVcYXV4ZmlsZXtAeHJkZWZ7XGZsb2F0bGFiZWwtbG9mfXtcZmxvYXRpZGVudAorCSAgXGlmeFxndGVtcFxlbXB0eSBcZWxzZSA6IFxndGVtcCBcZml9fSUKKyAgICAgIH0lCisgICAgXGZpCisgIFxlZ3JvdXAgICUgZW5kIG9mIFx2dG9wCisgICUKKyAgJSBwbGFjZSB0aGUgY2FwdHVyZWQgaW5zZXJ0cworICAlCisgICUgQkVXQVJFOiB3aGVuIHRoZSBmbG9hdHMgc3RhcnQgZmxvYXQsIHdlIGhhdmUgdG8gaXNzdWUgd2FybmluZyB3aGVuZXZlciBhbgorICAlIGluc2VydCBhcHBlYXJzIGluc2lkZSBhIGZsb2F0IHdoaWNoIGNvdWxkIHBvc3NpYmx5IGZsb2F0LiAtLWthc2FsLCAyNm1heTA0CisgICUKKyAgXGNoZWNraW5zZXJ0cworfQorCislIEFwcGVuZCB0aGUgdG9rZW5zICMyIHRvIHRoZSBkZWZpbml0aW9uIG9mIG1hY3JvICMxLCBub3QgZXhwYW5kaW5nIGVpdGhlci4KKyUKK1xkZWZcYXBwZW5kdG9tYWNybyMxIzJ7JQorICBcZXhwYW5kYWZ0ZXJcZGVmXGV4cGFuZGFmdGVyIzFcZXhwYW5kYWZ0ZXJ7IzEjMn0lCit9CisKKyUgQGNhcHRpb24sIEBzaG9ydGNhcHRpb24KKyUKK1xkZWZcY2FwdGlvbntcZG9jYXB0aW9uXHRoaXNjYXB0aW9ufQorXGRlZlxzaG9ydGNhcHRpb257XGRvY2FwdGlvblx0aGlzc2hvcnRjYXB0aW9ufQorXGRlZlxkb2NhcHRpb257XGNoZWNrZW52XGZsb2F0IFxiZ3JvdXBcc2NhbmFyZ2N0eHRcZGVmY2FwdGlvbn0KK1xkZWZcZGVmY2FwdGlvbiMxIzJ7XGVncm91cCBcZGVmIzF7IzJ9fQorCislIFRoZSBwYXJhbWV0ZXIgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2UgaWRlbnRpZnlpbmcgdGhlIGNvdW50ZXIgd2UgYXJlCislIGdvaW5nIHRvIHVzZS4gIENyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBhc3NpZ24gaXQgdG8gXGZsb2F0bm8uCitcZGVmXGdldGZsb2F0bm8jMXslCisgIFxpZngjMVxyZWxheAorICAgICAgJSBIYXZlbid0IHNlZW4gdGhpcyBmaWd1cmUgdHlwZSBiZWZvcmUuCisgICAgICBcY3NuYW1lIG5ld2NvdW50XGVuZGNzbmFtZSAjMSUKKyAgICAgICUKKyAgICAgICUgUmVtZW1iZXIgdG8gcmVzZXQgdGhpcyBmbG9hdG5vIGF0IHRoZSBuZXh0IGNoYXAuCisgICAgICBcZXhwYW5kYWZ0ZXJcZ2RlZlxleHBhbmRhZnRlclxyZXNldGFsbGZsb2F0bm9zCisgICAgICAgIFxleHBhbmRhZnRlcntccmVzZXRhbGxmbG9hdG5vcyAjMT0wIH0lCisgIFxmaQorICBcbGV0XGZsb2F0bm8jMSUKK30KKworJSBcc2V0cmVmIGNhbGxzIHRoaXMgdG8gZ2V0IHRoZSBYUkVGTEFCRUwtc250IHZhbHVlLiAgV2Ugd2FudCBhbiBAeHJlZgorJSB0byB0aGUgRkxPQVRMQUJFTCB0byBleHBhbmQgdG8gIkZpZ3VyZSAzLjEiLiAgV2UgY2FsbCBcc2V0cmVmIHdoZW4gd2UKKyUgZmlyc3QgcmVhZCB0aGUgQGZsb2F0IGNvbW1hbmQuCislCitcZGVmXFlmbG9hdHtcZmxvYXR0eXBlQHRpZSBcY2hhcGxldmVscHJlZml4XHRoZVxmbG9hdG5vfSUKKworJSBNYWdpYyBzdHJpbmcgdXNlZCBmb3IgdGhlIFhSRUZMQUJFTC10aXRsZSB2YWx1ZSwgc28gXHhyZWZYIGNhbgorJSBkaXN0aW5ndWlzaCBmbG9hdHMgZnJvbSBvdGhlciB4cmVmIHR5cGVzLgorXGRlZlxmbG9hdG1hZ2ljeyEhZmxvYXQhIX0KKworJSAjMSBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSB3ZSBhcmUgcGFzc2VkOyB3ZSBleHBhbmQgaW50byBhIGNvbmRpdGlvbmFsCislIHdoaWNoIGlzIHRydWUgaWYgIzEgcmVwcmVzZW50cyBhIGZsb2F0IHJlZi4gIFRoYXQgaXMsIHRoZSBtYWdpYworJSBcdGhpc3NlY3Rpb24gdmFsdWUgd2hpY2ggd2UgXHNldHJlZiBhYm92ZS4KKyUKK1xkZWZcaWZmbG9hdCMxe1xleHBhbmRhZnRlclxkb2lmZmxvYXQjMT09XGZpbmlzaH0KKyUKKyUgIzEgaXMgKG1heWJlKSB0aGUgXGZsb2F0bWFnaWMgc3RyaW5nLiAgSWYgc28sICMyIHdpbGwgYmUgdGhlCislIChzYWZlKSBmbG9hdCB0eXBlIGZvciB0aGlzIGZsb2F0LiAgV2Ugc2V0IFxpZmZsb2F0dHlwZSB0byAjMi4KKyUKK1xkZWZcZG9pZmZsb2F0IzE9IzI9IzNcZmluaXNoeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGRlZlxpZmZsb2F0dHlwZXsjMn0lCisgIFxpZnhcdGVtcFxmbG9hdG1hZ2ljCit9CisKKyUgQGxpc3RvZmZsb2F0cyBGTE9BVFRZUEUgLSBwcmludCBhIGxpc3Qgb2YgZmxvYXRzIGxpa2UgYSB0YWJsZSBvZiBjb250ZW50cy4KKyUKK1xwYXJzZWFyZ2RlZlxsaXN0b2ZmbG9hdHN7JQorICBcZGVmXGZsb2F0dHlwZXsjMX0lIGZsb2F0dHlwZQorICB7JQorICAgICUgdGhlIGZsb2F0dHlwZSBtaWdodCBoYXZlIGFjY2VudHMgb3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzLAorICAgICUgYnV0IHdlIG5lZWQgdG8gdXNlIGl0IGluIGEgY29udHJvbCBzZXF1ZW5jZSBuYW1lLgorICAgIFxpbmRleG5vZm9udHMKKyAgICBcdHVybm9mZmFjdGl2ZQorICAgIFx4ZGVmXHNhZmVmbG9hdHR5cGV7XGZsb2F0dHlwZX0lCisgIH0lCisgICUKKyAgJSBceHJkZWYgc2F2ZXMgdGhlIGZsb2F0cyBhcyBhIFxkby1saXN0IGluIFxmbG9hdGxpc3RTQUZFRkxPQVRUWVBFLgorICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBmbG9hdGxpc3Rcc2FmZWZsb2F0dHlwZVxlbmRjc25hbWUgXHJlbGF4CisgICAgXGlmaGF2ZXhyZWZzCisgICAgICAlIGlmIHRoZSB1c2VyIHNhaWQgQGxpc3RvZmZsb2F0cyBmb28gYnV0IG5ldmVyIEBmbG9hdCBmb28uCisgICAgICBcbWVzc2FnZXtcbGluZW51bWJlciBObyBgXHNhZmVmbG9hdHR5cGUnIGZsb2F0cyB0byBsaXN0Ln0lCisgICAgXGZpCisgIFxlbHNlCisgICAgXGJlZ2luZ3JvdXAKKyAgICAgIFxsZWZ0c2tpcD1cdG9jaW5kZW50ICAlIGluZGVudCB0aGVzZSBlbnRyaWVzIGxpa2UgYSB0b2MKKyAgICAgIFxsZXRcZG89XGxpc3RvZmZsb2F0c2RvCisgICAgICBcY3NuYW1lIGZsb2F0bGlzdFxzYWZlZmxvYXR0eXBlXGVuZGNzbmFtZQorICAgIFxlbmRncm91cAorICBcZmkKK30KKworJSBUaGlzIGlzIGNhbGxlZCBvbiBlYWNoIGVudHJ5IGluIGEgbGlzdCBvZiBmbG9hdHMuICBXZSdyZSBwYXNzZWQgdGhlCislIHhyZWYgbGFiZWwsIGluIHRoZSBmb3JtIExBQkVMLXRpdGxlLCB3aGljaCBpcyBob3cgd2Ugc2F2ZSBpdCBpbiB0aGUKKyUgYXV4IGZpbGUuICBXZSBzdHJpcCBvZmYgdGhlIC10aXRsZSBhbmQgbG9vayB1cCBcWFJMQUJFTC1sb2YsIHdoaWNoCislIGhhcyB0aGUgdGV4dCB3ZSdyZSBzdXBwb3NlZCB0byB0eXBlc2V0IGhlcmUuCislCislIEZpZ3VyZXMgd2l0aG91dCB4cmVmIGxhYmVscyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCAoc2luY2UKKyUgdGhleSB3b24ndCBhcHBlYXIgaW4gdGhlIGF1eCBmaWxlKS4KKyUKK1xkZWZcbGlzdG9mZmxvYXRzZG8jMXtcbGlzdG9mZmxvYXRzZG9lbnRyeSMxXGZpbmlzaH0KK1xkZWZcbGlzdG9mZmxvYXRzZG9lbnRyeSMxLXRpdGxlXGZpbmlzaHt7JQorICAlIENhbid0IGZ1bGx5IGV4cGFuZCBYUiMxLWxvZiBiZWNhdXNlIGl0IGNhbiBjb250YWluIGFueXRoaW5nLiAgSnVzdAorICAlIHBhc3MgdGhlIGNvbnRyb2wgc2VxdWVuY2UuICBPbiB0aGUgb3RoZXIgaGFuZCwgWFIjMS1wZyBpcyBqdXN0IHRoZQorICAlIHBhZ2UgbnVtYmVyLCBhbmQgd2Ugd2FudCB0byBmdWxseSBleHBhbmQgdGhhdCBzbyB3ZSBjYW4gZ2V0IGEgbGluaworICAlIGluIHBkZiBvdXRwdXQuCisgIFx0b2tzQSA9IFxleHBhbmRhZnRlcntcY3NuYW1lIFhSIzEtbG9mXGVuZGNzbmFtZX0lCisgICUKKyAgJSB1c2UgdGhlIHNhbWUgXGVudHJ5IG1hY3JvIHdlIHVzZSB0byBnZW5lcmF0ZSB0aGUgVE9DIGFuZCBpbmRleC4KKyAgXGVkZWZcd3JpdGVlbnRyeXtcbm9leHBhbmRcZW50cnl7XHRoZVx0b2tzQX17XGNzbmFtZSBYUiMxLXBnXGVuZGNzbmFtZX19JQorICBcd3JpdGVlbnRyeQorfX0KKworXG1lc3NhZ2V7bG9jYWxpemF0aW9uLH0KKyUgYW5kIGkxOG4uCisKKyUgQGRvY3VtZW50bGFuZ3VhZ2UgaXMgdXN1YWxseSBnaXZlbiB2ZXJ5IGVhcmx5LCBqdXN0IGFmdGVyCislIEBzZXRmaWxlbmFtZS4gIElmIGRvbmUgdG9vIGxhdGUsIGl0IG1heSBub3Qgb3ZlcnJpZGUgZXZlcnl0aGluZworJSBwcm9wZXJseS4gIFNpbmdsZSBhcmd1bWVudCBpcyB0aGUgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLgorJSBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHNldCB1cCBhIGh5cGhlbmF0aW9uIGZpbGUgaGVyZS4KKyUKK1xwYXJzZWFyZ2RlZlxkb2N1bWVudGxhbmd1YWdleyUKKyAgXHRleCAlIHJlYWQgdHhpLT8/LnRleCBmaWxlIGluIHBsYWluIFRlWC4KKyAgICAlIFJlYWQgdGhlIGZpbGUgaWYgaXQgZXhpc3RzLgorICAgIFxvcGVuaW4gMSB0eGktIzEudGV4CisgICAgXGlmZW9mIDEKKyAgICAgIFxlcnJoZWxwID0gXG5vbGFuZ2hlbHAKKyAgICAgIFxlcnJtZXNzYWdle0Nhbm5vdCByZWFkIGxhbmd1YWdlIGZpbGUgdHhpLSMxLnRleH0lCisgICAgXGVsc2UKKyAgICAgIFxpbnB1dCB0eGktIzEudGV4CisgICAgXGZpCisgICAgXGNsb3NlaW4gMQorICBcZW5kZ3JvdXAKK30KK1xuZXdoZWxwXG5vbGFuZ2hlbHB7VGhlIGdpdmVuIGxhbmd1YWdlIGRlZmluaXRpb24gZmlsZSBjYW5ub3QgYmUgZm91bmQgb3IKK2lzIGVtcHR5LiAgTWF5YmUgeW91IG5lZWQgdG8gaW5zdGFsbCBpdD8gIEluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorc2hvdWxkIHdvcmsgaWYgbm93aGVyZSBlbHNlIGRvZXMufQorCisKKyUgQGRvY3VtZW50ZW5jb2Rpbmcgc2hvdWxkIGNoYW5nZSBzb21ldGhpbmcgaW4gVGVYIGV2ZW50dWFsbHksIG1vc3QKKyUgbGlrZWx5LCBidXQgZm9yIG5vdyBqdXN0IHJlY29nbml6ZSBpdC4KK1xsZXRcZG9jdW1lbnRlbmNvZGluZyA9IFxjb21tZW50CisKKworJSBQYWdlIHNpemUgcGFyYW1ldGVycy4KKyUKK1xuZXdkaW1lblxkZWZhdWx0cGFyaW5kZW50IFxkZWZhdWx0cGFyaW5kZW50ID0gMTVwdAorCitcY2hhcGhlYWRpbmdza2lwID0gMTVwdCBwbHVzIDRwdCBtaW51cyAycHQKK1xzZWNoZWFkaW5nc2tpcCA9IDEycHQgcGx1cyAzcHQgbWludXMgMnB0Citcc3Vic2VjaGVhZGluZ3NraXAgPSA5cHQgcGx1cyAycHQgbWludXMgMnB0CisKKyUgUHJldmVudCB1bmRlcmZ1bGwgdmJveCBlcnJvciBtZXNzYWdlcy4KK1x2YmFkbmVzcyA9IDEwMDAwCisKKyUgRG9uJ3QgYmUgc28gZmluaWNreSBhYm91dCB1bmRlcmZ1bGwgaGJveGVzLCBlaXRoZXIuCitcaGJhZG5lc3MgPSAyMDAwCisKKyUgRm9sbG93aW5nIEdlb3JnZSBCdXNoLCBqdXN0IGdldCByaWQgb2Ygd2lkb3dzIGFuZCBvcnBoYW5zLgorXHdpZG93cGVuYWx0eT0xMDAwMAorXGNsdWJwZW5hbHR5PTEwMDAwCisKKyUgVXNlIFRlWCAzLjAncyBcZW1lcmdlbmN5c3RyZXRjaCB0byBoZWxwIGxpbmUgYnJlYWtpbmcsIGJ1dCBpZiB3ZSdyZQorJSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBUZVgsIGRvbid0IGRvIGFueXRoaW5nLiAgV2Ugd2FudCB0aGUgYW1vdW50IG9mCislIHN0cmV0Y2ggYWRkZWQgdG8gZGVwZW5kIG9uIHRoZSBsaW5lIGxlbmd0aCwgaGVuY2UgdGhlIGRlcGVuZGVuY2Ugb24KKyUgXGhzaXplLiAgV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHRoZSBwYXBlciBzaXplIGlzIHNldC4KKyUKK1xkZWZcc2V0ZW1lcmdlbmN5c3RyZXRjaHslCisgIFxpZnhcZW1lcmdlbmN5c3RyZXRjaFx0aGlzaXN1bmRlZmluZWQKKyAgICAlIEFsbG93IHVzIHRvIGFzc2lnbiB0byBcZW1lcmdlbmN5c3RyZXRjaCBhbnl3YXkuCisgICAgXGRlZlxlbWVyZ2VuY3lzdHJldGNoe1xkaW1lbjB9JQorICBcZWxzZQorICAgIFxlbWVyZ2VuY3lzdHJldGNoID0gLjE1XGhzaXplCisgIFxmaQorfQorCislIFBhcmFtZXRlcnMgaW4gb3JkZXI6IDEpIHRleHRoZWlnaHQ7IDIpIHRleHR3aWR0aDsKKyUgMykgdm9mZnNldDsgNCkgaG9mZnNldDsgNSkgYmluZGluZyBvZmZzZXQ7IDYpIHRvcHNraXA7CislIDcpIHBoeXNpY2FsIHBhZ2UgaGVpZ2h0OyA4KSBwaHlzaWNhbCBwYWdlIHdpZHRoLgorJQorJSBXZSBhbHNvIGNhbGwgXHNldGxlYWRpbmd7XHRleHRsZWFkaW5nfSwgc28gdGhlIGNhbGxlciBzaG91bGQgZGVmaW5lCislIFx0ZXh0bGVhZGluZy4gIFRoZSBjYWxsZXIgc2hvdWxkIGFsc28gc2V0IFxwYXJza2lwLgorJQorXGRlZlxpbnRlcm5hbHBhZ2VzaXplcyMxIzIjMyM0IzUjNiM3Izh7JQorICBcdm9mZnNldCA9ICMzXHJlbGF4CisgIFx0b3Bza2lwID0gIzZccmVsYXgKKyAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCisgICUKKyAgXHZzaXplID0gIzFccmVsYXgKKyAgXGFkdmFuY2VcdnNpemUgYnkgXHRvcHNraXAKKyAgXG91dGVydnNpemUgPSBcdnNpemUKKyAgXGFkdmFuY2Vcb3V0ZXJ2c2l6ZSBieSAyXHRvcGFuZGJvdHRvbW1hcmdpbgorICBccGFnZWhlaWdodCA9IFx2c2l6ZQorICAlCisgIFxoc2l6ZSA9ICMyXHJlbGF4CisgIFxvdXRlcmhzaXplID0gXGhzaXplCisgIFxhZHZhbmNlXG91dGVyaHNpemUgYnkgMC41aW4KKyAgXHBhZ2V3aWR0aCA9IFxoc2l6ZQorICAlCisgIFxub3JtYWxvZmZzZXQgPSAjNFxyZWxheAorICBcYmluZGluZ29mZnNldCA9ICM1XHJlbGF4CisgICUKKyAgXGlmcGRmCisgICAgXHBkZnBhZ2VoZWlnaHQgIzdccmVsYXgKKyAgICBccGRmcGFnZXdpZHRoICM4XHJlbGF4CisgIFxmaQorICAlCisgIFxzZXRsZWFkaW5ne1x0ZXh0bGVhZGluZ30KKyAgJQorICBccGFyaW5kZW50ID0gXGRlZmF1bHRwYXJpbmRlbnQKKyAgXHNldGVtZXJnZW5jeXN0cmV0Y2gKK30KKworJSBAbGV0dGVycGFwZXIgKHRoZSBkZWZhdWx0KS4KK1xkZWZcbGV0dGVycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQorICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKKyAgXHRleHRsZWFkaW5nID0gMTMuMnB0CisgICUKKyAgJSBJZiBwYWdlIGlzIG5vdGhpbmcgYnV0IHRleHQsIG1ha2UgaXQgY29tZSBvdXQgZXZlbi4KKyAgXGludGVybmFscGFnZXNpemVzezQ2XGJhc2VsaW5lc2tpcH17NmlufSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXsuMjVpbn0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17MzZwdH0lCisgICAgICAgICAgICAgICAgICAgIHsxMWlufXs4LjVpbn0lCit9fQorCislIFVzZSBAc21hbGxib29rIHRvIHJlc2V0IHBhcmFtZXRlcnMgZm9yIDd4OS4yNSB0cmltIHNpemUuCitcZGVmXHNtYWxsYm9va3t7XGdsb2JhbGRlZnMgPSAxCisgIFxwYXJza2lwID0gMnB0IHBsdXMgMXB0CisgIFx0ZXh0bGVhZGluZyA9IDEycHQKKyAgJQorICBcaW50ZXJuYWxwYWdlc2l6ZXN7Ny41aW59ezVpbn0lCisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17LjI1aW59JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezE2cHR9JQorICAgICAgICAgICAgICAgICAgICB7OS4yNWlufXs3aW59JQorICAlCisgIFxsaXNwbmFycm93aW5nID0gMC4zaW4KKyAgXHRvbGVyYW5jZSA9IDcwMAorICBcaGZ1enogPSAxcHQKKyAgXGNvbnRlbnRzcmlnaHRtYXJnaW4gPSAwcHQKKyAgXGRlZmJvZHlpbmRlbnQgPSAuNWNtCit9fQorCislIFVzZSBAc21hbGxlcmJvb2sgdG8gcmVzZXQgcGFyYW1ldGVycyBmb3IgNng5IHRyaW0gc2l6ZS4KKyUgKEp1c3QgdGVzdGluZywgcGFyYW1ldGVycyBzdGlsbCBpbiBmbHV4LikKK1xkZWZcc21hbGxlcmJvb2t7e1xnbG9iYWxkZWZzID0gMQorICBccGFyc2tpcCA9IDEuNXB0IHBsdXMgMXB0CisgIFx0ZXh0bGVhZGluZyA9IDEycHQKKyAgJQorICBcaW50ZXJuYWxwYWdlc2l6ZXN7Ny40aW59ezQuOGlufSUKKyAgICAgICAgICAgICAgICAgICAgey0uMmlufXstLjRpbn0lCisgICAgICAgICAgICAgICAgICAgIHswcHR9ezE0cHR9JQorICAgICAgICAgICAgICAgICAgICB7OWlufXs2aW59JQorICAlCisgIFxsaXNwbmFycm93aW5nID0gMC4yNWluCisgIFx0b2xlcmFuY2UgPSA3MDAKKyAgXGhmdXp6ID0gMXB0CisgIFxjb250ZW50c3JpZ2h0bWFyZ2luID0gMHB0CisgIFxkZWZib2R5aW5kZW50ID0gLjRjbQorfX0KKworJSBVc2UgQGFmb3VycGFwZXIgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTQgcGFwZXIuCitcZGVmXGFmb3VycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQorICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKKyAgXHRleHRsZWFkaW5nID0gMTMuMnB0CisgICUKKyAgJSBEb3VibGUtc2lkZSBwcmludGluZyB2aWEgcG9zdHNjcmlwdCBvbiBMYXNlcmpldCA0MDUwCisgICUgcHJpbnRzIGRvdWJsZS1zaWRlZCBuaWNlbHkgd2hlbiBcYmluZGluZ29mZnNldD0xMG1tIGFuZCBcaG9mZnNldD0tNm1tLgorICAlIFRvIGNoYW5nZSB0aGUgc2V0dGluZ3MgZm9yIGEgZGlmZmVyZW50IHByaW50ZXIgb3Igc2l0dWF0aW9uLCBhZGp1c3QKKyAgJSBcbm9ybWFsb2Zmc2V0IHVudGlsIHRoZSBmcm9udC1zaWRlIGFuZCBiYWNrLXNpZGUgdGV4dHMgYWxpZ24uICBUaGVuCisgICUgZG8gdGhlIHNhbWUgZm9yIFxiaW5kaW5nb2Zmc2V0LiAgWW91IGNhbiBzZXQgdGhlc2UgZm9yIHRlc3RpbmcgaW4KKyAgJSB5b3VyIHRleGluZm8gc291cmNlIGZpbGUgbGlrZSB0aGlzOgorICAlIEB0ZXgKKyAgJSBcZ2xvYmFsXG5vcm1hbG9mZnNldCA9IC02bW0KKyAgJSBcZ2xvYmFsXGJpbmRpbmdvZmZzZXQgPSAxMG1tCisgICUgQGVuZCB0ZXgKKyAgXGludGVybmFscGFnZXNpemVzezUxXGJhc2VsaW5lc2tpcH17MTYwbW19CisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17XGhvZmZzZXR9JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezQ0cHR9JQorICAgICAgICAgICAgICAgICAgICB7Mjk3bW19ezIxMG1tfSUKKyAgJQorICBcdG9sZXJhbmNlID0gNzAwCisgIFxoZnV6eiA9IDFwdAorICBcY29udGVudHNyaWdodG1hcmdpbiA9IDBwdAorICBcZGVmYm9keWluZGVudCA9IDVtbQorfX0KKworJSBVc2UgQGFmaXZlcGFwZXIgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTUgcGFwZXIuCislIEZyb20gcm9taWxkb0B1cmFuby5pY2ViLnVmb3AuYnIsIDIgSnVseSAyMDAwLgorJSBIZSBhbHNvIHJlY29tbWVuZHMgbWFraW5nIEBleGFtcGxlIGFuZCBAbGlzcCBiZSBzbWFsbC4KK1xkZWZcYWZpdmVwYXBlcnt7XGdsb2JhbGRlZnMgPSAxCisgIFxwYXJza2lwID0gMnB0IHBsdXMgMXB0IG1pbnVzIDAuMXB0CisgIFx0ZXh0bGVhZGluZyA9IDEyLjVwdAorICAlCisgIFxpbnRlcm5hbHBhZ2VzaXplc3sxNjBtbX17MTIwbW19JQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9e1xob2Zmc2V0fSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXs4cHR9JQorICAgICAgICAgICAgICAgICAgICB7MjEwbW19ezE0OG1tfSUKKyAgJQorICBcbGlzcG5hcnJvd2luZyA9IDAuMmluCisgIFx0b2xlcmFuY2UgPSA4MDAKKyAgXGhmdXp6ID0gMS4ycHQKKyAgXGNvbnRlbnRzcmlnaHRtYXJnaW4gPSAwcHQKKyAgXGRlZmJvZHlpbmRlbnQgPSAybW0KKyAgXHRhYmxlaW5kZW50ID0gMTJtbQorfX0KKworJSBBIHNwZWNpZmljIHRleHQgbGF5b3V0LCAyNHgxNWNtIG92ZXJhbGwsIGludGVuZGVkIGZvciBBNCBwYXBlci4KK1xkZWZcYWZvdXJsYXRleHt7XGdsb2JhbGRlZnMgPSAxCisgIFxhZm91cnBhcGVyCisgIFxpbnRlcm5hbHBhZ2VzaXplc3syMzdtbX17MTUwbW19JQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9ezQuNm1tfSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXs3bW19JQorICAgICAgICAgICAgICAgICAgICB7Mjk3bW19ezIxMG1tfSUKKyAgJQorICAlIE11c3QgZXhwbGljaXRseSByZXNldCB0byAwIGJlY2F1c2Ugd2UgY2FsbCBcYWZvdXJwYXBlci4KKyAgXGdsb2JhbGRlZnMgPSAwCit9fQorCislIFVzZSBAYWZvdXJ3aWRlIHRvIHByaW50IG9uIEE0IHBhcGVyIGluIGxhbmRzY2FwZSBmb3JtYXQuCitcZGVmXGFmb3Vyd2lkZXt7XGdsb2JhbGRlZnMgPSAxCisgIFxhZm91cnBhcGVyCisgIFxpbnRlcm5hbHBhZ2VzaXplc3syNDFtbX17MTY1bW19JQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9ey0yLjk1bW19JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezdtbX0lCisgICAgICAgICAgICAgICAgICAgIHsyOTdtbX17MjEwbW19JQorICBcZ2xvYmFsZGVmcyA9IDAKK319CisKKyUgQHBhZ2VzaXplcyBURVhUSEVJR0hUWyxURVhUV0lEVEhdCislIFBlcmhhcHMgd2Ugc2hvdWxkIGFsbG93IHNldHRpbmcgdGhlIG1hcmdpbnMsIFx0b3Bza2lwLCBccGFyc2tpcCwKKyUgYW5kL29yIGxlYWRpbmcsIGFsc28uIE9yIHBlcmhhcHMgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlbSBzb21laG93LgorJQorXHBhcnNlYXJnZGVmXHBhZ2VzaXplc3tccGFnZXNpemVzeXl5ICMxLCxcZmluaXNofQorXGRlZlxwYWdlc2l6ZXN5eXkjMSwjMiwjM1xmaW5pc2h7eyUKKyAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfVxpZmRpbVx3ZDAgPiAwcHQgXGhzaXplPSMyXHJlbGF4IFxmaQorICBcZ2xvYmFsZGVmcyA9IDEKKyAgJQorICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKKyAgXHNldGxlYWRpbmd7XHRleHRsZWFkaW5nfSUKKyAgJQorICBcZGltZW4wID0gIzEKKyAgXGFkdmFuY2VcZGltZW4wIGJ5IFx2b2Zmc2V0CisgICUKKyAgXGRpbWVuMiA9IFxoc2l6ZQorICBcYWR2YW5jZVxkaW1lbjIgYnkgXG5vcm1hbG9mZnNldAorICAlCisgIFxpbnRlcm5hbHBhZ2VzaXplc3sjMX17XGhzaXplfSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXtcbm9ybWFsb2Zmc2V0fSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXs0NHB0fSUKKyAgICAgICAgICAgICAgICAgICAge1xkaW1lbjB9e1xkaW1lbjJ9JQorfX0KKworJSBTZXQgZGVmYXVsdCB0byBsZXR0ZXIuCislCitcbGV0dGVycGFwZXIKKworCitcbWVzc2FnZXthbmQgdHVybmluZyBvbiB0ZXhpbmZvIGlucHV0IGZvcm1hdC59CisKKyUgRGVmaW5lIG1hY3JvcyB0byBvdXRwdXQgdmFyaW91cyBjaGFyYWN0ZXJzIHdpdGggY2F0Y29kZSBmb3Igbm9ybWFsIHRleHQuCitcY2F0Y29kZWBcIj1cb3RoZXIKK1xjYXRjb2RlYFx+PVxvdGhlcgorXGNhdGNvZGVgXF49XG90aGVyCitcY2F0Y29kZWBcXz1cb3RoZXIKK1xjYXRjb2RlYFx8PVxvdGhlcgorXGNhdGNvZGVgXDw9XG90aGVyCitcY2F0Y29kZWBcPj1cb3RoZXIKK1xjYXRjb2RlYFwrPVxvdGhlcgorXGNhdGNvZGVgXCQ9XG90aGVyCitcZGVmXG5vcm1hbGRvdWJsZXF1b3RleyJ9CitcZGVmXG5vcm1hbHRpbGRle359CitcZGVmXG5vcm1hbGNhcmV0e159CitcZGVmXG5vcm1hbHVuZGVyc2NvcmV7X30KK1xkZWZcbm9ybWFsdmVydGljYWxiYXJ7fH0KK1xkZWZcbm9ybWFsbGVzc3s8fQorXGRlZlxub3JtYWxncmVhdGVyez59CitcZGVmXG5vcm1hbHBsdXN7K30KK1xkZWZcbm9ybWFsZG9sbGFyeyR9JSQgZm9udC1sb2NrIGZpeAorCislIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBtYWtlIGEgY2hhcmFjdGVyIHByaW50IG9uZSB3YXkgaW4gXHR0CislICh3aGVyZSBpdCBjYW4gcHJvYmFibHkgYmUgb3V0cHV0IGFzLWlzKSwgYW5kIGFub3RoZXIgd2F5IGluIG90aGVyIGZvbnRzLAorJSB3aGVyZSBzb21ldGhpbmcgaGFpcmllciBwcm9iYWJseSBuZWVkcyB0byBiZSBkb25lLgorJQorJSAjMSBpcyB3aGF0IHRvIHByaW50IGlmIHdlIGFyZSBpbmRlZWQgdXNpbmcgXHR0OyAjMiBpcyB3aGF0IHRvIHByaW50CislIG90aGVyd2lzZS4gIFNpbmNlIGFsbCB0aGUgQ29tcHV0ZXIgTW9kZXJuIHR5cGV3cml0ZXIgZm9udHMgaGF2ZSB6ZXJvCislIGludGVyd29yZCBzdHJldGNoIChhbmQgc2hyaW5rKSwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0IGFsbAorJSB0eXBld3JpdGVyIGZvbnRzIHRvIGhhdmUgdGhpcywgd2UgY2FuIGNoZWNrIHRoYXQgZm9udCBwYXJhbWV0ZXIuCislCitcZGVmXGlmdXNpbmd0dCMxIzJ7XGlmZGltIFxmb250ZGltZW4zXGZvbnQ9MHB0ICMxXGVsc2UgIzJcZml9CisKKyUgU2FtZSBhcyBhYm92ZSwgYnV0IGNoZWNrIGZvciBpdGFsaWMgZm9udC4gIEFjdHVhbGx5IHRoaXMgYWxzbyBjYXRjaGVzCislIG5vbi1pdGFsaWMgc2xhbnRlZCBmb250cyBzaW5jZSBpdCBpcyBpbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbQorJSBpdGFsaWMgZm9udHMuICBCdXQgc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgYnkgJCBhbmQgaXQgdXNlcyBcc2wgYW55d2F5CislIHRoaXMgaXMgbm90IGEgcHJvYmxlbS4KK1xkZWZcaWZ1c2luZ2l0IzEjMntcaWZkaW0gXGZvbnRkaW1lbjFcZm9udD4wcHQgIzFcZWxzZSAjMlxmaX0KKworJSBUdXJuIG9mZiBhbGwgc3BlY2lhbCBjaGFyYWN0ZXJzIGV4Y2VwdCBACislIChhbmQgdGhvc2Ugd2hpY2ggdGhlIHVzZXIgY2FuIHVzZSBhcyBpZiB0aGV5IHdlcmUgb3JkaW5hcnkpLgorJSBNb3N0IG9mIHRoZXNlIHdlIHNpbXBseSBwcmludCBmcm9tIHRoZSBcdHQgZm9udCwgYnV0IGZvciBzb21lLCB3ZSBjYW4KKyUgdXNlIG1hdGggb3Igb3RoZXIgdmFyaWFudHMgdGhhdCBsb29rIGJldHRlciBpbiBub3JtYWwgdGV4dC4KKworXGNhdGNvZGVgXCI9XGFjdGl2ZQorXGRlZlxhY3RpdmVkb3VibGVxdW90ZXt7XHR0XGNoYXIzNH19CitcbGV0Ij1cYWN0aXZlZG91YmxlcXVvdGUKK1xjYXRjb2RlYFx+PVxhY3RpdmUKK1xkZWZ+e3tcdHRcY2hhcjEyNn19CitcY2hhcmRlZlxoYXQ9YFxeCitcY2F0Y29kZWBcXj1cYWN0aXZlCitcZGVmXnt7XHR0IFxoYXR9fQorCitcY2F0Y29kZWBcXz1cYWN0aXZlCitcZGVmX3tcaWZ1c2luZ3R0XG5vcm1hbHVuZGVyc2NvcmVcX30KK1xsZXRccmVhbHVuZGVyPV8KKyUgU3Vicm91dGluZSBmb3IgdGhlIHByZXZpb3VzIG1hY3JvLgorXGRlZlxfe1xsZWF2ZXZtb2RlIFxrZXJuLjA3ZW0gXHZib3h7XGhydWxlIHdpZHRoLjNlbSBoZWlnaHQuMWV4fVxrZXJuIC4wN2VtIH0KKworXGNhdGNvZGVgXHw9XGFjdGl2ZQorXGRlZnx7e1x0dFxjaGFyMTI0fX0KK1xjaGFyZGVmIFxsZXNzPWBcPAorXGNhdGNvZGVgXDw9XGFjdGl2ZQorXGRlZjx7e1x0dCBcbGVzc319CitcY2hhcmRlZiBcZ3RyPWBcPgorXGNhdGNvZGVgXD49XGFjdGl2ZQorXGRlZj57e1x0dCBcZ3RyfX0KK1xjYXRjb2RlYFwrPVxhY3RpdmUKK1xkZWYre3tcdHQgXGNoYXIgNDN9fQorXGNhdGNvZGVgXCQ9XGFjdGl2ZQorXGRlZiR7XGlmdXNpbmdpdHt7XHNsXCR9fVxub3JtYWxkb2xsYXJ9JSQgZm9udC1sb2NrIGZpeAorCislIElmIGEgLmZtdCBmaWxlIGlzIGJlaW5nIHVzZWQsIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgaW4gYSBmaWxlCislIG5hbWUgY2Fubm90IGJlIGFjdGl2ZSB1bnRpbCB3ZSBoYXZlIHBhcnNlZCB0aGUgY29tbWFuZCBsaW5lLgorJSBTbyB0dXJuIHRoZW0gb2ZmIGFnYWluLCBhbmQgaGF2ZSBcZXZlcnlqb2IgKG9yIEBzZXRmaWxlbmFtZSkgdHVybiB0aGVtIG9uLgorJSBcb3RoZXJpZnlhY3RpdmUgaXMgY2FsbGVkIG5lYXIgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCitcZGVmXG90aGVyaWZ5YWN0aXZle1xjYXRjb2RlYCs9XG90aGVyIFxjYXRjb2RlYFxfPVxvdGhlcn0KKworXGNhdGNvZGVgXEA9MAorCislIFxiYWNrc2xhc2hjdXJmb250IG91dHB1dHMgb25lIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaW4gY3VycmVudCBmb250LAorJSBhcyBpbiBcY2hhcmBcXC4KK1xnbG9iYWxcY2hhcmRlZlxiYWNrc2xhc2hjdXJmb250PWBcXAorXGdsb2JhbFxsZXRccmF3YmFja3NsYXNoeHg9XGJhY2tzbGFzaGN1cmZvbnQgICUgbGV0IGV4aXN0aW5nIC4/P3MgZmlsZXMgd29yaworCislIFxyYXdiYWNrc2xhc2ggZGVmaW5lcyBhbiBhY3RpdmUgXCB0byBkbyBcYmFja3NsYXNoY3VyZm9udC4KKyUgXG90aGVyYmFja3NsYXNoIGRlZmluZXMgYW4gYWN0aXZlIFwgdG8gYmUgYSBsaXRlcmFsIGBcJyBjaGFyYWN0ZXIgd2l0aAorJSBjYXRjb2RlIG90aGVyLgore1xjYXRjb2RlYFxcPVxhY3RpdmUKKyBAZ2RlZkByYXdiYWNrc2xhc2h7QGxldFw9QGJhY2tzbGFzaGN1cmZvbnR9CisgQGdkZWZAb3RoZXJiYWNrc2xhc2h7QGxldFw9QHJlYWxiYWNrc2xhc2h9Cit9CisKKyUgXHJlYWxiYWNrc2xhc2ggaXMgYW4gYWN0dWFsIGNoYXJhY3RlciBgXCcgd2l0aCBjYXRjb2RlIG90aGVyLCBhbmQKKyUgXGRvdWJsZWJhY2tzbGFzaCBpcyB0d28gb2YgdGhlbSAoZm9yIHRoZSBwZGYgb3V0bGluZXMpLgore1xjYXRjb2RlYFxcPVxvdGhlciBAZ2RlZkByZWFsYmFja3NsYXNoe1x9IEBnZGVmQGRvdWJsZWJhY2tzbGFzaHtcXH19CisKKyUgXG5vcm1hbGJhY2tzbGFzaCBvdXRwdXRzIG9uZSBiYWNrc2xhc2ggaW4gZml4ZWQgd2lkdGggZm9udC4KK1xkZWZcbm9ybWFsYmFja3NsYXNoe3tcdHRcYmFja3NsYXNoY3VyZm9udH19CisKK1xjYXRjb2RlYFxcPVxhY3RpdmUKKworJSBVc2VkIHNvbWV0aW1lcyB0byB0dXJuIG9mZiAoZWZmZWN0aXZlbHkpIHRoZSBhY3RpdmUgY2hhcmFjdGVycworJSBldmVuIGFmdGVyIHBhcnNpbmcgdGhlbS4KK0BkZWZAdHVybm9mZmFjdGl2ZXslCisgIEBsZXQiPUBub3JtYWxkb3VibGVxdW90ZQorICBAbGV0XD1AcmVhbGJhY2tzbGFzaAorICBAbGV0fj1Abm9ybWFsdGlsZGUKKyAgQGxldF49QG5vcm1hbGNhcmV0CisgIEBsZXRfPUBub3JtYWx1bmRlcnNjb3JlCisgIEBsZXR8PUBub3JtYWx2ZXJ0aWNhbGJhcgorICBAbGV0PD1Abm9ybWFsbGVzcworICBAbGV0Pj1Abm9ybWFsZ3JlYXRlcgorICBAbGV0Kz1Abm9ybWFscGx1cworICBAbGV0JD1Abm9ybWFsZG9sbGFyICUkIGZvbnQtbG9jayBmaXgKKyAgQHVuc2Vwc3BhY2VzCit9CisKKyUgU2FtZSBhcyBAdHVybm9mZmFjdGl2ZSBleGNlcHQgb3V0cHV0cyBcIGFzIHtcdHRcY2hhcmBcXH0gaW5zdGVhZCBvZgorJSB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgYFwnLiAgKFRodXMsIFwgaXMgbm90IGV4cGFuZGFibGUgd2hlbiB0aGlzIGlzIGluCislIGVmZmVjdC4pCislCitAZGVmQG5vcm1hbHR1cm5vZmZhY3RpdmV7QHR1cm5vZmZhY3RpdmUgQGxldFw9QG5vcm1hbGJhY2tzbGFzaH0KKworJSBNYWtlIF8gYW5kICsgXG90aGVyIGNoYXJhY3RlcnMsIHRlbXBvcmFyaWx5LgorJSBUaGlzIGlzIGNhbmNlbGVkIGJ5IEBmaXhiYWNrc2xhc2guCitAb3RoZXJpZnlhY3RpdmUKKworJSBJZiBhIC5mbXQgZmlsZSBpcyBiZWluZyB1c2VkLCB3ZSBkb24ndCB3YW50IHRoZSBgXGlucHV0IHRleGluZm8nIHRvIHNob3cgdXAuCislIFRoYXQgaXMgd2hhdCBcZWF0aW5wdXQgaXMgZm9yOyBhZnRlciB0aGF0LCB0aGUgYFwnIHNob3VsZCByZXZlcnQgdG8gcHJpbnRpbmcKKyUgYSBiYWNrc2xhc2guCislCitAZ2RlZkBlYXRpbnB1dCBpbnB1dCB0ZXhpbmZve0BmaXhiYWNrc2xhc2h9CitAZ2xvYmFsQGxldFwgPSBAZWF0aW5wdXQKKworJSBPbiB0aGUgb3RoZXIgaGFuZCwgcGVyaGFwcyB0aGUgZmlsZSBkaWQgbm90IGhhdmUgYSBgXGlucHV0IHRleGluZm8nLiBUaGVuCislIHRoZSBmaXJzdCBgXHsgaW4gdGhlIGZpbGUgd291bGQgY2F1c2UgYW4gZXJyb3IuIFRoaXMgbWFjcm8gdHJpZXMgdG8gZml4CislIHRoYXQsIGFzc3VtaW5nIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGBcJyBjb3VsZCBwbGF1c2libHkgb2NjdXIuCislIEFsc28gdHVybiBiYWNrIG9uIGFjdGl2ZSBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYXBwZWFyIGluIHRoZSBpbnB1dAorJSBmaWxlIG5hbWUsIGluIGNhc2Ugbm90IHVzaW5nIGEgcHJlLWR1bXBlZCBmb3JtYXQuCislCitAZ2RlZkBmaXhiYWNrc2xhc2h7JQorICBAaWZ4XEBlYXRpbnB1dCBAbGV0XCA9IEBub3JtYWxiYWNrc2xhc2ggQGZpCisgIEBjYXRjb2RlYCs9QGFjdGl2ZQorICBAY2F0Y29kZWBAXz1AYWN0aXZlCit9CisKKyUgU2F5IEBmb28sIG5vdCBcZm9vLCBpbiBlcnJvciBtZXNzYWdlcy4KK0Blc2NhcGVjaGFyID0gYEBACisKKyUgVGhlc2UgbG9vayBvayBpbiBhbGwgZm9udHMsIHNvIGp1c3QgbWFrZSB0aGVtIG5vdCBzcGVjaWFsLgorQGNhdGNvZGVgQCYgPSBAb3RoZXIKK0BjYXRjb2RlYEAjID0gQG90aGVyCitAY2F0Y29kZWBAJSA9IEBvdGhlcgorCisKK0BjIExvY2FsIHZhcmlhYmxlczoKK0BjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKK0BjIHBhZ2UtZGVsaW1pdGVyOiAiXlxcXFxtZXNzYWdlIgorQGMgdGltZS1zdGFtcC1zdGFydDogImRlZlxcXFx0ZXhpbmZvdmVyc2lvbnsiCitAYyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKK0BjIHRpbWUtc3RhbXAtZW5kOiAifSIKK0BjIEVuZDoKKworQGMgdmltOnN3PTI6CisKK0BpZ25vcmUKKyAgIGFyY2gtdGFnOiBlMWIzNmUzMi1jOTZlLTQxMzUtYTQxYS0wYjJlZmEyZWExMTUKK0BlbmQgaWdub3JlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy9yYmZmaS5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvcmJmZmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmZlNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvcmJmZmkuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBXYXluZSBNZWlzc25lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEzLCBSdWJ5IEZGSSBwcm9qZWN0IGNvbnRyaWJ1dG9ycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJCRkZJX1JCRkZJX0gKKyNkZWZpbmUJUkJGRklfUkJGRklfSAorCisjaW5jbHVkZSA8cnVieS5oPgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgTUFYX1BBUkFNRVRFUlMgKDMyKQorCitleHRlcm4gVkFMVUUgcmJmZmlfRkZJTW9kdWxlOworICAgIAorZXh0ZXJuIHZvaWQgcmJmZmlfVHlwZV9Jbml0KFZBTFVFIGZmaU1vZHVsZSk7CitleHRlcm4gdm9pZCByYmZmaV9CdWZmZXJfSW5pdChWQUxVRSBmZmlNb2R1bGUpOworZXh0ZXJuIHZvaWQgcmJmZmlfSW52b2tlcl9Jbml0KFZBTFVFIGZmaU1vZHVsZSk7CitleHRlcm4gdm9pZCByYmZmaV9WYXJpYWRpY19Jbml0KFZBTFVFIGZmaU1vZHVsZSk7CitleHRlcm4gdm9pZCByYmZmaV9EYXRhQ29udmVydGVyX0luaXQoVkFMVUUgZmZpTW9kdWxlKTsKK2V4dGVybiBWQUxVRSByYmZmaV9BYnN0cmFjdE1lbW9yeUNsYXNzLCByYmZmaV9JbnZva2VyQ2xhc3M7CitleHRlcm4gaW50IHJiZmZpX3R5cGVfc2l6ZShWQUxVRSB0eXBlKTsKK2V4dGVybiB2b2lkIHJiZmZpX1RocmVhZF9Jbml0KFZBTFVFIG1vZHVsZUZGSSk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBSQkZGSV9SQkZGSV9IICovCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL3JiZmZpX2VuZGlhbi5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2MvcmJmZmlfZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiODQyMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL3JiZmZpX2VuZGlhbi5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgSkZGSV9FTkRJQU5fSAorI2RlZmluZSBKRkZJX0VORElBTl9ICisKKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fR05VX18pIHx8IGRlZmluZWQoX19HTElCQ19fKSB8fCBkZWZpbmVkKF9fSEFJS1VfXykKKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjIGlmICFkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorIyAgZGVmaW5lIExJVFRMRV9FTkRJQU4gX19MSVRUTEVfRU5ESUFOCisjIGVuZGlmCisjIGlmICFkZWZpbmVkKEJJR19FTkRJQU4pICYmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorIyAgZGVmaW5lIEJJR19FTkRJQU4gX19CSUdfRU5ESUFOCisjIGVuZGlmCisjIGlmICFkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoX19CWVRFX09SREVSKQorIyAgZGVmaW5lIEJZVEVfT1JERVIgX19CWVRFX09SREVSCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fc3VuCisjIGluY2x1ZGUgPHN5cy9ieXRlb3JkZXIuaD4KKyMgZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAorIyBkZWZpbmUgQklHX0VORElBTiA0MzIxCisjIGlmIGRlZmluZWQoX0JJR19FTkRJQU4pCisjICBkZWZpbmUgQllURV9PUkRFUiBCSUdfRU5ESUFOCisjIGVsaWYgZGVmaW5lZChfTElUVExFX0VORElBTikKKyMgIGRlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyMgZWxzZQorIyAgZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFuLW5lc3MiCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0FJWCkgJiYgIWRlZmluZWQoQllURV9PUkRFUikKKyMgZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAorIyBkZWZpbmUgQklHX0VORElBTiA0MzIxCisjIGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCisjICBkZWZpbmUgQllURV9PUkRFUiBCSUdfRU5ESUFOCisjIGVsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykKKyMgIGRlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyMgZWxzZQorIyAgZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFuLW5lc3MiCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKQorIyBkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisjIGRlZmluZSBCSUdfRU5ESUFOIDQzMjEKKyMgZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChCWVRFX09SREVSKSB8fCAhZGVmaW5lZChMSVRUTEVfRU5ESUFOKSB8fCAhZGVmaW5lZChCSUdfRU5ESUFOKQorIyAgZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgdGhlIGVuZGlhbi1uZXNzIG9mIHRoaXMgcGxhdGZvcm0iCisjZW5kaWYKKworI2VuZGlmIC8qIEpGRklfRU5ESUFOX0ggKi8KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2Mvd2luMzIvc3RkYm9vbC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2Mvd2luMzIvc3RkYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMzBhOGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2V4dC9mZmlfYy93aW4zMi9zdGRib29sLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIEZGSV9TVERCT09MX0gKKyNkZWZpbmUgRkZJX1NUREJPT0xfSAorCit0eXBlZGVmIGludCBib29sOworI2RlZmluZSB0cnVlIDEKKyNkZWZpbmUgZmFsc2UgMAorCisjZW5kaWYgLyogRkZJX1NUREJPT0xfSCAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL3dpbjMyL3N0ZGludC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9leHQvZmZpX2Mvd2luMzIvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNzQ1NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZXh0L2ZmaV9jL3dpbjMyL3N0ZGludC5oCkBAIC0wLDAgKzEsMjAxIEBACisvKiBzdGRpbnQuaCBzdGFuZGFyZCBoZWFkZXIgKi8KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoSU5UOF9NSU4pCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX1NURElOVAorI2RlZmluZSBfU1RESU5UCisjaWZuZGVmIFJDX0lOVk9LRUQKKyNpbmNsdWRlIDx5dmFscy5oPgorCisvKiBOQjogYXNzdW1lcworCWJ5dGUgaGFzIDggYml0cworCWxvbmcgaXMgMzIgYml0cworCXBvaW50ZXIgY2FuIGNvbnZlcnQgdG8gYW5kIGZyb20gbG9uZyBsb25nCisJbG9uZyBsb25nIGlzIGxvbmdlc3QgdHlwZQorICovCisKK19DX1NURF9CRUdJTgorCQkvKiBUWVBFIERFRklOSVRJT05TICovCit0eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKK3R5cGVkZWYgc2hvcnQgaW50MTZfdDsKK3R5cGVkZWYgaW50IGludDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OworCit0eXBlZGVmIHNpZ25lZCBjaGFyIGludF9sZWFzdDhfdDsKK3R5cGVkZWYgc2hvcnQgaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgaW50IGludF9sZWFzdDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50X2xlYXN0OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnRfbGVhc3QzMl90OworCit0eXBlZGVmIGNoYXIgaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIGludCBpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGludCBpbnRfZmFzdDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludF9mYXN0MzJfdDsKKworI2lmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAorICNkZWZpbmUgX0lOVFBUUl9UX0RFRklORUQKKyAjaWZkZWYgX1dJTjY0Cit0eXBlZGVmIF9faW50NjQgaW50cHRyX3Q7CisgI2Vsc2UgLyogX1dJTjY0ICovCit0eXBlZGVmIF9XNjQgaW50IGludHB0cl90OworICNlbmRpZiAvKiBfV0lONjQgKi8KKyNlbmRpZiAvKiBfSU5UUFRSX1RfREVGSU5FRCAqLworCisjaWZuZGVmIF9VSU5UUFRSX1RfREVGSU5FRAorICNkZWZpbmUgX1VJTlRQVFJfVF9ERUZJTkVECisgI2lmZGVmIF9XSU42NAordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnRwdHJfdDsKKyAjZWxzZSAvKiBfV0lONjQgKi8KK3R5cGVkZWYgX1c2NCB1bnNpZ25lZCBpbnQgdWludHB0cl90OworICNlbmRpZiAvKiBfV0lONjQgKi8KKyNlbmRpZiAvKiBfVUlOVFBUUl9UX0RFRklORUQgKi8KKwordHlwZWRlZiBfTG9uZ2xvbmcgaW50NjRfdDsKK3R5cGVkZWYgX1VMb25nbG9uZyB1aW50NjRfdDsKKwordHlwZWRlZiBfTG9uZ2xvbmcgaW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgX1VMb25nbG9uZyB1aW50X2xlYXN0NjRfdDsKKwordHlwZWRlZiBfTG9uZ2xvbmcgaW50X2Zhc3Q2NF90OwordHlwZWRlZiBfVUxvbmdsb25nIHVpbnRfZmFzdDY0X3Q7CisKK3R5cGVkZWYgX0xvbmdsb25nIGludG1heF90OwordHlwZWRlZiBfVUxvbmdsb25nIHVpbnRtYXhfdDsKKworCQkvKiBMSU1JVCBNQUNST1MgKi8KKyNkZWZpbmUgSU5UOF9NSU4JKC0weDdmIC0gX0MyKQorI2RlZmluZSBJTlQxNl9NSU4JKC0weDdmZmYgLSBfQzIpCisjZGVmaW5lIElOVDMyX01JTgkoLTB4N2ZmZmZmZmYgLSBfQzIpCisKKyNkZWZpbmUgSU5UOF9NQVgJMHg3ZgorI2RlZmluZSBJTlQxNl9NQVgJMHg3ZmZmCisjZGVmaW5lIElOVDMyX01BWAkweDdmZmZmZmZmCisjZGVmaW5lIFVJTlQ4X01BWAkweGZmCisjZGVmaW5lIFVJTlQxNl9NQVgJMHhmZmZmCisjZGVmaW5lIFVJTlQzMl9NQVgJMHhmZmZmZmZmZgorCisjZGVmaW5lIElOVF9MRUFTVDhfTUlOCQkoLTB4N2YgLSBfQzIpCisjZGVmaW5lIElOVF9MRUFTVDE2X01JTgkJKC0weDdmZmYgLSBfQzIpCisjZGVmaW5lIElOVF9MRUFTVDMyX01JTgkJKC0weDdmZmZmZmZmIC0gX0MyKQorCisjZGVmaW5lIElOVF9MRUFTVDhfTUFYCQkweDdmCisjZGVmaW5lIElOVF9MRUFTVDE2X01BWAkJMHg3ZmZmCisjZGVmaW5lIElOVF9MRUFTVDMyX01BWAkJMHg3ZmZmZmZmZgorI2RlZmluZSBVSU5UX0xFQVNUOF9NQVgJCTB4ZmYKKyNkZWZpbmUgVUlOVF9MRUFTVDE2X01BWAkweGZmZmYKKyNkZWZpbmUgVUlOVF9MRUFTVDMyX01BWAkweGZmZmZmZmZmCisKKyNkZWZpbmUgSU5UX0ZBU1Q4X01JTgkJKC0weDdmIC0gX0MyKQorI2RlZmluZSBJTlRfRkFTVDE2X01JTgkJKC0weDdmZmYgLSBfQzIpCisjZGVmaW5lIElOVF9GQVNUMzJfTUlOCQkoLTB4N2ZmZmZmZmYgLSBfQzIpCisKKyNkZWZpbmUgSU5UX0ZBU1Q4X01BWAkJMHg3ZgorI2RlZmluZSBJTlRfRkFTVDE2X01BWAkJMHg3ZmZmCisjZGVmaW5lIElOVF9GQVNUMzJfTUFYCQkweDdmZmZmZmZmCisjZGVmaW5lIFVJTlRfRkFTVDhfTUFYCQkweGZmCisjZGVmaW5lIFVJTlRfRkFTVDE2X01BWAkJMHhmZmZmCisjZGVmaW5lIFVJTlRfRkFTVDMyX01BWAkJMHhmZmZmZmZmZgorCisgI2lmIF9JTlRQVFIgPT0gMCB8fCBfSU5UUFRSID09IDEKKyNkZWZpbmUgSU5UUFRSX01BWAkJCTB4N2ZmZmZmZmYKKyNkZWZpbmUgSU5UUFRSX01JTgkJCSgtSU5UUFRSX01BWCAtIF9DMikKKyNkZWZpbmUgVUlOVFBUUl9NQVgJCQkweGZmZmZmZmZmCisKKyAjZWxzZSAvKiBfSU5UUFRSID09IDIgKi8KKyNkZWZpbmUgSU5UUFRSX01JTgkJCSgtX0xMT05HX01BWCAtIF9DMikKKyNkZWZpbmUgSU5UUFRSX01BWAkJCV9MTE9OR19NQVgKKyNkZWZpbmUgVUlOVFBUUl9NQVgJCQlfVUxMT05HX01BWAorI2VuZGlmIC8qIF9JTlRQVFIgKi8KKworI2RlZmluZSBJTlQ4X0MoeCkJKHgpCisjZGVmaW5lIElOVDE2X0MoeCkJKHgpCisjZGVmaW5lIElOVDMyX0MoeCkJKCh4KSArIChJTlQzMl9NQVggLSBJTlQzMl9NQVgpKQorCisjZGVmaW5lIFVJTlQ4X0MoeCkJKHgpCisjZGVmaW5lIFVJTlQxNl9DKHgpCSh4KQorI2RlZmluZSBVSU5UMzJfQyh4KQkoKHgpICsgKFVJTlQzMl9NQVggLSBVSU5UMzJfTUFYKSkKKworI2lmZGVmIF9XSU42NAorICNkZWZpbmUgUFRSRElGRl9NSU4JCUlOVDY0X01JTgorICNkZWZpbmUgUFRSRElGRl9NQVgJCUlOVDY0X01BWAorI2Vsc2UgLyogX1dJTjY0ICovCisgI2RlZmluZSBQVFJESUZGX01JTgkJSU5UMzJfTUlOCisgI2RlZmluZSBQVFJESUZGX01BWAkJSU5UMzJfTUFYCisjZW5kaWYgLyogX1dJTjY0ICovCisKKyNkZWZpbmUgU0lHX0FUT01JQ19NSU4JSU5UMzJfTUlOCisjZGVmaW5lIFNJR19BVE9NSUNfTUFYCUlOVDMyX01BWAorCisjaWZuZGVmIFNJWkVfTUFYCisgI2lmZGVmIF9XSU42NAorICAjZGVmaW5lIFNJWkVfTUFYCQlVSU5UNjRfTUFYCisgI2Vsc2UgLyogX1dJTjY0ICovCisgICNkZWZpbmUgU0laRV9NQVgJCVVJTlQzMl9NQVgKKyAjZW5kaWYgLyogX1dJTjY0ICovCisjZW5kaWYgLyogU0laRV9NQVggKi8KKworI2RlZmluZSBXQ0hBUl9NSU4JMHgwMDAwCisjZGVmaW5lIFdDSEFSX01BWAkweGZmZmYKKworI2RlZmluZSBXSU5UX01JTgkweDAwMDAKKyNkZWZpbmUgV0lOVF9NQVgJMHhmZmZmCisKKyAjZGVmaW5lIElOVDY0X01JTgkoLTB4N2ZmZmZmZmZmZmZmZmZmZiAtIF9DMikKKyAjZGVmaW5lIElOVDY0X01BWAkweDdmZmZmZmZmZmZmZmZmZmYKKyAjZGVmaW5lIFVJTlQ2NF9NQVgJMHhmZmZmZmZmZmZmZmZmZmZmVQorCisgI2RlZmluZSBJTlRfTEVBU1Q2NF9NSU4JKC0weDdmZmZmZmZmZmZmZmZmZmYgLSBfQzIpCisgI2RlZmluZSBJTlRfTEVBU1Q2NF9NQVgJMHg3ZmZmZmZmZmZmZmZmZmZmCisgI2RlZmluZSBVSU5UX0xFQVNUNjRfTUFYCTB4ZmZmZmZmZmZmZmZmZmZmZlUKKworICNkZWZpbmUgSU5UX0ZBU1Q2NF9NSU4JCSgtMHg3ZmZmZmZmZmZmZmZmZmZmIC0gX0MyKQorICNkZWZpbmUgSU5UX0ZBU1Q2NF9NQVgJCTB4N2ZmZmZmZmZmZmZmZmZmZgorICNkZWZpbmUgVUlOVF9GQVNUNjRfTUFYCTB4ZmZmZmZmZmZmZmZmZmZmZlUKKworICNkZWZpbmUgSU5UTUFYX01JTgkJKC0weDdmZmZmZmZmZmZmZmZmZmYgLSBfQzIpCisgI2RlZmluZSBJTlRNQVhfTUFYCQkweDdmZmZmZmZmZmZmZmZmZmYKKyAjZGVmaW5lIFVJTlRNQVhfTUFYCTB4ZmZmZmZmZmZmZmZmZmZmZlUKKworI2RlZmluZSBJTlQ2NF9DKHgpCQkoKHgpICsgKElOVDY0X01BWCAtIElOVDY0X01BWCkpCisjZGVmaW5lIFVJTlQ2NF9DKHgpCQkoKHgpICsgKFVJTlQ2NF9NQVggLSBVSU5UNjRfTUFYKSkKKyNkZWZpbmUgSU5UTUFYX0MoeCkJCUlOVDY0X0MoeCkKKyNkZWZpbmUgVUlOVE1BWF9DKHgpCVVJTlQ2NF9DKHgpCitfQ19TVERfRU5ECisjZW5kaWYgLyogUkNfSU5WT0tFRCAqLworI2VuZGlmIC8qIF9TVERJTlQgKi8KKworICNpZiBkZWZpbmVkKF9TVERfVVNJTkcpCit1c2luZyBfQ1NURCBpbnQ4X3Q7IHVzaW5nIF9DU1REIGludDE2X3Q7Cit1c2luZyBfQ1NURCBpbnQzMl90OyB1c2luZyBfQ1NURCBpbnQ2NF90OworCit1c2luZyBfQ1NURCB1aW50OF90OyB1c2luZyBfQ1NURCB1aW50MTZfdDsKK3VzaW5nIF9DU1REIHVpbnQzMl90OyB1c2luZyBfQ1NURCB1aW50NjRfdDsKKwordXNpbmcgX0NTVEQgaW50X2xlYXN0OF90OyB1c2luZyBfQ1NURCBpbnRfbGVhc3QxNl90OwordXNpbmcgX0NTVEQgaW50X2xlYXN0MzJfdDsgIHVzaW5nIF9DU1REIGludF9sZWFzdDY0X3Q7Cit1c2luZyBfQ1NURCB1aW50X2xlYXN0OF90OyB1c2luZyBfQ1NURCB1aW50X2xlYXN0MTZfdDsKK3VzaW5nIF9DU1REIHVpbnRfbGVhc3QzMl90OyB1c2luZyBfQ1NURCB1aW50X2xlYXN0NjRfdDsKKwordXNpbmcgX0NTVEQgaW50bWF4X3Q7IHVzaW5nIF9DU1REIHVpbnRtYXhfdDsKKwordXNpbmcgX0NTVEQgdWludHB0cl90OwordXNpbmcgX0NTVEQgaW50cHRyX3Q7CisKK3VzaW5nIF9DU1REIGludF9mYXN0OF90OyB1c2luZyBfQ1NURCBpbnRfZmFzdDE2X3Q7Cit1c2luZyBfQ1NURCBpbnRfZmFzdDMyX3Q7IHVzaW5nIF9DU1REIGludF9mYXN0NjRfdDsKK3VzaW5nIF9DU1REIHVpbnRfZmFzdDhfdDsgdXNpbmcgX0NTVEQgdWludF9mYXN0MTZfdDsKK3VzaW5nIF9DU1REIHVpbnRfZmFzdDMyX3Q7IHVzaW5nIF9DU1REIHVpbnRfZmFzdDY0X3Q7CisgI2VuZGlmIC8qIGRlZmluZWQoX1NURF9VU0lORykgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Mi0yMDA5IGJ5IFAuSi4gUGxhdWdlci4gIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBDb25zdWx0IHlvdXIgbGljZW5zZSByZWdhcmRpbmcgcGVybWlzc2lvbnMgYW5kIHJlc3RyaWN0aW9ucy4KK1Y1LjIwOjAwMDkgKi8KKyNlbmRpZiAvKiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoSU5UOF9NSU4pICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9mZmkuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZmZpLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExODkzYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvZmZpLmdlbXNwZWMKQEAgLTAsMCArMSwyMyBAQAorcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9saWIvI3tGaWxlLmJhc2VuYW1lKF9fRklMRV9fLCAnLmdlbXNwZWMnKX0vdmVyc2lvbiIsIF9fRklMRV9fKQorCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICBzLm5hbWUgPSAnZmZpJworICBzLnZlcnNpb24gPSBGRkk6OlZFUlNJT04KKyAgcy5hdXRob3IgPSAnV2F5bmUgTWVpc3NuZXInCisgIHMuZW1haWwgPSAnd21laXNzbmVyQGdtYWlsLmNvbScKKyAgcy5ob21lcGFnZSA9ICdodHRwOi8vd2lraS5naXRodWIuY29tL2ZmaS9mZmknCisgIHMuc3VtbWFyeSA9ICdSdWJ5IEZGSScKKyAgcy5kZXNjcmlwdGlvbiA9ICdSdWJ5IEZGSSBsaWJyYXJ5JworICBzLmZpbGVzID0gJXcoZmZpLmdlbXNwZWMgTElDRU5TRSBDT1BZSU5HIFJFQURNRS5tZCBSYWtlZmlsZSkgKyBEaXIuZ2xvYigie2V4dCxnZW4sbGliLHNwZWMsbGlidGVzdH0vKiovKiIpLnJlamVjdCB7IHxmfCBmID1+IC8obGliXC9bMTJdXC5bMDg5XXxcLnM/W2FvXSR8XC5idW5kbGV8XC5keWxpYiQpLyB9CisgIHMuZXh0ZW5zaW9ucyA8PCAnZXh0L2ZmaV9jL2V4dGNvbmYucmInCisgIHMuaGFzX3Jkb2MgPSBmYWxzZQorICBzLnJkb2Nfb3B0aW9ucyA9ICV3Wy0tZXhjbHVkZT1leHQvZmZpX2MvLipcLm8kIC0tZXhjbHVkZT1mZmlfY1wuKGJ1bmRsZXxzbykkXQorICBzLmxpY2Vuc2UgPSAnQlNELTMtQ2xhdXNlJworICBzLnJlcXVpcmVfcGF0aHMgPDwgJ2V4dC9mZmlfYycKKyAgcy5yZXF1aXJlZF9ydWJ5X3ZlcnNpb24gPSAnPj0gMS44LjcnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3Jha2UnLCAnfj4gMTAuMScKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFrZS1jb21waWxlcicsICd+PiAxLjAnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3Jha2UtY29tcGlsZXItZG9jaycsICd+PiAwLjYuMCcKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncnNwZWMnLCAnfj4gMi4xNC4xJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdydWJ5Z2Vtcy10YXNrcycsICJ+PiAwLjIuNCIKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9nZW4vUmFrZWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2dlbi9SYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzFhMWRhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9nZW4vUmFrZWZpbGUKQEAgLTAsMCArMSwzMCBAQAorJExPQURfUEFUSC51bnNoaWZ0IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4nLCAnbGliJykKK3JlcXVpcmUgJ2ZpbGV1dGlscycKK3JlcXVpcmUgJ2ZmaScKK3JlcXVpcmUgJ2ZmaS9wbGF0Zm9ybScKK3JlcXVpcmUgJ2ZmaS90b29scy90eXBlc19nZW5lcmF0b3InCit0eXBlc19jb25mID0gRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRkZJOjpQbGF0Zm9ybTo6Q09ORl9ESVIsICd0eXBlcy5jb25mJykpCisKK2xvZ2ZpbGUgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJ2xvZycpCisKK2ZpbGUgdHlwZXNfY29uZiBkbyB8dGFza3wKKyAgb3B0aW9ucyA9IHt9CisgIEZpbGVVdGlscy5ta2Rpcl9wKEZpbGUuZGlybmFtZSh0YXNrLm5hbWUpLCB7IDptb2RlID0+IDA3NTUgfSkKKyAgRmlsZS5vcGVuKHRhc2submFtZSwgRmlsZTo6Q1JFQVR8RmlsZTo6VFJVTkN8RmlsZTo6UkRXUiwgMDY0NCkgZG8gfGZ8CisgICAgZi5wdXRzIEZGSTo6VHlwZXNHZW5lcmF0b3IuZ2VuZXJhdGUob3B0aW9ucykKKyAgZW5kCisgIEZpbGUub3Blbihsb2dmaWxlLCAndycpIGRvIHxsb2d8CisgICAgbG9nLnB1dHModHlwZXNfY29uZikKKyAgZW5kCitlbmQKKwordGFzayA6ZGVmYXVsdCA9PiB0eXBlc19jb25mIGRvCitlbmQKKwordGFzayA6Y2xlYW4gZG8KKyAgRmlsZS5yZWFkbGluZXMobG9nZmlsZSkuZWFjaCBkbyB8ZmlsZXwKKyAgICBmaWxlLnN0cmlwIQorICAgIHJtX2YgZmlsZQorICBlbmQKKyAgcm1fZiBsb2dmaWxlCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFlNTNkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpLnJiCkBAIC0wLDAgKzEsMjAgQEAKK2lmICFkZWZpbmVkPyhSVUJZX0VOR0lORSkgfHwgUlVCWV9FTkdJTkUgPT0gJ3J1YnknIHx8IFJVQllfRU5HSU5FID09ICdyYngnCisgIE9iamVjdC5zZW5kKDpyZW1vdmVfY29uc3QsIDpGRkkpIGlmIGRlZmluZWQ/KDo6RkZJKQorICBiZWdpbgorICAgIHJlcXVpcmUgUlVCWV9WRVJTSU9OLnNwbGl0KCcuJylbMCwgMl0uam9pbignLicpICsgJy9mZmlfYycKKyAgcmVzY3VlIEV4Y2VwdGlvbgorICAgIHJlcXVpcmUgJ2ZmaV9jJworICBlbmQKKworICByZXF1aXJlICdmZmkvZmZpJworCitlbHNpZiBkZWZpbmVkPyhSVUJZX0VOR0lORSkKKyAgIyBSZW1vdmUgdGhlIGZmaSBnZW0gZGlyIGZyb20gdGhlIGxvYWQgcGF0aCwgdGhlbiByZWxvYWQgdGhlIGludGVybmFsIGZmaSBpbXBsZW1lbnRhdGlvbgorICAkTE9BRF9QQVRILmRlbGV0ZShGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorICAkTE9BRF9QQVRILmRlbGV0ZShGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJ2ZmaScpKQorICB1bmxlc3MgJExPQURFRF9GRUFUVVJFUy5uaWw/CisgICAgJExPQURFRF9GRUFUVVJFUy5kZWxldGUoX19GSUxFX18pCisgICAgJExPQURFRF9GRUFUVVJFUy5kZWxldGUoJ2ZmaS5yYicpCisgIGVuZAorICByZXF1aXJlICdmZmkucmInCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9hdXRvcG9pbnRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9hdXRvcG9pbnRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODlhM2UzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL2F1dG9wb2ludGVyLnJiCkBAIC0wLDAgKzEsMjAzIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIFdheW5lIE1laXNzbmVyCisjIENvcHlyaWdodCAoQykgMjAwOCBNaWtlIERhbGVzc2lvCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisjCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisjICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworbW9kdWxlIEZGSQorICBjbGFzcyBBdXRvUG9pbnRlciA8IFBvaW50ZXIKKyAgICBleHRlbmQgRGF0YUNvbnZlcnRlcgorCisgICAgIyBAb3ZlcmxvYWQgaW5pdGlhbGl6ZShwb2ludGVyLCBtZXRob2QpCisgICAgIyAgIEBwYXJhbSBwb2ludGVyIFtQb2ludGVyXQorICAgICMgICBAcGFyYW0gbWV0aG9kIFtNZXRob2RdCisgICAgIyAgIEByZXR1cm4gW3NlbGZdCisgICAgIyAgIFRoZSBwYXNzZWQgTWV0aG9kIHdpbGwgYmUgaW52b2tlZCBhdCBHQyB0aW1lLgorICAgICMgQG92ZXJsb2FkIGluaXRpYWxpemUocG9pbnRlciwgcHJvYykKKyAgICAjICAgQHBhcmFtIHBvaW50ZXIgW1BvaW50ZXJdCisgICAgIyAgIEByZXR1cm4gW3NlbGZdCisgICAgIyAgIFRoZSBwYXNzZWQgUHJvYyB3aWxsIGJlIGludm9rZWQgYXQgR0MgdGltZSAoU0VFIFdBUk5JTkcgQkVMT1chKQorICAgICMgICBAbm90ZSBXQVJOSU5HOiBwYXNzaW5nIGEgcHJvYyBfbWF5XyBjYXVzZSB5b3VyIHBvaW50ZXIgdG8gbmV2ZXIgYmUKKyAgICAjICAgICBHQydkLCB1bmxlc3MgeW91J3JlIGNhcmVmdWwgdG8gYXZvaWQgdHJhcHBpbmcgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgIyAgICAgcG9pbnRlciBpbiB0aGUgcHJvYy4gU2VlIHRoZSB0ZXN0IHNwZWNzIGZvciBleGFtcGxlcy4KKyAgICAjIEBvdmVybG9hZCBpbml0aWFsaXplKHBvaW50ZXIpIHsgfHB8IC4uLiB9CisgICAgIyAgIEBwYXJhbSBwb2ludGVyIFtQb2ludGVyXQorICAgICMgICBAeWllbGRwYXJhbSBbUG9pbnRlcl0gcCArcG9pbnRlcisgcGFzc2VkIHRvIHRoZSBibG9jaworICAgICMgICBAcmV0dXJuIFtzZWxmXQorICAgICMgICBUaGUgcGFzc2VkIGJsb2NrIHdpbGwgYmUgaW52b2tlZCBhdCBHQyB0aW1lLgorICAgICMgICBAbm90ZQorICAgICMgICAgIFdBUk5JTkc6IHBhc3NpbmcgYSBibG9jayB3aWxsIGNhdXNlIHlvdXIgcG9pbnRlciB0byBuZXZlciBiZSBHQydkLgorICAgICMgICAgIFRoaXMgaXMgYmFkLgorICAgICMgQG92ZXJsb2FkIGluaXRpYWxpemUocG9pbnRlcikKKyAgICAjICAgQHBhcmFtIHBvaW50ZXIgW1BvaW50ZXJdCisgICAgIyAgIEByZXR1cm4gW3NlbGZdCisgICAgIyAgIFRoZSBwb2ludGVyJ3MgcmVsZWFzZSgpIGNsYXNzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgYXQgR0MgdGltZS4KKyAgICAjCisgICAgIyBAbm90ZSBUaGUgc2FmZXN0LCBhbmQgdGhlcmVmb3JlIHByZWZlcnJlZCwgY2FsbGluZworICAgICMgIGlkaW9tIGlzIHRvIHBhc3MgYSBNZXRob2QgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIEV4YW1wbGUgdXNhZ2U6CisgICAgIworICAgICMgICBjbGFzcyBQb2ludGVySGVscGVyCisgICAgIyAgICAgZGVmIHNlbGYucmVsZWFzZShwb2ludGVyKQorICAgICMgICAgICAgLi4uCisgICAgIyAgICAgZW5kCisgICAgIyAgIGVuZAorICAgICMKKyAgICAjICAgcCA9IEF1dG9Qb2ludGVyLm5ldyhvdGhlcl9wb2ludGVyLCBQb2ludGVySGVscGVyLm1ldGhvZCg6cmVsZWFzZSkpCisgICAgIworICAgICMgIFRoZSBhYm92ZSBjb2RlIHdpbGwgY2F1c2UgUG9pbnRlckhlbHBlciNyZWxlYXNlIHRvIGJlIGludm9rZWQgYXQgR0MgdGltZS4KKyAgICAjCisgICAgIyBAbm90ZQorICAgICMgIFRoZSBsYXN0IGNhbGxpbmcgaWRpb20gKG9ubHkgb25lIHBhcmFtZXRlcikgaXMgZ2VuZXJhbGx5IG9ubHkKKyAgICAjICBnb2luZyB0byBiZSB1c2VmdWwgaWYgeW91IHN1YmNsYXNzIHtBdXRvUG9pbnRlcn0sIGFuZCBvdmVycmlkZQorICAgICMgICNyZWxlYXNlLCB3aGljaCBieSBkZWZhdWx0IGRvZXMgbm90aGluZy4KKyAgICBkZWYgaW5pdGlhbGl6ZShwdHIsIHByb2M9bmlsLCAmYmxvY2spCisgICAgICBzdXBlcihwdHIudHlwZV9zaXplLCBwdHIpCisgICAgICByYWlzZSBUeXBlRXJyb3IsICJJbnZhbGlkIHBvaW50ZXIiIGlmIHB0ci5uaWw/IHx8ICFwdHIua2luZF9vZj8oUG9pbnRlcikgXAorICAgICAgICB8fCBwdHIua2luZF9vZj8oTWVtb3J5UG9pbnRlcikgfHwgcHRyLmtpbmRfb2Y/KEF1dG9Qb2ludGVyKQorCisgICAgICBAcmVsZWFzZXIgPSBpZiBwcm9jCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwcm9jLnJlc3BvbmRfdG8/KDpjYWxsKQorICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvci5uZXcoInByb2MgbXVzdCBiZSBjYWxsYWJsZSIpCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICBDYWxsYWJsZVJlbGVhc2VyLm5ldyhwdHIsIHByb2MpCisKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2xhc3MucmVzcG9uZF90bz8oOnJlbGVhc2UpCisgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLm5ldygibm8gcmVsZWFzZSBtZXRob2QgZGVmaW5lZCIpCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICBEZWZhdWx0UmVsZWFzZXIubmV3KHB0ciwgc2VsZi5jbGFzcykKKyAgICAgICAgICAgICAgICAgIGVuZAorCisgICAgICBPYmplY3RTcGFjZS5kZWZpbmVfZmluYWxpemVyKHNlbGYsIEByZWxlYXNlcikKKyAgICAgIHNlbGYKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbbmlsXQorICAgICMgRnJlZSB0aGUgcG9pbnRlci4KKyAgICBkZWYgZnJlZQorICAgICAgQHJlbGVhc2VyLmZyZWUKKyAgICBlbmQKKworICAgICMgQHBhcmFtIFtCb29sZWFuXSBhdXRvcmVsZWFzZQorICAgICMgQHJldHVybiBbQm9vbGVhbl0gK2F1dG9yZWxlYXNlKworICAgICMgU2V0ICthdXRvcmVsZWFzZSsgcHJvcGVydHkuIFNlZSB7UG9pbnRlciBBdXRvcmVsZWFzZSBzZWN0aW9uIGF0IFBvaW50ZXJ9LgorICAgIGRlZiBhdXRvcmVsZWFzZT0oYXV0b3JlbGVhc2UpCisgICAgICBAcmVsZWFzZXIuYXV0b3JlbGVhc2U9KGF1dG9yZWxlYXNlKQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSArYXV0b3JlbGVhc2UrCisgICAgIyBHZXQgK2F1dG9yZWxlYXNlKyBwcm9wZXJ0eS4gU2VlIHtQb2ludGVyIEF1dG9yZWxlYXNlIHNlY3Rpb24gYXQgUG9pbnRlcn0uCisgICAgZGVmIGF1dG9yZWxlYXNlPworICAgICAgQHJlbGVhc2VyLmF1dG9yZWxlYXNlCisgICAgZW5kCisKKyAgICAjIEBhYnN0cmFjdCBCYXNlIGNsYXNzIGZvciB7QXV0b1BvaW50ZXJ9J3MgcmVsZWFzZXJzLgorICAgICMgIAorICAgICMgIEFsbCBzdWJjbGFzc2VzIG9mIFJlbGVhc2VyIHNob3VsZCBkZWZpbmUgYSArI3JlbGVhc2UocHRyKSsgbWV0aG9kLgorICAgICMgQSByZWxlYXNlciBpcyBhbiBvYmplY3QgaW4gY2hhcmdlIG9mIHJlbGVhc2UgYW4ge0F1dG9Qb2ludGVyfS4KKyAgICBjbGFzcyBSZWxlYXNlcgorICAgICAgYXR0cl9hY2Nlc3NvciA6YXV0b3JlbGVhc2UKKworICAgICAgIyBAcGFyYW0gW1BvaW50ZXJdIHB0cgorICAgICAgIyBAcGFyYW0gWyNjYWxsXSBwcm9jCisgICAgICAjIEByZXR1cm4gW25pbF0KKyAgICAgICMgQSBuZXcgaW5zdGFuY2Ugb2YgUmVsZWFzZXIuCisgICAgICBkZWYgaW5pdGlhbGl6ZShwdHIsIHByb2MpCisgICAgICAgIEBwdHIgPSBwdHIKKyAgICAgICAgQHByb2MgPSBwcm9jCisgICAgICAgIEBhdXRvcmVsZWFzZSA9IHRydWUKKyAgICAgIGVuZAorCisgICAgICAjIEByZXR1cm4gW25pbF0KKyAgICAgICMgRnJlZSBwb2ludGVyLgorICAgICAgZGVmIGZyZWUKKyAgICAgICAgaWYgQHB0cgorICAgICAgICAgIHJlbGVhc2UoQHB0cikKKyAgICAgICAgICBAYXV0b3JlbGVhc2UgPSBmYWxzZQorICAgICAgICAgIEBwdHIgPSBuaWwKKyAgICAgICAgICBAcHJvYyA9IG5pbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEBwYXJhbSBhcmdzCisgICAgICAjIFJlbGVhc2UgcG9pbnRlciBpZiArYXV0b3JlbGVhc2UrIGlzIHNldC4KKyAgICAgIGRlZiBjYWxsKCphcmdzKQorICAgICAgICByZWxlYXNlKEBwdHIpIGlmIEBhdXRvcmVsZWFzZSAmJiBAcHRyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgRGVmYXVsdFJlbGVhc2VyIGlzIGEge1JlbGVhc2VyfSB1c2VkIHdoZW4gYW4ge0F1dG9Qb2ludGVyfSBpcyBkZWZpbmVkCisgICAgIyB3aXRob3V0IFByb2Mgb3IgTWV0aG9kLiBJbiB0aGlzIGNhc2UsIHRoZSBwb2ludGVyIHRvIHJlbGVhc2UgbXVzdCBiZSBvZgorICAgICMgYSBjbGFzcyBkZXJpdmVkIGZyb20gQXV0b1BvaW50ZXIgd2l0aCBhIHtyZWxlYXNlfSBjbGFzcyBtZXRob2QuCisgICAgY2xhc3MgRGVmYXVsdFJlbGVhc2VyIDwgUmVsZWFzZXIKKyAgICAgICMgQHBhcmFtIFtQb2ludGVyXSBwdHIKKyAgICAgICMgQHJldHVybiBbbmlsXQorICAgICAgIyBSZWxlYXNlICtwdHIrIHVzaW5nIHRoZSB7cmVsZWFzZX0gY2xhc3MgbWV0aG9kIG9mIGl0cyBjbGFzcy4KKyAgICAgIGRlZiByZWxlYXNlKHB0cikKKyAgICAgICAgQHByb2MucmVsZWFzZShwdHIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQ2FsbGFibGVSZWxlYXNlciBpcyBhIHtSZWxlYXNlcn0gdXNlZCB3aGVuIGFuIHtBdXRvUG9pbnRlcn0gaXMgZGVmaW5lZCB3aXRoIGEKKyAgICAjIFByb2Mgb3IgYSBNZXRob2QuCisgICAgY2xhc3MgQ2FsbGFibGVSZWxlYXNlciA8IFJlbGVhc2VyCisgICAgICAjIFJlbGVhc2UgK3B0cisgYnkgdXNpbmcgUHJvYyBvciBNZXRob2QgZGVmaW5lZCBhdCArcHRyKworICAgICAgIyB7QXV0b1BvaW50ZXIjaW5pdGlhbGl6ZSBpbml0aWFsaXphdGlvbn0uCisgICAgICAjCisgICAgICAjIEBwYXJhbSBbUG9pbnRlcl0gcHRyCisgICAgICAjIEByZXR1cm4gW25pbF0KKyAgICAgIGRlZiByZWxlYXNlKHB0cikKKyAgICAgICAgQHByb2MuY2FsbChwdHIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUmV0dXJuIG5hdGl2ZSB0eXBlIG9mIEF1dG9Qb2ludGVyLgorICAgICMKKyAgICAjIE92ZXJyaWRlIHtEYXRhQ29udmVydGVyI25hdGl2ZV90eXBlfS4KKyAgICAjIEByZXR1cm4gW1R5cGU6OlBPSU5URVJdCisgICAgIyBAcmFpc2Uge1J1bnRpbWVFcnJvcn0gaWYgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IGEgKyNyZWxlYXNlKyBtZXRob2QKKyAgICBkZWYgc2VsZi5uYXRpdmVfdHlwZQorICAgICAgaWYgbm90IHNlbGYucmVzcG9uZF90bz8oOnJlbGVhc2UpCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvci5uZXcoIm5vIHJlbGVhc2UgbWV0aG9kIGRlZmluZWQgZm9yICN7c2VsZi5pbnNwZWN0fSIpCisgICAgICBlbmQKKyAgICAgIFR5cGU6OlBPSU5URVIKKyAgICBlbmQKKworICAgICMgQ3JlYXRlIGEgbmV3IEF1dG9Qb2ludGVyLgorICAgICMKKyAgICAjIE92ZXJyaWRlIHtEYXRhQ29udmVydGVyI2Zyb21fbmF0aXZlfS4KKyAgICAjIEBvdmVybG9hZCBzZWxmLmZyb21fbmF0aXZlKHB0ciwgY3R4KQorICAgICMgICBAcGFyYW0gW1BvaW50ZXJdIHB0cgorICAgICMgICBAcGFyYW0gY3R4IG5vdCB1c2VkLiBQbGVhc2Ugc2V0ICtuaWwrLgorICAgICMgQHJldHVybiBbQXV0b1BvaW50ZXJdCisgICAgZGVmIHNlbGYuZnJvbV9uYXRpdmUodmFsLCBjdHgpCisgICAgICBzZWxmLm5ldyh2YWwpCisgICAgZW5kCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9idWZmZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvYnVmZmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWU0NWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvYnVmZmVyLnJiCkBAIC0wLDAgKzEsNCBAQAorIworIyBBbGwgdGhlIGNvZGUgZnJvbSB0aGlzIGZpbGUgaXMgbm93IGltcGxlbWVudGVkIGluIEMuICBUaGlzIGZpbGUgcmVtYWlucworIyB0byBzYXRpc2Z5IGFueSBsZWZ0b3ZlciByZXF1aXJlICdmZmkvYnVmZmVyJyBpbiB1c2VyIGNvZGUKKyMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9jYWxsYmFjay5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9jYWxsYmFjay5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQ1MmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL2NhbGxiYWNrLnJiCkBAIC0wLDAgKzEsNCBAQAorIworIyBBbGwgdGhlIGNvZGUgZnJvbSB0aGlzIGZpbGUgaXMgbm93IGltcGxlbWVudGVkIGluIEMuICBUaGlzIGZpbGUgcmVtYWlucworIyB0byBzYXRpc2Z5IGFueSBsZWZ0b3ZlciByZXF1aXJlICdmZmkvY2FsbGJhY2snIGluIHVzZXIgY29kZQorIwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL2VudW0ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvZW51bS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDZiODM2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL2VudW0ucmIKQEAgLTAsMCArMSwxNzIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIFdheW5lIE1laXNzbmVyCisjIENvcHlyaWdodCAoQykgMjAwOSBMdWMgSGVpbnJpY2gKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyMKKyMgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyMgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UKKyMgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisjICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworCittb2R1bGUgRkZJCisKKyAgIyBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHBlcm1pdHMgdG8gbWFuYWdlIHtFbnVtfXMuIEluIGZhY3QsIEVudW1zIGlzIGEgY29sbGVjdGlvbiBvZiB7RW51bX1zLgorICBjbGFzcyBFbnVtcworCisgICAgIyBAcmV0dXJuIFtuaWxdCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBhbGxfZW51bXMgPSBBcnJheS5uZXcKKyAgICAgIEB0YWdnZWRfZW51bXMgPSBIYXNoLm5ldworICAgICAgQHN5bWJvbF9tYXAgPSBIYXNoLm5ldworICAgIGVuZAorCisgICAgIyBAcGFyYW0gW0VudW1dIGVudW0KKyAgICAjIEFkZCBhbiB7RW51bX0gdG8gdGhlIGNvbGxlY3Rpb24uCisgICAgZGVmIDw8KGVudW0pCisgICAgICBAYWxsX2VudW1zIDw8IGVudW0KKyAgICAgIEB0YWdnZWRfZW51bXNbZW51bS50YWddID0gZW51bSB1bmxlc3MgZW51bS50YWcubmlsPworICAgICAgQHN5bWJvbF9tYXAubWVyZ2UhKGVudW0uc3ltYm9sX21hcCkKKyAgICBlbmQKKworICAgICMgQHBhcmFtIHF1ZXJ5IGVudW0gdGFnIG9yIHBhcnQgb2YgYW4gZW51bSBuYW1lCisgICAgIyBAcmV0dXJuIFtFbnVtXQorICAgICMgRmluZCBhIHtFbnVtfSBpbiBjb2xsZWN0aW9uLgorICAgIGRlZiBmaW5kKHF1ZXJ5KQorICAgICAgaWYgQHRhZ2dlZF9lbnVtcy5oYXNfa2V5PyhxdWVyeSkKKyAgICAgICAgQHRhZ2dlZF9lbnVtc1txdWVyeV0KKyAgICAgIGVsc2UKKyAgICAgICAgQGFsbF9lbnVtcy5kZXRlY3QgeyB8ZW51bXwgZW51bS5zeW1ib2xzLmluY2x1ZGU/KHF1ZXJ5KSB9CisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQHBhcmFtIHN5bWJvbCBhIHN5bWJvbCB0byBmaW5kIGluIG1lcmdlIHN5bWJvbCBtYXBzIG9mIGFsbCBlbnVtcy4KKyAgICAjIEByZXR1cm4gYSBzeW1ib2wKKyAgICBkZWYgX19tYXBfc3ltYm9sKHN5bWJvbCkKKyAgICAgIEBzeW1ib2xfbWFwW3N5bWJvbF0KKyAgICBlbmQKKworICBlbmQKKworICAjIFJlcHJlc2VudHMgYSBDIGVudW0uCisgICMKKyAgIyBGb3IgYSBDIGVudW06CisgICMgIGVudW0gZnJ1aXRzIHsKKyAgIyAgICBhcHBsZSwKKyAgIyAgICBiYW5hbmEsCisgICMgICAgb3JhbmdlLAorICAjICAgIHBpbmVhcHBsZQorICAjICB9OworICAjIGFyZSBkZWZpbmVkIHRoaXMgdm9jYWJ1bGFyeToKKyAgIyAqIGEgX3N5bWJvbF8gaXMgYSB3b3JkIGZyb20gdGhlIGVudW1lcmF0aW9uIChpZS4gX2FwcGxlXywgYnkgZXhhbXBsZSk7CisgICMgKiBhIF92YWx1ZV8gaXMgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGluIHRoZSBlbnVtZXJhdGlvbiAoYnkgZXhhbXBsZSwgYXBwbGUgaGFzIHZhbHVlIF8wXyBhbmQgYmFuYW5hIF8xXykuCisgIGNsYXNzIEVudW0KKyAgICBpbmNsdWRlIERhdGFDb252ZXJ0ZXIKKworICAgIGF0dHJfcmVhZGVyIDp0YWcKKyAgICBhdHRyX3JlYWRlciA6bmF0aXZlX3R5cGUKKworICAgICMgQG92ZXJsb2FkIGluaXRpYWxpemUoaW5mbywgdGFnPW5pbCkKKyAgICAjICAgQHBhcmFtIFtuaWwsIEVudW1lcmFibGVdIGluZm8KKyAgICAjICAgQHBhcmFtIFtuaWwsIFN5bWJvbF0gdGFnIGVudW0gdGFnCisgICAgIyBAb3ZlcmxvYWQgaW5pdGlhbGl6ZShuYXRpdmVfdHlwZSwgaW5mbywgdGFnPW5pbCkKKyAgICAjICAgQHBhcmFtIFtGRkk6OlR5cGVdIG5hdGl2ZV90eXBlIE5hdGl2ZSB0eXBlIGZvciBuZXcgRW51bQorICAgICMgICBAcGFyYW0gW25pbCwgRW51bWVyYWJsZV0gaW5mbyBzeW1ib2xzIGFuZCB2YWx1ZXMgZm9yIG5ldyBFbnVtCisgICAgIyAgIEBwYXJhbSBbbmlsLCBTeW1ib2xdIHRhZyBuYW1lIG9mIG5ldyBFbnVtCisgICAgZGVmIGluaXRpYWxpemUoKmFyZ3MpCisgICAgICBAbmF0aXZlX3R5cGUgPSBhcmdzLmZpcnN0LmtpbmRfb2Y/KEZGSTo6VHlwZSkgPyBhcmdzLnNoaWZ0IDogVHlwZTo6SU5UCisgICAgICBpbmZvLCBAdGFnID0gKmFyZ3MKKyAgICAgIEBrdl9tYXAgPSBIYXNoLm5ldworICAgICAgdW5sZXNzIGluZm8ubmlsPworICAgICAgICBsYXN0X2NzdCA9IG5pbAorICAgICAgICB2YWx1ZSA9IDAKKyAgICAgICAgaW5mby5lYWNoIGRvIHxpfAorICAgICAgICAgIGNhc2UgaQorICAgICAgICAgIHdoZW4gU3ltYm9sCisgICAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiZHVwbGljYXRlIGVudW0ga2V5IiBpZiBAa3ZfbWFwLmhhc19rZXk/KGkpCisgICAgICAgICAgICBAa3ZfbWFwW2ldID0gdmFsdWUKKyAgICAgICAgICAgIGxhc3RfY3N0ID0gaQorICAgICAgICAgICAgdmFsdWUgKz0gMQorICAgICAgICAgIHdoZW4gSW50ZWdlcgorICAgICAgICAgICAgQGt2X21hcFtsYXN0X2NzdF0gPSBpCisgICAgICAgICAgICB2YWx1ZSA9IGkrMQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgQHZrX21hcCA9IEBrdl9tYXAuaW52ZXJ0CisgICAgZW5kCisKKyAgICAjIEByZXR1cm4gW0FycmF5XSBlbnVtIHN5bWJvbCBuYW1lcworICAgIGRlZiBzeW1ib2xzCisgICAgICBAa3ZfbWFwLmtleXMKKyAgICBlbmQKKworICAgICMgR2V0IGEgc3ltYm9sIG9yIGEgdmFsdWUgZnJvbSB0aGUgZW51bS4KKyAgICAjIEBvdmVybG9hZCBbXShxdWVyeSkKKyAgICAjICBHZXQgZW51bSB2YWx1ZSBmcm9tIHN5bWJvbC4KKyAgICAjICBAcGFyYW0gW1N5bWJvbF0gcXVlcnkKKyAgICAjICBAcmV0dXJuIFtJbnRlZ2VyXQorICAgICMgQG92ZXJsb2FkIFtdKHF1ZXJ5KQorICAgICMgIEdldCBlbnVtIHN5bWJvbCBmcm9tIHZhbHVlLgorICAgICMgIEBwYXJhbSBbSW50ZWdlcl0gcXVlcnkKKyAgICAjICBAcmV0dXJuIFtTeW1ib2xdCisgICAgZGVmIFtdKHF1ZXJ5KQorICAgICAgY2FzZSBxdWVyeQorICAgICAgd2hlbiBTeW1ib2wKKyAgICAgICAgQGt2X21hcFtxdWVyeV0KKyAgICAgIHdoZW4gSW50ZWdlcgorICAgICAgICBAdmtfbWFwW3F1ZXJ5XQorICAgICAgZW5kCisgICAgZW5kCisgICAgYWxpYXMgZmluZCBbXQorCisgICAgIyBHZXQgdGhlIHN5bWJvbCBtYXAuCisgICAgIyBAcmV0dXJuIFtIYXNoXQorICAgIGRlZiBzeW1ib2xfbWFwCisgICAgICBAa3ZfbWFwCisgICAgZW5kCisKKyAgICBhbGlhcyB0b19oIHN5bWJvbF9tYXAKKyAgICBhbGlhcyB0b19oYXNoIHN5bWJvbF9tYXAKKworICAgICMgQHBhcmFtIFtTeW1ib2wsIEludGVnZXIsICN0b19pbnRdIHZhbAorICAgICMgQHBhcmFtIGN0eCB1bnVzZWQKKyAgICAjIEByZXR1cm4gW0ludGVnZXJdIHZhbHVlIG9mIGEgZW51bSBzeW1ib2wKKyAgICBkZWYgdG9fbmF0aXZlKHZhbCwgY3R4KQorICAgICAgQGt2X21hcFt2YWxdIHx8IGlmIHZhbC5pc19hPyhJbnRlZ2VyKQorICAgICAgICB2YWwKKyAgICAgIGVsc2lmIHZhbC5yZXNwb25kX3RvPyg6dG9faW50KQorICAgICAgICB2YWwudG9faW50CisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJpbnZhbGlkIGVudW0gdmFsdWUsICN7dmFsLmluc3BlY3R9IgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSB2YWwKKyAgICAjIEByZXR1cm4gc3ltYm9sIG5hbWUgaWYgaXQgZXhpc3RzIGZvciArdmFsKy4KKyAgICBkZWYgZnJvbV9uYXRpdmUodmFsLCBjdHgpCisgICAgICBAdmtfbWFwW3ZhbF0gfHwgdmFsCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvZXJybm8ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvZXJybm8ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4MmQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9lcnJuby5yYgpAQCAtMCwwICsxLDQzIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIFdheW5lIE1laXNzbmVyCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisjCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisjICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4jCisKK21vZHVsZSBGRkkKKyAgIyBAcmV0dXJuIChzZWUgRkZJOjpMYXN0RXJyb3IuZXJyb3IpCisgICMgQHNlZSBGRkk6Okxhc3RFcnJvci5lcnJvcgorICBkZWYgc2VsZi5lcnJubworICAgIEZGSTo6TGFzdEVycm9yLmVycm9yCisgIGVuZAorICAjIEBwYXJhbSBlcnJvciAoc2VlIEZGSTo6TGFzdEVycm9yLmVycm9yPSkKKyAgIyBAcmV0dXJuIChzZWUgRkZJOjpMYXN0RXJyb3IuZXJyb3I9KQorICAjIEBzZWUgRkZJOjpMYXN0RXJyb3IuZXJyb3I9CisgIGRlZiBzZWxmLmVycm5vPShlcnJvcikKKyAgICBGRkk6Okxhc3RFcnJvci5lcnJvciA9IGVycm9yCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvZmZpLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL2ZmaS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ0NTFmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL2ZmaS5yYgpAQCAtMCwwICsxLDQ0IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEpSdWJ5IHByb2plY3QKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyMKKyMgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyMgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UKKyMgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisjICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCityZXF1aXJlICdmZmkvcGxhdGZvcm0nCityZXF1aXJlICdmZmkvdHlwZXMnCityZXF1aXJlICdmZmkvbGlicmFyeScKK3JlcXVpcmUgJ2ZmaS9lcnJubycKK3JlcXVpcmUgJ2ZmaS9wb2ludGVyJworcmVxdWlyZSAnZmZpL21lbW9yeXBvaW50ZXInCityZXF1aXJlICdmZmkvc3RydWN0JworcmVxdWlyZSAnZmZpL3VuaW9uJworcmVxdWlyZSAnZmZpL21hbmFnZWRzdHJ1Y3QnCityZXF1aXJlICdmZmkvY2FsbGJhY2snCityZXF1aXJlICdmZmkvaW8nCityZXF1aXJlICdmZmkvYXV0b3BvaW50ZXInCityZXF1aXJlICdmZmkvdmFyaWFkaWMnCityZXF1aXJlICdmZmkvZW51bScKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9pby5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9pby5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmExY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL2lvLnJiCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFdheW5lIE1laXNzbmVyCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisjCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisjICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4jCisKK21vZHVsZSBGRkkKKyAgCisgICMgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIGNvdXBsZSBvZiBjbGFzcyBtZXRob2RzIHRvIHBsYXkgd2l0aCBJTy4KKyAgbW9kdWxlIElPCisgICAgIyBAcGFyYW0gW0ludGVnZXJdIGZkIGZpbGUgZGVjcmlwdG9yCisgICAgIyBAcGFyYW0gW1N0cmluZ10gbW9kZSBtb2RlIHN0cmluZworICAgICMgQHJldHVybiBbOjpJT10KKyAgICAjIFN5bm9ueW0gZm9yIElPOjpmb3JfZmQuCisgICAgZGVmIHNlbGYuZm9yX2ZkKGZkLCBtb2RlID0gInIiKQorICAgICAgOjpJTy5mb3JfZmQoZmQsIG1vZGUpCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSBbI3JlYWRdIGlvIGlvIHRvIHJlYWQgZnJvbQorICAgICMgQHBhcmFtIFtBYnN0cmFjdE1lbW9yeV0gYnVmIGRlc3RpbmF0aW9uIGZvciBkYXRhIHJlYWQgZnJvbSAraW8rCisgICAgIyBAcGFyYW0gW25pbCwgTnVtZXJpY10gbGVuIG1heGltdWwgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSAraW8rLiBJZiArbmlsKywgCisgICAgIyAgcmVhZCB1bnRpbCBlbmQgb2YgZmlsZS4KKyAgICAjIEByZXR1cm4gW051bWVyaWNdIGxlbmd0aCByZWFsbHkgcmVhZCwgaW4gYnl0ZXMKKyAgICAjCisgICAgIyBBIHZlcnNpb24gb2YgSU8jcmVhZCB0aGF0IHJlYWRzIGRhdGEgZnJvbSBhbiBJTyBhbmQgcHV0IHRoZW4gaW50byBhIG5hdGl2ZSBidWZmZXIuCisgICAgIyAKKyAgICAjIFRoaXMgd2lsbCBiZSBvcHRpbWl6ZWQgYXQgc29tZSBmdXR1cmUgdGltZSB0byBlbGltaW5hdGUgdGhlIGRvdWJsZSBjb3B5LgorICAgICMKKyAgICBkZWYgc2VsZi5uYXRpdmVfcmVhZChpbywgYnVmLCBsZW4pCisgICAgICB0bXAgPSBpby5yZWFkKGxlbikKKyAgICAgIHJldHVybiAtMSB1bmxlc3MgdG1wCisgICAgICBidWYucHV0X2J5dGVzKDAsIHRtcCkKKyAgICAgIHRtcC5sZW5ndGgKKyAgICBlbmQKKworICBlbmQKK2VuZAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvbGlicmFyeS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9saWJyYXJ5LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTJlZGQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvbGlicmFyeS5yYgpAQCAtMCwwICsxLDUzOCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBXYXluZSBNZWlzc25lcgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorIworIyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworIyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisjIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisjIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisjIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIworCittb2R1bGUgRkZJCisgIENVUlJFTlRfUFJPQ0VTUyA9IFVTRV9USElTX1BST0NFU1NfQVNfTElCUkFSWSA9IE9iamVjdC5uZXcKKworICAjIEBwYXJhbSBbI3RvX3NdIGxpYiBsaWJyYXJ5IG5hbWUKKyAgIyBAcmV0dXJuIFtTdHJpbmddIGxpYnJhcnkgbmFtZSBmb3JtYXR0ZWQgZm9yIGN1cnJlbnQgcGxhdGZvcm0KKyAgIyBUcmFuc2Zvcm0gYSBnZW5lcmljIGxpYnJhcnkgbmFtZSB0byBhIHBsYXRmb3JtIGxpYnJhcnkgbmFtZQorICAjIEBleGFtcGxlCisgICMgICMgTGludXgKKyAgIyAgRkZJLm1hcF9saWJyYXJ5X25hbWUgJ2MnICAgICAjIC0+ICJsaWJjLnNvLjYiCisgICMgIEZGSS5tYXBfbGlicmFyeV9uYW1lICdqcGVnJyAgIyAtPiAibGlianBlZy5zbyIKKyAgIyAgIyBXaW5kb3dzCisgICMgIEZGSS5tYXBfbGlicmFyeV9uYW1lICdjJyAgICAgIyAtPiAibXN2Y3J0LmRsbCIKKyAgIyAgRkZJLm1hcF9saWJyYXJ5X25hbWUgJ2pwZWcnICAjIC0+ICJqcGVnLmRsbCIKKyAgZGVmIHNlbGYubWFwX2xpYnJhcnlfbmFtZShsaWIpCisgICAgIyBNYW5nbGUgdGhlIGxpYnJhcnkgbmFtZSB0byByZWZsZWN0IHRoZSBuYXRpdmUgbGlicmFyeSBuYW1pbmcgY29udmVudGlvbnMKKyAgICBsaWIgPSBsaWIudG9fcyB1bmxlc3MgbGliLmtpbmRfb2Y/KFN0cmluZykKKyAgICBsaWIgPSBMaWJyYXJ5OjpMSUJDIGlmIGxpYiA9PSAnYycKKworICAgIGlmIGxpYiAmJiBGaWxlLmJhc2VuYW1lKGxpYikgPT0gbGliCisgICAgICBsaWIgPSBQbGF0Zm9ybTo6TElCUFJFRklYICsgbGliIHVubGVzcyBsaWIgPX4gL14je1BsYXRmb3JtOjpMSUJQUkVGSVh9LworICAgICAgciA9IFBsYXRmb3JtOjpJU19HTlUgPyAiXFwuc28oJHxcXC5bMTIzNDU2Nzg5MF0rKSIgOiAiXFwuI3tQbGF0Zm9ybTo6TElCU1VGRklYfSQiCisgICAgICBsaWIgKz0gIi4je1BsYXRmb3JtOjpMSUJTVUZGSVh9IiB1bmxlc3MgbGliID1+IC8je3J9LworICAgIGVuZAorCisgICAgbGliCisgIGVuZAorCisgICMgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgZnVuY3Rpb24gaXMgbm90IGZvdW5kIGluIGxpYnJhcmllcworICBjbGFzcyBOb3RGb3VuZEVycm9yIDwgTG9hZEVycm9yCisgICAgZGVmIGluaXRpYWxpemUoZnVuY3Rpb24sICpsaWJyYXJpZXMpCisgICAgICBzdXBlcigiRnVuY3Rpb24gJyN7ZnVuY3Rpb259JyBub3QgZm91bmQgaW4gWyN7bGlicmFyaWVzWzBdLm5pbD8gPyAnY3VycmVudCBwcm9jZXNzJyA6IGxpYnJhcmllcy5qb2luKCIsICIpfV0iKQorICAgIGVuZAorICBlbmQKKworICAjIFRoaXMgbW9kdWxlIGlzIHRoZSBiYXNlIHRvIHVzZSBuYXRpdmUgZnVuY3Rpb25zLgorICAjCisgICMgQSBiYXNpYyB1c2FnZSBtYXkgYmU6CisgICMgIHJlcXVpcmUgJ2ZmaScKKyAgIyAgCisgICMgIG1vZHVsZSBIZWxsbworICAjICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgIyAgICBmZmlfbGliIEZGSTo6TGlicmFyeTo6TElCQworICAjICAgIGF0dGFjaF9mdW5jdGlvbiAncHV0cycsIFsgOnN0cmluZyBdLCA6aW50CisgICMgIGVuZAorICAjICAKKyAgIyAgSGVsbG8ucHV0cygiSGVsbG8sIFdvcmxkIikKKyAgIworICAjIAorICBtb2R1bGUgTGlicmFyeQorICAgIENVUlJFTlRfUFJPQ0VTUyA9IEZGSTo6Q1VSUkVOVF9QUk9DRVNTCisgICAgTElCQyA9IEZGSTo6UGxhdGZvcm06OkxJQkMKKworICAgICMgQHBhcmFtIG1vZCBleHRlbmRlZCBvYmplY3QKKyAgICAjIEByZXR1cm4gW25pbF0KKyAgICAjIEByYWlzZSB7UnVudGltZUVycm9yfSBpZiArbW9kKyBpcyBub3QgYSBNb2R1bGUKKyAgICAjIFRlc3QgaWYgZXh0ZW5kZWQgb2JqZWN0IGlzIGEgTW9kdWxlLiBJZiBub3QsIHJhaXNlIFJ1bnRpbWVFcnJvci4KKyAgICBkZWYgc2VsZi5leHRlbmRlZChtb2QpCisgICAgICByYWlzZSBSdW50aW1lRXJyb3IubmV3KCJtdXN0IG9ubHkgYmUgZXh0ZW5kZWQgYnkgbW9kdWxlIikgdW5sZXNzIG1vZC5raW5kX29mPyhNb2R1bGUpCisgICAgZW5kCisKKyAgICAKKyAgICAjIEBwYXJhbSBbQXJyYXldIG5hbWVzIG5hbWVzIG9mIGxpYnJhcmllcyB0byBsb2FkCisgICAgIyBAcmV0dXJuIFtBcnJheTxEeW5hbWljTGlicmFyeT5dCisgICAgIyBAcmFpc2Uge0xvYWRFcnJvcn0gaWYgYSBsaWJyYXJ5IGNhbm5vdCBiZSBvcGVuZWQKKyAgICAjIExvYWQgbmF0aXZlIGxpYnJhcmllcy4KKyAgICBkZWYgZmZpX2xpYigqbmFtZXMpCisgICAgICByYWlzZSBMb2FkRXJyb3IubmV3KCJsaWJyYXJ5IG5hbWVzIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkiKSBpZiBuYW1lcy5lbXB0eT8KKworICAgICAgbGliX2ZsYWdzID0gZGVmaW5lZD8oQGZmaV9saWJfZmxhZ3MpID8gQGZmaV9saWJfZmxhZ3MgOiBGRkk6OkR5bmFtaWNMaWJyYXJ5OjpSVExEX0xBWlkgfCBGRkk6OkR5bmFtaWNMaWJyYXJ5OjpSVExEX0xPQ0FMCisgICAgICBmZmlfbGlicyA9IG5hbWVzLm1hcCBkbyB8bmFtZXwKKworICAgICAgICBpZiBuYW1lID09IEZGSTo6Q1VSUkVOVF9QUk9DRVNTCisgICAgICAgICAgRkZJOjpEeW5hbWljTGlicmFyeS5vcGVuKG5pbCwgRkZJOjpEeW5hbWljTGlicmFyeTo6UlRMRF9MQVpZIHwgRkZJOjpEeW5hbWljTGlicmFyeTo6UlRMRF9MT0NBTCkKKworICAgICAgICBlbHNlCisgICAgICAgICAgbGlibmFtZXMgPSAobmFtZS5pc19hPyg6OkFycmF5KSA/IG5hbWUgOiBbIG5hbWUgXSkubWFwIHsgfG58IFsgbiwgRkZJLm1hcF9saWJyYXJ5X25hbWUobikgXS51bmlxIH0uZmxhdHRlbi5jb21wYWN0CisgICAgICAgICAgbGliID0gbmlsCisgICAgICAgICAgZXJyb3JzID0ge30KKworICAgICAgICAgIGxpYm5hbWVzLmVhY2ggZG8gfGxpYm5hbWV8CisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICBvcmlnID0gbGlibmFtZQorICAgICAgICAgICAgICBsaWIgPSBGRkk6OkR5bmFtaWNMaWJyYXJ5Lm9wZW4obGlibmFtZSwgbGliX2ZsYWdzKQorICAgICAgICAgICAgICBicmVhayBpZiBsaWIKKworICAgICAgICAgICAgcmVzY3VlIEV4Y2VwdGlvbiA9PiBleAorICAgICAgICAgICAgICBsZHNjcmlwdCA9IGZhbHNlCisgICAgICAgICAgICAgIGlmIGV4Lm1lc3NhZ2UgPX4gLygoW14gXHQoKV0pK1wuc28oW14gXHQ6KCldKSopOihbIFx0XSkqKGludmFsaWQgRUxGIGhlYWRlcnxmaWxlIHRvbyBzaG9ydHxpbnZhbGlkIGZpbGUgZm9ybWF0KS8KKyAgICAgICAgICAgICAgICBpZiBGaWxlLnJlYWQoJDEpID1+IC8oPzpHUk9VUHxJTlBVVCkgKlwoICooW14gXCldKykvCisgICAgICAgICAgICAgICAgICBsaWJuYW1lID0gJDEKKyAgICAgICAgICAgICAgICAgIGxkc2NyaXB0ID0gdHJ1ZQorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgICBpZiBsZHNjcmlwdAorICAgICAgICAgICAgICAgIHJldHJ5CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAjIFRPRE8gYmV0dGVyIGxpYnJhcnkgbG9va3VwIGxvZ2ljCisgICAgICAgICAgICAgICAgbGlibmFtZSA9IGxpYm5hbWUudG9fcworICAgICAgICAgICAgICAgIHVubGVzcyBsaWJuYW1lLnN0YXJ0X3dpdGg/KCIvIikKKyAgICAgICAgICAgICAgICAgIHBhdGggPSBbJy91c3IvbGliLycsJy91c3IvbG9jYWwvbGliLyddLmZpbmQgZG8gfHB0aHwKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5leGlzdD8ocHRoICsgbGlibmFtZSkKKyAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgaWYgcGF0aAorICAgICAgICAgICAgICAgICAgICBsaWJuYW1lID0gcGF0aCArIGxpYm5hbWUKKyAgICAgICAgICAgICAgICAgICAgcmV0cnkKKyAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgbGliciA9IChvcmlnID09IGxpYm5hbWUgPyBvcmlnIDogIiN7b3JpZ30gI3tsaWJuYW1lfSIpCisgICAgICAgICAgICAgICAgZXJyb3JzW2xpYnJdID0gZXgKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIGlmIGxpYi5uaWw/CisgICAgICAgICAgICByYWlzZSBMb2FkRXJyb3IubmV3KGVycm9ycy52YWx1ZXMuam9pbigiLlxuIikpCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICAjIHJldHVybiB0aGUgZm91bmQgbGliCisgICAgICAgICAgbGliCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEBmZmlfbGlicyA9IGZmaV9saWJzCisgICAgZW5kCisKKyAgICAjIFNldCB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZvciB7I2F0dGFjaF9mdW5jdGlvbn0gYW5kIHsjY2FsbGJhY2t9CisgICAgIworICAgICMgQHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N0ZGNhbGwjc3RkY2FsbAorICAgICMgQG5vdGUgKzpzdGRjYWxsKyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgYXR0YWNoaW5nIFdpbmRvd3MgQVBJIGZ1bmN0aW9ucworICAgICMKKyAgICAjIEBwYXJhbSBbU3ltYm9sXSBjb252ZW50aW9uIG9uZSBvZiArOmRlZmF1bHQrLCArOnN0ZGNhbGwrCisgICAgIyBAcmV0dXJuIFtTeW1ib2xdIHRoZSBuZXcgY2FsbGluZyBjb252ZW50aW9uCisgICAgZGVmIGZmaV9jb252ZW50aW9uKGNvbnZlbnRpb24gPSBuaWwpCisgICAgICBAZmZpX2NvbnZlbnRpb24gfHw9IDpkZWZhdWx0CisgICAgICBAZmZpX2NvbnZlbnRpb24gPSBjb252ZW50aW9uIGlmIGNvbnZlbnRpb24KKyAgICAgIEBmZmlfY29udmVudGlvbgorICAgIGVuZAorCisgICAgIyBAc2VlICNmZmlfbGliCisgICAgIyBAcmV0dXJuIFtBcnJheTxGRkk6OkR5bmFtaWNMaWJyYXJ5Pl0gYXJyYXkgb2YgY3VycmVudGx5IGxvYWRlZCBGRkkgbGlicmFyaWVzCisgICAgIyBAcmFpc2UgW0xvYWRFcnJvcl0gaWYgbm8gbGlicmFyaWVzIGhhdmUgYmVlbiBsb2FkZWQgKHVzaW5nIHsjZmZpX2xpYn0pCisgICAgIyBHZXQgRkZJIGxpYnJhcmllcyBsb2FkZWQgdXNpbmcgeyNmZmlfbGlifS4KKyAgICBkZWYgZmZpX2xpYnJhcmllcworICAgICAgcmFpc2UgTG9hZEVycm9yLm5ldygibm8gbGlicmFyeSBzcGVjaWZpZWQiKSBpZiAhZGVmaW5lZD8oQGZmaV9saWJzKSB8fCBAZmZpX2xpYnMuZW1wdHk/CisgICAgICBAZmZpX2xpYnMKKyAgICBlbmQKKworICAgICMgRmxhZ3MgdXNlZCBpbiB7I2ZmaV9saWJ9LgorICAgICMKKyAgICAjIFRoaXMgbWFwIGFsbG93cyB5b3UgdG8gc3VwcGx5IHN5bWJvbHMgdG8geyNmZmlfbGliX2ZsYWdzfSBpbnN0ZWFkIG9mCisgICAgIyB0aGUgYWN0dWFsIGNvbnN0YW50cy4KKyAgICBGbGFnc01hcCA9IHsKKyAgICAgIDpnbG9iYWwgPT4gRHluYW1pY0xpYnJhcnk6OlJUTERfR0xPQkFMLAorICAgICAgOmxvY2FsID0+IER5bmFtaWNMaWJyYXJ5OjpSVExEX0xPQ0FMLAorICAgICAgOmxhenkgPT4gRHluYW1pY0xpYnJhcnk6OlJUTERfTEFaWSwKKyAgICAgIDpub3cgPT4gRHluYW1pY0xpYnJhcnk6OlJUTERfTk9XCisgICAgfQorCisgICAgIyBTZXRzIGxpYnJhcnkgZmxhZ3MgZm9yIHsjZmZpX2xpYn0uCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgZmZpX2xpYl9mbGFncyg6bGF6eSwgOmxvY2FsKSAjID0+IDUKKyAgICAjCisgICAgIyBAcGFyYW0gW1N5bWJvbCwg4oCmXSBmbGFncyAoc2VlIHtGbGFnc01hcH0pCisgICAgIyBAcmV0dXJuIFtGaXhudW1dIHRoZSBuZXcgdmFsdWUKKyAgICBkZWYgZmZpX2xpYl9mbGFncygqZmxhZ3MpCisgICAgICBAZmZpX2xpYl9mbGFncyA9IGZsYWdzLmluamVjdCgwKSB7IHxyZXN1bHQsIGZ8IHJlc3VsdCB8IEZsYWdzTWFwW2ZdIH0KKyAgICBlbmQKKworCisgICAgIyMKKyAgICAjIEBvdmVybG9hZCBhdHRhY2hfZnVuY3Rpb24oZnVuYywgYXJncywgcmV0dXJucywgb3B0aW9ucyA9IHt9KQorICAgICMgIEBleGFtcGxlIGF0dGFjaCBmdW5jdGlvbiB3aXRob3V0IGFuIGV4cGxpY2l0IG5hbWUKKyAgICAjICAgIG1vZHVsZSBGb28KKyAgICAjICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICMgICAgICBmZmlfbGliIEZGSTo6TGlicmFyeTo6TElCQworICAgICMgICAgICBhdHRhY2hfZnVuY3Rpb24gOm1hbGxvYywgWzpzaXplX3RdLCA6cG9pbnRlcgorICAgICMgICAgZW5kCisgICAgIyAgICAjIG5vdyBjYWxsYWJsZSB2aWEgRm9vLm1hbGxvYworICAgICMgQG92ZXJsb2FkIGF0dGFjaF9mdW5jdGlvbihuYW1lLCBmdW5jLCBhcmdzLCByZXR1cm5zLCBvcHRpb25zID0ge30pCisgICAgIyAgQGV4YW1wbGUgYXR0YWNoIGZ1bmN0aW9uIHdpdGggYW4gZXhwbGljaXQgbmFtZQorICAgICMgICAgbW9kdWxlIEJhcgorICAgICMgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgIyAgICAgIGZmaV9saWIgRkZJOjpMaWJyYXJ5OjpMSUJDCisgICAgIyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6Y19tYWxsb2MsIDptYWxsb2MsIFs6c2l6ZV90XSwgOnBvaW50ZXIKKyAgICAjICAgIGVuZAorICAgICMgICAgIyBub3cgY2FsbGFibGUgdmlhIEJhci5jX21hbGxvYworICAgICMKKyAgICAjIEF0dGFjaCBDIGZ1bmN0aW9uICtmdW5jKyB0byB0aGlzIG1vZHVsZS4KKyAgICAjCisgICAgIworICAgICMgQHBhcmFtIFsjdG9fc10gbmFtZSBuYW1lIG9mIHJ1YnkgbWV0aG9kIHRvIGF0dGFjaCBhcworICAgICMgQHBhcmFtIFsjdG9fc10gZnVuYyBuYW1lIG9mIEMgZnVuY3Rpb24gdG8gYXR0YWNoCisgICAgIyBAcGFyYW0gW0FycmF5PFN5bWJvbD5dIGFyZ3MgYW4gYXJyYXkgb2YgdHlwZXMKKyAgICAjIEBwYXJhbSBbU3ltYm9sXSByZXR1cm5zIHR5cGUgb2YgcmV0dXJuIHZhbHVlCisgICAgIyBAb3B0aW9uIG9wdGlvbnMgW0Jvb2xlYW5dIDpibG9ja2luZyAoQGJsb2NraW5nKSBzZXQgdG8gdHJ1ZSBpZiB0aGUgQyBmdW5jdGlvbiBpcyBhIGJsb2NraW5nIGNhbGwKKyAgICAjIEBvcHRpb24gb3B0aW9ucyBbU3ltYm9sXSA6Y29udmVudGlvbiAoOmRlZmF1bHQpIGNhbGxpbmcgY29udmVudGlvbiAoc2VlIHsjZmZpX2NvbnZlbnRpb259KQorICAgICMgQG9wdGlvbiBvcHRpb25zIFtGRkk6OkVudW1zXSA6ZW51bXMKKyAgICAjIEBvcHRpb24gb3B0aW9ucyBbSGFzaF0gOnR5cGVfbWFwCisgICAgIworICAgICMgQHJldHVybiBbRkZJOjpWYXJpYWRpY0ludm9rZXJdCisgICAgIworICAgICMgQHJhaXNlIFtGRkk6Ok5vdEZvdW5kRXJyb3JdIGlmICtmdW5jKyBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGF0dGFjaGVkIGxpYnJhcmllcyAoc2VlIHsjZmZpX2xpYn0pCisgICAgZGVmIGF0dGFjaF9mdW5jdGlvbihuYW1lLCBmdW5jLCBhcmdzLCByZXR1cm5zID0gbmlsLCBvcHRpb25zID0gbmlsKQorICAgICAgbW5hbWUsIGEyLCBhMywgYTQsIGE1ID0gbmFtZSwgZnVuYywgYXJncywgcmV0dXJucywgb3B0aW9ucworICAgICAgY25hbWUsIGFyZ190eXBlcywgcmV0X3R5cGUsIG9wdHMgPSAoYTQgJiYgKGEyLmlzX2E/KFN0cmluZykgfHwgYTIuaXNfYT8oU3ltYm9sKSkpID8gWyBhMiwgYTMsIGE0LCBhNSBdIDogWyBtbmFtZS50b19zLCBhMiwgYTMsIGE0IF0KKworICAgICAgIyBDb252ZXJ0IDpmb28gdG8gdGhlIG5hdGl2ZSB0eXBlCisgICAgICBhcmdfdHlwZXMgPSBhcmdfdHlwZXMubWFwIHsgfGV8IGZpbmRfdHlwZShlKSB9CisgICAgICBvcHRpb25zID0geworICAgICAgICA6Y29udmVudGlvbiA9PiBmZmlfY29udmVudGlvbiwKKyAgICAgICAgOnR5cGVfbWFwID0+IGRlZmluZWQ/KEBmZmlfdHlwZWRlZnMpID8gQGZmaV90eXBlZGVmcyA6IG5pbCwKKyAgICAgICAgOmJsb2NraW5nID0+IGRlZmluZWQ/KEBibG9ja2luZykgJiYgQGJsb2NraW5nLAorICAgICAgICA6ZW51bXMgPT4gZGVmaW5lZD8oQGZmaV9lbnVtcykgPyBAZmZpX2VudW1zIDogbmlsLAorICAgICAgfQorCisgICAgICBAYmxvY2tpbmcgPSBmYWxzZQorICAgICAgb3B0aW9ucy5tZXJnZSEob3B0cykgaWYgb3B0cyAmJiBvcHRzLmlzX2E/KEhhc2gpCisKKyAgICAgICMgVHJ5IHRvIGxvY2F0ZSB0aGUgZnVuY3Rpb24gaW4gYW55IG9mIHRoZSBsaWJyYXJpZXMKKyAgICAgIGludm9rZXJzID0gW10KKyAgICAgIGZmaV9saWJyYXJpZXMuZWFjaCBkbyB8bGlifAorICAgICAgICBpZiBpbnZva2Vycy5lbXB0eT8KKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgZnVuY3Rpb24gPSBuaWwKKyAgICAgICAgICAgIGZ1bmN0aW9uX25hbWVzKGNuYW1lLCBhcmdfdHlwZXMpLmZpbmQgZG8gfGZuYW1lfAorICAgICAgICAgICAgICBmdW5jdGlvbiA9IGxpYi5maW5kX2Z1bmN0aW9uKGZuYW1lKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICByYWlzZSBMb2FkRXJyb3IgdW5sZXNzIGZ1bmN0aW9uCisKKyAgICAgICAgICAgIGludm9rZXJzIDw8IGlmIGFyZ190eXBlcy5sZW5ndGggPiAwICYmIGFyZ190eXBlc1thcmdfdHlwZXMubGVuZ3RoIC0gMV0gPT0gRkZJOjpOYXRpdmVUeXBlOjpWQVJBUkdTCisgICAgICAgICAgICAgIFZhcmlhZGljSW52b2tlci5uZXcoZnVuY3Rpb24sIGFyZ190eXBlcywgZmluZF90eXBlKHJldF90eXBlKSwgb3B0aW9ucykKKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBGdW5jdGlvbi5uZXcoZmluZF90eXBlKHJldF90eXBlKSwgYXJnX3R5cGVzLCBmdW5jdGlvbiwgb3B0aW9ucykKKyAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgcmVzY3VlIExvYWRFcnJvcgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgaW52b2tlciA9IGludm9rZXJzLmNvbXBhY3Quc2hpZnQKKyAgICAgIHJhaXNlIEZGSTo6Tm90Rm91bmRFcnJvci5uZXcoY25hbWUudG9fcywgZmZpX2xpYnJhcmllcy5tYXAgeyB8bGlifCBsaWIubmFtZSB9KSB1bmxlc3MgaW52b2tlcgorCisgICAgICBpbnZva2VyLmF0dGFjaChzZWxmLCBtbmFtZS50b19zKQorICAgICAgaW52b2tlcgorICAgIGVuZAorCisgICAgIyBAcGFyYW0gWyN0b19zXSBuYW1lIGZ1bmN0aW9uIG5hbWUKKyAgICAjIEBwYXJhbSBbQXJyYXldIGFyZ190eXBlcyBmdW5jdGlvbidzIGFyZ3VtZW50IHR5cGVzCisgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmc+XQorICAgICMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbGlzdCBvZiBwb3NzaWJsZSBuYW1lcyB0byBsb29rdXAuCisgICAgIyBAbm90ZSBGdW5jdGlvbiBuYW1lcyBvbiB3aW5kb3dzIG1heSBiZSBkZWNvcmF0ZWQgaWYgdGhleSBhcmUgdXNpbmcgc3RkY2FsbC4gU2VlCisgICAgIyAgICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYW1lX21hbmdsaW5nI0NfbmFtZV9kZWNvcmF0aW9uX2luX01pY3Jvc29mdF9XaW5kb3dzCisgICAgIyAgICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3p4azB0dzkzJTI4dj1WUy4xMDAlMjkuYXNweAorICAgICMgICAqIGh0dHA6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvWDg2X0Rpc2Fzc2VtYmx5L0NhbGxpbmdfQ29udmVudGlvbnMjU1REQ0FMTAorICAgICMgICBOb3RlIHRoYXQgZGVjb3JhdGVkIG5hbWVzIGNhbiBiZSBvdmVycmlkZGVuIHZpYSBkZWYgZmlsZXMuICBBbHNvIG5vdGUgdGhhdCB0aGUKKyAgICAjICAgd2luZG93cyBhcGksIGFsdGhvdWdoIHVzaW5nLCBkb2Vzbid0IGhhdmUgZGVjb3JhdGVkIG5hbWVzLgorICAgIGRlZiBmdW5jdGlvbl9uYW1lcyhuYW1lLCBhcmdfdHlwZXMpCisgICAgICByZXN1bHQgPSBbbmFtZS50b19zXQorICAgICAgaWYgZmZpX2NvbnZlbnRpb24gPT0gOnN0ZGNhbGwKKyAgICAgICAgIyBHZXQgdGhlIHNpemUgb2YgZWFjaCBwYXJhbWV0ZXIKKyAgICAgICAgc2l6ZSA9IGFyZ190eXBlcy5pbmplY3QoMCkgZG8gfG1lbSwgYXJnfAorICAgICAgICAgIHNpemUgPSBhcmcuc2l6ZQorICAgICAgICAgICMgVGhlIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICAgICAgICBzaXplICs9ICg0IC0gc2l6ZSkgJSA0CisgICAgICAgICAgbWVtICsgc2l6ZQorICAgICAgICBlbmQKKworICAgICAgICByZXN1bHQgPDwgIl8je25hbWUudG9fc31AI3tzaXplfSIgIyB3aW4zMgorICAgICAgICByZXN1bHQgPDwgIiN7bmFtZS50b19zfUAje3NpemV9IiAjIHdpbjY0CisgICAgICBlbmQKKyAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgIyBAb3ZlcmxvYWQgYXR0YWNoX3ZhcmlhYmxlKG1uYW1lLCBjbmFtZSwgdHlwZSkKKyAgICAjICAgQHBhcmFtIFsjdG9fc10gbW5hbWUgbmFtZSBvZiBydWJ5IG1ldGhvZCB0byBhdHRhY2ggYXMKKyAgICAjICAgQHBhcmFtIFsjdG9fc10gY25hbWUgbmFtZSBvZiBDIHZhcmlhYmxlIHRvIGF0dGFjaAorICAgICMgICBAcGFyYW0gW0RhdGFDb252ZXJ0ZXIsIFN0cnVjdCwgU3ltYm9sLCBUeXBlXSB0eXBlIEMgdmFyaWFibGUncyB0eXBlCisgICAgIyAgIEBleGFtcGxlCisgICAgIyAgICAgbW9kdWxlIEJhcgorICAgICMgICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICMgICAgICAgZmZpX2xpYiAnbXlfbGliJworICAgICMgICAgICAgYXR0YWNoX3ZhcmlhYmxlIDpjX215dmFyLCA6bXl2YXIsIDpsb25nCisgICAgIyAgICAgZW5kCisgICAgIyAgICAgIyBub3cgY2FsbGFibGUgdmlhIEJhci5jX215dmFyCisgICAgIyBAb3ZlcmxvYWQgYXR0YWNoX3ZhcmlhYmxlKGNuYW1lLCB0eXBlKQorICAgICMgICBAcGFyYW0gWyN0b19zXSBtbmFtZSBuYW1lIG9mIHJ1YnkgbWV0aG9kIHRvIGF0dGFjaCBhcworICAgICMgICBAcGFyYW0gW0RhdGFDb252ZXJ0ZXIsIFN0cnVjdCwgU3ltYm9sLCBUeXBlXSB0eXBlIEMgdmFyaWFibGUncyB0eXBlCisgICAgIyAgIEBleGFtcGxlCisgICAgIyAgICAgbW9kdWxlIEJhcgorICAgICMgICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICMgICAgICAgZmZpX2xpYiAnbXlfbGliJworICAgICMgICAgICAgYXR0YWNoX3ZhcmlhYmxlIDpteXZhciwgOmxvbmcKKyAgICAjICAgICBlbmQKKyAgICAjICAgICAjIG5vdyBjYWxsYWJsZSB2aWEgQmFyLm15dmFyCisgICAgIyBAcmV0dXJuIFtEeW5hbWljTGlicmFyeTo6U3ltYm9sXQorICAgICMgQHJhaXNlIHtGRkk6Ok5vdEZvdW5kRXJyb3J9IGlmICtjbmFtZSsgY2Fubm90IGJlIGZvdW5kIGluIGxpYnJhcmllcworICAgICMKKyAgICAjIEF0dGFjaCBDIHZhcmlhYmxlICtjbmFtZSsgdG8gdGhpcyBtb2R1bGUuCisgICAgZGVmIGF0dGFjaF92YXJpYWJsZShtbmFtZSwgYTEsIGEyID0gbmlsKQorICAgICAgY25hbWUsIHR5cGUgPSBhMiA/IFsgYTEsIGEyIF0gOiBbIG1uYW1lLnRvX3MsIGExIF0KKyAgICAgIGFkZHJlc3MgPSBuaWwKKyAgICAgIGZmaV9saWJyYXJpZXMuZWFjaCBkbyB8bGlifAorICAgICAgICBiZWdpbgorICAgICAgICAgIGFkZHJlc3MgPSBsaWIuZmluZF92YXJpYWJsZShjbmFtZS50b19zKQorICAgICAgICAgIGJyZWFrIHVubGVzcyBhZGRyZXNzLm5pbD8KKyAgICAgICAgcmVzY3VlIExvYWRFcnJvcgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICByYWlzZSBGRkk6Ok5vdEZvdW5kRXJyb3IubmV3KGNuYW1lLCBmZmlfbGlicmFyaWVzKSBpZiBhZGRyZXNzLm5pbD8gfHwgYWRkcmVzcy5udWxsPworICAgICAgaWYgdHlwZS5pc19hPyhDbGFzcykgJiYgdHlwZSA8IEZGSTo6U3RydWN0CisgICAgICAgICMgSWYgaXQgaXMgYSBnbG9iYWwgc3RydWN0LCBqdXN0IGF0dGFjaCBkaXJlY3RseSB0byB0aGUgcG9pbnRlcgorICAgICAgICBzID0gdHlwZS5uZXcoYWRkcmVzcykKKyAgICAgICAgc2VsZi5tb2R1bGVfZXZhbCA8PC1jb2RlLCBfX0ZJTEVfXywgX19MSU5FX18KKyAgICAgICAgICBAQGZmaV9ndmFyXyN7bW5hbWV9ID0gcworICAgICAgICAgIGRlZiBzZWxmLiN7bW5hbWV9CisgICAgICAgICAgICBAQGZmaV9ndmFyXyN7bW5hbWV9CisgICAgICAgICAgZW5kCisgICAgICAgIGNvZGUKKworICAgICAgZWxzZQorICAgICAgICBzYyA9IENsYXNzLm5ldyhGRkk6OlN0cnVjdCkKKyAgICAgICAgc2MubGF5b3V0IDpndmFyLCBmaW5kX3R5cGUodHlwZSkKKyAgICAgICAgcyA9IHNjLm5ldyhhZGRyZXNzKQorICAgICAgICAjCisgICAgICAgICMgQXR0YWNoIHRvIHRoaXMgbW9kdWxlIGFzIG1uYW1lL21uYW1lPQorICAgICAgICAjCisgICAgICAgIHNlbGYubW9kdWxlX2V2YWwgPDwtY29kZSwgX19GSUxFX18sIF9fTElORV9fCisgICAgICAgICAgQEBmZmlfZ3Zhcl8je21uYW1lfSA9IHMKKyAgICAgICAgICBkZWYgc2VsZi4je21uYW1lfQorICAgICAgICAgICAgQEBmZmlfZ3Zhcl8je21uYW1lfVs6Z3Zhcl0KKyAgICAgICAgICBlbmQKKyAgICAgICAgICBkZWYgc2VsZi4je21uYW1lfT0odmFsdWUpCisgICAgICAgICAgICBAQGZmaV9ndmFyXyN7bW5hbWV9WzpndmFyXSA9IHZhbHVlCisgICAgICAgICAgZW5kCisgICAgICAgIGNvZGUKKworICAgICAgZW5kCisKKyAgICAgIGFkZHJlc3MKKyAgICBlbmQKKworCisgICAgIyBAb3ZlcmxvYWQgY2FsbGJhY2sobmFtZSwgcGFyYW1zLCByZXQpCisgICAgIyAgIEBwYXJhbSBuYW1lIGNhbGxiYWNrIG5hbWUgdG8gYWRkIHRvIHR5cGUgbWFwCisgICAgIyAgIEBwYXJhbSBbQXJyYXldIHBhcmFtcyBhcnJheSBvZiBwYXJhbWV0ZXJzJyB0eXBlcworICAgICMgICBAcGFyYW0gW0RhdGFDb252ZXJ0ZXIsIFN0cnVjdCwgU3ltYm9sLCBUeXBlXSByZXQgY2FsbGJhY2sgcmV0dXJuIHR5cGUKKyAgICAjIEBvdmVybG9hZCBjYWxsYmFjayhwYXJhbXMsIHJldCkKKyAgICAjICAgQHBhcmFtIFtBcnJheV0gcGFyYW1zIGFycmF5IG9mIHBhcmFtZXRlcnMnIHR5cGVzCisgICAgIyAgIEBwYXJhbSBbRGF0YUNvbnZlcnRlciwgU3RydWN0LCBTeW1ib2wsIFR5cGVdIHJldCBjYWxsYmFjayByZXR1cm4gdHlwZQorICAgICMgQHJldHVybiBbRkZJOjpDYWxsYmFja0luZm9dCisgICAgZGVmIGNhbGxiYWNrKCphcmdzKQorICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMiIGlmIGFyZ3MubGVuZ3RoIDwgMiB8fCBhcmdzLmxlbmd0aCA+IDMKKyAgICAgIG5hbWUsIHBhcmFtcywgcmV0ID0gaWYgYXJncy5sZW5ndGggPT0gMworICAgICAgICBhcmdzCisgICAgICBlbHNlCisgICAgICAgIFsgbmlsLCBhcmdzWzBdLCBhcmdzWzFdIF0KKyAgICAgIGVuZAorCisgICAgICBuYXRpdmVfcGFyYW1zID0gcGFyYW1zLm1hcCB7IHxlfCBmaW5kX3R5cGUoZSkgfQorICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgImNhbGxiYWNrcyBjYW5ub3QgaGF2ZSB2YXJpYWRpYyBwYXJhbWV0ZXJzIiBpZiBuYXRpdmVfcGFyYW1zLmluY2x1ZGU/KEZGSTo6VHlwZTo6VkFSQVJHUykKKyAgICAgIG9wdGlvbnMgPSBIYXNoLm5ldworICAgICAgb3B0aW9uc1s6Y29udmVudGlvbl0gPSBmZmlfY29udmVudGlvbgorICAgICAgb3B0aW9uc1s6ZW51bXNdID0gQGZmaV9lbnVtcyBpZiBkZWZpbmVkPyhAZmZpX2VudW1zKQorICAgICAgY2IgPSBGRkk6OkNhbGxiYWNrSW5mby5uZXcoZmluZF90eXBlKHJldCksIG5hdGl2ZV9wYXJhbXMsIG9wdGlvbnMpCisKKyAgICAgICMgQWRkIHRvIHRoZSBzeW1ib2wgLT4gdHlwZSBtYXAgKHVubGVzcyB0aGVyZSB3YXMgbm8gbmFtZSkKKyAgICAgIHVubGVzcyBuYW1lLm5pbD8KKyAgICAgICAgdHlwZWRlZiBjYiwgbmFtZQorICAgICAgZW5kCisKKyAgICAgIGNiCisgICAgZW5kCisKKyAgICAjIFJlZ2lzdGVyIG9yIGdldCBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgdHlwZSBkZWZpbml0aW9uLgorICAgICMKKyAgICAjIFRvIHJlZ2lzdGVyIGEgbmV3IHR5cGUgZGVmaW5pdGlvbiwgK29sZCsgc2hvdWxkIGJlIGEge0ZGSTo6VHlwZX0uICthZGQrCisgICAgIyBpcyBpbiB0aGlzIGNhc2UgdGhlIHR5cGUgZGVmaW5pdGlvbi4KKyAgICAjCisgICAgIyBJZiArb2xkKyBpcyBhIHtEYXRhQ29udmVydGVyfSwgYSB7VHlwZTo6TWFwcGVkfSBpcyByZXR1cm5lZC4KKyAgICAjCisgICAgIyBJZiArb2xkKyBpcyArOmVudW0rCisgICAgIyAqIGFuZCArYWRkKyBpcyBhbiArQXJyYXkrLCBhIGNhbGwgdG8geyNlbnVtfSBpcyBtYWRlIHdpdGggK2FkZCsgYXMgc2luZ2xlIHBhcmFtZXRlcjsKKyAgICAjICogaW4gb3RoZXJzIGNhc2VzLCAraW5mbysgaXMgdXNlZCB0byBjcmVhdGUgYSBuYW1lZCBlbnVtLgorICAgICMKKyAgICAjIElmICtvbGQrIGlzIGEga2V5IGZvciB0eXBlIG1hcCwgI3R5cGVkZWYgZ2V0ICtvbGQrIHR5cGUgZGVmaW5pdGlvbi4KKyAgICAjCisgICAgIyBAcGFyYW0gW0RhdGFDb252ZXJ0ZXIsIFN5bWJvbCwgVHlwZV0gb2xkCisgICAgIyBAcGFyYW0gW1N5bWJvbF0gYWRkCisgICAgIyBAcGFyYW0gW1N5bWJvbF0gaW5mbworICAgICMgQHJldHVybiBbRkZJOjpFbnVtLCBGRkk6OlR5cGVdCisgICAgZGVmIHR5cGVkZWYob2xkLCBhZGQsIGluZm89bmlsKQorICAgICAgQGZmaV90eXBlZGVmcyA9IEhhc2gubmV3IHVubGVzcyBkZWZpbmVkPyhAZmZpX3R5cGVkZWZzKQorCisgICAgICBAZmZpX3R5cGVkZWZzW2FkZF0gPSBpZiBvbGQua2luZF9vZj8oRkZJOjpUeXBlKQorICAgICAgICBvbGQKKworICAgICAgZWxzaWYgQGZmaV90eXBlZGVmcy5oYXNfa2V5PyhvbGQpCisgICAgICAgIEBmZmlfdHlwZWRlZnNbb2xkXQorCisgICAgICBlbHNpZiBvbGQuaXNfYT8oRGF0YUNvbnZlcnRlcikKKyAgICAgICAgRkZJOjpUeXBlOjpNYXBwZWQubmV3KG9sZCkKKworICAgICAgZWxzaWYgb2xkID09IDplbnVtCisgICAgICAgIGlmIGFkZC5raW5kX29mPyhBcnJheSkKKyAgICAgICAgICBzZWxmLmVudW0oYWRkKQorICAgICAgICBlbHNlCisgICAgICAgICAgc2VsZi5lbnVtKGluZm8sIGFkZCkKKyAgICAgICAgZW5kCisKKyAgICAgIGVsc2UKKyAgICAgICAgRkZJLmZpbmRfdHlwZShvbGQpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQG92ZXJsb2FkIGVudW0obmFtZSwgdmFsdWVzKQorICAgICMgIENyZWF0ZSBhIG5hbWVkIGVudW0uCisgICAgIyAgQGV4YW1wbGUKKyAgICAjICAgZW51bSA6Zm9vLCBbOnplcm8sIDpvbmUsIDp0d29dICAjIG5hbWVkIGVudW0KKyAgICAjICBAcGFyYW0gW1N5bWJvbF0gbmFtZSBuYW1lIGZvciBuZXcgZW51bQorICAgICMgIEBwYXJhbSBbQXJyYXldIHZhbHVlcyB2YWx1ZXMgZm9yIGVudW0KKyAgICAjIEBvdmVybG9hZCBlbnVtKCphcmdzKQorICAgICMgIENyZWF0ZSBhbiB1bm5hbWVkIGVudW0uCisgICAgIyAgQGV4YW1wbGUKKyAgICAjICAgZW51bSA6emVybywgOm9uZSwgOnR3byAgIyB1bm5hbWVkIGVudW0KKyAgICAjICBAcGFyYW0gYXJncyB2YWx1ZXMgZm9yIGVudW0KKyAgICAjIEBvdmVybG9hZCBlbnVtKHZhbHVlcykKKyAgICAjICBDcmVhdGUgYW4gdW5uYW1lZCBlbnVtLgorICAgICMgIEBleGFtcGxlCisgICAgIyAgIGVudW0gWzp6ZXJvLCA6b25lLCA6dHdvXSAgIyB1bm5hbWVkIGVudW0sIGVxdWl2YWxlbnQgdG8gYWJvdmUgZXhhbXBsZQorICAgICMgIEBwYXJhbSBbQXJyYXldIHZhbHVlcyB2YWx1ZXMgZm9yIGVudW0KKyAgICAjIEBvdmVybG9hZCBlbnVtKG5hdGl2ZV90eXBlLCBuYW1lLCB2YWx1ZXMpCisgICAgIyAgQ3JlYXRlIGEgbmFtZWQgZW51bSBhbmQgc3BlY2lmeSB0aGUgbmF0aXZlIHR5cGUuCisgICAgIyAgQGV4YW1wbGUKKyAgICAjICAgZW51bSBGRkk6OlR5cGU6OlVJTlQ2NCwgOmZvbywgWzp6ZXJvLCA6b25lLCA6dHdvXSAgIyBuYW1lZCBlbnVtCisgICAgIyAgQHBhcmFtIFtGRkk6OlR5cGVdIG5hdGl2ZV90eXBlIG5hdGl2ZSB0eXBlIGZvciBuZXcgZW51bQorICAgICMgIEBwYXJhbSBbU3ltYm9sXSBuYW1lIG5hbWUgZm9yIG5ldyBlbnVtCisgICAgIyAgQHBhcmFtIFtBcnJheV0gdmFsdWVzIHZhbHVlcyBmb3IgZW51bQorICAgICMgQG92ZXJsb2FkIGVudW0obmF0aXZlX3R5cGUsICphcmdzKQorICAgICMgIENyZWF0ZSBhbiB1bm5hbWVkIGVudW0gYW5kIHNwZWNpZnkgdGhlIG5hdGl2ZSB0eXBlLgorICAgICMgIEBleGFtcGxlCisgICAgIyAgIGVudW0gRkZJOjpUeXBlOjpVSU5UNjQsIDp6ZXJvLCA6b25lLCA6dHdvICAjIHVubmFtZWQgZW51bQorICAgICMgIEBwYXJhbSBbRkZJOjpUeXBlXSBuYXRpdmVfdHlwZSBuYXRpdmUgdHlwZSBmb3IgbmV3IGVudW0KKyAgICAjICBAcGFyYW0gYXJncyB2YWx1ZXMgZm9yIGVudW0KKyAgICAjIEBvdmVybG9hZCBlbnVtKG5hdGl2ZV90eXBlLCB2YWx1ZXMpCisgICAgIyAgQ3JlYXRlIGFuIHVubmFtZWQgZW51bSBhbmQgc3BlY2lmeSB0aGUgbmF0aXZlIHR5cGUuCisgICAgIyAgQGV4YW1wbGUKKyAgICAjICAgZW51bSBUeXBlOjpVSU5UNjQsIFs6emVybywgOm9uZSwgOnR3b10gICMgdW5uYW1lZCBlbnVtLCBlcXVpdmFsZW50IHRvIGFib3ZlIGV4YW1wbGUKKyAgICAjICBAcGFyYW0gW0ZGSTo6VHlwZV0gbmF0aXZlX3R5cGUgbmF0aXZlIHR5cGUgZm9yIG5ldyBlbnVtCisgICAgIyAgQHBhcmFtIFtBcnJheV0gdmFsdWVzIHZhbHVlcyBmb3IgZW51bQorICAgICMgQHJldHVybiBbRkZJOjpFbnVtXQorICAgICMgQ3JlYXRlIGEgbmV3IHtGRkk6OkVudW19LgorICAgIGRlZiBlbnVtKCphcmdzKQorICAgICAgbmF0aXZlX3R5cGUgPSBhcmdzLmZpcnN0LmtpbmRfb2Y/KEZGSTo6VHlwZSkgPyBhcmdzLnNoaWZ0IDogbmlsCisgICAgICBuYW1lLCB2YWx1ZXMgPSBpZiBhcmdzWzBdLmtpbmRfb2Y/KFN5bWJvbCkgJiYgYXJnc1sxXS5raW5kX29mPyhBcnJheSkKKyAgICAgICAgWyBhcmdzWzBdLCBhcmdzWzFdIF0KKyAgICAgIGVsc2lmIGFyZ3NbMF0ua2luZF9vZj8oQXJyYXkpCisgICAgICAgIFsgbmlsLCBhcmdzWzBdIF0KKyAgICAgIGVsc2UKKyAgICAgICAgWyBuaWwsIGFyZ3MgXQorICAgICAgZW5kCisgICAgICBAZmZpX2VudW1zID0gRkZJOjpFbnVtcy5uZXcgdW5sZXNzIGRlZmluZWQ/KEBmZmlfZW51bXMpCisgICAgICBAZmZpX2VudW1zIDw8IChlID0gbmF0aXZlX3R5cGUgPyBGRkk6OkVudW0ubmV3KG5hdGl2ZV90eXBlLCB2YWx1ZXMsIG5hbWUpIDogRkZJOjpFbnVtLm5ldyh2YWx1ZXMsIG5hbWUpKQorCisgICAgICAjIElmIGNhbGxlZCBhcyBlbnVtIDpmb28sIFsgOnplcm8sIDpvbmUsIDp0d28gXSwgYWRkIGEgdHlwZWRlZiBhbGlhcworICAgICAgdHlwZWRlZihlLCBuYW1lKSBpZiBuYW1lCisgICAgICBlCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSBuYW1lCisgICAgIyBAcmV0dXJuIFtGRkk6OkVudW1dCisgICAgIyBGaW5kIGFuIGVudW0gYnkgbmFtZS4KKyAgICBkZWYgZW51bV90eXBlKG5hbWUpCisgICAgICBAZmZpX2VudW1zLmZpbmQobmFtZSkgaWYgZGVmaW5lZD8oQGZmaV9lbnVtcykKKyAgICBlbmQKKworICAgICMgQHBhcmFtIHN5bWJvbAorICAgICMgQHJldHVybiBbRkZJOjpFbnVtXQorICAgICMgRmluZCBhbiBlbnVtIGJ5IGEgc3ltYm9sIGl0IGNvbnRhaW5zLgorICAgIGRlZiBlbnVtX3ZhbHVlKHN5bWJvbCkKKyAgICAgIEBmZmlfZW51bXMuX19tYXBfc3ltYm9sKHN5bWJvbCkKKyAgICBlbmQKKworICAgICMgQHBhcmFtIFtEYXRhQ29udmVydGVyLCBUeXBlLCBTdHJ1Y3QsIFN5bWJvbF0gdCB0eXBlIHRvIGZpbmQKKyAgICAjIEByZXR1cm4gW1R5cGVdCisgICAgIyBGaW5kIGEgdHlwZSBkZWZpbml0aW9uLgorICAgIGRlZiBmaW5kX3R5cGUodCkKKyAgICAgIGlmIHQua2luZF9vZj8oVHlwZSkKKyAgICAgICAgdAorCisgICAgICBlbHNpZiBkZWZpbmVkPyhAZmZpX3R5cGVkZWZzKSAmJiBAZmZpX3R5cGVkZWZzLmhhc19rZXk/KHQpCisgICAgICAgIEBmZmlfdHlwZWRlZnNbdF0KKworICAgICAgZWxzaWYgdC5pc19hPyhDbGFzcykgJiYgdCA8IFN0cnVjdAorICAgICAgICBUeXBlOjpQT0lOVEVSCisKKyAgICAgIGVsc2lmIHQuaXNfYT8oRGF0YUNvbnZlcnRlcikKKyAgICAgICAgIyBBZGQgYSB0eXBlZGVmIHNvIG5leHQgdGltZSB0aGUgY29udmVydGVyIGlzIHVzZWQsIGl0IGhpdHMgdGhlIGNhY2hlCisgICAgICAgIHR5cGVkZWYgVHlwZTo6TWFwcGVkLm5ldyh0KSwgdAorCisgICAgICBlbmQgfHwgRkZJLmZpbmRfdHlwZSh0KQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL21hbmFnZWRzdHJ1Y3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvbWFuYWdlZHN0cnVjdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTM2MjgwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL21hbmFnZWRzdHJ1Y3QucmIKQEAgLTAsMCArMSw4NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDggTWlrZSBEYWxlc3NpbworIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorIworIyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworIyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisjIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisjIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisjIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK21vZHVsZSBGRkkKKyAgIworICAjIEZGSTo6TWFuYWdlZFN0cnVjdCBhbGxvd3MgY3VzdG9tIGdhcmJhZ2UtY29sbGVjdGlvbiBvZiB5b3VyIEZGSTo6U3RydWN0cy4KKyAgIworICAjIFRoZSB0eXBpY2FsIHVzZSBjYXNlIHdvdWxkIGJlIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBhIGxpYnJhcnkKKyAgIyB0aGF0IGhhcyBhIG5vbnRyaXZpYWwgbWVtb3J5IG1hbmFnZW1lbnQgZGVzaWduLCBzdWNoIGFzIGEgbGlua2VkCisgICMgbGlzdCBvciBhIGJpbmFyeSB0cmVlLgorICAjCisgICMgV2hlbiB0aGUge1N0cnVjdH0gaW5zdGFuY2UgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQsIEZGSTo6TWFuYWdlZFN0cnVjdCB3aWxsCisgICMgaW52b2tlIHRoZSBjbGFzcydzIHJlbGVhc2UoKSBtZXRob2QgZHVyaW5nIG9iamVjdCBmaW5hbGl6YXRpb24uCisgICMKKyAgIyBAZXhhbXBsZSBFeGFtcGxlIHVzYWdlOgorICAjICBtb2R1bGUgTXlMaWJyYXJ5CisgICMgICAgZmZpX2xpYiAibGlibXlsaWJyYXJ5IgorICAjICAgIGF0dGFjaF9mdW5jdGlvbiA6bmV3X2RsaXN0LCBbXSwgOnBvaW50ZXIKKyAgIyAgICBhdHRhY2hfZnVuY3Rpb24gOmRlc3Ryb3lfZGxpc3QsIFs6cG9pbnRlcl0sIDp2b2lkCisgICMgIGVuZAorICAjICAKKyAgIyAgY2xhc3MgRG91Ymx5TGlua2VkTGlzdCA8IEZGSTo6TWFuYWdlZFN0cnVjdAorICAjICAgIEBAQAorICAjICAgIHN0cnVjdCBkbyB8c3wKKyAgIyAgICAgIHMubmFtZSAnc3RydWN0IGRsaXN0JworICAjICAgICAgcy5pbmNsdWRlICdkbGlzdC5oJworICAjICAgICAgcy5maWVsZCA6aGVhZCwgOnBvaW50ZXIKKyAgIyAgICAgIHMuZmllbGQgOnRhaWwsIDpwb2ludGVyCisgICMgICAgZW5kCisgICMgICAgQEBACisgICMKKyAgIyAgICBkZWYgc2VsZi5yZWxlYXNlIHB0cgorICAjICAgICAgTXlMaWJyYXJ5LmRlc3Ryb3lfZGxpc3QocHRyKQorICAjICAgIGVuZAorICAjICBlbmQKKyAgIworICAjICBiZWdpbgorICAjICAgIHB0ciA9IERvdWJseUxpbmtlZExpc3QubmV3KE15TGlicmFyeS5uZXdfZGxpc3QpCisgICMgICAgIyAgZG8gc29tZXRoaW5nIHdpdGggdGhlIGxpc3QKKyAgIyAgZW5kCisgICMgICMgc3RydWN0IGlzIG91dCBvZiBzY29wZSwgYW5kIHdpbGwgYmUgR0MnZCB1c2luZyBEb3VibHlMaW5rZWRMaXN0I3JlbGVhc2UKKyAgIworICAjCisgIGNsYXNzIE1hbmFnZWRTdHJ1Y3QgPCBGRkk6OlN0cnVjdAorCisgICAgIyBAb3ZlcmxvYWQgaW5pdGlhbGl6ZShwb2ludGVyKQorICAgICMgIEBwYXJhbSBbUG9pbnRlcl0gcG9pbnRlcgorICAgICMgIENyZWF0ZSBhIG5ldyBNYW5hZ2VkU3RydWN0IHdoaWNoIHdpbGwgaW52b2tlIHRoZSBjbGFzcyBtZXRob2QgI3JlbGVhc2Ugb24gCisgICAgIyBAb3ZlcmxvYWQgaW5pdGlhbGl6ZQorICAgICMgQSBuZXcgaW5zdGFuY2Ugb2YgRkZJOjpNYW5hZ2VkU3RydWN0LgorICAgIGRlZiBpbml0aWFsaXplKHBvaW50ZXI9bmlsKQorICAgICAgcmFpc2UgTm9NZXRob2RFcnJvciwgInJlbGVhc2UoKSBub3QgaW1wbGVtZW50ZWQgZm9yIGNsYXNzICN7c2VsZn0iIHVubGVzcyBzZWxmLmNsYXNzLnJlc3BvbmRfdG8/IDpyZWxlYXNlCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiTXVzdCBzdXBwbHkgYSBwb2ludGVyIHRvIG1lbW9yeSBmb3IgdGhlIFN0cnVjdCIgdW5sZXNzIHBvaW50ZXIKKyAgICAgIHN1cGVyIEF1dG9Qb2ludGVyLm5ldyhwb2ludGVyLCBzZWxmLmNsYXNzLm1ldGhvZCg6cmVsZWFzZSkpCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9tZW1vcnlwb2ludGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL21lbW9yeXBvaW50ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwN2JjNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9tZW1vcnlwb2ludGVyLnJiCkBAIC0wLDAgKzEgQEAKKyMgVGhpcyBjbGFzcyBpcyBub3cgaW1wbGVtZW50ZWQgaW4gQwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOTM0NTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0ucmIKQEAgLTAsMCArMSwxNTkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFdheW5lIE1laXNzbmVyCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisjCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisjICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4jCisKK3JlcXVpcmUgJ3JiY29uZmlnJworbW9kdWxlIEZGSQorICBjbGFzcyBQbGF0Zm9ybUVycm9yIDwgTG9hZEVycm9yOyBlbmQKKworICAjIFRoaXMgbW9kdWxlIGRlZmluZXMgZGlmZmVyZW50IGNvbnN0YW50cyBhbmQgY2xhc3MgbWV0aG9kcyB0byBwbGF5IHdpdGgKKyAgIyB2YXJpb3VzIHBsYXRmb3Jtcy4KKyAgbW9kdWxlIFBsYXRmb3JtCisgICAgT1MgPSBjYXNlIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3Rfb3MnXS5kb3duY2FzZQorICAgIHdoZW4gL2xpbnV4LworICAgICAgImxpbnV4IgorICAgIHdoZW4gL2Rhcndpbi8KKyAgICAgICJkYXJ3aW4iCisgICAgd2hlbiAvZnJlZWJzZC8KKyAgICAgICJmcmVlYnNkIgorICAgIHdoZW4gL25ldGJzZC8KKyAgICAgICJuZXRic2QiCisgICAgd2hlbiAvb3BlbmJzZC8KKyAgICAgICJvcGVuYnNkIgorICAgIHdoZW4gL3N1bm9zfHNvbGFyaXMvCisgICAgICAic29sYXJpcyIKKyAgICB3aGVuIC9taW5nd3xtc3dpbi8KKyAgICAgICJ3aW5kb3dzIgorICAgIGVsc2UKKyAgICAgIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3Rfb3MnXS5kb3duY2FzZQorICAgIGVuZAorCisgICAgQVJDSCA9IGNhc2UgQ1BVLmRvd25jYXNlCisgICAgd2hlbiAvYW1kNjR8eDg2XzY0LworICAgICAgIng4Nl82NCIKKyAgICB3aGVuIC9pPzg2fHg4NnxpODZwYy8KKyAgICAgICJpMzg2IgorICAgIHdoZW4gL3BwYzY0fHBvd2VycGM2NC8KKyAgICAgICJwb3dlcnBjNjQiCisgICAgd2hlbiAvcHBjfHBvd2VycGMvCisgICAgICAicG93ZXJwYyIKKyAgICBlbHNlCisgICAgICBjYXNlIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3RfY3B1J10KKyAgICAgIHdoZW4gL15hcm0vCisgICAgICAgICJhcm0iCisgICAgICBlbHNlCisgICAgICAgIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3RfY3B1J10KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgICMgQHBhcmFtIFtTdHJpbmcpIG9zCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICMgVGVzdCBpZiBjdXJyZW50IE9TIGlzICtvcysuCisgICAgZGVmIHNlbGYuaXNfb3Mob3MpCisgICAgICBPUyA9PSBvcworICAgIGVuZAorCisgICAgTkFNRSA9ICIje0FSQ0h9LSN7T1N9IgorICAgIElTX0dOVSA9IGRlZmluZWQ/KEdOVV9MSUJDKQorICAgIElTX0xJTlVYID0gaXNfb3MoImxpbnV4IikKKyAgICBJU19NQUMgPSBpc19vcygiZGFyd2luIikKKyAgICBJU19GUkVFQlNEID0gaXNfb3MoImZyZWVic2QiKQorICAgIElTX05FVEJTRCA9IGlzX29zKCJuZXRic2QiKQorICAgIElTX09QRU5CU0QgPSBpc19vcygib3BlbmJzZCIpCisgICAgSVNfU09MQVJJUyA9IGlzX29zKCJzb2xhcmlzIikKKyAgICBJU19XSU5ET1dTID0gaXNfb3MoIndpbmRvd3MiKQorICAgIElTX0JTRCA9IElTX01BQyB8fCBJU19GUkVFQlNEIHx8IElTX05FVEJTRCB8fCBJU19PUEVOQlNECisgICAgQ09ORl9ESVIgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJ3BsYXRmb3JtJywgTkFNRSkKKworICAgIHB1YmxpYworCisgICAgTElCUFJFRklYID0gY2FzZSBPUworICAgIHdoZW4gL3dpbmRvd3MvCisgICAgICAnJworICAgIHdoZW4gL2N5Z3dpbi8KKyAgICAgICdjeWcnCisgICAgZWxzZQorICAgICAgJ2xpYicKKyAgICBlbmQKKworICAgIExJQlNVRkZJWCA9IGNhc2UgT1MKKyAgICB3aGVuIC9kYXJ3aW4vCisgICAgICAnZHlsaWInCisgICAgd2hlbiAvbGludXh8YnNkfHNvbGFyaXMvCisgICAgICAnc28nCisgICAgd2hlbiAvd2luZG93c3xjeWd3aW4vCisgICAgICAnZGxsJworICAgIGVsc2UKKyAgICAgICMgUHVudCBhbmQganVzdCBhc3N1bWUgYSBzYW5lIHVuaXggKGkuZS4gYW55dGhpbmcgYnV0IEFJWCkKKyAgICAgICdzbycKKyAgICBlbmQKKworICAgIExJQkMgPSBpZiBJU19XSU5ET1dTCisgICAgICBSYkNvbmZpZzo6Q09ORklHWydSVUJZX1NPX05BTUUnXS5zcGxpdCgnLScpWy0yXSArICcuZGxsJworICAgIGVsc2lmIElTX0dOVQorICAgICAgR05VX0xJQkMKKyAgICBlbHNpZiBPUyA9PSAnY3lnd2luJworICAgICAgImN5Z3dpbjEuZGxsIgorICAgIGVsc2UKKyAgICAgICIje0xJQlBSRUZJWH1jLiN7TElCU1VGRklYfSIKKyAgICBlbmQKKworICAgICMgVGVzdCBpZiBjdXJyZW50IE9TIGlzIGEgKkJTRCAoaW5jbHVkZSBNQUMpCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBzZWxmLmJzZD8KKyAgICAgIElTX0JTRAorICAgIGVuZAorCisgICAgIyBUZXN0IGlmIGN1cnJlbnQgT1MgaXMgV2luZG93cworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgc2VsZi53aW5kb3dzPworICAgICAgSVNfV0lORE9XUworICAgIGVuZAorCisgICAgIyBUZXN0IGlmIGN1cnJlbnQgT1MgaXMgTWFjIE9TCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBzZWxmLm1hYz8KKyAgICAgIElTX01BQworICAgIGVuZAorCisgICAgIyBUZXN0IGlmIGN1cnJlbnQgT1MgaXMgU29sYXJpcyAoU3VuIE9TKQorICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgc2VsZi5zb2xhcmlzPworICAgICAgSVNfU09MQVJJUworICAgIGVuZAorCisgICAgIyBUZXN0IGlmIGN1cnJlbnQgT1MgaXMgYSB1bml4IE9TCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBzZWxmLnVuaXg/CisgICAgICAhSVNfV0lORE9XUworICAgIGVuZAorICBlbmQKK2VuZAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vYWFyY2g2NC1saW51eC90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2FhcmNoNjQtbGludXgvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJjNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2FhcmNoNjQtbGludXgvdHlwZXMuY29uZgpAQCAtMCwwICsxLDEwNCBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50NjRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19xdWFkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfcXVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vNjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX21vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZjY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW02NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZXJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQ2NF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250NjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Zzd29yZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zeXNjYWxsX3Nsb25nX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3N5c2NhbGxfdWxvbmdfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLipfX3FhZGRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19jYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfcXVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRldl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2lnX2F0b21pY190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2ZpbGNudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9vbmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltaXRfcmVzb3VyY2VfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ydXNhZ2Vfd2hvX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHJpb3JpdHlfd2hpY2hfdCA9IGludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2FybS1saW51eC90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2FybS1saW51eC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTkyM2IKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vYXJtLWxpbnV4L3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMDQgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3F1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbl9wb3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm82NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX25saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmY2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW02NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N3YmxrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2tleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzYmxrY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2ZpbGNudDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbG9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19xYWRkcl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19jYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucXVhZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2lnX2F0b21pY190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9rZXlfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfb25jZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zYV9mYW1pbHlfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltaXRfcmVzb3VyY2VfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ydXNhZ2Vfd2hvX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHJpb3JpdHlfd2hpY2hfdCA9IGludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtY3lnd2luL3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1jeWd3aW4vdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNjYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtY3lnd2luL3R5cGVzLmNvbmYKQEAgLTAsMCArMSwzIEBACityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdHJkaWZmX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBpbnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9pMzg2LWRhcndpbi90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtZGFyd2luL3R5cGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5MzEzZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9pMzg2LWRhcndpbi90eXBlcy5jb25mCkBAIC0wLDAgKzEsMTAwIEBACityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5faW50cHRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9uYXR1cmFsX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9jdF9ydW5lX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3B0cmRpZmZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3djaGFyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3J1bmVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fd2ludF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9jbG9ja190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3NvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3NzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl90aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50cHRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50cHRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlcl9hZGRyX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2VyX3NpemVfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZXJfc3NpemVfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlcl9sb25nX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZXJfdWxvbmdfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZXJfdGltZV90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zeXNjYWxsX2FyZ190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fYmxrY250X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2Jsa3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fZGV2X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2ZzYmxrY250X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9mc2ZpbGNudF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5faW5vNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2lub190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fbWFjaF9wb3J0X25hbWVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX21hY2hfcG9ydF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fbW9kZV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fcGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3B0aHJlYWRfa2V5X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fc2lnc2V0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9zdXNlY29uZHNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fdWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl91c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fdXVpZF90WzE2XSA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5xdWFkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnFhZGRyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5jYWRkcl90ID0gc3RyaW5nCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZml4cHRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlubzY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zZWdzel90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zd2Jsa190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3VzZWNvbmRzX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkX21hc2sgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfa2V5X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zYV9mYW1pbHlfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1mcmVlYnNkL3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1mcmVlYnNkL3R5cGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3YjIwZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9pMzg2LWZyZWVic2QvdHlwZXMuY29uZgpAQCAtMCwwICsxLDE1MiBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2NwdW1hc2tfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY3JpdGljYWxfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRmcHRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50bWF4X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50cHRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2Zhc3Q4X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2Zhc3QxNl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9mYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfZmFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2xlYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3QxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2xlYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3Q2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3B0cmRpZmZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19yZWdpc3Rlcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3NlZ3N6X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2l6ZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50ZnB0cl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50bWF4X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRwdHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9mYXN0OF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3QxNl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2xlYXN0OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3JlZ2lzdGVyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3ZtX29mZnNldF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX192bV9vb2Zmc2V0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdm1fcGFkZHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdm1fcGluZGV4X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3ZtX3NpemVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrc2l6ZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmZsYWdzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzYmxrY250X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2dpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19rZXlfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbHdwaWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19tb2RlX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYWNjbW9kZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX25sX2l0ZW0gPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbmxpbmtfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2FfZmFtaWx5X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY3B1d2hpY2hfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jcHVsZXZlbF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2NwdXNldGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY3RfcnVuZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3J1bmVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX193Y2hhcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3dpbnRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX193aW50X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZpeHB0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi4qKSA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRwdHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludHB0cl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucWFkZHJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNhZGRyX3QgPSBzdHJpbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNfY2FkZHJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNwdXdoaWNoX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNwdWxldmVsX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNwdXNldGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY3B1bWFza190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY3JpdGljYWxfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5mZmxhZ3NfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZpeHB0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubHdwaWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5hY2Ntb2RlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5saW5rX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zZWdzel90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9yZWdpc3Rlcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudm1fb2Zmc2V0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi52bV9vb2Zmc2V0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZtX3BhZGRyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi52bV9waW5kZXhfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZtX3NpemVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmRfbWFzayA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mZF9tYXNrID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtZ251L3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1nbnUvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE2OWMyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtZ251L3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMDcgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3F1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm82NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX25saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmY2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzaWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbTY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3VzZWNvbmRzX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2RhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3dibGtfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fa2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrY250NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2ZpbGNudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKl9fcWFkZHJfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKl9fY2FkZHJfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50cHRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2lkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sb2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50aW1lcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2lnX2F0b21pY190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3NpZ3NldF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpZ3NldF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHRocmVhZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHRocmVhZF9rZXkgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfa2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJsaW1fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbWl0X3Jlc291cmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcnVzYWdlX3dob190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3ByaW9yaXR5X3doaWNoX3QgPSBpbnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9pMzg2LWxpbnV4L3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1saW51eC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmExMzQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1saW51eC90eXBlcy5jb25mCkBAIC0wLDAgKzEsMTAzIEBACityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3Vfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19xdWFkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rldl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ubGlua190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmNjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zd2Jsa190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZXJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrY250NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2ZpbGNudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKl9fcWFkZHJfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKl9fY2FkZHJfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50cHRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sb2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmluX2FkZHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmluX3BvcnRfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5yZWdpc3Rlcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zaWdfYXRvbWljX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9vbmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1pdF9yZXNvdXJjZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3J1c2FnZV93aG9fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wcmlvcml0eV93aGljaF90ID0gaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1uZXRic2QvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9pMzg2LW5ldGJzZC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYmQxMmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1uZXRic2QvdHlwZXMuY29uZgpAQCAtMCwwICsxLDEyNiBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2xlYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2xlYXN0OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2xlYXN0MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3QxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9mYXN0OF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfZmFzdDhfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2Zhc3QxNl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfZmFzdDE2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9mYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfZmFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9mYXN0NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50cHRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRwdHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludG1heF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRtYXhfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmVnaXN0ZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX192YWRkcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcGFkZHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3ZzaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHRyZGlmZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX193Y2hhcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3dpbnRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ydW5lX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fd2N0cmFuc190ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX193Y3R5cGVfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY3B1aWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rldl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZpeHB0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2dpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbl9hZGRyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2luX3BvcnRfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm9fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fa2V5X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX21vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbV90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zYV9mYW1pbHlfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NlZ3N6X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zd2Jsa190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zdXNlY29uZHNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVuY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jcHVpZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJlZ2lzdGVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucXVhZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnFhZGRyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi52YWRkcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBhZGRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudnNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNhZGRyX3QgPSBzdHJpbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyMzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHI2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZml4cHRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJsaW1fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNlZ3N6X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN3YmxrX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbl9hZGRyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbl9wb3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZkX21hc2sgPSBpbnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9pMzg2LW9wZW5ic2QvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9pMzg2LW9wZW5ic2QvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGRmNjhhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtb3BlbmJzZC90eXBlcy5jb25mCkBAIC0wLDAgKzEsMTI4IEBACityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3Q4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3Q4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3QxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2xlYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2xlYXN0MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2xlYXN0NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2xlYXN0NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2Zhc3Q4X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9mYXN0OF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfZmFzdDE2X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9mYXN0MTZfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2Zhc3QzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfZmFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9mYXN0NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludHB0cl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50bWF4X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludG1heF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19yZWdpc3Rlcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3ZhZGRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wYWRkcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdnNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BzaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wdHJkaWZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3djaGFyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fd2ludF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3J1bmVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX193Y3RyYW5zX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3djdHlwZV90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jcHVpZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZml4cHRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2luX2FkZHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19rZXlfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ubGlua190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NhX2ZhbWlseV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2Vnc3pfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N3YmxrX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N1c2Vjb25kc190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudW5jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNwdWlkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50cHRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50cHRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5xdWFkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfcXVhZF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucWFkZHJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZhZGRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGFkZHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi52c2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBzaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2FkZHJfdCA9IHN0cmluZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHIzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcjY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRldl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5maXhwdF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2Vnc3pfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3dibGtfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3VzZWNvbmRzX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmluX2FkZHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmluX3BvcnRfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2FfZmFtaWx5X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmRfbWFzayA9IGludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtc29sYXJpcy90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtc29sYXJpcy90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODUxMDAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni1zb2xhcmlzL3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMjIgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvY2tfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRtYXhfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludG1heF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50cHRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRwdHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2Zhc3QxNl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDE2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2Zhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9sZWFzdDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9sZWFzdDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvbmdsb25nX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZ2xvbmdfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRfc2NhbGFyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50X3VzY2FsYXJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51Y2hhcl90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZ190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLipjYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNudF90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0cmRpZmZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGZuX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGdjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zcGdjbnRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN5c2lkX3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5kZXhfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmNjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm82NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrY250NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGFkNjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXBhZDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5vZmZzZXRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9vZmZzZXRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxlbl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGlza2FkZHJfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtfZmx0c2V0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubGdycF9pZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubWFqb3JfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5taW5vcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnByaV90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNwdV9mbGFnX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9fbW9kZV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX2Rldl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9fdWlkX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9fZ2lkX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9fbmxpbmtfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX3BpZF90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9faW5vX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5tb2RlX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhdGFsaW5rX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi50YXNraWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnByb2ppZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucG9vbGlkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi56b25laWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmN0aWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfa2V5X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudW5jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ocnRpbWVfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkc19tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2FfZmFtaWx5X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5mZHNfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kaXNwX2xvY2tfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5tb2RlbF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbl9hZGRyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pcGFkZHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJsaW1fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJsaW02NF90ID0gdWxvbmdfbG9uZwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtd2luZG93cy90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL2kzODYtd2luZG93cy90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTY4YmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaTM4Ni13aW5kb3dzL3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMDUgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2xlYXN0MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3QzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX29mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX29mZjY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9zc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi53aW50X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdHJkaWZmX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNhZGRyX3QgPSBzdHJpbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tpZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlY29uZHNfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQzMl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3QzMl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDMyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0MTZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0MzJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDE2X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0MzJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2Zhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50cHRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50cHRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50bWF4X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRtYXhfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sb2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2RldjMyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQzMl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2ZpbGNudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWlkMTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWQzMl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkMTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19naWQzMl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vMzJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lubzY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZtX29mZnNldF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZtX3NpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJlZ2lzdGVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLiphZGRyX3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX1VMb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9mcG9zX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fZnBvczY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpZ3NldF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpZ19hdG9taWNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmcKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9pYTY0LWxpbnV4L3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaWE2NC1saW51eC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTQ0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vaWE2NC1saW51eC90eXBlcy5jb25mCkBAIC0wLDAgKzEsMTA0IEBACityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3Vfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ2NF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50NjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3F1YWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9xdWFkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kZXZfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbl9wb3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm82NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ubGlua190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZjY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW02NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zd2Jsa190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZXJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrY250NjRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzYmxrY250NjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2ZpbGNudDY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19sb2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19xYWRkcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKl9fY2FkZHJfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50cHRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5xdWFkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X3F1YWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sb2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5saW5rX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5vZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50aW1lcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5yZWdpc3Rlcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zaWdfYXRvbWljX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2ZpbGNudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9vbmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltaXRfcmVzb3VyY2VfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ydXNhZ2Vfd2hvX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHJpb3JpdHlfd2hpY2hfdCA9IGludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL21pcHMtbGludXgvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9taXBzLWxpbnV4L3R5cGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0Y2VkMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9taXBzLWxpbnV4L3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMDIgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3F1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm82NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX25saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmY2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW02NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N3YmxrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2tleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzYmxrY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2ZpbGNudDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbG9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19xYWRkcl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19jYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucXVhZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2lnX2F0b21pY190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9rZXlfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfb25jZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zYV9mYW1pbHlfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltaXRfcmVzb3VyY2VfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ydXNhZ2Vfd2hvX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHJpb3JpdHlfd2hpY2hfdCA9IGludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL21pcHM2NGVsLWxpbnV4L3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vbWlwczY0ZWwtbGludXgvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmViNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL21pcHM2NGVsLWxpbnV4L3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMDQgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcXVhZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3F1YWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rldl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2dpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm9fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lubzY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX25saW5rX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmNjRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbTY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2tleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQ2NF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250NjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Zzd29yZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zeXNjYWxsX3Nsb25nX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3N5c2NhbGxfdWxvbmdfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLipfX3FhZGRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19jYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfcXVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRldl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWxvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJlZ2lzdGVyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NpZ19hdG9taWNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3VzZWNvbmRzX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrY250X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfa2V5X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX29uY2VfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2FfZmFtaWx5X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJsaW1fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1pdF9yZXNvdXJjZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3J1c2FnZV93aG9fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wcmlvcml0eV93aGljaF90ID0gaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vbWlwc2VsLWxpbnV4L3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vbWlwc2VsLWxpbnV4L3R5cGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0Y2VkMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9taXBzZWwtbGludXgvdHlwZXMuY29uZgpAQCAtMCwwICsxLDEwMiBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcXVhZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfcXVhZF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kZXZfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2dpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm9fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lubzY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX21vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZjY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbTY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3VzZWNvbmRzX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2RhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3dibGtfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fa2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrY250X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzYmxrY250NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19sb2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLipfX3FhZGRyX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLipfX2NhZGRyX3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludHB0cl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3NvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5xdWFkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfcXVhZF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubG9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRldl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5yZWdpc3Rlcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zaWdfYXRvbWljX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9vbmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1pdF9yZXNvdXJjZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3J1c2FnZV93aG9fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wcmlvcml0eV93aGljaF90ID0gaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vcG93ZXJwYy1haXgvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9wb3dlcnBjLWFpeC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZWU2NmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vcG93ZXJwYy1haXgvdHlwZXMuY29uZgpAQCAtMCwwICsxLDE4MCBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50bWF4X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRtYXhfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludHB0cl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludHB0cl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9sZWFzdDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9sZWFzdDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2Zhc3QxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi53Y2hhcl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRmYXN0X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRmYXN0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvbmczMl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191bG9uZzMyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19sb25nNjRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191bG9uZzY0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQzMmxvbmc2NF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50MzJsb25nNjRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvbmczMmludDY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZzMyaW50NjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MTYgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzIgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDggPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNiA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0cmRpZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLndjdHlwZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnBvc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnBvczY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVjaGFyX3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxldmVsX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyMzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHI2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jYWRkcl90ID0gc3RyaW5nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlubzMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbm82NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY250X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5kZXYzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNoYW5fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZTMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpZDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aWQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZTY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHRyMzIgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2NwdHIzMiA9IHN0cmluZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc29mZl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5vZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZjY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBhZGRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXIzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50aW1lcjY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5saW5rX3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1pZF90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zbGFiX3RbMTJdID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubXR5cF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYm9vbGVhbl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5jcmlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemUzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrc2l6ZTY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYud2ludF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpZ25hbF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudm1pZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudm1oYW5kbGVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi52bWlkMzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudm1oYW5kbGUzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua3ZtaWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmt2bWhhbmRsZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZtaWQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ycG42NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wc2l6ZV90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi52bWlkeF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi52bWZrZXlfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZtcHJrZXlfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZta2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZtaHdrZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudnBuX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJwbl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGV4X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3doYXR4X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZXNpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYXB0eF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5wZHR4X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBzeF90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBzaGlmdF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5zc2hpZnRfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudW5pZHhfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc25pZHhfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudm1ub2RlaWR4X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmt2cG5fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua3Jwbl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi52bXNpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudm1tX2xvY2tfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXJlZ190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZtbHBnaGFuZGxlX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZXh0X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZhX2xpc3QgPSBzdHJpbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHRyNjQgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2NwdHI2NCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLlVuaUNoYXIgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLlVURjMyQ2hhciA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVjaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zd2Jsa190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5vZmZzZXRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemU2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sb25nbG9uZ190ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmdsb25nX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbGFzc19pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubGlvYm5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVuaXRfYWRkcl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZTY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2FfZmFtaWx5X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJsaW02NF90ID0gdWxvbmdfbG9uZwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3Bvd2VycGMtZGFyd2luL3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vcG93ZXJwYy1kYXJ3aW4vdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjkzMTNlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3Bvd2VycGMtZGFyd2luL3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMDAgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX25hdHVyYWxfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2N0X3J1bmVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fcHRyZGlmZl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9zaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fd2NoYXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fcnVuZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl93aW50X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2Nsb2NrX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3RpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5yZWdpc3Rlcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRwdHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2VyX2FkZHJfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZXJfc2l6ZV90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlcl9zc2l6ZV90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2VyX2xvbmdfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlcl91bG9uZ190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlcl90aW1lX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN5c2NhbGxfYXJnX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9ibGtjbnRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fYmxrc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9kZXZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fZnNibGtjbnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2ZzZmlsY250X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9pbm82NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5faW5vX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9tYWNoX3BvcnRfbmFtZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fbWFjaF9wb3J0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9tb2RlX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX29mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fcHRocmVhZF9rZXlfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9zaWdzZXRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3N1c2Vjb25kc190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl91aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3VzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl91dWlkX3RbMTZdID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucWFkZHJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNhZGRyX3QgPSBzdHJpbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRldl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5maXhwdF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrY250X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbl9hZGRyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbl9wb3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5tb2RlX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5saW5rX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNlZ3N6X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN3YmxrX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9rZXlfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJsaW1fdCA9IHVsb25nX2xvbmcKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9wb3dlcnBjLWxpbnV4L3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vcG93ZXJwYy1saW51eC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDE0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vcG93ZXJwYy1saW51eC90eXBlcy5jb25mCkBAIC0wLDAgKzEsMTAwIEBACityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3Vfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19xdWFkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rldl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ubGlua190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmNjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zd2Jsa190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZXJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrY250NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2ZpbGNudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKl9fcWFkZHJfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKl9fY2FkZHJfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50cHRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sb2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2lnX2F0b21pY190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9rZXlfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfb25jZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zYV9mYW1pbHlfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltaXRfcmVzb3VyY2VfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ydXNhZ2Vfd2hvX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHJpb3JpdHlfd2hpY2hfdCA9IGludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3Bvd2VycGM2NC1saW51eC90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3Bvd2VycGM2NC1saW51eC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZWI3MDQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vcG93ZXJwYzY0LWxpbnV4L3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMDQgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcXVhZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3F1YWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rldl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2dpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm9fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lubzY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX25saW5rX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmNjRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbTY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2tleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQ2NF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250NjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Zzd29yZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zeXNjYWxsX3Nsb25nX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3N5c2NhbGxfdWxvbmdfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLipfX3FhZGRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19jYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfcXVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRldl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWxvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJlZ2lzdGVyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NpZ19hdG9taWNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3VzZWNvbmRzX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrY250X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfa2V5X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX29uY2VfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2FfZmFtaWx5X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJsaW1fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1pdF9yZXNvdXJjZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3J1c2FnZV93aG9fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wcmlvcml0eV93aGljaF90ID0gaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vczM5MC1saW51eC90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3MzOTAtbGludXgvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2M3OWVlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3MzOTAtbGludXgvdHlwZXMuY29uZgpAQCAtMCwwICsxLDEwMiBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcXVhZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfcXVhZF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kZXZfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2dpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbm9fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lubzY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX21vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZjY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbTY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3VzZWNvbmRzX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2RhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3dibGtfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fa2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrY250X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzYmxrY250NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbG9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19xYWRkcl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19jYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucXVhZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50aW1lcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5yZWdpc3Rlcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zaWdfYXRvbWljX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9vbmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1pdF9yZXNvdXJjZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3J1c2FnZV93aG9fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wcmlvcml0eV93aGljaF90ID0gaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vczM5MHgtbGludXgvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9zMzkweC1saW51eC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzhjZWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vczM5MHgtbGludXgvdHlwZXMuY29uZgpAQCAtMCwwICsxLDEwMiBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50NjRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19xdWFkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfcXVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vNjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX21vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbmxpbmtfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmY2NF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltNjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3VzZWNvbmRzX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2RhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3dibGtfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fa2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fYmxrY250X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudDY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzYmxrY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudDY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2ZpbGNudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbG9mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKl9fcWFkZHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLipfX2NhZGRyX3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludHB0cl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucXVhZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubG9mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2lnX2F0b21pY190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzYmxrY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9rZXlfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfb25jZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zYV9mYW1pbHlfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmxpbWl0X3Jlc291cmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcnVzYWdlX3dob190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3ByaW9yaXR5X3doaWNoX3QgPSBpbnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9zcGFyYy1saW51eC90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3NwYXJjLWxpbnV4L3R5cGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4MjI5OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9zcGFyYy1saW51eC90eXBlcy5jb25mCkBAIC0wLDAgKzEsMTAyIEBACityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3Vfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19xdWFkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rldl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ubGlua190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fb2ZmNjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zdXNlY29uZHNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N3YmxrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2tleV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzYmxrY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2ZpbGNudDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbG9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19xYWRkcl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19jYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucXVhZF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X3F1YWRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGFkZHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmVnaXN0ZXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2lnX2F0b21pY190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9vbmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1pdF9yZXNvdXJjZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3J1c2FnZV93aG9fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19wcmlvcml0eV93aGljaF90ID0gaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0vc3BhcmMtc29sYXJpcy90eXBlcy5jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3NwYXJjLXNvbGFyaXMvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNjMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3NwYXJjLXNvbGFyaXMvdHlwZXMuY29uZgpAQCAtMCwwICsxLDEyOCBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubG9ja190ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludG1heF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50bWF4X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRwdHJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludHB0cl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2Zhc3Q4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDE2X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2Zhc3Q2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2Zhc3Q4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0MTZfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2Zhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3QzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3Q2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfbGVhc3QxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfbGVhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubG9uZ2xvbmdfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nbG9uZ190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudF9zY2FsYXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRfdXNjYWxhcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVjaGFyX3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKmNhZGRyX3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY250X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRyZGlmZl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5wZm5fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wZ2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNwZ2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlX3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3lzaWRfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbmRleF90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5vZmY2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlubzY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2ZpbGNudDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wYWQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51cGFkNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZnNldF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X29mZnNldF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubGVuX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kaXNrYWRkcl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYua19mbHRzZXRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3VzZWNvbmRzX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5tYWpvcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1pbm9yX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHJpX3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY3B1X2ZsYWdfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub19tb2RlX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9fZGV2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub191aWRfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub19naWRfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub19ubGlua190ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9fcGlkX3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub19pbm9fdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYua2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1vZGVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGFza2lkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wcm9qaWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBvb2xpZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuem9uZWlkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jdGlkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVuY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaHJ0aW1lX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mZHNfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5Qc29ja2xlbl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGlzcF9sb2NrX3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbTY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5raWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50KSA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCkgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQpID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYXZsX2luZGV4X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi4oKSA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5mZHNfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5tb2RlbF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudHNfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbl9hZGRyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pcGFkZHJfdCA9IHVpbnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9zcGFyY3Y5LXNvbGFyaXMvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS9zcGFyY3Y5LXNvbGFyaXMvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNjMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3NwYXJjdjktc29sYXJpcy90eXBlcy5jb25mCkBAIC0wLDAgKzEsMTI4IEBACityYngucGxhdGZvcm0udHlwZWRlZi5sb2NrX3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50bWF4X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRtYXhfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludHB0cl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50cHRyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0MTZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2Zhc3QzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2Zhc3QxNl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3Q4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3QxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9sZWFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9sZWFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfbGVhc3Q4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfbGVhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sb25nbG9uZ190ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmdsb25nX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi50X3NjYWxhcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudF91c2NhbGFyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWNoYXJfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnRfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWxvbmdfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qY2FkZHJfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbnRfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5wdHJkaWZmX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBmbl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBnY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3BnY250X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2VfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5zeXNpZF90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmluZGV4X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZjY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrY250X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzYmxrY250X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2ZpbGNudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzYmxrY250NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzZmlsY250NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBhZDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVwYWQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2Zmc2V0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfb2Zmc2V0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sZW5fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRpc2thZGRyX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5rX2ZsdHNldF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1ham9yX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubWlub3JfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wcmlfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5jcHVfZmxhZ190ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX21vZGVfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub19kZXZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX3VpZF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX2dpZF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX25saW5rX3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub19waWRfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX2lub190ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZ2lkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50YXNraWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnByb2ppZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucG9vbGlkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi56b25laWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmN0aWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfa2V5X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudW5jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ocnRpbWVfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkc19tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2FfZmFtaWx5X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLlBzb2NrbGVuX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5kaXNwX2xvY2tfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ybGltNjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQpID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90KSA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludCkgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5hdmxfaW5kZXhfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLigpID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmZkc190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1vZGVsX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi50c190ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbl9wb3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmluX2FkZHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlwYWRkcl90ID0gdWludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3g4Nl82NC1jeWd3aW4vdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS94ODZfNjQtY3lnd2luL3R5cGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhZGM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS94ODZfNjQtY3lnd2luL3R5cGVzLmNvbmYKQEAgLTAsMCArMSwzIEBACityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1aW50NjQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0cmRpZmZfdCA9IGludDY0CityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gaW50NjQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS94ODZfNjQtZGFyd2luL3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LWRhcndpbi90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjM3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LWRhcndpbi90eXBlcy5jb25mCkBAIC0wLDAgKzEsMTI2IEBACityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5faW50cHRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9uYXR1cmFsX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9jdF9ydW5lX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3B0cmRpZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3NpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl93Y2hhcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9ydW5lX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3dpbnRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fY2xvY2tfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fdGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJlZ2lzdGVyX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludHB0cl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludHB0cl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZXJfYWRkcl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlcl9zaXplX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2VyX3NzaXplX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZXJfbG9uZ190ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2VyX3Vsb25nX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2VyX3RpbWVfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlcl9vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3lzY2FsbF9hcmdfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2Jsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9ibGtzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2Rldl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9mc2Jsa2NudF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fZnNmaWxjbnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2dpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5faWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX2lubzY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9pbm9fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX21hY2hfcG9ydF9uYW1lX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9tYWNoX3BvcnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX21vZGVfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fb2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl9zaWdzZXRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3N1c2Vjb25kc190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl91aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3VzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2Rhcndpbl91dWlkX3RbMTZdID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGFyd2luX3V1aWRfc3RyaW5nX3RbMzddID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kYXJ3aW5fcHRocmVhZF9rZXlfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5xdWFkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnFhZGRyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5jYWRkcl90ID0gc3RyaW5nCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZml4cHRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlubzY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zZWdzel90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zd2Jsa190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi50aW1lX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3VzZWNvbmRzX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJzaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZXJybm9fdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9rZXlfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3Q4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3QxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9sZWFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9sZWFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfbGVhc3Q4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfbGVhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2Zhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50bWF4X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50bWF4X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbV90ID0gdWxvbmdfbG9uZwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3g4Nl82NC1mcmVlYnNkL3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LWZyZWVic2QvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGRmNjhhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3g4Nl82NC1mcmVlYnNkL3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMjggQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2xlYXN0MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3QzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3Q2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfZmFzdDhfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3Q4X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9mYXN0MTZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3QxNl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfZmFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9mYXN0MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2Zhc3Q2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfZmFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludHB0cl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50cHRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRtYXhfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50bWF4X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JlZ2lzdGVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdmFkZHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BhZGRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX192c2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NrX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3B0cmRpZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fd2NoYXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX193aW50X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcnVuZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3djdHJhbnNfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fd2N0eXBlX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2NwdWlkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kZXZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19maXhwdF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbl9wb3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2tleV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX25saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2FfZmFtaWx5X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zZWdzel90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3NvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3dibGtfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3VzZWNvbmRzX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51bmNoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWxvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY3B1aWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5yZWdpc3Rlcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRwdHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5xYWRkcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudmFkZHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wYWRkcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZzaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jYWRkcl90ID0gc3RyaW5nCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcjMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyNjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZpeHB0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zZWdzel90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zd2Jsa190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5zYV9mYW1pbHlfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50aW1lcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LWxpbnV4L3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LWxpbnV4L3R5cGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxOWMwYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS94ODZfNjQtbGludXgvdHlwZXMuY29uZgpAQCAtMCwwICsxLDEwMiBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50NjRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19xdWFkX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VfcXVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vNjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX21vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbmxpbmtfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmY2NF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltNjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3VzZWNvbmRzX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2RhZGRyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3dibGtfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fa2V5X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVyX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ibGtjbnQ2NF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mc2Jsa2NudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ZzZmlsY250NjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2xvZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLipfX3FhZGRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi4qX19jYWRkcl90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfcXVhZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRldl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmdpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5ubGlua190ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNzaXplX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50aW1lcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5yZWdpc3Rlcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zaWdfYXRvbWljX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZmRfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNibGtjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2ZpbGNudF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnB0aHJlYWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRocmVhZF9vbmNlX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltaXRfcmVzb3VyY2VfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ydXNhZ2Vfd2hvX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHJpb3JpdHlfd2hpY2hfdCA9IGludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3g4Nl82NC1uZXRic2QvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS94ODZfNjQtbmV0YnNkL3R5cGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkZjY4YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS94ODZfNjQtbmV0YnNkL3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMjggQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDhfdCA9IGNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2xlYXN0MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3QzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfbGVhc3Q2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3Q2NF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfZmFzdDhfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3Q4X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9mYXN0MTZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3QxNl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfZmFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9mYXN0MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2Zhc3Q2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfZmFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludHB0cl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50cHRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRtYXhfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50bWF4X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3JlZ2lzdGVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdmFkZHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BhZGRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX192c2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NrX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fY2xvY2tpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX29mZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3B0cmRpZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdGltZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fd2NoYXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX193aW50X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcnVuZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3djdHJhbnNfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fd2N0eXBlX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2NwdWlkX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19kZXZfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19maXhwdF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbl9wb3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5vX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2tleV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19tb2RlX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX25saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3BpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3JsaW1fdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2FfZmFtaWx5X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zZWdzel90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3NvY2tsZW5fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3dibGtfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3VzZWNvbmRzX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X3Nob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51X2ludCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfbG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51bmNoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWxvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY3B1aWRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5yZWdpc3Rlcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRwdHJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRwdHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5xYWRkcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudmFkZHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wYWRkcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZzaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jYWRkcl90ID0gc3RyaW5nCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcjMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyNjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZpeHB0X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmtleV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zZWdzel90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zd2Jsa190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5zYV9mYW1pbHlfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50aW1lcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19mZF9tYXNrID0gaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LW9wZW5ic2QvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS94ODZfNjQtb3BlbmJzZC90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDE5YmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LW9wZW5ic2QvdHlwZXMuY29uZgpAQCAtMCwwICsxLDEzNCBAQAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnQ4X3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2xlYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2xlYXN0OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2xlYXN0MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfbGVhc3QxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9sZWFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9sZWFzdDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9mYXN0OF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfZmFzdDhfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50X2Zhc3QxNl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRfZmFzdDE2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludF9mYXN0MzJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191aW50X2Zhc3QzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19pbnRfZmFzdDY0X3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdWludF9mYXN0NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW50cHRyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRwdHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2ludG1heF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpbnRtYXhfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcmVnaXN0ZXJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fdmFkZHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3BhZGRyX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX192c2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcHNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3B0cmRpZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2l6ZV90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fd2NoYXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX193aW50X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fcnVuZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3djdHJhbnNfdCA9IHBvaW50ZXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fd2N0eXBlX3QgPSBwb2ludGVyCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa2NudF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Jsa3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jbG9ja190ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX2Nsb2NraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19jcHVpZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZGV2X3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZml4cHRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNibGtjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZnNmaWxjbnRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX2luX2FkZHJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9faW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fX2lub190ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19rZXlfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fbW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ubGlua190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19waWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5fX3NhX2ZhbWlseV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fc2Vnc3pfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3N1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX19zd2Jsa190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWVfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3VpZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX191c2Vjb25kc190ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9jaGFyID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfc2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9sb25nID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVuY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jcHVpZF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnJlZ2lzdGVyX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDE2X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQzMl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50NjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludDY0X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51X2ludDE2X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVfaW50NjRfdCA9IHVsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnF1YWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9xdWFkX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5xYWRkcl90ID0gcG9pbnRlcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudmFkZHJfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5wYWRkcl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnZzaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHNpemVfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuYmxrc2l6ZV90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5jYWRkcl90ID0gc3RyaW5nCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcjMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhZGRyX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRldl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5maXhwdF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZ2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5pZF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5vX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1vZGVfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm5saW5rX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zZWdzel90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zd2Jsa190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi51aWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZWNvbmRzX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5zdXNlY29uZHNfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzYmxrY250X3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2ZpbGNudF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fcG9ydF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja190ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZXJfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9fZmRfbWFzayA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNpZ3NldF90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc29ja2xlbl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc2FfZmFtaWx5X3QgPSB1Y2hhcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3g4Nl82NC1zb2xhcmlzL3R5cGVzLmNvbmYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LXNvbGFyaXMvdHlwZXMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDYxYjdlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BsYXRmb3JtL3g4Nl82NC1zb2xhcmlzL3R5cGVzLmNvbmYKQEAgLTAsMCArMSwxMjIgQEAKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxvY2tfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQ4X3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5pbnQxNl90ID0gc2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludDY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51aW50OF90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQxNl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi51aW50MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludG1heF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludG1heF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludHB0cl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludHB0cl90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2Zhc3QxNl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfZmFzdDMyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmludF9mYXN0NjRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2Zhc3QxNl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9mYXN0MzJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfZmFzdDY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0OF90ID0gY2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW50X2xlYXN0MTZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3QzMl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5pbnRfbGVhc3Q2NF90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDhfdCA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0MTZfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludF9sZWFzdDMyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51aW50X2xlYXN0NjRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5sb25nbG9uZ190ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmdsb25nX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi50X3NjYWxhcl90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi50X3VzY2FsYXJfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVjaGFyX3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNob3J0X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVsb25nX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuKmNhZGRyX3QgPSBjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi5kYWRkcl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY250X3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRyZGlmZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGZuX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGdjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zcGdjbnRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVzZV90ID0gdWNoYXIKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN5c2lkX3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5kZXhfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vZmZfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZjY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm9fdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5ibGtjbnRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZzYmxrY250X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnRfdCA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbm82NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa2NudDY0X3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mc2Jsa2NudDY0X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZnNmaWxjbnQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmJsa3NpemVfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGFkNjRfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVwYWQ2NF90ID0gdWxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm9mZnNldF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X29mZnNldF90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubGVuX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5kaXNrYWRkcl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYua19mbHRzZXRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmxncnBfaWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnN1c2Vjb25kc190ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubWFqb3JfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1pbm9yX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wcmlfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5jcHVfZmxhZ190ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX21vZGVfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub19kZXZfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX3VpZF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX2dpZF90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX25saW5rX3QgPSBzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYub19waWRfdCA9IHNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5vX2lub190ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5rZXlfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWlkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5naWRfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmRhdGFsaW5rX2lkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi50YXNraWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHJvamlkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBvb2xpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi56b25laWRfdCA9IGludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuY3RpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5wdGhyZWFkX2tleV90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGV2X3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYubmxpbmtfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnBpZF90ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuc3NpemVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmNsb2NrX3QgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5jbG9ja2lkX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnRpbWVyX3QgPSBpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVuY2hhciA9IHVjaGFyCityYngucGxhdGZvcm0udHlwZWRlZi51c2hvcnQgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnVpbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51bG9uZyA9IHVsb25nCityYngucGxhdGZvcm0udHlwZWRlZi51X2NoYXIgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9zaG9ydCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYudV9pbnQgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi51X2xvbmcgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaHJ0aW1lX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmZkX21hc2sgPSBsb25nCityYngucGxhdGZvcm0udHlwZWRlZi5mZHNfbWFzayA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLnNhX2ZhbWlseV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5zb2NrbGVuX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5uZmRzX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuZGlzcF9sb2NrX3QgPSB1Y2hhcgorcmJ4LnBsYXRmb3JtLnR5cGVkZWYubW9kZWxfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmluX3BvcnRfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaW5fYWRkcl90ID0gdWludAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuaXBhZGRyX3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5ybGltX3QgPSB1bG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucmxpbTY0X3QgPSB1bG9uZ19sb25nCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LXdpbmRvd3MvdHlwZXMuY29uZiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wbGF0Zm9ybS94ODZfNjQtd2luZG93cy90eXBlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDljMTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvcGxhdGZvcm0veDg2XzY0LXdpbmRvd3MvdHlwZXMuY29uZgpAQCAtMCwwICsxLDI3IEBACityYngucGxhdGZvcm0udHlwZWRlZi5zaXplX3QgPSB1bG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5zc2l6ZV90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5pbnRwdHJfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudWludHB0cl90ID0gdWxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucHRyZGlmZl90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi53Y2hhcl90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi53aW50X3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLndjdHlwZV90ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5lcnJub190ID0gaW50CityYngucGxhdGZvcm0udHlwZWRlZi5fX3RpbWUzMl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX190aW1lNjRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudGltZV90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5faW5vX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLmlub190ID0gdXNob3J0CityYngucGxhdGZvcm0udHlwZWRlZi5fZGV2X3QgPSB1aW50CityYngucGxhdGZvcm0udHlwZWRlZi5kZXZfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9waWRfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYucGlkX3QgPSBsb25nX2xvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9tb2RlX3QgPSB1c2hvcnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLm1vZGVfdCA9IHVzaG9ydAorcmJ4LnBsYXRmb3JtLnR5cGVkZWYuX29mZl90ID0gbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYub2ZmMzJfdCA9IGxvbmcKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9vZmY2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5vZmY2NF90ID0gbG9uZ19sb25nCityYngucGxhdGZvcm0udHlwZWRlZi5vZmZfdCA9IGxvbmdfbG9uZworcmJ4LnBsYXRmb3JtLnR5cGVkZWYudXNlY29uZHNfdCA9IHVpbnQKK3JieC5wbGF0Zm9ybS50eXBlZGVmLl9zaWdzZXRfdCA9IHVsb25nX2xvbmcKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wb2ludGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3BvaW50ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZjkxZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9wb2ludGVyLnJiCkBAIC0wLDAgKzEsMTYwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBXYXluZSBNZWlzc25lcgorIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggRXZhbiBQaG9lbml4CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisjCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisjICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFJ1YnkgRkZJIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKworcmVxdWlyZSAnZmZpL3BsYXRmb3JtJworbW9kdWxlIEZGSQorICBjbGFzcyBQb2ludGVyCisKKyAgICAjIFBvaW50ZXIgc2l6ZQorICAgIFNJWkUgPSBQbGF0Zm9ybTo6QUREUkVTU19TSVpFIC8gOAorCisgICAgIyBSZXR1cm4gdGhlIHNpemUgb2YgYSBwb2ludGVyIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLCBpbiBieXRlcworICAgICMgQHJldHVybiBbTnVtZXJpY10KKyAgICBkZWYgc2VsZi5zaXplCisgICAgICBTSVpFCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSBbbmlsLE51bWVyaWNdIGxlbiBsZW5ndGggb2Ygc3RyaW5nIHRvIHJldHVybgorICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICMgUmVhZCBwb2ludGVyJ3MgY29udGVudHMgYXMgYSBzdHJpbmcsIG9yIHRoZSBmaXJzdCArbGVuKyBieXRlcyBvZiB0aGUgCisgICAgIyBlcXVpdmFsZW50IHN0cmluZyBpZiArbGVuKyBpcyBub3QgK25pbCsuCisgICAgZGVmIHJlYWRfc3RyaW5nKGxlbj1uaWwpCisgICAgICBpZiBsZW4KKyAgICAgICAgZ2V0X2J5dGVzKDAsIGxlbikKKyAgICAgIGVsc2UKKyAgICAgICAgZ2V0X3N0cmluZygwKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSBbTnVtZXJpY10gbGVuIGxlbmd0aCBvZiBzdHJpbmcgdG8gcmV0dXJuCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgIyBSZWFkIHRoZSBmaXJzdCArbGVuKyBieXRlcyBvZiBwb2ludGVyJ3MgY29udGVudHMgYXMgYSBzdHJpbmcuCisgICAgIworICAgICMgU2FtZSBhczoKKyAgICAjICBwdHIucmVhZF9zdHJpbmcobGVuKSAgIyB3aXRoIGxlbiBub3QgbmlsCisgICAgZGVmIHJlYWRfc3RyaW5nX2xlbmd0aChsZW4pCisgICAgICBnZXRfYnl0ZXMoMCwgbGVuKQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgIyBSZWFkIHBvaW50ZXIncyBjb250ZW50cyBhcyBhIHN0cmluZy4KKyAgICAjCisgICAgIyBTYW1lIGFzOgorICAgICMgIHB0ci5yZWFkX3N0cmluZyAgIyB3aXRoIG5vIGxlbgorICAgIGRlZiByZWFkX3N0cmluZ190b19udWxsCisgICAgICBnZXRfc3RyaW5nKDApCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSBbU3RyaW5nXSBzdHIgc3RyaW5nIHRvIHdyaXRlCisgICAgIyBAcGFyYW0gW051bWVyaWNdIGxlbiBsZW5ndGggb2Ygc3RyaW5nIHRvIHJldHVybgorICAgICMgQHJldHVybiBbc2VsZl0KKyAgICAjIFdyaXRlICtsZW4rIGZpcnN0IGJ5dGVzIG9mICtzdHIrIGluIHBvaW50ZXIncyBjb250ZW50cy4KKyAgICAjCisgICAgIyBTYW1lIGFzOgorICAgICMgIHB0ci53cml0ZV9zdHJpbmcoc3RyLCBsZW4pICAgIyB3aXRoIGxlbiBub3QgbmlsCisgICAgZGVmIHdyaXRlX3N0cmluZ19sZW5ndGgoc3RyLCBsZW4pCisgICAgICBwdXRfYnl0ZXMoMCwgc3RyLCAwLCBsZW4pCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSBbU3RyaW5nXSBzdHIgc3RyaW5nIHRvIHdyaXRlCisgICAgIyBAcGFyYW0gW051bWVyaWNdIGxlbiBsZW5ndGggb2Ygc3RyaW5nIHRvIHJldHVybgorICAgICMgQHJldHVybiBbc2VsZl0KKyAgICAjIFdyaXRlICtzdHIrIGluIHBvaW50ZXIncyBjb250ZW50cywgb3IgZmlyc3QgK2xlbisgYnl0ZXMgaWYgCisgICAgIyArbGVuKyBpcyBub3QgK25pbCsuCisgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIsIGxlbj1uaWwpCisgICAgICBsZW4gPSBzdHIuYnl0ZXNpemUgdW5sZXNzIGxlbgorICAgICAgIyBXcml0ZSB0aGUgc3RyaW5nIGRhdGEgd2l0aG91dCBOVUwgdGVybWluYXRpb24KKyAgICAgIHB1dF9ieXRlcygwLCBzdHIsIDAsIGxlbikKKyAgICBlbmQKKworICAgICMgQHBhcmFtIFtUeXBlXSB0eXBlIHR5cGUgb2YgZGF0YSB0byByZWFkIGZyb20gcG9pbnRlcidzIGNvbnRlbnRzCisgICAgIyBAcGFyYW0gW1N5bWJvbF0gcmVhZGVyIG1ldGhvZCB0byBzZW5kIHRvICtzZWxmKyB0byByZWFkICt0eXBlKworICAgICMgQHBhcmFtIFtOdW1lcmljXSBsZW5ndGgKKyAgICAjIEByZXR1cm4gW0FycmF5XQorICAgICMgUmVhZCBhbiBhcnJheSBvZiArdHlwZSsgb2YgbGVuZ3RoICtsZW5ndGgrLgorICAgICMgQGV4YW1wbGUKKyAgICAjICBwdHIucmVhZF9hcnJheV9vZl90eXBlKFRZUEVfVUlOVDgsIDpnZXRfdWludDgsIDQpICMgLT4gWzEsIDIsIDMsIDRdCisgICAgZGVmIHJlYWRfYXJyYXlfb2ZfdHlwZSh0eXBlLCByZWFkZXIsIGxlbmd0aCkKKyAgICAgIGFyeSA9IFtdCisgICAgICBzaXplID0gRkZJLnR5cGVfc2l6ZSh0eXBlKQorICAgICAgdG1wID0gc2VsZgorICAgICAgbGVuZ3RoLnRpbWVzIHsgfGp8CisgICAgICAgIGFyeSA8PCB0bXAuc2VuZChyZWFkZXIpCisgICAgICAgIHRtcCArPSBzaXplIHVubGVzcyBqID09IGxlbmd0aC0xICMgYXZvaWQgT09CCisgICAgICB9CisgICAgICBhcnkKKyAgICBlbmQKKworICAgICMgQHBhcmFtIFtUeXBlXSB0eXBlIHR5cGUgb2YgZGF0YSB0byB3cml0ZSB0byBwb2ludGVyJ3MgY29udGVudHMKKyAgICAjIEBwYXJhbSBbU3ltYm9sXSB3cml0ZXIgbWV0aG9kIHRvIHNlbmQgdG8gK3NlbGYrIHRvIHdyaXRlICt0eXBlKworICAgICMgQHBhcmFtIFtBcnJheV0gYXJ5CisgICAgIyBAcmV0dXJuIFtzZWxmXQorICAgICMgV3JpdGUgK2FyeSsgaW4gcG9pbnRlcidzIGNvbnRlbnRzIGFzICt0eXBlKy4KKyAgICAjIEBleGFtcGxlCisgICAgIyAgcHRyLndyaXRlX2FycmF5X29mX3R5cGUoVFlQRV9VSU5UOCwgOnB1dF91aW50OCwgWzEsIDIsIDMgLDRdKQorICAgIGRlZiB3cml0ZV9hcnJheV9vZl90eXBlKHR5cGUsIHdyaXRlciwgYXJ5KQorICAgICAgc2l6ZSA9IEZGSS50eXBlX3NpemUodHlwZSkKKyAgICAgIHRtcCA9IHNlbGYKKyAgICAgIGFyeS5lYWNoX3dpdGhfaW5kZXgge3xpLCBqfAorICAgICAgICB0bXAuc2VuZCh3cml0ZXIsIGkpCisgICAgICAgIHRtcCArPSBzaXplIHVubGVzcyBqID09IGFyeS5sZW5ndGgtMSAjIGF2b2lkIE9PQgorICAgICAgfQorICAgICAgc2VsZgorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtzZWxmXQorICAgIGRlZiB0b19wdHIKKyAgICAgIHNlbGYKKyAgICBlbmQKKworICAgICMgQHBhcmFtIFtTeW1ib2wsVHlwZV0gdHlwZSBvZiBkYXRhIHRvIHJlYWQKKyAgICAjIEByZXR1cm4gW09iamVjdF0KKyAgICAjIFJlYWQgcG9pbnRlcidzIGNvbnRlbnRzIGFzICt0eXBlKworICAgICMKKyAgICAjIFNhbWUgYXM6CisgICAgIyAgcHRyLmdldCh0eXBlLCAwKQorICAgIGRlZiByZWFkKHR5cGUpCisgICAgICBnZXQodHlwZSwgMCkKKyAgICBlbmQKKworICAgICMgQHBhcmFtIFtTeW1ib2wsVHlwZV0gdHlwZSBvZiBkYXRhIHRvIHJlYWQKKyAgICAjIEBwYXJhbSBbT2JqZWN0XSB2YWx1ZSB0byB3cml0ZQorICAgICMgQHJldHVybiBbbmlsXQorICAgICMgV3JpdGUgK3ZhbHVlKyBvZiB0eXBlICt0eXBlKyB0byBwb2ludGVyJ3MgY29udGVudAorICAgICMKKyAgICAjIFNhbWUgYXM6CisgICAgIyAgcHRyLnB1dCh0eXBlLCAwKQorICAgIGRlZiB3cml0ZSh0eXBlLCB2YWx1ZSkKKyAgICAgIHB1dCh0eXBlLCAwLCB2YWx1ZSkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS9zdHJ1Y3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvc3RydWN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTZkMzUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvc3RydWN0LnJiCkBAIC0wLDAgKzEsMzczIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIFdheW5lIE1laXNzbmVyCisjIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBBbmRyZWEgRmF6emkKKyMgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEx1YyBIZWlucmljaAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorIworIyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworIyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisjIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisjIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisjIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisKK3JlcXVpcmUgJ2ZmaS9wbGF0Zm9ybScKK3JlcXVpcmUgJ2ZmaS9zdHJ1Y3RfbGF5b3V0X2J1aWxkZXInCisKK21vZHVsZSBGRkkKKworICBjbGFzcyBTdHJ1Y3RMYXlvdXQKKworICAgICMgQHJldHVybiBbQXJyYXk8QXJyYXkoU3ltYm9sLCBOdW1lcmljKT4KKyAgICAjIEdldCBhbiBhcnJheSBvZiB0dXBsZXMgKGZpZWxkIG5hbWUsIG9mZnNldCBvZiB0aGUgZmllbGQpLgorICAgIGRlZiBvZmZzZXRzCisgICAgICBtZW1iZXJzLm1hcCB7IHxtfCBbIG0sIHNlbGZbbV0ub2Zmc2V0IF0gfQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtOdW1lcmljXQorICAgICMgR2V0IHRoZSBvZmZzZXQgb2YgYSBmaWVsZC4KKyAgICBkZWYgb2Zmc2V0X29mKGZpZWxkX25hbWUpCisgICAgICBzZWxmW2ZpZWxkX25hbWVdLm9mZnNldAorICAgIGVuZAorCisgICAgIyBBbiBlbnVtIHtGaWVsZH0gaW4gYSB7U3RydWN0TGF5b3V0fS4KKyAgICBjbGFzcyBFbnVtIDwgRmllbGQKKworICAgICAgIyBAcGFyYW0gW0Fic3RyYWN0TWVtb3J5XSBwdHIgcG9pbnRlciBvbiBhIHtTdHJ1Y3R9CisgICAgICAjIEByZXR1cm4gW09iamVjdF0KKyAgICAgICMgR2V0IGFuIG9iamVjdCBvZiB0eXBlIHsjdHlwZX0gZnJvbSBtZW1vcnkgcG9pbnRlZCBieSArcHRyKy4KKyAgICAgIGRlZiBnZXQocHRyKQorICAgICAgICB0eXBlLmZpbmQocHRyLmdldF9pbnQob2Zmc2V0KSkKKyAgICAgIGVuZAorCisgICAgICAjIEBwYXJhbSBbQWJzdHJhY3RNZW1vcnldIHB0ciBwb2ludGVyIG9uIGEge1N0cnVjdH0KKyAgICAgICMgQHBhcmFtICB2YWx1ZQorICAgICAgIyBAcmV0dXJuIFtuaWxdCisgICAgICAjIFNldCArdmFsdWUrIGludG8gbWVtb3J5IHBvaW50ZWQgYnkgK3B0cisuCisgICAgICBkZWYgcHV0KHB0ciwgdmFsdWUpCisgICAgICAgIHB0ci5wdXRfaW50KG9mZnNldCwgdHlwZS5maW5kKHZhbHVlKSkKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgICBjbGFzcyBJbm5lclN0cnVjdCA8IEZpZWxkCisgICAgICBkZWYgZ2V0KHB0cikKKyAgICAgICAgdHlwZS5zdHJ1Y3RfY2xhc3MubmV3KHB0ci5zbGljZShzZWxmLm9mZnNldCwgc2VsZi5zaXplKSkKKyAgICAgIGVuZAorCisgICAgIGRlZiBwdXQocHRyLCB2YWx1ZSkKKyAgICAgICByYWlzZSBUeXBlRXJyb3IsICJ3cm9uZyB2YWx1ZSB0eXBlIChleHBlY3RlZCAje3R5cGUuc3RydWN0X2NsYXNzfSkiIHVubGVzcyB2YWx1ZS5pc19hPyh0eXBlLnN0cnVjdF9jbGFzcykKKyAgICAgICBwdHIuc2xpY2Uoc2VsZi5vZmZzZXQsIHNlbGYuc2l6ZSkuX19jb3B5X2Zyb21fXyh2YWx1ZS5wb2ludGVyLCBzZWxmLnNpemUpCisgICAgIGVuZAorICAgIGVuZAorCisgICAgY2xhc3MgTWFwcGVkIDwgRmllbGQKKyAgICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIG9mZnNldCwgdHlwZSwgb3JpZ19maWVsZCkKKyAgICAgICAgc3VwZXIobmFtZSwgb2Zmc2V0LCB0eXBlKQorICAgICAgICBAb3JpZ19maWVsZCA9IG9yaWdfZmllbGQKKyAgICAgIGVuZAorCisgICAgICBkZWYgZ2V0KHB0cikKKyAgICAgICAgdHlwZS5mcm9tX25hdGl2ZShAb3JpZ19maWVsZC5nZXQocHRyKSwgbmlsKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBwdXQocHRyLCB2YWx1ZSkKKyAgICAgICAgQG9yaWdfZmllbGQucHV0KHB0ciwgdHlwZS50b19uYXRpdmUodmFsdWUsIG5pbCkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgCisgIGNsYXNzIFN0cnVjdAorCisgICAgIyBHZXQgc3RydWN0IHNpemUKKyAgICAjIEByZXR1cm4gW051bWVyaWNdCisgICAgZGVmIHNpemUKKyAgICAgIHNlbGYuY2xhc3Muc2l6ZQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtGaXhudW1dIFN0cnVjdCBhbGlnbm1lbnQKKyAgICBkZWYgYWxpZ25tZW50CisgICAgICBzZWxmLmNsYXNzLmFsaWdubWVudAorICAgIGVuZAorICAgIGFsaWFzX21ldGhvZCA6YWxpZ24sIDphbGlnbm1lbnQKKworICAgICMgKHNlZSBGRkk6OlN0cnVjdExheW91dCNvZmZzZXRfb2YpCisgICAgZGVmIG9mZnNldF9vZihuYW1lKQorICAgICAgc2VsZi5jbGFzcy5vZmZzZXRfb2YobmFtZSkKKyAgICBlbmQKKworICAgICMgKHNlZSBGRkk6OlN0cnVjdExheW91dCNtZW1iZXJzKQorICAgIGRlZiBtZW1iZXJzCisgICAgICBzZWxmLmNsYXNzLm1lbWJlcnMKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbQXJyYXldCisgICAgIyBHZXQgYXJyYXkgb2YgdmFsdWVzIGZyb20gU3RydWN0IGZpZWxkcy4KKyAgICBkZWYgdmFsdWVzCisgICAgICBtZW1iZXJzLm1hcCB7IHxtfCBzZWxmW21dIH0KKyAgICBlbmQKKworICAgICMgKHNlZSBGRkk6OlN0cnVjdExheW91dCNvZmZzZXRzKQorICAgIGRlZiBvZmZzZXRzCisgICAgICBzZWxmLmNsYXNzLm9mZnNldHMKKyAgICBlbmQKKworICAgICMgQ2xlYXIgdGhlIHN0cnVjdCBjb250ZW50LgorICAgICMgQHJldHVybiBbc2VsZl0KKyAgICBkZWYgY2xlYXIKKyAgICAgIHBvaW50ZXIuY2xlYXIKKyAgICAgIHNlbGYKKyAgICBlbmQKKworICAgICMgR2V0IHtQb2ludGVyfSB0byBzdHJ1Y3QgY29udGVudC4KKyAgICAjIEByZXR1cm4gW0Fic3RyYWN0TWVtb3J5XQorICAgIGRlZiB0b19wdHIKKyAgICAgIHBvaW50ZXIKKyAgICBlbmQKKworICAgICMgR2V0IHN0cnVjdCBzaXplCisgICAgIyBAcmV0dXJuIFtOdW1lcmljXQorICAgIGRlZiBzZWxmLnNpemUKKyAgICAgIGRlZmluZWQ/KEBsYXlvdXQpID8gQGxheW91dC5zaXplIDogZGVmaW5lZD8oQHNpemUpID8gQHNpemUgOiAwCisgICAgZW5kCisKKyAgICAjIHNldCBzdHJ1Y3Qgc2l6ZQorICAgICMgQHBhcmFtIFtOdW1lcmljXSBzaXplCisgICAgIyBAcmV0dXJuIFtzaXplXQorICAgIGRlZiBzZWxmLnNpemU9KHNpemUpCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiU2l6ZSBhbHJlYWR5IHNldCIgaWYgZGVmaW5lZD8oQHNpemUpIHx8IGRlZmluZWQ/KEBsYXlvdXQpCisgICAgICBAc2l6ZSA9IHNpemUKKyAgICBlbmQKKworICAgICMgQHJldHVybiAoc2VlIFN0cnVjdCNhbGlnbm1lbnQpCisgICAgZGVmIHNlbGYuYWxpZ25tZW50CisgICAgICBAbGF5b3V0LmFsaWdubWVudAorICAgIGVuZAorCisgICAgIyAoc2VlIEZGSTo6VHlwZSNtZW1iZXJzKQorICAgIGRlZiBzZWxmLm1lbWJlcnMKKyAgICAgIEBsYXlvdXQubWVtYmVycworICAgIGVuZAorCisgICAgIyAoc2VlIEZGSTo6U3RydWN0TGF5b3V0I29mZnNldHMpCisgICAgZGVmIHNlbGYub2Zmc2V0cworICAgICAgQGxheW91dC5vZmZzZXRzCisgICAgZW5kCisKKyAgICAjIChzZWUgRkZJOjpTdHJ1Y3RMYXlvdXQjb2Zmc2V0X29mKQorICAgIGRlZiBzZWxmLm9mZnNldF9vZihuYW1lKQorICAgICAgQGxheW91dC5vZmZzZXRfb2YobmFtZSkKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmluCisgICAgICBwdHIoOmluKQorICAgIGVuZAorCisgICAgZGVmIHNlbGYub3V0CisgICAgICBwdHIoOm91dCkKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLnB0cihmbGFncyA9IDppbm91dCkKKyAgICAgIEByZWZfZGF0YV90eXBlIHx8PSBUeXBlOjpNYXBwZWQubmV3KFN0cnVjdEJ5UmVmZXJlbmNlLm5ldyhzZWxmKSkKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLnZhbAorICAgICAgQHZhbF9kYXRhX3R5cGUgfHw9IFN0cnVjdEJ5VmFsdWUubmV3KHNlbGYpCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5ieV92YWx1ZQorICAgICAgc2VsZi52YWwKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmJ5X3JlZihmbGFncyA9IDppbm91dCkKKyAgICAgIHNlbGYucHRyKGZsYWdzKQorICAgIGVuZAorCisgICAgY2xhc3MgTWFuYWdlZFN0cnVjdENvbnZlcnRlciA8IFN0cnVjdEJ5UmVmZXJlbmNlCisKKyAgICAgICMgQHBhcmFtIFtTdHJ1Y3RdIHN0cnVjdF9jbGFzcworICAgICAgZGVmIGluaXRpYWxpemUoc3RydWN0X2NsYXNzKQorICAgICAgICBzdXBlcihzdHJ1Y3RfY2xhc3MpCisKKyAgICAgICAgcmFpc2UgTm9NZXRob2RFcnJvciwgInJlbGVhc2UoKSBub3QgaW1wbGVtZW50ZWQgZm9yIGNsYXNzICN7c3RydWN0X2NsYXNzfSIgdW5sZXNzIHN0cnVjdF9jbGFzcy5yZXNwb25kX3RvPyA6cmVsZWFzZQorICAgICAgICBAbWV0aG9kID0gc3RydWN0X2NsYXNzLm1ldGhvZCg6cmVsZWFzZSkKKyAgICAgIGVuZAorCisgICAgICAjIEBwYXJhbSBbUG9pbnRlcl0gcHRyCisgICAgICAjIEBwYXJhbSBbbmlsXSBjdHgKKyAgICAgICMgQHJldHVybiBbU3RydWN0XQorICAgICAgZGVmIGZyb21fbmF0aXZlKHB0ciwgY3R4KQorICAgICAgICBzdHJ1Y3RfY2xhc3MubmV3KEF1dG9Qb2ludGVyLm5ldyhwdHIsIEBtZXRob2QpKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5hdXRvX3B0cgorICAgICAgQG1hbmFnZWRfdHlwZSB8fD0gVHlwZTo6TWFwcGVkLm5ldyhNYW5hZ2VkU3RydWN0Q29udmVydGVyLm5ldyhzZWxmKSkKKyAgICBlbmQKKworCisgICAgY2xhc3MgPDwgc2VsZgorICAgICAgcHVibGljCisKKyAgICAgICMgQHJldHVybiBbU3RydWN0TGF5b3V0XQorICAgICAgIyBAb3ZlcmxvYWQgbGF5b3V0CisgICAgICAjICBAcmV0dXJuIFtTdHJ1Y3RMYXlvdXRdCisgICAgICAjICBHZXQgc3RydWN0IGxheW91dC4KKyAgICAgICMgQG92ZXJsb2FkIGxheW91dCgqc3BlYykKKyAgICAgICMgIEBwYXJhbSBbQXJyYXk8U3ltYm9sLCBJbnRlZ2VyPixBcnJheShIYXNoKV0gc3BlYworICAgICAgIyAgQHJldHVybiBbU3RydWN0TGF5b3V0XQorICAgICAgIyAgQ3JlYXRlIHN0cnVjdCBsYXlvdXQgZnJvbSArc3BlYysuCisgICAgICAjICBAZXhhbXBsZSBDcmVhdGluZyBhIGxheW91dCBmcm9tIGFuIGFycmF5ICtzcGVjKworICAgICAgIyAgICBjbGFzcyBNeVN0cnVjdCA8IFN0cnVjdAorICAgICAgIyAgICAgIGxheW91dCA6ZmllbGQxLCA6aW50LAorICAgICAgIyAgICAgICAgICAgICA6ZmllbGQyLCA6cG9pbnRlciwKKyAgICAgICMgICAgICAgICAgICAgOmZpZWxkMywgOnN0cmluZworICAgICAgIyAgICBlbmQKKyAgICAgICMgIEBleGFtcGxlIENyZWF0aW5nIGEgbGF5b3V0IGZyb20gYW4gYXJyYXkgK3NwZWMrIHdpdGggb2Zmc2V0CisgICAgICAjICAgIGNsYXNzIE15U3RydWN0V2l0aE9mZnNldCA8IFN0cnVjdAorICAgICAgIyAgICAgIGxheW91dCA6ZmllbGQxLCA6aW50LAorICAgICAgIyAgICAgICAgICAgICA6ZmllbGQyLCA6cG9pbnRlciwgNiwgICMgc2V0IG9mZnNldCB0byA2IGZvciB0aGlzIGZpZWxkCisgICAgICAjICAgICAgICAgICAgIDpmaWVsZDMsIDpzdHJpbmcKKyAgICAgICMgICAgZW5kCisgICAgICAjICBAZXhhbXBsZSBDcmVhdGluZyBhIGxheW91dCBmcm9tIGEgaGFzaCArc3BlYysgKFJ1YnkgMS45IG9ubHkpCisgICAgICAjICAgIGNsYXNzIE15U3RydWN0RnJvbUhhc2ggPCBTdHJ1Y3QKKyAgICAgICMgICAgICBsYXlvdXQgOmZpZWxkMSA9PiA6aW50LAorICAgICAgIyAgICAgICAgICAgICA6ZmllbGQyID0+IDpwb2ludGVyLAorICAgICAgIyAgICAgICAgICAgICA6ZmllbGQzID0+IDpzdHJpbmcKKyAgICAgICMgICAgZW5kCisgICAgICAjICBAZXhhbXBsZSBDcmVhdGluZyBhIGxheW91dCB3aXRoIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucworICAgICAgIyAgICBjbGFzcyBNeUZ1bmN0aW9uVGFibGUgPCBTdHJ1Y3QKKyAgICAgICMgICAgICBsYXlvdXQgOmZ1bmN0aW9uMSwgY2FsbGJhY2soWzppbnQsIDppbnRdLCA6aW50KSwKKyAgICAgICMgICAgICAgICAgICAgOmZ1bmN0aW9uMiwgY2FsbGJhY2soWzpwb2ludGVyXSwgOnZvaWQpLAorICAgICAgIyAgICAgICAgICAgICA6ZmllbGQzLCA6c3RyaW5nCisgICAgICAjICAgIGVuZAorICAgICAgIyAgQG5vdGUgQ3JlYXRpbmcgYSBsYXlvdXQgZnJvbSBhIGhhc2ggK3NwZWMrIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBSdWJ5IDEuOS4KKyAgICAgIGRlZiBsYXlvdXQoKnNwZWMpCisgICAgICAgICNyYWlzZSBSdW50aW1lRXJyb3IsICJzdHJ1Y3QgbGF5b3V0IGFscmVhZHkgZGVmaW5lZCBmb3IgI3tzZWxmLmluc3BlY3R9IiBpZiBkZWZpbmVkPyhAbGF5b3V0KQorICAgICAgICByZXR1cm4gQGxheW91dCBpZiBzcGVjLnNpemUgPT0gMAorCisgICAgICAgIGJ1aWxkZXIgPSBTdHJ1Y3RMYXlvdXRCdWlsZGVyLm5ldworICAgICAgICBidWlsZGVyLnVuaW9uID0gc2VsZiA8IFVuaW9uCisgICAgICAgIGJ1aWxkZXIucGFja2VkID0gQHBhY2tlZCBpZiBkZWZpbmVkPyhAcGFja2VkKQorICAgICAgICBidWlsZGVyLmFsaWdubWVudCA9IEBtaW5fYWxpZ25tZW50IGlmIGRlZmluZWQ/KEBtaW5fYWxpZ25tZW50KQorCisgICAgICAgIGlmIHNwZWNbMF0ua2luZF9vZj8oSGFzaCkKKyAgICAgICAgICBoYXNoX2xheW91dChidWlsZGVyLCBzcGVjKQorICAgICAgICBlbHNlCisgICAgICAgICAgYXJyYXlfbGF5b3V0KGJ1aWxkZXIsIHNwZWMpCisgICAgICAgIGVuZAorICAgICAgICBidWlsZGVyLnNpemUgPSBAc2l6ZSBpZiBkZWZpbmVkPyhAc2l6ZSkgJiYgQHNpemUgPiBidWlsZGVyLnNpemUKKyAgICAgICAgY3NwZWMgPSBidWlsZGVyLmJ1aWxkCisgICAgICAgIEBsYXlvdXQgPSBjc3BlYyB1bmxlc3Mgc2VsZiA9PSBTdHJ1Y3QKKyAgICAgICAgQHNpemUgPSBjc3BlYy5zaXplCisgICAgICAgIHJldHVybiBjc3BlYworICAgICAgZW5kCisKKworICAgICAgcHJvdGVjdGVkCisKKyAgICAgIGRlZiBjYWxsYmFjayhwYXJhbXMsIHJldCkKKyAgICAgICAgbW9kID0gZW5jbG9zaW5nX21vZHVsZQorICAgICAgICBGRkk6OkNhbGxiYWNrSW5mby5uZXcoZmluZF90eXBlKHJldCwgbW9kKSwgcGFyYW1zLm1hcCB7IHxlfCBmaW5kX3R5cGUoZSwgbW9kKSB9KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBwYWNrZWQocGFja2VkID0gMSkKKyAgICAgICAgQHBhY2tlZCA9IHBhY2tlZAorICAgICAgZW5kCisgICAgICBhbGlhcyA6cGFjayA6cGFja2VkCisgICAgICAKKyAgICAgIGRlZiBhbGlnbmVkKGFsaWdubWVudCA9IDEpCisgICAgICAgIEBtaW5fYWxpZ25tZW50ID0gYWxpZ25tZW50CisgICAgICBlbmQKKyAgICAgIGFsaWFzIDphbGlnbiA6YWxpZ25lZAorCisgICAgICBkZWYgZW5jbG9zaW5nX21vZHVsZQorICAgICAgICBiZWdpbgorICAgICAgICAgIG1vZCA9IHNlbGYubmFtZS5zcGxpdCgiOjoiKVswLi4tMl0uaW5qZWN0KE9iamVjdCkgeyB8b2JqLCBjfCBvYmouY29uc3RfZ2V0KGMpIH0KKyAgICAgICAgICAobW9kIDwgRkZJOjpMaWJyYXJ5IHx8IG1vZCA8IEZGSTo6U3RydWN0IHx8IG1vZC5yZXNwb25kX3RvPyg6ZmluZF90eXBlKSkgPyBtb2QgOiBuaWwKKyAgICAgICAgcmVzY3VlIEV4Y2VwdGlvbgorICAgICAgICAgIG5pbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisKKyAgICAgIGRlZiBmaW5kX2ZpZWxkX3R5cGUodHlwZSwgbW9kID0gZW5jbG9zaW5nX21vZHVsZSkKKyAgICAgICAgaWYgdHlwZS5raW5kX29mPyhDbGFzcykgJiYgdHlwZSA8IFN0cnVjdAorICAgICAgICAgIEZGSTo6VHlwZTo6U3RydWN0Lm5ldyh0eXBlKQorCisgICAgICAgIGVsc2lmIHR5cGUua2luZF9vZj8oQ2xhc3MpICYmIHR5cGUgPCBGRkk6OlN0cnVjdExheW91dDo6RmllbGQKKyAgICAgICAgICB0eXBlCisKKyAgICAgICAgZWxzaWYgdHlwZS5raW5kX29mPyg6OkFycmF5KQorICAgICAgICAgIEZGSTo6VHlwZTo6QXJyYXkubmV3KGZpbmRfZmllbGRfdHlwZSh0eXBlWzBdKSwgdHlwZVsxXSkKKworICAgICAgICBlbHNlCisgICAgICAgICAgZmluZF90eXBlKHR5cGUsIG1vZCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGZpbmRfdHlwZSh0eXBlLCBtb2QgPSBlbmNsb3NpbmdfbW9kdWxlKQorICAgICAgICBpZiBtb2QKKyAgICAgICAgICBtb2QuZmluZF90eXBlKHR5cGUpCisgICAgICAgIGVuZCB8fCBGRkkuZmluZF90eXBlKHR5cGUpCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICAjIEBwYXJhbSBbU3RydWN0TGF5b3V0QnVpbGRlcl0gYnVpbGRlcgorICAgICAgIyBAcGFyYW0gW0hhc2hdIHNwZWMKKyAgICAgICMgQHJldHVybiBbYnVpbGRlcl0KKyAgICAgICMgQHJhaXNlIGlmIFJ1YnkgMS44CisgICAgICAjIEFkZCBoYXNoICtzcGVjKyB0byArYnVpbGRlcisuCisgICAgICBkZWYgaGFzaF9sYXlvdXQoYnVpbGRlciwgc3BlYykKKyAgICAgICAgcmFpc2UgIlJ1YnkgdmVyc2lvbiBub3Qgc3VwcG9ydGVkIiBpZiBSVUJZX1ZFUlNJT04gPX4gL14xXC44XC4uKi8KKyAgICAgICAgc3BlY1swXS5lYWNoIGRvIHxuYW1lLCB0eXBlfAorICAgICAgICAgIGJ1aWxkZXIuYWRkIG5hbWUsIGZpbmRfZmllbGRfdHlwZSh0eXBlKSwgbmlsCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgQHBhcmFtIFtTdHJ1Y3RMYXlvdXRCdWlsZGVyXSBidWlsZGVyCisgICAgICAjIEBwYXJhbSBbQXJyYXk8U3ltYm9sLCBJbnRlZ2VyPl0gc3BlYworICAgICAgIyBAcmV0dXJuIFtidWlsZGVyXQorICAgICAgIyBBZGQgYXJyYXkgK3NwZWMrIHRvICtidWlsZGVyKy4KKyAgICAgIGRlZiBhcnJheV9sYXlvdXQoYnVpbGRlciwgc3BlYykKKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgaSA8IHNwZWMuc2l6ZQorICAgICAgICAgIG5hbWUsIHR5cGUgPSBzcGVjW2ksIDJdCisgICAgICAgICAgaSArPSAyCisKKyAgICAgICAgICAjIElmIHRoZSBuZXh0IHBhcmFtIGlzIGEgSW50ZWdlciwgaXQgc3BlY2lmaWVzIHRoZSBvZmZzZXQKKyAgICAgICAgICBpZiBzcGVjW2ldLmtpbmRfb2Y/KEludGVnZXIpCisgICAgICAgICAgICBvZmZzZXQgPSBzcGVjW2ldCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBvZmZzZXQgPSBuaWwKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIGJ1aWxkZXIuYWRkIG5hbWUsIGZpbmRfZmllbGRfdHlwZSh0eXBlKSwgb2Zmc2V0CisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvc3RydWN0X2xheW91dF9idWlsZGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3N0cnVjdF9sYXlvdXRfYnVpbGRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDZhNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3N0cnVjdF9sYXlvdXRfYnVpbGRlci5yYgpAQCAtMCwwICsxLDIyNyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBXYXluZSBNZWlzc25lcgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorIworIyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworIyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisjIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisjIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisjIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisKK21vZHVsZSBGRkkKKworICAjIEJ1aWxkIGEge1N0cnVjdExheW91dCBzdHJ1Y3QgbGF5b3V0fS4KKyAgY2xhc3MgU3RydWN0TGF5b3V0QnVpbGRlcgorICAgIGF0dHJfcmVhZGVyIDpzaXplCisgICAgYXR0cl9yZWFkZXIgOmFsaWdubWVudAorCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBzaXplID0gMAorICAgICAgQGFsaWdubWVudCA9IDEKKyAgICAgIEBtaW5fYWxpZ25tZW50ID0gMQorICAgICAgQHBhY2tlZCA9IGZhbHNlCisgICAgICBAdW5pb24gPSBmYWxzZQorICAgICAgQGZpZWxkcyA9IEFycmF5Lm5ldworICAgIGVuZAorCisgICAgIyBTZXQgc2l6ZSBhdHRyaWJ1dGUgd2l0aCArc2l6ZSsgb25seSBpZiArc2l6ZSsgaXMgZ3JlYXRlciB0aGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAjIEBwYXJhbSBbTnVtZXJpY10gc2l6ZQorICAgIGRlZiBzaXplPShzaXplKQorICAgICAgQHNpemUgPSBzaXplIGlmIHNpemUgPiBAc2l6ZQorICAgIGVuZAorCisgICAgIyBTZXQgYWxpZ25tZW50IGF0dHJpYnV0ZSB3aXRoICthbGlnbisgb25seSBpZiBpdCBpcyBncmVhdGVyIHRoYW4gYXR0cmlidXRlIHZhbHVlLgorICAgICMgQHBhcmFtIFtOdW1lcmljXSBhbGlnbgorICAgIGRlZiBhbGlnbm1lbnQ9KGFsaWduKQorICAgICAgQGFsaWdubWVudCA9IGFsaWduIGlmIGFsaWduID4gQGFsaWdubWVudAorICAgICAgQG1pbl9hbGlnbm1lbnQgPSBhbGlnbgorICAgIGVuZAorCisgICAgIyBTZXQgdW5pb24gYXR0cmlidXRlLgorICAgICMgU2V0IHRvICt0cnVlKyB0byBidWlsZCBhIHtVbmlvbn0gaW5zdGVhZCBvZiBhIHtTdHJ1Y3R9LgorICAgICMgQHBhcmFtIFtCb29sZWFuXSBpc191bmlvbgorICAgICMgQHJldHVybiBbaXNfdW5pb25dCisgICAgZGVmIHVuaW9uPShpc191bmlvbikKKyAgICAgIEB1bmlvbiA9IGlzX3VuaW9uCisgICAgZW5kCisKKyAgICAjIEJ1aWxkaW5nIGEge1VuaW9ufSBvciBhIHtTdHJ1Y3R9ID8KKyAgICAjCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICMKKyAgICBkZWYgdW5pb24/CisgICAgICBAdW5pb24KKyAgICBlbmQKKworICAgICMgU2V0IHBhY2tlZCBhdHRyaWJ1dGUKKyAgICAjIEBvdmVybG9hZCBwYWNrZWQ9KHBhY2tlZCkgU2V0IGFsaWdubWVudCBhbmQgcGFja2VkIGF0dHJpYnV0ZXMgdG8KKyAgICAjICAgK3BhY2tlZCsuCisgICAgIworICAgICMgICBAcGFyYW0gW0ZpeG51bV0gcGFja2VkCisgICAgIworICAgICMgICBAcmV0dXJuIFtwYWNrZWRdCisgICAgIyBAb3ZlcmxvYWQgcGFja2VkPShwYWNrZWQpIFNldCBwYWNrZWQgYXR0cmlidXRlLgorICAgICMgICBAcGFyYW0gcGFja2VkCisgICAgIworICAgICMgICBAcmV0dXJuIFswLDFdCisgICAgIworICAgIGRlZiBwYWNrZWQ9KHBhY2tlZCkKKyAgICAgIGlmIHBhY2tlZC5pc19hPygwLmNsYXNzKQorICAgICAgICBAYWxpZ25tZW50ID0gcGFja2VkCisgICAgICAgIEBwYWNrZWQgPSBwYWNrZWQKKyAgICAgIGVsc2UKKyAgICAgICAgQHBhY2tlZCA9IHBhY2tlZCA/IDEgOiAwCisgICAgICBlbmQKKyAgICBlbmQKKworCisgICAgIyBMaXN0IG9mIG51bWJlciB0eXBlcworICAgIE5VTUJFUl9UWVBFUyA9IFsKKyAgICAgIFR5cGU6OklOVDgsCisgICAgICBUeXBlOjpVSU5UOCwKKyAgICAgIFR5cGU6OklOVDE2LAorICAgICAgVHlwZTo6VUlOVDE2LAorICAgICAgVHlwZTo6SU5UMzIsCisgICAgICBUeXBlOjpVSU5UMzIsCisgICAgICBUeXBlOjpMT05HLAorICAgICAgVHlwZTo6VUxPTkcsCisgICAgICBUeXBlOjpJTlQ2NCwKKyAgICAgIFR5cGU6OlVJTlQ2NCwKKyAgICAgIFR5cGU6OkZMT0FUMzIsCisgICAgICBUeXBlOjpGTE9BVDY0LAorICAgICAgVHlwZTo6TE9OR0RPVUJMRSwKKyAgICAgIFR5cGU6OkJPT0wsCisgICAgXQorCisgICAgIyBAcGFyYW0gW1N0cmluZywgU3ltYm9sXSBuYW1lIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgIyBAcGFyYW0gW0FycmF5LCBEYXRhQ29udmVydGVyLCBTdHJ1Y3QsIFN0cnVjdExheW91dDo6RmllbGQsIFN5bWJvbCwgVHlwZV0gdHlwZSB0eXBlIG9mIHRoZSBmaWVsZAorICAgICMgQHBhcmFtIFtOdW1lcmljLCBuaWxdIG9mZnNldAorICAgICMgQHJldHVybiBbc2VsZl0KKyAgICAjIEFkZCBhIGZpZWxkIHRvIHRoZSBidWlsZGVyLgorICAgICMgQG5vdGUgU2V0dGluZyArb2Zmc2V0KyB0byArbmlsKyBvciArLTErIGlzIGVxdWl2YWxlbnQgdG8gKzArLgorICAgIGRlZiBhZGQobmFtZSwgdHlwZSwgb2Zmc2V0ID0gbmlsKQorCisgICAgICBpZiBvZmZzZXQubmlsPyB8fCBvZmZzZXQgPT0gLTEKKyAgICAgICAgb2Zmc2V0ID0gQHVuaW9uID8gMCA6IGFsaWduKEBzaXplLCBAcGFja2VkID8gWyBAcGFja2VkLCB0eXBlLmFsaWdubWVudCBdLm1pbiA6IFsgQG1pbl9hbGlnbm1lbnQsIHR5cGUuYWxpZ25tZW50IF0ubWF4KQorICAgICAgZW5kCisKKyAgICAgICMKKyAgICAgICMgSWYgYSBGRkk6OlR5cGUgdHlwZSB3YXMgcGFzc2VkIGluIGFzIHRoZSBmaWVsZCBhcmcsIHRyeSBhbmQgY29udmVydCB0byBhIFN0cnVjdExheW91dDo6RmllbGQgaW5zdGFuY2UKKyAgICAgICMKKyAgICAgIGZpZWxkID0gdHlwZS5pc19hPyhTdHJ1Y3RMYXlvdXQ6OkZpZWxkKSA/IHR5cGUgOiBmaWVsZF9mb3JfdHlwZShuYW1lLCBvZmZzZXQsIHR5cGUpCisgICAgICBAZmllbGRzIDw8IGZpZWxkCisgICAgICBAYWxpZ25tZW50ID0gWyBAYWxpZ25tZW50LCBmaWVsZC5hbGlnbm1lbnQgXS5tYXggdW5sZXNzIEBwYWNrZWQKKyAgICAgIEBzaXplID0gWyBAc2l6ZSwgZmllbGQuc2l6ZSArIChAdW5pb24gPyAwIDogZmllbGQub2Zmc2V0KSBdLm1heAorCisgICAgICByZXR1cm4gc2VsZgorICAgIGVuZAorCisgICAgIyBAcGFyYW0gKHNlZSAjYWRkKQorICAgICMgQHJldHVybiAoc2VlICNhZGQpCisgICAgIyBTYW1lIGFzIHsjYWRkfS4KKyAgICAjIEBzZWUgI2FkZAorICAgIGRlZiBhZGRfZmllbGQobmFtZSwgdHlwZSwgb2Zmc2V0ID0gbmlsKQorICAgICAgYWRkKG5hbWUsIHR5cGUsIG9mZnNldCkKKyAgICBlbmQKKworICAgICMgQHBhcmFtIChzZWUgI2FkZCkKKyAgICAjIEByZXR1cm4gKHNlZSAjYWRkKQorICAgICMgQWRkIGEgc3RydWN0IGFzIGEgZmllbGQgdG8gdGhlIGJ1aWxkZXIuCisgICAgZGVmIGFkZF9zdHJ1Y3QobmFtZSwgdHlwZSwgb2Zmc2V0ID0gbmlsKQorICAgICAgYWRkKG5hbWUsIFR5cGU6OlN0cnVjdC5uZXcodHlwZSksIG9mZnNldCkKKyAgICBlbmQKKworICAgICMgQHBhcmFtIG5hbWUgKHNlZSAjYWRkKQorICAgICMgQHBhcmFtIHR5cGUgKHNlZSAjYWRkKQorICAgICMgQHBhcmFtIFtOdW1lcmljXSBjb3VudCBhcnJheSBsZW5ndGgKKyAgICAjIEBwYXJhbSBvZmZzZXQgKHNlZSAjYWRkKQorICAgICMgQHJldHVybiAoc2VlICNhZGQpCisgICAgIyBBZGQgYW4gYXJyYXkgYXMgYSBmaWVsZCB0byB0aGUgYnVpbGRlci4KKyAgICBkZWYgYWRkX2FycmF5KG5hbWUsIHR5cGUsIGNvdW50LCBvZmZzZXQgPSBuaWwpCisgICAgICBhZGQobmFtZSwgVHlwZTo6QXJyYXkubmV3KHR5cGUsIGNvdW50KSwgb2Zmc2V0KQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtTdHJ1Y3RMYXlvdXRdCisgICAgIyBCdWlsZCBhbmQgcmV0dXJuIHRoZSBzdHJ1Y3QgbGF5b3V0LgorICAgIGRlZiBidWlsZAorICAgICAgIyBBZGQgdGFpbCBwYWRkaW5nIGlmIHRoZSBzdHJ1Y3QgaXMgbm90IHBhY2tlZAorICAgICAgc2l6ZSA9IEBwYWNrZWQgPyBAc2l6ZSA6IGFsaWduKEBzaXplLCBAYWxpZ25tZW50KQorCisgICAgICBsYXlvdXQgPSBTdHJ1Y3RMYXlvdXQubmV3KEBmaWVsZHMsIHNpemUsIEBhbGlnbm1lbnQpCisgICAgICBsYXlvdXQuX191bmlvbiEgaWYgQHVuaW9uCisgICAgICBsYXlvdXQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgICMgQHBhcmFtIFtOdW1lcmljXSBvZmZzZXQKKyAgICAjIEBwYXJhbSBbTnVtZXJpY10gYWxpZ24KKyAgICAjIEByZXR1cm4gW051bWVyaWNdCisgICAgZGVmIGFsaWduKG9mZnNldCwgYWxpZ24pCisgICAgICBhbGlnbiArICgob2Zmc2V0IC0gMSkgJiB+KGFsaWduIC0gMSkpOworICAgIGVuZAorCisgICAgIyBAcGFyYW0gKHNlZSAjYWRkKQorICAgICMgQHJldHVybiBbU3RydWN0TGF5b3V0OjpGaWVsZF0KKyAgICBkZWYgZmllbGRfZm9yX3R5cGUobmFtZSwgb2Zmc2V0LCB0eXBlKQorICAgICAgZmllbGRfY2xhc3MgPSBjYXNlCisgICAgICB3aGVuIHR5cGUuaXNfYT8oVHlwZTo6RnVuY3Rpb24pCisgICAgICAgIFN0cnVjdExheW91dDo6RnVuY3Rpb24KKworICAgICAgd2hlbiB0eXBlLmlzX2E/KFR5cGU6OlN0cnVjdCkKKyAgICAgICAgU3RydWN0TGF5b3V0OjpJbm5lclN0cnVjdAorCisgICAgICB3aGVuIHR5cGUuaXNfYT8oVHlwZTo6QXJyYXkpCisgICAgICAgIFN0cnVjdExheW91dDo6QXJyYXkKKworICAgICAgd2hlbiB0eXBlLmlzX2E/KEZGSTo6RW51bSkKKyAgICAgICAgU3RydWN0TGF5b3V0OjpFbnVtCisKKyAgICAgIHdoZW4gTlVNQkVSX1RZUEVTLmluY2x1ZGU/KHR5cGUpCisgICAgICAgIFN0cnVjdExheW91dDo6TnVtYmVyCisKKyAgICAgIHdoZW4gdHlwZSA9PSBUeXBlOjpQT0lOVEVSCisgICAgICAgIFN0cnVjdExheW91dDo6UG9pbnRlcgorCisgICAgICB3aGVuIHR5cGUgPT0gVHlwZTo6U1RSSU5HCisgICAgICAgIFN0cnVjdExheW91dDo6U3RyaW5nCisKKyAgICAgIHdoZW4gdHlwZS5pc19hPyhDbGFzcykgJiYgdHlwZSA8IFN0cnVjdExheW91dDo6RmllbGQKKyAgICAgICAgdHlwZQorCisgICAgICB3aGVuIHR5cGUuaXNfYT8oRGF0YUNvbnZlcnRlcikKKyAgICAgICAgcmV0dXJuIFN0cnVjdExheW91dDo6TWFwcGVkLm5ldyhuYW1lLCBvZmZzZXQsIFR5cGU6Ok1hcHBlZC5uZXcodHlwZSksIGZpZWxkX2Zvcl90eXBlKG5hbWUsIG9mZnNldCwgdHlwZS5uYXRpdmVfdHlwZSkpCisKKyAgICAgIHdoZW4gdHlwZS5pc19hPyhUeXBlOjpNYXBwZWQpCisgICAgICAgIHJldHVybiBTdHJ1Y3RMYXlvdXQ6Ok1hcHBlZC5uZXcobmFtZSwgb2Zmc2V0LCB0eXBlLCBmaWVsZF9mb3JfdHlwZShuYW1lLCBvZmZzZXQsIHR5cGUubmF0aXZlX3R5cGUpKQorCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImludmFsaWQgc3RydWN0IGZpZWxkIHR5cGUgI3t0eXBlLmluc3BlY3R9IgorICAgICAgZW5kCisKKyAgICAgIGZpZWxkX2NsYXNzLm5ldyhuYW1lLCBvZmZzZXQsIHR5cGUpCisgICAgZW5kCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS90b29scy9jb25zdF9nZW5lcmF0b3IucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvdG9vbHMvY29uc3RfZ2VuZXJhdG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzYyMmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvdG9vbHMvY29uc3RfZ2VuZXJhdG9yLnJiCkBAIC0wLDAgKzEsMjI5IEBACityZXF1aXJlICd0ZW1wZmlsZScKK3JlcXVpcmUgJ29wZW4zJworCittb2R1bGUgRkZJCisKKyAgIyBDb25zdEdlbmVyYXRvciB0dXJucyBDIGNvbnN0YW50cyBpbnRvIHJ1YnkgdmFsdWVzLgorICAjCisgICMgQGV4YW1wbGUgYSBzaW1wbGUgZXhhbXBsZSBmb3Igc3RkaW8KKyAgIyAgY2cgPSBGRkk6OkNvbnN0R2VuZXJhdG9yLm5ldygnc3RkaW8nKSBkbyB8Z2VufAorICAjICAgIGdlbi5jb25zdCg6U0VFS19TRVQpCisgICMgICAgZ2VuLmNvbnN0KCdTRUVLX0NVUicpCisgICMgICAgZ2VuLmNvbnN0KCdzZWVrX2VuZCcpICAgIyB0aGlzIGNvbnN0YW50IGRvZXMgbm90IGV4aXN0CisgICMgIGVuZCAgICAgICAgICAgICMgI2NhbGN1bGF0ZSBjYWxsZWQgYXV0b21hdGljYWxseSBhdCB0aGUgZW5kIG9mIHRoZSBibG9jaworICAjCisgICMgIGNnWydTRUVLX1NFVCddICMgPT4gMAorICAjICBjZ1snU0VFS19DVVInXSAjID0+IDEKKyAgIyAgY2dbJ3NlZWtfZW5kJ10gIyA9PiBuaWwKKyAgIyAgY2cudG9fcnVieSAgICAgIyA9PiAiU0VFS19TRVQgPSAwXG5TRUVLX0NVUiA9IDFcbiMgc2Vla19lbmQgbm90IGF2YWlsYWJsZSIKKyAgY2xhc3MgQ29uc3RHZW5lcmF0b3IKKyAgICBAb3B0aW9ucyA9IHt9CisgICAgYXR0cl9yZWFkZXIgOmNvbnN0YW50cworCisgICAgIyBDcmVhdGVzIGEgbmV3IGNvbnN0YW50IGdlbmVyYXRvciB0aGF0IHVzZXMgK3ByZWZpeCsgYXMgYSBuYW1lLCBhbmQgYW4KKyAgICAjIG9wdGlvbnMgaGFzaC4KKyAgICAjCisgICAgIyBUaGUgb25seSBvcHRpb24gaXMgKzpyZXF1aXJlZCssIHdoaWNoIGlmIHNldCB0byArdHJ1ZSsgcmFpc2VzIGFuIGVycm9yIGlmIGEKKyAgICAjIGNvbnN0YW50IHlvdSBoYXZlIHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLgorICAgICMgCisgICAgIyBAcGFyYW0gWyN0b19zXSBwcmVmaXgKKyAgICAjIEBwYXJhbSBbSGFzaF0gb3B0aW9ucworICAgICMgQHJldHVybiAKKyAgICAjIEBvcHRpb24gb3B0aW9ucyBbQm9vbGVhbl0gOnJlcXVpcmVkCisgICAgIyBAb3ZlcmxvYWQgaW5pdGlhbGl6ZShwcmVmaXgsIG9wdGlvbnMpCisgICAgIyBAb3ZlcmxvYWQgaW5pdGlhbGl6ZShwcmVmaXgsIG9wdGlvbnMpIHsgfGdlbnwgLi4uIH0KKyAgICAjICBAeWllbGRwYXJhbSBbQ29uc3RHZW5lcmF0b3JdIGdlbiBuZXcgZ2VuZXJhdG9yIGlzIHBhc3NlZCB0byB0aGUgYmxvY2sKKyAgICAjICBXaGVuIHBhc3NlZCBhIGJsb2NrLCB7I2NhbGN1bGF0ZX0gaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYXQgdGhlIGVuZCBvZgorICAgICMgIHRoZSBibG9jaywgb3RoZXJ3aXNlIHlvdSBtdXN0IGNhbGwgaXQgeW91cnNlbGYuCisgICAgZGVmIGluaXRpYWxpemUocHJlZml4ID0gbmlsLCBvcHRpb25zID0ge30pCisgICAgICBAaW5jbHVkZXMgPSBbJ3N0ZGlvLmgnLCAnc3RkZGVmLmgnXQorICAgICAgQGNvbnN0YW50cyA9IHt9CisgICAgICBAcHJlZml4ID0gcHJlZml4CisKKyAgICAgIEByZXF1aXJlZCA9IG9wdGlvbnNbOnJlcXVpcmVkXQorICAgICAgQG9wdGlvbnMgPSBvcHRpb25zCisKKyAgICAgIGlmIGJsb2NrX2dpdmVuPyB0aGVuCisgICAgICAgIHlpZWxkIHNlbGYKKyAgICAgICAgY2FsY3VsYXRlIHNlbGYuY2xhc3Mub3B0aW9ucy5tZXJnZShvcHRpb25zKQorICAgICAgZW5kCisgICAgZW5kCisgICAgIyBTZXQgY2xhc3Mgb3B0aW9ucworICAgICMgVGhlc2Ugb3B0aW9ucyBhcmUgbWVyZ2VkIHdpdGggeyNpbml0aWFsaXplfSBvcHRpb25zIHdoZW4gaXQgaXMgY2FsbGVkIHdpdGggYSBibG9jay4KKyAgICAjIEBwYXJhbSBbSGFzaF0gb3B0aW9ucworICAgICMgQHJldHVybiBbSGFzaF0gY2xhc3Mgb3B0aW9ucworICAgIGRlZiBzZWxmLm9wdGlvbnM9KG9wdGlvbnMpCisgICAgICBAb3B0aW9ucyA9IG9wdGlvbnMKKyAgICBlbmQKKyAgICAjIEdldCBjbGFzcyBvcHRpb25zLgorICAgICMgQHJldHVybiBbSGFzaF0gY2xhc3Mgb3B0aW9ucworICAgIGRlZiBzZWxmLm9wdGlvbnMKKyAgICAgIEBvcHRpb25zCisgICAgZW5kCisgICAgIyBAcGFyYW0gW1N0cmluZ10gbmFtZQorICAgICMgQHJldHVybiBjb25zdGFudCB2YWx1ZSAoY29udmVydGVkIGlmIGEgK2NvbnZlcnRlcisgd2FzIGRlZmluZWQpLgorICAgICMgQWNjZXNzIGEgY29uc3RhbnQgYnkgbmFtZS4KKyAgICBkZWYgW10obmFtZSkKKyAgICAgIEBjb25zdGFudHNbbmFtZV0uY29udmVydGVkX3ZhbHVlCisgICAgZW5kCisKKyAgICAjIFJlcXVlc3QgdGhlIHZhbHVlIGZvciBDIGNvbnN0YW50ICtuYW1lKy4KKyAgICAjCisgICAgIyBAcGFyYW0gWyN0b19zXSBuYW1lIEMgY29uc3RhbnQgbmFtZQorICAgICMgQHBhcmFtIFtTdHJpbmddIGZvcm1hdCBhIHByaW50ZiBmb3JtYXQgc3RyaW5nIHRvIHByaW50IHRoZSB2YWx1ZSBvdXQKKyAgICAjIEBwYXJhbSBbU3RyaW5nXSBjYXN0IGEgQyBjYXN0IGZvciB0aGUgdmFsdWUKKyAgICAjIEBwYXJhbSBydWJ5X25hbWUgYWx0ZXJuYXRlIHJ1YnkgbmFtZSBmb3IgeyN0b19ydWJ5fQorICAgICMKKyAgICAjIEBvdmVybG9hZCBjb25zdChuYW1lLCBmb3JtYXQ9bmlsLCBjYXN0PScnLCBydWJ5X25hbWU9bmlsLCBjb252ZXJ0ZXI9bmlsKQorICAgICMgICtjb252ZXJ0ZXIrIGlzIGEgTWV0aG9kIG9yIGEgUHJvYy4KKyAgICAjICBAcGFyYW0gWyNjYWxsXSBjb252ZXJ0ZXIgY29udmVydCB0aGUgdmFsdWUgZnJvbSBhIHN0cmluZyB0byB0aGUgYXBwcm9wcmlhdGUKKyAgICAjICAgdHlwZSBmb3IgeyN0b19ydWJ5fS4KKyAgICAjIEBvdmVybG9hZCBjb25zdChuYW1lLCBmb3JtYXQ9bmlsLCBjYXN0PScnLCBydWJ5X25hbWU9bmlsKSB7IHx2YWx1ZXwgLi4uIH0KKyAgICAjICBVc2UgYSBjb252ZXJ0ZXIgYmxvY2suIFRoaXMgYmxvY2sgY29udmVydCB0aGUgdmFsdWUgZnJvbSBhIHN0cmluZyB0byB0aGUgCisgICAgIyAgYXBwcm9wcmlhdGUgdHlwZSBmb3IgeyN0b19ydWJ5fS4KKyAgICAjICBAeWllbGRwYXJhbSB2YWx1ZSBjb25zdGFudCB2YWx1ZQorICAgIGRlZiBjb25zdChuYW1lLCBmb3JtYXQgPSBuaWwsIGNhc3QgPSAnJywgcnVieV9uYW1lID0gbmlsLCBjb252ZXJ0ZXIgPSBuaWwsCisgICAgICAgICAgICAgICZjb252ZXJ0ZXJfcHJvYykKKyAgICAgIGZvcm1hdCB8fD0gJyVkJworICAgICAgY2FzdCB8fD0gJycKKworICAgICAgaWYgY29udmVydGVyX3Byb2MgYW5kIGNvbnZlcnRlciB0aGVuCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJTdXBwbHkgb25seSBjb252ZXJ0ZXIgb3IgY29udmVydGVyIGJsb2NrIgorICAgICAgZW5kCisKKyAgICAgIGNvbnZlcnRlciA9IGNvbnZlcnRlcl9wcm9jIGlmIGNvbnZlcnRlci5uaWw/CisKKyAgICAgIGNvbnN0ID0gQ29uc3RhbnQubmV3IG5hbWUsIGZvcm1hdCwgY2FzdCwgcnVieV9uYW1lLCBjb252ZXJ0ZXIKKyAgICAgIEBjb25zdGFudHNbbmFtZS50b19zXSA9IGNvbnN0CisgICAgICByZXR1cm4gY29uc3QKKyAgICBlbmQKKworICAgICMgQ2FsY3VsYXRlIGNvbnN0YW50cyB2YWx1ZXMuCisgICAgIyBAcGFyYW0gW0hhc2hdIG9wdGlvbnMKKyAgICAjIEBvcHRpb24gb3B0aW9ucyBbU3RyaW5nXSA6Y3BwZmxhZ3MgZmxhZ3MgZm9yIEMgY29tcGlsZXIKKyAgICAjIEByZXR1cm4gW25pbF0KKyAgICAjIEByYWlzZSBpZiBhIGNvbnN0YW50IGlzIG1pc3NpbmcgYW5kICs6cmVxdWlyZWQrIHdhcyBzZXQgdG8gK3RydWUrIChzZWUgeyNpbml0aWFsaXplfSkKKyAgICBkZWYgY2FsY3VsYXRlKG9wdGlvbnMgPSB7fSkKKyAgICAgIGJpbmFyeSA9IEZpbGUuam9pbiBEaXIudG1wZGlyLCAicmJfY29uc3RfZ2VuX2Jpbl8je1Byb2Nlc3MucGlkfSIKKworICAgICAgVGVtcGZpbGUub3BlbigiI3tAcHJlZml4fS5jb25zdF9nZW5lcmF0b3IiKSBkbyB8ZnwKKyAgICAgICAgQGluY2x1ZGVzLmVhY2ggZG8gfGluY3wKKyAgICAgICAgICBmLnB1dHMgIiNpbmNsdWRlIDwje2luY30+IgorICAgICAgICBlbmQKKyAgICAgICAgZi5wdXRzICJcbmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbnsiCisKKyAgICAgICAgQGNvbnN0YW50cy5lYWNoX3ZhbHVlIGRvIHxjb25zdHwKKyAgICAgICAgICBmLnB1dHMgPDwtRU9GCisgICNpZmRlZiAje2NvbnN0Lm5hbWV9CisgIHByaW50ZigiI3tjb25zdC5uYW1lfSAje2NvbnN0LmZvcm1hdH1cXG4iLCAje2NvbnN0LmNhc3R9I3tjb25zdC5uYW1lfSk7CisgICNlbmRpZgorICAgICAgICAgIEVPRgorICAgICAgICBlbmQKKworICAgICAgICBmLnB1dHMgIlxuXHRyZXR1cm4gMDtcbn0iCisgICAgICAgIGYuZmx1c2gKKworICAgICAgICBvdXRwdXQgPSBgZ2NjICN7b3B0aW9uc1s6Y3BwZmxhZ3NdfSAtRF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERSAtRF9MQVJHRUZJTEVfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLXggYyAtV2FsbCAtV2Vycm9yICN7Zi5wYXRofSAtbyAje2JpbmFyeX0gMj4mMWAKKworICAgICAgICB1bmxlc3MgJD8uc3VjY2Vzcz8gdGhlbgorICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5zcGxpdCgiXG4iKS5tYXAgeyB8bHwgIlx0I3tsfSIgfS5qb2luICJcbiIKKyAgICAgICAgICByYWlzZSAiQ29tcGlsYXRpb24gZXJyb3IgZ2VuZXJhdGluZyBjb25zdGFudHMgI3tAcHJlZml4fTpcbiN7b3V0cHV0fSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgb3V0cHV0ID0gYCN7YmluYXJ5fWAKKyAgICAgIEZpbGUudW5saW5rKGJpbmFyeSArIChGRkk6OlBsYXRmb3JtLndpbmRvd3M/ID8gIi5leGUiIDogIiIpKQorICAgICAgb3V0cHV0LmVhY2hfbGluZSBkbyB8bGluZXwKKyAgICAgICAgbGluZSA9fiAvXihcUyspXHMoLiopJC8KKyAgICAgICAgY29uc3QgPSBAY29uc3RhbnRzWyQxXQorICAgICAgICBjb25zdC52YWx1ZSA9ICQyCisgICAgICBlbmQKKworICAgICAgbWlzc2luZ19jb25zdGFudHMgPSBAY29uc3RhbnRzLnNlbGVjdCBkbyB8bmFtZSwgY29uc3RhbnR8CisgICAgICAgIGNvbnN0YW50LnZhbHVlLm5pbD8KKyAgICAgIGVuZC5tYXAgeyB8bmFtZSx8IG5hbWUgfQorCisgICAgICBpZiBAcmVxdWlyZWQgYW5kIG5vdCBtaXNzaW5nX2NvbnN0YW50cy5lbXB0eT8gdGhlbgorICAgICAgICByYWlzZSAiTWlzc2luZyByZXF1aXJlZCBjb25zdGFudHMgZm9yICN7QHByZWZpeH06ICN7bWlzc2luZ19jb25zdGFudHMuam9pbiAnLCAnfSIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBEdW1wIGNvbnN0YW50cyB0byAraW8rLgorICAgICMgQHBhcmFtIFsjcHV0c10gaW8KKyAgICAjIEByZXR1cm4gW25pbF0KKyAgICBkZWYgZHVtcF9jb25zdGFudHMoaW8pCisgICAgICBAY29uc3RhbnRzLmVhY2ggZG8gfG5hbWUsIGNvbnN0YW50fAorICAgICAgICBuYW1lID0gW0BwcmVmaXgsIG5hbWVdLmpvaW4gJy4nIGlmIEBwcmVmaXgKKyAgICAgICAgaW8ucHV0cyAiI3tuYW1lfSA9ICN7Y29uc3RhbnQuY29udmVydGVkX3ZhbHVlfSIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBPdXRwdXRzIHZhbHVlcyBmb3IgZGlzY292ZXJlZCBjb25zdGFudHMuICBJZiB0aGUgY29uc3RhbnQncyB2YWx1ZSB3YXMKKyAgICAjIG5vdCBkaXNjb3ZlcmVkIGl0IGlzIG5vdCBvbWl0dGVkLgorICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGRlZiB0b19ydWJ5CisgICAgICBAY29uc3RhbnRzLnNvcnRfYnkgeyB8bmFtZSx8IG5hbWUgfS5tYXAgZG8gfG5hbWUsIGNvbnN0YW50fAorICAgICAgICBpZiBjb25zdGFudC52YWx1ZS5uaWw/IHRoZW4KKyAgICAgICAgICAiIyAje25hbWV9IG5vdCBhdmFpbGFibGUiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb25zdGFudC50b19ydWJ5CisgICAgICAgIGVuZAorICAgICAgZW5kLmpvaW4gIlxuIgorICAgIGVuZAorCisgICAgIyBBZGQgYWRkaXRpb25hbCBDIGluY2x1ZGUgZmlsZShzKSB0byBjYWxjdWxhdGUgY29uc3RhbnRzIGZyb20uCisgICAgIyBAbm90ZSArc3RkaW8uaCsgYW5kICtzdGRkZWYuaCsgYXV0b21hdGljYWxseSBpbmNsdWRlZAorICAgICMgQHBhcmFtIFtMaXN0PFN0cmluZz4sIEFycmF5PFN0cmluZz5dIGkgaW5jbHVkZSBmaWxlKHMpCisgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmc+XSBhcnJheSBvZiBpbmNsdWRlIGZpbGVzCisgICAgZGVmIGluY2x1ZGUoKmkpCisgICAgICBAaW5jbHVkZXMgfD0gaS5mbGF0dGVuCisgICAgZW5kCisKKyAgZW5kCisKKyAgIyBUaGlzIGNsYXNzIGhvbGQgY29uc3RhbnRzIGZvciB7Q29uc3RHZW5lcmF0b3J9CisgIGNsYXNzIENvbnN0R2VuZXJhdG9yOjpDb25zdGFudAorCisgICAgYXR0cl9yZWFkZXIgOm5hbWUsIDpmb3JtYXQsIDpjYXN0CisgICAgYXR0cl9hY2Nlc3NvciA6dmFsdWUKKworICAgICMgQHBhcmFtIFsjdG9fc10gbmFtZQorICAgICMgQHBhcmFtIFtTdHJpbmddIGZvcm1hdCBhIHByaW50ZiBmb3JtYXQgc3RyaW5nIHRvIHByaW50IHRoZSB2YWx1ZSBvdXQKKyAgICAjIEBwYXJhbSBbU3RyaW5nXSBjYXN0IGEgQyBjYXN0IGZvciB0aGUgdmFsdWUKKyAgICAjIEBwYXJhbSBydWJ5X25hbWUgYWx0ZXJuYXRlIHJ1YnkgbmFtZSBmb3IgeyN0b19ydWJ5fQorICAgICMgQHBhcmFtIFsjY2FsbF0gY29udmVydGVyIGNvbnZlcnQgdGhlIHZhbHVlIGZyb20gYSBzdHJpbmcgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgIyAgdHlwZSBmb3IgeyN0b19ydWJ5fS4KKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBmb3JtYXQsIGNhc3QsIHJ1YnlfbmFtZSA9IG5pbCwgY29udmVydGVyPW5pbCkKKyAgICAgIEBuYW1lID0gbmFtZQorICAgICAgQGZvcm1hdCA9IGZvcm1hdAorICAgICAgQGNhc3QgPSBjYXN0CisgICAgICBAcnVieV9uYW1lID0gcnVieV9uYW1lCisgICAgICBAY29udmVydGVyID0gY29udmVydGVyCisgICAgICBAdmFsdWUgPSBuaWwKKyAgICBlbmQKKworICAgICMgUmV0dXJuIGNvbnN0YW50IHZhbHVlIChjb252ZXJ0ZWQgaWYgYSArY29udmVydGVyKyB3YXMgZGVmaW5lZCkuCisgICAgIyBAcmV0dXJuIGNvbnN0YW50IHZhbHVlLgorICAgIGRlZiBjb252ZXJ0ZWRfdmFsdWUKKyAgICAgIGlmIEBjb252ZXJ0ZXIKKyAgICAgICAgQGNvbnZlcnRlci5jYWxsKEB2YWx1ZSkKKyAgICAgIGVsc2UKKyAgICAgICAgQHZhbHVlCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgZ2V0IGNvbnN0YW50IHJ1YnkgbmFtZQorICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGRlZiBydWJ5X25hbWUKKyAgICAgIEBydWJ5X25hbWUgfHwgQG5hbWUKKyAgICBlbmQKKworICAgICMgR2V0IGFuIGV2YWx1YWJsZSBzdHJpbmcgZnJvbSBjb25zdGFudC4KKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBkZWYgdG9fcnVieQorICAgICAgIiN7cnVieV9uYW1lfSA9ICN7Y29udmVydGVkX3ZhbHVlfSIKKyAgICBlbmQKKworICBlbmQgIAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS90b29scy9nZW5lcmF0b3IucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvdG9vbHMvZ2VuZXJhdG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YjU5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvdG9vbHMvZ2VuZXJhdG9yLnJiCkBAIC0wLDAgKzEsNjAgQEAKK21vZHVsZSBGRkkKKworICAjIEBwcml2YXRlCisgIGNsYXNzIEdlbmVyYXRvcgorCisgICAgZGVmIGluaXRpYWxpemUoZmZpX25hbWUsIHJiX25hbWUsIG9wdGlvbnMgPSB7fSkKKyAgICAgIEBmZmlfbmFtZSA9IGZmaV9uYW1lCisgICAgICBAcmJfbmFtZSA9IHJiX25hbWUKKyAgICAgIEBvcHRpb25zID0gb3B0aW9ucworICAgICAgQG5hbWUgPSBGaWxlLmJhc2VuYW1lIHJiX25hbWUsICcucmInCisKKyAgICAgIGZpbGUgPSBGaWxlLnJlYWQgQGZmaV9uYW1lCisKKyAgICAgIG5ld19maWxlID0gZmlsZS5nc3ViKC9eKCAqKUBAQCguKj8pQEBAL20pIGRvCisgICAgICAgIEBjb25zdGFudHMgPSBbXQorICAgICAgICBAc3RydWN0cyA9IFtdCisKKyAgICAgICAgaW5kZW50ID0gJDEKKyAgICAgICAgb3JpZ2luYWxfbGluZXMgPSAkMi5jb3VudCAiXG4iCisKKyAgICAgICAgaW5zdGFuY2VfZXZhbCAkMiwgQGZmaV9uYW1lLCAkYC5jb3VudCgiXG4iKQorCisgICAgICAgIG5ld19saW5lcyA9IFtdCisgICAgICAgIEBjb25zdGFudHMuZWFjaCB7IHxjfCBuZXdfbGluZXMgPDwgYy50b19ydWJ5IH0KKyAgICAgICAgQHN0cnVjdHMuZWFjaCB7IHxzfCBuZXdfbGluZXMgPDwgcy5nZW5lcmF0ZV9sYXlvdXQgfQorCisgICAgICAgIG5ld19saW5lcyA9IG5ld19saW5lcy5qb2luKCJcbiIpLnNwbGl0ICJcbiIgIyBleHBhbmQgbXVsdGlsaW5lIGJsb2NrcworICAgICAgICBuZXdfbGluZXMgPSBuZXdfbGluZXMubWFwIHsgfGxpbmV8IGluZGVudCArIGxpbmUgfQorCisgICAgICAgIHBhZGRpbmcgPSBvcmlnaW5hbF9saW5lcyAtIG5ld19saW5lcy5sZW5ndGgKKyAgICAgICAgbmV3X2xpbmVzICs9IFtuaWxdICogcGFkZGluZyBpZiBwYWRkaW5nID49IDAKKworICAgICAgICBuZXdfbGluZXMuam9pbiAiXG4iCisgICAgICBlbmQKKworICAgICAgb3BlbiBAcmJfbmFtZSwgJ3cnIGRvIHxmfAorICAgICAgICBmLnB1dHMgIiMgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSByYWtlLiBEbyBub3QgZWRpdC4iCisgICAgICAgIGYucHV0cworICAgICAgICBmLnB1dHMgbmV3X2ZpbGUKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNvbnN0YW50cyhvcHRpb25zID0ge30sICZibG9jaykKKyAgICAgIEBjb25zdGFudHMgPDwgRkZJOjpDb25zdEdlbmVyYXRvci5uZXcoQG5hbWUsIEBvcHRpb25zLm1lcmdlKG9wdGlvbnMpLCAmYmxvY2spCisgICAgZW5kCisKKyAgICBkZWYgc3RydWN0KG9wdGlvbnMgPSB7fSwgJmJsb2NrKQorICAgICAgQHN0cnVjdHMgPDwgRkZJOjpTdHJ1Y3RHZW5lcmF0b3IubmV3KEBuYW1lLCBAb3B0aW9ucy5tZXJnZShvcHRpb25zKSwgJmJsb2NrKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFV0aWxpdHkgY29udmVydGVyIGZvciBjb25zdGFudHMKKworICAgIGRlZiB0b19zCisgICAgICBwcm9jIHsgfG9ianwgb2JqLnRvX3MuaW5zcGVjdCB9CisgICAgZW5kCisKKyAgZW5kCitlbmQKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3Rvb2xzL2dlbmVyYXRvcl90YXNrLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3Rvb2xzL2dlbmVyYXRvcl90YXNrLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzk1MTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvdG9vbHMvZ2VuZXJhdG9yX3Rhc2sucmIKQEAgLTAsMCArMSwzNiBAQAorYmVnaW4KKyAgcmVxdWlyZSAnZmZpL3N0cnVjdF9nZW5lcmF0b3InCisgIHJlcXVpcmUgJ2ZmaS9jb25zdF9nZW5lcmF0b3InCisgIHJlcXVpcmUgJ2ZmaS9nZW5lcmF0b3InCityZXNjdWUgTG9hZEVycm9yCisgICMgZnJvbSBSYWtlZmlsZQorICByZXF1aXJlICdsaWIvZmZpL3N0cnVjdF9nZW5lcmF0b3InCisgIHJlcXVpcmUgJ2xpYi9mZmkvY29uc3RfZ2VuZXJhdG9yJworICByZXF1aXJlICdsaWIvZmZpL2dlbmVyYXRvcicKK2VuZAorCityZXF1aXJlICdyYWtlJworcmVxdWlyZSAncmFrZS90YXNrbGliJworcmVxdWlyZSAndGVtcGZpbGUnCisKKyMjCisjIFJha2UgdGFzayB0aGF0IGNhbGN1bGF0ZXMgQyBzdHJ1Y3RzIGZvciBGRkk6OlN0cnVjdC4KKworIyBAcHJpdmF0ZQorY2xhc3MgRkZJOjpHZW5lcmF0b3I6OlRhc2sgPCBSYWtlOjpUYXNrTGliCisKKyAgZGVmIGluaXRpYWxpemUocmJfbmFtZXMpCisgICAgdGFzayA6Y2xlYW4gZG8gcm1fZiByYl9uYW1lcyBlbmQKKworICAgIHJiX25hbWVzLmVhY2ggZG8gfHJiX25hbWV8CisgICAgICBmZmlfbmFtZSA9ICIje3JiX25hbWV9LmZmaSIKKworICAgICAgZmlsZSByYl9uYW1lID0+IGZmaV9uYW1lIGRvIHx0fAorICAgICAgICBwdXRzICJHZW5lcmF0aW5nICN7cmJfbmFtZX0uLi4iIGlmIFJha2UuYXBwbGljYXRpb24ub3B0aW9ucy50cmFjZQorCisgICAgICAgIEZGSTo6R2VuZXJhdG9yLm5ldyBmZmlfbmFtZSwgcmJfbmFtZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS90b29scy9zdHJ1Y3RfZ2VuZXJhdG9yLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3Rvb2xzL3N0cnVjdF9nZW5lcmF0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5MmU2NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS90b29scy9zdHJ1Y3RfZ2VuZXJhdG9yLnJiCkBAIC0wLDAgKzEsMTk0IEBACityZXF1aXJlICd0ZW1wZmlsZScKKworbW9kdWxlIEZGSQorCisgICMjCisgICMgR2VuZXJhdGVzIGFuIEZGSSBTdHJ1Y3QgbGF5b3V0LgorICAjCisgICMgR2l2ZW4gdGhlIEBAQCBwb3J0aW9uIGluOgorICAjCisgICMgICBtb2R1bGUgWmxpYjo6WlN0cmVhbSA8IEZGSTo6U3RydWN0CisgICMgICAgIEBAQAorICAjICAgICBuYW1lICJzdHJ1Y3Qgel9zdHJlYW1fcyIKKyAgIyAgICAgaW5jbHVkZSAiemxpYi5oIgorICAjICAgCisgICMgICAgIGZpZWxkIDpuZXh0X2luLCAgIDpwb2ludGVyCisgICMgICAgIGZpZWxkIDphdmFpbF9pbiwgIDp1aW50CisgICMgICAgIGZpZWxkIDp0b3RhbF9pbiwgIDp1bG9uZworICAjICAgCisgICMgICAgICMgLi4uCisgICMgICAgIEBAQAorICAjICAgZW5kCisgICMKKyAgIyBTdHJ1Y3RHZW5lcmF0b3Igd2lsbCBjcmVhdGUgdGhlIGxheW91dDoKKyAgIworICAjICAgbGF5b3V0IDpuZXh0X2luLCA6cG9pbnRlciwgMCwKKyAgIyAgICAgICAgICA6YXZhaWxfaW4sIDp1aW50LCA0LAorICAjICAgICAgICAgIDp0b3RhbF9pbiwgOnVsb25nLCA4LAorICAjICAgICAgICAgICMgLi4uCisgICMKKyAgIyBTdHJ1Y3RHZW5lcmF0b3IgZG9lcyBpdHMgYmVzdCB0byBwYWQgdGhlIGxheW91dCBpdCBwcm9kdWNlcyB0byBwcmVzZXJ2ZQorICAjIGxpbmUgbnVtYmVycy4gIFBsYWNlIHRoZSBzdHJ1Y3QgZGVmaW5pdGlvbiBhcyBjbG9zZSB0byB0aGUgdG9wIG9mIHRoZSBmaWxlCisgICMgZm9yIGJlc3QgcmVzdWx0cy4KKworICBjbGFzcyBTdHJ1Y3RHZW5lcmF0b3IKKyAgICBAb3B0aW9ucyA9IHt9CisgICAgYXR0cl9hY2Nlc3NvciA6c2l6ZQorICAgIGF0dHJfcmVhZGVyICAgOmZpZWxkcworCisgICAgZGVmIGluaXRpYWxpemUobmFtZSwgb3B0aW9ucyA9IHt9KQorICAgICAgQG5hbWUgPSBuYW1lCisgICAgICBAc3RydWN0X25hbWUgPSBuaWwKKyAgICAgIEBpbmNsdWRlcyA9IFtdCisgICAgICBAZmllbGRzID0gW10KKyAgICAgIEBmb3VuZCA9IGZhbHNlCisgICAgICBAc2l6ZSA9IG5pbAorCisgICAgICBpZiBibG9ja19naXZlbj8gdGhlbgorICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIGNhbGN1bGF0ZSBzZWxmLmNsYXNzLm9wdGlvbnMubWVyZ2Uob3B0aW9ucykKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGRlZiBzZWxmLm9wdGlvbnM9KG9wdGlvbnMpCisgICAgICBAb3B0aW9ucyA9IG9wdGlvbnMKKyAgICBlbmQKKyAgICBkZWYgc2VsZi5vcHRpb25zCisgICAgICBAb3B0aW9ucworICAgIGVuZAorICAgIGRlZiBjYWxjdWxhdGUob3B0aW9ucyA9IHt9KQorICAgICAgYmluYXJ5ID0gRmlsZS5qb2luIERpci50bXBkaXIsICJyYl9zdHJ1Y3RfZ2VuX2Jpbl8je1Byb2Nlc3MucGlkfSIKKworICAgICAgcmFpc2UgInN0cnVjdCBuYW1lIG5vdCBzZXQiIGlmIEBzdHJ1Y3RfbmFtZS5uaWw/CisKKyAgICAgIFRlbXBmaWxlLm9wZW4oIiN7QG5hbWV9LnN0cnVjdF9nZW5lcmF0b3IiKSBkbyB8ZnwKKyAgICAgICAgZi5wdXRzICIjaW5jbHVkZSA8c3RkaW8uaD4iCisKKyAgICAgICAgQGluY2x1ZGVzLmVhY2ggZG8gfGluY3wKKyAgICAgICAgICBmLnB1dHMgIiNpbmNsdWRlIDwje2luY30+IgorICAgICAgICBlbmQKKworICAgICAgICBmLnB1dHMgIiNpbmNsdWRlIDxzdGRkZWYuaD5cblxuIgorICAgICAgICBmLnB1dHMgImludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbnsiCisgICAgICAgIGYucHV0cyAiICAje0BzdHJ1Y3RfbmFtZX0gczsiCisgICAgICAgIGYucHV0cyAlWyAgcHJpbnRmKCJzaXplb2YoI3tAc3RydWN0X25hbWV9KSAldVxcbiIsICh1bnNpZ25lZCBpbnQpIHNpemVvZigje0BzdHJ1Y3RfbmFtZX0pKTtdCisKKyAgICAgICAgQGZpZWxkcy5lYWNoIGRvIHxmaWVsZHwKKyAgICAgICAgICBmLnB1dHMgPDwtRU9GCisgICAgcHJpbnRmKCIje2ZpZWxkLm5hbWV9ICV1ICV1XFxuIiwgKHVuc2lnbmVkIGludCkgb2Zmc2V0b2YoI3tAc3RydWN0X25hbWV9LCAje2ZpZWxkLm5hbWV9KSwKKyAgICAgICAgICAgKHVuc2lnbmVkIGludCkgc2l6ZW9mKHMuI3tmaWVsZC5uYW1lfSkpOworICBFT0YKKyAgICAgICAgZW5kCisKKyAgICAgICAgZi5wdXRzICJcbiAgcmV0dXJuIDA7XG59IgorICAgICAgICBmLmZsdXNoCisKKyAgICAgICAgb3V0cHV0ID0gYGdjYyAje29wdGlvbnNbOmNwcGZsYWdzXX0gI3tvcHRpb25zWzpjZmxhZ3NdfSAtRF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERSAtRF9MQVJHRUZJTEVfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLXggYyAtV2FsbCAtV2Vycm9yICN7Zi5wYXRofSAtbyAje2JpbmFyeX0gMj4mMWAKKworICAgICAgICB1bmxlc3MgJD8uc3VjY2Vzcz8gdGhlbgorICAgICAgICAgIEBmb3VuZCA9IGZhbHNlCisgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnNwbGl0KCJcbiIpLm1hcCB7IHxsfCAiXHQje2x9IiB9LmpvaW4gIlxuIgorICAgICAgICAgIHJhaXNlICJDb21waWxhdGlvbiBlcnJvciBnZW5lcmF0aW5nIHN0cnVjdCAje0BuYW1lfSAoI3tAc3RydWN0X25hbWV9KTpcbiN7b3V0cHV0fSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIAorICAgICAgb3V0cHV0ID0gYCN7YmluYXJ5fWAuc3BsaXQgIlxuIgorICAgICAgRmlsZS51bmxpbmsoYmluYXJ5ICsgKEZGSTo6UGxhdGZvcm0ud2luZG93cz8gPyAiLmV4ZSIgOiAiIikpCisgICAgICBzaXplb2YgPSBvdXRwdXQuc2hpZnQKKyAgICAgIHVubGVzcyBAc2l6ZQorICAgICAgICBtID0gL1xzKnNpemVvZlwoW14pXStcKSAoXGQrKS8ubWF0Y2ggc2l6ZW9mCisgICAgICAgIEBzaXplID0gbVsxXQorICAgICAgZW5kCisKKyAgICAgIGxpbmVfbm8gPSAwCisgICAgICBvdXRwdXQuZWFjaCBkbyB8bGluZXwKKyAgICAgICAgbWQgPSBsaW5lLm1hdGNoKC8uKyAoXGQrKSAoXGQrKS8pCisgICAgICAgIEBmaWVsZHNbbGluZV9ub10ub2Zmc2V0ID0gbWRbMV0udG9faQorICAgICAgICBAZmllbGRzW2xpbmVfbm9dLnNpemUgICA9IG1kWzJdLnRvX2kKKworICAgICAgICBsaW5lX25vICs9IDEKKyAgICAgIGVuZAorCisgICAgICBAZm91bmQgPSB0cnVlCisgICAgZW5kCisKKyAgICBkZWYgZmllbGQobmFtZSwgdHlwZT1uaWwpCisgICAgICBmaWVsZCA9IEZpZWxkLm5ldyhuYW1lLCB0eXBlKQorICAgICAgQGZpZWxkcyA8PCBmaWVsZAorICAgICAgcmV0dXJuIGZpZWxkCisgICAgZW5kCisKKyAgICBkZWYgZm91bmQ/CisgICAgICBAZm91bmQKKyAgICBlbmQKKworICAgIGRlZiBkdW1wX2NvbmZpZyhpbykKKyAgICAgIGlvLnB1dHMgInJieC5wbGF0Zm9ybS4je0BuYW1lfS5zaXplb2YgPSAje0BzaXplfSIKKworICAgICAgQGZpZWxkcy5lYWNoIHsgfGZpZWxkfCBpby5wdXRzIGZpZWxkLnRvX2NvbmZpZyhAbmFtZSkgfQorICAgIGVuZAorCisgICAgZGVmIGdlbmVyYXRlX2xheW91dAorICAgICAgYnVmID0gIiIKKworICAgICAgQGZpZWxkcy5lYWNoX3dpdGhfaW5kZXggZG8gfGZpZWxkLCBpfAorICAgICAgICBpZiBidWYuZW1wdHk/CisgICAgICAgICAgYnVmIDw8ICJsYXlvdXQgOiN7ZmllbGQubmFtZX0sIDoje2ZpZWxkLnR5cGV9LCAje2ZpZWxkLm9mZnNldH0iCisgICAgICAgIGVsc2UKKyAgICAgICAgICBidWYgPDwgIiAgICAgICA6I3tmaWVsZC5uYW1lfSwgOiN7ZmllbGQudHlwZX0sICN7ZmllbGQub2Zmc2V0fSIKKyAgICAgICAgZW5kCisKKyAgICAgICAgaWYgaSA8IEBmaWVsZHMubGVuZ3RoIC0gMQorICAgICAgICAgIGJ1ZiA8PCAiLFxuIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBidWYKKyAgICBlbmQKKworICAgIGRlZiBnZXRfZmllbGQobmFtZSkKKyAgICAgIEBmaWVsZHMuZmluZCB7IHxmfCBuYW1lID09IGYubmFtZSB9CisgICAgZW5kCisKKyAgICBkZWYgaW5jbHVkZShpKQorICAgICAgQGluY2x1ZGVzIDw8IGkKKyAgICBlbmQKKworICAgIGRlZiBuYW1lKG4pCisgICAgICBAc3RydWN0X25hbWUgPSBuCisgICAgZW5kCisKKyAgZW5kCisKKyAgIyMKKyAgIyBBIGZpZWxkIGluIGEgU3RydWN0LgorCisgIGNsYXNzIFN0cnVjdEdlbmVyYXRvcjo6RmllbGQKKworICAgIGF0dHJfcmVhZGVyIDpuYW1lCisgICAgYXR0cl9yZWFkZXIgOnR5cGUKKyAgICBhdHRyX3JlYWRlciA6b2Zmc2V0CisgICAgYXR0cl9hY2Nlc3NvciA6c2l6ZQorCisgICAgZGVmIGluaXRpYWxpemUobmFtZSwgdHlwZSkKKyAgICAgIEBuYW1lID0gbmFtZQorICAgICAgQHR5cGUgPSB0eXBlCisgICAgICBAb2Zmc2V0ID0gbmlsCisgICAgICBAc2l6ZSA9IG5pbAorICAgIGVuZAorCisgICAgZGVmIG9mZnNldD0obykKKyAgICAgIEBvZmZzZXQgPSBvCisgICAgZW5kCisKKyAgICBkZWYgdG9fY29uZmlnKG5hbWUpCisgICAgICBidWYgPSBbXQorICAgICAgYnVmIDw8ICJyYngucGxhdGZvcm0uI3tuYW1lfS4je0BuYW1lfS5vZmZzZXQgPSAje0BvZmZzZXR9IgorICAgICAgYnVmIDw8ICJyYngucGxhdGZvcm0uI3tuYW1lfS4je0BuYW1lfS5zaXplID0gI3tAc2l6ZX0iCisgICAgICBidWYgPDwgInJieC5wbGF0Zm9ybS4je25hbWV9LiN7QG5hbWV9LnR5cGUgPSAje0B0eXBlfSIgaWYgQHR5cGUKKyAgICAgIGJ1ZgorICAgIGVuZAorCisgIGVuZAorCitlbmQKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3Rvb2xzL3R5cGVzX2dlbmVyYXRvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS90b29scy90eXBlc19nZW5lcmF0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNGVjNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS90b29scy90eXBlc19nZW5lcmF0b3IucmIKQEAgLTAsMCArMSwxMzQgQEAKK3JlcXVpcmUgJ3RlbXBmaWxlJworCittb2R1bGUgRkZJCisKKyAgIyBAcHJpdmF0ZQorICBjbGFzcyBUeXBlc0dlbmVyYXRvcgorCisgICAgIyMKKyAgICAjIE1hcHMgZGlmZmVyZW50IEMgdHlwZXMgdG8gdGhlIEMgdHlwZSByZXByZXNlbnRhdGlvbnMgd2UgdXNlCisKKyAgICBUWVBFX01BUCA9IHsKKyAgICAgICAgICAgICAgICJjaGFyIiA9PiA6Y2hhciwKKyAgICAgICAgInNpZ25lZCBjaGFyIiA9PiA6Y2hhciwKKyAgICAgICJfX3NpZ25lZCBjaGFyIiA9PiA6Y2hhciwKKyAgICAgICJ1bnNpZ25lZCBjaGFyIiA9PiA6dWNoYXIsCisKKyAgICAgICAgICAgICAgICJzaG9ydCIgICAgID0+IDpzaG9ydCwKKyAgICAgICAgInNpZ25lZCBzaG9ydCIgICAgID0+IDpzaG9ydCwKKyAgICAgICAgInNpZ25lZCBzaG9ydCBpbnQiID0+IDpzaG9ydCwKKyAgICAgICJ1bnNpZ25lZCBzaG9ydCIgICAgID0+IDp1c2hvcnQsCisgICAgICAidW5zaWduZWQgc2hvcnQgaW50IiA9PiA6dXNob3J0LAorCisgICAgICAgICAgICAgICAiaW50IiA9PiA6aW50LAorICAgICAgICAic2lnbmVkIGludCIgPT4gOmludCwKKyAgICAgICJ1bnNpZ25lZCBpbnQiID0+IDp1aW50LAorCisgICAgICAgICAgICAgICAibG9uZyIgPT4gOmxvbmcsCisgICAgICAgICAgICAgICAibG9uZyBpbnQiID0+IDpsb25nLAorICAgICAgICAic2lnbmVkIGxvbmciID0+IDpsb25nLAorICAgICAgICAic2lnbmVkIGxvbmcgaW50IiA9PiA6bG9uZywKKyAgICAgICJ1bnNpZ25lZCBsb25nIiA9PiA6dWxvbmcsCisgICAgICAidW5zaWduZWQgbG9uZyBpbnQiID0+IDp1bG9uZywKKyAgICAgICJsb25nIHVuc2lnbmVkIGludCIgPT4gOnVsb25nLAorCisgICAgICAgICAgICAgICAibG9uZyBsb25nIiAgICAgPT4gOmxvbmdfbG9uZywKKyAgICAgICAgICAgICAgICJsb25nIGxvbmcgaW50IiA9PiA6bG9uZ19sb25nLAorICAgICAgICAic2lnbmVkIGxvbmcgbG9uZyIgICAgID0+IDpsb25nX2xvbmcsCisgICAgICAgICJzaWduZWQgbG9uZyBsb25nIGludCIgPT4gOmxvbmdfbG9uZywKKyAgICAgICJ1bnNpZ25lZCBsb25nIGxvbmciICAgICA9PiA6dWxvbmdfbG9uZywKKyAgICAgICJ1bnNpZ25lZCBsb25nIGxvbmcgaW50IiA9PiA6dWxvbmdfbG9uZywKKworICAgICAgImNoYXIgKiIgPT4gOnN0cmluZywKKyAgICAgICJ2b2lkICoiID0+IDpwb2ludGVyLAorICAgIH0KKworICAgIGRlZiBzZWxmLmdlbmVyYXRlKG9wdGlvbnMgPSB7fSkKKyAgICAgIHR5cGVkZWZzID0gbmlsCisgICAgICBUZW1wZmlsZS5vcGVuICdmZmlfdHlwZXNfZ2VuZXJhdG9yJyBkbyB8aW98CisgICAgICAgIGlvLnB1dHMgPDwtQworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmICEoZGVmaW5lZChXSU4zMikpCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisgICAgICAgIEMKKworICAgICAgICBpby5jbG9zZQorICAgICAgICBjYyA9IEVOVlsnQ0MnXSB8fCAnZ2NjJworICAgICAgICBjbWQgPSAiI3tjY30gLUUgLXggYyAje29wdGlvbnNbOmNwcGZsYWdzXX0gLURfREFSV0lOX1VTRV82NF9CSVRfSU5PREUgLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1jIgorICAgICAgICBpZiBvcHRpb25zWzppbnB1dF0KKyAgICAgICAgICB0eXBlZGVmcyA9IEZpbGUucmVhZChvcHRpb25zWzppbnB1dF0pCisgICAgICAgIGVsc2lmIG9wdGlvbnNbOnJlbW90ZV0KKyAgICAgICAgICB0eXBlZGVmcyA9IGBzc2ggI3tvcHRpb25zWzpyZW1vdGVdfSAje2NtZH0gLSA8ICN7aW8ucGF0aH1gCisgICAgICAgIGVsc2UKKyAgICAgICAgICB0eXBlZGVmcyA9IGAje2NtZH0gI3tpby5wYXRofWAKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgY29kZSA9ICIiCisKKyAgICAgIHR5cGVkZWZzLmVhY2hfbGluZSBkbyB8dHlwZXwKKyAgICAgICAgIyBXZSBvbmx5IGNhcmUgYWJvdXQgc2luZ2xlIGxpbmUgdHlwZWRlZgorICAgICAgICBuZXh0IHVubGVzcyB0eXBlID1+IC90eXBlZGVmLworICAgICAgICAjIElnbm9yZSB1bmlvbnMgb3Igc3RydWN0cworICAgICAgICBuZXh0IGlmIHR5cGUgPX4gL3VuaW9ufHN0cnVjdC8KKworICAgICAgICAjIHN0cmlwIG9mZiB0aGUgc3RhcnRpbmcgdHlwZWRlZiBhbmQgZW5kaW5nIDsKKyAgICAgICAgdHlwZS5nc3ViISgvXiguKnR5cGVkZWZccyopLywgIiIpCisgICAgICAgIHR5cGUuZ3N1YiEoL1xzKjtccyokLywgIiIpCisKKyAgICAgICAgcGFydHMgPSB0eXBlLnNwbGl0KC9ccysvKQorICAgICAgICBkZWZfdHlwZSAgID0gcGFydHMuam9pbigiICIpCisKKyAgICAgICAgIyBHQ0MgZG9lcyBtYXBwaW5nIHdpdGggX19hdHRyaWJ1dGVfXyBzdHVmLCBhbHNvIHNlZQorICAgICAgICAjIGh0dHA6Ly9oYWwuY3MuYmVya2VsZXkuZWR1L2NpbC9jaWwwMTYuaHRtbCBzZWN0aW9uIDE2LjIuNy4gIFByb2JsZW0KKyAgICAgICAgIyB3aXRoIHRoaXMgaXMgdGhhdCB0aGUgX19hdHRyaWJ1dGVfXyBzdHVmZiBjYW4gZWl0aGVyIG9jY3VyIGJlZm9yZSBvcgorICAgICAgICAjIGFmdGVyIHRoZSBuZXcgdHlwZSB0aGF0IGlzIGRlZmluZWQuLi4KKyAgICAgICAgaWYgdHlwZSA9fiAvX19hdHRyaWJ1dGVfXy8KKyAgICAgICAgICBpZiBwYXJ0cy5sYXN0ID1+IC9fX1FJX198X19ISV9ffF9fU0lfX3xfX0RJX198X193b3JkX18vCisKKyAgICAgICAgICAgICMgSW4gdGhpcyBjYXNlLCB0aGUgbmV3IHR5cGUgaXMgQkVGT1JFIF9fYXR0cmlidXRlX18gd2UgbmVlZCB0bworICAgICAgICAgICAgIyBmaW5kIHRoZSBmaW5hbF90eXBlIGFzIHRoZSB0eXBlIGJlZm9yZSB0aGUgcGFydCB0aGF0IHN0YXJ0cyB3aXRoCisgICAgICAgICAgICAjIF9fYXR0cmlidXRlX18KKyAgICAgICAgICAgIGZpbmFsX3R5cGUgPSAiIgorICAgICAgICAgICAgcGFydHMuZWFjaCBkbyB8cHwKKyAgICAgICAgICAgICAgYnJlYWsgaWYgcCA9fiAvX19hdHRyaWJ1dGVfXy8KKyAgICAgICAgICAgICAgZmluYWxfdHlwZSA9IHAKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbmFsX3R5cGUgPSBwYXJ0cy5wb3AKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIGRlZl90eXBlID0gY2FzZSB0eXBlCisgICAgICAgICAgICAgICAgICAgICB3aGVuIC9fX1FJX18vICAgdGhlbiAiY2hhciIKKyAgICAgICAgICAgICAgICAgICAgIHdoZW4gL19fSElfXy8gICB0aGVuICJzaG9ydCIKKyAgICAgICAgICAgICAgICAgICAgIHdoZW4gL19fU0lfXy8gICB0aGVuICJpbnQiCisgICAgICAgICAgICAgICAgICAgICB3aGVuIC9fX0RJX18vICAgdGhlbiAibG9uZyBsb25nIgorICAgICAgICAgICAgICAgICAgICAgd2hlbiAvX193b3JkX18vIHRoZW4gImxvbmciCisgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAiaW50IgorICAgICAgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICBkZWZfdHlwZSA9ICJ1bnNpZ25lZCAje2RlZl90eXBlfSIgaWYgdHlwZSA9fiAvdW5zaWduZWQvCisgICAgICAgIGVsc2UKKyAgICAgICAgICBmaW5hbF90eXBlID0gcGFydHMucG9wCisgICAgICAgICAgZGVmX3R5cGUgICA9IHBhcnRzLmpvaW4oIiAiKQorICAgICAgICBlbmQKKworICAgICAgICBpZiB0eXBlID0gVFlQRV9NQVBbZGVmX3R5cGVdCisgICAgICAgICAgY29kZSA8PCAicmJ4LnBsYXRmb3JtLnR5cGVkZWYuI3tmaW5hbF90eXBlfSA9ICN7dHlwZX1cbiIKKyAgICAgICAgICBUWVBFX01BUFtmaW5hbF90eXBlXSA9IFRZUEVfTUFQW2RlZl90eXBlXQorICAgICAgICBlbHNlCisgICAgICAgICAgIyBGYWxsYmFjayB0byBhbiBvcmRpbmFyeSBwb2ludGVyIGlmIHdlIGRvbid0IGtub3cgdGhlIHR5cGUKKyAgICAgICAgICBpZiBkZWZfdHlwZSA9fiAvXCovCisgICAgICAgICAgICBjb2RlIDw8ICJyYngucGxhdGZvcm0udHlwZWRlZi4je2ZpbmFsX3R5cGV9ID0gcG9pbnRlclxuIgorICAgICAgICAgICAgVFlQRV9NQVBbZmluYWxfdHlwZV0gPSA6cG9pbnRlcgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBjb2RlCisgICAgZW5kCisgIGVuZAorZW5kCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS90eXBlcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS90eXBlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGFkMzZlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3R5cGVzLnJiCkBAIC0wLDAgKzEsMTk0IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIFdheW5lIE1laXNzbmVyCisjIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBFdmFuIFBob2VuaXgKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyMKKyMgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyMgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UKKyMgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisjICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUnVieSBGRkkgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworCisjIHNlZSB7ZmlsZTpSRUFETUV9Cittb2R1bGUgRkZJCisKKyAgIyBAcGFyYW0gW1R5cGUsIERhdGFDb252ZXJ0ZXIsIFN5bWJvbF0gb2xkIHR5cGUgZGVmaW5pdGlvbiB1c2VkIGJ5IHtGRkkuZmluZF90eXBlfQorICAjIEBwYXJhbSBbU3ltYm9sXSBhZGQgbmV3IHR5cGUgZGVmaW5pdGlvbidzIG5hbWUgdG8gYWRkCisgICMgQHJldHVybiBbVHlwZV0KKyAgIyBBZGQgYSBkZWZpbml0aW9uIHR5cGUgdG8gdHlwZSBkZWZpbml0aW9ucy4KKyAgZGVmIHNlbGYudHlwZWRlZihvbGQsIGFkZCkKKyAgICBUeXBlRGVmc1thZGRdID0gc2VsZi5maW5kX3R5cGUob2xkKQorICBlbmQKKworICAjIChzZWUgRkZJLnR5cGVkZWYpCisgIGRlZiBzZWxmLmFkZF90eXBlZGVmKG9sZCwgYWRkKQorICAgIHR5cGVkZWYgb2xkLCBhZGQKKyAgZW5kCisKKworICAjIEBwYXJhbSBbVHlwZSwgRGF0YUNvbnZlcnRlciwgU3ltYm9sXSBuYW1lCisgICMgQHBhcmFtIFtIYXNoXSB0eXBlX21hcCBpZiBuaWwsIHtGRkk6OlR5cGVEZWZzfSBpcyB1c2VkCisgICMgQHJldHVybiBbVHlwZV0KKyAgIyBGaW5kIGEgdHlwZSBpbiArdHlwZV9tYXArICh7RkZJOjpUeXBlRGVmc30sIGJ5IGRlZmF1bHQpIGZyb20KKyAgIyBhIHR5cGUgb2JqZXQsIGEgdHlwZSBuYW1lIChzeW1ib2wpLiBJZiArbmFtZSsgaXMgYSB7RGF0YUNvbnZlcnRlcn0sCisgICMgYSBuZXcge1R5cGU6Ok1hcHBlZH0gaXMgY3JlYXRlZC4KKyAgZGVmIHNlbGYuZmluZF90eXBlKG5hbWUsIHR5cGVfbWFwID0gbmlsKQorICAgIGlmIG5hbWUuaXNfYT8oVHlwZSkKKyAgICAgIG5hbWUKKworICAgIGVsc2lmIHR5cGVfbWFwICYmIHR5cGVfbWFwLmhhc19rZXk/KG5hbWUpCisgICAgICB0eXBlX21hcFtuYW1lXQorCisgICAgZWxzaWYgVHlwZURlZnMuaGFzX2tleT8obmFtZSkKKyAgICAgIFR5cGVEZWZzW25hbWVdCisKKyAgICBlbHNpZiBuYW1lLmlzX2E/KERhdGFDb252ZXJ0ZXIpCisgICAgICAodHlwZV9tYXAgfHwgVHlwZURlZnMpW25hbWVdID0gVHlwZTo6TWFwcGVkLm5ldyhuYW1lKQorICAgIGVsc2UKKyAgICAgIHJhaXNlIFR5cGVFcnJvciwgInVuYWJsZSB0byByZXNvbHZlIHR5cGUgJyN7bmFtZX0nIgorICAgIGVuZAorICBlbmQKKworICAjIExpc3Qgb2YgdHlwZSBkZWZpbml0aW9ucworICBUeXBlRGVmcy5tZXJnZSEoeworICAgICAgIyBUaGUgQyB2b2lkIHR5cGU7IG9ubHkgdXNlZnVsIGZvciBmdW5jdGlvbiByZXR1cm4gdHlwZXMKKyAgICAgIDp2b2lkID0+IFR5cGU6OlZPSUQsCisKKyAgICAgICMgQyBib29sZWFuIHR5cGUKKyAgICAgIDpib29sID0+IFR5cGU6OkJPT0wsCisKKyAgICAgICMgQyBudWwtdGVybWluYXRlZCBzdHJpbmcKKyAgICAgIDpzdHJpbmcgPT4gVHlwZTo6U1RSSU5HLAorCisgICAgICAjIEMgc2lnbmVkIGNoYXIKKyAgICAgIDpjaGFyID0+IFR5cGU6OkNIQVIsCisgICAgICAjIEMgdW5zaWduZWQgY2hhcgorICAgICAgOnVjaGFyID0+IFR5cGU6OlVDSEFSLAorCisgICAgICAjIEMgc2lnbmVkIHNob3J0CisgICAgICA6c2hvcnQgPT4gVHlwZTo6U0hPUlQsCisgICAgICAjIEMgdW5zaWduZWQgc2hvcnQKKyAgICAgIDp1c2hvcnQgPT4gVHlwZTo6VVNIT1JULAorCisgICAgICAjIEMgc2lnbmVkIGludAorICAgICAgOmludCA9PiBUeXBlOjpJTlQsCisgICAgICAjIEMgdW5zaWduZWQgaW50CisgICAgICA6dWludCA9PiBUeXBlOjpVSU5ULAorCisgICAgICAjIEMgc2lnbmVkIGxvbmcKKyAgICAgIDpsb25nID0+IFR5cGU6OkxPTkcsCisKKyAgICAgICMgQyB1bnNpZ25lZCBsb25nCisgICAgICA6dWxvbmcgPT4gVHlwZTo6VUxPTkcsCisKKyAgICAgICMgQyBzaWduZWQgbG9uZyBsb25nIGludGVnZXIKKyAgICAgIDpsb25nX2xvbmcgPT4gVHlwZTo6TE9OR19MT05HLAorCisgICAgICAjIEMgdW5zaWduZWQgbG9uZyBsb25nIGludGVnZXIKKyAgICAgIDp1bG9uZ19sb25nID0+IFR5cGU6OlVMT05HX0xPTkcsCisKKyAgICAgICMgQyBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0CisgICAgICA6ZmxvYXQgPT4gVHlwZTo6RkxPQVQsCisKKyAgICAgICMgQyBkb3VibGUgcHJlY2lzaW9uIGZsb2F0CisgICAgICA6ZG91YmxlID0+IFR5cGU6OkRPVUJMRSwKKworICAgICAgIyBDIGxvbmcgZG91YmxlCisgICAgICA6bG9uZ19kb3VibGUgPT4gVHlwZTo6TE9OR0RPVUJMRSwKKworICAgICAgIyBOYXRpdmUgbWVtb3J5IGFkZHJlc3MKKyAgICAgIDpwb2ludGVyID0+IFR5cGU6OlBPSU5URVIsCisKKyAgICAgICMgOCBiaXQgc2lnbmVkIGludGVnZXIKKyAgICAgIDppbnQ4ID0+IFR5cGU6OklOVDgsCisgICAgICAjIDggYml0IHVuc2lnbmVkIGludGVnZXIKKyAgICAgIDp1aW50OCA9PiBUeXBlOjpVSU5UOCwKKworICAgICAgIyAxNiBiaXQgc2lnbmVkIGludGVnZXIKKyAgICAgIDppbnQxNiA9PiBUeXBlOjpJTlQxNiwKKyAgICAgICMgMTYgYml0IHVuc2lnbmVkIGludGVnZXIKKyAgICAgIDp1aW50MTYgPT4gVHlwZTo6VUlOVDE2LAorCisgICAgICAjIDMyIGJpdCBzaWduZWQgaW50ZWdlcgorICAgICAgOmludDMyID0+IFR5cGU6OklOVDMyLAorICAgICAgIyAzMiBiaXQgdW5zaWduZWQgaW50ZWdlcgorICAgICAgOnVpbnQzMiA9PiBUeXBlOjpVSU5UMzIsCisKKyAgICAgICMgNjQgYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICA6aW50NjQgPT4gVHlwZTo6SU5UNjQsCisgICAgICAjIDY0IGJpdCB1bnNpZ25lZCBpbnRlZ2VyCisgICAgICA6dWludDY0ID0+IFR5cGU6OlVJTlQ2NCwKKworICAgICAgOmJ1ZmZlcl9pbiA9PiBUeXBlOjpCVUZGRVJfSU4sCisgICAgICA6YnVmZmVyX291dCA9PiBUeXBlOjpCVUZGRVJfT1VULAorICAgICAgOmJ1ZmZlcl9pbm91dCA9PiBUeXBlOjpCVUZGRVJfSU5PVVQsCisKKyAgICAgICMgVXNlZCBpbiBmdW5jdGlvbiBwcm90b3R5cGVzIHRvIGluZGljYXRlIHRoZSBhcmd1bWVudHMgYXJlIHZhcmlhZGljCisgICAgICA6dmFyYXJncyA9PiBUeXBlOjpWQVJBUkdTLAorICB9KQorCisgICMgVGhpcyB3aWxsIGNvbnZlcnQgYSBwb2ludGVyIHRvIGEgUnVieSBzdHJpbmcgKGp1c3QgbGlrZSBgOnN0cmluZ2ApLCBidXQKKyAgIyBhbHNvIGFsbG93IHRvIHdvcmsgd2l0aCB0aGUgcG9pbnRlciBpdHNlbGYuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQKKyAgIyBhIFJ1Ynkgc3RyaW5nIGFscmVhZHkgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGRhdGEsIGJ1dCBhbHNvIHRoZSBwb2ludGVyCisgICMgdG8gdGhlIGRhdGEgZm9yIHlvdSB0byBkbyBzb21ldGhpbmcgd2l0aCBpdCwgbGlrZSBmcmVlaW5nIGl0LCBpbiBjYXNlIHRoZQorICAjIGxpYnJhcnkgaGFuZGVkIHRoZSBtZW1vcnkgdG8gb2ZmIHRvIHRoZSBjYWxsZXIgKFJ1YnktRkZJKS4KKyAgIworICAjIEl0J3Mge3R5cGVkZWZ9J2QgYXMgKzpzdHJwdHIrLgorICBjbGFzcyBTdHJQdHJDb252ZXJ0ZXIKKyAgICBleHRlbmQgRGF0YUNvbnZlcnRlcgorICAgIG5hdGl2ZV90eXBlIFR5cGU6OlBPSU5URVIKKworICAgICMgQHBhcmFtIFtQb2ludGVyXSB2YWwKKyAgICAjIEBwYXJhbSBjdHggbm90IHVzZWQKKyAgICAjIEByZXR1cm4gW0FycmF5KFN0cmluZywgUG9pbnRlcildCisgICAgIyBSZXR1cm5zIGEgWyBTdHJpbmcsIFBvaW50ZXIgXSB0dXBsZSBzbyB0aGUgQyBtZW1vcnkgZm9yIHRoZSBzdHJpbmcgY2FuIGJlIGZyZWVkCisgICAgZGVmIHNlbGYuZnJvbV9uYXRpdmUodmFsLCBjdHgpCisgICAgICBbIHZhbC5udWxsPyA/IG5pbCA6IHZhbC5nZXRfc3RyaW5nKDApLCB2YWwgXQorICAgIGVuZAorICBlbmQKKworICB0eXBlZGVmKFN0clB0ckNvbnZlcnRlciwgOnN0cnB0cikKKworICAjIEBwYXJhbSB0eXBlICt0eXBlKyBpcyBhbiBpbnN0YW5jZSBvZiBjbGFzcyBhY2NlcHRlZCBieSB7RkZJLmZpbmRfdHlwZX0KKyAgIyBAcmV0dXJuIFtOdW1lcmljXQorICAjIEdldCArdHlwZSsgc2l6ZSwgaW4gYnl0ZXMuCisgIGRlZiBzZWxmLnR5cGVfc2l6ZSh0eXBlKQorICAgIGZpbmRfdHlwZSh0eXBlKS5zaXplCisgIGVuZAorCisgICMgTG9hZCBhbGwgdGhlIHBsYXRmb3JtIGRlcGVuZGVudCB0eXBlcworICBiZWdpbgorICAgIEZpbGUub3BlbihGaWxlLmpvaW4oUGxhdGZvcm06OkNPTkZfRElSLCAndHlwZXMuY29uZicpLCAiciIpIGRvIHxmfAorICAgICAgcHJlZml4ID0gInJieC5wbGF0Zm9ybS50eXBlZGVmLiIKKyAgICAgIGYuZWFjaF9saW5lIHsgfGxpbmV8CisgICAgICAgIGlmIGxpbmUuaW5kZXgocHJlZml4KSA9PSAwCisgICAgICAgICAgbmV3X3R5cGUsIG9yaWdfdHlwZSA9IGxpbmUuY2hvbXAuc2xpY2UocHJlZml4Lmxlbmd0aC4uLTEpLnNwbGl0KC9ccyo9XHMqLykKKyAgICAgICAgICB0eXBlZGVmKG9yaWdfdHlwZS50b19zeW0sIG5ld190eXBlLnRvX3N5bSkKKyAgICAgICAgZW5kCisgICAgICB9CisgICAgZW5kCisgICAgdHlwZWRlZiA6cG9pbnRlciwgOmNhZGRyX3QKKyAgcmVzY3VlIEVycm5vOjpFTk9FTlQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS91bmlvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaS91bmlvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQxNGFiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3VuaW9uLnJiCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA5IEFuZHJlYSBGYXp6aSA8YW5kcmVhLmZhenppQGFsY2Fjb29wLml0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorIworIyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworIyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisjIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisjIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisjIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisKK3JlcXVpcmUgJ2ZmaS9zdHJ1Y3QnCisKK21vZHVsZSBGRkkKKworICBjbGFzcyBVbmlvbiA8IEZGSTo6U3RydWN0CisgICAgZGVmIHNlbGYuYnVpbGRlcgorICAgICAgYiA9IFN0cnVjdExheW91dEJ1aWxkZXIubmV3CisgICAgICBiLnVuaW9uID0gdHJ1ZQorICAgICAgYgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3ZhcmlhZGljLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3ZhcmlhZGljLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTQwNTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvdmFyaWFkaWMucmIKQEAgLTAsMCArMSw3OCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgV2F5bmUgTWVpc3NuZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA5IEx1YyBIZWlucmljaAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorIworIyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworIyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBSdWJ5IEZGSSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisjIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisjIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisjIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisKK21vZHVsZSBGRkkKKyAgY2xhc3MgVmFyaWFkaWNJbnZva2VyICAgIAorICAgIGRlZiBpbml0KGFyZ190eXBlcywgdHlwZV9tYXApCisgICAgICBAZml4ZWQgPSBBcnJheS5uZXcKKyAgICAgIEB0eXBlX21hcCA9IHR5cGVfbWFwCisgICAgICBhcmdfdHlwZXMuZWFjaF93aXRoX2luZGV4IGRvIHx0eXBlLCBpfAorICAgICAgICBAZml4ZWQgPDwgdHlwZSB1bmxlc3MgdHlwZSA9PSBUeXBlOjpWQVJBUkdTCisgICAgICBlbmQKKyAgICBlbmQKKworCisgICAgZGVmIGNhbGwoKmFyZ3MsICZibG9jaykKKyAgICAgIHBhcmFtX3R5cGVzID0gQXJyYXkubmV3KEBmaXhlZCkKKyAgICAgIHBhcmFtX3ZhbHVlcyA9IEFycmF5Lm5ldworICAgICAgQGZpeGVkLmVhY2hfd2l0aF9pbmRleCBkbyB8dCwgaXwKKyAgICAgICAgcGFyYW1fdmFsdWVzIDw8IGFyZ3NbaV0KKyAgICAgIGVuZAorICAgICAgaSA9IEBmaXhlZC5sZW5ndGgKKyAgICAgIHdoaWxlIGkgPCBhcmdzLmxlbmd0aAorICAgICAgICBwYXJhbV90eXBlcyA8PCBGRkkuZmluZF90eXBlKGFyZ3NbaV0sIEB0eXBlX21hcCkKKyAgICAgICAgcGFyYW1fdmFsdWVzIDw8IGFyZ3NbaSArIDFdCisgICAgICAgIGkgKz0gMgorICAgICAgZW5kCisgICAgICBpbnZva2UocGFyYW1fdHlwZXMsIHBhcmFtX3ZhbHVlcywgJmJsb2NrKQorICAgIGVuZAorCisgICAgIworICAgICMgQXR0YWNoIHRoZSBpbnZva2VyIHRvIG1vZHVsZSArbW9kKyBhcyArbW5hbWUrCisgICAgIworICAgIGRlZiBhdHRhY2gobW9kLCBtbmFtZSkKKyAgICAgIGludm9rZXIgPSBzZWxmCisgICAgICBwYXJhbXMgPSAiKmFyZ3MiCisgICAgICBjYWxsID0gImNhbGwiCisgICAgICBtb2QubW9kdWxlX2V2YWwgPDwtY29kZQorICAgICAgQEAje21uYW1lfSA9IGludm9rZXIKKyAgICAgIGRlZiBzZWxmLiN7bW5hbWV9KCN7cGFyYW1zfSkKKyAgICAgICAgQEAje21uYW1lfS4je2NhbGx9KCN7cGFyYW1zfSkKKyAgICAgIGVuZAorICAgICAgZGVmICN7bW5hbWV9KCN7cGFyYW1zfSkKKyAgICAgICAgQEAje21uYW1lfS4je2NhbGx9KCN7cGFyYW1zfSkKKyAgICAgIGVuZAorICAgICAgY29kZQorICAgICAgaW52b2tlcgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3ZlcnNpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYi9mZmkvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzkwYjcwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpL3ZlcnNpb24ucmIKQEAgLTAsMCArMSw0IEBACittb2R1bGUgRkZJCisgIFZFUlNJT04gPSAnMS45LjE4JworZW5kCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaV9jLmJ1bmRsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGliL2ZmaV9jLmJ1bmRsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MGNlYTdlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWIvZmZpX2MuYnVuZGxlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9CZW5jaG1hcmsuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9CZW5jaG1hcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWE3MzgwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0JlbmNobWFyay5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIHJldHVyblZvaWQoKSB7CisgICAgCit9CisKK3ZvaWQgcmV0dXJuVm9pZEkoaW50IGFyZykgeworICAgIAorfQoraW50IHJldHVybkludCgpIHsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJldHVybkludEkoaW50IGFyZykgeworICAgIHJldHVybiBhcmc7Cit9CisKK3R5cGVkZWYgaW50OF90IHM4OwordHlwZWRlZiB1aW50OF90IHU4OwordHlwZWRlZiBpbnQxNl90IHMxNjsKK3R5cGVkZWYgdWludDE2X3QgdTE2OwordHlwZWRlZiBpbnQzMl90IHMzMjsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiBpbnQ2NF90IHM2NDsKK3R5cGVkZWYgdWludDY0X3QgdTY0OwordHlwZWRlZiBmbG9hdCBmMzI7Cit0eXBlZGVmIGRvdWJsZSBmNjQ7Cit0eXBlZGVmIHZvaWQgdjsKK3R5cGVkZWYgY2hhciogUzsKK3R5cGVkZWYgdm9pZCogUDsKKworI2RlZmluZSBCNihSLCBUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2KSBSIGJlbmNoXyMjVDEjI1QyIyNUMyMjVDQjI1Q1IyNUNiMjXyMjUihUMSBhMSwgVDIgYTIsIFQzIGEzLCBUNCBhNCwgVDUgYTUsIFQ2IGE2KSB7fQorI2RlZmluZSBCNShSLCBUMSwgVDIsIFQzLCBUNCwgVDUpIFIgYmVuY2hfIyNUMSMjVDIjI1QzIyNUNCMjVDUjI18jI1IoVDEgYTEsIFQyIGEyLCBUMyBhMywgVDQgYTQsIFQ1IGE1KSB7fQorI2RlZmluZSBCNChSLCBUMSwgVDIsIFQzLCBUNCkgUiBiZW5jaF8jI1QxIyNUMiMjVDMjI1Q0IyNfIyNSKFQxIGExLCBUMiBhMiwgVDMgYTMsIFQ0IGE0KSB7fQorI2RlZmluZSBCMyhSLCBUMSwgVDIsIFQzKSBSIGJlbmNoXyMjVDEjI1QyIyNUMyMjXyMjUihUMSBhMSwgVDIgYTIsIFQzIGEzKSB7fQorI2RlZmluZSBCMihSLCBUMSwgVDIpIFIgYmVuY2hfIyNUMSMjVDIjI18jI1IoVDEgYTEsIFQyIGEyKSB7fQorI2RlZmluZSBCMShSLCBUMSkgUiBiZW5jaF8jI1QxIyNfIyNSKFQxIGExKSB7fQorI2RlZmluZSBCclYoVCkgQjEodiwgVCk7IEIyKHYsIFQsIFQpOyBCMyh2LCBULCBULCBUKTsgQjQodiwgVCwgVCwgVCwgVCk7IEI1KHYsIFQsIFQsIFQsIFQsIFQpOyBCNih2LCBULCBULCBULCBULCBULCBUKTsKK0JyVih1MzIpOworQnJWKHMzMik7CitCclYoczY0KTsKK0JyVih1NjQpOworQnJWKGYzMik7CitCclYoZjY0KTsKK0JyVihTKTsKK0JyVihQKTsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9Cb29sVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0Jvb2xUZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjYjZjNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9Cb29sVGVzdC5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQW1hbiBHdXB0YS4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworYm9vbAorYm9vbF9yZXR1cm5fdHJ1ZSgpCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2Jvb2xfcmV0dXJuX2ZhbHNlKCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK2Jvb2xfcmV0dXJuX3ZhbChib29sIHZhbHVlKQoreworICAgIHJldHVybiB2YWx1ZTsKK30KKworYm9vbAorYm9vbF9yZXZlcnNlX3ZhbChib29sIHZhbHVlKQoreworICAgIHJldHVybiB2YWx1ZSA/IGZhbHNlIDogdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9CdWZmZXJUZXN0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvQnVmZmVyVGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTVlYmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvQnVmZmVyVGVzdC5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisKKyNkZWZpbmUgTUVNU0VUKGJ1ZiwgdmFsdWUsIHNpemUpIGRvIHsgXAorICAgIGludCBpOyBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBidWZbaV0gPSB2YWx1ZTsgXAorfSB3aGlsZSgwKQorI2RlZmluZSBNRU1DUFkoZHN0LCBzcmMsIHNpemUpIGRvIHsgXAorICAgIGludCBpOyBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBkc3RbaV0gPSBzcmNbaV07IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBGSUxMKEpUWVBFLCBDVFlQRSkgXAordm9pZCBmaWxsIyNKVFlQRSMjQnVmZmVyKENUWVBFKiBidWYsIENUWVBFIHZhbHVlLCBpbnQgc2l6ZSkgeyBNRU1TRVQoYnVmLCB2YWx1ZSwgc2l6ZSk7IH0KKworI2RlZmluZSBDT1BZKEpUWVBFLCBDVFlQRSkgXAordm9pZCBjb3B5IyNKVFlQRSMjQnVmZmVyKENUWVBFKiBkc3QsIENUWVBFKiBzcmMsIGludCBzaXplKSB7IE1FTUNQWShkc3QsIHNyYywgc2l6ZSk7IH0KKworI2RlZmluZSBGVU5DKEpUWVBFLCBDVFlQRSkgXAorICAgIEZJTEwoSlRZUEUsIENUWVBFKTsgXAorICAgIENPUFkoSlRZUEUsIENUWVBFKQorICAgICAgICAgICAgCitGVU5DKEJ5dGUsIGNoYXIpOworRlVOQyhTaG9ydCwgc2hvcnQpOworRlVOQyhJbnQsIGludCk7CitGVU5DKExvbmcsIGxvbmcgbG9uZyk7CitGVU5DKEZsb2F0LCBmbG9hdCk7CitGVU5DKERvdWJsZSwgZG91YmxlKTsKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0Nsb3N1cmVUZXN0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvQ2xvc3VyZVRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVhYmRlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0Nsb3N1cmVUZXN0LmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2lmbmRlZiBfV0lOMzIKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworI2RlZmluZSBSKFQsIHJ0eXBlKSBydHlwZSB0ZXN0Q2xvc3VyZVZyIyNUKHJ0eXBlICgqY2xvc3VyZSkodm9pZCkpIHsgXAorICAgIHJldHVybiBjbG9zdXJlICE9IE5VTEwgPyAoKmNsb3N1cmUpKCkgOiAocnR5cGUpIDA7IFwKK30KKworI2RlZmluZSBQKFQsIHB0eXBlKSB2b2lkIHRlc3RDbG9zdXJlIyNUIyNyVih2b2lkICgqY2xvc3VyZSkocHR5cGUpLCBwdHlwZSBhMSkgeyBcCisgICAgaWYgKGNsb3N1cmUgIT0gTlVMTCkgKCpjbG9zdXJlKShhMSk7IFwKK30KKwordm9pZCB0ZXN0Q2xvc3VyZVZyVih2b2lkICgqY2xvc3VyZSkodm9pZCkpCit7CisgICAgKCpjbG9zdXJlKSgpOworfQorCitSKFosIGJvb2wpOworUihCLCBjaGFyKTsKK1IoUywgc2hvcnQpOworUihJLCBpbnQpOworUihMLCBsb25nKTsKK1IoSiwgbG9uZyBsb25nKTsKK1IoTEwsIGxvbmcgbG9uZyk7CitSKEYsIGZsb2F0KTsKK1IoRCwgZG91YmxlKTsKK1IoUCwgY29uc3Qgdm9pZCopOworCisKK1AoWiwgYm9vbCk7CitQKEIsIGNoYXIpOworUChTLCBzaG9ydCk7CitQKEksIGludCk7CitQKEwsIGxvbmcpOworUChKLCBsb25nIGxvbmcpOworUChMTCwgbG9uZyBsb25nKTsKK1AoRiwgZmxvYXQpOworUChELCBkb3VibGUpOworUChQLCBjb25zdCB2b2lkKik7CitQKFVMLCB1bnNpZ25lZCBsb25nKTsKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCitib29sIF9fc3RkY2FsbCB0ZXN0Q2xvc3VyZVN0ZGNhbGwobG9uZyAqYTEsIHZvaWQgX19zdGRjYWxsKCpjbG9zdXJlKSh2b2lkICosIGxvbmcpLCBsb25nIGEyKSB7IFwKKyAgICB2b2lkKiBzcF9wcmU7CisgICAgdm9pZCogc3BfcG9zdDsKKworICAgIGFzbSB2b2xhdGlsZSAoIiBtb3ZsICUlZXNwLCUwIiA6ICI9ZyIgKHNwX3ByZSkpOworICAgICgqY2xvc3VyZSkoYTEsIGEyKTsKKyAgICBhc20gdm9sYXRpbGUgKCIgbW92bCAlJWVzcCwlMCIgOiAiPWciIChzcF9wb3N0KSk7CisKKyAgICAvKiAlZXNwIGJlZm9yZSBwdXNoaW5nIHBhcmFtZXRlcnMgb24gdGhlIHN0YWNrIGFuZCBhZnRlciB0aGUgY2FsbCByZXR1cm5zCisgICAgICogc2hvdWxkIGJlIGVxdWFsLCBpZiBib3RoIHNpZGVzIHJlc3BlY3RzIHRoZSBzdGRjYWxsIGNvbnZlbnRpb24gKi8KKyAgICByZXR1cm4gc3BfcHJlID09IHNwX3Bvc3Q7Cit9CisjZW5kaWYKKwordm9pZCB0ZXN0T3B0aW9uYWxDbG9zdXJlQnJWKHZvaWQgKCpjbG9zdXJlKShjaGFyKSwgY2hhciBhMSkKK3sKKyAgICBpZiAoY2xvc3VyZSkgeworICAgICAgICAoKmNsb3N1cmUpKGExKTsKKyAgICB9Cit9CisKKworc3RydWN0IFRocmVhZFZyViB7CisgICAgdm9pZCAoKmNsb3N1cmUpKHZvaWQpOworICAgIGludCBjb3VudDsKK307CisKK3N0YXRpYyB2b2lkICoKK3RocmVhZFZyVih2b2lkICphcmcpCit7CisgICAgc3RydWN0IFRocmVhZFZyViogdCA9IChzdHJ1Y3QgVGhyZWFkVnJWICopIGFyZzsKKyAgICAKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdC0+Y291bnQ7IGkrKykgeworICAgICAgICAoKnQtPmNsb3N1cmUpKCk7CisgICAgfQorICAgIAorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIHRlc3RUaHJlYWRlZENsb3N1cmVWclYodm9pZCAoKmNsb3N1cmUpKHZvaWQpLCBpbnQgbikKK3sKKwlzdHJ1Y3QgVGhyZWFkVnJWIGFyZyA9IHtjbG9zdXJlLCBufTsKKyNpZm5kZWYgX1dJTjMyCisgICAgcHRocmVhZF90IHQ7CisgICAgcHRocmVhZF9jcmVhdGUoJnQsIE5VTEwsIHRocmVhZFZyViwgJmFyZyk7CisgICAgcHRocmVhZF9qb2luKHQsIE5VTEwpOworI2Vsc2UKKyAgICBIQU5ETEUgaFRocmVhZCA9IChIQU5ETEUpIF9iZWdpbnRocmVhZCgodm9pZCAoKikodm9pZCAqKSl0aHJlYWRWclYsIDAsICZhcmcpOworICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoaFRocmVhZCwgSU5GSU5JVEUpOwkKKyNlbmRpZgorfQorCitzdHJ1Y3QgczhmMzJzMzIgeworICAgIGNoYXIgczg7CisgICAgZmxvYXQgZjMyOworICAgIGludCBzMzI7Cit9OworCisvLyBUYWtlcyBhIHN0cnVjdCBhcmd1bWVudAordm9pZCB0ZXN0Q2xvc3VyZVRyVih2b2lkICgqY2xvc3VyZSkoc3RydWN0IHM4ZjMyczMyIHMpLCBzdHJ1Y3QgczhmMzJzMzIqIHMpCit7CisgICAgKCpjbG9zdXJlKSgqcyk7Cit9CisKKy8vIFJldHVybnMgYSBzdHJ1Y3QgdmFsdWUKK3N0cnVjdCBzOGYzMnMzMiB0ZXN0Q2xvc3VyZVZyVChzdHJ1Y3QgczhmMzJzMzIgKCpjbG9zdXJlKSgpKQoreworICAgIHJldHVybiAoKmNsb3N1cmUpKCk7Cit9CisKK3R5cGVkZWYgaW50ICgqcmV0dXJuVHlwZUNsb3N1cmVfdCkoaW50KSA7Cit0eXBlZGVmIHJldHVyblR5cGVDbG9zdXJlX3QgKCpsb29rdXBDbG9zdXJlX3QpKCk7CisKK2ludCB0ZXN0UmV0dXJuc0Nsb3N1cmUobG9va3VwQ2xvc3VyZV90IGxvb2t1cCwgaW50IHZhbCkKK3sKKyAgICByZXR1cm5UeXBlQ2xvc3VyZV90IGZ1bmMgPSBsb29rdXAgPyAoKmxvb2t1cCkoKSA6IE5VTEw7CisgICAgcmV0dXJuIGZ1bmMgPyAoKmZ1bmMpKHZhbCkgOiAwOworfQorCitzdGF0aWMgaW50IG11bHRpcGx5QnlUd28oaW50IHZhbHVlKQoreworICAgIHJldHVybiB2YWx1ZSAqIDI7Cit9CisKK3JldHVyblR5cGVDbG9zdXJlX3QgdGVzdFJldHVybnNGdW5jdGlvblBvaW50ZXIoKQoreworICAgIHJldHVybiBtdWx0aXBseUJ5VHdvOworfQorCit0eXBlZGVmIGludCAoKmFyZ3VtZW50Q2xvc3VyZV90KShpbnQpOwordHlwZWRlZiBpbnQgKCp3aXRoQXJndW1lbnRDbG9zdXJlX3QpKGFyZ3VtZW50Q2xvc3VyZV90LCBpbnQpOworCitpbnQgdGVzdEFyZ3VtZW50Q2xvc3VyZSh3aXRoQXJndW1lbnRDbG9zdXJlX3QgY2xvc3VyZV93aXRoLCBhcmd1bWVudENsb3N1cmVfdCBjbG9zdXJlX2FyZywgaW50IHZhbCkKK3sKKyAgICByZXR1cm4gKCpjbG9zdXJlX3dpdGgpKGNsb3N1cmVfYXJnLCB2YWwpOworfQorCisKKy8vCisvLyBUaGVzZSBtYWNyb3MgcHJvZHVjZSBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CisvLyB0ZXN0Q2xvc3VyZUJJclYodm9pZCAoKmNsb3N1cmUpKGNoYXIsIGludCksIGNoYXIgYTEsIGludCBhMikge30KKy8vCisjZGVmaW5lIEMyXyhKMSwgSjIsIE4xLCBOMikgXAordm9pZCB0ZXN0Q2xvc3VyZSMjSjEjI0oyIyNyVih2b2lkICgqY2xvc3VyZSkoTjEsIE4yKSwgTjEgYTEsIE4yIGEyKSBcCit7IFwKKyAgICBpZiAoY2xvc3VyZSAhPSBOVUxMKSAoKmNsb3N1cmUpKGExLCBhMik7IFwKK30KKworI2RlZmluZSBDMihKLCBOKSBcCisgICAgQzJfKEIsIEosIGNoYXIsIE4pIFwKKyAgICBDMl8oUywgSiwgc2hvcnQsIE4pIFwKKyAgICBDMl8oSSwgSiwgaW50LCBOKSBcCisgICAgQzJfKExMLCBKLCBsb25nIGxvbmcsIE4pIFwKKyAgICBDMl8oRiwgSiwgZmxvYXQsIE4pIFwKKyAgICBDMl8oRCwgSiwgZG91YmxlLCBOKSBcCisKKworQzIoQiwgY2hhcik7CitDMihTLCBzaG9ydCk7CitDMihJLCBpbnQpOworQzIoTEwsIGxvbmcgbG9uZyk7CitDMihGLCBmbG9hdCk7CitDMihELCBkb3VibGUpOworCisjZGVmaW5lIEMzXyhKMSwgSjIsIEozLCBOMSwgTjIsIE4zKSBcCit2b2lkIHRlc3RDbG9zdXJlIyNKMSMjSjIjI0ozIyNyVih2b2lkICgqY2xvc3VyZSkoTjEsIE4yLCBOMyksIE4xIGExLCBOMiBhMiwgTjMgYTMpIFwKK3sgXAorICAgICgqY2xvc3VyZSkoYTEsIGEyLCBhMyk7IFwKK30KKworCisjZGVmaW5lIEMzKEosIE4pIFwKKyAgICBDM18oQiwgSiwgQiwgY2hhciwgTiwgY2hhcikgXAorICAgIEMzXyhTLCBKLCBTLCBzaG9ydCwgTiwgc2hvcnQpIFwKKyAgICBDM18oSSwgSiwgSSwgaW50LCBOLCBpbnQpIFwKKyAgICBDM18oTEwsIEosIExMLCBsb25nIGxvbmcsIE4sIGxvbmcgbG9uZykgXAorICAgIEMzXyhGLCBKLCBGLCBmbG9hdCwgTiwgZmxvYXQpIFwKKyAgICBDM18oRCwgSiwgRCwgZG91YmxlLCBOLCBkb3VibGUpIFwKKworQzMoQiwgY2hhcik7CitDMyhTLCBzaG9ydCk7CitDMyhJLCBpbnQpOworQzMoTEwsIGxvbmcgbG9uZyk7CitDMyhGLCBmbG9hdCk7CitDMyhELCBkb3VibGUpOworQzNfKEIsIFMsIEksIGNoYXIsIHNob3J0LCBpbnQpOworQzNfKEIsIFMsIExMLCBjaGFyLCBzaG9ydCwgbG9uZyBsb25nKTsKK0MzXyhMTCwgUywgQiwgbG9uZyBsb25nLCBzaG9ydCwgY2hhcik7CitDM18oTEwsIEIsIFMsIGxvbmcgbG9uZywgY2hhciwgc2hvcnQpOworCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9FbnVtVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0VudW1UZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmOGQyMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9FbnVtVGVzdC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCitpbnQgdGVzdF91bnRhZ2dlZF9lbnVtKGludCB2YWwpIHsKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQgdGVzdF91bnRhZ2dlZF90eXBlZGVmX2VudW0oaW50IHZhbCkgeworICAgIHJldHVybiB2YWw7Cit9CisKK3VpbnQ4X3QgdGVzdF91bnRhZ2dlZF9ub25pbnRfZW51bSh1aW50OF90IHZhbCkgeworICAgIHJldHVybiB2YWw7Cit9CisKK3VpbnQxNl90IHRlc3RfdGFnZ2VkX25vbmludF9lbnVtMSh1aW50MTZfdCB2YWwpIHsKKyAgICByZXR1cm4gdmFsOworfQorCit1aW50MzJfdCB0ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTIodWludDMyX3QgdmFsKSB7CisgICAgcmV0dXJuIHZhbDsKK30KKwordWludDY0X3QgdGVzdF90YWdnZWRfbm9uaW50X2VudW0zKHVpbnQ2NF90IHZhbCkgeworICAgIHJldHVybiB2YWw7Cit9CisKK3R5cGVkZWYgZW51bSB7YzEsIGMyLCBjMywgYzR9IGVudW1fdHlwZTE7CitlbnVtX3R5cGUxIHRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTEoZW51bV90eXBlMSB2YWwpIHsKKyAgICByZXR1cm4gdmFsOworfQorCit0eXBlZGVmIGVudW0ge2M1ID0gNDIsIGM2LCBjNywgYzh9IGVudW1fdHlwZTI7CitlbnVtX3R5cGUyIHRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTIoZW51bV90eXBlMiB2YWwpIHsKKyAgICByZXR1cm4gdmFsOworfQorCit0eXBlZGVmIGVudW0ge2M5ID0gNDIsIGMxMCwgYzExID0gNDI0MiwgYzEyfSBlbnVtX3R5cGUzOworZW51bV90eXBlMyB0ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0zKGVudW1fdHlwZTMgdmFsKSB7CisgICAgcmV0dXJuIHZhbDsKK30KKwordHlwZWRlZiBlbnVtIHtjMTMgPSA0MiwgYzE0ID0gNDI0MiwgYzE1ID0gNDI0MjQyLCBjMTYgPSA0MjQyNDI0Mn0gZW51bV90eXBlNDsKK2VudW1fdHlwZTQgdGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtNChlbnVtX3R5cGU0IHZhbCkgeworICAgIHJldHVybiB2YWw7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9GdW5jdGlvblRlc3QuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9GdW5jdGlvblRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RlNWYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0Z1bmN0aW9uVGVzdC5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2RlZmluZSBzbGVlcCh4KSBTbGVlcCgoeCkqMTAwMCkKKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCitpbnQgdGVzdEFkZChpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgKyBiOworfTsKKworaW50IHRlc3RGdW5jdGlvbkFkZChpbnQgYSwgaW50IGIsIGludCAoKmYpKGludCwgaW50KSkKK3sKKyAgICByZXR1cm4gZihhLCBiKTsKK307CisKK3ZvaWQgdGVzdEJsb2NraW5nKGludCBzZWNvbmRzKSB7CisgICAgc2xlZXAoc2Vjb25kcyk7Cit9OworCitzdHJ1Y3QgYXN5bmNfZGF0YSB7CisgICAgdm9pZCAoKmZuKShpbnQpOworICAgIGludCB2YWx1ZTsKK307CisKK3N0YXRpYyB2b2lkKiBhc3luY1RocmVhZENhbGwodm9pZCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgYXN5bmNfZGF0YSogZCA9IChzdHJ1Y3QgYXN5bmNfZGF0YSAqKSBkYXRhOworICAgIGlmIChkICE9IE5VTEwgJiYgZC0+Zm4gIT0gTlVMTCkgeworICAgICAgICAoKmQtPmZuKShkLT52YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgdGVzdEFzeW5jQ2FsbGJhY2sodm9pZCAoKmZuKShpbnQpLCBpbnQgdmFsdWUpCit7CisjaWZuZGVmIF9XSU4zMgorICAgIHB0aHJlYWRfdCB0OworICAgIHN0cnVjdCBhc3luY19kYXRhIGQ7CisgICAgZC5mbiA9IGZuOworICAgIGQudmFsdWUgPSB2YWx1ZTsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmdCwgTlVMTCwgYXN5bmNUaHJlYWRDYWxsLCAmZCk7CisgICAgcHRocmVhZF9qb2luKHQsIE5VTEwpOworI2Vsc2UKKyAgICAoKmZuKSh2YWx1ZSk7CisjZW5kaWYKK30gCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjY0KQorc3RydWN0IFN0cnVjdFVDRFAgeworICB1bnNpZ25lZCBjaGFyIGExOworICBkb3VibGUgYTI7CisgIHZvaWQgKmEzOworfTsKKwordm9pZCBfX3N0ZGNhbGwgdGVzdFN0ZGNhbGxNYW55UGFyYW1zKGxvbmcgKmExLCBjaGFyIGEyLCBzaG9ydCBpbnQgYTMsIGludCBhNCwgX19pbnQ2NCBhNSwKKyAgICAgICAgICAgIHN0cnVjdCBTdHJ1Y3RVQ0RQIGE2LCBzdHJ1Y3QgU3RydWN0VUNEUCAqYTcsIGZsb2F0IGE4LCBkb3VibGUgYTkpIHsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0dOVW1ha2VmaWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0dOVW1ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YmE5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvR05VbWFrZWZpbGUKQEAgLTAsMCArMSwxNDkgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorCitpZmVxICgkKE9TKSwpCisgIEJVSUxEX09TIDo9ICQoc2hlbGwgdW5hbWUgLXMgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJykKKyAgT1MgOj0gJChCVUlMRF9PUykKK2VuZGlmCisKK2lmZXEgKCQoQ1BVKSwpCisgIENQVSA6PSAkKHNoZWxsIHVuYW1lIC1tIHwgc2VkIC1lICdzL2lbMzQ1Njc4XTg2L2kzODYvJykKK2VuZGlmCisKK1BMQVRGT1JNID0gJChDUFUpLSQoT1MpCisKK2lmZXEgKCQoT1MpLCBzdW5vcykKKyAgT1MgPSBzb2xhcmlzCitlbmRpZgorCitTUkNfRElSID0gbGlidGVzdAorQlVJTERfRElSID89IGJ1aWxkCitURVNUX0JVSUxEX0RJUiA9ICQoQlVJTERfRElSKS9saWJ0ZXN0CisjIFNldCBkZWZhdWx0cyB0byB1bml4IChsaW51eC9zb2xhcmlzL2JzZCkKK1BSRUZJWCA9IGxpYgorTElCRVhUID89IHNvCitMSUJOQU1FID0gJChQUkVGSVgpdGVzdC4kKExJQkVYVCkKKworZXhwb3J0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD0xMC40CisKK0NDQUNIRSA6PSAkKHN0cmlwICQocmVhbHBhdGggJChzaGVsbCB3aGljaCBjY2FjaGUgMj4gL2Rldi9udWxsKSkpCisKK1RFU1RfU1JDUyA9ICQod2lsZGNhcmQgJChTUkNfRElSKS8qLmMpCitURVNUX09CSlMgOj0gJChwYXRzdWJzdCAkKFNSQ19ESVIpLyUuYywgJChURVNUX0JVSUxEX0RJUikvJS5vLCAkKFRFU1RfU1JDUykpCisKKyMKKyMgQ29tcGlsZXIvbGlua2VyIGZsYWdzIGZyb206CisjICAgaHR0cDovL3dlYmxvZ3MuamF2YS5uZXQvYmxvZy9rZWxseW9oYWlyL2FyY2hpdmUvMjAwNi8wMS9jb21waWxhdGlvbl9vZl8xLmh0bWwKK0pGTEFHUyA9IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nCitPRkxBR1MgPSAtTzIgJChKRkxBR1MpCitXRkxBR1MgPSAtVyAtV2FsbCAtV25vLXVudXNlZCAtV25vLXBhcmVudGhlc2VzCitQSUNGTEFHUyA9IC1mUElDCitTT0ZMQUdTID0gLXNoYXJlZAorTERGTEFHUyArPSAkKFNPRkxBR1MpCisKK0lGTEFHUyA9IC1JIiQoQlVJTERfRElSKSIKK0NGTEFHUyA9ICQoT0ZMQUdTKSAkKFdGTEFHUykgJChJRkxBR1MpICQoUElDRkxBR1MpIC1EX1JFRU5UUkFOVAorCitpZm5lcSAoJChzdHJpcCAkKGZpbmRzdHJpbmcgJChPUyksIHdpbjMyLCBtaW5ndywgY3lnd2luKSksKQorICAjIEZvciBjeWd3aW4gPT4gd2luMzItbmF0aXZlIGJ1aWxkcywgc3RyaXAgb3V0IGN5Z3dpbiBkZXBzCisgIGlmbmVxICgkKGZpbmRzdHJpbmcgY3lnd2luLCAkKEJVSUxEX09TKSksKQorICAgIENDICs9IC1tbm8tY3lnd2luIC1td2luMzIKKyAgICBMREZMQUdTICs9IC1tbm8tY3lnd2luIC1XbCwtLWFkZC1zdGRjYWxsLWFsaWFzCisgIGVuZGlmCisgIFBJQ0ZMQUdTPQorICBMSUJFWFQ9ZGxsCisgIENDID0gZ2NjCitlbmRpZgorCitpZmVxICgkKE9TKSwgZGFyd2luKQorICBpZm5lcSAoJChmaW5kc3RyaW5nICQoQ1BVKSxwcGMpLCkKKyAgICBBUkNIRkxBR1MgKz0gLWFyY2ggcHBjCisgIGVuZGlmCisgIGlmbmVxICgkKGZpbmRzdHJpbmcgJChDUFUpLGkzODYgeDg2XzY0KSwpCisgICAgQVJDSEZMQUdTICs9IC1hcmNoIGkzODYgLWFyY2ggeDg2XzY0CisgIGVuZGlmCisgIENGTEFHUyArPSAkKEFSQ0hGTEFHUykgLURUQVJHRVRfUlRfTUFDX0NGTT0wCisgIENGTEFHUyArPSAtZm5vLWNvbW1vbgorICBMREZMQUdTID0gJChBUkNIRkxBR1MpIC1keW5hbWljbGliCisgICMgbGluayBhZ2FpbnN0IHRoZSB1bml2ZXJzYWwgbGlicmFyaWVzIG9uIHBwYyBtYWNoaW5lcworICBMREZMQUdTICs9IC1MJChNQUNTREspL3Vzci9saWIKKyAgTElCRVhUID0gZHlsaWIKKyAgRkZJX0NGTEFHUyArPSAtaXN5c3Jvb3QgJChNQUNTREspCisgIFBJQ0ZMQUdTID0KKyAgU09GTEFHUyA9CitlbmRpZgorCitpZmVxICgkKE9TKSwgbGludXgpCisgIFNPRkxBR1MgKz0gLVdsLC1zb25hbWUsJChMSUJOQU1FKQorZW5kaWYKKworaWZlcSAoJChPUyksIHNvbGFyaXMpCisgIENDID0gL3Vzci9zZncvYmluL2djYyAtc3RkPWM5OQorICBMRCA9IC91c3IvY2NzL2Jpbi9sZAorICBTT0ZMQUdTID0gLXNoYXJlZCAtc3RhdGljLWxpYmdjYyAKK2VuZGlmCisKK2lmZXEgKCQoT1MpLCBhaXgpCisgIExJQkVYVCA9IGEKKyAgU09GTEFHUyA9IC1zaGFyZWQgLXN0YXRpYy1saWJnY2MKKyAgUElDRkxBR1MgKz0gLXB0aHJlYWQKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgYnNkLCAkKE9TKSksKQorICBTT0ZMQUdTID0gLXNoYXJlZCAtc3RhdGljLWxpYmdjYworICBDRkxBR1MgKz0gLXB0aHJlYWQKKyAgTERGTEFHUyArPSAtcHRocmVhZAorZW5kaWYKKworaWZlcSAoJChDUFUpLCBpMzg2KQorICBNT0RFTCA9IDMyCitlbmRpZgorCitpZmVxICgkKENQVSksIHNwYXJjdjkpCisgIE1PREVMID0gNjQKK2VuZGlmCisKK2lmZXEgKCQoQ1BVKSwgYW1kNjQpCisgIE1PREVMID0gNjQKK2VuZGlmCisKK2lmZXEgKCQoQ1BVKSwgeDg2XzY0KQorICBNT0RFTCA9IDY0CitlbmRpZgorCitpZmVxICgkKENQVSksIHBwYzY0KQorICBNT0RFTCA9IDY0CitlbmRpZgorCitpZmVxICgkKENQVSksIHBvd2VycGM2NCkKKyAgTU9ERUwgPSA2NAorZW5kaWYKKworTU9ERUxGTEFHID0KK2lmbmVxICgkKE1PREVMKSwpCisgIE1PREVMRkxBRyA9IC1tJChNT0RFTCkKK2VuZGlmCisKKyMgT24gcGxhdGZvcm1zIChsaW51eCwgc29sYXJpcykgdGhhdCBzdXBwb3J0IGJvdGggMzJiaXQgYW5kIDY0Yml0LCBmb3JjZSBidWlsZGluZyBmb3Igb25lIG9yIHRoZSBvdGhlcgoraWZuZXEgKCQob3IgJChmaW5kc3RyaW5nIGxpbnV4LCAkKE9TKSksICQoZmluZHN0cmluZyBzb2xhcmlzLCAkKE9TKSkpLCkKKyAgIyBDaGFuZ2UgdGhlIENDL0xEIGluc3RlYWQgb2YgQ0ZMQUdTL0xERkxBR1MsIGluY2FzZSBvdGhlciB0aGluZ3MgaW4gdGhlIGZsYWdzCisgICMgbWFrZXMgdGhlIGxpYmZmaSBidWlsZCBjaG9rZQorICBDQyArPSAkKE1PREVMRkxBRykKKyAgTEQgKz0gJChNT0RFTEZMQUcpCitlbmRpZgorCitMSUJURVNUID0gJChCVUlMRF9ESVIpLyQoTElCTkFNRSkKKworYWxsOgkkKExJQlRFU1QpCisKKyQoVEVTVF9CVUlMRF9ESVIpLyUubyA6ICQoU1JDX0RJUikvJS5jCisJQG1rZGlyIC1wICQoQEQpCisJJChDQ0FDSEUpICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAorCiskKExJQlRFU1QpOiAgJChURVNUX09CSlMpCisJJChDQykgLW8gJEAgJChMREZMQUdTKSAkKFRFU1RfT0JKUykgLWxtCisKK2NsZWFuOjoKKwkjIG5vdGhpbmcgdG8gZG8gLSBhbnQgd2lsbCBkZWxldGUgdGhlIGJ1aWxkIGRpcgorCitkZWJ1Zzo6CisJQGVjaG8gIlNSQ1M9JChURVNUX1NSQ1MpIgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0dsb2JhbFZhcmlhYmxlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvR2xvYmFsVmFyaWFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWMxMmEyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0dsb2JhbFZhcmlhYmxlLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXYXluZSBNZWlzc25lci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBpbnQ4X3Qgczg7Cit0eXBlZGVmIHVpbnQ4X3QgdTg7Cit0eXBlZGVmIGludDE2X3QgczE2OwordHlwZWRlZiB1aW50MTZfdCB1MTY7Cit0eXBlZGVmIGludDMyX3QgczMyOwordHlwZWRlZiB1aW50MzJfdCB1MzI7Cit0eXBlZGVmIGludDY0X3QgczY0OwordHlwZWRlZiB1aW50NjRfdCB1NjQ7Cit0eXBlZGVmIHNpZ25lZCBsb25nIHNMOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVMOwordHlwZWRlZiBmbG9hdCBmMzI7Cit0eXBlZGVmIGRvdWJsZSBmNjQ7CisjaWYgIWRlZmluZWQoX19PcGVuQlNEX18pCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmc7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCogcG9pbnRlcjsKK3R5cGVkZWYgdm9pZCogUDsKKworI2RlZmluZSBHVkFSKFQpIFwKKyAgICBleHRlcm4gVCBndmFyXyMjVDsgXAorICAgIFQgZ3Zhcl8jI1QgPSAoVCkgLTE7IFwKKyAgICBUIGd2YXJfIyNUIyNfZ2V0KCkgeyByZXR1cm4gZ3Zhcl8jI1Q7IH07IFwKKyAgICB2b2lkIGd2YXJfIyNUIyNfc2V0KFQgdikgeyBndmFyXyMjVCA9IHY7IH0KKworR1ZBUihzOCk7CitHVkFSKHU4KTsKK0dWQVIoczE2KTsKK0dWQVIodTE2KTsKK0dWQVIoczMyKTsKK0dWQVIodTMyKTsKK0dWQVIoczY0KTsKK0dWQVIodTY0KTsKK0dWQVIobG9uZyk7CitHVkFSKHVsb25nKTsKK0dWQVIocG9pbnRlcik7CisKK3N0cnVjdCBnc3RydWN0IHsKKyAgICBsb25nIGRhdGE7Cit9OworCitzdHJ1Y3QgZ3N0cnVjdCBndmFyX2dzdHJ1Y3QgPSB7IC0xIH07CisKK3N0cnVjdCBnc3RydWN0KgorZ3Zhcl9nc3RydWN0X2dldCh2b2lkKQoreworICAgIHJldHVybiAmZ3Zhcl9nc3RydWN0OworfQorCit2b2lkCitndmFyX2dzdHJ1Y3Rfc2V0KGNvbnN0IHN0cnVjdCBnc3RydWN0KiB2YWwpCit7IAorICAgIGd2YXJfZ3N0cnVjdCA9ICp2YWw7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvTGFzdEVycm9yVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0xhc3RFcnJvclRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmNlNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L0xhc3RFcnJvclRlc3QuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdheW5lIE1laXNzbmVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisgKi8KKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCitpbnQgc2V0TGFzdEVycm9yKGludCBlcnJvcikgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyAgICBTZXRMYXN0RXJyb3IoZXJyb3IpOworI2Vsc2UKKyAgICBlcnJubyA9IGVycm9yOworI2VuZGlmCisgICAgcmV0dXJuIC0xOworfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvTnVtYmVyVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L051bWJlclRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmEyNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L051bWJlclRlc3QuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXYXluZSBNZWlzc25lci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgZGVmaW5lZChfX3NwYXJjKSAmJiBkZWZpbmVkKF9fc3VuX18pCisgICAgI2RlZmluZSBmaXhfbWVtX2FjY2VzcyBfX2FzbSgidGEgNiIpCisjZWxzZQorICAgICNkZWZpbmUgZml4X21lbV9hY2Nlc3MKKyNlbmRpZgorCit0eXBlZGVmIGludDhfdCBzODsKK3R5cGVkZWYgdWludDhfdCB1ODsKK3R5cGVkZWYgaW50MTZfdCBzMTY7Cit0eXBlZGVmIHVpbnQxNl90IHUxNjsKK3R5cGVkZWYgaW50MzJfdCBzMzI7Cit0eXBlZGVmIHVpbnQzMl90IHUzMjsKK3R5cGVkZWYgaW50NjRfdCBzNjQ7Cit0eXBlZGVmIHVpbnQ2NF90IHU2NDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgc0w7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdUw7Cit0eXBlZGVmIGZsb2F0IGYzMjsKK3R5cGVkZWYgZG91YmxlIGY2NDsKK3R5cGVkZWYgbG9uZyBkb3VibGUgZjEyODsKKyNpZiAhZGVmaW5lZChfX09wZW5CU0RfXykKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bG9uZzsKKyNlbmRpZgorCisjZGVmaW5lIEFERChUKSBUIGFkZF8jI1QoVCBhcmcxLCBUIGFyZzIpIHsgcmV0dXJuIGFyZzEgKyBhcmcyOyB9CisjZGVmaW5lIFNVQihUKSBUIHN1Yl8jI1QoVCBhcmcxLCBUIGFyZzIpIHsgcmV0dXJuIGFyZzEgLSBhcmcyOyB9CisjZGVmaW5lIE1VTChUKSBUIG11bF8jI1QoVCBhcmcxLCBUIGFyZzIpIHsgcmV0dXJuIGFyZzEgKiBhcmcyOyB9CisjZGVmaW5lIERJVihUKSBUIGRpdl8jI1QoVCBhcmcxLCBUIGFyZzIpIHsgcmV0dXJuIGFyZzEgLyBhcmcyOyB9CisjZGVmaW5lIFJFVChUKSBUIHJldF8jI1QoVCBhcmcxKSB7IHJldHVybiBhcmcxOyB9CisjZGVmaW5lIFNFVChUKSBzdGF0aWMgVCBUIyNfO3ZvaWQgc2V0XyMjVChUIGFyZzEpIHsgVCMjXyA9IGFyZzE7IH0KKyNkZWZpbmUgR0VUKFQpIFQgZ2V0XyMjVCgpIHsgcmV0dXJuIFQjI187IH0KK3R5cGVkZWYgY2hhciogcHRyOworI2RlZmluZSBURVNUKFQpIEFERChUKSBTVUIoVCkgTVVMKFQpIERJVihUKSBSRVQoVCkgU0VUKFQpIEdFVChUKQorVEVTVChzOCk7CitURVNUKHU4KTsKK1RFU1QoczE2KTsKK1RFU1QodTE2KTsKK1RFU1QoczMyKTsKK1RFU1QodTMyKTsKK1RFU1QoczY0KTsKK1RFU1QodTY0KTsKK1RFU1QoZmxvYXQpOworVEVTVChkb3VibGUpOworVEVTVChsb25nKTsKK1RFU1QodWxvbmcpOworVEVTVChmMTI4KTsKKworI2RlZmluZSBBREQyKFIsIFQxLCBUMikgUiBhZGRfIyNUMSMjVDIjI18jI1IoVDEgYXJnMSwgVDIgYXJnMikgeyByZXR1cm4gYXJnMSArIGFyZzI7IH0KKyNkZWZpbmUgU1VCMihSLCBUMSwgVDIpIFIgc3ViXyMjVDEjI1QyIyNfIyNSKFQxIGFyZzEsIFQyIGFyZzIpIHsgcmV0dXJuIGFyZzEgLSBhcmcyOyB9CisjZGVmaW5lIE1VTDIoUiwgVDEsIFQyKSBSIG11bF8jI1QxIyNUMiMjXyMjUihUMSBhcmcxLCBUMiBhcmcyKSB7IHJldHVybiBhcmcxICogYXJnMjsgfQorI2RlZmluZSBESVYyKFIsIFQxLCBUMikgUiBkaXZfIyNUMSMjVDIjI18jI1IoVDEgYXJnMSwgVDIgYXJnMikgeyByZXR1cm4gYXJnMSAvIGFyZzI7IH0KKworI2RlZmluZSBUMl9fKFIsIFQxLCBUMikgQUREMihSLCBUMSwgVDIpIFNVQjIoUiwgVDEsIFQyKSBNVUwyKFIsIFQxLCBUMikgRElWMihSLCBUMSwgVDIpCisjZGVmaW5lIFQyXyhSLCBUMSkgXAorICAgIFQyX18oUiwgVDEsIHM4KSBUMl9fKFIsIFQxLCB1OCkgXAorICAgIFQyX18oUiwgVDEsIHMxNikgVDJfXyhSLCBUMSwgdTE2KSBcCisgICAgVDJfXyhSLCBUMSwgczMyKSBUMl9fKFIsIFQxLCB1MzIpIFwKKyAgICBUMl9fKFIsIFQxLCBzTCkgVDJfXyhSLCBUMSwgdUwpIFwKKyAgICBUMl9fKFIsIFQxLCBzNjQpIFQyX18oUiwgVDEsIHU2NCkgXAorCisjZGVmaW5lIFRFU1QyKFIpIFwKKyAgICBUMl8oUiwgczgpIFQyXyhSLCB1OCkgVDJfKFIsIHMxNikgVDJfKFIsIHUxNikgVDJfKFIsIHMzMikgVDJfKFIsIHUzMikgXAorICAgIFQyXyhSLCBzTCkgVDJfKFIsIHVMKSBUMl8oUiwgczY0KSBUMl8oUiwgdTY0KQorCisjaWZkZWYgbm90eWV0CitURVNUMihzMzIpCitURVNUMih1MzIpCitURVNUMihzNjQpCitURVNUMih1NjQpCisjZW5kaWYKKworI2RlZmluZSBBREQzKFIsIFQxLCBUMiwgVDMpIFIgYWRkXyMjVDEjI1QyIyNUMyMjXyMjUihUMSBhcmcxLCBUMiBhcmcyLCBUMyBhcmczKSB7IHJldHVybiBhcmcxICsgYXJnMiArIGFyZzM7IH0KKyNkZWZpbmUgcGFja19mMzIoYnVmLCB2KSBkbyB7IGZsb2F0IGYgPSB2OyBtZW1jcHkoKGJ1ZiksICZmLCBzaXplb2YoZikpOyB9IHdoaWxlKDApCisjZGVmaW5lIHBhY2tfZjY0KGJ1ZiwgdikgZG8geyBkb3VibGUgZiA9IHY7IG1lbWNweSgoYnVmKSwgJmYsIHNpemVvZihmKSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgcGFja19pbnQoYnVmLCB2KSBkbyB7ICooYnVmKSA9IHY7IH0gd2hpbGUoMCkKKyNkZWZpbmUgcGFja19zOCBwYWNrX2ludAorI2RlZmluZSBwYWNrX3U4IHBhY2tfaW50CisjZGVmaW5lIHBhY2tfczE2IHBhY2tfaW50CisjZGVmaW5lIHBhY2tfdTE2IHBhY2tfaW50CisjZGVmaW5lIHBhY2tfczMyIHBhY2tfaW50CisjZGVmaW5lIHBhY2tfdTMyIHBhY2tfaW50CisjZGVmaW5lIHBhY2tfczY0IHBhY2tfaW50CisjZGVmaW5lIHBhY2tfdTY0IHBhY2tfaW50CisjZGVmaW5lIHBhY2tfc0wgcGFja19pbnQKKyNkZWZpbmUgcGFja191TCBwYWNrX2ludAorCisjZGVmaW5lIFBBQ0szKFIsIFQxLCBUMiwgVDMpIHZvaWQgcGFja18jI1QxIyNUMiMjVDMjI18jI1IoVDEgYXJnMSwgVDIgYXJnMiwgVDMgYXJnMywgUiogcikgeyBcCisgICAgZml4X21lbV9hY2Nlc3M7IFwKKyAgICBwYWNrXyMjVDEoJnJbMF0sIGFyZzEpOyBcCisgICAgcGFja18jI1QyKCZyWzFdLCBhcmcyKTsgXAorICAgIHBhY2tfIyNUMygmclsyXSwgYXJnMyk7IFwKK30KKworI2RlZmluZSBUM19fXyhSLCBUMSwgVDIsIFQzKSBQQUNLMyhSLCBUMSwgVDIsIFQzKSAvKiBTVUIyKFIsIFQxLCBUMikgTVVMMihSLCBUMSwgVDIpIERJVjIoUiwgVDEsIFQyKSAqLworI2RlZmluZSBUM19fKFIsIFQxLCBUMikgXAorICAgIFQzX19fKFIsIFQxLCBUMiwgczgpIFQzX19fKFIsIFQxLCBUMiwgdTgpIFwKKyAgICBUM19fXyhSLCBUMSwgVDIsIHMxNikgVDNfX18oUiwgVDEsIFQyLCB1MTYpIFwKKyAgICBUM19fXyhSLCBUMSwgVDIsIHMzMikgVDNfX18oUiwgVDEsIFQyLCB1MzIpIFwKKyAgICBUM19fXyhSLCBUMSwgVDIsIHNMKSBUM19fXyhSLCBUMSwgVDIsIHVMKSBcCisgICAgVDNfX18oUiwgVDEsIFQyLCBzNjQpIFQzX19fKFIsIFQxLCBUMiwgdTY0KSBcCisgICAgVDNfX18oUiwgVDEsIFQyLCBmMzIpIFQzX19fKFIsIFQxLCBUMiwgZjY0KSBcCisKKyNkZWZpbmUgVDNfKFIsIFQxKSBcCisgICAgVDNfXyhSLCBUMSwgczgpIFQzX18oUiwgVDEsIHU4KSBcCisgICAgVDNfXyhSLCBUMSwgczE2KSBUM19fKFIsIFQxLCB1MTYpIFwKKyAgICBUM19fKFIsIFQxLCBzMzIpIFQzX18oUiwgVDEsIHUzMikgXAorICAgIFQzX18oUiwgVDEsIHNMKSBUM19fKFIsIFQxLCB1TCkgXAorICAgIFQzX18oUiwgVDEsIHM2NCkgVDNfXyhSLCBUMSwgdTY0KSBcCisgICAgVDNfXyhSLCBUMSwgZjMyKSBUM19fKFIsIFQxLCBmNjQpIFwKKworI2RlZmluZSBURVNUMyhSKSBcCisgICAgVDNfKFIsIHM4KSBUM18oUiwgdTgpIFQzXyhSLCBzMTYpIFQzXyhSLCB1MTYpIFQzXyhSLCBzMzIpIFQzXyhSLCB1MzIpIFwKKyAgICBUM18oUiwgc0wpIFQzXyhSLCB1TCkgVDNfKFIsIHM2NCkgVDNfKFIsIHU2NCkgVDNfKFIsIGYzMikgVDNfKFIsIGY2NCkKKworVEVTVDMoczY0KQorCit2b2lkIAorZm9vNihpbnRwdHJfdCBpMSwgaW50cHRyX3QgaTIsIGludHB0cl90IGkzLCBpbnRwdHJfdCBpNCwgaW50cHRyX3QgaTUsIGludHB0cl90IGk2KSB7IH0KKwordm9pZCAKK2ZvbzUoaW50cHRyX3QgaTEsIGludHB0cl90IGkyLCBpbnRwdHJfdCBpMywgaW50cHRyX3QgaTQsIGludHB0cl90IGk1KSB7IH0KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L1BvaW50ZXJUZXN0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvUG9pbnRlclRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM3YWIyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L1BvaW50ZXJUZXN0LmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXYXluZSBNZWlzc25lci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgordHlwZWRlZiB2b2lkKiBwdHI7Cit0eXBlZGVmIHZvaWQqIHBvaW50ZXI7CisjaWZkZWYgX1dJTjMyCit0eXBlZGVmIGNoYXIqIGNhZGRyX3Q7CisjZW5kaWYKKworI2RlZmluZSBSRVQoVCkgVCBwdHJfcmV0XyMjVCh2b2lkKiBhcmcxLCBpbnQgb2Zmc2V0KSB7IFwKKyAgICBUIHRtcDsgbWVtY3B5KCZ0bXAsIChjYWRkcl90KSBhcmcxICsgb2Zmc2V0LCBzaXplb2YodG1wKSk7IHJldHVybiB0bXA7IFwKK30KKyNkZWZpbmUgU0VUKFQpIHZvaWQgcHRyX3NldF8jI1Qodm9pZCogYXJnMSwgaW50IG9mZnNldCwgVCB2YWx1ZSkgeyBcCisgICAgbWVtY3B5KChjYWRkcl90KSBhcmcxICsgb2Zmc2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOyBcCit9CisjZGVmaW5lIFRFU1QoVCkgU0VUKFQpIFJFVChUKQorCitURVNUKGludDhfdCk7CitURVNUKGludDE2X3QpOworVEVTVChpbnQzMl90KTsKK1RFU1QoaW50NjRfdCk7CitURVNUKGZsb2F0KTsKK1RFU1QoZG91YmxlKTsKK1RFU1QocG9pbnRlcik7CisKK3ZvaWQqCitwdHJfcmV0dXJuX2FycmF5X2VsZW1lbnQodm9pZCAqKnB0ckFycmF5LCBpbnQgYXJyYXlJbmRleCkgCit7CisgICAgcmV0dXJuIHB0ckFycmF5W2FycmF5SW5kZXhdOworfQorCit2b2lkCitwdHJfc2V0X2FycmF5X2VsZW1lbnQodm9pZCAqKnB0ckFycmF5LCBpbnQgYXJyYXlJbmRleCwgdm9pZCAqdmFsdWUpCit7ICAgIAorICAgIHB0ckFycmF5W2FycmF5SW5kZXhdID0gdmFsdWU7Cit9CisKK3ZvaWQqCitwdHJfbWFsbG9jKGludCBzaXplKSAKK3sKKyAgICByZXR1cm4gY2FsbG9jKDEsIHNpemUpOworfQordm9pZAorcHRyX2ZyZWUodm9pZCogcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKwordm9pZCoKK3B0cl9mcm9tX2FkZHJlc3ModWludHB0cl90IGFkZHIpCit7CisgICAgcmV0dXJuICh2b2lkICopIGFkZHI7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9SZWZlcmVuY2VUZXN0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvUmVmZXJlbmNlVGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZGQ4OGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvUmVmZXJlbmNlVGVzdC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgUkVGKFQpIHZvaWQgcmVmXyMjVChUIGFyZywgVCogcmVzdWx0KSB7ICpyZXN1bHQgPSBhcmc7IH0KKyNkZWZpbmUgQUREKFQpIHZvaWQgcmVmX2FkZF8jI1QoVCBhcmcxLCBUIGFyZzIsIFQqIHJlc3VsdCkgeyAqcmVzdWx0ID0gYXJnMSArIGFyZzI7IH0KKyNkZWZpbmUgU1VCKFQpIHZvaWQgcmVmX3N1Yl8jI1QoVCBhcmcxLCBUIGFyZzIsIFQqIHJlc3VsdCkgeyAqcmVzdWx0ID0gYXJnMSAtIGFyZzI7IH0KKyNkZWZpbmUgTVVMKFQpIHZvaWQgcmVmX211bF8jI1QoVCBhcmcxLCBUIGFyZzIsIFQqIHJlc3VsdCkgeyAqcmVzdWx0ID0gYXJnMSAqIGFyZzI7IH0KKyNkZWZpbmUgRElWKFQpIHZvaWQgcmVmX2Rpdl8jI1QoVCBhcmcxLCBUIGFyZzIsIFQqIHJlc3VsdCkgeyAqcmVzdWx0ID0gYXJnMSAvIGFyZzI7IH0KKyNkZWZpbmUgVEVTVChUKSBBREQoVCkgU1VCKFQpIE1VTChUKSBESVYoVCkgUkVGKFQpCisKK1RFU1QoaW50OF90KTsKK1RFU1QoaW50MTZfdCk7CitURVNUKGludDMyX3QpOworVEVTVChpbnQ2NF90KTsKK1RFU1QoZmxvYXQpOworVEVTVChkb3VibGUpOworCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9TdHJpbmdUZXN0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvU3RyaW5nVGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjI0MmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvU3RyaW5nVGVzdC5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCAKK3N0cmluZ19lcXVhbHMoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKQoreworICAgIHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOworfQorCit2b2lkIAorc3RyaW5nX3NldChjaGFyKiBzMSwgY29uc3QgY2hhciogczIpCit7CisgICAgc3RyY3B5KHMxLCBzMik7Cit9Cit2b2lkCitzdHJpbmdfY29uY2F0KGNoYXIqIGRzdCwgY29uc3QgY2hhciogc3JjKQoreworICAgIHN0cmNhdChkc3QsIHNyYyk7Cit9Cit2b2lkCitzdHJpbmdfZHVtbXkoY2hhciogZHVtbXkpCit7Cit9Citjb25zdCBjaGFyKgorc3RyaW5nX251bGwodm9pZCkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L1N0cnVjdFRlc3QuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9TdHJ1Y3RUZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2ODNkMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9TdHJ1Y3RUZXN0LmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQW5kcmVhIEZhenppIDxhbmRyZWEuZmF6emlAYWxjYWNvb3AuaXQ+LgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3R5cGVkZWYgY2hhciBzODsKK3R5cGVkZWYgc2hvcnQgczE2OwordHlwZWRlZiBpbnQgczMyOwordHlwZWRlZiBsb25nIGxvbmcgczY0OwordHlwZWRlZiBmbG9hdCBmMzI7Cit0eXBlZGVmIGRvdWJsZSBmNjQ7CisKK3R5cGVkZWYgc3RydWN0IGJ1Z2dlZF9zdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyIHZpc2libGU7CisgIHVuc2lnbmVkIGludCB4OworICB1bnNpZ25lZCBpbnQgeTsKKyAgc2hvcnQgcng7CisgIHNob3J0IHJ5OworICB1bnNpZ25lZCBjaGFyIG9yZGVyOworICB1bnNpZ25lZCBjaGFyIHNpemU7Cit9IGJ1Z2dlZF9zdHJ1Y3RfdDsKKwordW5zaWduZWQgaW50CitidWdnZWRfc3RydWN0X3NpemUoKSB7CisgICAgcmV0dXJuIHNpemVvZihidWdnZWRfc3RydWN0X3QpOworfQorCitzdHJ1Y3QgdGVzdDEgeworICAgIGNoYXIgYjsKKyAgICBzaG9ydCBzOworICAgIGludCBpOworICAgIGxvbmcgbG9uZyBqOworICAgIGxvbmcgbDsKKyAgICBmbG9hdCBmOworICAgIGRvdWJsZSBkOworICAgIGNoYXIgc3RyaW5nWzMyXTsKK307CisKK3N0cnVjdCBzdHJ1Y3Rfd2l0aF9hcnJheSB7CisgICAgY2hhciBjOworICAgIGludCBhWzVdOworfTsKKworc3RydWN0IG5lc3RlZCB7CisgICAgaW50IGk7Cit9OworCitzdHJ1Y3QgY29udGFpbmVyIHsKKyAgICBjaGFyIGZpcnN0OworICAgIHN0cnVjdCBuZXN0ZWQgczsKK307CisKK2ludAorc3RydWN0X2FsaWduX25lc3RlZF9zdHJ1Y3Qoc3RydWN0IGNvbnRhaW5lciogYSkgeyByZXR1cm4gYS0+cy5pOyB9CisKK3ZvaWQqCitzdHJ1Y3RfZmllbGRfYXJyYXkoc3RydWN0IHN0cnVjdF93aXRoX2FycmF5KiBzKSB7IHJldHVybiAmcy0+YTsgfQorCitzdHJ1Y3QgY29udGFpbmVyKgorc3RydWN0X21ha2VfY29udGFpbmVyX3N0cnVjdChpbnQgaSkKK3sKKyAgICBzdGF0aWMgc3RydWN0IGNvbnRhaW5lciBjczsKKyAgICBtZW1zZXQoJmNzLCAwLCBzaXplb2YoY3MpKTsKKyAgICBjcy5maXJzdCA9IDE7CisgICAgY3Mucy5pID0gaTsKKyAgICByZXR1cm4gJmNzOworfQorCisjZGVmaW5lIFQoeCwgdHlwZSkgXAorICAgIHR5cGUgc3RydWN0X2ZpZWxkXyMjdHlwZShzdHJ1Y3QgdGVzdDEqIHQpIHsgcmV0dXJuIHQtPng7IH0gXAorICAgIHN0cnVjdCB0eXBlIyNfYWxpZ24geyBjaGFyIGZpcnN0OyB0eXBlIHZhbHVlOyB9OyBcCisgICAgdHlwZSBzdHJ1Y3RfYWxpZ25fIyN0eXBlKHN0cnVjdCB0eXBlIyNfYWxpZ24qIGEpIHsgcmV0dXJuIGEtPnZhbHVlOyB9CisKK1QoYiwgczgpOworVChzLCBzMTYpOworVChpLCBzMzIpOworVChqLCBzNjQpOworVChmLCBmMzIpOworVChkLCBmNjQpOworVChsLCBsb25nKTsKKwordm9pZAorc3RydWN0X3NldF9zdHJpbmcoc3RydWN0IHRlc3QxKiB0LCBjaGFyKiBzKQoreworICAgIHN0cmNweSh0LT5zdHJpbmcsIHMpOworfQorCitzdHJ1Y3QgdGVzdDEqCitzdHJ1Y3RfbWFrZV9zdHJ1Y3QoY2hhciBiLCBzaG9ydCBzLCBpbnQgaSwgbG9uZyBsb25nIGxsLCBmbG9hdCBmLCBkb3VibGUgZCkKK3sKKyAgICBzdGF0aWMgc3RydWN0IHRlc3QxIHQ7CisgICAgbWVtc2V0KCZ0LCAwLCBzaXplb2YodCkpOworICAgIHQuYiA9IGI7CisgICAgdC5zID0gczsKKyAgICB0LmkgPSBpOworICAgIHQuaiA9IGxsOworICAgIHQuZiA9IGY7CisgICAgdC5kID0gZDsKKyAgICByZXR1cm4gJnQ7Cit9CisKK3R5cGVkZWYgaW50ICgqYWRkX2NiKShpbnQgYTEsIGludCBhMik7Cit0eXBlZGVmIGludCAoKnN1Yl9jYikoaW50IGExLCBpbnQgYTIpOworc3RydWN0IHRlc3QyIHsKKyAgICBhZGRfY2IgIGFkZF9jYWxsYmFjazsKKyAgICBzdWJfY2IgIHN1Yl9jYWxsYmFjazsKK307CisKK2ludAorc3RydWN0X2NhbGxfYWRkX2NiKHN0cnVjdCB0ZXN0MiogdCwgaW50IGExLCBpbnQgYTIpCit7CisgICAgcmV0dXJuIHQtPmFkZF9jYWxsYmFjayhhMSwgYTIpOworfQorCitpbnQKK3N0cnVjdF9jYWxsX3N1Yl9jYihzdHJ1Y3QgdGVzdDIqIHQsIGludCBhMSwgaW50IGEyKQoreworICAgIHJldHVybiB0LT5zdWJfY2FsbGJhY2soYTEsIGEyKTsKK30KKworCitzdHJ1Y3Qgc3RydWN0X3dpdGhfYXJyYXkqCitzdHJ1Y3RfbWFrZV9zdHJ1Y3Rfd2l0aF9hcnJheShpbnQgYV8wLCBpbnQgYV8xLCBpbnQgYV8yLCBpbnQgYV8zLCBpbnQgYV80KQoreworICAgIHN0YXRpYyBzdHJ1Y3Qgc3RydWN0X3dpdGhfYXJyYXkgczsKKworICAgIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKworICAgIHMuYVswXSA9IGFfMDsKKyAgICBzLmFbMV0gPSBhXzE7CisgICAgcy5hWzJdID0gYV8yOworICAgIHMuYVszXSA9IGFfMzsKKyAgICBzLmFbNF0gPSBhXzQ7CisKKyAgICByZXR1cm4gJnM7CisKK30KKworc3RydWN0IHM4czMyIHsKKyAgICBjaGFyIHM4OworICAgIGludCBzMzI7Cit9OworCitzdHJ1Y3QgczhzMzIKK3N0cnVjdF9yZXR1cm5fczhzMzIoKQoreworICAgIHN0cnVjdCBzOHMzMiBzOworICAgIHMuczggPSAweDdmOworICAgIHMuczMyID0gMHgxMjM0NTY3ODsKKworICAgIHJldHVybiBzOworfQorCitzdHJ1Y3QgczhzMzIKK3N0cnVjdF9zOHMzMl9zZXQoY2hhciBzOCwgaW50IHMzMikKK3sKKyAgICBzdHJ1Y3QgczhzMzIgczsKKworICAgIHMuczggPSBzODsKKyAgICBzLnMzMiA9IHMzMjsKKworICAgIHJldHVybiBzOworfQorCitpbnQKK3N0cnVjdF9zOHMzMl9nZXRfczgoc3RydWN0IHM4czMyIHMpCit7CisgICAgcmV0dXJuIHMuczg7Cit9CisKK2ludAorc3RydWN0X3M4czMyX2dldF9zMzIoc3RydWN0IHM4czMyIHMpCit7CisgICAgcmV0dXJuIHMuczMyOworfQorCitzdHJ1Y3QgczhzMzIKK3N0cnVjdF9zOHMzMl9yZXRfczhzMzIoc3RydWN0IHM4czMyIHMpCit7CisgICAgcmV0dXJuIHM7Cit9CisKKy8vIFBhc3MgYSBzdHJ1Y3QgYW5kIGFuIGludCBhcmcsIGVuc3VyZSB0aGUgaW50IGFyZyBpcyBwYXNzZWQgY29ycmVjdGx5CitpbnQKK3N0cnVjdF9zOHMzMl9zMzJfcmV0X3MzMihzdHJ1Y3QgczhzMzIgcywgaW50IHMzMikKK3sKKyAgICByZXR1cm4gczMyOworfQorCisvLyBQYXNzIGEgc3RydWN0IGFuZCBhIGxvbmcgbG9uZyBhcmcsIGVuc3VyZSB0aGUgbG9uZyBsb25nIGFyZyBpcyBwYXNzZWQgY29ycmVjdGx5Citsb25nIGxvbmcKK3N0cnVjdF9zOHMzMl9zNjRfcmV0X3M2NChzdHJ1Y3QgczhzMzIgcywgbG9uZyBsb25nIHM2NCkKK3sKKyAgICByZXR1cm4gczY0OworfQorCisvLyBQYXNzIGEgc3RydWN0IGFuZCBhIGxvbmcgbG9uZyBhcmcsIGVuc3VyZSB0aGUgbG9uZyBsb25nIGFyZyBpcyBwYXNzZWQgY29ycmVjdGx5CitpbnQKK3N0cnVjdF9zMzJfcHRyX3MzMl9zOHMzMl9yZXRfczMyKGludCBzMzJhLCB2b2lkICpwdHIsIGludCBzMzJiLCBzdHJ1Y3QgczhzMzIgcykKK3sKKyAgICBpZiAocHRyICE9IE5VTEwpICooc3RydWN0IHM4czMyICopIHB0ciA9IHM7CisgICAgcmV0dXJuIHMuczMyOworfQorCisvLyBQYXNzIGEgY2hhciAqLCBjb3B5IGludG8gYnVmZmVyIGxlbmd0aCBzdHJ1Y3QKK3N0cnVjdCBzdHJ1Y3Rfc3RyaW5nIHsKKyAgICBjaGFyICpieXRlczsKKyAgICBpbnQgbGVuOworfTsKKworc3RydWN0IHN0cnVjdF9zdHJpbmcKK3N0cnVjdF92YXJhcmdzX3JldF9zdHJ1Y3Rfc3RyaW5nKGludCBsZW4sIC4uLikKK3sKKyAgICBzdHJ1Y3Qgc3RydWN0X3N0cmluZyBzczsKKyAgICB2YV9saXN0IHZsOworICAgIGNoYXIqIGNwID0gTlVMTDsKKworICAgIHZhX3N0YXJ0KHZsLCBsZW4pOworCisgICAgc3MubGVuID0gbGVuOworICAgIHNzLmJ5dGVzID0gdmFfYXJnKHZsLCBjaGFyICopOworICAgIGlmIChzcy5ieXRlcyAhPSBOVUxMKSB7CisgICAgICAgIGNwID0gbWFsbG9jKHN0cmxlbihzcy5ieXRlcykgKyAxKTsKKyAgICAgICAgc3RyY3B5KGNwLCBzcy5ieXRlcyk7CisgICAgICAgIHNzLmJ5dGVzID0gY3A7CisgICAgfQorCisgICAgdmFfZW5kKHZsKTsKKworICAgIHJldHVybiBzczsKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L1VuaW9uVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9saWJ0ZXN0L1VuaW9uVGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjlhMzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvVW5pb25UZXN0LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXYXluZSBNZWlzc25lci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordHlwZWRlZiBjaGFyIHM4OwordHlwZWRlZiBzaG9ydCBzMTY7Cit0eXBlZGVmIGludCBzMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyBzNjQ7Cit0eXBlZGVmIGZsb2F0IGYzMjsKK3R5cGVkZWYgZG91YmxlIGY2NDsKKwordHlwZWRlZiB1bmlvbiB1bmlvbl90ZXN0IHsKKyAgICBjaGFyIGI7CisgICAgc2hvcnQgczsKKyAgICBpbnQgaTsKKyAgICBsb25nIGxvbmcgajsKKyAgICBsb25nIGw7CisgICAgZmxvYXQgZjsKKyAgICBkb3VibGUgZDsKKyAgICBzOCBhWzEwXTsKK30gdW5pb25fdGVzdF90OworCisjZGVmaW5lIFQoeCwgdHlwZSkgXAorICB0eXBlIHVuaW9uX2FsaWduXyMjdHlwZSh1bmlvbl90ZXN0X3QqIHUpIHsgcmV0dXJuIHUtPng7IH0gXAorICB1bmlvbl90ZXN0X3QqIHVuaW9uX21ha2VfdW5pb25fd2l0aF8jI3R5cGUodHlwZSB2YWx1ZSkgeyBzdGF0aWMgdW5pb25fdGVzdF90IHU7IHUueCA9IHZhbHVlOyByZXR1cm4gJnU7IH0KKworVChiLCBzOCk7CitUKHMsIHMxNik7CitUKGksIHMzMik7CitUKGosIHM2NCk7CitUKGYsIGYzMik7CitUKGQsIGY2NCk7CitUKGwsIGxvbmcpOworCit1bnNpZ25lZCBpbnQgdW5pb25fc2l6ZSgpIHsgcmV0dXJuIHNpemVvZih1bmlvbl90ZXN0X3QpOyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvVmFyaWFkaWNUZXN0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L2xpYnRlc3QvVmFyaWFkaWNUZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzZDgwMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvbGlidGVzdC9WYXJpYWRpY1Rlc3QuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdheW5lIE1laXNzbmVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3R5cGVkZWYgaW50OF90IHM4OwordHlwZWRlZiB1aW50OF90IHU4OwordHlwZWRlZiBpbnQxNl90IHMxNjsKK3R5cGVkZWYgdWludDE2X3QgdTE2OwordHlwZWRlZiBpbnQzMl90IHMzMjsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiBpbnQ2NF90IHM2NDsKK3R5cGVkZWYgdWludDY0X3QgdTY0OwordHlwZWRlZiBzaWduZWQgbG9uZyBzTDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1TDsKK3R5cGVkZWYgZmxvYXQgRjsKK3R5cGVkZWYgZG91YmxlIEQ7CisKK3ZvaWQgcGFja192YXJhcmdzKHM2NCogYnVmLCBjb25zdCBjaGFyKiBmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIGludCBjOworICAgIGRvdWJsZSBkOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHdoaWxlICgoYyA9ICpmbXQrKykpIHsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCBzMzIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCBsb25nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2onOgorICAgICAgICAgICAgICAgICpidWYrKyA9IHZhX2FyZyhhcCwgczY0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgZCA9IHZhX2FyZyhhcCwgZG91YmxlKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmKyssICZkLCBzaXplb2YoZCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgICpidWYrKyA9IHZhX2FyZyhhcCwgdTMyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICAgICpidWYrKyA9IHZhX2FyZyhhcCwgdW5zaWduZWQgbG9uZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdmFfZW5kKGFwKTsKK30KKworaW50IHBhY2tfdmFyYXJnczIoczY0KiBidWYsIGludCByZXR2YWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgaW50IGM7CisgICAgZG91YmxlIGQ7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgd2hpbGUgKChjID0gKmZtdCsrKSkgeworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAqYnVmKysgPSB2YV9hcmcoYXAsIHMzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgICAgICAqYnVmKysgPSB2YV9hcmcoYXAsIGxvbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaic6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCBzNjQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICBkID0gdmFfYXJnKGFwLCBkb3VibGUpOworICAgICAgICAgICAgICAgIG1lbWNweShidWYrKywgJmQsIHNpemVvZihkKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCB1MzIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCB1bnNpZ25lZCBsb25nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICB2YV9lbmQoYXApOworICAgIHJldHVybiByZXR2YWwgKyAxOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9MSUNFTlNFLlNQRUNTIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9MSUNFTlNFLlNQRUNTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MWRkOGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL0xJQ0VOU0UuU1BFQ1MKQEAgLTAsMCArMSwyMiBAQAorQ29weXJpZ2h0IChjKSAyMDA4LTIwMTQgUnVieS1GRkkgY29udHJpYnV0b3JzCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCitvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCitjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCitTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCitIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9hc3luY19jYWxsYmFja19zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9hc3luY19jYWxsYmFja19zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTUwY2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2FzeW5jX2NhbGxiYWNrX3NwZWMucmIKQEAgLTAsMCArMSwzNSBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKworZGVzY3JpYmUgImFzeW5jIGNhbGxiYWNrIiBkbworICBtb2R1bGUgTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgQXN5bmNJbnRDYWxsYmFjayA9IGNhbGxiYWNrIFsgOmludCBdLCA6dm9pZAorCisgICAgQGJsb2NraW5nID0gdHJ1ZQorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdEFzeW5jQ2FsbGJhY2ssIFsgQXN5bmNJbnRDYWxsYmFjaywgOmludCBdLCA6dm9pZAorICBlbmQKKworICBpdCAiOmludCAoMHg3ZmZmZmZmZikgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBjYWxsZWQgPSBmYWxzZQorICAgIGNiID0gUHJvYy5uZXcge3xpfCB2ID0gaTsgY2FsbGVkID0gdHJ1ZSB9CisgICAgTGliVGVzdC50ZXN0QXN5bmNDYWxsYmFjayhjYiwgMHg3ZmZmZmZmZikgCisgICAgZXhwZWN0KGNhbGxlZCkudG8gYmUgdHJ1ZQorICAgIGV4cGVjdCh2KS50byBlcSgweDdmZmZmZmZmKQorICBlbmQKKyAgCisgIGl0ICJjYWxsZWQgYSBzZWNvbmQgdGltZSIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIGNhbGxlZCA9IGZhbHNlCisgICAgY2IgPSBQcm9jLm5ldyB7fGl8IHYgPSBpOyBjYWxsZWQgPSB0cnVlIH0KKyAgICBMaWJUZXN0LnRlc3RBc3luY0NhbGxiYWNrKGNiLCAweDdmZmZmZmZmKSAKKyAgICBleHBlY3QoY2FsbGVkKS50byBiZSB0cnVlCisgICAgZXhwZWN0KHYpLnRvIGVxKDB4N2ZmZmZmZmYpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2Jvb2xfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvYm9vbF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDFkNmYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2Jvb2xfc3BlYy5yYgpAQCAtMCwwICsxLDMyIEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitkZXNjcmliZSAiRnVuY3Rpb24gd2l0aCBwcmltaXRpdmUgYm9vbGVhbiBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMiIGRvCisgIG1vZHVsZSBMaWJUZXN0CisgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICBhdHRhY2hfZnVuY3Rpb24gOmJvb2xfcmV0dXJuX3RydWUsIFsgXSwgOmJvb2wKKyAgICBhdHRhY2hfZnVuY3Rpb24gOmJvb2xfcmV0dXJuX2ZhbHNlLCBbIF0sIDpib29sCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpib29sX3JldHVybl92YWwsIFsgOmJvb2wgXSwgOmJvb2wKKyAgICBhdHRhY2hfZnVuY3Rpb24gOmJvb2xfcmV2ZXJzZV92YWwsIFsgOmJvb2wgXSwgOmJvb2wKKyAgZW5kCisKKyAgaXQgImJvb2xzIiBkbworICAgIGV4cGVjdChMaWJUZXN0LmJvb2xfcmV0dXJuX3RydWUpLnRvIGJlIHRydWUKKyAgICBleHBlY3QoTGliVGVzdC5ib29sX3JldHVybl9mYWxzZSkudG8gYmUgZmFsc2UKKworICAgIGV4cGVjdChMaWJUZXN0LmJvb2xfcmV0dXJuX3ZhbCh0cnVlKSkudG8gYmUgdHJ1ZQorICAgIGV4cGVjdChMaWJUZXN0LmJvb2xfcmV0dXJuX3ZhbChmYWxzZSkpLnRvIGJlIGZhbHNlCisKKyAgICBleHBlY3QoTGliVGVzdC5ib29sX3JldmVyc2VfdmFsKHRydWUpKS50byBiZSBmYWxzZQorICAgIGV4cGVjdChMaWJUZXN0LmJvb2xfcmV2ZXJzZV92YWwoZmFsc2UpKS50byBiZSB0cnVlCisgIGVuZAorCisgIGl0ICJyYWlzZSBlcnJvciBvbiBpbnZhbGlkIHR5cGVzIiBkbworICAgIGV4cGVjdCB7IExpYlRlc3QuYm9vbF9yZXR1cm5fdmFsKG5pbCkgfS50byByYWlzZV9lcnJvcig6OlR5cGVFcnJvcikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvYnVmZmVyX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2J1ZmZlcl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjJhNjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2J1ZmZlcl9zcGVjLnJiCkBAIC0wLDAgKzEsMjc5IEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitkZXNjcmliZSAiQnVmZmVyI3RvdGFsIiBkbworICBbMSwyLDNdLmVhY2ggZG8gfGl8CisgICAgeyA6Y2hhciA9PiAxLCA6dWNoYXIgPT4gMSwgOnNob3J0ID0+IDIsIDp1c2hvcnQgPT4gMiwgOmludCA9PiA0LCAKKyAgICAgIDp1aW50ID0+IDQsIDpsb25nID0+IEZGSTo6VHlwZTo6TE9ORy5zaXplLCA6dWxvbmcgPT4gRkZJOjpUeXBlOjpVTE9ORy5zaXplLCAKKyAgICAgIDpsb25nX2xvbmcgPT4gOCwgOnVsb25nX2xvbmcgPT4gOCwgOmZsb2F0ID0+IDQsIDpkb3VibGUgPT4gOAorICAgIH0uZWFjaF9wYWlyIGRvIHx0LCBzfAorCisgICAgICBpdCAiQnVmZmVyLmFsbG9jX2luKCN7dH0sICN7aX0pLnRvdGFsID09ICN7aSAqIHN9IiBkbworICAgICAgICBleHBlY3QoRkZJOjpCdWZmZXIuYWxsb2NfaW4odCwgaSkudG90YWwpLnRvIGVxKGkgKiBzKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJCdWZmZXIuYWxsb2Nfb3V0KCN7dH0sICN7aX0pLnRvdGFsID09ICN7aSAqIHN9IiBkbworICAgICAgICBleHBlY3QoRkZJOjpCdWZmZXIuYWxsb2Nfb3V0KHQsIGkpLnRvdGFsKS50byBlcShpICogcykKKyAgICAgIGVuZAorCisgICAgICBpdCAiQnVmZmVyLmFsbG9jX2lub3V0KCN7dH0sICN7aX0pLnRvdGFsID09ICN7aSAqIHN9IiBkbworICAgICAgICBleHBlY3QoRkZJOjpCdWZmZXIuYWxsb2NfaW5vdXQodCwgaSkudG90YWwpLnRvIGVxKGkgKiBzKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJCdWZmZXIjcHV0X2NoYXIiIGRvCisgIGJ1ZnNpemUgPSA0CisgICgwLi4xMjcpLmVhY2ggZG8gfGl8CisgICAgKDAuLmJ1ZnNpemUtMSkuZWFjaCBkbyB8b2Zmc2V0fAorICAgICAgaXQgInB1dF9jaGFyKCN7b2Zmc2V0fSwgI3tpfSkuZ2V0X2NoYXIoI3tvZmZzZXR9KSA9PSAje2l9IiBkbworICAgICAgICBleHBlY3QoRkZJOjpCdWZmZXIuYWxsb2NfaW4oYnVmc2l6ZSkucHV0X2NoYXIob2Zmc2V0LCBpKS5nZXRfY2hhcihvZmZzZXQpKS50byBlcShpKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJCdWZmZXIjcHV0X3VjaGFyIiBkbworICBidWZzaXplID0gNAorICAoMC4uMjU1KS5lYWNoIGRvIHxpfAorICAgICgwLi5idWZzaXplLTEpLmVhY2ggZG8gfG9mZnNldHwKKyAgICAgIGl0ICJCdWZmZXIucHV0X3VjaGFyKCN7b2Zmc2V0fSwgI3tpfSkuZ2V0X3VjaGFyKCN7b2Zmc2V0fSkgPT0gI3tpfSIgZG8KKyAgICAgICAgZXhwZWN0KEZGSTo6QnVmZmVyLmFsbG9jX2luKGJ1ZnNpemUpLnB1dF91Y2hhcihvZmZzZXQsIGkpLmdldF91Y2hhcihvZmZzZXQpKS50byBlcShpKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZCAKK2VuZAorCitkZXNjcmliZSAiQnVmZmVyI3B1dF9zaG9ydCIgZG8KKyAgYnVmc2l6ZSA9IDQKKyAgWzAsIDEsIDEyOCwgMzI3NjddLmVhY2ggZG8gfGl8CisgICAgKDAuLmJ1ZnNpemUtMikuZWFjaCBkbyB8b2Zmc2V0fAorICAgICAgaXQgInB1dF9zaG9ydCgje29mZnNldH0sICN7aX0pLmdldF9zaG9ydCgje29mZnNldH0pID09ICN7aX0iIGRvCisgICAgICAgIGV4cGVjdChGRkk6OkJ1ZmZlci5hbGxvY19pbihidWZzaXplKS5wdXRfc2hvcnQob2Zmc2V0LCBpKS5nZXRfc2hvcnQob2Zmc2V0KSkudG8gZXEoaSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZAorCitkZXNjcmliZSAiQnVmZmVyI3B1dF91c2hvcnQiIGRvCisgIGJ1ZnNpemUgPSA0CisgIFsgMCwgMSwgMTI4LCAzMjc2NywgNjU1MzUsIDB4ZmVlMSwgMHhkZWFkLCAweGJlZWYsIDB4Y2FmZSBdLmVhY2ggZG8gfGl8CisgICAgKDAuLmJ1ZnNpemUtMikuZWFjaCBkbyB8b2Zmc2V0fAorICAgICAgaXQgInB1dF91c2hvcnQoI3tvZmZzZXR9LCAje2l9KS5nZXRfdXNob3J0KCN7b2Zmc2V0fSkgPT0gI3tpfSIgZG8KKyAgICAgICAgZXhwZWN0KEZGSTo6QnVmZmVyLmFsbG9jX2luKGJ1ZnNpemUpLnB1dF91c2hvcnQob2Zmc2V0LCBpKS5nZXRfdXNob3J0KG9mZnNldCkpLnRvIGVxKGkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkJ1ZmZlciNwdXRfaW50IiBkbworICBidWZzaXplID0gOAorICBbMCwgMSwgMTI4LCAzMjc2NywgMHg3ZmZmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICAoMC4uYnVmc2l6ZS00KS5lYWNoIGRvIHxvZmZzZXR8CisgICAgICBpdCAicHV0X2ludCgje29mZnNldH0sICN7aX0pLmdldF9pbnQoI3tvZmZzZXR9KSA9PSAje2l9IiBkbworICAgICAgICBleHBlY3QoRkZJOjpCdWZmZXIuYWxsb2NfaW4oYnVmc2l6ZSkucHV0X2ludChvZmZzZXQsIGkpLmdldF9pbnQob2Zmc2V0KSkudG8gZXEoaSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZAorCitkZXNjcmliZSAiQnVmZmVyI3B1dF91aW50IiBkbworICBidWZzaXplID0gOAorICBbIDAsIDEsIDEyOCwgMzI3NjcsIDY1NTM1LCAweGZlZTFkZWFkLCAweGNhZmViYWJlLCAweGZmZmZmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICAoMC4uYnVmc2l6ZS00KS5lYWNoIGRvIHxvZmZzZXR8CisgICAgICBpdCAicHV0X3VpbnQoI3tvZmZzZXR9LCAje2l9KS5nZXRfdWludCgje29mZnNldH0pID09ICN7aX0iIGRvCisgICAgICAgIGV4cGVjdChGRkk6OkJ1ZmZlci5hbGxvY19pbihidWZzaXplKS5wdXRfdWludChvZmZzZXQsIGkpLmdldF91aW50KG9mZnNldCkpLnRvIGVxKGkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkJ1ZmZlciNwdXRfbG9uZyIgZG8KKyAgYnVmc2l6ZSA9IDE2CisgIFswLCAxLCAxMjgsIDMyNzY3LCAweDdmZmZmZmYgXS5lYWNoIGRvIHxpfAorICAgICgwLi5idWZzaXplLUZGSTo6VHlwZTo6TE9ORy5zaXplKS5lYWNoIGRvIHxvZmZzZXR8CisgICAgICBpdCAicHV0X2xvbmcoI3tvZmZzZXR9LCAje2l9KS5nZXRfbG9uZygje29mZnNldH0pID09ICN7aX0iIGRvCisgICAgICAgIGV4cGVjdChGRkk6OkJ1ZmZlci5hbGxvY19pbihidWZzaXplKS5wdXRfbG9uZyhvZmZzZXQsIGkpLmdldF9sb25nKG9mZnNldCkpLnRvIGVxKGkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkJ1ZmZlciNwdXRfdWxvbmciIGRvCisgIGJ1ZnNpemUgPSAxNgorICBbIDAsIDEsIDEyOCwgMzI3NjcsIDY1NTM1LCAweGZlZTFkZWFkLCAweGNhZmViYWJlLCAweGZmZmZmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICAoMC4uYnVmc2l6ZS1GRkk6OlR5cGU6OkxPTkcuc2l6ZSkuZWFjaCBkbyB8b2Zmc2V0fAorICAgICAgaXQgInB1dF91bG9uZygje29mZnNldH0sICN7aX0pLmdldF91bG9uZygje29mZnNldH0pID09ICN7aX0iIGRvCisgICAgICAgIGV4cGVjdChGRkk6OkJ1ZmZlci5hbGxvY19pbihidWZzaXplKS5wdXRfdWxvbmcob2Zmc2V0LCBpKS5nZXRfdWxvbmcob2Zmc2V0KSkudG8gZXEoaSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZAorCitkZXNjcmliZSAiQnVmZmVyI3B1dF9sb25nX2xvbmciIGRvCisgIGJ1ZnNpemUgPSAxNgorICBbMCwgMSwgMTI4LCAzMjc2NywgMHg3ZmZmZmZmZmZmZmZmZmYgXS5lYWNoIGRvIHxpfAorICAgICgwLi5idWZzaXplLTgpLmVhY2ggZG8gfG9mZnNldHwKKyAgICAgIGl0ICJwdXRfbG9uZ19sb25nKCN7b2Zmc2V0fSwgI3tpfSkuZ2V0X2xvbmdfbG9uZygje29mZnNldH0pID09ICN7aX0iIGRvCisgICAgICAgIGV4cGVjdChGRkk6OkJ1ZmZlci5hbGxvY19pbihidWZzaXplKS5wdXRfbG9uZ19sb25nKG9mZnNldCwgaSkuZ2V0X2xvbmdfbG9uZyhvZmZzZXQpKS50byBlcShpKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJCdWZmZXIjcHV0X3Vsb25nX2xvbmciIGRvCisgIGJ1ZnNpemUgPSAxNgorICBbIDAsIDEsIDEyOCwgMzI3NjcsIDY1NTM1LCAweGRlYWRjYWZlYmFiZSwgMHg3ZmZmZmZmZmZmZmZmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICAoMC4uYnVmc2l6ZS04KS5lYWNoIGRvIHxvZmZzZXR8CisgICAgICBpdCAicHV0X3Vsb25nX2xvbmcoI3tvZmZzZXR9LCAje2l9KS5nZXRfdWxvbmdfbG9uZygje29mZnNldH0pID09ICN7aX0iIGRvCisgICAgICAgIGV4cGVjdChGRkk6OkJ1ZmZlci5hbGxvY19pbihidWZzaXplKS5wdXRfdWxvbmdfbG9uZyhvZmZzZXQsIGkpLmdldF91bG9uZ19sb25nKG9mZnNldCkpLnRvIGVxKGkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIlJlYWRpbmcvV3JpdGluZyBiaW5hcnkgc3RyaW5ncyIgZG8KKyAgaXQgIkJ1ZmZlciNwdXRfYnl0ZXMiIGRvCisgICAgc3RyID0gImhlbGxvXDB3b3JsZCIKKyAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgMTAyNAorICAgIGJ1Zi5wdXRfYnl0ZXMoMCwgc3RyKTsKKyAgICBzMiA9IGJ1Zi5nZXRfYnl0ZXMoMCwgMTEpOworICAgIGV4cGVjdChzMikudG8gZXEoc3RyKQorICBlbmQKKworICBpdCAiQnVmZmVyI3B1dF9ieXRlcyB3aXRoIGluZGV4IGFuZCBsZW5ndGgiIGRvCisgICAgc3RyID0gImhlbGxvXDB3b3JsZCIKKyAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgMTAyNAorICAgIGJ1Zi5wdXRfYnl0ZXMoMCwgc3RyLCA1LCA2KTsKKyAgICBzMiA9IGJ1Zi5nZXRfYnl0ZXMoMCwgNik7CisgICAgZXhwZWN0KHMyKS50byBlcShzdHJbNS4uLTFdKQorICBlbmQKKworICBpdCAiQnVmZmVyI3B1dF9ieXRlcyB3aXRoIG9ubHkgaW5kZXgiIGRvCisgICAgc3RyID0gImhlbGxvXDB3b3JsZCIKKyAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgMTAyNAorICAgIGJ1Zi5wdXRfYnl0ZXMoMCwgc3RyLCA1KTsKKyAgICBzMiA9IGJ1Zi5nZXRfYnl0ZXMoMCwgNik7CisgICAgZXhwZWN0KHMyKS50byBlcShzdHJbNS4uLTFdKQorICBlbmQKKworICBpdCAiQnVmZmVyI3B1dF9ieXRlcyB3aXRoIGluZGV4ID4gc3RyLmxlbmd0aCIgZG8KKyAgICBzdHIgPSAiaGVsbG9cMHdvcmxkIgorICAgIGJ1ZiA9IEZGSTo6QnVmZmVyLm5ldyAxMDI0CisgICAgZXhwZWN0IHsgYnVmLnB1dF9ieXRlcygwLCBzdHIsIDEyKTsgfS50byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAiQnVmZmVyI3B1dF9ieXRlcyB3aXRoIGxlbmd0aCA+IHN0ci5sZW5ndGgiIGRvCisgICAgc3RyID0gImhlbGxvXDB3b3JsZCIKKyAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgMTAyNAorICAgIGV4cGVjdCB7IGJ1Zi5wdXRfYnl0ZXMoMCwgc3RyLCAwLCAxMik7IH0udG8gcmFpc2VfZXJyb3IKKyAgZW5kCisKKyAgaXQgIkJ1ZmZlciNwdXRfYnl0ZXMgd2l0aCBuZWdhdGl2ZSBpbmRleCIgZG8KKyAgICBzdHIgPSAiaGVsbG9cMHdvcmxkIgorICAgIGJ1ZiA9IEZGSTo6QnVmZmVyLm5ldyAxMDI0CisgICAgZXhwZWN0IHsgYnVmLnB1dF9ieXRlcygwLCBzdHIsIC0xLCAxMik7IH0udG8gcmFpc2VfZXJyb3IKKyAgZW5kCisKKyAgaXQgIkJ1ZmZlciN3cml0ZV9ieXRlcyIgZG8KKyAgICBzdHIgPSAiaGVsbG9cMHdvcmxkIgorICAgIGJ1ZiA9IEZGSTo6QnVmZmVyLm5ldyAxMDI0CisgICAgYnVmLndyaXRlX2J5dGVzKHN0cikKKyAgICBzMiA9IGJ1Zi5nZXRfYnl0ZXMoMCwgMTEpCisgICAgZXhwZWN0KHMyKS50byBlcShzdHIpCisgIGVuZAorCisgIGl0ICJCdWZmZXIjd3JpdGVfYnl0ZXMgd2l0aCBpbmRleCBhbmQgbGVuZ3RoIiBkbworICAgIHN0ciA9ICJoZWxsb1wwd29ybGQiCisgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDEwMjQKKyAgICBidWYud3JpdGVfYnl0ZXMoc3RyLCA1LCA2KQorICAgIHMyID0gYnVmLmdldF9ieXRlcygwLCA2KQorICAgIGV4cGVjdChzMikudG8gZXEoc3RyWzUuLi0xXSkKKyAgZW5kCisKKyAgaXQgIkJ1ZmZlciN3cml0ZV9ieXRlcyB3aXRoIG9ubHkgaW5kZXgiIGRvCisgICAgc3RyID0gImhlbGxvXDB3b3JsZCIKKyAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgMTAyNAorICAgIGJ1Zi53cml0ZV9ieXRlcyhzdHIsIDUpCisgICAgczIgPSBidWYuZ2V0X2J5dGVzKDAsIDYpCisgICAgZXhwZWN0KHMyKS50byBlcShzdHJbNS4uLTFdKQorICBlbmQKKworICBpdCAiQnVmZmVyI3dyaXRlX2J5dGVzIHdpdGggaW5kZXggPiBzdHIubGVuZ3RoIiBkbworICAgIHN0ciA9ICJoZWxsb1wwd29ybGQiCisgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDEwMjQKKyAgICBleHBlY3QgeyBidWYud3JpdGVfYnl0ZXMoc3RyLCAxMikgfS50byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAiQnVmZmVyI3B1dF9ieXRlcyB3aXRoIGxlbmd0aCA+IHN0ci5sZW5ndGgiIGRvCisgICAgc3RyID0gImhlbGxvXDB3b3JsZCIKKyAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgMTAyNAorICAgIGV4cGVjdCB7IGJ1Zi5wdXRfYnl0ZXMoMCwgc3RyLCAwLCAxMikgfS50byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAiQnVmZmVyI3dyaXRlX2J5dGVzIHdpdGggbmVnYXRpdmUgaW5kZXgiIGRvCisgICAgc3RyID0gImhlbGxvXDB3b3JsZCIKKyAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgMTAyNAorICAgIGV4cGVjdCB7IGJ1Zi53cml0ZV9ieXRlcyhzdHIsIC0xLCAxMikgfS50byByYWlzZV9lcnJvcgorICBlbmQKK2VuZAorCitkZXNjcmliZSAiUmVhZGluZy9Xcml0aW5nIGFzY2lpIHN0cmluZ3MiIGRvCisgIGl0ICJCdWZmZXIjcHV0X3N0cmluZyB3aXRoIHN0cmluZyBjb250YWluaW5nIHplcm8gYnl0ZSIgZG8KKyAgICBzdHIgPSAiaGVsbG9cMHdvcmxkIgorICAgIGJ1ZiA9IEZGSTo6QnVmZmVyLm5ldyAxMDI0CisgICAgYnVmLnB1dF9zdHJpbmcoMCwgc3RyKTsKKyAgICBzMiA9IGJ1Zi5nZXRfYnl0ZXMoMCwgMTEpOworICAgIGV4cGVjdChzMikudG8gZXEoc3RyKQorICBlbmQKKworICBpdCAiQnVmZmVyI2dldF9zdHJpbmcgd2l0aCBzdHJpbmcgY29udGFpbmluZyB6ZXJvIGJ5dGUiIGRvCisgICAgc3RyID0gImhlbGxvXDB3b3JsZCIKKyAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgMTAyNAorICAgIGJ1Zi5wdXRfYnl0ZXMoMCwgc3RyKTsKKyAgICBzMiA9IGJ1Zi5nZXRfc3RyaW5nKDAsIDExKTsKKyAgICBleHBlY3QoczIpLnRvIGVxKCJoZWxsbyIpCisgIGVuZAorCisgIGl0ICJCdWZmZXIjcHV0X3N0cmluZyB3aXRob3V0IGxlbmd0aCBzaG91bGQgTlVMIHRlcm1pbmF0ZSIgZG8KKyAgICBzdHIgPSAiaGVsbG8iCisgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDEwMjQKKyAgICBidWYucHV0X3N0cmluZygwLCBzdHIpOworICAgIHMyID0gYnVmLmdldF9ieXRlcygwLCA2KTsKKyAgICBleHBlY3QoczIpLnRvIGVxKCJoZWxsb1wwIikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkJ1ZmZlciNwdXRfcG9pbnRlciIgZG8KKyAgaXQgInB1dF9wb2ludGVyKDAsIHApLmdldF9wb2ludGVyKDApID09IHAiIGRvCisgICAgcCA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcgOnVsb25nX2xvbmcKKyAgICBwLnB1dF91aW50KDAsIDB4ZGVhZGJlZWYpCisgICAgYnVmID0gRkZJOjpCdWZmZXIuYWxsb2NfaW5vdXQgOAorICAgIHAyID0gYnVmLnB1dF9wb2ludGVyKDAsIHApLmdldF9wb2ludGVyKDApCisgICAgZXhwZWN0KHAyKS5ub3RfdG8gYmVfbmlsCisgICAgZXhwZWN0KHAyKS50byBlcShwKQorICAgIGV4cGVjdChwMi5nZXRfdWludCgwKSkudG8gZXEoMHhkZWFkYmVlZikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkJ1ZmZlciNzaXplIiBkbworICBpdCAic2hvdWxkIHJldHVybiBzaXplIiBkbworICAgIGJ1ZiA9IEZGSTo6QnVmZmVyLm5ldyAxNAorICAgIGV4cGVjdChidWYuc2l6ZSkudG8gZXEoMTQpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJCdWZmZXIjaW5pdGlhbGl6ZSIgZG8KKyAgaXQgIndpdGggYmxvY2sgc2hvdWxkIGV4ZWN1dGUgYmxvY2siIGRvCisgICAgYmxvY2tfZXhlY3V0ZWQgPSBmYWxzZQorICAgIEZGSTo6QnVmZmVyLm5ldyg6cG9pbnRlcikgZG8gfHB0cnwKKyAgICAgIGJsb2NrX2V4ZWN1dGVkID0gdHJ1ZQorICAgIGVuZAorICAgIGV4cGVjdChibG9ja19leGVjdXRlZCkudG8gYmUgdHJ1ZQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9jYWxsYmFja19zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9jYWxsYmFja19zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOWI1NWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2NhbGxiYWNrX3NwZWMucmIKQEAgLTAsMCArMSw3NzMgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2Rlc2NyaWJlICJDYWxsYmFjayIgZG8KKyMgIG1vZHVsZSBMaWJDCisjICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyMgICAgY2FsbGJhY2sgOnFzb3J0X2NtcCwgWyA6cG9pbnRlciwgOnBvaW50ZXIgXSwgOmludAorIyAgICBhdHRhY2hfZnVuY3Rpb24gOnFzb3J0LCBbIDpwb2ludGVyLCA6aW50LCA6aW50LCA6cXNvcnRfY21wIF0sIDppbnQKKyMgIGVuZAorIyAgaXQgImFyZ3VtZW50cyBnZXQgcGFzc2VkIGNvcnJlY3RseSIgZG8KKyMgICAgcCA9IE1lbW9yeVBvaW50ZXIubmV3KDppbnQsIDIpCisjICAgIHAucHV0X2FycmF5X29mX2ludDMyKDAsIFsgMSAsIDIgXSkKKyMgICAgYXJncyA9IFtdCisjICAgIGNtcCA9IHByb2MgZG8gfHAxLCBwMnwgYXJncy5wdXNoKHAxLmdldF9pbnQoMCkpOyBhcmdzLnB1c2gocDIuZ2V0X2ludCgwKSk7IDA7IGVuZAorIyAgICAjIHRoaXMgaXMgYSBiaXQgZG9kZ2V5LCBhcyBpdCByZWxpZXMgb24gcXNvcnQgcGFzc2luZyB0aGUgYXJncyBpbiBvcmRlcgorIyAgICBMaWJDLnFzb3J0KHAsIDIsIDQsIGNtcCkKKyMgICAgYXJncy5zaG91bGQgPT0gWyAxLCAyIF0KKyMgIGVuZAorIworIyAgaXQgIkJsb2NrIGNhbiBiZSBzdWJzdGl0dXRlZCBmb3IgQ2FsbGJhY2sgYXMgbGFzdCBhcmd1bWVudCIgZG8KKyMgICAgcCA9IE1lbW9yeVBvaW50ZXIubmV3KDppbnQsIDIpCisjICAgIHAucHV0X2FycmF5X29mX2ludDMyKDAsIFsgMSAsIDIgXSkKKyMgICAgYXJncyA9IFtdCisjICAgICMgdGhpcyBpcyBhIGJpdCBkb2RnZXksIGFzIGl0IHJlbGllcyBvbiBxc29ydCBwYXNzaW5nIHRoZSBhcmdzIGluIG9yZGVyCisjICAgIExpYkMucXNvcnQocCwgMiwgNCkgZG8gfHAxLCBwMnwKKyMgICAgICBhcmdzLnB1c2gocDEuZ2V0X2ludCgwKSkKKyMgICAgICBhcmdzLnB1c2gocDIuZ2V0X2ludCgwKSkKKyMgICAgICAwCisjICAgIGVuZAorIyAgICBhcmdzLnNob3VsZCA9PSBbIDEsIDIgXQorIyAgZW5kCisgIG1vZHVsZSBMaWJUZXN0CisgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICBjbGFzcyBTOEYzMlMzMiA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOnM4LCA6Y2hhciwgOmYzMiwgOmZsb2F0LCA6czMyLCA6aW50CisgICAgZW5kCisKKyAgICBjYWxsYmFjayA6Y2JWclM4LCBbIF0sIDpjaGFyCisgICAgY2FsbGJhY2sgOmNiVnJVOCwgWyBdLCA6dWNoYXIKKyAgICBjYWxsYmFjayA6Y2JWclMxNiwgWyBdLCA6c2hvcnQKKyAgICBjYWxsYmFjayA6Y2JWclUxNiwgWyBdLCA6dXNob3J0CisgICAgY2FsbGJhY2sgOmNiVnJTMzIsIFsgXSwgOmludAorICAgIGNhbGxiYWNrIDpjYlZyVTMyLCBbIF0sIDp1aW50CisgICAgY2FsbGJhY2sgOmNiVnJMLCBbIF0sIDpsb25nCisgICAgY2FsbGJhY2sgOmNiVnJVTCwgWyBdLCA6dWxvbmcKKyAgICBjYWxsYmFjayA6Y2JWclM2NCwgWyBdLCA6bG9uZ19sb25nCisgICAgY2FsbGJhY2sgOmNiVnJVNjQsIFsgXSwgOnVsb25nX2xvbmcKKyAgICBjYWxsYmFjayA6Y2JWclAsIFtdLCA6cG9pbnRlcgorICAgIGNhbGxiYWNrIDpjYlZyWiwgW10sIDpib29sCisgICAgY2FsbGJhY2sgOmNiQ3JWLCBbIDpjaGFyIF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiU3JWLCBbIDpzaG9ydCBdLCA6dm9pZAorICAgIGNhbGxiYWNrIDpjYklyViwgWyA6aW50IF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiTHJWLCBbIDpsb25nIF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiVUxyViwgWyA6dWxvbmcgXSwgOnZvaWQKKyAgICBjYWxsYmFjayA6Y2JMclYsIFsgOmxvbmdfbG9uZyBdLCA6dm9pZAorICAgIGNhbGxiYWNrIDpjYlZyVCwgWyBdLCBTOEYzMlMzMi5ieV92YWx1ZQorICAgIGNhbGxiYWNrIDpjYlRyViwgWyBTOEYzMlMzMi5ieV92YWx1ZSBdLCA6dm9pZAorICAgIGNhbGxiYWNrIDpjYllyViwgWyBTOEYzMlMzMi5wdHIgXSwgOnZvaWQKKyAgICBjYWxsYmFjayA6Y2JWclksIFsgXSwgUzhGMzJTMzIucHRyCisKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1ZyUzgsIDp0ZXN0Q2xvc3VyZVZyQiwgWyA6Y2JWclM4IF0sIDpjaGFyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tWclU4LCA6dGVzdENsb3N1cmVWckIsIFsgOmNiVnJVOCBdLCA6dWNoYXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1ZyUzE2LCA6dGVzdENsb3N1cmVWclMsIFsgOmNiVnJTMTYgXSwgOnNob3J0CisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tWclUxNiwgOnRlc3RDbG9zdXJlVnJTLCBbIDpjYlZyVTE2IF0sIDp1c2hvcnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1ZyUzMyLCA6dGVzdENsb3N1cmVWckksIFsgOmNiVnJTMzIgXSwgOmludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJVMzIsIDp0ZXN0Q2xvc3VyZVZySSwgWyA6Y2JWclUzMiBdLCA6dWludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJMLCA6dGVzdENsb3N1cmVWckwsIFsgOmNiVnJMIF0sIDpsb25nCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tWclosIDp0ZXN0Q2xvc3VyZVZyWiwgWyA6Y2JWclogXSwgOmJvb2wKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1ZyVUwsIDp0ZXN0Q2xvc3VyZVZyTCwgWyA6Y2JWclVMIF0sIDp1bG9uZworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJTNjQsIDp0ZXN0Q2xvc3VyZVZyTEwsIFsgOmNiVnJTNjQgXSwgOmxvbmdfbG9uZworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJVNjQsIDp0ZXN0Q2xvc3VyZVZyTEwsIFsgOmNiVnJVNjQgXSwgOnVsb25nX2xvbmcKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1ZyUCwgOnRlc3RDbG9zdXJlVnJQLCBbIDpjYlZyUCBdLCA6cG9pbnRlcgorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJZLCA6dGVzdENsb3N1cmVWclAsIFsgOmNiVnJZIF0sIFM4RjMyUzMyLnB0cgorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJULCA6dGVzdENsb3N1cmVWclQsIFsgOmNiVnJUIF0sIFM4RjMyUzMyLmJ5X3ZhbHVlCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tUclYsIDp0ZXN0Q2xvc3VyZVRyViwgWyA6Y2JUclYsIFM4RjMyUzMyLnB0ciBdLCA6dm9pZAorICAgIGF0dGFjaF92YXJpYWJsZSA6Y2JWclM4LCA6Z3Zhcl9wb2ludGVyLCA6Y2JWclM4CisgICAgYXR0YWNoX3ZhcmlhYmxlIDpwVnJTOCwgOmd2YXJfcG9pbnRlciwgOnBvaW50ZXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RHVmFyQ2FsbGJhY2tWclM4LCA6dGVzdENsb3N1cmVWckIsIFsgOnBvaW50ZXIgXSwgOmNoYXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RPcHRpb25hbENhbGxiYWNrQ3JWLCA6dGVzdE9wdGlvbmFsQ2xvc3VyZUJyViwgWyA6Y2JDclYsIDpjaGFyIF0sIDp2b2lkCisKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6Y2hhciAoMCkiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJTOCB7IDAgfSkudG8gZXEoMCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6Y2hhciAoMTI3KSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclM4IHsgMTI3IH0pLnRvIGVxKDEyNykKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6Y2hhciAoLTEyOCkiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJTOCB7IC0xMjggfSkudG8gZXEoLTEyOCkKKyAgZW5kCisgICMgdGVzdCB3cmFwIGFyb3VuZAorICBpdCAicmV0dXJuaW5nIDpjaGFyICgxMjgpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyUzggeyAxMjggfSkudG8gZXEoLTEyOCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6Y2hhciAoMjU1KSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclM4IHsgMHhmZiB9KS50byBlcSgtMSkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6dWNoYXIgKDApIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyVTggeyAwIH0pLnRvIGVxKDApCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVjaGFyICgweGZmKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclU4IHsgMHhmZiB9KS50byBlcSgweGZmKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIDp1Y2hhciAoLTEpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyVTggeyAtMSB9KS50byBlcSgweGZmKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIDp1Y2hhciAoMTI4KSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclU4IHsgMTI4IH0pLnRvIGVxKDEyOCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6dWNoYXIgKC0xMjgpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyVTggeyAtMTI4IH0pLnRvIGVxKDEyOCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6c2hvcnQgKDApIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyUzE2IHsgMCB9KS50byBlcSgwKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIDpzaG9ydCAoMHg3ZmZmKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclMxNiB7IDB4N2ZmZiB9KS50byBlcSgweDdmZmYpCisgIGVuZAorICAjIHRlc3Qgd3JhcCBhcm91bmQKKyAgaXQgInJldHVybmluZyA6c2hvcnQgKDB4ODAwMCkiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJTMTYgeyAweDgwMDAgfSkudG8gZXEoLTB4ODAwMCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6c2hvcnQgKDB4ZmZmZikiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJTMTYgeyAweGZmZmYgfSkudG8gZXEoLTEpCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVzaG9ydCAoMCkiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJVMTYgeyAwIH0pLnRvIGVxKDApCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVzaG9ydCAoMHg3ZmZmKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclUxNiB7IDB4N2ZmZiB9KS50byBlcSgweDdmZmYpCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVzaG9ydCAoMHg4MDAwKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclUxNiB7IDB4ODAwMCB9KS50byBlcSgweDgwMDApCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVzaG9ydCAoMHhmZmZmKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclUxNiB7IDB4ZmZmZiB9KS50byBlcSgweGZmZmYpCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVzaG9ydCAoLTEpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyVTE2IHsgLTEgfSkudG8gZXEoMHhmZmZmKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIDppbnQgKDApIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyUzMyIHsgMCB9KS50byBlcSgwKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIDppbnQgKDB4N2ZmZmZmZmYpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyUzMyIHsgMHg3ZmZmZmZmZiB9KS50byBlcSgweDdmZmZmZmZmKQorICBlbmQKKyAgIyB0ZXN0IHdyYXAgYXJvdW5kCisgIGl0ICJyZXR1cm5pbmcgOmludCAoLTB4ODAwMDAwMDApIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyUzMyIHsgLTB4ODAwMDAwMDAgfSkudG8gZXEoLTB4ODAwMDAwMDApCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOmludCAoLTEpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyUzMyIHsgLTEgfSkudG8gZXEoLTEpCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVpbnQgKDApIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyVTMyIHsgMCB9KS50byBlcSgwKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIDp1aW50ICgweDdmZmZmZmZmKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclUzMiB7IDB4N2ZmZmZmZmYgfSkudG8gZXEoMHg3ZmZmZmZmZikKKyAgZW5kCisgICMgdGVzdCB3cmFwIGFyb3VuZAorICBpdCAicmV0dXJuaW5nIDp1aW50ICgweDgwMDAwMDAwKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclUzMiB7IDB4ODAwMDAwMDAgfSkudG8gZXEoMHg4MDAwMDAwMCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6dWludCAoMHhmZmZmZmZmZikiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJVMzIgeyAweGZmZmZmZmZmIH0pLnRvIGVxKDB4ZmZmZmZmZmYpCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVpbnQgKC0xKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclUzMiB7IC0xIH0pLnRvIGVxKDB4ZmZmZmZmZmYpCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOmxvbmcgKDApIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyTCB7IDAgfSkudG8gZXEoMCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6bG9uZyAoMHg3ZmZmZmZmZikiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJMIHsgMHg3ZmZmZmZmZiB9KS50byBlcSgweDdmZmZmZmZmKQorICBlbmQKKyAgIyB0ZXN0IHdyYXAgYXJvdW5kCisgIGl0ICJyZXR1cm5pbmcgOmxvbmcgKC0weDgwMDAwMDAwKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWckwgeyAtMHg4MDAwMDAwMCB9KS50byBlcSgtMHg4MDAwMDAwMCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6bG9uZyAoLTEpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyTCB7IC0xIH0pLnRvIGVxKC0xKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIDp1bG9uZyAoMCkiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJVTCB7IDAgfSkudG8gZXEoMCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6dWxvbmcgKDB4N2ZmZmZmZmYpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyVUwgeyAweDdmZmZmZmZmIH0pLnRvIGVxKDB4N2ZmZmZmZmYpCisgIGVuZAorICAjIHRlc3Qgd3JhcCBhcm91bmQKKyAgaXQgInJldHVybmluZyA6dWxvbmcgKDB4ODAwMDAwMDApIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyVUwgeyAweDgwMDAwMDAwIH0pLnRvIGVxKDB4ODAwMDAwMDApCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnVsb25nICgweGZmZmZmZmZmKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclVMIHsgMHhmZmZmZmZmZiB9KS50byBlcSgweGZmZmZmZmZmKQorICBlbmQKKworICBpdCAiQ2FsbGJhY2sgcmV0dXJuaW5nIDp1bG9uZyAoLTEpIiBkbworICAgIGlmIEZGSTo6UGxhdGZvcm06OkxPTkdfU0laRSA9PSAzMgorICAgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJVTCB7IC0xIH0pLnRvIGVxKDB4ZmZmZmZmZmYpCisgICAgZWxzZQorICAgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJVTCB7IC0xIH0pLnRvIGVxKDB4ZmZmZmZmZmZmZmZmZmZmZikKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6bG9uZ19sb25nICgwKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclM2NCB7IDAgfSkudG8gZXEoMCkKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6bG9uZ19sb25nICgweDdmZmZmZmZmZmZmZmZmZmYpIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyUzY0IHsgMHg3ZmZmZmZmZmZmZmZmZmZmIH0pLnRvIGVxKDB4N2ZmZmZmZmZmZmZmZmZmZikKKyAgZW5kCisgICMgdGVzdCB3cmFwIGFyb3VuZAorICBpdCAicmV0dXJuaW5nIDpsb25nX2xvbmcgKC0weDgwMDAwMDAwMDAwMDAwMDApIiBkbworICAgIGV4cGVjdChMaWJUZXN0LnRlc3RDYWxsYmFja1ZyUzY0IHsgLTB4ODAwMDAwMDAwMDAwMDAwMCB9KS50byBlcSgtMHg4MDAwMDAwMDAwMDAwMDAwKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIDpsb25nX2xvbmcgKC0xKSIgZG8KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclM2NCB7IC0xIH0pLnRvIGVxKC0xKQorICBlbmQKKworICBpdCAicmV0dXJuaW5nIGJvb2wiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJaIHsgdHJ1ZSB9KS50byBiZSB0cnVlCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgOnBvaW50ZXIgKG5pbCkiIGRvCisgICAgZXhwZWN0KExpYlRlc3QudGVzdENhbGxiYWNrVnJQIHsgbmlsIH0pLnRvIGJlX251bGwKKyAgZW5kCisKKyAgaXQgInJldHVybmluZyA6cG9pbnRlciAoTWVtb3J5UG9pbnRlcikiIGRvCisgICAgcCA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcgOmxvbmcKKyAgICBleHBlY3QoTGliVGVzdC50ZXN0Q2FsbGJhY2tWclAgeyBwIH0pLnRvIGVxKHApCisgIGVuZAorCisgIGl0ICJyZXR1cm5pbmcgc3RydWN0IGJ5IHZhbHVlIiBkbworICAgIHMgPSBMaWJUZXN0OjpTOEYzMlMzMi5uZXcKKyAgICBzWzpzOF0gPSAweDEyCisgICAgc1s6czMyXSA9IDB4MWVlZmJlZWYKKyAgICBzWzpmMzJdID0gMS4yMzQ1NjcKKyAgICByZXQgPSBMaWJUZXN0LnRlc3RDYWxsYmFja1ZyVCB7IHMgfQorICAgIGV4cGVjdChyZXRbOnM4XSkudG8gZXEoc1s6czhdKQorICAgIGV4cGVjdChyZXRbOmYzMl0pLnRvIGVxKHNbOmYzMl0pCisgICAgZXhwZWN0KHJldFs6czMyXSkudG8gZXEoc1s6czMyXSkKKworICBlbmQKKworICBpdCAic3RydWN0IGJ5IHZhbHVlIHBhcmFtZXRlciIgZG8KKyAgICBzID0gTGliVGVzdDo6UzhGMzJTMzIubmV3CisgICAgc1s6czhdID0gMHgxMgorICAgIHNbOnMzMl0gPSAweDFlZWZiZWVmCisgICAgc1s6ZjMyXSA9IDEuMjM0NTY3CisgICAgczIgPSBMaWJUZXN0OjpTOEYzMlMzMi5uZXcKKworICAgIExpYlRlc3QudGVzdENhbGxiYWNrVHJWKHMpIGRvIHxzdHJ1Y3R8CisgICAgICBzMls6czhdID0gc3RydWN0WzpzOF0KKyAgICAgIHMyWzpmMzJdID0gc3RydWN0WzpmMzJdCisgICAgICBzMls6czMyXSA9IHN0cnVjdFs6czMyXQorICAgIGVuZAorCisgICAgZXhwZWN0KHMyWzpzOF0pLnRvIGVxbCAweDEyCisgICAgZXhwZWN0KHMyWzpzMzJdKS50byBlcWwgMHgxZWVmYmVlZgorICAgIGV4cGVjdChzMls6ZjMyXSkudG8gYmVfd2l0aGluKDAuMDAwMDAwMSkub2YgMS4yMzQ1NjcKKyAgZW5kCisKKyAgCisgIGl0ICJnbG9iYWwgdmFyaWFibGUiIGRvCisgICAgcHJvYyA9IFByb2MubmV3IHsgMHgxZSB9CisgICAgTGliVGVzdC5jYlZyUzggPSBwcm9jCisgICAgZXhwZWN0KExpYlRlc3QudGVzdEdWYXJDYWxsYmFja1ZyUzgoTGliVGVzdC5wVnJTOCkpLnRvIGVxKDB4MWUpCisgIGVuZAorCisgIGRlc2NyaWJlICJXaGVuIHRoZSBjYWxsYmFjayBpcyBjb25zaWRlcmVkIG9wdGlvbmFsIGJ5IHRoZSB1bmRlcmx5aW5nIGxpYnJhcnkiIGRvCisgICAgaXQgInNob3VsZCBoYW5kbGUgcmVjZWl2aW5nICduaWwnIGluIHBsYWNlIG9mIHRoZSBjbG9zdXJlIiBkbworICAgICAgZXhwZWN0KExpYlRlc3QudGVzdE9wdGlvbmFsQ2FsbGJhY2tDclYobmlsLCAxMykpLnRvIGJlX25pbAorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAnd2hlbiBpbmxpbmVkJyBkbworICAgIGl0ICdjb3VsZCBiZSBhbm9ueW1vdXMnIGRvCisgICAgICBtb2R1bGUgTGliVGVzdAorICAgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0QW5vbnltb3VzQ2FsbGJhY2tWclM4LCA6dGVzdENsb3N1cmVWckIsIFsgY2FsbGJhY2soWyBdLCA6Y2hhcikgXSwgOmNoYXIKKyAgICAgIGVuZAorICAgICAgZXhwZWN0KExpYlRlc3QudGVzdEFub255bW91c0NhbGxiYWNrVnJTOCB7IDAgfSkudG8gZXEoMCkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzY3JpYmUgImFzIHJldHVybiB2YWx1ZSIgZG8KKworICAgIGl0ICJzaG91bGQgbm90IGJsb3cgdXAgd2hlbiBhIGNhbGxiYWNrIGlzIGRlZmluZWQgdGhhdCByZXR1cm5zIGEgY2FsbGJhY2siIGRvCisgICAgICBleHBlY3QobW9kdWxlIExpYlRlc3QKKyAgICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICAgIGNhbGxiYWNrIDpjYl9yZXR1cm5fdHlwZV8xLCBbIDpzaG9ydCBdLCA6c2hvcnQKKyAgICAgICAgY2FsbGJhY2sgOmNiX2xvb2t1cF8xLCBbIDpzaG9ydCBdLCA6Y2JfcmV0dXJuX3R5cGVfMQorICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RSZXR1cm5zQ2FsbGJhY2tfMSwgOnRlc3RSZXR1cm5zQ2xvc3VyZSwgWyA6Y2JfbG9va3VwXzEsIDpzaG9ydCBdLCA6Y2JfcmV0dXJuX3R5cGVfMQorICAgICAgZW5kKS50byBiZV9hbl9pbnN0YW5jZV9vZiBGRkk6OkZ1bmN0aW9uCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJldHVybiBhIGNhbGxiYWNrIiBkbworICAgICAgbW9kdWxlIExpYlRlc3QKKyAgICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICAgIGNhbGxiYWNrIDpjYl9yZXR1cm5fdHlwZSwgWyA6aW50IF0sIDppbnQKKyAgICAgICAgY2FsbGJhY2sgOmNiX2xvb2t1cCwgWyBdLCA6Y2JfcmV0dXJuX3R5cGUKKyAgICAgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0UmV0dXJuc0NhbGxiYWNrLCA6dGVzdFJldHVybnNDbG9zdXJlLCBbIDpjYl9sb29rdXAsIDppbnQgXSwgOmludAorICAgICAgZW5kICAgICAgCisKKyAgICAgIGxvb2t1cF9wcm9jX2NhbGxlZCA9IGZhbHNlCisgICAgICByZXR1cm5fcHJvY19jYWxsZWQgPSBmYWxzZQorCisgICAgICByZXR1cm5fcHJvYyA9IFByb2MubmV3IGRvIHxhfAorICAgICAgICByZXR1cm5fcHJvY19jYWxsZWQgPSB0cnVlCisgICAgICAgIGEgKiAyCisgICAgICBlbmQKKyAgICAgIGxvb2t1cF9wcm9jID0gUHJvYy5uZXcgZG8KKyAgICAgICAgbG9va3VwX3Byb2NfY2FsbGVkID0gdHJ1ZQorICAgICAgICByZXR1cm5fcHJvYworICAgICAgZW5kCisKKyAgICAgIHZhbCA9IExpYlRlc3QudGVzdFJldHVybnNDYWxsYmFjayhsb29rdXBfcHJvYywgMHgxMjM0KQorICAgICAgZXhwZWN0KHZhbCkudG8gZXEoMHgxMjM0ICogMikKKyAgICAgIGV4cGVjdChsb29rdXBfcHJvY19jYWxsZWQpLnRvIGJlIHRydWUKKyAgICAgIGV4cGVjdChyZXR1cm5fcHJvY19jYWxsZWQpLnRvIGJlIHRydWUKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmV0dXJuIGEgbWV0aG9kIGNhbGxiYWNrIiBkbworICAgICAgbW9kdWxlIExpYlRlc3QKKyAgICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICAgIGNhbGxiYWNrIDpjYl9yZXR1cm5fdHlwZSwgWyA6aW50IF0sIDppbnQKKyAgICAgICAgY2FsbGJhY2sgOmNiX2xvb2t1cCwgWyBdLCA6Y2JfcmV0dXJuX3R5cGUKKyAgICAgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0UmV0dXJuc0NhbGxiYWNrXzIsIDp0ZXN0UmV0dXJuc0Nsb3N1cmUsIFsgOmNiX2xvb2t1cCwgOmludCBdLCA6aW50CisgICAgICBlbmQKKyAgICAgIG1vZHVsZSBNZXRob2RDYWxsYmFjaworICAgICAgICBkZWYgc2VsZi5sb29rdXAKKyAgICAgICAgICBtZXRob2QoOnBlcmZvcm0pCisgICAgICAgIGVuZAorICAgICAgICBkZWYgc2VsZi5wZXJmb3JtIG51bQorICAgICAgICAgIG51bSAqIDIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZXhwZWN0KExpYlRlc3QudGVzdFJldHVybnNDYWxsYmFja18yKE1ldGhvZENhbGxiYWNrLm1ldGhvZCg6bG9va3VwKSwgMHgxMjM0KSkudG8gZXEoMHgyNDY4KQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCBub3QgYmxvdyB1cCB3aGVuIGEgY2FsbGJhY2sgdGFrZXMgYSBjYWxsYmFjayBhcyBhcmd1bWVudCcgZG8KKyAgICAgIGV4cGVjdChtb2R1bGUgTGliVGVzdAorICAgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAgICAgY2FsbGJhY2sgOmNiX2FyZ3VtZW50LCBbIDppbnQgXSwgOmludAorICAgICAgICBjYWxsYmFjayA6Y2Jfd2l0aF9jYl9hcmd1bWVudCwgWyA6Y2JfYXJndW1lbnQsIDppbnQgXSwgOmludAorICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja0FzQXJndW1lbnRfMiwgOnRlc3RBcmd1bWVudENsb3N1cmUsIFsgOmNiX3dpdGhfY2JfYXJndW1lbnQsIDppbnQgXSwgOmludAorICAgICAgZW5kKS50byBiZV9hbl9pbnN0YW5jZV9vZiBGRkk6OkZ1bmN0aW9uCisgICAgZW5kCisgICAgaXQgJ3Nob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGUgY2FsbGJhY2sgYXJndW1lbnQnIGRvCisgICAgICBtb2R1bGUgTGliVGVzdAorICAgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAgICAgY2FsbGJhY2sgOmNiX2FyZ3VtZW50LCBbIDppbnQgXSwgOmludAorICAgICAgICBjYWxsYmFjayA6Y2Jfd2l0aF9jYl9hcmd1bWVudCwgWyA6Y2JfYXJndW1lbnQsIDppbnQgXSwgOmludAorICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja0FzQXJndW1lbnQsIDp0ZXN0QXJndW1lbnRDbG9zdXJlLCBbIDpjYl93aXRoX2NiX2FyZ3VtZW50LCA6Y2JfYXJndW1lbnQsIDppbnQgXSwgOmludAorICAgICAgZW5kICAgCisgICAgICBjYWxsYmFja19hcmdfY2FsbGVkID0gZmFsc2UKKyAgICAgIGNhbGxiYWNrX3dpdGhfY2FsbGJhY2tfYXJnX2NhbGxlZCA9IGZhbHNlCisgICAgICBjYWxsYmFja19hcmcgPSBQcm9jLm5ldyBkbyB8dmFsfAorICAgICAgICBjYWxsYmFja19hcmdfY2FsbGVkID0gdHJ1ZQorICAgICAgICB2YWwgKiAyCisgICAgICBlbmQKKyAgICAgIGNhbGxiYWNrX3dpdGhfY2FsbGJhY2tfYXJnID0gUHJvYy5uZXcgZG8gfGNiLCB2YWx8CisgICAgICAgIGNhbGxiYWNrX3dpdGhfY2FsbGJhY2tfYXJnX2NhbGxlZCA9IHRydWUKKyAgICAgICAgY2IuY2FsbCh2YWwpCisgICAgICBlbmQKKyAgICAgIHZhbCA9IExpYlRlc3QudGVzdENhbGxiYWNrQXNBcmd1bWVudChjYWxsYmFja193aXRoX2NhbGxiYWNrX2FyZywgY2FsbGJhY2tfYXJnLCAweGZmMSkKKyAgICAgIGV4cGVjdCh2YWwpLnRvIGVxKDB4ZmYxICogMikKKyAgICAgIGV4cGVjdChjYWxsYmFja19hcmdfY2FsbGVkKS50byBiZSB0cnVlCisgICAgICBleHBlY3QoY2FsbGJhY2tfd2l0aF9jYWxsYmFja19hcmdfY2FsbGVkKS50byBiZSB0cnVlCisgICAgZW5kCisgICAgaXQgJ2Z1bmN0aW9uIHJldHVybnMgY2FsbGFibGUgb2JqZWN0JyBkbworICAgICAgbW9kdWxlIExpYlRlc3QKKyAgICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICAgIGNhbGxiYWNrIDpmdW5jcHRyLCBbIDppbnQgXSwgOmludAorICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RSZXR1cm5zRnVuY3Rpb25Qb2ludGVyLCBbICBdLCA6ZnVuY3B0cgorICAgICAgZW5kCisgICAgICBmID0gTGliVGVzdC50ZXN0UmV0dXJuc0Z1bmN0aW9uUG9pbnRlcgorICAgICAgZXhwZWN0KGYuY2FsbCgzKSkudG8gZXEoNikKKyAgICBlbmQKKyAgZW5kCisKK2VuZAorCisKK2Rlc2NyaWJlICJDYWxsYmFjayB3aXRoICIgZG8KKyAgIworICAjIFRlc3QgY2FsbGJhY2tzIHRoYXQgdGFrZSBhbiBhcmd1bWVudCwgcmV0dXJuaW5nIHZvaWQKKyAgIworICBtb2R1bGUgTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisKKyAgICBjbGFzcyBTOEYzMlMzMiA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOnM4LCA6Y2hhciwgOmYzMiwgOmZsb2F0LCA6czMyLCA6aW50CisgICAgZW5kCisKKyAgICBjYWxsYmFjayA6Y2JTOHJWLCBbIDpjaGFyIF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiVThyViwgWyA6dWNoYXIgXSwgOnZvaWQKKyAgICBjYWxsYmFjayA6Y2JTMTZyViwgWyA6c2hvcnQgXSwgOnZvaWQKKyAgICBjYWxsYmFjayA6Y2JVMTZyViwgWyA6dXNob3J0IF0sIDp2b2lkCisKKyAgICBjYWxsYmFjayA6Y2JaclYsIFsgOmJvb2wgXSwgOnZvaWQKKyAgICBjYWxsYmFjayA6Y2JTMzJyViwgWyA6aW50IF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiVTMyclYsIFsgOnVpbnQgXSwgOnZvaWQKKworICAgIGNhbGxiYWNrIDpjYkxyViwgWyA6bG9uZyBdLCA6dm9pZAorICAgIGNhbGxiYWNrIDpjYlVMclYsIFsgOnVsb25nIF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiQXJWLCBbIDpzdHJpbmcgXSwgOnZvaWQKKyAgICBjYWxsYmFjayA6Y2JQclYsIFsgOnBvaW50ZXJdLCA6dm9pZAorICAgIGNhbGxiYWNrIDpjYllyViwgWyBTOEYzMlMzMi5wdHIgXSwgOnZvaWQKKworICAgIGNhbGxiYWNrIDpjYlM2NHJWLCBbIDpsb25nX2xvbmcgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja0NyViwgOnRlc3RDbG9zdXJlQnJWLCBbIDpjYlM4clYsIDpjaGFyIF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tVOHJWLCA6dGVzdENsb3N1cmVCclYsIFsgOmNiVThyViwgOnVjaGFyIF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tTclYsIDp0ZXN0Q2xvc3VyZVNyViwgWyA6Y2JTMTZyViwgOnNob3J0IF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tVMTZyViwgOnRlc3RDbG9zdXJlU3JWLCBbIDpjYlUxNnJWLCA6dXNob3J0IF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2taclYsIDp0ZXN0Q2xvc3VyZVpyViwgWyA6Y2JaclYsIDpib29sIF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tJclYsIDp0ZXN0Q2xvc3VyZUlyViwgWyA6Y2JTMzJyViwgOmludCBdLCA6dm9pZAorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVTMyclYsIDp0ZXN0Q2xvc3VyZUlyViwgWyA6Y2JVMzJyViwgOnVpbnQgXSwgOnZvaWQKKworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrTHJWLCA6dGVzdENsb3N1cmVMclYsIFsgOmNiTHJWLCA6bG9uZyBdLCA6dm9pZAorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVUxyViwgOnRlc3RDbG9zdXJlVUxyViwgWyA6Y2JVTHJWLCA6dWxvbmcgXSwgOnZvaWQKKworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrTExyViwgOnRlc3RDbG9zdXJlTExyViwgWyA6Y2JTNjRyViwgOmxvbmdfbG9uZyBdLCA6dm9pZAorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrQXJWLCA6dGVzdENsb3N1cmVQclYsIFsgOmNiQXJWLCA6c3RyaW5nIF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tQclYsIDp0ZXN0Q2xvc3VyZVByViwgWyA6Y2JQclYsIDpwb2ludGVyXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1lyViwgOnRlc3RDbG9zdXJlUHJWLCBbIDpjYllyViwgUzhGMzJTMzIuaW4gXSwgOnZvaWQKKyAgZW5kCisKKyAgaXQgImZ1bmN0aW9uIHdpdGggQ2FsbGJhY2sgcGx1cyBhbm90aGVyIGFyZyBzaG91bGQgcmFpc2UgZXJyb3IgaWYgbm8gYXJnIGdpdmVuIiBkbworICAgIGV4cGVjdCB7IExpYlRlc3QudGVzdENhbGxiYWNrQ3JWIHsgfCphfCB9fS50byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAiOmNoYXIgKDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tDclYoMCkgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgwKQorICBlbmQKKworICBpdCAiOmNoYXIgKDEyNykgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja0NyVigxMjcpIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoMTI3KQorICBlbmQKKworICBpdCAiOmNoYXIgKC0xMjgpIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tDclYoLTEyOCkgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgtMTI4KQorICBlbmQKKworICBpdCAiOmNoYXIgKC0xKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrQ3JWKC0xKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKC0xKQorICBlbmQKKworICBpdCAiOnVjaGFyICgwKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrVThyVigwKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDApCisgIGVuZAorCisgIGl0ICI6dWNoYXIgKDEyNykgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1U4clYoMTI3KSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDEyNykKKyAgZW5kCisKKyAgaXQgIjp1Y2hhciAoMTI4KSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrVThyVigxMjgpIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoMTI4KQorICBlbmQKKworICBpdCAiOnVjaGFyICgyNTUpIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tVOHJWKDI1NSkgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgyNTUpCisgIGVuZAorCisgIGl0ICI6c2hvcnQgKDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tTclYoMCkgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgwKQorICBlbmQKKworICBpdCAiOnNob3J0ICgweDdmZmYpIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tTclYoMHg3ZmZmKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDB4N2ZmZikKKyAgZW5kCisKKyAgaXQgIjpzaG9ydCAoLTB4ODAwMCkgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1NyVigtMHg4MDAwKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKC0weDgwMDApCisgIGVuZAorCisgIGl0ICI6c2hvcnQgKC0xKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrU3JWKC0xKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKC0xKQorICBlbmQKKworICBpdCAiOnVzaG9ydCAoMCkgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1UxNnJWKDApIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoMCkKKyAgZW5kCisKKyAgaXQgIjp1c2hvcnQgKDB4N2ZmZikgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1UxNnJWKDB4N2ZmZikgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgweDdmZmYpCisgIGVuZAorCisgIGl0ICI6dXNob3J0ICgweDgwMDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tVMTZyVigweDgwMDApIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoMHg4MDAwKQorICBlbmQKKworICBpdCAiOnVzaG9ydCAoMHhmZmZmKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrVTE2clYoMHhmZmZmKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDB4ZmZmZikKKyAgZW5kCisKKyAgaXQgIjpib29sICh0cnVlKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gZmFsc2UKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1pyVih0cnVlKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGJlIHRydWUKKyAgZW5kCisKKyAgaXQgIjppbnQgKDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tJclYoMCkgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgwKQorICBlbmQKKworICBpdCAiOmludCAoMHg3ZmZmZmZmZikgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja0lyVigweDdmZmZmZmZmKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDB4N2ZmZmZmZmYpCisgIGVuZAorCisgIGl0ICI6aW50ICgtMHg4MDAwMDAwMCkgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja0lyVigtMHg4MDAwMDAwMCkgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgtMHg4MDAwMDAwMCkKKyAgZW5kCisKKyAgaXQgIjppbnQgKC0xKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrSXJWKC0xKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKC0xKQorICBlbmQKKworICBpdCAiOnVpbnQgKDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tVMzJyVigwKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDApCisgIGVuZAorCisgIGl0ICI6dWludCAoMHg3ZmZmZmZmZikgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1UzMnJWKDB4N2ZmZmZmZmYpIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoMHg3ZmZmZmZmZikKKyAgZW5kCisKKyAgaXQgIjp1aW50ICgweDgwMDAwMDAwKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrVTMyclYoMHg4MDAwMDAwMCkgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgweDgwMDAwMDAwKQorICBlbmQKKworICBpdCAiOnVpbnQgKDB4ZmZmZmZmZmYpIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tVMzJyVigweGZmZmZmZmZmKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDB4ZmZmZmZmZmYpCisgIGVuZAorCisgIGl0ICI6bG9uZyAoMCkgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja0xyVigwKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDApCisgIGVuZAorCisgIGl0ICI6bG9uZyAoMHg3ZmZmZmZmZikgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja0xyVigweDdmZmZmZmZmKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDB4N2ZmZmZmZmYpCisgIGVuZAorCisgIGl0ICI6bG9uZyAoLTB4ODAwMDAwMDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tMclYoLTB4ODAwMDAwMDApIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoLTB4ODAwMDAwMDApCisgIGVuZAorCisgIGl0ICI6bG9uZyAoLTEpIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tMclYoLTEpIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoLTEpCisgIGVuZAorCisgIGl0ICI6dWxvbmcgKDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tVTHJWKDApIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoMCkKKyAgZW5kCisKKyAgaXQgIjp1bG9uZyAoMHg3ZmZmZmZmZikgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1VMclYoMHg3ZmZmZmZmZikgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgweDdmZmZmZmZmKQorICBlbmQKKworICBpdCAiOnVsb25nICgweDgwMDAwMDAwKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrVUxyVigweDgwMDAwMDAwKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDB4ODAwMDAwMDApCisgIGVuZAorCisgIGl0ICI6dWxvbmcgKDB4ZmZmZmZmZmYpIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tVTHJWKDB4ZmZmZmZmZmYpIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoMHhmZmZmZmZmZikKKyAgZW5kCisKKyAgaXQgIjpsb25nX2xvbmcgKDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tMTHJWKDApIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoMCkKKyAgZW5kCisKKyAgaXQgIjpsb25nX2xvbmcgKDB4N2ZmZmZmZmZmZmZmZmZmZikgYXJndW1lbnQiIGRvCisgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja0xMclYoMHg3ZmZmZmZmZmZmZmZmZmZmKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKDB4N2ZmZmZmZmZmZmZmZmZmZikKKyAgZW5kCisKKyAgaXQgIjpsb25nX2xvbmcgKC0weDgwMDAwMDAwMDAwMDAwMDApIGFyZ3VtZW50IiBkbworICAgIHYgPSAweGRlYWRiZWVmCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tMTHJWKC0weDgwMDAwMDAwMDAwMDAwMDApIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoLTB4ODAwMDAwMDAwMDAwMDAwMCkKKyAgZW5kCisKKyAgaXQgIjpsb25nX2xvbmcgKC0xKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gMHhkZWFkYmVlZgorICAgIExpYlRlc3QudGVzdENhbGxiYWNrTExyVigtMSkgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2KS50byBlcSgtMSkKKyAgZW5kCisKKyAgaXQgIjpzdHJpbmcgYXJndW1lbnQiIGRvCisgICAgdiA9IG5pbAorICAgIExpYlRlc3QudGVzdENhbGxiYWNrQXJWKCJIZWxsbywgV29ybGQiKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYpLnRvIGVxKCJIZWxsbywgV29ybGQiKQorICBlbmQKKworICBpdCAiOnN0cmluZyAobmlsKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gIkhlbGxvLCBXb3JsZCIKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja0FyVihuaWwpIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gYmVfbmlsCisgIGVuZAorCisgIGl0ICI6cG9pbnRlciBhcmd1bWVudCIgZG8KKyAgICB2ID0gbmlsCisgICAgbWFnaWMgPSBGRkk6OlBvaW50ZXIubmV3KDB4ZGVhZGJlZWYpCisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tQclYobWFnaWMpIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEobWFnaWMpCisgIGVuZAorCisgIGl0ICI6cG9pbnRlciAobmlsKSBhcmd1bWVudCIgZG8KKyAgICB2ID0gIkhlbGxvLCBXb3JsZCIKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1ByVihuaWwpIHsgfGl8IHYgPSBpIH0KKyAgICBleHBlY3QodikudG8gZXEoRkZJOjpQb2ludGVyOjpOVUxMKQorICBlbmQKKworICBpdCAic3RydWN0IGJ5IHJlZmVyZW5jZSBhcmd1bWVudCIgZG8KKyAgICB2ID0gbmlsCisgICAgbWFnaWMgPSBMaWJUZXN0OjpTOEYzMlMzMi5uZXcKKyAgICBMaWJUZXN0LnRlc3RDYWxsYmFja1lyVihtYWdpYykgeyB8aXwgdiA9IGkgfQorICAgIGV4cGVjdCh2LmNsYXNzKS50byBlcShtYWdpYy5jbGFzcykKKyAgICBleHBlY3Qodi5wb2ludGVyKS50byBlcShtYWdpYy5wb2ludGVyKQorICBlbmQKKworICBpdCAic3RydWN0IGJ5IHJlZmVyZW5jZSBhcmd1bWVudCB3aXRoIG5pbCB2YWx1ZSIgZG8KKyAgICB2ID0gTGliVGVzdDo6UzhGMzJTMzIubmV3CisgICAgTGliVGVzdC50ZXN0Q2FsbGJhY2tZclYobmlsKSB7IHxpfCB2ID0gaSB9CisgICAgZXhwZWN0KHYuaXNfYT8oRkZJOjpTdHJ1Y3QpKS50byBiZSB0cnVlCisgICAgZXhwZWN0KHYucG9pbnRlcikudG8gZXEoRkZJOjpQb2ludGVyOjpOVUxMKQorICBlbmQKKworICBpdCAidmFyYXJncyBwYXJhbWV0ZXJzIGFyZSByZWplY3RlZCIgZG8KKyAgICBleHBlY3QgeworICAgICAgTW9kdWxlLm5ldyBkbworICAgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAgICAgY2FsbGJhY2sgOmNiVnJMLCBbIDp2YXJhcmdzIF0sIDpsb25nCisgICAgICBlbmQKKyAgICB9LnRvIHJhaXNlX2Vycm9yKEFyZ3VtZW50RXJyb3IpCisgIGVuZAorCisgICMKKyAgIyBUZXN0IHN0ZGNhbGwgY29udmVudGlvbiB3aXRoIGZ1bmN0aW9uIGFuZCBjYWxsYmFjay4KKyAgIyBUaGlzIGlzIFdpbmRvd3MgMzItYml0IG9ubHkuCisgICMKKyAgaWYgRkZJOjpQbGF0Zm9ybTo6T1MgPX4gL3dpbmRvd3N8Y3lnd2luLyAmJiBGRkk6OlBsYXRmb3JtOjpBUkNIID09ICdpMzg2JworICAgIG1vZHVsZSBMaWJUZXN0U3RkY2FsbAorICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgICAgZmZpX2NvbnZlbnRpb24gOnN0ZGNhbGwKKworICAgICAgY2FsbGJhY2sgOmNiU3RkY2FsbCwgWyA6cG9pbnRlciwgOmxvbmcgXSwgOnZvaWQKKyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrU3RkY2FsbCwgJ3Rlc3RDbG9zdXJlU3RkY2FsbCcsIFsgOnBvaW50ZXIsIDpjYlN0ZGNhbGwsIDpsb25nIF0sIDpib29sCisgICAgZW5kCisKKyAgICBpdCAic3RkY2FsbCBjb252ZW50aW9uIiBkbworICAgICAgdiA9IDB4ZGVhZGJlZWYKKyAgICAgIHBvID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyA6bG9uZworICAgICAgcHIgPSBwcm9je3xhLGl8IHYgPSBhLGk7IGkgfQorICAgICAgcmVzID0gTGliVGVzdFN0ZGNhbGwudGVzdENhbGxiYWNrU3RkY2FsbChwbywgcHIsIDB4N2ZmZmZmZmYpCisgICAgICBleHBlY3QodikudG8gZXEoW3BvLCAweDdmZmZmZmZmXSkKKyAgICAgIGV4cGVjdChyZXMpLnRvIGJlIHRydWUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvY3VzdG9tX3BhcmFtX3R5cGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2N1c3RvbV9wYXJhbV90eXBlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTIxNmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2N1c3RvbV9wYXJhbV90eXBlLnJiCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2Rlc2NyaWJlICJmdW5jdGlvbnMgd2l0aCBjdXN0b20gcGFyYW1ldGVyIHR5cGVzIiBkbworICBiZWZvcmUgOmVhY2ggZG8KKworICAgIEN1c3RvbV9lbnVtID0gQ2xhc3MubmV3IGRvCisgICAgICBleHRlbmQgRkZJOjpEYXRhQ29udmVydGVyCisgICAgICBUb05hdGl2ZU1hcD0geyA6YSA9PiAxLCA6YiA9PiAyIH0KKyAgICAgIEZyb21OYXRpdmVNYXAgPSB7IDEgPT4gOmEsIDIgPT4gOmIgfQorCisgICAgICBkZWYgc2VsZi5uYXRpdmVfdHlwZQorICAgICAgICBAbmF0aXZlX3R5cGVfY2FsbGVkID0gdHJ1ZQorICAgICAgICBGRkk6OlR5cGU6OklOVDMyCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudG9fbmF0aXZlKHZhbCwgY3R4KQorICAgICAgICBAdG9fbmF0aXZlX2NhbGxlZCA9IHRydWUKKyAgICAgICAgVG9OYXRpdmVNYXBbdmFsXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmZyb21fbmF0aXZlKHZhbCwgY3R4KQorICAgICAgICBAZnJvbV9uYXRpdmVfY2FsbGVkID0gdHJ1ZQorICAgICAgICBGcm9tTmF0aXZlTWFwW3ZhbF0KKyAgICAgIGVuZAorICAgICAgZGVmIHNlbGYubmF0aXZlX3R5cGVfY2FsbGVkPzsgQG5hdGl2ZV90eXBlX2NhbGxlZDsgZW5kCisgICAgICBkZWYgc2VsZi5mcm9tX25hdGl2ZV9jYWxsZWQ/OyBAZnJvbV9uYXRpdmVfY2FsbGVkOyBlbmQKKyAgICAgIGRlZiBzZWxmLnRvX25hdGl2ZV9jYWxsZWQ/OyBAdG9fbmF0aXZlX2NhbGxlZDsgZW5kCisgICAgZW5kCisKKyAgICAjIEZJWE1FIGFkZCB0ZXN0cworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9jdXN0b21fdHlwZV9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9jdXN0b21fdHlwZV9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Y2UyYzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2N1c3RvbV90eXBlX3NwZWMucmIKQEAgLTAsMCArMSw3NCBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKworZGVzY3JpYmUgImZ1bmN0aW9ucyB3aXRoIGN1c3RvbSB0eXBlcyIgZG8KKyAgY2xhc3MgQ3VzdG9tX2VudW0KKyAgICBleHRlbmQgRkZJOjpEYXRhQ29udmVydGVyCisgICAgVG9OYXRpdmVNYXA9IHsgOmEgPT4gMSwgOmIgPT4gMiwgOmMgPT4gMyB9CisgICAgRnJvbU5hdGl2ZU1hcCA9IHsgMSA9PiA6YSwgMiA9PiA6YiwgMyA9PiA6YyB9CisKKyAgICBkZWYgc2VsZi5uYXRpdmVfdHlwZQorICAgICAgQG5hdGl2ZV90eXBlX2NhbGxlZCA9IHRydWUKKyAgICAgIEZGSTo6VHlwZTo6SU5UMzIKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLnRvX25hdGl2ZSh2YWwsIGN0eCkKKyAgICAgIEB0b19uYXRpdmVfY2FsbGVkID0gdHJ1ZQorICAgICAgVG9OYXRpdmVNYXBbdmFsXQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuZnJvbV9uYXRpdmUodmFsLCBjdHgpCisgICAgICBAZnJvbV9uYXRpdmVfY2FsbGVkID0gdHJ1ZQorICAgICAgRnJvbU5hdGl2ZU1hcFt2YWxdCisgICAgZW5kCisgICAgZGVmIHNlbGYubmF0aXZlX3R5cGVfY2FsbGVkPzsgQG5hdGl2ZV90eXBlX2NhbGxlZDsgZW5kCisgICAgZGVmIHNlbGYuZnJvbV9uYXRpdmVfY2FsbGVkPzsgQGZyb21fbmF0aXZlX2NhbGxlZDsgZW5kCisgICAgZGVmIHNlbGYudG9fbmF0aXZlX2NhbGxlZD87IEB0b19uYXRpdmVfY2FsbGVkOyBlbmQKKyAgZW5kCisKKyAgaXQgImNhbiBhdHRhY2ggd2l0aCBjdXN0b20gcmV0dXJuIHR5cGUiIGRvCisgICAgZXhwZWN0IGRvCisgICAgICBNb2R1bGUubmV3IGRvCisgICAgICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF9zMzIsIFsgOmludCBdLCBDdXN0b21fZW51bQorICAgICAgZW5kCisgICAgZW5kLm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAic2hvdWxkIHJldHVybiBvYmplY3Qgb2YgY29ycmVjdCB0eXBlIiBkbworCisgICAgbSA9IE1vZHVsZS5uZXcgZG8KKworICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfczMyLCBbIDppbnQgXSwgQ3VzdG9tX2VudW0KKyAgICBlbmQKKworICAgIGV4cGVjdChtLnJldF9zMzIoMSkuaXNfYT8oU3ltYm9sKSkudG8gYmUgdHJ1ZQorICBlbmQKKworICBpdCAiZnJvbV9uYXRpdmUgc2hvdWxkIGJlIGNhbGxlZCBmb3IgcmVzdWx0IiBkbworICAgIG0gPSBNb2R1bGUubmV3IGRvCisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF9zMzIsIFsgOmludCBdLCBDdXN0b21fZW51bQorICAgIGVuZAorICAgIG0ucmV0X3MzMigxKQorICAgIGV4cGVjdChDdXN0b21fZW51bS5mcm9tX25hdGl2ZV9jYWxsZWQ/KS50byBiZSB0cnVlCisgIGVuZAorCisgIGl0ICJ0b19uYXRpdmUgc2hvdWxkIGJlIGNhbGxlZCBmb3IgcGFyYW1ldGVyIiBkbworICAgIG0gPSBNb2R1bGUubmV3IGRvCisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF9zMzIsIFsgQ3VzdG9tX2VudW0gXSwgOmludAorICAgIGVuZAorICAgIG0ucmV0X3MzMig6YSkKKyAgICBleHBlY3QoQ3VzdG9tX2VudW0udG9fbmF0aXZlX2NhbGxlZD8pLnRvIGJlIHRydWUKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZHVwX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2R1cF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNmU1MjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2R1cF9zcGVjLnJiCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2Rlc2NyaWJlICJQb2ludGVyI2R1cCIgZG8gCisgIGl0ICJjbG9uZSBzaG91bGQgYmUgaW5kZXBlbmRlbnQiIGRvCisgICAgcDEgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpjaGFyLCAxMDI0KQorICAgIHAxLnB1dF9zdHJpbmcoMCwgInRlc3QxMjMiKTsKKyAgICBwMiA9IHAxLmR1cAorICAgIHAxLnB1dF9zdHJpbmcoMCwgImRlYWRiZWVmIikKKyAgICAKKyAgICBleHBlY3QocDIuZ2V0X3N0cmluZygwKSkudG8gZXEoInRlc3QxMjMiKQorICBlbmQKKyAgCisgIGl0ICJzbGljZWQgcG9pbnRlciBjYW4gYmUgY2xvbmVkIiBkbworICAgIHAxID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyg6Y2hhciwgMTAyNCkKKyAgICBwMS5wdXRfc3RyaW5nKDAsICJ0ZXN0MTIzIik7CisgICAgcDIgPSBwMVsxXS5kdXAKKyAgICAKKyAgICAjIGZpcnN0IGNoYXIgd2lsbCBiZSBleGNpc2VkCisgICAgZXhwZWN0KHAyLmdldF9zdHJpbmcoMCkpLnRvIGVxKCJlc3QxMjMiKQorICAgIGV4cGVjdChwMS5nZXRfc3RyaW5nKDApKS50byBlcSgidGVzdDEyMyIpCisgIGVuZAorICAKKyAgaXQgInNsaWNlZCBwb2ludGVyIHdoZW4gY2xvbmVkIGlzIGluZGVwZW5kZW50IiBkbworICAgIHAxID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyg6Y2hhciwgMTAyNCkKKyAgICBwMS5wdXRfc3RyaW5nKDAsICJ0ZXN0MTIzIik7CisgICAgcDIgPSBwMVsxXS5kdXAKKyAgICAKKyAgICBwMS5wdXRfc3RyaW5nKDAsICJkZWFkYmVlZiIpCisgICAgIyBmaXJzdCBjaGFyIHdpbGwgYmUgZXhjaXNlZAorICAgIGV4cGVjdChwMi5nZXRfc3RyaW5nKDApKS50byBlcSgiZXN0MTIzIikKKyAgZW5kCitlbmQKKworCitkZXNjcmliZSAiU3RydWN0I2R1cCIgZG8KKyAgaXQgImNsb25lIHNob3VsZCBiZSBpbmRlcGVuZGVudCIgZG8KKyAgICBzID0gQ2xhc3MubmV3KEZGSTo6U3RydWN0KSBkbworICAgICAgbGF5b3V0IDppLCA6aW50CisgICAgZW5kCisgICAgczEgPSBzLm5ldworICAgIHMxWzppXSA9IDB4MTIzNDUKKyAgICBzMiA9IHMxLmR1cAorICAgIHMxWzppXSA9IDB4OTg3NjUKKyAgICBleHBlY3QoczJbOmldKS50byBlcSgweDEyMzQ1KQorICAgIGV4cGVjdChzMVs6aV0pLnRvIGVxKDB4OTg3NjUpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2VudW1fc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZW51bV9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmYxM2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2VudW1fc3BlYy5yYgpAQCAtMCwwICsxLDQyMyBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKworbW9kdWxlIFRlc3RFbnVtMAorICBleHRlbmQgRkZJOjpMaWJyYXJ5CitlbmQKKworbW9kdWxlIFRlc3RFbnVtMQorICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKworICBlbnVtIFs6YzEsIDpjMiwgOmMzLCA6YzRdCisgIGVudW0gWzpjNSwgNDIsIDpjNiwgOmM3LCA6YzhdCisgIGVudW0gWzpjOSwgNDIsIDpjMTAsIDpjMTEsIDQyNDIsIDpjMTJdCisgIGVudW0gWzpjMTMsIDQyLCA6YzE0LCA0MjQyLCA6YzE1LCA0MjQyNDIsIDpjMTYsIDQyNDI0MjQyXQorICAKKyAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0X3VudGFnZ2VkX2VudW0sIFs6aW50XSwgOmludAorZW5kCisKK21vZHVsZSBUZXN0RW51bTMKKyAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisKKyAgZW51bSA6ZW51bV90eXBlMSwgWzpjMSwgOmMyLCA6YzMsIDpjNF0KKyAgZW51bSA6ZW51bV90eXBlMiwgWzpjNSwgNDIsIDpjNiwgOmM3LCA6YzhdCisgIGVudW0gOmVudW1fdHlwZTMsIFs6YzksIDQyLCA6YzEwLCA6YzExLCA0MjQyLCA6YzEyXQorICBlbnVtIDplbnVtX3R5cGU0LCBbOmMxMywgNDIsIDpjMTQsIDQyNDIsIDpjMTUsIDQyNDI0MiwgOmMxNiwgNDI0MjQyNDJdCisKKyAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0xLCBbOmVudW1fdHlwZTFdLCA6ZW51bV90eXBlMQorICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTIsIFs6ZW51bV90eXBlMl0sIDplbnVtX3R5cGUyCisgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMywgWzplbnVtX3R5cGUzXSwgOmVudW1fdHlwZTMKKyAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW00LCBbOmVudW1fdHlwZTRdLCA6ZW51bV90eXBlNAorZW5kCisKK21vZHVsZSBUZXN0RW51bTQKKyAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisKKyAgZW51bSBbOmMxLCA6YzIsIDpjMywgOmM0XQorICBlbnVtIDplbnVtX3R5cGUxLCBbOmM1LCAweDQyLCA6YzYsIDpjNywgOmM4XQorICBlbnVtIDplbnVtX3R5cGUyLCBbOmM5LCAweDQyLCA6YzEwLCA6YzExLCAweDQyNDIsIDpjMTJdCisgIGVudW0gOmVudW1fdHlwZTMsIFs6YzEzLCAweDQyLCA6YzE0LCAweDQyNDIsIDpjMTUsIDB4NDI0MjQyNDIsIDpjMTYsIDB4NDI0MjQyNDI0MjQyNDI0Ml0KKyAgZW51bSBGRkk6OlR5cGU6OlVJTlQxNiwgOmVudW1fdHlwZTQsIFs6YzE3LCAweDQyLCA6YzE4LCA6YzE5LCA6YzIwXQorICBlbnVtIEZGSTo6VHlwZTo6VUlOVDMyLCA6ZW51bV90eXBlNSwgWzpjMjEsIDB4NDIsIDpjMjIsIDpjMjMsIDB4NDI0MiwgOmMyNF0KKyAgZW51bSBGRkk6OlR5cGU6OlVJTlQ2NCwgOmVudW1fdHlwZTYsIFs6YzI1LCAweDQyLCA6YzI2LCAweDQyNDIsIDpjMjcsIDB4NDI0MjQyNDIsIDpjMjgsIDB4NDI0MjQyNDI0MjQyNDI0Ml0KKyAgZW51bSBGRkk6OlR5cGU6OlVJTlQ2NCwgWzpjMjksIDB4NDI0MjQyNDI0MjQyNDI0MiwgOmMzMCwgOmMzMSwgOmMzMl0KKworICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RfdW50YWdnZWRfbm9uaW50X2VudW0sIFs6dWludDhdLCAgOnVpbnQ4CisgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdF90YWdnZWRfbm9uaW50X2VudW0xLCAgWzp1aW50MTZdLCA6dWludDE2CisgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdF90YWdnZWRfbm9uaW50X2VudW0yLCAgWzp1aW50MzJdLCA6dWludDMyCisgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdF90YWdnZWRfbm9uaW50X2VudW0zLCAgWzp1aW50NjRdLCA6dWludDY0CisgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdF90YWdnZWRfbm9uaW50X2VudW00LCA6dGVzdF90YWdnZWRfbm9uaW50X2VudW0xLCAgWzplbnVtX3R5cGU0XSwgOmVudW1fdHlwZTQKKyAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTUsIDp0ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTIsICBbOmVudW1fdHlwZTVdLCA6ZW51bV90eXBlNQorICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RfdGFnZ2VkX25vbmludF9lbnVtNiwgOnRlc3RfdGFnZ2VkX25vbmludF9lbnVtMywgIFs6ZW51bV90eXBlNl0sIDplbnVtX3R5cGU2CitlbmQKKworZGVzY3JpYmUgIkEgbGlicmFyeSB3aXRoIG5vIGVudW0gZGVmaW5lZCIgZG8KKyAgaXQgInJldHVybnMgbmlsIHdoZW4gYXNrZWQgZm9yIGFuIGVudW0iIGRvCisgICAgZXhwZWN0KFRlc3RFbnVtMC5lbnVtX3R5cGUoOmZvbykpLnRvIGJlX25pbAorICBlbmQKK2VuZAorCitkZXNjcmliZSAiQW4gdW50YWdnZWQgZW51bSIgZG8KKyAgaXQgImNvbnN0YW50cyBjYW4gYmUgdXNlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWUiIGRvCisgICAgZXhwZWN0KFRlc3RFbnVtMS50ZXN0X3VudGFnZ2VkX2VudW0oOmMxKSkudG8gZXEoMCkKKyAgICBleHBlY3QoVGVzdEVudW0xLnRlc3RfdW50YWdnZWRfZW51bSg6YzIpKS50byBlcSgxKQorICAgIGV4cGVjdChUZXN0RW51bTEudGVzdF91bnRhZ2dlZF9lbnVtKDpjMykpLnRvIGVxKDIpCisgICAgZXhwZWN0KFRlc3RFbnVtMS50ZXN0X3VudGFnZ2VkX2VudW0oOmM0KSkudG8gZXEoMykKKyAgICBleHBlY3QoVGVzdEVudW0xLnRlc3RfdW50YWdnZWRfZW51bSg6YzUpKS50byBlcSg0MikKKyAgICBleHBlY3QoVGVzdEVudW0xLnRlc3RfdW50YWdnZWRfZW51bSg6YzYpKS50byBlcSg0MykKKyAgICBleHBlY3QoVGVzdEVudW0xLnRlc3RfdW50YWdnZWRfZW51bSg6YzcpKS50byBlcSg0NCkKKyAgICBleHBlY3QoVGVzdEVudW0xLnRlc3RfdW50YWdnZWRfZW51bSg6YzgpKS50byBlcSg0NSkKKyAgICBleHBlY3QoVGVzdEVudW0xLnRlc3RfdW50YWdnZWRfZW51bSg6YzkpKS50byBlcSg0MikKKyAgICBleHBlY3QoVGVzdEVudW0xLnRlc3RfdW50YWdnZWRfZW51bSg6YzEwKSkudG8gZXEoNDMpCisgICAgZXhwZWN0KFRlc3RFbnVtMS50ZXN0X3VudGFnZ2VkX2VudW0oOmMxMSkpLnRvIGVxKDQyNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtMS50ZXN0X3VudGFnZ2VkX2VudW0oOmMxMikpLnRvIGVxKDQyNDMpCisgICAgZXhwZWN0KFRlc3RFbnVtMS50ZXN0X3VudGFnZ2VkX2VudW0oOmMxMykpLnRvIGVxKDQyKQorICAgIGV4cGVjdChUZXN0RW51bTEudGVzdF91bnRhZ2dlZF9lbnVtKDpjMTQpKS50byBlcSg0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTEudGVzdF91bnRhZ2dlZF9lbnVtKDpjMTUpKS50byBlcSg0MjQyNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtMS50ZXN0X3VudGFnZ2VkX2VudW0oOmMxNikpLnRvIGVxKDQyNDI0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF91bnRhZ2dlZF9ub25pbnRfZW51bSg6YzEpKS50byBlcSgwKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF91bnRhZ2dlZF9ub25pbnRfZW51bSg6YzIpKS50byBlcSgxKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF91bnRhZ2dlZF9ub25pbnRfZW51bSg6YzMpKS50byBlcSgyKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF91bnRhZ2dlZF9ub25pbnRfZW51bSg6YzQpKS50byBlcSgzKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW0zKDpjMjkpKS50byBlcSgweDQyNDI0MjQyNDI0MjQyNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTMoOmMzMCkpLnRvIGVxKDB4NDI0MjQyNDI0MjQyNDI0MykKKyAgICBleHBlY3QoVGVzdEVudW00LnRlc3RfdGFnZ2VkX25vbmludF9lbnVtMyg6YzMxKSkudG8gZXEoMHg0MjQyNDI0MjQyNDI0MjQ0KQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW0zKDpjMzIpKS50byBlcSgweDQyNDI0MjQyNDI0MjQyNDUpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJBIHRhZ2dlZCB0eXBlZGVmIGVudW0iIGRvCisgIGl0ICJpcyBhY2Nlc3NpYmxlIHRocm91Z2ggaXRzIHRhZyIgZG8KKyAgICBleHBlY3QoVGVzdEVudW0zLmVudW1fdHlwZSg6ZW51bV90eXBlMSkpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW0zLmVudW1fdHlwZSg6ZW51bV90eXBlMikpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW0zLmVudW1fdHlwZSg6ZW51bV90eXBlMykpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW0zLmVudW1fdHlwZSg6ZW51bV90eXBlNCkpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlMSkpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlMikpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlMykpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlNCkpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlNSkpLm5vdF90byBiZV9uaWwKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlNikpLm5vdF90byBiZV9uaWwKKyAgZW5kCisKKyAgaXQgImNvbnRhaW5zIGVudW0gY29uc3RhbnRzIiBkbworICAgIGV4cGVjdChUZXN0RW51bTMuZW51bV90eXBlKDplbnVtX3R5cGUxKS5zeW1ib2xzLmxlbmd0aCkudG8gZXEoNCkKKyAgICBleHBlY3QoVGVzdEVudW0zLmVudW1fdHlwZSg6ZW51bV90eXBlMikuc3ltYm9scy5sZW5ndGgpLnRvIGVxKDQpCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3R5cGUoOmVudW1fdHlwZTMpLnN5bWJvbHMubGVuZ3RoKS50byBlcSg0KQorICAgIGV4cGVjdChUZXN0RW51bTMuZW51bV90eXBlKDplbnVtX3R5cGU0KS5zeW1ib2xzLmxlbmd0aCkudG8gZXEoNCkKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlMSkuc3ltYm9scy5sZW5ndGgpLnRvIGVxKDQpCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3R5cGUoOmVudW1fdHlwZTIpLnN5bWJvbHMubGVuZ3RoKS50byBlcSg0KQorICAgIGV4cGVjdChUZXN0RW51bTQuZW51bV90eXBlKDplbnVtX3R5cGUzKS5zeW1ib2xzLmxlbmd0aCkudG8gZXEoNCkKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlNCkuc3ltYm9scy5sZW5ndGgpLnRvIGVxKDQpCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3R5cGUoOmVudW1fdHlwZTUpLnN5bWJvbHMubGVuZ3RoKS50byBlcSg0KQorICAgIGV4cGVjdChUZXN0RW51bTQuZW51bV90eXBlKDplbnVtX3R5cGU2KS5zeW1ib2xzLmxlbmd0aCkudG8gZXEoNCkKKyAgZW5kCisKKyAgaXQgImNvbnN0YW50cyBjYW4gYmUgdXNlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWUiIGRvCisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0xKDpjMSkpLnRvIGJlIDpjMQorICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMSg6YzIpKS50byBiZSA6YzIKKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTEoOmMzKSkudG8gYmUgOmMzCisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0xKDpjNCkpLnRvIGJlIDpjNAorICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMig6YzUpKS50byBiZSA6YzUKKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTIoOmM2KSkudG8gYmUgOmM2CisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0yKDpjNykpLnRvIGJlIDpjNworICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMig6YzgpKS50byBiZSA6YzgKKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTMoOmM5KSkudG8gYmUgOmM5CisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0zKDpjMTApKS50byBiZSA6YzEwCisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0zKDpjMTEpKS50byBiZSA6YzExCisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0zKDpjMTIpKS50byBiZSA6YzEyCisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW00KDpjMTMpKS50byBiZSA6YzEzCisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW00KDpjMTQpKS50byBiZSA6YzE0CisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW00KDpjMTUpKS50byBiZSA6YzE1CisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW00KDpjMTYpKS50byBiZSA6YzE2CisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTEoOmM1KSkudG8gZXEoMHg0MikKKyAgICBleHBlY3QoVGVzdEVudW00LnRlc3RfdGFnZ2VkX25vbmludF9lbnVtMSg6YzYpKS50byBlcSgweDQzKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW0xKDpjNykpLnRvIGVxKDB4NDQpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTEoOmM4KSkudG8gZXEoMHg0NSkKKyAgICBleHBlY3QoVGVzdEVudW00LnRlc3RfdGFnZ2VkX25vbmludF9lbnVtMig6YzkpKS50byBlcSgweDQyKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW0yKDpjMTApKS50byBlcSgweDQzKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW0yKDpjMTEpKS50byBlcSgweDQyNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTIoOmMxMikpLnRvIGVxKDB4NDI0MykKKyAgICBleHBlY3QoVGVzdEVudW00LnRlc3RfdGFnZ2VkX25vbmludF9lbnVtMyg6YzEzKSkudG8gZXEoMHg0MikKKyAgICBleHBlY3QoVGVzdEVudW00LnRlc3RfdGFnZ2VkX25vbmludF9lbnVtMyg6YzE0KSkudG8gZXEoMHg0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW0zKDpjMTUpKS50byBlcSgweDQyNDI0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW0zKDpjMTYpKS50byBlcSgweDQyNDI0MjQyNDI0MjQyNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTQoOmMxNykpLnRvIGVxKDpjMTcpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTQoOmMxOCkpLnRvIGVxKDpjMTgpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTQoOmMxOSkpLnRvIGVxKDpjMTkpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTQoOmMyMCkpLnRvIGVxKDpjMjApCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTUoOmMyMSkpLnRvIGVxKDpjMjEpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTUoOmMyMikpLnRvIGVxKDpjMjIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTUoOmMyMykpLnRvIGVxKDpjMjMpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTUoOmMyNCkpLnRvIGVxKDpjMjQpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTYoOmMyNSkpLnRvIGVxKDpjMjUpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTYoOmMyNikpLnRvIGVxKDpjMjYpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTYoOmMyNykpLnRvIGVxKDpjMjcpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTYoOmMyOCkpLnRvIGVxKDpjMjgpCisgIGVuZAorCisgIGl0ICJpbnRlZ2VycyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGNvbnN0YW50cyIgZG8KKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTEoMCkpLnRvIGJlIDpjMQorICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMSgxKSkudG8gYmUgOmMyCisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0xKDIpKS50byBiZSA6YzMKKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTEoMykpLnRvIGJlIDpjNAorICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMig0MikpLnRvIGJlIDpjNQorICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMig0MykpLnRvIGJlIDpjNgorICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMig0NCkpLnRvIGJlIDpjNworICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMig0NSkpLnRvIGJlIDpjOAorICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMyg0MikpLnRvIGJlIDpjOQorICAgIGV4cGVjdChUZXN0RW51bTMudGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMyg0MykpLnRvIGJlIDpjMTAKKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTMoNDI0MikpLnRvIGJlIDpjMTEKKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTMoNDI0MykpLnRvIGJlIDpjMTIKKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTQoNDIpKS50byBiZSA6YzEzCisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW00KDQyNDIpKS50byBiZSA6YzE0CisgICAgZXhwZWN0KFRlc3RFbnVtMy50ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW00KDQyNDI0MikpLnRvIGJlIDpjMTUKKyAgICBleHBlY3QoVGVzdEVudW0zLnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTQoNDI0MjQyNDIpKS50byBiZSA6YzE2CisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTQoMHg0MikpLnRvIGVxKDpjMTcpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTQoMHg0MykpLnRvIGVxKDpjMTgpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTQoMHg0NCkpLnRvIGVxKDpjMTkpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTQoMHg0NSkpLnRvIGVxKDpjMjApCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTUoMHg0MikpLnRvIGVxKDpjMjEpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTUoMHg0MykpLnRvIGVxKDpjMjIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTUoMHg0MjQyKSkudG8gZXEoOmMyMykKKyAgICBleHBlY3QoVGVzdEVudW00LnRlc3RfdGFnZ2VkX25vbmludF9lbnVtNSgweDQyNDMpKS50byBlcSg6YzI0KQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW02KDB4NDIpKS50byBlcSg6YzI1KQorICAgIGV4cGVjdChUZXN0RW51bTQudGVzdF90YWdnZWRfbm9uaW50X2VudW02KDB4NDI0MikpLnRvIGVxKDpjMjYpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTYoMHg0MjQyNDI0MikpLnRvIGVxKDpjMjcpCisgICAgZXhwZWN0KFRlc3RFbnVtNC50ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTYoMHg0MjQyNDI0MjQyNDI0MjQyKSkudG8gZXEoOmMyOCkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkFsbCBlbnVtcyIgZG8KKyAgaXQgImhhdmUgYXV0b251bWJlcmVkIGNvbnN0YW50cyB3aGVuIGRlZmluZWQgd2l0aCBuYW1lcyBvbmx5IiBkbworICAgIGV4cGVjdChUZXN0RW51bTEuZW51bV92YWx1ZSg6YzEpKS50byBlcSgwKQorICAgIGV4cGVjdChUZXN0RW51bTEuZW51bV92YWx1ZSg6YzIpKS50byBlcSgxKQorICAgIGV4cGVjdChUZXN0RW51bTEuZW51bV92YWx1ZSg6YzMpKS50byBlcSgyKQorICAgIGV4cGVjdChUZXN0RW51bTEuZW51bV92YWx1ZSg6YzQpKS50byBlcSgzKQorCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjMSkpLnRvIGVxKDApCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjMikpLnRvIGVxKDEpCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjMykpLnRvIGVxKDIpCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjNCkpLnRvIGVxKDMpCisKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMxKSkudG8gZXEoMCkKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMyKSkudG8gZXEoMSkKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMzKSkudG8gZXEoMikKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmM0KSkudG8gZXEoMykKKyAgZW5kCisKKyAgaXQgImNhbiBoYXZlIGFuIGV4cGxpY2l0IGZpcnN0IGNvbnN0YW50IGFuZCBhdXRvbnVtYmVyZWQgc3Vic2VxdWVudCBjb25zdGFudHMiIGRvCisgICAgZXhwZWN0KFRlc3RFbnVtMS5lbnVtX3ZhbHVlKDpjNSkpLnRvIGVxKDQyKQorICAgIGV4cGVjdChUZXN0RW51bTEuZW51bV92YWx1ZSg6YzYpKS50byBlcSg0MykKKyAgICBleHBlY3QoVGVzdEVudW0xLmVudW1fdmFsdWUoOmM3KSkudG8gZXEoNDQpCisgICAgZXhwZWN0KFRlc3RFbnVtMS5lbnVtX3ZhbHVlKDpjOCkpLnRvIGVxKDQ1KQorCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjNSkpLnRvIGVxKDQyKQorICAgIGV4cGVjdChUZXN0RW51bTMuZW51bV92YWx1ZSg6YzYpKS50byBlcSg0MykKKyAgICBleHBlY3QoVGVzdEVudW0zLmVudW1fdmFsdWUoOmM3KSkudG8gZXEoNDQpCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjOCkpLnRvIGVxKDQ1KQorCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjNSkpLnRvIGVxKDB4NDIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjNikpLnRvIGVxKDB4NDMpCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjNykpLnRvIGVxKDB4NDQpCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjOCkpLnRvIGVxKDB4NDUpCisKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMyOSkpLnRvIGVxKDB4NDI0MjQyNDI0MjQyNDI0MikKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMzMCkpLnRvIGVxKDB4NDI0MjQyNDI0MjQyNDI0MykKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMzMSkpLnRvIGVxKDB4NDI0MjQyNDI0MjQyNDI0NCkKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMzMikpLnRvIGVxKDB4NDI0MjQyNDI0MjQyNDI0NSkKKyAgZW5kCisKKyAgaXQgImNhbiBoYXZlIGEgbWl4IG9mIGV4cGxpY2l0IGFuZCBhdXRvbnVtYmVyZWQgY29uc3RhbnRzIiBkbworICAgIGV4cGVjdChUZXN0RW51bTEuZW51bV92YWx1ZSg6YzkpKS50byBlcSg0MikKKyAgICBleHBlY3QoVGVzdEVudW0xLmVudW1fdmFsdWUoOmMxMCkpLnRvIGVxKDQzKQorICAgIGV4cGVjdChUZXN0RW51bTEuZW51bV92YWx1ZSg6YzExKSkudG8gZXEoNDI0MikKKyAgICBleHBlY3QoVGVzdEVudW0xLmVudW1fdmFsdWUoOmMxMikpLnRvIGVxKDQyNDMpCisKKyAgICBleHBlY3QoVGVzdEVudW0zLmVudW1fdmFsdWUoOmM5KSkudG8gZXEoNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjMTApKS50byBlcSg0MykKKyAgICBleHBlY3QoVGVzdEVudW0zLmVudW1fdmFsdWUoOmMxMSkpLnRvIGVxKDQyNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjMTIpKS50byBlcSg0MjQzKQorCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjOSkpLnRvIGVxKDB4NDIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjMTApKS50byBlcSgweDQzKQorICAgIGV4cGVjdChUZXN0RW51bTQuZW51bV92YWx1ZSg6YzExKSkudG8gZXEoMHg0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTQuZW51bV92YWx1ZSg6YzEyKSkudG8gZXEoMHg0MjQzKQorCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjMjEpKS50byBlcSgweDQyKQorICAgIGV4cGVjdChUZXN0RW51bTQuZW51bV92YWx1ZSg6YzIyKSkudG8gZXEoMHg0MykKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMyMykpLnRvIGVxKDB4NDI0MikKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMyNCkpLnRvIGVxKDB4NDI0MykKKyAgZW5kCisKKyAgaXQgImNhbiBoYXZlIGFsbCBpdHMgY29uc3RhbnRzIGV4cGxpY2l0ZWx5IHZhbHVlZCIgZG8KKyAgICBleHBlY3QoVGVzdEVudW0xLmVudW1fdmFsdWUoOmMxMykpLnRvIGVxKDQyKQorICAgIGV4cGVjdChUZXN0RW51bTEuZW51bV92YWx1ZSg6YzE0KSkudG8gZXEoNDI0MikKKyAgICBleHBlY3QoVGVzdEVudW0xLmVudW1fdmFsdWUoOmMxNSkpLnRvIGVxKDQyNDI0MikKKyAgICBleHBlY3QoVGVzdEVudW0xLmVudW1fdmFsdWUoOmMxNikpLnRvIGVxKDQyNDI0MjQyKQorICAgIAorICAgIGV4cGVjdChUZXN0RW51bTMuZW51bV92YWx1ZSg6YzEzKSkudG8gZXEoNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtMy5lbnVtX3ZhbHVlKDpjMTQpKS50byBlcSg0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTMuZW51bV92YWx1ZSg6YzE1KSkudG8gZXEoNDI0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTMuZW51bV92YWx1ZSg6YzE2KSkudG8gZXEoNDI0MjQyNDIpCisKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMxMykpLnRvIGVxKDB4NDIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjMTQpKS50byBlcSgweDQyNDIpCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjMTUpKS50byBlcSgweDQyNDI0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTQuZW51bV92YWx1ZSg6YzE2KSkudG8gZXEoMHg0MjQyNDI0MjQyNDI0MjQyKQorCisgICAgZXhwZWN0KFRlc3RFbnVtNC5lbnVtX3ZhbHVlKDpjMjUpKS50byBlcSgweDQyKQorICAgIGV4cGVjdChUZXN0RW51bTQuZW51bV92YWx1ZSg6YzI2KSkudG8gZXEoMHg0MjQyKQorICAgIGV4cGVjdChUZXN0RW51bTQuZW51bV92YWx1ZSg6YzI3KSkudG8gZXEoMHg0MjQyNDI0MikKKyAgICBleHBlY3QoVGVzdEVudW00LmVudW1fdmFsdWUoOmMyOCkpLnRvIGVxKDB4NDI0MjQyNDI0MjQyNDI0MikKKyAgZW5kCisKKyAgaXQgInJldHVybiB0aGUgY29uc3RhbnQgY29ycmVzcG9uZGluZyB0byBhIHNwZWNpZmljIHZhbHVlIiBkbworICAgIGVudW0gPSBUZXN0RW51bTMuZW51bV90eXBlKDplbnVtX3R5cGUxKQorICAgIGV4cGVjdChlbnVtWzBdKS50byBiZSA6YzEKKyAgICBleHBlY3QoZW51bVsxXSkudG8gYmUgOmMyCisgICAgZXhwZWN0KGVudW1bMl0pLnRvIGJlIDpjMworICAgIGV4cGVjdChlbnVtWzNdKS50byBiZSA6YzQKKworICAgIGVudW0gPSBUZXN0RW51bTMuZW51bV90eXBlKDplbnVtX3R5cGUyKQorICAgIGV4cGVjdChlbnVtWzQyXSkudG8gYmUgOmM1CisgICAgZXhwZWN0KGVudW1bNDNdKS50byBiZSA6YzYKKyAgICBleHBlY3QoZW51bVs0NF0pLnRvIGJlIDpjNworICAgIGV4cGVjdChlbnVtWzQ1XSkudG8gYmUgOmM4CisKKyAgICBlbnVtID0gVGVzdEVudW0zLmVudW1fdHlwZSg6ZW51bV90eXBlMykKKyAgICBleHBlY3QoZW51bVs0Ml0pLnRvIGJlIDpjOQorICAgIGV4cGVjdChlbnVtWzQzXSkudG8gYmUgOmMxMAorICAgIGV4cGVjdChlbnVtWzQyNDJdKS50byBiZSA6YzExCisgICAgZXhwZWN0KGVudW1bNDI0M10pLnRvIGJlIDpjMTIKKworICAgIGVudW0gPSBUZXN0RW51bTMuZW51bV90eXBlKDplbnVtX3R5cGU0KQorICAgIGV4cGVjdChlbnVtWzQyXSkudG8gYmUgOmMxMworICAgIGV4cGVjdChlbnVtWzQyNDJdKS50byBiZSA6YzE0CisgICAgZXhwZWN0KGVudW1bNDI0MjQyXSkudG8gYmUgOmMxNQorICAgIGV4cGVjdChlbnVtWzQyNDI0MjQyXSkudG8gYmUgOmMxNgorCisgICAgZW51bSA9IFRlc3RFbnVtNC5lbnVtX3R5cGUoOmVudW1fdHlwZTEpCisgICAgZXhwZWN0KGVudW1bMHg0Ml0pLnRvIGVxKDpjNSkKKyAgICBleHBlY3QoZW51bVsweDQzXSkudG8gZXEoOmM2KQorICAgIGV4cGVjdChlbnVtWzB4NDRdKS50byBlcSg6YzcpCisgICAgZXhwZWN0KGVudW1bMHg0NV0pLnRvIGVxKDpjOCkKKworICAgIGVudW0gPSBUZXN0RW51bTQuZW51bV90eXBlKDplbnVtX3R5cGUyKQorICAgIGV4cGVjdChlbnVtWzB4NDJdKS50byBlcSg6YzkpCisgICAgZXhwZWN0KGVudW1bMHg0M10pLnRvIGVxKDpjMTApCisgICAgZXhwZWN0KGVudW1bMHg0MjQyXSkudG8gZXEoOmMxMSkKKyAgICBleHBlY3QoZW51bVsweDQyNDNdKS50byBlcSg6YzEyKQorCisgICAgZW51bSA9IFRlc3RFbnVtNC5lbnVtX3R5cGUoOmVudW1fdHlwZTMpCisgICAgZXhwZWN0KGVudW1bMHg0Ml0pLnRvIGVxKDpjMTMpCisgICAgZXhwZWN0KGVudW1bMHg0MjQyXSkudG8gZXEoOmMxNCkKKyAgICBleHBlY3QoZW51bVsweDQyNDI0MjQyXSkudG8gZXEoOmMxNSkKKyAgICBleHBlY3QoZW51bVsweDQyNDI0MjQyNDI0MjQyNDJdKS50byBlcSg6YzE2KQorCisgICAgZW51bSA9IFRlc3RFbnVtNC5lbnVtX3R5cGUoOmVudW1fdHlwZTQpCisgICAgZXhwZWN0KGVudW1bMHg0Ml0pLnRvIGVxKDpjMTcpCisgICAgZXhwZWN0KGVudW1bMHg0M10pLnRvIGVxKDpjMTgpCisgICAgZXhwZWN0KGVudW1bMHg0NF0pLnRvIGVxKDpjMTkpCisgICAgZXhwZWN0KGVudW1bMHg0NV0pLnRvIGVxKDpjMjApCisKKyAgICBlbnVtID0gVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlNSkKKyAgICBleHBlY3QoZW51bVsweDQyXSkudG8gZXEoOmMyMSkKKyAgICBleHBlY3QoZW51bVsweDQzXSkudG8gZXEoOmMyMikKKyAgICBleHBlY3QoZW51bVsweDQyNDJdKS50byBlcSg6YzIzKQorICAgIGV4cGVjdChlbnVtWzB4NDI0M10pLnRvIGVxKDpjMjQpCisKKyAgICBlbnVtID0gVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlNikKKyAgICBleHBlY3QoZW51bVsweDQyXSkudG8gZXEoOmMyNSkKKyAgICBleHBlY3QoZW51bVsweDQyNDJdKS50byBlcSg6YzI2KQorICAgIGV4cGVjdChlbnVtWzB4NDI0MjQyNDJdKS50byBlcSg6YzI3KQorICAgIGV4cGVjdChlbnVtWzB4NDI0MjQyNDI0MjQyNDI0Ml0pLnRvIGVxKDpjMjgpCisgIGVuZAorCisgIGl0ICJyZXR1cm4gbmlsIGZvciB2YWx1ZXMgdGhhdCBkb24ndCBoYXZlIGEgc3ltYm9sIiBkbworICAgIGVudW0gPSBUZXN0RW51bTMuZW51bV90eXBlKDplbnVtX3R5cGUxKQorICAgIGV4cGVjdChlbnVtWy0xXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bNF0pLnRvIGJlX25pbAorCisgICAgZW51bSA9IFRlc3RFbnVtMy5lbnVtX3R5cGUoOmVudW1fdHlwZTIpCisgICAgZXhwZWN0KGVudW1bMF0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzQxXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bNDZdKS50byBiZV9uaWwKKworICAgIGVudW0gPSBUZXN0RW51bTMuZW51bV90eXBlKDplbnVtX3R5cGUzKQorICAgIGV4cGVjdChlbnVtWzBdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVs0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzQ0XSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bNDI0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzQyNDRdKS50byBiZV9uaWwKKworICAgIGVudW0gPSBUZXN0RW51bTMuZW51bV90eXBlKDplbnVtX3R5cGU0KQorICAgIGV4cGVjdChlbnVtWzBdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVs0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzQzXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bNDI0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzQyNDNdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVs0MjQyNDFdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVs0MjQyNDNdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVs0MjQyNDI0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzQyNDI0MjQzXSkudG8gYmVfbmlsCisKKyAgICBlbnVtID0gVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlMSkKKyAgICBleHBlY3QoZW51bVsweDBdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQxXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bMHg0Nl0pLnRvIGJlX25pbAorCisgICAgZW51bSA9IFRlc3RFbnVtNC5lbnVtX3R5cGUoOmVudW1fdHlwZTIpCisgICAgZXhwZWN0KGVudW1bMHgwXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bMHg0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDRdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQyNDFdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQyNDRdKS50byBiZV9uaWwKKworICAgIGVudW0gPSBUZXN0RW51bTQuZW51bV90eXBlKDplbnVtX3R5cGUzKQorICAgIGV4cGVjdChlbnVtWzB4MF0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDFdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQzXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bMHg0MjQxXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bMHg0MjQzXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bMHg0MjQyNDI0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDI0MjQyNDNdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQyNDI0MjQyNDI0MjQyNDFdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQyNDI0MjQyNDI0MjQyNDNdKS50byBiZV9uaWwKKworICAgIGVudW0gPSBUZXN0RW51bTQuZW51bV90eXBlKDplbnVtX3R5cGU0KQorICAgIGV4cGVjdChlbnVtWzB4MF0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDFdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQ2XSkudG8gYmVfbmlsCisKKyAgICBlbnVtID0gVGVzdEVudW00LmVudW1fdHlwZSg6ZW51bV90eXBlNSkKKyAgICBleHBlY3QoZW51bVsweDBdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQxXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bMHg0NF0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDI0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDI0NF0pLnRvIGJlX25pbAorCisgICAgZW51bSA9IFRlc3RFbnVtNC5lbnVtX3R5cGUoOmVudW1fdHlwZTYpCisgICAgZXhwZWN0KGVudW1bMHgwXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bMHg0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDNdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQyNDFdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQyNDNdKS50byBiZV9uaWwKKyAgICBleHBlY3QoZW51bVsweDQyNDI0MjQxXSkudG8gYmVfbmlsCisgICAgZXhwZWN0KGVudW1bMHg0MjQyNDI0M10pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDI0MjQyNDI0MjQyNDI0MV0pLnRvIGJlX25pbAorICAgIGV4cGVjdChlbnVtWzB4NDI0MjQyNDI0MjQyNDI0M10pLnRvIGJlX25pbAorICBlbmQKKworICBpdCAiZHVwbGljYXRlIGVudW0ga2V5cyByZWplY3RlZCIgZG8KKyAgICBleHBlY3QgeyBlbnVtIFsgOmEsIDB4ZmVlMWRlYWQsIDpiLCAweGRlYWRiZWVmLCA6YSwgMCBdIH0udG8gcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBlbnVtIEZGSTo6VHlwZTo6VUlOVDY0LCBbIDphLCAweGZlZTFkZWFkLCA6YiwgMHhkZWFkYmVlZiwgOmEsIDAgXSB9LnRvIHJhaXNlX2Vycm9yCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2Vycm5vX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2Vycm5vX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjYmRhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZXJybm9fc3BlYy5yYgpAQCAtMCwwICsxLDIwIEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitkZXNjcmliZSAiRkZJLmVycm5vIiBkbworICBtb2R1bGUgTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzZXRMYXN0RXJyb3IsIFsgOmludCBdLCA6dm9pZAorICBlbmQKKworICBpdCAiRkZJLmVycm5vIGNvbnRhaW5zIGVycm5vIGZyb20gbGFzdCBmdW5jdGlvbiIgZG8KKyAgICBMaWJUZXN0LnNldExhc3RFcnJvcigwKQorICAgIExpYlRlc3Quc2V0TGFzdEVycm9yKDB4MTIzNDU2NzgpCisgICAgZXhwZWN0KEZGSS5lcnJubykudG8gZXEoMHgxMjM0NTY3OCkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZmZpX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZmaV9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTNmMzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZmaV9zcGVjLnJiCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2Rlc2NyaWJlICJGRkkiIGRvCisKKyAgZGVzY3JpYmUgIi5tYXBfbGlicmFyeV9uYW1lIiBkbworCisgICAgbGV0KDpwcmVmaXgpIHsgRkZJOjpQbGF0Zm9ybTo6TElCUFJFRklYIH0KKyAgICBsZXQoOnN1ZmZpeCkgeyBGRkk6OlBsYXRmb3JtOjpMSUJTVUZGSVggfQorCisgICAgaXQgInNob3VsZCBhZGQgcGxhdGZvcm0gbGlicmFyeSBleHRlbnNpb24gaWYgbm90IHByZXNlbnQiIGRvCisgICAgICBleHBlY3QoRkZJLm1hcF9saWJyYXJ5X25hbWUoIiN7cHJlZml4fWR1bW15IikpLnRvIGVxKCIje3ByZWZpeH1kdW1teS4je3N1ZmZpeH0iKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhZGQgcGxhdGZvcm0gbGlicmFyeSBleHRlbnNpb24gZXZlbiBpZiBsaWIgc3VmZml4IGlzIHByZXNlbnQgaW4gbmFtZSIgZG8KKyAgICAgIGV4cGVjdChGRkkubWFwX2xpYnJhcnlfbmFtZSgiI3twcmVmaXh9ZHVtbXlfd2l0aF8je3N1ZmZpeH0iKSkudG8gZXEoIiN7cHJlZml4fWR1bW15X3dpdGhfI3tzdWZmaXh9LiN7c3VmZml4fSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJldHVybiBQbGF0Zm9ybTo6TElCQyB3aGVuIGNhbGxlZCB3aXRoICdjJyIgZG8KKyAgICAgIGV4cGVjdChGRkkubWFwX2xpYnJhcnlfbmFtZSgnYycpKS50byBlcShGRkk6OkxpYnJhcnk6OkxJQkMpCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvQmVuY2htYXJrLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL0JlbmNobWFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YTczODAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL0JlbmNobWFyay5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIHJldHVyblZvaWQoKSB7CisgICAgCit9CisKK3ZvaWQgcmV0dXJuVm9pZEkoaW50IGFyZykgeworICAgIAorfQoraW50IHJldHVybkludCgpIHsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJldHVybkludEkoaW50IGFyZykgeworICAgIHJldHVybiBhcmc7Cit9CisKK3R5cGVkZWYgaW50OF90IHM4OwordHlwZWRlZiB1aW50OF90IHU4OwordHlwZWRlZiBpbnQxNl90IHMxNjsKK3R5cGVkZWYgdWludDE2X3QgdTE2OwordHlwZWRlZiBpbnQzMl90IHMzMjsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiBpbnQ2NF90IHM2NDsKK3R5cGVkZWYgdWludDY0X3QgdTY0OwordHlwZWRlZiBmbG9hdCBmMzI7Cit0eXBlZGVmIGRvdWJsZSBmNjQ7Cit0eXBlZGVmIHZvaWQgdjsKK3R5cGVkZWYgY2hhciogUzsKK3R5cGVkZWYgdm9pZCogUDsKKworI2RlZmluZSBCNihSLCBUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2KSBSIGJlbmNoXyMjVDEjI1QyIyNUMyMjVDQjI1Q1IyNUNiMjXyMjUihUMSBhMSwgVDIgYTIsIFQzIGEzLCBUNCBhNCwgVDUgYTUsIFQ2IGE2KSB7fQorI2RlZmluZSBCNShSLCBUMSwgVDIsIFQzLCBUNCwgVDUpIFIgYmVuY2hfIyNUMSMjVDIjI1QzIyNUNCMjVDUjI18jI1IoVDEgYTEsIFQyIGEyLCBUMyBhMywgVDQgYTQsIFQ1IGE1KSB7fQorI2RlZmluZSBCNChSLCBUMSwgVDIsIFQzLCBUNCkgUiBiZW5jaF8jI1QxIyNUMiMjVDMjI1Q0IyNfIyNSKFQxIGExLCBUMiBhMiwgVDMgYTMsIFQ0IGE0KSB7fQorI2RlZmluZSBCMyhSLCBUMSwgVDIsIFQzKSBSIGJlbmNoXyMjVDEjI1QyIyNUMyMjXyMjUihUMSBhMSwgVDIgYTIsIFQzIGEzKSB7fQorI2RlZmluZSBCMihSLCBUMSwgVDIpIFIgYmVuY2hfIyNUMSMjVDIjI18jI1IoVDEgYTEsIFQyIGEyKSB7fQorI2RlZmluZSBCMShSLCBUMSkgUiBiZW5jaF8jI1QxIyNfIyNSKFQxIGExKSB7fQorI2RlZmluZSBCclYoVCkgQjEodiwgVCk7IEIyKHYsIFQsIFQpOyBCMyh2LCBULCBULCBUKTsgQjQodiwgVCwgVCwgVCwgVCk7IEI1KHYsIFQsIFQsIFQsIFQsIFQpOyBCNih2LCBULCBULCBULCBULCBULCBUKTsKK0JyVih1MzIpOworQnJWKHMzMik7CitCclYoczY0KTsKK0JyVih1NjQpOworQnJWKGYzMik7CitCclYoZjY0KTsKK0JyVihTKTsKK0JyVihQKTsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvQm9vbFRlc3QuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvQm9vbFRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNiNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9Cb29sVGVzdC5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQW1hbiBHdXB0YS4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworYm9vbAorYm9vbF9yZXR1cm5fdHJ1ZSgpCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK2Jvb2xfcmV0dXJuX2ZhbHNlKCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK2Jvb2xfcmV0dXJuX3ZhbChib29sIHZhbHVlKQoreworICAgIHJldHVybiB2YWx1ZTsKK30KKworYm9vbAorYm9vbF9yZXZlcnNlX3ZhbChib29sIHZhbHVlKQoreworICAgIHJldHVybiB2YWx1ZSA/IGZhbHNlIDogdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvQnVmZmVyVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9CdWZmZXJUZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5NWViYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvQnVmZmVyVGVzdC5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisKKyNkZWZpbmUgTUVNU0VUKGJ1ZiwgdmFsdWUsIHNpemUpIGRvIHsgXAorICAgIGludCBpOyBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBidWZbaV0gPSB2YWx1ZTsgXAorfSB3aGlsZSgwKQorI2RlZmluZSBNRU1DUFkoZHN0LCBzcmMsIHNpemUpIGRvIHsgXAorICAgIGludCBpOyBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBkc3RbaV0gPSBzcmNbaV07IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBGSUxMKEpUWVBFLCBDVFlQRSkgXAordm9pZCBmaWxsIyNKVFlQRSMjQnVmZmVyKENUWVBFKiBidWYsIENUWVBFIHZhbHVlLCBpbnQgc2l6ZSkgeyBNRU1TRVQoYnVmLCB2YWx1ZSwgc2l6ZSk7IH0KKworI2RlZmluZSBDT1BZKEpUWVBFLCBDVFlQRSkgXAordm9pZCBjb3B5IyNKVFlQRSMjQnVmZmVyKENUWVBFKiBkc3QsIENUWVBFKiBzcmMsIGludCBzaXplKSB7IE1FTUNQWShkc3QsIHNyYywgc2l6ZSk7IH0KKworI2RlZmluZSBGVU5DKEpUWVBFLCBDVFlQRSkgXAorICAgIEZJTEwoSlRZUEUsIENUWVBFKTsgXAorICAgIENPUFkoSlRZUEUsIENUWVBFKQorICAgICAgICAgICAgCitGVU5DKEJ5dGUsIGNoYXIpOworRlVOQyhTaG9ydCwgc2hvcnQpOworRlVOQyhJbnQsIGludCk7CitGVU5DKExvbmcsIGxvbmcgbG9uZyk7CitGVU5DKEZsb2F0LCBmbG9hdCk7CitGVU5DKERvdWJsZSwgZG91YmxlKTsKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9DbG9zdXJlVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9DbG9zdXJlVGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWFiZGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL0Nsb3N1cmVUZXN0LmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2lmbmRlZiBfV0lOMzIKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworI2RlZmluZSBSKFQsIHJ0eXBlKSBydHlwZSB0ZXN0Q2xvc3VyZVZyIyNUKHJ0eXBlICgqY2xvc3VyZSkodm9pZCkpIHsgXAorICAgIHJldHVybiBjbG9zdXJlICE9IE5VTEwgPyAoKmNsb3N1cmUpKCkgOiAocnR5cGUpIDA7IFwKK30KKworI2RlZmluZSBQKFQsIHB0eXBlKSB2b2lkIHRlc3RDbG9zdXJlIyNUIyNyVih2b2lkICgqY2xvc3VyZSkocHR5cGUpLCBwdHlwZSBhMSkgeyBcCisgICAgaWYgKGNsb3N1cmUgIT0gTlVMTCkgKCpjbG9zdXJlKShhMSk7IFwKK30KKwordm9pZCB0ZXN0Q2xvc3VyZVZyVih2b2lkICgqY2xvc3VyZSkodm9pZCkpCit7CisgICAgKCpjbG9zdXJlKSgpOworfQorCitSKFosIGJvb2wpOworUihCLCBjaGFyKTsKK1IoUywgc2hvcnQpOworUihJLCBpbnQpOworUihMLCBsb25nKTsKK1IoSiwgbG9uZyBsb25nKTsKK1IoTEwsIGxvbmcgbG9uZyk7CitSKEYsIGZsb2F0KTsKK1IoRCwgZG91YmxlKTsKK1IoUCwgY29uc3Qgdm9pZCopOworCisKK1AoWiwgYm9vbCk7CitQKEIsIGNoYXIpOworUChTLCBzaG9ydCk7CitQKEksIGludCk7CitQKEwsIGxvbmcpOworUChKLCBsb25nIGxvbmcpOworUChMTCwgbG9uZyBsb25nKTsKK1AoRiwgZmxvYXQpOworUChELCBkb3VibGUpOworUChQLCBjb25zdCB2b2lkKik7CitQKFVMLCB1bnNpZ25lZCBsb25nKTsKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCitib29sIF9fc3RkY2FsbCB0ZXN0Q2xvc3VyZVN0ZGNhbGwobG9uZyAqYTEsIHZvaWQgX19zdGRjYWxsKCpjbG9zdXJlKSh2b2lkICosIGxvbmcpLCBsb25nIGEyKSB7IFwKKyAgICB2b2lkKiBzcF9wcmU7CisgICAgdm9pZCogc3BfcG9zdDsKKworICAgIGFzbSB2b2xhdGlsZSAoIiBtb3ZsICUlZXNwLCUwIiA6ICI9ZyIgKHNwX3ByZSkpOworICAgICgqY2xvc3VyZSkoYTEsIGEyKTsKKyAgICBhc20gdm9sYXRpbGUgKCIgbW92bCAlJWVzcCwlMCIgOiAiPWciIChzcF9wb3N0KSk7CisKKyAgICAvKiAlZXNwIGJlZm9yZSBwdXNoaW5nIHBhcmFtZXRlcnMgb24gdGhlIHN0YWNrIGFuZCBhZnRlciB0aGUgY2FsbCByZXR1cm5zCisgICAgICogc2hvdWxkIGJlIGVxdWFsLCBpZiBib3RoIHNpZGVzIHJlc3BlY3RzIHRoZSBzdGRjYWxsIGNvbnZlbnRpb24gKi8KKyAgICByZXR1cm4gc3BfcHJlID09IHNwX3Bvc3Q7Cit9CisjZW5kaWYKKwordm9pZCB0ZXN0T3B0aW9uYWxDbG9zdXJlQnJWKHZvaWQgKCpjbG9zdXJlKShjaGFyKSwgY2hhciBhMSkKK3sKKyAgICBpZiAoY2xvc3VyZSkgeworICAgICAgICAoKmNsb3N1cmUpKGExKTsKKyAgICB9Cit9CisKKworc3RydWN0IFRocmVhZFZyViB7CisgICAgdm9pZCAoKmNsb3N1cmUpKHZvaWQpOworICAgIGludCBjb3VudDsKK307CisKK3N0YXRpYyB2b2lkICoKK3RocmVhZFZyVih2b2lkICphcmcpCit7CisgICAgc3RydWN0IFRocmVhZFZyViogdCA9IChzdHJ1Y3QgVGhyZWFkVnJWICopIGFyZzsKKyAgICAKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdC0+Y291bnQ7IGkrKykgeworICAgICAgICAoKnQtPmNsb3N1cmUpKCk7CisgICAgfQorICAgIAorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIHRlc3RUaHJlYWRlZENsb3N1cmVWclYodm9pZCAoKmNsb3N1cmUpKHZvaWQpLCBpbnQgbikKK3sKKwlzdHJ1Y3QgVGhyZWFkVnJWIGFyZyA9IHtjbG9zdXJlLCBufTsKKyNpZm5kZWYgX1dJTjMyCisgICAgcHRocmVhZF90IHQ7CisgICAgcHRocmVhZF9jcmVhdGUoJnQsIE5VTEwsIHRocmVhZFZyViwgJmFyZyk7CisgICAgcHRocmVhZF9qb2luKHQsIE5VTEwpOworI2Vsc2UKKyAgICBIQU5ETEUgaFRocmVhZCA9IChIQU5ETEUpIF9iZWdpbnRocmVhZCgodm9pZCAoKikodm9pZCAqKSl0aHJlYWRWclYsIDAsICZhcmcpOworICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoaFRocmVhZCwgSU5GSU5JVEUpOwkKKyNlbmRpZgorfQorCitzdHJ1Y3QgczhmMzJzMzIgeworICAgIGNoYXIgczg7CisgICAgZmxvYXQgZjMyOworICAgIGludCBzMzI7Cit9OworCisvLyBUYWtlcyBhIHN0cnVjdCBhcmd1bWVudAordm9pZCB0ZXN0Q2xvc3VyZVRyVih2b2lkICgqY2xvc3VyZSkoc3RydWN0IHM4ZjMyczMyIHMpLCBzdHJ1Y3QgczhmMzJzMzIqIHMpCit7CisgICAgKCpjbG9zdXJlKSgqcyk7Cit9CisKKy8vIFJldHVybnMgYSBzdHJ1Y3QgdmFsdWUKK3N0cnVjdCBzOGYzMnMzMiB0ZXN0Q2xvc3VyZVZyVChzdHJ1Y3QgczhmMzJzMzIgKCpjbG9zdXJlKSgpKQoreworICAgIHJldHVybiAoKmNsb3N1cmUpKCk7Cit9CisKK3R5cGVkZWYgaW50ICgqcmV0dXJuVHlwZUNsb3N1cmVfdCkoaW50KSA7Cit0eXBlZGVmIHJldHVyblR5cGVDbG9zdXJlX3QgKCpsb29rdXBDbG9zdXJlX3QpKCk7CisKK2ludCB0ZXN0UmV0dXJuc0Nsb3N1cmUobG9va3VwQ2xvc3VyZV90IGxvb2t1cCwgaW50IHZhbCkKK3sKKyAgICByZXR1cm5UeXBlQ2xvc3VyZV90IGZ1bmMgPSBsb29rdXAgPyAoKmxvb2t1cCkoKSA6IE5VTEw7CisgICAgcmV0dXJuIGZ1bmMgPyAoKmZ1bmMpKHZhbCkgOiAwOworfQorCitzdGF0aWMgaW50IG11bHRpcGx5QnlUd28oaW50IHZhbHVlKQoreworICAgIHJldHVybiB2YWx1ZSAqIDI7Cit9CisKK3JldHVyblR5cGVDbG9zdXJlX3QgdGVzdFJldHVybnNGdW5jdGlvblBvaW50ZXIoKQoreworICAgIHJldHVybiBtdWx0aXBseUJ5VHdvOworfQorCit0eXBlZGVmIGludCAoKmFyZ3VtZW50Q2xvc3VyZV90KShpbnQpOwordHlwZWRlZiBpbnQgKCp3aXRoQXJndW1lbnRDbG9zdXJlX3QpKGFyZ3VtZW50Q2xvc3VyZV90LCBpbnQpOworCitpbnQgdGVzdEFyZ3VtZW50Q2xvc3VyZSh3aXRoQXJndW1lbnRDbG9zdXJlX3QgY2xvc3VyZV93aXRoLCBhcmd1bWVudENsb3N1cmVfdCBjbG9zdXJlX2FyZywgaW50IHZhbCkKK3sKKyAgICByZXR1cm4gKCpjbG9zdXJlX3dpdGgpKGNsb3N1cmVfYXJnLCB2YWwpOworfQorCisKKy8vCisvLyBUaGVzZSBtYWNyb3MgcHJvZHVjZSBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CisvLyB0ZXN0Q2xvc3VyZUJJclYodm9pZCAoKmNsb3N1cmUpKGNoYXIsIGludCksIGNoYXIgYTEsIGludCBhMikge30KKy8vCisjZGVmaW5lIEMyXyhKMSwgSjIsIE4xLCBOMikgXAordm9pZCB0ZXN0Q2xvc3VyZSMjSjEjI0oyIyNyVih2b2lkICgqY2xvc3VyZSkoTjEsIE4yKSwgTjEgYTEsIE4yIGEyKSBcCit7IFwKKyAgICBpZiAoY2xvc3VyZSAhPSBOVUxMKSAoKmNsb3N1cmUpKGExLCBhMik7IFwKK30KKworI2RlZmluZSBDMihKLCBOKSBcCisgICAgQzJfKEIsIEosIGNoYXIsIE4pIFwKKyAgICBDMl8oUywgSiwgc2hvcnQsIE4pIFwKKyAgICBDMl8oSSwgSiwgaW50LCBOKSBcCisgICAgQzJfKExMLCBKLCBsb25nIGxvbmcsIE4pIFwKKyAgICBDMl8oRiwgSiwgZmxvYXQsIE4pIFwKKyAgICBDMl8oRCwgSiwgZG91YmxlLCBOKSBcCisKKworQzIoQiwgY2hhcik7CitDMihTLCBzaG9ydCk7CitDMihJLCBpbnQpOworQzIoTEwsIGxvbmcgbG9uZyk7CitDMihGLCBmbG9hdCk7CitDMihELCBkb3VibGUpOworCisjZGVmaW5lIEMzXyhKMSwgSjIsIEozLCBOMSwgTjIsIE4zKSBcCit2b2lkIHRlc3RDbG9zdXJlIyNKMSMjSjIjI0ozIyNyVih2b2lkICgqY2xvc3VyZSkoTjEsIE4yLCBOMyksIE4xIGExLCBOMiBhMiwgTjMgYTMpIFwKK3sgXAorICAgICgqY2xvc3VyZSkoYTEsIGEyLCBhMyk7IFwKK30KKworCisjZGVmaW5lIEMzKEosIE4pIFwKKyAgICBDM18oQiwgSiwgQiwgY2hhciwgTiwgY2hhcikgXAorICAgIEMzXyhTLCBKLCBTLCBzaG9ydCwgTiwgc2hvcnQpIFwKKyAgICBDM18oSSwgSiwgSSwgaW50LCBOLCBpbnQpIFwKKyAgICBDM18oTEwsIEosIExMLCBsb25nIGxvbmcsIE4sIGxvbmcgbG9uZykgXAorICAgIEMzXyhGLCBKLCBGLCBmbG9hdCwgTiwgZmxvYXQpIFwKKyAgICBDM18oRCwgSiwgRCwgZG91YmxlLCBOLCBkb3VibGUpIFwKKworQzMoQiwgY2hhcik7CitDMyhTLCBzaG9ydCk7CitDMyhJLCBpbnQpOworQzMoTEwsIGxvbmcgbG9uZyk7CitDMyhGLCBmbG9hdCk7CitDMyhELCBkb3VibGUpOworQzNfKEIsIFMsIEksIGNoYXIsIHNob3J0LCBpbnQpOworQzNfKEIsIFMsIExMLCBjaGFyLCBzaG9ydCwgbG9uZyBsb25nKTsKK0MzXyhMTCwgUywgQiwgbG9uZyBsb25nLCBzaG9ydCwgY2hhcik7CitDM18oTEwsIEIsIFMsIGxvbmcgbG9uZywgY2hhciwgc2hvcnQpOworCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvRW51bVRlc3QuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvRW51bVRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmY4ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9FbnVtVGVzdC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCitpbnQgdGVzdF91bnRhZ2dlZF9lbnVtKGludCB2YWwpIHsKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQgdGVzdF91bnRhZ2dlZF90eXBlZGVmX2VudW0oaW50IHZhbCkgeworICAgIHJldHVybiB2YWw7Cit9CisKK3VpbnQ4X3QgdGVzdF91bnRhZ2dlZF9ub25pbnRfZW51bSh1aW50OF90IHZhbCkgeworICAgIHJldHVybiB2YWw7Cit9CisKK3VpbnQxNl90IHRlc3RfdGFnZ2VkX25vbmludF9lbnVtMSh1aW50MTZfdCB2YWwpIHsKKyAgICByZXR1cm4gdmFsOworfQorCit1aW50MzJfdCB0ZXN0X3RhZ2dlZF9ub25pbnRfZW51bTIodWludDMyX3QgdmFsKSB7CisgICAgcmV0dXJuIHZhbDsKK30KKwordWludDY0X3QgdGVzdF90YWdnZWRfbm9uaW50X2VudW0zKHVpbnQ2NF90IHZhbCkgeworICAgIHJldHVybiB2YWw7Cit9CisKK3R5cGVkZWYgZW51bSB7YzEsIGMyLCBjMywgYzR9IGVudW1fdHlwZTE7CitlbnVtX3R5cGUxIHRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTEoZW51bV90eXBlMSB2YWwpIHsKKyAgICByZXR1cm4gdmFsOworfQorCit0eXBlZGVmIGVudW0ge2M1ID0gNDIsIGM2LCBjNywgYzh9IGVudW1fdHlwZTI7CitlbnVtX3R5cGUyIHRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTIoZW51bV90eXBlMiB2YWwpIHsKKyAgICByZXR1cm4gdmFsOworfQorCit0eXBlZGVmIGVudW0ge2M5ID0gNDIsIGMxMCwgYzExID0gNDI0MiwgYzEyfSBlbnVtX3R5cGUzOworZW51bV90eXBlMyB0ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0zKGVudW1fdHlwZTMgdmFsKSB7CisgICAgcmV0dXJuIHZhbDsKK30KKwordHlwZWRlZiBlbnVtIHtjMTMgPSA0MiwgYzE0ID0gNDI0MiwgYzE1ID0gNDI0MjQyLCBjMTYgPSA0MjQyNDI0Mn0gZW51bV90eXBlNDsKK2VudW1fdHlwZTQgdGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtNChlbnVtX3R5cGU0IHZhbCkgeworICAgIHJldHVybiB2YWw7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvRnVuY3Rpb25UZXN0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL0Z1bmN0aW9uVGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDkxODUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL0Z1bmN0aW9uVGVzdC5jCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdheW5lIE1laXNzbmVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisgKi8KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiUGlwZUhlbHBlci5oIgorCitpbnQgdGVzdEFkZChpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgKyBiOworfTsKKworaW50IHRlc3RGdW5jdGlvbkFkZChpbnQgYSwgaW50IGIsIGludCAoKmYpKGludCwgaW50KSkKK3sKKyAgICByZXR1cm4gZihhLCBiKTsKK307CisKK3N0cnVjdCB0ZXN0QmxvY2tpbmdEYXRhIHsKKyAgICBGRF9UWVBFIHBpcGUxWzJdOworICAgIEZEX1RZUEUgcGlwZTJbMl07Cit9OworCitzdHJ1Y3QgdGVzdEJsb2NraW5nRGF0YSAqdGVzdEJsb2NraW5nT3BlbigpCit7CisgICAgc3RydWN0IHRlc3RCbG9ja2luZ0RhdGEgKnNlbGYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXN0QmxvY2tpbmdEYXRhKSk7CisKKyAgICBpZiggcGlwZUhlbHBlckNyZWF0ZVBpcGUoc2VsZi0+cGlwZTEpID09IC0xICkgcmV0dXJuIE5VTEw7CisgICAgaWYoIHBpcGVIZWxwZXJDcmVhdGVQaXBlKHNlbGYtPnBpcGUyKSA9PSAtMSApIHJldHVybiBOVUxMOworICAgIHJldHVybiBzZWxmOworfQorCitjaGFyIHRlc3RCbG9ja2luZ1dSKHN0cnVjdCB0ZXN0QmxvY2tpbmdEYXRhICpzZWxmLCBjaGFyIGMpIHsKKyAgICBpZiggcGlwZUhlbHBlcldyaXRlQ2hhcihzZWxmLT5waXBlMVsxXSwgYykgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHBpcGVIZWxwZXJSZWFkQ2hhcihzZWxmLT5waXBlMlswXSwgMTApOworfQorCitjaGFyIHRlc3RCbG9ja2luZ1JXKHN0cnVjdCB0ZXN0QmxvY2tpbmdEYXRhICpzZWxmLCBjaGFyIGMpIHsKKyAgICBjaGFyIGQgPSBwaXBlSGVscGVyUmVhZENoYXIoc2VsZi0+cGlwZTFbMF0sIDEwKTsKKyAgICBpZiggcGlwZUhlbHBlcldyaXRlQ2hhcihzZWxmLT5waXBlMlsxXSwgYykgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGQ7Cit9CisKK3ZvaWQgdGVzdEJsb2NraW5nQ2xvc2Uoc3RydWN0IHRlc3RCbG9ja2luZ0RhdGEgKnNlbGYpIHsKKyAgICBwaXBlSGVscGVyQ2xvc2VQaXBlKHNlbGYtPnBpcGUxWzBdKTsKKyAgICBwaXBlSGVscGVyQ2xvc2VQaXBlKHNlbGYtPnBpcGUxWzFdKTsKKyAgICBwaXBlSGVscGVyQ2xvc2VQaXBlKHNlbGYtPnBpcGUyWzBdKTsKKyAgICBwaXBlSGVscGVyQ2xvc2VQaXBlKHNlbGYtPnBpcGUyWzFdKTsKKyAgICBmcmVlKHNlbGYpOworfQorCitzdGF0aWMgaW50IHN1bV92YXJhcmdzKHZhX2xpc3QgYXJncykgeworICAgIGNoYXIgc3VtID0gMDsKKyAgICBpbnQgYXJnOworICAgIHdoaWxlICgoYXJnID0gdmFfYXJnKGFyZ3MsIGludCkpICE9IDApIHsKKyAgICAgICAgc3VtICs9IGFyZzsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiBzdW07Cit9CisKKy8qIFdyaXRlIGMgdG8gcGlwZTEgYW5kIHJldHVybiB0aGUgdmFsdWUgcmVhZCBmcm9tIHBpcGUyLCBvciAwIGlmIHRoZXJl4oCZcworICogYW4gZXJyb3Igc3VjaCBhcyBhIHRpbWVvdXQsIG9yIGlmIGMgZG9lcyBub3QgZXF1YWwgdGhlIHN1bSBvZiB0aGUKKyAqIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIGNoYXIgYXJndW1lbnRzLiAqLworY2hhciB0ZXN0QmxvY2tpbmdXUnZhKHN0cnVjdCB0ZXN0QmxvY2tpbmdEYXRhICpzZWxmLCBjaGFyIGMsIC4uLikgeworICAgIHZhX2xpc3QgYXJnczsKKyAgICB2YV9zdGFydChhcmdzLCBjKTsKKyAgICBpZiAoc3VtX3ZhcmFyZ3MoYXJncykgIT0gYykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiggcGlwZUhlbHBlcldyaXRlQ2hhcihzZWxmLT5waXBlMVsxXSwgYykgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHBpcGVIZWxwZXJSZWFkQ2hhcihzZWxmLT5waXBlMlswXSwgMTApOworfQorCitjaGFyIHRlc3RCbG9ja2luZ1JXdmEoc3RydWN0IHRlc3RCbG9ja2luZ0RhdGEgKnNlbGYsIGNoYXIgYywgLi4uKSB7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGMpOworICAgIGlmIChzdW1fdmFyYXJncyhhcmdzKSAhPSBjKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNoYXIgZCA9IHBpcGVIZWxwZXJSZWFkQ2hhcihzZWxmLT5waXBlMVswXSwgMTApOworICAgIGlmKCBwaXBlSGVscGVyV3JpdGVDaGFyKHNlbGYtPnBpcGUyWzFdLCBjKSAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZDsKK30KKworc3RydWN0IGFzeW5jX2RhdGEgeworICAgIHZvaWQgKCpmbikoaW50KTsKKyAgICBpbnQgdmFsdWU7Cit9OworCitzdGF0aWMgdm9pZCogYXN5bmNUaHJlYWRDYWxsKHZvaWQgKmRhdGEpCit7CisgICAgc3RydWN0IGFzeW5jX2RhdGEqIGQgPSAoc3RydWN0IGFzeW5jX2RhdGEgKikgZGF0YTsKKyAgICBpZiAoZCAhPSBOVUxMICYmIGQtPmZuICE9IE5VTEwpIHsKKyAgICAgICAgKCpkLT5mbikoZC0+dmFsdWUpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIHRlc3RBc3luY0NhbGxiYWNrKHZvaWQgKCpmbikoaW50KSwgaW50IHZhbHVlKQoreworI2lmbmRlZiBfV0lOMzIKKyAgICBwdGhyZWFkX3QgdDsKKyAgICBzdHJ1Y3QgYXN5bmNfZGF0YSBkOworICAgIGQuZm4gPSBmbjsKKyAgICBkLnZhbHVlID0gdmFsdWU7CisgICAgcHRocmVhZF9jcmVhdGUoJnQsIE5VTEwsIGFzeW5jVGhyZWFkQ2FsbCwgJmQpOworICAgIHB0aHJlYWRfam9pbih0LCBOVUxMKTsKKyNlbHNlCisgICAgKCpmbikodmFsdWUpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjY0KQorc3RydWN0IFN0cnVjdFVDRFAgeworICB1bnNpZ25lZCBjaGFyIGExOworICBkb3VibGUgYTI7CisgIHZvaWQgKmEzOworfTsKKwordm9pZCBfX3N0ZGNhbGwgdGVzdFN0ZGNhbGxNYW55UGFyYW1zKGxvbmcgKmExLCBjaGFyIGEyLCBzaG9ydCBpbnQgYTMsIGludCBhNCwgX19pbnQ2NCBhNSwKKyAgICAgICAgICAgIHN0cnVjdCBTdHJ1Y3RVQ0RQIGE2LCBzdHJ1Y3QgU3RydWN0VUNEUCAqYTcsIGZsb2F0IGE4LCBkb3VibGUgYTkpIHsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9HTlVtYWtlZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvR05VbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczMDQxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvR05VbWFrZWZpbGUKQEAgLTAsMCArMSwxNDkgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorCitpZmVxICgkKE9TKSwpCisgIEJVSUxEX09TIDo9ICQoc2hlbGwgdW5hbWUgLXMgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJykKKyAgT1MgOj0gJChCVUlMRF9PUykKK2VuZGlmCisKK2lmZXEgKCQoQ1BVKSwpCisgIENQVSA6PSAkKHNoZWxsIHVuYW1lIC1tIHwgc2VkIC1lICdzL2lbMzQ1Njc4XTg2L2kzODYvJykKK2VuZGlmCisKK1BMQVRGT1JNID0gJChDUFUpLSQoT1MpCisKK2lmZXEgKCQoT1MpLCBzdW5vcykKKyAgT1MgPSBzb2xhcmlzCitlbmRpZgorCitTUkNfRElSID0gLgorQlVJTERfRElSID89IC4KK1RFU1RfQlVJTERfRElSID0gLgorIyBTZXQgZGVmYXVsdHMgdG8gdW5peCAobGludXgvc29sYXJpcy9ic2QpCitQUkVGSVggPSBsaWIKK0xJQkVYVCA/PSBzbworTElCTkFNRSA9ICQoUFJFRklYKXRlc3QuJChMSUJFWFQpCisKK2V4cG9ydCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9MTAuNAorCitDQ0FDSEUgOj0gJChzdHJpcCAkKHJlYWxwYXRoICQoc2hlbGwgd2hpY2ggY2NhY2hlIDI+IC9kZXYvbnVsbCkpKQorCitURVNUX1NSQ1MgPSAkKHdpbGRjYXJkICQoU1JDX0RJUikvKi5jKQorVEVTVF9PQkpTIDo9ICQocGF0c3Vic3QgJChTUkNfRElSKS8lLmMsICQoVEVTVF9CVUlMRF9ESVIpLyUubywgJChURVNUX1NSQ1MpKQorCisjCisjIENvbXBpbGVyL2xpbmtlciBmbGFncyBmcm9tOgorIyAgIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cva2VsbHlvaGFpci9hcmNoaXZlLzIwMDYvMDEvY29tcGlsYXRpb25fb2ZfMS5odG1sCitKRkxBR1MgPSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZworT0ZMQUdTID0gLU8yICQoSkZMQUdTKQorV0ZMQUdTID0gLVcgLVdhbGwgLVduby11bnVzZWQgLVduby1wYXJlbnRoZXNlcworUElDRkxBR1MgPSAtZlBJQworU09GTEFHUyA9IC1zaGFyZWQKK0xERkxBR1MgKz0gJChTT0ZMQUdTKQorCitJRkxBR1MgPSAtSSIkKEJVSUxEX0RJUikiCitDRkxBR1MgPSAkKE9GTEFHUykgJChXRkxBR1MpICQoSUZMQUdTKSAkKFBJQ0ZMQUdTKSAtRF9SRUVOVFJBTlQKKworaWZuZXEgKCQoc3RyaXAgJChmaW5kc3RyaW5nICQoT1MpLCB3aW4zMiwgbWluZ3csIGN5Z3dpbikpLCkKKyAgIyBGb3IgY3lnd2luID0+IHdpbjMyLW5hdGl2ZSBidWlsZHMsIHN0cmlwIG91dCBjeWd3aW4gZGVwcworICBpZm5lcSAoJChmaW5kc3RyaW5nIGN5Z3dpbiwgJChCVUlMRF9PUykpLCkKKyAgICBDQyArPSAtbW5vLWN5Z3dpbiAtbXdpbjMyCisgICAgTERGTEFHUyArPSAtbW5vLWN5Z3dpbiAtV2wsLS1hZGQtc3RkY2FsbC1hbGlhcworICBlbmRpZgorICBQSUNGTEFHUz0KKyAgTElCRVhUPWRsbAorICBDQyA9IGdjYworZW5kaWYKKworaWZlcSAoJChPUyksIGRhcndpbikKKyAgaWZuZXEgKCQoZmluZHN0cmluZyAkKENQVSkscHBjKSwpCisgICAgQVJDSEZMQUdTICs9IC1hcmNoIHBwYworICBlbmRpZgorICBpZm5lcSAoJChmaW5kc3RyaW5nICQoQ1BVKSxpMzg2IHg4Nl82NCksKQorICAgIEFSQ0hGTEFHUyArPSAtYXJjaCBpMzg2IC1hcmNoIHg4Nl82NAorICBlbmRpZgorICBDRkxBR1MgKz0gJChBUkNIRkxBR1MpIC1EVEFSR0VUX1JUX01BQ19DRk09MAorICBDRkxBR1MgKz0gLWZuby1jb21tb24KKyAgTERGTEFHUyA9ICQoQVJDSEZMQUdTKSAtZHluYW1pY2xpYgorICAjIGxpbmsgYWdhaW5zdCB0aGUgdW5pdmVyc2FsIGxpYnJhcmllcyBvbiBwcGMgbWFjaGluZXMKKyAgTERGTEFHUyArPSAtTCQoTUFDU0RLKS91c3IvbGliCisgIExJQkVYVCA9IGR5bGliCisgIEZGSV9DRkxBR1MgKz0gLWlzeXNyb290ICQoTUFDU0RLKQorICBQSUNGTEFHUyA9CisgIFNPRkxBR1MgPQorZW5kaWYKKworaWZlcSAoJChPUyksIGxpbnV4KQorICBTT0ZMQUdTICs9IC1XbCwtc29uYW1lLCQoTElCTkFNRSkKK2VuZGlmCisKK2lmZXEgKCQoT1MpLCBzb2xhcmlzKQorICBDQyA9IC91c3Ivc2Z3L2Jpbi9nY2MgLXN0ZD1jOTkKKyAgTEQgPSAvdXNyL2Njcy9iaW4vbGQKKyAgU09GTEFHUyA9IC1zaGFyZWQgLXN0YXRpYy1saWJnY2MKK2VuZGlmCisKK2lmZXEgKCQoT1MpLCBhaXgpCisgIExJQkVYVCA9IGEKKyAgU09GTEFHUyA9IC1zaGFyZWQgLXN0YXRpYy1saWJnY2MKKyAgUElDRkxBR1MgKz0gLXB0aHJlYWQKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgYnNkLCAkKE9TKSksKQorICBTT0ZMQUdTID0gLXNoYXJlZCAtc3RhdGljLWxpYmdjYworICBDRkxBR1MgKz0gLXB0aHJlYWQKKyAgTERGTEFHUyArPSAtcHRocmVhZAorZW5kaWYKKworaWZlcSAoJChDUFUpLCBpMzg2KQorICBNT0RFTCA9IDMyCitlbmRpZgorCitpZmVxICgkKENQVSksIHNwYXJjdjkpCisgIE1PREVMID0gNjQKK2VuZGlmCisKK2lmZXEgKCQoQ1BVKSwgYW1kNjQpCisgIE1PREVMID0gNjQKK2VuZGlmCisKK2lmZXEgKCQoQ1BVKSwgeDg2XzY0KQorICBNT0RFTCA9IDY0CitlbmRpZgorCitpZmVxICgkKENQVSksIHBwYzY0KQorICBNT0RFTCA9IDY0CitlbmRpZgorCitpZmVxICgkKENQVSksIHBvd2VycGM2NCkKKyAgTU9ERUwgPSA2NAorZW5kaWYKKworTU9ERUxGTEFHID0KK2lmbmVxICgkKE1PREVMKSwpCisgIE1PREVMRkxBRyA9IC1tJChNT0RFTCkKK2VuZGlmCisKKyMgT24gcGxhdGZvcm1zIChsaW51eCwgc29sYXJpcykgdGhhdCBzdXBwb3J0IGJvdGggMzJiaXQgYW5kIDY0Yml0LCBmb3JjZSBidWlsZGluZyBmb3Igb25lIG9yIHRoZSBvdGhlcgoraWZuZXEgKCQob3IgJChmaW5kc3RyaW5nIGxpbnV4LCAkKE9TKSksICQoZmluZHN0cmluZyBzb2xhcmlzLCAkKE9TKSkpLCkKKyAgIyBDaGFuZ2UgdGhlIENDL0xEIGluc3RlYWQgb2YgQ0ZMQUdTL0xERkxBR1MsIGluY2FzZSBvdGhlciB0aGluZ3MgaW4gdGhlIGZsYWdzCisgICMgbWFrZXMgdGhlIGxpYmZmaSBidWlsZCBjaG9rZQorICBDQyArPSAkKE1PREVMRkxBRykKKyAgTEQgKz0gJChNT0RFTEZMQUcpCitlbmRpZgorCitMSUJURVNUID0gJChMSUJOQU1FKQorCithbGw6CSQoTElCVEVTVCkKKworJChURVNUX0JVSUxEX0RJUikvJS5vIDogJChTUkNfRElSKS8lLmMKKwlAbWtkaXIgLXAgJChARCkKKwkkKENDQUNIRSkgJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACisKKyQoTElCVEVTVCk6ICAkKFRFU1RfT0JKUykKKwkkKENDKSAtbyAkQCAkKExERkxBR1MpICQoVEVTVF9PQkpTKSAtbG0KKworY2xlYW46OgorCSMgbm90aGluZyB0byBkbyAtIGFudCB3aWxsIGRlbGV0ZSB0aGUgYnVpbGQgZGlyCisKK2RlYnVnOjoKKwlAZWNobyAiU1JDUz0kKFRFU1RfU1JDUykiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL0dsb2JhbFZhcmlhYmxlLmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL0dsb2JhbFZhcmlhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljMTJhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvR2xvYmFsVmFyaWFibGUuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdheW5lIE1laXNzbmVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIGludDhfdCBzODsKK3R5cGVkZWYgdWludDhfdCB1ODsKK3R5cGVkZWYgaW50MTZfdCBzMTY7Cit0eXBlZGVmIHVpbnQxNl90IHUxNjsKK3R5cGVkZWYgaW50MzJfdCBzMzI7Cit0eXBlZGVmIHVpbnQzMl90IHUzMjsKK3R5cGVkZWYgaW50NjRfdCBzNjQ7Cit0eXBlZGVmIHVpbnQ2NF90IHU2NDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgc0w7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdUw7Cit0eXBlZGVmIGZsb2F0IGYzMjsKK3R5cGVkZWYgZG91YmxlIGY2NDsKKyNpZiAhZGVmaW5lZChfX09wZW5CU0RfXykKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bG9uZzsKKyNlbmRpZgordHlwZWRlZiB2b2lkKiBwb2ludGVyOwordHlwZWRlZiB2b2lkKiBQOworCisjZGVmaW5lIEdWQVIoVCkgXAorICAgIGV4dGVybiBUIGd2YXJfIyNUOyBcCisgICAgVCBndmFyXyMjVCA9IChUKSAtMTsgXAorICAgIFQgZ3Zhcl8jI1QjI19nZXQoKSB7IHJldHVybiBndmFyXyMjVDsgfTsgXAorICAgIHZvaWQgZ3Zhcl8jI1QjI19zZXQoVCB2KSB7IGd2YXJfIyNUID0gdjsgfQorCitHVkFSKHM4KTsKK0dWQVIodTgpOworR1ZBUihzMTYpOworR1ZBUih1MTYpOworR1ZBUihzMzIpOworR1ZBUih1MzIpOworR1ZBUihzNjQpOworR1ZBUih1NjQpOworR1ZBUihsb25nKTsKK0dWQVIodWxvbmcpOworR1ZBUihwb2ludGVyKTsKKworc3RydWN0IGdzdHJ1Y3QgeworICAgIGxvbmcgZGF0YTsKK307CisKK3N0cnVjdCBnc3RydWN0IGd2YXJfZ3N0cnVjdCA9IHsgLTEgfTsKKworc3RydWN0IGdzdHJ1Y3QqCitndmFyX2dzdHJ1Y3RfZ2V0KHZvaWQpCit7CisgICAgcmV0dXJuICZndmFyX2dzdHJ1Y3Q7Cit9CisKK3ZvaWQKK2d2YXJfZ3N0cnVjdF9zZXQoY29uc3Qgc3RydWN0IGdzdHJ1Y3QqIHZhbCkKK3sgCisgICAgZ3Zhcl9nc3RydWN0ID0gKnZhbDsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvTGFzdEVycm9yVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9MYXN0RXJyb3JUZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjZTRhOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvTGFzdEVycm9yVGVzdC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKK2ludCBzZXRMYXN0RXJyb3IoaW50IGVycm9yKSB7CisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorICAgIFNldExhc3RFcnJvcihlcnJvcik7CisjZWxzZQorICAgIGVycm5vID0gZXJyb3I7CisjZW5kaWYKKyAgICByZXR1cm4gLTE7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvTnVtYmVyVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9OdW1iZXJUZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhMjVhOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvTnVtYmVyVGVzdC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdheW5lIE1laXNzbmVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZiBkZWZpbmVkKF9fc3BhcmMpICYmIGRlZmluZWQoX19zdW5fXykKKyAgICAjZGVmaW5lIGZpeF9tZW1fYWNjZXNzIF9fYXNtKCJ0YSA2IikKKyNlbHNlCisgICAgI2RlZmluZSBmaXhfbWVtX2FjY2VzcworI2VuZGlmCisKK3R5cGVkZWYgaW50OF90IHM4OwordHlwZWRlZiB1aW50OF90IHU4OwordHlwZWRlZiBpbnQxNl90IHMxNjsKK3R5cGVkZWYgdWludDE2X3QgdTE2OwordHlwZWRlZiBpbnQzMl90IHMzMjsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiBpbnQ2NF90IHM2NDsKK3R5cGVkZWYgdWludDY0X3QgdTY0OwordHlwZWRlZiBzaWduZWQgbG9uZyBzTDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1TDsKK3R5cGVkZWYgZmxvYXQgZjMyOwordHlwZWRlZiBkb3VibGUgZjY0OwordHlwZWRlZiBsb25nIGRvdWJsZSBmMTI4OworI2lmICFkZWZpbmVkKF9fT3BlbkJTRF9fKQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsb25nOworI2VuZGlmCisKKyNkZWZpbmUgQUREKFQpIFQgYWRkXyMjVChUIGFyZzEsIFQgYXJnMikgeyByZXR1cm4gYXJnMSArIGFyZzI7IH0KKyNkZWZpbmUgU1VCKFQpIFQgc3ViXyMjVChUIGFyZzEsIFQgYXJnMikgeyByZXR1cm4gYXJnMSAtIGFyZzI7IH0KKyNkZWZpbmUgTVVMKFQpIFQgbXVsXyMjVChUIGFyZzEsIFQgYXJnMikgeyByZXR1cm4gYXJnMSAqIGFyZzI7IH0KKyNkZWZpbmUgRElWKFQpIFQgZGl2XyMjVChUIGFyZzEsIFQgYXJnMikgeyByZXR1cm4gYXJnMSAvIGFyZzI7IH0KKyNkZWZpbmUgUkVUKFQpIFQgcmV0XyMjVChUIGFyZzEpIHsgcmV0dXJuIGFyZzE7IH0KKyNkZWZpbmUgU0VUKFQpIHN0YXRpYyBUIFQjI187dm9pZCBzZXRfIyNUKFQgYXJnMSkgeyBUIyNfID0gYXJnMTsgfQorI2RlZmluZSBHRVQoVCkgVCBnZXRfIyNUKCkgeyByZXR1cm4gVCMjXzsgfQordHlwZWRlZiBjaGFyKiBwdHI7CisjZGVmaW5lIFRFU1QoVCkgQUREKFQpIFNVQihUKSBNVUwoVCkgRElWKFQpIFJFVChUKSBTRVQoVCkgR0VUKFQpCitURVNUKHM4KTsKK1RFU1QodTgpOworVEVTVChzMTYpOworVEVTVCh1MTYpOworVEVTVChzMzIpOworVEVTVCh1MzIpOworVEVTVChzNjQpOworVEVTVCh1NjQpOworVEVTVChmbG9hdCk7CitURVNUKGRvdWJsZSk7CitURVNUKGxvbmcpOworVEVTVCh1bG9uZyk7CitURVNUKGYxMjgpOworCisjZGVmaW5lIEFERDIoUiwgVDEsIFQyKSBSIGFkZF8jI1QxIyNUMiMjXyMjUihUMSBhcmcxLCBUMiBhcmcyKSB7IHJldHVybiBhcmcxICsgYXJnMjsgfQorI2RlZmluZSBTVUIyKFIsIFQxLCBUMikgUiBzdWJfIyNUMSMjVDIjI18jI1IoVDEgYXJnMSwgVDIgYXJnMikgeyByZXR1cm4gYXJnMSAtIGFyZzI7IH0KKyNkZWZpbmUgTVVMMihSLCBUMSwgVDIpIFIgbXVsXyMjVDEjI1QyIyNfIyNSKFQxIGFyZzEsIFQyIGFyZzIpIHsgcmV0dXJuIGFyZzEgKiBhcmcyOyB9CisjZGVmaW5lIERJVjIoUiwgVDEsIFQyKSBSIGRpdl8jI1QxIyNUMiMjXyMjUihUMSBhcmcxLCBUMiBhcmcyKSB7IHJldHVybiBhcmcxIC8gYXJnMjsgfQorCisjZGVmaW5lIFQyX18oUiwgVDEsIFQyKSBBREQyKFIsIFQxLCBUMikgU1VCMihSLCBUMSwgVDIpIE1VTDIoUiwgVDEsIFQyKSBESVYyKFIsIFQxLCBUMikKKyNkZWZpbmUgVDJfKFIsIFQxKSBcCisgICAgVDJfXyhSLCBUMSwgczgpIFQyX18oUiwgVDEsIHU4KSBcCisgICAgVDJfXyhSLCBUMSwgczE2KSBUMl9fKFIsIFQxLCB1MTYpIFwKKyAgICBUMl9fKFIsIFQxLCBzMzIpIFQyX18oUiwgVDEsIHUzMikgXAorICAgIFQyX18oUiwgVDEsIHNMKSBUMl9fKFIsIFQxLCB1TCkgXAorICAgIFQyX18oUiwgVDEsIHM2NCkgVDJfXyhSLCBUMSwgdTY0KSBcCisKKyNkZWZpbmUgVEVTVDIoUikgXAorICAgIFQyXyhSLCBzOCkgVDJfKFIsIHU4KSBUMl8oUiwgczE2KSBUMl8oUiwgdTE2KSBUMl8oUiwgczMyKSBUMl8oUiwgdTMyKSBcCisgICAgVDJfKFIsIHNMKSBUMl8oUiwgdUwpIFQyXyhSLCBzNjQpIFQyXyhSLCB1NjQpCisKKyNpZmRlZiBub3R5ZXQKK1RFU1QyKHMzMikKK1RFU1QyKHUzMikKK1RFU1QyKHM2NCkKK1RFU1QyKHU2NCkKKyNlbmRpZgorCisjZGVmaW5lIEFERDMoUiwgVDEsIFQyLCBUMykgUiBhZGRfIyNUMSMjVDIjI1QzIyNfIyNSKFQxIGFyZzEsIFQyIGFyZzIsIFQzIGFyZzMpIHsgcmV0dXJuIGFyZzEgKyBhcmcyICsgYXJnMzsgfQorI2RlZmluZSBwYWNrX2YzMihidWYsIHYpIGRvIHsgZmxvYXQgZiA9IHY7IG1lbWNweSgoYnVmKSwgJmYsIHNpemVvZihmKSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgcGFja19mNjQoYnVmLCB2KSBkbyB7IGRvdWJsZSBmID0gdjsgbWVtY3B5KChidWYpLCAmZiwgc2l6ZW9mKGYpKTsgfSB3aGlsZSgwKQorI2RlZmluZSBwYWNrX2ludChidWYsIHYpIGRvIHsgKihidWYpID0gdjsgfSB3aGlsZSgwKQorI2RlZmluZSBwYWNrX3M4IHBhY2tfaW50CisjZGVmaW5lIHBhY2tfdTggcGFja19pbnQKKyNkZWZpbmUgcGFja19zMTYgcGFja19pbnQKKyNkZWZpbmUgcGFja191MTYgcGFja19pbnQKKyNkZWZpbmUgcGFja19zMzIgcGFja19pbnQKKyNkZWZpbmUgcGFja191MzIgcGFja19pbnQKKyNkZWZpbmUgcGFja19zNjQgcGFja19pbnQKKyNkZWZpbmUgcGFja191NjQgcGFja19pbnQKKyNkZWZpbmUgcGFja19zTCBwYWNrX2ludAorI2RlZmluZSBwYWNrX3VMIHBhY2tfaW50CisKKyNkZWZpbmUgUEFDSzMoUiwgVDEsIFQyLCBUMykgdm9pZCBwYWNrXyMjVDEjI1QyIyNUMyMjXyMjUihUMSBhcmcxLCBUMiBhcmcyLCBUMyBhcmczLCBSKiByKSB7IFwKKyAgICBmaXhfbWVtX2FjY2VzczsgXAorICAgIHBhY2tfIyNUMSgmclswXSwgYXJnMSk7IFwKKyAgICBwYWNrXyMjVDIoJnJbMV0sIGFyZzIpOyBcCisgICAgcGFja18jI1QzKCZyWzJdLCBhcmczKTsgXAorfQorCisjZGVmaW5lIFQzX19fKFIsIFQxLCBUMiwgVDMpIFBBQ0szKFIsIFQxLCBUMiwgVDMpIC8qIFNVQjIoUiwgVDEsIFQyKSBNVUwyKFIsIFQxLCBUMikgRElWMihSLCBUMSwgVDIpICovCisjZGVmaW5lIFQzX18oUiwgVDEsIFQyKSBcCisgICAgVDNfX18oUiwgVDEsIFQyLCBzOCkgVDNfX18oUiwgVDEsIFQyLCB1OCkgXAorICAgIFQzX19fKFIsIFQxLCBUMiwgczE2KSBUM19fXyhSLCBUMSwgVDIsIHUxNikgXAorICAgIFQzX19fKFIsIFQxLCBUMiwgczMyKSBUM19fXyhSLCBUMSwgVDIsIHUzMikgXAorICAgIFQzX19fKFIsIFQxLCBUMiwgc0wpIFQzX19fKFIsIFQxLCBUMiwgdUwpIFwKKyAgICBUM19fXyhSLCBUMSwgVDIsIHM2NCkgVDNfX18oUiwgVDEsIFQyLCB1NjQpIFwKKyAgICBUM19fXyhSLCBUMSwgVDIsIGYzMikgVDNfX18oUiwgVDEsIFQyLCBmNjQpIFwKKworI2RlZmluZSBUM18oUiwgVDEpIFwKKyAgICBUM19fKFIsIFQxLCBzOCkgVDNfXyhSLCBUMSwgdTgpIFwKKyAgICBUM19fKFIsIFQxLCBzMTYpIFQzX18oUiwgVDEsIHUxNikgXAorICAgIFQzX18oUiwgVDEsIHMzMikgVDNfXyhSLCBUMSwgdTMyKSBcCisgICAgVDNfXyhSLCBUMSwgc0wpIFQzX18oUiwgVDEsIHVMKSBcCisgICAgVDNfXyhSLCBUMSwgczY0KSBUM19fKFIsIFQxLCB1NjQpIFwKKyAgICBUM19fKFIsIFQxLCBmMzIpIFQzX18oUiwgVDEsIGY2NCkgXAorCisjZGVmaW5lIFRFU1QzKFIpIFwKKyAgICBUM18oUiwgczgpIFQzXyhSLCB1OCkgVDNfKFIsIHMxNikgVDNfKFIsIHUxNikgVDNfKFIsIHMzMikgVDNfKFIsIHUzMikgXAorICAgIFQzXyhSLCBzTCkgVDNfKFIsIHVMKSBUM18oUiwgczY0KSBUM18oUiwgdTY0KSBUM18oUiwgZjMyKSBUM18oUiwgZjY0KQorCitURVNUMyhzNjQpCisKK3ZvaWQgCitmb282KGludHB0cl90IGkxLCBpbnRwdHJfdCBpMiwgaW50cHRyX3QgaTMsIGludHB0cl90IGk0LCBpbnRwdHJfdCBpNSwgaW50cHRyX3QgaTYpIHsgfQorCit2b2lkIAorZm9vNShpbnRwdHJfdCBpMSwgaW50cHRyX3QgaTIsIGludHB0cl90IGkzLCBpbnRwdHJfdCBpNCwgaW50cHRyX3QgaTUpIHsgfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL1BpcGVIZWxwZXIuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvUGlwZUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMDIxMTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL1BpcGVIZWxwZXIuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IExhcnMgS2FuaXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaWZuZGVmIFBJUEVIRUxQRVJfSAorI2RlZmluZSBQSVBFSEVMUEVSX0gKKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBGRF9UWVBFIEhBTkRMRQorI2Vsc2UKKyNkZWZpbmUgRkRfVFlQRSBpbnQKKyNlbmRpZgorCitpbnQgcGlwZUhlbHBlckNyZWF0ZVBpcGUoRkRfVFlQRSBwaXBlZmRbMl0pOworY2hhciBwaXBlSGVscGVyUmVhZENoYXIoRkRfVFlQRSBmZCwgaW50IHRpbWVvdXQpOworaW50IHBpcGVIZWxwZXJXcml0ZUNoYXIoRkRfVFlQRSBmZCwgY2hhciBjKTsKK3ZvaWQgcGlwZUhlbHBlckNsb3NlUGlwZShGRF9UWVBFIGZkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL1BpcGVIZWxwZXJQb3NpeC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9QaXBlSGVscGVyUG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTI1MmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9QaXBlSGVscGVyUG9zaXguYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IExhcnMgS2FuaXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSAiUGlwZUhlbHBlci5oIgorCitpbnQgcGlwZUhlbHBlckNyZWF0ZVBpcGUoRkRfVFlQRSBwaXBlZmRbMl0pCit7CisgICAgcmV0dXJuIHBpcGUocGlwZWZkKTsKK30KKworY2hhciBwaXBlSGVscGVyUmVhZENoYXIoRkRfVFlQRSBmZCwgaW50IHRpbWVvdXQpCit7CisgICAgY2hhciBkOworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWUgPSB7dGltZW91dCwgMH07IC8vIHRpbWVvdXQgYWZ0ZXIgeCBzZWNvbmRzCisgICAgZmRfc2V0IHJlYWRfZmRzOworICAgIEZEX1pFUk8oJnJlYWRfZmRzKTsKKyAgICBGRF9TRVQoZmQsICZyZWFkX2Zkcyk7CisKKyAgICBpZihzZWxlY3QoZmQgKyAxLCAmcmVhZF9mZHMsIE5VTEwsIE5VTEwsICZ0aW1lKSA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKCByZWFkKGZkLCAmZCwgMSkgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGQ7Cit9CisKK2ludCBwaXBlSGVscGVyV3JpdGVDaGFyKEZEX1RZUEUgZmQsIGNoYXIgYykKK3sKKyAgICByZXR1cm4gd3JpdGUoZmQsICZjLCAxKTsKK30KKwordm9pZCBwaXBlSGVscGVyQ2xvc2VQaXBlKEZEX1RZUEUgZmQpIHsKKyAgICBjbG9zZShmZCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvUGlwZUhlbHBlcldpbmRvd3MuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvUGlwZUhlbHBlcldpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzBiYWNjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9QaXBlSGVscGVyV2luZG93cy5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIlBpcGVIZWxwZXIuaCIKKworaW50IHBpcGVIZWxwZXJDcmVhdGVQaXBlKEZEX1RZUEUgcGlwZWZkWzJdKQoreworICAgIGNoYXIgbmFtZVsgTUFYX1BBVEggXTsKKyAgICBzdGF0aWMgaW50IHBpcGVfaWR4ID0gMDsKKyAgICBzcHJpbnRmKCBuYW1lLCAiXFxcXC5cXFBpcGVcXHBpcGVIZWxwZXItJXUtJWkiLAorICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpR2V0Q3VycmVudFByb2Nlc3NJZCgpLCBwaXBlX2lkeCsrICk7CisKKyAgICBwaXBlZmRbMF0gPSBDcmVhdGVOYW1lZFBpcGUoIG5hbWUsIFBJUEVfQUNDRVNTX0lOQk9VTkQgfCBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1RZUEVfQllURSB8IFBJUEVfV0FJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcGlwZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICA1LCAgICAgICAgIC8vIE91dCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgIDUsICAgICAgICAgLy8gSW4gYnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICA2MCAqIDEwMDAsICAgIC8vIFRpbWVvdXQgaW4gbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7CisgICAgaWYocGlwZWZkWzBdID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBwaXBlZmRbMV0gPSBDcmVhdGVGaWxlKCBuYW1lLCBHRU5FUklDX1dSSVRFLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgaWYocGlwZWZkWzFdID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIENsb3NlSGFuZGxlKCBwaXBlZmRbMF0gKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworY2hhciBwaXBlSGVscGVyUmVhZENoYXIoRkRfVFlQRSBmZCwgaW50IHRpbWVvdXQpCit7CisgICAgY2hhciBkOworICAgIE9WRVJMQVBQRUQgb3ZsOworICAgIFplcm9NZW1vcnkoJm92bCwgc2l6ZW9mKG92bCkpOworICAgIG92bC5oRXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICAgIGlmKCBSZWFkRmlsZShmZCwgJmQsIDEsIE5VTEwsICZvdmwpID09IDApIHsKKyAgICAgICAgRFdPUkQgcmVjdmQgPSAwOzsKKyAgICAgICAgRFdPUkQgcmVzID0gV2FpdEZvclNpbmdsZU9iamVjdChvdmwuaEV2ZW50LCB0aW1lb3V0ICogMTAwMCk7CisgICAgICAgIGlmKCByZXMgIT0gV0FJVF9PQkpFQ1RfMCApIHsKKyAgICAgICAgICAgIENsb3NlSGFuZGxlKG92bC5oRXZlbnQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYoIEdldE92ZXJsYXBwZWRSZXN1bHQoZmQsICZvdmwsICZyZWN2ZCwgRkFMU0UpID09IDAgKSB7CisgICAgICAgICAgICBDbG9zZUhhbmRsZShvdmwuaEV2ZW50KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIENsb3NlSGFuZGxlKG92bC5oRXZlbnQpOworICAgIHJldHVybiBkOworfQorCitpbnQgcGlwZUhlbHBlcldyaXRlQ2hhcihGRF9UWVBFIGZkLCBjaGFyIGMpCit7CisgICAgRFdPUkQgd3JpdHRlbjsKKyAgICByZXR1cm4gV3JpdGVGaWxlKGZkLCAmYywgMSwgJndyaXR0ZW4sIE5VTEwpID09IDAgPyAwIDogMTsKK30KKwordm9pZCBwaXBlSGVscGVyQ2xvc2VQaXBlKEZEX1RZUEUgZmQpIHsKKyAgICBDbG9zZUhhbmRsZShmZCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9Qb2ludGVyVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9Qb2ludGVyVGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzdhYjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL1BvaW50ZXJUZXN0LmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXYXluZSBNZWlzc25lci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgordHlwZWRlZiB2b2lkKiBwdHI7Cit0eXBlZGVmIHZvaWQqIHBvaW50ZXI7CisjaWZkZWYgX1dJTjMyCit0eXBlZGVmIGNoYXIqIGNhZGRyX3Q7CisjZW5kaWYKKworI2RlZmluZSBSRVQoVCkgVCBwdHJfcmV0XyMjVCh2b2lkKiBhcmcxLCBpbnQgb2Zmc2V0KSB7IFwKKyAgICBUIHRtcDsgbWVtY3B5KCZ0bXAsIChjYWRkcl90KSBhcmcxICsgb2Zmc2V0LCBzaXplb2YodG1wKSk7IHJldHVybiB0bXA7IFwKK30KKyNkZWZpbmUgU0VUKFQpIHZvaWQgcHRyX3NldF8jI1Qodm9pZCogYXJnMSwgaW50IG9mZnNldCwgVCB2YWx1ZSkgeyBcCisgICAgbWVtY3B5KChjYWRkcl90KSBhcmcxICsgb2Zmc2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOyBcCit9CisjZGVmaW5lIFRFU1QoVCkgU0VUKFQpIFJFVChUKQorCitURVNUKGludDhfdCk7CitURVNUKGludDE2X3QpOworVEVTVChpbnQzMl90KTsKK1RFU1QoaW50NjRfdCk7CitURVNUKGZsb2F0KTsKK1RFU1QoZG91YmxlKTsKK1RFU1QocG9pbnRlcik7CisKK3ZvaWQqCitwdHJfcmV0dXJuX2FycmF5X2VsZW1lbnQodm9pZCAqKnB0ckFycmF5LCBpbnQgYXJyYXlJbmRleCkgCit7CisgICAgcmV0dXJuIHB0ckFycmF5W2FycmF5SW5kZXhdOworfQorCit2b2lkCitwdHJfc2V0X2FycmF5X2VsZW1lbnQodm9pZCAqKnB0ckFycmF5LCBpbnQgYXJyYXlJbmRleCwgdm9pZCAqdmFsdWUpCit7ICAgIAorICAgIHB0ckFycmF5W2FycmF5SW5kZXhdID0gdmFsdWU7Cit9CisKK3ZvaWQqCitwdHJfbWFsbG9jKGludCBzaXplKSAKK3sKKyAgICByZXR1cm4gY2FsbG9jKDEsIHNpemUpOworfQordm9pZAorcHRyX2ZyZWUodm9pZCogcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKwordm9pZCoKK3B0cl9mcm9tX2FkZHJlc3ModWludHB0cl90IGFkZHIpCit7CisgICAgcmV0dXJuICh2b2lkICopIGFkZHI7Cit9CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvUmVmZXJlbmNlVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9SZWZlcmVuY2VUZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkZDg4YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvUmVmZXJlbmNlVGVzdC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgUkVGKFQpIHZvaWQgcmVmXyMjVChUIGFyZywgVCogcmVzdWx0KSB7ICpyZXN1bHQgPSBhcmc7IH0KKyNkZWZpbmUgQUREKFQpIHZvaWQgcmVmX2FkZF8jI1QoVCBhcmcxLCBUIGFyZzIsIFQqIHJlc3VsdCkgeyAqcmVzdWx0ID0gYXJnMSArIGFyZzI7IH0KKyNkZWZpbmUgU1VCKFQpIHZvaWQgcmVmX3N1Yl8jI1QoVCBhcmcxLCBUIGFyZzIsIFQqIHJlc3VsdCkgeyAqcmVzdWx0ID0gYXJnMSAtIGFyZzI7IH0KKyNkZWZpbmUgTVVMKFQpIHZvaWQgcmVmX211bF8jI1QoVCBhcmcxLCBUIGFyZzIsIFQqIHJlc3VsdCkgeyAqcmVzdWx0ID0gYXJnMSAqIGFyZzI7IH0KKyNkZWZpbmUgRElWKFQpIHZvaWQgcmVmX2Rpdl8jI1QoVCBhcmcxLCBUIGFyZzIsIFQqIHJlc3VsdCkgeyAqcmVzdWx0ID0gYXJnMSAvIGFyZzI7IH0KKyNkZWZpbmUgVEVTVChUKSBBREQoVCkgU1VCKFQpIE1VTChUKSBESVYoVCkgUkVGKFQpCisKK1RFU1QoaW50OF90KTsKK1RFU1QoaW50MTZfdCk7CitURVNUKGludDMyX3QpOworVEVTVChpbnQ2NF90KTsKK1RFU1QoZmxvYXQpOworVEVTVChkb3VibGUpOworCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvU3RyaW5nVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9TdHJpbmdUZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyMjQyYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvU3RyaW5nVGVzdC5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCAKK3N0cmluZ19lcXVhbHMoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKQoreworICAgIHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOworfQorCit2b2lkIAorc3RyaW5nX3NldChjaGFyKiBzMSwgY29uc3QgY2hhciogczIpCit7CisgICAgc3RyY3B5KHMxLCBzMik7Cit9Cit2b2lkCitzdHJpbmdfY29uY2F0KGNoYXIqIGRzdCwgY29uc3QgY2hhciogc3JjKQoreworICAgIHN0cmNhdChkc3QsIHNyYyk7Cit9Cit2b2lkCitzdHJpbmdfZHVtbXkoY2hhciogZHVtbXkpCit7Cit9Citjb25zdCBjaGFyKgorc3RyaW5nX251bGwodm9pZCkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9TdHJ1Y3RUZXN0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL1N0cnVjdFRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTY4M2QzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9TdHJ1Y3RUZXN0LmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgV2F5bmUgTWVpc3NuZXIuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgQW5kcmVhIEZhenppIDxhbmRyZWEuZmF6emlAYWxjYWNvb3AuaXQ+LgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3R5cGVkZWYgY2hhciBzODsKK3R5cGVkZWYgc2hvcnQgczE2OwordHlwZWRlZiBpbnQgczMyOwordHlwZWRlZiBsb25nIGxvbmcgczY0OwordHlwZWRlZiBmbG9hdCBmMzI7Cit0eXBlZGVmIGRvdWJsZSBmNjQ7CisKK3R5cGVkZWYgc3RydWN0IGJ1Z2dlZF9zdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyIHZpc2libGU7CisgIHVuc2lnbmVkIGludCB4OworICB1bnNpZ25lZCBpbnQgeTsKKyAgc2hvcnQgcng7CisgIHNob3J0IHJ5OworICB1bnNpZ25lZCBjaGFyIG9yZGVyOworICB1bnNpZ25lZCBjaGFyIHNpemU7Cit9IGJ1Z2dlZF9zdHJ1Y3RfdDsKKwordW5zaWduZWQgaW50CitidWdnZWRfc3RydWN0X3NpemUoKSB7CisgICAgcmV0dXJuIHNpemVvZihidWdnZWRfc3RydWN0X3QpOworfQorCitzdHJ1Y3QgdGVzdDEgeworICAgIGNoYXIgYjsKKyAgICBzaG9ydCBzOworICAgIGludCBpOworICAgIGxvbmcgbG9uZyBqOworICAgIGxvbmcgbDsKKyAgICBmbG9hdCBmOworICAgIGRvdWJsZSBkOworICAgIGNoYXIgc3RyaW5nWzMyXTsKK307CisKK3N0cnVjdCBzdHJ1Y3Rfd2l0aF9hcnJheSB7CisgICAgY2hhciBjOworICAgIGludCBhWzVdOworfTsKKworc3RydWN0IG5lc3RlZCB7CisgICAgaW50IGk7Cit9OworCitzdHJ1Y3QgY29udGFpbmVyIHsKKyAgICBjaGFyIGZpcnN0OworICAgIHN0cnVjdCBuZXN0ZWQgczsKK307CisKK2ludAorc3RydWN0X2FsaWduX25lc3RlZF9zdHJ1Y3Qoc3RydWN0IGNvbnRhaW5lciogYSkgeyByZXR1cm4gYS0+cy5pOyB9CisKK3ZvaWQqCitzdHJ1Y3RfZmllbGRfYXJyYXkoc3RydWN0IHN0cnVjdF93aXRoX2FycmF5KiBzKSB7IHJldHVybiAmcy0+YTsgfQorCitzdHJ1Y3QgY29udGFpbmVyKgorc3RydWN0X21ha2VfY29udGFpbmVyX3N0cnVjdChpbnQgaSkKK3sKKyAgICBzdGF0aWMgc3RydWN0IGNvbnRhaW5lciBjczsKKyAgICBtZW1zZXQoJmNzLCAwLCBzaXplb2YoY3MpKTsKKyAgICBjcy5maXJzdCA9IDE7CisgICAgY3Mucy5pID0gaTsKKyAgICByZXR1cm4gJmNzOworfQorCisjZGVmaW5lIFQoeCwgdHlwZSkgXAorICAgIHR5cGUgc3RydWN0X2ZpZWxkXyMjdHlwZShzdHJ1Y3QgdGVzdDEqIHQpIHsgcmV0dXJuIHQtPng7IH0gXAorICAgIHN0cnVjdCB0eXBlIyNfYWxpZ24geyBjaGFyIGZpcnN0OyB0eXBlIHZhbHVlOyB9OyBcCisgICAgdHlwZSBzdHJ1Y3RfYWxpZ25fIyN0eXBlKHN0cnVjdCB0eXBlIyNfYWxpZ24qIGEpIHsgcmV0dXJuIGEtPnZhbHVlOyB9CisKK1QoYiwgczgpOworVChzLCBzMTYpOworVChpLCBzMzIpOworVChqLCBzNjQpOworVChmLCBmMzIpOworVChkLCBmNjQpOworVChsLCBsb25nKTsKKwordm9pZAorc3RydWN0X3NldF9zdHJpbmcoc3RydWN0IHRlc3QxKiB0LCBjaGFyKiBzKQoreworICAgIHN0cmNweSh0LT5zdHJpbmcsIHMpOworfQorCitzdHJ1Y3QgdGVzdDEqCitzdHJ1Y3RfbWFrZV9zdHJ1Y3QoY2hhciBiLCBzaG9ydCBzLCBpbnQgaSwgbG9uZyBsb25nIGxsLCBmbG9hdCBmLCBkb3VibGUgZCkKK3sKKyAgICBzdGF0aWMgc3RydWN0IHRlc3QxIHQ7CisgICAgbWVtc2V0KCZ0LCAwLCBzaXplb2YodCkpOworICAgIHQuYiA9IGI7CisgICAgdC5zID0gczsKKyAgICB0LmkgPSBpOworICAgIHQuaiA9IGxsOworICAgIHQuZiA9IGY7CisgICAgdC5kID0gZDsKKyAgICByZXR1cm4gJnQ7Cit9CisKK3R5cGVkZWYgaW50ICgqYWRkX2NiKShpbnQgYTEsIGludCBhMik7Cit0eXBlZGVmIGludCAoKnN1Yl9jYikoaW50IGExLCBpbnQgYTIpOworc3RydWN0IHRlc3QyIHsKKyAgICBhZGRfY2IgIGFkZF9jYWxsYmFjazsKKyAgICBzdWJfY2IgIHN1Yl9jYWxsYmFjazsKK307CisKK2ludAorc3RydWN0X2NhbGxfYWRkX2NiKHN0cnVjdCB0ZXN0MiogdCwgaW50IGExLCBpbnQgYTIpCit7CisgICAgcmV0dXJuIHQtPmFkZF9jYWxsYmFjayhhMSwgYTIpOworfQorCitpbnQKK3N0cnVjdF9jYWxsX3N1Yl9jYihzdHJ1Y3QgdGVzdDIqIHQsIGludCBhMSwgaW50IGEyKQoreworICAgIHJldHVybiB0LT5zdWJfY2FsbGJhY2soYTEsIGEyKTsKK30KKworCitzdHJ1Y3Qgc3RydWN0X3dpdGhfYXJyYXkqCitzdHJ1Y3RfbWFrZV9zdHJ1Y3Rfd2l0aF9hcnJheShpbnQgYV8wLCBpbnQgYV8xLCBpbnQgYV8yLCBpbnQgYV8zLCBpbnQgYV80KQoreworICAgIHN0YXRpYyBzdHJ1Y3Qgc3RydWN0X3dpdGhfYXJyYXkgczsKKworICAgIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKworICAgIHMuYVswXSA9IGFfMDsKKyAgICBzLmFbMV0gPSBhXzE7CisgICAgcy5hWzJdID0gYV8yOworICAgIHMuYVszXSA9IGFfMzsKKyAgICBzLmFbNF0gPSBhXzQ7CisKKyAgICByZXR1cm4gJnM7CisKK30KKworc3RydWN0IHM4czMyIHsKKyAgICBjaGFyIHM4OworICAgIGludCBzMzI7Cit9OworCitzdHJ1Y3QgczhzMzIKK3N0cnVjdF9yZXR1cm5fczhzMzIoKQoreworICAgIHN0cnVjdCBzOHMzMiBzOworICAgIHMuczggPSAweDdmOworICAgIHMuczMyID0gMHgxMjM0NTY3ODsKKworICAgIHJldHVybiBzOworfQorCitzdHJ1Y3QgczhzMzIKK3N0cnVjdF9zOHMzMl9zZXQoY2hhciBzOCwgaW50IHMzMikKK3sKKyAgICBzdHJ1Y3QgczhzMzIgczsKKworICAgIHMuczggPSBzODsKKyAgICBzLnMzMiA9IHMzMjsKKworICAgIHJldHVybiBzOworfQorCitpbnQKK3N0cnVjdF9zOHMzMl9nZXRfczgoc3RydWN0IHM4czMyIHMpCit7CisgICAgcmV0dXJuIHMuczg7Cit9CisKK2ludAorc3RydWN0X3M4czMyX2dldF9zMzIoc3RydWN0IHM4czMyIHMpCit7CisgICAgcmV0dXJuIHMuczMyOworfQorCitzdHJ1Y3QgczhzMzIKK3N0cnVjdF9zOHMzMl9yZXRfczhzMzIoc3RydWN0IHM4czMyIHMpCit7CisgICAgcmV0dXJuIHM7Cit9CisKKy8vIFBhc3MgYSBzdHJ1Y3QgYW5kIGFuIGludCBhcmcsIGVuc3VyZSB0aGUgaW50IGFyZyBpcyBwYXNzZWQgY29ycmVjdGx5CitpbnQKK3N0cnVjdF9zOHMzMl9zMzJfcmV0X3MzMihzdHJ1Y3QgczhzMzIgcywgaW50IHMzMikKK3sKKyAgICByZXR1cm4gczMyOworfQorCisvLyBQYXNzIGEgc3RydWN0IGFuZCBhIGxvbmcgbG9uZyBhcmcsIGVuc3VyZSB0aGUgbG9uZyBsb25nIGFyZyBpcyBwYXNzZWQgY29ycmVjdGx5Citsb25nIGxvbmcKK3N0cnVjdF9zOHMzMl9zNjRfcmV0X3M2NChzdHJ1Y3QgczhzMzIgcywgbG9uZyBsb25nIHM2NCkKK3sKKyAgICByZXR1cm4gczY0OworfQorCisvLyBQYXNzIGEgc3RydWN0IGFuZCBhIGxvbmcgbG9uZyBhcmcsIGVuc3VyZSB0aGUgbG9uZyBsb25nIGFyZyBpcyBwYXNzZWQgY29ycmVjdGx5CitpbnQKK3N0cnVjdF9zMzJfcHRyX3MzMl9zOHMzMl9yZXRfczMyKGludCBzMzJhLCB2b2lkICpwdHIsIGludCBzMzJiLCBzdHJ1Y3QgczhzMzIgcykKK3sKKyAgICBpZiAocHRyICE9IE5VTEwpICooc3RydWN0IHM4czMyICopIHB0ciA9IHM7CisgICAgcmV0dXJuIHMuczMyOworfQorCisvLyBQYXNzIGEgY2hhciAqLCBjb3B5IGludG8gYnVmZmVyIGxlbmd0aCBzdHJ1Y3QKK3N0cnVjdCBzdHJ1Y3Rfc3RyaW5nIHsKKyAgICBjaGFyICpieXRlczsKKyAgICBpbnQgbGVuOworfTsKKworc3RydWN0IHN0cnVjdF9zdHJpbmcKK3N0cnVjdF92YXJhcmdzX3JldF9zdHJ1Y3Rfc3RyaW5nKGludCBsZW4sIC4uLikKK3sKKyAgICBzdHJ1Y3Qgc3RydWN0X3N0cmluZyBzczsKKyAgICB2YV9saXN0IHZsOworICAgIGNoYXIqIGNwID0gTlVMTDsKKworICAgIHZhX3N0YXJ0KHZsLCBsZW4pOworCisgICAgc3MubGVuID0gbGVuOworICAgIHNzLmJ5dGVzID0gdmFfYXJnKHZsLCBjaGFyICopOworICAgIGlmIChzcy5ieXRlcyAhPSBOVUxMKSB7CisgICAgICAgIGNwID0gbWFsbG9jKHN0cmxlbihzcy5ieXRlcykgKyAxKTsKKyAgICAgICAgc3RyY3B5KGNwLCBzcy5ieXRlcyk7CisgICAgICAgIHNzLmJ5dGVzID0gY3A7CisgICAgfQorCisgICAgdmFfZW5kKHZsKTsKKworICAgIHJldHVybiBzczsKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9VbmlvblRlc3QuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvVW5pb25UZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyOWEzMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZml4dHVyZXMvVW5pb25UZXN0LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXYXluZSBNZWlzc25lci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordHlwZWRlZiBjaGFyIHM4OwordHlwZWRlZiBzaG9ydCBzMTY7Cit0eXBlZGVmIGludCBzMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyBzNjQ7Cit0eXBlZGVmIGZsb2F0IGYzMjsKK3R5cGVkZWYgZG91YmxlIGY2NDsKKwordHlwZWRlZiB1bmlvbiB1bmlvbl90ZXN0IHsKKyAgICBjaGFyIGI7CisgICAgc2hvcnQgczsKKyAgICBpbnQgaTsKKyAgICBsb25nIGxvbmcgajsKKyAgICBsb25nIGw7CisgICAgZmxvYXQgZjsKKyAgICBkb3VibGUgZDsKKyAgICBzOCBhWzEwXTsKK30gdW5pb25fdGVzdF90OworCisjZGVmaW5lIFQoeCwgdHlwZSkgXAorICB0eXBlIHVuaW9uX2FsaWduXyMjdHlwZSh1bmlvbl90ZXN0X3QqIHUpIHsgcmV0dXJuIHUtPng7IH0gXAorICB1bmlvbl90ZXN0X3QqIHVuaW9uX21ha2VfdW5pb25fd2l0aF8jI3R5cGUodHlwZSB2YWx1ZSkgeyBzdGF0aWMgdW5pb25fdGVzdF90IHU7IHUueCA9IHZhbHVlOyByZXR1cm4gJnU7IH0KKworVChiLCBzOCk7CitUKHMsIHMxNik7CitUKGksIHMzMik7CitUKGosIHM2NCk7CitUKGYsIGYzMik7CitUKGQsIGY2NCk7CitUKGwsIGxvbmcpOworCit1bnNpZ25lZCBpbnQgdW5pb25fc2l6ZSgpIHsgcmV0dXJuIHNpemVvZih1bmlvbl90ZXN0X3QpOyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL1ZhcmlhZGljVGVzdC5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9WYXJpYWRpY1Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjNkODAxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9WYXJpYWRpY1Rlc3QuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdheW5lIE1laXNzbmVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3R5cGVkZWYgaW50OF90IHM4OwordHlwZWRlZiB1aW50OF90IHU4OwordHlwZWRlZiBpbnQxNl90IHMxNjsKK3R5cGVkZWYgdWludDE2X3QgdTE2OwordHlwZWRlZiBpbnQzMl90IHMzMjsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiBpbnQ2NF90IHM2NDsKK3R5cGVkZWYgdWludDY0X3QgdTY0OwordHlwZWRlZiBzaWduZWQgbG9uZyBzTDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1TDsKK3R5cGVkZWYgZmxvYXQgRjsKK3R5cGVkZWYgZG91YmxlIEQ7CisKK3ZvaWQgcGFja192YXJhcmdzKHM2NCogYnVmLCBjb25zdCBjaGFyKiBmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIGludCBjOworICAgIGRvdWJsZSBkOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHdoaWxlICgoYyA9ICpmbXQrKykpIHsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCBzMzIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCBsb25nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2onOgorICAgICAgICAgICAgICAgICpidWYrKyA9IHZhX2FyZyhhcCwgczY0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgZCA9IHZhX2FyZyhhcCwgZG91YmxlKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmKyssICZkLCBzaXplb2YoZCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgICpidWYrKyA9IHZhX2FyZyhhcCwgdTMyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICAgICpidWYrKyA9IHZhX2FyZyhhcCwgdW5zaWduZWQgbG9uZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdmFfZW5kKGFwKTsKK30KKworaW50IHBhY2tfdmFyYXJnczIoczY0KiBidWYsIGludCByZXR2YWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgaW50IGM7CisgICAgZG91YmxlIGQ7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgd2hpbGUgKChjID0gKmZtdCsrKSkgeworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAqYnVmKysgPSB2YV9hcmcoYXAsIHMzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgICAgICAqYnVmKysgPSB2YV9hcmcoYXAsIGxvbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaic6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCBzNjQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICBkID0gdmFfYXJnKGFwLCBkb3VibGUpOworICAgICAgICAgICAgICAgIG1lbWNweShidWYrKywgJmQsIHNpemVvZihkKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCB1MzIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgKmJ1ZisrID0gdmFfYXJnKGFwLCB1bnNpZ25lZCBsb25nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICB2YV9lbmQoYXApOworICAgIHJldHVybiByZXR2YWwgKyAxOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9jbGFzc2VzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9maXh0dXJlcy9jbGFzc2VzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTc2OGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2ZpeHR1cmVzL2NsYXNzZXMucmIKQEAgLTAsMCArMSw0MzggQEAKK21vZHVsZSBGRklTcGVjcworICAjCisgICMgQ2FsbGJhY2sgZml4dHVyZXMKKyAgIworICBtb2R1bGUgTGliVGVzdAorICAgIGNhbGxiYWNrIDpjYlZyUzgsIFsgXSwgOmNoYXIKKyAgICBjYWxsYmFjayA6Y2JWclU4LCBbIF0sIDp1Y2hhcgorICAgIGNhbGxiYWNrIDpjYlZyUzE2LCBbIF0sIDpzaG9ydAorICAgIGNhbGxiYWNrIDpjYlZyVTE2LCBbIF0sIDp1c2hvcnQKKyAgICBjYWxsYmFjayA6Y2JWclMzMiwgWyBdLCA6aW50CisgICAgY2FsbGJhY2sgOmNiVnJVMzIsIFsgXSwgOnVpbnQKKyAgICBjYWxsYmFjayA6Y2JWckwsIFsgXSwgOmxvbmcKKyAgICBjYWxsYmFjayA6Y2JWclVMLCBbIF0sIDp1bG9uZworICAgIGNhbGxiYWNrIDpjYlZyUzY0LCBbIF0sIDpsb25nX2xvbmcKKyAgICBjYWxsYmFjayA6Y2JWclU2NCwgWyBdLCA6dWxvbmdfbG9uZworICAgIGNhbGxiYWNrIDpjYlZyUCwgW10sIDpwb2ludGVyCisgICAgY2FsbGJhY2sgOmNiQ3JWLCBbIDpjaGFyIF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiU3JWLCBbIDpzaG9ydCBdLCA6dm9pZAorICAgIGNhbGxiYWNrIDpjYklyViwgWyA6aW50IF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiTHJWLCBbIDpsb25nIF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiVUxyViwgWyA6dWxvbmcgXSwgOnZvaWQKKyAgICBjYWxsYmFjayA6Y2JMclYsIFsgOmxvbmdfbG9uZyBdLCA6dm9pZAorCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tWclM4LCA6dGVzdENsb3N1cmVWckIsIFsgOmNiVnJTOCBdLCA6Y2hhcgorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJVOCwgOnRlc3RDbG9zdXJlVnJCLCBbIDpjYlZyVTggXSwgOnVjaGFyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tWclMxNiwgOnRlc3RDbG9zdXJlVnJTLCBbIDpjYlZyUzE2IF0sIDpzaG9ydAorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJVMTYsIDp0ZXN0Q2xvc3VyZVZyUywgWyA6Y2JWclUxNiBdLCA6dXNob3J0CisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tWclMzMiwgOnRlc3RDbG9zdXJlVnJJLCBbIDpjYlZyUzMyIF0sIDppbnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1ZyVTMyLCA6dGVzdENsb3N1cmVWckksIFsgOmNiVnJVMzIgXSwgOnVpbnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1ZyTCwgOnRlc3RDbG9zdXJlVnJMLCBbIDpjYlZyTCBdLCA6bG9uZworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJVTCwgOnRlc3RDbG9zdXJlVnJMLCBbIDpjYlZyVUwgXSwgOnVsb25nCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tWclM2NCwgOnRlc3RDbG9zdXJlVnJMTCwgWyA6Y2JWclM2NCBdLCA6bG9uZ19sb25nCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tWclU2NCwgOnRlc3RDbG9zdXJlVnJMTCwgWyA6Y2JWclU2NCBdLCA6dWxvbmdfbG9uZworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJQLCA6dGVzdENsb3N1cmVWclAsIFsgOmNiVnJQIF0sIDpwb2ludGVyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tDclYsIDp0ZXN0Q2xvc3VyZUJyViwgWyA6Y2JDclYsIDpjaGFyIF0sIDp2b2lkCisgICAgYXR0YWNoX3ZhcmlhYmxlIDpjYlZyUzgsIDpndmFyX3BvaW50ZXIsIDpjYlZyUzgKKyAgICBhdHRhY2hfdmFyaWFibGUgOnBWclM4LCA6Z3Zhcl9wb2ludGVyLCA6cG9pbnRlcgorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdEdWYXJDYWxsYmFja1ZyUzgsIDp0ZXN0Q2xvc3VyZVZyQiwgWyA6cG9pbnRlciBdLCA6Y2hhcgorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdE9wdGlvbmFsQ2FsbGJhY2tDclYsIDp0ZXN0T3B0aW9uYWxDbG9zdXJlQnJWLCBbIDpjYkNyViwgOmNoYXIgXSwgOnZvaWQKKworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrVnJTOCwgOnRlc3RDbG9zdXJlVnJCLCBbIGNhbGxiYWNrKFsgXSwgOmNoYXIpIF0sIDpjaGFyCisKKyAgICBjYWxsYmFjayA6Y2JfcmV0dXJuX3R5cGUsIFsgOmludCBdLCA6aW50CisgICAgY2FsbGJhY2sgOmNiX2xvb2t1cCwgWyBdLCA6Y2JfcmV0dXJuX3R5cGUKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RSZXR1cm5zQ2FsbGJhY2ssIDp0ZXN0UmV0dXJuc0Nsb3N1cmUsIFsgOmNiX2xvb2t1cCwgOmludCBdLCA6aW50CisKKyAgICBjYWxsYmFjayA6ZnVuY3B0ciwgWyA6aW50IF0sIDppbnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RSZXR1cm5zRnVuY3Rpb25Qb2ludGVyLCBbICBdLCA6ZnVuY3B0cgorCisgICAgY2FsbGJhY2sgOmNiUzhyViwgWyA6Y2hhciBdLCA6dm9pZAorICAgIGNhbGxiYWNrIDpjYlU4clYsIFsgOnVjaGFyIF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiUzE2clYsIFsgOnNob3J0IF0sIDp2b2lkCisgICAgY2FsbGJhY2sgOmNiVTE2clYsIFsgOnVzaG9ydCBdLCA6dm9pZAorCisgICAgY2FsbGJhY2sgOmNiUzMyclYsIFsgOmludCBdLCA6dm9pZAorICAgIGNhbGxiYWNrIDpjYlUzMnJWLCBbIDp1aW50IF0sIDp2b2lkCisKKyAgICBjYWxsYmFjayA6Y2JMclYsIFsgOmxvbmcgXSwgOnZvaWQKKyAgICBjYWxsYmFjayA6Y2JVTHJWLCBbIDp1bG9uZyBdLCA6dm9pZAorCisgICAgY2FsbGJhY2sgOmNiUzY0clYsIFsgOmxvbmdfbG9uZyBdLCA6dm9pZAorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdENhbGxiYWNrQ3JWLCA6dGVzdENsb3N1cmVCclYsIFsgOmNiUzhyViwgOmNoYXIgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1U4clYsIDp0ZXN0Q2xvc3VyZUJyViwgWyA6Y2JVOHJWLCA6dWNoYXIgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1NyViwgOnRlc3RDbG9zdXJlU3JWLCBbIDpjYlMxNnJWLCA6c2hvcnQgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1UxNnJWLCA6dGVzdENsb3N1cmVTclYsIFsgOmNiVTE2clYsIDp1c2hvcnQgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja0lyViwgOnRlc3RDbG9zdXJlSXJWLCBbIDpjYlMzMnJWLCA6aW50IF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tVMzJyViwgOnRlc3RDbG9zdXJlSXJWLCBbIDpjYlUzMnJWLCA6dWludCBdLCA6dm9pZAorCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tMclYsIDp0ZXN0Q2xvc3VyZUxyViwgWyA6Y2JMclYsIDpsb25nIF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tVTHJWLCA6dGVzdENsb3N1cmVVTHJWLCBbIDpjYlVMclYsIDp1bG9uZyBdLCA6dm9pZAorCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0Q2FsbGJhY2tMTHJWLCA6dGVzdENsb3N1cmVMTHJWLCBbIDpjYlM2NHJWLCA6bG9uZ19sb25nIF0sIDp2b2lkCisgIGVuZAorCisgICMKKyAgIyBFbnVtIGZpeHR1cmVzCisgICMKKyAgbW9kdWxlIFRlc3RFbnVtMAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgZW5kCisKKyAgbW9kdWxlIFRlc3RFbnVtMQorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIExJQlJBUlkKKworICAgIGVudW0gWzpjMSwgOmMyLCA6YzMsIDpjNF0KKyAgICBlbnVtIFs6YzUsIDQyLCA6YzYsIDpjNywgOmM4XQorICAgIGVudW0gWzpjOSwgNDIsIDpjMTAsIDpjMTEsIDQyNDIsIDpjMTJdCisgICAgZW51bSBbOmMxMywgNDIsIDpjMTQsIDQyNDIsIDpjMTUsIDQyNDI0MiwgOmMxNiwgNDI0MjQyNDJdCisKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RfdW50YWdnZWRfZW51bSwgWzppbnRdLCA6aW50CisgIGVuZAorCisgIG1vZHVsZSBUZXN0RW51bTMKKyAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgZmZpX2xpYiBMSUJSQVJZCisKKyAgICBlbnVtIDplbnVtX3R5cGUxLCBbOmMxLCA6YzIsIDpjMywgOmM0XQorICAgIGVudW0gOmVudW1fdHlwZTIsIFs6YzUsIDQyLCA6YzYsIDpjNywgOmM4XQorICAgIGVudW0gOmVudW1fdHlwZTMsIFs6YzksIDQyLCA6YzEwLCA6YzExLCA0MjQyLCA6YzEyXQorICAgIGVudW0gOmVudW1fdHlwZTQsIFs6YzEzLCA0MiwgOmMxNCwgNDI0MiwgOmMxNSwgNDI0MjQyLCA6YzE2LCA0MjQyNDI0Ml0KKworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtMSwgWzplbnVtX3R5cGUxXSwgOmVudW1fdHlwZTEKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RfdGFnZ2VkX3R5cGVkZWZfZW51bTIsIFs6ZW51bV90eXBlMl0sIDplbnVtX3R5cGUyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0X3RhZ2dlZF90eXBlZGVmX2VudW0zLCBbOmVudW1fdHlwZTNdLCA6ZW51bV90eXBlMworICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdF90YWdnZWRfdHlwZWRlZl9lbnVtNCwgWzplbnVtX3R5cGU0XSwgOmVudW1fdHlwZTQKKyAgZW5kCisKKyAgIworICAjIEVycm5vIGZpeHR1cmVzCisgICMKKyAgbW9kdWxlIExpYlRlc3QKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnNldExhc3RFcnJvciwgWyA6aW50IF0sIDp2b2lkCisgIGVuZAorCisgICMKKyAgIyBNYW5hZ2VkU3RydWN0IGZpeHR1cmVzCisgICMKKyAgbW9kdWxlIExpYlRlc3QKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnB0cl9mcm9tX2FkZHJlc3MsIFsgRkZJOjpQbGF0Zm9ybTo6QUREUkVTU19TSVpFID09IDMyID8gOnVpbnQgOiA6dWxvbmdfbG9uZyBdLCA6cG9pbnRlcgorICBlbmQKKworICBjbGFzcyBOb1JlbGVhc2UgPCBNYW5hZ2VkU3RydWN0CisgICAgbGF5b3V0IDppLCA6aW50CisgIGVuZAorCisgIGNsYXNzIFdoYXRDbGFzc0FtSSA8IE1hbmFnZWRTdHJ1Y3QKKyAgICBsYXlvdXQgOmksIDppbnQKKyAgICBkZWYgc2VsZi5yZWxlYXNlOyBlbmQKKyAgZW5kCisKKyAgY2xhc3MgUGxlYXNlUmVsZWFzZU1lIDwgTWFuYWdlZFN0cnVjdAorICAgIGxheW91dCA6aSwgOmludAorICAgIEBAY291bnQgPSAwCisgICAgZGVmIHNlbGYucmVsZWFzZQorICAgICAgQEBjb3VudCArPSAxCisgICAgZW5kCisgICAgZGVmIHNlbGYud2FpdF9nYyhjb3VudCkKKyAgICAgIGxvb3AgPSA1CisgICAgICB3aGlsZSBsb29wID4gMCAmJiBAQGNvdW50IDwgY291bnQKKyAgICAgICAgbG9vcCAtPSAxCisgICAgICAgIGlmIFJVQllfUExBVEZPUk0gPX4gL2phdmEvCisgICAgICAgICAgcmVxdWlyZSAnamF2YScKKyAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmdjCisgICAgICAgIGVsc2UKKyAgICAgICAgICBHQy5zdGFydAorICAgICAgICBlbmQKKyAgICAgICAgc2xlZXAgMC4wNSBpZiBAQGNvdW50IDwgY291bnQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICAjCisgICMgTnVtYmVyIGZpeHR1cmVzCisgICMKKyAgbW9kdWxlIExpYlRlc3QKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF9zOCwgWyA6Y2hhciBdLCA6Y2hhcgorICAgIGF0dGFjaF9mdW5jdGlvbiA6cmV0X3U4LCBbIDp1Y2hhciBdLCA6dWNoYXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF9zMTYsIFsgOnNob3J0IF0sIDpzaG9ydAorICAgIGF0dGFjaF9mdW5jdGlvbiA6cmV0X3UxNiwgWyA6dXNob3J0IF0sIDp1c2hvcnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF9zMzIsIFsgOmludCBdLCA6aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfdTMyLCBbIDp1aW50IF0sIDp1aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfczY0LCBbIDpsb25nX2xvbmcgXSwgOmxvbmdfbG9uZworICAgIGF0dGFjaF9mdW5jdGlvbiA6cmV0X3U2NCwgWyA6dWxvbmdfbG9uZyBdLCA6dWxvbmdfbG9uZworICAgIGF0dGFjaF9mdW5jdGlvbiA6cmV0X2xvbmcsIFsgOmxvbmcgXSwgOmxvbmcKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF91bG9uZywgWyA6dWxvbmcgXSwgOnVsb25nCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzZXRfczgsIFsgOmNoYXIgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOmdldF9zOCwgWyBdLCA6Y2hhcgorICAgIGF0dGFjaF9mdW5jdGlvbiA6c2V0X2Zsb2F0LCBbIDpmbG9hdCBdLCA6dm9pZAorICAgIGF0dGFjaF9mdW5jdGlvbiA6Z2V0X2Zsb2F0LCBbIF0sIDpmbG9hdAorICAgIGF0dGFjaF9mdW5jdGlvbiA6c2V0X2RvdWJsZSwgWyA6ZG91YmxlIF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpnZXRfZG91YmxlLCBbIF0sIDpkb3VibGUKKyAgZW5kCisKKyAgUEFDS19WQUxVRVMgPSB7CisgICAgJ3M4JyA9PiBbIDB4MTIgIF0sCisgICAgJ3U4JyA9PiBbIDB4MzQgIF0sCisgICAgJ3MxNicgPT4gWyAweDU2NzggXSwKKyAgICAndTE2JyA9PiBbIDB4OWFiYyBdLAorICAgICdzMzInID0+IFsgMHg3NjU0MzIxZiBdLAorICAgICd1MzInID0+IFsgMHhmZWUxYmFiZSBdLAorICAgICdzTCcgPT4gWyAweDFmMmUzZDRjIF0sCisgICAgJ3VMJyA9PiBbIDB4ZjdlOGQ5Y2EgXSwKKyAgICAnczY0JyA9PiBbIDB4MWVhZmRlYWRiZWVmYTFiMiBdLAorICAgICMnZjMyJyA9PiBbIDEuMjM0NTY3IF0sICMgVE9ETzogV2h5IGlzIHRoaXMgZGlzYWJsZWQ/CisgICAgJ2Y2NCcgPT4gWyA5Ljg3NjU0MzIxIF0KKyAgfQorCisgIFRZUEVfTUFQID0geworICAgICdzOCcgPT4gOmNoYXIsICd1OCcgPT4gOnVjaGFyLCAnczE2JyA9PiA6c2hvcnQsICd1MTYnID0+IDp1c2hvcnQsCisgICAgJ3MzMicgPT4gOmludCwgJ3UzMicgPT4gOnVpbnQsICdzNjQnID0+IDpsb25nX2xvbmcsICd1NjQnID0+IDp1bG9uZ19sb25nLAorICAgICdzTCcgPT4gOmxvbmcsICd1TCcgPT4gOnVsb25nLCAnZjMyJyA9PiA6ZmxvYXQsICdmNjQnID0+IDpkb3VibGUKKyAgfQorICBUWVBFUyA9IFRZUEVfTUFQLmtleXMKKworICBtb2R1bGUgTGliVGVzdAorICAgIFsgJ3MzMicsICd1MzInLCAnczY0JywgJ3U2NCcgXS5lYWNoIGRvIHxydHwKKyAgICAgIFRZUEVTLmVhY2ggZG8gfHQxfAorICAgICAgICBUWVBFUy5lYWNoIGRvIHx0MnwKKyAgICAgICAgICBUWVBFUy5lYWNoIGRvIHx0M3wKKyAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgIGF0dGFjaF9mdW5jdGlvbiAicGFja18je3QxfSN7dDJ9I3t0M31fI3tydH0iLAorICAgICAgICAgICAgICAgIFsgVFlQRV9NQVBbdDFdLCBUWVBFX01BUFt0Ml0sIFRZUEVfTUFQW3QzXSwgOmJ1ZmZlcl9vdXQgXSwgOnZvaWQKKyAgICAgICAgICAgIHJlc2N1ZSBGRkk6Ok5vdEZvdW5kRXJyb3IKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICAjCisgICMgUG9pbnRlciBmaXh0dXJlcworICAjCisgIG1vZHVsZSBMaWJUZXN0CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpwdHJfcmV0X2ludDMyX3QsIFsgOnBvaW50ZXIsIDppbnQgXSwgOmludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX2Zyb21fYWRkcmVzcywgWyBGRkk6OlBsYXRmb3JtOjpBRERSRVNTX1NJWkUgPT0gMzIgPyA6dWludCA6IDp1bG9uZ19sb25nIF0sIDpwb2ludGVyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpwdHJfc2V0X3BvaW50ZXIsIFsgOnBvaW50ZXIsIDppbnQsIDpwb2ludGVyIF0sIDp2b2lkCisgIGVuZAorCisgIGNsYXNzIFRvUHRyVGVzdAorICAgIGRlZiBpbml0aWFsaXplKHB0cikKKyAgICAgIEBwdHIgPSBwdHIKKyAgICBlbmQKKyAgICBkZWYgdG9fcHRyCisgICAgICBAcHRyCisgICAgZW5kCisgIGVuZAorCisgIHJlcXVpcmUgJ2RlbGVnYXRlJworICBjbGFzcyBQb2ludGVyRGVsZWdhdGUgPCBEZWxlZ2F0ZUNsYXNzKEZGSTo6UG9pbnRlcikKKyAgICBkZWYgaW5pdGlhbGl6ZShwdHIpCisgICAgICBzdXBlcgorICAgICAgQHB0ciA9IHB0cgorICAgIGVuZAorICAgIGRlZiB0b19wdHIKKyAgICAgIEBwdHIKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgQXV0b1BvaW50ZXJUZXN0SGVscGVyCisgICAgQEBjb3VudCA9IDAKKyAgICBkZWYgc2VsZi5yZWxlYXNlCisgICAgICBAQGNvdW50ICs9IDEgaWYgQEBjb3VudCA+IDAKKyAgICBlbmQKKyAgICBkZWYgc2VsZi5yZXNldAorICAgICAgQEBjb3VudCA9IDAKKyAgICBlbmQKKyAgICBkZWYgc2VsZi5nY19ldmVyeXRoaW5nKGNvdW50KQorICAgICAgbG9vcCA9IDUKKyAgICAgIHdoaWxlIEBAY291bnQgPCBjb3VudCAmJiBsb29wID4gMAorICAgICAgICBsb29wIC09IDEKKyAgICAgICAgaWYgUlVCWV9QTEFURk9STSA9fiAvamF2YS8KKyAgICAgICAgICByZXF1aXJlICJqYXZhIgorICAgICAgICAgIGphdmEubGFuZy5TeXN0ZW0uZ2MKKyAgICAgICAgZWxzZQorICAgICAgICAgIEdDLnN0YXJ0CisgICAgICAgIGVuZAorICAgICAgICBzbGVlcCAwLjA1IHVubGVzcyBAQGNvdW50ID09IGNvdW50CisgICAgICBlbmQKKyAgICAgIEBAY291bnQgPSAwCisgICAgZW5kCisgICAgZGVmIHNlbGYuZmluYWxpemVyCisgICAgICBzZWxmLm1ldGhvZCg6cmVsZWFzZSkudG9fcHJvYworICAgIGVuZAorICBlbmQKKworICAjCisgICMgU3RyaW5nIGZpeHR1cmVzCisgICMKKyAgbW9kdWxlIExpYlRlc3QKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnB0cl9yZXRfcG9pbnRlciwgWyA6cG9pbnRlciwgOmludF0sIDpzdHJpbmcKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cmluZ19lcXVhbHMsIFsgOnN0cmluZywgOnN0cmluZyBdLCA6aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJpbmdfZHVtbXksIFsgOnN0cmluZyBdLCA6dm9pZAorICBlbmQKKworICAjCisgICMgU3RydWN0IGluaXRpYWxpemUgZml4dHVyZXMKKyAgIworICBjbGFzcyBTdHJ1Y3RXaXRoSW5pdGlhbGl6ZSA8IEZGSTo6U3RydWN0CisgICAgbGF5b3V0IDpzdHJpbmcsIDpzdHJpbmcKKyAgICBhdHRyX2FjY2Vzc29yIDptYWdpYworICAgIGRlZiBpbml0aWFsaXplCisgICAgICBzdXBlcgorICAgICAgc2VsZi5tYWdpYyA9IDQyCisgICAgZW5kCisgIGVuZAorCisgICMKKyAgIyBTdHJ1Y3QgZml4dHVyZXMKKyAgIworICBTdHJ1Y3RUeXBlcyA9IHsKKyAgICAnczgnID0+IDpjaGFyLAorICAgICdzMTYnID0+IDpzaG9ydCwKKyAgICAnczMyJyA9PiA6aW50LAorICAgICdzNjQnID0+IDpsb25nX2xvbmcsCisgICAgJ2xvbmcnID0+IDpsb25nLAorICAgICdmMzInID0+IDpmbG9hdCwKKyAgICAnZjY0JyA9PiA6ZG91YmxlCisgIH0KKworICBtb2R1bGUgTGliVGVzdAorICAgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX3JldF9wb2ludGVyLCBbIDpwb2ludGVyLCA6aW50XSwgOnN0cmluZworICAgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX3JldF9pbnQzMl90LCBbIDpwb2ludGVyLCA6aW50IF0sIDppbnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnB0cl9mcm9tX2FkZHJlc3MsIFsgOnVsb25nIF0sIDpwb2ludGVyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJpbmdfZXF1YWxzLCBbIDpzdHJpbmcsIDpzdHJpbmcgXSwgOmludAorICAgIFsgJ3M4JywgJ3MxNicsICdzMzInLCAnczY0JywgJ2YzMicsICdmNjQnLCAnbG9uZycgXS5lYWNoIGRvIHx0fAorICAgICAgYXR0YWNoX2Z1bmN0aW9uICJzdHJ1Y3RfYWxpZ25fI3t0fSIsIFsgOnBvaW50ZXIgXSwgU3RydWN0VHlwZXNbdF0KKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgUG9pbnRlck1lbWJlciA8IEZGSTo6U3RydWN0CisgICAgbGF5b3V0IDpwb2ludGVyLCA6cG9pbnRlcgorICBlbmQKKworICBjbGFzcyBTdHJpbmdNZW1iZXIgPCBGRkk6OlN0cnVjdAorICAgIGxheW91dCA6c3RyaW5nLCA6c3RyaW5nCisgIGVuZAorCisgIG1vZHVsZSBDYWxsYmFja01lbWJlcgorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIExJQlJBUlkKKyAgICBjYWxsYmFjayA6YWRkLCBbIDppbnQsIDppbnQgXSwgOmludAorICAgIGNhbGxiYWNrIDpzdWIsIFsgOmludCwgOmludCBdLCA6aW50CisKKyAgICBjbGFzcyBUZXN0U3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6YWRkLCA6YWRkLAorICAgICAgICA6c3ViLCA6c3ViCisgICAgZW5kCisKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9jYWxsX2FkZF9jYiwgW1Rlc3RTdHJ1Y3QsIDppbnQsIDppbnRdLCA6aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfY2FsbF9zdWJfY2IsIFtUZXN0U3RydWN0LCA6aW50LCA6aW50XSwgOmludAorICBlbmQKKworICBtb2R1bGUgTGliVGVzdAorICAgIGNsYXNzIE5lc3RlZFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmksIDppbnQKKyAgICBlbmQKKworICAgIGNsYXNzIENvbnRhaW5lclN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmZpcnN0LCA6Y2hhciwgOm5zLCBOZXN0ZWRTdHJ1Y3QKKyAgICBlbmQKKworICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RydWN0X2FsaWduX25lc3RlZF9zdHJ1Y3QsIFsgOnBvaW50ZXIgXSwgOmludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RydWN0X21ha2VfY29udGFpbmVyX3N0cnVjdCwgWyA6aW50IF0sIDpwb2ludGVyCisKKyAgICBjbGFzcyBTdHJ1Y3RXaXRoQXJyYXkgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDpmaXJzdCwgOmNoYXIsIDphLCBbOmludCwgNV0KKyAgICBlbmQKKworICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RydWN0X21ha2Vfc3RydWN0X3dpdGhfYXJyYXksIFs6aW50LCA6aW50LCA6aW50LCA6aW50LCA6aW50XSwgOnBvaW50ZXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9maWVsZF9hcnJheSwgWzpwb2ludGVyXSwgOnBvaW50ZXIKKworICAgIGNsYXNzIEJ1Z2dlZFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOnZpc2libGUsIDp1Y2hhciwKKyAgICAgICAgICAgICAgOngsIDp1aW50LAorICAgICAgICAgICAgICA6eSwgOnVpbnQsCisgICAgICAgICAgICAgIDpyeCwgOnNob3J0LAorICAgICAgICAgICAgICA6cnksIDpzaG9ydCwKKyAgICAgICAgICAgICAgOm9yZGVyLCA6dWNoYXIsCisgICAgICAgICAgICAgIDpzaXplLCA6dWNoYXIKKyAgICBlbmQKKworICAgIGF0dGFjaF9mdW5jdGlvbiA6YnVnZ2VkX3N0cnVjdF9zaXplLCBbXSwgOnVpbnQKKyAgZW5kCisKKyAgbW9kdWxlIFN0cnVjdEN1c3RvbVR5cGVkZWYKKyAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgZmZpX2xpYiBMSUJSQVJZCisgICAgdHlwZWRlZiA6dWludCwgOmZ1YmFyM190CisKKyAgICBjbGFzcyBTIDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6YSwgOmZ1YmFyM190CisgICAgZW5kCisgIGVuZAorCisgICMKKyAgIyBVbmlvbiBmaXh0dXJlcworICAjCisgIG1vZHVsZSBMaWJUZXN0CisgICAgVHlwZXMgPSB7CisgICAgICAnczgnID0+IFs6Y2hhciwgOmMsIDFdLAorICAgICAgJ3MxNicgPT4gWzpzaG9ydCwgOnMsIDB4ZmYwXSwKKyAgICAgICdzMzInID0+IFs6aW50LCA6aSwgMHhmZjAwXSwKKyAgICAgICdzNjQnID0+IFs6bG9uZ19sb25nLCA6aiwgMHhmZmZmMDBdLAorICAgICAgJ2xvbmcnID0+IFs6bG9uZywgOmwsIDB4ZmZmZl0sCisgICAgICAnZjMyJyA9PiBbOmZsb2F0LCA6ZiwgMS4wMDAxXSwKKyAgICAgICdmNjQnID0+IFs6ZG91YmxlLCA6ZCwgMS4wMDAwMDAwMDFdCisgICAgfQorCisgICAgY2xhc3MgVGVzdFVuaW9uIDwgRkZJOjpVbmlvbgorICAgICAgbGF5b3V0KCA6YSwgWzpjaGFyLCAxMF0sCisgICAgICAgICAgICAgIDppLCA6aW50LAorICAgICAgICAgICAgICA6ZiwgOmZsb2F0LAorICAgICAgICAgICAgICA6ZCwgOmRvdWJsZSwKKyAgICAgICAgICAgICAgOnMsIDpzaG9ydCwKKyAgICAgICAgICAgICAgOmwsIDpsb25nLAorICAgICAgICAgICAgICA6aiwgOmxvbmdfbG9uZywKKyAgICAgICAgICAgICAgOmMsIDpjaGFyICkKKyAgICBlbmQKKworICAgIFR5cGVzLmtleXMuZWFjaCBkbyB8a3wKKyAgICAgIGF0dGFjaF9mdW5jdGlvbiAidW5pb25fYWxpZ25fI3trfSIsIFsgOnBvaW50ZXIgXSwgVHlwZXNba11bMF0KKyAgICAgIGF0dGFjaF9mdW5jdGlvbiAidW5pb25fbWFrZV91bmlvbl93aXRoXyN7a30iLCBbIFR5cGVzW2tdWzBdIF0sIDpwb2ludGVyCisgICAgZW5kCisKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnVuaW9uX3NpemUsIFtdLCA6dWludAorICBlbmQKKworICAjCisgICMgVmFyaWFkaWMgZml4dHVyZXMKKyAgIworICBtb2R1bGUgTGliVGVzdAorICAgIGF0dGFjaF9mdW5jdGlvbiA6cGFja192YXJhcmdzLCBbIDpidWZmZXJfb3V0LCA6c3RyaW5nLCA6dmFyYXJncyBdLCA6dm9pZAorICBlbmQKKworICBtb2R1bGUgVmFyYXJncworICAgIFBBQ0tfVkFMVUVTID0geworICAgICAgJ2MnID0+IFsgMHgxMiAgXSwKKyAgICAgICdDJyA9PiBbIDB4MzQgIF0sCisgICAgICAncycgPT4gWyAweDU2NzggXSwKKyAgICAgICdTJyA9PiBbIDB4OWFiYyBdLAorICAgICAgJ2knID0+IFsgMHg3NjU0MzIxZiBdLAorICAgICAgJ0knID0+IFsgMHhmZWUxYmFiZSBdLAorICAgICAgJ2wnID0+IFsgMHgxZjJlM2Q0YyBdLAorICAgICAgJ0wnID0+IFsgMHhmN2U4ZDljYSBdLAorICAgICAgJ2onID0+IFsgMHgxZWFmZGVhZGJlZWZhMWIyIF0sCisgICAgICAnZicgPT4gWyAxLjIzNDU2Nzg5IF0sCisgICAgICAnZCcgPT4gWyA5Ljg3NjU0MzIxIF0KKyAgICB9CisKKyAgICBUWVBFX01BUCA9IHsKKyAgICAgICdjJyA9PiA6Y2hhciwgJ0MnID0+IDp1Y2hhciwgJ3MnID0+IDpzaG9ydCwgJ1MnID0+IDp1c2hvcnQsCisgICAgICAnaScgPT4gOmludCwgJ0knID0+IDp1aW50LCAnaicgPT4gOmxvbmdfbG9uZywgJ0onID0+IDp1bG9uZ19sb25nLAorICAgICAgJ2wnID0+IDpsb25nLCAnTCcgPT4gOnVsb25nLCAnZicgPT4gOmZsb2F0LCAnZCcgPT4gOmRvdWJsZQorICAgIH0KKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZnVuY3Rpb25fc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvZnVuY3Rpb25fc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDRkMmVhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9mdW5jdGlvbl9zcGVjLnJiCkBAIC0wLDAgKzEsOTcgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2Rlc2NyaWJlIEZGSTo6RnVuY3Rpb24gZG8KKyAgbW9kdWxlIExpYlRlc3QKKyAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgIGF0dGFjaF9mdW5jdGlvbiA6dGVzdEZ1bmN0aW9uQWRkLCBbOmludCwgOmludCwgOnBvaW50ZXJdLCA6aW50CisgIGVuZAorICBiZWZvcmUgZG8KKyAgICBAbGlidGVzdCA9IEZGSTo6RHluYW1pY0xpYnJhcnkub3BlbihUZXN0TGlicmFyeTo6UEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkk6OkR5bmFtaWNMaWJyYXJ5OjpSVExEX0xBWlkgfCBGRkk6OkR5bmFtaWNMaWJyYXJ5OjpSVExEX0dMT0JBTCkKKyAgZW5kCisKKyAgaXQgJ2lzIGluaXRpYWxpemVkIHdpdGggYSBzaWduYXR1cmUgYW5kIGEgYmxvY2snIGRvCisgICAgZm4gPSBGRkk6OkZ1bmN0aW9uLm5ldyg6aW50LCBbXSkgeyA1IH0KKyAgICBleHBlY3QoZm4uY2FsbCkudG8gZXFsIDUKKyAgZW5kCisKKyAgaXQgJ3JhaXNlcyBhbiBlcnJvciB3aGVuIHBhc3NpbmcgYSB3cm9uZyBzaWduYXR1cmUnIGRvCisgICAgZXhwZWN0IHsgRkZJOjpGdW5jdGlvbi5uZXcoW10sIDppbnQpLm5ldyB7IH0gfS50byByYWlzZV9lcnJvciBUeXBlRXJyb3IKKyAgZW5kCisKKyAgaXQgJ3JldHVybnMgYSBuYXRpdmUgcG9pbnRlcicgZG8KKyAgICBleHBlY3QoRkZJOjpGdW5jdGlvbi5uZXcoOmludCwgW10pIHsgfSkudG8gYmVfYV9raW5kX29mIEZGSTo6UG9pbnRlcgorICBlbmQKKworICBpdCAnY2FuIGJlIHVzZWQgYXMgY2FsbGJhY2sgZnJvbSBDIHBhc3NpbmcgdG8gaXQgYSBibG9jaycgZG8KKyAgICBmdW5jdGlvbl9hZGQgPSBGRkk6OkZ1bmN0aW9uLm5ldyg6aW50LCBbOmludCwgOmludF0pIHsgfGEsIGJ8IGEgKyBiIH0KKyAgICBleHBlY3QoTGliVGVzdC50ZXN0RnVuY3Rpb25BZGQoMTAsIDEwLCBmdW5jdGlvbl9hZGQpKS50byBlcSgyMCkKKyAgZW5kCisKKyAgaXQgJ2NhbiBiZSB1c2VkIGFzIGNhbGxiYWNrIGZyb20gQyBwYXNzaW5nIHRvIGl0IGEgUHJvYyBvYmplY3QnIGRvCisgICAgZnVuY3Rpb25fYWRkID0gRkZJOjpGdW5jdGlvbi5uZXcoOmludCwgWzppbnQsIDppbnRdLCBQcm9jLm5ldyB7IHxhLCBifCBhICsgYiB9KQorICAgIGV4cGVjdChMaWJUZXN0LnRlc3RGdW5jdGlvbkFkZCgxMCwgMTAsIGZ1bmN0aW9uX2FkZCkpLnRvIGVxKDIwKQorICBlbmQKKworICBpdCAnY2FuIGJlIHVzZWQgdG8gd3JhcCBhbiBleGlzdGluZyBmdW5jdGlvbiBwb2ludGVyJyBkbworICAgIGV4cGVjdChGRkk6OkZ1bmN0aW9uLm5ldyg6aW50LCBbOmludCwgOmludF0sIEBsaWJ0ZXN0LmZpbmRfZnVuY3Rpb24oJ3Rlc3RBZGQnKSkuY2FsbCgxMCwgMTApKS50byBlcSgyMCkKKyAgZW5kCisKKyAgaXQgJ2NhbiBiZSBhdHRhY2hlZCB0byBhIG1vZHVsZScgZG8KKyAgICBtb2R1bGUgRm9vOyBlbmQKKyAgICBmcCA9IEZGSTo6RnVuY3Rpb24ubmV3KDppbnQsIFs6aW50LCA6aW50XSwgQGxpYnRlc3QuZmluZF9mdW5jdGlvbigndGVzdEFkZCcpKQorICAgIGZwLmF0dGFjaChGb28sICdhZGQnKQorICAgIGV4cGVjdChGb28uYWRkKDEwLCAxMCkpLnRvIGVxKDIwKQorICBlbmQKKworICBpdCAnY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIGFuIG9iamVjdCcgZG8KKyAgICBmcCA9IEZGSTo6RnVuY3Rpb24ubmV3KDppbnQsIFs6aW50LCA6aW50XSwgQGxpYnRlc3QuZmluZF9mdW5jdGlvbigndGVzdEFkZCcpKQorICAgIGZvbyA9IE9iamVjdC5uZXcKKyAgICBjbGFzcyA8PCBmb28KKyAgICAgIGRlZiBzaW5nbGV0b25fY2xhc3MKKyAgICAgICAgY2xhc3MgPDwgc2VsZjsgc2VsZjsgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBmcC5hdHRhY2goZm9vLnNpbmdsZXRvbl9jbGFzcywgJ2FkZCcpCisgICAgZXhwZWN0KGZvby5hZGQoMTAsIDEwKSkudG8gZXEoMjApCisgIGVuZAorCisgIGl0ICdjYW4gd3JhcCBhIGJsb2NraW5nIGZ1bmN0aW9uJyBkbworICAgIGZwT3BlbiA9IEZGSTo6RnVuY3Rpb24ubmV3KDpwb2ludGVyLCBbIF0sIEBsaWJ0ZXN0LmZpbmRfZnVuY3Rpb24oJ3Rlc3RCbG9ja2luZ09wZW4nKSkKKyAgICBmcFJXID0gRkZJOjpGdW5jdGlvbi5uZXcoOmNoYXIsIFsgOnBvaW50ZXIsIDpjaGFyIF0sIEBsaWJ0ZXN0LmZpbmRfZnVuY3Rpb24oJ3Rlc3RCbG9ja2luZ1JXJyksIDpibG9ja2luZyA9PiB0cnVlKQorICAgIGZwV1IgPSBGRkk6OkZ1bmN0aW9uLm5ldyg6Y2hhciwgWyA6cG9pbnRlciwgOmNoYXIgXSwgQGxpYnRlc3QuZmluZF9mdW5jdGlvbigndGVzdEJsb2NraW5nV1InKSwgOmJsb2NraW5nID0+IHRydWUpCisgICAgZnBDbG9zZSA9IEZGSTo6RnVuY3Rpb24ubmV3KDp2b2lkLCBbIDpwb2ludGVyIF0sIEBsaWJ0ZXN0LmZpbmRfZnVuY3Rpb24oJ3Rlc3RCbG9ja2luZ0Nsb3NlJykpCisgICAgaGFuZGxlID0gZnBPcGVuLmNhbGwKKyAgICBleHBlY3QoaGFuZGxlKS5ub3RfdG8gYmVfbnVsbAorICAgIGJlZ2luCisgICAgICB0aFdSID0gVGhyZWFkLm5ldyB7IGZwV1IuY2FsbChoYW5kbGUsIDYzKSB9CisgICAgICB0aFJXID0gVGhyZWFkLm5ldyB7IGZwUlcuY2FsbChoYW5kbGUsIDY0KSB9CisgICAgICBleHBlY3QodGhXUi52YWx1ZSkudG8gZXEoNjQpCisgICAgICBleHBlY3QodGhSVy52YWx1ZSkudG8gZXEoNjMpCisgICAgZW5zdXJlCisgICAgICBmcENsb3NlLmNhbGwoaGFuZGxlKQorICAgIGVuZAorICBlbmQKKworICBpdCAnYXV0b3JlbGVhc2UgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0JyBkbworICAgIGZwID0gRkZJOjpGdW5jdGlvbi5uZXcoOmludCwgWzppbnQsIDppbnRdLCBAbGlidGVzdC5maW5kX2Z1bmN0aW9uKCd0ZXN0QWRkJykpCisgICAgZXhwZWN0KGZwLmF1dG9yZWxlYXNlPykudG8gYmUgdHJ1ZQorICBlbmQKKworICBpdCAnY2FuIGV4cGxpY2l0eSBmcmVlIGl0c2VsZicgZG8KKyAgICBmcCA9IEZGSTo6RnVuY3Rpb24ubmV3KDppbnQsIFtdKSB7IH0KKyAgICBmcC5mcmVlCisgICAgZXhwZWN0IHsgZnAuZnJlZSB9LnRvIHJhaXNlX2Vycm9yIFJ1bnRpbWVFcnJvcgorICBlbmQKKworICBpdCAnY2FuXCd0IGV4cGxpY2l0eSBmcmVlIGl0c2VsZiBpZiBub3QgcHJldmlvdXNseSBhbGxvY2F0ZWQnIGRvCisgICAgZnAgPSBGRkk6OkZ1bmN0aW9uLm5ldyg6aW50LCBbOmludCwgOmludF0sIEBsaWJ0ZXN0LmZpbmRfZnVuY3Rpb24oJ3Rlc3RBZGQnKSkKKyAgICBleHBlY3QgeyBmcC5mcmVlIH0udG8gcmFpc2VfZXJyb3IgUnVudGltZUVycm9yCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2lvX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2lvX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjMjM4YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvaW9fc3BlYy5yYgpAQCAtMCwwICsxLDE2IEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitpZiBmYWxzZSAjIGRpc2FibGVkIGZvciAjMzkwCisgIGRlc2NyaWJlICJGRkk6OklPLmZvcl9mZCIgZG8KKyAgICBpdCAicHJvZHVjZXMgYW4gSU8gd3JhcHBpbmcgdGhlIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IiIGRvCisgICAgICBleHBlY3QgZG8KKyAgICAgICAgRkZJOjpJTy5mb3JfZmQoMiwgInIiKQorICAgICAgZW5kLnRvX25vdCByYWlzZV9lcnJvcgorICAgIGVuZAorICBlbmQKK2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvbGlicmFyeV9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9saWJyYXJ5X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5MDBkMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvbGlicmFyeV9zcGVjLnJiCkBAIC0wLDAgKzEsMjg2IEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitkZXNjcmliZSAiTGlicmFyeSIgZG8KKyAgZGVzY3JpYmUgIi5lbnVtX3ZhbHVlIiBkbworICAgIG0gPSBNb2R1bGUubmV3IGRvCisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBlbnVtIDpzb21ldGhpbmcsIFs6b25lLCA6dHdvXQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZXR1cm4gYSB2YWx1ZSBmb3IgYSB2YWxpZCBrZXkiIGRvCisgICAgICBleHBlY3QobS5lbnVtX3ZhbHVlKDpvbmUpKS50byBlcSgwKQorICAgICAgZXhwZWN0KG0uZW51bV92YWx1ZSg6dHdvKSkudG8gZXEoMSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCBmb3IgYW4gaW52YWxpZCBrZXkiIGRvCisgICAgICBleHBlY3QobS5lbnVtX3ZhbHVlKDp0aHJlZSkpLnRvIGJlIG5pbAorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAiI2ZmaV9jb252ZW50aW9uIiBkbworICAgIGl0ICJkZWZhdWx0cyB0byA6ZGVmYXVsdCIgZG8KKyAgICAgIG0gPSBNb2R1bGUubmV3IGRvCisgICAgICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgIGVuZAorICAgICAgZXhwZWN0KG0uZmZpX2NvbnZlbnRpb24pLnRvIGVxKDpkZWZhdWx0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBiZSBzZXR0YWJsZSIgZG8KKyAgICAgIG0gPSBNb2R1bGUubmV3IGRvCisgICAgICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgIGVuZAorCisgICAgICBleHBlY3QobS5mZmlfY29udmVudGlvbikudG8gZXEoOmRlZmF1bHQpCisgICAgICBtLmZmaV9jb252ZW50aW9uIDpzdGRjYWxsCisgICAgICBleHBlY3QobS5mZmlfY29udmVudGlvbikudG8gZXEoOnN0ZGNhbGwpCisgICAgZW5kCisgIGVuZAorCisgIGlmIEZGSTo6UGxhdGZvcm06Ok9TID1+IC93aW5kb3dzfGN5Z3dpbi8gJiYgRkZJOjpQbGF0Zm9ybTo6QVJDSCA9PSAnaTM4NicKKyAgICBtb2R1bGUgTGliVGVzdFN0ZGNhbGwKKyAgICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAgIGZmaV9jb252ZW50aW9uIDpzdGRjYWxsCisKKyAgICAgIGNsYXNzIFN0cnVjdFVDRFAgPCBGRkk6OlN0cnVjdAorICAgICAgICBsYXlvdXQgOmExLCA6dWNoYXIsCisgICAgICAgICAgOmEyLCA6ZG91YmxlLAorICAgICAgICAgIDphMywgOnBvaW50ZXIKKyAgICAgIGVuZAorCisgICAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RTdGRjYWxsTWFueVBhcmFtcywgWyA6cG9pbnRlciwgOmludDgsIDppbnQxNiwgOmludDMyLCA6aW50NjQsCisgICAgICAgICAgICAgIFN0cnVjdFVDRFAuYnlfdmFsdWUsIFN0cnVjdFVDRFAuYnlfcmVmLCA6ZmxvYXQsIDpkb3VibGUgXSwgOnZvaWQKKyAgICBlbmQKKworICAgIGl0ICJhZGRzIHN0ZGNhbGwgZGVjb3JhdGlvbjogdGVzdFN0ZGNhbGxNYW55UGFyYW1zQDY0IiBkbworICAgICAgcyA9IExpYlRlc3RTdGRjYWxsOjpTdHJ1Y3RVQ0RQLm5ldworICAgICAgcG8gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpsb25nCisgICAgICBMaWJUZXN0U3RkY2FsbC50ZXN0U3RkY2FsbE1hbnlQYXJhbXMgcG8sIDEsIDIsIDMsIDQsIHMsIHMsIDEuMCwgMi4wCisgICAgZW5kCisgIGVuZAorCisgIGRlc2NyaWJlICJmZmlfbGliIiBkbworICAgIGl0ICJlbXB0eSBuYW1lIGxpc3Qgc2hvdWxkIHJhaXNlIGVycm9yIiBkbworICAgICAgZXhwZWN0IHsKKyAgICAgICAgTW9kdWxlLm5ldyBkbyB8bXwKKyAgICAgICAgICBtLmV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgICAgICBmZmlfbGliCisgICAgICAgIGVuZAorICAgICAgfS50byByYWlzZV9lcnJvcihMb2FkRXJyb3IpCisgICAgZW5kCisgICAgCisgIGVuZAorCisgIHVubGVzcyBSYkNvbmZpZzo6Q09ORklHWyd0YXJnZXRfb3MnXSA9fiAvbXN3aW58bWluZ3cvCisgICAgaXQgImF0dGFjaF9mdW5jdGlvbiB3aXRoIG5vIGxpYnJhcnkgc3BlY2lmaWVkIiBkbworICAgICAgZXhwZWN0IHsKKyAgICAgICAgTW9kdWxlLm5ldyBkbyB8bXwKKyAgICAgICAgICBtLmV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOmdldHBpZCwgWyBdLCA6dWludAorICAgICAgICBlbmQKKyAgICAgIH0udG8gcmFpc2VfZXJyb3IKKyAgICBlbmQKKworICAgIGl0ICJhdHRhY2hfZnVuY3Rpb24gOmdldHBpZCBmcm9tIHRoaXMgcHJvY2VzcyIgZG8KKyAgICAgIGV4cGVjdCB7CisgICAgICAgIGV4cGVjdChNb2R1bGUubmV3IGRvIHxtfAorICAgICAgICAgIG0uZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICAgIGZmaV9saWIgRkZJOjpMaWJyYXJ5OjpDVVJSRU5UX1BST0NFU1MKKyAgICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOmdldHBpZCwgWyBdLCA6dWludAorICAgICAgICBlbmQuZ2V0cGlkKS50byBlcShQcm9jZXNzLnBpZCkKKyAgICAgIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgZW5kCisKKyAgICBpdCAibG9hZHMgbGlicmFyeSB1c2luZyBzeW1ib2wiIGRvCisgICAgICBleHBlY3QgeworICAgICAgICBleHBlY3QoTW9kdWxlLm5ldyBkbyB8bXwKKyAgICAgICAgICBtLmV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgICAgICBmZmlfbGliIDpjCisgICAgICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpnZXRwaWQsIFsgXSwgOnVpbnQKKyAgICAgICAgZW5kLmdldHBpZCkudG8gZXEoUHJvY2Vzcy5waWQpCisgICAgICB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgIGVuZAorCisgICAgaXQgImF0dGFjaF9mdW5jdGlvbiA6Z2V0cGlkIGZyb20gWyAnYycsICdsaWJjLnNvLjYnXSAiIGRvCisgICAgICBleHBlY3QgeworICAgICAgICBleHBlY3QoTW9kdWxlLm5ldyBkbyB8bXwKKyAgICAgICAgICBtLmV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgICAgICBmZmlfbGliIFsgJ2MnLCAnbGliYy5zby42JyBdCisgICAgICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpnZXRwaWQsIFsgXSwgOnVpbnQKKyAgICAgICAgZW5kLmdldHBpZCkudG8gZXEoUHJvY2Vzcy5waWQpCisgICAgICB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgIGVuZAorCisgICAgaXQgImF0dGFjaF9mdW5jdGlvbiA6Z2V0cGlkIGZyb20gWyAnbGliYy5zby42JywgJ2MnIF0gIiBkbworICAgICAgZXhwZWN0IHsKKyAgICAgICAgZXhwZWN0KE1vZHVsZS5uZXcgZG8gfG18CisgICAgICAgICAgbS5leHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICAgICAgZmZpX2xpYiBbICdsaWJjLnNvLjYnLCAnYycgXQorICAgICAgICAgIGF0dGFjaF9mdW5jdGlvbiA6Z2V0cGlkLCBbIF0sIDp1aW50CisgICAgICAgIGVuZC5nZXRwaWQpLnRvIGVxKFByb2Nlc3MucGlkKQorICAgICAgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICBlbmQKKworICAgIGl0ICJhdHRhY2hfZnVuY3Rpb24gOmdldHBpZCBmcm9tIFsgJ2xpYmZ1YmFyLnNvLjB4ZGVhZGJlZWYnLCBuaWwsICdjJyBdICIgZG8KKyAgICAgIGV4cGVjdCB7CisgICAgICAgIGV4cGVjdChNb2R1bGUubmV3IGRvIHxtfAorICAgICAgICAgIG0uZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICAgIGZmaV9saWIgWyAnbGliZnViYXIuc28uMHhkZWFkYmVlZicsIG5pbCwgJ2MnIF0KKyAgICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOmdldHBpZCwgWyBdLCA6dWludAorICAgICAgICBlbmQuZ2V0cGlkKS50byBlcShQcm9jZXNzLnBpZCkKKyAgICAgIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgZW5kCisKKyAgICBpdCAiYXR0YWNoX2Z1bmN0aW9uIDpnZXRwaWQgZnJvbSBbICdsaWJmdWJhci5zby4weGRlYWRiZWVmJyBdICIgZG8KKyAgICAgIGV4cGVjdCB7CisgICAgICAgIGV4cGVjdChNb2R1bGUubmV3IGRvIHxtfAorICAgICAgICAgIG0uZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICAgIGZmaV9saWIgJ2xpYmZ1YmFyLnNvLjB4ZGVhZGJlZWYnCisgICAgICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpnZXRwaWQsIFsgXSwgOnVpbnQKKyAgICAgICAgZW5kLmdldHBpZCkudG8gZXEoUHJvY2Vzcy5waWQpCisgICAgICB9LnRvIHJhaXNlX2Vycm9yKExvYWRFcnJvcikKKyAgICBlbmQKKworICAgIGl0ICJhdHRhY2hfZnVuY3Rpb24gOmJvb2xfcmV0dXJuX3RydWUgZnJvbSBbIEZpbGUuZXhwYW5kX3BhdGgoI3tUZXN0TGlicmFyeTo6UEFUSC5pbnNwZWN0fSkgXSIgZG8KKyAgICAgIG1vZCA9IE1vZHVsZS5uZXcgZG8gfG18CisgICAgICAgIG0uZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICBmZmlfbGliIEZpbGUuZXhwYW5kX3BhdGgoVGVzdExpYnJhcnk6OlBBVEgpCisgICAgICAgIGF0dGFjaF9mdW5jdGlvbiA6Ym9vbF9yZXR1cm5fdHJ1ZSwgWyBdLCA6Ym9vbAorICAgICAgZW5kCisgICAgICBleHBlY3QobW9kLmJvb2xfcmV0dXJuX3RydWUpLnRvIGJlIHRydWUKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIGd2YXJfbGliKG5hbWUsIHR5cGUpCisgICAgTW9kdWxlLm5ldyBkbyB8bXwKKyAgICAgIG0uZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgICAgYXR0YWNoX3ZhcmlhYmxlIDpndmFyLCAiZ3Zhcl8je25hbWV9IiwgdHlwZQorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpnZXQsICJndmFyXyN7bmFtZX1fZ2V0IiwgW10sIHR5cGUKKyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6c2V0LCAiZ3Zhcl8je25hbWV9X3NldCIsIFsgdHlwZSBdLCA6dm9pZAorICAgIGVuZAorICBlbmQKKworICBkZWYgZ3Zhcl90ZXN0KG5hbWUsIHR5cGUsIHZhbCkKKyAgICBsaWIgPSBndmFyX2xpYihuYW1lLCB0eXBlKQorICAgIGxpYi5zZXQodmFsKQorICAgIGV4cGVjdChsaWIuZ3ZhcikudG8gZXEodmFsKQorICAgIGxpYi5zZXQoMCkKKyAgICBsaWIuZ3ZhciA9IHZhbAorICAgIGV4cGVjdChsaWIuZ2V0KS50byBlcSh2YWwpCisgIGVuZAorCisgIFsgMCwgMTI3LCAtMTI4LCAtMSBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjpjaGFyIHZhcmlhYmxlIiBkbworICAgICAgZ3Zhcl90ZXN0KCJzOCIsIDpjaGFyLCBpKQorICAgIGVuZAorICBlbmQKKworICBbIDAsIDB4N2YsIDB4ODAsIDB4ZmYgXS5lYWNoIGRvIHxpfAorICAgIGl0ICI6dWNoYXIgdmFyaWFibGUiIGRvCisgICAgICBndmFyX3Rlc3QoInU4IiwgOnVjaGFyLCBpKQorICAgIGVuZAorICBlbmQKKworICBbIDAsIDB4N2ZmZiwgLTB4ODAwMCwgLTEgXS5lYWNoIGRvIHxpfAorICAgIGl0ICI6c2hvcnQgdmFyaWFibGUiIGRvCisgICAgICBndmFyX3Rlc3QoInMxNiIsIDpzaG9ydCwgaSkKKyAgICBlbmQKKyAgZW5kCisKKyAgWyAwLCAweDdmZmYsIDB4ODAwMCwgMHhmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICBpdCAiOnVzaG9ydCB2YXJpYWJsZSIgZG8KKyAgICAgIGd2YXJfdGVzdCgidTE2IiwgOnVzaG9ydCwgaSkKKyAgICBlbmQKKyAgZW5kCisKKyAgWyAwLCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgLTEgXS5lYWNoIGRvIHxpfAorICAgIGl0ICI6aW50IHZhcmlhYmxlIiBkbworICAgICAgZ3Zhcl90ZXN0KCJzMzIiLCA6aW50LCBpKQorICAgIGVuZAorICBlbmQKKworICBbIDAsIDB4N2ZmZmZmZmYsIDB4ODAwMDAwMDAsIDB4ZmZmZmZmZmYgXS5lYWNoIGRvIHxpfAorICAgIGl0ICI6dWludCB2YXJpYWJsZSIgZG8KKyAgICAgIGd2YXJfdGVzdCgidTMyIiwgOnVpbnQsIGkpCisgICAgZW5kCisgIGVuZAorCisgIFsgMCwgMHg3ZmZmZmZmZmZmZmZmZmZmLCAtMHg4MDAwMDAwMDAwMDAwMDAwLCAtMSBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjpsb25nX2xvbmcgdmFyaWFibGUiIGRvCisgICAgICBndmFyX3Rlc3QoInM2NCIsIDpsb25nX2xvbmcsIGkpCisgICAgZW5kCisgIGVuZAorCisgIFsgMCwgMHg3ZmZmZmZmZmZmZmZmZmZmLCAweDgwMDAwMDAwMDAwMDAwMDAsIDB4ZmZmZmZmZmZmZmZmZmZmZiBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjp1bG9uZ19sb25nIHZhcmlhYmxlIiBkbworICAgICAgZ3Zhcl90ZXN0KCJ1NjQiLCA6dWxvbmdfbG9uZywgaSkKKyAgICBlbmQKKyAgZW5kCisKKyAgaWYgRkZJOjpQbGF0Zm9ybTo6TE9OR19TSVpFID09IDMyCisgICAgWyAwLCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgLTEgXS5lYWNoIGRvIHxpfAorICAgICAgaXQgIjpsb25nIHZhcmlhYmxlIiBkbworICAgICAgICBndmFyX3Rlc3QoImxvbmciLCA6bG9uZywgaSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgWyAwLCAweDdmZmZmZmZmLCAweDgwMDAwMDAwLCAweGZmZmZmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICAgIGl0ICI6dWxvbmcgdmFyaWFibGUiIGRvCisgICAgICAgIGd2YXJfdGVzdCgidWxvbmciLCA6dWxvbmcsIGkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZWxzZQorICAgIFsgMCwgMHg3ZmZmZmZmZmZmZmZmZmZmLCAtMHg4MDAwMDAwMDAwMDAwMDAwLCAtMSBdLmVhY2ggZG8gfGl8CisgICAgICBpdCAiOmxvbmcgdmFyaWFibGUiIGRvCisgICAgICAgIGd2YXJfdGVzdCgibG9uZyIsIDpsb25nLCBpKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBbIDAsIDB4N2ZmZmZmZmZmZmZmZmZmZiwgMHg4MDAwMDAwMDAwMDAwMDAwLCAweGZmZmZmZmZmZmZmZmZmZmYgXS5lYWNoIGRvIHxpfAorICAgICAgaXQgIjp1bG9uZyB2YXJpYWJsZSIgZG8KKyAgICAgICAgZ3Zhcl90ZXN0KCJ1bG9uZyIsIDp1bG9uZywgaSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBpdCAiUG9pbnRlciB2YXJpYWJsZSIgZG8KKyAgICBsaWIgPSBndmFyX2xpYigicG9pbnRlciIsIDpwb2ludGVyKQorICAgIHZhbCA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcgOmxvbmcKKyAgICBsaWIuc2V0KHZhbCkKKyAgICBleHBlY3QobGliLmd2YXIpLnRvIGVxKHZhbCkKKyAgICBsaWIuc2V0KG5pbCkKKyAgICBsaWIuZ3ZhciA9IHZhbAorICAgIGV4cGVjdChsaWIuZ2V0KS50byBlcSh2YWwpCisgIGVuZAorCisgIFsgMCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIC0xIF0uZWFjaCBkbyB8aXwKKyAgICBpdCAic3RydWN0dXJlIiBkbworICAgICAgY2xhc3MgR2xvYmFsU3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgICAgbGF5b3V0IDpkYXRhLCA6bG9uZworICAgICAgZW5kCisKKyAgICAgIGxpYiA9IE1vZHVsZS5uZXcgZG8gfG18CisgICAgICAgIG0uZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICAgIGF0dGFjaF92YXJpYWJsZSA6Z3ZhciwgImd2YXJfZ3N0cnVjdCIsIEdsb2JhbFN0cnVjdAorICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOmdldCwgImd2YXJfZ3N0cnVjdF9nZXQiLCBbXSwgR2xvYmFsU3RydWN0CisgICAgICAgIGF0dGFjaF9mdW5jdGlvbiA6c2V0LCAiZ3Zhcl9nc3RydWN0X3NldCIsIFsgR2xvYmFsU3RydWN0IF0sIDp2b2lkCisgICAgICBlbmQKKworICAgICAgdmFsID0gR2xvYmFsU3RydWN0Lm5ldworICAgICAgdmFsWzpkYXRhXSA9IGkKKyAgICAgIGxpYi5zZXQodmFsKQorICAgICAgZXhwZWN0KGxpYi5ndmFyWzpkYXRhXSkudG8gZXEoaSkKKyAgICAgIHZhbFs6ZGF0YV0gPSAwCisgICAgICBsaWIuZ3Zhcls6ZGF0YV0gPSBpCisgICAgICB2YWwgPSBHbG9iYWxTdHJ1Y3QubmV3KGxpYi5nZXQpCisgICAgICBleHBlY3QodmFsWzpkYXRhXSkudG8gZXEoaSkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvbG9uZ19kb3VibGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2xvbmdfZG91YmxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjYxM2IKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL2xvbmdfZG91YmxlLnJiCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCityZXF1aXJlICdiaWdkZWNpbWFsJworCitkZXNjcmliZSAiOmxvbmdfZG91YmxlIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcyIgZG8KKyAgbW9kdWxlIExpYlRlc3QKKyAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgIGF0dGFjaF9mdW5jdGlvbiA6YWRkX2YxMjgsIFsgOmxvbmdfZG91YmxlLCA6bG9uZ19kb3VibGUgXSwgOmxvbmdfZG91YmxlCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfZjEyOCwgWyA6bG9uZ19kb3VibGUgXSwgOmxvbmdfZG91YmxlCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIGZpcnN0IHBhcmFtZXRlciIgZG8KKyAgICBleHBlY3QoTGliVGVzdC5yZXRfZjEyOCgwLjEpKS50byBiZV93aXRoaW4oMC4wMSkub2YoMC4xKQorICBlbmQKKworICBpdCAicmV0dXJucyBmaXJzdCBwYXJhbWV0ZXIgd2l0aCBoaWdoIHByZWNpc2lvbiIgZG8KKyAgICBsZCA9ICAgICAgICBCaWdEZWNpbWFsLm5ldygiMS4yMzQ1Njc4OTAxMjM0NTY3ODkiKQorICAgIHRvbGVyYW5jZSA9IEJpZ0RlY2ltYWwubmV3KCIwLjAwMDAwMDAwMDAwMDAwMDAwMDEiKQorICAgIGV4cGVjdChMaWJUZXN0LnJldF9mMTI4KGxkKSkudG8gYmVfd2l0aGluKHRvbGVyYW5jZSkub2YobGQpCisgIGVuZAorCisgIGl0ICJhZGQgdHdvIGxvbmcgZG91YmxlIG51bWJlcnMiIGRvCisgICAgZXhwZWN0KExpYlRlc3QuYWRkX2YxMjgoMC4xLCAwLjIpKS50byBiZV93aXRoaW4oMC4wMSkub2YoMC4zKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9tYW5hZ2VkX3N0cnVjdF9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9tYW5hZ2VkX3N0cnVjdF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMWM2N2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL21hbmFnZWRfc3RydWN0X3NwZWMucmIKQEAgLTAsMCArMSw2OCBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKworZGVzY3JpYmUgIk1hbmFnZWQgU3RydWN0IiBkbworICBpbmNsdWRlIEZGSQorICBtb2R1bGUgTWFuYWdlZFN0cnVjdFRlc3RMaWIKKyAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX2Zyb21fYWRkcmVzcywgWyBGRkk6OlBsYXRmb3JtOjpBRERSRVNTX1NJWkUgPT0gMzIgPyA6dWludCA6IDp1bG9uZ19sb25nIF0sIDpwb2ludGVyCisgIGVuZAorCisgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3IgaWYgcmVsZWFzZSgpIGlzIG5vdCBkZWZpbmVkIiBkbworICAgIGNsYXNzIE5vUmVsZWFzZSA8IEZGSTo6TWFuYWdlZFN0cnVjdCA7IGxheW91dCA6aSwgOmludDsgZW5kCisgICAgZXhwZWN0IHsgTm9SZWxlYXNlLm5ldyhNYW5hZ2VkU3RydWN0VGVzdExpYi5wdHJfZnJvbV9hZGRyZXNzKDB4MTIzNDU2NzgpKSB9LnRvIHJhaXNlX2Vycm9yKE5vTWV0aG9kRXJyb3IpCisgIGVuZAorCisgIGl0ICJzaG91bGQgYmUgdGhlIHJpZ2h0IGNsYXNzIiBkbworICAgIGNsYXNzIFdoYXRDbGFzc0FtSSA8IEZGSTo6TWFuYWdlZFN0cnVjdAorICAgICAgbGF5b3V0IDppLCA6aW50CisgICAgICBkZWYgc2VsZi5yZWxlYXNlCisgICAgICBlbmQKKyAgICBlbmQgICAgCisKKyAgICBleHBlY3QoV2hhdENsYXNzQW1JLm5ldyhNYW5hZ2VkU3RydWN0VGVzdExpYi5wdHJfZnJvbV9hZGRyZXNzKDB4MTIzNDU2NzgpKS5jbGFzcykudG8gZXEoV2hhdENsYXNzQW1JKQorICBlbmQKKworICBpdCAic2hvdWxkIGJ1aWxkIHdpdGggc2VsZiByZWZlcmVuY2UiIGRvCisgICAgY2xhc3MgQ2xhc3NXaXRoU2VsZlJlZiA8IEZGSTo6TWFuYWdlZFN0cnVjdAorICAgICAgbGF5b3V0IDpkYXRhLCBzZWxmLnB0cgorICAgICAgZGVmIHNlbGYucmVsZWFzZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBleHBlY3QoQ2xhc3NXaXRoU2VsZlJlZi5uZXcoTWFuYWdlZFN0cnVjdFRlc3RMaWIucHRyX2Zyb21fYWRkcmVzcygweDEyMzQ1Njc4KSkuY2xhc3MpLnRvIGVxKENsYXNzV2l0aFNlbGZSZWYpCisgIGVuZAorCisgICMgc2VlICM0MjcKKyAgaXQgInNob3VsZCByZWxlYXNlIG1lbW9yeSBwcm9wZXJseSIsIDpicm9rZW4gPT4gdHJ1ZSBkbworICAgIGNsYXNzIFBsZWFzZVJlbGVhc2VNZSA8IEZGSTo6TWFuYWdlZFN0cnVjdAorICAgICAgbGF5b3V0IDppLCA6aW50CisgICAgICBAQGNvdW50ID0gMAorICAgICAgZGVmIHNlbGYucmVsZWFzZQorICAgICAgICBAQGNvdW50ICs9IDEKKyAgICAgIGVuZAorICAgICAgZGVmIHNlbGYud2FpdF9nYyhjb3VudCkKKyAgICAgICAgbG9vcCA9IDUKKyAgICAgICAgd2hpbGUgbG9vcCA+IDAgJiYgQEBjb3VudCA8IGNvdW50CisgICAgICAgICAgbG9vcCAtPSAxCisgICAgICAgICAgVGVzdExpYnJhcnkuZm9yY2VfZ2MKKyAgICAgICAgICBzbGVlcCAwLjA1IGlmIEBAY291bnQgPCBjb3VudAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgbG9vcF9jb3VudCA9IDMwCisgICAgd2lnZ2xlX3Jvb20gPSA1CisKKyAgICBleHBlY3QoUGxlYXNlUmVsZWFzZU1lKS50byByZWNlaXZlKDpyZWxlYXNlKS5hdF9sZWFzdChsb29wX2NvdW50LXdpZ2dsZV9yb29tKS50aW1lcworICAgIGxvb3BfY291bnQudGltZXMgZG8KKyAgICAgIFBsZWFzZVJlbGVhc2VNZS5uZXcoTWFuYWdlZFN0cnVjdFRlc3RMaWIucHRyX2Zyb21fYWRkcmVzcygweDEyMzQ1Njc4KSkKKyAgICBlbmQKKyAgICBQbGVhc2VSZWxlYXNlTWUud2FpdF9nYyBsb29wX2NvdW50CisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL21lbW9yeXBvaW50ZXJfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvbWVtb3J5cG9pbnRlcl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTlmMzUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL21lbW9yeXBvaW50ZXJfc3BlYy5yYgpAQCAtMCwwICsxLDc4IEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitNZW1vcnlQb2ludGVyID0gRkZJOjpNZW1vcnlQb2ludGVyCisKK2Rlc2NyaWJlICJNZW1vcnlQb2ludGVyI3RvdGFsIiBkbworICBpdCAiTWVtb3J5UG9pbnRlci5uZXcoOmNoYXIsIDEpLnRvdGFsID09IDEiIGRvCisgICAgZXhwZWN0KE1lbW9yeVBvaW50ZXIubmV3KDpjaGFyLCAxKS50b3RhbCkudG8gZXEgMQorICBlbmQKKworICBpdCAiTWVtb3J5UG9pbnRlci5uZXcoOnNob3J0LCAxKS50b3RhbCA9PSAyIiBkbworICAgIGV4cGVjdChNZW1vcnlQb2ludGVyLm5ldyg6c2hvcnQsIDEpLnRvdGFsKS50byBlcSAyCisgIGVuZAorCisgIGl0ICJNZW1vcnlQb2ludGVyLm5ldyg6aW50LCAxKS50b3RhbCA9PSA0IiBkbworICAgIGV4cGVjdChNZW1vcnlQb2ludGVyLm5ldyg6aW50LCAxKS50b3RhbCkudG8gZXEgNAorICBlbmQKKworICBpdCAiTWVtb3J5UG9pbnRlci5uZXcoOmxvbmdfbG9uZywgMSkudG90YWwgPT0gOCIgZG8KKyAgICBleHBlY3QoTWVtb3J5UG9pbnRlci5uZXcoOmxvbmdfbG9uZywgMSkudG90YWwpLnRvIGVxIDgKKyAgZW5kCisKKyAgaXQgIk1lbW9yeVBvaW50ZXIubmV3KDEwMjQpLnRvdGFsID09IDEwMjQiIGRvCisgICAgZXhwZWN0KE1lbW9yeVBvaW50ZXIubmV3KDEwMjQpLnRvdGFsKS50byBlcSAxMDI0CisgIGVuZAorZW5kCitkZXNjcmliZSAiTWVtb3J5UG9pbnRlciNyZWFkX2FycmF5X29mX2xvbmciIGRvCisgIGl0ICJmb28iIGRvCisgICAgcHRyID0gTWVtb3J5UG9pbnRlci5uZXcoOmxvbmcsIDEwMjQpCisgICAgcHRyWzBdLndyaXRlX2xvbmcgMTIzNAorICAgIHB0clsxXS53cml0ZV9sb25nIDU2NzgKKyAgICBsID0gcHRyLnJlYWRfYXJyYXlfb2ZfbG9uZygyKQorICAgIGV4cGVjdChsWzBdKS50byBlcSAxMjM0CisgICAgZXhwZWN0KGxbMV0pLnRvIGVxIDU2NzgKKyAgZW5kCitlbmQKK2Rlc2NyaWJlICJNZW1vcnlQb2ludGVyIGFyZ3VtZW50IiBkbworICBtb2R1bGUgUHRyCisgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgIGZmaV9saWIgRkZJOjpQbGF0Zm9ybTo6TElCQworICAgIGF0dGFjaF9mdW5jdGlvbiA6bWVtc2V0LCBbIDpwb2ludGVyLCA6aW50LCA6dWxvbmcgXSwgOnBvaW50ZXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOm1lbWNweSwgWyA6cG9pbnRlciwgOnBvaW50ZXIsIDp1bG9uZyBdLCA6cG9pbnRlcgorICBlbmQKKworICBpdCAiUG9pbnRlciBwYXNzZWQgY29ycmVjdGx5IiBkbworICAgIHAgPSBNZW1vcnlQb2ludGVyLm5ldyA6aW50LCAxCisgICAgcmV0ID0gUHRyLm1lbXNldChwLCAwLCBwLnRvdGFsKQorICAgIGV4cGVjdChyZXQpLnRvIGVxIHAKKyAgZW5kCisKKyAgaXQgIkRhdGEgcGFzc2VkIHRvIG5hdGl2ZSBmdW5jdGlvbiIgZG8KKyAgICBwID0gTWVtb3J5UG9pbnRlci5uZXcgOmludCwgMQorICAgIHAyID0gTWVtb3J5UG9pbnRlci5uZXcgOmludCwgMQorICAgIHAyLnB1dF9pbnQoMCwgMHg1ZWFkYmVlZikKKyAgICBQdHIubWVtY3B5KHAsIHAyLCBwLnRvdGFsKQorICAgIGV4cGVjdChwLmdldF9pbnQoMCkpLnRvIGVxIHAyLmdldF9pbnQoMCkKKyAgICBleHBlY3QocDIuZ2V0X2ludCgwKSkubm90X3RvIGVxbCAwCisgIGVuZAorZW5kCitkZXNjcmliZSAiTWVtb3J5UG9pbnRlciByZXR1cm4gdmFsdWUiIGRvCisgIG1vZHVsZSBTdGRpbworICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIEZGSTo6UGxhdGZvcm06OkxJQkMKKyAgICBhdHRhY2hfZnVuY3Rpb24gOmZvcGVuLCBbIDpzdHJpbmcsIDpzdHJpbmcgXSwgOnBvaW50ZXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOmZjbG9zZSwgWyA6cG9pbnRlciBdLCA6aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpmd3JpdGUsIFsgOnBvaW50ZXIsIDp1bG9uZywgOnVsb25nLCA6c3RyaW5nIF0sIDp1bG9uZworICBlbmQKKworICBpdCAiZm9wZW4gcmV0dXJucyBub24tbmlsIiBkbworICAgIGZwID0gU3RkaW8uZm9wZW4oIi9kZXYvbnVsbCIsICJ3IikKKyAgICBleHBlY3QoZnApLnRvX25vdCBiZV9uaWwKKyAgICBleHBlY3QoU3RkaW8uZmNsb3NlKGZwKSkudG8gIGVxIDAgdW5sZXNzIGZwLm5pbD8gb3IgZnAubnVsbD8gCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL251bWJlcl9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9udW1iZXJfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2I5NTYyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9udW1iZXJfc3BlYy5yYgpAQCAtMCwwICsxLDI0NyBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKworZGVzY3JpYmUgIkZ1bmN0aW9uIHdpdGggcHJpbWl0aXZlIGludGVnZXIgYXJndW1lbnRzIiBkbworICBtb2R1bGUgTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfczgsIFsgOmNoYXIgXSwgOmNoYXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF91OCwgWyA6dWNoYXIgXSwgOnVjaGFyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfczE2LCBbIDpzaG9ydCBdLCA6c2hvcnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF91MTYsIFsgOnVzaG9ydCBdLCA6dXNob3J0CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfczMyLCBbIDppbnQgXSwgOmludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6cmV0X3UzMiwgWyA6dWludCBdLCA6dWludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6cmV0X3M2NCwgWyA6bG9uZ19sb25nIF0sIDpsb25nX2xvbmcKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF91NjQsIFsgOnVsb25nX2xvbmcgXSwgOnVsb25nX2xvbmcKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnJldF9sb25nLCBbIDpsb25nIF0sIDpsb25nCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfdWxvbmcsIFsgOnVsb25nIF0sIDp1bG9uZworICAgIGF0dGFjaF9mdW5jdGlvbiA6c2V0X3M4LCBbIDpjaGFyIF0sIDp2b2lkCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpnZXRfczgsIFsgXSwgOmNoYXIKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnNldF9mbG9hdCwgWyA6ZmxvYXQgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOmdldF9mbG9hdCwgWyBdLCA6ZmxvYXQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnNldF9kb3VibGUsIFsgOmRvdWJsZSBdLCA6dm9pZAorICAgIGF0dGFjaF9mdW5jdGlvbiA6Z2V0X2RvdWJsZSwgWyBdLCA6ZG91YmxlCisgIGVuZAorCisgIGl0ICJpbnQ4LnNpemUiIGRvCisgICAgZXhwZWN0KEZGSTo6VFlQRV9JTlQ4LnNpemUpLnRvIGVxKDEpCisgIGVuZAorCisgIGl0ICJ1aW50OC5zaXplIiBkbworICAgIGV4cGVjdChGRkk6OlRZUEVfVUlOVDguc2l6ZSkudG8gZXEoMSkKKyAgZW5kCisKKyAgaXQgImludDE2LnNpemUiIGRvCisgICAgZXhwZWN0KEZGSTo6VFlQRV9JTlQxNi5zaXplKS50byBlcSgyKQorICBlbmQKKworICBpdCAidWludDE2LnNpemUiIGRvCisgICAgZXhwZWN0KEZGSTo6VFlQRV9VSU5UMTYuc2l6ZSkudG8gZXEoMikKKyAgZW5kCisKKyAgaXQgImludDMyLnNpemUiIGRvCisgICAgZXhwZWN0KEZGSTo6VFlQRV9JTlQzMi5zaXplKS50byBlcSg0KQorICBlbmQKKworICBpdCAidWludDMyLnNpemUiIGRvCisgICAgZXhwZWN0KEZGSTo6VFlQRV9VSU5UMzIuc2l6ZSkudG8gZXEoNCkKKyAgZW5kCisKKyAgaXQgImludDY0LnNpemUiIGRvCisgICAgZXhwZWN0KEZGSTo6VFlQRV9JTlQ2NC5zaXplKS50byBlcSg4KQorICBlbmQKKworICBpdCAidWludDY0LnNpemUiIGRvCisgICAgZXhwZWN0KEZGSTo6VFlQRV9VSU5UNjQuc2l6ZSkudG8gZXEoOCkKKyAgZW5kCisKKyAgaXQgImZsb2F0LnNpemUiIGRvCisgICAgZXhwZWN0KEZGSTo6VFlQRV9GTE9BVDMyLnNpemUpLnRvIGVxKDQpCisgIGVuZAorCisgIGl0ICJkb3VibGUuc2l6ZSIgZG8KKyAgICBleHBlY3QoRkZJOjpUWVBFX0ZMT0FUNjQuc2l6ZSkudG8gZXEoOCkKKyAgZW5kCisgIFsgMCwgMTI3LCAtMTI4LCAtMSBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjpjaGFyIGNhbGwoOmNoYXIgKCN7aX0pKSIgZG8KKyAgICAgIGV4cGVjdChMaWJUZXN0LnJldF9zOChpKSkudG8gZXEoaSkKKyAgICBlbmQKKyAgZW5kCisgIFsgMCwgMHg3ZiwgMHg4MCwgMHhmZiBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjp1Y2hhciBjYWxsKDp1Y2hhciAoI3tpfSkpIiBkbworICAgICAgZXhwZWN0KExpYlRlc3QucmV0X3U4KGkpKS50byBlcShpKQorICAgIGVuZAorICBlbmQKKyAgWyAwLCAweDdmZmYsIC0weDgwMDAsIC0xIF0uZWFjaCBkbyB8aXwKKyAgICBpdCAiOnNob3J0IGNhbGwoOnNob3J0ICgje2l9KSkiIGRvCisgICAgICBleHBlY3QoTGliVGVzdC5yZXRfczE2KGkpKS50byBlcShpKQorICAgIGVuZAorICBlbmQKKyAgWyAwLCAweDdmZmYsIDB4ODAwMCwgMHhmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICBpdCAiOnVzaG9ydCBjYWxsKDp1c2hvcnQgKCN7aX0pKSIgZG8KKyAgICAgIGV4cGVjdChMaWJUZXN0LnJldF91MTYoaSkpLnRvIGVxKGkpCisgICAgZW5kCisgIGVuZAorICBbIDAsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCAtMSBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjppbnQgY2FsbCg6aW50ICgje2l9KSkiIGRvCisgICAgICBleHBlY3QoTGliVGVzdC5yZXRfczMyKGkpKS50byBlcShpKQorICAgIGVuZAorICBlbmQKKyAgWyAwLCAweDdmZmZmZmZmLCAweDgwMDAwMDAwLCAweGZmZmZmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICBpdCAiOnVpbnQgY2FsbCg6dWludCAoI3tpfSkpIiBkbworICAgICAgZXhwZWN0KExpYlRlc3QucmV0X3UzMihpKSkudG8gZXEoaSkKKyAgICBlbmQKKyAgZW5kCisgIFsgMCwgMHg3ZmZmZmZmZmZmZmZmZmZmLCAtMHg4MDAwMDAwMDAwMDAwMDAwLCAtMSBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjpsb25nX2xvbmcgY2FsbCg6bG9uZ19sb25nICgje2l9KSkiIGRvCisgICAgICBleHBlY3QoTGliVGVzdC5yZXRfczY0KGkpKS50byBlcShpKQorICAgIGVuZAorICBlbmQKKyAgWyAwLCAweDdmZmZmZmZmZmZmZmZmZmYsIDB4ODAwMDAwMDAwMDAwMDAwMCwgMHhmZmZmZmZmZmZmZmZmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICBpdCAiOnVsb25nX2xvbmcgY2FsbCg6dWxvbmdfbG9uZyAoI3tpfSkpIiBkbworICAgICAgZXhwZWN0KExpYlRlc3QucmV0X3U2NChpKSkudG8gZXEoaSkKKyAgICBlbmQKKyAgZW5kCisgIGlmIEZGSTo6UGxhdGZvcm06OkxPTkdfU0laRSA9PSAzMgorICAgIFsgMCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIC0xIF0uZWFjaCBkbyB8aXwKKyAgICAgIGl0ICI6bG9uZyBjYWxsKDpsb25nICgje2l9KSkiIGRvCisgICAgICAgIGV4cGVjdChMaWJUZXN0LnJldF9sb25nKGkpKS50byBlcShpKQorICAgICAgZW5kCisgICAgZW5kCisgICAgWyAwLCAweDdmZmZmZmZmLCAweDgwMDAwMDAwLCAweGZmZmZmZmZmIF0uZWFjaCBkbyB8aXwKKyAgICAgIGl0ICI6dWxvbmcgY2FsbCg6dWxvbmcgKCN7aX0pKSIgZG8KKyAgICAgICAgZXhwZWN0KExpYlRlc3QucmV0X3Vsb25nKGkpKS50byBlcShpKQorICAgICAgZW5kCisgICAgZW5kCisgIGVsc2UKKyAgICBbIDAsIDB4N2ZmZmZmZmZmZmZmZmZmZiwgLTB4ODAwMDAwMDAwMDAwMDAwMCwgLTEgXS5lYWNoIGRvIHxpfAorICAgICAgaXQgIjpsb25nIGNhbGwoOmxvbmcgKCN7aX0pKSIgZG8KKyAgICAgICAgZXhwZWN0KExpYlRlc3QucmV0X2xvbmcoaSkpLnRvIGVxKGkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBbIDAsIDB4N2ZmZmZmZmZmZmZmZmZmZiwgMHg4MDAwMDAwMDAwMDAwMDAwLCAweGZmZmZmZmZmZmZmZmZmZmYgXS5lYWNoIGRvIHxpfAorICAgICAgaXQgIjp1bG9uZyBjYWxsKDp1bG9uZyAoI3tpfSkpIiBkbworICAgICAgICBleHBlY3QoTGliVGVzdC5yZXRfdWxvbmcoaSkpLnRvIGVxKGkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBbIDAuMCwgMC4xLCAxLjEsIDEuMjMgXS5lYWNoIGRvIHxmfAorICAgICAgaXQgIjpmbG9hdCBjYWxsKDpkb3VibGUgKCN7Zn0pKSIgZG8KKyAgICAgICAgTGliVGVzdC5zZXRfZmxvYXQoZikKKyAgICAgICAgZXhwZWN0KChMaWJUZXN0LmdldF9mbG9hdCAtIGYpLmFicykudG8gYmUgPCAwLjAwMQorICAgICAgZW5kCisgICAgZW5kCisgICAgWyAwLjAsIDAuMSwgMS4xLCAxLjIzIF0uZWFjaCBkbyB8ZnwKKyAgICAgIGl0ICI6ZG91YmxlIGNhbGwoOmRvdWJsZSAoI3tmfSkpIiBkbworICAgICAgICBMaWJUZXN0LnNldF9kb3VibGUoZikKKyAgICAgICAgZXhwZWN0KChMaWJUZXN0LmdldF9kb3VibGUgLSBmKS5hYnMpLnRvIGJlIDwgMC4wMDEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZAorZGVzY3JpYmUgIkludGVnZXIgcGFyYW1ldGVyIHJhbmdlIGNoZWNraW5nIiBkbworICBbIDEyOCwgLTEyOSBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjpjaGFyIGNhbGwoOmNoYXIgKCN7aX0pKSIgZG8KKyAgICAgIGV4cGVjdCB7IGV4cGVjdChMaWJUZXN0LnJldF9pbnQ4X3QoaSkpLnRvIGVxKGkpIH0udG8gcmFpc2VfZXJyb3IKKyAgICBlbmQKKyAgZW5kCisgIFsgLTEsIDI1NiBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjp1Y2hhciBjYWxsKDp1Y2hhciAoI3tpfSkpIiBkbworICAgICAgZXhwZWN0IHsgZXhwZWN0KExpYlRlc3QucmV0X3VfaW50OF90KGkpKS50byBlcShpKSB9LnRvIHJhaXNlX2Vycm9yCisgICAgZW5kCisgIGVuZAorICBbIDB4ODAwMCwgLTB4ODAwMSBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjpzaG9ydCBjYWxsKDpzaG9ydCAoI3tpfSkpIiBkbworICAgICAgZXhwZWN0IHsgZXhwZWN0KExpYlRlc3QucmV0X2ludDE2X3QoaSkpLnRvIGVxKGkpIH0udG8gcmFpc2VfZXJyb3IKKyAgICBlbmQKKyAgZW5kCisgIFsgLTEsIDB4MTAwMDAgXS5lYWNoIGRvIHxpfAorICAgIGl0ICI6dXNob3J0IGNhbGwoOnVzaG9ydCAoI3tpfSkpIiBkbworICAgICAgZXhwZWN0IHsgZXhwZWN0KExpYlRlc3QucmV0X3VfaW50MTZfdChpKSkudG8gZXEoaSkgfS50byByYWlzZV9lcnJvcgorICAgIGVuZAorICBlbmQKKyAgWyAweDgwMDAwMDAwLCAtMHg4MDAwMDAwMSBdLmVhY2ggZG8gfGl8CisgICAgaXQgIjppbnQgY2FsbCg6aW50ICgje2l9KSkiIGRvCisgICAgICBleHBlY3QgeyBleHBlY3QoTGliVGVzdC5yZXRfaW50MzJfdChpKSkudG8gZXEoaSkgfS50byByYWlzZV9lcnJvcgorICAgIGVuZAorICBlbmQKKyAgWyAtMSwgMHgxMDAwMDAwMDAgXS5lYWNoIGRvIHxpfAorICAgIGl0ICI6dXNob3J0IGNhbGwoOnVzaG9ydCAoI3tpfSkpIiBkbworICAgICAgZXhwZWN0IHsgZXhwZWN0KExpYlRlc3QucmV0X3VfaW50MzJfdChpKSkudG8gZXEoaSkgfS50byByYWlzZV9lcnJvcgorICAgIGVuZAorICBlbmQKK2VuZAorZGVzY3JpYmUgIlRocmVlIGRpZmZlcmVudCBzaXplIEludGVnZXIgYXJndW1lbnRzIiBkbworICBUWVBFX01BUCA9IHsKKyAgICAnczgnID0+IDpjaGFyLCAndTgnID0+IDp1Y2hhciwgJ3MxNicgPT4gOnNob3J0LCAndTE2JyA9PiA6dXNob3J0LAorICAgICdzMzInID0+IDppbnQsICd1MzInID0+IDp1aW50LCAnczY0JyA9PiA6bG9uZ19sb25nLCAndTY0JyA9PiA6dWxvbmdfbG9uZywKKyAgICAnc0wnID0+IDpsb25nLCAndUwnID0+IDp1bG9uZywgJ2YzMicgPT4gOmZsb2F0LCAnZjY0JyA9PiA6ZG91YmxlCisgIH0KKyAgVFlQRVMgPSBUWVBFX01BUC5rZXlzCisgIG1vZHVsZSBMaWJUZXN0CisgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAKKyAgICAKKyAgICBbICdzMzInLCAndTMyJywgJ3M2NCcsICd1NjQnIF0uZWFjaCBkbyB8cnR8CisgICAgICBUWVBFUy5lYWNoIGRvIHx0MXwKKyAgICAgICAgVFlQRVMuZWFjaCBkbyB8dDJ8CisgICAgICAgICAgVFlQRVMuZWFjaCBkbyB8dDN8CisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICBhdHRhY2hfZnVuY3Rpb24gInBhY2tfI3t0MX0je3QyfSN7dDN9XyN7cnR9IiwKKyAgICAgICAgICAgICAgICBbIFRZUEVfTUFQW3QxXSwgVFlQRV9NQVBbdDJdLCBUWVBFX01BUFt0M10sIDpidWZmZXJfb3V0IF0sIDp2b2lkCisgICAgICAgICAgICByZXNjdWUgRkZJOjpOb3RGb3VuZEVycm9yCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgUEFDS19WQUxVRVMgPSB7CisgICAgJ3M4JyA9PiBbIDB4MTIgIF0sCisgICAgJ3U4JyA9PiBbIDB4MzQgIF0sCisgICAgJ3MxNicgPT4gWyAweDU2NzggXSwKKyAgICAndTE2JyA9PiBbIDB4OWFiYyBdLAorICAgICdzMzInID0+IFsgMHg3NjU0MzIxZiBdLAorICAgICd1MzInID0+IFsgMHhmZWUxYmFiZSBdLAorICAgICdzTCcgPT4gWyAweDFmMmUzZDRjIF0sCisgICAgJ3VMJyA9PiBbIDB4ZjdlOGQ5Y2EgXSwKKyAgICAnczY0JyA9PiBbIDB4MWVhZmRlYWRiZWVmYTFiMiBdLAorIyAgICAnZjMyJyA9PiBbIDEuMjM0NTY3IF0sCisgICAgJ2Y2NCcgPT4gWyA5Ljg3NjU0MzIxIF0KKyAgfQorCisgIGRlZiB2ZXJpZnkocCwgb2ZmLCB0LCB2KQorICAgIGlmIHQgPT0gJ2YzMicKKyAgICAgIGV4cGVjdChwLmdldF9mbG9hdDMyKG9mZikpLnRvIGVxKHYpCisgICAgZWxzaWYgdCA9PSAnZjY0JworICAgICAgZXhwZWN0KHAuZ2V0X2Zsb2F0NjQob2ZmKSkudG8gZXEodikKKyAgICBlbHNlCisgICAgICBleHBlY3QocC5nZXRfaW50NjQob2ZmKSkudG8gZXEodikKKyAgICBlbmQKKyAgZW5kCisKKyAgUEFDS19WQUxVRVMua2V5cy5lYWNoIGRvIHx0MXwKKyAgICBQQUNLX1ZBTFVFUy5rZXlzLmVhY2ggZG8gfHQyfAorICAgICAgUEFDS19WQUxVRVMua2V5cy5lYWNoIGRvIHx0M3wKKyAgICAgICAgUEFDS19WQUxVRVNbdDFdLmVhY2ggZG8gfHYxfAorICAgICAgICAgIFBBQ0tfVkFMVUVTW3QyXS5lYWNoIGRvIHx2MnwKKyAgICAgICAgICAgIFBBQ0tfVkFMVUVTW3QzXS5lYWNoIGRvIHx2M3wKKyAgICAgICAgICAgICAgaXQgImNhbGwoI3tUWVBFX01BUFt0MV19ICgje3YxfSksICN7VFlQRV9NQVBbdDJdfSAoI3t2Mn0pLCAje1RZUEVfTUFQW3QzXX0gKCN7djN9KSkiIGRvCisgICAgICAgICAgICAgICAgcCA9IEZGSTo6QnVmZmVyLm5ldyA6bG9uZ19sb25nLCAzCisgICAgICAgICAgICAgICAgTGliVGVzdC5zZW5kKCJwYWNrXyN7dDF9I3t0Mn0je3QzfV9zNjQiLCB2MSwgdjIsIHYzLCBwKQorICAgICAgICAgICAgICAgIHZlcmlmeShwLCAwLCB0MSwgdjEpCisgICAgICAgICAgICAgICAgdmVyaWZ5KHAsIDgsIHQyLCB2MikKKyAgICAgICAgICAgICAgICB2ZXJpZnkocCwgMTYsIHQzLCB2MykKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcGxhdGZvcm1fc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcGxhdGZvcm1fc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzU2NzE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9wbGF0Zm9ybV9zcGVjLnJiCkBAIC0wLDAgKzEsMTE0IEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitkZXNjcmliZSAiRkZJOjpQbGF0Zm9ybTo6TElCU1VGRklYIiBkbworICBjYXNlIE9TCisgIHdoZW4gImxpbnV4IgorICAgIGl0ICJyZXR1cm5zICdzbyciIGRvCisgICAgICBleHBlY3QoRkZJOjpQbGF0Zm9ybTo6TElCU1VGRklYKS50byBlcSgnc28nKQorICAgIGVuZAorICB3aGVuICJ3aW5kb3dzIgorICAgIGl0ICJyZXR1cm5zICdkbGwnIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm06OkxJQlNVRkZJWCkudG8gZXEoJ2RsbCcpCisgICAgZW5kCisgIHdoZW4gImRhcndpbiIKKyAgICBpdCAicmV0dXJucyAnZHlsaWInIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm06OkxJQlNVRkZJWCkudG8gZXEoJ2R5bGliJykKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkZGSTo6UGxhdGZvcm06OklTX1dJTkRPV1MiIGRvCisgIGNhc2UgT1MKKyAgd2hlbiAibGludXgiCisgICAgaXQgInJldHVybnMgZmFsc2UiIGRvCisgICAgICBleHBlY3QoRkZJOjpQbGF0Zm9ybTo6SVNfV0lORE9XUykudG8gYmUgZmFsc2UKKyAgICBlbmQKKyAgd2hlbiAid2luZG93cyIKKyAgICBpdCAicmV0dXJucyB0cnVlIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm06OklTX1dJTkRPV1MpLnRvIGJlIHRydWUKKyAgICBlbmQKKyAgd2hlbiAiZGFyd2luIgorICAgIGl0ICJyZXR1cm5zIGZhbHNlIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm06OklTX1dJTkRPV1MpLnRvIGJlIGZhbHNlCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJGRkk6OlBsYXRmb3JtOjpBUkNIIiBkbworICBpdCAicmV0dXJucyB0aGUgYXJjaGl0ZWN0dXJlIHR5cGUiIGRvCisgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm06OkFSQ0gpLnRvIGVxKENQVSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkZGSTo6UGxhdGZvcm06Ok9TIiBkbworICBjYXNlIE9TCisgIHdoZW4gImxpbnV4IgorICAgIGl0ICJyZXR1cm5zICdsaW51eCcgYXMgYSBzdHJpbmciIGRvCisgICAgICBleHBlY3QoRkZJOjpQbGF0Zm9ybTo6T1MpLnRvIGVxKCdsaW51eCcpCisgICAgZW5kCisgIHdoZW4gIndpbmRvd3MiCisgICAgaXQgInJldHVybnMgJ3dpbmRvd3MnIGFzIGEgc3RyaW5nIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm06Ok9TKS50byBlcSgnd2luZG93cycpCisgICAgZW5kCisgIHdoZW4gImRhcndpbiIKKyAgICBpdCAicmV0dXJucyAnZGFyd2luJyBhcyBhIHN0cmluZyIgZG8KKyAgICAgIGV4cGVjdChGRkk6OlBsYXRmb3JtOjpPUykudG8gZXEoJ2RhcndpbicpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJGRkk6OlBsYXRmb3JtLndpbmRvd3M/IiBkbworICBjYXNlIE9TCisgIHdoZW4gImxpbnV4IgorICAgIGl0ICJyZXR1cm5zIGZhbHNlIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm0ud2luZG93cz8pLnRvIGJlIGZhbHNlCisgICAgZW5kCisgIHdoZW4gIndpbmRvd3MiCisgICAgaXQgInJldHVybnMgdHJ1ZSIgZG8KKyAgICAgIGV4cGVjdChGRkk6OlBsYXRmb3JtLndpbmRvd3M/KS50byBiZSB0cnVlCisgICAgZW5kCisgIHdoZW4gImRhcndpbiIKKyAgICBpdCAicmV0dXJucyBmYWxzZSIgZG8KKyAgICAgIGV4cGVjdChGRkk6OlBsYXRmb3JtLndpbmRvd3M/KS50byBiZSBmYWxzZQorICAgIGVuZAorICBlbmQKK2VuZAorCitkZXNjcmliZSAiRkZJOjpQbGF0Zm9ybS5tYWM/IiBkbworICBjYXNlIE9TCisgIHdoZW4gImxpbnV4IgorICAgIGl0ICJyZXR1cm5zIGZhbHNlIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm0ubWFjPykudG8gYmUgZmFsc2UKKyAgICBlbmQKKyAgd2hlbiAid2luZG93cyIKKyAgICBpdCAicmV0dXJucyBmYWxzZSIgZG8KKyAgICAgIGV4cGVjdChGRkk6OlBsYXRmb3JtLm1hYz8pLnRvIGJlIGZhbHNlCisgICAgZW5kCisgIHdoZW4gImRhcndpbiIKKyAgICBpdCAicmV0dXJucyB0cnVlIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm0ubWFjPykudG8gYmUgdHJ1ZQorICAgIGVuZAorICBlbmQKK2VuZAorCitkZXNjcmliZSAiRkZJOjpQbGF0Zm9ybS51bml4PyIgZG8KKyAgY2FzZSBPUworICB3aGVuICJsaW51eCIKKyAgICBpdCAicmV0dXJucyB0cnVlIiBkbworICAgICAgZXhwZWN0KEZGSTo6UGxhdGZvcm0udW5peD8pLnRvIGJlIHRydWUKKyAgICBlbmQKKyAgd2hlbiAid2luZG93cyIKKyAgICBpdCAicmV0dXJucyBmYWxzZSIgZG8KKyAgICAgIGV4cGVjdChGRkk6OlBsYXRmb3JtLnVuaXg/KS50byBiZSBmYWxzZQorICAgIGVuZAorICB3aGVuICJkYXJ3aW4iCisgICAgaXQgInJldHVybnMgdHJ1ZSIgZG8KKyAgICAgIGV4cGVjdChGRkk6OlBsYXRmb3JtLnVuaXg/KS50byBiZSB0cnVlCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3BvaW50ZXJfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcG9pbnRlcl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTgxZTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3BvaW50ZXJfc3BlYy5yYgpAQCAtMCwwICsxLDI4NSBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKK3JlcXVpcmUgJ2RlbGVnYXRlJworCittb2R1bGUgUG9pbnRlclRlc3RMaWIKKyAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgIGJlZ2luCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpwdHJfcmV0X2ludDMyX3QsIFsgOnBvaW50ZXIsIDppbnQgXSwgOmludAorICByZXNjdWUgRkZJOjpOb3RGb3VuZEVycm9yCisgICAgIyBOZXRCU0QgdXNlcyAjZGVmaW5lIGluc3RlYWQgb2YgdHlwZWRlZiBmb3IgdGhlc2UKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnB0cl9yZXRfaW50MzJfdCwgOnB0cl9yZXRfX19pbnQzMl90LCBbIDpwb2ludGVyLCA6aW50IF0sIDppbnQKKyAgZW5kCisgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX2Zyb21fYWRkcmVzcywgWyBGRkk6OlBsYXRmb3JtOjpBRERSRVNTX1NJWkUgPT0gMzIgPyA6dWludCA6IDp1bG9uZ19sb25nIF0sIDpwb2ludGVyCisgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX3NldF9wb2ludGVyLCBbIDpwb2ludGVyLCA6aW50LCA6cG9pbnRlciBdLCA6dm9pZAorICBhdHRhY2hfZnVuY3Rpb24gOnB0cl9yZXRfcG9pbnRlciwgWyA6cG9pbnRlciwgOmludCBdLCA6cG9pbnRlcgorZW5kCitkZXNjcmliZSAiUG9pbnRlciIgZG8KKyAgaW5jbHVkZSBGRkkKKyAgY2xhc3MgVG9QdHJUZXN0CisgICAgZGVmIGluaXRpYWxpemUocHRyKQorICAgICAgQHB0ciA9IHB0cgorICAgIGVuZAorICAgIGRlZiB0b19wdHIKKyAgICAgIEBwdHIKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgIkFueSBvYmplY3QgaW1wbGVtZW50aW5nICN0b19wdHIgY2FuIGJlIHBhc3NlZCBhcyBhIDpwb2ludGVyIHBhcmFtZXRlciIgZG8KKyAgICBtZW1vcnkgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpsb25nX2xvbmcKKyAgICBtYWdpYyA9IDB4MTIzNDU2NzgKKyAgICBtZW1vcnkucHV0X2ludDMyKDAsIG1hZ2ljKQorICAgIHRwID0gVG9QdHJUZXN0Lm5ldyhtZW1vcnkpCisgICAgZXhwZWN0KFBvaW50ZXJUZXN0TGliLnB0cl9yZXRfaW50MzJfdCh0cCwgMCkpLnRvIGVxKG1hZ2ljKQorICBlbmQKKyAgY2xhc3MgUG9pbnRlckRlbGVnYXRlIDwgRGVsZWdhdGVDbGFzcyhGRkk6OlBvaW50ZXIpCisgICAgZGVmIGluaXRpYWxpemUocHRyKQorICAgICAgQHB0ciA9IHB0cgorICAgIGVuZAorICAgIGRlZiB0b19wdHIKKyAgICAgIEBwdHIKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgIkEgRGVsZWdhdGVDbGFzcyhQb2ludGVyKSBjYW4gYmUgcGFzc2VkIGFzIGEgOnBvaW50ZXIgcGFyYW1ldGVyIiBkbworICAgIG1lbW9yeSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcgOmxvbmdfbG9uZworICAgIG1hZ2ljID0gMHgxMjM0NTY3OAorICAgIG1lbW9yeS5wdXRfaW50MzIoMCwgbWFnaWMpCisgICAgcHRyID0gUG9pbnRlckRlbGVnYXRlLm5ldyhtZW1vcnkpCisgICAgZXhwZWN0KFBvaW50ZXJUZXN0TGliLnB0cl9yZXRfaW50MzJfdChwdHIsIDApKS50byBlcShtYWdpYykKKyAgZW5kCisKKyAgaXQgIkZpeG51bSBjYW5ub3QgYmUgdXNlZCBhcyBhIFBvaW50ZXIgYXJndW1lbnQiIGRvCisgICAgZXhwZWN0IHsgUG9pbnRlclRlc3RMaWIucHRyX3JldF9pbnQzMigwLCAwKSB9LnRvIHJhaXNlX2Vycm9yCisgIGVuZAorCisgIGl0ICJCaWdudW0gY2Fubm90IGJlIHVzZWQgYXMgYSBQb2ludGVyIGFyZ3VtZW50IiBkbworICAgIGV4cGVjdCB7IFBvaW50ZXJUZXN0TGliLnB0cl9yZXRfaW50MzIoMHhmZWUxZGVhZGJlZWZjYWZlYmFiZSwgMCkgfS50byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAiI3RvX3B0ciIgZG8KKyAgICBtZW1vcnkgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpwb2ludGVyCisgICAgZXhwZWN0KG1lbW9yeS50b19wdHIpLnRvIGVxKG1lbW9yeSkKKworICAgIGV4cGVjdChGRkk6OlBvaW50ZXI6Ok5VTEwudG9fcHRyKS50byBlcShGRkk6OlBvaW50ZXI6Ok5VTEwpCisgIGVuZAorCisgIGRlc2NyaWJlICJwb2ludGVyIHR5cGUgbWV0aG9kcyIgZG8KKworICAgIGl0ICIjcmVhZF9wb2ludGVyIiBkbworICAgICAgbWVtb3J5ID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyA6cG9pbnRlcgorICAgICAgUG9pbnRlclRlc3RMaWIucHRyX3NldF9wb2ludGVyKG1lbW9yeSwgMCwgUG9pbnRlclRlc3RMaWIucHRyX2Zyb21fYWRkcmVzcygweGRlYWRiZWVmKSkKKyAgICAgIGV4cGVjdChtZW1vcnkucmVhZF9wb2ludGVyLmFkZHJlc3MpLnRvIGVxKDB4ZGVhZGJlZWYpCisgICAgZW5kCisKKyAgICBpdCAiI3dyaXRlX3BvaW50ZXIiIGRvCisgICAgICBtZW1vcnkgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpwb2ludGVyCisgICAgICBtZW1vcnkud3JpdGVfcG9pbnRlcihQb2ludGVyVGVzdExpYi5wdHJfZnJvbV9hZGRyZXNzKDB4ZGVhZGJlZWYpKQorICAgICAgZXhwZWN0KFBvaW50ZXJUZXN0TGliLnB0cl9yZXRfcG9pbnRlcihtZW1vcnksIDApLmFkZHJlc3MpLnRvIGVxKDB4ZGVhZGJlZWYpCisgICAgZW5kCisKKyAgICBpdCAiI3JlYWRfYXJyYXlfb2ZfcG9pbnRlciIgZG8KKyAgICAgIHZhbHVlcyA9IFsweDEyMzQ1Njc4LCAweGZlZWRmMDBkLCAweGRlYWRiZWVmXQorICAgICAgbWVtb3J5ID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyA6cG9pbnRlciwgdmFsdWVzLnNpemUKKyAgICAgIHZhbHVlcy5lYWNoX3dpdGhfaW5kZXggZG8gfGFkZHJlc3MsIGp8CisgICAgICAgIFBvaW50ZXJUZXN0TGliLnB0cl9zZXRfcG9pbnRlcihtZW1vcnksIGogKiBGRkkudHlwZV9zaXplKDpwb2ludGVyKSwgUG9pbnRlclRlc3RMaWIucHRyX2Zyb21fYWRkcmVzcyhhZGRyZXNzKSkKKyAgICAgIGVuZAorICAgICAgYXJyYXkgPSBtZW1vcnkucmVhZF9hcnJheV9vZl9wb2ludGVyKHZhbHVlcy5zaXplKQorICAgICAgdmFsdWVzLmVhY2hfd2l0aF9pbmRleCBkbyB8YWRkcmVzcywganwKKyAgICAgICAgZXhwZWN0KGFycmF5W2pdLmFkZHJlc3MpLnRvIGVxKGFkZHJlc3MpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgZW5kCisKKyAgZGVzY3JpYmUgJ05VTEwnIGRvCisgICAgaXQgJ3Nob3VsZCBiZSBvYnRhaW5lZCB1c2luZyBQb2ludGVyOjpOVUxMIGNvbnN0YW50JyBkbworICAgICAgbnVsbF9wdHIgPSBGRkk6OlBvaW50ZXI6Ok5VTEwKKyAgICAgIGV4cGVjdChudWxsX3B0cikudG8gYmVfbnVsbAorICAgIGVuZAorICAgIGl0ICdzaG91bGQgYmUgb2J0YWluZWQgcGFzc2luZyBhZGRyZXNzIDAgdG8gY29uc3RydWN0b3InIGRvCisgICAgICBleHBlY3QoRkZJOjpQb2ludGVyLm5ldygwKSkudG8gYmVfbnVsbAorICAgIGVuZAorICAgIGl0ICdzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiBhdHRlbXB0aW5nIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBvbiBpdCcgZG8KKyAgICAgIG51bGxfcHRyID0gRkZJOjpQb2ludGVyOjpOVUxMCisgICAgICBleHBlY3QgeyBudWxsX3B0ci5yZWFkX2ludCB9LnRvIHJhaXNlX2Vycm9yKEZGSTo6TnVsbFBvaW50ZXJFcnJvcikKKyAgICAgIGV4cGVjdCB7IG51bGxfcHRyLndyaXRlX2ludCgweGZmMSkgfS50byByYWlzZV9lcnJvcihGRkk6Ok51bGxQb2ludGVyRXJyb3IpCisgICAgZW5kCisgICAgaXQgJ3JldHVybnMgdHJ1ZSB3aGVuIGNvbXBhcmVkIHdpdGggbmlsJyBkbworICAgICAgZXhwZWN0KChGRkk6OlBvaW50ZXI6Ok5VTEwgPT0gbmlsKSkudG8gYmUgdHJ1ZQorICAgIGVuZAorICBlbmQKKworICBpdCAiUG9pbnRlci5zaXplIHJldHVybnMgc2l6ZW9mIHBvaW50ZXIgb24gcGxhdGZvcm0iIGRvCisgICAgZXhwZWN0KEZGSTo6UG9pbnRlci5zaXplKS50byBlcSgoRkZJOjpQbGF0Zm9ybTo6QUREUkVTU19TSVpFIC8gOCkpCisgIGVuZAorCisgIGRlc2NyaWJlICIjc2xpY2UiIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQG1wdHIgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpjaGFyLCAxMikKKyAgICAgIEBtcHRyLnB1dF91aW50KDAsIDB4MTIzNDU2NzgpCisgICAgICBAbXB0ci5wdXRfdWludCg0LCAweGRlYWRiZWVmKQorICAgIGVuZAorCisgICAgaXQgImNvbnRlbnRzIG9mIHNsaWNlZCBwb2ludGVyIG1hdGNoZXMgb3JpZ2luYWwgcG9pbnRlciBhdCBvZmZzZXQiIGRvCisgICAgICBleHBlY3QoQG1wdHIuc2xpY2UoNCwgNCkuZ2V0X3VpbnQoMCkpLnRvIGVxKDB4ZGVhZGJlZWYpCisgICAgZW5kCisKKyAgICBpdCAibW9kaWZ5aW5nIHNsaWNlZCBwb2ludGVyIGlzIHJlZmxlY3RlZCBpbiBvcmlnaW5hbCBwb2ludGVyIiBkbworICAgICAgQG1wdHIuc2xpY2UoNCwgNCkucHV0X3VpbnQoMCwgMHhmZWUxZGVhZCkKKyAgICAgIGV4cGVjdChAbXB0ci5nZXRfdWludCg0KSkudG8gZXEoMHhmZWUxZGVhZCkKKyAgICBlbmQKKworICAgIGl0ICJhY2Nlc3MgYmV5b25kIGJvdW5kcyBzaG91bGQgcmFpc2UgSW5kZXhFcnJvciIgZG8KKyAgICAgIGV4cGVjdCB7IEBtcHRyLnNsaWNlKDQsIDQpLmdldF9pbnQoNCkgfS50byByYWlzZV9lcnJvcihJbmRleEVycm9yKQorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAiI3R5cGVfc2l6ZSIgZG8KKyAgICBpdCAic2hvdWxkIGJlIHNhbWUgYXMgRkZJLnR5cGVfc2l6ZSh0eXBlKSIgZG8KKyAgICAgIGV4cGVjdChGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDppbnQsIDEpLnR5cGVfc2l6ZSkudG8gZXEoRkZJLnR5cGVfc2l6ZSg6aW50KSkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIkF1dG9Qb2ludGVyIiBkbworICBsb29wX2NvdW50ID0gMzAKKyAgd2lnZ2xlX3Jvb20gPSA1ICMgR0MgcmFyZWx5IGNsZWFucyB1cCBhbGwgb2JqZWN0cy4gd2UgY2FuIGdldCBtb3N0IG9mIHRoZW0sIGFuZCB0aGF0J3MgZW5vdWdoIHRvIGRldGVybWluZSBpZiB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBpcyB3b3JraW5nLgorICBtYWdpYyA9IDB4MTIzNDU2NzgKKworICBjbGFzcyBBdXRvUG9pbnRlclRlc3RIZWxwZXIKKyAgICBAQGNvdW50ID0gMAorICAgIGRlZiBzZWxmLnJlbGVhc2UKKyAgICAgIEBAY291bnQgKz0gMSBpZiBAQGNvdW50ID4gMAorICAgIGVuZAorICAgIGRlZiBzZWxmLnJlc2V0CisgICAgICBAQGNvdW50ID0gMAorICAgIGVuZAorICAgIGRlZiBzZWxmLmdjX2V2ZXJ5dGhpbmcoY291bnQpCisgICAgICBsb29wID0gNQorICAgICAgd2hpbGUgQEBjb3VudCA8IGNvdW50ICYmIGxvb3AgPiAwCisgICAgICAgIGxvb3AgLT0gMQorICAgICAgICBUZXN0TGlicmFyeS5mb3JjZV9nYworICAgICAgICBzbGVlcCAwLjA1IHVubGVzcyBAQGNvdW50ID09IGNvdW50CisgICAgICBlbmQKKyAgICAgIEBAY291bnQgPSAwCisgICAgZW5kCisgICAgZGVmIHNlbGYuZmluYWxpemVyCisgICAgICBzZWxmLm1ldGhvZCg6cmVsZWFzZSkudG9fcHJvYworICAgIGVuZAorICBlbmQKKyAgY2xhc3MgQXV0b1BvaW50ZXJTdWJjbGFzcyA8IEZGSTo6QXV0b1BvaW50ZXIKKyAgICBkZWYgc2VsZi5yZWxlYXNlKHB0cik7IGVuZAorICBlbmQKKworICAjIHNlZSAjNDI3CisgIGl0ICJjbGVhbnVwIHZpYSBkZWZhdWx0IHJlbGVhc2UgbWV0aG9kIiwgOmJyb2tlbiA9PiB0cnVlIGRvCisgICAgZXhwZWN0KEF1dG9Qb2ludGVyU3ViY2xhc3MpLnRvIHJlY2VpdmUoOnJlbGVhc2UpLmF0X2xlYXN0KGxvb3BfY291bnQtd2lnZ2xlX3Jvb20pLnRpbWVzCisgICAgQXV0b1BvaW50ZXJUZXN0SGVscGVyLnJlc2V0CisgICAgbG9vcF9jb3VudC50aW1lcyBkbworICAgICAgIyBub3RlIHRoYXQgaWYgd2UgY2FsbGVkCisgICAgICAjIEF1dG9Qb2ludGVyVGVzdEhlbHBlci5tZXRob2QoOnJlbGVhc2UpLnRvX3Byb2MgaW5saW5lLCB3ZSdkCisgICAgICAjIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIHBvaW50ZXIgYW5kIGl0IHdvdWxkIG5ldmVyIGdldCBHQydkLgorICAgICAgQXV0b1BvaW50ZXJTdWJjbGFzcy5uZXcoUG9pbnRlclRlc3RMaWIucHRyX2Zyb21fYWRkcmVzcyhtYWdpYykpCisgICAgZW5kCisgICAgQXV0b1BvaW50ZXJUZXN0SGVscGVyLmdjX2V2ZXJ5dGhpbmcgbG9vcF9jb3VudAorICBlbmQKKworICAjIHNlZSAjNDI3CisgIGl0ICJjbGVhbnVwIHdoZW4gcGFzc2VkIGEgcHJvYyIsIDpicm9rZW4gPT4gdHJ1ZSBkbworICAgICMgIE5PVEU6IHBhc3NpbmcgYSBwcm9jIGlzIHRvdWNoeSwgYmVjYXVzZSBpdCdzIHNvIGVhc3kgdG8gY3JlYXRlIGEgbWVtb3J5IGxlYWsuCisgICAgIworICAgICMgIHNwZWNpZmljYWxseSwgaWYgd2UgbWFkZSBhbiBpbmxpbmUgY2FsbCB0bworICAgICMKKyAgICAjICAgICAgQXV0b1BvaW50ZXJUZXN0SGVscGVyLm1ldGhvZCg6cmVsZWFzZSkudG9fcHJvYworICAgICMKKyAgICAjICB3ZSdkIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIHBvaW50ZXIgYW5kIGl0IHdvdWxkCisgICAgIyAgbmV2ZXIgZ2V0IEdDJ2QuCisgICAgZXhwZWN0KEF1dG9Qb2ludGVyVGVzdEhlbHBlcikudG8gcmVjZWl2ZSg6cmVsZWFzZSkuYXRfbGVhc3QobG9vcF9jb3VudC13aWdnbGVfcm9vbSkudGltZXMKKyAgICBBdXRvUG9pbnRlclRlc3RIZWxwZXIucmVzZXQKKyAgICBsb29wX2NvdW50LnRpbWVzIGRvCisgICAgICBGRkk6OkF1dG9Qb2ludGVyLm5ldyhQb2ludGVyVGVzdExpYi5wdHJfZnJvbV9hZGRyZXNzKG1hZ2ljKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9Qb2ludGVyVGVzdEhlbHBlci5maW5hbGl6ZXIpCisgICAgZW5kCisgICAgQXV0b1BvaW50ZXJUZXN0SGVscGVyLmdjX2V2ZXJ5dGhpbmcgbG9vcF9jb3VudAorICBlbmQKKworICAjIHNlZSAjNDI3CisgIGl0ICJjbGVhbnVwIHdoZW4gcGFzc2VkIGEgbWV0aG9kIiwgOmJyb2tlbiA9PiB0cnVlIGRvCisgICAgZXhwZWN0KEF1dG9Qb2ludGVyVGVzdEhlbHBlcikudG8gcmVjZWl2ZSg6cmVsZWFzZSkuYXRfbGVhc3QobG9vcF9jb3VudC13aWdnbGVfcm9vbSkudGltZXMKKyAgICBBdXRvUG9pbnRlclRlc3RIZWxwZXIucmVzZXQKKyAgICBsb29wX2NvdW50LnRpbWVzIGRvCisgICAgICBGRkk6OkF1dG9Qb2ludGVyLm5ldyhQb2ludGVyVGVzdExpYi5wdHJfZnJvbV9hZGRyZXNzKG1hZ2ljKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9Qb2ludGVyVGVzdEhlbHBlci5tZXRob2QoOnJlbGVhc2UpKQorICAgIGVuZAorICAgIEF1dG9Qb2ludGVyVGVzdEhlbHBlci5nY19ldmVyeXRoaW5nIGxvb3BfY291bnQKKyAgZW5kCisKKyAgaXQgImNhbiBiZSB1c2VkIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIiBkbworICAgIGV4cGVjdCBkbworICAgICAgTW9kdWxlLm5ldyBkbworICAgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAgICAgY2xhc3MgQ3VzdG9tQXV0b1BvaW50ZXIgPCBGRkk6OkF1dG9Qb2ludGVyCisgICAgICAgICAgZGVmIHNlbGYucmVsZWFzZShwdHIpOyBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX2Zyb21fYWRkcmVzcywgWyBGRkk6OlBsYXRmb3JtOjpBRERSRVNTX1NJWkUgPT0gMzIgPyA6dWludCA6IDp1bG9uZ19sb25nIF0sIEN1c3RvbUF1dG9Qb2ludGVyCisgICAgICBlbmQKKyAgICBlbmQubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorCisgIGRlc2NyaWJlICIjbmV3IiBkbworICAgIGl0ICJNZW1vcnlQb2ludGVyIGFyZ3VtZW50IHJhaXNlcyBUeXBlRXJyb3IiIGRvCisgICAgICBleHBlY3QgeyBGRkk6OkF1dG9Qb2ludGVyLm5ldyhGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDppbnQpKX0udG8gcmFpc2VfZXJyb3IoOjpUeXBlRXJyb3IpCisgICAgZW5kCisgICAgaXQgIkF1dG9Qb2ludGVyIGFyZ3VtZW50IHJhaXNlcyBUeXBlRXJyb3IiIGRvCisgICAgICBleHBlY3QgeyBBdXRvUG9pbnRlclN1YmNsYXNzLm5ldyhBdXRvUG9pbnRlclN1YmNsYXNzLm5ldyhQb2ludGVyVGVzdExpYi5wdHJfZnJvbV9hZGRyZXNzKDApKSkgfS50byByYWlzZV9lcnJvcig6OlR5cGVFcnJvcikKKyAgICBlbmQKKyAgICBpdCAiQnVmZmVyIGFyZ3VtZW50IHJhaXNlcyBUeXBlRXJyb3IiIGRvCisgICAgICBleHBlY3QgeyBGRkk6OkF1dG9Qb2ludGVyLm5ldyhGRkk6OkJ1ZmZlci5uZXcoOmludCkpfS50byByYWlzZV9lcnJvcig6OlR5cGVFcnJvcikKKyAgICBlbmQKKworICBlbmQKKworICBkZXNjcmliZSAiI2F1dG9yZWxlYXNlPyIgZG8KKyAgICBwdHJfY2xhc3MgPSBDbGFzcy5uZXcoRkZJOjpBdXRvUG9pbnRlcikgZG8KKyAgICAgIGRlZiBzZWxmLnJlbGVhc2UocHRyKTsgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGJlIHRydWUgYnkgZGVmYXVsdCIgZG8KKyAgICAgIGV4cGVjdChwdHJfY2xhc3MubmV3KEZGSTo6UG9pbnRlci5uZXcoMHhkZWFkYmVlZikpLmF1dG9yZWxlYXNlPykudG8gYmUgdHJ1ZQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBhdXRvcmVsZWFzZT0oZmFsc2UpIiBkbworICAgICAgcHRyID0gcHRyX2NsYXNzLm5ldyhGRkk6OlBvaW50ZXIubmV3KDB4ZGVhZGJlZWYpKQorICAgICAgcHRyLmF1dG9yZWxlYXNlID0gZmFsc2UKKyAgICAgIGV4cGVjdChwdHIuYXV0b3JlbGVhc2U/KS50byBiZSBmYWxzZQorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAiI3R5cGVfc2l6ZSIgZG8KKyAgICBwdHJfY2xhc3MgPSBDbGFzcy5uZXcoRkZJOjpBdXRvUG9pbnRlcikgZG8KKyAgICAgIGRlZiBzZWxmLnJlbGVhc2UocHRyKTsgZW5kCisgICAgZW5kCisKKyAgICBpdCAidHlwZV9zaXplIG9mIEF1dG9Qb2ludGVyIHNob3VsZCBtYXRjaCB3cmFwcGVkIFBvaW50ZXIiIGRvCisgICAgICBhcHRyID0gcHRyX2NsYXNzLm5ldyhGRkk6OlBvaW50ZXIubmV3KDppbnQsIDB4ZGVhZGJlZWYpKQorICAgICAgZXhwZWN0KGFwdHIudHlwZV9zaXplKS50byBlcShGRkkudHlwZV9zaXplKDppbnQpKQorICAgIGVuZAorICAgIAorICAgIGl0ICJbXSBvZmZzZXQgc2hvdWxkIG1hdGNoIHdyYXBwZWQgUG9pbnRlciIgZG8KKyAgICAgIG1wdHIgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDppbnQsIDEwMjQpCisgICAgICBhcHRyID0gcHRyX2NsYXNzLm5ldyhGRkk6OlBvaW50ZXIubmV3KDppbnQsIG1wdHIpKQorICAgICAgYXB0clswXS53cml0ZV91aW50KDB4ZmVlMWRlYWQpCisgICAgICBhcHRyWzFdLndyaXRlX3VpbnQoMHhjYWZlYmFiZSkKKyAgICAgIGV4cGVjdChtcHRyWzBdLnJlYWRfdWludCkudG8gZXEoMHhmZWUxZGVhZCkKKyAgICAgIGV4cGVjdChtcHRyWzFdLnJlYWRfdWludCkudG8gZXEoMHhjYWZlYmFiZSkKKyAgICBlbmQKKyAgZW5kCitlbmQKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9yYngvYXR0YWNoX2Z1bmN0aW9uX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3JieC9hdHRhY2hfZnVuY3Rpb25fc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTkzNjYyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9yYngvYXR0YWNoX2Z1bmN0aW9uX3NwZWMucmIKQEAgLTAsMCArMSwzNCBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKwordW5sZXNzIEZGSTo6UGxhdGZvcm0ud2luZG93cz8KKyAgY2xhc3MgVGltZXZhbCA8IEZGSTo6U3RydWN0CisgICAgbGF5b3V0IDp0dl9zZWMsIDp1bG9uZywgMCwgOnR2X3VzZWMsIDp1bG9uZywgNAorICBlbmQKKworICBtb2R1bGUgTGliQworICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIEZGSTo6TGlicmFyeTo6TElCQworCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpnZXR0aW1lb2ZkYXksIFs6cG9pbnRlciwgOnBvaW50ZXJdLCA6aW50CisgIGVuZAorCisgIGRlc2NyaWJlIEZGSTo6TGlicmFyeSwgIiNhdHRhY2hfZnVuY3Rpb24iIGRvCisgICAgaXQgImNvcnJlY3RseSByZXR1cm5zIGEgdmFsdWUgZm9yIGdldHRpbWVvZmRheSIgZG8KKyAgICAgIHQgPSBUaW1ldmFsLm5ldworICAgICAgdGltZSA9IExpYkMuZ2V0dGltZW9mZGF5KHQucG9pbnRlciwgbmlsKQorICAgICAgZXhwZWN0KHRpbWUpLnRvIGJlX2tpbmRfb2YoSW50ZWdlcikKKyAgICBlbmQKKworICAgIGl0ICJjb3JyZWN0bHkgcG9wdWxhdGVzIGEgc3RydWN0IGZvciBnZXR0aW1lb2ZkYXkiIGRvCisgICAgICB0ID0gVGltZXZhbC5uZXcKKyAgICAgIExpYkMuZ2V0dGltZW9mZGF5KHQucG9pbnRlciwgbmlsKQorICAgICAgZXhwZWN0KHRbOnR2X3NlY10pLnRvIGJlX2tpbmRfb2YoTnVtZXJpYykKKyAgICAgIGV4cGVjdCh0Wzp0dl91c2VjXSkudG8gYmVfa2luZF9vZihOdW1lcmljKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9yYngvbWVtb3J5X3BvaW50ZXJfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcmJ4L21lbW9yeV9wb2ludGVyX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2OWQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcmJ4L21lbW9yeV9wb2ludGVyX3NwZWMucmIKQEAgLTAsMCArMSwxOTQgQEAKKyMgY29kaW5nOiB1dGYtOAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKworbW9kdWxlIENUZXN0CisgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgZmZpX2xpYiBGRkk6OkxpYnJhcnk6OkxJQkMKKworICBhdHRhY2hfZnVuY3Rpb24gOnN0cmNhdCwgWzpwb2ludGVyLCA6cG9pbnRlcl0sIDpwb2ludGVyCitlbmQKKworZGVzY3JpYmUgIk1lbW9yeVBvaW50ZXIiIGRvCisgIGl0ICJtYWtlcyBhIHBvaW50ZXIgZnJvbSBhIHN0cmluZyIgZG8KKyAgICBtID0gRkZJOjpNZW1vcnlQb2ludGVyLmZyb21fc3RyaW5nKCJGRkkgaXMgQXdlc29tZSIpCisgICAgZXhwZWN0KG0udG90YWwpLnRvIGVxKDE1KQorICAgIGV4cGVjdChtLnR5cGVfc2l6ZSkudG8gZXEoMSkKKyAgZW5kCisKKyAgaXQgImRvZXMgbm90IG1ha2UgYSBwb2ludGVyIGZyb20gbm9uLXN0cmluZ3MiIGRvCisgICAgZXhwZWN0IHsgRkZJOjpNZW1vcnlQb2ludGVyLmZyb21fc3RyaW5nKG5pbCkgfS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorCisgIGl0ICJtYWtlcyBhIHBvaW50ZXIgZnJvbSBhIHN0cmluZyB3aXRoIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIiBkbworICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIuZnJvbV9zdHJpbmcoIuOBseOCk+OBoCIpCisgICAgZXhwZWN0KG0udG90YWwpLnRvIGVxKDEwKQorICAgIGV4cGVjdChtLnR5cGVfc2l6ZSkudG8gZXEoMSkKKyAgZW5kCisKKyAgaXQgInJlYWRzIGJhY2sgYSBzdHJpbmciIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5mcm9tX3N0cmluZygiRkZJIGlzIEF3ZXNvbWUiKQorICAgIGV4cGVjdChtLnJlYWRfc3RyaW5nKS50byBlcSgiRkZJIGlzIEF3ZXNvbWUiKQorICBlbmQKKyAgCisgIGl0ICJtYWtlcyBhIHBvaW50ZXIgZm9yIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMiIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOCkKKyAgICBtLndyaXRlX2FycmF5X29mX2ludChbMSwyXSkKKyAgICBleHBlY3QobS5yZWFkX2FycmF5X29mX2ludCgyKSkudG8gZXEoWzEsMl0pCisgIGVuZAorCisgIGl0ICJhbGxvd3MgYWNjZXNzIHRvIGFuIGVsZW1lbnQgb2YgdGhlIHBvaW50ZXIgKGFzIGFuIGFycmF5KSIgZG8KKyAgICBtID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyg6aW50LCAyKQorICAgIG0ud3JpdGVfYXJyYXlfb2ZfaW50KFsxLDJdKQorICAgIGV4cGVjdChtWzBdLnJlYWRfaW50KS50byBlcSgxKQorICAgIGV4cGVjdChtWzFdLnJlYWRfaW50KS50byBlcSgyKQorICBlbmQKKyAgCisgIGl0ICJhbGxvd3Mgd3JpdGluZyBhcyBhbiBpbnQiIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOmludCkKKyAgICBtLndyaXRlX2ludCgxKQorICAgIGV4cGVjdChtLnJlYWRfaW50KS50byBlcSgxKQorICAgIGV4cGVjdChtLnJlYWQgOmludCkudG8gZXEoMSkKKyAgICBleHBlY3QobS5yZWFkIEZGSTo6VHlwZTo6SU5UKS50byBlcSgxKQorICBlbmQKKworICBpdCAiYWxsb3dzIHdyaXRpbmcgYXMgYSBzaXplZCBpbnQiIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOnVpbnQzMikKKyAgICBtLndyaXRlX3VpbnQzMigxKQorICAgIGV4cGVjdChtLnJlYWRfdWludDMyKS50byBlcSgxKQorICAgIGV4cGVjdChtLnJlYWQgOnVpbnQzMikudG8gZXEoMSkKKyAgICBleHBlY3QobS5yZWFkIEZGSTo6VHlwZTo6VUlOVDMyKS50byBlcSgxKQorCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOnVpbnQzMikKKyAgICBtLndyaXRlIDp1aW50MzIsIDEKKyAgICBleHBlY3QobS5yZWFkIDp1aW50MzIpLnRvIGVxKDEpCisKKyAgICBtID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyg6aW50NjQpCisgICAgbS53cml0ZV9pbnQ2NCgxKQorICAgIGV4cGVjdChtLnJlYWRfaW50NjQpLnRvIGVxKDEpCisgICAgZXhwZWN0KG0ucmVhZCA6aW50NjQpLnRvIGVxKDEpCisgICAgZXhwZWN0KG0ucmVhZCBGRkk6OlR5cGU6OklOVDY0KS50byBlcSgxKQorCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOmludDY0KQorICAgIG0ud3JpdGUgOmludDY0LCAxCisgICAgZXhwZWN0KG0ucmVhZCA6aW50NjQpLnRvIGVxKDEpCisgIGVuZAorCisgIGl0ICJhbGxvd3Mgd3JpdGluZyBhcyBhIGxvbmciIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOmxvbmcpCisgICAgbS53cml0ZV9sb25nKDEwKQorICAgIGV4cGVjdChtLnJlYWRfbG9uZykudG8gZXEoMTApCisgICAgZXhwZWN0KG0ucmVhZCA6bG9uZykudG8gZXEoMTApCisgICAgZXhwZWN0KG0ucmVhZCBGRkk6OlR5cGU6OkxPTkcpLnRvIGVxKDEwKQorCisgICAgbS53cml0ZSA6bG9uZywgMTAKKyAgICBleHBlY3QobS5yZWFkIDpsb25nKS50byBlcSgxMCkKKyAgZW5kCisKKyAgaXQgImFsbG93cyB3cml0aW5nIGFzIGEgc2l6ZV90IiBkbworICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpzaXplX3QpCisgICAgbS53cml0ZSg6c2l6ZV90LCAxMCkKKyAgICBleHBlY3QobS5yZWFkIDpzaXplX3QpLnRvIGVxKDEwKQorICBlbmQKKworICBpdCAiYWxsb3dzIHdyaXRpbmcgYXMgYSBib29sIiBkbworICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpib29sKQorICAgIG0ud3JpdGUoOmJvb2wsIHRydWUpCisgICAgZXhwZWN0KG0ucmVhZCA6Ym9vbCkudG8gZXEodHJ1ZSkKKyAgICBleHBlY3QobS5yZWFkIEZGSTo6VHlwZTo6Qk9PTCkudG8gZXEodHJ1ZSkKKworICAgIG0ud3JpdGUoOmJvb2wsIGZhbHNlKQorICAgIGV4cGVjdChtLnJlYWQgOmJvb2wpLnRvIGVxKGZhbHNlKQorICAgIGV4cGVjdChtLnJlYWQgRkZJOjpUeXBlOjpCT09MKS50byBlcShmYWxzZSkKKyAgZW5kCisKKyAgaXQgImFsbG93cyB3cml0aW5nIGEgY3VzdG9tIHR5cGVkZWYiIGRvCisgICAgRkZJLnR5cGVkZWYgOnVpbnQsIDpmdWJhcl90CisgICAgRkZJLnR5cGVkZWYgOnNpemVfdCwgOmZ1YmFyMl90CisKKyAgICBtID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyg6ZnViYXJfdCkKKyAgICBtLndyaXRlKDpmdWJhcl90LCAxMCkKKyAgICBleHBlY3QobS5yZWFkIDpmdWJhcl90KS50byBlcSgxMCkKKworICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpmdWJhcjJfdCkKKyAgICBtLndyaXRlKDpmdWJhcjJfdCwgMTApCisgICAgZXhwZWN0KG0ucmVhZCA6ZnViYXIyX3QpLnRvIGVxKDEwKQorICBlbmQKKworICBpdCAicmFpc2VzIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gcmVhZCBhbiB1bmRlZmluZWQgdHlwZSIgZG8KKyAgICBtID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyg6bG9uZykKKyAgICBleHBlY3QgeyBtLnJlYWQoOnVuZGVmaW5lZF90eXBlKSB9LnRvIHJhaXNlX2Vycm9yKEFyZ3VtZW50RXJyb3IpCisgIGVuZAorICAKKyAgaXQgInJhaXNlcyBhbiBlcnJvciBpZiB5b3UgdHJ5IHB1dHRpbmcgYSBsb25nIGludG8gYSBwb2ludGVyIG9mIHNpemUgMSIgZG8KKyAgICBtID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldygxKQorICAgIGV4cGVjdCB7IG0ud3JpdGVfbG9uZygxMCkgfS50byByYWlzZV9lcnJvcgorICBlbmQKKyAgCisgIGl0ICJyYWlzZXMgYW4gZXJyb3IgaWYgeW91IHRyeSBwdXR0aW5nIGFuIGludCBpbnRvIGEgcG9pbnRlciBvZiBzaXplIDEiIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoMSkKKyAgICBleHBlY3QgeyBtLndyaXRlX2ludCgxMCkgfS50byByYWlzZV9lcnJvcgorICBlbmQKKyMgIGl0ICJkb2VzIG5vdCByYWlzZSBJbmRleEVycm9yIGZvciBvcGFxdWUgcG9pbnRlcnMiIGRvCisjICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDgpCisjICAgIHAyID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldygxMDI0KQorIyAgICBtLndyaXRlX2xvbmcocDIuYWRkcmVzcykKKyMgICAgcCA9IG0ucmVhZF9wb2ludGVyCisjICAgIGxhbWJkYSB7IHAud3JpdGVfaW50KDEwKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IKKyMgIGVuZAorICAKKyAgaXQgIm1ha2VzIGEgcG9pbnRlciBmb3IgYSBjZXJ0YWluIHR5cGUiIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOmludCkKKyAgICBtLndyaXRlX2ludCgxMCkKKyAgICBleHBlY3QobS5yZWFkX2ludCkudG8gZXEoMTApCisgIGVuZAorICAKKyAgaXQgIm1ha2VzIGEgbWVtb3J5IHBvaW50ZXIgZm9yIGEgbnVtYmVyIG9mIGEgY2VydGFpbiB0eXBlIiBkbworICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDppbnQsIDIpCisgICAgbS53cml0ZV9hcnJheV9vZl9pbnQoWzEsMl0pCisgICAgZXhwZWN0KG0ucmVhZF9hcnJheV9vZl9pbnQoMikpLnRvIGVxKFsxLDJdKQorICBlbmQKKyAgCisgIGl0ICJtYWtlcyBhIHBvaW50ZXIgZm9yIGFuIG9iamVjdCByZXNwb25kaW5nIHRvICNzaXplIiBkbworICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KFN0cnVjdC5uZXcoOnNpemUpLm5ldyg4KSkKKyAgICBtLndyaXRlX2FycmF5X29mX2ludChbMSwyXSkKKyAgICBleHBlY3QobS5yZWFkX2FycmF5X29mX2ludCgyKSkudG8gZXEoWzEsMl0pCisgIGVuZAorCisgIGl0ICJtYWtlcyBhIHBvaW50ZXIgZm9yIGEgbnVtYmVyIG9mIGFuIG9iamVjdCByZXNwb25kaW5nIHRvICNzaXplIiBkbworICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KFN0cnVjdC5uZXcoOnNpemUpLm5ldyg0KSwgMikKKyAgICBtLndyaXRlX2FycmF5X29mX2ludChbMSwyXSkKKyAgICBleHBlY3QobS5yZWFkX2FycmF5X29mX2ludCgyKSkudG8gZXEoWzEsMl0pCisgIGVuZCAgCisKKyAgaXQgIk1lbW9yeVBvaW50ZXIjYWRkcmVzcyByZXR1cm5zIGNvcnJlY3QgdmFsdWUiIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOmxvbmdfbG9uZykKKyAgICBtYWdpYyA9IDB4MTIzNDU2NzgKKyAgICBtLndyaXRlX2xvbmcobWFnaWMpCisgICAgZXhwZWN0KG0ucmVhZF9wb2ludGVyLmFkZHJlc3MpLnRvIGVxKG1hZ2ljKQorICBlbmQKKworICBpdCAiTWVtb3J5UG9pbnRlciNudWxsPyByZXR1cm5zIHRydWUgZm9yIHplcm8gdmFsdWUiIGRvCisgICAgbSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOmxvbmdfbG9uZykKKyAgICBtLndyaXRlX2xvbmcoMCkgICAgCisgICAgZXhwZWN0KG0ucmVhZF9wb2ludGVyLm51bGw/KS50byBiZSB0cnVlCisgIGVuZAorCisgIGl0ICJNZW1vcnlQb2ludGVyI251bGw/IHJldHVybnMgZmFsc2UgZm9yIG5vbi16ZXJvIHZhbHVlIiBkbworICAgIG0gPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpsb25nX2xvbmcpCisgICAgbS53cml0ZV9sb25nKDB4MTIzNDU2NzgpCisgICAgZXhwZWN0KG0ucmVhZF9wb2ludGVyLm51bGw/KS50byBiZSBmYWxzZQorICBlbmQKKyAgCisgIGl0ICJpbml0aWFsaXplIHdpdGggYmxvY2sgc2hvdWxkIGV4ZWN1dGUgYmxvY2siIGRvCisgICAgYmxvY2tfZXhlY3V0ZWQgPSBmYWxzZQorICAgIEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOnBvaW50ZXIpIGRvIHxwdHJ8CisgICAgICBibG9ja19leGVjdXRlZCA9IHRydWUKKyAgICBlbmQKKyAgICBleHBlY3QoYmxvY2tfZXhlY3V0ZWQpLnRvIGJlIHRydWUKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcmJ4L3NwZWNfaGVscGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9yYngvc3BlY19oZWxwZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwMDlkOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcmJ4L3NwZWNfaGVscGVyLnJiCkBAIC0wLDAgKzEsNiBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAiLi4vc3BlY19oZWxwZXIiKSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcmJ4L3N0cnVjdF9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9yYngvc3RydWN0X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlZDg1YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvcmJ4L3N0cnVjdF9zcGVjLnJiCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2NsYXNzIFRpbWV2YWwgPCBGRkk6OlN0cnVjdAorICBsYXlvdXQgOnR2X3NlYywgOnVsb25nLCAwLCA6dHZfdXNlYywgOnVsb25nLCA0ICAKK2VuZAorCitkZXNjcmliZSBGRkk6OlN0cnVjdCBkbworICBpdCAiYWxsb3dzIHNldHRpbmcgZmllbGRzIiBkbworICAgIHQgPSBUaW1ldmFsLm5ldworICAgIHRbOnR2X3NlY10gPSAxMgorICAgIGV4cGVjdCh0Wzp0dl9zZWNdKS50byBlcSgxMikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvc3BlY19oZWxwZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3NwZWNfaGVscGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTczZTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3NwZWNfaGVscGVyLnJiCkBAIC0wLDAgKzEsOTMgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgJ3JiY29uZmlnJworcmVxdWlyZSAnZmlsZXV0aWxzJworcmVxdWlyZSAnZmZpJworCitSU3BlYy5jb25maWd1cmUgZG8gfGN8CisgIGMuZmlsdGVyX3J1bl9leGNsdWRpbmcgOmJyb2tlbiA9PiB0cnVlCitlbmQKKworQ1BVID0gY2FzZSBSYkNvbmZpZzo6Q09ORklHWydob3N0X2NwdSddLmRvd25jYXNlCisgIHdoZW4gL2lbMzQ1Nl04Ni8KKyAgICAjIERhcndpbiBhbHdheXMgcmVwb3J0cyBpNjg2LCBldmVuIHdoZW4gcnVubmluZyBpbiA2NGJpdCBtb2RlCisgICAgaWYgUmJDb25maWc6OkNPTkZJR1snaG9zdF9vcyddID1+IC9kYXJ3aW4vICYmIDB4ZmVlMWRlYWRiZWVmLmlzX2E/KEZpeG51bSkKKyAgICAgICJ4ODZfNjQiCisgICAgZWxzZQorICAgICAgImkzODYiCisgICAgZW5kCisKKyAgd2hlbiAvYW1kNjR8eDg2XzY0LworICAgICJ4ODZfNjQiCisKKyAgd2hlbiAvcHBjNjR8cG93ZXJwYzY0LworICAgICJwb3dlcnBjNjQiCisKKyAgd2hlbiAvcHBjfHBvd2VycGMvCisgICAgInBvd2VycGMiCisKKyAgd2hlbiAvXmFybS8KKyAgICAiYXJtIgorCisgIGVsc2UKKyAgICBSYkNvbmZpZzo6Q09ORklHWydob3N0X2NwdSddCisgIGVuZAorCitPUyA9IGNhc2UgUmJDb25maWc6OkNPTkZJR1snaG9zdF9vcyddLmRvd25jYXNlCisgIHdoZW4gL2xpbnV4LworICAgICJsaW51eCIKKyAgd2hlbiAvZGFyd2luLworICAgICJkYXJ3aW4iCisgIHdoZW4gL2ZyZWVic2QvCisgICAgImZyZWVic2QiCisgIHdoZW4gL29wZW5ic2QvCisgICAgIm9wZW5ic2QiCisgIHdoZW4gL3N1bm9zfHNvbGFyaXMvCisgICAgInNvbGFyaXMiCisgIHdoZW4gL21zd2lufG1pbmd3LworICAgICJ3aW4zMiIKKyAgZWxzZQorICAgIFJiQ29uZmlnOjpDT05GSUdbJ2hvc3Rfb3MnXS5kb3duY2FzZQorICBlbmQKKworZGVmIGNvbXBpbGVfbGlicmFyeShwYXRoLCBsaWIpCisKKyAgZGlyID0gRmlsZS5leHBhbmRfcGF0aChwYXRoLCBGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorICBsaWIgPSAiI3tkaXJ9LyN7bGlifSIKKyAgaWYgIUZpbGUuZXhpc3Q/KGxpYikKKyAgICBvdXRwdXQgPSBuaWwKKyAgICBGaWxlVXRpbHMuY2QoZGlyKSBkbworICAgICAgb3V0cHV0ID0gc3lzdGVtKColeyN7c3lzdGVtKCd3aGljaCBnbWFrZSA+L2Rldi9udWxsJykgJiYgJ2dtYWtlJyB8fCAnbWFrZSd9IENQVT0je0NQVX0gT1M9I3tPU30gfS50YXB7fHh8IHB1dHMgeC5pbnNwZWN0fSkKKyAgICBlbmQKKworICAgIGlmICQ/LmV4aXRzdGF0dXMgIT0gMAorICAgICAgcHV0cyAiRVJST1I6XG4je291dHB1dH0iCisgICAgICByYWlzZSAiVW5hYmxlIHRvIGNvbXBpbGUgXCIje2xpYn1cIiIKKyAgICBlbmQKKyAgZW5kCisKKyAgbGliCitlbmQKKworcmVxdWlyZSAiZmZpIgorCittb2R1bGUgVGVzdExpYnJhcnkKKyAgUEFUSCA9IGNvbXBpbGVfbGlicmFyeSgiZml4dHVyZXMiLCAibGlidGVzdC4je0ZGSTo6UGxhdGZvcm06OkxJQlNVRkZJWH0iKQorCisgIGRlZiBzZWxmLmZvcmNlX2djCisgICAgaWYgUlVCWV9QTEFURk9STSA9fiAvamF2YS8KKyAgICAgIGphdmEubGFuZy5TeXN0ZW0uZ2MKKyAgICBlbHNpZiBkZWZpbmVkPyhSVUJZX0VOR0lORSkgJiYgUlVCWV9FTkdJTkUgPT0gJ3JieCcKKyAgICAgIEdDLnJ1bih0cnVlKQorICAgIGVsc2UKKyAgICAgIEdDLnN0YXJ0CisgICAgZW5kCisgIGVuZAorZW5kCittb2R1bGUgTGliVGVzdAorICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9zdHJpbmdfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvc3RyaW5nX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjMTFmMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvc3RyaW5nX3NwZWMucmIKQEAgLTAsMCArMSwxMTggQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCitkZXNjcmliZSAiU3RyaW5nIHRlc3RzIiBkbworICBpbmNsdWRlIEZGSQorICBtb2R1bGUgU3RyTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgYXR0YWNoX2Z1bmN0aW9uIDpwdHJfcmV0X3BvaW50ZXIsIFsgOnBvaW50ZXIsIDppbnRdLCA6c3RyaW5nCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJpbmdfZXF1YWxzLCBbIDpzdHJpbmcsIDpzdHJpbmcgXSwgOmludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RyaW5nX2R1bW15LCBbIDpzdHJpbmcgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cmluZ19udWxsLCBbIF0sIDpzdHJpbmcKKyAgZW5kCisKKyAgaXQgIk1lbW9yeVBvaW50ZXIjZ2V0X3N0cmluZyByZXR1cm5zIGEgdGFpbnRlZCBzdHJpbmciIGRvCisgICAgbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDEwMjQKKyAgICBtcC5wdXRfc3RyaW5nKDAsICJ0ZXN0XDAiKQorICAgIHN0ciA9IG1wLmdldF9zdHJpbmcoMCkKKyAgICBleHBlY3Qoc3RyLnRhaW50ZWQ/KS50byBiZSB0cnVlCisgIGVuZAorCisgIGl0ICJTdHJpbmcgcmV0dXJuZWQgYnkgYSBtZXRob2QgaXMgdGFpbnRlZCIgZG8KKyAgICBtcCA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcgOnBvaW50ZXIKKyAgICBzcCA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcgMTAyNAorICAgIHNwLnB1dF9zdHJpbmcoMCwgInRlc3QiKQorICAgIG1wLnB1dF9wb2ludGVyKDAsIHNwKQorICAgIHN0ciA9IFN0ckxpYlRlc3QucHRyX3JldF9wb2ludGVyKG1wLCAwKQorICAgIGV4cGVjdChzdHIpLnRvIGVxKCJ0ZXN0IikKKyAgICBleHBlY3Qoc3RyKS50byBiZV90YWludGVkCisgIGVuZAorCisgIGl0ICJQb2lzb24gbnVsbCBieXRlIHJhaXNlcyBlcnJvciIgZG8KKyAgICBzID0gIjEyM1wwYWJjIgorICAgIGV4cGVjdCB7IFN0ckxpYlRlc3Quc3RyaW5nX2VxdWFscyhzLCBzKSB9LnRvIHJhaXNlX2Vycm9yCisgIGVuZAorCisgIGl0ICJUYWludGVkIFN0cmluZyBwYXJhbWV0ZXIgc2hvdWxkIHRocm93IGEgU2VjdXJpdHlFcnJvciIgZG8KKyAgICAkU0FGRSA9IDEKKyAgICBzdHIgPSAidGVzdCIKKyAgICBzdHIudGFpbnQKKyAgICBiZWdpbgorICAgICAgZXhwZWN0KExpYlRlc3Quc3RyaW5nX2VxdWFscyhzdHIsIHN0cikpLnRvIGJlIGZhbHNlCisgICAgcmVzY3VlIFNlY3VyaXR5RXJyb3IKKyAgICBlbmQKKyAgZW5kIGlmIGZhbHNlCisgIGl0ICJjYXN0cyBuaWwgYXMgTlVMTCBwb2ludGVyIiBkbworICAgIGV4cGVjdChTdHJMaWJUZXN0LnN0cmluZ19kdW1teShuaWwpKS50byBiZV9uaWwKKyAgZW5kCisKKyAgaXQgInJldHVybiBuaWwgZm9yIE5VTEwgY2hhcioiIGRvCisgICAgZXhwZWN0KFN0ckxpYlRlc3Quc3RyaW5nX251bGwpLnRvIGJlX25pbAorICBlbmQKKworICBpdCAicmVhZHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB1bnRpbCBlbmNvdW50ZXJpbmcgYSBOVUxMIHBvaW50ZXIiIGRvCisgICAgc3RyaW5ncyA9IFsiZm9vIiwgImJhciIsICJiYXoiLCAidGVzdGluZyIsICJmZmkiXQorICAgIHB0cmFyeSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOnBvaW50ZXIsIDYpCisgICAgYXJ5ID0gc3RyaW5ncy5pbmplY3QoW10pIGRvIHxhLCBzdHJ8CisgICAgICBmID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldygxMDI0KQorICAgICAgZi5wdXRfc3RyaW5nKDAsIHN0cikKKyAgICAgIGEgPDwgZgorICAgIGVuZAorICAgIGFyeS5pbnNlcnQoMywgbmlsKQorICAgIHB0cmFyeS53cml0ZV9hcnJheV9vZl9wb2ludGVyKGFyeSkKKyAgICBleHBlY3QocHRyYXJ5LmdldF9hcnJheV9vZl9zdHJpbmcoMCkpLnRvIGVxKFsiZm9vIiwgImJhciIsICJiYXoiXSkKKyAgZW5kCisKKyAgaXQgInJlYWRzIGFuIGFycmF5IG9mIHN0cmluZ3Mgb2YgdGhlIHNpemUgc3BlY2lmaWVkLCBzdWJzdGl0dXRpbmcgbmlsIHdoZW4gYSBwb2ludGVyIGlzIE5VTEwiIGRvCisgICAgc3RyaW5ncyA9IFsiZm9vIiwgImJhciIsICJiYXoiLCAidGVzdGluZyIsICJmZmkiXQorICAgIHB0cmFyeSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOnBvaW50ZXIsIDYpCisgICAgYXJ5ID0gc3RyaW5ncy5pbmplY3QoW10pIGRvIHxhLCBzdHJ8CisgICAgICBmID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldygxMDI0KQorICAgICAgZi5wdXRfc3RyaW5nKDAsIHN0cikKKyAgICAgIGEgPDwgZgorICAgIGVuZAorICAgIGFyeS5pbnNlcnQoMiwgbmlsKQorICAgIHB0cmFyeS53cml0ZV9hcnJheV9vZl9wb2ludGVyKGFyeSkKKyAgICBleHBlY3QocHRyYXJ5LmdldF9hcnJheV9vZl9zdHJpbmcoMCwgNCkpLnRvIGVxKFsiZm9vIiwgImJhciIsIG5pbCwgImJheiJdKQorICBlbmQKKworICBpdCAicmVhZHMgYW4gYXJyYXkgb2Ygc3RyaW5ncywgdGFraW5nIGEgbWVtb3J5IG9mZnNldCBwYXJhbWV0ZXIiIGRvCisgICAgc3RyaW5ncyA9IFsiZm9vIiwgImJhciIsICJiYXoiLCAidGVzdGluZyIsICJmZmkiXQorICAgIHB0cmFyeSA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoOnBvaW50ZXIsIDUpCisgICAgYXJ5ID0gc3RyaW5ncy5pbmplY3QoW10pIGRvIHxhLCBzdHJ8CisgICAgICBmID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldygxMDI0KQorICAgICAgZi5wdXRfc3RyaW5nKDAsIHN0cikKKyAgICAgIGEgPDwgZgorICAgIGVuZAorICAgIHB0cmFyeS53cml0ZV9hcnJheV9vZl9wb2ludGVyKGFyeSkKKyAgICBleHBlY3QocHRyYXJ5LmdldF9hcnJheV9vZl9zdHJpbmcoMiAqIEZGSS50eXBlX3NpemUoOnBvaW50ZXIpLCAzKSkudG8gZXEoWyJiYXoiLCAidGVzdGluZyIsICJmZmkiXSkKKyAgZW5kCisKKyAgaXQgInJhaXNlcyBhbiBJbmRleEVycm9yIHdoZW4gdHJ5aW5nIHRvIHJlYWQgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvdXQgb2YgYm91bmRzIiBkbworICAgIHN0cmluZ3MgPSBbImZvbyIsICJiYXIiLCAiYmF6IiwgInRlc3RpbmciLCAiZmZpIl0KKyAgICBwdHJhcnkgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpwb2ludGVyLCA1KQorICAgIGFyeSA9IHN0cmluZ3MuaW5qZWN0KFtdKSBkbyB8YSwgc3RyfAorICAgICAgZiA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoMTAyNCkKKyAgICAgIGYucHV0X3N0cmluZygwLCBzdHIpCisgICAgICBhIDw8IGYKKyAgICBlbmQKKyAgICBwdHJhcnkud3JpdGVfYXJyYXlfb2ZfcG9pbnRlcihhcnkpCisgICAgZXhwZWN0IHsgcHRyYXJ5LmdldF9hcnJheV9vZl9zdHJpbmcoMCwgNikgfS50byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAicmFpc2VzIGFuIEluZGV4RXJyb3Igd2hlbiB0cnlpbmcgdG8gcmVhZCBhbiBhcnJheSBvZiBzdHJpbmdzIHVzaW5nIGEgbmVnYXRpdmUgb2Zmc2V0IiBkbworICAgIHN0cmluZ3MgPSBbImZvbyIsICJiYXIiLCAiYmF6IiwgInRlc3RpbmciLCAiZmZpIl0KKyAgICBwdHJhcnkgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpwb2ludGVyLCA1KQorICAgIGFyeSA9IHN0cmluZ3MuaW5qZWN0KFtdKSBkbyB8YSwgc3RyfAorICAgICAgZiA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcoMTAyNCkKKyAgICAgIGYucHV0X3N0cmluZygwLCBzdHIpCisgICAgICBhIDw8IGYKKyAgICBlbmQKKyAgICBwdHJhcnkud3JpdGVfYXJyYXlfb2ZfcG9pbnRlcihhcnkpCisgICAgZXhwZWN0IHsgcHRyYXJ5LmdldF9hcnJheV9vZl9zdHJpbmcoLTEpIH0udG8gcmFpc2VfZXJyb3IKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvc3RycHRyX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3N0cnB0cl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDAwZjQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3N0cnB0cl9zcGVjLnJiCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2Rlc2NyaWJlICJmdW5jdGlvbnMgcmV0dXJuaW5nIDpzdHJwdHIiIGRvCisKKyAgaXQgImNhbiBhdHRhY2ggZnVuY3Rpb24gd2l0aCA6c3RycHRyIHJldHVybiB0eXBlIiBkbworICAgIGV4cGVjdCBkbworICAgICAgTW9kdWxlLm5ldyBkbworICAgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICAgIGZmaV9saWIgRkZJOjpMaWJyYXJ5OjpMSUJDCisgICAgICAgIGlmICFGRkk6OlBsYXRmb3JtLndpbmRvd3M/CisgICAgICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJkdXAsIFsgOnN0cmluZyBdLCA6c3RycHRyCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOl9zdHJkdXAsIFsgOnN0cmluZyBdLCA6c3RycHRyCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kLm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKKworICBtb2R1bGUgU3RyUHRyCisgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgIGZmaV9saWIgRkZJOjpMaWJyYXJ5OjpMSUJDCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpmcmVlLCBbIDpwb2ludGVyIF0sIDp2b2lkCisgICAgaWYgIUZGSTo6UGxhdGZvcm0ud2luZG93cz8KKyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RyZHVwLCBbIDpzdHJpbmcgXSwgOnN0cnB0cgorICAgIGVsc2UKKyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RyZHVwLCA6X3N0cmR1cCwgWyA6c3RyaW5nIF0sIDpzdHJwdHIKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgInNob3VsZCByZXR1cm4gWyBTdHJpbmcsIFBvaW50ZXIgXSIgZG8KKyAgICByZXN1bHQgPSBTdHJQdHIuc3RyZHVwKCJ0ZXN0IikKKyAgICBleHBlY3QocmVzdWx0WzBdLmlzX2E/KFN0cmluZykpLnRvIGJlIHRydWUKKyAgICBleHBlY3QocmVzdWx0WzFdLmlzX2E/KEZGSTo6UG9pbnRlcikpLnRvIGJlIHRydWUKKyAgZW5kCisKKyAgaXQgInNob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUiIGRvCisgICAgcmVzdWx0ID0gU3RyUHRyLnN0cmR1cCgidGVzdCIpCisgICAgZXhwZWN0KHJlc3VsdFswXSkudG8gZXEoInRlc3QiKQorICBlbmQKKworICBpdCAic2hvdWxkIHJldHVybiBub24tTlVMTCBwb2ludGVyIiBkbworICAgIHJlc3VsdCA9IFN0clB0ci5zdHJkdXAoInRlc3QiKQorICAgIGV4cGVjdChyZXN1bHRbMV0pLm5vdF90byBiZV9udWxsCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3N0cnVjdF9ieV9yZWZfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvc3RydWN0X2J5X3JlZl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NTg0MjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3N0cnVjdF9ieV9yZWZfc3BlYy5yYgpAQCAtMCwwICsxLDQzIEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitkZXNjcmliZSBGRkk6OlN0cnVjdCwgJyBieV9yZWYnIGRvCisgIGJlZm9yZSA6YWxsIGRvCisgICAgQHN0cnVjdF9jbGFzcyA9IHN0cnVjdF9jbGFzcyA9IENsYXNzLm5ldyhGRkk6OlN0cnVjdCkgZG8KKyAgICAgIGxheW91dCA6YSwgOnBvaW50ZXIKKyAgICBlbmQKKworICAgIEBhcGkgPSBNb2R1bGUubmV3IGRvCisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICBmbiA9IEZGSTo6VHlwZTo6UE9JTlRFUi5zaXplID09IEZGSTo6VHlwZTo6TE9ORy5zaXplID8gOnJldF91bG9uZyA6IDpyZXRfdTY0CisgICAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF90ZXN0LCBmbiwgWyBzdHJ1Y3RfY2xhc3MuYnlfcmVmIF0sIDpwb2ludGVyCisgICAgZW5kCisgIGVuZAorCisgIGl0ICJzaG91bGQgYWNjZXB0IGluc3RhbmNlcyBvZiBleGFjdCBzdHJ1Y3QgY2xhc3MiIGRvCisgICAgcyA9IEBzdHJ1Y3RfY2xhc3MubmV3CisgICAgZXhwZWN0KEBhcGkuc3RydWN0X3Rlc3QocykpLnRvIGVxKHMucG9pbnRlcikKKyAgZW5kCisKKyAgaXQgInNob3VsZCBhY2NlcHQgbmlsIiBkbworICAgIGV4cGVjdChAYXBpLnN0cnVjdF90ZXN0KG5pbCkpLnRvIGJlX251bGwKKyAgZW5kCisKKyAgaXQgInNob3VsZCByZWplY3Qgb3RoZXIgdHlwZXMiIGRvCisgICAgZXhwZWN0IHsgZXhwZWN0KEBhcGkuc3RydWN0X3Rlc3QoJ3Rlc3QnKSkudG8gYmVfbmlsIH0udG8gcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICBlbmQKKworICBpdCAic2hvdWxkIHJlamVjdCBpbnN0YW5jZXMgb2Ygb3RoZXIgc3RydWN0IGNsYXNzZXMiIGRvCisgICAgb3RoZXJfY2xhc3MgPSBDbGFzcy5uZXcoRkZJOjpTdHJ1Y3QpIGRvCisgICAgICBsYXlvdXQgOmEsIDpwb2ludGVyCisgICAgZW5kCisKKyAgICBleHBlY3QgeyBAYXBpLnN0cnVjdF90ZXN0KG90aGVyX2NsYXNzLm5ldykgfS50byByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgIGVuZAorZW5kCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvc3RydWN0X2NhbGxiYWNrX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3N0cnVjdF9jYWxsYmFja19zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWIzMDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3N0cnVjdF9jYWxsYmFja19zcGVjLnJiCkBAIC0wLDAgKzEsNjkgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2Rlc2NyaWJlIEZGSTo6U3RydWN0LCAnIHdpdGggaW5saW5lIGNhbGxiYWNrIGZ1bmN0aW9ucycgZG8KKyAgaXQgJ3Nob3VsZCBiZSBhYmxlIHRvIGRlZmluZSBpbmxpbmUgY2FsbGJhY2sgZmllbGQnIGRvCisgICAgZXhwZWN0KG1vZHVsZSBDYWxsYmFja01lbWJlcjEKKyAgICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAgIERVTU1ZX0NCID0gY2FsbGJhY2sgOmR1bW15X2NiLCBbIDppbnQgXSwgOmludAorICAgICAgY2xhc3MgVGVzdFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICAgIGxheW91dCBcCisgICAgICAgICAgOmFkZCwgY2FsbGJhY2soWyA6aW50LCA6aW50IF0sIDppbnQpLAorICAgICAgICAgIDpzdWIsIGNhbGxiYWNrKFsgOmludCwgOmludCBdLCA6aW50KSwKKyAgICAgICAgICA6Y2Jfd2l0aF9jYl9wYXJhbWV0ZXIsIGNhbGxiYWNrKFsgRFVNTVlfQ0IsIDppbnQgXSwgOmludCkKKyAgICAgIGVuZAorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfY2FsbF9hZGRfY2IsIFtUZXN0U3RydWN0LCA6aW50LCA6aW50XSwgOmludAorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfY2FsbF9zdWJfY2IsIFtUZXN0U3RydWN0LCA6aW50LCA6aW50XSwgOmludAorICAgIGVuZCkudG8gYmVfYW5faW5zdGFuY2Vfb2YgRkZJOjpGdW5jdGlvbgorICBlbmQKKworICBpdCAnc2hvdWxkIHRha2UgbWV0aG9kcyBhcyBjYWxsYmFja3MnIGRvCisgICAgbW9kdWxlIENhbGxiYWNrTWVtYmVyMgorICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgICAgY2xhc3MgVGVzdFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICAgIGxheW91dCBcCisgICAgICAgICAgOmFkZCwgY2FsbGJhY2soWyA6aW50LCA6aW50IF0sIDppbnQpLAorICAgICAgICAgIDpzdWIsIGNhbGxiYWNrKFsgOmludCwgOmludCBdLCA6aW50KQorICAgICAgZW5kCisgICAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9jYWxsX2FkZF9jYiwgW1Rlc3RTdHJ1Y3QsIDppbnQsIDppbnRdLCA6aW50CisgICAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9jYWxsX3N1Yl9jYiwgW1Rlc3RTdHJ1Y3QsIDppbnQsIDppbnRdLCA6aW50CisgICAgZW5kCisgICAgbW9kdWxlIFN0cnVjdENhbGxiYWNrcworICAgICAgZGVmIHNlbGYuYWRkIGEsIGIKKyAgICAgICAgYStiCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHRzID0gQ2FsbGJhY2tNZW1iZXIyOjpUZXN0U3RydWN0Lm5ldworICAgIHRzWzphZGRdID0gU3RydWN0Q2FsbGJhY2tzLm1ldGhvZCg6YWRkKQorCisgICAgZXhwZWN0KENhbGxiYWNrTWVtYmVyMi5zdHJ1Y3RfY2FsbF9hZGRfY2IodHMsIDEsIDIpKS50byBlcSgzKQorICBlbmQKKworICBpdCAnc2hvdWxkIHJldHVybiBjYWxsYWJsZSBvYmplY3QgZnJvbSBbXScgZG8KKyAgICBtb2R1bGUgQ2FsbGJhY2tNZW1iZXIzCisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICBjbGFzcyBUZXN0U3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgICAgbGF5b3V0IFwKKyAgICAgICAgICA6YWRkLCBjYWxsYmFjayhbIDppbnQsIDppbnQgXSwgOmludCksCisgICAgICAgICAgOnN1YiwgY2FsbGJhY2soWyA6aW50LCA6aW50IF0sIDppbnQpCisgICAgICBlbmQKKyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RydWN0X2NhbGxfYWRkX2NiLCBbVGVzdFN0cnVjdCwgOmludCwgOmludF0sIDppbnQKKyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RydWN0X2NhbGxfc3ViX2NiLCBbVGVzdFN0cnVjdCwgOmludCwgOmludF0sIDppbnQKKyAgICBlbmQKKworICAgIHMgPSBDYWxsYmFja01lbWJlcjM6OlRlc3RTdHJ1Y3QubmV3CisgICAgYWRkID0gUHJvYy5uZXcgeyB8YSxifCBhK2J9CisgICAgc1s6YWRkXSA9IGFkZAorICAgIGZuID0gc1s6YWRkXQorICAgIGV4cGVjdChmbi5yZXNwb25kX3RvPyg6Y2FsbCkpLnRvIGJlIHRydWUKKyAgICBleHBlY3QoZm4uY2FsbCgxLCAyKSkudG8gZXEoMykKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvc3RydWN0X2luaXRpYWxpemVfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvc3RydWN0X2luaXRpYWxpemVfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIyNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9zdHJ1Y3RfaW5pdGlhbGl6ZV9zcGVjLnJiCkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcnVieS1mZmkuCisjIEZvciBsaWNlbnNpbmcsIHNlZSBMSUNFTlNFLlNQRUNTCisjCisKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgInNwZWNfaGVscGVyIikpCisKK2Rlc2NyaWJlIEZGSTo6U3RydWN0LCAnIHdpdGggYW4gaW5pdGlhbGl6ZSBmdW5jdGlvbicgZG8KKyAgaXQgInNob3VsZCBjYWxsIHRoZSBpbml0aWFsaXplIGZ1bmN0aW9uIiBkbworICAgIGNsYXNzIFN0cnVjdFdpdGhJbml0aWFsaXplIDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6c3RyaW5nLCA6c3RyaW5nCisgICAgICBhdHRyX2FjY2Vzc29yIDptYWdpYworICAgICAgZGVmIGluaXRpYWxpemUKKyAgICAgICAgc3VwZXIKKyAgICAgICAgc2VsZi5tYWdpYyA9IDQyCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBleHBlY3QoU3RydWN0V2l0aEluaXRpYWxpemUubmV3Lm1hZ2ljKS50byBlcSg0MikKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgRkZJOjpNYW5hZ2VkU3RydWN0LCAnIHdpdGggYW4gaW5pdGlhbGl6ZSBmdW5jdGlvbicgZG8KKyAgaXQgInNob3VsZCBjYWxsIHRoZSBpbml0aWFsaXplIGZ1bmN0aW9uIiBkbworICAgIGNsYXNzIE1hbmFnZWRTdHJ1Y3RXaXRoSW5pdGlhbGl6ZSA8IEZGSTo6TWFuYWdlZFN0cnVjdAorICAgICAgbGF5b3V0IDpzdHJpbmcsIDpzdHJpbmcKKyAgICAgIGF0dHJfYWNjZXNzb3IgOm1hZ2ljCisgICAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgICBzdXBlciBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KDpwb2ludGVyKS5wdXRfaW50KDAsIDB4MTIzNCkuZ2V0X3BvaW50ZXIoMCkKKyAgICAgICAgc2VsZi5tYWdpYyA9IDQyCisgICAgICBlbmQKKyAgICAgIGRlZiBzZWxmLnJlbGVhc2U7ZW5kCisgICAgZW5kCisgICAgZXhwZWN0KE1hbmFnZWRTdHJ1Y3RXaXRoSW5pdGlhbGl6ZS5uZXcubWFnaWMpLnRvIGVxKDQyKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9zdHJ1Y3RfcGFja2VkX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3N0cnVjdF9wYWNrZWRfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTMyYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9zdHJ1Y3RfcGFja2VkX3NwZWMucmIKQEAgLTAsMCArMSw1MCBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKworZGVzY3JpYmUgRkZJOjpTdHJ1Y3QgZG8KKyAgaXQgInBhY2tlZCA6Y2hhciBmb2xsb3dlZCBieSA6aW50IHNob3VsZCBoYXZlIHNpemUgb2YgNSIgZG8KKyAgICBleHBlY3QoQ2xhc3MubmV3KEZGSTo6U3RydWN0KSBkbworICAgICAgcGFja2VkCisgICAgICBsYXlvdXQgOmMsIDpjaGFyLCA6aSwgOmludAorICAgIGVuZC5zaXplKS50byBlcSg1KQorICBlbmQKKworICBpdCAicGFja2VkIDpjaGFyIGZvbGxvd2VkIGJ5IDppbnQgc2hvdWxkIGhhdmUgYWxpZ25tZW50IG9mIDEiIGRvCisgICAgZXhwZWN0KENsYXNzLm5ldyhGRkk6OlN0cnVjdCkgZG8KKyAgICAgIHBhY2tlZAorICAgICAgbGF5b3V0IDpjLCA6Y2hhciwgOmksIDppbnQKKyAgICBlbmQuYWxpZ25tZW50KS50byBlcSgxKQorICBlbmQKKworICBpdCAicGFja2VkKDIpIDpjaGFyIGZvbGxvd2VkIGJ5IDppbnQgc2hvdWxkIGhhdmUgc2l6ZSBvZiA2IiBkbworICAgIGV4cGVjdChDbGFzcy5uZXcoRkZJOjpTdHJ1Y3QpIGRvCisgICAgICBwYWNrZWQgMgorICAgICAgbGF5b3V0IDpjLCA6Y2hhciwgOmksIDppbnQKKyAgICBlbmQuc2l6ZSkudG8gZXEoNikKKyAgZW5kCisKKyAgaXQgInBhY2tlZCgyKSAgOmNoYXIgZm9sbG93ZWQgYnkgOmludCBzaG91bGQgaGF2ZSBhbGlnbm1lbnQgb2YgMiIgZG8KKyAgICBleHBlY3QoQ2xhc3MubmV3KEZGSTo6U3RydWN0KSBkbworICAgICAgcGFja2VkIDIKKyAgICAgIGxheW91dCA6YywgOmNoYXIsIDppLCA6aW50CisgICAgZW5kLmFsaWdubWVudCkudG8gZXEoMikKKyAgZW5kCisKKyAgaXQgInBhY2tlZCA6c2hvcnQgZm9sbG93ZWQgYnkgaW50IHNob3VsZCBoYXZlIHNpemUgb2YgNiIgZG8KKyAgICBleHBlY3QoQ2xhc3MubmV3KEZGSTo6U3RydWN0KSBkbworICAgICAgcGFja2VkCisgICAgICBsYXlvdXQgOnMsIDpzaG9ydCwgOmksIDppbnQKKyAgICBlbmQuc2l6ZSkudG8gZXEoNikKKyAgZW5kCisKKyAgaXQgInBhY2tlZCA6c2hvcnQgZm9sbG93ZWQgYnkgaW50IHNob3VsZCBoYXZlIGFsaWdubWVudCBvZiAxIiBkbworICAgIGV4cGVjdChDbGFzcy5uZXcoRkZJOjpTdHJ1Y3QpIGRvCisgICAgICBwYWNrZWQKKyAgICAgIGxheW91dCA6cywgOnNob3J0LCA6aSwgOmludAorICAgIGVuZC5hbGlnbm1lbnQpLnRvIGVxKDEpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3N0cnVjdF9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9zdHJ1Y3Rfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTEwZDkyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS9zdHJ1Y3Rfc3BlYy5yYgpAQCAtMCwwICsxLDg4NiBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKKworZGVzY3JpYmUgIlN0cnVjdCBhbGlnbnMgZmllbGRzIGNvcnJlY3RseSIgZG8KKyAgaXQgImNoYXIsIGZvbGxvd2VkIGJ5IGFuIGludCIgZG8KKyAgICBwZW5kaW5nKCJub3Qgc3VwcG9ydGVkIGluIDEuOCIpIGlmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjhcLi4qLworICAgIGNsYXNzIENJU3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6YyA9PiA6Y2hhciwgOmkgPT4gOmludAorICAgIGVuZAorICAgIGV4cGVjdChDSVN0cnVjdC5zaXplKS50byBlcSg4KQorICBlbmQKKworICBpdCAic2hvcnQsIGZvbGxvd2VkIGJ5IGFuIGludCIgZG8KKyAgICBwZW5kaW5nKCJub3Qgc3VwcG9ydGVkIGluIDEuOCIpIGlmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjhcLi4qLworICAgIGNsYXNzIFNJU3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6cyA9PiA6c2hvcnQsIDppID0+IDppbnQKKyAgICBlbmQKKyAgICBleHBlY3QoU0lTdHJ1Y3Quc2l6ZSkudG8gZXEoOCkKKyAgZW5kCisKKyAgaXQgImludCwgZm9sbG93ZWQgYnkgYW4gaW50IiBkbworICAgIHBlbmRpbmcoIm5vdCBzdXBwb3J0ZWQgaW4gMS44IikgaWYgUlVCWV9WRVJTSU9OID1+IC9eMVwuOFwuLiovCisgICAgY2xhc3MgSUlTdHJ1Y3QgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDppMSA9PiA6aW50LCA6aSA9PiA6aW50CisgICAgZW5kCisgICAgZXhwZWN0KElJU3RydWN0LnNpemUpLnRvIGVxKDgpCisgIGVuZAorCisgIGl0ICJsb25nIGxvbmcsIGZvbGxvd2VkIGJ5IGFuIGludCIgZG8KKyAgICBwZW5kaW5nKCJub3Qgc3VwcG9ydGVkIGluIDEuOCIpIGlmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjhcLi4qLworICAgIGNsYXNzIExMSVN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmwgPT4gOmxvbmdfbG9uZywgOmkgPT4gOmludAorICAgIGVuZAorICAgIGV4cGVjdChMTElTdHJ1Y3Quc2l6ZSkudG8gZXEoRkZJOjpUWVBFX1VJTlQ2NC5hbGlnbm1lbnQgPT0gNCA/IDEyIDogMTYpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlICJTdHJ1Y3QgdGVzdHMiIGRvCisgIFN0cnVjdFR5cGVzID0geworICAgICdzOCcgPT4gOmNoYXIsCisgICAgJ3MxNicgPT4gOnNob3J0LAorICAgICdzMzInID0+IDppbnQsCisgICAgJ3M2NCcgPT4gOmxvbmdfbG9uZywKKyAgICAnbG9uZycgPT4gOmxvbmcsCisgICAgJ2YzMicgPT4gOmZsb2F0LAorICAgICdmNjQnID0+IDpkb3VibGUKKyAgfQorICBtb2R1bGUgTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgYXR0YWNoX2Z1bmN0aW9uIDpwdHJfcmV0X3BvaW50ZXIsIFsgOnBvaW50ZXIsIDppbnRdLCA6c3RyaW5nCisgICAgYmVnaW4KKyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX3JldF9pbnQzMl90LCBbIDpwb2ludGVyLCA6aW50IF0sIDppbnQKKyAgICByZXNjdWUgRkZJOjpOb3RGb3VuZEVycm9yCisgICAgICAjIE5ldEJTRCB1c2VzICNkZWZpbmUgaW5zdGVhZCBvZiB0eXBlZGVmIGZvciB0aGVzZQorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpwdHJfcmV0X2ludDMyX3QsIDpwdHJfcmV0X19faW50MzJfdCwgWyA6cG9pbnRlciwgOmludCBdLCA6aW50CisgICAgZW5kCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpwdHJfZnJvbV9hZGRyZXNzLCBbIDp1bG9uZyBdLCA6cG9pbnRlcgorICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RyaW5nX2VxdWFscywgWyA6c3RyaW5nLCA6c3RyaW5nIF0sIDppbnQKKyAgICBbICdzOCcsICdzMTYnLCAnczMyJywgJ3M2NCcsICdmMzInLCAnZjY0JywgJ2xvbmcnIF0uZWFjaCBkbyB8dHwKKyAgICAgIGF0dGFjaF9mdW5jdGlvbiAic3RydWN0X2FsaWduXyN7dH0iLCBbIDpwb2ludGVyIF0sIFN0cnVjdFR5cGVzW3RdCisgICAgZW5kCisgIGVuZAorICBjbGFzcyBQb2ludGVyTWVtYmVyIDwgRkZJOjpTdHJ1Y3QKKyAgICBsYXlvdXQgOnBvaW50ZXIsIDpwb2ludGVyCisgIGVuZAorICBjbGFzcyBTdHJpbmdNZW1iZXIgPCBGRkk6OlN0cnVjdAorICAgIGxheW91dCA6c3RyaW5nLCA6c3RyaW5nCisgIGVuZAorCisgIGl0ICJTdHJ1Y3QjWzpwb2ludGVyXSIgZG8KKyAgICBtYWdpYyA9IDB4MTIzNDU2NzgKKyAgICBtcCA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcgOmxvbmcKKyAgICBtcC5wdXRfbG9uZygwLCBtYWdpYykKKyAgICBzbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpwb2ludGVyCisgICAgc21wLnB1dF9wb2ludGVyKDAsIG1wKQorICAgIHMgPSBQb2ludGVyTWVtYmVyLm5ldyBzbXAKKyAgICBleHBlY3Qoc1s6cG9pbnRlcl0pLnRvIGVxKG1wKQorICBlbmQKKworICBpdCAiU3RydWN0I1s6cG9pbnRlcl0ubmlsPyBmb3IgTlVMTCB2YWx1ZSIgZG8KKyAgICBtYWdpYyA9IDB4MTIzNDU2NzgKKyAgICBtcCA9IEZGSTo6TWVtb3J5UG9pbnRlci5uZXcgOmxvbmcKKyAgICBtcC5wdXRfbG9uZygwLCBtYWdpYykKKyAgICBzbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpwb2ludGVyCisgICAgc21wLnB1dF9wb2ludGVyKDAsIG5pbCkKKyAgICBzID0gUG9pbnRlck1lbWJlci5uZXcgc21wCisgICAgZXhwZWN0KHNbOnBvaW50ZXJdLm51bGw/KS50byBiZSB0cnVlCisgIGVuZAorCisgIGl0ICJTdHJ1Y3QjWzpwb2ludGVyXT0iIGRvCisgICAgbWFnaWMgPSAweDEyMzQ1Njc4CisgICAgbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpsb25nCisgICAgbXAucHV0X2xvbmcoMCwgbWFnaWMpCisgICAgc21wID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyA6cG9pbnRlcgorICAgIHMgPSBQb2ludGVyTWVtYmVyLm5ldyBzbXAKKyAgICBzWzpwb2ludGVyXSA9IG1wCisgICAgZXhwZWN0KHNtcC5nZXRfcG9pbnRlcigwKSkudG8gZXEobXApCisgIGVuZAorCisgIGl0ICJTdHJ1Y3QjWzpwb2ludGVyXT1zdHJ1Y3QiIGRvCisgICAgc21wID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyA6cG9pbnRlcgorICAgIHMgPSBQb2ludGVyTWVtYmVyLm5ldyBzbXAKKyAgICBleHBlY3QgeyBzWzpwb2ludGVyXSA9IHMgfS5ub3RfdG8gcmFpc2VfZXJyb3IgRXhjZXB0aW9uCisgICAgZXhwZWN0IHsgc1s6cG9pbnRlcl0ubmlsPyB9Lm5vdF90byByYWlzZV9lcnJvciBFeGNlcHRpb24KKyAgZW5kCisKKyAgaXQgIlN0cnVjdCNbOnBvaW50ZXJdPW5pbCIgZG8KKyAgICBzbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpwb2ludGVyCisgICAgcyA9IFBvaW50ZXJNZW1iZXIubmV3IHNtcAorICAgIHNbOnBvaW50ZXJdID0gbmlsCisgICAgZXhwZWN0KHNtcC5nZXRfcG9pbnRlcigwKSkudG8gYmVfbnVsbAorICBlbmQKKworICBpdCAiU3RydWN0I1s6c3RyaW5nXSIgZG8KKyAgICBtYWdpYyA9ICJ0ZXN0IgorICAgIG1wID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyAxMDI0CisgICAgbXAucHV0X3N0cmluZygwLCBtYWdpYykKKyAgICBzbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpwb2ludGVyCisgICAgc21wLnB1dF9wb2ludGVyKDAsIG1wKQorICAgIHMgPSBTdHJpbmdNZW1iZXIubmV3IHNtcAorICAgIGV4cGVjdChzWzpzdHJpbmddKS50byBlcShtYWdpYykKKyAgZW5kCisKKyAgaXQgIlN0cnVjdCNbOnN0cmluZ10ubmlsPyBmb3IgTlVMTCB2YWx1ZSIgZG8KKyAgICBzbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3IDpwb2ludGVyCisgICAgc21wLnB1dF9wb2ludGVyKDAsIG5pbCkKKyAgICBzID0gU3RyaW5nTWVtYmVyLm5ldyBzbXAKKyAgICBleHBlY3Qoc1s6c3RyaW5nXSkudG8gYmVfbmlsCisgIGVuZAorCisgIGl0ICJTdHJ1Y3QjbGF5b3V0IHdvcmtzIHdpdGggOm5hbWUsIDp0eXBlIHBhaXJzIiBkbworICAgIGNsYXNzIFBhaXJMYXlvdXQgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDphLCA6aW50LCA6YiwgOmxvbmdfbG9uZworICAgIGVuZAorICAgIGxsX29mZiA9IChGRkk6OlRZUEVfVUlOVDY0LmFsaWdubWVudCA9PSA0ID8gNCA6IDgpCisgICAgZXhwZWN0KFBhaXJMYXlvdXQuc2l6ZSkudG8gZXEoKGxsX29mZiArIDgpKQorICAgIG1wID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyhQYWlyTGF5b3V0LnNpemUpCisgICAgcyA9IFBhaXJMYXlvdXQubmV3IG1wCisgICAgc1s6YV0gPSAweDEyMzQ1Njc4CisgICAgZXhwZWN0KG1wLmdldF9pbnQoMCkpLnRvIGVxKDB4MTIzNDU2NzgpCisgICAgc1s6Yl0gPSAweGZlZTFkZWFkYmVlZgorICAgIGV4cGVjdChtcC5nZXRfaW50NjQobGxfb2ZmKSkudG8gZXEoMHhmZWUxZGVhZGJlZWYpCisgIGVuZAorCisgIGl0ICJTdHJ1Y3QjbGF5b3V0IHdvcmtzIHdpdGggOm5hbWUsIDp0eXBlLCBvZmZzZXQgdHVwbGVzIiBkbworICAgIGNsYXNzIFBhaXJMYXlvdXQgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDphLCA6aW50LCAwLCA6YiwgOmxvbmdfbG9uZywgNAorICAgIGVuZAorICAgIGV4cGVjdChQYWlyTGF5b3V0LnNpemUpLnRvIGVxKChGRkk6OlRZUEVfVUlOVDY0LmFsaWdubWVudCA9PSA0ID8gMTIgOiAxNikpCisgICAgbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KFBhaXJMYXlvdXQuc2l6ZSkKKyAgICBzID0gUGFpckxheW91dC5uZXcgbXAKKyAgICBzWzphXSA9IDB4MTIzNDU2NzgKKyAgICBleHBlY3QobXAuZ2V0X2ludCgwKSkudG8gZXEoMHgxMjM0NTY3OCkKKyAgICBzWzpiXSA9IDB4ZmVlMWRlYWRiZWVmCisgICAgZXhwZWN0KG1wLmdldF9pbnQ2NCg0KSkudG8gZXEoMHhmZWUxZGVhZGJlZWYpCisgIGVuZAorCisgIGl0ICJTdHJ1Y3QjbGF5b3V0IHdvcmtzIHdpdGggbWl4ZWQgOm5hbWUsOnR5cGUgYW5kIDpuYW1lLDp0eXBlLG9mZnNldCIgZG8KKyAgICBjbGFzcyBNaXhlZExheW91dCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmEsIDppbnQsIDpiLCA6bG9uZ19sb25nLCA0CisgICAgZW5kCisgICAgZXhwZWN0KE1peGVkTGF5b3V0LnNpemUpLnRvIGVxKChGRkk6OlRZUEVfVUlOVDY0LmFsaWdubWVudCA9PSA0ID8gMTIgOiAxNikpCisgICAgbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KE1peGVkTGF5b3V0LnNpemUpCisgICAgcyA9IE1peGVkTGF5b3V0Lm5ldyBtcAorICAgIHNbOmFdID0gMHgxMjM0NTY3OAorICAgIGV4cGVjdChtcC5nZXRfaW50KDApKS50byBlcSgweDEyMzQ1Njc4KQorICAgIHNbOmJdID0gMHhmZWUxZGVhZGJlZWYKKyAgICBleHBlY3QobXAuZ2V0X2ludDY0KDQpKS50byBlcSgweGZlZTFkZWFkYmVlZikKKyAgZW5kCisKKyAgcmJfbWFqLCByYl9taW4gPSBSVUJZX1ZFUlNJT04uc3BsaXQoJy4nKQorICBpZiByYl9tYWoudG9faSA+PSAxICYmIHJiX21pbi50b19pID49IDkgfHwgUlVCWV9QTEFURk9STSA9fiAvamF2YS8KKyAgICBpdCAiU3RydWN0I2xheW91dCB3aXRocyB3aXRoIGEgaGFzaCBvZiA6bmFtZSA9PiB0eXBlIiBkbworICAgICAgY2xhc3MgSGFzaExheW91dCA8IEZGSTo6U3RydWN0CisgICAgICAgIGxheW91dCA6YSA9PiA6aW50LCA6YiA9PiA6bG9uZ19sb25nCisgICAgICBlbmQKKyAgICAgIGxsX29mZiA9IChGRkk6OlRZUEVfVUlOVDY0LmFsaWdubWVudCA9PSA0ID8gNCA6IDgpCisgICAgICBleHBlY3QoSGFzaExheW91dC5zaXplKS50byBlcShsbF9vZmYgKyA4KQorICAgICAgbXAgPSBGRkk6Ok1lbW9yeVBvaW50ZXIubmV3KEhhc2hMYXlvdXQuc2l6ZSkKKyAgICAgIHMgPSBIYXNoTGF5b3V0Lm5ldyBtcAorICAgICAgc1s6YV0gPSAweDEyMzQ1Njc4CisgICAgICBleHBlY3QobXAuZ2V0X2ludCgwKSkudG8gZXEoMHgxMjM0NTY3OCkKKyAgICAgIHNbOmJdID0gMHhmZWUxZGVhZGJlZWYKKyAgICAgIGV4cGVjdChtcC5nZXRfaW50NjQobGxfb2ZmKSkudG8gZXEoMHhmZWUxZGVhZGJlZWYpCisgICAgZW5kCisgIGVuZAorCisgIGl0ICJzdWJjbGFzcyBvdmVycmlkZXMgaW5pdGlhbGl6ZSB3aXRob3V0IGNhbGxpbmcgc3VwZXIiIGRvCisgICAgY2xhc3MgSW5pdGlhbGl6ZVdpdGhvdXRTdXBlciA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmEsIDppbnQsIDpiLCA6bG9uZ19sb25nLCA6ZCwgWzpkb3VibGUsIDJdCisKKyAgICAgIGRlZiBpbml0aWFsaXplKGEsIGIpCisgICAgICAgIHNlbGZbOmFdID0gYQorICAgICAgICBzZWxmWzpiXSA9IGIKKyAgICAgICAgc2VsZls6ZF1bMF0gPSAxLjIKKyAgICAgICAgc2VsZls6ZF1bMV0gPSAzLjQKKyAgICAgIGVuZAorCisgICAgZW5kCisgICAgcyA9IEluaXRpYWxpemVXaXRob3V0U3VwZXIubmV3KDB4MWVlZmJlZWYsIDB4ZGVhZGNhZmViYWJlKQorICAgIGV4cGVjdChzWzphXSkudG8gZXEoMHgxZWVmYmVlZikKKyAgICBleHBlY3Qoc1s6Yl0pLnRvIGVxKDB4ZGVhZGNhZmViYWJlKQorICBlbmQKKworICBpdCAiQ2FuIHVzZSBTdHJ1Y3Qgc3ViY2xhc3MgYXMgcGFyYW1ldGVyIHR5cGUiIGRvCisgICAgZXhwZWN0KG1vZHVsZSBTdHJ1Y3RQYXJhbQorICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgICAgY2xhc3MgVGVzdFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICAgIGxheW91dCA6YywgOmNoYXIKKyAgICAgIGVuZAorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfZmllbGRfczgsIFsgVGVzdFN0cnVjdC5pbiBdLCA6Y2hhcgorICAgIGVuZCkudG8gYmVfYW5faW5zdGFuY2Vfb2YgRkZJOjpGdW5jdGlvbgorICBlbmQKKworICBpdCAiQ2FuIHVzZSBTdHJ1Y3Qgc3ViY2xhc3MgYXMgSU4gcGFyYW1ldGVyIHR5cGUiIGRvCisgICAgZXhwZWN0KG1vZHVsZSBTdHJ1Y3RQYXJhbTIKKyAgICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICAgIGNsYXNzIFRlc3RTdHJ1Y3QgPCBGRkk6OlN0cnVjdAorICAgICAgICBsYXlvdXQgOmMsIDpjaGFyCisgICAgICBlbmQKKyAgICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RydWN0X2ZpZWxkX3M4LCBbIFRlc3RTdHJ1Y3QuaW4gXSwgOmNoYXIKKyAgICBlbmQpLnRvIGJlX2FuX2luc3RhbmNlX29mIEZGSTo6RnVuY3Rpb24KKyAgZW5kCisKKyAgaXQgIkNhbiB1c2UgU3RydWN0IHN1YmNsYXNzIGFzIE9VVCBwYXJhbWV0ZXIgdHlwZSIgZG8KKyAgICBleHBlY3QobW9kdWxlIFN0cnVjdFBhcmFtMworICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgICAgY2xhc3MgVGVzdFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICAgIGxheW91dCA6YywgOmNoYXIKKyAgICAgIGVuZAorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfZmllbGRfczgsIFsgVGVzdFN0cnVjdC5vdXQgXSwgOmNoYXIKKyAgICBlbmQpLnRvIGJlX2FuX2luc3RhbmNlX29mIEZGSTo6RnVuY3Rpb24KKyAgZW5kCisKKyAgaXQgImNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgYXMgYSA6cG9pbnRlciBwYXJhbWV0ZXIiIGRvCisgICAgY2xhc3MgVGVzdFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmksIDppbnQKKyAgICBlbmQKKyAgICBzID0gVGVzdFN0cnVjdC5uZXcKKyAgICBzWzppXSA9IDB4MTIKKyAgICBleHBlY3QoTGliVGVzdC5wdHJfcmV0X2ludDMyX3QocywgMCkpLnRvIGVxKDB4MTIpCisgIGVuZAorCisgIGl0ICI6Y2hhciBtZW1iZXIgYWxpZ25lZCBjb3JyZWN0bHkiIGRvCisgICAgY2xhc3MgQWxpZ25DaGFyIDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6YywgOmNoYXIsIDp2LCA6Y2hhcgorICAgIGVuZAorICAgIHMgPSBBbGlnbkNoYXIubmV3CisgICAgc1s6dl0gPSAweDEyCisgICAgZXhwZWN0KExpYlRlc3Quc3RydWN0X2FsaWduX3M4KHMucG9pbnRlcikpLnRvIGVxKDB4MTIpCisgIGVuZAorCisgIGl0ICI6c2hvcnQgbWVtYmVyIGFsaWduZWQgY29ycmVjdGx5IiBkbworICAgIGNsYXNzIEFsaWduU2hvcnQgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDpjLCA6Y2hhciwgOnYsIDpzaG9ydAorICAgIGVuZAorICAgIHMgPSBBbGlnblNob3J0LmFsbG9jX2luCisgICAgc1s6dl0gPSAweDEyMzQKKyAgICBleHBlY3QoTGliVGVzdC5zdHJ1Y3RfYWxpZ25fczE2KHMucG9pbnRlcikpLnRvIGVxKDB4MTIzNCkKKyAgZW5kCisKKyAgaXQgIjppbnQgbWVtYmVyIGFsaWduZWQgY29ycmVjdGx5IiBkbworICAgIGNsYXNzIEFsaWduSW50IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6YywgOmNoYXIsIDp2LCA6aW50CisgICAgZW5kCisgICAgcyA9IEFsaWduSW50LmFsbG9jX2luCisgICAgc1s6dl0gPSAweDEyMzQ1Njc4CisgICAgZXhwZWN0KExpYlRlc3Quc3RydWN0X2FsaWduX3MzMihzLnBvaW50ZXIpKS50byBlcSgweDEyMzQ1Njc4KQorICBlbmQKKworICBpdCAiOmxvbmdfbG9uZyBtZW1iZXIgYWxpZ25lZCBjb3JyZWN0bHkiIGRvCisgICAgY2xhc3MgQWxpZ25Mb25nTG9uZyA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmMsIDpjaGFyLCA6diwgOmxvbmdfbG9uZworICAgIGVuZAorICAgIHMgPSBBbGlnbkxvbmdMb25nLmFsbG9jX2luCisgICAgc1s6dl0gPSAweDEyMzQ1Njc4OWFiY2RlZjAKKyAgICBleHBlY3QoTGliVGVzdC5zdHJ1Y3RfYWxpZ25fczY0KHMucG9pbnRlcikpLnRvIGVxKDB4MTIzNDU2Nzg5YWJjZGVmMCkKKyAgZW5kCisKKyAgaXQgIjpsb25nIG1lbWJlciBhbGlnbmVkIGNvcnJlY3RseSIgZG8KKyAgICBjbGFzcyBBbGlnbkxvbmcgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDpjLCA6Y2hhciwgOnYsIDpsb25nCisgICAgZW5kCisgICAgcyA9IEFsaWduTG9uZy5hbGxvY19pbgorICAgIHNbOnZdID0gMHgxMjM0NTY3OAorICAgIGV4cGVjdChMaWJUZXN0LnN0cnVjdF9hbGlnbl9sb25nKHMucG9pbnRlcikpLnRvIGVxKDB4MTIzNDU2NzgpCisgIGVuZAorCisgIGl0ICI6ZmxvYXQgbWVtYmVyIGFsaWduZWQgY29ycmVjdGx5IiBkbworICAgIGNsYXNzIEFsaWduRmxvYXQgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDpjLCA6Y2hhciwgOnYsIDpmbG9hdAorICAgIGVuZAorICAgIHMgPSBBbGlnbkZsb2F0LmFsbG9jX2luCisgICAgc1s6dl0gPSAxLjIzNDU2CisgICAgZXhwZWN0KChMaWJUZXN0LnN0cnVjdF9hbGlnbl9mMzIocy5wb2ludGVyKSAtIDEuMjM0NTYpLmFicykudG8gYmUgPCAwLjAwMDAxCisgIGVuZAorCisgIGl0ICI6ZG91YmxlIG1lbWJlciBhbGlnbmVkIGNvcnJlY3RseSIgZG8KKyAgICBjbGFzcyBBbGlnbkRvdWJsZSA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmMsIDpjaGFyLCA6diwgOmRvdWJsZQorICAgIGVuZAorICAgIHMgPSBBbGlnbkRvdWJsZS5hbGxvY19pbgorICAgIHNbOnZdID0gMS4yMzQ1Njc4OQorICAgIGV4cGVjdCgoTGliVGVzdC5zdHJ1Y3RfYWxpZ25fZjY0KHMucG9pbnRlcikgLSAxLjIzNDU2Nzg5KS5hYnMpLnRvIGJlIDwgMC4wMDAwMDAwMQorICBlbmQKKworICBpdCAiOnVsb25nLCA6cG9pbnRlciBzdHJ1Y3QiIGRvCisgICAgY2xhc3MgVUxQU3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6dWwsIDp1bG9uZywgOnAsIDpwb2ludGVyCisgICAgZW5kCisgICAgcyA9IFVMUFN0cnVjdC5hbGxvY19pbgorICAgIHNbOnVsXSA9IDB4ZGVhZGJlZWYKKyAgICBzWzpwXSA9IExpYlRlc3QucHRyX2Zyb21fYWRkcmVzcygweDEyMzQ1Njc4KQorICAgIGV4cGVjdChzLnBvaW50ZXIuZ2V0X3Vsb25nKDApKS50byBlcSgweGRlYWRiZWVmKQorICBlbmQKKyAgZGVmIHRlc3RfbnVtX2ZpZWxkKHR5cGUsIHYpCisgICAga2xhc3MgPSBDbGFzcy5uZXcoRkZJOjpTdHJ1Y3QpCisgICAga2xhc3MubGF5b3V0IDp2LCB0eXBlLCA6ZHVtbXksIDpsb25nCisKKyAgICBzID0ga2xhc3MubmV3CisgICAgc1s6dl0gPSB2CisgICAgZXhwZWN0KHMucG9pbnRlci5zZW5kKCJnZXRfI3t0eXBlLnRvX3N9IiwgMCkpLnRvIGVxKHYpCisgICAgcy5wb2ludGVyLnNlbmQoInB1dF8je3R5cGUudG9fc30iLCAwLCAwKQorICAgIGV4cGVjdChzWzp2XSkudG8gZXEoMCkKKyAgZW5kCisgIGRlZiBzZWxmLmludF9maWVsZF90ZXN0KHR5cGUsIHZhbHVlcykKKyAgICB2YWx1ZXMuZWFjaCBkbyB8dnwKKyAgICAgIGl0ICIje3R5cGV9IGZpZWxkIHIvdyAoI3t2LnRvX3MoMTYpfSkiIGRvCisgICAgICAgIHRlc3RfbnVtX2ZpZWxkKHR5cGUsIHYpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisgIGludF9maWVsZF90ZXN0KDpjaGFyLCBbIDAsIDEyNywgLTEyOCwgLTEgXSkKKyAgaW50X2ZpZWxkX3Rlc3QoOnVjaGFyLCBbIDAsIDB4N2YsIDB4ODAsIDB4ZmYgXSkKKyAgaW50X2ZpZWxkX3Rlc3QoOnNob3J0LCBbIDAsIDB4N2ZmZiwgLTB4ODAwMCwgLTEgXSkKKyAgaW50X2ZpZWxkX3Rlc3QoOnVzaG9ydCwgWyAwLCAweDdmZmYsIDB4ODAwMCwgMHhmZmZmIF0pCisgIGludF9maWVsZF90ZXN0KDppbnQsIFsgMCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIC0xIF0pCisgIGludF9maWVsZF90ZXN0KDp1aW50LCBbIDAsIDB4N2ZmZmZmZmYsIDB4ODAwMDAwMDAsIDB4ZmZmZmZmZmYgXSkKKyAgaW50X2ZpZWxkX3Rlc3QoOmxvbmdfbG9uZywgWyAwLCAweDdmZmZmZmZmZmZmZmZmZmYsIC0weDgwMDAwMDAwMDAwMDAwMDAsIC0xIF0pCisgIGludF9maWVsZF90ZXN0KDp1bG9uZ19sb25nLCBbIDAsIDB4N2ZmZmZmZmZmZmZmZmZmZiwgMHg4MDAwMDAwMDAwMDAwMDAwLCAweGZmZmZmZmZmZmZmZmZmZmYgXSkKKyAgaWYgRkZJOjpQbGF0Zm9ybTo6TE9OR19TSVpFID09IDMyCisgICAgaW50X2ZpZWxkX3Rlc3QoOmxvbmcsIFsgMCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIC0xIF0pCisgICAgaW50X2ZpZWxkX3Rlc3QoOnVsb25nLCBbIDAsIDB4N2ZmZmZmZmYsIDB4ODAwMDAwMDAsIDB4ZmZmZmZmZmYgXSkKKyAgZWxzZQorICAgIGludF9maWVsZF90ZXN0KDpsb25nLCBbIDAsIDB4N2ZmZmZmZmZmZmZmZmZmZiwgLTB4ODAwMDAwMDAwMDAwMDAwMCwgLTEgXSkKKyAgICBpbnRfZmllbGRfdGVzdCg6dWxvbmcsIFsgMCwgMHg3ZmZmZmZmZmZmZmZmZmZmLCAweDgwMDAwMDAwMDAwMDAwMDAsIDB4ZmZmZmZmZmZmZmZmZmZmZiBdKQorICBlbmQKKworICBpdCAiOmZsb2F0IGZpZWxkIHIvdyIgZG8KKyAgICBrbGFzcyA9IENsYXNzLm5ldyhGRkk6OlN0cnVjdCkKKyAgICBrbGFzcy5sYXlvdXQgOnYsIDpmbG9hdCwgOmR1bW15LCA6bG9uZworCisgICAgcyA9IGtsYXNzLm5ldworICAgIHZhbHVlID0gMS4yMzQ1NgorICAgIHNbOnZdID0gdmFsdWUKKyAgICBleHBlY3QoKHMucG9pbnRlci5nZXRfZmxvYXQoMCkgLSB2YWx1ZSkuYWJzKS50byBiZSA8IDAuMDAwMQorICBlbmQKKworICBpdCAiOmRvdWJsZSBmaWVsZCByL3ciIGRvCisgICAga2xhc3MgPSBDbGFzcy5uZXcoRkZJOjpTdHJ1Y3QpCisgICAga2xhc3MubGF5b3V0IDp2LCA6ZG91YmxlLCA6ZHVtbXksIDpsb25nCisKKyAgICBzID0ga2xhc3MubmV3CisgICAgdmFsdWUgPSAxLjIzNDU2CisgICAgc1s6dl0gPSB2YWx1ZQorICAgIGV4cGVjdCgocy5wb2ludGVyLmdldF9kb3VibGUoMCkgLSB2YWx1ZSkuYWJzKS50byBiZSA8IDAuMDAwMQorICBlbmQKKyAgbW9kdWxlIEVudW1GaWVsZHMKKyAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgVGVzdEVudW0gPSBlbnVtIDp0ZXN0X2VudW0sIFs6YzEsIDEwLCA6YzIsIDIwLCA6YzMsIDMwLCA6YzQsIDQwXQorICAgIGNsYXNzIFRlc3RTdHJ1Y3QgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDphLCA6aW50LCA6YywgOnRlc3RfZW51bSwKKyAgICAgICAgOmQsIFsgVGVzdEVudW0sIFRlc3RFbnVtLnN5bWJvbHMubGVuZ3RoIF0KKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgIjplbnVtIGZpZWxkIHIvdyIgZG8KKyAgICBzID0gRW51bUZpZWxkczo6VGVzdFN0cnVjdC5uZXcKKyAgICBzWzpjXSA9IDpjMworCisgICAgZXhwZWN0KHMucG9pbnRlci5nZXRfdWludChGRkk6OlR5cGU6OklOVDMyLnNpemUpKS50byBlcSgzMCkKKyAgICBleHBlY3Qoc1s6Y10pLnRvIGVxKDpjMykKKyAgZW5kCisKKyAgaXQgImFycmF5IG9mIDplbnVtIGZpZWxkIiBkbworICAgIHMgPSBFbnVtRmllbGRzOjpUZXN0U3RydWN0Lm5ldworICAgIEVudW1GaWVsZHM6OlRlc3RFbnVtLnN5bWJvbHMuZWFjaF93aXRoX2luZGV4IGRvIHx2YWwsIGl8CisgICAgICBzWzpkXVtpXSA9IHZhbAorICAgIGVuZAorCisgICAgRW51bUZpZWxkczo6VGVzdEVudW0uc3ltYm9scy5lYWNoX3dpdGhfaW5kZXggZG8gfHZhbCwgaXwKKyAgICAgIGV4cGVjdChzLnBvaW50ZXIuZ2V0X3VpbnQoRkZJOjpUeXBlOjpJTlQzMi5zaXplICogKDIgKyBpKSkpLnRvIGVxKEVudW1GaWVsZHM6OlRlc3RFbnVtW3ZhbF0pCisgICAgZW5kCisKKyAgICBzWzpkXS5lYWNoX3dpdGhfaW5kZXggZG8gfHZhbCwgaXwKKyAgICAgIGV4cGVjdCh2YWwpLnRvIGVxKEVudW1GaWVsZHM6OlRlc3RFbnVtLnN5bWJvbHNbaV0pCisgICAgZW5kCisgIGVuZAorCisgIG1vZHVsZSBDYWxsYmFja01lbWJlcgorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgY2FsbGJhY2sgOmFkZCwgWyA6aW50LCA6aW50IF0sIDppbnQKKyAgICBjYWxsYmFjayA6c3ViLCBbIDppbnQsIDppbnQgXSwgOmludAorICAgIGNsYXNzIFRlc3RTdHJ1Y3QgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDphZGQsIDphZGQsCisgICAgICAgIDpzdWIsIDpzdWIKKyAgICBlbmQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9jYWxsX2FkZF9jYiwgW1Rlc3RTdHJ1Y3QuaW4sIDppbnQsIDppbnRdLCA6aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfY2FsbF9zdWJfY2IsIFtUZXN0U3RydWN0LmluLCA6aW50LCA6aW50XSwgOmludAorICBlbmQKKworICBpdCAiQ2FuIGhhdmUgQ2FsbGJhY2tJbmZvIHN0cnVjdCBmaWVsZCIgZG8KKyAgICAgIHMgPSBDYWxsYmFja01lbWJlcjo6VGVzdFN0cnVjdC5uZXcKKyAgICAgIGFkZF9wcm9jID0gbGFtYmRhIHsgfGEsIGJ8IGErYiB9CisgICAgICBzdWJfcHJvYyA9IGxhbWJkYSB7IHxhLCBifCBhLWIgfQorICAgICAgc1s6YWRkXSA9IGFkZF9wcm9jCisgICAgICBzWzpzdWJdID0gc3ViX3Byb2MKKyAgICAgIGV4cGVjdChDYWxsYmFja01lbWJlci5zdHJ1Y3RfY2FsbF9hZGRfY2IocywgNDAsIDIpKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChDYWxsYmFja01lbWJlci5zdHJ1Y3RfY2FsbF9zdWJfY2IocywgNDQsIDIpKS50byBlcSg0MikKKyAgZW5kCisKKyAgaXQgIkNhbiByZXR1cm4gaXRzIG1lbWJlcnMgYXMgYSBsaXN0IiBkbworICAgIGNsYXNzIFRlc3RTdHJ1Y3QgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDphLCA6aW50LCA6YiwgOmludCwgOmMsIDppbnQKKyAgICBlbmQKKyAgICBleHBlY3QoVGVzdFN0cnVjdC5tZW1iZXJzKS50byBpbmNsdWRlKDphLCA6YiwgOmMpCisgIGVuZAorCisgIGl0ICJDYW4gcmV0dXJuIGl0cyBpbnN0YW5jZSBtZW1iZXJzIGFuZCB2YWx1ZXMgYXMgbGlzdHMiIGRvCisgICAgY2xhc3MgVGVzdFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmEsIDppbnQsIDpiLCA6aW50LCA6YywgOmludAorICAgIGVuZAorICAgIHMgPSBUZXN0U3RydWN0Lm5ldworICAgIGV4cGVjdChzLm1lbWJlcnMpLnRvIGluY2x1ZGUoOmEsIDpiLCA6YykKKyAgICBzWzphXSA9IDEKKyAgICBzWzpiXSA9IDIKKyAgICBzWzpjXSA9IDMKKyAgICBleHBlY3Qocy52YWx1ZXMpLnRvIGluY2x1ZGUoMSwgMiwgMykKKyAgZW5kCisKKyAgaXQgJ3Nob3VsZCByZXR1cm4gYW4gb3JkZXJlZCBmaWVsZC9vZmZzZXQgcGFpcnMgYXJyYXknIGRvCisgICAgY2xhc3MgVGVzdFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmEsIDppbnQsIDpiLCA6aW50LCA6YywgOmludAorICAgIGVuZAorICAgIHMgPSBUZXN0U3RydWN0Lm5ldworICAgIGV4cGVjdChzLm9mZnNldHMpLnRvIGVxKFtbOmEsIDBdLCBbOmIsIDRdLCBbOmMsIDhdXSkKKyAgICBleHBlY3QoVGVzdFN0cnVjdC5vZmZzZXRzKS50byBlcShbWzphLCAwXSwgWzpiLCA0XSwgWzpjLCA4XV0pCisgIGVuZAorCisgIGl0ICJTdHJ1Y3Qjb2Zmc2V0X29mIHJldHVybnMgb2Zmc2V0IG9mIGZpZWxkIHdpdGhpbiBzdHJ1Y3QiIGRvCisgICAgY2xhc3MgVGVzdFN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmEsIDppbnQsIDpiLCA6aW50LCA6YywgOmludAorICAgIGVuZAorICAgIGV4cGVjdChUZXN0U3RydWN0Lm9mZnNldF9vZig6YSkpLnRvIGVxKDApCisgICAgZXhwZWN0KFRlc3RTdHJ1Y3Qub2Zmc2V0X29mKDpiKSkudG8gZXEoNCkKKyAgICBleHBlY3QoVGVzdFN0cnVjdC5vZmZzZXRfb2YoOmMpKS50byBlcSg4KQorICBlbmQKK2VuZAorCitkZXNjcmliZSBGRkk6OlN0cnVjdCwgIi5sYXlvdXQiIGRvCisgIG1vZHVsZSBGRklTcGVjcworICAgIG1vZHVsZSBMaWJUZXN0CisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICBiZWdpbgorICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOnB0cl9yZXRfaW50MzJfdCwgWyA6cG9pbnRlciwgOmludCBdLCA6aW50CisgICAgICByZXNjdWUgRkZJOjpOb3RGb3VuZEVycm9yCisgICAgICAgICMgTmV0QlNEIHVzZXMgI2RlZmluZSBpbnN0ZWFkIG9mIHR5cGVkZWYgZm9yIHRoZXNlCisgICAgICAgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX3JldF9pbnQzMl90LCA6cHRyX3JldF9fX2ludDMyX3QsIFsgOnBvaW50ZXIsIDppbnQgXSwgOmludAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlc2NyaWJlICJ3aGVuIGRlcml2ZWQgY2xhc3MgaXMgbm90IGFzc2lnbmVkIHRvIGFueSBjb25zdGFudCIgZG8KKyAgICBpdCAicmVzb2x2ZXMgYSBidWlsdC1pbiB0eXBlIiBkbworICAgICAga2xhc3MgPSBDbGFzcy5uZXcgRkZJOjpTdHJ1Y3QKKyAgICAgIGtsYXNzLmxheW91dCA6bnVtYmVyLCA6aW50CisKKyAgICAgIGluc3RhbmNlID0ga2xhc3MubmV3CisgICAgICBpbnN0YW5jZVs6bnVtYmVyXSA9IDB4QTEKKyAgICAgIGV4cGVjdChGRklTcGVjczo6TGliVGVzdC5wdHJfcmV0X2ludDMyX3QoaW5zdGFuY2UsIDApKS50byBlcSgweEExKQorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAid2hlbiBkZXJpdmVkIGNsYXNzIGlzIGFzc2lnbmVkIHRvIGEgY29uc3RhbnQiIGRvCisgICAgaXQgInJlc29sdmVzIGEgYnVpbHQtaW4gdHlwZSIgZG8KKyAgICAgIGNsYXNzIEZGSVNwZWNzOjpUZXN0U3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgICAgbGF5b3V0IDpudW1iZXIsIDppbnQKKyAgICAgIGVuZAorCisgICAgICBpbnN0YW5jZSA9IEZGSVNwZWNzOjpUZXN0U3RydWN0Lm5ldworICAgICAgaW5zdGFuY2VbOm51bWJlcl0gPSAweEExCisgICAgICBleHBlY3QoRkZJU3BlY3M6OkxpYlRlc3QucHRyX3JldF9pbnQzMl90KGluc3RhbmNlLCAwKSkudG8gZXEoMHhBMSkKKyAgICBlbmQKKworICAgIGl0ICJyZXNvbHZlcyBhIHR5cGUgZnJvbSB0aGUgZW5jbG9zaW5nIG1vZHVsZSIgZG8KKyAgICAgIG1vZHVsZSBGRklTcGVjczo6TGliVGVzdAorICAgICAgICB0eXBlZGVmIDp1aW50LCA6Y3VzdG9tX2ludAorCisgICAgICAgIGNsYXNzIFRlc3RTdHJ1Y3QgPCBGRkk6OlN0cnVjdAorICAgICAgICAgIGxheW91dCA6bnVtYmVyLCA6Y3VzdG9tX2ludAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBpbnN0YW5jZSA9IEZGSVNwZWNzOjpMaWJUZXN0OjpUZXN0U3RydWN0Lm5ldworICAgICAgaW5zdGFuY2VbOm51bWJlcl0gPSAweEExCisgICAgICBleHBlY3QoRkZJU3BlY3M6OkxpYlRlc3QucHRyX3JldF9pbnQzMl90KGluc3RhbmNlLCAwKSkudG8gZXEoMHhBMSkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgRkZJOjpTdHJ1Y3QsICcgd2l0aCBhIG5lc3RlZCBzdHJ1Y3QgZmllbGQnICBkbworICBtb2R1bGUgTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgY2xhc3MgTmVzdGVkU3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6aSwgOmludAorICAgIGVuZAorICAgIGNsYXNzIENvbnRhaW5lclN0cnVjdCA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmZpcnN0LCA6Y2hhciwgOm5zLCBOZXN0ZWRTdHJ1Y3QKKyAgICBlbmQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9hbGlnbl9uZXN0ZWRfc3RydWN0LCBbIDpwb2ludGVyIF0sIDppbnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9tYWtlX2NvbnRhaW5lcl9zdHJ1Y3QsIFsgOmludCBdLCA6cG9pbnRlcgorICBlbmQKKyAgYmVmb3JlIGRvCisgICAgQGNzID0gTGliVGVzdDo6Q29udGFpbmVyU3RydWN0Lm5ldworICBlbmQKKworICBpdCAnc2hvdWxkIGFsaWduIGNvcnJlY3RseSBuZXN0ZWQgc3RydWN0IGZpZWxkJyBkbworICAgIEBjc1s6bnNdWzppXSA9IDEyMworICAgIGV4cGVjdChMaWJUZXN0LnN0cnVjdF9hbGlnbl9uZXN0ZWRfc3RydWN0KEBjcy50b19wdHIpKS50byBlcSgxMjMpCisgIGVuZAorCisgIGl0ICdzaG91bGQgY29ycmVjdGx5IGNhbGN1bGF0ZSBDb250YWluZXIgc2l6ZSAoaW4gYnl0ZXMpJyBkbworICAgIGV4cGVjdChMaWJUZXN0OjpDb250YWluZXJTdHJ1Y3Quc2l6ZSkudG8gZXEoOCkKKyAgZW5kCisKKyAgaXQgJ3Nob3VsZCByZXR1cm4gYSBTdHJ1Y3Qgb2JqZWN0IHdoZW4gdGhlIGZpZWxkIGlzIGFjY2Vzc2VkJyBkbworICAgIGV4cGVjdChAY3NbOm5zXS5pc19hPyhGRkk6OlN0cnVjdCkpLnRvIGJlIHRydWUKKyAgZW5kCisKKyAgaXQgJ3Nob3VsZCByZWFkIGEgdmFsdWUgZnJvbSBtZW1vcnknIGRvCisgICAgQGNzID0gTGliVGVzdDo6Q29udGFpbmVyU3RydWN0Lm5ldyhMaWJUZXN0LnN0cnVjdF9tYWtlX2NvbnRhaW5lcl9zdHJ1Y3QoMTIzKSkKKyAgICBleHBlY3QoQGNzWzpuc11bOmldKS50byBlcSgxMjMpCisgIGVuZAorCisgIGl0ICdzaG91bGQgd3JpdGUgYSB2YWx1ZSB0byBtZW1vcnknIGRvCisgICAgQGNzID0gTGliVGVzdDo6Q29udGFpbmVyU3RydWN0Lm5ldyhMaWJUZXN0LnN0cnVjdF9tYWtlX2NvbnRhaW5lcl9zdHJ1Y3QoMTIzKSkKKyAgICBAY3NbOm5zXVs6aV0gPSA0NTYKKyAgICBleHBlY3QoTGliVGVzdC5zdHJ1Y3RfYWxpZ25fbmVzdGVkX3N0cnVjdChAY3MudG9fcHRyKSkudG8gZXEoNDU2KQorICBlbmQKKworICBpdCAnc2hvdWxkIGJlIGFibGUgdG8gYXNzaWduIHN0cnVjdCBpbnN0YW5jZSB0byBuZXN0ZWQgZmllbGQnIGRvCisgICAgY3MgPSBMaWJUZXN0OjpDb250YWluZXJTdHJ1Y3QubmV3KExpYlRlc3Quc3RydWN0X21ha2VfY29udGFpbmVyX3N0cnVjdCgxMjMpKQorICAgIG5zID0gTGliVGVzdDo6TmVzdGVkU3RydWN0Lm5ldworICAgIG5zWzppXSA9IDU2NworICAgIGNzWzpuc10gPSBucworICAgIGV4cGVjdChjc1s6bnNdWzppXSkudG8gZXEoNTY3KQorICAgIGV4cGVjdChMaWJUZXN0LnN0cnVjdF9hbGlnbl9uZXN0ZWRfc3RydWN0KGNzLnRvX3B0cikpLnRvIGVxKDU2NykKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgRkZJOjpTdHJ1Y3QsICcgd2l0aCBhIG5lc3RlZCBhcnJheSBvZiBzdHJ1Y3RzJyAgZG8KKyAgbW9kdWxlIElubGluZUFycmF5T2ZTdHJ1Y3RzCisgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICBjbGFzcyBOZXN0ZWRTdHJ1Y3QgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDppLCA6aW50CisgICAgZW5kCisgICAgY2xhc3MgQ29udGFpbmVyU3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6Zmlyc3QsIDpjaGFyLCA6bnMsIFsgTmVzdGVkU3RydWN0LCAxIF0KKyAgICBlbmQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9hbGlnbl9uZXN0ZWRfc3RydWN0LCBbIDpwb2ludGVyIF0sIDppbnQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9tYWtlX2NvbnRhaW5lcl9zdHJ1Y3QsIFsgOmludCBdLCA6cG9pbnRlcgorICBlbmQKKworICBiZWZvcmUgZG8KKyAgICBAY3MgPSBJbmxpbmVBcnJheU9mU3RydWN0czo6Q29udGFpbmVyU3RydWN0Lm5ldworICBlbmQKKworICBpdCAnc2hvdWxkIGFsaWduIGNvcnJlY3RseSBuZXN0ZWQgc3RydWN0IGZpZWxkJyBkbworICAgIEBjc1s6bnNdWzBdWzppXSA9IDEyMworICAgIGV4cGVjdChJbmxpbmVBcnJheU9mU3RydWN0cy5zdHJ1Y3RfYWxpZ25fbmVzdGVkX3N0cnVjdChAY3MudG9fcHRyKSkudG8gZXEoMTIzKQorICBlbmQKKworICBpdCAnc2hvdWxkIGNvcnJlY3RseSBjYWxjdWxhdGUgQ29udGFpbmVyIHNpemUgKGluIGJ5dGVzKScgZG8KKyAgICBleHBlY3QoSW5saW5lQXJyYXlPZlN0cnVjdHM6OkNvbnRhaW5lclN0cnVjdC5zaXplKS50byBlcSg4KQorICBlbmQKKworICBpdCAnc2hvdWxkIHJldHVybiBhIFN0cnVjdCBvYmplY3Qgd2hlbiB0aGUgZmllbGQgaXMgYWNjZXNzZWQnIGRvCisgICAgZXhwZWN0KEBjc1s6bnNdWzBdLmlzX2E/KEZGSTo6U3RydWN0KSkudG8gYmUgdHJ1ZQorICBlbmQKKworICBpdCAnc2hvdWxkIHJlYWQgYSB2YWx1ZSBmcm9tIG1lbW9yeScgZG8KKyAgICBAY3MgPSBJbmxpbmVBcnJheU9mU3RydWN0czo6Q29udGFpbmVyU3RydWN0Lm5ldyhJbmxpbmVBcnJheU9mU3RydWN0cy5zdHJ1Y3RfbWFrZV9jb250YWluZXJfc3RydWN0KDEyMykpCisgICAgZXhwZWN0KEBjc1s6bnNdWzBdWzppXSkudG8gZXEoMTIzKQorICBlbmQKKworICBpdCAnc2hvdWxkIHdyaXRlIGEgdmFsdWUgdG8gbWVtb3J5JyBkbworICAgIEBjcyA9IElubGluZUFycmF5T2ZTdHJ1Y3RzOjpDb250YWluZXJTdHJ1Y3QubmV3KElubGluZUFycmF5T2ZTdHJ1Y3RzLnN0cnVjdF9tYWtlX2NvbnRhaW5lcl9zdHJ1Y3QoMTIzKSkKKyAgICBAY3NbOm5zXVswXVs6aV0gPSA0NTYKKyAgICBleHBlY3QoSW5saW5lQXJyYXlPZlN0cnVjdHMuc3RydWN0X2FsaWduX25lc3RlZF9zdHJ1Y3QoQGNzLnRvX3B0cikpLnRvIGVxKDQ1NikKKyAgZW5kCisKKyAgaXQgJ3Nob3VsZCBzdXBwb3J0IEVudW1lcmFibGUjZWFjaCcgZG8KKyAgICBAY3MgPSBJbmxpbmVBcnJheU9mU3RydWN0czo6Q29udGFpbmVyU3RydWN0Lm5ldyhJbmxpbmVBcnJheU9mU3RydWN0cy5zdHJ1Y3RfbWFrZV9jb250YWluZXJfc3RydWN0KDEyMykpCisgICAgaW50cyA9IFtdCisgICAgQGNzWzpuc10uZWFjaCB7IHxzfCBpbnRzIDw8IHNbOmldIH0KKyAgICBleHBlY3QoaW50c1swXSkudG8gZXEoMTIzKQorICBlbmQKK2VuZAorCitkZXNjcmliZSBGRkk6OlN0cnVjdCwgJyBieSB2YWx1ZScgIGRvCisgIG1vZHVsZSBMaWJUZXN0CisgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKworICAgIGNsYXNzIFM4UzMyIDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6czgsIDpjaGFyLCA6czMyLCA6aW50CisgICAgZW5kCisKKyAgICBjbGFzcyBTdHJ1Y3RTdHJpbmcgPCBGRkk6OlN0cnVjdAorICAgICAgbGF5b3V0IDpieXRlcywgOnN0cmluZywgOmxlbiwgOmludAorICAgIGVuZAorCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfcmV0dXJuX3M4czMyLCBbIF0sIFM4UzMyLmJ5X3ZhbHVlCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfczhzMzJfc2V0LCBbIDpjaGFyLCA6aW50IF0sIFM4UzMyLmJ5X3ZhbHVlCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfczhzMzJfZ2V0X3M4LCBbIFM4UzMyLmJ5X3ZhbHVlIF0sIDpjaGFyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfczhzMzJfZ2V0X3MzMiwgWyBTOFMzMi5ieV92YWx1ZSBdLCA6aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfczhzMzJfczMyX3JldF9zMzIsIFsgUzhTMzIuYnlfdmFsdWUsIDppbnQgXSwgOmludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RydWN0X3M4czMyX3M2NF9yZXRfczY0LCBbIFM4UzMyLmJ5X3ZhbHVlLCA6bG9uZ19sb25nIF0sIDpsb25nX2xvbmcKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9zOHMzMl9yZXRfczhzMzIsIFsgUzhTMzIuYnlfdmFsdWUgXSwgUzhTMzIuYnlfdmFsdWUKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnN0cnVjdF9zMzJfcHRyX3MzMl9zOHMzMl9yZXRfczMyLCBbIDppbnQsIDpwb2ludGVyLCA6aW50LCBTOFMzMi5ieV92YWx1ZSBdLCA6aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfdmFyYXJnc19yZXRfc3RydWN0X3N0cmluZywgWyA6aW50LCA6dmFyYXJncyBdLCBTdHJ1Y3RTdHJpbmcuYnlfdmFsdWUKKyAgZW5kCisKKyAgaXQgJ3JldHVybiB1c2luZyBwcmUtc2V0IHZhbHVlcycgZG8KKyAgICBzID0gTGliVGVzdC5zdHJ1Y3RfcmV0dXJuX3M4czMyCisgICAgZXhwZWN0KHNbOnM4XSkudG8gZXEoMHg3ZikKKyAgICBleHBlY3Qoc1s6czMyXSkudG8gZXEoMHgxMjM0NTY3OCkKKyAgZW5kCisKKyAgaXQgJ3JldHVybiB1c2luZyBwYXNzZWQgaW4gdmFsdWVzJyBkbworICAgIHMgPSBMaWJUZXN0LnN0cnVjdF9zOHMzMl9zZXQoMTIzLCA0NTY3ODkpCisgICAgZXhwZWN0KHNbOnM4XSkudG8gZXEoMTIzKQorICAgIGV4cGVjdChzWzpzMzJdKS50byBlcSg0NTY3ODkpCisgIGVuZAorCisgIGl0ICdwYXJhbWV0ZXInIGRvCisgICAgcyA9IExpYlRlc3Q6OlM4UzMyLm5ldworICAgIHNbOnM4XSA9IDB4MTIKKyAgICBzWzpzMzJdID0gMHgzNDU2Nzg5MAorICAgIGV4cGVjdChMaWJUZXN0LnN0cnVjdF9zOHMzMl9nZXRfczgocykpLnRvIGVxKDB4MTIpCisgICAgZXhwZWN0KExpYlRlc3Quc3RydWN0X3M4czMyX2dldF9zMzIocykpLnRvIGVxKDB4MzQ1Njc4OTApCisgIGVuZAorCisgIGl0ICdwYXJhbWV0ZXIgd2l0aCBmb2xsb3dpbmcgczMyJyBkbworICAgIHMgPSBMaWJUZXN0OjpTOFMzMi5uZXcKKyAgICBzWzpzOF0gPSAweDEyCisgICAgc1s6czMyXSA9IDB4MzQ1Njc4OTAKKworICAgIGV4cGVjdChMaWJUZXN0LnN0cnVjdF9zOHMzMl9zMzJfcmV0X3MzMihzLCAweDFlZWZkZWFkKSkudG8gZXEoMHgxZWVmZGVhZCkKKyAgZW5kCisKKyAgIyBpdCAncGFyYW1ldGVyIHdpdGggZm9sbG93aW5nIHM2NCcgZG8KKyAgIyAgIHMgPSBMaWJUZXN0OjpTOFM2NC5uZXcKKyAgIyAgIHNbOnM4XSA9IDB4MTIKKyAgIyAgIHNbOnM2NF0gPSAweDM0NTY3ODkwCisgICMKKyAgIworICAjICAgTGliVGVzdC5zdHJ1Y3RfczhzNjRfczY0X3JldF9zNjQocywgMHgxZWVmZGVhZDFlZWZkZWFkKS5zaG91bGQgPT0gMHgxZWVmZGVhZDFlZWZkZWFkCisgICMgZW5kCisKKyAgaXQgJ3BhcmFtZXRlciB3aXRoIHByZWNlZGluZyBzMzIscHRyLHMzMicgZG8KKyAgICBzID0gTGliVGVzdDo6UzhTMzIubmV3CisgICAgc1s6czhdID0gMHgxMgorICAgIHNbOnMzMl0gPSAweDM0NTY3ODkwCisgICAgb3V0ID0gTGliVGVzdDo6UzhTMzIubmV3CisgICAgZXhwZWN0KExpYlRlc3Quc3RydWN0X3MzMl9wdHJfczMyX3M4czMyX3JldF9zMzIoMHgxMDAwMDAwLCBvdXQsIDB4MWVhZmJlZWYsIHMpKS50byBlcSgweDM0NTY3ODkwKQorICAgIGV4cGVjdChvdXRbOnM4XSkudG8gZXEoc1s6czhdKQorICAgIGV4cGVjdChvdXRbOnMzMl0pLnRvIGVxKHNbOnMzMl0pCisgIGVuZAorCisgIGl0ICdwYXJhbWV0ZXIgd2l0aCBwcmVjZWRpbmcgczMyLHN0cmluZyxzMzInIGRvCisgICAgcyA9IExpYlRlc3Q6OlM4UzMyLm5ldworICAgIHNbOnM4XSA9IDB4MTIKKyAgICBzWzpzMzJdID0gMHgzNDU2Nzg5MAorICAgIG91dCA9IDAuY2hyICogMzIKKyAgICBleHBlY3QoTGliVGVzdC5zdHJ1Y3RfczMyX3B0cl9zMzJfczhzMzJfcmV0X3MzMigweDEwMDAwMDAsIG91dCwgMHgxZWFmYmVlZiwgcykpLnRvIGVxKDB4MzQ1Njc4OTApCisgIGVuZAorCisgIGl0ICdwYXJhbWV0ZXIsIHJldHVybmluZyBzdHJ1Y3QgYnkgdmFsdWUnIGRvCisgICAgcyA9IExpYlRlc3Q6OlM4UzMyLm5ldworICAgIHNbOnM4XSA9IDB4MTIKKyAgICBzWzpzMzJdID0gMHgzNDU2Nzg5MAorCisgICAgcmV0ID0gTGliVGVzdC5zdHJ1Y3RfczhzMzJfcmV0X3M4czMyKHMpCisgICAgZXhwZWN0KHJldFs6czhdKS50byBlcShzWzpzOF0pCisgICAgZXhwZWN0KHJldFs6czMyXSkudG8gZXEoc1s6czMyXSkKKyAgZW5kCisKKyAgaXQgJ3ZhcmFyZ3MgcmV0dXJuaW5nIGEgc3RydWN0JyBkbworICAgIHN0cmluZyA9ICJ0ZXN0IgorICAgIHMgPSBMaWJUZXN0LnN0cnVjdF92YXJhcmdzX3JldF9zdHJ1Y3Rfc3RyaW5nKDQsIDpzdHJpbmcsIHN0cmluZykKKyAgICBleHBlY3Qoc1s6bGVuXSkudG8gZXEoc3RyaW5nLmxlbmd0aCkKKyAgICBleHBlY3Qoc1s6Ynl0ZXNdKS50byBlcShzdHJpbmcpCisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIEZGSTo6U3RydWN0LCAnIHdpdGggYW4gYXJyYXkgZmllbGQnICBkbworICBtb2R1bGUgTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgY2xhc3MgU3RydWN0V2l0aEFycmF5IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6Zmlyc3QsIDpjaGFyLCA6YSwgWzppbnQsIDVdCisgICAgZW5kCisgICAgYXR0YWNoX2Z1bmN0aW9uIDpzdHJ1Y3RfbWFrZV9zdHJ1Y3Rfd2l0aF9hcnJheSwgWzppbnQsIDppbnQsIDppbnQsIDppbnQsIDppbnRdLCA6cG9pbnRlcgorICAgIGF0dGFjaF9mdW5jdGlvbiA6c3RydWN0X2ZpZWxkX2FycmF5LCBbOnBvaW50ZXJdLCA6cG9pbnRlcgorICBlbmQKKyAgYmVmb3JlIGRvCisgICAgQHMgPSBMaWJUZXN0OjpTdHJ1Y3RXaXRoQXJyYXkubmV3CisgIGVuZAorCisgIGl0ICdzaG91bGQgY29ycmVjdGx5IGNhbGN1bGF0ZSBTdHJ1Y3RXaXRoQXJyYXkgc2l6ZSAoaW4gYnl0ZXMpJyBkbworICAgIGV4cGVjdChMaWJUZXN0OjpTdHJ1Y3RXaXRoQXJyYXkuc2l6ZSkudG8gZXEoMjQpCisgIGVuZAorCisgIGl0ICdzaG91bGQgcmVhZCB2YWx1ZXMgZnJvbSBtZW1vcnknIGRvCisgICAgQHMgPSBMaWJUZXN0OjpTdHJ1Y3RXaXRoQXJyYXkubmV3KExpYlRlc3Quc3RydWN0X21ha2Vfc3RydWN0X3dpdGhfYXJyYXkoMCwgMSwgMiwgMywgNCkpCisgICAgZXhwZWN0KEBzWzphXS50b19hKS50byBlcShbMCwgMSwgMiwgMywgNF0pCisgIGVuZAorIyAgaXQgJ3Nob3VsZCBjYWNoZSBhcnJheSBvYmplY3QgZm9yIHN1Y2Nlc3NpdmUgY2FsbHMnIGRvCisjICAgIEBzWzphXS5vYmplY3RfaWQuc2hvdWxkID09IEBzWzphXS5vYmplY3RfaWQKKyMgIGVuZAorCisgIGl0ICdzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5IGZpZWxkJyBkbworICAgIEBzID0gTGliVGVzdDo6U3RydWN0V2l0aEFycmF5Lm5ldyhMaWJUZXN0LnN0cnVjdF9tYWtlX3N0cnVjdF93aXRoX2FycmF5KDAsIDEsIDIsIDMsIDQpKQorICAgIGV4cGVjdChAc1s6YV0uc2l6ZSkudG8gZXEoNSkKKyAgZW5kCisKKyAgaXQgJ3Nob3VsZCBhbGxvdyBpdGVyYXRpb24gdGhyb3VnaCB0aGUgYXJyYXkgZWxlbWVudHMnIGRvCisgICAgQHMgPSBMaWJUZXN0OjpTdHJ1Y3RXaXRoQXJyYXkubmV3KExpYlRlc3Quc3RydWN0X21ha2Vfc3RydWN0X3dpdGhfYXJyYXkoMCwgMSwgMiwgMywgNCkpCisgICAgQHNbOmFdLmVhY2hfd2l0aF9pbmRleCB7IHxlbGVtLCBpfCBleHBlY3QoZWxlbSkudG8gZXEoaSkgfQorICBlbmQKKworICBpdCAnc2hvdWxkIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYXJyYXknIGRvCisgICAgQHMgPSBMaWJUZXN0OjpTdHJ1Y3RXaXRoQXJyYXkubmV3KExpYlRlc3Quc3RydWN0X21ha2Vfc3RydWN0X3dpdGhfYXJyYXkoMCwgMSwgMiwgMywgNCkpCisgICAgZXhwZWN0KEBzWzphXS50b19wdHIpLnRvIGVxKExpYlRlc3Q6OnN0cnVjdF9maWVsZF9hcnJheShAcy50b19wdHIpKQorICBlbmQKK2VuZAorCitkZXNjcmliZSAnQnVnZ2VkU3RydWN0JyBkbworICBtb2R1bGUgTGliVGVzdAorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgY2xhc3MgQnVnZ2VkU3RydWN0IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6dmlzaWJsZSwgOnVjaGFyLAorICAgICAgICAgICAgICA6eCwgOnVpbnQsCisgICAgICAgICAgICAgIDp5LCA6dWludCwKKyAgICAgICAgICAgICAgOnJ4LCA6c2hvcnQsCisgICAgICAgICAgICAgIDpyeSwgOnNob3J0LAorICAgICAgICAgICAgICA6b3JkZXIsIDp1Y2hhciwKKyAgICAgICAgICAgICAgOnNpemUsIDp1Y2hhcgorICAgIGVuZAorICAgIGF0dGFjaF9mdW5jdGlvbiA6YnVnZ2VkX3N0cnVjdF9zaXplLCBbXSwgOnVpbnQKKyAgZW5kCisKKyAgaXQgJ3Nob3VsZCByZXR1cm4gaXRzIGNvcnJlY3Qgc2l6ZScgZG8KKyAgICBleHBlY3QoTGliVGVzdDo6QnVnZ2VkU3RydWN0LnNpemUpLnRvIGVxKExpYlRlc3QuYnVnZ2VkX3N0cnVjdF9zaXplKQorICBlbmQKKworICBpdCAib2Zmc2V0cyB3aXRoaW4gc3RydWN0IHNob3VsZCBiZSBjb3JyZWN0IiBkbworICAgIGV4cGVjdChMaWJUZXN0OjpCdWdnZWRTdHJ1Y3Qub2Zmc2V0X29mKDp2aXNpYmxlKSkudG8gZXEoMCkKKyAgICBleHBlY3QoTGliVGVzdDo6QnVnZ2VkU3RydWN0Lm9mZnNldF9vZig6eCkpLnRvIGVxKDQpCisgICAgZXhwZWN0KExpYlRlc3Q6OkJ1Z2dlZFN0cnVjdC5vZmZzZXRfb2YoOnkpKS50byBlcSg4KQorICAgIGV4cGVjdChMaWJUZXN0OjpCdWdnZWRTdHJ1Y3Qub2Zmc2V0X29mKDpyeCkpLnRvIGVxKDEyKQorICAgIGV4cGVjdChMaWJUZXN0OjpCdWdnZWRTdHJ1Y3Qub2Zmc2V0X29mKDpyeSkpLnRvIGVxKDE0KQorICAgIGV4cGVjdChMaWJUZXN0OjpCdWdnZWRTdHJ1Y3Qub2Zmc2V0X29mKDpvcmRlcikpLnRvIGVxKDE2KQorICAgIGV4cGVjdChMaWJUZXN0OjpCdWdnZWRTdHJ1Y3Qub2Zmc2V0X29mKDpzaXplKSkudG8gZXEoMTcpCisgIGVuZAorCisgIGl0ICdzaG91bGQgcmV0dXJuIGNvcnJlY3QgZmllbGQvb2Zmc2V0IHBhaXJzJyBkbworICAgIGV4cGVjdChMaWJUZXN0OjpCdWdnZWRTdHJ1Y3Qub2Zmc2V0cy5zb3J0IGRvIHxhLCBifAorICAgICAgYVsxXSA8PT4gYlsxXQorICAgIGVuZCkudG8gZXEoW1s6dmlzaWJsZSwgMF0sIFs6eCwgNF0sIFs6eSwgOF0sIFs6cngsIDEyXSwgWzpyeSwgMTRdLCBbOm9yZGVyLCAxNl0sIFs6c2l6ZSwgMTddXSkKKyAgZW5kCitlbmQKKworZGVzY3JpYmUgIlN0cnVjdCBhbGxvY2F0aW9uIiBkbworICBpdCAiTWVtb3J5UG9pbnRlci5uZXcoU3RydWN0LCAyKSIgZG8KKyAgICBjbGFzcyBTIDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6aSwgOnVpbnQKKyAgICBlbmQKKyAgICBwID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyhTLCAyKQorICAgIGV4cGVjdChwLnRvdGFsKS50byBlcSg4KQorICAgIGV4cGVjdChwLnR5cGVfc2l6ZSkudG8gZXEoNCkKKyAgICBwLnB1dF91aW50KDQsIDB4ZGVhZGJlZWYpCisgICAgZXhwZWN0KFMubmV3KHBbMV0pWzppXSkudG8gZXEoMHhkZWFkYmVlZikKKyAgICBleHBlY3QocFsxXS5hZGRyZXNzKS50byBlcSgocFswXS5hZGRyZXNzICsgNCkpCisgIGVuZAorCisgIGl0ICJCdWZmZXIubmV3KFN0cnVjdCwgMikiIGRvCisgICAgY2xhc3MgUyA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmksIDp1aW50CisgICAgZW5kCisgICAgcCA9IEZGSTo6QnVmZmVyLm5ldyhTLCAyKQorICAgIGV4cGVjdChwLnRvdGFsKS50byBlcSg4KQorICAgIGV4cGVjdChwLnR5cGVfc2l6ZSkudG8gZXEoNCkKKyAgICBwLnB1dF91aW50KDQsIDB4ZGVhZGJlZWYpCisgICAgZXhwZWN0KFMubmV3KHBbMV0pWzppXSkudG8gZXEoMHhkZWFkYmVlZikKKyAgZW5kCisKKyAgaXQgIm51bGw/IHNob3VsZCBiZSB0cnVlIHdoZW4gaW5pdGlhbGl6ZWQgd2l0aCBOVUxMIHBvaW50ZXIiIGRvCisgICAgY2xhc3MgUyA8IEZGSTo6U3RydWN0CisgICAgICBsYXlvdXQgOmksIDp1aW50CisgICAgZW5kCisgICAgZXhwZWN0KFMubmV3KEZGSTo6UG9pbnRlcjo6TlVMTCkpLnRvIGJlX251bGwKKyAgZW5kCisKKyAgaXQgIm51bGw/IHNob3VsZCBiZSBmYWxzZSB3aGVuIGluaXRpYWxpemVkIHdpdGggbm9uLU5VTEwgcG9pbnRlciIgZG8KKyAgICBjbGFzcyBTIDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCA6aSwgOnVpbnQKKyAgICBlbmQKKyAgICBleHBlY3QoUy5uZXcoRkZJOjpNZW1vcnlQb2ludGVyLm5ldyhTKSkpLm5vdF90byBiZV9udWxsCisgIGVuZAorCisgIGl0ICJzdXBwb3J0cyA6Ym9vbCBhcyBhIHN0cnVjdCBtZW1iZXIiIGRvCisgICAgZXhwZWN0IGRvCisgICAgICBjID0gQ2xhc3MubmV3KEZGSTo6U3RydWN0KSBkbworICAgICAgICBsYXlvdXQgOmIsIDpib29sCisgICAgICBlbmQKKyAgICAgIHN0cnVjdCA9IGMubmV3CisgICAgICBzdHJ1Y3RbOmJdID0gISBzdHJ1Y3RbOmJdCisgICAgZW5kLm5vdF90byByYWlzZV9lcnJvciBFeGNlcHRpb24KKyAgZW5kCisKK2VuZAorCitkZXNjcmliZSAidmFyaWFibGUtbGVuZ3RoIGFycmF5cyIgZG8KKyAgaXQgInplcm8gbGVuZ3RoIGFycmF5IHNob3VsZCBiZSBhY2NlcHRlZCBhcyBsYXN0IGZpZWxkIiBkbworICAgIGV4cGVjdCB7CisgICAgICBDbGFzcy5uZXcoRkZJOjpTdHJ1Y3QpIGRvCisgICAgICAgIGxheW91dCA6Y291bnQsIDppbnQsIDpkYXRhLCBbIDpjaGFyLCAwIF0KKyAgICAgIGVuZAorICAgIH0ubm90X3RvIHJhaXNlX2Vycm9yIEV4Y2VwdGlvbgorICBlbmQKKworICBpdCAiemVybyBsZW5ndGggYXJyYXkgYmVmb3JlIGxhc3QgZWxlbWVudCBzaG91bGQgcmFpc2UgZXJyb3IiIGRvCisgICAgZXhwZWN0IHsKKyAgICAgIENsYXNzLm5ldyhGRkk6OlN0cnVjdCkgZG8KKyAgICAgICAgbGF5b3V0IDpkYXRhLCBbIDpjaGFyLCAwIF0sIDpjb3VudCwgOmludAorICAgICAgZW5kCisgICAgfS50byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAiY2FuIGFjY2VzcyBlbGVtZW50cyBvZiBhcnJheSIgZG8KKyAgICBzdHJ1Y3RfY2xhc3MgPSBDbGFzcy5uZXcoRkZJOjpTdHJ1Y3QpIGRvCisgICAgICBsYXlvdXQgOmNvdW50LCA6aW50LCA6ZGF0YSwgWyA6bG9uZywgMCBdCisgICAgZW5kCisgICAgcyA9IHN0cnVjdF9jbGFzcy5uZXcoRkZJOjpNZW1vcnlQb2ludGVyLm5ldygxMDI0KSkKKyAgICBzWzpkYXRhXVswXSA9IDB4MWVhZGJlZWYKKyAgICBzWzpkYXRhXVsxXSA9IDB4MTIzNDU2NzgKKyAgICBleHBlY3Qoc1s6ZGF0YV1bMF0pLnRvIGVxKDB4MWVhZGJlZWYpCisgICAgZXhwZWN0KHNbOmRhdGFdWzFdKS50byBlcSgweDEyMzQ1Njc4KQorICBlbmQKKworICBpdCAibm9uLXZhcmlhYmxlIGxlbmd0aCBhcnJheSBpcyBib3VuZHMgY2hlY2tlZCIgZG8KKyAgICBzdHJ1Y3RfY2xhc3MgPSBDbGFzcy5uZXcoRkZJOjpTdHJ1Y3QpIGRvCisgICAgICBsYXlvdXQgOmNvdW50LCA6aW50LCA6ZGF0YSwgWyA6bG9uZywgMSBdCisgICAgZW5kCisgICAgcyA9IHN0cnVjdF9jbGFzcy5uZXcoRkZJOjpNZW1vcnlQb2ludGVyLm5ldygxMDI0KSkKKyAgICBzWzpkYXRhXVswXSA9IDB4MWVhZGJlZWYKKyAgICBleHBlY3QgeyBzWzpkYXRhXVsxXSA9IDB4MTIzNDU2NzggfS50byByYWlzZV9lcnJvcgorICAgIGV4cGVjdChzWzpkYXRhXVswXSkudG8gZXEoMHgxZWFkYmVlZikKKyAgICBleHBlY3QgeyBleHBlY3Qoc1s6ZGF0YV1bMV0pLnRvID09IDB4MTIzNDU2NzggfS50byByYWlzZV9lcnJvcgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS90eXBlZGVmX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3R5cGVkZWZfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzMyNDdmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS90eXBlZGVmX3NwZWMucmIKQEAgLTAsMCArMSw5MSBAQAorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBydWJ5LWZmaS4KKyMgRm9yIGxpY2Vuc2luZywgc2VlIExJQ0VOU0UuU1BFQ1MKKyMKKworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAic3BlY19oZWxwZXIiKSkKK2Rlc2NyaWJlICJDdXN0b20gdHlwZSBkZWZpbml0aW9ucyIgZG8KKyAgaXQgImF0dGFjaF9mdW5jdGlvbiB3aXRoIGN1c3RvbSB0eXBlZGVmIiBkbworICAgIG1vZHVsZSBDdXN0b21UeXBlZGVmCisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICB0eXBlZGVmIDp1aW50LCA6ZnViYXJfdAorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpyZXRfdTMyLCBbIDpmdWJhcl90IF0sIDpmdWJhcl90CisgICAgZW5kCisgICAgZXhwZWN0KEN1c3RvbVR5cGVkZWYucmV0X3UzMigweDEyMzQ1Njc4KSkudG8gZXEoMHgxMjM0NTY3OCkKKyAgZW5kCisKKyAgaXQgInZhcmlhZGljIGludm9rZXIgd2l0aCBjdXN0b20gdHlwZWRlZiIgZG8KKyAgICBtb2R1bGUgVmFyaWFkaWNDdXN0b21UeXBlZGVmCisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICB0eXBlZGVmIDp1aW50LCA6ZnViYXJfdAorICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpwYWNrX3ZhcmFyZ3MsIFsgOmJ1ZmZlcl9vdXQsIDpzdHJpbmcsIDp2YXJhcmdzIF0sIDp2b2lkCisgICAgZW5kCisgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDp1aW50LCAxMAorICAgIFZhcmlhZGljQ3VzdG9tVHlwZWRlZi5wYWNrX3ZhcmFyZ3MoYnVmLCAiaSIsIDpmdWJhcl90LCAweDEyMzQ1Njc4KQorICAgIGV4cGVjdChidWYuZ2V0X2ludDY0KDApKS50byBlcSgweDEyMzQ1Njc4KQorICBlbmQKKworICBpdCAiQ2FsbGJhY2sgd2l0aCBjdXN0b20gdHlwZWRlZiBwYXJhbWV0ZXIiIGRvCisgICAgbW9kdWxlIENhbGxiYWNrQ3VzdG9tVHlwZWRlZgorICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgZmZpX2xpYiBUZXN0TGlicmFyeTo6UEFUSAorICAgICAgdHlwZWRlZiA6dWludCwgOmZ1YmFyM190CisgICAgICBjYWxsYmFjayA6Y2JJclYsIFsgOmZ1YmFyM190IF0sIDp2b2lkCisgICAgICBhdHRhY2hfZnVuY3Rpb24gOnRlc3RDYWxsYmFja1UzMnJWLCA6dGVzdENsb3N1cmVJclYsIFsgOmNiSXJWLCA6ZnViYXIzX3QgXSwgOnZvaWQKKyAgICBlbmQKKyAgICBpID0gMAorICAgIENhbGxiYWNrQ3VzdG9tVHlwZWRlZi50ZXN0Q2FsbGJhY2tVMzJyVigweGRlYWRiZWVmKSB7IHx2fCBpID0gdiB9CisgICAgZXhwZWN0KGkpLnRvIGVxKDB4ZGVhZGJlZWYpCisgIGVuZAorICAgIG1vZHVsZSBTdHJ1Y3RDdXN0b21UeXBlZGVmCisgICAgICBleHRlbmQgRkZJOjpMaWJyYXJ5CisgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICB0eXBlZGVmIDp1aW50LCA6ZnViYXIzX3QKKyAgICAgIGNsYXNzIFMgPCBGRkk6OlN0cnVjdAorICAgICAgICBsYXlvdXQgOmEsIDpmdWJhcjNfdAorICAgICAgZW5kCisgICAgZW5kCisKKyAgaXQgIlN0cnVjdCB3aXRoIGN1c3RvbSB0eXBlZGVmIGZpZWxkIiBkbworICAgIHMgPSBTdHJ1Y3RDdXN0b21UeXBlZGVmOjpTLm5ldworICAgIHNbOmFdID0gMHgxMjM0NTY3OAorICAgIGV4cGVjdChzLnBvaW50ZXIuZ2V0X3VpbnQoMCkpLnRvIGVxKDB4MTIzNDU2NzgpCisgIGVuZAorCisgIGl0ICJhdHRhY2hfZnVuY3Rpb24gYWZ0ZXIgYSB0eXBlZGVmIHNob3VsZCBub3QgcmVqZWN0IG5vcm1hbCB0eXBlcyIgZG8KKyAgICBleHBlY3QgZG8KKyAgICAgIE1vZHVsZS5uZXcgZG8KKyAgICAgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgICAgICAjIGVudW0oKSB3aWxsIGluc2VydCBhIGN1c3RvbSB0eXBlZGVmIGNhbGxlZCA6Zm9vIGZvciB0aGUgZW51bQorICAgICAgICBlbnVtIDpmb28sIFsgOmEsIDpiIF0KKyAgICAgICAgdHlwZWRlZiA6aW50LCA6YmFyCisgICAgICAgIAorICAgICAgICBmZmlfbGliIFRlc3RMaWJyYXJ5OjpQQVRICisgICAgICAgIGJlZ2luCisgICAgICAgICAgYXR0YWNoX2Z1bmN0aW9uIDpwdHJfcmV0X2ludDMyX3QsIFsgOnN0cmluZywgOmZvbyBdLCA6YmFyCisgICAgICAgIHJlc2N1ZSBGRkk6Ok5vdEZvdW5kRXJyb3IKKyAgICAgICAgICAjIE5ldEJTRCB1c2VzICNkZWZpbmUgaW5zdGVhZCBvZiB0eXBlZGVmIGZvciB0aGVzZQorICAgICAgICAgIGF0dGFjaF9mdW5jdGlvbiA6cHRyX3JldF9pbnQzMl90LCA6cHRyX3JldF9fX2ludDMyX3QsIFsgOnN0cmluZywgOmZvbyBdLCA6YmFyCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kLm5vdF90byByYWlzZV9lcnJvcgorICBlbmQKKworICBpdCAiZGV0ZWN0cyB0aGUgY29ycmVjdCB0eXBlIGZvciBzaXplX3QiIGRvCisgICAgZXhwZWN0IGRvCisgICAgICBNb2R1bGUubmV3IGRvCisgICAgICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICAgICAgZmZpX2xpYiAiYyIKKyAgICAgICAgaWYgRkZJOjpQbGF0Zm9ybS53aW5kb3dzPworICAgICAgICAgICMgX3JlYWQoKSBpcyBhIGZ1bmN0aW9uIG9mIG1zdmNydC5kbGwKKyAgICAgICAgICBhdHRhY2hfZnVuY3Rpb24gOl9yZWFkLCBbOmludCwgOnBvaW50ZXIsIDp1aW50XSwgOmludAorICAgICAgICBlbHNlCisgICAgICAgICAgIyByZWFkKDIpIGlzIGEgc3RhbmRhcmQgVU5JWCBmdW5jdGlvbgorICAgICAgICAgIGF0dGFjaF9mdW5jdGlvbiA6cmVhZCwgWzppbnQsIDpwb2ludGVyLCA6c2l6ZV90XSwgOnNzaXplX3QKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQubm90X3RvIHJhaXNlX2Vycm9yCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3VuaW9uX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvZmZpL3VuaW9uX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViZjdlYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvdW5pb25fc3BlYy5yYgpAQCAtMCwwICsxLDY3IEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCittb2R1bGUgTGliVGVzdAorICBUeXBlcyA9IHsKKyAgICAnczgnID0+IFs6Y2hhciwgOmMsIDFdLAorICAgICdzMTYnID0+IFs6c2hvcnQsIDpzLCAweGZmMF0sIAorICAgICdzMzInID0+IFs6aW50LCA6aSwgMHhmZjAwXSwKKyAgICAnczY0JyA9PiBbOmxvbmdfbG9uZywgOmosIDB4ZmZmZjAwXSwKKyAgICAnbG9uZycgPT4gWzpsb25nLCA6bCwgMHhmZmZmXSwKKyAgICAnZjMyJyA9PiBbOmZsb2F0LCA6ZiwgMS4wMDAxXSwKKyAgICAnZjY0JyA9PiBbOmRvdWJsZSwgOmQsIDEuMDAwMDAwMDAxXQorICB9CisgIGNsYXNzIFRlc3RVbmlvbiA8IEZGSTo6VW5pb24KKyAgICBsYXlvdXQoIDphLCBbOmNoYXIsIDEwXSwgCisgICAgICAgICAgICA6aSwgOmludCwgCisgICAgICAgICAgICA6ZiwgOmZsb2F0LAorICAgICAgICAgICAgOmQsIDpkb3VibGUsCisgICAgICAgICAgICA6cywgOnNob3J0LAorICAgICAgICAgICAgOmwsIDpsb25nLAorICAgICAgICAgICAgOmosIDpsb25nX2xvbmcsCisgICAgICAgICAgICA6YywgOmNoYXIgKQorICBlbmQKKyAgVHlwZXMua2V5cy5lYWNoIGRvIHxrfCAKKyAgICBhdHRhY2hfZnVuY3Rpb24gInVuaW9uX2FsaWduXyN7a30iLCBbIDpwb2ludGVyIF0sIFR5cGVzW2tdWzBdCisgICAgYXR0YWNoX2Z1bmN0aW9uICJ1bmlvbl9tYWtlX3VuaW9uX3dpdGhfI3trfSIsIFsgVHlwZXNba11bMF0gXSwgOnBvaW50ZXIKKyAgZW5kCisgIGF0dGFjaF9mdW5jdGlvbiA6dW5pb25fc2l6ZSwgW10sIDp1aW50CitlbmQKKworZGVzY3JpYmUgJ1VuaW9uJyBkbworICBiZWZvcmUgZG8KKyAgICBAdSA9IExpYlRlc3Q6OlRlc3RVbmlvbi5uZXcKKyAgZW5kCisKKyAgaXQgJ3Nob3VsZCBwbGFjZSBhbGwgdGhlIGZpZWxkcyBhdCBvZmZzZXQgMCcgZG8KKyAgICBleHBlY3QoTGliVGVzdDo6VGVzdFVuaW9uLm1lbWJlcnMuYWxsPyB7IHxtfCBMaWJUZXN0OjpUZXN0VW5pb24ub2Zmc2V0X29mKG0pID09IDAgfSkudG8gYmUgdHJ1ZQorICBlbmQKKyAgTGliVGVzdDo6VHlwZXMuZWFjaCBkbyB8aywgdHlwZXwKKyAgICBpdCAic2hvdWxkIGNvcnJlY3RseSBhbGlnbi93cml0ZSBhICN7dHlwZVswXX0gdmFsdWUiIGRvCisgICAgICBAdVt0eXBlWzFdXSA9IHR5cGVbMl0KKyAgICAgIGlmIGsgPT0gJ2YzMicgb3IgayA9PSAnZjY0JworICAgICAgICBleHBlY3QoKEB1W3R5cGVbMV1dIC0gTGliVGVzdC5zZW5kKCJ1bmlvbl9hbGlnbl8je2t9IiwgQHUudG9fcHRyKSkuYWJzKS50byBiZSA8IDAuMDAwMDEKKyAgICAgIGVsc2UKKyAgICAgICAgZXhwZWN0KEB1W3R5cGVbMV1dKS50byBlcShMaWJUZXN0LnNlbmQoInVuaW9uX2FsaWduXyN7a30iLCBAdS50b19wdHIpKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorICBMaWJUZXN0OjpUeXBlcy5lYWNoIGRvIHxrLCB0eXBlfAorICAgIGl0ICJzaG91bGQgcmVhZCBhICN7dHlwZVswXX0gdmFsdWUgZnJvbSBtZW1vcnkiIGRvCisgICAgICBAdSA9IExpYlRlc3Q6OlRlc3RVbmlvbi5uZXcoTGliVGVzdC5zZW5kKCJ1bmlvbl9tYWtlX3VuaW9uX3dpdGhfI3trfSIsIHR5cGVbMl0pKQorICAgICAgaWYgayA9PSAnZjMyJyBvciBrID09ICdmNjQnCisgICAgICAgIGV4cGVjdCgoQHVbdHlwZVsxXV0gLSB0eXBlWzJdKS5hYnMpLnRvIGJlIDwgMC4wMDAwMQorICAgICAgZWxzZQorICAgICAgICBleHBlY3QoQHVbdHlwZVsxXV0pLnRvIGVxKHR5cGVbMl0pCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgJ3Nob3VsZCByZXR1cm4gYSBzaXplIGVxdWFscyB0byB0aGUgc2l6ZSBvZiB0aGUgYmlnZ2VzdCBmaWVsZCcgZG8KKyAgICBleHBlY3QoTGliVGVzdDo6VGVzdFVuaW9uLnNpemUpLnRvIGVxKExpYlRlc3QudW5pb25fc2l6ZSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvdmFyaWFkaWNfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZmaS0xLjkuMTgvc3BlYy9mZmkvdmFyaWFkaWNfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzcyOTJlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL2ZmaS92YXJpYWRpY19zcGVjLnJiCkBAIC0wLDAgKzEsMTMyIEBACisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHJ1YnktZmZpLgorIyBGb3IgbGljZW5zaW5nLCBzZWUgTElDRU5TRS5TUEVDUworIworCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJzcGVjX2hlbHBlciIpKQorCitkZXNjcmliZSAiRnVuY3Rpb24gd2l0aCB2YXJpYWRpYyBhcmd1bWVudHMiIGRvCisgIG1vZHVsZSBMaWJUZXN0CisgICAgZXh0ZW5kIEZGSTo6TGlicmFyeQorICAgIGZmaV9saWIgVGVzdExpYnJhcnk6OlBBVEgKKyAgICBlbnVtIDplbnVtX3R5cGUxLCBbOmMxLCA6YzJdCisgICAgZW51bSA6ZW51bV90eXBlMiwgWzpjMywgNDIsIDpjNF0KKyAgICBhdHRhY2hfZnVuY3Rpb24gOnBhY2tfdmFyYXJncywgWyA6YnVmZmVyX291dCwgOnN0cmluZywgOnZhcmFyZ3MgXSwgOnZvaWQKKyAgICBhdHRhY2hfZnVuY3Rpb24gOnBhY2tfdmFyYXJnczIsIFsgOmJ1ZmZlcl9vdXQsIDplbnVtX3R5cGUxLCA6c3RyaW5nLCA6dmFyYXJncyBdLCA6ZW51bV90eXBlMQorCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0QmxvY2tpbmdPcGVuLCBbIF0sIDpwb2ludGVyCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0QmxvY2tpbmdSV3ZhLCBbIDpwb2ludGVyLCA6Y2hhciwgOnZhcmFyZ3MgXSwgOmNoYXIsIDpibG9ja2luZyA9PiB0cnVlCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0QmxvY2tpbmdXUnZhLCBbIDpwb2ludGVyLCA6Y2hhciwgOnZhcmFyZ3MgXSwgOmNoYXIsIDpibG9ja2luZyA9PiB0cnVlCisgICAgYXR0YWNoX2Z1bmN0aW9uIDp0ZXN0QmxvY2tpbmdDbG9zZSwgWyA6cG9pbnRlciBdLCA6dm9pZAorICBlbmQKKworICBpdCAidGFrZXMgZW51bSBhcmd1bWVudHMiIGRvCisgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDpsb25nX2xvbmcsIDIKKyAgICBMaWJUZXN0LnBhY2tfdmFyYXJncyhidWYsICJpaSIsIDppbnQsIDpjMywgOmludCwgOmM0KQorICAgIGV4cGVjdChidWYuZ2V0X2ludDY0KDApKS50byBlcSg0MikKKyAgICBleHBlY3QoYnVmLmdldF9pbnQ2NCg4KSkudG8gZXEoNDMpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIHN5bWJvbHMgZm9yIGVudW1zIiBkbworICAgIGJ1ZiA9IEZGSTo6QnVmZmVyLm5ldyA6bG9uZ19sb25nLCAyCisgICAgZXhwZWN0KExpYlRlc3QucGFja192YXJhcmdzMihidWYsIDpjMSwgImlpIiwgOmludCwgOmMzLCA6aW50LCA6YzQpKS50byBlcSg6YzIpCisgIGVuZAorCisgIGl0ICdjYW4gd3JhcCBhIGJsb2NraW5nIGZ1bmN0aW9uIHdpdGggdmFyYXJncycgZG8KKyAgICBwZW5kaW5nKCJub3Qgc3VwcG9ydGVkIGluIDEuOCIpIGlmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjhcLi4qLworICAgIGhhbmRsZSA9IExpYlRlc3QudGVzdEJsb2NraW5nT3BlbgorICAgIGV4cGVjdChoYW5kbGUpLm5vdF90byBiZV9udWxsCisgICAgYmVnaW4KKyAgICAgIHRoV1IgPSBUaHJlYWQubmV3IHsgTGliVGVzdC50ZXN0QmxvY2tpbmdXUnZhKGhhbmRsZSwgNjMsIDppbnQsIDQwLCA6aW50LCAyMywgOmludCwgMCkgfQorICAgICAgdGhSVyA9IFRocmVhZC5uZXcgeyBMaWJUZXN0LnRlc3RCbG9ja2luZ1JXdmEoaGFuZGxlLCA2NCwgOmludCwgNDAsIDppbnQsIDI0LCA6aW50LCAwKSB9CisgICAgICBleHBlY3QodGhXUi52YWx1ZSkudG8gZXEoNjQpCisgICAgICBleHBlY3QodGhSVy52YWx1ZSkudG8gZXEoNjMpCisgICAgZW5zdXJlCisgICAgICBMaWJUZXN0LnRlc3RCbG9ja2luZ0Nsb3NlKGhhbmRsZSkKKyAgICBlbmQKKyAgZW5kCisKKyAgWyAwLCAxMjcsIC0xMjgsIC0xIF0uZWFjaCBkbyB8aXwKKyAgICBpdCAiY2FsbCB2YXJpYWRpYyB3aXRoICg6Y2hhciAoI3tpfSkpIGFyZ3VtZW50IiBkbworICAgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDpsb25nX2xvbmcKKyAgICAgIExpYlRlc3QucGFja192YXJhcmdzKGJ1ZiwgImMiLCA6Y2hhciwgaSkKKyAgICAgIGV4cGVjdChidWYuZ2V0X2ludDY0KDApKS50byBlcShpKQorICAgIGVuZAorICBlbmQKKworICBbIDAsIDB4N2YsIDB4ODAsIDB4ZmYgXS5lYWNoIGRvIHxpfAorICAgIGl0ICJjYWxsIHZhcmlhZGljIHdpdGggKDp1Y2hhciAoI3tpfSkpIGFyZ3VtZW50IiBkbworICAgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDpsb25nX2xvbmcKKyAgICAgIExpYlRlc3QucGFja192YXJhcmdzKGJ1ZiwgIkMiLCA6dWNoYXIsIGkpCisgICAgICBleHBlY3QoYnVmLmdldF9pbnQ2NCgwKSkudG8gZXEoaSkKKyAgICBlbmQKKyAgZW5kCisKKyAgWyAwLCAxLjIzNDU2NywgOS44NzY1NDMyMSBdLmVhY2ggZG8gfHZ8CisgICAgaXQgImNhbGwgdmFyaWFkaWMgd2l0aCAoOmZsb2F0ICgje3Z9KSkgYXJndW1lbnQiIGRvCisgICAgICBidWYgPSBGRkk6OkJ1ZmZlci5uZXcgOmxvbmdfbG9uZworICAgICAgTGliVGVzdC5wYWNrX3ZhcmFyZ3MoYnVmLCAiZiIsIDpmbG9hdCwgdi50b19mKQorICAgICAgZXhwZWN0KGJ1Zi5nZXRfZmxvYXQ2NCgwKSkudG8gZXEodikKKyAgICBlbmQKKyAgZW5kCisKKyAgWyAwLCAxLjIzNDU2NywgOS44NzY1NDMyMSBdLmVhY2ggZG8gfHZ8CisgICAgaXQgImNhbGwgdmFyaWFkaWMgd2l0aCAoOmRvdWJsZSAoI3t2fSkpIGFyZ3VtZW50IiBkbworICAgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDpsb25nX2xvbmcKKyAgICAgIExpYlRlc3QucGFja192YXJhcmdzKGJ1ZiwgImYiLCA6ZG91YmxlLCB2LnRvX2YpCisgICAgICBleHBlY3QoYnVmLmdldF9mbG9hdDY0KDApKS50byBlcSh2KQorICAgIGVuZAorICBlbmQKKworICBtb2R1bGUgVmFyYXJncworICAgIFBBQ0tfVkFMVUVTID0geworICAgICAgJ2MnID0+IFsgMHgxMiAgXSwKKyAgICAgICdDJyA9PiBbIDB4MzQgIF0sCisgICAgICAncycgPT4gWyAweDU2NzggXSwKKyAgICAgICdTJyA9PiBbIDB4OWFiYyBdLAorICAgICAgJ2knID0+IFsgMHg3NjU0MzIxZiBdLAorICAgICAgJ0knID0+IFsgMHhmZWUxYmFiZSBdLAorICAgICAgJ2wnID0+IFsgMHgxZjJlM2Q0YyBdLAorICAgICAgJ0wnID0+IFsgMHhmN2U4ZDljYSBdLAorICAgICAgJ2onID0+IFsgMHgxZWFmZGVhZGJlZWZhMWIyIF0sCisgICAgICAnZicgPT4gWyAxLjIzNDU2Nzg5IF0sCisgICAgICAnZCcgPT4gWyA5Ljg3NjU0MzIxIF0KKyAgICB9CisKKyAgICBUWVBFX01BUCA9IHsKKyAgICAgICdjJyA9PiA6Y2hhciwgJ0MnID0+IDp1Y2hhciwgJ3MnID0+IDpzaG9ydCwgJ1MnID0+IDp1c2hvcnQsCisgICAgICAnaScgPT4gOmludCwgJ0knID0+IDp1aW50LCAnaicgPT4gOmxvbmdfbG9uZywgJ0onID0+IDp1bG9uZ19sb25nLAorICAgICAgJ2wnID0+IDpsb25nLCAnTCcgPT4gOnVsb25nLCAnZicgPT4gOmZsb2F0LCAnZCcgPT4gOmRvdWJsZQorICAgIH0KKyAgZW5kCisKKyAgZGVmIHZlcmlmeShwLCBvZmYsIHYpCisgICAgaWYgdi5raW5kX29mPyhGbG9hdCkKKyAgICAgIGV4cGVjdChwLmdldF9mbG9hdDY0KG9mZikpLnRvIGVxKHYpCisgICAgZWxzZQorICAgICAgZXhwZWN0KHAuZ2V0X2ludDY0KG9mZikpLnRvIGVxKHYpCisgICAgZW5kCisgIGVuZAorCisgIFZhcmFyZ3M6OlBBQ0tfVkFMVUVTLmtleXMuZWFjaCBkbyB8dDF8CisgICAgVmFyYXJnczo6UEFDS19WQUxVRVMua2V5cy5lYWNoIGRvIHx0MnwKKyAgICAgIFZhcmFyZ3M6OlBBQ0tfVkFMVUVTLmtleXMuZWFjaCBkbyB8dDN8CisgICAgICAgIFZhcmFyZ3M6OlBBQ0tfVkFMVUVTW3QxXS5lYWNoIGRvIHx2MXwKKyAgICAgICAgICBWYXJhcmdzOjpQQUNLX1ZBTFVFU1t0Ml0uZWFjaCBkbyB8djJ8CisgICAgICAgICAgICBWYXJhcmdzOjpQQUNLX1ZBTFVFU1t0M10uZWFjaCBkbyB8djN8CisgICAgICAgICAgICAgIGZtdCA9ICIje3QxfSN7dDJ9I3t0M30iCisgICAgICAgICAgICAgIHBhcmFtcyA9IFsgVmFyYXJnczo6VFlQRV9NQVBbdDFdLCB2MSwgVmFyYXJnczo6VFlQRV9NQVBbdDJdLCB2MiwgVmFyYXJnczo6VFlQRV9NQVBbdDNdLCB2MyBdCisgICAgICAgICAgICAgIGl0ICJjYWxsKCN7Zm10fSwgI3twYXJhbXMuam9pbignLCcpfSkiIGRvCisgICAgICAgICAgICAgICAgYnVmID0gRkZJOjpCdWZmZXIubmV3IDpsb25nX2xvbmcsIDMKKyAgICAgICAgICAgICAgICBMaWJUZXN0LnBhY2tfdmFyYXJncyhidWYsIGZtdCwgKnBhcmFtcykKKyAgICAgICAgICAgICAgICB2ZXJpZnkoYnVmLCAwLCB2MSkKKyAgICAgICAgICAgICAgICB2ZXJpZnkoYnVmLCA4LCB2MikKKyAgICAgICAgICAgICAgICB2ZXJpZnkoYnVmLCAxNiwgdjMpCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mZmktMS45LjE4L3NwZWMvc3BlYy5vcHRzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL3NwZWMub3B0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGEwMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZmZpLTEuOS4xOC9zcGVjL3NwZWMub3B0cwpAQCAtMCwwICsxLDQgQEAKKy0tY29sb3IKKy13CistLWZvcm1hdAorZG9jdW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZm9yd2FyZGFibGUtZXh0ZW5kZWQtMi42LjAvR2VtZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZvcndhcmRhYmxlLWV4dGVuZGVkLTIuNi4wL0dlbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1ODdjNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZvcndhcmRhYmxlLWV4dGVuZGVkLTIuNi4wL0dlbWZpbGUKQEAgLTAsMCArMSwyNCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZyb3plbi1zdHJpbmctbGl0ZXJhbDogdHJ1ZQorIyBDb3B5cmlnaHQ6IDIwMTUtMjAxNiBKb3Jkb24gQmVkd2VsbCAtIE1JVCBMaWNlbnNlCisjIEVuY29kaW5nOiB1dGYtOAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NvdXJjZSAiaHR0cHM6Ly9ydWJ5Z2Vtcy5vcmciCitnZW0gInJha2UiLCA6cmVxdWlyZSA9PiBmYWxzZQorZ2Vtc3BlYworCitncm91cCA6dGVzdCBkbworICBnZW0gInJzcGVjLWhlbHBlcnMiLCA6cmVxdWlyZSA9PiBmYWxzZQorICBnZW0gImNvZGVjbGltYXRlLXRlc3QtcmVwb3J0ZXIiLCA6cmVxdWlyZSA9PiBmYWxzZQorICBnZW0gImx1bmEtcnNwZWMtZm9ybWF0dGVycyIsIDpyZXF1aXJlID0+IGZhbHNlCisgIGdlbSAicnNwZWMiLCA6cmVxdWlyZSA9PiBmYWxzZQorZW5kCisKK2dyb3VwIDpkZXZlbG9wbWVudCBkbworICBnZW0gImx1bmEtcnVib2NvcC1mb3JtYXR0ZXJzIiwgOnJlcXVpcmUgPT4gZmFsc2UKKyAgZ2VtICJydWJvY29wIiwgOmdpdGh1YiA9PiAiYmJhdHNvdi9ydWJvY29wIiwgOnJlcXVpcmUgPT4gZmFsc2UKKyAgZ2VtICJwcnkiLCB7CisgICAgOnJlcXVpcmUgPT4gZmFsc2UKKyAgfQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mb3J3YXJkYWJsZS1leHRlbmRlZC0yLjYuMC9MSUNFTlNFIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZm9yd2FyZGFibGUtZXh0ZW5kZWQtMi42LjAvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjAzYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZm9yd2FyZGFibGUtZXh0ZW5kZWQtMi42LjAvTElDRU5TRQpAQCAtMCwwICsxLDE5IEBACitDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBKb3Jkb24gQmVkd2VsbAorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCitTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZvcndhcmRhYmxlLWV4dGVuZGVkLTIuNi4wL1Jha2VmaWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZm9yd2FyZGFibGUtZXh0ZW5kZWQtMi42LjAvUmFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5MjllNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZvcndhcmRhYmxlLWV4dGVuZGVkLTIuNi4wL1Jha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGcm96ZW4tc3RyaW5nLWxpdGVyYWw6IHRydWUKKyMgQ29weXJpZ2h0OiAyMDE1LTIwMTYgSm9yZG9uIEJlZHdlbGwgLSBNSVQgTGljZW5zZQorIyBFbmNvZGluZzogdXRmLTgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiskTE9BRF9QQVRILnVuc2hpZnQoRmlsZS5leHBhbmRfcGF0aCgiLi4vbGliIiwgX19GSUxFX18pKQorcmVxdWlyZSAibHVuYS9ydWJvY29wL3Jha2UvdGFzayIKK3JlcXVpcmUgInJzcGVjL2NvcmUvcmFrZV90YXNrIgorCit0YXNrIDpkZWZhdWx0ID0+IFs6c3BlY10KK1JTcGVjOjpDb3JlOjpSYWtlVGFzay5uZXcgOnNwZWMKK3Rhc2sgOnRlc3QgPT4gOnNwZWMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZvcndhcmRhYmxlLWV4dGVuZGVkLTIuNi4wL2xpYi9mb3J3YXJkYWJsZS9leHRlbmRlZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2ZvcndhcmRhYmxlLWV4dGVuZGVkLTIuNi4wL2xpYi9mb3J3YXJkYWJsZS9leHRlbmRlZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzY5NGNmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZm9yd2FyZGFibGUtZXh0ZW5kZWQtMi42LjAvbGliL2ZvcndhcmRhYmxlL2V4dGVuZGVkLnJiCkBAIC0wLDAgKzEsMjAyIEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnJvemVuLXN0cmluZy1saXRlcmFsOiB0cnVlCisjIENvcHlyaWdodDogMjAxNS0yMDE2IEpvcmRvbiBCZWR3ZWxsIC0gTUlUIExpY2Vuc2UKKyMgRW5jb2Rpbmc6IHV0Zi04CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVxdWlyZSAiZm9yd2FyZGFibGUvZXh0ZW5kZWQvdmVyc2lvbiIKK3JlcXVpcmUgImZvcndhcmRhYmxlIgorCittb2R1bGUgRm9yd2FyZGFibGUKKyAgbW9kdWxlIEV4dGVuZGVkCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgTWFrZSBvdXIgbWV0aG9kcyBwcml2YXRlIG9uIHRoZSBjbGFzcywgdGhlcmUgaXMgbm8gcmVhc29uIGZvciBwdWJsaWMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBzZWxmLmV4dGVuZGVkKGtsYXNzKQorICAgICAgaW5zdGFuY2VfbWV0aG9kcy5lYWNoIGRvIHxtZXRob2R8CisgICAgICAgIGtsYXNzLnByaXZhdGVfY2xhc3NfbWV0aG9kKAorICAgICAgICAgIG1ldGhvZAorICAgICAgICApCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBEZWxlZ2F0ZSB1c2luZyBhIFJhaWxzLWxpa2UgaW50ZXJmYWNlLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgcmJfZGVsZWdhdGUobWV0aG9kLCB0bzogbmlsLCBhbGlhc19vZjogbWV0aG9kLCAqKmt3ZCkKKyAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJ0byBtdXN0IGJlIHByb3ZpZGVkIiB1bmxlc3MgdG8KKyAgICAgIGRlZl9kZWxlZ2F0b3IoCisgICAgICAgIHRvLCBhbGlhc19vZiwgbWV0aG9kLCAqKmt3ZAorICAgICAgKQorICAgIGVuZAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIERlbGVnYXRlIGEgbWV0aG9kIHRvIGEgaGFzaCBhbmQga2V5LgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZGVmX2hhc2hfZGVsZWdhdG9yKGhhc2gsIG1ldGhvZCwga2V5OiBtZXRob2QsICoqa3dkKQorICAgICAgcHJlZml4LCBzdWZmaXgsIHdyYXAgPSBwcmVwYXJlX2RlbGVnYXRlKCoqa3dkKQorCisgICAgICBpZiBzdWZmaXgKKyAgICAgICAgbWV0aG9kID0gbWV0aG9kLnRvX3MuZ3N1YigKKyAgICAgICAgICAvXD8kLywgIiIKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGNsYXNzX2V2YWwgZGVsZWdhdGVfZGVidWcoPDwtU1RSKSwgX19GSUxFX18sIF9fTElORV9fIC0gOQorICAgICAgICBkZWYgI3ttZXRob2R9I3tzdWZmaXh9KCphcmdzKQorICAgICAgICAgICN7d3JhcH0oCisgICAgICAgICAgICAje3ByZWZpeH0je2hhc2h9WyN7a2V5Lmluc3BlY3R9XQorICAgICAgICAgICkKKworICAgICAgICByZXNjdWUgRXhjZXB0aW9uCisgICAgICAgICAgaWYgIUZvcndhcmRhYmxlLmRlYnVnICYmICRAICYmICRALnJlc3BvbmRfdG8/KDpkZWxldGVfaWYpCisgICAgICAgICAgICAkQC5kZWxldGVfaWYgZG8gfHNvdXJjZXwKKyAgICAgICAgICAgICAgc291cmNlID1+ICVyIiN7UmVnZXhwLmVzY2FwZShfX0ZJTEVfXyl9Im8KKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorCisgICAgICAgICAgcmFpc2UKKyAgICAgICAgZW5kCisgICAgICBTVFIKKyAgICBlbmQKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBEZWxlZ2F0ZSBhIG1ldGhvZCB0byBhbiBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGRlZl9pdmFyX2RlbGVnYXRvcihpdmFyLCBhbGlhc18gPSBpdmFyLCAqKmt3ZCkKKyAgICAgIHByZWZpeCwgc3VmZml4LCB3cmFwID0gcHJlcGFyZV9kZWxlZ2F0ZSgqKmt3ZCkKKworICAgICAgaWYgc3VmZml4CisgICAgICAgIGFsaWFzXyA9IGFsaWFzXy50b19zLmdzdWIoCisgICAgICAgICAgL1w/JC8sICIiCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBjbGFzc19ldmFsIGRlbGVnYXRlX2RlYnVnKDw8LVNUUiksIF9fRklMRV9fLCBfX0xJTkVfXyAtIDkKKyAgICAgICAgZGVmICN7YWxpYXNfLnRvX3MuZ3N1YigvXEFALywgIiIpfSN7c3VmZml4fQorICAgICAgICAgICN7d3JhcH0oCisgICAgICAgICAgICAje3ByZWZpeH0je2l2YXJ9CisgICAgICAgICAgKQorCisgICAgICAgIHJlc2N1ZSBFeGNlcHRpb24KKyAgICAgICAgICBpZiAhRm9yd2FyZGFibGUuZGVidWcgJiYgJEAgJiYgJEAucmVzcG9uZF90bz8oOmRlbGV0ZV9pZikKKyAgICAgICAgICAgICRALmRlbGV0ZV9pZiBkbyB8c291cmNlfAorICAgICAgICAgICAgICBzb3VyY2UgPX4gJXIiI3tSZWdleHAuZXNjYXBlKF9fRklMRV9fKX0ibworICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICByYWlzZQorICAgICAgICBlbmQKKyAgICAgIFNUUgorICAgIGVuZAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIExpa2UgZGVmX2RlbGVnYXRvciBidXQgYWxsb3dzIHlvdSB0byBzZW5kIGFyZ3MgYW5kIGRvIG90aGVyIHN0dWZmLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZGVmX21vZGVybl9kZWxlZ2F0b3IoYWNjZXNzb3IsIG1ldGhvZCwgYWxpYXNfID0gbWV0aG9kLCBhcmdzOiBcCisgICAgICAgIHsgOmJlZm9yZSA9PiBbXSwgOmFmdGVyID0+IFtdIH0sICoqa3dkKQorCisgICAgICBwcmVmaXgsIHN1ZmZpeCwgd3JhcCA9IHByZXBhcmVfZGVsZWdhdGUoKiprd2QpCisgICAgICBhcmdzID0geyA6YmVmb3JlID0+IGFyZ3MgfSB1bmxlc3MgYXJncy5pc19hPyhIYXNoKQorICAgICAgYiA9IFthcmdzWzpiZWZvcmVdXS5mbGF0dGVuLmNvbXBhY3QubWFwKCY6dG9fcykuam9pbigiLCAiKQorICAgICAgYSA9IFthcmdzWyA6YWZ0ZXJdXS5mbGF0dGVuLmNvbXBhY3QubWFwKCY6dG9fcykuam9pbigiLCAiKQorICAgICAgYiA9IGIgKyAiLCAiIHVubGVzcyBhcmdzWzpiZWZvcmVdLm5pbD8gfHwgYXJnc1s6YmVmb3JlXS5lbXB0eT8KKyAgICAgIGEgPSAiLCAiICsgYSB1bmxlc3MgYXJnc1sgOmFmdGVyXS5uaWw/IHx8IGFyZ3NbIDphZnRlcl0uZW1wdHk/CisgICAgICBhbGlhc18gPSBhbGlhc18udG9fcy5nc3ViKC9cPyQvLCAiIikgaWYgc3VmZml4CisKKyAgICAgIGNsYXNzX2V2YWwgZGVsZWdhdGVfZGVidWcoPDwtU1RSKSwgX19GSUxFX18sIF9fTElORV9fIC0gMTAKKyAgICAgICAgZGVmICN7YWxpYXNffSN7c3VmZml4fSgqYXJncywgJmJsb2NrKQorICAgICAgICAgICN7d3JhcH0oI3twcmVmaXh9I3thY2Nlc3Nvcn0uc2VuZCgKKyAgICAgICAgICAgICN7bWV0aG9kLmluc3BlY3R9LCAje2J9KmFyZ3Mje2F9LCAmYmxvY2sKKyAgICAgICAgICApKQorCisgICAgICAgIHJlc2N1ZSBFeGNlcHRpb24KKyAgICAgICAgICBpZiAhRm9yd2FyZGFibGUuZGVidWcgJiYgJEAgJiYgJEAucmVzcG9uZF90bz8oOmRlbGV0ZV9pZikKKyAgICAgICAgICAgICRALmRlbGV0ZV9pZiBkbyB8c291cmNlfAorICAgICAgICAgICAgICBzb3VyY2UgPX4gJXIiI3tSZWdleHAuZXNjYXBlKF9fRklMRV9fKX0ibworICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICByYWlzZQorICAgICAgICBlbmQKKyAgICAgIFNUUgorICAgIGVuZAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFdyYXBzIGFyb3VuZCB0cmFkaXRpb25hbCBkZWxlZ2F0aW9uIGFuZCBtb2Rlcm4gZGVsZWdhdGlvbi4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGRlZl9kZWxlZ2F0b3IoYWNjZXNzb3IsIG1ldGhvZCwgYWxpYXNfID0gbWV0aG9kLCAqKmt3ZCkKKyAgICAgIGt3ZCwgYWxpYXNfID0gYWxpYXNfLCBtZXRob2QgaWYgYWxpYXNfLmlzX2E/KEhhc2gpICYmICFrd2QuYW55PworCisgICAgICBpZiBhbGlhc18uaXNfYT8oSGFzaCkgfHwgIWt3ZC5hbnk/CisgICAgICAgIEZvcndhcmRhYmxlLmluc3RhbmNlX21ldGhvZCg6ZGVmX2RlbGVnYXRvcikuYmluZChzZWxmKSBcCisgICAgICAgICAgLmNhbGwoYWNjZXNzb3IsIG1ldGhvZCwgYWxpYXNfKQorCisgICAgICBlbHNpZiAha3dkWzp0eXBlXQorICAgICAgICBkZWZfbW9kZXJuX2RlbGVnYXRvcigKKyAgICAgICAgICBhY2Nlc3NvciwgbWV0aG9kLCBhbGlhc18sICoqa3dkCisgICAgICAgICkKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiQWxpYXMgbm90IHN1cHBvcnRlZC4iIGlmIGFsaWFzXyAhPSBtZXRob2QKKyAgICAgICAgc2VuZCgiZGVmXyN7a3dkWzp0eXBlXX1fZGVsZWdhdG9yIiwgYWNjZXNzb3IsIG1ldGhvZCwgKiprd2QudGFwIGRvIHxvYmp8CisgICAgICAgICAgb2JqLmRlbGV0ZSg6dHlwZSkKKyAgICAgICAgZW5kKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgQ3JlYXRlIG11bHRpcGxlIGRlbGVnYXRlcyBhdCBvbmNlLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZGVmX2RlbGVnYXRvcnMoYWNjZXNzb3IsICptZXRob2RzKQorICAgICAga3dkID0gbWV0aG9kcy5zaGlmdCBpZiBtZXRob2RzLmZpcnN0LmlzX2E/KEhhc2gpCisgICAgICBrd2QgPSBtZXRob2RzLnBvcCAgIGlmIG1ldGhvZHMuIGxhc3QuaXNfYT8oSGFzaCkKKyAgICAgIGt3ZCA9IHt9IHVubGVzcyBrd2QKKworICAgICAgbWV0aG9kcy5lYWNoIGRvIHxtZXRob2R8CisgICAgICAgIGRlZl9kZWxlZ2F0b3IgYWNjZXNzb3IsIG1ldGhvZCwgKiprd2QKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFByZXBhcmVzIGEgZGVsZWdhdGUgYW5kIGl0J3MgZmV3IGFyZ3VtZW50cy4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZQorICAgIGRlZiBwcmVwYXJlX2RlbGVnYXRlKHdyYXA6IG5pbCwgYm9vbDogZmFsc2UpCisgICAgICBwcmVmaXggPSAoYm9vbCA9PSA6cmV2ZXJzZSA/ICIhISEiIDogIiEhIikgaWYgYm9vbAorICAgICAgd3JhcCAgID0gInNlbGYuY2xhc3MubmV3IiBpZiB3cmFwLmlzX2E/KFRydWVDbGFzcykKKyAgICAgIHN1ZmZpeCA9ICI/IiBpZiBib29sCisKKyAgICAgIHJldHVybiBbCisgICAgICAgIHByZWZpeCwgc3VmZml4LCB3cmFwCisgICAgICBdCisgICAgZW5kCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZQorICAgIGRlZiBkZWxlZ2F0ZV9kZWJ1ZyhzdHIpCisgICAgICBpZiBGb3J3YXJkYWJsZS5kZWJ1ZyAmJiAhRm9yd2FyZGFibGUuZGVidWcuaXNfYT8oVHJ1ZUNsYXNzKQorICAgICAgICB0aGVuIEZvcndhcmRhYmxlLmRlYnVnLmRlYnVnKAorICAgICAgICAgIHN0cgorICAgICAgICApCisKKyAgICAgIGVsc2lmIEZvcndhcmRhYmxlLmRlYnVnCisgICAgICAgICRzdGRvdXQucHV0cygKKyAgICAgICAgICAiXG4jIC0tLS0tLVxuXG4iLCBzdHIKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIHN0cgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZm9yd2FyZGFibGUtZXh0ZW5kZWQtMi42LjAvbGliL2ZvcndhcmRhYmxlL2V4dGVuZGVkL3ZlcnNpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9mb3J3YXJkYWJsZS1leHRlbmRlZC0yLjYuMC9saWIvZm9yd2FyZGFibGUvZXh0ZW5kZWQvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM5Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvZm9yd2FyZGFibGUtZXh0ZW5kZWQtMi42LjAvbGliL2ZvcndhcmRhYmxlL2V4dGVuZGVkL3ZlcnNpb24ucmIKQEAgLTAsMCArMSw5IEBACisjIEZyb3plbi1zdHJpbmctbGl0ZXJhbDogdHJ1ZQorIyBDb3B5cmlnaHQ6IDIwMTUtMjAxNiBKb3Jkb24gQmVkd2VsbCAtIE1JVCBMaWNlbnNlCisjIEVuY29kaW5nOiB1dGYtOAorCittb2R1bGUgRm9yd2FyZGFibGUKKyAgbW9kdWxlIEV4dGVuZGVkCisgICAgVkVSU0lPTiA9ICIyLjYuMCIKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi8ucnVib2NvcC55bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvLnJ1Ym9jb3AueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjI2YmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvLnJ1Ym9jb3AueW1sCkBAIC0wLDAgKzEsMTUzIEBACistLS0KK0FsbENvcHM6CisgIFRhcmdldFJ1YnlWZXJzaW9uOiAyLjAKKyAgSW5jbHVkZToKKyAgICAtIGxpYi8qKi8qLnJiCisgIEV4Y2x1ZGU6CisgICAgLSBiaW4vKiovKgorICAgIC0gZXhlLyoqLyoKKyAgICAtIGJlbmNobWFyay8qKi8qCisgICAgLSBzY3JpcHQvKiovKgorICAgIC0gdmVuZG9yLyoqLyoKK0xheW91dC9BbGlnbkFycmF5OgorICBFbmFibGVkOiBmYWxzZQorTGF5b3V0L0FsaWduSGFzaDoKKyAgRW5mb3JjZWRIYXNoUm9ja2V0U3R5bGU6IHRhYmxlCitMYXlvdXQvQWxpZ25QYXJhbWV0ZXJzOgorICBFbmFibGVkOiBmYWxzZQorTGF5b3V0L0VtcHR5TGluZXNBcm91bmRBY2Nlc3NNb2RpZmllcjoKKyAgRW5hYmxlZDogZmFsc2UKK0xheW91dC9FbXB0eUxpbmVzQXJvdW5kTW9kdWxlQm9keToKKyAgRW5hYmxlZDogZmFsc2UKK0xheW91dC9FbmRPZkxpbmU6CisgIEVuZm9yY2VkU3R5bGU6IGxmCitMYXlvdXQvRXh0cmFTcGFjaW5nOgorICBBbGxvd0ZvckFsaWdubWVudDogdHJ1ZQorTGF5b3V0L0ZpcnN0UGFyYW1ldGVySW5kZW50YXRpb246CisgIEVuZm9yY2VkU3R5bGU6IGNvbnNpc3RlbnQKK0xheW91dC9JbmRlbnRhdGlvbldpZHRoOgorICBTZXZlcml0eTogZXJyb3IKK0xheW91dC9JbmRlbnRBcnJheToKKyAgRW5mb3JjZWRTdHlsZTogY29uc2lzdGVudAorTGF5b3V0L0luZGVudEhhc2g6CisgIEVuZm9yY2VkU3R5bGU6IGNvbnNpc3RlbnQKK0xheW91dC9JbmRlbnRIZXJlZG9jOgorICBFbmFibGVkOiBmYWxzZQorTGF5b3V0L011bHRpbGluZU1ldGhvZENhbGxJbmRlbnRhdGlvbjoKKyAgRW5mb3JjZWRTdHlsZTogaW5kZW50ZWQKK0xheW91dC9NdWx0aWxpbmVPcGVyYXRpb25JbmRlbnRhdGlvbjoKKyAgRW5mb3JjZWRTdHlsZTogaW5kZW50ZWQKK0xheW91dC9TcGFjZUFyb3VuZE9wZXJhdG9yczoKKyAgRW5hYmxlZDogdHJ1ZQorTGF5b3V0L1NwYWNlSW5zaWRlQnJhY2tldHM6CisgIEVuYWJsZWQ6IGZhbHNlCitMaW50L0VuZEFsaWdubWVudDoKKyAgU2V2ZXJpdHk6IGVycm9yCitMaW50L1VucmVhY2hhYmxlQ29kZToKKyAgU2V2ZXJpdHk6IGVycm9yCitMaW50L1VzZWxlc3NBY2Nlc3NNb2RpZmllcjoKKyAgRW5hYmxlZDogZmFsc2UKK01ldHJpY3MvQWJjU2l6ZToKKyAgTWF4OiAyMQorTWV0cmljcy9CbG9ja0xlbmd0aDoKKyAgRXhjbHVkZToKKyAgICAtIHRlc3QvKiovKi5yYgorICAgIC0gbGliL2pla3lsbC9jb25maWd1cmF0aW9uLnJiCisgICAgLSByYWtlLyoucmFrZQorICAgIC0gamVreWxsLmdlbXNwZWMKK01ldHJpY3MvQ2xhc3NMZW5ndGg6CisgIEV4Y2x1ZGU6CisgICAgLSAhcnVieS9yZWdleHAgL2ZlYXR1cmVzXC8uKi5yYiQvCisgICAgLSAhcnVieS9yZWdleHAgL3Rlc3RcLy4qLnJiJC8KKyAgTWF4OiAzMDAKK01ldHJpY3MvQ3ljbG9tYXRpY0NvbXBsZXhpdHk6CisgIE1heDogOQorTWV0cmljcy9MaW5lTGVuZ3RoOgorICBFeGNsdWRlOgorICAgIC0gIXJ1YnkvcmVnZXhwIC9mZWF0dXJlc1wvLioucmIvCisgICAgLSBSYWtlZmlsZQorICAgIC0gcmFrZS8qLnJha2UKKyAgICAtIEdlbWZpbGUKKyAgICAtIGpla3lsbC5nZW1zcGVjCisgIE1heDogOTAKKyAgU2V2ZXJpdHk6IHdhcm5pbmcKK01ldHJpY3MvTWV0aG9kTGVuZ3RoOgorICBDb3VudENvbW1lbnRzOiBmYWxzZQorICBNYXg6IDIwCisgIFNldmVyaXR5OiBlcnJvcgorTWV0cmljcy9Nb2R1bGVMZW5ndGg6CisgIE1heDogMjQwCitNZXRyaWNzL1BhcmFtZXRlckxpc3RzOgorICBNYXg6IDQKK01ldHJpY3MvUGVyY2VpdmVkQ29tcGxleGl0eToKKyAgTWF4OiA4CitTZWN1cml0eS9NYXJzaGFsTG9hZDoKKyAgRXhjbHVkZToKKyAgICAtICFydWJ5L3JlZ2V4cCAvdGVzdFwvLioucmIkLworICAgIC0gbGliL2pla3lsbC9yZWdlbmVyYXRvci5yYgorU2VjdXJpdHkvWUFNTExvYWQ6CisgIEV4Y2x1ZGU6CisgICAgLSAhcnVieS9yZWdleHAgL2ZlYXR1cmVzXC8uKi5yYi8KKyAgICAtICFydWJ5L3JlZ2V4cCAvdGVzdFwvLioucmIkLworU3R5bGUvQWxpYXM6CisgIEVuYWJsZWQ6IGZhbHNlCitTdHlsZS9BbmRPcjoKKyAgU2V2ZXJpdHk6IGVycm9yCitTdHlsZS9BdHRyOgorICBFbmFibGVkOiBmYWxzZQorU3R5bGUvQnJhY2VzQXJvdW5kSGFzaFBhcmFtZXRlcnM6CisgIEVuYWJsZWQ6IGZhbHNlCitTdHlsZS9DbGFzc0FuZE1vZHVsZUNoaWxkcmVuOgorICBFbmFibGVkOiBmYWxzZQorU3R5bGUvRG9jdW1lbnRhdGlvbjoKKyAgRW5hYmxlZDogZmFsc2UKKyAgRXhjbHVkZToKKyAgICAtICFydWJ5L3JlZ2V4cCAvZmVhdHVyZXNcLy4qLnJiJC8KK1N0eWxlL0RvdWJsZU5lZ2F0aW9uOgorICBFbmFibGVkOiBmYWxzZQorU3R5bGUvRmlsZU5hbWU6CisgIEVuYWJsZWQ6IGZhbHNlCitTdHlsZS9HdWFyZENsYXVzZToKKyAgRW5hYmxlZDogZmFsc2UKK1N0eWxlL0hhc2hTeW50YXg6CisgIEVuZm9yY2VkU3R5bGU6IGhhc2hfcm9ja2V0cworICBTZXZlcml0eTogZXJyb3IKK1N0eWxlL0lmVW5sZXNzTW9kaWZpZXI6CisgIEVuYWJsZWQ6IGZhbHNlCitTdHlsZS9JbnZlcnNlTWV0aG9kczoKKyAgRW5hYmxlZDogZmFsc2UKK1N0eWxlL01vZHVsZUZ1bmN0aW9uOgorICBFbmFibGVkOiBmYWxzZQorU3R5bGUvTXVsdGlsaW5lVGVybmFyeU9wZXJhdG9yOgorICBTZXZlcml0eTogZXJyb3IKK1N0eWxlL1BlcmNlbnRMaXRlcmFsRGVsaW1pdGVyczoKKyAgUHJlZmVycmVkRGVsaW1pdGVyczoKKyAgICAiJXEiOiAie30iCisgICAgIiVRIjogInt9IgorICAgICIlciI6ICIhISIKKyAgICAiJXMiOiAiKCkiCisgICAgIiV3IjogIigpIgorICAgICIlVyI6ICIoKSIKKyAgICAiJXgiOiAiKCkiCitTdHlsZS9SZWR1bmRhbnRSZXR1cm46CisgIEVuYWJsZWQ6IGZhbHNlCitTdHlsZS9SZWR1bmRhbnRTZWxmOgorICBFbmFibGVkOiBmYWxzZQorU3R5bGUvUmVnZXhwTGl0ZXJhbDoKKyAgRW5mb3JjZWRTdHlsZTogcGVyY2VudF9yCitTdHlsZS9SZXNjdWVNb2RpZmllcjoKKyAgRW5hYmxlZDogZmFsc2UKK1N0eWxlL1NpZ25hbEV4Y2VwdGlvbjoKKyAgRW5mb3JjZWRTdHlsZTogb25seV9yYWlzZQorU3R5bGUvU2luZ2xlTGluZU1ldGhvZHM6CisgIEVuYWJsZWQ6IGZhbHNlCitTdHlsZS9TdHJpbmdMaXRlcmFsczoKKyAgRW5mb3JjZWRTdHlsZTogZG91YmxlX3F1b3RlcworU3R5bGUvU3RyaW5nTGl0ZXJhbHNJbkludGVycG9sYXRpb246CisgIEVuZm9yY2VkU3R5bGU6IGRvdWJsZV9xdW90ZXMKK1N0eWxlL1N5bWJvbEFycmF5OgorICBFbmFibGVkOiBmYWxzZQorU3R5bGUvVHJhaWxpbmdDb21tYUluTGl0ZXJhbDoKKyAgRW5mb3JjZWRTdHlsZUZvck11bHRpbGluZTogY29uc2lzdGVudF9jb21tYQorU3R5bGUvVW5uZWVkZWRDYXBpdGFsVzoKKyAgRW5hYmxlZDogZmFsc2UKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9MSUNFTlNFIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3N2IxYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9MSUNFTlNFCkBAIC0wLDAgKzEsMjEgQEAKK1RoZSBNSVQgTGljZW5zZSAoTUlUKQorCitDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNyBUb20gUHJlc3Rvbi1XZXJuZXIgYW5kIEpla3lsbCBjb250cmlidXRvcnMKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCitjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorU09GVFdBUkUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvUkVBRE1FLm1hcmtkb3duIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL1JFQURNRS5tYXJrZG93bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE4ZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL1JFQURNRS5tYXJrZG93bgpAQCAtMCwwICsxLDU5IEBACisjIFtKZWt5bGxdKGh0dHBzOi8vamVreWxscmIuY29tLykKKworWyFbR2VtIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2VtL3YvamVreWxsLnN2ZyldW3J1YnktZ2Vtc10KK1shW0xpbnV4IEJ1aWxkIFN0YXR1c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvamVreWxsL2pla3lsbC9tYXN0ZXIuc3ZnP2xhYmVsPUxpbnV4JTIwYnVpbGQpXVt0cmF2aXNdCitbIVtXaW5kb3dzIEJ1aWxkIHN0YXR1c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9qZWt5bGwvamVreWxsL21hc3Rlci5zdmc/bGFiZWw9V2luZG93cyUyMGJ1aWxkKV1bYXBwdmV5b3JdCitbIVtUZXN0IENvdmVyYWdlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2NvZGVjbGltYXRlL2NvdmVyYWdlL2dpdGh1Yi9qZWt5bGwvamVreWxsLnN2ZyldW2NvdmVyYWdlXQorWyFbQ29kZSBDbGltYXRlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2NvZGVjbGltYXRlL2dpdGh1Yi9qZWt5bGwvamVreWxsLnN2ZyldW2NvZGVjbGltYXRlXQorWyFbRGVwZW5kZW5jeSBTdGF0dXNdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2VtbmFzaXVtL2pla3lsbC9qZWt5bGwuc3ZnKV1bZ2VtbmFzaXVtXQorWyFbU2VjdXJpdHldKGh0dHBzOi8vaGFraXJpLmlvL2dpdGh1Yi9qZWt5bGwvamVreWxsL21hc3Rlci5zdmcpXVtoYWtpcmldCisKK1tydWJ5LWdlbXNdOiBodHRwczovL3J1YnlnZW1zLm9yZy9nZW1zL2pla3lsbAorW2dlbW5hc2l1bV06IGh0dHBzOi8vZ2VtbmFzaXVtLmNvbS9qZWt5bGwvamVreWxsCitbY29kZWNsaW1hdGVdOiBodHRwczovL2NvZGVjbGltYXRlLmNvbS9naXRodWIvamVreWxsL2pla3lsbAorW2NvdmVyYWdlXTogaHR0cHM6Ly9jb2RlY2xpbWF0ZS5jb20vZ2l0aHViL2pla3lsbC9qZWt5bGwvY292ZXJhZ2UKK1toYWtpcmldOiBodHRwczovL2hha2lyaS5pby9naXRodWIvamVreWxsL2pla3lsbC9tYXN0ZXIKK1t0cmF2aXNdOiBodHRwczovL3RyYXZpcy1jaS5vcmcvamVreWxsL2pla3lsbAorW2FwcHZleW9yXTogaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9qZWt5bGwvamVreWxsL2JyYW5jaC9tYXN0ZXIKKworSmVreWxsIGlzIGEgc2ltcGxlLCBibG9nLWF3YXJlLCBzdGF0aWMgc2l0ZSBnZW5lcmF0b3IgcGVyZmVjdCBmb3IgcGVyc29uYWwsIHByb2plY3QsIG9yIG9yZ2FuaXphdGlvbiBzaXRlcy4gVGhpbmsgb2YgaXQgbGlrZSBhIGZpbGUtYmFzZWQgQ01TLCB3aXRob3V0IGFsbCB0aGUgY29tcGxleGl0eS4gSmVreWxsIHRha2VzIHlvdXIgY29udGVudCwgcmVuZGVycyBNYXJrZG93biBhbmQgTGlxdWlkIHRlbXBsYXRlcywgYW5kIHNwaXRzIG91dCBhIGNvbXBsZXRlLCBzdGF0aWMgd2Vic2l0ZSByZWFkeSB0byBiZSBzZXJ2ZWQgYnkgQXBhY2hlLCBOZ2lueCBvciBhbm90aGVyIHdlYiBzZXJ2ZXIuIEpla3lsbCBpcyB0aGUgZW5naW5lIGJlaGluZCBbR2l0SHViIFBhZ2VzXShodHRwczovL3BhZ2VzLmdpdGh1Yi5jb20pLCB3aGljaCB5b3UgY2FuIHVzZSB0byBob3N0IHNpdGVzIHJpZ2h0IGZyb20geW91ciBHaXRIdWIgcmVwb3NpdG9yaWVzLgorCisjIyBQaGlsb3NvcGh5CisKK0pla3lsbCBkb2VzIHdoYXQgeW91IHRlbGwgaXQgdG8gZG/CoOKAlCBubyBtb3JlLCBubyBsZXNzLiBJdCBkb2Vzbid0IHRyeSB0byBvdXRzbWFydCB1c2VycyBieSBtYWtpbmcgYm9sZCBhc3N1bXB0aW9ucywgbm9yIGRvZXMgaXQgYnVyZGVuIHRoZW0gd2l0aCBuZWVkbGVzcyBjb21wbGV4aXR5IGFuZCBjb25maWd1cmF0aW9uLiBQdXQgc2ltcGx5LCBKZWt5bGwgZ2V0cyBvdXQgb2YgeW91ciB3YXkgYW5kIGFsbG93cyB5b3UgdG8gY29uY2VudHJhdGUgb24gd2hhdCB0cnVseSBtYXR0ZXJzOiB5b3VyIGNvbnRlbnQuCisKKyMjIEhhdmluZyB0cm91YmxlIHdpdGggT1MgWC9tYWNPUz8KKworU2VlOiBodHRwczovL2pla3lsbHJiLmNvbS9kb2NzL3Ryb3VibGVzaG9vdGluZy8KKworIyMgR2V0dGluZyBTdGFydGVkCisKKyogW0luc3RhbGxdKGh0dHBzOi8vamVreWxscmIuY29tL2RvY3MvaW5zdGFsbGF0aW9uLykgdGhlIGdlbQorKiBSZWFkIHVwIGFib3V0IGl0cyBbVXNhZ2VdKGh0dHBzOi8vamVreWxscmIuY29tL2RvY3MvdXNhZ2UvKSBhbmQgW0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vamVreWxscmIuY29tL2RvY3MvY29uZmlndXJhdGlvbi8pCisqIFRha2UgYSBnYW5kZXIgYXQgc29tZSBleGlzdGluZyBbU2l0ZXNdKGh0dHBzOi8vd2lraS5naXRodWIuY29tL2pla3lsbC9qZWt5bGwvc2l0ZXMpCisqIFtGb3JrXShodHRwczovL2dpdGh1Yi5jb20vamVreWxsL2pla3lsbC9mb3JrKSBhbmQgW0NvbnRyaWJ1dGVdKGh0dHBzOi8vamVreWxscmIuY29tL2RvY3MvY29udHJpYnV0aW5nLykgeW91ciBvd24gbW9kaWZpY2F0aW9ucworKiBIYXZlIHF1ZXN0aW9ucz8gQ2hlY2sgb3V0IG91ciBvZmZpY2lhbCBmb3J1bSBjb21tdW5pdHkgW0pla3lsbCBUYWxrXShodHRwczovL3RhbGsuamVreWxscmIuY29tLykgb3IgW2AjamVreWxsYCBvbiBpcmMuZnJlZW5vZGUubmV0XShodHRwczovL2JvdGJvdC5tZS9mcmVlbm9kZS9qZWt5bGwvKQorCisjIyBDb2RlIG9mIENvbmR1Y3QKKworSW4gb3JkZXIgdG8gaGF2ZSBhIG1vcmUgb3BlbiBhbmQgd2VsY29taW5nIGNvbW11bml0eSwgSmVreWxsIGFkaGVyZXMgdG8gYQorW2NvZGUgb2YgY29uZHVjdF0oQ09ORFVDVC5tYXJrZG93bikgYWRhcHRlZCBmcm9tIHRoZSBSdWJ5IG9uIFJhaWxzIGNvZGUgb2YKK2NvbmR1Y3QuCisKK1BsZWFzZSBhZGhlcmUgdG8gdGhpcyBjb2RlIG9mIGNvbmR1Y3QgaW4gYW55IGludGVyYWN0aW9ucyB5b3UgaGF2ZSBpbiB0aGUKK0pla3lsbCBjb21tdW5pdHkuIEl0IGlzIHN0cmljdGx5IGVuZm9yY2VkIG9uIGFsbCBvZmZpY2lhbCBKZWt5bGwKK3JlcG9zaXRvcmllcywgd2Vic2l0ZXMsIGFuZCByZXNvdXJjZXMuIElmIHlvdSBlbmNvdW50ZXIgc29tZW9uZSB2aW9sYXRpbmcKK3RoZXNlIHRlcm1zLCBwbGVhc2UgbGV0IGEgbWFpbnRhaW5lciAoW0BwYXJrcl0oaHR0cHM6Ly9naXRodWIuY29tL3BhcmtyKSwgW0BlbnZ5Z2Vla3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnZ5Z2Vla3MpLCBbQG1hdHRyLV0oaHR0cHM6Ly9naXRodWIuY29tL21hdHRyLSksIG9yIFtAYWxmcmVkeGluZ10oaHR0cHM6Ly9naXRodWIuY29tL2FsZnJlZHhpbmcpKSBrbm93IGFuZCB3ZSB3aWxsIGFkZHJlc3MgaXQgYXMgc29vbiBhcyBwb3NzaWJsZS4KKworIyMgRGl2aW5nIEluCisKKyogW01pZ3JhdGVdKGh0dHA6Ly9pbXBvcnQuamVreWxscmIuY29tL2RvY3MvaG9tZS8pIGZyb20geW91ciBwcmV2aW91cyBzeXN0ZW0KKyogTGVhcm4gaG93IHRoZSBbWUFNTCBGcm9udCBNYXR0ZXJdKGh0dHBzOi8vamVreWxscmIuY29tL2RvY3MvZnJvbnRtYXR0ZXIvKSB3b3JrcworKiBQdXQgaW5mb3JtYXRpb24gb24geW91ciBzaXRlIHdpdGggW1ZhcmlhYmxlc10oaHR0cHM6Ly9qZWt5bGxyYi5jb20vZG9jcy92YXJpYWJsZXMvKQorKiBDdXN0b21pemUgdGhlIFtQZXJtYWxpbmtzXShodHRwczovL2pla3lsbHJiLmNvbS9kb2NzL3Blcm1hbGlua3MvKSB5b3VyIHBvc3RzIGFyZSBnZW5lcmF0ZWQgd2l0aAorKiBVc2UgdGhlIGJ1aWx0LWluIFtMaXF1aWQgRXh0ZW5zaW9uc10oaHR0cHM6Ly9qZWt5bGxyYi5jb20vZG9jcy90ZW1wbGF0ZXMvKSB0byBtYWtlIHlvdXIgbGlmZSBlYXNpZXIKKyogVXNlIGN1c3RvbSBbUGx1Z2luc10oaHR0cHM6Ly9qZWt5bGxyYi5jb20vZG9jcy9wbHVnaW5zLykgdG8gZ2VuZXJhdGUgY29udGVudCBzcGVjaWZpYyB0byB5b3VyIHNpdGUKKworIyMgTGljZW5zZQorCitTZWUgdGhlIFtMSUNFTlNFXShodHRwczovL2dpdGh1Yi5jb20vamVreWxsL2pla3lsbC9ibG9iL21hc3Rlci9MSUNFTlNFKSBmaWxlLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2V4ZS9qZWt5bGwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvZXhlL2pla3lsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMGY0MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2V4ZS9qZWt5bGwKQEAgLTAsMCArMSw1NSBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorU1RET1VULnN5bmMgPSB0cnVlCisKKyRMT0FEX1BBVEgudW5zaGlmdChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgIi4uIiwgImxpYiIpKQorCityZXF1aXJlICJqZWt5bGwiCityZXF1aXJlICJtZXJjZW5hcnkiCisKK0pla3lsbDo6UGx1Z2luTWFuYWdlci5yZXF1aXJlX2Zyb21fYnVuZGxlcgorCitKZWt5bGw6OkRlcHJlY2F0b3IucHJvY2VzcyhBUkdWKQorCitNZXJjZW5hcnkucHJvZ3JhbSg6amVreWxsKSBkbyB8cHwKKyAgcC52ZXJzaW9uIEpla3lsbDo6VkVSU0lPTgorICBwLmRlc2NyaXB0aW9uICJKZWt5bGwgaXMgYSBibG9nLWF3YXJlLCBzdGF0aWMgc2l0ZSBnZW5lcmF0b3IgaW4gUnVieSIKKyAgcC5zeW50YXggImpla3lsbCA8c3ViY29tbWFuZD4gW29wdGlvbnNdIgorCisgIHAub3B0aW9uICJzb3VyY2UiLCAiLXMiLCAiLS1zb3VyY2UgW0RJUl0iLCAiU291cmNlIGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gLi8pIgorICBwLm9wdGlvbiAiZGVzdGluYXRpb24iLCAiLWQiLCAiLS1kZXN0aW5hdGlvbiBbRElSXSIsCisgICAgIkRlc3RpbmF0aW9uIGRpcmVjdG9yeSAoZGVmYXVsdHMgdG8gLi9fc2l0ZSkiCisgIHAub3B0aW9uICJzYWZlIiwgIi0tc2FmZSIsICJTYWZlIG1vZGUgKGRlZmF1bHRzIHRvIGZhbHNlKSIKKyAgcC5vcHRpb24gInBsdWdpbnNfZGlyIiwgIi1wIiwgIi0tcGx1Z2lucyBQTFVHSU5TX0RJUjFbLFBMVUdJTlNfRElSMlssLi4uXV0iLCBBcnJheSwKKyAgICAiUGx1Z2lucyBkaXJlY3RvcnkgKGRlZmF1bHRzIHRvIC4vX3BsdWdpbnMpIgorICBwLm9wdGlvbiAibGF5b3V0c19kaXIiLCAiLS1sYXlvdXRzIERJUiIsIFN0cmluZywKKyAgICAiTGF5b3V0cyBkaXJlY3RvcnkgKGRlZmF1bHRzIHRvIC4vX2xheW91dHMpIgorICBwLm9wdGlvbiAicHJvZmlsZSIsICItLXByb2ZpbGUiLCAiR2VuZXJhdGUgYSBMaXF1aWQgcmVuZGVyaW5nIHByb2ZpbGUiCisKKyAgSmVreWxsOjpFeHRlcm5hbC5yZXF1aXJlX2lmX3ByZXNlbnQoSmVreWxsOjpFeHRlcm5hbC5ibGVzc2VkX2dlbXMpIGRvIHxnLCB2ZXJfY29uc3RyYWludHwKKyAgICBjbWQgPSBnLnNwbGl0KCItIikubGFzdAorICAgIHAuY29tbWFuZChjbWQudG9fc3ltKSBkbyB8Y3wKKyAgICAgIGMuc3ludGF4IGNtZAorICAgICAgYy5hY3Rpb24gZG8KKyAgICAgICAgSmVreWxsLmxvZ2dlci5hYm9ydF93aXRoICJZb3UgbXVzdCBpbnN0YWxsIHRoZSAnI3tnfScgZ2VtIiBcCisgICAgICAgICAgIiB2ZXJzaW9uICN7dmVyX2NvbnN0cmFpbnR9IHRvIHVzZSB0aGUgJ2pla3lsbCAje2NtZH0nIGNvbW1hbmQuIgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIEpla3lsbDo6Q29tbWFuZC5zdWJjbGFzc2VzLmVhY2ggeyB8Y3wgYy5pbml0X3dpdGhfcHJvZ3JhbShwKSB9CisKKyAgcC5hY3Rpb24gZG8gfGFyZ3MsIF98CisgICAgaWYgYXJncy5lbXB0eT8KKyAgICAgIEpla3lsbC5sb2dnZXIuZXJyb3IgIkEgc3ViY29tbWFuZCBpcyByZXF1aXJlZC4iCisgICAgICBwdXRzIHAKKyAgICAgIGFib3J0CisgICAgZWxzZQorICAgICAgc3ViY29tbWFuZCA9IGFyZ3MuZmlyc3QKKyAgICAgIHVubGVzcyBwLmhhc19jb21tYW5kPyBzdWJjb21tYW5kCisgICAgICAgIEpla3lsbC5sb2dnZXIuYWJvcnRfd2l0aCAiZmF0YWw6ICdqZWt5bGwgI3thcmdzLmZpcnN0fScgY291bGQgbm90IiBcCisgICAgICAgICAgIiBiZSBmb3VuZC4gWW91IG1heSBuZWVkIHRvIGluc3RhbGwgdGhlIGpla3lsbC0je2FyZ3MuZmlyc3R9IGdlbSIgXAorICAgICAgICAgICIgb3IgYSByZWxhdGVkIGdlbSB0byBiZSBhYmxlIHRvIHVzZSB0aGlzIHN1YmNvbW1hbmQuIgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmJhYTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC5yYgpAQCAtMCwwICsxLDE5MiBAQAorJExPQURfUEFUSC51bnNoaWZ0IEZpbGUuZGlybmFtZShfX0ZJTEVfXykgIyBGb3IgdXNlL3Rlc3Rpbmcgd2hlbiBubyBnZW0gaXMgaW5zdGFsbGVkCisKKyMgUmVxdWlyZSBhbGwgb2YgdGhlIFJ1YnkgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyMKKyMgcGF0aCAtIFRoZSBTdHJpbmcgcmVsYXRpdmUgcGF0aCBmcm9tIGhlcmUgdG8gdGhlIGRpcmVjdG9yeS4KKyMKKyMgUmV0dXJucyBub3RoaW5nLgorZGVmIHJlcXVpcmVfYWxsKHBhdGgpCisgIGdsb2IgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgcGF0aCwgIioucmIiKQorICBEaXJbZ2xvYl0uc29ydC5lYWNoIGRvIHxmfAorICAgIHJlcXVpcmUgZgorICBlbmQKK2VuZAorCisjIHJ1YnlnZW1zCityZXF1aXJlICJydWJ5Z2VtcyIKKworIyBzdGRsaWIKK3JlcXVpcmUgInBhdGh1dGlsIgorcmVxdWlyZSAiZm9yd2FyZGFibGUiCityZXF1aXJlICJmaWxldXRpbHMiCityZXF1aXJlICJ0aW1lIgorcmVxdWlyZSAiRW5nbGlzaCIKK3JlcXVpcmUgInBhdGhuYW1lIgorcmVxdWlyZSAibG9nZ2VyIgorcmVxdWlyZSAic2V0IgorCisjIDNyZCBwYXJ0eQorcmVxdWlyZSAic2FmZV95YW1sL2xvYWQiCityZXF1aXJlICJsaXF1aWQiCityZXF1aXJlICJrcmFtZG93biIKK3JlcXVpcmUgImNvbG9yYXRvciIKKworU2FmZVlBTUw6Ok9QVElPTlNbOnN1cHByZXNzX3dhcm5pbmdzXSA9IHRydWUKKworbW9kdWxlIEpla3lsbAorICAjIGludGVybmFsIHJlcXVpcmVzCisgIGF1dG9sb2FkIDpDbGVhbmVyLCAgICAgICAgICAgICAiamVreWxsL2NsZWFuZXIiCisgIGF1dG9sb2FkIDpDb2xsZWN0aW9uLCAgICAgICAgICAiamVreWxsL2NvbGxlY3Rpb24iCisgIGF1dG9sb2FkIDpDb25maWd1cmF0aW9uLCAgICAgICAiamVreWxsL2NvbmZpZ3VyYXRpb24iCisgIGF1dG9sb2FkIDpDb252ZXJ0aWJsZSwgICAgICAgICAiamVreWxsL2NvbnZlcnRpYmxlIgorICBhdXRvbG9hZCA6RGVwcmVjYXRvciwgICAgICAgICAgImpla3lsbC9kZXByZWNhdG9yIgorICBhdXRvbG9hZCA6RG9jdW1lbnQsICAgICAgICAgICAgImpla3lsbC9kb2N1bWVudCIKKyAgYXV0b2xvYWQgOkVudHJ5RmlsdGVyLCAgICAgICAgICJqZWt5bGwvZW50cnlfZmlsdGVyIgorICBhdXRvbG9hZCA6RXJyb3JzLCAgICAgICAgICAgICAgImpla3lsbC9lcnJvcnMiCisgIGF1dG9sb2FkIDpFeGNlcnB0LCAgICAgICAgICAgICAiamVreWxsL2V4Y2VycHQiCisgIGF1dG9sb2FkIDpFeHRlcm5hbCwgICAgICAgICAgICAiamVreWxsL2V4dGVybmFsIgorICBhdXRvbG9hZCA6RnJvbnRtYXR0ZXJEZWZhdWx0cywgImpla3lsbC9mcm9udG1hdHRlcl9kZWZhdWx0cyIKKyAgYXV0b2xvYWQgOkhvb2tzLCAgICAgICAgICAgICAgICJqZWt5bGwvaG9va3MiCisgIGF1dG9sb2FkIDpMYXlvdXQsICAgICAgICAgICAgICAiamVreWxsL2xheW91dCIKKyAgYXV0b2xvYWQgOkNvbGxlY3Rpb25SZWFkZXIsICAgICJqZWt5bGwvcmVhZGVycy9jb2xsZWN0aW9uX3JlYWRlciIKKyAgYXV0b2xvYWQgOkRhdGFSZWFkZXIsICAgICAgICAgICJqZWt5bGwvcmVhZGVycy9kYXRhX3JlYWRlciIKKyAgYXV0b2xvYWQgOkxheW91dFJlYWRlciwgICAgICAgICJqZWt5bGwvcmVhZGVycy9sYXlvdXRfcmVhZGVyIgorICBhdXRvbG9hZCA6UG9zdFJlYWRlciwgICAgICAgICAgImpla3lsbC9yZWFkZXJzL3Bvc3RfcmVhZGVyIgorICBhdXRvbG9hZCA6UGFnZVJlYWRlciwgICAgICAgICAgImpla3lsbC9yZWFkZXJzL3BhZ2VfcmVhZGVyIgorICBhdXRvbG9hZCA6U3RhdGljRmlsZVJlYWRlciwgICAgImpla3lsbC9yZWFkZXJzL3N0YXRpY19maWxlX3JlYWRlciIKKyAgYXV0b2xvYWQgOlRoZW1lQXNzZXRzUmVhZGVyLCAgICJqZWt5bGwvcmVhZGVycy90aGVtZV9hc3NldHNfcmVhZGVyIgorICBhdXRvbG9hZCA6TG9nQWRhcHRlciwgICAgICAgICAgImpla3lsbC9sb2dfYWRhcHRlciIKKyAgYXV0b2xvYWQgOlBhZ2UsICAgICAgICAgICAgICAgICJqZWt5bGwvcGFnZSIKKyAgYXV0b2xvYWQgOlBsdWdpbk1hbmFnZXIsICAgICAgICJqZWt5bGwvcGx1Z2luX21hbmFnZXIiCisgIGF1dG9sb2FkIDpQdWJsaXNoZXIsICAgICAgICAgICAiamVreWxsL3B1Ymxpc2hlciIKKyAgYXV0b2xvYWQgOlJlYWRlciwgICAgICAgICAgICAgICJqZWt5bGwvcmVhZGVyIgorICBhdXRvbG9hZCA6UmVnZW5lcmF0b3IsICAgICAgICAgImpla3lsbC9yZWdlbmVyYXRvciIKKyAgYXV0b2xvYWQgOlJlbGF0ZWRQb3N0cywgICAgICAgICJqZWt5bGwvcmVsYXRlZF9wb3N0cyIKKyAgYXV0b2xvYWQgOlJlbmRlcmVyLCAgICAgICAgICAgICJqZWt5bGwvcmVuZGVyZXIiCisgIGF1dG9sb2FkIDpMaXF1aWRSZW5kZXJlciwgICAgICAiamVreWxsL2xpcXVpZF9yZW5kZXJlciIKKyAgYXV0b2xvYWQgOlNpdGUsICAgICAgICAgICAgICAgICJqZWt5bGwvc2l0ZSIKKyAgYXV0b2xvYWQgOlN0YXRpY0ZpbGUsICAgICAgICAgICJqZWt5bGwvc3RhdGljX2ZpbGUiCisgIGF1dG9sb2FkIDpTdGV2ZW5zb24sICAgICAgICAgICAiamVreWxsL3N0ZXZlbnNvbiIKKyAgYXV0b2xvYWQgOlRoZW1lLCAgICAgICAgICAgICAgICJqZWt5bGwvdGhlbWUiCisgIGF1dG9sb2FkIDpUaGVtZUJ1aWxkZXIsICAgICAgICAiamVreWxsL3RoZW1lX2J1aWxkZXIiCisgIGF1dG9sb2FkIDpVUkwsICAgICAgICAgICAgICAgICAiamVreWxsL3VybCIKKyAgYXV0b2xvYWQgOlV0aWxzLCAgICAgICAgICAgICAgICJqZWt5bGwvdXRpbHMiCisgIGF1dG9sb2FkIDpWRVJTSU9OLCAgICAgICAgICAgICAiamVreWxsL3ZlcnNpb24iCisKKyAgIyBleHRlbnNpb25zCisgIHJlcXVpcmUgImpla3lsbC9wbHVnaW4iCisgIHJlcXVpcmUgImpla3lsbC9jb252ZXJ0ZXIiCisgIHJlcXVpcmUgImpla3lsbC9nZW5lcmF0b3IiCisgIHJlcXVpcmUgImpla3lsbC9jb21tYW5kIgorICByZXF1aXJlICJqZWt5bGwvbGlxdWlkX2V4dGVuc2lvbnMiCisgIHJlcXVpcmUgImpla3lsbC9maWx0ZXJzIgorCisgIGNsYXNzIDw8IHNlbGYKKyAgICAjIFB1YmxpYzogVGVsbHMgeW91IHdoaWNoIEpla3lsbCBlbnZpcm9ubWVudCB5b3UgYXJlIGJ1aWxkaW5nIGluIHNvIHlvdSBjYW4gc2tpcCB0YXNrcworICAgICMgaWYgeW91IG5lZWQgdG8uICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGRvaW5nIGV4cGVuc2l2ZSBjb21wcmVzc2lvbiB0YXNrcyBvbiBjc3MgYW5kCisgICAgIyBpbWFnZXMgYW5kIGFsbG93cyB5b3UgdG8gc2tpcCB0aGF0IHdoZW4gd29ya2luZyBpbiBkZXZlbG9wbWVudC4KKworICAgIGRlZiBlbnYKKyAgICAgIEVOVlsiSkVLWUxMX0VOViJdIHx8ICJkZXZlbG9wbWVudCIKKyAgICBlbmQKKworICAgICMgUHVibGljOiBHZW5lcmF0ZSBhIEpla3lsbCBjb25maWd1cmF0aW9uIEhhc2ggYnkgbWVyZ2luZyB0aGUgZGVmYXVsdAorICAgICMgb3B0aW9ucyB3aXRoIGFueXRoaW5nIGluIF9jb25maWcueW1sLCBhbmQgYWRkaW5nIHRoZSBnaXZlbiBvcHRpb25zIG9uIHRvcC4KKyAgICAjCisgICAgIyBvdmVycmlkZSAtIEEgSGFzaCBvZiBjb25maWcgZGlyZWN0aXZlcyB0aGF0IG92ZXJyaWRlIGFueSBvcHRpb25zIGluIGJvdGgKKyAgICAjICAgICAgICAgICAgdGhlIGRlZmF1bHRzIGFuZCB0aGUgY29uZmlnIGZpbGUuCisgICAgIyAgICAgICAgICAgIFNlZSBKZWt5bGw6OkNvbmZpZ3VyYXRpb246OkRFRkFVTFRTIGZvciBhCisgICAgIyAgICAgICAgICAgIGxpc3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB0aGVpciBkZWZhdWx0cy4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBmaW5hbCBjb25maWd1cmF0aW9uIEhhc2guCisgICAgZGVmIGNvbmZpZ3VyYXRpb24ob3ZlcnJpZGUgPSB7fSkKKyAgICAgIGNvbmZpZyA9IENvbmZpZ3VyYXRpb24ubmV3CisgICAgICBvdmVycmlkZSA9IENvbmZpZ3VyYXRpb25bb3ZlcnJpZGVdLnN0cmluZ2lmeV9rZXlzCisgICAgICB1bmxlc3Mgb3ZlcnJpZGUuZGVsZXRlKCJza2lwX2NvbmZpZ19maWxlcyIpCisgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5yZWFkX2NvbmZpZ19maWxlcyhjb25maWcuY29uZmlnX2ZpbGVzKG92ZXJyaWRlKSkKKyAgICAgIGVuZAorCisgICAgICAjIE1lcmdlIERFRkFVTFRTIDwgX2NvbmZpZy55bWwgPCBvdmVycmlkZQorICAgICAgQ29uZmlndXJhdGlvbi5mcm9tKFV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzKGNvbmZpZywgb3ZlcnJpZGUpKS50YXAgZG8gfG9ianwKKyAgICAgICAgc2V0X3RpbWV6b25lKG9ialsidGltZXpvbmUiXSkgaWYgb2JqWyJ0aW1lem9uZSJdCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUHVibGljOiBTZXQgdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHVzZSB0aGUgdGltZXpvbmUgc3BlY2lmaWVkCisgICAgIworICAgICMgdGltZXpvbmUgLSB0aGUgSUFOQSBUaW1lIFpvbmUKKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICAjIHJ1Ym9jb3A6ZGlzYWJsZSBTdHlsZS9BY2Nlc3Nvck1ldGhvZE5hbWUKKyAgICBkZWYgc2V0X3RpbWV6b25lKHRpbWV6b25lKQorICAgICAgRU5WWyJUWiJdID0gaWYgVXRpbHM6OlBsYXRmb3Jtcy5yZWFsbHlfd2luZG93cz8KKyAgICAgICAgICAgICAgICAgICAgVXRpbHM6OldpblRaLmNhbGN1bGF0ZSh0aW1lem9uZSkKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUKKyAgICAgICAgICAgICAgICAgIGVuZAorICAgIGVuZAorICAgICMgcnVib2NvcDplbmFibGUgU3R5bGUvQWNjZXNzb3JNZXRob2ROYW1lCisKKyAgICAjIFB1YmxpYzogRmV0Y2ggdGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyBKZWt5bGwgcHJvY2Vzcy4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBMb2dBZGFwdGVyIGluc3RhbmNlLgorICAgIGRlZiBsb2dnZXIKKyAgICAgIEBsb2dnZXIgfHw9IExvZ0FkYXB0ZXIubmV3KFN0ZXZlbnNvbi5uZXcsIChFTlZbIkpFS1lMTF9MT0dfTEVWRUwiXSB8fCA6aW5mbykudG9fc3ltKQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFNldCB0aGUgbG9nIHdyaXRlci4KKyAgICAjICAgICAgICAgTmV3IGxvZyB3cml0ZXIgbXVzdCByZXNwb25kIHRvIHRoZSBzYW1lIG1ldGhvZHMKKyAgICAjICAgICAgICAgYXMgUnVieSdzIGludGVyYWwgTG9nZ2VyLgorICAgICMKKyAgICAjIHdyaXRlciAtIHRoZSBuZXcgTG9nZ2VyLWNvbXBhdGlibGUgbG9nIHRyYW5zcG9ydAorICAgICMKKyAgICAjIFJldHVybnMgdGhlIG5ldyBsb2dnZXIuCisgICAgZGVmIGxvZ2dlcj0od3JpdGVyKQorICAgICAgQGxvZ2dlciA9IExvZ0FkYXB0ZXIubmV3KHdyaXRlciwgKEVOVlsiSkVLWUxMX0xPR19MRVZFTCJdIHx8IDppbmZvKS50b19zeW0pCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogQW4gYXJyYXkgb2Ygc2l0ZXMKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBKZWt5bGwgc2l0ZXMgY3JlYXRlZC4KKyAgICBkZWYgc2l0ZXMKKyAgICAgIEBzaXRlcyB8fD0gW10KKyAgICBlbmQKKworICAgICMgUHVibGljOiBFbnN1cmVzIHRoZSBxdWVzdGlvbmFibGUgcGF0aCBpcyBwcmVmaXhlZCB3aXRoIHRoZSBiYXNlIGRpcmVjdG9yeQorICAgICMgICAgICAgICBhbmQgcHJlcGVuZHMgdGhlIHF1ZXN0aW9uYWJsZSBwYXRoIHdpdGggdGhlIGJhc2UgZGlyZWN0b3J5IGlmIGZhbHNlLgorICAgICMKKyAgICAjIGJhc2VfZGlyZWN0b3J5IC0gdGhlIGRpcmVjdG9yeSB3aXRoIHdoaWNoIHRvIHByZWZpeCB0aGUgcXVlc3Rpb25hYmxlIHBhdGgKKyAgICAjIHF1ZXN0aW9uYWJsZV9wYXRoIC0gdGhlIHBhdGggd2UncmUgdW5zdXJlIGFib3V0LCBhbmQgd2FudCBwcmVmaXhlZAorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHNhbml0aXplZCBwYXRoLgorICAgIGRlZiBzYW5pdGl6ZWRfcGF0aChiYXNlX2RpcmVjdG9yeSwgcXVlc3Rpb25hYmxlX3BhdGgpCisgICAgICByZXR1cm4gYmFzZV9kaXJlY3RvcnkgaWYgYmFzZV9kaXJlY3RvcnkuZXFsPyhxdWVzdGlvbmFibGVfcGF0aCkKKworICAgICAgcXVlc3Rpb25hYmxlX3BhdGguaW5zZXJ0KDAsICIvIikgaWYgcXVlc3Rpb25hYmxlX3BhdGguc3RhcnRfd2l0aD8oIn4iKQorICAgICAgY2xlYW5fcGF0aCA9IEZpbGUuZXhwYW5kX3BhdGgocXVlc3Rpb25hYmxlX3BhdGgsICIvIikKKworICAgICAgcmV0dXJuIGNsZWFuX3BhdGggaWYgY2xlYW5fcGF0aC5lcWw/KGJhc2VfZGlyZWN0b3J5KQorCisgICAgICBpZiBjbGVhbl9wYXRoLnN0YXJ0X3dpdGg/KGJhc2VfZGlyZWN0b3J5LnN1YiglciFceiEsICIvIikpCisgICAgICAgIGNsZWFuX3BhdGgKKyAgICAgIGVsc2UKKyAgICAgICAgY2xlYW5fcGF0aC5zdWIhKCVyIVxBXHc6LyEsICIvIikKKyAgICAgICAgRmlsZS5qb2luKGJhc2VfZGlyZWN0b3J5LCBjbGVhbl9wYXRoKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIENvbmRpdGlvbmFsIG9wdGltaXphdGlvbnMKKyAgICBKZWt5bGw6OkV4dGVybmFsLnJlcXVpcmVfaWZfcHJlc2VudCgibGlxdWlkLWMiKQorICBlbmQKK2VuZAorCityZXF1aXJlICJqZWt5bGwvZHJvcHMvZHJvcCIKK3JlcXVpcmUgImpla3lsbC9kcm9wcy9kb2N1bWVudF9kcm9wIgorcmVxdWlyZV9hbGwgImpla3lsbC9jb21tYW5kcyIKK3JlcXVpcmVfYWxsICJqZWt5bGwvY29udmVydGVycyIKK3JlcXVpcmVfYWxsICJqZWt5bGwvY29udmVydGVycy9tYXJrZG93biIKK3JlcXVpcmVfYWxsICJqZWt5bGwvZHJvcHMiCityZXF1aXJlX2FsbCAiamVreWxsL2dlbmVyYXRvcnMiCityZXF1aXJlX2FsbCAiamVreWxsL3RhZ3MiCisKK3JlcXVpcmUgImpla3lsbC1zYXNzLWNvbnZlcnRlciIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NsZWFuZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jbGVhbmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOGE5MTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jbGVhbmVyLnJiCkBAIC0wLDAgKzEsMTA4IEBACityZXF1aXJlICJzZXQiCisKK21vZHVsZSBKZWt5bGwKKyAgIyBIYW5kbGVzIHRoZSBjbGVhbnVwIG9mIGEgc2l0ZSdzIGRlc3RpbmF0aW9uIGJlZm9yZSBpdCBpcyBidWlsdC4KKyAgY2xhc3MgQ2xlYW5lcgorICAgIEhJRERFTl9GSUxFX1JFR0VYID0gJXIhXC9cLnsxLDJ9JCEKKyAgICBhdHRyX3JlYWRlciA6c2l0ZQorCisgICAgZGVmIGluaXRpYWxpemUoc2l0ZSkKKyAgICAgIEBzaXRlID0gc2l0ZQorICAgIGVuZAorCisgICAgIyBDbGVhbnMgdXAgdGhlIHNpdGUncyBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICBkZWYgY2xlYW51cCEKKyAgICAgIEZpbGVVdGlscy5ybV9yZihvYnNvbGV0ZV9maWxlcykKKyAgICAgIEZpbGVVdGlscy5ybV9yZihtZXRhZGF0YV9maWxlKSB1bmxlc3MgQHNpdGUuaW5jcmVtZW50YWw/CisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICAjIFByaXZhdGU6IFRoZSBsaXN0IG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBiZSBkZWxldGVkIGR1cmluZyBjbGVhbnVwIHByb2Nlc3MKKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIEFycmF5IG9mIHRoZSBmaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMKKyAgICBkZWYgb2Jzb2xldGVfZmlsZXMKKyAgICAgIChleGlzdGluZ19maWxlcyAtIG5ld19maWxlcyAtIG5ld19kaXJzICsgcmVwbGFjZWRfZmlsZXMpLnRvX2EKKyAgICBlbmQKKworICAgICMgUHJpdmF0ZTogVGhlIG1ldGFkYXRhIGZpbGUgc3RvcmluZyBkZXBlbmRlbmN5IHRyZWUgYW5kIGJ1aWxkIGhpc3RvcnkKKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIEFycmF5IHdpdGggdGhlIG1ldGRhdGEgZmlsZSBhcyB0aGUgb25seSBpdGVtCisgICAgZGVmIG1ldGFkYXRhX2ZpbGUKKyAgICAgIFtzaXRlLnJlZ2VuZXJhdG9yLm1ldGFkYXRhX2ZpbGVdCisgICAgZW5kCisKKyAgICAjIFByaXZhdGU6IFRoZSBsaXN0IG9mIGV4aXN0aW5nIGZpbGVzLCBhcGFydCBmcm9tIHRob3NlIGluY2x1ZGVkIGluCisgICAgIyBrZWVwX2ZpbGVzIGFuZCBoaWRkZW4gZmlsZXMuCisgICAgIworICAgICMgUmV0dXJucyBhIFNldCB3aXRoIHRoZSBmaWxlIHBhdGhzCisgICAgZGVmIGV4aXN0aW5nX2ZpbGVzCisgICAgICBmaWxlcyA9IFNldC5uZXcKKyAgICAgIHJlZ2V4ID0ga2VlcF9maWxlX3JlZ2V4CisgICAgICBkaXJzID0ga2VlcF9kaXJzCisKKyAgICAgIFV0aWxzLnNhZmVfZ2xvYihzaXRlLmluX2Rlc3RfZGlyLCBbIioqIiwgIioiXSwgRmlsZTo6Rk5NX0RPVE1BVENIKS5lYWNoIGRvIHxmaWxlfAorICAgICAgICBuZXh0IGlmIGZpbGUgPX4gSElEREVOX0ZJTEVfUkVHRVggfHwgZmlsZSA9fiByZWdleCB8fCBkaXJzLmluY2x1ZGU/KGZpbGUpCisgICAgICAgIGZpbGVzIDw8IGZpbGUKKyAgICAgIGVuZAorCisgICAgICBmaWxlcworICAgIGVuZAorCisgICAgIyBQcml2YXRlOiBUaGUgbGlzdCBvZiBmaWxlcyB0byBiZSBjcmVhdGVkIHdoZW4gc2l0ZSBpcyBidWlsdC4KKyAgICAjCisgICAgIyBSZXR1cm5zIGEgU2V0IHdpdGggdGhlIGZpbGUgcGF0aHMKKyAgICBkZWYgbmV3X2ZpbGVzCisgICAgICBmaWxlcyA9IFNldC5uZXcKKyAgICAgIHNpdGUuZWFjaF9zaXRlX2ZpbGUgeyB8aXRlbXwgZmlsZXMgPDwgaXRlbS5kZXN0aW5hdGlvbihzaXRlLmRlc3QpIH0KKyAgICAgIGZpbGVzCisgICAgZW5kCisKKyAgICAjIFByaXZhdGU6IFRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQgd2hlbiBzaXRlIGlzIGJ1aWx0LgorICAgICMgVGhlc2UgYXJlIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgb2YgdGhlIGZpbGVzIGluICNuZXdfZmlsZXMuCisgICAgIworICAgICMgUmV0dXJucyBhIFNldCB3aXRoIHRoZSBkaXJlY3RvcnkgcGF0aHMKKyAgICBkZWYgbmV3X2RpcnMKKyAgICAgIG5ld19maWxlcy5tYXAgeyB8ZmlsZXwgcGFyZW50X2RpcnMoZmlsZSkgfS5mbGF0dGVuLnRvX3NldAorICAgIGVuZAorCisgICAgIyBQcml2YXRlOiBUaGUgbGlzdCBvZiBwYXJlbnQgZGlyZWN0b3JpZXMgb2YgYSBnaXZlbiBmaWxlCisgICAgIworICAgICMgUmV0dXJucyBhbiBBcnJheSB3aXRoIHRoZSBkaXJlY3RvcnkgcGF0aHMKKyAgICBkZWYgcGFyZW50X2RpcnMoZmlsZSkKKyAgICAgIHBhcmVudF9kaXIgPSBGaWxlLmRpcm5hbWUoZmlsZSkKKyAgICAgIGlmIHBhcmVudF9kaXIgPT0gc2l0ZS5kZXN0CisgICAgICAgIFtdCisgICAgICBlbHNlCisgICAgICAgIFtwYXJlbnRfZGlyXSArIHBhcmVudF9kaXJzKHBhcmVudF9kaXIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUHJpdmF0ZTogVGhlIGxpc3Qgb2YgZXhpc3RpbmcgZmlsZXMgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgZGlyZWN0b3J5CisgICAgIyBkdXJpbmcgYnVpbGQKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgU2V0IHdpdGggdGhlIGZpbGUgcGF0aHMKKyAgICBkZWYgcmVwbGFjZWRfZmlsZXMKKyAgICAgIG5ld19kaXJzLnNlbGVjdCB7IHxkaXJ8IEZpbGUuZmlsZT8oZGlyKSB9LnRvX3NldAorICAgIGVuZAorCisgICAgIyBQcml2YXRlOiBUaGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IG5lZWQgdG8gYmUga2VwdCBiZWNhdXNlIHRoZXkgYXJlCisgICAgIyBwYXJlbnQgZGlyZWN0b3JpZXMgb2YgZmlsZXMgc3BlY2lmaWVkIGluIGtlZXBfZmlsZXMKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgU2V0IHdpdGggdGhlIGRpcmVjdG9yeSBwYXRocworICAgIGRlZiBrZWVwX2RpcnMKKyAgICAgIHNpdGUua2VlcF9maWxlcy5tYXAgeyB8ZmlsZXwgcGFyZW50X2RpcnMoc2l0ZS5pbl9kZXN0X2RpcihmaWxlKSkgfS5mbGF0dGVuLnRvX3NldAorICAgIGVuZAorCisgICAgIyBQcml2YXRlOiBDcmVhdGVzIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGNvbmZpZydzIGtlZXBfZmlsZXMgYXJyYXkKKyAgICAjCisgICAgIyBFeGFtcGxlcworICAgICMgICBbJy5naXQnLCcuc3ZuJ10gd2l0aCBzaXRlLmRlc3QgIi9teWJsb2cvX3NpdGUiIGNyZWF0ZXMKKyAgICAjICAgdGhlIGZvbGxvd2luZyByZWdleDogL1xBXC9teWJsb2dcL19zaXRlXC8oXC5naXR8XC8uc3ZuKS8KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICBkZWYga2VlcF9maWxlX3JlZ2V4CisgICAgICAlciFcQSN7UmVnZXhwLnF1b3RlKHNpdGUuZGVzdCl9XC8oI3tSZWdleHAudW5pb24oc2l0ZS5rZWVwX2ZpbGVzKS5zb3VyY2V9KSEKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbGxlY3Rpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb2xsZWN0aW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Mzk5MTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb2xsZWN0aW9uLnJiCkBAIC0wLDAgKzEsMjI4IEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIENvbGxlY3Rpb24KKyAgICBhdHRyX3JlYWRlciA6c2l0ZSwgOmxhYmVsLCA6bWV0YWRhdGEKKyAgICBhdHRyX3dyaXRlciA6ZG9jcworCisgICAgIyBDcmVhdGUgYSBuZXcgQ29sbGVjdGlvbi4KKyAgICAjCisgICAgIyBzaXRlIC0gdGhlIHNpdGUgdG8gd2hpY2ggdGhpcyBjb2xsZWN0aW9uIGJlbG9uZ3MuCisgICAgIyBsYWJlbCAtIHRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiBpbml0aWFsaXplKHNpdGUsIGxhYmVsKQorICAgICAgQHNpdGUgICAgID0gc2l0ZQorICAgICAgQGxhYmVsICAgID0gc2FuaXRpemVfbGFiZWwobGFiZWwpCisgICAgICBAbWV0YWRhdGEgPSBleHRyYWN0X21ldGFkYXRhCisgICAgZW5kCisKKyAgICAjIEZldGNoIHRoZSBEb2N1bWVudHMgaW4gdGhpcyBjb2xsZWN0aW9uLgorICAgICMgRGVmYXVsdHMgdG8gYW4gZW1wdHkgYXJyYXkgaWYgbm8gZG9jdW1lbnRzIGhhdmUgYmVlbiByZWFkIGluLgorICAgICMKKyAgICAjIFJldHVybnMgYW4gYXJyYXkgb2YgSmVreWxsOjpEb2N1bWVudCBvYmplY3RzLgorICAgIGRlZiBkb2NzCisgICAgICBAZG9jcyB8fD0gW10KKyAgICBlbmQKKworICAgICMgT3ZlcnJpZGUgb2Ygbm9ybWFsIHJlc3BvbmRfdG8/IHRvIG1hdGNoIG1ldGhvZF9taXNzaW5nJ3MgbG9naWMgZm9yCisgICAgIyBsb29raW5nIGluIEBkYXRhLgorICAgIGRlZiByZXNwb25kX3RvX21pc3Npbmc/KG1ldGhvZCwgaW5jbHVkZV9wcml2YXRlID0gZmFsc2UpCisgICAgICBkb2NzLnJlc3BvbmRfdG8/KG1ldGhvZC50b19zeW0sIGluY2x1ZGVfcHJpdmF0ZSkgfHwgc3VwZXIKKyAgICBlbmQKKworICAgICMgT3ZlcnJpZGUgb2YgbWV0aG9kX21pc3NpbmcgdG8gY2hlY2sgaW4gQGRhdGEgZm9yIHRoZSBrZXkuCisgICAgZGVmIG1ldGhvZF9taXNzaW5nKG1ldGhvZCwgKmFyZ3MsICZibGNrKQorICAgICAgaWYgZG9jcy5yZXNwb25kX3RvPyhtZXRob2QudG9fc3ltKQorICAgICAgICBKZWt5bGwubG9nZ2VyLndhcm4gIkRlcHJlY2F0aW9uOiIsCisgICAgICAgICAgIiN7bGFiZWx9LiN7bWV0aG9kfSBzaG91bGQgYmUgY2hhbmdlZCB0byAje2xhYmVsfS5kb2NzLiN7bWV0aG9kfS4iCisgICAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiIiwgIkNhbGxlZCBieSAje2NhbGxlcigwLi4wKX0uIgorICAgICAgICBkb2NzLnB1YmxpY19zZW5kKG1ldGhvZC50b19zeW0sICphcmdzLCAmYmxjaykKKyAgICAgIGVsc2UKKyAgICAgICAgc3VwZXIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBGZXRjaCB0aGUgc3RhdGljIGZpbGVzIGluIHRoaXMgY29sbGVjdGlvbi4KKyAgICAjIERlZmF1bHRzIHRvIGFuIGVtcHR5IGFycmF5IGlmIG5vIHN0YXRpYyBmaWxlcyBoYXZlIGJlZW4gcmVhZCBpbi4KKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIGFycmF5IG9mIEpla3lsbDo6U3RhdGljRmlsZSBvYmplY3RzLgorICAgIGRlZiBmaWxlcworICAgICAgQGZpbGVzIHx8PSBbXQorICAgIGVuZAorCisgICAgIyBSZWFkIHRoZSBhbGxvd2VkIGRvY3VtZW50cyBpbnRvIHRoZSBjb2xsZWN0aW9uJ3MgYXJyYXkgb2YgZG9jcy4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBzb3J0ZWQgYXJyYXkgb2YgZG9jcy4KKyAgICBkZWYgcmVhZAorICAgICAgZmlsdGVyZWRfZW50cmllcy5lYWNoIGRvIHxmaWxlX3BhdGh8CisgICAgICAgIGZ1bGxfcGF0aCA9IGNvbGxlY3Rpb25fZGlyKGZpbGVfcGF0aCkKKyAgICAgICAgbmV4dCBpZiBGaWxlLmRpcmVjdG9yeT8oZnVsbF9wYXRoKQorICAgICAgICBpZiBVdGlscy5oYXNfeWFtbF9oZWFkZXI/IGZ1bGxfcGF0aAorICAgICAgICAgIHJlYWRfZG9jdW1lbnQoZnVsbF9wYXRoKQorICAgICAgICBlbHNlCisgICAgICAgICAgcmVhZF9zdGF0aWNfZmlsZShmaWxlX3BhdGgsIGZ1bGxfcGF0aCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGRvY3Muc29ydCEKKyAgICBlbmQKKworICAgICMgQWxsIHRoZSBlbnRyaWVzIGluIHRoaXMgY29sbGVjdGlvbi4KKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIEFycmF5IG9mIGZpbGUgcGF0aHMgdG8gdGhlIGRvY3VtZW50cyBpbiB0aGlzIGNvbGxlY3Rpb24KKyAgICAjICAgcmVsYXRpdmUgdG8gdGhlIGNvbGxlY3Rpb24ncyBkaXJlY3RvcnkKKyAgICBkZWYgZW50cmllcworICAgICAgcmV0dXJuIFtdIHVubGVzcyBleGlzdHM/CisgICAgICBAZW50cmllcyB8fD0KKyAgICAgICAgVXRpbHMuc2FmZV9nbG9iKGNvbGxlY3Rpb25fZGlyLCBbIioqIiwgIioiXSwgRmlsZTo6Rk5NX0RPVE1BVENIKS5tYXAgZG8gfGVudHJ5fAorICAgICAgICAgIGVudHJ5WyIje2NvbGxlY3Rpb25fZGlyfS8iXSA9ICIiCisgICAgICAgICAgZW50cnkKKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEZpbHRlcmVkIHZlcnNpb24gb2YgdGhlIGVudHJpZXMgaW4gdGhpcyBjb2xsZWN0aW9uLgorICAgICMgU2VlIGBKZWt5bGw6OkVudHJ5RmlsdGVyI2ZpbHRlcmAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgIworICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgZmlsdGVyZWQgZW50cnkgcGF0aHMuCisgICAgZGVmIGZpbHRlcmVkX2VudHJpZXMKKyAgICAgIHJldHVybiBbXSB1bmxlc3MgZXhpc3RzPworICAgICAgQGZpbHRlcmVkX2VudHJpZXMgfHw9CisgICAgICAgIERpci5jaGRpcihkaXJlY3RvcnkpIGRvCisgICAgICAgICAgZW50cnlfZmlsdGVyLmZpbHRlcihlbnRyaWVzKS5yZWplY3QgZG8gfGZ8CisgICAgICAgICAgICBwYXRoID0gY29sbGVjdGlvbl9kaXIoZikKKyAgICAgICAgICAgIEZpbGUuZGlyZWN0b3J5PyhwYXRoKSB8fCBlbnRyeV9maWx0ZXIuc3ltbGluaz8oZikKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRoZSBkaXJlY3RvcnkgZm9yIHRoaXMgQ29sbGVjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHNpdGUgc291cmNlLgorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IG5hbWUgd2hlcmUgdGhlIGNvbGxlY3Rpb24KKyAgICAjICAgaXMgc3RvcmVkIG9uIHRoZSBmaWxlc3lzdGVtLgorICAgIGRlZiByZWxhdGl2ZV9kaXJlY3RvcnkKKyAgICAgIEByZWxhdGl2ZV9kaXJlY3RvcnkgfHw9ICJfI3tsYWJlbH0iCisgICAgZW5kCisKKyAgICAjIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjb2xsZWN0aW9uLgorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcgY29udGFpbmluZyB0aCBkaXJlY3RvcnkgbmFtZSB3aGVyZSB0aGUgY29sbGVjdGlvbgorICAgICMgICBpcyBzdG9yZWQgb24gdGhlIGZpbGVzeXN0ZW0uCisgICAgZGVmIGRpcmVjdG9yeQorICAgICAgQGRpcmVjdG9yeSB8fD0gc2l0ZS5pbl9zb3VyY2VfZGlyKHJlbGF0aXZlX2RpcmVjdG9yeSkKKyAgICBlbmQKKworICAgICMgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNvbGxlY3Rpb24sIHdpdGgKKyAgICAjICAgb3B0aW9uYWwgc3VicGF0aHMuCisgICAgIworICAgICMgKmZpbGVzIC0gKG9wdGlvbmFsKSBhbnkgb3RoZXIgcGF0aCBwaWVjZXMgcmVsYXRpdmUgdG8gdGhlCisgICAgIyAgICAgICAgICAgZGlyZWN0b3J5IHRvIGFwcGVuZCB0byB0aGUgcGF0aAorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcgY29udGFpbmluZyB0aCBkaXJlY3RvcnkgbmFtZSB3aGVyZSB0aGUgY29sbGVjdGlvbgorICAgICMgICBpcyBzdG9yZWQgb24gdGhlIGZpbGVzeXN0ZW0uCisgICAgZGVmIGNvbGxlY3Rpb25fZGlyKCpmaWxlcykKKyAgICAgIHJldHVybiBkaXJlY3RvcnkgaWYgZmlsZXMuZW1wdHk/CisgICAgICBzaXRlLmluX3NvdXJjZV9kaXIocmVsYXRpdmVfZGlyZWN0b3J5LCAqZmlsZXMpCisgICAgZW5kCisKKyAgICAjIENoZWNrcyB3aGV0aGVyIHRoZSBkaXJlY3RvcnkgImV4aXN0cyIgZm9yIHRoaXMgY29sbGVjdGlvbi4KKyAgICAjIFRoZSBkaXJlY3RvcnkgbXVzdCBleGlzdCBvbiB0aGUgZmlsZXN5c3RlbSBhbmQgbXVzdCBub3QgYmUgYSBzeW1saW5rCisgICAgIyAgIGlmIGluIHNhZmUgbW9kZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCBvciBpZiBpdCdzIGEgc3ltbGluaworICAgICMgICBhbmQgd2UncmUgaW4gc2FmZSBtb2RlLgorICAgIGRlZiBleGlzdHM/CisgICAgICBGaWxlLmRpcmVjdG9yeT8oZGlyZWN0b3J5KSAmJiAhZW50cnlfZmlsdGVyLnN5bWxpbms/KGRpcmVjdG9yeSkKKyAgICBlbmQKKworICAgICMgVGhlIGVudHJ5IGZpbHRlciBmb3IgdGhpcyBjb2xsZWN0aW9uLgorICAgICMgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBKZWt5bGw6OkVudHJ5RmlsdGVyLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIEpla3lsbDo6RW50cnlGaWx0ZXIgZm9yIHRoaXMgY29sbGVjdGlvbi4KKyAgICBkZWYgZW50cnlfZmlsdGVyCisgICAgICBAZW50cnlfZmlsdGVyIHx8PSBKZWt5bGw6OkVudHJ5RmlsdGVyLm5ldyhzaXRlLCByZWxhdGl2ZV9kaXJlY3RvcnkpCisgICAgZW5kCisKKyAgICAjIEFuIGluc3BlY3Qgc3RyaW5nLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGluc3BlY3Qgc3RyaW5nCisgICAgZGVmIGluc3BlY3QKKyAgICAgICIjPEpla3lsbDo6Q29sbGVjdGlvbiBAbGFiZWw9I3tsYWJlbH0gZG9jcz0je2RvY3N9PiIKKyAgICBlbmQKKworICAgICMgUHJvZHVjZSBhIHNhbml0aXplZCBsYWJlbCBuYW1lCisgICAgIyBMYWJlbCBuYW1lcyBtYXkgbm90IGNvbnRhaW4gYW55dGhpbmcgYnV0IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLAorICAgICMgICB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMuCisgICAgIworICAgICMgbGFiZWwgLSB0aGUgcG9zc2libHktdW5zYWZlIGxhYmVsCisgICAgIworICAgICMgUmV0dXJucyBhIHNhbml0aXplZCB2ZXJzaW9uIG9mIHRoZSBsYWJlbC4KKyAgICBkZWYgc2FuaXRpemVfbGFiZWwobGFiZWwpCisgICAgICBsYWJlbC5nc3ViKCVyIVteYS16MC05X1wtXC5dIWksICIiKQorICAgIGVuZAorCisgICAgIyBQcm9kdWNlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBDb2xsZWN0aW9uIGZvciB1c2UgaW4gTGlxdWlkLgorICAgICMgRXhwb3NlcyB0d28gYXR0cmlidXRlczoKKyAgICAjICAgLSBsYWJlbAorICAgICMgICAtIGRvY3MKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xsZWN0aW9uIGZvciB1c2UgaW4gTGlxdWlkLgorICAgIGRlZiB0b19saXF1aWQKKyAgICAgIERyb3BzOjpDb2xsZWN0aW9uRHJvcC5uZXcgc2VsZgorICAgIGVuZAorCisgICAgIyBXaGV0aGVyIHRoZSBjb2xsZWN0aW9uJ3MgZG9jdW1lbnRzIG91Z2h0IHRvIGJlIHdyaXR0ZW4gYXMgaW5kaXZpZHVhbAorICAgICMgICBmaWxlcyBpbiB0aGUgb3V0cHV0LgorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgJ3dyaXRlJyBtZXRhZGF0YSBpcyB0cnVlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgZGVmIHdyaXRlPworICAgICAgISFtZXRhZGF0YS5mZXRjaCgib3V0cHV0IiwgZmFsc2UpCisgICAgZW5kCisKKyAgICAjIFRoZSBVUkwgdGVtcGxhdGUgdG8gcmVuZGVyIGNvbGxlY3Rpb24ncyBkb2N1bWVudHMgYXQuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgVVJMIHRlbXBsYXRlIHRvIHJlbmRlciBjb2xsZWN0aW9uJ3MgZG9jdW1lbnRzIGF0LgorICAgIGRlZiB1cmxfdGVtcGxhdGUKKyAgICAgIEB1cmxfdGVtcGxhdGUgfHw9IG1ldGFkYXRhLmZldGNoKCJwZXJtYWxpbmsiKSBkbworICAgICAgICBVdGlscy5hZGRfcGVybWFsaW5rX3N1ZmZpeCgiLzpjb2xsZWN0aW9uLzpwYXRoIiwgc2l0ZS5wZXJtYWxpbmtfc3R5bGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgRXh0cmFjdCBvcHRpb25zIGZvciB0aGlzIGNvbGxlY3Rpb24gZnJvbSB0aGUgc2l0ZSBjb25maWd1cmF0aW9uLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciB0aGlzIGNvbGxlY3Rpb24KKyAgICBkZWYgZXh0cmFjdF9tZXRhZGF0YQorICAgICAgaWYgc2l0ZS5jb25maWdbImNvbGxlY3Rpb25zIl0uaXNfYT8oSGFzaCkKKyAgICAgICAgc2l0ZS5jb25maWdbImNvbGxlY3Rpb25zIl1bbGFiZWxdIHx8IHt9CisgICAgICBlbHNlCisgICAgICAgIHt9CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiByZWFkX2RvY3VtZW50KGZ1bGxfcGF0aCkKKyAgICAgIGRvYyA9IEpla3lsbDo6RG9jdW1lbnQubmV3KGZ1bGxfcGF0aCwgOnNpdGUgPT4gc2l0ZSwgOmNvbGxlY3Rpb24gPT4gc2VsZikKKyAgICAgIGRvYy5yZWFkCisgICAgICBpZiBzaXRlLnB1Ymxpc2hlci5wdWJsaXNoPyhkb2MpIHx8ICF3cml0ZT8KKyAgICAgICAgZG9jcyA8PCBkb2MKKyAgICAgIGVsc2UKKyAgICAgICAgSmVreWxsLmxvZ2dlci5kZWJ1ZyAiU2tpcHBlZCBGcm9tIFB1Ymxpc2hpbmc6IiwgZG9jLnJlbGF0aXZlX3BhdGgKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIHJlYWRfc3RhdGljX2ZpbGUoZmlsZV9wYXRoLCBmdWxsX3BhdGgpCisgICAgICByZWxhdGl2ZV9kaXIgPSBKZWt5bGwuc2FuaXRpemVkX3BhdGgoCisgICAgICAgIHJlbGF0aXZlX2RpcmVjdG9yeSwKKyAgICAgICAgRmlsZS5kaXJuYW1lKGZpbGVfcGF0aCkKKyAgICAgICkuY2hvbXAoIi8uIikKKworICAgICAgZmlsZXMgPDwgU3RhdGljRmlsZS5uZXcoCisgICAgICAgIHNpdGUsCisgICAgICAgIHNpdGUuc291cmNlLAorICAgICAgICByZWxhdGl2ZV9kaXIsCisgICAgICAgIEZpbGUuYmFzZW5hbWUoZnVsbF9wYXRoKSwKKyAgICAgICAgc2VsZgorICAgICAgKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29tbWFuZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmMjQzZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmQucmIKQEAgLTAsMCArMSw3NiBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBDb21tYW5kCisgICAgY2xhc3MgPDwgc2VsZgorICAgICAgIyBBIGxpc3Qgb2Ygc3ViY2xhc3NlcyBvZiBKZWt5bGw6OkNvbW1hbmQKKyAgICAgIGRlZiBzdWJjbGFzc2VzCisgICAgICAgIEBzdWJjbGFzc2VzIHx8PSBbXQorICAgICAgZW5kCisKKyAgICAgICMgS2VlcCBhIGxpc3Qgb2Ygc3ViY2xhc3NlcyBvZiBKZWt5bGw6OkNvbW1hbmQgZXZlcnkgdGltZSBpdCdzIGluaGVyaXRlZAorICAgICAgIyBDYWxsZWQgYXV0b21hdGljYWxseS4KKyAgICAgICMKKyAgICAgICMgYmFzZSAtIHRoZSBzdWJjbGFzcworICAgICAgIworICAgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICAgIGRlZiBpbmhlcml0ZWQoYmFzZSkKKyAgICAgICAgc3ViY2xhc3NlcyA8PCBiYXNlCisgICAgICAgIHN1cGVyKGJhc2UpCisgICAgICBlbmQKKworICAgICAgIyBSdW4gU2l0ZSNwcm9jZXNzIGFuZCBjYXRjaCBlcnJvcnMKKyAgICAgICMKKyAgICAgICMgc2l0ZSAtIHRoZSBKZWt5bGw6OlNpdGUgb2JqZWN0CisgICAgICAjCisgICAgICAjIFJldHVybnMgbm90aGluZworICAgICAgZGVmIHByb2Nlc3Nfc2l0ZShzaXRlKQorICAgICAgICBzaXRlLnByb2Nlc3MKKyAgICAgIHJlc2N1ZSBKZWt5bGw6OkVycm9yczo6RmF0YWxFeGNlcHRpb24gPT4gZQorICAgICAgICBKZWt5bGwubG9nZ2VyLmVycm9yICJFUlJPUjoiLCAiWU9VUiBTSVRFIENPVUxEIE5PVCBCRSBCVUlMVDoiCisgICAgICAgIEpla3lsbC5sb2dnZXIuZXJyb3IgIiIsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICAgIEpla3lsbC5sb2dnZXIuZXJyb3IgIiIsIGUubWVzc2FnZQorICAgICAgICBleGl0KDEpCisgICAgICBlbmQKKworICAgICAgIyBDcmVhdGUgYSBmdWxsIEpla3lsbCBjb25maWd1cmF0aW9uIHdpdGggdGhlIG9wdGlvbnMgcGFzc2VkIGluIGFzIG92ZXJyaWRlcworICAgICAgIworICAgICAgIyBvcHRpb25zIC0gdGhlIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzCisgICAgICAjCisgICAgICAjIFJldHVybnMgYSBmdWxsIEpla3lsbCBjb25maWd1cmF0aW9uCisgICAgICBkZWYgY29uZmlndXJhdGlvbl9mcm9tX29wdGlvbnMob3B0aW9ucykKKyAgICAgICAgcmV0dXJuIG9wdGlvbnMgaWYgb3B0aW9ucy5pc19hPyhKZWt5bGw6OkNvbmZpZ3VyYXRpb24pCisgICAgICAgIEpla3lsbC5jb25maWd1cmF0aW9uKG9wdGlvbnMpCisgICAgICBlbmQKKworICAgICAgIyBBZGQgY29tbW9uIG9wdGlvbnMgdG8gYSBjb21tYW5kIGZvciBidWlsZGluZyBjb25maWd1cmF0aW9uCisgICAgICAjCisgICAgICAjIGMgLSB0aGUgSmVreWxsOjpDb21tYW5kIHRvIGFkZCB0aGVzZSBvcHRpb25zIHRvCisgICAgICAjCisgICAgICAjIFJldHVybnMgbm90aGluZworICAgICAgIyBydWJvY29wOmRpc2FibGUgTWV0cmljcy9NZXRob2RMZW5ndGgKKyAgICAgIGRlZiBhZGRfYnVpbGRfb3B0aW9ucyhjKQorICAgICAgICBjLm9wdGlvbiAiY29uZmlnIiwgIi0tY29uZmlnIENPTkZJR19GSUxFWyxDT05GSUdfRklMRTIsLi4uXSIsCisgICAgICAgICAgQXJyYXksICJDdXN0b20gY29uZmlndXJhdGlvbiBmaWxlIgorICAgICAgICBjLm9wdGlvbiAiZGVzdGluYXRpb24iLCAiLWQiLCAiLS1kZXN0aW5hdGlvbiBERVNUSU5BVElPTiIsCisgICAgICAgICAgIlRoZSBjdXJyZW50IGZvbGRlciB3aWxsIGJlIGdlbmVyYXRlZCBpbnRvIERFU1RJTkFUSU9OIgorICAgICAgICBjLm9wdGlvbiAic291cmNlIiwgIi1zIiwgIi0tc291cmNlIFNPVVJDRSIsICJDdXN0b20gc291cmNlIGRpcmVjdG9yeSIKKyAgICAgICAgYy5vcHRpb24gImZ1dHVyZSIsICItLWZ1dHVyZSIsICJQdWJsaXNoZXMgcG9zdHMgd2l0aCBhIGZ1dHVyZSBkYXRlIgorICAgICAgICBjLm9wdGlvbiAibGltaXRfcG9zdHMiLCAiLS1saW1pdF9wb3N0cyBNQVhfUE9TVFMiLCBJbnRlZ2VyLAorICAgICAgICAgICJMaW1pdHMgdGhlIG51bWJlciBvZiBwb3N0cyB0byBwYXJzZSBhbmQgcHVibGlzaCIKKyAgICAgICAgYy5vcHRpb24gIndhdGNoIiwgIi13IiwgIi0tW25vLV13YXRjaCIsICJXYXRjaCBmb3IgY2hhbmdlcyBhbmQgcmVidWlsZCIKKyAgICAgICAgYy5vcHRpb24gImJhc2V1cmwiLCAiLWIiLCAiLS1iYXNldXJsIFVSTCIsCisgICAgICAgICAgIlNlcnZlIHRoZSB3ZWJzaXRlIGZyb20gdGhlIGdpdmVuIGJhc2UgVVJMIgorICAgICAgICBjLm9wdGlvbiAiZm9yY2VfcG9sbGluZyIsICItLWZvcmNlX3BvbGxpbmciLCAiRm9yY2Ugd2F0Y2ggdG8gdXNlIHBvbGxpbmciCisgICAgICAgIGMub3B0aW9uICJsc2kiLCAiLS1sc2kiLCAiVXNlIExTSSBmb3IgaW1wcm92ZWQgcmVsYXRlZCBwb3N0cyIKKyAgICAgICAgYy5vcHRpb24gInNob3dfZHJhZnRzIiwgIi1EIiwgIi0tZHJhZnRzIiwgIlJlbmRlciBwb3N0cyBpbiB0aGUgX2RyYWZ0cyBmb2xkZXIiCisgICAgICAgIGMub3B0aW9uICJ1bnB1Ymxpc2hlZCIsICItLXVucHVibGlzaGVkIiwKKyAgICAgICAgICAiUmVuZGVyIHBvc3RzIHRoYXQgd2VyZSBtYXJrZWQgYXMgdW5wdWJsaXNoZWQiCisgICAgICAgIGMub3B0aW9uICJxdWlldCIsICItcSIsICItLXF1aWV0IiwgIlNpbGVuY2Ugb3V0cHV0LiIKKyAgICAgICAgYy5vcHRpb24gInZlcmJvc2UiLCAiLVYiLCAiLS12ZXJib3NlIiwgIlByaW50IHZlcmJvc2Ugb3V0cHV0LiIKKyAgICAgICAgYy5vcHRpb24gImluY3JlbWVudGFsIiwgIi1JIiwgIi0taW5jcmVtZW50YWwiLCAiRW5hYmxlIGluY3JlbWVudGFsIHJlYnVpbGQuIgorICAgICAgICBjLm9wdGlvbiAic3RyaWN0X2Zyb250X21hdHRlciIsICItLXN0cmljdF9mcm9udF9tYXR0ZXIiLAorICAgICAgICAgICJGYWlsIGlmIGVycm9ycyBhcmUgcHJlc2VudCBpbiBmcm9udCBtYXR0ZXIiCisgICAgICBlbmQKKyAgICAgICMgcnVib2NvcDplbmFibGUgTWV0cmljcy9NZXRob2RMZW5ndGgKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL2J1aWxkLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29tbWFuZHMvYnVpbGQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlYTYwNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL2J1aWxkLnJiCkBAIC0wLDAgKzEsMTAwIEBACittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBDb21tYW5kcworICAgIGNsYXNzIEJ1aWxkIDwgQ29tbWFuZAorICAgICAgY2xhc3MgPDwgc2VsZgorICAgICAgICAjIENyZWF0ZSB0aGUgTWVyY2VuYXJ5IGNvbW1hbmQgZm9yIHRoZSBKZWt5bGwgQ0xJIGZvciB0aGlzIENvbW1hbmQKKyAgICAgICAgZGVmIGluaXRfd2l0aF9wcm9ncmFtKHByb2cpCisgICAgICAgICAgcHJvZy5jb21tYW5kKDpidWlsZCkgZG8gfGN8CisgICAgICAgICAgICBjLnN5bnRheCAgICAgICJidWlsZCBbb3B0aW9uc10iCisgICAgICAgICAgICBjLmRlc2NyaXB0aW9uICJCdWlsZCB5b3VyIHNpdGUiCisgICAgICAgICAgICBjLmFsaWFzIDpiCisKKyAgICAgICAgICAgIGFkZF9idWlsZF9vcHRpb25zKGMpCisKKyAgICAgICAgICAgIGMuYWN0aW9uIGRvIHxfLCBvcHRpb25zfAorICAgICAgICAgICAgICBvcHRpb25zWyJzZXJ2aW5nIl0gPSBmYWxzZQorICAgICAgICAgICAgICBKZWt5bGw6OkNvbW1hbmRzOjpCdWlsZC5wcm9jZXNzKG9wdGlvbnMpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBCdWlsZCB5b3VyIGpla3lsbCBzaXRlCisgICAgICAgICMgQ29udGludW91c2x5IHdhdGNoIGlmIGB3YXRjaGAgaXMgc2V0IHRvIHRydWUgaW4gdGhlIGNvbmZpZy4KKyAgICAgICAgZGVmIHByb2Nlc3Mob3B0aW9ucykKKyAgICAgICAgICAjIEFkanVzdCB2ZXJib3NpdHkgcXVpY2tseQorICAgICAgICAgIEpla3lsbC5sb2dnZXIuYWRqdXN0X3ZlcmJvc2l0eShvcHRpb25zKQorCisgICAgICAgICAgb3B0aW9ucyA9IGNvbmZpZ3VyYXRpb25fZnJvbV9vcHRpb25zKG9wdGlvbnMpCisgICAgICAgICAgc2l0ZSA9IEpla3lsbDo6U2l0ZS5uZXcob3B0aW9ucykKKworICAgICAgICAgIGlmIG9wdGlvbnMuZmV0Y2goInNraXBfaW5pdGlhbF9idWlsZCIsIGZhbHNlKQorICAgICAgICAgICAgSmVreWxsLmxvZ2dlci53YXJuICJCdWlsZCBXYXJuaW5nOiIsICJTa2lwcGluZyB0aGUgaW5pdGlhbCBidWlsZC4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgVGhpcyBtYXkgcmVzdWx0IGluIGFuIG91dC1vZi1kYXRlIHNpdGUuIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1aWxkKHNpdGUsIG9wdGlvbnMpCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBpZiBvcHRpb25zLmZldGNoKCJkZXRhY2giLCBmYWxzZSkKKyAgICAgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbyAiQXV0by1yZWdlbmVyYXRpb246IiwKKyAgICAgICAgICAgICAgImRpc2FibGVkIHdoZW4gcnVubmluZyBzZXJ2ZXIgZGV0YWNoZWQuIgorICAgICAgICAgIGVsc2lmIG9wdGlvbnMuZmV0Y2goIndhdGNoIiwgZmFsc2UpCisgICAgICAgICAgICB3YXRjaChzaXRlLCBvcHRpb25zKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbyAiQXV0by1yZWdlbmVyYXRpb246IiwgImRpc2FibGVkLiBVc2UgLS13YXRjaCB0byBlbmFibGUuIgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICAjIEJ1aWxkIHlvdXIgSmVreWxsIHNpdGUuCisgICAgICAgICMKKyAgICAgICAgIyBzaXRlIC0gdGhlIEpla3lsbDo6U2l0ZSBpbnN0YW5jZSB0byBidWlsZAorICAgICAgICAjIG9wdGlvbnMgLSBBIEhhc2ggb2Ygb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGNvbW1hbmQKKyAgICAgICAgIworICAgICAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICAgICAgZGVmIGJ1aWxkKHNpdGUsIG9wdGlvbnMpCisgICAgICAgICAgdCA9IFRpbWUubm93CisgICAgICAgICAgc291cmNlICAgICAgPSBvcHRpb25zWyJzb3VyY2UiXQorICAgICAgICAgIGRlc3RpbmF0aW9uID0gb3B0aW9uc1siZGVzdGluYXRpb24iXQorICAgICAgICAgIGluY3JlbWVudGFsID0gb3B0aW9uc1siaW5jcmVtZW50YWwiXQorICAgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbyAiU291cmNlOiIsIHNvdXJjZQorICAgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbyAiRGVzdGluYXRpb246IiwgZGVzdGluYXRpb24KKyAgICAgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gIkluY3JlbWVudGFsIGJ1aWxkOiIsCisgICAgICAgICAgICAoaW5jcmVtZW50YWwgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQuIEVuYWJsZSB3aXRoIC0taW5jcmVtZW50YWwiKQorICAgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbyAiR2VuZXJhdGluZy4uLiIKKyAgICAgICAgICBwcm9jZXNzX3NpdGUoc2l0ZSkKKyAgICAgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gIiIsICJkb25lIGluICN7KFRpbWUubm93IC0gdCkucm91bmQoMyl9IHNlY29uZHMuIgorICAgICAgICBlbmQKKworICAgICAgICAjIFByaXZhdGU6IFdhdGNoIGZvciBmaWxlIGNoYW5nZXMgYW5kIHJlYnVpbGQgdGhlIHNpdGUuCisgICAgICAgICMKKyAgICAgICAgIyBzaXRlIC0gQSBKZWt5bGw6OlNpdGUgaW5zdGFuY2UKKyAgICAgICAgIyBvcHRpb25zIC0gQSBIYXNoIG9mIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBjb21tYW5kCisgICAgICAgICMKKyAgICAgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgICAgIGRlZiB3YXRjaChzaXRlLCBvcHRpb25zKQorICAgICAgICAgICMgV2FybiBXaW5kb3dzIHVzZXJzIHRoYXQgdGhleSBtaWdodCBuZWVkIHRvIHVwZ3JhZGUuCisgICAgICAgICAgaWYgVXRpbHM6OlBsYXRmb3Jtcy5iYXNoX29uX3dpbmRvd3M/CisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLndhcm4gIiIsCisgICAgICAgICAgICAgICJBdXRvLXJlZ2VuZXJhdGlvbiBtYXkgbm90IHdvcmsgb24gc29tZSBXaW5kb3dzIHZlcnNpb25zLiIKKyAgICAgICAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiIiwKKyAgICAgICAgICAgICAgIlBsZWFzZSBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQmFzaE9uV2luZG93cy9pc3N1ZXMvMjE2IgorICAgICAgICAgICAgSmVreWxsLmxvZ2dlci53YXJuICIiLAorICAgICAgICAgICAgICAiSWYgaXQgZG9lcyBub3Qgd29yaywgcGxlYXNlIHVwZ3JhZGUgQmFzaCBvbiBXaW5kb3dzIG9yICJcCisgICAgICAgICAgICAgICAgInJ1biBKZWt5bGwgd2l0aCAtLW5vLXdhdGNoLiIKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIEV4dGVybmFsLnJlcXVpcmVfd2l0aF9ncmFjZWZ1bF9mYWlsICJqZWt5bGwtd2F0Y2giCisgICAgICAgICAgd2F0Y2hfbWV0aG9kID0gSmVreWxsOjpXYXRjaGVyLm1ldGhvZCg6d2F0Y2gpCisgICAgICAgICAgaWYgd2F0Y2hfbWV0aG9kLnBhcmFtZXRlcnMuc2l6ZSA9PSAxCisgICAgICAgICAgICB3YXRjaF9tZXRob2QuY2FsbCgKKyAgICAgICAgICAgICAgb3B0aW9ucworICAgICAgICAgICAgKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdhdGNoX21ldGhvZC5jYWxsKAorICAgICAgICAgICAgICBvcHRpb25zLCBzaXRlCisgICAgICAgICAgICApCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kICMgZW5kIG9mIGNsYXNzIDw8IHNlbGYKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL2NsZWFuLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29tbWFuZHMvY2xlYW4ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0NGQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL2NsZWFuLnJiCkBAIC0wLDAgKzEsNDEgQEAKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIENvbW1hbmRzCisgICAgY2xhc3MgQ2xlYW4gPCBDb21tYW5kCisgICAgICBjbGFzcyA8PCBzZWxmCisgICAgICAgIGRlZiBpbml0X3dpdGhfcHJvZ3JhbShwcm9nKQorICAgICAgICAgIHByb2cuY29tbWFuZCg6Y2xlYW4pIGRvIHxjfAorICAgICAgICAgICAgYy5zeW50YXggImNsZWFuIFtzdWJjb21tYW5kXSIKKyAgICAgICAgICAgIGMuZGVzY3JpcHRpb24gIkNsZWFuIHRoZSBzaXRlICIgXAorICAgICAgICAgICAgICAgICAgIihyZW1vdmVzIHNpdGUgb3V0cHV0IGFuZCBtZXRhZGF0YSBmaWxlKSB3aXRob3V0IGJ1aWxkaW5nLiIKKworICAgICAgICAgICAgYWRkX2J1aWxkX29wdGlvbnMoYykKKworICAgICAgICAgICAgYy5hY3Rpb24gZG8gfF8sIG9wdGlvbnN8CisgICAgICAgICAgICAgIEpla3lsbDo6Q29tbWFuZHM6OkNsZWFuLnByb2Nlc3Mob3B0aW9ucykKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBkZWYgcHJvY2VzcyhvcHRpb25zKQorICAgICAgICAgIG9wdGlvbnMgPSBjb25maWd1cmF0aW9uX2Zyb21fb3B0aW9ucyhvcHRpb25zKQorICAgICAgICAgIGRlc3RpbmF0aW9uID0gb3B0aW9uc1siZGVzdGluYXRpb24iXQorICAgICAgICAgIG1ldGFkYXRhX2ZpbGUgPSBGaWxlLmpvaW4ob3B0aW9uc1sic291cmNlIl0sICIuamVreWxsLW1ldGFkYXRhIikKKyAgICAgICAgICBzYXNzX2NhY2hlID0gRmlsZS5qb2luKG9wdGlvbnNbInNvdXJjZSJdLCAiLnNhc3MtY2FjaGUiKQorCisgICAgICAgICAgcmVtb3ZlKGRlc3RpbmF0aW9uLCA6Y2hlY2tlcl9mdW5jID0+IDpkaXJlY3Rvcnk/KQorICAgICAgICAgIHJlbW92ZShtZXRhZGF0YV9maWxlLCA6Y2hlY2tlcl9mdW5jID0+IDpmaWxlPykKKyAgICAgICAgICByZW1vdmUoc2Fzc19jYWNoZSwgOmNoZWNrZXJfZnVuYyA9PiA6ZGlyZWN0b3J5PykKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIHJlbW92ZShmaWxlbmFtZSwgY2hlY2tlcl9mdW5jOiA6ZmlsZT8pCisgICAgICAgICAgaWYgRmlsZS5wdWJsaWNfc2VuZChjaGVja2VyX2Z1bmMsIGZpbGVuYW1lKQorICAgICAgICAgICAgSmVreWxsLmxvZ2dlci5pbmZvICJDbGVhbmVyOiIsICJSZW1vdmluZyAje2ZpbGVuYW1lfS4uLiIKKyAgICAgICAgICAgIEZpbGVVdGlscy5ybV9yZihmaWxlbmFtZSkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gIkNsZWFuZXI6IiwgIk5vdGhpbmcgdG8gZG8gZm9yICN7ZmlsZW5hbWV9LiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL2RvY3Rvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL2RvY3Rvci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTAwNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29tbWFuZHMvZG9jdG9yLnJiCkBAIC0wLDAgKzEsMTE2IEBACittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBDb21tYW5kcworICAgIGNsYXNzIERvY3RvciA8IENvbW1hbmQKKyAgICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgICAgZGVmIGluaXRfd2l0aF9wcm9ncmFtKHByb2cpCisgICAgICAgICAgcHJvZy5jb21tYW5kKDpkb2N0b3IpIGRvIHxjfAorICAgICAgICAgICAgYy5zeW50YXggImRvY3RvciIKKyAgICAgICAgICAgIGMuZGVzY3JpcHRpb24gIlNlYXJjaCBzaXRlIGFuZCBwcmludCBzcGVjaWZpYyBkZXByZWNhdGlvbiB3YXJuaW5ncyIKKyAgICAgICAgICAgIGMuYWxpYXMoOmh5ZGUpCisKKyAgICAgICAgICAgIGMub3B0aW9uICJjb25maWciLCAiLS1jb25maWcgQ09ORklHX0ZJTEVbLENPTkZJR19GSUxFMiwuLi5dIiwgQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkN1c3RvbSBjb25maWd1cmF0aW9uIGZpbGUiCisKKyAgICAgICAgICAgIGMuYWN0aW9uIGRvIHxfLCBvcHRpb25zfAorICAgICAgICAgICAgICBKZWt5bGw6OkNvbW1hbmRzOjpEb2N0b3IucHJvY2VzcyhvcHRpb25zKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBwcm9jZXNzKG9wdGlvbnMpCisgICAgICAgICAgc2l0ZSA9IEpla3lsbDo6U2l0ZS5uZXcoY29uZmlndXJhdGlvbl9mcm9tX29wdGlvbnMob3B0aW9ucykpCisgICAgICAgICAgc2l0ZS5yZXNldAorICAgICAgICAgIHNpdGUucmVhZAorICAgICAgICAgIHNpdGUuZ2VuZXJhdGUKKworICAgICAgICAgIGlmIGhlYWx0aHk/KHNpdGUpCisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gIllvdXIgdGVzdCByZXN1bHRzIiwgImFyZSBpbi4gRXZlcnl0aGluZyBsb29rcyBmaW5lLiIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhYm9ydAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBkZWYgaGVhbHRoeT8oc2l0ZSkKKyAgICAgICAgICBbCisgICAgICAgICAgICBmc25vdGlmeV9idWdneT8oc2l0ZSksCisgICAgICAgICAgICAhZGVwcmVjYXRlZF9yZWxhdGl2ZV9wZXJtYWxpbmtzKHNpdGUpLAorICAgICAgICAgICAgIWNvbmZsaWN0aW5nX3VybHMoc2l0ZSksCisgICAgICAgICAgICAhdXJsc19vbmx5X2RpZmZlcl9ieV9jYXNlKHNpdGUpLAorICAgICAgICAgIF0uYWxsPworICAgICAgICBlbmQKKworICAgICAgICBkZWYgZGVwcmVjYXRlZF9yZWxhdGl2ZV9wZXJtYWxpbmtzKHNpdGUpCisgICAgICAgICAgaWYgc2l0ZS5jb25maWdbInJlbGF0aXZlX3Blcm1hbGlua3MiXQorICAgICAgICAgICAgSmVreWxsOjpEZXByZWNhdG9yLmRlcHJlY2F0aW9uX21lc3NhZ2UgIllvdXIgc2l0ZSBzdGlsbCB1c2VzIHJlbGF0aXZlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcGVybWFsaW5rcywgd2hpY2ggd2FzIHJlbW92ZWQgaW4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBKZWt5bGwgdjMuMC4wLiIKKyAgICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBjb25mbGljdGluZ191cmxzKHNpdGUpCisgICAgICAgICAgY29uZmxpY3RpbmdfdXJscyA9IGZhbHNlCisgICAgICAgICAgdXJscyA9IHt9CisgICAgICAgICAgdXJscyA9IGNvbGxlY3RfdXJscyh1cmxzLCBzaXRlLnBhZ2VzLCBzaXRlLmRlc3QpCisgICAgICAgICAgdXJscyA9IGNvbGxlY3RfdXJscyh1cmxzLCBzaXRlLnBvc3RzLmRvY3MsIHNpdGUuZGVzdCkKKyAgICAgICAgICB1cmxzLmVhY2ggZG8gfHVybCwgcGF0aHN8CisgICAgICAgICAgICBuZXh0IHVubGVzcyBwYXRocy5zaXplID4gMQorICAgICAgICAgICAgY29uZmxpY3RpbmdfdXJscyA9IHRydWUKKyAgICAgICAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiQ29uZmxpY3Q6IiwgIlRoZSBVUkwgJyN7dXJsfScgaXMgdGhlIGRlc3RpbmF0aW9uIiBcCisgICAgICAgICAgICAgICIgZm9yIHRoZSBmb2xsb3dpbmcgcGFnZXM6ICN7cGF0aHMuam9pbigiLCAiKX0iCisgICAgICAgICAgZW5kCisgICAgICAgICAgY29uZmxpY3RpbmdfdXJscworICAgICAgICBlbmQKKworICAgICAgICBkZWYgZnNub3RpZnlfYnVnZ3k/KF9zaXRlKQorICAgICAgICAgIHJldHVybiB0cnVlIHVubGVzcyBVdGlsczo6UGxhdGZvcm1zLm9zeD8KKyAgICAgICAgICBpZiBEaXIucHdkICE9IGBwd2RgLnN0cmlwCisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLmVycm9yICIgICIgKyA8PC1TVFIuc3RyaXAuZ3N1YiglciFcblxzKyEsICJcbiAgIikKKyAgICAgICAgICAgICAgV2UgaGF2ZSBkZXRlY3RlZCB0aGF0IHRoZXJlIG1pZ2h0IGJlIHRyb3VibGUgdXNpbmcgZnNldmVudCBvbiB5b3VyCisgICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW0sIHlvdSBjYW4gcmVhZCBodHRwczovL2dpdGh1Yi5jb20vdGhpYmF1ZGdnL3JiLWZzZXZlbnQvd2lraS9uby1mc2V2ZW50cy1maXJlZC0oT1NYLWJ1ZykKKyAgICAgICAgICAgICAgZm9yIHBvc3NpYmxlIHdvcmsgYXJvdW5kcyBvciB5b3UgY2FuIHdvcmsgYXJvdW5kIGl0IGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgIHdpdGggYC0tZm9yY2UtcG9sbGluZ2AuCisgICAgICAgICAgICBTVFIKKworICAgICAgICAgICAgZmFsc2UKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIHRydWUKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIHVybHNfb25seV9kaWZmZXJfYnlfY2FzZShzaXRlKQorICAgICAgICAgIHVybHNfb25seV9kaWZmZXJfYnlfY2FzZSA9IGZhbHNlCisgICAgICAgICAgdXJscyA9IGNhc2VfaW5zZW5zaXRpdmVfdXJscyhzaXRlLnBhZ2VzICsgc2l0ZS5kb2NzX3RvX3dyaXRlLCBzaXRlLmRlc3QpCisgICAgICAgICAgdXJscy5lYWNoIGRvIHxfY2FzZV9pbnNlbnNpdGl2ZV91cmwsIHJlYWxfdXJsc3wKKyAgICAgICAgICAgIG5leHQgdW5sZXNzIHJlYWxfdXJscy51bmlxLnNpemUgPiAxCisgICAgICAgICAgICB1cmxzX29ubHlfZGlmZmVyX2J5X2Nhc2UgPSB0cnVlCisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLndhcm4gIldhcm5pbmc6IiwgIlRoZSBmb2xsb3dpbmcgVVJMcyBvbmx5IGRpZmZlciIgXAorICAgICAgICAgICAgICAiIGJ5IGNhc2UuIE9uIGEgY2FzZS1pbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbSBvbmUgb2YgdGhlIFVSTHMiIFwKKyAgICAgICAgICAgICAgIiB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdGhlcjogI3tyZWFsX3VybHMuam9pbigiLCAiKX0iCisgICAgICAgICAgZW5kCisgICAgICAgICAgdXJsc19vbmx5X2RpZmZlcl9ieV9jYXNlCisgICAgICAgIGVuZAorCisgICAgICAgIHByaXZhdGUKKyAgICAgICAgZGVmIGNvbGxlY3RfdXJscyh1cmxzLCB0aGluZ3MsIGRlc3RpbmF0aW9uKQorICAgICAgICAgIHRoaW5ncy5lYWNoIGRvIHx0aGluZ3wKKyAgICAgICAgICAgIGRlc3QgPSB0aGluZy5kZXN0aW5hdGlvbihkZXN0aW5hdGlvbikKKyAgICAgICAgICAgIGlmIHVybHNbZGVzdF0KKyAgICAgICAgICAgICAgdXJsc1tkZXN0XSA8PCB0aGluZy5wYXRoCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHVybHNbZGVzdF0gPSBbdGhpbmcucGF0aF0KKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICAgIHVybHMKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIGNhc2VfaW5zZW5zaXRpdmVfdXJscyh0aGluZ3MsIGRlc3RpbmF0aW9uKQorICAgICAgICAgIHRoaW5ncy5lYWNoX3dpdGhfb2JqZWN0KHt9KSBkbyB8dGhpbmcsIG1lbW98CisgICAgICAgICAgICBkZXN0ID0gdGhpbmcuZGVzdGluYXRpb24oZGVzdGluYXRpb24pCisgICAgICAgICAgICAobWVtb1tkZXN0LmRvd25jYXNlXSB8fD0gW10pIDw8IGRlc3QKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL2hlbHAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb21tYW5kcy9oZWxwLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjEzNmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb21tYW5kcy9oZWxwLnJiCkBAIC0wLDAgKzEsMzIgQEAKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIENvbW1hbmRzCisgICAgY2xhc3MgSGVscCA8IENvbW1hbmQKKyAgICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgICAgZGVmIGluaXRfd2l0aF9wcm9ncmFtKHByb2cpCisgICAgICAgICAgcHJvZy5jb21tYW5kKDpoZWxwKSBkbyB8Y3wKKyAgICAgICAgICAgIGMuc3ludGF4ICJoZWxwIFtzdWJjb21tYW5kXSIKKyAgICAgICAgICAgIGMuZGVzY3JpcHRpb24gIlNob3cgdGhlIGhlbHAgbWVzc2FnZSwgb3B0aW9uYWxseSBmb3IgYSBnaXZlbiBzdWJjb21tYW5kLiIKKworICAgICAgICAgICAgYy5hY3Rpb24gZG8gfGFyZ3MsIF98CisgICAgICAgICAgICAgIGNtZCA9IChhcmdzLmZpcnN0IHx8ICIiKS50b19zeW0KKyAgICAgICAgICAgICAgaWYgYXJncy5lbXB0eT8KKyAgICAgICAgICAgICAgICBwdXRzIHByb2cKKyAgICAgICAgICAgICAgZWxzaWYgcHJvZy5oYXNfY29tbWFuZD8gY21kCisgICAgICAgICAgICAgICAgcHV0cyBwcm9nLmNvbW1hbmRzW2NtZF0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGludmFsaWRfY29tbWFuZChwcm9nLCBjbWQpCisgICAgICAgICAgICAgICAgYWJvcnQKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIGludmFsaWRfY29tbWFuZChwcm9nLCBjbWQpCisgICAgICAgICAgSmVreWxsLmxvZ2dlci5lcnJvciAiRXJyb3I6IiwKKyAgICAgICAgICAgICAgICAiSG1tLi4uIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgJyN7Y21kfScgY29tbWFuZCBpcy4iCisgICAgICAgICAgSmVreWxsLmxvZ2dlci5pbmZvICAiVmFsaWQgY29tbWFuZHM6IiwgcHJvZy5jb21tYW5kcy5rZXlzLmpvaW4oIiwgIikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL25ldy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL25ldy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTFkNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29tbWFuZHMvbmV3LnJiCkBAIC0wLDAgKzEsMTUwIEBACityZXF1aXJlICJlcmIiCisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIENvbW1hbmRzCisgICAgY2xhc3MgTmV3IDwgQ29tbWFuZAorICAgICAgY2xhc3MgPDwgc2VsZgorICAgICAgICBkZWYgaW5pdF93aXRoX3Byb2dyYW0ocHJvZykKKyAgICAgICAgICBwcm9nLmNvbW1hbmQoOm5ldykgZG8gfGN8CisgICAgICAgICAgICBjLnN5bnRheCAibmV3IFBBVEgiCisgICAgICAgICAgICBjLmRlc2NyaXB0aW9uICJDcmVhdGVzIGEgbmV3IEpla3lsbCBzaXRlIHNjYWZmb2xkIGluIFBBVEgiCisKKyAgICAgICAgICAgIGMub3B0aW9uICJmb3JjZSIsICItLWZvcmNlIiwgIkZvcmNlIGNyZWF0aW9uIGV2ZW4gaWYgUEFUSCBhbHJlYWR5IGV4aXN0cyIKKyAgICAgICAgICAgIGMub3B0aW9uICJibGFuayIsICItLWJsYW5rIiwgIkNyZWF0ZXMgc2NhZmZvbGRpbmcgYnV0IHdpdGggZW1wdHkgZmlsZXMiCisgICAgICAgICAgICBjLm9wdGlvbiAic2tpcC1idW5kbGUiLCAiLS1za2lwLWJ1bmRsZSIsICJTa2lwICdidW5kbGUgaW5zdGFsbCciCisKKyAgICAgICAgICAgIGMuYWN0aW9uIGRvIHxhcmdzLCBvcHRpb25zfAorICAgICAgICAgICAgICBKZWt5bGw6OkNvbW1hbmRzOjpOZXcucHJvY2VzcyhhcmdzLCBvcHRpb25zKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBwcm9jZXNzKGFyZ3MsIG9wdGlvbnMgPSB7fSkKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiWW91IG11c3Qgc3BlY2lmeSBhIHBhdGguIiBpZiBhcmdzLmVtcHR5PworCisgICAgICAgICAgbmV3X2Jsb2dfcGF0aCA9IEZpbGUuZXhwYW5kX3BhdGgoYXJncy5qb2luKCIgIiksIERpci5wd2QpCisgICAgICAgICAgRmlsZVV0aWxzLm1rZGlyX3AgbmV3X2Jsb2dfcGF0aAorICAgICAgICAgIGlmIHByZXNlcnZlX3NvdXJjZV9sb2NhdGlvbj8obmV3X2Jsb2dfcGF0aCwgb3B0aW9ucykKKyAgICAgICAgICAgIEpla3lsbC5sb2dnZXIuYWJvcnRfd2l0aCAiQ29uZmxpY3Q6IiwKKyAgICAgICAgICAgICAgICAgICAgICAiI3tuZXdfYmxvZ19wYXRofSBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eS4iCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBpZiBvcHRpb25zWyJibGFuayJdCisgICAgICAgICAgICBjcmVhdGVfYmxhbmtfc2l0ZSBuZXdfYmxvZ19wYXRoCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY3JlYXRlX3NpdGUgbmV3X2Jsb2dfcGF0aAorICAgICAgICAgIGVuZAorCisgICAgICAgICAgYWZ0ZXJfaW5zdGFsbChuZXdfYmxvZ19wYXRoLCBvcHRpb25zKQorICAgICAgICBlbmQKKworICAgICAgICBkZWYgY3JlYXRlX2JsYW5rX3NpdGUocGF0aCkKKyAgICAgICAgICBEaXIuY2hkaXIocGF0aCkgZG8KKyAgICAgICAgICAgIEZpbGVVdGlscy5ta2RpcigldyhfbGF5b3V0cyBfcG9zdHMgX2RyYWZ0cykpCisgICAgICAgICAgICBGaWxlVXRpbHMudG91Y2goImluZGV4Lmh0bWwiKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBkZWYgc2NhZmZvbGRfcG9zdF9jb250ZW50CisgICAgICAgICAgRVJCLm5ldyhGaWxlLnJlYWQoRmlsZS5leHBhbmRfcGF0aChzY2FmZm9sZF9wYXRoLCBzaXRlX3RlbXBsYXRlKSkpLnJlc3VsdAorICAgICAgICBlbmQKKworICAgICAgICAjIEludGVybmFsOiBHZXRzIHRoZSBmaWxlbmFtZSBvZiB0aGUgc2FtcGxlIHBvc3QgdG8gYmUgY3JlYXRlZAorICAgICAgICAjCisgICAgICAgICMgUmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgdGhlIHNhbXBsZSBwb3N0LCBhcyBhIFN0cmluZworICAgICAgICBkZWYgaW5pdGlhbGl6ZWRfcG9zdF9uYW1lCisgICAgICAgICAgIl9wb3N0cy8je1RpbWUubm93LnN0cmZ0aW1lKCIlWS0lbS0lZCIpfS13ZWxjb21lLXRvLWpla3lsbC5tYXJrZG93biIKKyAgICAgICAgZW5kCisKKyAgICAgICAgcHJpdmF0ZQorCisgICAgICAgIGRlZiBnZW1maWxlX2NvbnRlbnRzCisgICAgICAgICAgPDwtUlVCWQorc291cmNlICJodHRwczovL3J1YnlnZW1zLm9yZyIKKworIyBIZWxsbyEgVGhpcyBpcyB3aGVyZSB5b3UgbWFuYWdlIHdoaWNoIEpla3lsbCB2ZXJzaW9uIGlzIHVzZWQgdG8gcnVuLgorIyBXaGVuIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCB2ZXJzaW9uLCBjaGFuZ2UgaXQgYmVsb3csIHNhdmUgdGhlCisjIGZpbGUgYW5kIHJ1biBgYnVuZGxlIGluc3RhbGxgLiBSdW4gSmVreWxsIHdpdGggYGJ1bmRsZSBleGVjYCwgbGlrZSBzbzoKKyMKKyMgICAgIGJ1bmRsZSBleGVjIGpla3lsbCBzZXJ2ZQorIworIyBUaGlzIHdpbGwgaGVscCBlbnN1cmUgdGhlIHByb3BlciBKZWt5bGwgdmVyc2lvbiBpcyBydW5uaW5nLgorIyBIYXBweSBKZWt5bGxpbmchCitnZW0gImpla3lsbCIsICIje0pla3lsbDo6VkVSU0lPTn0iCisKKyMgVGhpcyBpcyB0aGUgZGVmYXVsdCB0aGVtZSBmb3IgbmV3IEpla3lsbCBzaXRlcy4gWW91IG1heSBjaGFuZ2UgdGhpcyB0byBhbnl0aGluZyB5b3UgbGlrZS4KK2dlbSAibWluaW1hIiwgIn4+IDIuMCIKKworIyBJZiB5b3Ugd2FudCB0byB1c2UgR2l0SHViIFBhZ2VzLCByZW1vdmUgdGhlICJnZW0gImpla3lsbCIiIGFib3ZlIGFuZAorIyB1bmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cuIFRvIHVwZ3JhZGUsIHJ1biBgYnVuZGxlIHVwZGF0ZSBnaXRodWItcGFnZXNgLgorIyBnZW0gImdpdGh1Yi1wYWdlcyIsIGdyb3VwOiA6amVreWxsX3BsdWdpbnMKKworIyBJZiB5b3UgaGF2ZSBhbnkgcGx1Z2lucywgcHV0IHRoZW0gaGVyZSEKK2dyb3VwIDpqZWt5bGxfcGx1Z2lucyBkbworICAgZ2VtICJqZWt5bGwtZmVlZCIsICJ+PiAwLjYiCitlbmQKKworIyBXaW5kb3dzIGRvZXMgbm90IGluY2x1ZGUgem9uZWluZm8gZmlsZXMsIHNvIGJ1bmRsZSB0aGUgdHppbmZvLWRhdGEgZ2VtCitnZW0gJ3R6aW5mby1kYXRhJywgcGxhdGZvcm1zOiBbOm1pbmd3LCA6bXN3aW4sIDp4NjRfbWluZ3csIDpqcnVieV0KKworUlVCWQorICAgICAgICBlbmQKKworICAgICAgICBkZWYgY3JlYXRlX3NpdGUobmV3X2Jsb2dfcGF0aCkKKyAgICAgICAgICBjcmVhdGVfc2FtcGxlX2ZpbGVzIG5ld19ibG9nX3BhdGgKKworICAgICAgICAgIEZpbGUub3BlbihGaWxlLmV4cGFuZF9wYXRoKGluaXRpYWxpemVkX3Bvc3RfbmFtZSwgbmV3X2Jsb2dfcGF0aCksICJ3IikgZG8gfGZ8CisgICAgICAgICAgICBmLndyaXRlKHNjYWZmb2xkX3Bvc3RfY29udGVudCkKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIEZpbGUub3BlbihGaWxlLmV4cGFuZF9wYXRoKCJHZW1maWxlIiwgbmV3X2Jsb2dfcGF0aCksICJ3IikgZG8gfGZ8CisgICAgICAgICAgICBmLndyaXRlKGdlbWZpbGVfY29udGVudHMpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBwcmVzZXJ2ZV9zb3VyY2VfbG9jYXRpb24/KHBhdGgsIG9wdGlvbnMpCisgICAgICAgICAgIW9wdGlvbnNbImZvcmNlIl0gJiYgIURpclsiI3twYXRofS8qKi8qIl0uZW1wdHk/CisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBjcmVhdGVfc2FtcGxlX2ZpbGVzKHBhdGgpCisgICAgICAgICAgRmlsZVV0aWxzLmNwX3Igc2l0ZV90ZW1wbGF0ZSArICIvLiIsIHBhdGgKKyAgICAgICAgICBGaWxlVXRpbHMuY2htb2RfUiAidSt3IiwgcGF0aAorICAgICAgICAgIEZpbGVVdGlscy5ybSBGaWxlLmV4cGFuZF9wYXRoKHNjYWZmb2xkX3BhdGgsIHBhdGgpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBzaXRlX3RlbXBsYXRlCisgICAgICAgICAgRmlsZS5leHBhbmRfcGF0aCgiLi4vLi4vc2l0ZV90ZW1wbGF0ZSIsIEZpbGUuZGlybmFtZShfX0ZJTEVfXykpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBzY2FmZm9sZF9wYXRoCisgICAgICAgICAgIl9wb3N0cy8wMDAwLTAwLTAwLXdlbGNvbWUtdG8tamVreWxsLm1hcmtkb3duLmVyYiIKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBBZnRlciBhIG5ldyBibG9nIGhhcyBiZWVuIGNyZWF0ZWQsIHByaW50IGEgc3VjY2VzcyBub3RpZmljYXRpb24gYW5kCisgICAgICAgICMgdGhlbiBhdXRvbWF0aWNhbGx5IGV4ZWN1dGUgYnVuZGxlIGluc3RhbGwgZnJvbSB3aXRoaW4gdGhlIG5ldyBibG9nIGRpcgorICAgICAgICAjIHVubGVzcyB0aGUgdXNlciBvcHRzIHRvIGdlbmVyYXRlIGEgYmxhbmsgYmxvZyBvciBza2lwICdidW5kbGUgaW5zdGFsbCcuCisKKyAgICAgICAgZGVmIGFmdGVyX2luc3RhbGwocGF0aCwgb3B0aW9ucyA9IHt9KQorICAgICAgICAgIHVubGVzcyBvcHRpb25zWyJibGFuayJdIHx8IG9wdGlvbnNbInNraXAtYnVuZGxlIl0KKyAgICAgICAgICAgIGJ1bmRsZV9pbnN0YWxsIHBhdGgKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbyAiTmV3IGpla3lsbCBzaXRlIGluc3RhbGxlZCBpbiAje3BhdGguY3lhbn0uIgorICAgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbyAiQnVuZGxlIGluc3RhbGwgc2tpcHBlZC4iIGlmIG9wdGlvbnNbInNraXAtYnVuZGxlIl0KKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIGJ1bmRsZV9pbnN0YWxsKHBhdGgpCisgICAgICAgICAgSmVreWxsOjpFeHRlcm5hbC5yZXF1aXJlX3dpdGhfZ3JhY2VmdWxfZmFpbCAiYnVuZGxlciIKKyAgICAgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gIlJ1bm5pbmcgYnVuZGxlIGluc3RhbGwgaW4gI3twYXRoLmN5YW59Li4uIgorICAgICAgICAgIERpci5jaGRpcihwYXRoKSBkbworICAgICAgICAgICAgcHJvY2Vzcywgb3V0cHV0ID0gSmVreWxsOjpVdGlsczo6RXhlYy5ydW4oImJ1bmRsZSIsICJpbnN0YWxsIikKKyAgICAgICAgICAgIG91dHB1dC50b19zLmVhY2hfbGluZSBkbyB8bGluZXwKKyAgICAgICAgICAgICAgSmVreWxsLmxvZ2dlci5pbmZvKCJCdW5kbGVyOiIuZ3JlZW4sIGxpbmUuc3RyaXApIHVubGVzcyBsaW5lLnRvX3MuZW1wdHk/CisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQgdW5sZXNzIHByb2Nlc3Muc3VjY2Vzcz8KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL25ld190aGVtZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL25ld190aGVtZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTEyNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29tbWFuZHMvbmV3X3RoZW1lLnJiCkBAIC0wLDAgKzEsMzggQEAKK3JlcXVpcmUgImVyYiIKKworY2xhc3MgSmVreWxsOjpDb21tYW5kczo6TmV3VGhlbWUgPCBKZWt5bGw6OkNvbW1hbmQKKyAgY2xhc3MgPDwgc2VsZgorICAgIGRlZiBpbml0X3dpdGhfcHJvZ3JhbShwcm9nKQorICAgICAgcHJvZy5jb21tYW5kKDoibmV3LXRoZW1lIikgZG8gfGN8CisgICAgICAgIGMuc3ludGF4ICJuZXctdGhlbWUgTkFNRSIKKyAgICAgICAgYy5kZXNjcmlwdGlvbiAiQ3JlYXRlcyBhIG5ldyBKZWt5bGwgdGhlbWUgc2NhZmZvbGQiCisgICAgICAgIGMub3B0aW9uICJjb2RlX29mX2NvbmR1Y3QiLCBcCisgICAgICAgICAgIi1jIiwgIi0tY29kZS1vZi1jb25kdWN0IiwgXAorICAgICAgICAgICJJbmNsdWRlIGEgQ29kZSBvZiBDb25kdWN0LiAoZGVmYXVsdHMgdG8gZmFsc2UpIgorCisgICAgICAgIGMuYWN0aW9uIGRvIHxhcmdzLCBvcHRzfAorICAgICAgICAgIEpla3lsbDo6Q29tbWFuZHM6Ok5ld1RoZW1lLnByb2Nlc3MoYXJncywgb3B0cykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgcnVib2NvcDpkaXNhYmxlIE1ldHJpY3MvQWJjU2l6ZQorICAgIGRlZiBwcm9jZXNzKGFyZ3MsIG9wdHMpCisgICAgICBpZiAhYXJncyB8fCBhcmdzLmVtcHR5PworICAgICAgICByYWlzZSBKZWt5bGw6OkVycm9yczo6SW52YWxpZFRoZW1lTmFtZSwgIllvdSBtdXN0IHNwZWNpZnkgYSB0aGVtZSBuYW1lLiIKKyAgICAgIGVuZAorCisgICAgICBuZXdfdGhlbWVfbmFtZSA9IGFyZ3Muam9pbigiXyIpCisgICAgICB0aGVtZSA9IEpla3lsbDo6VGhlbWVCdWlsZGVyLm5ldyhuZXdfdGhlbWVfbmFtZSwgb3B0cykKKyAgICAgIGlmIHRoZW1lLnBhdGguZXhpc3Q/CisgICAgICAgIEpla3lsbC5sb2dnZXIuYWJvcnRfd2l0aCAiQ29uZmxpY3Q6IiwgIiN7dGhlbWUucGF0aH0gYWxyZWFkeSBleGlzdHMuIgorICAgICAgZW5kCisKKyAgICAgIHRoZW1lLmNyZWF0ZSEKKyAgICAgIEpla3lsbC5sb2dnZXIuaW5mbyAiWW91ciBuZXcgSmVreWxsIHRoZW1lLCAje3RoZW1lLm5hbWUuY3lhbn0sIiBcCisgICAgICAgICIgaXMgcmVhZHkgZm9yIHlvdSBpbiAje3RoZW1lLnBhdGgudG9fcy5jeWFufSEiCisgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gIkZvciBoZWxwIGdldHRpbmcgc3RhcnRlZCwgcmVhZCAje3RoZW1lLnBhdGh9L1JFQURNRS5tZC4iCisgICAgZW5kCisgICAgIyBydWJvY29wOmVuYWJsZSBNZXRyaWNzL0FiY1NpemUKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL3NlcnZlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29tbWFuZHMvc2VydmUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhODVmYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL3NlcnZlLnJiCkBAIC0wLDAgKzEsMjQzIEBACittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBDb21tYW5kcworICAgIGNsYXNzIFNlcnZlIDwgQ29tbWFuZAorICAgICAgY2xhc3MgPDwgc2VsZgorICAgICAgICBDT01NQU5EX09QVElPTlMgPSB7CisgICAgICAgICAgInNzbF9jZXJ0IiAgICAgICAgICAgPT4gWyItLXNzbC1jZXJ0IFtDRVJUXSIsICJYLjUwOSAoU1NMKSBjZXJ0aWZpY2F0ZS4iXSwKKyAgICAgICAgICAiaG9zdCIgICAgICAgICAgICAgICA9PiBbImhvc3QiLCAiLUgiLCAiLS1ob3N0IFtIT1NUXSIsICJIb3N0IHRvIGJpbmQgdG8iXSwKKyAgICAgICAgICAib3Blbl91cmwiICAgICAgICAgICA9PiBbIi1vIiwgIi0tb3Blbi11cmwiLCAiTGF1bmNoIHlvdXIgc2l0ZSBpbiBhIGJyb3dzZXIiXSwKKyAgICAgICAgICAiZGV0YWNoIiAgICAgICAgICAgICA9PiBbIi1CIiwgIi0tZGV0YWNoIiwgIlJ1biB0aGUgc2VydmVyIGluIHRoZSBiYWNrZ3JvdW5kIl0sCisgICAgICAgICAgInNzbF9rZXkiICAgICAgICAgICAgPT4gWyItLXNzbC1rZXkgW0tFWV0iLCAiWC41MDkgKFNTTCkgUHJpdmF0ZSBLZXkuIl0sCisgICAgICAgICAgInBvcnQiICAgICAgICAgICAgICAgPT4gWyItUCIsICItLXBvcnQgW1BPUlRdIiwgIlBvcnQgdG8gbGlzdGVuIG9uIl0sCisgICAgICAgICAgInNob3dfZGlyX2xpc3RpbmciICAgPT4gWyItLXNob3ctZGlyLWxpc3RpbmciLAorICAgICAgICAgICAgIlNob3cgYSBkaXJlY3RvcnkgbGlzdGluZyBpbnN0ZWFkIG9mIGxvYWRpbmcgeW91ciBpbmRleCBmaWxlLiIsXSwKKyAgICAgICAgICAic2tpcF9pbml0aWFsX2J1aWxkIiA9PiBbInNraXBfaW5pdGlhbF9idWlsZCIsICItLXNraXAtaW5pdGlhbC1idWlsZCIsCisgICAgICAgICAgICAiU2tpcHMgdGhlIGluaXRpYWwgc2l0ZSBidWlsZCB3aGljaCBvY2N1cnMgYmVmb3JlIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZC4iLF0sCisgICAgICAgIH0uZnJlZXplCisKKyAgICAgICAgIworCisgICAgICAgIGRlZiBpbml0X3dpdGhfcHJvZ3JhbShwcm9nKQorICAgICAgICAgIHByb2cuY29tbWFuZCg6c2VydmUpIGRvIHxjbWR8CisgICAgICAgICAgICBjbWQuZGVzY3JpcHRpb24gIlNlcnZlIHlvdXIgc2l0ZSBsb2NhbGx5IgorICAgICAgICAgICAgY21kLnN5bnRheCAic2VydmUgW29wdGlvbnNdIgorICAgICAgICAgICAgY21kLmFsaWFzIDpzZXJ2ZXIKKyAgICAgICAgICAgIGNtZC5hbGlhcyA6cworCisgICAgICAgICAgICBhZGRfYnVpbGRfb3B0aW9ucyhjbWQpCisgICAgICAgICAgICBDT01NQU5EX09QVElPTlMuZWFjaCBkbyB8a2V5LCB2YWx8CisgICAgICAgICAgICAgIGNtZC5vcHRpb24ga2V5LCAqdmFsCisgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgY21kLmFjdGlvbiBkbyB8Xywgb3B0c3wKKyAgICAgICAgICAgICAgb3B0c1sic2VydmluZyJdID0gdHJ1ZQorICAgICAgICAgICAgICBvcHRzWyJ3YXRjaCIgIF0gPSB0cnVlIHVubGVzcyBvcHRzLmtleT8oIndhdGNoIikKKworICAgICAgICAgICAgICBjb25maWcgPSBjb25maWd1cmF0aW9uX2Zyb21fb3B0aW9ucyhvcHRzKQorICAgICAgICAgICAgICBpZiBKZWt5bGwuZW52ID09ICJkZXZlbG9wbWVudCIKKyAgICAgICAgICAgICAgICBjb25maWdbInVybCJdID0gZGVmYXVsdF91cmwoY29uZmlnKQorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgW0J1aWxkLCBTZXJ2ZV0uZWFjaCB7IHxrbGFzc3wga2xhc3MucHJvY2Vzcyhjb25maWcpIH0KKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICAjCisKKyAgICAgICAgZGVmIHByb2Nlc3Mob3B0cykKKyAgICAgICAgICBvcHRzID0gY29uZmlndXJhdGlvbl9mcm9tX29wdGlvbnMob3B0cykKKyAgICAgICAgICBkZXN0aW5hdGlvbiA9IG9wdHNbImRlc3RpbmF0aW9uIl0KKyAgICAgICAgICBzZXR1cChkZXN0aW5hdGlvbikKKworICAgICAgICAgIHN0YXJ0X3VwX3dlYnJpY2sob3B0cywgZGVzdGluYXRpb24pCisgICAgICAgIGVuZAorCisgICAgICAgICMgRG8gYSBiYXNlIHByZS1zZXR1cCBvZiBXRUJSaWNrIHNvIHRoYXQgZXZlcnl0aGluZyBpcyBpbiBwbGFjZQorICAgICAgICAjIHdoZW4gd2UgZ2V0IHJlYWR5IHRvIHBhcnR5LCBjaGVja2luZyBmb3IgYW4gc2V0dGluZyB1cCBhbiBlcnJvciBwYWdlCisgICAgICAgICMgYW5kIG1ha2luZyBzdXJlIG91ciBkZXN0aW5hdGlvbiBleGlzdHMuCisKKyAgICAgICAgcHJpdmF0ZQorICAgICAgICBkZWYgc2V0dXAoZGVzdGluYXRpb24pCisgICAgICAgICAgcmVxdWlyZV9yZWxhdGl2ZSAic2VydmUvc2VydmxldCIKKworICAgICAgICAgIEZpbGVVdGlscy5ta2Rpcl9wKGRlc3RpbmF0aW9uKQorICAgICAgICAgIGlmIEZpbGUuZXhpc3Q/KEZpbGUuam9pbihkZXN0aW5hdGlvbiwgIjQwNC5odG1sIikpCisgICAgICAgICAgICBXRUJyaWNrOjpIVFRQUmVzcG9uc2UuY2xhc3NfZXZhbCBkbworICAgICAgICAgICAgICBkZWYgY3JlYXRlX2Vycm9yX3BhZ2UKKyAgICAgICAgICAgICAgICBAaGVhZGVyWyJDb250ZW50LVR5cGUiXSA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiCisgICAgICAgICAgICAgICAgQGJvZHkgPSBJTy5yZWFkKEZpbGUuam9pbihAY29uZmlnWzpEb2N1bWVudFJvb3RdLCAiNDA0Lmh0bWwiKSkKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIworCisgICAgICAgIHByaXZhdGUKKyAgICAgICAgZGVmIHdlYnJpY2tfb3B0cyhvcHRzKQorICAgICAgICAgIG9wdHMgPSB7CisgICAgICAgICAgICA6SmVreWxsT3B0aW9ucyAgICAgID0+IG9wdHMsCisgICAgICAgICAgICA6RG9Ob3RSZXZlcnNlTG9va3VwID0+IHRydWUsCisgICAgICAgICAgICA6TWltZVR5cGVzICAgICAgICAgID0+IG1pbWVfdHlwZXMsCisgICAgICAgICAgICA6RG9jdW1lbnRSb290ICAgICAgID0+IG9wdHNbImRlc3RpbmF0aW9uIl0sCisgICAgICAgICAgICA6U3RhcnRDYWxsYmFjayAgICAgID0+IHN0YXJ0X2NhbGxiYWNrKG9wdHNbImRldGFjaCJdKSwKKyAgICAgICAgICAgIDpCaW5kQWRkcmVzcyAgICAgICAgPT4gb3B0c1siaG9zdCJdLAorICAgICAgICAgICAgOlBvcnQgICAgICAgICAgICAgICA9PiBvcHRzWyJwb3J0Il0sCisgICAgICAgICAgICA6RGlyZWN0b3J5SW5kZXggICAgID0+ICVXKAorICAgICAgICAgICAgICBpbmRleC5odG0KKyAgICAgICAgICAgICAgaW5kZXguaHRtbAorICAgICAgICAgICAgICBpbmRleC5yaHRtbAorICAgICAgICAgICAgICBpbmRleC5jZ2kKKyAgICAgICAgICAgICAgaW5kZXgueG1sCisgICAgICAgICAgICApLAorICAgICAgICAgIH0KKworICAgICAgICAgIG9wdHNbOkRpcmVjdG9yeUluZGV4XSA9IFtdIGlmIG9wdHNbOkpla3lsbE9wdGlvbnNdWyJzaG93X2Rpcl9saXN0aW5nIl0KKworICAgICAgICAgIGVuYWJsZV9zc2wob3B0cykKKyAgICAgICAgICBlbmFibGVfbG9nZ2luZyhvcHRzKQorICAgICAgICAgIG9wdHMKKyAgICAgICAgZW5kCisKKyAgICAgICAgIworCisgICAgICAgIHByaXZhdGUKKyAgICAgICAgZGVmIHN0YXJ0X3VwX3dlYnJpY2sob3B0cywgZGVzdGluYXRpb24pCisgICAgICAgICAgc2VydmVyID0gV0VCcmljazo6SFRUUFNlcnZlci5uZXcod2Vicmlja19vcHRzKG9wdHMpKS50YXAgeyB8b3wgby51bm1vdW50KCIiKSB9CisgICAgICAgICAgc2VydmVyLm1vdW50KG9wdHNbImJhc2V1cmwiXS50b19zLCBTZXJ2bGV0LCBkZXN0aW5hdGlvbiwgZmlsZV9oYW5kbGVyX29wdHMpCisgICAgICAgICAgSmVreWxsLmxvZ2dlci5pbmZvICJTZXJ2ZXIgYWRkcmVzczoiLCBzZXJ2ZXJfYWRkcmVzcyhzZXJ2ZXIsIG9wdHMpCisgICAgICAgICAgbGF1bmNoX2Jyb3dzZXIgc2VydmVyLCBvcHRzIGlmIG9wdHNbIm9wZW5fdXJsIl0KKyAgICAgICAgICBib290X29yX2RldGFjaCBzZXJ2ZXIsIG9wdHMKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBSZWNyZWF0ZSBOb25kaXNjbG9zdXJlTmFtZSB1bmRlciB1dGYtOCBjaXJjdW1zdGFuY2UKKworICAgICAgICBwcml2YXRlCisgICAgICAgIGRlZiBmaWxlX2hhbmRsZXJfb3B0cworICAgICAgICAgIFdFQnJpY2s6OkNvbmZpZzo6RmlsZUhhbmRsZXIubWVyZ2UoeworICAgICAgICAgICAgOkZhbmN5SW5kZXhpbmcgICAgID0+IHRydWUsCisgICAgICAgICAgICA6Tm9uZGlzY2xvc3VyZU5hbWUgPT4gWworICAgICAgICAgICAgICAiLmh0KiIsICJ+KiIsCisgICAgICAgICAgICBdLAorICAgICAgICAgIH0pCisgICAgICAgIGVuZAorCisgICAgICAgICMKKworICAgICAgICBwcml2YXRlCisgICAgICAgIGRlZiBzZXJ2ZXJfYWRkcmVzcyhzZXJ2ZXIsIG9wdGlvbnMgPSB7fSkKKyAgICAgICAgICBmb3JtYXRfdXJsKAorICAgICAgICAgICAgc2VydmVyLmNvbmZpZ1s6U1NMRW5hYmxlXSwKKyAgICAgICAgICAgIHNlcnZlci5jb25maWdbOkJpbmRBZGRyZXNzXSwKKyAgICAgICAgICAgIHNlcnZlci5jb25maWdbOlBvcnRdLAorICAgICAgICAgICAgb3B0aW9uc1siYmFzZXVybCJdCisgICAgICAgICAgKQorICAgICAgICBlbmQKKworICAgICAgICBwcml2YXRlCisgICAgICAgIGRlZiBmb3JtYXRfdXJsKHNzbF9lbmFibGVkLCBhZGRyZXNzLCBwb3J0LCBiYXNldXJsID0gbmlsKQorICAgICAgICAgIGZvcm1hdCgiJTxwcmVmaXg+czovLyU8YWRkcmVzcz5zOiU8cG9ydD5pJTxiYXNldXJsPnMiLCB7CisgICAgICAgICAgICA6cHJlZml4ICA9PiBzc2xfZW5hYmxlZCA/ICJodHRwcyIgOiAiaHR0cCIsCisgICAgICAgICAgICA6YWRkcmVzcyA9PiBhZGRyZXNzLAorICAgICAgICAgICAgOnBvcnQgICAgPT4gcG9ydCwKKyAgICAgICAgICAgIDpiYXNldXJsID0+IGJhc2V1cmwgPyAiI3tiYXNldXJsfS8iIDogIiIsCisgICAgICAgICAgfSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgIworCisgICAgICAgIHByaXZhdGUKKyAgICAgICAgZGVmIGRlZmF1bHRfdXJsKG9wdHMpCisgICAgICAgICAgY29uZmlnID0gY29uZmlndXJhdGlvbl9mcm9tX29wdGlvbnMob3B0cykKKyAgICAgICAgICBmb3JtYXRfdXJsKAorICAgICAgICAgICAgY29uZmlnWyJzc2xfY2VydCJdICYmIGNvbmZpZ1sic3NsX2tleSJdLAorICAgICAgICAgICAgY29uZmlnWyJob3N0Il0gPT0gIjEyNy4wLjAuMSIgPyAibG9jYWxob3N0IiA6IGNvbmZpZ1siaG9zdCJdLAorICAgICAgICAgICAgY29uZmlnWyJwb3J0Il0KKyAgICAgICAgICApCisgICAgICAgIGVuZAorCisgICAgICAgICMKKworICAgICAgICBwcml2YXRlCisgICAgICAgIGRlZiBsYXVuY2hfYnJvd3NlcihzZXJ2ZXIsIG9wdHMpCisgICAgICAgICAgYWRkcmVzcyA9IHNlcnZlcl9hZGRyZXNzKHNlcnZlciwgb3B0cykKKyAgICAgICAgICByZXR1cm4gc3lzdGVtICJzdGFydCIsIGFkZHJlc3MgaWYgVXRpbHM6OlBsYXRmb3Jtcy53aW5kb3dzPworICAgICAgICAgIHJldHVybiBzeXN0ZW0gInhkZy1vcGVuIiwgYWRkcmVzcyBpZiBVdGlsczo6UGxhdGZvcm1zLmxpbnV4PworICAgICAgICAgIHJldHVybiBzeXN0ZW0gIm9wZW4iLCBhZGRyZXNzIGlmIFV0aWxzOjpQbGF0Zm9ybXMub3N4PworICAgICAgICAgIEpla3lsbC5sb2dnZXIuZXJyb3IgIlJlZnVzaW5nIHRvIGxhdW5jaCBicm93c2VyOyAiIFwKKyAgICAgICAgICAgICJQbGF0Zm9ybSBsYXVuY2hlciB1bmtub3duLiIKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBLZWVwIGluIG91ciBhcmVhIHdpdGggYSB0aHJlYWQgb3IgZGV0YWNoIHRoZSBzZXJ2ZXIgYXMgcmVxdWVzdGVkCisgICAgICAgICMgYnkgdGhlIHVzZXIuICBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoYXQgd2UgZG8gYmFzZWQgb24gd2hhdCB5b3UKKyAgICAgICAgIyBhc2sgdXMgdG8gZG8uCisKKyAgICAgICAgcHJpdmF0ZQorICAgICAgICBkZWYgYm9vdF9vcl9kZXRhY2goc2VydmVyLCBvcHRzKQorICAgICAgICAgIGlmIG9wdHNbImRldGFjaCJdCisgICAgICAgICAgICBwaWQgPSBQcm9jZXNzLmZvcmsgZG8KKyAgICAgICAgICAgICAgc2VydmVyLnN0YXJ0CisgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgUHJvY2Vzcy5kZXRhY2gocGlkKQorICAgICAgICAgICAgSmVreWxsLmxvZ2dlci5pbmZvICJTZXJ2ZXIgZGV0YWNoZWQgd2l0aCBwaWQgJyN7cGlkfScuIiwgXAorICAgICAgICAgICAgICAiUnVuIGBwa2lsbCAtZiBqZWt5bGwnIG9yIGBraWxsIC05ICN7cGlkfScgdG8gc3RvcCB0aGUgc2VydmVyLiIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0ID0gVGhyZWFkLm5ldyB7IHNlcnZlci5zdGFydCB9CisgICAgICAgICAgICB0cmFwKCJJTlQiKSB7IHNlcnZlci5zaHV0ZG93biB9CisgICAgICAgICAgICB0LmpvaW4KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBNYWtlIHRoZSBzdGFjayB2ZXJib3NlIGlmIHRoZSB1c2VyIHJlcXVlc3RzIGl0LgorCisgICAgICAgIHByaXZhdGUKKyAgICAgICAgZGVmIGVuYWJsZV9sb2dnaW5nKG9wdHMpCisgICAgICAgICAgb3B0c1s6QWNjZXNzTG9nXSA9IFtdCisgICAgICAgICAgbGV2ZWwgPSBXRUJyaWNrOjpMb2cuY29uc3RfZ2V0KG9wdHNbOkpla3lsbE9wdGlvbnNdWyJ2ZXJib3NlIl0gPyA6REVCVUcgOiA6V0FSTikKKyAgICAgICAgICBvcHRzWzpMb2dnZXJdID0gV0VCcmljazo6TG9nLm5ldygkc3Rkb3V0LCBsZXZlbCkKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBBZGQgU1NMIHRvIHRoZSBzdGFjayBpZiB0aGUgdXNlciB0cmlnZ2VycyAtLWVuYWJsZS1zc2wgYW5kIHRoZXkKKyAgICAgICAgIyBwcm92aWRlIGJvdGggdHlwZXMgb2YgY2VydGlmaWNhdGVzIGNvbW1vbmx5IG5lZWRlZC4gIFJhaXNlIGlmIHRoZXkKKyAgICAgICAgIyBmb3JnZXQgdG8gYWRkIG9uZSBvZiB0aGUgY2VydGlmaWNhdGVzLgorCisgICAgICAgIHByaXZhdGUKKyAgICAgICAgIyBydWJvY29wOmRpc2FibGUgTWV0cmljcy9BYmNTaXplCisgICAgICAgIGRlZiBlbmFibGVfc3NsKG9wdHMpCisgICAgICAgICAgcmV0dXJuIGlmICFvcHRzWzpKZWt5bGxPcHRpb25zXVsic3NsX2NlcnQiXSAmJiAhb3B0c1s6SmVreWxsT3B0aW9uc11bInNzbF9rZXkiXQorICAgICAgICAgIGlmICFvcHRzWzpKZWt5bGxPcHRpb25zXVsic3NsX2NlcnQiXSB8fCAhb3B0c1s6SmVreWxsT3B0aW9uc11bInNzbF9rZXkiXQorICAgICAgICAgICAgIyBydWJvY29wOmRpc2FibGUgU3R5bGUvUmVkdW5kYW50RXhjZXB0aW9uCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICItLXNzbC1jZXJ0IG9yIC0tc3NsLWtleSBtaXNzaW5nLiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICByZXF1aXJlICJvcGVuc3NsIgorICAgICAgICAgIHJlcXVpcmUgIndlYnJpY2svaHR0cHMiCisgICAgICAgICAgc291cmNlX2tleSA9IEpla3lsbC5zYW5pdGl6ZWRfcGF0aChvcHRzWzpKZWt5bGxPcHRpb25zXVsic291cmNlIl0sIFwKKyAgICAgICAgICAgICAgICAgICAgb3B0c1s6SmVreWxsT3B0aW9uc11bInNzbF9rZXkiIF0pCisgICAgICAgICAgc291cmNlX2NlcnRpZmljYXRlID0gSmVreWxsLnNhbml0aXplZF9wYXRoKG9wdHNbOkpla3lsbE9wdGlvbnNdWyJzb3VyY2UiXSwgXAorICAgICAgICAgICAgICAgICAgICBvcHRzWzpKZWt5bGxPcHRpb25zXVsic3NsX2NlcnQiXSkKKyAgICAgICAgICBvcHRzWzpTU0xDZXJ0aWZpY2F0ZV0gPQorICAgICAgICAgICAgT3BlblNTTDo6WDUwOTo6Q2VydGlmaWNhdGUubmV3KEZpbGUucmVhZChzb3VyY2VfY2VydGlmaWNhdGUpKQorICAgICAgICAgIG9wdHNbOlNTTFByaXZhdGVLZXkgXSA9IE9wZW5TU0w6OlBLZXk6OlJTQS5uZXcoRmlsZS5yZWFkKHNvdXJjZV9rZXkpKQorICAgICAgICAgIG9wdHNbOlNTTEVuYWJsZV0gPSB0cnVlCisgICAgICAgIGVuZAorCisgICAgICAgIHByaXZhdGUKKworICAgICAgICBkZWYgc3RhcnRfY2FsbGJhY2soZGV0YWNoZWQpCisgICAgICAgICAgdW5sZXNzIGRldGFjaGVkCisgICAgICAgICAgICBwcm9jIGRvCisgICAgICAgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbygiU2VydmVyIHJ1bm5pbmcuLi4iLCAicHJlc3MgY3RybC1jIHRvIHN0b3AuIikKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBwcml2YXRlCisgICAgICAgIGRlZiBtaW1lX3R5cGVzCisgICAgICAgICAgZmlsZSA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL21pbWUudHlwZXMiLCBGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorICAgICAgICAgIFdFQnJpY2s6OkhUVFBVdGlscy5sb2FkX21pbWVfdHlwZXMoZmlsZSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbW1hbmRzL3NlcnZlL3NlcnZsZXQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb21tYW5kcy9zZXJ2ZS9zZXJ2bGV0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZTVjZjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb21tYW5kcy9zZXJ2ZS9zZXJ2bGV0LnJiCkBAIC0wLDAgKzEsNjAgQEAKK3JlcXVpcmUgIndlYnJpY2siCisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIENvbW1hbmRzCisgICAgY2xhc3MgU2VydmUKKyAgICAgIGNsYXNzIFNlcnZsZXQgPCBXRUJyaWNrOjpIVFRQU2VydmxldDo6RmlsZUhhbmRsZXIKKyAgICAgICAgREVGQVVMVFMgPSB7CisgICAgICAgICAgIkNhY2hlLUNvbnRyb2wiID0+ICJwcml2YXRlLCBtYXgtYWdlPTAsIHByb3h5LXJldmFsaWRhdGUsICIgXAorICAgICAgICAgICAgIm5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIiwKKyAgICAgICAgfS5mcmVlemUKKworICAgICAgICBkZWYgaW5pdGlhbGl6ZShzZXJ2ZXIsIHJvb3QsIGNhbGxiYWNrcykKKyAgICAgICAgICAjIFNvIHdlIGNhbiBhY2Nlc3MgdGhlbSBlYXNpbHkuCisgICAgICAgICAgQGpla3lsbF9vcHRzID0gc2VydmVyLmNvbmZpZ1s6SmVreWxsT3B0aW9uc10KKyAgICAgICAgICBzZXRfZGVmYXVsdHMKKyAgICAgICAgICBzdXBlcgorICAgICAgICBlbmQKKworICAgICAgICAjIEFkZCB0aGUgYWJpbGl0eSB0byB0YXAgZmlsZS5odG1sIHRoZSBzYW1lIHdheSB0aGF0IE5naW54IGRvZXMgb24gb3VyCisgICAgICAgICMgRG9ja2VyIGltYWdlcyAob3Igb24gR2l0SHViIFBhZ2VzLikgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB3ZSBtaWdodCBlbmQKKyAgICAgICAgIyB1cCB3aXRoIGEgZGlmZmVyZW50IHByZWZlcmVuY2Ugb24gd2hpY2ggY29tZXMgZmlyc3QuCisKKyAgICAgICAgZGVmIHNlYXJjaF9maWxlKHJlcSwgcmVzLCBiYXNlbmFtZSkKKyAgICAgICAgICAjIC9maWxlLiogPiAvZmlsZS9pbmRleC5odG1sID4gL2ZpbGUuaHRtbAorICAgICAgICAgIHN1cGVyIHx8IHN1cGVyKHJlcSwgcmVzLCAiI3tiYXNlbmFtZX0uaHRtbCIpCisgICAgICAgIGVuZAorCisgICAgICAgICMgcnVib2NvcDpkaXNhYmxlIFN0eWxlL01ldGhvZE5hbWUKKyAgICAgICAgZGVmIGRvX0dFVChyZXEsIHJlcykKKyAgICAgICAgICBydG4gPSBzdXBlcgorICAgICAgICAgIHZhbGlkYXRlX2FuZF9lbnN1cmVfY2hhcnNldChyZXEsIHJlcykKKyAgICAgICAgICByZXMuaGVhZGVyLm1lcmdlIShAaGVhZGVycykKKyAgICAgICAgICBydG4KKyAgICAgICAgZW5kCisKKyAgICAgICAgIworCisgICAgICAgIHByaXZhdGUKKyAgICAgICAgZGVmIHZhbGlkYXRlX2FuZF9lbnN1cmVfY2hhcnNldChfcmVxLCByZXMpCisgICAgICAgICAga2V5ID0gcmVzLmhlYWRlci5rZXlzLmdyZXAoJXIhY29udGVudC10eXBlIWkpLmZpcnN0CisgICAgICAgICAgdHlwID0gcmVzLmhlYWRlcltrZXldCisKKyAgICAgICAgICB1bmxlc3MgdHlwID1+ICVyITtccypjaGFyc2V0PSEKKyAgICAgICAgICAgIHJlcy5oZWFkZXJba2V5XSA9ICIje3R5cH07IGNoYXJzZXQ9I3tAamVreWxsX29wdHNbImVuY29kaW5nIl19IgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICAjCisKKyAgICAgICAgcHJpdmF0ZQorICAgICAgICBkZWYgc2V0X2RlZmF1bHRzCisgICAgICAgICAgaGFzaF8gPSBAamVreWxsX29wdHMuZmV0Y2goIndlYnJpY2siLCB7fSkuZmV0Y2goImhlYWRlcnMiLCB7fSkKKyAgICAgICAgICBERUZBVUxUUy5lYWNoX3dpdGhfb2JqZWN0KEBoZWFkZXJzID0gaGFzaF8pIGRvIHwoa2V5LCB2YWwpLCBoYXNofAorICAgICAgICAgICAgaGFzaFtrZXldID0gdmFsIHVubGVzcyBoYXNoLmtleT8oa2V5KQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29uZmlndXJhdGlvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbmZpZ3VyYXRpb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4ZTJhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbmZpZ3VyYXRpb24ucmIKQEAgLTAsMCArMSw0MTAgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisKK21vZHVsZSBKZWt5bGwKKyAgY2xhc3MgQ29uZmlndXJhdGlvbiA8IEhhc2gKKyAgICAjIERlZmF1bHQgb3B0aW9ucy4gT3ZlcnJpZGRlbiBieSB2YWx1ZXMgaW4gX2NvbmZpZy55bWwuCisgICAgIyBTdHJpbmdzIHJhdGhlciB0aGFuIHN5bWJvbHMgYXJlIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBZQU1MLgorICAgIERFRkFVTFRTID0gQ29uZmlndXJhdGlvblt7CisgICAgICAjIFdoZXJlIHRoaW5ncyBhcmUKKyAgICAgICJzb3VyY2UiICAgICAgICAgICAgICA9PiBEaXIucHdkLAorICAgICAgImRlc3RpbmF0aW9uIiAgICAgICAgID0+IEZpbGUuam9pbihEaXIucHdkLCAiX3NpdGUiKSwKKyAgICAgICJwbHVnaW5zX2RpciIgICAgICAgICA9PiAiX3BsdWdpbnMiLAorICAgICAgImxheW91dHNfZGlyIiAgICAgICAgID0+ICJfbGF5b3V0cyIsCisgICAgICAiZGF0YV9kaXIiICAgICAgICAgICAgPT4gIl9kYXRhIiwKKyAgICAgICJpbmNsdWRlc19kaXIiICAgICAgICA9PiAiX2luY2x1ZGVzIiwKKyAgICAgICJjb2xsZWN0aW9ucyIgICAgICAgICA9PiB7fSwKKworICAgICAgIyBIYW5kbGluZyBSZWFkaW5nCisgICAgICAic2FmZSIgICAgICAgICAgICAgICAgPT4gZmFsc2UsCisgICAgICAiaW5jbHVkZSIgICAgICAgICAgICAgPT4gWyIuaHRhY2Nlc3MiXSwKKyAgICAgICJleGNsdWRlIiAgICAgICAgICAgICA9PiAldygKKyAgICAgICAgR2VtZmlsZSBHZW1maWxlLmxvY2sgbm9kZV9tb2R1bGVzIHZlbmRvci9idW5kbGUvIHZlbmRvci9jYWNoZS8gdmVuZG9yL2dlbXMvCisgICAgICAgIHZlbmRvci9ydWJ5LworICAgICAgKSwKKyAgICAgICJrZWVwX2ZpbGVzIiAgICAgICAgICA9PiBbIi5naXQiLCAiLnN2biJdLAorICAgICAgImVuY29kaW5nIiAgICAgICAgICAgID0+ICJ1dGYtOCIsCisgICAgICAibWFya2Rvd25fZXh0IiAgICAgICAgPT4gIm1hcmtkb3duLG1rZG93bixta2RuLG1rZCxtZCIsCisgICAgICAic3RyaWN0X2Zyb250X21hdHRlciIgPT4gZmFsc2UsCisKKyAgICAgICMgRmlsdGVyaW5nIENvbnRlbnQKKyAgICAgICJzaG93X2RyYWZ0cyIgICAgICAgICA9PiBuaWwsCisgICAgICAibGltaXRfcG9zdHMiICAgICAgICAgPT4gMCwKKyAgICAgICJmdXR1cmUiICAgICAgICAgICAgICA9PiBmYWxzZSwKKyAgICAgICJ1bnB1Ymxpc2hlZCIgICAgICAgICA9PiBmYWxzZSwKKworICAgICAgIyBQbHVnaW5zCisgICAgICAid2hpdGVsaXN0IiAgICAgICAgICAgPT4gW10sCisgICAgICAicGx1Z2lucyIgICAgICAgICAgICAgPT4gW10sCisKKyAgICAgICMgQ29udmVyc2lvbgorICAgICAgIm1hcmtkb3duIiAgICAgICAgICAgID0+ICJrcmFtZG93biIsCisgICAgICAiaGlnaGxpZ2h0ZXIiICAgICAgICAgPT4gInJvdWdlIiwKKyAgICAgICJsc2kiICAgICAgICAgICAgICAgICA9PiBmYWxzZSwKKyAgICAgICJleGNlcnB0X3NlcGFyYXRvciIgICA9PiAiXG5cbiIsCisgICAgICAiaW5jcmVtZW50YWwiICAgICAgICAgPT4gZmFsc2UsCisKKyAgICAgICMgU2VydmluZworICAgICAgImRldGFjaCIgICAgICAgICAgICAgID0+IGZhbHNlLCAjIGRlZmF1bHQgdG8gbm90IGRldGFjaGluZyB0aGUgc2VydmVyCisgICAgICAicG9ydCIgICAgICAgICAgICAgICAgPT4gIjQwMDAiLAorICAgICAgImhvc3QiICAgICAgICAgICAgICAgID0+ICIxMjcuMC4wLjEiLAorICAgICAgImJhc2V1cmwiICAgICAgICAgICAgID0+IG5pbCwgIyB0aGlzIG1vdW50cyBhdCAvLCBpLmUuIG5vIHN1YmRpcmVjdG9yeQorICAgICAgInNob3dfZGlyX2xpc3RpbmciICAgID0+IGZhbHNlLAorCisgICAgICAjIE91dHB1dCBDb25maWd1cmF0aW9uCisgICAgICAicGVybWFsaW5rIiAgICAgICAgICAgPT4gImRhdGUiLAorICAgICAgInBhZ2luYXRlX3BhdGgiICAgICAgID0+ICIvcGFnZTpudW0iLAorICAgICAgInRpbWV6b25lIiAgICAgICAgICAgID0+IG5pbCwgIyB1c2UgdGhlIGxvY2FsIHRpbWV6b25lCisKKyAgICAgICJxdWlldCIgICAgICAgICAgICAgICA9PiBmYWxzZSwKKyAgICAgICJ2ZXJib3NlIiAgICAgICAgICAgICA9PiBmYWxzZSwKKyAgICAgICJkZWZhdWx0cyIgICAgICAgICAgICA9PiBbXSwKKworICAgICAgImxpcXVpZCIgICAgICAgICAgICAgID0+IHsKKyAgICAgICAgImVycm9yX21vZGUiID0+ICJ3YXJuIiwKKyAgICAgIH0sCisKKyAgICAgICJyZGlzY291bnQiICAgICAgICAgICA9PiB7CisgICAgICAgICJleHRlbnNpb25zIiA9PiBbXSwKKyAgICAgIH0sCisKKyAgICAgICJyZWRjYXJwZXQiICAgICAgICAgICA9PiB7CisgICAgICAgICJleHRlbnNpb25zIiA9PiBbXSwKKyAgICAgIH0sCisKKyAgICAgICJrcmFtZG93biIgICAgICAgICAgICA9PiB7CisgICAgICAgICJhdXRvX2lkcyIgICAgICA9PiB0cnVlLAorICAgICAgICAidG9jX2xldmVscyIgICAgPT4gIjEuLjYiLAorICAgICAgICAiZW50aXR5X291dHB1dCIgPT4gImFzX2NoYXIiLAorICAgICAgICAic21hcnRfcXVvdGVzIiAgPT4gImxzcXVvLHJzcXVvLGxkcXVvLHJkcXVvIiwKKyAgICAgICAgImlucHV0IiAgICAgICAgID0+ICJHRk0iLAorICAgICAgICAiaGFyZF93cmFwIiAgICAgPT4gZmFsc2UsCisgICAgICAgICJmb290bm90ZV9uciIgICA9PiAxLAorICAgICAgfSwKKyAgICB9Lm1hcCB7IHxrLCB2fCBbaywgdi5mcmVlemVdIH1dLmZyZWV6ZQorCisgICAgY2xhc3MgPDwgc2VsZgorICAgICAgIyBTdGF0aWM6IFByb2R1Y2UgYSBDb25maWd1cmF0aW9uIHJlYWR5IGZvciB1c2UgaW4gYSBTaXRlLgorICAgICAgIyBJdCB0YWtlcyB0aGUgaW5wdXQsIGZpbGxzIGluIHRoZSBkZWZhdWx0cyB3aGVyZSB2YWx1ZXMgZG8gbm90CisgICAgICAjIGV4aXN0LCBhbmQgcGF0Y2hlcyBjb21tb24gaXNzdWVzIGluY2x1ZGluZyBtaWdyYXRpbmcgb3B0aW9ucyBmb3IKKyAgICAgICMgYmFja3dhcmRzIGNvbXBhdGlibGl0eS4gRXhjZXB0IHdoZXJlIGEga2V5IG9yIHZhbHVlIGlzIGJlaW5nIGZpeGVkLAorICAgICAgIyB0aGUgdXNlciBjb25maWd1cmF0aW9uIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLgorICAgICAgIworICAgICAgIyB1c2VyX2NvbmZpZyAtIGEgSGFzaCBvciBDb25maWd1cmF0aW9uIG9mIG92ZXJyaWRlcy4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIENvbmZpZ3VyYXRpb24gZmlsbGVkIHdpdGggZGVmYXVsdHMgYW5kIGZpeGVkIGZvciBjb21tb24KKyAgICAgICMgcHJvYmxlbXMgYW5kIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICAgICAgZGVmIGZyb20odXNlcl9jb25maWcpCisgICAgICAgIFV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzKERFRkFVTFRTLCBDb25maWd1cmF0aW9uW3VzZXJfY29uZmlnXS5zdHJpbmdpZnlfa2V5cykKKyAgICAgICAgICAuZml4X2NvbW1vbl9pc3N1ZXMuYWRkX2RlZmF1bHRfY29sbGVjdGlvbnMKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFR1cm4gYWxsIGtleXMgaW50byBzdHJpbmcKKyAgICAjCisgICAgIyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBoYXNoIHdoZXJlIGFsbCBpdHMga2V5cyBhcmUgc3RyaW5ncworICAgIGRlZiBzdHJpbmdpZnlfa2V5cworICAgICAgcmVkdWNlKHt9KSB7IHxoc2gsIChrLCB2KXwgaHNoLm1lcmdlKGsudG9fcyA9PiB2KSB9CisgICAgZW5kCisKKyAgICBkZWYgZ2V0X2NvbmZpZ192YWx1ZV93aXRoX292ZXJyaWRlKGNvbmZpZ19rZXksIG92ZXJyaWRlKQorICAgICAgb3ZlcnJpZGVbY29uZmlnX2tleV0gfHwgc2VsZltjb25maWdfa2V5XSB8fCBERUZBVUxUU1tjb25maWdfa2V5XQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IERpcmVjdG9yeSBvZiB0aGUgSmVreWxsIHNvdXJjZSBmb2xkZXIKKyAgICAjCisgICAgIyBvdmVycmlkZSAtIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBoYXNoCisgICAgIworICAgICMgUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgSmVreWxsIHNvdXJjZSBkaXJlY3RvcnkKKyAgICBkZWYgc291cmNlKG92ZXJyaWRlKQorICAgICAgZ2V0X2NvbmZpZ192YWx1ZV93aXRoX292ZXJyaWRlKCJzb3VyY2UiLCBvdmVycmlkZSkKKyAgICBlbmQKKworICAgIGRlZiBxdWlldChvdmVycmlkZSA9IHt9KQorICAgICAgZ2V0X2NvbmZpZ192YWx1ZV93aXRoX292ZXJyaWRlKCJxdWlldCIsIG92ZXJyaWRlKQorICAgIGVuZAorICAgIGFsaWFzX21ldGhvZCA6cXVpZXQ/LCA6cXVpZXQKKworICAgIGRlZiB2ZXJib3NlKG92ZXJyaWRlID0ge30pCisgICAgICBnZXRfY29uZmlnX3ZhbHVlX3dpdGhfb3ZlcnJpZGUoInZlcmJvc2UiLCBvdmVycmlkZSkKKyAgICBlbmQKKyAgICBhbGlhc19tZXRob2QgOnZlcmJvc2U/LCA6dmVyYm9zZQorCisgICAgZGVmIHNhZmVfbG9hZF9maWxlKGZpbGVuYW1lKQorICAgICAgY2FzZSBGaWxlLmV4dG5hbWUoZmlsZW5hbWUpCisgICAgICB3aGVuICVyIVwudG9tbCFpCisgICAgICAgIEpla3lsbDo6RXh0ZXJuYWwucmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWwoInRvbWwiKSB1bmxlc3MgZGVmaW5lZD8oVE9NTCkKKyAgICAgICAgVE9NTC5sb2FkX2ZpbGUoZmlsZW5hbWUpCisgICAgICB3aGVuICVyIVwueWE/bWwhaQorICAgICAgICBTYWZlWUFNTC5sb2FkX2ZpbGUoZmlsZW5hbWUpIHx8IHt9CisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJObyBwYXJzZXIgZm9yICcje2ZpbGVuYW1lfScgaXMgYXZhaWxhYmxlLgorICAgICAgICAgIFVzZSBhIC55KGEpbWwgb3IgLnRvbWwgZmlsZSBpbnN0ZWFkLiIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IEdlbmVyYXRlIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHRoZSBvdmVycmlkZQorICAgICMKKyAgICAjIG92ZXJyaWRlIC0gdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGhhc2gKKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIEFycmF5IG9mIGNvbmZpZyBmaWxlcworICAgIGRlZiBjb25maWdfZmlsZXMob3ZlcnJpZGUpCisgICAgICAjIEFkanVzdCB2ZXJib3NpdHkgcXVpY2tseQorICAgICAgSmVreWxsLmxvZ2dlci5hZGp1c3RfdmVyYm9zaXR5KAorICAgICAgICA6cXVpZXQgICA9PiBxdWlldD8ob3ZlcnJpZGUpLAorICAgICAgICA6dmVyYm9zZSA9PiB2ZXJib3NlPyhvdmVycmlkZSkKKyAgICAgICkKKworICAgICAgIyBHZXQgY29uZmlndXJhdGlvbiBmcm9tIDxzb3VyY2U+L19jb25maWcueW1sIG9yIDxzb3VyY2U+Lzxjb25maWdfZmlsZT4KKyAgICAgIGNvbmZpZ19maWxlcyA9IG92ZXJyaWRlLmRlbGV0ZSgiY29uZmlnIikKKyAgICAgIGlmIGNvbmZpZ19maWxlcy50b19zLmVtcHR5PworICAgICAgICBkZWZhdWx0ID0gJXcoeW1sIHlhbWwpLmZpbmQoLT4geyAieW1sIiB9KSBkbyB8ZXh0fAorICAgICAgICAgIEZpbGUuZXhpc3Q/KEpla3lsbC5zYW5pdGl6ZWRfcGF0aChzb3VyY2Uob3ZlcnJpZGUpLCAiX2NvbmZpZy4je2V4dH0iKSkKKyAgICAgICAgZW5kCisgICAgICAgIGNvbmZpZ19maWxlcyA9IEpla3lsbC5zYW5pdGl6ZWRfcGF0aChzb3VyY2Uob3ZlcnJpZGUpLCAiX2NvbmZpZy4je2RlZmF1bHR9IikKKyAgICAgICAgQGRlZmF1bHRfY29uZmlnX2ZpbGUgPSB0cnVlCisgICAgICBlbmQKKyAgICAgIGNvbmZpZ19maWxlcyA9IFtjb25maWdfZmlsZXNdIHVubGVzcyBjb25maWdfZmlsZXMuaXNfYT8gQXJyYXkKKyAgICAgIGNvbmZpZ19maWxlcworICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFJlYWQgY29uZmlndXJhdGlvbiBhbmQgcmV0dXJuIG1lcmdlZCBIYXNoCisgICAgIworICAgICMgZmlsZSAtIHRoZSBwYXRoIHRvIHRoZSBZQU1MIGZpbGUgdG8gYmUgcmVhZCBpbgorICAgICMKKyAgICAjIFJldHVybnMgdGhpcyBjb25maWd1cmF0aW9uLCBvdmVycmlkZGVuIGJ5IHRoZSB2YWx1ZXMgaW4gdGhlIGZpbGUKKyAgICBkZWYgcmVhZF9jb25maWdfZmlsZShmaWxlKQorICAgICAgbmV4dF9jb25maWcgPSBzYWZlX2xvYWRfZmlsZShmaWxlKQorICAgICAgY2hlY2tfY29uZmlnX2lzX2hhc2ghKG5leHRfY29uZmlnLCBmaWxlKQorICAgICAgSmVreWxsLmxvZ2dlci5pbmZvICJDb25maWd1cmF0aW9uIGZpbGU6IiwgZmlsZQorICAgICAgbmV4dF9jb25maWcKKyAgICByZXNjdWUgU3lzdGVtQ2FsbEVycm9yCisgICAgICBpZiBAZGVmYXVsdF9jb25maWdfZmlsZSB8fD0gbmlsCisgICAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiQ29uZmlndXJhdGlvbiBmaWxlOiIsICJub25lIgorICAgICAgICB7fQorICAgICAgZWxzZQorICAgICAgICBKZWt5bGwubG9nZ2VyLmVycm9yICJGYXRhbDoiLCAiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAnI3tmaWxlfScKKyAgICAgICAgICBjb3VsZCBub3QgYmUgZm91bmQuIgorICAgICAgICByYWlzZSBMb2FkRXJyb3IsICJUaGUgQ29uZmlndXJhdGlvbiBmaWxlICcje2ZpbGV9JyBjb3VsZCBub3QgYmUgZm91bmQuIgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogUmVhZCBpbiBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgbWVyZ2Ugd2l0aCB0aGlzIGhhc2gKKyAgICAjCisgICAgIyBmaWxlcyAtIHRoZSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXRocworICAgICMKKyAgICAjIFJldHVybnMgdGhlIGZ1bGwgY29uZmlndXJhdGlvbiwgd2l0aCB0aGUgZGVmYXVsdHMgb3ZlcnJpZGRlbiBieSB0aGUgdmFsdWVzIGluIHRoZQorICAgICMgY29uZmlndXJhdGlvbiBmaWxlcworICAgIGRlZiByZWFkX2NvbmZpZ19maWxlcyhmaWxlcykKKyAgICAgIGNvbmZpZ3VyYXRpb24gPSBjbG9uZQorCisgICAgICBiZWdpbgorICAgICAgICBmaWxlcy5lYWNoIGRvIHxjb25maWdfZmlsZXwKKyAgICAgICAgICBuZXh0IGlmIGNvbmZpZ19maWxlLm5pbD8gfHwgY29uZmlnX2ZpbGUuZW1wdHk/CisgICAgICAgICAgbmV3X2NvbmZpZyA9IHJlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUpCisgICAgICAgICAgY29uZmlndXJhdGlvbiA9IFV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzKGNvbmZpZ3VyYXRpb24sIG5ld19jb25maWcpCisgICAgICAgIGVuZAorICAgICAgcmVzY3VlIEFyZ3VtZW50RXJyb3IgPT4gZXJyCisgICAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiV0FSTklORzoiLCAiRXJyb3IgcmVhZGluZyBjb25maWd1cmF0aW9uLiAiIFwKKyAgICAgICAgICAgICAgICAgICAgICJVc2luZyBkZWZhdWx0cyAoYW5kIG9wdGlvbnMpLiIKKyAgICAgICAgJHN0ZGVyci5wdXRzIGVycgorICAgICAgZW5kCisKKyAgICAgIGNvbmZpZ3VyYXRpb24uZml4X2NvbW1vbl9pc3N1ZXMuYmFja3dhcmRzX2NvbXBhdGliaWxpemUuYWRkX2RlZmF1bHRfY29sbGVjdGlvbnMKKyAgICBlbmQKKworICAgICMgUHVibGljOiBTcGxpdCBhIENTViBzdHJpbmcgaW50byBhbiBhcnJheSBjb250YWluaW5nIGl0cyB2YWx1ZXMKKyAgICAjCisgICAgIyBjc3YgLSB0aGUgc3RyaW5nIG9mIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMKKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBDU1YKKyAgICBkZWYgY3N2X3RvX2FycmF5KGNzdikKKyAgICAgIGNzdi5zcGxpdCgiLCIpLm1hcCgmOnN0cmlwKQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IEVuc3VyZSB0aGUgcHJvcGVyIG9wdGlvbnMgYXJlIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiB0byBhbGxvdyBmb3IKKyAgICAjIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggSmVreWxsIHByZS0xLjAKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBiYWNrd2FyZHMtY29tcGF0aWJsZSBjb25maWd1cmF0aW9uCisgICAgZGVmIGJhY2t3YXJkc19jb21wYXRpYmlsaXplCisgICAgICBjb25maWcgPSBjbG9uZQorICAgICAgIyBQcm92aWRlIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5CisgICAgICBjaGVja19hdXRvKGNvbmZpZykKKyAgICAgIGNoZWNrX3NlcnZlcihjb25maWcpCisgICAgICBjaGVja19wbHVnaW5zKGNvbmZpZykKKworICAgICAgcmVuYW1lZF9rZXkgInNlcnZlcl9wb3J0IiwgInBvcnQiLCBjb25maWcKKyAgICAgIHJlbmFtZWRfa2V5ICJnZW1zIiwgInBsdWdpbnMiLCBjb25maWcKKyAgICAgIHJlbmFtZWRfa2V5ICJsYXlvdXRzIiwgImxheW91dHNfZGlyIiwgY29uZmlnCisgICAgICByZW5hbWVkX2tleSAiZGF0YV9zb3VyY2UiLCAiZGF0YV9kaXIiLCBjb25maWcKKworICAgICAgY2hlY2tfcHlnbWVudHMoY29uZmlnKQorICAgICAgY2hlY2tfaW5jbHVkZV9leGNsdWRlKGNvbmZpZykKKyAgICAgIGNoZWNrX2NvZGVyYXkoY29uZmlnKQorICAgICAgY2hlY2tfbWFydWt1KGNvbmZpZykKKworICAgICAgY29uZmlnCisgICAgZW5kCisKKyAgICBkZWYgZml4X2NvbW1vbl9pc3N1ZXMKKyAgICAgIGNvbmZpZyA9IGNsb25lCisKKyAgICAgIGlmIGNvbmZpZy5rZXk/KCJwYWdpbmF0ZSIpICYmICghY29uZmlnWyJwYWdpbmF0ZSJdLmlzX2E/KEludGVnZXIpIHx8CisgICAgICAgICAgICAgY29uZmlnWyJwYWdpbmF0ZSJdIDwgMSkKKworICAgICAgICBKZWt5bGwubG9nZ2VyLndhcm4gIkNvbmZpZyBXYXJuaW5nOiIsICJUaGUgYHBhZ2luYXRlYCBrZXkgbXVzdCBiZSBhIHBvc2l0aXZlIiBcCisgICAgICAgICAgIiBpbnRlZ2VyIG9yIG5pbC4gSXQncyBjdXJyZW50bHkgc2V0IHRvICcje2NvbmZpZ1sicGFnaW5hdGUiXS5pbnNwZWN0fScuIgorICAgICAgICBjb25maWdbInBhZ2luYXRlIl0gPSBuaWwKKyAgICAgIGVuZAorCisgICAgICBjb25maWcKKyAgICBlbmQKKworICAgIGRlZiBhZGRfZGVmYXVsdF9jb2xsZWN0aW9ucworICAgICAgY29uZmlnID0gY2xvbmUKKworICAgICAgIyBJdCBkZWZhdWx0cyB0byBge31gLCBzbyB0aGlzIGlzIG9ubHkgaWYgc29tZW9uZSBzZXRzIGl0IHRvIG51bGwgbWFudWFsbHkuCisgICAgICByZXR1cm4gY29uZmlnIGlmIGNvbmZpZ1siY29sbGVjdGlvbnMiXS5uaWw/CisKKyAgICAgICMgRW5zdXJlIHdlIGhhdmUgYSBoYXNoLgorICAgICAgaWYgY29uZmlnWyJjb2xsZWN0aW9ucyJdLmlzX2E/KEFycmF5KQorICAgICAgICBjb25maWdbImNvbGxlY3Rpb25zIl0gPSBIYXNoW2NvbmZpZ1siY29sbGVjdGlvbnMiXS5tYXAgeyB8Y3wgW2MsIHt9XSB9XQorICAgICAgZW5kCisKKyAgICAgIGNvbmZpZ1siY29sbGVjdGlvbnMiXSA9IFV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzKAorICAgICAgICB7ICJwb3N0cyIgPT4ge30gfSwgY29uZmlnWyJjb2xsZWN0aW9ucyJdCisgICAgICApLnRhcCBkbyB8Y29sbGVjdGlvbnN8CisgICAgICAgIGNvbGxlY3Rpb25zWyJwb3N0cyJdWyJvdXRwdXQiXSA9IHRydWUKKyAgICAgICAgaWYgY29uZmlnWyJwZXJtYWxpbmsiXQorICAgICAgICAgIGNvbGxlY3Rpb25zWyJwb3N0cyJdWyJwZXJtYWxpbmsiXSB8fD0gc3R5bGVfdG9fcGVybWFsaW5rKGNvbmZpZ1sicGVybWFsaW5rIl0pCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGNvbmZpZworICAgIGVuZAorCisgICAgZGVmIHJlbmFtZWRfa2V5KG9sZCwgbmV3LCBjb25maWcsIF8gPSBuaWwpCisgICAgICBpZiBjb25maWcua2V5PyhvbGQpCisgICAgICAgIEpla3lsbDo6RGVwcmVjYXRvci5kZXByZWNhdGlvbl9tZXNzYWdlICJUaGUgJyN7b2xkfScgY29uZmlndXJhdGlvbiIgXAorICAgICAgICAgICIgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gJyN7bmV3fScuIFBsZWFzZSB1cGRhdGUgeW91ciBjb25maWciIFwKKyAgICAgICAgICAiIGZpbGUgYWNjb3JkaW5nbHkuIgorICAgICAgICBjb25maWdbbmV3XSA9IGNvbmZpZy5kZWxldGUob2xkKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIHN0eWxlX3RvX3Blcm1hbGluayhwZXJtYWxpbmtfc3R5bGUpCisgICAgICBjYXNlIHBlcm1hbGlua19zdHlsZS50b19zeW0KKyAgICAgIHdoZW4gOnByZXR0eQorICAgICAgICAiLzpjYXRlZ29yaWVzLzp5ZWFyLzptb250aC86ZGF5Lzp0aXRsZS8iCisgICAgICB3aGVuIDpub25lCisgICAgICAgICIvOmNhdGVnb3JpZXMvOnRpdGxlOm91dHB1dF9leHQiCisgICAgICB3aGVuIDpkYXRlCisgICAgICAgICIvOmNhdGVnb3JpZXMvOnllYXIvOm1vbnRoLzpkYXkvOnRpdGxlOm91dHB1dF9leHQiCisgICAgICB3aGVuIDpvcmRpbmFsCisgICAgICAgICIvOmNhdGVnb3JpZXMvOnllYXIvOnlfZGF5Lzp0aXRsZTpvdXRwdXRfZXh0IgorICAgICAgZWxzZQorICAgICAgICBwZXJtYWxpbmtfc3R5bGUudG9fcworICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFByaXZhdGU6IENoZWNrcyBpZiBhIGdpdmVuIGNvbmZpZyBpcyBhIGhhc2gKKyAgICAjCisgICAgIyBleHRyYWN0ZWRfY29uZmlnIC0gdGhlIHZhbHVlIHRvIGNoZWNrCisgICAgIyBmaWxlIC0gdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgY29uZmlnIHdhcyBleHRyYWN0ZWQKKyAgICAjCisgICAgIyBSYWlzZXMgYW4gQXJndW1lbnRFcnJvciBpZiBnaXZlbiBjb25maWcgaXMgbm90IGEgaGFzaAorICAgIHByaXZhdGUKKyAgICBkZWYgY2hlY2tfY29uZmlnX2lzX2hhc2ghKGV4dHJhY3RlZF9jb25maWcsIGZpbGUpCisgICAgICB1bmxlc3MgZXh0cmFjdGVkX2NvbmZpZy5pc19hPyhIYXNoKQorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiQ29uZmlndXJhdGlvbiBmaWxlOiAoSU5WQUxJRCkgI3tmaWxlfSIueWVsbG93CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgY2hlY2tfYXV0byhjb25maWcpCisgICAgICBpZiBjb25maWcua2V5PygiYXV0byIpIHx8IGNvbmZpZy5rZXk/KCJ3YXRjaCIpCisgICAgICAgIEpla3lsbDo6RGVwcmVjYXRvci5kZXByZWNhdGlvbl9tZXNzYWdlICJBdXRvLXJlZ2VuZXJhdGlvbiBjYW4gbm8gbG9uZ2VyIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiZSBzZXQgZnJvbSB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZShzKS4gVXNlIHRoZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLS1bbm8tXXdhdGNoLy13IGNvbW1hbmQtbGluZSBvcHRpb24gaW5zdGVhZC4iCisgICAgICAgIGNvbmZpZy5kZWxldGUoImF1dG8iKQorICAgICAgICBjb25maWcuZGVsZXRlKCJ3YXRjaCIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgY2hlY2tfc2VydmVyKGNvbmZpZykKKyAgICAgIGlmIGNvbmZpZy5rZXk/KCJzZXJ2ZXIiKQorICAgICAgICBKZWt5bGw6OkRlcHJlY2F0b3IuZGVwcmVjYXRpb25fbWVzc2FnZSAiVGhlICdzZXJ2ZXInIGNvbmZpZ3VyYXRpb24gb3B0aW9uIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBubyBsb25nZXIgYWNjZXB0ZWQuIFVzZSB0aGUgJ2pla3lsbCBzZXJ2ZSciIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN1YmNvbW1hbmQgdG8gc2VydmUgeW91ciBzaXRlIHdpdGggV0VCcmljay4iCisgICAgICAgIGNvbmZpZy5kZWxldGUoInNlcnZlciIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgY2hlY2tfcHlnbWVudHMoY29uZmlnKQorICAgICAgaWYgY29uZmlnLmtleT8oInB5Z21lbnRzIikKKyAgICAgICAgSmVreWxsOjpEZXByZWNhdG9yLmRlcHJlY2F0aW9uX21lc3NhZ2UgIlRoZSAncHlnbWVudHMnIGNvbmZpZ3VyYXRpb24gb3B0aW9uIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgYmVlbiByZW5hbWVkIHRvICdoaWdobGlnaHRlcicuIFBsZWFzZSB1cGRhdGUgeW91ciIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY29uZmlnIGZpbGUgYWNjb3JkaW5nbHkuIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUgJ3JvdWdlJywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidweWdtZW50cycgb3IgbnVsbC4iCisKKyAgICAgICAgY29uZmlnWyJoaWdobGlnaHRlciJdID0gInB5Z21lbnRzIiBpZiBjb25maWdbInB5Z21lbnRzIl0KKyAgICAgICAgY29uZmlnLmRlbGV0ZSgicHlnbWVudHMiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIGNoZWNrX2luY2x1ZGVfZXhjbHVkZShjb25maWcpCisgICAgICAldyhpbmNsdWRlIGV4Y2x1ZGUpLmVhY2ggZG8gfG9wdGlvbnwKKyAgICAgICAgaWYgY29uZmlnW29wdGlvbl0uaXNfYT8oU3RyaW5nKQorICAgICAgICAgIEpla3lsbDo6RGVwcmVjYXRvci5kZXByZWNhdGlvbl9tZXNzYWdlICJUaGUgJyN7b3B0aW9ufScgY29uZmlndXJhdGlvbiBvcHRpb24iIFwKKyAgICAgICAgICAgICIgbXVzdCBub3cgYmUgc3BlY2lmaWVkIGFzIGFuIGFycmF5LCBidXQgeW91IHNwZWNpZmllZCIgXAorICAgICAgICAgICAgIiBhIHN0cmluZy4gRm9yIG5vdywgd2UndmUgdHJlYXRlZCB0aGUgc3RyaW5nIHlvdSBwcm92aWRlZCIgXAorICAgICAgICAgICAgIiBhcyBhIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHZhbHVlcy4iCisgICAgICAgICAgY29uZmlnW29wdGlvbl0gPSBjc3ZfdG9fYXJyYXkoY29uZmlnW29wdGlvbl0pCisgICAgICAgIGVuZAorICAgICAgICBjb25maWdbb3B0aW9uXS5tYXAhKCY6dG9fcykgaWYgY29uZmlnW29wdGlvbl0KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiBjaGVja19jb2RlcmF5KGNvbmZpZykKKyAgICAgIGlmIChjb25maWdbImtyYW1kb3duIl0gfHwge30pLmtleT8oInVzZV9jb2RlcmF5IikKKyAgICAgICAgSmVreWxsOjpEZXByZWNhdG9yLmRlcHJlY2F0aW9uX21lc3NhZ2UgIlBsZWFzZSBjaGFuZ2UgJ3VzZV9jb2RlcmF5JyIgXAorICAgICAgICAgICIgdG8gJ2VuYWJsZV9jb2RlcmF5JyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZS4iCisgICAgICAgIGNvbmZpZ1sia3JhbWRvd24iXVsidXNlX2NvZGVyYXkiXSA9IGNvbmZpZ1sia3JhbWRvd24iXS5kZWxldGUoImVuYWJsZV9jb2RlcmF5IikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiBjaGVja19tYXJ1a3UoY29uZmlnKQorICAgICAgaWYgY29uZmlnLmZldGNoKCJtYXJrZG93biIsICJrcmFtZG93biIpLnRvX3MuY2FzZWNtcCgibWFydWt1IikuemVybz8KKyAgICAgICAgSmVreWxsLmxvZ2dlci5hYm9ydF93aXRoICJFcnJvcjoiLCAiWW91J3JlIHVzaW5nIHRoZSAnbWFydWt1JyAiIFwKKyAgICAgICAgICAiTWFya2Rvd24gcHJvY2Vzc29yLCB3aGljaCBoYXMgYmVlbiByZW1vdmVkIGFzIG9mIDMuMC4wLiAiIFwKKyAgICAgICAgICAiV2UgcmVjb21tZW5kIHlvdSBzd2l0Y2ggdG8gS3JhbWRvd24uIFRvIGRvIHRoaXMsIHJlcGxhY2UgIiBcCisgICAgICAgICAgImBtYXJrZG93bjogbWFydWt1YCB3aXRoIGBtYXJrZG93bjoga3JhbWRvd25gIGluIHlvdXIgIiBcCisgICAgICAgICAgImBfY29uZmlnLnltbGAgZmlsZS4iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUHJpdmF0ZTogQ2hlY2tzIGlmIHRoZSBgcGx1Z2luc2AgY29uZmlnIGlzIGEgU3RyaW5nCisgICAgIworICAgICMgY29uZmlnIC0gdGhlIGNvbmZpZyBoYXNoCisgICAgIworICAgICMgUmFpc2VzIGEgSmVreWxsOjpFcnJvcnM6OkludmFsaWRDb25maWd1cmF0aW9uRXJyb3IgaWYgdGhlIGNvbmZpZyBgcGx1Z2luc2AKKyAgICAjIGlzIGEgc3RyaW5nCisgICAgcHJpdmF0ZQorICAgIGRlZiBjaGVja19wbHVnaW5zKGNvbmZpZykKKyAgICAgIGlmIGNvbmZpZy5rZXk/KCJwbHVnaW5zIikgJiYgY29uZmlnWyJwbHVnaW5zIl0uaXNfYT8oU3RyaW5nKQorICAgICAgICBKZWt5bGwubG9nZ2VyLmVycm9yICJDb25maWd1cmF0aW9uIEVycm9yOiIsICJZb3Ugc3BlY2lmaWVkIHRoZSIgXAorICAgICAgICAgICIgYHBsdWdpbnNgIGNvbmZpZyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBhcyBhIHN0cmluZywgcGxlYXNlIiBcCisgICAgICAgICAgIiB1c2UgYW4gYXJyYXkgaW5zdGVhZC4gSWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIGRpcmVjdG9yeSBvZiB5b3VyIiBcCisgICAgICAgICAgIiBwbHVnaW5zLCB1c2UgdGhlIGNvbmZpZyBrZXkgYHBsdWdpbnNfZGlyYCBpbnN0ZWFkLiIKKyAgICAgICAgcmFpc2UgSmVreWxsOjpFcnJvcnM6OkludmFsaWRDb25maWd1cmF0aW9uRXJyb3IsCisgICAgICAgICAgIidwbHVnaW5zJyBzaG91bGQgbm90IGJlIGEgc3RyaW5nLCBidXQgd2FzOiAiIFwKKyAgICAgICAgICAiI3tjb25maWdbInBsdWdpbnMiXS5pbnNwZWN0fS4gVXNlICdwbHVnaW5zX2RpcicgaW5zdGVhZC4iCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbnZlcnRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbnZlcnRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZhMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29udmVydGVyLnJiCkBAIC0wLDAgKzEsNTIgQEAKK21vZHVsZSBKZWt5bGwKKyAgY2xhc3MgQ29udmVydGVyIDwgUGx1Z2luCisgICAgIyBQdWJsaWM6IEdldCBvciBzZXQgdGhlIGhpZ2hsaWdodGVyIHByZWZpeC4gV2hlbiBhbiBhcmd1bWVudCBpcyBzcGVjaWZpZWQsCisgICAgIyB0aGUgcHJlZml4IHdpbGwgYmUgc2V0LiBJZiBubyBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHByZWZpeAorICAgICMgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAjCisgICAgIyBoaWdobGlnaHRlcl9wcmVmaXggLSBUaGUgU3RyaW5nIHByZWZpeCAoZGVmYXVsdDogbmlsKS4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBTdHJpbmcgcHJlZml4LgorICAgIGRlZiBzZWxmLmhpZ2hsaWdodGVyX3ByZWZpeChoaWdobGlnaHRlcl9wcmVmaXggPSBuaWwpCisgICAgICB1bmxlc3MgZGVmaW5lZD8oQGhpZ2hsaWdodGVyX3ByZWZpeCkgJiYgaGlnaGxpZ2h0ZXJfcHJlZml4Lm5pbD8KKyAgICAgICAgQGhpZ2hsaWdodGVyX3ByZWZpeCA9IGhpZ2hsaWdodGVyX3ByZWZpeAorICAgICAgZW5kCisgICAgICBAaGlnaGxpZ2h0ZXJfcHJlZml4CisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogR2V0IG9yIHNldCB0aGUgaGlnaGxpZ2h0ZXIgc3VmZml4LiBXaGVuIGFuIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwKKyAgICAjIHRoZSBzdWZmaXggd2lsbCBiZSBzZXQuIElmIG5vIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc3VmZml4CisgICAgIyB3aWxsIGJlIHJldHVybmVkLgorICAgICMKKyAgICAjIGhpZ2hsaWdodGVyX3N1ZmZpeCAtIFRoZSBTdHJpbmcgc3VmZml4IChkZWZhdWx0OiBuaWwpLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIFN0cmluZyBzdWZmaXguCisgICAgZGVmIHNlbGYuaGlnaGxpZ2h0ZXJfc3VmZml4KGhpZ2hsaWdodGVyX3N1ZmZpeCA9IG5pbCkKKyAgICAgIHVubGVzcyBkZWZpbmVkPyhAaGlnaGxpZ2h0ZXJfc3VmZml4KSAmJiBoaWdobGlnaHRlcl9zdWZmaXgubmlsPworICAgICAgICBAaGlnaGxpZ2h0ZXJfc3VmZml4ID0gaGlnaGxpZ2h0ZXJfc3VmZml4CisgICAgICBlbmQKKyAgICAgIEBoaWdobGlnaHRlcl9zdWZmaXgKKyAgICBlbmQKKworICAgICMgSW5pdGlhbGl6ZSB0aGUgY29udmVydGVyLgorICAgICMKKyAgICAjIFJldHVybnMgYW4gaW5pdGlhbGl6ZWQgQ29udmVydGVyLgorICAgIGRlZiBpbml0aWFsaXplKGNvbmZpZyA9IHt9KQorICAgICAgQGNvbmZpZyA9IGNvbmZpZworICAgIGVuZAorCisgICAgIyBHZXQgdGhlIGhpZ2hsaWdodGVyIHByZWZpeC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBTdHJpbmcgcHJlZml4LgorICAgIGRlZiBoaWdobGlnaHRlcl9wcmVmaXgKKyAgICAgIHNlbGYuY2xhc3MuaGlnaGxpZ2h0ZXJfcHJlZml4CisgICAgZW5kCisKKyAgICAjIEdldCB0aGUgaGlnaGxpZ2h0ZXIgc3VmZml4LgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIFN0cmluZyBzdWZmaXguCisgICAgZGVmIGhpZ2hsaWdodGVyX3N1ZmZpeAorICAgICAgc2VsZi5jbGFzcy5oaWdobGlnaHRlcl9zdWZmaXgKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbnZlcnRlcnMvaWRlbnRpdHkucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0ZXJzL2lkZW50aXR5LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzQ3NjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0ZXJzL2lkZW50aXR5LnJiCkBAIC0wLDAgKzEsMjEgQEAKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIENvbnZlcnRlcnMKKyAgICBjbGFzcyBJZGVudGl0eSA8IENvbnZlcnRlcgorICAgICAgc2FmZSB0cnVlCisKKyAgICAgIHByaW9yaXR5IDpsb3dlc3QKKworICAgICAgZGVmIG1hdGNoZXMoX2V4dCkKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBvdXRwdXRfZXh0KGV4dCkKKyAgICAgICAgZXh0CisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnQoY29udGVudCkKKyAgICAgICAgY29udGVudAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0ZXJzL21hcmtkb3duLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29udmVydGVycy9tYXJrZG93bi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE4ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29udmVydGVycy9tYXJrZG93bi5yYgpAQCAtMCwwICsxLDEwMiBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgQ29udmVydGVycworICAgIGNsYXNzIE1hcmtkb3duIDwgQ29udmVydGVyCisgICAgICBoaWdobGlnaHRlcl9wcmVmaXggIlxuIgorICAgICAgaGlnaGxpZ2h0ZXJfc3VmZml4ICJcbiIKKyAgICAgIHNhZmUgdHJ1ZQorCisgICAgICBkZWYgc2V0dXAKKyAgICAgICAgcmV0dXJuIGlmIEBzZXR1cCB8fD0gZmFsc2UKKyAgICAgICAgdW5sZXNzIChAcGFyc2VyID0gZ2V0X3Byb2Nlc3NvcikKKyAgICAgICAgICBKZWt5bGwubG9nZ2VyLmVycm9yICJJbnZhbGlkIE1hcmtkb3duIHByb2Nlc3NvciBnaXZlbjoiLCBAY29uZmlnWyJtYXJrZG93biJdCisgICAgICAgICAgaWYgQGNvbmZpZ1sic2FmZSJdCisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gIiIsICJDdXN0b20gcHJvY2Vzc29ycyBhcmUgbm90IGxvYWRlZCBpbiBzYWZlIG1vZGUiCisgICAgICAgICAgZW5kCisgICAgICAgICAgSmVreWxsLmxvZ2dlci5lcnJvcigKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIkF2YWlsYWJsZSBwcm9jZXNzb3JzIGFyZTogI3t2YWxpZF9wcm9jZXNzb3JzLmpvaW4oIiwgIil9IgorICAgICAgICAgICkKKyAgICAgICAgICByYWlzZSBFcnJvcnM6OkZhdGFsRXhjZXB0aW9uLCAiQmFpbGluZyBvdXQ7IGludmFsaWQgTWFya2Rvd24gcHJvY2Vzc29yLiIKKyAgICAgICAgZW5kCisKKyAgICAgICAgQHNldHVwID0gdHJ1ZQorICAgICAgZW5kCisKKyAgICAgICMgUnVib2NvcCBkb2VzIG5vdCBhbGxvdyByZWFkZXIgbWV0aG9kcyB0byBoYXZlIG5hbWVzIHN0YXJ0aW5nIHdpdGggYGdldF9gCisgICAgICAjIFRvIGVuc3VyZSBjb21wYXRpYmlsaXR5LCB0aGlzIGNoZWNrIGhhcyBiZWVuIGRpc2FibGVkIG9uIHRoaXMgbWV0aG9kCisgICAgICAjCisgICAgICAjIHJ1Ym9jb3A6ZGlzYWJsZSBTdHlsZS9BY2Nlc3Nvck1ldGhvZE5hbWUKKyAgICAgIGRlZiBnZXRfcHJvY2Vzc29yCisgICAgICAgIGNhc2UgQGNvbmZpZ1sibWFya2Rvd24iXS5kb3duY2FzZQorICAgICAgICB3aGVuICJyZWRjYXJwZXQiIHRoZW4gcmV0dXJuIFJlZGNhcnBldFBhcnNlci5uZXcoQGNvbmZpZykKKyAgICAgICAgd2hlbiAia3JhbWRvd24iICB0aGVuIHJldHVybiBLcmFtZG93blBhcnNlci5uZXcoQGNvbmZpZykKKyAgICAgICAgd2hlbiAicmRpc2NvdW50IiB0aGVuIHJldHVybiBSRGlzY291bnRQYXJzZXIubmV3KEBjb25maWcpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjdXN0b21fcHJvY2Vzc29yCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICAjIHJ1Ym9jb3A6ZW5hYmxlIFN0eWxlL0FjY2Vzc29yTWV0aG9kTmFtZQorCisgICAgICAjIFB1YmxpYzogUHJvdmlkZXMgeW91IHdpdGggYSBsaXN0IG9mIHByb2Nlc3NvcnMsIHRoZSBvbmVzIHdlCisgICAgICAjIHN1cHBvcnQgaW50ZXJuYWxseSBhbmQgdGhlIG9uZXMgdGhhdCB5b3UgaGF2ZSBwcm92aWRlZCB0byB1cyAoaWYgeW91CisgICAgICAjIGFyZSBub3QgaW4gc2FmZSBtb2RlLikKKworICAgICAgZGVmIHZhbGlkX3Byb2Nlc3NvcnMKKyAgICAgICAgJVcocmRpc2NvdW50IGtyYW1kb3duIHJlZGNhcnBldCkgKyB0aGlyZF9wYXJ0eV9wcm9jZXNzb3JzCisgICAgICBlbmQKKworICAgICAgIyBQdWJsaWM6IEEgbGlzdCBvZiBwcm9jZXNzb3JzIHRoYXQgeW91IHByb3ZpZGUgdmlhIHBsdWdpbnMuCisgICAgICAjIFRoaXMgaXMgcmVhbGx5IG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBhcmUgbm90IGluIHNhZmUgbW9kZSwgaWYgeW91IGFyZQorICAgICAgIyBpbiBzYWZlIG1vZGUgKHJlOiBHaXRIdWIpIHRoZW4gdGhlcmUgd2lsbCBiZSBub25lLgorCisgICAgICBkZWYgdGhpcmRfcGFydHlfcHJvY2Vzc29ycworICAgICAgICBzZWxmLmNsYXNzLmNvbnN0YW50cyAtIFwKKyAgICAgICAgICAldyhLcmFtZG93blBhcnNlciBSRGlzY291bnRQYXJzZXIgUmVkY2FycGV0UGFyc2VyIFBSSU9SSVRJRVMpLm1hcCgKKyAgICAgICAgICAgICY6dG9fc3ltCisgICAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBleHRuYW1lX2xpc3QKKyAgICAgICAgQGV4dG5hbWVfbGlzdCB8fD0gQGNvbmZpZ1sibWFya2Rvd25fZXh0Il0uc3BsaXQoIiwiKS5tYXAgZG8gfGV8CisgICAgICAgICAgIi4je2UuZG93bmNhc2V9IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgbWF0Y2hlcyhleHQpCisgICAgICAgIGV4dG5hbWVfbGlzdC5pbmNsdWRlPyhleHQuZG93bmNhc2UpCisgICAgICBlbmQKKworICAgICAgZGVmIG91dHB1dF9leHQoX2V4dCkKKyAgICAgICAgIi5odG1sIgorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0KGNvbnRlbnQpCisgICAgICAgIHNldHVwCisgICAgICAgIEBwYXJzZXIuY29udmVydChjb250ZW50KQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKyAgICAgIGRlZiBjdXN0b21fcHJvY2Vzc29yCisgICAgICAgIGNvbnZlcnRlcl9uYW1lID0gQGNvbmZpZ1sibWFya2Rvd24iXQorICAgICAgICBpZiBjdXN0b21fY2xhc3NfYWxsb3dlZD8oY29udmVydGVyX25hbWUpCisgICAgICAgICAgc2VsZi5jbGFzcy5jb25zdF9nZXQoY29udmVydGVyX25hbWUpLm5ldyhAY29uZmlnKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFByaXZhdGU6IERldGVybWluZSB3aGV0aGVyIGEgY2xhc3MgbmFtZSBpcyBhbiBhbGxvd2VkIGN1c3RvbQorICAgICAgIyAgIG1hcmtkb3duIGNsYXNzIG5hbWUuCisgICAgICAjCisgICAgICAjIHBhcnNlcl9uYW1lIC0gdGhlIG5hbWUgb2YgdGhlIHBhcnNlciBjbGFzcworICAgICAgIworICAgICAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcnNlciBuYW1lIGNvbnRhaW5zIG9ubHkgYWxwaGFudW1lcmljCisgICAgICAjIGNoYXJhY3RlcnMgYW5kIGlzIGRlZmluZWQgd2l0aGluIEpla3lsbDo6Q29udmVydGVyczo6TWFya2Rvd24KKworICAgICAgcHJpdmF0ZQorICAgICAgZGVmIGN1c3RvbV9jbGFzc19hbGxvd2VkPyhwYXJzZXJfbmFtZSkKKyAgICAgICAgcGFyc2VyX25hbWUgIX4gJXIhW15BLVphLXowLTlfXSEgJiYgc2VsZi5jbGFzcy5jb25zdGFudHMuaW5jbHVkZT8oCisgICAgICAgICAgcGFyc2VyX25hbWUudG9fc3ltCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29udmVydGVycy9tYXJrZG93bi9rcmFtZG93bl9wYXJzZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0ZXJzL21hcmtkb3duL2tyYW1kb3duX3BhcnNlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY5M2M2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29udmVydGVycy9tYXJrZG93bi9rcmFtZG93bl9wYXJzZXIucmIKQEAgLTAsMCArMSwxMjEgQEAKKyMgRnJvemVuLXN0cmluZy1saXRlcmFsOiB0cnVlCisjIEVuY29kaW5nOiB1dGYtOAorCittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBDb252ZXJ0ZXJzCisgICAgY2xhc3MgTWFya2Rvd24KKyAgICAgIGNsYXNzIEtyYW1kb3duUGFyc2VyCisgICAgICAgIENPREVSQVlfREVGQVVMVFMgPSB7CisgICAgICAgICAgImNzcyIgICAgICAgICAgICAgICA9PiAic3R5bGUiLAorICAgICAgICAgICJib2xkX2V2ZXJ5IiAgICAgICAgPT4gMTAsCisgICAgICAgICAgImxpbmVfbnVtYmVycyIgICAgICA9PiAiaW5saW5lIiwKKyAgICAgICAgICAibGluZV9udW1iZXJfc3RhcnQiID0+IDEsCisgICAgICAgICAgInRhYl93aWR0aCIgICAgICAgICA9PiA0LAorICAgICAgICAgICJ3cmFwIiAgICAgICAgICAgICAgPT4gImRpdiIsCisgICAgICAgIH0uZnJlZXplCisKKyAgICAgICAgZGVmIGluaXRpYWxpemUoY29uZmlnKQorICAgICAgICAgIEpla3lsbDo6RXh0ZXJuYWwucmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWwgImtyYW1kb3duIgorICAgICAgICAgIEBtYWluX2ZhbGxiYWNrX2hpZ2hsaWdodGVyID0gY29uZmlnWyJoaWdobGlnaHRlciJdIHx8ICJyb3VnZSIKKyAgICAgICAgICBAY29uZmlnID0gY29uZmlnWyJrcmFtZG93biJdIHx8IHt9CisgICAgICAgICAgQGhpZ2hsaWdodGVyID0gbmlsCisgICAgICAgICAgc2V0dXAKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBTZXR1cCBhbmQgbm9ybWFsaXplIHRoZSBjb25maWd1cmF0aW9uOgorICAgICAgICAjICAgKiBDcmVhdGUgS3JhbWRvd24gaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICAgICAgIyAgICogU2V0IHN5bnRheF9oaWdobGlnaHRlciwgZGV0ZWN0aW5nIGVuYWJsZV9jb2RlcmF5IGFuZCBtZXJnaW5nCisgICAgICAgICMgICAgICAgaGlnaGxpZ2h0ZXIgaWYgbm9uZS4KKyAgICAgICAgIyAgICogTWVyZ2Uga3JhbWRvd25bY29kZXJheV0gaW50byBzeW50YXhfaGlnaGxpZ2h0ZXJfb3B0cyBzdHJpcHBpbmcgY29kZXJheV8uCisgICAgICAgICMgICAqIE1ha2Ugc3VyZSBgc3ludGF4X2hpZ2hsaWdodGVyX29wdHNgIGV4aXN0cy4KKworICAgICAgICBkZWYgc2V0dXAKKyAgICAgICAgICBAY29uZmlnWyJzeW50YXhfaGlnaGxpZ2h0ZXIiXSB8fD0gaGlnaGxpZ2h0ZXIKKyAgICAgICAgICBAY29uZmlnWyJzeW50YXhfaGlnaGxpZ2h0ZXJfb3B0cyJdIHx8PSB7fQorICAgICAgICAgIEBjb25maWdbImNvZGVyYXkiXSB8fD0ge30gIyBYWFg6IExlZ2FjeS4KKyAgICAgICAgICBtb2Rlcm5pemVfY29kZXJheV9jb25maWcKKyAgICAgICAgICBtYWtlX2FjY2Vzc2libGUKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIGNvbnZlcnQoY29udGVudCkKKyAgICAgICAgICBLcmFtZG93bjo6RG9jdW1lbnQubmV3KGNvbnRlbnQsIEBjb25maWcpLnRvX2h0bWwKKyAgICAgICAgZW5kCisKKyAgICAgICAgcHJpdmF0ZQorICAgICAgICBkZWYgbWFrZV9hY2Nlc3NpYmxlKGhhc2ggPSBAY29uZmlnKQorICAgICAgICAgIGhhc2gua2V5cy5lYWNoIGRvIHxrZXl8CisgICAgICAgICAgICBoYXNoW2tleS50b19zeW1dID0gaGFzaFtrZXldCisgICAgICAgICAgICBtYWtlX2FjY2Vzc2libGUoaGFzaFtrZXldKSBpZiBoYXNoW2tleV0uaXNfYT8oSGFzaCkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBjb25maWdba3JhbWRvd25dW3N5bnRheF9oaWdsaWdodGVyXSA+CisgICAgICAgICMgICBjb25maWdba3JhbWRvd25dW2VuYWJsZV9jb2RlcmF5XSA+CisgICAgICAgICMgICBjb25maWdbaGlnaGxpZ2h0ZXJdCisgICAgICAgICMgV2hlcmUgYGVuYWJsZV9jb2RlcmF5YCBpcyBub3cgZGVwcmVjYXRlZCBiZWNhdXNlIEtyYW1kb3duCisgICAgICAgICMgc3VwcG9ydHMgUm91Z2Ugbm93IHRvby4KKworICAgICAgICBwcml2YXRlCisgICAgICAgIGRlZiBoaWdobGlnaHRlcgorICAgICAgICAgIHJldHVybiBAaGlnaGxpZ2h0ZXIgaWYgQGhpZ2hsaWdodGVyCisKKyAgICAgICAgICBpZiBAY29uZmlnWyJzeW50YXhfaGlnaGxpZ2h0ZXIiXQorICAgICAgICAgICAgcmV0dXJuIEBoaWdobGlnaHRlciA9IEBjb25maWdbCisgICAgICAgICAgICAgICJzeW50YXhfaGlnaGxpZ2h0ZXIiCisgICAgICAgICAgICBdCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBAaGlnaGxpZ2h0ZXIgPSBiZWdpbgorICAgICAgICAgICAgaWYgQGNvbmZpZy5rZXk/KCJlbmFibGVfY29kZXJheSIpICYmIEBjb25maWdbImVuYWJsZV9jb2RlcmF5Il0KKyAgICAgICAgICAgICAgSmVreWxsOjpEZXByZWNhdG9yLmRlcHJlY2F0aW9uX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgIllvdSBhcmUgdXNpbmcgJ2VuYWJsZV9jb2RlcmF5JywgIiBcCisgICAgICAgICAgICAgICAgInVzZSBzeW50YXhfaGlnaGxpZ2h0ZXI6IGNvZGVyYXkgaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGUuIgorICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgICAgImNvZGVyYXkiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIEBtYWluX2ZhbGxiYWNrX2hpZ2hsaWdodGVyCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcHJpdmF0ZQorICAgICAgICBkZWYgc3RyaXBfY29kZXJheV9wcmVmaXgoaGFzaCkKKyAgICAgICAgICBoYXNoLmVhY2hfd2l0aF9vYmplY3Qoe30pIGRvIHwoa2V5LCB2YWwpLCBoc2h8CisgICAgICAgICAgICBjbGVhbmVkX2tleSA9IGtleS50b19zLmdzdWIoJXIhXEFjb2RlcmF5XyEsICIiKQorCisgICAgICAgICAgICBpZiBrZXkgIT0gY2xlYW5lZF9rZXkKKyAgICAgICAgICAgICAgSmVreWxsOjpEZXByZWNhdG9yLmRlcHJlY2F0aW9uX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgIllvdSBhcmUgdXNpbmcgJyN7a2V5fScuIE5vcm1hbGl6aW5nIHRvICN7Y2xlYW5lZF9rZXl9LiIKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgIGhzaFtjbGVhbmVkX2tleV0gPSB2YWwKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBJZiBvdXIgaGlnaGxpZ2h0ZXIgaXMgQ29kZVJheSB3ZSBnbyBpbiB0byBtZXJnZSB0aGUgQ29kZVJheSBkZWZhdWx0cworICAgICAgICAjIHdpdGggeW91ciAiY29kZXJheSIga2V5IGlmIGl0J3MgdGhlcmUsIGRlcHJlY2F0aW5nIGl0IGluIHRoZQorICAgICAgICAjIHByb2Nlc3Mgb2YgeW91IHVzaW5nIGl0LgorCisgICAgICAgIHByaXZhdGUKKyAgICAgICAgZGVmIG1vZGVybml6ZV9jb2RlcmF5X2NvbmZpZworICAgICAgICAgIHVubGVzcyBAY29uZmlnWyJjb2RlcmF5Il0uZW1wdHk/CisgICAgICAgICAgICBKZWt5bGw6OkRlcHJlY2F0b3IuZGVwcmVjYXRpb25fbWVzc2FnZSgKKyAgICAgICAgICAgICAgIllvdSBhcmUgdXNpbmcgJ2tyYW1kb3duLmNvZGVyYXknIGluIHlvdXIgY29uZmlndXJhdGlvbiwgIiBcCisgICAgICAgICAgICAgICJwbGVhc2UgdXNlICdzeW50YXhfaGlnaGxpZ2h0ZXJfb3B0cycgaW5zdGVhZC4iCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIEBjb25maWdbInN5bnRheF9oaWdobGlnaHRlcl9vcHRzIl0gPSBiZWdpbgorICAgICAgICAgICAgICBzdHJpcF9jb2RlcmF5X3ByZWZpeCgKKyAgICAgICAgICAgICAgICBAY29uZmlnWyJzeW50YXhfaGlnaGxpZ2h0ZXJfb3B0cyJdIFwKKyAgICAgICAgICAgICAgICAgIC5tZXJnZShDT0RFUkFZX0RFRkFVTFRTKSBcCisgICAgICAgICAgICAgICAgICAubWVyZ2UoQGNvbmZpZ1siY29kZXJheSJdKQorICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbnZlcnRlcnMvbWFya2Rvd24vcmRpc2NvdW50X3BhcnNlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbnZlcnRlcnMvbWFya2Rvd24vcmRpc2NvdW50X3BhcnNlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY3OWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29udmVydGVycy9tYXJrZG93bi9yZGlzY291bnRfcGFyc2VyLnJiCkBAIC0wLDAgKzEsMzMgQEAKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIENvbnZlcnRlcnMKKyAgICBjbGFzcyBNYXJrZG93bgorICAgICAgY2xhc3MgUkRpc2NvdW50UGFyc2VyCisgICAgICAgIGRlZiBpbml0aWFsaXplKGNvbmZpZykKKyAgICAgICAgICBKZWt5bGw6OkV4dGVybmFsLnJlcXVpcmVfd2l0aF9ncmFjZWZ1bF9mYWlsICJyZGlzY291bnQiCisgICAgICAgICAgQGNvbmZpZyA9IGNvbmZpZworICAgICAgICAgIEByZGlzY291bnRfZXh0ZW5zaW9ucyA9IEBjb25maWdbInJkaXNjb3VudCJdWyJleHRlbnNpb25zIl0ubWFwKCY6dG9fc3ltKQorICAgICAgICBlbmQKKworICAgICAgICBkZWYgY29udmVydChjb250ZW50KQorICAgICAgICAgIHJkID0gUkRpc2NvdW50Lm5ldyhjb250ZW50LCAqQHJkaXNjb3VudF9leHRlbnNpb25zKQorICAgICAgICAgIGh0bWwgPSByZC50b19odG1sCisgICAgICAgICAgaWYgQGNvbmZpZ1sicmRpc2NvdW50Il1bInRvY190b2tlbiJdCisgICAgICAgICAgICBodG1sID0gcmVwbGFjZV9nZW5lcmF0ZWRfdG9jKHJkLCBodG1sLCBAY29uZmlnWyJyZGlzY291bnQiXVsidG9jX3Rva2VuIl0pCisgICAgICAgICAgZW5kCisgICAgICAgICAgaHRtbAorICAgICAgICBlbmQKKworICAgICAgICBwcml2YXRlCisgICAgICAgIGRlZiByZXBsYWNlX2dlbmVyYXRlZF90b2MocmQsIGh0bWwsIHRvY190b2tlbikKKyAgICAgICAgICBpZiByZC5nZW5lcmF0ZV90b2MgJiYgaHRtbC5pbmNsdWRlPyh0b2NfdG9rZW4pCisgICAgICAgICAgICB1dGY4X3RvYyA9IHJkLnRvY19jb250ZW50CisgICAgICAgICAgICB1dGY4X3RvYy5mb3JjZV9lbmNvZGluZygidXRmLTgiKSBpZiB1dGY4X3RvYy5yZXNwb25kX3RvPyg6Zm9yY2VfZW5jb2RpbmcpCisgICAgICAgICAgICBodG1sLmdzdWIodG9jX3Rva2VuLCB1dGY4X3RvYykKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBodG1sCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0ZXJzL21hcmtkb3duL3JlZGNhcnBldF9wYXJzZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0ZXJzL21hcmtkb3duL3JlZGNhcnBldF9wYXJzZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExNzBmZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbnZlcnRlcnMvbWFya2Rvd24vcmVkY2FycGV0X3BhcnNlci5yYgpAQCAtMCwwICsxLDEwOCBAQAorY2xhc3MgSmVreWxsOjpDb252ZXJ0ZXJzOjpNYXJrZG93bjo6UmVkY2FycGV0UGFyc2VyCisgIG1vZHVsZSBDb21tb25NZXRob2RzCisgICAgZGVmIGFkZF9jb2RlX3RhZ3MoY29kZSwgbGFuZykKKyAgICAgIGNvZGUgPSBjb2RlLnRvX3MKKyAgICAgIGNvZGUgPSBjb2RlLnN1YigKKyAgICAgICAgJXIhPHByZT4hLAorICAgICAgICAiPHByZT48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSN7bGFuZ31cIiBkYXRhLWxhbmc9XCIje2xhbmd9XCI+IgorICAgICAgKQorICAgICAgY29kZSA9IGNvZGUuc3ViKCVyITwvcHJlPiEsICI8L2NvZGU+PC9wcmU+IikKKyAgICAgIGNvZGUKKyAgICBlbmQKKyAgZW5kCisKKyAgbW9kdWxlIFdpdGhQeWdtZW50cworICAgIGluY2x1ZGUgQ29tbW9uTWV0aG9kcworICAgIGRlZiBibG9ja19jb2RlKGNvZGUsIGxhbmcpCisgICAgICBKZWt5bGw6OkV4dGVybmFsLnJlcXVpcmVfd2l0aF9ncmFjZWZ1bF9mYWlsKCJweWdtZW50cyIpCisgICAgICBsYW5nID0gbGFuZyAmJiBsYW5nLnNwbGl0LmZpcnN0IHx8ICJ0ZXh0IgorICAgICAgYWRkX2NvZGVfdGFncygKKyAgICAgICAgUHlnbWVudHMuaGlnaGxpZ2h0KAorICAgICAgICAgIGNvZGUsCisgICAgICAgICAgeworICAgICAgICAgICAgOmxleGVyICAgPT4gbGFuZywKKyAgICAgICAgICAgIDpvcHRpb25zID0+IHsgOmVuY29kaW5nID0+ICJ1dGYtOCIgfSwKKyAgICAgICAgICB9CisgICAgICAgICksCisgICAgICAgIGxhbmcKKyAgICAgICkKKyAgICBlbmQKKyAgZW5kCisKKyAgbW9kdWxlIFdpdGhvdXRIaWdobGlnaHRpbmcKKyAgICByZXF1aXJlICJjZ2kiCisKKyAgICBpbmNsdWRlIENvbW1vbk1ldGhvZHMKKworICAgIGRlZiBjb2RlX3dyYXAoY29kZSkKKyAgICAgICI8ZmlndXJlIGNsYXNzPVwiaGlnaGxpZ2h0XCI+PHByZT4je0NHSS5lc2NhcGVIVE1MKGNvZGUpfTwvcHJlPjwvZmlndXJlPiIKKyAgICBlbmQKKworICAgIGRlZiBibG9ja19jb2RlKGNvZGUsIGxhbmcpCisgICAgICBsYW5nID0gbGFuZyAmJiBsYW5nLnNwbGl0LmZpcnN0IHx8ICJ0ZXh0IgorICAgICAgYWRkX2NvZGVfdGFncyhjb2RlX3dyYXAoY29kZSksIGxhbmcpCisgICAgZW5kCisgIGVuZAorCisgIG1vZHVsZSBXaXRoUm91Z2UKKyAgICBkZWYgYmxvY2tfY29kZShjb2RlLCBsYW5nKQorICAgICAgY29kZSA9ICI8cHJlPiN7c3VwZXJ9PC9wcmU+IgorCisgICAgICBvdXRwdXQgPSAiPGRpdiBjbGFzcz1cImhpZ2hsaWdodFwiPiIKKyAgICAgIG91dHB1dCA8PCBhZGRfY29kZV90YWdzKGNvZGUsIGxhbmcpCisgICAgICBvdXRwdXQgPDwgIjwvZGl2PiIKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorICAgIGRlZiByb3VnZV9mb3JtYXR0ZXIoX2xleGVyKQorICAgICAgUm91Z2U6OkZvcm1hdHRlcnM6OkhUTUwubmV3KDp3cmFwID0+IGZhbHNlKQorICAgIGVuZAorICBlbmQKKworICBkZWYgaW5pdGlhbGl6ZShjb25maWcpCisgICAgSmVreWxsOjpFeHRlcm5hbC5yZXF1aXJlX3dpdGhfZ3JhY2VmdWxfZmFpbCgicmVkY2FycGV0IikKKyAgICBAY29uZmlnID0gY29uZmlnCisgICAgQHJlZGNhcnBldF9leHRlbnNpb25zID0ge30KKyAgICBAY29uZmlnWyJyZWRjYXJwZXQiXVsiZXh0ZW5zaW9ucyJdLmVhY2ggZG8gfGV8CisgICAgICBAcmVkY2FycGV0X2V4dGVuc2lvbnNbZS50b19zeW1dID0gdHJ1ZQorICAgIGVuZAorCisgICAgQHJlbmRlcmVyIHx8PSBjbGFzc193aXRoX3Byb3Blcl9oaWdobGlnaHRlcihAY29uZmlnWyJoaWdobGlnaHRlciJdKQorICBlbmQKKworICBkZWYgY2xhc3Nfd2l0aF9wcm9wZXJfaGlnaGxpZ2h0ZXIoaGlnaGxpZ2h0ZXIpCisgICAgQ2xhc3MubmV3KFJlZGNhcnBldDo6UmVuZGVyOjpIVE1MKSBkbworICAgICAgY2FzZSBoaWdobGlnaHRlcgorICAgICAgd2hlbiAicHlnbWVudHMiCisgICAgICAgIGluY2x1ZGUgV2l0aFB5Z21lbnRzCisgICAgICB3aGVuICJyb3VnZSIKKyAgICAgICAgSmVreWxsOjpFeHRlcm5hbC5yZXF1aXJlX3dpdGhfZ3JhY2VmdWxfZmFpbCgldygKKyAgICAgICAgICByb3VnZSByb3VnZS9wbHVnaW5zL3JlZGNhcnBldAorICAgICAgICApKQorCisgICAgICAgIHVubGVzcyBHZW06OlZlcnNpb24ubmV3KFJvdWdlLnZlcnNpb24pID4gR2VtOjpWZXJzaW9uLm5ldygiMS4zLjAiKQorICAgICAgICAgIGFib3J0ICJQbGVhc2UgaW5zdGFsbCBSb3VnZSAxLjMuMCBvciBncmVhdGVyIGFuZCB0cnkgcnVubmluZyBKZWt5bGwgYWdhaW4uIgorICAgICAgICBlbmQKKworICAgICAgICBpbmNsdWRlIFJvdWdlOjpQbHVnaW5zOjpSZWRjYXJwZXQKKyAgICAgICAgaW5jbHVkZSBDb21tb25NZXRob2RzCisgICAgICAgIGluY2x1ZGUgV2l0aFJvdWdlCisgICAgICBlbHNlCisgICAgICAgIGluY2x1ZGUgV2l0aG91dEhpZ2hsaWdodGluZworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBjb252ZXJ0KGNvbnRlbnQpCisgICAgQHJlZGNhcnBldF9leHRlbnNpb25zWzpmZW5jZWRfY29kZV9ibG9ja3NdID0gXAorICAgICAgIUByZWRjYXJwZXRfZXh0ZW5zaW9uc1s6bm9fZmVuY2VkX2NvZGVfYmxvY2tzXQorICAgIGlmIEByZWRjYXJwZXRfZXh0ZW5zaW9uc1s6c21hcnRdCisgICAgICBAcmVuZGVyZXIuc2VuZCA6aW5jbHVkZSwgUmVkY2FycGV0OjpSZW5kZXI6OlNtYXJ0eVBhbnRzCisgICAgZW5kCisgICAgbWFya2Rvd24gPSBSZWRjYXJwZXQ6Ok1hcmtkb3duLm5ldygKKyAgICAgIEByZW5kZXJlci5uZXcoQHJlZGNhcnBldF9leHRlbnNpb25zKSwKKyAgICAgIEByZWRjYXJwZXRfZXh0ZW5zaW9ucworICAgICkKKyAgICBtYXJrZG93bi5yZW5kZXIoY29udGVudCkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2NvbnZlcnRlcnMvc21hcnR5cGFudHMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0ZXJzL3NtYXJ0eXBhbnRzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYmM4MTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0ZXJzL3NtYXJ0eXBhbnRzLnJiCkBAIC0wLDAgKzEsMzQgQEAKK2NsYXNzIEtyYW1kb3duOjpQYXJzZXI6OlNtYXJ0eVBhbnRzIDwgS3JhbWRvd246OlBhcnNlcjo6S3JhbWRvd24KKyAgZGVmIGluaXRpYWxpemUoc291cmNlLCBvcHRpb25zKQorICAgIHN1cGVyCisgICAgQGJsb2NrX3BhcnNlcnMgPSBbOmJsb2NrX2h0bWxdCisgICAgQHNwYW5fcGFyc2VycyA9ICBbOnNtYXJ0X3F1b3RlcywgOmh0bWxfZW50aXR5LCA6dHlwb2dyYXBoaWNfc3ltcywgOnNwYW5faHRtbF0KKyAgZW5kCitlbmQKKworbW9kdWxlIEpla3lsbAorICBtb2R1bGUgQ29udmVydGVycworICAgIGNsYXNzIFNtYXJ0eVBhbnRzIDwgQ29udmVydGVyCisgICAgICBzYWZlIHRydWUKKyAgICAgIHByaW9yaXR5IDpsb3cKKworICAgICAgZGVmIGluaXRpYWxpemUoY29uZmlnKQorICAgICAgICBKZWt5bGw6OkV4dGVybmFsLnJlcXVpcmVfd2l0aF9ncmFjZWZ1bF9mYWlsICJrcmFtZG93biIKKyAgICAgICAgQGNvbmZpZyA9IGNvbmZpZ1sia3JhbWRvd24iXS5kdXAgfHwge30KKyAgICAgICAgQGNvbmZpZ1s6aW5wdXRdID0gOlNtYXJ0eVBhbnRzCisgICAgICBlbmQKKworICAgICAgZGVmIG1hdGNoZXMoXykKKyAgICAgICAgZmFsc2UKKyAgICAgIGVuZAorCisgICAgICBkZWYgb3V0cHV0X2V4dChfKQorICAgICAgICBuaWwKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydChjb250ZW50KQorICAgICAgICBLcmFtZG93bjo6RG9jdW1lbnQubmV3KGNvbnRlbnQsIEBjb25maWcpLnRvX2h0bWwuY2hvbXAKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29udmVydGlibGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9jb252ZXJ0aWJsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDEyNWYwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvY29udmVydGlibGUucmIKQEAgLTAsMCArMSwyNTEgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisKK3JlcXVpcmUgInNldCIKKworIyBDb252ZXJ0aWJsZSBwcm92aWRlcyBtZXRob2RzIGZvciBjb252ZXJ0aW5nIGEgcGFnZWxpa2UgaXRlbQorIyBmcm9tIGEgY2VydGFpbiB0eXBlIG9mIG1hcmt1cCBpbnRvIGFjdHVhbCBjb250ZW50CisjCisjIFJlcXVpcmVzCisjICAgc2VsZi5zaXRlIC0+IEpla3lsbDo6U2l0ZQorIyAgIHNlbGYuY29udGVudAorIyAgIHNlbGYuY29udGVudD0KKyMgICBzZWxmLmRhdGE9CisjICAgc2VsZi5leHQ9CisjICAgc2VsZi5vdXRwdXQ9CisjICAgc2VsZi5uYW1lCisjICAgc2VsZi5wYXRoCisjICAgc2VsZi50eXBlIC0+IDpwYWdlLCA6cG9zdCBvciA6ZHJhZnQKKworbW9kdWxlIEpla3lsbAorICBtb2R1bGUgQ29udmVydGlibGUKKyAgICAjIFJldHVybnMgdGhlIGNvbnRlbnRzIGFzIGEgU3RyaW5nLgorICAgIGRlZiB0b19zCisgICAgICBjb250ZW50IHx8ICIiCisgICAgZW5kCisKKyAgICAjIFdoZXRoZXIgdGhlIGZpbGUgaXMgcHVibGlzaGVkIG9yIG5vdCwgYXMgaW5kaWNhdGVkIGluIFlBTUwgZnJvbnQtbWF0dGVyCisgICAgZGVmIHB1Ymxpc2hlZD8KKyAgICAgICEoZGF0YS5rZXk/KCJwdWJsaXNoZWQiKSAmJiBkYXRhWyJwdWJsaXNoZWQiXSA9PSBmYWxzZSkKKyAgICBlbmQKKworICAgICMgUmVhZCB0aGUgWUFNTCBmcm9udG1hdHRlci4KKyAgICAjCisgICAgIyBiYXNlIC0gVGhlIFN0cmluZyBwYXRoIHRvIHRoZSBkaXIgY29udGFpbmluZyB0aGUgZmlsZS4KKyAgICAjIG5hbWUgLSBUaGUgU3RyaW5nIGZpbGVuYW1lIG9mIHRoZSBmaWxlLgorICAgICMgb3B0cyAtIG9wdGlvbmFsIHBhcmFtZXRlciB0byBGaWxlLnJlYWQsIGRlZmF1bHQgYXQgc2l0ZSBjb25maWdzCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgICMgcnVib2NvcDpkaXNhYmxlIE1ldHJpY3MvQWJjU2l6ZQorICAgIGRlZiByZWFkX3lhbWwoYmFzZSwgbmFtZSwgb3B0cyA9IHt9KQorICAgICAgZmlsZW5hbWUgPSBGaWxlLmpvaW4oYmFzZSwgbmFtZSkKKworICAgICAgYmVnaW4KKyAgICAgICAgc2VsZi5jb250ZW50ID0gRmlsZS5yZWFkKEBwYXRoIHx8IHNpdGUuaW5fc291cmNlX2RpcihiYXNlLCBuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLm1lcmdlZF9maWxlX3JlYWRfb3B0cyhzaXRlLCBvcHRzKSkKKyAgICAgICAgaWYgY29udGVudCA9fiBEb2N1bWVudDo6WUFNTF9GUk9OVF9NQVRURVJfUkVHRVhQCisgICAgICAgICAgc2VsZi5jb250ZW50ID0gJFBPU1RNQVRDSAorICAgICAgICAgIHNlbGYuZGF0YSA9IFNhZmVZQU1MLmxvYWQoUmVnZXhwLmxhc3RfbWF0Y2goMSkpCisgICAgICAgIGVuZAorICAgICAgcmVzY3VlIFN5bnRheEVycm9yID0+IGUKKyAgICAgICAgSmVreWxsLmxvZ2dlci53YXJuICJZQU1MIEV4Y2VwdGlvbiByZWFkaW5nICN7ZmlsZW5hbWV9OiAje2UubWVzc2FnZX0iCisgICAgICAgIHJhaXNlIGUgaWYgc2VsZi5zaXRlLmNvbmZpZ1sic3RyaWN0X2Zyb250X21hdHRlciJdCisgICAgICByZXNjdWUgPT4gZQorICAgICAgICBKZWt5bGwubG9nZ2VyLndhcm4gIkVycm9yIHJlYWRpbmcgZmlsZSAje2ZpbGVuYW1lfTogI3tlLm1lc3NhZ2V9IgorICAgICAgICByYWlzZSBlIGlmIHNlbGYuc2l0ZS5jb25maWdbInN0cmljdF9mcm9udF9tYXR0ZXIiXQorICAgICAgZW5kCisKKyAgICAgIHNlbGYuZGF0YSB8fD0ge30KKworICAgICAgdmFsaWRhdGVfZGF0YSEgZmlsZW5hbWUKKyAgICAgIHZhbGlkYXRlX3Blcm1hbGluayEgZmlsZW5hbWUKKworICAgICAgc2VsZi5kYXRhCisgICAgZW5kCisgICAgIyBydWJvY29wOmVuYWJsZSBNZXRyaWNzL0FiY1NpemUKKworICAgIGRlZiB2YWxpZGF0ZV9kYXRhIShmaWxlbmFtZSkKKyAgICAgIHVubGVzcyBzZWxmLmRhdGEuaXNfYT8oSGFzaCkKKyAgICAgICAgcmFpc2UgRXJyb3JzOjpJbnZhbGlkWUFNTEZyb250TWF0dGVyRXJyb3IsCisgICAgICAgICAgIkludmFsaWQgWUFNTCBmcm9udCBtYXR0ZXIgaW4gI3tmaWxlbmFtZX0iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiB2YWxpZGF0ZV9wZXJtYWxpbmshKGZpbGVuYW1lKQorICAgICAgaWYgc2VsZi5kYXRhWyJwZXJtYWxpbmsiXSAmJiBzZWxmLmRhdGFbInBlcm1hbGluayJdLnRvX3MuZW1wdHk/CisgICAgICAgIHJhaXNlIEVycm9yczo6SW52YWxpZFBlcm1hbGlua0Vycm9yLCAiSW52YWxpZCBwZXJtYWxpbmsgaW4gI3tmaWxlbmFtZX0iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVHJhbnNmb3JtIHRoZSBjb250ZW50cyBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHRyYW5zZm9ybWVkIGNvbnRlbnRzLgorICAgIGRlZiB0cmFuc2Zvcm0KKyAgICAgIF9yZW5kZXJlci5jb252ZXJ0KGNvbnRlbnQpCisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB0aGUgZXh0ZW5zaW9uIGRlcGVuZGluZyBvbiBjb250ZW50X3R5cGUuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgU3RyaW5nIGV4dGVuc2lvbiBmb3IgdGhlIG91dHB1dCBmaWxlLgorICAgICMgICBlLmcuICIuaHRtbCIgZm9yIGFuIEhUTUwgb3V0cHV0IGZpbGUuCisgICAgZGVmIG91dHB1dF9leHQKKyAgICAgIF9yZW5kZXJlci5vdXRwdXRfZXh0CisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB3aGljaCBjb252ZXJ0ZXIgdG8gdXNlIGJhc2VkIG9uIHRoaXMgY29udmVydGlibGUncworICAgICMgZXh0ZW5zaW9uLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIENvbnZlcnRlciBpbnN0YW5jZS4KKyAgICBkZWYgY29udmVydGVycworICAgICAgX3JlbmRlcmVyLmNvbnZlcnRlcnMKKyAgICBlbmQKKworICAgICMgUmVuZGVyIExpcXVpZCBpbiB0aGUgY29udGVudAorICAgICMKKyAgICAjIGNvbnRlbnQgLSB0aGUgcmF3IExpcXVpZCBjb250ZW50IHRvIHJlbmRlcgorICAgICMgcGF5bG9hZCAtIHRoZSBwYXlsb2FkIGZvciBMaXF1aWQKKyAgICAjIGluZm8gICAgLSB0aGUgaW5mbyBmb3IgTGlxdWlkCisgICAgIworICAgICMgUmV0dXJucyB0aGUgY29udmVydGVkIGNvbnRlbnQKKyAgICBkZWYgcmVuZGVyX2xpcXVpZChjb250ZW50LCBwYXlsb2FkLCBpbmZvLCBwYXRoKQorICAgICAgX3JlbmRlcmVyLnJlbmRlcl9saXF1aWQoY29udGVudCwgcGF5bG9hZCwgaW5mbywgcGF0aCkKKyAgICBlbmQKKyAgICAjIHJ1Ym9jb3A6IGVuYWJsZSBSZXNjdWVFeGNlcHRpb24KKworICAgICMgQ29udmVydCB0aGlzIENvbnZlcnRpYmxlJ3MgZGF0YSB0byBhIEhhc2ggc3VpdGFibGUgZm9yIHVzZSBieSBMaXF1aWQuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgSGFzaCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIENvbnZlcnRpYmxlLgorICAgIGRlZiB0b19saXF1aWQoYXR0cnMgPSBuaWwpCisgICAgICBmdXJ0aGVyX2RhdGEgPSBIYXNoWyhhdHRycyB8fCBzZWxmLmNsYXNzOjpBVFRSSUJVVEVTX0ZPUl9MSVFVSUQpLm1hcCBkbyB8YXR0cmlidXRlfAorICAgICAgICBbYXR0cmlidXRlLCBzZW5kKGF0dHJpYnV0ZSldCisgICAgICBlbmRdCisKKyAgICAgIGRlZmF1bHRzID0gc2l0ZS5mcm9udG1hdHRlcl9kZWZhdWx0cy5hbGwocmVsYXRpdmVfcGF0aCwgdHlwZSkKKyAgICAgIFV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzIGRlZmF1bHRzLCBVdGlscy5kZWVwX21lcmdlX2hhc2hlcyhkYXRhLCBmdXJ0aGVyX2RhdGEpCisgICAgZW5kCisKKyAgICAjIFRoZSB0eXBlIG9mIGEgZG9jdW1lbnQsCisgICAgIyAgIGkuZS4sIGl0cyBjbGFzc25hbWUgZG93bmNhc2UnZCBhbmQgdG9fc3ltJ2QuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgdHlwZSBvZiBzZWxmLgorICAgIGRlZiB0eXBlCisgICAgICBpZiBpc19hPyhQYWdlKQorICAgICAgICA6cGFnZXMKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyByZXR1cm5zIHRoZSBvd25lciBzeW1ib2wgZm9yIGhvb2sgdHJpZ2dlcmluZworICAgIGRlZiBob29rX293bmVyCisgICAgICBpZiBpc19hPyhQYWdlKQorICAgICAgICA6cGFnZXMKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgYW4gYXNzZXQgZmlsZS4KKyAgICAjIEFzc2V0IGZpbGVzIGluY2x1ZGUgQ29mZmVlU2NyaXB0IGZpbGVzIGFuZCBTYXNzL1NDU1MgZmlsZXMuCisgICAgIworICAgICMgUmV0dXJucyB0cnVlIGlmIHRoZSBleHRuYW1lIGJlbG9uZ3MgdG8gdGhlIHNldCBvZiBleHRlbnNpb25zCisgICAgIyAgIHRoYXQgYXNzZXQgZmlsZXMgdXNlLgorICAgIGRlZiBhc3NldF9maWxlPworICAgICAgc2Fzc19maWxlPyB8fCBjb2ZmZWVzY3JpcHRfZmlsZT8KKyAgICBlbmQKKworICAgICMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgU2FzcyBmaWxlLgorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiBleHRuYW1lID09IC5zYXNzIG9yIC5zY3NzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgZGVmIHNhc3NfZmlsZT8KKyAgICAgICV3KC5zYXNzIC5zY3NzKS5pbmNsdWRlPyhleHQpCisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBhIENvZmZlZVNjcmlwdCBmaWxlLgorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiBleHRuYW1lID09IC5jb2ZmZWUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBkZWYgY29mZmVlc2NyaXB0X2ZpbGU/CisgICAgICBleHQgPT0gIi5jb2ZmZWUiCisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSByZW5kZXJlZCB3aXRoIExpcXVpZC4KKyAgICAjCisgICAgIyBBbHdheXMgcmV0dXJucyB0cnVlLgorICAgIGRlZiByZW5kZXJfd2l0aF9saXF1aWQ/CisgICAgICB0cnVlCisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBwbGFjZWQgaW50byBsYXlvdXRzLgorICAgICMKKyAgICAjIFJldHVybnMgZmFsc2UgaWYgdGhlIGRvY3VtZW50IGlzIGFuIGFzc2V0IGZpbGUuCisgICAgZGVmIHBsYWNlX2luX2xheW91dD8KKyAgICAgICFhc3NldF9maWxlPworICAgIGVuZAorCisgICAgIyBDaGVja3MgaWYgdGhlIGxheW91dCBzcGVjaWZpZWQgaW4gdGhlIGRvY3VtZW50IGFjdHVhbGx5IGV4aXN0cworICAgICMKKyAgICAjIGxheW91dCAtIHRoZSBsYXlvdXQgdG8gY2hlY2sKKyAgICAjCisgICAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIGxheW91dCBpcyBpbnZhbGlkLCBmYWxzZSBpZiBvdGhlcndpc2UKKyAgICBkZWYgaW52YWxpZF9sYXlvdXQ/KGxheW91dCkKKyAgICAgICFkYXRhWyJsYXlvdXQiXS5uaWw/ICYmIGxheW91dC5uaWw/ICYmICEoc2VsZi5pc19hPyBKZWt5bGw6OkV4Y2VycHQpCisgICAgZW5kCisKKyAgICAjIFJlY3Vyc2l2ZWx5IHJlbmRlciBsYXlvdXRzCisgICAgIworICAgICMgbGF5b3V0cyAtIGEgbGlzdCBvZiB0aGUgbGF5b3V0cworICAgICMgcGF5bG9hZCAtIHRoZSBwYXlsb2FkIGZvciBMaXF1aWQKKyAgICAjIGluZm8gICAgLSB0aGUgaW5mbyBmb3IgTGlxdWlkCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nCisgICAgZGVmIHJlbmRlcl9hbGxfbGF5b3V0cyhsYXlvdXRzLCBwYXlsb2FkLCBpbmZvKQorICAgICAgX3JlbmRlcmVyLmxheW91dHMgPSBsYXlvdXRzCisgICAgICBzZWxmLm91dHB1dCA9IF9yZW5kZXJlci5wbGFjZV9pbl9sYXlvdXRzKG91dHB1dCwgcGF5bG9hZCwgaW5mbykKKyAgICBlbnN1cmUKKyAgICAgIEBfcmVuZGVyZXIgPSBuaWwgIyB0aGlzIHdpbGwgYWxsb3cgdGhlIG1vZGlmaWNhdGlvbnMgYWJvdmUgdG8gZGlzYXBwZWFyCisgICAgZW5kCisKKyAgICAjIEFkZCBhbnkgbmVjZXNzYXJ5IGxheW91dHMgdG8gdGhpcyBjb252ZXJ0aWJsZSBkb2N1bWVudC4KKyAgICAjCisgICAgIyBwYXlsb2FkIC0gVGhlIHNpdGUgcGF5bG9hZCBEcm9wIG9yIEhhc2guCisgICAgIyBsYXlvdXRzIC0gQSBIYXNoIG9mIHsibmFtZSIgPT4gImxheW91dCJ9LgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgZG9fbGF5b3V0KHBheWxvYWQsIGxheW91dHMpCisgICAgICBzZWxmLm91dHB1dCA9IF9yZW5kZXJlci50YXAgZG8gfHJlbmRlcmVyfAorICAgICAgICByZW5kZXJlci5sYXlvdXRzID0gbGF5b3V0cworICAgICAgICByZW5kZXJlci5wYXlsb2FkID0gcGF5bG9hZAorICAgICAgZW5kLnJ1bgorCisgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJQb3N0LVJlbmRlciBIb29rczoiLCBzZWxmLnJlbGF0aXZlX3BhdGgKKyAgICAgIEpla3lsbDo6SG9va3MudHJpZ2dlciBob29rX293bmVyLCA6cG9zdF9yZW5kZXIsIHNlbGYKKyAgICBlbnN1cmUKKyAgICAgIEBfcmVuZGVyZXIgPSBuaWwgIyB0aGlzIHdpbGwgYWxsb3cgdGhlIG1vZGlmaWNhdGlvbnMgYWJvdmUgdG8gZGlzYXBwZWFyCisgICAgZW5kCisKKyAgICAjIFdyaXRlIHRoZSBnZW5lcmF0ZWQgcGFnZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgIworICAgICMgZGVzdCAtIFRoZSBTdHJpbmcgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZGlyLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgd3JpdGUoZGVzdCkKKyAgICAgIHBhdGggPSBkZXN0aW5hdGlvbihkZXN0KQorICAgICAgRmlsZVV0aWxzLm1rZGlyX3AoRmlsZS5kaXJuYW1lKHBhdGgpKQorICAgICAgRmlsZS53cml0ZShwYXRoLCBvdXRwdXQsIDptb2RlID0+ICJ3YiIpCisgICAgICBKZWt5bGw6Okhvb2tzLnRyaWdnZXIgaG9va19vd25lciwgOnBvc3Rfd3JpdGUsIHNlbGYKKyAgICBlbmQKKworICAgICMgQWNjZXNzb3IgZm9yIGRhdGEgcHJvcGVydGllcyBieSBMaXF1aWQuCisgICAgIworICAgICMgcHJvcGVydHkgLSBUaGUgU3RyaW5nIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvciBuaWwgaWYgdGhlIHByb3BlcnR5IGlzbid0IGluY2x1ZGVkLgorICAgIGRlZiBbXShwcm9wZXJ0eSkKKyAgICAgIGlmIHNlbGYuY2xhc3M6OkFUVFJJQlVURVNfRk9SX0xJUVVJRC5pbmNsdWRlPyhwcm9wZXJ0eSkKKyAgICAgICAgc2VuZChwcm9wZXJ0eSkKKyAgICAgIGVsc2UKKyAgICAgICAgZGF0YVtwcm9wZXJ0eV0KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiBfcmVuZGVyZXIKKyAgICAgIEBfcmVuZGVyZXIgfHw9IEpla3lsbDo6UmVuZGVyZXIubmV3KHNpdGUsIHNlbGYpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kZXByZWNhdG9yLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZGVwcmVjYXRvci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTU3NGJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZGVwcmVjYXRvci5yYgpAQCAtMCwwICsxLDUxIEBACittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBEZXByZWNhdG9yCisgICAgZXh0ZW5kIHNlbGYKKworICAgIGRlZiBwcm9jZXNzKGFyZ3MpCisgICAgICBhcmdfaXNfcHJlc2VudD8gYXJncywgIi0tc2VydmVyIiwgIlRoZSAtLXNlcnZlciBjb21tYW5kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXJ2ZScgc3ViY29tbWFuZC4iCisgICAgICBhcmdfaXNfcHJlc2VudD8gYXJncywgIi0tc2VydmUiLCAiVGhlIC0tc2VydmVyIGNvbW1hbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlcnZlJyBzdWJjb21tYW5kLiIKKyAgICAgIGFyZ19pc19wcmVzZW50PyBhcmdzLCAiLS1uby1zZXJ2ZXIiLCAiVG8gYnVpbGQgSmVreWxsIHdpdGhvdXQgbGF1bmNoaW5nIGEgc2VydmVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgJ2J1aWxkJyBzdWJjb21tYW5kLiIKKyAgICAgIGFyZ19pc19wcmVzZW50PyBhcmdzLCAiLS1hdXRvIiwgIlRoZSBzd2l0Y2ggJy0tYXV0bycgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICctLXdhdGNoJy4iCisgICAgICBhcmdfaXNfcHJlc2VudD8gYXJncywgIi0tbm8tYXV0byIsICJUbyBkaXNhYmxlIGF1dG8tcmVwbGljYXRpb24sIHNpbXBseSBsZWF2ZSBvZmYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgJy0td2F0Y2gnIHN3aXRjaC4iCisgICAgICBhcmdfaXNfcHJlc2VudD8gYXJncywgIi0tcHlnbWVudHMiLCAiVGhlICdweWdtZW50cydzZXR0aW5ncyBoYXMgYmVlbiByZW1vdmVkIGluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmF2b3VyIG9mICdoaWdobGlnaHRlcicuIgorICAgICAgYXJnX2lzX3ByZXNlbnQ/IGFyZ3MsICItLXBhZ2luYXRlIiwgIlRoZSAncGFnaW5hdGUnIHNldHRpbmcgY2FuIG9ubHkgYmUgc2V0IGluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeW91ciBjb25maWcgZmlsZXMuIgorICAgICAgYXJnX2lzX3ByZXNlbnQ/IGFyZ3MsICItLXVybCIsICJUaGUgJ3VybCcgc2V0dGluZyBjYW4gb25seSBiZSBzZXQgaW4geW91ciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyBmaWxlcy4iCisgICAgICBub19zdWJjb21tYW5kKGFyZ3MpCisgICAgZW5kCisKKyAgICBkZWYgbm9fc3ViY29tbWFuZChhcmdzKQorICAgICAgdW5sZXNzIGFyZ3MuZW1wdHk/IHx8CisgICAgICAgICAgYXJncy5maXJzdCAhfiAlcighL14tLS8hKSB8fCAldygtLWhlbHAgLS12ZXJzaW9uKS5pbmNsdWRlPyhhcmdzLmZpcnN0KQorICAgICAgICBkZXByZWNhdGlvbl9tZXNzYWdlICJKZWt5bGwgbm93IHVzZXMgc3ViY29tbWFuZHMgaW5zdGVhZCBvZiBqdXN0IHN3aXRjaGVzLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1biBgamVreWxsIGhlbHBgIHRvIGZpbmQgb3V0IG1vcmUuIgorICAgICAgICBhYm9ydAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgYXJnX2lzX3ByZXNlbnQ/KGFyZ3MsIGRlcHJlY2F0ZWRfYXJndW1lbnQsIG1lc3NhZ2UpCisgICAgICBpZiBhcmdzLmluY2x1ZGU/KGRlcHJlY2F0ZWRfYXJndW1lbnQpCisgICAgICAgIGRlcHJlY2F0aW9uX21lc3NhZ2UobWVzc2FnZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGRlcHJlY2F0aW9uX21lc3NhZ2UobWVzc2FnZSkKKyAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiRGVwcmVjYXRpb246IiwgbWVzc2FnZQorICAgIGVuZAorCisgICAgZGVmIGRlZmF1bHRzX2RlcHJlY2F0ZV90eXBlKG9sZCwgY3VycmVudCkKKyAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiRGVmYXVsdHM6IiwgIlRoZSAnI3tvbGR9JyB0eXBlIGhhcyBiZWNvbWUgJyN7Y3VycmVudH0nLiIKKyAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiRGVmYXVsdHM6IiwgIlBsZWFzZSB1cGRhdGUgeW91ciBmcm9udC1tYXR0ZXIgZGVmYXVsdHMgdG8gdXNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlOiAje2N1cnJlbnR9Jy4iCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2RvY3VtZW50LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZG9jdW1lbnQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwZjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2RvY3VtZW50LnJiCkBAIC0wLDAgKzEsNTA3IEBACisjIGVuY29kaW5nOiBVVEYtOAorCittb2R1bGUgSmVreWxsCisgIGNsYXNzIERvY3VtZW50CisgICAgaW5jbHVkZSBDb21wYXJhYmxlCisgICAgZXh0ZW5kIEZvcndhcmRhYmxlCisKKyAgICBhdHRyX3JlYWRlciA6cGF0aCwgOnNpdGUsIDpleHRuYW1lLCA6Y29sbGVjdGlvbgorICAgIGF0dHJfYWNjZXNzb3IgOmNvbnRlbnQsIDpvdXRwdXQKKworICAgIGRlZl9kZWxlZ2F0b3IgOnNlbGYsIDpyZWFkX3Bvc3RfZGF0YSwgOnBvc3RfcmVhZAorCisgICAgWUFNTF9GUk9OVF9NQVRURVJfUkVHRVhQID0gJXIhXEEoLS0tXHMqXG4uKj9cbj8pXigoLS0tfFwuXC5cLilccyokXG4/KSFtCisgICAgREFURUxFU1NfRklMRU5BTUVfTUFUQ0hFUiA9ICVyIV4oPzouKy8pKiguKikoXC5bXi5dKykkIQorICAgIERBVEVfRklMRU5BTUVfTUFUQ0hFUiA9ICVyIV4oPzouKy8pKihcZHsyLDR9LVxkezEsMn0tXGR7MSwyfSktKC4qKShcLlteLl0rKSQhCisKKyAgICAjIENyZWF0ZSBhIG5ldyBEb2N1bWVudC4KKyAgICAjCisgICAgIyBwYXRoIC0gdGhlIHBhdGggdG8gdGhlIGZpbGUKKyAgICAjIHJlbGF0aW9ucyAtIGEgaGFzaCB3aXRoIGtleXMgOnNpdGUgYW5kIDpjb2xsZWN0aW9uLCB0aGUgdmFsdWVzIG9mIHdoaWNoCisgICAgIyAgICAgICAgICAgICBhcmUgdGhlIEpla3lsbDo6U2l0ZSBhbmQgSmVreWxsOjpDb2xsZWN0aW9uIHRvIHdoaWNoIHRoaXMKKyAgICAjICAgICAgICAgICAgIERvY3VtZW50IGJlbG9uZy4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIGluaXRpYWxpemUocGF0aCwgcmVsYXRpb25zID0ge30pCisgICAgICBAc2l0ZSA9IHJlbGF0aW9uc1s6c2l0ZV0KKyAgICAgIEBwYXRoID0gcGF0aAorICAgICAgQGV4dG5hbWUgPSBGaWxlLmV4dG5hbWUocGF0aCkKKyAgICAgIEBjb2xsZWN0aW9uID0gcmVsYXRpb25zWzpjb2xsZWN0aW9uXQorICAgICAgQGhhc195YW1sX2hlYWRlciA9IG5pbAorCisgICAgICBpZiBkcmFmdD8KKyAgICAgICAgY2F0ZWdvcmllc19mcm9tX3BhdGgoIl9kcmFmdHMiKQorICAgICAgZWxzZQorICAgICAgICBjYXRlZ29yaWVzX2Zyb21fcGF0aChjb2xsZWN0aW9uLnJlbGF0aXZlX2RpcmVjdG9yeSkKKyAgICAgIGVuZAorCisgICAgICBkYXRhLmRlZmF1bHRfcHJvYyA9IHByb2MgZG8gfF8sIGtleXwKKyAgICAgICAgc2l0ZS5mcm9udG1hdHRlcl9kZWZhdWx0cy5maW5kKHJlbGF0aXZlX3BhdGgsIGNvbGxlY3Rpb24ubGFiZWwsIGtleSkKKyAgICAgIGVuZAorCisgICAgICB0cmlnZ2VyX2hvb2tzKDpwb3N0X2luaXQpCisgICAgZW5kCisKKyAgICAjIEZldGNoIHRoZSBEb2N1bWVudCdzIGRhdGEuCisgICAgIworICAgICMgUmV0dXJucyBhIEhhc2ggY29udGFpbmluZyB0aGUgZGF0YS4gQW4gZW1wdHkgaGFzaCBpcyByZXR1cm5lZCBpZgorICAgICMgICBubyBkYXRhIHdhcyByZWFkLgorICAgIGRlZiBkYXRhCisgICAgICBAZGF0YSB8fD0ge30KKyAgICBlbmQKKworICAgICMgTWVyZ2Ugc29tZSBkYXRhIGluIHdpdGggdGhpcyBkb2N1bWVudCdzIGRhdGEuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgbWVyZ2VkIGRhdGEuCisgICAgZGVmIG1lcmdlX2RhdGEhKG90aGVyLCBzb3VyY2U6ICJZQU1MIGZyb250IG1hdHRlciIpCisgICAgICBtZXJnZV9jYXRlZ29yaWVzIShvdGhlcikKKyAgICAgIFV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzIShkYXRhLCBvdGhlcikKKyAgICAgIG1lcmdlX2RhdGUhKHNvdXJjZSkKKyAgICAgIGRhdGEKKyAgICBlbmQKKworICAgIGRlZiBkYXRlCisgICAgICBkYXRhWyJkYXRlIl0gfHw9IChkcmFmdD8gPyBzb3VyY2VfZmlsZV9tdGltZSA6IHNpdGUudGltZSkKKyAgICBlbmQKKworICAgIGRlZiBzb3VyY2VfZmlsZV9tdGltZQorICAgICAgQHNvdXJjZV9maWxlX210aW1lIHx8PSBGaWxlLm10aW1lKHBhdGgpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgYSBkcmFmdC4gVGhpcyBpcyBvbmx5IHRoZSBjYXNlIGlmCisgICAgIyB0aGUgZG9jdW1lbnQgaXMgaW4gdGhlICdwb3N0cycgY29sbGVjdGlvbiBidXQgaW4gYSBkaWZmZXJlbnQKKyAgICAjIGRpcmVjdG9yeSB0aGFuICdfcG9zdHMnLgorICAgICMKKyAgICAjIFJldHVybnMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgYSBkcmFmdC4KKyAgICBkZWYgZHJhZnQ/CisgICAgICBkYXRhWyJkcmFmdCJdIHx8PSByZWxhdGl2ZV9wYXRoLmluZGV4KGNvbGxlY3Rpb24ucmVsYXRpdmVfZGlyZWN0b3J5KS5uaWw/ICYmCisgICAgICAgIGNvbGxlY3Rpb24ubGFiZWwgPT0gInBvc3RzIgorICAgIGVuZAorCisgICAgIyBUaGUgcGF0aCB0byB0aGUgZG9jdW1lbnQsIHJlbGF0aXZlIHRvIHRoZSBzaXRlIHNvdXJjZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIGEgU3RyaW5nIHBhdGggd2hpY2ggcmVwcmVzZW50cyB0aGUgcmVsYXRpdmUgcGF0aAorICAgICMgICBmcm9tIHRoZSBzaXRlIHNvdXJjZSB0byB0aGlzIGRvY3VtZW50CisgICAgZGVmIHJlbGF0aXZlX3BhdGgKKyAgICAgIEByZWxhdGl2ZV9wYXRoIHx8PSBQYXRodXRpbC5uZXcocGF0aCkucmVsYXRpdmVfcGF0aF9mcm9tKHNpdGUuc291cmNlKS50b19zCisgICAgZW5kCisKKyAgICAjIFRoZSBvdXRwdXQgZXh0ZW5zaW9uIG9mIHRoZSBkb2N1bWVudC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBvdXRwdXQgZXh0ZW5zaW9uCisgICAgZGVmIG91dHB1dF9leHQKKyAgICAgIEpla3lsbDo6UmVuZGVyZXIubmV3KHNpdGUsIHNlbGYpLm91dHB1dF9leHQKKyAgICBlbmQKKworICAgICMgVGhlIGJhc2UgZmlsZW5hbWUgb2YgdGhlIGRvY3VtZW50LCB3aXRob3V0IHRoZSBmaWxlIGV4dG5hbWUuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgYmFzZW5hbWUgd2l0aG91dCB0aGUgZmlsZSBleHRuYW1lLgorICAgIGRlZiBiYXNlbmFtZV93aXRob3V0X2V4dAorICAgICAgQGJhc2VuYW1lX3dpdGhvdXRfZXh0IHx8PSBGaWxlLmJhc2VuYW1lKHBhdGgsICIuKiIpCisgICAgZW5kCisKKyAgICAjIFRoZSBiYXNlIGZpbGVuYW1lIG9mIHRoZSBkb2N1bWVudC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBiYXNlIGZpbGVuYW1lIG9mIHRoZSBkb2N1bWVudC4KKyAgICBkZWYgYmFzZW5hbWUKKyAgICAgIEBiYXNlbmFtZSB8fD0gRmlsZS5iYXNlbmFtZShwYXRoKQorICAgIGVuZAorCisgICAgIyBQcm9kdWNlcyBhICJjbGVhbmVkIiByZWxhdGl2ZSBwYXRoLgorICAgICMgVGhlICJjbGVhbmVkIiByZWxhdGl2ZSBwYXRoIGlzIHRoZSByZWxhdGl2ZSBwYXRoIHdpdGhvdXQgdGhlIGV4dG5hbWUKKyAgICAjICAgYW5kIHdpdGggdGhlIGNvbGxlY3Rpb24ncyBkaXJlY3RvcnkgcmVtb3ZlZCBhcyB3ZWxsLgorICAgICMgVGhpcyBtZXRob2QgaXMgdXNlZnVsIHdoZW4gYnVpbGRpbmcgdGhlIFVSTCBvZiB0aGUgZG9jdW1lbnQuCisgICAgIworICAgICMgRXhhbXBsZXM6CisgICAgIyAgIFdoZW4gcmVsYXRpdmVfcGF0aCBpcyAiX21ldGhvZHMvc2l0ZS9nZW5lcmF0ZS5tZCI6CisgICAgIyAgICAgY2xlYW5lZF9yZWxhdGl2ZV9wYXRoCisgICAgIyAgICAgIyA9PiAiL3NpdGUvZ2VuZXJhdGUiCisgICAgIworICAgICMgUmV0dXJucyB0aGUgY2xlYW5lZCByZWxhdGl2ZSBwYXRoIG9mIHRoZSBkb2N1bWVudC4KKyAgICBkZWYgY2xlYW5lZF9yZWxhdGl2ZV9wYXRoCisgICAgICBAY2xlYW5lZF9yZWxhdGl2ZV9wYXRoIHx8PQorICAgICAgICByZWxhdGl2ZV9wYXRoWzAuLi1leHRuYW1lLmxlbmd0aCAtIDFdLnN1Yihjb2xsZWN0aW9uLnJlbGF0aXZlX2RpcmVjdG9yeSwgIiIpCisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBhIFlBTUwgZmlsZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIGV4dG5hbWUgaXMgZWl0aGVyIC55bWwgb3IgLnlhbWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBkZWYgeWFtbF9maWxlPworICAgICAgJXcoLnlhbWwgLnltbCkuaW5jbHVkZT8oZXh0bmFtZSkKKyAgICBlbmQKKworICAgICMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGFuIGFzc2V0IGZpbGUuCisgICAgIyBBc3NldCBmaWxlcyBpbmNsdWRlIENvZmZlZVNjcmlwdCBmaWxlcyBhbmQgU2Fzcy9TQ1NTIGZpbGVzLgorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXh0bmFtZSBiZWxvbmdzIHRvIHRoZSBzZXQgb2YgZXh0ZW5zaW9ucworICAgICMgICB0aGF0IGFzc2V0IGZpbGVzIHVzZS4KKyAgICBkZWYgYXNzZXRfZmlsZT8KKyAgICAgIHNhc3NfZmlsZT8gfHwgY29mZmVlc2NyaXB0X2ZpbGU/CisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBhIFNhc3MgZmlsZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRydWUgaWYgZXh0bmFtZSA9PSAuc2FzcyBvciAuc2NzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGRlZiBzYXNzX2ZpbGU/CisgICAgICAldyguc2FzcyAuc2NzcykuaW5jbHVkZT8oZXh0bmFtZSkKKyAgICBlbmQKKworICAgICMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgQ29mZmVlU2NyaXB0IGZpbGUuCisgICAgIworICAgICMgUmV0dXJucyB0cnVlIGlmIGV4dG5hbWUgPT0gLmNvZmZlZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGRlZiBjb2ZmZWVzY3JpcHRfZmlsZT8KKyAgICAgIGV4dG5hbWUgPT0gIi5jb2ZmZWUiCisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSByZW5kZXJlZCB3aXRoIExpcXVpZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBkb2N1bWVudCBpcyBlaXRoZXIgYW4gYXNzZXQgZmlsZSBvciBhIHlhbWwgZmlsZSwKKyAgICAjICAgdHJ1ZSBvdGhlcndpc2UuCisgICAgZGVmIHJlbmRlcl93aXRoX2xpcXVpZD8KKyAgICAgICEoY29mZmVlc2NyaXB0X2ZpbGU/IHx8IHlhbWxfZmlsZT8pCisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSByZW5kZXJlZCB3aXRoIGEgbGF5b3V0LgorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgRnJvbnQgTWF0dGVyIHNwZWNpZmllcyB0aGF0IGBsYXlvdXRgIGlzIHNldCB0byBgbm9uZWAuCisgICAgZGVmIG5vX2xheW91dD8KKyAgICAgIGRhdGFbImxheW91dCJdID09ICJub25lIgorICAgIGVuZAorCisgICAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgcGxhY2VkIGludG8gbGF5b3V0cy4KKyAgICAjCisgICAgIyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBkb2N1bWVudCBpcyBzZXQgdG8gYGxheW91dHM6IG5vbmVgLCBvciBpcyBlaXRoZXIgYW4KKyAgICAjICAgYXNzZXQgZmlsZSBvciBhIHlhbWwgZmlsZS4gUmV0dXJucyB0cnVlIG90aGVyd2lzZS4KKyAgICBkZWYgcGxhY2VfaW5fbGF5b3V0PworICAgICAgIShhc3NldF9maWxlPyB8fCB5YW1sX2ZpbGU/IHx8IG5vX2xheW91dD8pCisgICAgZW5kCisKKyAgICAjIFRoZSBVUkwgdGVtcGxhdGUgd2hlcmUgdGhlIGRvY3VtZW50IHdvdWxkIGJlIGFjY2Vzc2libGUuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgVVJMIHRlbXBsYXRlIGZvciB0aGUgZG9jdW1lbnQuCisgICAgZGVmIHVybF90ZW1wbGF0ZQorICAgICAgY29sbGVjdGlvbi51cmxfdGVtcGxhdGUKKyAgICBlbmQKKworICAgICMgQ29uc3RydWN0IGEgSGFzaCBvZiBrZXktdmFsdWUgcGFpcnMgd2hpY2ggY29udGFpbiBhIG1hcHBpbmcgYmV0d2VlbgorICAgICMgICBhIGtleSBpbiB0aGUgVVJMIHRlbXBsYXRlIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgdGhpcyBkb2N1bWVudC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBIYXNoIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgcmVwbGFjZW1lbnQgaW4gdGhlIFVSTC4KKyAgICBkZWYgdXJsX3BsYWNlaG9sZGVycworICAgICAgQHVybF9wbGFjZWhvbGRlcnMgfHw9IERyb3BzOjpVcmxEcm9wLm5ldyhzZWxmKQorICAgIGVuZAorCisgICAgIyBUaGUgcGVybWFsaW5rIGZvciB0aGlzIERvY3VtZW50LgorICAgICMgUGVybWFsaW5rIGlzIHNldCB2aWEgdGhlIGRhdGEgSGFzaC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBwZXJtYWxpbmsgb3IgbmlsIGlmIG5vIHBlcm1hbGluayB3YXMgc2V0IGluIHRoZSBkYXRhLgorICAgIGRlZiBwZXJtYWxpbmsKKyAgICAgIGRhdGEgJiYgZGF0YS5pc19hPyhIYXNoKSAmJiBkYXRhWyJwZXJtYWxpbmsiXQorICAgIGVuZAorCisgICAgIyBUaGUgY29tcHV0ZWQgVVJMIGZvciB0aGUgZG9jdW1lbnQuIFNlZSBgSmVreWxsOjpVUkwjdG9fc2AgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBjb21wdXRlZCBVUkwgZm9yIHRoZSBkb2N1bWVudC4KKyAgICBkZWYgdXJsCisgICAgICBAdXJsIHx8PSBVUkwubmV3KHsKKyAgICAgICAgOnRlbXBsYXRlICAgICA9PiB1cmxfdGVtcGxhdGUsCisgICAgICAgIDpwbGFjZWhvbGRlcnMgPT4gdXJsX3BsYWNlaG9sZGVycywKKyAgICAgICAgOnBlcm1hbGluayAgICA9PiBwZXJtYWxpbmssCisgICAgICB9KS50b19zCisgICAgZW5kCisKKyAgICBkZWYgW10oa2V5KQorICAgICAgZGF0YVtrZXldCisgICAgZW5kCisKKyAgICAjIFRoZSBmdWxsIHBhdGggdG8gdGhlIG91dHB1dCBmaWxlLgorICAgICMKKyAgICAjIGJhc2VfZGlyZWN0b3J5IC0gdGhlIGJhc2UgcGF0aCBvZiB0aGUgb3V0cHV0IGRpcmVjdG9yeQorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgb3V0cHV0IGZpbGUgb2YgdGhpcyBkb2N1bWVudC4KKyAgICBkZWYgZGVzdGluYXRpb24oYmFzZV9kaXJlY3RvcnkpCisgICAgICBkZXN0ID0gc2l0ZS5pbl9kZXN0X2RpcihiYXNlX2RpcmVjdG9yeSkKKyAgICAgIHBhdGggPSBzaXRlLmluX2Rlc3RfZGlyKGRlc3QsIFVSTC51bmVzY2FwZV9wYXRoKHVybCkpCisgICAgICBpZiB1cmwuZW5kX3dpdGg/ICIvIgorICAgICAgICBwYXRoID0gRmlsZS5qb2luKHBhdGgsICJpbmRleC5odG1sIikKKyAgICAgIGVsc2UKKyAgICAgICAgcGF0aCA8PCBvdXRwdXRfZXh0IHVubGVzcyBwYXRoLmVuZF93aXRoPyBvdXRwdXRfZXh0CisgICAgICBlbmQKKyAgICAgIHBhdGgKKyAgICBlbmQKKworICAgICMgV3JpdGUgdGhlIGdlbmVyYXRlZCBEb2N1bWVudCBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgIworICAgICMgZGVzdCAtIFRoZSBTdHJpbmcgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZGlyLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgd3JpdGUoZGVzdCkKKyAgICAgIHBhdGggPSBkZXN0aW5hdGlvbihkZXN0KQorICAgICAgRmlsZVV0aWxzLm1rZGlyX3AoRmlsZS5kaXJuYW1lKHBhdGgpKQorICAgICAgRmlsZS53cml0ZShwYXRoLCBvdXRwdXQsIDptb2RlID0+ICJ3YiIpCisKKyAgICAgIHRyaWdnZXJfaG9va3MoOnBvc3Rfd3JpdGUpCisgICAgZW5kCisKKyAgICAjIFdoZXRoZXIgdGhlIGZpbGUgaXMgcHVibGlzaGVkIG9yIG5vdCwgYXMgaW5kaWNhdGVkIGluIFlBTUwgZnJvbnQtbWF0dGVyCisgICAgIworICAgICMgUmV0dXJucyAnZmFsc2UnIGlmIHRoZSAncHVibGlzaGVkJyBrZXkgaXMgc3BlY2lmaWVkIGluIHRoZQorICAgICMgWUFNTCBmcm9udC1tYXR0ZXIgYW5kIGlzICdmYWxzZScuIE90aGVyd2lzZSByZXR1cm5zICd0cnVlJy4KKyAgICBkZWYgcHVibGlzaGVkPworICAgICAgIShkYXRhLmtleT8oInB1Ymxpc2hlZCIpICYmIGRhdGFbInB1Ymxpc2hlZCJdID09IGZhbHNlKQorICAgIGVuZAorCisgICAgIyBSZWFkIGluIHRoZSBmaWxlIGFuZCBhc3NpZ24gdGhlIGNvbnRlbnQgYW5kIGRhdGEgYmFzZWQgb24gdGhlIGZpbGUgY29udGVudHMuCisgICAgIyBNZXJnZSB0aGUgZnJvbnRtYXR0ZXIgb2YgdGhlIGZpbGUgd2l0aCB0aGUgZnJvbnRtYXR0ZXIgZGVmYXVsdAorICAgICMgdmFsdWVzCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiByZWFkKG9wdHMgPSB7fSkKKyAgICAgIEpla3lsbC5sb2dnZXIuZGVidWcgIlJlYWRpbmc6IiwgcmVsYXRpdmVfcGF0aAorCisgICAgICBpZiB5YW1sX2ZpbGU/CisgICAgICAgIEBkYXRhID0gU2FmZVlBTUwubG9hZF9maWxlKHBhdGgpCisgICAgICBlbHNlCisgICAgICAgIGJlZ2luCisgICAgICAgICAgbWVyZ2VfZGVmYXVsdHMKKyAgICAgICAgICByZWFkX2NvbnRlbnQob3B0cykKKyAgICAgICAgICByZWFkX3Bvc3RfZGF0YQorICAgICAgICByZXNjdWUgPT4gZQorICAgICAgICAgIGhhbmRsZV9yZWFkX2Vycm9yKGUpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIENyZWF0ZSBhIExpcXVpZC11bmRlcnN0YW5kYWJsZSB2ZXJzaW9uIG9mIHRoaXMgRG9jdW1lbnQuCisgICAgIworICAgICMgUmV0dXJucyBhIEhhc2ggcmVwcmVzZW50aW5nIHRoaXMgRG9jdW1lbnQncyBkYXRhLgorICAgIGRlZiB0b19saXF1aWQKKyAgICAgIEB0b19saXF1aWQgfHw9IERyb3BzOjpEb2N1bWVudERyb3AubmV3KHNlbGYpCisgICAgZW5kCisKKyAgICAjIFRoZSBpbnNwZWN0IHN0cmluZyBmb3IgdGhpcyBkb2N1bWVudC4KKyAgICAjIEluY2x1ZGVzIHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgY29sbGVjdGlvbiBsYWJlbC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBpbnNwZWN0IHN0cmluZyBmb3IgdGhpcyBkb2N1bWVudC4KKyAgICBkZWYgaW5zcGVjdAorICAgICAgIiM8SmVreWxsOjpEb2N1bWVudCAje3JlbGF0aXZlX3BhdGh9IGNvbGxlY3Rpb249I3tjb2xsZWN0aW9uLmxhYmVsfT4iCisgICAgZW5kCisKKyAgICAjIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMgZG9jdW1lbnQuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnQKKyAgICBkZWYgdG9fcworICAgICAgb3V0cHV0IHx8IGNvbnRlbnQgfHwgIk5PIENPTlRFTlQiCisgICAgZW5kCisKKyAgICAjIENvbXBhcmUgdGhpcyBkb2N1bWVudCBhZ2FpbnN0IGFub3RoZXIgZG9jdW1lbnQuCisgICAgIyBDb21wYXJpc29uIGlzIGEgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSAyIHBhdGhzIG9mIHRoZSBkb2N1bWVudHMuCisgICAgIworICAgICMgUmV0dXJucyAtMSwgMCwgKzEgb3IgbmlsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgZG9jJ3MgcGF0aCBpcyBsZXNzIHRoYW4sCisgICAgIyAgIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIgZG9jJ3MgcGF0aC4gU2VlIFN0cmluZyM8PT4gZm9yIG1vcmUgZGV0YWlscy4KKyAgICBkZWYgPD0+KG90aGVyKQorICAgICAgcmV0dXJuIG5pbCB1bmxlc3Mgb3RoZXIucmVzcG9uZF90bz8oOmRhdGEpCisgICAgICBjbXAgPSBkYXRhWyJkYXRlIl0gPD0+IG90aGVyLmRhdGFbImRhdGUiXQorICAgICAgY21wID0gcGF0aCA8PT4gb3RoZXIucGF0aCBpZiBjbXAubmlsPyB8fCBjbXAuemVybz8KKyAgICAgIGNtcAorICAgIGVuZAorCisgICAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGRvY3VtZW50IHNob3VsZCBiZSB3cml0dGVuLgorICAgICMgQmFzZWQgb24gdGhlIENvbGxlY3Rpb24gdG8gd2hpY2ggaXQgYmVsb25ncy4KKyAgICAjCisgICAgIyBUcnVlIGlmIHRoZSBkb2N1bWVudCBoYXMgYSBjb2xsZWN0aW9uIGFuZCBpZiB0aGF0IGNvbGxlY3Rpb24ncyAjd3JpdGU/CisgICAgIyAgIG1ldGhvZCByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBmYWxzZS4KKyAgICBkZWYgd3JpdGU/CisgICAgICBjb2xsZWN0aW9uICYmIGNvbGxlY3Rpb24ud3JpdGU/CisgICAgZW5kCisKKyAgICAjIFRoZSBEb2N1bWVudCBleGNlcnB0X3NlcGFyYXRvciwgZnJvbSB0aGUgWUFNTCBGcm9udC1NYXR0ZXIgb3Igc2l0ZQorICAgICMgZGVmYXVsdCBleGNlcnB0X3NlcGFyYXRvciB2YWx1ZQorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGRvY3VtZW50IGV4Y2VycHRfc2VwYXJhdG9yCisgICAgZGVmIGV4Y2VycHRfc2VwYXJhdG9yCisgICAgICAoZGF0YVsiZXhjZXJwdF9zZXBhcmF0b3IiXSB8fCBzaXRlLmNvbmZpZ1siZXhjZXJwdF9zZXBhcmF0b3IiXSkudG9fcworICAgIGVuZAorCisgICAgIyBXaGV0aGVyIHRvIGdlbmVyYXRlIGFuIGV4Y2VycHQKKyAgICAjCisgICAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIGV4Y2VycHQgc2VwYXJhdG9yIGlzIGNvbmZpZ3VyZWQuCisgICAgZGVmIGdlbmVyYXRlX2V4Y2VycHQ/CisgICAgICAhZXhjZXJwdF9zZXBhcmF0b3IuZW1wdHk/CisgICAgZW5kCisKKyAgICBkZWYgbmV4dF9kb2MKKyAgICAgIHBvcyA9IGNvbGxlY3Rpb24uZG9jcy5pbmRleCB7IHxwb3N0fCBwb3N0LmVxdWFsPyhzZWxmKSB9CisgICAgICBpZiBwb3MgJiYgcG9zIDwgY29sbGVjdGlvbi5kb2NzLmxlbmd0aCAtIDEKKyAgICAgICAgY29sbGVjdGlvbi5kb2NzW3BvcyArIDFdCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBwcmV2aW91c19kb2MKKyAgICAgIHBvcyA9IGNvbGxlY3Rpb24uZG9jcy5pbmRleCB7IHxwb3N0fCBwb3N0LmVxdWFsPyhzZWxmKSB9CisgICAgICBpZiBwb3MgJiYgcG9zID4gMAorICAgICAgICBjb2xsZWN0aW9uLmRvY3NbcG9zIC0gMV0KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHRyaWdnZXJfaG9va3MoaG9va19uYW1lLCAqYXJncykKKyAgICAgIEpla3lsbDo6SG9va3MudHJpZ2dlciBjb2xsZWN0aW9uLmxhYmVsLnRvX3N5bSwgaG9va19uYW1lLCBzZWxmLCAqYXJncyBpZiBjb2xsZWN0aW9uCisgICAgICBKZWt5bGw6Okhvb2tzLnRyaWdnZXIgOmRvY3VtZW50cywgaG9va19uYW1lLCBzZWxmLCAqYXJncworICAgIGVuZAorCisgICAgZGVmIGlkCisgICAgICBAaWQgfHw9IEZpbGUuam9pbihGaWxlLmRpcm5hbWUodXJsKSwgKGRhdGFbInNsdWciXSB8fCBiYXNlbmFtZV93aXRob3V0X2V4dCkudG9fcykKKyAgICBlbmQKKworICAgICMgQ2FsY3VsYXRlIHJlbGF0ZWQgcG9zdHMuCisgICAgIworICAgICMgUmV0dXJucyBhbiBBcnJheSBvZiByZWxhdGVkIFBvc3RzLgorICAgIGRlZiByZWxhdGVkX3Bvc3RzCisgICAgICBKZWt5bGw6OlJlbGF0ZWRQb3N0cy5uZXcoc2VsZikuYnVpbGQKKyAgICBlbmQKKworICAgICMgT3ZlcnJpZGUgb2Ygbm9ybWFsIHJlc3BvbmRfdG8/IHRvIG1hdGNoIG1ldGhvZF9taXNzaW5nJ3MgbG9naWMgZm9yCisgICAgIyBsb29raW5nIGluIEBkYXRhLgorICAgIGRlZiByZXNwb25kX3RvPyhtZXRob2QsIGluY2x1ZGVfcHJpdmF0ZSA9IGZhbHNlKQorICAgICAgZGF0YS5rZXk/KG1ldGhvZC50b19zKSB8fCBzdXBlcgorICAgIGVuZAorCisgICAgIyBPdmVycmlkZSBvZiBtZXRob2RfbWlzc2luZyB0byBjaGVjayBpbiBAZGF0YSBmb3IgdGhlIGtleS4KKyAgICBkZWYgbWV0aG9kX21pc3NpbmcobWV0aG9kLCAqYXJncywgJmJsY2spCisgICAgICBpZiBkYXRhLmtleT8obWV0aG9kLnRvX3MpCisgICAgICAgIEpla3lsbDo6RGVwcmVjYXRvci5kZXByZWNhdGlvbl9tZXNzYWdlICJEb2N1bWVudCMje21ldGhvZH0gaXMgbm93IGEga2V5ICJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gdGhlICNkYXRhIGhhc2guIgorICAgICAgICBKZWt5bGw6OkRlcHJlY2F0b3IuZGVwcmVjYXRpb25fbWVzc2FnZSAiQ2FsbGVkIGJ5ICN7Y2FsbGVyKDAuLjApfS4iCisgICAgICAgIGRhdGFbbWV0aG9kLnRvX3NdCisgICAgICBlbHNlCisgICAgICAgIHN1cGVyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiByZXNwb25kX3RvX21pc3Npbmc/KG1ldGhvZCwgKikKKyAgICAgIGRhdGEua2V5PyhtZXRob2QudG9fcykgfHwgc3VwZXIKKyAgICBlbmQKKworICAgICMgQWRkIHN1cGVyZGlyZWN0b3JpZXMgb2YgdGhlIHNwZWNpYWxfZGlyIHRvIGNhdGVnb3JpZXMuCisgICAgIyBJbiB0aGUgY2FzZSBvZiBlcy9fcG9zdHMsICdlcycgaXMgYWRkZWQgYXMgYSBjYXRlZ29yeS4KKyAgICAjIEluIHRoZSBjYXNlIG9mIF9wb3N0cy9lcywgJ2VzJyBpcyBOT1QgYWRkZWQgYXMgYSBjYXRlZ29yeS4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIGNhdGVnb3JpZXNfZnJvbV9wYXRoKHNwZWNpYWxfZGlyKQorICAgICAgc3VwZXJkaXJzID0gcmVsYXRpdmVfcGF0aC5zdWIoJXIhI3tzcGVjaWFsX2Rpcn0oLiopISwgIiIpCisgICAgICAgIC5zcGxpdChGaWxlOjpTRVBBUkFUT1IpCisgICAgICAgIC5yZWplY3QgZG8gfGN8CisgICAgICAgIGMuZW1wdHk/IHx8IGMgPT0gc3BlY2lhbF9kaXIgfHwgYyA9PSBiYXNlbmFtZQorICAgICAgZW5kCisgICAgICBtZXJnZV9kYXRhISh7ICJjYXRlZ29yaWVzIiA9PiBzdXBlcmRpcnMgfSwgOnNvdXJjZSA9PiAiZmlsZSBwYXRoIikKKyAgICBlbmQKKworICAgIGRlZiBwb3B1bGF0ZV9jYXRlZ29yaWVzCisgICAgICBtZXJnZV9kYXRhISh7CisgICAgICAgICJjYXRlZ29yaWVzIiA9PiAoCisgICAgICAgIEFycmF5KGRhdGFbImNhdGVnb3JpZXMiXSkgKyBVdGlscy5wbHVyYWxpemVkX2FycmF5X2Zyb21faGFzaCgKKyAgICAgICAgICBkYXRhLAorICAgICAgICAgICJjYXRlZ29yeSIsCisgICAgICAgICAgImNhdGVnb3JpZXMiCisgICAgICAgICkKKyAgICAgICAgKS5tYXAoJjp0b19zKS5mbGF0dGVuLnVuaXEsCisgICAgICB9KQorICAgIGVuZAorCisgICAgZGVmIHBvcHVsYXRlX3RhZ3MKKyAgICAgIG1lcmdlX2RhdGEhKHsKKyAgICAgICAgInRhZ3MiID0+IFV0aWxzLnBsdXJhbGl6ZWRfYXJyYXlfZnJvbV9oYXNoKGRhdGEsICJ0YWciLCAidGFncyIpLmZsYXR0ZW4sCisgICAgICB9KQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiBtZXJnZV9jYXRlZ29yaWVzIShvdGhlcikKKyAgICAgIGlmIG90aGVyLmtleT8oImNhdGVnb3JpZXMiKSAmJiAhb3RoZXJbImNhdGVnb3JpZXMiXS5uaWw/CisgICAgICAgIGlmIG90aGVyWyJjYXRlZ29yaWVzIl0uaXNfYT8oU3RyaW5nKQorICAgICAgICAgIG90aGVyWyJjYXRlZ29yaWVzIl0gPSBvdGhlclsiY2F0ZWdvcmllcyJdLnNwbGl0KCVyIVxzKyEpLm1hcCgmOnN0cmlwKQorICAgICAgICBlbmQKKyAgICAgICAgb3RoZXJbImNhdGVnb3JpZXMiXSA9IChkYXRhWyJjYXRlZ29yaWVzIl0gfHwgW10pIHwgb3RoZXJbImNhdGVnb3JpZXMiXQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIG1lcmdlX2RhdGUhKHNvdXJjZSkKKyAgICAgIGlmIGRhdGEua2V5PygiZGF0ZSIpICYmICFkYXRhWyJkYXRlIl0uaXNfYT8oVGltZSkKKyAgICAgICAgZGF0YVsiZGF0ZSJdID0gVXRpbHMucGFyc2VfZGF0ZSgKKyAgICAgICAgICBkYXRhWyJkYXRlIl0udG9fcywKKyAgICAgICAgICAiRG9jdW1lbnQgJyN7cmVsYXRpdmVfcGF0aH0nIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBkYXRlIGluIHRoZSAje3NvdXJjZX0uIgorICAgICAgICApCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgbWVyZ2VfZGVmYXVsdHMKKyAgICAgIGRlZmF1bHRzID0gQHNpdGUuZnJvbnRtYXR0ZXJfZGVmYXVsdHMuYWxsKAorICAgICAgICByZWxhdGl2ZV9wYXRoLAorICAgICAgICBjb2xsZWN0aW9uLmxhYmVsLnRvX3N5bQorICAgICAgKQorICAgICAgbWVyZ2VfZGF0YSEoZGVmYXVsdHMsIDpzb3VyY2UgPT4gImZyb250IG1hdHRlciBkZWZhdWx0cyIpIHVubGVzcyBkZWZhdWx0cy5lbXB0eT8KKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgcmVhZF9jb250ZW50KG9wdHMpCisgICAgICBzZWxmLmNvbnRlbnQgPSBGaWxlLnJlYWQocGF0aCwgVXRpbHMubWVyZ2VkX2ZpbGVfcmVhZF9vcHRzKHNpdGUsIG9wdHMpKQorICAgICAgaWYgY29udGVudCA9fiBZQU1MX0ZST05UX01BVFRFUl9SRUdFWFAKKyAgICAgICAgc2VsZi5jb250ZW50ID0gJFBPU1RNQVRDSAorICAgICAgICBkYXRhX2ZpbGUgPSBTYWZlWUFNTC5sb2FkKFJlZ2V4cC5sYXN0X21hdGNoKDEpKQorICAgICAgICBtZXJnZV9kYXRhIShkYXRhX2ZpbGUsIDpzb3VyY2UgPT4gIllBTUwgZnJvbnQgbWF0dGVyIikgaWYgZGF0YV9maWxlCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgcmVhZF9wb3N0X2RhdGEKKyAgICAgIHBvcHVsYXRlX3RpdGxlCisgICAgICBwb3B1bGF0ZV9jYXRlZ29yaWVzCisgICAgICBwb3B1bGF0ZV90YWdzCisgICAgICBnZW5lcmF0ZV9leGNlcnB0CisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIGhhbmRsZV9yZWFkX2Vycm9yKGVycm9yKQorICAgICAgaWYgZXJyb3IuaXNfYT8gU3ludGF4RXJyb3IKKyAgICAgICAgSmVreWxsLmxvZ2dlci5lcnJvciAiRXJyb3I6IiwgIllBTUwgRXhjZXB0aW9uIHJlYWRpbmcgI3twYXRofTogI3tlcnJvci5tZXNzYWdlfSIKKyAgICAgIGVsc2UKKyAgICAgICAgSmVreWxsLmxvZ2dlci5lcnJvciAiRXJyb3I6IiwgImNvdWxkIG5vdCByZWFkIGZpbGUgI3twYXRofTogI3tlcnJvci5tZXNzYWdlfSIKKyAgICAgIGVuZAorCisgICAgICBpZiBzaXRlLmNvbmZpZ1sic3RyaWN0X2Zyb250X21hdHRlciJdIHx8IGVycm9yLmlzX2E/KEpla3lsbDo6RXJyb3JzOjpGYXRhbEV4Y2VwdGlvbikKKyAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiBwb3B1bGF0ZV90aXRsZQorICAgICAgaWYgcmVsYXRpdmVfcGF0aCA9fiBEQVRFX0ZJTEVOQU1FX01BVENIRVIKKyAgICAgICAgZGF0ZSwgc2x1ZywgZXh0ID0gUmVnZXhwLmxhc3RfbWF0Y2guY2FwdHVyZXMKKyAgICAgICAgbW9kaWZ5X2RhdGUoZGF0ZSkKKyAgICAgIGVsc2lmIHJlbGF0aXZlX3BhdGggPX4gREFURUxFU1NfRklMRU5BTUVfTUFUQ0hFUgorICAgICAgICBzbHVnLCBleHQgPSBSZWdleHAubGFzdF9tYXRjaC5jYXB0dXJlcworICAgICAgZW5kCisKKyAgICAgICMgVHJ5IHRvIGVuc3VyZSB0aGUgdXNlciBnZXRzIGEgdGl0bGUuCisgICAgICBkYXRhWyJ0aXRsZSJdIHx8PSBVdGlscy50aXRsZWl6ZV9zbHVnKHNsdWcpCisgICAgICAjIE9ubHkgb3ZlcndyaXRlIHNsdWcgJiBleHQgaWYgdGhleSBhcmVuJ3Qgc3BlY2lmaWVkLgorICAgICAgZGF0YVsic2x1ZyJdICB8fD0gc2x1ZworICAgICAgZGF0YVsiZXh0Il0gICB8fD0gZXh0CisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIG1vZGlmeV9kYXRlKGRhdGUpCisgICAgICBpZiAhZGF0YVsiZGF0ZSJdIHx8IGRhdGFbImRhdGUiXS50b19pID09IHNpdGUudGltZS50b19pCisgICAgICAgIG1lcmdlX2RhdGEhKHsgImRhdGUiID0+IGRhdGUgfSwgOnNvdXJjZSA9PiAiZmlsZW5hbWUiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIGdlbmVyYXRlX2V4Y2VycHQKKyAgICAgIGlmIGdlbmVyYXRlX2V4Y2VycHQ/CisgICAgICAgIGRhdGFbImV4Y2VycHQiXSB8fD0gSmVreWxsOjpFeGNlcnB0Lm5ldyhzZWxmKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9jb2xsZWN0aW9uX2Ryb3AucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9jb2xsZWN0aW9uX2Ryb3AucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1MDI1YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Ryb3BzL2NvbGxlY3Rpb25fZHJvcC5yYgpAQCAtMCwwICsxLDIyIEBACisjIGVuY29kaW5nOiBVVEYtOAorCittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBEcm9wcworICAgIGNsYXNzIENvbGxlY3Rpb25Ecm9wIDwgRHJvcAorICAgICAgZXh0ZW5kIEZvcndhcmRhYmxlCisKKyAgICAgIG11dGFibGUgZmFsc2UKKworICAgICAgZGVmX2RlbGVnYXRvciA6QG9iaiwgOndyaXRlPywgOm91dHB1dAorICAgICAgZGVmX2RlbGVnYXRvcnMgOkBvYmosIDpsYWJlbCwgOmRvY3MsIDpmaWxlcywgOmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVsYXRpdmVfZGlyZWN0b3J5CisKKyAgICAgIGRlZiB0b19zCisgICAgICAgIGRvY3MudG9fcworICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKyAgICAgIGRlZl9kZWxlZ2F0b3IgOkBvYmosIDptZXRhZGF0YSwgOmZhbGxiYWNrX2RhdGEKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Ryb3BzL2RvY3VtZW50X2Ryb3AucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9kb2N1bWVudF9kcm9wLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODUxODIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9kb2N1bWVudF9kcm9wLnJiCkBAIC0wLDAgKzEsNjkgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIERyb3BzCisgICAgY2xhc3MgRG9jdW1lbnREcm9wIDwgRHJvcAorICAgICAgZXh0ZW5kIEZvcndhcmRhYmxlCisKKyAgICAgIE5FU1RFRF9PQkpFQ1RfRklFTERfQkxBQ0tMSVNUID0gJXcoCisgICAgICAgIGNvbnRlbnQgb3V0cHV0IGV4Y2VycHQgbmV4dCBwcmV2aW91cworICAgICAgKS5mcmVlemUKKworICAgICAgbXV0YWJsZSBmYWxzZQorCisgICAgICBkZWZfZGVsZWdhdG9yIDpAb2JqLCA6cmVsYXRpdmVfcGF0aCwgOnBhdGgKKyAgICAgIGRlZl9kZWxlZ2F0b3JzIDpAb2JqLCA6aWQsIDpvdXRwdXQsIDpjb250ZW50LCA6dG9fcywgOnJlbGF0aXZlX3BhdGgsIDp1cmwKKworICAgICAgZGVmIGNvbGxlY3Rpb24KKyAgICAgICAgQG9iai5jb2xsZWN0aW9uLmxhYmVsCisgICAgICBlbmQKKworICAgICAgZGVmIGV4Y2VycHQKKyAgICAgICAgZmFsbGJhY2tfZGF0YVsiZXhjZXJwdCJdLnRvX3MKKyAgICAgIGVuZAorCisgICAgICBkZWYgPD0+KG90aGVyKQorICAgICAgICByZXR1cm4gbmlsIHVubGVzcyBvdGhlci5pc19hPyBEb2N1bWVudERyb3AKKyAgICAgICAgY21wID0gc2VsZlsiZGF0ZSJdIDw9PiBvdGhlclsiZGF0ZSJdCisgICAgICAgIGNtcCA9IHNlbGZbInBhdGgiXSA8PT4gb3RoZXJbInBhdGgiXSBpZiBjbXAubmlsPyB8fCBjbXAuemVybz8KKyAgICAgICAgY21wCisgICAgICBlbmQKKworICAgICAgZGVmIHByZXZpb3VzCisgICAgICAgIEBvYmoucHJldmlvdXNfZG9jLnRvX2xpcXVpZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBuZXh0CisgICAgICAgIEBvYmoubmV4dF9kb2MudG9fbGlxdWlkCisgICAgICBlbmQKKworICAgICAgIyBHZW5lcmF0ZSBhIEhhc2ggZm9yIHVzZSBpbiBnZW5lcmF0aW5nIEpTT04uCisgICAgICAjIFRoaXMgaXMgdXNlZnVsIGlmIGZpZWxkcyBuZWVkIHRvIGJlIGNsZWFyZWQgYmVmb3JlIHRoZSBKU09OIGNhbiBnZW5lcmF0ZS4KKyAgICAgICMKKyAgICAgICMgc3RhdGUgLSB0aGUgSlNPTjo6U3RhdGUgb2JqZWN0IHdoaWNoIGRldGVybWluZXMgdGhlIHN0YXRlIG9mIGN1cnJlbnQgcHJvY2Vzc2luZy4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIEhhc2ggcmVhZHkgZm9yIEpTT04gZ2VuZXJhdGlvbi4KKyAgICAgIGRlZiBoYXNoX2Zvcl9qc29uKHN0YXRlID0gbmlsKQorICAgICAgICB0b19oLnRhcCBkbyB8aGFzaHwKKyAgICAgICAgICBpZiBzdGF0ZSAmJiBzdGF0ZS5kZXB0aCA+PSAyCisgICAgICAgICAgICBoYXNoWyJwcmV2aW91cyJdID0gY29sbGFwc2VfZG9jdW1lbnQoaGFzaFsicHJldmlvdXMiXSkgaWYgaGFzaFsicHJldmlvdXMiXQorICAgICAgICAgICAgaGFzaFsibmV4dCJdICAgICA9IGNvbGxhcHNlX2RvY3VtZW50KGhhc2hbIm5leHQiXSkgaWYgaGFzaFsibmV4dCJdCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgR2VuZXJhdGUgYSBIYXNoIHdoaWNoIGJyZWFrcyB0aGUgcmVjdXJzaXZlIGNoYWluLgorICAgICAgIyBDZXJ0YWluIGZpZWxkcyB3aGljaCBhcmUgbm9ybWFsbHkgYXZhaWxhYmxlIGFyZSBvbWl0dGVkLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgSGFzaCB3aXRoIG9ubHkgbm9uLXJlY3Vyc2l2ZSBmaWVsZHMgcHJlc2VudC4KKyAgICAgIGRlZiBjb2xsYXBzZV9kb2N1bWVudChkb2MpCisgICAgICAgIGRvYy5rZXlzLmVhY2hfd2l0aF9vYmplY3Qoe30pIGRvIHwoa2V5LCBfKSwgcmVzdWx0fAorICAgICAgICAgIHJlc3VsdFtrZXldID0gZG9jW2tleV0gdW5sZXNzIE5FU1RFRF9PQkpFQ1RfRklFTERfQkxBQ0tMSVNULmluY2x1ZGU/KGtleSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorICAgICAgZGVmX2RlbGVnYXRvciA6QG9iaiwgOmRhdGEsIDpmYWxsYmFja19kYXRhCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9kcm9wLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZHJvcHMvZHJvcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQ1YzNjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZHJvcHMvZHJvcC5yYgpAQCAtMCwwICsxLDIxNSBAQAorIyBlbmNvZGluZzogVVRGLTgKKworbW9kdWxlIEpla3lsbAorICBtb2R1bGUgRHJvcHMKKyAgICBjbGFzcyBEcm9wIDwgTGlxdWlkOjpEcm9wCisgICAgICBpbmNsdWRlIEVudW1lcmFibGUKKworICAgICAgTk9OX0NPTlRFTlRfTUVUSE9EUyA9IFs6ZmFsbGJhY2tfZGF0YSwgOmNvbGxhcHNlX2RvY3VtZW50XS5mcmVlemUKKworICAgICAgIyBHZXQgb3Igc2V0IHdoZXRoZXIgdGhlIGRyb3AgY2xhc3MgaXMgbXV0YWJsZS4KKyAgICAgICMgTXV0YWJpbGl0eSBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHByZS1kZWZpbmVkIGZpZWxkcyBtYXkgYmUKKyAgICAgICMgb3ZlcndyaXR0ZW4uCisgICAgICAjCisgICAgICAjIGlzX211dGFibGUgLSBCb29sZWFuIHNldCBtdXRhYmlsaXR5IG9mIHRoZSBjbGFzcyAoZGVmYXVsdDogbmlsKQorICAgICAgIworICAgICAgIyBSZXR1cm5zIHRoZSBtdXRhYmlsaXR5IG9mIHRoZSBjbGFzcworICAgICAgZGVmIHNlbGYubXV0YWJsZShpc19tdXRhYmxlID0gbmlsKQorICAgICAgICBAaXNfbXV0YWJsZSA9IGlmIGlzX211dGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX211dGFibGUKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLm11dGFibGU/CisgICAgICAgIEBpc19tdXRhYmxlCisgICAgICBlbmQKKworICAgICAgIyBDcmVhdGUgYSBuZXcgRHJvcAorICAgICAgIworICAgICAgIyBvYmogLSB0aGUgSmVreWxsIFNpdGUsIENvbGxlY3Rpb24sIG9yIERvY3VtZW50IHJlcXVpcmVkIGJ5IHRoZQorICAgICAgIyBkcm9wLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICAgIGRlZiBpbml0aWFsaXplKG9iaikKKyAgICAgICAgQG9iaiA9IG9iagorICAgICAgICBAbXV0YXRpb25zID0ge30gIyBvbmx5IGlmIG11dGFibGU6IHRydWUKKyAgICAgIGVuZAorCisgICAgICAjIEFjY2VzcyBhIG1ldGhvZCBpbiB0aGUgRHJvcCBvciBhIGZpZWxkIGluIHRoZSB1bmRlcmx5aW5nIGhhc2ggZGF0YS4KKyAgICAgICMgSWYgbXV0YWJsZSwgY2hlY2tzIHRoZSBtdXRhdGlvbnMgZmlyc3QuIFRoZW4gY2hlY2tzIHRoZSBtZXRob2RzLAorICAgICAgIyBhbmQgZmluYWxseSBjaGVjayB0aGUgdW5kZXJseWluZyBoYXNoIChlLmcuIGRvY3VtZW50IGZyb250IG1hdHRlcikKKyAgICAgICMgaWYgYWxsIHRoZSBwcmV2aW91cyBwbGFjZXMgZGlkbid0IG1hdGNoLgorICAgICAgIworICAgICAgIyBrZXkgLSB0aGUgc3RyaW5nIGtleSB3aG9zZSB2YWx1ZSB0byBmZXRjaAorICAgICAgIworICAgICAgIyBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgb3IgbmlsIGlmIG5vbmUgZXhpc3RzCisgICAgICBkZWYgW10oa2V5KQorICAgICAgICBpZiBzZWxmLmNsYXNzLm11dGFibGU/ICYmIEBtdXRhdGlvbnMua2V5PyhrZXkpCisgICAgICAgICAgQG11dGF0aW9uc1trZXldCisgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuaW52b2thYmxlPyBrZXkKKyAgICAgICAgICBwdWJsaWNfc2VuZCBrZXkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZhbGxiYWNrX2RhdGFba2V5XQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFNldCBhIGZpZWxkIGluIHRoZSBEcm9wLiBJZiBtdXRhYmxlLCBzZXRzIGluIHRoZSBtdXRhdGlvbnMgYW5kCisgICAgICAjIHJldHVybnMuIElmIG5vdCBtdXRhYmxlLCBjaGVja3MgZmlyc3QgaWYgaXQncyB0cnlpbmcgdG8gb3ZlcnJpZGUgYQorICAgICAgIyBEcm9wIG1ldGhvZCBhbmQgcmFpc2VzIGEgRHJvcE11dGF0aW9uRXhjZXB0aW9uIGlmIHNvLiBJZiBub3QKKyAgICAgICMgbXV0YWJsZSBhbmQgdGhlIGtleSBpcyBub3QgYSBtZXRob2Qgb24gdGhlIERyb3AsIHRoZW4gaXQgc2V0cyB0aGUKKyAgICAgICMga2V5IHRvIHRoZSB2YWx1ZSBpbiB0aGUgdW5kZXJseWluZyBoYXNoIChlLmcuIGRvY3VtZW50IGZyb250CisgICAgICAjIG1hdHRlcikKKyAgICAgICMKKyAgICAgICMga2V5IC0gdGhlIFN0cmluZyBrZXkgd2hvc2UgdmFsdWUgdG8gc2V0CisgICAgICAjIHZhbCAtIHRoZSBPYmplY3QgdG8gc2V0IHRoZSBrZXkncyB2YWx1ZSB0bworICAgICAgIworICAgICAgIyBSZXR1cm5zIHRoZSB2YWx1ZSB0aGUga2V5IHdhcyBzZXQgdG8gdW5sZXNzIHRoZSBEcm9wIGlzIG5vdCBtdXRhYmxlCisgICAgICAjIGFuZCB0aGUga2V5IG1hdGNoZXMgYSBtZXRob2QgaW4gd2hpY2ggY2FzZSBpdCByYWlzZXMgYQorICAgICAgIyBEcm9wTXV0YXRpb25FeGNlcHRpb24uCisgICAgICBkZWYgW109KGtleSwgdmFsKQorICAgICAgICBpZiByZXNwb25kX3RvPygiI3trZXl9PSIpCisgICAgICAgICAgcHVibGljX3NlbmQoIiN7a2V5fT0iLCB2YWwpCisgICAgICAgIGVsc2lmIHJlc3BvbmRfdG8/KGtleS50b19zKQorICAgICAgICAgIGlmIHNlbGYuY2xhc3MubXV0YWJsZT8KKyAgICAgICAgICAgIEBtdXRhdGlvbnNba2V5XSA9IHZhbAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhaXNlIEVycm9yczo6RHJvcE11dGF0aW9uRXhjZXB0aW9uLCAiS2V5ICN7a2V5fSBjYW5ub3QgYmUgc2V0IGluIHRoZSBkcm9wLiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZhbGxiYWNrX2RhdGFba2V5XSA9IHZhbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEdlbmVyYXRlcyBhIGxpc3Qgb2Ygc3RyaW5ncyB3aGljaCBjb3JyZXNwb25kIHRvIGNvbnRlbnQgZ2V0dGVyCisgICAgICAjIG1ldGhvZHMuCisgICAgICAjCisgICAgICAjIFJldHVybnMgYW4gQXJyYXkgb2Ygc3RyaW5ncyB3aGljaCByZXByZXNlbnQgbWV0aG9kLXNwZWNpZmljIGtleXMuCisgICAgICBkZWYgY29udGVudF9tZXRob2RzCisgICAgICAgIEBjb250ZW50X21ldGhvZHMgfHw9ICgKKyAgICAgICAgICBzZWxmLmNsYXNzLmluc3RhbmNlX21ldGhvZHMgXAorICAgICAgICAgICAgLSBKZWt5bGw6OkRyb3BzOjpEcm9wLmluc3RhbmNlX21ldGhvZHMgXAorICAgICAgICAgICAgLSBOT05fQ09OVEVOVF9NRVRIT0RTCisgICAgICAgICkubWFwKCY6dG9fcykucmVqZWN0IGRvIHxtZXRob2R8CisgICAgICAgICAgbWV0aG9kLmVuZF93aXRoPygiPSIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgQ2hlY2sgaWYga2V5IGV4aXN0cyBpbiBEcm9wCisgICAgICAjCisgICAgICAjIGtleSAtIHRoZSBzdHJpbmcga2V5IHdob3NlIHZhbHVlIHRvIGZldGNoCisgICAgICAjCisgICAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4ga2V5IGlzIHByZXNlbnQKKyAgICAgIGRlZiBrZXk/KGtleSkKKyAgICAgICAgaWYgc2VsZi5jbGFzcy5tdXRhYmxlCisgICAgICAgICAgQG11dGF0aW9ucy5rZXk/KGtleSkKKyAgICAgICAgZWxzZQorICAgICAgICAgICFrZXkubmlsPyAmJiAocmVzcG9uZF90bz8oa2V5KSB8fCBmYWxsYmFja19kYXRhLmtleT8oa2V5KSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBHZW5lcmF0ZXMgYSBsaXN0IG9mIGtleXMgd2l0aCB1c2VyIGNvbnRlbnQgYXMgdGhlaXIgdmFsdWVzLgorICAgICAgIyBUaGlzIGdhdGhlcnMgdXAgdGhlIERyb3AgbWV0aG9kcyBhbmQga2V5cyBvZiB0aGUgbXV0YXRpb25zIGFuZAorICAgICAgIyB1bmRlcmx5aW5nIGRhdGEgaGFzaGVzIGFuZCBwZXJmb3JtcyBhIHNldCB1bmlvbiB0byBlbnN1cmUgYSBsaXN0CisgICAgICAjIG9mIHVuaXF1ZSBrZXlzIGZvciB0aGUgRHJvcC4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhbiBBcnJheSBvZiB1bmlxdWUga2V5cyBmb3IgY29udGVudCBmb3IgdGhlIERyb3AuCisgICAgICBkZWYga2V5cworICAgICAgICAoY29udGVudF9tZXRob2RzIHwKKyAgICAgICAgICBAbXV0YXRpb25zLmtleXMgfAorICAgICAgICAgIGZhbGxiYWNrX2RhdGEua2V5cykuZmxhdHRlbgorICAgICAgZW5kCisKKyAgICAgICMgR2VuZXJhdGUgYSBIYXNoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBEcm9wIGJ5IHJlc29sdmluZyBlYWNoIGtleSdzCisgICAgICAjIHZhbHVlLiBJdCBpbmNsdWRlcyBEcm9wIG1ldGhvZHMsIG11dGF0aW9ucywgYW5kIHRoZSB1bmRlcmx5aW5nIG9iamVjdCdzCisgICAgICAjIGRhdGEuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgRHJvcCNrZXlzIGZvciBtb3JlLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgSGFzaCB3aXRoIGFsbCB0aGUga2V5cyBhbmQgdmFsdWVzIHJlc29sdmVkLgorICAgICAgZGVmIHRvX2gKKyAgICAgICAga2V5cy5lYWNoX3dpdGhfb2JqZWN0KHt9KSBkbyB8KGtleSwgXyksIHJlc3VsdHwKKyAgICAgICAgICByZXN1bHRba2V5XSA9IHNlbGZba2V5XQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgYWxpYXNfbWV0aG9kIDp0b19oYXNoLCA6dG9faAorCisgICAgICAjIEluc3BlY3QgdGhlIGRyb3AncyBrZXlzIGFuZCB2YWx1ZXMgdGhyb3VnaCBhIEpTT04gcmVwcmVzZW50YXRpb24KKyAgICAgICMgb2YgaXRzIGtleXMgYW5kIHZhbHVlcy4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIHByZXR0eSBnZW5lcmF0aW9uIG9mIHRoZSBoYXNoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBEcm9wLgorICAgICAgZGVmIGluc3BlY3QKKyAgICAgICAgcmVxdWlyZSAianNvbiIKKyAgICAgICAgSlNPTi5wcmV0dHlfZ2VuZXJhdGUgdG9faAorICAgICAgZW5kCisKKyAgICAgICMgR2VuZXJhdGUgYSBIYXNoIGZvciB1c2UgaW4gZ2VuZXJhdGluZyBKU09OLgorICAgICAgIyBUaGlzIGlzIHVzZWZ1bCBpZiBmaWVsZHMgbmVlZCB0byBiZSBjbGVhcmVkIGJlZm9yZSB0aGUgSlNPTiBjYW4gZ2VuZXJhdGUuCisgICAgICAjCisgICAgICAjIFJldHVybnMgYSBIYXNoIHJlYWR5IGZvciBKU09OIGdlbmVyYXRpb24uCisgICAgICBkZWYgaGFzaF9mb3JfanNvbigqKQorICAgICAgICB0b19oCisgICAgICBlbmQKKworICAgICAgIyBHZW5lcmF0ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIERyb3AuCisgICAgICAjCisgICAgICAjIHN0YXRlIC0gdGhlIEpTT046OlN0YXRlIG9iamVjdCB3aGljaCBkZXRlcm1pbmVzIHRoZSBzdGF0ZSBvZiBjdXJyZW50IHByb2Nlc3NpbmcuCisgICAgICAjCisgICAgICAjIFJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBEcm9wIGluIGEgU3RyaW5nLgorICAgICAgZGVmIHRvX2pzb24oc3RhdGUgPSBuaWwpCisgICAgICAgIHJlcXVpcmUgImpzb24iCisgICAgICAgIEpTT04uZ2VuZXJhdGUoaGFzaF9mb3JfanNvbihzdGF0ZSksIHN0YXRlKQorICAgICAgZW5kCisKKyAgICAgICMgQ29sbGVjdHMgYWxsIHRoZSBrZXlzIGFuZCBwYXNzZXMgZWFjaCB0byB0aGUgYmxvY2sgaW4gdHVybi4KKyAgICAgICMKKyAgICAgICMgYmxvY2sgLSBhIGJsb2NrIHdoaWNoIGFjY2VwdHMgb25lIGFyZ3VtZW50LCB0aGUga2V5CisgICAgICAjCisgICAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICAgIGRlZiBlYWNoX2tleSgmYmxvY2spCisgICAgICAgIGtleXMuZWFjaCgmYmxvY2spCisgICAgICBlbmQKKworICAgICAgZGVmIGVhY2gKKyAgICAgICAgZWFjaF9rZXkuZWFjaCBkbyB8a2V5fAorICAgICAgICAgIHlpZWxkIGtleSwgc2VsZltrZXldCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBtZXJnZShvdGhlciwgJmJsb2NrKQorICAgICAgICBzZWxmLmR1cC50YXAgZG8gfG1lfAorICAgICAgICAgIGlmIGJsb2NrLm5pbD8KKyAgICAgICAgICAgIG1lLm1lcmdlIShvdGhlcikKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtZS5tZXJnZSEob3RoZXIsIGJsb2NrKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgbWVyZ2UhKG90aGVyKQorICAgICAgICBvdGhlci5lYWNoX2tleSBkbyB8a2V5fAorICAgICAgICAgIGlmIGJsb2NrX2dpdmVuPworICAgICAgICAgICAgc2VsZltrZXldID0geWllbGQga2V5LCBzZWxmW2tleV0sIG90aGVyW2tleV0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiBVdGlscy5tZXJnYWJsZT8oc2VsZltrZXldKSAmJiBVdGlscy5tZXJnYWJsZT8ob3RoZXJba2V5XSkKKyAgICAgICAgICAgICAgc2VsZltrZXldID0gVXRpbHMuZGVlcF9tZXJnZV9oYXNoZXMoc2VsZltrZXldLCBvdGhlcltrZXldKQorICAgICAgICAgICAgICBuZXh0CisgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XSB1bmxlc3Mgb3RoZXJba2V5XS5uaWw/CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgSW1pdGF0ZSBIYXNoLmZldGNoIG1ldGhvZCBpbiBEcm9wCisgICAgICAjCisgICAgICAjIFJldHVybnMgdmFsdWUgaWYga2V5IGlzIHByZXNlbnQgaW4gRHJvcCwgb3RoZXJ3aXNlIHJldHVybnMgZGVmYXVsdCB2YWx1ZQorICAgICAgIyBLZXlFcnJvciBpcyByYWlzZWQgaWYga2V5IGlzIG5vdCBwcmVzZW50IGFuZCBubyBkZWZhdWx0IHZhbHVlIGdpdmVuCisgICAgICBkZWYgZmV0Y2goa2V5LCBkZWZhdWx0ID0gbmlsLCAmYmxvY2spCisgICAgICAgIHJldHVybiBzZWxmW2tleV0gaWYga2V5PyhrZXkpCisgICAgICAgIHJhaXNlIEtleUVycm9yLCAlKGtleSBub3QgZm91bmQ6ICIje2tleX0iKSBpZiBkZWZhdWx0Lm5pbD8gJiYgYmxvY2submlsPworICAgICAgICByZXR1cm4geWllbGQoa2V5KSB1bmxlc3MgYmxvY2submlsPworICAgICAgICByZXR1cm4gZGVmYXVsdCB1bmxlc3MgZGVmYXVsdC5uaWw/CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Ryb3BzL2V4Y2VycHRfZHJvcC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Ryb3BzL2V4Y2VycHRfZHJvcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDYxYWViCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZHJvcHMvZXhjZXJwdF9kcm9wLnJiCkBAIC0wLDAgKzEsMTUgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIERyb3BzCisgICAgY2xhc3MgRXhjZXJwdERyb3AgPCBEb2N1bWVudERyb3AKKyAgICAgIGRlZiBsYXlvdXQKKyAgICAgICAgQG9iai5kb2MuZGF0YVsibGF5b3V0Il0KKyAgICAgIGVuZAorCisgICAgICBkZWYgZXhjZXJwdAorICAgICAgICBuaWwKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZHJvcHMvamVreWxsX2Ryb3AucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9qZWt5bGxfZHJvcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2QyZWIzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZHJvcHMvamVreWxsX2Ryb3AucmIKQEAgLTAsMCArMSwzMyBAQAorIyBlbmNvZGluZzogVVRGLTgKKworbW9kdWxlIEpla3lsbAorICBtb2R1bGUgRHJvcHMKKyAgICBjbGFzcyBKZWt5bGxEcm9wIDwgTGlxdWlkOjpEcm9wCisgICAgICBjbGFzcyA8PCBzZWxmCisgICAgICAgIGRlZiBnbG9iYWwKKyAgICAgICAgICBAZ2xvYmFsIHx8PSBKZWt5bGxEcm9wLm5ldworICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgdmVyc2lvbgorICAgICAgICBKZWt5bGw6OlZFUlNJT04KKyAgICAgIGVuZAorCisgICAgICBkZWYgZW52aXJvbm1lbnQKKyAgICAgICAgSmVreWxsLmVudgorICAgICAgZW5kCisKKyAgICAgIGRlZiB0b19oCisgICAgICAgIEB0b19oIHx8PSB7CisgICAgICAgICAgInZlcnNpb24iICAgICA9PiB2ZXJzaW9uLAorICAgICAgICAgICJlbnZpcm9ubWVudCIgPT4gZW52aXJvbm1lbnQsCisgICAgICAgIH0KKyAgICAgIGVuZAorCisgICAgICBkZWYgdG9fanNvbihzdGF0ZSA9IG5pbCkKKyAgICAgICAgcmVxdWlyZSAianNvbiIKKyAgICAgICAgSlNPTi5nZW5lcmF0ZSh0b19oLCBzdGF0ZSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZHJvcHMvc2l0ZV9kcm9wLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZHJvcHMvc2l0ZV9kcm9wLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjQxODAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9zaXRlX2Ryb3AucmIKQEAgLTAsMCArMSw0NCBAQAorIyBlbmNvZGluZzogVVRGLTgKKworbW9kdWxlIEpla3lsbAorICBtb2R1bGUgRHJvcHMKKyAgICBjbGFzcyBTaXRlRHJvcCA8IERyb3AKKyAgICAgIGV4dGVuZCBGb3J3YXJkYWJsZQorCisgICAgICBtdXRhYmxlIGZhbHNlCisKKyAgICAgIGRlZl9kZWxlZ2F0b3IgIDpAb2JqLCA6c2l0ZV9kYXRhLCA6ZGF0YQorICAgICAgZGVmX2RlbGVnYXRvcnMgOkBvYmosIDp0aW1lLCA6cGFnZXMsIDpzdGF0aWNfZmlsZXMsIDpkb2N1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnRhZ3MsIDpjYXRlZ29yaWVzCisKKyAgICAgIGRlZiBbXShrZXkpCisgICAgICAgIGlmIEBvYmouY29sbGVjdGlvbnMua2V5PyhrZXkpICYmIGtleSAhPSAicG9zdHMiCisgICAgICAgICAgQG9iai5jb2xsZWN0aW9uc1trZXldLmRvY3MKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN1cGVyKGtleSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGtleT8oa2V5KQorICAgICAgICAoQG9iai5jb2xsZWN0aW9ucy5rZXk/KGtleSkgJiYga2V5ICE9ICJwb3N0cyIpIHx8IHN1cGVyCisgICAgICBlbmQKKworICAgICAgZGVmIHBvc3RzCisgICAgICAgIEBzaXRlX3Bvc3RzIHx8PSBAb2JqLnBvc3RzLmRvY3Muc29ydCB7IHxhLCBifCBiIDw9PiBhIH0KKyAgICAgIGVuZAorCisgICAgICBkZWYgaHRtbF9wYWdlcworICAgICAgICBAc2l0ZV9odG1sX3BhZ2VzIHx8PSBAb2JqLnBhZ2VzLnNlbGVjdCBkbyB8cGFnZXwKKyAgICAgICAgICBwYWdlLmh0bWw/IHx8IHBhZ2UudXJsLmVuZF93aXRoPygiLyIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb2xsZWN0aW9ucworICAgICAgICBAc2l0ZV9jb2xsZWN0aW9ucyB8fD0gQG9iai5jb2xsZWN0aW9ucy52YWx1ZXMuc29ydF9ieSgmOmxhYmVsKS5tYXAoJjp0b19saXF1aWQpCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorICAgICAgZGVmX2RlbGVnYXRvciA6QG9iaiwgOmNvbmZpZywgOmZhbGxiYWNrX2RhdGEKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Ryb3BzL3N0YXRpY19maWxlX2Ryb3AucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9zdGF0aWNfZmlsZV9kcm9wLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWYyZjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy9zdGF0aWNfZmlsZV9kcm9wLnJiCkBAIC0wLDAgKzEsMTEgQEAKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIERyb3BzCisgICAgY2xhc3MgU3RhdGljRmlsZURyb3AgPCBEcm9wCisgICAgICBleHRlbmQgRm9yd2FyZGFibGUKKyAgICAgIGRlZl9kZWxlZ2F0b3JzIDpAb2JqLCA6bmFtZSwgOmV4dG5hbWUsIDptb2RpZmllZF90aW1lLCA6YmFzZW5hbWUKKyAgICAgIGRlZl9kZWxlZ2F0b3IgOkBvYmosIDpyZWxhdGl2ZV9wYXRoLCA6cGF0aAorICAgICAgZGVmX2RlbGVnYXRvciA6QG9iaiwgOmRhdGEsIDpmYWxsYmFja19kYXRhCisgICAgICBkZWZfZGVsZWdhdG9yIDpAb2JqLCA6dHlwZSwgOmNvbGxlY3Rpb24KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Ryb3BzL3VuaWZpZWRfcGF5bG9hZF9kcm9wLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZHJvcHMvdW5pZmllZF9wYXlsb2FkX2Ryb3AucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0MmJkYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Ryb3BzL3VuaWZpZWRfcGF5bG9hZF9kcm9wLnJiCkBAIC0wLDAgKzEsMjUgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIERyb3BzCisgICAgY2xhc3MgVW5pZmllZFBheWxvYWREcm9wIDwgRHJvcAorICAgICAgbXV0YWJsZSB0cnVlCisKKyAgICAgIGF0dHJfYWNjZXNzb3IgOnBhZ2UsIDpsYXlvdXQsIDpjb250ZW50LCA6cGFnaW5hdG9yCisgICAgICBhdHRyX2FjY2Vzc29yIDpoaWdobGlnaHRlcl9wcmVmaXgsIDpoaWdobGlnaHRlcl9zdWZmaXgKKworICAgICAgZGVmIGpla3lsbAorICAgICAgICBKZWt5bGxEcm9wLmdsb2JhbAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzaXRlCisgICAgICAgIEBzaXRlX2Ryb3AgfHw9IFNpdGVEcm9wLm5ldyhAb2JqKQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKyAgICAgIGRlZiBmYWxsYmFja19kYXRhCisgICAgICAgIEBmYWxsYmFja19kYXRhIHx8PSB7fQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy91cmxfZHJvcC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Ryb3BzL3VybF9kcm9wLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTcxOTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9kcm9wcy91cmxfZHJvcC5yYgpAQCAtMCwwICsxLDg4IEBACisjIGVuY29kaW5nOiBVVEYtOAorCittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBEcm9wcworICAgIGNsYXNzIFVybERyb3AgPCBEcm9wCisgICAgICBleHRlbmQgRm9yd2FyZGFibGUKKworICAgICAgbXV0YWJsZSBmYWxzZQorCisgICAgICBkZWZfZGVsZWdhdG9yIDpAb2JqLCA6Y2xlYW5lZF9yZWxhdGl2ZV9wYXRoLCA6cGF0aAorICAgICAgZGVmX2RlbGVnYXRvciA6QG9iaiwgOm91dHB1dF9leHQsIDpvdXRwdXRfZXh0CisKKyAgICAgIGRlZiBjb2xsZWN0aW9uCisgICAgICAgIEBvYmouY29sbGVjdGlvbi5sYWJlbAorICAgICAgZW5kCisKKyAgICAgIGRlZiBuYW1lCisgICAgICAgIFV0aWxzLnNsdWdpZnkoQG9iai5iYXNlbmFtZV93aXRob3V0X2V4dCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgdGl0bGUKKyAgICAgICAgVXRpbHMuc2x1Z2lmeShAb2JqLmRhdGFbInNsdWciXSwgOm1vZGUgPT4gInByZXR0eSIsIDpjYXNlZCA9PiB0cnVlKSB8fAorICAgICAgICAgIFV0aWxzLnNsdWdpZnkoQG9iai5iYXNlbmFtZV93aXRob3V0X2V4dCwgOm1vZGUgPT4gInByZXR0eSIsIDpjYXNlZCA9PiB0cnVlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzbHVnCisgICAgICAgIFV0aWxzLnNsdWdpZnkoQG9iai5kYXRhWyJzbHVnIl0pIHx8IFV0aWxzLnNsdWdpZnkoQG9iai5iYXNlbmFtZV93aXRob3V0X2V4dCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgY2F0ZWdvcmllcworICAgICAgICBjYXRlZ29yeV9zZXQgPSBTZXQubmV3CisgICAgICAgIEFycmF5KEBvYmouZGF0YVsiY2F0ZWdvcmllcyJdKS5lYWNoIGRvIHxjYXRlZ29yeXwKKyAgICAgICAgICBjYXRlZ29yeV9zZXQgPDwgY2F0ZWdvcnkudG9fcy5kb3duY2FzZQorICAgICAgICBlbmQKKyAgICAgICAgY2F0ZWdvcnlfc2V0LnRvX2Euam9pbigiLyIpCisgICAgICBlbmQKKworICAgICAgZGVmIHllYXIKKyAgICAgICAgQG9iai5kYXRlLnN0cmZ0aW1lKCIlWSIpCisgICAgICBlbmQKKworICAgICAgZGVmIG1vbnRoCisgICAgICAgIEBvYmouZGF0ZS5zdHJmdGltZSgiJW0iKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBkYXkKKyAgICAgICAgQG9iai5kYXRlLnN0cmZ0aW1lKCIlZCIpCisgICAgICBlbmQKKworICAgICAgZGVmIGhvdXIKKyAgICAgICAgQG9iai5kYXRlLnN0cmZ0aW1lKCIlSCIpCisgICAgICBlbmQKKworICAgICAgZGVmIG1pbnV0ZQorICAgICAgICBAb2JqLmRhdGUuc3RyZnRpbWUoIiVNIikKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2Vjb25kCisgICAgICAgIEBvYmouZGF0ZS5zdHJmdGltZSgiJVMiKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBpX2RheQorICAgICAgICBAb2JqLmRhdGUuc3RyZnRpbWUoIiUtZCIpCisgICAgICBlbmQKKworICAgICAgZGVmIGlfbW9udGgKKyAgICAgICAgQG9iai5kYXRlLnN0cmZ0aW1lKCIlLW0iKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzaG9ydF9tb250aAorICAgICAgICBAb2JqLmRhdGUuc3RyZnRpbWUoIiViIikKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2hvcnRfeWVhcgorICAgICAgICBAb2JqLmRhdGUuc3RyZnRpbWUoIiV5IikKKyAgICAgIGVuZAorCisgICAgICBkZWYgeV9kYXkKKyAgICAgICAgQG9iai5kYXRlLnN0cmZ0aW1lKCIlaiIpCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorICAgICAgZGVmIGZhbGxiYWNrX2RhdGEKKyAgICAgICAge30KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZW50cnlfZmlsdGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZW50cnlfZmlsdGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDI1MDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9lbnRyeV9maWx0ZXIucmIKQEAgLTAsMCArMSwxMjEgQEAKK21vZHVsZSBKZWt5bGwKKyAgY2xhc3MgRW50cnlGaWx0ZXIKKyAgICBhdHRyX3JlYWRlciA6c2l0ZQorICAgIFNQRUNJQUxfTEVBRElOR19DSEFSQUNURVJTID0gWworICAgICAgIi4iLCAiXyIsICIjIiwgIn4iLAorICAgIF0uZnJlZXplCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzaXRlLCBiYXNlX2RpcmVjdG9yeSA9IG5pbCkKKyAgICAgIEBzaXRlID0gc2l0ZQorICAgICAgQGJhc2VfZGlyZWN0b3J5ID0gZGVyaXZlX2Jhc2VfZGlyZWN0b3J5KAorICAgICAgICBAc2l0ZSwgYmFzZV9kaXJlY3RvcnkudG9fcy5kdXAKKyAgICAgICkKKyAgICBlbmQKKworICAgIGRlZiBiYXNlX2RpcmVjdG9yeQorICAgICAgQGJhc2VfZGlyZWN0b3J5LnRvX3MKKyAgICBlbmQKKworICAgIGRlZiBkZXJpdmVfYmFzZV9kaXJlY3Rvcnkoc2l0ZSwgYmFzZV9kaXIpCisgICAgICBiYXNlX2RpcltzaXRlLnNvdXJjZV0gPSAiIiBpZiBiYXNlX2Rpci5zdGFydF93aXRoPyhzaXRlLnNvdXJjZSkKKyAgICAgIGJhc2VfZGlyCisgICAgZW5kCisKKyAgICBkZWYgcmVsYXRpdmVfdG9fc291cmNlKGVudHJ5KQorICAgICAgRmlsZS5qb2luKAorICAgICAgICBiYXNlX2RpcmVjdG9yeSwgZW50cnkKKyAgICAgICkKKyAgICBlbmQKKworICAgIGRlZiBmaWx0ZXIoZW50cmllcykKKyAgICAgIGVudHJpZXMucmVqZWN0IGRvIHxlfAorICAgICAgICB1bmxlc3MgaW5jbHVkZWQ/KGUpCisgICAgICAgICAgc3BlY2lhbD8oZSkgfHwgYmFja3VwPyhlKSB8fCBleGNsdWRlZD8oZSkgfHwgc3ltbGluaz8oZSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBpbmNsdWRlZD8oZW50cnkpCisgICAgICBnbG9iX2luY2x1ZGU/KHNpdGUuaW5jbHVkZSwgZW50cnkpIHx8CisgICAgICAgIGdsb2JfaW5jbHVkZT8oc2l0ZS5pbmNsdWRlLCBGaWxlLmJhc2VuYW1lKGVudHJ5KSkKKyAgICBlbmQKKworICAgIGRlZiBzcGVjaWFsPyhlbnRyeSkKKyAgICAgIFNQRUNJQUxfTEVBRElOR19DSEFSQUNURVJTLmluY2x1ZGU/KGVudHJ5WzAuLjBdKSB8fAorICAgICAgICBTUEVDSUFMX0xFQURJTkdfQ0hBUkFDVEVSUy5pbmNsdWRlPyhGaWxlLmJhc2VuYW1lKGVudHJ5KVswLi4wXSkKKyAgICBlbmQKKworICAgIGRlZiBiYWNrdXA/KGVudHJ5KQorICAgICAgZW50cnlbLTEuLi0xXSA9PSAifiIKKyAgICBlbmQKKworICAgIGRlZiBleGNsdWRlZD8oZW50cnkpCisgICAgICBnbG9iX2luY2x1ZGU/KHNpdGUuZXhjbHVkZSwgcmVsYXRpdmVfdG9fc291cmNlKGVudHJ5KSkudGFwIGRvIHxleGNsdWRlZHwKKyAgICAgICAgaWYgZXhjbHVkZWQKKyAgICAgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnKAorICAgICAgICAgICAgIkVudHJ5RmlsdGVyOiIsCisgICAgICAgICAgICAiZXhjbHVkZWQgI3tyZWxhdGl2ZV90b19zb3VyY2UoZW50cnkpfSIKKyAgICAgICAgICApCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIC0tCisgICAgIyBDaGVjayBpZiBhIGZpbGUgaXMgYSBzeW1saW5rLgorICAgICMgTk9URTogVGhpcyBjYW4gYmUgY29udmVydGVkIHRvIGFsbG93aW5nIGV2ZW4gaW4gc2FmZSwKKyAgICAjICAgc2luY2Ugd2UgdXNlIFBhdGh1dGlsI2luX3BhdGg/IG5vdy4KKyAgICAjIC0tCisgICAgZGVmIHN5bWxpbms/KGVudHJ5KQorICAgICAgc2l0ZS5zYWZlICYmIEZpbGUuc3ltbGluaz8oZW50cnkpICYmIHN5bWxpbmtfb3V0c2lkZV9zaXRlX3NvdXJjZT8oZW50cnkpCisgICAgZW5kCisKKyAgICAjIC0tCisgICAgIyBOT1RFOiBQYXRodXRpbCNpbl9wYXRoPyBnZXRzIHRoZSByZWFscGF0aC4KKyAgICAjIEBwYXJhbSBbPEFueXRoaW5nPl0gZW50cnkgdGhlIGVudHJ5IHlvdSB3YW50IHRvIHZhbGlkYXRlLgorICAgICMgQ2hlY2sgaWYgYSBwYXRoIGlzIG91dHNpZGUgb2Ygb3VyIGdpdmVuIHJvb3QuCisgICAgIyAtLQorICAgIGRlZiBzeW1saW5rX291dHNpZGVfc2l0ZV9zb3VyY2U/KGVudHJ5KQorICAgICAgIVBhdGh1dGlsLm5ldyhlbnRyeSkuaW5fcGF0aD8oCisgICAgICAgIHNpdGUuaW5fc291cmNlX2RpcgorICAgICAgKQorICAgIGVuZAorCisgICAgIyAtLQorICAgICMgQ2hlY2sgaWYgYW4gZW50cnkgbWF0Y2hlcyBhIHNwZWNpZmljIHBhdHRlcm4gYW5kIHJldHVybiB0cnVlLGZhbHNlLgorICAgICMgUmV0dXJucyB0cnVlIGlmIHBhdGggbWF0Y2hlcyBhZ2FpbnN0IGFueSBnbG9iIHBhdHRlcm4uCisgICAgIyAtLQorICAgIGRlZiBnbG9iX2luY2x1ZGU/KGVudW0sIGUpCisgICAgICBlbnRyeSA9IFBhdGh1dGlsLm5ldyhzaXRlLmluX3NvdXJjZV9kaXIpLmpvaW4oZSkKKyAgICAgIGVudW0uYW55PyBkbyB8ZXhwfAorICAgICAgICAjIFVzZXJzIHdobyBzZW5kIGEgUmVnZXhwIGtub3dzIHdoYXQgdGhleSB3YW50IHRvCisgICAgICAgICMgZXhjbHVkZSwgc28gbGV0IHRoZW0gc2VuZCBhIFJlZ2V4cCB0byBleGNsdWRlIGZpbGVzLAorICAgICAgICAjIHdlIHdpbGwgbm90IGJvdGhlciBjYXJpbmcgaWYgaXQgd29ya3Mgb3Igbm90LCBpdCdzCisgICAgICAgICMgb24gdGhlbSBhdCB0aGlzIHBvaW50LgorCisgICAgICAgIGlmIGV4cC5pc19hPyhSZWdleHApCisgICAgICAgICAgZW50cnkgPX4gZXhwCisKKyAgICAgICAgZWxzZQorICAgICAgICAgIGl0ZW0gPSBQYXRodXRpbC5uZXcoc2l0ZS5pbl9zb3VyY2VfZGlyKS5qb2luKGV4cCkKKworICAgICAgICAgICMgSWYgaXQncyBhIGRpcmVjdG9yeSB0aGV5IHdhbnQgdG8gZXhjbHVkZSwgQUtBCisgICAgICAgICAgIyBlbmRzIHdpdGggYSAiLyIgdGhlbiB3ZSB3aWxsIGdvIG9uIHRvIGNoZWNrIGFuZAorICAgICAgICAgICMgc2VlIGlmIHRoZSBlbnRyeSBmYWxscyB3aXRoaW4gdGhhdCBwYXRoIGFuZAorICAgICAgICAgICMgZXhjbHVkZSBpdCBpZiB0aGF0J3MgdGhlIGNhc2UuCisKKyAgICAgICAgICBpZiBlLmVuZF93aXRoPygiLyIpCisgICAgICAgICAgICBlbnRyeS5pbl9wYXRoPygKKyAgICAgICAgICAgICAgaXRlbQorICAgICAgICAgICAgKQorCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgRmlsZS5mbm1hdGNoPyhpdGVtLCBlbnRyeSkgfHwKKyAgICAgICAgICAgICAgZW50cnkudG9fcGF0aC5zdGFydF93aXRoPygKKyAgICAgICAgICAgICAgICBpdGVtCisgICAgICAgICAgICAgICkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Vycm9ycy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2Vycm9ycy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFhMDRiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZXJyb3JzLnJiCkBAIC0wLDAgKzEsMTggQEAKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIEVycm9ycworICAgIEZhdGFsRXhjZXB0aW9uID0gQ2xhc3MubmV3KDo6UnVudGltZUVycm9yKQorCisgICAgSW52YWxpZFRoZW1lTmFtZSA9IENsYXNzLm5ldyhGYXRhbEV4Y2VwdGlvbikKKworICAgIERyb3BNdXRhdGlvbkV4Y2VwdGlvbiAgICAgICA9IENsYXNzLm5ldyhGYXRhbEV4Y2VwdGlvbikKKyAgICBJbnZhbGlkUGVybWFsaW5rRXJyb3IgICAgICAgPSBDbGFzcy5uZXcoRmF0YWxFeGNlcHRpb24pCisgICAgSW52YWxpZFlBTUxGcm9udE1hdHRlckVycm9yID0gQ2xhc3MubmV3KEZhdGFsRXhjZXB0aW9uKQorICAgIE1pc3NpbmdEZXBlbmRlbmN5RXhjZXB0aW9uICA9IENsYXNzLm5ldyhGYXRhbEV4Y2VwdGlvbikKKworICAgIEludmFsaWREYXRlRXJyb3IgICAgICAgICAgICA9IENsYXNzLm5ldyhGYXRhbEV4Y2VwdGlvbikKKyAgICBJbnZhbGlkUG9zdE5hbWVFcnJvciAgICAgICAgPSBDbGFzcy5uZXcoRmF0YWxFeGNlcHRpb24pCisgICAgUG9zdFVSTEVycm9yICAgICAgICAgICAgICAgID0gQ2xhc3MubmV3KEZhdGFsRXhjZXB0aW9uKQorICAgIEludmFsaWRVUkxFcnJvciAgICAgICAgICAgICA9IENsYXNzLm5ldyhGYXRhbEV4Y2VwdGlvbikKKyAgICBJbnZhbGlkQ29uZmlndXJhdGlvbkVycm9yICAgPSBDbGFzcy5uZXcoRmF0YWxFeGNlcHRpb24pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9leGNlcnB0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZXhjZXJwdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM0NGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZXhjZXJwdC5yYgpAQCAtMCwwICsxLDEyNCBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBFeGNlcnB0CisgICAgZXh0ZW5kIEZvcndhcmRhYmxlCisKKyAgICBhdHRyX2FjY2Vzc29yIDpkb2MKKyAgICBhdHRyX2FjY2Vzc29yIDpjb250ZW50LCA6ZXh0CisgICAgYXR0cl93cml0ZXIgICA6b3V0cHV0CisKKyAgICBkZWZfZGVsZWdhdG9ycyA6QGRvYywgOnNpdGUsIDpuYW1lLCA6ZXh0LCA6cmVsYXRpdmVfcGF0aCwgOmV4dG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDpyZW5kZXJfd2l0aF9saXF1aWQ/LCA6Y29sbGVjdGlvbiwgOnJlbGF0ZWRfcG9zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDp1cmwsIDpuZXh0X2RvYywgOnByZXZpb3VzX2RvYworCisgICAgIyBJbml0aWFsaXplIHRoaXMgRXhjZXJwdCBpbnN0YW5jZS4KKyAgICAjCisgICAgIyBkb2MgLSBUaGUgRG9jdW1lbnQuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgbmV3IEV4Y2VycHQuCisgICAgZGVmIGluaXRpYWxpemUoZG9jKQorICAgICAgc2VsZi5kb2MgPSBkb2MKKyAgICAgIHNlbGYuY29udGVudCA9IGV4dHJhY3RfZXhjZXJwdChkb2MuY29udGVudCkKKyAgICBlbmQKKworICAgICMgRmV0Y2ggWUFNTCBmcm9udC1tYXR0ZXIgZGF0YSBmcm9tIHJlbGF0ZWQgZG9jLCB3aXRob3V0IGxheW91dCBrZXkKKyAgICAjCisgICAgIyBSZXR1cm5zIEhhc2ggb2YgZG9jIGRhdGEKKyAgICBkZWYgZGF0YQorICAgICAgQGRhdGEgfHw9IGRvYy5kYXRhLmR1cAorICAgICAgQGRhdGEuZGVsZXRlKCJsYXlvdXQiKQorICAgICAgQGRhdGEuZGVsZXRlKCJleGNlcnB0IikKKyAgICAgIEBkYXRhCisgICAgZW5kCisKKyAgICBkZWYgdHJpZ2dlcl9ob29rcygqKTsgZW5kCisKKyAgICAjICdQYXRoJyBvZiB0aGUgZXhjZXJwdC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBwYXRoIGZvciB0aGUgZG9jIHRoaXMgZXhjZXJwdCBiZWxvbmdzIHRvIHdpdGggI2V4Y2VycHQgYXBwZW5kZWQKKyAgICBkZWYgcGF0aAorICAgICAgRmlsZS5qb2luKGRvYy5wYXRoLCAiI2V4Y2VycHQiKQorICAgIGVuZAorCisgICAgIyBDaGVjayBpZiBleGNlcnB0IGluY2x1ZGVzIGEgc3RyaW5nCisgICAgIworICAgICMgUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgcGFzc2VkIGluCisgICAgZGVmIGluY2x1ZGU/KHNvbWV0aGluZykKKyAgICAgIChvdXRwdXQgJiYgb3V0cHV0LmluY2x1ZGU/KHNvbWV0aGluZykpIHx8IGNvbnRlbnQuaW5jbHVkZT8oc29tZXRoaW5nKQorICAgIGVuZAorCisgICAgIyBUaGUgVUlEIGZvciB0aGlzIGRvYyAodXNlZnVsIGluIGZlZWRzKS4KKyAgICAjIGUuZy4gLzIwMDgvMTEvMDUvbXktYXdlc29tZS1kb2MKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBTdHJpbmcgVUlELgorICAgIGRlZiBpZAorICAgICAgIiN7ZG9jLmlkfSNleGNlcnB0IgorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgIG91dHB1dCB8fCBjb250ZW50CisgICAgZW5kCisKKyAgICBkZWYgdG9fbGlxdWlkCisgICAgICBKZWt5bGw6OkRyb3BzOjpFeGNlcnB0RHJvcC5uZXcoc2VsZikKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgc2hvcnRoYW5kIFN0cmluZyBpZGVudGlmaWVyIG9mIHRoaXMgZG9jLgorICAgIGRlZiBpbnNwZWN0CisgICAgICAiPEV4Y2VycHQ6ICN7c2VsZi5pZH0+IgorICAgIGVuZAorCisgICAgZGVmIG91dHB1dAorICAgICAgQG91dHB1dCB8fD0gUmVuZGVyZXIubmV3KGRvYy5zaXRlLCBzZWxmLCBzaXRlLnNpdGVfcGF5bG9hZCkucnVuCisgICAgZW5kCisKKyAgICBkZWYgcGxhY2VfaW5fbGF5b3V0PworICAgICAgZmFsc2UKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgIyBJbnRlcm5hbDogRXh0cmFjdCBleGNlcnB0IGZyb20gdGhlIGNvbnRlbnQKKyAgICAjCisgICAgIyBCeSBkZWZhdWx0IGV4Y2VycHQgaXMgeW91ciBmaXJzdCBwYXJhZ3JhcGggb2YgYSBkb2M6IGV2ZXJ5dGhpbmcgYmVmb3JlCisgICAgIyB0aGUgZmlyc3QgdHdvIG5ldyBsaW5lczoKKyAgICAjCisgICAgIyAgICAgLS0tCisgICAgIyAgICAgdGl0bGU6IEV4YW1wbGUKKyAgICAjICAgICAtLS0KKyAgICAjCisgICAgIyAgICAgRmlyc3QgcGFyYWdyYXBoIHdpdGggW2xpbmtdWzFdLgorICAgICMKKyAgICAjICAgICBTZWNvbmQgcGFyYWdyYXBoLgorICAgICMKKyAgICAjICAgICBbMV06IGh0dHA6Ly9leGFtcGxlLmNvbS8KKyAgICAjCisgICAgIyBUaGlzIGlzIGZhaXJseSBnb29kIG9wdGlvbiBmb3IgTWFya2Rvd24gYW5kIFRleHRpbGUgZmlsZXMuIEJ1dCBtaWdodCBjYXVzZQorICAgICMgcHJvYmxlbXMgZm9yIEhUTUwgZG9jcyAod2hpY2ggaXMgcXVpdGUgdW51c3VhbCBmb3IgSmVreWxsKS4gSWYgZGVmYXVsdAorICAgICMgZXhjZXJwdCBkZWxpbWl0ZXIgaXMgbm90IGdvb2QgZm9yIHlvdSwgeW91IG1pZ2h0IHdhbnQgdG8gc2V0IHlvdXIgb3duIHZpYQorICAgICMgY29uZmlndXJhdGlvbiBvcHRpb24gYGV4Y2VycHRfc2VwYXJhdG9yYC4gRm9yIGV4YW1wbGUsIGZvbGxvd2luZyBpcyBhIGdvb2QKKyAgICAjIGFsdGVybmF0aXZlIGZvciBIVE1MIGRvY3M6CisgICAgIworICAgICMgICAgICMgZmlsZTogX2NvbmZpZy55bWwKKyAgICAjICAgICBleGNlcnB0X3NlcGFyYXRvcjogIjwhLS0gbW9yZSAtLT4iCisgICAgIworICAgICMgTm90aWNlIHRoYXQgYWxsIG1hcmtkb3duLXN0eWxlIGxpbmsgcmVmZXJlbmNlcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQorICAgICMgZXhjZXJwdC4gU28gdGhlIGV4YW1wbGUgZG9jIGFib3ZlIHdpbGwgaGF2ZSB0aGlzIGV4Y2VycHQgc291cmNlOgorICAgICMKKyAgICAjICAgICBGaXJzdCBwYXJhZ3JhcGggd2l0aCBbbGlua11bMV0uCisgICAgIworICAgICMgICAgIFsxXTogaHR0cDovL2V4YW1wbGUuY29tLworICAgICMKKyAgICAjIEV4Y2VycHRzIGFyZSByZW5kZXJlZCBzYW1lIHRpbWUgYXMgY29udGVudCBpcyByZW5kZXJlZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIGV4Y2VycHQgU3RyaW5nCisgICAgZGVmIGV4dHJhY3RfZXhjZXJwdChkb2NfY29udGVudCkKKyAgICAgIGhlYWQsIF8sIHRhaWwgPSBkb2NfY29udGVudC50b19zLnBhcnRpdGlvbihkb2MuZXhjZXJwdF9zZXBhcmF0b3IpCisKKyAgICAgIGlmIHRhaWwuZW1wdHk/CisgICAgICAgIGhlYWQKKyAgICAgIGVsc2UKKyAgICAgICAgIiIgPDwgaGVhZCA8PCAiXG5cbiIgPDwgdGFpbC5zY2FuKCVyIV4gezAsM31cW1teXF1dK1xdOi4rJCEpLmpvaW4oIlxuIikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZXh0ZXJuYWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9leHRlcm5hbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVmYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZXh0ZXJuYWwucmIKQEAgLTAsMCArMSw3MiBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgRXh0ZXJuYWwKKyAgICBjbGFzcyA8PCBzZWxmCisgICAgICAjCisgICAgICAjIEdlbXMgdGhhdCwgaWYgaW5zdGFsbGVkLCBzaG91bGQgYmUgbG9hZGVkLgorICAgICAgIyBVc3VhbGx5IGNvbnRhaW4gc3ViY29tbWFuZHMuCisgICAgICAjCisgICAgICBkZWYgYmxlc3NlZF9nZW1zCisgICAgICAgICV3KAorICAgICAgICAgIGpla3lsbC1kb2NzCisgICAgICAgICAgamVreWxsLWltcG9ydAorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgIworICAgICAgIyBSZXF1aXJlIGEgZ2VtIG9yIGZpbGUgaWYgaXQncyBwcmVzZW50LCBvdGhlcndpc2Ugc2lsZW50bHkgZmFpbC4KKyAgICAgICMKKyAgICAgICMgbmFtZXMgLSBhIHN0cmluZyBnZW0gbmFtZSBvciBhcnJheSBvZiBnZW0gbmFtZXMKKyAgICAgICMKKyAgICAgIGRlZiByZXF1aXJlX2lmX3ByZXNlbnQobmFtZXMpCisgICAgICAgIEFycmF5KG5hbWVzKS5lYWNoIGRvIHxuYW1lfAorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICByZXF1aXJlIG5hbWUKKyAgICAgICAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJDb3VsZG4ndCBsb2FkICN7bmFtZX0uIFNraXBwaW5nLiIKKyAgICAgICAgICAgIHlpZWxkKG5hbWUsIHZlcnNpb25fY29uc3RyYWludChuYW1lKSkgaWYgYmxvY2tfZ2l2ZW4/CisgICAgICAgICAgICBmYWxzZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjCisgICAgICAjIFRoZSB2ZXJzaW9uIGNvbnN0cmFpbnQgcmVxdWlyZWQgdG8gYWN0aXZhdGUgYSBnaXZlbiBnZW0uCisgICAgICAjIFVzdWFsbHkgdGhlIGdlbSB2ZXJzaW9uIHJlcXVpcmVtZW50IGlzICI+IDAsIiBiZWNhdXNlIGFueSB2ZXJzaW9uCisgICAgICAjIHdpbGwgZG8uIEluIHRoZSBjYXNlIG9mIGpla3lsbC1kb2NzLCBob3dldmVyLCB3ZSByZXF1aXJlIHRoZSBleGFjdAorICAgICAgIyBzYW1lIHZlcnNpb24gYXMgSmVreWxsLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgU3RyaW5nIHZlcnNpb24gY29uc3RyYWludCBpbiBhIHBhcnNlYWJsZSBmb3JtIGZvcgorICAgICAgIyBSdWJ5R2Vtcy4KKyAgICAgIGRlZiB2ZXJzaW9uX2NvbnN0cmFpbnQoZ2VtX25hbWUpCisgICAgICAgIHJldHVybiAiPSAje0pla3lsbDo6VkVSU0lPTn0iIGlmIGdlbV9uYW1lLnRvX3MuZXFsPygiamVreWxsLWRvY3MiKQorICAgICAgICAiPiAwIgorICAgICAgZW5kCisKKyAgICAgICMKKyAgICAgICMgUmVxdWlyZSBhIGdlbSBvciBnZW1zLiBJZiBpdCdzIG5vdCBwcmVzZW50LCBzaG93IGEgdmVyeSBuaWNlIGVycm9yCisgICAgICAjIG1lc3NhZ2UgdGhhdCBleHBsYWlucyBldmVyeXRoaW5nIGFuZCBpcyBtdWNoIG1vcmUgaGVscGZ1bCB0aGFuIHRoZQorICAgICAgIyBub3JtYWwgTG9hZEVycm9yLgorICAgICAgIworICAgICAgIyBuYW1lcyAtIGEgc3RyaW5nIGdlbSBuYW1lIG9yIGFycmF5IG9mIGdlbSBuYW1lcworICAgICAgIworICAgICAgZGVmIHJlcXVpcmVfd2l0aF9ncmFjZWZ1bF9mYWlsKG5hbWVzKQorICAgICAgICBBcnJheShuYW1lcykuZWFjaCBkbyB8bmFtZXwKKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgSmVreWxsLmxvZ2dlci5kZWJ1ZyAiUmVxdWlyaW5nOiIsIG5hbWUudG9fcworICAgICAgICAgICAgcmVxdWlyZSBuYW1lCisgICAgICAgICAgcmVzY3VlIExvYWRFcnJvciA9PiBlCisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLmVycm9yICJEZXBlbmRlbmN5IEVycm9yOiIsIDw8LU1TRworWWlrZXMhIEl0IGxvb2tzIGxpa2UgeW91IGRvbid0IGhhdmUgI3tuYW1lfSBvciBvbmUgb2YgaXRzIGRlcGVuZGVuY2llcyBpbnN0YWxsZWQuCitJbiBvcmRlciB0byB1c2UgSmVreWxsIGFzIGN1cnJlbnRseSBjb25maWd1cmVkLCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoaXMgZ2VtLgorCitUaGUgZnVsbCBlcnJvciBtZXNzYWdlIGZyb20gUnVieSBpczogJyN7ZS5tZXNzYWdlfScKKworSWYgeW91IHJ1biBpbnRvIHRyb3VibGUsIHlvdSBjYW4gZmluZCBoZWxwZnVsIHJlc291cmNlcyBhdCBodHRwczovL2pla3lsbHJiLmNvbS9oZWxwLyEKKyAgICAgICAgICAgIE1TRworICAgICAgICAgICAgcmFpc2UgSmVreWxsOjpFcnJvcnM6Ok1pc3NpbmdEZXBlbmRlbmN5RXhjZXB0aW9uLCBuYW1lCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9maWx0ZXJzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZmlsdGVycy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTVjZjdjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZmlsdGVycy5yYgpAQCAtMCwwICsxLDQyMSBAQAorcmVxdWlyZSAiYWRkcmVzc2FibGUvdXJpIgorcmVxdWlyZSAianNvbiIKK3JlcXVpcmUgImRhdGUiCityZXF1aXJlICJsaXF1aWQiCisKK3JlcXVpcmVfYWxsICJqZWt5bGwvZmlsdGVycyIKKworbW9kdWxlIEpla3lsbAorICBtb2R1bGUgRmlsdGVycworICAgIGluY2x1ZGUgVVJMRmlsdGVycworICAgIGluY2x1ZGUgR3JvdXBpbmdGaWx0ZXJzCisKKyAgICAjIENvbnZlcnQgYSBNYXJrZG93biBzdHJpbmcgaW50byBIVE1MIG91dHB1dC4KKyAgICAjCisgICAgIyBpbnB1dCAtIFRoZSBNYXJrZG93biBTdHJpbmcgdG8gY29udmVydC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBIVE1MIGZvcm1hdHRlZCBTdHJpbmcuCisgICAgZGVmIG1hcmtkb3duaWZ5KGlucHV0KQorICAgICAgc2l0ZSA9IEBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV0KKyAgICAgIGNvbnZlcnRlciA9IHNpdGUuZmluZF9jb252ZXJ0ZXJfaW5zdGFuY2UoSmVreWxsOjpDb252ZXJ0ZXJzOjpNYXJrZG93bikKKyAgICAgIGNvbnZlcnRlci5jb252ZXJ0KGlucHV0LnRvX3MpCisgICAgZW5kCisKKyAgICAjIENvbnZlcnQgcXVvdGVzIGludG8gc21hcnQgcXVvdGVzLgorICAgICMKKyAgICAjIGlucHV0IC0gVGhlIFN0cmluZyB0byBjb252ZXJ0LgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHNtYXJ0LXF1b3RpZmllZCBTdHJpbmcuCisgICAgZGVmIHNtYXJ0aWZ5KGlucHV0KQorICAgICAgc2l0ZSA9IEBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV0KKyAgICAgIGNvbnZlcnRlciA9IHNpdGUuZmluZF9jb252ZXJ0ZXJfaW5zdGFuY2UoSmVreWxsOjpDb252ZXJ0ZXJzOjpTbWFydHlQYW50cykKKyAgICAgIGNvbnZlcnRlci5jb252ZXJ0KGlucHV0LnRvX3MpCisgICAgZW5kCisKKyAgICAjIENvbnZlcnQgYSBTYXNzIHN0cmluZyBpbnRvIENTUyBvdXRwdXQuCisgICAgIworICAgICMgaW5wdXQgLSBUaGUgU2FzcyBTdHJpbmcgdG8gY29udmVydC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBDU1MgZm9ybWF0dGVkIFN0cmluZy4KKyAgICBkZWYgc2Fzc2lmeShpbnB1dCkKKyAgICAgIHNpdGUgPSBAY29udGV4dC5yZWdpc3RlcnNbOnNpdGVdCisgICAgICBjb252ZXJ0ZXIgPSBzaXRlLmZpbmRfY29udmVydGVyX2luc3RhbmNlKEpla3lsbDo6Q29udmVydGVyczo6U2FzcykKKyAgICAgIGNvbnZlcnRlci5jb252ZXJ0KGlucHV0KQorICAgIGVuZAorCisgICAgIyBDb252ZXJ0IGEgU2NzcyBzdHJpbmcgaW50byBDU1Mgb3V0cHV0LgorICAgICMKKyAgICAjIGlucHV0IC0gVGhlIFNjc3MgU3RyaW5nIHRvIGNvbnZlcnQuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgQ1NTIGZvcm1hdHRlZCBTdHJpbmcuCisgICAgZGVmIHNjc3NpZnkoaW5wdXQpCisgICAgICBzaXRlID0gQGNvbnRleHQucmVnaXN0ZXJzWzpzaXRlXQorICAgICAgY29udmVydGVyID0gc2l0ZS5maW5kX2NvbnZlcnRlcl9pbnN0YW5jZShKZWt5bGw6OkNvbnZlcnRlcnM6OlNjc3MpCisgICAgICBjb252ZXJ0ZXIuY29udmVydChpbnB1dCkKKyAgICBlbmQKKworICAgICMgU2x1Z2lmeSBhIGZpbGVuYW1lIG9yIHRpdGxlLgorICAgICMKKyAgICAjIGlucHV0IC0gVGhlIGZpbGVuYW1lIG9yIHRpdGxlIHRvIHNsdWdpZnkuCisgICAgIyBtb2RlIC0gaG93IHN0cmluZyBpcyBzbHVnaWZpZWQKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBnaXZlbiBmaWxlbmFtZSBvciB0aXRsZSBhcyBhIGxvd2VyY2FzZSBVUkwgU3RyaW5nLgorICAgICMgU2VlIFV0aWxzLnNsdWdpZnkgZm9yIG1vcmUgZGV0YWlsLgorICAgIGRlZiBzbHVnaWZ5KGlucHV0LCBtb2RlID0gbmlsKQorICAgICAgVXRpbHMuc2x1Z2lmeShpbnB1dCwgOm1vZGUgPT4gbW9kZSkKKyAgICBlbmQKKworICAgICMgRm9ybWF0IGEgZGF0ZSBpbiBzaG9ydCBmb3JtYXQgZS5nLiAiMjcgSmFuIDIwMTEiLgorICAgICMKKyAgICAjIGRhdGUgLSB0aGUgVGltZSB0byBmb3JtYXQuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgZm9ybWF0dGluZyBTdHJpbmcuCisgICAgZGVmIGRhdGVfdG9fc3RyaW5nKGRhdGUpCisgICAgICB0aW1lKGRhdGUpLnN0cmZ0aW1lKCIlZCAlYiAlWSIpCisgICAgZW5kCisKKyAgICAjIEZvcm1hdCBhIGRhdGUgaW4gbG9uZyBmb3JtYXQgZS5nLiAiMjcgSmFudWFyeSAyMDExIi4KKyAgICAjCisgICAgIyBkYXRlIC0gVGhlIFRpbWUgdG8gZm9ybWF0LgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGZvcm1hdHRlZCBTdHJpbmcuCisgICAgZGVmIGRhdGVfdG9fbG9uZ19zdHJpbmcoZGF0ZSkKKyAgICAgIHJldHVybiBkYXRlIGlmIGRhdGUudG9fcy5lbXB0eT8KKyAgICAgIHRpbWUoZGF0ZSkuc3RyZnRpbWUoIiVkICVCICVZIikKKyAgICBlbmQKKworICAgICMgRm9ybWF0IGEgZGF0ZSBmb3IgdXNlIGluIFhNTC4KKyAgICAjCisgICAgIyBkYXRlIC0gVGhlIFRpbWUgdG8gZm9ybWF0LgorICAgICMKKyAgICAjIEV4YW1wbGVzCisgICAgIworICAgICMgICBkYXRlX3RvX3htbHNjaGVtYShUaW1lLm5vdykKKyAgICAjICAgIyA9PiAiMjAxMS0wNC0yNFQyMDozNDo0NiswODowMCIKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgU3RyaW5nLgorICAgIGRlZiBkYXRlX3RvX3htbHNjaGVtYShkYXRlKQorICAgICAgcmV0dXJuIGRhdGUgaWYgZGF0ZS50b19zLmVtcHR5PworICAgICAgdGltZShkYXRlKS54bWxzY2hlbWEKKyAgICBlbmQKKworICAgICMgRm9ybWF0IGEgZGF0ZSBhY2NvcmRpbmcgdG8gUkZDLTgyMgorICAgICMKKyAgICAjIGRhdGUgLSBUaGUgVGltZSB0byBmb3JtYXQuCisgICAgIworICAgICMgRXhhbXBsZXMKKyAgICAjCisgICAgIyAgIGRhdGVfdG9fcmZjODIyKFRpbWUubm93KQorICAgICMgICAjID0+ICJTdW4sIDI0IEFwciAyMDExIDEyOjM0OjQ2ICswMDAwIgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGZvcm1hdHRlZCBTdHJpbmcuCisgICAgZGVmIGRhdGVfdG9fcmZjODIyKGRhdGUpCisgICAgICByZXR1cm4gZGF0ZSBpZiBkYXRlLnRvX3MuZW1wdHk/CisgICAgICB0aW1lKGRhdGUpLnJmYzgyMgorICAgIGVuZAorCisgICAgIyBYTUwgZXNjYXBlIGEgc3RyaW5nIGZvciB1c2UuIFJlcGxhY2VzIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgd2l0aAorICAgICMgYXBwcm9wcmlhdGUgSFRNTCBlbnRpdHkgcmVwbGFjZW1lbnRzLgorICAgICMKKyAgICAjIGlucHV0IC0gVGhlIFN0cmluZyB0byBlc2NhcGUuCisgICAgIworICAgICMgRXhhbXBsZXMKKyAgICAjCisgICAgIyAgIHhtbF9lc2NhcGUoJ2ZvbyAiYmFyIiA8YmF6PicpCisgICAgIyAgICMgPT4gImZvbyAmcXVvdDtiYXImcXVvdDsgJmx0O2JheiZndDsiCisgICAgIworICAgICMgUmV0dXJucyB0aGUgZXNjYXBlZCBTdHJpbmcuCisgICAgZGVmIHhtbF9lc2NhcGUoaW5wdXQpCisgICAgICBpbnB1dC50b19zLmVuY29kZSg6eG1sID0+IDphdHRyKS5nc3ViKCVyIVxBInwiXFohLCAiIikKKyAgICBlbmQKKworICAgICMgQ0dJIGVzY2FwZSBhIHN0cmluZyBmb3IgdXNlIGluIGEgVVJMLiBSZXBsYWNlcyBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzCisgICAgIyB3aXRoIGFwcHJvcHJpYXRlICVYWCByZXBsYWNlbWVudHMuCisgICAgIworICAgICMgaW5wdXQgLSBUaGUgU3RyaW5nIHRvIGVzY2FwZS4KKyAgICAjCisgICAgIyBFeGFtcGxlcworICAgICMKKyAgICAjICAgY2dpX2VzY2FwZSgnZm9vLGJhcjtiYXo/JykKKyAgICAjICAgIyA9PiAiZm9vJTJDYmFyJTNCYmF6JTNGIgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGVzY2FwZWQgU3RyaW5nLgorICAgIGRlZiBjZ2lfZXNjYXBlKGlucHV0KQorICAgICAgQ0dJLmVzY2FwZShpbnB1dCkKKyAgICBlbmQKKworICAgICMgVVJJIGVzY2FwZSBhIHN0cmluZy4KKyAgICAjCisgICAgIyBpbnB1dCAtIFRoZSBTdHJpbmcgdG8gZXNjYXBlLgorICAgICMKKyAgICAjIEV4YW1wbGVzCisgICAgIworICAgICMgICB1cmlfZXNjYXBlKCdmb28sIGJhciBcXGJhej8nKQorICAgICMgICAjID0+ICJmb28sJTIwYmFyJTIwJTVDYmF6PyIKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBlc2NhcGVkIFN0cmluZy4KKyAgICBkZWYgdXJpX2VzY2FwZShpbnB1dCkKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkubm9ybWFsaXplX2NvbXBvbmVudChpbnB1dCkKKyAgICBlbmQKKworICAgICMgUmVwbGFjZSBhbnkgd2hpdGVzcGFjZSBpbiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggYSBzaW5nbGUgc3BhY2UKKyAgICAjCisgICAgIyBpbnB1dCAtIFRoZSBTdHJpbmcgb24gd2hpY2ggdG8gb3BlcmF0ZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgU3RyaW5nCisgICAgZGVmIG5vcm1hbGl6ZV93aGl0ZXNwYWNlKGlucHV0KQorICAgICAgaW5wdXQudG9fcy5nc3ViKCVyIVxzKyEsICIgIikuc3RyaXAKKyAgICBlbmQKKworICAgICMgQ291bnQgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgaW5wdXQgc3RyaW5nLgorICAgICMKKyAgICAjIGlucHV0IC0gVGhlIFN0cmluZyBvbiB3aGljaCB0byBvcGVyYXRlLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIEludGVnZXIgd29yZCBjb3VudC4KKyAgICBkZWYgbnVtYmVyX29mX3dvcmRzKGlucHV0KQorICAgICAgaW5wdXQuc3BsaXQubGVuZ3RoCisgICAgZW5kCisKKyAgICAjIEpvaW4gYW4gYXJyYXkgb2YgdGhpbmdzIGludG8gYSBzdHJpbmcgYnkgc2VwYXJhdGluZyB3aXRoIGNvbW1hcyBhbmQgdGhlCisgICAgIyB3b3JkICJhbmQiIGZvciB0aGUgbGFzdCBvbmUuCisgICAgIworICAgICMgYXJyYXkgLSBUaGUgQXJyYXkgb2YgU3RyaW5ncyB0byBqb2luLgorICAgICMgY29ubmVjdG9yIC0gV29yZCB1c2VkIHRvIGNvbm5lY3QgdGhlIGxhc3QgMiBpdGVtcyBpbiB0aGUgYXJyYXkKKyAgICAjCisgICAgIyBFeGFtcGxlcworICAgICMKKyAgICAjICAgYXJyYXlfdG9fc2VudGVuY2Vfc3RyaW5nKFsiYXBwbGVzIiwgIm9yYW5nZXMiLCAiZ3JhcGVzIl0pCisgICAgIyAgICMgPT4gImFwcGxlcywgb3JhbmdlcywgYW5kIGdyYXBlcyIKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgU3RyaW5nLgorICAgIGRlZiBhcnJheV90b19zZW50ZW5jZV9zdHJpbmcoYXJyYXksIGNvbm5lY3RvciA9ICJhbmQiKQorICAgICAgY2FzZSBhcnJheS5sZW5ndGgKKyAgICAgIHdoZW4gMAorICAgICAgICAiIgorICAgICAgd2hlbiAxCisgICAgICAgIGFycmF5WzBdLnRvX3MKKyAgICAgIHdoZW4gMgorICAgICAgICAiI3thcnJheVswXX0gI3tjb25uZWN0b3J9ICN7YXJyYXlbMV19IgorICAgICAgZWxzZQorICAgICAgICAiI3thcnJheVswLi4uLTFdLmpvaW4oIiwgIil9LCAje2Nvbm5lY3Rvcn0gI3thcnJheVstMV19IgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIENvbnZlcnQgdGhlIGlucHV0IGludG8ganNvbiBzdHJpbmcKKyAgICAjCisgICAgIyBpbnB1dCAtIFRoZSBBcnJheSBvciBIYXNoIHRvIGJlIGNvbnZlcnRlZAorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGNvbnZlcnRlZCBqc29uIHN0cmluZworICAgIGRlZiBqc29uaWZ5KGlucHV0KQorICAgICAgYXNfbGlxdWlkKGlucHV0KS50b19qc29uCisgICAgZW5kCisKKyAgICAjIEZpbHRlciBhbiBhcnJheSBvZiBvYmplY3RzCisgICAgIworICAgICMgaW5wdXQgLSB0aGUgb2JqZWN0IGFycmF5CisgICAgIyBwcm9wZXJ0eSAtIHByb3BlcnR5IHdpdGhpbiBlYWNoIG9iamVjdCB0byBmaWx0ZXIgYnkKKyAgICAjIHZhbHVlIC0gZGVzaXJlZCB2YWx1ZQorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGZpbHRlcmVkIGFycmF5IG9mIG9iamVjdHMKKyAgICBkZWYgd2hlcmUoaW5wdXQsIHByb3BlcnR5LCB2YWx1ZSkKKyAgICAgIHJldHVybiBpbnB1dCB1bmxlc3MgaW5wdXQucmVzcG9uZF90bz8oOnNlbGVjdCkKKyAgICAgIGlucHV0ID0gaW5wdXQudmFsdWVzIGlmIGlucHV0LmlzX2E/KEhhc2gpCisgICAgICBpbnB1dC5zZWxlY3QgZG8gfG9iamVjdHwKKyAgICAgICAgQXJyYXkoaXRlbV9wcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KSkubWFwKCY6dG9fcykuaW5jbHVkZT8odmFsdWUudG9fcykKKyAgICAgIGVuZCB8fCBbXQorICAgIGVuZAorCisgICAgIyBGaWx0ZXJzIGFuIGFycmF5IG9mIG9iamVjdHMgYWdhaW5zdCBhbiBleHByZXNzaW9uCisgICAgIworICAgICMgaW5wdXQgLSB0aGUgb2JqZWN0IGFycmF5CisgICAgIyB2YXJpYWJsZSAtIHRoZSB2YXJpYWJsZSB0byBhc3NpZ24gZWFjaCBpdGVtIHRvIGluIHRoZSBleHByZXNzaW9uCisgICAgIyBleHByZXNzaW9uIC0gYSBMaXF1aWQgY29tcGFyaXNvbiBleHByZXNzaW9uIHBhc3NlZCBpbiBhcyBhIHN0cmluZworICAgICMKKyAgICAjIFJldHVybnMgdGhlIGZpbHRlcmVkIGFycmF5IG9mIG9iamVjdHMKKyAgICBkZWYgd2hlcmVfZXhwKGlucHV0LCB2YXJpYWJsZSwgZXhwcmVzc2lvbikKKyAgICAgIHJldHVybiBpbnB1dCB1bmxlc3MgaW5wdXQucmVzcG9uZF90bz8oOnNlbGVjdCkKKyAgICAgIGlucHV0ID0gaW5wdXQudmFsdWVzIGlmIGlucHV0LmlzX2E/KEhhc2gpICMgRklYTUUKKworICAgICAgY29uZGl0aW9uID0gcGFyc2VfY29uZGl0aW9uKGV4cHJlc3Npb24pCisgICAgICBAY29udGV4dC5zdGFjayBkbworICAgICAgICBpbnB1dC5zZWxlY3QgZG8gfG9iamVjdHwKKyAgICAgICAgICBAY29udGV4dFt2YXJpYWJsZV0gPSBvYmplY3QKKyAgICAgICAgICBjb25kaXRpb24uZXZhbHVhdGUoQGNvbnRleHQpCisgICAgICAgIGVuZAorICAgICAgZW5kIHx8IFtdCisgICAgZW5kCisKKyAgICAjIENvbnZlcnQgdGhlIGlucHV0IGludG8gaW50ZWdlcgorICAgICMKKyAgICAjIGlucHV0IC0gdGhlIG9iamVjdCBzdHJpbmcKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlCisgICAgZGVmIHRvX2ludGVnZXIoaW5wdXQpCisgICAgICByZXR1cm4gMSBpZiBpbnB1dCA9PSB0cnVlCisgICAgICByZXR1cm4gMCBpZiBpbnB1dCA9PSBmYWxzZQorICAgICAgaW5wdXQudG9faQorICAgIGVuZAorCisgICAgIyBTb3J0IGFuIGFycmF5IG9mIG9iamVjdHMKKyAgICAjCisgICAgIyBpbnB1dCAtIHRoZSBvYmplY3QgYXJyYXkKKyAgICAjIHByb3BlcnR5IC0gcHJvcGVydHkgd2l0aGluIGVhY2ggb2JqZWN0IHRvIGZpbHRlciBieQorICAgICMgbmlscyAoJ2ZpcnN0JyB8ICdsYXN0JykgLSBuaWxzIGFwcGVhciBiZWZvcmUgb3IgYWZ0ZXIgbm9uLW5pbCB2YWx1ZXMKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBmaWx0ZXJlZCBhcnJheSBvZiBvYmplY3RzCisgICAgZGVmIHNvcnQoaW5wdXQsIHByb3BlcnR5ID0gbmlsLCBuaWxzID0gImZpcnN0IikKKyAgICAgIGlmIGlucHV0Lm5pbD8KKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgIkNhbm5vdCBzb3J0IGEgbnVsbCBvYmplY3QuIgorICAgICAgZW5kCisgICAgICBpZiBwcm9wZXJ0eS5uaWw/CisgICAgICAgIGlucHV0LnNvcnQKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgbmlscyA9PSAiZmlyc3QiCisgICAgICAgICAgb3JkZXIgPSAtIDEKKyAgICAgICAgZWxzaWYgbmlscyA9PSAibGFzdCIKKyAgICAgICAgICBvcmRlciA9ICsgMQorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgIkludmFsaWQgbmlscyBvcmRlcjogIiBcCisgICAgICAgICAgICAiJyN7bmlsc30nIGlzIG5vdCBhIHZhbGlkIG5pbHMgb3JkZXIuIEl0IG11c3QgYmUgJ2ZpcnN0JyBvciAnbGFzdCcuIgorICAgICAgICBlbmQKKworICAgICAgICBzb3J0X2lucHV0KGlucHV0LCBwcm9wZXJ0eSwgb3JkZXIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBwb3AoYXJyYXksIG51bSA9IDEpCisgICAgICByZXR1cm4gYXJyYXkgdW5sZXNzIGFycmF5LmlzX2E/KEFycmF5KQorICAgICAgbnVtID0gTGlxdWlkOjpVdGlscy50b19pbnRlZ2VyKG51bSkKKyAgICAgIG5ld19hcnkgPSBhcnJheS5kdXAKKyAgICAgIG5ld19hcnkucG9wKG51bSkKKyAgICAgIG5ld19hcnkKKyAgICBlbmQKKworICAgIGRlZiBwdXNoKGFycmF5LCBpbnB1dCkKKyAgICAgIHJldHVybiBhcnJheSB1bmxlc3MgYXJyYXkuaXNfYT8oQXJyYXkpCisgICAgICBuZXdfYXJ5ID0gYXJyYXkuZHVwCisgICAgICBuZXdfYXJ5LnB1c2goaW5wdXQpCisgICAgICBuZXdfYXJ5CisgICAgZW5kCisKKyAgICBkZWYgc2hpZnQoYXJyYXksIG51bSA9IDEpCisgICAgICByZXR1cm4gYXJyYXkgdW5sZXNzIGFycmF5LmlzX2E/KEFycmF5KQorICAgICAgbnVtID0gTGlxdWlkOjpVdGlscy50b19pbnRlZ2VyKG51bSkKKyAgICAgIG5ld19hcnkgPSBhcnJheS5kdXAKKyAgICAgIG5ld19hcnkuc2hpZnQobnVtKQorICAgICAgbmV3X2FyeQorICAgIGVuZAorCisgICAgZGVmIHVuc2hpZnQoYXJyYXksIGlucHV0KQorICAgICAgcmV0dXJuIGFycmF5IHVubGVzcyBhcnJheS5pc19hPyhBcnJheSkKKyAgICAgIG5ld19hcnkgPSBhcnJheS5kdXAKKyAgICAgIG5ld19hcnkudW5zaGlmdChpbnB1dCkKKyAgICAgIG5ld19hcnkKKyAgICBlbmQKKworICAgIGRlZiBzYW1wbGUoaW5wdXQsIG51bSA9IDEpCisgICAgICByZXR1cm4gaW5wdXQgdW5sZXNzIGlucHV0LnJlc3BvbmRfdG8/KDpzYW1wbGUpCisgICAgICBudW0gPSBMaXF1aWQ6OlV0aWxzLnRvX2ludGVnZXIobnVtKSByZXNjdWUgMQorICAgICAgaWYgbnVtID09IDEKKyAgICAgICAgaW5wdXQuc2FtcGxlCisgICAgICBlbHNlCisgICAgICAgIGlucHV0LnNhbXBsZShudW0pCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQ29udmVydCBhbiBvYmplY3QgaW50byBpdHMgU3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBkZWJ1Z2dpbmcKKyAgICAjCisgICAgIyBpbnB1dCAtIFRoZSBPYmplY3QgdG8gYmUgY29udmVydGVkCisgICAgIworICAgICMgUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorICAgIGRlZiBpbnNwZWN0KGlucHV0KQorICAgICAgeG1sX2VzY2FwZShpbnB1dC5pbnNwZWN0KQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiBzb3J0X2lucHV0KGlucHV0LCBwcm9wZXJ0eSwgb3JkZXIpCisgICAgICBpbnB1dC5zb3J0IGRvIHxhcHBsZSwgb3JhbmdlfAorICAgICAgICBhcHBsZV9wcm9wZXJ0eSA9IGl0ZW1fcHJvcGVydHkoYXBwbGUsIHByb3BlcnR5KQorICAgICAgICBvcmFuZ2VfcHJvcGVydHkgPSBpdGVtX3Byb3BlcnR5KG9yYW5nZSwgcHJvcGVydHkpCisKKyAgICAgICAgaWYgIWFwcGxlX3Byb3BlcnR5Lm5pbD8gJiYgb3JhbmdlX3Byb3BlcnR5Lm5pbD8KKyAgICAgICAgICAtIG9yZGVyCisgICAgICAgIGVsc2lmIGFwcGxlX3Byb3BlcnR5Lm5pbD8gJiYgIW9yYW5nZV9wcm9wZXJ0eS5uaWw/CisgICAgICAgICAgKyBvcmRlcgorICAgICAgICBlbHNlCisgICAgICAgICAgYXBwbGVfcHJvcGVydHkgPD0+IG9yYW5nZV9wcm9wZXJ0eQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiB0aW1lKGlucHV0KQorICAgICAgZGF0ZSA9IExpcXVpZDo6VXRpbHMudG9fZGF0ZShpbnB1dCkKKyAgICAgIHVubGVzcyBkYXRlLnJlc3BvbmRfdG8/KDp0b190aW1lKQorICAgICAgICByYWlzZSBFcnJvcnM6OkludmFsaWREYXRlRXJyb3IsCisgICAgICAgICAgIkludmFsaWQgRGF0ZTogJyN7aW5wdXQuaW5zcGVjdH0nIGlzIG5vdCBhIHZhbGlkIGRhdGV0aW1lLiIKKyAgICAgIGVuZAorICAgICAgZGF0ZS50b190aW1lLmR1cC5sb2NhbHRpbWUKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgaXRlbV9wcm9wZXJ0eShpdGVtLCBwcm9wZXJ0eSkKKyAgICAgIGlmIGl0ZW0ucmVzcG9uZF90bz8oOnRvX2xpcXVpZCkKKyAgICAgICAgcHJvcGVydHkudG9fcy5zcGxpdCgiLiIpLnJlZHVjZShpdGVtLnRvX2xpcXVpZCkgZG8gfHN1YnZhbHVlLCBhdHRyaWJ1dGV8CisgICAgICAgICAgc3VidmFsdWVbYXR0cmlidXRlXQorICAgICAgICBlbmQKKyAgICAgIGVsc2lmIGl0ZW0ucmVzcG9uZF90bz8oOmRhdGEpCisgICAgICAgIGl0ZW0uZGF0YVtwcm9wZXJ0eS50b19zXQorICAgICAgZWxzZQorICAgICAgICBpdGVtW3Byb3BlcnR5LnRvX3NdCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgYXNfbGlxdWlkKGl0ZW0pCisgICAgICBjYXNlIGl0ZW0KKyAgICAgIHdoZW4gSGFzaAorICAgICAgICBwYWlycyA9IGl0ZW0ubWFwIHsgfGssIHZ8IGFzX2xpcXVpZChbaywgdl0pIH0KKyAgICAgICAgSGFzaFtwYWlyc10KKyAgICAgIHdoZW4gQXJyYXkKKyAgICAgICAgaXRlbS5tYXAgeyB8aXwgYXNfbGlxdWlkKGkpIH0KKyAgICAgIGVsc2UKKyAgICAgICAgaWYgaXRlbS5yZXNwb25kX3RvPyg6dG9fbGlxdWlkKQorICAgICAgICAgIGxpcXVpZGF0ZWQgPSBpdGVtLnRvX2xpcXVpZAorICAgICAgICAgICMgcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gZm9yIHNpbXBsZSB0eXBlcyAod2hpY2ggcmV0dXJuIGBzZWxmYCkKKyAgICAgICAgICBpZiBsaXF1aWRhdGVkID09IGl0ZW0KKyAgICAgICAgICAgIGl0ZW0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhc19saXF1aWQobGlxdWlkYXRlZCkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIGl0ZW0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUGFyc2UgYSBzdHJpbmcgdG8gYSBMaXF1aWQgQ29uZGl0aW9uCisgICAgcHJpdmF0ZQorICAgIGRlZiBwYXJzZV9jb25kaXRpb24oZXhwKQorICAgICAgcGFyc2VyID0gTGlxdWlkOjpQYXJzZXIubmV3KGV4cCkKKyAgICAgIGxlZnRfZXhwciA9IHBhcnNlci5leHByZXNzaW9uCisgICAgICBvcGVyYXRvciA9IHBhcnNlci5jb25zdW1lPyg6Y29tcGFyaXNvbikKKyAgICAgIGNvbmRpdGlvbiA9CisgICAgICAgIGlmIG9wZXJhdG9yCisgICAgICAgICAgTGlxdWlkOjpDb25kaXRpb24ubmV3KExpcXVpZDo6RXhwcmVzc2lvbi5wYXJzZShsZWZ0X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlxdWlkOjpFeHByZXNzaW9uLnBhcnNlKHBhcnNlci5leHByZXNzaW9uKSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIExpcXVpZDo6Q29uZGl0aW9uLm5ldyhMaXF1aWQ6OkV4cHJlc3Npb24ucGFyc2UobGVmdF9leHByKSkKKyAgICAgICAgZW5kCisgICAgICBwYXJzZXIuY29uc3VtZSg6ZW5kX29mX3N0cmluZykKKworICAgICAgY29uZGl0aW9uCisgICAgZW5kCisKKyAgZW5kCitlbmQKKworTGlxdWlkOjpUZW1wbGF0ZS5yZWdpc3Rlcl9maWx0ZXIoCisgIEpla3lsbDo6RmlsdGVycworKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZmlsdGVycy9ncm91cGluZ19maWx0ZXJzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZmlsdGVycy9ncm91cGluZ19maWx0ZXJzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDI5MjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9maWx0ZXJzL2dyb3VwaW5nX2ZpbHRlcnMucmIKQEAgLTAsMCArMSw2MyBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgRmlsdGVycworICAgIG1vZHVsZSBHcm91cGluZ0ZpbHRlcnMKKyAgICAgICMgR3JvdXAgYW4gYXJyYXkgb2YgaXRlbXMgYnkgYSBwcm9wZXJ0eQorICAgICAgIworICAgICAgIyBpbnB1dCAtIHRoZSBpbnB1dHRlZCBFbnVtZXJhYmxlCisgICAgICAjIHByb3BlcnR5IC0gdGhlIHByb3BlcnR5CisgICAgICAjCisgICAgICAjIFJldHVybnMgYW4gYXJyYXkgb2YgSGFzaGVzLCBlYWNoIGxvb2tpbmcgc29tZXRoaW5nIGxpa2UgdGhpczoKKyAgICAgICMgIHsibmFtZSIgID0+ICJsYXJyeSIKKyAgICAgICMgICAiaXRlbXMiID0+IFsuLi5dIH0gIyBhbGwgdGhlIGl0ZW1zIHdoZXJlIGBwcm9wZXJ0eWAgPT0gImxhcnJ5IgorICAgICAgZGVmIGdyb3VwX2J5KGlucHV0LCBwcm9wZXJ0eSkKKyAgICAgICAgaWYgZ3JvdXBhYmxlPyhpbnB1dCkKKyAgICAgICAgICBncm91cHMgPSBpbnB1dC5ncm91cF9ieSB7IHxpdGVtfCBpdGVtX3Byb3BlcnR5KGl0ZW0sIHByb3BlcnR5KS50b19zIH0KKyAgICAgICAgICBncm91cGVkX2FycmF5KGdyb3VwcykKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlucHV0CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgR3JvdXAgYW4gYXJyYXkgb2YgaXRlbXMgYnkgYW4gZXhwcmVzc2lvbgorICAgICAgIworICAgICAgIyBpbnB1dCAtIHRoZSBvYmplY3QgYXJyYXkKKyAgICAgICMgdmFyaWFibGUgLSB0aGUgdmFyaWFibGUgdG8gYXNzaWduIGVhY2ggaXRlbSB0byBpbiB0aGUgZXhwcmVzc2lvbgorICAgICAgIyBleHByZXNzaW9uIC1hIExpcXVpZCBjb21wYXJpc29uIGV4cHJlc3Npb24gcGFzc2VkIGluIGFzIGEgc3RyaW5nCisgICAgICAjCisgICAgICAjIFJldHVybnMgdGhlIGZpbHRlcmVkIGFycmF5IG9mIG9iamVjdHMKKyAgICAgIGRlZiBncm91cF9ieV9leHAoaW5wdXQsIHZhcmlhYmxlLCBleHByZXNzaW9uKQorICAgICAgICByZXR1cm4gaW5wdXQgdW5sZXNzIGdyb3VwYWJsZT8oaW5wdXQpCisKKyAgICAgICAgcGFyc2VkX2V4cHIgPSBwYXJzZV9leHByZXNzaW9uKGV4cHJlc3Npb24pCisgICAgICAgIEBjb250ZXh0LnN0YWNrIGRvCisgICAgICAgICAgZ3JvdXBzID0gaW5wdXQuZ3JvdXBfYnkgZG8gfGl0ZW18CisgICAgICAgICAgICBAY29udGV4dFt2YXJpYWJsZV0gPSBpdGVtCisgICAgICAgICAgICBwYXJzZWRfZXhwci5yZW5kZXIoQGNvbnRleHQpCisgICAgICAgICAgZW5kCisgICAgICAgICAgZ3JvdXBlZF9hcnJheShncm91cHMpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKyAgICAgIGRlZiBwYXJzZV9leHByZXNzaW9uKHN0cikKKyAgICAgICAgTGlxdWlkOjpWYXJpYWJsZS5uZXcoc3RyLCBMaXF1aWQ6OlBhcnNlQ29udGV4dC5uZXcpCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorICAgICAgZGVmIGdyb3VwYWJsZT8oZWxlbWVudCkKKyAgICAgICAgZWxlbWVudC5yZXNwb25kX3RvPyg6Z3JvdXBfYnkpCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorICAgICAgZGVmIGdyb3VwZWRfYXJyYXkoZ3JvdXBzKQorICAgICAgICBncm91cHMuZWFjaF93aXRoX29iamVjdChbXSkgZG8gfGl0ZW0sIGFycmF5fAorICAgICAgICAgIGFycmF5IDw8IHsKKyAgICAgICAgICAgICJuYW1lIiAgPT4gaXRlbS5maXJzdCwKKyAgICAgICAgICAgICJpdGVtcyIgPT4gaXRlbS5sYXN0LAorICAgICAgICAgICAgInNpemUiICA9PiBpdGVtLmxhc3Quc2l6ZSwKKyAgICAgICAgICB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9maWx0ZXJzL3VybF9maWx0ZXJzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZmlsdGVycy91cmxfZmlsdGVycy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzE1MTgzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZmlsdGVycy91cmxfZmlsdGVycy5yYgpAQCAtMCwwICsxLDU4IEBACityZXF1aXJlICJhZGRyZXNzYWJsZS91cmkiCisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIEZpbHRlcnMKKyAgICBtb2R1bGUgVVJMRmlsdGVycworICAgICAgIyBQcm9kdWNlcyBhbiBhYnNvbHV0ZSBVUkwgYmFzZWQgb24gc2l0ZS51cmwgYW5kIHNpdGUuYmFzZXVybC4KKyAgICAgICMKKyAgICAgICMgaW5wdXQgLSB0aGUgVVJMIHRvIG1ha2UgYWJzb2x1dGUuCisgICAgICAjCisgICAgICAjIFJldHVybnMgdGhlIGFic29sdXRlIFVSTCBhcyBhIFN0cmluZy4KKyAgICAgIGRlZiBhYnNvbHV0ZV91cmwoaW5wdXQpCisgICAgICAgIHJldHVybiBpZiBpbnB1dC5uaWw/CisgICAgICAgIHJldHVybiBpbnB1dCBpZiBBZGRyZXNzYWJsZTo6VVJJLnBhcnNlKGlucHV0LnRvX3MpLmFic29sdXRlPworICAgICAgICBzaXRlID0gQGNvbnRleHQucmVnaXN0ZXJzWzpzaXRlXQorICAgICAgICByZXR1cm4gcmVsYXRpdmVfdXJsKGlucHV0KS50b19zIGlmIHNpdGUuY29uZmlnWyJ1cmwiXS5uaWw/CisgICAgICAgIEFkZHJlc3NhYmxlOjpVUkkucGFyc2UoCisgICAgICAgICAgc2l0ZS5jb25maWdbInVybCJdLnRvX3MgKyByZWxhdGl2ZV91cmwoaW5wdXQpCisgICAgICAgICkubm9ybWFsaXplLnRvX3MKKyAgICAgIGVuZAorCisgICAgICAjIFByb2R1Y2VzIGEgVVJMIHJlbGF0aXZlIHRvIHRoZSBkb21haW4gcm9vdCBiYXNlZCBvbiBzaXRlLmJhc2V1cmwuCisgICAgICAjCisgICAgICAjIGlucHV0IC0gdGhlIFVSTCB0byBtYWtlIHJlbGF0aXZlIHRvIHRoZSBkb21haW4gcm9vdAorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgVVJMIHJlbGF0aXZlIHRvIHRoZSBkb21haW4gcm9vdCBhcyBhIFN0cmluZy4KKyAgICAgIGRlZiByZWxhdGl2ZV91cmwoaW5wdXQpCisgICAgICAgIHJldHVybiBpZiBpbnB1dC5uaWw/CisgICAgICAgIHBhcnRzID0gW3Nhbml0aXplZF9iYXNldXJsLCBpbnB1dF0KKyAgICAgICAgQWRkcmVzc2FibGU6OlVSSS5wYXJzZSgKKyAgICAgICAgICBwYXJ0cy5jb21wYWN0Lm1hcCB7IHxwYXJ0fCBlbnN1cmVfbGVhZGluZ19zbGFzaChwYXJ0LnRvX3MpIH0uam9pbgorICAgICAgICApLm5vcm1hbGl6ZS50b19zCisgICAgICBlbmQKKworICAgICAgIyBTdHJpcHMgdHJhaWxpbmcgYC9pbmRleC5odG1sYCBmcm9tIFVSTHMgdG8gY3JlYXRlIHByZXR0eSBwZXJtYWxpbmtzCisgICAgICAjCisgICAgICAjIGlucHV0IC0gdGhlIFVSTCB3aXRoIGEgcG9zc2libGUgYC9pbmRleC5odG1sYAorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgVVJMIHdpdGggdGhlIHRyYWlsaW5nIGAvaW5kZXguaHRtbGAgcmVtb3ZlZAorICAgICAgZGVmIHN0cmlwX2luZGV4KGlucHV0KQorICAgICAgICByZXR1cm4gaWYgaW5wdXQubmlsPyB8fCBpbnB1dC50b19zLmVtcHR5PworICAgICAgICBpbnB1dC5zdWIoJXIhL2luZGV4XC5odG1sPyQhLCAiLyIpCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBkZWYgc2FuaXRpemVkX2Jhc2V1cmwKKyAgICAgICAgc2l0ZSA9IEBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV0KKyAgICAgICAgc2l0ZS5jb25maWdbImJhc2V1cmwiXS50b19zLmNob21wKCIvIikKKyAgICAgIGVuZAorCisgICAgICBkZWYgZW5zdXJlX2xlYWRpbmdfc2xhc2goaW5wdXQpCisgICAgICAgIHJldHVybiBpbnB1dCBpZiBpbnB1dC5uaWw/IHx8IGlucHV0LmVtcHR5PyB8fCBpbnB1dC5zdGFydF93aXRoPygiLyIpCisgICAgICAgICIvI3tpbnB1dH0iCisgICAgICBlbmQKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZnJvbnRtYXR0ZXJfZGVmYXVsdHMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9mcm9udG1hdHRlcl9kZWZhdWx0cy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2JmYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZnJvbnRtYXR0ZXJfZGVmYXVsdHMucmIKQEAgLTAsMCArMSwxOTUgQEAKK21vZHVsZSBKZWt5bGwKKyAgIyBUaGlzIGNsYXNzIGhhbmRsZXMgY3VzdG9tIGRlZmF1bHRzIGZvciBZQU1MIGZyb250bWF0dGVyIHNldHRpbmdzLgorICAjIFRoZXNlIGFyZSBzZXQgaW4gX2NvbmZpZy55bWwgYW5kIGFwcGx5IGJvdGggdG8gaW50ZXJuYWwgdXNlIChlLmcuIGxheW91dCkKKyAgIyBhbmQgdGhlIGRhdGEgYXZhaWxhYmxlIHRvIGxpcXVpZC4KKyAgIworICAjIEl0IGlzIGV4cG9zZWQgdmlhIHRoZSBmcm9udG1hdHRlcl9kZWZhdWx0cyBtZXRob2Qgb24gdGhlIHNpdGUgY2xhc3MuCisgIGNsYXNzIEZyb250bWF0dGVyRGVmYXVsdHMKKyAgICAjIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlLgorICAgIGRlZiBpbml0aWFsaXplKHNpdGUpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICBlbmQKKworICAgIGRlZiB1cGRhdGVfZGVwcmVjYXRlZF90eXBlcyhzZXQpCisgICAgICByZXR1cm4gc2V0IHVubGVzcyBzZXQua2V5Pygic2NvcGUiKSAmJiBzZXRbInNjb3BlIl0ua2V5PygidHlwZSIpCisKKyAgICAgIHNldFsic2NvcGUiXVsidHlwZSJdID0KKyAgICAgICAgY2FzZSBzZXRbInNjb3BlIl1bInR5cGUiXQorICAgICAgICB3aGVuICJwYWdlIgorICAgICAgICAgIERlcHJlY2F0b3IuZGVmYXVsdHNfZGVwcmVjYXRlX3R5cGUoInBhZ2UiLCAicGFnZXMiKQorICAgICAgICAgICJwYWdlcyIKKyAgICAgICAgd2hlbiAicG9zdCIKKyAgICAgICAgICBEZXByZWNhdG9yLmRlZmF1bHRzX2RlcHJlY2F0ZV90eXBlKCJwb3N0IiwgInBvc3RzIikKKyAgICAgICAgICAicG9zdHMiCisgICAgICAgIHdoZW4gImRyYWZ0IgorICAgICAgICAgIERlcHJlY2F0b3IuZGVmYXVsdHNfZGVwcmVjYXRlX3R5cGUoImRyYWZ0IiwgImRyYWZ0cyIpCisgICAgICAgICAgImRyYWZ0cyIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNldFsic2NvcGUiXVsidHlwZSJdCisgICAgICAgIGVuZAorCisgICAgICBzZXQKKyAgICBlbmQKKworICAgIGRlZiBlbnN1cmVfdGltZSEoc2V0KQorICAgICAgcmV0dXJuIHNldCB1bmxlc3Mgc2V0LmtleT8oInZhbHVlcyIpICYmIHNldFsidmFsdWVzIl0ua2V5PygiZGF0ZSIpCisgICAgICByZXR1cm4gc2V0IGlmIHNldFsidmFsdWVzIl1bImRhdGUiXS5pc19hPyhUaW1lKQorICAgICAgc2V0WyJ2YWx1ZXMiXVsiZGF0ZSJdID0gVXRpbHMucGFyc2VfZGF0ZSgKKyAgICAgICAgc2V0WyJ2YWx1ZXMiXVsiZGF0ZSJdLAorICAgICAgICAiQW4gaW52YWxpZCBkYXRlIGZvcm1hdCB3YXMgZm91bmQgaW4gYSBmcm9udC1tYXR0ZXIgZGVmYXVsdCBzZXQ6ICN7c2V0fSIKKyAgICAgICkKKyAgICAgIHNldAorICAgIGVuZAorCisgICAgIyBGaW5kcyBhIGRlZmF1bHQgdmFsdWUgZm9yIGEgZ2l2ZW4gc2V0dGluZywgZmlsdGVyZWQgYnkgcGF0aCBhbmQgdHlwZQorICAgICMKKyAgICAjIHBhdGggLSB0aGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZSkgb2YgdGhlIHBhZ2UsCisgICAgIyBwb3N0IG9yIDpkcmFmdCB0aGUgZGVmYXVsdCBpcyB1c2VkIGluCisgICAgIyB0eXBlIC0gYSBzeW1ib2wgaW5kaWNhdGluZyB3aGV0aGVyIGEgOnBhZ2UsCisgICAgIyBhIDpwb3N0IG9yIGEgOmRyYWZ0IGNhbGxzIHRoaXMgbWV0aG9kCisgICAgIworICAgICMgUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvciBuaWwgaWYgbm9uZSB3YXMgZm91bmQKKyAgICBkZWYgZmluZChwYXRoLCB0eXBlLCBzZXR0aW5nKQorICAgICAgdmFsdWUgPSBuaWwKKyAgICAgIG9sZF9zY29wZSA9IG5pbAorCisgICAgICBtYXRjaGluZ19zZXRzKHBhdGgsIHR5cGUpLmVhY2ggZG8gfHNldHwKKyAgICAgICAgaWYgc2V0WyJ2YWx1ZXMiXS5rZXk/KHNldHRpbmcpICYmIGhhc19wcmVjZWRlbmNlPyhvbGRfc2NvcGUsIHNldFsic2NvcGUiXSkKKyAgICAgICAgICB2YWx1ZSA9IHNldFsidmFsdWVzIl1bc2V0dGluZ10KKyAgICAgICAgICBvbGRfc2NvcGUgPSBzZXRbInNjb3BlIl0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIHZhbHVlCisgICAgZW5kCisKKyAgICAjIENvbGxlY3RzIGEgaGFzaCB3aXRoIGFsbCBkZWZhdWx0IHZhbHVlcyBmb3IgYSBwYWdlIG9yIHBvc3QKKyAgICAjCisgICAgIyBwYXRoIC0gdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHBhZ2Ugb3IgcG9zdAorICAgICMgdHlwZSAtIGEgc3ltYm9sIGluZGljYXRpbmcgdGhlIHR5cGUgKDpwb3N0LCA6cGFnZSBvciA6ZHJhZnQpCisgICAgIworICAgICMgUmV0dXJucyBhIGhhc2ggd2l0aCBhbGwgZGVmYXVsdCB2YWx1ZXMgKGFuIGVtcHR5IGhhc2ggaWYgdGhlcmUgYXJlIG5vbmUpCisgICAgZGVmIGFsbChwYXRoLCB0eXBlKQorICAgICAgZGVmYXVsdHMgPSB7fQorICAgICAgb2xkX3Njb3BlID0gbmlsCisgICAgICBtYXRjaGluZ19zZXRzKHBhdGgsIHR5cGUpLmVhY2ggZG8gfHNldHwKKyAgICAgICAgaWYgaGFzX3ByZWNlZGVuY2U/KG9sZF9zY29wZSwgc2V0WyJzY29wZSJdKQorICAgICAgICAgIGRlZmF1bHRzID0gVXRpbHMuZGVlcF9tZXJnZV9oYXNoZXMoZGVmYXVsdHMsIHNldFsidmFsdWVzIl0pCisgICAgICAgICAgb2xkX3Njb3BlID0gc2V0WyJzY29wZSJdCisgICAgICAgIGVsc2UKKyAgICAgICAgICBkZWZhdWx0cyA9IFV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzKHNldFsidmFsdWVzIl0sIGRlZmF1bHRzKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgZGVmYXVsdHMKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgICMgQ2hlY2tzIGlmIGEgZ2l2ZW4gZGVmYXVsdCBzZXR0aW5nIHNjb3BlIG1hdGNoZXMgdGhlIGdpdmVuIHBhdGggYW5kIHR5cGUKKyAgICAjCisgICAgIyBzY29wZSAtIHRoZSBoYXNoIGluZGljYXRpbmcgdGhlIHNjb3BlLCBhcyBkZWZpbmVkIGluIF9jb25maWcueW1sCisgICAgIyBwYXRoIC0gdGhlIHBhdGggdG8gY2hlY2sgZm9yCisgICAgIyB0eXBlIC0gdGhlIHR5cGUgKDpwb3N0LCA6cGFnZSBvciA6ZHJhZnQpIHRvIGNoZWNrIGZvcgorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2NvcGUgYXBwbGllcyB0byB0aGUgZ2l2ZW4gcGF0aCBhbmQgdHlwZQorICAgIGRlZiBhcHBsaWVzPyhzY29wZSwgcGF0aCwgdHlwZSkKKyAgICAgIGFwcGxpZXNfcGF0aD8oc2NvcGUsIHBhdGgpICYmIGFwcGxpZXNfdHlwZT8oc2NvcGUsIHR5cGUpCisgICAgZW5kCisKKyAgICBkZWYgYXBwbGllc19wYXRoPyhzY29wZSwgcGF0aCkKKyAgICAgIHJldHVybiB0cnVlIGlmICFzY29wZS5rZXk/KCJwYXRoIikgfHwgc2NvcGVbInBhdGgiXS5lbXB0eT8KKworICAgICAgc2NvcGVfcGF0aCA9IFBhdGhuYW1lLm5ldyhzY29wZVsicGF0aCJdKQorICAgICAgUGF0aG5hbWUubmV3KHNhbml0aXplX3BhdGgocGF0aCkpLmFzY2VuZCBkbyB8YXNjZW5kZWRfcGF0aHwKKyAgICAgICAgaWYgYXNjZW5kZWRfcGF0aC50b19zID09IHNjb3BlX3BhdGgudG9fcworICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIERldGVybWluZXMgd2hldGhlciB0aGUgc2NvcGUgYXBwbGllcyB0byB0eXBlLgorICAgICMgVGhlIHNjb3BlIGFwcGxpZXMgdG8gdGhlIHR5cGUgaWY6CisgICAgIyAgIDEuIG5vICd0eXBlJyBpcyBzcGVjaWZpZWQKKyAgICAjICAgMi4gdGhlICd0eXBlJyBpbiB0aGUgc2NvcGUgaXMgdGhlIHNhbWUgYXMgdGhlIHR5cGUgYXNrZWQgYWJvdXQKKyAgICAjCisgICAgIyBzY29wZSAtIHRoZSBIYXNoIGRlZmF1bHRzIHNldCBiZWluZyBhc2tlZCBhYm91dCBhcHBsaWNhdGlvbgorICAgICMgdHlwZSAgLSB0aGUgdHlwZSBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgcHJvY2Vzc2VkIC8gYXNrZWQgYWJvdXQKKyAgICAjICAgICAgICAgaXRzIGRlZmF1bHRzLgorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCwKKyAgICAjICAgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICBkZWYgYXBwbGllc190eXBlPyhzY29wZSwgdHlwZSkKKyAgICAgICFzY29wZS5rZXk/KCJ0eXBlIikgfHwgc2NvcGVbInR5cGUiXS5lcWw/KHR5cGUudG9fcykKKyAgICBlbmQKKworICAgICMgQ2hlY2tzIGlmIGEgZ2l2ZW4gc2V0IG9mIGRlZmF1bHQgdmFsdWVzIGlzIHZhbGlkCisgICAgIworICAgICMgc2V0IC0gdGhlIGRlZmF1bHQgdmFsdWUgaGFzaCwgYXMgZGVmaW5lZCBpbiBfY29uZmlnLnltbAorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2V0IGlzIHZhbGlkIGFuZCBjYW4gYmUgdXNlZCBpbiB0aGlzIGNsYXNzCisgICAgZGVmIHZhbGlkPyhzZXQpCisgICAgICBzZXQuaXNfYT8oSGFzaCkgJiYgc2V0WyJ2YWx1ZXMiXS5pc19hPyhIYXNoKQorICAgIGVuZAorCisgICAgIyBEZXRlcm1pbmVzIGlmIGEgbmV3IHNjb3BlIGhhcyBwcmVjZWRlbmNlIG92ZXIgYW4gb2xkIG9uZQorICAgICMKKyAgICAjIG9sZF9zY29wZSAtIHRoZSBvbGQgc2NvcGUgaGFzaCwgb3IgbmlsIGlmIHRoZXJlJ3Mgbm9uZQorICAgICMgbmV3X3Njb3BlIC0gdGhlIG5ldyBzY29wZSBoYXNoCisgICAgIworICAgICMgUmV0dXJucyB0cnVlIGlmIHRoZSBuZXcgc2NvcGUgaGFzIHByZWNlZGVuY2Ugb3ZlciB0aGUgb2xkZXIKKyAgICAjIHJ1Ym9jb3A6IGRpc2FibGUgUHJlZGljYXRlTmFtZQorICAgIGRlZiBoYXNfcHJlY2VkZW5jZT8ob2xkX3Njb3BlLCBuZXdfc2NvcGUpCisgICAgICByZXR1cm4gdHJ1ZSBpZiBvbGRfc2NvcGUubmlsPworCisgICAgICBuZXdfcGF0aCA9IHNhbml0aXplX3BhdGgobmV3X3Njb3BlWyJwYXRoIl0pCisgICAgICBvbGRfcGF0aCA9IHNhbml0aXplX3BhdGgob2xkX3Njb3BlWyJwYXRoIl0pCisKKyAgICAgIGlmIG5ld19wYXRoLmxlbmd0aCAhPSBvbGRfcGF0aC5sZW5ndGgKKyAgICAgICAgbmV3X3BhdGgubGVuZ3RoID49IG9sZF9wYXRoLmxlbmd0aAorICAgICAgZWxzaWYgbmV3X3Njb3BlLmtleT8oInR5cGUiKQorICAgICAgICB0cnVlCisgICAgICBlbHNlCisgICAgICAgICFvbGRfc2NvcGUua2V5PyAidHlwZSIKKyAgICAgIGVuZAorICAgIGVuZAorICAgICMgcnVib2NvcDogZW5hYmxlIFByZWRpY2F0ZU5hbWUKKworICAgICMgQ29sbGVjdHMgYSBsaXN0IG9mIHNldHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0aCBhbmQgdHlwZQorICAgICMKKyAgICAjIFJldHVybnMgYW4gYXJyYXkgb2YgaGFzaGVzCisgICAgZGVmIG1hdGNoaW5nX3NldHMocGF0aCwgdHlwZSkKKyAgICAgIHZhbGlkX3NldHMuc2VsZWN0IGRvIHxzZXR8CisgICAgICAgICFzZXQua2V5Pygic2NvcGUiKSB8fCBhcHBsaWVzPyhzZXRbInNjb3BlIl0sIHBhdGgsIHR5cGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgdmFsaWQgc2V0cworICAgICMKKyAgICAjIFRoaXMgaXMgbm90IGNhY2hlZCB0byBhbGxvdyBwbHVnaW5zIHRvIG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbgorICAgICMgYW5kIGhhdmUgdGhlaXIgY2hhbmdlcyB0YWtlIGVmZmVjdAorICAgICMKKyAgICAjIFJldHVybnMgYW4gYXJyYXkgb2YgaGFzaGVzCisgICAgZGVmIHZhbGlkX3NldHMKKyAgICAgIHNldHMgPSBAc2l0ZS5jb25maWdbImRlZmF1bHRzIl0KKyAgICAgIHJldHVybiBbXSB1bmxlc3Mgc2V0cy5pc19hPyhBcnJheSkKKworICAgICAgc2V0cy5tYXAgZG8gfHNldHwKKyAgICAgICAgaWYgdmFsaWQ/KHNldCkKKyAgICAgICAgICBlbnN1cmVfdGltZSEodXBkYXRlX2RlcHJlY2F0ZWRfdHlwZXMoc2V0KSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiRGVmYXVsdHM6IiwgIkFuIGludmFsaWQgZnJvbnQtbWF0dGVyIGRlZmF1bHQgc2V0IHdhcyBmb3VuZDoiCisgICAgICAgICAgSmVreWxsLmxvZ2dlci53YXJuIHNldC50b19zCisgICAgICAgICAgbmlsCisgICAgICAgIGVuZAorICAgICAgZW5kLmNvbXBhY3QKKyAgICBlbmQKKworICAgICMgU2FuaXRpemVzIHRoZSBnaXZlbiBwYXRoIGJ5IHJlbW92aW5nIGEgbGVhZGluZyBhbmQgYWRkaW5nIGEgdHJhaWxpbmcgc2xhc2gKKyAgICBkZWYgc2FuaXRpemVfcGF0aChwYXRoKQorICAgICAgaWYgcGF0aC5uaWw/IHx8IHBhdGguZW1wdHk/CisgICAgICAgICIiCisgICAgICBlbHNlCisgICAgICAgIHBhdGguZ3N1YiglciFcQS98KD88PVteL10pXHohLCAiIi5mcmVlemUpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2dlbmVyYXRvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2dlbmVyYXRvci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdjMGYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvZ2VuZXJhdG9yLnJiCkBAIC0wLDAgKzEsMyBAQAorbW9kdWxlIEpla3lsbAorICBHZW5lcmF0b3IgPSBDbGFzcy5uZXcoUGx1Z2luKQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9ob29rcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2hvb2tzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MWRjZTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9ob29rcy5yYgpAQCAtMCwwICsxLDEwMiBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgSG9va3MKKyAgICBERUZBVUxUX1BSSU9SSVRZID0gMjAKKworICAgICMgY29tcGF0aWJpbGl0eSBsYXllciBmb3Igb2N0b3ByZXNzLWhvb2tzIHVzZXJzCisgICAgUFJJT1JJVFlfTUFQID0geworICAgICAgOmxvdyAgICA9PiAxMCwKKyAgICAgIDpub3JtYWwgPT4gMjAsCisgICAgICA6aGlnaCAgID0+IDMwLAorICAgIH0uZnJlZXplCisKKyAgICAjIGluaXRpYWwgZW1wdHkgaG9va3MKKyAgICBAcmVnaXN0cnkgPSB7CisgICAgICA6c2l0ZSAgICAgID0+IHsKKyAgICAgICAgOmFmdGVyX2luaXQgID0+IFtdLAorICAgICAgICA6YWZ0ZXJfcmVzZXQgPT4gW10sCisgICAgICAgIDpwb3N0X3JlYWQgICA9PiBbXSwKKyAgICAgICAgOnByZV9yZW5kZXIgID0+IFtdLAorICAgICAgICA6cG9zdF9yZW5kZXIgPT4gW10sCisgICAgICAgIDpwb3N0X3dyaXRlICA9PiBbXSwKKyAgICAgIH0sCisgICAgICA6cGFnZXMgICAgID0+IHsKKyAgICAgICAgOnBvc3RfaW5pdCAgID0+IFtdLAorICAgICAgICA6cHJlX3JlbmRlciAgPT4gW10sCisgICAgICAgIDpwb3N0X3JlbmRlciA9PiBbXSwKKyAgICAgICAgOnBvc3Rfd3JpdGUgID0+IFtdLAorICAgICAgfSwKKyAgICAgIDpwb3N0cyAgICAgPT4geworICAgICAgICA6cG9zdF9pbml0ICAgPT4gW10sCisgICAgICAgIDpwcmVfcmVuZGVyICA9PiBbXSwKKyAgICAgICAgOnBvc3RfcmVuZGVyID0+IFtdLAorICAgICAgICA6cG9zdF93cml0ZSAgPT4gW10sCisgICAgICB9LAorICAgICAgOmRvY3VtZW50cyA9PiB7CisgICAgICAgIDpwb3N0X2luaXQgICA9PiBbXSwKKyAgICAgICAgOnByZV9yZW5kZXIgID0+IFtdLAorICAgICAgICA6cG9zdF9yZW5kZXIgPT4gW10sCisgICAgICAgIDpwb3N0X3dyaXRlICA9PiBbXSwKKyAgICAgIH0sCisgICAgfQorCisgICAgIyBtYXAgb2YgYWxsIGhvb2tzIGFuZCB0aGVpciBwcmlvcml0aWVzCisgICAgQGhvb2tfcHJpb3JpdHkgPSB7fQorCisgICAgTm90QXZhaWxhYmxlID0gQ2xhc3MubmV3KFJ1bnRpbWVFcnJvcikKKyAgICBVbmNhbGxhYmxlID0gQ2xhc3MubmV3KFJ1bnRpbWVFcnJvcikKKworICAgICMgcmVnaXN0ZXIgaG9vayhzKSB0byBiZSBjYWxsZWQgbGF0ZXIsIHB1YmxpYyBBUEkKKyAgICBkZWYgc2VsZi5yZWdpc3Rlcihvd25lcnMsIGV2ZW50LCBwcmlvcml0eTogREVGQVVMVF9QUklPUklUWSwgJmJsb2NrKQorICAgICAgQXJyYXkob3duZXJzKS5lYWNoIGRvIHxvd25lcnwKKyAgICAgICAgcmVnaXN0ZXJfb25lKG93bmVyLCBldmVudCwgcHJpb3JpdHlfdmFsdWUocHJpb3JpdHkpLCAmYmxvY2spCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgRW5zdXJlIHRoZSBwcmlvcml0eSBpcyBhIEZpeG51bQorICAgIGRlZiBzZWxmLnByaW9yaXR5X3ZhbHVlKHByaW9yaXR5KQorICAgICAgcmV0dXJuIHByaW9yaXR5IGlmIHByaW9yaXR5LmlzX2E/KEludGVnZXIpCisgICAgICBQUklPUklUWV9NQVBbcHJpb3JpdHldIHx8IERFRkFVTFRfUFJJT1JJVFkKKyAgICBlbmQKKworICAgICMgcmVnaXN0ZXIgYSBzaW5nbGUgaG9vayB0byBiZSBjYWxsZWQgbGF0ZXIsIGludGVybmFsIEFQSQorICAgIGRlZiBzZWxmLnJlZ2lzdGVyX29uZShvd25lciwgZXZlbnQsIHByaW9yaXR5LCAmYmxvY2spCisgICAgICBAcmVnaXN0cnlbb3duZXJdIHx8PSB7CisgICAgICAgIDpwb3N0X2luaXQgICA9PiBbXSwKKyAgICAgICAgOnByZV9yZW5kZXIgID0+IFtdLAorICAgICAgICA6cG9zdF9yZW5kZXIgPT4gW10sCisgICAgICAgIDpwb3N0X3dyaXRlICA9PiBbXSwKKyAgICAgIH0KKworICAgICAgdW5sZXNzIEByZWdpc3RyeVtvd25lcl1bZXZlbnRdCisgICAgICAgIHJhaXNlIE5vdEF2YWlsYWJsZSwgIkludmFsaWQgaG9vay4gI3tvd25lcn0gc3VwcG9ydHMgb25seSB0aGUgIiBcCisgICAgICAgICAgImZvbGxvd2luZyBob29rcyAje0ByZWdpc3RyeVtvd25lcl0ua2V5cy5pbnNwZWN0fSIKKyAgICAgIGVuZAorCisgICAgICB1bmxlc3MgYmxvY2sucmVzcG9uZF90bz8gOmNhbGwKKyAgICAgICAgcmFpc2UgVW5jYWxsYWJsZSwgIkhvb2tzIG11c3QgcmVzcG9uZCB0byA6Y2FsbCIKKyAgICAgIGVuZAorCisgICAgICBpbnNlcnRfaG9vayBvd25lciwgZXZlbnQsIHByaW9yaXR5LCAmYmxvY2sKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmluc2VydF9ob29rKG93bmVyLCBldmVudCwgcHJpb3JpdHksICZibG9jaykKKyAgICAgIEBob29rX3ByaW9yaXR5W2Jsb2NrXSA9IFstcHJpb3JpdHksIEBob29rX3ByaW9yaXR5LnNpemVdCisgICAgICBAcmVnaXN0cnlbb3duZXJdW2V2ZW50XSA8PCBibG9jaworICAgIGVuZAorCisgICAgIyBpbnRlcmZhY2UgZm9yIEpla3lsbCBjb3JlIGNvbXBvbmVudHMgdG8gdHJpZ2dlciBob29rcworICAgIGRlZiBzZWxmLnRyaWdnZXIob3duZXIsIGV2ZW50LCAqYXJncykKKyAgICAgICMgcHJvY2VlZCBvbmx5IGlmIHRoZXJlIGFyZSBob29rcyB0byBjYWxsCisgICAgICByZXR1cm4gdW5sZXNzIEByZWdpc3RyeVtvd25lcl0KKyAgICAgIHJldHVybiB1bmxlc3MgQHJlZ2lzdHJ5W293bmVyXVtldmVudF0KKworICAgICAgIyBob29rcyB0byBjYWxsIGZvciB0aGlzIG93bmVyIGFuZCBldmVudAorICAgICAgaG9va3MgPSBAcmVnaXN0cnlbb3duZXJdW2V2ZW50XQorCisgICAgICAjIHNvcnQgYW5kIGNhbGwgaG9va3MgYWNjb3JkaW5nIHRvIHByaW9yaXR5IGFuZCBsb2FkIG9yZGVyCisgICAgICBob29rcy5zb3J0X2J5IHsgfGh8IEBob29rX3ByaW9yaXR5W2hdIH0uZWFjaCBkbyB8aG9va3wKKyAgICAgICAgaG9vay5jYWxsKCphcmdzKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9sYXlvdXQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9sYXlvdXQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwOGFkMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2xheW91dC5yYgpAQCAtMCwwICsxLDYwIEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIExheW91dAorICAgIGluY2x1ZGUgQ29udmVydGlibGUKKworICAgICMgR2V0cyB0aGUgU2l0ZSBvYmplY3QuCisgICAgYXR0cl9yZWFkZXIgOnNpdGUKKworICAgICMgR2V0cyB0aGUgbmFtZSBvZiB0aGlzIGxheW91dC4KKyAgICBhdHRyX3JlYWRlciA6bmFtZQorCisgICAgIyBHZXRzIHRoZSBwYXRoIHRvIHRoaXMgbGF5b3V0LgorICAgIGF0dHJfcmVhZGVyIDpwYXRoCisKKyAgICAjIEdldHMgdGhlIHBhdGggdG8gdGhpcyBsYXlvdXQgcmVsYXRpdmUgdG8gaXRzIGJhc2UKKyAgICBhdHRyX3JlYWRlciA6cmVsYXRpdmVfcGF0aAorCisgICAgIyBHZXRzL1NldHMgdGhlIGV4dGVuc2lvbiBvZiB0aGlzIGxheW91dC4KKyAgICBhdHRyX2FjY2Vzc29yIDpleHQKKworICAgICMgR2V0cy9TZXRzIHRoZSBIYXNoIHRoYXQgaG9sZHMgdGhlIG1ldGFkYXRhIGZvciB0aGlzIGxheW91dC4KKyAgICBhdHRyX2FjY2Vzc29yIDpkYXRhCisKKyAgICAjIEdldHMvU2V0cyB0aGUgY29udGVudCBvZiB0aGlzIGxheW91dC4KKyAgICBhdHRyX2FjY2Vzc29yIDpjb250ZW50CisKKyAgICAjIEluaXRpYWxpemUgYSBuZXcgTGF5b3V0LgorICAgICMKKyAgICAjIHNpdGUgLSBUaGUgU2l0ZS4KKyAgICAjIGJhc2UgLSBUaGUgU3RyaW5nIHBhdGggdG8gdGhlIHNvdXJjZS4KKyAgICAjIG5hbWUgLSBUaGUgU3RyaW5nIGZpbGVuYW1lIG9mIHRoZSBwb3N0IGZpbGUuCisgICAgZGVmIGluaXRpYWxpemUoc2l0ZSwgYmFzZSwgbmFtZSkKKyAgICAgIEBzaXRlID0gc2l0ZQorICAgICAgQGJhc2UgPSBiYXNlCisgICAgICBAbmFtZSA9IG5hbWUKKworICAgICAgaWYgc2l0ZS50aGVtZSAmJiBzaXRlLnRoZW1lLmxheW91dHNfcGF0aC5lcWw/KGJhc2UpCisgICAgICAgIEBiYXNlX2RpciA9IHNpdGUudGhlbWUucm9vdAorICAgICAgICBAcGF0aCA9IHNpdGUuaW5fdGhlbWVfZGlyKGJhc2UsIG5hbWUpCisgICAgICBlbHNlCisgICAgICAgIEBiYXNlX2RpciA9IHNpdGUuc291cmNlCisgICAgICAgIEBwYXRoID0gc2l0ZS5pbl9zb3VyY2VfZGlyKGJhc2UsIG5hbWUpCisgICAgICBlbmQKKyAgICAgIEByZWxhdGl2ZV9wYXRoID0gQHBhdGguc3ViKEBiYXNlX2RpciwgIiIpCisKKyAgICAgIHNlbGYuZGF0YSA9IHt9CisKKyAgICAgIHByb2Nlc3MobmFtZSkKKyAgICAgIHJlYWRfeWFtbChiYXNlLCBuYW1lKQorICAgIGVuZAorCisgICAgIyBFeHRyYWN0IGluZm9ybWF0aW9uIGZyb20gdGhlIGxheW91dCBmaWxlbmFtZS4KKyAgICAjCisgICAgIyBuYW1lIC0gVGhlIFN0cmluZyBmaWxlbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiBwcm9jZXNzKG5hbWUpCisgICAgICBzZWxmLmV4dCA9IEZpbGUuZXh0bmFtZShuYW1lKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvbGlxdWlkX2V4dGVuc2lvbnMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9saXF1aWRfZXh0ZW5zaW9ucy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE3ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvbGlxdWlkX2V4dGVuc2lvbnMucmIKQEAgLTAsMCArMSwyMiBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgTGlxdWlkRXh0ZW5zaW9ucworCisgICAgIyBMb29rdXAgYSBMaXF1aWQgdmFyaWFibGUgaW4gdGhlIGdpdmVuIGNvbnRleHQuCisgICAgIworICAgICMgY29udGV4dCAgLSB0aGUgTGlxdWlkIGNvbnRleHQgaW4gcXVlc3Rpb24uCisgICAgIyB2YXJpYWJsZSAtIHRoZSB2YXJpYWJsZSBuYW1lLCBhcyBhIHN0cmluZy4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIGNvbnRleHQKKyAgICAjICAgb3IgdGhlIHZhcmlhYmxlIG5hbWUgaWYgbm90IGZvdW5kLgorICAgIGRlZiBsb29rdXBfdmFyaWFibGUoY29udGV4dCwgdmFyaWFibGUpCisgICAgICBsb29rdXAgPSBjb250ZXh0CisKKyAgICAgIHZhcmlhYmxlLnNwbGl0KCIuIikuZWFjaCBkbyB8dmFsdWV8CisgICAgICAgIGxvb2t1cCA9IGxvb2t1cFt2YWx1ZV0KKyAgICAgIGVuZAorCisgICAgICBsb29rdXAgfHwgdmFyaWFibGUKKyAgICBlbmQKKworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvbGlxdWlkX3JlbmRlcmVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvbGlxdWlkX3JlbmRlcmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTkzMGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9saXF1aWRfcmVuZGVyZXIucmIKQEAgLTAsMCArMSw1MCBAQAorcmVxdWlyZSAiamVreWxsL2xpcXVpZF9yZW5kZXJlci9maWxlIgorcmVxdWlyZSAiamVreWxsL2xpcXVpZF9yZW5kZXJlci90YWJsZSIKKworbW9kdWxlIEpla3lsbAorICBjbGFzcyBMaXF1aWRSZW5kZXJlcgorICAgIGRlZiBpbml0aWFsaXplKHNpdGUpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICAgIExpcXVpZDo6VGVtcGxhdGUuZXJyb3JfbW9kZSA9IEBzaXRlLmNvbmZpZ1sibGlxdWlkIl1bImVycm9yX21vZGUiXS50b19zeW0KKyAgICAgIHJlc2V0CisgICAgZW5kCisKKyAgICBkZWYgcmVzZXQKKyAgICAgIEBzdGF0cyA9IHt9CisgICAgZW5kCisKKyAgICBkZWYgZmlsZShmaWxlbmFtZSkKKyAgICAgIGZpbGVuYW1lID0gQHNpdGUuaW5fc291cmNlX2RpcihmaWxlbmFtZSkuc3ViKAorICAgICAgICAlciFcQSN7UmVnZXhwLmVzY2FwZShAc2l0ZS5zb3VyY2UpfS8hLAorICAgICAgICAiIgorICAgICAgKQorCisgICAgICBMaXF1aWRSZW5kZXJlcjo6RmlsZS5uZXcoc2VsZiwgZmlsZW5hbWUpLnRhcCBkbworICAgICAgICBAc3RhdHNbZmlsZW5hbWVdIHx8PSB7fQorICAgICAgICBAc3RhdHNbZmlsZW5hbWVdWzpjb3VudF0gfHw9IDAKKyAgICAgICAgQHN0YXRzW2ZpbGVuYW1lXVs6Y291bnRdICs9IDEKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGluY3JlbWVudF9ieXRlcyhmaWxlbmFtZSwgYnl0ZXMpCisgICAgICBAc3RhdHNbZmlsZW5hbWVdWzpieXRlc10gfHw9IDAKKyAgICAgIEBzdGF0c1tmaWxlbmFtZV1bOmJ5dGVzXSArPSBieXRlcworICAgIGVuZAorCisgICAgZGVmIGluY3JlbWVudF90aW1lKGZpbGVuYW1lLCB0aW1lKQorICAgICAgQHN0YXRzW2ZpbGVuYW1lXVs6dGltZV0gfHw9IDAuMAorICAgICAgQHN0YXRzW2ZpbGVuYW1lXVs6dGltZV0gKz0gdGltZQorICAgIGVuZAorCisgICAgZGVmIHN0YXRzX3RhYmxlKG4gPSA1MCkKKyAgICAgIExpcXVpZFJlbmRlcmVyOjpUYWJsZS5uZXcoQHN0YXRzKS50b19zKG4pCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5mb3JtYXRfZXJyb3IoZSwgcGF0aCkKKyAgICAgIGlmIGUuaXNfYT8gVGFnczo6SW5jbHVkZVRhZ0Vycm9yCisgICAgICAgIHJldHVybiAiI3tlLm1lc3NhZ2V9IGluICN7ZS5wYXRofSwgaW5jbHVkZWQgaW4gI3twYXRofSIKKyAgICAgIGVuZAorICAgICAgIiN7ZS5tZXNzYWdlfSBpbiAje3BhdGh9IgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvbGlxdWlkX3JlbmRlcmVyL2ZpbGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9saXF1aWRfcmVuZGVyZXIvZmlsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWM4YzdiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvbGlxdWlkX3JlbmRlcmVyL2ZpbGUucmIKQEAgLTAsMCArMSw1NCBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBMaXF1aWRSZW5kZXJlcgorICAgIGNsYXNzIEZpbGUKKyAgICAgIGRlZiBpbml0aWFsaXplKHJlbmRlcmVyLCBmaWxlbmFtZSkKKyAgICAgICAgQHJlbmRlcmVyID0gcmVuZGVyZXIKKyAgICAgICAgQGZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgIGVuZAorCisgICAgICBkZWYgcGFyc2UoY29udGVudCkKKyAgICAgICAgbWVhc3VyZV90aW1lIGRvCisgICAgICAgICAgQHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZShjb250ZW50LCA6bGluZV9udW1iZXJzID0+IHRydWUpCisgICAgICAgIGVuZAorCisgICAgICAgIHNlbGYKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyKCphcmdzKQorICAgICAgICBtZWFzdXJlX3RpbWUgZG8KKyAgICAgICAgICBtZWFzdXJlX2J5dGVzIGRvCisgICAgICAgICAgICBAdGVtcGxhdGUucmVuZGVyKCphcmdzKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyISgqYXJncykKKyAgICAgICAgbWVhc3VyZV90aW1lIGRvCisgICAgICAgICAgbWVhc3VyZV9ieXRlcyBkbworICAgICAgICAgICAgQHRlbXBsYXRlLnJlbmRlciEoKmFyZ3MpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiB3YXJuaW5ncworICAgICAgICBAdGVtcGxhdGUud2FybmluZ3MKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBtZWFzdXJlX2J5dGVzCisgICAgICAgIHlpZWxkLnRhcCBkbyB8c3RyfAorICAgICAgICAgIEByZW5kZXJlci5pbmNyZW1lbnRfYnl0ZXMoQGZpbGVuYW1lLCBzdHIuYnl0ZXNpemUpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBtZWFzdXJlX3RpbWUKKyAgICAgICAgYmVmb3JlID0gVGltZS5ub3cKKyAgICAgICAgeWllbGQKKyAgICAgIGVuc3VyZQorICAgICAgICBhZnRlciA9IFRpbWUubm93CisgICAgICAgIEByZW5kZXJlci5pbmNyZW1lbnRfdGltZShAZmlsZW5hbWUsIGFmdGVyIC0gYmVmb3JlKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9saXF1aWRfcmVuZGVyZXIvdGFibGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9saXF1aWRfcmVuZGVyZXIvdGFibGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiN2ZkZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2xpcXVpZF9yZW5kZXJlci90YWJsZS5yYgpAQCAtMCwwICsxLDk0IEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIExpcXVpZFJlbmRlcmVyOjpUYWJsZQorICAgIGRlZiBpbml0aWFsaXplKHN0YXRzKQorICAgICAgQHN0YXRzID0gc3RhdHMKKyAgICBlbmQKKworICAgIGRlZiB0b19zKG4gPSA1MCkKKyAgICAgIGRhdGEgPSBkYXRhX2Zvcl90YWJsZShuKQorICAgICAgd2lkdGhzID0gdGFibGVfd2lkdGhzKGRhdGEpCisgICAgICBnZW5lcmF0ZV90YWJsZShkYXRhLCB3aWR0aHMpCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgZ2VuZXJhdGVfdGFibGUoZGF0YSwgd2lkdGhzKQorICAgICAgc3RyID0gIlxuIgorCisgICAgICB0YWJsZV9oZWFkID0gZGF0YS5zaGlmdAorICAgICAgc3RyIDw8IGdlbmVyYXRlX3Jvdyh0YWJsZV9oZWFkLCB3aWR0aHMpCisgICAgICBzdHIgPDwgZ2VuZXJhdGVfdGFibGVfaGVhZF9ib3JkZXIodGFibGVfaGVhZCwgd2lkdGhzKQorCisgICAgICBkYXRhLmVhY2ggZG8gfHJvd19kYXRhfAorICAgICAgICBzdHIgPDwgZ2VuZXJhdGVfcm93KHJvd19kYXRhLCB3aWR0aHMpCisgICAgICBlbmQKKworICAgICAgc3RyIDw8ICJcbiIKKyAgICAgIHN0cgorICAgIGVuZAorCisgICAgZGVmIGdlbmVyYXRlX3RhYmxlX2hlYWRfYm9yZGVyKHJvd19kYXRhLCB3aWR0aHMpCisgICAgICBzdHIgPSAiIgorCisgICAgICByb3dfZGF0YS5lYWNoX2luZGV4IGRvIHxjZWxsX2luZGV4fAorICAgICAgICBzdHIgPDwgIi0iICogd2lkdGhzW2NlbGxfaW5kZXhdCisgICAgICAgIHN0ciA8PCAiLSstIiB1bmxlc3MgY2VsbF9pbmRleCA9PSByb3dfZGF0YS5sZW5ndGggLSAxCisgICAgICBlbmQKKworICAgICAgc3RyIDw8ICJcbiIKKyAgICAgIHN0cgorICAgIGVuZAorCisgICAgZGVmIGdlbmVyYXRlX3Jvdyhyb3dfZGF0YSwgd2lkdGhzKQorICAgICAgc3RyID0gIiIKKworICAgICAgcm93X2RhdGEuZWFjaF93aXRoX2luZGV4IGRvIHxjZWxsX2RhdGEsIGNlbGxfaW5kZXh8CisgICAgICAgIHN0ciA8PCBpZiBjZWxsX2luZGV4Lnplcm8/CisgICAgICAgICAgICAgICAgIGNlbGxfZGF0YS5sanVzdCh3aWR0aHNbY2VsbF9pbmRleF0sICIgIikKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgY2VsbF9kYXRhLnJqdXN0KHdpZHRoc1tjZWxsX2luZGV4XSwgIiAiKQorICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgc3RyIDw8ICIgfCAiIHVubGVzcyBjZWxsX2luZGV4ID09IHJvd19kYXRhLmxlbmd0aCAtIDEKKyAgICAgIGVuZAorCisgICAgICBzdHIgPDwgIlxuIgorICAgICAgc3RyCisgICAgZW5kCisKKyAgICBkZWYgdGFibGVfd2lkdGhzKGRhdGEpCisgICAgICB3aWR0aHMgPSBbXQorCisgICAgICBkYXRhLmVhY2ggZG8gfHJvd3wKKyAgICAgICAgcm93LmVhY2hfd2l0aF9pbmRleCBkbyB8Y2VsbCwgaW5kZXh8CisgICAgICAgICAgd2lkdGhzW2luZGV4XSA9IFsgY2VsbC5sZW5ndGgsIHdpZHRoc1tpbmRleF0gXS5jb21wYWN0Lm1heAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICB3aWR0aHMKKyAgICBlbmQKKworICAgIGRlZiBkYXRhX2Zvcl90YWJsZShuKQorICAgICAgc29ydGVkID0gQHN0YXRzLnNvcnRfYnkgeyB8XywgZmlsZV9zdGF0c3wgLWZpbGVfc3RhdHNbOnRpbWVdIH0KKyAgICAgIHNvcnRlZCA9IHNvcnRlZC5zbGljZSgwLCBuKQorCisgICAgICB0YWJsZSA9IFsldyhGaWxlbmFtZSBDb3VudCBCeXRlcyBUaW1lKV0KKworICAgICAgc29ydGVkLmVhY2ggZG8gfGZpbGVuYW1lLCBmaWxlX3N0YXRzfAorICAgICAgICByb3cgPSBbXQorICAgICAgICByb3cgPDwgZmlsZW5hbWUKKyAgICAgICAgcm93IDw8IGZpbGVfc3RhdHNbOmNvdW50XS50b19zCisgICAgICAgIHJvdyA8PCBmb3JtYXRfYnl0ZXMoZmlsZV9zdGF0c1s6Ynl0ZXNdKQorICAgICAgICByb3cgPDwgZm9ybWF0KCIlLjNmIiwgZmlsZV9zdGF0c1s6dGltZV0pCisgICAgICAgIHRhYmxlIDw8IHJvdworICAgICAgZW5kCisKKyAgICAgIHRhYmxlCisgICAgZW5kCisKKyAgICBkZWYgZm9ybWF0X2J5dGVzKGJ5dGVzKQorICAgICAgYnl0ZXMgLz0gMTAyNC4wCisgICAgICBmb3JtYXQoIiUuMmZLIiwgYnl0ZXMpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9sb2dfYWRhcHRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL2xvZ19hZGFwdGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NWYzMjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9sb2dfYWRhcHRlci5yYgpAQCAtMCwwICsxLDExNSBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBMb2dBZGFwdGVyCisgICAgYXR0cl9yZWFkZXIgOndyaXRlciwgOm1lc3NhZ2VzCisKKyAgICBMT0dfTEVWRUxTID0geworICAgICAgOmRlYnVnID0+IDo6TG9nZ2VyOjpERUJVRywKKyAgICAgIDppbmZvICA9PiA6OkxvZ2dlcjo6SU5GTywKKyAgICAgIDp3YXJuICA9PiA6OkxvZ2dlcjo6V0FSTiwKKyAgICAgIDplcnJvciA9PiA6OkxvZ2dlcjo6RVJST1IsCisgICAgfS5mcmVlemUKKworICAgICMgUHVibGljOiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBsb2cgd3JpdGVyCisgICAgIworICAgICMgd3JpdGVyIC0gTG9nZ2VyIGNvbXBhdGlibGUgaW5zdGFuY2UKKyAgICAjIGxvZ19sZXZlbCAtIChvcHRpb25hbCwgc3ltYm9sKSB0aGUgbG9nIGxldmVsCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nCisgICAgZGVmIGluaXRpYWxpemUod3JpdGVyLCBsZXZlbCA9IDppbmZvKQorICAgICAgQG1lc3NhZ2VzID0gW10KKyAgICAgIEB3cml0ZXIgPSB3cml0ZXIKKyAgICAgIHNlbGYubG9nX2xldmVsID0gbGV2ZWwKKyAgICBlbmQKKworICAgICMgUHVibGljOiBTZXQgdGhlIGxvZyBsZXZlbCBvbiB0aGUgd3JpdGVyCisgICAgIworICAgICMgbGV2ZWwgLSAoc3ltYm9sKSB0aGUgbG9nIGxldmVsCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nCisgICAgZGVmIGxvZ19sZXZlbD0obGV2ZWwpCisgICAgICB3cml0ZXIubGV2ZWwgPSBMT0dfTEVWRUxTLmZldGNoKGxldmVsKQorICAgIGVuZAorCisgICAgZGVmIGFkanVzdF92ZXJib3NpdHkob3B0aW9ucyA9IHt9KQorICAgICAgIyBRdWlldCBhbHdheXMgd2lucy4KKyAgICAgIGlmIG9wdGlvbnNbOnF1aWV0XQorICAgICAgICBzZWxmLmxvZ19sZXZlbCA9IDplcnJvcgorICAgICAgZWxzaWYgb3B0aW9uc1s6dmVyYm9zZV0KKyAgICAgICAgc2VsZi5sb2dfbGV2ZWwgPSA6ZGVidWcKKyAgICAgIGVuZAorICAgICAgZGVidWcgIkxvZ2dpbmcgYXQgbGV2ZWw6IiwgTE9HX0xFVkVMUy5rZXkod3JpdGVyLmxldmVsKS50b19zCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogUHJpbnQgYSBkZWJ1ZyBtZXNzYWdlCisgICAgIworICAgICMgdG9waWMgLSB0aGUgdG9waWMgb2YgdGhlIG1lc3NhZ2UsIGUuZy4gIkNvbmZpZ3VyYXRpb24gZmlsZSIsICJEZXByZWNhdGlvbiIsIGV0Yy4KKyAgICAjIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZSBkZXRhaWwKKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBkZWYgZGVidWcodG9waWMsIG1lc3NhZ2UgPSBuaWwpCisgICAgICB3cml0ZXIuZGVidWcobWVzc2FnZSh0b3BpYywgbWVzc2FnZSkpCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogUHJpbnQgYSBtZXNzYWdlCisgICAgIworICAgICMgdG9waWMgLSB0aGUgdG9waWMgb2YgdGhlIG1lc3NhZ2UsIGUuZy4gIkNvbmZpZ3VyYXRpb24gZmlsZSIsICJEZXByZWNhdGlvbiIsIGV0Yy4KKyAgICAjIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZSBkZXRhaWwKKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBkZWYgaW5mbyh0b3BpYywgbWVzc2FnZSA9IG5pbCkKKyAgICAgIHdyaXRlci5pbmZvKG1lc3NhZ2UodG9waWMsIG1lc3NhZ2UpKQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFByaW50IGEgbWVzc2FnZQorICAgICMKKyAgICAjIHRvcGljIC0gdGhlIHRvcGljIG9mIHRoZSBtZXNzYWdlLCBlLmcuICJDb25maWd1cmF0aW9uIGZpbGUiLCAiRGVwcmVjYXRpb24iLCBldGMuCisgICAgIyBtZXNzYWdlIC0gdGhlIG1lc3NhZ2UgZGV0YWlsCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nCisgICAgZGVmIHdhcm4odG9waWMsIG1lc3NhZ2UgPSBuaWwpCisgICAgICB3cml0ZXIud2FybihtZXNzYWdlKHRvcGljLCBtZXNzYWdlKSkKKyAgICBlbmQKKworICAgICMgUHVibGljOiBQcmludCBhbiBlcnJvciBtZXNzYWdlCisgICAgIworICAgICMgdG9waWMgLSB0aGUgdG9waWMgb2YgdGhlIG1lc3NhZ2UsIGUuZy4gIkNvbmZpZ3VyYXRpb24gZmlsZSIsICJEZXByZWNhdGlvbiIsIGV0Yy4KKyAgICAjIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZSBkZXRhaWwKKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBkZWYgZXJyb3IodG9waWMsIG1lc3NhZ2UgPSBuaWwpCisgICAgICB3cml0ZXIuZXJyb3IobWVzc2FnZSh0b3BpYywgbWVzc2FnZSkpCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgaW1tZWRpYXRlbHkgYWJvcnQgdGhlIHByb2Nlc3MKKyAgICAjCisgICAgIyB0b3BpYyAtIHRoZSB0b3BpYyBvZiB0aGUgbWVzc2FnZSwgZS5nLiAiQ29uZmlndXJhdGlvbiBmaWxlIiwgIkRlcHJlY2F0aW9uIiwgZXRjLgorICAgICMgbWVzc2FnZSAtIHRoZSBtZXNzYWdlIGRldGFpbCAoY2FuIGJlIG9taXR0ZWQpCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nCisgICAgZGVmIGFib3J0X3dpdGgodG9waWMsIG1lc3NhZ2UgPSBuaWwpCisgICAgICBlcnJvcih0b3BpYywgbWVzc2FnZSkKKyAgICAgIGFib3J0CisgICAgZW5kCisKKyAgICAjIEludGVybmFsOiBCdWlsZCBhIHRvcGljIG1ldGhvZAorICAgICMKKyAgICAjIHRvcGljIC0gdGhlIHRvcGljIG9mIHRoZSBtZXNzYWdlLCBlLmcuICJDb25maWd1cmF0aW9uIGZpbGUiLCAiRGVwcmVjYXRpb24iLCBldGMuCisgICAgIyBtZXNzYWdlIC0gdGhlIG1lc3NhZ2UgZGV0YWlsCisgICAgIworICAgICMgUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UKKyAgICBkZWYgbWVzc2FnZSh0b3BpYywgbWVzc2FnZSkKKyAgICAgIG1zZyA9IGZvcm1hdHRlZF90b3BpYyh0b3BpYykgKyBtZXNzYWdlLnRvX3MuZ3N1YiglciFccyshLCAiICIpCisgICAgICBtZXNzYWdlcyA8PCBtc2cKKyAgICAgIG1zZworICAgIGVuZAorCisgICAgIyBJbnRlcm5hbDogRm9ybWF0IHRoZSB0b3BpYworICAgICMKKyAgICAjIHRvcGljIC0gdGhlIHRvcGljIG9mIHRoZSBtZXNzYWdlLCBlLmcuICJDb25maWd1cmF0aW9uIGZpbGUiLCAiRGVwcmVjYXRpb24iLCBldGMuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgZm9ybWF0dGVkIHRvcGljIHN0YXRlbWVudAorICAgIGRlZiBmb3JtYXR0ZWRfdG9waWModG9waWMpCisgICAgICAiI3t0b3BpY30gIi5yanVzdCgyMCkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL21pbWUudHlwZXMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9taW1lLnR5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODI4YjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9taW1lLnR5cGVzCkBAIC0wLDAgKzEsODAwIEBACisjIFdvYWggdGhlcmUuIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBkaXJlY3RseS4KKyMgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNjcmlwdC92ZW5kb3ItbWltZXMuCisKK2FwcGxpY2F0aW9uL2FuZHJldy1pbnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXoKK2FwcGxpY2F0aW9uL2FwcGxpeHdhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXcKK2FwcGxpY2F0aW9uL2F0b20reG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbQorYXBwbGljYXRpb24vYXRvbWNhdCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdG9tY2F0CithcHBsaWNhdGlvbi9hdG9tc3ZjK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21zdmMKK2FwcGxpY2F0aW9uL2Jkb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRvYworYXBwbGljYXRpb24vY2N4bWwreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY3htbAorYXBwbGljYXRpb24vY2RtaS1jYXBhYmlsaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZG1pYQorYXBwbGljYXRpb24vY2RtaS1jb250YWluZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZG1pYworYXBwbGljYXRpb24vY2RtaS1kb21haW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZG1pZAorYXBwbGljYXRpb24vY2RtaS1vYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZG1pbworYXBwbGljYXRpb24vY2RtaS1xdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZG1pcQorYXBwbGljYXRpb24vY3Utc2VlbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdQorYXBwbGljYXRpb24vZGFzaCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZHAKK2FwcGxpY2F0aW9uL2Rhdm1vdW50K3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF2bW91bnQKK2FwcGxpY2F0aW9uL2RvY2Jvb2sreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJrCithcHBsaWNhdGlvbi9kc3NjK2RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzc2MKK2FwcGxpY2F0aW9uL2Rzc2MreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGRzc2MKK2FwcGxpY2F0aW9uL2VjbWFzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNtYQorYXBwbGljYXRpb24vZW1tYSt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW1hCithcHBsaWNhdGlvbi9lcHViK3ppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwdWIKK2FwcGxpY2F0aW9uL2V4aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpCithcHBsaWNhdGlvbi9mb250LXRkcGZyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmcgorYXBwbGljYXRpb24vZm9udC13b2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b2ZmCithcHBsaWNhdGlvbi9mb250LXdvZmYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvZmYyCithcHBsaWNhdGlvbi9nbWwreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdtbAorYXBwbGljYXRpb24vZ3B4K3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHgKK2FwcGxpY2F0aW9uL2d4ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3hmCithcHBsaWNhdGlvbi9oeXBlcnN0dWRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aworYXBwbGljYXRpb24vaW5rbWwreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmsgaW5rbWwKK2FwcGxpY2F0aW9uL2lwZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBmaXgKK2FwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyIHdhciBlYXIKK2FwcGxpY2F0aW9uL2phdmEtc2VyaWFsaXplZC1vYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyCithcHBsaWNhdGlvbi9qYXZhLXZtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzCithcHBsaWNhdGlvbi9qYXZhc2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzCithcHBsaWNhdGlvbi9qc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gbWFwCithcHBsaWNhdGlvbi9qc29uNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb241CithcHBsaWNhdGlvbi9qc29ubWwranNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25tbAorYXBwbGljYXRpb24vbGQranNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29ubGQKK2FwcGxpY2F0aW9uL2xvc3QreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zdHhtbAorYXBwbGljYXRpb24vbWFjLWJpbmhleDQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocXgKK2FwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B0CithcHBsaWNhdGlvbi9tYWRzK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZHMKK2FwcGxpY2F0aW9uL21hbmlmZXN0K2pzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VibWFuaWZlc3QKK2FwcGxpY2F0aW9uL21hcmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJjCithcHBsaWNhdGlvbi9tYXJjeG1sK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yY3gKK2FwcGxpY2F0aW9uL21hdGhlbWF0aWNhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWEgbmIgbWIKK2FwcGxpY2F0aW9uL21hdGhtbCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0aG1sCithcHBsaWNhdGlvbi9tYm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ib3gKK2FwcGxpY2F0aW9uL21lZGlhc2VydmVyY29udHJvbCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNjbWwKK2FwcGxpY2F0aW9uL21ldGFsaW5rK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWxpbmsKK2FwcGxpY2F0aW9uL21ldGFsaW5rNCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YTQKK2FwcGxpY2F0aW9uL21ldHMreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cworYXBwbGljYXRpb24vbW9kcyt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RzCithcHBsaWNhdGlvbi9tcDIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0yMSBtcDIxCithcHBsaWNhdGlvbi9tcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNHMgbTRwCithcHBsaWNhdGlvbi9tc3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYyBkb3QKK2FwcGxpY2F0aW9uL214ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXhmCithcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbiBkbXMgbHJmIG1hciBzbyBkaXN0IGRpc3R6IHBrZyBicGsgZHVtcCBlbGMgZGVwbG95IGV4ZSBkbGwgZGViIGRtZyBpc28gaW1nIG1zaSBtc3AgbXNtIGJ1ZmZlcgorYXBwbGljYXRpb24vb2RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZGEKK2FwcGxpY2F0aW9uL29lYnBzLXBhY2thZ2UreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BmCithcHBsaWNhdGlvbi9vZ2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9neAorYXBwbGljYXRpb24vb21kb2MreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbWRvYworYXBwbGljYXRpb24vb25lbm90ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmV0b2Mgb25ldG9jMiBvbmV0bXAgb25lcGtnCithcHBsaWNhdGlvbi9veHBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG94cHMKK2FwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGVyCithcHBsaWNhdGlvbi9wZGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZgorYXBwbGljYXRpb24vcGdwLWVuY3J5cHRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ3AKK2FwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjIHNpZworYXBwbGljYXRpb24vcGljcy1ydWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmYKK2FwcGxpY2F0aW9uL3BrY3MxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDEwCithcHBsaWNhdGlvbi9wa2NzNy1taW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA3bSBwN2MKK2FwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDdzCithcHBsaWNhdGlvbi9wa2NzOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4CithcHBsaWNhdGlvbi9wa2l4LWF0dHItY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjCithcHBsaWNhdGlvbi9wa2l4LWNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcgorYXBwbGljYXRpb24vcGtpeC1jcmwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmwKK2FwcGxpY2F0aW9uL3BraXgtcGtpcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtpcGF0aAorYXBwbGljYXRpb24vcGtpeGNtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2kKK2FwcGxpY2F0aW9uL3Bscyt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxzCithcHBsaWNhdGlvbi9wb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpIGVwcyBwcworYXBwbGljYXRpb24vcHJzLmN3dyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd3cKK2FwcGxpY2F0aW9uL3Bza2MreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNrY3htbAorYXBwbGljYXRpb24vcmRmK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZGYKK2FwcGxpY2F0aW9uL3JlZ2luZm8reG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlmCithcHBsaWNhdGlvbi9yZWxheC1uZy1jb21wYWN0LXN5bnRheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuYworYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybAorYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMtZGlmZit4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybGQKK2FwcGxpY2F0aW9uL3Jscy1zZXJ2aWNlcyt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnMKK2FwcGxpY2F0aW9uL3Jwa2ktZ2hvc3RidXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2JyCithcHBsaWNhdGlvbi9ycGtpLW1hbmlmZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1mdAorYXBwbGljYXRpb24vcnBraS1yb2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2EKK2FwcGxpY2F0aW9uL3JzZCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNkCithcHBsaWNhdGlvbi9yc3MreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcworYXBwbGljYXRpb24vcnRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGYKK2FwcGxpY2F0aW9uL3NibWwreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JtbAorYXBwbGljYXRpb24vc2N2cC1jdi1yZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3EKK2FwcGxpY2F0aW9uL3NjdnAtY3YtcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NzCithcHBsaWNhdGlvbi9zY3ZwLXZwLXJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcQorYXBwbGljYXRpb24vc2N2cC12cC1yZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHAKK2FwcGxpY2F0aW9uL3NkcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwCithcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHBheQorYXBwbGljYXRpb24vc2V0LXJlZ2lzdHJhdGlvbi1pbml0aWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRyZWcKK2FwcGxpY2F0aW9uL3NoZit4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hmCithcHBsaWNhdGlvbi9zbWlsK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtaSBzbWlsCithcHBsaWNhdGlvbi9zcGFycWwtcXVlcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJxCithcHBsaWNhdGlvbi9zcGFycWwtcmVzdWx0cyt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyeAorYXBwbGljYXRpb24vc3JncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtCithcHBsaWNhdGlvbi9zcmdzK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyeG1sCithcHBsaWNhdGlvbi9zcnUreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNydQorYXBwbGljYXRpb24vc3NkbCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2RsCithcHBsaWNhdGlvbi9zc21sK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbWwKK2FwcGxpY2F0aW9uL3RlaSt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVpIHRlaWNvcnB1cworYXBwbGljYXRpb24vdGhyYXVkK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmkKK2FwcGxpY2F0aW9uL3RpbWVzdGFtcGVkLWRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNkCithcHBsaWNhdGlvbi92bmQuM2dwcC5waWMtYnctbGFyZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYgorYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXNtYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2IKK2FwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy12YXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZiCithcHBsaWNhdGlvbi92bmQuM2dwcDIudGNhcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjYXAKK2FwcGxpY2F0aW9uL3ZuZC4zbS5wb3N0LWl0LW5vdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHduCithcHBsaWNhdGlvbi92bmQuYWNjcGFjLnNpbXBseS5hc28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbworYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuaW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXAKK2FwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN1CithcHBsaWNhdGlvbi92bmQuYWN1Y29ycCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0YyBhY3V0YworYXBwbGljYXRpb24vdm5kLmFkb2JlLmFpci1hcHBsaWNhdGlvbi1pbnN0YWxsZXItcGFja2FnZSt6aXAgICAgICAgICAgICAgICBhaXIKK2FwcGxpY2F0aW9uL3ZuZC5hZG9iZS5mb3Jtc2NlbnRyYWwuZmNkdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNkdAorYXBwbGljYXRpb24vdm5kLmFkb2JlLmZ4cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeHAgZnhwbAorYXBwbGljYXRpb24vdm5kLmFkb2JlLnhkcCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZHAKK2FwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZmRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZkZgorYXBwbGljYXRpb24vdm5kLmFoZWFkLnNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaGVhZAorYXBwbGljYXRpb24vdm5kLmFpcnppcC5maWxlc2VjdXJlLmF6ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhemYKK2FwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5henMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXpzCithcHBsaWNhdGlvbi92bmQuYW1hem9uLmVib29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF6dworYXBwbGljYXRpb24vdm5kLmFtZXJpY2FuZHluYW1pY3MuYWNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2MKK2FwcGxpY2F0aW9uL3ZuZC5hbWlnYS5hbWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1pCithcHBsaWNhdGlvbi92bmQuYW5kcm9pZC5wYWNrYWdlLWFyY2hpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaworYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1jZXJ0aWZpY2F0ZS1pc3N1ZS1pbml0aWF0aW9uICAgICAgICAgICAgICAgICAgICBjaWkKK2FwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItZnVuZHMtdHJhbnNmZXItaW5pdGlhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgZnRpCithcHBsaWNhdGlvbi92bmQuYW50aXguZ2FtZS1jb21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eAorYXBwbGljYXRpb24vdm5kLmFwcGxlLmluc3RhbGxlcit4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGtnCithcHBsaWNhdGlvbi92bmQuYXBwbGUubXBlZ3VybCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0zdTgKK2FwcGxpY2F0aW9uL3ZuZC5hcmlzdGFuZXR3b3Jrcy5zd2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpCithcHBsaWNhdGlvbi92bmQuYXN0cmFlYS1zb2Z0d2FyZS5pb3RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvdGEKK2FwcGxpY2F0aW9uL3ZuZC5hdWRpb2dyYXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVwCithcHBsaWNhdGlvbi92bmQuYmx1ZWljZS5tdWx0aXBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wbQorYXBwbGljYXRpb24vdm5kLmJtaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWkKK2FwcGxpY2F0aW9uL3ZuZC5idXNpbmVzc29iamVjdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwCithcHBsaWNhdGlvbi92bmQuY2hlbWRyYXcreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkeG1sCithcHBsaWNhdGlvbi92bmQuY2hpcG51dHMua2FyYW9rZS1tbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tZAorYXBwbGljYXRpb24vdm5kLmNpbmRlcmVsbGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZHkKK2FwcGxpY2F0aW9uL3ZuZC5jbGF5bW9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhCithcHBsaWNhdGlvbi92bmQuY2xvYW50by5ycDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwOQorYXBwbGljYXRpb24vdm5kLmNsb25rLmM0Z3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNGcgYzRkIGM0ZiBjNHAgYzR1CithcHBsaWNhdGlvbi92bmQuY2x1ZXRydXN0LmNhcnRvbW9iaWxlLWNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxMWFtYworYXBwbGljYXRpb24vdm5kLmNsdWV0cnVzdC5jYXJ0b21vYmlsZS1jb25maWctcGtnICAgICAgICAgICAgICAgICAgICAgICAgICBjMTFhbXoKK2FwcGxpY2F0aW9uL3ZuZC5jb21tb25zcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NwCithcHBsaWNhdGlvbi92bmQuY29udGFjdC5jbXNnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkYmNtc2cKK2FwcGxpY2F0aW9uL3ZuZC5jb3Ntb2NhbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21jCithcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsa3gKK2FwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLmtleWJvYXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xraworYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIucGFsZXR0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGtwCithcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci50ZW1wbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsa3QKK2FwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLndvcmRiYW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xrdworYXBwbGljYXRpb24vdm5kLmNyaXRpY2FsdG9vbHMud2JzK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YnMKK2FwcGxpY2F0aW9uL3ZuZC5jdGMtcG9zbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1sCithcHBsaWNhdGlvbi92bmQuY3Vwcy1wcGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwZAorYXBwbGljYXRpb24vdm5kLmN1cmwuY2FyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXIKK2FwcGxpY2F0aW9uL3ZuZC5jdXJsLnBjdXJsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN1cmwKK2FwcGxpY2F0aW9uL3ZuZC5kYXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFydAorYXBwbGljYXRpb24vdm5kLmRhdGEtdmlzaW9uLnJkeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZHoKK2FwcGxpY2F0aW9uL3ZuZC5kZWNlLmRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZmIHV2dmYgdXZkIHV2dmQKK2FwcGxpY2F0aW9uL3ZuZC5kZWNlLnR0bWwreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZ0IHV2dnQKK2FwcGxpY2F0aW9uL3ZuZC5kZWNlLnVuc3BlY2lmaWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZ4IHV2dngKK2FwcGxpY2F0aW9uL3ZuZC5kZWNlLnppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZ6IHV2dnoKK2FwcGxpY2F0aW9uL3ZuZC5kZW5vdm8uZmNzZWxheW91dC1saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVfbGF1bmNoCithcHBsaWNhdGlvbi92bmQuZG5hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuYQorYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1scCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbHAKK2FwcGxpY2F0aW9uL3ZuZC5kcGdyYXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBnCithcHBsaWNhdGlvbi92bmQuZHJlYW1mYWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmYWMKK2FwcGxpY2F0aW9uL3ZuZC5kcy1rZXlwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3B4eAorYXBwbGljYXRpb24vdm5kLmR2Yi5haXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaXQKK2FwcGxpY2F0aW9uL3ZuZC5kdmIuc2VydmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZjCithcHBsaWNhdGlvbi92bmQuZHluYWdlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbworYXBwbGljYXRpb24vdm5kLmVjb3dpbi5jaGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWcKK2FwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm1sCithcHBsaWNhdGlvbi92bmQuZXBzb24uZXNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzZgorYXBwbGljYXRpb24vdm5kLmVwc29uLm1zZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YKK2FwcGxpY2F0aW9uL3ZuZC5lcHNvbi5xdWlja2FuaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWFtCithcHBsaWNhdGlvbi92bmQuZXBzb24uc2FsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdAorYXBwbGljYXRpb24vdm5kLmVwc29uLnNzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2YKK2FwcGxpY2F0aW9uL3ZuZC5lc3ppZ25vMyt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXMzIGV0MworYXBwbGljYXRpb24vdm5kLmV6cGl4LWFsYnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlejIKK2FwcGxpY2F0aW9uL3ZuZC5lenBpeC1wYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXozCithcHBsaWNhdGlvbi92bmQuZmRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkZgorYXBwbGljYXRpb24vdm5kLmZkc24ubXNlZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2VlZAorYXBwbGljYXRpb24vdm5kLmZkc24uc2VlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkIGRhdGFsZXNzCithcHBsaWNhdGlvbi92bmQuZmxvZ3JhcGhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwaAorYXBwbGljYXRpb24vdm5kLmZsdXh0aW1lLmNsaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGMKK2FwcGxpY2F0aW9uL3ZuZC5mcmFtZW1ha2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gZnJhbWUgbWFrZXIgYm9vaworYXBwbGljYXRpb24vdm5kLmZyb2dhbnMuZm5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbmMKK2FwcGxpY2F0aW9uL3ZuZC5mcm9nYW5zLmx0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHRmCithcHBsaWNhdGlvbi92bmQuZnNjLndlYmxhdW5jaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzYworYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYXMKK2FwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2EyCithcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9hMworYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNncCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZzUKK2FwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzcHJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmgyCithcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkZAorYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZHcKK2FwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZG9jdXdvcmtzLmJpbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGJkCithcHBsaWNhdGlvbi92bmQuZnV6enlzaGVldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ6cworYXBwbGljYXRpb24vdm5kLmdlbm9tYXRpeC50dXhlZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eGQKK2FwcGxpY2F0aW9uL3ZuZC5nZW9nZWJyYS5maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2diCithcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEudG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdndAorYXBwbGljYXRpb24vdm5kLmdlb21ldHJ5LWV4cGxvcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXggZ3JlCithcHBsaWNhdGlvbi92bmQuZ2VvbmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd4dAorYXBwbGljYXRpb24vdm5kLmdlb3BsYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnMncKK2FwcGxpY2F0aW9uL3ZuZC5nZW9zcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZzN3CithcHBsaWNhdGlvbi92bmQuZ214ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdteAorYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbWwreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbWwKK2FwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua216ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga216CithcHBsaWNhdGlvbi92bmQuZ3JhZmVxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdxZiBncXMKK2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtYWNjb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FjCithcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoZgorYXBwbGljYXRpb24vdm5kLmdyb292ZS1pZGVudGl0eS1tZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW0KK2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaW5qZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3J2CithcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0bQorYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLXRlbXBsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cGwKK2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdmNhcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmNnCithcHBsaWNhdGlvbi92bmQuaGFsK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbAorYXBwbGljYXRpb24vdm5kLmhhbmRoZWxkLWVudGVydGFpbm1lbnQreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bW0KK2FwcGxpY2F0aW9uL3ZuZC5oYmNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGJjaQorYXBwbGljYXRpb24vdm5kLmhoZS5sZXNzb24tcGxheWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXMKK2FwcGxpY2F0aW9uL3ZuZC5ocC1ocGdsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBnbAorYXBwbGljYXRpb24vdm5kLmhwLWhwaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocGlkCithcHBsaWNhdGlvbi92bmQuaHAtaHBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwcworYXBwbGljYXRpb24vdm5kLmhwLWpseXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbHQKK2FwcGxpY2F0aW9uL3ZuZC5ocC1wY2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNsCithcHBsaWNhdGlvbi92bmQuaHAtcGNseGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbHhsCithcHBsaWNhdGlvbi92bmQuaHlkcm9zdGF0aXguc29mLWRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmZC1oZHN0eAorYXBwbGljYXRpb24vdm5kLmlibS5taW5pcGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHkKK2FwcGxpY2F0aW9uL3ZuZC5pYm0ubW9kY2FwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZwIGxpc3RhZnAgbGlzdDM4MjAKK2FwcGxpY2F0aW9uL3ZuZC5pYm0ucmlnaHRzLW1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJtCithcHBsaWNhdGlvbi92bmQuaWJtLnNlY3VyZS1jb250YWluZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjCithcHBsaWNhdGlvbi92bmQuaWNjcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljYyBpY20KK2FwcGxpY2F0aW9uL3ZuZC5pZ2xvYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdsCithcHBsaWNhdGlvbi92bmQuaW1tZXJ2aXNpb24taXZwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2cAorYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2dSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdnUKK2FwcGxpY2F0aW9uL3ZuZC5pbnNvcnMuaWdtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdtCithcHBsaWNhdGlvbi92bmQuaW50ZXJjb24uZm9ybW5ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwdyB4cHgKK2FwcGxpY2F0aW9uL3ZuZC5pbnRlcmdlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTJnCithcHBsaWNhdGlvbi92bmQuaW50dS5xYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFibworYXBwbGljYXRpb24vdm5kLmludHUucWZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZngKK2FwcGxpY2F0aW9uL3ZuZC5pcHVucGx1Z2dlZC5yY3Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNwcm9maWxlCithcHBsaWNhdGlvbi92bmQuaXJlcG9zaXRvcnkucGFja2FnZSt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycAorYXBwbGljYXRpb24vdm5kLmlzLXhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cHIKK2FwcGxpY2F0aW9uL3ZuZC5pc2FjLmZjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNzCithcHBsaWNhdGlvbi92bmQuamFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphbQorYXBwbGljYXRpb24vdm5kLmpjcC5qYXZhbWUubWlkbGV0LXJtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybXMKK2FwcGxpY2F0aW9uL3ZuZC5qaXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzcAorYXBwbGljYXRpb24vdm5kLmpvb3N0LmpvZGEtYXJjaGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2RhCithcHBsaWNhdGlvbi92bmQua2Fob290eiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt0eiBrdHIKK2FwcGxpY2F0aW9uL3ZuZC5rZGUua2FyYm9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2FyYm9uCithcHBsaWNhdGlvbi92bmQua2RlLmtjaGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocnQKK2FwcGxpY2F0aW9uL3ZuZC5rZGUua2Zvcm11bGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZvCithcHBsaWNhdGlvbi92bmQua2RlLmtpdmlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdworYXBwbGljYXRpb24vdm5kLmtkZS5rb250b3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrb24KK2FwcGxpY2F0aW9uL3ZuZC5rZGUua3ByZXNlbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3ByIGtwdAorYXBwbGljYXRpb24vdm5kLmtkZS5rc3ByZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrc3AKK2FwcGxpY2F0aW9uL3ZuZC5rZGUua3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dkIGt3dAorYXBwbGljYXRpb24vdm5kLmtlbmFtZWFhcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodGtlCithcHBsaWNhdGlvbi92bmQua2lkc3BpcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpYQorYXBwbGljYXRpb24vdm5kLmtpbmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbmUga25wCithcHBsaWNhdGlvbi92bmQua29hbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrcCBza2Qgc2t0IHNrbQorYXBwbGljYXRpb24vdm5kLmtvZGFrLWRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2UKK2FwcGxpY2F0aW9uL3ZuZC5sYXMubGFzK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzeG1sCithcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZGVza3RvcCAgICAgICAgICAgICAgICAgICAgICAgIGxiZAorYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmV4Y2hhbmdlK3htbCAgICAgICAgICAgICAgICAgICBsYmUKK2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy0xLTItMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIzCithcHBsaWNhdGlvbi92bmQubG90dXMtYXBwcm9hY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcgorYXBwbGljYXRpb24vdm5kLmxvdHVzLWZyZWVsYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUKK2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy1ub3RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNmCithcHBsaWNhdGlvbi92bmQubG90dXMtb3JnYW5pemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZworYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY20KK2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy13b3JkcHJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHdwCithcHBsaWNhdGlvbi92bmQubWFjcG9ydHMucG9ydHBrZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRwa2cKK2FwcGxpY2F0aW9uL3ZuZC5tY2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNkCithcHBsaWNhdGlvbi92bmQubWVkY2FsY2RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jMQorYXBwbGljYXRpb24vdm5kLm1lZGlhc3RhdGlvbi5jZGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtleQorYXBwbGljYXRpb24vdm5kLm1mZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtd2YKK2FwcGxpY2F0aW9uL3ZuZC5tZm1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWZtCithcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5mbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsbworYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguaWd4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ3gKK2FwcGxpY2F0aW9uL3ZuZC5taWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlmCithcHBsaWNhdGlvbi92bmQubW9iaXVzLmRhZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhZgorYXBwbGljYXRpb24vdm5kLm1vYml1cy5kaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXMKK2FwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubWJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJrCithcHBsaWNhdGlvbi92bmQubW9iaXVzLm1xeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1xeQorYXBwbGljYXRpb24vdm5kLm1vYml1cy5tc2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2wKK2FwcGxpY2F0aW9uL3ZuZC5tb2JpdXMucGxjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxjCithcHBsaWNhdGlvbi92bmQubW9iaXVzLnR4ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4ZgorYXBwbGljYXRpb24vdm5kLm1vcGh1bi5hcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcG4KK2FwcGxpY2F0aW9uL3ZuZC5tb3BodW4uY2VydGlmaWNhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBjCithcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh1bAorYXBwbGljYXRpb24vdm5kLm1zLWFydGdhbHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWwKK2FwcGxpY2F0aW9uL3ZuZC5tcy1jYWItY29tcHJlc3NlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiCithcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhscyB4bG0geGxhIHhsYyB4bHQgeGx3CithcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9lbmFibGVkLjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYW0KK2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9lbmFibGVkLjEyICAgICAgICAgICAgICAgICAgICAgeGxzYgorYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvZW5hYmxlZC4xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bHNtCithcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyICAgICAgICAgICAgICAgICAgICAgICAgIHhsdG0KK2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW90CithcHBsaWNhdGlvbi92bmQubXMtaHRtbGhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNobQorYXBwbGljYXRpb24vdm5kLm1zLWltcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXMKK2FwcGxpY2F0aW9uL3ZuZC5tcy1scm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHJtCithcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNldGhlbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRobXgKK2FwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc2VjY2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0CithcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0bAorYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHQgcHBzIHBvdAorYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuYWRkaW4ubWFjcm9lbmFibGVkLjEyICAgICAgICAgICAgICAgICAgICAgICBwcGFtCithcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5wcmVzZW50YXRpb24ubWFjcm9lbmFibGVkLjEyICAgICAgICAgICAgICAgIHBwdG0KK2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMiAgICAgICAgICAgICAgICAgICAgICAgc2xkbQorYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuc2xpZGVzaG93Lm1hY3JvZW5hYmxlZC4xMiAgICAgICAgICAgICAgICAgICBwcHNtCithcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTIgICAgICAgICAgICAgICAgICAgIHBvdG0KK2FwcGxpY2F0aW9uL3ZuZC5tcy1wcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBwIG1wdAorYXBwbGljYXRpb24vdm5kLm1zLXdvcmQuZG9jdW1lbnQubWFjcm9lbmFibGVkLjEyICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NtCithcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTIgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdG0KK2FwcGxpY2F0aW9uL3ZuZC5tcy13b3JrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BzIHdrcyB3Y20gd2RiCithcHBsaWNhdGlvbi92bmQubXMtd3BsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwbAorYXBwbGljYXRpb24vdm5kLm1zLXhwc2RvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cHMKK2FwcGxpY2F0aW9uL3ZuZC5tc2VxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlcQorYXBwbGljYXRpb24vdm5kLm11c2ljaWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXMKK2FwcGxpY2F0aW9uL3ZuZC5tdXZlZS5zdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN0eQorYXBwbGljYXRpb24vdm5kLm15bmZjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdsZXQKK2FwcGxpY2F0aW9uL3ZuZC5uZXVyb2xhbmd1YWdlLm5sdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmx1CithcHBsaWNhdGlvbi92bmQubml0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50ZiBuaXRmCithcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5uZAorYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXNlYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubnMKK2FwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC13ZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm53CithcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLmRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nZGF0CithcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLnN5bWJpYW4uaW5zdGFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4tZ2FnZQorYXBwbGljYXRpb24vdm5kLm5va2lhLnJhZGlvLXByZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycHN0CithcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwc3MKK2FwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRtCithcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkeAorYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQKK2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RjCithcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0LXRlbXBsYXRlICAgICAgICAgICAgICAgICAgICAgICAgIG90YworYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5kYXRhYmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZGIKK2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RmCithcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUgICAgICAgICAgICAgICAgICAgICAgIG9kZnQKK2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RnCithcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlICAgICAgICAgICAgICAgICAgICAgIG90ZworYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZGkKK2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UtdGVtcGxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgb3RpCithcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kcAorYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGUgICAgICAgICAgICAgICAgICBvdHAKK2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RzCithcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlICAgICAgICAgICAgICAgICAgIG90cworYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZHQKK2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RtCithcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgIG90dAorYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGgKK2FwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG8KK2FwcGxpY2F0aW9uL3ZuZC5vbWEuZGQyK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQyCithcHBsaWNhdGlvbi92bmQub3Blbm9mZmljZW9yZy5leHRlbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG94dAorYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbiBwcHR4CithcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUgICAgICAgIHNsZHgKK2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3cgICAgcHBzeAorYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlICAgICBwb3R4CithcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCAgICAgICAgIHhsc3gKK2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlICAgICAgeGx0eAorYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQgICBkb2N4CithcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZSAgIGRvdHgKK2FwcGxpY2F0aW9uL3ZuZC5vc2dlby5tYXBndWlkZS5wYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWdwCithcHBsaWNhdGlvbi92bmQub3NnaS5kcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwCithcHBsaWNhdGlvbi92bmQub3NnaS5zdWJzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYQorYXBwbGljYXRpb24vdm5kLnBhbG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGIgcHFhIG9wcmMKK2FwcGxpY2F0aW9uL3ZuZC5wYXdhYWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF3CithcHBsaWNhdGlvbi92bmQucGcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cgorYXBwbGljYXRpb24vdm5kLnBnLm9zYXNsaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaTYKK2FwcGxpY2F0aW9uL3ZuZC5waWNzZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZpZgorYXBwbGljYXRpb24vdm5kLnBtaS53aWRnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZworYXBwbGljYXRpb24vdm5kLnBvY2tldGxlYXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGYKK2FwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJkCithcHBsaWNhdGlvbi92bmQucHJldmlld3N5c3RlbXMuYm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveAorYXBwbGljYXRpb24vdm5kLnByb3RldXMubWFnYXppbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZ3oKK2FwcGxpY2F0aW9uL3ZuZC5wdWJsaXNoYXJlLWRlbHRhLXRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXBzCithcHBsaWNhdGlvbi92bmQucHZpLnB0aWQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0aWQKK2FwcGxpY2F0aW9uL3ZuZC5xdWFyay5xdWFya3hwcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXhkIHF4dCBxd2QgcXd0IHF4bCBxeGIKK2FwcGxpY2F0aW9uL3ZuZC5yZWFsdm5jLmJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVkCithcHBsaWNhdGlvbi92bmQucmVjb3JkYXJlLm11c2ljeG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14bAorYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY3htbAorYXBwbGljYXRpb24vdm5kLnJpZy5jcnlwdG9ub3RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG9ub3RlCithcHBsaWNhdGlvbi92bmQucmltLmNvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZAorYXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybQorYXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYS12YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybXZiCithcHBsaWNhdGlvbi92bmQucm91dGU2Ni5saW5rNjYreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbms2NgorYXBwbGljYXRpb24vdm5kLnNhaWxpbmd0cmFja2VyLnRyYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdAorYXBwbGljYXRpb24vdm5kLnNlZW1haWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUKK2FwcGxpY2F0aW9uL3ZuZC5zZW1hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYQorYXBwbGljYXRpb24vdm5kLnNlbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1kCithcHBsaWNhdGlvbi92bmQuc2VtZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWYKK2FwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZtCithcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuZm9ybXRlbXBsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cAorYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmludGVyY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWYKK2FwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5wYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBrCithcHBsaWNhdGlvbi92bmQuc2ltdGVjaC1taW5kbWFwcGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3ZCB0d2RzCithcHBsaWNhdGlvbi92bmQuc21hZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tZgorYXBwbGljYXRpb24vdm5kLnNtYXJ0LnRlYWNoZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFjaGVyCithcHBsaWNhdGlvbi92bmQuc29sZW50LnNka20reG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNka20gc2RrZAorYXBwbGljYXRpb24vdm5kLnNwb3RmaXJlLmR4cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeHAKK2FwcGxpY2F0aW9uL3ZuZC5zcG90ZmlyZS5zZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZzCithcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYworYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5kcmF3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGEKK2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RkCithcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtZgorYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZHcgdm9yCithcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlci1nbG9iYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnbAorYXBwbGljYXRpb24vdm5kLnN0ZXBtYW5pYS5wYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXppcAorYXBwbGljYXRpb24vdm5kLnN0ZXBtYW5pYS5zdGVwY2hhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbQorYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeGMKK2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMudGVtcGxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RjCithcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN4ZAorYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdy50ZW1wbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQKK2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3hpCithcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzLnRlbXBsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aQorYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeG0KK2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3h3CithcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIuZ2xvYmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN4ZworYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLnRlbXBsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHcKK2FwcGxpY2F0aW9uL3ZuZC5zdXMtY2FsZW5kYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzIHN1c3AKK2FwcGxpY2F0aW9uL3ZuZC5zdmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZkCithcHBsaWNhdGlvbi92bmQuc3ltYmlhbi5pbnN0YWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpcyBzaXN4CithcHBsaWNhdGlvbi92bmQuc3luY21sK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzbQorYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt3YnhtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZG0KK2FwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGRtCithcHBsaWNhdGlvbi92bmQudGFvLmludGVudC1tb2R1bGUtYXJjaGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbworYXBwbGljYXRpb24vdm5kLnRjcGR1bXAucGNhcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2FwIGNhcCBkbXAKK2FwcGxpY2F0aW9uL3ZuZC50bW9iaWxlLWxpdmV0diAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1vCithcHBsaWNhdGlvbi92bmQudHJpZC50cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdAorYXBwbGljYXRpb24vdm5kLnRyaXNjYXBlLm14cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteHMKK2FwcGxpY2F0aW9uL3ZuZC50cnVlYXBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhCithcHBsaWNhdGlvbi92bmQudWZkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZCB1ZmRsCithcHBsaWNhdGlvbi92bmQudWlxLnRoZW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0egorYXBwbGljYXRpb24vdm5kLnVtYWppbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bWoKK2FwcGxpY2F0aW9uL3ZuZC51bml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHl3ZWIKK2FwcGxpY2F0aW9uL3ZuZC51b21sK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW9tbAorYXBwbGljYXRpb24vdm5kLnZjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y3gKK2FwcGxpY2F0aW9uL3ZuZC52aXNpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNkIHZzdCB2c3MgdnN3CithcHBsaWNhdGlvbi92bmQudmlzaW9uYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcworYXBwbGljYXRpb24vdm5kLnZzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2YKK2FwcGxpY2F0aW9uL3ZuZC53YXAud2J4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2J4bWwKK2FwcGxpY2F0aW9uL3ZuZC53YXAud21sYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd21sYworYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bWxzYworYXBwbGljYXRpb24vdm5kLndlYnR1cmJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGIKK2FwcGxpY2F0aW9uL3ZuZC53b2xmcmFtLnBsYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJwCithcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwZAorYXBwbGljYXRpb24vdm5kLndxZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cWQKK2FwcGxpY2F0aW9uL3ZuZC53dC5zdGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RmCithcHBsaWNhdGlvbi92bmQueGFyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhhcgorYXBwbGljYXRpb24vdm5kLnhmZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmRsCithcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LWRpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh2ZAorYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1zY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodnMKK2FwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHZwCithcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zZgorYXBwbGljYXRpb24vdm5kLnlhbWFoYS5vcGVuc2NvcmVmb3JtYXQub3NmcHZnK3htbCAgICAgICAgICAgICAgICAgICAgICAgICBvc2ZwdmcKK2FwcGxpY2F0aW9uL3ZuZC55YW1haGEuc21hZi1hdWRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmCithcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtcGhyYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZgorYXBwbGljYXRpb24vdm5kLnllbGxvd3JpdmVyLWN1c3RvbS1tZW51ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXAKK2FwcGxpY2F0aW9uL3ZuZC56dWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlyIHppcnoKK2FwcGxpY2F0aW9uL3ZuZC56emF6ei5kZWNrK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemF6CithcHBsaWNhdGlvbi92b2ljZXhtbCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ4bWwKK2FwcGxpY2F0aW9uL3dpZGdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2d0CithcHBsaWNhdGlvbi93aW5obHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscAorYXBwbGljYXRpb24vd3NkbCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsCithcHBsaWNhdGlvbi93c3BvbGljeSt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzcG9saWN5CithcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDd6CithcHBsaWNhdGlvbi94LWFiaXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFidworYXBwbGljYXRpb24veC1hY2UtY29tcHJlc3NlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2UKK2FwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1iaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFiIHgzMiB1MzIgdm94CithcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhbQorYXBwbGljYXRpb24veC1hdXRob3J3YXJlLXNlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXMKK2FwcGxpY2F0aW9uL3gtYmNwaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNwaW8KK2FwcGxpY2F0aW9uL3gtYml0dG9ycmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9ycmVudAorYXBwbGljYXRpb24veC1ibG9yYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGIgYmxvcmIKK2FwcGxpY2F0aW9uL3gtYnppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnoKK2FwcGxpY2F0aW9uL3gtYnppcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnoyIGJvegorYXBwbGljYXRpb24veC1jYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYnIgY2JhIGNidCBjYnogY2I3CithcHBsaWNhdGlvbi94LWNkbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjZAorYXBwbGljYXRpb24veC1jZnMtY29tcHJlc3NlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMKK2FwcGxpY2F0aW9uL3gtY2hhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhdAorYXBwbGljYXRpb24veC1jaGVzcy1wZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ24KK2FwcGxpY2F0aW9uL3gtY2hyb21lLWV4dGVuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J4CithcHBsaWNhdGlvbi94LWNvY29hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjbworYXBwbGljYXRpb24veC1jb25mZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2MKK2FwcGxpY2F0aW9uL3gtY3BpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BpbworYXBwbGljYXRpb24veC1jc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2gKK2FwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRlYgorYXBwbGljYXRpb24veC1kZ2MtY29tcHJlc3NlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZ2MKK2FwcGxpY2F0aW9uL3gtZGlyZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyIGRjciBkeHIgY3N0IGNjdCBjeHQgdzNkIGZnZCBzd2EKK2FwcGxpY2F0aW9uL3gtZG9vbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FkCithcHBsaWNhdGlvbi94LWR0Ym5jeCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jeAorYXBwbGljYXRpb24veC1kdGJvb2sreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGIKK2FwcGxpY2F0aW9uL3gtZHRicmVzb3VyY2UreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzCithcHBsaWNhdGlvbi94LWR2aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2aQorYXBwbGljYXRpb24veC1lbnZveSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnkKK2FwcGxpY2F0aW9uL3gtZXZhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhCithcHBsaWNhdGlvbi94LWZvbnQtYmRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkZgorYXBwbGljYXRpb24veC1mb250LWdob3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2YKK2FwcGxpY2F0aW9uL3gtZm9udC1saW51eC1wc2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNmCithcHBsaWNhdGlvbi94LWZvbnQtb3RmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90ZgorYXBwbGljYXRpb24veC1mb250LXBjZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2YKK2FwcGxpY2F0aW9uL3gtZm9udC1zbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25mCithcHBsaWNhdGlvbi94LWZvbnQtdHRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0ZiB0dGMKK2FwcGxpY2F0aW9uL3gtZm9udC10eXBlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZhIHBmYiBwZm0gYWZtCithcHBsaWNhdGlvbi94LWZyZWVhcmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYworYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGwKK2FwcGxpY2F0aW9uL3gtZ2NhLWNvbXByZXNzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NhCithcHBsaWNhdGlvbi94LWdsdWx4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVseAorYXBwbGljYXRpb24veC1nbnVtZXJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbnVtZXJpYworYXBwbGljYXRpb24veC1ncmFtcHMteG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtcHMKK2FwcGxpY2F0aW9uL3gtZ3RhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RhcgorYXBwbGljYXRpb24veC1oZGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGYKK2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhwCithcHBsaWNhdGlvbi94LWluc3RhbGwtaW5zdHJ1Y3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGwKK2FwcGxpY2F0aW9uL3gtamF2YS1hcmNoaXZlLWRpZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyZGlmZgorYXBwbGljYXRpb24veC1qYXZhLWpubHAtZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbmxwCithcHBsaWNhdGlvbi94LWxhdGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGV4CithcHBsaWNhdGlvbi94LWx1YS1ieXRlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YWMKK2FwcGxpY2F0aW9uL3gtbHpoLWNvbXByZXNzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHpoIGxoYQorYXBwbGljYXRpb24veC1tYWtlc2VsZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4KK2FwcGxpY2F0aW9uL3gtbWllICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWllCithcHBsaWNhdGlvbi94LW1vYmlwb2NrZXQtZWJvb2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByYyBtb2JpCithcHBsaWNhdGlvbi94LW1zLWFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uCithcHBsaWNhdGlvbi94LW1zLXNob3J0Y3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuaworYXBwbGljYXRpb24veC1tcy13bWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bWQKK2FwcGxpY2F0aW9uL3gtbXMtd216ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd216CithcHBsaWNhdGlvbi94LW1zLXhiYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhiYXAKK2FwcGxpY2F0aW9uL3gtbXNhY2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRiCithcHBsaWNhdGlvbi94LW1zYmluZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZAorYXBwbGljYXRpb24veC1tc2NhcmRmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmQKK2FwcGxpY2F0aW9uL3gtbXNjbGlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xwCithcHBsaWNhdGlvbi94LW1zZG93bmxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbSBiYXQKK2FwcGxpY2F0aW9uL3gtbXNtZWRpYXZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZiIG0xMyBtMTQKK2FwcGxpY2F0aW9uL3gtbXNtZXRhZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd21mIGVtZiBlbXoKK2FwcGxpY2F0aW9uL3gtbXNtb25leSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW55CithcHBsaWNhdGlvbi94LW1zcHVibGlzaGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YgorYXBwbGljYXRpb24veC1tc3NjaGVkdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2QKK2FwcGxpY2F0aW9uL3gtbXN0ZXJtaW5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJtCithcHBsaWNhdGlvbi94LW1zd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaQorYXBwbGljYXRpb24veC1uZXRjZGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYyBjZGYKK2FwcGxpY2F0aW9uL3gtbnMtcHJveHktYXV0b2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjCithcHBsaWNhdGlvbi94LW56YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG56YgorYXBwbGljYXRpb24veC1wZXJsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbCBwbQorYXBwbGljYXRpb24veC1wa2NzMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMTIgcGZ4CithcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRpZmljYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA3YiBzcGMKK2FwcGxpY2F0aW9uL3gtcGtjczctY2VydHJlcXJlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDdyCithcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhcgorYXBwbGljYXRpb24veC1yZWRoYXQtcGFja2FnZS1tYW5hZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycG0KK2FwcGxpY2F0aW9uL3gtcmVzZWFyY2gtaW5mby1zeXN0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzCithcHBsaWNhdGlvbi94LXNlYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYQorYXBwbGljYXRpb24veC1zaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaAorYXBwbGljYXRpb24veC1zaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyCithcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZgorYXBwbGljYXRpb24veC1zaWx2ZXJsaWdodC1hcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YXAKK2FwcGxpY2F0aW9uL3gtc3FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsCithcHBsaWNhdGlvbi94LXN0dWZmaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdAorYXBwbGljYXRpb24veC1zdHVmZml0eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXR4CithcHBsaWNhdGlvbi94LXN1YnJpcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNydAorYXBwbGljYXRpb24veC1zdjRjcGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdjRjcGlvCithcHBsaWNhdGlvbi94LXN2NGNyYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2NGNyYworYXBwbGljYXRpb24veC10M3ZtLWltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MworYXBwbGljYXRpb24veC10YWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW0KK2FwcGxpY2F0aW9uL3gtdGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyCithcHBsaWNhdGlvbi94LXRjbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjbCB0aworYXBwbGljYXRpb24veC10ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXgKK2FwcGxpY2F0aW9uL3gtdGV4LXRmbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZtCithcHBsaWNhdGlvbi94LXRleGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGluZm8gdGV4aQorYXBwbGljYXRpb24veC10Z2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmoKK2FwcGxpY2F0aW9uL3gtdXN0YXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXN0YXIKK2FwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjCithcHBsaWNhdGlvbi94LXdlYi1hcHAtbWFuaWZlc3QranNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmFwcAorYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXIgY3J0IHBlbQorYXBwbGljYXRpb24veC14ZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWcKK2FwcGxpY2F0aW9uL3gteGxpZmYreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxmCithcHBsaWNhdGlvbi94LXhwaW5zdGFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwaQorYXBwbGljYXRpb24veC14eiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4egorYXBwbGljYXRpb24veC16bWFjaGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6MSB6MiB6MyB6NCB6NSB6NiB6NyB6OAorYXBwbGljYXRpb24veGFtbCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YW1sCithcHBsaWNhdGlvbi94Y2FwLWRpZmYreG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkZgorYXBwbGljYXRpb24veGVuYyt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZW5jCithcHBsaWNhdGlvbi94aHRtbCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhodG1sIHhodAorYXBwbGljYXRpb24veG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwgeHNsIHhzZAorYXBwbGljYXRpb24veG1sLWR0ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGQKK2FwcGxpY2F0aW9uL3hvcCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9wCithcHBsaWNhdGlvbi94cHJvYyt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwbAorYXBwbGljYXRpb24veHNsdCt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2x0CithcHBsaWNhdGlvbi94c3BmK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzcGYKK2FwcGxpY2F0aW9uL3h2K3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXhtbCB4aHZtbCB4dm1sIHh2bQorYXBwbGljYXRpb24veWFuZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YW5nCithcHBsaWNhdGlvbi95aW4reG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpbgorYXBwbGljYXRpb24vemlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXAKK2F1ZGlvL2FkcGNtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRwCithdWRpby9iYXNpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1IHNuZAorYXVkaW8vbWlkaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWQgbWlkaSBrYXIgcm1pCithdWRpby9tcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNGEgbTRhCithdWRpby9tcGVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZ2EgbXAyIG1wMmEgbXAzIG0yYSBtM2EKK2F1ZGlvL29nZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2dhIG9nZyBzcHgKK2F1ZGlvL3MzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczNtCithdWRpby9zaWxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbAorYXVkaW8vdm5kLmRlY2UuYXVkaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dmEgdXZ2YQorYXVkaW8vdm5kLmRpZ2l0YWwtd2luZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2wKK2F1ZGlvL3ZuZC5kcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhCithdWRpby92bmQuZHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0cworYXVkaW8vdm5kLmR0cy5oZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHNoZAorYXVkaW8vdm5kLmx1Y2VudC52b2ljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdnAKK2F1ZGlvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHlhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlhCithdWRpby92bmQubnVlcmEuZWNlbHA0ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjZWxwNDgwMAorYXVkaW8vdm5kLm51ZXJhLmVjZWxwNzQ3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2VscDc0NzAKK2F1ZGlvL3ZuZC5udWVyYS5lY2VscDk2MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNlbHA5NjAwCithdWRpby92bmQucmlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpcAorYXVkaW8vd2F2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXYKK2F1ZGlvL3dlYm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViYQorYXVkaW8veC1hYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWMKK2F1ZGlvL3gtYWlmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlmIGFpZmYgYWlmYworYXVkaW8veC1jYWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWYKK2F1ZGlvL3gtZmxhYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhYworYXVkaW8veC1tYXRyb3NrYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBta2EKK2F1ZGlvL3gtbXBlZ3VybCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTN1CithdWRpby94LW1zLXdheCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdheAorYXVkaW8veC1tcy13bWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bWEKK2F1ZGlvL3gtcG4tcmVhbGF1ZGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtIHJhCithdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtcAorYXVkaW8veG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bQorY2hlbWljYWwveC1jZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZHgKK2NoZW1pY2FsL3gtY2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lmCitjaGVtaWNhbC94LWNtZGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZGYKK2NoZW1pY2FsL3gtY21sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21sCitjaGVtaWNhbC94LWNzbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzbWwKK2NoZW1pY2FsL3gteHl6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHl6CitpbWFnZS9ibXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcAoraW1hZ2UvY2dtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZ20KK2ltYWdlL2czZmF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZzMKK2ltYWdlL2dpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmCitpbWFnZS9pZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZgoraW1hZ2UvanBlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnIGpwZyBqcGUKK2ltYWdlL2t0eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3R4CitpbWFnZS9wbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZworaW1hZ2UvcHJzLmJ0aWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmCitpbWFnZS9zZ2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnaQoraW1hZ2Uvc3ZnK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmcgc3ZnegoraW1hZ2UvdGlmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWZmIHRpZgoraW1hZ2Uvdm5kLmFkb2JlLnBob3Rvc2hvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2QKK2ltYWdlL3ZuZC5kZWNlLmdyYXBoaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZpIHV2dmkgdXZnIHV2dmcKK2ltYWdlL3ZuZC5kanZ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGp2dSBkanYKK2ltYWdlL3ZuZC5kdmIuc3VidGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViCitpbWFnZS92bmQuZHdnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3ZworaW1hZ2Uvdm5kLmR4ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeGYKK2ltYWdlL3ZuZC5mYXN0Ymlkc2hlZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJzCitpbWFnZS92bmQuZnB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZweAoraW1hZ2Uvdm5kLmZzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc3QKK2ltYWdlL3ZuZC5mdWppeGVyb3guZWRtaWNzLW1tciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1yCitpbWFnZS92bmQuZnVqaXhlcm94LmVkbWljcy1ybGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJsYworaW1hZ2Uvdm5kLm1zLW1vZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGkKK2ltYWdlL3ZuZC5tcy1waG90byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2RwCitpbWFnZS92bmQubmV0LWZweCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5weAoraW1hZ2Uvdm5kLndhcC53Ym1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Ym1wCitpbWFnZS92bmQueGlmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpZgoraW1hZ2Uvd2VicCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJwCitpbWFnZS94LTNkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNkcworaW1hZ2UveC1jbXUtcmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXMKK2ltYWdlL3gtY214ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY214CitpbWFnZS94LWZyZWVoYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoIGZoYyBmaDQgZmg1IGZoNworaW1hZ2UveC1pY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY28KK2ltYWdlL3gtam5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam5nCitpbWFnZS94LW1yc2lkLWltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZAoraW1hZ2UveC1wY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3gKK2ltYWdlL3gtcGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljIHBjdAoraW1hZ2UveC1wb3J0YWJsZS1hbnltYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbm0KK2ltYWdlL3gtcG9ydGFibGUtYml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJtCitpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnbQoraW1hZ2UveC1wb3J0YWJsZS1waXhtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcG0KK2ltYWdlL3gtcmdiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiCitpbWFnZS94LXRnYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRnYQoraW1hZ2UveC14Yml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Ym0KK2ltYWdlL3gteHBpeG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBtCitpbWFnZS94LXh3aW5kb3dkdW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh3ZAorbWVzc2FnZS9yZmM4MjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWwgbWltZQorbW9kZWwvaWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ3MgaWdlcworbW9kZWwvbWVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ggbWVzaCBzaWxvCittb2RlbC92bmQuY29sbGFkYSt4bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhZQorbW9kZWwvdm5kLmR3ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd2YKK21vZGVsL3ZuZC5nZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RsCittb2RlbC92bmQuZ3R3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0dworbW9kZWwvdm5kLm10cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdHMKK21vZGVsL3ZuZC52dHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR1Cittb2RlbC92cm1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdybCB2cm1sCittb2RlbC94M2QrYmluYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzZGIgeDNkYnoKK21vZGVsL3gzZCt2cm1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDNkdiB4M2R2egorbW9kZWwveDNkK3htbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4M2QgeDNkegordGV4dC9jYWNoZS1tYW5pZmVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBjYWNoZSBtYW5pZmVzdAordGV4dC9jYWxlbmRhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3MgaWZiCit0ZXh0L2NvZmZlZXNjcmlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZmZlZSBsaXRjb2ZmZWUKK3RleHQvY3NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzCit0ZXh0L2NzdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdgordGV4dC9oanNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanNvbgordGV4dC9odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sIGh0bSBzaHRtbAordGV4dC9qYWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYWRlCit0ZXh0L2pzeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzeAordGV4dC9sZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzCit0ZXh0L21hdGhtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tbAordGV4dC9uMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMwordGV4dC9wbGFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQgdGV4dCBjb25mIGRlZiBsaXN0IGxvZyBpbiBpbmkKK3RleHQvcHJzLmxpbmVzLnRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNjCit0ZXh0L3JpY2h0ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0eAordGV4dC9zZ21sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ21sIHNnbQordGV4dC9zdHlsdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsdXMgc3R5bAordGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3YKK3RleHQvdHJvZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCB0ciByb2ZmIG1hbiBtZSBtcwordGV4dC90dXJ0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGwKK3RleHQvdXJpLWxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpIHVyaXMgdXJscwordGV4dC92Y2FyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y2FyZAordGV4dC92bmQuY3VybCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsCit0ZXh0L3ZuZC5jdXJsLmRjdXJsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjdXJsCit0ZXh0L3ZuZC5jdXJsLm1jdXJsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jdXJsCit0ZXh0L3ZuZC5jdXJsLnNjdXJsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjdXJsCit0ZXh0L3ZuZC5mbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseQordGV4dC92bmQuZm1pLmZsZXhzdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHgKK3RleHQvdm5kLmdyYXBodml6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3YKK3RleHQvdm5kLmluM2QuM2RtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM2RtbAordGV4dC92bmQuaW4zZC5zcG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG90Cit0ZXh0L3ZuZC5zdW4uajJtZS5hcHAtZGVzY3JpcHRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphZAordGV4dC92bmQud2FwLndtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bWwKK3RleHQvdm5kLndhcC53bWxzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd21scwordGV4dC92dHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dHQKK3RleHQveC1hc20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyBhc20KK3RleHQveC1jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyBjYyBjeHggY3BwIGggaGggZGljCit0ZXh0L3gtY29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0YwordGV4dC94LWZvcnRyYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIGZvciBmNzcgZjkwCit0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhicwordGV4dC94LWphdmEtc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhCit0ZXh0L3gtbHVhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YQordGV4dC94LW1hcmtkb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93biBtZCBta2QKK3RleHQveC1uZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmZvCit0ZXh0L3gtb3BtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wbWwKK3RleHQveC1wYXNjYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCBwYXMKK3RleHQveC1wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRlCit0ZXh0L3gtc2FzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhc3MKK3RleHQveC1zY3NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NzcwordGV4dC94LXNldGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldHgKK3RleHQveC1zZnYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Z2Cit0ZXh0L3gtdXVlbmNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1Cit0ZXh0L3gtdmNhbGVuZGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjcwordGV4dC94LXZjYXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y2YKK3RleHQveWFtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWFtbCB5bWwKK3ZpZGVvLzNncHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM2dwIDNncHAKK3ZpZGVvLzNncHAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM2cyCit2aWRlby9oMjYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjEKK3ZpZGVvL2gyNjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2MwordmlkZW8vaDI2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0Cit2aWRlby9qcGVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZ3YKK3ZpZGVvL2pwbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBtIGpwZ20KK3ZpZGVvL21qMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWoyIG1qcDIKK3ZpZGVvL21wMnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMKK3ZpZGVvL21wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXA0IG1wNHYgbXBnNAordmlkZW8vbXBlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnIG1wZyBtcGUgbTF2IG0ydgordmlkZW8vb2dnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ3YKK3ZpZGVvL3F1aWNrdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXQgbW92Cit2aWRlby92bmQuZGVjZS5oZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2aCB1dnZoCit2aWRlby92bmQuZGVjZS5tb2JpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bSB1dnZtCit2aWRlby92bmQuZGVjZS5wZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2cCB1dnZwCit2aWRlby92bmQuZGVjZS5zZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2cyB1dnZzCit2aWRlby92bmQuZGVjZS52aWRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2diB1dnZ2Cit2aWRlby92bmQuZHZiLmZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2YgordmlkZW8vdm5kLmZ2dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdnQKK3ZpZGVvL3ZuZC5tcGVndXJsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXh1IG00dQordmlkZW8vdm5kLm1zLXBsYXlyZWFkeS5tZWRpYS5weXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXYKK3ZpZGVvL3ZuZC51dnZ1Lm1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZ1IHV2dnUKK3ZpZGVvL3ZuZC52aXZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdml2Cit2aWRlby93ZWJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYm0KK3ZpZGVvL3gtZjR2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjR2Cit2aWRlby94LWZsaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaQordmlkZW8veC1mbHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHYKK3ZpZGVvL3gtbTR2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTR2Cit2aWRlby94LW1hdHJvc2thICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1rdiBtazNkIG1rcwordmlkZW8veC1tbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbmcKK3ZpZGVvL3gtbXMtYXNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNmIGFzeAordmlkZW8veC1tcy12b2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2IKK3ZpZGVvL3gtbXMtd20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd20KK3ZpZGVvL3gtbXMtd212ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd212Cit2aWRlby94LW1zLXdteCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdteAordmlkZW8veC1tcy13dnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dngKK3ZpZGVvL3gtbXN2aWRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpCit2aWRlby94LXNnaS1tb3ZpZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllCit2aWRlby94LXNtdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtdgoreC1jb25mZXJlbmNlL3gtY29vbHRhbGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9wYWdlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcGFnZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmM2Y2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcGFnZS5yYgpAQCAtMCwwICsxLDE4NSBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBQYWdlCisgICAgaW5jbHVkZSBDb252ZXJ0aWJsZQorCisgICAgYXR0cl93cml0ZXIgOmRpcgorICAgIGF0dHJfYWNjZXNzb3IgOnNpdGUsIDpwYWdlcgorICAgIGF0dHJfYWNjZXNzb3IgOm5hbWUsIDpleHQsIDpiYXNlbmFtZQorICAgIGF0dHJfYWNjZXNzb3IgOmRhdGEsIDpjb250ZW50LCA6b3V0cHV0CisKKyAgICBhbGlhc19tZXRob2QgOmV4dG5hbWUsIDpleHQKKworICAgIEZPUldBUkRfU0xBU0ggPSAiLyIuZnJlZXplCisKKyAgICAjIEF0dHJpYnV0ZXMgZm9yIExpcXVpZCB0ZW1wbGF0ZXMKKyAgICBBVFRSSUJVVEVTX0ZPUl9MSVFVSUQgPSAldygKKyAgICAgIGNvbnRlbnQKKyAgICAgIGRpcgorICAgICAgbmFtZQorICAgICAgcGF0aAorICAgICAgdXJsCisgICAgKS5mcmVlemUKKworICAgICMgQSBzZXQgb2YgZXh0ZW5zaW9ucyB0aGF0IGFyZSBjb25zaWRlcmVkIEhUTUwgb3IgSFRNTC1saWtlIHNvIHdlCisgICAgIyBzaG91bGQgbm90IGFsdGVyIHRoZW0sICB0aGlzIGluY2x1ZGVzIC54aHRtbCB0aHJvdWdoIFhIVE01LgorCisgICAgSFRNTF9FWFRFTlNJT05TID0gJXcoCisgICAgICAuaHRtbAorICAgICAgLnhodG1sCisgICAgICAuaHRtCisgICAgKS5mcmVlemUKKworICAgICMgSW5pdGlhbGl6ZSBhIG5ldyBQYWdlLgorICAgICMKKyAgICAjIHNpdGUgLSBUaGUgU2l0ZSBvYmplY3QuCisgICAgIyBiYXNlIC0gVGhlIFN0cmluZyBwYXRoIHRvIHRoZSBzb3VyY2UuCisgICAgIyBkaXIgIC0gVGhlIFN0cmluZyBwYXRoIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGhlIGZpbGUuCisgICAgIyBuYW1lIC0gVGhlIFN0cmluZyBmaWxlbmFtZSBvZiB0aGUgZmlsZS4KKyAgICBkZWYgaW5pdGlhbGl6ZShzaXRlLCBiYXNlLCBkaXIsIG5hbWUpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICAgIEBiYXNlID0gYmFzZQorICAgICAgQGRpciAgPSBkaXIKKyAgICAgIEBuYW1lID0gbmFtZQorICAgICAgQHBhdGggPSBpZiBzaXRlLmluX3RoZW1lX2RpcihiYXNlKSA9PSBiYXNlICMgd2UncmUgaW4gYSB0aGVtZQorICAgICAgICAgICAgICAgIHNpdGUuaW5fdGhlbWVfZGlyKGJhc2UsIGRpciwgbmFtZSkKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNpdGUuaW5fc291cmNlX2RpcihiYXNlLCBkaXIsIG5hbWUpCisgICAgICAgICAgICAgIGVuZAorCisgICAgICBwcm9jZXNzKG5hbWUpCisgICAgICByZWFkX3lhbWwoRmlsZS5qb2luKGJhc2UsIGRpciksIG5hbWUpCisKKyAgICAgIGRhdGEuZGVmYXVsdF9wcm9jID0gcHJvYyBkbyB8Xywga2V5fAorICAgICAgICBzaXRlLmZyb250bWF0dGVyX2RlZmF1bHRzLmZpbmQoRmlsZS5qb2luKGRpciwgbmFtZSksIHR5cGUsIGtleSkKKyAgICAgIGVuZAorCisgICAgICBKZWt5bGw6Okhvb2tzLnRyaWdnZXIgOnBhZ2VzLCA6cG9zdF9pbml0LCBzZWxmCisgICAgZW5kCisKKyAgICAjIFRoZSBnZW5lcmF0ZWQgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHBhZ2Ugd2lsbCBiZSBwbGFjZWQKKyAgICAjIHVwb24gZ2VuZXJhdGlvbi4gVGhpcyBpcyBkZXJpdmVkIGZyb20gdGhlIHBlcm1hbGluayBvciwgaWYKKyAgICAjIHBlcm1hbGluayBpcyBhYnNlbnQsIHdpbGwgYmUgJy8nCisgICAgIworICAgICMgUmV0dXJucyB0aGUgU3RyaW5nIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICBkZWYgZGlyCisgICAgICBpZiB1cmwuZW5kX3dpdGg/KEZPUldBUkRfU0xBU0gpCisgICAgICAgIHVybAorICAgICAgZWxzZQorICAgICAgICB1cmxfZGlyID0gRmlsZS5kaXJuYW1lKHVybCkKKyAgICAgICAgdXJsX2Rpci5lbmRfd2l0aD8oRk9SV0FSRF9TTEFTSCkgPyB1cmxfZGlyIDogIiN7dXJsX2Rpcn0vIgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRoZSBmdWxsIHBhdGggYW5kIGZpbGVuYW1lIG9mIHRoZSBwb3N0LiBEZWZpbmVkIGluIHRoZSBZQU1MIG9mIHRoZSBwb3N0CisgICAgIyBib2R5LgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIFN0cmluZyBwZXJtYWxpbmsgb3IgbmlsIGlmIG5vbmUgaGFzIGJlZW4gc2V0LgorICAgIGRlZiBwZXJtYWxpbmsKKyAgICAgIGRhdGEubmlsPyA/IG5pbCA6IGRhdGFbInBlcm1hbGluayJdCisgICAgZW5kCisKKyAgICAjIFRoZSB0ZW1wbGF0ZSBvZiB0aGUgcGVybWFsaW5rLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHRlbXBsYXRlIFN0cmluZy4KKyAgICBkZWYgdGVtcGxhdGUKKyAgICAgIGlmICFodG1sPworICAgICAgICAiLzpwYXRoLzpiYXNlbmFtZTpvdXRwdXRfZXh0IgorICAgICAgZWxzaWYgaW5kZXg/CisgICAgICAgICIvOnBhdGgvIgorICAgICAgZWxzZQorICAgICAgICBVdGlscy5hZGRfcGVybWFsaW5rX3N1ZmZpeCgiLzpwYXRoLzpiYXNlbmFtZSIsIHNpdGUucGVybWFsaW5rX3N0eWxlKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRoZSBnZW5lcmF0ZWQgcmVsYXRpdmUgdXJsIG9mIHRoaXMgcGFnZS4gZS5nLiAvYWJvdXQuaHRtbC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBTdHJpbmcgdXJsLgorICAgIGRlZiB1cmwKKyAgICAgIEB1cmwgfHw9IFVSTC5uZXcoeworICAgICAgICA6dGVtcGxhdGUgICAgID0+IHRlbXBsYXRlLAorICAgICAgICA6cGxhY2Vob2xkZXJzID0+IHVybF9wbGFjZWhvbGRlcnMsCisgICAgICAgIDpwZXJtYWxpbmsgICAgPT4gcGVybWFsaW5rLAorICAgICAgfSkudG9fcworICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGEgaGFzaCBvZiBVUkwgcGxhY2Vob2xkZXIgbmFtZXMgKGFzIHN5bWJvbHMpIG1hcHBpbmcgdG8gdGhlCisgICAgIyBkZXNpcmVkIHBsYWNlaG9sZGVyIHJlcGxhY2VtZW50cy4gRm9yIGRldGFpbHMgc2VlICJ1cmwucmIiCisgICAgZGVmIHVybF9wbGFjZWhvbGRlcnMKKyAgICAgIHsKKyAgICAgICAgOnBhdGggICAgICAgPT4gQGRpciwKKyAgICAgICAgOmJhc2VuYW1lICAgPT4gYmFzZW5hbWUsCisgICAgICAgIDpvdXRwdXRfZXh0ID0+IG91dHB1dF9leHQsCisgICAgICB9CisgICAgZW5kCisKKyAgICAjIEV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGFnZSBmaWxlbmFtZS4KKyAgICAjCisgICAgIyBuYW1lIC0gVGhlIFN0cmluZyBmaWxlbmFtZSBvZiB0aGUgcGFnZSBmaWxlLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgcHJvY2VzcyhuYW1lKQorICAgICAgc2VsZi5leHQgPSBGaWxlLmV4dG5hbWUobmFtZSkKKyAgICAgIHNlbGYuYmFzZW5hbWUgPSBuYW1lWzAuLi1leHQubGVuZ3RoIC0gMV0KKyAgICBlbmQKKworICAgICMgQWRkIGFueSBuZWNlc3NhcnkgbGF5b3V0cyB0byB0aGlzIHBvc3QKKyAgICAjCisgICAgIyBsYXlvdXRzICAgICAgLSBUaGUgSGFzaCBvZiB7Im5hbWUiID0+ICJsYXlvdXQifS4KKyAgICAjIHNpdGVfcGF5bG9hZCAtIFRoZSBzaXRlIHBheWxvYWQgSGFzaC4KKyAgICAjCisgICAgIyBSZXR1cm5zIFN0cmluZyByZW5kZXJlZCBwYWdlLgorICAgIGRlZiByZW5kZXIobGF5b3V0cywgc2l0ZV9wYXlsb2FkKQorICAgICAgc2l0ZV9wYXlsb2FkWyJwYWdlIl0gPSB0b19saXF1aWQKKyAgICAgIHNpdGVfcGF5bG9hZFsicGFnaW5hdG9yIl0gPSBwYWdlci50b19saXF1aWQKKworICAgICAgZG9fbGF5b3V0KHNpdGVfcGF5bG9hZCwgbGF5b3V0cykKKyAgICBlbmQKKworICAgICMgVGhlIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlCisgICAgIworICAgICMgUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgc291cmNlIGZpbGUKKyAgICBkZWYgcGF0aAorICAgICAgZGF0YS5mZXRjaCgicGF0aCIpIHsgcmVsYXRpdmVfcGF0aCB9CisgICAgZW5kCisKKyAgICAjIFRoZSBwYXRoIHRvIHRoZSBwYWdlIHNvdXJjZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUgc2l0ZSBzb3VyY2UKKyAgICBkZWYgcmVsYXRpdmVfcGF0aAorICAgICAgRmlsZS5qb2luKCpbQGRpciwgQG5hbWVdLm1hcCgmOnRvX3MpLnJlamVjdCgmOmVtcHR5PykpLnN1YiglciFcQVwvISwgIiIpCisgICAgZW5kCisKKyAgICAjIE9idGFpbiBkZXN0aW5hdGlvbiBwYXRoLgorICAgICMKKyAgICAjIGRlc3QgLSBUaGUgU3RyaW5nIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGRpci4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBmaWxlIHBhdGggU3RyaW5nLgorICAgIGRlZiBkZXN0aW5hdGlvbihkZXN0KQorICAgICAgcGF0aCA9IHNpdGUuaW5fZGVzdF9kaXIoZGVzdCwgVVJMLnVuZXNjYXBlX3BhdGgodXJsKSkKKyAgICAgIHBhdGggPSBGaWxlLmpvaW4ocGF0aCwgImluZGV4IikgaWYgdXJsLmVuZF93aXRoPygiLyIpCisgICAgICBwYXRoIDw8IG91dHB1dF9leHQgdW5sZXNzIHBhdGguZW5kX3dpdGg/IG91dHB1dF9leHQKKyAgICAgIHBhdGgKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgb2JqZWN0IGFzIGEgZGVidWcgU3RyaW5nLgorICAgIGRlZiBpbnNwZWN0CisgICAgICAiIzxKZWt5bGw6UGFnZSBAbmFtZT0je25hbWUuaW5zcGVjdH0+IgorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBCb29sZWFuIG9mIHdoZXRoZXIgdGhpcyBQYWdlIGlzIEhUTUwgb3Igbm90LgorICAgIGRlZiBodG1sPworICAgICAgSFRNTF9FWFRFTlNJT05TLmluY2x1ZGU/KG91dHB1dF9leHQpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIEJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIFBhZ2UgaXMgYW4gaW5kZXggZmlsZSBvciBub3QuCisgICAgZGVmIGluZGV4PworICAgICAgYmFzZW5hbWUgPT0gImluZGV4IgorICAgIGVuZAorCisgICAgZGVmIHRyaWdnZXJfaG9va3MoaG9va19uYW1lLCAqYXJncykKKyAgICAgIEpla3lsbDo6SG9va3MudHJpZ2dlciA6cGFnZXMsIGhvb2tfbmFtZSwgc2VsZiwgKmFyZ3MKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZT8KKyAgICAgIHRydWUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3BsdWdpbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3BsdWdpbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU1MDIzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcGx1Z2luLnJiCkBAIC0wLDAgKzEsOTYgQEAKK21vZHVsZSBKZWt5bGwKKyAgY2xhc3MgUGx1Z2luCisgICAgUFJJT1JJVElFUyA9IHsKKyAgICAgIDpsb3cgICAgID0+IC0xMCwKKyAgICAgIDpoaWdoZXN0ID0+IDEwMCwKKyAgICAgIDpsb3dlc3QgID0+IC0xMDAsCisgICAgICA6bm9ybWFsICA9PiAwLAorICAgICAgOmhpZ2ggICAgPT4gMTAsCisgICAgfS5mcmVlemUKKworICAgICMKKworICAgIGRlZiBzZWxmLmluaGVyaXRlZChjb25zdCkKKyAgICAgIHJldHVybiBjYXRjaF9pbmhlcml0YW5jZShjb25zdCkgZG8gfGNvbnN0X3wKKyAgICAgICAgY2F0Y2hfaW5oZXJpdGFuY2UoY29uc3RfKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjCisKKyAgICBkZWYgc2VsZi5jYXRjaF9pbmhlcml0YW5jZShjb25zdCkKKyAgICAgIGNvbnN0LmRlZmluZV9zaW5nbGV0b25fbWV0aG9kIDppbmhlcml0ZWQgZG8gfGNvbnN0X3wKKyAgICAgICAgKEBjaGlsZHJlbiB8fD0gU2V0Lm5ldykuYWRkIGNvbnN0XworICAgICAgICBpZiBibG9ja19naXZlbj8KKyAgICAgICAgICB5aWVsZCBjb25zdF8KKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMKKworICAgIGRlZiBzZWxmLmRlc2NlbmRhbnRzCisgICAgICBAY2hpbGRyZW4gfHw9IFNldC5uZXcKKyAgICAgIG91dCA9IEBjaGlsZHJlbi5tYXAoJjpkZXNjZW5kYW50cykKKyAgICAgIG91dCA8PCBzZWxmIHVubGVzcyBzdXBlcmNsYXNzID09IFBsdWdpbgorICAgICAgU2V0Lm5ldyhvdXQpLmZsYXR0ZW4KKyAgICBlbmQKKworICAgICMgR2V0IG9yIHNldCB0aGUgcHJpb3JpdHkgb2YgdGhpcyBwbHVnaW4uIFdoZW4gY2FsbGVkIHdpdGhvdXQgYW4KKyAgICAjIGFyZ3VtZW50IGl0IHJldHVybnMgdGhlIHByaW9yaXR5LiBXaGVuIGFuIGFyZ3VtZW50IGlzIGdpdmVuLCBpdCB3aWxsCisgICAgIyBzZXQgdGhlIHByaW9yaXR5LgorICAgICMKKyAgICAjIHByaW9yaXR5IC0gVGhlIFN5bWJvbCBwcmlvcml0eSAoZGVmYXVsdDogbmlsKS4gVmFsaWQgb3B0aW9ucyBhcmU6CisgICAgIyAgICAgICAgICAgIDpsb3dlc3QsIDpsb3csIDpub3JtYWwsIDpoaWdoLCA6aGlnaGVzdAorICAgICMKKyAgICAjIFJldHVybnMgdGhlIFN5bWJvbCBwcmlvcml0eS4KKyAgICBkZWYgc2VsZi5wcmlvcml0eShwcmlvcml0eSA9IG5pbCkKKyAgICAgIEBwcmlvcml0eSB8fD0gbmlsCisgICAgICBpZiBwcmlvcml0eSAmJiBQUklPUklUSUVTLmtleT8ocHJpb3JpdHkpCisgICAgICAgIEBwcmlvcml0eSA9IHByaW9yaXR5CisgICAgICBlbmQKKyAgICAgIEBwcmlvcml0eSB8fCA6bm9ybWFsCisgICAgZW5kCisKKyAgICAjIEdldCBvciBzZXQgdGhlIHNhZmV0eSBvZiB0aGlzIHBsdWdpbi4gV2hlbiBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudAorICAgICMgaXQgcmV0dXJucyB0aGUgc2FmZXR5LiBXaGVuIGFuIGFyZ3VtZW50IGlzIGdpdmVuLCBpdCB3aWxsIHNldCB0aGUKKyAgICAjIHNhZmV0eS4KKyAgICAjCisgICAgIyBzYWZlIC0gVGhlIEJvb2xlYW4gc2FmZXR5IChkZWZhdWx0OiBuaWwpLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHNhZmV0eSBCb29sZWFuLgorICAgIGRlZiBzZWxmLnNhZmUoc2FmZSA9IG5pbCkKKyAgICAgIHVubGVzcyBkZWZpbmVkPyhAc2FmZSkgJiYgc2FmZS5uaWw/CisgICAgICAgIEBzYWZlID0gc2FmZQorICAgICAgZW5kCisgICAgICBAc2FmZSB8fCBmYWxzZQorICAgIGVuZAorCisgICAgIyBTcGFjZXNoaXAgaXMgcHJpb3JpdHkgW2hpZ2hlciAtPiBsb3dlcl0KKyAgICAjCisgICAgIyBvdGhlciAtIFRoZSBjbGFzcyB0byBiZSBjb21wYXJlZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIC0xLCAwLCAxLgorICAgIGRlZiBzZWxmLjw9PihvdGhlcikKKyAgICAgIFBSSU9SSVRJRVNbb3RoZXIucHJpb3JpdHldIDw9PiBQUklPUklUSUVTW3NlbGYucHJpb3JpdHldCisgICAgZW5kCisKKyAgICAjIFNwYWNlc2hpcCBpcyBwcmlvcml0eSBbaGlnaGVyIC0+IGxvd2VyXQorICAgICMKKyAgICAjIG90aGVyIC0gVGhlIGNsYXNzIHRvIGJlIGNvbXBhcmVkLgorICAgICMKKyAgICAjIFJldHVybnMgLTEsIDAsIDEuCisgICAgZGVmIDw9PihvdGhlcikKKyAgICAgIHNlbGYuY2xhc3MgPD0+IG90aGVyLmNsYXNzCisgICAgZW5kCisKKyAgICAjIEluaXRpYWxpemUgYSBuZXcgcGx1Z2luLiBUaGlzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBzdWJjbGFzcy4KKyAgICAjCisgICAgIyBjb25maWcgLSBUaGUgSGFzaCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisgICAgIworICAgICMgUmV0dXJucyBhIG5ldyBpbnN0YW5jZS4KKyAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcgPSB7fSkKKyAgICAgICMgbm8tb3AgZm9yIGRlZmF1bHQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3BsdWdpbl9tYW5hZ2VyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcGx1Z2luX21hbmFnZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5MDA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3BsdWdpbl9tYW5hZ2VyLnJiCkBAIC0wLDAgKzEsMTExIEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIFBsdWdpbk1hbmFnZXIKKyAgICBhdHRyX3JlYWRlciA6c2l0ZQorCisgICAgIyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAjCisgICAgIyBzaXRlIC0gdGhlIGluc3RhbmNlIG9mIEpla3lsbDo6U2l0ZSB3ZSdyZSBjb25jZXJuZWQgd2l0aAorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBpbml0aWFsaXplKHNpdGUpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICBlbmQKKworICAgICMgUmVxdWlyZSBhbGwgdGhlIHBsdWdpbnMgd2hpY2ggYXJlIGFsbG93ZWQuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nCisgICAgZGVmIGNvbnNjaWVudGlvdXNfcmVxdWlyZQorICAgICAgcmVxdWlyZV90aGVtZV9kZXBzIGlmIHNpdGUudGhlbWUKKyAgICAgIHJlcXVpcmVfcGx1Z2luX2ZpbGVzCisgICAgICByZXF1aXJlX2dlbXMKKyAgICAgIGRlcHJlY2F0aW9uX2NoZWNrcworICAgIGVuZAorCisgICAgIyBSZXF1aXJlIGVhY2ggb2YgdGhlIGdlbSBwbHVnaW5zIHNwZWNpZmllZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHJlcXVpcmVfZ2VtcworICAgICAgSmVreWxsOjpFeHRlcm5hbC5yZXF1aXJlX3dpdGhfZ3JhY2VmdWxfZmFpbCgKKyAgICAgICAgc2l0ZS5nZW1zLnNlbGVjdCB7IHxwbHVnaW58IHBsdWdpbl9hbGxvd2VkPyhwbHVnaW4pIH0KKyAgICAgICkKKyAgICBlbmQKKworICAgICMgUmVxdWlyZSBlYWNoIG9mIHRoZSBydW50aW1lX2RlcGVuZGVuY2llcyBzcGVjaWZpZWQgYnkgdGhlIHRoZW1lJ3MgZ2Vtc3BlYy4KKyAgICAjCisgICAgIyBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgbm8gZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBzcGVjaWZpZWQsIG90aGVyd2lzZSBub3RoaW5nLgorICAgIGRlZiByZXF1aXJlX3RoZW1lX2RlcHMKKyAgICAgIHJldHVybiBmYWxzZSB1bmxlc3Mgc2l0ZS50aGVtZS5ydW50aW1lX2RlcGVuZGVuY2llcworICAgICAgc2l0ZS50aGVtZS5ydW50aW1lX2RlcGVuZGVuY2llcy5lYWNoIGRvIHxkZXB8CisgICAgICAgIG5leHQgaWYgZGVwLm5hbWUgPT0gImpla3lsbCIKKyAgICAgICAgRXh0ZXJuYWwucmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWwoZGVwLm5hbWUpIGlmIHBsdWdpbl9hbGxvd2VkPyhkZXAubmFtZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHNlbGYucmVxdWlyZV9mcm9tX2J1bmRsZXIKKyAgICAgIGlmICFFTlZbIkpFS1lMTF9OT19CVU5ETEVSX1JFUVVJUkUiXSAmJiBGaWxlLmZpbGU/KCJHZW1maWxlIikKKyAgICAgICAgcmVxdWlyZSAiYnVuZGxlciIKKworICAgICAgICBCdW5kbGVyLnNldHVwCisgICAgICAgIHJlcXVpcmVkX2dlbXMgPSBCdW5kbGVyLnJlcXVpcmUoOmpla3lsbF9wbHVnaW5zKQorICAgICAgICBtZXNzYWdlID0gIlJlcXVpcmVkICN7cmVxdWlyZWRfZ2Vtcy5tYXAoJjpuYW1lKS5qb2luKCIsICIpfSIKKyAgICAgICAgSmVreWxsLmxvZ2dlci5kZWJ1ZygiUGx1Z2luTWFuYWdlcjoiLCBtZXNzYWdlKQorICAgICAgICBFTlZbIkpFS1lMTF9OT19CVU5ETEVSX1JFUVVJUkUiXSA9ICJ0cnVlIgorCisgICAgICAgIHRydWUKKyAgICAgIGVsc2UKKyAgICAgICAgZmFsc2UKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBDaGVjayB3aGV0aGVyIGEgZ2VtIHBsdWdpbiBpcyBhbGxvd2VkIHRvIGJlIHVzZWQgZHVyaW5nIHRoaXMgYnVpbGQuCisgICAgIworICAgICMgcGx1Z2luX25hbWUgLSB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luCisgICAgIworICAgICMgUmV0dXJucyB0cnVlIGlmIHRoZSBwbHVnaW4gbmFtZSBpcyBpbiB0aGUgd2hpdGVsaXN0IG9yIGlmIHRoZSBzaXRlIGlzIG5vdAorICAgICMgICBpbiBzYWZlIG1vZGUuCisgICAgZGVmIHBsdWdpbl9hbGxvd2VkPyhwbHVnaW5fbmFtZSkKKyAgICAgICFzaXRlLnNhZmUgfHwgd2hpdGVsaXN0LmluY2x1ZGU/KHBsdWdpbl9uYW1lKQorICAgIGVuZAorCisgICAgIyBCdWlsZCBhbiBhcnJheSBvZiBhbGxvd2VkIHBsdWdpbiBnZW0gbmFtZXMuCisgICAgIworICAgICMgUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIHN0cmluZyBiZWluZyB0aGUgbmFtZSBvZiBhIGdlbSBuYW1lCisgICAgIyAgIHRoYXQgaXMgYWxsb3dlZCB0byBiZSB1c2VkLgorICAgIGRlZiB3aGl0ZWxpc3QKKyAgICAgIEB3aGl0ZWxpc3QgfHw9IEFycmF5W3NpdGUuY29uZmlnWyJ3aGl0ZWxpc3QiXV0uZmxhdHRlbgorICAgIGVuZAorCisgICAgIyBSZXF1aXJlIGFsbCAucmIgZmlsZXMgaWYgc2FmZSBtb2RlIGlzIG9mZgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgcmVxdWlyZV9wbHVnaW5fZmlsZXMKKyAgICAgIHVubGVzcyBzaXRlLnNhZmUKKyAgICAgICAgcGx1Z2luc19wYXRoLmVhY2ggZG8gfHBsdWdpbl9zZWFyY2hfcGF0aHwKKyAgICAgICAgICBwbHVnaW5fZmlsZXMgPSBVdGlscy5zYWZlX2dsb2IocGx1Z2luX3NlYXJjaF9wYXRoLCBGaWxlLmpvaW4oIioqIiwgIioucmIiKSkKKyAgICAgICAgICBKZWt5bGw6OkV4dGVybmFsLnJlcXVpcmVfd2l0aF9ncmFjZWZ1bF9mYWlsKHBsdWdpbl9maWxlcykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUHVibGljOiBTZXR1cCB0aGUgcGx1Z2luIHNlYXJjaCBwYXRoCisgICAgIworICAgICMgUmV0dXJucyBhbiBBcnJheSBvZiBwbHVnaW4gc2VhcmNoIHBhdGhzCisgICAgZGVmIHBsdWdpbnNfcGF0aAorICAgICAgaWYgc2l0ZS5jb25maWdbInBsdWdpbnNfZGlyIl0uZXFsPyBKZWt5bGw6OkNvbmZpZ3VyYXRpb246OkRFRkFVTFRTWyJwbHVnaW5zX2RpciJdCisgICAgICAgIFtzaXRlLmluX3NvdXJjZV9kaXIoc2l0ZS5jb25maWdbInBsdWdpbnNfZGlyIl0pXQorICAgICAgZWxzZQorICAgICAgICBBcnJheShzaXRlLmNvbmZpZ1sicGx1Z2luc19kaXIiXSkubWFwIHsgfGR8IEZpbGUuZXhwYW5kX3BhdGgoZCkgfQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgZGVwcmVjYXRpb25fY2hlY2tzCisgICAgICBwYWdpbmF0aW9uX2luY2x1ZGVkID0gKHNpdGUuY29uZmlnWyJwbHVnaW5zIl0gfHwgW10pLmluY2x1ZGU/KCJqZWt5bGwtcGFnaW5hdGUiKSB8fAorICAgICAgICBkZWZpbmVkPyhKZWt5bGw6OlBhZ2luYXRlKQorICAgICAgaWYgc2l0ZS5jb25maWdbInBhZ2luYXRlIl0gJiYgIXBhZ2luYXRpb25faW5jbHVkZWQKKyAgICAgICAgSmVreWxsOjpEZXByZWNhdG9yLmRlcHJlY2F0aW9uX21lc3NhZ2UgIllvdSBhcHBlYXIgdG8gaGF2ZSBwYWdpbmF0aW9uICIgXAorICAgICAgICAgICJ0dXJuZWQgb24sIGJ1dCB5b3UgaGF2ZW4ndCBpbmNsdWRlZCB0aGUgYGpla3lsbC1wYWdpbmF0ZWAgZ2VtLiAiIFwKKyAgICAgICAgICAiRW5zdXJlIHlvdSBoYXZlIGBwbHVnaW5zOiBbamVreWxsLXBhZ2luYXRlXWAgaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGUuIgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9wdWJsaXNoZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9wdWJsaXNoZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2N2I4YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3B1Ymxpc2hlci5yYgpAQCAtMCwwICsxLDIxIEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIFB1Ymxpc2hlcgorICAgIGRlZiBpbml0aWFsaXplKHNpdGUpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICBlbmQKKworICAgIGRlZiBwdWJsaXNoPyh0aGluZykKKyAgICAgIGNhbl9iZV9wdWJsaXNoZWQ/KHRoaW5nKSAmJiAhaGlkZGVuX2luX3RoZV9mdXR1cmU/KHRoaW5nKQorICAgIGVuZAorCisgICAgZGVmIGhpZGRlbl9pbl90aGVfZnV0dXJlPyh0aGluZykKKyAgICAgIHRoaW5nLnJlc3BvbmRfdG8/KDpkYXRlKSAmJiAhQHNpdGUuZnV0dXJlICYmIHRoaW5nLmRhdGUudG9faSA+IEBzaXRlLnRpbWUudG9faQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIGNhbl9iZV9wdWJsaXNoZWQ/KHRoaW5nKQorICAgICAgdGhpbmcuZGF0YS5mZXRjaCgicHVibGlzaGVkIiwgdHJ1ZSkgfHwgQHNpdGUudW5wdWJsaXNoZWQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlYWRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlYWRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDNlMzZkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVyLnJiCkBAIC0wLDAgKzEsMTM0IEBACisjIGVuY29kaW5nOiBVVEYtOAorCityZXF1aXJlICJjc3YiCisKK21vZHVsZSBKZWt5bGwKKyAgY2xhc3MgUmVhZGVyCisgICAgYXR0cl9yZWFkZXIgOnNpdGUKKworICAgIGRlZiBpbml0aWFsaXplKHNpdGUpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICBlbmQKKworICAgICMgUmVhZCBTaXRlIGRhdGEgZnJvbSBkaXNrIGFuZCBsb2FkIGl0IGludG8gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgcmVhZAorICAgICAgQHNpdGUubGF5b3V0cyA9IExheW91dFJlYWRlci5uZXcoc2l0ZSkucmVhZAorICAgICAgcmVhZF9kaXJlY3RvcmllcworICAgICAgc29ydF9maWxlcyEKKyAgICAgIEBzaXRlLmRhdGEgPSBEYXRhUmVhZGVyLm5ldyhzaXRlKS5yZWFkKHNpdGUuY29uZmlnWyJkYXRhX2RpciJdKQorICAgICAgQ29sbGVjdGlvblJlYWRlci5uZXcoc2l0ZSkucmVhZAorICAgICAgVGhlbWVBc3NldHNSZWFkZXIubmV3KHNpdGUpLnJlYWQKKyAgICBlbmQKKworICAgICMgU29ydHMgcG9zdHMsIHBhZ2VzLCBhbmQgc3RhdGljIGZpbGVzLgorICAgIGRlZiBzb3J0X2ZpbGVzIQorICAgICAgc2l0ZS5jb2xsZWN0aW9ucy52YWx1ZXMuZWFjaCB7IHxjfCBjLmRvY3Muc29ydCEgfQorICAgICAgc2l0ZS5wYWdlcy5zb3J0X2J5ISgmOm5hbWUpCisgICAgICBzaXRlLnN0YXRpY19maWxlcy5zb3J0X2J5ISgmOnJlbGF0aXZlX3BhdGgpCisgICAgZW5kCisKKyAgICAjIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGRpcmVjdG9yaWVzIHRvIGZpbmQgcGFnZXMgYW5kIHN0YXRpYyBmaWxlcworICAgICMgdGhhdCB3aWxsIGJlY29tZSBwYXJ0IG9mIHRoZSBzaXRlIGFjY29yZGluZyB0byB0aGUgcnVsZXMgaW4KKyAgICAjIGZpbHRlcl9lbnRyaWVzLgorICAgICMKKyAgICAjIGRpciAtIFRoZSBTdHJpbmcgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuIERlZmF1bHQ6ICcnLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgcmVhZF9kaXJlY3RvcmllcyhkaXIgPSAiIikKKyAgICAgIGJhc2UgPSBzaXRlLmluX3NvdXJjZV9kaXIoZGlyKQorCisgICAgICByZXR1cm4gdW5sZXNzIEZpbGUuZGlyZWN0b3J5PyhiYXNlKQorCisgICAgICBkb3QgPSBEaXIuY2hkaXIoYmFzZSkgeyBmaWx0ZXJfZW50cmllcyhEaXIuZW50cmllcygiLiIpLCBiYXNlKSB9CisgICAgICBkb3RfZGlycyA9IGRvdC5zZWxlY3QgeyB8ZmlsZXwgRmlsZS5kaXJlY3Rvcnk/KEBzaXRlLmluX3NvdXJjZV9kaXIoYmFzZSwgZmlsZSkpIH0KKyAgICAgIGRvdF9maWxlcyA9IChkb3QgLSBkb3RfZGlycykKKyAgICAgIGRvdF9wYWdlcyA9IGRvdF9maWxlcy5zZWxlY3QgZG8gfGZpbGV8CisgICAgICAgIFV0aWxzLmhhc195YW1sX2hlYWRlcj8oQHNpdGUuaW5fc291cmNlX2RpcihiYXNlLCBmaWxlKSkKKyAgICAgIGVuZAorICAgICAgZG90X3N0YXRpY19maWxlcyA9IGRvdF9maWxlcyAtIGRvdF9wYWdlcworCisgICAgICByZXRyaWV2ZV9wb3N0cyhkaXIpCisgICAgICByZXRyaWV2ZV9kaXJzKGJhc2UsIGRpciwgZG90X2RpcnMpCisgICAgICByZXRyaWV2ZV9wYWdlcyhkaXIsIGRvdF9wYWdlcykKKyAgICAgIHJldHJpZXZlX3N0YXRpY19maWxlcyhkaXIsIGRvdF9zdGF0aWNfZmlsZXMpCisgICAgZW5kCisKKyAgICAjIFJldHJpZXZlcyBhbGwgdGhlIHBvc3RzKHBvc3RzL2RyYWZ0cykgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5CisgICAgIyBhbmQgYWRkIHRoZW0gdG8gdGhlIHNpdGUgYW5kIHNvcnQgdGhlbS4KKyAgICAjCisgICAgIyBkaXIgLSBUaGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHRvIHJldHJpZXZlIHRoZSBwb3N0cyBmcm9tLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgcmV0cmlldmVfcG9zdHMoZGlyKQorICAgICAgc2l0ZS5wb3N0cy5kb2NzLmNvbmNhdChQb3N0UmVhZGVyLm5ldyhzaXRlKS5yZWFkX3Bvc3RzKGRpcikpCisgICAgICBzaXRlLnBvc3RzLmRvY3MuY29uY2F0KFBvc3RSZWFkZXIubmV3KHNpdGUpLnJlYWRfZHJhZnRzKGRpcikpIGlmIHNpdGUuc2hvd19kcmFmdHMKKyAgICBlbmQKKworICAgICMgUmVjdXJzaXZlbHkgdHJhdmVyc2UgZGlyZWN0b3JpZXMgd2l0aCB0aGUgcmVhZF9kaXJlY3RvcmllcyBmdW5jdGlvbi4KKyAgICAjCisgICAgIyBiYXNlIC0gVGhlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNpdGUncyBiYXNlIGRpcmVjdG9yeS4KKyAgICAjIGRpciAtIFRoZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkaXJlY3RvcnkgdG8gdHJhdmVyc2UgZG93bi4KKyAgICAjIGRvdF9kaXJzIC0gVGhlIEFycmF5IG9mIHN1YmRpcmVjdG9yaWVzIGluIHRoZSBkaXIuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiByZXRyaWV2ZV9kaXJzKF9iYXNlLCBkaXIsIGRvdF9kaXJzKQorICAgICAgZG90X2RpcnMuZWFjaCBkbyB8ZmlsZXwKKyAgICAgICAgZGlyX3BhdGggPSBzaXRlLmluX3NvdXJjZV9kaXIoZGlyLCBmaWxlKQorICAgICAgICByZWxfcGF0aCA9IEZpbGUuam9pbihkaXIsIGZpbGUpCisgICAgICAgIHVubGVzcyBAc2l0ZS5kZXN0LnN1YiglciEvJCEsICIiKSA9PSBkaXJfcGF0aAorICAgICAgICAgIEBzaXRlLnJlYWRlci5yZWFkX2RpcmVjdG9yaWVzKHJlbF9wYXRoKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZXRyaWV2ZSBhbGwgdGhlIHBhZ2VzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAorICAgICMgYWRkIHRoZW0gdG8gdGhlIHNpdGUgYW5kIHNvcnQgdGhlbS4KKyAgICAjCisgICAgIyBkaXIgLSBUaGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHJldHJpZXZlIHRoZSBwYWdlcyBmcm9tLgorICAgICMgZG90X3BhZ2VzIC0gVGhlIEFycmF5IG9mIHBhZ2VzIGluIHRoZSBkaXIuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiByZXRyaWV2ZV9wYWdlcyhkaXIsIGRvdF9wYWdlcykKKyAgICAgIHNpdGUucGFnZXMuY29uY2F0KFBhZ2VSZWFkZXIubmV3KHNpdGUsIGRpcikucmVhZChkb3RfcGFnZXMpKQorICAgIGVuZAorCisgICAgIyBSZXRyaWV2ZSBhbGwgdGhlIHN0YXRpYyBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKKyAgICAjIGFkZCB0aGVtIHRvIHRoZSBzaXRlIGFuZCBzb3J0IHRoZW0uCisgICAgIworICAgICMgZGlyIC0gVGhlIGRpcmVjdG9yeSByZXRyaWV2ZSB0aGUgc3RhdGljIGZpbGVzIGZyb20uCisgICAgIyBkb3Rfc3RhdGljX2ZpbGVzIC0gVGhlIHN0YXRpYyBmaWxlcyBpbiB0aGUgZGlyLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgcmV0cmlldmVfc3RhdGljX2ZpbGVzKGRpciwgZG90X3N0YXRpY19maWxlcykKKyAgICAgIHNpdGUuc3RhdGljX2ZpbGVzLmNvbmNhdChTdGF0aWNGaWxlUmVhZGVyLm5ldyhzaXRlLCBkaXIpLnJlYWQoZG90X3N0YXRpY19maWxlcykpCisgICAgZW5kCisKKyAgICAjIEZpbHRlciBvdXQgYW55IGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQgYXJlIGhpZGRlbiBvciBiYWNrdXAgZmlsZXMgKHN0YXJ0CisgICAgIyB3aXRoICIuIiBvciAiIyIgb3IgZW5kIHdpdGggIn4iKSwgb3IgY29udGFpbiBzaXRlIGNvbnRlbnQgKHN0YXJ0IHdpdGggIl8iKSwKKyAgICAjIG9yIGFyZSBleGNsdWRlZCBpbiB0aGUgc2l0ZSBjb25maWd1cmF0aW9uLCB1bmxlc3MgdGhleSBhcmUgd2ViIHNlcnZlcgorICAgICMgZmlsZXMgc3VjaCBhcyAnLmh0YWNjZXNzJy4KKyAgICAjCisgICAgIyBlbnRyaWVzIC0gVGhlIEFycmF5IG9mIFN0cmluZyBmaWxlL2RpcmVjdG9yeSBlbnRyaWVzIHRvIGZpbHRlci4KKyAgICAjIGJhc2VfZGlyZWN0b3J5IC0gVGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9wdGlvbmFsIGJhc2UgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIEFycmF5IG9mIGZpbHRlcmVkIGVudHJpZXMuCisgICAgZGVmIGZpbHRlcl9lbnRyaWVzKGVudHJpZXMsIGJhc2VfZGlyZWN0b3J5ID0gbmlsKQorICAgICAgRW50cnlGaWx0ZXIubmV3KHNpdGUsIGJhc2VfZGlyZWN0b3J5KS5maWx0ZXIoZW50cmllcykKKyAgICBlbmQKKworICAgICMgUmVhZCB0aGUgZW50cmllcyBmcm9tIGEgcGFydGljdWxhciBkaXJlY3RvcnkgZm9yIHByb2Nlc3NpbmcKKyAgICAjCisgICAgIyBkaXIgLSBUaGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuCisgICAgIyBzdWJmb2xkZXIgLSBUaGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgbGlzdCBvZiBlbnRyaWVzIHRvIHByb2Nlc3MKKyAgICBkZWYgZ2V0X2VudHJpZXMoZGlyLCBzdWJmb2xkZXIpCisgICAgICBiYXNlID0gc2l0ZS5pbl9zb3VyY2VfZGlyKGRpciwgc3ViZm9sZGVyKQorICAgICAgcmV0dXJuIFtdIHVubGVzcyBGaWxlLmV4aXN0PyhiYXNlKQorICAgICAgZW50cmllcyA9IERpci5jaGRpcihiYXNlKSB7IGZpbHRlcl9lbnRyaWVzKERpclsiKiovKiJdLCBiYXNlKSB9CisgICAgICBlbnRyaWVzLmRlbGV0ZV9pZiB7IHxlfCBGaWxlLmRpcmVjdG9yeT8oc2l0ZS5pbl9zb3VyY2VfZGlyKGJhc2UsIGUpKSB9CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZWFkZXJzL2NvbGxlY3Rpb25fcmVhZGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9jb2xsZWN0aW9uX3JlYWRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjJiZTQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9jb2xsZWN0aW9uX3JlYWRlci5yYgpAQCAtMCwwICsxLDIwIEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIENvbGxlY3Rpb25SZWFkZXIKKyAgICBTUEVDSUFMX0NPTExFQ1RJT05TID0gJXcocG9zdHMgZGF0YSkuZnJlZXplCisKKyAgICBhdHRyX3JlYWRlciA6c2l0ZSwgOmNvbnRlbnQKKyAgICBkZWYgaW5pdGlhbGl6ZShzaXRlKQorICAgICAgQHNpdGUgPSBzaXRlCisgICAgICBAY29udGVudCA9IHt9CisgICAgZW5kCisKKyAgICAjIFJlYWQgaW4gYWxsIGNvbGxlY3Rpb25zIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgcmVhZAorICAgICAgc2l0ZS5jb2xsZWN0aW9ucy5lYWNoIGRvIHxfLCBjb2xsZWN0aW9ufAorICAgICAgICBjb2xsZWN0aW9uLnJlYWQgdW5sZXNzIFNQRUNJQUxfQ09MTEVDVElPTlMuaW5jbHVkZT8oY29sbGVjdGlvbi5sYWJlbCkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9kYXRhX3JlYWRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlYWRlcnMvZGF0YV9yZWFkZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkYjdjNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlYWRlcnMvZGF0YV9yZWFkZXIucmIKQEAgLTAsMCArMSw3NSBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBEYXRhUmVhZGVyCisgICAgYXR0cl9yZWFkZXIgOnNpdGUsIDpjb250ZW50CisgICAgZGVmIGluaXRpYWxpemUoc2l0ZSkKKyAgICAgIEBzaXRlID0gc2l0ZQorICAgICAgQGNvbnRlbnQgPSB7fQorICAgICAgQGVudHJ5X2ZpbHRlciA9IEVudHJ5RmlsdGVyLm5ldyhzaXRlKQorICAgIGVuZAorCisgICAgIyBSZWFkIGFsbCB0aGUgZmlsZXMgaW4gPGRpcj4gYW5kIGFkZHMgdGhlbSB0byBAY29udGVudAorICAgICMKKyAgICAjIGRpciAtIFRoZSBTdHJpbmcgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuCisgICAgIworICAgICMgUmV0dXJucyBAY29udGVudCwgYSBIYXNoIG9mIHRoZSAueWFtbCwgLnltbCwKKyAgICAjIC5qc29uLCBhbmQgLmNzdiBmaWxlcyBpbiB0aGUgYmFzZSBkaXJlY3RvcnkKKyAgICBkZWYgcmVhZChkaXIpCisgICAgICBiYXNlID0gc2l0ZS5pbl9zb3VyY2VfZGlyKGRpcikKKyAgICAgIHJlYWRfZGF0YV90byhiYXNlLCBAY29udGVudCkKKyAgICAgIEBjb250ZW50CisgICAgZW5kCisKKyAgICAjIFJlYWQgYW5kIHBhcnNlIGFsbCAueWFtbCwgLnltbCwgLmpzb24sIC5jc3YgYW5kIC50c3YKKyAgICAjIGZpbGVzIHVuZGVyIDxkaXI+IGFuZCBhZGQgdGhlbSB0byB0aGUgPGRhdGE+IHZhcmlhYmxlLgorICAgICMKKyAgICAjIGRpciAtIFRoZSBzdHJpbmcgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuCisgICAgIyBkYXRhIC0gVGhlIHZhcmlhYmxlIHRvIHdoaWNoIGRhdGEgd2lsbCBiZSBhZGRlZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBkZWYgcmVhZF9kYXRhX3RvKGRpciwgZGF0YSkKKyAgICAgIHJldHVybiB1bmxlc3MgRmlsZS5kaXJlY3Rvcnk/KGRpcikgJiYgIUBlbnRyeV9maWx0ZXIuc3ltbGluaz8oZGlyKQorCisgICAgICBlbnRyaWVzID0gRGlyLmNoZGlyKGRpcikgZG8KKyAgICAgICAgRGlyWyIqLnt5YW1sLHltbCxqc29uLGNzdix0c3Z9Il0gKyBEaXJbIioiXS5zZWxlY3QgeyB8Zm58IEZpbGUuZGlyZWN0b3J5PyhmbikgfQorICAgICAgZW5kCisKKyAgICAgIGVudHJpZXMuZWFjaCBkbyB8ZW50cnl8CisgICAgICAgIHBhdGggPSBAc2l0ZS5pbl9zb3VyY2VfZGlyKGRpciwgZW50cnkpCisgICAgICAgIG5leHQgaWYgQGVudHJ5X2ZpbHRlci5zeW1saW5rPyhwYXRoKQorCisgICAgICAgIGlmIEZpbGUuZGlyZWN0b3J5PyhwYXRoKQorICAgICAgICAgIHJlYWRfZGF0YV90byhwYXRoLCBkYXRhW3Nhbml0aXplX2ZpbGVuYW1lKGVudHJ5KV0gPSB7fSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGtleSA9IHNhbml0aXplX2ZpbGVuYW1lKEZpbGUuYmFzZW5hbWUoZW50cnksICIuKiIpKQorICAgICAgICAgIGRhdGFba2V5XSA9IHJlYWRfZGF0YV9maWxlKHBhdGgpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIERldGVybWluZXMgaG93IHRvIHJlYWQgYSBkYXRhIGZpbGUuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGRhdGEgZmlsZS4KKyAgICBkZWYgcmVhZF9kYXRhX2ZpbGUocGF0aCkKKyAgICAgIGNhc2UgRmlsZS5leHRuYW1lKHBhdGgpLmRvd25jYXNlCisgICAgICB3aGVuICIuY3N2IgorICAgICAgICBDU1YucmVhZChwYXRoLCB7CisgICAgICAgICAgOmhlYWRlcnMgID0+IHRydWUsCisgICAgICAgICAgOmVuY29kaW5nID0+IHNpdGUuY29uZmlnWyJlbmNvZGluZyJdLAorICAgICAgICB9KS5tYXAoJjp0b19oYXNoKQorICAgICAgd2hlbiAiLnRzdiIKKyAgICAgICAgQ1NWLnJlYWQocGF0aCwgeworICAgICAgICAgIDpjb2xfc2VwICA9PiAiXHQiLAorICAgICAgICAgIDpoZWFkZXJzICA9PiB0cnVlLAorICAgICAgICAgIDplbmNvZGluZyA9PiBzaXRlLmNvbmZpZ1siZW5jb2RpbmciXSwKKyAgICAgICAgfSkubWFwKCY6dG9faGFzaCkKKyAgICAgIGVsc2UKKyAgICAgICAgU2FmZVlBTUwubG9hZF9maWxlKHBhdGgpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBzYW5pdGl6ZV9maWxlbmFtZShuYW1lKQorICAgICAgbmFtZS5nc3ViISglciFbXlx3XHMtXSt8KD88PV58XGJccylccysoPz0kfFxzP1xiKSEsICIiLmZyZWV6ZSkKKyAgICAgIG5hbWUuZ3N1YiglciFccyshLCAiXyIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZWFkZXJzL2xheW91dF9yZWFkZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZWFkZXJzL2xheW91dF9yZWFkZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1NDkxYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlYWRlcnMvbGF5b3V0X3JlYWRlci5yYgpAQCAtMCwwICsxLDY5IEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIExheW91dFJlYWRlcgorICAgIGF0dHJfcmVhZGVyIDpzaXRlCisgICAgZGVmIGluaXRpYWxpemUoc2l0ZSkKKyAgICAgIEBzaXRlID0gc2l0ZQorICAgICAgQGxheW91dHMgPSB7fQorICAgIGVuZAorCisgICAgZGVmIHJlYWQKKyAgICAgIGxheW91dF9lbnRyaWVzLmVhY2ggZG8gfGxheW91dF9maWxlfAorICAgICAgICBAbGF5b3V0c1tsYXlvdXRfbmFtZShsYXlvdXRfZmlsZSldID0gXAorICAgICAgICAgIExheW91dC5uZXcoc2l0ZSwgbGF5b3V0X2RpcmVjdG9yeSwgbGF5b3V0X2ZpbGUpCisgICAgICBlbmQKKworICAgICAgdGhlbWVfbGF5b3V0X2VudHJpZXMuZWFjaCBkbyB8bGF5b3V0X2ZpbGV8CisgICAgICAgIEBsYXlvdXRzW2xheW91dF9uYW1lKGxheW91dF9maWxlKV0gfHw9IFwKKyAgICAgICAgICBMYXlvdXQubmV3KHNpdGUsIHRoZW1lX2xheW91dF9kaXJlY3RvcnksIGxheW91dF9maWxlKQorICAgICAgZW5kCisKKyAgICAgIEBsYXlvdXRzCisgICAgZW5kCisKKyAgICBkZWYgbGF5b3V0X2RpcmVjdG9yeQorICAgICAgQGxheW91dF9kaXJlY3RvcnkgfHw9IChsYXlvdXRfZGlyZWN0b3J5X2luX2N3ZCB8fCBsYXlvdXRfZGlyZWN0b3J5X2luc2lkZV9zb3VyY2UpCisgICAgZW5kCisKKyAgICBkZWYgdGhlbWVfbGF5b3V0X2RpcmVjdG9yeQorICAgICAgQHRoZW1lX2xheW91dF9kaXJlY3RvcnkgfHw9IHNpdGUudGhlbWUubGF5b3V0c19wYXRoIGlmIHNpdGUudGhlbWUKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBsYXlvdXRfZW50cmllcworICAgICAgZW50cmllc19pbiBsYXlvdXRfZGlyZWN0b3J5CisgICAgZW5kCisKKyAgICBkZWYgdGhlbWVfbGF5b3V0X2VudHJpZXMKKyAgICAgIHRoZW1lX2xheW91dF9kaXJlY3RvcnkgPyBlbnRyaWVzX2luKHRoZW1lX2xheW91dF9kaXJlY3RvcnkpIDogW10KKyAgICBlbmQKKworICAgIGRlZiBlbnRyaWVzX2luKGRpcikKKyAgICAgIGVudHJpZXMgPSBbXQorICAgICAgd2l0aGluKGRpcikgZG8KKyAgICAgICAgZW50cmllcyA9IEVudHJ5RmlsdGVyLm5ldyhzaXRlKS5maWx0ZXIoRGlyWyIqKi8qLioiXSkKKyAgICAgIGVuZAorICAgICAgZW50cmllcworICAgIGVuZAorCisgICAgZGVmIGxheW91dF9uYW1lKGZpbGUpCisgICAgICBmaWxlLnNwbGl0KCIuIilbMC4uLTJdLmpvaW4oIi4iKQorICAgIGVuZAorCisgICAgZGVmIHdpdGhpbihkaXJlY3RvcnkpCisgICAgICByZXR1cm4gdW5sZXNzIEZpbGUuZXhpc3Q/KGRpcmVjdG9yeSkKKyAgICAgIERpci5jaGRpcihkaXJlY3RvcnkpIHsgeWllbGQgfQorICAgIGVuZAorCisgICAgZGVmIGxheW91dF9kaXJlY3RvcnlfaW5zaWRlX3NvdXJjZQorICAgICAgc2l0ZS5pbl9zb3VyY2VfZGlyKHNpdGUuY29uZmlnWyJsYXlvdXRzX2RpciJdKQorICAgIGVuZAorCisgICAgZGVmIGxheW91dF9kaXJlY3RvcnlfaW5fY3dkCisgICAgICBkaXIgPSBKZWt5bGwuc2FuaXRpemVkX3BhdGgoRGlyLnB3ZCwgc2l0ZS5jb25maWdbImxheW91dHNfZGlyIl0pCisgICAgICBpZiBGaWxlLmRpcmVjdG9yeT8oZGlyKSAmJiAhc2l0ZS5zYWZlCisgICAgICAgIGRpcgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZWFkZXJzL3BhZ2VfcmVhZGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9wYWdlX3JlYWRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdjNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9wYWdlX3JlYWRlci5yYgpAQCAtMCwwICsxLDIzIEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIFBhZ2VSZWFkZXIKKyAgICBhdHRyX3JlYWRlciA6c2l0ZSwgOmRpciwgOnVuZmlsdGVyZWRfY29udGVudAorICAgIGRlZiBpbml0aWFsaXplKHNpdGUsIGRpcikKKyAgICAgIEBzaXRlID0gc2l0ZQorICAgICAgQGRpciA9IGRpcgorICAgICAgQHVuZmlsdGVyZWRfY29udGVudCA9IFtdCisgICAgZW5kCisKKyAgICAjIFJlYWQgYWxsIHRoZSBmaWxlcyBpbiA8c291cmNlPi88ZGlyPi8gZm9yIFlhbWwgaGVhZGVyIGFuZCBjcmVhdGUgYSBuZXcgUGFnZQorICAgICMgb2JqZWN0IGZvciBlYWNoIGZpbGUuCisgICAgIworICAgICMgZGlyIC0gVGhlIFN0cmluZyByZWxhdGl2ZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgdG8gcmVhZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIGFycmF5IG9mIHN0YXRpYyBwYWdlcy4KKyAgICBkZWYgcmVhZChmaWxlcykKKyAgICAgIGZpbGVzLm1hcCBkbyB8cGFnZXwKKyAgICAgICAgQHVuZmlsdGVyZWRfY29udGVudCA8PCBQYWdlLm5ldyhAc2l0ZSwgQHNpdGUuc291cmNlLCBAZGlyLCBwYWdlKQorICAgICAgZW5kCisgICAgICBAdW5maWx0ZXJlZF9jb250ZW50LnNlbGVjdCB7IHxwYWdlfCBzaXRlLnB1Ymxpc2hlci5wdWJsaXNoPyhwYWdlKSB9CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZWFkZXJzL3Bvc3RfcmVhZGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9wb3N0X3JlYWRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY4ODg3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9wb3N0X3JlYWRlci5yYgpAQCAtMCwwICsxLDY1IEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIFBvc3RSZWFkZXIKKyAgICBhdHRyX3JlYWRlciA6c2l0ZSwgOnVuZmlsdGVyZWRfY29udGVudAorICAgIGRlZiBpbml0aWFsaXplKHNpdGUpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICBlbmQKKworICAgICMgUmVhZCBhbGwgdGhlIGZpbGVzIGluIDxzb3VyY2U+LzxkaXI+L19kcmFmdHMgYW5kIGNyZWF0ZSBhIG5ldworICAgICMgRG9jdW1lbnQgb2JqZWN0IHdpdGggZWFjaCBvbmUuCisgICAgIworICAgICMgZGlyIC0gVGhlIFN0cmluZyByZWxhdGl2ZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgdG8gcmVhZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHJlYWRfZHJhZnRzKGRpcikKKyAgICAgIHJlYWRfcHVibGlzaGFibGUoZGlyLCAiX2RyYWZ0cyIsIERvY3VtZW50OjpEQVRFTEVTU19GSUxFTkFNRV9NQVRDSEVSKQorICAgIGVuZAorCisgICAgIyBSZWFkIGFsbCB0aGUgZmlsZXMgaW4gPHNvdXJjZT4vPGRpcj4vX3Bvc3RzIGFuZCBjcmVhdGUgYSBuZXcgRG9jdW1lbnQKKyAgICAjIG9iamVjdCB3aXRoIGVhY2ggb25lLgorICAgICMKKyAgICAjIGRpciAtIFRoZSBTdHJpbmcgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiByZWFkX3Bvc3RzKGRpcikKKyAgICAgIHJlYWRfcHVibGlzaGFibGUoZGlyLCAiX3Bvc3RzIiwgRG9jdW1lbnQ6OkRBVEVfRklMRU5BTUVfTUFUQ0hFUikKKyAgICBlbmQKKworICAgICMgUmVhZCBhbGwgdGhlIGZpbGVzIGluIDxzb3VyY2U+LzxkaXI+LzxtYWdpY19kaXI+IGFuZCBjcmVhdGUgYSBuZXcKKyAgICAjIERvY3VtZW50IG9iamVjdCB3aXRoIGVhY2ggb25lIGluc29mYXIgYXMgaXQgbWF0Y2hlcyB0aGUgcmVnZXhwIG1hdGNoZXIuCisgICAgIworICAgICMgZGlyIC0gVGhlIFN0cmluZyByZWxhdGl2ZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgdG8gcmVhZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHJlYWRfcHVibGlzaGFibGUoZGlyLCBtYWdpY19kaXIsIG1hdGNoZXIpCisgICAgICByZWFkX2NvbnRlbnQoZGlyLCBtYWdpY19kaXIsIG1hdGNoZXIpLnRhcCB7IHxkb2NzfCBkb2NzLmVhY2goJjpyZWFkKSB9CisgICAgICAgIC5zZWxlY3QgZG8gfGRvY3wKKyAgICAgICAgICBzaXRlLnB1Ymxpc2hlci5wdWJsaXNoPyhkb2MpLnRhcCBkbyB8d2lsbF9wdWJsaXNofAorICAgICAgICAgICAgaWYgIXdpbGxfcHVibGlzaCAmJiBzaXRlLnB1Ymxpc2hlci5oaWRkZW5faW5fdGhlX2Z1dHVyZT8oZG9jKQorICAgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJTa2lwcGluZzoiLCAiI3tkb2MucmVsYXRpdmVfcGF0aH0gaGFzIGEgZnV0dXJlIGRhdGUiCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJlYWQgYWxsIHRoZSBjb250ZW50IGZpbGVzIGZyb20gPHNvdXJjZT4vPGRpcj4vbWFnaWNfZGlyCisgICAgIyAgIGFuZCByZXR1cm4gdGhlbSB3aXRoIHRoZSB0eXBlIGtsYXNzLgorICAgICMKKyAgICAjIGRpciAtIFRoZSBTdHJpbmcgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuCisgICAgIyBtYWdpY19kaXIgLSBUaGUgU3RyaW5nIHJlbGF0aXZlIGRpcmVjdG9yeSB0byA8ZGlyPiwKKyAgICAjICAgbG9va3MgZm9yIGNvbnRlbnQgaGVyZS4KKyAgICAjIGtsYXNzIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBjb250ZW50LgorICAgICMKKyAgICAjIFJldHVybnMga2xhc3MgdHlwZSBvZiBjb250ZW50IGZpbGVzCisgICAgZGVmIHJlYWRfY29udGVudChkaXIsIG1hZ2ljX2RpciwgbWF0Y2hlcikKKyAgICAgIEBzaXRlLnJlYWRlci5nZXRfZW50cmllcyhkaXIsIG1hZ2ljX2RpcikubWFwIGRvIHxlbnRyeXwKKyAgICAgICAgbmV4dCB1bmxlc3MgZW50cnkgPX4gbWF0Y2hlcgorICAgICAgICBwYXRoID0gQHNpdGUuaW5fc291cmNlX2RpcihGaWxlLmpvaW4oZGlyLCBtYWdpY19kaXIsIGVudHJ5KSkKKyAgICAgICAgRG9jdW1lbnQubmV3KHBhdGgsIHsKKyAgICAgICAgICA6c2l0ZSAgICAgICA9PiBAc2l0ZSwKKyAgICAgICAgICA6Y29sbGVjdGlvbiA9PiBAc2l0ZS5wb3N0cywKKyAgICAgICAgfSkKKyAgICAgIGVuZC5yZWplY3QoJjpuaWw/KQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9zdGF0aWNfZmlsZV9yZWFkZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZWFkZXJzL3N0YXRpY19maWxlX3JlYWRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQzZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy9zdGF0aWNfZmlsZV9yZWFkZXIucmIKQEAgLTAsMCArMSwyMyBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBTdGF0aWNGaWxlUmVhZGVyCisgICAgYXR0cl9yZWFkZXIgOnNpdGUsIDpkaXIsIDp1bmZpbHRlcmVkX2NvbnRlbnQKKyAgICBkZWYgaW5pdGlhbGl6ZShzaXRlLCBkaXIpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICAgIEBkaXIgPSBkaXIKKyAgICAgIEB1bmZpbHRlcmVkX2NvbnRlbnQgPSBbXQorICAgIGVuZAorCisgICAgIyBSZWFkIGFsbCB0aGUgZmlsZXMgaW4gPHNvdXJjZT4vPGRpcj4vIGZvciBZYW1sIGhlYWRlciBhbmQgY3JlYXRlIGEgbmV3IFBhZ2UKKyAgICAjIG9iamVjdCBmb3IgZWFjaCBmaWxlLgorICAgICMKKyAgICAjIGRpciAtIFRoZSBTdHJpbmcgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuCisgICAgIworICAgICMgUmV0dXJucyBhbiBhcnJheSBvZiBzdGF0aWMgZmlsZXMuCisgICAgZGVmIHJlYWQoZmlsZXMpCisgICAgICBmaWxlcy5tYXAgZG8gfGZpbGV8CisgICAgICAgIEB1bmZpbHRlcmVkX2NvbnRlbnQgPDwgU3RhdGljRmlsZS5uZXcoQHNpdGUsIEBzaXRlLnNvdXJjZSwgQGRpciwgZmlsZSkKKyAgICAgIGVuZAorICAgICAgQHVuZmlsdGVyZWRfY29udGVudAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy90aGVtZV9hc3NldHNfcmVhZGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVhZGVycy90aGVtZV9hc3NldHNfcmVhZGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTY1NDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZWFkZXJzL3RoZW1lX2Fzc2V0c19yZWFkZXIucmIKQEAgLTAsMCArMSw0NyBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBUaGVtZUFzc2V0c1JlYWRlcgorICAgIGF0dHJfcmVhZGVyIDpzaXRlCisgICAgZGVmIGluaXRpYWxpemUoc2l0ZSkKKyAgICAgIEBzaXRlID0gc2l0ZQorICAgIGVuZAorCisgICAgZGVmIHJlYWQKKyAgICAgIHJldHVybiB1bmxlc3Mgc2l0ZS50aGVtZSAmJiBzaXRlLnRoZW1lLmFzc2V0c19wYXRoCisKKyAgICAgIEZpbmQuZmluZChzaXRlLnRoZW1lLmFzc2V0c19wYXRoKSBkbyB8cGF0aHwKKyAgICAgICAgbmV4dCBpZiBGaWxlLmRpcmVjdG9yeT8ocGF0aCkKKyAgICAgICAgaWYgRmlsZS5zeW1saW5rPyhwYXRoKQorICAgICAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiVGhlbWUgcmVhZGVyOiIsICJJZ25vcmVkIHN5bWxpbmtlZCBhc3NldDogI3twYXRofSIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlYWRfdGhlbWVfYXNzZXQocGF0aCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgcmVhZF90aGVtZV9hc3NldChwYXRoKQorICAgICAgYmFzZSA9IHNpdGUudGhlbWUucm9vdAorICAgICAgZGlyID0gRmlsZS5kaXJuYW1lKHBhdGguc3ViKCIje3NpdGUudGhlbWUucm9vdH0vIiwgIiIpKQorICAgICAgbmFtZSA9IEZpbGUuYmFzZW5hbWUocGF0aCkKKworICAgICAgaWYgVXRpbHMuaGFzX3lhbWxfaGVhZGVyPyhwYXRoKQorICAgICAgICBhcHBlbmRfdW5sZXNzX2V4aXN0cyBzaXRlLnBhZ2VzLAorICAgICAgICAgIEpla3lsbDo6UGFnZS5uZXcoc2l0ZSwgYmFzZSwgZGlyLCBuYW1lKQorICAgICAgZWxzZQorICAgICAgICBhcHBlbmRfdW5sZXNzX2V4aXN0cyBzaXRlLnN0YXRpY19maWxlcywKKyAgICAgICAgICBKZWt5bGw6OlN0YXRpY0ZpbGUubmV3KHNpdGUsIGJhc2UsICIvI3tkaXJ9IiwgbmFtZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGFwcGVuZF91bmxlc3NfZXhpc3RzKGhheXN0YWNrLCBuZXdfaXRlbSkKKyAgICAgIGlmIGhheXN0YWNrLmFueT8geyB8ZmlsZXwgZmlsZS5yZWxhdGl2ZV9wYXRoID09IG5ld19pdGVtLnJlbGF0aXZlX3BhdGggfQorICAgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJUaGVtZToiLAorICAgICAgICAgICJJZ25vcmluZyAje25ld19pdGVtLnJlbGF0aXZlX3BhdGh9IGluIHRoZW1lIGR1ZSB0byBleGlzdGluZyBmaWxlICIgXAorICAgICAgICAgICJ3aXRoIHRoYXQgcGF0aCBpbiBzaXRlLiIKKyAgICAgICAgcmV0dXJuCisgICAgICBlbmQKKworICAgICAgaGF5c3RhY2sgPDwgbmV3X2l0ZW0KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlZ2VuZXJhdG9yLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVnZW5lcmF0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmZjMwOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlZ2VuZXJhdG9yLnJiCkBAIC0wLDAgKzEsMTk5IEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIFJlZ2VuZXJhdG9yCisgICAgYXR0cl9yZWFkZXIgOnNpdGUsIDptZXRhZGF0YSwgOmNhY2hlCisgICAgYXR0cl9hY2Nlc3NvciA6ZGlzYWJsZWQKKyAgICBwcml2YXRlIDpkaXNhYmxlZCwgOmRpc2FibGVkPQorCisgICAgZGVmIGluaXRpYWxpemUoc2l0ZSkKKyAgICAgIEBzaXRlID0gc2l0ZQorCisgICAgICAjIFJlYWQgbWV0YWRhdGEgZnJvbSBmaWxlCisgICAgICByZWFkX21ldGFkYXRhCisKKyAgICAgICMgSW5pdGlhbGl6ZSBjYWNoZSB0byBhbiBlbXB0eSBoYXNoCisgICAgICBjbGVhcl9jYWNoZQorICAgIGVuZAorCisgICAgIyBDaGVja3MgaWYgYSByZW5kZXJhYmxlIG9iamVjdCBuZWVkcyB0byBiZSByZWdlbmVyYXRlZAorICAgICMKKyAgICAjIFJldHVybnMgYSBib29sZWFuLgorICAgIGRlZiByZWdlbmVyYXRlPyhkb2N1bWVudCkKKyAgICAgIGNhc2UgZG9jdW1lbnQKKyAgICAgIHdoZW4gUGFnZQorICAgICAgICByZWdlbmVyYXRlX3BhZ2U/KGRvY3VtZW50KQorICAgICAgd2hlbiBEb2N1bWVudAorICAgICAgICByZWdlbmVyYXRlX2RvY3VtZW50Pyhkb2N1bWVudCkKKyAgICAgIGVsc2UKKyAgICAgICAgc291cmNlX3BhdGggPSBkb2N1bWVudC5yZXNwb25kX3RvPyg6cGF0aCkgPyBkb2N1bWVudC5wYXRoIDogbmlsCisgICAgICAgIGRlc3RfcGF0aCA9IGlmIGRvY3VtZW50LnJlc3BvbmRfdG8/KDpkZXN0aW5hdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kZXN0aW5hdGlvbihAc2l0ZS5kZXN0KQorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgc291cmNlX21vZGlmaWVkX29yX2Rlc3RfbWlzc2luZz8oc291cmNlX3BhdGgsIGRlc3RfcGF0aCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBBZGQgYSBwYXRoIHRvIHRoZSBtZXRhZGF0YQorICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSwgYWxzbyBvbiBmYWlsdXJlLgorICAgIGRlZiBhZGQocGF0aCkKKyAgICAgIHJldHVybiB0cnVlIHVubGVzcyBGaWxlLmV4aXN0PyhwYXRoKQorCisgICAgICBtZXRhZGF0YVtwYXRoXSA9IHsKKyAgICAgICAgIm10aW1lIiA9PiBGaWxlLm10aW1lKHBhdGgpLAorICAgICAgICAiZGVwcyIgID0+IFtdLAorICAgICAgfQorICAgICAgY2FjaGVbcGF0aF0gPSB0cnVlCisgICAgZW5kCisKKyAgICAjIEZvcmNlIGEgcGF0aCB0byByZWdlbmVyYXRlCisgICAgIworICAgICMgUmV0dXJucyB0cnVlLgorICAgIGRlZiBmb3JjZShwYXRoKQorICAgICAgY2FjaGVbcGF0aF0gPSB0cnVlCisgICAgZW5kCisKKyAgICAjIENsZWFyIHRoZSBtZXRhZGF0YSBhbmQgY2FjaGUKKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBkZWYgY2xlYXIKKyAgICAgIEBtZXRhZGF0YSA9IHt9CisgICAgICBjbGVhcl9jYWNoZQorICAgIGVuZAorCisgICAgIyBDbGVhciBqdXN0IHRoZSBjYWNoZQorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBjbGVhcl9jYWNoZQorICAgICAgQGNhY2hlID0ge30KKyAgICBlbmQKKworICAgICMgQ2hlY2tzIGlmIHRoZSBzb3VyY2UgaGFzIGJlZW4gbW9kaWZpZWQgb3IgdGhlCisgICAgIyBkZXN0aW5hdGlvbiBpcyBtaXNzaW5nCisgICAgIworICAgICMgcmV0dXJucyBhIGJvb2xlYW4KKyAgICBkZWYgc291cmNlX21vZGlmaWVkX29yX2Rlc3RfbWlzc2luZz8oc291cmNlX3BhdGgsIGRlc3RfcGF0aCkKKyAgICAgIG1vZGlmaWVkPyhzb3VyY2VfcGF0aCkgfHwgKGRlc3RfcGF0aCAmJiAhRmlsZS5leGlzdD8oZGVzdF9wYXRoKSkKKyAgICBlbmQKKworICAgICMgQ2hlY2tzIGlmIGEgcGF0aCdzIChvciBvbmUgb2YgaXRzIGRlcGVuZGVuY2llcykKKyAgICAjIG10aW1lIGhhcyBjaGFuZ2VkCisgICAgIworICAgICMgUmV0dXJucyBhIGJvb2xlYW4uCisgICAgZGVmIG1vZGlmaWVkPyhwYXRoKQorICAgICAgcmV0dXJuIHRydWUgaWYgZGlzYWJsZWQ/CisKKyAgICAgICMgb2JqZWN0cyB0aGF0IGRvbid0IGhhdmUgYSBwYXRoIGFyZSBhbHdheXMgcmVnZW5lcmF0ZWQKKyAgICAgIHJldHVybiB0cnVlIGlmIHBhdGgubmlsPworCisgICAgICAjIENoZWNrIGZvciBwYXRoIGluIGNhY2hlCisgICAgICBpZiBjYWNoZS5rZXk/IHBhdGgKKyAgICAgICAgcmV0dXJuIGNhY2hlW3BhdGhdCisgICAgICBlbmQKKworICAgICAgaWYgbWV0YWRhdGFbcGF0aF0KKyAgICAgICAgIyBJZiB3ZSBoYXZlIHNlZW4gdGhpcyBmaWxlIGJlZm9yZSwKKyAgICAgICAgIyBjaGVjayBpZiBpdCBvciBvbmUgb2YgaXRzIGRlcGVuZGVuY2llcyBoYXMgYmVlbiBtb2RpZmllZAorICAgICAgICBleGlzdGluZ19maWxlX21vZGlmaWVkPyhwYXRoKQorICAgICAgZWxzZQorICAgICAgICAjIElmIHdlIGhhdmUgbm90IHNlZW4gdGhpcyBmaWxlIGJlZm9yZSwgYWRkIGl0IHRvIHRoZSBtZXRhZGF0YSBhbmQgcmVnZW5lcmF0ZSBpdAorICAgICAgICBhZGQocGF0aCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBBZGQgYSBkZXBlbmRlbmN5IG9mIGEgcGF0aAorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgYWRkX2RlcGVuZGVuY3kocGF0aCwgZGVwZW5kZW5jeSkKKyAgICAgIHJldHVybiBpZiBtZXRhZGF0YVtwYXRoXS5uaWw/IHx8IGRpc2FibGVkCisKKyAgICAgIHVubGVzcyBtZXRhZGF0YVtwYXRoXVsiZGVwcyJdLmluY2x1ZGU/IGRlcGVuZGVuY3kKKyAgICAgICAgbWV0YWRhdGFbcGF0aF1bImRlcHMiXSA8PCBkZXBlbmRlbmN5CisgICAgICAgIGFkZChkZXBlbmRlbmN5KSB1bmxlc3MgbWV0YWRhdGEuaW5jbHVkZT8oZGVwZW5kZW5jeSkKKyAgICAgIGVuZAorICAgICAgcmVnZW5lcmF0ZT8gZGVwZW5kZW5jeQorICAgIGVuZAorCisgICAgIyBXcml0ZSB0aGUgbWV0YWRhdGEgdG8gZGlzaworICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgd3JpdGVfbWV0YWRhdGEKKyAgICAgIHVubGVzcyBkaXNhYmxlZD8KKyAgICAgICAgRmlsZS5iaW53cml0ZShtZXRhZGF0YV9maWxlLCBNYXJzaGFsLmR1bXAobWV0YWRhdGEpKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFByb2R1Y2UgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG1ldGFkYXRhIGZpbGUKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBTdHJpbmcgcGF0aCBvZiB0aGUgZmlsZS4KKyAgICBkZWYgbWV0YWRhdGFfZmlsZQorICAgICAgc2l0ZS5pbl9zb3VyY2VfZGlyKCIuamVreWxsLW1ldGFkYXRhIikKKyAgICBlbmQKKworICAgICMgQ2hlY2sgaWYgbWV0YWRhdGEgaGFzIGJlZW4gZGlzYWJsZWQKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgQm9vbGVhbiAodHJ1ZSBmb3IgZGlzYWJsZWQsIGZhbHNlIGZvciBlbmFibGVkKS4KKyAgICBkZWYgZGlzYWJsZWQ/CisgICAgICBzZWxmLmRpc2FibGVkID0gIXNpdGUuaW5jcmVtZW50YWw/IGlmIGRpc2FibGVkLm5pbD8KKyAgICAgIGRpc2FibGVkCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICAjIFJlYWQgbWV0YWRhdGEgZnJvbSB0aGUgbWV0YWRhdGEgZmlsZSwgaWYgbm8gZmlsZSBpcyBmb3VuZCwKKyAgICAjIGluaXRpYWxpemUgd2l0aCBhbiBlbXB0eSBoYXNoCisgICAgIworICAgICMgUmV0dXJucyB0aGUgcmVhZCBtZXRhZGF0YS4KKyAgICBkZWYgcmVhZF9tZXRhZGF0YQorICAgICAgQG1ldGFkYXRhID0KKyAgICAgICAgaWYgIWRpc2FibGVkPyAmJiBGaWxlLmZpbGU/KG1ldGFkYXRhX2ZpbGUpCisgICAgICAgICAgY29udGVudCA9IEZpbGUuYmlucmVhZChtZXRhZGF0YV9maWxlKQorCisgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgIE1hcnNoYWwubG9hZChjb250ZW50KQorICAgICAgICAgIHJlc2N1ZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIFNhZmVZQU1MLmxvYWQoY29udGVudCkKKyAgICAgICAgICByZXNjdWUgQXJndW1lbnRFcnJvciA9PiBlCisgICAgICAgICAgICBKZWt5bGwubG9nZ2VyLndhcm4oIkZhaWxlZCB0byBsb2FkICN7bWV0YWRhdGFfZmlsZX06ICN7ZX0iKQorICAgICAgICAgICAge30KKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIHt9CisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiByZWdlbmVyYXRlX3BhZ2U/KGRvY3VtZW50KQorICAgICAgZG9jdW1lbnQuYXNzZXRfZmlsZT8gfHwgZG9jdW1lbnQuZGF0YVsicmVnZW5lcmF0ZSJdIHx8CisgICAgICAgIHNvdXJjZV9tb2RpZmllZF9vcl9kZXN0X21pc3Npbmc/KAorICAgICAgICAgIHNpdGUuaW5fc291cmNlX2Rpcihkb2N1bWVudC5yZWxhdGl2ZV9wYXRoKSwgZG9jdW1lbnQuZGVzdGluYXRpb24oQHNpdGUuZGVzdCkKKyAgICAgICAgKQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiByZWdlbmVyYXRlX2RvY3VtZW50Pyhkb2N1bWVudCkKKyAgICAgICFkb2N1bWVudC53cml0ZT8gfHwgZG9jdW1lbnQuZGF0YVsicmVnZW5lcmF0ZSJdIHx8CisgICAgICAgIHNvdXJjZV9tb2RpZmllZF9vcl9kZXN0X21pc3Npbmc/KAorICAgICAgICAgIGRvY3VtZW50LnBhdGgsIGRvY3VtZW50LmRlc3RpbmF0aW9uKEBzaXRlLmRlc3QpCisgICAgICAgICkKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgZXhpc3RpbmdfZmlsZV9tb2RpZmllZD8ocGF0aCkKKyAgICAgICMgSWYgb25lIG9mIHRoaXMgZmlsZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIG1vZGlmaWVkLAorICAgICAgIyBzZXQgdGhlIHJlZ2VuZXJhdGlvbiBiaXQgZm9yIGJvdGggdGhlIGRlcGVuZGVuY3kgYW5kIHRoZSBmaWxlIHRvIHRydWUKKyAgICAgIG1ldGFkYXRhW3BhdGhdWyJkZXBzIl0uZWFjaCBkbyB8ZGVwZW5kZW5jeXwKKyAgICAgICAgaWYgbW9kaWZpZWQ/KGRlcGVuZGVuY3kpCisgICAgICAgICAgcmV0dXJuIGNhY2hlW2RlcGVuZGVuY3ldID0gY2FjaGVbcGF0aF0gPSB0cnVlCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGlmIEZpbGUuZXhpc3Q/KHBhdGgpICYmIG1ldGFkYXRhW3BhdGhdWyJtdGltZSJdLmVxbD8oRmlsZS5tdGltZShwYXRoKSkKKyAgICAgICAgIyBJZiB0aGlzIGZpbGUgaGFzIG5vdCBiZWVuIG1vZGlmaWVkLCBzZXQgdGhlIHJlZ2VuZXJhdGlvbiBiaXQgdG8gZmFsc2UKKyAgICAgICAgY2FjaGVbcGF0aF0gPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICAjIElmIGl0IGhhcyBiZWVuIG1vZGlmaWVkLCBzZXQgaXQgdG8gdHJ1ZQorICAgICAgICBhZGQocGF0aCkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvcmVsYXRlZF9wb3N0cy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlbGF0ZWRfcG9zdHMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNmE3MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlbGF0ZWRfcG9zdHMucmIKQEAgLTAsMCArMSw1MCBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBSZWxhdGVkUG9zdHMKKyAgICBjbGFzcyA8PCBzZWxmCisgICAgICBhdHRyX2FjY2Vzc29yIDpsc2kKKyAgICBlbmQKKworICAgIGF0dHJfcmVhZGVyIDpwb3N0LCA6c2l0ZQorCisgICAgZGVmIGluaXRpYWxpemUocG9zdCkKKyAgICAgIEBwb3N0ID0gcG9zdAorICAgICAgQHNpdGUgPSBwb3N0LnNpdGUKKyAgICAgIEpla3lsbDo6RXh0ZXJuYWwucmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWwoImNsYXNzaWZpZXItcmVib3JuIikgaWYgc2l0ZS5sc2kKKyAgICBlbmQKKworICAgIGRlZiBidWlsZAorICAgICAgcmV0dXJuIFtdIHVubGVzcyBzaXRlLnBvc3RzLmRvY3Muc2l6ZSA+IDEKKworICAgICAgaWYgc2l0ZS5sc2kKKyAgICAgICAgYnVpbGRfaW5kZXgKKyAgICAgICAgbHNpX3JlbGF0ZWRfcG9zdHMKKyAgICAgIGVsc2UKKyAgICAgICAgbW9zdF9yZWNlbnRfcG9zdHMKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGJ1aWxkX2luZGV4CisgICAgICBzZWxmLmNsYXNzLmxzaSB8fD0gYmVnaW4KKyAgICAgICAgbHNpID0gQ2xhc3NpZmllclJlYm9ybjo6TFNJLm5ldyg6YXV0b19yZWJ1aWxkID0+IGZhbHNlKQorICAgICAgICBKZWt5bGwubG9nZ2VyLmluZm8oIlBvcHVsYXRpbmcgTFNJLi4uIikKKworICAgICAgICBzaXRlLnBvc3RzLmRvY3MuZWFjaCBkbyB8eHwKKyAgICAgICAgICBsc2kuYWRkX2l0ZW0oeCkKKyAgICAgICAgZW5kCisKKyAgICAgICAgSmVreWxsLmxvZ2dlci5pbmZvKCJSZWJ1aWxkaW5nIGluZGV4Li4uIikKKyAgICAgICAgbHNpLmJ1aWxkX2luZGV4CisgICAgICAgIEpla3lsbC5sb2dnZXIuaW5mbygiIikKKyAgICAgICAgbHNpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBsc2lfcmVsYXRlZF9wb3N0cworICAgICAgc2VsZi5jbGFzcy5sc2kuZmluZF9yZWxhdGVkKHBvc3QsIDExKQorICAgIGVuZAorCisgICAgZGVmIG1vc3RfcmVjZW50X3Bvc3RzCisgICAgICBAbW9zdF9yZWNlbnRfcG9zdHMgfHw9IChzaXRlLnBvc3RzLmRvY3MucmV2ZXJzZSAtIFtwb3N0XSkuZmlyc3QoMTApCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZW5kZXJlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3JlbmRlcmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjU0NGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9yZW5kZXJlci5yYgpAQCAtMCwwICsxLDI2OSBAQAorIyBlbmNvZGluZzogVVRGLTgKKworbW9kdWxlIEpla3lsbAorICBjbGFzcyBSZW5kZXJlcgorICAgIGF0dHJfcmVhZGVyIDpkb2N1bWVudCwgOnNpdGUKKyAgICBhdHRyX3dyaXRlciA6bGF5b3V0cywgOnBheWxvYWQKKworICAgIGRlZiBpbml0aWFsaXplKHNpdGUsIGRvY3VtZW50LCBzaXRlX3BheWxvYWQgPSBuaWwpCisgICAgICBAc2l0ZSAgICAgPSBzaXRlCisgICAgICBAZG9jdW1lbnQgPSBkb2N1bWVudAorICAgICAgQHBheWxvYWQgID0gc2l0ZV9wYXlsb2FkCisgICAgZW5kCisKKyAgICAjIEZldGNoZXMgdGhlIHBheWxvYWQgdXNlZCBpbiBMaXF1aWQgcmVuZGVyaW5nLgorICAgICMgSXQgY2FuIGJlIHdyaXR0ZW4gd2l0aCAjcGF5bG9hZD0obmV3X3BheWxvYWQpCisgICAgIyBGYWxscyBiYWNrIHRvIHNpdGUuc2l0ZV9wYXlsb2FkIGlmIG5vIHBheWxvYWQgaXMgc2V0LgorICAgICMKKyAgICAjIFJldHVybnMgYSBKZWt5bGw6OkRyb3BzOjpVbmlmaWVkUGF5bG9hZERyb3AKKyAgICBkZWYgcGF5bG9hZAorICAgICAgQHBheWxvYWQgfHw9IHNpdGUuc2l0ZV9wYXlsb2FkCisgICAgZW5kCisKKyAgICAjIFRoZSBsaXN0IG9mIGxheW91dHMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBSZW5kZXJlci4KKyAgICAjIEl0IGNhbiBiZSB3cml0dGVuIHdpdGggI2xheW91dHM9KG5ld19sYXlvdXRzKQorICAgICMgRmFsbHMgYmFjayB0byBzaXRlLmxheW91dHMgaWYgbm8gbGF5b3V0cyBhcmUgcmVnaXN0ZXJlZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIGEgSGFzaCBvZiBTdHJpbmcgPT4gSmVreWxsOjpMYXlvdXQgaWRlbnRpZmllZAorICAgICMgYXMgYmFzZW5hbWUgd2l0aG91dCB0aGUgZXh0ZW5zaW9uIG5hbWUuCisgICAgZGVmIGxheW91dHMKKyAgICAgIEBsYXlvdXRzIHx8IHNpdGUubGF5b3V0cworICAgIGVuZAorCisgICAgIyBEZXRlcm1pbmUgd2hpY2ggY29udmVydGVycyB0byB1c2UgYmFzZWQgb24gdGhpcyBkb2N1bWVudCdzCisgICAgIyBleHRlbnNpb24uCisgICAgIworICAgICMgUmV0dXJucyBBcnJheSBvZiBDb252ZXJ0ZXIgaW5zdGFuY2VzLgorICAgIGRlZiBjb252ZXJ0ZXJzCisgICAgICBAY29udmVydGVycyB8fD0gc2l0ZS5jb252ZXJ0ZXJzLnNlbGVjdCB7IHxjfCBjLm1hdGNoZXMoZG9jdW1lbnQuZXh0bmFtZSkgfS5zb3J0CisgICAgZW5kCisKKyAgICAjIERldGVybWluZSB0aGUgZXh0bmFtZSB0aGUgb3V0cHV0dGVkIGZpbGUgc2hvdWxkIGhhdmUKKyAgICAjCisgICAgIyBSZXR1cm5zIFN0cmluZyB0aGUgb3V0cHV0IGV4dG5hbWUgaW5jbHVkaW5nIHRoZSBsZWFkaW5nIHBlcmlvZC4KKyAgICBkZWYgb3V0cHV0X2V4dAorICAgICAgQG91dHB1dF9leHQgfHw9IChwZXJtYWxpbmtfZXh0IHx8IGNvbnZlcnRlcl9vdXRwdXRfZXh0KQorICAgIGVuZAorCisgICAgIyBQcmVwYXJlIHBheWxvYWQgYW5kIHJlbmRlciB0aGUgZG9jdW1lbnQKKyAgICAjCisgICAgIyBSZXR1cm5zIFN0cmluZyByZW5kZXJlZCBkb2N1bWVudCBvdXRwdXQKKyAgICBkZWYgcnVuCisgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJSZW5kZXJpbmc6IiwgZG9jdW1lbnQucmVsYXRpdmVfcGF0aAorCisgICAgICBhc3NpZ25fcGFnZXMhCisgICAgICBhc3NpZ25fcmVsYXRlZF9wb3N0cyEKKyAgICAgIGFzc2lnbl9oaWdobGlnaHRlcl9vcHRpb25zIQorICAgICAgYXNzaWduX2xheW91dF9kYXRhIQorCisgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJQcmUtUmVuZGVyIEhvb2tzOiIsIGRvY3VtZW50LnJlbGF0aXZlX3BhdGgKKyAgICAgIGRvY3VtZW50LnRyaWdnZXJfaG9va3MoOnByZV9yZW5kZXIsIHBheWxvYWQpCisKKyAgICAgIHJlbmRlcl9kb2N1bWVudAorICAgIGVuZAorCisgICAgIyBSZW5kZXIgdGhlIGRvY3VtZW50LgorICAgICMKKyAgICAjIFJldHVybnMgU3RyaW5nIHJlbmRlcmVkIGRvY3VtZW50IG91dHB1dAorICAgICMgcnVib2NvcDogZGlzYWJsZSBBYmNTaXplCisgICAgZGVmIHJlbmRlcl9kb2N1bWVudAorICAgICAgaW5mbyA9IHsKKyAgICAgICAgOnJlZ2lzdGVycyA9PiB7IDpzaXRlID0+IHNpdGUsIDpwYWdlID0+IHBheWxvYWRbInBhZ2UiXSB9LAorICAgICAgfQorICAgICAgb3V0cHV0ID0gZG9jdW1lbnQuY29udGVudAorICAgICAgaWYgZG9jdW1lbnQucmVuZGVyX3dpdGhfbGlxdWlkPworICAgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJSZW5kZXJpbmcgTGlxdWlkOiIsIGRvY3VtZW50LnJlbGF0aXZlX3BhdGgKKyAgICAgICAgb3V0cHV0ID0gcmVuZGVyX2xpcXVpZChvdXRwdXQsIHBheWxvYWQsIGluZm8sIGRvY3VtZW50LnBhdGgpCisgICAgICBlbmQKKworICAgICAgSmVreWxsLmxvZ2dlci5kZWJ1ZyAiUmVuZGVyaW5nIE1hcmt1cDoiLCBkb2N1bWVudC5yZWxhdGl2ZV9wYXRoCisgICAgICBvdXRwdXQgPSBjb252ZXJ0KG91dHB1dCkKKyAgICAgIGRvY3VtZW50LmNvbnRlbnQgPSBvdXRwdXQKKworICAgICAgaWYgZG9jdW1lbnQucGxhY2VfaW5fbGF5b3V0PworICAgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJSZW5kZXJpbmcgTGF5b3V0OiIsIGRvY3VtZW50LnJlbGF0aXZlX3BhdGgKKyAgICAgICAgb3V0cHV0ID0gcGxhY2VfaW5fbGF5b3V0cyhvdXRwdXQsIHBheWxvYWQsIGluZm8pCisgICAgICBlbmQKKworICAgICAgb3V0cHV0CisgICAgZW5kCisgICAgIyBydWJvY29wOiBlbmFibGUgQWJjU2l6ZQorCisgICAgIyBDb252ZXJ0IHRoZSBkb2N1bWVudCB1c2luZyB0aGUgY29udmVydGVycyB3aGljaCBtYXRjaCB0aGlzIHJlbmRlcmVyJ3MgZG9jdW1lbnQuCisgICAgIworICAgICMgUmV0dXJucyBTdHJpbmcgdGhlIGNvbnZlcnRlZCBjb250ZW50LgorICAgIGRlZiBjb252ZXJ0KGNvbnRlbnQpCisgICAgICBjb252ZXJ0ZXJzLnJlZHVjZShjb250ZW50KSBkbyB8b3V0cHV0LCBjb252ZXJ0ZXJ8CisgICAgICAgIGJlZ2luCisgICAgICAgICAgY29udmVydGVyLmNvbnZlcnQgb3V0cHV0CisgICAgICAgIHJlc2N1ZSA9PiBlCisgICAgICAgICAgSmVreWxsLmxvZ2dlci5lcnJvciAiQ29udmVyc2lvbiBlcnJvcjoiLAorICAgICAgICAgICAgIiN7Y29udmVydGVyLmNsYXNzfSBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSAiXAorICAgICAgICAgICAgImNvbnZlcnRpbmcgJyN7ZG9jdW1lbnQucmVsYXRpdmVfcGF0aH0nOiIKKyAgICAgICAgICBKZWt5bGwubG9nZ2VyLmVycm9yKCIiLCBlLnRvX3MpCisgICAgICAgICAgcmFpc2UgZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZW5kZXIgdGhlIGdpdmVuIGNvbnRlbnQgd2l0aCB0aGUgcGF5bG9hZCBhbmQgaW5mbworICAgICMKKyAgICAjIGNvbnRlbnQgLQorICAgICMgcGF5bG9hZCAtCisgICAgIyBpbmZvICAgIC0KKyAgICAjIHBhdGggICAgLSAob3B0aW9uYWwpIHRoZSBwYXRoIHRvIHRoZSBmaWxlLCBmb3IgdXNlIGluIGV4CisgICAgIworICAgICMgUmV0dXJucyBTdHJpbmcgdGhlIGNvbnRlbnQsIHJlbmRlcmVkIGJ5IExpcXVpZC4KKyAgICBkZWYgcmVuZGVyX2xpcXVpZChjb250ZW50LCBwYXlsb2FkLCBpbmZvLCBwYXRoID0gbmlsKQorICAgICAgdGVtcGxhdGUgPSBzaXRlLmxpcXVpZF9yZW5kZXJlci5maWxlKHBhdGgpLnBhcnNlKGNvbnRlbnQpCisgICAgICB0ZW1wbGF0ZS53YXJuaW5ncy5lYWNoIGRvIHxlfAorICAgICAgICBKZWt5bGwubG9nZ2VyLndhcm4gIkxpcXVpZCBXYXJuaW5nOiIsCisgICAgICAgICAgTGlxdWlkUmVuZGVyZXIuZm9ybWF0X2Vycm9yKGUsIHBhdGggfHwgZG9jdW1lbnQucmVsYXRpdmVfcGF0aCkKKyAgICAgIGVuZAorICAgICAgdGVtcGxhdGUucmVuZGVyIShwYXlsb2FkLCBpbmZvKQorICAgICMgcnVib2NvcDogZGlzYWJsZSBSZXNjdWVFeGNlcHRpb24KKyAgICByZXNjdWUgRXhjZXB0aW9uID0+IGUKKyAgICAgIEpla3lsbC5sb2dnZXIuZXJyb3IgIkxpcXVpZCBFeGNlcHRpb246IiwKKyAgICAgICAgTGlxdWlkUmVuZGVyZXIuZm9ybWF0X2Vycm9yKGUsIHBhdGggfHwgZG9jdW1lbnQucmVsYXRpdmVfcGF0aCkKKyAgICAgIHJhaXNlIGUKKyAgICBlbmQKKyAgICAjIHJ1Ym9jb3A6IGVuYWJsZSBSZXNjdWVFeGNlcHRpb24KKworICAgICMgQ2hlY2tzIGlmIHRoZSBsYXlvdXQgc3BlY2lmaWVkIGluIHRoZSBkb2N1bWVudCBhY3R1YWxseSBleGlzdHMKKyAgICAjCisgICAgIyBsYXlvdXQgLSB0aGUgbGF5b3V0IHRvIGNoZWNrCisgICAgIworICAgICMgUmV0dXJucyBCb29sZWFuIHRydWUgaWYgdGhlIGxheW91dCBpcyBpbnZhbGlkLCBmYWxzZSBpZiBvdGhlcndpc2UKKyAgICBkZWYgaW52YWxpZF9sYXlvdXQ/KGxheW91dCkKKyAgICAgICFkb2N1bWVudC5kYXRhWyJsYXlvdXQiXS5uaWw/ICYmIGxheW91dC5uaWw/ICYmICEoZG9jdW1lbnQuaXNfYT8gSmVreWxsOjpFeGNlcnB0KQorICAgIGVuZAorCisgICAgIyBSZW5kZXIgbGF5b3V0cyBhbmQgcGxhY2UgZG9jdW1lbnQgY29udGVudCBpbnNpZGUuCisgICAgIworICAgICMgUmV0dXJucyBTdHJpbmcgcmVuZGVyZWQgY29udGVudAorICAgIGRlZiBwbGFjZV9pbl9sYXlvdXRzKGNvbnRlbnQsIHBheWxvYWQsIGluZm8pCisgICAgICBvdXRwdXQgPSBjb250ZW50LmR1cAorICAgICAgbGF5b3V0ID0gbGF5b3V0c1tkb2N1bWVudC5kYXRhWyJsYXlvdXQiXV0KKyAgICAgIHZhbGlkYXRlX2xheW91dChsYXlvdXQpCisKKyAgICAgIHVzZWQgPSBTZXQubmV3KFtsYXlvdXRdKQorCisgICAgICAjIFJlc2V0IHRoZSBwYXlsb2FkIGxheW91dCBkYXRhIHRvIGVuc3VyZSBpdCBzdGFydHMgZnJlc2ggZm9yIGVhY2ggcGFnZS4KKyAgICAgIHBheWxvYWRbImxheW91dCJdID0gbmlsCisKKyAgICAgIHdoaWxlIGxheW91dAorICAgICAgICBvdXRwdXQgPSByZW5kZXJfbGF5b3V0KG91dHB1dCwgbGF5b3V0LCBpbmZvKQorICAgICAgICBhZGRfcmVnZW5lcmF0b3JfZGVwZW5kZW5jaWVzKGxheW91dCkKKworICAgICAgICBpZiAobGF5b3V0ID0gc2l0ZS5sYXlvdXRzW2xheW91dC5kYXRhWyJsYXlvdXQiXV0pCisgICAgICAgICAgYnJlYWsgaWYgdXNlZC5pbmNsdWRlPyhsYXlvdXQpCisgICAgICAgICAgdXNlZCA8PCBsYXlvdXQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIG91dHB1dAorICAgIGVuZAorCisgICAgIyBDaGVja3MgaWYgdGhlIGxheW91dCBzcGVjaWZpZWQgaW4gdGhlIGRvY3VtZW50IGFjdHVhbGx5IGV4aXN0cworICAgICMKKyAgICAjIGxheW91dCAtIHRoZSBsYXlvdXQgdG8gY2hlY2sKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIHByaXZhdGUKKyAgICBkZWYgdmFsaWRhdGVfbGF5b3V0KGxheW91dCkKKyAgICAgIHJldHVybiB1bmxlc3MgaW52YWxpZF9sYXlvdXQ/KGxheW91dCkKKyAgICAgIEpla3lsbC5sb2dnZXIud2FybigKKyAgICAgICAgIkJ1aWxkIFdhcm5pbmc6IiwKKyAgICAgICAgIkxheW91dCAnI3tkb2N1bWVudC5kYXRhWyJsYXlvdXQiXX0nIHJlcXVlc3RlZCAiXAorICAgICAgICAiaW4gI3tkb2N1bWVudC5yZWxhdGl2ZV9wYXRofSBkb2VzIG5vdCBleGlzdC4iCisgICAgICApCisgICAgZW5kCisKKyAgICAjIFJlbmRlciBsYXlvdXQgY29udGVudCBpbnRvIGRvY3VtZW50Lm91dHB1dAorICAgICMKKyAgICAjIFJldHVybnMgU3RyaW5nIHJlbmRlcmVkIGNvbnRlbnQKKyAgICBwcml2YXRlCisgICAgZGVmIHJlbmRlcl9sYXlvdXQob3V0cHV0LCBsYXlvdXQsIGluZm8pCisgICAgICBwYXlsb2FkWyJjb250ZW50Il0gPSBvdXRwdXQKKyAgICAgIHBheWxvYWRbImxheW91dCJdICA9IFV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzKGxheW91dC5kYXRhLCBwYXlsb2FkWyJsYXlvdXQiXSB8fCB7fSkKKworICAgICAgcmVuZGVyX2xpcXVpZCgKKyAgICAgICAgbGF5b3V0LmNvbnRlbnQsCisgICAgICAgIHBheWxvYWQsCisgICAgICAgIGluZm8sCisgICAgICAgIGxheW91dC5yZWxhdGl2ZV9wYXRoCisgICAgICApCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIGFkZF9yZWdlbmVyYXRvcl9kZXBlbmRlbmNpZXMobGF5b3V0KQorICAgICAgcmV0dXJuIHVubGVzcyBkb2N1bWVudC53cml0ZT8KKyAgICAgIHNpdGUucmVnZW5lcmF0b3IuYWRkX2RlcGVuZGVuY3koCisgICAgICAgIHNpdGUuaW5fc291cmNlX2Rpcihkb2N1bWVudC5wYXRoKSwKKyAgICAgICAgc2l0ZS5pbl9zb3VyY2VfZGlyKGxheW91dC5wYXRoKQorICAgICAgKQorICAgIGVuZAorCisgICAgIyBTZXQgcGFnZSBjb250ZW50IHRvIHBheWxvYWQgYW5kIGFzc2lnbiBwYWdlciBpZiBkb2N1bWVudCBoYXMgb25lLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIHByaXZhdGUKKyAgICBkZWYgYXNzaWduX3BhZ2VzIQorICAgICAgcGF5bG9hZFsicGFnZSJdID0gZG9jdW1lbnQudG9fbGlxdWlkCisgICAgICBwYXlsb2FkWyJwYWdpbmF0b3IiXSA9IGlmIGRvY3VtZW50LnJlc3BvbmRfdG8/KDpwYWdlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5wYWdlci50b19saXF1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFNldCByZWxhdGVkIHBvc3RzIHRvIHBheWxvYWQgaWYgZG9jdW1lbnQgaXMgYSBwb3N0LgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIHByaXZhdGUKKyAgICBkZWYgYXNzaWduX3JlbGF0ZWRfcG9zdHMhCisgICAgICBpZiBkb2N1bWVudC5pc19hPyhEb2N1bWVudCkgJiYgZG9jdW1lbnQuY29sbGVjdGlvbi5sYWJlbCA9PSAicG9zdHMiCisgICAgICAgIHBheWxvYWRbInNpdGUiXVsicmVsYXRlZF9wb3N0cyJdID0gZG9jdW1lbnQucmVsYXRlZF9wb3N0cworICAgICAgZWxzZQorICAgICAgICBwYXlsb2FkWyJzaXRlIl1bInJlbGF0ZWRfcG9zdHMiXSA9IG5pbAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFNldCBoaWdobGlnaHRlciBwcmVmaXggYW5kIHN1ZmZpeAorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIHByaXZhdGUKKyAgICBkZWYgYXNzaWduX2hpZ2hsaWdodGVyX29wdGlvbnMhCisgICAgICBwYXlsb2FkWyJoaWdobGlnaHRlcl9wcmVmaXgiXSA9IGNvbnZlcnRlcnMuZmlyc3QuaGlnaGxpZ2h0ZXJfcHJlZml4CisgICAgICBwYXlsb2FkWyJoaWdobGlnaHRlcl9zdWZmaXgiXSA9IGNvbnZlcnRlcnMuZmlyc3QuaGlnaGxpZ2h0ZXJfc3VmZml4CisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIGFzc2lnbl9sYXlvdXRfZGF0YSEKKyAgICAgIGxheW91dCA9IGxheW91dHNbZG9jdW1lbnQuZGF0YVsibGF5b3V0Il1dCisgICAgICBpZiBsYXlvdXQKKyAgICAgICAgcGF5bG9hZFsibGF5b3V0Il0gPSBVdGlscy5kZWVwX21lcmdlX2hhc2hlcyhsYXlvdXQuZGF0YSwgcGF5bG9hZFsibGF5b3V0Il0gfHwge30pCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgcGVybWFsaW5rX2V4dAorICAgICAgaWYgZG9jdW1lbnQucGVybWFsaW5rICYmICFkb2N1bWVudC5wZXJtYWxpbmsuZW5kX3dpdGg/KCIvIikKKyAgICAgICAgcGVybWFsaW5rX2V4dCA9IEZpbGUuZXh0bmFtZShkb2N1bWVudC5wZXJtYWxpbmspCisgICAgICAgIHBlcm1hbGlua19leHQgdW5sZXNzIHBlcm1hbGlua19leHQuZW1wdHk/CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgY29udmVydGVyX291dHB1dF9leHQKKyAgICAgIGlmIG91dHB1dF9leHRzLnNpemUgPT0gMQorICAgICAgICBvdXRwdXRfZXh0cy5sYXN0CisgICAgICBlbHNlCisgICAgICAgIG91dHB1dF9leHRzWy0yXQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIG91dHB1dF9leHRzCisgICAgICBAb3V0cHV0X2V4dHMgfHw9IGNvbnZlcnRlcnMubWFwIGRvIHxjfAorICAgICAgICBjLm91dHB1dF9leHQoZG9jdW1lbnQuZXh0bmFtZSkKKyAgICAgIGVuZC5jb21wYWN0CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9zaXRlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvc2l0ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDc2MDI3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvc2l0ZS5yYgpAQCAtMCwwICsxLDQ3MyBAQAorIyBlbmNvZGluZzogVVRGLTgKKworcmVxdWlyZSAiY3N2IgorCittb2R1bGUgSmVreWxsCisgIGNsYXNzIFNpdGUKKyAgICBhdHRyX3JlYWRlciAgIDpzb3VyY2UsIDpkZXN0LCA6Y29uZmlnCisgICAgYXR0cl9hY2Nlc3NvciA6bGF5b3V0cywgOnBhZ2VzLCA6c3RhdGljX2ZpbGVzLCA6ZHJhZnRzLAorICAgICAgICAgICAgICAgICAgOmV4Y2x1ZGUsIDppbmNsdWRlLCA6bHNpLCA6aGlnaGxpZ2h0ZXIsIDpwZXJtYWxpbmtfc3R5bGUsCisgICAgICAgICAgICAgICAgICA6dGltZSwgOmZ1dHVyZSwgOnVucHVibGlzaGVkLCA6c2FmZSwgOnBsdWdpbnMsIDpsaW1pdF9wb3N0cywKKyAgICAgICAgICAgICAgICAgIDpzaG93X2RyYWZ0cywgOmtlZXBfZmlsZXMsIDpiYXNldXJsLCA6ZGF0YSwgOmZpbGVfcmVhZF9vcHRzLAorICAgICAgICAgICAgICAgICAgOmdlbXMsIDpwbHVnaW5fbWFuYWdlciwgOnRoZW1lCisKKyAgICBhdHRyX2FjY2Vzc29yIDpjb252ZXJ0ZXJzLCA6Z2VuZXJhdG9ycywgOnJlYWRlcgorICAgIGF0dHJfcmVhZGVyICAgOnJlZ2VuZXJhdG9yLCA6bGlxdWlkX3JlbmRlcmVyLCA6aW5jbHVkZXNfbG9hZF9wYXRocworCisgICAgIyBQdWJsaWM6IEluaXRpYWxpemUgYSBuZXcgU2l0ZS4KKyAgICAjCisgICAgIyBjb25maWcgLSBBIEhhc2ggY29udGFpbmluZyBzaXRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4KKyAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcpCisgICAgICAjIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWF5IG5vdCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBzaXRlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICBAc291cmNlICAgICAgICAgID0gRmlsZS5leHBhbmRfcGF0aChjb25maWdbInNvdXJjZSJdKS5mcmVlemUKKyAgICAgIEBkZXN0ICAgICAgICAgICAgPSBGaWxlLmV4cGFuZF9wYXRoKGNvbmZpZ1siZGVzdGluYXRpb24iXSkuZnJlZXplCisKKyAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCisKKyAgICAgIEByZWFkZXIgICAgICAgICAgPSBSZWFkZXIubmV3KHNlbGYpCisgICAgICBAcmVnZW5lcmF0b3IgICAgID0gUmVnZW5lcmF0b3IubmV3KHNlbGYpCisgICAgICBAbGlxdWlkX3JlbmRlcmVyID0gTGlxdWlkUmVuZGVyZXIubmV3KHNlbGYpCisKKyAgICAgIEpla3lsbC5zaXRlcyA8PCBzZWxmCisKKyAgICAgIHJlc2V0CisgICAgICBzZXR1cAorCisgICAgICBKZWt5bGw6Okhvb2tzLnRyaWdnZXIgOnNpdGUsIDphZnRlcl9pbml0LCBzZWxmCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogU2V0IHRoZSBzaXRlJ3MgY29uZmlndXJhdGlvbi4gVGhpcyBoYW5kbGVzIHNpZGUtZWZmZWN0cyBjYXVzZWQgYnkKKyAgICAjIGNoYW5naW5nIHZhbHVlcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAjCisgICAgIyBjb25maWcgLSBhIEpla3lsbDo6Q29uZmlndXJhdGlvbiwgY29udGFpbmluZyB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgIworICAgICMgUmV0dXJucyB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgZGVmIGNvbmZpZz0oY29uZmlnKQorICAgICAgQGNvbmZpZyA9IGNvbmZpZy5jbG9uZQorCisgICAgICAldyhzYWZlIGxzaSBoaWdobGlnaHRlciBiYXNldXJsIGV4Y2x1ZGUgaW5jbHVkZSBmdXR1cmUgdW5wdWJsaXNoZWQKKyAgICAgICAgc2hvd19kcmFmdHMgbGltaXRfcG9zdHMga2VlcF9maWxlcykuZWFjaCBkbyB8b3B0fAorICAgICAgICBzZWxmLnNlbmQoIiN7b3B0fT0iLCBjb25maWdbb3B0XSkKKyAgICAgIGVuZAorCisgICAgICAjIGtlZXAgdXNpbmcgYGdlbXNgIHRvIGF2b2lkIGJyZWFraW5nIGNoYW5nZQorICAgICAgc2VsZi5nZW1zID0gY29uZmlnWyJwbHVnaW5zIl0KKworICAgICAgY29uZmlndXJlX3BsdWdpbnMKKyAgICAgIGNvbmZpZ3VyZV90aGVtZQorICAgICAgY29uZmlndXJlX2luY2x1ZGVfcGF0aHMKKyAgICAgIGNvbmZpZ3VyZV9maWxlX3JlYWRfb3B0cworCisgICAgICBzZWxmLnBlcm1hbGlua19zdHlsZSA9IGNvbmZpZ1sicGVybWFsaW5rIl0udG9fc3ltCisKKyAgICAgIEBjb25maWcKKyAgICBlbmQKKworICAgICMgUHVibGljOiBSZWFkLCBwcm9jZXNzLCBhbmQgd3JpdGUgdGhpcyBTaXRlIHRvIG91dHB1dC4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHByb2Nlc3MKKyAgICAgIHJlc2V0CisgICAgICByZWFkCisgICAgICBnZW5lcmF0ZQorICAgICAgcmVuZGVyCisgICAgICBjbGVhbnVwCisgICAgICB3cml0ZQorICAgICAgcHJpbnRfc3RhdHMKKyAgICBlbmQKKworICAgIGRlZiBwcmludF9zdGF0cworICAgICAgaWYgQGNvbmZpZ1sicHJvZmlsZSJdCisgICAgICAgIHB1dHMgQGxpcXVpZF9yZW5kZXJlci5zdGF0c190YWJsZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJlc2V0IFNpdGUgZGV0YWlscy4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBkZWYgcmVzZXQKKyAgICAgIGlmIGNvbmZpZ1sidGltZSJdCisgICAgICAgIHNlbGYudGltZSA9IFV0aWxzLnBhcnNlX2RhdGUoY29uZmlnWyJ0aW1lIl0udG9fcywgIkludmFsaWQgdGltZSBpbiBfY29uZmlnLnltbC4iKQorICAgICAgZWxzZQorICAgICAgICBzZWxmLnRpbWUgPSBUaW1lLm5vdworICAgICAgZW5kCisgICAgICBzZWxmLmxheW91dHMgPSB7fQorICAgICAgc2VsZi5wYWdlcyA9IFtdCisgICAgICBzZWxmLnN0YXRpY19maWxlcyA9IFtdCisgICAgICBzZWxmLmRhdGEgPSB7fQorICAgICAgQGNvbGxlY3Rpb25zID0gbmlsCisgICAgICBAcmVnZW5lcmF0b3IuY2xlYXJfY2FjaGUKKyAgICAgIEBsaXF1aWRfcmVuZGVyZXIucmVzZXQKKworICAgICAgaWYgbGltaXRfcG9zdHMgPCAwCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJsaW1pdF9wb3N0cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciIKKyAgICAgIGVuZAorCisgICAgICBKZWt5bGw6Okhvb2tzLnRyaWdnZXIgOnNpdGUsIDphZnRlcl9yZXNldCwgc2VsZgorICAgIGVuZAorCisgICAgIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMsIHBsdWdpbnMsIGNvbnZlcnRlcnMsIGFuZCBnZW5lcmF0b3JzLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgc2V0dXAKKyAgICAgIGVuc3VyZV9ub3RfaW5fZGVzdAorCisgICAgICBwbHVnaW5fbWFuYWdlci5jb25zY2llbnRpb3VzX3JlcXVpcmUKKworICAgICAgc2VsZi5jb252ZXJ0ZXJzID0gaW5zdGFudGlhdGVfc3ViY2xhc3NlcyhKZWt5bGw6OkNvbnZlcnRlcikKKyAgICAgIHNlbGYuZ2VuZXJhdG9ycyA9IGluc3RhbnRpYXRlX3N1YmNsYXNzZXMoSmVreWxsOjpHZW5lcmF0b3IpCisgICAgZW5kCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpciBpc24ndCB0aGUgc291cmNlIGRpciBvciBhIGRpcmVjdG9yeQorICAgICMgcGFyZW50IHRvIHRoZSBzb3VyY2UgZGlyLgorICAgIGRlZiBlbnN1cmVfbm90X2luX2Rlc3QKKyAgICAgIGRlc3RfcGF0aG5hbWUgPSBQYXRobmFtZS5uZXcoZGVzdCkKKyAgICAgIFBhdGhuYW1lLm5ldyhzb3VyY2UpLmFzY2VuZCBkbyB8cGF0aHwKKyAgICAgICAgaWYgcGF0aCA9PSBkZXN0X3BhdGhuYW1lCisgICAgICAgICAgcmFpc2UoCisgICAgICAgICAgICBFcnJvcnM6OkZhdGFsRXhjZXB0aW9uLAorICAgICAgICAgICAgIkRlc3RpbmF0aW9uIGRpcmVjdG9yeSBjYW5ub3QgYmUgb3IgY29udGFpbiB0aGUgU291cmNlIGRpcmVjdG9yeS4iCisgICAgICAgICAgKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUgbGlzdCBvZiBjb2xsZWN0aW9ucyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBKZWt5bGw6OkNvbGxlY3Rpb24gaW5zdGFuY2VzLgorICAgICMgSWYgY29uZmlnWydjb2xsZWN0aW9ucyddIGlzIHNldCwgYSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZAorICAgICMgZm9yIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiwgYSBuZXcgaGFzaCBpcyByZXR1cm5lZCBvdGhlcndpc2UuCisgICAgIworICAgICMgUmV0dXJucyBhIEhhc2ggY29udGFpbmluZyBjb2xsZWN0aW9uIG5hbWUtdG8taW5zdGFuY2UgcGFpcnMuCisgICAgZGVmIGNvbGxlY3Rpb25zCisgICAgICBAY29sbGVjdGlvbnMgfHw9IEhhc2hbY29sbGVjdGlvbl9uYW1lcy5tYXAgZG8gfGNvbGx8CisgICAgICAgIFtjb2xsLCBKZWt5bGw6OkNvbGxlY3Rpb24ubmV3KHNlbGYsIGNvbGwpXQorICAgICAgZW5kXQorICAgIGVuZAorCisgICAgIyBUaGUgbGlzdCBvZiBjb2xsZWN0aW9uIG5hbWVzLgorICAgICMKKyAgICAjIFJldHVybnMgYW4gYXJyYXkgb2YgY29sbGVjdGlvbiBuYW1lcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uLAorICAgICMgICBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGUgYGNvbGxlY3Rpb25zYCBrZXkgaXMgbm90IHNldC4KKyAgICBkZWYgY29sbGVjdGlvbl9uYW1lcworICAgICAgY2FzZSBjb25maWdbImNvbGxlY3Rpb25zIl0KKyAgICAgIHdoZW4gSGFzaAorICAgICAgICBjb25maWdbImNvbGxlY3Rpb25zIl0ua2V5cworICAgICAgd2hlbiBBcnJheQorICAgICAgICBjb25maWdbImNvbGxlY3Rpb25zIl0KKyAgICAgIHdoZW4gbmlsCisgICAgICAgIFtdCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJZb3VyIGBjb2xsZWN0aW9uc2Aga2V5IG11c3QgYmUgYSBoYXNoIG9yIGFuIGFycmF5LiIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZWFkIFNpdGUgZGF0YSBmcm9tIGRpc2sgYW5kIGxvYWQgaXQgaW50byBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiByZWFkCisgICAgICByZWFkZXIucmVhZAorICAgICAgbGltaXRfcG9zdHMhCisgICAgICBKZWt5bGw6Okhvb2tzLnRyaWdnZXIgOnNpdGUsIDpwb3N0X3JlYWQsIHNlbGYKKyAgICBlbmQKKworICAgICMgUnVuIGVhY2ggb2YgdGhlIEdlbmVyYXRvcnMuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiBnZW5lcmF0ZQorICAgICAgZ2VuZXJhdG9ycy5lYWNoIGRvIHxnZW5lcmF0b3J8CisgICAgICAgIHN0YXJ0ID0gVGltZS5ub3cKKyAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlKHNlbGYpCisgICAgICAgIEpla3lsbC5sb2dnZXIuZGVidWcgIkdlbmVyYXRpbmc6IiwKKyAgICAgICAgICAiI3tnZW5lcmF0b3IuY2xhc3N9IGZpbmlzaGVkIGluICN7VGltZS5ub3cgLSBzdGFydH0gc2Vjb25kcy4iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUmVuZGVyIHRoZSBzaXRlIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHJlbmRlcgorICAgICAgcmVsYXRpdmVfcGVybWFsaW5rc19hcmVfZGVwcmVjYXRlZAorCisgICAgICBwYXlsb2FkID0gc2l0ZV9wYXlsb2FkCisKKyAgICAgIEpla3lsbDo6SG9va3MudHJpZ2dlciA6c2l0ZSwgOnByZV9yZW5kZXIsIHNlbGYsIHBheWxvYWQKKworICAgICAgcmVuZGVyX2RvY3MocGF5bG9hZCkKKyAgICAgIHJlbmRlcl9wYWdlcyhwYXlsb2FkKQorCisgICAgICBKZWt5bGw6Okhvb2tzLnRyaWdnZXIgOnNpdGUsIDpwb3N0X3JlbmRlciwgc2VsZiwgcGF5bG9hZAorICAgIGVuZAorCisgICAgIyBSZW1vdmUgb3JwaGFuZWQgZmlsZXMgYW5kIGVtcHR5IGRpcmVjdG9yaWVzIGluIGRlc3RpbmF0aW9uLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgY2xlYW51cAorICAgICAgc2l0ZV9jbGVhbmVyLmNsZWFudXAhCisgICAgZW5kCisKKyAgICAjIFdyaXRlIHN0YXRpYyBmaWxlcywgcGFnZXMsIGFuZCBwb3N0cy4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHdyaXRlCisgICAgICBlYWNoX3NpdGVfZmlsZSBkbyB8aXRlbXwKKyAgICAgICAgaXRlbS53cml0ZShkZXN0KSBpZiByZWdlbmVyYXRvci5yZWdlbmVyYXRlPyhpdGVtKQorICAgICAgZW5kCisgICAgICByZWdlbmVyYXRvci53cml0ZV9tZXRhZGF0YQorICAgICAgSmVreWxsOjpIb29rcy50cmlnZ2VyIDpzaXRlLCA6cG9zdF93cml0ZSwgc2VsZgorICAgIGVuZAorCisgICAgZGVmIHBvc3RzCisgICAgICBjb2xsZWN0aW9uc1sicG9zdHMiXSB8fD0gQ29sbGVjdGlvbi5uZXcoc2VsZiwgInBvc3RzIikKKyAgICBlbmQKKworICAgICMgQ29uc3RydWN0IGEgSGFzaCBvZiBQb3N0cyBpbmRleGVkIGJ5IHRoZSBzcGVjaWZpZWQgUG9zdCBhdHRyaWJ1dGUuCisgICAgIworICAgICMgcG9zdF9hdHRyIC0gVGhlIFN0cmluZyBuYW1lIG9mIHRoZSBQb3N0IGF0dHJpYnV0ZS4KKyAgICAjCisgICAgIyBFeGFtcGxlcworICAgICMKKyAgICAjICAgcG9zdF9hdHRyX2hhc2goJ2NhdGVnb3JpZXMnKQorICAgICMgICAjID0+IHsgJ3RlY2gnID0+IFs8UG9zdCBBPiwgPFBvc3QgQj5dLAorICAgICMgICAjICAgICAgJ3J1YnknID0+IFs8UG9zdCBCPl0gfQorICAgICMKKyAgICAjIFJldHVybnMgdGhlIEhhc2g6IHsgYXR0ciA9PiBwb3N0cyB9IHdoZXJlCisgICAgIyAgIGF0dHIgIC0gT25lIG9mIHRoZSB2YWx1ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlLgorICAgICMgICBwb3N0cyAtIFRoZSBBcnJheSBvZiBQb3N0cyB3aXRoIHRoZSBnaXZlbiBhdHRyIHZhbHVlLgorICAgIGRlZiBwb3N0X2F0dHJfaGFzaChwb3N0X2F0dHIpCisgICAgICAjIEJ1aWxkIGEgaGFzaCBtYXAgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwb3N0IGF0dHJpYnV0ZSAoIHBvc3QgYXR0ciA9PgorICAgICAgIyBhcnJheSBvZiBwb3N0cyApIHRoZW4gc29ydCBlYWNoIGFycmF5IGluIHJldmVyc2Ugb3JkZXIuCisgICAgICBoYXNoID0gSGFzaC5uZXcgeyB8aCwga2V5fCBoW2tleV0gPSBbXSB9CisgICAgICBwb3N0cy5kb2NzLmVhY2ggZG8gfHB8CisgICAgICAgIHAuZGF0YVtwb3N0X2F0dHJdLmVhY2ggeyB8dHwgaGFzaFt0XSA8PCBwIH0gaWYgcC5kYXRhW3Bvc3RfYXR0cl0KKyAgICAgIGVuZAorICAgICAgaGFzaC52YWx1ZXMuZWFjaCB7IHxwb3N0c3wgcG9zdHMuc29ydCEucmV2ZXJzZSEgfQorICAgICAgaGFzaAorICAgIGVuZAorCisgICAgZGVmIHRhZ3MKKyAgICAgIHBvc3RfYXR0cl9oYXNoKCJ0YWdzIikKKyAgICBlbmQKKworICAgIGRlZiBjYXRlZ29yaWVzCisgICAgICBwb3N0X2F0dHJfaGFzaCgiY2F0ZWdvcmllcyIpCisgICAgZW5kCisKKyAgICAjIFByZXBhcmUgc2l0ZSBkYXRhIGZvciBzaXRlIHBheWxvYWQuIFRoZSBtZXRob2QgbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICAjIGlmIHRoZSBrZXkgJ2RhdGEnIGlzIGFscmVhZHkgdXNlZCBpbiBfY29uZmlnLnltbC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBIYXNoIHRvIGJlIGhvb2tlZCB0byBzaXRlLmRhdGEuCisgICAgZGVmIHNpdGVfZGF0YQorICAgICAgY29uZmlnWyJkYXRhIl0gfHwgZGF0YQorICAgIGVuZAorCisgICAgIyBUaGUgSGFzaCBwYXlsb2FkIGNvbnRhaW5pbmcgc2l0ZS13aWRlIGRhdGEuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgSGFzaDogeyAic2l0ZSIgPT4gZGF0YSB9IHdoZXJlIGRhdGEgaXMgYSBIYXNoIHdpdGgga2V5czoKKyAgICAjICAgInRpbWUiICAgICAgIC0gVGhlIFRpbWUgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIG9yIHRoZQorICAgICMgICAgICAgICAgICAgICAgICBjdXJyZW50IHRpbWUgaWYgbm9uZSB3YXMgc3BlY2lmaWVkLgorICAgICMgICAicG9zdHMiICAgICAgLSBUaGUgQXJyYXkgb2YgUG9zdHMsIHNvcnRlZCBjaHJvbm9sb2dpY2FsbHkgYnkgcG9zdCBkYXRlCisgICAgIyAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIHRpdGxlLgorICAgICMgICAicGFnZXMiICAgICAgLSBUaGUgQXJyYXkgb2YgYWxsIFBhZ2VzLgorICAgICMgICAiaHRtbF9wYWdlcyIgLSBUaGUgQXJyYXkgb2YgSFRNTCBQYWdlcy4KKyAgICAjICAgImNhdGVnb3JpZXMiIC0gVGhlIEhhc2ggb2YgY2F0ZWdvcnkgdmFsdWVzIGFuZCBQb3N0cy4KKyAgICAjICAgICAgICAgICAgICAgICAgU2VlIFNpdGUjcG9zdF9hdHRyX2hhc2ggZm9yIHR5cGUgaW5mby4KKyAgICAjICAgInRhZ3MiICAgICAgIC0gVGhlIEhhc2ggb2YgdGFnIHZhbHVlcyBhbmQgUG9zdHMuCisgICAgIyAgICAgICAgICAgICAgICAgIFNlZSBTaXRlI3Bvc3RfYXR0cl9oYXNoIGZvciB0eXBlIGluZm8uCisgICAgZGVmIHNpdGVfcGF5bG9hZAorICAgICAgRHJvcHM6OlVuaWZpZWRQYXlsb2FkRHJvcC5uZXcgc2VsZgorICAgIGVuZAorICAgIGFsaWFzX21ldGhvZCA6dG9fbGlxdWlkLCA6c2l0ZV9wYXlsb2FkCisKKyAgICAjIEdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBnaXZlbiBDb252ZXJ0ZXIuCisgICAgIyBSZXR1cm5zIHRoZSBDb252ZXJ0ZXIgaW5zdGFuY2UgaW1wbGVtZW50aW5nIHRoZSBnaXZlbiBDb252ZXJ0ZXIuCisgICAgIyBrbGFzcyAtIFRoZSBDbGFzcyBvZiB0aGUgQ29udmVydGVyIHRvIGZldGNoLgorCisgICAgZGVmIGZpbmRfY29udmVydGVyX2luc3RhbmNlKGtsYXNzKQorICAgICAgY29udmVydGVycy5maW5kIHsgfGtsYXNzX3wga2xhc3NfLmluc3RhbmNlX29mPyhrbGFzcykgfSB8fCBcCisgICAgICAgIHJhaXNlKCJObyBDb252ZXJ0ZXJzIGZvdW5kIGZvciAje2tsYXNzfSIpCisgICAgZW5kCisKKyAgICAjIGtsYXNzIC0gY2xhc3Mgb3IgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIHN1YmNsYXNzZXMuCisgICAgIyBSZXR1cm5zIGFycmF5IG9mIGluc3RhbmNlcyBvZiBzdWJjbGFzc2VzIG9mIHBhcmFtZXRlci4KKyAgICAjIENyZWF0ZSBhcnJheSBvZiBpbnN0YW5jZXMgb2YgdGhlIHN1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIG9yIG1vZHVsZQorICAgICMgcGFzc2VkIGluIGFzIGFyZ3VtZW50LgorCisgICAgZGVmIGluc3RhbnRpYXRlX3N1YmNsYXNzZXMoa2xhc3MpCisgICAgICBrbGFzcy5kZXNjZW5kYW50cy5zZWxlY3QgeyB8Y3wgIXNhZmUgfHwgYy5zYWZlIH0uc29ydC5tYXAgZG8gfGN8CisgICAgICAgIGMubmV3KGNvbmZpZykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBXYXJucyB0aGUgdXNlciBpZiBwZXJtYW5lbnQgbGlua3MgYXJlIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQKKyAgICAjIGRpcmVjdG9yeS4gQXMgdGhpcyBpcyBhIGRlcHJlY2F0ZWQgZnVuY3Rpb24gb2YgSmVreWxsLgorICAgICMKKyAgICAjIFJldHVybnMKKyAgICBkZWYgcmVsYXRpdmVfcGVybWFsaW5rc19hcmVfZGVwcmVjYXRlZAorICAgICAgaWYgY29uZmlnWyJyZWxhdGl2ZV9wZXJtYWxpbmtzIl0KKyAgICAgICAgSmVreWxsLmxvZ2dlci5hYm9ydF93aXRoICJTaW5jZSB2My4wLCBwZXJtYWxpbmtzIGZvciBwYWdlcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIHN1YmZvbGRlcnMgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzaXRlIHNvdXJjZSBkaXJlY3RvcnksIG5vdCB0aGUgcGFyZW50IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGlyZWN0b3J5LiBDaGVjayBodHRwczovL2pla3lsbHJiLmNvbS9kb2NzL3VwZ3JhZGluZy8iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBtb3JlIGluZm8uIgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEdldCB0aGUgdG8gYmUgd3JpdHRlbiBkb2N1bWVudHMKKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIEFycmF5IG9mIERvY3VtZW50cyB3aGljaCBzaG91bGQgYmUgd3JpdHRlbgorICAgIGRlZiBkb2NzX3RvX3dyaXRlCisgICAgICBkb2N1bWVudHMuc2VsZWN0KCY6d3JpdGU/KQorICAgIGVuZAorCisgICAgIyBHZXQgYWxsIHRoZSBkb2N1bWVudHMKKyAgICAjCisgICAgIyBSZXR1cm5zIGFuIEFycmF5IG9mIGFsbCBEb2N1bWVudHMKKyAgICBkZWYgZG9jdW1lbnRzCisgICAgICBjb2xsZWN0aW9ucy5yZWR1Y2UoU2V0Lm5ldykgZG8gfGRvY3MsIChfLCBjb2xsZWN0aW9uKXwKKyAgICAgICAgZG9jcyArIGNvbGxlY3Rpb24uZG9jcyArIGNvbGxlY3Rpb24uZmlsZXMKKyAgICAgIGVuZC50b19hCisgICAgZW5kCisKKyAgICBkZWYgZWFjaF9zaXRlX2ZpbGUKKyAgICAgICV3KHBhZ2VzIHN0YXRpY19maWxlcyBkb2NzX3RvX3dyaXRlKS5lYWNoIGRvIHx0eXBlfAorICAgICAgICBzZW5kKHR5cGUpLmVhY2ggZG8gfGl0ZW18CisgICAgICAgICAgeWllbGQgaXRlbQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBGcm9udG1hdHRlckRlZmF1bHRzIG9yIGNyZWF0ZXMgYSBuZXcgRnJvbnRtYXR0ZXJEZWZhdWx0cworICAgICMgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICAgICMKKyAgICAjIFJldHVybnMgVGhlIEZyb250bWF0dGVyRGVmYXVsdHMKKyAgICBkZWYgZnJvbnRtYXR0ZXJfZGVmYXVsdHMKKyAgICAgIEBmcm9udG1hdHRlcl9kZWZhdWx0cyB8fD0gRnJvbnRtYXR0ZXJEZWZhdWx0cy5uZXcoc2VsZikKKyAgICBlbmQKKworICAgICMgV2hldGhlciB0byBwZXJmb3JtIGEgZnVsbCByZWJ1aWxkIHdpdGhvdXQgaW5jcmVtZW50YWwgcmVnZW5lcmF0aW9uCisgICAgIworICAgICMgUmV0dXJucyBhIEJvb2xlYW46IHRydWUgZm9yIGEgZnVsbCByZWJ1aWxkLCBmYWxzZSBmb3Igbm9ybWFsIGJ1aWxkCisgICAgZGVmIGluY3JlbWVudGFsPyhvdmVycmlkZSA9IHt9KQorICAgICAgb3ZlcnJpZGVbImluY3JlbWVudGFsIl0gfHwgY29uZmlnWyJpbmNyZW1lbnRhbCJdCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIHB1Ymxpc2hlciBvciBjcmVhdGVzIGEgbmV3IHB1Ymxpc2hlciBpZiBpdCBkb2Vzbid0CisgICAgIyBhbHJlYWR5IGV4aXN0LgorICAgICMKKyAgICAjIFJldHVybnMgVGhlIFB1Ymxpc2hlcgorICAgIGRlZiBwdWJsaXNoZXIKKyAgICAgIEBwdWJsaXNoZXIgfHw9IFB1Ymxpc2hlci5uZXcoc2VsZikKKyAgICBlbmQKKworICAgICMgUHVibGljOiBQcmVmaXggYSBnaXZlbiBwYXRoIHdpdGggdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgIworICAgICMgcGF0aHMgLSAob3B0aW9uYWwpIHBhdGggZWxlbWVudHMgdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSB3aXRoaW4gdGhlCisgICAgIyAgICAgICAgIHNvdXJjZSBkaXJlY3RvcnkKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgcGF0aCB3aGljaCBpcyBwcmVmaXhlZCB3aXRoIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorICAgIGRlZiBpbl9zb3VyY2VfZGlyKCpwYXRocykKKyAgICAgIHBhdGhzLnJlZHVjZShzb3VyY2UpIGRvIHxiYXNlLCBwYXRofAorICAgICAgICBKZWt5bGwuc2FuaXRpemVkX3BhdGgoYmFzZSwgcGF0aCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFByZWZpeCBhIGdpdmVuIHBhdGggd2l0aCB0aGUgdGhlbWUgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIHBhdGhzIC0gKG9wdGlvbmFsKSBwYXRoIGVsZW1lbnRzIHRvIGEgZmlsZSBvciBkaXJlY3Rvcnkgd2l0aGluIHRoZQorICAgICMgICAgICAgICB0aGVtZSBkaXJlY3RvcnkKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgcGF0aCB3aGljaCBpcyBwcmVmaXhlZCB3aXRoIHRoZSB0aGVtZSByb290IGRpcmVjdG9yeS4KKyAgICBkZWYgaW5fdGhlbWVfZGlyKCpwYXRocykKKyAgICAgIHJldHVybiBuaWwgdW5sZXNzIHRoZW1lCisgICAgICBwYXRocy5yZWR1Y2UodGhlbWUucm9vdCkgZG8gfGJhc2UsIHBhdGh8CisgICAgICAgIEpla3lsbC5zYW5pdGl6ZWRfcGF0aChiYXNlLCBwYXRoKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogUHJlZml4IGEgZ2l2ZW4gcGF0aCB3aXRoIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgIworICAgICMgcGF0aHMgLSAob3B0aW9uYWwpIHBhdGggZWxlbWVudHMgdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSB3aXRoaW4gdGhlCisgICAgIyAgICAgICAgIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorICAgICMKKyAgICAjIFJldHVybnMgYSBwYXRoIHdoaWNoIGlzIHByZWZpeGVkIHdpdGggdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICBkZWYgaW5fZGVzdF9kaXIoKnBhdGhzKQorICAgICAgcGF0aHMucmVkdWNlKGRlc3QpIGRvIHxiYXNlLCBwYXRofAorICAgICAgICBKZWt5bGwuc2FuaXRpemVkX3BhdGgoYmFzZSwgcGF0aCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBMaW1pdHMgdGhlIGN1cnJlbnQgcG9zdHM7IHJlbW92ZXMgdGhlIHBvc3RzIHdoaWNoIGV4Y2VlZCB0aGUgbGltaXRfcG9zdHMKKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBwcml2YXRlCisgICAgZGVmIGxpbWl0X3Bvc3RzIQorICAgICAgaWYgbGltaXRfcG9zdHMgPiAwCisgICAgICAgIGxpbWl0ID0gcG9zdHMuZG9jcy5sZW5ndGggPCBsaW1pdF9wb3N0cyA/IHBvc3RzLmRvY3MubGVuZ3RoIDogbGltaXRfcG9zdHMKKyAgICAgICAgc2VsZi5wb3N0cy5kb2NzID0gcG9zdHMuZG9jc1stbGltaXQsIGxpbWl0XQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIENsZWFuZXIgb3IgY3JlYXRlcyBhIG5ldyBDbGVhbmVyIGlmIGl0IGRvZXNuJ3QKKyAgICAjIGFscmVhZHkgZXhpc3QuCisgICAgIworICAgICMgUmV0dXJucyBUaGUgQ2xlYW5lcgorICAgIHByaXZhdGUKKyAgICBkZWYgc2l0ZV9jbGVhbmVyCisgICAgICBAc2l0ZV9jbGVhbmVyIHx8PSBDbGVhbmVyLm5ldyhzZWxmKQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiBjb25maWd1cmVfcGx1Z2lucworICAgICAgc2VsZi5wbHVnaW5fbWFuYWdlciA9IEpla3lsbDo6UGx1Z2luTWFuYWdlci5uZXcoc2VsZikKKyAgICAgIHNlbGYucGx1Z2lucyAgICAgICAgPSBwbHVnaW5fbWFuYWdlci5wbHVnaW5zX3BhdGgKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgY29uZmlndXJlX3RoZW1lCisgICAgICBzZWxmLnRoZW1lID0gbmlsCisgICAgICByZXR1cm4gaWYgY29uZmlnWyJ0aGVtZSJdLm5pbD8KKworICAgICAgc2VsZi50aGVtZSA9CisgICAgICAgIGlmIGNvbmZpZ1sidGhlbWUiXS5pc19hPyhTdHJpbmcpCisgICAgICAgICAgSmVreWxsOjpUaGVtZS5uZXcoY29uZmlnWyJ0aGVtZSJdKQorICAgICAgICBlbHNlCisgICAgICAgICAgSmVreWxsLmxvZ2dlci53YXJuICJUaGVtZToiLCAidmFsdWUgb2YgJ3RoZW1lJyBpbiBjb25maWcgc2hvdWxkIGJlICIgXAorICAgICAgICAgICJTdHJpbmcgdG8gdXNlIGdlbS1iYXNlZCB0aGVtZXMsIGJ1dCBnb3QgI3tjb25maWdbInRoZW1lIl0uY2xhc3N9IgorICAgICAgICAgIG5pbAorICAgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgY29uZmlndXJlX2luY2x1ZGVfcGF0aHMKKyAgICAgIEBpbmNsdWRlc19sb2FkX3BhdGhzID0gQXJyYXkoaW5fc291cmNlX2Rpcihjb25maWdbImluY2x1ZGVzX2RpciJdLnRvX3MpKQorICAgICAgQGluY2x1ZGVzX2xvYWRfcGF0aHMgPDwgdGhlbWUuaW5jbHVkZXNfcGF0aCBpZiB0aGVtZSAmJiB0aGVtZS5pbmNsdWRlc19wYXRoCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIGNvbmZpZ3VyZV9maWxlX3JlYWRfb3B0cworICAgICAgc2VsZi5maWxlX3JlYWRfb3B0cyA9IHt9CisgICAgICBzZWxmLmZpbGVfcmVhZF9vcHRzWzplbmNvZGluZ10gPSBjb25maWdbImVuY29kaW5nIl0gaWYgY29uZmlnWyJlbmNvZGluZyJdCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIHJlbmRlcl9kb2NzKHBheWxvYWQpCisgICAgICBjb2xsZWN0aW9ucy5lYWNoIGRvIHxfLCBjb2xsZWN0aW9ufAorICAgICAgICBjb2xsZWN0aW9uLmRvY3MuZWFjaCBkbyB8ZG9jdW1lbnR8CisgICAgICAgICAgaWYgcmVnZW5lcmF0b3IucmVnZW5lcmF0ZT8oZG9jdW1lbnQpCisgICAgICAgICAgICBkb2N1bWVudC5vdXRwdXQgPSBKZWt5bGw6OlJlbmRlcmVyLm5ldyhzZWxmLCBkb2N1bWVudCwgcGF5bG9hZCkucnVuCisgICAgICAgICAgICBkb2N1bWVudC50cmlnZ2VyX2hvb2tzKDpwb3N0X3JlbmRlcikKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgcmVuZGVyX3BhZ2VzKHBheWxvYWQpCisgICAgICBwYWdlcy5mbGF0dGVuLmVhY2ggZG8gfHBhZ2V8CisgICAgICAgIGlmIHJlZ2VuZXJhdG9yLnJlZ2VuZXJhdGU/KHBhZ2UpCisgICAgICAgICAgcGFnZS5vdXRwdXQgPSBKZWt5bGw6OlJlbmRlcmVyLm5ldyhzZWxmLCBwYWdlLCBwYXlsb2FkKS5ydW4KKyAgICAgICAgICBwYWdlLnRyaWdnZXJfaG9va3MoOnBvc3RfcmVuZGVyKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvc3RhdGljX2ZpbGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9zdGF0aWNfZmlsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGJjZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvc3RhdGljX2ZpbGUucmIKQEAgLTAsMCArMSwxNjAgQEAKK21vZHVsZSBKZWt5bGwKKyAgY2xhc3MgU3RhdGljRmlsZQorICAgIGV4dGVuZCBGb3J3YXJkYWJsZQorCisgICAgYXR0cl9yZWFkZXIgOnJlbGF0aXZlX3BhdGgsIDpleHRuYW1lLCA6bmFtZSwgOmRhdGEKKworICAgIGRlZl9kZWxlZ2F0b3IgOnRvX2xpcXVpZCwgOnRvX2pzb24sIDp0b19qc29uCisKKyAgICBjbGFzcyA8PCBzZWxmCisgICAgICAjIFRoZSBjYWNoZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lcyBbcGF0aF0gLT4gbXRpbWUuCisgICAgICBkZWYgbXRpbWVzCisgICAgICAgIEBtdGltZXMgfHw9IHt9CisgICAgICBlbmQKKworICAgICAgZGVmIHJlc2V0X2NhY2hlCisgICAgICAgIEBtdGltZXMgPSBuaWwKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBJbml0aWFsaXplIGEgbmV3IFN0YXRpY0ZpbGUuCisgICAgIworICAgICMgc2l0ZSAtIFRoZSBTaXRlLgorICAgICMgYmFzZSAtIFRoZSBTdHJpbmcgcGF0aCB0byB0aGUgPHNvdXJjZT4uCisgICAgIyBkaXIgIC0gVGhlIFN0cmluZyBwYXRoIGJldHdlZW4gPHNvdXJjZT4gYW5kIHRoZSBmaWxlLgorICAgICMgbmFtZSAtIFRoZSBTdHJpbmcgZmlsZW5hbWUgb2YgdGhlIGZpbGUuCisgICAgIyBydWJvY29wOiBkaXNhYmxlIFBhcmFtZXRlckxpc3RzCisgICAgZGVmIGluaXRpYWxpemUoc2l0ZSwgYmFzZSwgZGlyLCBuYW1lLCBjb2xsZWN0aW9uID0gbmlsKQorICAgICAgQHNpdGUgPSBzaXRlCisgICAgICBAYmFzZSA9IGJhc2UKKyAgICAgIEBkaXIgID0gZGlyCisgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgIEBjb2xsZWN0aW9uID0gY29sbGVjdGlvbgorICAgICAgQHJlbGF0aXZlX3BhdGggPSBGaWxlLmpvaW4oKltAZGlyLCBAbmFtZV0uY29tcGFjdCkKKyAgICAgIEBleHRuYW1lID0gRmlsZS5leHRuYW1lKEBuYW1lKQorICAgICAgQGRhdGEgPSBAc2l0ZS5mcm9udG1hdHRlcl9kZWZhdWx0cy5hbGwocmVsYXRpdmVfcGF0aCwgdHlwZSkKKyAgICBlbmQKKyAgICAjIHJ1Ym9jb3A6IGVuYWJsZSBQYXJhbWV0ZXJMaXN0cworCisgICAgIyBSZXR1cm5zIHNvdXJjZSBmaWxlIHBhdGguCisgICAgZGVmIHBhdGgKKyAgICAgIEZpbGUuam9pbigqW0BiYXNlLCBAZGlyLCBAbmFtZV0uY29tcGFjdCkKKyAgICBlbmQKKworICAgICMgT2J0YWluIGRlc3RpbmF0aW9uIHBhdGguCisgICAgIworICAgICMgZGVzdCAtIFRoZSBTdHJpbmcgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZGlyLgorICAgICMKKyAgICAjIFJldHVybnMgZGVzdGluYXRpb24gZmlsZSBwYXRoLgorICAgIGRlZiBkZXN0aW5hdGlvbihkZXN0KQorICAgICAgQHNpdGUuaW5fZGVzdF9kaXIoKltkZXN0LCBkZXN0aW5hdGlvbl9yZWxfZGlyLCBAbmFtZV0uY29tcGFjdCkKKyAgICBlbmQKKworICAgIGRlZiBkZXN0aW5hdGlvbl9yZWxfZGlyCisgICAgICBpZiBAY29sbGVjdGlvbgorICAgICAgICBGaWxlLmRpcm5hbWUodXJsKQorICAgICAgZWxzZQorICAgICAgICBAZGlyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBtb2RpZmllZF90aW1lCisgICAgICBAbW9kaWZpZWRfdGltZSB8fD0gRmlsZS5zdGF0KHBhdGgpLm10aW1lCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgbGFzdCBtb2RpZmljYXRpb24gdGltZSBmb3IgdGhpcyBmaWxlLgorICAgIGRlZiBtdGltZQorICAgICAgbW9kaWZpZWRfdGltZS50b19pCisgICAgZW5kCisKKyAgICAjIElzIHNvdXJjZSBwYXRoIG1vZGlmaWVkPworICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiBtb2RpZmllZCBzaW5jZSBsYXN0IHdyaXRlLgorICAgIGRlZiBtb2RpZmllZD8KKyAgICAgIHNlbGYuY2xhc3MubXRpbWVzW3BhdGhdICE9IG10aW1lCisgICAgZW5kCisKKyAgICAjIFdoZXRoZXIgdG8gd3JpdGUgdGhlIGZpbGUgdG8gdGhlIGZpbGVzeXN0ZW0KKyAgICAjCisgICAgIyBSZXR1cm5zIHRydWUgdW5sZXNzIHRoZSBkZWZhdWx0cyBmb3IgdGhlIGRlc3RpbmF0aW9uIHBhdGggZnJvbQorICAgICMgX2NvbmZpZy55bWwgY29udGFpbiBgcHVibGlzaGVkOiBmYWxzZWAuCisgICAgZGVmIHdyaXRlPworICAgICAgZGVmYXVsdHMuZmV0Y2goInB1Ymxpc2hlZCIsIHRydWUpCisgICAgZW5kCisKKyAgICAjIFdyaXRlIHRoZSBzdGF0aWMgZmlsZSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IChpZiBtb2RpZmllZCkuCisgICAgIworICAgICMgZGVzdCAtIFRoZSBTdHJpbmcgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZGlyLgorICAgICMKKyAgICAjIFJldHVybnMgZmFsc2UgaWYgdGhlIGZpbGUgd2FzIG5vdCBtb2RpZmllZCBzaW5jZSBsYXN0IHRpbWUgKG5vLW9wKS4KKyAgICBkZWYgd3JpdGUoZGVzdCkKKyAgICAgIGRlc3RfcGF0aCA9IGRlc3RpbmF0aW9uKGRlc3QpCisKKyAgICAgIHJldHVybiBmYWxzZSBpZiBGaWxlLmV4aXN0PyhkZXN0X3BhdGgpICYmICFtb2RpZmllZD8KKyAgICAgIHNlbGYuY2xhc3MubXRpbWVzW3BhdGhdID0gbXRpbWUKKworICAgICAgRmlsZVV0aWxzLm1rZGlyX3AoRmlsZS5kaXJuYW1lKGRlc3RfcGF0aCkpCisgICAgICBGaWxlVXRpbHMucm0oZGVzdF9wYXRoKSBpZiBGaWxlLmV4aXN0PyhkZXN0X3BhdGgpCisgICAgICBjb3B5X2ZpbGUoZGVzdF9wYXRoKQorCisgICAgICB0cnVlCisgICAgZW5kCisKKyAgICBkZWYgdG9fbGlxdWlkCisgICAgICBAdG9fbGlxdWlkIHx8PSBEcm9wczo6U3RhdGljRmlsZURyb3AubmV3KHNlbGYpCisgICAgZW5kCisKKyAgICBkZWYgYmFzZW5hbWUKKyAgICAgIEZpbGUuYmFzZW5hbWUobmFtZSwgZXh0bmFtZSkKKyAgICBlbmQKKworICAgIGRlZiBwbGFjZWhvbGRlcnMKKyAgICAgIHsKKyAgICAgICAgOmNvbGxlY3Rpb24gPT4gQGNvbGxlY3Rpb24ubGFiZWwsCisgICAgICAgIDpwYXRoICAgICAgID0+IHJlbGF0aXZlX3BhdGhbCisgICAgICAgICAgQGNvbGxlY3Rpb24ucmVsYXRpdmVfZGlyZWN0b3J5LnNpemUuLnJlbGF0aXZlX3BhdGguc2l6ZV0sCisgICAgICAgIDpvdXRwdXRfZXh0ID0+ICIiLAorICAgICAgICA6bmFtZSAgICAgICA9PiAiIiwKKyAgICAgICAgOnRpdGxlICAgICAgPT4gIiIsCisgICAgICB9CisgICAgZW5kCisKKyAgICAjIEFwcGxpZXMgYSBzaW1pbGFyIFVSTC1idWlsZGluZyB0ZWNobmlxdWUgYXMgSmVreWxsOjpEb2N1bWVudCB0aGF0IHRha2VzCisgICAgIyB0aGUgY29sbGVjdGlvbidzIFVSTCB0ZW1wbGF0ZSBpbnRvIGFjY291bnQuIFRoZSBkZWZhdWx0IFVSTCB0ZW1wbGF0ZSBjYW4KKyAgICAjIGJlIG92ZXJyaWRlbiBpbiB0aGUgY29sbGVjdGlvbidzIGNvbmZpZ3VyYXRpb24gaW4gX2NvbmZpZy55bWwuCisgICAgZGVmIHVybAorICAgICAgQHVybCB8fD0gaWYgQGNvbGxlY3Rpb24ubmlsPworICAgICAgICAgICAgICAgICByZWxhdGl2ZV9wYXRoCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIDo6SmVreWxsOjpVUkwubmV3KHsKKyAgICAgICAgICAgICAgICAgICA6dGVtcGxhdGUgICAgID0+IEBjb2xsZWN0aW9uLnVybF90ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICA6cGxhY2Vob2xkZXJzID0+IHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgIGVuZC50b19zLmdzdWIoJXIhLyQhLCAiIikKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiBpZiBwcmVzZW50LCBuaWwgb3RoZXJ3aXNlLgorICAgIGRlZiB0eXBlCisgICAgICBAdHlwZSB8fD0gQGNvbGxlY3Rpb24ubmlsPyA/IG5pbCA6IEBjb2xsZWN0aW9uLmxhYmVsLnRvX3N5bQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBmcm9udCBtYXR0ZXIgZGVmYXVsdHMgZGVmaW5lZCBmb3IgdGhlIGZpbGUncyBVUkwgYW5kL29yIHR5cGUKKyAgICAjIGFzIGRlZmluZWQgaW4gX2NvbmZpZy55bWwuCisgICAgZGVmIGRlZmF1bHRzCisgICAgICBAZGVmYXVsdHMgfHw9IEBzaXRlLmZyb250bWF0dGVyX2RlZmF1bHRzLmFsbCB1cmwsIHR5cGUKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgY29weV9maWxlKGRlc3RfcGF0aCkKKyAgICAgIGlmIEBzaXRlLnNhZmUgfHwgSmVreWxsLmVudiA9PSAicHJvZHVjdGlvbiIKKyAgICAgICAgRmlsZVV0aWxzLmNwKHBhdGgsIGRlc3RfcGF0aCkKKyAgICAgIGVsc2UKKyAgICAgICAgRmlsZVV0aWxzLmNvcHlfZW50cnkocGF0aCwgZGVzdF9wYXRoKQorICAgICAgZW5kCisKKyAgICAgIHVubGVzcyBGaWxlLnN5bWxpbms/KGRlc3RfcGF0aCkKKyAgICAgICAgRmlsZS51dGltZShzZWxmLmNsYXNzLm10aW1lc1twYXRoXSwgc2VsZi5jbGFzcy5tdGltZXNbcGF0aF0sIGRlc3RfcGF0aCkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvc3RldmVuc29uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvc3RldmVuc29uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjBiMjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC9zdGV2ZW5zb24ucmIKQEAgLTAsMCArMSw1OSBAQAorbW9kdWxlIEpla3lsbAorICBjbGFzcyBTdGV2ZW5zb24gPCA6OkxvZ2dlcgorICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAcHJvZ25hbWUgPSBuaWwKKyAgICAgIEBsZXZlbCA9IERFQlVHCisgICAgICBAZGVmYXVsdF9mb3JtYXR0ZXIgPSBGb3JtYXR0ZXIubmV3CisgICAgICBAbG9nZGV2ID0gJHN0ZG91dAorICAgICAgQGZvcm1hdHRlciA9IHByb2MgZG8gfF8sIF8sIF8sIG1zZ3wKKyAgICAgICAgbXNnLnRvX3MKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGFkZChzZXZlcml0eSwgbWVzc2FnZSA9IG5pbCwgcHJvZ25hbWUgPSBuaWwpCisgICAgICBzZXZlcml0eSB8fD0gVU5LTk9XTgorICAgICAgQGxvZ2RldiA9IGxvZ2RldmljZShzZXZlcml0eSkKKworICAgICAgaWYgQGxvZ2Rldi5uaWw/IHx8IHNldmVyaXR5IDwgQGxldmVsCisgICAgICAgIHJldHVybiB0cnVlCisgICAgICBlbmQKKyAgICAgIHByb2duYW1lIHx8PSBAcHJvZ25hbWUKKyAgICAgIGlmIG1lc3NhZ2UubmlsPworICAgICAgICBpZiBibG9ja19naXZlbj8KKyAgICAgICAgICBtZXNzYWdlID0geWllbGQKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1lc3NhZ2UgPSBwcm9nbmFtZQorICAgICAgICAgIHByb2duYW1lID0gQHByb2duYW1lCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBAbG9nZGV2LnB1dHMoCisgICAgICAgIGZvcm1hdF9tZXNzYWdlKGZvcm1hdF9zZXZlcml0eShzZXZlcml0eSksIFRpbWUubm93LCBwcm9nbmFtZSwgbWVzc2FnZSkKKyAgICAgICkKKyAgICAgIHRydWUKKyAgICBlbmQKKworICAgICMgTG9nIGEgK1dBUk4rIG1lc3NhZ2UKKyAgICBkZWYgd2Fybihwcm9nbmFtZSA9IG5pbCwgJmJsb2NrKQorICAgICAgYWRkKFdBUk4sIG5pbCwgcHJvZ25hbWUueWVsbG93LCAmYmxvY2spCisgICAgZW5kCisKKyAgICAjIExvZyBhbiArRVJST1IrIG1lc3NhZ2UKKyAgICBkZWYgZXJyb3IocHJvZ25hbWUgPSBuaWwsICZibG9jaykKKyAgICAgIGFkZChFUlJPUiwgbmlsLCBwcm9nbmFtZS5yZWQsICZibG9jaykKKyAgICBlbmQKKworICAgIGRlZiBjbG9zZQorICAgICAgIyBObyBMb2dEZXZpY2UgaW4gdXNlCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgbG9nZGV2aWNlKHNldmVyaXR5KQorICAgICAgaWYgc2V2ZXJpdHkgPiBJTkZPCisgICAgICAgICRzdGRlcnIKKyAgICAgIGVsc2UKKyAgICAgICAgJHN0ZG91dAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC90YWdzL2hpZ2hsaWdodC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3RhZ3MvaGlnaGxpZ2h0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjkxNzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC90YWdzL2hpZ2hsaWdodC5yYgpAQCAtMCwwICsxLDEzNyBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgVGFncworICAgIGNsYXNzIEhpZ2hsaWdodEJsb2NrIDwgTGlxdWlkOjpCbG9jaworICAgICAgaW5jbHVkZSBMaXF1aWQ6OlN0YW5kYXJkRmlsdGVycworCisgICAgICAjIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3ludGF4IGNoZWNrZXIuIFN0YXJ0IHdpdGggdGhlIGxhbmd1YWdlIHNwZWNpZmllci4KKyAgICAgICMgRm9sbG93IHRoYXQgYnkgemVybyBvciBtb3JlIHNwYWNlIHNlcGFyYXRlZCBvcHRpb25zIHRoYXQgdGFrZSBvbmUgb2YgdGhyZWUKKyAgICAgICMgZm9ybXM6IG5hbWUsIG5hbWU9dmFsdWUsIG9yIG5hbWU9IjxxdW90ZWQgbGlzdD4iCisgICAgICAjCisgICAgICAjIDxxdW90ZWQgbGlzdD4gaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBudW1iZXJzCisgICAgICBTWU5UQVggPSAlciFeKFthLXpBLVowLTkuKyNfLV0rKSgoXHMrXHcrKD0oXHcrfCIoWzAtOV0rXHMpKlswLTldKyIpKT8pKikkIQorCisgICAgICBkZWYgaW5pdGlhbGl6ZSh0YWdfbmFtZSwgbWFya3VwLCB0b2tlbnMpCisgICAgICAgIHN1cGVyCisgICAgICAgIGlmIG1hcmt1cC5zdHJpcCA9fiBTWU5UQVgKKyAgICAgICAgICBAbGFuZyA9IFJlZ2V4cC5sYXN0X21hdGNoKDEpLmRvd25jYXNlCisgICAgICAgICAgQGhpZ2hsaWdodF9vcHRpb25zID0gcGFyc2Vfb3B0aW9ucyhSZWdleHAubGFzdF9tYXRjaCgyKSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCA8PC1lb3MKK1N5bnRheCBFcnJvciBpbiB0YWcgJ2hpZ2hsaWdodCcgd2hpbGUgcGFyc2luZyB0aGUgZm9sbG93aW5nIG1hcmt1cDoKKworICAje21hcmt1cH0KKworVmFsaWQgc3ludGF4OiBoaWdobGlnaHQgPGxhbmc+IFtsaW5lbm9zXQorZW9zCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXIoY29udGV4dCkKKyAgICAgICAgcHJlZml4ID0gY29udGV4dFsiaGlnaGxpZ2h0ZXJfcHJlZml4Il0gfHwgIiIKKyAgICAgICAgc3VmZml4ID0gY29udGV4dFsiaGlnaGxpZ2h0ZXJfc3VmZml4Il0gfHwgIiIKKyAgICAgICAgY29kZSA9IHN1cGVyLnRvX3MuZ3N1YiglciFcQShcbnxccikrfChcbnxccikrXHohLCAiIikKKworICAgICAgICBpc19zYWZlID0gISFjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV0uc2FmZQorCisgICAgICAgIG91dHB1dCA9CisgICAgICAgICAgY2FzZSBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV0uaGlnaGxpZ2h0ZXIKKyAgICAgICAgICB3aGVuICJweWdtZW50cyIKKyAgICAgICAgICAgIHJlbmRlcl9weWdtZW50cyhjb2RlLCBpc19zYWZlKQorICAgICAgICAgIHdoZW4gInJvdWdlIgorICAgICAgICAgICAgcmVuZGVyX3JvdWdlKGNvZGUpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVuZGVyX2NvZGVoaWdobGlnaHRlcihjb2RlKQorICAgICAgICAgIGVuZAorCisgICAgICAgIHJlbmRlcmVkX291dHB1dCA9IGFkZF9jb2RlX3RhZyhvdXRwdXQpCisgICAgICAgIHByZWZpeCArIHJlbmRlcmVkX291dHB1dCArIHN1ZmZpeAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzYW5pdGl6ZWRfb3B0cyhvcHRzLCBpc19zYWZlKQorICAgICAgICBpZiBpc19zYWZlCisgICAgICAgICAgSGFzaFtbCisgICAgICAgICAgICBbOnN0YXJ0aW5saW5lLCBvcHRzLmZldGNoKDpzdGFydGlubGluZSwgbmlsKV0sCisgICAgICAgICAgICBbOmhsX2xpbmVzLCAgICBvcHRzLmZldGNoKDpobF9saW5lcywgbmlsKV0sCisgICAgICAgICAgICBbOmxpbmVub3MsICAgICBvcHRzLmZldGNoKDpsaW5lbm9zLCBuaWwpXSwKKyAgICAgICAgICAgIFs6ZW5jb2RpbmcsICAgIG9wdHMuZmV0Y2goOmVuY29kaW5nLCAidXRmLTgiKV0sCisgICAgICAgICAgICBbOmNzc2NsYXNzLCAgICBvcHRzLmZldGNoKDpjc3NjbGFzcywgbmlsKV0sCisgICAgICAgICAgXS5yZWplY3QgeyB8ZnwgZi5sYXN0Lm5pbD8gfV0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG9wdHMKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBkZWYgcGFyc2Vfb3B0aW9ucyhpbnB1dCkKKyAgICAgICAgb3B0aW9ucyA9IHt9CisgICAgICAgIHVubGVzcyBpbnB1dC5lbXB0eT8KKyAgICAgICAgICAjIFNwbGl0IGFsb25nIDMgcG9zc2libGUgZm9ybXMgLS0ga2V5PSI8cXVvdGVkIGxpc3Q+Iiwga2V5PXZhbHVlLCBvciBrZXkKKyAgICAgICAgICBpbnB1dC5zY2FuKCVyISg/Olx3PSJbXiJdKiJ8XHc9XHd8XHcpKyEpIGRvIHxvcHR8CisgICAgICAgICAgICBrZXksIHZhbHVlID0gb3B0LnNwbGl0KCI9IikKKyAgICAgICAgICAgICMgSWYgYSBxdW90ZWQgbGlzdCwgY29udmVydCB0byBhcnJheQorICAgICAgICAgICAgaWYgdmFsdWUgJiYgdmFsdWUuaW5jbHVkZT8oIlwiIikKKyAgICAgICAgICAgICAgdmFsdWUuZGVsZXRlISgnIicpCisgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgb3B0aW9uc1trZXkudG9fc3ltXSA9IHZhbHVlIHx8IHRydWUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIGlmIG9wdGlvbnMua2V5Pyg6bGluZW5vcykgJiYgb3B0aW9uc1s6bGluZW5vc10gPT0gdHJ1ZQorICAgICAgICAgIG9wdGlvbnNbOmxpbmVub3NdID0gImlubGluZSIKKyAgICAgICAgZW5kCisgICAgICAgIG9wdGlvbnMKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX3B5Z21lbnRzKGNvZGUsIGlzX3NhZmUpCisgICAgICAgIEpla3lsbDo6RXh0ZXJuYWwucmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWwoInB5Z21lbnRzIikKKworICAgICAgICBoaWdobGlnaHRlZF9jb2RlID0gUHlnbWVudHMuaGlnaGxpZ2h0KAorICAgICAgICAgIGNvZGUsCisgICAgICAgICAgOmxleGVyICAgPT4gQGxhbmcsCisgICAgICAgICAgOm9wdGlvbnMgPT4gc2FuaXRpemVkX29wdHMoQGhpZ2hsaWdodF9vcHRpb25zLCBpc19zYWZlKQorICAgICAgICApCisKKyAgICAgICAgaWYgaGlnaGxpZ2h0ZWRfY29kZS5uaWw/CisgICAgICAgICAgSmVreWxsLmxvZ2dlci5lcnJvciA8PGVvcworVGhlcmUgd2FzIGFuIGVycm9yIGhpZ2hsaWdodGluZyB5b3VyIGNvZGU6CisKKyN7Y29kZX0KKworV2hpbGUgYXR0ZW1wdGluZyB0byBjb252ZXJ0IHRoZSBhYm92ZSBjb2RlLCBQeWdtZW50cy5yYiByZXR1cm5lZCBhbiB1bmFjY2VwdGFibGUgdmFsdWUuCitUaGlzIGlzIHVzdWFsbHkgYSB0aW1lb3V0IHByb2JsZW0gc29sdmVkIGJ5IHJ1bm5pbmcgYGpla3lsbCBidWlsZGAgYWdhaW4uCitlb3MKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiUHlnbWVudHMucmIgcmV0dXJuZWQgYW4gdW5hY2NlcHRhYmxlIHZhbHVlICJcCisgICAgICAgICAgIndoZW4gYXR0ZW1wdGluZyB0byBoaWdobGlnaHQgc29tZSBjb2RlLiIKKyAgICAgICAgZW5kCisKKyAgICAgICAgaGlnaGxpZ2h0ZWRfY29kZS5zdWIoJzxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+PHByZT4nLCAiIikuc3ViKCI8L3ByZT48L2Rpdj4iLCAiIikKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX3JvdWdlKGNvZGUpCisgICAgICAgIEpla3lsbDo6RXh0ZXJuYWwucmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWwoInJvdWdlIikKKyAgICAgICAgZm9ybWF0dGVyID0gUm91Z2U6OkZvcm1hdHRlcnM6OkhUTUwubmV3KAorICAgICAgICAgIDpsaW5lX251bWJlcnMgPT4gQGhpZ2hsaWdodF9vcHRpb25zWzpsaW5lbm9zXSwKKyAgICAgICAgICA6d3JhcCAgICAgICAgID0+IGZhbHNlCisgICAgICAgICkKKyAgICAgICAgbGV4ZXIgPSBSb3VnZTo6TGV4ZXIuZmluZF9mYW5jeShAbGFuZywgY29kZSkgfHwgUm91Z2U6OkxleGVyczo6UGxhaW5UZXh0CisgICAgICAgIGZvcm1hdHRlci5mb3JtYXQobGV4ZXIubGV4KGNvZGUpKQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfY29kZWhpZ2hsaWdodGVyKGNvZGUpCisgICAgICAgIGgoY29kZSkuc3RyaXAKKyAgICAgIGVuZAorCisgICAgICBkZWYgYWRkX2NvZGVfdGFnKGNvZGUpCisgICAgICAgIGNvZGVfYXR0cmlidXRlcyA9IFsKKyAgICAgICAgICAiY2xhc3M9XCJsYW5ndWFnZS0je0BsYW5nLnRvX3MudHIoIisiLCAiLSIpfVwiIiwKKyAgICAgICAgICAiZGF0YS1sYW5nPVwiI3tAbGFuZ31cIiIsCisgICAgICAgIF0uam9pbigiICIpCisgICAgICAgICI8ZmlndXJlIGNsYXNzPVwiaGlnaGxpZ2h0XCI+PHByZT48Y29kZSAje2NvZGVfYXR0cmlidXRlc30+IlwKKyAgICAgICAgIiN7Y29kZS5jaG9tcH08L2NvZGU+PC9wcmU+PC9maWd1cmU+IgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCisKK0xpcXVpZDo6VGVtcGxhdGUucmVnaXN0ZXJfdGFnKCJoaWdobGlnaHQiLCBKZWt5bGw6OlRhZ3M6OkhpZ2hsaWdodEJsb2NrKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdGFncy9pbmNsdWRlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdGFncy9pbmNsdWRlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODQzMDQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC90YWdzL2luY2x1ZGUucmIKQEAgLTAsMCArMSwyMDcgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIFRhZ3MKKyAgICBjbGFzcyBJbmNsdWRlVGFnRXJyb3IgPCBTdGFuZGFyZEVycm9yCisgICAgICBhdHRyX2FjY2Vzc29yIDpwYXRoCisKKyAgICAgIGRlZiBpbml0aWFsaXplKG1zZywgcGF0aCkKKyAgICAgICAgc3VwZXIobXNnKQorICAgICAgICBAcGF0aCA9IHBhdGgKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgY2xhc3MgSW5jbHVkZVRhZyA8IExpcXVpZDo6VGFnCisgICAgICBWQUxJRF9TWU5UQVggPSAlciEKKyAgICAgICAgKFtcdy1dKylccyo9XHMqCisgICAgICAgICg/OiIoW14iXFxdKig/OlxcLlteIlxcXSopKikifCcoW14nXFxdKig/OlxcLlteJ1xcXSopKiknfChbXHdcLi1dKykpCisgICAgICAheAorICAgICAgVkFSSUFCTEVfU1lOVEFYID0gJXIhCisgICAgICAgICg/PHZhcmlhYmxlPltee10qKFx7XHtccypbXHdcLVwuXStccyooXHwuKik/XH1cfVteXHN7fV0qKSspCisgICAgICAgICg/PHBhcmFtcz4uKikKKyAgICAgICF4CisKKyAgICAgIGRlZiBpbml0aWFsaXplKHRhZ19uYW1lLCBtYXJrdXAsIHRva2VucykKKyAgICAgICAgc3VwZXIKKyAgICAgICAgbWF0Y2hlZCA9IG1hcmt1cC5zdHJpcC5tYXRjaChWQVJJQUJMRV9TWU5UQVgpCisgICAgICAgIGlmIG1hdGNoZWQKKyAgICAgICAgICBAZmlsZSA9IG1hdGNoZWRbInZhcmlhYmxlIl0uc3RyaXAKKyAgICAgICAgICBAcGFyYW1zID0gbWF0Y2hlZFsicGFyYW1zIl0uc3RyaXAKKyAgICAgICAgZWxzZQorICAgICAgICAgIEBmaWxlLCBAcGFyYW1zID0gbWFya3VwLnN0cmlwLnNwbGl0KCVyIVxzKyEsIDIpCisgICAgICAgIGVuZAorICAgICAgICB2YWxpZGF0ZV9wYXJhbXMgaWYgQHBhcmFtcworICAgICAgICBAdGFnX25hbWUgPSB0YWdfbmFtZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzeW50YXhfZXhhbXBsZQorICAgICAgICAieyUgI3tAdGFnX25hbWV9IGZpbGUuZXh0IHBhcmFtPSd2YWx1ZScgcGFyYW0yPSd2YWx1ZScgJX0iCisgICAgICBlbmQKKworICAgICAgZGVmIHBhcnNlX3BhcmFtcyhjb250ZXh0KQorICAgICAgICBwYXJhbXMgPSB7fQorICAgICAgICBtYXJrdXAgPSBAcGFyYW1zCisKKyAgICAgICAgd2hpbGUgKG1hdGNoID0gVkFMSURfU1lOVEFYLm1hdGNoKG1hcmt1cCkpCisgICAgICAgICAgbWFya3VwID0gbWFya3VwW21hdGNoLmVuZCgwKS4uLTFdCisKKyAgICAgICAgICB2YWx1ZSA9IGlmIG1hdGNoWzJdCisgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdLmdzdWIoJXIhXFwiISwgJyInKQorICAgICAgICAgICAgICAgICAgZWxzaWYgbWF0Y2hbM10KKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hbM10uZ3N1YiglciFcXCchLCAiJyIpCisgICAgICAgICAgICAgICAgICBlbHNpZiBtYXRjaFs0XQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0W21hdGNoWzRdXQorICAgICAgICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICBwYXJhbXNbbWF0Y2hbMV1dID0gdmFsdWUKKyAgICAgICAgZW5kCisgICAgICAgIHBhcmFtcworICAgICAgZW5kCisKKyAgICAgIGRlZiB2YWxpZGF0ZV9maWxlX25hbWUoZmlsZSkKKyAgICAgICAgaWYgZmlsZSAhfiAlciFeW2EtekEtWjAtOV8vXC4tXSskISB8fCBmaWxlID1+ICVyIVwuLyEgfHwgZmlsZSA9fiAlciEvXC4hCisgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgPDwtZW9zCitJbnZhbGlkIHN5bnRheCBmb3IgaW5jbHVkZSB0YWcuIEZpbGUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIG9yIHNlcXVlbmNlczoKKworICAje2ZpbGV9CisKK1ZhbGlkIHN5bnRheDoKKworICAje3N5bnRheF9leGFtcGxlfQorCitlb3MKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIHZhbGlkYXRlX3BhcmFtcworICAgICAgICBmdWxsX3ZhbGlkX3N5bnRheCA9ICVyIVxBXHMqKD86I3tWQUxJRF9TWU5UQVh9KD89XHN8XHopXHMqKSpceiEKKyAgICAgICAgdW5sZXNzIEBwYXJhbXMgPX4gZnVsbF92YWxpZF9zeW50YXgKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCA8PC1lb3MKK0ludmFsaWQgc3ludGF4IGZvciBpbmNsdWRlIHRhZzoKKworICAje0BwYXJhbXN9CisKK1ZhbGlkIHN5bnRheDoKKworICAje3N5bnRheF9leGFtcGxlfQorCitlb3MKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBHcmFiIGZpbGUgcmVhZCBvcHRzIGluIHRoZSBjb250ZXh0CisgICAgICBkZWYgZmlsZV9yZWFkX29wdHMoY29udGV4dCkKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcnNbOnNpdGVdLmZpbGVfcmVhZF9vcHRzCisgICAgICBlbmQKKworICAgICAgIyBSZW5kZXIgdGhlIHZhcmlhYmxlIGlmIHJlcXVpcmVkCisgICAgICBkZWYgcmVuZGVyX3ZhcmlhYmxlKGNvbnRleHQpCisgICAgICAgIGlmIEBmaWxlLm1hdGNoKFZBUklBQkxFX1NZTlRBWCkKKyAgICAgICAgICBwYXJ0aWFsID0gY29udGV4dC5yZWdpc3RlcnNbOnNpdGVdCisgICAgICAgICAgICAubGlxdWlkX3JlbmRlcmVyCisgICAgICAgICAgICAuZmlsZSgiKHZhcmlhYmxlKSIpCisgICAgICAgICAgICAucGFyc2UoQGZpbGUpCisgICAgICAgICAgcGFydGlhbC5yZW5kZXIhKGNvbnRleHQpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiB0YWdfaW5jbHVkZXNfZGlycyhjb250ZXh0KQorICAgICAgICBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV0uaW5jbHVkZXNfbG9hZF9wYXRocy5mcmVlemUKKyAgICAgIGVuZAorCisgICAgICBkZWYgbG9jYXRlX2luY2x1ZGVfZmlsZShjb250ZXh0LCBmaWxlLCBzYWZlKQorICAgICAgICBpbmNsdWRlc19kaXJzID0gdGFnX2luY2x1ZGVzX2RpcnMoY29udGV4dCkKKyAgICAgICAgaW5jbHVkZXNfZGlycy5lYWNoIGRvIHxkaXJ8CisgICAgICAgICAgcGF0aCA9IEZpbGUuam9pbihkaXIudG9fcywgZmlsZS50b19zKQorICAgICAgICAgIHJldHVybiBwYXRoIGlmIHZhbGlkX2luY2x1ZGVfZmlsZT8ocGF0aCwgZGlyLnRvX3MsIHNhZmUpCisgICAgICAgIGVuZAorICAgICAgICByYWlzZSBJT0Vycm9yLCAiQ291bGQgbm90IGxvY2F0ZSB0aGUgaW5jbHVkZWQgZmlsZSAnI3tmaWxlfScgaW4gYW55IG9mICJcCisgICAgICAgICAgIiN7aW5jbHVkZXNfZGlyc30uIEVuc3VyZSBpdCBleGlzdHMgaW4gb25lIG9mIHRob3NlIGRpcmVjdG9yaWVzIGFuZCwgIlwKKyAgICAgICAgICAiaWYgaXQgaXMgYSBzeW1saW5rLCBkb2VzIG5vdCBwb2ludCBvdXRzaWRlIHlvdXIgc2l0ZSBzb3VyY2UuIgorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXIoY29udGV4dCkKKyAgICAgICAgc2l0ZSA9IGNvbnRleHQucmVnaXN0ZXJzWzpzaXRlXQorCisgICAgICAgIGZpbGUgPSByZW5kZXJfdmFyaWFibGUoY29udGV4dCkgfHwgQGZpbGUKKyAgICAgICAgdmFsaWRhdGVfZmlsZV9uYW1lKGZpbGUpCisKKyAgICAgICAgcGF0aCA9IGxvY2F0ZV9pbmNsdWRlX2ZpbGUoY29udGV4dCwgZmlsZSwgc2l0ZS5zYWZlKQorICAgICAgICByZXR1cm4gdW5sZXNzIHBhdGgKKworICAgICAgICBhZGRfaW5jbHVkZV90b19kZXBlbmRlbmN5KHNpdGUsIHBhdGgsIGNvbnRleHQpCisKKyAgICAgICAgcGFydGlhbCA9IGxvYWRfY2FjaGVkX3BhcnRpYWwocGF0aCwgY29udGV4dCkKKworICAgICAgICBjb250ZXh0LnN0YWNrIGRvCisgICAgICAgICAgY29udGV4dFsiaW5jbHVkZSJdID0gcGFyc2VfcGFyYW1zKGNvbnRleHQpIGlmIEBwYXJhbXMKKyAgICAgICAgICBwYXJ0aWFsLnJlbmRlciEoY29udGV4dCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGFkZF9pbmNsdWRlX3RvX2RlcGVuZGVuY3koc2l0ZSwgcGF0aCwgY29udGV4dCkKKyAgICAgICAgaWYgY29udGV4dC5yZWdpc3RlcnNbOnBhZ2VdICYmIGNvbnRleHQucmVnaXN0ZXJzWzpwYWdlXS5rZXk/KCJwYXRoIikKKyAgICAgICAgICBzaXRlLnJlZ2VuZXJhdG9yLmFkZF9kZXBlbmRlbmN5KAorICAgICAgICAgICAgc2l0ZS5pbl9zb3VyY2VfZGlyKGNvbnRleHQucmVnaXN0ZXJzWzpwYWdlXVsicGF0aCJdKSwKKyAgICAgICAgICAgIHBhdGgKKyAgICAgICAgICApCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBsb2FkX2NhY2hlZF9wYXJ0aWFsKHBhdGgsIGNvbnRleHQpCisgICAgICAgIGNvbnRleHQucmVnaXN0ZXJzWzpjYWNoZWRfcGFydGlhbHNdIHx8PSB7fQorICAgICAgICBjYWNoZWRfcGFydGlhbCA9IGNvbnRleHQucmVnaXN0ZXJzWzpjYWNoZWRfcGFydGlhbHNdCisKKyAgICAgICAgaWYgY2FjaGVkX3BhcnRpYWwua2V5PyhwYXRoKQorICAgICAgICAgIGNhY2hlZF9wYXJ0aWFsW3BhdGhdCisgICAgICAgIGVsc2UKKyAgICAgICAgICB1bnBhcnNlZF9maWxlID0gY29udGV4dC5yZWdpc3RlcnNbOnNpdGVdCisgICAgICAgICAgICAubGlxdWlkX3JlbmRlcmVyCisgICAgICAgICAgICAuZmlsZShwYXRoKQorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBjYWNoZWRfcGFydGlhbFtwYXRoXSA9IHVucGFyc2VkX2ZpbGUucGFyc2UocmVhZF9maWxlKHBhdGgsIGNvbnRleHQpKQorICAgICAgICAgIHJlc2N1ZSBMaXF1aWQ6OlN5bnRheEVycm9yID0+IGV4CisgICAgICAgICAgICByYWlzZSBJbmNsdWRlVGFnRXJyb3IubmV3KGV4Lm1lc3NhZ2UsIHBhdGgpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiB2YWxpZF9pbmNsdWRlX2ZpbGU/KHBhdGgsIGRpciwgc2FmZSkKKyAgICAgICAgIW91dHNpZGVfc2l0ZV9zb3VyY2U/KHBhdGgsIGRpciwgc2FmZSkgJiYgRmlsZS5maWxlPyhwYXRoKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBvdXRzaWRlX3NpdGVfc291cmNlPyhwYXRoLCBkaXIsIHNhZmUpCisgICAgICAgIHNhZmUgJiYgIXJlYWxwYXRoX3ByZWZpeGVkX3dpdGg/KHBhdGgsIGRpcikKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVhbHBhdGhfcHJlZml4ZWRfd2l0aD8ocGF0aCwgZGlyKQorICAgICAgICBGaWxlLmV4aXN0PyhwYXRoKSAmJiBGaWxlLnJlYWxwYXRoKHBhdGgpLnN0YXJ0X3dpdGg/KGRpcikKKyAgICAgIHJlc2N1ZQorICAgICAgICBmYWxzZQorICAgICAgZW5kCisKKyAgICAgICMgVGhpcyBtZXRob2QgYWxsb3dzIHRvIG1vZGlmeSB0aGUgZmlsZSBjb250ZW50IGJ5IGluaGVyaXRpbmcgZnJvbSB0aGUgY2xhc3MuCisgICAgICBkZWYgcmVhZF9maWxlKGZpbGUsIGNvbnRleHQpCisgICAgICAgIEZpbGUucmVhZChmaWxlLCBmaWxlX3JlYWRfb3B0cyhjb250ZXh0KSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgY2xhc3MgSW5jbHVkZVJlbGF0aXZlVGFnIDwgSW5jbHVkZVRhZworICAgICAgZGVmIHRhZ19pbmNsdWRlc19kaXJzKGNvbnRleHQpCisgICAgICAgIEFycmF5KHBhZ2VfcGF0aChjb250ZXh0KSkuZnJlZXplCisgICAgICBlbmQKKworICAgICAgZGVmIHBhZ2VfcGF0aChjb250ZXh0KQorICAgICAgICBpZiBjb250ZXh0LnJlZ2lzdGVyc1s6cGFnZV0ubmlsPworICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJzWzpzaXRlXS5zb3VyY2UKKyAgICAgICAgZWxzZQorICAgICAgICAgIGN1cnJlbnRfZG9jX2RpciA9IEZpbGUuZGlybmFtZShjb250ZXh0LnJlZ2lzdGVyc1s6cGFnZV1bInBhdGgiXSkKKyAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV0uaW5fc291cmNlX2RpciBjdXJyZW50X2RvY19kaXIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKworTGlxdWlkOjpUZW1wbGF0ZS5yZWdpc3Rlcl90YWcoImluY2x1ZGUiLCBKZWt5bGw6OlRhZ3M6OkluY2x1ZGVUYWcpCitMaXF1aWQ6OlRlbXBsYXRlLnJlZ2lzdGVyX3RhZygiaW5jbHVkZV9yZWxhdGl2ZSIsIEpla3lsbDo6VGFnczo6SW5jbHVkZVJlbGF0aXZlVGFnKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdGFncy9saW5rLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdGFncy9saW5rLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzZjNDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC90YWdzL2xpbmsucmIKQEAgLTAsMCArMSwzNSBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgVGFncworICAgIGNsYXNzIExpbmsgPCBMaXF1aWQ6OlRhZworICAgICAgY2xhc3MgPDwgc2VsZgorICAgICAgICBkZWYgdGFnX25hbWUKKyAgICAgICAgICBzZWxmLm5hbWUuc3BsaXQoIjo6IikubGFzdC5kb3duY2FzZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgaW5pdGlhbGl6ZSh0YWdfbmFtZSwgcmVsYXRpdmVfcGF0aCwgdG9rZW5zKQorICAgICAgICBzdXBlcgorCisgICAgICAgIEByZWxhdGl2ZV9wYXRoID0gcmVsYXRpdmVfcGF0aC5zdHJpcAorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXIoY29udGV4dCkKKyAgICAgICAgc2l0ZSA9IGNvbnRleHQucmVnaXN0ZXJzWzpzaXRlXQorCisgICAgICAgIHNpdGUuZWFjaF9zaXRlX2ZpbGUgZG8gfGl0ZW18CisgICAgICAgICAgcmV0dXJuIGl0ZW0udXJsIGlmIGl0ZW0ucmVsYXRpdmVfcGF0aCA9PSBAcmVsYXRpdmVfcGF0aAorICAgICAgICAgICMgVGhpcyB0YWtlcyBjYXJlIG9mIHRoZSBjYXNlIGZvciBzdGF0aWMgZmlsZXMgdGhhdCBoYXZlIGEgbGVhZGluZyAvCisgICAgICAgICAgcmV0dXJuIGl0ZW0udXJsIGlmIGl0ZW0ucmVsYXRpdmVfcGF0aCA9PSAiLyN7QHJlbGF0aXZlX3BhdGh9IgorICAgICAgICBlbmQKKworICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCA8PGVvcworQ291bGQgbm90IGZpbmQgZG9jdW1lbnQgJyN7QHJlbGF0aXZlX3BhdGh9JyBpbiB0YWcgJyN7c2VsZi5jbGFzcy50YWdfbmFtZX0nLgorCitNYWtlIHN1cmUgdGhlIGRvY3VtZW50IGV4aXN0cyBhbmQgdGhlIHBhdGggaXMgY29ycmVjdC4KK2VvcworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCisKK0xpcXVpZDo6VGVtcGxhdGUucmVnaXN0ZXJfdGFnKEpla3lsbDo6VGFnczo6TGluay50YWdfbmFtZSwgSmVreWxsOjpUYWdzOjpMaW5rKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdGFncy9wb3N0X3VybC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3RhZ3MvcG9zdF91cmwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlNTJmNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3RhZ3MvcG9zdF91cmwucmIKQEAgLTAsMCArMSwxMDEgQEAKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIFRhZ3MKKyAgICBjbGFzcyBQb3N0Q29tcGFyZXIKKyAgICAgIE1BVENIRVIgPSAlciFeKC4rLykqKFxkKy1cZCstXGQrKS0oLiopJCEKKworICAgICAgYXR0cl9yZWFkZXIgOnBhdGgsIDpkYXRlLCA6c2x1ZywgOm5hbWUKKworICAgICAgZGVmIGluaXRpYWxpemUobmFtZSkKKyAgICAgICAgQG5hbWUgPSBuYW1lCisKKyAgICAgICAgYWxsLCBAcGF0aCwgQGRhdGUsIEBzbHVnID0gKm5hbWUuc3ViKCVyIV4vISwgIiIpLm1hdGNoKE1BVENIRVIpCisgICAgICAgIHVubGVzcyBhbGwKKyAgICAgICAgICByYWlzZSBKZWt5bGw6OkVycm9yczo6SW52YWxpZFBvc3ROYW1lRXJyb3IsCisgICAgICAgICAgICAiJyN7bmFtZX0nIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgZGF0ZSBhbmQvb3IgdGl0bGUuIgorICAgICAgICBlbmQKKworICAgICAgICBlc2NhcGVkX3NsdWcgPSBSZWdleHAuZXNjYXBlKHNsdWcpCisgICAgICAgIEBuYW1lX3JlZ2V4ID0gJXIhXl9wb3N0cy8je3BhdGh9I3tkYXRlfS0je2VzY2FwZWRfc2x1Z31cLlteLl0rfAorICAgICAgICAgIF4je3BhdGh9X3Bvc3RzLz8je2RhdGV9LSN7ZXNjYXBlZF9zbHVnfVwuW14uXSsheAorICAgICAgZW5kCisKKyAgICAgIGRlZiBwb3N0X2RhdGUKKyAgICAgICAgQHBvc3RfZGF0ZSB8fD0gVXRpbHMucGFyc2VfZGF0ZShkYXRlLAorICAgICAgICAgICJcIiN7ZGF0ZX1cIiBkb2VzIG5vdCBjb250YWluIHZhbGlkIGRhdGUgYW5kL29yIHRpdGxlLiIpCisgICAgICBlbmQKKworICAgICAgZGVmID09KG90aGVyKQorICAgICAgICBvdGhlci5yZWxhdGl2ZV9wYXRoLm1hdGNoKEBuYW1lX3JlZ2V4KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBkZXByZWNhdGVkX2VxdWFsaXR5KG90aGVyKQorICAgICAgICBzbHVnID09IHBvc3Rfc2x1ZyhvdGhlcikgJiYKKyAgICAgICAgICBwb3N0X2RhdGUueWVhciAgPT0gb3RoZXIuZGF0ZS55ZWFyICYmCisgICAgICAgICAgcG9zdF9kYXRlLm1vbnRoID09IG90aGVyLmRhdGUubW9udGggJiYKKyAgICAgICAgICBwb3N0X2RhdGUuZGF5ICAgPT0gb3RoZXIuZGF0ZS5kYXkKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisgICAgICAjIENvbnN0cnVjdCB0aGUgZGlyZWN0b3J5LWF3YXJlIHBvc3Qgc2x1ZyBmb3IgYSBKZWt5bGw6OlBvc3QKKyAgICAgICMKKyAgICAgICMgb3RoZXIgLSB0aGUgSmVreWxsOjpQb3N0CisgICAgICAjCisgICAgICAjIFJldHVybnMgdGhlIHBvc3Qgc2x1ZyB3aXRoIHRoZSBzdWJkaXJlY3RvcnkgKHJlbGF0aXZlIHRvIF9wb3N0cykKKyAgICAgIGRlZiBwb3N0X3NsdWcob3RoZXIpCisgICAgICAgIHBhdGggPSBvdGhlci5iYXNlbmFtZS5zcGxpdCgiLyIpWzAuLi4tMV0uam9pbigiLyIpCisgICAgICAgIGlmIHBhdGgubmlsPyB8fCBwYXRoID09ICIiCisgICAgICAgICAgb3RoZXIuZGF0YVsic2x1ZyJdCisgICAgICAgIGVsc2UKKyAgICAgICAgICBwYXRoICsgIi8iICsgb3RoZXIuZGF0YVsic2x1ZyJdCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjbGFzcyBQb3N0VXJsIDwgTGlxdWlkOjpUYWcKKyAgICAgIGRlZiBpbml0aWFsaXplKHRhZ19uYW1lLCBwb3N0LCB0b2tlbnMpCisgICAgICAgIHN1cGVyCisgICAgICAgIEBvcmlnX3Bvc3QgPSBwb3N0LnN0cmlwCisgICAgICAgIGJlZ2luCisgICAgICAgICAgQHBvc3QgPSBQb3N0Q29tcGFyZXIubmV3KEBvcmlnX3Bvc3QpCisgICAgICAgIHJlc2N1ZSA9PiBlCisgICAgICAgICAgcmFpc2UgSmVreWxsOjpFcnJvcnM6OlBvc3RVUkxFcnJvciwgPDwtZW9zCitDb3VsZCBub3QgcGFyc2UgbmFtZSBvZiBwb3N0ICIje0BvcmlnX3Bvc3R9IiBpbiB0YWcgJ3Bvc3RfdXJsJy4KKworTWFrZSBzdXJlIHRoZSBwb3N0IGV4aXN0cyBhbmQgdGhlIG5hbWUgaXMgY29ycmVjdC4KKworI3tlLmNsYXNzfTogI3tlLm1lc3NhZ2V9Citlb3MKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcihjb250ZXh0KQorICAgICAgICBzaXRlID0gY29udGV4dC5yZWdpc3RlcnNbOnNpdGVdCisKKyAgICAgICAgc2l0ZS5wb3N0cy5kb2NzLmVhY2ggZG8gfHB8CisgICAgICAgICAgcmV0dXJuIHAudXJsIGlmIEBwb3N0ID09IHAKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBOZXcgbWF0Y2hpbmcgbWV0aG9kIGRpZCBub3QgbWF0Y2gsIGZhbGwgYmFjayB0byBvbGQgbWV0aG9kCisgICAgICAgICMgd2l0aCBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHRoaXMgbWF0Y2hlcworCisgICAgICAgIHNpdGUucG9zdHMuZG9jcy5lYWNoIGRvIHxwfAorICAgICAgICAgIG5leHQgdW5sZXNzIEBwb3N0LmRlcHJlY2F0ZWRfZXF1YWxpdHkgcAorICAgICAgICAgIEpla3lsbDo6RGVwcmVjYXRvci5kZXByZWNhdGlvbl9tZXNzYWdlICJBIGNhbGwgdG8gIlwKKyAgICAgICAgICAgICIneyUgcG9zdF91cmwgI3tAcG9zdC5uYW1lfSAlfScgZGlkIG5vdCBtYXRjaCAiIFwKKyAgICAgICAgICAgICJhIHBvc3QgdXNpbmcgdGhlIG5ldyBtYXRjaGluZyBtZXRob2Qgb2YgY2hlY2tpbmcgbmFtZSAiIFwKKyAgICAgICAgICAgICIocGF0aC1kYXRlLXNsdWcpIGVxdWFsaXR5LiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91ICIgXAorICAgICAgICAgICAgImNoYW5nZSB0aGlzIHRhZyB0byBtYXRjaCB0aGUgcG9zdCdzIG5hbWUgZXhhY3RseS4iCisgICAgICAgICAgcmV0dXJuIHAudXJsCisgICAgICAgIGVuZAorCisgICAgICAgIHJhaXNlIEpla3lsbDo6RXJyb3JzOjpQb3N0VVJMRXJyb3IsIDw8LWVvcworQ291bGQgbm90IGZpbmQgcG9zdCAiI3tAb3JpZ19wb3N0fSIgaW4gdGFnICdwb3N0X3VybCcuCisKK01ha2Ugc3VyZSB0aGUgcG9zdCBleGlzdHMgYW5kIHRoZSBuYW1lIGlzIGNvcnJlY3QuCitlb3MKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZAorCitMaXF1aWQ6OlRlbXBsYXRlLnJlZ2lzdGVyX3RhZygicG9zdF91cmwiLCBKZWt5bGw6OlRhZ3M6OlBvc3RVcmwpCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC90aGVtZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3RoZW1lLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWM5MWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC90aGVtZS5yYgpAQCAtMCwwICsxLDY2IEBACittb2R1bGUgSmVreWxsCisgIGNsYXNzIFRoZW1lCisgICAgZXh0ZW5kIEZvcndhcmRhYmxlCisgICAgYXR0cl9yZWFkZXIgOm5hbWUKKyAgICBkZWZfZGVsZWdhdG9yIDpnZW1zcGVjLCA6dmVyc2lvbiwgOnZlcnNpb24KKworICAgIGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgICBAbmFtZSA9IG5hbWUuZG93bmNhc2Uuc3RyaXAKKyAgICAgIGNvbmZpZ3VyZV9zYXNzCisgICAgZW5kCisKKyAgICBkZWYgcm9vdAorICAgICAgIyBNdXN0IHVzZSBGaWxlLnJlYWxwYXRoIHRvIHJlc29sdmUgc3ltbGlua3MgY3JlYXRlZCBieSByYmVudgorICAgICAgIyBPdGhlcndpc2UsIEpla3lsbC5zYW5pdGl6ZWQgcGF0aCB3aXRoIHByZXBlbmQgdGhlIHVucmVzb2x2ZWQgcm9vdAorICAgICAgQHJvb3QgfHw9IEZpbGUucmVhbHBhdGgoZ2Vtc3BlYy5mdWxsX2dlbV9wYXRoKQorICAgIHJlc2N1ZSBFcnJubzo6RU5PRU5ULCBFcnJubzo6RUFDQ0VTLCBFcnJubzo6RUxPT1AKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIGluY2x1ZGVzX3BhdGgKKyAgICAgIHBhdGhfZm9yICJfaW5jbHVkZXMiLmZyZWV6ZQorICAgIGVuZAorCisgICAgZGVmIGxheW91dHNfcGF0aAorICAgICAgcGF0aF9mb3IgIl9sYXlvdXRzIi5mcmVlemUKKyAgICBlbmQKKworICAgIGRlZiBzYXNzX3BhdGgKKyAgICAgIHBhdGhfZm9yICJfc2FzcyIuZnJlZXplCisgICAgZW5kCisKKyAgICBkZWYgYXNzZXRzX3BhdGgKKyAgICAgIHBhdGhfZm9yICJhc3NldHMiLmZyZWV6ZQorICAgIGVuZAorCisgICAgZGVmIGNvbmZpZ3VyZV9zYXNzCisgICAgICByZXR1cm4gdW5sZXNzIHNhc3NfcGF0aAorICAgICAgcmVxdWlyZSAic2FzcyIKKyAgICAgIFNhc3MubG9hZF9wYXRocyA8PCBzYXNzX3BhdGgKKyAgICBlbmQKKworICAgIGRlZiBydW50aW1lX2RlcGVuZGVuY2llcworICAgICAgZ2Vtc3BlYy5ydW50aW1lX2RlcGVuZGVuY2llcworICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIHBhdGhfZm9yKGZvbGRlcikKKyAgICAgIHBhdGggPSByZWFscGF0aF9mb3IoZm9sZGVyKQorICAgICAgcGF0aCBpZiBwYXRoICYmIEZpbGUuZGlyZWN0b3J5PyhwYXRoKQorICAgIGVuZAorCisgICAgZGVmIHJlYWxwYXRoX2Zvcihmb2xkZXIpCisgICAgICBGaWxlLnJlYWxwYXRoKEpla3lsbC5zYW5pdGl6ZWRfcGF0aChyb290LCBmb2xkZXIudG9fcykpCisgICAgcmVzY3VlIEVycm5vOjpFTk9FTlQsIEVycm5vOjpFQUNDRVMsIEVycm5vOjpFTE9PUAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgZ2Vtc3BlYworICAgICAgQGdlbXNwZWMgfHw9IEdlbTo6U3BlY2lmaWNhdGlvbi5maW5kX2J5X25hbWUobmFtZSkKKyAgICByZXNjdWUgR2VtOjpMb2FkRXJyb3IKKyAgICAgIHJhaXNlIEpla3lsbDo6RXJyb3JzOjpNaXNzaW5nRGVwZW5kZW5jeUV4Y2VwdGlvbiwKKyAgICAgICAgIlRoZSAje25hbWV9IHRoZW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4iCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC90aGVtZV9idWlsZGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdGhlbWVfYnVpbGRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM5N2UzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdGhlbWVfYnVpbGRlci5yYgpAQCAtMCwwICsxLDExNyBAQAorY2xhc3MgSmVreWxsOjpUaGVtZUJ1aWxkZXIKKyAgU0NBRkZPTERfRElSRUNUT1JJRVMgPSAldygKKyAgICBhc3NldHMgX2xheW91dHMgX2luY2x1ZGVzIF9zYXNzCisgICkuZnJlZXplCisKKyAgYXR0cl9yZWFkZXIgOm5hbWUsIDpwYXRoLCA6Y29kZV9vZl9jb25kdWN0CisKKyAgZGVmIGluaXRpYWxpemUodGhlbWVfbmFtZSwgb3B0cykKKyAgICBAbmFtZSA9IHRoZW1lX25hbWUudG9fcy50cigiICIsICJfIikuZ3N1YiglciFfKyEsICJfIikKKyAgICBAcGF0aCA9IFBhdGhuYW1lLm5ldyhGaWxlLmV4cGFuZF9wYXRoKG5hbWUsIERpci5wd2QpKQorICAgIEBjb2RlX29mX2NvbmR1Y3QgPSAhIW9wdHNbImNvZGVfb2ZfY29uZHVjdCJdCisgIGVuZAorCisgIGRlZiBjcmVhdGUhCisgICAgY3JlYXRlX2RpcmVjdG9yaWVzCisgICAgY3JlYXRlX3N0YXJ0ZXJfZmlsZXMKKyAgICBjcmVhdGVfZ2Vtc3BlYworICAgIGNyZWF0ZV9hY2Nlc3NvcmllcworICAgIGluaXRpYWxpemVfZ2l0X3JlcG8KKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgIGRlZiByb290CisgICAgQHJvb3QgfHw9IFBhdGhuYW1lLm5ldyhGaWxlLmV4cGFuZF9wYXRoKCIuLi8iLCBfX2Rpcl9fKSkKKyAgZW5kCisKKyAgZGVmIHRlbXBsYXRlX2ZpbGUoZmlsZW5hbWUpCisgICAgWworICAgICAgcm9vdC5qb2luKCJ0aGVtZV90ZW1wbGF0ZSIsICIje2ZpbGVuYW1lfS5lcmIiKSwKKyAgICAgIHJvb3Quam9pbigidGhlbWVfdGVtcGxhdGUiLCBmaWxlbmFtZS50b19zKSwKKyAgICBdLmZpbmQoJjpleGlzdD8pCisgIGVuZAorCisgIGRlZiB0ZW1wbGF0ZShmaWxlbmFtZSkKKyAgICBlcmIucmVuZGVyKHRlbXBsYXRlX2ZpbGUoZmlsZW5hbWUpLnJlYWQpCisgIGVuZAorCisgIGRlZiBlcmIKKyAgICBAZXJiIHx8PSBFUkJSZW5kZXJlci5uZXcoc2VsZikKKyAgZW5kCisKKyAgZGVmIG1rZGlyX3AoZGlyZWN0b3JpZXMpCisgICAgQXJyYXkoZGlyZWN0b3JpZXMpLmVhY2ggZG8gfGRpcmVjdG9yeXwKKyAgICAgIGZ1bGxfcGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnkpCisgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gImNyZWF0ZSIsIGZ1bGxfcGF0aC50b19zCisgICAgICBGaWxlVXRpbHMubWtkaXJfcChmdWxsX3BhdGgpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB3cml0ZV9maWxlKGZpbGVuYW1lLCBjb250ZW50cykKKyAgICBmdWxsX3BhdGggPSBwYXRoLmpvaW4oZmlsZW5hbWUpCisgICAgSmVreWxsLmxvZ2dlci5pbmZvICJjcmVhdGUiLCBmdWxsX3BhdGgudG9fcworICAgIEZpbGUud3JpdGUoZnVsbF9wYXRoLCBjb250ZW50cykKKyAgZW5kCisKKyAgZGVmIGNyZWF0ZV9kaXJlY3RvcmllcworICAgIG1rZGlyX3AoU0NBRkZPTERfRElSRUNUT1JJRVMpCisgIGVuZAorCisgIGRlZiBjcmVhdGVfc3RhcnRlcl9maWxlcworICAgICV3KHBhZ2UgcG9zdCBkZWZhdWx0KS5lYWNoIGRvIHxsYXlvdXR8CisgICAgICB3cml0ZV9maWxlKCJfbGF5b3V0cy8je2xheW91dH0uaHRtbCIsIHRlbXBsYXRlKCJfbGF5b3V0cy8je2xheW91dH0uaHRtbCIpKQorICAgIGVuZAorICBlbmQKKworICBkZWYgY3JlYXRlX2dlbXNwZWMKKyAgICB3cml0ZV9maWxlKCJHZW1maWxlIiwgdGVtcGxhdGUoIkdlbWZpbGUiKSkKKyAgICB3cml0ZV9maWxlKCIje25hbWV9LmdlbXNwZWMiLCB0ZW1wbGF0ZSgidGhlbWUuZ2Vtc3BlYyIpKQorICBlbmQKKworICBkZWYgY3JlYXRlX2FjY2Vzc29yaWVzCisgICAgYWNjZXNzb3JpZXMgPSAldyhSRUFETUUubWQgTElDRU5TRS50eHQpCisgICAgYWNjZXNzb3JpZXMgPDwgIkNPREVfT0ZfQ09ORFVDVC5tZCIgaWYgY29kZV9vZl9jb25kdWN0CisgICAgYWNjZXNzb3JpZXMuZWFjaCBkbyB8ZmlsZW5hbWV8CisgICAgICB3cml0ZV9maWxlKGZpbGVuYW1lLCB0ZW1wbGF0ZShmaWxlbmFtZSkpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBpbml0aWFsaXplX2dpdF9yZXBvCisgICAgSmVreWxsLmxvZ2dlci5pbmZvICJpbml0aWFsaXplIiwgcGF0aC5qb2luKCIuZ2l0IikudG9fcworICAgIERpci5jaGRpcihwYXRoLnRvX3MpIHsgYGdpdCBpbml0YCB9CisgICAgd3JpdGVfZmlsZSgiLmdpdGlnbm9yZSIsIHRlbXBsYXRlKCJnaXRpZ25vcmUiKSkKKyAgZW5kCisKKyAgZGVmIHVzZXJfbmFtZQorICAgIEB1c2VyX25hbWUgfHw9IGBnaXQgY29uZmlnIHVzZXIubmFtZWAuY2hvbXAKKyAgZW5kCisKKyAgZGVmIHVzZXJfZW1haWwKKyAgICBAdXNlcl9lbWFpbCB8fD0gYGdpdCBjb25maWcgdXNlci5lbWFpbGAuY2hvbXAKKyAgZW5kCisKKyAgY2xhc3MgRVJCUmVuZGVyZXIKKyAgICBleHRlbmQgRm9yd2FyZGFibGUKKworICAgIGRlZl9kZWxlZ2F0b3IgOkB0aGVtZV9idWlsZGVyLCA6bmFtZSwgOnRoZW1lX25hbWUKKyAgICBkZWZfZGVsZWdhdG9yIDpAdGhlbWVfYnVpbGRlciwgOnVzZXJfbmFtZSwgOnVzZXJfbmFtZQorICAgIGRlZl9kZWxlZ2F0b3IgOkB0aGVtZV9idWlsZGVyLCA6dXNlcl9lbWFpbCwgOnVzZXJfZW1haWwKKworICAgIGRlZiBpbml0aWFsaXplKHRoZW1lX2J1aWxkZXIpCisgICAgICBAdGhlbWVfYnVpbGRlciA9IHRoZW1lX2J1aWxkZXIKKyAgICBlbmQKKworICAgIGRlZiBqZWt5bGxfdmVyc2lvbl93aXRoX21pbm9yCisgICAgICBKZWt5bGw6OlZFUlNJT04uc3BsaXQoIi4iKS50YWtlKDIpLmpvaW4oIi4iKQorICAgIGVuZAorCisgICAgZGVmIHRoZW1lX2RpcmVjdG9yaWVzCisgICAgICBTQ0FGRk9MRF9ESVJFQ1RPUklFUworICAgIGVuZAorCisgICAgZGVmIHJlbmRlcihjb250ZW50cykKKyAgICAgIEVSQi5uZXcoY29udGVudHMpLnJlc3VsdCBiaW5kaW5nCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91cmwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91cmwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMDQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3VybC5yYgpAQCAtMCwwICsxLDE1OSBAQAorcmVxdWlyZSAiYWRkcmVzc2FibGUvdXJpIgorCisjIFB1YmxpYzogTWV0aG9kcyB0aGF0IGdlbmVyYXRlIGEgVVJMIGZvciBhIHJlc291cmNlIHN1Y2ggYXMgYSBQb3N0IG9yIGEgUGFnZS4KKyMKKyMgRXhhbXBsZXMKKyMKKyMgICBVUkwubmV3KHsKKyMgICAgIDp0ZW1wbGF0ZSA9PiAvOmNhdGVnb3JpZXMvOnRpdGxlLmh0bWwiLAorIyAgICAgOnBsYWNlaG9sZGVycyA9PiB7OmNhdGVnb3JpZXMgPT4gInJ1YnkiLCA6dGl0bGUgPT4gInNvbWV0aGluZyJ9CisjICAgfSkudG9fcworIworbW9kdWxlIEpla3lsbAorICBjbGFzcyBVUkwKKyAgICAjIG9wdGlvbnMgLSBPbmUgb2YgOnBlcm1hbGluayBvciA6dGVtcGxhdGUgbXVzdCBiZSBzdXBwbGllZC4KKyAgICAjICAgICAgICAgICA6dGVtcGxhdGUgICAgIC0gVGhlIFN0cmluZyB1c2VkIGFzIHRlbXBsYXRlIGZvciBVUkwgZ2VuZXJhdGlvbiwKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUgIi86cGF0aC86YmFzZW5hbWU6b3V0cHV0X2V4dCIsIHdoZXJlCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcGxhY2Vob2xkZXIgaXMgcHJlZml4ZWQgd2l0aCBhIGNvbG9uLgorICAgICMgICAgICAgICAgIDpwbGFjZWhvbGRlcnMgLSBBIGhhc2ggY29udGFpbmluZyB0aGUgcGxhY2Vob2xkZXJzIHdoaWNoIHdpbGwgYmUKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgd2hlbiB1c2VkIGluc2lkZSB0aGUgdGVtcGxhdGUuIEUuZy4KKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAieWVhciIgPT4gVGltZS5ub3cuc3RyZnRpbWUoIiVZIikgfSB3b3VsZCByZXBsYWNlCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwbGFjZWhvbGRlciAiOnllYXIiIHdpdGggdGhlIGN1cnJlbnQgeWVhci4KKyAgICAjICAgICAgICAgICA6cGVybWFsaW5rICAgIC0gSWYgc3VwcGxpZWQsIG5vIFVSTCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZQorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS4gSW5zdGVhZCwgdGhlIGdpdmVuIHBlcm1hbGluayB3aWxsIGJlCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgVVJMLgorICAgIGRlZiBpbml0aWFsaXplKG9wdGlvbnMpCisgICAgICBAdGVtcGxhdGUgICAgID0gb3B0aW9uc1s6dGVtcGxhdGVdCisgICAgICBAcGxhY2Vob2xkZXJzID0gb3B0aW9uc1s6cGxhY2Vob2xkZXJzXSB8fCB7fQorICAgICAgQHBlcm1hbGluayAgICA9IG9wdGlvbnNbOnBlcm1hbGlua10KKworICAgICAgaWYgKEB0ZW1wbGF0ZSB8fCBAcGVybWFsaW5rKS5uaWw/CisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJPbmUgb2YgOnRlbXBsYXRlIG9yIDpwZXJtYWxpbmsgbXVzdCBiZSBzdXBwbGllZC4iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVGhlIGdlbmVyYXRlZCByZWxhdGl2ZSBVUkwgb2YgdGhlIHJlc291cmNlCisgICAgIworICAgICMgUmV0dXJucyB0aGUgU3RyaW5nIFVSTAorICAgIGRlZiB0b19zCisgICAgICBzYW5pdGl6ZV91cmwoZ2VuZXJhdGVkX3Blcm1hbGluayB8fCBnZW5lcmF0ZWRfdXJsKQorICAgIGVuZAorCisgICAgIyBHZW5lcmF0ZXMgYSBVUkwgZnJvbSB0aGUgcGVybWFsaW5rCisgICAgIworICAgICMgUmV0dXJucyB0aGUgX3Vuc2FuaXRpemVkIFN0cmluZyBVUkwKKyAgICBkZWYgZ2VuZXJhdGVkX3Blcm1hbGluaworICAgICAgKEBnZW5lcmF0ZWRfcGVybWFsaW5rIHx8PSBnZW5lcmF0ZV91cmwoQHBlcm1hbGluaykpIGlmIEBwZXJtYWxpbmsKKyAgICBlbmQKKworICAgICMgR2VuZXJhdGVzIGEgVVJMIGZyb20gdGhlIHRlbXBsYXRlCisgICAgIworICAgICMgUmV0dXJucyB0aGUgdW5zYW5pdGl6ZWQgU3RyaW5nIFVSTAorICAgIGRlZiBnZW5lcmF0ZWRfdXJsCisgICAgICBAZ2VuZXJhdGVkX3VybCB8fD0gZ2VuZXJhdGVfdXJsKEB0ZW1wbGF0ZSkKKyAgICBlbmQKKworICAgICMgSW50ZXJuYWw6IEdlbmVyYXRlIHRoZSBVUkwgYnkgcmVwbGFjaW5nIGFsbCBwbGFjZWhvbGRlcnMgd2l0aCB0aGVpcgorICAgICMgcmVzcGVjdGl2ZSB2YWx1ZXMgaW4gdGhlIGdpdmVuIHRlbXBsYXRlCisgICAgIworICAgICMgUmV0dXJucyB0aGUgdW5zYW5pdGl6ZWQgU3RyaW5nIFVSTAorICAgIGRlZiBnZW5lcmF0ZV91cmwodGVtcGxhdGUpCisgICAgICBpZiBAcGxhY2Vob2xkZXJzLmlzX2E/IERyb3BzOjpVcmxEcm9wCisgICAgICAgIGdlbmVyYXRlX3VybF9mcm9tX2Ryb3AodGVtcGxhdGUpCisgICAgICBlbHNlCisgICAgICAgIGdlbmVyYXRlX3VybF9mcm9tX2hhc2godGVtcGxhdGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBnZW5lcmF0ZV91cmxfZnJvbV9oYXNoKHRlbXBsYXRlKQorICAgICAgQHBsYWNlaG9sZGVycy5pbmplY3QodGVtcGxhdGUpIGRvIHxyZXN1bHQsIHRva2VufAorICAgICAgICBicmVhayByZXN1bHQgaWYgcmVzdWx0LmluZGV4KCI6IikubmlsPworICAgICAgICBpZiB0b2tlbi5sYXN0Lm5pbD8KKyAgICAgICAgICAjIFJlbW92ZSBsZWFkaW5nICIvIiB0byBhdm9pZCBnZW5lcmF0aW5nIHVybHMgd2l0aCBgLy9gCisgICAgICAgICAgcmVzdWx0LmdzdWIoJXIhLzoje3Rva2VuLmZpcnN0fSEsICIiKQorICAgICAgICBlbHNlCisgICAgICAgICAgcmVzdWx0LmdzdWIoJXIhOiN7dG9rZW4uZmlyc3R9ISwgc2VsZi5jbGFzcy5lc2NhcGVfcGF0aCh0b2tlbi5sYXN0KSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgV2UgaW5jbHVkZSB1bmRlcnNjb3JlcyBpbiBrZXlzIHRvIGFsbG93IGZvciAnaV9tb250aCcgYW5kIHNvIGZvcnRoLgorICAgICMgVGhpcyBwb3NlcyBhIHByb2JsZW0gZm9yIGtleXMgd2hpY2ggYXJlIGZvbGxvd2VkIGJ5IGFuIHVuZGVyc2NvcmUKKyAgICAjIGJ1dCB0aGUgdW5kZXJzY29yZSBpcyBub3QgcGFydCBvZiB0aGUga2V5LCBlLmcuICcvOm1vbnRoXzpkYXknLgorICAgICMgVGhhdCBzaG91bGQgYmUgOm1vbnRoIGFuZCA6ZGF5LCBidXQgb3VyIGtleSBleHRyYWN0aW9uIHJlZ2V4cCBpc24ndAorICAgICMgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCBzbyB3ZSBoYXZlIHRvIG1ha2UgaXQgYW4gZXhwbGljaXQKKyAgICAjIHBvc3NpYmlsaXR5LgorICAgIGRlZiBwb3NzaWJsZV9rZXlzKGtleSkKKyAgICAgIGlmIGtleS5lbmRfd2l0aD8oIl8iKQorICAgICAgICBba2V5LCBrZXkuY2hvbXAoIl8iKV0KKyAgICAgIGVsc2UKKyAgICAgICAgW2tleV0KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGdlbmVyYXRlX3VybF9mcm9tX2Ryb3AodGVtcGxhdGUpCisgICAgICB0ZW1wbGF0ZS5nc3ViKCVyITooW2Etel9dKykhKSBkbyB8bWF0Y2h8CisgICAgICAgIHBvb2wgPSBwb3NzaWJsZV9rZXlzKG1hdGNoLnN1YigiOiIuZnJlZXplLCAiIi5mcmVlemUpKQorCisgICAgICAgIHdpbm5lciA9IHBvb2wuZmluZCB7IHxrZXl8IEBwbGFjZWhvbGRlcnMua2V5PyhrZXkpIH0KKyAgICAgICAgaWYgd2lubmVyLm5pbD8KKyAgICAgICAgICByYWlzZSBOb01ldGhvZEVycm9yLAorICAgICAgICAgICAgIlRoZSBVUkwgdGVtcGxhdGUgZG9lc24ndCBoYXZlICN7cG9vbC5qb2luKCIgb3IgIil9IGtleXMuICJcCisgICAgICAgICAgICAgICJDaGVjayB5b3VyIHBlcm1hbGluayB0ZW1wbGF0ZSEiCisgICAgICAgIGVuZAorCisgICAgICAgIHZhbHVlID0gQHBsYWNlaG9sZGVyc1t3aW5uZXJdCisgICAgICAgIHZhbHVlID0gIiIgaWYgdmFsdWUubmlsPworICAgICAgICByZXBsYWNlbWVudCA9IHNlbGYuY2xhc3MuZXNjYXBlX3BhdGgodmFsdWUpCisKKyAgICAgICAgbWF0Y2guc3ViKCI6I3t3aW5uZXJ9IiwgcmVwbGFjZW1lbnQpCisgICAgICBlbmQuZ3N1YiglciEvLyEsICIvIi5mcmVlemUpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYSBzYW5pdGl6ZWQgU3RyaW5nIFVSTCwgc3RyaXBwaW5nICIuLi8uLi8iIGFuZCBtdWx0aXBsZXMgb2YgIi8iLAorICAgICMgYXMgd2VsbCBhcyB0aGUgYmVnaW5uaW5nICIvIiBzbyB3ZSBjYW4gZW5mb3JjZSBhbmQgZW5zdXJlIGl0LgorCisgICAgZGVmIHNhbml0aXplX3VybChzdHIpCisgICAgICAiLyIgKyBzdHIuZ3N1YiglciEvezIsfSEsICIvIikuZ3N1YiglciFcLisvfFxBLyshLCAiIikKKyAgICBlbmQKKworICAgICMgRXNjYXBlcyBhIHBhdGggdG8gYmUgYSB2YWxpZCBVUkwgcGF0aCBzZWdtZW50CisgICAgIworICAgICMgcGF0aCAtIFRoZSBwYXRoIHRvIGJlIGVzY2FwZWQuCisgICAgIworICAgICMgRXhhbXBsZXM6CisgICAgIworICAgICMgICBVUkwuZXNjYXBlX3BhdGgoIi9hIGIiKQorICAgICMgICAjID0+ICIvYSUyMGIiCisgICAgIworICAgICMgUmV0dXJucyB0aGUgZXNjYXBlZCBwYXRoLgorICAgIGRlZiBzZWxmLmVzY2FwZV9wYXRoKHBhdGgpCisgICAgICAjIEJlY2F1c2UgVVJJLmVzY2FwZSBkb2Vzbid0IGVzY2FwZSAiPyIsICJbIiBhbmQgIl0iIGJ5IGRlZmF1bHQsCisgICAgICAjIHNwZWNpZnkgdW5zYWZlIHN0cmluZyAoZXhjZXB0IHVucmVzZXJ2ZWQsIHN1Yi1kZWxpbXMsICI6IiwgIkAiIGFuZCAiLyIpLgorICAgICAgIworICAgICAgIyBVUkkgcGF0aCBzZWdtZW50IGlzIGRlZmluZWQgaW4gUkZDIDM5ODYgYXMgZm9sbG93czoKKyAgICAgICMgICBzZWdtZW50ICAgICAgID0gKnBjaGFyCisgICAgICAjICAgcGNoYXIgICAgICAgICA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyAiOiIgLyAiQCIKKyAgICAgICMgICB1bnJlc2VydmVkICAgID0gQUxQSEEgLyBESUdJVCAvICItIiAvICIuIiAvICJfIiAvICJ+IgorICAgICAgIyAgIHBjdC1lbmNvZGVkICAgPSAiJSIgSEVYRElHIEhFWERJRworICAgICAgIyAgIHN1Yi1kZWxpbXMgICAgPSAiISIgLyAiJCIgLyAiJiIgLyAiJyIgLyAiKCIgLyAiKSIKKyAgICAgICMgICAgICAgICAgICAgICAgIC8gIioiIC8gIisiIC8gIiwiIC8gIjsiIC8gIj0iCisgICAgICBwYXRoID0gQWRkcmVzc2FibGU6OlVSSS5lbmNvZGUocGF0aCkKKyAgICAgIHBhdGguZW5jb2RlKCJ1dGYtOCIpLnN1YigiIyIsICIlMjMiKQorICAgIGVuZAorCisgICAgIyBVbmVzY2FwZXMgYSBVUkwgcGF0aCBzZWdtZW50CisgICAgIworICAgICMgcGF0aCAtIFRoZSBwYXRoIHRvIGJlIHVuZXNjYXBlZC4KKyAgICAjCisgICAgIyBFeGFtcGxlczoKKyAgICAjCisgICAgIyAgIFVSTC51bmVzY2FwZV9wYXRoKCIvYSUyMGIiKQorICAgICMgICAjID0+ICIvYSBiIgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHVuZXNjYXBlZCBwYXRoLgorICAgIGRlZiBzZWxmLnVuZXNjYXBlX3BhdGgocGF0aCkKKyAgICAgIEFkZHJlc3NhYmxlOjpVUkkudW5lbmNvZGUocGF0aC5lbmNvZGUoInV0Zi04IikpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91dGlscy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3V0aWxzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTFhMmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91dGlscy5yYgpAQCAtMCwwICsxLDMzMSBAQAorCittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBVdGlscworICAgIGV4dGVuZCBzZWxmCisgICAgYXV0b2xvYWQgOkFuc2ksICJqZWt5bGwvdXRpbHMvYW5zaSIKKyAgICBhdXRvbG9hZCA6RXhlYywgImpla3lsbC91dGlscy9leGVjIgorICAgIGF1dG9sb2FkIDpQbGF0Zm9ybXMsICJqZWt5bGwvdXRpbHMvcGxhdGZvcm1zIgorICAgIGF1dG9sb2FkIDpXaW5UWiwgImpla3lsbC91dGlscy93aW5fdHoiCisKKyAgICAjIENvbnN0YW50cyBmb3IgdXNlIGluICNzbHVnaWZ5CisgICAgU0xVR0lGWV9NT0RFUyA9ICV3KHJhdyBkZWZhdWx0IHByZXR0eSBhc2NpaSkuZnJlZXplCisgICAgU0xVR0lGWV9SQVdfUkVHRVhQID0gUmVnZXhwLm5ldygnXFxzKycpLmZyZWV6ZQorICAgIFNMVUdJRllfREVGQVVMVF9SRUdFWFAgPSBSZWdleHAubmV3KCJbXls6YWxudW06XV0rIikuZnJlZXplCisgICAgU0xVR0lGWV9QUkVUVFlfUkVHRVhQID0gUmVnZXhwLm5ldygiW15bOmFsbnVtOl0uX34hJCYnKCkrLDs9QF0rIikuZnJlZXplCisgICAgU0xVR0lGWV9BU0NJSV9SRUdFWFAgPSBSZWdleHAubmV3KCJbXltBLVphLXowLTldXSsiKS5mcmVlemUKKworICAgICMgVGFrZXMgYW4gaW5kZW50ZWQgc3RyaW5nIGFuZCByZW1vdmVzIHRoZSBwcmVjZWRpbmcgc3BhY2VzIG9uIGVhY2ggbGluZQorCisgICAgZGVmIHN0cmlwX2hlcmVkb2Moc3RyKQorICAgICAgc3RyLmdzdWIoJXIhXlsgXHRdeyN7KHN0ci5zY2FuKCVyIV5bIFx0XSooPz1cUykhKS5taW4gfHwgIiIpLnNpemV9fSEsICIiKQorICAgIGVuZAorCisgICAgIyBUYWtlcyBhIHNsdWcgYW5kIHR1cm5zIGl0IGludG8gYSBzaW1wbGUgdGl0bGUuCisKKyAgICBkZWYgdGl0bGVpemVfc2x1ZyhzbHVnKQorICAgICAgc2x1Zy5zcGxpdCgiLSIpLm1hcCEoJjpjYXBpdGFsaXplKS5qb2luKCIgIikKKyAgICBlbmQKKworICAgICMgTm9uLWRlc3RydWN0aXZlIHZlcnNpb24gb2YgZGVlcF9tZXJnZV9oYXNoZXMhIFNlZSB0aGF0IG1ldGhvZC4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBtZXJnZWQgaGFzaGVzLgorICAgIGRlZiBkZWVwX21lcmdlX2hhc2hlcyhtYXN0ZXJfaGFzaCwgb3RoZXJfaGFzaCkKKyAgICAgIGRlZXBfbWVyZ2VfaGFzaGVzIShtYXN0ZXJfaGFzaC5kdXAsIG90aGVyX2hhc2gpCisgICAgZW5kCisKKyAgICAjIE1lcmdlcyBhIG1hc3RlciBoYXNoIHdpdGggYW5vdGhlciBoYXNoLCByZWN1cnNpdmVseS4KKyAgICAjCisgICAgIyBtYXN0ZXJfaGFzaCAtIHRoZSAicGFyZW50IiBoYXNoIHdob3NlIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4KKyAgICAjIG90aGVyX2hhc2ggIC0gdGhlIG90aGVyIGhhc2ggd2hvc2UgdmFsdWVzIHdpbGwgYmUgcGVyc2lzdGVkIGFmdGVyIHRoZSBtZXJnZQorICAgICMKKyAgICAjIFRoaXMgY29kZSB3YXMgbG92aW5nbHkgc3RvbGVuIGZyb20gc29tZSByYW5kb20gZ2VtOgorICAgICMgaHR0cDovL2dlbWphY2suY29tL2dlbXMvdGFydGFuLTAuMS4xL2NsYXNzZXMvSGFzaC5odG1sCisgICAgIworICAgICMgVGhhbmtzIHRvIHdob2V2ZXIgbWFkZSBpdC4KKyAgICBkZWYgZGVlcF9tZXJnZV9oYXNoZXMhKHRhcmdldCwgb3ZlcndyaXRlKQorICAgICAgbWVyZ2VfdmFsdWVzKHRhcmdldCwgb3ZlcndyaXRlKQorICAgICAgbWVyZ2VfZGVmYXVsdF9wcm9jKHRhcmdldCwgb3ZlcndyaXRlKQorICAgICAgZHVwbGljYXRlX2Zyb3plbl92YWx1ZXModGFyZ2V0KQorCisgICAgICB0YXJnZXQKKyAgICBlbmQKKworICAgIGRlZiBtZXJnYWJsZT8odmFsdWUpCisgICAgICB2YWx1ZS5pc19hPyhIYXNoKSB8fCB2YWx1ZS5pc19hPyhEcm9wczo6RHJvcCkKKyAgICBlbmQKKworICAgIGRlZiBkdXBsaWNhYmxlPyhvYmopCisgICAgICBjYXNlIG9iagorICAgICAgd2hlbiBuaWwsIGZhbHNlLCB0cnVlLCBTeW1ib2wsIE51bWVyaWMKKyAgICAgICAgZmFsc2UKKyAgICAgIGVsc2UKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJlYWQgYXJyYXkgZnJvbSB0aGUgc3VwcGxpZWQgaGFzaCBmYXZvdXJpbmcgdGhlIHNpbmd1bGFyIGtleQorICAgICMgYW5kIHRoZW4gdGhlIHBsdXJhbCBrZXksIGFuZCBoYW5kbGluZyBhbnkgbmlsIGVudHJpZXMuCisgICAgIworICAgICMgaGFzaCAtIHRoZSBoYXNoIHRvIHJlYWQgZnJvbQorICAgICMgc2luZ3VsYXJfa2V5IC0gdGhlIHNpbmd1bGFyIGtleQorICAgICMgcGx1cmFsX2tleSAtIHRoZSBwbHVyYWwga2V5CisgICAgIworICAgICMgUmV0dXJucyBhbiBhcnJheQorICAgIGRlZiBwbHVyYWxpemVkX2FycmF5X2Zyb21faGFzaChoYXNoLCBzaW5ndWxhcl9rZXksIHBsdXJhbF9rZXkpCisgICAgICBbXS50YXAgZG8gfGFycmF5fAorICAgICAgICB2YWx1ZSA9IHZhbHVlX2Zyb21fc2luZ3VsYXJfa2V5KGhhc2gsIHNpbmd1bGFyX2tleSkKKyAgICAgICAgdmFsdWUgfHw9IHZhbHVlX2Zyb21fcGx1cmFsX2tleShoYXNoLCBwbHVyYWxfa2V5KQorICAgICAgICBhcnJheSA8PCB2YWx1ZQorICAgICAgZW5kLmZsYXR0ZW4uY29tcGFjdAorICAgIGVuZAorCisgICAgZGVmIHZhbHVlX2Zyb21fc2luZ3VsYXJfa2V5KGhhc2gsIGtleSkKKyAgICAgIGhhc2hba2V5XSBpZiBoYXNoLmtleT8oa2V5KSB8fCAoaGFzaC5kZWZhdWx0X3Byb2MgJiYgaGFzaFtrZXldKQorICAgIGVuZAorCisgICAgZGVmIHZhbHVlX2Zyb21fcGx1cmFsX2tleShoYXNoLCBrZXkpCisgICAgICBpZiBoYXNoLmtleT8oa2V5KSB8fCAoaGFzaC5kZWZhdWx0X3Byb2MgJiYgaGFzaFtrZXldKQorICAgICAgICB2YWwgPSBoYXNoW2tleV0KKyAgICAgICAgY2FzZSB2YWwKKyAgICAgICAgd2hlbiBTdHJpbmcKKyAgICAgICAgICB2YWwuc3BsaXQKKyAgICAgICAgd2hlbiBBcnJheQorICAgICAgICAgIHZhbC5jb21wYWN0CisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgdHJhbnNmb3JtX2tleXMoaGFzaCkKKyAgICAgIHJlc3VsdCA9IHt9CisgICAgICBoYXNoLmVhY2hfa2V5IGRvIHxrZXl8CisgICAgICAgIHJlc3VsdFt5aWVsZChrZXkpXSA9IGhhc2hba2V5XQorICAgICAgZW5kCisgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgICMgQXBwbHkgI3RvX3N5bSB0byBhbGwga2V5cyBpbiB0aGUgaGFzaAorICAgICMKKyAgICAjIGhhc2ggLSB0aGUgaGFzaCB0byB3aGljaCB0byBhcHBseSB0aGlzIHRyYW5zZm9ybWF0aW9uCisgICAgIworICAgICMgUmV0dXJucyBhIG5ldyBoYXNoIHdpdGggc3ltYm9saXplZCBrZXlzCisgICAgZGVmIHN5bWJvbGl6ZV9oYXNoX2tleXMoaGFzaCkKKyAgICAgIHRyYW5zZm9ybV9rZXlzKGhhc2gpIHsgfGtleXwga2V5LnRvX3N5bSByZXNjdWUga2V5IH0KKyAgICBlbmQKKworICAgICMgQXBwbHkgI3RvX3MgdG8gYWxsIGtleXMgaW4gdGhlIEhhc2gKKyAgICAjCisgICAgIyBoYXNoIC0gdGhlIGhhc2ggdG8gd2hpY2ggdG8gYXBwbHkgdGhpcyB0cmFuc2Zvcm1hdGlvbgorICAgICMKKyAgICAjIFJldHVybnMgYSBuZXcgaGFzaCB3aXRoIHN0cmluZ2lmaWVkIGtleXMKKyAgICBkZWYgc3RyaW5naWZ5X2hhc2hfa2V5cyhoYXNoKQorICAgICAgdHJhbnNmb3JtX2tleXMoaGFzaCkgeyB8a2V5fCBrZXkudG9fcyByZXNjdWUga2V5IH0KKyAgICBlbmQKKworICAgICMgUGFyc2UgYSBkYXRlL3RpbWUgYW5kIHRocm93IGFuIGVycm9yIGlmIGludmFsaWQKKyAgICAjCisgICAgIyBpbnB1dCAtIHRoZSBkYXRlL3RpbWUgdG8gcGFyc2UKKyAgICAjIG1zZyAtIChvcHRpb25hbCkgdGhlIGVycm9yIG1lc3NhZ2UgdG8gc2hvdyB0aGUgdXNlcgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHBhcnNlZCBkYXRlIGlmIHN1Y2Nlc3NmdWwsIHRocm93cyBhIEZhdGFsRXhjZXB0aW9uCisgICAgIyBpZiBub3QKKyAgICBkZWYgcGFyc2VfZGF0ZShpbnB1dCwgbXNnID0gIklucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQuIikKKyAgICAgIFRpbWUucGFyc2UoaW5wdXQpLmxvY2FsdGltZQorICAgIHJlc2N1ZSBBcmd1bWVudEVycm9yCisgICAgICByYWlzZSBFcnJvcnM6OkludmFsaWREYXRlRXJyb3IsICJJbnZhbGlkIGRhdGUgJyN7aW5wdXR9JzogI3ttc2d9IgorICAgIGVuZAorCisgICAgIyBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBmaWxlIGhhcworICAgICMKKyAgICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgWUFNTCBmcm9udCBtYXR0ZXIgaXMgcHJlc2VudC4KKyAgICAjIHJ1Ym9jb3A6IGRpc2FibGUgUHJlZGljYXRlTmFtZQorICAgIGRlZiBoYXNfeWFtbF9oZWFkZXI/KGZpbGUpCisgICAgICAhIShGaWxlLm9wZW4oZmlsZSwgInJiIiwgJjpyZWFkbGluZSkgPX4gJXIhXEEtLS1ccypccj9cbiEpCisgICAgcmVzY3VlIEVPRkVycm9yCisgICAgICBmYWxzZQorICAgIGVuZAorICAgICMgcnVib2NvcDogZW5hYmxlIFByZWRpY2F0ZU5hbWUKKworICAgICMgU2x1Z2lmeSBhIGZpbGVuYW1lIG9yIHRpdGxlLgorICAgICMKKyAgICAjIHN0cmluZyAtIHRoZSBmaWxlbmFtZSBvciB0aXRsZSB0byBzbHVnaWZ5CisgICAgIyBtb2RlIC0gaG93IHN0cmluZyBpcyBzbHVnaWZpZWQKKyAgICAjIGNhc2VkIC0gd2hldGhlciB0byByZXBsYWNlIGFsbCB1cHBlcmNhc2UgbGV0dGVycyB3aXRoIHRoZWlyCisgICAgIyBsb3dlcmNhc2UgY291bnRlcnBhcnRzCisgICAgIworICAgICMgV2hlbiBtb2RlIGlzICJub25lIiwgcmV0dXJuIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgIworICAgICMgV2hlbiBtb2RlIGlzICJyYXciLCByZXR1cm4gdGhlIGdpdmVuIHN0cmluZywKKyAgICAjIHdpdGggZXZlcnkgc2VxdWVuY2Ugb2Ygc3BhY2VzIGNoYXJhY3RlcnMgcmVwbGFjZWQgd2l0aCBhIGh5cGhlbi4KKyAgICAjCisgICAgIyBXaGVuIG1vZGUgaXMgImRlZmF1bHQiIG9yIG5pbCwgbm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycyBhcmUKKyAgICAjIHJlcGxhY2VkIHdpdGggYSBoeXBoZW4gdG9vLgorICAgICMKKyAgICAjIFdoZW4gbW9kZSBpcyAicHJldHR5Iiwgc29tZSBub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzICguX34hJCYnKCkrLDs9QCkKKyAgICAjIGFyZSBub3QgcmVwbGFjZWQgd2l0aCBoeXBoZW4uCisgICAgIworICAgICMgV2hlbiBtb2RlIGlzICJhc2NpaSIsIHNvbWUgZXZlcnl0aGluZyBlbHNlIGV4Y2VwdCBBU0NJSSBjaGFyYWN0ZXJzCisgICAgIyBhLXogKGxvd2VyY2FzZSksIEEtWiAodXBwZXJjYXNlKSBhbmQgMC05IChudW1iZXJzKSBhcmUgbm90IHJlcGxhY2VkIHdpdGggaHlwaGVuLgorICAgICMKKyAgICAjIElmIGNhc2VkIGlzIHRydWUsIGFsbCB1cHBlcmNhc2UgbGV0dGVycyBpbiB0aGUgcmVzdWx0IHN0cmluZyBhcmUKKyAgICAjIHJlcGxhY2VkIHdpdGggdGhlaXIgbG93ZXJjYXNlIGNvdW50ZXJwYXJ0cy4KKyAgICAjCisgICAgIyBFeGFtcGxlczoKKyAgICAjICAgc2x1Z2lmeSgiVGhlIF9jb25maWcueW1sIGZpbGUiKQorICAgICMgICAjID0+ICJ0aGUtY29uZmlnLXltbC1maWxlIgorICAgICMKKyAgICAjICAgc2x1Z2lmeSgiVGhlIF9jb25maWcueW1sIGZpbGUiLCAicHJldHR5IikKKyAgICAjICAgIyA9PiAidGhlLV9jb25maWcueW1sLWZpbGUiCisgICAgIworICAgICMgICBzbHVnaWZ5KCJUaGUgX2NvbmZpZy55bWwgZmlsZSIsICJwcmV0dHkiLCB0cnVlKQorICAgICMgICAjID0+ICJUaGUtX2NvbmZpZy55bWwgZmlsZSIKKyAgICAjCisgICAgIyAgIHNsdWdpZnkoIlRoZSBfY29uZmlnLnltbCBmaWxlIiwgImFzY2lpIikKKyAgICAjICAgIyA9PiAidGhlLWNvbmZpZy55bWwtZmlsZSIKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBzbHVnaWZpZWQgc3RyaW5nLgorICAgIGRlZiBzbHVnaWZ5KHN0cmluZywgbW9kZTogbmlsLCBjYXNlZDogZmFsc2UpCisgICAgICBtb2RlIHx8PSAiZGVmYXVsdCIKKyAgICAgIHJldHVybiBuaWwgaWYgc3RyaW5nLm5pbD8KKworICAgICAgdW5sZXNzIFNMVUdJRllfTU9ERVMuaW5jbHVkZT8obW9kZSkKKyAgICAgICAgcmV0dXJuIGNhc2VkID8gc3RyaW5nIDogc3RyaW5nLmRvd25jYXNlCisgICAgICBlbmQKKworICAgICAgIyBSZXBsYWNlIGVhY2ggY2hhcmFjdGVyIHNlcXVlbmNlIHdpdGggYSBoeXBoZW4KKyAgICAgIHJlID0KKyAgICAgICAgY2FzZSBtb2RlCisgICAgICAgIHdoZW4gInJhdyIKKyAgICAgICAgICBTTFVHSUZZX1JBV19SRUdFWFAKKyAgICAgICAgd2hlbiAiZGVmYXVsdCIKKyAgICAgICAgICBTTFVHSUZZX0RFRkFVTFRfUkVHRVhQCisgICAgICAgIHdoZW4gInByZXR0eSIKKyAgICAgICAgICAjICIuX34hJCYnKCkrLDs9QCIgaXMgaHVtYW4gcmVhZGFibGUgKG5vdCBVUkktZXNjYXBlZCkgaW4gVVJMCisgICAgICAgICAgIyBhbmQgaXMgYWxsb3dlZCBpbiBib3RoIGV4dE4gYW5kIE5URlMuCisgICAgICAgICAgU0xVR0lGWV9QUkVUVFlfUkVHRVhQCisgICAgICAgIHdoZW4gImFzY2lpIgorICAgICAgICAgICMgRm9yIHdlYiBzZXJ2ZXJzIG5vdCBiZWluZyBhYmxlIHRvIGhhbmRsZSBVbmljb2RlLCB0aGUgc2FmZQorICAgICAgICAgICMgbWV0aG9kIGlzIHRvIGRpdGNoIGFueXRoaW5nIGVsc2UgYnV0IGxhdGluIGxldHRlcnMgYW5kIG51bWVyaWMKKyAgICAgICAgICAjIGRpZ2l0cy4KKyAgICAgICAgICBTTFVHSUZZX0FTQ0lJX1JFR0VYUAorICAgICAgICBlbmQKKworICAgICAgIyBTdHJpcCBhY2NvcmRpbmcgdG8gdGhlIG1vZGUKKyAgICAgIHNsdWcgPSBzdHJpbmcuZ3N1YihyZSwgIi0iKQorCisgICAgICAjIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIGh5cGhlbgorICAgICAgc2x1Zy5nc3ViISglciFeXC18XC0kIWksICIiKQorCisgICAgICBzbHVnLmRvd25jYXNlISB1bmxlc3MgY2FzZWQKKyAgICAgIHNsdWcKKyAgICBlbmQKKworICAgICMgQWRkIGFuIGFwcHJvcHJpYXRlIHN1ZmZpeCB0byB0ZW1wbGF0ZSBzbyB0aGF0IGl0IG1hdGNoZXMgdGhlIHNwZWNpZmllZAorICAgICMgcGVybWFsaW5rIHN0eWxlLgorICAgICMKKyAgICAjIHRlbXBsYXRlIC0gcGVybWFsaW5rIHRlbXBsYXRlIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggb3IgZmlsZSBleHRlbnNpb24KKyAgICAjIHBlcm1hbGlua19zdHlsZSAtIHBlcm1hbGluayBzdHlsZSwgZWl0aGVyIGJ1aWx0LWluIG9yIGN1c3RvbQorICAgICMKKyAgICAjIFRoZSByZXR1cm5lZCBwZXJtYWxpbmsgdGVtcGxhdGUgd2lsbCB1c2UgdGhlIHNhbWUgZW5kaW5nIHN0eWxlIGFzCisgICAgIyBzcGVjaWZpZWQgaW4gcGVybWFsaW5rX3N0eWxlLiAgRm9yIGV4YW1wbGUsIGlmIHBlcm1hbGlua19zdHlsZSBjb250YWlucyBhCisgICAgIyB0cmFpbGluZyBzbGFzaCAob3IgaXMgOnByZXR0eSwgd2hpY2ggaW5kaXJlY3RseSBoYXMgYSB0cmFpbGluZyBzbGFzaCksCisgICAgIyB0aGVuIHNvIHdpbGwgdGhlIHJldHVybmVkIHRlbXBsYXRlLiAgSWYgcGVybWFsaW5rX3N0eWxlIGhhcyBhIHRyYWlsaW5nCisgICAgIyAiOm91dHB1dF9leHQiIChvciBpcyA6bm9uZSwgOmRhdGUsIG9yIDpvcmRpbmFsKSB0aGVuIHNvIHdpbGwgdGhlIHJldHVybmVkCisgICAgIyB0ZW1wbGF0ZS4gIE90aGVyd2lzZSwgdGVtcGxhdGUgd2lsbCBiZSByZXR1cm5lZCB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAgICAjCisgICAgIyBFeGFtcGxlczoKKyAgICAjICAgYWRkX3Blcm1hbGlua19zdWZmaXgoIi86YmFzZW5hbWUiLCA6cHJldHR5KQorICAgICMgICAjID0+ICIvOmJhc2VuYW1lLyIKKyAgICAjCisgICAgIyAgIGFkZF9wZXJtYWxpbmtfc3VmZml4KCIvOmJhc2VuYW1lIiwgOmRhdGUpCisgICAgIyAgICMgPT4gIi86YmFzZW5hbWU6b3V0cHV0X2V4dCIKKyAgICAjCisgICAgIyAgIGFkZF9wZXJtYWxpbmtfc3VmZml4KCIvOmJhc2VuYW1lIiwgIi86eWVhci86bW9udGgvOnRpdGxlLyIpCisgICAgIyAgICMgPT4gIi86YmFzZW5hbWUvIgorICAgICMKKyAgICAjICAgYWRkX3Blcm1hbGlua19zdWZmaXgoIi86YmFzZW5hbWUiLCAiLzp5ZWFyLzptb250aC86dGl0bGUiKQorICAgICMgICAjID0+ICIvOmJhc2VuYW1lIgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHVwZGF0ZWQgcGVybWFsaW5rIHRlbXBsYXRlCisgICAgZGVmIGFkZF9wZXJtYWxpbmtfc3VmZml4KHRlbXBsYXRlLCBwZXJtYWxpbmtfc3R5bGUpCisgICAgICBjYXNlIHBlcm1hbGlua19zdHlsZQorICAgICAgd2hlbiA6cHJldHR5CisgICAgICAgIHRlbXBsYXRlIDw8ICIvIgorICAgICAgd2hlbiA6ZGF0ZSwgOm9yZGluYWwsIDpub25lCisgICAgICAgIHRlbXBsYXRlIDw8ICI6b3V0cHV0X2V4dCIKKyAgICAgIGVsc2UKKyAgICAgICAgdGVtcGxhdGUgPDwgIi8iIGlmIHBlcm1hbGlua19zdHlsZS50b19zLmVuZF93aXRoPygiLyIpCisgICAgICAgIHRlbXBsYXRlIDw8ICI6b3V0cHV0X2V4dCIgaWYgcGVybWFsaW5rX3N0eWxlLnRvX3MuZW5kX3dpdGg/KCI6b3V0cHV0X2V4dCIpCisgICAgICBlbmQKKyAgICAgIHRlbXBsYXRlCisgICAgZW5kCisKKyAgICAjIFdvcmsgdGhlIHNhbWUgd2F5IGFzIERpci5nbG9iIGJ1dCBzZXBlcmF0aW5nIHRoZSBpbnB1dCBpbnRvIHR3byBwYXJ0cworICAgICMgKCdkaXInICsgJy8nICsgJ3BhdHRlcm4nKSB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IHBhcnQoJ2RpcicpIGRvZXMgbm90IGFjdAorICAgICMgYXMgYSBwYXR0ZXJuLgorICAgICMKKyAgICAjIEZvciBleGFtcGxlLCBEaXIuZ2xvYigicGF0aFsvKiIpIGFsd2F5cyByZXR1cm5zIGFuIGVtcHR5IGFycmF5LAorICAgICMgYmVjYXVzZSB0aGUgbWV0aG9kIGZhaWxzIHRvIGZpbmQgdGhlIGNsb3NpbmcgcGF0dGVybiB0byAnWycgd2hpY2ggaXMgJ10nCisgICAgIworICAgICMgRXhhbXBsZXM6CisgICAgIyAgIHNhZmVfZ2xvYigicGF0aFsiLCAiKiIpCisgICAgIyAgICMgPT4gWyJwYXRoWy9maWxlMSIsICJwYXRoWy9maWxlMiJdCisgICAgIworICAgICMgICBzYWZlX2dsb2IoInBhdGgiLCAiKiIsIEZpbGU6OkZOTV9ET1RNQVRDSCkKKyAgICAjICAgIyA9PiBbInBhdGgvLiIsICJwYXRoLy4uIiwgInBhdGgvZmlsZTEiXQorICAgICMKKyAgICAjICAgc2FmZV9nbG9iKCJwYXRoIiwgWyIqKiIsICIqIl0pCisgICAgIyAgICMgPT4gWyJwYXRoWy9maWxlMSIsICJwYXRoWy9mb2xkZXIvZmlsZTIiXQorICAgICMKKyAgICAjIGRpciAgICAgIC0gdGhlIGRpciB3aGVyZSBnbG9iIHdpbGwgYmUgZXhlY3V0ZWQgdW5kZXIKKyAgICAjICAgICAgICAgICAodGhlIGRpciB3aWxsIGJlIGluY2x1ZGVkIHRvIGVhY2ggcmVzdWx0KQorICAgICMgcGF0dGVybnMgLSB0aGUgcGF0dGVybnMgKG9yIHRoZSBwYXR0ZXJuKSB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgdGhlIGRpcgorICAgICMgZmxhZ3MgICAgLSB0aGUgZmxhZ3Mgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwYXR0ZXJuCisgICAgIworICAgICMgUmV0dXJucyBtYXRjaGVkIHBhdGhlcworICAgIGRlZiBzYWZlX2dsb2IoZGlyLCBwYXR0ZXJucywgZmxhZ3MgPSAwKQorICAgICAgcmV0dXJuIFtdIHVubGVzcyBEaXIuZXhpc3Q/KGRpcikKKyAgICAgIHBhdHRlcm4gPSBGaWxlLmpvaW4oQXJyYXkocGF0dGVybnMpKQorICAgICAgcmV0dXJuIFtkaXJdIGlmIHBhdHRlcm4uZW1wdHk/CisgICAgICBEaXIuY2hkaXIoZGlyKSBkbworICAgICAgICBEaXIuZ2xvYihwYXR0ZXJuLCBmbGFncykubWFwIHsgfGZ8IEZpbGUuam9pbihkaXIsIGYpIH0KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIG1lcmdlZCBvcHRpb24gaGFzaCBmb3IgRmlsZS5yZWFkIG9mIHNlbGYuc2l0ZSAoaWYgZXhpc3RzKQorICAgICMgYW5kIGEgZ2l2ZW4gcGFyYW0KKyAgICBkZWYgbWVyZ2VkX2ZpbGVfcmVhZF9vcHRzKHNpdGUsIG9wdHMpCisgICAgICBtZXJnZWQgPSAoc2l0ZSA/IHNpdGUuZmlsZV9yZWFkX29wdHMgOiB7fSkubWVyZ2Uob3B0cykKKyAgICAgIGlmIG1lcmdlZFsiZW5jb2RpbmciXSAmJiAhbWVyZ2VkWyJlbmNvZGluZyJdLnN0YXJ0X3dpdGg/KCJib218IikKKyAgICAgICAgbWVyZ2VkWyJlbmNvZGluZyJdLmluc2VydCgwLCAiYm9tfCIpCisgICAgICBlbmQKKyAgICAgIG1lcmdlZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgIGRlZiBtZXJnZV92YWx1ZXModGFyZ2V0LCBvdmVyd3JpdGUpCisgICAgICB0YXJnZXQubWVyZ2UhKG92ZXJ3cml0ZSkgZG8gfF9rZXksIG9sZF92YWwsIG5ld192YWx8CisgICAgICAgIGlmIG5ld192YWwubmlsPworICAgICAgICAgIG9sZF92YWwKKyAgICAgICAgZWxzaWYgbWVyZ2FibGU/KG9sZF92YWwpICYmIG1lcmdhYmxlPyhuZXdfdmFsKQorICAgICAgICAgIGRlZXBfbWVyZ2VfaGFzaGVzKG9sZF92YWwsIG5ld192YWwpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBuZXdfdmFsCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIG1lcmdlX2RlZmF1bHRfcHJvYyh0YXJnZXQsIG92ZXJ3cml0ZSkKKyAgICAgIGlmIHRhcmdldC5pc19hPyhIYXNoKSAmJiBvdmVyd3JpdGUuaXNfYT8oSGFzaCkgJiYgdGFyZ2V0LmRlZmF1bHRfcHJvYy5uaWw/CisgICAgICAgIHRhcmdldC5kZWZhdWx0X3Byb2MgPSBvdmVyd3JpdGUuZGVmYXVsdF9wcm9jCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKyAgICBkZWYgZHVwbGljYXRlX2Zyb3plbl92YWx1ZXModGFyZ2V0KQorICAgICAgdGFyZ2V0LmVhY2ggZG8gfGtleSwgdmFsfAorICAgICAgICB0YXJnZXRba2V5XSA9IHZhbC5kdXAgaWYgdmFsLmZyb3plbj8gJiYgZHVwbGljYWJsZT8odmFsKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91dGlscy9hbnNpLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdXRpbHMvYW5zaS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmRkMjMyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdXRpbHMvYW5zaS5yYgpAQCAtMCwwICsxLDU5IEBACisjIEZyb3plbi1zdHJpbmctbGl0ZXJhbDogdHJ1ZQorIyBDb3B5cmlnaHQ6IDIwMTUgSmVreWxsIC0gTUlUIExpY2Vuc2UKKyMgRW5jb2Rpbmc6IHV0Zi04CisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIFV0aWxzCisgICAgbW9kdWxlIEFuc2kKKyAgICAgIGV4dGVuZCBzZWxmCisKKyAgICAgIEVTQ0FQRSA9IGZvcm1hdCgiJWMiLCAyNykKKyAgICAgIE1BVENIID0gJXIhI3tFU0NBUEV9XFsoPzpcZCspKD86O1xkKykqKGp8a3xtfHN8dXxBfEJ8Ryl8XGVcKEJcZVxbbSFpeAorICAgICAgQ09MT1JTID0geworICAgICAgICA6cmVkICAgICA9PiAzMSwKKyAgICAgICAgOmdyZWVuICAgPT4gMzIsCisgICAgICAgIDpibGFjayAgID0+IDMwLAorICAgICAgICA6bWFnZW50YSA9PiAzNSwKKyAgICAgICAgOnllbGxvdyAgPT4gMzMsCisgICAgICAgIDp3aGl0ZSAgID0+IDM3LAorICAgICAgICA6Ymx1ZSAgICA9PiAzNCwKKyAgICAgICAgOmN5YW4gICAgPT4gMzYsCisgICAgICB9LmZyZWV6ZQorCisgICAgICAjIFN0cmlwIEFOU0kgZnJvbSB0aGUgY3VycmVudCBzdHJpbmcuICBJdCBhbHNvIHN0cmlwcyBjdXJzb3Igc3R1ZmYsCisgICAgICAjIHdlbGwgc29tZSBvZiBpdCwgYW5kIGl0IGFsc28gc3RyaXBzIHNvbWUgb3RoZXIgc3R1ZmYgdGhhdCBhIGxvdCBvZgorICAgICAgIyB0aGUgb3RoZXIgQU5TSSBzdHJpcHBlcnMgZG9uJ3QuCisKKyAgICAgIGRlZiBzdHJpcChzdHIpCisgICAgICAgIHN0ci5nc3ViIE1BVENILCAiIgorICAgICAgZW5kCisKKyAgICAgICMKKworICAgICAgZGVmIGhhcz8oc3RyKQorICAgICAgICAhIShzdHIgPX4gTUFUQ0gpCisgICAgICBlbmQKKworICAgICAgIyBSZXNldCB0aGUgY29sb3IgYmFjayB0byB0aGUgZGVmYXVsdCBjb2xvciBzbyB0aGF0IHlvdSBkbyBub3QgbGVhayBhbnkKKyAgICAgICMgY29sb3JzIHdoZW4geW91IG1vdmUgb250byB0aGUgbmV4dCBsaW5lLiBUaGlzIGlzIHByb2JhYmx5IG5vcm1hbGx5CisgICAgICAjIHVzZWQgYXMgcGFydCBvZiBhIHdyYXBwZXIgc28gdGhhdCB3ZSBkb24ndCBsZWFrIGNvbG9ycy4KKworICAgICAgZGVmIHJlc2V0KHN0ciA9ICIiKQorICAgICAgICBAYW5zaV9yZXNldCB8fD0gZm9ybWF0KCIlY1swbSIsIDI3KQorICAgICAgICAiI3tAYW5zaV9yZXNldH0je3N0cn0iCisgICAgICBlbmQKKworICAgICAgIyBTRUU6IGBzZWxmOjpDT0xPUlNgIGZvciBhIGxpc3Qgb2YgbWV0aG9kcy4gIFRoZXkgYXJlIG1vc3RseQorICAgICAgIyBzdGFuZGFyZCBiYXNlIGNvbG9ycyBzdXBwb3J0ZWQgYnkgcHJldHR5IG11Y2ggYW55IHh0ZXJtLWNvbG9yLCB3ZSBkbworICAgICAgIyBub3QgbmVlZCBtb3JlIHRoYW4gdGhlIGJhc2UgY29sb3JzIHNvIHdlIGRvIG5vdCBpbmNsdWRlIHRoZW0uCisgICAgICAjIEFjdHVhbGx5Li4uIGlmIEknbSBob25lc3Qgd2UgZG9uJ3QgZXZlbiBuZWVkIG1vc3Qgb2YgdGhlCisgICAgICAjIGJhc2UgY29sb3JzLgorCisgICAgICBDT0xPUlMuZWFjaCBkbyB8Y29sb3IsIG51bXwKKyAgICAgICAgZGVmaW5lX21ldGhvZCBjb2xvciBkbyB8c3RyfAorICAgICAgICAgICIje2Zvcm1hdCgiJWMiLCAyNyl9WyN7bnVtfW0je3N0cn0je3Jlc2V0fSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3V0aWxzL2V4ZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91dGlscy9leGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNDAzZGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91dGlscy9leGVjLnJiCkBAIC0wLDAgKzEsMjUgQEAKK3JlcXVpcmUgIm9wZW4zIgorCittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBVdGlscworICAgIG1vZHVsZSBFeGVjCisgICAgICBleHRlbmQgc2VsZgorCisgICAgICAjIFJ1bnMgYSBwcm9ncmFtIGluIGEgc3ViLXNoZWxsLgorICAgICAgIworICAgICAgIyAqYXJncyAtIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIHByb2dyYW0gbmFtZSBhbmQgYXJndW1lbnRzCisgICAgICAjCisgICAgICAjIFJldHVybnMgYSBQcm9jZXNzOjpTdGF0dXMgYW5kIGEgU3RyaW5nIG9mIG91dHB1dCBpbiBhbiBhcnJheSBpbgorICAgICAgIyB0aGF0IG9yZGVyLgorICAgICAgZGVmIHJ1bigqYXJncykKKyAgICAgICAgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBwcm9jZXNzID0gT3BlbjMucG9wZW4zKCphcmdzKQorICAgICAgICBvdXQgPSBzdGRvdXQucmVhZC5zdHJpcAorICAgICAgICBlcnIgPSBzdGRlcnIucmVhZC5zdHJpcAorCisgICAgICAgIFtzdGRpbiwgc3Rkb3V0LCBzdGRlcnJdLmVhY2goJjpjbG9zZSkKKyAgICAgICAgW3Byb2Nlc3MudmFsdWUsIG91dCArIGVycl0KKyAgICAgIGVuZAorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91dGlscy9wbGF0Zm9ybXMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91dGlscy9wbGF0Zm9ybXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2ZWY3OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvamVreWxsL3V0aWxzL3BsYXRmb3Jtcy5yYgpAQCAtMCwwICsxLDgwIEBACittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBVdGlscworICAgIG1vZHVsZSBQbGF0Zm9ybXMKKyAgICAgIGV4dGVuZCBzZWxmCisKKyAgICAgICMgUHJvdmlkZXMganJ1Ynk/IGFuZCBtcmk/IHdoaWNoIHJlc3BlY3RpdmVseSBkZXRlY3QgdGhlc2UgdHdvIHR5cGVzIG9mCisgICAgICAjIHRlc3RlZCBFbmdpbmVzIHdlIHN1cHBvcnQsIGluIHRoZSBmdXR1cmUgd2UgbWlnaHQgcHJvYmFibHkgc3VwcG9ydCB0aGUKKyAgICAgICMgb3RoZXIgb25lIHRoYXQgZXZlcnlvbmUgdXNlZCB0byB0YWxrIGFib3V0LgorCisgICAgICB7IDpqcnVieT8gPT4gImpydWJ5IiwgOm1yaT8gPT4gInJ1YnkiIH0uZWFjaCBkbyB8aywgdnwKKyAgICAgICAgZGVmaW5lX21ldGhvZCBrIGRvCisgICAgICAgICAgOjpSVUJZX0VOR0lORSA9PSB2CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgLS0KKyAgICAgICMgQWxsb3dzIHlvdSB0byBkZXRlY3QgInJlYWwiIFdpbmRvd3MsIG9yIHdoYXQgd2Ugd291bGQgY29uc2lkZXIKKyAgICAgICMgInJlYWwiIFdpbmRvd3MuICBUaGF0IGlzLCB0aGF0IHdlIGNhbiBwYXNzIHRoZSBiYXNpYyB0ZXN0IGFuZCB0aGUKKyAgICAgICMgL3Byb2MvdmVyc2lvbiByZXR1cm5zIG5vdGhpbmcgdG8gdXMuCisgICAgICAjIC0tCisKKyAgICAgIGRlZiB2YW5pbGxhX3dpbmRvd3M/CisgICAgICAgIFJiQ29uZmlnOjpDT05GSUdbImhvc3Rfb3MiXSA9fiAlciFtc3dpbnxtaW5nd3xjeWd3aW4haSAmJiBcCisgICAgICAgICAgIXByb2NfdmVyc2lvbgorICAgICAgZW5kCisKKyAgICAgICMgLS0KKyAgICAgICMgWFhYOiBSZW1vdmUgaW4gNC4wCisgICAgICAjIC0tCisKKyAgICAgIGFsaWFzX21ldGhvZCA6cmVhbGx5X3dpbmRvd3M/LCBcCisgICAgICAgIDp2YW5pbGxhX3dpbmRvd3M/CisKKyAgICAgICMKKworICAgICAgZGVmIGJhc2hfb25fd2luZG93cz8KKyAgICAgICAgUmJDb25maWc6OkNPTkZJR1siaG9zdF9vcyJdID1+ICVyIWxpbnV4ISAmJiBcCisgICAgICAgICAgcHJvY192ZXJzaW9uID1+ICVyIW1pY3Jvc29mdCFpCisgICAgICBlbmQKKworICAgICAgIworCisgICAgICBkZWYgd2luZG93cz8KKyAgICAgICAgdmFuaWxsYV93aW5kb3dzPyB8fCBiYXNoX29uX3dpbmRvd3M/CisgICAgICBlbmQKKworICAgICAgIworCisgICAgICBkZWYgbGludXg/CisgICAgICAgIFJiQ29uZmlnOjpDT05GSUdbImhvc3Rfb3MiXSA9fiAlciFsaW51eCEgJiYgXAorICAgICAgICAgIHByb2NfdmVyc2lvbiAhfiAlciFtaWNyb3NvZnQhaQorICAgICAgZW5kCisKKyAgICAgICMgUHJvdmlkZXMgd2luZG93cz8sIGxpbnV4Pywgb3N4PywgdW5peD8gc28gdGhhdCB3ZSBjYW4gZGV0ZWN0CisgICAgICAjIHBsYXRmb3Jtcy4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBgamVreWxsIGRvY3RvcmAgYW5kIGZvciB0ZXN0aW5nCisgICAgICAjIHdoZXJlIHdlIGtpY2sgb2ZmIGNlcnRhaW4gdGVzdHMgYmFzZWQgb24gdGhlIHBsYXRmb3JtLgorCisgICAgICB7IDpvc3g/ID0+ICVyIWRhcndpbnxtYWMgb3MhLCA6dW5peD8gPT4gJXIhc29sYXJpc3xic2QhIH0uZWFjaCBkbyB8aywgdnwKKyAgICAgICAgZGVmaW5lX21ldGhvZCBrIGRvCisgICAgICAgICAgISEoCisgICAgICAgICAgICBSYkNvbmZpZzo6Q09ORklHWyJob3N0X29zIl0gPX4gdgorICAgICAgICAgICkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIworCisgICAgICBwcml2YXRlCisgICAgICBkZWYgcHJvY192ZXJzaW9uCisgICAgICAgIEBjYWNoZWRfcHJvY192ZXJzaW9uIHx8PSBiZWdpbgorICAgICAgICAgIFBhdGh1dGlsLm5ldygKKyAgICAgICAgICAgICIvcHJvYy92ZXJzaW9uIgorICAgICAgICAgICkucmVhZAorICAgICAgICByZXNjdWUgRXJybm86OkVOT0VOVAorICAgICAgICAgIG5pbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdXRpbHMvd2luX3R6LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdXRpbHMvd2luX3R6LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTEwNDIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC91dGlscy93aW5fdHoucmIKQEAgLTAsMCArMSw3MyBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgVXRpbHMKKyAgICBtb2R1bGUgV2luVFoKKyAgICAgIGV4dGVuZCBzZWxmCisKKyAgICAgICMgUHVibGljOiBDYWxjdWxhdGUgdGhlIFRpbWV6b25lIGZvciBXaW5kb3dzIHdoZW4gdGhlIGNvbmZpZyBmaWxlIGhhcyBhIGRlZmluZWQKKyAgICAgICMgICAgICAgICAndGltZXpvbmUnIGtleS4KKyAgICAgICMKKyAgICAgICMgdGltZXpvbmUgLSB0aGUgSUFOQSBUaW1lIFpvbmUgc3BlY2lmaWVkIGluICJfY29uZmlnLnltbCIKKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIHN0cmluZyB0aGF0IHVsdGltYXRlbHkgcmUtZGVmaW5lcyBFTlZbIlRaIl0gaW4gV2luZG93cworICAgICAgZGVmIGNhbGN1bGF0ZSh0aW1lem9uZSkKKyAgICAgICAgRXh0ZXJuYWwucmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWwoInR6aW5mbyIpCisgICAgICAgIHR6ID0gVFpJbmZvOjpUaW1lem9uZS5nZXQodGltZXpvbmUpCisgICAgICAgIGRpZmZlcmVuY2UgPSBUaW1lLm5vdy50b19pIC0gdHoubm93LnRvX2kKKyAgICAgICAgIworICAgICAgICAjIFBPU0lYIHN0eWxlIGRlZmluaXRpb24gcmV2ZXJzZXMgdGhlIG9mZnNldCBzaWduLgorICAgICAgICAjICAgZS5nLiBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUgKEVTVCkgdGhhdCBpcyA1SHJzLiB0byB0aGUgJ3dlc3QnIG9mIFByaW1lIE1lcmlkaWFuCisgICAgICAgICMgICBpcyBkZW5vdGVkIGFzOgorICAgICAgICAjICAgICBFU1QrNSAob3IpIEVTVCswNTowMAorICAgICAgICAjIFJlZmVyZW5jZTogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmMvbWFudWFsL2h0bWxfbm9kZS9UWi1WYXJpYWJsZS5odG1sCisgICAgICAgIHNpZ24gPSBkaWZmZXJlbmNlIDwgMCA/ICItIiA6ICIrIgorICAgICAgICBvZmZzZXQgPSBzaWduID09ICItIiA/ICIrIiA6ICItIiB1bmxlc3MgZGlmZmVyZW5jZS56ZXJvPworICAgICAgICAjCisgICAgICAgICMgY29udmVydCB0aGUgZGlmZmVyZW5jZSAoaW4gc2Vjb25kcykgdG8gaG91cnMsIGFzIGEgcmF0aW9uYWwgbnVtYmVyLCBhbmQgcGVyZm9ybQorICAgICAgICAjIGEgbW9kdWxvIG9wZXJhdGlvbiBvbiBpdC4KKyAgICAgICAgbW9kdWxvID0gbW9kdWxvX29mKHJhdGlvbmFsX2hvdXIoZGlmZmVyZW5jZSkpCisgICAgICAgICMKKyAgICAgICAgIyBGb3JtYXQgdGhlIGhvdXIgYXMgYSB0d28tZGlnaXQgbnVtYmVyLgorICAgICAgICAjIEVzdGFibGlzaCB0aGUgbWludXRlcyBiYXNlZCBvbiBtb2R1bG8gZXhwcmVzc2lvbi4KKyAgICAgICAgaGggPSBmb3JtYXQoIiUwMmQiLCBhYnNvbHV0ZV9ob3VyKGRpZmZlcmVuY2UpLmNlaWwpCisgICAgICAgIG1tID0gbW9kdWxvLnplcm8/ID8gIjAwIiA6ICIzMCIKKworICAgICAgICBKZWt5bGwubG9nZ2VyLmRlYnVnICJUaW1lem9uZToiLCAiI3t0aW1lem9uZX0gI3tvZmZzZXR9I3toaH06I3ttbX0iCisgICAgICAgICMKKyAgICAgICAgIyBOb3RlOiBUaGUgMy1sZXR0ZXItd29yZCBiZWxvdyBkb2Vzbid0IGhhdmUgYSBwYXJ0aWN1bGFyIHNpZ25pZmljYW5jZS4KKyAgICAgICAgIldUWiN7c2lnbn0je2hofToje21tfSIKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgICMgUHJpdmF0ZTogQ29udmVydCBnaXZlbiBzZWNvbmRzIHRvIGFuIGhvdXIgYXMgYSByYXRpb25hbCBudW1iZXIuCisgICAgICAjCisgICAgICAjIHNlY29uZHMgLSBzdXBwbGllZCBhcyBhbiBpbnRlZ2VyLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSByYXRpb25hbCBudW1iZXIuCisgICAgICAjIDM2MDAgLSBuby4gb2Ygc2Vjb25kcyBpbiBhbiBob3VyLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgcmF0aW9uYWwgbnVtYmVyLgorICAgICAgZGVmIHJhdGlvbmFsX2hvdXIoc2Vjb25kcykKKyAgICAgICAgc2Vjb25kcy50b19yIC8gMzYwMAorICAgICAgZW5kCisKKyAgICAgICMgUHJpdmF0ZTogQ29udmVydCBnaXZlbiBzZWNvbmRzIHRvIGFuIGhvdXIgYXMgYW4gYWJzb2x1dGUgbnVtYmVyLgorICAgICAgIworICAgICAgIyBzZWNvbmRzIC0gc3VwcGxpZWQgYXMgYW4gaW50ZWdlciwgaXQgaXMgY29udmVydGVkIHRvIGl0cyBhYnNvbHV0ZS4KKyAgICAgICMgMzYwMCAtIG5vLiBvZiBzZWNvbmRzIGluIGFuIGhvdXIuCisgICAgICAjCisgICAgICAjIFJldHVybnMgYW4gaW50ZWdlci4KKyAgICAgIGRlZiBhYnNvbHV0ZV9ob3VyKHNlY29uZHMpCisgICAgICAgIHNlY29uZHMuYWJzIC8gMzYwMAorICAgICAgZW5kCisKKyAgICAgICMgUHJpdmF0ZTogUGVyZm9ybSBhIG1vZHVsbyBvcGVyYXRpb24gb24gYSBnaXZlbiBmcmFjdGlvbi4KKyAgICAgICMKKyAgICAgICMgZnJhY3Rpb24gLSBzdXBwbGllZCBhcyBhIHJhdGlvbmFsIG51bWJlciwgaXRzIG51bWVyYXRvciBpcyBkaXZpZGVkCisgICAgICAjICAgICAgICAgICAgYnkgaXRzIGRlbm9taW5hdG9yIGFuZCB0aGUgcmVtYWluZGVyIHJldHVybmVkLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGFuIGludGVnZXIuCisgICAgICBkZWYgbW9kdWxvX29mKGZyYWN0aW9uKQorICAgICAgICBmcmFjdGlvbi5udW1lcmF0b3IgJSBmcmFjdGlvbi5kZW5vbWluYXRvcgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL2pla3lsbC92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWNiZDVhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9qZWt5bGwvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDMgQEAKK21vZHVsZSBKZWt5bGwKKyAgVkVSU0lPTiA9ICIzLjUuMiIuZnJlZXplCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS8uZ2l0aWdub3JlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9zaXRlX3RlbXBsYXRlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjMTUwNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorX3NpdGUKKy5zYXNzLWNhY2hlCisuamVreWxsLW1ldGFkYXRhCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3NpdGVfdGVtcGxhdGUvNDA0Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3NpdGVfdGVtcGxhdGUvNDA0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3MmI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS80MDQuaHRtbApAQCAtMCwwICsxLDI0IEBACistLS0KK2xheW91dDogZGVmYXVsdAorLS0tCisKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+CisgIC5jb250YWluZXIgeworICAgIG1hcmdpbjogMTBweCBhdXRvOworICAgIG1heC13aWR0aDogNjAwcHg7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICB9CisgIGgxIHsKKyAgICBtYXJnaW46IDMwcHggMDsKKyAgICBmb250LXNpemU6IDRlbTsKKyAgICBsaW5lLWhlaWdodDogMTsKKyAgICBsZXR0ZXItc3BhY2luZzogLTFweDsKKyAgfQorPC9zdHlsZT4KKworPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KKyAgPGgxPjQwNDwvaDE+CisKKyAgPHA+PHN0cm9uZz5QYWdlIG5vdCBmb3VuZCA6KDwvc3Ryb25nPjwvcD4KKyAgPHA+VGhlIHJlcXVlc3RlZCBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC48L3A+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS9fY29uZmlnLnltbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS9fY29uZmlnLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2VhNmQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9zaXRlX3RlbXBsYXRlL19jb25maWcueW1sCkBAIC0wLDAgKzEsNDMgQEAKKyMgV2VsY29tZSB0byBKZWt5bGwhCisjCisjIFRoaXMgY29uZmlnIGZpbGUgaXMgbWVhbnQgZm9yIHNldHRpbmdzIHRoYXQgYWZmZWN0IHlvdXIgd2hvbGUgYmxvZywgdmFsdWVzCisjIHdoaWNoIHlvdSBhcmUgZXhwZWN0ZWQgdG8gc2V0IHVwIG9uY2UgYW5kIHJhcmVseSBlZGl0IGFmdGVyIHRoYXQuIElmIHlvdSBmaW5kCisjIHlvdXJzZWxmIGVkaXRpbmcgdGhpcyBmaWxlIHZlcnkgb2Z0ZW4sIGNvbnNpZGVyIHVzaW5nIEpla3lsbCdzIGRhdGEgZmlsZXMKKyMgZmVhdHVyZSBmb3IgdGhlIGRhdGEgeW91IG5lZWQgdG8gdXBkYXRlIGZyZXF1ZW50bHkuCisjCisjIEZvciB0ZWNobmljYWwgcmVhc29ucywgdGhpcyBmaWxlIGlzICpOT1QqIHJlbG9hZGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgdXNlCisjICdidW5kbGUgZXhlYyBqZWt5bGwgc2VydmUnLiBJZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSwgcGxlYXNlIHJlc3RhcnQgdGhlIHNlcnZlciBwcm9jZXNzLgorCisjIFNpdGUgc2V0dGluZ3MKKyMgVGhlc2UgYXJlIHVzZWQgdG8gcGVyc29uYWxpemUgeW91ciBuZXcgc2l0ZS4gSWYgeW91IGxvb2sgaW4gdGhlIEhUTUwgZmlsZXMsCisjIHlvdSB3aWxsIHNlZSB0aGVtIGFjY2Vzc2VkIHZpYSB7eyBzaXRlLnRpdGxlIH19LCB7eyBzaXRlLmVtYWlsIH19LCBhbmQgc28gb24uCisjIFlvdSBjYW4gY3JlYXRlIGFueSBjdXN0b20gdmFyaWFibGUgeW91IHdvdWxkIGxpa2UsIGFuZCB0aGV5IHdpbGwgYmUgYWNjZXNzaWJsZQorIyBpbiB0aGUgdGVtcGxhdGVzIHZpYSB7eyBzaXRlLm15dmFyaWFibGUgfX0uCit0aXRsZTogWW91ciBhd2Vzb21lIHRpdGxlCitlbWFpbDogeW91ci1lbWFpbEBleGFtcGxlLmNvbQorZGVzY3JpcHRpb246ID4gIyB0aGlzIG1lYW5zIHRvIGlnbm9yZSBuZXdsaW5lcyB1bnRpbCAiYmFzZXVybDoiCisgIFdyaXRlIGFuIGF3ZXNvbWUgZGVzY3JpcHRpb24gZm9yIHlvdXIgbmV3IHNpdGUgaGVyZS4gWW91IGNhbiBlZGl0IHRoaXMKKyAgbGluZSBpbiBfY29uZmlnLnltbC4gSXQgd2lsbCBhcHBlYXIgaW4geW91ciBkb2N1bWVudCBoZWFkIG1ldGEgKGZvcgorICBHb29nbGUgc2VhcmNoIHJlc3VsdHMpIGFuZCBpbiB5b3VyIGZlZWQueG1sIHNpdGUgZGVzY3JpcHRpb24uCitiYXNldXJsOiAiIiAjIHRoZSBzdWJwYXRoIG9mIHlvdXIgc2l0ZSwgZS5nLiAvYmxvZwordXJsOiAiIiAjIHRoZSBiYXNlIGhvc3RuYW1lICYgcHJvdG9jb2wgZm9yIHlvdXIgc2l0ZSwgZS5nLiBodHRwOi8vZXhhbXBsZS5jb20KK3R3aXR0ZXJfdXNlcm5hbWU6IGpla3lsbHJiCitnaXRodWJfdXNlcm5hbWU6ICBqZWt5bGwKKworIyBCdWlsZCBzZXR0aW5ncworbWFya2Rvd246IGtyYW1kb3duCit0aGVtZTogbWluaW1hCitwbHVnaW5zOgorICAtIGpla3lsbC1mZWVkCisKKyMgRXhjbHVkZSBmcm9tIHByb2Nlc3NpbmcuCisjIFRoZSBmb2xsb3dpbmcgaXRlbXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkLCBieSBkZWZhdWx0LiBDcmVhdGUgYSBjdXN0b20gbGlzdAorIyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZXR0aW5nLgorIyBleGNsdWRlOgorIyAgIC0gR2VtZmlsZQorIyAgIC0gR2VtZmlsZS5sb2NrCisjICAgLSBub2RlX21vZHVsZXMKKyMgICAtIHZlbmRvci9idW5kbGUvCisjICAgLSB2ZW5kb3IvY2FjaGUvCisjICAgLSB2ZW5kb3IvZ2Vtcy8KKyMgICAtIHZlbmRvci9ydWJ5LwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9zaXRlX3RlbXBsYXRlL19wb3N0cy8wMDAwLTAwLTAwLXdlbGNvbWUtdG8tamVreWxsLm1hcmtkb3duLmVyYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS9fcG9zdHMvMDAwMC0wMC0wMC13ZWxjb21lLXRvLWpla3lsbC5tYXJrZG93bi5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4ZjdjMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS9fcG9zdHMvMDAwMC0wMC0wMC13ZWxjb21lLXRvLWpla3lsbC5tYXJrZG93bi5lcmIKQEAgLTAsMCArMSwyNSBAQAorLS0tCitsYXlvdXQ6IHBvc3QKK3RpdGxlOiAgIldlbGNvbWUgdG8gSmVreWxsISIKK2RhdGU6ICAgPCU9IFRpbWUubm93LnN0cmZ0aW1lKCclWS0lbS0lZCAlSDolTTolUyAleicpICU+CitjYXRlZ29yaWVzOiBqZWt5bGwgdXBkYXRlCistLS0KK1lvdeKAmWxsIGZpbmQgdGhpcyBwb3N0IGluIHlvdXIgYF9wb3N0c2AgZGlyZWN0b3J5LiBHbyBhaGVhZCBhbmQgZWRpdCBpdCBhbmQgcmUtYnVpbGQgdGhlIHNpdGUgdG8gc2VlIHlvdXIgY2hhbmdlcy4gWW91IGNhbiByZWJ1aWxkIHRoZSBzaXRlIGluIG1hbnkgZGlmZmVyZW50IHdheXMsIGJ1dCB0aGUgbW9zdCBjb21tb24gd2F5IGlzIHRvIHJ1biBgamVreWxsIHNlcnZlYCwgd2hpY2ggbGF1bmNoZXMgYSB3ZWIgc2VydmVyIGFuZCBhdXRvLXJlZ2VuZXJhdGVzIHlvdXIgc2l0ZSB3aGVuIGEgZmlsZSBpcyB1cGRhdGVkLgorCitUbyBhZGQgbmV3IHBvc3RzLCBzaW1wbHkgYWRkIGEgZmlsZSBpbiB0aGUgYF9wb3N0c2AgZGlyZWN0b3J5IHRoYXQgZm9sbG93cyB0aGUgY29udmVudGlvbiBgWVlZWS1NTS1ERC1uYW1lLW9mLXBvc3QuZXh0YCBhbmQgaW5jbHVkZXMgdGhlIG5lY2Vzc2FyeSBmcm9udCBtYXR0ZXIuIFRha2UgYSBsb29rIGF0IHRoZSBzb3VyY2UgZm9yIHRoaXMgcG9zdCB0byBnZXQgYW4gaWRlYSBhYm91dCBob3cgaXQgd29ya3MuCisKK0pla3lsbCBhbHNvIG9mZmVycyBwb3dlcmZ1bCBzdXBwb3J0IGZvciBjb2RlIHNuaXBwZXRzOgorCit7JSBoaWdobGlnaHQgcnVieSAlfQorZGVmIHByaW50X2hpKG5hbWUpCisgIHB1dHMgIkhpLCAje25hbWV9IgorZW5kCitwcmludF9oaSgnVG9tJykKKyM9PiBwcmludHMgJ0hpLCBUb20nIHRvIFNURE9VVC4KK3slIGVuZGhpZ2hsaWdodCAlfQorCitDaGVjayBvdXQgdGhlIFtKZWt5bGwgZG9jc11bamVreWxsLWRvY3NdIGZvciBtb3JlIGluZm8gb24gaG93IHRvIGdldCB0aGUgbW9zdCBvdXQgb2YgSmVreWxsLiBGaWxlIGFsbCBidWdzL2ZlYXR1cmUgcmVxdWVzdHMgYXQgW0pla3lsbOKAmXMgR2l0SHViIHJlcG9dW2pla3lsbC1naF0uIElmIHlvdSBoYXZlIHF1ZXN0aW9ucywgeW91IGNhbiBhc2sgdGhlbSBvbiBbSmVreWxsIFRhbGtdW2pla3lsbC10YWxrXS4KKworW2pla3lsbC1kb2NzXTogaHR0cHM6Ly9qZWt5bGxyYi5jb20vZG9jcy9ob21lCitbamVreWxsLWdoXTogICBodHRwczovL2dpdGh1Yi5jb20vamVreWxsL2pla3lsbAorW2pla3lsbC10YWxrXTogaHR0cHM6Ly90YWxrLmpla3lsbHJiLmNvbS8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS9hYm91dC5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvc2l0ZV90ZW1wbGF0ZS9hYm91dC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjRlMGIyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9zaXRlX3RlbXBsYXRlL2Fib3V0Lm1kCkBAIC0wLDAgKzEsMTggQEAKKy0tLQorbGF5b3V0OiBwYWdlCit0aXRsZTogQWJvdXQKK3Blcm1hbGluazogL2Fib3V0LworLS0tCisKK1RoaXMgaXMgdGhlIGJhc2UgSmVreWxsIHRoZW1lLiBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgaW5mbyBhYm91dCBjdXN0b21pemluZyB5b3VyIEpla3lsbCB0aGVtZSwgYXMgd2VsbCBhcyBiYXNpYyBKZWt5bGwgdXNhZ2UgZG9jdW1lbnRhdGlvbiBhdCBbamVreWxscmIuY29tXShodHRwczovL2pla3lsbHJiLmNvbS8pCisKK1lvdSBjYW4gZmluZCB0aGUgc291cmNlIGNvZGUgZm9yIE1pbmltYSBhdCBHaXRIdWI6CitbamVreWxsXVtqZWt5bGwtb3JnYW5pemF0aW9uXSAvCitbbWluaW1hXShodHRwczovL2dpdGh1Yi5jb20vamVreWxsL21pbmltYSkKKworWW91IGNhbiBmaW5kIHRoZSBzb3VyY2UgY29kZSBmb3IgSmVreWxsIGF0IEdpdEh1YjoKK1tqZWt5bGxdW2pla3lsbC1vcmdhbml6YXRpb25dIC8KK1tqZWt5bGxdKGh0dHBzOi8vZ2l0aHViLmNvbS9qZWt5bGwvamVreWxsKQorCisKK1tqZWt5bGwtb3JnYW5pemF0aW9uXTogaHR0cHM6Ly9naXRodWIuY29tL2pla3lsbApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9zaXRlX3RlbXBsYXRlL2luZGV4Lm1kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi9zaXRlX3RlbXBsYXRlL2luZGV4Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjVkNjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3NpdGVfdGVtcGxhdGUvaW5kZXgubWQKQEAgLTAsMCArMSw2IEBACistLS0KKyMgWW91IGRvbid0IG5lZWQgdG8gZWRpdCB0aGlzIGZpbGUsIGl0J3MgZW1wdHkgb24gcHVycG9zZS4KKyMgRWRpdCB0aGVtZSdzIGhvbWUgbGF5b3V0IGluc3RlYWQgaWYgeW91IHdhbm5hIG1ha2Ugc29tZSBjaGFuZ2VzCisjIFNlZTogaHR0cHM6Ly9qZWt5bGxyYi5jb20vZG9jcy90aGVtZXMvI292ZXJyaWRpbmctdGhlbWUtZGVmYXVsdHMKK2xheW91dDogaG9tZQorLS0tCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL0NPREVfT0ZfQ09ORFVDVC5tZC5lcmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL0NPREVfT0ZfQ09ORFVDVC5tZC5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyYzc3MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvQ09ERV9PRl9DT05EVUNULm1kLmVyYgpAQCAtMCwwICsxLDc0IEBACisjIENvbnRyaWJ1dG9yIENvdmVuYW50IENvZGUgb2YgQ29uZHVjdAorCisjIyBPdXIgUGxlZGdlCisKK0luIHRoZSBpbnRlcmVzdCBvZiBmb3N0ZXJpbmcgYW4gb3BlbiBhbmQgd2VsY29taW5nIGVudmlyb25tZW50LCB3ZSBhcworY29udHJpYnV0b3JzIGFuZCBtYWludGFpbmVycyBwbGVkZ2UgdG8gbWFraW5nIHBhcnRpY2lwYXRpb24gaW4gb3VyIHByb2plY3QgYW5kCitvdXIgY29tbXVuaXR5IGEgaGFyYXNzbWVudC1mcmVlIGV4cGVyaWVuY2UgZm9yIGV2ZXJ5b25lLCByZWdhcmRsZXNzIG9mIGFnZSwgYm9keQorc2l6ZSwgZGlzYWJpbGl0eSwgZXRobmljaXR5LCBnZW5kZXIgaWRlbnRpdHkgYW5kIGV4cHJlc3Npb24sIGxldmVsIG9mIGV4cGVyaWVuY2UsCituYXRpb25hbGl0eSwgcGVyc29uYWwgYXBwZWFyYW5jZSwgcmFjZSwgcmVsaWdpb24sIG9yIHNleHVhbCBpZGVudGl0eSBhbmQKK29yaWVudGF0aW9uLgorCisjIyBPdXIgU3RhbmRhcmRzCisKK0V4YW1wbGVzIG9mIGJlaGF2aW9yIHRoYXQgY29udHJpYnV0ZXMgdG8gY3JlYXRpbmcgYSBwb3NpdGl2ZSBlbnZpcm9ubWVudAoraW5jbHVkZToKKworKiBVc2luZyB3ZWxjb21pbmcgYW5kIGluY2x1c2l2ZSBsYW5ndWFnZQorKiBCZWluZyByZXNwZWN0ZnVsIG9mIGRpZmZlcmluZyB2aWV3cG9pbnRzIGFuZCBleHBlcmllbmNlcworKiBHcmFjZWZ1bGx5IGFjY2VwdGluZyBjb25zdHJ1Y3RpdmUgY3JpdGljaXNtCisqIEZvY3VzaW5nIG9uIHdoYXQgaXMgYmVzdCBmb3IgdGhlIGNvbW11bml0eQorKiBTaG93aW5nIGVtcGF0aHkgdG93YXJkcyBvdGhlciBjb21tdW5pdHkgbWVtYmVycworCitFeGFtcGxlcyBvZiB1bmFjY2VwdGFibGUgYmVoYXZpb3IgYnkgcGFydGljaXBhbnRzIGluY2x1ZGU6CisKKyogVGhlIHVzZSBvZiBzZXh1YWxpemVkIGxhbmd1YWdlIG9yIGltYWdlcnkgYW5kIHVud2VsY29tZSBzZXh1YWwgYXR0ZW50aW9uIG9yCithZHZhbmNlcworKiBUcm9sbGluZywgaW5zdWx0aW5nL2Rlcm9nYXRvcnkgY29tbWVudHMsIGFuZCBwZXJzb25hbCBvciBwb2xpdGljYWwgYXR0YWNrcworKiBQdWJsaWMgb3IgcHJpdmF0ZSBoYXJhc3NtZW50CisqIFB1Ymxpc2hpbmcgb3RoZXJzJyBwcml2YXRlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGEgcGh5c2ljYWwgb3IgZWxlY3Ryb25pYworICBhZGRyZXNzLCB3aXRob3V0IGV4cGxpY2l0IHBlcm1pc3Npb24KKyogT3RoZXIgY29uZHVjdCB3aGljaCBjb3VsZCByZWFzb25hYmx5IGJlIGNvbnNpZGVyZWQgaW5hcHByb3ByaWF0ZSBpbiBhCisgIHByb2Zlc3Npb25hbCBzZXR0aW5nCisKKyMjIE91ciBSZXNwb25zaWJpbGl0aWVzCisKK1Byb2plY3QgbWFpbnRhaW5lcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjbGFyaWZ5aW5nIHRoZSBzdGFuZGFyZHMgb2YgYWNjZXB0YWJsZQorYmVoYXZpb3IgYW5kIGFyZSBleHBlY3RlZCB0byB0YWtlIGFwcHJvcHJpYXRlIGFuZCBmYWlyIGNvcnJlY3RpdmUgYWN0aW9uIGluCityZXNwb25zZSB0byBhbnkgaW5zdGFuY2VzIG9mIHVuYWNjZXB0YWJsZSBiZWhhdmlvci4KKworUHJvamVjdCBtYWludGFpbmVycyBoYXZlIHRoZSByaWdodCBhbmQgcmVzcG9uc2liaWxpdHkgdG8gcmVtb3ZlLCBlZGl0LCBvcgorcmVqZWN0IGNvbW1lbnRzLCBjb21taXRzLCBjb2RlLCB3aWtpIGVkaXRzLCBpc3N1ZXMsIGFuZCBvdGhlciBjb250cmlidXRpb25zCit0aGF0IGFyZSBub3QgYWxpZ25lZCB0byB0aGlzIENvZGUgb2YgQ29uZHVjdCwgb3IgdG8gYmFuIHRlbXBvcmFyaWx5IG9yCitwZXJtYW5lbnRseSBhbnkgY29udHJpYnV0b3IgZm9yIG90aGVyIGJlaGF2aW9ycyB0aGF0IHRoZXkgZGVlbSBpbmFwcHJvcHJpYXRlLAordGhyZWF0ZW5pbmcsIG9mZmVuc2l2ZSwgb3IgaGFybWZ1bC4KKworIyMgU2NvcGUKKworVGhpcyBDb2RlIG9mIENvbmR1Y3QgYXBwbGllcyBib3RoIHdpdGhpbiBwcm9qZWN0IHNwYWNlcyBhbmQgaW4gcHVibGljIHNwYWNlcword2hlbiBhbiBpbmRpdmlkdWFsIGlzIHJlcHJlc2VudGluZyB0aGUgcHJvamVjdCBvciBpdHMgY29tbXVuaXR5LiBFeGFtcGxlcyBvZgorcmVwcmVzZW50aW5nIGEgcHJvamVjdCBvciBjb21tdW5pdHkgaW5jbHVkZSB1c2luZyBhbiBvZmZpY2lhbCBwcm9qZWN0IGUtbWFpbAorYWRkcmVzcywgcG9zdGluZyB2aWEgYW4gb2ZmaWNpYWwgc29jaWFsIG1lZGlhIGFjY291bnQsIG9yIGFjdGluZyBhcyBhbiBhcHBvaW50ZWQKK3JlcHJlc2VudGF0aXZlIGF0IGFuIG9ubGluZSBvciBvZmZsaW5lIGV2ZW50LiBSZXByZXNlbnRhdGlvbiBvZiBhIHByb2plY3QgbWF5IGJlCitmdXJ0aGVyIGRlZmluZWQgYW5kIGNsYXJpZmllZCBieSBwcm9qZWN0IG1haW50YWluZXJzLgorCisjIyBFbmZvcmNlbWVudAorCitJbnN0YW5jZXMgb2YgYWJ1c2l2ZSwgaGFyYXNzaW5nLCBvciBvdGhlcndpc2UgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIG1heSBiZQorcmVwb3J0ZWQgYnkgY29udGFjdGluZyB0aGUgcHJvamVjdCB0ZWFtIGF0IDwlPSB1c2VyX2VtYWlsICU+LiBBbGwKK2NvbXBsYWludHMgd2lsbCBiZSByZXZpZXdlZCBhbmQgaW52ZXN0aWdhdGVkIGFuZCB3aWxsIHJlc3VsdCBpbiBhIHJlc3BvbnNlIHRoYXQKK2lzIGRlZW1lZCBuZWNlc3NhcnkgYW5kIGFwcHJvcHJpYXRlIHRvIHRoZSBjaXJjdW1zdGFuY2VzLiBUaGUgcHJvamVjdCB0ZWFtIGlzCitvYmxpZ2F0ZWQgdG8gbWFpbnRhaW4gY29uZmlkZW50aWFsaXR5IHdpdGggcmVnYXJkIHRvIHRoZSByZXBvcnRlciBvZiBhbiBpbmNpZGVudC4KK0Z1cnRoZXIgZGV0YWlscyBvZiBzcGVjaWZpYyBlbmZvcmNlbWVudCBwb2xpY2llcyBtYXkgYmUgcG9zdGVkIHNlcGFyYXRlbHkuCisKK1Byb2plY3QgbWFpbnRhaW5lcnMgd2hvIGRvIG5vdCBmb2xsb3cgb3IgZW5mb3JjZSB0aGUgQ29kZSBvZiBDb25kdWN0IGluIGdvb2QKK2ZhaXRoIG1heSBmYWNlIHRlbXBvcmFyeSBvciBwZXJtYW5lbnQgcmVwZXJjdXNzaW9ucyBhcyBkZXRlcm1pbmVkIGJ5IG90aGVyCittZW1iZXJzIG9mIHRoZSBwcm9qZWN0J3MgbGVhZGVyc2hpcC4KKworIyMgQXR0cmlidXRpb24KKworVGhpcyBDb2RlIG9mIENvbmR1Y3QgaXMgYWRhcHRlZCBmcm9tIHRoZSBbQ29udHJpYnV0b3IgQ292ZW5hbnRdW2hvbWVwYWdlXSwgdmVyc2lvbiAxLjQsCithdmFpbGFibGUgYXQgW2h0dHA6Ly9jb250cmlidXRvci1jb3ZlbmFudC5vcmcvdmVyc2lvbi8xLzRdW3ZlcnNpb25dCisKK1tob21lcGFnZV06IGh0dHA6Ly9jb250cmlidXRvci1jb3ZlbmFudC5vcmcKK1t2ZXJzaW9uXTogaHR0cDovL2NvbnRyaWJ1dG9yLWNvdmVuYW50Lm9yZy92ZXJzaW9uLzEvNC8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvR2VtZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmU5YzNjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9HZW1maWxlCkBAIC0wLDAgKzEsMiBAQAorc291cmNlICJodHRwczovL3J1YnlnZW1zLm9yZyIKK2dlbXNwZWMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvTElDRU5TRS50eHQuZXJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9MSUNFTlNFLnR4dC5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMGViNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvTElDRU5TRS50eHQuZXJiCkBAIC0wLDAgKzEsMjEgQEAKK1RoZSBNSVQgTGljZW5zZSAoTUlUKQorCitDb3B5cmlnaHQgKGMpIDwlPSBUaW1lLm5vdy55ZWFyICU+IDwlPSB1c2VyX25hbWUgJT4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL1JFQURNRS5tZC5lcmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL1JFQURNRS5tZC5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjYTQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvUkVBRE1FLm1kLmVyYgpAQCAtMCwwICsxLDQ4IEBACisjIDwlPSB0aGVtZV9uYW1lICU+CisKK1dlbGNvbWUgdG8geW91ciBuZXcgSmVreWxsIHRoZW1lISBJbiB0aGlzIGRpcmVjdG9yeSwgeW91J2xsIGZpbmQgdGhlIGZpbGVzIHlvdSBuZWVkIHRvIGJlIGFibGUgdG8gcGFja2FnZSB1cCB5b3VyIHRoZW1lIGludG8gYSBnZW0uIFB1dCB5b3VyIGxheW91dHMgaW4gYF9sYXlvdXRzYCwgeW91ciBpbmNsdWRlcyBpbiBgX2luY2x1ZGVzYCBhbmQgeW91ciBzYXNzIGluIGBfc2Fzc2AuIFRvIGV4cGVyaW1lbnQgd2l0aCB0aGlzIGNvZGUsIGFkZCBzb21lIHNhbXBsZSBjb250ZW50IGFuZCBydW4gYGJ1bmRsZSBleGVjIGpla3lsbCBzZXJ2ZWAg4oCTIHRoaXMgZGlyZWN0b3J5IGlzIHNldHVwIGp1c3QgbGlrZSBhIEpla3lsbCBzaXRlIQorCitUT0RPOiBEZWxldGUgdGhpcyBhbmQgdGhlIHRleHQgYWJvdmUsIGFuZCBkZXNjcmliZSB5b3VyIGdlbQorCisjIyBJbnN0YWxsYXRpb24KKworQWRkIHRoaXMgbGluZSB0byB5b3VyIEpla3lsbCBzaXRlJ3MgYEdlbWZpbGVgOgorCitgYGBydWJ5CitnZW0gPCU9IHRoZW1lX25hbWUuaW5zcGVjdCAlPgorYGBgCisKK0FuZCBhZGQgdGhpcyBsaW5lIHRvIHlvdXIgSmVreWxsIHNpdGUncyBgX2NvbmZpZy55bWxgOgorCitgYGB5YW1sCit0aGVtZTogPCU9IHRoZW1lX25hbWUgJT4KK2BgYAorCitBbmQgdGhlbiBleGVjdXRlOgorCisgICAgJCBidW5kbGUKKworT3IgaW5zdGFsbCBpdCB5b3Vyc2VsZiBhczoKKworICAgICQgZ2VtIGluc3RhbGwgPCU9IHRoZW1lX25hbWUgJT4KKworIyMgVXNhZ2UKKworVE9ETzogV3JpdGUgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGhlcmUuIERlc2NyaWJlIHlvdXIgYXZhaWxhYmxlIGxheW91dHMsIGluY2x1ZGVzLCBhbmQvb3Igc2Fzcy4KKworIyMgQ29udHJpYnV0aW5nCisKK0J1ZyByZXBvcnRzIGFuZCBwdWxsIHJlcXVlc3RzIGFyZSB3ZWxjb21lIG9uIEdpdEh1YiBhdCBodHRwczovL2dpdGh1Yi5jb20vW1VTRVJOQU1FXS9oZWxsby4gVGhpcyBwcm9qZWN0IGlzIGludGVuZGVkIHRvIGJlIGEgc2FmZSwgd2VsY29taW5nIHNwYWNlIGZvciBjb2xsYWJvcmF0aW9uLCBhbmQgY29udHJpYnV0b3JzIGFyZSBleHBlY3RlZCB0byBhZGhlcmUgdG8gdGhlIFtDb250cmlidXRvciBDb3ZlbmFudF0oaHR0cDovL2NvbnRyaWJ1dG9yLWNvdmVuYW50Lm9yZykgY29kZSBvZiBjb25kdWN0LgorCisjIyBEZXZlbG9wbWVudAorCitUbyBzZXQgdXAgeW91ciBlbnZpcm9ubWVudCB0byBkZXZlbG9wIHRoaXMgdGhlbWUsIHJ1biBgYnVuZGxlIGluc3RhbGxgLgorCitZb3VyIHRoZW1lIGlzIHNldHVwIGp1c3QgbGlrZSBhIG5vcm1hbCBKZWt5bGwgc2l0ZSEgVG8gdGVzdCB5b3VyIHRoZW1lLCBydW4gYGJ1bmRsZSBleGVjIGpla3lsbCBzZXJ2ZWAgYW5kIG9wZW4geW91ciBicm93c2VyIGF0IGBodHRwOi8vbG9jYWxob3N0OjQwMDBgLiBUaGlzIHN0YXJ0cyBhIEpla3lsbCBzZXJ2ZXIgdXNpbmcgeW91ciB0aGVtZS4gQWRkIHBhZ2VzLCBkb2N1bWVudHMsIGRhdGEsIGV0Yy4gbGlrZSBub3JtYWwgdG8gdGVzdCB5b3VyIHRoZW1lJ3MgY29udGVudHMuIEFzIHlvdSBtYWtlIG1vZGlmaWNhdGlvbnMgdG8geW91ciB0aGVtZSBhbmQgdG8geW91ciBjb250ZW50LCB5b3VyIHNpdGUgd2lsbCByZWdlbmVyYXRlIGFuZCB5b3Ugc2hvdWxkIHNlZSB0aGUgY2hhbmdlcyBpbiB0aGUgYnJvd3NlciBhZnRlciBhIHJlZnJlc2gsIGp1c3QgbGlrZSBub3JtYWwuCisKK1doZW4geW91ciB0aGVtZSBpcyByZWxlYXNlZCwgb25seSB0aGUgZmlsZXMgaW4gYF9sYXlvdXRzYCwgYF9pbmNsdWRlc2AsIGFuZCBgX3Nhc3NgIHRyYWNrZWQgd2l0aCBHaXQgd2lsbCBiZSByZWxlYXNlZC4KKworIyMgTGljZW5zZQorCitUaGUgdGhlbWUgaXMgYXZhaWxhYmxlIGFzIG9wZW4gc291cmNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgW01JVCBMaWNlbnNlXShodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkuCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvX2xheW91dHMvZGVmYXVsdC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9fbGF5b3V0cy9kZWZhdWx0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkZDA3MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvX2xheW91dHMvZGVmYXVsdC5odG1sCkBAIC0wLDAgKzEgQEAKK3t7IGNvbnRlbnQgfX0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvX2xheW91dHMvcGFnZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9fbGF5b3V0cy9wYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3MTEyNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvX2xheW91dHMvcGFnZS5odG1sCkBAIC0wLDAgKzEsNSBAQAorLS0tCitsYXlvdXQ6IGRlZmF1bHQKKy0tLQorCit7eyBjb250ZW50IH19CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL19sYXlvdXRzL3Bvc3QuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvX2xheW91dHMvcG9zdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzExMjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL19sYXlvdXRzL3Bvc3QuaHRtbApAQCAtMCwwICsxLDUgQEAKKy0tLQorbGF5b3V0OiBkZWZhdWx0CistLS0KKwore3sgY29udGVudCB9fQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9leGFtcGxlL19jb25maWcueW1sLmVyYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvZXhhbXBsZS9fY29uZmlnLnltbC5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlOGQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvZXhhbXBsZS9fY29uZmlnLnltbC5lcmIKQEAgLTAsMCArMSBAQAordGhlbWU6IDwlPSB0aGVtZV9uYW1lICU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL2V4YW1wbGUvX3Bvc3QubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL2V4YW1wbGUvX3Bvc3QubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1YjIxZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvZXhhbXBsZS9fcG9zdC5tZApAQCAtMCwwICsxLDEyIEBACistLS0KK2xheW91dDogcG9zdAorLS0tCisKK0VvcyBldSBkb2NlbmRpIHRyYWN0YXRvcyBzYXBpZW50ZW0sIGJydXRlIG9wdGlvbiBtZW5hbmRyaSBpbiB2aXgsIHF1YW5kbyB2aXZlbmRvIGFjY29tbW9kYXJlIHRlIGl1cy4gTmVjIG1lbGl1cyBmYXN0aWRpaSBjb25zdGl0dWFtIGlkLCB2aWRlcmVyIHRoZW9waHJhc3R1cyBhZCBzaXQsIGhpbmMgc2VtcGVyIHBlcmljdWxpcyBjdW0gaWQuIE5vbHVpc3NlIHBvc3R1bGFudCBhc3NlbnRpb3IgZXN0IGluLCBubyBjaG9ybyBzYWRpcHNjaW5nIHJlcHVkaWFuZGFlIHZpeC4gVmlzIGluIGV1aXNtb2QgZGVsZW5pdCBkaWduaXNzaW0uIEV4IHF1b2Qgbm9zdHJ1bSBzaXQsIHN1YXMgZGVjb3JlIGFuaW1hbCBpZCBpdXMsIG5vYmlzIHNvbGV0IGRldHJhY3RvIHF1byB0ZS4KKworeyUgY29tbWVudCAlfQorTWlnaHQgeW91IGhhdmUgYW4gaW5jbHVkZSBpbiB5b3VyIHRoZW1lPyBXaHkgbm90IHRyeSBpdCBoZXJlIQoreyUgaW5jbHVkZSBteS10aGVtZXMtZ3JlYXQtaW5jbHVkZS5odG1sICV9Cit7JSBlbmRjb21tZW50ICV9CisKK05vIGxhdWRlbSBhbHRlcmEgYWRvbGVzY2VucyBoYXMsIHZvbHVtdXMgbHVjaWxpdXMgZXVtIG5vLiBFYW0gZWkgbnVsbGEgYXVkaWFtIGVmZmljaWFudHVyLiBTdWFzIGFmZmVydCBwZXIgbm8sIGVpIHRhbGUgbmliaCBzZWEuIFNlYSBuZSBtYWduYSBoYXJ1bSwgaW4gZGVuaXF1ZSBzY3JpcHRvcmVtIHNlYSwgY2V0ZXJvIGFsaWVudW0gdGliaXF1ZSBlaSBlb3MuIExhYm9yZXMgcGVyc2VxdWVyaXMgcmVmZXJyZW50dXIgZW9zIGVpLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9leGFtcGxlL2luZGV4Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL2V4YW1wbGUvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjg4NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9leGFtcGxlL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwxNCBAQAorLS0tCitsYXlvdXQ6IHBhZ2UKKy0tLQorCitMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgcXVvIGlkIHByaW1hIGNvcnJ1bXBpdCBwZXJ0aW5hY2lhLCBpZCBpdXMgZG9sb3IgZG9sb3JlcywgYW4gdmVyaSBwZXJ0aW5heCBleHBsaWNhcmkgbWVhLiBBZ2FtIHNvbHVtIGV0IHF1aSwgaGlzIGlkIGx1ZHVzIGdyYWVjbyBhZGlwaXNjaW5nLiBEdWlzIHRoZW9waHJhc3R1cyBuYW0gaW4sIGF0IGhpcyB2aWRpc3NlIGF0b21vcnVtLiBUYW50YXMgZ2xvcmlhdHVyIHNjcmlwc2VyaXQgbmUgZW9zLiBFc3Qgd2lzaSB0ZW1wb3IgaGFiZW11cyBhdCwgZWkgZ3JhZWNvIGRpc3NlbnRpZXQgZW9zLiBOZSB1c3UgYWxpcXVpcCBzYW5jdHVzIGNvbmNlcHRhbSwgdGUgdmlzIGlnbm90YSBhbmltYWwsIG1vZHVzIGxhdGluZSBjb250ZW50aW9uZXMgaXVzIHRlLgorCit7JSBmb3IgcG9zdCBpbiBzaXRlLnBvc3RzICV9Cis8aDI+PGEgaHJlZj0ie3sgcG9zdC51cmwgfX0iPnt7IHBvc3QudGl0bGUgfX08L2E+PC9oMj4KKzxibG9ja3F1b3RlPnt7IHBvc3QuZXhjZXJwdCB9fTwvYmxvY2txdW90ZT4KK3slIGVuZGZvciAlfQorCitUZSBmYWxsaSB2ZXJpdHVzIHNlYSwgYXQgbW9sZXN0aWFlIHNjcmliZW50dXIgZGV0ZXJydWlzc2V0IHZpeCwgZXQgbWVhIHpyaWwgcGhhZWRydW0gdnVscHV0YXRlLiBObyBjdW0gZGljaXQgY29uc3VsYXR1LiBVdCBoYXMgbm9zdHJvIG5vbHVpc3NlIGV4cGV0ZW5kaXMsIHRlIHBybyBxdWFlcXVlIGRpc3B1dGFuZG8sIGV1IHNlZCBzdW1tbyBvbW5lcy4gRW9zIGF0IHRhbGUgYXBlcmlhbSwgdXN1IGN1IHByb3ByaWFlIHF1YWVzdGlvIGNvbnN0aXR1dG8sIHNlZCBhcGVyaWFtIGVycm9yaWJ1cyB0ZW1wb3JpYnVzIGFuLgorCitRdW8gZXUgbGliZXIgbWVkaW9jcml0YXRlbSwgdml4IGFuIGRlbGVjdHVzIGVsZWlmZW5kLCBpdXZhcmV0IHN1c2NpcGl0IGVpIHZlbC4gUGFydGVtIGludmVuaXJlIHBlciBhbiwgbWVhIHBvc3R1bGFudCBkaXNzZW50aWFzIGV1LCBpdXMgdGFudGFzIGF1ZGlyZSBub21pbmF2aSBldS4gRGljdW50IHRyaXRhbmkgdmVyaXR1cyBleCB2aXMsIG1laSBpbiBjYXNlIHNlbnRlbnRpYWUuIEF0IGV4ZXJjaSBkZW1vY3JpdHVtIG5hbSwgY3UgbG9ib3J0aXMgaXJhY3VuZGlhIG1laS4gQWxpYSBlbGlnZW5kaSBjb25zZWN0ZXR1ZXIgZXUgc2VkLCBwYXVsbyBkb2NlbmRpIG5vbHVpc3NlIHNpdCBleC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvZXhhbXBsZS9zdHlsZS5zY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9leGFtcGxlL3N0eWxlLnNjc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4OGY1MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvZXhhbXBsZS9zdHlsZS5zY3NzCkBAIC0wLDAgKzEsNyBAQAorLS0tCistLS0KKworLy8gSGVyZSwgeW91IGNhbiB0ZXN0IG91dCB0aGUgU2Fzcy9TQ1NTIHRoYXQgeW91IGluY2x1ZGUgaW4geW91ciB0aGVtZS4KKy8vIFNpbXBseSBgQGltcG9ydGAgdGhlIG5lY2Vzc2FyeSBmaWxlKHMpIHRvIGdldCB0aGUgcHJvcGVyIHN0eWxlcyBvbiB0aGUgc2l0ZS4KKy8vIEUuZy46CisvLyAgIEBpbXBvcnQgImEtZmlsZS1mcm9tLW15LXRoZW1lIjsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvZ2l0aWdub3JlLmVyYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC0zLjUuMi9saWIvdGhlbWVfdGVtcGxhdGUvZ2l0aWdub3JlLmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdkMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS9naXRpZ25vcmUuZXJiCkBAIC0wLDAgKzEsNSBAQAorKi5nZW0KKy5idW5kbGUKKy5zYXNzLWNhY2hlCitfc2l0ZQorR2VtZmlsZS5sb2NrCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtMy41LjIvbGliL3RoZW1lX3RlbXBsYXRlL3RoZW1lLmdlbXNwZWMuZXJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS90aGVtZS5nZW1zcGVjLmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM4ZmViCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLTMuNS4yL2xpYi90aGVtZV90ZW1wbGF0ZS90aGVtZS5nZW1zcGVjLmVyYgpAQCAtMCwwICsxLDE5IEBACisjIGNvZGluZzogdXRmLTgKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3BlY3wKKyAgc3BlYy5uYW1lICAgICAgICAgID0gPCU9IHRoZW1lX25hbWUuaW5zcGVjdCAlPgorICBzcGVjLnZlcnNpb24gICAgICAgPSAiMC4xLjAiCisgIHNwZWMuYXV0aG9ycyAgICAgICA9IFs8JT0gdXNlcl9uYW1lLmluc3BlY3QgJT5dCisgIHNwZWMuZW1haWwgICAgICAgICA9IFs8JT0gdXNlcl9lbWFpbC5pbnNwZWN0ICU+XQorCisgIHNwZWMuc3VtbWFyeSAgICAgICA9ICVxe1RPRE86IFdyaXRlIGEgc2hvcnQgc3VtbWFyeSwgYmVjYXVzZSBSdWJ5Z2VtcyByZXF1aXJlcyBvbmUufQorICBzcGVjLmhvbWVwYWdlICAgICAgPSAiVE9ETzogUHV0IHlvdXIgZ2VtJ3Mgd2Vic2l0ZSBvciBwdWJsaWMgcmVwbyBVUkwgaGVyZS4iCisgIHNwZWMubGljZW5zZSAgICAgICA9ICJNSVQiCisKKyAgc3BlYy5maWxlcyAgICAgICAgID0gYGdpdCBscy1maWxlcyAtemAuc3BsaXQoIlx4MCIpLnNlbGVjdCB7IHxmfCBmLm1hdGNoKCVye14oPCU9IHRoZW1lX2RpcmVjdG9yaWVzLmpvaW4oInwiKSAlPnxMSUNFTlNFfFJFQURNRSl9aSkgfQorCisgIHNwZWMuYWRkX3J1bnRpbWVfZGVwZW5kZW5jeSAiamVreWxsIiwgIn4+IDwlPSBqZWt5bGxfdmVyc2lvbl93aXRoX21pbm9yICU+IgorCisgIHNwZWMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgImJ1bmRsZXIiLCAifj4gMS4xMiIKKyAgc3BlYy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAicmFrZSIsICJ+PiAxMC4wIgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi8uZ2l0aWdub3JlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2EyOTBkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIwIEBACisvdmVuZG9yCisvLmJ1bmRsZS8KKy8ueWFyZG9jCisvR2VtZmlsZS5sb2NrCisvX3lhcmRvYy8KKy9jb3ZlcmFnZS8KKy9kb2MvCisvcGtnLworL3NwZWMvcmVwb3J0cy8KKy90bXAvCisqLmJ1bmRsZQorKi5zbworKi5vCisqLmEKK21rbWYubG9nCisqLmdlbQorR2VtZmlsZS5sb2NrCitzcGVjL2Rlc3QKKy5idW5kbGUKK3NwZWMvZml4dHVyZXMvLmpla3lsbC1tZXRhZGF0YQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvLnJzcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvLnJzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTY0NzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi8ucnNwZWMKQEAgLTAsMCArMSwyIEBACistLWNvbG9yCistLWZvcm1hdCBwcm9ncmVzcwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvLnJ1Ym9jb3AueW1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvLnJ1Ym9jb3AueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTU2ODAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi8ucnVib2NvcC55bWwKQEAgLTAsMCArMSwyOSBAQAoraW5oZXJpdF9nZW06CisgIGpla3lsbDogLnJ1Ym9jb3AueW1sCisKK0FsbENvcHM6CisgIFRhcmdldFJ1YnlWZXJzaW9uOiAyLjAKKyAgSW5jbHVkZToKKyAgICAtIGxpYi8qLnJiCisKKyAgRXhjbHVkZToKKyAgICAtIC5ydWJvY29wLnltbAorICAgIC0gLmNvZGVjbGltYXRlLnltbAorICAgIC0gLnRyYXZpcy55bWwKKyAgICAtIC5naXRpZ25vcmUKKyAgICAtIC5yc3BlYworCisgICAgLSBHZW1maWxlLmxvY2sKKyAgICAtIENIQU5HRUxPRy5tZAorICAgIC0gcmVhZG1lLm1kCisgICAgLSBSRUFETUUubWQKKyAgICAtIFJlYWRtZS5tZAorICAgIC0gUmVhZE1lLm1kCisgICAgLSBDT1BZSU5HCisgICAgLSBMSUNFTlNFCisKKyAgICAtIHRlc3QvKiovKgorICAgIC0gdmVuZG9yLyoqLyoKKyAgICAtIGZlYXR1cmVzLyoqLyoKKyAgICAtIHNjcmlwdC8qKi8qCisgICAgLSBzcGVjLyoqLyoKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yLy50cmF2aXMueW1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvLnRyYXZpcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0MGMwMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMjAgQEAKK2xhbmd1YWdlOiBydWJ5Citydm06CistIDIuMgorZW52OgorICBnbG9iYWw6CisgIC0gTk9LT0dJUklfVVNFX1NZU1RFTV9MSUJSQVJJRVM9dHJ1ZQorY2FjaGU6IGJ1bmRsZXIKK3N1ZG86IGZhbHNlCitiZWZvcmVfc2NyaXB0OiBidW5kbGUgdXBkYXRlCitzY3JpcHQ6ICIuL3NjcmlwdC9jaWJ1aWxkIgorbm90aWZpY2F0aW9uczoKKyAgZW1haWw6IGZhbHNlCitkZXBsb3k6CisgIHByb3ZpZGVyOiBydWJ5Z2VtcworICBhcGlfa2V5OgorICAgIHNlY3VyZTogcXowcTZ1cjBrR28wM2pqTGRvQWFrNldjRUF3eFgycjlMRzNEVnJoT3JjZm9GaXBrdVcrdXdSMGV0NHRwSzh1RnJ6MFA5eTdlVElLT2IwWENYZUlzSVhXajZSNWJlbnBSR3IyVThtOUErdEUvanh2aUJGVWF4YW9rdGUwbHFXaVgxZkV5aFJtVzN6dmNkTFE0N1ZkMkV3VE5hcTZabVB1bG1FZTlnUzByQlFnaHljbGFrR2xaMTdMSTdvR2dpTkw5U1EzMzVZcWExcUprbFRIWUhib2RXUTNaMDd2N1ZOMmp4cWkzV0g2TmFjVDVnVUdwNWlDTkNMTGE4K2pwS3I0dU9OTklveTYvZ2VBV2RxdHZnR1VFOG9UaklXRG9KYXJya25KcHFmeDlSZDBLTER6a3luZUFpZ0hEWVBXNjBRdHJFNkdHcEsvK1RGMXBGNER6ZEsyRWdUV3FHRm5aZjhlaGZueG10SFZsMlhxL0RQcjZoUzhRL2YrdXQ0aW9NekJReFBEMGhmaDgvRU9NWUtzTzhtT3VPbFlUaVpYQzdpdUd5dkZVT2wyaG5CZ1dBOTl0K0kwTk5CMDZxRnAzWnhJam9sRWMzemp6YzlmMWE1SFVYbEV1dDVWOG5xdkN3YmN0TmlUVnBUOFpFV2xzUWx5UlVucjljSU1VVEVmTGdRK3Y2RG52QUpCTU8xRUlMcTZsaUI1cWZ1dGpOaHpobFJFdDdQL1pkcHBHc0F6V3BndDBxMlBhZnFWb1BlNjJXUjMrLzhMajJFck1yMDM0eFNTcVpWTmNCUzBtYmR2VzZrM2phQUJvMVZKNFh1SG02L3lEdWVtV3pXYjdrZEc5LzE0K0lJSk1XMVZ1YVdjbW5DbkI2Z3hqa0NXM0RtMmZ0WWlON1JmbjNBVXovblU9CisgIGdlbTogamVreWxsLWZlZWQKKyAgb246CisgICAgdGFnczogdHJ1ZQorICAgIHJlcG86IGpla3lsbC9qZWt5bGwtZmVlZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvR2VtZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL0dlbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNTA0OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL0dlbWZpbGUKQEAgLTAsMCArMSw2IEBACitzb3VyY2UgJ2h0dHBzOi8vcnVieWdlbXMub3JnJworZ2Vtc3BlYworCitpZiBFTlZbIkpFS1lMTF9WRVJTSU9OIl0KKyAgZ2VtICJqZWt5bGwiLCAifj4gI3tFTlZbIkpFS1lMTF9WRVJTSU9OIl19IgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9IaXN0b3J5Lm1hcmtkb3duIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvSGlzdG9yeS5tYXJrZG93bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzYyMmNhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvSGlzdG9yeS5tYXJrZG93bgpAQCAtMCwwICsxLDk4IEBACisjIyBIRUFECisKKyMjIyBEb2N1bWVudGF0aW9uCisKKyAgKiBVc2UgYGh0dHBzYCBpbiBtb3JlIHBsYWNlcy4gKCMxNjUpCisKKyMjIyBNaW5vciBFbmhhbmNlbWVudHMKKworICAqIGZpeCA8ZW50cnk+IHRlbXBsYXRlIGZvciBwb3N0cyB3aXRoIHBvc3QubGFuZyBkZWZpbmVkICgjMTY4KQorCisjIyAwLjkuMSAvIDIwMTctMDItMTcKKworIyMjIE1pbm9yIEVuaGFuY2VtZW50cworCisgICogVXBkYXRlIGZlZWQueG1sICgjMTYyKQorCisjIyAwLjkuMCAvIDIwMTctMDItMTYKKworIyMjIE1pbm9yIEVuaGFuY2VtZW50cworCisgICogVXNlIGFic29sdXRlX3VybCB0byBnZW5lcmF0ZSB0aGUgZmVlZF9tZXRhIHVybCAoIzE1MCkKKyAgKiBNYWtlIGZlZWQgc3R5bGVzaGVldCBvcHRpb25hbCAoIzE0OSkKKyAgKiBVc2UgbmV3IGBub3JtYWxpemVfd2hpdGVzcGFjZWAgZmlsdGVyICgjMTQzKQorICAqIEZlZWQgZW50cmllcyBtdXN0IGNvbnRhaW4gPGF1dGhvcj4gKCMxNTIpCisgICogUmVtb3ZlIHRyYWlsaW5nIHNsYXNoIGZyb20gZmVlZCBJRCAoIzE1OSkKKworIyMjIERldmVsb3BtZW50IEZpeGVzCisKKyAgKiBTaW1wbGlmeSBtaW5pZnkgcmVndWxhciBleHByZXNzaW9uICgjMTQxKQorICAqIE5hbWVzcGFjZSBhcyBKZWt5bGxGZWVkICgjMTUxKQorICAqIHJ1Ym9jb3AgLWEgKCMxNjApCisKKyMjIyBCdWcgRml4ZXMKKworICAqIEZpbHRlciBvdXQgZHJhZnRzIGJlZm9yZSBsaW1pdCAoIzE1NCkKKworIyMgMC44LjAgLyAyMDE2LTEwLTA2CisKKyAgKiBVc2UgZmlsdGVycyB0byBjbGVhbiB1cCBMaXF1aWQgdGVtcGxhdGUgKCMxMzQpCisKKyMjIyBNaW5vciBFbmhhbmNlbWVudHMKKworICAqIERvbid0IHNldCBAc2l0ZS5jb25maWdbInRpbWUiXSBvbiBmZWVkIGdlbmVyYXRpb24gKCMxMzgpCisKKyMjIyBwZWRhbnRyeQorCisgICogQXBwZWFzZSBSdWJvY29wICgjMTM5KQorCisjIyAwLjcuMiAvIDIwMTYtMTAtMDYKKworICAqIFN1cHBvcnQgYGltYWdlLnBhdGhgIHdoZW4gYHBvc3QuaW1hZ2VgIGlzIGFuIG9iamVjdCAoIzEzNykKKworIyMgMC43LjEgLyAyMDE2LTA5LTI2CisKKyAgKiBBc3NpZ24gYHVybF9iYXNlYCBiZWZvcmUgZmlyc3QgdXNhZ2UgKCMxMzMpCisKKyMjIDAuNy4wIC8gMjAxNi0wOS0wNgorCisgICogVXNlIHR5cGU9Imh0bWwiIHRvIHNraXJ0IGFyb3VuZCBkb3VibGUgZXNjYXBpbmcgcHJvYmxlbSAoIzEyNykKKworIyMgMC42LjAgLyAyMDE2LTA3LTA4CisKKyAgKiBDbGVhbnVwIGBwb3N0X2F1dGhvcmAgbG9naWMgKCMxMTMpCisgICogQWRkIFhNTCBzdHlsZXNoZWV0IGV4YW1wbGUgd2l0aCBYU0xUICgjMTE5KQorICAqIERSWSB1cCBhbmQgYWRkIG1vcmUgZG9jICgjMTIwKQorICAqIFVzZSBzbWFydGlmeSBmaWx0ZXIgKCMxMTcpCisKKyMjIDAuNS4xIC8gMjAxNi0wNC0xOAorCisgICogRml4IG1hbmdsaW5nIG9mIHdoaXRlc3BhY2Ugd2hlbiBgc2l0ZS5sYW5nYCBpcyBzZXQgKCMxMTApCisKKyMjIDAuNS4wIC8gMjAxNi0wNC0xMworCisgICogQ29uc29saWRhdGUgcmVnZXhwcyBmb3Igc3RyaXBwaW5nIHdoaXRlc3BhY2UgKCM4MikKKyAgKiBPbmx5IHRlc3QgYWdhaW5zdCBKZWt5bGwgMyAoIzk5KQorICAqIFRoaW5rIGFib3V0IGhvdyBpMThuIG1pZ2h0IHdvcmsgKCM3NSkKKyAgKiBGaW5kIGF1dGhvciBieSByZWZlcmVuY2UgKCMxMDYpCisgICogRHJvcCBzdXBwb3J0IGZvciBKZWt5bGwgMiAoIzEwNSkKKyAgKiBBZGQgc3VwcG9ydCBmb3IgcG9zdCBpbWFnZSAoIzEwNCkKKworIyMjIE1pbm9yIEVuaGFuY2VtZW50cworCisgICogVXNlIE1vZHVsZSNtZXRob2RfZGVmaW5lZD8gKCM4MykKKyAgKiBVc2Ugc2l0ZS50aXRsZSBmb3IgbWV0YSB0YWcgaWYgYXZhaWxhYmxlICgjMTAwKQorCisjIyMgRGV2ZWxvcG1lbnQgRml4ZXMKKworICAqIERvIG5vdCByZXF1aXJlIFsqKmpla3lsbC1sYXN0LW1vZGlmaWVkLWF0KipdKGh0dHBzOi8vZ2l0aHViLmNvbS9nanRvcmlraWFuL2pla3lsbC1sYXN0LW1vZGlmaWVkLWF0KSBpbiB0ZXN0cyAoIzg3KQorICAqIEFkZCBSdWJvY29wICgjODEpCisgICogQ29ycmVjdCB0eXBvIGluIHRlc3RzICgjMTAyKQorICAqIFNpbXBsaWZ5IHRlc3RpbmcgZmVlZF9tZXRhIHRhZyAoIzEwMSkKKyAgKiBRdWlldCBrbm93biB3YXJuaW5ncyBpbiB0ZXN0cyAoIzEwMykKKworIyMgMC40LjAgLyAyMDE1LTEyLTMwCisKKyAgKiBGZWVkIHVzZXMgYHNpdGUudGl0bGVgLCBvciBgc2l0ZS5uYW1lYCBpZiBgdGl0bGVgIGRvZXNuJ3QgZXhpc3QgKCM3MikKKyAgKiBSZXBsYWNlIG5ld2xpbmVzIHdpdGggc3BhY2VzIGluIGB0aXRsZWAgYW5kIGBzdW1tYXJ5YCBlbGVtZW50cyAoIzY3KQorICAqIFByb3Blcmx5IHJlbmRlciBwb3N0IGNvbnRlbnQgd2l0aCBKZWt5bGwgKCM3MykKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL0xJQ0VOU0UudHh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxNzY4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjIgQEAKK0NvcHlyaWdodCAoYykgMjAxNSBCZW4gQmFsdGVyCisKK01JVCBMaWNlbnNlCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDc1YzJiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTM5IEBACisjIEpla3lsbCBGZWVkIHBsdWdpbgorCitBIEpla3lsbCBwbHVnaW4gdG8gZ2VuZXJhdGUgYW4gQXRvbSAoUlNTLWxpa2UpIGZlZWQgb2YgeW91ciBKZWt5bGwgcG9zdHMKKworWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvamVreWxsL2pla3lsbC1mZWVkLnN2ZyldKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9qZWt5bGwvamVreWxsLWZlZWQpIFshW0dlbSBWZXJzaW9uXShodHRwczovL2JhZGdlLmZ1cnkuaW8vcmIvamVreWxsLWZlZWQuc3ZnKV0oaHR0cHM6Ly9iYWRnZS5mdXJ5LmlvL3JiL2pla3lsbC1mZWVkKQorCisjIyBJbnN0YWxsYXRpb24KKworQWRkIHRoaXMgbGluZSB0byB5b3VyIHNpdGUncyBHZW1maWxlOgorCitgYGBydWJ5CitnZW0gJ2pla3lsbC1mZWVkJworYGBgCisKK0FuZCB0aGVuIGFkZCB0aGlzIGxpbmUgdG8geW91ciBzaXRlJ3MgYF9jb25maWcueW1sYDoKKworYGBgeW1sCitnZW1zOgorICAtIGpla3lsbC1mZWVkCitgYGAKKworIyMgVXNhZ2UKKworVGhlIHBsdWdpbiB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gQXRvbSBmZWVkIGF0IGAvZmVlZC54bWxgLgorCisjIyMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zCisKK1RoZSBwbHVnaW4gd2lsbCBhdXRvbWF0aWNhbGx5IHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgcHJlc2VudCBpbiB5b3VyIHNpdGUncyBgX2NvbmZpZy55bWxgIGZpbGUuCisKKyogYHRpdGxlYCBvciBgbmFtZWAgLSBUaGUgdGl0bGUgb2YgdGhlIHNpdGUsIGUuZy4sICJNeSBhd2Vzb21lIHNpdGUiCisqIGBkZXNjcmlwdGlvbmAgLSBBIGxvbmdlciBkZXNjcmlwdGlvbiBvZiB3aGF0IHlvdXIgc2l0ZSBpcyBhYm91dCwgZS5nLiwgIldoZXJlIEkgYmxvZyBhYm91dCBKZWt5bGwgYW5kIG90aGVyIGF3ZXNvbWUgdGhpbmdzIgorKiBgdXJsYCAtIFRoZSBVUkwgdG8geW91ciBzaXRlLCBlLmcuLCBgaHR0cDovL2V4YW1wbGUuY29tYC4gSWYgbm9uZSBpcyBwcm92aWRlZCwgdGhlIHBsdWdpbiB3aWxsIHRyeSB0byB1c2UgYHNpdGUuZ2l0aHViLnVybGAuCisqIGBhdXRob3JgIC0gR2xvYmFsIGF1dGhvciBpbmZvcm1hdGlvbiAoc2VlIGJlbG93KQorCisjIyMgQWxyZWFkeSBoYXZlIGEgZmVlZCBwYXRoPworCitEbyB5b3UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIGZlZWQgc29tZXBsYWNlIG90aGVyIHRoYW4gYC9mZWVkLnhtbGAsIGJ1dCBhcmUgb24gYSBob3N0IGxpa2UgR2l0SHViIFBhZ2VzIHRoYXQgZG9lc24ndCBzdXBwb3J0IG1hY2hpbmUtZnJpZW5kbHkgcmVkaXJlY3RzPyBJZiB5b3Ugc2ltcGx5IHN3YXAgb3V0IGBqZWt5bGwtZmVlZGAgZm9yIHlvdXIgZXhpc3RpbmcgdGVtcGxhdGUsIHlvdXIgZXhpc3Rpbmcgc3Vic2NyaWJlcnMgd29uJ3QgY29udGludWUgdG8gZ2V0IHVwZGF0ZXMuIEluc3RlYWQsIHlvdSBjYW4gc3BlY2lmeSBhIG5vbi1kZWZhdWx0IHBhdGggdmlhIHlvdXIgc2l0ZSdzIGNvbmZpZy4KKworYGBgeW1sCitmZWVkOgorICBwYXRoOiBhdG9tLnhtbAorYGBgCisKK1RvIG5vdGUsIHlvdSBzaG91bGRuJ3QgaGF2ZSB0byBkbyB0aGlzIHVubGVzcyB5b3UgYWxyZWFkeSBoYXZlIGEgZmVlZCB5b3UncmUgdXNpbmcsIGFuZCB5b3UgY2FuJ3Qgb3Igd2lzaCBub3QgdG8gcmVkaXJlY3QgZXhpc3Rpbmcgc3Vic2NyaWJlcnMuCisKKyMjIyBPcHRpb25hbCBmcm9udCBtYXR0ZXIKKworVGhlIHBsdWdpbiB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIHBvc3QgbWV0YWRhdGEsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IEpla3lsbCwgd2hpY2ggeW91IGNhbiBvdmVycmlkZSB2aWEgYSBwb3N0J3MgWUFNTCBmcm9udCBtYXR0ZXI6CisKKyogYGRhdGVgCisqIGB0aXRsZWAKKyogYGV4Y2VycHRgCisqIGBpZGAKKyogYGNhdGVnb3J5YAorKiBgdGFnc2AKKworQWRkaXRpb25hbGx5LCB0aGUgcGx1Z2luIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgdmFsdWVzLCBpZiBwcmVzZW50IGluIGEgcG9zdCdzIFlBTUwgZnJvbnQgbWF0dGVyOgorCisqIGBpbWFnZWAgLSBVUkwgb2YgYW4gaW1hZ2UgdGhhdCBpcyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgcG9zdCAoY2FuIGFsc28gYmUgcGFzc2VkIGFzIGBpbWFnZS5wYXRoYCkKKworKiBgYXV0aG9yYCAtIFRoZSBhdXRob3Igb2YgdGhlIHBvc3QsIGUuZy4sICJEci4gSmVreWxsIi4gSWYgbm9uZSBpcyBnaXZlbiwgZmVlZCByZWFkZXJzIHdpbGwgbG9vayB0byB0aGUgZmVlZCBhdXRob3IgYXMgZGVmaW5lZCBpbiBgX2NvbmZpZy55bWxgLiBMaWtlIHRoZSBmZWVkIGF1dGhvciwgdGhpcyBjYW4gYWxzbyBiZSBhbiBvYmplY3Qgb3IgYSByZWZlcmVuY2UgdG8gYW4gYXV0aG9yIGluIGBfZGF0YS9hdXRob3JzLnltbGAgKHNlZSBiZWxvdykuCisKKyMjIyBBdXRob3IgaW5mb3JtYXRpb24KKworKlRMO0RSOiBJbiBtb3N0IGNhc2VzLCBwdXQgYGF1dGhvcjogW3lvdXIgbmFtZV1gIGluIHRoZSBkb2N1bWVudCdzIGZyb250IG1hdHRlciwgZm9yIHNpdGVzIHdpdGggbXVsdGlwbGUgYXV0aG9ycy4gSWYgeW91IG5lZWQgc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQsIHJlYWQgb24uKgorCitUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGNvbnZleSBhdXRob3Itc3BlY2lmaWMgaW5mb3JtYXRpb24uIEF1dGhvciBpbmZvcm1hdGlvbiBpcyBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIG9mIHByaW9yaXR5OgorCisxLiBBbiBgYXV0aG9yYCBvYmplY3QsIGluIHRoZSBkb2N1bWVudHMncyBmcm9udCBtYXR0ZXIsIGUuZy46CisKKyAgYGBgeW1sCisgIGF1dGhvcjoKKyAgICB0d2l0dGVyOiBiZW5iYWx0ZXIKKyAgYGBgCisKKzIuIEFuIGBhdXRob3JgIG9iamVjdCwgaW4gdGhlIHNpdGUncyBgX2NvbmZpZy55bWxgLCBlLmcuOgorCisgIGBgYHltbAorICBhdXRob3I6CisgICAgdHdpdHRlcjogYmVuYmFsdGVyCisgIGBgYAorCiszLiBgc2l0ZS5kYXRhLmF1dGhvcnNbYXV0aG9yXWAsIGlmIGFuIGF1dGhvciBpcyBzcGVjaWZpZWQgaW4gdGhlIGRvY3VtZW50J3MgZnJvbnQgbWF0dGVyLCBhbmQgYSBjb3JyZXNwb25kaW5nIGtleSBleGlzdHMgaW4gYHNpdGUuZGF0YS5hdXRob3JzYC4gRS5nLiwgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgZG9jdW1lbnQncyBmcm9udCBtYXR0ZXI6CisKKyAgYGBgeW1sCisgIGF1dGhvcjogYmVuYmFsdGVyCisgIGBgYAorCisgIEFuZCB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGluIGBfZGF0YS9hdXRob3JzLnltbGA6CisKKyAgYGBgeW1sCisgIGJlbmJhbHRlcjoKKyAgICBwaWN0dXJlOiAvaW1nL2JlbmJhbHRlci5wbmcKKyAgICB0d2l0dGVyOiBqZWt5bGxyYgorCisgIHBvdHVzOgorICAgIHBpY3R1cmU6IC9pbWcvcG90dXMucG5nCisgICAgdHdpdHRlcjogd2hpdGVob3VzZQorICBgYGAKKworICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGF1dGhvciBgYmVuYmFsdGVyYCdzIFR3aXR0ZXIgaGFuZGxlIHdpbGwgYmUgcmVzb2x2ZWQgdG8gYEBqZWt5bGxyYmAuIFRoaXMgYWxsb3dzIHlvdSB0byBjZW50cmFsaXplIGF1dGhvciBpbmZvcm1hdGlvbiBpbiBhIHNpbmdsZSBgX2RhdGEvYXV0aG9yc2AgZmlsZSBmb3Igc2l0ZSB3aXRoIG1hbnkgYXV0aG9ycyB0aGF0IHJlcXVpcmUgbW9yZSB0aGFuIGp1c3QgdGhlIGF1dGhvcidzIHVzZXJuYW1lLgorCisgICpQcm8tdGlwOiBJZiBgYXV0aG9yc2AgaXMgcHJlc2VudCBpbiB0aGUgZG9jdW1lbnQncyBmcm9udCBtYXR0ZXIgYXMgYW4gYXJyYXkgKGFuZCBgYXV0aG9yYCBpcyBub3QpLCB0aGUgcGx1Z2luIHdpbGwgdXNlIHRoZSBmaXJzdCBhdXRob3IgbGlzdGVkLioKKworNC4gQW4gYXV0aG9yIGluIHRoZSBkb2N1bWVudCdzIGZyb250IG1hdHRlciAodGhlIHNpbXBsZXN0IHdheSksIGUuZy46CisKKyAgYGBgeW1sCisgIGF1dGhvcjogYmVuYmFsdGVyCisgIGBgYAorCis1LiBBbiBhdXRob3IgaW4gdGhlIHNpdGUncyBgX2NvbmZpZy55bWxgLCBlLmcuOgorCisgIGBgYHltbAorICBhdXRob3I6IGJlbmJhbHRlcgorICBgYGAKKworIyMjIE1ldGEgdGFncworCitUaGUgcGx1Z2luIGV4cG9zZXMgYSBoZWxwZXIgdGFnIHRvIGV4cG9zZSB0aGUgYXBwcm9wcmlhdGUgbWV0YSB0YWdzIHRvIHN1cHBvcnQgYXV0b21hdGVkIGRpc2NvdmVyeSBvZiB5b3VyIGZlZWQuIFNpbXBseSBwbGFjZSBgeyUgZmVlZF9tZXRhICV9YCBzb21lcGxhY2UgaW4geW91ciB0ZW1wbGF0ZSdzIGA8aGVhZD5gIHNlY3Rpb24sIHRvIG91dHB1dCB0aGUgbmVjZXNzYXJ5IG1ldGFkYXRhLgorCisjIyMgU21hcnR5UGFudHMKKworVGhlIHBsdWdpbiB1c2VzIFtKZWt5bGwncyBgc21hcnRpZnlgIGZpbHRlcl0oaHR0cHM6Ly9qZWt5bGxyYi5jb20vZG9jcy90ZW1wbGF0ZXMvKSBmb3IgcHJvY2Vzc2luZyB0aGUgc2l0ZSB0aXRsZSBhbmQgcG9zdCB0aXRsZXMuIFRoaXMgd2lsbCB0cmFuc2xhdGUgcGxhaW4gQVNDSUkgcHVuY3R1YXRpb24gaW50byAic21hcnQiIHR5cG9ncmFwaGljIHB1bmN0dWF0aW9uLiBUaGlzIHdpbGwgbm90IHJlbmRlciBvciBzdHJpcCBhbnkgTWFya2Rvd24geW91IG1heSBiZSB1c2luZyBpbiBhIHRpdGxlLgorCisjIyMgQ3VzdG9tIHN0eWxpbmcKKworV2FudCB0byBzdHlsZSB3aGF0IHlvdXIgZmVlZCBsb29rcyBsaWtlIGluIHRoZSBicm93c2VyPyBTaW1wbHkgYWRkIGFuIFhTTFQgYXQgYC9mZWVkLnhzbHQueG1sYCBhbmQgSmVreWxsIEZlZWQgd2lsbCBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0LgorCisjIyBXaHkgQXRvbSwgYW5kIG5vdCBSU1M/CisKK0dyZWF0IHF1ZXN0aW9uLiBJbiBzaG9ydCwgQXRvbSBpcyBhIGJldHRlciBmb3JtYXQuIFRoaW5rIG9mIGl0IGxpa2UgUlNTIDMuMC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbdGhpcyBkaXNjdXNzaW9uIG9uIHdoeSB3ZSBjaG9zZSBBdG9tIG92ZXIgUlNTIDIuMF0oaHR0cHM6Ly9naXRodWIuY29tL2pla3lsbC9qZWt5bGwtcnNzLWZlZWQvaXNzdWVzLzIpLgorCisjIyBDb250cmlidXRpbmcKKworMS4gRm9yayBpdCAoaHR0cHM6Ly9naXRodWIuY29tL2pla3lsbC9qZWt5bGwtZmVlZC9mb3JrKQorMi4gQ3JlYXRlIHlvdXIgZmVhdHVyZSBicmFuY2ggKGBnaXQgY2hlY2tvdXQgLWIgbXktbmV3LWZlYXR1cmVgKQorMy4gQ29tbWl0IHlvdXIgY2hhbmdlcyAoYGdpdCBjb21taXQgLWFtICdBZGQgc29tZSBmZWF0dXJlJ2ApCis0LiBQdXNoIHRvIHRoZSBicmFuY2ggKGBnaXQgcHVzaCBvcmlnaW4gbXktbmV3LWZlYXR1cmVgKQorNS4gQ3JlYXRlIGEgbmV3IFB1bGwgUmVxdWVzdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvUmFrZWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9SYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzU0ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvUmFrZWZpbGUKQEAgLTAsMCArMSw2IEBACityZXF1aXJlICJidW5kbGVyL2dlbV90YXNrcyIKK3JlcXVpcmUgJ3JzcGVjL2NvcmUvcmFrZV90YXNrJworCitSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3KDpzcGVjKQorCit0YXNrIDpkZWZhdWx0ID0+IDpzcGVjCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9qZWt5bGwtZmVlZC5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvamVreWxsLWZlZWQuZ2Vtc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzRkZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvamVreWxsLWZlZWQuZ2Vtc3BlYwpAQCAtMCwwICsxLDI1IEBACisjIGNvZGluZzogdXRmLTgKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3BlY3wKKyAgc3BlYy5uYW1lICAgICAgICAgID0gImpla3lsbC1mZWVkIgorICBzcGVjLnZlcnNpb24gICAgICAgPSAiMC45LjIiCisgIHNwZWMuYXV0aG9ycyAgICAgICA9IFsiQmVuIEJhbHRlciJdCisgIHNwZWMuZW1haWwgICAgICAgICA9IFsiYmVuLmJhbHRlckBnaXRodWIuY29tIl0KKyAgc3BlYy5zdW1tYXJ5ICAgICAgID0gIkEgSmVreWxsIHBsdWdpbiB0byBnZW5lcmF0ZSBhbiBBdG9tIGZlZWQgb2YgeW91ciBKZWt5bGwgcG9zdHMiCisgIHNwZWMuaG9tZXBhZ2UgICAgICA9ICJodHRwczovL2dpdGh1Yi5jb20vamVreWxsL2pla3lsbC1mZWVkIgorICBzcGVjLmxpY2Vuc2UgICAgICAgPSAiTUlUIgorCisgIHNwZWMuZmlsZXMgICAgICAgICA9IGBnaXQgbHMtZmlsZXMgLXpgLnNwbGl0KCJceDAiKQorICBzcGVjLmV4ZWN1dGFibGVzICAgPSBzcGVjLmZpbGVzLmdyZXAoJXJ7XmJpbi99KSB7IHxmfCBGaWxlLmJhc2VuYW1lKGYpIH0KKyAgc3BlYy50ZXN0X2ZpbGVzICAgID0gc3BlYy5maWxlcy5ncmVwKCVye14odGVzdHxzcGVjfGZlYXR1cmVzKS99KQorICBzcGVjLnJlcXVpcmVfcGF0aHMgPSBbImxpYiJdCisKKyAgc3BlYy5hZGRfZGVwZW5kZW5jeSAiamVreWxsIiwgIn4+IDMuMyIKKworICBzcGVjLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJidW5kbGVyIiwgIn4+IDEuNiIKKyAgc3BlYy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAicmFrZSIsICJ+PiAxMC4wIgorICBzcGVjLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJyc3BlYyIsICJ+PiAzLjAiCisgIHNwZWMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInR5cGhvZXVzIiwgIn4+IDAuNyIKKyAgc3BlYy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAibm9rb2dpcmkiLCAifj4gMS42IgorICBzcGVjLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJydWJvY29wIgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9saWIvamVreWxsLWZlZWQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9saWIvamVreWxsLWZlZWQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxMzc2NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL2xpYi9qZWt5bGwtZmVlZC5yYgpAQCAtMCwwICsxLDEwIEBACityZXF1aXJlICJqZWt5bGwiCityZXF1aXJlICJmaWxldXRpbHMiCityZXF1aXJlICJqZWt5bGwtZmVlZC9nZW5lcmF0b3IiCisKK21vZHVsZSBKZWt5bGxGZWVkCisgIGF1dG9sb2FkIDpNZXRhVGFnLCAgICAgICAgICAiamVreWxsLWZlZWQvbWV0YS10YWciCisgIGF1dG9sb2FkIDpQYWdlV2l0aG91dEFGaWxlLCAiamVreWxsLWZlZWQvcGFnZS13aXRob3V0LWEtZmlsZS5yYiIKK2VuZAorCitMaXF1aWQ6OlRlbXBsYXRlLnJlZ2lzdGVyX3RhZyAiZmVlZF9tZXRhIiwgSmVreWxsRmVlZDo6TWV0YVRhZwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvbGliL2pla3lsbC1mZWVkL2ZlZWQueG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvbGliL2pla3lsbC1mZWVkL2ZlZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDc3MGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9saWIvamVreWxsLWZlZWQvZmVlZC54bWwKQEAgLTAsMCArMSw4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KK3slIGlmIHBhZ2UueHNsICV9CisgIDw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94bWwiIGhyZWY9Int7ICcvZmVlZC54c2x0LnhtbCcgfCBhYnNvbHV0ZV91cmwgfX0iPz4KK3slIGVuZGlmICV9Cis8ZmVlZCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB7JSBpZiBzaXRlLmxhbmcgJX14bWw6bGFuZz0ie3sgc2l0ZS5sYW5nIH19InslIGVuZGlmICV9PgorICA8Z2VuZXJhdG9yIHVyaT0iaHR0cHM6Ly9qZWt5bGxyYi5jb20vIiB2ZXJzaW9uPSJ7eyBqZWt5bGwudmVyc2lvbiB9fSI+SmVreWxsPC9nZW5lcmF0b3I+CisgIDxsaW5rIGhyZWY9Int7IHBhZ2UudXJsIHwgYWJzb2x1dGVfdXJsIH19IiByZWw9InNlbGYiIHR5cGU9ImFwcGxpY2F0aW9uL2F0b20reG1sIiAvPgorICA8bGluayBocmVmPSJ7eyAnLycgfCBhYnNvbHV0ZV91cmwgfX0iIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiIHslIGlmIHNpdGUubGFuZyAlfWhyZWZsYW5nPSJ7eyBzaXRlLmxhbmcgfX0iIHslIGVuZGlmICV9Lz4KKyAgPHVwZGF0ZWQ+e3sgc2l0ZS50aW1lIHwgZGF0ZV90b194bWxzY2hlbWEgfX08L3VwZGF0ZWQ+CisgIDxpZD57eyAnLycgfCBhYnNvbHV0ZV91cmwgfCB4bWxfZXNjYXBlIH19PC9pZD4KKworICB7JSBpZiBzaXRlLnRpdGxlICV9CisgICAgPHRpdGxlIHR5cGU9Imh0bWwiPnt7IHNpdGUudGl0bGUgfCBzbWFydGlmeSB8IHhtbF9lc2NhcGUgfX08L3RpdGxlPgorICB7JSBlbHNpZiBzaXRlLm5hbWUgJX0KKyAgICA8dGl0bGUgdHlwZT0iaHRtbCI+e3sgc2l0ZS5uYW1lIHwgc21hcnRpZnkgfCB4bWxfZXNjYXBlIH19PC90aXRsZT4KKyAgeyUgZW5kaWYgJX0KKworICB7JSBpZiBzaXRlLmRlc2NyaXB0aW9uICV9CisgICAgPHN1YnRpdGxlPnt7IHNpdGUuZGVzY3JpcHRpb24gfCB4bWxfZXNjYXBlIH19PC9zdWJ0aXRsZT4KKyAgeyUgZW5kaWYgJX0KKworICB7JSBpZiBzaXRlLmF1dGhvciAlfQorICAgIDxhdXRob3I+CisgICAgICAgIDxuYW1lPnt7IHNpdGUuYXV0aG9yLm5hbWUgfCBkZWZhdWx0OiBzaXRlLmF1dGhvciB8IHhtbF9lc2NhcGUgfX08L25hbWU+CisgICAgICB7JSBpZiBzaXRlLmF1dGhvci5lbWFpbCAlfQorICAgICAgICA8ZW1haWw+e3sgc2l0ZS5hdXRob3IuZW1haWwgfCB4bWxfZXNjYXBlIH19PC9lbWFpbD4KKyAgICAgIHslIGVuZGlmICV9CisgICAgICB7JSBpZiBzaXRlLmF1dGhvci51cmkgJX0KKyAgICAgICAgPHVyaT57eyBzaXRlLmF1dGhvci51cmkgfCB4bWxfZXNjYXBlIH19PC91cmk+CisgICAgICB7JSBlbmRpZiAlfQorICAgIDwvYXV0aG9yPgorICB7JSBlbmRpZiAlfQorCisgIHslIGFzc2lnbiBwb3N0cyA9IHNpdGUucG9zdHMgfCB3aGVyZV9leHA6ICJwb3N0IiwgInBvc3QuZHJhZnQgIT0gdHJ1ZSIgJX0KKyAgeyUgZm9yIHBvc3QgaW4gcG9zdHMgbGltaXQ6IDEwICV9CisgICAgPGVudHJ5eyUgaWYgcG9zdC5sYW5nICV9e3siICJ9fXhtbDpsYW5nPSJ7eyBwb3N0LmxhbmcgfX0ieyUgZW5kaWYgJX0+CisgICAgICA8dGl0bGUgdHlwZT0iaHRtbCI+e3sgcG9zdC50aXRsZSB8IHNtYXJ0aWZ5IHwgc3RyaXBfaHRtbCB8IG5vcm1hbGl6ZV93aGl0ZXNwYWNlIHwgeG1sX2VzY2FwZSB9fTwvdGl0bGU+CisgICAgICA8bGluayBocmVmPSJ7eyBwb3N0LnVybCB8IGFic29sdXRlX3VybCB9fSIgcmVsPSJhbHRlcm5hdGUiIHR5cGU9InRleHQvaHRtbCIgdGl0bGU9Int7IHBvc3QudGl0bGUgfCB4bWxfZXNjYXBlIH19IiAvPgorICAgICAgPHB1Ymxpc2hlZD57eyBwb3N0LmRhdGUgfCBkYXRlX3RvX3htbHNjaGVtYSB9fTwvcHVibGlzaGVkPgorICAgICAgPHVwZGF0ZWQ+e3sgcG9zdC5sYXN0X21vZGlmaWVkX2F0IHwgZGVmYXVsdDogcG9zdC5kYXRlIHwgZGF0ZV90b194bWxzY2hlbWEgfX08L3VwZGF0ZWQ+CisgICAgICA8aWQ+e3sgcG9zdC5pZCB8IGFic29sdXRlX3VybCB8IHhtbF9lc2NhcGUgfX08L2lkPgorICAgICAgPGNvbnRlbnQgdHlwZT0iaHRtbCIgeG1sOmJhc2U9Int7IHBvc3QudXJsIHwgYWJzb2x1dGVfdXJsIHwgeG1sX2VzY2FwZSB9fSI+e3sgcG9zdC5jb250ZW50IHwgc3RyaXAgfCB4bWxfZXNjYXBlIH19PC9jb250ZW50PgorCisgICAgICB7JSBhc3NpZ24gcG9zdF9hdXRob3IgPSBwb3N0LmF1dGhvciB8IGRlZmF1bHQ6IHBvc3QuYXV0aG9yc1swXSB8IGRlZmF1bHQ6IHNpdGUuYXV0aG9yICV9CisgICAgICB7JSBhc3NpZ24gcG9zdF9hdXRob3IgPSBzaXRlLmRhdGEuYXV0aG9yc1twb3N0X2F1dGhvcl0gfCBkZWZhdWx0OiBwb3N0X2F1dGhvciAlfQorICAgICAgeyUgYXNzaWduIHBvc3RfYXV0aG9yX2VtYWlsID0gcG9zdF9hdXRob3IuZW1haWwgfCBkZWZhdWx0OiBuaWwgJX0KKyAgICAgIHslIGFzc2lnbiBwb3N0X2F1dGhvcl91cmkgPSBwb3N0X2F1dGhvci51cmkgfCBkZWZhdWx0OiBuaWwgJX0KKyAgICAgIHslIGFzc2lnbiBwb3N0X2F1dGhvcl9uYW1lID0gcG9zdF9hdXRob3IubmFtZSB8IGRlZmF1bHQ6IHBvc3RfYXV0aG9yICV9CisKKyAgICAgIDxhdXRob3I+CisgICAgICAgICAgPG5hbWU+e3sgcG9zdF9hdXRob3JfbmFtZSB8IGRlZmF1bHQ6ICIiIHwgeG1sX2VzY2FwZSB9fTwvbmFtZT4KKyAgICAgICAgeyUgaWYgcG9zdF9hdXRob3JfZW1haWwgJX0KKyAgICAgICAgICA8ZW1haWw+e3sgcG9zdF9hdXRob3JfZW1haWwgfCB4bWxfZXNjYXBlIH19PC9lbWFpbD4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgeyUgaWYgcG9zdF9hdXRob3JfdXJpICV9CisgICAgICAgICAgPHVyaT57eyBwb3N0X2F1dGhvcl91cmkgfCB4bWxfZXNjYXBlIH19PC91cmk+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgICA8L2F1dGhvcj4KKworICAgICAgeyUgaWYgcG9zdC5jYXRlZ29yeSAlfQorICAgICAgICA8Y2F0ZWdvcnkgdGVybT0ie3sgcG9zdC5jYXRlZ29yeSB8IHhtbF9lc2NhcGUgfX0iIC8+CisgICAgICB7JSBlbmRpZiAlfQorCisgICAgICB7JSBmb3IgdGFnIGluIHBvc3QudGFncyAlfQorICAgICAgICA8Y2F0ZWdvcnkgdGVybT0ie3sgdGFnIHwgeG1sX2VzY2FwZSB9fSIgLz4KKyAgICAgIHslIGVuZGZvciAlfQorCisgICAgICB7JSBpZiBwb3N0LmV4Y2VycHQgYW5kIHBvc3QuZXhjZXJwdCAhPSBlbXB0eSAlfQorICAgICAgICA8c3VtbWFyeSB0eXBlPSJodG1sIj57eyBwb3N0LmV4Y2VycHQgfCBzdHJpcF9odG1sIHwgbm9ybWFsaXplX3doaXRlc3BhY2UgfCB4bWxfZXNjYXBlIH19PC9zdW1tYXJ5PgorICAgICAgeyUgZW5kaWYgJX0KKworICAgICAgeyUgYXNzaWduIHBvc3RfaW1hZ2UgPSBwb3N0LmltYWdlLnBhdGggfCBkZWZhdWx0OiBwb3N0LmltYWdlICV9CisgICAgICB7JSBpZiBwb3N0X2ltYWdlICV9CisgICAgICAgIHslIHVubGVzcyBwb3N0X2ltYWdlIGNvbnRhaW5zICI6Ly8iICV9CisgICAgICAgICAgeyUgYXNzaWduIHBvc3RfaW1hZ2UgPSBwb3N0X2ltYWdlIHwgYWJzb2x1dGVfdXJsIHwgeG1sX2VzY2FwZSAgJX0KKyAgICAgICAgeyUgZW5kdW5sZXNzICV9CisgICAgICAgIDxtZWRpYTp0aHVtYm5haWwgeG1sbnM6bWVkaWE9Imh0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvIiB1cmw9Int7IHBvc3RfaW1hZ2UgfX0iIC8+CisgICAgICB7JSBlbmRpZiAlfQorICAgIDwvZW50cnk+CisgIHslIGVuZGZvciAlfQorPC9mZWVkPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvbGliL2pla3lsbC1mZWVkL2dlbmVyYXRvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL2xpYi9qZWt5bGwtZmVlZC9nZW5lcmF0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmMzRlZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL2xpYi9qZWt5bGwtZmVlZC9nZW5lcmF0b3IucmIKQEAgLTAsMCArMSw1NSBAQAorbW9kdWxlIEpla3lsbEZlZWQKKyAgY2xhc3MgR2VuZXJhdG9yIDwgSmVreWxsOjpHZW5lcmF0b3IKKyAgICBzYWZlIHRydWUKKyAgICBwcmlvcml0eSA6bG93ZXN0CisKKyAgICAjIE1haW4gcGx1Z2luIGFjdGlvbiwgY2FsbGVkIGJ5IEpla3lsbC1jb3JlCisgICAgZGVmIGdlbmVyYXRlKHNpdGUpCisgICAgICBAc2l0ZSA9IHNpdGUKKyAgICAgIHJldHVybiBpZiBmaWxlX2V4aXN0cz8oZmVlZF9wYXRoKQorICAgICAgQHNpdGUucGFnZXMgPDwgY29udGVudF9mb3JfZmlsZShmZWVkX3BhdGgsIGZlZWRfc291cmNlX3BhdGgpCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICAjIE1hdGNoZXMgYWxsIHdoaXRlc3BhY2UgdGhhdCBmb2xsb3dzCisgICAgIyAgIDEuIEEgJz4nLCB3aGljaCBjbG9zZXMgYW4gWE1MIHRhZyBvcgorICAgICMgICAyLiBBICd9Jywgd2hpY2ggY2xvc2VzIGEgTGlxdWlkIHRhZworICAgICMgV2Ugd2lsbCBzdHJpcCBhbGwgb2YgdGhpcyB3aGl0ZXNwYWNlIHRvIG1pbmlmeSB0aGUgdGVtcGxhdGUKKyAgICBNSU5JRllfUkVHRVggPSAlciEoPzw9Pnx9KVxzKyEKKworICAgICMgUGF0aCB0byBmZWVkIGZyb20gY29uZmlnLCBvciBmZWVkLnhtbCBmb3IgZGVmYXVsdAorICAgIGRlZiBmZWVkX3BhdGgKKyAgICAgIGlmIEBzaXRlLmNvbmZpZ1siZmVlZCJdICYmIEBzaXRlLmNvbmZpZ1siZmVlZCJdWyJwYXRoIl0KKyAgICAgICAgQHNpdGUuY29uZmlnWyJmZWVkIl1bInBhdGgiXQorICAgICAgZWxzZQorICAgICAgICAiZmVlZC54bWwiCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUGF0aCB0byBmZWVkLnhtbCB0ZW1wbGF0ZSBmaWxlCisgICAgZGVmIGZlZWRfc291cmNlX3BhdGgKKyAgICAgIEZpbGUuZXhwYW5kX3BhdGggIi4vZmVlZC54bWwiLCBGaWxlLmRpcm5hbWUoX19GSUxFX18pCisgICAgZW5kCisKKyAgICAjIENoZWNrcyBpZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHNpdGUgc291cmNlCisgICAgZGVmIGZpbGVfZXhpc3RzPyhmaWxlX3BhdGgpCisgICAgICBpZiBAc2l0ZS5yZXNwb25kX3RvPyg6aW5fc291cmNlX2RpcikKKyAgICAgICAgRmlsZS5leGlzdD8gQHNpdGUuaW5fc291cmNlX2RpcihmaWxlX3BhdGgpCisgICAgICBlbHNlCisgICAgICAgIEZpbGUuZXhpc3Q/IEpla3lsbC5zYW5pdGl6ZWRfcGF0aChAc2l0ZS5zb3VyY2UsIGZpbGVfcGF0aCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBHZW5lcmF0ZXMgY29udGVudHMgZm9yIGEgZmlsZQorICAgIGRlZiBjb250ZW50X2Zvcl9maWxlKGZpbGVfcGF0aCwgZmlsZV9zb3VyY2VfcGF0aCkKKyAgICAgIGZpbGUgPSBQYWdlV2l0aG91dEFGaWxlLm5ldyhAc2l0ZSwgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgIiIsIGZpbGVfcGF0aCkKKyAgICAgIGZpbGUuY29udGVudCA9IEZpbGUucmVhZChmaWxlX3NvdXJjZV9wYXRoKS5nc3ViKE1JTklGWV9SRUdFWCwgIiIpCisgICAgICBmaWxlLmRhdGFbImxheW91dCJdID0gbmlsCisgICAgICBmaWxlLmRhdGFbInNpdGVtYXAiXSA9IGZhbHNlCisgICAgICBmaWxlLmRhdGFbInhzbCJdID0gZmlsZV9leGlzdHM/KCJmZWVkLnhzbHQueG1sIikKKyAgICAgIGZpbGUub3V0cHV0CisgICAgICBmaWxlCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9saWIvamVreWxsLWZlZWQvbWV0YS10YWcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9saWIvamVreWxsLWZlZWQvbWV0YS10YWcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2OWI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL2xpYi9qZWt5bGwtZmVlZC9tZXRhLXRhZy5yYgpAQCAtMCwwICsxLDM5IEBACittb2R1bGUgSmVreWxsRmVlZAorICBjbGFzcyBNZXRhVGFnIDwgTGlxdWlkOjpUYWcKKyAgICAjIFVzZSBKZWt5bGwncyBuYXRpdmUgcmVsYXRpdmVfdXJsIGZpbHRlcgorICAgIGluY2x1ZGUgSmVreWxsOjpGaWx0ZXJzOjpVUkxGaWx0ZXJzCisKKyAgICBkZWYgcmVuZGVyKGNvbnRleHQpCisgICAgICBAY29udGV4dCA9IGNvbnRleHQKKyAgICAgIGF0dHJzICAgID0gYXR0cmlidXRlcy5tYXAgeyB8aywgdnwgJSgje2t9PSIje3Z9IikgfS5qb2luKCIgIikKKyAgICAgICI8bGluayAje2F0dHJzfSAvPiIKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBjb25maWcKKyAgICAgIEBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV0uY29uZmlnCisgICAgZW5kCisKKyAgICBkZWYgYXR0cmlidXRlcworICAgICAgeworICAgICAgICA6dHlwZSAgPT4gImFwcGxpY2F0aW9uL2F0b20reG1sIiwKKyAgICAgICAgOnJlbCAgID0+ICJhbHRlcm5hdGUiLAorICAgICAgICA6aHJlZiAgPT4gYWJzb2x1dGVfdXJsKHBhdGgpLAorICAgICAgICA6dGl0bGUgPT4gdGl0bGUsCisgICAgICB9LmtlZXBfaWYgeyB8XywgdnwgdiB9CisgICAgZW5kCisKKyAgICBkZWYgcGF0aAorICAgICAgaWYgY29uZmlnWyJmZWVkIl0gJiYgY29uZmlnWyJmZWVkIl1bInBhdGgiXQorICAgICAgICBjb25maWdbImZlZWQiXVsicGF0aCJdCisgICAgICBlbHNlCisgICAgICAgICJmZWVkLnhtbCIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHRpdGxlCisgICAgICBjb25maWdbInRpdGxlIl0gfHwgY29uZmlnWyJuYW1lIl0KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL2xpYi9qZWt5bGwtZmVlZC9wYWdlLXdpdGhvdXQtYS1maWxlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvbGliL2pla3lsbC1mZWVkL3BhZ2Utd2l0aG91dC1hLWZpbGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1NTZiOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL2xpYi9qZWt5bGwtZmVlZC9wYWdlLXdpdGhvdXQtYS1maWxlLnJiCkBAIC0wLDAgKzEsNyBAQAorbW9kdWxlIEpla3lsbEZlZWQKKyAgY2xhc3MgUGFnZVdpdGhvdXRBRmlsZSA8IEpla3lsbDo6UGFnZQorICAgIGRlZiByZWFkX3lhbWwoKikKKyAgICAgIEBkYXRhIHx8PSB7fQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc2NyaXB0L2Jvb3RzdHJhcCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NjcmlwdC9ib290c3RyYXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGEwOWQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NjcmlwdC9ib290c3RyYXAKQEAgLTAsMCArMSwzIEBACisjISAvYmluL2Jhc2gKKworYnVuZGxlIGluc3RhbGwKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NjcmlwdC9jaWJ1aWxkIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc2NyaXB0L2NpYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWI0YzBmMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NjcmlwdC9jaWJ1aWxkCkBAIC0wLDAgKzEsNyBAQAorIyEgL2Jpbi9iYXNoCisKK3NldCAtZQorCitidW5kbGUgZXhlYyByc3BlYworYnVuZGxlIGV4ZWMgcnVib2NvcCAtUyAtRAorYnVuZGxlIGV4ZWMgcmFrZSBidWlsZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc2NyaXB0L3JlbGVhc2UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zY3JpcHQvcmVsZWFzZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOWMyMjZmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc2NyaXB0L3JlbGVhc2UKQEAgLTAsMCArMSw3IEBACisjIS9iaW4vc2gKKyMgVGFnIGFuZCBwdXNoIGEgcmVsZWFzZS4KKworc2V0IC1lCisKK3NjcmlwdC9jaWJ1aWxkCitidW5kbGUgZXhlYyByYWtlIHJlbGVhc2UKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX2NvbmZpZy55bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19jb25maWcueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYmNjYzUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19jb25maWcueW1sCkBAIC0wLDAgKzEsOSBAQAordGltZXpvbmU6IFVUQworCitkZWZhdWx0czoKKyAgLQorICAgIHNjb3BlOgorICAgICAgcGF0aDogIiIKKyAgICAgIHR5cGU6IHBhZ2UKKyAgICB2YWx1ZXM6CisgICAgICBsYXlvdXQ6IHNvbWVfZGVmYXVsdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc3BlYy9maXh0dXJlcy9fZGF0YS9hdXRob3JzLnltbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX2RhdGEvYXV0aG9ycy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhNmZmOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX2RhdGEvYXV0aG9ycy55bWwKQEAgLTAsMCArMSw1IEBACitnYXJ0aGRiOgorICBuYW1lOiBHYXJ0aAorICB0d2l0dGVyOiBnYXJ0aGRiCisgIHVyaTogImh0dHA6Ly9nYXJ0aGRiLmNvbSIKKyAgZW1haWw6IGV4YW1wbGVAbWFpbC5jb20KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX2RyYWZ0cy8yMDE1LTAxLTEyLWEtZHJhZnQubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19kcmFmdHMvMjAxNS0wMS0xMi1hLWRyYWZ0Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzg5MTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19kcmFmdHMvMjAxNS0wMS0xMi1hLWRyYWZ0Lm1kCkBAIC0wLDAgKzEsNCBAQAorLS0tCistLS0KKworVGhpcyBpcyBhIGRyYWZ0LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc3BlYy9maXh0dXJlcy9fbGF5b3V0cy9zb21lX2RlZmF1bHQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX2xheW91dHMvc29tZV9kZWZhdWx0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0MTE3MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX2xheW91dHMvc29tZV9kZWZhdWx0Lmh0bWwKQEAgLTAsMCArMSwxMSBAQAorLS0tCistLS0KKzxodG1sPgorICA8aGVhZD4KKyAgICB7JSBmZWVkX21ldGEgJX0KKyAgPC9oZWFkPgorICA8Ym9keT4KK1RISVMgSVMgTVkgTEFZT1VUCit7eyBjb250ZW50IH19CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTMtMTItMTItZGVjLXRoZS1zZWNvbmQubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDEzLTEyLTEyLWRlYy10aGUtc2Vjb25kLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjA0YTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDEzLTEyLTEyLWRlYy10aGUtc2Vjb25kLm1kCkBAIC0wLDAgKzEsNiBAQAorLS0tCitleGNlcnB0OiAiRm9vIgoraW1hZ2U6ICIvaW1hZ2UucG5nIgorLS0tCisKKyMgRGVjZW1iZXIgdGhlIHR3ZWxmdGgsIGFjdHVhbGx5LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc3BlYy9maXh0dXJlcy9fcG9zdHMvMjAxNC0wMy0wMi1tYXJjaC10aGUtc2Vjb25kLm1kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc3BlYy9maXh0dXJlcy9fcG9zdHMvMjAxNC0wMy0wMi1tYXJjaC10aGUtc2Vjb25kLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YThmYzkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE0LTAzLTAyLW1hcmNoLXRoZS1zZWNvbmQubWQKQEAgLTAsMCArMSw1IEBACistLS0KK2ltYWdlOiAiaHR0cHM6Ly9jZG4uZXhhbXBsZS5vcmcvYWJzb2x1dGUucG5nIgorLS0tCisKK01hcmNoIHRoZSBzZWNvbmQhCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE0LTAzLTA0LW1hcmNoLXRoZS1mb3VydGgubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE0LTAzLTA0LW1hcmNoLXRoZS1mb3VydGgubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2YzM3MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTQtMDMtMDQtbWFyY2gtdGhlLWZvdXJ0aC5tZApAQCAtMCwwICsxLDggQEAKKy0tLQordGFnczoKKyAtICciLz48VkFERVI+JworaW1hZ2U6CisgIHBhdGg6ICIvb2JqZWN0LWltYWdlLnBuZyIKKy0tLQorCitNYXJjaCB0aGUgZm91cnRoIQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc3BlYy9maXh0dXJlcy9fcG9zdHMvMjAxNS0wMS0xOC1qZWt5bGwtbGFzdC1tb2RpZmllZC1hdC5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTUtMDEtMTgtamVreWxsLWxhc3QtbW9kaWZpZWQtYXQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzMmExYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTUtMDEtMTgtamVreWxsLWxhc3QtbW9kaWZpZWQtYXQubWQKQEAgLTAsMCArMSw1IEBACistLS0KK2xhc3RfbW9kaWZpZWRfYXQ6IDIwMTUtMDUtMTJUMTM6Mjc6NTkrMDA6MDAKKy0tLQorCitQbGVhc2UgZG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZS4gSXQncyBtb2RpZmllZCB0aW1lIGlzIGltcG9ydGFudC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTUtMDItMTItc3RyaXAtbmV3bGluZXMubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE1LTAyLTEyLXN0cmlwLW5ld2xpbmVzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkN2EzNzMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE1LTAyLTEyLXN0cmlwLW5ld2xpbmVzLm1kCkBAIC0wLDAgKzEsNiBAQAorLS0tCit0aXRsZToKKyAgICBUaGUgcGx1Z2luCisgICAgd2lsbCBwcm9wZXJseQorICAgIHN0cmlwIG5ld2xpbmVzLgorLS0tCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE1LTA1LTEyLWxpcXVpZC5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTUtMDUtMTItbGlxdWlkLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYWFlYWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE1LTA1LTEyLWxpcXVpZC5tZApAQCAtMCwwICsxLDcgQEAKKy0tLQorLS0tCisKK3slIGNhcHR1cmUgbGlxdWlkc3RyaW5nICV9CitMaXF1aWQgaXMgbm90IHJlbmRlcmVkLgoreyUgZW5kY2FwdHVyZSAlfQore3sgbGlxdWlkc3RyaW5nIHwgcmVwbGFjZTonbm90ICcsJycgfX0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTUtMDUtMTItcHJlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE1LTA1LTEyLXByZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjU0YjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE1LTA1LTEyLXByZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorLS0tCithdXRob3I6IFBhdAorbGFuZzogZW4KKy0tLQorCis8cHJlPkxpbmUgMQorTGluZSAyCitMaW5lIDM8L3ByZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTUtMDUtMTgtYXV0aG9yLWRldGFpbC5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTUtMDUtMTgtYXV0aG9yLWRldGFpbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGM0MmJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc3BlYy9maXh0dXJlcy9fcG9zdHMvMjAxNS0wNS0xOC1hdXRob3ItZGV0YWlsLm1kCkBAIC0wLDAgKzEsOSBAQAorLS0tCitleGNlcnB0OiAiIgorYXV0aG9yOgorICBuYW1lOiBCZW4KKyAgdXJpOiAiaHR0cDovL2Jlbi5iYWx0ZXIuY29tIgorICBlbWFpbDogYmVuQGV4YW1wbGUuY29tCistLS0KKworIyBEZWNlbWJlciB0aGUgdHdlbGZ0aCwgYWN0dWFsbHkuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE1LTA4LTA4LXN0dWNrLWluLXRoZS1taWRkbGUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTUtMDgtMDgtc3R1Y2staW4tdGhlLW1pZGRsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDUxNTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE1LTA4LTA4LXN0dWNrLWluLXRoZS1taWRkbGUuaHRtbApAQCAtMCwwICsxLDIgQEAKKy0tLQorLS0tCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE2LTA0LTI1LWF1dGhvci1yZWZlcmVuY2UubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2ZpeHR1cmVzL19wb3N0cy8yMDE2LTA0LTI1LWF1dGhvci1yZWZlcmVuY2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhMGYwYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvX3Bvc3RzLzIwMTYtMDQtMjUtYXV0aG9yLXJlZmVyZW5jZS5tZApAQCAtMCwwICsxLDYgQEAKKy0tLQorZXhjZXJwdDogIiIKK2F1dGhvcjogZ2FydGhkYgorLS0tCisKKyMgQXByaWwgdGhlIHR3ZW50eS1maWZ0aD8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvZmVlZC54c2x0LnhtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvZml4dHVyZXMvZmVlZC54c2x0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc3BlYy9maXh0dXJlcy9mZWVkLnhzbHQueG1sCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2pla3lsbC1mZWVkX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtZmVlZC0wLjkuMi9zcGVjL2pla3lsbC1mZWVkX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhZTkwNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvamVreWxsLWZlZWRfc3BlYy5yYgpAQCAtMCwwICsxLDI4NSBAQAorcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlKEpla3lsbEZlZWQpIGRvCisgIGxldCg6b3ZlcnJpZGVzKSB7IEhhc2gubmV3IH0KKyAgbGV0KDpjb25maWcpIGRvCisgICAgSmVreWxsLmNvbmZpZ3VyYXRpb24oSmVreWxsOjpVdGlscy5kZWVwX21lcmdlX2hhc2hlcyh7CisgICAgICAiZnVsbF9yZWJ1aWxkIiA9PiB0cnVlLAorICAgICAgInNvdXJjZSIgICAgICA9PiBzb3VyY2VfZGlyLAorICAgICAgImRlc3RpbmF0aW9uIiA9PiBkZXN0X2RpciwKKyAgICAgICJzaG93X2RyYWZ0cyIgPT4gdHJ1ZSwKKyAgICAgICJ1cmwiICAgICAgICAgPT4gImh0dHA6Ly9leGFtcGxlLm9yZyIsCisgICAgICAibmFtZSIgICAgICAgPT4gIk15IGF3ZXNvbWUgc2l0ZSIsCisgICAgICAiYXV0aG9yIiAgICAgID0+IHsKKyAgICAgICAgIm5hbWUiICAgICAgICA9PiAiRHIuIEpla3lsbCIKKyAgICAgIH0sCisgICAgICAiY29sbGVjdGlvbnMiID0+IHsKKyAgICAgICAgIm15X2NvbGxlY3Rpb24iID0+IHsgIm91dHB1dCIgPT4gdHJ1ZSB9LAorICAgICAgICAib3RoZXJfdGhpbmdzIiAgPT4geyAib3V0cHV0IiA9PiBmYWxzZSB9CisgICAgICB9CisgICAgfSwgb3ZlcnJpZGVzKSkKKyAgZW5kCisgIGxldCg6c2l0ZSkgICAgIHsgSmVreWxsOjpTaXRlLm5ldyhjb25maWcpIH0KKyAgbGV0KDpjb250ZW50cykgeyBGaWxlLnJlYWQoZGVzdF9kaXIoImZlZWQueG1sIikpIH0KKyAgbGV0KDpjb250ZXh0KSAgeyBtYWtlX2NvbnRleHQoc2l0ZTogc2l0ZSkgfQorICBsZXQoOmZlZWRfbWV0YSkgeyBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7JSBmZWVkX21ldGEgJX0iKS5yZW5kZXIhKGNvbnRleHQsIHt9KSB9CisgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICBzaXRlLnByb2Nlc3MKKyAgZW5kCisKKyAgaXQgImhhcyBubyBsYXlvdXQiIGRvCisgICAgZXhwZWN0KGNvbnRlbnRzKS5ub3RfdG8gbWF0Y2goL1xBVEhJUyBJUyBNWSBMQVlPVVQvKQorICBlbmQKKworICBpdCAiY3JlYXRlcyBhIGZlZWQueG1sIGZpbGUiIGRvCisgICAgZXhwZWN0KFBhdGhuYW1lLm5ldyhkZXN0X2RpcigiZmVlZC54bWwiKSkpLnRvIGV4aXN0CisgIGVuZAorCisKKyAgaXQgImRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBuZXcgbGluZXMgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSIgZG8KKyAgICBleHBlY3QoY29udGVudHMpLnRvX25vdCBtYXRjaCAvXHMrXG4vCisgICAgZXhwZWN0KGNvbnRlbnRzKS50b19ub3QgbWF0Y2ggL1xuezIsfS8KKyAgZW5kCisKKyAgaXQgInB1dHMgYWxsIHRoZSBwb3N0cyBpbiB0aGUgZmVlZC54bWwgZmlsZSIgZG8KKyAgICBleHBlY3QoY29udGVudHMpLnRvIG1hdGNoIC9odHRwOlwvXC9leGFtcGxlXC5vcmdcLzIwMTRcLzAzXC8wNFwvbWFyY2gtdGhlLWZvdXJ0aFwuaHRtbC8KKyAgICBleHBlY3QoY29udGVudHMpLnRvIG1hdGNoIC9odHRwOlwvXC9leGFtcGxlXC5vcmdcLzIwMTRcLzAzXC8wMlwvbWFyY2gtdGhlLXNlY29uZFwuaHRtbC8KKyAgICBleHBlY3QoY29udGVudHMpLnRvIG1hdGNoIC9odHRwOlwvXC9leGFtcGxlXC5vcmdcLzIwMTNcLzEyXC8xMlwvZGVjLXRoZS1zZWNvbmRcLmh0bWwvCisgICAgZXhwZWN0KGNvbnRlbnRzKS50byBtYXRjaCAiaHR0cDovL2V4YW1wbGUub3JnLzIwMTUvMDgvMDgvc3R1Y2staW4tdGhlLW1pZGRsZS5odG1sIgorICAgIGV4cGVjdChjb250ZW50cykudG9fbm90IG1hdGNoIC9odHRwOlwvXC9leGFtcGxlXC5vcmdcLzIwMTZcLzAyXC8wOVwvYS1kcmFmdFwuaHRtbC8KKyAgZW5kCisKKyAgaXQgImRvZXMgbm90IGluY2x1ZGUgYXNzZXRzIG9yIGFueSBzdGF0aWMgZmlsZXMgdGhhdCBhcmVuJ3QgLmh0bWwiIGRvCisgICAgZXhwZWN0KGNvbnRlbnRzKS5ub3RfdG8gbWF0Y2ggL2h0dHA6XC9cL2V4YW1wbGVcLm9yZ1wvaW1hZ2VzXC9odWJvdFwucG5nLworICAgIGV4cGVjdChjb250ZW50cykubm90X3RvIG1hdGNoIC9odHRwOlwvXC9leGFtcGxlXC5vcmdcL2ZlZWRzXC9hdG9tXC54bWwvCisgIGVuZAorCisgIGl0ICJwcmVzZXJ2ZXMgbGluZWJyZWFrcyBpbiBwcmVmb3JtYXR0ZWQgdGV4dCBpbiBwb3N0cyIgZG8KKyAgICBleHBlY3QoY29udGVudHMpLnRvIG1hdGNoIC9MaW5lIDFcbkxpbmUgMlxuTGluZSAzLworICBlbmQKKworICBpdCAic3VwcG9ydHMgcG9zdCBhdXRob3IgbmFtZSBhcyBhbiBvYmplY3QiIGRvCisgICAgZXhwZWN0KGNvbnRlbnRzKS50byBtYXRjaCAvPGF1dGhvcj5ccyo8bmFtZT5CZW48XC9uYW1lPlxzKjxlbWFpbD5iZW5AZXhhbXBsZS5jb208XC9lbWFpbD5ccyo8dXJpPmh0dHA6XC9cL2Jlbi5iYWx0ZXIuY29tPFwvdXJpPlxzKjxcL2F1dGhvcj4vCisgIGVuZAorCisgIGl0ICJzdXBwb3J0cyBwb3N0IGF1dGhvciBuYW1lIGFzIGEgc3RyaW5nIiBkbworICAgIGV4cGVjdChjb250ZW50cykudG8gbWF0Y2ggLzxhdXRob3I+XHMqPG5hbWU+UGF0PFwvbmFtZT5ccyo8XC9hdXRob3I+LworICBlbmQKKworICBpdCAiZG9lcyBub3Qgb3V0cHV0IGF1dGhvciB0YWcgbm8gYXV0aG9yIGlzIHByb3ZpZGVkIiBkbworICAgIGV4cGVjdChjb250ZW50cykubm90X3RvIG1hdGNoIC88YXV0aG9yPlxzKjxuYW1lPjxcL25hbWU+XHMqPFwvYXV0aG9yPi8KKyAgZW5kCisKKyAgaXQgImRvZXMgdXNlIGF1dGhvciByZWZlcmVuY2Ugd2l0aCBkYXRhIGZyb20gX2RhdGEvYXV0aG9ycy55bWwiIGRvCisgICAgZXhwZWN0KGNvbnRlbnRzKS50byBtYXRjaCAvPGF1dGhvcj5ccyo8bmFtZT5HYXJ0aDxcL25hbWU+XHMqPGVtYWlsPmV4YW1wbGVAbWFpbC5jb208XC9lbWFpbD5ccyo8dXJpPmh0dHA6XC9cL2dhcnRoZGIuY29tPFwvdXJpPlxzKjxcL2F1dGhvcj4vCisgIGVuZAorCisgIGl0ICJjb252ZXJ0cyBtYXJrZG93biBwb3N0cyB0byBIVE1MIiBkbworICAgIGV4cGVjdChjb250ZW50cykudG8gbWF0Y2ggLyZsdDtwJmd0O01hcmNoIHRoZSBzZWNvbmQhJmx0O1wvcCZndDsvCisgIGVuZAorCisgIGl0ICJ1c2VzIGxhc3RfbW9kaWZpZWRfYXQgd2hlcmUgYXZhaWxhYmxlIiBkbworICAgIGV4cGVjdChjb250ZW50cykudG8gbWF0Y2ggLzx1cGRhdGVkPjIwMTUtMDUtMTJUMTM6Mjc6NTlcKzAwOjAwPFwvdXBkYXRlZD4vCisgIGVuZAorCisgIGl0ICJyZXBsYWNlcyBuZXdsaW5lcyBpbiBwb3N0cyB0byBzcGFjZXMiIGRvCisgICAgZXhwZWN0KGNvbnRlbnRzKS50byBtYXRjaCAlciE8dGl0bGUgdHlwZT0iaHRtbCI+VGhlIHBsdWdpbiB3aWxsIHByb3Blcmx5IHN0cmlwIG5ld2xpbmVzLjwvdGl0bGU+IQorICBlbmQKKworICBpdCAicmVuZGVycyBMaXF1aWQgaW5zaWRlIHBvc3RzIiBkbworICAgIGV4cGVjdChjb250ZW50cykudG8gbWF0Y2ggL0xpcXVpZCBpcyByZW5kZXJlZFwuLworICAgIGV4cGVjdChjb250ZW50cykubm90X3RvIG1hdGNoIC9MaXF1aWQgaXMgbm90IHJlbmRlcmVkXC4vCisgIGVuZAorCisgIGl0ICJpbmNsdWRlcyB0aGUgaXRlbSBpbWFnZSIgZG8KKyAgICBleHBlY3QoY29udGVudHMpLnRvIGluY2x1ZGUoJzxtZWRpYTp0aHVtYm5haWwgeG1sbnM6bWVkaWE9Imh0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvIiB1cmw9Imh0dHA6Ly9leGFtcGxlLm9yZy9pbWFnZS5wbmciIC8+JykKKyAgICBleHBlY3QoY29udGVudHMpLnRvIGluY2x1ZGUoJzxtZWRpYTp0aHVtYm5haWwgeG1sbnM6bWVkaWE9Imh0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvIiB1cmw9Imh0dHBzOi8vY2RuLmV4YW1wbGUub3JnL2Fic29sdXRlLnBuZyIgLz4nKQorICAgIGV4cGVjdChjb250ZW50cykudG8gaW5jbHVkZSgnPG1lZGlhOnRodW1ibmFpbCB4bWxuczptZWRpYT0iaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy8iIHVybD0iaHR0cDovL2V4YW1wbGUub3JnL29iamVjdC1pbWFnZS5wbmciIC8+JykKKyAgZW5kCisKKyAgY29udGV4dCAicGFyc2luZyIgZG8KKyAgICBsZXQoOmZlZWQpIHsgUlNTOjpQYXJzZXIucGFyc2UoY29udGVudHMpIH0KKworICAgIGl0ICJvdXRwdXRzIGFuIFJTUyBmZWVkIiBkbworICAgICAgZXhwZWN0KGZlZWQuZmVlZF90eXBlKS50byBlcWwoImF0b20iKQorICAgICAgZXhwZWN0KGZlZWQuZmVlZF92ZXJzaW9uKS50byBlcWwoIjEuMCIpCisgICAgICBleHBlY3QoZmVlZC5lbmNvZGluZykudG8gZXFsKCJVVEYtOCIpCisgICAgZW5kCisKKyAgICBpdCAib3V0cHV0cyB0aGUgbGluayIgZG8KKyAgICAgIGV4cGVjdChmZWVkLmxpbmsuaHJlZikudG8gZXFsKCJodHRwOi8vZXhhbXBsZS5vcmcvZmVlZC54bWwiKQorICAgIGVuZAorCisgICAgaXQgIm91dHB1dHMgdGhlIGdlbmVyYXRvciIgZG8KKyAgICAgIGV4cGVjdChmZWVkLmdlbmVyYXRvci5jb250ZW50KS50byBlcWwoIkpla3lsbCIpCisgICAgICBleHBlY3QoZmVlZC5nZW5lcmF0b3IudmVyc2lvbikudG8gZXFsKEpla3lsbDo6VkVSU0lPTikKKyAgICBlbmQKKworICAgIGl0ICJpbmNsdWRlcyB0aGUgaXRlbXMiIGRvCisgICAgICBleHBlY3QoZmVlZC5pdGVtcy5jb3VudCkudG8gZXFsKDEwKQorICAgIGVuZAorCisgICAgaXQgImluY2x1ZGVzIGl0ZW0gY29udGVudHMiIGRvCisgICAgICBwb3N0ID0gZmVlZC5pdGVtcy5sYXN0CisgICAgICBleHBlY3QocG9zdC50aXRsZS5jb250ZW50KS50byBlcWwoIkRlYyBUaGUgU2Vjb25kIikKKyAgICAgIGV4cGVjdChwb3N0LmxpbmsuaHJlZikudG8gZXFsKCJodHRwOi8vZXhhbXBsZS5vcmcvMjAxMy8xMi8xMi9kZWMtdGhlLXNlY29uZC5odG1sIikKKyAgICAgIGV4cGVjdChwb3N0LnB1Ymxpc2hlZC5jb250ZW50KS50byBlcWwoVGltZS5wYXJzZSgiMjAxMy0xMi0xMiIpKQorICAgIGVuZAorCisgICAgaXQgImluY2x1ZGVzIHRoZSBpdGVtJ3MgZXhjZXJwdCIgZG8KKyAgICAgIHBvc3QgPSBmZWVkLml0ZW1zLmxhc3QKKyAgICAgIGV4cGVjdChwb3N0LnN1bW1hcnkuY29udGVudCkudG8gZXFsKCJGb28iKQorICAgIGVuZAorCisgICAgaXQgImRvZXNuJ3QgaW5jbHVkZSB0aGUgaXRlbSdzIGV4Y2VycHQgaWYgYmxhbmsiIGRvCisgICAgICBwb3N0ID0gZmVlZC5pdGVtcy5maXJzdAorICAgICAgZXhwZWN0KHBvc3Quc3VtbWFyeSkudG8gYmVfbmlsCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aXRoIHNpdGUudGl0bGUgc2V0IiBkbworICAgICAgbGV0KDpzaXRlX3RpdGxlKSB7ICJNeSBTaXRlIFRpdGxlIiB9CisgICAgICBsZXQoOm92ZXJyaWRlcykgeyB7InRpdGxlIiA9PiBzaXRlX3RpdGxlfSB9CisKKyAgICAgIGl0ICJ1c2VzIHNpdGUudGl0bGUgZm9yIHRoZSB0aXRsZSIgZG8KKyAgICAgICAgZXhwZWN0KGZlZWQudGl0bGUuY29udGVudCkudG8gZXFsKHNpdGVfdGl0bGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNvbnRleHQgIndpdGggc2l0ZS5uYW1lIHNldCIgZG8KKyAgICAgIGxldCg6c2l0ZV9uYW1lKSB7ICJNeSBTaXRlIE5hbWUiIH0KKyAgICAgIGxldCg6b3ZlcnJpZGVzKSB7IHsibmFtZSIgPT4gc2l0ZV9uYW1lfSB9CisKKyAgICAgIGl0ICJ1c2VzIHNpdGUubmFtZSBmb3IgdGhlIHRpdGxlIiBkbworICAgICAgICBleHBlY3QoZmVlZC50aXRsZS5jb250ZW50KS50byBlcWwoc2l0ZV9uYW1lKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aXRoIHNpdGUubmFtZSBhbmQgc2l0ZS50aXRsZSBzZXQiIGRvCisgICAgICBsZXQoOnNpdGVfdGl0bGUpIHsgIk15IFNpdGUgVGl0bGUiIH0KKyAgICAgIGxldCg6c2l0ZV9uYW1lKSB7ICJNeSBTaXRlIE5hbWUiIH0KKyAgICAgIGxldCg6b3ZlcnJpZGVzKSB7IHsidGl0bGUiID0+IHNpdGVfdGl0bGUsICJuYW1lIiA9PiBzaXRlX25hbWV9IH0KKworICAgICAgaXQgInVzZXMgc2l0ZS50aXRsZSBmb3IgdGhlIHRpdGxlLCBkcm9wcGluZyBzaXRlLm5hbWUiIGRvCisgICAgICAgIGV4cGVjdChmZWVkLnRpdGxlLmNvbnRlbnQpLnRvIGVxbChzaXRlX3RpdGxlKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGNvbnRleHQgInNtYXJ0aWZ5IiBkbworICAgIGxldCg6c2l0ZV90aXRsZSkgeyAiUGF0J3MgU2l0ZSIgfQorICAgIGxldCg6b3ZlcnJpZGVzKSB7IHsgInRpdGxlIiA9PiBzaXRlX3RpdGxlIH0gfQorICAgIGxldCg6ZmVlZCkgeyBSU1M6OlBhcnNlci5wYXJzZShjb250ZW50cykgfQorCisgICAgaXQgInByb2Nlc3NlcyBzaXRlIHRpdGxlIHdpdGggU21hcnR5UGFudHMiIGRvCisgICAgICBleHBlY3QoZmVlZC50aXRsZS5jb250ZW50KS50byBlcWwoIlBhdOKAmXMgU2l0ZSIpCisgICAgZW5kCisgIGVuZAorCisgIGNvbnRleHQgInZhbGlkYXRpb24iIGRvCisgICAgaXQgInZhbGlkYXRlcyIgZG8KKyAgICAgICMgU2VlIGh0dHBzOi8vdmFsaWRhdG9yLnczLm9yZy9kb2NzL2FwaS5odG1sCisgICAgICB1cmwgPSAiaHR0cHM6Ly92YWxpZGF0b3IudzMub3JnL2ZlZWQvY2hlY2suY2dpP291dHB1dD1zb2FwMTIiCisgICAgICByZXNwb25zZSA9IFR5cGhvZXVzLnBvc3QodXJsLCBib2R5OiB7IHJhd2RhdGE6IGNvbnRlbnRzIH0sIGFjY2VwdF9lbmNvZGluZzogImd6aXAiKQorICAgICAgcGVuZGluZyAiU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgVzMgdmFsaWRhdG9yIiB1bmxlc3MgcmVzcG9uc2Uuc3VjY2Vzcz8KKyAgICAgIHJlc3VsdCAgPSBOb2tvZ2lyaTo6WE1MKHJlc3BvbnNlLmJvZHkpCisgICAgICByZXN1bHQucmVtb3ZlX25hbWVzcGFjZXMhCisKKyAgICAgIHJlc3VsdC5jc3MoIndhcm5pbmciKS5lYWNoIGRvIHx3YXJuaW5nfAorICAgICAgICAjIFF1aWV0IGEgd2FybmluZyB0aGF0IHJlc3VsdHMgZnJvbSB1cyBwYXNzaW5nIHRoZSBmZWVkIGFzIGEgc3RyaW5nCisgICAgICAgIG5leHQgaWYgd2FybmluZy5jc3MoInRleHQiKS50ZXh0ID1+IC9TZWxmIHJlZmVyZW5jZSBkb2Vzbid0IG1hdGNoIGRvY3VtZW50IGxvY2F0aW9uLworCisgICAgICAgICMgUXVpZXQgZXhwZWN0ZWQgd2FybmluZyB0aGF0IHJlc3VsdHMgZnJvbSBibGFuayBzdW1tYXJ5IHRlc3QgY2FzZQorICAgICAgICBuZXh0IGlmIHdhcm5pbmcuY3NzKCJ0ZXh0IikudGV4dCA9fiAvKGNvbnRlbnR8c3VtbWFyeSkgc2hvdWxkIG5vdCBiZSBibGFuay8KKworICAgICAgICAjIFF1aWV0IGV4cGVjdGVkIHdhcm5pbmcgYWJvdXQgbXVsdGlwbGUgcG9zdHMgd2l0aCBzYW1lIHVwZGF0ZWQgdGltZQorICAgICAgICBuZXh0IGlmIHdhcm5pbmcuY3NzKCJ0ZXh0IikudGV4dCA9fiAvVHdvIGVudHJpZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZSBmb3IgYXRvbTp1cGRhdGVkLworCisgICAgICAgIHdhcm4gIlZhbGlkYXRpb24gd2FybmluZzogI3t3YXJuaW5nLmNzcygidGV4dCIpLnRleHR9IG9uIGxpbmUgI3t3YXJuaW5nLmNzcygibGluZSIpLnRleHR9IGNvbHVtbiAje3dhcm5pbmcuY3NzKCJjb2x1bW4iKS50ZXh0fSIKKyAgICAgIGVuZAorCisgICAgICBlcnJvcnMgPSByZXN1bHQuY3NzKCJlcnJvciIpLm1hcCBkbyB8ZXJyb3J8CisgICAgICAgICJWYWxpZGF0aW9uIGVycm9yOiAje2Vycm9yLmNzcygidGV4dCIpLnRleHR9IG9uIGxpbmUgI3tlcnJvci5jc3MoImxpbmUiKS50ZXh0fSBjb2x1bW4gI3tlcnJvci5jc3MoImNvbHVtbiIpLnRleHR9IgorICAgICAgZW5kCisKKyAgICAgIGV4cGVjdChyZXN1bHQuY3NzKCJ2YWxpZGl0eSIpLnRleHQpLnRvIGVxbCgidHJ1ZSIpLCBlcnJvcnMuam9pbigiXG4iKQorICAgIGVuZAorICBlbmQKKworICBjb250ZXh0ICJ3aXRoIGEgYmFzZXVybCIgZG8KKyAgICBsZXQoOm92ZXJyaWRlcykgZG8KKyAgICAgIHsgImJhc2V1cmwiID0+ICIvYmFzcyIgfQorICAgIGVuZAorCisgICAgaXQgImNvcnJlY3RseSBhZGRzIHRoZSBiYXNldXJsIHRvIHRoZSBwb3N0cyIgZG8KKyAgICAgIGV4cGVjdChjb250ZW50cykudG8gbWF0Y2ggL2h0dHA6XC9cL2V4YW1wbGVcLm9yZ1wvYmFzc1wvMjAxNFwvMDNcLzA0XC9tYXJjaC10aGUtZm91cnRoXC5odG1sLworICAgICAgZXhwZWN0KGNvbnRlbnRzKS50byBtYXRjaCAvaHR0cDpcL1wvZXhhbXBsZVwub3JnXC9iYXNzXC8yMDE0XC8wM1wvMDJcL21hcmNoLXRoZS1zZWNvbmRcLmh0bWwvCisgICAgICBleHBlY3QoY29udGVudHMpLnRvIG1hdGNoIC9odHRwOlwvXC9leGFtcGxlXC5vcmdcL2Jhc3NcLzIwMTNcLzEyXC8xMlwvZGVjLXRoZS1zZWNvbmRcLmh0bWwvCisgICAgZW5kCisKKyAgICBpdCAicmVuZGVycyB0aGUgZmVlZCBtZXRhIiBkbworICAgICAgZXhwZWN0ZWQgPSAnaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL2Jhc3MvZmVlZC54bWwiJworICAgICAgZXhwZWN0KGZlZWRfbWV0YSkudG8gaW5jbHVkZShleHBlY3RlZCkKKyAgICBlbmQKKyAgZW5kCisKKyAgY29udGV4dCAiZmVlZCBtZXRhIiBkbworICAgIGl0ICJyZW5kZXJzIHRoZSBmZWVkIG1ldGEiIGRvCisgICAgICBleHBlY3RlZCA9ICc8bGluayB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tK3htbCIgcmVsPSJhbHRlcm5hdGUiIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy9mZWVkLnhtbCIgdGl0bGU9Ik15IGF3ZXNvbWUgc2l0ZSIgLz4nCisgICAgICBleHBlY3QoZmVlZF9tZXRhKS50byBlcWwoZXhwZWN0ZWQpCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aXRoIGEgYmxhbmsgc2l0ZSBuYW1lIiBkbworICAgICAgbGV0KDpjb25maWcpIGRvCisgICAgICAgIEpla3lsbC5jb25maWd1cmF0aW9uKHsKKyAgICAgICAgICAic291cmNlIiAgICAgID0+IHNvdXJjZV9kaXIsCisgICAgICAgICAgImRlc3RpbmF0aW9uIiA9PiBkZXN0X2RpciwKKyAgICAgICAgICAidXJsIiAgICAgICAgID0+ICJodHRwOi8vZXhhbXBsZS5vcmciCisgICAgICAgIH0pCisgICAgICBlbmQKKworICAgICAgaXQgImRvZXMgbm90IG91dHB1dCBibGFuayB0aXRsZSIgZG8KKyAgICAgICAgZXhwZWN0KGZlZWRfbWV0YSkubm90X3RvIGluY2x1ZGUoJ3RpdGxlPScpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgY29udGV4dCAiY2hhbmdpbmcgdGhlIGZlZWQgcGF0aCIgZG8KKyAgICBsZXQoOm92ZXJyaWRlcykgZG8KKyAgICAgIHsKKyAgICAgICAgImZlZWQiID0+IHsKKyAgICAgICAgICAicGF0aCIgPT4gImF0b20ueG1sIgorICAgICAgICB9CisgICAgICB9CisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIHRvIGF0b20ueG1sIiBkbworICAgICAgZXhwZWN0KFBhdGhuYW1lLm5ldyhkZXN0X2RpcigiYXRvbS54bWwiKSkpLnRvIGV4aXN0CisgICAgZW5kCisKKyAgICBpdCAicmVuZGVycyB0aGUgZmVlZCBtZXRhIHdpdGggY3VzdG9tIGZlZWQgcGF0aCIgZG8KKyAgICAgIGV4cGVjdGVkID0gJ2hyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy9hdG9tLnhtbCInCisgICAgICBleHBlY3QoZmVlZF9tZXRhKS50byBpbmNsdWRlKGV4cGVjdGVkKQorICAgIGVuZAorICBlbmQKKworICBjb250ZXh0ICJmZWVkIHN0eWxlc2hlZXQiIGRvCisgICAgaXQgImluY2x1ZGVzIHRoZSBzdHlsZXNoZWV0IiBkbworICAgICAgZXhwZWN0KGNvbnRlbnRzKS50byBpbmNsdWRlKCc8P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveG1sIiBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvZmVlZC54c2x0LnhtbCI/PicpCisgICAgZW5kCisgIGVuZAorCisgIGNvbnRleHQgIndpdGggc2l0ZS5sYW5nIHNldCIgZG8KKyAgICBsZXQoOm92ZXJyaWRlcykgeyB7ICJsYW5nIiA9PiAiZW4tVVMiIH0gfQorCisgICAgaXQgInNob3VsZCBzZXQgdGhlIGxhbmd1YWdlIiBkbworICAgICAgZXhwZWN0KGNvbnRlbnRzKS50byBtYXRjaCAlcnt0eXBlPSJ0ZXh0L2h0bWwiIGhyZWZsYW5nPSJlbi1VUyIgLz59CisgICAgZW5kCisgIGVuZAorCisgIGNvbnRleHQgIndpdGggcG9zdC5sYW5nIHNldCJkbworICAgIGl0ICJzaG91bGQgc2V0IHRoZSBsYW5ndWFnZSBmb3IgdGhhdCBlbnRyeSIgZG8KKyAgICAgIGV4cGVjdChjb250ZW50cykudG8gbWF0Y2ggJXJ7PGVudHJ5IHhtbDpsYW5nPSJlbiI+fQorICAgICAgZXhwZWN0KGNvbnRlbnRzKS50byBtYXRjaCAlcns8ZW50cnk+fQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLWZlZWQtMC45LjIvc3BlYy9zcGVjX2hlbHBlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvc3BlY19oZWxwZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyNmJkNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1mZWVkLTAuOS4yL3NwZWMvc3BlY19oZWxwZXIucmIKQEAgLTAsMCArMSwyOCBAQAorcmVxdWlyZSAnamVreWxsJworcmVxdWlyZSAndHlwaG9ldXMnCityZXF1aXJlICdub2tvZ2lyaScKK3JlcXVpcmUgJ3JzcycKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgnLi4vbGliL2pla3lsbC1mZWVkJywgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSkKKworSmVreWxsLmxvZ2dlci5sb2dfbGV2ZWwgPSA6ZXJyb3IKKworUlNwZWMuY29uZmlndXJlIGRvIHxjb25maWd8CisgIGNvbmZpZy5ydW5fYWxsX3doZW5fZXZlcnl0aGluZ19maWx0ZXJlZCA9IHRydWUKKyAgY29uZmlnLmZpbHRlcl9ydW4gOmZvY3VzCisgIGNvbmZpZy5vcmRlciA9ICdyYW5kb20nCisKKyAgU09VUkNFX0RJUiA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2ZpeHR1cmVzIiwgX19GSUxFX18pCisgIERFU1RfRElSICAgPSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9kZXN0IiwgICAgIF9fRklMRV9fKQorCisgIGRlZiBzb3VyY2VfZGlyKCpmaWxlcykKKyAgICBGaWxlLmpvaW4oU09VUkNFX0RJUiwgKmZpbGVzKQorICBlbmQKKworICBkZWYgZGVzdF9kaXIoKmZpbGVzKQorICAgIEZpbGUuam9pbihERVNUX0RJUiwgKmZpbGVzKQorICBlbmQKKworICBkZWYgbWFrZV9jb250ZXh0KHJlZ2lzdGVycyA9IHt9KQorICAgIExpcXVpZDo6Q29udGV4dC5uZXcoe30sIHt9LCB7IHNpdGU6IHNpdGUgfS5tZXJnZShyZWdpc3RlcnMpKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wL2xpYi9qZWt5bGwtc2Fzcy1jb252ZXJ0ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtc2Fzcy1jb252ZXJ0ZXItMS41LjAvbGliL2pla3lsbC1zYXNzLWNvbnZlcnRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUxYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wL2xpYi9qZWt5bGwtc2Fzcy1jb252ZXJ0ZXIucmIKQEAgLTAsMCArMSw2IEBACityZXF1aXJlICJqZWt5bGwtc2Fzcy1jb252ZXJ0ZXIvdmVyc2lvbiIKK3JlcXVpcmUgImpla3lsbC9jb252ZXJ0ZXJzL3Njc3MiCityZXF1aXJlICJqZWt5bGwvY29udmVydGVycy9zYXNzIgorCittb2R1bGUgSmVreWxsU2Fzc0NvbnZlcnRlcgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtc2Fzcy1jb252ZXJ0ZXItMS41LjAvbGliL2pla3lsbC1zYXNzLWNvbnZlcnRlci92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wL2xpYi9qZWt5bGwtc2Fzcy1jb252ZXJ0ZXIvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmRmZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wL2xpYi9qZWt5bGwtc2Fzcy1jb252ZXJ0ZXIvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDMgQEAKK21vZHVsZSBKZWt5bGxTYXNzQ29udmVydGVyCisgIFZFUlNJT04gPSAiMS41LjAiCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1zYXNzLWNvbnZlcnRlci0xLjUuMC9saWIvamVreWxsL2NvbnZlcnRlcnMvc2Fzcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC1zYXNzLWNvbnZlcnRlci0xLjUuMC9saWIvamVreWxsL2NvbnZlcnRlcnMvc2Fzcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTVmYmFhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wL2xpYi9qZWt5bGwvY29udmVydGVycy9zYXNzLnJiCkBAIC0wLDAgKzEsMjAgQEAKK3JlcXVpcmUgJ3Nhc3MnCityZXF1aXJlICdqZWt5bGwvdXRpbHMnCityZXF1aXJlICdqZWt5bGwvY29udmVydGVycy9zY3NzJworCittb2R1bGUgSmVreWxsCisgIG1vZHVsZSBDb252ZXJ0ZXJzCisgICAgY2xhc3MgU2FzcyA8IFNjc3MKKyAgICAgIHNhZmUgdHJ1ZQorICAgICAgcHJpb3JpdHkgOmxvdworCisgICAgICBkZWYgbWF0Y2hlcyhleHQpCisgICAgICAgIGV4dCA9fiAvXlwuc2FzcyQvaQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzeW50YXgKKyAgICAgICAgOnNhc3MKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wL2xpYi9qZWt5bGwvY29udmVydGVycy9zY3NzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wL2xpYi9qZWt5bGwvY29udmVydGVycy9zY3NzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDNjOTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtc2Fzcy1jb252ZXJ0ZXItMS41LjAvbGliL2pla3lsbC9jb252ZXJ0ZXJzL3Njc3MucmIKQEAgLTAsMCArMSwxMzIgQEAKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ3Nhc3MnCityZXF1aXJlICdqZWt5bGwvdXRpbHMnCisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIENvbnZlcnRlcnMKKyAgICBjbGFzcyBTY3NzIDwgQ29udmVydGVyCisgICAgICBCWVRFX09SREVSX01BUksgPSAvXlx4RUZceEJCXHhCRi8KKyAgICAgIFN5bnRheEVycm9yID0gQ2xhc3MubmV3KEFyZ3VtZW50RXJyb3IpCisKKyAgICAgIHNhZmUgdHJ1ZQorICAgICAgcHJpb3JpdHkgOmxvdworCisgICAgICBBTExPV0VEX1NUWUxFUyA9ICV3KG5lc3RlZCBleHBhbmRlZCBjb21wYWN0IGNvbXByZXNzZWQpLmZyZWV6ZQorCisgICAgICBkZWYgbWF0Y2hlcyhleHQpCisgICAgICAgIGV4dCA9fiAvXlwuc2NzcyQvaQorICAgICAgZW5kCisKKyAgICAgIGRlZiBvdXRwdXRfZXh0KGV4dCkKKyAgICAgICAgIi5jc3MiCisgICAgICBlbmQKKworICAgICAgZGVmIHNhZmU/CisgICAgICAgICEhQGNvbmZpZ1sic2FmZSJdCisgICAgICBlbmQKKworICAgICAgZGVmIGpla3lsbF9zYXNzX2NvbmZpZ3VyYXRpb24KKyAgICAgICAgb3B0aW9ucyA9IEBjb25maWdbInNhc3MiXSB8fCB7fQorICAgICAgICB1bmxlc3Mgb3B0aW9uc1sic3R5bGUiXS5uaWw/CisgICAgICAgICAgb3B0aW9uc1sic3R5bGUiXSA9IG9wdGlvbnNbInN0eWxlIl0udG9fcy5nc3ViKC9cQTovLCAnJykudG9fc3ltCisgICAgICAgIGVuZAorICAgICAgICBvcHRpb25zCisgICAgICBlbmQKKworICAgICAgZGVmIHNhc3NfYnVpbGRfY29uZmlndXJhdGlvbl9vcHRpb25zKG92ZXJyaWRlcykKKyAgICAgICAgaWYgc2FmZT8KKyAgICAgICAgICB7CisgICAgICAgICAgICA6bG9hZF9wYXRocyA9PiBzYXNzX2xvYWRfcGF0aHMsCisgICAgICAgICAgICA6c3ludGF4ICAgICA9PiBzeW50YXgsCisgICAgICAgICAgICA6c3R5bGUgICAgICA9PiBzYXNzX3N0eWxlLAorICAgICAgICAgICAgOmNhY2hlICAgICAgPT4gZmFsc2UKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBKZWt5bGw6OlV0aWxzLnN5bWJvbGl6ZV9oYXNoX2tleXMoCisgICAgICAgICAgICBKZWt5bGw6OlV0aWxzLmRlZXBfbWVyZ2VfaGFzaGVzKAorICAgICAgICAgICAgICBqZWt5bGxfc2Fzc19jb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICBvdmVycmlkZXMKKyAgICAgICAgICAgICkKKyAgICAgICAgICApCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzeW50YXgKKyAgICAgICAgOnNjc3MKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2Fzc19kaXIKKyAgICAgICAgcmV0dXJuICJfc2FzcyIgaWYgamVreWxsX3Nhc3NfY29uZmlndXJhdGlvblsic2Fzc19kaXIiXS50b19zLmVtcHR5PworICAgICAgICBqZWt5bGxfc2Fzc19jb25maWd1cmF0aW9uWyJzYXNzX2RpciJdCisgICAgICBlbmQKKworICAgICAgZGVmIHNhc3Nfc3R5bGUKKyAgICAgICAgc3R5bGUgPSBqZWt5bGxfc2Fzc19jb25maWd1cmF0aW9uLmZldGNoKCJzdHlsZSIsIDpjb21wYWN0KQorICAgICAgICBBTExPV0VEX1NUWUxFUy5pbmNsdWRlPyhzdHlsZS50b19zKSA/IHN0eWxlLnRvX3N5bSA6IDpjb21wYWN0CisgICAgICBlbmQKKworICAgICAgZGVmIHVzZXJfc2Fzc19sb2FkX3BhdGhzCisgICAgICAgIEFycmF5KGpla3lsbF9zYXNzX2NvbmZpZ3VyYXRpb25bImxvYWRfcGF0aHMiXSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2Fzc19kaXJfcmVsYXRpdmVfdG9fc2l0ZV9zb3VyY2UKKyAgICAgICAgSmVreWxsLnNhbml0aXplZF9wYXRoKHNpdGVfc291cmNlLCBzYXNzX2RpcikKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2Fzc19sb2FkX3BhdGhzCisgICAgICAgIHBhdGhzID0gdXNlcl9zYXNzX2xvYWRfcGF0aHMgKyBbc2Fzc19kaXJfcmVsYXRpdmVfdG9fc2l0ZV9zb3VyY2VdCisKKyAgICAgICAgaWYgc2FmZT8KKyAgICAgICAgICAjIFNhbml0aXplIHBhdGhzIHRvIHByZXZlbnQgYW55IGF0dGFjayB2ZWN0b3JzICguZS5nLiBgLyoqLypgKQorICAgICAgICAgIHBhdGhzLm1hcCEgeyB8cGF0aHwgSmVreWxsLnNhbml0aXplZF9wYXRoKHNpdGVfc291cmNlLCBwYXRoKSB9CisgICAgICAgIGVuZAorCisgICAgICAgICMgRXhwYW5kIGZpbGUgZ2xvYnMgKGUuZy4gYG5vZGVfbW9kdWxlcy8qL25vZGVfbW9kdWxlc2AgKQorICAgICAgICBEaXIuY2hkaXIoc2l0ZV9zb3VyY2UpIGRvCisgICAgICAgICAgcGF0aHMgPSBwYXRocy5tYXAgeyB8cGF0aHwgRGlyLmdsb2IocGF0aCkgfS5mbGF0dGVuLnVuaXEKKworICAgICAgICAgIHBhdGhzLm1hcCEgZG8gfHBhdGh8CisgICAgICAgICAgICBpZiBzYWZlPworICAgICAgICAgICAgICAjIFNhbml0aXplIGFnYWluIGluIGNhc2UgZ2xvYmJpbmcgd2FzIGFibGUgdG8gZG8gc29tZXRoaW5nIGNyYXp5LgorICAgICAgICAgICAgICBKZWt5bGwuc2FuaXRpemVkX3BhdGgoc2l0ZV9zb3VyY2UsIHBhdGgpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIEZpbGUuZXhwYW5kX3BhdGgocGF0aCkKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBwYXRocy5zZWxlY3QgeyB8cGF0aHwgRmlsZS5kaXJlY3Rvcnk/KHBhdGgpIH0KKyAgICAgIGVuZAorCisgICAgICBkZWYgYWxsb3dfY2FjaGluZz8KKyAgICAgICAgIXNhZmU/CisgICAgICBlbmQKKworICAgICAgZGVmIGFkZF9jaGFyc2V0PworICAgICAgICAhIWpla3lsbF9zYXNzX2NvbmZpZ3VyYXRpb25bImFkZF9jaGFyc2V0Il0KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2Fzc19jb25maWdzCisgICAgICAgIHNhc3NfYnVpbGRfY29uZmlndXJhdGlvbl9vcHRpb25zKHsKKyAgICAgICAgICAic3ludGF4IiAgICAgPT4gc3ludGF4LAorICAgICAgICAgICJjYWNoZSIgICAgICA9PiBhbGxvd19jYWNoaW5nPywKKyAgICAgICAgICAibG9hZF9wYXRocyIgPT4gc2Fzc19sb2FkX3BhdGhzCisgICAgICAgIH0pCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnQoY29udGVudCkKKyAgICAgICAgb3V0cHV0ID0gOjpTYXNzLmNvbXBpbGUoY29udGVudCwgc2Fzc19jb25maWdzKQorICAgICAgICByZXBsYWNlbWVudCA9IGFkZF9jaGFyc2V0PyA/ICdAY2hhcnNldCAiVVRGLTgiOycgOiAnJworICAgICAgICBvdXRwdXQuc3ViKEJZVEVfT1JERVJfTUFSSywgcmVwbGFjZW1lbnQpCisgICAgICByZXNjdWUgOjpTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiI3tlLnRvX3N9IG9uIGxpbmUgI3tlLnNhc3NfbGluZX0iKQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKyAgICAgIGRlZiBzaXRlX3NvdXJjZQorICAgICAgICBAc2l0ZV9zb3VyY2UgfHw9IEZpbGUuZXhwYW5kX3BhdGgoQGNvbmZpZ1sic291cmNlIl0pLmZyZWV6ZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtd2F0Y2gtMS41LjAvbGliL2pla3lsbC13YXRjaC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC13YXRjaC0xLjUuMC9saWIvamVreWxsLXdhdGNoLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Yzg1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtd2F0Y2gtMS41LjAvbGliL2pla3lsbC13YXRjaC5yYgpAQCAtMCwwICsxLDIgQEAKK3JlcXVpcmVfcmVsYXRpdmUgImpla3lsbC93YXRjaGVyIgorcmVxdWlyZV9yZWxhdGl2ZSAiamVreWxsL2NvbW1hbmRzL3dhdGNoIgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXdhdGNoLTEuNS4wL2xpYi9qZWt5bGwvY29tbWFuZHMvd2F0Y2gucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtd2F0Y2gtMS41LjAvbGliL2pla3lsbC9jb21tYW5kcy93YXRjaC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFkOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvamVreWxsLXdhdGNoLTEuNS4wL2xpYi9qZWt5bGwvY29tbWFuZHMvd2F0Y2gucmIKQEAgLTAsMCArMSwyOCBAQAorbW9kdWxlIEpla3lsbAorICBtb2R1bGUgQ29tbWFuZHMKKyAgICBtb2R1bGUgV2F0Y2gKKyAgICAgIGV4dGVuZCBzZWxmCisKKyAgICAgIGRlZiBpbml0X3dpdGhfcHJvZ3JhbShwcm9nKQorICAgICAgZW5kCisKKyAgICAgICMgQnVpbGQgeW91ciBqZWt5bGwgc2l0ZQorICAgICAgIyBDb250aW51b3VzbHkgd2F0Y2ggaWYgYHdhdGNoYCBpcyBzZXQgdG8gdHJ1ZSBpbiB0aGUgY29uZmlnLgorICAgICAgZGVmIHByb2Nlc3Mob3B0aW9ucykKKyAgICAgICAgSmVreWxsLmxvZ2dlci5sb2dfbGV2ZWwgPSA6ZXJyb3IgaWYgb3B0aW9uc1sncXVpZXQnXQorICAgICAgICB3YXRjaChzaXRlLCBvcHRpb25zKSBpZiBvcHRpb25zWyd3YXRjaCddCisgICAgICBlbmQKKworICAgICAgIyBXYXRjaCBmb3IgZmlsZSBjaGFuZ2VzIGFuZCByZWJ1aWxkIHRoZSBzaXRlLgorICAgICAgIworICAgICAgIyBzaXRlIC0gQSBKZWt5bGw6OlNpdGUgaW5zdGFuY2UKKyAgICAgICMgb3B0aW9ucyAtIEEgSGFzaCBvZiBvcHRpb25zIHBhc3NlZCB0byB0aGUgY29tbWFuZAorICAgICAgIworICAgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgICBkZWYgd2F0Y2goX3NpdGUsIG9wdGlvbnMpCisgICAgICAgIEpla3lsbDo6V2F0Y2hlci53YXRjaChvcHRpb25zKQorICAgICAgZW5kCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2pla3lsbC13YXRjaC0xLjUuMC9saWIvamVreWxsL3dhdGNoZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtd2F0Y2gtMS41LjAvbGliL2pla3lsbC93YXRjaGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2ZiMTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9qZWt5bGwtd2F0Y2gtMS41LjAvbGliL2pla3lsbC93YXRjaGVyLnJiCkBAIC0wLDAgKzEsMTE2IEBACityZXF1aXJlICdsaXN0ZW4nCisKK21vZHVsZSBKZWt5bGwKKyAgbW9kdWxlIFdhdGNoZXIKKyAgICBleHRlbmQgc2VsZgorCisgICAgIyBQdWJsaWM6IENvbnRpbnVvdXNseSB3YXRjaCBmb3IgZmlsZSBjaGFuZ2VzIGFuZCByZWJ1aWxkIHRoZSBzaXRlCisgICAgIyB3aGVuZXZlciBhIGNoYW5nZSBpcyBkZXRlY3RlZC4KKyAgICAjCisgICAgIyBJZiB0aGUgb3B0aW9uYWwgc2l0ZSBhcmd1bWVudCBpcyBwb3B1bGF0ZWQsIHRoYXQgc2l0ZSBpbnN0YW5jZSB3aWxsIGJlCisgICAgIyByZXVzZWQgYW5kIHRoZSBvcHRpb25zIEhhc2ggaWdub3JlZC4gT3RoZXJ3aXNlLCBhIG5ldyBzaXRlIGluc3RhbmNlIHdpbGwKKyAgICAjIGJlIGluc3RhbnRpYXRlZCBmcm9tIHRoZSBvcHRpb25zIEhhc2ggYW5kIHVzZWQuCisgICAgIworICAgICMgb3B0aW9ucyAtIEEgSGFzaCBjb250YWluaW5nIHRoZSBzaXRlIGNvbmZpZ3VyYXRpb24KKyAgICAjIHNpdGUgICAgLSBUaGUgY3VycmVudCBzaXRlIGluc3RhbmNlIChwb3B1bGF0ZWQgc3RhcnRpbmcgd2l0aCBKZWt5bGwgMy4yKQorICAgICMgICAgICAgICAgIChvcHRpb25hbCwgZGVmYXVsdDogbmlsKQorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgd2F0Y2gob3B0aW9ucywgc2l0ZSA9IG5pbCkKKyAgICAgIEVOVlsiTElTVEVOX0dFTV9ERUJVR0dJTkciXSB8fD0gIjEiIGlmIG9wdGlvbnNbJ3ZlcmJvc2UnXQorCisgICAgICBzaXRlIHx8PSBKZWt5bGw6OlNpdGUubmV3KG9wdGlvbnMpCisgICAgICBsaXN0ZW5lciA9IGJ1aWxkX2xpc3RlbmVyKHNpdGUsIG9wdGlvbnMpCisgICAgICBsaXN0ZW5lci5zdGFydAorCisgICAgICBKZWt5bGwubG9nZ2VyLmluZm8gIkF1dG8tcmVnZW5lcmF0aW9uOiIsICJlbmFibGVkIGZvciAnI3tvcHRpb25zWyJzb3VyY2UiXX0nIgorCisgICAgICB1bmxlc3Mgb3B0aW9uc1snc2VydmluZyddCisgICAgICAgIHRyYXAoIklOVCIpIGRvCisgICAgICAgICAgbGlzdGVuZXIuc3RvcAorICAgICAgICAgIHB1dHMgIiAgICAgSGFsdGluZyBhdXRvLXJlZ2VuZXJhdGlvbi4iCisgICAgICAgICAgZXhpdCAwCisgICAgICAgIGVuZAorCisgICAgICAgIHNsZWVwX2ZvcmV2ZXIKKyAgICAgIGVuZAorICAgIHJlc2N1ZSBUaHJlYWRFcnJvcgorICAgICAgIyBZb3UgcHJlc3NlZCBDdHJsLUMsIG9oIG15IQorICAgIGVuZAorCisgICAgIyBUT0RPOiBzaG91bGRuJ3QgYmUgcHVibGljIEFQSQorICAgIGRlZiBidWlsZF9saXN0ZW5lcihzaXRlLCBvcHRpb25zKQorICAgICAgTGlzdGVuLnRvKAorICAgICAgICBvcHRpb25zWydzb3VyY2UnXSwKKyAgICAgICAgOmlnbm9yZSA9PiBsaXN0ZW5faWdub3JlX3BhdGhzKG9wdGlvbnMpLAorICAgICAgICA6Zm9yY2VfcG9sbGluZyA9PiBvcHRpb25zWydmb3JjZV9wb2xsaW5nJ10sCisgICAgICAgICYobGlzdGVuX2hhbmRsZXIoc2l0ZSkpCisgICAgICApCisgICAgZW5kCisKKyAgICBkZWYgbGlzdGVuX2hhbmRsZXIoc2l0ZSkKKyAgICAgIHByb2MgZG8gfG1vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZHwKKyAgICAgICAgdCA9IFRpbWUubm93CisgICAgICAgIGMgPSBtb2RpZmllZCArIGFkZGVkICsgcmVtb3ZlZAorICAgICAgICBuID0gYy5sZW5ndGgKKyAgICAgICAgcHJpbnQgSmVreWxsLmxvZ2dlci5tZXNzYWdlKCJSZWdlbmVyYXRpbmc6IiwKKyAgICAgICAgICAiI3tufSBmaWxlKHMpIGNoYW5nZWQgYXQgI3t0LnN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyIpfSAiKQorICAgICAgICBiZWdpbgorICAgICAgICAgIHNpdGUucHJvY2VzcworICAgICAgICAgIHB1dHMgIi4uLmRvbmUgaW4gI3tUaW1lLm5vdyAtIHR9IHNlY29uZHMuIgorICAgICAgICByZXNjdWUgPT4gZQorICAgICAgICAgIHB1dHMgIi4uLmVycm9yOiIKKyAgICAgICAgICBKZWt5bGwubG9nZ2VyLndhcm4gIkVycm9yOiIsIGUubWVzc2FnZQorICAgICAgICAgIEpla3lsbC5sb2dnZXIud2FybiAiRXJyb3I6IiwgIlJ1biBqZWt5bGwgYnVpbGQgLS10cmFjZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgY3VzdG9tX2V4Y2x1ZGVzKG9wdGlvbnMpCisgICAgICBBcnJheShvcHRpb25zWydleGNsdWRlJ10pLm1hcCB7IHxlfCBKZWt5bGwuc2FuaXRpemVkX3BhdGgob3B0aW9uc1snc291cmNlJ10sIGUpIH0KKyAgICBlbmQKKworICAgIGRlZiBjb25maWdfZmlsZXMob3B0aW9ucykKKyAgICAgICV3KHltbCB5YW1sIHRvbWwpLm1hcCBkbyB8ZXh0fAorICAgICAgICBKZWt5bGwuc2FuaXRpemVkX3BhdGgob3B0aW9uc1snc291cmNlJ10sICJfY29uZmlnLiN7ZXh0fSIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiB0b19leGNsdWRlKG9wdGlvbnMpCisgICAgICBbCisgICAgICAgIGNvbmZpZ19maWxlcyhvcHRpb25zKSwKKyAgICAgICAgb3B0aW9uc1snZGVzdGluYXRpb24nXSwKKyAgICAgICAgY3VzdG9tX2V4Y2x1ZGVzKG9wdGlvbnMpCisgICAgICBdLmZsYXR0ZW4KKyAgICBlbmQKKworICAgICMgUGF0aHMgdG8gaWdub3JlIGZvciB0aGUgd2F0Y2ggb3B0aW9uCisgICAgIworICAgICMgb3B0aW9ucyAtIEEgSGFzaCBvZiBvcHRpb25zIHBhc3NlZCB0byB0aGUgY29tbWFuZAorICAgICMKKyAgICAjIFJldHVybnMgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIGZyb20gc291cmNlIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICBkZWYgbGlzdGVuX2lnbm9yZV9wYXRocyhvcHRpb25zKQorICAgICAgc291cmNlICAgICAgID0gUGF0aG5hbWUubmV3KG9wdGlvbnNbJ3NvdXJjZSddKS5leHBhbmRfcGF0aAorICAgICAgcGF0aHMgICAgICAgID0gdG9fZXhjbHVkZShvcHRpb25zKQorCisgICAgICBwYXRocy5tYXAgZG8gfHB8CisgICAgICAgIGFic29sdXRlX3BhdGggPSBQYXRobmFtZS5uZXcocCkuZXhwYW5kX3BhdGgKKyAgICAgICAgbmV4dCB1bmxlc3MgYWJzb2x1dGVfcGF0aC5leGlzdD8KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICByZWxhdGl2ZV9wYXRoID0gYWJzb2x1dGVfcGF0aC5yZWxhdGl2ZV9wYXRoX2Zyb20oc291cmNlKS50b19zCisgICAgICAgICAgdW5sZXNzIHJlbGF0aXZlX3BhdGguc3RhcnRfd2l0aD8oJy4uLycpCisgICAgICAgICAgICBwYXRoX3RvX2lnbm9yZSA9IFJlZ2V4cC5uZXcoUmVnZXhwLmVzY2FwZShyZWxhdGl2ZV9wYXRoKSkKKyAgICAgICAgICAgIEpla3lsbC5sb2dnZXIuZGVidWcgIldhdGNoZXI6IiwgIklnbm9yaW5nICN7cGF0aF90b19pZ25vcmV9IgorICAgICAgICAgICAgcGF0aF90b19pZ25vcmUKKyAgICAgICAgICBlbmQKKyAgICAgICAgcmVzY3VlIEFyZ3VtZW50RXJyb3IKKyAgICAgICAgICAjIENvdWxkIG5vdCBmaW5kIGEgcmVsYXRpdmUgcGF0aAorICAgICAgICBlbmQKKyAgICAgIGVuZC5jb21wYWN0ICsgWy9cLmpla3lsbFwtbWV0YWRhdGEvXQorICAgIGVuZAorCisgICAgZGVmIHNsZWVwX2ZvcmV2ZXIKKyAgICAgIGxvb3AgeyBzbGVlcCAxMDAwIH0KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9BVVRIT1JTIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4MzU5NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9BVVRIT1JTCkBAIC0wLDAgKzEgQEAKK1RoZSBhdXRob3Igb2Yga3JhbWRvd24gaXMgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL0NPTlRSSUJVVEVSUyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9DT05UUklCVVRFUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlMzg4NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9DT05UUklCVVRFUlMKQEAgLTAsMCArMSw1NCBAQAorICBDb3VudCBOYW1lCis9PT09PT09ID09PT0KKyAgICA4NDcgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisgICAgICA2IEdpb2VsZSBCYXJhYnVjY2kgPGdpb2VsZUBzdmFyaW8uaXQ+CisgICAgICA0IFRlZCBQYWsgPHBvd2VycGFrMDA2QGdtYWlsLmNvbT4KKyAgICAgIDQgU2h1YW5nbGVpIFRhbyA8dHNsMDkyMkBnbWFpbC5jb20+CisgICAgICA0IEFybmUgQnJhc3NldXIgPGFybmVAYXJuZWJyYXNzZXVyLm5ldD4KKyAgICAgIDMgSGVubmluZyBQZXJsIDxwZXJsQGZhc3Qtc2ljaGVyLmRlPgorICAgICAgMyBnZXR0YWxvbmcgPHRfbGVpdG5lckBnbXguYXQ+CisgICAgICAzIEJyYW5kdXIgPGJyYW5kdXJAbXV0ZWxpZ2h0Lm9yZz4KKyAgICAgIDMgQmVuIEFybXN0b24gPGJlbi5hcm1zdG9uQGdvb2dsZW1haWwuY29tPgorICAgICAgMyBBbGV4IE1hcmFuZG9uIDxjb250YWN0QGFsZXhtYXJhbmRvbi5jb20+CisgICAgICAyIFRvbSBUaG9yb2dvb2QgPG1lK2dpdGh1YkB0b210aG9yb2dvb2QuY28udWs+CisgICAgICAyIFBhcmtlciBNb29yZSA8cGFya3Jtb29yZUBnbWFpbC5jb20+CisgICAgICAyIE5hdGhhbmFlbCBKb25lcyA8bmF0aGFuYWVsLmpvbmVzQGdtYWlsLmNvbT4KKyAgICAgIDIgTWF4IE1leWVyIDxkZXZAZmVkdXgub3JnPgorICAgICAgMiBKbyBIdW5kIDxqaHVuZEBjbGVhcmNvdmUuY2E+CisgICAgICAyIEJyYW4gPG0udmVyc3VtQGdtYWlsLmNvbT4KKyAgICAgIDEgd2lubmllaGVsbCA8Z2l0QHdpbm5pZWhlbGwuZGU+CisgICAgICAxIFdpbGxpYW0gPHN1dHRvbndpbGxpYW1kQGdtYWlsLmNvbT4KKyAgICAgIDEgdXRlbm1pa2kgPHV0ZW5taWtpQGdtYWlsLmNvbT4KKyAgICAgIDEgVHJldm9yIFdlbm5ibG9tIDx0cmV2b3JAd2VsbC5jb20+CisgICAgICAxIHRvbXlrYWlyYSA8dG9teWthaXJhQGdtYWlsLmNvbT4KKyAgICAgIDEgVGltIEJsYWlyIDx0aW1AYmxhLmlyPgorICAgICAgMSBUaW0gQmVzYXJkIDx0aW0uYmVzYXJkQGdtYWlsLmNvbT4KKyAgICAgIDEgVGltIEJhdGVzIDx0aW1AcnVtcHVzbGFicy5jb20+CisgICAgICAxIFN1biBZYW96aHUgPHl6eXpzdW5AZ21haWwuY29tPgorICAgICAgMSBTaW1vbiBMeWRlbGwgPHNpbW9uLmx5ZGVsbEBnbWFpbC5jb20+CisgICAgICAxIFNodXNha3UgTkFLQVpBVE8gPGN1MzkzdWNAZ21haWwuY29tPgorICAgICAgMSBTZWJhc3RpYW4gQm9laG0gPHNlYmFzdGlhbkBzb21ldGltZXNmb29kLm9yZz4KKyAgICAgIDEgUG9zdG1vZGVybiA8cG9zdG1vZGVybi5tb2QzQGdtYWlsLmNvbT4KKyAgICAgIDEgUGV0ZSBNaWNoYXVkIDxtaWNoYXVkcEBnbWFpbC5jb20+CisgICAgICAxIG15cWxhcnNvbiA8bXlxbGFyc29uQGdtYWlsLmNvbT4KKyAgICAgIDEgTWljaGFsIFRpbGwgPG1pY2hhbC50aWxsQGdtYWlsLmNvbT4KKyAgICAgIDEgTWF0dCBIaWNrZm9yZCA8bWF0dC5oaWNrZm9yZEBnbWFpbC5jb20+CisgICAgICAxIE1hcnR5biBDaGFtYmVybGluIDxtYXJ0eW5AcGVyZmVjdGlvbmNvZGluZy5jb20+CisgICAgICAxIE1hcmVrIFR1Y2hvd3NraSA8bWFyZWtAdHVjaG93c2tpLmNvbS5wbD4KKyAgICAgIDEgTWFyY3VzIFN0b2xsc3RlaW1lciA8c3RvLm1hckB3ZWIuZGU+CisgICAgICAxIEx1Y2EgQmFyYmF0byA8bHVjYS5iYXJiYXRvQGdtYWlsLmNvbT4KKyAgICAgIDEgbDNrbiA8aGVsbG9AbDNrbi5kZT4KKyAgICAgIDEgSm9uYXRoYW4gSG9vcGVyIDxqb25hdGhhbi5ob29wZXJAZ3NhLmdvdj4KKyAgICAgIDEgSm9obiBDcm9pc2FudCA8amFjaXVzQGdtYWlsLmNvbT4KKyAgICAgIDEgSm9lIEZpb3JpbmkgPGpvZUBmYWl0aGZ1bGdlZWsub3JnPgorICAgICAgMSBKZW5zIEtyYWVtZXIgPGprQGprcmFlbWVyLm5ldD4KKyAgICAgIDEgSGlyb2Z1bWkgV2FrYXN1Z2kgPGJhZW5lakBnbWFpbC5jb20+CisgICAgICAxIEhlY3RvciBDb3JyZWEgPGhlY3RvckBoZWN0b3Jjb3JyZWEuY29tPgorICAgICAgMSBGbG9yaWFuIEtsYW1wZmVyIDxmLmtsYW1wZmVyQGdtYWlsLmNvbT4KKyAgICAgIDEgRmxvcmVhbCBNb3JhbmRhdCBmbG9yZWFsbUBnbWFpbC5jb20gPGZsb3JlYWxtQGdtYWlsLmNvbT4KKyAgICAgIDEgRGllZ28gR2FsZW90YSA8ZGllZ29iZzEyM0BnbWFpbC5jb20+CisgICAgICAxIERhbWllbiBQb2xsZXQgPGRhbWllbi5wb2xsZXRAZ21haWwuY29tPgorICAgICAgMSBDaHJpc3RvcGhlciBKZWZmZXJzb24gPGNhajIxQHN0LWFuZHJld3MuYWMudWs+CisgICAgICAxIEPDqWRyaWMgQm91dGlsbGllciA8Y2VkcmljLmJvdXRpbGxpZXJAZ21haWwuY29tPgorICAgICAgMSBBbGV4IFRvbWxpbnMgPGFsZXgudG9tbGluc0BkaWdpdGFsLmNhYmluZXQtb2ZmaWNlLmdvdi51az4KKyAgICAgIDEgQWxleGV5IFZhc2lsaWV2IDxsZTBwYXJkQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9DT1BZSU5HIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyOTI4MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9DT1BZSU5HCkBAIC0wLDAgKzEsMzAgQEAKK2tyYW1kb3duIC0gZmFzdCwgcHVyZS1SdWJ5IE1hcmtkb3duLXN1cGVyc2V0IGNvbnZlcnRlcgorQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCitjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK1RPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworCitTb21lIHRlc3QgY2FzZXMgYW5kIHRoZSBiZW5jaG1hcmsgZmlsZXMgYXJlIGJhc2VkIG9uIHRlc3QgY2FzZXMgZnJvbQordGhlIE1EVGVzdCB0ZXN0IHN1aXRlOgorCisgICAgTURUZXN0CisgICAgQ29weXJpZ2h0IChjKSAyMDA3IE1pY2hlbCBGb3J0aW4KKyAgICA8aHR0cDovL3d3dy5taWNoZWxmLmNvbS8+CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9SRUFETUUubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOWJmMDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNzEgQEAKKyMga3JhbWRvd24KKworIyMgUmVhZG1lIGZpcnN0IQorCitrcmFtZG93biB3YXMgb3JpZ2luYWxseSBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHVudGlsIHRoZSAxLjAuMCByZWxlYXNlLiBIb3dldmVyLCBkdWUgdG8gdGhlIG1hbnkKK3JlcXVlc3RzIGl0IGlzIG5vdyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgYW5kIHRoZXJlZm9yZSBjYW4gZWFzaWx5IGJlIHVzZWQgaW4gY29tbWVyY2lhbAorcHJvamVjdHMsIHRvby4KKworSG93ZXZlciwgaWYgeW91IHVzZSBrcmFtZG93biBpbiBhIGNvbW1lcmNpYWwgc2V0dGluZywgcGxlYXNlIGNvbnNpZGVyICoqY29udHJpYnV0aW5nIGJhY2sgYW55CitjaGFuZ2VzKiogZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBjb21tdW5pdHkgYW5kL29yCitbKipiZWNvbWluZyBhIHBhdHJvbioqXShodHRwczovL3d3dy5wYXRyZW9uLmNvbS9nZXR0YWxvbmcpIC0gdGhhbmtzIQorCisKKyMjIEludHJvZHVjdGlvbgorCitrcmFtZG93biBpcyBhIGZhc3QsIHB1cmUgUnVieSBNYXJrZG93biBzdXBlcnNldCBjb252ZXJ0ZXIsIHVzaW5nIGEgc3RyaWN0IHN5bnRheCBkZWZpbml0aW9uIGFuZAorc3VwcG9ydGluZyBzZXZlcmFsIGNvbW1vbiBleHRlbnNpb25zLgorCitUaGUgc3ludGF4IGRlZmluaXRpb24gZm9yIHRoZSBrcmFtZG93biBzeW50YXggY2FuIGJlIGZvdW5kIGluICoqZG9jL3N5bnRheC5wYWdlKiogKG9yIG9ubGluZSBhdAorPGh0dHA6Ly9rcmFtZG93bi5nZXR0YWxvbmcub3JnL3N5bnRheC5odG1sPikgYW5kIGEgcXVpY2sgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZSBpbgorKipkb2MvcXVpY2tyZWYucGFnZSoqIG9yIG9ubGluZSBhdCA8aHR0cDovL2tyYW1kb3duLmdldHRhbG9uZy5vcmcvcXVpY2tyZWYuaHRtbD4uCisKK1RoZSBrcmFtZG93biBsaWJyYXJ5IGlzIG1haW5seSB3cml0dGVuIHRvIHN1cHBvcnQgdGhlIGtyYW1kb3duLXRvLUhUTUwgY29udmVyc2lvbiBjaGFpbi4gSG93ZXZlciwKK2R1ZSB0byBpdHMgZmxleGliaWxpdHkgKGJ5IGNyZWF0aW5nIGFuIGludGVybmFsIEFTVCkgaXQgc3VwcG9ydHMgb3RoZXIgaW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzIGFzCit3ZWxsLiBIZXJlIGlzIGEgbGlzdCBvZiB0aGUgc3VwcG9ydGVkIGZvcm1hdHM6CisKKyogaW5wdXQgZm9ybWF0czoga3JhbWRvd24gKGEgTWFya2Rvd24gc3VwZXJzZXQpLCBNYXJrZG93biwgR0ZNLCBIVE1MCisqIG91dHB1dCBmb3JtYXRzOiBIVE1MLCBrcmFtZG93biwgTGFUZVggKGFuZCB0aGVyZWZvcmUgUERGKSwgUERGIHZpYSBQcmF3bgorCitBbGwgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgaXMgYXZhaWxhYmxlIGluIHRoZSAqKmRvYy8qKgorZGlyZWN0b3J5IGFuZCBvbmxpbmUgYXQgPGh0dHA6Ly9rcmFtZG93bi5nZXR0YWxvbmcub3JnPi4KKworU3RhcnRpbmcgZnJvbSB2ZXJzaW9uIDEuMC4wIGtyYW1kb3duIGlzIHVzaW5nIGEgdmVyc2lvbmluZyBzY2hlbWUgd2l0aCBtYWpvciwgbWlub3IgYW5kIHBhdGNoIHBhcnRzCitpbiB0aGUgdmVyc2lvbiBudW1iZXIgd2hlcmUgdGhlIG1ham9yIG51bWJlciBjaGFuZ2VzIG9uIGJhY2t3YXJkcy1pbmNvbXBhdGlibGUgY2hhbmdlcywgdGhlIG1pbm9yCitudW1iZXIgb24gdGhlIGludHJvZHVjdGlvbiBvZiBuZXcgZmVhdHVyZXMgYW5kIHRoZSBwYXRjaCBudW1iZXIgb24gZXZlcnl0aGluZyBlbHNlLgorCitGb3IgaW5mb3JtYXRpb24gYWJvdXQgY2hhbmdlcyBiZXR3ZWVuIHZlcnNpb25zLCBoYXZlIGEgbG9vayBhdAorPGh0dHA6Ly9rcmFtZG93bi5nZXR0YWxvbmcub3JnL25ld3MuaHRtbD4gb3IgdGhlIGNvbW1pdCBoaXN0b3J5IQorCisKKyMjIFVzYWdlCisKK2tyYW1kb3duIGhhcyBhIHZlcnkgc2ltcGxlIEFQSSwgc28gdXNpbmcga3JhbWRvd24gaXMgYXMgZWFzeSBhcworCitgYGBydWJ5CityZXF1aXJlICdrcmFtZG93bicKKworS3JhbWRvd246OkRvY3VtZW50Lm5ldyh0ZXh0KS50b19odG1sCitgYGAKKworRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIGhhdmUgYSBsb29rIGF0IHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBvZiB0aGUgYEtyYW1kb3duOjpEb2N1bWVudGAgY2xhc3MuCisKK1RoZSBmdWxsIEFQSSBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdCA8aHR0cDovL2tyYW1kb3duLmdldHRhbG9uZy5vcmcvcmRvYy8+LCBvdGhlciBzaXRlcyB3aXRoIGFuCitBUEkgZG9jdW1lbnRhdGlvbiBmb3Iga3JhbWRvd24gcHJvYmFibHkgZG9uJ3QgcHJvdmlkZSB0aGUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiEKKworVGhlcmUgYXJlIGFsc28gc29tZSB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgdGhhdCBleHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2Yga3JhbWRvd24gLS0gc2VlIHRoZQora3JhbWRvd24gV2lraSBhdCA8aHR0cHM6Ly9naXRodWIuY29tL2dldHRhbG9uZy9rcmFtZG93bi93aWtpPi4KKworCisjIyBEZXZlbG9wbWVudAorCitKdXN0IGNsb25lIHRoZSBnaXQgcmVwb3NpdG9yeSBhcyBkZXNjcmliZWQgaW4gKipkb2MvaW5zdGFsbGF0aW9uLnBhZ2UqKiBhbmQgeW91IGFyZSBnb29kIHRvIGdvLiBZb3UKK3Byb2JhYmx5IHdhbnQgdG8gaW5zdGFsbCBgcmFrZWAgc28gdGhhdCB5b3UgY2FuIHVzZSB0aGUgcHJvdmlkZWQgcmFrZSB0YXNrcy4KKworSWYgeW91IHdhbnQgdG8gcnVuIHRoZSB0ZXN0cywgdGhlIGRldmVsb3BtZW50IGRlcGVuZGVuY2llcyBhcmUgbmVlZGVkIGFzIHdlbGwgYXMgc29tZSBhZGRpdGlvbmFsCitwcm9ncmFtcyBsaWtlIGB0aWR5YCBhbmQgYGxhdGV4YC4gU2VlIHRoZSBgLnRyYXZpcy55bWxgIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKworIyMgTGljZW5zZQorCitNSVQgLSBzZWUgdGhlICoqQ09QWUlORyoqIGZpbGUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvUmFrZWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvUmFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwNTI1YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9SYWtlZmlsZQpAQCAtMCwwICsxLDI3MiBAQAorIyAtKi0gcnVieSAtKi0KKworIyBsb2FkIGFsbCBvcHRpb25hbCBkZXZlbG9wZXIgbGlicmFyaWVzCitiZWdpbgorICByZXF1aXJlICdydWJ5Z2VtcycKKyAgcmVxdWlyZSAncnVieWdlbXMvcGFja2FnZV90YXNrJworcmVzY3VlIExvYWRFcnJvcgorZW5kCisKK2JlZ2luCisgIHJlcXVpcmUgJ3dlYmdlbi9wYWdlJworcmVzY3VlIExvYWRFcnJvcgorZW5kCisKK2JlZ2luCisgIGdlbSAncmRvYycgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgIHJlcXVpcmUgJ3Jkb2MvdGFzaycKKyAgcmVxdWlyZSAncmRvYy9yZG9jJworCisgIGNsYXNzIFJEb2M6OlJEb2MKKworICAgIGFsaWFzIDpvbGRfcGFyc2VfZmlsZXMgOnBhcnNlX2ZpbGVzCisKKyAgICBkZWYgcGFyc2VfZmlsZXMob3B0aW9ucykKKyAgICAgIGZpbGVfaW5mbyA9IG9sZF9wYXJzZV9maWxlcyhvcHRpb25zKQorICAgICAgcmVxdWlyZSAna3JhbWRvd24vb3B0aW9ucycKKworICAgICAgIyBBZGQgb3B0aW9ucyBkb2N1bWVudGF0aW9uIHRvIEtyYW1kb3duOjpPcHRpb25zIG1vZHVsZQorICAgICAgb3B0X21vZHVsZSA9IEBzdG9yZS5hbGxfY2xhc3Nlc19hbmRfbW9kdWxlcy5maW5kIHt8bXwgbS5mdWxsX25hbWUgPT0gJ0tyYW1kb3duOjpPcHRpb25zJ30KKyAgICAgIG9wdF9kZWZzID0gS3JhbWRvd246Ok9wdGlvbnMuZGVmaW5pdGlvbnMuc29ydC5jb2xsZWN0IGRvIHxuLCBkZWZpbml0aW9ufAorICAgICAgICBkZXNjID0gZGVmaW5pdGlvbi5kZXNjLnNwbGl0KC9cbi8pLm1hcCB7fGx8ICIgICAgI3tsfSJ9CisgICAgICAgIGRlc2NbLTJdID0gW10KKyAgICAgICAgZGVzYyA9IGRlc2Muam9pbigiXG4iKQorICAgICAgICAiWzx0dD4je259PC90dD4gKHR5cGU6ICN7ZGVmaW5pdGlvbi50eXBlfSwgZGVmYXVsdDogI3tkZWZpbml0aW9uLmRlZmF1bHQuaW5zcGVjdH0pXVxuI3tkZXNjfVxuXG4iCisgICAgICBlbmQKKyAgICAgIG9wdF9tb2R1bGUuY29tbWVudC50ZXh0ICs9ICJcbj09IEF2YWlsYWJsZSBPcHRpb25zXG5cbiIgPDwgb3B0X2RlZnMuam9pbigiXG5cbiIpCisKKyAgICAgIGZpbGVfaW5mbworICAgIGVuZAorCisgIGVuZAorCityZXNjdWUgTG9hZEVycm9yCitlbmQKKworYmVnaW4KKyAgcmVxdWlyZSAncmNvdi9yY292dGFzaycKK3Jlc2N1ZSBMb2FkRXJyb3IKK2VuZAorCityZXF1aXJlICdmaWxldXRpbHMnCityZXF1aXJlICdyYWtlL2NsZWFuJworcmVxdWlyZSAncmFrZS90ZXN0dGFzaycKK3JlcXVpcmUgJ3Jha2UvcGFja2FnZXRhc2snCityZXF1aXJlICdlcmInCisKKyQ6LnVuc2hpZnQoJ2xpYicpCityZXF1aXJlICdrcmFtZG93bicKKworIyBFbmQgdXNlciB0YXNrcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3Rhc2sgOmRlZmF1bHQgPT4gOnRlc3QKKworZGVzYyAiSW5zdGFsbCB1c2luZyBzZXR1cC5yYiIKK3Rhc2sgOmluc3RhbGwgZG8KKyAgcnVieSAic2V0dXAucmIgY29uZmlnIgorICBydWJ5ICJzZXR1cC5yYiBzZXR1cCIKKyAgcnVieSAic2V0dXAucmIgaW5zdGFsbCIKK2VuZAorCit0YXNrIDpjbG9iYmVyIGRvCisgIHJ1YnkgInNldHVwLnJiIGNsZWFuIgorZW5kCisKK2lmIGRlZmluZWQ/KFdlYmdlbikKKyAgZGVzYyAiR2VuZXJhdGUgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbiIKKyAgdGFzayA6aHRtbGRvYyBkbworICAgIHJ1YnkgIi1JbGliIC1TIHdlYmdlbiIKKyAgZW5kCisgIENMT0JCRVIgPDwgImh0bWxkb2MvIgorICBDTE9CQkVSIDw8ICJ3ZWJnZW4tdG1wIgorZW5kCisKK2lmIGRlZmluZWQ/IFJEb2M6OlRhc2sKKyAgcmQgPSBSRG9jOjpUYXNrLm5ldyBkbyB8cmRvY3wKKyAgICByZG9jLnJkb2NfZGlyID0gJ2h0bWxkb2MvcmRvYycKKyAgICByZG9jLnRpdGxlID0gJ2tyYW1kb3duJworICAgIHJkb2MubWFpbiA9ICdsaWIva3JhbWRvd24vZG9jdW1lbnQucmInCisgICAgcmRvYy5yZG9jX2ZpbGVzLmluY2x1ZGUoJ2xpYicpCisgIGVuZAorZW5kCisKK2lmIGRlZmluZWQ/KFdlYmdlbikgJiYgZGVmaW5lZD8oUkRvYzo6VGFzaykKKyAgZGVzYyAiQnVpbGQgdGhlIHdob2xlIHVzZXIgZG9jdW1lbnRhdGlvbiIKKyAgdGFzayA6ZG9jID0+IFs6cmRvYywgJ2h0bWxkb2MnXQorZW5kCisKK3R0ID0gUmFrZTo6VGVzdFRhc2submV3IGRvIHx0ZXN0fAorICB0ZXN0Lndhcm5pbmcgPSBmYWxzZQorICB0ZXN0LmxpYnMgPDwgJ3Rlc3QnCisgIHRlc3QudGVzdF9maWxlcyA9IEZpbGVMaXN0Wyd0ZXN0L3Rlc3RfKi5yYiddCitlbmQKKworIyBSZWxlYXNlIHRhc2tzIGFuZCBkZXZlbG9wbWVudCB0YXNrcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCituYW1lc3BhY2UgOmRldiBkbworCisgIFNVTU1BUlkgPSAna3JhbWRvd24gaXMgYSBmYXN0LCBwdXJlLVJ1YnkgTWFya2Rvd24tc3VwZXJzZXQgY29udmVydGVyLicKKyAgREVTQ1JJUFRJT04gPSA8PEVPRgora3JhbWRvd24gaXMgeWV0LWFub3RoZXItbWFya2Rvd24tcGFyc2VyIGJ1dCBmYXN0LCBwdXJlIFJ1YnksCit1c2luZyBhIHN0cmljdCBzeW50YXggZGVmaW5pdGlvbiBhbmQgc3VwcG9ydGluZyBzZXZlcmFsIGNvbW1vbiBleHRlbnNpb25zLgorRU9GCisKKyAgYmVnaW4KKyAgICBSRUxfUEFHRSA9IFdlYmdlbjo6UGFnZS5mcm9tX2RhdGEoRmlsZS5yZWFkKCdkb2MvbmV3cy9yZWxlYXNlXycgKyBLcmFtZG93bjo6VkVSU0lPTi5zcGxpdCgnLicpLmpvaW4oJ18nKSArICcucGFnZScpKQorICByZXNjdWUKKyAgICBwdXRzICdOTyBSRUxFQVNFIE5PVEVTL0NIQU5HRVMgRklMRScKKyAgZW5kCisKKyAgUEtHX0ZJTEVTID0gRmlsZUxpc3QubmV3KFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmFrZWZpbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR1cC5yYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NPUFlJTkcnLCAnUkVBRE1FLm1kJywgJ0FVVEhPUlMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWRVJTSU9OJywgJ0NPTlRSSUJVVEVSUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jpbi8qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmVuY2htYXJrLyonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaWIvKiovKi5yYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hbi9tYW4xL2tyYW1kb3duLjEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhLyoqLyonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb2MvKionLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LyoqLyonCisgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgIENMT0JCRVIgPDwgIlZFUlNJT04iCisgIGZpbGUgJ1ZFUlNJT04nIGRvCisgICAgcHV0cyAiR2VuZXJhdGluZyBWRVJTSU9OIGZpbGUiCisgICAgRmlsZS5vcGVuKCdWRVJTSU9OJywgJ3crJykge3xmaWxlfCBmaWxlLndyaXRlKEtyYW1kb3duOjpWRVJTSU9OICsgIlxuIil9CisgIGVuZAorCisgIENMT0JCRVIgPDwgJ0NPTlRSSUJVVEVSUycKKyAgZmlsZSAnQ09OVFJJQlVURVJTJyBkbworICAgIHB1dHMgIkdlbmVyYXRpbmcgQ09OVFJJQlVURVJTIGZpbGUiCisgICAgYGVjaG8gIiAgQ291bnQgTmFtZSIgPiBDT05UUklCVVRFUlNgCisgICAgYGVjaG8gIj09PT09PT0gPT09PSIgPj4gQ09OVFJJQlVURVJTYAorICAgIGBnaXQgbG9nIHwgZ3JlcCBeQXV0aG9yOiB8IHNlZCAncy9eQXV0aG9yOiAvLycgfCBzb3J0IHwgdW5pcSAtYyB8IHNvcnQgLW5yID4+IENPTlRSSUJVVEVSU2AKKyAgZW5kCisKKyAgQ0xPQkJFUiA8PCAibWFuL21hbjEva3JhbWRvd24uMSIKKyAgZmlsZSAnbWFuL21hbjEva3JhbWRvd24uMScgPT4gWydtYW4vbWFuMS9rcmFtZG93bi4xLmVyYiddIGRvCisgICAgcHV0cyAiR2VuZXJhdGluZyBrcmFtZG93biBtYW4gcGFnZSIKKyAgICBGaWxlLm9wZW4oJ21hbi9tYW4xL2tyYW1kb3duLjEnLCAndysnKSBkbyB8ZmlsZXwKKyAgICAgIGRhdGEgPSBFUkIubmV3KEZpbGUucmVhZCgnbWFuL21hbjEva3JhbWRvd24uMS5lcmInKSkucmVzdWx0KGJpbmRpbmcpCisgICAgICBmaWxlLndyaXRlKEtyYW1kb3duOjpEb2N1bWVudC5uZXcoZGF0YSkudG9fbWFuKQorICAgIGVuZAorICBlbmQKKworICBSYWtlOjpQYWNrYWdlVGFzay5uZXcoJ2tyYW1kb3duJywgS3JhbWRvd246OlZFUlNJT04pIGRvIHxwa2d8CisgICAgcGtnLm5lZWRfdGFyID0gdHJ1ZQorICAgIHBrZy5uZWVkX3ppcCA9IHRydWUKKyAgICBwa2cucGFja2FnZV9maWxlcyA9IFBLR19GSUxFUworICBlbmQKKworICBpZiBkZWZpbmVkPyBHZW0KKyAgICBzcGVjID0gR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKworICAgICAgIyMjIyBCYXNpYyBpbmZvcm1hdGlvbgorICAgICAgcy5uYW1lID0gJ2tyYW1kb3duJworICAgICAgcy52ZXJzaW9uID0gS3JhbWRvd246OlZFUlNJT04KKyAgICAgIHMuc3VtbWFyeSA9IFNVTU1BUlkKKyAgICAgIHMuZGVzY3JpcHRpb24gPSBERVNDUklQVElPTgorICAgICAgcy5saWNlbnNlID0gJ01JVCcKKworICAgICAgIyMjIyBEZXBlbmRlbmNpZXMsIHJlcXVpcmVtZW50cyBhbmQgZmlsZXMKKyAgICAgIHMuZmlsZXMgPSBQS0dfRklMRVMudG9fYQorCisgICAgICBzLnJlcXVpcmVfcGF0aCA9ICdsaWInCisgICAgICBzLmV4ZWN1dGFibGVzID0gWydrcmFtZG93biddCisgICAgICBzLmRlZmF1bHRfZXhlY3V0YWJsZSA9ICdrcmFtZG93bicKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ21pbml0ZXN0JywgJ34+IDUuMCcKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ2NvZGVyYXknLCAnfj4gMS4wLjAnCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyb3VnZScsICd+PiAxLjgnCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdzdHJpbmdleCcsICd+PiAxLjUuMScKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByYXduJywgJ34+IDIuMCcKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByYXduLXRhYmxlJywgJ34+IDAuMi4yJworICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncml0ZXgnLCAnfj4gMS4wJworICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAnaXRleHRvbW1sJywgJ34+IDEuNScKKworICAgICAgIyMjIyBEb2N1bWVudGF0aW9uCisKKyAgICAgIHMuaGFzX3Jkb2MgPSB0cnVlCisgICAgICBzLnJkb2Nfb3B0aW9ucyA9IFsnLS1tYWluJywgJ2xpYi9rcmFtZG93bi9kb2N1bWVudC5yYiddCisKKyAgICAgICMjIyMgQXV0aG9yIGFuZCBwcm9qZWN0IGRldGFpbHMKKworICAgICAgcy5hdXRob3IgPSAnVGhvbWFzIExlaXRuZXInCisgICAgICBzLmVtYWlsID0gJ3RfbGVpdG5lckBnbXguYXQnCisgICAgICBzLmhvbWVwYWdlID0gImh0dHA6Ly9rcmFtZG93bi5nZXR0YWxvbmcub3JnIgorICAgIGVuZAorCisKKyAgICB0YXNrIDpnZW1zcGVjID0+IFsgJ0NPTlRSSUJVVEVSUycsICdWRVJTSU9OJywgJ21hbi9tYW4xL2tyYW1kb3duLjEnXSBkbworICAgICAgcHJpbnQgIkdlbmVyYXRpbmcgR2Vtc3BlY1xuIgorICAgICAgY29udGVudHMgPSBzcGVjLnRvX3J1YnkKKyAgICAgIEZpbGUub3Blbigia3JhbWRvd24uZ2Vtc3BlYyIsICd3KycpIHt8ZnwgZi5wdXRzKGNvbnRlbnRzKX0KKyAgICBlbmQKKworICAgIEdlbTo6UGFja2FnZVRhc2submV3KHNwZWMpIGRvIHxwa2d8CisgICAgICBwa2cubmVlZF96aXAgPSB0cnVlCisgICAgICBwa2cubmVlZF90YXIgPSB0cnVlCisgICAgZW5kCisKKyAgZW5kCisKKyAgaWYgZGVmaW5lZD8oV2ViZ2VuKSAmJiBkZWZpbmVkPyhHZW0pICYmIGRlZmluZWQ/KFJha2U6OlJEb2NUYXNrKQorICAgIGRlc2MgJ1JlbGVhc2UgS3JhbWRvd24gdmVyc2lvbiAnICsgS3JhbWRvd246OlZFUlNJT04KKyAgICB0YXNrIDpyZWxlYXNlID0+IFs6Y2xvYmJlciwgOnBhY2thZ2UsIDpwdWJsaXNoX2ZpbGVzLCA6cHVibGlzaF93ZWJzaXRlXQorICBlbmQKKworICBpZiBkZWZpbmVkPyhHZW0pCisgICAgZGVzYyAiVXBsb2FkIHRoZSByZWxlYXNlIHRvIFJ1YnlnZW1zIgorICAgIHRhc2sgOnB1Ymxpc2hfZmlsZXMgPT4gWzpwYWNrYWdlXSBkbworICAgICAgc2ggImdlbSBwdXNoIHBrZy9rcmFtZG93bi0je0tyYW1kb3duOjpWRVJTSU9OfS5nZW0iCisgICAgICBwdXRzICdkb25lJworICAgIGVuZAorICBlbmQKKworICBkZXNjICJVcGxvYWQgdGhlIHdlYnNpdGUiCisgIHRhc2sgOnB1Ymxpc2hfd2Vic2l0ZSA9PiBbJ2RvYyddIGRvCisgICAgcHV0cyAiVHJhbnNmZXIgbWFudWFsbHkhISEiCisgICAgIyBzaCAicnN5bmMgLWF2YyAtLWRlbGV0ZSAtLWV4Y2x1ZGUgJ01hdGhKYXgnIC0tZXhjbHVkZSAncm9ib3RzLnR4dCcgIGh0bWxkb2MvIGdldHRhbG9uZ0BydWJ5Zm9yZ2Uub3JnOi92YXIvd3d3L2dmb3JnZS1wcm9qZWN0cy9rcmFtZG93bi8iCisgIGVuZAorCisKKyAgaWYgZGVmaW5lZD8gUmNvdgorICAgIFJjb3Y6OlJjb3ZUYXNrLm5ldyBkbyB8cmNvdnwKKyAgICAgIHJjb3YubGlicyA8PCAndGVzdCcKKyAgICBlbmQKKyAgZW5kCisKKyAgQ09ESU5HX0xJTkUgPSAiIyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbiIKKyAgQ09QWVJJR0hUPTw8RU9GCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKK0VPRgorCisgIGRlc2MgIkluc2VydC9VcGRhdGUgY29weXJpZ2h0IG5vdGljZSIKKyAgdGFzayA6dXBkYXRlX2NvcHlyaWdodCBkbworICAgIGluc2VydGVkID0gZmFsc2UKKyAgICBEaXJbImxpYi8qKi8qLnJiIiwgInRlc3QvKiovKi5yYiJdLmVhY2ggZG8gfGZpbGV8CisgICAgICBpZiAhRmlsZS5yZWFkKGZpbGUpLnN0YXJ0X3dpdGg/KENPRElOR19MSU5FICsgQ09QWVJJR0hUKQorICAgICAgICBpbnNlcnRlZCA9IHRydWUKKyAgICAgICAgcHV0cyAiVXBkYXRpbmcgZmlsZSAje2ZpbGV9IgorICAgICAgICBvbGQgPSBGaWxlLnJlYWQoZmlsZSkKKyAgICAgICAgaWYgIW9sZC5nc3ViISgvXEEje1JlZ2V4cC5lc2NhcGUoQ09ESU5HX0xJTkUpfSNcbiMtLS4qP1xuI1wrXCtcbiNcbi9tLCBDT0RJTkdfTElORSArIENPUFlSSUdIVCkKKyAgICAgICAgICBvbGQuZ3N1YiEoL1xBKCN7UmVnZXhwLmVzY2FwZShDT0RJTkdfTElORSl9KT8vLCBDT0RJTkdfTElORSArIENPUFlSSUdIVCArICJcbiIpCisgICAgICAgIGVuZAorICAgICAgICBGaWxlLm9wZW4oZmlsZSwgJ3crJykge3xmfCBmLnB1dHMob2xkKX0KKyAgICAgIGVuZAorICAgIGVuZAorICAgIHB1dHMgIkxvb2sgdGhyb3VnaCB0aGUgYWJvdmUgbWVudGlvbmVkIGZpbGVzIGFuZCBjb3JyZWN0IGFsbCBwcm9ibGVtcyIgaWYgaW5zZXJ0ZWQKKyAgZW5kCisKK2VuZAorCit0YXNrIDpnZW1zcGVjID0+IFsnZGV2OmdlbXNwZWMnXQorCit0YXNrIDpjbG9iYmVyID0+IFsnZGV2OmNsb2JiZXInXQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL1ZFUlNJT04gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvVkVSU0lPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTBlNzQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL1ZFUlNJT04KQEAgLTAsMCArMSBAQAorMS4xNC4wCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL2JlbmNobWFyay5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9iZW5jaG1hcmsvYmVuY2htYXJrLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDg2YWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL2JlbmNobWFyay5yYgpAQCAtMCwwICsxLDQzIEBACityZXF1aXJlICdiZW5jaG1hcmsnCityZXF1aXJlICdzdHJpbmdpbycKKworcmVxdWlyZSAna3JhbWRvd24nCityZXF1aXJlICdibHVlY2xvdGgnCityZXF1aXJlICdtYXJ1a3UnCityZXF1aXJlICdtYXJ1a3UvdmVyc2lvbicKK3JlcXVpcmUgJ3JkaXNjb3VudCcKK3JlcXVpcmUgJ2JsdWVmZWF0aGVyJworcmVxdWlyZSAncmVkY2FycGV0JworCittb2R1bGUgTWFSdUt1OjpFcnJvcnMKKyAgZGVmIHRlbGxfdXNlcihzKQorICBlbmQKK2VuZAorCisKK1JVTlM9MjAKKworRklMRVM9WydtZHN5bnRheC50ZXh0JywgJ21kYmFzaWNzLnRleHQnXQorCitwdXRzICJSdW5uaW5nIHRlc3RzIG9uICN7VGltZS5ub3cuc3RyZnRpbWUoIiVZLSVtLSVkIil9IHVuZGVyICN7UlVCWV9ERVNDUklQVElPTn0iCisKK0ZJTEVTLmVhY2ggZG8gfGZpbGV8CisgIGRhdGEgPSBGaWxlLnJlYWQoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksIGZpbGUpKQorICBwdXRzCisgIHB1dHMgIlRlc3QgdXNpbmcgZmlsZSAje2ZpbGV9IGFuZCAje1JVTlN9IHJ1bnMiCisgIHJlc3VsdHMgPSBCZW5jaG1hcmsuYm1ibSBkbyB8YnwKKyAgICBiLnJlcG9ydCgia3JhbWRvd24gI3tLcmFtZG93bjo6VkVSU0lPTn0iKSB7IFJVTlMudGltZXMgeyBLcmFtZG93bjo6RG9jdW1lbnQubmV3KGRhdGEpLnRvX2h0bWwgfSB9CisgICAgYi5yZXBvcnQoIk1hcnVrdSAje01hUnVLdTo6VmVyc2lvbn0iKSB7IFJVTlMudGltZXMgeyBNYXJ1a3UubmV3KGRhdGEsIDpvbl9lcnJvciA9PiA6aWdub3JlKS50b19odG1sIH0gfQorICAgIGIucmVwb3J0KCJCbHVlRmVhdGhlciAje0JsdWVGZWF0aGVyOjpWRVJTSU9OfSIpIHsgUlVOUy50aW1lcyB7IEJsdWVGZWF0aGVyLnBhcnNlKGRhdGEpIH0gfQorICAgIGIucmVwb3J0KCJCbHVlQ2xvdGggI3tCbHVlQ2xvdGg6OlZFUlNJT059IikgeyBSVU5TLnRpbWVzIHsgQmx1ZUNsb3RoLm5ldyhkYXRhKS50b19odG1sIH0gfQorICAgIGIucmVwb3J0KCJSRGlzY291bnQgI3tSRGlzY291bnQ6OlZFUlNJT059IikgeyBSVU5TLnRpbWVzIHsgUkRpc2NvdW50Lm5ldyhkYXRhKS50b19odG1sIH0gfQorICAgIGIucmVwb3J0KCJyZWRjYXJwZXQgI3tSZWRjYXJwZXQ6OlZFUlNJT059IikgeyBSVU5TLnRpbWVzIHsgUmVkY2FycGV0OjpNYXJrZG93bi5uZXcoUmVkY2FycGV0OjpSZW5kZXI6OkhUTUwpLnJlbmRlcihkYXRhKSB9IH0KKyAgZW5kCisKKyAgcHV0cworICBwdXRzICJSZWFsIHRpbWUgb2YgWCBkaXZpZGVkIGJ5IHJlYWwgdGltZSBvZiBrcmFtZG93biIKKyAga2QgPSByZXN1bHRzLnNoaWZ0LnJlYWwKKyAgJXdbTWFydWt1IEJsdWVGZWF0aGVyIEJsdWVDbG90aCBSRGlzY291bnQgcmVkY2FycGV0XS5lYWNoIGRvIHxuYW1lfAorICAgIHB1dHMgbmFtZS5sanVzdCgxOSkgPDwgKHJlc3VsdHMuc2hpZnQucmVhbC9rZCkucm91bmQoNCkudG9fcworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2JlbmNobWFyay9iZW5jaG1hcmsuc2ggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL2JlbmNobWFyay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmU2MDBjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2JlbmNobWFyay9iZW5jaG1hcmsuc2gKQEAgLTAsMCArMSw3NCBAQAorIyEvYmluL2Jhc2gKKworc291cmNlIH4vLnByb2ZpbGUKKworUlVCWV9WRVJTSU9OUz1gcnZtIGxpc3Qgc3RyaW5ncyB8IHNvcnRgCitLRF9WRVJTSU9OUz0iYGdpdCB0YWcgfCBzb3J0IC1WYCBtYXN0ZXIiCitPVEhFUlM9ZmFsc2UKK0FWRVJBR0U9MQorTUFTVEVSX0FTPW1hc3RlcgorCit3aGlsZSBnZXRvcHRzICJyOms6b206YToiIG9wdG5hbWU7IGRvCisgICAgY2FzZSAiJG9wdG5hbWUiIGluCisgICAgICAgICJyIikKKyAgICAgICAgICAgIFJVQllfVkVSU0lPTlM9IiRPUFRBUkciCisgICAgICAgICAgICA7OworICAgICAgICAiayIpCisgICAgICAgICAgICBLRF9WRVJTSU9OUz0iJE9QVEFSRyIKKyAgICAgICAgICAgIDs7CisgICAgICAgICJvIikKKyAgICAgICAgICAgIE9USEVSUz10cnVlCisgICAgICAgICAgICA7OworICAgICAgICAibSIpCisgICAgICAgICAgICBNQVNURVJfQVM9IiRPUFRBUkciCisgICAgICAgICAgICA7OworICAgICAgICAiYSIpCisgICAgICAgICAgICBBVkVSQUdFPSIkT1BUQVJHIgorICAgICAgICAgICAgOzsKKyAgICAgICAgIj8iKQorICAgICAgICAgICAgZWNobyAiVW5rbm93biBvcHRpb24gJE9QVEFSRyIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgOzsKKyAgICAgICAgIjoiKQorICAgICAgICAgICAgZWNobyAiTm8gYXJndW1lbnQgdmFsdWUgZm9yIG9wdGlvbiAkT1BUQVJHIgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgZWNobyAiVW5rbm93biBlcnJvciB3aGlsZSBwcm9jZXNzaW5nIG9wdGlvbnMiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorCitUTVBESVI9L3RtcC9rcmFtZG93bi1iZW5jaG1hcmsKKworcm0gLXJmICRUTVBESVIKK21rZGlyIC1wICRUTVBESVIKK2NwIGJlbmNobWFyay9tZCogJFRNUERJUgorY3AgYmVuY2htYXJrL2dlbmVyYXRlX2RhdGEucmIgJFRNUERJUgorZ2l0IGNsb25lIC5naXQgJHtUTVBESVJ9L2tyYW1kb3duCitjZCAke1RNUERJUn0va3JhbWRvd24KKworZm9yIFJVQllfVkVSU0lPTiBpbiAkUlVCWV9WRVJTSU9OUzsgZG8KKyAgcnZtIHVzZSAkUlVCWV9WRVJTSU9OCisgIGVjaG8gIkNyZWF0aW5nIGJlbmNobWFyayBkYXRhIGZvciAkKHJ1YnkgLXYpIgorCisgICAgZm9yIEtEX1ZFUlNJT04gaW4gJEtEX1ZFUlNJT05TOyBkbworICAgICAgICBlY2hvICJVc2luZyBrcmFtZG93biB2ZXJzaW9uICRLRF9WRVJTSU9OIgorICAgICAgICBnaXQgY28gJEtEX1ZFUlNJT04gMj4vZGV2L251bGwKKyAgICAgICAgaWYgWyAteiAkTUFTVEVSX0FTIC1vICRLRF9WRVJTSU9OICE9IG1hc3RlciBdOyB0aGVuCisgICAgICAgICAgICBWTlVNPSR7S0RfVkVSU0lPTn0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgVk5VTT0kTUFTVEVSX0FTCisgICAgICAgIGZpCisgICAgICAgIHJ1YnkgLUkke1RNUERJUn0va3JhbWRvd24vbGliIC4uL2dlbmVyYXRlX2RhdGEucmIgLWsgJHtWTlVNfSAtYSAke0FWRVJBR0V9ID4vZGV2L251bGwKKyAgICBkb25lCisKKyAgICBpZiBbICRPVEhFUlMgPSAidHJ1ZSIgXTsgdGhlbgorICAgICAgICBydWJ5IC1ydWJ5Z2VtcyAtSSR7VE1QRElSfS9rcmFtZG93bi9saWIgLi4vZ2VuZXJhdGVfZGF0YS5yYiAtbyA+L2Rldi9udWxsCisgICAgZmkKK2RvbmUKKworY2QgJHtUTVBESVJ9Citydm0gZGVmYXVsdAorcnVieSBnZW5lcmF0ZV9kYXRhLnJiIC1nCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL2dlbmVyYXRlX2RhdGEucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL2dlbmVyYXRlX2RhdGEucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyZWJjMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9iZW5jaG1hcmsvZ2VuZXJhdGVfZGF0YS5yYgpAQCAtMCwwICsxLDExOSBAQAorcmVxdWlyZSAnYmVuY2htYXJrJworcmVxdWlyZSAnb3B0cGFyc2UnCityZXF1aXJlICdmaWxldXRpbHMnCisKK3JlcXVpcmUgJ2tyYW1kb3duJworCitvcHRpb25zID0gezpvdGhlcnMgPT4gZmFsc2UsIDphdmVyYWdlID0+IDF9CitPcHRpb25QYXJzZXIubmV3IGRvIHxvcHRzfAorICBvcHRzLm9uKCItYSBBVkciLCAiLS1hdmVyYWdlIEFWRyIsIEludGVnZXIsICJBdmVyYWdlIHRpbWVzIG92ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcnVucyIpIHt8dnwgb3B0aW9uc1s6YXZlcmFnZV0gPSB2IH0KKyAgb3B0cy5vbigiLW8iLCAiLS1bbm8tXW90aGVycyIsICJHZW5lcmF0ZSBkYXRhIGZvciBvdGhlciBwYXJzZXJzIikge3x2fCBvcHRpb25zWzpvdGhlcnNdID0gdn0KKyAgb3B0cy5vbigiLWciLCAiLS1bbm8tXWdyYXBoIiwgIkdlbmVyYXRlIGdyYXBoIikge3x2fCBvcHRpb25zWzpncmFwaF0gPSB2fQorICBvcHRzLm9uKCItayBWRVJTSU9OIiwgIi0ta3JhbWRvd24gVkVSU0lPTiIsIFN0cmluZywgIkFkZCBiZW5jaG1hcmsgZGF0YSBmb3Iga3JhbWRvd24gdmVyc2lvbiBWRVJTSU9OIikge3x2fCBvcHRpb25zWzprcmFtZG93bl0gPSB2fQorZW5kLnBhcnNlIQorCitUSElTUlVCWSA9IChzZWxmLmNsYXNzLmNvbnN0X2RlZmluZWQ/KDpSVUJZX0RFU0NSSVBUSU9OKSA/IFJVQllfREVTQ1JJUFRJT04uc2NhbigvXi4qPyg/PVxzKlwoKS8pLmZpcnN0LnN1YigvXHMvLCAnLScpIDogInJ1YnktI3tSVUJZX1ZFUlNJT059IikgKyAnLScgKyBSVUJZX1BBVENITEVWRUwudG9fcworCitEaXIuY2hkaXIoRmlsZS5kaXJuYW1lKF9fRklMRV9fKSkKK0JNREFUQSA9IEZpbGUucmVhZCgnbWRiYXNpY3MudGV4dCcpCitNVUxUSVBMSUVSID0gKDAuLjUpLm1hcCB7fGl8IDIqKml9CisKK2lmIG9wdGlvbnNbOm90aGVyc10KKyAgcmVxdWlyZSAnbWFydWt1JworICByZXF1aXJlICdtYXJ1a3UvdmVyc2lvbicKKyAgYmVnaW4KKyAgICByZXF1aXJlICdyZGlzY291bnQnCisgIHJlc2N1ZSBMb2FkRXJyb3IKKyAgZW5kCisgICNyZXF1aXJlICdibHVlZmVhdGhlcicKKworICBtb2R1bGUgTWFSdUt1OjpFcnJvcnMKKyAgICBkZWYgdGVsbF91c2VyKHMpCisgICAgZW5kCisgIGVuZAorCisgIGJtZGF0YSA9IHt9CisgIGxhYmVscyA9IFtdCisgIE1VTFRJUExJRVIuZWFjaCBkbyB8aXwKKyAgICAkc3RkZXJyLnB1dHMgIkdlbmVyYXRpbmcgYmVuY2htYXJrIGRhdGEgZm9yIG90aGVyIHBhcnNlcnMsIG11bHRpcGxpZXIgI3tpfSIKKyAgICBtZGRhdGEgPSBCTURBVEEqaQorICAgIGxhYmVscyA9IFtdCisgICAgYm1kYXRhW2ldID0gQmVuY2htYXJrOjpibWJtIGRvIHx4fAorICAgICAgbGFiZWxzIDw8ICJNYXJ1a3UgI3tNYVJ1S3U6OlZlcnNpb259IgorICAgICAgeC5yZXBvcnQgeyBNYXJ1a3UubmV3KG1kZGF0YSwgOm9uX2Vycm9yID0+IDppZ25vcmUpLnRvX2h0bWwgfQorICAgICAgaWYgc2VsZi5jbGFzcy5jb25zdF9kZWZpbmVkPyg6Qmx1ZUZlYXRoZXIpCisgICAgICAgIGxhYmVscyA8PCAiQmx1ZUZlYXRoZXIgI3tCbHVlRmVhdGhlcjo6VkVSU0lPTn0iCisgICAgICAgIHgucmVwb3J0IHsgQmx1ZUZlYXRoZXIucGFyc2UobWRkYXRhKSB9CisgICAgICBlbmQKKyAgICAgIGlmIHNlbGYuY2xhc3MuY29uc3RfZGVmaW5lZD8oOlJEaXNjb3VudCkKKyAgICAgICAgbGFiZWxzIDw8ICJSRGlzY291bnQgI3tSRGlzY291bnQ6OlZFUlNJT059IgorICAgICAgICB4LnJlcG9ydCB7IFJEaXNjb3VudC5uZXcobWRkYXRhKS50b19odG1sIH0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgRmlsZS5vcGVuKCJzdGF0aWMtI3tUSElTUlVCWX0uZGF0IiwgJ3crJykgZG8gfGZ8CisgICAgZi5wdXRzICIjICIgKyBsYWJlbHMuam9pbigiIHx8ICIpCisgICAgZm9ybWF0X3N0ciA9ICIlNWQiICsgIiAlMTAuNWYiKmJtZGF0YVtNVUxUSVBMSUVSLmZpcnN0XS5zaXplCisgICAgYm1kYXRhLnNvcnQuZWFjaCBkbyB8bSx2fAorICAgICAgZi5wdXRzIGZvcm1hdF9zdHIgJSBbbSwgKnYubWFwIHt8dG1zfCB0bXMucmVhbH1dCisgICAgZW5kCisgIGVuZAorZW5kCisKK2lmIG9wdGlvbnNbOmtyYW1kb3duXQorICBrcmFtZG93biA9ICJrcmFtZG93bi0je1RISVNSVUJZfS5kYXQiCisgIGRhdGEgPSBpZiBGaWxlLmV4aXN0PyhrcmFtZG93bikKKyAgICAgICAgICAgbGluZXMgPSBGaWxlLnJlYWRsaW5lcyhrcmFtZG93bikubWFwIHt8bHwgbC5jaG9tcH0KKyAgICAgICAgICAgbGluZXMuZmlyc3QgPDwgIiB8fCAiCisgICAgICAgICAgIGxpbmVzCisgICAgICAgICBlbHNlCisgICAgICAgICAgIFsiIyAgICAgICIsICpNVUxUSVBMSUVSLm1hcCB7fG18ICIlM2QiICUgbX1dCisgICAgICAgICBlbmQKKyAgZGF0YS5maXJzdCA8PCAiI3tvcHRpb25zWzprcmFtZG93bl19Ii5yanVzdCgxMCkKKworICB0aW1lcyA9IFtdCisgIG9wdGlvbnNbOmF2ZXJhZ2VdLnRpbWVzIGRvCisgICAgTVVMVElQTElFUi5lYWNoX3dpdGhfaW5kZXggZG8gfG0sIGl8CisgICAgICAkc3RkZXJyLnB1dHMgIkdlbmVyYXRpbmcgYmVuY2htYXJrIGRhdGEgZm9yIGtyYW1kb3duIHZlcnNpb24gI3tvcHRpb25zWzprcmFtZG93bl19LCBtdWx0aXBsaWVyICN7bX0iCisgICAgICBtZGRhdGEgPSBCTURBVEEqbQorICAgICAgYmVnaW4KKyAgICAgICAgKHRpbWVzW2ldIHx8PSBbXSkgPDwgQmVuY2htYXJrOjpibWJtIHt8eHwgeC5yZXBvcnQgeyBLcmFtZG93bjo6RG9jdW1lbnQubmV3KG1kZGF0YSkudG9faHRtbCB9IH0uZmlyc3QucmVhbAorICAgICAgcmVzY3VlCisgICAgICAgICRzdGRlcnIucHV0cyAkIS5tZXNzYWdlCisgICAgICAgICh0aW1lc1tpXSB8fD0gW10pIDw8IDAKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgdGltZXMuZWFjaF93aXRoX2luZGV4IHt8dCxpfCBkYXRhW2krMV0gPDwgIiUxNC41ZiIgJSAodC5pbmplY3QoMCkge3xzdW0sdnwgc3VtK3Z9LzMuMCl9CisgIEZpbGUub3BlbihrcmFtZG93biwgJ3crJykgZG8gfGZ8CisgICAgZGF0YS5lYWNoIHt8bHwgZi5wdXRzIGx9CisgIGVuZAorZW5kCisKK2lmIG9wdGlvbnNbOmdyYXBoXQorICBEaXJbJ2tyYW1kb3duLSouZGF0J10uZWFjaCBkbyB8a3JhbWRvd25fbmFtZXwKKyAgICB0aGVydWJ5ID0ga3JhbWRvd25fbmFtZS5zdWIoL15rcmFtZG93bi0vLCAnJykuc3ViKC9cLmRhdCQvLCAnJykKKyAgICBncmFwaF9uYW1lID0gImdyYXBoLSN7dGhlcnVieX0ucG5nIgorICAgIHN0YXRpY19uYW1lID0gInN0YXRpYy0je3RoZXJ1Ynl9LmRhdCIKKyAgICBrcmFtZG93bl9uYW1lcyA9IEZpbGUucmVhZGxpbmVzKGtyYW1kb3duX25hbWUpLmZpcnN0LmNob21wWzEuLi0xXS5zcGxpdCgvXHMqXHxcfFxzKi8pCisgICAgc3RhdGljX25hbWVzID0gKEZpbGUuZXhpc3Q/KHN0YXRpY19uYW1lKSA/IEZpbGUucmVhZGxpbmVzKHN0YXRpY19uYW1lKS5maXJzdC5jaG9tcFsxLi4tMV0uc3BsaXQoL1xzKlx8XHxccyovKSA6IFtdKQorICAgIEZpbGUub3BlbigiZ251cGxvdC5kYXQiLCAidysiKSBkbyB8ZnwKKyAgICAgIGYucHV0cyA8PEVPRgorc2V0IHRpdGxlICJFeGVjdXRpb24gVGltZSBQZXJmb3JtYW5jZSBmb3IgI3t0aGVydWJ5fSIKK3NldCB4bGFiZWwgIkZpbGUgTXVsdGlwbGllciAoaS5lLiBuIHRpbWVzIG1kYmFzaWMudGV4dCkiCitzZXQgeWxhYmVsICJFeGVjdXRpb24gVGltZSBpbiBzZWNvbmRlcyIKK3NldCBrZXkgbGVmdCB0b3AKK3NldCBncmlkCitzZXQgdGVybWluYWwgcG5nCitzZXQgb3V0cHV0ICIje2dyYXBoX25hbWV9IgorRU9GCisgICAgICBmLnByaW50ICJwbG90ICIKKyAgICAgIGksIGogPSAxLCAxCisgICAgICBmLnB1dHMoKGtyYW1kb3duX25hbWVzLm1hcCB7fG58IGkgKz0gMTsgIlwiI3trcmFtZG93bl9uYW1lfVwiIHVzaW5nIDE6I3tpfSB3aXRoIGxwIHRpdGxlIFwiI3tufVwiIn0gKworICAgICAgICAgICAgICBzdGF0aWNfbmFtZXMubWFwIHt8bnwgaiArPSAxOyBuID1+IC9ibHVlZmVhdGhlci9pID8gbmlsIDogIlwiI3tzdGF0aWNfbmFtZX1cIiB1c2luZyAxOiN7an0gd2l0aCBscCB0aXRsZSBcIiN7bn1cIiJ9LmNvbXBhY3QKKyAgICAgICAgICAgICApLmpvaW4oIiwgIikpCisgICAgZW5kCisgICAgYGdudXBsb3QgZ251cGxvdC5kYXRgCisgICAgRmlsZVV0aWxzLnJtKCJnbnVwbG90LmRhdCIpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL21kYmFzaWNzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL21kYmFzaWNzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2MDU1YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9iZW5jaG1hcmsvbWRiYXNpY3MudGV4dApAQCAtMCwwICsxLDMwNiBAQAorTWFya2Rvd246IEJhc2ljcworPT09PT09PT09PT09PT09PQorCis8dWwgaWQ9IlByb2plY3RTdWJtZW51Ij4KKyAgICA8bGk+PGEgaHJlZj0iL3Byb2plY3RzL21hcmtkb3duLyIgdGl0bGU9Ik1hcmtkb3duIFByb2plY3QgUGFnZSI+TWFpbjwvYT48L2xpPgorICAgIDxsaT48YSBjbGFzcz0ic2VsZWN0ZWQiIHRpdGxlPSJNYXJrZG93biBCYXNpY3MiPkJhc2ljczwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSIvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4IiB0aXRsZT0iTWFya2Rvd24gU3ludGF4IERvY3VtZW50YXRpb24iPlN5bnRheDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSIvcHJvamVjdHMvbWFya2Rvd24vbGljZW5zZSIgdGl0bGU9IlByaWNpbmcgYW5kIExpY2Vuc2UgSW5mb3JtYXRpb24iPkxpY2Vuc2U8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iL3Byb2plY3RzL21hcmtkb3duL2Rpbmd1cyIgdGl0bGU9Ik9ubGluZSBNYXJrZG93biBXZWIgRm9ybSI+RGluZ3VzPC9hPjwvbGk+Cis8L3VsPgorCisKK0dldHRpbmcgdGhlIEdpc3Qgb2YgTWFya2Rvd24ncyBGb3JtYXR0aW5nIFN5bnRheAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcGFnZSBvZmZlcnMgYSBicmllZiBvdmVydmlldyBvZiB3aGF0IGl0J3MgbGlrZSB0byB1c2UgTWFya2Rvd24uCitUaGUgW3N5bnRheCBwYWdlXSBbc10gcHJvdmlkZXMgY29tcGxldGUsIGRldGFpbGVkIGRvY3VtZW50YXRpb24gZm9yCitldmVyeSBmZWF0dXJlLCBidXQgTWFya2Rvd24gc2hvdWxkIGJlIHZlcnkgZWFzeSB0byBwaWNrIHVwIHNpbXBseSBieQorbG9va2luZyBhdCBhIGZldyBleGFtcGxlcyBvZiBpdCBpbiBhY3Rpb24uIFRoZSBleGFtcGxlcyBvbiB0aGlzIHBhZ2UKK2FyZSB3cml0dGVuIGluIGEgYmVmb3JlL2FmdGVyIHN0eWxlLCBzaG93aW5nIGV4YW1wbGUgc3ludGF4IGFuZCB0aGUKK0hUTUwgb3V0cHV0IHByb2R1Y2VkIGJ5IE1hcmtkb3duLgorCitJdCdzIGFsc28gaGVscGZ1bCB0byBzaW1wbHkgdHJ5IE1hcmtkb3duIG91dDsgdGhlIFtEaW5ndXNdIFtkXSBpcyBhCit3ZWIgYXBwbGljYXRpb24gdGhhdCBhbGxvd3MgeW91IHR5cGUgeW91ciBvd24gTWFya2Rvd24tZm9ybWF0dGVkIHRleHQKK2FuZCB0cmFuc2xhdGUgaXQgdG8gWEhUTUwuCisKKyoqTm90ZToqKiBUaGlzIGRvY3VtZW50IGlzIGl0c2VsZiB3cml0dGVuIHVzaW5nIE1hcmtkb3duOyB5b3UKK2NhbiBbc2VlIHRoZSBzb3VyY2UgZm9yIGl0IGJ5IGFkZGluZyAnLnRleHQnIHRvIHRoZSBVUkxdIFtzcmNdLgorCisgIFtzXTogL3Byb2plY3RzL21hcmtkb3duL3N5bnRheCAgIk1hcmtkb3duIFN5bnRheCIKKyAgW2RdOiAvcHJvamVjdHMvbWFya2Rvd24vZGluZ3VzICAiTWFya2Rvd24gRGluZ3VzIgorICBbc3JjXTogL3Byb2plY3RzL21hcmtkb3duL2Jhc2ljcy50ZXh0CisKKworIyMgUGFyYWdyYXBocywgSGVhZGVycywgQmxvY2txdW90ZXMgIyMKKworQSBwYXJhZ3JhcGggaXMgc2ltcGx5IG9uZSBvciBtb3JlIGNvbnNlY3V0aXZlIGxpbmVzIG9mIHRleHQsIHNlcGFyYXRlZAorYnkgb25lIG9yIG1vcmUgYmxhbmsgbGluZXMuIChBIGJsYW5rIGxpbmUgaXMgYW55IGxpbmUgdGhhdCBsb29rcyBsaWtlIGEKK2JsYW5rIGxpbmUgLS0gYSBsaW5lIGNvbnRhaW5pbmcgbm90aGluZyBzcGFjZXMgb3IgdGFicyBpcyBjb25zaWRlcmVkCitibGFuay4pIE5vcm1hbCBwYXJhZ3JhcGhzIHNob3VsZCBub3QgYmUgaW50ZW5kZWQgd2l0aCBzcGFjZXMgb3IgdGFicy4KKworTWFya2Rvd24gb2ZmZXJzIHR3byBzdHlsZXMgb2YgaGVhZGVyczogKlNldGV4dCogYW5kICphdHgqLgorU2V0ZXh0LXN0eWxlIGhlYWRlcnMgZm9yIGA8aDE+YCBhbmQgYDxoMj5gIGFyZSBjcmVhdGVkIGJ5CisidW5kZXJsaW5pbmciIHdpdGggZXF1YWwgc2lnbnMgKGA9YCkgYW5kIGh5cGhlbnMgKGAtYCksIHJlc3BlY3RpdmVseS4KK1RvIGNyZWF0ZSBhbiBhdHgtc3R5bGUgaGVhZGVyLCB5b3UgcHV0IDEtNiBoYXNoIG1hcmtzIChgI2ApIGF0IHRoZQorYmVnaW5uaW5nIG9mIHRoZSBsaW5lIC0tIHRoZSBudW1iZXIgb2YgaGFzaGVzIGVxdWFscyB0aGUgcmVzdWx0aW5nCitIVE1MIGhlYWRlciBsZXZlbC4KKworQmxvY2txdW90ZXMgYXJlIGluZGljYXRlZCB1c2luZyBlbWFpbC1zdHlsZSAnYD5gJyBhbmdsZSBicmFja2V0cy4KKworTWFya2Rvd246CisKKyAgICBBIEZpcnN0IExldmVsIEhlYWRlcgorICAgID09PT09PT09PT09PT09PT09PT09CisgICAgCisgICAgQSBTZWNvbmQgTGV2ZWwgSGVhZGVyCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvCisgICAgdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiBUaGlzIGlzIGp1c3QgYQorICAgIHJlZ3VsYXIgcGFyYWdyYXBoLgorCisgICAgVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eQorICAgIGRvZydzIGJhY2suCisgICAgCisgICAgIyMjIEhlYWRlciAzCisKKyAgICA+IFRoaXMgaXMgYSBibG9ja3F1b3RlLgorICAgID4gCisgICAgPiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFyYWdyYXBoIGluIHRoZSBibG9ja3F1b3RlLgorICAgID4KKyAgICA+ICMjIFRoaXMgaXMgYW4gSDIgaW4gYSBibG9ja3F1b3RlCisKKworT3V0cHV0OgorCisgICAgPGgxPkEgRmlyc3QgTGV2ZWwgSGVhZGVyPC9oMT4KKyAgICAKKyAgICA8aDI+QSBTZWNvbmQgTGV2ZWwgSGVhZGVyPC9oMj4KKyAgICAKKyAgICA8cD5Ob3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvCisgICAgdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiBUaGlzIGlzIGp1c3QgYQorICAgIHJlZ3VsYXIgcGFyYWdyYXBoLjwvcD4KKyAgICAKKyAgICA8cD5UaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5CisgICAgZG9nJ3MgYmFjay48L3A+CisgICAgCisgICAgPGgzPkhlYWRlciAzPC9oMz4KKyAgICAKKyAgICA8YmxvY2txdW90ZT4KKyAgICAgICAgPHA+VGhpcyBpcyBhIGJsb2NrcXVvdGUuPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+VGhpcyBpcyB0aGUgc2Vjb25kIHBhcmFncmFwaCBpbiB0aGUgYmxvY2txdW90ZS48L3A+CisgICAgICAgIAorICAgICAgICA8aDI+VGhpcyBpcyBhbiBIMiBpbiBhIGJsb2NrcXVvdGU8L2gyPgorICAgIDwvYmxvY2txdW90ZT4KKworCisKKyMjIyBQaHJhc2UgRW1waGFzaXMgIyMjCisKK01hcmtkb3duIHVzZXMgYXN0ZXJpc2tzIGFuZCB1bmRlcnNjb3JlcyB0byBpbmRpY2F0ZSBzcGFucyBvZiBlbXBoYXNpcy4KKworTWFya2Rvd246CisKKyAgICBTb21lIG9mIHRoZXNlIHdvcmRzICphcmUgZW1waGFzaXplZCouCisgICAgU29tZSBvZiB0aGVzZSB3b3JkcyBfYXJlIGVtcGhhc2l6ZWQgYWxzb18uCisgICAgCisgICAgVXNlIHR3byBhc3Rlcmlza3MgZm9yICoqc3Ryb25nIGVtcGhhc2lzKiouCisgICAgT3IsIGlmIHlvdSBwcmVmZXIsIF9fdXNlIHR3byB1bmRlcnNjb3JlcyBpbnN0ZWFkX18uCisKK091dHB1dDoKKworICAgIDxwPlNvbWUgb2YgdGhlc2Ugd29yZHMgPGVtPmFyZSBlbXBoYXNpemVkPC9lbT4uCisgICAgU29tZSBvZiB0aGVzZSB3b3JkcyA8ZW0+YXJlIGVtcGhhc2l6ZWQgYWxzbzwvZW0+LjwvcD4KKyAgICAKKyAgICA8cD5Vc2UgdHdvIGFzdGVyaXNrcyBmb3IgPHN0cm9uZz5zdHJvbmcgZW1waGFzaXM8L3N0cm9uZz4uCisgICAgT3IsIGlmIHlvdSBwcmVmZXIsIDxzdHJvbmc+dXNlIHR3byB1bmRlcnNjb3JlcyBpbnN0ZWFkPC9zdHJvbmc+LjwvcD4KKyAgIAorCisKKyMjIExpc3RzICMjCisKK1Vub3JkZXJlZCAoYnVsbGV0ZWQpIGxpc3RzIHVzZSBhc3Rlcmlza3MsIHBsdXNlcywgYW5kIGh5cGhlbnMgKGAqYCwKK2ArYCwgYW5kIGAtYCkgYXMgbGlzdCBtYXJrZXJzLiBUaGVzZSB0aHJlZSBtYXJrZXJzIGFyZQoraW50ZXJjaGFuZ2FibGU7IHRoaXM6CisKKyAgICAqICAgQ2FuZHkuCisgICAgKiAgIEd1bS4KKyAgICAqICAgQm9vemUuCisKK3RoaXM6CisKKyAgICArICAgQ2FuZHkuCisgICAgKyAgIEd1bS4KKyAgICArICAgQm9vemUuCisKK2FuZCB0aGlzOgorCisgICAgLSAgIENhbmR5LgorICAgIC0gICBHdW0uCisgICAgLSAgIEJvb3plLgorCithbGwgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQ6CisKKyAgICA8dWw+CisgICAgPGxpPkNhbmR5LjwvbGk+CisgICAgPGxpPkd1bS48L2xpPgorICAgIDxsaT5Cb296ZS48L2xpPgorICAgIDwvdWw+CisKK09yZGVyZWQgKG51bWJlcmVkKSBsaXN0cyB1c2UgcmVndWxhciBudW1iZXJzLCBmb2xsb3dlZCBieSBwZXJpb2RzLCBhcworbGlzdCBtYXJrZXJzOgorCisgICAgMS4gIFJlZAorICAgIDIuICBHcmVlbgorICAgIDMuICBCbHVlCisKK091dHB1dDoKKworICAgIDxvbD4KKyAgICA8bGk+UmVkPC9saT4KKyAgICA8bGk+R3JlZW48L2xpPgorICAgIDxsaT5CbHVlPC9saT4KKyAgICA8L29sPgorCitJZiB5b3UgcHV0IGJsYW5rIGxpbmVzIGJldHdlZW4gaXRlbXMsIHlvdSdsbCBnZXQgYDxwPmAgdGFncyBmb3IgdGhlCitsaXN0IGl0ZW0gdGV4dC4gWW91IGNhbiBjcmVhdGUgbXVsdGktcGFyYWdyYXBoIGxpc3QgaXRlbXMgYnkgaW5kZW50aW5nCit0aGUgcGFyYWdyYXBocyBieSA0IHNwYWNlcyBvciAxIHRhYjoKKworICAgICogICBBIGxpc3QgaXRlbS4KKyAgICAKKyAgICAgICAgV2l0aCBtdWx0aXBsZSBwYXJhZ3JhcGhzLgorCisgICAgKiAgIEFub3RoZXIgaXRlbSBpbiB0aGUgbGlzdC4KKworT3V0cHV0OgorCisgICAgPHVsPgorICAgIDxsaT48cD5BIGxpc3QgaXRlbS48L3A+CisgICAgPHA+V2l0aCBtdWx0aXBsZSBwYXJhZ3JhcGhzLjwvcD48L2xpPgorICAgIDxsaT48cD5Bbm90aGVyIGl0ZW0gaW4gdGhlIGxpc3QuPC9wPjwvbGk+CisgICAgPC91bD4KKyAgICAKKworCisjIyMgTGlua3MgIyMjCisKK01hcmtkb3duIHN1cHBvcnRzIHR3byBzdHlsZXMgZm9yIGNyZWF0aW5nIGxpbmtzOiAqaW5saW5lKiBhbmQKKypyZWZlcmVuY2UqLiBXaXRoIGJvdGggc3R5bGVzLCB5b3UgdXNlIHNxdWFyZSBicmFja2V0cyB0byBkZWxpbWl0IHRoZQordGV4dCB5b3Ugd2FudCB0byB0dXJuIGludG8gYSBsaW5rLgorCitJbmxpbmUtc3R5bGUgbGlua3MgdXNlIHBhcmVudGhlc2VzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsaW5rIHRleHQuCitGb3IgZXhhbXBsZToKKworICAgIFRoaXMgaXMgYW4gW2V4YW1wbGUgbGlua10oaHR0cDovL2V4YW1wbGUuY29tLykuCisKK091dHB1dDoKKworICAgIDxwPlRoaXMgaXMgYW4gPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUuY29tLyI+CisgICAgZXhhbXBsZSBsaW5rPC9hPi48L3A+CisKK09wdGlvbmFsbHksIHlvdSBtYXkgaW5jbHVkZSBhIHRpdGxlIGF0dHJpYnV0ZSBpbiB0aGUgcGFyZW50aGVzZXM6CisKKyAgICBUaGlzIGlzIGFuIFtleGFtcGxlIGxpbmtdKGh0dHA6Ly9leGFtcGxlLmNvbS8gIldpdGggYSBUaXRsZSIpLgorCitPdXRwdXQ6CisKKyAgICA8cD5UaGlzIGlzIGFuIDxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbS8iIHRpdGxlPSJXaXRoIGEgVGl0bGUiPgorICAgIGV4YW1wbGUgbGluazwvYT4uPC9wPgorCitSZWZlcmVuY2Utc3R5bGUgbGlua3MgYWxsb3cgeW91IHRvIHJlZmVyIHRvIHlvdXIgbGlua3MgYnkgbmFtZXMsIHdoaWNoCit5b3UgZGVmaW5lIGVsc2V3aGVyZSBpbiB5b3VyIGRvY3VtZW50OgorCisgICAgSSBnZXQgMTAgdGltZXMgbW9yZSB0cmFmZmljIGZyb20gW0dvb2dsZV1bMV0gdGhhbiBmcm9tCisgICAgW1lhaG9vXVsyXSBvciBbTVNOXVszXS4KKworICAgIFsxXTogaHR0cDovL2dvb2dsZS5jb20vICAgICAgICAiR29vZ2xlIgorICAgIFsyXTogaHR0cDovL3NlYXJjaC55YWhvby5jb20vICAiWWFob28gU2VhcmNoIgorICAgIFszXTogaHR0cDovL3NlYXJjaC5tc24uY29tLyAgICAiTVNOIFNlYXJjaCIKKworT3V0cHV0OgorCisgICAgPHA+SSBnZXQgMTAgdGltZXMgbW9yZSB0cmFmZmljIGZyb20gPGEgaHJlZj0iaHR0cDovL2dvb2dsZS5jb20vIgorICAgIHRpdGxlPSJHb29nbGUiPkdvb2dsZTwvYT4gdGhhbiBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9zZWFyY2gueWFob28uY29tLyIKKyAgICB0aXRsZT0iWWFob28gU2VhcmNoIj5ZYWhvbzwvYT4gb3IgPGEgaHJlZj0iaHR0cDovL3NlYXJjaC5tc24uY29tLyIKKyAgICB0aXRsZT0iTVNOIFNlYXJjaCI+TVNOPC9hPi48L3A+CisKK1RoZSB0aXRsZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuIExpbmsgbmFtZXMgbWF5IGNvbnRhaW4gbGV0dGVycywKK251bWJlcnMgYW5kIHNwYWNlcywgYnV0IGFyZSAqbm90KiBjYXNlIHNlbnNpdGl2ZToKKworICAgIEkgc3RhcnQgbXkgbW9ybmluZyB3aXRoIGEgY3VwIG9mIGNvZmZlZSBhbmQKKyAgICBbVGhlIE5ldyBZb3JrIFRpbWVzXVtOWSBUaW1lc10uCisKKyAgICBbbnkgdGltZXNdOiBodHRwOi8vd3d3Lm55dGltZXMuY29tLworCitPdXRwdXQ6CisKKyAgICA8cD5JIHN0YXJ0IG15IG1vcm5pbmcgd2l0aCBhIGN1cCBvZiBjb2ZmZWUgYW5kCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5ueXRpbWVzLmNvbS8iPlRoZSBOZXcgWW9yayBUaW1lczwvYT4uPC9wPgorCisKKyMjIyBJbWFnZXMgIyMjCisKK0ltYWdlIHN5bnRheCBpcyB2ZXJ5IG11Y2ggbGlrZSBsaW5rIHN5bnRheC4KKworSW5saW5lICh0aXRsZXMgYXJlIG9wdGlvbmFsKToKKworICAgICFbYWx0IHRleHRdKC9wYXRoL3RvL2ltZy5qcGcgIlRpdGxlIikKKworUmVmZXJlbmNlLXN0eWxlOgorCisgICAgIVthbHQgdGV4dF1baWRdCisKKyAgICBbaWRdOiAvcGF0aC90by9pbWcuanBnICJUaXRsZSIKKworQm90aCBvZiB0aGUgYWJvdmUgZXhhbXBsZXMgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQ6CisKKyAgICA8aW1nIHNyYz0iL3BhdGgvdG8vaW1nLmpwZyIgYWx0PSJhbHQgdGV4dCIgdGl0bGU9IlRpdGxlIiAvPgorCisKKworIyMjIENvZGUgIyMjCisKK0luIGEgcmVndWxhciBwYXJhZ3JhcGgsIHlvdSBjYW4gY3JlYXRlIGNvZGUgc3BhbiBieSB3cmFwcGluZyB0ZXh0IGluCitiYWNrdGljayBxdW90ZXMuIEFueSBhbXBlcnNhbmRzIChgJmApIGFuZCBhbmdsZSBicmFja2V0cyAoYDxgIG9yCitgPmApIHdpbGwgYXV0b21hdGljYWxseSBiZSB0cmFuc2xhdGVkIGludG8gSFRNTCBlbnRpdGllcy4gVGhpcyBtYWtlcworaXQgZWFzeSB0byB1c2UgTWFya2Rvd24gdG8gd3JpdGUgYWJvdXQgSFRNTCBleGFtcGxlIGNvZGU6CisKKyAgICBJIHN0cm9uZ2x5IHJlY29tbWVuZCBhZ2FpbnN0IHVzaW5nIGFueSBgPGJsaW5rPmAgdGFncy4KKworICAgIEkgd2lzaCBTbWFydHlQYW50cyB1c2VkIG5hbWVkIGVudGl0aWVzIGxpa2UgYCZtZGFzaDtgCisgICAgaW5zdGVhZCBvZiBkZWNpbWFsLWVuY29kZWQgZW50aXRlcyBsaWtlIGAmIzgyMTI7YC4KKworT3V0cHV0OgorCisgICAgPHA+SSBzdHJvbmdseSByZWNvbW1lbmQgYWdhaW5zdCB1c2luZyBhbnkKKyAgICA8Y29kZT4mbHQ7YmxpbmsmZ3Q7PC9jb2RlPiB0YWdzLjwvcD4KKyAgICAKKyAgICA8cD5JIHdpc2ggU21hcnR5UGFudHMgdXNlZCBuYW1lZCBlbnRpdGllcyBsaWtlCisgICAgPGNvZGU+JmFtcDttZGFzaDs8L2NvZGU+IGluc3RlYWQgb2YgZGVjaW1hbC1lbmNvZGVkCisgICAgZW50aXRlcyBsaWtlIDxjb2RlPiZhbXA7IzgyMTI7PC9jb2RlPi48L3A+CisKKworVG8gc3BlY2lmeSBhbiBlbnRpcmUgYmxvY2sgb2YgcHJlLWZvcm1hdHRlZCBjb2RlLCBpbmRlbnQgZXZlcnkgbGluZSBvZgordGhlIGJsb2NrIGJ5IDQgc3BhY2VzIG9yIDEgdGFiLiBKdXN0IGxpa2Ugd2l0aCBjb2RlIHNwYW5zLCBgJmAsIGA8YCwKK2FuZCBgPmAgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQgYXV0b21hdGljYWxseS4KKworTWFya2Rvd246CisKKyAgICBJZiB5b3Ugd2FudCB5b3VyIHBhZ2UgdG8gdmFsaWRhdGUgdW5kZXIgWEhUTUwgMS4wIFN0cmljdCwKKyAgICB5b3UndmUgZ290IHRvIHB1dCBwYXJhZ3JhcGggdGFncyBpbiB5b3VyIGJsb2NrcXVvdGVzOgorCisgICAgICAgIDxibG9ja3F1b3RlPgorICAgICAgICAgICAgPHA+Rm9yIGV4YW1wbGUuPC9wPgorICAgICAgICA8L2Jsb2NrcXVvdGU+CisKK091dHB1dDoKKworICAgIDxwPklmIHlvdSB3YW50IHlvdXIgcGFnZSB0byB2YWxpZGF0ZSB1bmRlciBYSFRNTCAxLjAgU3RyaWN0LAorICAgIHlvdSd2ZSBnb3QgdG8gcHV0IHBhcmFncmFwaCB0YWdzIGluIHlvdXIgYmxvY2txdW90ZXM6PC9wPgorICAgIAorICAgIDxwcmU+PGNvZGU+Jmx0O2Jsb2NrcXVvdGUmZ3Q7CisgICAgICAgICZsdDtwJmd0O0ZvciBleGFtcGxlLiZsdDsvcCZndDsKKyAgICAmbHQ7L2Jsb2NrcXVvdGUmZ3Q7CisgICAgPC9jb2RlPjwvcHJlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2JlbmNobWFyay9tZHN5bnRheC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2JlbmNobWFyay9tZHN5bnRheC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzYwYTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL21kc3ludGF4LnRleHQKQEAgLTAsMCArMSw4ODggQEAKK01hcmtkb3duOiBTeW50YXgKKz09PT09PT09PT09PT09PT0KKworPHVsIGlkPSJQcm9qZWN0U3VibWVudSI+CisgICAgPGxpPjxhIGhyZWY9Ii9wcm9qZWN0cy9tYXJrZG93bi8iIHRpdGxlPSJNYXJrZG93biBQcm9qZWN0IFBhZ2UiPk1haW48L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iL3Byb2plY3RzL21hcmtkb3duL2Jhc2ljcyIgdGl0bGU9Ik1hcmtkb3duIEJhc2ljcyI+QmFzaWNzPC9hPjwvbGk+CisgICAgPGxpPjxhIGNsYXNzPSJzZWxlY3RlZCIgdGl0bGU9Ik1hcmtkb3duIFN5bnRheCBEb2N1bWVudGF0aW9uIj5TeW50YXg8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iL3Byb2plY3RzL21hcmtkb3duL2xpY2Vuc2UiIHRpdGxlPSJQcmljaW5nIGFuZCBMaWNlbnNlIEluZm9ybWF0aW9uIj5MaWNlbnNlPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Ii9wcm9qZWN0cy9tYXJrZG93bi9kaW5ndXMiIHRpdGxlPSJPbmxpbmUgTWFya2Rvd24gV2ViIEZvcm0iPkRpbmd1czwvYT48L2xpPgorPC91bD4KKworCisqICAgW092ZXJ2aWV3XSgjb3ZlcnZpZXcpCisgICAgKiAgIFtQaGlsb3NvcGh5XSgjcGhpbG9zb3BoeSkKKyAgICAqICAgW0lubGluZSBIVE1MXSgjaHRtbCkKKyAgICAqICAgW0F1dG9tYXRpYyBFc2NhcGluZyBmb3IgU3BlY2lhbCBDaGFyYWN0ZXJzXSgjYXV0b2VzY2FwZSkKKyogICBbQmxvY2sgRWxlbWVudHNdKCNibG9jaykKKyAgICAqICAgW1BhcmFncmFwaHMgYW5kIExpbmUgQnJlYWtzXSgjcCkKKyAgICAqICAgW0hlYWRlcnNdKCNoZWFkZXIpCisgICAgKiAgIFtCbG9ja3F1b3Rlc10oI2Jsb2NrcXVvdGUpCisgICAgKiAgIFtMaXN0c10oI2xpc3QpCisgICAgKiAgIFtDb2RlIEJsb2Nrc10oI3ByZWNvZGUpCisgICAgKiAgIFtIb3Jpem9udGFsIFJ1bGVzXSgjaHIpCisqICAgW1NwYW4gRWxlbWVudHNdKCNzcGFuKQorICAgICogICBbTGlua3NdKCNsaW5rKQorICAgICogICBbRW1waGFzaXNdKCNlbSkKKyAgICAqICAgW0NvZGVdKCNjb2RlKQorICAgICogICBbSW1hZ2VzXSgjaW1nKQorKiAgIFtNaXNjZWxsYW5lb3VzXSgjbWlzYykKKyAgICAqICAgW0JhY2tzbGFzaCBFc2NhcGVzXSgjYmFja3NsYXNoKQorICAgICogICBbQXV0b21hdGljIExpbmtzXSgjYXV0b2xpbmspCisKKworKipOb3RlOioqIFRoaXMgZG9jdW1lbnQgaXMgaXRzZWxmIHdyaXR0ZW4gdXNpbmcgTWFya2Rvd247IHlvdQorY2FuIFtzZWUgdGhlIHNvdXJjZSBmb3IgaXQgYnkgYWRkaW5nICcudGV4dCcgdG8gdGhlIFVSTF1bc3JjXS4KKworICBbc3JjXTogL3Byb2plY3RzL21hcmtkb3duL3N5bnRheC50ZXh0CisKKyogKiAqCisKKzxoMiBpZD0ib3ZlcnZpZXciPk92ZXJ2aWV3PC9oMj4KKworPGgzIGlkPSJwaGlsb3NvcGh5Ij5QaGlsb3NvcGh5PC9oMz4KKworTWFya2Rvd24gaXMgaW50ZW5kZWQgdG8gYmUgYXMgZWFzeS10by1yZWFkIGFuZCBlYXN5LXRvLXdyaXRlIGFzIGlzIGZlYXNpYmxlLgorCitSZWFkYWJpbGl0eSwgaG93ZXZlciwgaXMgZW1waGFzaXplZCBhYm92ZSBhbGwgZWxzZS4gQSBNYXJrZG93bi1mb3JtYXR0ZWQKK2RvY3VtZW50IHNob3VsZCBiZSBwdWJsaXNoYWJsZSBhcy1pcywgYXMgcGxhaW4gdGV4dCwgd2l0aG91dCBsb29raW5nCitsaWtlIGl0J3MgYmVlbiBtYXJrZWQgdXAgd2l0aCB0YWdzIG9yIGZvcm1hdHRpbmcgaW5zdHJ1Y3Rpb25zLiBXaGlsZQorTWFya2Rvd24ncyBzeW50YXggaGFzIGJlZW4gaW5mbHVlbmNlZCBieSBzZXZlcmFsIGV4aXN0aW5nIHRleHQtdG8tSFRNTAorZmlsdGVycyAtLSBpbmNsdWRpbmcgW1NldGV4dF0gWzFdLCBbYXR4XSBbMl0sIFtUZXh0aWxlXSBbM10sIFtyZVN0cnVjdHVyZWRUZXh0XSBbNF0sCitbR3J1dGF0ZXh0XSBbNV0sIGFuZCBbRXRUZXh0XSBbNl0gLS0gdGhlIHNpbmdsZSBiaWdnZXN0IHNvdXJjZSBvZgoraW5zcGlyYXRpb24gZm9yIE1hcmtkb3duJ3Mgc3ludGF4IGlzIHRoZSBmb3JtYXQgb2YgcGxhaW4gdGV4dCBlbWFpbC4KKworICBbMV06IGh0dHA6Ly9kb2N1dGlscy5zb3VyY2Vmb3JnZS5uZXQvbWlycm9yL3NldGV4dC5odG1sCisgIFsyXTogaHR0cDovL3d3dy5hYXJvbnN3LmNvbS8yMDAyL2F0eC8KKyAgWzNdOiBodHRwOi8vdGV4dGlzbS5jb20vdG9vbHMvdGV4dGlsZS8KKyAgWzRdOiBodHRwOi8vZG9jdXRpbHMuc291cmNlZm9yZ2UubmV0L3JzdC5odG1sCisgIFs1XTogaHR0cDovL3d3dy50cmlwdGljby5jb20vc29mdHdhcmUvZ3J1dGF0eHQuaHRtbAorICBbNl06IGh0dHA6Ly9ldHRleHQudGFpbnQub3JnL2RvYy8KKworVG8gdGhpcyBlbmQsIE1hcmtkb3duJ3Mgc3ludGF4IGlzIGNvbXByaXNlZCBlbnRpcmVseSBvZiBwdW5jdHVhdGlvbgorY2hhcmFjdGVycywgd2hpY2ggcHVuY3R1YXRpb24gY2hhcmFjdGVycyBoYXZlIGJlZW4gY2FyZWZ1bGx5IGNob3NlbiBzbworYXMgdG8gbG9vayBsaWtlIHdoYXQgdGhleSBtZWFuLiBFLmcuLCBhc3Rlcmlza3MgYXJvdW5kIGEgd29yZCBhY3R1YWxseQorbG9vayBsaWtlIFwqZW1waGFzaXNcKi4gTWFya2Rvd24gbGlzdHMgbG9vayBsaWtlLCB3ZWxsLCBsaXN0cy4gRXZlbgorYmxvY2txdW90ZXMgbG9vayBsaWtlIHF1b3RlZCBwYXNzYWdlcyBvZiB0ZXh0LCBhc3N1bWluZyB5b3UndmUgZXZlcgordXNlZCBlbWFpbC4KKworCisKKzxoMyBpZD0iaHRtbCI+SW5saW5lIEhUTUw8L2gzPgorCitNYXJrZG93bidzIHN5bnRheCBpcyBpbnRlbmRlZCBmb3Igb25lIHB1cnBvc2U6IHRvIGJlIHVzZWQgYXMgYQorZm9ybWF0IGZvciAqd3JpdGluZyogZm9yIHRoZSB3ZWIuCisKK01hcmtkb3duIGlzIG5vdCBhIHJlcGxhY2VtZW50IGZvciBIVE1MLCBvciBldmVuIGNsb3NlIHRvIGl0LiBJdHMKK3N5bnRheCBpcyB2ZXJ5IHNtYWxsLCBjb3JyZXNwb25kaW5nIG9ubHkgdG8gYSB2ZXJ5IHNtYWxsIHN1YnNldCBvZgorSFRNTCB0YWdzLiBUaGUgaWRlYSBpcyAqbm90KiB0byBjcmVhdGUgYSBzeW50YXggdGhhdCBtYWtlcyBpdCBlYXNpZXIKK3RvIGluc2VydCBIVE1MIHRhZ3MuIEluIG15IG9waW5pb24sIEhUTUwgdGFncyBhcmUgYWxyZWFkeSBlYXN5IHRvCitpbnNlcnQuIFRoZSBpZGVhIGZvciBNYXJrZG93biBpcyB0byBtYWtlIGl0IGVhc3kgdG8gcmVhZCwgd3JpdGUsIGFuZAorZWRpdCBwcm9zZS4gSFRNTCBpcyBhICpwdWJsaXNoaW5nKiBmb3JtYXQ7IE1hcmtkb3duIGlzIGEgKndyaXRpbmcqCitmb3JtYXQuIFRodXMsIE1hcmtkb3duJ3MgZm9ybWF0dGluZyBzeW50YXggb25seSBhZGRyZXNzZXMgaXNzdWVzIHRoYXQKK2NhbiBiZSBjb252ZXllZCBpbiBwbGFpbiB0ZXh0LgorCitGb3IgYW55IG1hcmt1cCB0aGF0IGlzIG5vdCBjb3ZlcmVkIGJ5IE1hcmtkb3duJ3Mgc3ludGF4LCB5b3Ugc2ltcGx5Cit1c2UgSFRNTCBpdHNlbGYuIFRoZXJlJ3Mgbm8gbmVlZCB0byBwcmVmYWNlIGl0IG9yIGRlbGltaXQgaXQgdG8KK2luZGljYXRlIHRoYXQgeW91J3JlIHN3aXRjaGluZyBmcm9tIE1hcmtkb3duIHRvIEhUTUw7IHlvdSBqdXN0IHVzZQordGhlIHRhZ3MuCisKK1RoZSBvbmx5IHJlc3RyaWN0aW9ucyBhcmUgdGhhdCBibG9jay1sZXZlbCBIVE1MIGVsZW1lbnRzIC0tIGUuZy4gYDxkaXY+YCwKK2A8dGFibGU+YCwgYDxwcmU+YCwgYDxwPmAsIGV0Yy4gLS0gbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBzdXJyb3VuZGluZworY29udGVudCBieSBibGFuayBsaW5lcywgYW5kIHRoZSBzdGFydCBhbmQgZW5kIHRhZ3Mgb2YgdGhlIGJsb2NrIHNob3VsZAorbm90IGJlIGluZGVudGVkIHdpdGggdGFicyBvciBzcGFjZXMuIE1hcmtkb3duIGlzIHNtYXJ0IGVub3VnaCBub3QKK3RvIGFkZCBleHRyYSAodW53YW50ZWQpIGA8cD5gIHRhZ3MgYXJvdW5kIEhUTUwgYmxvY2stbGV2ZWwgdGFncy4KKworRm9yIGV4YW1wbGUsIHRvIGFkZCBhbiBIVE1MIHRhYmxlIHRvIGEgTWFya2Rvd24gYXJ0aWNsZToKKworICAgIFRoaXMgaXMgYSByZWd1bGFyIHBhcmFncmFwaC4KKworICAgIDx0YWJsZT4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPkZvbzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKworICAgIFRoaXMgaXMgYW5vdGhlciByZWd1bGFyIHBhcmFncmFwaC4KKworTm90ZSB0aGF0IE1hcmtkb3duIGZvcm1hdHRpbmcgc3ludGF4IGlzIG5vdCBwcm9jZXNzZWQgd2l0aGluIGJsb2NrLWxldmVsCitIVE1MIHRhZ3MuIEUuZy4sIHlvdSBjYW4ndCB1c2UgTWFya2Rvd24tc3R5bGUgYCplbXBoYXNpcypgIGluc2lkZSBhbgorSFRNTCBibG9jay4KKworU3Bhbi1sZXZlbCBIVE1MIHRhZ3MgLS0gZS5nLiBgPHNwYW4+YCwgYDxjaXRlPmAsIG9yIGA8ZGVsPmAgLS0gY2FuIGJlCit1c2VkIGFueXdoZXJlIGluIGEgTWFya2Rvd24gcGFyYWdyYXBoLCBsaXN0IGl0ZW0sIG9yIGhlYWRlci4gSWYgeW91Cit3YW50LCB5b3UgY2FuIGV2ZW4gdXNlIEhUTUwgdGFncyBpbnN0ZWFkIG9mIE1hcmtkb3duIGZvcm1hdHRpbmc7IGUuZy4gaWYKK3lvdSdkIHByZWZlciB0byB1c2UgSFRNTCBgPGE+YCBvciBgPGltZz5gIHRhZ3MgaW5zdGVhZCBvZiBNYXJrZG93bidzCitsaW5rIG9yIGltYWdlIHN5bnRheCwgZ28gcmlnaHQgYWhlYWQuCisKK1VubGlrZSBibG9jay1sZXZlbCBIVE1MIHRhZ3MsIE1hcmtkb3duIHN5bnRheCAqaXMqIHByb2Nlc3NlZCB3aXRoaW4KK3NwYW4tbGV2ZWwgdGFncy4KKworCis8aDMgaWQ9ImF1dG9lc2NhcGUiPkF1dG9tYXRpYyBFc2NhcGluZyBmb3IgU3BlY2lhbCBDaGFyYWN0ZXJzPC9oMz4KKworSW4gSFRNTCwgdGhlcmUgYXJlIHR3byBjaGFyYWN0ZXJzIHRoYXQgZGVtYW5kIHNwZWNpYWwgdHJlYXRtZW50OiBgPGAKK2FuZCBgJmAuIExlZnQgYW5nbGUgYnJhY2tldHMgYXJlIHVzZWQgdG8gc3RhcnQgdGFnczsgYW1wZXJzYW5kcyBhcmUKK3VzZWQgdG8gZGVub3RlIEhUTUwgZW50aXRpZXMuIElmIHlvdSB3YW50IHRvIHVzZSB0aGVtIGFzIGxpdGVyYWwKK2NoYXJhY3RlcnMsIHlvdSBtdXN0IGVzY2FwZSB0aGVtIGFzIGVudGl0aWVzLCBlLmcuIGAmbHQ7YCwgYW5kCitgJmFtcDtgLgorCitBbXBlcnNhbmRzIGluIHBhcnRpY3VsYXIgYXJlIGJlZGV2aWxpbmcgZm9yIHdlYiB3cml0ZXJzLiBJZiB5b3Ugd2FudCB0bword3JpdGUgYWJvdXQgJ0FUJlQnLCB5b3UgbmVlZCB0byB3cml0ZSAnYEFUJmFtcDtUYCcuIFlvdSBldmVuIG5lZWQgdG8KK2VzY2FwZSBhbXBlcnNhbmRzIHdpdGhpbiBVUkxzLiBUaHVzLCBpZiB5b3Ugd2FudCB0byBsaW5rIHRvOgorCisgICAgaHR0cDovL2ltYWdlcy5nb29nbGUuY29tL2ltYWdlcz9udW09MzAmcT1sYXJyeStiaXJkCisKK3lvdSBuZWVkIHRvIGVuY29kZSB0aGUgVVJMIGFzOgorCisgICAgaHR0cDovL2ltYWdlcy5nb29nbGUuY29tL2ltYWdlcz9udW09MzAmYW1wO3E9bGFycnkrYmlyZAorCitpbiB5b3VyIGFuY2hvciB0YWcgYGhyZWZgIGF0dHJpYnV0ZS4gTmVlZGxlc3MgdG8gc2F5LCB0aGlzIGlzIGVhc3kgdG8KK2ZvcmdldCwgYW5kIGlzIHByb2JhYmx5IHRoZSBzaW5nbGUgbW9zdCBjb21tb24gc291cmNlIG9mIEhUTUwgdmFsaWRhdGlvbgorZXJyb3JzIGluIG90aGVyd2lzZSB3ZWxsLW1hcmtlZC11cCB3ZWIgc2l0ZXMuCisKK01hcmtkb3duIGFsbG93cyB5b3UgdG8gdXNlIHRoZXNlIGNoYXJhY3RlcnMgbmF0dXJhbGx5LCB0YWtpbmcgY2FyZSBvZgorYWxsIHRoZSBuZWNlc3NhcnkgZXNjYXBpbmcgZm9yIHlvdS4gSWYgeW91IHVzZSBhbiBhbXBlcnNhbmQgYXMgcGFydCBvZgorYW4gSFRNTCBlbnRpdHksIGl0IHJlbWFpbnMgdW5jaGFuZ2VkOyBvdGhlcndpc2UgaXQgd2lsbCBiZSB0cmFuc2xhdGVkCitpbnRvIGAmYW1wO2AuCisKK1NvLCBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIGEgY29weXJpZ2h0IHN5bWJvbCBpbiB5b3VyIGFydGljbGUsIHlvdSBjYW4gd3JpdGU6CisKKyAgICAmY29weTsKKworYW5kIE1hcmtkb3duIHdpbGwgbGVhdmUgaXQgYWxvbmUuIEJ1dCBpZiB5b3Ugd3JpdGU6CisKKyAgICBBVCZUCisKK01hcmtkb3duIHdpbGwgdHJhbnNsYXRlIGl0IHRvOgorCisgICAgQVQmYW1wO1QKKworU2ltaWxhcmx5LCBiZWNhdXNlIE1hcmtkb3duIHN1cHBvcnRzIFtpbmxpbmUgSFRNTF0oI2h0bWwpLCBpZiB5b3UgdXNlCithbmdsZSBicmFja2V0cyBhcyBkZWxpbWl0ZXJzIGZvciBIVE1MIHRhZ3MsIE1hcmtkb3duIHdpbGwgdHJlYXQgdGhlbSBhcworc3VjaC4gQnV0IGlmIHlvdSB3cml0ZToKKworICAgIDQgPCA1CisKK01hcmtkb3duIHdpbGwgdHJhbnNsYXRlIGl0IHRvOgorCisgICAgNCAmbHQ7IDUKKworSG93ZXZlciwgaW5zaWRlIE1hcmtkb3duIGNvZGUgc3BhbnMgYW5kIGJsb2NrcywgYW5nbGUgYnJhY2tldHMgYW5kCithbXBlcnNhbmRzIGFyZSAqYWx3YXlzKiBlbmNvZGVkIGF1dG9tYXRpY2FsbHkuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB1c2UKK01hcmtkb3duIHRvIHdyaXRlIGFib3V0IEhUTUwgY29kZS4gKEFzIG9wcG9zZWQgdG8gcmF3IEhUTUwsIHdoaWNoIGlzIGEKK3RlcnJpYmxlIGZvcm1hdCBmb3Igd3JpdGluZyBhYm91dCBIVE1MIHN5bnRheCwgYmVjYXVzZSBldmVyeSBzaW5nbGUgYDxgCithbmQgYCZgIGluIHlvdXIgZXhhbXBsZSBjb2RlIG5lZWRzIHRvIGJlIGVzY2FwZWQuKQorCisKKyogKiAqCisKKworPGgyIGlkPSJibG9jayI+QmxvY2sgRWxlbWVudHM8L2gyPgorCisKKzxoMyBpZD0icCI+UGFyYWdyYXBocyBhbmQgTGluZSBCcmVha3M8L2gzPgorCitBIHBhcmFncmFwaCBpcyBzaW1wbHkgb25lIG9yIG1vcmUgY29uc2VjdXRpdmUgbGluZXMgb2YgdGV4dCwgc2VwYXJhdGVkCitieSBvbmUgb3IgbW9yZSBibGFuayBsaW5lcy4gKEEgYmxhbmsgbGluZSBpcyBhbnkgbGluZSB0aGF0IGxvb2tzIGxpa2UgYQorYmxhbmsgbGluZSAtLSBhIGxpbmUgY29udGFpbmluZyBub3RoaW5nIGJ1dCBzcGFjZXMgb3IgdGFicyBpcyBjb25zaWRlcmVkCitibGFuay4pIE5vcm1hbCBwYXJhZ3JhcGhzIHNob3VsZCBub3QgYmUgaW50ZW5kZWQgd2l0aCBzcGFjZXMgb3IgdGFicy4KKworVGhlIGltcGxpY2F0aW9uIG9mIHRoZSAib25lIG9yIG1vcmUgY29uc2VjdXRpdmUgbGluZXMgb2YgdGV4dCIgcnVsZSBpcwordGhhdCBNYXJrZG93biBzdXBwb3J0cyAiaGFyZC13cmFwcGVkIiB0ZXh0IHBhcmFncmFwaHMuIFRoaXMgZGlmZmVycworc2lnbmlmaWNhbnRseSBmcm9tIG1vc3Qgb3RoZXIgdGV4dC10by1IVE1MIGZvcm1hdHRlcnMgKGluY2x1ZGluZyBNb3ZhYmxlCitUeXBlJ3MgIkNvbnZlcnQgTGluZSBCcmVha3MiIG9wdGlvbikgd2hpY2ggdHJhbnNsYXRlIGV2ZXJ5IGxpbmUgYnJlYWsKK2NoYXJhY3RlciBpbiBhIHBhcmFncmFwaCBpbnRvIGEgYDxiciAvPmAgdGFnLgorCitXaGVuIHlvdSAqZG8qIHdhbnQgdG8gaW5zZXJ0IGEgYDxiciAvPmAgYnJlYWsgdGFnIHVzaW5nIE1hcmtkb3duLCB5b3UKK2VuZCBhIGxpbmUgd2l0aCB0d28gb3IgbW9yZSBzcGFjZXMsIHRoZW4gdHlwZSByZXR1cm4uCisKK1llcywgdGhpcyB0YWtlcyBhIHRhZCBtb3JlIGVmZm9ydCB0byBjcmVhdGUgYSBgPGJyIC8+YCwgYnV0IGEgc2ltcGxpc3RpYworImV2ZXJ5IGxpbmUgYnJlYWsgaXMgYSBgPGJyIC8+YCIgcnVsZSB3b3VsZG4ndCB3b3JrIGZvciBNYXJrZG93bi4KK01hcmtkb3duJ3MgZW1haWwtc3R5bGUgW2Jsb2NrcXVvdGluZ11bYnFdIGFuZCBtdWx0aS1wYXJhZ3JhcGggW2xpc3QgaXRlbXNdW2xdCit3b3JrIGJlc3QgLS0gYW5kIGxvb2sgYmV0dGVyIC0tIHdoZW4geW91IGZvcm1hdCB0aGVtIHdpdGggaGFyZCBicmVha3MuCisKKyAgW2JxXTogI2Jsb2NrcXVvdGUKKyAgW2xdOiAgI2xpc3QKKworCisKKzxoMyBpZD0iaGVhZGVyIj5IZWFkZXJzPC9oMz4KKworTWFya2Rvd24gc3VwcG9ydHMgdHdvIHN0eWxlcyBvZiBoZWFkZXJzLCBbU2V0ZXh0XSBbMV0gYW5kIFthdHhdIFsyXS4KKworU2V0ZXh0LXN0eWxlIGhlYWRlcnMgYXJlICJ1bmRlcmxpbmVkIiB1c2luZyBlcXVhbCBzaWducyAoZm9yIGZpcnN0LWxldmVsCitoZWFkZXJzKSBhbmQgZGFzaGVzIChmb3Igc2Vjb25kLWxldmVsIGhlYWRlcnMpLiBGb3IgZXhhbXBsZToKKworICAgIFRoaXMgaXMgYW4gSDEKKyAgICA9PT09PT09PT09PT09CisKKyAgICBUaGlzIGlzIGFuIEgyCisgICAgLS0tLS0tLS0tLS0tLQorCitBbnkgbnVtYmVyIG9mIHVuZGVybGluaW5nIGA9YCdzIG9yIGAtYCdzIHdpbGwgd29yay4KKworQXR4LXN0eWxlIGhlYWRlcnMgdXNlIDEtNiBoYXNoIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLAorY29ycmVzcG9uZGluZyB0byBoZWFkZXIgbGV2ZWxzIDEtNi4gRm9yIGV4YW1wbGU6CisKKyAgICAjIFRoaXMgaXMgYW4gSDEKKworICAgICMjIFRoaXMgaXMgYW4gSDIKKworICAgICMjIyMjIyBUaGlzIGlzIGFuIEg2CisKK09wdGlvbmFsbHksIHlvdSBtYXkgImNsb3NlIiBhdHgtc3R5bGUgaGVhZGVycy4gVGhpcyBpcyBwdXJlbHkKK2Nvc21ldGljIC0tIHlvdSBjYW4gdXNlIHRoaXMgaWYgeW91IHRoaW5rIGl0IGxvb2tzIGJldHRlci4gVGhlCitjbG9zaW5nIGhhc2hlcyBkb24ndCBldmVuIG5lZWQgdG8gbWF0Y2ggdGhlIG51bWJlciBvZiBoYXNoZXMKK3VzZWQgdG8gb3BlbiB0aGUgaGVhZGVyLiAoVGhlIG51bWJlciBvZiBvcGVuaW5nIGhhc2hlcworZGV0ZXJtaW5lcyB0aGUgaGVhZGVyIGxldmVsLikgOgorCisgICAgIyBUaGlzIGlzIGFuIEgxICMKKworICAgICMjIFRoaXMgaXMgYW4gSDIgIyMKKworICAgICMjIyBUaGlzIGlzIGFuIEgzICMjIyMjIworCisKKzxoMyBpZD0iYmxvY2txdW90ZSI+QmxvY2txdW90ZXM8L2gzPgorCitNYXJrZG93biB1c2VzIGVtYWlsLXN0eWxlIGA+YCBjaGFyYWN0ZXJzIGZvciBibG9ja3F1b3RpbmcuIElmIHlvdSdyZQorZmFtaWxpYXIgd2l0aCBxdW90aW5nIHBhc3NhZ2VzIG9mIHRleHQgaW4gYW4gZW1haWwgbWVzc2FnZSwgdGhlbiB5b3UKK2tub3cgaG93IHRvIGNyZWF0ZSBhIGJsb2NrcXVvdGUgaW4gTWFya2Rvd24uIEl0IGxvb2tzIGJlc3QgaWYgeW91IGhhcmQKK3dyYXAgdGhlIHRleHQgYW5kIHB1dCBhIGA+YCBiZWZvcmUgZXZlcnkgbGluZToKKworICAgID4gVGhpcyBpcyBhIGJsb2NrcXVvdGUgd2l0aCB0d28gcGFyYWdyYXBocy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsCisgICAgPiBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBBbGlxdWFtIGhlbmRyZXJpdCBtaSBwb3N1ZXJlIGxlY3R1cy4KKyAgICA+IFZlc3RpYnVsdW0gZW5pbSB3aXNpLCB2aXZlcnJhIG5lYywgZnJpbmdpbGxhIGluLCBsYW9yZWV0IHZpdGFlLCByaXN1cy4KKyAgICA+IAorICAgID4gRG9uZWMgc2l0IGFtZXQgbmlzbC4gQWxpcXVhbSBzZW1wZXIgaXBzdW0gc2l0IGFtZXQgdmVsaXQuIFN1c3BlbmRpc3NlCisgICAgPiBpZCBzZW0gY29uc2VjdGV0dWVyIGxpYmVybyBsdWN0dXMgYWRpcGlzY2luZy4KKworTWFya2Rvd24gYWxsb3dzIHlvdSB0byBiZSBsYXp5IGFuZCBvbmx5IHB1dCB0aGUgYD5gIGJlZm9yZSB0aGUgZmlyc3QKK2xpbmUgb2YgYSBoYXJkLXdyYXBwZWQgcGFyYWdyYXBoOgorCisgICAgPiBUaGlzIGlzIGEgYmxvY2txdW90ZSB3aXRoIHR3byBwYXJhZ3JhcGhzLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwKKyAgICBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBBbGlxdWFtIGhlbmRyZXJpdCBtaSBwb3N1ZXJlIGxlY3R1cy4KKyAgICBWZXN0aWJ1bHVtIGVuaW0gd2lzaSwgdml2ZXJyYSBuZWMsIGZyaW5naWxsYSBpbiwgbGFvcmVldCB2aXRhZSwgcmlzdXMuCisKKyAgICA+IERvbmVjIHNpdCBhbWV0IG5pc2wuIEFsaXF1YW0gc2VtcGVyIGlwc3VtIHNpdCBhbWV0IHZlbGl0LiBTdXNwZW5kaXNzZQorICAgIGlkIHNlbSBjb25zZWN0ZXR1ZXIgbGliZXJvIGx1Y3R1cyBhZGlwaXNjaW5nLgorCitCbG9ja3F1b3RlcyBjYW4gYmUgbmVzdGVkIChpLmUuIGEgYmxvY2txdW90ZS1pbi1hLWJsb2NrcXVvdGUpIGJ5CithZGRpbmcgYWRkaXRpb25hbCBsZXZlbHMgb2YgYD5gOgorCisgICAgPiBUaGlzIGlzIHRoZSBmaXJzdCBsZXZlbCBvZiBxdW90aW5nLgorICAgID4KKyAgICA+ID4gVGhpcyBpcyBuZXN0ZWQgYmxvY2txdW90ZS4KKyAgICA+CisgICAgPiBCYWNrIHRvIHRoZSBmaXJzdCBsZXZlbC4KKworQmxvY2txdW90ZXMgY2FuIGNvbnRhaW4gb3RoZXIgTWFya2Rvd24gZWxlbWVudHMsIGluY2x1ZGluZyBoZWFkZXJzLCBsaXN0cywKK2FuZCBjb2RlIGJsb2NrczoKKworCT4gIyMgVGhpcyBpcyBhIGhlYWRlci4KKwk+IAorCT4gMS4gICBUaGlzIGlzIHRoZSBmaXJzdCBsaXN0IGl0ZW0uCisJPiAyLiAgIFRoaXMgaXMgdGhlIHNlY29uZCBsaXN0IGl0ZW0uCisJPiAKKwk+IEhlcmUncyBzb21lIGV4YW1wbGUgY29kZToKKwk+IAorCT4gICAgIHJldHVybiBzaGVsbF9leGVjKCJlY2hvICRpbnB1dCB8ICRtYXJrZG93bl9zY3JpcHQiKTsKKworQW55IGRlY2VudCB0ZXh0IGVkaXRvciBzaG91bGQgbWFrZSBlbWFpbC1zdHlsZSBxdW90aW5nIGVhc3kuIEZvcgorZXhhbXBsZSwgd2l0aCBCQkVkaXQsIHlvdSBjYW4gbWFrZSBhIHNlbGVjdGlvbiBhbmQgY2hvb3NlIEluY3JlYXNlCitRdW90ZSBMZXZlbCBmcm9tIHRoZSBUZXh0IG1lbnUuCisKKworPGgzIGlkPSJsaXN0Ij5MaXN0czwvaDM+CisKK01hcmtkb3duIHN1cHBvcnRzIG9yZGVyZWQgKG51bWJlcmVkKSBhbmQgdW5vcmRlcmVkIChidWxsZXRlZCkgbGlzdHMuCisKK1Vub3JkZXJlZCBsaXN0cyB1c2UgYXN0ZXJpc2tzLCBwbHVzZXMsIGFuZCBoeXBoZW5zIC0tIGludGVyY2hhbmdhYmx5CistLSBhcyBsaXN0IG1hcmtlcnM6CisKKyAgICAqICAgUmVkCisgICAgKiAgIEdyZWVuCisgICAgKiAgIEJsdWUKKworaXMgZXF1aXZhbGVudCB0bzoKKworICAgICsgICBSZWQKKyAgICArICAgR3JlZW4KKyAgICArICAgQmx1ZQorCithbmQ6CisKKyAgICAtICAgUmVkCisgICAgLSAgIEdyZWVuCisgICAgLSAgIEJsdWUKKworT3JkZXJlZCBsaXN0cyB1c2UgbnVtYmVycyBmb2xsb3dlZCBieSBwZXJpb2RzOgorCisgICAgMS4gIEJpcmQKKyAgICAyLiAgTWNIYWxlCisgICAgMy4gIFBhcmlzaAorCitJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGFjdHVhbCBudW1iZXJzIHlvdSB1c2UgdG8gbWFyayB0aGUKK2xpc3QgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIEhUTUwgb3V0cHV0IE1hcmtkb3duIHByb2R1Y2VzLiBUaGUgSFRNTAorTWFya2Rvd24gcHJvZHVjZXMgZnJvbSB0aGUgYWJvdmUgbGlzdCBpczoKKworICAgIDxvbD4KKyAgICA8bGk+QmlyZDwvbGk+CisgICAgPGxpPk1jSGFsZTwvbGk+CisgICAgPGxpPlBhcmlzaDwvbGk+CisgICAgPC9vbD4KKworSWYgeW91IGluc3RlYWQgd3JvdGUgdGhlIGxpc3QgaW4gTWFya2Rvd24gbGlrZSB0aGlzOgorCisgICAgMS4gIEJpcmQKKyAgICAxLiAgTWNIYWxlCisgICAgMS4gIFBhcmlzaAorCitvciBldmVuOgorCisgICAgMy4gQmlyZAorICAgIDEuIE1jSGFsZQorICAgIDguIFBhcmlzaAorCit5b3UnZCBnZXQgdGhlIGV4YWN0IHNhbWUgSFRNTCBvdXRwdXQuIFRoZSBwb2ludCBpcywgaWYgeW91IHdhbnQgdG8sCit5b3UgY2FuIHVzZSBvcmRpbmFsIG51bWJlcnMgaW4geW91ciBvcmRlcmVkIE1hcmtkb3duIGxpc3RzLCBzbyB0aGF0Cit0aGUgbnVtYmVycyBpbiB5b3VyIHNvdXJjZSBtYXRjaCB0aGUgbnVtYmVycyBpbiB5b3VyIHB1Ymxpc2hlZCBIVE1MLgorQnV0IGlmIHlvdSB3YW50IHRvIGJlIGxhenksIHlvdSBkb24ndCBoYXZlIHRvLgorCitJZiB5b3UgZG8gdXNlIGxhenkgbGlzdCBudW1iZXJpbmcsIGhvd2V2ZXIsIHlvdSBzaG91bGQgc3RpbGwgc3RhcnQgdGhlCitsaXN0IHdpdGggdGhlIG51bWJlciAxLiBBdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUsIE1hcmtkb3duIG1heSBzdXBwb3J0CitzdGFydGluZyBvcmRlcmVkIGxpc3RzIGF0IGFuIGFyYml0cmFyeSBudW1iZXIuCisKK0xpc3QgbWFya2VycyB0eXBpY2FsbHkgc3RhcnQgYXQgdGhlIGxlZnQgbWFyZ2luLCBidXQgbWF5IGJlIGluZGVudGVkIGJ5Cit1cCB0byB0aHJlZSBzcGFjZXMuIExpc3QgbWFya2VycyBtdXN0IGJlIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHNwYWNlcworb3IgYSB0YWIuCisKK1RvIG1ha2UgbGlzdHMgbG9vayBuaWNlLCB5b3UgY2FuIHdyYXAgaXRlbXMgd2l0aCBoYW5naW5nIGluZGVudHM6CisKKyAgICAqICAgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQuCisgICAgICAgIEFsaXF1YW0gaGVuZHJlcml0IG1pIHBvc3VlcmUgbGVjdHVzLiBWZXN0aWJ1bHVtIGVuaW0gd2lzaSwKKyAgICAgICAgdml2ZXJyYSBuZWMsIGZyaW5naWxsYSBpbiwgbGFvcmVldCB2aXRhZSwgcmlzdXMuCisgICAgKiAgIERvbmVjIHNpdCBhbWV0IG5pc2wuIEFsaXF1YW0gc2VtcGVyIGlwc3VtIHNpdCBhbWV0IHZlbGl0LgorICAgICAgICBTdXNwZW5kaXNzZSBpZCBzZW0gY29uc2VjdGV0dWVyIGxpYmVybyBsdWN0dXMgYWRpcGlzY2luZy4KKworQnV0IGlmIHlvdSB3YW50IHRvIGJlIGxhenksIHlvdSBkb24ndCBoYXZlIHRvOgorCisgICAgKiAgIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LgorICAgIEFsaXF1YW0gaGVuZHJlcml0IG1pIHBvc3VlcmUgbGVjdHVzLiBWZXN0aWJ1bHVtIGVuaW0gd2lzaSwKKyAgICB2aXZlcnJhIG5lYywgZnJpbmdpbGxhIGluLCBsYW9yZWV0IHZpdGFlLCByaXN1cy4KKyAgICAqICAgRG9uZWMgc2l0IGFtZXQgbmlzbC4gQWxpcXVhbSBzZW1wZXIgaXBzdW0gc2l0IGFtZXQgdmVsaXQuCisgICAgU3VzcGVuZGlzc2UgaWQgc2VtIGNvbnNlY3RldHVlciBsaWJlcm8gbHVjdHVzIGFkaXBpc2NpbmcuCisKK0lmIGxpc3QgaXRlbXMgYXJlIHNlcGFyYXRlZCBieSBibGFuayBsaW5lcywgTWFya2Rvd24gd2lsbCB3cmFwIHRoZQoraXRlbXMgaW4gYDxwPmAgdGFncyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBleGFtcGxlLCB0aGlzIGlucHV0OgorCisgICAgKiAgIEJpcmQKKyAgICAqICAgTWFnaWMKKword2lsbCB0dXJuIGludG86CisKKyAgICA8dWw+CisgICAgPGxpPkJpcmQ8L2xpPgorICAgIDxsaT5NYWdpYzwvbGk+CisgICAgPC91bD4KKworQnV0IHRoaXM6CisKKyAgICAqICAgQmlyZAorCisgICAgKiAgIE1hZ2ljCisKK3dpbGwgdHVybiBpbnRvOgorCisgICAgPHVsPgorICAgIDxsaT48cD5CaXJkPC9wPjwvbGk+CisgICAgPGxpPjxwPk1hZ2ljPC9wPjwvbGk+CisgICAgPC91bD4KKworTGlzdCBpdGVtcyBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBwYXJhZ3JhcGhzLiBFYWNoIHN1YnNlcXVlbnQKK3BhcmFncmFwaCBpbiBhIGxpc3QgaXRlbSBtdXN0IGJlIGludGVuZGVkIGJ5IGVpdGhlciA0IHNwYWNlcworb3Igb25lIHRhYjoKKworICAgIDEuICBUaGlzIGlzIGEgbGlzdCBpdGVtIHdpdGggdHdvIHBhcmFncmFwaHMuIExvcmVtIGlwc3VtIGRvbG9yCisgICAgICAgIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBBbGlxdWFtIGhlbmRyZXJpdAorICAgICAgICBtaSBwb3N1ZXJlIGxlY3R1cy4KKworICAgICAgICBWZXN0aWJ1bHVtIGVuaW0gd2lzaSwgdml2ZXJyYSBuZWMsIGZyaW5naWxsYSBpbiwgbGFvcmVldAorICAgICAgICB2aXRhZSwgcmlzdXMuIERvbmVjIHNpdCBhbWV0IG5pc2wuIEFsaXF1YW0gc2VtcGVyIGlwc3VtCisgICAgICAgIHNpdCBhbWV0IHZlbGl0LgorCisgICAgMi4gIFN1c3BlbmRpc3NlIGlkIHNlbSBjb25zZWN0ZXR1ZXIgbGliZXJvIGx1Y3R1cyBhZGlwaXNjaW5nLgorCitJdCBsb29rcyBuaWNlIGlmIHlvdSBpbmRlbnQgZXZlcnkgbGluZSBvZiB0aGUgc3Vic2VxdWVudAorcGFyYWdyYXBocywgYnV0IGhlcmUgYWdhaW4sIE1hcmtkb3duIHdpbGwgYWxsb3cgeW91IHRvIGJlCitsYXp5OgorCisgICAgKiAgIFRoaXMgaXMgYSBsaXN0IGl0ZW0gd2l0aCB0d28gcGFyYWdyYXBocy4KKworICAgICAgICBUaGlzIGlzIHRoZSBzZWNvbmQgcGFyYWdyYXBoIGluIHRoZSBsaXN0IGl0ZW0uIFlvdSdyZQorICAgIG9ubHkgcmVxdWlyZWQgdG8gaW5kZW50IHRoZSBmaXJzdCBsaW5lLiBMb3JlbSBpcHN1bSBkb2xvcgorICAgIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LgorCisgICAgKiAgIEFub3RoZXIgaXRlbSBpbiB0aGUgc2FtZSBsaXN0LgorCitUbyBwdXQgYSBibG9ja3F1b3RlIHdpdGhpbiBhIGxpc3QgaXRlbSwgdGhlIGJsb2NrcXVvdGUncyBgPmAKK2RlbGltaXRlcnMgbmVlZCB0byBiZSBpbmRlbnRlZDoKKworICAgICogICBBIGxpc3QgaXRlbSB3aXRoIGEgYmxvY2txdW90ZToKKworICAgICAgICA+IFRoaXMgaXMgYSBibG9ja3F1b3RlCisgICAgICAgID4gaW5zaWRlIGEgbGlzdCBpdGVtLgorCitUbyBwdXQgYSBjb2RlIGJsb2NrIHdpdGhpbiBhIGxpc3QgaXRlbSwgdGhlIGNvZGUgYmxvY2sgbmVlZHMKK3RvIGJlIGluZGVudGVkICp0d2ljZSogLS0gOCBzcGFjZXMgb3IgdHdvIHRhYnM6CisKKyAgICAqICAgQSBsaXN0IGl0ZW0gd2l0aCBhIGNvZGUgYmxvY2s6CisKKyAgICAgICAgICAgIDxjb2RlIGdvZXMgaGVyZT4KKworCitJdCdzIHdvcnRoIG5vdGluZyB0aGF0IGl0J3MgcG9zc2libGUgdG8gdHJpZ2dlciBhbiBvcmRlcmVkIGxpc3QgYnkKK2FjY2lkZW50LCBieSB3cml0aW5nIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKKyAgICAxOTg2LiBXaGF0IGEgZ3JlYXQgc2Vhc29uLgorCitJbiBvdGhlciB3b3JkcywgYSAqbnVtYmVyLXBlcmlvZC1zcGFjZSogc2VxdWVuY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBhCitsaW5lLiBUbyBhdm9pZCB0aGlzLCB5b3UgY2FuIGJhY2tzbGFzaC1lc2NhcGUgdGhlIHBlcmlvZDoKKworICAgIDE5ODZcLiBXaGF0IGEgZ3JlYXQgc2Vhc29uLgorCisKKworPGgzIGlkPSJwcmVjb2RlIj5Db2RlIEJsb2NrczwvaDM+CisKK1ByZS1mb3JtYXR0ZWQgY29kZSBibG9ja3MgYXJlIHVzZWQgZm9yIHdyaXRpbmcgYWJvdXQgcHJvZ3JhbW1pbmcgb3IKK21hcmt1cCBzb3VyY2UgY29kZS4gUmF0aGVyIHRoYW4gZm9ybWluZyBub3JtYWwgcGFyYWdyYXBocywgdGhlIGxpbmVzCitvZiBhIGNvZGUgYmxvY2sgYXJlIGludGVycHJldGVkIGxpdGVyYWxseS4gTWFya2Rvd24gd3JhcHMgYSBjb2RlIGJsb2NrCitpbiBib3RoIGA8cHJlPmAgYW5kIGA8Y29kZT5gIHRhZ3MuCisKK1RvIHByb2R1Y2UgYSBjb2RlIGJsb2NrIGluIE1hcmtkb3duLCBzaW1wbHkgaW5kZW50IGV2ZXJ5IGxpbmUgb2YgdGhlCitibG9jayBieSBhdCBsZWFzdCA0IHNwYWNlcyBvciAxIHRhYi4gRm9yIGV4YW1wbGUsIGdpdmVuIHRoaXMgaW5wdXQ6CisKKyAgICBUaGlzIGlzIGEgbm9ybWFsIHBhcmFncmFwaDoKKworICAgICAgICBUaGlzIGlzIGEgY29kZSBibG9jay4KKworTWFya2Rvd24gd2lsbCBnZW5lcmF0ZToKKworICAgIDxwPlRoaXMgaXMgYSBub3JtYWwgcGFyYWdyYXBoOjwvcD4KKworICAgIDxwcmU+PGNvZGU+VGhpcyBpcyBhIGNvZGUgYmxvY2suCisgICAgPC9jb2RlPjwvcHJlPgorCitPbmUgbGV2ZWwgb2YgaW5kZW50YXRpb24gLS0gNCBzcGFjZXMgb3IgMSB0YWIgLS0gaXMgcmVtb3ZlZCBmcm9tIGVhY2gKK2xpbmUgb2YgdGhlIGNvZGUgYmxvY2suIEZvciBleGFtcGxlLCB0aGlzOgorCisgICAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIEFwcGxlU2NyaXB0OgorCisgICAgICAgIHRlbGwgYXBwbGljYXRpb24gIkZvbyIKKyAgICAgICAgICAgIGJlZXAKKyAgICAgICAgZW5kIHRlbGwKKword2lsbCB0dXJuIGludG86CisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgQXBwbGVTY3JpcHQ6PC9wPgorCisgICAgPHByZT48Y29kZT50ZWxsIGFwcGxpY2F0aW9uICJGb28iCisgICAgICAgIGJlZXAKKyAgICBlbmQgdGVsbAorICAgIDwvY29kZT48L3ByZT4KKworQSBjb2RlIGJsb2NrIGNvbnRpbnVlcyB1bnRpbCBpdCByZWFjaGVzIGEgbGluZSB0aGF0IGlzIG5vdCBpbmRlbnRlZAorKG9yIHRoZSBlbmQgb2YgdGhlIGFydGljbGUpLgorCitXaXRoaW4gYSBjb2RlIGJsb2NrLCBhbXBlcnNhbmRzIChgJmApIGFuZCBhbmdsZSBicmFja2V0cyAoYDxgIGFuZCBgPmApCithcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgaW50byBIVE1MIGVudGl0aWVzLiBUaGlzIG1ha2VzIGl0IHZlcnkKK2Vhc3kgdG8gaW5jbHVkZSBleGFtcGxlIEhUTUwgc291cmNlIGNvZGUgdXNpbmcgTWFya2Rvd24gLS0ganVzdCBwYXN0ZQoraXQgYW5kIGluZGVudCBpdCwgYW5kIE1hcmtkb3duIHdpbGwgaGFuZGxlIHRoZSBoYXNzbGUgb2YgZW5jb2RpbmcgdGhlCithbXBlcnNhbmRzIGFuZCBhbmdsZSBicmFja2V0cy4gRm9yIGV4YW1wbGUsIHRoaXM6CisKKyAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyIj4KKyAgICAgICAgICAgICZjb3B5OyAyMDA0IEZvbyBDb3Jwb3JhdGlvbgorICAgICAgICA8L2Rpdj4KKword2lsbCB0dXJuIGludG86CisKKyAgICA8cHJlPjxjb2RlPiZsdDtkaXYgY2xhc3M9ImZvb3RlciImZ3Q7CisgICAgICAgICZhbXA7Y29weTsgMjAwNCBGb28gQ29ycG9yYXRpb24KKyAgICAmbHQ7L2RpdiZndDsKKyAgICA8L2NvZGU+PC9wcmU+CisKK1JlZ3VsYXIgTWFya2Rvd24gc3ludGF4IGlzIG5vdCBwcm9jZXNzZWQgd2l0aGluIGNvZGUgYmxvY2tzLiBFLmcuLAorYXN0ZXJpc2tzIGFyZSBqdXN0IGxpdGVyYWwgYXN0ZXJpc2tzIHdpdGhpbiBhIGNvZGUgYmxvY2suIFRoaXMgbWVhbnMKK2l0J3MgYWxzbyBlYXN5IHRvIHVzZSBNYXJrZG93biB0byB3cml0ZSBhYm91dCBNYXJrZG93bidzIG93biBzeW50YXguCisKKworCis8aDMgaWQ9ImhyIj5Ib3Jpem9udGFsIFJ1bGVzPC9oMz4KKworWW91IGNhbiBwcm9kdWNlIGEgaG9yaXpvbnRhbCBydWxlIHRhZyAoYDxociAvPmApIGJ5IHBsYWNpbmcgdGhyZWUgb3IKK21vcmUgaHlwaGVucywgYXN0ZXJpc2tzLCBvciB1bmRlcnNjb3JlcyBvbiBhIGxpbmUgYnkgdGhlbXNlbHZlcy4gSWYgeW91Cit3aXNoLCB5b3UgbWF5IHVzZSBzcGFjZXMgYmV0d2VlbiB0aGUgaHlwaGVucyBvciBhc3Rlcmlza3MuIEVhY2ggb2YgdGhlCitmb2xsb3dpbmcgbGluZXMgd2lsbCBwcm9kdWNlIGEgaG9yaXpvbnRhbCBydWxlOgorCisgICAgKiAqICoKKworICAgICoqKgorCisgICAgKioqKioKKwkKKyAgICAtIC0gLQorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlfIF8gXworCisKKyogKiAqCisKKzxoMiBpZD0ic3BhbiI+U3BhbiBFbGVtZW50czwvaDI+CisKKzxoMyBpZD0ibGluayI+TGlua3M8L2gzPgorCitNYXJrZG93biBzdXBwb3J0cyB0d28gc3R5bGUgb2YgbGlua3M6ICppbmxpbmUqIGFuZCAqcmVmZXJlbmNlKi4KKworSW4gYm90aCBzdHlsZXMsIHRoZSBsaW5rIHRleHQgaXMgZGVsaW1pdGVkIGJ5IFtzcXVhcmUgYnJhY2tldHNdLgorCitUbyBjcmVhdGUgYW4gaW5saW5lIGxpbmssIHVzZSBhIHNldCBvZiByZWd1bGFyIHBhcmVudGhlc2VzIGltbWVkaWF0ZWx5CithZnRlciB0aGUgbGluayB0ZXh0J3MgY2xvc2luZyBzcXVhcmUgYnJhY2tldC4gSW5zaWRlIHRoZSBwYXJlbnRoZXNlcywKK3B1dCB0aGUgVVJMIHdoZXJlIHlvdSB3YW50IHRoZSBsaW5rIHRvIHBvaW50LCBhbG9uZyB3aXRoIGFuICpvcHRpb25hbCoKK3RpdGxlIGZvciB0aGUgbGluaywgc3Vycm91bmRlZCBpbiBxdW90ZXMuIEZvciBleGFtcGxlOgorCisgICAgVGhpcyBpcyBbYW4gZXhhbXBsZV0oaHR0cDovL2V4YW1wbGUuY29tLyAiVGl0bGUiKSBpbmxpbmUgbGluay4KKworICAgIFtUaGlzIGxpbmtdKGh0dHA6Ly9leGFtcGxlLm5ldC8pIGhhcyBubyB0aXRsZSBhdHRyaWJ1dGUuCisKK1dpbGwgcHJvZHVjZToKKworICAgIDxwPlRoaXMgaXMgPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUuY29tLyIgdGl0bGU9IlRpdGxlIj4KKyAgICBhbiBleGFtcGxlPC9hPiBpbmxpbmUgbGluay48L3A+CisKKyAgICA8cD48YSBocmVmPSJodHRwOi8vZXhhbXBsZS5uZXQvIj5UaGlzIGxpbms8L2E+IGhhcyBubworICAgIHRpdGxlIGF0dHJpYnV0ZS48L3A+CisKK0lmIHlvdSdyZSByZWZlcnJpbmcgdG8gYSBsb2NhbCByZXNvdXJjZSBvbiB0aGUgc2FtZSBzZXJ2ZXIsIHlvdSBjYW4KK3VzZSByZWxhdGl2ZSBwYXRoczoKKworICAgIFNlZSBteSBbQWJvdXRdKC9hYm91dC8pIHBhZ2UgZm9yIGRldGFpbHMuCisKK1JlZmVyZW5jZS1zdHlsZSBsaW5rcyB1c2UgYSBzZWNvbmQgc2V0IG9mIHNxdWFyZSBicmFja2V0cywgaW5zaWRlCit3aGljaCB5b3UgcGxhY2UgYSBsYWJlbCBvZiB5b3VyIGNob29zaW5nIHRvIGlkZW50aWZ5IHRoZSBsaW5rOgorCisgICAgVGhpcyBpcyBbYW4gZXhhbXBsZV1baWRdIHJlZmVyZW5jZS1zdHlsZSBsaW5rLgorCitZb3UgY2FuIG9wdGlvbmFsbHkgdXNlIGEgc3BhY2UgdG8gc2VwYXJhdGUgdGhlIHNldHMgb2YgYnJhY2tldHM6CisKKyAgICBUaGlzIGlzIFthbiBleGFtcGxlXSBbaWRdIHJlZmVyZW5jZS1zdHlsZSBsaW5rLgorCitUaGVuLCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQsIHlvdSBkZWZpbmUgeW91ciBsaW5rIGxhYmVsIGxpa2UgdGhpcywKK29uIGEgbGluZSBieSBpdHNlbGY6CisKKyAgICBbaWRdOiBodHRwOi8vZXhhbXBsZS5jb20vICAiT3B0aW9uYWwgVGl0bGUgSGVyZSIKKworVGhhdCBpczoKKworKiAgIFNxdWFyZSBicmFja2V0cyBjb250YWluaW5nIHRoZSBsaW5rIGlkZW50aWZpZXIgKG9wdGlvbmFsbHkKKyAgICBpbmRlbnRlZCBmcm9tIHRoZSBsZWZ0IG1hcmdpbiB1c2luZyB1cCB0byB0aHJlZSBzcGFjZXMpOworKiAgIGZvbGxvd2VkIGJ5IGEgY29sb247CisqICAgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgc3BhY2VzIChvciB0YWJzKTsKKyogICBmb2xsb3dlZCBieSB0aGUgVVJMIGZvciB0aGUgbGluazsKKyogICBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgdGl0bGUgYXR0cmlidXRlIGZvciB0aGUgbGluaywgZW5jbG9zZWQKKyAgICBpbiBkb3VibGUgb3Igc2luZ2xlIHF1b3Rlcy4KKworVGhlIGxpbmsgVVJMIG1heSwgb3B0aW9uYWxseSwgYmUgc3Vycm91bmRlZCBieSBhbmdsZSBicmFja2V0czoKKworICAgIFtpZF06IDxodHRwOi8vZXhhbXBsZS5jb20vPiAgIk9wdGlvbmFsIFRpdGxlIEhlcmUiCisKK1lvdSBjYW4gcHV0IHRoZSB0aXRsZSBhdHRyaWJ1dGUgb24gdGhlIG5leHQgbGluZSBhbmQgdXNlIGV4dHJhIHNwYWNlcworb3IgdGFicyBmb3IgcGFkZGluZywgd2hpY2ggdGVuZHMgdG8gbG9vayBiZXR0ZXIgd2l0aCBsb25nZXIgVVJMczoKKworICAgIFtpZF06IGh0dHA6Ly9leGFtcGxlLmNvbS9sb25naXNoL3BhdGgvdG8vcmVzb3VyY2UvaGVyZQorICAgICAgICAiT3B0aW9uYWwgVGl0bGUgSGVyZSIKKworTGluayBkZWZpbml0aW9ucyBhcmUgb25seSB1c2VkIGZvciBjcmVhdGluZyBsaW5rcyBkdXJpbmcgTWFya2Rvd24KK3Byb2Nlc3NpbmcsIGFuZCBhcmUgc3RyaXBwZWQgZnJvbSB5b3VyIGRvY3VtZW50IGluIHRoZSBIVE1MIG91dHB1dC4KKworTGluayBkZWZpbml0aW9uIG5hbWVzIG1heSBjb25zdGlzdCBvZiBsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGFuZCBwdW5jdHVhdGlvbiAtLSBidXQgdGhleSBhcmUgKm5vdCogY2FzZSBzZW5zaXRpdmUuIEUuZy4gdGhlc2UgdHdvIGxpbmtzOgorCisJW2xpbmsgdGV4dF1bYV0KKwlbbGluayB0ZXh0XVtBXQorCithcmUgZXF1aXZhbGVudC4KKworVGhlICppbXBsaWNpdCBsaW5rIG5hbWUqIHNob3J0Y3V0IGFsbG93cyB5b3UgdG8gb21pdCB0aGUgbmFtZSBvZiB0aGUKK2xpbmssIGluIHdoaWNoIGNhc2UgdGhlIGxpbmsgdGV4dCBpdHNlbGYgaXMgdXNlZCBhcyB0aGUgbmFtZS4KK0p1c3QgdXNlIGFuIGVtcHR5IHNldCBvZiBzcXVhcmUgYnJhY2tldHMgLS0gZS5nLiwgdG8gbGluayB0aGUgd29yZAorIkdvb2dsZSIgdG8gdGhlIGdvb2dsZS5jb20gd2ViIHNpdGUsIHlvdSBjb3VsZCBzaW1wbHkgd3JpdGU6CisKKwlbR29vZ2xlXVtdCisKK0FuZCB0aGVuIGRlZmluZSB0aGUgbGluazoKKworCVtHb29nbGVdOiBodHRwOi8vZ29vZ2xlLmNvbS8KKworQmVjYXVzZSBsaW5rIG5hbWVzIG1heSBjb250YWluIHNwYWNlcywgdGhpcyBzaG9ydGN1dCBldmVuIHdvcmtzIGZvcgorbXVsdGlwbGUgd29yZHMgaW4gdGhlIGxpbmsgdGV4dDoKKworCVZpc2l0IFtEYXJpbmcgRmlyZWJhbGxdW10gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0FuZCB0aGVuIGRlZmluZSB0aGUgbGluazoKKwkKKwlbRGFyaW5nIEZpcmViYWxsXTogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC8KKworTGluayBkZWZpbml0aW9ucyBjYW4gYmUgcGxhY2VkIGFueXdoZXJlIGluIHlvdXIgTWFya2Rvd24gZG9jdW1lbnQuIEkKK3RlbmQgdG8gcHV0IHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCBwYXJhZ3JhcGggaW4gd2hpY2ggdGhleSdyZQordXNlZCwgYnV0IGlmIHlvdSB3YW50LCB5b3UgY2FuIHB1dCB0aGVtIGFsbCBhdCB0aGUgZW5kIG9mIHlvdXIKK2RvY3VtZW50LCBzb3J0IG9mIGxpa2UgZm9vdG5vdGVzLgorCitIZXJlJ3MgYW4gZXhhbXBsZSBvZiByZWZlcmVuY2UgbGlua3MgaW4gYWN0aW9uOgorCisgICAgSSBnZXQgMTAgdGltZXMgbW9yZSB0cmFmZmljIGZyb20gW0dvb2dsZV0gWzFdIHRoYW4gZnJvbQorICAgIFtZYWhvb10gWzJdIG9yIFtNU05dIFszXS4KKworICAgICAgWzFdOiBodHRwOi8vZ29vZ2xlLmNvbS8gICAgICAgICJHb29nbGUiCisgICAgICBbMl06IGh0dHA6Ly9zZWFyY2gueWFob28uY29tLyAgIllhaG9vIFNlYXJjaCIKKyAgICAgIFszXTogaHR0cDovL3NlYXJjaC5tc24uY29tLyAgICAiTVNOIFNlYXJjaCIKKworVXNpbmcgdGhlIGltcGxpY2l0IGxpbmsgbmFtZSBzaG9ydGN1dCwgeW91IGNvdWxkIGluc3RlYWQgd3JpdGU6CisKKyAgICBJIGdldCAxMCB0aW1lcyBtb3JlIHRyYWZmaWMgZnJvbSBbR29vZ2xlXVtdIHRoYW4gZnJvbQorICAgIFtZYWhvb11bXSBvciBbTVNOXVtdLgorCisgICAgICBbZ29vZ2xlXTogaHR0cDovL2dvb2dsZS5jb20vICAgICAgICAiR29vZ2xlIgorICAgICAgW3lhaG9vXTogIGh0dHA6Ly9zZWFyY2gueWFob28uY29tLyAgIllhaG9vIFNlYXJjaCIKKyAgICAgIFttc25dOiAgICBodHRwOi8vc2VhcmNoLm1zbi5jb20vICAgICJNU04gU2VhcmNoIgorCitCb3RoIG9mIHRoZSBhYm92ZSBleGFtcGxlcyB3aWxsIHByb2R1Y2UgdGhlIGZvbGxvd2luZyBIVE1MIG91dHB1dDoKKworICAgIDxwPkkgZ2V0IDEwIHRpbWVzIG1vcmUgdHJhZmZpYyBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9nb29nbGUuY29tLyIKKyAgICB0aXRsZT0iR29vZ2xlIj5Hb29nbGU8L2E+IHRoYW4gZnJvbQorICAgIDxhIGhyZWY9Imh0dHA6Ly9zZWFyY2gueWFob28uY29tLyIgdGl0bGU9IllhaG9vIFNlYXJjaCI+WWFob288L2E+CisgICAgb3IgPGEgaHJlZj0iaHR0cDovL3NlYXJjaC5tc24uY29tLyIgdGl0bGU9Ik1TTiBTZWFyY2giPk1TTjwvYT4uPC9wPgorCitGb3IgY29tcGFyaXNvbiwgaGVyZSBpcyB0aGUgc2FtZSBwYXJhZ3JhcGggd3JpdHRlbiB1c2luZworTWFya2Rvd24ncyBpbmxpbmUgbGluayBzdHlsZToKKworICAgIEkgZ2V0IDEwIHRpbWVzIG1vcmUgdHJhZmZpYyBmcm9tIFtHb29nbGVdKGh0dHA6Ly9nb29nbGUuY29tLyAiR29vZ2xlIikKKyAgICB0aGFuIGZyb20gW1lhaG9vXShodHRwOi8vc2VhcmNoLnlhaG9vLmNvbS8gIllhaG9vIFNlYXJjaCIpIG9yCisgICAgW01TTl0oaHR0cDovL3NlYXJjaC5tc24uY29tLyAiTVNOIFNlYXJjaCIpLgorCitUaGUgcG9pbnQgb2YgcmVmZXJlbmNlLXN0eWxlIGxpbmtzIGlzIG5vdCB0aGF0IHRoZXkncmUgZWFzaWVyIHRvCit3cml0ZS4gVGhlIHBvaW50IGlzIHRoYXQgd2l0aCByZWZlcmVuY2Utc3R5bGUgbGlua3MsIHlvdXIgZG9jdW1lbnQKK3NvdXJjZSBpcyB2YXN0bHkgbW9yZSByZWFkYWJsZS4gQ29tcGFyZSB0aGUgYWJvdmUgZXhhbXBsZXM6IHVzaW5nCityZWZlcmVuY2Utc3R5bGUgbGlua3MsIHRoZSBwYXJhZ3JhcGggaXRzZWxmIGlzIG9ubHkgODEgY2hhcmFjdGVycworbG9uZzsgd2l0aCBpbmxpbmUtc3R5bGUgbGlua3MsIGl0J3MgMTc2IGNoYXJhY3RlcnM7IGFuZCBhcyByYXcgSFRNTCwKK2l0J3MgMjM0IGNoYXJhY3RlcnMuIEluIHRoZSByYXcgSFRNTCwgdGhlcmUncyBtb3JlIG1hcmt1cCB0aGFuIHRoZXJlCitpcyB0ZXh0LgorCitXaXRoIE1hcmtkb3duJ3MgcmVmZXJlbmNlLXN0eWxlIGxpbmtzLCBhIHNvdXJjZSBkb2N1bWVudCBtdWNoIG1vcmUKK2Nsb3NlbHkgcmVzZW1ibGVzIHRoZSBmaW5hbCBvdXRwdXQsIGFzIHJlbmRlcmVkIGluIGEgYnJvd3Nlci4gQnkKK2FsbG93aW5nIHlvdSB0byBtb3ZlIHRoZSBtYXJrdXAtcmVsYXRlZCBtZXRhZGF0YSBvdXQgb2YgdGhlIHBhcmFncmFwaCwKK3lvdSBjYW4gYWRkIGxpbmtzIHdpdGhvdXQgaW50ZXJydXB0aW5nIHRoZSBuYXJyYXRpdmUgZmxvdyBvZiB5b3VyCitwcm9zZS4KKworCis8aDMgaWQ9ImVtIj5FbXBoYXNpczwvaDM+CisKK01hcmtkb3duIHRyZWF0cyBhc3Rlcmlza3MgKGAqYCkgYW5kIHVuZGVyc2NvcmVzIChgX2ApIGFzIGluZGljYXRvcnMgb2YKK2VtcGhhc2lzLiBUZXh0IHdyYXBwZWQgd2l0aCBvbmUgYCpgIG9yIGBfYCB3aWxsIGJlIHdyYXBwZWQgd2l0aCBhbgorSFRNTCBgPGVtPmAgdGFnOyBkb3VibGUgYCpgJ3Mgb3IgYF9gJ3Mgd2lsbCBiZSB3cmFwcGVkIHdpdGggYW4gSFRNTAorYDxzdHJvbmc+YCB0YWcuIEUuZy4sIHRoaXMgaW5wdXQ6CisKKyAgICAqc2luZ2xlIGFzdGVyaXNrcyoKKworICAgIF9zaW5nbGUgdW5kZXJzY29yZXNfCisKKyAgICAqKmRvdWJsZSBhc3Rlcmlza3MqKgorCisgICAgX19kb3VibGUgdW5kZXJzY29yZXNfXworCit3aWxsIHByb2R1Y2U6CisKKyAgICA8ZW0+c2luZ2xlIGFzdGVyaXNrczwvZW0+CisKKyAgICA8ZW0+c2luZ2xlIHVuZGVyc2NvcmVzPC9lbT4KKworICAgIDxzdHJvbmc+ZG91YmxlIGFzdGVyaXNrczwvc3Ryb25nPgorCisgICAgPHN0cm9uZz5kb3VibGUgdW5kZXJzY29yZXM8L3N0cm9uZz4KKworWW91IGNhbiB1c2Ugd2hpY2hldmVyIHN0eWxlIHlvdSBwcmVmZXI7IHRoZSBsb25lIHJlc3RyaWN0aW9uIGlzIHRoYXQKK3RoZSBzYW1lIGNoYXJhY3RlciBtdXN0IGJlIHVzZWQgdG8gb3BlbiBhbmQgY2xvc2UgYW4gZW1waGFzaXMgc3Bhbi4KKworRW1waGFzaXMgY2FuIGJlIHVzZWQgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQ6CisKKyAgICB1bipmdWNraW5nKmJlbGlldmFibGUKKworQnV0IGlmIHlvdSBzdXJyb3VuZCBhbiBgKmAgb3IgYF9gIHdpdGggc3BhY2VzLCBpdCdsbCBiZSB0cmVhdGVkIGFzIGEKK2xpdGVyYWwgYXN0ZXJpc2sgb3IgdW5kZXJzY29yZS4KKworVG8gcHJvZHVjZSBhIGxpdGVyYWwgYXN0ZXJpc2sgb3IgdW5kZXJzY29yZSBhdCBhIHBvc2l0aW9uIHdoZXJlIGl0Cit3b3VsZCBvdGhlcndpc2UgYmUgdXNlZCBhcyBhbiBlbXBoYXNpcyBkZWxpbWl0ZXIsIHlvdSBjYW4gYmFja3NsYXNoCitlc2NhcGUgaXQ6CisKKyAgICBcKnRoaXMgdGV4dCBpcyBzdXJyb3VuZGVkIGJ5IGxpdGVyYWwgYXN0ZXJpc2tzXCoKKworCisKKzxoMyBpZD0iY29kZSI+Q29kZTwvaDM+CisKK1RvIGluZGljYXRlIGEgc3BhbiBvZiBjb2RlLCB3cmFwIGl0IHdpdGggYmFja3RpY2sgcXVvdGVzIChgYCBgIGBgKS4KK1VubGlrZSBhIHByZS1mb3JtYXR0ZWQgY29kZSBibG9jaywgYSBjb2RlIHNwYW4gaW5kaWNhdGVzIGNvZGUgd2l0aGluIGEKK25vcm1hbCBwYXJhZ3JhcGguIEZvciBleGFtcGxlOgorCisgICAgVXNlIHRoZSBgcHJpbnRmKClgIGZ1bmN0aW9uLgorCit3aWxsIHByb2R1Y2U6CisKKyAgICA8cD5Vc2UgdGhlIDxjb2RlPnByaW50ZigpPC9jb2RlPiBmdW5jdGlvbi48L3A+CisKK1RvIGluY2x1ZGUgYSBsaXRlcmFsIGJhY2t0aWNrIGNoYXJhY3RlciB3aXRoaW4gYSBjb2RlIHNwYW4sIHlvdSBjYW4gdXNlCittdWx0aXBsZSBiYWNrdGlja3MgYXMgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVyczoKKworICAgIGBgVGhlcmUgaXMgYSBsaXRlcmFsIGJhY2t0aWNrIChgKSBoZXJlLmBgCisKK3doaWNoIHdpbGwgcHJvZHVjZSB0aGlzOgorCisgICAgPHA+PGNvZGU+VGhlcmUgaXMgYSBsaXRlcmFsIGJhY2t0aWNrIChgKSBoZXJlLjwvY29kZT48L3A+CisKK1RoZSBiYWNrdGljayBkZWxpbWl0ZXJzIHN1cnJvdW5kaW5nIGEgY29kZSBzcGFuIG1heSBpbmNsdWRlIHNwYWNlcyAtLQorb25lIGFmdGVyIHRoZSBvcGVuaW5nLCBvbmUgYmVmb3JlIHRoZSBjbG9zaW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gcGxhY2UKK2xpdGVyYWwgYmFja3RpY2sgY2hhcmFjdGVycyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBhIGNvZGUgc3BhbjoKKworCUEgc2luZ2xlIGJhY2t0aWNrIGluIGEgY29kZSBzcGFuOiBgYCBgIGBgCisJCisJQSBiYWNrdGljay1kZWxpbWl0ZWQgc3RyaW5nIGluIGEgY29kZSBzcGFuOiBgYCBgZm9vYCBgYAorCit3aWxsIHByb2R1Y2U6CisKKwk8cD5BIHNpbmdsZSBiYWNrdGljayBpbiBhIGNvZGUgc3BhbjogPGNvZGU+YDwvY29kZT48L3A+CisJCisJPHA+QSBiYWNrdGljay1kZWxpbWl0ZWQgc3RyaW5nIGluIGEgY29kZSBzcGFuOiA8Y29kZT5gZm9vYDwvY29kZT48L3A+CisKK1dpdGggYSBjb2RlIHNwYW4sIGFtcGVyc2FuZHMgYW5kIGFuZ2xlIGJyYWNrZXRzIGFyZSBlbmNvZGVkIGFzIEhUTUwKK2VudGl0aWVzIGF1dG9tYXRpY2FsbHksIHdoaWNoIG1ha2VzIGl0IGVhc3kgdG8gaW5jbHVkZSBleGFtcGxlIEhUTUwKK3RhZ3MuIE1hcmtkb3duIHdpbGwgdHVybiB0aGlzOgorCisgICAgUGxlYXNlIGRvbid0IHVzZSBhbnkgYDxibGluaz5gIHRhZ3MuCisKK2ludG86CisKKyAgICA8cD5QbGVhc2UgZG9uJ3QgdXNlIGFueSA8Y29kZT4mbHQ7YmxpbmsmZ3Q7PC9jb2RlPiB0YWdzLjwvcD4KKworWW91IGNhbiB3cml0ZSB0aGlzOgorCisgICAgYCYjODIxMjtgIGlzIHRoZSBkZWNpbWFsLWVuY29kZWQgZXF1aXZhbGVudCBvZiBgJm1kYXNoO2AuCisKK3RvIHByb2R1Y2U6CisKKyAgICA8cD48Y29kZT4mYW1wOyM4MjEyOzwvY29kZT4gaXMgdGhlIGRlY2ltYWwtZW5jb2RlZAorICAgIGVxdWl2YWxlbnQgb2YgPGNvZGU+JmFtcDttZGFzaDs8L2NvZGU+LjwvcD4KKworCisKKzxoMyBpZD0iaW1nIj5JbWFnZXM8L2gzPgorCitBZG1pdHRlZGx5LCBpdCdzIGZhaXJseSBkaWZmaWN1bHQgdG8gZGV2aXNlIGEgIm5hdHVyYWwiIHN5bnRheCBmb3IKK3BsYWNpbmcgaW1hZ2VzIGludG8gYSBwbGFpbiB0ZXh0IGRvY3VtZW50IGZvcm1hdC4KKworTWFya2Rvd24gdXNlcyBhbiBpbWFnZSBzeW50YXggdGhhdCBpcyBpbnRlbmRlZCB0byByZXNlbWJsZSB0aGUgc3ludGF4Citmb3IgbGlua3MsIGFsbG93aW5nIGZvciB0d28gc3R5bGVzOiAqaW5saW5lKiBhbmQgKnJlZmVyZW5jZSouCisKK0lubGluZSBpbWFnZSBzeW50YXggbG9va3MgbGlrZSB0aGlzOgorCisgICAgIVtBbHQgdGV4dF0oL3BhdGgvdG8vaW1nLmpwZykKKworICAgICFbQWx0IHRleHRdKC9wYXRoL3RvL2ltZy5qcGcgIk9wdGlvbmFsIHRpdGxlIikKKworVGhhdCBpczoKKworKiAgIEFuIGV4Y2xhbWF0aW9uIG1hcms6IGAhYDsKKyogICBmb2xsb3dlZCBieSBhIHNldCBvZiBzcXVhcmUgYnJhY2tldHMsIGNvbnRhaW5pbmcgdGhlIGBhbHRgCisgICAgYXR0cmlidXRlIHRleHQgZm9yIHRoZSBpbWFnZTsKKyogICBmb2xsb3dlZCBieSBhIHNldCBvZiBwYXJlbnRoZXNlcywgY29udGFpbmluZyB0aGUgVVJMIG9yIHBhdGggdG8KKyAgICB0aGUgaW1hZ2UsIGFuZCBhbiBvcHRpb25hbCBgdGl0bGVgIGF0dHJpYnV0ZSBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICBvciBzaW5nbGUgcXVvdGVzLgorCitSZWZlcmVuY2Utc3R5bGUgaW1hZ2Ugc3ludGF4IGxvb2tzIGxpa2UgdGhpczoKKworICAgICFbQWx0IHRleHRdW2lkXQorCitXaGVyZSAiaWQiIGlzIHRoZSBuYW1lIG9mIGEgZGVmaW5lZCBpbWFnZSByZWZlcmVuY2UuIEltYWdlIHJlZmVyZW5jZXMKK2FyZSBkZWZpbmVkIHVzaW5nIHN5bnRheCBpZGVudGljYWwgdG8gbGluayByZWZlcmVuY2VzOgorCisgICAgW2lkXTogdXJsL3RvL2ltYWdlICAiT3B0aW9uYWwgdGl0bGUgYXR0cmlidXRlIgorCitBcyBvZiB0aGlzIHdyaXRpbmcsIE1hcmtkb3duIGhhcyBubyBzeW50YXggZm9yIHNwZWNpZnlpbmcgdGhlCitkaW1lbnNpb25zIG9mIGFuIGltYWdlOyBpZiB0aGlzIGlzIGltcG9ydGFudCB0byB5b3UsIHlvdSBjYW4gc2ltcGx5Cit1c2UgcmVndWxhciBIVE1MIGA8aW1nPmAgdGFncy4KKworCisqICogKgorCisKKzxoMiBpZD0ibWlzYyI+TWlzY2VsbGFuZW91czwvaDI+CisKKzxoMyBpZD0iYXV0b2xpbmsiPkF1dG9tYXRpYyBMaW5rczwvaDM+CisKK01hcmtkb3duIHN1cHBvcnRzIGEgc2hvcnRjdXQgc3R5bGUgZm9yIGNyZWF0aW5nICJhdXRvbWF0aWMiIGxpbmtzIGZvciBVUkxzIGFuZCBlbWFpbCBhZGRyZXNzZXM6IHNpbXBseSBzdXJyb3VuZCB0aGUgVVJMIG9yIGVtYWlsIGFkZHJlc3Mgd2l0aCBhbmdsZSBicmFja2V0cy4gV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgaWYgeW91IHdhbnQgdG8gc2hvdyB0aGUgYWN0dWFsIHRleHQgb2YgYSBVUkwgb3IgZW1haWwgYWRkcmVzcywgYW5kIGFsc28gaGF2ZSBpdCBiZSBhIGNsaWNrYWJsZSBsaW5rLCB5b3UgY2FuIGRvIHRoaXM6CisKKyAgICA8aHR0cDovL2V4YW1wbGUuY29tLz4KKyAgICAKK01hcmtkb3duIHdpbGwgdHVybiB0aGlzIGludG86CisKKyAgICA8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5jb20vIj5odHRwOi8vZXhhbXBsZS5jb20vPC9hPgorCitBdXRvbWF0aWMgbGlua3MgZm9yIGVtYWlsIGFkZHJlc3NlcyB3b3JrIHNpbWlsYXJseSwgZXhjZXB0IHRoYXQKK01hcmtkb3duIHdpbGwgYWxzbyBwZXJmb3JtIGEgYml0IG9mIHJhbmRvbWl6ZWQgZGVjaW1hbCBhbmQgaGV4CitlbnRpdHktZW5jb2RpbmcgdG8gaGVscCBvYnNjdXJlIHlvdXIgYWRkcmVzcyBmcm9tIGFkZHJlc3MtaGFydmVzdGluZworc3BhbWJvdHMuIEZvciBleGFtcGxlLCBNYXJrZG93biB3aWxsIHR1cm4gdGhpczoKKworICAgIDxhZGRyZXNzQGV4YW1wbGUuY29tPgorCitpbnRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKKyAgICA8YSBocmVmPSImI3g2RDsmI3g2MTtpJiN4NkM7JiN4NzQ7JiN4NkY7OiYjeDYxOyYjeDY0OyYjeDY0OyYjeDcyOyYjeDY1OworICAgICYjMTE1OyYjMTE1OyYjNjQ7JiMxMDE7JiMxMjA7JiN4NjE7JiMxMDk7JiN4NzA7JiN4NkM7ZSYjeDJFOyYjOTk7JiMxMTE7CisgICAgJiMxMDk7Ij4mI3g2MTsmI3g2NDsmI3g2NDsmI3g3MjsmI3g2NTsmIzExNTsmIzExNTsmIzY0OyYjMTAxOyYjMTIwOyYjeDYxOworICAgICYjMTA5OyYjeDcwOyYjeDZDO2UmI3gyRTsmIzk5OyYjMTExOyYjMTA5OzwvYT4KKword2hpY2ggd2lsbCByZW5kZXIgaW4gYSBicm93c2VyIGFzIGEgY2xpY2thYmxlIGxpbmsgdG8gImFkZHJlc3NAZXhhbXBsZS5jb20iLgorCisoVGhpcyBzb3J0IG9mIGVudGl0eS1lbmNvZGluZyB0cmljayB3aWxsIGluZGVlZCBmb29sIG1hbnksIGlmIG5vdAorbW9zdCwgYWRkcmVzcy1oYXJ2ZXN0aW5nIGJvdHMsIGJ1dCBpdCBkZWZpbml0ZWx5IHdvbid0IGZvb2wgYWxsIG9mCit0aGVtLiBJdCdzIGJldHRlciB0aGFuIG5vdGhpbmcsIGJ1dCBhbiBhZGRyZXNzIHB1Ymxpc2hlZCBpbiB0aGlzIHdheQord2lsbCBwcm9iYWJseSBldmVudHVhbGx5IHN0YXJ0IHJlY2VpdmluZyBzcGFtLikKKworCisKKzxoMyBpZD0iYmFja3NsYXNoIj5CYWNrc2xhc2ggRXNjYXBlczwvaDM+CisKK01hcmtkb3duIGFsbG93cyB5b3UgdG8gdXNlIGJhY2tzbGFzaCBlc2NhcGVzIHRvIGdlbmVyYXRlIGxpdGVyYWwKK2NoYXJhY3RlcnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIE1hcmtkb3duJ3MKK2Zvcm1hdHRpbmcgc3ludGF4LiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBzdXJyb3VuZCBhIHdvcmQgd2l0aAorbGl0ZXJhbCBhc3Rlcmlza3MgKGluc3RlYWQgb2YgYW4gSFRNTCBgPGVtPmAgdGFnKSwgeW91IGNhbiBiYWNrc2xhc2hlcworYmVmb3JlIHRoZSBhc3Rlcmlza3MsIGxpa2UgdGhpczoKKworICAgIFwqbGl0ZXJhbCBhc3Rlcmlza3NcKgorCitNYXJrZG93biBwcm92aWRlcyBiYWNrc2xhc2ggZXNjYXBlcyBmb3IgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgorCisgICAgXCAgIGJhY2tzbGFzaAorICAgIGAgICBiYWNrdGljaworICAgICogICBhc3RlcmlzaworICAgIF8gICB1bmRlcnNjb3JlCisgICAge30gIGN1cmx5IGJyYWNlcworICAgIFtdICBzcXVhcmUgYnJhY2tldHMKKyAgICAoKSAgcGFyZW50aGVzZXMKKyAgICAjICAgaGFzaCBtYXJrCisJKwlwbHVzIHNpZ24KKwktCW1pbnVzIHNpZ24gKGh5cGhlbikKKyAgICAuICAgZG90CisgICAgISAgIGV4Y2xhbWF0aW9uIG1hcmsKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2JlbmNobWFyay90ZXN0aW5nLnNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2JlbmNobWFyay90ZXN0aW5nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4M2FmYzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvYmVuY2htYXJrL3Rlc3Rpbmcuc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL2Jhc2gKKworc291cmNlIH4vLnByb2ZpbGUKKworQ09NTUFORD0iJEAiCitpZiBbWyAteiAiJENPTU1BTkQiIF1dOyB0aGVuIENPTU1BTkQ9InJha2UgdGVzdCI7IGZpCisKK2ZvciBWRVJTSU9OIGluIGBydm0gbGlzdCBzdHJpbmdzIHwgc29ydGA7IGRvCisJcnZtICRWRVJTSU9OCisJZWNobyAkKHJ1YnkgLXYpCisJUlVCWU9QVD0tcnVieWdlbXMgJENPTU1BTkQKK2RvbmUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9iZW5jaG1hcmsvdGltaW5nLnNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2JlbmNobWFyay90aW1pbmcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmMwMDlhMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9iZW5jaG1hcmsvdGltaW5nLnNoCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9iYXNoCisKK3NvdXJjZSB+Ly5iYXNocmMKKworZm9yIFZFUlNJT04gaW4gYHJ2bSBsaXN0IHN0cmluZ3MgfCBzb3J0YDsgZG8KKwlydm0gJFZFUlNJT04KKwllY2hvICQocnVieSAtdikKKwlydWJ5IC1JbGliIGJpbi9rcmFtZG93biA8IGJlbmNobWFyay9tZHN5bnRheC50ZXh0IDI+L2Rldi9udWxsID4vZGV2L251bGwKKwl0aW1lIHJ1YnkgLUlsaWIgYmluL2tyYW1kb3duIDwgYmVuY2htYXJrL21kc3ludGF4LnRleHQgMj4vZGV2L251bGwgPi9kZXYvbnVsbAorZG9uZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2Jpbi9rcmFtZG93biBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9iaW4va3JhbWRvd24KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODIzYjI2YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9iaW4va3JhbWRvd24KQEAgLTAsMCArMSw2OSBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNSBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdvcHRwYXJzZScKK3JlcXVpcmUgJ2tyYW1kb3duJworCitvcHRpb25zID0ge30KK2Zvcm1hdCA9IFsnaHRtbCddCitPcHRpb25QYXJzZXIubmV3IGRvIHxvcHRzfAorICBvcHRzLmJhbm5lciA9ICJVc2FnZToga3JhbWRvd24gW29wdGlvbnNdIFtGSUxFIEZJTEUgLi4uXSIKKyAgb3B0cy5zdW1tYXJ5X2luZGVudCA9ICcgJyo0CisKKyAgb3B0cy5zZXBhcmF0b3IgIiIKKyAgb3B0cy5zZXBhcmF0b3IgIkNvbW1hbmQgbGluZSBvcHRpb25zOiIKKyAgb3B0cy5zZXBhcmF0b3IgIiIKKworICBvcHRzLm9uKCItaSIsICItLWlucHV0IEFSRyIsICJTcGVjaWZ5IHRoZSBpbnB1dCBmb3JtYXQ6IGtyYW1kb3duIChkZWZhdWx0KSwgIiBcCisgICAgICAgICAgImh0bWwsIEdGTSBvciBtYXJrZG93biIpIHt8dnwgb3B0aW9uc1s6aW5wdXRdID0gdn0KKyAgb3B0cy5vbigiLW8iLCAiLS1vdXRwdXQgQVJHIiwgQXJyYXksICJTcGVjaWZ5IG9uZSBvciBtb3JlIG91dHB1dCBmb3JtYXRzIHNlcGFyYXRlZCBieSBjb21tYXM6ICIgXAorICAgICAgICAgICJodG1sIChkZWZhdWx0KSwiLCAia3JhbWRvd24sIGxhdGV4LCBwZGYsIG1hbiBvciByZW1vdmVfaHRtbF90YWdzIikge3x2fCBmb3JtYXQgPSB2fQorCisgIG9wdHMub24oIi12IiwgIi0tdmVyc2lvbiIsICJTaG93IHRoZSB2ZXJzaW9uIG9mIGtyYW1kb3duIikgZG8KKyAgICBwdXRzIEtyYW1kb3duOjpWRVJTSU9OCisgICAgZXhpdAorICBlbmQKKyAgb3B0cy5vbigiLWgiLCAiLS1oZWxwIiwgIlNob3cgdGhlIGhlbHAiKSBkbworICAgIHB1dHMgb3B0cy5zdW1tYXJpemUoJycsIDUsIDcyKQorICAgIGV4aXQKKyAgZW5kCisKKyAgb3B0cy5zZXBhcmF0b3IgIiIKKyAgb3B0cy5zZXBhcmF0b3IgImtyYW1kb3duIG9wdGlvbnM6IgorICBvcHRzLnNlcGFyYXRvciAiIgorCisgIEtyYW1kb3duOjpPcHRpb25zLmRlZmluaXRpb25zLnNvcnQuZWFjaCBkbyB8biwgZGVmaW5pdGlvbnwKKyAgICBubyA9IG4udG9fcy50cignXycsICctJykKKyAgICBpZiBkZWZpbml0aW9uLnR5cGUgPT0gS3JhbWRvd246Ok9wdGlvbnM6OkJvb2xlYW4KKyAgICAgIG9wdHMub24oIi0tW25vLV0je25vfSIpIHt8dnwgb3B0aW9uc1tuXSA9IEtyYW1kb3duOjpPcHRpb25zLnBhcnNlKG4sIHYpfQorICAgIGVsc2UKKyAgICAgIHR5cGUgPSBkZWZpbml0aW9uLnR5cGUKKyAgICAgIHR5cGUgPSBTdHJpbmcgaWYgdHlwZSA9PSBTeW1ib2wgfHwgdHlwZSA9PSBPYmplY3QKKyAgICAgIG9wdHMub24oIi0tI3tub30gQVJHIiwgdHlwZSkge3x2fCBvcHRpb25zW25dID0gS3JhbWRvd246Ok9wdGlvbnMucGFyc2Uobiwgdil9CisgICAgZW5kCisKKyAgICBkZWZpbml0aW9uLmRlc2Muc3BsaXQoL1xuLykuZWFjaCBkbyB8bGluZXwKKyAgICAgIG9wdHMuc2VwYXJhdG9yIG9wdHMuc3VtbWFyeV9pbmRlbnQgKyAnICcqNiArIGxpbmUKKyAgICBlbmQKKyAgICBvcHRzLnNlcGFyYXRvciAnJworICBlbmQKKworZW5kLnBhcnNlIQorCitiZWdpbgorICBkb2MgPSBLcmFtZG93bjo6RG9jdW1lbnQubmV3KEFSR0YucmVhZCwgb3B0aW9ucykKKyAgcmVzdWx0ID0gJycKKyAgZm9ybWF0LmVhY2gge3xmfCByZXN1bHQgPSBkb2Muc2VuZCgidG9fI3tmfSIpfQorICBwdXRzIHJlc3VsdAorICBkb2Mud2FybmluZ3MuZWFjaCB7fHdhcm58ICRzdGRlcnIucHV0cyAiV2FybmluZzogI3t3YXJufSJ9CityZXNjdWUgS3JhbWRvd246OkVycm9yID0+IGUKKyAgJHN0ZGVyci5wdXRzICJFcnJvcjogI3tlLm1lc3NhZ2V9IgorICBleGl0KDEpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kYXRhL2tyYW1kb3duL2RvY3VtZW50Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZGF0YS9rcmFtZG93bi9kb2N1bWVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMWQwZWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZGF0YS9rcmFtZG93bi9kb2N1bWVudC5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDwlIGlmIEBjb252ZXJ0ZXIucm9vdC5vcHRpb25zWzplbmNvZGluZ10gJT4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PTwlPSBAY29udmVydGVyLnJvb3Qub3B0aW9uc1s6ZW5jb2RpbmddICU+Ij4KKyAgICA8JSBlbmQgJT4KKzwlCitleHRlbmQgOjpLcmFtZG93bjo6VXRpbHM6Okh0bWwKK3RpdGxlID0gJycKK2ggPSBAY29udmVydGVyLnJvb3QuY2hpbGRyZW4uZmluZCB7fGN8IGMudHlwZSA9PSA6aGVhZGVyfQoraWYgaAorICBjb2xsZWN0b3IgPSBsYW1iZGEge3xjfCBjLmNoaWxkcmVuLmNvbGxlY3Qge3xjY3wgY2MudHlwZSA9PSA6dGV4dCA/IGVzY2FwZV9odG1sKGNjLnZhbHVlLCA6dGV4dCkgOiBjb2xsZWN0b3IuY2FsbChjYyl9LmpvaW4oJycpfQorICB0aXRsZSA9IGNvbGxlY3Rvci5jYWxsKGgpCitlbmQKKyU+CisgICAgPHRpdGxlPjwlPSB0aXRsZSAlPjwvdGl0bGU+CisgICAgPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJrcmFtZG93biA8JT0gOjpLcmFtZG93bjo6VkVSU0lPTiAlPiIgLz4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgPCU9IEBib2R5ICU+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kYXRhL2tyYW1kb3duL2RvY3VtZW50LmxhdGV4IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RhdGEva3JhbWRvd24vZG9jdW1lbnQubGF0ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkZjM0NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kYXRhL2tyYW1kb3duL2RvY3VtZW50LmxhdGV4CkBAIC0wLDAgKzEsNTAgQEAKKzwlCitlbmNtYXAgPSB7CisgICdVVEYtOCcgPT4gJ3V0Zjh4JywKKyAgJ1VTLUFTQ0lJJyA9PiAnYXNjaWknLAorICAnSVNPLTg4NTktMScgPT4gJ2xhdGluMScsCisgICdJU08tODg1OS0yJyA9PiAnbGF0aW4yJywKKyAgJ0lTTy04ODU5LTMnID0+ICdsYXRpbjMnLAorICAnSVNPLTg4NTktNCcgPT4gJ2xhdGluNCcsCisgICdJU08tODg1OS01JyA9PiAnbGF0aW41JywKKyAgJ0lTTy04ODU5LTknID0+ICdsYXRpbjknLAorICAnSVNPLTg4NTktMTAnID0+ICdsYXRpbjEwJywKKyAgJ0NQODUwJyA9PiAnY3A4NTAnLAorICAnQ1A4NTInID0+ICdjcDg1MicsCisgICdDUDg1OCcgPT4gJ2NwODU4JywKKyAgJ0NQNDM3JyA9PiAnY3A0MzcnLAorICAnQ1A4NjUnID0+ICdjcDg2NScsCisgICdDUDEyNTAnID0+ICdjcDEyMCcsCisgICdDUDEyNTInID0+ICdjcDEyNTInLAorICAnQ1AxMjU3JyA9PiAnY3AxMjU3JworfQorJT4KK1xkb2N1bWVudGNsYXNze3NjcmFydGNsfQorPCUgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknICU+CitcdXNlcGFja2FnZVs8JT0gZW5jbWFwW0Bib2R5LmVuY29kaW5nLm5hbWVdICU+XXtpbnB1dGVuY30KKzwlIGVsc2UgJT4KK1x1c2VwYWNrYWdlW21hdGhsZXR0ZXJzXXt1Y3N9CitcdXNlcGFja2FnZVt1dGY4eF17aW5wdXRlbmN9Cis8JSBlbmQgJT4KK1x1c2VwYWNrYWdlW1QxXXtmb250ZW5jfQorXHVzZXBhY2thZ2V7bGlzdGluZ3N9Cis8JSBAY29udmVydGVyLmRhdGFbOnBhY2thZ2VzXS5lYWNoIHt8cGtnfCAlPlx1c2VwYWNrYWdlezwlPSBwa2cgJT59Cis8JSB9ICU+CitcdXNlcGFja2FnZXtoeXBlcnJlZn0KKworPCUgaWYgQGNvbnZlcnRlci5kYXRhWzpwYWNrYWdlc10uaW5jbHVkZT8oJ2ZhbmN5dnJiJykgJT4KK1xWZXJiYXRpbUZvb3Rub3RlcworPCUgZW5kICU+CisKKzwlIGlmIEBjb252ZXJ0ZXIuZGF0YVs6cGFja2FnZXNdLmluY2x1ZGU/KCdhY3JvbnltJykgJT4KKzwlICAgQGNvbnZlcnRlci5yb290Lm9wdGlvbnNbOmFiYnJldl9kZWZzXS5lYWNoX3BhaXIgZG8gfGssdnwgJT5cYWNyb2RlZns8JT0gQGNvbnZlcnRlci5ub3JtYWxpemVfYWJicmV2aWF0aW9uX2tleShrKSAlPn1bPCU9IGsgJT5dezwlPSBAY29udmVydGVyLmVzY2FwZSh2KSAlPn0KKzwlICAgZW5kICU+Cis8JSBlbmQgJT4KKworXHNldGNvdW50ZXJ7Zm9vdG5vdGV9ezwlPSBAY29udmVydGVyLm9wdGlvbnNbOmZvb3Rub3RlX25yXSAtIDEgJT59CisKK1xoeXBlcnNldHVwe2NvbG9ybGlua3M9dHJ1ZSx1cmxjb2xvcj1ibHVlfQorCitcYmVnaW57ZG9jdW1lbnR9Cis8JT0gQGJvZHkgJT4KK1xlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL19kZXNpZ24uc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvX2Rlc2lnbi5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDJmZTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL19kZXNpZ24uc2NzcwpAQCAtMCwwICsxLDQ0MSBAQAorLyogIEJhc2VkIG9uIHRoZSBMZXNzIEZyYW1ld29yayA0CisgICAgaHR0cDovL2xlc3NmcmFtZXdvcmsuY29tCisgICAgYnkgSm9uaSBLb3JwaQorICAgIExpY2Vuc2U6IGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAgKi8KKworCisvKioqKiogVmFyaWFibGVzIGZvciBlYXN5IGN1c3RvbWl6YXRpb24gKioqKiovCisKKy8qIHRoZSBiYXNlbGluZSBoZWlnaHQgaW4gcHggKi8KKyRiYXNlbGluZS1oZWlnaHQ6IDI0OworCisvKiBUaGUgb3ZlcmxheSBjb2xvciBmb3IgdGhlIGJhY2tncm91bmQgaW1hZ2UgKi8KKyRiZy1ncmFkLWNvbG9yOiByZ2JhKDI1NSwyNTUsMTI4LDAuMSk7CisKKy8qIFRoZSBmb250IHNpemUgb2YgdGhlIGxvZ28gaW4gcHggKi8KKyRsb2dvLXNpemU6IDM2OworCisvKiBDb2xvciBzZXR0aW5ncyAqLworJGxpbmstY29sb3I6ICMxNjY2QTM7CisKKworCisvKiAgUmVzZXRzCisgICAgLS0tLS0tICAqLworCitodG1sLCBib2R5LCBkaXYsIHNwYW4sIG9iamVjdCwgaWZyYW1lLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LAorcCwgYmxvY2txdW90ZSwgcHJlLCBhLCBhYmJyLCBhZGRyZXNzLCBjaXRlLCBjb2RlLCBkZWwsIGRmbiwgZW0sCitpbWcsIGlucywga2JkLCBxLCBzYW1wLCBzbWFsbCwgc3Ryb25nLCBzdWIsIHN1cCwgdmFyLCBiLCBpLCBociwKK2RsLCBkdCwgZGQsIG9sLCB1bCwgbGksIGZpZWxkc2V0LCBmb3JtLCBsYWJlbCwgbGVnZW5kLAordGFibGUsIGNhcHRpb24sIHRib2R5LCB0Zm9vdCwgdGhlYWQsIHRyLCB0aCwgdGQsCithcnRpY2xlLCBhc2lkZSwgY2FudmFzLCBkZXRhaWxzLCBmaWd1cmUsIGZpZ2NhcHRpb24sIGhncm91cCwKK21lbnUsIGZvb3RlciwgaGVhZGVyLCBuYXYsIHNlY3Rpb24sIHN1bW1hcnksIHRpbWUsIG1hcmssIGF1ZGlvLCB2aWRlbyB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgYm9yZGVyOiAwOworfQorCithcnRpY2xlLCBhc2lkZSwgY2FudmFzLCBmaWd1cmUsIGZpZ3VyZSBpbWcsIGZpZ2NhcHRpb24sIGhncm91cCwKK2Zvb3RlciwgaGVhZGVyLCBuYXYsIHNlY3Rpb24sIGF1ZGlvLCB2aWRlbyB7CisgICAgZGlzcGxheTogYmxvY2s7Cit9CisKK2EgaW1nIHtib3JkZXI6IDA7fQorCisKKworLyogIFR5cG9ncmFwaHkgcHJlc2V0cworICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAgKi8KKworLmdpZ2FudGljIHsKKyAgICBmb250LXNpemU6IDU5cHg7CisgICAgbGluZS1oZWlnaHQ6IDcycHg7Cit9CisKKy5odWdlIHsKKyAgICBmb250LXNpemU6IDM2cHg7CisgICAgbGluZS1oZWlnaHQ6IDQ4cHg7Cit9CisKKy5sYXJnZSB7CisgICAgZm9udC1zaXplOiAyM3B4OworICAgIGxpbmUtaGVpZ2h0OiAyNHB4OworfQorCisuYmlnZ2VyIHsKKyAgICBmb250LXNpemU6IDE4cHg7CisgICAgbGluZS1oZWlnaHQ6IDI0cHg7Cit9CisKKy5iaWcgeworICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgICBsaW5lLWhlaWdodDogMjRweDsKK30KKworYm9keSB7CisgICAgZm9udDogMTRweC8yNHB4ICdQYWxhdGlubyBMaW5vdHlwZScsICdCb29rIEFudGlxdWEnLCBQYWxhdGlubywgc2VyaWY7Cit9CisKKy5zbWFsbCwgc21hbGwgeworICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICBsaW5lLWhlaWdodDogMjRweDsKK30KKworKjp0YXJnZXQ6OmFmdGVyIHsKKyAgICBjb250ZW50OiAiIOKYnCI7Cit9CisKKworLyogVHlwb2dyYXBoaWNzIGdyaWQgb3ZlcmxheSAqLworCisuZ3JpZHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMCwwLDAsMCkgOTUlLCByZ2JhKDAsMCwwLDAuMykgMTAwJSk7IC8qIEZGMy42KyAqLworICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoOTUlLHJnYmEoMCwwLDAsMCkpLCBjb2xvci1zdG9wKDEwMCUscmdiYSgwLDAsMCwwLjMpKSk7IC8qIENocm9tZSxTYWZhcmk0KyAqLworICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgwLDAsMCwwKSA5NSUscmdiYSgwLDAsMCwwLjMpIDEwMCUpOyAvKiBDaHJvbWUxMCssU2FmYXJpNS4xKyAqLworICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMCwwLDAsMCkgOTUlLCByZ2JhKDAsMCwwLDAuMykgMTAwJSk7IC8qIE9wZXJhMTEuMTArICovCisgICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMCwwLDAsMCkgOTUlLHJnYmEoMCwwLDAsMC4zKSAxMDAlKTsgLyogSUUxMCsgKi8KKyAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDAsMCwwLDAuMykgOTUlLHJnYmEoMCwwLDAsMC4zKSAxMDAlKTsgLyogVzNDICovCisKKyAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMTAwJSAjeyRiYXNlbGluZS1oZWlnaHR9cHg7CisgICAgICAgICAtby1iYWNrZ3JvdW5kLXNpemU6IDEwMCUgI3skYmFzZWxpbmUtaGVpZ2h0fXB4OworICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxMDAlICN7JGJhc2VsaW5lLWhlaWdodH1weDsKK30KKworCisvKiBCYXNpYyBtaXhpbnMgKi8KKworQG1peGluIGJhY2tncm91bmQgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KCRiZy1ncmFkLWNvbG9yLCAkYmctZ3JhZC1jb2xvciksIHVybCgnYmcucG5nJyk7CisgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoJGJnLWdyYWQtY29sb3IsICRiZy1ncmFkLWNvbG9yKSwgdXJsKCdiZy5wbmcnKTsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoJGJnLWdyYWQtY29sb3IsICRiZy1ncmFkLWNvbG9yKSwgdXJsKCdiZy5wbmcnKTsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KCRiZy1ncmFkLWNvbG9yLCAkYmctZ3JhZC1jb2xvciksIHVybCgnYmcucG5nJyk7CisgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCRiZy1ncmFkLWNvbG9yLCAkYmctZ3JhZC1jb2xvciksIHVybCgnYmcucG5nJyk7Cit9CisKK0BtaXhpbiB0eXBvZ3JhcGh5KCRzaXplOiBiaWcpIHsKKyAgICBoMywgaDQsIGg1LCBoNiwgcCwgdWwsIG9sLCBkbCwgcHJlLCBibG9ja3F1b3RlLCB0YWJsZSB7CisgICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CisgICAgfQorCisgICAgQGlmICRzaXplID09IGJpZyB7CisgICAgICAgIGgxIHsgQGV4dGVuZCAuaHVnZSB9CisgICAgICAgIGgyIHsgQGV4dGVuZCAubGFyZ2UgfQorICAgICAgICBoMyB7IEBleHRlbmQgLmJpZ2dlciB9CisgICAgICAgIGg0LGg1LGg2IHsgQGV4dGVuZCAuYmlnIH0KKyAgICB9IEBlbHNlIHsKKyAgICAgICAgaDEgeyBAZXh0ZW5kIC5sYXJnZSB9CisgICAgICAgIGgyIHsgQGV4dGVuZCAuYmlnZ2VyIH0KKyAgICAgICAgaDMsaDQsaDUsaDYgeyBAZXh0ZW5kIC5iaWcgfQorICAgIH0KKworICAgIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYgeworICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgICAgICBwYWRkaW5nLWxlZnQ6IDQ4cHg7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAtNDhweDsKKyAgICAgICAgbWFyZ2luLXRvcDogMzZweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogLTEycHg7CisgICAgfQorCisgICAgdWwsIG9sLCBkZCB7CisgICAgICAgIHBhZGRpbmctbGVmdDogMjRweDsKKyAgICB9CisKKyAgICB1bCB1bCwgdWwgb2wsIG9sIHVsLCBvbCBvbCB7CisgICAgICAgIG1hcmdpbi10b3A6IDA7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgfQorCisgICAgcHJlIHsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAxMnB4OworICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICAgICAgICBmb250LWZhbWlseTogIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsIENvbnNvbGFzLCBtb25vc3BhY2U7CisgICAgfQorCisgICAgZHQgeworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICB9CisKKyAgICBhIHsKKyAgICAgICAgY29sb3I6ICRsaW5rLWNvbG9yOworICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgICB9CisKKyAgICBhOmhvdmVyLCBhOmxpbmsgeworICAgICAgICBjb2xvcjogJGxpbmstY29sb3IgLyAyOworICAgIH0KK30KKworLyogICAgICBEZWZhdWx0IExheW91dDogOTkycHguCisgICAgICAgIEd1dHRlcnM6IDI0cHguCisgICAgICAgIE91dGVyIG1hcmdpbnM6IDQ4cHguCisgICAgICAgIExlZnRvdmVyIHNwYWNlIGZvciBzY3JvbGxiYXJzIEAxMDI0cHg6IDMycHguCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgY29scyAgICAxICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcgICAgICA4ICAgICAgOSAgICAgIDEwCisgICAgICAgIHB4ICAgICAgNjggICAgMTYwICAgIDI1MiAgICAzNDQgICAgNDM2ICAgIDUyOCAgICA2MjAgICAgNzEyICAgIDgwNCAgICA4OTYgICAgKi8KKworYm9keSB7CisgICAgd2lkdGg6IDk5MnB4OworICAgIG1hcmdpbjogMCBhdXRvIDQ4cHg7CisgICAgY29sb3I6IHJnYig2MCw2MCw2MCk7CisgICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiBTdG9wcyBNb2JpbGUgU2FmYXJpIGZyb20gYXV0by1hZGp1c3RpbmcgZm9udC1zaXplcyAqLworICAgIEBpbmNsdWRlIGJhY2tncm91bmQ7Cit9CisKK2JvZHkgPiBoZWFkZXIgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBwYWRkaW5nOiAxMnB4OworICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hOworICAgIGNvbG9yOiAjZWVlOworICAgIC1tb3otYm94LXNoYWRvdzogICAgIDAgMCAyNHB4IHJnYmEoMCwwLDAsMC42KTsKKyAgICAtd2Via2l0LWJveC1zaGFkb3c6ICAwIDAgMjRweCByZ2JhKDAsMCwwLDAuNik7CisgICAgYm94LXNoYWRvdzogICAgICAgICAgMCAwIDI0cHggcmdiYSgwLDAsMCwwLjYpOworICAgIHotaW5kZXg6IDE7Cit9CisKKyNsb2dvIHsKKyAgICBmb250LXNpemU6ICN7JGxvZ28tc2l6ZX1weDsKKyAgICBsaW5lLWhlaWdodDogICN7JGJhc2VsaW5lLWhlaWdodCAqIChmbG9vcigkbG9nby1zaXplIC8gJGJhc2VsaW5lLWhlaWdodCkgKyAxKX1weDsKKyAgICBtYXJnaW46IDEycHg7CisgICAgdGV4dC1zaGFkb3c6IDBweCAycHggNXB4IHJnYmEoMCwgMCwgMCwgMC41KTsKKworICAgIGEgeworICAgICAgICBjb2xvcjogI2VlZTsKKyAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworCisgICAgICAgICY6aG92ZXIgeworICAgICAgICAgICAgY29sb3I6ICNmZmY7CisgICAgICAgIH0KKyAgICB9CisKK30KKworI3Nsb2dhbiB7CisgICAgZm9udC1zaXplOiAxMDAlOworICAgIG1hcmdpbjogMTJweDsKKyAgICB0ZXh0LXNoYWRvdzogMHB4IDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjUpOworfQorCituYXYgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBib3R0b206IDBweDsKKyAgICByaWdodDogMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC4xKTsKKworICAgIGxpIHsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIH0KKworICAgIHVsIHsKKyAgICAgICAgbWFyZ2luOiAwOworICAgICAgICBwYWRkaW5nOiAwOworICAgIH0KKworICAgIGEsIHNwYW4geworICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgcGFkZGluZzogMTJweDsKKyAgICAgICAgY29sb3I6ICNjY2M7CisgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICB9CisKKyAgICBzcGFuIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjMpOworICAgIH0KKworICAgIGE6aG92ZXIgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMyk7CisgICAgfQorCit9CisKKyN3cmFwcGVyIHsKKyAgICBjbGVhcjogYm90aDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisgICAgLW1vei1ib3gtc2hhZG93OiAgICAgMCAwIDI0cHggcmdiYSgwLDAsMCwwLjYpOworICAgIC13ZWJraXQtYm94LXNoYWRvdzogIDAgMCAyNHB4IHJnYmEoMCwwLDAsMC42KTsKKyAgICBib3gtc2hhZG93OiAgICAgICAgICAwIDAgMjRweCByZ2JhKDAsMCwwLDAuNik7Cit9CisKK2FzaWRlIHsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgcmlnaHQ6IDA7CisgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisgICAgd2lkdGg6IDI1MnB4OworICAgIHBhZGRpbmc6IDI0cHg7CisKKyAgICBAaW5jbHVkZSB0eXBvZ3JhcGh5KHNtYWxsKTsKKworICAgIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYgeworICAgICAgICBwYWRkaW5nLWxlZnQ6IDQ4cHg7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAtNDhweDsKKyAgICB9Cit9CisKKworYXNpZGUuYmFubmVyIHsKKyAgICBAaW5jbHVkZSBiYWNrZ3JvdW5kOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB3aWR0aDogaW5oZXJpdDsKKyAgICBtYXJnaW46IDA7CisgICAgZmxvYXQ6IG5vbmU7CisgICAgcGFkZGluZzogMjRweDsKKyAgICBib3JkZXI6IDEwcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEpOworICAgIGNvbG9yOiAjY2NjOworICAgIGZvbnQtc2l6ZTogMzZweDsKKyAgICBsaW5lLWhlaWdodDogNDhweDsKKworICAgIGEgeworICAgICAgICBjb2xvcjogI2NjYzsKKyAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgICAgfQorCisgICAgYTpob3ZlciB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC4zKTsKKyAgICB9CisKKyAgICBwIHsKKyAgICAgICAgbWFyZ2luOiAwOworICAgIH0KKworICAgIHAgKyBwIHsKKyAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKKyAgICB9Cit9CisKKyNjb250ZW50IHsKKyAgICB3aWR0aDogNjIwcHg7CisgICAgcGFkZGluZzogMjRweCA0OHB4OworCisgICAgQGluY2x1ZGUgdHlwb2dyYXBoeShiaWcpOworfQorCitmb290ZXIgeworICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjEpOworICAgbWluLWhlaWdodDogMjRweDsKKyAgIGNvbG9yOiAjZWVlOworfQorCisKKy8qICAgICAgVGFibGV0IExheW91dDogNzY4cHguCisgICAgICAgIEd1dHRlcnM6IDI0cHguCisgICAgICAgIE91dGVyIG1hcmdpbnM6IDI4cHguCisgICAgICAgIEluaGVyaXRzIHN0eWxlcyBmcm9tOiBEZWZhdWx0IExheW91dC4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgY29scyAgICAxICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcgICAgICA4CisgICAgICAgIHB4ICAgICAgNjggICAgMTYwICAgIDI1MiAgICAzNDQgICAgNDM2ICAgIDUyOCAgICA2MjAgICAgNzEyICAgICovCisKK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIGFuZCAobWF4LXdpZHRoOiAxMDA1cHgpIHsKKworICAgIGJvZHkgeworICAgICAgICB3aWR0aDogNzE2cHg7CisgICAgfQorCisgICAgYm9keSA+IGhlYWRlciB7CisgICAgICAgIHBhZGRpbmc6IDA7CisgICAgfQorCisgICAgYXNpZGUgeworICAgICAgICBwb3NpdGlvbjogc3RhdGljOworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgfQorCisgICAgbmF2IHsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OworICAgIH0KK30KKworCisKKy8qICAgICAgTW9iaWxlIExheW91dDogMzIwcHguCisgICAgICAgIEd1dHRlcnM6IDI0cHguCisgICAgICAgIE91dGVyIG1hcmdpbnM6IDM0cHguCisgICAgICAgIEluaGVyaXRzIHN0eWxlcyBmcm9tOiBEZWZhdWx0IExheW91dC4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGNvbHMgICAgMSAgICAgMiAgICAgIDMKKyAgICAgICAgcHggICAgICA2OCAgICAxNjAgICAgMjUyICAgICovCisKK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsKKworICAgIGJvZHkgeworICAgICAgICB3aWR0aDogMzIwcHg7CisgICAgfQorCisgICAgYm9keSA+IGhlYWRlciB7CisgICAgICAgIHBhZGRpbmc6IDA7CisgICAgfQorCisgICAgbmF2IHsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OworICAgIH0KKworICAgIGFzaWRlIHsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIH0KKworICAgICNjb250ZW50LCBhc2lkZSB7CisgICAgICAgIHdpZHRoOiAyOTZweDsKKyAgICAgICAgcGFkZGluZzogMjRweCAxMnB4OworICAgIH0KKworICAgICNjb250ZW50IHsKKyAgICAgICAgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7CisgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDEycHg7CisgICAgICAgICAgICBtYXJnaW4tbGVmdDogLTEycHg7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisKKy8qICAgICAgV2lkZSBNb2JpbGUgTGF5b3V0OiA0ODBweC4KKyAgICAgICAgR3V0dGVyczogMjRweC4KKyAgICAgICAgT3V0ZXIgbWFyZ2luczogMjJweC4KKyAgICAgICAgSW5oZXJpdHMgc3R5bGVzIGZyb206IERlZmF1bHQgTGF5b3V0LCBNb2JpbGUgTGF5b3V0LgorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgY29scyAgICAxICAgICAyICAgICAgMyAgICAgIDQgICAgICA1CisgICAgICAgIHB4ICAgICAgNjggICAgMTYwICAgIDI1MiAgICAzNDQgICAgNDM2ICAgICovCisKK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDgwcHgpIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeworCisgICAgYm9keSB7CisgICAgICAgIHdpZHRoOiA5MCU7CisgICAgfQorCisgICAgYXNpZGUgeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgfQorCisgICAgI2NvbnRlbnQsIGFzaWRlIHsKKyAgICAgICAgd2lkdGg6IGluaGVyaXQ7CisgICAgICAgIHBhZGRpbmc6IDI0cHggNDhweDsKKyAgICB9CisKKyAgICAjY29udGVudCB7CisgICAgICAgIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYgeworICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiA0OHB4OworICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IC00OHB4OworICAgICAgICB9CisgICAgfQorCit9CisKKworLyogIFJldGluYSBtZWRpYSBxdWVyeS4KKyAgICBPdmVycmlkZXMgc3R5bGVzIGZvciBkZXZpY2VzIHdpdGggYQorICAgIGRldmljZS1waXhlbC1yYXRpbyBvZiAyKywgc3VjaCBhcyBpUGhvbmUgNC4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAqLworCitAbWVkaWEKK29ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwKK29ubHkgc2NyZWVuIGFuZCAobWluLWRldmljZS1waXhlbC1yYXRpbzogMikgeworCisgICAgYm9keSB7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvYmcucG5nIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9iZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZjEzNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvYmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvZGVmYXVsdC5zY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9kZWZhdWx0LnNjc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2ZGNhNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvZGVmYXVsdC5zY3NzCkBAIC0wLDAgKzEsMjE3IEBACitAaW1wb3J0ICdkZXNpZ24nOworCithOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuMSk7Cit9CisKK2FzaWRlLmJhbm5lciB7CisgICAgZm9udC1zaXplOiAxOHB4OworICAgIGxpbmUtaGVpZ2h0OiAyN3B4OworfQorCithc2lkZSBhIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisKKyAgICAmOmhvdmVyLCAmOmxpbmsgeworICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgICB9CisKK30KKworI2NvbnRlbnQgeworICAgIGJsb2NrcXVvdGUuaW5mb3JtYXRpb24geworICAgICAgICBib3JkZXItbGVmdDogMTJweCBzb2xpZCAjMDgwOworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmZiOworICAgICAgICBwYWRkaW5nOiAxMnB4IDEycHggMTJweCAwOworICAgICAgICBtYXJnaW4tbGVmdDogLTQ4cHg7CisgICAgICAgIHBhZGRpbmctbGVmdDogNDhweDsKKyAgICB9CisKKyAgICBibG9ja3F1b3RlLm1hcmtkb3duLWRpZmZlcmVuY2UgeworICAgICAgICBib3JkZXItbGVmdDogMTJweCBzb2xpZCAjZGMwOworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhOworICAgICAgICBwYWRkaW5nOiAxMnB4IDEycHggMTJweCAwOworICAgICAgICBtYXJnaW4tbGVmdDogLTQ4cHg7CisgICAgICAgIHBhZGRpbmctbGVmdDogNDhweDsKKworICAgICAgICAmOmJlZm9yZSB7CisgICAgICAgICAgICBjb250ZW50OiAiRGlmZmVyZW5jZSB0byBTdGFuZGFyZCBNYXJrZG93biI7CisgICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICB9CisgICAgfQorCisgICAgYmxvY2txdW90ZSBwcmUgeworICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgfQorCisgICAgdGFibGUgeworICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgICAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvOworICAgICAgICB3aWR0aDogMTAwJTsKKworICAgICAgICB0ZCwgdGggeworICAgICAgICAgICAgcGFkZGluZzogM3B4IDVweDsKKyAgICAgICAgfQorICAgICAgICB0aCB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDgwOworICAgICAgICAgICAgY29sb3I6IHdoaXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJlLnNob3ctd2hpdGVzcGFjZXMgLndzLXNwYWNlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDsKKyAgICB9CisgICAgcHJlLnNob3ctd2hpdGVzcGFjZXMgLndzLXNwYWNlLWwgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjIyOworICAgIH0KKyAgICBwcmUuc2hvdy13aGl0ZXNwYWNlcyAud3Mtc3BhY2UtciB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMDA7CisgICAgfQorICAgIHByZS5zaG93LXdoaXRlc3BhY2VzIC53cy10YWIgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY0OworICAgIH0KKyAgICBwcmUuc2hvdy13aGl0ZXNwYWNlcyAud3MtdGFiLWwgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYyOworICAgIH0KKyAgICBwcmUuc2hvdy13aGl0ZXNwYWNlcyAud3MtdGFiLXIgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwOworICAgIH0KKyAgICBwcmUuc2hvdy13aGl0ZXNwYWNlcy53cy1sciAud3MtdGFiIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKKyAgICB9CisgICAgcHJlLnNob3ctd2hpdGVzcGFjZXMud3MtbHIgLndzLXNwYWNlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKKyAgICAgICAgb3BhY2l0eTogMDsKKyAgICB9CisKKyAgICB0YWJsZS5rZGV4YW1wbGUgdGQgeworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIH0KKworICAgIHRhYmxlLmtkZXhhbXBsZSBwcmUgeworICAgICAgICBtYXJnaW46IDVweCAwcHg7CisgICAgfQorCisgICAgLmtkZXhhbXBsZTpob3ZlciAua2RleGFtcGxlLWFmdGVyLXNvdXJjZSB7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgIH0KKworICAgIC5rZGV4YW1wbGUtYWZ0ZXItc291cmNlIHsKKyAgICAgICAgZGlzcGxheTogbm9uZTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZlZTsKKyAgICAgICAgYm9yZGVyOiAycHggc29saWQgI2U2ZThlOTsKKyAgICAgICAgbWFyZ2luOiAwIDEwcHg7CisgICAgICAgIHBhZGRpbmc6IDVweDsKKyAgICB9CisKKyAgICAua2RleGFtcGxlLWFmdGVyLWxpdmUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVmZmVlOworICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjZTZlOGU5OworICAgICAgICBtYXJnaW46IDVweCAwcHggMTJweDsKKyAgICAgICAgcGFkZGluZzogNXB4OworICAgIH0KKworICAgIGRpdi5rZHN5bnRheGxpbmsgeworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdG9wOiAtMTdweDsKKyAgICAgICAgcGFkZGluZzogNXB4OworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTZlOGU5OworICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OworCisgICAgICAgIGEgeworICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgICB9CisgICAgfQorfQorCisubmV3cy1pdGVtIHsKKyAgICBib3JkZXItdG9wOiAycHggc29saWQgI2RkZDsKKyAgICBtYXJnaW4tdG9wOiA0NnB4OworfQorCisubmV3cy1kYXRlIHsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgbWFyZ2luLXRvcDogMnB4OworICAgIGZvbnQtc2l6ZTogc21hbGw7CisgICAgY29sb3I6ICM4ODg7Cit9CisKK2Zvb3RlciB7CisgICAgY2xlYXI6IGJvdGg7CisgICAgZm9udC1zaXplOiA5MiU7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKworICAgIGEgeworICAgICAgICBjb2xvcjogIzg5ODk4OTsKKworICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgICAgICAgIGNvbG9yOiAjNjY2OworICAgICAgICB9CisgICAgfQorfQorCisvKiBjb21tb24gcnVsZXMgKi8KK2Fjcm9ueW0geworICAgIGN1cnNvcjogaGVscDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzc3NzsKK30KKworLmZsb2F0LWxlZnQgeworICAgIGZsb2F0OiBsZWZ0OworfQorCisuZmxvYXQtcmlnaHQgeworICAgIGZsb2F0OiByaWdodDsKK30KKworLmEtbGVmdCwgdHIuYS1sZWZ0IHRkIHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisuYS1jZW50ZXIsIHRyLmEtY2VudGVyIHRkIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy5hLXJpZ2h0LCB0ci5hLXJpZ2h0IHRkIHsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKK30KKworLmNsZWFyIHsKKyAgICBjbGVhcjogYm90aDsKK30KKworLmlubGluZS1pbXBvcnRhbnQgeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworCisucGF0cmVvbiwgLnBhdHJlb246aG92ZXIgeworICAgIGJvcmRlci1yYWRpdXM6IDUwcHg7CisgICAgcGFkZGluZzogNXB4IDEwcHg7CisgICAgbWFyZ2luOiAwIDVweDsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2U2NDYxYSAhaW1wb3J0YW50OworICAgIGJveC1zaGFkb3c6IDBweCAwcHggNXB4IDVweCAjZTY0NjFhOworICAgIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworCisgICAgJjpob3ZlciB7CisgICAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCA1cHggI2U2NDYxYTsKKyAgICB9Cit9CisKKyNjYWxsLXRvLWFybXMgeworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIG1hcmdpbjogNDBweCAwIDEwcHg7CisgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CisgIHBhZGRpbmc6IDMwcHg7CisgIGJvcmRlci1yYWRpdXM6IDEwMHB4OworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9kZWZhdWx0LnRlbXBsYXRlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9kZWZhdWx0LnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTlhM2YKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL2RlZmF1bHQudGVtcGxhdGUKQEAgLTAsMCArMSw2MiBAQAorPCFkb2N0eXBlIGh0bWw+Cis8aHRtbCB4bWw6bGFuZz0ie2xhbmc6fSIgbGFuZz0ie2xhbmc6fSI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iVGhvbWFzIExlaXRuZXIiIC8+CisgICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIiIC8+CisgICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9ImtyYW1kb3duIGlzIGEgZmFzdCwgcHVyZS1SdWJ5IE1hcmtkb3duLXN1cGVyc2V0IGNvbnZlcnRlciIgLz4KKyAgICA8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0icnVieSwga3JhbWRvd24sIG1hcmtkb3duLCB0ZXh0IG1hcmt1cCIgLz4KKyAgICA8bGluayBocmVmPSJ7cmVsb2NhdGFibGU6IGRlZmF1bHQuY3NzfSIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9InNjcmVlbixwcm9qZWN0aW9uIiAvPgorICAgIDxsaW5rIGhyZWY9IntyZWxvY2F0YWJsZTogbmV3cy5hdG9tfSIgdHlwZT0iYXBwbGljYXRpb24vYXRvbSt4bWwiIHJlbD0iYWx0ZXJuYXRlIiAvPgorICAgIDxzY3JpcHQgc3JjPSIvL2tyYW1kb3duLmdldHRhbG9uZy5vcmcvTWF0aEpheC9NYXRoSmF4LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgIDx0aXRsZT57dGl0bGU6fSB8IGtyYW1kb3duPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aGVhZGVyPgorICAgICAgPGhncm91cD4KKyAgICAgICAgPGgxIGlkPSJsb2dvIj48YSBocmVmPSJ7cmVsb2NhdGFibGU6IC99IiB0aXRsZT0iSG9tZXBhZ2UiPmtyYW1kb3duPC9hPjwvaDE+CisgICAgICAgIDxoMiBpZD0ic2xvZ2FuIj5mYXN0LCBwdXJlLVJ1YnkgTWFya2Rvd24tc3VwZXJzZXQgY29udmVydGVyPC9oMj4KKyAgICAgIDwvaGdyb3VwPgorCisgICAgICA8bmF2PgorICAgICAgICB7bWVudToge29wdGlvbnM6IHttaToge2luX21lbnU6IHRydWV9LCBzb3J0OiBzb3J0X2luZm8sIGZsYXR0ZW46IHRydWV9fX0KKyAgICAgIDwvbmF2PgorICAgIDwvaGVhZGVyPgorCisgICAgPGRpdiBpZD0id3JhcHBlciI+CisgICAgICA8JSBpZiBjb250ZXh0LmNvbnRlbnRfbm9kZS5ibG9ja3MuaGFzX2tleT8oJ2ludHJvJykgJT4KKyAgICAgIDxhc2lkZSBjbGFzcz0iYmFubmVyIj4KKyAgICAgICAgPHdlYmdlbjpibG9jayBuYW1lPSJpbnRybyIgbm9kZT0iZmlyc3QiIC8+CisgICAgICA8L2FzaWRlPgorICAgICAgPCUgZW5kICU+CisKKyAgICAgIDxhc2lkZT4KKyAgICAgICAgPHdlYmdlbjpibG9jayBuYW1lPSJzaWRlYmFyIiBub2RlPSJmaXJzdCIgbm90Zm91bmQ9Imlnbm9yZSIgLz4KKworICAgICAgICA8d2ViZ2VuOmJsb2NrIG5hbWU9ImNvbnRlbnQiIGNoYWluPSJzaWRlYmFyLnRlbXBsYXRlIiAvPgorICAgICAgPC9hc2lkZT4KKworICAgICAgPGRpdiBpZD0iY29udGVudCI+CisgICAgICAgIDx3ZWJnZW46YmxvY2sgbmFtZT0iY29udGVudCIgbm9kZT0iZmlyc3QiIC8+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgc3R5bGU9ImNsZWFyOmJvdGgiPjwvZGl2PgorICAgIDwvZGl2PgorCisgICAgPGZvb3Rlcj4KKyAgICAgIDxkaXYgY2xhc3M9ImZsb2F0LWxlZnQiPkNvcHlyaWdodCDCqSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXI8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImZsb2F0LXJpZ2h0Ij5HZW5lcmF0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL3dlYmdlbi5nZXR0YWxvbmcub3JnIj53ZWJnZW48L2E+PC9kaXY+CisgICAgPC9mb290ZXI+CisKKyAgICA8IS0tIFN0YXJ0IG9mIFN0YXRDb3VudGVyIENvZGUgZm9yIERlZmF1bHQgR3VpZGUgLS0+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgdmFyIHNjX3Byb2plY3Q9NDI2Nzg0NTsKKyAgICAgIHZhciBzY19pbnZpc2libGU9MTsKKyAgICAgIHZhciBzY19zZWN1cml0eT0iNDEzMjE0NTUiOworICAgICAgdmFyIHNjSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zZWN1cmUuIiA6ICJodHRwOi8vd3d3LiIpOworICAgICAgZG9jdW1lbnQud3JpdGUoIjxzYyIrInJpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzcmM9JyIgKyBzY0pzSG9zdCArICJzdGF0Y291bnRlci5jb20vY291bnRlci9jb3VudGVyLmpzJz48LyIgKyAic2NyaXB0PiIpOworICAgICA8L3NjcmlwdD4KKyAgICAgPG5vc2NyaXB0PjxkaXYgY2xhc3M9InN0YXRjb3VudGVyIj48YSB0aXRsZT0id2Vic2l0ZSBzdGF0aXN0aWNzIiBocmVmPSJodHRwOi8vc3RhdGNvdW50ZXIuY29tLyIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgY2xhc3M9InN0YXRjb3VudGVyIiBzcmM9Ii8vYy5zdGF0Y291bnRlci5jb20vNDI2Nzg0NS8wLzQxMzIxNDU1LzEvIiBhbHQ9IndlYnNpdGUgc3RhdGlzdGljcyIgLz48L2E+PC9kaXY+PC9ub3NjcmlwdD4KKyAgICAgPCEtLSBFbmQgb2YgU3RhdENvdW50ZXIgQ29kZSBmb3IgRGVmYXVsdCBHdWlkZSAtLT4KKworICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL2RvY3VtZW50YXRpb24ucGFnZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvZG9jdW1lbnRhdGlvbi5wYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWZhYWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL2RvY3VtZW50YXRpb24ucGFnZQpAQCAtMCwwICsxLDg0IEBACistLS0KK3RpdGxlOiBEb2N1bWVudGF0aW9uCitpbl9tZW51OiB0cnVlCitzb3J0X2luZm86IDcKKy0tLQorIyBrcmFtZG93biBEb2N1bWVudGF0aW9uCisKKyMjIE92ZXJ2aWV3CisKK2tyYW1kb3duIGlzIGZpcnN0IGFuZCBmb3JlbW9zdCBhIGxpYnJhcnkgZm9yIGNvbnZlcnRpbmcgdGV4dCB3cml0dGVuIGluIGEgc3VwZXJzZXQgb2YgTWFya2Rvd24gdG8KK0hUTUwuIEhvd2V2ZXIsIGR1ZSB0byBpdHMgbW9kdWxhciBhcmNoaXRlY3R1cmUgaXQgaXMgYWJsZSB0byBzdXBwb3J0IGFkZGl0aW9uYWwgaW5wdXQgYW5kIG91dHB1dAorZm9ybWF0cy4gVGhlIGZvbGxvd2luZyBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisKKyogSW5wdXQ6IFtrcmFtZG93bl0ocGFyc2VyL2tyYW1kb3duLmh0bWwpIChhIHN1cGVyc2V0IG9mIE1hcmtkb3duKSwKKyAgW01hcmtkb3duXShwYXJzZXIvbWFya2Rvd24uaHRtbCksIFtHaXRodWIgRmxhdm9yZWQgTWFya2Rvd25dKHBhcnNlci9nZm0uaHRtbCksIFtIVE1MXShwYXJzZXIvaHRtbC5odG1sKQorCisqIE91dHB1dDogW0hUTUxdKGNvbnZlcnRlci9odG1sLmh0bWwpLCBbTGFUZVhdKGNvbnZlcnRlci9sYXRleC5odG1sKSwKKyAgW2tyYW1kb3duXShjb252ZXJ0ZXIva3JhbWRvd24uaHRtbCksIFtSZW1vdmVIdG1sVGFnc10oY29udmVydGVyL3JlbW92ZV9odG1sX3RhZ3MuaHRtbCkgKGEgc3BlY2lhbAorICBjb252ZXJ0ZXIgd2hpY2ggcmVtb3ZlcyBIVE1MIHRhZ3MsIG5vcm1hbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgTGFUZVggb3Iga3JhbWRvd24KKyAgY29udmVydGVycykKKworVGhlIFtrcmFtZG93biBzeW50YXggcGFnZV0oc3ludGF4Lmh0bWwpIGRlc2NyaWJlcyBpbiBkZXRhaWwgd2hhdCBpcyBzdXBwb3J0ZWQgYW5kIGhvdyBpdCBkaWZmZXJzCitmcm9tIHN0YW5kYXJkIE1hcmtkb3duLgorCitGb3IgYWxsIGF2YWlsYWJsZSBvcHRpb25zIGhhdmUgYSBsb29rIGF0IHRoZSBbb3B0aW9ucyBkb2N1bWVudGF0aW9uXShvcHRpb25zLmh0bWwpIG9yIGhhdmUgYSBsb29rIGF0CithIHBhcnNlci9jb252ZXJ0ZXIgcGFnZSB0byBzZWUgd2hpY2ggb3B0aW9ucyB0aGV5IHN1cHBvcnQhCisKKworIyMgVXNhZ2UKKworezpydWJ5OiAubGFuZ3VhZ2UtcnVieX0KKworVGhlIGtyYW1kb3duIHBhY2thZ2UgcHJvdmlkZXMgdHdvIHdheXMgZm9yIHVzaW5nIGl0OgorCisqICoqQXMgYSBsaWJyYXJ5KioKKworICBrcmFtZG93biB1c2VzIGJhc2ljYWxseSB0aGUgc2FtZSBBUEkgYXMgW1JlZENsb3RoXSwgW0JsdWVDbG90aF0gYW5kIFtNYXJ1a3VdOgorCisgICAgICByZXF1aXJlICdrcmFtZG93bicKKworICAgICAgcHV0cyBLcmFtZG93bjo6RG9jdW1lbnQubmV3KHRleHQpLnRvX2h0bWwKKyAgezpydWJ5fQorCisgIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZSBgbmV3YCBjYWxsIGlzIGFuIG9wdGlvbnMgaGFzaCBmb3IgKGRlKWFjdGl2YXRpbmcgY2VydGFpbiBmZWF0dXJlcy4gRm9yCisgIGV4YW1wbGUsIHRvIGRpc2FibGUgYXV0b21hdGljIGhlYWRlciBJRCBnZW5lcmF0aW9uLCB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgIHB1dHMgS3JhbWRvd246OkRvY3VtZW50Lm5ldyh0ZXh0LCA6YXV0b19pZHMgPT4gZmFsc2UpLnRvX2h0bWwKKyAgezpydWJ5fQorCisgIFRoZSBkZWZhdWx0IHBhcnNlciB1c2VkIGlzIGBrcmFtZG93bmAsIGhvd2V2ZXIsIHlvdSBjYW4gc2VsZWN0IGEgZGlmZmVyZW50IG9uZSB3aXRoIHRoZSBgOmlucHV0YAorICBvcHRpb246CisKKyAgICAgIHB1dHMgS3JhbWRvd246OkRvY3VtZW50Lm5ldyh0ZXh0LCA6aW5wdXQgPT4gJ2h0bWwnKS50b19sYXRleAorICB7OnJ1Ynl9CisKKyAgWW91IGNhbiBhbHNvIHJldXNlIHRoZSBjcmVhdGVkIGRvY3VtZW50IG9iamVjdCB0byBwcm9kdWNlIG11bHRpcGxlIG91dHB1dHM6CisKKyAgICAgIGRvYyA9IEtyYW1kb3duOjpEb2N1bWVudC5uZXcodGV4dCwgOmlucHV0ID0+ICdodG1sJykKKyAgICAgIHB1dHMgZG9jLnRvX2h0bWwKKyAgICAgIHB1dHMgZG9jLnRvX2xhdGV4CisgIHs6cnVieX0KKworICBNb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2Ugb3IgZXh0ZW5kIGtyYW1kb3duIGNhbiBiZSBmb3VuZCBpbiB0aGUgW0FQSQorICBkb2N1bWVudGF0aW9uXShyZG9jL2luZGV4Lmh0bWwpIQorCisqICoqQXMgYW4gYXBwbGljYXRpb24qKgorCisgIFRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkgZmlsZXMgYSBiaW5hcnkgY2FsbGVkIGBrcmFtZG93bmAgaXMgc2hpcHBlZCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0CisgIHRleHQgaW4gYW55IHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQgdG8gYW55IHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0LiBJdCBlaXRoZXIgcmVhZHMgZnJvbSB0aGUgZmlsZXMKKyAgc3BlY2lmaWVkIGFzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIG9yIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LiBGb3IgZXhhbXBsZToKKworICAgICAga3JhbWRvd24gcGF0aC90by9rcmFtZG93bi9kb2Mvc3ludGF4LnBhZ2UKKworICBUaGUgaW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzIGFzIHdlbGwgYXMgYWxsIGF2YWlsYWJsZSBrcmFtZG93biBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgdGhyb3VnaAorICBjb21tYW5kIGxpbmUgc3dpdGNoZXMuCisKKworIyMgVGVzdHMKKwora3JhbWRvd24gdXNlcyB2YXJpb3VzIHRlc3Qgc3VpdGVzIHRvIHZlcmlmeSB0aGUgY29ycmVjdCB3b3JraW5nIG9mIHRoZSBwYXJzZXJzIGFuZCBjb252ZXJ0ZXJzLiBGb3IKK21vcmUgaW5mb3JtYXRpb24sIGhhdmUgYSBsb29rIGF0IHRoZSBbdGVzdHMgZG9jdW1lbnRdKHRlc3RzLmh0bWwpLgorCisKK3tpbmNsdWRlX2ZpbGU6IGRvYy9saW5rcy5tYXJrZG93bn0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvZG9jdW1lbnRhdGlvbi50ZW1wbGF0ZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvZG9jdW1lbnRhdGlvbi50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZjZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9kb2N1bWVudGF0aW9uLnRlbXBsYXRlCkBAIC0wLDAgKzEsMzQgQEAKKy0tLSBuYW1lOnNpZGViYXIgcGlwZWxpbmU6ZXJiLHRhZ3Msa3JhbWRvd24KKzxkaXYgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0Ij4KKzxhIGhyZWY9Imh0dHBzOi8vd3d3LnBhdHJlb24uY29tL2JlUGF0cm9uP3U9NDkwODk2MyIgY2xhc3M9InBhdHJlb24iPkJlY29tZSBhIFBhdHJvbiE8L2E+Cis8L2Rpdj4KKworPGgxPkRvY3VtZW50YXRpb248L2gxPgorCisqIFBhcnNlcnMKKyAgKiBba3JhbWRvd25dKHBhcnNlci9rcmFtZG93bi5odG1sKQorICAqIFtNYXJrZG93bl0ocGFyc2VyL21hcmtkb3duLmh0bWwpCisgICogW0dGTV0ocGFyc2VyL2dmbS5odG1sKQorICAqIFtIVE1MXShwYXJzZXIvaHRtbC5odG1sKQorKiBDb252ZXJ0ZXJzCisgICogW0hUTUxdKGNvbnZlcnRlci9odG1sLmh0bWwpCisgICogW0xhVGVYXShjb252ZXJ0ZXIvbGF0ZXguaHRtbCkKKyAgKiBbbWFuXShjb252ZXJ0ZXIvbWFuLmh0bWwpCisgICogW2tyYW1kb3duXShjb252ZXJ0ZXIva3JhbWRvd24uaHRtbCkKKyAgKiBbUmVtb3ZlSHRtbFRhZ3NdKGNvbnZlcnRlci9yZW1vdmVfaHRtbF90YWdzLmh0bWwpCisqIFN5bnRheCBIaWdobGlnaHRlcnMKKyAgKiBbQ29kZXJheV0oc3ludGF4X2hpZ2hsaWdodGVyL2NvZGVyYXkuaHRtbCkKKyAgKiBbUm91Z2VdKHN5bnRheF9oaWdobGlnaHRlci9yb3VnZS5odG1sKQorKiBNYXRoIEVuZ2luZXMKKyAgKiBbTWF0aEpheF0obWF0aF9lbmdpbmUvbWF0aGpheC5odG1sKQorICAqIFtSaXRleF0obWF0aF9lbmdpbmUvcml0ZXguaHRtbCkKKyAgKiBbaXRleDJNTUxdKG1hdGhfZW5naW5lL2l0ZXgybW1sLmh0bWwpCisgICogW01hdGhqYXgtTm9kZV0obWF0aF9lbmdpbmUvbWF0aGpheG5vZGUuaHRtbCkKKyogW0NvbmZpZ3VyYXRpb24gT3B0aW9uc10ob3B0aW9ucy5odG1sKQorKiBbVGVzdHNdKHRlc3RzLmh0bWwpCisKKzwlIGlmIGNvbnRleHQubm9kZS5jaGlsZHJlbi5maXJzdCAmJiBjb250ZXh0Lm5vZGUuY2hpbGRyZW4uZmlyc3QuY2hpbGRyZW4ubGVuZ3RoID4gMSAlPgorPGgxPkNvbnRlbnRzPC9oMT4KKzwlIGVuZCAlPgorCit7bWVudToge29wdGlvbnM6IHtkZXNjZW5kYW50czogdHJ1ZSwgbGV2ZWxzOiBbMyw2XX19fQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9pbmRleC5wYWdlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9pbmRleC5wYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjQ0NDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL2luZGV4LnBhZ2UKQEAgLTAsMCArMSwxMTMgQEAKKy0tLQordGl0bGU6IEhvbWUKK2luX21lbnU6IHRydWUKK3NvcnRfaW5mbzogMQorLS0tCisjIyBPdmVydmlldworCitJZiB5b3Ugd2FudCB0byBnZXQgc3RhcnRlZCB3aXRoIGtyYW1kb3duLCBoYXZlIGEgbG9vayBhdCB0aGUgW2luc3RhbGxhdGlvbiBwYWdlXShpbnN0YWxsYXRpb24uaHRtbCkKK3RvIHNlZSBob3cgeW91IGNhbiBpbnN0YWxsIGl0IG9uIHlvdXIgc3lzdGVtLiBUaGVuIGxvb2sgdGhyb3VnaCB0aGUKK1tkb2N1bWVudGF0aW9uXShkb2N1bWVudGF0aW9uLmh0bWwpIGZvciBmaW5kaW5nIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBhY3R1YWxseSB1c2Uga3JhbWRvd24gYW5kCitpdHMgcGFyc2Vycy9jb252ZXJ0ZXJzLiBUaGUgW3F1aWNrIHJlZmVyZW5jZV0ocXVpY2tyZWYuaHRtbCkgcHJvdmlkZXMgYSBvdmVydmlldyBvZiB0aGUgc3ludGF4IC0tIGlmCit5b3UgbmVlZCBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHN1cGVyc2V0IG9mIE1hcmtkb3duIHdoaWNoIGtyYW1kb3duIHN1cHBvcnRzIHRoZSBbc3ludGF4CitwYWdlXShzeW50YXguaHRtbCkgaXMgdGhlIHBsYWNlIHRvIGdvIQorCit7dGlrejo6CitwYXRoOiBvdmVydmlldy5wbmcKK2ltZ19hdHRyOiB7c3R5bGU6ICdiYWNrZ3JvdW5kOnRyYW5zcGFyZW50J30KK2NvbnRlbnRfcHJvY2Vzc29yLnRpa3oubGlicmFyaWVzOiBbbWluZG1hcCwgdHJlZXMsIGFycm93c10KK2NvbnRlbnRfcHJvY2Vzc29yLnRpa3oudHJhbnNwYXJlbnQ6IHRydWUKK2NvbnRlbnRfcHJvY2Vzc29yLnRpa3oucmVzb2x1dGlvbjogMzAwIDEwMAorY29udGVudF9wcm9jZXNzb3IudGlrei5vcHRzOiB8CisgIG1pbmRtYXAsIGNvbmNlcHQgY29sb3I9YmxhY2ssIHRleHQ9d2hpdGUsCisgIHJvb3QgY29uY2VwdC8uYXBwZW5kIHN0eWxlPXtmb250PVxMYXJnZX0sCisgIGxldmVsIDEgY29uY2VwdC8uYXBwZW5kIHN0eWxlPXtmb250PVxMYXJnZSwgbWluaW11bSBzaXplPTIuNmNtfSwKKyAgbGV2ZWwgMiBjb25jZXB0Ly5hcHBlbmQgc3R5bGU9e2ZvbnQ9XExhcmdlfSwKK30KK1xub2RlW2NvbmNlcHQsIGZvbnQ9XExhcmdlXSAobGliKSB7a3JhbWRvd24ncyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbn0KKyAgY2hpbGRbY29uY2VwdCBjb2xvcj1vcmFuZ2UsIGdyb3c9MTIwLCAtPl0ge25vZGVbY29uY2VwdF0gKGkta3JhbWRvd24pIHtrcmFtZG93bn19CisgIGNoaWxkW2NvbmNlcHQgY29sb3I9b3JhbmdlLCBncm93PTE2MF0ge25vZGVbY29uY2VwdF0gKGktaHRtbCkge0hUTUx9fQorICBjaGlsZFtjb25jZXB0IGNvbG9yPW9yYW5nZSwgZ3Jvdz0yMDBdIHtub2RlW2NvbmNlcHRdIChpLWdmbSkge0dGTX19CisgIGNoaWxkW2NvbmNlcHQgY29sb3I9b3JhbmdlLCBncm93PTI0MF0ge25vZGVbY29uY2VwdF0gKGktbWFya2Rvd24pIHtNYXJrZG93bn19CisgIGNoaWxkW2NvbmNlcHQgY29sb3I9Z3JlZW4hNTAhYmxhY2ssIGdyb3c9NjBdIHtub2RlW2NvbmNlcHRdIChvLWh0bWwpIHtIVE1MfX0KKyAgY2hpbGRbY29uY2VwdCBjb2xvcj1ncmVlbiE1MCFibGFjaywgZ3Jvdz0yMF0ge25vZGVbY29uY2VwdF0gKG8ta3JhbWRvd24pIHtrcmFtZG93bn19CisgIGNoaWxkW2NvbmNlcHQgY29sb3I9Z3JlZW4hNTAhYmxhY2ssIGdyb3c9LTIwXSB7CisgICAgbm9kZVtjb25jZXB0XSAoby1sYXRleCkge1xMYVRlWH0KKyAgICBjaGlsZFtncm93PTBdIHsKKyAgICAgIG5vZGVbY29uY2VwdF0gKG8tbGF0ZXgtcGRmKSB7UERGfQorICAgIH0KKyAgfQorICBjaGlsZFtjb25jZXB0IGNvbG9yPWdyZWVuITUwIWJsYWNrLCBncm93PS02MF0ge25vZGVbY29uY2VwdF0gKG8tcGRmKSB7UERGfX0KKzsKK1xkcmF3IFtkYXNoIHBhdHRlcm49b24gMHB0IG9mZiAycHQsbGluZSB3aWR0aD01cHQsYXJyb3dzPS1hbmdsZSA2MCxzaG9ydGVuID49MTVwdCxzaG9ydGVuIDw9MTBwdCxjb2xvcj1vcmFuZ2VdCisgICAoaS1rcmFtZG93bikgZWRnZShsaWIpCisgICAoaS1tYXJrZG93bikgZWRnZShsaWIpCisgICAoaS1odG1sKSBlZGdlIChsaWIpCisgICAoaS1nZm0pIGVkZ2UgKGxpYik7CitcZHJhdyBbZGFzaCBwYXR0ZXJuPW9uIDBwdCBvZmYgMnB0LGxpbmUgd2lkdGg9NXB0LGFycm93cz0tYW5nbGUgNjAsc2hvcnRlbiA+PTEwcHQsc2hvcnRlbiA8PTE1cHQsY29sb3I9Z3JlZW4hNTAhYmxhY2tdCisgICAobGliKSBlZGdlKG8taHRtbCkKKyAgIChsaWIpIGVkZ2UgKG8ta3JhbWRvd24pCisgICAobGliKSBlZGdlIChvLWxhdGV4KQorICAgKGxpYikgZWRnZSAoby1wZGYpOwore3Rpa3p9Cit7OiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIn0KKworCisjIyBCdWdzLCBGb3J1bXMsIE1haWxpbmcgTGlzdHMKKworSWYgeW91IGhhdmUgZm91bmQgYSBidWcsIHlvdSBzaG91bGQgW3JlcG9ydCBpdCBoZXJlXVtidWdfcmVwb3J0XS4gQWxzbywgdGhlcmUgaXMgdGhlIFtrcmFtZG93bi11c2VycworZ29vZ2xlIGdyb3VwXVttbF0gYXZhaWxhYmxlIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMhCisKK1tidWdfcmVwb3J0XTogaHR0cDovL2dpdGh1Yi5jb20vZ2V0dGFsb25nL2tyYW1kb3duL2lzc3VlcworW21sXTogaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIWZvcnVtL2tyYW1kb3duLXVzZXJzCisKKworIyMgVGhhbmtzCisKK2tyYW1kb3duIHdvdWxkIG5vdCBiZSBwb3NzaWJsZSB3aXRob3V0IHRoZSBwcmlvciB3b3JrIG9mIG1hbnkgb3RoZXIgcGVvcGxlLiBJIHdhbnQgdG8gdGhhbmsgZXZlcnlvbmUKK2ludm9sdmVkIHdpdGggbWFraW5nIE1hcmtkb3duIHN1Y2ggYSBuaWNlIG1hcmt1cCBsYW5ndWFnZSBhbmQgZXNwZWNpYWxseSB0aGUgZGV2ZWxvcGVycyBvZiBvdGhlcgorTWFya2Rvd24gaW1wbGVtZW50YXRpb25zIGJlY2F1c2Uga3JhbWRvd24gYm9ycm93ZWQgbWFueSBpZGVhcyBmcm9tIGV4aXN0aW5nIHBhY2thZ2VzLgorCisKKyMjIEF1dGhvcgorCisqIFRob21hcyBMZWl0bmVyCisqIGUtTWFpbDogPG1haWx0bzp0X2xlaXRuZXJAZ214LmF0PgorCitbUEhQIE1hcmtkb3duIEV4dHJhXTogaHR0cDovL21pY2hlbGYuY29tL3Byb2plY3RzL3BocC1tYXJrZG93bi9leHRyYS8KK1tNYXJ1a3VdOiBodHRwOi8vbWFydWt1LnJ1Ynlmb3JnZS5vcmcKK1tCbHVlRmVhdGhlcl06IGh0dHA6Ly9ydWJ5Lm1vcnBoYmFsbC5uZXQvYmx1ZWZlYXRoZXIvaW5kZXhfZW4uaHRtbAorCistLS0gaW50cm8KKzxkaXYgbWFya2Rvd249IjEiIGl0ZW1zY29wZT0iIiBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU29mdHdhcmVBcHBsaWNhdGlvbiI+Cis8bWV0YSBpdGVtcHJvcD0iYXBwbGljYXRpb25DYXRlZ29yeSIgY29udGVudD0iTWFya2Rvd24gbGlicmFyeSwgTWFya2Rvd24gY29udmVydGVyIiAvPgorPG1ldGEgaXRlbXByb3A9Im9wZXJhdGluZ1N5c3RlbSIgY29udGVudD0iTGludXgsIFdpbmRvd3MsIE1hYyBPUyBYIiAvPgorPGRpdiBpdGVtcHJvcD0iYXV0aG9yIiBpdGVtc2NvcGU9IiIgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1BlcnNvbiI+Cis8bWV0YSBpdGVtcHJvcD0ibmFtZSIgY29udGVudD0iVGhvbWFzIExlaXRuZXIiIC8+Cis8bWV0YSBpdGVtcHJvcD0iZW1haWwiIGNvbnRlbnQ9InRfbGVpdG5lckBnbXguYXQiIC8+Cis8L2Rpdj4KKworKiprcmFtZG93bioqezppdGVtcHJvcD0ibmFtZSJ9IChzaWMsIG5vdCBLcmFtZG93biBvciBLcmFtRG93biwganVzdCBrcmFtZG93bikgaXMgYSAqZnJlZSoKK1tNSVRdKGh0dHBzOi8vZ2l0aHViLmNvbS9nZXR0YWxvbmcva3JhbWRvd24vYmxvYi9tYXN0ZXIvQ09QWUlORyl7Oml0ZW1wcm9wPSJsaWNlbnNlIn0tbGljZW5zZWQKK1tSdWJ5XShodHRwOi8vd3d3LnJ1YnktbGFuZy5vcmcpIGxpYnJhcnkgZm9yIHBhcnNpbmcgYW5kIGNvbnZlcnRpbmcgYSBzdXBlcnNldCBvZiBNYXJrZG93bi4gSXQgaXMKK2NvbXBsZXRlbHkgd3JpdHRlbiBpbiBSdWJ5LCBzdXBwb3J0cyBzdGFuZGFyZCBNYXJrZG93biAod2l0aCBzb21lIG1pbm9yIG1vZGlmaWNhdGlvbnMpIGFuZCB2YXJpb3VzCitleHRlbnNpb25zIHRoYXQgaGF2ZSBiZWVuIG1hZGUgcG9wdWxhciBieSB0aGUgW1BIUCBNYXJrZG93biBFeHRyYV0gcGFja2FnZSBhbmQgW01hcnVrdV0uCit7Oml0ZW1wcm9wPSJkZXNjcmlwdGlvbiJ9CisKK0l0IGlzIHByb2JhYmx5IHRoZSBmYXN0ZXN0IHB1cmUtUnVieSBNYXJrZG93biBjb252ZXJ0ZXIgYXZhaWxhYmxlIChTZXB0ZW1iZXIgMjAxNCksIGJlaW5nIGFib3V0IDN4CitmYXN0ZXIgdGhhbiBbTWFydWt1XSBhbmQgYWJvdXQgNC41eCBmYXN0ZXIgdGhhbiBbQmx1ZUZlYXRoZXJdLgorCitWZXJzaW9uICoqMS4xNC4wKip7Oml0ZW1wcm9wPSJzb2Z0d2FyZVZlcnNpb24ifSByZWxlYXNlZCBvbgorKioyMDE3LTA2LTI2Kip7Oml0ZW1wcm9wPSJkYXRlUHVibGlzaGVkIn0sIFttb3JlIG5ld3NdKG5ld3MuaHRtbCkKK3s6IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogODAlIn0KKworPC9kaXY+CisKKzxkaXYgaWQ9ImNhbGwtdG8tYXJtcyI+CitTdXBwb3J0IGtyYW1kb3duIGRldmVsb3BtZW50IGFuZCA8YSBocmVmPSJodHRwczovL3d3dy5wYXRyZW9uLmNvbS9iZVBhdHJvbj91PTQ5MDg5NjMiIGNsYXNzPSJwYXRyZW9uIj5iZWNvbWUgYSBwYXRyb248L2E+IQorPC9kaXY+CisKKworW1BIUCBNYXJrZG93biBFeHRyYV06IGh0dHA6Ly9taWNoZWxmLmNvbS9wcm9qZWN0cy9waHAtbWFya2Rvd24vZXh0cmEvCitbTWFydWt1XTogaHR0cDovL21hcnVrdS5ydWJ5Zm9yZ2Uub3JnCitbQmx1ZUZlYXRoZXJdOiBodHRwOi8vcnVieS5tb3JwaGJhbGwubmV0L2JsdWVmZWF0aGVyL2luZGV4X2VuLmh0bWwKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvaW5zdGFsbGF0aW9uLnBhZ2UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL2luc3RhbGxhdGlvbi5wYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjk0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL2luc3RhbGxhdGlvbi5wYWdlCkBAIC0wLDAgKzEsODYgQEAKKy0tLQordGl0bGU6IEluc3RhbGxhdGlvbgoraW5fbWVudTogdHJ1ZQorc29ydF9pbmZvOiA1CistLS0KKyMgRG93bmxvYWQgJiBJbnN0YWxsYXRpb24KKworIyMgRGVwZW5kZW5jaWVzCisKK1NpbmNlIGtyYW1kb3duIGlzIHdyaXR0ZW4gaW4gUnVieSwgeW91IGp1c3QgbmVlZCB0aGUgW1J1YnkgaW50ZXJwcmV0ZXJdKGh0dHA6Ly93d3cucnVieS1sYW5nLm9yZyksCit2ZXJzaW9uIDEuOC41LCAxLjguNiwgMS44LjcsIDEuOS4yLCAxLjkuMyBvciAyLnguIFRoZXJlIGFyZSBubyBvdGhlciBkZXBlbmRlbmNpZXMuCisKKworIyMgQ29tcGF0aWJpbGl0eSBOb3RlcworCitrcmFtZG93biBzaG91bGQgd29yayBvbiBhbnkgcGxhdGZvcm0gd2hpY2ggc3VwcG9ydHMgUnVieS4gSXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlc3RlZCBvbiB0aGUKK2ZvbGxvd2luZyBwbGF0Zm9ybXM6CisKKyogTGludXggd2l0aCBSdWJ5IDEuOC43LCAxLjkuMywgMi54LCBqcnVieSAxLjcuMTkgYW5kIGpydWJ5IDkuMC4wLjAuCisKK1NlZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgaW5zdGFsbGF0aW9uIG5vdGVzIGZvciBtb3JlIGluZm9ybWF0aW9uIQorCisKKyMjIFBsYXRmb3JtIFNwZWNpZmljIEluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMKKworIyMjIExpbnV4CisKK1RoZXJlIGFyZSBhIHZhcmlldHkgb2YgTGludXggZGlzdHJpYnV0aW9ucyBvdXQgdGhlcmUgd2l0aCBkaWZmZXJlbnQgcGFja2FnZSBtYW5hZ2VtZW50IHN5c3RlbXMuIFNvCit3ZSB3aWxsIGZvY3VzIG9uIGluc3RydWN0aW9ucyBmb3IgVWJ1bnR1IDE1LjA0IGhlcmUgKHdoaWNoIHNob3VsZCBwcm9iYWJseSBhbHNvIHdvcmsgZm9yIGFueSBuZXdlcgorVWJ1bnR1IHZlcnNpb24gb3IgYW55IHJlY2VudCBEZWJpYW4gYmFzZWQgZGlzdHJpYnV0aW9uKS4KKworQWZ0ZXIgcnVubmluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzLCBrcmFtZG93biBpcyBpbnN0YWxsZWQgYW5kIHJlYWR5IHRvIHVzZToKKworICAgIHN1ZG8gYXB0LWdldCBpbnN0YWxsIHJ1YnkKKyAgICBzdWRvIGdlbSBpbnN0YWxsIGtyYW1kb3duCisKKworIyMjIE1hYyBPUyBYCisKK01hYyBPUyBYIFNub3cgTGVvcGFyZCBjb21lcyB3aXRoIFJ1YnkgYW5kIFJ1YnlnZW1zIHByZWluc3RhbGxlZC4gU28gaW5zdGFsbGluZyBrcmFtZG93biBpcyBhcyBlYXN5CithcyBydW5uaW5nOgorCisgICAgc3VkbyBnZW0gaW5zdGFsbCBrcmFtZG93bgorCisKKyMjIyBXaW5kb3dzCisKK1lvdSBuZWVkIHRvIGluc3RhbGwgUnVieSBmaXJzdC4gVGhpcyBjYW4gZWFzaWx5IGJlIGRvbmUgYnkgdXNpbmcgdGhlIFtSdWJ5SW5zdGFsbGVyXSAtIGp1c3QgZG93bmxvYWQKK3RoZSBpbnN0YWxsYXRpb24gYmluYXJ5IGFuZCBydW4gaXQuIEFmdGVyIHRoYXQgb3BlbiBhIGNvbW1hbmQgc2hlbGwgKHNlbGVjdCBgU3RhcnQgLT4gUnVuLi4uYCwgdGhlbgorZW50ZXIgYGNtZGAgYW5kIGNsaWNrIG9uIGBPa2ApIGFuZCB0eXBlIGluIHRoZSBmb2xsb3dpbmc6CisKKyAgICBnZW0gaW5zdGFsbCBrcmFtZG93bgorCitbUnVieUluc3RhbGxlcl06IGh0dHA6Ly9ydWJ5aW5zdGFsbGVyLm9yZworCisKKyMjIEdlbmVyaWMgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucworCisKKyMjIyBVc2luZyBSdWJ5Z2VtcworCitJZiB5b3UgYXJlIHVzaW5nIFJ1YnlnZW1zLCBpbnN0YWxsaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBrcmFtZG93biBpcyBhcyBzaW1wbGUgYXMgZXhlY3V0aW5nCisKKyAgICBnZW0gaW5zdGFsbCBrcmFtZG93bgorCisKKyMjIyBNYW51YWwgSW5zdGFsbGF0aW9uCisKK1RoZSBsYXRlc3QgdmVyc2lvbiBvZiBrcmFtZG93biBjYW4gYWx3YXlzIGJlIGRvd25sb2FkZWQgYXMgYC50YXIuZ3pgIG9yIGAuemlwYCB2aWEgdGhlIFtHaXRodWIKK3JlbGVhc2VzIHBhZ2VdW2docmVsZWFzZXNdLiBBZnRlciB0aGUgZG93bmxvYWQgdGhlIHBhY2thZ2UgbmVlZHMgdG8gYmUgZGVjb21wcmVzc2VkIGFuZCB0aGVuIHlvdSBjYW4KK2luc3RhbGwga3JhbWRvd24gdXNpbmcgdGhlIGluY2x1ZGVkIGBzZXR1cC5yYmAgaW5zdGFsbGF0aW9uIG1ldGhvZDoKKworICAgICQgcnVieSBzZXR1cC5yYiBjb25maWcKKyAgICAkIHJ1Ynkgc2V0dXAucmIgc2V0dXAKKyAgICAkIHJ1Ynkgc2V0dXAucmIgaW5zdGFsbAorCitbZ2hyZWxlYXNlc106IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXR0YWxvbmcva3JhbWRvd24vcmVsZWFzZXMKKworCisjIyMgVXNpbmcgdGhlIHJlcG9zaXRvcnkgdmVyc2lvbgorCitrcmFtZG93biB1c2VzIGdpdCBhcyBpdHMgdmVyc2lvbmluZyBzeXN0ZW0gYW5kIGtyYW1kb3duJ3MgcmVwb3NpdG9yeSBpcyBob3N0ZWQgb24gR2l0SHViLiBUaGUKK3JlcG9zaXRvcnkgYWx3YXlzIGNvbnRhaW5zIGEgY2xlYW4gc3RhdGUgb2YgdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBrcmFtZG93bi4gVG8gY2hlY2sKK291dCBrcmFtZG93biB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICAgIGdpdCBjbG9uZSBnaXQ6Ly9naXRodWIuY29tL2dldHRhbG9uZy9rcmFtZG93bi5naXQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvbGlua3MubWFya2Rvd24gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL2xpbmtzLm1hcmtkb3duCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYWEwNWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL2xpbmtzLm1hcmtkb3duCkBAIC0wLDAgKzEsNiBAQAorW01hcnVrdV06IGh0dHA6Ly9tYXJ1a3UucnVieWZvcmdlLm9yZworW1BIUCBNYXJrZG93biBFeHRyYV06IGh0dHA6Ly9taWNoZWxmLmNvbS9wcm9qZWN0cy9waHAtbWFya2Rvd24vZXh0cmEvCitbUGFuZG9jXTogaHR0cDovL2pvaG5tYWNmYXJsYW5lLm5ldC9wYW5kb2MvCitbTWF0aEpheF06IGh0dHA6Ly93d3cubWF0aGpheC5vcmcKK1tCbHVlQ2xvdGhdOiBodHRwOi8vZGV2ZWlhdGUub3JnL3Byb2plY3RzL0JsdWVDbG90aAorW1JlZENsb3RoXTogaHR0cDovL3JlZGNsb3RoLm9yZy8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvbWV0YWluZm8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL21ldGFpbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmY2U2MDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL21ldGFpbmZvCkBAIC0wLDAgKzEsMyBAQAorLS0tIGFsY24KK1tjb252ZXJ0ZXIvKi5odG1sLCBwYXJzZXIvKi5odG1sLCBkb2N1bWVudGF0aW9uLmVuLmh0bWwsIG9wdGlvbnMuZW4uaHRtbCwgdGVzdHMuZW4uaHRtbF06CisgIHRlbXBsYXRlOiAuLi9kb2N1bWVudGF0aW9uLnRlbXBsYXRlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL25ld3MuZmVlZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvbmV3cy5mZWVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTUxMWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL25ld3MuZmVlZApAQCAtMCwwICsxLDkgQEAKKy0tLQordGl0bGU6IGtyYW1kb3duIE5ld3MKK2Rlc2NyaXB0aW9uOiBrcmFtZG93biAtIGEgZmFzdCwgcHVyZSBSdWJ5IE1hcmtkb3duLXN1cGVyc2V0IGNvbnZlcnRlcgorYXV0aG9yOiBUaG9tYXMgTGVpdG5lcgorYXV0aG9yX3VybDogaHR0cDovL2tyYW1kb3duLmdldHRhbG9uZy5vcmcKK2VudHJpZXM6IHthbGNuOiBuZXdzLyouaHRtbCwgc29ydDogc29ydF9pbmZvLCByZXZlcnNlOiB0cnVlLCBsaW1pdDogMTB9Cit2ZXJzaW9uczoKKyAgYXRvbToKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9uZXdzLnBhZ2UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL25ld3MucGFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGY3ZjQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9uZXdzLnBhZ2UKQEAgLTAsMCArMSwyOSBAQAorLS0tCit0aXRsZTogTmV3cworaW5fbWVudTogZmFsc2UKK3NvcnRfaW5mbzogMzAKKy0tLSBwaXBlbGluZTp0YWdzLGJsb2NrcyxmcmFnbWVudHMKKworPGgxPk5ld3M8L2gxPgorCis8YSBocmVmPSJ7cmVsb2NhdGFibGU6IG5ld3MuYXRvbX0iPkF0b20tRmVlZDwvYT4KKworPHdlYmdlbjpibG9jayBuYW1lPSJuZXdzZGF0YSIgbm9kZT0iY3VycmVudCIgLz4KKworLS0tIG5hbWU6bmV3c2RhdGEgcGlwZWxpbmU6ZXJiCis8JQorb3B0cyA9IHs6YWxjbiA9PiAnL25ld3MvKi5odG1sJywgOnNvcnQgPT4gJ3NvcnRfaW5mbycsIDpyZXZlcnNlID0+IHRydWUsIDpmbGF0dGVuID0+IHRydWV9Citjb250ZXh0LndlYnNpdGUuZXh0Lml0ZW1fdHJhY2tlci5hZGQoY29udGV4dC5kZXN0X25vZGUsIDpub2RlcywgOm5vZGVfZmluZGVyX29wdGlvbl9zZXQsCisgIHs6b3B0cyA9PiBvcHRzLCA6cmVmX2FsY24gPT4gY29udGV4dC5ub2RlLmFsY259LCA6Y29udGVudCkKK2NvbnRleHQud2Vic2l0ZS5leHQubm9kZV9maW5kZXIuZmluZChvcHRzLCBjb250ZXh0Lm5vZGUpLmVhY2ggZG8gfG5vZGV8CisgIyBjb250ZXh0Lm9wdGlvbnNbJ2NvbnRlbnRwcm9jZXNzb3Iua3JhbWRvd24ub3B0aW9ucyddID0gezphdXRvX2lkX3ByZWZpeCA9PiBub2RlLmxjbi50cignLicsICctJyl9CislPgorCis8ZGl2IGNsYXNzPSduZXdzLWl0ZW0nPgorPGRpdiBjbGFzcz0ibmV3cy1kYXRlIGZsb2F0LXJpZ2h0Ij4KKyAgUHVibGlzaGVkIG9uIDwlPSBub2RlWydjcmVhdGVkX2F0J10uc3RyZnRpbWUoIiVBLCAlZCAlQiAlWSIpICU+Cis8L2Rpdj4KKzwlPSBjb250ZXh0LnJlbmRlcl9ibG9jayg6bmFtZSA9PiAnY29udGVudCcsIDpjaGFpbiA9PiBbbm9kZV0pICU+Cis8L2Rpdj4KKworPCUgZW5kICU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL29wdGlvbnMucGFnZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2Mvb3B0aW9ucy5wYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGJiNDgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL29wdGlvbnMucGFnZQpAQCAtMCwwICsxLDQ5IEBACistLS0KK3RpdGxlOiBPcHRpb25zCistLS0KKyMjIE9wdGlvbnMKKworVGhlIGJlaGF2aW91ciBvZiBrcmFtZG93biBjYW4gYmUgYWRqdXN0ZWQgdmlhIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4KKworT3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGluIG11bHRpcGxlIHdheXM6CisKK09uIHRoZSBjb21tYW5kIGxpbmUKKzogVGhlIGBrcmFtZG93bmAgYmluYXJ5IGFsbG93cyBzZXR0aW5nIGFueSBvcHRpb24gYnkgdXNpbmcgY29tbWFuZCBsaW5lIHN3aXRjaGVzLgorCisgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBkaXNhYmxlIGF1dG9tYXRpYyBoZWFkZXIgSUQgZ2VuZXJhdGlvbiBhbmQgZGVmaW5lcyB0aGUKKyAgZmlyc3QgZm9vdG5vdGUgbnVtYmVyIGFzIDU6CisKKyAgfn5+CisgICQga3JhbWRvd24gLS1uby1hdXRvLWlkcyAtLWZvb3Rub3RlLW5yIDUKKyAgfn5+CisKKyAgQXMgeW91IGNhbiBzZWUgYWxsIHVuZGVyc2NvcmVzIGluIG9wdGlvbiBuYW1lcyBoYXZlIHRvIGJlIHJlcGxhY2VkIHdpdGggZGFzaGVzLiBUaGUgYnVpbHQtaW4gaGVscAorICBvZiB0aGUgYmluYXJ5IGFzIHdlbGwgYXMgdGhlIG1hbi1wYWdlIHNob3cgYWxsIGF2YWlsYWJsZSBvcHRpb25zLgorCitXaXRoaW4gYSBrcmFtZG93biBkb2N1bWVudAorOiBCeSB1c2luZyB0aGUgc3BlY2lhbCBleHRlbnNpb24gc3ludGF4LCBpdCBpcyBwb3NzaWJsZSB0byBzZXQgb3B0aW9ucyB3aXRoaW4gYSBkb2N1bWVudC4KKworICBVc2luZyB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIG9wdGlvbnMgd291bGQgYmUgc2V0IGxpa2UgdGhpcyB3aXRoaW4gYSBkb2N1bWVudDoKKworICB+fn4KKyAgezo6b3B0aW9ucyBhdXRvX2lkcz0iZmFsc2UiIGZvb3Rub3RlX25yPSI1IiAvfQorICB+fn4KKworVXNpbmcgUnVieSBjb2RlCisKKzogSWYgeW91IGFyZSB1c2luZyBrcmFtZG93biBhcyBhIGxpYnJhcnksIHlvdSBjYW4gcGFzcyBhbnkgb3B0aW9ucyBhcyBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZQorICBgS3JhbWRvd246OkRvY3VtZW50Lm5ld2AgbWV0aG9kLgorCisgIEFnYWluLCB1c2luZyB0aGUgYWJvdmUgZXhhbXBsZSB5b3Ugd291bGQgaW5pdGFsaXplIHRoZSBrcmFtZG93biBkb2N1bWVudCBjbGFzcyBhcyBmb2xsb3dzOgorCisgIH5+fiBydWJ5CisgIEtyYW1kb3duOjpEb2N1bWVudC5uZXcoc291cmNlX3RleHQsIFx7YXV0b19pZHM6IGZhbHNlLCBmb290bm90ZV9ucjogNX0pCisgIH5+fgorCisKKyMjIEF2YWlsYWJsZSBPcHRpb25zCisKK0JlbG93IGlzIGEgbGlzdCBvZiBhbGwgY3VycmVudGx5IGF2YWlsYWJsZSBvcHRpb25zLiBIYXZlIGEgbG9vayBhdCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNvbnZlcnRlcgorb3IgcGFyc2VyIHRvIHNlZSBkaXJlY3RseSB3aGljaCBvcHRpb25zIHRoZXkgc3VwcG9ydCEKKwore29wdGlvbnM6IHtpdGVtczogYWxsfX0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvcXVpY2tyZWYucGFnZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvcXVpY2tyZWYucGFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWVhY2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9xdWlja3JlZi5wYWdlCkBAIC0wLDAgKzEsNjAzIEBACistLS0KK3RpdGxlOiBRdWljayBSZWZlcmVuY2UKK2luX21lbnU6IHRydWUKK3NvcnRfaW5mbzogOQorLS0tIG5hbWU6c2lkZWJhcgorPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPgorPGEgaHJlZj0iaHR0cHM6Ly93d3cucGF0cmVvbi5jb20vYmVQYXRyb24/dT00OTA4OTYzIiBjbGFzcz0icGF0cmVvbiI+QmVjb21lIGEgUGF0cm9uITwvYT4KKzwvZGl2PgorCis8aDE+Q29udGVudHM8L2gxPgorCit7bWVudToge29wdGlvbnM6IHtkZXNjZW5kYW50czogdHJ1ZSwgbGV2ZWxzOiBbMiw2XX19fQorLS0tIG5hbWU6Y29udGVudAorIyBRdWljayBSZWZlcmVuY2UKKworQmVsb3cgYXJlIGV4YW1wbGVzIG9mIGFsbCBhdmFpbGFibGUgc3RydWN0dXJhbCBlbGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGluIGEga3JhbWRvd24gdGV4dC4gU2luY2UKK3RoZSBrcmFtZG93biBzeW50YXggaXMgYSBzdXBlcnNldCBvZiB0aGUgTWFya2Rvd24gc3ludGF4LCBvbmx5IGEgc21hbGwgcGFydCBvZiB0aGUgYXZhaWxhYmxlIHN5bnRheAoraXMgbm90IGF2YWlsYWJsZSBpbiBzdGFuZGFyZCBNYXJrZG93biBzeW50YXguIE5vdGUsIHRoYXQgb25seSB0aGUgbW9zdCBiYXNpYyBzeW50YXggaW5mb3JtYXRpb24gaXMKK2dpdmVuLiBIb3dldmVyLCBhIGxpbmsgdG8gdGhlIGRldGFpbGVkIHN5bnRheCBmb3IgZWFjaCBlbGVtZW50IGlzIHByb3ZpZGVkICh3aGljaCBhbHNvIGRldGFpbHMgdGhlCitkaWZmZXJlbmNlcyB0byB0aGUgc3RhbmRhcmQgTWFya2Rvd24gc3ludGF4KS4gVGhlIHF1aWNrIHJlZmVyZW5jZSBpcyBmb3IgdmVyc2lvbiAqKjwlPQorOjpLcmFtZG93bjo6VkVSU0lPTiAlPioqIG9mIHRoZSBzeW50YXggZG9jdW1lbnRhdGlvbi4KKwora3JhbWRvd24gaGFzIHR3byBtYWluIGNsYXNzZXMgb2YgZWxlbWVudHM6IGJsb2NrIGFuZCBzcGFuLWxldmVsIGVsZW1lbnRzLiBCbG9jay1sZXZlbCBlbGVtZW50cyBhcmUKK3VzZWQgdG8gY3JlYXRlIHBhcmFncmFwaHMsIGhlYWRlcnMsIGxpc3RzIGFuZCBzbyBvbiB3aGVyZWFzIHNwYW4tbGV2ZWwgZWxlbWVudHMgYXJlIHVzZWQgdG8gbWFya3VwCit0ZXh0IHBocmFzZXMgYXMgZW1waGFzaXplZCwgYXMgYSBsaW5rIGFuZCBzbyBvbi4KKworQWxsIGV4YW1wbGVzIGJlbG93IGZlYXR1cmUgdGhlIGtyYW1kb3duIHNvdXJjZSwgdGhlIGNvbnZlcnRlZCBIVE1MIHNvdXJjZSAoc2hvd24gd2hlbiBob3ZlcmluZyBvdmVyCit0aGUga3JhbWRvd24gc291cmNlKSBhbmQgdGhlIG91dHB1dCBhcyBpdCBhcHBlYXJzIGluIHRoZSBicm93c2VyLiBUaGlzIGxvb2tzIGxpa2UgdGhpczoKKworPHRhYmxlIGNsYXNzPSJrZGV4YW1wbGUiPgorPHRyPgorPHRkPjxwcmUgY2xhc3M9ImtkZXhhbXBsZS1iZWZvcmUiPjxjb2RlPmtyYW1kb3duIGV4YW1wbGUgY29kZTwvY29kZT48L3ByZT48L3RkPgorPHRkPjxwcmUgY2xhc3M9ImtkZXhhbXBsZS1hZnRlci1zb3VyY2UiPjxjb2RlPkV4YW1wbGUgY29kZSBjb252ZXJ0ZWQgdG8gSFRNTDwvY29kZT48L3ByZT4KKzxkaXYgY2xhc3M9ImtkZXhhbXBsZS1hZnRlci1saXZlIiBzdHlsZT0iY2xlYXI6bm9uZSI+CitMaXZlIGJyb3dzZXIgdmlldyBvZiBleGFtcGxlIGNvZGUKKzwvZGl2PgorPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCisKKyMgQmxvY2stbGV2ZWwgRWxlbWVudHMgLSBNYWluIFN0cnVjdHVyYWwgRWxlbWVudHMKKworIyMgUGFyYWdyYXBocworCit7a2RsaW5rOiB7b2lkOiBwYXJhZ3JhcGhzLCBwYXJ0OiAicGFyYWdyYXBocyJ9fQorCitDb25zZWN1dGl2ZSBsaW5lcyBvZiB0ZXh0IGFyZSBjb25zaWRlcmVkIHRvIGJlIG9uZSBwYXJhZ3JhcGguIEFzIHdpdGggb3RoZXIgYmxvY2sgbGV2ZWwgZWxlbWVudHMgeW91CitoYXZlIHRvIGFkZCBhIGJsYW5rIGxpbmUgdG8gc2VwYXJhdGUgaXQgZnJvbSB0aGUgZm9sbG93aW5nIGJsb2NrLWxldmVsIGVsZW1lbnQ6CisKK3trZGV4YW1wbGU6On0KK1RoZSBmaXJzdCBwYXJhZ3JhcGguCisKK0Fub3RoZXIgcGFyYWdyYXBoCit7a2RleGFtcGxlfQorCitFeHBsaWNpdCBsaW5lIGJyZWFrcyBpbiBhIHBhcmFncmFwaCBjYW4gYmUgbWFkZSBieSB1c2luZyB0d28gc3BhY2VzIG9yIHR3byBiYWNrc2xhc2hlcyBhdCB0aGUgZW5kIG9mIGEgbGluZToKKwore2tkZXhhbXBsZTo6fQorVGhpcyBpcyBhIHBhcmFncmFwaCAgCit3aGljaCBjb250YWlucyBhIGhhcmQgbGluZSBicmVhay4KK3trZGV4YW1wbGV9CisKKworIyMgSGVhZGVycworCit7a2RsaW5rOiB7b2lkOiBoZWFkZXJzLCBwYXJ0OiAiaGVhZGVycyJ9fQorCitrcmFtZG93biBzdXBwb3J0cyBTZXRleHQgc3R5bGUgaGVhZGVycyBhbmQgYXR4IHN0eWxlIGhlYWRlcnMuIEEgaGVhZGVyIG11c3QgYWx3YXlzIGJlIHByZWNlZGVkIGJ5IGEKK2JsYW5rIGxpbmUgZXhjZXB0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50OgorCisKK3trZGV4YW1wbGU6On0KK0ZpcnN0IGxldmVsIGhlYWRlcgorPT09PT09PT09PT09PT09PT09CisKK1NlY29uZCBsZXZlbCBoZWFkZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK3trZGV4YW1wbGV9CisKK3trZGV4YW1wbGU6On0KKyMgSDEgaGVhZGVyCisKKyMjIEgyIGhlYWRlcgorCisjIyMgSDMgaGVhZGVyCisKKyMjIyMgSDQgaGVhZGVyCisKKyMjIyMjIEg1IGhlYWRlcgorCisjIyMjIyMgSDYgaGVhZGVyCit7a2RleGFtcGxlfQorCitJZiB5b3Ugc2V0IHRoZSBvcHRpb24gYGF1dG9faWRzYCB0byBgZmFsc2VgIChmb3IgZXhhbXBsZSwgYnkgdXNpbmcgdGhlIGBvcHRpb25zYCBleHRlbnNpb24sIHNlZQorW0V4dGVuc2lvbnNdKCNleHRlbnNpb25zKSksIHRoZW4gdGhlIGF1dG9tYXRpYyBoZWFkZXIgSUQgZ2VuZXJhdGlvbiBpcyB0dXJuZWQgb2ZmOgorCit7a2RleGFtcGxlOjp9Cit7OjpvcHRpb25zIGF1dG9faWRzPSJmYWxzZSIgL30KKworIyBBIGhlYWRlciB3aXRob3V0IGFuIElECit7a2RleGFtcGxlfQorCisKKyMjIEJsb2NrcXVvdGVzCisKK3trZGxpbms6IHtvaWQ6IGJsb2NrcXVvdGVzLCBwYXJ0OiAiYmxvY2txdW90ZXMifX0KKworQSBibG9ja3F1b3RlIGlzIHN0YXJ0ZWQgdXNpbmcgdGhlIGA+YCBtYXJrZXIgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgc3BhY2U7IGFsbCBmb2xsb3dpbmcgbGluZXMgdGhhdAorYXJlIGFsc28gc3RhcnRlZCB3aXRoIHRoZSBibG9ja3F1b3RlIG1hcmtlciBiZWxvbmcgdG8gdGhlIGJsb2NrcXVvdGUuIFlvdSBjYW4gdXNlIGFueSBibG9jay1sZXZlbAorZWxlbWVudHMgaW5zaWRlIGEgYmxvY2txdW90ZToKKwore2tkZXhhbXBsZTo6fQorPiBBIHNhbXBsZSBibG9ja3F1b3RlLgorPgorPiA+TmVzdGVkIGJsb2NrcXVvdGVzIGFyZQorPiA+YWxzbyBwb3NzaWJsZS4KKz4KKz4gIyMgSGVhZGVycyB3b3JrIHRvbworPiBUaGlzIGlzIHRoZSBvdXRlciBxdW90ZSBhZ2Fpbi4KK3trZGV4YW1wbGV9CisKK1lvdSBtYXkgYWxzbyBiZSBsYXp5IHdpdGggdGhlIGA+YCBtYXJrZXJzIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gYmxhbmsgbGluZToKKwore2tkZXhhbXBsZTo6fQorPiBUaGlzIGlzIGEgYmxvY2txdW90ZQorY29udGludWVkIG9uIHRoaXMKK2FuZCB0aGlzIGxpbmUuCisKK0J1dCB0aGlzIGlzIGEgc2VwYXJhdGUgcGFyYWdyYXBoLgore2tkZXhhbXBsZX0KKworIyMgQ29kZSBCbG9ja3MKKwore2tkbGluazoge29pZDogY29kZS1ibG9ja3MsIHBhcnQ6ICJjb2RlIGJsb2NrcyJ9fQorCitrcmFtZG93biBzdXBwb3J0cyB0d28gZGlmZmVyZW50IGNvZGUgYmxvY2sgc3R5bGVzLiBPbmUgdXNlcyBsaW5lcyBpbmRlbnRlZCB3aXRoIGVpdGhlciBmb3VyIHNwYWNlcworb3Igb25lIHRhYiB3aGVyZWFzIHRoZSBvdGhlciB1c2VzIGxpbmVzIHdpdGggdGlsZGUgY2hhcmFjdGVycyBhcyBkZWxpbWl0ZXJzIC0tIHRoZXJlZm9yZSB0aGUgY29udGVudAorZG9lcyBub3QgbmVlZCB0byBiZSBpbmRlbnRlZDoKKwore2tkZXhhbXBsZTo6fQorICAgIFRoaXMgaXMgYSBzYW1wbGUgY29kZSBibG9jay4KKworICAgIENvbnRpbnVlZCBoZXJlLgore2tkZXhhbXBsZX0KKwore2tkZXhhbXBsZTo6fQorfn5+fn5+CitUaGlzIGlzIGFsc28gYSBjb2RlIGJsb2NrLgorfn5+CitFbmRpbmcgbGluZXMgbXVzdCBoYXZlIGF0IGxlYXN0IGFzCittYW55IHRpbGRlcyBhcyB0aGUgc3RhcnRpbmcgbGluZS4KK35+fn5+fn5+fn5+fgore2tkZXhhbXBsZX0KKworVGhlIGZvbGxvd2luZyBpcyBhIGNvZGUgYmxvY2sgd2l0aCBhIGxhbmd1YWdlIHNwZWNpZmllZDoKKwore2tkZXhhbXBsZTo6fQorfn5+IHJ1YnkKK2RlZiB3aGF0PworICA0MgorZW5kCit+fn4KK3trZGV4YW1wbGV9CisKKworIyMgSG9yaXpvbnRhbCBSdWxlcworCit7a2RsaW5rOiB7b2lkOiBob3Jpem9udGFsLXJ1bGVzLCBwYXJ0OiAiaG9yaXpvbnRhbCBydWxlcyJ9fQorCitJdCBpcyBlYXN5IHRvIGluc2VydCBhIGhvcml6b250YWwgcnVsZSBpbiBrcmFtZG93bjoganVzdCB1c2UgdGhyZWUgb3IgbW9yZSBhc3Rlcmlza3MsIGRhc2hlcyBvcgordW5kZXJzY29yZXMsIG9wdGlvbmFsbHkgc2VwYXJhdGVkIGJ5IHNwYWNlcyBvciB0YWJzLCBvbiBhbiBvdGhlcndpc2UgYmxhbmsgbGluZToKKwore2tkZXhhbXBsZTo6fQorKiAqICoKKworXC0tLQorCisgIF8gIF8gIF8gIF8KKworLS0tLS0tLS0tLS0tLS0tCit7a2RleGFtcGxlfQorCisKKyMjIExpc3RzCisKK3trZGxpbms6IHtvaWQ6IGxpc3RzLCBwYXJ0OiAibGlzdHMifX0KKwora3JhbWRvd24gc3VwcG9ydHMgb3JkZXJlZCBhbmQgdW5vcmRlcmVkIGxpc3RzLiBPcmRlcmVkIGxpc3RzIGFyZSBzdGFydGVkIGJ5IHVzaW5nIGEgbnVtYmVyIGZvbGxvd2VkCitieSBhIHBlcmlvZCwgYSBzcGFjZSBhbmQgdGhlbiB0aGUgbGlzdCBpdGVtIHRleHQuIFRoZSBjb250ZW50IG9mIGEgbGlzdCBpdGVtIGNvbnNpc3RzIG9mIGJsb2NrLWxldmVsCitlbGVtZW50cy4gQWxsIGxpbmVzIHdoaWNoIGhhdmUgdGhlIHNhbWUgaW5kZW50IGFzIHRoZSB0ZXh0IG9mIHRoZSBsaW5lIHdpdGggdGhlIGxpc3QgbWFya2VyIGJlbG9uZwordG8gdGhlIGxpc3QgaXRlbToKKwore2tkZXhhbXBsZTo6fQorMS4gVGhpcyBpcyBhIGxpc3QgaXRlbQorMi4gQW5kIGFub3RoZXIgaXRlbQorMi4gQW5kIHRoZSB0aGlyZCBvbmUKKyAgIHdpdGggYWRkaXRpb25hbCB0ZXh0Cit7a2RleGFtcGxlfQorCitBcyB3aXRoIGJsb2NrIHF1b3RlcywgeW91IG1heSBiZSBsYXp5IHdoZW4gdXNpbmcgdGhlIGxpc3QgaXRlbSBtYXJrZXI6CisKK3trZGV4YW1wbGU6On0KKyogQSBsaXN0IGl0ZW0KK3dpdGggYWRkaXRpb25hbCB0ZXh0Cit7a2RleGFtcGxlfQorCitBcyB0aGUgY29udGVudCBjb25zaXN0cyBvZiBibG9jay1sZXZlbCBlbGVtZW50cyB5b3UgY2FuIGRvIHRoaW5ncyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKK3trZGV4YW1wbGU6On0KKzEuICBUaGlzIGlzIGEgbGlzdCBpdGVtCisKKyAgICA+IHdpdGggYSBibG9ja3F1b3RlCisKKyAgICAjIEFuZCBhIGhlYWRlcgorCisyLiAgRm9sbG93ZWQgYnkgYW5vdGhlciBpdGVtCit7a2RleGFtcGxlfQorCitOZXN0ZWQgbGlzdHMgYXJlIGFsc28gZWFzeSB0byBjcmVhdGU6CisKK3trZGV4YW1wbGU6On0KKzEuIEl0ZW0gb25lCisgICAxLiBzdWIgaXRlbSBvbmUKKyAgIDIuIHN1YiBpdGVtIHR3bworICAgMy4gc3ViIGl0ZW0gdGhyZWUKKzIuIEl0ZW0gdHdvCit7a2RleGFtcGxlfQorCitMaXN0cyBjYW4gb2NjdXIgZGlyZWN0bHkgYWZ0ZXIgb3RoZXIgYmxvY2stbGV2ZWwgZWxlbWVudHMsIGhvd2V2ZXIsIHRoZXJlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUKK2JsYW5rIGxpbmUgaWYgeW91IHdhbnQgdG8gZm9sbG93IGEgcGFyYWdyYXBoIHdpdGggYSBsaXN0OgorCit7a2RleGFtcGxlOjp9CitUaGlzIGlzIGEgcGFyYWdyYXBoLgorMS4gVGhpcyBpcyBOT1QgYSBsaXN0LgorCisxLiBUaGlzIGlzIGEgbGlzdCEKK3trZGV4YW1wbGV9CisKK1Vub3JkZXJlZCBsaXN0cyBhcmUgc3RhcnRlZCBieSB1c2luZyBhbiBhc3RlcmlzaywgYSBkYXNoIG9yIGEgcGx1cyBzaWduICh0aGV5IGNhbiBiZSBtaXhlZCkgYW5kIGEKK3NwYWNlLiBBcGFydCBmcm9tIHRoYXQgdW5vcmRlcmVkIGxpc3RzIGZvbGxvdyB0aGUgc2FtZSBydWxlcyBhcyBvcmRlcmVkIGxpc3RzOgorCit7a2RleGFtcGxlOjp9CisqIEl0ZW0gb25lCisrIEl0ZW0gdHdvCistIEl0ZW0gdGhyZWUKK3trZGV4YW1wbGV9CisKKyMjIERlZmluaXRpb24gTGlzdHMKKwore2tkbGluazoge29pZDogZGVmaW5pdGlvbi1saXN0cywgcGFydDogImRlZmluaXRpb24gbGlzdHMifX0KKworQSBkZWZpbml0aW9uIGxpc3Qgd29ya3Mgc2ltaWxhciB0byBhIG5vcm1hbCBsaXN0IGFuZCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBkZWZpbml0aW9ucyB3aXRoIHRlcm1zLgorRGVmaW5pdGlvbiBsaXN0cyBhcmUgc3RhcnRlZCB3aGVuIGEgbm9ybWFsIHBhcmFncmFwaCBpcyBmb2xsb3dlZCBieSBhIGxpbmUgc3RhcnRpbmcgd2l0aCBhIGNvbG9uIGFuZAordGhlbiB0aGUgZGVmaW5pdGlvbiB0ZXh0LiBPbmUgdGVybSBjYW4gaGF2ZSBtYW55IGRlZmluaXRpb25zIGFuZCBtdWx0aXBsZSB0ZXJtcyBjYW4gaGF2ZSB0aGUgc2FtZQorZGVmaW5pdGlvbi4gRWFjaCBsaW5lIG9mIHRoZSBwcmVjZWRpbmcgcGFyYWdyYXBoIGlzIGFzc3VtZWQgdG8gY29udGFpbiBvbmUgdGVybSwgZm9yIGV4YW1wbGU6CisKK3trZGV4YW1wbGU6On0KK3Rlcm0KKzogZGVmaW5pdGlvbgorOiBhbm90aGVyIGRlZmluaXRpb24KKworYW5vdGhlciB0ZXJtCithbmQgYW5vdGhlciB0ZXJtCis6IGFuZCBhIGRlZmluaXRpb24gZm9yIHRoZSB0ZXJtCit7a2RleGFtcGxlfQorCitJZiB5b3UgaW5zZXJ0IGEgYmxhbmsgbGluZSBiZWZvcmUgYSBkZWZpbml0aW9uIChub3RlOiB0aGVyZSBtdXN0IG9ubHkgYmUgb25lIGJsYW5rIGxpbmUgYmV0d2VlbiB0aGUKK3Rlcm1zIGFuZCB0aGUgZmlyc3QgZGVmaW5pdGlvbiksIHRoZSBkZWZpbml0aW9uIHdpbGwgYmUgd3JhcHBlZCBpbiBhIHBhcmFncmFwaDoKKwore2tkZXhhbXBsZTo6fQordGVybQorCis6IGRlZmluaXRpb24KKzogZGVmaW5pdGlvbgore2tkZXhhbXBsZX0KKworRWFjaCB0ZXJtIGNhbiBiZSBzdHlsZWQgdXNpbmcgc3Bhbi1sZXZlbCBlbGVtZW50cyBhbmQgZWFjaCBkZWZpbml0aW9uIGlzIHBhcnNlZCBhcyBibG9jay1sZXZlbAorZWxlbWVudHMsIGkuZS4geW91IGNhbiB1c2UgYW55IGJsb2NrLWxldmVsIGluIGEgZGVmaW5pdGlvbi4gSnVzdCB1c2UgdGhlIHNhbWUgaW5kZW50IGZvciB0aGUgbGluZXMKK2ZvbGxvd2luZyB0aGUgZGVmaW5pdGlvbiBsaW5lOgorCit7a2RleGFtcGxlOjp9CitUaGlzICppcyogYSB0ZXJtCisKKzogVGhpcyB3aWxsIGJlIGEgcGFyYQorCisgID4gYSBibG9ja3F1b3RlCisKKyAgIyBBIGhlYWRlcgore2tkZXhhbXBsZX0KKworCisjIyBUYWJsZXMKKwore2tkbGluazoge29pZDogdGFibGVzLCBwYXJ0OiAidGFibGVzIn19CisKK2tyYW1kb3duIHN1cHBvcnRzIGEgc3ludGF4IGZvciBjcmVhdGluZyBzaW1wbGUgdGFibGVzLiBBIGxpbmUgc3RhcnRpbmcgd2l0aCBhIHBpcGUgY2hhcmFjdGVyIChgfGApCitzdGFydHMgYSB0YWJsZSByb3cuIEhvd2V2ZXIsIGlmIHRoZSBwaXBlIGNoYXJhY3RlcnMgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBkYXNoIChgLWApLCBhCitzZXBhcmF0b3IgbGluZSBpcyBjcmVhdGVkLiBTZXBhcmF0b3IgbGluZXMgYXJlIHVzZWQgdG8gc3BsaXQgdGhlIHRhYmxlIGhlYWRlciBmcm9tIHRoZSB0YWJsZSBib2R5CisoYW5kIG9wdGlvbmFsbHkgYWxpZ24gdGhlIHRhYmxlIGNvbHVtbnMpIGFuZCB0byBzcGxpdCB0aGUgdGFibGUgYm9keSBpbnRvIG11bHRpcGxlIHBhcnRzLiBJZiB0aGUKK3BpcGUgY2hhcmFjdGVyIGlzIGZvbGxvd2VkIGJ5IGFuIGVxdWFsIHNpZ24gKGA9YCksIHRoZSB0YWJsZXMgcm93cyBiZWxvdyBpdCBhcmUgcGFydCBvZiB0aGUgdGFibGUKK2Zvb3Rlci4KKwore2tkZXhhbXBsZTo6fQorfCBBIHNpbXBsZSB8IHRhYmxlIHwKK3wgd2l0aCBtdWx0aXBsZSB8IGxpbmVzfAore2tkZXhhbXBsZX0KKwore2tkZXhhbXBsZTo6fQorfCBIZWFkZXIxIHwgSGVhZGVyMiB8IEhlYWRlcjMgfAorfDotLS0tLS0tLXw6LS0tLS0tLTp8LS0tLS0tLS06fAorfCBjZWxsMSAgIHwgY2VsbDIgICB8IGNlbGwzICAgfAorfCBjZWxsNCAgIHwgY2VsbDUgICB8IGNlbGw2ICAgfAorfC0tLS0KK3wgY2VsbDEgICB8IGNlbGwyICAgfCBjZWxsMyAgIHwKK3wgY2VsbDQgICB8IGNlbGw1ICAgfCBjZWxsNiAgIHwKK3w9PT09PQorfCBGb290MSAgIHwgRm9vdDIgICB8IEZvb3QzCit7OiBydWxlcz0iZ3JvdXBzIn0KK3trZGV4YW1wbGV9CisKKworIyMgSFRNTCBlbGVtZW50cworCit7a2RsaW5rOiB7b2lkOiBodG1sLWJsb2NrcywgcGFydDogIkhUTUwgYmxvY2tzIn19CisKK2tyYW1kb3duIGFsbG93cyB5b3UgdG8gdXNlIGJsb2NrLWxldmVsIEhUTUwgdGFncyAoYGRpdmAsIGBwYCwgYHByZWAsIC4uLikgdG8gbWFya3VwIHdob2xlIGJsb2NrcyBvZgordGV4dCAtLSBqdXN0IHN0YXJ0IGEgbGluZSB3aXRoIGEgYmxvY2stbGV2ZWwgSFRNTCB0YWcuIGtyYW1kb3duIHN5bnRheCBpcyBub3JtYWxseSBub3QgcHJvY2Vzc2VkCitpbnNpZGUgYW4gSFRNTCB0YWcgYnV0IHRoaXMgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUgYHBhcnNlX2Jsb2NrX2h0bWxgIG9wdGlvbi4gSWYgdGhpcyBvcHRpb25zIGlzCitzZXQgdG8gYHRydWVgLCB0aGVuIHRoZSBjb250ZW50IG9mIGEgYmxvY2stbGV2ZWwgSFRNTCB0YWcgaXMgcGFyc2VkIGJ5IGtyYW1kb3duIGVpdGhlciBhcyBibG9jaworbGV2ZWwgb3Igc3Bhbi1sZXZlbCB0ZXh0LCBkZXBlbmRpbmcgb24gdGhlIHRhZzoKKwore2tkZXhhbXBsZTo6fQorPGRpdiBzdHlsZT0iZmxvYXQ6IHJpZ2h0Ij4KK1NvbWV0aGluZyB0aGF0IHN0YXlzIHJpZ2h0IGFuZCBpcyBub3Qgd3JhcHBlZCBpbiBhIHBhcmEuCis8L2Rpdj4KKworezo6b3B0aW9ucyBwYXJzZV9ibG9ja19odG1sPSJ0cnVlIiAvfQorCis8ZGl2PgorVGhpcyBpcyB3cmFwcGVkIGluIGEgcGFyYS4KKzwvZGl2PgorPHA+CitUaGlzIGNhbiBjb250YWluIG9ubHkgKnNwYW4qIGxldmVsIGVsZW1lbnRzLgorPC9wPgore2tkZXhhbXBsZX0KKworCisjIyBCbG9jayBBdHRyaWJ1dGVzCisKK3trZGxpbms6IHtvaWQ6IGJsb2NrLWlhbHMsIHBhcnQ6ICJibG9jayBJQUxzIn19Cit7a2RsaW5rOiB7b2lkOiBhdHRyaWJ1dGUtbGlzdC1kZWZpbml0aW9ucywgcGFydDogIkFMRHMifX0KKworWW91IGNhbiBhc3NpZ24gYW55IGF0dHJpYnV0ZSB0byBhIGJsb2NrLWxldmVsIGVsZW1lbnQuIEp1c3QgZGlyZWN0bHkgZm9sbG93IHRoZSBibG9jayB3aXRoIGEgKmJsb2NrCitpbmxpbmUgYXR0cmlidXRlIGxpc3QqIChvciBzaG9ydDogYmxvY2sgSUFMKS4gQSBibG9jayBJQUwgY29uc2lzdHMgb2YgYSBsZWZ0IGN1cmx5IGJyYWNlLCBmb2xsb3dlZAorYnkgYSBjb2xvbiwgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBhbmQgYSByaWdodCBjdXJseSBicmFjZS4gSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIHdoaWNoIHNldHMgdGhlCitgdGl0bGVgIGF0dHJpYnV0ZSBvZiBhIGJsb2NrIHF1b3RlOgorCit7a2RleGFtcGxlOjp9Cis+IEEgbmljZSBibG9ja3F1b3RlCit7OiB0aXRsZT0iQmxvY2txdW90ZSB0aXRsZSJ9Cit7a2RleGFtcGxlfQorCitBcyBvbmUgb2Z0ZW4gd2FudHMgdG8gc2V0IG9uZSBvciBtb3JlIENTUyBjbGFzc2VzIG9uIGFuIGVsZW1lbnQsIHRoZXJlIGlzIGFuIGVhc3kgc2hvcnRjdXQ6CisKK3trZGV4YW1wbGU6On0KKz4gQSBuaWNlIGJsb2NrcXVvdGUKK3s6IC5jbGFzczEgLmNsYXNzMn0KK3trZGV4YW1wbGV9CisKK0Egc2hvcnRjdXQgZm9yIHNldHRpbmcgdGhlIElEIGlzIGFsc28gcHJvdmlkZWQuIEp1c3QgcHJlZml4IHRoZSBJRCB3aXRoIGEgaGFzaCBzeW1ib2w6CisKK3trZGV4YW1wbGU6On0KKz4gQSBuaWNlIGJsb2NrcXVvdGUKK3s6ICN3aXRoLWFuLWlkfQore2tkZXhhbXBsZX0KKworU29tZXRpbWVzIG9uZSB3YW50cyB0byB1c2UgdGhlIHNhbWUgYXR0cmlidXRlcyBmb3IgbWFueSBlbGVtZW50cy4ga3JhbWRvd24gYWxsb3dzIHlvdSB0byBkZWZpbmUgdGhlCithdHRyaWJ1dGVzIGluIG9uZSBwbGFjZSB3aXRoIGFuICphdHRyaWJ1dGUgbGlzdCBkZWZpbml0aW9uKiAob3Igc2hvcnQ6IEFMRCkgYW5kIGp1c3QgcmVmZXJlbmNlIHRoaXMKK2RlZmluaXRpb24gaW4gYSBibG9jayBJQUwuIEFuIEFMRCBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGEgYmxvY2sgSUFMIGJ1dCB0aGUgY29sb24gaGFzIHRvIGJlCityZXBsYWNlIHdpdGggYSBjb2xvbiwgdGhlIHJlZmVyZW5jZSBuYW1lIGFuZCBhbm90aGVyIGNvbG9uLiBCeSBqdXN0IHVzaW5nIHRoZSByZWZlcmVuY2UgbmFtZSBhcy1pcworaW4gYSBibG9jayBJQUwsIG9uZSBjYW4gaW5jbHVkZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgcmVmZXJlbmNlZCBBTEQ6CisKK3trZGV4YW1wbGU6On0KK3s6cmVmZGVmOiAuYzEgI2lkIC5jMiB0aXRsZT0idGl0bGUifQorcGFyYWdyYXBoCit7OiByZWZkZWZ9Cit7a2RleGFtcGxlfQorCitUaGUgb3JkZXIgaW4gYSBibG9jayBJQUwgb3IgQUxEIGlzIGltcG9ydGFudCBiZWNhdXNlIGxhdGVyIGRlZmluZWQgYXR0cmlidXRlcyBvdmVyd3JpdGUgKHdpdGggdGhlCitleGNlcHRpb24gb2YgdGhlIHNob3J0Y3V0IGZvciBDU1MgY2xhc3NlcykgcHJpb3IgZGVmaW5lZCBhdHRyaWJ1dGVzOgorCit7a2RleGFtcGxlOjp9Cit7OnJlZmRlZjogLmMxICNpZCAuYzIgdGl0bGU9InRpdGxlIn0KK3BhcmFncmFwaAorezogcmVmZGVmIC5jMyB0aXRsZT0idCIgI3BhcmF9Cit7a2RleGFtcGxlfQorCisKKyMjIEV4dGVuc2lvbnMKKwore2tkbGluazoge29pZDogZXh0ZW5zaW9ucywgcGFydDogImV4dGVuc2lvbnMifX0KKwora3JhbWRvd24gcHJvdmlkZXMgc29tZSBsZXNzIHVzZWQgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIGEgY29tbW9uIHN5bnRheC4gVGhpcyB3aWxsIGFsbG93IHRoZSBlYXN5CithZGRpdGlvbiBvZiBvdGhlciBleHRlbnNpb25zIGlmIG5lZWQgYXJpc2VzLiBDdXJyZW50bHksIHRoZXJlIGFyZSBleHRlbnNpb25zIGZvciBpZ25vcmluZyB0ZXh0IChpLmUuCit0cmVhdGluZyB0ZXh0IGFzIGNvbW1lbnQpLCBmb3IgaW5zZXJ0aW5nIGFyYml0cmFyeSB0ZXh0IGFzLWlzIGludG8gdGhlIG91dHB1dCBhbmQgZm9yIHNldHRpbmcKK2tyYW1kb3duIG9wdGlvbnMuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIGhvdyB0byBpbnNlcnQgY29tbWVudHMgaW50byB0ZXh0OgorCit7a2RleGFtcGxlOjp9CitUaGlzIGlzIGEgcGFyYWdyYXBoCit7Ojpjb21tZW50fQorVGhpcyBpcyBhIGNvbW1lbnQgd2hpY2ggaXMKK2NvbXBsZXRlbHkgaWdub3JlZC4KK3s6L2NvbW1lbnR9CisuLi4gcGFyYWdyYXBoIGNvbnRpbnVlcyBoZXJlLgorCitFeHRlbnNpb25zIGNhbiBhbHNvIGJlIHVzZWQKK2lubGluZSB7Ojpub21hcmtkb3dufSoqc2VlKip7Oi99IQore2tkZXhhbXBsZX0KKworQXMgb25lIGNhbiBzZWUgZnJvbSB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIHN5bnRheCBmb3IgZXh0ZW5zaW9ucyBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHRoYXQgb2YKK0FMRHMuIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIHRyYWlsaW5nIGNvbG9uIGFmdGVyIHRoZSBleHRlbnNpb24gbmFtZSBhbmQgdGhlIGV4dGVuc2lvbiBlbmQgdGFnIG5lZWRzIGEKK3NsYXNoIGJldHdlZW4gdGhlIGNvbG9uIGFuZCB0aGUgZXh0ZW5zaW9uIG5hbWUuIE9uZSBjYW4gYWxzbyB1c2UgdGhlIHNob3J0IGZvcm0gb2YgdGhlIGVuZCB0YWcsIGkuZS4KK2B7Oi99YC4gQXR0cmlidXRlIGRlZmluaXRpb25zIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIHN0YXJ0IHRhZyBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBhIHNwYWNlIGZyb20KK3RoZSBleHRlbnNpb24gbmFtZS4gQWxzbywgaWYgdGhlIGV4dGVuc2lvbiBkb2VzIG5vdCBoYXZlIGEgYm9keSwgdGhlcmUgbmVlZHMgdG8gYmUgYSBzbGFzaCByaWdodAorYmVmb3JlIHRoZSBjbG9zaW5nIGJyYWNlOgorCit7a2RleGFtcGxlOjp9Cit7OjpvcHRpb25zIGF1dG9faWRzPSJmYWxzZSIgL30KKworIyBIZWFkZXIgd2l0aG91dCBpZAore2tkZXhhbXBsZX0KKworCisKKworIyBTcGFuLUxldmVsIEVsZW1lbnRzIC0gVGV4dCBNb2RpZmllcnMKKworIyMgRW1waGFzaXMKKwore2tkbGluazoge29pZDogZW1waGFzaXMsIHBhcnQ6ICJlbXBoYXNpcyJ9fQorCitFbXBoYXNpcyBjYW4gYmUgYWRkZWQgdG8gdGV4dCBieSBzdXJyb3VuZGluZyB0aGUgdGV4dCB3aXRoIGVpdGhlciBhc3Rlcmlza3Mgb3IgdW5kZXJzY29yZXM6CisKK3trZGV4YW1wbGU6On0KK1RoaXMgaXMgKmVtcGhhc2l6ZWQqLAorX3RoaXNfIHRvbyEKK3trZGV4YW1wbGV9CisKK1N0cm9uZyBlbXBoYXNpcyBjYW4gYmUgZG9uZSBieSBkb3VibGluZyB0aGUgZGVsaW1pdGVyczoKKwore2tkZXhhbXBsZTo6fQorVGhpcyBpcyAqKnN0cm9uZyoqLAorX190aGlzX18gdG9vIQore2tkZXhhbXBsZX0KKworVGhlIGZvcm0gd2l0aCB0aGUgYXN0ZXJpc2tzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbWFya3VwIHBhcnRzIG9mIHdvcmRzOgorCit7a2RleGFtcGxlOjp9CitUaGlzIHcqKm9yayoqcyBhcyBleHBlY3RlZCEKK3trZGV4YW1wbGV9CisKKworIyMgTGlua3MgYW5kIEltYWdlcworCit7a2RsaW5rOiB7b2lkOiBsaW5rcy1hbmQtaW1hZ2VzLCBwYXJ0OiAibGlua3MgYW5kIGltYWdlcyJ9fQorCitBIHNpbXBsZSBsaW5rIGNhbiBiZSBjcmVhdGVkIGJ5IHN1cnJvdW5kaW5nIHRoZSB0ZXh0IHdpdGggc3F1YXJlIGJyYWNrZXRzIGFuZCB0aGUgbGluayBVUkwgd2l0aAorcGFyZW50aGVzZXM6CisKK3trZGV4YW1wbGU6On0KK0EgW2xpbmtdKGh0dHA6Ly9rcmFtZG93bi5nZXR0YWxvbmcub3JnKQordG8gdGhlIGtyYW1kb3duIGhvbWVwYWdlLgore2tkZXhhbXBsZX0KKworWW91IGNhbiBhbHNvIGFkZCB0aXRsZSBpbmZvcm1hdGlvbiB0byB0aGUgbGluazoKKwore2tkZXhhbXBsZTo6fQorQSBbbGlua10oaHR0cDovL2tyYW1kb3duLmdldHRhbG9uZy5vcmcgImhwIikKK3RvIHRoZSBob21lcGFnZS4KK3trZGV4YW1wbGV9CisKK1RoZXJlIGlzIGFub3RoZXIgd2F5IHRvIGNyZWF0ZSBsaW5rcyB3aGljaCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIHRleHQgZmxvdy4gVGhlIFVSTCBhbmQgdGl0bGUgYXJlCitkZWZpbmVkIHVzaW5nIGEgcmVmZXJlbmNlIG5hbWUgYW5kIHRoaXMgcmVmZXJlbmNlIG5hbWUgaXMgdGhlbiB1c2VkIGluIHNxdWFyZSBicmFja2V0cyBpbnN0ZWFkIG9mCit0aGUgbGluayBVUkw6CisKK3trZGV4YW1wbGU6On0KK0EgW2xpbmtdW2tyYW1kb3duIGhwXQordG8gdGhlIGhvbWVwYWdlLgorCitba3JhbWRvd24gaHBdOiBodHRwOi8va3JhbWRvd24uZ2V0dGFsb25nLm9yZyAiaHAiCit7a2RleGFtcGxlfQorCitJZiB0aGUgbGluayB0ZXh0IGl0c2VsZiBpcyB0aGUgcmVmZXJlbmNlIG5hbWUsIHRoZSBzZWNvbmQgc2V0IG9mIHNxdWFyZSBicmFja2V0cyBjYW4gYmUgb21pdHRlZDoKKwore2tkZXhhbXBsZTo6fQorQSBsaW5rIHRvIHRoZSBba3JhbWRvd24gaHBdLgorCitba3JhbWRvd24gaHBdOiBodHRwOi8va3JhbWRvd24uZ2V0dGFsb25nLm9yZyAiaHAiCit7a2RleGFtcGxlfQorCitJbWFnZXMgY2FuIGJlIGNyZWF0ZWQgaW4gYSBzaW1pbGFyIHdheToganVzdCB1c2UgYW4gZXhjbGFtYXRpb24gbWFyayBiZWZvcmUgdGhlIHNxdWFyZSBicmFja2V0cy4gVGhlCitsaW5rIHRleHQgd2lsbCBiZWNvbWUgdGhlIGFsdGVybmF0aXZlIHRleHQgb2YgdGhlIGltYWdlIGFuZCB0aGUgbGluayBVUkwgc3BlY2lmaWVzIHRoZSBpbWFnZSBzb3VyY2U6CisKK3trZGV4YW1wbGU6On0KK0FuIGltYWdlOiAhW2dyYXNdKGltZy9pbWFnZS5qcGcpCit7a2RleGFtcGxlfQorCisKKyMjIElubGluZSBDb2RlCisKK3trZGxpbms6IHtvaWQ6IGNvZGUtc3BhbnMsIHBhcnQ6ICJjb2RlIHNwYW5zIn19CisKK1RleHQgcGhyYXNlcyBjYW4gYmUgZWFzaWx5IG1hcmtlZCB1cCBhcyBjb2RlIGJ5IHN1cnJvdW5kaW5nIHRoZW0gd2l0aCBiYWNrdGlja3M6CisKK3trZGV4YW1wbGU6On0KK1VzZSBgS3JhbWRvd246OkRvY3VtZW50Lm5ldyh0ZXh0KS50b19odG1sYAordG8gY29udmVydCB0aGUgYHRleHRgIGluIGtyYW1kb3duCitzeW50YXggdG8gSFRNTC4KK3trZGV4YW1wbGV9CisKK0lmIHlvdSB3YW50IHRvIHVzZSBsaXRlcmFsIGJhY2t0aWNrcyBpbiB5b3VyIGNvZGUsIGp1c3QgdXNlIHR3byBvciBtb3JlIGJhY2t0aWNrcyBhcyBkZWxpbWl0ZXJzLiBUaGUKK3NwYWNlIHJpZ2h0IGFmdGVyIHRoZSBiZWdpbm5pbmcgZGVsaW1pdGVyIGFuZCB0aGUgb25lIHJpZ2h0IGJlZm9yZSB0aGUgY2xvc2luZyBkZWxpbWl0ZXIgYXJlIGlnbm9yZWQ6CisKK3trZGV4YW1wbGU6On0KK1VzZSBiYWNrdGlja3MgdG8gbWFya3VwIGNvZGUsCitlLmcuIGBgIGBjb2RlYCBgYC4KK3trZGV4YW1wbGV9CisKKworIyMgRm9vdG5vdGVzCisKK3trZGxpbms6IHtvaWQ6IGZvb3Rub3RlcywgcGFydDogImZvb3Rub3RlcyJ9fQorCitGb290bm90ZXMgY2FuIGVhc2lseSBiZSB1c2VkIGluIGtyYW1kb3duLiBKdXN0IHNldCBhIGZvb3Rub3RlIG1hcmtlciAoY29uc2lzdHMgb2Ygc3F1YXJlIGJyYWNrZXRzCit3aXRoIGEgY2FyZXQgYW5kIHRoZSBmb290bm90ZSBuYW1lIGluc2lkZSkgaW4gdGhlIHRleHQgYW5kIHNvbWV3aGVyZSBlbHNlIHRoZSBmb290bm90ZSBkZWZpbml0aW9uICh3aGljaAorYmFzaWNhbGx5IGxvb2tzIGxpa2UgYSByZWZlcmVuY2UgbGluayBkZWZpbml0aW9uKToKKwore2tkZXhhbXBsZTo6fQorVGhpcyBpcyBhIHRleHQgd2l0aCBhCitmb290bm90ZVteMV0uCisKK1teMV06IEFuZCBoZXJlIGlzIHRoZSBkZWZpbml0aW9uLgore2tkZXhhbXBsZX0KKworVGhlIGZvb3Rub3RlIGRlZmluaXRpb24gY2FuIGNvbnRhaW4gYW55IGJsb2NrLWxldmVsIGVsZW1lbnQsIGFsbCBsaW5lcyBmb2xsb3dpbmcgYSBmb290bm90ZQorZGVmaW5pdGlvbiBpbmRlbnRlZCB3aXRoIGZvdXIgc3BhY2VzIG9yIG9uZSB0YWIgYmVsb25nIHRvIHRoZSBkZWZpbml0aW9uOgorCit7a2RleGFtcGxlOjp9CitUaGlzIGlzIGEgdGV4dCB3aXRoIGEKK2Zvb3Rub3RlW14yXS4KKworW14yXToKKyAgICBBbmQgaGVyZSBpcyB0aGUgZGVmaW5pdGlvbi4KKworICAgID4gV2l0aCBhIHF1b3RlIQore2tkZXhhbXBsZX0KKworQXMgY2FuIGJlIHNlZW4gYWJvdmUgdGhlIGZvb3Rub3RlIG5hbWUgaXMgb25seSB1c2VkIGZvciB0aGUgYW5jaG9ycyBhbmQgdGhlIG51bWJlcmluZyBpcyBkb25lCithdXRvbWF0aWNhbGx5IGluIGRvY3VtZW50IG9yZGVyLiAgUmVwZWF0ZWQgZm9vdG5vdGUgbWFya2VycyB3aWxsIGxpbmsgdG8gdGhlIHNhbWUgZm9vdG5vdGUKK2RlZmluaXRpb24uCisKKworIyMgQWJicmV2aWF0aW9ucworCit7a2RsaW5rOiB7b2lkOiBhYmJyZXZpYXRpb25zLCBwYXJ0OiAiYWJicmV2aWF0aW9ucyJ9fQorCitBYmJyZXZpYXRpb25zIHdpbGwgd29yayBvdXQgb2YgdGhlIGJveCBvbmNlIHlvdSBhZGQgYW4gYWJicmV2aWF0aW9uIGRlZmluaXRpb24uIFNvIHlvdSBjYW4ganVzdAord3JpdGUgdGhlIHRleHQgYW5kIGFkZCB0aGUgZGVmaW5pdGlvbnMgbGF0ZXIgb24uCisKK3trZGV4YW1wbGU6On0KK1RoaXMgaXMgYW4gSFRNTAorZXhhbXBsZS4KKworKltIVE1MXTogSHlwZXIgVGV4dCBNYXJrdXAgTGFuZ3VhZ2UKK3trZGV4YW1wbGV9CisKKworIyMgSFRNTCBFbGVtZW50cworCit7a2RsaW5rOiB7b2lkOiBodG1sLXNwYW5zLCBwYXJ0OiAiSFRNTCBzcGFucyJ9fQorCitIVE1MIGlzIG5vdCBvbmx5IHN1cHBvcnRlZCBvbiB0aGUgYmxvY2stbGV2ZWwgYnV0IGFsc28gb24gdGhlIHNwYW4tbGV2ZWw6CisKK3trZGV4YW1wbGU6On0KK1RoaXMgaXMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPndyaXR0ZW4gaW4KK3JlZDwvc3Bhbj4uCit7a2RleGFtcGxlfQorCisKKyMjIElubGluZSBBdHRyaWJ1dGVzCisKK3trZGxpbms6IHtvaWQ6IHNwYW4taWFscywgcGFydDogInNwYW4gSUFMcyJ9fQorCitBcyB3aXRoIGEgYmxvY2stbGV2ZWwgZWxlbWVudCB5b3UgY2FuIGFzc2lnbiBhbnkgYXR0cmlidXRlIHRvIGEgc3Bhbi1sZXZlbCBlbGVtZW50cyB1c2luZyBhICpzcGFuCitpbmxpbmUgYXR0cmlidXRlIGxpc3QqIChvciBzaG9ydDogc3BhbiBJQUwpLiBBIHNwYW4gSUFMIGhhcyB0aGUgc2FtZSBzeW50YXggYXMgYSBibG9jayBJQUwgYW5kIG11c3QKK2ltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgc3Bhbi1sZXZlbCBlbGVtZW50OgorCit7a2RleGFtcGxlOjp9CitUaGlzIGlzICpyZWQqezogc3R5bGU9ImNvbG9yOiByZWQifS4KK3trZGV4YW1wbGV9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL3NpZGViYXIudGVtcGxhdGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL3NpZGViYXIudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmMzUzMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2Mvc2lkZWJhci50ZW1wbGF0ZQpAQCAtMCwwICsxLDI1IEBACis8aDI+U3VwcG9ydCBrcmFtZG93bjwvaDI+CisKKzxwPklmIHlvdSBsaWtlIGtyYW1kb3duIGFuZCB3b3VsZCBsaWtlIHRvIHN1cHBvcnQgaXQsIHlvdSBhcmUgd2VsY29tZSB0byBtYWtlIGEgc21hbGwKK2RvbmF0aW9uIChQYXRyZW9uLCBQYXlQYWwgb3IgUGxlZGdpZSkgLS0gaXQgd2lsbCBzdXJlbHkgYmUgYXBwcmVjaWF0ZWQhIFRoYW5rcyE8L3A+CisKKzxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CisKKzxhIGhyZWY9Imh0dHBzOi8vd3d3LnBhdHJlb24uY29tL2JlUGF0cm9uP3U9NDkwODk2MyIgY2xhc3M9InBhdHJlb24iPkJlY29tZSBhIFBhdHJvbiE8L2E+CisKKzxmb3JtIHN0eWxlPSJtYXJnaW4tdG9wOiAxNXB4IiBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSJfdG9wIj4KKzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayI+Cis8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJob3N0ZWRfYnV0dG9uX2lkIiB2YWx1ZT0iOTlIVVdLV1BNVUhXRyI+Cis8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZW5fVVMvaS9idG4vYnRuX2RvbmF0ZV9TTS5naWYiIGJvcmRlcj0iMCIgbmFtZT0ic3VibWl0IiBhbHQ9IlBheVBhbCAtIFRoZSBzYWZlciwgZWFzaWVyIHdheSB0byBwYXkgb25saW5lISI+Cis8aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZGVfREUvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KKzwvZm9ybT4KKworPGEgaHJlZj0naHR0cHM6Ly9wbGVkZ2llLmNvbS9jYW1wYWlnbnMvMTY2NTcnPjxpbWcgYWx0PSdDbGljayBoZXJlIHRvIGxlbmQgeW91ciBzdXBwb3J0IHRvOiBrcmFtZG93biBhbmQgbWFrZSBhIGRvbmF0aW9uIGF0IHBsZWRnaWUuY29tICEnIHNyYz0naHR0cHM6Ly9wbGVkZ2llLmNvbS9jYW1wYWlnbnMvMTY2NTcucG5nP3NraW5fbmFtZT1jaHJvbWUnIGJvcmRlcj0nMCcgPjwvYT4KKworPC9kaXY+CisKKzxoMj5TcG9uc29yczwvaDI+CisKKzxwPkdST1NTV0VCRVIgcHJvdmlkZXMgPGEgaHJlZj0iaHR0cDovL2dyb3Nzd2ViZXIuY29tL2Iva3JhbWRvd24iIHRhcmdldD0iX2JsYW5rIj5zb2Z0d2FyZQorZGV2ZWxvcG1lbnQgY29uc3VsdGluZyBhbmQgdHJhaW5pbmcgc2VydmljZXM8L2E+LiA8ZW0+V2UgbGlrZSB0byB3b3JrIG9uIG9wZW4gc291cmNlLiBXZSB1c2UgaXQgaGVhdmlseS4KK1dlIGxvdmUga3JhbWRvd24hPC9lbT48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL3NpdGVtYXAuc2l0ZW1hcCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2Mvc2l0ZW1hcC5zaXRlbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTk3NTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL3NpdGVtYXAuc2l0ZW1hcApAQCAtMCwwICsxLDUgQEAKKy0tLQorZW50cmllczoKKyAgYWxjbjogLyoqLyouaHRtbAorZGVmYXVsdF9jaGFuZ2VfZnJlcTogbW9udGhseQorLS0tCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL3N5bnRheC5wYWdlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9zeW50YXgucGFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNjNDQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy9zeW50YXgucGFnZQpAQCAtMCwwICsxLDE3OTUgQEAKKy0tLQordGl0bGU6IFN5bnRheAoraW5fbWVudTogdHJ1ZQorc29ydF9pbmZvOiAxMAorLS0tIG5hbWU6c2lkZWJhcgorPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPgorPGEgaHJlZj0iaHR0cHM6Ly93d3cucGF0cmVvbi5jb20vYmVQYXRyb24/dT00OTA4OTYzIiBjbGFzcz0icGF0cmVvbiI+QmVjb21lIGEgUGF0cm9uITwvYT4KKzwvZGl2PgorCis8aDE+Q29udGVudHM8L2gxPgorCit7bWVudToge29wdGlvbnM6IHtkZXNjZW5kYW50czogdHJ1ZSwgbGV2ZWxzOiBbMiw2XX19fQorLS0tIG5hbWU6Y29udGVudAorCisjIGtyYW1kb3duIFN5bnRheAorCitUaGlzIGlzIHZlcnNpb24gKio8JT0gOjpLcmFtZG93bjo6VkVSU0lPTiAlPioqIG9mIHRoZSBzeW50YXggZG9jdW1lbnRhdGlvbi4KKworVGhlIGtyYW1kb3duIHN5bnRheCBpcyBiYXNlZCBvbiB0aGUgTWFya2Rvd24gc3ludGF4IGFuZCBoYXMgYmVlbiBlbmhhbmNlZCB3aXRoIGZlYXR1cmVzIHRoYXQgYXJlCitmb3VuZCBpbiBvdGhlciBNYXJrZG93biBpbXBsZW1lbnRhdGlvbnMgbGlrZSBbTWFydWt1XSwgW1BIUCBNYXJrZG93biBFeHRyYV0gYW5kIFtQYW5kb2NdLiBIb3dldmVyLAoraXQgc3RyaXZlcyB0byBwcm92aWRlIGEgc3RyaWN0IHN5bnRheCB3aXRoIGRlZmluaXRlIHJ1bGVzIGFuZCB0aGVyZWZvcmUgaXNuJ3QgY29tcGxldGVseSBjb21wYXRpYmxlCit3aXRoIE1hcmtkb3duLiBOb25ldGhlbGVzcywgbW9zdCBNYXJrZG93biBkb2N1bWVudHMgc2hvdWxkIHdvcmsgZmluZSB3aGVuIHBhcnNlZCB3aXRoIGtyYW1kb3duLiBBbGwKK3BsYWNlcyB3aGVyZSB0aGUga3JhbWRvd24gc3ludGF4IGRpZmZlcnMgZnJvbSB0aGUgTWFya2Rvd24gc3ludGF4IGFyZSBoaWdobGlnaHRlZC4KKworRm9sbG93aW5nIGlzIHRoZSBjb21wbGV0ZSBzeW50YXggZGVmaW5pdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGtyYW1kb3duIHN1cHBvcnRzLiBUb2dldGhlciB3aXRoIHRoZQorZG9jdW1lbnRhdGlvbiBvbiB0aGUgYXZhaWxhYmxlIGNvbnZlcnRlcnMsIGl0IGlzIGNsZWFybHkgc3BlY2lmaWVkIHdoYXQgeW91IHdpbGwgZ2V0IHdoZW4gYSBrcmFtZG93bgorZG9jdW1lbnQgaXMgY29udmVydGVkLgorCisKKyMjIFNvdXJjZSBUZXh0IEZvcm1hdHRpbmcKKworQSBrcmFtZG93biBkb2N1bWVudCBtYXkgYmUgaW4gYW55IGVuY29kaW5nLCBmb3IgZXhhbXBsZSBBU0NJSSwgVVRGLTggb3IgSVNPLTg4NTktMSwgYW5kIHRoZSBvdXRwdXQKK3dpbGwgaGF2ZSB0aGUgc2FtZSBlbmNvZGluZyBhcyB0aGUgc291cmNlLgorCitUaGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgdHdvIHR5cGVzIG9mIGVsZW1lbnRzLCBibG9jay1sZXZlbCBlbGVtZW50cyBhbmQgc3Bhbi1sZXZlbCBlbGVtZW50czoKKworKiBCbG9jay1sZXZlbCBlbGVtZW50cyBkZWZpbmUgdGhlIG1haW4gc3RydWN0dXJlIG9mIHRoZSBjb250ZW50LCBmb3IgZXhhbXBsZSwgd2hhdCBwYXJ0IG9mIHRoZSB0ZXh0CisgIHNob3VsZCBiZSBhIHBhcmFncmFwaCwgYSBsaXN0LCBhIGJsb2NrcXVvdGUgYW5kIHNvIG9uLgorCisqIFNwYW4tbGV2ZWwgZWxlbWVudHMgbWFyayB1cCBzbWFsbCB0ZXh0IHBhcnRzIGFzLCBmb3IgZXhhbXBsZSwgZW1waGFzaXplZCB0ZXh0IG9yIGEgbGluay4KKworVGh1cyBzcGFuLWxldmVsIGVsZW1lbnRzIGNhbiBvbmx5IG9jY3VyIGluc2lkZSBibG9jay1sZXZlbCBlbGVtZW50cyBvciBvdGhlciBzcGFuLWxldmVsIGVsZW1lbnRzLgorCitZb3Ugd2lsbCBvZnRlbiBmaW5kIHJlZmVyZW5jZXMgdG8gdGhlICJmaXJzdCBjb2x1bW4iIG9yICJmaXJzdCBjaGFyYWN0ZXIiIG9mIGEgbGluZSBpbiBhIGJsb2NrLWxldmVsCitlbGVtZW50IGRlc2NyaXB0aW9ucy4gU3VjaCBhIHJlZmVyZW5jZSBpcyBhbHdheXMgdG8gYmUgdGFrZW4gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgaW5kZW50YXRpb24KK2xldmVsIGJlY2F1c2Ugc29tZSBibG9jay1sZXZlbCBlbGVtZW50cyBvcGVuIHVwIGEgbmV3IGluZGVudGF0aW9uIGxldmVsIChlLmcuIGJsb2NrcXVvdGVzKS4gVGhlCitiZWdpbm5pbmcgb2YgYSBrcmFtZG93biBkb2N1bWVudCBvcGVucyB1cCB0aGUgZGVmYXVsdCBpbmRlbnRhdGlvbiBsZXZlbCB3aGljaCBiZWdpbnMgYXQgdGhlIGZpcnN0Citjb2x1bW4gb2YgdGhlIHRleHQuCisKKworIyMjIExpbmUgV3JhcHBpbmcKKworU29tZSBsaWdodHdlaWdodCBtYXJrdXAgc3ludGF4IGRvbid0IHdvcmsgd2VsbCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgbGluZXMgYXJlIGhhcmQtd3JhcHBlZC4gRm9yCitleGFtcGxlLCB0aGlzIGlzIHRoZSBjYXNlIHdpdGggbWFueSBlbWFpbCBwcm9ncmFtcy4gVGhlcmVmb3JlIGtyYW1kb3duIGFsbG93cyBjb250ZW50IGxpa2UKK3BhcmFncmFwaHMgb3IgYmxvY2txdW90ZXMgdG8gYmUgaGFyZC13cmFwcGVkLCBpLmUuIGJyb2tlbiBhY3Jvc3MgbGluZXMuIFRoaXMgaXMgc29tZXRpbWVzIHJlZmVycmVkCit0byBhcyAibGF6eSBzeW50YXgiIHNpbmNlIHRoZSBpbmRlbnRhdGlvbiBvciBsaW5lIHByZWZpeCByZXF1aXJlZCBmb3IgdGhlIGZpcnN0IGxpbmUgb2YgY29udGVudCBpcworbm90IHJlcXVpcmVkIGZvciB0aGUgY29uc2VjdXRpdmUgbGluZXMuCisKK0Jsb2NrLWxldmVsIGVsZW1lbnRzIHRoYXQgc3VwcG9ydCBsaW5lIHdyYXBwaW5nIGFsd2F5cyBlbmQgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzCittZXQ6CisKKyogYSBbYmxhbmsgbGluZV0oI2JsYW5rLWxpbmVzKSwgYW4gW0VPQiBtYXJrZXIgbGluZV0oI2VvYi1tYXJrZXIpLCBhIFtibG9jayBJQUxdKCNibG9jay1pYWxzKSBvciB0aGUKKyAgZW5kIG9mIHRoZSBkb2N1bWVudCAoaS5lLiBhIFtibG9jayBib3VuZGFyeV0oI2Jsb2NrLWJvdW5kYXJpZXMpKSwKKworKiAgb3IgYW4gW0hUTUwgYmxvY2tdKCNodG1sLWJsb2NrcykuCisKK0xpbmUgd3JhcHBpbmcgaXMgYWxsb3dlZCB0aHJvdWdob3V0IGEga3JhbWRvd24gZG9jdW1lbnQgYnV0IHRoZXJlIGFyZSBzb21lIGJsb2NrLWxldmVsIGVsZW1lbnRzIHRoYXQKK2RvICpub3QqIHN1cHBvcnQgYmVpbmcgaGFyZC13cmFwcGVkOgorCitbaGVhZGVyc10oI2hlYWRlcnMpCisKKzogVGhpcyBpcyBub3QgYW4gaXNzdWUgaW4gbW9zdCBzaXR1YXRpb25zIHNpbmNlIGhlYWRlcnMgbm9ybWFsbHkgZml0IG9uIG9uZSBsaW5lLiBJZiBhIGhlYWRlciB0ZXh0CisgIGdldHMgdG9vIGxvbmcgZm9yIG9uZSBsaW5lLCB5b3UgbmVlZCB0byB1c2UgSFRNTCBzeW50YXggaW5zdGVhZC4KKworW2ZlbmNlZCBjb2RlIGJsb2Nrc10oI2ZlbmNlZC1jb2RlLWJsb2NrcykKKworOiBUaGUgZGVsaW1pdGluZyBsaW5lcyBvZiBhIGZlbmNlZCBjb2RlIGJsb2NrIGRvIG5vdCBzdXBwb3J0IGhhcmQtd3JhcHBpbmcuIFNpbmNlIGV2ZXJ5dGhpbmcgYmV0d2VlbgorICB0aGUgZGVsaW1pdGluZyBsaW5lcyBpcyB0YWtlbiBhcyBpcywgdGhlIGNvbnRlbnQgb2YgYSBmZW5jZWQgY29kZSBibG9jayBkb2VzIGFsc28gbm90IHN1cHBvcnQKKyAgaGFyZC13cmFwcGluZy4KKworW2RlZmluaXRpb24gbGlzdCB0ZXJtc10oI2RlZmluaXRpb24tbGlzdHMpCisKKzogRWFjaCBkZWZpbml0aW9uIHRlcm0gaGFzIHRvIGFwcGVhciBvbiBhIHNlcGFyYXRlIGxpbmUuIEhhcmQtd3JhcHBpbmcgd291bGQgdGhlcmVmb3JlIGludHJvZHVjZQorICBhZGRpdGlvbmFsIGRlZmluaXRpb24gdGVybXMuIFRoZSBkZWZpbml0aW9ucyB0aGVtc2VsdmVzLCBob3dldmVyLCBkbyBzdXBwb3J0IGhhcmQtd3JhcHBpbmcuCisKK1t0YWJsZXNdKCN0YWJsZXMpCisKKzogU2luY2UgZWFjaCBsaW5lIG9mIGEga3JhbWRvd24gdGFibGUgZGVzY3JpYmVzIG9uZSB0YWJsZSByb3cgb3IgYSBzZXBhcmF0b3IsIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworICBoYXJkLXdyYXAgdGFibGVzLgorCisqKk5vdGUqKiB0aGF0IGl0IGlzICoqTk9UKiogcmVjb21tZW5kZWQgdG8gdXNlIGxhenkgc3ludGF4IHRvIHdyaXRlIGEga3JhbWRvd24gZG9jdW1lbnQuIFRoZQorZmxleGliaWxpdHkgdGhhdCB0aGUga3JhbWRvd24gc3ludGF4IG9mZmVycyBkdWUgdG8gdGhlIGlzc3VlIG9mIGxpbmUgd3JhcHBpbmcgaGluZGVycyByZWFkYWJpbGl0eQorYW5kIHNob3VsZCB0aGVyZWZvcmUgbm90IGJlIHVzZWQuCisKKworIyMjIFVzYWdlIG9mIFRhYnMKKwora3JhbWRvd24gYXNzdW1lcyB0aGF0IHRhYiBzdG9wcyBhcmUgc2V0IGF0IG11bHRpcGxlcyBvZiBmb3VyLiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4KK3VzaW5nIHRhYnMgZm9yIGluZGVudGF0aW9uIGluIGxpc3RzLiBBbHNvLCB0YWJzIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2hlbgoraW5kZW50aW5nIHRleHQgYW5kIG11c3Qgbm90IGJlIHByZWNlZGVkIGJ5IHNwYWNlcy4gT3RoZXJ3aXNlIHRoZSByZXN1bHRzIG1heSBiZSB1bmV4cGVjdGVkLgorCisKKyMjIyBBdXRvbWF0aWMgYW5kIE1hbnVhbCBFc2NhcGluZworCitEZXBlbmRpbmcgb24gdGhlIG91dHB1dCBmb3JtYXQsIHRoZXJlIGFyZSBvZnRlbiBjaGFyYWN0ZXJzIHRoYXQgbmVlZCBzcGVjaWFsIHRyZWF0bWVudC4gRm9yIGV4YW1wbGUsCit3aGVuIGNvbnZlcnRpbmcgYSBrcmFtZG93biBkb2N1bWVudCB0byBIVE1MIG9uZSBuZWVkcyB0byB0YWtlIGNhcmUgb2YgdGhlIGNoYXJhY3RlcnMgYDxgLCBgPmAgYW5kCitgJmAuIFRvIGVhc2Ugd29ya2luZyB3aXRoIHRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycywgdGhleSBhcmUgYXV0b21hdGljYWxseSBhbmQgY29ycmVjdGx5IGVzY2FwZWQKK2RlcGVuZGluZyBvbiB0aGUgb3V0cHV0IGZvcm1hdC4KKworVGhpcyBtZWFucywgZm9yIGV4YW1wbGUsIHRoYXQgeW91IGNhbiBqdXN0IHVzZSBgPGAsIGA+YCBhbmQgYCZgIGluIGEga3JhbWRvd24gZG9jdW1lbnQgYW5kIG5lZWQgbm90Cit0aGluayBhYm91dCB3aGVuIHRvIHVzZSB0aGVpciBIVE1MIGVudGl0eSBjb3VudGVycGFydHMuIEhvd2V2ZXIsIGlmIHlvdSAqZG8gdXNlKiBIVE1MIGVudGl0aWVzIG9yCitIVE1MIHRhZ3Mgd2hpY2ggdXNlIG9uZSBvZiB0aGUgY2hhcmFjdGVycywgdGhlIHJlc3VsdCB3aWxsIGJlIGNvcnJlY3Qgbm9uZXRoZWxlc3MhCisKK1NpbmNlIGtyYW1kb3duIGFsc28gdXNlcyBzb21lIGNoYXJhY3RlcnMgdG8gbWFyay11cCB0aGUgdGV4dCwgdGhlcmUgbmVlZHMgdG8gYmUgYSB3YXkgdG8gZXNjYXBlCit0aGVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgc28gdGhhdCB0aGV5IGNhbiBoYXZlIHRoZWlyIG5vcm1hbCBtZWFuaW5nLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHVzaW5nCitiYWNrc2xhc2ggZXNjYXBlcy4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIGEgbGl0ZXJhbCBiYWNrIHRpY2sgbGlrZSB0aGlzOgorCisgICAgVGhpcyBcYGlzIG5vdCBhIGNvZGVcYCBzcGFuIQorCitGb2xsb3dpbmcgaXMgYSBsaXN0IG9mIGFsbCB0aGUgY2hhcmFjdGVycyAoY2hhcmFjdGVyIHNlcXVlbmNlcykgdGhhdCBjYW4gYmUgZXNjYXBlZDoKKworICAgIFwgICAgICAgICBiYWNrc2xhc2gKKyAgICAuICAgICAgICAgcGVyaW9kCisgICAgKiAgICAgICAgIGFzdGVyaXNrCisgICAgXyAgICAgICAgIHVuZGVyc2NvcmUKKyAgICArICAgICAgICAgcGx1cworICAgIC0gICAgICAgICBtaW51cworICAgID0gICAgICAgICBlcXVhbCBzaWduCisgICAgYCAgICAgICAgIGJhY2sgdGljaworICAgICgpW117fTw+ICBsZWZ0IGFuZCByaWdodCBwYXJlbnMvYnJhY2tldHMvYnJhY2VzL2FuZ2xlIGJyYWNrZXRzCisgICAgIyAgICAgICAgIGhhc2gKKyAgICAhICAgICAgICAgYmFuZworICAgIDw8ICAgICAgICBsZWZ0IGd1aWxsZW1ldAorICAgID4+ICAgICAgICByaWdodCBndWlsbGVtZXQKKyAgICA6ICAgICAgICAgY29sb24KKyAgICB8ICAgICAgICAgcGlwZQorICAgICIgICAgICAgICBkb3VibGUgcXVvdGUKKyAgICAnICAgICAgICAgc2luZ2xlIHF1b3RlCisgICAgJCAgICAgICAgIGRvbGxhciBzaWduCisKKworIyMgQmxvY2sgQm91bmRhcmllcworCitTb21lIGJsb2NrLWxldmVsIGVsZW1lbnRzIGhhdmUgdG8gc3RhcnQgYW5kL29yIGVuZCBvbiBzbyBjYWxsZWQgYmxvY2sgYm91bmRhcmllcywgYXMgc3RhdGVkIGluIHRoZWlyCitkb2N1bWVudGF0aW9uLiBUaGVyZSBhcmUgdHdvIGNhc2VzIHdoZXJlIGJsb2NrIGJvdW5kYXJpZXMgY29tZSBpbnRvIHBsYXk6CisKKyogSWYgYSBibG9jay1sZXZlbCBlbGVtZW50IGhhcyB0byBzdGFydCBvbiBhIGJsb2NrIGJvdW5kYXJ5LCBpdCBoYXMgdG8gYmUgcHJlY2VkZWQgYnkgZWl0aGVyIGEKKyAgW2JsYW5rIGxpbmVdKCNibGFuay1saW5lcyksIGFuIFtFT0IgbWFya2VyXSgjZW9iLW1hcmtlciksIGEgW2Jsb2NrIElBTF0oI2Jsb2NrLWlhbHMpIG9yIGl0IGhhcyB0bworICBiZSB0aGUgZmlyc3QgZWxlbWVudC4KKworKiBJZiBhIGJsb2NrLWxldmVsIGVsZW1lbnQgaGFzIHRvIGVuZCBvbiBhIGJsb2NrIGJvdW5kYXJ5LCBpdCBoYXMgdG8gYmUgZm9sbG93ZWQgYnkgZWl0aGVyIGEgW2JsYW5rCisgIGxpbmVdKCNibGFuay1saW5lcyksIGFuIFtFT0IgbWFya2VyXSgjZW9iLW1hcmtlciksIGEgW2Jsb2NrIElBTF0oI2Jsb2NrLWlhbHMpIG9yIGl0IGhhcyB0byBiZSB0aGUKKyAgbGFzdCBlbGVtZW50LgorCisKKworIyBTdHJ1Y3R1cmFsIEVsZW1lbnRzCisKK0FsbCBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFyZSBibG9jay1sZXZlbCBlbGVtZW50cyBhbmQgdGhleSBhcmUgdXNlZCB0byBzdHJ1Y3R1cmUgdGhlIGNvbnRlbnQuIFRoZXkKK2NhbiBtYXJrIHVwIHNvbWUgdGV4dCBhcywgZm9yIGV4YW1wbGUsIGEgc2ltcGxlIHBhcmFncmFwaCwgYSBxdW90ZSBvciBhcyBhIGxpc3QgaXRlbS4KKworCisjIyBCbGFuayBsaW5lcworCitBbnkgbGluZSB0aGF0IGp1c3QgY29udGFpbnMgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyBzdWNoIGFzIHNwYWNlcyBhbmQgdGFicyBpcyBjb25zaWRlcmVkIGEgYmxhbmsKK2xpbmUgYnkga3JhbWRvd24uIE9uZSBvciBtb3JlIGNvbnNlY3V0aXZlIGJsYW5rIGxpbmVzIGFyZSBoYW5kbGVkIGFzIG9uZSBlbXB0eSBibGFuayBsaW5lLiBCbGFuaworbGluZXMgYXJlIHVzZWQgdG8gc2VwYXJhdGUgYmxvY2stbGV2ZWwgZWxlbWVudHMgZnJvbSBlYWNoIG90aGVyIGFuZCBpbiB0aGlzIGNhc2UgdGhleSBkb24ndCBoYXZlCitzZW1hbnRpYyBtZWFuaW5nLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBibGFuayBsaW5lcyBkbyBoYXZlIGEgc2VtYW50aWMgbWVhbmluZzoKKworKiBXaGVuIHVzZWQgaW4gaGVhZGVycyAtLSBzZWUgdGhlIFtoZWFkZXJzIHNlY3Rpb25dKCNoZWFkZXJzKQorKiBXaGVuIHVzZWQgaW4gY29kZSBibG9ja3MgLS0gc2VlIHRoZSBbY29kZSBibG9ja3Mgc2VjdGlvbl0oI2NvZGUtYmxvY2tzKQorKiBXaGVuIHVzZWQgaW4gbGlzdHMgLS0gc2VlIHRoZSBbbGlzdHMgc2VjdGlvbl0oI2xpc3RzKQorKiBXaGVuIHVzZWQgaW4gbWF0aCBibG9ja3MgLS0gc2VlIHRoZSBbbWF0aCBibG9ja3Mgc2VjdGlvbl0oI21hdGgtYmxvY2tzKQorKiBXaGVuIHVzZWQgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0byBzdGFydC9lbmQgb24gW2Jsb2NrIGJvdW5kYXJpZXNdKCNibG9jay1ib3VuZGFyaWVzKQorCisKKyMjIFBhcmFncmFwaHMKKworUGFyYWdyYXBocyBhcmUgdGhlIG1vc3QgdXNlZCBibG9jay1sZXZlbCBlbGVtZW50cy4gT25lIG9yIG1vcmUgY29uc2VjdXRpdmUgbGluZXMgb2YgdGV4dCBhcmUKK2ludGVycHJldGVkIGFzIG9uZSBwYXJhZ3JhcGguIFRoZSBmaXJzdCBsaW5lIG9mIGEgcGFyYWdyYXBoIG1heSBiZSBpbmRlbnRlZCB1cCB0byB0aHJlZSBzcGFjZXMsIHRoZQorb3RoZXIgbGluZXMgY2FuIGhhdmUgYW55IGFtb3VudCBvZiBpbmRlbnRhdGlvbiBiZWNhdXNlIHBhcmFncmFwaHMgc3VwcG9ydCBbbGluZQord3JhcHBpbmddKCNsaW5lLXdyYXBwaW5nKS4gSW4gYWRkaXRpb24gdG8gdGhlIHJ1bGVzIG91dGxpbmVkIGluIHRoZSBzZWN0aW9uIGFib3V0IGxpbmUgd3JhcHBpbmcsIGEKK3BhcmFncmFwaCBlbmRzIHdoZW4gYSBbZGVmaW5pdGlvbiBsaXN0IGxpbmVdKCNkZWZpbml0aW9uLWxpc3RzKSBpcyBlbmNvdW50ZXJlZC4KKworWW91IGNhbiBzZXBhcmF0ZSB0d28gY29uc2VjdXRpdmUgcGFyYWdyYXBocyBmcm9tIGVhY2ggb3RoZXIgYnkgdXNpbmcgb25lIG9yIG1vcmUgYmxhbmsgbGluZXMuIE5vdGljZQordGhhdCBhIGxpbmUgYnJlYWsgaW4gdGhlIHNvdXJjZSBkb2VzIG5vdCBtZWFuIGEgbGluZSBicmVhayBpbiB0aGUgb3V0cHV0IChkdWUgdG8gdGhlIFtsYXp5CitzeW50YXhdKCNsaW5lLXdyYXBwaW5nKSkhLiBJZiB5b3Ugd2FudCB0byBoYXZlIGFuIGV4cGxpY2l0IGxpbmUgYnJlYWsgKGkuZS4gYSBgPGJyIC8+YCB0YWcpIHlvdSBuZWVkCit0byBlbmQgYSBsaW5lIHdpdGggdHdvIG9yIG1vcmUgc3BhY2VzIG9yIHR3byBiYWNrc2xhc2hlcyEgTm90ZSwgaG93ZXZlciwgdGhhdCBhIGxpbmUgYnJlYWsgb24gdGhlCitsYXN0IHRleHQgbGluZSBvZiBhIHBhcmFncmFwaCBpcyBub3QgcG9zc2libGUgYW5kIHdpbGwgYmUgaWdub3JlZC4gTGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIHdpbGwKK2JlIHN0cmlwcGVkIGZyb20gdGhlIHBhcmFncmFwaCB0ZXh0LgorCitUaGUgZm9sbG93aW5nIGdpdmVzIHlvdSBhbiBleGFtcGxlIG9mIGhvdyBwYXJhZ3JhcGhzIGxvb2sgbGlrZToKKworICAgIFRoaXMgcGFyYSBsaW5lIHN0YXJ0cyBhdCB0aGUgZmlyc3QgY29sdW1uLiBIb3dldmVyLAorICAgICAgICAgIHRoZSBmb2xsb3dpbmcgbGluZXMgY2FuIGJlIGluZGVudGVkIGFueSBudW1iZXIgb2Ygc3BhY2VzL3RhYnMuCisgICAgICAgVGhlIHBhcmEgY29udGludWVzIGhlcmUuCisKKyAgICAgIFRoaXMgaXMgYW5vdGhlciBwYXJhZ3JhcGgsIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGFib3ZlIG9uZS4gQnV0ICAKKyAgICB3aXRoIGEgaGFyZCBsaW5lIGJyZWFrLiBcXAorICAgIEFuZCBhbm90aGVyIG9uZS4KK3s6IC5zaG93LXdoaXRlc3BhY2VzIC53cy1scn0KKworCisjIyBIZWFkZXJzCisKK2tyYW1kb3duIHN1cHBvcnRzIHNvIGNhbGxlZCBTZXRleHQgc3R5bGUgYW5kIGF0eCBzdHlsZSBoZWFkZXJzLiBCb3RoIGZvcm1zIGNhbiBiZSB1c2VkIGluc2lkZSBhCitzaW5nbGUgZG9jdW1lbnQuCisKKyMjIyBTZXRleHQgU3R5bGUKKworU2V0ZXh0IHN0eWxlIGhlYWRlcnMgaGF2ZSB0byBzdGFydCBvbiBhIFtibG9jayBib3VuZGFyeV0oI2Jsb2NrLWJvdW5kYXJpZXMpIHdpdGggYSBsaW5lIG9mIHRleHQgKHRoZQoraGVhZGVyIHRleHQpIGFuZCBhIGxpbmUgd2l0aCBvbmx5IGVxdWFsIHNpZ25zIChmb3IgYSBmaXJzdCBsZXZlbCBoZWFkZXIpIG9yIGRhc2hlcyAoZm9yIGEgc2Vjb25kCitsZXZlbCBoZWFkZXIpLiBUaGUgaGVhZGVyIHRleHQgbWF5IGJlIGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcyBidXQgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzCithcmUgc3RyaXBwZWQgZnJvbSB0aGUgaGVhZGVyIHRleHQuIFRoZSBhbW91bnQgb2YgZXF1YWwgc2lnbnMgb3IgZGFzaGVzIGlzIG5vdCBzaWduaWZpY2FudCwganVzdCBvbmUKK2lzIGVub3VnaCBidXQgbW9yZSBtYXkgbG9vayBiZXR0ZXIuIFRoZSBlcXVhbCBzaWducyBvciBkYXNoZXMgaGF2ZSB0byBiZWdpbiBhdCB0aGUgZmlyc3QgY29sdW1uLiBGb3IKK2V4YW1wbGU6CisKKyAgICBGaXJzdCBsZXZlbCBoZWFkZXIKKyAgICA9PT09PT09PT09PT09PT09PT0KKworICAgIFNlY29uZCBsZXZlbCBoZWFkZXIKKyAgICAtLS0tLS0KKworICAgICAgIE90aGVyIGZpcnN0IGxldmVsIGhlYWRlcgorICAgID0KKworU2luY2UgU2V0ZXh0IGhlYWRlcnMgc3RhcnQgb24gYmxvY2sgYm91bmRhcmllcywgdGhpcyBtZWFucyBpbiBtb3N0IHNpdHVhdGlvbnMgdGhhdCB0aGV5IGhhdmUgdG8gYmUKK3ByZWNlZGVkIGJ5IGEgYmxhbmsgbGluZS4gSG93ZXZlciwgYmxhbmsgbGluZXMgYXJlIG5vdCBuZWNlc3NhcnkgYWZ0ZXIgYSBTZXRleHQgaGVhZGVyOgorCisgICAgVGhpcyBpcyBhIG5vcm1hbAorICAgIHBhcmFncmFwaC4KKworICAgIEFuZCBBIEhlYWRlcgorICAgIC0tLS0tLS0tLS0tLQorICAgIEFuZCBhIHBhcmFncmFwaAorCisgICAgPiBUaGlzIGlzIGEgYmxvY2txdW90ZS4KKworICAgIEFuZCBBIEhlYWRlcgorICAgIC0tLS0tLS0tLS0tLQorCitIb3dldmVyLCBpdCBpcyBnZW5lcmFsbHkgYSBnb29kIGlkZWEgdG8gYWxzbyB1c2UgYSBibGFuayBsaW5lIGFmdGVyIGEgU2V0ZXh0IGhlYWRlciBiZWNhdXNlIGl0IGxvb2tzCittb3JlIGFwcHJvcHJpYXRlIGFuZCBlYXNlcyByZWFkaW5nIG9mIHRoZSBkb2N1bWVudC4KKworPiBUaGUgb3JpZ2luYWwgTWFya2Rvd24gc3ludGF4IGFsbG93cyBvbmUgdG8gb21pdCB0aGUgYmxhbmsgbGluZSBiZWZvcmUgYSBTZXRleHQgaGVhZGVyLiBIb3dldmVyLAorPiB0aGlzIGxlYWRzIHRvIGFtYmlndWl0aWVzIGFuZCBtYWtlcyByZWFkaW5nIHRoZSBkb2N1bWVudCBoYXJkZXIgdGhhbiBuZWNlc3NhcnkuIFRoZXJlZm9yZSBpdCBpcworPiBub3QgYWxsb3dlZCBpbiBhIGtyYW1kb3duIGRvY3VtZW50LgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKK0FuIGVkZ2UgY2FzZSB3b3J0aCBtZW50aW9uaW5nIGlzIHRoZSBmb2xsb3dpbmc6CisKKyAgICBoZWFkZXIKKyAgICAtLS0KKyAgICBwYXJhCisKK09uZSBtaWdodCBhc2sgaWYgdGhpcyByZXByZXNlbnRzIHR3byBwYXJhZ3JhcGhzIHNlcGFyYXRlZCBieSBhIFtob3Jpem9udGFsIHJ1bGVdKCNob3Jpem9udGFsLXJ1bGVzKQorb3IgYSBzZWNvbmQgbGV2ZWwgaGVhZGVyIGFuZCBhIHBhcmFncmFwaC4gQXMgc3VnZ2VzdGVkIGJ5IHRoZSB3b3JkaW5nIGluIHRoZSBleGFtcGxlLCB0aGUgbGF0dGVyIGlzCit0aGUgY2FzZS4gVGhlIGdlbmVyYWwgcnVsZSBpcyB0aGF0IFNldGV4dCBoZWFkZXJzIGFyZSBwcm9jZXNzZWQgYmVmb3JlIGhvcml6b250YWwgcnVsZXMuCisKKyMjIyBhdHggU3R5bGUKKworYXR4IHN0eWxlIGhlYWRlcnMgaGF2ZSB0byBzdGFydCBvbiBhIFtibG9jayBib3VuZGFyeV0oI2Jsb2NrLWJvdW5kYXJpZXMpIHdpdGggYSBsaW5lIHRoYXQgY29udGFpbnMKK29uZSBvciBtb3JlIGhhc2ggY2hhcmFjdGVycyBhbmQgdGhlbiB0aGUgaGVhZGVyIHRleHQuIE5vIHNwYWNlcyBhcmUgYWxsb3dlZCBiZWZvcmUgdGhlIGhhc2gKK2NoYXJhY3RlcnMuIFRoZSBudW1iZXIgb2YgaGFzaCBjaGFyYWN0ZXJzIHNwZWNpZmllcyB0aGUgaGVhZGluZyBsZXZlbDogb25lIGhhc2ggY2hhcmFjdGVyIGdpdmVzIHlvdQorYSBmaXJzdCBsZXZlbCBoZWFkaW5nLCB0d28gYSBzZWNvbmQgbGV2ZWwgaGVhZGluZyBhbmQgc28gb24gdW50aWwgdGhlIG1heGltdW0gb2Ygc2l4IGhhc2ggY2hhcmFjdGVycworZm9yIGEgc2l4dGggbGV2ZWwgaGVhZGluZy4gWW91IG1heSBvcHRpb25hbGx5IHVzZSBhbnkgbnVtYmVyIG9mIGhhc2hlcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRvCitjbG9zZSB0aGUgaGVhZGVyLiBBbnkgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYXJlIHN0cmlwcGVkIGZyb20gdGhlIGhlYWRlciB0ZXh0LiBGb3IgZXhhbXBsZToKKworICAgICMgRmlyc3QgbGV2ZWwgaGVhZGVyCisKKyAgICAjIyMgVGhpcmQgbGV2ZWwgaGVhZGVyICAgICMjIworCisgICAgIyMgU2Vjb25kIGxldmVsIGhlYWRlciAjIyMjIyMKKworPiBBZ2FpbiwgdGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheCBhbGxvd3Mgb25lIHRvIG9taXQgdGhlIGJsYW5rIGxpbmUgYmVmb3JlIGFuIGF0eCBzdHlsZSBoZWFkZXIuCit7OiAubWFya2Rvd24tZGlmZmVyZW5jZX0KKworCisjIyMgU3BlY2lmeWluZyBhIEhlYWRlciBJRAorCitrcmFtZG93biBzdXBwb3J0cyBhIG5pY2Ugd2F5IGZvciBleHBsaWNpdGx5IHNldHRpbmcgdGhlIGhlYWRlciBJRCB3aGljaCBpcyB0YWtlbiBmcm9tIFtQSFAgTWFya2Rvd24KK0V4dHJhXSBhbmQgW01hcnVrdV06IElmIHlvdSBmb2xsb3cgdGhlIGhlYWRlciB0ZXh0IHdpdGggYW4gb3BlbmluZyBjdXJseSBicmFja2V0IChzZXBhcmF0ZWQgZnJvbSB0aGUKK3RleHQgd2l0aCBhIGxlYXN0IG9uZSBzcGFjZSksIGEgaGFzaCwgdGhlIElEIGFuZCBhIGNsb3NpbmcgY3VybHkgYnJhY2tldCwgdGhlIElEIGlzIHNldCBvbiB0aGUKK2hlYWRlci4gSWYgeW91IHVzZSB0aGUgdHJhaWxpbmcgaGFzaCBmZWF0dXJlIG9mIGF0eCBzdHlsZSBoZWFkZXJzLCB0aGUgaGVhZGVyIElEIGhhcyB0byBnbyBhZnRlciB0aGUKK3RyYWlsaW5nIGhhc2hlcy4gRm9yIGV4YW1wbGU6CisKKyAgICBIZWxsbyAgICAgICAgeyNpZH0KKyAgICAtLS0tLQorCisgICAgIyBIZWxsbyAgICAgIHsjaWR9CisKKyAgICAjIEhlbGxvICMgICAgeyNpZH0KKworPiBUaGlzIGFkZGl0aW9uYWwgc3ludGF4IGlzIG5vdCBwYXJ0IG9mIHN0YW5kYXJkIE1hcmtkb3duLgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKKworIyMgQmxvY2txdW90ZXMKKworQSBibG9ja3F1b3RlIGlzIHN0YXJ0ZWQgdXNpbmcgdGhlIGA+YCBtYXJrZXIgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgc3BhY2UgYW5kIHRoZSBjb250ZW50IG9mIHRoZQorYmxvY2txdW90ZS4gVGhlIG1hcmtlciBpdHNlbGYgbWF5IGJlIGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcy4gQWxsIGZvbGxvd2luZyBsaW5lcywgd2hldGhlciB0aGV5CithcmUgc3RhcnRlZCB3aXRoIHRoZSBibG9ja3F1b3RlIG1hcmtlciBvciBqdXN0IGNvbnRhaW4gdGV4dCwgYmVsb25nIHRvIHRoZSBibG9ja3F1b3RlIGJlY2F1c2UKK2Jsb2NrcXVvdGVzIHN1cHBvcnQgW2xpbmUgd3JhcHBpbmddKCNsaW5lLXdyYXBwaW5nKS4KKworVGhlIGNvbnRlbnRzIG9mIGEgYmxvY2txdW90ZSBhcmUgYmxvY2stbGV2ZWwgZWxlbWVudHMuIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgYXJlIGp1c3QgdXNpbmcgdGV4dCBhcworY29udGVudCB0aGF0IGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBhIHBhcmFncmFwaC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZ2l2ZXMgeW91IG9uZSBibG9ja3F1b3RlCit3aXRoIHR3byBwYXJhZ3JhcGhzIGluIGl0OgorCisgICAgPiBUaGlzIGlzIGEgYmxvY2txdW90ZS4KKyAgICA+ICAgICBvbiBtdWx0aXBsZSBsaW5lcworICAgIHRoYXQgbWF5IGJlIGxhenkuCisgICAgPgorICAgID4gVGhpcyBpcyB0aGUgc2Vjb25kIHBhcmFncmFwaC4KKworU2luY2UgdGhlIGNvbnRlbnRzIG9mIGEgYmxvY2txdW90ZSBhcmUgYmxvY2stbGV2ZWwgZWxlbWVudHMsIHlvdSBjYW4gbmVzdCBibG9ja3F1b3RlcyBhbmQgdXNlIG90aGVyCitibG9jay1sZXZlbCBlbGVtZW50cyAodGhpcyBpcyBhbHNvIHRoZSByZWFzb24gd2h5IGJsb2NrcXVvdGVzIG5lZWQgdG8gc3VwcG9ydCBsaW5lIHdyYXBwaW5nKToKKworICAgID4gVGhpcyBpcyBhIHBhcmFncmFwaC4KKyAgICA+CisgICAgPiA+IEEgbmVzdGVkIGJsb2NrcXVvdGUuCisgICAgPgorICAgID4gIyMgSGVhZGVycyB3b3JrCisgICAgPgorICAgID4gKiBsaXN0cyB0b28KKyAgICA+CisgICAgPiBhbmQgYWxsIG90aGVyIGJsb2NrLWxldmVsIGVsZW1lbnRzCisKK05vdGUgdGhhdCB0aGUgZmlyc3Qgc3BhY2UgY2hhcmFjdGVyIGFmdGVyIHRoZSBgPmAgbWFya2VyIGRvZXMgKm5vdCogY291bnQgd2hlbiBjb3VudGluZyBzcGFjZXMgZm9yCit0aGUgaW5kZW50YXRpb24gb2YgdGhlIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSB0aGUgYmxvY2txdW90ZSEgU28gW2NvZGUgYmxvY2tzXSgjY29kZS1ibG9ja3MpCit3aWxsIGhhdmUgdG8gYmUgaW5kZW50ZWQgd2l0aCBmaXZlIHNwYWNlcyBvciBvbmUgc3BhY2UgYW5kIG9uZSB0YWIsIGxpa2UgdGhpczoKKworICAgID4gQSBjb2RlIGJsb2NrOgorICAgID4KKyAgICA+ICAgICBydWJ5IC1lICdwdXRzIDp3b3JrcycKKworW0xpbmUgd3JhcHBpbmddKCNsaW5lLXdyYXBwaW5nKSBhbGxvd3Mgb25lIHRvIGJlIGxhenkgYnV0IGhpbmRlcnMgcmVhZGFiaWxpdHkgYW5kIHNob3VsZCB0aGVyZWZvcmUKK2JlIGF2b2lkZWQsIGVzcGVjaWFsbHkgd2l0aCBibG9ja3F1b3Rlcy4gSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIGJsb2NrcXVvdGVzIHdpdGggbGluZSB3cmFwcGluZzoKKworICAgID4gVGhpcyBpcyBhIHBhcmFncmFwaCBpbnNpZGUKKyAgICBhIGJsb2NrcXVvdGUuCisgICAgPgorICAgID4gPiBUaGlzIGlzIGEgbmVzdGVkIHBhcmFncmFwaAorICAgIHRoYXQgY29udGludWVzIGhlcmUKKyAgICA+IGFuZCBoZXJlCisgICAgPiA+IGFuZCBoZXJlCisKKworIyMgQ29kZSBCbG9ja3MKKworQ29kZSBibG9ja3MgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHZlcmJhdGltIHRleHQgbGlrZSBtYXJrdXAsIEhUTUwgb3IgYSBwcm9ncmFtIGZyYWdtZW50IGJlY2F1c2UKK25vIHN5bnRheCBpcyBwYXJzZWQgd2l0aGluIGEgY29kZSBibG9jay4KKworIyMjIFN0YW5kYXJkIENvZGUgQmxvY2tzCisKK0EgY29kZSBibG9jayBjYW4gYmUgc3RhcnRlZCBieSB1c2luZyBmb3VyIHNwYWNlcyBvciBvbmUgdGFiIGFuZCB0aGVuIHRoZSB0ZXh0IG9mIHRoZSBjb2RlIGJsb2NrLiBBbGwKK2ZvbGxvd2luZyBsaW5lcyBjb250YWluaW5nIHRleHQsIHdoZXRoZXIgdGhleSBhZGhlcmUgdG8gdGhpcyBzeW50YXggb3Igbm90LCBiZWxvbmcgdG8gdGhlIGNvZGUgYmxvY2sKK2JlY2F1c2UgY29kZSBibG9ja3Mgc3VwcG9ydCBbbGluZSB3cmFwcGluZ10oI2xpbmUtd3JhcHBpbmcpKS4gQSB3cmFwcGVkIGNvZGUgbGluZSBpcyBhdXRvbWF0aWNhbGx5CithcHBlbmRlZCB0byB0aGUgcHJlY2VkaW5nIGNvZGUgbGluZSBieSBzdWJzdGl0dXRpbmcgdGhlIGxpbmUgYnJlYWsgd2l0aCBhIHNwYWNlIGNoYXJhY3Rlci4gVGhlCitpbmRlbnRhdGlvbiAoZm91ciBzcGFjZXMgb3Igb25lIHRhYikgaXMgc3RyaXBwZWQgZnJvbSBlYWNoIGxpbmUgb2YgdGhlIGNvZGUgYmxvY2suCisKKz4gVGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheCBkb2VzIG5vdCBhbGxvdyBsaW5lIHdyYXBwaW5nIGluIGNvZGUgYmxvY2tzLgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKK05vdGUgdGhhdCBjb25zZWN1dGl2ZSBjb2RlIGJsb2NrcyB0aGF0IGFyZSBvbmx5IHNlcGFyYXRlIGJ5IFtibGFuayBsaW5lc10oI2JsYW5rLWxpbmVzKSBhcmUgbWVyZ2VkCit0b2dldGhlciBpbnRvIG9uZSBjb2RlIGJsb2NrOgorCisgICAgICAgIEhlcmUgY29tZXMgc29tZSBjb2RlCisKKyAgICAgICAgVGhpcyB0ZXh0IGJlbG9uZ3MgdG8gdGhlIHNhbWUgY29kZSBibG9jay4KKworSWYgeW91IHdhbnQgdG8gaGF2ZSBvbmUgY29kZSBibG9jayBkaXJlY3RseSBhZnRlciBhbm90aGVyIG9uZSwgeW91IG5lZWQgdG8gdXNlIGFuIFtFT0IKK21hcmtlcl0oI2VvYi1tYXJrZXIpIHRvIHNlcGFyYXRlIHRoZSB0d286CisKKyAgICAgICAgSGVyZSBjb21lcyBzb21lIGNvZGUKKyAgICBeCisgICAgICAgIFRoaXMgb25lIGlzIHNlcGFyYXRlLgorCisjIyMgRmVuY2VkIENvZGUgQmxvY2tzCisKKz4gVGhpcyBhbHRlcm5hdGl2ZSBzeW50YXggaXMgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheC4gVGhlIGlkZWEgYW5kIHN5bnRheCBjb21lcworPiBmcm9tIHRoZSBbUEhQIE1hcmtkb3duIEV4dHJhXSBwYWNrYWdlLgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKK2tyYW1kb3duIGFsc28gc3VwcG9ydHMgYW4gYWx0ZXJuYXRpdmUgc3ludGF4IGZvciBjb2RlIGJsb2NrcyB3aGljaCBkb2VzIG5vdCB1c2UgaW5kZW50ZWQgYmxvY2tzIGJ1dAorZGVsaW1pdGluZyBsaW5lcy4gVGhlIHN0YXJ0aW5nIGxpbmUgbmVlZHMgdG8gYmVnaW4gd2l0aCB0aHJlZSBvciBtb3JlIHRpbGRlIGNoYXJhY3RlcnMgKGB+YCkgYW5kIHRoZQorY2xvc2luZyBsaW5lIG5lZWRzIHRvIGhhdmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiB0aWxkZXMgdGhlIHN0YXJ0aW5nIGxpbmUgaGFzLiBFdmVyeXRoaW5nIGJldHdlZW4KK2lzIHRha2VuIGxpdGVyYWxseSBhcyB3aXRoIHRoZSBvdGhlciBzeW50YXggYnV0IHRoZXJlIGlzIG5vIG5lZWQgZm9yIGluZGVudGluZyB0aGUgdGV4dC4gRm9yCitleGFtcGxlOgorCisgICAgfn5+fn5+fn4KKyAgICBIZXJlIGNvbWVzIHNvbWUgY29kZS4KKyAgICB+fn5+fn5+fgorCitJZiB5b3UgbmVlZCBsaW5lcyBvZiB0aWxkZXMgaW4gc3VjaCBhIGNvZGUgYmxvY2ssIGp1c3Qgc3RhcnQgdGhlIGNvZGUgYmxvY2sgd2l0aCBtb3JlIHRpbGRlcy4gRm9yCitleGFtcGxlOgorCisgICAgfn5+fn5+fn5+fn5+CisgICAgfn5+fn5+fgorICAgIGNvZGUgd2l0aCB0aWxkZXMKKyAgICB+fn5+fn5+fgorICAgIH5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGlzIHR5cGUgb2YgY29kZSBibG9jayBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgY29weS1wYXN0ZWQgY29kZSBzaW5jZSB5b3UgZG9uJ3QgbmVlZCB0byBpbmRlbnQgdGhlCitjb2RlLgorCisjIyMgTGFuZ3VhZ2Ugb2YgQ29kZSBCbG9ja3MKKworWW91IGNhbiB0ZWxsIGtyYW1kb3duIHRoZSBsYW5ndWFnZSBvZiBhIGNvZGUgYmxvY2sgYnkgdXNpbmcgYW4gW0lBTF0oI2lubGluZS1hdHRyaWJ1dGUtbGlzdHMpOgorCisgICAgfn5+CisgICAgZGVmIHdoYXQ/CisgICAgICA0MgorICAgIGVuZAorICAgIH5+fgorICAgIHs6IC5sYW5ndWFnZS1ydWJ5fQorCitUaGUgc3BlY2lhbGx5IG5hbWVkIGNsYXNzIGBsYW5ndWFnZS1ydWJ5YCB0ZWxscyBrcmFtZG93biB0aGF0IHRoaXMgY29kZSBibG9jayBpcyB3cml0dGVuIGluIHRoZSBSdWJ5CitsYW5ndWFnZS4gU3VjaCBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIGJ5IGNvbnZlcnRlcnMgdG8gZG8gc3ludGF4IGhpZ2hsaWdodGluZyBvbiB0aGUKK2NvZGUgYmxvY2suCisKK0ZlbmNlZCBjb2RlIGJsb2NrcyBwcm92aWRlIGFuIGVhc2llciB3YXkgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UsIG5hbWVseSBieSBhcHBlbmRpbmcgdGhlIGxhbmd1YWdlCitvZiB0aGUgY29kZSBibG9jayB0byB0aGUgZW5kIG9mIHRoZSBzdGFydGluZyBsaW5lOgorCisgICAgfn5+IHJ1YnkKKyAgICBkZWYgd2hhdD8KKyAgICAgIDQyCisgICAgZW5kCisgICAgfn5+CisKKworIyMgTGlzdHMKKwora3JhbWRvd24gcHJvdmlkZXMgc3ludGF4IGVsZW1lbnRzIGZvciBjcmVhdGluZyBvcmRlcmVkIGFuZCB1bm9yZGVyZWQgbGlzdHMgYXMgd2VsbCBhcyBkZWZpbml0aW9uCitsaXN0cy4KKworIyMjIE9yZGVyZWQgYW5kIFVub3JkZXJlZCBsaXN0cworCitCb3RoIG9yZGVyZWQgYW5kIHVub3JkZXJlZCBsaXN0cyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMuCisKK0EgbGlzdCBpcyBzdGFydGVkIHdpdGggYSBsaXN0IG1hcmtlciAoaW4gY2FzZSBvZiB1bm9yZGVyZWQgbGlzdHMgb25lIG9mIGArYCwgYC1gIG9yIGAqYCAtLSB5b3UgY2FuCittaXggdGhlbSAtLSBhbmQgaW4gY2FzZSBvZiBvcmRlcmVkIGxpc3RzIGEgbnVtYmVyIGZvbGxvd2VkIGJ5IGEgcGVyaW9kKSBmb2xsb3dlZCBieSBvbmUgdGFiIG9yIGF0CitsZWFzdCBvbmUgc3BhY2UsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYW4gW0lBTF0oI2lubGluZS1hdHRyaWJ1dGUtbGlzdHMpIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8KK3RoZSBsaXN0IGl0ZW0gYW5kIHRoZW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIGxpc3QgaXRlbS4gVGhlIGxlYWRpbmcgdGFicyBvciBzcGFjZXMKK2FyZSBzdHJpcHBlZCBhd2F5IGZyb20gdGhpcyBmaXJzdCBsaW5lIG9mIGNvbnRlbnQgdG8gYWxsb3cgZm9yIGEgbmljZSBhbGlnbm1lbnQgd2l0aCB0aGUgZm9sbG93aW5nCitjb250ZW50IG9mIGEgbGlzdCBpdGVtIChzZWUgYmVsb3cpLiBBbGwgZm9sbG93aW5nIGxpc3QgaXRlbXMgd2l0aCB0aGUgc2FtZSBtYXJrZXIgdHlwZSAodW5vcmRlcmVkIG9yCitvcmRlcmVkKSBhcmUgcHV0IGludG8gdGhlIHNhbWUgbGlzdC4gVGhlIG51bWJlcnMgdXNlZCBmb3Igb3JkZXJlZCBsaXN0cyBhcmUgaXJyZWxldmFudCwgYW4gb3JkZXJlZAorbGlzdCBhbHdheXMgc3RhcnRzIGF0IDEuCisKK1RoZSBmb2xsb3dpbmcgZ2l2ZXMgeW91IGFuIHVub3JkZXJlZCBsaXN0IGFuZCBhbiBvcmRlcmVkIGxpc3Q6CisKKyAgICAqIGtyYW0KKyAgICArIGRvd24KKyAgICAtIG5vdworCisgICAgMS4ga3JhbQorICAgIDIuIGRvd24KKyAgICAzLiBub3cKKworPiBUaGUgb3JpZ2luYWwgTWFya2Rvd24gc3ludGF4IGFsbG93cyB0aGUgbWFya2VycyBvZiBvcmRlcmVkIGFuZCB1bm9yZGVyZWQgbGlzdHMgdG8gYmUgbWl4ZWQsIHRoZQorPiBmaXJzdCBtYXJrZXIgc3BlY2lmeWluZyB0aGUgbGlzdCB0eXBlIChvcmRlcmVkIG9yIHVub3JkZXJlZCkuIFRoaXMgaXMgbm90IGFsbG93ZWQgaW4ga3JhbWRvd24uIEFzCis+IHN0YXRlZCwgdGhlIGFib3ZlIGV4YW1wbGUgd2lsbCBnaXZlIHlvdSB0d28gbGlzdHMgKGFuIHVub3JkZXJlZCBhbmQgYW4gb3JkZXJlZCkgaW4ga3JhbWRvd24gYW5kCis+IG9ubHkgb25lIHVub3JkZXJlZCBsaXN0IGluIE1hcmtkb3duLgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKK1RoZSBmaXJzdCBsaXN0IG1hcmtlciBpbiBhIGxpc3QgbWF5IGJlIGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcy4gVGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGZpcnN0Citub24tc3BhY2UgY2hhcmFjdGVyIHdoaWNoIGFwcGVhcnMgYWZ0ZXIgdGhlIGxpc3QgaXRlbSBtYXJrZXIgb24gdGhlIHNhbWUgbGluZSBzcGVjaWZpZXMgdGhlCitpbmRlbnRhdGlvbiB0aGF0IGhhcyB0byBiZSB1c2VkIGZvciB0aGUgZm9sbG93aW5nIGxpbmVzIG9mIGNvbnRlbnQgb2YgdGhlIGxpc3QgaXRlbS4gSWYgdGhlcmUgaXMgbm8KK3N1Y2ggY2hhcmFjdGVyLCB0aGUgaW5kZW50YXRpb24gdGhhdCBuZWVkcyB0byBiZSB1c2VkIGlzIGZvdXIgc3BhY2VzIG9yIG9uZSB0YWIuIEluZGVudGVkIGxpbmVzIG1heQorYmUgZm9sbG93ZWQgYnkgbGluZXMgY29udGFpbmluZyB0ZXh0IHdpdGggYW55IGFtb3VudCBvZiBpbmRlbnRhdGlvbiBkdWUgdG8gW2xpbmUKK3dyYXBwaW5nXSgjbGluZS13cmFwcGluZykuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaW4gYWRkaXRpb24gdG8gdGhlIHJ1bGVzIG91dGxpbmVkIGluIHRoZSBzZWN0aW9uCithYm91dCBsaW5lIHdyYXBwaW5nLCBhIGxpc3QgaXRlbSBhbHNvIGVuZHMgd2hlbiBhIGxpbmUgd2l0aCBhbm90aGVyIGxpc3QgaXRlbSBtYXJrZXIgaXMgZW5jb3VudGVyZWQKKy0tIHNlZSB0aGUgbmV4dCBwYXJhZ3JhcGguCisKK1RoZSBpbmRlbnRhdGlvbiBpcyBzdHJpcHBlZCBmcm9tIHRoZSBjb250ZW50IGFuZCB0aGUgY29udGVudCAobm90ZSB0aGF0IHRoZSBjb250ZW50IG5hdHVyYWxseSBhbHNvCitjb250YWlucyB0aGUgY29udGVudCBvZiB0aGUgbGluZSB3aXRoIHRoZSBpdGVtIG1hcmtlcikgaXMgcHJvY2Vzc2VkIGFzIHRleHQgY29udGFpbmluZyBibG9jay1sZXZlbAorZWxlbWVudHMuIEFsbCBvdGhlciBsaXN0IG1hcmtlcnMgaW4gdGhlIGxpc3QgbWF5IGJlIGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcyBvciB0aGUgbnVtYmVyIG9mCitzcGFjZXMgdXNlZCBmb3IgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBsYXN0IGxpc3QgaXRlbSBtaW51cyBvbmUsIHdoaWNoZXZlciBudW1iZXIgaXMgc21hbGxlci4gRm9yCitleGFtcGxlOgorCisgICAgKiBUaGlzIGlzIHRoZSBmaXJzdCBsaW5lLiBTaW5jZSB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXJhY3RlcnMgYXBwZWFycyBpbgorICAgICAgY29sdW1uIDMsIGFsbCBvdGhlciBpbmRlbnRlZCBsaW5lcyBoYXZlIHRvIGJlIGluZGVudGVkIDIgc3BhY2VzLgorICAgIEhvd2V2ZXIsIG9uZSBjb3VsZCBiZSBsYXp5IGFuZCBub3QgaW5kZW50IGEgbGluZSBidXQgdGhpcyBpcyBub3QKKyAgICByZWNvbW1lbmRlZC4KKyAgICAqICAgICAgIFRoaXMgaXMgdGhlIGFub3RoZXIgaXRlbSBvZiB0aGUgbGlzdC4gSXQgdXNlcyBhIGRpZmZlcmVudCBudW1iZXIKKyAgICAgICBvZiBzcGFjZXMgZm9yIGluZGVudGF0aW9uIHdoaWNoIGlzIG9rYXkgYnV0IHNob3VsZCBnZW5lcmFsbHkgYmUgYXZvaWRlZC4KKyAgICAgICAqIFRoZSBsaXN0IGl0ZW0gbWFya2VyIGlzIGluZGVudGVkIDMgc3BhY2VzIHdoaWNoIGlzIGFsbG93ZWQgYnV0IHNob3VsZAorICAgICAgICAgYWxzbyBiZSBhdm9pZGVkIGFuZCBzdGFydHMgdGhlIHRoaXJkIGxpc3QgaXRlbS4gTm90ZSB0aGF0IHRoZSBsYXp5CisgICAgICAgICBsaW5lIGluIHRoZSBzZWNvbmQgbGlzdCBpdGVtIG1heSBtYWtlIHlvdSBiZWxpZXZlIHRoYXQgdGhpcyBpcyBhCisgICAgICAgICBzdWItbGlzdCB3aGljaCBpdCBpc24ndCEgU28gYXZvaWQgYmVpbmcgbGF6eSEKKworU28sIHdoaWxlIHRoZSBhYm92ZSBpcyBwb3NzaWJsZSBhbmQgY3JlYXRlcyBvbmUgbGlzdCB3aXRoIHRocmVlIGl0ZW1zLCBpdCBpcyBub3QgYWR2aXNlZCB0byB1c2UKK2RpZmZlcmVudCAobWFya2VyIGFuZCBsaXN0IGNvbnRlbnQpIGluZGVudHMgZm9yIHNhbWUgbGV2ZWwgbGlzdCBpdGVtcyBhcyB3ZWxsIGFzIGxhenkgaW5kZW50YXRpb24hCitJdCBpcyBtdWNoIGJldHRlciB0byB3cml0ZSBzdWNoIGEgbGlzdCBpbiB0aGUgZm9sbG93aW5nIHdheToKKworICAgICogVGhpcyBpcyB0aGUgZmlyc3QgbGlzdCBpdGVtIGJsYSBibGFibGEgYmxhYmxhIGJsYWJsYSBibGFibGEgYmxhYmxhCisgICAgICBibGFibGEgYmxhYmxhIGJsYWJsYSBibGFibGEgYmxhYmxhIGJsYWJsYSBibGFibGEgYmxhYmxhIGJsYWJsYSBibGFibGEKKyAgICAgIGJsYWJsYSBibGFibGEgYmxhYmxhIGJsYQorICAgICogVGhpcyBpcyB0aGUgYW5vdGhlciBpdGVtIG9mIHRoZSBsaXN0LiBibGEgYmxhYmxhIGJsYWJsYSBibGFibGEgYmxhYmxhCisgICAgICBibGFibGEgYmxhYmxhIGJsYWJsYSBibGFibGEgYmxhYmxhIGJsYWJsYSBibGFibGEgYmxhYmxhIGJsYWJsYSBibGFibGEKKworPiBUaGUgb3JpZ2luYWwgTWFya2Rvd24gc3ludGF4IGFsc28gYWxsb3dzIHlvdSB0byBpbmRlbnQgdGhlIG1hcmtlciwgaG93ZXZlciwgdGhlIGJlaGF2aW91ciBvZiB3aGF0Cis+IGhhcHBlbnMgd2l0aCB0aGUgbGlzdCBpdGVtcyBpcyBub3QgY2xlYXJseSBzcGVjaWZpZWQgYW5kIG1heSBzdXJwcmlzZSB5b3UuCis+Cis+IEFsc28sIE1hcmtkb3duIHVzZXMgYSBmaXhlZCBudW1iZXIgb2Ygc3BhY2VzL3RhYnMgdG8gaW5kZW50IHRoZSBsaW5lcyB0aGF0IGJlbG9uZyB0byBhIGxpc3QgaXRlbSEKK3s6IC5tYXJrZG93bi1kaWZmZXJlbmNlfQorCitVbm9yZGVyZWQgYW5kIG9yZGVyZWQgbGlzdHMgd29yayB0aGUgc2FtZSB3YXkgaW4gcmVnYXJkIHRvIHRoZSBpbmRlbnRhdGlvbjoKKworICAgICogbGlzdCAxIGl0ZW0gMQorICAgICAqIGxpc3QgMSBpdGVtIDIgKGluZGVudCAxIHNwYWNlKQorICAgICAgKiBsaXN0IDEgaXRlbSAzIChpbmRlbnQgMiBzcGFjZXMpCisgICAgICAgKiBsaXN0IDEgaXRlbSA0ICAoaW5kZW50IDMgc3BhY2VzKQorICAgICAgICAqIGxhenkgdGV4dCBiZWxvbmdpbmcgdG8gYWJvdmUgaXRlbSA0CisKK14KKworICAgIDEuIGxpc3QgMSBpdGVtIDEKKyAgICAgMi4gbGlzdCAxIGl0ZW0gMiAoaW5kZW50IDEgc3BhY2UpCisgICAgICAzLiBsaXN0IDEgaXRlbSAzIChpbmRlbnQgMiBzcGFjZXMpCisgICAgICAgNC4gbGlzdCAxIGl0ZW0gNCAgKGluZGVudCAzIHNwYWNlcykKKyAgICAgICAgNS4gbGF6eSB0ZXh0IGJlbG9uZ2luZyB0byBhYm92ZSBpdGVtIDQKKworXgorCisgICAgKiBsaXN0IDEgaXRlbSAxCisgICAgICAqIG5lc3RlZCBsaXN0IGl0ZW0gMQorICAgICAgKiBuZXN0ZWQgbGlzdCBpdGVtIDIKKyAgICAqIGxpc3QgMSBpdGVtIDIKKyAgICAgICogbmVzdGVkIGxpc3QgaXRlbSAxCisKK14KKworICAgIDEuIGxpc3QgMSBpdGVtIDEKKyAgICAgICAxLiBuZXN0ZWQgbGlzdCBpdGVtIDEKKyAgICAgICAyLiBuZXN0ZWQgbGlzdCBpdGVtIDIKKyAgICAxMC4gbGlzdCAxIGl0ZW0gMgorICAgICAgICAxLiBuZXN0ZWQgbGlzdCBpdGVtIDEKKworXgorCisgICAgMS4gdGV4dCBmb3IgdGhpcyBsaXN0IGl0ZW0KKyAgICAgICBmdXJ0aGVyIHRleHQgKGluZGVudCAzIHNwYWNlcykKKworICAgIDEwLiB0ZXh0IGZvciB0aGlzIGxpc3QgaXRlbQorICAgICAgICBmdXJ0aGVyIHRleHQgKGluZGVudCA0IHNwYWNlcykKKworV2hlbiB1c2luZyB0YWJzIGZvciBpbmRlbnRpbmcgdGhlIGNvbnRlbnQgb2YgYSBsaXN0IGl0ZW0sIHJlbWVtYmVyIHRoYXQgdGFiIHN0b3BzIG9jY3VyIGF0IG11bHRpcGxlcworb2YgZm91ciBmb3Iga3JhbWRvd24uIFRhYnMgYXJlIGNvcnJlY3RseSBjb252ZXJ0ZWQgdG8gc3BhY2VzIGZvciBjYWxjdWxhdGluZyB0aGUgaW5kZW50YXRpb24uIEZvcgorZXhhbXBsZToKKworICAgICogICBVc2luZyBhIHRhYiB0byBpbmRlbnQgdGhpcyBsaW5lLCB0aGUgdGFiIG9ubHkgY291bnRzIGFzIHRocmVlIHNwYWNlcworICAgICAgICBhbmQgdGhlcmVmb3JlIHRoZSBvdmVyYWxsIGluZGVudGF0aW9uIGlzIGZvdXIgc3BhY2VzLgorCisgICAgICAgMS4gICBUaGUgdGFiIGFmdGVyIHRoZSBtYXJrZXIgY291bnRzIGhlcmUgYXMgdGhyZWUgc3BhY2VzLiBTaW5jZSB0aGUKKyAgICAgICAgICAgIGluZGVudGF0aW9uIG9mIHRoZSBtYXJrZXIgaXMgdGhyZWUgc3BhY2VzIGFuZCB0aGUgbWFya2VyIGl0c2VsZgorICAgICAgICAgICAgdGFrZXMgdHdvIGNoYXJhY3RlcnMsIHRoZSBvdmVyYWxsIGluZGVudGF0aW9uIG5lZWRlZCBmb3IgdGhlCisgICAgICAgICAgICBmb2xsb3dpbmcgbGluZXMgaXMgZWlnaHQgc3BhY2VzIG9yIHR3byB0YWJzLgorCitJdCBpcyBjbGVhciB0aGF0IHlvdSBtaWdodCBnZXQgdW5leHBlY3RlZCByZXN1bHRzIGlmIHlvdSBtaXggdGFicyBhbmQgc3BhY2VzIG9yIGlmIHlvdSBkb24ndCBoYXZlCit0aGUgdGFiIHN0b3BzIHNldCB0byBtdWx0aXBsZXMgb2YgZm91ciBpbiB5b3VyIGVkaXRvciEgVGhlcmVmb3JlIHRoaXMgc2hvdWxkIGJlIGF2b2lkZWQhCisKK1RoZSBjb250ZW50IG9mIGEgbGlzdCBpdGVtIGlzIG1hZGUgdXAgb2YgZWl0aGVyIHRleHQgb3IgYmxvY2stbGV2ZWwgZWxlbWVudHMuIFNpbXBsZSBsaXN0IGl0ZW1zIG9ubHkKK2NvbnRhaW4gdGV4dCBsaWtlIGluIHRoZSBhYm92ZSBleGFtcGxlcy4gVGhleSBhcmUgbm90IGV2ZW4gd3JhcHBlZCBpbiBhIHBhcmFncmFwaCB0YWcuIElmIHRoZSBmaXJzdAorbGlzdCB0ZXh0IGlzIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGJsYW5rIGxpbmVzLCBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gYSBwYXJhZ3JhcGggdGFnOgorCisgICAgKiBrcmFtCisKKyAgICAqIGRvd24KKyAgICAqIG5vdworCitJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGZpcnN0IGxpc3QgaXRlbSB0ZXh0IHdpbGwgYmUgd3JhcHBlZCBpbiBhIHBhcmFncmFwaCB0YWcgc2luY2UgaXQgaXMKK2ZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSB3aGVyZWFzIHRoZSBzZWNvbmQgbGlzdCBpdGVtIGNvbnRhaW5zIGp1c3QgdGV4dC4gVGhlcmUgaXMgb2J2aW91c2x5IGEKK3Byb2JsZW0gZm9yIGRvaW5nIHRoaXMgd2l0aCB0aGUgbGFzdCBsaXN0IGl0ZW0gd2hlbiBpdCBjb250YWlucyBvbmx5IHRleHQuIFlvdSBjYW4gY2lyY3VtdmVudCB0aGlzCitieSBsZWF2aW5nIGEgYmxhbmsgbGluZSBhZnRlciB0aGUgbGFzdCBsaXN0IGl0ZW0gYW5kIHVzaW5nIGFuIEVPQiBtYXJrZXI6CisKKyAgICAqIE5vdCB3cmFwcGVkIGluIGEgcGFyYWdyYXBoCisgICAgKiBXcmFwcGVkIGluIGEgcGFyYWdyYXBoIGR1ZSB0byB0aGUgZm9sbG93aW5nIGJsYW5rIGxpbmUuCisKKyAgICAqIEFsc28gd3JhcHBlZCBpbiBhIHBhcmFncmFwaCBkdWUgdG8gdGhlCisgICAgICBmb2xsb3dpbmcgYmxhbmsgbGluZSBhbmQgdGhlIEVPQiBtYXJrZXIuCisKKyAgICBeCisKK1RoZSB0ZXh0IG9mIHRoZSBsYXN0IGxpc3QgaXRlbSBpcyBhbHNvIHdyYXBwZWQgaW4gYSBwYXJhZ3JhcGggdGFnIGlmICphbGwqIG90aGVyIGxpc3QgaXRlbXMgY29udGFpbgorYSBwcm9wZXIgcGFyYWdyYXBoIGFzIGZpcnN0IGVsZW1lbnQuIFRoaXMgbWFrZXMgdGhlIGZvbGxvd2luZyB1c2UgY2FzZSB3b3JrIGxpa2UgZXhwZWN0ZWQsIGkuZS4KKyphbGwqIHRoZSBsaXN0IGl0ZW1zIGFyZSB3cmFwcGVkIGluIHBhcmFncmFwaHM6CisKKyAgICAqIEZpcnN0IGxpc3QgaXRlbQorCisgICAgKiBTZWNvbmQgbGlzdCBpdGVtCisKKyAgICAqIExhc3QgbGlzdCBpdGVtCisKKz4gVGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheCBwYWdlIHNwZWNpZmllcyB0aGF0IGxpc3QgaXRlbXMgd2hpY2ggYXJlIHNlcGFyYXRlZCBieSBvbmUgb3IgbW9yZQorPiBibGFuayBsaW5lcyBhcmUgd3JhcHBlZCBpbiBwYXJhZ3JhcGggdGFncy4gVGhpcyBtZWFucyB0aGF0IHRoZSBmaXJzdCB0ZXh0IHdpbGwgYWxzbyBiZSB3cmFwcGVkIGluCis+IGEgcGFyYWdyYXBoIGlmIHlvdSBoYXZlIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluIGEgbGlzdCB3aGljaCBhcmUgc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiBUaGUKKz4gYWJvdmUgcnVsZSBpcyBlYXN5IHRvIHJlbWVtYmVyIGFuZCBsZXRzIHlvdSBleGFjdGx5IHNwZWNpZnkgd2hlbiB0aGUgZmlyc3QgbGlzdCB0ZXh0IHNob3VsZCBiZQorPiB3cmFwcGVkIGluIGEgcGFyYWdyYXBoLiBUaGUgaWRlYSBmb3IgdGhlIGFib3ZlIHJ1bGUgY29tZXMgZnJvbSB0aGUgW1BhbmRvY10gcGFja2FnZS4KK3s6IC5tYXJrZG93bi1kaWZmZXJlbmNlfQorCitBcyBzZWVuIGluIHRoZSBleGFtcGxlcyBhYm92ZSwgYmxhbmsgbGluZXMgYmV0d2VlbiBsaXN0IGl0ZW1zIGFyZSBhbGxvd2VkLgorCitTaW5jZSB0aGUgY29udGVudCBvZiBhIGxpc3QgaXRlbSBjYW4gY29udGFpbiBibG9jay1sZXZlbCBlbGVtZW50cywgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgorCisgICAgKiAgIEZpcnN0IGl0ZW0KKworICAgICAgICBBIHNlY29uZCBwYXJhZ3JhcGgKKworICAgICAgICAqIG5lc3RlZCBsaXN0CisKKyAgICAgICAgPiBibG9ja3F1b3RlCisKKyAgICAqICAgU2Vjb25kIGl0ZW0KKworSG93ZXZlciwgdGhlcmUgaXMgYSBwcm9ibGVtIHdoZW4geW91IHdhbnQgdG8gaGF2ZSBhIGNvZGUgYmxvY2sgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBsaXN0IGl0ZW0uIFlvdQorY2FuIHVzZSBhbiBFT0IgbWFya2VyIHRvIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtOgorCisgICAgKiAgIFRoaXMgaXMgYSBsaXN0IGl0ZW0uCisKKyAgICAgICAgVGhlIHNlY29uZCBwYXJhIG9mIHRoZSBsaXN0IGl0ZW0uCisgICAgXgorICAgICAgICBBIGNvZGUgYmxvY2sgZm9sbG93aW5nIHRoZSBsaXN0IGl0ZW0uCisKK1lvdSBjYW4gaGF2ZSBhbnkgYmxvY2stbGV2ZWwgZWxlbWVudCBhcyBmaXJzdCBlbGVtZW50IGluIGEgbGlzdCBpdGVtLiBIb3dldmVyLCBhcyBkZXNjcmliZWQgYWJvdmUsCit0aGUgbGVhZGluZyB0YWJzIG9yIHNwYWNlcyBvZiB0aGUgbGluZSB3aXRoIHRoZSBsaXN0IGl0ZW0gbWFya2VyIGFyZSBzdHJpcHBlZCBhd2F5LiBUaGlzIGxlYWRzIHRvIGEKK3Byb2JsZW0gd2hlbiB5b3Ugd2FudCB0byBoYXZlIGEgY29kZSBibG9jayBhcyBmaXJzdCBlbGVtZW50LiBUaGUgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIGlzIHRoZQorZm9sbG93aW5nIGNvbnN0cnVjdDoKKworICAgICogCisgICAgICAgICAgICBUaGlzIGlzIGEgY29kZSBibG9jayAoaW5kZW50YXRpb24gbmVlZHMgdG8gYmUgNCgxKSs0KDEpCisgICAgICAgICAgICBzcGFjZXMgKHRhYnMpKS4KK3s6IC5zaG93LXdoaXRlc3BhY2VzIC53cy1scn0KKworTm90ZSB0aGF0IHRoZSBsaXN0IG1hcmtlciBuZWVkcyB0byBiZSBmb2xsb3dlZCB3aXRoIGF0IGxlYXN0IG9uZSBzcGFjZSBvciB0YWIhIE90aGVyd2lzZSB0aGUgbGluZSBpcworbm90IHJlY29nbml6ZWQgYXMgdGhlIHN0YXJ0IG9mIGEgbGlzdCBpdGVtIGJ1dCBpbnRlcnByZXRlZCBhcyBhIHBhcmFncmFwaCBjb250YWluaW5nIHRoZSBsaXN0CittYXJrZXIuCisKK0lmIHlvdSB3YW50IHRvIGhhdmUgb25lIGxpc3QgZGlyZWN0bHkgYWZ0ZXIgYW5vdGhlciBvbmUgKGJvdGggd2l0aCB0aGUgc2FtZSBsaXN0IHR5cGUsIGkuZS4gb3JkZXJlZAorb3IgdW5vcmRlcmVkKSwgeW91IG5lZWQgdG8gdXNlIGFuIEVPQiBtYXJrZXIgdG8gc2VwYXJhdGUgdGhlIHR3bzoKKworICAgICogTGlzdCBvbmUKKyAgICBeCisgICAgKiBMaXN0IHR3bworCitTaW5jZSBwYXJhZ3JhcGhzIHN1cHBvcnQgW2xpbmUgd3JhcHBpbmddKCNsaW5lLXdyYXBwaW5nKSwgaXQgd291bGQgdXN1YWxseSBub3QgYmUgcG9zc2libGUgdG8gY3JlYXRlCitjb21wYWN0IG5lc3RlZCBsaXN0LCBpLmUuIGEgbGlzdCB3aGVyZSB0aGUgdGV4dCBpcyBub3Qgd3JhcHBlZCBpbiBwYXJhZ3JhcGhzIGJlY2F1c2UgdGhlcmUgaXMgbm8KK2JsYW5rIGxpbmUgYnV0IGEgc3ViIGxpc3QgYWZ0ZXIgaXQ6CisKKyAgICAqICAgVGhpcyBpcyBqdXN0IHRleHQuCisgICAgICAgICogdGhpcyBpcyBhIHN1YiBsaXN0IGl0ZW0KKyAgICAgICAgICAqIHRoaXMgaXMgYSBzdWIgc3ViIGxpc3QgaXRlbQorICAgICogVGhpcyBpcyBqdXN0IHRleHQsCisgICAgICAgIHNwYW5uaW5nIHR3byBsaW5lcworICAgICAgKiB0aGlzIGlzIGEgbmVzdGVkIGxpc3QgaXRlbS4KKworSG93ZXZlciwgdGhpcyBpcyBhbiBvZnRlbiB1c2VkIHN5bnRheCBhbmQgaXMgdGhlcmVmb3JlIHN1cHBvcnQgYnkga3JhbWRvd24uCisKK0lmIHlvdSB3YW50IHRvIHN0YXJ0IGEgcGFyYWdyYXBoIHdpdGggc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIGxpc3QgaXRlbSBtYXJrZXIsIHlvdSBuZWVkIHRvCitlc2NhcGUgaXQuIFRoaXMgaXMgZG9uZSBieSBlc2NhcGluZyB0aGUgcGVyaW9kIGluIGFuIG9yZGVyZWQgbGlzdCBvciB0aGUgbGlzdCBpdGVtIG1hcmtlciBpbiBhbgordW5vcmRlcmVkIGxpc3Q6CisKKyAgICAxOTg0XC4gSXQgd2FzIGdyZWF0CisgICAgXC0gb3RoZXJzIHNheSB0aGF0LCB0b28hCisKK0FzIG1lbnRpb25lZCBhdCB0aGUgYmVnaW5uaW5nLCBhbiBvcHRpb25hbCBJQUwgZm9yIGFwcGx5aW5nIGF0dHJpYnV0ZXMgdG8gYSBsaXN0IGl0ZW0gY2FuIGJlIHVzZWQKK2FmdGVyIHRoZSBsaXN0IGl0ZW0gbWFya2VyOgorCisgICAgKiB7Oi5jbHN9IFRoaXMgaXRlbSBoYXMgdGhlIGNsYXNzICJjbHMiLgorICAgICAgSGVyZSBjb250aW51ZXMgdGhlIGFib3ZlIHBhcmFncmFwaC4KKworICAgICogVGhpcyBpcyBhIG5vcm1hbCBsaXN0IGl0ZW0uCisKKworIyMjIERlZmluaXRpb24gTGlzdHMKKworPiBUaGlzIHN5bnRheCBmZWF0dXJlIGlzIG5vdCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBNYXJrZG93biBzeW50YXguIFRoZSBpZGVhIGFuZCBzeW50YXggY29tZXMgZnJvbQorPiB0aGUgW1BIUCBNYXJrZG93biBFeHRyYV0gcGFja2FnZS4KK3s6IC5tYXJrZG93bi1kaWZmZXJlbmNlfQorCitEZWZpbml0aW9uIGxpc3RzIGFsbG93IHlvdSB0byBhc3NpZ24gb25lIG9yIG1vcmUgZGVmaW5pdGlvbnMgdG8gb25lIG9yIG1vcmUgdGVybXMuCisKK0EgZGVmaW5pdGlvbiBsaXN0IGlzIHN0YXJ0ZWQgd2hlbiBhIG5vcm1hbCBwYXJhZ3JhcGggaXMgZm9sbG93ZWQgYnkgYSBsaW5lIHdpdGggYSBkZWZpbml0aW9uIG1hcmtlcgorKGEgY29sb24gd2hpY2ggbWF5IGJlIG9wdGlvbmFsbHkgaW5kZW50ZWQgdXAgdG8gdGhyZWUgc3BhY2VzKSwgdGhlbiBhdCBsZWFzdCBvbmUgdGFiIG9yIG9uZSBzcGFjZSwKK29wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYW4gW0lBTF0oI2lubGluZS1hdHRyaWJ1dGUtbGlzdHMpIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGxpc3QgaXRlbSBhbmQKK3RoZW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlZmluaXRpb24uIFRoZSBsaW5lIHdpdGggdGhlIGRlZmluaXRpb24gbWFya2VyIG1heSBvcHRpb25hbGx5IGJlCitzZXBhcmF0ZWQgZnJvbSB0aGUgcHJlY2VkaW5nIHBhcmFncmFwaCBieSBhIGJsYW5rIGxpbmUuIFRoZSBsZWFkaW5nIHRhYnMgb3Igc3BhY2VzIGFyZSBzdHJpcHBlZCBhd2F5Citmcm9tIHRoaXMgZmlyc3QgbGluZSBvZiB0aGUgZGVmaW5pdGlvbiB0byBhbGxvdyBmb3IgYSBuaWNlIGFsaWdubWVudCB3aXRoIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbgorY29udGVudC4gRWFjaCBsaW5lIG9mIHRoZSBwcmVjZWRpbmcgcGFyYWdyYXBoIGlzIHRha2VuIHRvIGJlIGEgdGVybSBhbmQgdGhlIGxpbmVzIHNlcGFyYXRlbHkgcGFyc2VkCithcyBzcGFuLWxldmVsIGVsZW1lbnRzLiBFYWNoIHN1Y2ggdGVybSBtYXkgb3B0aW9uYWxseSBzdGFydCB3aXRoIGFuIFtJQUxdKCNpbmxpbmUtYXR0cmlidXRlLWxpc3RzKQordGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdGVybS4KKworVGhlIGZvbGxvd2luZyBpcyBhIHNpbXBsZSBkZWZpbml0aW9uIGxpc3Q6CisKKyAgICBrcmFtZG93bgorICAgIDogQSBNYXJrZG93bi1zdXBlcnNldCBjb252ZXJ0ZXIKKworICAgIE1hcnVrdQorICAgIDogICAgIEFub3RoZXIgTWFya2Rvd24tc3VwZXJzZXQgY29udmVydGVyCisKK1RoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhcmFjdGVyIHdoaWNoIGFwcGVhcnMgYWZ0ZXIgYSBkZWZpbml0aW9uIG1hcmtlciBvbiB0aGUKK3NhbWUgbGluZSBzcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uIHRoYXQgaGFzIHRvIGJlIHVzZWQgZm9yIHRoZSBmb2xsb3dpbmcgbGluZXMgb2YgdGhlIGRlZmluaXRpb24uCitJZiB0aGVyZSBpcyBubyBzdWNoIGNoYXJhY3RlciwgdGhlIGluZGVudGF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgdXNlZCBpcyBmb3VyIHNwYWNlcyBvciBvbmUgdGFiLgorSW5kZW50ZWQgbGluZXMgbWF5IGJlIGZvbGxvd2VkIGJ5IGxpbmVzIGNvbnRhaW5pbmcgdGV4dCB3aXRoIGFueSBhbW91bnQgb2YgaW5kZW50YXRpb24gZHVlIHRvIFtsaW5lCit3cmFwcGluZ10oI2xpbmUtd3JhcHBpbmcpLiBOb3RlLCBob3dldmVyLCB0aGF0IGluIGFkZGl0aW9uIHRvIHRoZSBydWxlcyBvdXRsaW5lZCBpbiB0aGUgc2VjdGlvbgorYWJvdXQgbGluZSB3cmFwcGluZywgYSBsaXN0IGl0ZW0gYWxzbyBlbmRzIHdoZW4gYSBsaW5lIHdpdGggYW5vdGhlciBkZWZpbml0aW9uIG1hcmtlciBpcyBlbmNvdW50ZXJlZC4KKworVGhlIGluZGVudGF0aW9uIGlzIHN0cmlwcGVkIGZyb20gdGhlIGRlZmluaXRpb24gYW5kIGl0IChub3RlIHRoYXQgdGhlIGRlZmluaXRpb24gbmF0dXJhbGx5IGFsc28KK2NvbnRhaW5zIHRoZSBjb250ZW50IG9mIHRoZSBsaW5lIHdpdGggdGhlIGRlZmluaXRpb24gbWFya2VyKSBpcyBwcm9jZXNzZWQgYXMgdGV4dCBjb250YWluaW5nIGJsb2NrCitsZXZlbCBlbGVtZW50cy4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkZWZpbml0aW9uLCBhbGwgb3RoZXIgZGVmaW5pdGlvbiBtYXJrZXJzIGZvciB0aGUgdGVybSBtYXkKK2JlIGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcyBvciB0aGUgbnVtYmVyIG9mIHNwYWNlcyB1c2VkIGZvciB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGxhc3QKK2RlZmluaXRpb24gbWludXMgb25lLCB3aGljaGV2ZXIgbnVtYmVyIGlzIHNtYWxsZXIuIEZvciBleGFtcGxlOgorCisgICAgZGVmaW5pdGlvbiB0ZXJtIDEKKyAgICBkZWZpbml0aW9uIHRlcm0gMgorICAgIDogVGhpcyBpcyB0aGUgZmlyc3QgbGluZS4gU2luY2UgdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyYWN0ZXJzIGFwcGVhcnMgaW4KKyAgICBjb2x1bW4gMywgYWxsIG90aGVyIGxpbmVzIGhhdmUgdG8gYmUgaW5kZW50ZWQgMiBzcGFjZXMgKG9yIGxhenkgc3ludGF4IG1heQorICAgICAgYmUgdXNlZCBhZnRlciBhbiBpbmRlbnRlZCBsaW5lKS4gVGhpcyB0ZWxscyBrcmFtZG93biB0aGF0IHRoZSBsaW5lcworICAgICAgYmVsb25nIHRvIHRoZSBkZWZpbml0aW9uLgorICAgIDogICAgICAgVGhpcyBpcyB0aGUgYW5vdGhlciBkZWZpbml0aW9uIGZvciB0aGUgc2FtZSB0ZXJtLiBJdCB1c2VzIGEKKyAgICAgICAgICAgIGRpZmZlcmVudCBudW1iZXIgb2Ygc3BhY2VzIGZvciBpbmRlbnRhdGlvbiB3aGljaCBpcyBva2F5IGJ1dAorICAgICAgICAgICAgc2hvdWxkIGdlbmVyYWxseSBiZSBhdm9pZGVkLgorICAgICAgIDogVGhlIGRlZmluaXRpb24gbWFya2VyIGlzIGluZGVudGVkIDMgc3BhY2VzIHdoaWNoIGlzIGFsbG93ZWQgYnV0CisgICAgICAgICBzaG91bGQgYWxzbyBiZSBhdm9pZGVkLgorCitTbywgd2hpbGUgdGhlIGFib3ZlIGlzIHBvc3NpYmxlIGFuZCBjcmVhdGVzIGEgZGVmaW5pdGlvbiBsaXN0IHdpdGggdHdvIHRlcm1zIGFuZCB0aHJlZSBkZWZpbml0aW9ucworZm9yIHRoZW0sIGl0IGlzIG5vdCBhZHZpc2VkIHRvIHVzZSBkaWZmZXJlbnQgKGRlZmluaXRpb24gbWFya2VyIGFuZCBkZWZpbml0aW9uKSBpbmRlbnRzIGluIHRoZSBzYW1lCitkZWZpbml0aW9uIGxpc3QgYXMgd2VsbCBhcyBsYXp5IGluZGVudGF0aW9uIQorCitUaGUgZGVmaW5pdGlvbiBmb3IgYSB0ZXJtIGlzIG1hZGUgdXAgb2YgdGV4dCBhbmQvb3IgYmxvY2stbGV2ZWwgZWxlbWVudHMuIElmIGEgZGVmaW5pdGlvbiBpcyAqbm90KgorcHJlY2VkZWQgYnkgYSBibGFuayBsaW5lLCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVmaW5pdGlvbiB3aWxsIGp1c3QgYmUgdGV4dCBpZiBpdCB3b3VsZCBiZSBhCitwYXJhZ3JhcGggb3RoZXJ3aXNlOgorCisgICAgZGVmaW5pdGlvbiB0ZXJtCisgICAgOiBUaGlzIGRlZmluaXRpb24gd2lsbCBqdXN0IGJlIHRleHQgYmVjYXVzZSBpdCB3b3VsZCBub3JtYWxseSBiZSBhCisgICAgICBwYXJhZ3JhcGggYW5kIHRoZSB0aGVyZSBpcyBubyBwcmVjZWRpbmcgYmxhbmsgbGluZS4KKworICAgICAgPiBhbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBjb250YWlucyBvdGhlciBibG9jay1sZXZlbCBlbGVtZW50cworCisgICAgOiBUaGlzIGRlZmluaXRpb24gKndpbGwqIGJlIGEgcGFyYWdyYXBoIHNpbmNlIGl0IGlzIHByZWNlZGVkIGJ5IGEKKyAgICAgIGJsYW5rIGxpbmUuCisKK1RoZSBydWxlcyBhYm91dCBoYXZpbmcgYW55IGJsb2NrLWxldmVsIGVsZW1lbnQgYXMgZmlyc3QgZWxlbWVudCBpbiBhIGxpc3QgaXRlbSBhbHNvIGFwcGx5IHRvIGEKK2RlZmluaXRpb24uCisKK0FzIG1lbnRpb25lZCBhdCB0aGUgYmVnaW5uaW5nLCBhbiBvcHRpb25hbCBJQUwgZm9yIGFwcGx5aW5nIGF0dHJpYnV0ZXMgdG8gYSB0ZXJtIG9yIGEgZGVmaW5pdGlvbiBjYW4KK2JlIHVzZWQ6CisKKyAgICB7OiN0ZXJtfSBUZXJtIHdpdGggaWQ9InRlcm0iCisgICAgOiB7Oi5jbHN9IERlZmluaXRpb24gd2l0aCBjbGFzcyAiY2xzIgorCisgICAgezojdGVybTF9IEZpcnN0IHRlcm0KKyAgICB7OiN0ZXJtMn0gU2Vjb25kIHRlcm0KKyAgICA6IHs6LmNsc30gRGVmaW5pdGlvbgorCisKKyMjIFRhYmxlcworCis+IFRoaXMgc3ludGF4IGZlYXR1cmUgaXMgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheC4gVGhlIHN5bnRheCBpcyBiYXNlZCBvbiB0aGUgb25lCis+IGZyb20gdGhlIFtQSFAgTWFya2Rvd24gRXh0cmFdIHBhY2thZ2UuCit7OiAubWFya2Rvd24tZGlmZmVyZW5jZX0KKworU29tZXRpbWVzIG9uZSB3YW50cyB0byBpbmNsdWRlIHNpbXBsZSB0YWJ1bGFyIGRhdGEgaW4gYSBrcmFtZG93biBkb2N1bWVudCBmb3Igd2hpY2ggdXNpbmcgYQorZnVsbC1ibG93biBIVE1MIHRhYmxlIGlzIGp1c3QgdG9vIG11Y2guIGtyYW1kb3duIHN1cHBvcnRzIHRoaXMgd2l0aCBhIHNpbXBsZSBzeW50YXggZm9yIEFTQ0lJCit0YWJsZXMuCisKK1RhYmxlcyBjYW4gYmUgY3JlYXRlZCB3aXRoIG9yIHdpdGhvdXQgYSBsZWFkaW5nIHBpcGUgY2hhcmFjdGVyOiBJZiB0aGUgZmlyc3QgbGluZSBvZiBhIHRhYmxlCitjb250YWlucyBhIHBpcGUgY2hhcmFjdGVyIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSAob3B0aW9uYWxseSBpbmRlbnRlZCB1cCB0byB0aHJlZSBzcGFjZXMpLCB0aGVuCithbGwgbGVhZGluZyBwaXBlIGNoYXJhY3RlcnMgKGkuZS4gcGlwZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG9ubHkgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSkgYXJlIGlnbm9yZWQKK29uIGFsbCB0YWJsZSBsaW5lcy4gT3RoZXJ3aXNlIHRoZXkgYXJlIG5vdCBpZ25vcmVkIGFuZCBjb3VudCB3aGVuIGRpdmlkaW5nIGEgdGFibGUgbGluZSBpbnRvIHRhYmxlCitjZWxscy4KKworVGhlcmUgYXJlIGZvdXIgZGlmZmVyZW50IGxpbmUgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHRhYmxlOgorCisqICpUYWJsZSByb3dzKiBkZWZpbmUgdGhlIGNvbnRlbnQgb2YgYSB0YWJsZS4KKworICBBIHRhYmxlIHJvdyBpcyBhbnkgbGluZSB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBwaXBlIGNoYXJhY3RlciBhbmQgaXMgbm90IGlkZW50aWZpZWQgYXMgYW55CisgIG90aGVyIHR5cGUgb2YgdGFibGUgbGluZSEgVGhlIHRhYmxlIHJvdyBpcyBkaXZpZGVkIGludG8gaW5kaXZpZHVhbCB0YWJsZSBjZWxscyBieSBwaXBlIGNoYXJhY3RlcnMuCisgIEFuIG9wdGlvbmFsIHRyYWlsaW5nIHBpcGUgY2hhcmFjdGVyIGlzIGlnbm9yZWQuIE5vdGUgdGhhdCBsaXRlcmFsIHBpcGUgY2hhcmFjdGVycyBuZWVkIHRvIGJlCisgIGVzY2FwZWQgKmV4Y2VwdCogaWYgdGhleSBvY2N1ciBpbiBjb2RlIHNwYW5zIG9yIEhUTUwgYDxjb2RlPmAgZWxlbWVudHMhCisKKyAgSGVhZGVyIHJvd3MsIGZvb3RlciByb3dzIGFuZCBub3JtYWwgcm93cyBhcmUgYWxsIGRvbmUgdXNpbmcgdGhlc2UgdGFibGUgcm93cy4gVGFibGUgY2VsbHMgY2FuIG9ubHkKKyAgY29udGFpbiBhIHNpbmdsZSBsaW5lIG9mIHRleHQsIG5vIG11bHRpLWxpbmUgdGV4dCBpcyBzdXBwb3J0ZWQuIFRoZSB0ZXh0IG9mIGEgdGFibGUgY2VsbCBpcyBwYXJzZWQKKyAgYXMgc3Bhbi1sZXZlbCBlbGVtZW50cy4KKworICBIZXJlIGFyZSBzb21lIGV4YW1wbGUgdGFibGUgcm93czoKKworICAgICAgfCBGaXJzdCBjZWxsfFNlY29uZCBjZWxsfFRoaXJkIGNlbGwKKyAgICAgIHwgRmlyc3QgfCBTZWNvbmQgfCBUaGlyZCB8CisKKyAgICAgIEZpcnN0IHwgU2Vjb25kIHwgfCBGb3VydGggfAorCisqICpTZXBhcmF0b3IgbGluZXMqIGFyZSB1c2VkIHRvIHNwbGl0IHRoZSB0YWJsZSBib2R5IGludG8gbXVsdGlwbGUgYm9keSBwYXJ0cy4KKworICBBIHNlcGFyYXRvciBsaW5lIGlzIGFueSBsaW5lIHRoYXQgY29udGFpbnMgb25seSBwaXBlcywgZGFzaGVzLCBwbHVzZXMsIGNvbG9ucyBhbmQgc3BhY2VzL3RhYnMgYW5kCisgIHdoaWNoIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBkYXNoIGFuZCBvbmUgcGlwZSBjaGFyYWN0ZXIuIFRoZSBwaXBlIGFuZCBwbHVzIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQKKyAgdG8gdmlzdWFsbHkgc2VwYXJhdGUgY29sdW1ucyBhbHRob3VnaCB0aGlzIGlzIG5vdCBuZWVkZWQuIE11bHRpcGxlIHNlcGFyYXRvciBsaW5lcyBhZnRlciBhbm90aGVyCisgIGFyZSB0cmVhdGVkIGFzIG9uZSBzZXBhcmF0b3IgbGluZS4KKworICBIZXJlIGFyZSBzb21lIGV4YW1wbGUgc2VwYXJhdG9yIGxpbmVzOgorCisgICAgICB8LS0tLSstLS0tfAorICAgICAgKy0tLS18LS0tLSsKKyAgICAgIHwtLS0tLS0tLS18CisgICAgICB8LQorICAgICAgfCA6LS0tLS06IHwKKyAgICAgIC18LQorCisqIFRoZSBmaXJzdCBzZXBhcmF0b3IgbGluZSBhZnRlciBhdCBsZWFzdCBvbmUgdGFibGUgcm93IGlzIHRyZWF0ZWQgc3BlY2lhbGx5LCBuYW1lbHkgYXMgKmhlYWRlcgorICBzZXBhcmF0b3IgbGluZSouIEl0IGlzIHVzZWQgdG8gZGVtYXJjYXRlIGhlYWRlciByb3dzIGZyb20gbm9ybWFsIHRhYmxlIHJvd3MgYW5kL29yIHRvIHNldCBjb2x1bW4KKyAgYWxpZ25tZW50cy4gQWxsIHRhYmxlIHJvd3MgYWJvdmUgdGhlIGhlYWRlciBzZXBhcmF0b3IgbGluZSBhcmUgY29uc2lkZXJlZCB0byBiZSBoZWFkZXIgcm93cy4KKworICBUaGUgaGVhZGVyIHNlcGFyYXRvciBsaW5lIGNhbiBiZSBzcGVjaWFsbHkgZm9ybWF0dGVkIHRvIGNvbnRhaW4gY29sdW1uIGFsaWdubWVudCBkZWZpbml0aW9uczogQW4KKyAgYWxpZ25tZW50IGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgc3BhY2UvdGFiIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGNvbG9uLCBvbmUgb3IgbW9yZQorICBkYXNoZXMsIGFuIG9wdGlvbmFsIGNvbG9uIGFuZCBhbm90aGVyIG9wdGlvbmFsIHNwYWNlL3RhYi4gVGhlIGNvbG9ucyBvZiBhbiBhbGlnbm1lbnQgZGVmaW5pdGlvbgorICBhcmUgdXNlZCB0byBzZXQgdGhlIGFsaWdubWVudCBvZiBhIGNvbHVtbjogaWYgdGhlcmUgYXJlIG5vIGNvbG9ucywgdGhlIGNvbHVtbiB1c2VzIHRoZSBkZWZhdWx0CisgIGFsaWdubWVudCwgaWYgdGhlcmUgaXMgYSBjb2xvbiBvbmx5IGJlZm9yZSB0aGUgZGFzaGVzLCB0aGUgY29sdW1uIGlzIGxlZnQgYWxpZ25lZCwgaWYgdGhlcmUgYXJlCisgIGNvbG9ucyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkYXNoZXMsIHRoZSBjb2x1bW4gaXMgY2VudGVyIGFsaWduZWQgYW5kIGlmIHRoZXJlIGlzIG9ubHkgYSBjb2xvbgorICBhZnRlciB0aGUgZGFzaGVzLCB0aGUgY29sdW1uIGlzIHJpZ2h0IGFsaWduZWQuIEVhY2ggYWxpZ25tZW50IGRlZmluaXRpb24gc2V0cyB0aGUgYWxpZ25tZW50IGZvcgorICBvbmUgY29sdW1uLCB0aGUgZmlyc3QgYWxpZ25tZW50IGRlZmluaXRpb24gZm9yIHRoZSBmaXJzdCBjb2x1bW4sIHRoZSBzZWNvbmQgYWxpZ25tZW50IGRlZmluaXRpb24KKyAgZm9yIHRoZSBzZWNvbmQgY29sdW1uIGFuZCBzbyBvbi4KKworICBIZXJlIGFyZSBzb21lIGV4YW1wbGUgaGVhZGVyIHNlcGFyYXRvciBsaW5lcyB3aXRoIGFsaWdubWVudCBkZWZpbml0aW9uczoKKworICAgICAgfC0tLSstLS0rLS0tfAorICAgICAgKyA6LTogfDotLS0tLS18IC0tLTp8CisgICAgICB8IDotOiA6LSAtOiAtCisgICAgICA6LTogfCA6LQorCisqIEEgKmZvb3RlciBzZXBhcmF0b3IgbGluZSogaXMgdXNlZCB0byBkZW1hcmNhdGUgZm9vdGVyIHJvd3MgZnJvbSBub3JtYWwgdGFibGUgcm93cy4gQWxsIHRhYmxlIHJvd3MKKyAgYmVsb3cgdGhlIGZvb3RlciBzZXBhcmF0b3IgbGluZSBhcmUgY29uc2lkZXJlZCB0byBiZSBmb290ZXIgcm93cy4KKworICBBIGZvb3RlciBzZXBhcmF0b3IgbGluZSBpcyBsaWtlIGEgbm9ybWFsIHNlcGFyYXRvciBsaW5lIGV4Y2VwdCB0aGF0IGRhc2hlcyBhcmUgcmVwbGFjZWQgYnkgZXF1YWwKKyAgc2lnbnMuIEEgZm9vdGVyIHNlcGFyYXRvciBsaW5lIG1heSBvbmx5IGFwcGVhciBvbmNlIGluIGEgdGFibGUuIElmIG11bHRpcGxlIGZvb3RlciBzZXBhcmF0b3IgbGluZXMKKyAgYXJlIHVzZWQgaW4gb25lIHRhYmxlLCBvbmx5IHRoZSBsYXN0IGlzIHRyZWF0ZWQgYXMgZm9vdGVyIHNlcGFyYXRvciBsaW5lLCBhbGwgb3RoZXJzIGFyZSB0cmVhdGVkCisgIGFzIG5vcm1hbCBzZXBhcmF0b3IgbGluZXMuIE5vcm1hbCBzZXBhcmF0b3IgbGluZXMgdGhhdCBhcmUgdXNlZCBhZnRlciB0aGUgZm9vdGVyIHNlcGFyYXRvciBsaW5lCisgIGFyZSBpZ25vcmVkLgorCisgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZSBmb290ZXIgc2VwYXJhdG9yIGxpbmVzOgorCisgICAgICB8PT09PSs9PT09fAorICAgICAgKz09PT18PT09PSsKKyAgICAgIHw9PT09PT09PT18CisgICAgICB8PQorCitUcmFpbGluZyBzcGFjZXMgb3IgdGFicyBhcmUgaWdub3JlZCBpbiBhbGwgY2FzZXMuIFRvIHNpbXBsaWZ5IHRhYmxlIGNyZWF0aW9uIGFuZCBtYWludGVuYW5jZSwKK2hlYWRlciwgZm9vdGVyIGFuZCBub3JtYWwgc2VwYXJhdG9yIGxpbmVzIG5lZWQgbm90IHNwZWNpZnkgdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMgYXMgdGFibGUgcm93czsKK2V2ZW4gYHwtYCBhbmQgYHw9YCBhcmUgYSB2YWxpZCBzZXBhcmF0b3JzLgorCitHaXZlbiB0aGUgYWJvdmUgY29tcG9uZW50cywgYSB0YWJsZSBpcyBzcGVjaWZpZWQgYnkKKworKiBhbiBvcHRpb25hbCBzZXBhcmF0b3IgbGluZSwKKyogb3B0aW9uYWxseSBmb2xsb3dlZCBieSB6ZXJvLCBvbmUgb3IgbW9yZSB0YWJsZSByb3dzIGZvbGxvd2VkIGJ5IGEgaGVhZGVyIHNlcGFyYXRvciBsaW5lLAorKiBvbmUgb3IgbW9yZSB0YWJsZSByb3dzLCBvcHRpb25hbGx5IGludGVyc3BlcnNlZCB3aXRoIHNlcGFyYXRvciBsaW5lcywKKyogb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGZvb3RlciBzZXBhcmF0b3IgbGluZSBhbmQgemVybywgb25lIG9yIG1vcmUgdGFibGUgcm93cyBhbmQKKyogYW4gb3B0aW9uYWwgdHJhaWxpbmcgc2VwYXJhdG9yIGxpbmUuCisKK0Fsc28gbm90ZQorCisqIHRoYXQgdGhlIGZpcnN0IGxpbmUgb2YgYSB0YWJsZSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiB0aHJlZSBzcGFjZXMgb2YgaW5kZW50YXRpb24gYmVmb3JlIHRoZQorICBmaXJzdCBub24tc3BhY2UgY2hhcmFjdGVyLAorKiB0aGF0IGVhY2ggbGluZSBvZiBhIHRhYmxlIG5lZWRzIHRvIGhhdmUgYXQgbGVhc3Qgb25lIG5vdCBlc2NhcGVkIHBpcGUgY2hhcmFjdGVyIHNvIHRoYXQga3JhbWRvd24KKyAgcmVjb2duaXplcyBpdCBhcyBhIGxpbmUgYmVsb25naW5nIHRvIHRoZSB0YWJsZSBhbmQKKyogdGhhdCB0YWJsZXMgaGF2ZSB0byBzdGFydCBhbmQgZW5kIG9uIFtibG9jayBib3VuZGFyaWVzXSgjYmxvY2stYm91bmRhcmllcykhCisKKz4gVGhlIHRhYmxlIHN5bnRheCBkaWZmZXJzIGZyb20gdGhlIG9uZSB1c2VkIGluIFtQSFAgTWFya2Rvd24gRXh0cmFdIGFzIGZvbGxvd3M6Cis+Cis+ICoga3JhbWRvd24gdGFibGVzIGRvIG5vdCBuZWVkIHRvIGhhdmUgYSB0YWJsZSBoZWFkZXIuCis+ICoga3JhbWRvd24gdGFibGVzIGNhbiBiZSBzdHJ1Y3R1cmVkIHVzaW5nIHNlcGFyYXRvciBsaW5lcy4KKz4gKiBrcmFtZG93biB0YWJsZXMgY2FuIGNvbnRhaW4gYSB0YWJsZSBmb290ZXIuCis+ICoga3JhbWRvd24gdGFibGVzIG5lZWQgdG8gYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgYmxvY2stbGV2ZWwgZWxlbWVudHMuCit7OiAubWFya2Rvd24tZGlmZmVyZW5jZX0KKworSGVyZSBpcyBhbiBleGFtcGxlIGZvciBhIGtyYW1kb3duIHRhYmxlIHdpdGggYSB0YWJsZSBoZWFkZXIgcm93LCB0d28gdGFibGUgYm9kaWVzIGFuZCBhIHRhYmxlIGZvb3Rlcgorcm93OgorCisgICAgfC0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgRGVmYXVsdCBhbGlnbmVkIHxMZWZ0IGFsaWduZWR8IENlbnRlciBhbGlnbmVkICB8IFJpZ2h0IGFsaWduZWQgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS06fC0tLS0tLS0tLS0tLS0tLTp8CisgICAgfCBGaXJzdCBib2R5IHBhcnQgfFNlY29uZCBjZWxsIHwgVGhpcmQgY2VsbCAgICAgIHwgZm91cnRoIGNlbGwgICAgfAorICAgIHwgU2Vjb25kIGxpbmUgICAgIHxmb28gICAgICAgICB8ICoqc3Ryb25nKiogICAgICB8IGJheiAgICAgICAgICAgIHwKKyAgICB8IFRoaXJkIGxpbmUgICAgICB8cXV1eCAgICAgICAgfCBiYXogICAgICAgICAgICAgfCBiYXIgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgU2Vjb25kIGJvZHkgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8IDIgbGluZSAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfD09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09fAorICAgIHwgRm9vdGVyIHJvdyAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS18CisKK1RoZSBhYm92ZSBleGFtcGxlIHRhYmxlIGlzIHJhdGhlciB0aW1lLWNvbnN1bWluZyB0byBjcmVhdGUgd2l0aG91dCB0aGUgaGVscCBvZiBhbiBBU0NJSSB0YWJsZQorZWRpdG9yLiBIb3dldmVyLCB0aGUgdGFibGUgc3ludGF4IGlzIGZsZXhpYmxlIGFuZCB0aGUgYWJvdmUgdGFibGUgY291bGQgYWxzbyBiZSB3cml0dGVuIGxpa2UgdGhpczoKKworICAgIHwtLS0KKyAgICB8IERlZmF1bHQgYWxpZ25lZCB8IExlZnQgYWxpZ25lZCB8IENlbnRlciBhbGlnbmVkIHwgUmlnaHQgYWxpZ25lZAorICAgIHwtfDotfDotOnwtOgorICAgIHwgRmlyc3QgYm9keSBwYXJ0IHwgU2Vjb25kIGNlbGwgfCBUaGlyZCBjZWxsIHwgZm91cnRoIGNlbGwKKyAgICB8IFNlY29uZCBsaW5lIHxmb28gfCAqKnN0cm9uZyoqIHwgYmF6CisgICAgfCBUaGlyZCBsaW5lIHxxdXV4IHwgYmF6IHwgYmFyCisgICAgfC0tLQorICAgIHwgU2Vjb25kIGJvZHkKKyAgICB8IDIgbGluZQorICAgIHw9PT0KKyAgICB8IEZvb3RlciByb3cKKworCisjIyBIb3Jpem9udGFsIFJ1bGVzCisKK0EgaG9yaXpvbnRhbCBydWxlIGZvciB2aXN1YWxseSBzZXBhcmF0aW5nIGNvbnRlbnQgaXMgY3JlYXRlZCBieSB1c2luZyB0aHJlZSBvciBtb3JlIGFzdGVyaXNrcywKK2Rhc2hlcyBvciB1bmRlcnNjb3JlcyAodGhlc2UgbWF5IG5vdCBiZSBtaXhlZCBvbiBhIGxpbmUpLCBvcHRpb25hbGx5IHNlcGFyYXRlZCBieSBzcGFjZXMgb3IgdGFicywgb24KK2FuIG90aGVyd2lzZSBibGFuayBsaW5lLiBUaGUgZmlyc3QgYXN0ZXJpc2ssIGRhc2ggb3IgdW5kZXJzY29yZSBtYXkgb3B0aW9uYWxseSBiZSBpbmRlbnRlZCB1cCB0bwordGhyZWUgc3BhY2VzLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMgdG8gY3JlYXRlIGEgaG9yaXpvbnRhbCBydWxlOgorCisgICAgKiAqICoKKworICAgIC0tLQorCisgICAgICBfICBfICBfICBfCisKKyAgICAtLS0tLS0tLS0tLS0tLS0KKworCisjIyBNYXRoIEJsb2NrcworCis+IFRoaXMgc3ludGF4IGZlYXR1cmUgaXMgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheC4gVGhlIGlkZWEgY29tZXMgZnJvbSB0aGUgW01hcnVrdV0KKz4gYW5kIFtQYW5kb2NdIHBhY2thZ2VzLgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKK2tyYW1kb3duIGhhcyBidWlsdC1pbiBzdXBwb3J0IGZvciBibG9jayBhbmQgc3Bhbi1sZXZlbCBtYXRoZW1hdGljcyB3cml0dGVuIGluIExhVGVYLgorCitBIG1hdGggYmxvY2sgbmVlZHMgdG8gc3RhcnQgYW5kIGVuZCBvbiBbYmxvY2sgYm91bmRhcmllc10oI2Jsb2NrLWJvdW5kYXJpZXMpLiBJdCBpcyBzdGFydGVkIHVzaW5nCit0d28gZG9sbGFyIHNpZ25zLCBvcHRpb25hbGx5IGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcy4gVGhlIG1hdGggYmxvY2sgY29udGludWVzIHVudGlsIHRoZSBuZXh0Cit0d28gZG9sbGFyIHNpZ25zICh3aGljaCBtYXkgYmUgb24gdGhlIHNhbWUgbGluZSBvciBvbiBvbmUgb2YgdGhlIG5leHQgbGluZXMpIHRoYXQgYXBwZWFyIGF0IHRoZSBlbmQKK29mIGEgbGluZSwgaS5lLiB0aGV5IG1heSBvbmx5IGJlIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gVGhlIGNvbnRlbnQgb2YgYSBtYXRoIGJsb2NrIGhhcwordG8gYmUgdmFsaWQgTGFUZVggbWF0aC4gSXQgaXMgYWx3YXlzIHdyYXBwZWQgaW5zaWRlIGEgYFxiZWdpbntkaXNwbGF5bWF0aH0uLi5cZW5ke2Rpc3BsYXltYXRofWAKK2Vudmlyb21lbnQgZXhjZXB0IGlmIGl0IGJlZ2lucyB3aXRoIGEgYFxiZWdpbmAgc3RhdGVtZW50LgorCitUaGUgZm9sbG93aW5nIGtyYW1kb3duIGZyYWdtZW50CisKKyAgICAkJAorICAgIFxiZWdpbnthbGlnbip9CisgICAgICAmIFxwaGkoeCx5KSA9IFxwaGkgXGxlZnQoXHN1bV97aT0xfV5uIHhfaWVfaSwgXHN1bV97aj0xfV5uIHlfamVfaiBccmlnaHQpCisgICAgICA9IFxzdW1fe2k9MX1ebiBcc3VtX3tqPTF9Xm4geF9pIHlfaiBccGhpKGVfaSwgZV9qKSA9IFxcCisgICAgICAmICh4XzEsIFxsZG90cywgeF9uKSBcbGVmdCggXGJlZ2lue2FycmF5fXtjY2N9CisgICAgICAgICAgXHBoaShlXzEsIGVfMSkgJiBcY2RvdHMgJiBccGhpKGVfMSwgZV9uKSBcXAorICAgICAgICAgIFx2ZG90cyAmIFxkZG90cyAmIFx2ZG90cyBcXAorICAgICAgICAgIFxwaGkoZV9uLCBlXzEpICYgXGNkb3RzICYgXHBoaShlX24sIGVfbikKKyAgICAgICAgXGVuZHthcnJheX0gXHJpZ2h0KQorICAgICAgXGxlZnQoIFxiZWdpbnthcnJheX17Y30KKyAgICAgICAgICB5XzEgXFwKKyAgICAgICAgICBcdmRvdHMgXFwKKyAgICAgICAgICB5X24KKyAgICAgICAgXGVuZHthcnJheX0gXHJpZ2h0KQorICAgIFxlbmR7YWxpZ24qfQorICAgICQkCisKK3JlbmRlcnMgKHVzaW5nIEphdmFzY3JpcHQgbGlicmFyeSBbTWF0aEpheF0oaHR0cDovL3d3dy5tYXRoamF4Lm9yZy8pKSBhcworCiskJAorXGJlZ2lue2FsaWduKn0KKyAgJiBccGhpKHgseSkgPSBccGhpIFxsZWZ0KFxzdW1fe2k9MX1ebiB4X2llX2ksIFxzdW1fe2o9MX1ebiB5X2plX2ogXHJpZ2h0KQorICA9IFxzdW1fe2k9MX1ebiBcc3VtX3tqPTF9Xm4geF9pIHlfaiBccGhpKGVfaSwgZV9qKSA9IFxcCisgICYgKHhfMSwgXGxkb3RzLCB4X24pIFxsZWZ0KCBcYmVnaW57YXJyYXl9e2NjY30KKyAgICAgIFxwaGkoZV8xLCBlXzEpICYgXGNkb3RzICYgXHBoaShlXzEsIGVfbikgXFwKKyAgICAgIFx2ZG90cyAmIFxkZG90cyAmIFx2ZG90cyBcXAorICAgICAgXHBoaShlX24sIGVfMSkgJiBcY2RvdHMgJiBccGhpKGVfbiwgZV9uKQorICAgIFxlbmR7YXJyYXl9IFxyaWdodCkKKyAgXGxlZnQoIFxiZWdpbnthcnJheX17Y30KKyAgICAgIHlfMSBcXAorICAgICAgXHZkb3RzIFxcCisgICAgICB5X24KKyAgICBcZW5ke2FycmF5fSBccmlnaHQpCitcZW5ke2FsaWduKn0KKyQkCisKK1VzaW5nIGlubGluZSBtYXRoIGlzIGFsc28gZWFzeToganVzdCBzdXJyb3VuZCB5b3VyIG1hdGggY29udGVudCB3aXRoIHR3byBkb2xsYXIgc2lnbnMsIGxpa2Ugd2l0aCBhCittYXRoIGJsb2NrLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzdGFydCBhbiBpbmxpbmUgbWF0aCBzdGF0ZW1lbnQsIGp1c3QgZXNjYXBlIHRoZSBkb2xsYXIgc2lnbnMgYW5kCit0aGV5IHdpbGwgYmUgdHJlYXRlZCBhcyBzaW1wbGUgZG9sbGFyIHNpZ25zLgorCis+ICoqTm90ZSoqIHRoYXQgTGFUZVggY29kZSB0aGF0IHVzZXMgdGhlIHBpcGUgc3ltYm9sIGB8YCBpbiBpbmxpbmUgbWF0aCBzdGF0ZW1lbnRzIG1heSBsZWFkIHRvIGEKKz4gbGluZSBiZWluZyByZWNvZ25pemVkIGFzIGEgdGFibGUgbGluZS4gVGhpcyBwcm9ibGVtIGNhbiBiZSBhdm9pZGVkIGJ5IHVzaW5nIHRoZSBgXHZlcnRgIGNvbW1hbmQKKz4gaW5zdGVhZCBvZiBgfGAhCit7Oi5pbmZvcm1hdGlvbn0KKworSWYgeW91IGhhdmUgYSBwYXJhZ3JhcGggdGhhdCBsb29rcyBsaWtlIGEgbWF0aCBibG9jayBidXQgc2hvdWxkIGFjdHVhbGx5IGJlIGEgcGFyYWdyYXBoIHdpdGgganVzdCBhbgoraW5saW5lIG1hdGggc3RhdGVtZW50LCB5b3UgbmVlZCB0byBlc2NhcGUgdGhlIGZpcnN0IGRvbGxhciBzaWduOgorCisgICAgVGhlIGZvbGxvd2luZyBpcyBhIG1hdGggYmxvY2s6CisKKyAgICAkJCA1ICsgNSAkJAorCisgICAgQnV0IG5leHQgY29tZXMgYSBwYXJhZ3JhcGggd2l0aCBhbiBpbmxpbmUgbWF0aCBzdGF0ZW1lbnQ6CisKKyAgICBcJCQgNSArIDUgJCQKKworSWYgeW91IGRvbid0IGV2ZW4gd2FudCB0aGUgaW5saW5lIG1hdGggc3RhdGVtZW50LCBlc2NhcGUgdGhlIGZpcnN0IHR3byBkb2xsYXIgc2lnbnM6CisKKyAgICBcJFwkIDUgKyA1ICQkCisKKyMjIEhUTUwgQmxvY2tzCisKKz4gVGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheCBzcGVjaWZpZXMgdGhhdCBhbiBIVE1MIGJsb2NrIG11c3Qgc3RhcnQgYXQgdGhlIGxlZnQgbWFyZ2luLCBpLmUuIG5vCis+IGluZGVudGF0aW9uIGlzIGFsbG93ZWQuIEFsc28sIHRoZSBIVE1MIGJsb2NrIGhhcyB0byBiZSBzdXJyb3VuZGVkIGJ5IGJsYW5rIGxpbmVzLiBCb3RoCis+IHJlc3RyaWN0aW9ucyBhcmUgbGlmdGVkIGZvciBrcmFtZG93biBkb2N1bWVudHMuIEFkZGl0aW9uYWxseSwgdGhlIG9yaWdpbmFsIHN5bnRheCBkb2VzIG5vdCBhbGxvdworPiB5b3UgdG8gdXNlIE1hcmtkb3duIHN5bnRheCBpbiBIVE1MIGJsb2NrcyB3aGljaCBpcyBhbGxvd2VkIHdpdGgga3JhbWRvd24uCit7OiAubWFya2Rvd24tZGlmZmVyZW5jZX0KKworQW4gSFRNTCBibG9jayBpcyBwb3RlbnRpYWxseSBzdGFydGVkIGlmIGEgbGluZSBpcyBlbmNvdW50ZXJlZCB0aGF0IGJlZ2lucyB3aXRoIGEgbm9uLXNwYW4tbGV2ZWwgSFRNTAordGFnIG9yIGEgZ2VuZXJhbCBYTUwgdGFnIChvcGVuaW5nIG9yIGNsb3NpbmcpIHdoaWNoIG1heSBiZSBpbmRlbnRlZCB1cCB0byB0aHJlZSBzcGFjZXMuCisKK1RoZSBmb2xsb3dpbmcgSFRNTCB0YWdzIGNvdW50IGFzIHNwYW4tbGV2ZWwgSFRNTCB0YWdzIGFuZCAqd29uJ3QqIHN0YXJ0IGFuIEhUTUwgYmxvY2sgaWYgZm91bmQgYXQKK3RoZSBiZWdpbm5pbmcgb2YgYW4gSFRNTCBibG9jayBsaW5lOgorCisgICAgYSBhYmJyIGFjcm9ueW0gYiBiaWcgYmRvIGJyIGJ1dHRvbiBjaXRlIGNvZGUgZGVsIGRmbiBlbSBpIGltZyBpbnB1dAorICAgIGlucyBrYmQgbGFiZWwgb3B0aW9uIHEgcmIgcmJjIHJwIHJ0IHJ0YyBydWJ5IHNhbXAgc2VsZWN0IHNtYWxsIHNwYW4KKyAgICBzdHJvbmcgc3ViIHN1cCB0ZXh0YXJlYSB0dCB2YXIKKworRnVydGhlciBwYXJzaW5nIG9mIGEgZm91bmQgc3RhcnQgdGFnIGRlcGVuZHMgb24gdGhlIHRhZyBhbmQgaW4gd2hpY2ggb2YgdGhyZWUgcG9zc2libGUgd2F5cyBpdHMKK2NvbnRlbnQgaXMgcGFyc2VkOgorCisqIFBhcnNlIGFzIHJhdyBIVE1MIGJsb2NrOiBJZiB0aGUgSFRNTC9YTUwgdGFnIGNvbnRlbnQgc2hvdWxkIGJlIGhhbmRsZWQgYXMgcmF3IEhUTUwsIHRoZW4gb25seQorICBIVE1ML1hNTCB0YWdzIGFyZSBwYXJzZWQgZnJvbSB0aGlzIHBvaW50IG9ud2FyZHMgYW5kIHRleHQgaXMgaGFuZGxlZCBhcyByYXcsIHVucGFyc2VkIHRleHQgdW50aWwKKyAgdGhlIG1hdGNoaW5nIGVuZCB0YWcgaXMgZm91bmQgb3IgdW50aWwgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuIEVhY2ggZm91bmQgdGFnIHdpbGwgYmUgcGFyc2VkIGFzCisgIHJhdyBIVE1MIGFnYWluLiBIb3dldmVyLCBpZiBhIHRhZyBoYXMgYSBgbWFya2Rvd25gIGF0dHJpYnV0ZSwgdGhpcyBhdHRyaWJ1dGUgY29udHJvbHMgcGFyc2luZyBvZgorICB0aGlzIG9uZSB0YWcgKHNlZSBiZWxvdykuCisKKyAgTm90ZSB0aGF0IHRoZSBwYXJzZXIgYmFzaWNhbGx5IHN1cHBvcnRzIG9ubHkgY29ycmVjdCBYSFRNTCEgSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucy4KKyAgRm9yIGV4YW1wbGUsIGF0dHJpYnV0ZXMgd2l0aG91dCB2YWx1ZXMgKGkuZS4gYm9vbGVhbiBhdHRyaWJ1dGVzKSBhcmUgYWxzbyBzdXBwb3J0ZWQgYW5kIGVsZW1lbnRzCisgIHdpdGhvdXQgY29udGVudCBsaWtlIGA8aHIgLz5gIGNhbiBiZSB3cml0dGVuIGFzIGA8aHI+YC4gSWYgYW4gaW52YWxpZCBjbG9zaW5nIHRhZyBpcyBmb3VuZCwgaXQgaXMKKyAgaWdub3JlZC4KKworKiBQYXJzZSBhcyBibG9jay1sZXZlbCBlbGVtZW50czogSWYgdGhlIEhUTUwvWE1MIHRhZyBjb250ZW50IHNob3VsZCBiZSBwYXJzZWQgYXMgdGV4dCBjb250YWluaW5nCisgIGJsb2NrLWxldmVsIGVsZW1lbnRzLCB0aGUgcmVtYWluaW5nIHRleHQgb24gdGhlIGxpbmUgd2lsbCBiZSBwYXJzZWQgYnkgdGhlIGJsb2NrLWxldmVsIHBhcnNlciBhcworICBpZiBpdCBhcHBlYXJzIG9uIGEgc2VwYXJhdGUgbGluZSAoKipDYXV0aW9uKio6IFRoaXMgYWxzbyBtZWFucyB0aGF0IGlmIHRoZSBsaW5lIGNvbnNpc3RzIG9mIHRoZQorICBzdGFydCB0YWcsIHRleHQgYW5kIHRoZSBlbmQgdGFnLCB0aGUgZW5kIHRhZyB3aWxsIG5vdCBiZSBmb3VuZCEpLiBBbGwgZm9sbG93aW5nIGxpbmVzIGFyZSBwYXJzZWQKKyAgYXMgYmxvY2stbGV2ZWwgZWxlbWVudHMgdW50aWwgYW4gSFRNTCBibG9jayBsaW5lIHdpdGggdGhlIG1hdGNoaW5nIGVuZCB0YWcgaXMgZm91bmQgb3IgdW50aWwgdGhlCisgIGVuZCBvZiB0aGUgZG9jdW1lbnQuCisKKyogUGFyc2UgYXMgc3Bhbi1sZXZlbCBlbGVtZW50czogSWYgdGhlIEhUTUwvWE1MIHRhZyBjb250ZW50IHNob3VsZCBiZSBwYXJzZWQgYXMgdGV4dCBjb250YWluaW5nIHNwYW4KKyAgbGV2ZWwgZWxlbWVudHMsIHRoZW4gYWxsIHRleHQgdW50aWwgdGhlICpuZXh0KiBtYXRjaGluZyBlbmQgdGFnIG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50CisgIHdpbGwgYmUgdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyBhbmQgd2lsbCBsYXRlciBiZSBwYXJzZWQgYnkgdGhlIHNwYW4tbGV2ZWwgcGFyc2VyLiBUaGlzIGFsc28gbWVhbnMKKyAgdGhhdCBpZiB0aGUgbWF0Y2hpbmcgZW5kIHRhZyBpcyBpbnNpZGUgd2hhdCBhcHBlYXJzIHRvIGJlIGEgY29kZSBzcGFuLCBpdCBpcyBzdGlsbCB1c2VkIQorCitJZiB0aGVyZSBpcyB0ZXh0IGFmdGVyIGFuIGVuZCB0YWcsIGl0IHdpbGwgYmUgcGFyc2VkIGFzIGlmIGl0IGFwcGVhcnMgb24gYSBzZXBhcmF0ZSBsaW5lIGV4Y2VwdCB3aGVuCitpbnNpZGUgYSByYXcgSFRNTCBibG9jay4KKworQWxzbywgaWYgYW4gaW52YWxpZCBjbG9zaW5nIHRhZyBpcyBmb3VuZCwgaXQgaXMgaWdub3JlZC4KKworTm90ZSB0aGF0IGFsbCBIVE1MIHRhZyBhbmQgYXR0cmlidXRlIG5hbWVzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIQorCitCeSBkZWZhdWx0LCBrcmFtZG93biBwYXJzZXMgYWxsIGJsb2NrIEhUTUwgdGFncyBhbmQgYWxsIFhNTCB0YWdzIGFzIHJhdyBIVE1MIGJsb2Nrcy4gSG93ZXZlciwgdGhpcworY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgYHBhcnNlX2Jsb2NrX2h0bWxgLiBJZiB0aGlzIGlzIHNldCB0byBgdHJ1ZWAsIHRoZW4gc3ludGF4IHBhcnNpbmcgaW4gSFRNTAorYmxvY2tzIGlzIGdsb2JhbGx5IGVuYWJsZWQuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gZW5hYmxlL2Rpc2FibGUgc3ludGF4IHBhcnNpbmcgb24gYSB0YWcgcGVyIHRhZworYmFzaXMgdXNpbmcgdGhlIGBtYXJrZG93bmAgYXR0cmlidXRlOgorCisqIElmIGFuIEhUTUwgdGFnIGhhcyBhbiBhdHRyaWJ1dGUgYG1hcmtkb3duPSIwImAsIHRoZW4gdGhlIHRhZyBpcyBwYXJzZWQgYXMgcmF3IEhUTUwgYmxvY2suCisKKyogSWYgYW4gSFRNTCB0YWcgaGFzIGFuIGF0dHJpYnV0ZSBgbWFya2Rvd249IjEiYCwgdGhlbiB0aGUgZGVmYXVsdCBtZWNoYW5pc20gZm9yIHBhcnNpbmcgc3ludGF4IGluCisgIHRoaXMgdGFnIGlzIHVzZWQuCisKKyogSWYgYW4gSFRNTCB0YWcgaGFzIGFuIGF0dHJpYnV0ZSBgbWFya2Rvd249ImJsb2NrImAsIHRoZW4gdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyBpcyBwYXJzZWQgYXMgYmxvY2sKKyAgbGV2ZWwgZWxlbWVudHMuCisKKyogSWYgYW4gSFRNTCB0YWcgaGFzIGFuIGF0dHJpYnV0ZSBgbWFya2Rvd249InNwYW4iYCwgdGhlbiB0aGUgY29udGVudCBvZiB0aGUgdGFnIGlzIHBhcnNlZCBhcyBzcGFuCisgIGxldmVsIGVsZW1lbnRzLgorCitUaGUgZm9sbG93aW5nIGxpc3Qgc2hvd3Mgd2hpY2ggSFRNTCB0YWdzIGFyZSBwYXJzZWQgaW4gd2hpY2ggbW9kZSBieSBkZWZhdWx0IHdoZW4gYG1hcmtkb3duPSIxImAgaXMKK2FwcGxpZWQgb3IgYHBhcnNlX2Jsb2NrX2h0bWxgIGlzIGB0cnVlYDoKKworUGFyc2UgYXMgcmF3IEhUTUwKKzogCisgICAgICAgIHNjcmlwdCBzdHlsZSBtYXRoIG9wdGlvbiB0ZXh0YXJlYSBwcmUgY29kZSBrYmQgc2FtcCB2YXIKKworICAgIEFsc28sIGFsbCBnZW5lcmFsIFhNTCB0YWdzIGFyZSBwYXJzZWQgYXMgcmF3IEhUTUwgYmxvY2tzLgorCitQYXJzZSBhcyBibG9jay1sZXZlbCBlbGVtZW50cworOiAKKyAgICAgICAgYXBwbGV0IGJ1dHRvbiBibG9ja3F1b3RlIGJvZHkgY29sZ3JvdXAgZGQgZGl2IGRsIGZpZWxkc2V0IGZvcm0gaWZyYW1lIGxpCisgICAgICAgIG1hcCBub3NjcmlwdCBvYmplY3Qgb2wgdGFibGUgdGJvZHkgdGhlYWQgdGZvb3QgdHIgdGQgdWwKKworUGFyc2UgYXMgc3Bhbi1sZXZlbCBlbGVtZW50cworOiAKKyAgICAgICAgYSBhYmJyIGFjcm9ueW0gYWRkcmVzcyBiIGJkbyBiaWcgY2l0ZSBjYXB0aW9uIGNvZGUgZGVsIGRmbiBkdCBlbQorICAgICAgICBoMSBoMiBoMyBoNCBoNSBoNiBpIGlucyBrYmQgbGFiZWwgbGVnZW5kIG9wdGdyb3VwIHAgcHJlIHEgcmIgcmJjCisgICAgICAgIHJwIHJ0IHJ0YyBydWJ5IHNhbXAgc2VsZWN0IHNtYWxsIHNwYW4gc3Ryb25nIHN1YiBzdXAgdGggdHQgdmFyCisKKz4gUmVtZW1iZXIgdGhhdCBhbGwgc3Bhbi1sZXZlbCBIVE1MIHRhZ3MgbGlrZSBgYWAgb3IgYGJgIGRvIG5vdCBzdGFydCBhIEhUTUwgYmxvY2shIEhvd2V2ZXIsIHRoZQorPiBhYm92ZSBsaXN0cyBhbHNvIGluY2x1ZGUgc3Bhbi1sZXZlbCBIVE1MIHRhZ3MgaW4gdGhlIGNhc2UgdGhlIGBtYXJrZG93bmAgYXR0cmlidXRlIGlzIHVzZWQgb24gYQorPiB0YWcgaW5zaWRlIGEgcmF3IEhUTUwgYmxvY2suCisKK0hlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZSBpbnB1dCBhbmQgaXRzIEhUTUwgb3V0cHV0IHdpdGggYHBhcnNlX2Jsb2NrX2h0bWxgIHNldCB0byBgZmFsc2VgOgorCisgICAgVGhpcyBpcyBhIHBhcmEuCisgICAgPGRpdj4KKyAgICBTb21ldGhpbmcgaW4gaGVyZS4KKyAgICA8L2Rpdj4KKyAgICBPdGhlciBwYXJhLgorXgorICAgIDxwPlRoaXMgaXMgYSBwYXJhLjwvcD4KKyAgICA8ZGl2PgorICAgIFNvbWV0aGluZyBpbiBoZXJlLgorICAgIDwvZGl2PgorICAgIDxwPk90aGVyIHBhcmEuPC9wPgorCitBcyBvbmUgY2FuIHNlZSB0aGUgY29udGVudCBvZiB0aGUgYGRpdmAgdGFnIHdpbGwgYmUgcGFyc2VkIGFzIHJhdyBIVE1MIGJsb2NrIGFuZCBsZWZ0IGFsb25lLgorSG93ZXZlciwgaWYgdGhlIGBtYXJrZG93bj0iMSJgIGF0dHJpYnV0ZSB3YXMgdXNlZCBvbiB0aGUgYGRpdmAgdGFnLCB0aGUgY29udGVudCB3b3VsZCBiZSBwYXJzZWQgYXMKK2Jsb2NrLWxldmVsIGVsZW1lbnRzIGFuZCB0aGVyZWZvcmUgY29udmVydGVkIHRvIGEgcGFyYWdyYXBoLgorCitZb3UgY2FuIGFsc28gdXNlIHNldmVyYWwgSFRNTCB0YWdzIGF0IG9uY2U6CisKKyAgICA8ZGl2IGlkPSJjb250ZW50Ij48ZGl2IGlkPSJsYXllcnMiPjxkaXYgaWQ9ImxheWVyMSI+CisgICAgVGhpcyBpcyBzb21lIHRleHQgaW4gdGhlIGBsYXllcjFgIGRpdi4KKyAgICA8L2Rpdj4KKyAgICBUaGlzIGlzIHNvbWUgdGV4dCBpbiB0aGUgYGxheWVyc2AgZGl2LgorICAgIDwvZGl2PjwvZGl2PgorICAgIFRoaXMgaXMgYSBwYXJhIG91dHNpZGUgdGhlIEhUTUwgYmxvY2suCisKK0hvd2V2ZXIsIHJlbWVtYmVyIHRoYXQgaWYgdGhlIGNvbnRlbnQgb2YgYSB0YWcgaXMgcGFyc2VkIGFzIGJsb2NrLWxldmVsIGVsZW1lbnRzLCB0aGUgY29udGVudCB0aGF0CithcHBlYXJzIGFmdGVyIGEgc3RhcnQvZW5kIHRhZyBidXQgb24gdGhlIHNhbWUgbGluZSwgaXMgcHJvY2Vzc2VkIGFzIGlmIGl0IGFwcGVhcnMgb24gYSBuZXcgbGluZToKKworICAgIDxkaXYgbWFya2Rvd249IjEiPlRoaXMgaXMgdGhlIGZpcnN0IHBhcnQgb2YgYSBwYXJhLAorICAgIHdoaWNoIGlzIGNvbnRpbnVlZCBoZXJlLgorICAgIDwvZGl2PgorCisgICAgPHAgbWFya2Rvd249IjEiPlRoaXMgd29ya3Mgd2l0aG91dCBwcm9ibGVtcyBiZWNhdXNlIGl0IGlzIHBhcnNlZCBhcworICAgIHNwYW4tbGV2ZWwgZWxlbWVudHM8L3A+CisKKyAgICA8ZGl2IG1hcmtkb3duPSIxIj5UaGUgZW5kIHRhZyBpcyBub3QgZm91bmQgYmVjYXVzZQorICAgIHRoaXMgbGluZSBpcyBwYXJzZWQgYXMgYSBwYXJhZ3JhcGg8L2Rpdj4KKworU2luY2Ugc2V0dGluZyBgcGFyc2VfYmxvY2tfaHRtbGAgdG8gYHRydWVgIGNhbiBsZWFkIHRvIHNvbWUgbm90IHdhbnRlZCBiZWhhdmlvdXIsIGl0IGlzIGdlbmVyYWxseQorYmV0dGVyIHRvIHNlbGVjdGl2ZWx5IGVuYWJsZSBvciBkaXNhYmxlIGJsb2NrL3NwYW4tbGV2ZWwgZWxlbWVudHMgcGFyc2luZyBieSB1c2luZyB0aGUgYG1hcmtkb3duYAorYXR0cmlidXRlIQorCitVbmNsb3NlZCBibG9jay1sZXZlbCBIVE1MIHRhZ3MgYXJlIGNvcnJlY3RseSBjbG9zZWQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgdG8gZW5zdXJlIGNvcnJlY3QKK25lc3RpbmcgYW5kIGludmFsaWRseSB1c2VkIGVuZCB0YWdzIGFyZSByZW1vdmVkIGZyb20gdGhlIG91dHB1dDoKKworICAgIFRoaXMgaXMgYSBwYXJhLgorICAgIDxkaXYgbWFya2Rvd249IjEiPgorICAgIEFub3RoZXIgcGFyYS4KKyAgICA8L3A+CiteCisgICAgPHA+VGhpcyBpcyBhIHBhcmEuPC9wPgorICAgIDxkaXY+CisgICAgICA8cD5Bbm90aGVyIHBhcmEuPC9wPgorICAgIDwvZGl2PgorCitUaGUgcGFyc2luZyBvZiBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhbmQgWE1MIGNvbW1lbnRzIGlzIGFsc28gc3VwcG9ydGVkLiBUaGUgY29udGVudCBvZiBib3RoLCBQSXMKK2FuZCBYTUwgY29tbWVudHMsIG1heSBzcGFuIG11bHRpcGxlIGxpbmVzLiBUaGUgc3RhcnQgb2YgYSBQSS9YTUwgY29tbWVudCBtYXkgb25seSBhcHBlYXIgYXQgdGhlCitiZWdpbm5pbmcgb2YgYSBsaW5lLCBvcHRpb25hbGx5IGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcy4gSWYgdGhlcmUgaXMgdGV4dCBhZnRlciB0aGUgZW5kIG9mIGEgUEkKK29yIFhNTCBjb21tZW50LCBpdCB3aWxsIGJlIHBhcnNlZCBhcyBpZiBpdCBhcHBlYXJzIG9uIGEgc2VwYXJhdGUgbGluZS4ga3JhbWRvd24gc3ludGF4IGluIFBJcy9YTUwKK2NvbW1lbnRzIGlzIG5vdCBwcm9jZXNzZWQ6CisKKyAgICBUaGlzIGlzIGEgcGFyYS4KKyAgICA8IS0tIGEgKmNvbW1lbnQqIC0tPgorICAgIDw/IGEgcHJvY2Vzc2luZyBgaW5zdHJ1Y3Rpb25gCisgICAgICAgc3Bhbm5pbmcgbXVsdGlwbGUgbGluZXMKKyAgICA/PiBGaXJzdCBwYXJ0IG9mIHBhcmEsCisgICAgY29udGludWVzIGhlcmUuCisKKworCisjIFRleHQgTWFya3VwCisKK1RoZXNlIGVsZW1lbnRzIGFyZSBhbGwgc3Bhbi1sZXZlbCBlbGVtZW50cyBhbmQgdXNlZCBpbnNpZGUgYmxvY2stbGV2ZWwgZWxlbWVudHMgdG8gbWFya3VwIHRleHQKK2ZyYWdtZW50cy4gRm9yIGV4YW1wbGUsIG9uZSBjYW4gZWFzaWx5IGNyZWF0ZSBsaW5rcyBvciBhcHBseSBlbXBoYXNpcyB0byBjZXJ0YWluIHRleHQgcGFydHMuCisKK05vdGUgdGhhdCBlbXB0eSBzcGFuLWxldmVsIGVsZW1lbnRzIGFyZSBub3QgY29udmVydGVkIHRvIGVtcHR5IEhUTUwgdGFncyBidXQgYXJlIGNvcGllZCBhcy1pcyB0byB0aGUKK291dHB1dC4KKworCisKKyMjIExpbmtzIGFuZCBJbWFnZXMKKworVGhyZWUgdHlwZXMgb2YgbGlua3MgYXJlIHN1cHBvcnRlZDogYXV0b21hdGljIGxpbmtzLCBpbmxpbmUgbGlua3MgYW5kIHJlZmVyZW5jZSBsaW5rcy4KKworIyMjIEF1dG9tYXRpYyBMaW5rcworCitUaGlzIGlzIHRoZSBlYXNpZXN0IG9uZSB0byBjcmVhdGU6IEp1c3Qgc3Vycm91bmQgYSB3ZWIgYWRkcmVzcyBvciBhbiBlbWFpbCBhZGRyZXNzIHdpdGggYW5nbGUKK2JyYWNrZXRzIGFuZCB0aGUgYWRkcmVzcyB3aWxsIGJlIHR1cm5lZCBpbnRvIGEgcHJvcGVyIGxpbmsuIFRoZSBhZGRyZXNzIHdpbGwgYmUgdXNlZCBhcyBsaW5rIHRhcmdldAorYW5kIGFzIGxpbmsgdGV4dC4gRm9yIGV4YW1wbGU6CisKKyAgICBJbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgb24gdGhlIDxodHRwOi8vZXhhbXBsZS5jb20+IGhvbWVwYWdlLgorICAgIFlvdSBjYW4gYWxzbyBtYWlsIG1lOiA8bWUuZXhhbXBsZUBleGFtcGxlLmNvbT4KKworSXQgaXMgbm90IHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgbGluayB0ZXh0IHVzaW5nIGF1dG9tYXRpYyBsaW5rcyAtLSB1c2UgdGhlIG90aGVyIGxpbmsKK3R5cGVzIGZvciB0aGlzIQorCisKKyMjIyBJbmxpbmUgTGlua3MKKworQXMgdGhlIHdvcmRpbmcgc3VnZ2VzdHMsIGlubGluZSBsaW5rcyBwcm92aWRlIGFsbCBpbmZvcm1hdGlvbiBpbmxpbmUgaW4gdGhlIHRleHQgZmxvdy4gUmVmZXJlbmNlCitzdHlsZSBsaW5rcyBvbmx5IHByb3ZpZGUgdGhlIGxpbmsgdGV4dCBpbiB0aGUgdGV4dCBmbG93IGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgZGVmaW5lZAorZWxzZXdoZXJlLiBUaGlzIGFsc28gYWxsb3dzIHlvdSB0byByZXVzZSBsaW5rIGRlZmluaXRpb25zLgorCitBbiBpbmxpbmUgc3R5bGUgbGluayBjYW4gYmUgY3JlYXRlZCBieSBzdXJyb3VuZGluZyB0aGUgbGluayB0ZXh0IHdpdGggc3F1YXJlIGJyYWNrZXRzLCBmb2xsb3dlZAoraW1tZWRpYXRlbHkgYnkgdGhlIGxpbmsgVVJMIChhbmQgYW4gb3B0aW9uYWwgdGl0bGUgaW4gc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgcHJlY2VkZWQgYnkgYXQgbGVhc3QKK29uZSBzcGFjZSkgaW4gbm9ybWFsIHBhcmVudGhlc2VzLiBGb3IgZXhhbXBsZToKKworICAgIFRoaXMgaXMgW2EgbGlua10oaHR0cDovL3J1Ynlmb3JnZS5vcmcpIHRvIGEgcGFnZS4KKyAgICBBIFtsaW5rXSguLi90ZXN0ICJsb2NhbCBVUkkiKSBjYW4gYWxzbyBoYXZlIGEgdGl0bGUuCisgICAgQW5kIFtzcGFjZXNdKGxpbmsgd2l0aCBzcGFjZXMuaHRtbCkhCisKK05vdGVzOgorCisqIFRoZSBsaW5rIHRleHQgaXMgdHJlYXRlZCBsaWtlIG5vcm1hbCBzcGFuLWxldmVsIHRleHQgYW5kIHRoZXJlZm9yZSBpcyBwYXJzZWQgYW5kIGNvbnZlcnRlZC4KKyAgSG93ZXZlciwgaWYgeW91IHVzZSBzcXVhcmUgYnJhY2tldHMgd2l0aGluIHRoZSBsaW5rIHRleHQsIHlvdSBoYXZlIHRvIGVpdGhlciBwcm9wZXJseSBuZXN0IHRoZW0gb3IKKyAgdG8gZXNjYXBlIHRoZW0uIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgbmVzdGVkIGxpbmtzIQorCisgIFRoZSBsaW5rIHRleHQgbWF5IGFsc28gYmUgb21pdHRlZCwgZS5nLiBmb3IgY3JlYXRpbmcgbGluayBhbmNob3JzLgorCisqIFRoZSBsaW5rIFVSTCBoYXMgdG8gY29udGFpbiBwcm9wZXJseSBuZXN0ZWQgcGFyZW50aGVzZXMgaWYgbm8gdGl0bGUgaXMgc3BlY2lmaWVkLCBvciB0aGUgbGluayBVUkwKKyAgbXVzdCBiZSBjb250YWluZWQgaW4gYW5nbGUgYnJhY2tldHMgKGluY29ycmVjdGx5IG5lc3RlZCBwYXJlbnRoZXNlcyBhcmUgYWxsb3dlZCkuCisKKyogVGhlIGxpbmsgdGl0bGUgbWF5IG5vdCBjb250YWluIGl0cyBkZWxpbWl0ZXJzIGFuZCBtYXkgbm90IGJlIGVtcHR5LgorCisqIEFkZGl0aW9uYWwgbGluayBhdHRyaWJ1dGVzIGNhbiBiZSBhZGRlZCBieSB1c2luZyBhIFtzcGFuIElBTF0oI3NwYW4taWFscykgYWZ0ZXIgdGhlIGlubGluZSBsaW5rLAorICBmb3IgZXhhbXBsZToKKworICAgICAgVGhpcyBpcyBhIFtsaW5rXShodHRwOi8vZXhhbXBsZS5jb20pezpocmVmbGFuZz0iZGUifQorCisjIyMgUmVmZXJlbmNlIExpbmtzCisKK1RvIGNyZWF0ZSBhIHJlZmVyZW5jZSBzdHlsZSBsaW5rLCB5b3UgbmVlZCB0byBzdXJyb3VuZCB0aGUgbGluayB0ZXh0IHdpdGggc3F1YXJlIGJyYWNrZXRzIChhcyB3aXRoCitpbmxpbmUgbGlua3MpLCBmb2xsb3dlZCBieSBvcHRpb25hbCBzcGFjZXMvdGFicy9saW5lIGJyZWFrcyBhbmQgdGhlbiBvcHRpb25hbGx5IGZvbGxvd2VkIHdpdGgKK2Fub3RoZXIgc2V0IG9mIHNxdWFyZSBicmFja2V0cyB3aXRoIHRoZSBsaW5rIGlkZW50aWZpZXIgaW4gdGhlbS4gQSBsaW5rIGlkZW50aWZpZXIgbWF5IG5vdCBjb250YWluIGEKK2Nsb3NpbmcgYnJhY2tldCBhbmQsIHdoZW4gc3BlY2lmaWVkIGluIGEgbGluayBkZWZpbml0aW9uLCBuZXdsaW5lIGNoYXJhY3RlcnM7IGl0IGlzIGFsc28gbm90IGNhc2UKK3NlbnNpdGl2ZSwgbGluZSBicmVha3MgYW5kIHRhYnMgYXJlIGNvbnZlcnRlZCB0byBzcGFjZXMgYW5kIG11bHRpcGxlIHNwYWNlcyBhcmUgY29tcHJlc3NlZCBpbnRvIG9uZS4KK0ZvciBleGFtcGxlOgorCisgICAgVGhpcyBpcyBhIFtyZWZlcmVuY2Ugc3R5bGUgbGlua11bbGlua2lkXSB0byBhIHBhZ2UuIEFuZCBbdGhpc10KKyAgICBbbGlua2lkXSBpcyBhbHNvIGEgbGluay4gQXMgaXMgW3RoaXNdW10gYW5kIFtUSElTXS4KKworSWYgeW91IGRvbid0IHNwZWNpZnkgYSBsaW5rIGlkZW50aWZpZXIgKGkuZS4gb25seSB1c2UgZW1wdHkgc3F1YXJlIGJyYWNrZXRzKSBvciBjb21wbGV0ZWx5IG9taXQgdGhlCitzZWNvbmQgcGFpciBvZiBzcXVhcmUgYnJhY2tldHMsIHRoZSBsaW5rIHRleHQgaXMgY29udmVydGVkIHRvIGEgdmFsaWQgbGluayBpZGVudGlmaWVyIGJ5IHJlbW92aW5nCithbGwgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCBpbnNlcnRpbmcgc3BhY2VzIGZvciBsaW5lIGJyZWFrcy4gSWYgdGhlcmUgaXMgYSBsaW5rIGRlZmluaXRpb24gZm91bmQgZm9yCit0aGUgbGluayBpZGVudGlmaWVyLCBhIGxpbmsgd2lsbCBiZSBjcmVhdGVkLiBPdGhlcndpc2UgdGhlIHRleHQgaXMgbm90IGNvbnZlcnRlZCB0byBhIGxpbmsuCisKK0FzIHdpdGggaW5saW5lIGxpbmtzLCBhZGRpdGlvbmFsIGxpbmsgYXR0cmlidXRlcyBjYW4gYmUgYWRkZWQgYnkgdXNpbmcgYSBbc3BhbiBJQUxdKCNzcGFuLWlhbHMpCithZnRlciB0aGUgcmVmZXJlbmNlIGxpbmsuCisKKyMjIyBMaW5rIERlZmluaXRpb25zCisKK1RoZSBsaW5rIGRlZmluaXRpb24gY2FuIGJlIHB1dCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQuIEl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgb3V0cHV0LiBBIGxpbmsKK2RlZmluaXRpb24gbG9va3MgbGlrZSB0aGlzOgorCisgICAgW2xpbmtpZF06IGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vICJPcHRpb25hbCBUaXRsZSIKKworPiBMaW5rIGRlZmluaXRpb25zIGFyZSwgZGVzcGl0ZSBiZWluZyBkZXNjcmliZWQgaGVyZSwgbm9uLWNvbnRlbnQgYmxvY2stbGV2ZWwgZWxlbWVudHMuCit7OiAuaW5mb3JtYXRpb259CisKK1RoZSBsaW5rIGRlZmluaXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCisqIFRoZSBsaW5rIGlkZW50aWZpZXIgaW4gc3F1YXJlIGJyYWNrZXRzLCBvcHRpb25hbGx5IGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcywKKyogdGhlbiBhIGNvbG9uIGFuZCBvbmUgb3IgbW9yZSBvcHRpb25hbCBzcGFjZXMvdGFicywKKyogdGhlbiB0aGUgbGluayBVUkwgd2hpY2ggbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBub24tc3BhY2UgY2hhcmFjdGVyLCBvciBhIGxlZnQgYW5nbGUgYnJhY2tldCwKKyAgdGhlIGxpbmsgVVJMIGFuZCBhIHJpZ2h0IGFuZ2xlIGJyYWNrZXQsCisqIHRoZW4gb3B0aW9uYWxseSB0aGUgdGl0bGUgaW4gc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsIHNlcGFyYXRlZCBmcm9tIHRoZSBsaW5rIFVSTCBieSBvbmUgb3IgbW9yZQorICBzcGFjZXMgb3Igb24gdGhlIG5leHQgbGluZSBieSBpdHNlbGYgaW5kZW50ZWQgYW55IG51bWJlciBvZiBzcGFjZXMvdGFicy4KKworPiBUaGUgb3JpZ2luYWwgTWFya2Rvd24gc3ludGF4IGFsc28gYWxsb3dlZCB0aGUgdGl0bGUgdG8gYmUgc3BlY2lmaWVkIGluIHBhcmVudGhlc2lzLiBUaGlzIGlzIG5vdAorPiBhbGxvd2VkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBpbmxpbmUgdGl0bGUuCit7OiAubWFya2Rvd24tZGlmZmVyZW5jZX0KKworSWYgeW91IGhhdmUgc29tZSB0ZXh0IHRoYXQgbG9va3MgbGlrZSBhIGxpbmsgZGVmaW5pdGlvbiBidXQgc2hvdWxkIHJlYWxseSBiZSBhIGxpbmsgYW5kIHNvbWUgdGV4dCwKK3lvdSBjYW4gZXNjYXBlIHRoZSBjb2xvbiBhZnRlciB0aGUgbGluayBpZGVudGlmaWVyOgorCisgICAgVGhlIG5leHQgcGFyYWdyYXBoIGNvbnRhaW5zIGEgbGluayBhbmQgc29tZSB0ZXh0LgorCisgICAgW1Jvb20gMTAwXVw6IFRoZXJlIHlvdSBzaG91bGQgZmluZCBldmVyeXRoaW5nIHlvdSBuZWVkIQorCisgICAgW1Jvb20gMTAwXTogbGlua190b19yb29tXzEwMC5odG1sCisKK0FsdGhvdWdoIGxpbmsgZGVmaW5pdGlvbnMgYXJlIG5vbi1jb250ZW50IGJsb2NrLWxldmVsIGVsZW1lbnRzLCBbYmxvY2sgSUFMc10oI2Jsb2NrLWlhbHMpIGNhbiBiZQordXNlZCBvbiB0aGVtIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGZvciB0aGUgbGlua3M6CisKKyAgICBbbGlua2lkXTogaHR0cDovL2V4YW1wbGUuY29tCisgICAgezpocmVmbGFuZz0iZGUifQorCisjIyMgSW1hZ2VzCisKK0ltYWdlcyBjYW4gYmUgc3BlY2lmaWVkIHZpYSBhIHN5bnRheCB0aGF0IGlzIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2VkIGJ5IGxpbmtzLiBUaGUgZGlmZmVyZW5jZSBpcwordGhhdCB5b3UgaGF2ZSB0byB1c2UgYW4gZXhjbGFtYXRpb24gbWFyayBiZWZvcmUgdGhlIGZpcnN0IHNxdWFyZSBicmFja2V0IGFuZCB0aGF0IHRoZSBsaW5rIHRleHQgb2YgYQorbm9ybWFsIGxpbmsgYmVjb21lcyB0aGUgYWx0ZXJuYXRpdmUgdGV4dCBvZiB0aGUgaW1hZ2UgbGluay4gQXMgd2l0aCBub3JtYWwgbGlua3MsIGltYWdlIGxpbmtzIGNhbiBiZQord3JpdHRlbiBpbmxpbmUgb3IgcmVmZXJlbmNlIHN0eWxlLiBGb3IgZXhhbXBsZToKKworICAgIEhlcmUgY29tZXMgYSAhW3NtaWxleV0oLi4vaW1hZ2VzL3NtaWxleS5wbmcpISBBbmQgaGVyZQorICAgICFbdG9vXSguLi9pbWFnZXMvb3RoZXIucG5nICdUaXRsZSB0ZXh0JykuIE9yICFbaGVyZV0uCisgICAgV2l0aCBlbXB0eSBhbHQgdGV4dCAhW10oc2VlLmpwZykKKworVGhlIGxpbmsgZGVmaW5pdGlvbiBmb3IgaW1hZ2VzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGxpbmsgZGVmaW5pdGlvbiBmb3Igbm9ybWFsIGxpbmtzLiBTaW5jZQorYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGNhbiBiZSBhZGRlZCB2aWEgc3BhbiBhbmQgYmxvY2sgSUFMcywgaXQgaXMgcG9zc2libGUsIGZvciBleGFtcGxlLCB0byBzcGVjaWZ5CitpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0OgorCisgICAgSGVyZSBpcyBhbiBpbmxpbmUgIVtzbWlsZXldKHNtaWxleS5wbmcpezpoZWlnaHQ9IjM2cHgiIHdpZHRoPSIzNnB4In0uCisKKyAgICBBbmQgaGVyZSBpcyBhIHJlZmVyZW5jZWQgIVtzbWlsZV0KKworICAgIFtzbWlsZV06IHNtaWxlLnBuZworICAgIHs6IGhlaWdodD0iMzZweCIgd2lkdGg9IjM2cHgifQorCisjIyBFbXBoYXNpcworCitrcmFtZG93biBzdXBwb3J0cyB0d28gdHlwZXMgb2YgZW1waGFzaXM6IGxpZ2h0IGFuZCBzdHJvbmcgZW1waGFzaXMuIFRleHQgcGFydHMgdGhhdCBhcmUgc3Vycm91bmRlZAord2l0aCBzaW5nbGUgYXN0ZXJpc2tzIGAqYCBvciB1bmRlcnNjb3JlcyBgX2AgYXJlIHRyZWF0ZWQgYXMgdGV4dCB3aXRoIGxpZ2h0IGVtcGhhc2lzLCB0ZXh0IHBhcnRzCitzdXJyb3VuZGVkIHdpdGggdHdvIGFzdGVyaXNrcyBvciB1bmRlcnNjb3JlcyBhcmUgdHJlYXRlZCBhcyB0ZXh0IHdpdGggc3Ryb25nIGVtcGhhc2lzLiBTdXJyb3VuZGVkCittZWFucyB0aGF0IHRoZSBzdGFydGluZyBkZWxpbWl0ZXIgbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSBhbmQgdGhhdCB0aGUgc3RvcHBpbmcgZGVsaW1pdGVyCittdXN0IG5vdCBiZSBwcmVjZWRlZCBieSBhIHNwYWNlLgorCitIZXJlIGlzIGFuIGV4YW1wbGUgZm9yIHRleHQgd2l0aCBsaWdodCBhbmQgc3Ryb25nIGVtcGhhc2lzOgorCisgICAgKnNvbWUgdGV4dCoKKyAgICBfc29tZSB0ZXh0XworICAgICoqc29tZSB0ZXh0KioKKyAgICBfX3NvbWUgdGV4dF9fCisKK1RoZSBhc3RlcmlzayBmb3JtIGlzIGFsc28gYWxsb3dlZCB3aXRoaW4gYSBzaW5nbGUgd29yZDoKKworICAgIFRoaXMgaXMgdW4qYmVsaWV2ZSphYmxlISBUaGlzIGRfb2VfcyBub3Qgd29yayEKKworVGV4dCBjYW4gYmUgbWFya2VkIHVwIHdpdGggYm90aCBsaWdodCBhbmQgc3Ryb25nIGVtcGhhc2lzLCBwb3NzaWJseSB1c2luZyBkaWZmZXJlbnQgZGVsaW1pdGVycy4KK0hvd2V2ZXIsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBuZXN0IHN0cm9uZyB3aXRoaW4gc3Ryb25nIG9yIGxpZ2h0IHdpdGhpbiBsaWdodCBlbXBoYXNpemVkIHRleHQ6CisKKyAgICBUaGlzIGlzIGEgKioqdGV4dCB3aXRoIGxpZ2h0IGFuZCBzdHJvbmcgZW1waGFzaXMqKiouCisgICAgVGhpcyAqKmlzIF9lbXBoYXNpemVkXyBhcyB3ZWxsKiouCisgICAgVGhpcyAqZG9lcyBfbm90XyB3b3JrKi4KKyAgICBUaGlzICoqZG9lcyBfX25vdF9fIHdvcmsgZWl0aGVyKiouCisKK0lmIG9uZSBvciB0d28gYXN0ZXJpc2tzIG9yIHVuZGVyc2NvcmVzIGFyZSBzdXJyb3VuZGVkIGJ5IHNwYWNlcywgdGhleSBhcmUgdHJlYXRlZCBsaXRlcmFsbHkuIElmIHlvdQord2FudCB0byBmb3JjZSB0aGUgbGl0ZXJhbCBtZWFuaW5nIG9mIGFuIGFzdGVyaXNrIG9yIGFuIHVuZGVyc2NvcmUgeW91IGNhbiBiYWNrc2xhc2gtZXNjYXBlIGl0OgorCisgICAgVGhpcyBpcyBhICogbGl0ZXJhbCBhc3Rlcmlzay4KKyAgICBUaGVzZSBhcmUgKiogdHdvIGxpdGVyYWwgYXN0ZXJpc2suCisgICAgQXMgXCphcmVcKiB0aGVzZSEKKworCisjIyBDb2RlIFNwYW5zCisKK1RoaXMgaXMgdGhlIHNwYW4tbGV2ZWwgZXF1aXZhbGVudCBvZiB0aGUgW2NvZGUgYmxvY2tdKCNjb2RlLWJsb2NrcykgZWxlbWVudC4gWW91IGNhbiBtYXJrdXAgYSB0ZXh0CitwYXJ0IGFzIGNvZGUgc3BhbiBieSBzdXJyb3VuZGluZyBpdCB3aXRoIGJhY2t0aWNrcyBgYCBgIGBgLiBGb3IgZXhhbXBsZToKKworICAgIFVzZSBgPGh0bWw+YCB0YWdzIGZvciB0aGlzLgorCitOb3RlIHRoYXQgYWxsIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIGNvZGUgc3BhbiBhcmUgdHJlYXRlZCBjb3JyZWN0bHkuIEZvciBleGFtcGxlLCB3aGVuIGEgY29kZSBzcGFuCitpcyBjb252ZXJ0ZWQgdG8gSFRNTCwgdGhlIGNoYXJhY3RlcnMgYDxgLCBgPmAgYW5kIGAmYCBhcmUgc3Vic3RpdHV0ZWQgYnkgdGhlaXIgcmVzcGVjdGl2ZSBIVE1MCitjb3VudGVycGFydHMuCisKK1RvIGluY2x1ZGUgYSBsaXRlcmFsIGJhY2t0aWNrIGluIGEgY29kZSBzcGFuLCB5b3UgbmVlZCB0byB1c2UgdHdvIG9yIG1vcmUgYmFja3RpY2tzIGFzIGRlbGltaXRlcnMuCitZb3UgY2FuIGluc2VydCBvbmUgb3B0aW9uYWwgc3BhY2UgYWZ0ZXIgdGhlIHN0YXJ0aW5nIGFuZCBiZWZvcmUgdGhlIGVuZGluZyBkZWxpbWl0ZXIgKHRoZXNlIHNwYWNlcworYXJlIG5vdCB1c2VkIGluIHRoZSBvdXRwdXQpLiBGb3IgZXhhbXBsZToKKworICAgIEhlcmUgaXMgYSBsaXRlcmFsIGBgIGAgYGAgYmFja3RpY2suCisgICAgQW5kIGhlcmUgaXMgYGAgIGBzb21lYCAgYGAgdGV4dCAobm90ZSB0aGUgdHdvIHNwYWNlcyBzbyB0aGF0IG9uZSBpcyBsZWZ0CisgICAgaW4gdGhlIG91dHB1dCEpLgorCitBIHNpbmdsZSBiYWNrdGljayBzdXJyb3VuZGVkIGJ5IHNwYWNlcyBpcyB0cmVhdGVkIGFzIGxpdGVyYWwgYmFja3RpY2suIElmIHlvdSB3YW50IHRvIGZvcmNlIHRoZQorbGl0ZXJhbCBtZWFuaW5nIG9mIGEgYmFja3RpY2sgeW91IGNhbiBiYWNrc2xhc2gtZXNjYXBlIGl0OgorCisgICAgVGhpcyBpcyBhIGAgbGl0ZXJhbCBiYWNrdGljay4KKyAgICBBcyBcYGFyZVxgIHRoZXNlIQorCitBcyB3aXRoIFtjb2RlIGJsb2Nrc10oI2xhbmd1YWdlLW9mLWNvZGUtYmxvY2tzKSB5b3UgY2FuIHNldCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb2RlIHNwYW4gYnkgdXNpbmcgYW4KK1tJQUxdKCNpbmxpbmUtYXR0cmlidXRlLWxpc3RzKToKKworICAgIFRoaXMgaXMgYSBSdWJ5IGNvZGUgZnJhZ21lbnQgYHggPSBDbGFzcy5uZXdgezoubGFuZ3VhZ2UtcnVieX0KKworCisjIyBIVE1MIFNwYW5zCisKK0hUTUwgdGFncyBjYW5ub3Qgb25seSBiZSB1c2VkIG9uIHRoZSBibG9jay1sZXZlbCBidXQgYWxzbyBvbiB0aGUgc3Bhbi1sZXZlbC4gU3Bhbi1sZXZlbCBIVE1MIHRhZ3MKK2NhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIG9uZSBibG9jay1sZXZlbCBlbGVtZW50LCBpdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIGEgc3RhcnQgdGFnIGluIG9uZSBibG9jaworbGV2ZWwgZWxlbWVudCBhbmQgdGhlIGVuZCB0YWcgaW4gYW5vdGhlci4gTm90ZSB0aGF0IG9ubHkgY29ycmVjdCBYSFRNTCBpcyBzdXBwb3J0ZWQhIFRoaXMgbWVhbnMgdGhhdAoreW91IGhhdmUgdG8gdXNlLCBmb3IgZXhhbXBsZSwgYDxiciAvPmAgaW5zdGVhZCBvZiBgPGJyPmAgKGFsdGhvdWdoIGtyYW1kb3duIHRyaWVzIHRvIGZpeCBzdWNoIGVycm9ycworaWYgcG9zc2libGUpLgorCitCeSBkZWZhdWx0LCBrcmFtZG93biBwYXJzZXMga3JhbWRvd24gc3ludGF4IGluc2lkZSBzcGFuIEhUTUwgdGFncy4gSG93ZXZlciwgdGhpcyBiZWhhdmlvdXIgY2FuIGJlCitjb25maWd1cmVkIHdpdGggdGhlIGBwYXJzZV9zcGFuX2h0bWxgIG9wdGlvbi4gSWYgdGhpcyBpcyBzZXQgdG8gYHRydWVgLCB0aGVuIHN5bnRheCBwYXJzaW5nIGluIEhUTUwKK3NwYW5zIGlzIGVuYWJsZWQsIGlmIGl0IGlzIHNldCB0byBgZmFsc2VgLCBwYXJzaW5nIGlzIGRpc2FibGVkLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvCitlbmFibGUvZGlzYWJsZSBzeW50YXggcGFyc2luZyBvbiBhIHRhZyBwZXIgdGFnIGJhc2lzIHVzaW5nIHRoZSBgbWFya2Rvd25gIGF0dHJpYnV0ZToKKworKiBJZiBhbiBIVE1MIHRhZyBoYXMgYW4gYXR0cmlidXRlIGBtYXJrZG93bj0iMCJgLCB0aGVuIG5vIHBhcnNpbmcgKGV4Y2VwdCBwYXJzaW5nIG9mIEhUTUwgc3BhbiB0YWdzKQorICBpcyBkb25lIGluc2lkZSB0aGF0IEhUTUwgdGFnLgorCisqIElmIGFuIEhUTUwgdGFnIGhhcyBhbiBhdHRyaWJ1dGUgYG1hcmtkb3duPSIxImAsIHRoZW4gdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyBpcyBwYXJzZWQgYXMgc3BhbgorICBsZXZlbCBlbGVtZW50cy4KKworKiBJZiBhbiBIVE1MIHRhZyBoYXMgYW4gYXR0cmlidXRlIGBtYXJrZG93bj0iYmxvY2siYCwgdGhlbiBhIHdhcm5pbmcgaXMgaXNzdWVkIGJlY2F1c2UgSFRNTCBzcGFucworICBjYW5ub3QgY29udGFpbiBibG9jay1sZXZlbCBlbGVtZW50cyBhbmQgdGhlIGF0dHJpYnV0ZSBpcyBpZ25vcmVkLgorCisqIElmIGFuIEhUTUwgdGFnIGhhcyBhbiBhdHRyaWJ1dGUgYG1hcmtkb3duPSJzcGFuImAsIHRoZW4gdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyBpcyBwYXJzZWQgYXMgc3BhbgorICBsZXZlbCBlbGVtZW50cy4KKworVGhlIGNvbnRlbnQgb2YgYSBzcGFuLWxldmVsIEhUTUwgdGFnIGlzIG5vcm1hbGx5IHBhcnNlZCBhcyBzcGFuLWxldmVsIGVsZW1lbnRzLiBOb3RlLCBob3dldmVyLCB0aGF0Citzb21lIHRhZ3MgbGlrZSBgPHNjcmlwdD5gIGFyZSBub3QgcGFyc2VkLCBpLmUuIHRoZWlyIGNvbnRlbnQgaXMgbm90IG1vZGlmaWVkLgorCitQcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhbmQgWE1MIGNvbW1lbnRzIGNhbiBhbHNvIGJlIHVzZWQgKHRoZWlyIGNvbnRlbnQgaXMgbm90IHBhcnNlZCkuIEhvd2V2ZXIsIGFzCit3aXRoIEhUTUwgdGFncyB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgaGF2ZSB0byBhcHBlYXIgaW4gdGhlIHNhbWUgYmxvY2stbGV2ZWwgZWxlbWVudC4KKworU3Bhbi1sZXZlbCBQSXMgYW5kIHNwYW4tbGV2ZWwgWE1MIGNvbW1lbnRzIGFzIHdlbGwgYXMgZ2VuZXJhbCBzcGFuLWxldmVsIEhUTUwgYW5kIFhNTCB0YWdzIGhhdmUgdG8KK2JlIHByZWNlZGVkIGJ5IGF0IGxlYXN0IG9uZSBub24gd2hpdGVzcGFjZSBjaGFyYWN0ZXIgb24gdGhlIHNhbWUgbGluZSBzbyB0aGF0IGtyYW1kb3duIGNvcnJlY3RseQorcmVjb2duaXplcyB0aGVtIGFzIHNwYW4tbGV2ZWwgZWxlbWVudCBhbmQgbm90IGFzIGJsb2NrLWxldmVsIGVsZW1lbnQuIEhvd2V2ZXIsIGFsbCBzcGFuIEhUTUwgdGFncywKK2kuZS4gYGFgLCBgZW1gLCBgYmAsIC4uLiwgKG9wZW5pbmcgb3IgY2xvc2luZykgY2FuIGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCitVbmNsb3NlZCBzcGFuLWxldmVsIEhUTUwgdGFncyBhcmUgY29ycmVjdGx5IGNsb3NlZCBhdCB0aGUgZW5kIG9mIHRoZSBzcGFuLWxldmVsIHRleHQgdG8gZW5zdXJlCitjb3JyZWN0IG5lc3RpbmcgYW5kIGludmFsaWRseSB1c2VkIGVuZCB0YWdzIG9yIGJsb2NrIEhUTUwgdGFncyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBvdXRwdXQ6CisKKyAgICBUaGlzIGlzIDwvaW52YWxpZD4uCisKKyAgICBUaGlzIDxzcGFuPmlzIGF1dG9tYXRpY2FsbHkgY2xvc2VkLgorXgorICAgIDxwPlRoaXMgaXMgLjwvcD4KKworICAgIDxwPlRoaXMgPHNwYW4+aXMgYXV0b21hdGljYWxseSBjbG9zZWQuPC9zcGFuPjwvcD4KKworQWxzbyBub3RlIHRoYXQgb25lIG9yIG1vcmUgY29uc2VjdXRpdmUgbmV3IGxpbmUgY2hhcmFjdGVycyBpbiBhbiBIVE1MIHNwYW4gdGFnIGFyZSByZXBsYWNlZCBieSBhCitzaW5nbGUgc3BhY2UsIGZvciBleGFtcGxlOgorCisgICAgTGluazogPGEgaHJlZj0ic29tZQorICAgIGxpbmsiPnRleHQ8L2E+CiteCisgICAgPHA+TGluazogPGEgaHJlZj0ic29tZSBsaW5rIj50ZXh0PC9hPjwvcD4KKworCisjIyBGb290bm90ZXMKKworPiBUaGlzIHN5bnRheCBmZWF0dXJlIGlzIG5vdCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBNYXJrZG93biBzeW50YXguIFRoZSBpZGVhIGFuZCBzeW50YXggY29tZXMgZnJvbQorPiB0aGUgW1BIUCBNYXJrZG93biBFeHRyYV0gcGFja2FnZS4KK3s6IC5tYXJrZG93bi1kaWZmZXJlbmNlfQorCitGb290bm90ZXMgaW4ga3JhbWRvd24gYXJlIHNpbWlsYXIgdG8gcmVmZXJlbmNlIHN0eWxlIGxpbmtzIGFuZCBsaW5rIGRlZmluaXRpb25zLiBZb3UgbmVlZCB0byBwbGFjZQordGhlIGZvb3Rub3RlIG1hcmtlciBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgdGV4dCBhbmQgdGhlIGFjdHVhbCBmb290bm90ZSBjb250ZW50IGNhbiBiZQorZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQuCisKK01vcmUgZXhhY3RseSwgYSBmb290bm90ZSBtYXJrZXIgY2FuIGJlIGNyZWF0ZWQgYnkgcGxhY2luZyB0aGUgZm9vdG5vdGUgbmFtZSBpbiBzcXVhcmUgYnJhY2tldHMuCitUaGUgZm9vdG5vdGUgbmFtZSBoYXMgdG8gc3RhcnQgd2l0aCBhIGNhcmV0IChgXmApLCBmb2xsb3dlZCBieSBhIHdvcmQgY2hhcmFjdGVyIG9yIGEgZGlnaXQgYW5kIHRoZW4KK29wdGlvbmFsbHkgZm9sbG93ZWQgYnkgb3RoZXIgd29yZCBjaGFyYWN0ZXJzLCBkaWdpdHMgb3IgZGFzaGVzLiBGb3IgZXhhbXBsZToKKworICAgIFRoaXMgaXMgc29tZSB0ZXh0LlteMV0uIE90aGVyIHRleHQuW15mb290bm90ZV0uCisKK0Zvb3Rub3RlIG1hcmtlcnMgd2l0aCB0aGUgc2FtZSBuYW1lIHdpbGwgbGluayB0byB0aGUgc2FtZSBmb290bm90ZSBkZWZpbml0aW9uLiBUaGUgYWN0dWFsIG5hbWluZyBvZgorYSBmb290bm90ZSBkb2VzIG5vdCBtYXR0ZXIgc2luY2UgdGhlIG51bWJlcmluZyBvZiBmb290bm90ZXMgaXMgY29udHJvbGxlZCB2aWEgdGhlIHBvc2l0aW9uIG9mIHRoZQorZm9vdG5vdGUgbWFya2VycyBpbiB0aGUgZG9jdW1lbnQgKHRoZSBmaXJzdCBmb3VuZCBmb290bm90ZSBtYXJrZXIgd2lsbCBnZXQgdGhlIG51bWJlciAxLCB0aGUgc2Vjb25kIAorbmV3IGZvb3Rub3RlIG1hcmtlciB0aGUgbnVtYmVyIDIgYW5kIHNvIG9uKS4gSWYgdGhlcmUgaXMgYSBmb290bm90ZSBkZWZpbml0aW9uIGZvdW5kIGZvciB0aGUKK2lkZW50aWZpZXIsIGEgZm9vdG5vdGUgd2lsbCBiZSBjcmVhdGVkLiBPdGhlcndpc2UgdGhlIGZvb3Rub3RlIG1hcmtlciBpcyBub3QgY29udmVydGVkIHRvIGEgZm9vdG5vdGUKK2xpbmsuIEFsc28gbm90ZSB0aGF0IGFsbCBhdHRyaWJ1dGVzIHNldCB2aWEgYSBzcGFuIElBTCBhcmUgaWdub3JlZCBmb3IgYSBmb290bm90ZSBtYXJrZXIhCisKK0EgZm9vdG5vdGUgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIGRlZmluZSB0aGUgY29udGVudCBvZiBhIGZvb3Rub3RlIGFuZCBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKyogVGhlIGZvb3Rub3RlIG5hbWUgaW4gc3F1YXJlIGJyYWNrZXRzLCBvcHRpb25hbGx5IGluZGVudGVkIHVwIHRvIHRocmVlIHNwYWNlcywKKyogdGhlbiBhIGNvbG9uIGFuZCBvbmUgb3IgbW9yZSBvcHRpb25hbCBzcGFjZXMsCisqIHRoZW4gdGhlIHRleHQgb2YgdGhlIGZvb3Rub3RlCisqIGFuZCBvcHRpb25hbGx5IG1vcmUgdGV4dCBvbiB0aGUgZm9sbG93aW5nIGxpbmVzIHdoaWNoIGhhdmUgdG8gZm9sbG93IHRoZSBzeW50YXggZm9yIFtzdGFuZGFyZCBjb2RlCisgIGJsb2Nrc10oI3N0YW5kYXJkLWNvZGUtYmxvY2tzKSAodGhlIGxlYWRpbmcgZm91ciBzcGFjZXMvb25lIHRhYiBhcmUgbmF0dXJhbGx5IHN0cmlwcGVkIGZyb20gdGhlCisgIHRleHQpCisKKz4gRm9vdG5vdGUgZGVmaW5pdGlvbnMgYXJlLCBkZXNwaXRlIGJlaW5nIGRlc2NyaWJlZCBoZXJlLCBub24tY29udGVudCBibG9jay1sZXZlbCBlbGVtZW50cy4KK3s6IC5pbmZvcm1hdGlvbn0KKworVGhlIHdob2xlIGZvb3Rub3RlIGNvbnRlbnQgaXMgdHJlYXRlZCBsaWtlIGJsb2NrLWxldmVsIHRleHQgYW5kIGNhbiB0aGVyZWZvcmUgY29udGFpbiBhbnkgdmFsaWQKK2Jsb2NrLWxldmVsIGVsZW1lbnQgKGFsc28sIGFueSBibG9jay1sZXZlbCBlbGVtZW50IGNhbiBiZSB0aGUgZmlyc3QgZWxlbWVudCkuIElmIHlvdSB3YW50IHRvIGhhdmUgYQorY29kZSBibG9jayBhcyBmaXJzdCBlbGVtZW50LCBub3RlIHRoYXQgYWxsIGxlYWRpbmcgc3BhY2VzL3RhYnMgb24gdGhlIGZpcnN0IGxpbmUgYXJlIHN0cmlwcGVkIGF3YXkuCitIZXJlIGFyZSBzb21lIGV4YW1wbGUgZm9vdG5vdGUgZGVmaW5pdGlvbnM6CisKKyAgICBbXjFdOiBTb21lICpjcmF6eSogZm9vdG5vdGUgZGVmaW5pdGlvbi4KKworICAgIFteZm9vdG5vdGVdOgorICAgICAgICA+IEJsb2NrcXVvdGVzIGNhbiBiZSBpbiBhIGZvb3Rub3RlLgorCisgICAgICAgICAgICBhcyB3ZWxsIGFzIGNvZGUgYmxvY2tzCisKKyAgICAgICAgb3IsIG5hdHVyYWxseSwgc2ltcGxlIHBhcmFncmFwaHMuCisKKyAgICBbXm90aGVyLW5vdGVdOiAgICAgICBubyBjb2RlIGJsb2NrIGhlcmUgKHNwYWNlcyBhcmUgc3RyaXBwZWQgYXdheSkKKworICAgIFteY29kZWJsb2NrLW5vdGVdOgorICAgICAgICAgICAgdGhpcyBpcyBub3cgYSBjb2RlIGJsb2NrICg4IHNwYWNlcyBpbmRlbnRhdGlvbikKKworSXQgZG9lcyBub3QgbWF0dGVyIHdoZXJlIHlvdSBwdXQgYSBmb290bm90ZSBkZWZpbml0aW9uIGluIGEga3JhbWRvd24gZG9jdW1lbnQ7IHRoZSBjb250ZW50IG9mIGFsbAorcmVmZXJlbmNlZCBmb290bm90ZSBkZWZpbml0aW9ucyB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBrcmFtZG93biBkb2N1bWVudC4gTm90IHJlZmVyZW5jZWQKK2Zvb3Rub3RlIGRlZmluaXRpb25zIGFyZSBpZ25vcmVkLiBJZiBtb3JlIHRoYW4gb25lIGZvb3Rub3RlIGRlZmluaXRpb25zIGhhdmUgdGhlIHNhbWUgZm9vdG5vdGUgbmFtZSwKK2FsbCBmb290bm90ZSBkZWZpbml0aW9ucyBidXQgdGhlIGxhc3QgYXJlIGlnbm9yZWQuCisKK0FsdGhvdWdoIGZvb3Rub3RlIGRlZmluaXRpb25zIGFyZSBub24tY29udGVudCBibG9jay1sZXZlbCBlbGVtZW50cywgW2Jsb2NrIElBTHNdKCNibG9jay1pYWxzKSBjYW4gYmUKK3VzZWQgb24gdGhlbSB0byBhdHRhY2ggYXR0cmlidXRlcy4gSG93IHRoZXNlIGF0dHJpYnV0ZXMgYXJlIHVzZWQgZGVwZW5kcyBvbiB0aGUgY29udmVydGVyLgorCisjIyBBYmJyZXZpYXRpb25zCisKKz4gVGhpcyBzeW50YXggZmVhdHVyZSBpcyBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgTWFya2Rvd24gc3ludGF4LiBUaGUgaWRlYSBhbmQgc3ludGF4IGNvbWVzIGZyb20KKz4gdGhlIFtQSFAgTWFya2Rvd24gRXh0cmFdIHBhY2thZ2UuCit7OiAubWFya2Rvd24tZGlmZmVyZW5jZX0KKwora3JhbWRvd24gcHJvdmlkZXMgYSBzeW50YXggdG8gYXNzaWduIHRoZSBmdWxsIHBocmFzZSB0byBhbiBhYmJyZXZpYXRpb24uIFdoZW4gd3JpdGluZyB0aGUgdGV4dCwgeW91Citkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuIEhvd2V2ZXIsIG9uY2UgeW91IGFkZCBhYmJyZXZpYXRpb24gZGVmaW5pdGlvbnMsIHRoZQorYWJicmV2aWF0aW9ucyBpbiB0aGUgdGV4dCBnZXQgbWFya2VkIHVwIGF1dG9tYXRpY2FsbHkuIEFiYnJldmlhdGlvbnMgY2FuIGNvbnNpc3Qgb2YgYW55IGNoYXJhY3RlcgorZXhjZXB0IGEgY2xvc2luZyBicmFja2V0LgorCitBbiBhYmJyZXZpYXRpb24gZGVmaW5pdGlvbiBpcyB1c2VkIHRvIGRlZmluZSB0aGUgZnVsbCBwaHJhc2UgZm9yIGFuIGFiYnJldmlhdGlvbiBhbmQgaGFzIHRoZQorZm9sbG93aW5nIHN0cnVjdHVyZToKKworKiBBbiBhc3RlcmlzayBhbmQgdGhlIGFiYnJldmlhdGlvbiBpbiBzcXVhcmUgYnJhY2tldHMsIG9wdGlvbmFsbHkgaW5kZW50ZWQgdXAgdG8gdGhyZWUKKyAgc3BhY2VzLAorKiB0aGVuIGEgY29sb24gYW5kIHRoZSBmdWxsIHBocmFzZSBvZiB0aGUgYWJicmV2aWF0aW9uIG9uIG9uZSBsaW5lIChsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgYXJlCisgIHN0cmlwcGVkIGZyb20gdGhlIGZ1bGwgcGhyYXNlKS4KKworTGF0ZXIgYWJicmV2aWF0aW9uIGRlZmluaXRpb25zIGZvciB0aGUgc2FtZSBhYmJyZXZpYXRpb24gb3ZlcnJpZGUgcHJpb3Igb25lcyBhbmQgaXQgZG9lcyBub3QgbWF0dGVyCit3aGVyZSB5b3UgcHV0IGFuIGFiYnJldmlhdGlvbiBkZWZpbml0aW9uIGluIGEga3JhbWRvd24gZG9jdW1lbnQuIEVtcHR5IGRlZmluaXRpb25zIGFyZSBhbHNvIGFsbG93ZWQuCisKK0FsdGhvdWdoIGFiYnJldmlhdGlvbiBkZWZpbml0aW9ucyBhcmUgbm9uLWNvbnRlbnQgYmxvY2stbGV2ZWwgZWxlbWVudHMsIFtibG9jayBJQUxzXSgjYmxvY2staWFscykKK2NhbiBiZSB1c2VkIG9uIHRoZW0gdG8gc3BlY2lmeSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKyAgICBUaGlzIGlzIHNvbWUgdGV4dCBub3Qgd3JpdHRlbiBpbiBIVE1MIGJ1dCBpbiBhbm90aGVyIGxhbmd1YWdlIQorCisgICAgKlthbm90aGVyIGxhbmd1YWdlXTogSXQncyBjYWxsZWQgTWFya2Rvd24KKworICAgICpbSFRNTF06IEh5cGVyVGV4dE1hcmt1cExhbmd1YWdlCisgICAgezoubWVnYS1iaWd9CisKKz4gQWJicmV2aWF0aW9uIGRlZmluaXRpb25zIGFyZSwgZGVzcGl0ZSBiZWluZyBkZXNjcmliZWQgaGVyZSwgbm9uLWNvbnRlbnQgYmxvY2stbGV2ZWwgZWxlbWVudHMuCit7OiAuaW5mb3JtYXRpb259CisKKworIyMgVHlwb2dyYXBoaWMgU3ltYm9scworCis+IFRoZSBvcmlnaW5hbCBNYXJrZG93biBzeW50YXggZG9lcyBub3Qgc3VwcG9ydCB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMuCit7OiAubWFya2Rvd24tZGlmZmVyZW5jZX0KKwora3JhbWRvd24gY29udmVydHMgdGhlIGZvbGxvd2luZyBwbGFpbiBBU0NJSSBjaGFyYWN0ZXIgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHR5cG9ncmFwaGljIHN5bWJvbHM6CisKKyogYC0tLWAgd2lsbCBiZWNvbWUgYW4gZW0tZGFzaCAobGlrZSB0aGlzIC0tLSkKKyogYC0tYCB3aWxsIGJlY29tZSBhbiBlbi1kYXNoIChsaWtlIHRoaXMgLS0pCisqIGAuLi5gIHdpbGwgYmVjb21lIGFuIGVsbGlwc2lzIChsaWtlIHRoaXMgLi4uKQorKiBgPDxgIHdpbGwgYmVjb21lIGEgbGVmdCBndWlsbGVtZXQgKGxpa2UgdGhpcyA8PCkgLS0gYW4gb3B0aW9uYWwgZm9sbG93aW5nIHNwYWNlIHdpbGwgYmVjb21lIGEKKyAgbm9uLWJyZWFrYWJsZSBzcGFjZQorKiBgPj5gIHdpbGwgYmVjb21lIGEgcmlnaHQgZ3VpbGxlbWV0IChsaWtlIHRoaXMgPj4pIC0tIGFuIG9wdGlvbmFsIGxlYWRpbmcgc3BhY2Ugd2lsbCBiZWNvbWUgYQorICBub24tYnJlYWthYmxlIHNwYWNlCisKK1RoZSBwYXJzZXIgYWxzbyByZXBsYWNlcyBub3JtYWwgc2luZ2xlIGAnYCBhbmQgZG91YmxlIHF1b3RlcyBgImAgd2l0aCAiZmFuY3kgcXVvdGVzIi4gVGhlcmUgKm1heSogYmUKK3RpbWVzIHdoZW4ga3JhbWRvd24gZmFsc2VseSByZXBsYWNlIHRoZSBxdW90ZXMuIElmIHRoaXMgaXMgdGhlIGNhc2UsIGp1c3QgXCdlc2NhcGVcIiB0aGUgcXVvdGVzIGFuZAordGhleSB3b24ndCBiZSByZXBsYWNlZCB3aXRoIGZhbmN5IG9uZXMuCisKKworCisjIE5vbi1jb250ZW50IGVsZW1lbnRzCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG5vbi1jb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgaW4ga3JhbWRvd24gZG9jdW1lbnRzLCBpLmUuIGVsZW1lbnRzCit0aGF0IGRvbid0IHByb3ZpZGUgY29udGVudCBmb3IgdGhlIGRvY3VtZW50IGJ1dCBoYXZlIG90aGVyIHVzZXMgc3VjaCBhcyBzZXBhcmF0aW5nIGJsb2NrLWxldmVsCitlbGVtZW50cyBvciBhdHRhY2hpbmcgYXR0cmlidXRlcyB0byBlbGVtZW50cy4KKworVGhyZWUgbm9uLWNvbnRlbnQgYmxvY2stbGV2ZWwgZWxlbWVudHMgYXJlIG5vdCBkZXNjcmliZWQgaGVyZSBiZWNhdXNlIHRoZXkgZml0IGJldHRlciB3aGVyZSB0aGV5CithcmU6CisKKyogW2xpbmsgZGVmaW5pdGlvbnNdKCNsaW5rLWRlZmluaXRpb25zKQorKiBbZm9vdG5vdGUgZGVmaW5pdGlvbnNdKCNmb290bm90ZXMpCisqIFthYmJyZXZpYXRpb24gZGVmaW5pdGlvbl0oI2FiYnJldmlhdGlvbnMpCisKKworIyMgRW5kLU9mLUJsb2NrIE1hcmtlciAgICB7I2VvYi1tYXJrZXJ9CisKKz4gVGhlIEVPQiBtYXJrZXIgaXMgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIE1hcmtkb3duIHN5bnRheC4KK3s6IC5tYXJrZG93bi1kaWZmZXJlbmNlfQorCitUaGUgRW5kLU9mLUJsb2NrIChFT0IpIG1hcmtlciAtLSBhIGBeYCBhcyBmaXJzdCBjaGFyYWN0ZXIgb24gYW4gb3RoZXJ3aXNlIGVtcHR5IGxpbmUgLS0gaXMgYSBibG9jaworbGV2ZWwgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGVuZCBvZiBhIGJsb2NrLWxldmVsIGVsZW1lbnQgZXZlbiBpZiB0aGUgYmxvY2stbGV2ZWwKK2VsZW1lbnQsIGFmdGVyIHdoaWNoIGl0IGlzIHVzZWQsIHdvdWxkIGNvbnRpbnVlIG90aGVyd2lzZS4gSWYgdGhlcmUgaXMgbm8gYmxvY2stbGV2ZWwgZWxlbWVudCB0bworZW5kLCB0aGUgRU9CIG1hcmtlciBpcyBzaW1wbHkgaWdub3JlZC4KKworWW91IHdvbid0IGZpbmQgYW4gRU9CIG1hcmtlciBpbiBtb3N0IGtyYW1kb3duIGRvY3VtZW50cyBidXQgc29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgaXQgdG8KK2FjaGlldmUgdGhlIHdhbnRlZCByZXN1bHRzIHdoaWNoIHdvdWxkIGJlIGltcG9zc2libGUgb3RoZXJ3aXNlLiBIb3dldmVyLCBpdCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4KK2Fic29sdXRlbHkgbmVjZXNzYXJ5IQorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBnaXZlcyB5b3Ugb25lIGxpc3Qgd2l0aCB0d28gaXRlbXM6CisKKyAgICAqIGxpc3QgaXRlbSBvbmUKKworICAgICogbGlzdCBpdGVtIHR3bworCitCeSB1c2luZyBhbiBFT0IgbWFya2VyLCB5b3UgY2FuIG1ha2UgdHdvIGxpc3RzIHdpdGggb25lIGl0ZW0gZWFjaDoKKworICAgICogbGlzdCBvbmUKKyAgICBeCisgICAgKiBsaXN0IHR3bworCisKKyMjIEF0dHJpYnV0ZSBMaXN0IERlZmluaXRpb25zCisKKz4gVGhpcyBzeW50YXggZmVhdHVyZSBpcyBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgTWFya2Rvd24gc3ludGF4LiBUaGUgaWRlYSBhbmQgc3ludGF4IGNvbWVzIGZyb20KKz4gdGhlIFtNYXJ1a3VdIHBhY2thZ2UuCit7OiAubWFya2Rvd24tZGlmZmVyZW5jZX0KKworVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBbTWFydWt1XSdzIGZlYXR1cmUgZm9yIGFkZGluZyBhdHRyaWJ1dGVzIHRvIGJsb2NrIGFuZCBzcGFuLWxldmVsCitlbGVtZW50cyAodGhlIG5hbWluZyBpcyBhbHNvIHRha2VuIGZyb20gTWFydWt1KS4gVGhpcyBibG9jay1sZXZlbCBlbGVtZW50IGlzIHVzZWQgdG8gZGVmaW5lCithdHRyaWJ1dGVzIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGxhdGVyLiBUaGUgW0Jsb2NrIElubGluZSBBdHRyaWJ1dGUgTGlzdF0oI2Jsb2NrLWlhbHMpIGlzIHVzZWQgdG8KK2F0dGFjaCBhdHRyaWJ1dGVzIHRvIGEgYmxvY2stbGV2ZWwgZWxlbWVudCBhbmQgdGhlIFtTcGFuIElubGluZSBBdHRyaWJ1dGUgTGlzdF0oI3NwYW4taWFscykgaXMgdXNlZAordG8gYXR0YWNoIGF0dHJpYnV0ZXMgdG8gYSBzcGFuLWxldmVsIGVsZW1lbnQuCisKK0ZvbGxvd2luZyBhcmUgc29tZSBleGFtcGxlcyBvZiBhdHRyaWJ1dGUgbGlzdCBkZWZpbml0aW9ucyAoQUxEcykgYW5kIGFmdGVyd2FyZHMgY29tZXMgdGhlIHN5bnRheAorZXhwbGFuYXRpb246CisKKyAgICB7OnJlZi1uYW1lOiAjbXlpZCAubXktY2xhc3N9CisgICAgezpvdGhlcjogcmVmLW5hbWUgI2lkLW9mLW90aGVyIHRpdGxlPSJoYWxsbyB5b3UifQorICAgIHs6dGVzdDoga2V5PSJ2YWx1ZSBcIiB3aXRoIHF1b3RlIiBhbmQgb3RoZXI9J3F1b3RlIGJyYWNlIFx9J30KKworQW4gQUxEIGxpbmUgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCisqIGEgbGVmdCBicmFjZSwgb3B0aW9uYWxseSBwcmVjZWRlZCBieSB1cCB0byB0aHJlZSBzcGFjZXMsCisqIGZvbGxvd2VkIGJ5IGEgY29sb24sIHRoZSByZWZlcmVuY2UgbmFtZSBhbmQgYW5vdGhlciBjb2xvbiwKKyogZm9sbG93ZWQgYnkgYXR0cmlidXRlIGRlZmluaXRpb25zIChhbGxvd2VkIGNoYXJhY3RlcnMgYXJlIGJhY2tzbGFzaC1lc2NhcGVkIGNsb3NpbmcgYnJhY2VzIG9yIGFueQorICBjaGFyYWN0ZXIgZXhjZXB0IGEgbm90IGVzY2FwZWQgY2xvc2luZyBicmFjZSksCisqIGZvbGxvd2VkIGJ5IGEgY2xvc2luZyBicmFjZSBhbmQgb3B0aW9uYWwgc3BhY2VzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisKK1RoZSByZWZlcmVuY2UgbmFtZSBuZWVkcyB0byBzdGFydCB3aXRoIGEgd29yZCBjaGFyYWN0ZXIgb3IgYSBkaWdpdCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBvdGhlcgord29yZCBjaGFyYWN0ZXJzLCBkaWdpdHMgb3IgZGFzaGVzLgorCitUaGVyZSBhcmUgZm91ciBkaWZmZXJlbnQgdHlwZXMgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zIHdoaWNoIGhhdmUgdG8gYmUgc2VwYXJhdGVkIGJ5IG9uZSBvciBtb3JlCitzcGFjZXM6CisKK3JlZmVyZW5jZXMKKworOiBUaGlzIG11c3QgYmUgYSB2YWxpZCByZWZlcmVuY2UgbmFtZS4gSXQgaXMgdXNlZCB0byByZWZlcmVuY2UgYW4gb3RoZXIgQUxEIHNvIHRoYXQgdGhlIGF0dHJpYnV0ZXMKKyAgb2YgdGhlIG90aGVyIEFMRCBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGlzIG9uZS4gVGhlIHJlZmVyZW5jZSBuYW1lIGlzIGlnbm9yZWQgd2hlbiBjb2xsZWN0aW5nIHRoZQorICBhdHRyaWJ1dGVzIGlmIG5vIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGxpc3Qgd2l0aCB0aGlzIHJlZmVyZW5jZSBuYW1lIGV4aXN0cy4gRm9yIGV4YW1wbGUsIGEgc2ltcGxlCisgIHJlZmVyZW5jZSBsb29rcyBsaWtlIGBpZGAuCisKK2tleS12YWx1ZSBwYWlycworCis6IEEga2V5LXZhbHVlIHBhaXIgaXMgZGVmaW5lZCBieSBhIGtleSBuYW1lLCB3aGljaCBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZm9yIHJlZmVyZW5jZSBuYW1lcywgdGhlbgorICBhbiBlcXVhbCBzaWduIGFuZCB0aGVuIHRoZSB2YWx1ZSBpbiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlcy4gSWYgeW91IG5lZWQgdG8gdXNlIHRoZSB2YWx1ZQorICBkZWxpbWl0ZXIgKGEgc2luZ2xlIG9yIGEgZG91YmxlIHF1b3RlKSBpbnNpZGUgdGhlIHZhbHVlLCB5b3UgbmVlZCB0byBlc2NhcGUgaXQgd2l0aCBhIGJhY2tzbGFzaC4KKyAgS2V5LXZhbHVlIHBhaXJzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMgZm9yIGJsb2NrIG9yIHNwYW4tbGV2ZWwgZWxlbWVudHMuIEZvcgorICBleGFtcGxlLCBhIGtleS12YWx1ZSBwYWlyIGxvb2tzIGxpa2UgYGtleTE9ImJlZiBcInF1b3RlZFwiIGFmdCJgIG9yIGB0aXRsZT0nVGhpcyBpcyBhIHRpdGxlJ2AuCisKK0lEIG5hbWUKKworOiBBbiBJRCBuYW1lIGlzIGRlZmluZWQgYnkgdXNpbmcgYSBoYXNoIGFuZCB0aGVuIHRoZSBpZGVudGlmaWVyIG5hbWUgd2hpY2ggbmVlZHMgdG8gc3RhcnQgd2l0aCBhbgorICBBU0NJSSBhbHBoYWJldGljIGNoYXJhY3RlciAoQS1aIG9yIGEteiksIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgb3RoZXIgQVNDSUkgY2hhcmFjdGVycywgZGlnaXRzLAorICBkYXNoZXMgb3IgY29sb25zLiBUaGlzIGlzIGEgc2hvcnQgaGFuZCBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIGBpZD0iSUROQU1FImAgc2luY2UgdGhpcyBpcyBvZnRlbgorICB1c2VkLiBUaGUgSUQgbmFtZSBzcGVjaWZpZXMgdGhlIHVuaXF1ZSBJRCBvZiBhIGJsb2NrIG9yIHNwYW4tbGV2ZWwgZWxlbWVudC4gRm9yIGV4YW1wbGUsIGFuIElECisgIG5hbWUgbG9va3MgbGlrZSBgI215aWRgLgorCitjbGFzcyBuYW1lcworCis6IEEgY2xhc3MgbmFtZSBpcyBkZWZpbmVkIGJ5IHVzaW5nIGEgZG90IGFuZCB0aGVuIHRoZSBjbGFzcyBuYW1lIHdoaWNoIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIKKyAgZXhjZXB0IHdoaXRlc3BhY2UsIHRoZSBkb3QgY2hhcmFjdGVyIGFuZCB0aGUgaGFzaCBjaGFyYWN0ZXIuCisKKyAgVGhpcyBpcyAoYWxtb3N0LCBidXQgbm90IHF1aXRlKSBhIHNob3J0IGhhbmQgZm9yIHRoZSBrZXktdmFsdWUgcGFpciBgY2xhc3M9ImNsYXNzLW5hbWUiYC4gQWxtb3N0CisgIGJlY2F1c2UgaXQgYWN0dWFsbHkgbWVhbnMgdGhhdCB0aGUgY2xhc3MgbmFtZSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCisgIGBjbGFzc2AgYXR0cmlidXRlLiBUaGUgZm9sbG93aW5nIEFMRHMgYXJlIGFsbCBlcXVpdmFsZW50OgorCisgICAgICB7OmlkOiAuY2xzMSAuY2xzMn0KKyAgICAgIHs6aWQ6IGNsYXNzPSJjbHMxIiAuY2xzMn0KKyAgICAgIHs6aWQ6IGNsYXNzPSJzb21ldGhpbmciIGNsYXNzPSJjbHMxIiAuY2xzMn0KKyAgICAgIHs6aWQ6IGNsYXNzPSJjbHMxIGNsczIifQorCitBcyBjYW4gYmUgc2VlbiBmcm9tIHRoZSBleGFtcGxlIG9mIHRoZSBjbGFzcyBuYW1lcywgYXR0cmlidXRlcyB0aGF0IGFyZSBkZWZpbmVkIGVhcmxpZXIgYXJlCitvdmVyd3JpdHRlbiBieSBvbmVzIHdpdGggdGhlIHNhbWUgbmFtZSBkZWZpbmVkIGxhdGVyLgorCis+IEFsc28sIGV2ZXJ5dGhpbmcgaW4gdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBwYXJ0IHRoYXQgZG9lcyBub3QgbWF0Y2ggb25lIG9mIHRoZSBhYm92ZSBmb3VyIHR5cGVzCis+IGlzIGlnbm9yZWQuCit7Oi5pbmZvcm1hdGlvbn0KKworSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBBTEQgd2l0aCB0aGUgc2FtZSByZWZlcmVuY2UgbmFtZSwgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBvZiBhbGwgdGhlCitBTERzIGFyZSBwcm9jZXNzZWQgbGlrZSB0aGV5IGFyZSBkZWZpbmVkIGluIG9uZSBBTEQuCisKKworIyMgSW5saW5lIEF0dHJpYnV0ZSBMaXN0cworCitUaGVzZSBlbGVtZW50cyBhcmUgdXNlZCB0byBhdHRhY2ggYXR0cmlidXRlcyB0byBhbm90aGVyIGVsZW1lbnQuCisKKyMjIyBCbG9jayBJbmxpbmUgQXR0cmlidXRlIExpc3RzICAgeyNibG9jay1pYWxzfQorCis+IFRoaXMgc3ludGF4IGZlYXR1cmUgaXMgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheC4gVGhlIGlkZWEgYW5kIHN5bnRheCBjb21lcyBmcm9tCis+IHRoZSBbTWFydWt1XSBwYWNrYWdlLgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKK1RoaXMgYmxvY2stbGV2ZWwgZWxlbWVudCBpcyB1c2VkIHRvIGF0dGFjaCBhdHRyaWJ1dGVzIHRvIGFub3RoZXIgYmxvY2stbGV2ZWwgZWxlbWVudC4gQSBibG9jayBpbmxpbmUKK2F0dHJpYnV0ZSBsaXN0IChibG9jayBJQUwpIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgYW4gW0FMRF0oI2F0dHJpYnV0ZS1saXN0LWRlZmluaXRpb25zKSBleGNlcHQKK3RoYXQgdGhlIGNvbG9uL3JlZmVyZW5jZSBuYW1lL2NvbG9uIHBhcnQgaXMgcmVwbGFjZWQgYnkgYSBjb2xvbi4gQSBibG9jayBJQUwgKG9yIHR3byBvciBtb3JlIGJsb2NrCitJQUxzKSBoYXMgdG8gYmUgcHV0IGRpcmVjdGx5IGJlZm9yZSBvciBhZnRlciB0aGUgYmxvY2stbGV2ZWwgZWxlbWVudCB0byB3aGljaCB0aGUgYXR0cmlidXRlcyBzaG91bGQKK2JlIGF0dGFjaGVkLiBJZiBhIGJsb2NrIElBTCBpcyBkaXJlY3RseSBhZnRlciAqYW5kKiBiZWZvcmUgYSBibG9jay1sZXZlbCBlbGVtZW50LCBpdCBpcyBhcHBsaWVkIHRvCitwcmVjZWRpbmcgZWxlbWVudC4gVGhlIGJsb2NrIElBTCBpcyBpZ25vcmVkIGluIGFsbCBvdGhlciBjYXNlcywgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGJsb2NrIElBTCBpcworc3Vycm91bmRlZCBieSBibGFuayBsaW5lcy4KKworS2V5LXZhbHVlIHBhaXJzIG9mIGFuIElBTCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBlcXVhbGx5IG5hbWVkIGtleS12YWx1ZSBwYWlycyBpbiByZWZlcmVuY2VkIEFMRHMuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXMgZm9yIGJsb2NrIElBTHM6CisKKyAgICBBIHNpbXBsZSBwYXJhZ3JhcGggd2l0aCBhbiBJRCBhdHRyaWJ1dGUuCisgICAgezogI3BhcmEtb25lfQorCisgICAgPiBBIGJsb2NrcXVvdGUgd2l0aCBhIHRpdGxlCisgICAgezp0aXRsZT0iVGhlIGJsb2NrcXVvdGUgdGl0bGUifQorICAgIHs6ICNteWlkfQorCisgICAgezoucnVieX0KKyAgICAgICAgU29tZSBjb2RlIGhlcmUKKworIyMjIFNwYW4gSW5saW5lIEF0dHJpYnV0ZSBMaXN0cyAgICAgIHsjc3Bhbi1pYWxzfQorCis+IFRoaXMgc3ludGF4IGZlYXR1cmUgaXMgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIE1hcmtkb3duIHN5bnRheC4gVGhlIGlkZWEgYW5kIHN5bnRheCBjb21lcyBmcm9tCis+IHRoZSBbTWFydWt1XSBwYWNrYWdlLgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKK1RoaXMgaXMgYSB2ZXJzaW9uIG9mIHRoZSBbYmxvY2sgaW5saW5lIGF0dHJpYnV0ZSBsaXN0XSgjYmxvY2staWFscykgZm9yIHNwYW4tbGV2ZWwgZWxlbWVudHMuIEl0IGhhcwordGhlIHNhbWUgc3RydWN0dXJlIGFzIHRoZSBibG9jayBJQUwgZXhjZXB0IHRoYXQgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGFyZSBub3QgYWxsb3dlZC4gQSBzcGFuCitJQUwgKG9yIHR3byBvciBtb3JlIHNwYW4gSUFMcykgaGFzIHRvIGJlIHB1dCBkaXJlY3RseSBhZnRlciB0aGUgc3Bhbi1sZXZlbCBlbGVtZW50IHRvIHdoaWNoIGl0CitzaG91bGQgYmUgYXBwbGllZCwgbm8gYWRkaXRpb25hbCBjaGFyYWN0ZXIgaXMgYWxsb3dlZCBiZXR3ZWVuLCBvdGhlcndpc2UgaXQgaXMgaWdub3JlZCBhbmQgb25seQorcmVtb3ZlZCBmcm9tIHRoZSBvdXRwdXQuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXMgZm9yIHNwYW4gSUFMczoKKworICAgIFRoaXMgKmlzKns6LnVuZGVybGluZX0gc29tZSBgY29kZWB7OiNpZH17Oi5jbGFzc30uCisgICAgQSBbbGlua10odGVzdC5odG1sKXs6cmVsPSdzb21ldGhpbmcnfSBhbmQgc29tZSAqKnRvb2xzKip7Oi50b29sc30uCisKK1RoZSBzcGVjaWFsIHNwYW4gSUFMIGB7Ojp9YCBjb250YWlucyBubyBhdHRyaWJ1dGVzIGJ1dCBkb2Vzbid0IGdlbmVyYXRlIGEgd2FybmluZyBlaXRoZXIuIEl0IGNhbiBiZQordXNlZCB0byBzZXBhcmF0ZSBjb25zZWN1dGl2ZSBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGZhbHNlbHkgcGFyc2VkIGlmIG5vdCBzZXBhcmF0ZWQuIEhlcmUgaXMgYW4gdXNlCitjYXNlOgorCisgICAgVGhpcyAqaXMgaXRhbGljKns6On0qbWFya2VkKns6LnNwZWNpYWx9IHRleHQKKworCisjIyBFeHRlbnNpb25zCisKKz4gVGhpcyBzeW50YXggZmVhdHVyZSBpcyBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgTWFya2Rvd24gc3ludGF4LgorezogLm1hcmtkb3duLWRpZmZlcmVuY2V9CisKK0V4dGVuc2lvbnMgcHJvdmlkZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgYnV0IHVzZSB0aGUgc2FtZSBzeW50YXggZm9yIGl0LiBUaGV5IGFyZSBhdmFpbGFibGUgYXMKK2Jsb2NrIGFzIHdlbGwgYXMgc3Bhbi1sZXZlbCBlbGVtZW50cy4KKworVGhlIHN5bnRheCBmb3IgYW4gZXh0ZW5zaW9uIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgc3ludGF4IG9mIFtBTERzXSgjYXR0cmlidXRlLWxpc3QtZGVmaW5pdGlvbnMpLgorSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gc3BlY2lmeSBleHRlbnNpb25zIGFuZCBhZnRlcndhcmRzIGlzIHRoZSBzeW50YXggZGVmaW5pdGlvbjoKKworICAgIHs6OmNvbW1lbnR9CisgICAgVGhpcyB0ZXh0IGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSBrcmFtZG93biAtIGEgY29tbWVudCBpbiB0aGUgdGV4dC4KKyAgICB7Oi9jb21tZW50fQorCisgICAgRG8geW91IHNlZSB7Ojpjb21tZW50fXRoaXMgdGV4dHs6L2NvbW1lbnR9PworICAgIHs6OmNvbW1lbnR9c29tZSBvdGhlciBjb21tZW50ezovfQorCisgICAgezo6b3B0aW9ucyBrZXk9InZhbCIgL30KKworQW4gZXh0ZW5zaW9uIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCBvciB3aXRob3V0IGEgYm9keS4gVGhlcmVmb3JlIHRoZXJlIGV4aXN0IGEgc3RhcnQgYW5kIGFuIGVuZCB0YWcKK2ZvciBleHRlbnNpb25zLiBUaGUgc3RhcnQgdGFnIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKworKiBhIGxlZnQgYnJhY2UsCisqIGZvbGxvd2VkIGJ5IHR3byBjb2xvbnMgYW5kIHRoZSBleHRlbnNpb24gbmFtZSwKKyogb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIHNwYWNlIGFuZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgKGFsbG93ZWQgY2hhcmFjdGVycyBhcmUgYmFja3NsYXNoLWVzY2FwZWQKKyAgY2xvc2luZyBicmFjZXMgb3IgYW55IGNoYXJhY3RlciBleGNlcHQgYSBub3QgZXNjYXBlZCBjbG9zaW5nIGJyYWNlIC0tIHNhbWUgYXMgd2l0aCBBTERzKSwKKyogZm9sbG93ZWQgYnkgYSBzbGFzaCBhbmQgYSByaWdodCBicmFjZSAoaW4gY2FzZSB0aGUgZXh0ZW5zaW9uIGhhcyBubyBib2R5KSBvciBvbmx5IGEgcmlnaHQKKyAgYnJhY2UgKGluIGNhc2UgdGhlIGV4dGVuc2lvbiBoYXMgYSBib2R5KS4KKworVGhlIHN0b3AgdGFnIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKworKiBhIGxlZnQgYnJhY2UsCisqIGZvbGxvd2VkIGJ5IGEgY29sb24gYW5kIGEgc2xhc2gsCisqIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgdGhlIGV4dGVuc2lvbiBuYW1lLAorKiBmb2xsb3dlZCBieSBhIHJpZ2h0IGJyYWNlLgorCitBIHN0b3AgdGFnIGlzIG9ubHkgbmVlZGVkIGlmIHRoZSBleHRlbnNpb24gaGFzIGEgYm9keSEKKworVGhlIGFib3ZlIHN5bnRheCBjYW4gYmUgdXNlZCBhcyBpcyBmb3Igc3Bhbi1sZXZlbCBleHRlbnNpb25zLiBUaGUgc3RhcnRpbmcgYW5kIGVuZGluZyBsaW5lcyBmb3IgYmxvY2stbGV2ZWwKK2V4dGVuc2lvbnMgYXJlIGRlZmluZWQgYXM6CisKKyogVGhlIHN0YXJ0aW5nIGxpbmUgY29uc2lzdHMgb2YgdGhlIGV4dGVuc2lvbiBzdGFydCB0YWcsIG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgdXAgdG8gdGhyZWUgc3BhY2VzLAorICBhbmQgZm9sbG93ZWQgYnkgb3B0aW9uYWwgc3BhY2VzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisqIFRoZSBlbmRpbmcgbGluZSBjb25zaXN0cyBvZiB0aGUgZXh0ZW5zaW9uIHN0b3AgdGFnLCBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IHVwIHRvIHRocmVlIHNwYWNlcywKKyAgYW5kIGZvbGxvd2VkIGJ5IG9wdGlvbmFsIHNwYWNlcyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lLgorCitJZiBubyBlbmQgdGFnIGNhbiBiZSBmb3VuZCBmb3IgYW4gZXh0ZW5zaW9uIHN0YXJ0IHRhZywgdGhlIHN0YXJ0IHRhZyBpcyB0cmVhdGVkIGFzIGlmIGl0IGhhcyBubworYm9keS4gSWYgYW4gaW52YWxpZCBleHRlbnNpb24gc3RvcCB0YWcgaXMgZm91bmQsIGl0IGlzIGlnbm9yZWQuIElmIGFuIGludmFsaWQgZXh0ZW5zaW9uIG5hbWUgaXMKK3NwZWNpZmllZCB0aGUgZXh0ZW5zaW9uIChhbmQgdGhlIGV2ZW50dWFsbHkgc3BlY2lmaWVkIGJvZHkpIGFyZSBpZ25vcmVkLgorCitUaGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgY2FuIGJlIHVzZWQgd2l0aCBrcmFtZG93bjoKKworYGNvbW1lbnRgCisKKzogVHJlYXQgdGhlIGJvZHkgdGV4dCBhcyBhIGNvbW1lbnQgd2hpY2ggZG9lcyBub3Qgc2hvdyBpbiB0aGUgb3V0cHV0LgorCitgbm9tYXJrZG93bmAKKworOiBEb24ndCBwcm9jZXNzIHRoZSBib2R5IHdpdGgga3JhbWRvd24gYnV0IG91dHB1dCBpdCBhcy1pcy4gVGhlIGF0dHJpYnV0ZSBgdHlwZWAgc3BlY2lmaWVzIHdoaWNoCisgIGNvbnZlcnRlcnMgc2hvdWxkIG91dHB1dCB0aGUgYm9keTogaWYgdGhlIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLCBhbGwgY29udmVydGVycyBzaG91bGQgb3V0cHV0IGl0LgorICBPdGhlcndpc2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgdG8gYmUgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjb252ZXJ0ZXIgbmFtZXMgYW5kIHRoZXNlCisgIGNvbnZlcnRlcnMgc2hvdWxkIG91dHB1dCB0aGUgYm9keS4KKworYG9wdGlvbnNgCisKKzogU2hvdWxkIGJlIHVzZWQgd2l0aG91dCBhIGJvZHkgc2luY2UgdGhlIGJvZHkgaXMgaWdub3JlZC4gSXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgZ2xvYmFsIG9wdGlvbnMKKyAgZm9yIHRoZSBrcmFtZG93biBwcm9jZXNzb3IgKGZvciBleGFtcGxlLCB0byBkaXNhYmxlIGF1dG9tYXRpYyBoZWFkZXIgSUQgZ2VuZXJhdGlvbikuIE5vdGUgdGhhdAorICBvcHRpb25zIHRoYXQgYXJlIHVzZWQgYnkgdGhlIHBhcnNlciBhcmUgaW1tZWRpYXRlbHkgZWZmZWN0aXZlIHdoZXJlYXMgYWxsIG90aGVyIG9wdGlvbnMgYXJlIG5vdCEKKyAgVGhpcyBtZWFucywgZm9yIGV4YW1wbGUsIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNldCBjb252ZXJ0ZXIgb3B0aW9ucyBvbmx5IGZvciBzb21lIHBhcnQgb2YgYQorICBrcmFtZG93biBkb2N1bWVudC4KKworCisKK3tpbmNsdWRlX2ZpbGU6IGRvYy9saW5rcy5tYXJrZG93bn0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvdGVzdHMucGFnZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9kb2MvdGVzdHMucGFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODEzYzNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy90ZXN0cy5wYWdlCkBAIC0wLDAgKzEsMTA0IEBACistLS0KK3RpdGxlOiBUZXN0cyBhbmQgQmVuY2htYXJrCistLS0KKyMgVGVzdHMgYW5kIEJlbmNobWFyaworCisjIyBUZXN0cworCitUaGVyZSBleGlzdCBzZXZlcmFsIHRlc3Qgc3VpdGVzIGZvciB0ZXN0aW5nIHRoZSBjb3JyZWN0bmVzcyBvZiBhIE1hcmtkb3duIGltcGxlbWVudGF0aW9uLiBUaGUKK29yaWdpbmFsIFtNYXJrZG93biBUZXN0IFN1aXRlXSBpcyB0aGUgc3RhbmRhcmQgd2hpY2ggb25lIG5lZWRzIHRvIHRlc3QgYWdhaW5zdC4gVGhlIFtQSFAgTWFya2Rvd24KK3N1aXRlXVtNRFRlc3RdIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB0ZXN0IHN1aXRlIGFuZCBzZXZlcmFsIG1vcmUgdGVzdHMgKHNvbWUgc3BlY2lmaWNhbGx5IGdlYXJlZAordG93YXJkcyB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBQSFAgTWFya2Rvd24gRXh0cmEgcGFja2FnZSkuIEkgaGF2ZSB1c2VkIHRoZSBsYXR0ZXIgdGVzdCB0b29sIHRvCityb3VnaGx5IHZlcmlmeSB0aGF0IGtyYW1kb3duIGlzIGFibGUgdG8gcGFyc2Ugc3RhbmRhcmQgTWFya2Rvd24uIEhvd2V2ZXIsIHNpbmNlIHRoZSBzeW50YXggdXNlZCBieQora3JhbWRvd24gdmFyaWVzIHNsaWdodGx5IGZyb20gc3RhbmRhcmQgTWFya2Rvd24gbW9zdCBvZiB0aGUgdGVzdHMgZmFpbCAtIHdoaWNoIGlzIGZpbmUuIFdoZW4gbG9va2luZworYXQgdGhlIGRpZmZlcmVuY2VzIG9uZSBjYW4gc2VlIHRoYXQgdGhlIGZhaWx1cmVzIHJlc3VsdCBmcm9tIHRoZXNlIGRpZmZlcmVuY2VzLgorCitCZXNpZGVzIHVzaW5nIHRoZSBhYm92ZSBtZW50aW9uZWQgdGVzdCBzdWl0ZSBrcmFtZG93biBjb21lcyB3aXRoIGl0cyBvd24gc2V0IG9mIHRlc3RzIHdoaWNoIGlzIHVzZWQKK3RvIHZlcmlmeSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBtYXRjaGVzIHRoZSBrcmFtZG93biBzcGVjaWZpY2F0aW9uLgorCitJZiB5b3UgYmVsaWV2ZSB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZyBpbiB0aGUgaW1wbGVtZW50YXRpb24sIHBsZWFzZSBmb2xsb3cgdGhlc2Ugc3RlcHM6CisKKyogQ2hlY2sgdGhlIFtzeW50YXggcGFnZV0oc3ludGF4Lmh0bWwpIGFuZCBzZWUgaWYgdGhlIGJlaGF2aW91ciBpcyBub3QgaW50ZW5kZWQuCisKKyogSWYgdGhlIGJlaGF2aW91ciBpcyBub3QgaW50ZW5kZWQgYW5kIGl0IHNlZW1zIHRoYXQga3JhbWRvd24gc2hvdWxkIHBhcnNlIHNvbWUgdGV4dCBpbiBhbm90aGVyCisgIGZhc2hpb24sIHBsZWFzZSBvcGVuIGEgW2J1ZyByZXBvcnRdIGFuZCBhdHRhY2ggdHdvIGZpbGVzOiBvbmUgd2l0aCB0aGUgdGV4dCBhbmQgb25lIHdpdGggdGhlIEhUTUwKKyAgY29udmVyc2lvbiB5b3UgdGhpbmsgaXMgY29ycmVjdC4KKworW2J1ZyByZXBvcnRdOiBodHRwOi8vZ2l0aHViLmNvbS9nZXR0YWxvbmcva3JhbWRvd24vaXNzdWVzCisKKworIyMgQmVuY2htYXJrCisKK2tyYW1kb3duIGNvbWVzIHdpdGggYSBzbWFsbCBiZW5jaG1hcmsgdG8gdGVzdCBob3cgZmFzdCBpdCBpcyBpbiByZWdhcmQgdG8gZm91ciBvdGhlciBSdWJ5IE1hcmtkb3duCitpbXBsZW1lbnRhdGlvbnM6IE1hcnVrdSwgQmx1ZUZlYXRoZXIsIEJsdWVDbG90aCwgUkRpc2NvdW50IGFuZCBSZWRjYXJwZXQuIFRoZSBmaXJzdCB0d28gYXJlIHdyaXR0ZW4KK3VzaW5nIG9ubHkgUnVieSwgdGhlIGxhdHRlciB0aHJlZSBhcmUgd3JpdHRlbiBpbiBDIGFuZCBuZWVkIHRvIGJlIGNvbXBpbGVkLgorCitBcyBvbmUgY2FuIHNlZSBiZWxvdywga3JhbWRvd24gaXMgY3VycmVudGx5IChTZXB0ZW1iZXIgMjAxNCkgfjN4IGZhc3RlciB0aGFuIE1hcnVrdSwgfjQuNXggZmFzdGVyCit0aGFuIEJsdWVGZWF0aGVyIGJ1dCB+MzB4IHNsb3dlciB0aGFuIFJEaXNjb3VudCBhbmQgfjE1MHggc2xvd2VyIHRoYW4gUmVkY2FycGV0OgorCis8cHJlPjxjb2RlPgorUnVubmluZyB0ZXN0cyBvbiAyMDE0LTA5LTE2IHVuZGVyIHJ1YnkgMi4xLjJwOTUgKDIwMTQtMDUtMDggcmV2aXNpb24gNDU4NzcpIFt4ODZfNjQtbGludXhdCisKK1Rlc3QgdXNpbmcgZmlsZSBtZHN5bnRheC50ZXh0IGFuZCAyMCBydW5zCitSZWhlYXJzYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQora3JhbWRvd24gMS40LjIgICAgIDAuOTAwMDAwICAgMC4wMTAwMDAgICAwLjkxMDAwMCAoICAwLjkxNDk5MikKK01hcnVrdSAwLjcuMSAgICAgICAyLjM2MDAwMCAgIDAuMDQwMDAwICAgMi40MDAwMDAgKCAgMi40MDM1NzEpCitCbHVlRmVhdGhlciAwLjQxICAgMy43NjAwMDAgICAwLjAxMDAwMCAgIDMuNzcwMDAwICggIDMuNzc2NDIxKQorQmx1ZUNsb3RoIDIuMi4wICAgIDAuMDUwMDAwICAgMC4wMDAwMDAgICAwLjA1MDAwMCAoICAwLjA1MDIyMSkKK1JEaXNjb3VudCAyLjEuNyAgICAwLjAyMDAwMCAgIDAuMDAwMDAwICAgMC4wMjAwMDAgKCAgMC4wMjQxODApCityZWRjYXJwZXQgMy4xLjIgICAgMC4wMTAwMDAgICAwLjAwMDAwMCAgIDAuMDEwMDAwICggIDAuMDA0NTc5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0b3RhbDogNy4xNjAwMDBzZWMKKworICAgICAgICAgICAgICAgICAgICAgICB1c2VyICAgICBzeXN0ZW0gICAgICB0b3RhbCAgICAgICAgcmVhbAora3JhbWRvd24gMS40LjIgICAgIDAuODMwMDAwICAgMC4wMDAwMDAgICAwLjgzMDAwMCAoICAwLjgzNDE0NCkKK01hcnVrdSAwLjcuMSAgICAgICAyLjI1MDAwMCAgIDAuMDMwMDAwICAgMi4yODAwMDAgKCAgMi4yODY1NzkpCitCbHVlRmVhdGhlciAwLjQxICAgMy42ODAwMDAgICAwLjAxMDAwMCAgIDMuNjkwMDAwICggIDMuNjkzNzY5KQorQmx1ZUNsb3RoIDIuMi4wICAgIDAuMDUwMDAwICAgMC4wMDAwMDAgICAwLjA1MDAwMCAoICAwLjA0NDgzMSkKK1JEaXNjb3VudCAyLjEuNyAgICAwLjAyMDAwMCAgIDAuMDAwMDAwICAgMC4wMjAwMDAgKCAgMC4wMjI4NDcpCityZWRjYXJwZXQgMy4xLjIgICAgMC4wMTAwMDAgICAwLjAwMDAwMCAgIDAuMDEwMDAwICggIDAuMDA0NjAxKQorCitSZWFsIHRpbWUgb2YgWCBkaXZpZGVkIGJ5IHJlYWwgdGltZSBvZiBrcmFtZG93bgorTWFydWt1ICAgICAgICAgICAgIDIuNzQxMgorQmx1ZUZlYXRoZXIgICAgICAgIDQuNDI4MgorQmx1ZUNsb3RoICAgICAgICAgIDAuMDUzNworUkRpc2NvdW50ICAgICAgICAgIDAuMDI3NAorcmVkY2FycGV0ICAgICAgICAgIDAuMDA1NQorCitUZXN0IHVzaW5nIGZpbGUgbWRiYXNpY3MudGV4dCBhbmQgMjAgcnVucworUmVoZWFyc2FsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2tyYW1kb3duIDEuNC4yICAgICAwLjE1MDAwMCAgIDAuMDAwMDAwICAgMC4xNTAwMDAgKCAgMC4xNDk5ODkpCitNYXJ1a3UgMC43LjEgICAgICAgMC41ODAwMDAgICAwLjAxMDAwMCAgIDAuNTkwMDAwICggIDAuNTg0OTEwKQorQmx1ZUZlYXRoZXIgMC40MSAgIDAuNzgwMDAwICAgMC4wMDAwMDAgICAwLjc4MDAwMCAoICAwLjc4ODc0MCkKK0JsdWVDbG90aCAyLjIuMCAgICAwLjAyMDAwMCAgIDAuMDAwMDAwICAgMC4wMjAwMDAgKCAgMC4wMTQ3MDApCitSRGlzY291bnQgMi4xLjcgICAgMC4wMDAwMDAgICAwLjAwMDAwMCAgIDAuMDAwMDAwICggIDAuMDA3NjkyKQorcmVkY2FycGV0IDMuMS4yICAgIDAuMDEwMDAwICAgMC4wMDAwMDAgICAwLjAxMDAwMCAoICAwLjAwMjA2NCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdG90YWw6IDEuNTUwMDAwc2VjCisKKyAgICAgICAgICAgICAgICAgICAgICAgdXNlciAgICAgc3lzdGVtICAgICAgdG90YWwgICAgICAgIHJlYWwKK2tyYW1kb3duIDEuNC4yICAgICAwLjE1MDAwMCAgIDAuMDAwMDAwICAgMC4xNTAwMDAgKCAgMC4xNTE1ODYpCitNYXJ1a3UgMC43LjEgICAgICAgMC41MjAwMDAgICAwLjAwMDAwMCAgIDAuNTIwMDAwICggIDAuNTI1NzA3KQorQmx1ZUZlYXRoZXIgMC40MSAgIDAuNzcwMDAwICAgMC4wMTAwMDAgICAwLjc4MDAwMCAoICAwLjc2MzU1OSkKK0JsdWVDbG90aCAyLjIuMCAgICAwLjAyMDAwMCAgIDAuMDAwMDAwICAgMC4wMjAwMDAgKCAgMC4wMTU1MDkpCitSRGlzY291bnQgMi4xLjcgICAgMC4wMTAwMDAgICAwLjAwMDAwMCAgIDAuMDEwMDAwICggIDAuMDA2NTQ1KQorcmVkY2FycGV0IDMuMS4yICAgIDAuMDAwMDAwICAgMC4wMDAwMDAgICAwLjAwMDAwMCAoICAwLjAwMTQ3NSkKKworUmVhbCB0aW1lIG9mIFggZGl2aWRlZCBieSByZWFsIHRpbWUgb2Yga3JhbWRvd24KK01hcnVrdSAgICAgICAgICAgICAzLjQ2OAorQmx1ZUZlYXRoZXIgICAgICAgIDUuMDM3MQorQmx1ZUNsb3RoICAgICAgICAgIDAuMTAyMworUkRpc2NvdW50ICAgICAgICAgIDAuMDQzMgorcmVkY2FycGV0ICAgICAgICAgIDAuMDA5NworPC9jb2RlPjwvcHJlPgorCitBbmQgaGVyZSBhcmUgc29tZSBncmFwaHMgd2hpY2ggc2hvdyB0aGUgZXhlY3V0aW9uIHRpbWVzIG9mIHRoZSB2YXJpb3VzIGtyYW1kb3duIHJlbGVhc2VzIG9uCitkaWZmZXJlbnQgUnVieSBpbnRlcnByZXRlcnM6CisKKyFbcnVieSAxLjguN3AzMDJdKHtyZWxvY2F0YWJsZTogaW1nL2dyYXBoLXJ1YnktMS44LjctMzAyLnBuZ30pCishW3J1YnkgMS45LjNwNDQ4XSh7cmVsb2NhdGFibGU6IGltZy9ncmFwaC1ydWJ5LTEuOS4zcDQ0OC00NDgucG5nfSkKKyFbcnVieSAyLjAuMHAyNDddKHtyZWxvY2F0YWJsZTogaW1nL2dyYXBoLXJ1YnktMi4wLjBwMjQ3LTI0Ny5wbmd9KQorIVtydWJ5IDIuMS4ycDk1XSh7cmVsb2NhdGFibGU6IGltZy9ncmFwaC1ydWJ5LTIuMS4ycDk1LTk1LnBuZ30pCishW2pydWJ5IDEuNy4xNV0oe3JlbG9jYXRhYmxlOiBpbWcvZ3JhcGgtanJ1YnktMS43LjE1LTM5Mi5wbmd9KQorIVtydWJpbml1cyAyLjIuMTBdKHtyZWxvY2F0YWJsZTogaW1nL2dyYXBoLXJ1YmluaXVzLTIuMi4xMC0wLnBuZ30pCisKK1tNYXJrZG93biBUZXN0IFN1aXRlXTogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9kb3dubG9hZHMvTWFya2Rvd25UZXN0XzEuMC56aXAKK1tNRFRlc3RdOiBodHRwOi8vd3d3Lm1pY2hlbGYuY29tL2RvY3MvcHJvamV0cy9tZHRlc3QtMS4wLnppcApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy92aXJ0dWFsIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2RvYy92aXJ0dWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMTY0MjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvZG9jL3ZpcnR1YWwKQEAgLTAsMCArMSwxNCBAQAorcmRvYy9pbmRleC5odG1sOgorICB0aXRsZTogQVBJIERvY3VtZW50YXRpb24KKworL29wdGlvbnMuZW4uaHRtbCNvcHRpb24tc3ludGF4LWhpZ2hsaWdodGVyOgorICBkZXN0X3BhdGg6IG9wdGlvbnMuaHRtbCNvcHRpb24tc3ludGF4LWhpZ2hsaWdodGVyCisKKy9vcHRpb25zLmVuLmh0bWwjb3B0aW9uLXN5bnRheC1oaWdobGlnaHRlci1vcHRzOgorICBkZXN0X3BhdGg6IG9wdGlvbnMuaHRtbCNvcHRpb24tc3ludGF4LWhpZ2hsaWdodGVyLW9wdHMKKworL29wdGlvbnMuZW4uaHRtbCNvcHRpb24tbWF0aC1lbmdpbmU6CisgIGRlc3RfcGF0aDogb3B0aW9ucy5odG1sI29wdGlvbi1tYXRoLWVuZ2luZQorCisvb3B0aW9ucy5lbi5odG1sI29wdGlvbi1tYXRoLWVuZ2luZS1vcHRzOgorICBkZXN0X3BhdGg6IG9wdGlvbnMuaHRtbCNvcHRpb24tbWF0aC1lbmdpbmUtb3B0cwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MzQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24ucmIKQEAgLTAsMCArMSwxMCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdrcmFtZG93bi9kb2N1bWVudCcKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29tcGF0aWJpbGl0eS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29tcGF0aWJpbGl0eS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBmMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb21wYXRpYmlsaXR5LnJiCkBAIC0wLDAgKzEsNDggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKyMgQWxsIHRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBiYWNrcG9ydGVkIGZyb20gUnVieSAxLjguNyBzb3RoYXQga3JhbWRvd24gd29ya3MgdW5kZXIgMS44LjUKKyMKKyMgOnN0b3Bkb2M6CisKK3JlcXVpcmUgJ3JiY29uZmlnJworCitpZiBSVUJZX1ZFUlNJT04gPD0gJzEuOC42JworICByZXF1aXJlICdyZXhtbC9wYXJzZXJzL2Jhc2VwYXJzZXInCisgIG1vZHVsZSBSRVhNTAorICAgIG1vZHVsZSBQYXJzZXJzCisgICAgICBjbGFzcyBCYXNlUGFyc2VyCisgICAgICAgIFVOQU1FX1NUUj0gIig/OiN7TkNOQU1FX1NUUn06KT8je05DTkFNRV9TVFJ9IiB1bmxlc3MgY29uc3RfZGVmaW5lZD8oOlVOQU1FX1NUUikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBpZiAhU3RyaW5nLmluc3RhbmNlX21ldGhvZHMuaW5jbHVkZT8oInN0YXJ0X3dpdGg/IikKKworICAgIGNsYXNzIFN0cmluZworICAgICAgZGVmIHN0YXJ0X3dpdGg/KHN0cikKKyAgICAgICAgc2VsZlswLCBzdHIubGVuZ3RoXSA9PSBzdHIKKyAgICAgIGVuZAorICAgICAgZGVmIGVuZF93aXRoPyhzdHIpCisgICAgICAgIHNlbGZbLXN0ci5sZW5ndGgsIHN0ci5sZW5ndGhdID09IHN0cgorICAgICAgZW5kCisgICAgZW5kCisKKyAgZW5kCisKK2VuZAorCitpZiAhU3ltYm9sLmluc3RhbmNlX21ldGhvZHMuaW5jbHVkZT8oIjw9PiIpCisKKyAgY2xhc3MgU3ltYm9sCisgICAgZGVmIDw9PihvdGhlcikKKyAgICAgIHNlbGYudG9fcyA8PT4gb3RoZXIudG9fcworICAgIGVuZAorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYThmMTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci5yYgpAQCAtMCwwICsxLDY5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ2tyYW1kb3duL3V0aWxzJworCittb2R1bGUgS3JhbWRvd24KKworICAjIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCBhdmFpbGFibGUgY29udmVydGVycywgaS5lLiBjbGFzc2VzIHRoYXQgdGFrZSBhIHJvb3QgRWxlbWVudCBhbmQgY29udmVydAorICAjIGl0IHRvIGEgc3BlY2lmaWMgb3V0cHV0IGZvcm1hdC4gVGhlIHJlc3VsdCBpcyBub3JtYWxseSBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHRoZQorICAjIENvbnZlcnRlcjo6SHRtbCBtb2R1bGUgY29udmVydHMgYW4gZWxlbWVudCB0cmVlIGludG8gdmFsaWQgSFRNTC4KKyAgIworICAjIENvbnZlcnRlcnMgdXNlIHRoZSBCYXNlIGNsYXNzIGZvciBjb21tb24gZnVuY3Rpb25hbGl0eSAobGlrZSBhcHBseWluZyBhIHRlbXBsYXRlIHRvIHRoZSBvdXRwdXQpCisgICMgXC0gc2VlIGl0cyBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgaG93IHRvIGNyZWF0ZSBhIGN1c3RvbSBjb252ZXJ0ZXIgY2xhc3MuCisgIG1vZHVsZSBDb252ZXJ0ZXIKKworICAgIGF1dG9sb2FkIDpCYXNlLCAna3JhbWRvd24vY29udmVydGVyL2Jhc2UnCisgICAgYXV0b2xvYWQgOkh0bWwsICdrcmFtZG93bi9jb252ZXJ0ZXIvaHRtbCcKKyAgICBhdXRvbG9hZCA6TGF0ZXgsICdrcmFtZG93bi9jb252ZXJ0ZXIvbGF0ZXgnCisgICAgYXV0b2xvYWQgOktyYW1kb3duLCAna3JhbWRvd24vY29udmVydGVyL2tyYW1kb3duJworICAgIGF1dG9sb2FkIDpUb2MsICdrcmFtZG93bi9jb252ZXJ0ZXIvdG9jJworICAgIGF1dG9sb2FkIDpSZW1vdmVIdG1sVGFncywgJ2tyYW1kb3duL2NvbnZlcnRlci9yZW1vdmVfaHRtbF90YWdzJworICAgIGF1dG9sb2FkIDpQZGYsICdrcmFtZG93bi9jb252ZXJ0ZXIvcGRmJworICAgIGF1dG9sb2FkIDpIYXNoQVNULCAna3JhbWRvd24vY29udmVydGVyL2hhc2hfYXN0JworICAgIGF1dG9sb2FkIDpIYXNoQXN0LCAna3JhbWRvd24vY29udmVydGVyL2hhc2hfYXN0JworICAgIGF1dG9sb2FkIDpNYW4sICdrcmFtZG93bi9jb252ZXJ0ZXIvbWFuJworCisgICAgZXh0ZW5kIDo6S3JhbWRvd246OlV0aWxzOjpDb25maWd1cmFibGUKKworICAgIGNvbmZpZ3VyYWJsZSg6c3ludGF4X2hpZ2hsaWdodGVyKQorCisgICAgWydNaW50ZWQnLCAiQ29kZXJheSIsICJSb3VnZSJdLmVhY2ggZG8gfGtsYXNzX25hbWV8CisgICAgICBrbl9kb3duID0ga2xhc3NfbmFtZS5kb3duY2FzZS5pbnRlcm4KKyAgICAgIGFkZF9zeW50YXhfaGlnaGxpZ2h0ZXIoa25fZG93bikgZG8gfGNvbnZlcnRlciwgdGV4dCwgbGFuZywgdHlwZSwgb3B0c3wKKyAgICAgICAgcmVxdWlyZSAia3JhbWRvd24vY29udmVydGVyL3N5bnRheF9oaWdobGlnaHRlci8je2tuX2Rvd259IgorICAgICAgICBrbGFzcyA9IDo6S3JhbWRvd246OlV0aWxzLmRlZXBfY29uc3RfZ2V0KCI6OktyYW1kb3duOjpDb252ZXJ0ZXI6OlN5bnRheEhpZ2hsaWdodGVyOjoje2tsYXNzX25hbWV9IikKKyAgICAgICAgaWYgIWtsYXNzLmNvbnN0X2RlZmluZWQ/KDpBVkFJTEFCTEUpIHx8IGtsYXNzOjpBVkFJTEFCTEUKKyAgICAgICAgICBhZGRfc3ludGF4X2hpZ2hsaWdodGVyKGtuX2Rvd24sIGtsYXNzKQorICAgICAgICBlbHNlCisgICAgICAgICAgYWRkX3N5bnRheF9oaWdobGlnaHRlcihrbl9kb3duKSB7fCphcmdzfCBuaWx9CisgICAgICAgIGVuZAorICAgICAgICBzeW50YXhfaGlnaGxpZ2h0ZXIoa25fZG93bikuY2FsbChjb252ZXJ0ZXIsIHRleHQsIGxhbmcsIHR5cGUsIG9wdHMpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNvbmZpZ3VyYWJsZSg6bWF0aF9lbmdpbmUpCisKKyAgICBbJ01hdGhqYXgnLCAiTWF0aGpheE5vZGUiLCAiUml0ZXgiLCAiSXRleDJNTUwiXS5lYWNoIGRvIHxrbGFzc19uYW1lfAorICAgICAga25fZG93biA9IGtsYXNzX25hbWUuZG93bmNhc2UuaW50ZXJuCisgICAgICBhZGRfbWF0aF9lbmdpbmUoa25fZG93bikgZG8gfGNvbnZlcnRlciwgZWwsIG9wdHN8CisgICAgICAgIHJlcXVpcmUgImtyYW1kb3duL2NvbnZlcnRlci9tYXRoX2VuZ2luZS8je2tuX2Rvd259IgorICAgICAgICBrbGFzcyA9IDo6S3JhbWRvd246OlV0aWxzLmRlZXBfY29uc3RfZ2V0KCI6OktyYW1kb3duOjpDb252ZXJ0ZXI6Ok1hdGhFbmdpbmU6OiN7a2xhc3NfbmFtZX0iKQorICAgICAgICBpZiAha2xhc3MuY29uc3RfZGVmaW5lZD8oOkFWQUlMQUJMRSkgfHwga2xhc3M6OkFWQUlMQUJMRQorICAgICAgICAgIGFkZF9tYXRoX2VuZ2luZShrbl9kb3duLCBrbGFzcykKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFkZF9tYXRoX2VuZ2luZShrbl9kb3duKSB7fCphcmdzfCBuaWx9CisgICAgICAgIGVuZAorICAgICAgICBtYXRoX2VuZ2luZShrbl9kb3duKS5jYWxsKGNvbnZlcnRlciwgZWwsIG9wdHMpCisgICAgICBlbmQKKyAgICBlbmQKKworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9iYXNlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvYmFzZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTE3MmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvYmFzZS5yYgpAQCAtMCwwICsxLDI2NyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdlcmInCityZXF1aXJlICdrcmFtZG93bi91dGlscycKK3JlcXVpcmUgJ2tyYW1kb3duL2RvY3VtZW50JworCittb2R1bGUgS3JhbWRvd24KKworICBtb2R1bGUgQ29udmVydGVyCisKKyAgICAjID09IFxCYXNlIGNsYXNzIGZvciBjb252ZXJ0ZXJzCisgICAgIworICAgICMgVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgYmFzZSBjbGFzcyBmb3IgYWxsIGNvbnZlcnRlcnMuIEl0IHByb3ZpZGVzIG1ldGhvZHMgdGhhdCBjYW4vc2hvdWxkIGJlCisgICAgIyB1c2VkIGJ5IGFsbCBjb252ZXJ0ZXJzIChsaWtlICNnZW5lcmF0ZV9pZCkgYXMgd2VsbCBhcyBjb21tb24gZnVuY3Rpb25hbGl0eSB0aGF0IGlzCisgICAgIyBhdXRvbWF0aWNhbGx5IGFwcGxpZWQgdG8gdGhlIHJlc3VsdCAoZm9yIGV4YW1wbGUsIGVtYmVkZGluZyB0aGUgb3V0cHV0IGludG8gYSB0ZW1wbGF0ZSkuCisgICAgIworICAgICMgQSBjb252ZXJ0ZXIgb2JqZWN0IGlzIHVzZWQgYXMgYSB0aHJvdy1hd2F5IG9iamVjdCwgaS5lLiBpdCBpcyBvbmx5IHVzZWQgZm9yIHN0b3JpbmcgdGhlIG5lZWRlZAorICAgICMgc3RhdGUgaW5mb3JtYXRpb24gZHVyaW5nIGNvbnZlcnNpb24uIFRoZXJlZm9yZSBvbmUgY2FuJ3QgaW5zdGFudGlhdGUgYSBjb252ZXJ0ZXIgb2JqZWN0CisgICAgIyBkaXJlY3RseSBidXQgb25seSB1c2UgdGhlIEJhc2U6OmNvbnZlcnQgbWV0aG9kLgorICAgICMKKyAgICAjID09IEltcGxlbWVudGluZyBhIGNvbnZlcnRlcgorICAgICMKKyAgICAjIEltcGxlbWVudGluZyBhIG5ldyBjb252ZXJ0ZXIgaXMgcmF0aGVyIGVhc3k6IGp1c3QgZGVyaXZlIGEgbmV3IGNsYXNzIGZyb20gdGhpcyBjbGFzcyBhbmQgcHV0CisgICAgIyBpdCBpbiB0aGUgS3JhbWRvd246OkNvbnZlcnRlciBtb2R1bGUgKHRoZSBsYXR0ZXIgaXMgb25seSBuZWVkZWQgaWYgYXV0by1kZXRlY3Rpb24gc2hvdWxkIHdvcmsKKyAgICAjIHByb3Blcmx5KS4gVGhlbiB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhlICNjb252ZXJ0IG1ldGhvZCB3aGljaCBoYXMgdG8gY29udGFpbiB0aGUgY29udmVyc2lvbgorICAgICMgY29kZSBmb3IgY29udmVydGluZyBhbiBlbGVtZW50IGFuZCBoYXMgdG8gcmV0dXJuIHRoZSBjb252ZXJzaW9uIHJlc3VsdC4KKyAgICAjCisgICAgIyBUaGUgYWN0dWFsIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBkb2N1bWVudCB0cmVlIGNhbiBiZSBkb25lIGluIGFueSB3YXkuIEhvd2V2ZXIsIHdyaXRpbmcgb25lCisgICAgIyBtZXRob2QgcGVyIGVsZW1lbnQgdHlwZSBpcyBhIHN0cmFpZ2h0IGZvcndhcmQgd2F5IHRvIGRvIGl0IC0gdGhpcyBpcyBob3cgdGhlIEh0bWwgYW5kIExhdGV4CisgICAgIyBjb252ZXJ0ZXJzIGRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAjCisgICAgIyBIYXZlIGEgbG9vayBhdCB0aGUgQmFzZTo6Y29udmVydCBtZXRob2QgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24hCisgICAgY2xhc3MgQmFzZQorCisgICAgICAjIENhbiBiZSB1c2VkIGJ5IGEgY29udmVydGVyIGZvciBzdG9yaW5nIGFyYml0cmFyeSBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAgICAgIGF0dHJfcmVhZGVyIDpkYXRhCisKKyAgICAgICMgVGhlIGhhc2ggd2l0aCB0aGUgY29udmVyc2lvbiBvcHRpb25zLgorICAgICAgYXR0cl9yZWFkZXIgOm9wdGlvbnMKKworICAgICAgIyBUaGUgcm9vdCBlbGVtZW50IHRoYXQgaXMgY29udmVydGVkLgorICAgICAgYXR0cl9yZWFkZXIgOnJvb3QKKworICAgICAgIyBUaGUgd2FybmluZ3MgYXJyYXkuCisgICAgICBhdHRyX3JlYWRlciA6d2FybmluZ3MKKworICAgICAgIyBJbml0aWFsaXplIHRoZSBjb252ZXJ0ZXIgd2l0aCB0aGUgZ2l2ZW4gK3Jvb3QrIGVsZW1lbnQgYW5kICtvcHRpb25zKyBoYXNoLgorICAgICAgZGVmIGluaXRpYWxpemUocm9vdCwgb3B0aW9ucykKKyAgICAgICAgQG9wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIEByb290ID0gcm9vdAorICAgICAgICBAZGF0YSA9IHt9CisgICAgICAgIEB3YXJuaW5ncyA9IFtdCisgICAgICBlbmQKKyAgICAgIHByaXZhdGVfY2xhc3NfbWV0aG9kKDpuZXcsIDphbGxvY2F0ZSkKKworICAgICAgIyBSZXR1cm5zIHdoZXRoZXIgdGhlIHRlbXBsYXRlIHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSB0aGUgY29udmVyc2lvbiBvZiB0aGUgdHJlZS4KKyAgICAgICMKKyAgICAgICMgRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICBkZWYgYXBwbHlfdGVtcGxhdGVfYmVmb3JlPworICAgICAgICBmYWxzZQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBzaG91bGQgYmUgYXBwbGllZCBhZnRlciB0aGUgY29udmVyc2lvbiBvZiB0aGUgdHJlZS4KKyAgICAgICMKKyAgICAgICMgRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgIGRlZiBhcHBseV90ZW1wbGF0ZV9hZnRlcj8KKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisKKyAgICAgICMgQ29udmVydCB0aGUgZWxlbWVudCB0cmVlICt0cmVlKyBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgY29udmVyc2lvbiBvYmplY3QgKG5vcm1hbGx5IGEKKyAgICAgICMgc3RyaW5nKSBhbmQgYW4gYXJyYXkgd2l0aCB3YXJuaW5nIG1lc3NhZ2VzLiBUaGUgcGFyYW1ldGVyICtvcHRpb25zKyBzcGVjaWZpZXMgdGhlIGNvbnZlcnNpb24KKyAgICAgICMgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkLgorICAgICAgIworICAgICAgIyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2FsbGluZyBjbGFzcyBhbmQgdGhlbiBjYWxscyB0aGUgI2NvbnZlcnQgbWV0aG9kIHdpdGgKKyAgICAgICMgK3RyZWUrIGFzIHBhcmFtZXRlci4KKyAgICAgICMKKyAgICAgICMgSWYgdGhlICt0ZW1wbGF0ZSsgb3B0aW9uIGlzIHNwZWNpZmllZCBhbmQgbm9uLWVtcHR5LCB0aGUgdGVtcGxhdGUgaXMgZXZhbHVhdGUgd2l0aCBFUkIKKyAgICAgICMgYmVmb3JlIGFuZC9vciBhZnRlciB0aGUgdHJlZSBjb252ZXJzaW9uIGRlcGVuZGluZyBvbiB0aGUgcmVzdWx0IG9mICNhcHBseV90ZW1wbGF0ZV9iZWZvcmU/CisgICAgICAjIGFuZCAjYXBwbHlfdGVtcGxhdGVfYWZ0ZXI/LiBJZiB0aGUgdGVtcGxhdGUgaXMgZXZhbHVhdGVkIGJlZm9yZSwgYW4gZW1wdHkgc3RyaW5nIGlzIHVzZWQgZm9yCisgICAgICAjIHRoZSBib2R5OyBpZiBldmFsdWF0ZWQgYWZ0ZXIsIHRoZSByZXN1bHQgaXMgdXNlZCBhcyBib2R5LiBTZWUgOjphcHBseV90ZW1wbGF0ZS4KKyAgICAgICMKKyAgICAgICMgVGhlIHRlbXBsYXRlIHJlc29sdXRpb24gaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHdheSAoZm9yIHRoZSBjb252ZXJ0ZXIgQ29udmVydGVyTmFtZSk6CisgICAgICAjCisgICAgICAjIDEuIExvb2sgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSB0ZW1wbGF0ZS4KKyAgICAgICMKKyAgICAgICMgMi4gQXBwZW5kICsuY29udmVydGVyX25hbWUrIChlLmcuICsuaHRtbCspIHRvIHRoZSB0ZW1wbGF0ZSBuYW1lIGFuZCBsb29rIGZvciB0aGUgcmVzdWx0aW5nCisgICAgICAjICAgIGZpbGUgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHRoZSBmb3JtICsuY29udmVydGVybmFtZSsgaXMgZGVwcmVjYXRlZCkuCisgICAgICAjCisgICAgICAjIDMuIEFwcGVuZCArLmNvbnZlcnRlcl9uYW1lKyB0byB0aGUgdGVtcGxhdGUgbmFtZSBhbmQgbG9vayBmb3IgaXQgaW4gdGhlIGtyYW1kb3duIGRhdGEKKyAgICAgICMgICAgZGlyZWN0b3J5ICh0aGUgZm9ybSArLmNvbnZlcnRlcm5hbWUrIGlzIGRlcHJlY2F0ZWQpLgorICAgICAgIworICAgICAgIyA0LiBDaGVjayBpZiB0aGUgdGVtcGxhdGUgbmFtZSBzdGFydHMgd2l0aCAnc3RyaW5nOi8vJyBhbmQgaWYgc28sIHN0cmlwIHRoaXMgcHJlZml4IGF3YXkgYW5kCisgICAgICAjICAgIHVzZSB0aGUgcmVzdCBhcyB0ZW1wbGF0ZS4KKyAgICAgIGRlZiBzZWxmLmNvbnZlcnQodHJlZSwgb3B0aW9ucyA9IHt9KQorICAgICAgICBjb252ZXJ0ZXIgPSBuZXcodHJlZSwgOjpLcmFtZG93bjo6T3B0aW9ucy5tZXJnZShvcHRpb25zLm1lcmdlKHRyZWUub3B0aW9uc1s6b3B0aW9uc10gfHwge30pKSkKKworICAgICAgICBhcHBseV90ZW1wbGF0ZShjb252ZXJ0ZXIsICcnKSBpZiAhY29udmVydGVyLm9wdGlvbnNbOnRlbXBsYXRlXS5lbXB0eT8gJiYgY29udmVydGVyLmFwcGx5X3RlbXBsYXRlX2JlZm9yZT8KKyAgICAgICAgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQodHJlZSkKKyAgICAgICAgcmVzdWx0LmVuY29kZSEodHJlZS5vcHRpb25zWzplbmNvZGluZ10pIGlmIHJlc3VsdC5yZXNwb25kX3RvPyg6ZW5jb2RlISkgJiYgcmVzdWx0LmVuY29kaW5nICE9IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgcmVzdWx0ID0gYXBwbHlfdGVtcGxhdGUoY29udmVydGVyLCByZXN1bHQpIGlmICFjb252ZXJ0ZXIub3B0aW9uc1s6dGVtcGxhdGVdLmVtcHR5PyAmJiBjb252ZXJ0ZXIuYXBwbHlfdGVtcGxhdGVfYWZ0ZXI/CisKKyAgICAgICAgW3Jlc3VsdCwgY29udmVydGVyLndhcm5pbmdzXQorICAgICAgZW5kCisKKyAgICAgICMgQ29udmVydCB0aGUgZWxlbWVudCArZWwrIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBvYmplY3QuCisgICAgICAjCisgICAgICAjIFRoaXMgaXMgdGhlIG9ubHkgbWV0aG9kIHRoYXQgaGFzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1Yi1jbGFzc2VzIQorICAgICAgZGVmIGNvbnZlcnQoZWwpCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgIGVuZAorCisgICAgICAjIEFwcGx5IHRoZSArdGVtcGxhdGUrIHVzaW5nICtib2R5KyBhcyB0aGUgYm9keSBzdHJpbmcuCisgICAgICAjCisgICAgICAjIFRoZSB0ZW1wbGF0ZSBpcyBldmFsdWF0ZWQgdXNpbmcgRVJCIGFuZCB0aGUgYm9keSBpcyBhdmFpbGFibGUgaW4gdGhlIEBib2R5IGluc3RhbmNlIHZhcmlhYmxlCisgICAgICAjIGFuZCB0aGUgY29udmVydGVyIG9iamVjdCBpbiB0aGUgQGNvbnZlcnRlciBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICAgIGRlZiBzZWxmLmFwcGx5X3RlbXBsYXRlKGNvbnZlcnRlciwgYm9keSkgIyA6bm9kb2M6CisgICAgICAgIGVyYiA9IEVSQi5uZXcoZ2V0X3RlbXBsYXRlKGNvbnZlcnRlci5vcHRpb25zWzp0ZW1wbGF0ZV0pKQorICAgICAgICBvYmogPSBPYmplY3QubmV3CisgICAgICAgIG9iai5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBjb252ZXJ0ZXIsIGNvbnZlcnRlcikKKyAgICAgICAgb2JqLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QGJvZHksIGJvZHkpCisgICAgICAgIGVyYi5yZXN1bHQob2JqLmluc3RhbmNlX2V2YWx7YmluZGluZ30pCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm4gdGhlIHRlbXBsYXRlIHNwZWNpZmllZCBieSArdGVtcGxhdGUrLgorICAgICAgZGVmIHNlbGYuZ2V0X3RlbXBsYXRlKHRlbXBsYXRlKQorICAgICAgICAjREVQUkVDQVRFRDogdXNlIGNvbnRlbnQgb2YgI2dldF90ZW1wbGF0ZV9uZXcgaW4gMi4wCisgICAgICAgIGZvcm1hdF9leHQgPSAnLicgKyBzZWxmLm5hbWUuc3BsaXQoLzo6LykubGFzdC5kb3duY2FzZQorICAgICAgICBzaGlwcGVkID0gRmlsZS5qb2luKDo6S3JhbWRvd24uZGF0YV9kaXIsIHRlbXBsYXRlICsgZm9ybWF0X2V4dCkKKyAgICAgICAgaWYgRmlsZS5leGlzdD8odGVtcGxhdGUpCisgICAgICAgICAgRmlsZS5yZWFkKHRlbXBsYXRlKQorICAgICAgICBlbHNpZiBGaWxlLmV4aXN0Pyh0ZW1wbGF0ZSArIGZvcm1hdF9leHQpCisgICAgICAgICAgRmlsZS5yZWFkKHRlbXBsYXRlICsgZm9ybWF0X2V4dCkKKyAgICAgICAgZWxzaWYgRmlsZS5leGlzdD8oc2hpcHBlZCkKKyAgICAgICAgICBGaWxlLnJlYWQoc2hpcHBlZCkKKyAgICAgICAgZWxzaWYgdGVtcGxhdGUuc3RhcnRfd2l0aD8oJ3N0cmluZzovLycpCisgICAgICAgICAgdGVtcGxhdGUuc3ViKC9cQXN0cmluZzpcL1wvLywgJycpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBnZXRfdGVtcGxhdGVfbmV3KHRlbXBsYXRlKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5nZXRfdGVtcGxhdGVfbmV3KHRlbXBsYXRlKSAjIDpub2RvYzoKKyAgICAgICAgZm9ybWF0X2V4dCA9ICcuJyArIDo6S3JhbWRvd246OlV0aWxzLnNuYWtlX2Nhc2Uoc2VsZi5uYW1lLnNwbGl0KC86Oi8pLmxhc3QpCisgICAgICAgIHNoaXBwZWQgPSBGaWxlLmpvaW4oOjpLcmFtZG93bi5kYXRhX2RpciwgdGVtcGxhdGUgKyBmb3JtYXRfZXh0KQorICAgICAgICBpZiBGaWxlLmV4aXN0Pyh0ZW1wbGF0ZSkKKyAgICAgICAgICBGaWxlLnJlYWQodGVtcGxhdGUpCisgICAgICAgIGVsc2lmIEZpbGUuZXhpc3Q/KHRlbXBsYXRlICsgZm9ybWF0X2V4dCkKKyAgICAgICAgICBGaWxlLnJlYWQodGVtcGxhdGUgKyBmb3JtYXRfZXh0KQorICAgICAgICBlbHNpZiBGaWxlLmV4aXN0PyhzaGlwcGVkKQorICAgICAgICAgIEZpbGUucmVhZChzaGlwcGVkKQorICAgICAgICBlbHNpZiB0ZW1wbGF0ZS5zdGFydF93aXRoPygnc3RyaW5nOi8vJykKKyAgICAgICAgICB0ZW1wbGF0ZS5zdWIoL1xBc3RyaW5nOlwvXC8vLCAnJykKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlICJUaGUgc3BlY2lmaWVkIHRlbXBsYXRlIGZpbGUgI3t0ZW1wbGF0ZX0gZG9lcyBub3QgZXhpc3QiCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgQWRkIHRoZSBnaXZlbiB3YXJuaW5nICt0ZXh0KyB0byB0aGUgd2FybmluZyBhcnJheS4KKyAgICAgIGRlZiB3YXJuaW5nKHRleHQpCisgICAgICAgIEB3YXJuaW5ncyA8PCB0ZXh0CisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm4gK3RydWUrIGlmIHRoZSBoZWFkZXIgZWxlbWVudCArZWwrIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgdGFibGUgb2YgY29udGVudHMgKGFzCisgICAgICAjIHNwZWNpZmllZCBieSB0aGUgK3RvY19sZXZlbHMrIG9wdGlvbikuCisgICAgICBkZWYgaW5fdG9jPyhlbCkKKyAgICAgICAgQG9wdGlvbnNbOnRvY19sZXZlbHNdLmluY2x1ZGU/KGVsLm9wdGlvbnNbOmxldmVsXSkgJiYgKGVsLmF0dHJbJ2NsYXNzJ10gfHwgJycpICF+IC9cYm5vX3RvY1xiLworICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJuIHRoZSBvdXRwdXQgaGVhZGVyIGxldmVsIGdpdmVuIGEgbGV2ZWwuCisgICAgICAjCisgICAgICAjIFVzZXMgdGhlICtoZWFkZXJfb2Zmc2V0KyBvcHRpb24gZm9yIGFkanVzdGluZyB0aGUgaGVhZGVyIGxldmVsLgorICAgICAgZGVmIG91dHB1dF9oZWFkZXJfbGV2ZWwobGV2ZWwpCisgICAgICAgIFtbbGV2ZWwgKyBAb3B0aW9uc1s6aGVhZGVyX29mZnNldF0sIDZdLm1pbiwgMV0ubWF4CisgICAgICBlbmQKKworICAgICAgIyBFeHRyYWN0IHRoZSBjb2RlIGJsb2NrL3NwYW4gbGFuZ3VhZ2UgZnJvbSB0aGUgYXR0cmlidXRlcy4KKyAgICAgIGRlZiBleHRyYWN0X2NvZGVfbGFuZ3VhZ2UoYXR0cikKKyAgICAgICAgaWYgYXR0clsnY2xhc3MnXSAmJiBhdHRyWydjbGFzcyddID1+IC9cYmxhbmd1YWdlLVxTKy8KKyAgICAgICAgICBhdHRyWydjbGFzcyddLnNjYW4oL1xibGFuZ3VhZ2UtKFxTKykvKS5maXJzdC5maXJzdAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFNlZSAjZXh0cmFjdF9jb2RlX2xhbmd1YWdlCisgICAgICAjCisgICAgICAjICpXYXJuaW5nKjogVGhpcyB2ZXJzaW9uIHdpbGwgbW9kaWZ5IHRoZSBnaXZlbiBhdHRyaWJ1dGVzIGlmIGEgbGFuZ3VhZ2UgaXMgcHJlc2VudC4KKyAgICAgIGRlZiBleHRyYWN0X2NvZGVfbGFuZ3VhZ2UhKGF0dHIpCisgICAgICAgIGxhbmcgPSBleHRyYWN0X2NvZGVfbGFuZ3VhZ2UoYXR0cikKKyAgICAgICAgYXR0clsnY2xhc3MnXSA9IGF0dHJbJ2NsYXNzJ10uc3ViKC9cYmxhbmd1YWdlLVxTKy8sICcnKS5zdHJpcCBpZiBsYW5nCisgICAgICAgIGF0dHIuZGVsZXRlKCdjbGFzcycpIGlmIGxhbmcgJiYgYXR0clsnY2xhc3MnXS5lbXB0eT8KKyAgICAgICAgbGFuZworICAgICAgZW5kCisKKyAgICAgICMgSGlnaGxpZ2h0IHRoZSBnaXZlbiArdGV4dCsgaW4gdGhlIGxhbmd1YWdlICtsYW5nKyB3aXRoIHRoZSBzeW50YXggaGlnaGxpZ2h0ZXIgY29uZmlndXJlZAorICAgICAgIyB0aHJvdWdoIHRoZSBvcHRpb24gJ3N5bnRheF9oaWdobGlnaHRlcicuCisgICAgICBkZWYgaGlnaGxpZ2h0X2NvZGUodGV4dCwgbGFuZywgdHlwZSwgb3B0cyA9IHt9KQorICAgICAgICByZXR1cm4gbmlsIHVubGVzcyBAb3B0aW9uc1s6c3ludGF4X2hpZ2hsaWdodGVyXQorCisgICAgICAgIGhpZ2hsaWdodGVyID0gOjpLcmFtZG93bjo6Q29udmVydGVyLnN5bnRheF9oaWdobGlnaHRlcihAb3B0aW9uc1s6c3ludGF4X2hpZ2hsaWdodGVyXSkKKyAgICAgICAgaWYgaGlnaGxpZ2h0ZXIKKyAgICAgICAgICBoaWdobGlnaHRlci5jYWxsKHNlbGYsIHRleHQsIGxhbmcsIHR5cGUsIG9wdHMpCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3YXJuaW5nKCJUaGUgY29uZmlndXJlZCBzeW50YXggaGlnaGxpZ2h0ZXIgI3tAb3B0aW9uc1s6c3ludGF4X2hpZ2hsaWdodGVyXX0gaXMgbm90IGF2YWlsYWJsZS4iKQorICAgICAgICAgIG5pbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEZvcm1hdCB0aGUgZ2l2ZW4gbWF0aCBlbGVtZW50IHdpdGggdGhlIG1hdGggZW5naW5lIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgb3B0aW9uCisgICAgICAjICdtYXRoX2VuZ2luZScuCisgICAgICBkZWYgZm9ybWF0X21hdGgoZWwsIG9wdHMgPSB7fSkKKyAgICAgICAgcmV0dXJuIG5pbCB1bmxlc3MgQG9wdGlvbnNbOm1hdGhfZW5naW5lXQorCisgICAgICAgIGVuZ2luZSA9IDo6S3JhbWRvd246OkNvbnZlcnRlci5tYXRoX2VuZ2luZShAb3B0aW9uc1s6bWF0aF9lbmdpbmVdKQorICAgICAgICBpZiBlbmdpbmUKKyAgICAgICAgICBlbmdpbmUuY2FsbChzZWxmLCBlbCwgb3B0cykKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdhcm5pbmcoIlRoZSBjb25maWd1cmVkIG1hdGggZW5naW5lICN7QG9wdGlvbnNbOm1hdGhfZW5naW5lXX0gaXMgbm90IGF2YWlsYWJsZS4iKQorICAgICAgICAgIG5pbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEdlbmVyYXRlIGFuIHVuaXF1ZSBhbHBoYS1udW1lcmljIElEIGZyb20gdGhlIHRoZSBzdHJpbmcgK3N0cisgZm9yIHVzZSBhcyBhIGhlYWRlciBJRC4KKyAgICAgICMKKyAgICAgICMgVXNlcyB0aGUgb3B0aW9uICthdXRvX2lkX3ByZWZpeCs6IHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbiBpcyBwcmVwZW5kZWQgdG8gZXZlcnkgZ2VuZXJhdGVkCisgICAgICAjIElELgorICAgICAgZGVmIGdlbmVyYXRlX2lkKHN0cikKKyAgICAgICAgc3RyID0gOjpLcmFtZG93bjo6VXRpbHM6OlVuaWRlY29kZXIuZGVjb2RlKHN0cikgaWYgQG9wdGlvbnNbOnRyYW5zbGl0ZXJhdGVkX2hlYWRlcl9pZHNdCisgICAgICAgIGdlbl9pZCA9IGJhc2ljX2dlbmVyYXRlX2lkKHN0cikKKyAgICAgICAgZ2VuX2lkID0gJ3NlY3Rpb24nIGlmIGdlbl9pZC5sZW5ndGggPT0gMAorICAgICAgICBAdXNlZF9pZHMgfHw9IHt9CisgICAgICAgIGlmIEB1c2VkX2lkcy5oYXNfa2V5PyhnZW5faWQpCisgICAgICAgICAgZ2VuX2lkICs9ICctJyA8PCAoQHVzZWRfaWRzW2dlbl9pZF0gKz0gMSkudG9fcworICAgICAgICBlbHNlCisgICAgICAgICAgQHVzZWRfaWRzW2dlbl9pZF0gPSAwCisgICAgICAgIGVuZAorICAgICAgICBAb3B0aW9uc1s6YXV0b19pZF9wcmVmaXhdICsgZ2VuX2lkCisgICAgICBlbmQKKworICAgICAgIyBUaGUgYmFzaWMgdmVyc2lvbiBvZiB0aGUgSUQgZ2VuZXJhdG9yLCB3aXRob3V0IGFueSBzcGVjaWFsIHByb3Zpc2lvbnMgZm9yIGVtcHR5IG9yIHVuaXF1ZQorICAgICAgIyBJRHMuCisgICAgICBkZWYgYmFzaWNfZ2VuZXJhdGVfaWQoc3RyKQorICAgICAgICBnZW5faWQgPSBzdHIuZ3N1YigvXlteYS16QS1aXSsvLCAnJykKKyAgICAgICAgZ2VuX2lkLnRyISgnXmEtekEtWjAtOSAtJywgJycpCisgICAgICAgIGdlbl9pZC50ciEoJyAnLCAnLScpCisgICAgICAgIGdlbl9pZC5kb3duY2FzZSEKKyAgICAgICAgZ2VuX2lkCisgICAgICBlbmQKKworICAgICAgU01BUlRfUVVPVEVfSU5ESUNFUyA9IHs6bHNxdW8gPT4gMCwgOnJzcXVvID0+IDEsIDpsZHF1byA9PiAyLCA6cmRxdW8gPT4gM30gIyA6bm9kb2M6CisKKyAgICAgICMgUmV0dXJuIHRoZSBlbnRpdHkgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBzbWFydF9xdW90ZSBlbGVtZW50LgorICAgICAgZGVmIHNtYXJ0X3F1b3RlX2VudGl0eShlbCkKKyAgICAgICAgcmVzID0gQG9wdGlvbnNbOnNtYXJ0X3F1b3Rlc11bU01BUlRfUVVPVEVfSU5ESUNFU1tlbC52YWx1ZV1dCisgICAgICAgIDo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkocmVzKQorICAgICAgZW5kCisKKyAgICBlbmQKKworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9oYXNoX2FzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL2hhc2hfYXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTAwNGQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9oYXNoX2FzdC5yYgpAQCAtMCwwICsxLDM4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlcicKK3JlcXVpcmUgJ2tyYW1kb3duL2NvbnZlcnRlcicKK3JlcXVpcmUgJ2tyYW1kb3duL3V0aWxzJworCittb2R1bGUgS3JhbWRvd24KKworICBtb2R1bGUgQ29udmVydGVyCisKKyAgICAjIENvbnZlcnRzIGEgS3JhbWRvd246OkRvY3VtZW50IHRvIGEgbmVzdGVkIGhhc2ggZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBvciBkZWJ1ZyBvdXRwdXQuCisgICAgY2xhc3MgSGFzaEFTVCA8IEJhc2UKKworICAgICAgZGVmIGNvbnZlcnQoZWwpCisgICAgICAgIGhhc2ggPSB7OnR5cGUgPT4gZWwudHlwZX0KKyAgICAgICAgaGFzaFs6YXR0cl0gPSBlbC5hdHRyIHVubGVzcyBlbC5hdHRyLmVtcHR5PworICAgICAgICBoYXNoWzp2YWx1ZV0gPSBlbC52YWx1ZSB1bmxlc3MgZWwudmFsdWUubmlsPworICAgICAgICBoYXNoWzpvcHRpb25zXSA9IGVsLm9wdGlvbnMgdW5sZXNzIGVsLm9wdGlvbnMuZW1wdHk/CisgICAgICAgIHVubGVzcyBlbC5jaGlsZHJlbi5lbXB0eT8KKyAgICAgICAgICBoYXNoWzpjaGlsZHJlbl0gPSBbXQorICAgICAgICAgIGVsLmNoaWxkcmVuLmVhY2gge3xjaGlsZHwgaGFzaFs6Y2hpbGRyZW5dIDw8IGNvbnZlcnQoY2hpbGQpfQorICAgICAgICBlbmQKKyAgICAgICAgaGFzaAorICAgICAgZW5kCisKKyAgICBlbmQKKworICAgIEhhc2hBc3QgPSBIYXNoQVNUCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL2h0bWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9odG1sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjA4YmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9odG1sLnJiCkBAIC0wLDAgKzEsNDcxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlcicKK3JlcXVpcmUgJ2tyYW1kb3duL2NvbnZlcnRlcicKK3JlcXVpcmUgJ2tyYW1kb3duL3V0aWxzJworCittb2R1bGUgS3JhbWRvd24KKworICBtb2R1bGUgQ29udmVydGVyCisKKyAgICAjIENvbnZlcnRzIGEgS3JhbWRvd246OkRvY3VtZW50IHRvIEhUTUwuCisgICAgIworICAgICMgWW91IGNhbiBjdXN0b21pemUgdGhlIEhUTUwgY29udmVydGVyIGJ5IHN1Yi1jbGFzc2luZyBpdCBhbmQgb3ZlcnJpZGluZyB0aGUgK2NvbnZlcnRfTkFNRSsKKyAgICAjIG1ldGhvZHMuIEVhY2ggc3VjaCBtZXRob2QgdGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICMKKyAgICAjIFsrZWwrXSBUaGUgZWxlbWVudCBvZiB0eXBlICtOQU1FKyB0byBiZSBjb252ZXJ0ZWQuCisgICAgIworICAgICMgWytpbmRlbnQrXSBBIG51bWJlciByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgYW1vdW50IG9mIHNwYWNlcyBmb3IgaW5kZW50IChvbmx5IHVzZWQgZm9yCisgICAgIyAgICAgICAgICAgIGJsb2NrLWxldmVsIGVsZW1lbnRzKS4KKyAgICAjCisgICAgIyBUaGUgcmV0dXJuIHZhbHVlIG9mIHN1Y2ggYSBtZXRob2QgaGFzIHRvIGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgK2VsKyBmb3JtYXR0ZWQgYXMKKyAgICAjIEhUTUwgZWxlbWVudC4KKyAgICBjbGFzcyBIdG1sIDwgQmFzZQorCisgICAgICBpbmNsdWRlIDo6S3JhbWRvd246OlV0aWxzOjpIdG1sCisgICAgICBpbmNsdWRlIDo6S3JhbWRvd246OlBhcnNlcjo6SHRtbDo6Q29uc3RhbnRzCisKKyAgICAgICMgVGhlIGFtb3VudCBvZiBpbmRlbnRhdGlvbiB1c2VkIHdoZW4gbmVzdGluZyBIVE1MIHRhZ3MuCisgICAgICBhdHRyX2FjY2Vzc29yIDppbmRlbnQKKworICAgICAgIyBJbml0aWFsaXplIHRoZSBIVE1MIGNvbnZlcnRlciB3aXRoIHRoZSBnaXZlbiBLcmFtZG93biBkb2N1bWVudCArZG9jKy4KKyAgICAgIGRlZiBpbml0aWFsaXplKHJvb3QsIG9wdGlvbnMpCisgICAgICAgIHN1cGVyCisgICAgICAgIEBmb290bm90ZV9jb3VudGVyID0gQGZvb3Rub3RlX3N0YXJ0ID0gQG9wdGlvbnNbOmZvb3Rub3RlX25yXQorICAgICAgICBAZm9vdG5vdGVzID0gW10KKyAgICAgICAgQGZvb3Rub3Rlc19ieV9uYW1lID0ge30KKyAgICAgICAgQGZvb3Rub3RlX2xvY2F0aW9uID0gbmlsCisgICAgICAgIEB0b2MgPSBbXQorICAgICAgICBAdG9jX2NvZGUgPSBuaWwKKyAgICAgICAgQGluZGVudCA9IDIKKyAgICAgICAgQHN0YWNrID0gW10KKyAgICAgIGVuZAorCisgICAgICAjIFRoZSBtYXBwaW5nIG9mIGVsZW1lbnQgdHlwZSB0byBjb252ZXJzaW9uIG1ldGhvZC4KKyAgICAgIERJU1BBVENIRVIgPSBIYXNoLm5ldyB7fGgsa3wgaFtrXSA9ICJjb252ZXJ0XyN7a30ifQorCisgICAgICAjIERpc3BhdGNoIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBlbGVtZW50ICtlbCsgdG8gYSArY29udmVydF9UWVBFKyBtZXRob2QgdXNpbmcgdGhlICt0eXBlKyBvZgorICAgICAgIyB0aGUgZWxlbWVudC4KKyAgICAgIGRlZiBjb252ZXJ0KGVsLCBpbmRlbnQgPSAtQGluZGVudCkKKyAgICAgICAgc2VuZChESVNQQVRDSEVSW2VsLnR5cGVdLCBlbCwgaW5kZW50KQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJuIHRoZSBjb252ZXJ0ZWQgY29udGVudCBvZiB0aGUgY2hpbGRyZW4gb2YgK2VsKyBhcyBhIHN0cmluZy4gVGhlIHBhcmFtZXRlciAraW5kZW50KyBoYXMKKyAgICAgICMgdG8gYmUgdGhlIGFtb3VudCBvZiBpbmRlbnRhdGlvbiB1c2VkIGZvciB0aGUgZWxlbWVudCArZWwrLgorICAgICAgIworICAgICAgIyBQdXNoZXMgK2VsKyBvbnRvIHRoZSBAc3RhY2sgYmVmb3JlIGNvbnZlcnRpbmcgdGhlIGNoaWxkIGVsZW1lbnRzIGFuZCBwb3BzIGl0IGZyb20gdGhlIHN0YWNrCisgICAgICAjIGFmdGVyd2FyZHMuCisgICAgICBkZWYgaW5uZXIoZWwsIGluZGVudCkKKyAgICAgICAgcmVzdWx0ID0gJycKKyAgICAgICAgaW5kZW50ICs9IEBpbmRlbnQKKyAgICAgICAgQHN0YWNrLnB1c2goZWwpCisgICAgICAgIGVsLmNoaWxkcmVuLmVhY2ggZG8gfGlubmVyX2VsfAorICAgICAgICAgIHJlc3VsdCA8PCBzZW5kKERJU1BBVENIRVJbaW5uZXJfZWwudHlwZV0sIGlubmVyX2VsLCBpbmRlbnQpCisgICAgICAgIGVuZAorICAgICAgICBAc3RhY2sucG9wCisgICAgICAgIHJlc3VsdAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2JsYW5rKGVsLCBpbmRlbnQpCisgICAgICAgICJcbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF90ZXh0KGVsLCBpbmRlbnQpCisgICAgICAgIGVzY2FwZV9odG1sKGVsLnZhbHVlLCA6dGV4dCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9wKGVsLCBpbmRlbnQpCisgICAgICAgIGlmIGVsLm9wdGlvbnNbOnRyYW5zcGFyZW50XQorICAgICAgICAgIGlubmVyKGVsLCBpbmRlbnQpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBmb3JtYXRfYXNfYmxvY2tfaHRtbChlbC50eXBlLCBlbC5hdHRyLCBpbm5lcihlbCwgaW5kZW50KSwgaW5kZW50KQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9jb2RlYmxvY2soZWwsIGluZGVudCkKKyAgICAgICAgYXR0ciA9IGVsLmF0dHIuZHVwCisgICAgICAgIGxhbmcgPSBleHRyYWN0X2NvZGVfbGFuZ3VhZ2UhKGF0dHIpCisgICAgICAgIGhsX29wdHMgPSB7fQorICAgICAgICBoaWdobGlnaHRlZF9jb2RlID0gaGlnaGxpZ2h0X2NvZGUoZWwudmFsdWUsIGVsLm9wdGlvbnNbOmxhbmddIHx8IGxhbmcsIDpibG9jaywgaGxfb3B0cykKKworICAgICAgICBpZiBoaWdobGlnaHRlZF9jb2RlCisgICAgICAgICAgYWRkX3N5bnRheF9oaWdobGlnaHRlcl90b19jbGFzc19hdHRyKGF0dHIsIGxhbmcgfHwgaGxfb3B0c1s6ZGVmYXVsdF9sYW5nXSkKKyAgICAgICAgICAiI3snICcqaW5kZW50fTxkaXYje2h0bWxfYXR0cmlidXRlcyhhdHRyKX0+I3toaWdobGlnaHRlZF9jb2RlfSN7JyAnKmluZGVudH08L2Rpdj5cbiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlc3VsdCA9IGVzY2FwZV9odG1sKGVsLnZhbHVlKQorICAgICAgICAgIHJlc3VsdC5jaG9tcCEKKyAgICAgICAgICBpZiBlbC5hdHRyWydjbGFzcyddLnRvX3MgPX4gL1xic2hvdy13aGl0ZXNwYWNlc1xiLworICAgICAgICAgICAgcmVzdWx0LmdzdWIhKC8oPzooXlsgXHRdKyl8KFsgXHRdKyQpfChbIFx0XSspKS8pIGRvIHxtfAorICAgICAgICAgICAgICBzdWZmaXggPSAoJDEgPyAnLWwnIDogKCQyID8gJy1yJyA6ICcnKSkKKyAgICAgICAgICAgICAgbS5zY2FuKC8uLykubWFwIGRvIHxjfAorICAgICAgICAgICAgICAgIGNhc2UgYworICAgICAgICAgICAgICAgIHdoZW4gIlx0IiB0aGVuICI8c3BhbiBjbGFzcz1cIndzLXRhYiN7c3VmZml4fVwiPlx0PC9zcGFuPiIKKyAgICAgICAgICAgICAgICB3aGVuICIgIiB0aGVuICI8c3BhbiBjbGFzcz1cIndzLXNwYWNlI3tzdWZmaXh9XCI+JiM4OTAxOzwvc3Bhbj4iCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgIGVuZC5qb2luKCcnKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgICAgY29kZV9hdHRyID0ge30KKyAgICAgICAgICBjb2RlX2F0dHJbJ2NsYXNzJ10gPSAibGFuZ3VhZ2UtI3tsYW5nfSIgaWYgbGFuZworICAgICAgICAgICIjeycgJyppbmRlbnR9PHByZSN7aHRtbF9hdHRyaWJ1dGVzKGF0dHIpfT48Y29kZSN7aHRtbF9hdHRyaWJ1dGVzKGNvZGVfYXR0cil9PiN7cmVzdWx0fVxuPC9jb2RlPjwvcHJlPlxuIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9ibG9ja3F1b3RlKGVsLCBpbmRlbnQpCisgICAgICAgIGZvcm1hdF9hc19pbmRlbnRlZF9ibG9ja19odG1sKGVsLnR5cGUsIGVsLmF0dHIsIGlubmVyKGVsLCBpbmRlbnQpLCBpbmRlbnQpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfaGVhZGVyKGVsLCBpbmRlbnQpCisgICAgICAgIGF0dHIgPSBlbC5hdHRyLmR1cAorICAgICAgICBpZiBAb3B0aW9uc1s6YXV0b19pZHNdICYmICFhdHRyWydpZCddCisgICAgICAgICAgYXR0clsnaWQnXSA9IGdlbmVyYXRlX2lkKGVsLm9wdGlvbnNbOnJhd190ZXh0XSkKKyAgICAgICAgZW5kCisgICAgICAgIEB0b2MgPDwgW2VsLm9wdGlvbnNbOmxldmVsXSwgYXR0clsnaWQnXSwgZWwuY2hpbGRyZW5dIGlmIGF0dHJbJ2lkJ10gJiYgaW5fdG9jPyhlbCkKKyAgICAgICAgbGV2ZWwgPSBvdXRwdXRfaGVhZGVyX2xldmVsKGVsLm9wdGlvbnNbOmxldmVsXSkKKyAgICAgICAgZm9ybWF0X2FzX2Jsb2NrX2h0bWwoImgje2xldmVsfSIsIGF0dHIsIGlubmVyKGVsLCBpbmRlbnQpLCBpbmRlbnQpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfaHIoZWwsIGluZGVudCkKKyAgICAgICAgIiN7JyAnKmluZGVudH08aHIje2h0bWxfYXR0cmlidXRlcyhlbC5hdHRyKX0gLz5cbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF91bChlbCwgaW5kZW50KQorICAgICAgICBpZiAhQHRvY19jb2RlICYmIChlbC5vcHRpb25zWzppYWxdWzpyZWZzXS5pbmNsdWRlPygndG9jJykgcmVzY3VlIG5pbCkKKyAgICAgICAgICBAdG9jX2NvZGUgPSBbZWwudHlwZSwgZWwuYXR0ciwgKDAuLjEyOCkudG9fYS5tYXB7fGF8IHJhbmQoMzYpLnRvX3MoMzYpfS5qb2luXQorICAgICAgICAgIEB0b2NfY29kZS5sYXN0CisgICAgICAgIGVsc2lmICFAZm9vdG5vdGVfbG9jYXRpb24gJiYgZWwub3B0aW9uc1s6aWFsXSAmJiAoZWwub3B0aW9uc1s6aWFsXVs6cmVmc10gfHwgW10pLmluY2x1ZGU/KCdmb290bm90ZXMnKQorICAgICAgICAgIEBmb290bm90ZV9sb2NhdGlvbiA9ICgwLi4xMjgpLnRvX2EubWFwe3xhfCByYW5kKDM2KS50b19zKDM2KX0uam9pbgorICAgICAgICBlbHNlCisgICAgICAgICAgZm9ybWF0X2FzX2luZGVudGVkX2Jsb2NrX2h0bWwoZWwudHlwZSwgZWwuYXR0ciwgaW5uZXIoZWwsIGluZGVudCksIGluZGVudCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGFsaWFzIDpjb252ZXJ0X29sIDpjb252ZXJ0X3VsCisKKyAgICAgIGRlZiBjb252ZXJ0X2RsKGVsLCBpbmRlbnQpCisgICAgICAgIGZvcm1hdF9hc19pbmRlbnRlZF9ibG9ja19odG1sKGVsLnR5cGUsIGVsLmF0dHIsIGlubmVyKGVsLCBpbmRlbnQpLCBpbmRlbnQpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfbGkoZWwsIGluZGVudCkKKyAgICAgICAgb3V0cHV0ID0gJyAnKmluZGVudCA8PCAiPCN7ZWwudHlwZX0iIDw8IGh0bWxfYXR0cmlidXRlcyhlbC5hdHRyKSA8PCAiPiIKKyAgICAgICAgcmVzID0gaW5uZXIoZWwsIGluZGVudCkKKyAgICAgICAgaWYgZWwuY2hpbGRyZW4uZW1wdHk/IHx8IChlbC5jaGlsZHJlbi5maXJzdC50eXBlID09IDpwICYmIGVsLmNoaWxkcmVuLmZpcnN0Lm9wdGlvbnNbOnRyYW5zcGFyZW50XSkKKyAgICAgICAgICBvdXRwdXQgPDwgcmVzIDw8IChyZXMgPX4gL1xuXFovID8gJyAnKmluZGVudCA6ICcnKQorICAgICAgICBlbHNlCisgICAgICAgICAgb3V0cHV0IDw8ICJcbiIgPDwgcmVzIDw8ICcgJyppbmRlbnQKKyAgICAgICAgZW5kCisgICAgICAgIG91dHB1dCA8PCAiPC8je2VsLnR5cGV9PlxuIgorICAgICAgZW5kCisgICAgICBhbGlhcyA6Y29udmVydF9kZCA6Y29udmVydF9saQorCisgICAgICBkZWYgY29udmVydF9kdChlbCwgaW5kZW50KQorICAgICAgICBhdHRyID0gZWwuYXR0ci5kdXAKKyAgICAgICAgQHN0YWNrLmxhc3Qub3B0aW9uc1s6aWFsXVs6cmVmc10uZWFjaCBkbyB8cmVmfAorICAgICAgICAgIGlmIHJlZiA9fiAvXEFhdXRvX2lkcyg/Oi0oW1x3LV0rKSk/LworICAgICAgICAgICAgYXR0clsnaWQnXSA9ICgkMSA/ICQxIDogJycpIDw8IGJhc2ljX2dlbmVyYXRlX2lkKGVsLm9wdGlvbnNbOnJhd190ZXh0XSkKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZCBpZiAhYXR0clsnaWQnXSAmJiBAc3RhY2subGFzdC5vcHRpb25zWzppYWxdICYmIEBzdGFjay5sYXN0Lm9wdGlvbnNbOmlhbF1bOnJlZnNdCisgICAgICAgIGZvcm1hdF9hc19ibG9ja19odG1sKGVsLnR5cGUsIGF0dHIsIGlubmVyKGVsLCBpbmRlbnQpLCBpbmRlbnQpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfaHRtbF9lbGVtZW50KGVsLCBpbmRlbnQpCisgICAgICAgIHJlcyA9IGlubmVyKGVsLCBpbmRlbnQpCisgICAgICAgIGlmIGVsLm9wdGlvbnNbOmNhdGVnb3J5XSA9PSA6c3BhbgorICAgICAgICAgICI8I3tlbC52YWx1ZX0je2h0bWxfYXR0cmlidXRlcyhlbC5hdHRyKX0iIDw8IChyZXMuZW1wdHk/ICYmIEhUTUxfRUxFTUVOVFNfV0lUSE9VVF9CT0RZLmluY2x1ZGU/KGVsLnZhbHVlKSA/ICIgLz4iIDogIj4je3Jlc308LyN7ZWwudmFsdWV9PiIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBvdXRwdXQgPSAnJworICAgICAgICAgIG91dHB1dCA8PCAnICcqaW5kZW50IGlmIEBzdGFjay5sYXN0LnR5cGUgIT0gOmh0bWxfZWxlbWVudCB8fCBAc3RhY2subGFzdC5vcHRpb25zWzpjb250ZW50X21vZGVsXSAhPSA6cmF3CisgICAgICAgICAgb3V0cHV0IDw8ICI8I3tlbC52YWx1ZX0je2h0bWxfYXR0cmlidXRlcyhlbC5hdHRyKX0iCisgICAgICAgICAgaWYgZWwub3B0aW9uc1s6aXNfY2xvc2VkXSAmJiBlbC5vcHRpb25zWzpjb250ZW50X21vZGVsXSA9PSA6cmF3CisgICAgICAgICAgICBvdXRwdXQgPDwgIiAvPiIKKyAgICAgICAgICBlbHNpZiAhcmVzLmVtcHR5PyAmJiBlbC5vcHRpb25zWzpjb250ZW50X21vZGVsXSAhPSA6YmxvY2sKKyAgICAgICAgICAgIG91dHB1dCA8PCAiPiN7cmVzfTwvI3tlbC52YWx1ZX0+IgorICAgICAgICAgIGVsc2lmICFyZXMuZW1wdHk/CisgICAgICAgICAgICBvdXRwdXQgPDwgIj5cbiN7cmVzLmNob21wfVxuIiAgPDwgJyAnKmluZGVudCA8PCAiPC8je2VsLnZhbHVlfT4iCisgICAgICAgICAgZWxzaWYgSFRNTF9FTEVNRU5UU19XSVRIT1VUX0JPRFkuaW5jbHVkZT8oZWwudmFsdWUpCisgICAgICAgICAgICBvdXRwdXQgPDwgIiAvPiIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXRwdXQgPDwgIj48LyN7ZWwudmFsdWV9PiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBvdXRwdXQgPDwgIlxuIiBpZiBAc3RhY2subGFzdC50eXBlICE9IDpodG1sX2VsZW1lbnQgfHwgQHN0YWNrLmxhc3Qub3B0aW9uc1s6Y29udGVudF9tb2RlbF0gIT0gOnJhdworICAgICAgICAgIG91dHB1dAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF94bWxfY29tbWVudChlbCwgaW5kZW50KQorICAgICAgICBpZiBlbC5vcHRpb25zWzpjYXRlZ29yeV0gPT0gOmJsb2NrICYmIChAc3RhY2subGFzdC50eXBlICE9IDpodG1sX2VsZW1lbnQgfHwgQHN0YWNrLmxhc3Qub3B0aW9uc1s6Y29udGVudF9tb2RlbF0gIT0gOnJhdykKKyAgICAgICAgICAnICcqaW5kZW50IDw8IGVsLnZhbHVlIDw8ICJcbiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVsLnZhbHVlCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBhbGlhcyA6Y29udmVydF94bWxfcGkgOmNvbnZlcnRfeG1sX2NvbW1lbnQKKworICAgICAgZGVmIGNvbnZlcnRfdGFibGUoZWwsIGluZGVudCkKKyAgICAgICAgZm9ybWF0X2FzX2luZGVudGVkX2Jsb2NrX2h0bWwoZWwudHlwZSwgZWwuYXR0ciwgaW5uZXIoZWwsIGluZGVudCksIGluZGVudCkKKyAgICAgIGVuZAorICAgICAgYWxpYXMgOmNvbnZlcnRfdGhlYWQgOmNvbnZlcnRfdGFibGUKKyAgICAgIGFsaWFzIDpjb252ZXJ0X3Rib2R5IDpjb252ZXJ0X3RhYmxlCisgICAgICBhbGlhcyA6Y29udmVydF90Zm9vdCA6Y29udmVydF90YWJsZQorICAgICAgYWxpYXMgOmNvbnZlcnRfdHIgIDpjb252ZXJ0X3RhYmxlCisKKyAgICAgIEVOVElUWV9OQlNQID0gOjpLcmFtZG93bjo6VXRpbHM6OkVudGl0aWVzLmVudGl0eSgnbmJzcCcpICMgOm5vZG9jOgorCisgICAgICBkZWYgY29udmVydF90ZChlbCwgaW5kZW50KQorICAgICAgICByZXMgPSBpbm5lcihlbCwgaW5kZW50KQorICAgICAgICB0eXBlID0gKEBzdGFja1stMl0udHlwZSA9PSA6dGhlYWQgPyA6dGggOiA6dGQpCisgICAgICAgIGF0dHIgPSBlbC5hdHRyCisgICAgICAgIGFsaWdubWVudCA9IEBzdGFja1stM10ub3B0aW9uc1s6YWxpZ25tZW50XVtAc3RhY2subGFzdC5jaGlsZHJlbi5pbmRleChlbCldCisgICAgICAgIGlmIGFsaWdubWVudCAhPSA6ZGVmYXVsdAorICAgICAgICAgIGF0dHIgPSBlbC5hdHRyLmR1cAorICAgICAgICAgIGF0dHJbJ3N0eWxlJ10gPSAoYXR0ci5oYXNfa2V5Pygnc3R5bGUnKSA/ICIje2F0dHJbJ3N0eWxlJ119OyAiOiAnJykgPDwgInRleHQtYWxpZ246ICN7YWxpZ25tZW50fSIKKyAgICAgICAgZW5kCisgICAgICAgIGZvcm1hdF9hc19ibG9ja19odG1sKHR5cGUsIGF0dHIsIHJlcy5lbXB0eT8gPyBlbnRpdHlfdG9fc3RyKEVOVElUWV9OQlNQKSA6IHJlcywgaW5kZW50KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2NvbW1lbnQoZWwsIGluZGVudCkKKyAgICAgICAgaWYgZWwub3B0aW9uc1s6Y2F0ZWdvcnldID09IDpibG9jaworICAgICAgICAgICIjeycgJyppbmRlbnR9PCEtLSAje2VsLnZhbHVlfSAtLT5cbiIKKyAgICAgICAgZWxzZQorICAgICAgICAgICI8IS0tICN7ZWwudmFsdWV9IC0tPiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfYnIoZWwsIGluZGVudCkKKyAgICAgICAgIjxiciAvPiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9hKGVsLCBpbmRlbnQpCisgICAgICAgIGZvcm1hdF9hc19zcGFuX2h0bWwoZWwudHlwZSwgZWwuYXR0ciwgaW5uZXIoZWwsIGluZGVudCkpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfaW1nKGVsLCBpbmRlbnQpCisgICAgICAgICI8aW1nI3todG1sX2F0dHJpYnV0ZXMoZWwuYXR0cil9IC8+IgorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2NvZGVzcGFuKGVsLCBpbmRlbnQpCisgICAgICAgIGF0dHIgPSBlbC5hdHRyLmR1cAorICAgICAgICBsYW5nID0gZXh0cmFjdF9jb2RlX2xhbmd1YWdlKGF0dHIpCisgICAgICAgIGhsX29wdHMgPSB7fQorICAgICAgICByZXN1bHQgPSBoaWdobGlnaHRfY29kZShlbC52YWx1ZSwgbGFuZywgOnNwYW4sIGhsX29wdHMpCisgICAgICAgIGlmIHJlc3VsdAorICAgICAgICAgIGFkZF9zeW50YXhfaGlnaGxpZ2h0ZXJfdG9fY2xhc3NfYXR0cihhdHRyLCBobF9vcHRzWzpkZWZhdWx0X2xhbmddKQorICAgICAgICBlbHNlCisgICAgICAgICAgcmVzdWx0ID0gZXNjYXBlX2h0bWwoZWwudmFsdWUpCisgICAgICAgIGVuZAorCisgICAgICAgIGZvcm1hdF9hc19zcGFuX2h0bWwoJ2NvZGUnLCBhdHRyLCByZXN1bHQpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfZm9vdG5vdGUoZWwsIGluZGVudCkKKyAgICAgICAgcmVwZWF0ID0gJycKKyAgICAgICAgaWYgKGZvb3Rub3RlID0gQGZvb3Rub3Rlc19ieV9uYW1lW2VsLm9wdGlvbnNbOm5hbWVdXSkKKyAgICAgICAgICBudW1iZXIgPSBmb290bm90ZVsyXQorICAgICAgICAgIHJlcGVhdCA9ICI6I3tmb290bm90ZVszXSArPSAxfSIKKyAgICAgICAgZWxzZQorICAgICAgICAgIG51bWJlciA9IEBmb290bm90ZV9jb3VudGVyCisgICAgICAgICAgQGZvb3Rub3RlX2NvdW50ZXIgKz0gMQorICAgICAgICAgIEBmb290bm90ZXMgPDwgW2VsLm9wdGlvbnNbOm5hbWVdLCBlbC52YWx1ZSwgbnVtYmVyLCAwXQorICAgICAgICAgIEBmb290bm90ZXNfYnlfbmFtZVtlbC5vcHRpb25zWzpuYW1lXV0gPSBAZm9vdG5vdGVzLmxhc3QKKyAgICAgICAgZW5kCisgICAgICAgICI8c3VwIGlkPVwiZm5yZWY6I3tlbC5vcHRpb25zWzpuYW1lXX0je3JlcGVhdH1cIj48YSBocmVmPVwiI2ZuOiN7ZWwub3B0aW9uc1s6bmFtZV19XCIgY2xhc3M9XCJmb290bm90ZVwiPiN7bnVtYmVyfTwvYT48L3N1cD4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfcmF3KGVsLCBpbmRlbnQpCisgICAgICAgIGlmICFlbC5vcHRpb25zWzp0eXBlXSB8fCBlbC5vcHRpb25zWzp0eXBlXS5lbXB0eT8gfHwgZWwub3B0aW9uc1s6dHlwZV0uaW5jbHVkZT8oJ2h0bWwnKQorICAgICAgICAgIGVsLnZhbHVlICsgKGVsLm9wdGlvbnNbOmNhdGVnb3J5XSA9PSA6YmxvY2sgPyAiXG4iIDogJycpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAnJworICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9lbShlbCwgaW5kZW50KQorICAgICAgICBmb3JtYXRfYXNfc3Bhbl9odG1sKGVsLnR5cGUsIGVsLmF0dHIsIGlubmVyKGVsLCBpbmRlbnQpKQorICAgICAgZW5kCisgICAgICBhbGlhcyA6Y29udmVydF9zdHJvbmcgOmNvbnZlcnRfZW0KKworICAgICAgZGVmIGNvbnZlcnRfZW50aXR5KGVsLCBpbmRlbnQpCisgICAgICAgIGVudGl0eV90b19zdHIoZWwudmFsdWUsIGVsLm9wdGlvbnNbOm9yaWdpbmFsXSkKKyAgICAgIGVuZAorCisgICAgICBUWVBPR1JBUEhJQ19TWU1TID0geworICAgICAgICA6bWRhc2ggPT4gWzo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ21kYXNoJyldLAorICAgICAgICA6bmRhc2ggPT4gWzo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ25kYXNoJyldLAorICAgICAgICA6aGVsbGlwID0+IFs6OktyYW1kb3duOjpVdGlsczo6RW50aXRpZXMuZW50aXR5KCdoZWxsaXAnKV0sCisgICAgICAgIDpsYXF1b19zcGFjZSA9PiBbOjpLcmFtZG93bjo6VXRpbHM6OkVudGl0aWVzLmVudGl0eSgnbGFxdW8nKSwgOjpLcmFtZG93bjo6VXRpbHM6OkVudGl0aWVzLmVudGl0eSgnbmJzcCcpXSwKKyAgICAgICAgOnJhcXVvX3NwYWNlID0+IFs6OktyYW1kb3duOjpVdGlsczo6RW50aXRpZXMuZW50aXR5KCduYnNwJyksIDo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ3JhcXVvJyldLAorICAgICAgICA6bGFxdW8gPT4gWzo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ2xhcXVvJyldLAorICAgICAgICA6cmFxdW8gPT4gWzo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ3JhcXVvJyldCisgICAgICB9ICMgOm5vZG9jOgorICAgICAgZGVmIGNvbnZlcnRfdHlwb2dyYXBoaWNfc3ltKGVsLCBpbmRlbnQpCisgICAgICAgIFRZUE9HUkFQSElDX1NZTVNbZWwudmFsdWVdLm1hcCB7fGV8IGVudGl0eV90b19zdHIoZSl9LmpvaW4oJycpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfc21hcnRfcXVvdGUoZWwsIGluZGVudCkKKyAgICAgICAgZW50aXR5X3RvX3N0cihzbWFydF9xdW90ZV9lbnRpdHkoZWwpKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X21hdGgoZWwsIGluZGVudCkKKyAgICAgICAgaWYgKHJlc3VsdCA9IGZvcm1hdF9tYXRoKGVsLCA6aW5kZW50ID0+IGluZGVudCkpCisgICAgICAgICAgcmVzdWx0CisgICAgICAgIGVsc2UKKyAgICAgICAgICBhdHRyID0gZWwuYXR0ci5kdXAKKyAgICAgICAgICAoYXR0clsnY2xhc3MnXSA9IChhdHRyWydjbGFzcyddIHx8ICcnKSA8PCAiIGtkbWF0aCIpLmxzdHJpcCEKKyAgICAgICAgICBpZiBlbC5vcHRpb25zWzpjYXRlZ29yeV0gPT0gOmJsb2NrCisgICAgICAgICAgICBmb3JtYXRfYXNfYmxvY2tfaHRtbCgnZGl2JywgYXR0ciwgIiQkXG4je2VsLnZhbHVlfVxuJCQiLCBpbmRlbnQpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9ybWF0X2FzX3NwYW5faHRtbCgnc3BhbicsIGF0dHIsICIkI3tlbC52YWx1ZX0kIikKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfYWJicmV2aWF0aW9uKGVsLCBpbmRlbnQpCisgICAgICAgIHRpdGxlID0gQHJvb3Qub3B0aW9uc1s6YWJicmV2X2RlZnNdW2VsLnZhbHVlXQorICAgICAgICBhdHRyID0gQHJvb3Qub3B0aW9uc1s6YWJicmV2X2F0dHJdW2VsLnZhbHVlXS5kdXAKKyAgICAgICAgYXR0clsndGl0bGUnXSA9IHRpdGxlIHVubGVzcyB0aXRsZS5lbXB0eT8KKyAgICAgICAgZm9ybWF0X2FzX3NwYW5faHRtbCgiYWJiciIsIGF0dHIsIGVsLnZhbHVlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3Jvb3QoZWwsIGluZGVudCkKKyAgICAgICAgcmVzdWx0ID0gaW5uZXIoZWwsIGluZGVudCkKKyAgICAgICAgaWYgQGZvb3Rub3RlX2xvY2F0aW9uCisgICAgICAgICAgcmVzdWx0LnN1YiEoLyN7QGZvb3Rub3RlX2xvY2F0aW9ufS8sIGZvb3Rub3RlX2NvbnRlbnQuZ3N1YigvXFwvLCAiXFxcXFxcXFwiKSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlc3VsdCA8PCBmb290bm90ZV9jb250ZW50CisgICAgICAgIGVuZAorICAgICAgICBpZiBAdG9jX2NvZGUKKyAgICAgICAgICB0b2NfdHJlZSA9IGdlbmVyYXRlX3RvY190cmVlKEB0b2MsIEB0b2NfY29kZVswXSwgQHRvY19jb2RlWzFdIHx8IHt9KQorICAgICAgICAgIHRleHQgPSBpZiB0b2NfdHJlZS5jaGlsZHJlbi5zaXplID4gMAorICAgICAgICAgICAgICAgICAgIGNvbnZlcnQodG9jX3RyZWUsIDApCisgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAnJworICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICByZXN1bHQuc3ViISgvI3tAdG9jX2NvZGUubGFzdH0vLCB0ZXh0LmdzdWIoL1xcLywgIlxcXFxcXFxcIikpCisgICAgICAgIGVuZAorICAgICAgICByZXN1bHQKKyAgICAgIGVuZAorCisgICAgICAjIEZvcm1hdCB0aGUgZ2l2ZW4gZWxlbWVudCBhcyBzcGFuIEhUTUwuCisgICAgICBkZWYgZm9ybWF0X2FzX3NwYW5faHRtbChuYW1lLCBhdHRyLCBib2R5KQorICAgICAgICAiPCN7bmFtZX0je2h0bWxfYXR0cmlidXRlcyhhdHRyKX0+I3tib2R5fTwvI3tuYW1lfT4iCisgICAgICBlbmQKKworICAgICAgIyBGb3JtYXQgdGhlIGdpdmVuIGVsZW1lbnQgYXMgYmxvY2sgSFRNTC4KKyAgICAgIGRlZiBmb3JtYXRfYXNfYmxvY2tfaHRtbChuYW1lLCBhdHRyLCBib2R5LCBpbmRlbnQpCisgICAgICAgICIjeycgJyppbmRlbnR9PCN7bmFtZX0je2h0bWxfYXR0cmlidXRlcyhhdHRyKX0+I3tib2R5fTwvI3tuYW1lfT5cbiIKKyAgICAgIGVuZAorCisgICAgICAjIEZvcm1hdCB0aGUgZ2l2ZW4gZWxlbWVudCBhcyBibG9jayBIVE1MIHdpdGggYSBuZXdsaW5lIGFmdGVyIHRoZSBzdGFydCB0YWcgYW5kIGluZGVudGF0aW9uCisgICAgICAjIGJlZm9yZSB0aGUgZW5kIHRhZy4KKyAgICAgIGRlZiBmb3JtYXRfYXNfaW5kZW50ZWRfYmxvY2tfaHRtbChuYW1lLCBhdHRyLCBib2R5LCBpbmRlbnQpCisgICAgICAgICIjeycgJyppbmRlbnR9PCN7bmFtZX0je2h0bWxfYXR0cmlidXRlcyhhdHRyKX0+XG4je2JvZHl9I3snICcqaW5kZW50fTwvI3tuYW1lfT5cbiIKKyAgICAgIGVuZAorCisgICAgICAjIEFkZCB0aGUgc3ludGF4IGhpZ2hsaWdodGVyIG5hbWUgdG8gdGhlICdjbGFzcycgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaGFzaC4gQW5kCisgICAgICAjIG92ZXJ3cml0ZXMgb3IgYWRkIGEgImxhbmd1YWdlLUxBTkciIHBhcnQgdXNpbmcgdGhlICtsYW5nKyBwYXJhbWV0ZXIgaWYgK2xhbmcrIGlzIG5vdCBuaWwuCisgICAgICBkZWYgYWRkX3N5bnRheF9oaWdobGlnaHRlcl90b19jbGFzc19hdHRyKGF0dHIsIGxhbmcgPSBuaWwpCisgICAgICAgIChhdHRyWydjbGFzcyddID0gKGF0dHJbJ2NsYXNzJ10gfHwgJycpICsgIiBoaWdobGlnaHRlci0je0BvcHRpb25zWzpzeW50YXhfaGlnaGxpZ2h0ZXJdfSIpLmxzdHJpcCEKKyAgICAgICAgYXR0clsnY2xhc3MnXS5zdWIhKC9cYmxhbmd1YWdlLVxTK3woXikvKSB7ICJsYW5ndWFnZS0je2xhbmd9I3skMSA/ICcgJyA6ICcnfSIgfSBpZiBsYW5nCisgICAgICBlbmQKKworICAgICAgIyBHZW5lcmF0ZSBhbmQgcmV0dXJuIGFuIGVsZW1lbnQgdHJlZSBmb3IgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLgorICAgICAgZGVmIGdlbmVyYXRlX3RvY190cmVlKHRvYywgdHlwZSwgYXR0cikKKyAgICAgICAgc2VjdGlvbnMgPSBFbGVtZW50Lm5ldyh0eXBlLCBuaWwsIGF0dHIpCisgICAgICAgIHNlY3Rpb25zLmF0dHJbJ2lkJ10gfHw9ICdtYXJrZG93bi10b2MnCisgICAgICAgIHN0YWNrID0gW10KKyAgICAgICAgdG9jLmVhY2ggZG8gfGxldmVsLCBpZCwgY2hpbGRyZW58CisgICAgICAgICAgbGkgPSBFbGVtZW50Lm5ldyg6bGksIG5pbCwgbmlsLCB7OmxldmVsID0+IGxldmVsfSkKKyAgICAgICAgICBsaS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6cCwgbmlsLCBuaWwsIHs6dHJhbnNwYXJlbnQgPT4gdHJ1ZX0pCisgICAgICAgICAgYSA9IEVsZW1lbnQubmV3KDphLCBuaWwpCisgICAgICAgICAgYS5hdHRyWydocmVmJ10gPSAiIyN7aWR9IgorICAgICAgICAgIGEuYXR0clsnaWQnXSA9ICIje3NlY3Rpb25zLmF0dHJbJ2lkJ119LSN7aWR9IgorICAgICAgICAgIGEuY2hpbGRyZW4uY29uY2F0KHJlbW92ZV9mb290bm90ZXMoTWFyc2hhbC5sb2FkKE1hcnNoYWwuZHVtcChjaGlsZHJlbikpKSkKKyAgICAgICAgICBsaS5jaGlsZHJlbi5sYXN0LmNoaWxkcmVuIDw8IGEKKyAgICAgICAgICBsaS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyh0eXBlKQorCisgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlCisgICAgICAgICAgd2hpbGUgIXN1Y2Nlc3MKKyAgICAgICAgICAgIGlmIHN0YWNrLmVtcHR5PworICAgICAgICAgICAgICBzZWN0aW9ucy5jaGlsZHJlbiA8PCBsaQorICAgICAgICAgICAgICBzdGFjayA8PCBsaQorICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZQorICAgICAgICAgICAgZWxzaWYgc3RhY2subGFzdC5vcHRpb25zWzpsZXZlbF0gPCBsaS5vcHRpb25zWzpsZXZlbF0KKyAgICAgICAgICAgICAgc3RhY2subGFzdC5jaGlsZHJlbi5sYXN0LmNoaWxkcmVuIDw8IGxpCisgICAgICAgICAgICAgIHN0YWNrIDw8IGxpCisgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGl0ZW0gPSBzdGFjay5wb3AKKyAgICAgICAgICAgICAgaXRlbS5jaGlsZHJlbi5wb3AgdW5sZXNzIGl0ZW0uY2hpbGRyZW4ubGFzdC5jaGlsZHJlbi5zaXplID4gMAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICB3aGlsZSAhc3RhY2suZW1wdHk/CisgICAgICAgICAgaXRlbSA9IHN0YWNrLnBvcAorICAgICAgICAgIGl0ZW0uY2hpbGRyZW4ucG9wIHVubGVzcyBpdGVtLmNoaWxkcmVuLmxhc3QuY2hpbGRyZW4uc2l6ZSA+IDAKKyAgICAgICAgZW5kCisgICAgICAgIHNlY3Rpb25zCisgICAgICBlbmQKKworICAgICAgIyBSZW1vdmUgYWxsIGZvb3Rub3RlcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50cy4KKyAgICAgIGRlZiByZW1vdmVfZm9vdG5vdGVzKGVsZW1lbnRzKQorICAgICAgICBlbGVtZW50cy5kZWxldGVfaWYgZG8gfGN8CisgICAgICAgICAgcmVtb3ZlX2Zvb3Rub3RlcyhjLmNoaWxkcmVuKQorICAgICAgICAgIGMudHlwZSA9PSA6Zm9vdG5vdGUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBPYmZ1c2NhdGUgdGhlICt0ZXh0KyBieSB1c2luZyBIVE1MIGVudGl0aWVzLgorICAgICAgZGVmIG9iZnVzY2F0ZSh0ZXh0KQorICAgICAgICByZXN1bHQgPSAiIgorICAgICAgICB0ZXh0LmVhY2hfYnl0ZSBkbyB8YnwKKyAgICAgICAgICByZXN1bHQgPDwgKGIgPiAxMjggPyBiLmNociA6ICImIyUwM2Q7IiAlIGIpCisgICAgICAgIGVuZAorICAgICAgICByZXN1bHQuZm9yY2VfZW5jb2RpbmcodGV4dC5lbmNvZGluZykgaWYgcmVzdWx0LnJlc3BvbmRfdG8/KDpmb3JjZV9lbmNvZGluZykKKyAgICAgICAgcmVzdWx0CisgICAgICBlbmQKKworICAgICAgRk9PVE5PVEVfQkFDS0xJTktfRk1UID0gIiVzPGEgaHJlZj1cIiNmbnJlZjolc1wiIGNsYXNzPVwicmV2ZXJzZWZvb3Rub3RlXCI+JXM8L2E+IgorCisgICAgICAjIFJldHVybiBhIEhUTUwgb3JkZXJlZCBsaXN0IHdpdGggdGhlIGZvb3Rub3RlIGNvbnRlbnQgZm9yIHRoZSB1c2VkIGZvb3Rub3Rlcy4KKyAgICAgIGRlZiBmb290bm90ZV9jb250ZW50CisgICAgICAgIG9sID0gRWxlbWVudC5uZXcoOm9sKQorICAgICAgICBvbC5hdHRyWydzdGFydCddID0gQGZvb3Rub3RlX3N0YXJ0IGlmIEBmb290bm90ZV9zdGFydCAhPSAxCisgICAgICAgIGkgPSAwCisgICAgICAgIGJhY2tsaW5rX3RleHQgPSBlc2NhcGVfaHRtbChAb3B0aW9uc1s6Zm9vdG5vdGVfYmFja2xpbmtdLCA6dGV4dCkKKyAgICAgICAgd2hpbGUgaSA8IEBmb290bm90ZXMubGVuZ3RoCisgICAgICAgICAgbmFtZSwgZGF0YSwgXywgcmVwZWF0ID0gKkBmb290bm90ZXNbaV0KKyAgICAgICAgICBsaSA9IEVsZW1lbnQubmV3KDpsaSwgbmlsLCB7J2lkJyA9PiAiZm46I3tuYW1lfSJ9KQorICAgICAgICAgIGxpLmNoaWxkcmVuID0gTWFyc2hhbC5sb2FkKE1hcnNoYWwuZHVtcChkYXRhLmNoaWxkcmVuKSkKKworICAgICAgICAgIGlmIGxpLmNoaWxkcmVuLmxhc3QudHlwZSA9PSA6cAorICAgICAgICAgICAgcGFyYSA9IGxpLmNoaWxkcmVuLmxhc3QKKyAgICAgICAgICAgIGluc2VydF9zcGFjZSA9IHRydWUKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBsaS5jaGlsZHJlbiA8PCAocGFyYSA9IEVsZW1lbnQubmV3KDpwKSkKKyAgICAgICAgICAgIGluc2VydF9zcGFjZSA9IGZhbHNlCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICB1bmxlc3MgQG9wdGlvbnNbOmZvb3Rub3RlX2JhY2tsaW5rXS5lbXB0eT8KKyAgICAgICAgICAgIHBhcmEuY2hpbGRyZW4gPDwgRWxlbWVudC5uZXcoOnJhdywgRk9PVE5PVEVfQkFDS0xJTktfRk1UICUgW2luc2VydF9zcGFjZSA/ICcmbmJzcDsnIDogJycsIG5hbWUsIGJhY2tsaW5rX3RleHRdKQorICAgICAgICAgICAgKDEuLnJlcGVhdCkuZWFjaCBkbyB8aW5kZXh8CisgICAgICAgICAgICAgIHBhcmEuY2hpbGRyZW4gPDwgRWxlbWVudC5uZXcoOnJhdywgRk9PVE5PVEVfQkFDS0xJTktfRk1UICUgWyImbmJzcDsiLCAiI3tuYW1lfToje2luZGV4fSIsICIje2JhY2tsaW5rX3RleHR9PHN1cD4je2luZGV4KzF9PC9zdXA+Il0pCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIG9sLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDpyYXcsIGNvbnZlcnQobGksIDQpKQorICAgICAgICAgIGkgKz0gMQorICAgICAgICBlbmQKKyAgICAgICAgKG9sLmNoaWxkcmVuLmVtcHR5PyA/ICcnIDogZm9ybWF0X2FzX2luZGVudGVkX2Jsb2NrX2h0bWwoJ2RpdicsIHs6Y2xhc3MgPT4gImZvb3Rub3RlcyJ9LCBjb252ZXJ0KG9sLCAyKSwgMCkpCisgICAgICBlbmQKKworICAgIGVuZAorCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9rcmFtZG93bi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL2tyYW1kb3duLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NWUwNTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9rcmFtZG93bi5yYgpAQCAtMCwwICsxLDQzNyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdrcmFtZG93bi9jb252ZXJ0ZXInCityZXF1aXJlICdrcmFtZG93bi91dGlscycKKworbW9kdWxlIEtyYW1kb3duCisKKyAgbW9kdWxlIENvbnZlcnRlcgorCisgICAgIyBDb252ZXJ0cyBhbiBlbGVtZW50IHRyZWUgdG8gdGhlIGtyYW1kb3duIGZvcm1hdC4KKyAgICBjbGFzcyBLcmFtZG93biA8IEJhc2UKKworICAgICAgIyA6c3RvcGRvYzoKKworICAgICAgaW5jbHVkZSA6OktyYW1kb3duOjpVdGlsczo6SHRtbAorCisgICAgICBkZWYgaW5pdGlhbGl6ZShyb290LCBvcHRpb25zKQorICAgICAgICBzdXBlcgorICAgICAgICBAbGlua3JlZnMgPSBbXQorICAgICAgICBAZm9vdG5vdGVzID0gW10KKyAgICAgICAgQGFiYnJldnMgPSBbXQorICAgICAgICBAc3RhY2sgPSBbXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0KGVsLCBvcHRzID0gezppbmRlbnQgPT4gMH0pCisgICAgICAgIHJlcyA9IHNlbmQoImNvbnZlcnRfI3tlbC50eXBlfSIsIGVsLCBvcHRzKQorICAgICAgICBpZiAhWzpodG1sX2VsZW1lbnQsIDpsaSwgOmR0LCA6ZGQsIDp0ZF0uaW5jbHVkZT8oZWwudHlwZSkgJiYgKGlhbCA9IGlhbF9mb3JfZWxlbWVudChlbCkpCisgICAgICAgICAgcmVzIDw8IGlhbAorICAgICAgICAgIHJlcyA8PCAiXG5cbiIgaWYgRWxlbWVudC5jYXRlZ29yeShlbCkgPT0gOmJsb2NrCisgICAgICAgIGVsc2lmIFs6dWwsIDpkbCwgOm9sLCA6Y29kZWJsb2NrXS5pbmNsdWRlPyhlbC50eXBlKSAmJiBvcHRzWzpuZXh0XSAmJgorICAgICAgICAgICAgKFtlbC50eXBlLCA6Y29kZWJsb2NrXS5pbmNsdWRlPyhvcHRzWzpuZXh0XS50eXBlKSB8fAorICAgICAgICAgICAgIChvcHRzWzpuZXh0XS50eXBlID09IDpibGFuayAmJiBvcHRzWzpubmV4dF0gJiYgW2VsLnR5cGUsIDpjb2RlYmxvY2tdLmluY2x1ZGU/KG9wdHNbOm5uZXh0XS50eXBlKSkpCisgICAgICAgICAgcmVzIDw8ICJeXG5cbiIKKyAgICAgICAgZWxzaWYgRWxlbWVudC5jYXRlZ29yeShlbCkgPT0gOmJsb2NrICYmCisgICAgICAgICAgICAhWzpsaSwgOmRkLCA6ZHQsIDp0ZCwgOnRoLCA6dHIsIDp0aGVhZCwgOnRib2R5LCA6dGZvb3QsIDpibGFua10uaW5jbHVkZT8oZWwudHlwZSkgJiYKKyAgICAgICAgICAgIChlbC50eXBlICE9IDpodG1sX2VsZW1lbnQgfHwgQHN0YWNrLmxhc3QudHlwZSAhPSA6aHRtbF9lbGVtZW50KSAmJgorICAgICAgICAgICAgKGVsLnR5cGUgIT0gOnAgfHwgIWVsLm9wdGlvbnNbOnRyYW5zcGFyZW50XSkKKyAgICAgICAgICByZXMgPDwgIlxuIgorICAgICAgICBlbmQKKyAgICAgICAgcmVzCisgICAgICBlbmQKKworICAgICAgZGVmIGlubmVyKGVsLCBvcHRzID0gezppbmRlbnQgPT4gMH0pCisgICAgICAgIEBzdGFjay5wdXNoKGVsKQorICAgICAgICByZXN1bHQgPSAnJworICAgICAgICBlbC5jaGlsZHJlbi5lYWNoX3dpdGhfaW5kZXggZG8gfGlubmVyX2VsLCBpbmRleHwKKyAgICAgICAgICBvcHRpb25zID0gb3B0cy5kdXAKKyAgICAgICAgICBvcHRpb25zWzppbmRleF0gPSBpbmRleAorICAgICAgICAgIG9wdGlvbnNbOnByZXZdID0gKGluZGV4ID09IDAgPyBuaWwgOiBlbC5jaGlsZHJlbltpbmRleC0xXSkKKyAgICAgICAgICBvcHRpb25zWzpwcHJldl0gPSAoaW5kZXggPD0gMSA/IG5pbCA6IGVsLmNoaWxkcmVuW2luZGV4LTJdKQorICAgICAgICAgIG9wdGlvbnNbOm5leHRdID0gKGluZGV4ID09IGVsLmNoaWxkcmVuLmxlbmd0aCAtIDEgPyBuaWwgOiBlbC5jaGlsZHJlbltpbmRleCsxXSkKKyAgICAgICAgICBvcHRpb25zWzpubmV4dF0gPSAoaW5kZXggPj0gZWwuY2hpbGRyZW4ubGVuZ3RoIC0gMiA/IG5pbCA6IGVsLmNoaWxkcmVuW2luZGV4KzJdKQorICAgICAgICAgIHJlc3VsdCA8PCBjb252ZXJ0KGlubmVyX2VsLCBvcHRpb25zKQorICAgICAgICBlbmQKKyAgICAgICAgQHN0YWNrLnBvcAorICAgICAgICByZXN1bHQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9ibGFuayhlbCwgb3B0cykKKyAgICAgICAgIiIKKyAgICAgIGVuZAorCisgICAgICBFU0NBUEVEX0NIQVJfUkUgPSAvKFwkXCR8W1xcKl9gXFtcXVx7Iid8XSl8XlsgXXswLDN9KDopLworCisgICAgICBkZWYgY29udmVydF90ZXh0KGVsLCBvcHRzKQorICAgICAgICBpZiBvcHRzWzpyYXdfdGV4dF0KKyAgICAgICAgICBlbC52YWx1ZQorICAgICAgICBlbHNlCisgICAgICAgICAgZWwudmFsdWUuZ3N1YigvXEFcbi8pIGRvCisgICAgICAgICAgICBvcHRzWzpwcmV2XSAmJiBvcHRzWzpwcmV2XS50eXBlID09IDpiciA/ICcnIDogIlxuIgorICAgICAgICAgIGVuZC5nc3ViKC9ccysvLCAnICcpLmdzdWIoRVNDQVBFRF9DSEFSX1JFKSB7ICJcXCN7JDEgfHwgJDJ9IiB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3AoZWwsIG9wdHMpCisgICAgICAgIHcgPSBAb3B0aW9uc1s6bGluZV93aWR0aF0gLSBvcHRzWzppbmRlbnRdLnRvX3MudG9faQorICAgICAgICBmaXJzdCwgc2Vjb25kLCAqcmVzdCA9IGlubmVyKGVsLCBvcHRzKS5zdHJpcC5nc3ViKC8oLnsxLCN7d319KSggK3wkXG4/KS8sICJcXDFcbiIpLnNwbGl0KC9cbi8pCisgICAgICAgIGZpcnN0LmdzdWIhKC9eKD86KCN8Pil8KFxkKylcLnwoWystXVxzKSkvKSB7ICQxIHx8ICQzID8gIlxcI3skMSB8fCAkM30iIDogIiN7JDJ9XFwuIn0gaWYgZmlyc3QKKyAgICAgICAgc2Vjb25kLmdzdWIhKC9eKFs9LV0rXHMqPykkLywgIlxcXDEiKSBpZiBzZWNvbmQKKyAgICAgICAgcmVzID0gW2ZpcnN0LCBzZWNvbmQsICpyZXN0XS5jb21wYWN0LmpvaW4oIlxuIikgKyAiXG4iCisgICAgICAgIGlmIGVsLmNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIGVsLmNoaWxkcmVuLmZpcnN0LnR5cGUgPT0gOm1hdGgKKyAgICAgICAgICByZXMgPSAiXFwje3Jlc30iCisgICAgICAgIGVsc2lmIHJlcy5zdGFydF93aXRoPygnXCQkJykgJiYgcmVzLmVuZF93aXRoPygiXFwkJFxuIikKKyAgICAgICAgICByZXMuc3ViISgvXlxcXCRcJC8sICdcJFwkJykKKyAgICAgICAgZW5kCisgICAgICAgIHJlcworICAgICAgZW5kCisKKworICAgICAgZGVmIGNvbnZlcnRfY29kZWJsb2NrKGVsLCBvcHRzKQorICAgICAgICBlbC52YWx1ZS5zcGxpdCgvXG4vKS5tYXAge3xsfCBsLmVtcHR5PyA/ICIgICAgIiA6ICIgICAgI3tsfSJ9LmpvaW4oIlxuIikgKyAiXG4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfYmxvY2txdW90ZShlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6aW5kZW50XSArPSAyCisgICAgICAgIGlubmVyKGVsLCBvcHRzKS5jaG9tcC5zcGxpdCgvXG4vKS5tYXAge3xsfCAiPiAje2x9In0uam9pbigiXG4iKSA8PCAiXG4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfaGVhZGVyKGVsLCBvcHRzKQorICAgICAgICByZXMgPSAnJworICAgICAgICByZXMgPDwgIiN7JyMnICogb3V0cHV0X2hlYWRlcl9sZXZlbChlbC5vcHRpb25zWzpsZXZlbF0pfSAje2lubmVyKGVsLCBvcHRzKX0iCisgICAgICAgIHJlc1stMSwgMV0gPSAiXFwjIiBpZiByZXNbLTFdID09ID8jCisgICAgICAgIHJlcyA8PCAiICAgeyMje2VsLmF0dHJbJ2lkJ119fSIgaWYgZWwuYXR0clsnaWQnXSAmJiAhZWwuYXR0clsnaWQnXS5zdHJpcC5lbXB0eT8KKyAgICAgICAgcmVzIDw8ICJcbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9ocihlbCwgb3B0cykKKyAgICAgICAgIiogKiAqXG4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfdWwoZWwsIG9wdHMpCisgICAgICAgIGlubmVyKGVsLCBvcHRzKS5zdWIoL1xuK1xaLywgIlxuIikKKyAgICAgIGVuZAorICAgICAgYWxpYXMgOmNvbnZlcnRfb2wgOmNvbnZlcnRfdWwKKyAgICAgIGFsaWFzIDpjb252ZXJ0X2RsIDpjb252ZXJ0X3VsCisKKyAgICAgIGRlZiBjb252ZXJ0X2xpKGVsLCBvcHRzKQorICAgICAgICBzeW0sIHdpZHRoID0gaWYgQHN0YWNrLmxhc3QudHlwZSA9PSA6dWwKKyAgICAgICAgICAgICAgICAgICAgICAgWycqICcsIGVsLmNoaWxkcmVuLmZpcnN0ICYmIGVsLmNoaWxkcmVuLmZpcnN0LnR5cGUgPT0gOmNvZGVibG9jayA/IDQgOiAyXQorICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICBbIiN7b3B0c1s6aW5kZXhdICsgMX0uIi5sanVzdCg0KSwgNF0KKyAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICBpZiBpYWwgPSBpYWxfZm9yX2VsZW1lbnQoZWwpCisgICAgICAgICAgc3ltIDw8IGlhbCA8PCAiICIKKyAgICAgICAgZW5kCisKKyAgICAgICAgb3B0c1s6aW5kZW50XSArPSB3aWR0aAorICAgICAgICB0ZXh0ID0gaW5uZXIoZWwsIG9wdHMpCisgICAgICAgIG5ld2xpbmVzID0gdGV4dC5zY2FuKC9cbipcWi8pLmZpcnN0CisgICAgICAgIGZpcnN0LCAqbGFzdCA9IHRleHQuc3BsaXQoL1xuLykKKyAgICAgICAgbGFzdCA9IGxhc3QubWFwIHt8bHwgIiAiKndpZHRoICsgbH0uam9pbigiXG4iKQorICAgICAgICB0ZXh0ID0gKGZpcnN0Lm5pbD8gPyAiXG4iIDogZmlyc3QgKyAobGFzdC5lbXB0eT8gPyAiIiA6ICJcbiIpICsgbGFzdCArIG5ld2xpbmVzKQorICAgICAgICBpZiBlbC5jaGlsZHJlbi5maXJzdCAmJiBlbC5jaGlsZHJlbi5maXJzdC50eXBlID09IDpwICYmICFlbC5jaGlsZHJlbi5maXJzdC5vcHRpb25zWzp0cmFuc3BhcmVudF0KKyAgICAgICAgICByZXMgPSAiI3tzeW19I3t0ZXh0fSIKKyAgICAgICAgICByZXMgPDwgIl5cbiIgaWYgZWwuY2hpbGRyZW4uc2l6ZSA9PSAxICYmIEBzdGFjay5sYXN0LmNoaWxkcmVuLmxhc3QgPT0gZWwgJiYKKyAgICAgICAgICAgIChAc3RhY2subGFzdC5jaGlsZHJlbi5hbnk/IHt8Y3wgYy5jaGlsZHJlbi5maXJzdC50eXBlICE9IDpwfSB8fCBAc3RhY2subGFzdC5jaGlsZHJlbi5zaXplID09IDEpCisgICAgICAgICAgcmVzCisgICAgICAgIGVsc2lmIGVsLmNoaWxkcmVuLmZpcnN0ICYmIGVsLmNoaWxkcmVuLmZpcnN0LnR5cGUgPT0gOmNvZGVibG9jaworICAgICAgICAgICIje3N5bX1cbiAgICAje3RleHR9IgorICAgICAgICBlbHNlCisgICAgICAgICAgIiN7c3ltfSN7dGV4dH0iCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2RkKGVsLCBvcHRzKQorICAgICAgICBzeW0sIHdpZHRoID0gIjogIiwgKGVsLmNoaWxkcmVuLmZpcnN0ICYmIGVsLmNoaWxkcmVuLmZpcnN0LnR5cGUgPT0gOmNvZGVibG9jayA/IDQgOiAyKQorICAgICAgICBpZiBpYWwgPSBpYWxfZm9yX2VsZW1lbnQoZWwpCisgICAgICAgICAgc3ltIDw8IGlhbCA8PCAiICIKKyAgICAgICAgZW5kCisKKyAgICAgICAgb3B0c1s6aW5kZW50XSArPSB3aWR0aAorICAgICAgICB0ZXh0ID0gaW5uZXIoZWwsIG9wdHMpCisgICAgICAgIG5ld2xpbmVzID0gdGV4dC5zY2FuKC9cbipcWi8pLmZpcnN0CisgICAgICAgIGZpcnN0LCAqbGFzdCA9IHRleHQuc3BsaXQoL1xuLykKKyAgICAgICAgbGFzdCA9IGxhc3QubWFwIHt8bHwgIiAiKndpZHRoICsgbH0uam9pbigiXG4iKQorICAgICAgICB0ZXh0ID0gZmlyc3QudG9fcyArIChsYXN0LmVtcHR5PyA/ICIiIDogIlxuIikgKyBsYXN0ICsgbmV3bGluZXMKKyAgICAgICAgdGV4dC5jaG9tcCEgaWYgdGV4dCA9fiAvXG5cblxaLyAmJiBvcHRzWzpuZXh0XSAmJiBvcHRzWzpuZXh0XS50eXBlID09IDpkZAorICAgICAgICB0ZXh0IDw8ICJcbiIgaWYgKHRleHQgIX4gL1xuXG5cWi8gJiYgb3B0c1s6bmV4dF0gJiYgb3B0c1s6bmV4dF0udHlwZSA9PSA6ZHQpCisgICAgICAgIHRleHQgPDwgIlxuIiBpZiBlbC5jaGlsZHJlbi5lbXB0eT8KKyAgICAgICAgaWYgZWwuY2hpbGRyZW4uZmlyc3QgJiYgZWwuY2hpbGRyZW4uZmlyc3QudHlwZSA9PSA6cCAmJiAhZWwuY2hpbGRyZW4uZmlyc3Qub3B0aW9uc1s6dHJhbnNwYXJlbnRdCisgICAgICAgICAgIlxuI3tzeW19I3t0ZXh0fSIKKyAgICAgICAgZWxzaWYgZWwuY2hpbGRyZW4uZmlyc3QgJiYgZWwuY2hpbGRyZW4uZmlyc3QudHlwZSA9PSA6Y29kZWJsb2NrCisgICAgICAgICAgIiN7c3ltfVxuICAgICN7dGV4dH0iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAiI3tzeW19I3t0ZXh0fSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfZHQoZWwsIG9wdHMpCisgICAgICAgIHJlc3VsdCA9ICcnCisgICAgICAgIGlmIGlhbCA9IGlhbF9mb3JfZWxlbWVudChlbCkKKyAgICAgICAgICByZXN1bHQgPDwgaWFsIDw8ICIgIgorICAgICAgICBlbmQKKyAgICAgICAgcmVzdWx0IDw8IGlubmVyKGVsLCBvcHRzKSA8PCAiXG4iCisgICAgICBlbmQKKworICAgICAgSFRNTF9UQUdTX1dJVEhfQk9EWT1bJ2RpdicsICdzY3JpcHQnLCAnaWZyYW1lJywgJ3RleHRhcmVhJ10KKworICAgICAgZGVmIGNvbnZlcnRfaHRtbF9lbGVtZW50KGVsLCBvcHRzKQorICAgICAgICBtYXJrZG93bl9hdHRyID0gZWwub3B0aW9uc1s6Y2F0ZWdvcnldID09IDpibG9jayAmJiBlbC5jaGlsZHJlbi5hbnk/IGRvIHxjfAorICAgICAgICAgIGMudHlwZSAhPSA6aHRtbF9lbGVtZW50ICYmIChjLnR5cGUgIT0gOnAgfHwgIWMub3B0aW9uc1s6dHJhbnNwYXJlbnRdKSAmJiBFbGVtZW50LmNhdGVnb3J5KGMpID09IDpibG9jaworICAgICAgICBlbmQKKyAgICAgICAgb3B0c1s6Zm9yY2VfcmF3X3RleHRdID0gdHJ1ZSBpZiAld3tzY3JpcHQgcHJlIGNvZGV9LmluY2x1ZGU/KGVsLnZhbHVlKQorICAgICAgICBvcHRzWzpyYXdfdGV4dF0gPSBvcHRzWzpmb3JjZV9yYXdfdGV4dF0gfHwgb3B0c1s6YmxvY2tfcmF3X3RleHRdIHx8IChlbC5vcHRpb25zWzpjYXRlZ29yeV0gIT0gOnNwYW4gJiYgIW1hcmtkb3duX2F0dHIpCisgICAgICAgIG9wdHNbOmJsb2NrX3Jhd190ZXh0XSA9IHRydWUgaWYgZWwub3B0aW9uc1s6Y2F0ZWdvcnldID09IDpibG9jayAmJiBvcHRzWzpyYXdfdGV4dF0KKyAgICAgICAgcmVzID0gaW5uZXIoZWwsIG9wdHMpCisgICAgICAgIGlmIGVsLm9wdGlvbnNbOmNhdGVnb3J5XSA9PSA6c3BhbgorICAgICAgICAgICI8I3tlbC52YWx1ZX0je2h0bWxfYXR0cmlidXRlcyhlbC5hdHRyKX0iIDw8ICghcmVzLmVtcHR5PyB8fCBIVE1MX1RBR1NfV0lUSF9CT0RZLmluY2x1ZGU/KGVsLnZhbHVlKSA/ICI+I3tyZXN9PC8je2VsLnZhbHVlfT4iIDogIiAvPiIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBvdXRwdXQgPSAnJworICAgICAgICAgIGF0dHIgPSBlbC5hdHRyLmR1cAorICAgICAgICAgIGF0dHJbJ21hcmtkb3duJ10gPSAnMScgaWYgbWFya2Rvd25fYXR0cgorICAgICAgICAgIG91dHB1dCA8PCAiPCN7ZWwudmFsdWV9I3todG1sX2F0dHJpYnV0ZXMoYXR0cil9IgorICAgICAgICAgIGlmICFyZXMuZW1wdHk/ICYmIGVsLm9wdGlvbnNbOmNvbnRlbnRfbW9kZWxdICE9IDpibG9jaworICAgICAgICAgICAgb3V0cHV0IDw8ICI+I3tyZXN9PC8je2VsLnZhbHVlfT4iCisgICAgICAgICAgZWxzaWYgIXJlcy5lbXB0eT8KKyAgICAgICAgICAgIG91dHB1dCA8PCAiPlxuI3tyZXN9IiAgPDwgICI8LyN7ZWwudmFsdWV9PiIKKyAgICAgICAgICBlbHNpZiBIVE1MX1RBR1NfV0lUSF9CT0RZLmluY2x1ZGU/KGVsLnZhbHVlKQorICAgICAgICAgICAgb3V0cHV0IDw8ICI+PC8je2VsLnZhbHVlfT4iCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0cHV0IDw8ICIgLz4iCisgICAgICAgICAgZW5kCisgICAgICAgICAgb3V0cHV0IDw8ICJcbiIgaWYgQHN0YWNrLmxhc3QudHlwZSAhPSA6aHRtbF9lbGVtZW50IHx8IEBzdGFjay5sYXN0Lm9wdGlvbnNbOmNvbnRlbnRfbW9kZWxdICE9IDpyYXcKKyAgICAgICAgICBvdXRwdXQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfeG1sX2NvbW1lbnQoZWwsIG9wdHMpCisgICAgICAgIGlmIGVsLm9wdGlvbnNbOmNhdGVnb3J5XSA9PSA6YmxvY2sgJiYgKEBzdGFjay5sYXN0LnR5cGUgIT0gOmh0bWxfZWxlbWVudCB8fCBAc3RhY2subGFzdC5vcHRpb25zWzpjb250ZW50X21vZGVsXSAhPSA6cmF3KQorICAgICAgICAgIGVsLnZhbHVlICsgIlxuIgorICAgICAgICBlbHNlCisgICAgICAgICAgZWwudmFsdWUuZHVwCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBhbGlhcyA6Y29udmVydF94bWxfcGkgOmNvbnZlcnRfeG1sX2NvbW1lbnQKKworICAgICAgZGVmIGNvbnZlcnRfdGFibGUoZWwsIG9wdHMpCisgICAgICAgIG9wdHNbOmFsaWdubWVudF0gPSBlbC5vcHRpb25zWzphbGlnbm1lbnRdCisgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3RoZWFkKGVsLCBvcHRzKQorICAgICAgICByb3dzID0gaW5uZXIoZWwsIG9wdHMpCisgICAgICAgIGlmIG9wdHNbOmFsaWdubWVudF0uYWxsPyB7fGF8IGEgPT0gOmRlZmF1bHR9CisgICAgICAgICAgIiN7cm93c318IiA8PCAiLSIqMTAgPDwgIlxuIgorICAgICAgICBlbHNlCisgICAgICAgICAgIiN7cm93c318ICIgPDwgb3B0c1s6YWxpZ25tZW50XS5tYXAgZG8gfGF8CisgICAgICAgICAgICBjYXNlIGEKKyAgICAgICAgICAgIHdoZW4gOmxlZnQgdGhlbiAiOi0iCisgICAgICAgICAgICB3aGVuIDpyaWdodCB0aGVuICItOiIKKyAgICAgICAgICAgIHdoZW4gOmNlbnRlciB0aGVuICI6LToiCisgICAgICAgICAgICB3aGVuIDpkZWZhdWx0IHRoZW4gIi0iCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQuam9pbignICcpIDw8ICJcbiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfdGJvZHkoZWwsIG9wdHMpCisgICAgICAgIHJlcyA9ICcnCisgICAgICAgIHJlcyA8PCBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgcmVzIDw8ICd8JyA8PCAnLScqMTAgPDwgIlxuIiBpZiBvcHRzWzpuZXh0XSAmJiBvcHRzWzpuZXh0XS50eXBlID09IDp0Ym9keQorICAgICAgICByZXMKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF90Zm9vdChlbCwgb3B0cykKKyAgICAgICAgInwiIDw8ICI9IioxMCA8PCAiXG4je2lubmVyKGVsLCBvcHRzKX0iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfdHIoZWwsIG9wdHMpCisgICAgICAgICJ8ICIgPDwgZWwuY2hpbGRyZW4ubWFwIHt8Y3wgY29udmVydChjLCBvcHRzKX0uam9pbigiIHwgIikgPDwgIiB8XG4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfdGQoZWwsIG9wdHMpCisgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2NvbW1lbnQoZWwsIG9wdHMpCisgICAgICAgIGlmIGVsLm9wdGlvbnNbOmNhdGVnb3J5XSA9PSA6YmxvY2sKKyAgICAgICAgICAiezo6Y29tbWVudH1cbiN7ZWwudmFsdWV9XG57Oi99XG4iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAiezo6Y29tbWVudH0je2VsLnZhbHVlfXs6L30iCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2JyKGVsLCBvcHRzKQorICAgICAgICAiICBcbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9hKGVsLCBvcHRzKQorICAgICAgICBpZiBlbC5hdHRyWydocmVmJ10uZW1wdHk/CisgICAgICAgICAgIlsje2lubmVyKGVsLCBvcHRzKX1dKCkiCisgICAgICAgIGVsc2lmIGVsLmF0dHJbJ2hyZWYnXSA9fiAvXig/Omh0dHB8ZnRwKS8gfHwgZWwuYXR0clsnaHJlZiddLmNvdW50KCIoKSIpID4gMAorICAgICAgICAgIGluZGV4ID0gaWYgbGlua19lbCA9IEBsaW5rcmVmcy5maW5kIHt8Y3wgYy5hdHRyWydocmVmJ10gPT0gZWwuYXR0clsnaHJlZiddfQorICAgICAgICAgICAgICAgICAgICBAbGlua3JlZnMuaW5kZXgobGlua19lbCkgKyAxCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEBsaW5rcmVmcyA8PCBlbAorICAgICAgICAgICAgICAgICAgICBAbGlua3JlZnMuc2l6ZQorICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgIlsje2lubmVyKGVsLCBvcHRzKX1dWyN7aW5kZXh9XSIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHRpdGxlID0gcGFyc2VfdGl0bGUoZWwuYXR0clsndGl0bGUnXSkKKyAgICAgICAgICAiWyN7aW5uZXIoZWwsIG9wdHMpfV0oI3tlbC5hdHRyWydocmVmJ119I3t0aXRsZX0pIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9pbWcoZWwsIG9wdHMpCisgICAgICAgIGFsdF90ZXh0ID0gZWwuYXR0clsnYWx0J10udG9fcy5nc3ViKEVTQ0FQRURfQ0hBUl9SRSkgeyAkMSA/ICJcXCN7JDF9IiA6ICQyIH0KKyAgICAgICAgaWYgZWwuYXR0clsnc3JjJ10uZW1wdHk/CisgICAgICAgICAgIiFbI3thbHRfdGV4dH1dKCkiCisgICAgICAgIGVsc2UKKyAgICAgICAgICB0aXRsZSA9IHBhcnNlX3RpdGxlKGVsLmF0dHJbJ3RpdGxlJ10pCisgICAgICAgICAgbGluayA9IGlmIGVsLmF0dHJbJ3NyYyddLmNvdW50KCIoKSIpID4gMAorICAgICAgICAgICAgICAgICAgICI8I3tlbC5hdHRyWydzcmMnXX0+IgorICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgZWwuYXR0clsnc3JjJ10KKyAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgIiFbI3thbHRfdGV4dH1dKCN7bGlua30je3RpdGxlfSkiCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2NvZGVzcGFuKGVsLCBvcHRzKQorICAgICAgICBkZWxpbSA9IChlbC52YWx1ZS5zY2FuKC9gKy8pLm1heCB8fCAnJykgKyAnYCcKKyAgICAgICAgIiN7ZGVsaW19I3snICcgaWYgZGVsaW0uc2l6ZSA+IDF9I3tlbC52YWx1ZX0jeycgJyBpZiBkZWxpbS5zaXplID4gMX0je2RlbGltfSIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9mb290bm90ZShlbCwgb3B0cykKKyAgICAgICAgQGZvb3Rub3RlcyA8PCBbZWwub3B0aW9uc1s6bmFtZV0sIGVsLnZhbHVlXQorICAgICAgICAiW14je2VsLm9wdGlvbnNbOm5hbWVdfV0iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfcmF3KGVsLCBvcHRzKQorICAgICAgICBhdHRyID0gKGVsLm9wdGlvbnNbOnR5cGVdIHx8IFtdKS5qb2luKCcgJykKKyAgICAgICAgYXR0ciA9ICIgdHlwZT1cIiN7YXR0cn1cIiIgaWYgYXR0ci5sZW5ndGggPiAwCisgICAgICAgIGlmIEBzdGFjay5sYXN0LnR5cGUgPT0gOmh0bWxfZWxlbWVudAorICAgICAgICAgIGVsLnZhbHVlCisgICAgICAgIGVsc2lmIGVsLm9wdGlvbnNbOmNhdGVnb3J5XSA9PSA6YmxvY2sKKyAgICAgICAgICAiezo6bm9tYXJrZG93biN7YXR0cn19XG4je2VsLnZhbHVlfVxuezovfVxuIgorICAgICAgICBlbHNlCisgICAgICAgICAgIns6Om5vbWFya2Rvd24je2F0dHJ9fSN7ZWwudmFsdWV9ezovfSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfZW0oZWwsIG9wdHMpCisgICAgICAgICIqI3tpbm5lcihlbCwgb3B0cyl9KiIgKworICAgICAgICAgIChvcHRzWzpuZXh0XSAmJiBbOmVtLCA6c3Ryb25nXS5pbmNsdWRlPyhvcHRzWzpuZXh0XS50eXBlKSAmJiAhaWFsX2Zvcl9lbGVtZW50KGVsKSA/ICd7Ojp9JyA6ICcnKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3N0cm9uZyhlbCwgb3B0cykKKyAgICAgICAgIioqI3tpbm5lcihlbCwgb3B0cyl9KioiICsKKyAgICAgICAgICAob3B0c1s6bmV4dF0gJiYgWzplbSwgOnN0cm9uZ10uaW5jbHVkZT8ob3B0c1s6bmV4dF0udHlwZSkgJiYgIWlhbF9mb3JfZWxlbWVudChlbCkgPyAnezo6fScgOiAnJykKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9lbnRpdHkoZWwsIG9wdHMpCisgICAgICAgIGVudGl0eV90b19zdHIoZWwudmFsdWUsIGVsLm9wdGlvbnNbOm9yaWdpbmFsXSkKKyAgICAgIGVuZAorCisgICAgICBUWVBPR1JBUEhJQ19TWU1TID0geworICAgICAgICA6bWRhc2ggPT4gJy0tLScsIDpuZGFzaCA9PiAnLS0nLCA6aGVsbGlwID0+ICcuLi4nLAorICAgICAgICA6bGFxdW9fc3BhY2UgPT4gJzw8ICcsIDpyYXF1b19zcGFjZSA9PiAnID4+JywKKyAgICAgICAgOmxhcXVvID0+ICc8PCcsIDpyYXF1byA9PiAnPj4nCisgICAgICB9CisgICAgICBkZWYgY29udmVydF90eXBvZ3JhcGhpY19zeW0oZWwsIG9wdHMpCisgICAgICAgIFRZUE9HUkFQSElDX1NZTVNbZWwudmFsdWVdCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfc21hcnRfcXVvdGUoZWwsIG9wdHMpCisgICAgICAgIGVsLnZhbHVlLnRvX3MgPX4gL1tybF1kcXVvLyA/ICJcIiIgOiAiJyIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9tYXRoKGVsLCBvcHRzKQorICAgICAgICAiJCQje2VsLnZhbHVlfSQkIiArIChlbC5vcHRpb25zWzpjYXRlZ29yeV0gPT0gOmJsb2NrID8gIlxuIiA6ICcnKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2FiYnJldmlhdGlvbihlbCwgb3B0cykKKyAgICAgICAgZWwudmFsdWUKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9yb290KGVsLCBvcHRzKQorICAgICAgICByZXMgPSBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgcmVzIDw8IGNyZWF0ZV9saW5rX2RlZnMKKyAgICAgICAgcmVzIDw8IGNyZWF0ZV9mb290bm90ZV9kZWZzCisgICAgICAgIHJlcyA8PCBjcmVhdGVfYWJicmV2X2RlZnMKKyAgICAgICAgcmVzCisgICAgICBlbmQKKworICAgICAgZGVmIGNyZWF0ZV9saW5rX2RlZnMKKyAgICAgICAgcmVzID0gJycKKyAgICAgICAgcmVzIDw8ICJcblxuIiBpZiBAbGlua3JlZnMuc2l6ZSA+IDAKKyAgICAgICAgQGxpbmtyZWZzLmVhY2hfd2l0aF9pbmRleCBkbyB8ZWwsIGl8CisgICAgICAgICAgdGl0bGUgPSBwYXJzZV90aXRsZShlbC5hdHRyWyd0aXRsZSddKQorICAgICAgICAgIHJlcyA8PCAiWyN7aSsxfV06ICN7ZWwuYXR0clsnaHJlZiddfSN7dGl0bGV9XG4iCisgICAgICAgIGVuZAorICAgICAgICByZXMKKyAgICAgIGVuZAorCisgICAgICBkZWYgY3JlYXRlX2Zvb3Rub3RlX2RlZnMKKyAgICAgICAgcmVzID0gJycKKyAgICAgICAgQGZvb3Rub3Rlcy5lYWNoIGRvIHxuYW1lLCBkYXRhfAorICAgICAgICAgIHJlcyA8PCAiW14je25hbWV9XTpcbiIKKyAgICAgICAgICByZXMgPDwgaW5uZXIoZGF0YSkuY2hvbXAuc3BsaXQoL1xuLykubWFwIHt8bHwgIiAgICAje2x9In0uam9pbigiXG4iKSArICJcblxuIgorICAgICAgICBlbmQKKyAgICAgICAgcmVzCisgICAgICBlbmQKKworICAgICAgZGVmIGNyZWF0ZV9hYmJyZXZfZGVmcworICAgICAgICByZXR1cm4gJycgdW5sZXNzIEByb290Lm9wdGlvbnNbOmFiYnJldl9kZWZzXQorICAgICAgICByZXMgPSAnJworICAgICAgICBAcm9vdC5vcHRpb25zWzphYmJyZXZfZGVmc10uZWFjaCBkbyB8bmFtZSwgdGV4dHwKKyAgICAgICAgICByZXMgPDwgIipbI3tuYW1lfV06ICN7dGV4dH1cbiIKKyAgICAgICAgICByZXMgPDwgaWFsX2Zvcl9lbGVtZW50KEVsZW1lbnQubmV3KDp1bnVzZWQsIG5pbCwgQHJvb3Qub3B0aW9uc1s6YWJicmV2X2F0dHJdW25hbWVdKSkudG9fcyA8PCAiXG5cbiIKKyAgICAgICAgZW5kCisgICAgICAgIHJlcworICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJuIHRoZSBJQUwgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCArZWwrLgorICAgICAgZGVmIGlhbF9mb3JfZWxlbWVudChlbCkKKyAgICAgICAgcmVzID0gZWwuYXR0ci5tYXAgZG8gfGssdnwKKyAgICAgICAgICBuZXh0IGlmIFs6aW1nLCA6YV0uaW5jbHVkZT8oZWwudHlwZSkgJiYgWydocmVmJywgJ3NyYycsICdhbHQnLCAndGl0bGUnXS5pbmNsdWRlPyhrKQorICAgICAgICAgIG5leHQgaWYgZWwudHlwZSA9PSA6aGVhZGVyICYmIGsgPT0gJ2lkJyAmJiAhdi5zdHJpcC5lbXB0eT8KKyAgICAgICAgICBpZiB2Lm5pbD8KKyAgICAgICAgICAgICcnCisgICAgICAgICAgZWxzaWYgayA9PSAnY2xhc3MnICYmICF2LmVtcHR5PyAmJiAhdi5pbmRleCgvW1wuI10vKQorICAgICAgICAgICAgIiAiICsgdi5zcGxpdCgvXHMrLykubWFwIHt8d3wgIi4je3d9In0uam9pbigiICIpCisgICAgICAgICAgZWxzaWYgayA9PSAnaWQnICYmICF2LnN0cmlwLmVtcHR5PworICAgICAgICAgICAgIiAjI3t2fSIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAiICN7a309XCIje3YudG9fc31cIiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kLmNvbXBhY3Quam9pbignJykKKyAgICAgICAgcmVzID0gInRvYyIgPDwgKHJlcy5zdHJpcC5lbXB0eT8gPyAnJyA6ICIgI3tyZXN9IikgaWYgKGVsLnR5cGUgPT0gOnVsIHx8IGVsLnR5cGUgPT0gOm9sKSAmJgorICAgICAgICAgIChlbC5vcHRpb25zWzppYWxdWzpyZWZzXS5pbmNsdWRlPygndG9jJykgcmVzY3VlIG5pbCkKKyAgICAgICAgcmVzID0gImZvb3Rub3RlcyIgPDwgKHJlcy5zdHJpcC5lbXB0eT8gPyAnJyA6ICIgI3tyZXN9IikgaWYgKGVsLnR5cGUgPT0gOnVsIHx8IGVsLnR5cGUgPT0gOm9sKSAmJgorICAgICAgICAgIChlbC5vcHRpb25zWzppYWxdWzpyZWZzXS5pbmNsdWRlPygnZm9vdG5vdGVzJykgcmVzY3VlIG5pbCkKKyAgICAgICAgaWYgZWwudHlwZSA9PSA6ZGwgJiYgZWwub3B0aW9uc1s6aWFsXSAmJiBlbC5vcHRpb25zWzppYWxdWzpyZWZzXQorICAgICAgICAgIGF1dG9faWRzID0gZWwub3B0aW9uc1s6aWFsXVs6cmVmc10uc2VsZWN0IHt8cmVmfCByZWYgPX4gL1xBYXV0b19pZHMvfS5qb2luKCIgIikKKyAgICAgICAgICByZXMgPSBhdXRvX2lkcyA8PCAocmVzLnN0cmlwLmVtcHR5PyA/ICcnIDogIiAje3Jlc30iKSB1bmxlc3MgYXV0b19pZHMuZW1wdHk/CisgICAgICAgIGVuZAorICAgICAgICByZXMuc3RyaXAuZW1wdHk/ID8gbmlsIDogIns6I3tyZXN9fSIKKyAgICAgIGVuZAorCisgICAgICBkZWYgcGFyc2VfdGl0bGUoYXR0cikKKyAgICAgICAgYXR0ci50b19zLmVtcHR5PyA/ICcnIDogJyAiJyArIGF0dHIuZ3N1YigvIi8sICcmcXVvdDsnKSArICciJworICAgICAgZW5kCisKKyAgICAgICMgOnN0YXJ0ZG9jOgorCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL2xhdGV4LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvbGF0ZXgucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4MTdkOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL2xhdGV4LnJiCkBAIC0wLDAgKzEsNjEzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ3NldCcKK3JlcXVpcmUgJ2tyYW1kb3duL2NvbnZlcnRlcicKKworbW9kdWxlIEtyYW1kb3duCisKKyAgbW9kdWxlIENvbnZlcnRlcgorCisgICAgIyBDb252ZXJ0cyBhbiBlbGVtZW50IHRyZWUgdG8gTGFUZVguCisgICAgIworICAgICMgVGhpcyBjb252ZXJ0ZXIgdXNlcyBpZGVhcyBmcm9tIG90aGVyIE1hcmtkb3duLXRvLUxhVGVYIGNvbnZlcnRlcnMgbGlrZSBQYW5kb2MgYW5kIE1hcnVrdS4KKyAgICAjCisgICAgIyBZb3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGNvbnZlcnRlciBieSBzdWItY2xhc3NpbmcgaXQgYW5kIG92ZXJyaWRpbmcgdGhlICtjb252ZXJ0X05BTUUrIG1ldGhvZHMuCisgICAgIyBFYWNoIHN1Y2ggbWV0aG9kIHRha2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAgICAjCisgICAgIyBbK2VsK10gVGhlIGVsZW1lbnQgb2YgdHlwZSArTkFNRSsgdG8gYmUgY29udmVydGVkLgorICAgICMKKyAgICAjIFsrb3B0cytdIEEgaGFzaCBjb250YWluaW5nIHByb2Nlc3Npbmcgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgZG93biBmcm9tIHBhcmVudCBlbGVtZW50cy4gVGhlCisgICAgIyAgICAgICAgICBrZXkgOnBhcmVudCBpcyBhbHdheXMgc2V0IGFuZCBjb250YWlucyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdmFsdWUuCisgICAgIworICAgICMgVGhlIHJldHVybiB2YWx1ZSBvZiBzdWNoIGEgbWV0aG9kIGhhcyB0byBiZSBhIHN0cmluZyBjb250YWluaW5nIHRoZSBlbGVtZW50ICtlbCsgZm9ybWF0dGVkCisgICAgIyBjb3JyZWN0bHkgYXMgTGFUZVggbWFya3VwLgorICAgIGNsYXNzIExhdGV4IDwgQmFzZQorCisgICAgICAjIEluaXRpYWxpemUgdGhlIExhVGVYIGNvbnZlcnRlciB3aXRoIHRoZSArcm9vdCsgZWxlbWVudCBhbmQgdGhlIGNvbnZlcnNpb24gK29wdGlvbnMrLgorICAgICAgZGVmIGluaXRpYWxpemUocm9vdCwgb3B0aW9ucykKKyAgICAgICAgc3VwZXIKKyAgICAgICAgQGRhdGFbOnBhY2thZ2VzXSA9IFNldC5uZXcKKyAgICAgIGVuZAorCisgICAgICAjIERpc3BhdGNoIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBlbGVtZW50ICtlbCsgdG8gYSArY29udmVydF9UWVBFKyBtZXRob2QgdXNpbmcgdGhlICt0eXBlKyBvZgorICAgICAgIyB0aGUgZWxlbWVudC4KKyAgICAgIGRlZiBjb252ZXJ0KGVsLCBvcHRzID0ge30pCisgICAgICAgIHNlbmQoImNvbnZlcnRfI3tlbC50eXBlfSIsIGVsLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJuIHRoZSBjb252ZXJ0ZWQgY29udGVudCBvZiB0aGUgY2hpbGRyZW4gb2YgK2VsKyBhcyBhIHN0cmluZy4KKyAgICAgIGRlZiBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgcmVzdWx0ID0gJycKKyAgICAgICAgb3B0aW9ucyA9IG9wdHMuZHVwLm1lcmdlKDpwYXJlbnQgPT4gZWwpCisgICAgICAgIGVsLmNoaWxkcmVuLmVhY2hfd2l0aF9pbmRleCBkbyB8aW5uZXJfZWwsIGluZGV4fAorICAgICAgICAgIG9wdGlvbnNbOmluZGV4XSA9IGluZGV4CisgICAgICAgICAgb3B0aW9uc1s6cmVzdWx0XSA9IHJlc3VsdAorICAgICAgICAgIHJlc3VsdCA8PCBzZW5kKCJjb252ZXJ0XyN7aW5uZXJfZWwudHlwZX0iLCBpbm5lcl9lbCwgb3B0aW9ucykKKyAgICAgICAgZW5kCisgICAgICAgIHJlc3VsdAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3Jvb3QoZWwsIG9wdHMpCisgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2JsYW5rKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdID1+IC9cblxuXFp8XEFcWi8gPyAiIiA6ICJcbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF90ZXh0KGVsLCBvcHRzKQorICAgICAgICBlc2NhcGUoZWwudmFsdWUpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfcChlbCwgb3B0cykKKyAgICAgICAgaWYgZWwuY2hpbGRyZW4uc2l6ZSA9PSAxICYmIGVsLmNoaWxkcmVuLmZpcnN0LnR5cGUgPT0gOmltZyAmJiAhKGltZyA9IGNvbnZlcnRfaW1nKGVsLmNoaWxkcmVuLmZpcnN0LCBvcHRzKSkuZW1wdHk/CisgICAgICAgICAgY29udmVydF9zdGFuZGFsb25lX2ltYWdlKGVsLCBvcHRzLCBpbWcpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAiI3tsYXRleF9saW5rX3RhcmdldChlbCl9I3tpbm5lcihlbCwgb3B0cyl9XG5cbiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBIZWxwZXIgbWV0aG9kIHVzZWQgYnkgK2NvbnZlcnRfcCsgdG8gY29udmVydCBhIHBhcmFncmFwaCB0aGF0IG9ubHkgY29udGFpbnMgYSBzaW5nbGUgOmltZworICAgICAgIyBlbGVtZW50LgorICAgICAgZGVmIGNvbnZlcnRfc3RhbmRhbG9uZV9pbWFnZShlbCwgb3B0cywgaW1nKQorICAgICAgICBhdHRycyA9IGF0dHJpYnV0ZV9saXN0KGVsKQorICAgICAgICAiXFxiZWdpbntmaWd1cmV9I3thdHRyc31cblxcYmVnaW57Y2VudGVyfVxuI3tpbWd9XG5cXGVuZHtjZW50ZXJ9XG5cXGNhcHRpb257I3tlc2NhcGUoZWwuY2hpbGRyZW4uZmlyc3QuYXR0clsnYWx0J10pfX1cbiN7bGF0ZXhfbGlua190YXJnZXQoZWwsIHRydWUpfVxuXFxlbmR7ZmlndXJlfSN7YXR0cnN9XG4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfY29kZWJsb2NrKGVsLCBvcHRzKQorICAgICAgICBzaG93X3doaXRlc3BhY2UgPSBlbC5hdHRyWydjbGFzcyddLnRvX3MgPX4gL1xic2hvdy13aGl0ZXNwYWNlc1xiLworICAgICAgICBsYW5nID0gZXh0cmFjdF9jb2RlX2xhbmd1YWdlKGVsLmF0dHIpCisKKyAgICAgICAgaWYgQG9wdGlvbnNbOnN5bnRheF9oaWdobGlnaHRlcl0gPT0gOm1pbnRlZCAmJgorICAgICAgICAgICAgKGhpZ2hsaWdodGVkX2NvZGUgPSBoaWdobGlnaHRfY29kZShlbC52YWx1ZSwgbGFuZywgOmJsb2NrKSkKKyAgICAgICAgICBAZGF0YVs6cGFja2FnZXNdIDw8ICdtaW50ZWQnCisgICAgICAgICAgIiN7bGF0ZXhfbGlua190YXJnZXQoZWwpfSN7aGlnaGxpZ2h0ZWRfY29kZX1cbiIKKyAgICAgICAgZWxzaWYgc2hvd193aGl0ZXNwYWNlIHx8IGxhbmcKKyAgICAgICAgICBvcHRpb25zID0gW10KKyAgICAgICAgICBvcHRpb25zIDw8ICJzaG93c3BhY2VzPSVzLHNob3d0YWJzPSVzIiAlIChzaG93X3doaXRlc3BhY2UgPyBbJ3RydWUnLCAndHJ1ZSddIDogWydmYWxzZScsICdmYWxzZSddKQorICAgICAgICAgIG9wdGlvbnMgPDwgImxhbmd1YWdlPSN7bGFuZ30iIGlmIGxhbmcKKyAgICAgICAgICBvcHRpb25zIDw8ICJiYXNpY3N0eWxlPVxcdHRmYW1pbHlcXGZvb3Rub3Rlc2l6ZSxjb2x1bW5zPWZpeGVkLGZyYW1lPXRsYnIiCisgICAgICAgICAgaWQgPSBlbC5hdHRyWydpZCddCisgICAgICAgICAgb3B0aW9ucyA8PCAibGFiZWw9I3tpZH0iIGlmIGlkCisgICAgICAgICAgYXR0cnMgPSBhdHRyaWJ1dGVfbGlzdChlbCkKKyAgICAgICAgICAiI3tsYXRleF9saW5rX3RhcmdldChlbCl9XFxiZWdpbntsc3RsaXN0aW5nfVsje29wdGlvbnMuam9pbignLCcpfV1cbiN7ZWwudmFsdWV9XG5cXGVuZHtsc3RsaXN0aW5nfSN7YXR0cnN9XG4iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAiI3tsYXRleF9saW5rX3RhcmdldChlbCl9XFxiZWdpbnt2ZXJiYXRpbX0je2VsLnZhbHVlfVxcZW5ke3ZlcmJhdGltfVxuIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9ibG9ja3F1b3RlKGVsLCBvcHRzKQorICAgICAgICBsYXRleF9lbnZpcm9ubWVudChlbC5jaGlsZHJlbi5zaXplID4gMSA/ICdxdW90YXRpb24nIDogJ3F1b3RlJywgZWwsIGlubmVyKGVsLCBvcHRzKSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9oZWFkZXIoZWwsIG9wdHMpCisgICAgICAgIHR5cGUgPSBAb3B0aW9uc1s6bGF0ZXhfaGVhZGVyc11bb3V0cHV0X2hlYWRlcl9sZXZlbChlbC5vcHRpb25zWzpsZXZlbF0pIC0gMV0KKyAgICAgICAgaWYgKChpZCA9IGVsLmF0dHJbJ2lkJ10pIHx8CisgICAgICAgICAgICAoQG9wdGlvbnNbOmF1dG9faWRzXSAmJiAoaWQgPSBnZW5lcmF0ZV9pZChlbC5vcHRpb25zWzpyYXdfdGV4dF0pKSkpICYmIGluX3RvYz8oZWwpCisgICAgICAgICAgIlxcI3t0eXBlfXsje2lubmVyKGVsLCBvcHRzKX19XFxoeXBlcnRhcmdldHsje2lkfX17fVxcbGFiZWx7I3tpZH19XG5cbiIKKyAgICAgICAgZWxzZQorICAgICAgICAgICJcXCN7dHlwZX0qeyN7aW5uZXIoZWwsIG9wdHMpfX1cblxuIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9ocihlbCwgb3B0cykKKyAgICAgICAgYXR0cnMgPSBhdHRyaWJ1dGVfbGlzdChlbCkKKyAgICAgICAgIiN7bGF0ZXhfbGlua190YXJnZXQoZWwpfVxcYmVnaW57Y2VudGVyfSN7YXR0cnN9XG5cXHJ1bGV7M2lufXswLjRwdH1cblxcZW5ke2NlbnRlcn0je2F0dHJzfVxuIgorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3VsKGVsLCBvcHRzKQorICAgICAgICBpZiAhQGRhdGFbOmhhc190b2NdICYmIChlbC5vcHRpb25zWzppYWxdWzpyZWZzXS5pbmNsdWRlPygndG9jJykgcmVzY3VlIG5pbCkKKyAgICAgICAgICBAZGF0YVs6aGFzX3RvY10gPSB0cnVlCisgICAgICAgICAgJ1x0YWJsZW9mY29udGVudHMnCisgICAgICAgIGVsc2UKKyAgICAgICAgICBsYXRleF9lbnZpcm9ubWVudChlbC50eXBlID09IDp1bCA/ICdpdGVtaXplJyA6ICdlbnVtZXJhdGUnLCBlbCwgaW5uZXIoZWwsIG9wdHMpKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgYWxpYXMgOmNvbnZlcnRfb2wgOmNvbnZlcnRfdWwKKworICAgICAgZGVmIGNvbnZlcnRfZGwoZWwsIG9wdHMpCisgICAgICAgIGxhdGV4X2Vudmlyb25tZW50KCdkZXNjcmlwdGlvbicsIGVsLCBpbm5lcihlbCwgb3B0cykpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfbGkoZWwsIG9wdHMpCisgICAgICAgICJcXGl0ZW0gI3tsYXRleF9saW5rX3RhcmdldChlbCwgdHJ1ZSl9I3tpbm5lcihlbCwgb3B0cykuc3ViKC9cbitcWi8sICcnKX1cbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9kdChlbCwgb3B0cykKKyAgICAgICAgIlxcaXRlbVsje2lubmVyKGVsLCBvcHRzKX1dICIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9kZChlbCwgb3B0cykKKyAgICAgICAgIiN7bGF0ZXhfbGlua190YXJnZXQoZWwpfSN7aW5uZXIoZWwsIG9wdHMpfVxuXG4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfaHRtbF9lbGVtZW50KGVsLCBvcHRzKQorICAgICAgICBpZiBlbC52YWx1ZSA9PSAnaScgfHwgZWwudmFsdWUgPT0gJ2VtJworICAgICAgICAgICJcXGVtcGh7I3tpbm5lcihlbCwgb3B0cyl9fSIKKyAgICAgICAgZWxzaWYgZWwudmFsdWUgPT0gJ2InIHx8IGVsLnZhbHVlID09ICdzdHJvbmcnCisgICAgICAgICAgIlxcdGV4dGJmeyN7aW5uZXIoZWwsIG9wdHMpfX0iCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3YXJuaW5nKCJDYW4ndCBjb252ZXJ0IEhUTUwgZWxlbWVudCIpCisgICAgICAgICAgJycKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfeG1sX2NvbW1lbnQoZWwsIG9wdHMpCisgICAgICAgIGVsLnZhbHVlLnNwbGl0KC9cbi8pLm1hcCB7fGx8ICIlICN7bH0ifS5qb2luKCJcbiIpICsgIlxuIgorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3htbF9waShlbCwgb3B0cykKKyAgICAgICAgd2FybmluZygiQ2FuJ3QgY29udmVydCBYTUwgUEkiKQorICAgICAgICAnJworICAgICAgZW5kCisKKyAgICAgIFRBQkxFX0FMSUdOTUVOVF9DSEFSID0gezpkZWZhdWx0ID0+ICdsJywgOmxlZnQgPT4gJ2wnLCA6Y2VudGVyID0+ICdjJywgOnJpZ2h0ID0+ICdyJ30gIyA6bm9kb2M6CisKKyAgICAgIGRlZiBjb252ZXJ0X3RhYmxlKGVsLCBvcHRzKQorICAgICAgICBAZGF0YVs6cGFja2FnZXNdIDw8ICdsb25ndGFibGUnCisgICAgICAgIGFsaWduID0gZWwub3B0aW9uc1s6YWxpZ25tZW50XS5tYXAge3xhfCBUQUJMRV9BTElHTk1FTlRfQ0hBUlthXX0uam9pbignfCcpCisgICAgICAgIGF0dHJzID0gYXR0cmlidXRlX2xpc3QoZWwpCisgICAgICAgICIje2xhdGV4X2xpbmtfdGFyZ2V0KGVsKX1cXGJlZ2lue2xvbmd0YWJsZX17fCN7YWxpZ259fH0je2F0dHJzfVxuXFxobGluZVxuI3tpbm5lcihlbCwgb3B0cyl9XFxobGluZVxuXFxlbmR7bG9uZ3RhYmxlfSN7YXR0cnN9XG5cbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF90aGVhZChlbCwgb3B0cykKKyAgICAgICAgIiN7aW5uZXIoZWwsIG9wdHMpfVxcaGxpbmVcbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF90Ym9keShlbCwgb3B0cykKKyAgICAgICAgaW5uZXIoZWwsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfdGZvb3QoZWwsIG9wdHMpCisgICAgICAgICJcXGhsaW5lIFxcaGxpbmUgXG4je2lubmVyKGVsLCBvcHRzKX0iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfdHIoZWwsIG9wdHMpCisgICAgICAgIGVsLmNoaWxkcmVuLm1hcCB7fGN8IHNlbmQoImNvbnZlcnRfI3tjLnR5cGV9IiwgYywgb3B0cyl9LmpvaW4oJyAmICcpIDw8ICJcXFxcXG4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfdGQoZWwsIG9wdHMpCisgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2NvbW1lbnQoZWwsIG9wdHMpCisgICAgICAgIGVsLnZhbHVlLnNwbGl0KC9cbi8pLm1hcCB7fGx8ICIlICN7bH0ifS5qb2luKCJcbiIpIDw8ICJcbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9icihlbCwgb3B0cykKKyAgICAgICAgcmVzID0gIlxcbmV3bGluZSIKKyAgICAgICAgcmVzIDw8ICJcbiIgaWYgKGMgPSBvcHRzWzpwYXJlbnRdLmNoaWxkcmVuW29wdHNbOmluZGV4XSsxXSkgJiYgKGMudHlwZSAhPSA6dGV4dCB8fCBjLnZhbHVlICF+IC9eXHMqXG4vKQorICAgICAgICByZXMKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9hKGVsLCBvcHRzKQorICAgICAgICB1cmwgPSBlbC5hdHRyWydocmVmJ10KKyAgICAgICAgaWYgdXJsLnN0YXJ0X3dpdGg/KCcjJykKKyAgICAgICAgICAiXFxoeXBlcmxpbmt7I3tlc2NhcGUodXJsWzEuLi0xXSl9fXsje2lubmVyKGVsLCBvcHRzKX19IgorICAgICAgICBlbHNlCisgICAgICAgICAgIlxcaHJlZnsje2VzY2FwZSh1cmwpfX17I3tpbm5lcihlbCwgb3B0cyl9fSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfaW1nKGVsLCBvcHRzKQorICAgICAgICBsaW5lID0gZWwub3B0aW9uc1s6bG9jYXRpb25dCisgICAgICAgIGlmIGVsLmF0dHJbJ3NyYyddID1+IC9eKGh0dHBzP3xmdHBzPyk6XC9cLy8KKyAgICAgICAgICB3YXJuaW5nKCJDYW5ub3QgaW5jbHVkZSBub24tbG9jYWwgaW1hZ2Uje2xpbmUgPyAiIChsaW5lICN7bGluZX0pIiA6ICcnfSIpCisgICAgICAgICAgJycKKyAgICAgICAgZWxzaWYgIWVsLmF0dHJbJ3NyYyddLmVtcHR5PworICAgICAgICAgIEBkYXRhWzpwYWNrYWdlc10gPDwgJ2dyYXBoaWN4JworICAgICAgICAgICIje2xhdGV4X2xpbmtfdGFyZ2V0KGVsKX1cXGluY2x1ZGVncmFwaGljc3sje2VsLmF0dHJbJ3NyYyddfX0iCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3YXJuaW5nKCJDYW5ub3QgaW5jbHVkZSBpbWFnZSB3aXRoIGVtcHR5IHBhdGgje2xpbmUgPyAiIChsaW5lICN7bGluZX0pIiA6ICcnfSIpCisgICAgICAgICAgJycKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfY29kZXNwYW4oZWwsIG9wdHMpCisgICAgICAgIGxhbmcgPSBleHRyYWN0X2NvZGVfbGFuZ3VhZ2UoZWwuYXR0cikKKyAgICAgICAgaWYgQG9wdGlvbnNbOnN5bnRheF9oaWdobGlnaHRlcl0gPT0gOm1pbnRlZCAmJgorICAgICAgICAgICAgKGhpZ2hsaWdodGVkX2NvZGUgPSBoaWdobGlnaHRfY29kZShlbC52YWx1ZSwgbGFuZywgOnNwYW4pKQorICAgICAgICAgIEBkYXRhWzpwYWNrYWdlc10gPDwgJ21pbnRlZCcKKyAgICAgICAgICAiI3tsYXRleF9saW5rX3RhcmdldChlbCl9I3toaWdobGlnaHRlZF9jb2RlfSIKKyAgICAgICAgZWxzZQorICAgICAgICAgICJcXHRleHR0dHsje2xhdGV4X2xpbmtfdGFyZ2V0KGVsKX0je2VzY2FwZShlbC52YWx1ZSl9fSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfZm9vdG5vdGUoZWwsIG9wdHMpCisgICAgICAgIEBkYXRhWzpwYWNrYWdlc10gPDwgJ2ZhbmN5dnJiJworICAgICAgICAiXFxmb290bm90ZXsje2lubmVyKGVsLnZhbHVlLCBvcHRzKS5yc3RyaXB9fSIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9yYXcoZWwsIG9wdHMpCisgICAgICAgIGlmICFlbC5vcHRpb25zWzp0eXBlXSB8fCBlbC5vcHRpb25zWzp0eXBlXS5lbXB0eT8gfHwgZWwub3B0aW9uc1s6dHlwZV0uaW5jbHVkZT8oJ2xhdGV4JykKKyAgICAgICAgICBlbC52YWx1ZSArIChlbC5vcHRpb25zWzpjYXRlZ29yeV0gPT0gOmJsb2NrID8gIlxuIiA6ICcnKQorICAgICAgICBlbHNlCisgICAgICAgICAgJycKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfZW0oZWwsIG9wdHMpCisgICAgICAgICJcXGVtcGh7I3tsYXRleF9saW5rX3RhcmdldChlbCl9I3tpbm5lcihlbCwgb3B0cyl9fSIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9zdHJvbmcoZWwsIG9wdHMpCisgICAgICAgICJcXHRleHRiZnsje2xhdGV4X2xpbmtfdGFyZ2V0KGVsKX0je2lubmVyKGVsLCBvcHRzKX19IgorICAgICAgZW5kCisKKyAgICAgICMgSW5zcGlyZWQgYnkgTWFydWt1OiBlbnRpdHkgY29udmVyc2lvbiB0YWJsZSBiYXNlZCBvbiB0aGUgb25lIGZyb20gaHRtbHRvbGF0ZXgKKyAgICAgICMgKGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvaHRtbHRvbGF0ZXgvKSwgd2l0aCBzb21lIHNtYWxsIGFkanVzdG1lbnRzL2FkZGl0aW9ucworICAgICAgRU5USVRZX0NPTlZfVEFCTEUgPSB7CisgICAgICAgIDkxMyA9PiBbJyRBJCddLAorICAgICAgICA5MTQgPT4gWyckQiQnXSwKKyAgICAgICAgOTE1ID0+IFsnJFxHYW1tYSQnXSwKKyAgICAgICAgOTE2ID0+IFsnJFxEZWx0YSQnXSwKKyAgICAgICAgOTE3ID0+IFsnJEUkJ10sCisgICAgICAgIDkxOCA9PiBbJyRaJCddLAorICAgICAgICA5MTkgPT4gWyckSCQnXSwKKyAgICAgICAgOTIwID0+IFsnJFxUaGV0YSQnXSwKKyAgICAgICAgOTIxID0+IFsnJEkkJ10sCisgICAgICAgIDkyMiA9PiBbJyRLJCddLAorICAgICAgICA5MjMgPT4gWyckXExhbWJkYSQnXSwKKyAgICAgICAgOTI0ID0+IFsnJE0kJ10sCisgICAgICAgIDkyNSA9PiBbJyROJCddLAorICAgICAgICA5MjYgPT4gWyckXFhpJCddLAorICAgICAgICA5MjcgPT4gWyckTyQnXSwKKyAgICAgICAgOTI4ID0+IFsnJFxQaSQnXSwKKyAgICAgICAgOTI5ID0+IFsnJFAkJ10sCisgICAgICAgIDkzMSA9PiBbJyRcU2lnbWEkJ10sCisgICAgICAgIDkzMiA9PiBbJyRUJCddLAorICAgICAgICA5MzMgPT4gWyckWSQnXSwKKyAgICAgICAgOTM0ID0+IFsnJFxQaGkkJ10sCisgICAgICAgIDkzNSA9PiBbJyRYJCddLAorICAgICAgICA5MzYgPT4gWyckXFBzaSQnXSwKKyAgICAgICAgOTM3ID0+IFsnJFxPbWVnYSQnXSwKKyAgICAgICAgOTQ1ID0+IFsnJFxhbHBoYSQnXSwKKyAgICAgICAgOTQ2ID0+IFsnJFxiZXRhJCddLAorICAgICAgICA5NDcgPT4gWyckXGdhbW1hJCddLAorICAgICAgICA5NDggPT4gWyckXGRlbHRhJCddLAorICAgICAgICA5NDkgPT4gWyckXGVwc2lsb24kJ10sCisgICAgICAgIDk1MCA9PiBbJyRcemV0YSQnXSwKKyAgICAgICAgOTUxID0+IFsnJFxldGEkJ10sCisgICAgICAgIDk1MiA9PiBbJyRcdGhldGEkJ10sCisgICAgICAgIDk1MyA9PiBbJyRcaW90YSQnXSwKKyAgICAgICAgOTU0ID0+IFsnJFxrYXBwYSQnXSwKKyAgICAgICAgOTU1ID0+IFsnJFxsYW1iZGEkJ10sCisgICAgICAgIDk1NiA9PiBbJyRcbXUkJ10sCisgICAgICAgIDk1NyA9PiBbJyRcbnUkJ10sCisgICAgICAgIDk1OCA9PiBbJyRceGkkJ10sCisgICAgICAgIDk1OSA9PiBbJyRvJCddLAorICAgICAgICA5NjAgPT4gWyckXHBpJCddLAorICAgICAgICA5NjEgPT4gWyckXHJobyQnXSwKKyAgICAgICAgOTYzID0+IFsnJFxzaWdtYSQnXSwKKyAgICAgICAgOTY0ID0+IFsnJFx0YXUkJ10sCisgICAgICAgIDk2NSA9PiBbJyRcdXBzaWxvbiQnXSwKKyAgICAgICAgOTY2ID0+IFsnJFxwaGkkJ10sCisgICAgICAgIDk2NyA9PiBbJyRcY2hpJCddLAorICAgICAgICA5NjggPT4gWyckXHBzaSQnXSwKKyAgICAgICAgOTY5ID0+IFsnJFxvbWVnYSQnXSwKKyAgICAgICAgOTYyID0+IFsnJFx2YXJzaWdtYSQnXSwKKyAgICAgICAgOTc3ID0+IFsnJFx2YXJ0aGV0YSQnXSwKKyAgICAgICAgOTgyID0+IFsnJFx2YXJwaSQnXSwKKyAgICAgICAgODIzMCA9PiBbJ1xsZG90cyddLAorICAgICAgICA4MjQyID0+IFsnJFxwcmltZSQnXSwKKyAgICAgICAgODI1NCA9PiBbJy0nXSwKKyAgICAgICAgODI2MCA9PiBbJy8nXSwKKyAgICAgICAgODQ3MiA9PiBbJyRcd3AkJ10sCisgICAgICAgIDg0NjUgPT4gWyckXEltJCddLAorICAgICAgICA4NDc2ID0+IFsnJFxSZSQnXSwKKyAgICAgICAgODUwMSA9PiBbJyRcYWxlcGgkJ10sCisgICAgICAgIDgyMjYgPT4gWyckXGJ1bGxldCQnXSwKKyAgICAgICAgODQ4MiA9PiBbJyRee1xybSBUTX0kJ10sCisgICAgICAgIDg1OTIgPT4gWyckXGxlZnRhcnJvdyQnXSwKKyAgICAgICAgODU5NCA9PiBbJyRccmlnaHRhcnJvdyQnXSwKKyAgICAgICAgODU5MyA9PiBbJyRcdXBhcnJvdyQnXSwKKyAgICAgICAgODU5NSA9PiBbJyRcZG93bmFycm93JCddLAorICAgICAgICA4NTk2ID0+IFsnJFxsZWZ0cmlnaHRhcnJvdyQnXSwKKyAgICAgICAgODYyOSA9PiBbJyRcaG9va2xlZnRhcnJvdyQnXSwKKyAgICAgICAgODY1NyA9PiBbJyRcVXBhcnJvdyQnXSwKKyAgICAgICAgODY1OSA9PiBbJyRcRG93bmFycm93JCddLAorICAgICAgICA4NjU2ID0+IFsnJFxMZWZ0YXJyb3ckJ10sCisgICAgICAgIDg2NTggPT4gWyckXFJpZ2h0YXJyb3ckJ10sCisgICAgICAgIDg2NjAgPT4gWyckXExlZnRyaWdodGFycm93JCddLAorICAgICAgICA4NzA0ID0+IFsnJFxmb3JhbGwkJ10sCisgICAgICAgIDg3MDYgPT4gWyckXHBhcnRpYWwkJ10sCisgICAgICAgIDg3MDcgPT4gWyckXGV4aXN0cyQnXSwKKyAgICAgICAgODcwOSA9PiBbJyRcZW1wdHlzZXQkJ10sCisgICAgICAgIDg3MTEgPT4gWyckXG5hYmxhJCddLAorICAgICAgICA4NzEyID0+IFsnJFxpbiQnXSwKKyAgICAgICAgODcxNSA9PiBbJyRcbmkkJ10sCisgICAgICAgIDg3MTMgPT4gWyckXG5vdGluJCddLAorICAgICAgICA4NzIxID0+IFsnJFxzdW0kJ10sCisgICAgICAgIDg3MTkgPT4gWyckXHByb2QkJ10sCisgICAgICAgIDg3MjIgPT4gWyckLSQnXSwKKyAgICAgICAgODcyNyA9PiBbJyRcYXN0JCddLAorICAgICAgICA4NzMwID0+IFsnJFxzdXJkJCddLAorICAgICAgICA4NzMzID0+IFsnJFxwcm9wdG8kJ10sCisgICAgICAgIDg3MzQgPT4gWyckXGluZnR5JCddLAorICAgICAgICA4NzM2ID0+IFsnJFxhbmdsZSQnXSwKKyAgICAgICAgODc0MyA9PiBbJyRcd2VkZ2UkJ10sCisgICAgICAgIDg3NDQgPT4gWyckXHZlZSQnXSwKKyAgICAgICAgODc0NSA9PiBbJyRcY3VwJCddLAorICAgICAgICA4NzQ2ID0+IFsnJFxjYXAkJ10sCisgICAgICAgIDg3NDcgPT4gWyckXGludCQnXSwKKyAgICAgICAgODc1NiA9PiBbJyRcdGhlcmVmb3JlJCcsICdhbXNzeW1iJ10sCisgICAgICAgIDg3NjQgPT4gWyckXHNpbSQnXSwKKyAgICAgICAgODc3NiA9PiBbJyRcYXBwcm94JCddLAorICAgICAgICA4NzczID0+IFsnJFxjb25nJCddLAorICAgICAgICA4ODAwID0+IFsnJFxuZXEkJ10sCisgICAgICAgIDg4MDEgPT4gWyckXGVxdWl2JCddLAorICAgICAgICA4ODA0ID0+IFsnJFxsZXEkJ10sCisgICAgICAgIDg4MDUgPT4gWyckXGdlcSQnXSwKKyAgICAgICAgODgzNCA9PiBbJyRcc3Vic2V0JCddLAorICAgICAgICA4ODM1ID0+IFsnJFxzdXBzZXQkJ10sCisgICAgICAgIDg4MzggPT4gWyckXHN1YnNldGVxJCddLAorICAgICAgICA4ODM5ID0+IFsnJFxzdXBzZXRlcSQnXSwKKyAgICAgICAgODgzNiA9PiBbJyRcbnN1YnNldCQnLCAnYW1zc3ltYiddLAorICAgICAgICA4ODUzID0+IFsnJFxvcGx1cyQnXSwKKyAgICAgICAgODg1NSA9PiBbJyRcb3RpbWVzJCddLAorICAgICAgICA4ODY5ID0+IFsnJFxwZXJwJCddLAorICAgICAgICA4OTAxID0+IFsnJFxjZG90JCddLAorICAgICAgICA4OTY4ID0+IFsnJFxyY2VpbCQnXSwKKyAgICAgICAgODk2OSA9PiBbJyRcbGNlaWwkJ10sCisgICAgICAgIDg5NzAgPT4gWyckXGxmbG9vciQnXSwKKyAgICAgICAgODk3MSA9PiBbJyRccmZsb29yJCddLAorICAgICAgICA5MDAxID0+IFsnJFxyYW5nbGUkJ10sCisgICAgICAgIDkwMDIgPT4gWyckXGxhbmdsZSQnXSwKKyAgICAgICAgOTY3NCA9PiBbJyRcbG96ZW5nZSQnLCAnYW1zc3ltYiddLAorICAgICAgICA5ODI0ID0+IFsnJFxzcGFkZXN1aXQkJ10sCisgICAgICAgIDk4MjcgPT4gWyckXGNsdWJzdWl0JCddLAorICAgICAgICA5ODI5ID0+IFsnJFxoZWFydHN1aXQkJ10sCisgICAgICAgIDk4MzAgPT4gWyckXGRpYW1vbmRzdWl0JCddLAorICAgICAgICAzOCA9PiBbJ1wmJ10sCisgICAgICAgIDM0ID0+IFsnIiddLAorICAgICAgICAzOSA9PiBbJ1wnJ10sCisgICAgICAgIDE2OSA9PiBbJ1xjb3B5cmlnaHQnXSwKKyAgICAgICAgNjAgPT4gWydcdGV4dGxlc3MnXSwKKyAgICAgICAgNjIgPT4gWydcdGV4dGdyZWF0ZXInXSwKKyAgICAgICAgMzM4ID0+IFsnXE9FJ10sCisgICAgICAgIDMzOSA9PiBbJ1xvZSddLAorICAgICAgICAzNTIgPT4gWydcdntTfSddLAorICAgICAgICAzNTMgPT4gWydcdntzfSddLAorICAgICAgICAzNzYgPT4gWydcIlknXSwKKyAgICAgICAgNzEwID0+IFsnXHRleHRhc2NpaWNpcmN1bSddLAorICAgICAgICA3MzIgPT4gWydcdGV4dGFzY2lpdGlsZGUnXSwKKyAgICAgICAgODIxMSA9PiBbJy0tJ10sCisgICAgICAgIDgyMTIgPT4gWyctLS0nXSwKKyAgICAgICAgODIxNiA9PiBbJ2AnXSwKKyAgICAgICAgODIxNyA9PiBbJ1wnJ10sCisgICAgICAgIDgyMjAgPT4gWydgYCddLAorICAgICAgICA4MjIxID0+IFsnXCdcJyddLAorICAgICAgICA4MjI0ID0+IFsnXGRhZyddLAorICAgICAgICA4MjI1ID0+IFsnXGRkYWcnXSwKKyAgICAgICAgODI0MCA9PiBbJ1xwZXJtaWwnLCAnd2FzeXN5bSddLAorICAgICAgICA4MzY0ID0+IFsnXGV1cm8nLCAnZXVyb3N5bSddLAorICAgICAgICA4MjQ5ID0+IFsnXGd1aWxzaW5nbGxlZnQnXSwKKyAgICAgICAgODI1MCA9PiBbJ1xndWlsc2luZ2xyaWdodCddLAorICAgICAgICA4MjE4ID0+IFsnXHF1b3Rlc2luZ2xiYXNlJywgJ21hdGhjb21wJ10sCisgICAgICAgIDgyMjIgPT4gWydccXVvdGVkYmxiYXNlJywgJ21hdGhjb21wJ10sCisgICAgICAgIDQwMiA9PiBbJ1x0ZXh0ZmxvcmluJywgJ21hdGhjb21wJ10sCisgICAgICAgIDM4MSA9PiBbJ1x2e1p9J10sCisgICAgICAgIDM4MiA9PiBbJ1x2e3p9J10sCisgICAgICAgIDE2MCA9PiBbJ34nXSwKKyAgICAgICAgMTYxID0+IFsnXHRleHRleGNsYW1kb3duJ10sCisgICAgICAgIDE2MyA9PiBbJ1xwb3VuZHMnXSwKKyAgICAgICAgMTY0ID0+IFsnXGN1cnJlbmN5JywgJ3dhc3lzeW0nXSwKKyAgICAgICAgMTY1ID0+IFsnXHRleHR5ZW4nLCAndGV4dGNvbXAnXSwKKyAgICAgICAgMTY2ID0+IFsnXGJyb2tlbnZlcnQnLCAnd2FzeXN5bSddLAorICAgICAgICAxNjcgPT4gWydcUyddLAorICAgICAgICAxNzEgPT4gWydcZ3VpbGxlbW90bGVmdCddLAorICAgICAgICAxODcgPT4gWydcZ3VpbGxlbW90cmlnaHQnXSwKKyAgICAgICAgMTc0ID0+IFsnXHRleHRyZWdpc3RlcmVkJ10sCisgICAgICAgIDE3MCA9PiBbJ1x0ZXh0b3JkZmVtaW5pbmUnXSwKKyAgICAgICAgMTcyID0+IFsnJFxuZWckJ10sCisgICAgICAgIDE3MyA9PiBbJ1wtJ10sCisgICAgICAgIDE3NiA9PiBbJyRcZGVncmVlJCcsICdtYXRoYWJ4J10sCisgICAgICAgIDE3NyA9PiBbJyRccG0kJ10sCisgICAgICAgIDE4MCA9PiBbJ1wnJ10sCisgICAgICAgIDE4MSA9PiBbJyRcbXUkJ10sCisgICAgICAgIDE4MiA9PiBbJ1xQJ10sCisgICAgICAgIDE4MyA9PiBbJyRcY2RvdCQnXSwKKyAgICAgICAgMTg2ID0+IFsnXHRleHRvcmRtYXNjdWxpbmUnXSwKKyAgICAgICAgMTYyID0+IFsnXGNlbnQnLCAnd2FzeXN5bSddLAorICAgICAgICAxODUgPT4gWyckXjEkJ10sCisgICAgICAgIDE3OCA9PiBbJyReMiQnXSwKKyAgICAgICAgMTc5ID0+IFsnJF4zJCddLAorICAgICAgICAxODkgPT4gWyckXGZyYWN7MX17Mn0kJ10sCisgICAgICAgIDE4OCA9PiBbJyRcZnJhY3sxfXs0fSQnXSwKKyAgICAgICAgMTkwID0+IFsnJFxmcmFjezN9ezR9J10sCisgICAgICAgIDE5MiA9PiBbJ1xgQSddLAorICAgICAgICAxOTMgPT4gWydcXFwnQSddLAorICAgICAgICAxOTQgPT4gWydcXkEnXSwKKyAgICAgICAgMTk1ID0+IFsnXH5BJ10sCisgICAgICAgIDE5NiA9PiBbJ1wiQSddLAorICAgICAgICAxOTcgPT4gWydcQUEnXSwKKyAgICAgICAgMTk4ID0+IFsnXEFFJ10sCisgICAgICAgIDE5OSA9PiBbJ1xjQyddLAorICAgICAgICAyMDAgPT4gWydcYEUnXSwKKyAgICAgICAgMjAxID0+IFsnXFxcJ0UnXSwKKyAgICAgICAgMjAyID0+IFsnXF5FJ10sCisgICAgICAgIDIwMyA9PiBbJ1wiRSddLAorICAgICAgICAyMDQgPT4gWydcYEknXSwKKyAgICAgICAgMjA1ID0+IFsnXFxcJ0knXSwKKyAgICAgICAgMjA2ID0+IFsnXF5JJ10sCisgICAgICAgIDIwNyA9PiBbJ1wiSSddLAorICAgICAgICAyMDggPT4gWyckXGV0aCQnLCAnYW1zc3ltYiddLAorICAgICAgICAyMDkgPT4gWydcfk4nXSwKKyAgICAgICAgMjEwID0+IFsnXGBPJ10sCisgICAgICAgIDIxMSA9PiBbJ1xcXCdPJ10sCisgICAgICAgIDIxMiA9PiBbJ1xeTyddLAorICAgICAgICAyMTMgPT4gWydcfk8nXSwKKyAgICAgICAgMjE0ID0+IFsnXCJPJ10sCisgICAgICAgIDIxNSA9PiBbJyRcdGltZXMkJ10sCisgICAgICAgIDIxNiA9PiBbJ1xPJ10sCisgICAgICAgIDIxNyA9PiBbJ1xgVSddLAorICAgICAgICAyMTggPT4gWydcXFwnVSddLAorICAgICAgICAyMTkgPT4gWydcXlUnXSwKKyAgICAgICAgMjIwID0+IFsnXCJVJ10sCisgICAgICAgIDIyMSA9PiBbJ1xcXCdZJ10sCisgICAgICAgIDIyMiA9PiBbJ1xUaG9ybicsICd3YXN5c3ltJ10sCisgICAgICAgIDIyMyA9PiBbJ1xzcyddLAorICAgICAgICAyMjQgPT4gWydcYGEnXSwKKyAgICAgICAgMjI1ID0+IFsnXFxcJ2EnXSwKKyAgICAgICAgMjI2ID0+IFsnXF5hJ10sCisgICAgICAgIDIyNyA9PiBbJ1x+YSddLAorICAgICAgICAyMjggPT4gWydcImEnXSwKKyAgICAgICAgMjI5ID0+IFsnXGFhJ10sCisgICAgICAgIDIzMCA9PiBbJ1xhZSddLAorICAgICAgICAyMzEgPT4gWydcY2MnXSwKKyAgICAgICAgMjMyID0+IFsnXGBlJ10sCisgICAgICAgIDIzMyA9PiBbJ1xcXCdlJ10sCisgICAgICAgIDIzNCA9PiBbJ1xeZSddLAorICAgICAgICAyMzUgPT4gWydcImUnXSwKKyAgICAgICAgMjM2ID0+IFsnXGBpJ10sCisgICAgICAgIDIzNyA9PiBbJ1xcXCdpJ10sCisgICAgICAgIDIzOCA9PiBbJ1xeaSddLAorICAgICAgICAyMzkgPT4gWydcImknXSwKKyAgICAgICAgMjQwID0+IFsnJFxldGgkJ10sCisgICAgICAgIDI0MSA9PiBbJ1x+biddLAorICAgICAgICAyNDIgPT4gWydcYG8nXSwKKyAgICAgICAgMjQzID0+IFsnXFxcJ28nXSwKKyAgICAgICAgMjQ0ID0+IFsnXF5vJ10sCisgICAgICAgIDI0NSA9PiBbJ1x+byddLAorICAgICAgICAyNDYgPT4gWydcIm8nXSwKKyAgICAgICAgMjQ3ID0+IFsnJFxkaXZpZGUkJ10sCisgICAgICAgIDI0OCA9PiBbJ1xvJ10sCisgICAgICAgIDI0OSA9PiBbJ1xgdSddLAorICAgICAgICAyNTAgPT4gWydcXFwndSddLAorICAgICAgICAyNTEgPT4gWydcXnUnXSwKKyAgICAgICAgMjUyID0+IFsnXCJ1J10sCisgICAgICAgIDI1MyA9PiBbJ1xcXCd5J10sCisgICAgICAgIDI1NCA9PiBbJ1x0aG9ybicsICd3YXN5c3ltJ10sCisgICAgICAgIDI1NSA9PiBbJ1wieSddLAorICAgICAgICA4MjAxID0+IFsnXHRoaW5zcGFjZSddLAorICAgICAgICA4MTk0ID0+IFsnXGhza2lwIC41ZW1ccmVsYXgnXSwKKyAgICAgICAgODE5NSA9PiBbJ1xxdWFkJ10sCisgICAgICB9ICMgOm5vZG9jOgorICAgICAgRU5USVRZX0NPTlZfVEFCTEUuZWFjaCB7fGssdnwgRU5USVRZX0NPTlZfVEFCTEVba11bMF0uaW5zZXJ0KC0xLCAne30nKX0KKworICAgICAgZGVmIGVudGl0eV90b19sYXRleChlbnRpdHkpCisgICAgICAgIHRleHQsIHBhY2thZ2UgPSBFTlRJVFlfQ09OVl9UQUJMRVtlbnRpdHkuY29kZV9wb2ludF0KKyAgICAgICAgaWYgdGV4dAorICAgICAgICAgIEBkYXRhWzpwYWNrYWdlc10gPDwgcGFja2FnZSBpZiBwYWNrYWdlCisgICAgICAgICAgdGV4dAorICAgICAgICBlbHNlCisgICAgICAgICAgd2FybmluZygiQ291bGRuJ3QgZmluZCBlbnRpdHkgd2l0aCBjb2RlICN7ZW50aXR5LmNvZGVfcG9pbnR9IGluIHN1YnN0aXR1dGlvbiB0YWJsZSEiKQorICAgICAgICAgICcnCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2VudGl0eShlbCwgb3B0cykKKyAgICAgICAgZW50aXR5X3RvX2xhdGV4KGVsLnZhbHVlKQorICAgICAgZW5kCisKKyAgICAgIFRZUE9HUkFQSElDX1NZTVMgPSB7CisgICAgICAgIDptZGFzaCA9PiAnLS0tJywgOm5kYXNoID0+ICctLScsIDpoZWxsaXAgPT4gJ1xsZG90c3t9JywKKyAgICAgICAgOmxhcXVvX3NwYWNlID0+ICdcZ3VpbGxlbW90bGVmdHt9ficsIDpyYXF1b19zcGFjZSA9PiAnflxndWlsbGVtb3RyaWdodHt9JywKKyAgICAgICAgOmxhcXVvID0+ICdcZ3VpbGxlbW90bGVmdHt9JywgOnJhcXVvID0+ICdcZ3VpbGxlbW90cmlnaHR7fScKKyAgICAgIH0gIyA6bm9kb2M6CisgICAgICBkZWYgY29udmVydF90eXBvZ3JhcGhpY19zeW0oZWwsIG9wdHMpCisgICAgICAgIFRZUE9HUkFQSElDX1NZTVNbZWwudmFsdWVdCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfc21hcnRfcXVvdGUoZWwsIG9wdHMpCisgICAgICAgIHJlcyA9IGVudGl0eV90b19sYXRleChzbWFydF9xdW90ZV9lbnRpdHkoZWwpKS5jaG9tcCgne30nKQorICAgICAgICByZXMgPDwgInt9IiBpZiAoKG5lbCA9IG9wdHNbOnBhcmVudF0uY2hpbGRyZW5bb3B0c1s6aW5kZXhdKzFdKSAmJiBuZWwudHlwZSA9PSA6c21hcnRfcXVvdGUpIHx8IHJlcyA9fiAvXHckLworICAgICAgICByZXMKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9tYXRoKGVsLCBvcHRzKQorICAgICAgICBAZGF0YVs6cGFja2FnZXNdICs9ICV3W2Ftc3N5bWIgYW1zbWF0aCBhbXN0aG0gYW1zZm9udHNdCisgICAgICAgIGlmIGVsLm9wdGlvbnNbOmNhdGVnb3J5XSA9PSA6YmxvY2sKKyAgICAgICAgICBpZiBlbC52YWx1ZSA9fiAvXEFccypcXGJlZ2luXHsvCisgICAgICAgICAgICBlbC52YWx1ZQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxhdGV4X2Vudmlyb25tZW50KCdkaXNwbGF5bWF0aCcsIGVsLCBlbC52YWx1ZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgICIkI3tlbC52YWx1ZX0kIgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9hYmJyZXZpYXRpb24oZWwsIG9wdHMpCisgICAgICAgIEBkYXRhWzpwYWNrYWdlc10gKz0gJXdbYWNyb255bV0KKyAgICAgICAgIlxcYWN7I3tub3JtYWxpemVfYWJicmV2aWF0aW9uX2tleShlbC52YWx1ZSl9fSIKKyAgICAgIGVuZAorCisgICAgICAjIE5vcm1hbGl6ZSB0aGUgYWJicmV2aWF0aW9uIGtleSBzbyB0aGF0IGl0IG9ubHkgY29udGFpbnMgYWxsb3dlZCBBU0NJSSBjaGFyYWN0ZXIKKyAgICAgIGRlZiBub3JtYWxpemVfYWJicmV2aWF0aW9uX2tleShrZXkpCisgICAgICAgIGtleS5nc3ViKC9cVy8pIHt8bXwgbS51bnBhY2soJ0gqJykuZmlyc3R9CisgICAgICBlbmQKKworICAgICAgIyBXcmFwIHRoZSArdGV4dCsgaW5zaWRlIGEgTGFUZVggZW52aXJvbm1lbnQgb2YgdHlwZSArdHlwZSsuIFRoZSBlbGVtZW50ICtlbCsgaXMgcGFzc2VkIG9uIHRvCisgICAgICAjIHRoZSBtZXRob2QgI2F0dHJpYnV0ZV9saXN0IC0tIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGFwcGVuZGVkIHRvIGJvdGggdGhlIFxcYmVnaW4gYW5kIHRoZQorICAgICAgIyBcXGVuZCBsaW5lcyBvZiB0aGUgTGFUZVggZW52aXJvbm1lbnQgZm9yIGVhc2llciBwb3N0LXByb2Nlc3Npbmcgb2YgTGFUZVggZW52aXJvbm1lbnRzLgorICAgICAgZGVmIGxhdGV4X2Vudmlyb25tZW50KHR5cGUsIGVsLCB0ZXh0KQorICAgICAgICBhdHRycyA9IGF0dHJpYnV0ZV9saXN0KGVsKQorICAgICAgICAiXFxiZWdpbnsje3R5cGV9fSN7bGF0ZXhfbGlua190YXJnZXQoZWwpfSN7YXR0cnN9XG4je3RleHQucnN0cmlwfVxuXFxlbmR7I3t0eXBlfX0je2F0dHJzfVxuIgorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2YWxpZCBcaHlwZXJ0YXJnZXQgY29tbWFuZCBpZiB0aGUgZWxlbWVudCBoYXMgYW4gSUQgZGVmaW5lZCwgb3IKKyAgICAgICMgK25pbCsgb3RoZXJ3aXNlLiBJZiB0aGUgcGFyYW1ldGVyICthZGRfbGFiZWwrIGlzICt0cnVlKywgYSBcbGFiZWwgY29tbWFuZCB3aWxsIGFsc28gYmUgdXNlZAorICAgICAgIyBhZGRpdGlvbmFsbHkgdG8gdGhlIFxoeXBlcnRhcmdldCBjb21tYW5kLgorICAgICAgZGVmIGxhdGV4X2xpbmtfdGFyZ2V0KGVsLCBhZGRfbGFiZWwgPSBmYWxzZSkKKyAgICAgICAgaWYgKGlkID0gZWwuYXR0clsnaWQnXSkKKyAgICAgICAgICAiXFxoeXBlcnRhcmdldHsje2lkfX17fSIgPDwgKGFkZF9sYWJlbCA/ICJcXGxhYmVseyN7aWR9fSIgOiAnJykKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5pbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybiBhIExhVGVYIGNvbW1lbnQgY29udGFpbmluZyBhbGwgYXR0cmlidXRlcyBhcyAna2V5PSJ2YWx1ZSInIHBhaXJzLgorICAgICAgZGVmIGF0dHJpYnV0ZV9saXN0KGVsKQorICAgICAgICBhdHRycyA9IGVsLmF0dHIubWFwIHt8ayx2fCB2Lm5pbD8gPyAnJyA6ICIgI3trfT1cIiN7di50b19zfVwiIn0uY29tcGFjdC5zb3J0LmpvaW4oJycpCisgICAgICAgIGF0dHJzID0gIiAgICUgI3thdHRyc30iIGlmICFhdHRycy5lbXB0eT8KKyAgICAgICAgYXR0cnMKKyAgICAgIGVuZAorCisgICAgICBFU0NBUEVfTUFQID0geworICAgICAgICAiXiIgID0+ICJcXF57fSIsCisgICAgICAgICJcXCIgPT4gIlxcdGV4dGJhY2tzbGFzaHt9IiwKKyAgICAgICAgIn4iICA9PiAiXFxlbnN1cmVtYXRoe1xcc2ltfSIsCisgICAgICAgICJ8IiAgPT4gIlxcdGV4dGJhcnt9IiwKKyAgICAgICAgIjwiICA9PiAiXFx0ZXh0bGVzc3t9IiwKKyAgICAgICAgIj4iICA9PiAiXFx0ZXh0Z3JlYXRlcnt9IgorICAgICAgfS5tZXJnZShIYXNoWyooInt9JCUmXyMiLnNjYW4oLy4vKS5tYXAge3xjfCBbYywgIlxcI3tjfSJdfS5mbGF0dGVuKV0pICMgOm5vZG9jOgorICAgICAgRVNDQVBFX1JFID0gUmVnZXhwLnVuaW9uKCpFU0NBUEVfTUFQLmNvbGxlY3Qge3xrLHZ8IGt9KSAjIDpub2RvYzoKKworICAgICAgIyBFc2NhcGUgdGhlIHNwZWNpYWwgTGFUZVggY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nICtzdHIrLgorICAgICAgZGVmIGVzY2FwZShzdHIpCisgICAgICAgIHN0ci5nc3ViKEVTQ0FQRV9SRSkge3xtfCBFU0NBUEVfTUFQW21dfQorICAgICAgZW5kCisKKyAgICBlbmQKKworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvbWFuLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvbWFuLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NWY1NmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9tYW4ucmIKQEAgLTAsMCArMSwzMDMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAna3JhbWRvd24vY29udmVydGVyJworCittb2R1bGUgS3JhbWRvd24KKworICBtb2R1bGUgQ29udmVydGVyCisKKyAgICAjIENvbnZlcnRzIGEgS3JhbWRvd246OkRvY3VtZW50IHRvIGEgbWFucGFnZSBpbiBncm9mZiBmb3JtYXQuIFNlZSBtYW4oNyksIGdyb2ZmX21hbig3KSBhbmQKKyAgICAjIG1hbi1wYWdlcyg3KSBmb3IgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBvdXRwdXQuCisgICAgY2xhc3MgTWFuIDwgQmFzZQorCisgICAgICBkZWYgY29udmVydChlbCwgb3B0cyA9IHs6aW5kZW50ID0+IDAsIDpyZXN1bHQgPT4gJyd9KSAjOm5vZG9jOgorICAgICAgICBzZW5kKCJjb252ZXJ0XyN7ZWwudHlwZX0iLCBlbCwgb3B0cykKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBpbm5lcihlbCwgb3B0cywgdXNlID0gOmFsbCkKKyAgICAgICAgYXJyID0gZWwuY2hpbGRyZW4ucmVqZWN0IHt8ZXwgZS50eXBlID09IDpibGFua30KKyAgICAgICAgYXJyLmVhY2hfd2l0aF9pbmRleCBkbyB8aW5uZXJfZWwsIGluZGV4fAorICAgICAgICAgIG5leHQgaWYgdXNlID09IDpyZXN0ICYmIGluZGV4ID09IDAKKyAgICAgICAgICBicmVhayBpZiB1c2UgPT0gOmZpcnN0ICYmIGluZGV4ID4gMAorICAgICAgICAgIG9wdGlvbnMgPSBvcHRzLmR1cAorICAgICAgICAgIG9wdGlvbnNbOnBhcmVudF0gPSBlbAorICAgICAgICAgIG9wdGlvbnNbOmluZGV4XSA9IGluZGV4CisgICAgICAgICAgb3B0aW9uc1s6cHJldl0gPSAoaW5kZXggPT0gMCA/IG5pbCA6IGFycltpbmRleCAtIDFdKQorICAgICAgICAgIG9wdGlvbnNbOm5leHRdID0gKGluZGV4ID09IGFyci5sZW5ndGggLSAxID8gbmlsIDogYXJyW2luZGV4ICsgMV0pCisgICAgICAgICAgY29udmVydChpbm5lcl9lbCwgb3B0aW9ucykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfcm9vdChlbCwgb3B0cykKKyAgICAgICAgQHRpdGxlX2RvbmUgPSBmYWxzZQorICAgICAgICBvcHRzWzpyZXN1bHRdID0gIi5cXFwiIGdlbmVyYXRlZCBieSBrcmFtZG93blxuIgorICAgICAgICBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2JsYW5rKCopCisgICAgICBlbmQKKyAgICAgIGFsaWFzIDpjb252ZXJ0X2hyIDpjb252ZXJ0X2JsYW5rCisgICAgICBhbGlhcyA6Y29udmVydF94bWxfcGkgOmNvbnZlcnRfYmxhbmsKKworICAgICAgZGVmIGNvbnZlcnRfcChlbCwgb3B0cykKKyAgICAgICAgaWYgKG9wdHNbOmluZGV4XSAhPSAwICYmIG9wdHNbOnByZXZdLnR5cGUgIT0gOmhlYWRlcikgfHwKKyAgICAgICAgICAgIChvcHRzWzpwYXJlbnRdLnR5cGUgPT0gOmJsb2NrcXVvdGUgJiYgb3B0c1s6aW5kZXhdID09IDApCisgICAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiUCIpCisgICAgICAgIGVuZAorICAgICAgICBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgbmV3bGluZShvcHRzWzpyZXN1bHRdKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2hlYWRlcihlbCwgb3B0cykKKyAgICAgICAgcmV0dXJuIHVubGVzcyBvcHRzWzpwYXJlbnRdLnR5cGUgPT0gOnJvb3QKKyAgICAgICAgY2FzZSBlbC5vcHRpb25zWzpsZXZlbF0KKyAgICAgICAgd2hlbiAxCisgICAgICAgICAgdW5sZXNzIEB0aXRsZV9kb25lCisgICAgICAgICAgICBAdGl0bGVfZG9uZSA9IHRydWUKKyAgICAgICAgICAgIGRhdGEgPSBlbC5vcHRpb25zWzpyYXdfdGV4dF0uc2NhbigvKFteKF0rKVxzKlwoKFxkXHcqKVwpKD86XHMqLStccyooLiopKT8vKS5maXJzdCB8fAorICAgICAgICAgICAgICBlbC5vcHRpb25zWzpyYXdfdGV4dF0uc2NhbigvKFteXHNdKylccyooPzotKlxzKyk/KCkoLiopLykuZmlyc3QKKyAgICAgICAgICAgIHJldHVybiB1bmxlc3MgZGF0YSAmJiBkYXRhWzBdCisgICAgICAgICAgICBuYW1lID0gZGF0YVswXQorICAgICAgICAgICAgc2VjdGlvbiA9IChkYXRhWzFdLnRvX3MuZW1wdHk/ID8gZWwuYXR0clsnZGF0YS1zZWN0aW9uJ10gfHwgJzcnIDogZGF0YVsxXSkKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gKGRhdGFbMl0udG9fcy5lbXB0eT8gPyBuaWwgOiAiIC0gI3tkYXRhWzJdfSIpCisgICAgICAgICAgICBkYXRlID0gZWwuYXR0clsnZGF0YS1kYXRlJ10gPyBxdW90ZShlbC5hdHRyWydkYXRhLWRhdGUnXSkgOiBuaWwKKyAgICAgICAgICAgIGV4dHJhID0gKGVsLmF0dHJbJ2RhdGEtZXh0cmEnXSA/IHF1b3RlKGVzY2FwZShlbC5hdHRyWydkYXRhLWV4dHJhJ10udG9fcykpIDogbmlsKQorICAgICAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiVEgiLCBxdW90ZShlc2NhcGUobmFtZS51cGNhc2UpKSwgcXVvdGUoc2VjdGlvbiksIGRhdGUsIGV4dHJhKQorICAgICAgICAgICAgaWYgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiU0giLCAiTkFNRSIpIDw8IGVzY2FwZSgiI3tuYW1lfSN7ZGVzY3JpcHRpb259IikgPDwgIlxuIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIHdoZW4gMgorICAgICAgICAgIG9wdHNbOnJlc3VsdF0gPDwgbWFjcm8oIlNIIiwgcXVvdGUoZXNjYXBlKGVsLm9wdGlvbnNbOnJhd190ZXh0XSkpKQorICAgICAgICB3aGVuIDMKKyAgICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IG1hY3JvKCJTUyIsIHF1b3RlKGVzY2FwZShlbC5vcHRpb25zWzpyYXdfdGV4dF0pKSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdhcm5pbmcoIkhlYWRlciBsZXZlbHMgZ3JlYXRlciB0aGFuIHRocmVlIGFyZSBub3Qgc3VwcG9ydGVkIikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfY29kZWJsb2NrKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IG1hY3JvKCJzcCIpIDw8IG1hY3JvKCJSUyIsIDQpIDw8IG1hY3JvKCJFWCIpCisgICAgICAgIG9wdHNbOnJlc3VsdF0gPDwgbmV3bGluZShlc2NhcGUoZWwudmFsdWUsIHRydWUpKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IG1hY3JvKCJFRSIpIDw8IG1hY3JvKCJSRSIpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfYmxvY2txdW90ZShlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiUlMiKQorICAgICAgICBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiUkUiKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3VsKGVsLCBvcHRzKQorICAgICAgICBjb21wYWN0ID0gKGVsLmF0dHJbJ2NsYXNzJ10gPX4gL1xiY29tcGFjdFxiLykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygic3AiKSA8PCBtYWNybygiUEQiLCAwKSBpZiBjb21wYWN0CisgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IG1hY3JvKCJQRCIpIGlmIGNvbXBhY3QKKyAgICAgIGVuZAorICAgICAgYWxpYXMgOmNvbnZlcnRfZGwgOmNvbnZlcnRfdWwKKyAgICAgIGFsaWFzIDpjb252ZXJ0X29sIDpjb252ZXJ0X3VsCisKKyAgICAgIGRlZiBjb252ZXJ0X2xpKGVsLCBvcHRzKQorICAgICAgICBzeW0gPSAob3B0c1s6cGFyZW50XS50eXBlID09IDp1bCA/ICdcKGJ1JyA6ICIje29wdHNbOmluZGV4XSArIDF9LiIpCisgICAgICAgIG9wdHNbOnJlc3VsdF0gPDwgbWFjcm8oIklQIiwgc3ltLCA0KQorICAgICAgICBpbm5lcihlbCwgb3B0cywgOmZpcnN0KQorICAgICAgICBpZiBlbC5jaGlsZHJlbi5zaXplID4gMQorICAgICAgICAgIG9wdHNbOnJlc3VsdF0gPDwgbWFjcm8oIlJTIikKKyAgICAgICAgICBpbm5lcihlbCwgb3B0cywgOnJlc3QpCisgICAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiUkUiKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9kdChlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybyhvcHRzWzpwcmV2XSAmJiBvcHRzWzpwcmV2XS50eXBlID09IDpkdCA/ICJUUSIgOiAiVFAiKQorICAgICAgICBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCAiXG4iCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfZGQoZWwsIG9wdHMpCisgICAgICAgIGlubmVyKGVsLCBvcHRzLCA6Zmlyc3QpCisgICAgICAgIGlmIGVsLmNoaWxkcmVuLnNpemUgPiAxCisgICAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiUlMiKQorICAgICAgICAgIGlubmVyKGVsLCBvcHRzLCA6cmVzdCkKKyAgICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IG1hY3JvKCJSRSIpCisgICAgICAgIGVuZAorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IG1hY3JvKCJzcCIpIGlmIG9wdHNbOm5leHRdICYmIG9wdHNbOm5leHRdLnR5cGUgPT0gOmRkCisgICAgICBlbmQKKworICAgICAgVEFCTEVfQ0VMTF9BTElHTk1FTlQgPSB7OmxlZnQgPT4gJ2wnLCA6Y2VudGVyID0+ICdjJywgOnJpZ2h0ID0+ICdyJywgOmRlZmF1bHQgPT4gJ2wnfQorCisgICAgICBkZWYgY29udmVydF90YWJsZShlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6YWxpZ25tZW50XSA9IGVsLm9wdGlvbnNbOmFsaWdubWVudF0ubWFwIHt8YXwgVEFCTEVfQ0VMTF9BTElHTk1FTlRbYV19CisgICAgICAgIHRhYmxlX29wdGlvbnMgPSBbImJveCJdCisgICAgICAgIHRhYmxlX29wdGlvbnMgPDwgImNlbnRlciIgaWYgZWwuYXR0clsnY2xhc3MnXSA9fiAvXGJjZW50ZXJcYi8KKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiVFMiKSA8PCAiI3t0YWJsZV9vcHRpb25zLmpvaW4oIiAiKX0gO1xuIgorICAgICAgICBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBtYWNybygiVEUiKSA8PCBtYWNybygic3AiKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3RoZWFkKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IG9wdHNbOmFsaWdubWVudF0ubWFwIHt8YXwgIiN7YX1iIn0uam9pbignICcpIDw8ICIgLlxuIgorICAgICAgICBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCAiPVxuIgorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3Rib2R5KGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8ICIuVCZcbiIgaWYgb3B0c1s6aW5kZXhdICE9IDAKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBvcHRzWzphbGlnbm1lbnRdLmpvaW4oJyAnKSA8PCAiIC5cbiIKKyAgICAgICAgaW5uZXIoZWwsIG9wdHMpCisgICAgICAgIG9wdHNbOnJlc3VsdF0gPDwgKG9wdHNbOm5leHRdLnR5cGUgPT0gOnRmb290ID8gIj1cbiIgOiAiX1xuIikgaWYgb3B0c1s6bmV4dF0KKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF90Zm9vdChlbCwgb3B0cykKKyAgICAgICAgaW5uZXIoZWwsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfdHIoZWwsIG9wdHMpCisgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8ICJcbiIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF90ZChlbCwgb3B0cykKKyAgICAgICAgcmVzdWx0ID0gb3B0c1s6cmVzdWx0XQorICAgICAgICBvcHRzWzpyZXN1bHRdID0gJycKKyAgICAgICAgaW5uZXIoZWwsIG9wdHMpCisgICAgICAgIGlmIG9wdHNbOnJlc3VsdF0gPX4gL1xuLworICAgICAgICAgIHdhcm5pbmcoIlRhYmxlIGNlbGxzIHVzaW5nIGxpbmtzIGFyZSBub3Qgc3VwcG9ydGVkIikKKyAgICAgICAgICByZXN1bHQgPDwgIlx0IgorICAgICAgICBlbHNlCisgICAgICAgICAgcmVzdWx0IDw8IG9wdHNbOnJlc3VsdF0gPDwgIlx0IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9odG1sX2VsZW1lbnQoKikKKyAgICAgICAgd2FybmluZygiSFRNTCBlbGVtZW50cyBhcmUgbm90IHN1cHBvcnRlZCIpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfeG1sX2NvbW1lbnQoZWwsIG9wdHMpCisgICAgICAgIG5ld2xpbmUob3B0c1s6cmVzdWx0XSkgPDwgIi5cIiN7ZXNjYXBlKGVsLnZhbHVlLCB0cnVlKS5yc3RyaXAuZ3N1YigvXG4vLCAiXG4uXCIiKX1cbiIKKyAgICAgIGVuZAorICAgICAgYWxpYXMgOmNvbnZlcnRfY29tbWVudCA6Y29udmVydF94bWxfY29tbWVudAorCisKKyAgICAgIGRlZiBjb252ZXJ0X2EoZWwsIG9wdHMpCisgICAgICAgIGlmIGVsLmNoaWxkcmVuLnNpemUgPT0gMSAmJiBlbC5jaGlsZHJlblswXS50eXBlID09IDp0ZXh0ICYmCisgICAgICAgICAgICBlbC5hdHRyWydocmVmJ10gPT0gZWwuY2hpbGRyZW5bMF0udmFsdWUKKyAgICAgICAgICBuZXdsaW5lKG9wdHNbOnJlc3VsdF0pIDw8IG1hY3JvKCJVUiIsIGVzY2FwZShlbC5hdHRyWydocmVmJ10pKSA8PCBtYWNybygiVUUiKQorICAgICAgICBlbHNpZiBlbC5hdHRyWydocmVmJ10uc3RhcnRfd2l0aD8oJ21haWx0bzonKQorICAgICAgICAgIG5ld2xpbmUob3B0c1s6cmVzdWx0XSkgPDwgbWFjcm8oIk1UIiwgZXNjYXBlKGVsLmF0dHJbJ2hyZWYnXS5zdWIoL15tYWlsdG86LywgJycpKSkgPDwKKyAgICAgICAgICAgIG1hY3JvKCJVRSIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBuZXdsaW5lKG9wdHNbOnJlc3VsdF0pIDw8IG1hY3JvKCJVUiIsIGVzY2FwZShlbC5hdHRyWydocmVmJ10pKQorICAgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgICAgIG5ld2xpbmUob3B0c1s6cmVzdWx0XSkgPDwgbWFjcm8oIlVFIikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfaW1nKGVsLCBvcHRzKQorICAgICAgICB3YXJuaW5nKCJJbWFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2VtKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8ICdcZkknCisgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8ICdcZlAnCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfc3Ryb25nKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8ICdcZkInCisgICAgICAgIGlubmVyKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8ICdcZlAnCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfY29kZXNwYW4oZWwsIG9wdHMpCisgICAgICAgIG9wdHNbOnJlc3VsdF0gPDwgIlxcZkIje2VzY2FwZShlbC52YWx1ZSl9XFxmUCIKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9icihlbCwgb3B0cykKKyAgICAgICAgbmV3bGluZShvcHRzWzpyZXN1bHRdKSA8PCBtYWNybygiYnIiKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X2FiYnJldmlhdGlvbihlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBlc2NhcGUoZWwudmFsdWUpCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfbWF0aChlbCwgb3B0cykKKyAgICAgICAgaWYgZWwub3B0aW9uc1s6Y2F0ZWdvcnldID09IDpibG9jaworICAgICAgICAgIGNvbnZlcnRfY29kZWJsb2NrKGVsLCBvcHRzKQorICAgICAgICBlbHNlCisgICAgICAgICAgY29udmVydF9jb2Rlc3BhbihlbCwgb3B0cykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfZm9vdG5vdGUoKikKKyAgICAgICAgd2FybmluZygiRm9vdG5vdGVzIGFyZSBub3Qgc3VwcG9ydGVkIikKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydF9yYXcoKikKKyAgICAgICAgd2FybmluZygiUmF3IGNvbnRlbnQgaXMgbm90IHN1cHBvcnRlZCIpCisgICAgICBlbmQKKworCisKKyAgICAgIGRlZiBjb252ZXJ0X3RleHQoZWwsIG9wdHMpCisgICAgICAgIHRleHQgPSBlc2NhcGUoZWwudmFsdWUpCisgICAgICAgIHRleHQubHN0cmlwISBpZiBvcHRzWzpyZXN1bHRdWy0xXSA9PSA/XG4KKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCB0ZXh0CisgICAgICBlbmQKKworICAgICAgZGVmIGNvbnZlcnRfZW50aXR5KGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IHVuaWNvZGVfY2hhcihlbC52YWx1ZS5jb2RlX3BvaW50KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0X3NtYXJ0X3F1b3RlKGVsLCBvcHRzKQorICAgICAgICBvcHRzWzpyZXN1bHRdIDw8IHVuaWNvZGVfY2hhcig6OktyYW1kb3duOjpVdGlsczo6RW50aXRpZXMuZW50aXR5KGVsLnZhbHVlLnRvX3MpLmNvZGVfcG9pbnQpCisgICAgICBlbmQKKworICAgICAgVFlQT0dSQVBISUNfU1lNU19NQVAgPSB7CisgICAgICAgIDptZGFzaCA9PiAnXChlbScsIDpuZGFzaCA9PiAnXChlbScsIDpoZWxsaXAgPT4gJ1wuXC5cLicsCisgICAgICAgIDpsYXF1b19zcGFjZSA9PiAnXFtGb10nLCA6cmFxdW9fc3BhY2UgPT4gJ1xbRmNdJywgOmxhcXVvID0+ICdcW0ZvXScsIDpyYXF1byA9PiAnXFtGY10nCisgICAgICB9CisKKyAgICAgIGRlZiBjb252ZXJ0X3R5cG9ncmFwaGljX3N5bShlbCwgb3B0cykKKyAgICAgICAgb3B0c1s6cmVzdWx0XSA8PCBUWVBPR1JBUEhJQ19TWU1TX01BUFtlbC52YWx1ZV0KKyAgICAgIGVuZAorCisgICAgICBkZWYgbWFjcm8obmFtZSwgKmFyZ3MpCisgICAgICAgICIuI3tbbmFtZSwgKmFyZ3NdLmNvbXBhY3Quam9pbignICcpfVxuIgorICAgICAgZW5kCisKKyAgICAgIGRlZiBuZXdsaW5lKHRleHQpCisgICAgICAgIHRleHQgPDwgIlxuIiB1bmxlc3MgdGV4dFstMV0gPT0gP1xuCisgICAgICAgIHRleHQKKyAgICAgIGVuZAorCisgICAgICBkZWYgcXVvdGUodGV4dCkKKyAgICAgICAgIlwiI3t0ZXh0LmdzdWIoLyIvLCAnXFwiJyl9XCIiCisgICAgICBlbmQKKworICAgICAgZGVmIGVzY2FwZSh0ZXh0LCBwcmVzZXJ2ZV93aGl0ZXNwYWNlID0gZmFsc2UpCisgICAgICAgIHRleHQgPSAocHJlc2VydmVfd2hpdGVzcGFjZSA/IHRleHQuZHVwIDogdGV4dC5nc3ViKC9ccysvLCAnICcpKQorICAgICAgICB0ZXh0LmdzdWIhKCdcXCcsICJcXGUiKQorICAgICAgICB0ZXh0LmdzdWIhKC9eXC4vLCAnXFxcXCYuJykKKyAgICAgICAgdGV4dC5nc3ViISgvWy4nLV0vKSB7fG18ICJcXCN7bX0ifQorICAgICAgICB0ZXh0CisgICAgICBlbmQKKworICAgICAgZGVmIHVuaWNvZGVfY2hhcihjb2RlcG9pbnQpCisgICAgICAgICJcXFt1I3tjb2RlcG9pbnQudG9fcygxNikucmp1c3QoNCwgJzAnKX1dIgorICAgICAgZW5kCisKKyAgICBlbmQKKworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvbWF0aF9lbmdpbmUvaXRleDJtbWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9tYXRoX2VuZ2luZS9pdGV4Mm1tbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTAwYWNjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvbWF0aF9lbmdpbmUvaXRleDJtbWwucmIKQEAgLTAsMCArMSwzOSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCittb2R1bGUgS3JhbWRvd246OkNvbnZlcnRlcjo6TWF0aEVuZ2luZQorCisgICMgVXNlcyB0aGUgSXRleDJNTUwgbGlicmFyeSBmb3IgY29udmVydGluZyBtYXRoIGZvcm11bGFzIHRvIE1hdGhNTC4KKyAgbW9kdWxlIEl0ZXgyTU1MCisKKyAgICBiZWdpbgorICAgICAgcmVxdWlyZSAnaXRleHRvbW1sJworCisgICAgICAjIEl0ZXgyTU1MIGlzIGF2YWlsYWJsZSBpZiB0aGlzIGNvbnN0YW50IGlzICt0cnVlKy4KKyAgICAgIEFWQUlMQUJMRSA9IHRydWUKKyAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICBBVkFJTEFCTEUgPSBmYWxzZSAgIyA6bm9kb2M6CisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5jYWxsKGNvbnZlcnRlciwgZWwsIG9wdHMpCisgICAgICB0eXBlID0gZWwub3B0aW9uc1s6Y2F0ZWdvcnldCisgICAgICBwYXJzZXIgPSA6Okl0ZXgyTU1MOjpQYXJzZXIubmV3CisgICAgICByZXN1bHQgPSAodHlwZSA9PSA6YmxvY2sgPyBwYXJzZXIuYmxvY2tfZmlsdGVyKGVsLnZhbHVlKSA6IHBhcnNlci5pbmxpbmVfZmlsdGVyKGVsLnZhbHVlKSkKKworICAgICAgYXR0ciA9IGVsLmF0dHIuZHVwCisgICAgICBhdHRyLmRlbGV0ZSgneG1sbnMnKQorICAgICAgYXR0ci5kZWxldGUoJ2Rpc3BsYXknKQorICAgICAgcmVzdWx0Lmluc2VydCgiPG1hdGgiLmxlbmd0aCwgY29udmVydGVyLmh0bWxfYXR0cmlidXRlcyhhdHRyKSkKKworICAgICAgKHR5cGUgPT0gOmJsb2NrID8gIiN7JyAnKm9wdHNbOmluZGVudF19I3tyZXN1bHR9XG4iIDogcmVzdWx0KQorICAgIGVuZAorCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL21hdGhfZW5naW5lL21hdGhqYXgucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9tYXRoX2VuZ2luZS9tYXRoamF4LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTExMWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9tYXRoX2VuZ2luZS9tYXRoamF4LnJiCkBAIC0wLDAgKzEsNTggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duOjpDb252ZXJ0ZXI6Ok1hdGhFbmdpbmUKKworICAjIFVzZXMgdGhlIE1hdGhKYXggamF2YXNjcmlwdCBsaWJyYXJ5IGZvciBkaXNwbGF5aW5nIG1hdGguCisgICMKKyAgIyBOb3RlIHRoYXQgdGhlIGphdmFzY3JpcHQgbGlicmFyeSBpdHNlbGYgaXMgbm90IGluY2x1ZGUgb3IgbGlua2VkLCB0aGlzIGhhcyB0byBiZSBkb25lCisgICMgc2VwYXJhdGVseS4gT25seSB0aGUgbWF0aCBjb250ZW50IGlzIG1hcmtlZCB1cCBjb3JyZWN0bHkuCisgIG1vZHVsZSBNYXRoamF4CisKKyAgICBkZWYgc2VsZi5jYWxsKGNvbnZlcnRlciwgZWwsIG9wdHMpCisgICAgICB0eXBlID0gZWwub3B0aW9uc1s6Y2F0ZWdvcnldCisgICAgICB0ZXh0ID0gKGVsLnZhbHVlID1+IC88fCYvID8gIiUgPCFbQ0RBVEFbXG4je2VsLnZhbHVlfSAlXV0+IiA6IGVsLnZhbHVlKQorICAgICAgdGV4dC5nc3ViISgvPFwvP3NjcmlwdD4/LywgJycpCisKKyAgICAgIHByZXZpZXcgPSBwcmV2aWV3X3N0cmluZyhjb252ZXJ0ZXIsIGVsLCBvcHRzKQorCisgICAgICBhdHRyID0gezp0eXBlID0+ICJtYXRoL3RleCN7dHlwZSA9PSA6YmxvY2sgPyAnOyBtb2RlPWRpc3BsYXknIDogJyd9In0KKyAgICAgIGlmIHR5cGUgPT0gOmJsb2NrCisgICAgICAgIHByZXZpZXcgPDwgY29udmVydGVyLmZvcm1hdF9hc19ibG9ja19odG1sKCdzY3JpcHQnLCBhdHRyLCB0ZXh0LCBvcHRzWzppbmRlbnRdKQorICAgICAgZWxzZQorICAgICAgICBwcmV2aWV3IDw8IGNvbnZlcnRlci5mb3JtYXRfYXNfc3Bhbl9odG1sKCdzY3JpcHQnLCBhdHRyLCB0ZXh0KQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5wcmV2aWV3X3N0cmluZyhjb252ZXJ0ZXIsIGVsLCBvcHRzKQorICAgICAgcHJldmlldyA9IGNvbnZlcnRlci5vcHRpb25zWzptYXRoX2VuZ2luZV9vcHRzXVs6cHJldmlld10KKyAgICAgIHJldHVybiAnJyB1bmxlc3MgcHJldmlldworCisgICAgICBwcmV2aWV3ID0gKHByZXZpZXcgPT0gdHJ1ZSA/IGNvbnZlcnRlci5lc2NhcGVfaHRtbChlbC52YWx1ZSkgOiBwcmV2aWV3LnRvX3MpCisKKyAgICAgIHByZXZpZXdfYXNfY29kZSA9IGNvbnZlcnRlci5vcHRpb25zWzptYXRoX2VuZ2luZV9vcHRzXVs6cHJldmlld19hc19jb2RlXQorCisgICAgICBpZiBlbC5vcHRpb25zWzpjYXRlZ29yeV0gPT0gOmJsb2NrCisgICAgICAgIGlmIHByZXZpZXdfYXNfY29kZQorICAgICAgICAgIGNvbnZlcnRlci5mb3JtYXRfYXNfYmxvY2tfaHRtbCgncHJlJywgeydjbGFzcycgPT4gJ01hdGhKYXhfUHJldmlldyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuZm9ybWF0X2FzX3NwYW5faHRtbCgnY29kZScsIHt9LCBwcmV2aWV3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0c1s6aW5kZW50XSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnZlcnRlci5mb3JtYXRfYXNfYmxvY2tfaHRtbCgnZGl2JywgeydjbGFzcycgPT4gJ01hdGhKYXhfUHJldmlldyd9LCBwcmV2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzWzppbmRlbnRdKQorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgY29udmVydGVyLmZvcm1hdF9hc19zcGFuX2h0bWwocHJldmlld19hc19jb2RlID8gJ2NvZGUnIDogJ3NwYW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2NsYXNzJyA9PiAnTWF0aEpheF9QcmV2aWV3J30sIHByZXZpZXcpCisgICAgICBlbmQKKyAgICBlbmQKKworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9tYXRoX2VuZ2luZS9tYXRoamF4bm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL21hdGhfZW5naW5lL21hdGhqYXhub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MGRmYTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9tYXRoX2VuZ2luZS9tYXRoamF4bm9kZS5yYgpAQCAtMCwwICsxLDU2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bjo6Q29udmVydGVyOjpNYXRoRW5naW5lCisKKyAgIyBVc2VzIHRoZSBtYXRoamF4LW5vZGUgbGlicmFyeSBmb3IgY29udmVydGluZyBtYXRoIGZvcm11bGFzIHRvIE1hdGhNTC4KKyAgbW9kdWxlIE1hdGhqYXhOb2RlCisKKyAgICAjIE1hdGhqYXhOb2RlIGlzIGF2YWlsYWJsZSBpZiB0aGlzIGNvbnN0YW50IGlzICt0cnVlKy4KKyAgICBBVkFJTEFCTEUgPSBSVUJZX1ZFUlNJT04gPj0gJzEuOScgJiYgYmVnaW4KKyAgICAgICV4e25vZGUgLS12ZXJzaW9ufVsxLi4tMl0gPj0gJzQuMCcKKyAgICByZXNjdWUKKyAgICAgIGJlZ2luCisgICAgICAgICV4e25vZGVqcyAtLXZlcnNpb259WzEuLi0yXSA+PSAnNC4wJworICAgICAgcmVzY3VlCisgICAgICAgIGZhbHNlCisgICAgICBlbmQKKyAgICBlbmQgJiYgYmVnaW4KKyAgICAgIG5wbSA9ICV4e25wbSAtLWdsb2JhbCAtLWRlcHRoPTEgbGlzdCBtYXRoamF4LW5vZGUgMj4mMX0KKworICAgICAgdW5sZXNzIC9tYXRoamF4LW5vZGVALyA9PT0gbnBtLmxpbmVzLmRyb3AoMSkuam9pbigiXG4iKQorICAgICAgICBucG0gPSAleHtucG0gLS1kZXB0aD0xIGxpc3QgbWF0aGpheC1ub2RlIDI+JjF9CisgICAgICBlbmQKKworICAgICAgVDJNUEFUSCA9IEZpbGUuam9pbihucG0ubGluZXMuZmlyc3Quc3RyaXAsICJub2RlX21vZHVsZXMvbWF0aGpheC1ub2RlL2Jpbi90ZXgybW1sIikKKyAgICAgIC9tYXRoamF4LW5vZGVALyA9PT0gbnBtLmxpbmVzLmRyb3AoMSkuam9pbigiXG4iKSAmJiBGaWxlLmV4aXN0PyhUMk1QQVRIKQorICAgIHJlc2N1ZQorICAgICAgZmFsc2UKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmNhbGwoY29udmVydGVyLCBlbCwgb3B0cykKKyAgICAgIHR5cGUgPSBlbC5vcHRpb25zWzpjYXRlZ29yeV0KKworICAgICAgY21kID0gW1QyTVBBVEhdCisgICAgICBjbWQgPDwgIi0taW5saW5lIiB1bmxlc3MgdHlwZSA9PSA6YmxvY2sKKyAgICAgIGNtZCA8PCAiLS1zZW1hbnRpY3MiIGlmIGNvbnZlcnRlci5vcHRpb25zWzptYXRoX2VuZ2luZV9vcHRzXVs6c2VtYW50aWNzXSA9PSB0cnVlCisgICAgICBjbWQgPDwgIi0tbm90ZXhoaW50cyIgaWYgY29udmVydGVyLm9wdGlvbnNbOm1hdGhfZW5naW5lX29wdHNdWzp0ZXhoaW50c10gPT0gZmFsc2UKKyAgICAgIHJlc3VsdCA9IElPLnBvcGVuKGNtZCA8PCBlbC52YWx1ZSkucmVhZC5zdHJpcAorCisgICAgICBhdHRyID0gZWwuYXR0ci5kdXAKKyAgICAgIGF0dHIuZGVsZXRlKCd4bWxucycpCisgICAgICBhdHRyLmRlbGV0ZSgnZGlzcGxheScpCisgICAgICByZXN1bHQuaW5zZXJ0KCI8bWF0aCIubGVuZ3RoLCBjb252ZXJ0ZXIuaHRtbF9hdHRyaWJ1dGVzKGF0dHIpKQorCisgICAgICAodHlwZSA9PSA6YmxvY2sgPyAiI3snICcqb3B0c1s6aW5kZW50XX0je3Jlc3VsdH1cbiIgOiByZXN1bHQpCisgICAgZW5kCisKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvbWF0aF9lbmdpbmUvcml0ZXgucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9tYXRoX2VuZ2luZS9yaXRleC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2I0YWEwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvbWF0aF9lbmdpbmUvcml0ZXgucmIKQEAgLTAsMCArMSwzOCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCittb2R1bGUgS3JhbWRvd246OkNvbnZlcnRlcjo6TWF0aEVuZ2luZQorCisgICMgVXNlcyB0aGUgUml0ZXggbGlicmFyeSBmb3IgY29udmVydGluZyBtYXRoIGZvcm11bGFzIHRvIE1hdGhNTC4KKyAgbW9kdWxlIFJpdGV4CisKKyAgICBiZWdpbgorICAgICAgcmVxdWlyZSAncml0ZXgnCisKKyAgICAgICMgUml0ZXggaXMgYXZhaWxhYmxlIGlmIHRoaXMgY29uc3RhbnQgaXMgK3RydWUrLgorICAgICAgQVZBSUxBQkxFID0gdHJ1ZQorICAgIHJlc2N1ZSBMb2FkRXJyb3IKKyAgICAgIEFWQUlMQUJMRSA9IGZhbHNlICAjIDpub2RvYzoKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmNhbGwoY29udmVydGVyLCBlbCwgb3B0cykKKyAgICAgIHR5cGUgPSBlbC5vcHRpb25zWzpjYXRlZ29yeV0KKyAgICAgIHJlc3VsdCA9IDo6Uml0ZXg6OlBhcnNlci5uZXcucGFyc2UoZWwudmFsdWUsIDpkaXNwbGF5ID0+ICh0eXBlID09IDpibG9jaykpCisKKyAgICAgIGF0dHIgPSBlbC5hdHRyLmR1cAorICAgICAgYXR0ci5kZWxldGUoJ3htbG5zJykKKyAgICAgIGF0dHIuZGVsZXRlKCdkaXNwbGF5JykKKyAgICAgIHJlc3VsdC5pbnNlcnQoIjxtYXRoIi5sZW5ndGgsIGNvbnZlcnRlci5odG1sX2F0dHJpYnV0ZXMoYXR0cikpCisKKyAgICAgICh0eXBlID09IDpibG9jayA/ICIjeycgJypvcHRzWzppbmRlbnRdfSN7cmVzdWx0fVxuIiA6IHJlc3VsdCkKKyAgICBlbmQKKworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9wZGYucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9wZGYucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhOWM4NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL3BkZi5yYgpAQCAtMCwwICsxLDYyNSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdwcmF3bicKK3JlcXVpcmUgJ3ByYXduL3RhYmxlJworcmVxdWlyZSAna3JhbWRvd24vY29udmVydGVyJworcmVxdWlyZSAna3JhbWRvd24vdXRpbHMnCityZXF1aXJlICdvcGVuLXVyaScKKworbW9kdWxlIEtyYW1kb3duCisKKyAgbW9kdWxlIENvbnZlcnRlcgorCisgICAgIyBDb252ZXJ0cyBhbiBlbGVtZW50IHRyZWUgdG8gYSBQREYgdXNpbmcgdGhlIHByYXduIFBERiBsaWJyYXJ5LgorICAgICMKKyAgICAjIFRoaXMgYmFzaWMgdmVyc2lvbiBwcm92aWRlcyBhIG5pY2Ugc3RhcnRpbmcgcG9pbnQgZm9yIGN1c3RvbWl6YXRpb25zIGJ1dCBjYW4gYWxzbyBiZSB1c2VkCisgICAgIyBkaXJlY3RseS4KKyAgICAjCisgICAgIyBUaGVyZSBjYW4gYmUgdGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBmb3IgZWFjaCBlbGVtZW50IHR5cGU6IHJlbmRlcl9UWVBFKGVsLCBvcHRzKSBhbmQKKyAgICAjIFRZUEVfb3B0aW9ucyhlbCwgb3B0cykgd2hlcmUgK2VsKyBpcyBhIGtyYW1kb3duIGVsZW1lbnQgYW5kICtvcHRzKyBhbiBoYXNoIHdpdGggcmVuZGVyaW5nCisgICAgIyBvcHRpb25zLgorICAgICMKKyAgICAjIFRoZSByZW5kZXJfVFlQRShlbCwgb3B0cykgaXMgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSBzcGVjaWZpYyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCBpcyBhIHNwYW4KKyAgICAjIGVsZW1lbnQsIGl0IHNob3VsZCByZXR1cm4gYSBoYXNoIG9yIGFuIGFycmF5IG9mIGhhc2hlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSAjZm9ybWF0dGVkX3RleHQKKyAgICAjIG1ldGhvZCBvZiBQcmF3bjo6RG9jdW1lbnQuIFRoaXMgbWV0aG9kIGNhbiB0aGVuIGJlIHVzZWQgaW4gYmxvY2sgZWxlbWVudHMgdG8gYWN0dWFsbHkgcmVuZGVyCisgICAgIyB0aGUgc3BhbiBlbGVtZW50cy4KKyAgICAjCisgICAgIyBUaGUgcmVuZGVyaW5nIG9wdGlvbnMgYXJlIHBhc3NlZCBmcm9tIHRoZSBwYXJlbnQgdG8gaXRzIGNoaWxkIGVsZW1lbnRzLiBUaGlzIGFsbG93cyBvbmUgdG8KKyAgICAjIGRlZmluZSBnZW5lcmFsIG9wdGlvbnMgYXQgdGhlIHRvcCBvZiB0aGUgdHJlZSAodGhlIHJvb3QgZWxlbWVudCkgdGhhdCBjYW4gbGF0ZXIgYmUgY2hhbmdlZCBvcgorICAgICMgYW1lbmRlZC4KKyAgICAjCisgICAgIworICAgICMgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBjb252ZXJzaW9uIG9mIGFsbCBlbGVtZW50cyBleGNlcHQgdGhvc2Ugb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKKyAgICAjCisgICAgIyAgIDpodG1sX2VsZW1lbnQsIDppbWcsIDpmb290bm90ZQorICAgICMKKyAgICAjCisgICAgY2xhc3MgUGRmIDwgQmFzZQorCisgICAgICBpbmNsdWRlIFByYXduOjpNZWFzdXJlbWVudHMKKworICAgICAgZGVmIGluaXRpYWxpemUocm9vdCwgb3B0aW9ucykKKyAgICAgICAgc3VwZXIKKyAgICAgICAgQHN0YWNrID0gW10KKyAgICAgICAgQGRlc3RzID0ge30KKyAgICAgIGVuZAorCisgICAgICAjIFBERiB0ZW1wbGF0ZXMgYXJlIGFwcGxpZWQgYmVmb3JlIGNvbnZlcnNpb24uIFRoZXkgc2hvdWxkIGNvbnRhaW4gY29kZSB0byBhdWdtZW50IHRoZQorICAgICAgIyBjb252ZXJ0ZXIgb2JqZWN0IChpLmUuIHRvIG92ZXJyaWRlIHRoZSBtZXRob2RzKS4KKyAgICAgIGRlZiBhcHBseV90ZW1wbGF0ZV9iZWZvcmU/CisgICAgICAgIHRydWUKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgK2ZhbHNlKy4KKyAgICAgIGRlZiBhcHBseV90ZW1wbGF0ZV9hZnRlcj8KKyAgICAgICAgZmFsc2UKKyAgICAgIGVuZAorCisgICAgICBESVNQQVRDSEVSX1JFTkRFUiA9IEhhc2gubmV3IHt8aCxrfCBoW2tdID0gInJlbmRlcl8je2t9In0gIzpub2RvYzoKKyAgICAgIERJU1BBVENIRVJfT1BUSU9OUyA9IEhhc2gubmV3IHt8aCxrfCBoW2tdID0gIiN7a31fb3B0aW9ucyJ9ICM6bm9kb2M6CisKKyAgICAgICMgSW52b2tlIHRoZSBzcGVjaWFsIHJlbmRlcmluZyBtZXRob2QgZm9yIHRoZSBnaXZlbiBlbGVtZW50ICtlbCsuCisgICAgICAjCisgICAgICAjIEEgUERGIGRlc3RpbmF0aW9uIGlzIGFsc28gYWRkZWQgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaWYgdGggZWxlbWVudCBoYXMgYW4gSUQgb3IgaWYgdGhlCisgICAgICAjIGVsZW1lbnQgaXMgb2YgdHlwZSA6aGVhZGVyIGFuZCB0aGUgOmF1dG9faWRzIG9wdGlvbiBpcyBzZXQuCisgICAgICBkZWYgY29udmVydChlbCwgb3B0cyA9IHt9KQorICAgICAgICBpZCA9IGVsLmF0dHJbJ2lkJ10KKyAgICAgICAgaWQgPSBnZW5lcmF0ZV9pZChlbC5vcHRpb25zWzpyYXdfdGV4dF0pIGlmICFpZCAmJiBAb3B0aW9uc1s6YXV0b19pZHNdICYmIGVsLnR5cGUgPT0gOmhlYWRlcgorICAgICAgICBpZiAhaWQudG9fcy5lbXB0eT8gJiYgIUBkZXN0cy5oYXNfa2V5PyhpZCkKKyAgICAgICAgICBAcGRmLmFkZF9kZXN0KGlkLCBAcGRmLmRlc3RfeHl6KDAsIEBwZGYueSkpCisgICAgICAgICAgQGRlc3RzW2lkXSA9IEBwZGYuZGVzdF94eXooMCwgQHBkZi55KQorICAgICAgICBlbmQKKyAgICAgICAgc2VuZChESVNQQVRDSEVSX1JFTkRFUltlbC50eXBlXSwgZWwsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgcHJvdGVjdGVkCisKKyAgICAgICMgUmVuZGVyIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucyBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIGFzIGFycmF5LgorICAgICAgIworICAgICAgIyBFYWNoIHRpbWUgYSBjaGlsZCBpcyByZW5kZXJlZCwgdGhlICtUWVBFX29wdGlvbnMrIG1ldGhvZCBpcyBpbnZva2VkIChpZiBpdCBleGlzdHMpIHRvIGdldAorICAgICAgIyB0aGUgc3BlY2lmaWMgb3B0aW9ucyBmb3IgdGhlIGVsZW1lbnQgd2l0aCB3aGljaCB0aGUgZ2l2ZW4gb3B0aW9ucyBhcmUgdXBkYXRlZC4KKyAgICAgIGRlZiBpbm5lcihlbCwgb3B0cykKKyAgICAgICAgQHN0YWNrLnB1c2goW2VsLCBvcHRzXSkKKyAgICAgICAgcmVzdWx0ID0gZWwuY2hpbGRyZW4ubWFwIGRvIHxpbm5lcl9lbHwKKyAgICAgICAgICBvcHRpb25zID0gb3B0cy5kdXAKKyAgICAgICAgICBvcHRpb25zLnVwZGF0ZShzZW5kKERJU1BBVENIRVJfT1BUSU9OU1tpbm5lcl9lbC50eXBlXSwgaW5uZXJfZWwsIG9wdGlvbnMpKQorICAgICAgICAgIGNvbnZlcnQoaW5uZXJfZWwsIG9wdGlvbnMpCisgICAgICAgIGVuZC5mbGF0dGVuLmNvbXBhY3QKKyAgICAgICAgQHN0YWNrLnBvcAorICAgICAgICByZXN1bHQKKyAgICAgIGVuZAorCisKKyAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIyA6c2VjdGlvbjogRWxlbWVudCByZW5kZXJpbmcgbWV0aG9kcworICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgICAgZGVmIHJvb3Rfb3B0aW9ucyhyb290LCBvcHRzKQorICAgICAgICB7OmZvbnQgPT4gJ1RpbWVzLVJvbWFuJywgOnNpemUgPT4gMTIsIDpsZWFkaW5nID0+IDJ9CisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcl9yb290KHJvb3QsIG9wdHMpCisgICAgICAgIEBwZGYgPSBzZXR1cF9kb2N1bWVudChyb290KQorICAgICAgICBpbm5lcihyb290LCByb290X29wdGlvbnMocm9vdCwgb3B0cykpCisgICAgICAgIGNyZWF0ZV9vdXRsaW5lKHJvb3QpCisgICAgICAgIGZpbmlzaF9kb2N1bWVudChyb290KQorICAgICAgICBAcGRmLnJlbmRlcgorICAgICAgZW5kCisKKyAgICAgIGRlZiBoZWFkZXJfb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAgc2l6ZSA9IG9wdHNbOnNpemVdICogMS4xNSoqKDYgLSBlbC5vcHRpb25zWzpsZXZlbF0pCisgICAgICAgIHsKKyAgICAgICAgICA6Zm9udCA9PiAiSGVsdmV0aWNhIiwgOnN0eWxlcyA9PiAob3B0c1s6c3R5bGVzXSB8fCBbXSkgKyBbOmJvbGRdLAorICAgICAgICAgIDpzaXplID0+IHNpemUsIDpib3R0b21fcGFkZGluZyA9PiBvcHRzWzpzaXplXSwgOnRvcF9wYWRkaW5nID0+IG9wdHNbOnNpemVdCisgICAgICAgIH0KKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX2hlYWRlcihlbCwgb3B0cykKKyAgICAgICAgcmVuZGVyX3BhZGRlZF9hbmRfZm9ybWF0dGVkX3RleHQoZWwsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIHBfb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAgYnBhZCA9IChlbC5vcHRpb25zWzp0cmFuc3BhcmVudF0gPyBvcHRzWzpsZWFkaW5nXSA6IG9wdHNbOnNpemVdKQorICAgICAgICB7OmFsaWduID0+IDpqdXN0aWZ5LCA6Ym90dG9tX3BhZGRpbmcgPT4gYnBhZH0KKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX3AoZWwsIG9wdHMpCisgICAgICAgIGlmIGVsLmNoaWxkcmVuLnNpemUgPT0gMSAmJiBlbC5jaGlsZHJlbi5maXJzdC50eXBlID09IDppbWcKKyAgICAgICAgICByZW5kZXJfc3RhbmRhbG9uZV9pbWFnZShlbCwgb3B0cykKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlbmRlcl9wYWRkZWRfYW5kX2Zvcm1hdHRlZF90ZXh0KGVsLCBvcHRzKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX3N0YW5kYWxvbmVfaW1hZ2UoZWwsIG9wdHMpCisgICAgICAgIGltZyA9IGVsLmNoaWxkcmVuLmZpcnN0CisgICAgICAgIGxpbmUgPSBpbWcub3B0aW9uc1s6bG9jYXRpb25dCisKKyAgICAgICAgaWYgaW1nLmF0dHJbJ3NyYyddLmVtcHR5PworICAgICAgICAgIHdhcm5pbmcoIlJlbmRlcmluZyBhbiBpbWFnZSB3aXRob3V0IGEgc291cmNlIGlzIG5vdCBwb3NzaWJsZSN7bGluZSA/ICIgKGxpbmUgI3tsaW5lfSkiIDogJyd9IikKKyAgICAgICAgICByZXR1cm4gbmlsCisgICAgICAgIGVsc2lmIGltZy5hdHRyWydzcmMnXSAhfiAvXC5qcGU/ZyR8XC5wbmckLworICAgICAgICAgIHdhcm5pbmcoIkNhbm5vdCByZW5kZXIgaW1hZ2VzIG90aGVyIHRoYW4gSlBFRyBvciBQTkcsIGdvdCAje2ltZy5hdHRyWydzcmMnXX0je2xpbmUgPyAiIG9uIGxpbmUgI3tsaW5lfSIgOiAnJ30iKQorICAgICAgICAgIHJldHVybiBuaWwKKyAgICAgICAgZW5kCisKKyAgICAgICAgaW1nX2RpcnMgPSAoQG9wdGlvbnNbOmltYWdlX2RpcmVjdG9yaWVzXSB8fCBbJy4nXSkuZHVwCisgICAgICAgIGJlZ2luCisgICAgICAgICAgaW1nX3BhdGggPSBGaWxlLmpvaW4oaW1nX2RpcnMuc2hpZnQsIGltZy5hdHRyWydzcmMnXSkKKyAgICAgICAgICBpbWFnZV9vYmosIGltYWdlX2luZm8gPSBAcGRmLmJ1aWxkX2ltYWdlX29iamVjdChvcGVuKGltZ19wYXRoKSkKKyAgICAgICAgcmVzY3VlCisgICAgICAgICAgaW1nX2RpcnMuZW1wdHk/ID8gcmFpc2UgOiByZXRyeQorICAgICAgICBlbmQKKworICAgICAgICBvcHRpb25zID0gezpwb3NpdGlvbiA9PiA6Y2VudGVyfQorICAgICAgICBpZiBpbWcuYXR0clsnaGVpZ2h0J10gJiYgaW1nLmF0dHJbJ2hlaWdodCddID1+IC9weCQvCisgICAgICAgICAgb3B0aW9uc1s6aGVpZ2h0XSA9IGltZy5hdHRyWydoZWlnaHQnXS50b19pIC8gKEBvcHRpb25zWzppbWFnZV9kcGldIHx8IDE1MC4wKSAqIDcyCisgICAgICAgIGVsc2lmIGltZy5hdHRyWyd3aWR0aCddICYmIGltZy5hdHRyWyd3aWR0aCddID1+IC9weCQvCisgICAgICAgICAgb3B0aW9uc1s6d2lkdGhdID0gaW1nLmF0dHJbJ3dpZHRoJ10udG9faSAvIChAb3B0aW9uc1s6aW1hZ2VfZHBpXSB8fCAxNTAuMCkgKiA3MgorICAgICAgICBlbHNlCisgICAgICAgICAgb3B0aW9uc1s6c2NhbGVdID1bKEBwZGYuYm91bmRzLndpZHRoIC0gbW0ycHQoMjApKSAvIGltYWdlX2luZm8ud2lkdGgudG9fZiwgMV0ubWluCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIGltZy5hdHRyWydjbGFzcyddID1+IC9cYnJpZ2h0XGIvCisgICAgICAgICAgb3B0aW9uc1s6cG9zaXRpb25dID0gOnJpZ2h0CisgICAgICAgICAgQHBkZi5mbG9hdCB7IEBwZGYuZW1iZWRfaW1hZ2UoaW1hZ2Vfb2JqLCBpbWFnZV9pbmZvLCBvcHRpb25zKSB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB3aXRoX2Jsb2NrX3BhZGRpbmcoZWwsIG9wdHMpIGRvCisgICAgICAgICAgICBAcGRmLmVtYmVkX2ltYWdlKGltYWdlX29iaiwgaW1hZ2VfaW5mbywgb3B0aW9ucykKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGJsb2NrcXVvdGVfb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAgezpzdHlsZXMgPT4gWzppdGFsaWNdfQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfYmxvY2txdW90ZShlbCwgb3B0cykKKyAgICAgICAgQHBkZi5pbmRlbnQobW0ycHQoMTApLCBtbTJwdCgxMCkpIHsgaW5uZXIoZWwsIG9wdHMpIH0KKyAgICAgIGVuZAorCisgICAgICBkZWYgdWxfb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAgezpib3R0b21fcGFkZGluZyA9PiBvcHRzWzpzaXplXX0KKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX3VsKGVsLCBvcHRzKQorICAgICAgICB3aXRoX2Jsb2NrX3BhZGRpbmcoZWwsIG9wdHMpIGRvCisgICAgICAgICAgZWwuY2hpbGRyZW4uZWFjaCBkbyB8bGl8CisgICAgICAgICAgICBAcGRmLmZsb2F0IHsgQHBkZi5mb3JtYXR0ZWRfdGV4dChbdGV4dF9oYXNoKCLigKIiLCBvcHRzKV0pIH0KKyAgICAgICAgICAgIEBwZGYuaW5kZW50KG1tMnB0KDYpKSB7IGNvbnZlcnQobGksIG9wdHMpIH0KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIG9sX29wdGlvbnMoZWwsIG9wdHMpCisgICAgICAgIHs6Ym90dG9tX3BhZGRpbmcgPT4gb3B0c1s6c2l6ZV19CisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcl9vbChlbCwgb3B0cykKKyAgICAgICAgd2l0aF9ibG9ja19wYWRkaW5nKGVsLCBvcHRzKSBkbworICAgICAgICAgIGVsLmNoaWxkcmVuLmVhY2hfd2l0aF9pbmRleCBkbyB8bGksIGluZGV4fAorICAgICAgICAgICAgQHBkZi5mbG9hdCB7IEBwZGYuZm9ybWF0dGVkX3RleHQoW3RleHRfaGFzaCgiI3tpbmRleCsxfS4iLCBvcHRzKV0pIH0KKyAgICAgICAgICAgIEBwZGYuaW5kZW50KG1tMnB0KDYpKSB7IGNvbnZlcnQobGksIG9wdHMpIH0KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGxpX29wdGlvbnMoZWwsIG9wdHMpCisgICAgICAgIHt9CisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcl9saShlbCwgb3B0cykKKyAgICAgICAgaW5uZXIoZWwsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGRsX29wdGlvbnMoZWwsIG9wdHMpCisgICAgICAgIHt9CisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcl9kbChlbCwgb3B0cykKKyAgICAgICAgaW5uZXIoZWwsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGR0X29wdGlvbnMoZWwsIG9wdHMpCisgICAgICAgIHs6c3R5bGVzID0+IChvcHRzWzpzdHlsZXNdIHx8IFtdKSArIFs6Ym9sZF0sIDpib3R0b21fcGFkZGluZyA9PiAwfQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfZHQoZWwsIG9wdHMpCisgICAgICAgIHJlbmRlcl9wYWRkZWRfYW5kX2Zvcm1hdHRlZF90ZXh0KGVsLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBkZF9vcHRpb25zKGVsLCBvcHRzKQorICAgICAgICB7fQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfZGQoZWwsIG9wdHMpCisgICAgICAgIEBwZGYuaW5kZW50KG1tMnB0KDEwKSkgeyBpbm5lcihlbCwgb3B0cykgfQorICAgICAgZW5kCisKKyAgICAgIGRlZiBtYXRoX29wdGlvbnMoZWwsIG9wdHMpCisgICAgICAgIHt9CisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcl9tYXRoKGVsLCBvcHRzKQorICAgICAgICBpZiBlbC5vcHRpb25zWzpjYXRlZ29yeV0gPT0gOmJsb2NrCisgICAgICAgICAgQHBkZi5mb3JtYXR0ZWRfdGV4dChbezp0ZXh0ID0+IGVsLnZhbHVlfV0sIGJsb2NrX2hhc2gob3B0cykpCisgICAgICAgIGVsc2UKKyAgICAgICAgICB7OnRleHQgPT4gZWwudmFsdWV9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBocl9vcHRpb25zKGVsLCBvcHRzKQorICAgICAgICB7OnRvcF9wYWRkaW5nID0+IG9wdHNbOnNpemVdLCA6Ym90dG9tX3BhZGRpbmcgPT4gb3B0c1s6c2l6ZV19CisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcl9ocihlbCwgb3B0cykKKyAgICAgICAgd2l0aF9ibG9ja19wYWRkaW5nKGVsLCBvcHRzKSBkbworICAgICAgICAgIEBwZGYuc3Ryb2tlX2hvcml6b250YWxfbGluZShAcGRmLmJvdW5kcy5sZWZ0ICsgbW0ycHQoNSksIEBwZGYuYm91bmRzLnJpZ2h0IC0gbW0ycHQoNSkpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb2RlYmxvY2tfb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAgeworICAgICAgICAgIDpmb250ID0+ICdDb3VyaWVyJywgOmNvbG9yID0+ICc4ODAwMDAnLAorICAgICAgICAgIDpib3R0b21fcGFkZGluZyA9PiBvcHRzWzpzaXplXQorICAgICAgICB9CisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcl9jb2RlYmxvY2soZWwsIG9wdHMpCisgICAgICAgIHdpdGhfYmxvY2tfcGFkZGluZyhlbCwgb3B0cykgZG8KKyAgICAgICAgICBAcGRmLmZvcm1hdHRlZF90ZXh0KFt0ZXh0X2hhc2goZWwudmFsdWUsIG9wdHMsIGZhbHNlKV0sIGJsb2NrX2hhc2gob3B0cykpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiB0YWJsZV9vcHRpb25zKGVsLCBvcHRzKQorICAgICAgICB7OmJvdHRvbV9wYWRkaW5nID0+IG9wdHNbOnNpemVdfQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfdGFibGUoZWwsIG9wdHMpCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBlbC5jaGlsZHJlbi5lYWNoIGRvIHxjb250YWluZXJ8CisgICAgICAgICAgY29udGFpbmVyLmNoaWxkcmVuLmVhY2ggZG8gfHJvd3wKKyAgICAgICAgICAgIGRhdGEgPDwgW10KKyAgICAgICAgICAgIHJvdy5jaGlsZHJlbi5lYWNoIGRvIHxjZWxsfAorICAgICAgICAgICAgICBpZiBjZWxsLmNoaWxkcmVuLmFueT8ge3xjaGlsZHwgY2hpbGQub3B0aW9uc1s6Y2F0ZWdvcnldID09IDpibG9ja30KKyAgICAgICAgICAgICAgICBsaW5lID0gZWwub3B0aW9uc1s6bG9jYXRpb25dCisgICAgICAgICAgICAgICAgd2FybmluZygiQ2FuJ3QgcmVuZGVyIHRhYmxlcyB3aXRoIGNlbGxzIGNvbnRhaW5pbmcgYmxvY2sgZWxlbWVudHMje2xpbmUgPyAiIChsaW5lICN7bGluZX0pIiA6ICcnfSIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBjZWxsX2RhdGEgPSBpbm5lcihjZWxsLCBvcHRzKQorICAgICAgICAgICAgICBkYXRhLmxhc3QgPDwgY2VsbF9kYXRhLm1hcCB7fGN8IGNbOnRleHRdfS5qb2luKCcnKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICB3aXRoX2Jsb2NrX3BhZGRpbmcoZWwsIG9wdHMpIGRvCisgICAgICAgICAgQHBkZi50YWJsZShkYXRhLCA6d2lkdGggPT4gQHBkZi5ib3VuZHMucmlnaHQpIGRvCisgICAgICAgICAgICBlbC5vcHRpb25zWzphbGlnbm1lbnRdLmVhY2hfd2l0aF9pbmRleCBkbyB8YWxpZ25tZW50LCBpbmRleHwKKyAgICAgICAgICAgICAgY29sdW1ucyhpbmRleCkuYWxpZ24gPSBhbGlnbm1lbnQgdW5sZXNzIGFsaWdubWVudCA9PSA6ZGVmYXVsdAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKworCisgICAgICBkZWYgdGV4dF9vcHRpb25zKGVsLCBvcHRzKQorICAgICAgICB7fQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfdGV4dChlbCwgb3B0cykKKyAgICAgICAgdGV4dF9oYXNoKGVsLnZhbHVlLnRvX3MsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGVtX29wdGlvbnMoZWwsIG9wdHMpCisgICAgICAgIGlmIG9wdHNbOnN0eWxlc10gJiYgb3B0c1s6c3R5bGVzXS5pbmNsdWRlPyg6aXRhbGljKQorICAgICAgICAgIHs6c3R5bGVzID0+IG9wdHNbOnN0eWxlc10ucmVqZWN0IHt8aXwgaSA9PSA6aXRhbGljfX0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHs6c3R5bGVzID0+IChvcHRzWzpzdHlsZXNdIHx8IFtdKSA8PCA6aXRhbGljfQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3Ryb25nX29wdGlvbnMoZWwsIG9wdHMpCisgICAgICAgIHs6c3R5bGVzID0+IChvcHRzWzpzdHlsZXNdIHx8IFtdKSArIFs6Ym9sZF19CisgICAgICBlbmQKKworICAgICAgZGVmIGFfb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAgaGFzaCA9IHs6Y29sb3IgPT4gJzAwMDA4OCd9CisgICAgICAgIGlmIGVsLmF0dHJbJ2hyZWYnXS5zdGFydF93aXRoPygnIycpCisgICAgICAgICAgaGFzaFs6YW5jaG9yXSA9IGVsLmF0dHJbJ2hyZWYnXS5zdWIoL1xBIy8sICcnKQorICAgICAgICBlbHNlCisgICAgICAgICAgaGFzaFs6bGlua10gPSBlbC5hdHRyWydocmVmJ10KKyAgICAgICAgZW5kCisgICAgICAgIGhhc2gKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX2VtKGVsLCBvcHRzKQorICAgICAgICBpbm5lcihlbCwgb3B0cykKKyAgICAgIGVuZAorICAgICAgYWxpYXNfbWV0aG9kIDpyZW5kZXJfc3Ryb25nLCA6cmVuZGVyX2VtCisgICAgICBhbGlhc19tZXRob2QgOnJlbmRlcl9hLCA6cmVuZGVyX2VtCisKKyAgICAgIGRlZiBjb2Rlc3Bhbl9vcHRpb25zKGVsLCBvcHRzKQorICAgICAgICB7OmZvbnQgPT4gJ0NvdXJpZXInLCA6Y29sb3IgPT4gJzg4MDAwMCd9CisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcl9jb2Rlc3BhbihlbCwgb3B0cykKKyAgICAgICAgdGV4dF9oYXNoKGVsLnZhbHVlLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBicl9vcHRpb25zKGVsLCBvcHRzKQorICAgICAgICB7fQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfYnIoZWwsIG9wdHMpCisgICAgICAgIHRleHRfaGFzaCgiXG4iLCBvcHRzLCBmYWxzZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc21hcnRfcXVvdGVfb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAge30KKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX3NtYXJ0X3F1b3RlKGVsLCBvcHRzKQorICAgICAgICB0ZXh0X2hhc2goc21hcnRfcXVvdGVfZW50aXR5KGVsKS5jaGFyLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiB0eXBvZ3JhcGhpY19zeW1fb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAge30KKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX3R5cG9ncmFwaGljX3N5bShlbCwgb3B0cykKKyAgICAgICAgc3RyID0gaWYgZWwudmFsdWUgPT0gOmxhcXVvX3NwYWNlCisgICAgICAgICAgICAgICAgOjpLcmFtZG93bjo6VXRpbHM6OkVudGl0aWVzLmVudGl0eSgnbGFxdW8nKS5jaGFyICsKKyAgICAgICAgICAgICAgICAgIDo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ25ic3AnKS5jaGFyCisgICAgICAgICAgICAgIGVsc2lmIGVsLnZhbHVlID09IDpyYXF1b19zcGFjZQorICAgICAgICAgICAgICAgIDo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ3JhcXVvJykuY2hhciArCisgICAgICAgICAgICAgICAgICA6OktyYW1kb3duOjpVdGlsczo6RW50aXRpZXMuZW50aXR5KCduYnNwJykuY2hhcgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgOjpLcmFtZG93bjo6VXRpbHM6OkVudGl0aWVzLmVudGl0eShlbC52YWx1ZS50b19zKS5jaGFyCisgICAgICAgICAgICAgIGVuZAorICAgICAgICB0ZXh0X2hhc2goc3RyLCBvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBlbnRpdHlfb3B0aW9ucyhlbCwgb3B0cykKKyAgICAgICAge30KKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVuZGVyX2VudGl0eShlbCwgb3B0cykKKyAgICAgICAgdGV4dF9oYXNoKGVsLnZhbHVlLmNoYXIsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGFiYnJldmlhdGlvbl9vcHRpb25zKGVsLCBvcHRzKQorICAgICAgICB7fQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfYWJicmV2aWF0aW9uKGVsLCBvcHRzKQorICAgICAgICB0ZXh0X2hhc2goZWwudmFsdWUsIG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGltZ19vcHRpb25zKGVsLCBvcHRzKQorICAgICAgICB7fQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfaW1nKGVsLCAqYXJncykgIzpub2RvYzoKKyAgICAgICAgbGluZSA9IGVsLm9wdGlvbnNbOmxvY2F0aW9uXQorICAgICAgICB3YXJuaW5nKCJSZW5kZXJpbmcgc3BhbiBpbWFnZXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgUERGIGNvbnZlcnRlciN7bGluZSA/ICIgKGxpbmUgI3tsaW5lfSkiIDogJyd9IikKKyAgICAgICAgbmlsCisgICAgICBlbmQKKworCisKKyAgICAgIGRlZiB4bWxfY29tbWVudF9vcHRpb25zKGVsLCBvcHRzKSAjOm5vZG9jOgorICAgICAgICB7fQorICAgICAgZW5kCisgICAgICBhbGlhc19tZXRob2QgOnhtbF9waV9vcHRpb25zLCA6eG1sX2NvbW1lbnRfb3B0aW9ucworICAgICAgYWxpYXNfbWV0aG9kIDpjb21tZW50X29wdGlvbnMsIDp4bWxfY29tbWVudF9vcHRpb25zCisgICAgICBhbGlhc19tZXRob2QgOmJsYW5rX29wdGlvbnMsIDp4bWxfY29tbWVudF9vcHRpb25zCisgICAgICBhbGlhc19tZXRob2QgOmZvb3Rub3RlX29wdGlvbnMsIDp4bWxfY29tbWVudF9vcHRpb25zCisgICAgICBhbGlhc19tZXRob2QgOnJhd19vcHRpb25zLCA6eG1sX2NvbW1lbnRfb3B0aW9ucworICAgICAgYWxpYXNfbWV0aG9kIDpodG1sX2VsZW1lbnRfb3B0aW9ucywgOnhtbF9jb21tZW50X29wdGlvbnMKKworICAgICAgZGVmIHJlbmRlcl94bWxfY29tbWVudChlbCwgb3B0cykgIzpub2RvYzoKKyAgICAgICAgIyBub29wCisgICAgICBlbmQKKyAgICAgIGFsaWFzX21ldGhvZCA6cmVuZGVyX3htbF9waSwgOnJlbmRlcl94bWxfY29tbWVudAorICAgICAgYWxpYXNfbWV0aG9kIDpyZW5kZXJfY29tbWVudCwgOnJlbmRlcl94bWxfY29tbWVudAorICAgICAgYWxpYXNfbWV0aG9kIDpyZW5kZXJfYmxhbmssIDpyZW5kZXJfeG1sX2NvbW1lbnQKKworICAgICAgZGVmIHJlbmRlcl9mb290bm90ZShlbCwgKmFyZ3MpICM6bm9kb2M6CisgICAgICAgIGxpbmUgPSBlbC5vcHRpb25zWzpsb2NhdGlvbl0KKyAgICAgICAgd2FybmluZygiUmVuZGVyaW5nICN7ZWwudHlwZX0gbm90IHN1cHBvcnRlZCBmb3IgUERGIGNvbnZlcnRlciN7bGluZSA/ICIgKGxpbmUgI3tsaW5lfSkiIDogJyd9IikKKyAgICAgICAgbmlsCisgICAgICBlbmQKKyAgICAgIGFsaWFzX21ldGhvZCA6cmVuZGVyX3JhdywgOnJlbmRlcl9mb290bm90ZQorICAgICAgYWxpYXNfbWV0aG9kIDpyZW5kZXJfaHRtbF9lbGVtZW50LCA6cmVuZGVyX2Zvb3Rub3RlCisKKworICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAjIDpzZWN0aW9uOiBPcmdhbml6YXRpb25hbCBtZXRob2RzCisgICAgICAjCisgICAgICAjIFRoZXNlIG1ldGhvZHMgYXJlIHVzZWQsIGZvciBleGFtcGxlLCB0byB1cCB0aGUgbmVlZGVkIFByYXduOjpEb2N1bWVudCBpbnN0YW5jZSBvciB0byBjcmVhdGUKKyAgICAgICMgYSBQREYgb3V0bGluZS4KKyAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICAgICMgVGhpcyBtb2R1bGUgZ2V0cyBtaXhlZCBpbnRvIHRoZSBQcmF3bjo6RG9jdW1lbnQgaW5zdGFuY2UuCisgICAgICBtb2R1bGUgUHJhd25Eb2N1bWVudEV4dGVuc2lvbgorCisgICAgICAgICMgRXh0ZW5zaW9uIGZvciB0aGUgZm9ybWF0dGVkIGJveCBjbGFzcyB0byByZWNvZ25pemUgaW1hZ2VzIGFuZCBtb3ZlIHRleHQgYXJvdW5kIHRoZW0uCisgICAgICAgIG1vZHVsZSBDdXN0b21Cb3gKKworICAgICAgICAgIGRlZiBhdmFpbGFibGVfd2lkdGgKKyAgICAgICAgICAgIHJldHVybiBzdXBlciB1bmxlc3MgQGRvY3VtZW50LnJlc3BvbmRfdG8/KDpjb252ZXJ0ZXIpICYmIEBkb2N1bWVudC5jb252ZXJ0ZXIKKworICAgICAgICAgICAgQGRvY3VtZW50LmltYWdlX2Zsb2F0cy5lYWNoIGRvIHxwbiwgeCwgeSwgdywgaHwKKyAgICAgICAgICAgICAgbmV4dCBpZiBAZG9jdW1lbnQucGFnZV9udW1iZXIgIT0gcG4KKyAgICAgICAgICAgICAgaWYgQGF0WzFdICsgQGJhc2VsaW5lX3kgPD0geSAtIEBkb2N1bWVudC5ib3VuZHMuYWJzb2x1dGVfYm90dG9tICYmCisgICAgICAgICAgICAgICAgICAoQGF0WzFdICsgQGJhc2VsaW5lX3kgKyBAYXJyYW5nZXIubWF4X2xpbmVfaGVpZ2h0ICsgQGxlYWRpbmcgPj0geSAtIGggLSBAZG9jdW1lbnQuYm91bmRzLmFic29sdXRlX2JvdHRvbSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQHdpZHRoIC0gdworICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICByZXR1cm4gc3VwZXIKKyAgICAgICAgICBlbmQKKworICAgICAgICBlbmQKKworICAgICAgICBQcmF3bjo6VGV4dDo6Rm9ybWF0dGVkOjpCb3guZXh0ZW5zaW9ucyA8PCBDdXN0b21Cb3gKKworICAgICAgICAjIEFjY2VzcyB0aGUgY29udmVydGVyIGluc3RhbmNlIGZyb20gd2l0aGluIFByYXduCisgICAgICAgIGF0dHJfYWNjZXNzb3IgOmNvbnZlcnRlcgorCisgICAgICAgIGRlZiBpbWFnZV9mbG9hdHMKKyAgICAgICAgICBAaW1hZ2VfZmxvYXRzIHx8PSBbXQorICAgICAgICBlbmQKKworICAgICAgICAjIE92ZXJyaWRlIGltYWdlIGVtYmVkZGluZyBtZXRob2QgZm9yIGFkZGluZyBpbWFnZSBwb3NpdGlvbnMgdG8gI2ltYWdlX2Zsb2F0cy4KKyAgICAgICAgZGVmIGVtYmVkX2ltYWdlKHBkZl9vYmosIGluZm8sIG9wdGlvbnMpCisgICAgICAgICAgIyBmaW5kIHdoZXJlIHRoZSBpbWFnZSB3aWxsIGJlIHBsYWNlZCBhbmQgaG93IGJpZyBpdCB3aWxsIGJlCisgICAgICAgICAgdyxoID0gaW5mby5jYWxjX2ltYWdlX2RpbWVuc2lvbnMob3B0aW9ucykKKworICAgICAgICAgIGlmIG9wdGlvbnNbOmF0XQorICAgICAgICAgICAgeCx5ID0gbWFwX3RvX2Fic29sdXRlKG9wdGlvbnNbOmF0XSkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB4LHkgPSBpbWFnZV9wb3NpdGlvbih3LGgsb3B0aW9ucykKKyAgICAgICAgICAgIG1vdmVfdGV4dF9wb3NpdGlvbiBoCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICAjLS0+IFRoaXMgcGFydCBpcyBuZXcKKyAgICAgICAgICBpZiBvcHRpb25zWzpwb3NpdGlvbl0gPT0gOnJpZ2h0CisgICAgICAgICAgICBpbWFnZV9mbG9hdHMgPDwgW3BhZ2VfbnVtYmVyLCB4IC0gMTUsIHksIHcgKyAxNSwgaCArIDE1XQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgIyBhZGQgYSByZWZlcmVuY2UgdG8gdGhlIGltYWdlIG9iamVjdCB0byB0aGUgY3VycmVudCBwYWdlCisgICAgICAgICAgIyByZXNvdXJjZSBsaXN0IGFuZCBnaXZlIGl0IGEgbGFiZWwKKyAgICAgICAgICBsYWJlbCA9ICJJI3tuZXh0X2ltYWdlX2lkfSIKKyAgICAgICAgICBzdGF0ZS5wYWdlLnhvYmplY3RzLm1lcmdlIShsYWJlbCA9PiBwZGZfb2JqKQorCisgICAgICAgICAgIyBhZGQgdGhlIGltYWdlIHRvIHRoZSBjdXJyZW50IHBhZ2UKKyAgICAgICAgICBpbnN0cnVjdCA9ICJcbnFcbiUuM2YgMCAwICUuM2YgJS4zZiAlLjNmIGNtXG4vJXMgRG9cblEiCisgICAgICAgICAgYWRkX2NvbnRlbnQgaW5zdHJ1Y3QgJSBbIHcsIGgsIHgsIHkgLSBoLCBsYWJlbCBdCisgICAgICAgIGVuZAorCisgICAgICBlbmQKKworCisgICAgICAjIFJldHVybiBhIGhhc2ggd2l0aCBvcHRpb25zIHRoYXQgYXJlIHN1aXRhYmxlIGZvciBQcmF3bjo6RG9jdW1lbnQubmV3LgorICAgICAgIworICAgICAgIyBVc2VkIGluICNzZXR1cF9kb2N1bWVudC4KKyAgICAgIGRlZiBkb2N1bWVudF9vcHRpb25zKHJvb3QpCisgICAgICAgIHsKKyAgICAgICAgICA6cGFnZV9zaXplID0+ICdBNCcsIDpwYWdlX2xheW91dCA9PiA6cG9ydHJhaXQsIDptYXJnaW4gPT4gbW0ycHQoMjApLAorICAgICAgICAgIDppbmZvID0+IHsKKyAgICAgICAgICAgIDpDcmVhdG9yID0+ICdrcmFtZG93biBQREYgY29udmVydGVyJywKKyAgICAgICAgICAgIDpDcmVhdGlvbkRhdGUgPT4gVGltZS5ub3cKKyAgICAgICAgICB9LAorICAgICAgICAgIDpjb21wcmVzcyA9PiB0cnVlLCA6b3B0aW1pemVfb2JqZWN0cyA9PiB0cnVlCisgICAgICAgIH0KKyAgICAgIGVuZAorCisgICAgICAjIENyZWF0ZSBhIFByYXduOjpEb2N1bWVudCBvYmplY3QgYW5kIHJldHVybiBpdC4KKyAgICAgICMKKyAgICAgICMgQ2FuIGJlIHVzZWQgdG8gZGVmaW5lIHJlcGVhdGFibGUgY29udGVudCBvciByZWdpc3RlciBmb250cy4KKyAgICAgICMKKyAgICAgICMgVXNlZCBpbiAjcmVuZGVyX3Jvb3QuCisgICAgICBkZWYgc2V0dXBfZG9jdW1lbnQocm9vdCkKKyAgICAgICAgZG9jID0gUHJhd246OkRvY3VtZW50Lm5ldyhkb2N1bWVudF9vcHRpb25zKHJvb3QpKQorICAgICAgICBkb2MuZXh0ZW5kKFByYXduRG9jdW1lbnRFeHRlbnNpb24pCisgICAgICAgIGRvYy5jb252ZXJ0ZXIgPSBzZWxmCisgICAgICAgIGRvYworICAgICAgZW5kCisKKyAgICAgICMKKyAgICAgICMKKyAgICAgICMgVXNlZCBpbiAjcmVuZGVyX3Jvb3QuCisgICAgICBkZWYgZmluaXNoX2RvY3VtZW50KHJvb3QpCisgICAgICAgICMgbm8gb3AKKyAgICAgIGVuZAorCisgICAgICAjIENyZWF0ZSB0aGUgUERGIG91dGxpbmUgZnJvbSB0aGUgaGVhZGVyIGVsZW1lbnRzIGluIHRoZSBUT0MuCisgICAgICBkZWYgY3JlYXRlX291dGxpbmUocm9vdCkKKyAgICAgICAgdG9jID0gOjpLcmFtZG93bjo6Q29udmVydGVyOjpUb2MuY29udmVydChyb290KS5maXJzdAorCisgICAgICAgIHRleHRfb2ZfaGVhZGVyID0gbGFtYmRhIGRvIHxlbHwKKyAgICAgICAgICBpZiBlbC50eXBlID09IDp0ZXh0CisgICAgICAgICAgICBlbC52YWx1ZQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVsLmNoaWxkcmVuLm1hcCB7fGN8IHRleHRfb2ZfaGVhZGVyLmNhbGwoYyl9LmpvaW4oJycpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGFkZF9zZWN0aW9uID0gbGFtYmRhIGRvIHxpdGVtLCBwYXJlbnR8CisgICAgICAgICAgdGV4dCA9IHRleHRfb2ZfaGVhZGVyLmNhbGwoaXRlbS52YWx1ZSkKKyAgICAgICAgICBkZXN0aW5hdGlvbiA9IEBkZXN0c1tpdGVtLmF0dHJbOmlkXV0KKyAgICAgICAgICBpZiAhcGFyZW50CisgICAgICAgICAgICBAcGRmLm91dGxpbmUucGFnZSg6dGl0bGUgPT4gdGV4dCwgOmRlc3RpbmF0aW9uID0+IGRlc3RpbmF0aW9uKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEBwZGYub3V0bGluZS5hZGRfc3Vic2VjdGlvbl90byhwYXJlbnQpIGRvCisgICAgICAgICAgICAgIEBwZGYub3V0bGluZS5wYWdlKDp0aXRsZSA9PiB0ZXh0LCA6ZGVzdGluYXRpb24gPT4gZGVzdGluYXRpb24pCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBpdGVtLmNoaWxkcmVuLmVhY2gge3xjfCBhZGRfc2VjdGlvbi5jYWxsKGMsIHRleHQpfQorICAgICAgICBlbmQKKworICAgICAgICB0b2MuY2hpbGRyZW4uZWFjaCBkbyB8aXRlbXwKKyAgICAgICAgICBhZGRfc2VjdGlvbi5jYWxsKGl0ZW0sIG5pbCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworCisgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICMgOnNlY3Rpb246IEhlbHBlciBtZXRob2RzCisgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgICAjIE1vdmUgdGhlIHByYXduIGRvY3VtZW50IGN1cnNvciBkb3duIGJlZm9yZSBhbmQvb3IgYWZ0ZXIgeWllbGRpbmcgdGhlIGdpdmVuIGJsb2NrLgorICAgICAgIworICAgICAgIyBUaGUgOnRvcF9wYWRkaW5nIGFuZCA6Ym90dG9tX3BhZGRpbmcgb3B0aW9ucyBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5pZyB0aGUgcGFkZGluZyBhbW91bnQuCisgICAgICBkZWYgd2l0aF9ibG9ja19wYWRkaW5nKGVsLCBvcHRzKQorICAgICAgICBAcGRmLm1vdmVfZG93bihvcHRzWzp0b3BfcGFkZGluZ10pIGlmIG9wdHMuaGFzX2tleT8oOnRvcF9wYWRkaW5nKQorICAgICAgICB5aWVsZAorICAgICAgICBAcGRmLm1vdmVfZG93bihvcHRzWzpib3R0b21fcGFkZGluZ10pIGlmIG9wdHMuaGFzX2tleT8oOmJvdHRvbV9wYWRkaW5nKQorICAgICAgZW5kCisKKyAgICAgICMgUmVuZGVyIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBhcyBmb3JtYXR0ZWQgdGV4dCBhbmQgcmVzcGVjdCB0aGUgdG9wL2JvdHRvbQorICAgICAgIyBwYWRkaW5nIChzZWUgI3dpdGhfYmxvY2tfcGFkZGluZykuCisgICAgICBkZWYgcmVuZGVyX3BhZGRlZF9hbmRfZm9ybWF0dGVkX3RleHQoZWwsIG9wdHMpCisgICAgICAgIHdpdGhfYmxvY2tfcGFkZGluZyhlbCwgb3B0cykgeyBAcGRmLmZvcm1hdHRlZF90ZXh0KGlubmVyKGVsLCBvcHRzKSwgYmxvY2tfaGFzaChvcHRzKSkgfQorICAgICAgZW5kCisKKyAgICAgICMgSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGhhc2ggd2l0aCB2YWxpZCAiZm9ybWF0dGVkIHRleHQiIG9wdGlvbnMuCisgICAgICAjCisgICAgICAjIFRoZSArdGV4dCsgcGFyYW1ldGVyIGlzIHVzZWQgYXMgdmFsdWUgZm9yIHRoZSA6dGV4dCBrZXkgYW5kIGlmICtzcXVlZXplX3doaXRlc3BhY2UrIGlzCisgICAgICAjICt0cnVlKywgYWxsIHdoaXRlc3BhY2UgaXMgY29udmVydGVkIGludG8gc3BhY2VzLgorICAgICAgZGVmIHRleHRfaGFzaCh0ZXh0LCBvcHRzLCBzcXVlZXplX3doaXRlc3BhY2UgPSB0cnVlKQorICAgICAgICB0ZXh0ID0gdGV4dC5nc3ViKC9ccysvLCAnICcpIGlmIHNxdWVlemVfd2hpdGVzcGFjZQorICAgICAgICBoYXNoID0gezp0ZXh0ID0+IHRleHR9CisgICAgICAgIFs6c3R5bGVzLCA6c2l6ZSwgOmNoYXJhY3Rlcl9zcGFjaW5nLCA6Zm9udCwgOmNvbG9yLCA6bGluaywKKyAgICAgICAgIDphbmNob3IsIDpkcmF3X3RleHRfY2FsbGJhY2ssIDpjYWxsYmFja10uZWFjaCBkbyB8a2V5fAorICAgICAgICAgIGhhc2hba2V5XSA9IG9wdHNba2V5XSBpZiBvcHRzLmhhc19rZXk/KGtleSkKKyAgICAgICAgZW5kCisgICAgICAgIGhhc2gKKyAgICAgIGVuZAorCisgICAgICAjIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBoYXNoIHdpdGggdmFsaWQgb3B0aW9ucyBmb3IgdGhlIHByYXduICN0ZXh0X2JveCBleHRyYWN0ZWQKKyAgICAgICMgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy4KKyAgICAgIGRlZiBibG9ja19oYXNoKG9wdHMpCisgICAgICAgIGhhc2ggPSB7fQorICAgICAgICBbOmFsaWduLCA6dmFsaWduLCA6bW9kZSwgOmZpbmFsX2dhcCwgOmxlYWRpbmcsIDpmYWxsYmFja19mb250cywKKyAgICAgICAgIDpkaXJlY3Rpb24sIDppbmRlbnRfcGFyYWdyYXBoc10uZWFjaCBkbyB8a2V5fAorICAgICAgICAgIGhhc2hba2V5XSA9IG9wdHNba2V5XSBpZiBvcHRzLmhhc19rZXk/KGtleSkKKyAgICAgICAgZW5kCisgICAgICAgIGhhc2gKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL3JlbW92ZV9odG1sX3RhZ3MucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9yZW1vdmVfaHRtbF90YWdzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzNlMWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9yZW1vdmVfaHRtbF90YWdzLnJiCkBAIC0wLDAgKzEsNTUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAna3JhbWRvd24vY29udmVydGVyJworCittb2R1bGUgS3JhbWRvd24KKworICBtb2R1bGUgQ29udmVydGVyCisKKyAgICAjIFJlbW92ZXMgYWxsIGJsb2NrIChhbmQgb3B0aW9uYWxseSBzcGFuKSBsZXZlbCBIVE1MIHRhZ3MgZnJvbSB0aGUgZWxlbWVudCB0cmVlLgorICAgICMKKyAgICAjIFRoaXMgY29udmVydGVyIGNhbiBiZSB1c2VkIG9uIHBhcnNlZCBIVE1MIGRvY3VtZW50cyB0byBnZXQgYW4gZWxlbWVudCB0cmVlIHRoYXQgd2lsbCBvbmx5CisgICAgIyBjb250YWluIG5hdGl2ZSBrcmFtZG93biBlbGVtZW50cy4KKyAgICAjCisgICAgIyAqTm90ZSogdGhhdCB0aGUgcmV0dXJuZWQgZWxlbWVudCB0cmVlIG1heSBub3QgYmUgZnVsbHkgY29uZm9ybWFudCAoaS5lLiB0aGUgY29udGVudCBtb2RlbHMgb2YKKyAgICAjICpzb21lIGVsZW1lbnRzIG1heSBiZSB2aW9sYXRlZCkhCisgICAgIworICAgICMgVGhpcyBjb252ZXJ0ZXIgbW9kaWZpZXMgdGhlIGdpdmVuIHRyZWUgaW4tcGxhY2UgYW5kIHJldHVybnMgaXQuCisgICAgY2xhc3MgUmVtb3ZlSHRtbFRhZ3MgPCBCYXNlCisKKyAgICAgIGRlZiBpbml0aWFsaXplKHJvb3QsIG9wdGlvbnMpCisgICAgICAgIHN1cGVyCisgICAgICAgIEBvcHRpb25zWzp0ZW1wbGF0ZV0gPSAnJworICAgICAgZW5kCisKKyAgICAgIGRlZiBjb252ZXJ0KGVsKQorICAgICAgICBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuLmR1cAorICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgd2hpbGUgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGgKKyAgICAgICAgICBpZiBbOnhtbF9waV0uaW5jbHVkZT8oY2hpbGRyZW5baW5kZXhdLnR5cGUpIHx8CisgICAgICAgICAgICAgIChjaGlsZHJlbltpbmRleF0udHlwZSA9PSA6aHRtbF9lbGVtZW50ICYmICV3W3N0eWxlIHNjcmlwdF0uaW5jbHVkZT8oY2hpbGRyZW5baW5kZXhdLnZhbHVlKSkKKyAgICAgICAgICAgIGNoaWxkcmVuW2luZGV4Li5pbmRleF0gPSBbXQorICAgICAgICAgIGVsc2lmIGNoaWxkcmVuW2luZGV4XS50eXBlID09IDpodG1sX2VsZW1lbnQgJiYKKyAgICAgICAgICAgICgoQG9wdGlvbnNbOnJlbW92ZV9ibG9ja19odG1sX3RhZ3NdICYmIGNoaWxkcmVuW2luZGV4XS5vcHRpb25zWzpjYXRlZ29yeV0gPT0gOmJsb2NrKSB8fAorICAgICAgICAgICAgIChAb3B0aW9uc1s6cmVtb3ZlX3NwYW5faHRtbF90YWdzXSAmJiBjaGlsZHJlbltpbmRleF0ub3B0aW9uc1s6Y2F0ZWdvcnldID09IDpzcGFuKSkKKyAgICAgICAgICAgIGNoaWxkcmVuW2luZGV4Li5pbmRleF0gPSBjaGlsZHJlbltpbmRleF0uY2hpbGRyZW4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBjb252ZXJ0KGNoaWxkcmVuW2luZGV4XSkKKyAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIGVsLmNoaWxkcmVuID0gY2hpbGRyZW4KKyAgICAgICAgZWwKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL3N5bnRheF9oaWdobGlnaHRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL3N5bnRheF9oaWdobGlnaHRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFmZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvc3ludGF4X2hpZ2hsaWdodGVyLnJiCkBAIC0wLDAgKzEsNTYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duCisgIG1vZHVsZSBDb252ZXJ0ZXIKKworICAgICMgPT0gQ29udGFpbmVyIGZvciBTeW50YXggSGlnaGxpZ2h0ZXJzCisgICAgIworICAgICMgVGhpcyBtb2R1bGUgc2VydmVzIGFzIGNvbnRhaW5lciBmb3IgdGhlIHN5bnRheCBoaWdobGlnaHRlcnMgdGhhdCBjYW4gYmUgdXNlZCB0b2dldGhlciB3aXRoCisgICAgIyBrcmFtZG93bi4KKyAgICAjCisgICAgIyBBIHN5bnRheCBoaWdobGlnaHRlciBzaG91bGQgbm90IHN0b3JlIGFueSBkYXRhIGl0c2VsZiBidXQgc2hvdWxkIHVzZSB0aGUgcHJvdmlkZWQgY29udmVydGVyCisgICAgIyBvYmplY3QgdG8gZG8gc28gKFNlZSBLcmFtZG93bjo6Q29udmVydGVyOjpCYXNlI2RhdGEpLgorICAgICMKKyAgICAjID09IEltcGxlbWVudGluZyBhIFN5bnRheCBIaWdobGlnaHRlcgorICAgICMKKyAgICAjIEltcGxlbWVudGluZyBhIG5ldyBzeW50YXggaGlnaGxpZ2h0ZXIgaXMgZWFzeSBiZWNhdXNlIGl0IGlzIGp1c3QgYW4gb2JqZWN0IHRoYXQgbmVlZHMgdG8KKyAgICAjIHJlc3BvbmQgdG8gI2NhbGwuCisgICAgIworICAgICMgVGhlIG1ldGhvZCAjY2FsbCBuZWVkcyB0byB0YWtlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorICAgICMKKyAgICAjIGNvbnZlcnRlcjo6IFRoaXMgYXJndW1lbnQgY29udGFpbnMgdGhlIGNvbnZlcnRlciBvYmplY3QgdGhhdCBjYWxscyB0aGUgc3ludGF4IGhpZ2hsaWdodGVyLiBJdAorICAgICMgICAgICAgICAgICAgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBzdG9yZSBkYXRhIGluIEtyYW1kb3duOjpDb252ZXJ0ZXI6OkJhc2UjZGF0YSBmb3Igb25lCisgICAgIyAgICAgICAgICAgICBjb252ZXJzaW9uIHJ1bi4KKyAgICAjCisgICAgIyB0ZXh0OjogVGhlIHJhdyB0ZXh0IHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLgorICAgICMKKyAgICAjIGxhbmc6OiBUaGUgbGFuZ3VhZ2UgdGhhdCB0aGUgdGV4dCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgZm9yIChlLmcuIHJ1YnksIHB5dGhvbiwgLi4uKS4KKyAgICAjCisgICAgIyB0eXBlOjogVGhlIHR5cGUgb2YgdGV4dCwgZWl0aGVyIDpzcGFuIGZvciBzcGFuLWxldmVsIGNvZGUgb3IgOmJsb2NrIGZvciBhIGNvZGVibG9jay4KKyAgICAjCisgICAgIyBvcHRzOjogQSBIYXNoIHdpdGggb3B0aW9ucyB0aGF0IG1heSBiZSBwYXNzZWQgZnJvbSB0aGUgY29udmVydGVyLgorICAgICMKKyAgICAjIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBzaG91bGQgYmUgdGhlIGhpZ2hsaWdodGVkIHRleHQsIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4KKyAgICAjIGNvbnZlcnRlciAoZS5nLiBIVE1MIGZvciB0aGUgSFRNTCBjb252ZXJ0ZXIpLgorICAgICMKKyAgICAjID09IFNwZWNpYWwgSW1wbGVtZW50YXRpb24gRGV0YWlscworICAgICMKKyAgICAjIEhUTUwgY29udmVydGVyOjogSWYgdGhlIHN5bnRheCBoaWdobGlnaHRlciBpcyB1c2VkIHdpdGggYSBIVE1MIGNvbnZlcnRlciwgaXQgc2hvdWxkIHJldHVybgorICAgICMgICAgICAgICAgICAgICAgICA6YmxvY2sgdHlwZSB0ZXh0IGNvcnJlY3RseSB3cmFwcGVkIChpLmUuIG5vcm1hbGx5IGluc2lkZSBhIHByZS10YWcsIGJ1dCBtYXkKKyAgICAjICAgICAgICAgICAgICAgICAgYWxzbyBiZSBhIHRhYmxlLXRhZyBvciBqdXN0IGEgZGl2LXRhZykgYnV0IDpzcGFuIHR5cGUgdGV4dCAqd2l0aG91dCogYQorICAgICMgICAgICAgICAgICAgICAgICBjb2RlLXRhZyEKKyAgICAjCisgICAgIyAgICAgICAgICAgICAgICAgIEFsc28sIGEgc3ludGF4IGhpZ2hsaWdodGVyIHNob3VsZCBzdG9yZSB0aGUgZGVmYXVsdCBoaWdobGlnaHRpbmcgbGFuZ3VhZ2UgZm9yCisgICAgIyAgICAgICAgICAgICAgICAgIHRoZSBpbnZvY2F0aW9uIGluIHRoZSArb3B0cysgaGFzaCB1bmRlciB0aGUga2V5IDpkZWZhdWx0X2xhbmcuCisgICAgbW9kdWxlIFN5bnRheEhpZ2hsaWdodGVyCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL3N5bnRheF9oaWdobGlnaHRlci9jb2RlcmF5LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvc3ludGF4X2hpZ2hsaWdodGVyL2NvZGVyYXkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMzJmMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL3N5bnRheF9oaWdobGlnaHRlci9jb2RlcmF5LnJiCkBAIC0wLDAgKzEsODEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duOjpDb252ZXJ0ZXI6OlN5bnRheEhpZ2hsaWdodGVyCisKKyAgIyBVc2VzIENvZGVyYXkgdG8gaGlnaGxpZ2h0IGNvZGUgYmxvY2tzIGFuZCBjb2RlIHNwYW5zLgorICBtb2R1bGUgQ29kZXJheQorCisgICAgYmVnaW4KKyAgICAgIHJlcXVpcmUgJ2NvZGVyYXknCisKKyAgICAgICMgSGlnaGxpZ2h0aW5nIHZpYSBjb2RlcmF5IGlzIGF2YWlsYWJsZSBpZiB0aGlzIGNvbnN0YW50IGlzICt0cnVlKy4KKyAgICAgIEFWQUlMQUJMRSA9IHRydWUKKyAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICBBVkFJTEFCTEUgPSBmYWxzZSAgIyA6bm9kb2M6CisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5jYWxsKGNvbnZlcnRlciwgdGV4dCwgbGFuZywgdHlwZSwgY2FsbF9vcHRzKQorICAgICAgcmV0dXJuIG5pbCB1bmxlc3MgY29udmVydGVyLm9wdGlvbnNbOmVuYWJsZV9jb2RlcmF5XQorCisgICAgICBpZiB0eXBlID09IDpzcGFuICYmIGxhbmcKKyAgICAgICAgOjpDb2RlUmF5LnNjYW4odGV4dCwgbGFuZy50b19zeW0pLmh0bWwob3B0aW9ucyhjb252ZXJ0ZXIsIDpzcGFuKSkuY2hvbXAKKyAgICAgIGVsc2lmIHR5cGUgPT0gOmJsb2NrICYmIChsYW5nIHx8IG9wdGlvbnMoY29udmVydGVyLCA6ZGVmYXVsdF9sYW5nKSkKKyAgICAgICAgbGFuZyB8fD0gY2FsbF9vcHRzWzpkZWZhdWx0X2xhbmddID0gb3B0aW9ucyhjb252ZXJ0ZXIsIDpkZWZhdWx0X2xhbmcpCisgICAgICAgIDo6Q29kZVJheS5zY2FuKHRleHQsIGxhbmcudG9fcy5nc3ViKC8tLywgJ18nKS50b19zeW0pLmh0bWwob3B0aW9ucyhjb252ZXJ0ZXIsIDpibG9jaykpLmNob21wIDw8ICJcbiIKKyAgICAgIGVsc2UKKyAgICAgICAgbmlsCisgICAgICBlbmQKKyAgICByZXNjdWUKKyAgICAgIGNvbnZlcnRlci53YXJuaW5nKCJUaGVyZSB3YXMgYW4gZXJyb3IgdXNpbmcgQ29kZVJheTogI3skIS5tZXNzYWdlfSIpCisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLm9wdGlvbnMoY29udmVydGVyLCB0eXBlKQorICAgICAgcHJlcGFyZV9vcHRpb25zKGNvbnZlcnRlcikKKyAgICAgIGNvbnZlcnRlci5kYXRhWzpzeW50YXhfaGlnaGxpZ2h0ZXJfY29kZXJheV1bdHlwZV0KKyAgICBlbmQKKworICAgIGRlZiBzZWxmLnByZXBhcmVfb3B0aW9ucyhjb252ZXJ0ZXIpCisgICAgICByZXR1cm4gaWYgY29udmVydGVyLmRhdGEua2V5Pyg6c3ludGF4X2hpZ2hsaWdodGVyX2NvZGVyYXkpCisKKyAgICAgIGNhY2hlID0gY29udmVydGVyLmRhdGFbOnN5bnRheF9oaWdobGlnaHRlcl9jb2RlcmF5XSA9IHt9CisKKyAgICAgIG9wdHMgPSBjb252ZXJ0ZXIub3B0aW9uc1s6c3ludGF4X2hpZ2hsaWdodGVyX29wdHNdLmR1cAorICAgICAgc3Bhbl9vcHRzID0gKG9wdHMuZGVsZXRlKDpzcGFuKSB8fCB7fSkuZHVwCisgICAgICBibG9ja19vcHRzID0gKG9wdHMuZGVsZXRlKDpibG9jaykgfHwge30pLmR1cAorICAgICAgW3NwYW5fb3B0cywgYmxvY2tfb3B0c10uZWFjaCBkbyB8aGFzaHwKKyAgICAgICAgaGFzaC5rZXlzLmVhY2ggZG8gfGt8CisgICAgICAgICAgaGFzaFtrLmtpbmRfb2Y/KFN0cmluZykgPyBLcmFtZG93bjo6T3B0aW9ucy5zdHJfdG9fc3ltKGspIDoga10gPSBoYXNoLmRlbGV0ZShrKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBjYWNoZVs6ZGVmYXVsdF9sYW5nXSA9IGNvbnZlcnRlci5vcHRpb25zWzpjb2RlcmF5X2RlZmF1bHRfbGFuZ10gfHwgb3B0cy5kZWxldGUoOmRlZmF1bHRfbGFuZykKKyAgICAgIGNhY2hlWzpzcGFuXSA9IHsKKyAgICAgICAgOmNzcyA9PiBjb252ZXJ0ZXIub3B0aW9uc1s6Y29kZXJheV9jc3NdCisgICAgICB9LnVwZGF0ZShvcHRzKS51cGRhdGUoc3Bhbl9vcHRzKS51cGRhdGUoOndyYXAgPT4gOnNwYW4pCisgICAgICBjYWNoZVs6YmxvY2tdID0geworICAgICAgICA6d3JhcCA9PiBjb252ZXJ0ZXIub3B0aW9uc1s6Y29kZXJheV93cmFwXSwKKyAgICAgICAgOmxpbmVfbnVtYmVycyA9PiBjb252ZXJ0ZXIub3B0aW9uc1s6Y29kZXJheV9saW5lX251bWJlcnNdLAorICAgICAgICA6bGluZV9udW1iZXJfc3RhcnQgPT4gY29udmVydGVyLm9wdGlvbnNbOmNvZGVyYXlfbGluZV9udW1iZXJfc3RhcnRdLAorICAgICAgICA6dGFiX3dpZHRoID0+IGNvbnZlcnRlci5vcHRpb25zWzpjb2RlcmF5X3RhYl93aWR0aF0sCisgICAgICAgIDpib2xkX2V2ZXJ5ID0+IGNvbnZlcnRlci5vcHRpb25zWzpjb2RlcmF5X2JvbGRfZXZlcnldLAorICAgICAgICA6Y3NzID0+IGNvbnZlcnRlci5vcHRpb25zWzpjb2RlcmF5X2Nzc10KKyAgICAgIH0udXBkYXRlKG9wdHMpLnVwZGF0ZShibG9ja19vcHRzKQorCisgICAgICBbOmNzcywgOndyYXAsIDpsaW5lX251bWJlcnNdLmVhY2ggZG8gfGtleXwKKyAgICAgICAgWzpibG9jaywgOnNwYW5dLmVhY2ggZG8gfHR5cGV8CisgICAgICAgICAgY2FjaGVbdHlwZV1ba2V5XSA9IGNhY2hlW3R5cGVdW2tleV0udG9fc3ltIGlmIGNhY2hlW3R5cGVdW2tleV0ua2luZF9vZj8oU3RyaW5nKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL3N5bnRheF9oaWdobGlnaHRlci9taW50ZWQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9zeW50YXhfaGlnaGxpZ2h0ZXIvbWludGVkLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Y2QyZmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9zeW50YXhfaGlnaGxpZ2h0ZXIvbWludGVkLnJiCkBAIC0wLDAgKzEsMzUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duOjpDb252ZXJ0ZXI6OlN5bnRheEhpZ2hsaWdodGVyCisKKyAgIyBVc2VzIE1pbnRlZCB0byBoaWdobGlnaHQgY29kZSBibG9ja3MgYW5kIGNvZGUgc3BhbnMuCisgIG1vZHVsZSBNaW50ZWQKKworICAgIGRlZiBzZWxmLmNhbGwoY29udmVydGVyLCB0ZXh0LCBsYW5nLCB0eXBlLCBfb3B0cykKKyAgICAgIG9wdHMgPSBjb252ZXJ0ZXIub3B0aW9uc1s6c3ludGF4X2hpZ2hsaWdodGVyX29wdHNdCisKKyAgICAgICMgRmFsbGJhY2sgdG8gZGVmYXVsdCBsYW5ndWFnZQorICAgICAgbGFuZyB8fD0gb3B0c1s6ZGVmYXVsdF9sYW5nXQorCisgICAgICBvcHRpb25zID0gW10KKyAgICAgIG9wdGlvbnMgPDwgImJyZWFrbGluZXMiIGlmIG9wdHNbOndyYXBdCisgICAgICBvcHRpb25zIDw8ICJsaW5lbm9zIiBpZiBvcHRzWzpsaW5lX251bWJlcnNdCisgICAgICBvcHRpb25zIDw8ICJmcmFtZT0je29wdHNbOmZyYW1lXX0iIGlmIG9wdHNbOmZyYW1lXQorCisgICAgICBpZiBsYW5nICYmIHR5cGUgPT0gOmJsb2NrCisgICAgICAgICJcXGJlZ2lue21pbnRlZH1bI3tvcHRpb25zLmpvaW4oJywnKX1deyN7bGFuZ319XG4je3RleHR9XG5cXGVuZHttaW50ZWR9IgorICAgICAgZWxzaWYgbGFuZyAmJiB0eXBlID09IDpzcGFuCisgICAgICAgICJcXG1pbnRpbmxpbmV7I3tsYW5nfX17I3t0ZXh0fX0iCisgICAgICBlbHNlCisgICAgICAgIG5pbAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9zeW50YXhfaGlnaGxpZ2h0ZXIvcm91Z2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci9zeW50YXhfaGlnaGxpZ2h0ZXIvcm91Z2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5N2FiYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vY29udmVydGVyL3N5bnRheF9oaWdobGlnaHRlci9yb3VnZS5yYgpAQCAtMCwwICsxLDY3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bjo6Q29udmVydGVyOjpTeW50YXhIaWdobGlnaHRlcgorCisgICMgVXNlcyBSb3VnZSB3aGljaCBpcyBDU1MtY29tcGF0aWJsZSB0byBQeWdtZW50cyB0byBoaWdobGlnaHQgY29kZSBibG9ja3MgYW5kIGNvZGUgc3BhbnMuCisgIG1vZHVsZSBSb3VnZQorCisgICAgYmVnaW4KKyAgICAgIHJlcXVpcmUgJ3JvdWdlJworCisgICAgICAjIEhpZ2hsaWdodGluZyB2aWEgUm91Z2UgaXMgYXZhaWxhYmxlIGlmIHRoaXMgY29uc3RhbnQgaXMgK3RydWUrLgorICAgICAgQVZBSUxBQkxFID0gdHJ1ZQorCisgICAgICBiZWdpbgorICAgICAgICAjIFJvdWdlOjpGb3JtYXR0ZXJzOjpIVE1MTGVnYWN5IGlzIGF2YWlsYWJsZSBvbiBSb3VnZSAyLjAgb3IgbGF0ZXIKKyAgICAgICAgRk9STUFUVEVSX0NMQVNTID0gOjpSb3VnZTo6Rm9ybWF0dGVyczo6SFRNTExlZ2FjeQorICAgICAgcmVzY3VlIE5hbWVFcnJvcgorICAgICAgICAjIEZhbGxiYWNrcyB0byBSb3VnZSAxLnggZm9ybWF0dGVyIGlmIFJvdWdlOjpGb3JtYXR0ZXJzOjpIVE1MTGVnYWN5IGlzIG5vdCBhdmFpbGFibGUKKyAgICAgICAgRk9STUFUVEVSX0NMQVNTID0gOjpSb3VnZTo6Rm9ybWF0dGVyczo6SFRNTAorICAgICAgZW5kCisgICAgcmVzY3VlIExvYWRFcnJvciwgU3ludGF4RXJyb3IKKyAgICAgIEFWQUlMQUJMRSA9IGZhbHNlICAjIDpub2RvYzoKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmNhbGwoY29udmVydGVyLCB0ZXh0LCBsYW5nLCB0eXBlLCBjYWxsX29wdHMpCisgICAgICBvcHRzID0gb3B0aW9ucyhjb252ZXJ0ZXIsIHR5cGUpCisgICAgICBjYWxsX29wdHNbOmRlZmF1bHRfbGFuZ10gPSBvcHRzWzpkZWZhdWx0X2xhbmddCisgICAgICBsZXhlciA9IDo6Um91Z2U6OkxleGVyLmZpbmRfZmFuY3kobGFuZyB8fCBvcHRzWzpkZWZhdWx0X2xhbmddLCB0ZXh0KQorICAgICAgcmV0dXJuIG5pbCBpZiBvcHRzWzpkaXNhYmxlXSB8fCAhbGV4ZXIKKyAgICAgIG9wdHNbOmNzc19jbGFzc10gfHw9ICdoaWdobGlnaHQnICMgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2hlbiB1c2luZyBSb3VnZSAyLjAKKyAgICAgIGZvcm1hdHRlciA9IChvcHRzLmZldGNoKDpmb3JtYXR0ZXIsIEZPUk1BVFRFUl9DTEFTUykpLm5ldyhvcHRzKQorICAgICAgZm9ybWF0dGVyLmZvcm1hdChsZXhlci5sZXgodGV4dCkpCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5vcHRpb25zKGNvbnZlcnRlciwgdHlwZSkKKyAgICAgIHByZXBhcmVfb3B0aW9ucyhjb252ZXJ0ZXIpCisgICAgICBjb252ZXJ0ZXIuZGF0YVs6c3ludGF4X2hpZ2hsaWdodGVyX3JvdWdlXVt0eXBlXQorICAgIGVuZAorCisgICAgZGVmIHNlbGYucHJlcGFyZV9vcHRpb25zKGNvbnZlcnRlcikKKyAgICAgIHJldHVybiBpZiBjb252ZXJ0ZXIuZGF0YS5rZXk/KDpzeW50YXhfaGlnaGxpZ2h0ZXJfcm91Z2UpCisKKyAgICAgIGNhY2hlID0gY29udmVydGVyLmRhdGFbOnN5bnRheF9oaWdobGlnaHRlcl9yb3VnZV0gPSB7fQorCisgICAgICBvcHRzID0gY29udmVydGVyLm9wdGlvbnNbOnN5bnRheF9oaWdobGlnaHRlcl9vcHRzXS5kdXAKKyAgICAgIHNwYW5fb3B0cyA9IChvcHRzLmRlbGV0ZSg6c3BhbikgfHwge30pLmR1cAorICAgICAgYmxvY2tfb3B0cyA9IChvcHRzLmRlbGV0ZSg6YmxvY2spIHx8IHt9KS5kdXAKKyAgICAgIFtzcGFuX29wdHMsIGJsb2NrX29wdHNdLmVhY2ggZG8gfGhhc2h8CisgICAgICAgIGhhc2gua2V5cy5lYWNoIGRvIHxrfAorICAgICAgICAgIGhhc2hbay5raW5kX29mPyhTdHJpbmcpID8gS3JhbWRvd246Ok9wdGlvbnMuc3RyX3RvX3N5bShrKSA6IGtdID0gaGFzaC5kZWxldGUoaykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgY2FjaGVbOnNwYW5dID0gb3B0cy5tZXJnZShzcGFuX29wdHMpLnVwZGF0ZSg6d3JhcCA9PiBmYWxzZSkKKyAgICAgIGNhY2hlWzpibG9ja10gPSBvcHRzLm1lcmdlKGJsb2NrX29wdHMpCisgICAgZW5kCisKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvdG9jLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9jb252ZXJ0ZXIvdG9jLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODdmZjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2NvbnZlcnRlci90b2MucmIKQEAgLTAsMCArMSw2OSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdrcmFtZG93bi9jb252ZXJ0ZXInCisKK21vZHVsZSBLcmFtZG93bgorCisgIG1vZHVsZSBDb252ZXJ0ZXIKKworICAgICMgQ29udmVydHMgYSBLcmFtZG93bjo6RG9jdW1lbnQgdG8gYW4gZWxlbWVudCB0cmVlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGFibGUgb2YgY29udGVudHMuCisgICAgIworICAgICMgVGhlIHJldHVybmVkIHRyZWUgY29uc2lzdHMgb2YgRWxlbWVudCBvYmplY3RzIG9mIHR5cGUgOnRvYyB3aGVyZSB0aGUgcm9vdCBlbGVtZW50IGlzIGp1c3QgdXNlZAorICAgICMgYXMgY29udGFpbmVyIG9iamVjdC4gRWFjaCA6dG9jIGVsZW1lbnQgY29udGFpbnMgYXMgdmFsdWUgdGhlIHdyYXBwZWQgOmhlYWRlciBlbGVtZW50IGFuZCB1bmRlcgorICAgICMgdGhlIGF0dHJpYnV0ZSBrZXkgOmlkIHRoZSBoZWFkZXIgSUQgdGhhdCBzaG91bGQgYmUgdXNlZCAobm90ZSB0aGF0IHRoaXMgSUQgbWF5IG5vdCBleGlzdCBpbgorICAgICMgdGhlIHdyYXBwZWQgZWxlbWVudCkuCisgICAgIworICAgICMgU2luY2UgdGhlIFRPQyB0cmVlIGNvbnNpc3RzIG9mIHNwZWNpYWwgOnRvYyBlbGVtZW50cywgb25lIGNhbm5vdCBkaXJlY3RseSBmZWVkIHRoaXMgdHJlZSB0bworICAgICMgb3RoZXIgY29udmVydGVycyEKKyAgICBjbGFzcyBUb2MgPCBCYXNlCisKKyAgICAgIGRlZiBpbml0aWFsaXplKHJvb3QsIG9wdGlvbnMpCisgICAgICAgIHN1cGVyCisgICAgICAgIEB0b2MgPSBFbGVtZW50Lm5ldyg6dG9jKQorICAgICAgICBAc3RhY2sgPSBbXQorICAgICAgICBAb3B0aW9uc1s6dGVtcGxhdGVdID0gJycKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udmVydChlbCkKKyAgICAgICAgaWYgZWwudHlwZSA9PSA6aGVhZGVyICYmIGluX3RvYz8oZWwpCisgICAgICAgICAgYXR0ciA9IGVsLmF0dHIuZHVwCisgICAgICAgICAgYXR0clsnaWQnXSA9IGdlbmVyYXRlX2lkKGVsLm9wdGlvbnNbOnJhd190ZXh0XSkgaWYgQG9wdGlvbnNbOmF1dG9faWRzXSAmJiAhYXR0clsnaWQnXQorICAgICAgICAgIGFkZF90b190b2MoZWwsIGF0dHJbJ2lkJ10pIGlmIGF0dHJbJ2lkJ10KKyAgICAgICAgZWxzZQorICAgICAgICAgIGVsLmNoaWxkcmVuLmVhY2gge3xjaGlsZHwgY29udmVydChjaGlsZCl9CisgICAgICAgIGVuZAorICAgICAgICBAdG9jCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBkZWYgYWRkX3RvX3RvYyhlbCwgaWQpCisgICAgICAgIHRvY19lbGVtZW50ID0gRWxlbWVudC5uZXcoOnRvYywgZWwsIDppZCA9PiBpZCkKKworICAgICAgICBzdWNjZXNzID0gZmFsc2UKKyAgICAgICAgd2hpbGUgIXN1Y2Nlc3MKKyAgICAgICAgICBpZiBAc3RhY2suZW1wdHk/CisgICAgICAgICAgICBAdG9jLmNoaWxkcmVuIDw8IHRvY19lbGVtZW50CisgICAgICAgICAgICBAc3RhY2sgPDwgdG9jX2VsZW1lbnQKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlCisgICAgICAgICAgZWxzaWYgQHN0YWNrLmxhc3QudmFsdWUub3B0aW9uc1s6bGV2ZWxdIDwgZWwub3B0aW9uc1s6bGV2ZWxdCisgICAgICAgICAgICBAc3RhY2subGFzdC5jaGlsZHJlbiA8PCB0b2NfZWxlbWVudAorICAgICAgICAgICAgQHN0YWNrIDw8IHRvY19lbGVtZW50CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEBzdGFjay5wb3AKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgIGVuZAorCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2RvY3VtZW50LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9kb2N1bWVudC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MwYjNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9kb2N1bWVudC5yYgpAQCAtMCwwICsxLDE0NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworIyA9IGtyYW1kb3duCisjCisjIGtyYW1kb3duIGlzIGZhc3QsIHB1cmUgUnVieSBNYXJrZG93biBzdXBlcnNldCBjb252ZXJ0ZXIsIHVzaW5nIGEgc3RyaWN0IHN5bnRheCBkZWZpbml0aW9uIGFuZAorIyBzdXBwb3J0aW5nIHNldmVyYWwgY29tbW9uIGV4dGVuc2lvbnMuCisjCisjIFRoZSBrcmFtZG93biBsaWJyYXJ5IGlzIG1haW5seSB3cml0dGVuIHRvIHN1cHBvcnQgdGhlIGtyYW1kb3duLXRvLUhUTUwgY29udmVyc2lvbiBjaGFpbi4gSG93ZXZlciwKKyMgZHVlIHRvIGl0cyBmbGV4aWJpbGl0eSBpdCBzdXBwb3J0cyBvdGhlciBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgYXMgd2VsbC4gSGVyZSBpcyBhIGxpc3Qgb2YgdGhlCisjIHN1cHBvcnRlZCBmb3JtYXRzOgorIworIyAqIGlucHV0IGZvcm1hdHM6IGtyYW1kb3duIChhIE1hcmtkb3duIHN1cGVyc2V0KSwgTWFya2Rvd24sIEdGTSwgSFRNTAorIyAqIG91dHB1dCBmb3JtYXRzOiBIVE1MLCBrcmFtZG93biwgTGFUZVggKGFuZCB0aGVyZWZvcmUgUERGKSwgUERGIHZpYSBQcmF3bgorIworIyBBbGwgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly9rcmFtZG93bi5nZXR0YWxvbmcub3JnLgorIworIyA9PSBVc2FnZQorIworIyBrcmFtZG93biBoYXMgYSBzaW1wbGUgQVBJLCBzbyB1c2luZyBrcmFtZG93biBpcyBhcyBlYXN5IGFzCisjCisjICAgICByZXF1aXJlICdrcmFtZG93bicKKyMKKyMgICAgIEtyYW1kb3duOjpEb2N1bWVudC5uZXcodGV4dCkudG9faHRtbAorIworIyBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gaGF2ZSBhIGxvb2sgYXQgdGhlICpcS3JhbWRvd246OkRvY3VtZW50KiBjbGFzcy4KKyMKKyMgPT0gTGljZW5zZQorIworIyBNSVQgLSBzZWUgdGhlIENPUFlJTkcgZmlsZS4KKworCityZXF1aXJlICdrcmFtZG93bi9jb21wYXRpYmlsaXR5JworCityZXF1aXJlICdrcmFtZG93bi92ZXJzaW9uJworcmVxdWlyZSAna3JhbWRvd24vZWxlbWVudCcKK3JlcXVpcmUgJ2tyYW1kb3duL2Vycm9yJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyJworcmVxdWlyZSAna3JhbWRvd24vY29udmVydGVyJworcmVxdWlyZSAna3JhbWRvd24vb3B0aW9ucycKK3JlcXVpcmUgJ2tyYW1kb3duL3V0aWxzJworCittb2R1bGUgS3JhbWRvd24KKworICAjIFJldHVybiB0aGUgZGF0YSBkaXJlY3RvcnkgZm9yIGtyYW1kb3duLgorICBkZWYgc2VsZi5kYXRhX2RpcgorICAgIHVubGVzcyBkZWZpbmVkPyhAQGRhdGFfZGlyKQorICAgICAgcmVxdWlyZSAncmJjb25maWcnCisgICAgICBAQGRhdGFfZGlyID0gRmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uJywgJy4uJywgJ2RhdGEnLCAna3JhbWRvd24nKSkKKyAgICAgIEBAZGF0YV9kaXIgPSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihSYkNvbmZpZzo6Q09ORklHWyJkYXRhZGlyIl0sICJrcmFtZG93biIpKSBpZiAhRmlsZS5leGlzdHM/KEBAZGF0YV9kaXIpCisgICAgICByYWlzZSAia3JhbWRvd24gZGF0YSBkaXJlY3Rvcnkgbm90IGZvdW5kISBUaGlzIGlzIGEgYnVnLCBwbGVhc2UgcmVwb3J0IGl0ISIgdW5sZXNzIEZpbGUuZGlyZWN0b3J5PyhAQGRhdGFfZGlyKQorICAgIGVuZAorICAgIEBAZGF0YV9kaXIKKyAgZW5kCisKKworICAjIFRoZSBtYWluIGludGVyZmFjZSB0byBrcmFtZG93bi4KKyAgIworICAjIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBvbmUtc3RvcC1zaG9wIGZvciB1c2luZyBrcmFtZG93biB0byBjb252ZXJ0IHRleHQgaW50byB2YXJpb3VzIG91dHB1dAorICAjIGZvcm1hdHMuIFVzZSBpdCBsaWtlIHRoaXM6CisgICMKKyAgIyAgIHJlcXVpcmUgJ2tyYW1kb3duJworICAjICAgZG9jID0gS3JhbWRvd246OkRvY3VtZW50Lm5ldygnVGhpcyAqaXMqIHNvbWUga3JhbWRvd24gdGV4dCcpCisgICMgICBwdXRzIGRvYy50b19odG1sCisgICMKKyAgIyBUaGUgI3RvX2h0bWwgbWV0aG9kIGlzIGEgc2hvcnRjdXQgZm9yIHVzaW5nIHRoZSBDb252ZXJ0ZXI6Okh0bWwgY2xhc3MuIFNlZSAjbWV0aG9kX21pc3NpbmcgZm9yCisgICMgbW9yZSBpbmZvcm1hdGlvbi4KKyAgIworICAjIFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIDo6bmV3IG1ldGhvZCBpcyBhbiBvcHRpb25zIGhhc2ggZm9yIGN1c3RvbWl6aW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlCisgICMgdXNlZCBwYXJzZXIgYW5kIHRoZSBjb252ZXJ0ZXIuIFNlZSA6Om5ldyBmb3IgbW9yZSBpbmZvcm1hdGlvbiEKKyAgY2xhc3MgRG9jdW1lbnQKKworICAgICMgVGhlIHJvb3QgRWxlbWVudCBvZiB0aGUgZWxlbWVudCB0cmVlLiBJdCBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUgYWZ0ZXIgdGhlIDo6bmV3IG1ldGhvZCBoYXMKKyAgICAjIGJlZW4gY2FsbGVkLgorICAgIGF0dHJfYWNjZXNzb3IgOnJvb3QKKworICAgICMgVGhlIG9wdGlvbnMgaGFzaCB3aGljaCBob2xkcyB0aGUgb3B0aW9ucyBmb3IgcGFyc2luZy9jb252ZXJ0aW5nIHRoZSBLcmFtZG93biBkb2N1bWVudC4KKyAgICBhdHRyX3JlYWRlciA6b3B0aW9ucworCisgICAgIyBBbiBhcnJheSBvZiB3YXJuaW5nIG1lc3NhZ2VzLiBJdCBpcyBmaWxsZWQgd2l0aCB3YXJuaW5ncyBkdXJpbmcgdGhlIHBhcnNpbmcgcGhhc2UgKGkuZS4gaW4KKyAgICAjIDo6bmV3KSBhbmQgdGhlIGNvbnZlcnNpb24gcGhhc2UuCisgICAgYXR0cl9yZWFkZXIgOndhcm5pbmdzCisKKworICAgICMgQ3JlYXRlIGEgbmV3IEtyYW1kb3duIGRvY3VtZW50IGZyb20gdGhlIHN0cmluZyArc291cmNlKyBhbmQgdXNlIHRoZSBwcm92aWRlZCArb3B0aW9ucysuIFRoZQorICAgICMgb3B0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBkZWZpbmVkIGluIHRoZSBPcHRpb25zIG1vZHVsZS4KKyAgICAjCisgICAgIyBUaGUgc3BlY2lhbCBvcHRpb25zIGtleSA6aW5wdXQgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBwYXJzZXIgdGhhdCBzaG91bGQgcGFyc2UgdGhlCisgICAgIyArc291cmNlKy4gSXQgaGFzIHRvIGJlIHRoZSBuYW1lIG9mIGEgY2xhc3MgaW4gdGhlIEtyYW1kb3duOjpQYXJzZXIgbW9kdWxlLiBGb3IgZXhhbXBsZSwgdG8KKyAgICAjIHNlbGVjdCB0aGUga3JhbWRvd24gcGFyc2VyLCBvbmUgd291bGQgc2V0IHRoZSA6aW5wdXQga2V5IHRvICtLcmFtZG93bisuIElmIHRoaXMga2V5IGlzIG5vdAorICAgICMgc2V0LCBpdCBkZWZhdWx0cyB0byArS3JhbWRvd24rLgorICAgICMKKyAgICAjIFRoZSArc291cmNlKyBpcyBpbW1lZGlhdGVseSBwYXJzZWQgYnkgdGhlIHNlbGVjdGVkIHBhcnNlciBzbyB0aGF0IHRoZSByb290IGVsZW1lbnQgaXMKKyAgICAjIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBhbmQgdGhlIG91dHB1dCBjYW4gYmUgZ2VuZXJhdGVkLgorICAgIGRlZiBpbml0aWFsaXplKHNvdXJjZSwgb3B0aW9ucyA9IHt9KQorICAgICAgQG9wdGlvbnMgPSBPcHRpb25zLm1lcmdlKG9wdGlvbnMpLmZyZWV6ZQorICAgICAgcGFyc2VyID0gKEBvcHRpb25zWzppbnB1dF0gfHwgJ2tyYW1kb3duJykudG9fcworICAgICAgcGFyc2VyID0gcGFyc2VyWzAuLjBdLnVwY2FzZSArIHBhcnNlclsxLi4tMV0KKyAgICAgIHRyeV9yZXF1aXJlKCdwYXJzZXInLCBwYXJzZXIpCisgICAgICBpZiBQYXJzZXIuY29uc3RfZGVmaW5lZD8ocGFyc2VyKQorICAgICAgICBAcm9vdCwgQHdhcm5pbmdzID0gUGFyc2VyLmNvbnN0X2dldChwYXJzZXIpLnBhcnNlKHNvdXJjZSwgQG9wdGlvbnMpCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEtyYW1kb3duOjpFcnJvci5uZXcoImtyYW1kb3duIGhhcyBubyBwYXJzZXIgdG8gaGFuZGxlIHRoZSBzcGVjaWZpZWQgaW5wdXQgZm9ybWF0OiAje0BvcHRpb25zWzppbnB1dF19IikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBDaGVjayBpZiBhIG1ldGhvZCBpcyBpbnZva2VkIHRoYXQgYmVnaW5zIHdpdGggK3RvXysgYW5kIGlmIHNvLCB0cnkgdG8gaW5zdGFudGlhdGUgYSBjb252ZXJ0ZXIKKyAgICAjIGNsYXNzIChpLmUuIGEgY2xhc3MgaW4gdGhlIEtyYW1kb3duOjpDb252ZXJ0ZXIgbW9kdWxlKSBhbmQgdXNlIGl0IGZvciBjb252ZXJ0aW5nIHRoZSBkb2N1bWVudC4KKyAgICAjCisgICAgIyBGb3IgZXhhbXBsZSwgK3RvX2h0bWwrIHdvdWxkIGluc3RhbnRpYXRlIHRoZSBLcmFtZG93bjo6Q29udmVydGVyOjpIdG1sIGNsYXNzLgorICAgIGRlZiBtZXRob2RfbWlzc2luZyhpZCwgKmF0dHIsICZibG9jaykKKyAgICAgIGlmIGlkLnRvX3MgPX4gL150b18oXHcrKSQvICYmIChuYW1lID0gVXRpbHMuY2FtZWxpemUoJDEpKSAmJgorICAgICAgICAgIHRyeV9yZXF1aXJlKCdjb252ZXJ0ZXInLCBuYW1lKSAmJiBDb252ZXJ0ZXIuY29uc3RfZGVmaW5lZD8obmFtZSkKKyAgICAgICAgb3V0cHV0LCB3YXJuaW5ncyA9IENvbnZlcnRlci5jb25zdF9nZXQobmFtZSkuY29udmVydChAcm9vdCwgQG9wdGlvbnMpCisgICAgICAgIEB3YXJuaW5ncy5jb25jYXQod2FybmluZ3MpCisgICAgICAgIG91dHB1dAorICAgICAgZWxzZQorICAgICAgICBzdXBlcgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgaW5zcGVjdCAjOm5vZG9jOgorICAgICAgIjxLRDpEb2N1bWVudDogb3B0aW9ucz0je0BvcHRpb25zLmluc3BlY3R9IHJvb3Q9I3tAcm9vdC5pbnNwZWN0fSB3YXJuaW5ncz0je0B3YXJuaW5ncy5pbnNwZWN0fT4iCisgICAgZW5kCisKKyAgICAjIFRyeSByZXF1aXJpbmcgYSBwYXJzZXIgb3IgY29udmVydGVyIGNsYXNzIGFuZCBkb24ndCByYWlzZSBhbiBlcnJvciBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuCisgICAgZGVmIHRyeV9yZXF1aXJlKHR5cGUsIG5hbWUpCisgICAgICByZXF1aXJlKCJrcmFtZG93bi8je3R5cGV9LyN7VXRpbHMuc25ha2VfY2FzZShuYW1lKX0iKQorICAgICAgdHJ1ZQorICAgIHJlc2N1ZSBMb2FkRXJyb3IKKyAgICAgIHRydWUKKyAgICBlbmQKKyAgICBwcm90ZWN0ZWQgOnRyeV9yZXF1aXJlCisKKyAgZW5kCisKK2VuZAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2VsZW1lbnQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2VsZW1lbnQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0NjNiNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vZWxlbWVudC5yYgpAQCAtMCwwICsxLDUyMiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCittb2R1bGUgS3JhbWRvd24KKworICAjIFJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBlbGVtZW50IHRyZWUuCisgICMKKyAgIyBrcmFtZG93biBvbmx5IHVzZXMgdGhpcyBvbmUgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhbGwgYXZhaWxhYmxlIGVsZW1lbnRzIGluIGFuIGVsZW1lbnQgdHJlZQorICAjIChwYXJhZ3JhcGhzLCBoZWFkZXJzLCBlbXBoYXNpcywgLi4uKS4gVGhlIHR5cGUgb2YgZWxlbWVudCBjYW4gYmUgc2V0IHZpYSB0aGUgI3R5cGUgYWNjZXNzb3IuCisgICMKKyAgIyBGb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiBhbGwgc3VwcG9ydGVkIGVsZW1lbnQgdHlwZXMuCisgICMKKyAgIyBOb3RlIHRoYXQgdGhlIG9wdGlvbiA6bG9jYXRpb24gbWF5IGNvbnRhaW4gdGhlIHN0YXJ0IGxpbmUgbnVtYmVyIG9mIGFuIGVsZW1lbnQgaW4gdGhlIHNvdXJjZQorICAjIGRvY3VtZW50LgorICAjCisgICMgPT0gU3RydWN0dXJhbCBFbGVtZW50cworICAjCisgICMgPT09IDpyb290CisgICMKKyAgIyBbQ2F0ZWdvcnldIE5vbmUKKyAgIyBbVXNhZ2UgY29udGV4dF0gQXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIGRvY3VtZW50CisgICMgW0NvbnRlbnQgbW9kZWxdIEJsb2NrLWxldmVsIGVsZW1lbnRzCisgICMKKyAgIyBSZXByZXNlbnRzIHRoZSByb290IG9mIGEga3JhbWRvd24gZG9jdW1lbnQuCisgICMKKyAgIyBUaGUgcm9vdCBlbGVtZW50IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGtleXM6CisgICMKKyAgIyA6ZW5jb2Rpbmc6OiBXaGVuIHJ1bm5pbmcgb24gUnVieSAxLjkgdGhpcyBrZXkgaGFzIHRvIGJlIHNldCB0byB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIHRleHQKKyAgIyAgICAgICAgICAgICBwYXJ0cyBvZiB0aGUga3JhbWRvd24gZG9jdW1lbnQuCisgICMKKyAgIyA6YWJicmV2X2RlZnM6OiBUaGlzIGtleSBtYXkgYmUgdXNlZCB0byBzdG9yZSB0aGUgbWFwcGluZyBvZiBhYmJyZXZpYXRpb24gdG8gYWJicmV2aWF0aW9uCisgICMgICAgICAgICAgICAgICAgZGVmaW5pdGlvbi4KKyAgIworICAjIDphYmJyZXZfYXR0cjo6IFRoaXMga2V5IG1heSBiZSB1c2VkIHRvIHN0b3JlIHRoZSBtYXBwaW5nIG9mIGFiYnJldmlhdGlvbiB0byBhYmJyZXZpYXRpb24KKyAgIyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLgorICAjCisgICMgOm9wdGlvbnM6OiBUaGlzIGtleSBtYXkgYmUgdXNlZCB0byBzdG9yZSBvcHRpb25zIHRoYXQgd2VyZSBzZXQgZHVyaW5nIHBhcnNpbmcgb2YgdGhlIGRvY3VtZW50LgorICAjCisgICMKKyAgIyA9PT0gOmJsYW5rCisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgYmxvY2stbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIEVtcHR5CisgICMKKyAgIyBSZXByZXNlbnRzIG9uZSBvciBtb3JlIGJsYW5rIGxpbmVzLiBJdCBpcyBub3QgYWxsb3dlZCB0byBoYXZlIHR3byBvciBtb3JlIGNvbnNlY3V0aXZlIGJsYW5rCisgICMgZWxlbWVudHMuCisgICMKKyAgIyBUaGUgK3ZhbHVlKyBmaWVsZCBtYXkgY29udGFpbiB0aGUgb3JpZ2luYWwgY29udGVudCBvZiB0aGUgYmxhbmsgbGluZXMuCisgICMKKyAgIworICAjID09PSA6cAorICAjCisgICMgW0NhdGVnb3J5XSBCbG9jay1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIGJsb2NrLWxldmVsIGVsZW1lbnRzIGFyZSBleHBlY3RlZAorICAjIFtDb250ZW50IG1vZGVsXSBTcGFuLWxldmVsIGVsZW1lbnRzCisgICMKKyAgIyBSZXByZXNlbnRzIGEgcGFyYWdyYXBoLgorICAjCisgICMgSWYgdGhlIG9wdGlvbiA6dHJhbnNwYXJlbnQgaXMgK3RydWUrLCB0aGlzIGVsZW1lbnQganVzdCByZXByZXNlbnRzIGEgYmxvY2sgb2YgdGV4dC4gSS5lLiB0aGlzCisgICMgZWxlbWVudCBqdXN0IGZ1bmN0aW9ucyBhcyBhIGNvbnRhaW5lciBmb3Igc3Bhbi1sZXZlbCBlbGVtZW50cy4KKyAgIworICAjCisgICMgPT09IDpoZWFkZXIKKyAgIworICAjIFtDYXRlZ29yeV0gQmxvY2stbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBibG9jay1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gU3Bhbi1sZXZlbCBlbGVtZW50cworICAjCisgICMgUmVwcmVzZW50cyBhIGhlYWRlci4KKyAgIworICAjIFRoZSBvcHRpb24gOmxldmVsIHNwZWNpZmllcyB0aGUgaGVhZGVyIGxldmVsIGFuZCBoYXMgdG8gY29udGFpbiBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIFw2LiBUaGUKKyAgIyBvcHRpb24gOnJhd190ZXh0IGhhcyB0byBjb250YWluIHRoZSByYXcgaGVhZGVyIHRleHQuCisgICMKKyAgIworICAjID09PSA6YmxvY2txdW90ZQorICAjCisgICMgW0NhdGVnb3J5XSBCbG9jay1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIGJsb2NrLWxldmVsIGVsZW1lbnRzIGFyZSBleHBlY3RlZAorICAjIFtDb250ZW50IG1vZGVsXSBCbG9jay1sZXZlbCBlbGVtZW50cworICAjCisgICMgUmVwcmVzZW50cyBhIGJsb2NrcXVvdGUuCisgICMKKyAgIworICAjID09PSA6Y29kZWJsb2NrCisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgYmxvY2stbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIEVtcHR5CisgICMKKyAgIyBSZXByZXNlbnRzIGEgY29kZSBibG9jaywgaS5lLiBhIGJsb2NrIG9mIHRleHQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcy1pcy4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIGhhcyB0byBjb250YWluIHRoZSBjb250ZW50IG9mIHRoZSBjb2RlIGJsb2NrLgorICAjCisgICMgVGhlIG9wdGlvbiA6bGFuZyBzcGVjaWZpZXMgYSBoaWdobGlnaHRpbmcgbGFuZ3VhZ2Ugd2l0aCBwb3NzaWJsZSBIVE1MIHN0eWxlIG9wdGlvbnMgKGUuZy4KKyAgIyBwaHA/c3RhcnRfaW5saW5lPTEpIGFuZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGEgcG9zc2libHkgYWxzbyBhdmFpbGFibGUgbGFuZ3VhZ2UgZW1iZWRkZWQgaW4KKyAgIyBhIGNsYXNzIG5hbWUgb2YgdGhlIGZvcm0gJ2xhbmd1YWdlLUxBTkcnLgorICAjCisgICMKKyAgIyA9PT0gOnVsCisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgYmxvY2stbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIE9uZSBvciBtb3JlIDpsaSBlbGVtZW50cworICAjCisgICMgUmVwcmVzZW50cyBhbiB1bm9yZGVyZWQgbGlzdC4KKyAgIworICAjCisgICMgPT09IDpvbAorICAjCisgICMgW0NhdGVnb3J5XSBCbG9jay1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIGJsb2NrLWxldmVsIGVsZW1lbnRzIGFyZSBleHBlY3RlZAorICAjIFtDb250ZW50IG1vZGVsXSBPbmUgb3IgbW9yZSA6bGkgZWxlbWVudHMKKyAgIworICAjIFJlcHJlc2VudHMgYW4gb3JkZXJlZCBsaXN0LgorICAjCisgICMKKyAgIyA9PT0gOmxpCisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gSW5zaWRlIDpvbCBhbmQgOnVsIGVsZW1lbnRzCisgICMgW0NvbnRlbnQgbW9kZWxdIEJsb2NrLWxldmVsIGVsZW1lbnRzCisgICMKKyAgIyBSZXByZXNlbnRzIGEgbGlzdCBpdGVtIG9mIGFuIG9yZGVyZWQgb3IgdW5vcmRlcmVkIGxpc3QuCisgICMKKyAgIyBOb3RlIHRoYXQgdGhlIGZpcnN0IGNoaWxkIG9mIGEgbGlzdCBpdGVtIG11c3Qgbm90IGJlIGEgOmJsYW5rIGVsZW1lbnQhCisgICMKKyAgIworICAjID09PSA6ZGwKKyAgIworICAjIFtDYXRlZ29yeV0gQmxvY2stbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBibG9jay1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gT25lIG9yIG1vcmUgZ3JvdXBzIGVhY2ggY29uc2lzdGluZyBvZiBvbmUgb3IgbW9yZSA6ZHQgZWxlbWVudHMgZm9sbG93ZWQgYnkgb25lCisgICMgICAgICAgICAgICAgICAgIG9yIG1vcmUgOmRkIGVsZW1lbnRzLgorICAjCisgICMgUmVwcmVzZW50cyBhIGRlZmluaXRpb24gbGlzdCB3aGljaCBjb250YWlucyBncm91cHMgY29uc2lzdGluZyBvZiB0ZXJtcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHRoZW0uCisgICMKKyAgIworICAjID09PSA6ZHQKKyAgIworICAjIFtDYXRlZ29yeV0gQmxvY2stbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBCZWZvcmUgOmR0IG9yIDpkZCBlbGVtZW50cyBpbnNpZGUgYSA6ZGwgZWxtZW50CisgICMgW0NvbnRlbnQgbW9kZWxdIFNwYW4tbGV2ZWwgZWxlbWVudHMKKyAgIworICAjIFJlcHJlc2VudHMgdGhlIHRlcm0gcGFydCBvZiBhIHRlcm0tZGVmaW5pdGlvbiBncm91cCBpbiBhIGRlZmluaXRpb24gbGlzdC4KKyAgIworICAjCisgICMgPT09IDpkZAorICAjCisgICMgW0NhdGVnb3J5XSBCbG9jay1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIEFmdGVyIDpkdCBvciA6ZGQgZWxlbWVudHMgaW5zaWRlIGEgOmRsIGVsbWVudAorICAjIFtDb250ZW50IG1vZGVsXSBCbG9jay1sZXZlbCBlbGVtZW50cworICAjCisgICMgUmVwcmVzZW50cyB0aGUgZGVmaW5pdGlvbiBwYXJ0IG9mIGEgdGVybS1kZWZpbml0aW9uIGdyb3VwIGluIGEgZGVmaW5pdGlvbiBsaXN0LgorICAjCisgICMKKyAgIyA9PT0gOmhyCisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgYmxvY2stbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIE5vbmUKKyAgIworICAjIFJlcHJlc2VudHMgYSBob3Jpem9udGFsIGxpbmUuCisgICMKKyAgIworICAjID09PSA6dGFibGUKKyAgIworICAjIFtDYXRlZ29yeV0gQmxvY2stbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBibG9jay1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gWmVybyBvciBvbmUgOnRoZWFkIGVsZW1lbnRzLCBvbmUgb3IgbW9yZSA6dGJvZHkgZWxlbWVudHMsIHplcm8gb3Igb25lIDp0Zm9vdAorICAjICAgICAgICAgICAgICAgICBlbGVtZW50cworICAjCisgICMgUmVwcmVzZW50cyBhIHRhYmxlLiBFYWNoIHRhYmxlIHJvdyAoaS5lLiA6dHIgZWxlbWVudCkgb2YgdGhlIHRhYmxlIGhhcyB0byBjb250YWluIHRoZSBzYW1lCisgICMgbnVtYmVyIG9mIDp0ZCBlbGVtZW50cy4KKyAgIworICAjIFRoZSBvcHRpb24gOmFsaWdubWVudCBoYXMgdG8gYmUgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgYWxpZ25tZW50IHZhbHVlcywgZXhhY3RseSBvbmUgZm9yIGVhY2gKKyAgIyBjb2x1bW4gb2YgdGhlIHRhYmxlLiBUaGUgcG9zc2libGUgYWxpZ25tZW50IHZhbHVlcyBhcmUgOmxlZnQsIDpjZW50ZXIsIDpyaWdodCBhbmQgOmRlZmF1bHQuCisgICMKKyAgIworICAjID09PSA6dGhlYWQKKyAgIworICAjIFtDYXRlZ29yeV0gTm9uZQorICAjIFtVc2FnZSBjb250ZXh0XSBBcyBmaXJzdCBlbGVtZW50IGluc2lkZSBhIDp0YWJsZSBlbGVtZW50CisgICMgW0NvbnRlbnQgbW9kZWxdIE9uZSBvciBtb3JlIDp0ciBlbGVtZW50cworICAjCisgICMgUmVwcmVzZW50cyB0aGUgdGFibGUgaGVhZGVyLgorICAjCisgICMKKyAgIyA9PT0gOnRib2R5CisgICMKKyAgIyBbQ2F0ZWdvcnldIE5vbmUKKyAgIyBbVXNhZ2UgY29udGV4dF0gQWZ0ZXIgYSA6dGhlYWQgZWxlbWVudCBidXQgYmVmb3JlIGEgOnRmb290IGVsZW1lbnQgaW5zaWRlIGEgOnRhYmxlIGVsZW1lbnQKKyAgIyBbQ29udGVudCBtb2RlbF0gT25lIG9yIG1vcmUgOnRyIGVsZW1lbnRzCisgICMKKyAgIyBSZXByZXNlbnRzIGEgdGFibGUgYm9keS4KKyAgIworICAjCisgICMgPT09IDp0Zm9vdAorICAjCisgICMgW0NhdGVnb3J5XSBOb25lCisgICMgW1VzYWdlIGNvbnRleHRdIEFzIGxhc3QgZWxlbWVudCBpbnNpZGUgYSA6dGFibGUgZWxlbWVudAorICAjIFtDb250ZW50IG1vZGVsXSBPbmUgb3IgbW9yZSA6dHIgZWxlbWVudHMKKyAgIworICAjIFJlcHJlc2VudHMgdGhlIHRhYmxlIGZvb3Rlci4KKyAgIworICAjCisgICMgPT09IDp0cgorICAjCisgICMgW0NhdGVnb3J5XSBOb25lCisgICMgW1VzYWdlIGNvbnRleHRdIEluc2lkZSA6dGhlYWQsIDp0Ym9keSBhbmQgOnRmb290IGVsZW1lbnRzCisgICMgW0NvbnRlbnQgbW9kZWxdIE9uZSBvciBtb3JlIDp0ZCBlbGVtZW50cworICAjCisgICMgUmVwcmVzZW50cyBhIHRhYmxlIHJvdy4KKyAgIworICAjCisgICMgPT09IDp0ZAorICAjCisgICMgW0NhdGVnb3J5XSBCbG9jay1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIEluc2lkZSA6dHIgZWxlbWVudHMKKyAgIyBbQ29udGVudCBtb2RlbF0gQXMgY2hpbGQgb2YgOnRoZWFkLzp0ciBzcGFuLWxldmVsIGVsZW1lbnRzLCBhcyBjaGlsZCBvZiA6dGJvZHkvOnRyIGFuZAorICAjICAgICAgICAgICAgICAgICA6dGZvb3QvOnRyIGJsb2NrLWxldmVsIGVsZW1lbnRzCisgICMKKyAgIyBSZXByZXNlbnRzIGEgdGFibGUgY2VsbC4KKyAgIworICAjCisgICMgPT09IDptYXRoCisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrL3NwYW4tbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBibG9jay9zcGFuLWxldmVsIGVsZW1lbnRzIGFyZSBleHBlY3RlZAorICAjIFtDb250ZW50IG1vZGVsXSBOb25lCisgICMKKyAgIyBSZXByZXNlbnRzIG1hdGhlbWF0aWNhbCB0ZXh0IHRoYXQgaXMgd3JpdHRlbiBpbiBMYVRlWC4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIGhhcyB0byBjb250YWluIHRoZSBhY3R1YWwgbWF0aGVtYXRpY2FsIHRleHQuCisgICMKKyAgIyBUaGUgb3B0aW9uIDpjYXRlZ29yeSBoYXMgdG8gYmUgc2V0IHRvIGVpdGhlciA6c3BhbiBvciA6YmxvY2sgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IHdoZXJlIHRoZQorICAjIGVsZW1lbnQgaXMgdXNlZC4KKyAgIworICAjCisgICMgPT0gVGV4dCBNYXJrdXAgRWxlbWVudHMKKyAgIworICAjID09PSA6dGV4dAorICAjCisgICMgW0NhdGVnb3J5XSBTcGFuLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgc3Bhbi1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gTm9uZQorICAjCisgICMgUmVwcmVzZW50cyB0ZXh0LgorICAjCisgICMgVGhlICt2YWx1ZSsgZmllbGQgaGFzIHRvIGNvbnRhaW4gdGhlIHRleHQgaXRzZWxmLgorICAjCisgICMKKyAgIyA9PT0gOmJyCisgICMKKyAgIyBbQ2F0ZWdvcnldIFNwYW4tbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBzcGFuLWxldmVsIGVsZW1lbnRzIGFyZSBleHBlY3RlZAorICAjIFtDb250ZW50IG1vZGVsXSBOb25lCisgICMKKyAgIyBSZXByZXNlbnRzIGEgaGFyZCBsaW5lIGJyZWFrLgorICAjCisgICMKKyAgIyA9PT0gOmEKKyAgIworICAjIFtDYXRlZ29yeV0gU3Bhbi1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIHNwYW4tbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIFNwYW4tbGV2ZWwgZWxlbWVudHMKKyAgIworICAjIFJlcHJlc2VudHMgYSBsaW5rIHRvIGFuIFVSTC4KKyAgIworICAjIFRoZSBhdHRyaWJ1dGUgK2hyZWYrIGhhcyB0byBiZSBzZXQgdG8gdGhlIFVSTCB0byB3aGljaCB0aGUgbGluayBwb2ludHMuIFRoZSBhdHRyaWJ1dGUgK3RpdGxlKworICAjIG9wdGlvbmFsbHkgY29udGFpbnMgdGhlIHRpdGxlIG9mIHRoZSBsaW5rLgorICAjCisgICMKKyAgIyA9PT0gOmltZworICAjCisgICMgW0NhdGVnb3J5XSBTcGFuLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgc3Bhbi1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gTm9uZQorICAjCisgICMgUmVwcmVzZW50cyBhbiBpbWFnZS4KKyAgIworICAjIFRoZSBhdHRyaWJ1dGUgK3NyYysgaGFzIHRvIGJlIHNldCB0byB0aGUgVVJMIG9mIHRoZSBpbWFnZS4gVGhlIGF0dHJpYnV0ZSArYWx0KyBoYXMgdG8gY29udGFpbiBhCisgICMgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgaW1hZ2UuIFRoZSBhdHRyaWJ1dGUgK3RpdGxlKyBvcHRpb25hbGx5IGNvbnRhaW5zIHRoZSB0aXRsZSBvZiB0aGUgaW1hZ2UuCisgICMKKyAgIworICAjID09PSA6Y29kZXNwYW4KKyAgIworICAjIFtDYXRlZ29yeV0gU3Bhbi1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIHNwYW4tbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIE5vbmUKKyAgIworICAjIFJlcHJlc2VudHMgdmVyYmF0aW0gdGV4dC4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIGhhcyB0byBjb250YWluIHRoZSBjb250ZW50IG9mIHRoZSBjb2RlIHNwYW4uCisgICMKKyAgIworICAjID09PSA6Zm9vdG5vdGUKKyAgIworICAjIFtDYXRlZ29yeV0gU3Bhbi1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIHNwYW4tbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIE5vbmUKKyAgIworICAjIFJlcHJlc2VudHMgYSBmb290bm90ZSBtYXJrZXIuCisgICMKKyAgIyBUaGUgK3ZhbHVlKyBmaWVsZCBoYXMgdG8gY29udGFpbiBhbiBlbGVtZW50IHdob3NlIGNoaWxkcmVuIGFyZSB0aGUgY29udGVudCBvZiB0aGUgZm9vdG5vdGUuIFRoZQorICAjIG9wdGlvbiA6bmFtZSBoYXMgdG8gY29udGFpbiBhIHZhbGlkIGFuZCB1bmlxdWUgZm9vdG5vdGUgbmFtZS4gQSB2YWxpZCBmb290bm90ZSBuYW1lIGNvbnNpc3RzIG9mCisgICMgYSB3b3JkIGNoYXJhY3RlciBvciBhIGRpZ2l0IGFuZCB0aGVuIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgb3RoZXIgd29yZCBjaGFyYWN0ZXJzLCBkaWdpdHMgb3IKKyAgIyBkYXNoZXMuCisgICMKKyAgIworICAjID09PSA6ZW0KKyAgIworICAjIFtDYXRlZ29yeV0gU3Bhbi1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIHNwYW4tbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIFNwYW4tbGV2ZWwgZWxlbWVudHMKKyAgIworICAjIFJlcHJlc2VudHMgZW1waGFzaXMgb2YgaXRzIGNvbnRlbnRzLgorICAjCisgICMKKyAgIyA9PT0gOnN0cm9uZworICAjCisgICMgW0NhdGVnb3J5XSBTcGFuLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgc3Bhbi1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gU3Bhbi1sZXZlbCBlbGVtZW50cworICAjCisgICMgUmVwcmVzZW50cyBzdHJvbmcgaW1wb3J0YW5jZSBmb3IgaXRzIGNvbnRlbnRzLgorICAjCisgICMKKyAgIyA9PT0gOmVudGl0eQorICAjCisgICMgW0NhdGVnb3J5XSBTcGFuLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgc3Bhbi1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gTm9uZQorICAjCisgICMgUmVwcmVzZW50cyBhbiBIVE1MIGVudGl0eS4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIGhhcyB0byBjb250YWluIGFuIGluc3RhbmNlIG9mIEtyYW1kb3duOjpVdGlsczo6RW50aXRpZXM6OkVudGl0eS4gVGhlIG9wdGlvbgorICAjIDpvcmlnaW5hbCBjYW4gYmUgdXNlZCB0byBzdG9yZSB0aGUgb3JpZ2luYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVudGl0eS4KKyAgIworICAjCisgICMgPT09IDp0eXBvZ3JhcGhpY19zeW0KKyAgIworICAjIFtDYXRlZ29yeV0gU3Bhbi1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIHNwYW4tbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkCisgICMgW0NvbnRlbnQgbW9kZWxdIE5vbmUKKyAgIworICAjIFJlcHJlc2VudHMgYSB0eXBvZ3JhcGhpYyBzeW1ib2wuCisgICMKKyAgIyBUaGUgK3ZhbHVlKyBmaWVsZCBuZWVkcyB0byBjb250YWluIGEgU3ltYm9sIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWMgdHlwb2dyYXBoaWMgc3ltYm9sIGZyb20KKyAgIyB0aGUgZm9sbG93aW5nIGxpc3Q6CisgICMKKyAgIyA6bWRhc2g6OiBBbiBtZGFzaCBjaGFyYWN0ZXIgKC0tLSkKKyAgIyA6bmRhc2g6OiBBbiBuZGFzaCBjaGFyYWN0ZXIgKC0tKQorICAjIDpoZWxsaXA6OiBBbiBlbGxpcHNpcyAoLi4uKQorICAjIDpsYXF1bzo6IEEgbGVmdCBndWlsbGVtZXQgKDw8KQorICAjIDpyYXF1bzo6IEEgcmlnaHQgZ3VpbGxlbWV0ICg+PikKKyAgIyA6bGFxdW9fc3BhY2U6OiBBIGxlZnQgZ3VpbGxlbWV0IHdpdGggYSBzcGFjZSAoPDwgKQorICAjIDpyYXF1b19zcGFjZTo6IEEgcmlnaHQgZ3VpbGxlbWV0IHdpdGggYSBzcGFjZSAoID4+KQorICAjCisgICMKKyAgIyA9PT0gOnNtYXJ0X3F1b3RlCisgICMKKyAgIyBbQ2F0ZWdvcnldIFNwYW4tbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBzcGFuLWxldmVsIGVsZW1lbnRzIGFyZSBleHBlY3RlZAorICAjIFtDb250ZW50IG1vZGVsXSBOb25lCisgICMKKyAgIyBSZXByZXNlbnRzIGEgcXVvdGF0aW9uIGNoYXJhY3Rlci4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIG5lZWRzIHRvIGNvbnRhaW4gYSBTeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpYyBxdW90YXRpb24gY2hhcmFjdGVyOgorICAjCisgICMgOmxzcXVvOjogTGVmdCBzaW5nbGUgcXVvdGUKKyAgIyA6cnNxdW86OiBSaWdodCBzaW5nbGUgcXVvdGUKKyAgIyA6bGRxdW86OiBMZWZ0IGRvdWJsZSBxdW90ZQorICAjIDpyZHF1bzo6IFJpZ2h0IGRvdWJsZSBxdW90ZQorICAjCisgICMKKyAgIyA9PT0gOmFiYnJldmlhdGlvbgorICAjCisgICMgW0NhdGVnb3J5XSBTcGFuLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgc3Bhbi1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gTm9uZQorICAjCisgICMgUmVwcmVzZW50cyBhIHRleHQgcGFydCB0aGF0IGlzIGFuIGFiYnJldmlhdGlvbi4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIGhhcyB0byBjb250YWluIHRoZSB0ZXh0IHBhcnQgdGhhdCBpcyB0aGUgYWJicmV2aWF0aW9uLiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUKKyAgIyBhYmJyZXZpYXRpb24gaXMgc3RvcmVkIGluIHRoZSA6cm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4KKyAgIworICAjCisgICMgPT0gT3RoZXIgRWxlbWVudHMKKyAgIworICAjID09PSA6aHRtbF9lbGVtZW50CisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrL3NwYW4tbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBibG9jay9zcGFuLWxldmVsIGVsZW1lbnRzIG9yIHJhdyBIVE1MIGVsZW1lbnRzIGFyZSBleHBlY3RlZAorICAjIFtDb250ZW50IG1vZGVsXSBEZXBlbmRzIG9uIHRoZSBlbGVtZW50CisgICMKKyAgIyBSZXByZXNlbnRzIGFuIEhUTUwgZWxlbWVudC4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIGhhcyB0byBjb250YWluIHRoZSBuYW1lIG9mIHRoZSBIVE1MIGVsZW1lbnQgdGhlIGVsZW1lbnQgaXMgcmVwcmVzZW50aW5nLgorICAjCisgICMgVGhlIG9wdGlvbiA6Y2F0ZWdvcnkgaGFzIHRvIGJlIHNldCB0byBlaXRoZXIgOnNwYW4gb3IgOmJsb2NrIGRlcGVuZGluZyBvbiB0aGUgd2hldGhlciB0aGUKKyAgIyBlbGVtZW50IGlzIGEgYmxvY2stbGV2ZWwgb3IgYSBzcGFuLWxldmVsIGVsZW1lbnQuIFRoZSBvcHRpb24gOmNvbnRlbnRfbW9kZWwgaGFzIHRvIGJlIHNldCB0byB0aGUKKyAgIyBjb250ZW50IG1vZGVsIGZvciB0aGUgZWxlbWVudCAoZWl0aGVyIDpibG9jayBpZiBpdCBjb250YWlucyBibG9jay1sZXZlbCBlbGVtZW50cywgOnNwYW4gaWYgaXQKKyAgIyBjb250YWlucyBzcGFuLWxldmVsIGVsZW1lbnRzIG9yIDpyYXcgaWYgaXQgY29udGFpbnMgcmF3IGNvbnRlbnQpLgorICAjCisgICMKKyAgIyA9PT0gOnhtbF9jb21tZW50CisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrL3NwYW4tbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBibG9jay9zcGFuLWxldmVsIGVsZW1lbnRzIGFyZSBleHBlY3RlZCBvciBpbiByYXcgSFRNTCBlbGVtZW50cworICAjIFtDb250ZW50IG1vZGVsXSBOb25lCisgICMKKyAgIyBSZXByZXNlbnRzIGFuIFhNTC9IVE1MIGNvbW1lbnQuCisgICMKKyAgIyBUaGUgK3ZhbHVlKyBmaWVsZCBoYXMgdG8gY29udGFpbiB0aGUgd2hvbGUgWE1ML0hUTUwgY29tbWVudCBpbmNsdWRpbmcgdGhlIGRlbGltaXRlcnMuCisgICMKKyAgIyBUaGUgb3B0aW9uIDpjYXRlZ29yeSBoYXMgdG8gYmUgc2V0IHRvIGVpdGhlciA6c3BhbiBvciA6YmxvY2sgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IHdoZXJlIHRoZQorICAjIGVsZW1lbnQgaXMgdXNlZC4KKyAgIworICAjCisgICMgPT09IDp4bWxfcGkKKyAgIworICAjIFtDYXRlZ29yeV0gQmxvY2svc3Bhbi1sZXZlbCBlbGVtZW50CisgICMgW1VzYWdlIGNvbnRleHRdIFdoZXJlIGJsb2NrL3NwYW4tbGV2ZWwgZWxlbWVudHMgYXJlIGV4cGVjdGVkIG9yIGluIHJhdyBIVE1MIGVsZW1lbnRzCisgICMgW0NvbnRlbnQgbW9kZWxdIE5vbmUKKyAgIworICAjIFJlcHJlc2VudHMgYW4gWE1ML0hUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIGhhcyB0byBjb250YWluIHRoZSB3aG9sZSBYTUwvSFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGluY2x1ZGluZyB0aGUKKyAgIyBkZWxpbWl0ZXJzLgorICAjCisgICMgVGhlIG9wdGlvbiA6Y2F0ZWdvcnkgaGFzIHRvIGJlIHNldCB0byBlaXRoZXIgOnNwYW4gb3IgOmJsb2NrIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCB3aGVyZSB0aGUKKyAgIyBlbGVtZW50IGlzIHVzZWQuCisgICMKKyAgIworICAjID09PSA6Y29tbWVudAorICAjCisgICMgW0NhdGVnb3J5XSBCbG9jay9zcGFuLWxldmVsIGVsZW1lbnQKKyAgIyBbVXNhZ2UgY29udGV4dF0gV2hlcmUgYmxvY2svc3Bhbi1sZXZlbCBlbGVtZW50cyBhcmUgZXhwZWN0ZWQKKyAgIyBbQ29udGVudCBtb2RlbF0gTm9uZQorICAjCisgICMgUmVwcmVzZW50cyBhIGNvbW1lbnQuCisgICMKKyAgIyBUaGUgK3ZhbHVlKyBmaWVsZCBoYXMgdG8gY29udGFpbiB0aGUgY29tbWVudC4KKyAgIworICAjIFRoZSBvcHRpb24gOmNhdGVnb3J5IGhhcyB0byBiZSBzZXQgdG8gZWl0aGVyIDpzcGFuIG9yIDpibG9jayBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgd2hlcmUgdGhlCisgICMgZWxlbWVudCBpcyB1c2VkLiBJZiBpdCBpcyBzZXQgdG8gOnNwYW4sIHRoZW4gbm8gYmxhbmsgbGluZXMgYXJlIGFsbG93ZWQgaW4gdGhlIGNvbW1lbnQuCisgICMKKyAgIworICAjID09PSA6cmF3CisgICMKKyAgIyBbQ2F0ZWdvcnldIEJsb2NrL3NwYW4tbGV2ZWwgZWxlbWVudAorICAjIFtVc2FnZSBjb250ZXh0XSBXaGVyZSBibG9jay9zcGFuLWxldmVsIGVsZW1lbnRzIGFyZSBleHBlY3RlZAorICAjIFtDb250ZW50IG1vZGVsXSBOb25lCisgICMKKyAgIyBSZXByZXNlbnRzIGEgcmF3IHN0cmluZyB0aGF0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIEZvciBleGFtcGxlLCB0aGUgZWxlbWVudCBjb3VsZCBjb250YWluIHNvbWUKKyAgIyBIVE1MIGNvZGUgdGhhdCBzaG91bGQgYmUgb3V0cHV0IGFzLWlzIHdpdGhvdXQgbW9kaWZpY2F0aW9uIGFuZCBlc2NhcGluZy4KKyAgIworICAjIFRoZSArdmFsdWUrIGZpZWxkIGhhcyB0byBjb250YWluIHRoZSBhY3R1YWwgcmF3IHRleHQuCisgICMKKyAgIyBUaGUgb3B0aW9uIDpjYXRlZ29yeSBoYXMgdG8gYmUgc2V0IHRvIGVpdGhlciA6c3BhbiBvciA6YmxvY2sgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IHdoZXJlIHRoZQorICAjIGVsZW1lbnQgaXMgdXNlZC4gSWYgaXQgaXMgc2V0IHRvIDpzcGFuLCB0aGVuIG5vIGJsYW5rIGxpbmVzIGFyZSBhbGxvd2VkIGluIHRoZSByYXcgdGV4dC4KKyAgIworICAjIFRoZSBvcHRpb24gOnR5cGUgY2FuIGJlIHNldCB0byBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIGRlZmluZSBmb3Igd2hpY2ggY29udmVydGVycyB0aGUgcmF3IHN0cmluZworICAjIGlzIHZhbGlkLgorICAjCisgIGNsYXNzIEVsZW1lbnQKKworICAgICMgQSBzeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBlbGVtZW50IHR5cGUuIEZvciBleGFtcGxlLCA6cCBvciA6YmxvY2txdW90ZS4KKyAgICBhdHRyX2FjY2Vzc29yIDp0eXBlCisKKyAgICAjIFRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC4gVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgZmllbGQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KKyAgICAjIE1hbnkgZWxlbWVudHMgZG9uJ3QgdXNlIHRoaXMgZmllbGQuCisgICAgYXR0cl9hY2Nlc3NvciA6dmFsdWUKKworICAgICMgVGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoaXMgZWxlbWVudC4KKyAgICBhdHRyX2FjY2Vzc29yIDpjaGlsZHJlbgorCisKKyAgICAjIENyZWF0ZSBhIG5ldyBFbGVtZW50IG9iamVjdCBvZiB0eXBlICt0eXBlKy4gVGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgK3ZhbHVlKywgK2F0dHIrIGFuZAorICAgICMgK29wdGlvbnMrIGNhbiBhbHNvIGJlIHNldCBpbiB0aGlzIGNvbnN0cnVjdG9yIGZvciBjb252ZW5pZW5jZS4KKyAgICBkZWYgaW5pdGlhbGl6ZSh0eXBlLCB2YWx1ZSA9IG5pbCwgYXR0ciA9IG5pbCwgb3B0aW9ucyA9IG5pbCkKKyAgICAgIEB0eXBlLCBAdmFsdWUsIEBhdHRyLCBAb3B0aW9ucyA9IHR5cGUsIHZhbHVlLCAoVXRpbHM6Ok9yZGVyZWRIYXNoLm5ldy5tZXJnZSEoYXR0cikgaWYgYXR0ciksIG9wdGlvbnMKKyAgICAgIEBjaGlsZHJlbiA9IFtdCisgICAgZW5kCisKKyAgICAjIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50LiBVc2VzIGFuIFV0aWxzOjpPcmRlcmVkSGFzaCB0byByZXRhaW4gdGhlIGluc2VydGlvbiBvcmRlci4KKyAgICBkZWYgYXR0cgorICAgICAgQGF0dHIgfHw9IFV0aWxzOjpPcmRlcmVkSGFzaC5uZXcKKyAgICBlbmQKKworICAgICMgVGhlIG9wdGlvbnMgaGFzaCBmb3IgdGhlIGVsZW1lbnQuIEl0IGlzIHVzZWQgZm9yIHN0b3JpbmcgYXJiaXRyYXkgb3B0aW9ucy4KKyAgICBkZWYgb3B0aW9ucworICAgICAgQG9wdGlvbnMgfHw9IHt9CisgICAgZW5kCisKKyAgICBkZWYgaW5zcGVjdCAjOm5vZG9jOgorICAgICAgIjxrZDoje0B0eXBlfSN7QHZhbHVlLm5pbD8gPyAnJyA6ICcgJyArIEB2YWx1ZS5pbnNwZWN0fSAje0BhdHRyLmluc3BlY3R9I3tvcHRpb25zLmVtcHR5PyA/ICcnIDogJyAnICsgQG9wdGlvbnMuaW5zcGVjdH0je0BjaGlsZHJlbi5lbXB0eT8gPyAnJyA6ICcgJyArIEBjaGlsZHJlbi5pbnNwZWN0fT4iCisgICAgZW5kCisKKyAgICBDQVRFR09SWSA9IHt9ICMgOm5vZG9jOgorICAgIFs6YmxhbmssIDpwLCA6aGVhZGVyLCA6YmxvY2txdW90ZSwgOmNvZGVibG9jaywgOnVsLCA6b2wsIDpsaSwgOmRsLCA6ZHQsIDpkZCwgOnRhYmxlLCA6dGQsIDpocl0uZWFjaCB7fGJ8IENBVEVHT1JZW2JdID0gOmJsb2NrfQorICAgIFs6dGV4dCwgOmEsIDpiciwgOmltZywgOmNvZGVzcGFuLCA6Zm9vdG5vdGUsIDplbSwgOnN0cm9uZywgOmVudGl0eSwgOnR5cG9ncmFwaGljX3N5bSwKKyAgICAgOnNtYXJ0X3F1b3RlLCA6YWJicmV2aWF0aW9uXS5lYWNoIHt8YnwgQ0FURUdPUllbYl0gPSA6c3Bhbn0KKworICAgICMgUmV0dXJuIHRoZSBjYXRlZ29yeSBvZiArZWwrIHdoaWNoIGNhbiBiZSA6YmxvY2ssIDpzcGFuIG9yICtuaWwrLgorICAgICMKKyAgICAjIE1vc3QgZWxlbWVudHMgaGF2ZSBhIGZpeGVkIGNhdGVnb3J5LCBob3dldmVyLCBzb21lIGVsZW1lbnRzIGNhbiBlaXRoZXIgYXBwZWFyIGluIGEgYmxvY2stbGV2ZWwKKyAgICAjIG9yIGEgc3Bhbi1sZXZlbCBjb250ZXh0LiBUaGVzZSBlbGVtZW50cyBuZWVkIHRvIGhhdmUgdGhlIG9wdGlvbiA6Y2F0ZWdvcnkgY29ycmVjdGx5IHNldC4KKyAgICBkZWYgc2VsZi5jYXRlZ29yeShlbCkKKyAgICAgIENBVEVHT1JZW2VsLnR5cGVdIHx8IGVsLm9wdGlvbnNbOmNhdGVnb3J5XQorICAgIGVuZAorCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vZXJyb3IucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2Vycm9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTY1YjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL2Vycm9yLnJiCkBAIC0wLDAgKzEsMTcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duCisKKyAgIyBUaGlzIGVycm9yIGlzIHJhaXNlZCB3aGVuIGFuIGVycm9yIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4KKyAgIworICAjICpOb3RlKiB0aGF0IHRoaXMgZXJyb3IgaXMgb25seSByYWlzZWQgYnkgdGhlIHN1cHBvcnQgZnJhbWV3b3JrIGZvciB0aGUgcGFyc2VycyBhbmQgY29udmVydGVycy4KKyAgY2xhc3MgRXJyb3IgPCBSdW50aW1lRXJyb3I7IGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vb3B0aW9ucy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vb3B0aW9ucy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVjZWViCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9vcHRpb25zLnJiCkBAIC0wLDAgKzEsNjI3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ3lhbWwnCisKK21vZHVsZSBLcmFtZG93bgorCisgICMgVGhpcyBtb2R1bGUgZGVmaW5lcyBhbGwgb3B0aW9ucyB0aGF0IGFyZSB1c2VkIGJ5IHBhcnNlcnMgYW5kL29yIGNvbnZlcnRlcnMgYXMgd2VsbCBhcyBwcm92aWRpbmcKKyAgIyBtZXRob2RzIHRvIGRlYWwgd2l0aCB0aGUgb3B0aW9ucy4KKyAgbW9kdWxlIE9wdGlvbnMKKworICAgICMgSGVscGVyIGNsYXNzIGludHJvZHVjaW5nIGEgYm9vbGVhbiB0eXBlIGZvciBzcGVjaWZ5aW5nIGJvb2xlYW4gdmFsdWVzICgrdHJ1ZSsgYW5kICtmYWxzZSspIGFzCisgICAgIyBvcHRpb24gdHlwZXMuCisgICAgY2xhc3MgQm9vbGVhbgorCisgICAgICAjIFJldHVybiArdHJ1ZSsgaWYgK290aGVyKyBpcyBlaXRoZXIgK3RydWUrIG9yICtmYWxzZSsKKyAgICAgIGRlZiBzZWxmLj09PShvdGhlcikKKyAgICAgICAgRmFsc2VDbGFzcyA9PT0gb3RoZXIgfHwgVHJ1ZUNsYXNzID09PSBvdGhlcgorICAgICAgZW5kCisKKyAgICBlbmQKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgOnNlY3Rpb246IE9wdGlvbiBkZWZpbml0aW9ucworICAgICMKKyAgICAjIFRoaXMgc2VjdGlvbnMgZGVzY3JpYmVzIHRoZSBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgb24gdGhlIE9wdGlvbnMgbW9kdWxlLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIyBTdHJ1Y3QgY2xhc3MgZm9yIHN0b3JpbmcgdGhlIGRlZmluaXRpb24gb2YgYW4gb3B0aW9uLgorICAgIERlZmluaXRpb24gPSBTdHJ1Y3QubmV3KDpuYW1lLCA6dHlwZSwgOmRlZmF1bHQsIDpkZXNjLCA6dmFsaWRhdG9yKQorCisgICAgIyBBbGxvd2VkIG9wdGlvbiB0eXBlcy4KKyAgICBBTExPV0VEX1RZUEVTID0gW1N0cmluZywgSW50ZWdlciwgRmxvYXQsIFN5bWJvbCwgQm9vbGVhbiwgT2JqZWN0XQorCisgICAgQG9wdGlvbnMgPSB7fQorCisgICAgIyBEZWZpbmUgYSBuZXcgb3B0aW9uIGNhbGxlZCArbmFtZSsgKGEgU3ltYm9sKSB3aXRoIHRoZSBnaXZlbiArdHlwZSsgKFN0cmluZywgSW50ZWdlciwgRmxvYXQsCisgICAgIyBTeW1ib2wsIEJvb2xlYW4sIE9iamVjdCksIGRlZmF1bHQgdmFsdWUgK2RlZmF1bHQrIGFuZCB0aGUgZGVzY3JpcHRpb24gK2Rlc2MrLiBJZiBhIGJsb2NrIGlzCisgICAgIyBzcGVjaWZpZWQsIGl0IHNob3VsZCB2YWxpZGF0ZSB0aGUgdmFsdWUgYW5kIGVpdGhlciByYWlzZSBhbiBlcnJvciBvciByZXR1cm4gYSB2YWxpZCB2YWx1ZS4KKyAgICAjCisgICAgIyBUaGUgdHlwZSAnT2JqZWN0JyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjb21wbGV4IHR5cGVzIGZvciB3aGljaCBub25lIG9mIHRoZSBvdGhlciB0eXBlcworICAgICMgc3VmZmljZXMuIEEgYmxvY2sgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIHdoZW4gdXNpbmcgdHlwZSAnT2JqZWN0JyBhbmQgaXQgaGFzIHRvIGNvcGUgd2l0aAorICAgICMgYSB2YWx1ZSBnaXZlbiBhcyBzdHJpbmcgYW5kIGFzIHRoZSBvcGFxdWUgdHlwZS4KKyAgICBkZWYgc2VsZi5kZWZpbmUobmFtZSwgdHlwZSwgZGVmYXVsdCwgZGVzYywgJmJsb2NrKQorICAgICAgbmFtZSA9IG5hbWUudG9fc3ltCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiT3B0aW9uIG5hbWUgI3tuYW1lfSBpcyBhbHJlYWR5IHVzZWQiIGlmIEBvcHRpb25zLmhhc19rZXk/KG5hbWUpCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiSW52YWxpZCBvcHRpb24gdHlwZSAje3R5cGV9IHNwZWNpZmllZCIgaWYgIUFMTE9XRURfVFlQRVMuaW5jbHVkZT8odHlwZSkKKyAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJJbnZhbGlkIHR5cGUgZm9yIGRlZmF1bHQgdmFsdWUiIGlmICEodHlwZSA9PT0gZGVmYXVsdCkgJiYgIWRlZmF1bHQubmlsPworICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgIk1pc3NpbmcgdmFsaWRhdG9yIGJsb2NrIiBpZiB0eXBlID09IE9iamVjdCAmJiBibG9jay5uaWw/CisgICAgICBAb3B0aW9uc1tuYW1lXSA9IERlZmluaXRpb24ubmV3KG5hbWUsIHR5cGUsIGRlZmF1bHQsIGRlc2MsIGJsb2NrKQorICAgIGVuZAorCisgICAgIyBSZXR1cm4gYWxsIG9wdGlvbiBkZWZpbml0aW9ucy4KKyAgICBkZWYgc2VsZi5kZWZpbml0aW9ucworICAgICAgQG9wdGlvbnMKKyAgICBlbmQKKworICAgICMgUmV0dXJuICt0cnVlKyBpZiBhbiBvcHRpb24gY2FsbGVkICtuYW1lKyBpcyBkZWZpbmVkLgorICAgIGRlZiBzZWxmLmRlZmluZWQ/KG5hbWUpCisgICAgICBAb3B0aW9ucy5oYXNfa2V5PyhuYW1lLnRvX3N5bSkKKyAgICBlbmQKKworICAgICMgUmV0dXJuIGEgSGFzaCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG9wdGlvbnMuCisgICAgZGVmIHNlbGYuZGVmYXVsdHMKKyAgICAgIHRlbXAgPSB7fQorICAgICAgQG9wdGlvbnMuZWFjaCB7fG4sIG98IHRlbXBbby5uYW1lXSA9IG8uZGVmYXVsdH0KKyAgICAgIHRlbXAKKyAgICBlbmQKKworICAgICMgTWVyZ2UgdGhlICNkZWZhdWx0cyBIYXNoIHdpdGggdGhlICpwYXJzZWQqIG9wdGlvbnMgZnJvbSB0aGUgZ2l2ZW4gSGFzaCwgaS5lLiBvbmx5IHZhbGlkIG9wdGlvbgorICAgICMgbmFtZXMgYXJlIGNvbnNpZGVyZWQgYW5kIHRoZWlyIHZhbHVlIGlzIHJ1biB0aHJvdWdoIHRoZSAjcGFyc2UgbWV0aG9kLgorICAgIGRlZiBzZWxmLm1lcmdlKGhhc2gpCisgICAgICB0ZW1wID0gZGVmYXVsdHMKKyAgICAgIGhhc2guZWFjaCBkbyB8ayx2fAorICAgICAgICBrID0gay50b19zeW0KKyAgICAgICAgQG9wdGlvbnMuaGFzX2tleT8oaykgPyB0ZW1wW2tdID0gcGFyc2UoaywgdikgOiB0ZW1wW2tdID0gdgorICAgICAgZW5kCisgICAgICB0ZW1wCisgICAgZW5kCisKKyAgICAjIFBhcnNlIHRoZSBnaXZlbiB2YWx1ZSArZGF0YSsgYXMgaWYgaXQgd2FzIGEgdmFsdWUgZm9yIHRoZSBvcHRpb24gK25hbWUrIGFuZCByZXR1cm4gdGhlIHBhcnNlZAorICAgICMgdmFsdWUgd2l0aCB0aGUgY29ycmVjdCB0eXBlLgorICAgICMKKyAgICAjIElmICtkYXRhKyBhbHJlYWR5IGhhcyB0aGUgY29ycmVjdCB0eXBlLCBpdCBpcyBqdXN0IHJldHVybmVkLiBPdGhlcndpc2UgaXQgaXMgY29udmVydGVkIHRvIGEKKyAgICAjIFN0cmluZyBhbmQgdGhlbiB0byB0aGUgY29ycmVjdCB0eXBlLgorICAgIGRlZiBzZWxmLnBhcnNlKG5hbWUsIGRhdGEpCisgICAgICBuYW1lID0gbmFtZS50b19zeW0KKyAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJObyBvcHRpb24gbmFtZWQgI3tuYW1lfSBkZWZpbmVkIiBpZiAhQG9wdGlvbnMuaGFzX2tleT8obmFtZSkKKyAgICAgIGlmICEoQG9wdGlvbnNbbmFtZV0udHlwZSA9PT0gZGF0YSkKKyAgICAgICAgZGF0YSA9IGRhdGEudG9fcworICAgICAgICBkYXRhID0gaWYgQG9wdGlvbnNbbmFtZV0udHlwZSA9PSBTdHJpbmcKKyAgICAgICAgICAgICAgICAgZGF0YQorICAgICAgICAgICAgICAgZWxzaWYgQG9wdGlvbnNbbmFtZV0udHlwZSA9PSBJbnRlZ2VyCisgICAgICAgICAgICAgICAgIEludGVnZXIoZGF0YSkgcmVzY3VlIHJhaXNlIEtyYW1kb3duOjpFcnJvciwgIkludmFsaWQgaW50ZWdlciB2YWx1ZSBmb3Igb3B0aW9uICcje25hbWV9JzogJyN7ZGF0YX0nIgorICAgICAgICAgICAgICAgZWxzaWYgQG9wdGlvbnNbbmFtZV0udHlwZSA9PSBGbG9hdAorICAgICAgICAgICAgICAgICBGbG9hdChkYXRhKSByZXNjdWUgcmFpc2UgS3JhbWRvd246OkVycm9yLCAiSW52YWxpZCBmbG9hdCB2YWx1ZSBmb3Igb3B0aW9uICcje25hbWV9JzogJyN7ZGF0YX0nIgorICAgICAgICAgICAgICAgZWxzaWYgQG9wdGlvbnNbbmFtZV0udHlwZSA9PSBTeW1ib2wKKyAgICAgICAgICAgICAgICAgc3RyX3RvX3N5bShkYXRhKQorICAgICAgICAgICAgICAgZWxzaWYgQG9wdGlvbnNbbmFtZV0udHlwZSA9PSBCb29sZWFuCisgICAgICAgICAgICAgICAgIGRhdGEuZG93bmNhc2Uuc3RyaXAgIT0gJ2ZhbHNlJyAmJiAhZGF0YS5lbXB0eT8KKyAgICAgICAgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBkYXRhID0gQG9wdGlvbnNbbmFtZV0udmFsaWRhdG9yW2RhdGFdIGlmIEBvcHRpb25zW25hbWVdLnZhbGlkYXRvcgorICAgICAgZGF0YQorICAgIGVuZAorCisgICAgIyBDb252ZXJ0cyB0aGUgZ2l2ZW4gU3RyaW5nICtkYXRhKyBpbnRvIGEgU3ltYm9sIG9yICtuaWwrIHdpdGggdGhlCisgICAgIyBmb2xsb3dpbmcgcHJvdmlzaW9uczoKKyAgICAjCisgICAgIyAtIEEgbGVhZGluZyBjb2xvbiBpcyBzdHJpcHBlZCBmcm9tIHRoZSBzdHJpbmcuCisgICAgIyAtIEFuIGVtcHR5IHZhbHVlIG9yIGEgdmFsdWUgZXF1YWwgdG8gIm5pbCIgcmVzdWx0cyBpbiArbmlsKy4KKyAgICBkZWYgc2VsZi5zdHJfdG9fc3ltKGRhdGEpCisgICAgICBkYXRhID0gZGF0YS5zdHJpcAorICAgICAgZGF0YSA9IGRhdGFbMS4uLTFdIGlmIGRhdGFbMF0gPT0gPzoKKyAgICAgIChkYXRhLmVtcHR5PyB8fCBkYXRhID09ICduaWwnID8gbmlsIDogZGF0YS50b19zeW0pCisgICAgZW5kCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIDpzZWN0aW9uOiBPcHRpb24gVmFsaWRhdG9ycworICAgICMKKyAgICAjIFRoaXMgc2VjdGlvbnMgY29udGFpbnMgYWxsIHByZS1kZWZpbmVkIG9wdGlvbiB2YWxpZGF0b3JzLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIyBFbnN1cmVzIHRoYXQgdGhlIG9wdGlvbiB2YWx1ZSArdmFsKyBmb3IgdGhlIG9wdGlvbiBjYWxsZWQgK25hbWUrIGlzIGEgdmFsaWQgYXJyYXkuIFRoZQorICAgICMgcGFyYW1ldGVyICt2YWwrIGNhbiBiZQorICAgICMKKyAgICAjIC0gYSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIHdoaWNoIGlzIHNwbGl0IGludG8gYW4gYXJyYXkgb2YgdmFsdWVzCisgICAgIyAtIG9yIGFuIGFycmF5LgorICAgICMKKyAgICAjIE9wdGlvbmFsbHksIHRoZSBhcnJheSBpcyBjaGVja2VkIGZvciB0aGUgY29ycmVjdCBzaXplLgorICAgIGRlZiBzZWxmLnNpbXBsZV9hcnJheV92YWxpZGF0b3IodmFsLCBuYW1lLCBzaXplID0gbmlsKQorICAgICAgaWYgU3RyaW5nID09PSB2YWwKKyAgICAgICAgdmFsID0gdmFsLnNwbGl0KC8sLykKKyAgICAgIGVsc2lmICEoQXJyYXkgPT09IHZhbCkKKyAgICAgICAgcmFpc2UgS3JhbWRvd246OkVycm9yLCAiSW52YWxpZCB0eXBlICN7dmFsLmNsYXNzfSBmb3Igb3B0aW9uICN7bmFtZX0iCisgICAgICBlbmQKKyAgICAgIGlmIHNpemUgJiYgdmFsLnNpemUgIT0gc2l6ZQorICAgICAgICByYWlzZSBLcmFtZG93bjo6RXJyb3IsICJPcHRpb24gI3tuYW1lfSBuZWVkcyBleGFjdGx5ICN7c2l6ZX0gdmFsdWVzIgorICAgICAgZW5kCisgICAgICB2YWwKKyAgICBlbmQKKworICAgICMgRW5zdXJlcyB0aGF0IHRoZSBvcHRpb24gdmFsdWUgK3ZhbCsgZm9yIHRoZSBvcHRpb24gY2FsbGVkICtuYW1lKyBpcyBhIHZhbGlkIGhhc2guIFRoZQorICAgICMgcGFyYW1ldGVyICt2YWwrIGNhbiBiZQorICAgICMKKyAgICAjIC0gYSBoYXNoIGluIFlBTUwgZm9ybWF0CisgICAgIyAtIG9yIGEgUnVieSBIYXNoIG9iamVjdC4KKyAgICBkZWYgc2VsZi5zaW1wbGVfaGFzaF92YWxpZGF0b3IodmFsLCBuYW1lKQorICAgICAgaWYgU3RyaW5nID09PSB2YWwKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICB2YWwgPSBZQU1MLmxvYWQodmFsKQorICAgICAgICByZXNjdWUgUnVudGltZUVycm9yLCBBcmd1bWVudEVycm9yLCBTeW50YXhFcnJvcgorICAgICAgICAgIHJhaXNlIEtyYW1kb3duOjpFcnJvciwgIkludmFsaWQgWUFNTCB2YWx1ZSBmb3Igb3B0aW9uICN7bmFtZX0iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICByYWlzZSBLcmFtZG93bjo6RXJyb3IsICJJbnZhbGlkIHR5cGUgI3t2YWwuY2xhc3N9IGZvciBvcHRpb24gI3tuYW1lfSIgaWYgIShIYXNoID09PSB2YWwpCisgICAgICB2YWwKKyAgICBlbmQKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgOnNlY3Rpb246IE9wdGlvbiBEZWZpbml0aW9ucworICAgICMKKyAgICAjIFRoaXMgc2VjdGlvbnMgY29udGFpbnMgYWxsIG9wdGlvbiBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBpbmNsdWRlZAorICAgICMgcGFyc2Vycy9jb252ZXJ0ZXJzLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmaW5lKDp0ZW1wbGF0ZSwgU3RyaW5nLCAnJywgPDxFT0YpCitUaGUgbmFtZSBvZiBhbiBFUkIgdGVtcGxhdGUgZmlsZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHdyYXAgdGhlIG91dHB1dAorb3IgdGhlIEVSQiB0ZW1wbGF0ZSBpdHNlbGYuCisKK1RoaXMgaXMgdXNlZCB0byB3cmFwIHRoZSBvdXRwdXQgaW4gYW4gZW52aXJvbm1lbnQgc28gdGhhdCB0aGUgb3V0cHV0IGNhbgorYmUgdXNlZCBhcyBhIHN0YW5kLWFsb25lIGRvY3VtZW50LiBGb3IgZXhhbXBsZSwgYW4gSFRNTCB0ZW1wbGF0ZSB3b3VsZAorcHJvdmlkZSB0aGUgbmVlZGVkIGhlYWRlciBhbmQgYm9keSB0YWdzIHNvIHRoYXQgdGhlIHdob2xlIG91dHB1dCBpcyBhCit2YWxpZCBIVE1MIGZpbGUuIElmIG5vIHRlbXBsYXRlIGlzIHNwZWNpZmllZCwgdGhlIG91dHB1dCB3aWxsIGJlIGp1c3QKK3RoZSBjb252ZXJ0ZWQgdGV4dC4KKworV2hlbiByZXNvbHZpbmcgdGhlIHRlbXBsYXRlIGZpbGUsIHRoZSBnaXZlbiB0ZW1wbGF0ZSBuYW1lIGlzIHVzZWQgZmlyc3QuCitJZiBzdWNoIGEgZmlsZSBpcyBub3QgZm91bmQsIHRoZSBjb252ZXJ0ZXIgZXh0ZW5zaW9uICh0aGUgc2FtZSBhcyB0aGUKK2NvbnZlcnRlciBuYW1lKSBpcyBhcHBlbmRlZC4gSWYgdGhlIGZpbGUgc3RpbGwgY2Fubm90IGJlIGZvdW5kLCB0aGUKK3RlbXBsYXRlcyBuYW1lIGlzIGludGVycHJldGVkIGFzIGEgdGVtcGxhdGUgbmFtZSB0aGF0IGlzIHByb3ZpZGVkIGJ5CitrcmFtZG93biAod2l0aG91dCB0aGUgY29udmVydGVyIGV4dGVuc2lvbikuIElmIHRoZSBmaWxlIGlzIHN0aWxsIG5vdAorZm91bmQsIHRoZSB0ZW1wbGF0ZSBuYW1lIGlzIGNoZWNrZWQgaWYgaXQgc3RhcnRzIHdpdGggJ3N0cmluZzovLycgYW5kIGlmCitpdCBkb2VzLCB0aGlzIHByZWZpeCBpcyByZW1vdmVkIGFuZCB0aGUgcmVzdCBpcyB1c2VkIGFzIHRlbXBsYXRlCitjb250ZW50LgorCitrcmFtZG93biBwcm92aWRlcyBhIGRlZmF1bHQgdGVtcGxhdGUgbmFtZWQgJ2RvY3VtZW50JyBmb3IgZWFjaCBjb252ZXJ0ZXIuCisKK0RlZmF1bHQ6ICcnCitVc2VkIGJ5OiBhbGwgY29udmVydGVycworRU9GCisKKyAgICBkZWZpbmUoOmF1dG9faWRzLCBCb29sZWFuLCB0cnVlLCA8PEVPRikKK1VzZSBhdXRvbWF0aWMgaGVhZGVyIElEIGdlbmVyYXRpb24KKworSWYgdGhpcyBvcHRpb24gaXMgYHRydWVgLCBJRCB2YWx1ZXMgZm9yIGFsbCBoZWFkZXJzIGFyZSBhdXRvbWF0aWNhbGx5CitnZW5lcmF0ZWQgaWYgbm8gSUQgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCisKK0RlZmF1bHQ6IHRydWUKK1VzZWQgYnk6IEhUTUwvTGF0ZXggY29udmVydGVyCitFT0YKKworICAgIGRlZmluZSg6YXV0b19pZF9zdHJpcHBpbmcsIEJvb2xlYW4sIGZhbHNlLCA8PEVPRikKK1N0cmlwIGFsbCBmb3JtYXR0aW5nIGZyb20gaGVhZGVyIHRleHQgZm9yIGF1dG9tYXRpYyBJRCBnZW5lcmF0aW9uCisKK0lmIHRoaXMgb3B0aW9uIGlzIGB0cnVlYCwgb25seSB0aGUgdGV4dCBlbGVtZW50cyBvZiBhIGhlYWRlciBhcmUgdXNlZAorZm9yIGdlbmVyYXRpbmcgdGhlIElEIGxhdGVyIChpbiBjb250cmFzdCB0byBqdXN0IHVzaW5nIHRoZSByYXcgaGVhZGVyCit0ZXh0IGxpbmUpLgorCitUaGlzIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAyLjAgYmVjYXVzZSB0aGlzIHdpbGwgYmUgdGhlCitkZWZhdWx0IHRoZW4uCisKK0RlZmF1bHQ6IGZhbHNlCitVc2VkIGJ5OiBrcmFtZG93biBwYXJzZXIKK0VPRgorCisgICAgZGVmaW5lKDphdXRvX2lkX3ByZWZpeCwgU3RyaW5nLCAnJywgPDxFT0YpCitQcmVmaXggdXNlZCBmb3IgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaGVhZGVyIElEcworCitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZXQgYSBwcmVmaXggZm9yIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAoraGVhZGVyIElEcyBzbyB0aGF0IHRoZXJlIGlzIG5vIGNvbmZsaWN0IHdoZW4gcmVuZGVyaW5nIG11bHRpcGxlIGtyYW1kb3duCitkb2N1bWVudHMgaW50byBvbmUgb3V0cHV0IGZpbGUgc2VwYXJhdGVseS4gVGhlIHByZWZpeCBzaG91bGQgb25seQorY29udGFpbiBjaGFyYWN0ZXJzIHRoYXQgYXJlIHZhbGlkIGluIGFuIElEIQorCitEZWZhdWx0OiAnJworVXNlZCBieTogSFRNTC9MYXRleCBjb252ZXJ0ZXIKK0VPRgorCisgICAgZGVmaW5lKDp0cmFuc2xpdGVyYXRlZF9oZWFkZXJfaWRzLCBCb29sZWFuLCBmYWxzZSwgPDxFT0YpCitUcmFuc2xpdGVyYXRlIHRoZSBoZWFkZXIgdGV4dCBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgSUQKKworT25seSBBU0NJSSBjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIGhlYWRlcnMgSURzLiBUaGlzIGlzIG5vdCBnb29kIGZvcgorbGFuZ3VhZ2VzIHdpdGggbWFueSBub24tQVNDSUkgY2hhcmFjdGVycy4gQnkgZW5hYmxpbmcgdGhpcyBvcHRpb24KK3RoZSBoZWFkZXIgdGV4dCBpcyB0cmFuc2xpdGVyYXRlZCB0byBBU0NJSSBhcyBnb29kIGFzIHBvc3NpYmxlIHNvIHRoYXQKK3RoZSByZXN1bHRpbmcgaGVhZGVyIElEIGlzIG1vcmUgdXNlZnVsLgorCitUaGUgc3RyaW5nZXggbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgZm9yIHRoaXMgZmVhdHVyZSB0byB3b3JrIQorCitEZWZhdWx0OiBmYWxzZQorVXNlZCBieTogSFRNTC9MYXRleCBjb252ZXJ0ZXIKK0VPRgorCisgICAgZGVmaW5lKDpwYXJzZV9ibG9ja19odG1sLCBCb29sZWFuLCBmYWxzZSwgPDxFT0YpCitQcm9jZXNzIGtyYW1kb3duIHN5bnRheCBpbiBibG9jayBIVE1MIHRhZ3MKKworSWYgdGhpcyBvcHRpb24gaXMgYHRydWVgLCB0aGUga3JhbWRvd24gcGFyc2VyIHByb2Nlc3NlcyB0aGUgY29udGVudCBvZgorYmxvY2sgSFRNTCB0YWdzIGFzIHRleHQgY29udGFpbmluZyBibG9jay1sZXZlbCBlbGVtZW50cy4gU2luY2UgdGhpcyBpcworbm90IHdhbnRlZCBub3JtYWxseSwgdGhlIGRlZmF1bHQgaXMgYGZhbHNlYC4gSXQgaXMgbm9ybWFsbHkgYmV0dGVyIHRvCitzZWxlY3RpdmVseSBlbmFibGUga3JhbWRvd24gcHJvY2Vzc2luZyB2aWEgdGhlIG1hcmtkb3duIGF0dHJpYnV0ZS4KKworRGVmYXVsdDogZmFsc2UKK1VzZWQgYnk6IGtyYW1kb3duIHBhcnNlcgorRU9GCisKKyAgICBkZWZpbmUoOnBhcnNlX3NwYW5faHRtbCwgQm9vbGVhbiwgdHJ1ZSwgPDxFT0YpCitQcm9jZXNzIGtyYW1kb3duIHN5bnRheCBpbiBzcGFuIEhUTUwgdGFncworCitJZiB0aGlzIG9wdGlvbiBpcyBgdHJ1ZWAsIHRoZSBrcmFtZG93biBwYXJzZXIgcHJvY2Vzc2VzIHRoZSBjb250ZW50IG9mCitzcGFuIEhUTUwgdGFncyBhcyB0ZXh0IGNvbnRhaW5pbmcgc3Bhbi1sZXZlbCBlbGVtZW50cy4KKworRGVmYXVsdDogdHJ1ZQorVXNlZCBieToga3JhbWRvd24gcGFyc2VyCitFT0YKKworICAgIGRlZmluZSg6aHRtbF90b19uYXRpdmUsIEJvb2xlYW4sIGZhbHNlLCA8PEVPRikKK0NvbnZlcnQgSFRNTCBlbGVtZW50cyB0byBuYXRpdmUgZWxlbWVudHMKKworSWYgdGhpcyBvcHRpb24gaXMgYHRydWVgLCB0aGUgcGFyc2VyIGNvbnZlcnRzIEhUTUwgZWxlbWVudHMgdG8gbmF0aXZlCitlbGVtZW50cy4gRm9yIGV4YW1wbGUsIHdoZW4gcGFyc2luZyBgPGVtPmhhbGxvPC9lbT5gIHRoZSBlbXBoYXNpcyB0YWcKK3dvdWxkIG5vcm1hbGx5IGJlIGNvbnZlcnRlZCB0byBhbiBgOmh0bWxgIGVsZW1lbnQgd2l0aCB0YWcgdHlwZSBgOmVtYC4KK0lmIGBodG1sX3RvX25hdGl2ZWAgaXMgYHRydWVgLCB0aGVuIHRoZSBlbXBoYXNpcyB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gYQorbmF0aXZlIGA6ZW1gIGVsZW1lbnQuCisKK1RoaXMgaXMgdXNlZnVsIGZvciBjb252ZXJ0ZXJzIHRoYXQgY2Fubm90IGRlYWwgd2l0aCBIVE1MIGVsZW1lbnRzLgorCitEZWZhdWx0OiBmYWxzZQorVXNlZCBieToga3JhbWRvd24gcGFyc2VyCitFT0YKKworICAgIGRlZmluZSg6bGlua19kZWZzLCBPYmplY3QsIHt9LCA8PEVPRikgZG8gfHZhbHwKK1ByZS1kZWZpbmVzIGxpbmsgZGVmaW5pdGlvbnMKKworVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcHJlLWRlZmluZSBsaW5rIGRlZmluaXRpb25zLiBUaGUgdmFsdWUgbmVlZHMKK3RvIGJlIGEgSGFzaCB3aGVyZSB0aGUga2V5cyBhcmUgdGhlIGxpbmsgaWRlbnRpZmllcnMgYW5kIHRoZSB2YWx1ZXMgYXJlCit0d28gZWxlbWVudCBBcnJheXMgd2l0aCB0aGUgbGluayBVUkwgYW5kIHRoZSBsaW5rIHRpdGxlLgorCitJZiB0aGUgdmFsdWUgaXMgYSBTdHJpbmcsIGl0IGhhcyB0byBjb250YWluIGEgdmFsaWQgWUFNTCBoYXNoIGFuZCB0aGUKK2hhc2ggaGFzIHRvIGZvbGxvdyB0aGUgYWJvdmUgZ3VpZGVsaW5lcy4KKworRGVmYXVsdDoge30KK1VzZWQgYnk6IGtyYW1kb3duIHBhcnNlcgorRU9GCisgICAgICB2YWwgPSBzaW1wbGVfaGFzaF92YWxpZGF0b3IodmFsLCA6bGlua19kZWZzKQorICAgICAgdmFsLmVhY2ggZG8gfGssdnwKKyAgICAgICAgaWYgIShBcnJheSA9PT0gdikgfHwgdi5zaXplID4gMiB8fCB2LnNpemUgPCAxCisgICAgICAgICAgcmFpc2UgS3JhbWRvd246OkVycm9yLCAiSW52YWxpZCBzdHJ1Y3R1cmUgZm9yIGhhc2ggdmFsdWUgb2Ygb3B0aW9uICN7bmFtZX0iCisgICAgICAgIGVuZAorICAgICAgICB2IDw8IG5pbCBpZiB2LnNpemUgPT0gMQorICAgICAgZW5kCisgICAgICB2YWwKKyAgICBlbmQKKworICAgIGRlZmluZSg6Zm9vdG5vdGVfbnIsIEludGVnZXIsIDEsIDw8RU9GKQorVGhlIG51bWJlciBvZiB0aGUgZmlyc3QgZm9vdG5vdGUKKworVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIHRoYXQgaXMgdXNlZCBmb3IgdGhlIGZpcnN0Citmb290bm90ZS4KKworRGVmYXVsdDogMQorVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKK0VPRgorCisgICAgZGVmaW5lKDplbmFibGVfY29kZXJheSwgQm9vbGVhbiwgdHJ1ZSwgPDxFT0YpCitVc2UgY29kZXJheSBmb3Igc3ludGF4IGhpZ2hsaWdodGluZworCitJZiB0aGlzIG9wdGlvbiBpcyBgdHJ1ZWAsIGNvZGVyYXkgaXMgdXNlZCBieSB0aGUgSFRNTCBjb252ZXJ0ZXIgZm9yCitzeW50YXggaGlnaGxpZ2h0aW5nIHRoZSBjb250ZW50IG9mIGNvZGUgc3BhbnMgYW5kIGNvZGUgYmxvY2tzLgorCitEZWZhdWx0OiB0cnVlCitVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorRU9GCisKKyAgICBkZWZpbmUoOmNvZGVyYXlfd3JhcCwgU3ltYm9sLCA6ZGl2LCA8PEVPRikKK0RlZmluZXMgaG93IHRoZSBoaWdobGlnaHRlZCBjb2RlIHNob3VsZCBiZSB3cmFwcGVkCisKK1RoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIDpzcGFuLCA6ZGl2IG9yIG5pbC4KKworRGVmYXVsdDogOmRpdgorVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKK0VPRgorCisgICAgZGVmaW5lKDpjb2RlcmF5X2xpbmVfbnVtYmVycywgU3ltYm9sLCA6aW5saW5lLCA8PEVPRikKK0RlZmluZXMgaG93IGFuZCBpZiBsaW5lIG51bWJlcnMgc2hvdWxkIGJlIHNob3duCisKK1RoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIDp0YWJsZSwgOmlubGluZSBvciBuaWwuIElmIHRoaXMgb3B0aW9uIGlzCituaWwsIG5vIGxpbmUgbnVtYmVycyBhcmUgc2hvd24uCisKK0RlZmF1bHQ6IDppbmxpbmUKK1VzZWQgYnk6IEhUTUwgY29udmVydGVyCitFT0YKKworICAgIGRlZmluZSg6Y29kZXJheV9saW5lX251bWJlcl9zdGFydCwgSW50ZWdlciwgMSwgPDxFT0YpCitUaGUgc3RhcnQgdmFsdWUgZm9yIHRoZSBsaW5lIG51bWJlcnMKKworRGVmYXVsdDogMQorVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKK0VPRgorCisgICAgZGVmaW5lKDpjb2RlcmF5X3RhYl93aWR0aCwgSW50ZWdlciwgOCwgPDxFT0YpCitUaGUgdGFiIHdpZHRoIHVzZWQgaW4gaGlnaGxpZ2h0ZWQgY29kZQorCitVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorRU9GCisKKyAgICBkZWZpbmUoOmNvZGVyYXlfYm9sZF9ldmVyeSwgT2JqZWN0LCAxMCwgPDxFT0YpIGRvIHx2YWx8CitEZWZpbmVzIGhvdyBvZnRlbiBhIGxpbmUgbnVtYmVyIHNob3VsZCBiZSBtYWRlIGJvbGQKKworQ2FuIGVpdGhlciBiZSBhbiBpbnRlZ2VyIG9yIGZhbHNlICh0byB0dXJuIG9mZiBib2xkIGxpbmUgbnVtYmVycworY29tcGxldGVseSkuCisKK0RlZmF1bHQ6IDEwCitVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorRU9GCisgICAgICBpZiB2YWwgPT0gZmFsc2UgfHwgdmFsLnRvX3MgPT0gJ2ZhbHNlJworICAgICAgICBmYWxzZQorICAgICAgZWxzZQorICAgICAgICBJbnRlZ2VyKHZhbC50b19zKSByZXNjdWUgcmFpc2UgS3JhbWRvd246OkVycm9yLCAiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICdjb2RlcmF5X2JvbGRfZXZlcnknIgorICAgICAgZW5kCitlbmQKKworICAgIGRlZmluZSg6Y29kZXJheV9jc3MsIFN5bWJvbCwgOnN0eWxlLCA8PEVPRikKK0RlZmluZXMgaG93IHRoZSBoaWdobGlnaHRlZCBjb2RlIGdldHMgc3R5bGVkCisKK1Bvc3NpYmxlIHZhbHVlcyBhcmUgOmNsYXNzIChDU1MgY2xhc3NlcyBhcmUgYXBwbGllZCB0byB0aGUgY29kZQorZWxlbWVudHMsIG9uZSBtdXN0IHN1cHBseSB0aGUgbmVlZGVkIENTUyBmaWxlKSBvciA6c3R5bGUgKGRlZmF1bHQgQ1NTCitzdHlsZXMgYXJlIGRpcmVjdGx5IGFwcGxpZWQgdG8gdGhlIGNvZGUgZWxlbWVudHMpLgorCitEZWZhdWx0OiBzdHlsZQorVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKK0VPRgorCisgICAgZGVmaW5lKDpjb2RlcmF5X2RlZmF1bHRfbGFuZywgU3ltYm9sLCBuaWwsIDw8RU9GKQorU2V0cyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBmb3IgaGlnaGxpZ2h0aW5nIGNvZGUgYmxvY2tzCisKK0lmIG5vIGxhbmd1YWdlIGlzIHNldCBmb3IgYSBjb2RlIGJsb2NrLCB0aGUgZGVmYXVsdCBsYW5ndWFnZSBpcyB1c2VkCitpbnN0ZWFkLiBUaGUgdmFsdWUgaGFzIHRvIGJlIG9uZSBvZiB0aGUgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSBjb2RlcmF5CitvciBuaWwgaWYgbm8gZGVmYXVsdCBsYW5ndWFnZSBzaG91bGQgYmUgdXNlZC4KKworRGVmYXVsdDogbmlsCitVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorRU9GCisKKyAgICBkZWZpbmUoOmVudGl0eV9vdXRwdXQsIFN5bWJvbCwgOmFzX2NoYXIsIDw8RU9GKQorRGVmaW5lcyBob3cgZW50aXRpZXMgYXJlIG91dHB1dAorCitUaGUgcG9zc2libGUgdmFsdWVzIGFyZSA6YXNfaW5wdXQgKGVudGl0aWVzIGFyZSBvdXRwdXQgaW4gdGhlIHNhbWUKK2Zvcm0gYXMgZm91bmQgaW4gdGhlIGlucHV0KSwgOm51bWVyaWMgKGVudGl0aWVzIGFyZSBvdXRwdXQgaW4gbnVtZXJpYworZm9ybSksIDpzeW1ib2xpYyAoZW50aXRpZXMgYXJlIG91dHB1dCBpbiBzeW1ib2xpYyBmb3JtIGlmIHBvc3NpYmxlKSBvcgorOmFzX2NoYXIgKGVudGl0aWVzIGFyZSBvdXRwdXQgYXMgY2hhcmFjdGVycyBpZiBwb3NzaWJsZSwgb25seSBhdmFpbGFibGUKK29uIFJ1YnkgMS45KS4KKworRGVmYXVsdDogOmFzX2NoYXIKK1VzZWQgYnk6IEhUTUwgY29udmVydGVyLCBrcmFtZG93biBjb252ZXJ0ZXIKK0VPRgorCisgICAgZGVmaW5lKDp0b2NfbGV2ZWxzLCBPYmplY3QsICgxLi42KS50b19hLCA8PEVPRikgZG8gfHZhbHwKK0RlZmluZXMgdGhlIGxldmVscyB0aGF0IGFyZSB1c2VkIGZvciB0aGUgdGFibGUgb2YgY29udGVudHMKKworVGhlIGluZGl2aWR1YWwgbGV2ZWxzIGNhbiBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggY29tbWFzCisoZS5nLiAxLDIsMykgb3IgYnkgdXNpbmcgdGhlIHJhbmdlIHN5bnRheCAoZS5nLiAxLi4zKS4gT25seSB0aGUKK3NwZWNpZmllZCBsZXZlbHMgYXJlIHVzZWQgZm9yIHRoZSB0YWJsZSBvZiBjb250ZW50cy4KKworRGVmYXVsdDogMS4uNgorVXNlZCBieTogSFRNTC9MYXRleCBjb252ZXJ0ZXIKK0VPRgorICAgICAgY2FzZSB2YWwKKyAgICAgIHdoZW4gU3RyaW5nCisgICAgICAgIGlmIHZhbCA9fiAvXihcZClcLlwuKFxkKSQvCisgICAgICAgICAgdmFsID0gUmFuZ2UubmV3KCQxLnRvX2ksICQyLnRvX2kpLnRvX2EKKyAgICAgICAgZWxzaWYgdmFsID1+IC9eXGQoPzosXGQpKiQvCisgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KC8sLykubWFwIHt8c3wgcy50b19pfS51bmlxCisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWlzZSBLcmFtZG93bjo6RXJyb3IsICJJbnZhbGlkIHN5bnRheCBmb3Igb3B0aW9uIHRvY19sZXZlbHMiCisgICAgICAgIGVuZAorICAgICAgd2hlbiBBcnJheSwgUmFuZ2UKKyAgICAgICAgdmFsID0gdmFsLm1hcCB7fHN8IHMudG9faX0udW5pcQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBLcmFtZG93bjo6RXJyb3IsICJJbnZhbGlkIHR5cGUgI3t2YWwuY2xhc3N9IGZvciBvcHRpb24gdG9jX2xldmVscyIKKyAgICAgIGVuZAorICAgICAgaWYgdmFsLmFueT8ge3xpfCAhKDEuLjYpLmluY2x1ZGU/KGkpfQorICAgICAgICByYWlzZSBLcmFtZG93bjo6RXJyb3IsICJMZXZlbCBudW1iZXJzIGZvciBvcHRpb24gdG9jX2xldmVscyBoYXZlIHRvIGJlIGludGVnZXJzIGZyb20gMSB0byA2IgorICAgICAgZW5kCisgICAgICB2YWwKKyAgICBlbmQKKworICAgIGRlZmluZSg6bGluZV93aWR0aCwgSW50ZWdlciwgNzIsIDw8RU9GKQorRGVmaW5lcyB0aGUgbGluZSB3aWR0aCB0byBiZSB1c2VkIHdoZW4gb3V0cHV0dGluZyBhIGRvY3VtZW50CisKK0RlZmF1bHQ6IDcyCitVc2VkIGJ5OiBrcmFtZG93biBjb252ZXJ0ZXIKK0VPRgorCisgICAgZGVmaW5lKDpsYXRleF9oZWFkZXJzLCBPYmplY3QsICV3e3NlY3Rpb24gc3Vic2VjdGlvbiBzdWJzdWJzZWN0aW9uIHBhcmFncmFwaCBzdWJwYXJhZ3JhcGggc3VicGFyYWdyYXBofSwgPDxFT0YpIGRvIHx2YWx8CitEZWZpbmVzIHRoZSBMYVRlWCBjb21tYW5kcyBmb3IgZGlmZmVyZW50IGhlYWRlciBsZXZlbHMKKworVGhlIGNvbW1hbmRzIGZvciB0aGUgaGVhZGVyIGxldmVscyBvbmUgdG8gc2l4IGNhbiBiZSBzcGVjaWZpZWQgYnkKK3NlcGFyYXRpbmcgdGhlbSB3aXRoIGNvbW1hcy4KKworRGVmYXVsdDogc2VjdGlvbixzdWJzZWN0aW9uLHN1YnN1YnNlY3Rpb24scGFyYWdyYXBoLHN1YnBhcmFncmFwaCxzdWJwYXJhZ3JhcGgKK1VzZWQgYnk6IExhdGV4IGNvbnZlcnRlcgorRU9GCisgICAgICBzaW1wbGVfYXJyYXlfdmFsaWRhdG9yKHZhbCwgOmxhdGV4X2hlYWRlcnMsIDYpCisgICAgZW5kCisKKyAgICBkZWZpbmUoOnNtYXJ0X3F1b3RlcywgT2JqZWN0LCAld3tsc3F1byByc3F1byBsZHF1byByZHF1b30sIDw8RU9GKSBkbyB8dmFsfAorRGVmaW5lcyB0aGUgSFRNTCBlbnRpdHkgbmFtZXMgb3IgY29kZSBwb2ludHMgZm9yIHNtYXJ0IHF1b3RlIG91dHB1dAorCitUaGUgZW50aXRpZXMgaWRlbnRpZmllZCBieSBlbnRpdHkgbmFtZSBvciBjb2RlIHBvaW50IHRoYXQgc2hvdWxkIGJlCit1c2VkIGZvciwgaW4gb3JkZXIsIGEgbGVmdCBzaW5nbGUgcXVvdGUsIGEgcmlnaHQgc2luZ2xlIHF1b3RlLCBhIGxlZnQKK2RvdWJsZSBhbmQgYSByaWdodCBkb3VibGUgcXVvdGUgYXJlIHNwZWNpZmllZCBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aAorY29tbWFzLgorCitEZWZhdWx0OiBsc3F1byxyc3F1byxsZHF1byxyZHF1bworVXNlZCBieTogSFRNTC9MYXRleCBjb252ZXJ0ZXIKK0VPRgorICAgICAgdmFsID0gc2ltcGxlX2FycmF5X3ZhbGlkYXRvcih2YWwsIDpzbWFydF9xdW90ZXMsIDQpCisgICAgICB2YWwubWFwISB7fHZ8IEludGVnZXIodikgcmVzY3VlIHZ9CisgICAgICB2YWwKKyAgICBlbmQKKworICAgIGRlZmluZSg6cmVtb3ZlX2Jsb2NrX2h0bWxfdGFncywgQm9vbGVhbiwgdHJ1ZSwgPDxFT0YpCitSZW1vdmUgYmxvY2sgSFRNTCB0YWdzCisKK0lmIHRoaXMgb3B0aW9uIGlzIGB0cnVlYCwgdGhlIFJlbW92ZUh0bWxUYWdzIGNvbnZlcnRlciByZW1vdmVzCitibG9jayBIVE1MIHRhZ3MuCisKK0RlZmF1bHQ6IHRydWUKK1VzZWQgYnk6IFJlbW92ZUh0bWxUYWdzIGNvbnZlcnRlcgorRU9GCisKKyAgICBkZWZpbmUoOnJlbW92ZV9zcGFuX2h0bWxfdGFncywgQm9vbGVhbiwgZmFsc2UsIDw8RU9GKQorUmVtb3ZlIHNwYW4gSFRNTCB0YWdzCisKK0lmIHRoaXMgb3B0aW9uIGlzIGB0cnVlYCwgdGhlIFJlbW92ZUh0bWxUYWdzIGNvbnZlcnRlciByZW1vdmVzCitzcGFuIEhUTUwgdGFncy4KKworRGVmYXVsdDogZmFsc2UKK1VzZWQgYnk6IFJlbW92ZUh0bWxUYWdzIGNvbnZlcnRlcgorRU9GCisKKyAgICBkZWZpbmUoOmhlYWRlcl9vZmZzZXQsIEludGVnZXIsIDAsIDw8RU9GKQorU2V0cyB0aGUgb3V0cHV0IG9mZnNldCBmb3IgaGVhZGVycworCitJZiB0aGlzIG9wdGlvbiBpcyBjIChtYXkgYWxzbyBiZSBuZWdhdGl2ZSkgdGhlbiBhIGhlYWRlciB3aXRoIGxldmVsIG4KK3dpbGwgYmUgb3V0cHV0IGFzIGEgaGVhZGVyIHdpdGggbGV2ZWwgYytuLiBJZiBjK24gaXMgbG93ZXIgdGhhbiAxLAorbGV2ZWwgMSB3aWxsIGJlIHVzZWQuIElmIGMrbiBpcyBncmVhdGVyIHRoYW4gNiwgbGV2ZWwgNiB3aWxsIGJlIHVzZWQuCisKK0RlZmF1bHQ6IDAKK1VzZWQgYnk6IEhUTUwgY29udmVydGVyLCBLcmFtZG93biBjb252ZXJ0ZXIsIExhdGV4IGNvbnZlcnRlcgorRU9GCisKKyAgICBkZWZpbmUoOmhhcmRfd3JhcCwgQm9vbGVhbiwgdHJ1ZSwgPDxFT0YpCitJbnRlcnByZXRzIGxpbmUgYnJlYWtzIGxpdGVyYWxseQorCitJbnNlcnQgSFRNTCBgPGJyIC8+YCB0YWdzIGluc2lkZSBwYXJhZ3JhcGhzIHdoZXJlIHRoZSBvcmlnaW5hbCBNYXJrZG93bgorZG9jdW1lbnQgaGFkIG5ld2xpbmVzIChieSBkZWZhdWx0LCBNYXJrZG93biBpZ25vcmVzIHRoZXNlIG5ld2xpbmVzKS4KKworRGVmYXVsdDogdHJ1ZQorVXNlZCBieTogR0ZNIHBhcnNlcgorRU9GCisKKyAgICBkZWZpbmUoOnN5bnRheF9oaWdobGlnaHRlciwgU3ltYm9sLCA6Y29kZXJheSwgPDxFT0YpCitTZXQgdGhlIHN5bnRheCBoaWdobGlnaHRlcgorCitTcGVjaWZpZXMgdGhlIHN5bnRheCBoaWdobGlnaHRlciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBoaWdobGlnaHRpbmcKK2NvZGUgYmxvY2tzIGFuZCBzcGFucy4gSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvICtuaWwrLCBubyBzeW50YXgKK2hpZ2hsaWdodGluZyBpcyBkb25lLgorCitPcHRpb25zIGZvciB0aGUgc3ludGF4IGhpZ2hsaWdodGVyIGNhbiBiZSBzZXQgd2l0aCB0aGUKK3N5bnRheF9oaWdobGlnaHRlcl9vcHRzIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgorCitEZWZhdWx0OiBjb2RlcmF5CitVc2VkIGJ5OiBIVE1ML0xhdGV4IGNvbnZlcnRlcgorRU9GCisKKyAgICBkZWZpbmUoOnN5bnRheF9oaWdobGlnaHRlcl9vcHRzLCBPYmplY3QsIHt9LCA8PEVPRikgZG8gfHZhbHwKK1NldCB0aGUgc3ludGF4IGhpZ2hsaWdodGVyIG9wdGlvbnMKKworU3BlY2lmaWVzIG9wdGlvbnMgZm9yIHRoZSBzeW50YXggaGlnaGxpZ2h0ZXIgc2V0IHZpYSB0aGUKK3N5bnRheF9oaWdobGlnaHRlciBjb25maWd1cmF0aW9uIG9wdGlvbi4KKworVGhlIHZhbHVlIG5lZWRzIHRvIGJlIGEgaGFzaCB3aXRoIGtleS12YWx1ZSBwYWlycyB0aGF0IGFyZSB1bmRlcnN0b29kIGJ5Cit0aGUgdXNlZCBzeW50YXggaGlnaGxpZ2h0ZXIuCisKK0RlZmF1bHQ6IHt9CitVc2VkIGJ5OiBIVE1ML0xhdGV4IGNvbnZlcnRlcgorRU9GCisgICAgICB2YWwgPSBzaW1wbGVfaGFzaF92YWxpZGF0b3IodmFsLCA6c3ludGF4X2hpZ2hsaWdodGVyX29wdHMpCisgICAgICB2YWwua2V5cy5lYWNoIGRvIHxrfAorICAgICAgICB2YWxbay5raW5kX29mPyhTdHJpbmcpID8gc3RyX3RvX3N5bShrKSA6IGtdID0gdmFsLmRlbGV0ZShrKQorICAgICAgZW5kCisgICAgICB2YWwKKyAgICBlbmQKKworICAgIGRlZmluZSg6bWF0aF9lbmdpbmUsIFN5bWJvbCwgOm1hdGhqYXgsIDw8RU9GKQorU2V0IHRoZSBtYXRoIGVuZ2luZQorCitTcGVjaWZpZXMgdGhlIG1hdGggZW5naW5lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbnZlcnRpbmcgbWF0aAorYmxvY2tzL3NwYW5zLiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gK25pbCssIG5vIG1hdGggZW5naW5lIGlzIHVzZWQgYW5kCit0aGUgbWF0aCBibG9ja3Mvc3BhbnMgYXJlIG91dHB1dCBhcyBpcy4KKworT3B0aW9ucyBmb3IgdGhlIHNlbGVjdGVkIG1hdGggZW5naW5lIGNhbiBiZSBzZXQgd2l0aCB0aGUKK21hdGhfZW5naW5lX29wdHMgY29uZmlndXJhdGlvbiBvcHRpb24uCisKK0RlZmF1bHQ6IG1hdGhqYXgKK1VzZWQgYnk6IEhUTUwgY29udmVydGVyCitFT0YKKworICAgIGRlZmluZSg6bWF0aF9lbmdpbmVfb3B0cywgT2JqZWN0LCB7fSwgPDxFT0YpIGRvIHx2YWx8CitTZXQgdGhlIG1hdGggZW5naW5lIG9wdGlvbnMKKworU3BlY2lmaWVzIG9wdGlvbnMgZm9yIHRoZSBtYXRoIGVuZ2luZSBzZXQgdmlhIHRoZSBtYXRoX2VuZ2luZQorY29uZmlndXJhdGlvbiBvcHRpb24uCisKK1RoZSB2YWx1ZSBuZWVkcyB0byBiZSBhIGhhc2ggd2l0aCBrZXktdmFsdWUgcGFpcnMgdGhhdCBhcmUgdW5kZXJzdG9vZCBieQordGhlIHVzZWQgbWF0aCBlbmdpbmUuCisKK0RlZmF1bHQ6IHt9CitVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorRU9GCisgICAgICB2YWwgPSBzaW1wbGVfaGFzaF92YWxpZGF0b3IodmFsLCA6bWF0aF9lbmdpbmVfb3B0cykKKyAgICAgIHZhbC5rZXlzLmVhY2ggZG8gfGt8CisgICAgICAgIHZhbFtrLmtpbmRfb2Y/KFN0cmluZykgPyBzdHJfdG9fc3ltKGspIDoga10gPSB2YWwuZGVsZXRlKGspCisgICAgICBlbmQKKyAgICAgIHZhbAorICAgIGVuZAorCisgICAgZGVmaW5lKDpmb290bm90ZV9iYWNrbGluaywgU3RyaW5nLCAnJiM4NjE3OycsIDw8RU9GKQorRGVmaW5lcyB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZm9vdG5vdGUgYmFja2xpbmtzCisKK1RoZSBmb290bm90ZSBiYWNrbGluayBpcyBqdXN0IHRleHQsIHNvIGFueSBzcGVjaWFsIEhUTUwgY2hhcmFjdGVycyB3aWxsCitiZSBlc2NhcGVkLgorCitJZiB0aGUgZm9vdG5vdGUgYmFja2xpbnQgdGV4dCBpcyBhbiBlbXB0eSBzdHJpbmcsIG5vIGZvb3Rub3RlIGJhY2tsaW5rcword2lsbCBiZSBnZW5lcmF0ZWQuCisKK0RlZmF1bHQ6ICcmODYxNzsnCitVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorRU9GCisKKyAgICBkZWZpbmUoOmdmbV9xdWlya3MsIE9iamVjdCwgWzpwYXJhZ3JhcGhfZW5kXSwgPDxFT0YpIGRvIHx2YWx8CitFbmFibGVzIGEgc2V0IG9mIEdGTSBzcGVjaWZpYyBxdWlya3MKKworVGhlIHdheSBob3cgR0ZNIGlzIHRyYW5zZm9ybWVkIG9uIEdpdGh1YiBvZnRlbiBkaWZmZXJzIGZyb20gdGhlIHdheQora3JhbWRvd24gZG9lcyB0aGluZ3MuIE1hbnkgb2YgdGhlc2UgZGlmZmVyZW5jZXMgYXJlIG5lZ2xpZ2libGUgYnV0CitvdGhlcnMgYXJlIG5vdC4KKworVGhpcyBvcHRpb24gYWxsb3dzIG9uZSB0byBlbmFibGUvZGlzYWJsZSBjZXJ0YWluIEdGTSBxdWlya3MsIGkuZS4gd2F5cworaW4gd2hpY2ggR0ZNIHBhcnNpbmcgZGlmZmVycyBmcm9tIGtyYW1kb3duIHBhcnNpbmcuCisKK1RoZSB2YWx1ZSBoYXMgdG8gYmUgYSBsaXN0IG9mIHF1aXJrIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQsCitzZXBhcmF0ZWQgYnkgY29tbWFzLiBQb3NzaWJsZSBuYW1lcyBhcmU6CisKKyogcGFyYWdyYXBoX2VuZAorCisgIERpc2FibGVzIHRoZSBrcmFtZG93biByZXN0cmljdGlvbiB0aGF0IGF0IGxlYXN0IG9uZSBibGFuayBsaW5lIGhhcyB0bworICBiZSB1c2VkIGFmdGVyIGEgcGFyYWdyYXBoIGJlZm9yZSBhIG5ldyBibG9jayBlbGVtZW50IGNhbiBiZSBzdGFydGVkLgorCisgIE5vdGUgdGhhdCBpZiB0aGlzIHF1aXJrIGlzIHVzZWQsIGxhenkgbGluZSB3cmFwcGluZyBkb2VzIG5vdCBmdWxseQorICB3b3JrIGFueW1vcmUhCisKK0RlZmF1bHQ6IHBhcmFncmFwaF9lbmQKK1VzZWQgYnk6IEdGTSBwYXJzZXIKK0VPRgorICAgICAgdmFsID0gc2ltcGxlX2FycmF5X3ZhbGlkYXRvcih2YWwsIDpnZm1fcXVpcmtzKQorICAgICAgdmFsLm1hcCEge3x2fCBzdHJfdG9fc3ltKHYudG9fcyl9CisgICAgICB2YWwKKyAgICBlbmQKKworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTk5NDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci5yYgpAQCAtMCwwICsxLDI3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bgorCisgICMgVGhpcyBtb2R1bGUgY29udGFpbnMgYWxsIGF2YWlsYWJsZSBwYXJzZXJzLiBBIHBhcnNlciB0YWtlcyBhbiBpbnB1dCBzdHJpbmcgYW5kIGNvbnZlcnRzIHRoZQorICAjIHN0cmluZyB0byBhbiBlbGVtZW50IHRyZWUuCisgICMKKyAgIyBOZXcgcGFyc2VycyBzaG91bGQgYmUgZGVyaXZlZCBmcm9tIHRoZSBCYXNlIGNsYXNzIHdoaWNoIHByb3ZpZGVzIGNvbW1vbiBmdW5jdGlvbmFsaXR5IC0gc2VlIGl0cworICAjIEFQSSBkb2N1bWVudGF0aW9uIGZvciBob3cgdG8gY3JlYXRlIGEgY3VzdG9tIGNvbnZlcnRlciBjbGFzcy4KKyAgbW9kdWxlIFBhcnNlcgorCisgICAgYXV0b2xvYWQgOkJhc2UsICdrcmFtZG93bi9wYXJzZXIvYmFzZScKKyAgICBhdXRvbG9hZCA6S3JhbWRvd24sICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24nCisgICAgYXV0b2xvYWQgOkh0bWwsICdrcmFtZG93bi9wYXJzZXIvaHRtbCcKKyAgICBhdXRvbG9hZCA6TWFya2Rvd24sICdrcmFtZG93bi9wYXJzZXIvbWFya2Rvd24nCisgICAgYXV0b2xvYWQgOkdGTSwgJ2tyYW1kb3duL3BhcnNlci9nZm0nCisKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIvYmFzZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2Jhc2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NGFhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2Jhc2UucmIKQEAgLTAsMCArMSwxMzQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAna3JhbWRvd24vdXRpbHMnCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXInCisKK21vZHVsZSBLcmFtZG93bgorCisgIG1vZHVsZSBQYXJzZXIKKworICAgICMgPT0gXEJhc2UgY2xhc3MgZm9yIHBhcnNlcnMKKyAgICAjCisgICAgIyBUaGlzIGNsYXNzIHNlcnZlcyBhcyBiYXNlIGNsYXNzIGZvciBwYXJzZXJzLiBJdCBwcm92aWRlcyBjb21tb24gbWV0aG9kcyB0aGF0IGNhbi9zaG91bGQgYmUKKyAgICAjIHVzZWQgYnkgYWxsIHBhcnNlcnMsIGVzcGVjaWFsbHkgYnkgdGhvc2UgdXNpbmcgU3RyaW5nU2Nhbm5lcihLcmFtZG93bikgZm9yIHBhcnNpbmcuCisgICAgIworICAgICMgQSBwYXJzZXIgb2JqZWN0IGlzIHVzZWQgYXMgYSB0aHJvdy1hd2F5IG9iamVjdCwgaS5lLiBpdCBpcyBvbmx5IHVzZWQgZm9yIHN0b3JpbmcgdGhlIG5lZWRlZAorICAgICMgc3RhdGUgaW5mb3JtYXRpb24gZHVyaW5nIHBhcnNpbmcuIFRoZXJlZm9yZSBvbmUgY2FuJ3QgaW5zdGFudGlhdGUgYSBwYXJzZXIgb2JqZWN0IGRpcmVjdGx5IGJ1dAorICAgICMgb25seSB1c2UgdGhlIEJhc2U6OnBhcnNlIG1ldGhvZC4KKyAgICAjCisgICAgIyA9PSBJbXBsZW1lbnRpbmcgYSBwYXJzZXIKKyAgICAjCisgICAgIyBJbXBsZW1lbnRpbmcgYSBuZXcgcGFyc2VyIGlzIHJhdGhlciBlYXN5OiBqdXN0IGRlcml2ZSBhIG5ldyBjbGFzcyBmcm9tIHRoaXMgY2xhc3MgYW5kIHB1dCBpdAorICAgICMgaW4gdGhlIEtyYW1kb3duOjpQYXJzZXIgbW9kdWxlIC0tIHRoZSBsYXR0ZXIgaXMgbmVlZGVkIHNvIHRoYXQgdGhlIGF1dG8tZGV0ZWN0aW9uIG9mIHRoZSBuZXcKKyAgICAjIHBhcnNlciB3b3JrcyBjb3JyZWN0bHkuIFRoZW4geW91IG5lZWQgdG8gaW1wbGVtZW50IHRoZSArI3BhcnNlKyBtZXRob2Qgd2hpY2ggaGFzIHRvIGNvbnRhaW4KKyAgICAjIHRoZSBwYXJzaW5nIGNvZGUuCisgICAgIworICAgICMgSGF2ZSBhIGxvb2sgYXQgdGhlIEJhc2U6OnBhcnNlLCBCYXNlOjpuZXcgYW5kIEJhc2UjcGFyc2UgbWV0aG9kcyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiEKKyAgICBjbGFzcyBCYXNlCisKKyAgICAgICMgVGhlIGhhc2ggd2l0aCB0aGUgcGFyc2luZyBvcHRpb25zLgorICAgICAgYXR0cl9yZWFkZXIgOm9wdGlvbnMKKworICAgICAgIyBUaGUgYXJyYXkgd2l0aCB0aGUgcGFyc2VyIHdhcm5pbmdzLgorICAgICAgYXR0cl9yZWFkZXIgOndhcm5pbmdzCisKKyAgICAgICMgVGhlIG9yaWdpbmFsIHNvdXJjZSBzdHJpbmcuCisgICAgICBhdHRyX3JlYWRlciA6c291cmNlCisKKyAgICAgICMgVGhlIHJvb3QgZWxlbWVudCBvZiBlbGVtZW50IHRyZWUgdGhhdCBpcyBjcmVhdGVkIGZyb20gdGhlIHNvdXJjZSBzdHJpbmcuCisgICAgICBhdHRyX3JlYWRlciA6cm9vdAorCisgICAgICAjIEluaXRpYWxpemUgdGhlIHBhcnNlciBvYmplY3Qgd2l0aCB0aGUgK3NvdXJjZSsgc3RyaW5nIGFuZCB0aGUgcGFyc2luZyArb3B0aW9ucysuCisgICAgICAjCisgICAgICAjIFRoZSBAcm9vdCBlbGVtZW50LCB0aGUgQHdhcm5pbmdzIGFycmF5IGFuZCBAdGV4dF90eXBlIChzcGVjaWZpZXMgdGhlIGRlZmF1bHQgdHlwZSBmb3IgbmV3bHkKKyAgICAgICMgY3JlYXRlZCB0ZXh0IG5vZGVzKSBhcmUgYXV0b21hdGljYWxseSBpbml0aWFsaXplZC4KKyAgICAgIGRlZiBpbml0aWFsaXplKHNvdXJjZSwgb3B0aW9ucykKKyAgICAgICAgQHNvdXJjZSA9IHNvdXJjZQorICAgICAgICBAb3B0aW9ucyA9IEtyYW1kb3duOjpPcHRpb25zLm1lcmdlKG9wdGlvbnMpCisgICAgICAgIEByb290ID0gRWxlbWVudC5uZXcoOnJvb3QsIG5pbCwgbmlsLCA6ZW5jb2RpbmcgPT4gKHNvdXJjZS5lbmNvZGluZyByZXNjdWUgbmlsKSwgOmxvY2F0aW9uID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wdGlvbnMgPT4ge30sIDphYmJyZXZfZGVmcyA9PiB7fSwgOmFiYnJldl9hdHRyID0+IHt9KQorICAgICAgICBAd2FybmluZ3MgPSBbXQorICAgICAgICBAdGV4dF90eXBlID0gOnRleHQKKyAgICAgIGVuZAorICAgICAgcHJpdmF0ZV9jbGFzc19tZXRob2QoOm5ldywgOmFsbG9jYXRlKQorCisgICAgICAjIFBhcnNlIHRoZSArc291cmNlKyBzdHJpbmcgaW50byBhbiBlbGVtZW50IHRyZWUsIHBvc3NpYmx5IHVzaW5nIHRoZSBwYXJzaW5nICtvcHRpb25zKywgYW5kCisgICAgICAjIHJldHVybiB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBlbGVtZW50IHRyZWUgYW5kIGFuIGFycmF5IHdpdGggd2FybmluZyBtZXNzYWdlcy4KKyAgICAgICMKKyAgICAgICMgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY2xhc3MgYW5kIHRoZW4gY2FsbHMgdGhlICsjcGFyc2UrIG1ldGhvZCB0aGF0IG11c3QKKyAgICAgICMgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBzdWJjbGFzcy4KKyAgICAgIGRlZiBzZWxmLnBhcnNlKHNvdXJjZSwgb3B0aW9ucyA9IHt9KQorICAgICAgICBwYXJzZXIgPSBuZXcoc291cmNlLCBvcHRpb25zKQorICAgICAgICBwYXJzZXIucGFyc2UKKyAgICAgICAgW3BhcnNlci5yb290LCBwYXJzZXIud2FybmluZ3NdCisgICAgICBlbmQKKworICAgICAgIyBQYXJzZSB0aGUgc291cmNlIHN0cmluZyBpbnRvIGFuIGVsZW1lbnQgdHJlZS4KKyAgICAgICMKKyAgICAgICMgVGhlIHBhcnNpbmcgY29kZSBzaG91bGQgcGFyc2UgdGhlIHNvdXJjZSBwcm92aWRlZCBpbiBAc291cmNlIGFuZCBidWlsZCBhbiBlbGVtZW50IHRyZWUgdGhlCisgICAgICAjIHJvb3Qgb2Ygd2hpY2ggc2hvdWxkIGJlIEByb290LgorICAgICAgIworICAgICAgIyBUaGlzIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGF0IGhhcyB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWItY2xhc3NlcyEKKyAgICAgIGRlZiBwYXJzZQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICBlbmQKKworICAgICAgIyBBZGQgdGhlIGdpdmVuIHdhcm5pbmcgK3RleHQrIHRvIHRoZSB3YXJuaW5nIGFycmF5LgorICAgICAgZGVmIHdhcm5pbmcodGV4dCkKKyAgICAgICAgQHdhcm5pbmdzIDw8IHRleHQKKyAgICAgICAgI1RPRE86IGFkZCBwb3NpdGlvbiBpbmZvcm1hdGlvbgorICAgICAgZW5kCisKKyAgICAgICMgTW9kaWZ5IHRoZSBzdHJpbmcgK3NvdXJjZSsgdG8gYmUgdXNhYmxlIGJ5IHRoZSBwYXJzZXIgKHVuaWZpZXMgbGluZSBlbmRpbmcgY2hhcmFjdGVycyB0bworICAgICAgIyArXG4rIGFuZCBtYWtlcyBzdXJlICtzb3VyY2UrIGVuZHMgd2l0aCBhIG5ldyBsaW5lIGNoYXJhY3RlcikuCisgICAgICBkZWYgYWRhcHRfc291cmNlKHNvdXJjZSkKKyAgICAgICAgaWYgc291cmNlLnJlc3BvbmRfdG8/KDplbmNvZGUpCisgICAgICAgICAgaWYgIXNvdXJjZS52YWxpZF9lbmNvZGluZz8KKyAgICAgICAgICAgIHJhaXNlICJUaGUgc291cmNlIHRleHQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIGZvciB0aGUgdXNlZCBlbmNvZGluZyAje3NvdXJjZS5lbmNvZGluZ30iCisgICAgICAgICAgZW5kCisgICAgICAgICAgc291cmNlID0gc291cmNlLmVuY29kZSgnVVRGLTgnKQorICAgICAgICBlbmQKKyAgICAgICAgc291cmNlLmdzdWIoL1xyXG4/LywgIlxuIikuY2hvbXAgKyAiXG4iCisgICAgICBlbmQKKworICAgICAgIyBUaGlzIGhlbHBlciBtZXRob2QgYWRkcyB0aGUgZ2l2ZW4gK3RleHQrIGVpdGhlciB0byB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSArdHJlZSsgaWYgaXQgaXMgYQorICAgICAgIyArdHlwZSsgZWxlbWVudCBvciBjcmVhdGVzIGEgbmV3IHRleHQgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiArdHlwZSsuCisgICAgICBkZWYgYWRkX3RleHQodGV4dCwgdHJlZSA9IEB0cmVlLCB0eXBlID0gQHRleHRfdHlwZSkKKyAgICAgICAgbGFzdCA9IHRyZWUuY2hpbGRyZW4ubGFzdAorICAgICAgICBpZiBsYXN0ICYmIGxhc3QudHlwZSA9PSB0eXBlCisgICAgICAgICAgbGFzdC52YWx1ZSA8PCB0ZXh0CisgICAgICAgIGVsc2lmICF0ZXh0LmVtcHR5PworICAgICAgICAgIHRyZWUuY2hpbGRyZW4gPDwgRWxlbWVudC5uZXcodHlwZSwgdGV4dCwgbmlsLCA6bG9jYXRpb24gPT4gKGxhc3QgJiYgbGFzdC5vcHRpb25zWzpsb2NhdGlvbl0gfHwgdHJlZS5vcHRpb25zWzpsb2NhdGlvbl0pKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEV4dHJhY3QgdGhlIHBhcnQgb2YgdGhlIFN0cmluZ1NjYW5uZXIgK3N0cnNjYW4rIGJhY2tlZCBzdHJpbmcgc3BlY2lmaWVkIGJ5IHRoZSArcmFuZ2UrLiBUaGlzCisgICAgICAjIG1ldGhvZCB3b3JrcyBjb3JyZWN0bHkgdW5kZXIgUnVieSAxLjggYW5kIFJ1YnkgMS45LgorICAgICAgZGVmIGV4dHJhY3Rfc3RyaW5nKHJhbmdlLCBzdHJzY2FuKQorICAgICAgICByZXN1bHQgPSBuaWwKKyAgICAgICAgaWYgc3Ryc2Nhbi5zdHJpbmcucmVzcG9uZF90bz8oOmVuY29kaW5nKQorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBlbmMgPSBzdHJzY2FuLnN0cmluZy5lbmNvZGluZworICAgICAgICAgICAgc3Ryc2Nhbi5zdHJpbmcuZm9yY2VfZW5jb2RpbmcoJ0FTQ0lJLThCSVQnKQorICAgICAgICAgICAgcmVzdWx0ID0gc3Ryc2Nhbi5zdHJpbmdbcmFuZ2VdLmZvcmNlX2VuY29kaW5nKGVuYykKKyAgICAgICAgICBlbnN1cmUKKyAgICAgICAgICAgIHN0cnNjYW4uc3RyaW5nLmZvcmNlX2VuY29kaW5nKGVuYykKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlc3VsdCA9IHN0cnNjYW4uc3RyaW5nW3JhbmdlXQorICAgICAgICBlbmQKKyAgICAgICAgcmVzdWx0CisgICAgICBlbmQKKworICAgIGVuZAorCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2dmbS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2dmbS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk5MjczCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIvZ2ZtLnJiCkBAIC0wLDAgKzEsMTY4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKKworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyJworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFBhcnNlcgorICAgIGNsYXNzIEdGTSA8IEtyYW1kb3duOjpQYXJzZXI6OktyYW1kb3duCisKKyAgICAgIGRlZiBpbml0aWFsaXplKHNvdXJjZSwgb3B0aW9ucykKKyAgICAgICAgc3VwZXIKKyAgICAgICAgQG9wdGlvbnNbOmF1dG9faWRfc3RyaXBwaW5nXSA9IHRydWUKKyAgICAgICAgQGlkX2NvdW50ZXIgPSBIYXNoLm5ldygtMSkKKworICAgICAgICBAc3Bhbl9wYXJzZXJzLmRlbGV0ZSg6bGluZV9icmVhaykgaWYgQG9wdGlvbnNbOmhhcmRfd3JhcF0KKyAgICAgICAgaWYgQG9wdGlvbnNbOmdmbV9xdWlya3NdLmluY2x1ZGU/KDpwYXJhZ3JhcGhfZW5kKQorICAgICAgICAgIGF0eF9oZWFkZXJfcGFyc2VyID0gOmF0eF9oZWFkZXJfZ2ZtX3F1aXJrCisgICAgICAgICAgQHBhcmFncmFwaF9lbmQgPSBzZWxmLmNsYXNzOjpQQVJBR1JBUEhfRU5EX0dGTQorICAgICAgICBlbHNlCisgICAgICAgICAgYXR4X2hlYWRlcl9wYXJzZXIgPSA6YXR4X2hlYWRlcl9nZm0KKyAgICAgICAgICBAcGFyYWdyYXBoX2VuZCA9IHNlbGYuY2xhc3M6OlBBUkFHUkFQSF9FTkQKKyAgICAgICAgZW5kCisKKyAgICAgICAgezpjb2RlYmxvY2tfZmVuY2VkID0+IDpjb2RlYmxvY2tfZmVuY2VkX2dmbSwKKyAgICAgICAgICA6YXR4X2hlYWRlciA9PiBhdHhfaGVhZGVyX3BhcnNlcn0uZWFjaCBkbyB8Y3VycmVudCwgcmVwbGFjZW1lbnR8CisgICAgICAgICAgaSA9IEBibG9ja19wYXJzZXJzLmluZGV4KGN1cnJlbnQpCisgICAgICAgICAgQGJsb2NrX3BhcnNlcnMuZGVsZXRlKGN1cnJlbnQpCisgICAgICAgICAgQGJsb2NrX3BhcnNlcnMuaW5zZXJ0KGksIHJlcGxhY2VtZW50KQorICAgICAgICBlbmQKKworICAgICAgICBpID0gQHNwYW5fcGFyc2Vycy5pbmRleCg6ZXNjYXBlZF9jaGFycykKKyAgICAgICAgQHNwYW5fcGFyc2Vyc1tpXSA9IDplc2NhcGVkX2NoYXJzX2dmbSBpZiBpCisgICAgICAgIEBzcGFuX3BhcnNlcnMgPDwgOnN0cmlrZXRocm91Z2hfZ2ZtCisgICAgICBlbmQKKworICAgICAgZGVmIHBhcnNlCisgICAgICAgIHN1cGVyCisgICAgICAgIHVwZGF0ZV9lbGVtZW50cyhAcm9vdCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgdXBkYXRlX2VsZW1lbnRzKGVsZW1lbnQpCisgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ubWFwISBkbyB8Y2hpbGR8CisgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSA6dGV4dCAmJiBAb3B0aW9uc1s6aGFyZF93cmFwXSAmJiBjaGlsZC52YWx1ZSA9fiAvXG4vCisgICAgICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgICAgICBsaW5lcyA9IGNoaWxkLnZhbHVlLnNwbGl0KC9cbi8sIC0xKQorICAgICAgICAgICAgb21pdF90cmFpbGluZ19iciA9IChLcmFtZG93bjo6RWxlbWVudC5jYXRlZ29yeShlbGVtZW50KSA9PSA6YmxvY2sgJiYgZWxlbWVudC5jaGlsZHJlblstMV0gPT0gY2hpbGQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbLTFdLmVtcHR5PykKKyAgICAgICAgICAgIGxpbmVzLmVhY2hfd2l0aF9pbmRleCBkbyB8bGluZSwgaW5kZXh8CisgICAgICAgICAgICAgIG5ld19lbGVtZW50X29wdGlvbnMgPSB7IDpsb2NhdGlvbiA9PiBjaGlsZC5vcHRpb25zWzpsb2NhdGlvbl0gKyBpbmRleCB9CisKKyAgICAgICAgICAgICAgY2hpbGRyZW4gPDwgRWxlbWVudC5uZXcoOnRleHQsIChpbmRleCA+IDAgPyAiXG4je2xpbmV9IiA6IGxpbmUpLCBuaWwsIG5ld19lbGVtZW50X29wdGlvbnMpCisgICAgICAgICAgICAgIGNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDpiciwgbmlsLCBuaWwsIG5ld19lbGVtZW50X29wdGlvbnMpIGlmIGluZGV4IDwgbGluZXMuc2l6ZSAtIDIgfHwKKyAgICAgICAgICAgICAgICAoaW5kZXggPT0gbGluZXMuc2l6ZSAtIDIgJiYgIW9taXRfdHJhaWxpbmdfYnIpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGNoaWxkcmVuCisgICAgICAgICAgZWxzaWYgY2hpbGQudHlwZSA9PSA6aHRtbF9lbGVtZW50CisgICAgICAgICAgICBjaGlsZAorICAgICAgICAgIGVsc2lmIGNoaWxkLnR5cGUgPT0gOmhlYWRlciAmJiBAb3B0aW9uc1s6YXV0b19pZHNdICYmICFjaGlsZC5hdHRyLmhhc19rZXk/KCdpZCcpCisgICAgICAgICAgICBjaGlsZC5hdHRyWydpZCddID0gZ2VuZXJhdGVfZ2ZtX2hlYWRlcl9pZChjaGlsZC5vcHRpb25zWzpyYXdfdGV4dF0pCisgICAgICAgICAgICBjaGlsZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVwZGF0ZV9lbGVtZW50cyhjaGlsZCkKKyAgICAgICAgICAgIGNoaWxkCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZC5mbGF0dGVuIQorICAgICAgZW5kCisKKyAgICAgICMgVXBkYXRlIHRoZSByYXcgdGV4dCBmb3IgYXV0b21hdGljIElEIGdlbmVyYXRpb24uCisgICAgICBkZWYgdXBkYXRlX3Jhd190ZXh0KGl0ZW0pCisgICAgICAgIHJhd190ZXh0ID0gJycKKworICAgICAgICBhcHBlbmRfdGV4dCA9IGxhbWJkYSBkbyB8Y2hpbGR8CisgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSA6dGV4dCB8fCBjaGlsZC50eXBlID09IDpjb2Rlc3BhbiB8fCBjaGlsZC50eXBlID09Om1hdGgKKyAgICAgICAgICAgIHJhd190ZXh0IDw8IGNoaWxkLnZhbHVlCisgICAgICAgICAgZWxzaWYgY2hpbGQudHlwZSA9PSA6ZW50aXR5CisgICAgICAgICAgICByYXdfdGV4dCA8PCBjaGlsZC52YWx1ZS5jaGFyCisgICAgICAgICAgZWxzaWYgY2hpbGQudHlwZSA9PSA6c21hcnRfcXVvdGUKKyAgICAgICAgICAgIHJhd190ZXh0IDw8IDo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoY2hpbGQudmFsdWUudG9fcykuY2hhcgorICAgICAgICAgIGVsc2lmIGNoaWxkLnR5cGUgPT0gOnR5cG9ncmFwaGljX3N5bQorICAgICAgICAgICAgaWYgY2hpbGQudmFsdWUgPT0gOmxhcXVvX3NwYWNlCisgICAgICAgICAgICAgIHJhd190ZXh0IDw8ICLCq8KgIgorICAgICAgICAgICAgZWxzaWYgY2hpbGQudmFsdWUgPT0gOnJhcXVvX3NwYWNlCisgICAgICAgICAgICAgIHJhd190ZXh0IDw8ICLCoMK7IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByYXdfdGV4dCA8PCA6OktyYW1kb3duOjpVdGlsczo6RW50aXRpZXMuZW50aXR5KGNoaWxkLnZhbHVlLnRvX3MpLmNoYXIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuLmVhY2gge3xjfCBhcHBlbmRfdGV4dC5jYWxsKGMpfQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBhcHBlbmRfdGV4dC5jYWxsKGl0ZW0pCisgICAgICAgIGl0ZW0ub3B0aW9uc1s6cmF3X3RleHRdID0gcmF3X3RleHQKKyAgICAgIGVuZAorCisgICAgICBOT05fV09SRF9SRSA9IChSVUJZX1ZFUlNJT04gPiAiMS45IiA/IC9bXlxwe1dvcmR9XC0gXHRdLyA6IC9bXlx3XC0gXHRdLykKKworICAgICAgZGVmIGdlbmVyYXRlX2dmbV9oZWFkZXJfaWQodGV4dCkKKyAgICAgICAgcmVzdWx0ID0gdGV4dC5kb3duY2FzZQorICAgICAgICByZXN1bHQuZ3N1YiEoTk9OX1dPUkRfUkUsICcnKQorICAgICAgICByZXN1bHQudHIhKCIgXHQiLCAnLScpCisgICAgICAgIEBpZF9jb3VudGVyW3Jlc3VsdF0gKz0gMQorICAgICAgICByZXN1bHQgPDwgKEBpZF9jb3VudGVyW3Jlc3VsdF0gPiAwID8gIi0je0BpZF9jb3VudGVyW3Jlc3VsdF19IiA6ICcnKQorICAgICAgICBAb3B0aW9uc1s6YXV0b19pZF9wcmVmaXhdICsgcmVzdWx0CisgICAgICBlbmQKKworICAgICAgQVRYX0hFQURFUl9TVEFSVCA9IC9eXCN7MSw2fVxzLworICAgICAgZGVmaW5lX3BhcnNlcig6YXR4X2hlYWRlcl9nZm0sIEFUWF9IRUFERVJfU1RBUlQsIG5pbCwgJ3BhcnNlX2F0eF9oZWFkZXInKQorICAgICAgZGVmaW5lX3BhcnNlcig6YXR4X2hlYWRlcl9nZm1fcXVpcmssIEFUWF9IRUFERVJfU1RBUlQpCisKKyAgICAgICMgQ29waWVkIGZyb20ga3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2hlYWRlci5yYiwgcmVtb3ZlZCB0aGUgZmlyc3QgbGluZQorICAgICAgZGVmIHBhcnNlX2F0eF9oZWFkZXJfZ2ZtX3F1aXJrCisgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgIEBzcmMuY2hlY2soQVRYX0hFQURFUl9NQVRDSCkKKyAgICAgICAgbGV2ZWwsIHRleHQsIGlkID0gQHNyY1sxXSwgQHNyY1syXS50b19zLnN0cmlwLCBAc3JjWzNdCisgICAgICAgIHJldHVybiBmYWxzZSBpZiB0ZXh0LmVtcHR5PworCisgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgIGVsID0gbmV3X2Jsb2NrX2VsKDpoZWFkZXIsIG5pbCwgbmlsLCA6bGV2ZWwgPT4gbGV2ZWwubGVuZ3RoLCA6cmF3X3RleHQgPT4gdGV4dCwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKQorICAgICAgICBhZGRfdGV4dCh0ZXh0LCBlbCkKKyAgICAgICAgZWwuYXR0clsnaWQnXSA9IGlkIGlmIGlkCisgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IGVsCisgICAgICAgIHRydWUKKyAgICAgIGVuZAorCisgICAgICBGRU5DRURfQ09ERUJMT0NLX1NUQVJUID0gL15bIF17MCwzfVt+YF17Myx9LworICAgICAgRkVOQ0VEX0NPREVCTE9DS19NQVRDSCA9IC9eWyBdezAsM30oKFt+YF0pezMsfSlccyo/KChcUys/KSg/Olw/XFMqKT8pP1xzKj9cbiguKj8pXlsgXXswLDN9XDFcMipccyo/XG4vbQorICAgICAgZGVmaW5lX3BhcnNlcig6Y29kZWJsb2NrX2ZlbmNlZF9nZm0sIEZFTkNFRF9DT0RFQkxPQ0tfU1RBUlQsIG5pbCwgJ3BhcnNlX2NvZGVibG9ja19mZW5jZWQnKQorCisgICAgICBTVFJJS0VUSFJPVUdIX0RFTElNID0gL35+LworICAgICAgU1RSSUtFVEhST1VHSF9NQVRDSCA9IC8je1NUUklLRVRIUk9VR0hfREVMSU19W15cc35dKC4qPylbXlxzfl0je1NUUklLRVRIUk9VR0hfREVMSU19L20KKyAgICAgIGRlZmluZV9wYXJzZXIoOnN0cmlrZXRocm91Z2hfZ2ZtLCBTVFJJS0VUSFJPVUdIX01BVENILCAnfn4nKQorCisgICAgICBkZWYgcGFyc2Vfc3RyaWtldGhyb3VnaF9nZm0KKyAgICAgICAgbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKworICAgICAgICBAc3JjLnBvcyArPSBAc3JjLm1hdGNoZWRfc2l6ZQorICAgICAgICBlbCA9IEVsZW1lbnQubmV3KDpodG1sX2VsZW1lbnQsICdkZWwnLCB7fSwgOmNhdGVnb3J5ID0+IDpzcGFuLCA6bGluZSA9PiBsaW5lX251bWJlcikKKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgZWwKKworICAgICAgICBlbnYgPSBzYXZlX2VudgorICAgICAgICByZXNldF9lbnYoOnNyYyA9PiBLcmFtZG93bjo6VXRpbHM6OlN0cmluZ1NjYW5uZXIubmV3KEBzcmMubWF0Y2hlZFsyLi4tM10sIGxpbmVfbnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgIDp0ZXh0X3R5cGUgPT4gOnRleHQpCisgICAgICAgIHBhcnNlX3NwYW5zKGVsKQorICAgICAgICByZXN0b3JlX2VudihlbnYpCisKKyAgICAgICAgZWwKKyAgICAgIGVuZAorCisgICAgICBFU0NBUEVEX0NIQVJTX0dGTSA9IC9cXChbXFwuKl8rYDw+KClcW1xde30jITpcfCInXCQ9XC1+XSkvCisgICAgICBkZWZpbmVfcGFyc2VyKDplc2NhcGVkX2NoYXJzX2dmbSwgRVNDQVBFRF9DSEFSU19HRk0sICdcXFxcJywgOnBhcnNlX2VzY2FwZWRfY2hhcnMpCisKKyAgICAgIFBBUkFHUkFQSF9FTkRfR0ZNID0gLyN7TEFaWV9FTkR9fCN7TElTVF9TVEFSVH18I3tBVFhfSEVBREVSX1NUQVJUfXwje0RFRklOSVRJT05fTElTVF9TVEFSVH18I3tCTE9DS1FVT1RFX1NUQVJUfXwje0ZFTkNFRF9DT0RFQkxPQ0tfU1RBUlR9LworCisgICAgICBkZWYgcGFyYWdyYXBoX2VuZAorICAgICAgICBAcGFyYWdyYXBoX2VuZAorICAgICAgZW5kCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2h0bWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9odG1sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMTBhM2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9odG1sLnJiCkBAIC0wLDAgKzEsNjAwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ3JleG1sL3BhcnNlcnMvYmFzZXBhcnNlcicKK3JlcXVpcmUgJ3N0cnNjYW4nCityZXF1aXJlICdrcmFtZG93bi91dGlscycKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlcicKKworbW9kdWxlIEtyYW1kb3duCisKKyAgbW9kdWxlIFBhcnNlcgorCisgICAgIyBVc2VkIGZvciBwYXJzaW5nIGEgSFRNTCBkb2N1bWVudC4KKyAgICAjCisgICAgIyBUaGUgcGFyc2luZyBjb2RlIGlzIGluIHRoZSBQYXJzZXIgbW9kdWxlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBieSBvdGhlciBwYXJzZXJzLgorICAgIGNsYXNzIEh0bWwgPCBCYXNlCisKKyAgICAgICMgQ29udGFpbnMgYWxsIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VkIHdoZW4gcGFyc2luZy4KKyAgICAgIG1vZHVsZSBDb25zdGFudHMKKworICAgICAgICAjOnN0b3Bkb2M6CisgICAgICAgICMgVGhlIGZvbGxvd2luZyByZWdleHBzIGFyZSBiYXNlZCBvbiB0aGUgb25lcyB1c2VkIGJ5IFJFWE1MLCB3aXRoIHNvbWUgc2xpZ2h0IG1vZGlmaWNhdGlvbnMuCisgICAgICAgIEhUTUxfRE9DVFlQRV9SRSA9IC88IURPQ1RZUEUuKj8+L2ltCisgICAgICAgIEhUTUxfQ09NTUVOVF9SRSA9IC88IS0tKC4qPyktLT4vbQorICAgICAgICBIVE1MX0lOU1RSVUNUSU9OX1JFID0gLzxcPyguKj8pXD8+L20KKyAgICAgICAgSFRNTF9BVFRSSUJVVEVfUkUgPSAvXHMqKCN7UkVYTUw6OlBhcnNlcnM6OkJhc2VQYXJzZXI6OlVOQU1FX1NUUn0pKD86XHMqPVxzKihbIiddKSguKj8pXDIpPy9tCisgICAgICAgIEhUTUxfVEFHX1JFID0gLzwoKD8+I3tSRVhNTDo6UGFyc2Vyczo6QmFzZVBhcnNlcjo6VU5BTUVfU1RSfSkpXHMqKCg/PlxzKyN7UkVYTUw6OlBhcnNlcnM6OkJhc2VQYXJzZXI6OlVOQU1FX1NUUn0oPzpccyo9XHMqKFsiJ10pLio/XDMpPykqKVxzKihcLyk/Pi9tCisgICAgICAgIEhUTUxfVEFHX0NMT1NFX1JFID0gLzxcLygje1JFWE1MOjpQYXJzZXJzOjpCYXNlUGFyc2VyOjpVTkFNRV9TVFJ9KVxzKj4vbQorICAgICAgICBIVE1MX0VOVElUWV9SRSA9IC8mKFtcdzpdW1wtXHdcLjpdKik7fCYjKFxkKyk7fCZcI3goWzAtOWEtZkEtRl0rKTsvCisKKyAgICAgICAgSFRNTF9DT05URU5UX01PREVMX0JMT0NLID0gJXd7YWRkcmVzcyBhcHBsZXQgYXJ0aWNsZSBhc2lkZSBibG9ja3F1b3RlIGJvZHkKKyAgICAgICAgICAgICBkZCBkZXRhaWxzIGRpdiBkbCBmaWVsZHNldCBmaWd1cmUgZmlnY2FwdGlvbiBmb290ZXIgZm9ybSBoZWFkZXIgaGdyb3VwIGlmcmFtZSBsaSBtYWluCisgICAgICAgICAgICAgbWFwIG1lbnUgbmF2IG5vc2NyaXB0IG9iamVjdCBzZWN0aW9uIHN1bW1hcnkgdGR9CisgICAgICAgIEhUTUxfQ09OVEVOVF9NT0RFTF9TUEFOICA9ICV3e2EgYWJiciBhY3JvbnltIGIgYmRvIGJpZyBidXR0b24gY2l0ZSBjYXB0aW9uIGRlbCBkZm4gZHQgZW0KKyAgICAgICAgICAgICBoMSBoMiBoMyBoNCBoNSBoNiBpIGlucyBsYWJlbCBsZWdlbmQgb3B0Z3JvdXAgcCBxIHJiIHJiYworICAgICAgICAgICAgIHJwIHJ0IHJ0YyBydWJ5IHNlbGVjdCBzbWFsbCBzcGFuIHN0cm9uZyBzdWIgc3VwIHRoIHR0fQorICAgICAgICBIVE1MX0NPTlRFTlRfTU9ERUxfUkFXICAgPSAld3tzY3JpcHQgc3R5bGUgbWF0aCBvcHRpb24gdGV4dGFyZWEgcHJlIGNvZGUga2JkIHNhbXAgdmFyfQorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgZWxlbWVudHMgYXJlIGFsc28gcGFyc2VkIGFzIHJhdyBzaW5jZSB0aGV5IG5lZWQgY2hpbGQgZWxlbWVudHMgdGhhdCBjYW5ub3QKKyAgICAgICAgIyBiZSBleHByZXNzZWQgdXNpbmcga3JhbWRvd24gc3ludGF4OiBjb2xncm91cCB0YWJsZSB0Ym9keSB0aGVhZCB0Zm9vdCB0ciB1bCBvbAorCisgICAgICAgIEhUTUxfQ09OVEVOVF9NT0RFTCA9IEhhc2gubmV3IHt8aCxrfCBoW2tdID0gOnJhd30KKyAgICAgICAgSFRNTF9DT05URU5UX01PREVMX0JMT0NLLmVhY2gge3xpfCBIVE1MX0NPTlRFTlRfTU9ERUxbaV0gPSA6YmxvY2t9CisgICAgICAgIEhUTUxfQ09OVEVOVF9NT0RFTF9TUEFOLmVhY2gge3xpfCBIVE1MX0NPTlRFTlRfTU9ERUxbaV0gPSA6c3Bhbn0KKyAgICAgICAgSFRNTF9DT05URU5UX01PREVMX1JBVy5lYWNoIHt8aXwgSFRNTF9DT05URU5UX01PREVMW2ldID0gOnJhd30KKworICAgICAgICAjIFNvbWUgSFRNTCBlbGVtZW50cyBsaWtlIHNjcmlwdCBiZWxvbmcgdG8gYm90aCBjYXRlZ29yaWVzIChpLmUuIGFyZSB2YWxpZCBpbiBibG9jayBhbmQKKyAgICAgICAgIyBzcGFuIEhUTUwpIGFuZCBkb24ndCBhcHBlYXIgdGhlcmVmb3JlIQorICAgICAgICAjIHNjcmlwdCwgdGV4dGFyZWEKKyAgICAgICAgSFRNTF9TUEFOX0VMRU1FTlRTID0gJXd7YSBhYmJyIGFjcm9ueW0gYiBiaWcgYmRvIGJyIGJ1dHRvbiBjaXRlIGNvZGUgZGVsIGRmbiBlbSBpIGltZyBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zIGtiZCBsYWJlbCBtYXJrIG9wdGlvbiBxIHJiIHJiYyBycCBydCBydGMgcnVieSBzYW1wIHNlbGVjdCBzbWFsbCBzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmcgc3ViIHN1cCB0dCB1IHZhcn0KKyAgICAgICAgSFRNTF9CTE9DS19FTEVNRU5UUyA9ICV3e2FkZHJlc3MgYXJ0aWNsZSBhc2lkZSBhcHBsZXQgYm9keSBibG9ja3F1b3RlIGNhcHRpb24gY29sIGNvbGdyb3VwIGRkIGRpdiBkbCBkdCBmaWVsZHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24gZm9vdGVyIGZvcm0gaDEgaDIgaDMgaDQgaDUgaDYgaGVhZGVyIGhncm91cCBociBodG1sIGhlYWQgaWZyYW1lIGxlZ2VuZCBtZW51CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkgbWFpbiBtYXAgbmF2IG9sIG9wdGdyb3VwIHAgcHJlIHNlY3Rpb24gc3VtbWFyeSB0YWJsZSB0Ym9keSB0ZCB0aCB0aGVhZCB0Zm9vdCB0ciB1bH0KKyAgICAgICAgSFRNTF9FTEVNRU5UU19XSVRIT1VUX0JPRFkgPSAld3thcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdicn0KKworICAgICAgICBIVE1MX0VMRU1FTlQgPSBIYXNoLm5ldyhmYWxzZSkKKyAgICAgICAgKEhUTUxfU1BBTl9FTEVNRU5UUyArIEhUTUxfQkxPQ0tfRUxFTUVOVFMgKyBIVE1MX0VMRU1FTlRTX1dJVEhPVVRfQk9EWSArCisgICAgICAgICBIVE1MX0NPTlRFTlRfTU9ERUwua2V5cykuZWFjaCBkbyB8YXwKKyAgICAgICAgICBIVE1MX0VMRU1FTlRbYV0gPSB0cnVlCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKworICAgICAgIyBDb250YWlucyB0aGUgcGFyc2luZyBtZXRob2RzLiBUaGlzIG1vZHVsZSBjYW4gYmUgbWl4ZWQgaW50byBhbnkgcGFyc2VyIHRvIGdldCBIVE1MIHBhcnNpbmcKKyAgICAgICMgZnVuY3Rpb25hbGl0eS4gVGhlIG9ubHkgdGhpbmcgdGhhdCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjbGFzcyBhcmUgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgICMgQHN0YWNrIGZvciBzdG9yaW5nIHRoZSBuZWVkZWQgc3RhdGUgYW5kIEBzcmMgKGluc3RhbmNlIG9mIFN0cmluZ1NjYW5uZXIpIGZvciB0aGUgYWN0dWFsCisgICAgICAjIHBhcnNpbmcuCisgICAgICBtb2R1bGUgUGFyc2VyCisKKyAgICAgICAgaW5jbHVkZSBDb25zdGFudHMKKworICAgICAgICAjIFByb2Nlc3MgdGhlIEhUTUwgc3RhcnQgdGFnIHRoYXQgaGFzIGFscmVhZHkgYmUgc2Nhbm5lZC9jaGVja2VkIHZpYSBAc3JjLgorICAgICAgICAjCisgICAgICAgICMgRG9lcyB0aGUgY29tbW9uIHByb2Nlc3Npbmcgc3RlcHMgYW5kIHRoZW4geWllbGRzIHRvIHRoZSBjYWxsZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgICAgICAjIChmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGNyZWF0ZWQgZWxlbWVudDsgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgK3RydWUrIGlmIHRoZSBIVE1MCisgICAgICAgICMgZWxlbWVudCBpcyBhbHJlYWR5IGNsb3NlZCwgaWUuIGNvbnRhaW5zIG5vIGJvZHk7IHRoZSB0aGlyZCBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXRoZXIgdGhlCisgICAgICAgICMgYm9keSAtIGFuZCB0aGUgZW5kIHRhZyAtIG5lZWQgdG8gYmUgaGFuZGxlZCBpbiBjYXNlIGNsb3NlZD1mYWxzZSkuCisgICAgICAgIGRlZiBoYW5kbGVfaHRtbF9zdGFydF90YWcobGluZSA9IG5pbCkgIyA6eWllbGRzOiBlbCwgY2xvc2VkLCBoYW5kbGVfYm9keQorICAgICAgICAgIG5hbWUgPSBAc3JjWzFdCisgICAgICAgICAgbmFtZS5kb3duY2FzZSEgaWYgSFRNTF9FTEVNRU5UW25hbWUuZG93bmNhc2VdCisgICAgICAgICAgY2xvc2VkID0gIUBzcmNbNF0ubmlsPworICAgICAgICAgIGF0dHJzID0gcGFyc2VfaHRtbF9hdHRyaWJ1dGVzKEBzcmNbMl0sIGxpbmUsIEhUTUxfRUxFTUVOVFtuYW1lXSkKKworICAgICAgICAgIGVsID0gRWxlbWVudC5uZXcoOmh0bWxfZWxlbWVudCwgbmFtZSwgYXR0cnMsIDpjYXRlZ29yeSA9PiA6YmxvY2spCisgICAgICAgICAgZWwub3B0aW9uc1s6bG9jYXRpb25dID0gbGluZSBpZiBsaW5lCisgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgZWwKKworICAgICAgICAgIGlmICFjbG9zZWQgJiYgSFRNTF9FTEVNRU5UU19XSVRIT1VUX0JPRFkuaW5jbHVkZT8oZWwudmFsdWUpCisgICAgICAgICAgICBjbG9zZWQgPSB0cnVlCisgICAgICAgICAgZW5kCisgICAgICAgICAgaWYgbmFtZSA9PSAnc2NyaXB0JyB8fCBuYW1lID09ICdzdHlsZScKKyAgICAgICAgICAgIGhhbmRsZV9yYXdfaHRtbF90YWcobmFtZSkKKyAgICAgICAgICAgIHlpZWxkKGVsLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeWllbGQoZWwsIGNsb3NlZCwgdHJ1ZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBQYXJzZXMgdGhlIGdpdmVuIHN0cmluZyBmb3IgSFRNTCBhdHRyaWJ1dGVzIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgaGFzaC4KKyAgICAgICAgIworICAgICAgICAjIElmIHRoZSBvcHRpb25hbCArbGluZSsgcGFyYW1ldGVyIGlzIHN1cHBsaWVkLCBpdCBpcyB1c2VkIGluIHdhcm5pbmcgbWVzc2FnZXMuCisgICAgICAgICMKKyAgICAgICAgIyBJZiB0aGUgb3B0aW9uYWwgK2luX2h0bWxfdGFnKyBwYXJhbWV0ZXIgaXMgc2V0IHRvICtmYWxzZSssIGF0dHJpYnV0ZXMgYXJlIG5vdCBtb2RpZmllZCB0bworICAgICAgICAjIGNvbnRhaW4gb25seSBsb3dlcmNhc2UgbGV0dGVycy4KKyAgICAgICAgZGVmIHBhcnNlX2h0bWxfYXR0cmlidXRlcyhzdHIsIGxpbmUgPSBuaWwsIGluX2h0bWxfdGFnID0gdHJ1ZSkKKyAgICAgICAgICBhdHRycyA9IFV0aWxzOjpPcmRlcmVkSGFzaC5uZXcKKyAgICAgICAgICBzdHIuc2NhbihIVE1MX0FUVFJJQlVURV9SRSkuZWFjaCBkbyB8YXR0ciwgc2VwLCB2YWx8CisgICAgICAgICAgICBhdHRyLmRvd25jYXNlISBpZiBpbl9odG1sX3RhZworICAgICAgICAgICAgaWYgYXR0cnMuaGFzX2tleT8oYXR0cikKKyAgICAgICAgICAgICAgd2FybmluZygiRHVwbGljYXRlIEhUTUwgYXR0cmlidXRlICcje2F0dHJ9JyBvbiBsaW5lICN7bGluZSB8fCAnPyd9IC0gb3ZlcndyaXRpbmcgcHJldmlvdXMgb25lIikKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgYXR0cnNbYXR0cl0gPSB2YWwgfHwgIiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBhdHRycworICAgICAgICBlbmQKKworICAgICAgICAjIEhhbmRsZSB0aGUgcmF3IEhUTUwgdGFnIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgICBkZWYgaGFuZGxlX3Jhd19odG1sX3RhZyhuYW1lKQorICAgICAgICAgIGN1cnBvcyA9IEBzcmMucG9zCisgICAgICAgICAgaWYgQHNyYy5zY2FuX3VudGlsKC8oPz08XC8je25hbWV9XHMqPikvbWkpCisgICAgICAgICAgICBhZGRfdGV4dChleHRyYWN0X3N0cmluZyhjdXJwb3MuLi5Ac3JjLnBvcywgQHNyYyksIEB0cmVlLmNoaWxkcmVuLmxhc3QsIDpyYXcpCisgICAgICAgICAgICBAc3JjLnNjYW4oSFRNTF9UQUdfQ0xPU0VfUkUpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkX3RleHQoQHNyYy5yZXN0LCBAdHJlZS5jaGlsZHJlbi5sYXN0LCA6cmF3KQorICAgICAgICAgICAgQHNyYy50ZXJtaW5hdGUKKyAgICAgICAgICAgIHdhcm5pbmcoIkZvdW5kIG5vIGVuZCB0YWcgZm9yICcje25hbWV9JyAtIGF1dG8tY2xvc2luZyBpdCIpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIEhUTUxfUkFXX1NUQVJUID0gLyg/PTwoI3tSRVhNTDo6UGFyc2Vyczo6QmFzZVBhcnNlcjo6VU5BTUVfU1RSfXxcL3whLS18XD8pKS8gIyA6bm9kb2M6CisKKyAgICAgICAgIyBQYXJzZSByYXcgSFRNTCBmcm9tIHRoZSBjdXJyZW50IHNvdXJjZSBwb3NpdGlvbiwgc3RvcmluZyB0aGUgZm91bmQgZWxlbWVudHMgaW4gK2VsKy4KKyAgICAgICAgIyBQYXJzaW5nIGNvbnRpbnVlcyB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjcml0ZXJpYSBhcmUgZnVsZmlsbGVkOgorICAgICAgICAjCisgICAgICAgICMgLSBUaGUgZW5kIG9mIHRoZSBkb2N1bWVudCBpcyByZWFjaGVkLgorICAgICAgICAjIC0gVGhlIG1hdGNoaW5nIGVuZCB0YWcgZm9yIHRoZSBlbGVtZW50ICtlbCsgaXMgZm91bmQgKG9ubHkgdXNlZCBpZiArZWwrIGlzIGFuIEhUTUwKKyAgICAgICAgIyAgIGVsZW1lbnQpLgorICAgICAgICAjCisgICAgICAgICMgV2hlbiBhbiBIVE1MIHN0YXJ0IHRhZyBpcyBmb3VuZCwgcHJvY2Vzc2luZyBpcyBkZWZlcnJlZCB0byAjaGFuZGxlX2h0bWxfc3RhcnRfdGFnLAorICAgICAgICAjIHByb3ZpZGluZyB0aGUgYmxvY2sgZ2l2ZW4gdG8gdGhpcyBtZXRob2QuCisgICAgICAgIGRlZiBwYXJzZV9yYXdfaHRtbChlbCwgJmJsb2NrKQorICAgICAgICAgIEBzdGFjay5wdXNoKEB0cmVlKQorICAgICAgICAgIEB0cmVlID0gZWwKKworICAgICAgICAgIGRvbmUgPSBmYWxzZQorICAgICAgICAgIHdoaWxlICFAc3JjLmVvcz8gJiYgIWRvbmUKKyAgICAgICAgICAgIGlmIHJlc3VsdCA9IEBzcmMuc2Nhbl91bnRpbChIVE1MX1JBV19TVEFSVCkKKyAgICAgICAgICAgICAgYWRkX3RleHQocmVzdWx0LCBAdHJlZSwgOnRleHQpCisgICAgICAgICAgICAgIGxpbmUgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgICAgICAgaWYgcmVzdWx0ID0gQHNyYy5zY2FuKEhUTUxfQ09NTUVOVF9SRSkKKyAgICAgICAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6eG1sX2NvbW1lbnQsIHJlc3VsdCwgbmlsLCA6Y2F0ZWdvcnkgPT4gOmJsb2NrLCA6bG9jYXRpb24gPT4gbGluZSkKKyAgICAgICAgICAgICAgZWxzaWYgcmVzdWx0ID0gQHNyYy5zY2FuKEhUTUxfSU5TVFJVQ1RJT05fUkUpCisgICAgICAgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgRWxlbWVudC5uZXcoOnhtbF9waSwgcmVzdWx0LCBuaWwsIDpjYXRlZ29yeSA9PiA6YmxvY2ssIDpsb2NhdGlvbiA9PiBsaW5lKQorICAgICAgICAgICAgICBlbHNpZiBAc3JjLnNjYW4oSFRNTF9UQUdfUkUpCisgICAgICAgICAgICAgICAgaWYgbWV0aG9kKDpoYW5kbGVfaHRtbF9zdGFydF90YWcpLmFyaXR5LmFicyA+PSAxCisgICAgICAgICAgICAgICAgICBoYW5kbGVfaHRtbF9zdGFydF90YWcobGluZSwgJmJsb2NrKQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGhhbmRsZV9odG1sX3N0YXJ0X3RhZygmYmxvY2spICMgREVQUkVDQVRFRDogbWV0aG9kIG5lZWRzIHRvIGFjY2VwdCBsaW5lIG51bWJlciBpbiAyLjAKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgZWxzaWYgQHNyYy5zY2FuKEhUTUxfVEFHX0NMT1NFX1JFKQorICAgICAgICAgICAgICAgIGlmIEB0cmVlLnZhbHVlID09IChIVE1MX0VMRU1FTlRbQHRyZWUudmFsdWVdID8gQHNyY1sxXS5kb3duY2FzZSA6IEBzcmNbMV0pCisgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGFkZF90ZXh0KEBzcmMubWF0Y2hlZCwgQHRyZWUsIDp0ZXh0KQorICAgICAgICAgICAgICAgICAgd2FybmluZygiRm91bmQgaW52YWxpZGx5IHVzZWQgSFRNTCBjbG9zaW5nIHRhZyBmb3IgJyN7QHNyY1sxXX0nIG9uIGxpbmUgI3tsaW5lfSAtIGlnbm9yaW5nIGl0IikKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFkZF90ZXh0KEBzcmMuZ2V0Y2gsIEB0cmVlLCA6dGV4dCkKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGFkZF90ZXh0KEBzcmMucmVzdCwgQHRyZWUsIDp0ZXh0KQorICAgICAgICAgICAgICBAc3JjLnRlcm1pbmF0ZQorICAgICAgICAgICAgICB3YXJuaW5nKCJGb3VuZCBubyBlbmQgdGFnIGZvciAnI3tAdHJlZS52YWx1ZX0nIG9uIGxpbmUgI3tAdHJlZS5vcHRpb25zWzpsb2NhdGlvbl19IC0gYXV0by1jbG9zaW5nIGl0IikgaWYgQHRyZWUudHlwZSA9PSA6aHRtbF9lbGVtZW50CisgICAgICAgICAgICAgIGRvbmUgPSB0cnVlCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIEB0cmVlID0gQHN0YWNrLnBvcAorICAgICAgICBlbmQKKworICAgICAgZW5kCisKKworICAgICAgIyBDb252ZXJ0cyBIVE1MIGVsZW1lbnRzIHRvIG5hdGl2ZSBlbGVtZW50cyBpZiBwb3NzaWJsZS4KKyAgICAgIGNsYXNzIEVsZW1lbnRDb252ZXJ0ZXIKKworICAgICAgICAjIDpzdG9wZG9jOgorCisgICAgICAgIGluY2x1ZGUgQ29uc3RhbnRzCisgICAgICAgIGluY2x1ZGUgOjpLcmFtZG93bjo6VXRpbHM6OkVudGl0aWVzCisKKyAgICAgICAgUkVNT1ZFX1RFWFRfQ0hJTERSRU4gPSAgJXd7aHRtbCBoZWFkIGhncm91cCBvbCB1bCBkbCB0YWJsZSBjb2xncm91cCB0Ym9keSB0aGVhZCB0Zm9vdCB0ciBzZWxlY3Qgb3B0Z3JvdXB9CisgICAgICAgIFdSQVBfVEVYVF9DSElMRFJFTiA9ICV3e2JvZHkgc2VjdGlvbiBuYXYgYXJ0aWNsZSBhc2lkZSBoZWFkZXIgZm9vdGVyIGFkZHJlc3MgZGl2IGxpIGRkIGJsb2NrcXVvdGUgZmlndXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24gZmllbGRzZXQgZm9ybX0KKyAgICAgICAgUkVNT1ZFX1dISVRFU1BBQ0VfQ0hJTERSRU4gPSAld3tib2R5IHNlY3Rpb24gbmF2IGFydGljbGUgYXNpZGUgaGVhZGVyIGZvb3RlciBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2IGxpIGRkIGJsb2NrcXVvdGUgZmlndXJlIGZpZ2NhcHRpb24gdGQgdGggZmllbGRzZXQgZm9ybX0KKyAgICAgICAgU1RSSVBfV0hJVEVTUEFDRSA9ICV3e2FkZHJlc3MgYXJ0aWNsZSBhc2lkZSBibG9ja3F1b3RlIGJvZHkgY2FwdGlvbiBkZCBkaXYgZGwgZHQgZmllbGRzZXQgZmlnY2FwdGlvbiBmb3JtIGZvb3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyIGgxIGgyIGgzIGg0IGg1IGg2IGxlZ2VuZCBsaSBuYXYgcCBzZWN0aW9uIHRkIHRofQorICAgICAgICBTSU1QTEVfRUxFTUVOVFMgPSAld3tlbSBzdHJvbmcgYmxvY2txdW90ZSBociBiciBpbWcgcCB0aGVhZCB0Ym9keSB0Zm9vdCB0ciB0ZCB0aCB1bCBvbCBkbCBsaSBkbCBkdCBkZH0KKworICAgICAgICBkZWYgaW5pdGlhbGl6ZShyb290KQorICAgICAgICAgIEByb290ID0gcm9vdAorICAgICAgICBlbmQKKworICAgICAgICBkZWYgc2VsZi5jb252ZXJ0KHJvb3QsIGVsID0gcm9vdCkKKyAgICAgICAgICBuZXcocm9vdCkucHJvY2VzcyhlbCkKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBDb252ZXJ0IHRoZSBlbGVtZW50ICtlbCsgYW5kIGl0cyBjaGlsZHJlbi4KKyAgICAgICAgZGVmIHByb2Nlc3MoZWwsIGRvX2NvbnZlcnNpb24gPSB0cnVlLCBwcmVzZXJ2ZV90ZXh0ID0gZmFsc2UsIHBhcmVudCA9IG5pbCkKKyAgICAgICAgICBjYXNlIGVsLnR5cGUKKyAgICAgICAgICB3aGVuIDp4bWxfY29tbWVudCwgOnhtbF9waQorICAgICAgICAgICAgcHR5cGUgPSBpZiBwYXJlbnQubmlsPworICAgICAgICAgICAgICAgICAgICAgICdkaXYnCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIHBhcmVudC50eXBlCisgICAgICAgICAgICAgICAgICAgICAgd2hlbiA6aHRtbF9lbGVtZW50IHRoZW4gcGFyZW50LnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgd2hlbiA6Y29kZV9zcGFuIHRoZW4gJ2NvZGUnCisgICAgICAgICAgICAgICAgICAgICAgd2hlbiA6Y29kZV9ibG9jayB0aGVuICdwcmUnCisgICAgICAgICAgICAgICAgICAgICAgd2hlbiA6aGVhZGVyIHRoZW4gJ2gxJworICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcGFyZW50LnR5cGUudG9fcworICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVsLm9wdGlvbnMucmVwbGFjZSh7OmNhdGVnb3J5ID0+IChIVE1MX0NPTlRFTlRfTU9ERUxbcHR5cGVdID09IDpzcGFuID8gOnNwYW4gOiA6YmxvY2spfSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgIHdoZW4gOmh0bWxfZWxlbWVudAorICAgICAgICAgIHdoZW4gOnJvb3QKKyAgICAgICAgICAgIGVsLmNoaWxkcmVuLmVhY2gge3xjfCBwcm9jZXNzKGMpfQorICAgICAgICAgICAgcmVtb3ZlX3doaXRlc3BhY2VfY2hpbGRyZW4oZWwpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICBlbHNlIHJldHVybgorICAgICAgICAgIGVuZAorCisgICAgICAgICAgbW5hbWUgPSAiY29udmVydF8je2VsLnZhbHVlfSIKKyAgICAgICAgICBpZiBkb19jb252ZXJzaW9uICYmIHNlbGYuY2xhc3MubWV0aG9kX2RlZmluZWQ/KG1uYW1lKQorICAgICAgICAgICAgc2VuZChtbmFtZSwgZWwpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9IGVsLnZhbHVlCisgICAgICAgICAgICByZW1vdmVfdGV4dF9jaGlsZHJlbihlbCkgaWYgZG9fY29udmVyc2lvbiAmJiBSRU1PVkVfVEVYVF9DSElMRFJFTi5pbmNsdWRlPyh0eXBlKQorCisgICAgICAgICAgICBpZiBkb19jb252ZXJzaW9uICYmIFNJTVBMRV9FTEVNRU5UUy5pbmNsdWRlPyh0eXBlKQorICAgICAgICAgICAgICBzZXRfYmFzaWNzKGVsLCB0eXBlLmludGVybikKKyAgICAgICAgICAgICAgcHJvY2Vzc19jaGlsZHJlbihlbCwgZG9fY29udmVyc2lvbiwgcHJlc2VydmVfdGV4dCkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJvY2Vzc19odG1sX2VsZW1lbnQoZWwsIGRvX2NvbnZlcnNpb24sIHByZXNlcnZlX3RleHQpCisgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgaWYgZG9fY29udmVyc2lvbgorICAgICAgICAgICAgICBzdHJpcF93aGl0ZXNwYWNlKGVsKSBpZiBTVFJJUF9XSElURVNQQUNFLmluY2x1ZGU/KHR5cGUpCisgICAgICAgICAgICAgIHJlbW92ZV93aGl0ZXNwYWNlX2NoaWxkcmVuKGVsKSBpZiBSRU1PVkVfV0hJVEVTUEFDRV9DSElMRFJFTi5pbmNsdWRlPyh0eXBlKQorICAgICAgICAgICAgICB3cmFwX3RleHRfY2hpbGRyZW4oZWwpIGlmIFdSQVBfVEVYVF9DSElMRFJFTi5pbmNsdWRlPyh0eXBlKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBwcm9jZXNzX2NoaWxkcmVuKGVsLCBkb19jb252ZXJzaW9uID0gdHJ1ZSwgcHJlc2VydmVfdGV4dCA9IGZhbHNlKQorICAgICAgICAgIGVsLmNoaWxkcmVuLm1hcCEgZG8gfGN8CisgICAgICAgICAgICBpZiBjLnR5cGUgPT0gOnRleHQKKyAgICAgICAgICAgICAgcHJvY2Vzc190ZXh0KGMudmFsdWUsIHByZXNlcnZlX3RleHQgfHwgIWRvX2NvbnZlcnNpb24pCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByb2Nlc3MoYywgZG9fY29udmVyc2lvbiwgcHJlc2VydmVfdGV4dCwgZWwpCisgICAgICAgICAgICAgIGMKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZC5mbGF0dGVuIQorICAgICAgICBlbmQKKworICAgICAgICAjIFByb2Nlc3MgdGhlIEhUTUwgdGV4dCArcmF3KzogY29tcHJlc3Mgd2hpdGVzcGFjZSAoaWYgK3ByZXNlcnZlKyBpcyArZmFsc2UrKSBhbmQgY29udmVydAorICAgICAgICAjIGVudGl0aWVzIGluIGVudGl0eSBlbGVtZW50cy4KKyAgICAgICAgZGVmIHByb2Nlc3NfdGV4dChyYXcsIHByZXNlcnZlID0gZmFsc2UpCisgICAgICAgICAgcmF3LmdzdWIhKC9ccysvLCAnICcpIHVubGVzcyBwcmVzZXJ2ZQorICAgICAgICAgIHNyYyA9IEtyYW1kb3duOjpVdGlsczo6U3RyaW5nU2Nhbm5lci5uZXcocmF3KQorICAgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgICAgd2hpbGUgIXNyYy5lb3M/CisgICAgICAgICAgICBpZiB0bXAgPSBzcmMuc2Nhbl91bnRpbCgvKD89I3tIVE1MX0VOVElUWV9SRX0pLykKKyAgICAgICAgICAgICAgcmVzdWx0IDw8IEVsZW1lbnQubmV3KDp0ZXh0LCB0bXApCisgICAgICAgICAgICAgIHNyYy5zY2FuKEhUTUxfRU5USVRZX1JFKQorICAgICAgICAgICAgICB2YWwgPSBzcmNbMV0gfHwgKHNyY1syXSAmJiBzcmNbMl0udG9faSkgfHwgc3JjWzNdLmhleAorICAgICAgICAgICAgICByZXN1bHQgPDwgaWYgJXd7bHNxdW8gcnNxdW8gbGRxdW8gcmRxdW99LmluY2x1ZGU/KHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5uZXcoOnNtYXJ0X3F1b3RlLCB2YWwuaW50ZXJuKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgJXd7bWRhc2ggbmRhc2ggaGVsbGlwIGxhcXVvIHJhcXVvfS5pbmNsdWRlPyh2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQubmV3KDp0eXBvZ3JhcGhpY19zeW0sIHZhbC5pbnRlcm4pCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5uZXcoOmVudGl0eSwgZW50aXR5KHZhbCksIG5pbCwgOm9yaWdpbmFsID0+IHNyYy5tYXRjaGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXNjdWUgOjpLcmFtZG93bjo6RXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMucG9zIC09IHNyYy5tYXRjaGVkX3NpemUgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5uZXcoOmVudGl0eSwgOjpLcmFtZG93bjo6VXRpbHM6OkVudGl0aWVzLmVudGl0eSgnYW1wJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJlc3VsdCA8PCBFbGVtZW50Lm5ldyg6dGV4dCwgc3JjLnJlc3QpCisgICAgICAgICAgICAgIHNyYy50ZXJtaW5hdGUKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICAgIHJlc3VsdAorICAgICAgICBlbmQKKworICAgICAgICBkZWYgcHJvY2Vzc19odG1sX2VsZW1lbnQoZWwsIGRvX2NvbnZlcnNpb24gPSB0cnVlLCBwcmVzZXJ2ZV90ZXh0ID0gZmFsc2UpCisgICAgICAgICAgZWwub3B0aW9ucy5yZXBsYWNlKDpjYXRlZ29yeSA9PiBIVE1MX1NQQU5fRUxFTUVOVFMuaW5jbHVkZT8oZWwudmFsdWUpID8gOnNwYW4gOiA6YmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb250ZW50X21vZGVsID0+IChkb19jb252ZXJzaW9uID8gSFRNTF9DT05URU5UX01PREVMW2VsLnZhbHVlXSA6IDpyYXcpKQorICAgICAgICAgIHByb2Nlc3NfY2hpbGRyZW4oZWwsIGRvX2NvbnZlcnNpb24sIHByZXNlcnZlX3RleHQpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiByZW1vdmVfdGV4dF9jaGlsZHJlbihlbCkKKyAgICAgICAgICBlbC5jaGlsZHJlbi5kZWxldGVfaWYge3xjfCBjLnR5cGUgPT0gOnRleHR9CisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiB3cmFwX3RleHRfY2hpbGRyZW4oZWwpCisgICAgICAgICAgdG1wID0gW10KKyAgICAgICAgICBsYXN0X2lzX3AgPSBmYWxzZQorICAgICAgICAgIGVsLmNoaWxkcmVuLmVhY2ggZG8gfGN8CisgICAgICAgICAgICBpZiBFbGVtZW50LmNhdGVnb3J5KGMpICE9IDpibG9jayB8fCBjLnR5cGUgPT0gOnRleHQKKyAgICAgICAgICAgICAgaWYgIWxhc3RfaXNfcAorICAgICAgICAgICAgICAgIHRtcCA8PCBFbGVtZW50Lm5ldyg6cCwgbmlsLCBuaWwsIDp0cmFuc3BhcmVudCA9PiB0cnVlKQorICAgICAgICAgICAgICAgIGxhc3RfaXNfcCA9IHRydWUKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgIHRtcC5sYXN0LmNoaWxkcmVuIDw8IGMKKyAgICAgICAgICAgICAgdG1wCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRtcCA8PCBjCisgICAgICAgICAgICAgIGxhc3RfaXNfcCA9IGZhbHNlCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBlbC5jaGlsZHJlbiA9IHRtcAorICAgICAgICBlbmQKKworICAgICAgICBkZWYgc3RyaXBfd2hpdGVzcGFjZShlbCkKKyAgICAgICAgICByZXR1cm4gaWYgZWwuY2hpbGRyZW4uZW1wdHk/CisgICAgICAgICAgaWYgZWwuY2hpbGRyZW4uZmlyc3QudHlwZSA9PSA6dGV4dAorICAgICAgICAgICAgZWwuY2hpbGRyZW4uZmlyc3QudmFsdWUubHN0cmlwIQorICAgICAgICAgIGVuZAorICAgICAgICAgIGlmIGVsLmNoaWxkcmVuLmxhc3QudHlwZSA9PSA6dGV4dAorICAgICAgICAgICAgZWwuY2hpbGRyZW4ubGFzdC52YWx1ZS5yc3RyaXAhCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiByZW1vdmVfd2hpdGVzcGFjZV9jaGlsZHJlbihlbCkKKyAgICAgICAgICBpID0gLTEKKyAgICAgICAgICBlbC5jaGlsZHJlbiA9IGVsLmNoaWxkcmVuLnJlamVjdCBkbyB8Y3wKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgYy50eXBlID09IDp0ZXh0ICYmIGMudmFsdWUuc3RyaXAuZW1wdHk/ICYmCisgICAgICAgICAgICAgIChpID09IDAgfHwgaSA9PSBlbC5jaGlsZHJlbi5sZW5ndGggLSAxIHx8IChFbGVtZW50LmNhdGVnb3J5KGVsLmNoaWxkcmVuW2ktMV0pID09IDpibG9jayAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5jYXRlZ29yeShlbC5jaGlsZHJlbltpKzFdKSA9PSA6YmxvY2spKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBkZWYgc2V0X2Jhc2ljcyhlbCwgdHlwZSwgb3B0cyA9IHt9KQorICAgICAgICAgIGVsLnR5cGUgPSB0eXBlCisgICAgICAgICAgZWwub3B0aW9ucy5yZXBsYWNlKG9wdHMpCisgICAgICAgICAgZWwudmFsdWUgPSBuaWwKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIGV4dHJhY3RfdGV4dChlbCwgcmF3KQorICAgICAgICAgIHJhdyA8PCBlbC52YWx1ZS50b19zIGlmIGVsLnR5cGUgPT0gOnRleHQKKyAgICAgICAgICBlbC5jaGlsZHJlbi5lYWNoIHt8Y3wgZXh0cmFjdF90ZXh0KGMsIHJhdyl9CisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBjb252ZXJ0X3RleHRhcmVhKGVsKQorICAgICAgICAgIHByb2Nlc3NfaHRtbF9lbGVtZW50KGVsLCB0cnVlLCB0cnVlKQorICAgICAgICBlbmQKKworICAgICAgICBkZWYgY29udmVydF9hKGVsKQorICAgICAgICAgIGlmIGVsLmF0dHJbJ2hyZWYnXQorICAgICAgICAgICAgc2V0X2Jhc2ljcyhlbCwgOmEpCisgICAgICAgICAgICBwcm9jZXNzX2NoaWxkcmVuKGVsKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByb2Nlc3NfaHRtbF9lbGVtZW50KGVsLCBmYWxzZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgRU1QSEFTSVNfVFlQRV9NQVAgPSB7J2VtJyA9PiA6ZW0sICdpJyA9PiA6ZW0sICdzdHJvbmcnID0+IDpzdHJvbmcsICdiJyA9PiA6c3Ryb25nfQorICAgICAgICBkZWYgY29udmVydF9lbShlbCkKKyAgICAgICAgICB0ZXh0ID0gJycKKyAgICAgICAgICBleHRyYWN0X3RleHQoZWwsIHRleHQpCisgICAgICAgICAgaWYgdGV4dCA9fiAvXEFccy8gfHwgdGV4dCA9fiAvXHNcei8KKyAgICAgICAgICAgIHByb2Nlc3NfaHRtbF9lbGVtZW50KGVsLCBmYWxzZSkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRfYmFzaWNzKGVsLCBFTVBIQVNJU19UWVBFX01BUFtlbC52YWx1ZV0pCisgICAgICAgICAgICBwcm9jZXNzX2NoaWxkcmVuKGVsKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgJXd7YiBzdHJvbmcgaX0uZWFjaCBkbyB8aXwKKyAgICAgICAgICBhbGlhc19tZXRob2QoImNvbnZlcnRfI3tpfSIudG9fc3ltLCA6Y29udmVydF9lbSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIGNvbnZlcnRfaDEoZWwpCisgICAgICAgICAgc2V0X2Jhc2ljcyhlbCwgOmhlYWRlciwgOmxldmVsID0+IGVsLnZhbHVlWzEuLjFdLnRvX2kpCisgICAgICAgICAgZXh0cmFjdF90ZXh0KGVsLCBlbC5vcHRpb25zWzpyYXdfdGV4dF0gPSAnJykKKyAgICAgICAgICBwcm9jZXNzX2NoaWxkcmVuKGVsKQorICAgICAgICBlbmQKKyAgICAgICAgJXd7aDIgaDMgaDQgaDUgaDZ9LmVhY2ggZG8gfGl8CisgICAgICAgICAgYWxpYXNfbWV0aG9kKCJjb252ZXJ0XyN7aX0iLnRvX3N5bSwgOmNvbnZlcnRfaDEpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBjb252ZXJ0X2NvZGUoZWwpCisgICAgICAgICAgcmF3ID0gJycKKyAgICAgICAgICBleHRyYWN0X3RleHQoZWwsIHJhdykKKyAgICAgICAgICByZXN1bHQgPSBwcm9jZXNzX3RleHQocmF3LCB0cnVlKQorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBzdHIgPSByZXN1bHQuaW5qZWN0KCcnKSBkbyB8bWVtLCBjfAorICAgICAgICAgICAgICBpZiBjLnR5cGUgPT0gOnRleHQKKyAgICAgICAgICAgICAgICBtZW0gPDwgYy52YWx1ZQorICAgICAgICAgICAgICBlbHNpZiBjLnR5cGUgPT0gOmVudGl0eQorICAgICAgICAgICAgICAgIGlmIFs2MCwgNjIsIDM0LCAzOF0uaW5jbHVkZT8oYy52YWx1ZS5jb2RlX3BvaW50KQorICAgICAgICAgICAgICAgICAgbWVtIDw8IGMudmFsdWUuY29kZV9wb2ludC5jaHIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBtZW0gPDwgYy52YWx1ZS5jaGFyCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgIGVsc2lmIGMudHlwZSA9PSA6c21hcnRfcXVvdGUgfHwgYy50eXBlID09IDp0eXBvZ3JhcGhpY19zeW0KKyAgICAgICAgICAgICAgICBtZW0gPDwgZW50aXR5KGMudmFsdWUudG9fcykuY2hhcgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2UgIkJ1ZyAtIHBsZWFzZSByZXBvcnQiCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICByZXN1bHQuY2xlYXIKKyAgICAgICAgICAgIHJlc3VsdCA8PCBFbGVtZW50Lm5ldyg6dGV4dCwgc3RyKQorICAgICAgICAgIHJlc2N1ZQorICAgICAgICAgIGVuZAorICAgICAgICAgIGlmIHJlc3VsdC5sZW5ndGggPiAxIHx8IHJlc3VsdC5maXJzdC50eXBlICE9IDp0ZXh0CisgICAgICAgICAgICBwcm9jZXNzX2h0bWxfZWxlbWVudChlbCwgZmFsc2UsIHRydWUpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgZWwudmFsdWUgPT0gJ2NvZGUnCisgICAgICAgICAgICAgIHNldF9iYXNpY3MoZWwsIDpjb2Rlc3BhbikKKyAgICAgICAgICAgICAgZWwuYXR0clsnY2xhc3MnXS5nc3ViISgvXHMrXGJoaWdobGlnaHRlci1cdytcYnxcYmhpZ2hsaWdodGVyLVx3K1xiXHMqLywgJycpIGlmIGVsLmF0dHJbJ2NsYXNzJ10KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgc2V0X2Jhc2ljcyhlbCwgOmNvZGVibG9jaykKKyAgICAgICAgICAgICAgaWYgZWwuY2hpbGRyZW4uc2l6ZSA9PSAxICYmIGVsLmNoaWxkcmVuLmZpcnN0LnZhbHVlID09ICdjb2RlJworICAgICAgICAgICAgICAgIHZhbHVlID0gKGVsLmNoaWxkcmVuLmZpcnN0LmF0dHJbJ2NsYXNzJ10gfHwgJycpLnNjYW4oL1xibGFuZ3VhZ2UtXFMrLykuZmlyc3QKKyAgICAgICAgICAgICAgICBlbC5hdHRyWydjbGFzcyddID0gIiN7dmFsdWV9ICN7ZWwuYXR0clsnY2xhc3MnXX0iLnJzdHJpcCBpZiB2YWx1ZQorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZWwudmFsdWUgPSByZXN1bHQuZmlyc3QudmFsdWUKKyAgICAgICAgICAgIGVsLmNoaWxkcmVuLmNsZWFyCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBhbGlhcyA6Y29udmVydF9wcmUgOmNvbnZlcnRfY29kZQorCisgICAgICAgIGRlZiBjb252ZXJ0X3RhYmxlKGVsKQorICAgICAgICAgIGlmICFpc19zaW1wbGVfdGFibGU/KGVsKQorICAgICAgICAgICAgcHJvY2Vzc19odG1sX2VsZW1lbnQoZWwsIGZhbHNlKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgZW5kCisgICAgICAgICAgcmVtb3ZlX3RleHRfY2hpbGRyZW4oZWwpCisgICAgICAgICAgcHJvY2Vzc19jaGlsZHJlbihlbCkKKyAgICAgICAgICBzZXRfYmFzaWNzKGVsLCA6dGFibGUpCisKKyAgICAgICAgICBjYWxjX2FsaWdubWVudCA9IGxhbWJkYSBkbyB8Y3wKKyAgICAgICAgICAgIGlmIGMudHlwZSA9PSA6dHIKKyAgICAgICAgICAgICAgZWwub3B0aW9uc1s6YWxpZ25tZW50XSA9IGMuY2hpbGRyZW4ubWFwIGRvIHx0ZHwKKyAgICAgICAgICAgICAgICBpZiB0ZC5hdHRyWydzdHlsZSddCisgICAgICAgICAgICAgICAgICB0ZC5hdHRyWydzdHlsZSddLnNsaWNlISgvKD86O1xzKik/dGV4dC1hbGlnbjpccysoY2VudGVyfGxlZnR8cmlnaHQpLykKKyAgICAgICAgICAgICAgICAgIHRkLmF0dHIuZGVsZXRlKCdzdHlsZScpIGlmIHRkLmF0dHJbJ3N0eWxlJ10uc3RyaXAuZW1wdHk/CisgICAgICAgICAgICAgICAgICAkMSA/ICQxLnRvX3N5bSA6IDpkZWZhdWx0CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgOmRlZmF1bHQKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGMuY2hpbGRyZW4uZWFjaCB7fGNjfCBjYWxjX2FsaWdubWVudC5jYWxsKGNjKX0KKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICAgIGNhbGNfYWxpZ25tZW50LmNhbGwoZWwpCisgICAgICAgICAgZWwuY2hpbGRyZW4uZGVsZXRlX2lmIHt8Y3wgYy50eXBlID09IDpodG1sX2VsZW1lbnR9CisKKyAgICAgICAgICBjaGFuZ2VfdGhfdHlwZSA9IGxhbWJkYSBkbyB8Y3wKKyAgICAgICAgICAgIGlmIGMudHlwZSA9PSA6dGgKKyAgICAgICAgICAgICAgYy50eXBlID0gOnRkCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGMuY2hpbGRyZW4uZWFjaCB7fGNjfCBjaGFuZ2VfdGhfdHlwZS5jYWxsKGNjKX0KKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICAgIGNoYW5nZV90aF90eXBlLmNhbGwoZWwpCisKKyAgICAgICAgICBpZiBlbC5jaGlsZHJlbi5maXJzdC50eXBlID09IDp0cgorICAgICAgICAgICAgdGJvZHkgPSBFbGVtZW50Lm5ldyg6dGJvZHkpCisgICAgICAgICAgICB0Ym9keS5jaGlsZHJlbiA9IGVsLmNoaWxkcmVuCisgICAgICAgICAgICBlbC5jaGlsZHJlbiA9IFt0Ym9keV0KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIGlzX3NpbXBsZV90YWJsZT8oZWwpCisgICAgICAgICAgb25seV9waHJhc2luZ19jb250ZW50ID0gbGFtYmRhIGRvIHxjfAorICAgICAgICAgICAgYy5jaGlsZHJlbi5hbGw/IGRvIHxjY3wKKyAgICAgICAgICAgICAgKGNjLnR5cGUgPT0gOnRleHQgfHwgIUhUTUxfQkxPQ0tfRUxFTUVOVFMuaW5jbHVkZT8oY2MudmFsdWUpKSAmJiBvbmx5X3BocmFzaW5nX2NvbnRlbnQuY2FsbChjYykKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICAgIGNoZWNrX2NlbGxzID0gUHJvYy5uZXcgZG8gfGN8CisgICAgICAgICAgICBpZiBjLnZhbHVlID09ICd0aCcgfHwgYy52YWx1ZSA9PSAndGQnCisgICAgICAgICAgICAgIHJldHVybiBmYWxzZSBpZiAhb25seV9waHJhc2luZ19jb250ZW50LmNhbGwoYykKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYy5jaGlsZHJlbi5lYWNoIHt8Y2N8IGNoZWNrX2NlbGxzLmNhbGwoY2MpfQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgICAgY2hlY2tfY2VsbHMuY2FsbChlbCkKKworICAgICAgICAgIG5yX2NlbGxzID0gMAorICAgICAgICAgIGNoZWNrX25yX2NlbGxzID0gbGFtYmRhIGRvIHx0fAorICAgICAgICAgICAgaWYgdC52YWx1ZSA9PSAndHInCisgICAgICAgICAgICAgIGNvdW50ID0gdC5jaGlsZHJlbi5zZWxlY3Qge3xjY3wgY2MudmFsdWUgPT0gJ3RoJyB8fCBjYy52YWx1ZSA9PSAndGQnfS5sZW5ndGgKKyAgICAgICAgICAgICAgaWYgY291bnQgIT0gbnJfY2VsbHMKKyAgICAgICAgICAgICAgICBpZiBucl9jZWxscyA9PSAwCisgICAgICAgICAgICAgICAgICBucl9jZWxscyA9IGNvdW50CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgbnJfY2VsbHMgPSAtMQorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHQuY2hpbGRyZW4uZWFjaCB7fGNjfCBjaGVja19ucl9jZWxscy5jYWxsKGNjKX0KKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICAgIGNoZWNrX25yX2NlbGxzLmNhbGwoZWwpCisgICAgICAgICAgcmV0dXJuIGZhbHNlIGlmIG5yX2NlbGxzID09IC0xCisKKyAgICAgICAgICBhbGlnbm1lbnQgPSBuaWwKKyAgICAgICAgICBjaGVja19hbGlnbm1lbnQgPSBQcm9jLm5ldyBkbyB8dHwKKyAgICAgICAgICAgIGlmIHQudmFsdWUgPT0gJ3RyJworICAgICAgICAgICAgICBjdXJfYWxpZ25tZW50ID0gdC5jaGlsZHJlbi5zZWxlY3Qge3xjY3wgY2MudmFsdWUgPT0gJ3RoJyB8fCBjYy52YWx1ZSA9PSAndGQnfS5tYXAgZG8gfGNlbGx8CisgICAgICAgICAgICAgICAgbWQgPSAvdGV4dC1hbGlnbjpccysoY2VudGVyfGxlZnR8cmlnaHR8anVzdGlmeXxpbmhlcml0KS8ubWF0Y2goY2VsbC5hdHRyWydzdHlsZSddLnRvX3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlIGlmIG1kICYmIChtZFsxXSA9PSAnanVzdGlmeScgfHwgbWRbMV0gPT0gJ2luaGVyaXQnKQorICAgICAgICAgICAgICAgIG1kLm5pbD8gPyA6ZGVmYXVsdCA6IG1kWzFdCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBjdXJfYWxpZ25tZW50IGlmIGFsaWdubWVudC5uaWw/CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZSBpZiBhbGlnbm1lbnQgIT0gY3VyX2FsaWdubWVudAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0LmNoaWxkcmVuLmVhY2gge3xjY3wgY2hlY2tfYWxpZ25tZW50LmNhbGwoY2MpfQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgICAgY2hlY2tfYWxpZ25tZW50LmNhbGwoZWwpCisKKyAgICAgICAgICBjaGVja19yb3dzID0gbGFtYmRhIGRvIHx0LCB0eXBlfAorICAgICAgICAgICAgdC5jaGlsZHJlbi5hbGw/IHt8cnwgKHIudmFsdWUgPT0gJ3RyJyB8fCByLnR5cGUgPT0gOnRleHQpICYmIHIuY2hpbGRyZW4uYWxsPyB7fGN8IGMudmFsdWUgPT0gdHlwZSB8fCBjLnR5cGUgPT0gOnRleHR9fQorICAgICAgICAgIGVuZAorICAgICAgICAgIGNoZWNrX3Jvd3MuY2FsbChlbCwgJ3RkJykgfHwKKyAgICAgICAgICAgIChlbC5jaGlsZHJlbi5hbGw/IGRvIHx0fAorICAgICAgICAgICAgICAgdC50eXBlID09IDp0ZXh0IHx8ICh0LnZhbHVlID09ICd0aGVhZCcgJiYgY2hlY2tfcm93cy5jYWxsKHQsICd0aCcpKSB8fAorICAgICAgICAgICAgICAgICAoKHQudmFsdWUgPT0gJ3Rmb290JyB8fCB0LnZhbHVlID09ICd0Ym9keScpICYmIGNoZWNrX3Jvd3MuY2FsbCh0LCAndGQnKSkKKyAgICAgICAgICAgICBlbmQgJiYgZWwuY2hpbGRyZW4uYW55PyB7fHR8IHQudmFsdWUgPT0gJ3Rib2R5J30pCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBjb252ZXJ0X3NjcmlwdChlbCkKKyAgICAgICAgICBpZiAhaXNfbWF0aF90YWc/KGVsKQorICAgICAgICAgICAgcHJvY2Vzc19odG1sX2VsZW1lbnQoZWwpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgaGFuZGxlX21hdGhfdGFnKGVsKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBkZWYgaXNfbWF0aF90YWc/KGVsKQorICAgICAgICAgIGVsLmF0dHJbJ3R5cGUnXS50b19zID1+IC9cYm1hdGhcL3RleFxiLworICAgICAgICBlbmQKKworICAgICAgICBkZWYgaGFuZGxlX21hdGhfdGFnKGVsKQorICAgICAgICAgIHNldF9iYXNpY3MoZWwsIDptYXRoLCA6Y2F0ZWdvcnkgPT4gKGVsLmF0dHJbJ3R5cGUnXSA9fiAvbW9kZT1kaXNwbGF5LyA/IDpibG9jayA6IDpzcGFuKSkKKyAgICAgICAgICBlbC52YWx1ZSA9IGVsLmNoaWxkcmVuLnNoaWZ0LnZhbHVlLnN1YigvXEEoPzolXHMqKT88IVxbQ0RBVEFcW1xuPyguKj8pKD86XHMlKT9cXVxdPlx6L20sICdcMScpCisgICAgICAgICAgZWwuYXR0ci5kZWxldGUoJ3R5cGUnKQorICAgICAgICBlbmQKKworICAgICAgZW5kCisKKyAgICAgIGluY2x1ZGUgUGFyc2VyCisKKyAgICAgICMgUGFyc2UgdGhlIHNvdXJjZSBzdHJpbmcgcHJvdmlkZWQgb24gaW5pdGlhbGl6YXRpb24gYXMgSFRNTCBkb2N1bWVudC4KKyAgICAgIGRlZiBwYXJzZQorICAgICAgICBAc3RhY2ssIEB0cmVlID0gW10sIEByb290CisgICAgICAgIEBzcmMgPSBLcmFtZG93bjo6VXRpbHM6OlN0cmluZ1NjYW5uZXIubmV3KGFkYXB0X3NvdXJjZShzb3VyY2UpKQorCisgICAgICAgIHdoaWxlIHRydWUKKyAgICAgICAgICBpZiByZXN1bHQgPSBAc3JjLnNjYW4oL1xzKiN7SFRNTF9JTlNUUlVDVElPTl9SRX0vKQorICAgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgRWxlbWVudC5uZXcoOnhtbF9waSwgcmVzdWx0LnN0cmlwLCBuaWwsIDpjYXRlZ29yeSA9PiA6YmxvY2spCisgICAgICAgICAgZWxzaWYgcmVzdWx0ID0gQHNyYy5zY2FuKC9ccyoje0hUTUxfRE9DVFlQRV9SRX0vKQorICAgICAgICAgICAgIyBpZ25vcmUgdGhlIGRvY3R5cGUKKyAgICAgICAgICBlbHNpZiByZXN1bHQgPSBAc3JjLnNjYW4oL1xzKiN7SFRNTF9DT01NRU5UX1JFfS8pCisgICAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6eG1sX2NvbW1lbnQsIHJlc3VsdC5zdHJpcCwgbmlsLCA6Y2F0ZWdvcnkgPT4gOmJsb2NrKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHRhZ19oYW5kbGVyID0gbGFtYmRhIGRvIHxjLCBjbG9zZWQsIGhhbmRsZV9ib2R5fAorICAgICAgICAgIHBhcnNlX3Jhd19odG1sKGMsICZ0YWdfaGFuZGxlcikgaWYgIWNsb3NlZCAmJiBoYW5kbGVfYm9keQorICAgICAgICBlbmQKKyAgICAgICAgcGFyc2VfcmF3X2h0bWwoQHRyZWUsICZ0YWdfaGFuZGxlcikKKworICAgICAgICBFbGVtZW50Q29udmVydGVyLmNvbnZlcnQoQHRyZWUpCisgICAgICBlbmQKKworICAgIGVuZAorCisgIGVuZAorCitlbmQKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjY4ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24ucmIKQEAgLTAsMCArMSwzNjggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAnc3Ryc2NhbicKK3JlcXVpcmUgJ3N0cmluZ2lvJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyJworCisjVE9ETzogdXNlIFtbOmFscGhhOl1dIGluIGFsbCByZWdleHAgdG8gYWxsb3cgcGFyc2luZyBvZiBpbnRlcm5hdGlvbmFsIHZhbHVlcyBpbiAxLjkuMQorI05PVEU6IHVzZSBAc3JjLnByZV9tYXRjaCBvbmx5IGJlZm9yZSBvdGhlciBjaGVjay9tYXRjaD8vLi4uIG9wZXJhdGlvbnMsIG90aGVyd2lzZSB0aGUgY29udGVudCBpcyBjaGFuZ2VkCisKK21vZHVsZSBLcmFtZG93bgorCisgIG1vZHVsZSBQYXJzZXIKKworICAgICMgVXNlZCBmb3IgcGFyc2luZyBhIGRvY3VtZW50IGluIGtyYW1kb3duIGZvcm1hdC4KKyAgICAjCisgICAgIyBJZiB5b3Ugd2FudCB0byBleHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHBhcnNlciwgeW91IG5lZWQgdG8gZG8gdGhlIGZvbGxvd2luZzoKKyAgICAjCisgICAgIyAqIENyZWF0ZSBhIG5ldyBzdWJjbGFzcworICAgICMgKiBhZGQgdGhlIG5lZWRlZCBwYXJzZXIgbWV0aG9kcworICAgICMgKiBtb2RpZnkgdGhlIEBibG9ja19wYXJzZXJzIGFuZCBAc3Bhbl9wYXJzZXJzIHZhcmlhYmxlcyBhbmQgYWRkIHRoZSBuYW1lcyBvZiB5b3VyIHBhcnNlcgorICAgICMgICBtZXRob2RzCisgICAgIworICAgICMgSGVyZSBpcyBhIHNtYWxsIGV4YW1wbGUgZm9yIGFuIGV4dGVuZGVkIHBhcnNlciBjbGFzcyB0aGF0IHBhcnNlcyBFUkIgc3R5bGUgdGFncyBhcyByYXcgdGV4dCBpZgorICAgICMgdGhleSBhcmUgdXNlZCBhcyBzcGFuLWxldmVsIGVsZW1lbnRzIChhbiBlcXVpdmFsZW50IGJsb2NrLWxldmVsIHBhcnNlciBzaG91bGQgcHJvYmFibHkgYWxzbyBiZQorICAgICMgbWFkZSB0byBoYW5kbGUgdGhlIGJsb2NrIGNhc2UpOgorICAgICMKKyAgICAjICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duJworICAgICMKKyAgICAjICAgY2xhc3MgS3JhbWRvd246OlBhcnNlcjo6RVJCS3JhbWRvd24gPCBLcmFtZG93bjo6UGFyc2VyOjpLcmFtZG93bgorICAgICMKKyAgICAjICAgICAgZGVmIGluaXRpYWxpemUoc291cmNlLCBvcHRpb25zKQorICAgICMgICAgICAgIHN1cGVyCisgICAgIyAgICAgICAgQHNwYW5fcGFyc2Vycy51bnNoaWZ0KDplcmJfdGFncykKKyAgICAjICAgICAgZW5kCisgICAgIworICAgICMgICAgICBFUkJfVEFHU19TVEFSVCA9IC88JS4qPyU+LworICAgICMKKyAgICAjICAgICAgZGVmIHBhcnNlX2VyYl90YWdzCisgICAgIyAgICAgICAgQHNyYy5wb3MgKz0gQHNyYy5tYXRjaGVkX3NpemUKKyAgICAjICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6cmF3LCBAc3JjLm1hdGNoZWQpCisgICAgIyAgICAgIGVuZAorICAgICMgICAgICBkZWZpbmVfcGFyc2VyKDplcmJfdGFncywgRVJCX1RBR1NfU1RBUlQsICc8JScpCisgICAgIworICAgICMgICBlbmQKKyAgICAjCisgICAgIyBUaGUgbmV3IHBhcnNlciBjYW4gYmUgdXNlZCBsaWtlIHRoaXM6CisgICAgIworICAgICMgICByZXF1aXJlICdrcmFtZG93bi9kb2N1bWVudCcKKyAgICAjICAgIyByZXF1aXJlIHRoZSBmaWxlIHdpdGggdGhlIGFib3ZlIHBhcnNlciBjbGFzcworICAgICMKKyAgICAjICAgS3JhbWRvd246OkRvY3VtZW50Lm5ldyhpbnB1dF90ZXh0LCA6aW5wdXQgPT4gJ0VSQktyYW1kb3duJykudG9faHRtbAorICAgICMKKyAgICBjbGFzcyBLcmFtZG93biA8IEJhc2UKKworICAgICAgaW5jbHVkZSA6OktyYW1kb3duCisKKyAgICAgICMgQ3JlYXRlIGEgbmV3IEtyYW1kb3duIHBhcnNlciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gK29wdGlvbnMrLgorICAgICAgZGVmIGluaXRpYWxpemUoc291cmNlLCBvcHRpb25zKQorICAgICAgICBzdXBlcgorCisgICAgICAgIHJlc2V0X2VudgorCisgICAgICAgIEBhbGRzID0ge30KKyAgICAgICAgQGZvb3Rub3RlcyA9IHt9CisgICAgICAgIEBsaW5rX2RlZnMgPSB7fQorICAgICAgICB1cGRhdGVfbGlua19kZWZpbml0aW9ucyhAb3B0aW9uc1s6bGlua19kZWZzXSkKKworICAgICAgICBAYmxvY2tfcGFyc2VycyA9IFs6YmxhbmtfbGluZSwgOmNvZGVibG9jaywgOmNvZGVibG9ja19mZW5jZWQsIDpibG9ja3F1b3RlLCA6YXR4X2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOmhvcml6b250YWxfcnVsZSwgOmxpc3QsIDpkZWZpbml0aW9uX2xpc3QsIDpibG9ja19odG1sLCA6c2V0ZXh0X2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOmJsb2NrX21hdGgsIDp0YWJsZSwgOmZvb3Rub3RlX2RlZmluaXRpb24sIDpsaW5rX2RlZmluaXRpb24sIDphYmJyZXZfZGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOmJsb2NrX2V4dGVuc2lvbnMsIDplb2JfbWFya2VyLCA6cGFyYWdyYXBoXQorICAgICAgICBAc3Bhbl9wYXJzZXJzID0gIFs6ZW1waGFzaXMsIDpjb2Rlc3BhbiwgOmF1dG9saW5rLCA6c3Bhbl9odG1sLCA6Zm9vdG5vdGVfbWFya2VyLCA6bGluaywgOnNtYXJ0X3F1b3RlcywgOmlubGluZV9tYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIDpzcGFuX2V4dGVuc2lvbnMsIDpodG1sX2VudGl0eSwgOnR5cG9ncmFwaGljX3N5bXMsIDpsaW5lX2JyZWFrLCA6ZXNjYXBlZF9jaGFyc10KKworICAgICAgZW5kCisgICAgICBwcml2YXRlX2NsYXNzX21ldGhvZCg6bmV3LCA6YWxsb2NhdGUpCisKKworICAgICAgIyBUaGUgc291cmNlIHN0cmluZyBwcm92aWRlZCBvbiBpbml0aWFsaXphdGlvbiBpcyBwYXJzZWQgaW50byB0aGUgQHJvb3QgZWxlbWVudC4KKyAgICAgIGRlZiBwYXJzZQorICAgICAgICBjb25maWd1cmVfcGFyc2VyCisgICAgICAgIHBhcnNlX2Jsb2NrcyhAcm9vdCwgYWRhcHRfc291cmNlKHNvdXJjZSkpCisgICAgICAgIHVwZGF0ZV90cmVlKEByb290KQorICAgICAgICBjb3JyZWN0X2FiYnJldmlhdGlvbnNfYXR0cmlidXRlcworICAgICAgICByZXBsYWNlX2FiYnJldmlhdGlvbnMoQHJvb3QpCisgICAgICAgIEBmb290bm90ZXMuZWFjaCB7fG5hbWUsZGF0YXwgdXBkYXRlX3RyZWUoZGF0YVs6Y29udGVudF0pfQorICAgICAgICBAZm9vdG5vdGVzLmVhY2ggZG8gfG5hbWUsIGRhdGF8CisgICAgICAgICAgbmV4dCBpZiBkYXRhLmtleT8oOm1hcmtlcikKKyAgICAgICAgICBsaW5lID0gZGF0YVs6Y29udGVudF0ub3B0aW9uc1s6bG9jYXRpb25dCisgICAgICAgICAgd2FybmluZygiRm9vdG5vdGUgZGVmaW5pdGlvbiBmb3IgJyN7bmFtZX0nIG9uIGxpbmUgI3tsaW5lfSBpcyB1bnJlZmVyZW5jZWQgLSBpZ25vcmluZyIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMjIyMjIyMKKyAgICAgIHByb3RlY3RlZAorICAgICAgIyMjIyMjIworCisgICAgICAjIDpkb2M6CisgICAgICAjCisgICAgICAjIFVwZGF0ZSB0aGUgcGFyc2VyIHNwZWNpZmljIGxpbmsgZGVmaW5pdGlvbnMgd2l0aCB0aGUgZGF0YSBmcm9tICtsaW5rX2RlZnMrICh0aGUgdmFsdWUgb2YgdGhlCisgICAgICAjIDpsaW5rX2RlZnMgb3B0aW9uKS4KKyAgICAgICMKKyAgICAgICMgVGhlIHBhcmFtZXRlciArbGlua19kZWZzKyBpcyBhIGhhc2ggd2hlcmUgdGhlIGtleXMgYXJlIHBvc3NpYmx5IHVubm9ybWFsaXplZCBsaW5rIElEcyBhbmQKKyAgICAgICMgdGhlIHZhbHVlcyBhcmUgdHdvIGVsZW1lbnQgYXJyYXlzIGNvbnNpc3Rpbmcgb2YgdGhlIGxpbmsgdGFyZ2V0IGFuZCBhIHRpdGxlIChjYW4gYmUgK25pbCspLgorICAgICAgZGVmIHVwZGF0ZV9saW5rX2RlZmluaXRpb25zKGxpbmtfZGVmcykKKyAgICAgICAgbGlua19kZWZzLmVhY2gge3xrLHZ8IEBsaW5rX2RlZnNbbm9ybWFsaXplX2xpbmtfaWQoayldID0gdn0KKyAgICAgIGVuZAorCisgICAgICAjIEFkYXB0IHRoZSBvYmplY3QgdG8gYWxsb3cgcGFyc2luZyBsaWtlIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy4KKyAgICAgIGRlZiBjb25maWd1cmVfcGFyc2VyCisgICAgICAgIEBwYXJzZXJzID0ge30KKyAgICAgICAgKEBibG9ja19wYXJzZXJzICsgQHNwYW5fcGFyc2VycykuZWFjaCBkbyB8bmFtZXwKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmhhc19wYXJzZXI/KG5hbWUpCisgICAgICAgICAgICBAcGFyc2Vyc1tuYW1lXSA9IHNlbGYuY2xhc3MucGFyc2VyKG5hbWUpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgS3JhbWRvd246OkVycm9yLCAiVW5rbm93biBwYXJzZXI6ICN7bmFtZX0iCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBAc3Bhbl9zdGFydCwgQHNwYW5fc3RhcnRfcmUgPSBzcGFuX3BhcnNlcl9yZWdleHBzCisgICAgICBlbmQKKworICAgICAgIyBDcmVhdGUgdGhlIG5lZWRlZCBzcGFuIHBhcnNlciByZWdleHBzLgorICAgICAgZGVmIHNwYW5fcGFyc2VyX3JlZ2V4cHMocGFyc2VycyA9IEBzcGFuX3BhcnNlcnMpCisgICAgICAgIHNwYW5fc3RhcnQgPSAvI3twYXJzZXJzLm1hcCB7fG5hbWV8IEBwYXJzZXJzW25hbWVdLnNwYW5fc3RhcnR9LmpvaW4oJ3wnKX0vCisgICAgICAgIFtzcGFuX3N0YXJ0LCAvKD89I3tzcGFuX3N0YXJ0fSkvXQorICAgICAgZW5kCisKKyAgICAgICMgUGFyc2UgYWxsIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluICt0ZXh0KyBpbnRvIHRoZSBlbGVtZW50ICtlbCsuCisgICAgICBkZWYgcGFyc2VfYmxvY2tzKGVsLCB0ZXh0ID0gbmlsKQorICAgICAgICBAc3RhY2sucHVzaChbQHRyZWUsIEBzcmMsIEBibG9ja19pYWxdKQorICAgICAgICBAdHJlZSwgQGJsb2NrX2lhbCA9IGVsLCBuaWwKKyAgICAgICAgQHNyYyA9ICh0ZXh0Lm5pbD8gPyBAc3JjIDogOjpLcmFtZG93bjo6VXRpbHM6OlN0cmluZ1NjYW5uZXIubmV3KHRleHQsIGVsLm9wdGlvbnNbOmxvY2F0aW9uXSkpCisKKyAgICAgICAgc3RhdHVzID0gY2F0Y2goOnN0b3BfYmxvY2tfcGFyc2luZykgZG8KKyAgICAgICAgICB3aGlsZSAhQHNyYy5lb3M/CisgICAgICAgICAgICBAYmxvY2tfcGFyc2Vycy5hbnk/IGRvIHxuYW1lfAorICAgICAgICAgICAgICBpZiBAc3JjLmNoZWNrKEBwYXJzZXJzW25hbWVdLnN0YXJ0X3JlKQorICAgICAgICAgICAgICAgIHNlbmQoQHBhcnNlcnNbbmFtZV0ubWV0aG9kKQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmFsc2UKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQgfHwgYmVnaW4KKyAgICAgICAgICAgICAgd2FybmluZygnV2FybmluZzogdGhpcyBzaG91bGQgbm90IG9jY3VyIC0gbm8gYmxvY2sgcGFyc2VyIGhhbmRsZWQgdGhlIGxpbmUnKQorICAgICAgICAgICAgICBhZGRfdGV4dChAc3JjLnNjYW4oLy4qXG4vKSkKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBAdHJlZSwgQHNyYywgQGJsb2NrX2lhbCA9ICpAc3RhY2sucG9wCisgICAgICAgIHN0YXR1cworICAgICAgZW5kCisKKyAgICAgICMgVXBkYXRlIHRoZSB0cmVlIGJ5IHBhcnNpbmcgYWxsIDorcmF3X3RleHQrIGVsZW1lbnRzIHdpdGggdGhlIHNwYW4tbGV2ZWwgcGFyc2VyIChyZXNldHMgdGhlCisgICAgICAjIGVudmlyb25tZW50KSBhbmQgYnkgdXBkYXRpbmcgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgSUFMcy4KKyAgICAgIGRlZiB1cGRhdGVfdHJlZShlbGVtZW50KQorICAgICAgICBsYXN0X2JsYW5rID0gbmlsCisgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ubWFwISBkbyB8Y2hpbGR8CisgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSA6cmF3X3RleHQKKyAgICAgICAgICAgIGxhc3RfYmxhbmsgPSBuaWwKKyAgICAgICAgICAgIHJlc2V0X2Vudig6c3JjID0+IDo6S3JhbWRvd246OlV0aWxzOjpTdHJpbmdTY2FubmVyLm5ldyhjaGlsZC52YWx1ZSwgZWxlbWVudC5vcHRpb25zWzpsb2NhdGlvbl0pLAorICAgICAgICAgICAgICAgICAgICAgIDp0ZXh0X3R5cGUgPT4gOnRleHQpCisgICAgICAgICAgICBwYXJzZV9zcGFucyhjaGlsZCkKKyAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuCisgICAgICAgICAgZWxzaWYgY2hpbGQudHlwZSA9PSA6ZW9iCisgICAgICAgICAgICB1cGRhdGVfYXR0cl93aXRoX2lhbChjaGlsZC5hdHRyLCBjaGlsZC5vcHRpb25zWzppYWxdKSBpZiBjaGlsZC5vcHRpb25zWzppYWxdCisgICAgICAgICAgICBbXQorICAgICAgICAgIGVsc2lmIGNoaWxkLnR5cGUgPT0gOmJsYW5rCisgICAgICAgICAgICBpZiBsYXN0X2JsYW5rCisgICAgICAgICAgICAgIGxhc3RfYmxhbmsudmFsdWUgPDwgY2hpbGQudmFsdWUKKyAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbGFzdF9ibGFuayA9IGNoaWxkCisgICAgICAgICAgICAgIGNoaWxkCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBsYXN0X2JsYW5rID0gbmlsCisgICAgICAgICAgICB1cGRhdGVfdHJlZShjaGlsZCkKKyAgICAgICAgICAgIHVwZGF0ZV9hdHRyX3dpdGhfaWFsKGNoaWxkLmF0dHIsIGNoaWxkLm9wdGlvbnNbOmlhbF0pIGlmIGNoaWxkLm9wdGlvbnNbOmlhbF0KKyAgICAgICAgICAgICMgREVQUkVDQVRFRDogb3B0aW9uIGF1dG9faWRfc3RyaXBwaW5nIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjAgYmVjYXVzZSB0aGVuIHRoaXMgd2lsbCBiZQorICAgICAgICAgICAgIyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIKKyAgICAgICAgICAgIGlmIGNoaWxkLnR5cGUgPT0gOmR0IHx8IChjaGlsZC50eXBlID09IDpoZWFkZXIgJiYgQG9wdGlvbnNbOmF1dG9faWRfc3RyaXBwaW5nXSkKKyAgICAgICAgICAgICAgdXBkYXRlX3Jhd190ZXh0KGNoaWxkKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBjaGlsZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQuZmxhdHRlbiEKKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlIGFsbCBzcGFuLWxldmVsIGVsZW1lbnRzIGluIHRoZSBzb3VyY2Ugc3RyaW5nIG9mIEBzcmMgaW50byArZWwrLgorICAgICAgIworICAgICAgIyBJZiB0aGUgcGFyYW1ldGVyICtzdG9wX3JlKyAoYSByZWdleHApIGlzIHVzZWQsIHBhcnNpbmcgaXMgaW1tZWRpYXRlbHkgc3RvcHBlZCBpZiB0aGUgcmVnZXhwCisgICAgICAjIG1hdGNoZXMgYW5kIGlmIG5vIGJsb2NrIGlzIGdpdmVuIG9yIGlmIGEgYmxvY2sgaXMgZ2l2ZW4gYW5kIGl0IHJldHVybnMgK3RydWUrLgorICAgICAgIworICAgICAgIyBUaGUgcGFyYW1ldGVyICtwYXJzZXJzKyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSAoc3Bhbi1sZXZlbCkgcGFyc2luZyBtZXRob2RzIHRoYXQgc2hvdWxkCisgICAgICAjIGJlIHVzZWQgZm9yIHBhcnNpbmcuCisgICAgICAjCisgICAgICAjIFRoZSBwYXJhbWV0ZXIgK3RleHRfdHlwZSsgc3BlY2lmaWVzIHRoZSB0eXBlIHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciBjcmVhdGVkIHRleHQgbm9kZXMuCisgICAgICBkZWYgcGFyc2Vfc3BhbnMoZWwsIHN0b3BfcmUgPSBuaWwsIHBhcnNlcnMgPSBuaWwsIHRleHRfdHlwZSA9IEB0ZXh0X3R5cGUpCisgICAgICAgIEBzdGFjay5wdXNoKFtAdHJlZSwgQHRleHRfdHlwZV0pIHVubGVzcyBAdHJlZS5uaWw/CisgICAgICAgIEB0cmVlLCBAdGV4dF90eXBlID0gZWwsIHRleHRfdHlwZQorCisgICAgICAgIHNwYW5fc3RhcnQgPSBAc3Bhbl9zdGFydAorICAgICAgICBzcGFuX3N0YXJ0X3JlID0gQHNwYW5fc3RhcnRfcmUKKyAgICAgICAgc3Bhbl9zdGFydCwgc3Bhbl9zdGFydF9yZSA9IHNwYW5fcGFyc2VyX3JlZ2V4cHMocGFyc2VycykgaWYgcGFyc2VycworICAgICAgICBwYXJzZXJzID0gcGFyc2VycyB8fCBAc3Bhbl9wYXJzZXJzCisKKyAgICAgICAgdXNlZF9yZSA9IChzdG9wX3JlLm5pbD8gPyBzcGFuX3N0YXJ0X3JlIDogLyg/PSN7UmVnZXhwLnVuaW9uKHN0b3BfcmUsIHNwYW5fc3RhcnQpfSkvKQorICAgICAgICBzdG9wX3JlX2ZvdW5kID0gZmFsc2UKKyAgICAgICAgd2hpbGUgIUBzcmMuZW9zPyAmJiAhc3RvcF9yZV9mb3VuZAorICAgICAgICAgIGlmIHJlc3VsdCA9IEBzcmMuc2Nhbl91bnRpbCh1c2VkX3JlKQorICAgICAgICAgICAgYWRkX3RleHQocmVzdWx0KQorICAgICAgICAgICAgaWYgc3RvcF9yZSAmJiBAc3JjLmNoZWNrKHN0b3BfcmUpCisgICAgICAgICAgICAgIHN0b3BfcmVfZm91bmQgPSAoYmxvY2tfZ2l2ZW4/ID8geWllbGQgOiB0cnVlKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBwcm9jZXNzZWQgPSBwYXJzZXJzLmFueT8gZG8gfG5hbWV8CisgICAgICAgICAgICAgIGlmIEBzcmMuY2hlY2soQHBhcnNlcnNbbmFtZV0uc3RhcnRfcmUpCisgICAgICAgICAgICAgICAgc2VuZChAcGFyc2Vyc1tuYW1lXS5tZXRob2QpCisgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmFsc2UKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQgdW5sZXNzIHN0b3BfcmVfZm91bmQKKyAgICAgICAgICAgIGFkZF90ZXh0KEBzcmMuZ2V0Y2gpIGlmICFwcm9jZXNzZWQgJiYgIXN0b3BfcmVfZm91bmQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAoYWRkX3RleHQoQHNyYy5yZXN0KTsgQHNyYy50ZXJtaW5hdGUpIHVubGVzcyBzdG9wX3JlCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBAdHJlZSwgQHRleHRfdHlwZSA9IEBzdGFjay5wb3AKKworICAgICAgICBzdG9wX3JlX2ZvdW5kCisgICAgICBlbmQKKworICAgICAgIyBSZXNldCB0aGUgY3VycmVudCBwYXJzaW5nIGVudmlyb25tZW50LiBUaGUgcGFyYW1ldGVyICtlbnYrIGNhbiBiZSB1c2VkIHRvIHNldCBpbml0aWFsCisgICAgICAjIHZhbHVlcyBmb3Igb25lIG9yIG1vcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgICAgZGVmIHJlc2V0X2VudihvcHRzID0ge30pCisgICAgICAgIG9wdHMgPSB7OnRleHRfdHlwZSA9PiA6cmF3X3RleHQsIDpzdGFjayA9PiBbXX0ubWVyZ2Uob3B0cykKKyAgICAgICAgQHNyYyA9IG9wdHNbOnNyY10KKyAgICAgICAgQHRyZWUgPSBvcHRzWzp0cmVlXQorICAgICAgICBAYmxvY2tfaWFsID0gb3B0c1s6YmxvY2tfaWFsXQorICAgICAgICBAc3RhY2sgPSBvcHRzWzpzdGFja10KKyAgICAgICAgQHRleHRfdHlwZSA9IG9wdHNbOnRleHRfdHlwZV0KKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybiB0aGUgY3VycmVudCBwYXJzaW5nIGVudmlyb25tZW50LgorICAgICAgZGVmIHNhdmVfZW52CisgICAgICAgIFtAc3JjLCBAdHJlZSwgQGJsb2NrX2lhbCwgQHN0YWNrLCAgQHRleHRfdHlwZV0KKyAgICAgIGVuZAorCisgICAgICAjIFJlc3RvcmUgdGhlIGN1cnJlbnQgcGFyc2luZyBlbnZpcm9ubWVudC4KKyAgICAgIGRlZiByZXN0b3JlX2VudihlbnYpCisgICAgICAgIEBzcmMsIEB0cmVlLCBAYmxvY2tfaWFsLCBAc3RhY2ssICBAdGV4dF90eXBlID0gKmVudgorICAgICAgZW5kCisKKyAgICAgICMgVXBkYXRlIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIGhhc2ggK2F0dHIrIHdpdGggdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGlubGluZSBhdHRyaWJ1dGUgbGlzdAorICAgICAgIyAraWFsKyBhbmQgYWxsIHJlZmVyZW5jZWQgQUxEcy4KKyAgICAgIGRlZiB1cGRhdGVfYXR0cl93aXRoX2lhbChhdHRyLCBpYWwpCisgICAgICAgIGlhbFs6cmVmc10uZWFjaCBkbyB8cmVmfAorICAgICAgICAgIHVwZGF0ZV9hdHRyX3dpdGhfaWFsKGF0dHIsIHJlZikgaWYgcmVmID0gQGFsZHNbcmVmXQorICAgICAgICBlbmQgaWYgaWFsWzpyZWZzXQorICAgICAgICBpYWwuZWFjaCBkbyB8ayx2fAorICAgICAgICAgIGlmIGsgPT0gSUFMX0NMQVNTX0FUVFIKKyAgICAgICAgICAgIGF0dHJba10gPSAoYXR0cltrXSB8fCAnJykgPDwgIiAje3Z9IgorICAgICAgICAgICAgYXR0cltrXS5sc3RyaXAhCisgICAgICAgICAgZWxzaWYgay5raW5kX29mPyhTdHJpbmcpCisgICAgICAgICAgICBhdHRyW2tdID0gdgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFVwZGF0ZSB0aGUgcmF3IHRleHQgZm9yIGF1dG9tYXRpYyBJRCBnZW5lcmF0aW9uLgorICAgICAgZGVmIHVwZGF0ZV9yYXdfdGV4dChpdGVtKQorICAgICAgICByYXdfdGV4dCA9ICcnCisKKyAgICAgICAgYXBwZW5kX3RleHQgPSBsYW1iZGEgZG8gfGNoaWxkfAorICAgICAgICAgIGlmIGNoaWxkLnR5cGUgPT0gOnRleHQKKyAgICAgICAgICAgIHJhd190ZXh0IDw8IGNoaWxkLnZhbHVlCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW4uZWFjaCB7fGN8IGFwcGVuZF90ZXh0LmNhbGwoYyl9CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGFwcGVuZF90ZXh0LmNhbGwoaXRlbSkKKyAgICAgICAgaXRlbS5vcHRpb25zWzpyYXdfdGV4dF0gPSByYXdfdGV4dAorICAgICAgZW5kCisKKyAgICAgICMgQ3JlYXRlIGEgbmV3IGJsb2NrLWxldmVsIGVsZW1lbnQsIHRha2luZyBjYXJlIG9mIGFwcGx5aW5nIGEgcHJlY2VkaW5nIGJsb2NrIElBTCBpZiBpdAorICAgICAgIyBleGlzdHMuIFRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBibG9jay1sZXZlbCBlbGVtZW50IQorICAgICAgZGVmIG5ld19ibG9ja19lbCgqYXJncykKKyAgICAgICAgZWwgPSBFbGVtZW50Lm5ldygqYXJncykKKyAgICAgICAgaWYgQGJsb2NrX2lhbAorICAgICAgICAgIGVsLm9wdGlvbnNbOmlhbF0gPSBAYmxvY2tfaWFsCisgICAgICAgICAgQGJsb2NrX2lhbCA9IG5pbAorICAgICAgICBlbmQKKyAgICAgICAgZWwKKyAgICAgIGVuZAorCisgICAgICBAQHBhcnNlcnMgPSB7fQorCisgICAgICAjIFN0cnVjdCBjbGFzcyBob2xkaW5nIGFsbCB0aGUgbmVlZGVkIGRhdGEgZm9yIG9uZSBibG9jay9zcGFuLWxldmVsIHBhcnNlciBtZXRob2QuCisgICAgICBEYXRhID0gU3RydWN0Lm5ldyg6bmFtZSwgOnN0YXJ0X3JlLCA6c3Bhbl9zdGFydCwgOm1ldGhvZCkKKworICAgICAgIyBBZGQgYSBwYXJzZXIgbWV0aG9kCisgICAgICAjCisgICAgICAjICogd2l0aCB0aGUgZ2l2ZW4gK25hbWUrLAorICAgICAgIyAqIHVzaW5nICtzdGFydF9yZSsgYXMgc3RhcnQgcmVnZXhwCisgICAgICAjICogYW5kLCBmb3Igc3BhbiBwYXJzZXJzLCArc3Bhbl9zdGFydCsgYXMgYSBTdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHJlZ2V4cCBhbmQKKyAgICAgICMgICB3aGljaCBpZGVudGlmaWVzIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIocykKKyAgICAgICMKKyAgICAgICMgdG8gdGhlIHJlZ2lzdHJ5LiBUaGUgbWV0aG9kIG5hbWUgaXMgYXV0b21hdGljYWxseSBkZXJpdmVkIGZyb20gdGhlICtuYW1lKyBvciBjYW4gZXhwbGljaXRseQorICAgICAgIyBiZSBzZXQgYnkgdXNpbmcgdGhlICttZXRoX25hbWUrIHBhcmFtZXRlci4KKyAgICAgIGRlZiBzZWxmLmRlZmluZV9wYXJzZXIobmFtZSwgc3RhcnRfcmUsIHNwYW5fc3RhcnQgPSBuaWwsIG1ldGhfbmFtZSA9ICJwYXJzZV8je25hbWV9IikKKyAgICAgICAgcmFpc2UgIkEgcGFyc2VyIHdpdGggdGhlIG5hbWUgI3tuYW1lfSBhbHJlYWR5IGV4aXN0cyEiIGlmIEBAcGFyc2Vycy5oYXNfa2V5PyhuYW1lKQorICAgICAgICBAQHBhcnNlcnNbbmFtZV0gPSBEYXRhLm5ldyhuYW1lLCBzdGFydF9yZSwgc3Bhbl9zdGFydCwgbWV0aF9uYW1lKQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJuIHRoZSBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHBhcnNlciArbmFtZSsuCisgICAgICBkZWYgc2VsZi5wYXJzZXIobmFtZSA9IG5pbCkKKyAgICAgICAgQEBwYXJzZXJzW25hbWVdCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm4gK3RydWUrIGlmIHRoZXJlIGlzIGEgcGFyc2VyIGNhbGxlZCArbmFtZSsuCisgICAgICBkZWYgc2VsZi5oYXNfcGFyc2VyPyhuYW1lKQorICAgICAgICBAQHBhcnNlcnMuaGFzX2tleT8obmFtZSkKKyAgICAgIGVuZAorCisgICAgICAjIFJlZ2V4cCBmb3IgbWF0Y2hpbmcgaW5kZW50YXRpb24gKG9uZSB0YWIgb3IgZm91ciBzcGFjZXMpCisgICAgICBJTkRFTlQgPSAvXig/Olx0fCB7NH0pLworICAgICAgIyBSZWdleHAgZm9yIG1hdGNoaW5nIHRoZSBvcHRpb25hbCBzcGFjZSAoemVybyBvciB1cCB0byB0aHJlZSBzcGFjZXMpCisgICAgICBPUFRfU1BBQ0UgPSAvIHswLDN9LworCisgICAgICByZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vYmxhbmtfbGluZScKKyAgICAgIHJlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9lb2InCisgICAgICByZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vcGFyYWdyYXBoJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2hlYWRlcicKKyAgICAgIHJlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibG9ja3F1b3RlJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL3RhYmxlJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2NvZGVibG9jaycKKyAgICAgIHJlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ob3Jpem9udGFsX3J1bGUnCisgICAgICByZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vbGlzdCcKKyAgICAgIHJlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9saW5rJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2V4dGVuc2lvbnMnCisgICAgICByZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZm9vdG5vdGUnCisgICAgICByZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vaHRtbCcKKyAgICAgIHJlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9lc2NhcGVkX2NoYXJzJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2h0bWxfZW50aXR5JworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2xpbmVfYnJlYWsnCisgICAgICByZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vdHlwb2dyYXBoaWNfc3ltYm9sJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2F1dG9saW5rJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2NvZGVzcGFuJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2VtcGhhc2lzJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL3NtYXJ0X3F1b3RlcycKKyAgICAgIHJlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9tYXRoJworICAgICAgcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2FiYnJldmlhdGlvbicKKworICAgIGVuZAorCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2FiYnJldmlhdGlvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2FiYnJldmlhdGlvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQwNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vYWJicmV2aWF0aW9uLnJiCkBAIC0wLDAgKzEsNzUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duCisgIG1vZHVsZSBQYXJzZXIKKyAgICBjbGFzcyBLcmFtZG93bgorCisgICAgICBBQkJSRVZfREVGSU5JVElPTl9TVEFSVCA9IC9eI3tPUFRfU1BBQ0V9XCpcWyguKz8pXF06KC4qPylcbi8KKworICAgICAgIyBQYXJzZSB0aGUgbGluayBkZWZpbml0aW9uIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICAgICAgZGVmIHBhcnNlX2FiYnJldl9kZWZpbml0aW9uCisgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgIGFiYnJldl9pZCwgYWJicmV2X3RleHQgPSBAc3JjWzFdLCBAc3JjWzJdCisgICAgICAgIGFiYnJldl90ZXh0LnN0cmlwIQorICAgICAgICB3YXJuaW5nKCJEdXBsaWNhdGUgYWJicmV2aWF0aW9uIElEICcje2FiYnJldl9pZH0nIG9uIGxpbmUgI3tzdGFydF9saW5lX251bWJlcn0gLSBvdmVyd3JpdGluZyIpIGlmIEByb290Lm9wdGlvbnNbOmFiYnJldl9kZWZzXVthYmJyZXZfaWRdCisgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IG5ld19ibG9ja19lbCg6ZW9iLCA6YWJicmV2X2RlZikKKyAgICAgICAgQHJvb3Qub3B0aW9uc1s6YWJicmV2X2RlZnNdW2FiYnJldl9pZF0gPSBhYmJyZXZfdGV4dAorICAgICAgICBAcm9vdC5vcHRpb25zWzphYmJyZXZfYXR0cl1bYWJicmV2X2lkXSA9IEB0cmVlLmNoaWxkcmVuLmxhc3QKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDphYmJyZXZfZGVmaW5pdGlvbiwgQUJCUkVWX0RFRklOSVRJT05fU1RBUlQpCisKKyAgICAgICMgQ29ycmVjdCBhYmJyZXZpYXRpb24gYXR0cmlidXRlcy4KKyAgICAgIGRlZiBjb3JyZWN0X2FiYnJldmlhdGlvbnNfYXR0cmlidXRlcworICAgICAgICBAcm9vdC5vcHRpb25zWzphYmJyZXZfYXR0cl0ua2V5cy5lYWNoIGRvIHxrfAorICAgICAgICAgIEByb290Lm9wdGlvbnNbOmFiYnJldl9hdHRyXVtrXSA9IEByb290Lm9wdGlvbnNbOmFiYnJldl9hdHRyXVtrXS5hdHRyCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgUmVwbGFjZSB0aGUgYWJicmV2aWF0aW9uIHRleHQgd2l0aCBlbGVtZW50cy4KKyAgICAgIGRlZiByZXBsYWNlX2FiYnJldmlhdGlvbnMoZWwsIHJlZ2V4cHMgPSBuaWwpCisgICAgICAgIHJldHVybiBpZiBAcm9vdC5vcHRpb25zWzphYmJyZXZfZGVmc10uZW1wdHk/CisgICAgICAgIGlmICFyZWdleHBzCisgICAgICAgICAgc29ydGVkX2FiYnJldnMgPSBAcm9vdC5vcHRpb25zWzphYmJyZXZfZGVmc10ua2V5cy5zb3J0IHt8YSxifCBiLmxlbmd0aCA8PT4gYS5sZW5ndGh9CisgICAgICAgICAgcmVnZXhwcyA9IFtSZWdleHAudW5pb24oKnNvcnRlZF9hYmJyZXZzLm1hcCB7fGt8IC8je1JlZ2V4cC5lc2NhcGUoayl9L30pXQorICAgICAgICAgIHJlZ2V4cHMgPDwgLyg/PSg/OlxXfF4pI3tyZWdleHBzLmZpcnN0fSg/IVx3KSkvICMgcmVnZXhwIHNob3VsZCBvbmx5IG1hdGNoIG9uIHdvcmQgYm91bmRhcmllcworICAgICAgICBlbmQKKyAgICAgICAgZWwuY2hpbGRyZW4ubWFwISBkbyB8Y2hpbGR8CisgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSA6dGV4dAorICAgICAgICAgICAgaWYgY2hpbGQudmFsdWUgPX4gcmVnZXhwcy5maXJzdAorICAgICAgICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICAgICAgICBzdHJzY2FuID0gS3JhbWRvd246OlV0aWxzOjpTdHJpbmdTY2FubmVyLm5ldyhjaGlsZC52YWx1ZSwgY2hpbGQub3B0aW9uc1s6bG9jYXRpb25dKQorICAgICAgICAgICAgICB0ZXh0X2xpbmVubyA9IHN0cnNjYW4uY3VycmVudF9saW5lX251bWJlcgorICAgICAgICAgICAgICB3aGlsZSB0ZW1wID0gc3Ryc2Nhbi5zY2FuX3VudGlsKHJlZ2V4cHMubGFzdCkKKyAgICAgICAgICAgICAgICBhYmJyX2xpbmVubyA9IHN0cnNjYW4uY3VycmVudF9saW5lX251bWJlcgorICAgICAgICAgICAgICAgIGFiYnIgPSBzdHJzY2FuLnNjYW4ocmVnZXhwcy5maXJzdCkgIyBiZWdpbiBvZiBsaW5lIGNhc2Ugb2YgYWJiciB3aXRoIFxXIGNoYXIgYXMgZmlyc3Qgb25lCisgICAgICAgICAgICAgICAgaWYgYWJici5uaWw/CisgICAgICAgICAgICAgICAgICB0ZW1wIDw8IHN0cnNjYW4uc2NhbigvXFd8Xi8pCisgICAgICAgICAgICAgICAgICBhYmJyID0gc3Ryc2Nhbi5zY2FuKHJlZ2V4cHMuZmlyc3QpCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgcmVzdWx0IDw8IEVsZW1lbnQubmV3KDp0ZXh0LCB0ZW1wLCBuaWwsIDpsb2NhdGlvbiA9PiB0ZXh0X2xpbmVubykKKyAgICAgICAgICAgICAgICByZXN1bHQgPDwgRWxlbWVudC5uZXcoOmFiYnJldmlhdGlvbiwgYWJiciwgbmlsLCA6bG9jYXRpb24gPT4gYWJicl9saW5lbm8pCisgICAgICAgICAgICAgICAgdGV4dF9saW5lbm8gPSBzdHJzY2FuLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgIHJlc3VsdCA8PCBFbGVtZW50Lm5ldyg6dGV4dCwgc3Ryc2Nhbi5yZXN0LCBuaWwsIDpsb2NhdGlvbiA9PiB0ZXh0X2xpbmVubykKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgY2hpbGQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcGxhY2VfYWJicmV2aWF0aW9ucyhjaGlsZCwgcmVnZXhwcykKKyAgICAgICAgICAgIGNoaWxkCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZC5mbGF0dGVuIQorICAgICAgZW5kCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2F1dG9saW5rLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vYXV0b2xpbmsucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3YTQwNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2F1dG9saW5rLnJiCkBAIC0wLDAgKzEsMzcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duCisgIG1vZHVsZSBQYXJzZXIKKyAgICBjbGFzcyBLcmFtZG93bgorCisgICAgICBpZiBSVUJZX1ZFUlNJT04gPT0gJzEuOC41JworICAgICAgICBBQ0hBUlMgPSAnXHdceDgwLVx4RkYnCisgICAgICBlbHNpZiBSVUJZX1ZFUlNJT04gPCAnMS45LjAnCisgICAgICAgIEFDSEFSUyA9ICdcdycKKyAgICAgIGVsc2UKKyAgICAgICAgQUNIQVJTID0gJ1tbOmFsbnVtOl1dXycKKyAgICAgIGVuZAorICAgICAgQVVUT0xJTktfU1RBUlRfU1RSID0gIjwoKG1haWx0b3xodHRwcz98ZnRwcz8pOi4rP3xbLS4je0FDSEFSU31dK0BbLSN7QUNIQVJTfV0rKD86XC5bLSN7QUNIQVJTfV0rKSpcLlthLXpdKyk+IgorICAgICAgQVVUT0xJTktfU1RBUlQgPSAvI3tBVVRPTElOS19TVEFSVF9TVFJ9L3UKKworICAgICAgIyBQYXJzZSB0aGUgYXV0b2xpbmsgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfYXV0b2xpbmsKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgQHNyYy5wb3MgKz0gQHNyYy5tYXRjaGVkX3NpemUKKyAgICAgICAgaHJlZiA9IChAc3JjWzJdLm5pbD8gPyAibWFpbHRvOiN7QHNyY1sxXX0iIDogQHNyY1sxXSkKKyAgICAgICAgZWwgPSBFbGVtZW50Lm5ldyg6YSwgbmlsLCB7J2hyZWYnID0+IGhyZWZ9LCA6bG9jYXRpb24gPT4gc3RhcnRfbGluZV9udW1iZXIpCisgICAgICAgIGFkZF90ZXh0KEBzcmNbMV0uc3ViKC9ebWFpbHRvOi8sICcnKSwgZWwpCisgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IGVsCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOmF1dG9saW5rLCBBVVRPTElOS19TVEFSVCwgJzwnKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibGFua19saW5lLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vYmxhbmtfbGluZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmMwN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vYmxhbmtfbGluZS5yYgpAQCAtMCwwICsxLDMwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgQkxBTktfTElORSA9IC8oPz5eXHMqXG4pKy8KKworICAgICAgIyBQYXJzZSB0aGUgYmxhbmsgbGluZSBhdCB0aGUgY3VycmVudCBwb3N0aXRpb24uCisgICAgICBkZWYgcGFyc2VfYmxhbmtfbGluZQorICAgICAgICBAc3JjLnBvcyArPSBAc3JjLm1hdGNoZWRfc2l6ZQorICAgICAgICBpZiBAdHJlZS5jaGlsZHJlbi5sYXN0ICYmIEB0cmVlLmNoaWxkcmVuLmxhc3QudHlwZSA9PSA6YmxhbmsKKyAgICAgICAgICBAdHJlZS5jaGlsZHJlbi5sYXN0LnZhbHVlIDw8IEBzcmMubWF0Y2hlZAorICAgICAgICBlbHNlCisgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgbmV3X2Jsb2NrX2VsKDpibGFuaywgQHNyYy5tYXRjaGVkKQorICAgICAgICBlbmQKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpibGFua19saW5lLCBCTEFOS19MSU5FKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibG9ja19ib3VuZGFyeS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2Jsb2NrX2JvdW5kYXJ5LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDhlOTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibG9ja19ib3VuZGFyeS5yYgpAQCAtMCwwICsxLDMzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9leHRlbnNpb25zJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2JsYW5rX2xpbmUnCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZW9iJworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFBhcnNlcgorICAgIGNsYXNzIEtyYW1kb3duCisKKyAgICAgIEJMT0NLX0JPVU5EQVJZID0gLyN7QkxBTktfTElORX18I3tFT0JfTUFSS0VSfXwje0lBTF9CTE9DS19TVEFSVH18XFovCisKKyAgICAgICMgUmV0dXJuICt0cnVlKyBpZiB3ZSBhcmUgYWZ0ZXIgYSBibG9jayBib3VuZGFyeS4KKyAgICAgIGRlZiBhZnRlcl9ibG9ja19ib3VuZGFyeT8KKyAgICAgICAgIUB0cmVlLmNoaWxkcmVuLmxhc3QgfHwgQHRyZWUuY2hpbGRyZW4ubGFzdC50eXBlID09IDpibGFuayB8fAorICAgICAgICAgIChAdHJlZS5jaGlsZHJlbi5sYXN0LnR5cGUgPT0gOmVvYiAmJiBAdHJlZS5jaGlsZHJlbi5sYXN0LnZhbHVlLm5pbD8pIHx8IEBibG9ja19pYWwKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybiArdHJ1ZSsgaWYgd2UgYXJlIGJlZm9yZSBhIGJsb2NrIGJvdW5kYXJ5LgorICAgICAgZGVmIGJlZm9yZV9ibG9ja19ib3VuZGFyeT8KKyAgICAgICAgQHNyYy5jaGVjayhzZWxmLmNsYXNzOjpCTE9DS19CT1VOREFSWSkKKyAgICAgIGVuZAorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibG9ja3F1b3RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vYmxvY2txdW90ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjgzMDgzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vYmxvY2txdW90ZS5yYgpAQCAtMCwwICsxLDM5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibGFua19saW5lJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2V4dGVuc2lvbnMnCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZW9iJworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFBhcnNlcgorICAgIGNsYXNzIEtyYW1kb3duCisKKyAgICAgIEJMT0NLUVVPVEVfU1RBUlQgPSAvXiN7T1BUX1NQQUNFfT4gPy8KKworICAgICAgIyBQYXJzZSB0aGUgYmxvY2txdW90ZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV9ibG9ja3F1b3RlCisgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgIHJlc3VsdCA9IEBzcmMuc2NhbihQQVJBR1JBUEhfTUFUQ0gpCisgICAgICAgIHdoaWxlICFAc3JjLm1hdGNoPyhzZWxmLmNsYXNzOjpMQVpZX0VORCkKKyAgICAgICAgICByZXN1bHQgPDwgQHNyYy5zY2FuKFBBUkFHUkFQSF9NQVRDSCkKKyAgICAgICAgZW5kCisgICAgICAgIHJlc3VsdC5nc3ViIShCTE9DS1FVT1RFX1NUQVJULCAnJykKKworICAgICAgICBlbCA9IG5ld19ibG9ja19lbCg6YmxvY2txdW90ZSwgbmlsLCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgZWwKKyAgICAgICAgcGFyc2VfYmxvY2tzKGVsLCByZXN1bHQpCisgICAgICAgIHRydWUKKyAgICAgIGVuZAorICAgICAgZGVmaW5lX3BhcnNlcig6YmxvY2txdW90ZSwgQkxPQ0tRVU9URV9TVEFSVCkKKworCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9jb2RlYmxvY2sucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9jb2RlYmxvY2sucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyNDY4MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2NvZGVibG9jay5yYgpAQCAtMCwwICsxLDU4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibGFua19saW5lJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2V4dGVuc2lvbnMnCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZW9iJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL3BhcmFncmFwaCcKKworbW9kdWxlIEtyYW1kb3duCisgIG1vZHVsZSBQYXJzZXIKKyAgICBjbGFzcyBLcmFtZG93bgorCisgICAgICBDT0RFQkxPQ0tfU1RBUlQgPSBJTkRFTlQKKyAgICAgIENPREVCTE9DS19NQVRDSCA9IC8oPzoje0JMQU5LX0xJTkV9Pyg/OiN7SU5ERU5UfVsgXHRdKlxTLipcbikrKD86KD8hI3tJQUxfQkxPQ0tfU1RBUlR9fCN7RU9CX01BUktFUn18XiN7T1BUX1NQQUNFfSN7TEFaWV9FTkRfSFRNTF9TVE9QfXxeI3tPUFRfU1BBQ0V9I3tMQVpZX0VORF9IVE1MX1NUQVJUfSleWyBcdF0qXFMuKlxuKSopKi8KKworICAgICAgIyBQYXJzZSB0aGUgaW5kZW50ZWQgY29kZWJsb2NrIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICAgICAgZGVmIHBhcnNlX2NvZGVibG9jaworICAgICAgICBzdGFydF9saW5lX251bWJlciA9IEBzcmMuY3VycmVudF9saW5lX251bWJlcgorICAgICAgICBkYXRhID0gQHNyYy5zY2FuKHNlbGYuY2xhc3M6OkNPREVCTE9DS19NQVRDSCkKKyAgICAgICAgZGF0YS5nc3ViISgvXG4oIHswLDN9XFMpLywgJyBcXDEnKQorICAgICAgICBkYXRhLmdzdWIhKElOREVOVCwgJycpCisgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IG5ld19ibG9ja19lbCg6Y29kZWJsb2NrLCBkYXRhLCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpjb2RlYmxvY2ssIENPREVCTE9DS19TVEFSVCkKKworCisgICAgICBGRU5DRURfQ09ERUJMT0NLX1NUQVJUID0gL15+ezMsfS8KKyAgICAgIEZFTkNFRF9DT0RFQkxPQ0tfTUFUQ0ggPSAvXigofil7Myx9KVxzKj8oKFxTKz8pKD86XD9cUyopPyk/XHMqP1xuKC4qPyleXDFcMipccyo/XG4vbQorCisgICAgICAjIFBhcnNlIHRoZSBmZW5jZWQgY29kZWJsb2NrIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICAgICAgZGVmIHBhcnNlX2NvZGVibG9ja19mZW5jZWQKKyAgICAgICAgaWYgQHNyYy5jaGVjayhzZWxmLmNsYXNzOjpGRU5DRURfQ09ERUJMT0NLX01BVENIKQorICAgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgICAgQHNyYy5wb3MgKz0gQHNyYy5tYXRjaGVkX3NpemUKKyAgICAgICAgICBlbCA9IG5ld19ibG9ja19lbCg6Y29kZWJsb2NrLCBAc3JjWzVdLCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgICBsYW5nID0gQHNyY1szXS50b19zLnN0cmlwCisgICAgICAgICAgdW5sZXNzIGxhbmcuZW1wdHk/CisgICAgICAgICAgICBlbC5vcHRpb25zWzpsYW5nXSA9IGxhbmcKKyAgICAgICAgICAgIGVsLmF0dHJbJ2NsYXNzJ10gPSAibGFuZ3VhZ2UtI3tAc3JjWzRdfSIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBlbAorICAgICAgICAgIHRydWUKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZhbHNlCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpjb2RlYmxvY2tfZmVuY2VkLCBGRU5DRURfQ09ERUJMT0NLX1NUQVJUKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9jb2Rlc3Bhbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2NvZGVzcGFuLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNzg3ODcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9jb2Rlc3Bhbi5yYgpAQCAtMCwwICsxLDQ0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgQ09ERVNQQU5fREVMSU1JVEVSID0gL2ArLworCisgICAgICAjIFBhcnNlIHRoZSBjb2Rlc3BhbiBhdCB0aGUgY3VycmVudCBzY2FubmVyIGxvY2F0aW9uLgorICAgICAgZGVmIHBhcnNlX2NvZGVzcGFuCisgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgIHJlc3VsdCA9IEBzcmMuc2NhbihDT0RFU1BBTl9ERUxJTUlURVIpCisgICAgICAgIHNpbXBsZSA9IChyZXN1bHQubGVuZ3RoID09IDEpCisgICAgICAgIHNhdmVkX3BvcyA9IEBzcmMuc2F2ZV9wb3MKKworICAgICAgICBpZiBzaW1wbGUgJiYgQHNyYy5wcmVfbWF0Y2ggPX4gL1xzXFovICYmIEBzcmMubWF0Y2g/KC9ccy8pCisgICAgICAgICAgYWRkX3RleHQocmVzdWx0KQorICAgICAgICAgIHJldHVybgorICAgICAgICBlbmQKKworICAgICAgICBpZiB0ZXh0ID0gQHNyYy5zY2FuX3VudGlsKC8je3Jlc3VsdH0vKQorICAgICAgICAgIHRleHQuc3ViISgvI3tyZXN1bHR9XFovLCAnJykKKyAgICAgICAgICBpZiAhc2ltcGxlCisgICAgICAgICAgICB0ZXh0ID0gdGV4dFsxLi4tMV0gaWYgdGV4dFswLi4wXSA9PSAnICcKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0WzAuLi0yXSBpZiB0ZXh0Wy0xLi4tMV0gPT0gJyAnCisgICAgICAgICAgZW5kCisgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgRWxlbWVudC5uZXcoOmNvZGVzcGFuLCB0ZXh0LCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgZWxzZQorICAgICAgICAgIEBzcmMucmV2ZXJ0X3BvcyhzYXZlZF9wb3MpCisgICAgICAgICAgYWRkX3RleHQocmVzdWx0KQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgZGVmaW5lX3BhcnNlcig6Y29kZXNwYW4sIENPREVTUEFOX0RFTElNSVRFUiwgJ2AnKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9lbXBoYXNpcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2VtcGhhc2lzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmNhZTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9lbXBoYXNpcy5yYgpAQCAtMCwwICsxLDYxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgRU1QSEFTSVNfU1RBUlQgPSAvKD86XCpcKj98X18/KS8KKworICAgICAgIyBQYXJzZSB0aGUgZW1waGFzaXMgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfZW1waGFzaXMKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgc2F2ZWRfcG9zID0gQHNyYy5zYXZlX3BvcworCisgICAgICAgIHJlc3VsdCA9IEBzcmMuc2NhbihFTVBIQVNJU19TVEFSVCkKKyAgICAgICAgZWxlbWVudCA9IChyZXN1bHQubGVuZ3RoID09IDIgPyA6c3Ryb25nIDogOmVtKQorICAgICAgICB0eXBlID0gcmVzdWx0WzAuLjBdCisKKyAgICAgICAgaWYgKHR5cGUgPT0gJ18nICYmIEBzcmMucHJlX21hdGNoID1+IC9bWzphbHBoYTpdLV1cei8pIHx8IEBzcmMuY2hlY2soL1xzLykgfHwKKyAgICAgICAgICAgIEB0cmVlLnR5cGUgPT0gZWxlbWVudCB8fCBAc3RhY2suYW55PyB7fGVsLCBffCBlbC50eXBlID09IGVsZW1lbnR9CisgICAgICAgICAgYWRkX3RleHQocmVzdWx0KQorICAgICAgICAgIHJldHVybgorICAgICAgICBlbmQKKworICAgICAgICBzdWJfcGFyc2UgPSBsYW1iZGEgZG8gfGRlbGltLCBlbGVtfAorICAgICAgICAgIGVsID0gRWxlbWVudC5uZXcoZWxlbSwgbmlsLCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgICBzdG9wX3JlID0gLyN7UmVnZXhwLmVzY2FwZShkZWxpbSl9LworICAgICAgICAgIGZvdW5kID0gcGFyc2Vfc3BhbnMoZWwsIHN0b3BfcmUpIGRvCisgICAgICAgICAgICAoQHNyYy5wcmVfbWF0Y2hbLTEsIDFdICF+IC9ccy8pICYmCisgICAgICAgICAgICAgIChlbGVtICE9IDplbSB8fCAhQHNyYy5tYXRjaD8oLyN7UmVnZXhwLmVzY2FwZShkZWxpbSoyKX0oPyEje1JlZ2V4cC5lc2NhcGUoZGVsaW0pfSkvKSkgJiYKKyAgICAgICAgICAgICAgKHR5cGUgIT0gJ18nIHx8ICFAc3JjLm1hdGNoPygvI3tSZWdleHAuZXNjYXBlKGRlbGltKX1bWzphbG51bTpdXS8pKSAmJiBlbC5jaGlsZHJlbi5zaXplID4gMAorICAgICAgICAgIGVuZAorICAgICAgICAgIFtmb3VuZCwgZWwsIHN0b3BfcmVdCisgICAgICAgIGVuZAorCisgICAgICAgIGZvdW5kLCBlbCwgc3RvcF9yZSA9IHN1Yl9wYXJzZS5jYWxsKHJlc3VsdCwgZWxlbWVudCkKKyAgICAgICAgaWYgIWZvdW5kICYmIGVsZW1lbnQgPT0gOnN0cm9uZyAmJiBAdHJlZS50eXBlICE9IDplbQorICAgICAgICAgIEBzcmMucmV2ZXJ0X3BvcyhzYXZlZF9wb3MpCisgICAgICAgICAgQHNyYy5wb3MgKz0gMQorICAgICAgICAgIGZvdW5kLCBlbCwgc3RvcF9yZSA9IHN1Yl9wYXJzZS5jYWxsKHR5cGUsIDplbSkKKyAgICAgICAgZW5kCisgICAgICAgIGlmIGZvdW5kCisgICAgICAgICAgQHNyYy5zY2FuKHN0b3BfcmUpCisgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgZWwKKyAgICAgICAgZWxzZQorICAgICAgICAgIEBzcmMucmV2ZXJ0X3BvcyhzYXZlZF9wb3MpCisgICAgICAgICAgQHNyYy5wb3MgKz0gcmVzdWx0Lmxlbmd0aAorICAgICAgICAgIGFkZF90ZXh0KHJlc3VsdCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOmVtcGhhc2lzLCBFTVBIQVNJU19TVEFSVCwgJ1wqfF8nKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9lb2IucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9lb2IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjNWY0YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2VvYi5yYgpAQCAtMCwwICsxLDI2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgRU9CX01BUktFUiA9IC9eXF5ccyo/XG4vCisKKyAgICAgICMgUGFyc2UgdGhlIEVPQiBtYXJrZXIgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfZW9iX21hcmtlcgorICAgICAgICBAc3JjLnBvcyArPSBAc3JjLm1hdGNoZWRfc2l6ZQorICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBuZXdfYmxvY2tfZWwoOmVvYikKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDplb2JfbWFya2VyLCBFT0JfTUFSS0VSKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9lc2NhcGVkX2NoYXJzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZXNjYXBlZF9jaGFycy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWFlNDVkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZXNjYXBlZF9jaGFycy5yYgpAQCAtMCwwICsxLDI1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgRVNDQVBFRF9DSEFSUyA9IC9cXChbXFwuKl8rYDw+KClcW1xde30jITp8IidcJD0tXSkvCisKKyAgICAgICMgUGFyc2UgdGhlIGJhY2tzbGFzaC1lc2NhcGVkIGNoYXJhY3RlciBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV9lc2NhcGVkX2NoYXJzCisgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgIGFkZF90ZXh0KEBzcmNbMV0pCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOmVzY2FwZWRfY2hhcnMsIEVTQ0FQRURfQ0hBUlMsICdcXFxcJykKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZXh0ZW5zaW9ucy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2V4dGVuc2lvbnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwNTNiZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2V4dGVuc2lvbnMucmIKQEAgLTAsMCArMSwyMDMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duCisgIG1vZHVsZSBQYXJzZXIKKyAgICBjbGFzcyBLcmFtZG93bgorCisgICAgICBJQUxfQ0xBU1NfQVRUUiA9ICdjbGFzcycKKworICAgICAgIyBQYXJzZSB0aGUgc3RyaW5nICtzdHIrIGFuZCBleHRyYWN0IGFsbCBhdHRyaWJ1dGVzIGFuZCBhZGQgYWxsIGZvdW5kIGF0dHJpYnV0ZXMgdG8gdGhlIGhhc2gKKyAgICAgICMgK29wdHMrLgorICAgICAgZGVmIHBhcnNlX2F0dHJpYnV0ZV9saXN0KHN0ciwgb3B0cykKKyAgICAgICAgcmV0dXJuIGlmIHN0ci5zdHJpcC5lbXB0eT8gfHwgc3RyLnN0cmlwID09ICc6JworICAgICAgICBhdHRycyA9IHN0ci5zY2FuKEFMRF9UWVBFX0FOWSkKKyAgICAgICAgYXR0cnMuZWFjaCBkbyB8a2V5LCBzZXAsIHZhbCwgcmVmLCBpZF9hbmRfb3JfY2xhc3MsIF8sIF98CisgICAgICAgICAgaWYgcmVmCisgICAgICAgICAgICAob3B0c1s6cmVmc10gfHw9IFtdKSA8PCByZWYKKyAgICAgICAgICBlbHNpZiBpZF9hbmRfb3JfY2xhc3MKKyAgICAgICAgICAgIGlkX2FuZF9vcl9jbGFzcy5zY2FuKEFMRF9UWVBFX0lEX09SX0NMQVNTKS5lYWNoIGRvIHxpZF9hdHRyLCBjbGFzc19hdHRyfAorICAgICAgICAgICAgICBpZiBjbGFzc19hdHRyCisgICAgICAgICAgICAgICAgb3B0c1tJQUxfQ0xBU1NfQVRUUl0gPSAob3B0c1tJQUxfQ0xBU1NfQVRUUl0gfHwgJycpIDw8ICIgI3tjbGFzc19hdHRyfSIKKyAgICAgICAgICAgICAgICBvcHRzW0lBTF9DTEFTU19BVFRSXS5sc3RyaXAhCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvcHRzWydpZCddID0gaWRfYXR0cgorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbC5nc3ViISgvXFwoXH18I3tzZXB9KS8sICJcXDEiKQorICAgICAgICAgICAgb3B0c1trZXldID0gdmFsCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICB3YXJuaW5nKCJObyBvciBpbnZhbGlkIGF0dHJpYnV0ZXMgZm91bmQgaW4gSUFML0FMRCBjb250ZW50OiAje3N0cn0iKSBpZiBhdHRycy5sZW5ndGggPT0gMAorICAgICAgZW5kCisKKyAgICAgICMgVXBkYXRlIHRoZSAraWFsKyB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbmxpbmUgYXR0cmlidXRlIGxpc3QgK29wdHMrLgorICAgICAgZGVmIHVwZGF0ZV9pYWxfd2l0aF9pYWwoaWFsLCBvcHRzKQorICAgICAgICAoaWFsWzpyZWZzXSB8fD0gW10pIDw8IG9wdHNbOnJlZnNdCisgICAgICAgIG9wdHMuZWFjaCBkbyB8ayx2fAorICAgICAgICAgIGlmIGsgPT0gSUFMX0NMQVNTX0FUVFIKKyAgICAgICAgICAgIGlhbFtrXSA9IChpYWxba10gfHwgJycpIDw8ICIgI3t2fSIKKyAgICAgICAgICAgIGlhbFtrXS5sc3RyaXAhCisgICAgICAgICAgZWxzaWYgay5raW5kX29mPyhTdHJpbmcpCisgICAgICAgICAgICBpYWxba10gPSB2CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgUGFyc2UgdGhlIGdlbmVyaWMgZXh0ZW5zaW9uIGF0IHRoZSBjdXJyZW50IHBvaW50LiBUaGUgcGFyYW1ldGVyICt0eXBlKyBjYW4gZWl0aGVyIGJlIDpibG9jaworICAgICAgIyBvciA6c3BhbiBkZXBlbmRpbmcgd2hldGhlciB3ZSBwYXJzZSBhIGJsb2NrIG9yIHNwYW4gZXh0ZW5zaW9uIHRhZy4KKyAgICAgIGRlZiBwYXJzZV9leHRlbnNpb25fc3RhcnRfdGFnKHR5cGUpCisgICAgICAgIHNhdmVkX3BvcyA9IEBzcmMuc2F2ZV9wb3MKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgQHNyYy5wb3MgKz0gQHNyYy5tYXRjaGVkX3NpemUKKworICAgICAgICBlcnJvcl9ibG9jayA9IGxhbWJkYSBkbyB8bXNnfAorICAgICAgICAgIHdhcm5pbmcobXNnKQorICAgICAgICAgIEBzcmMucmV2ZXJ0X3BvcyhzYXZlZF9wb3MpCisgICAgICAgICAgYWRkX3RleHQoQHNyYy5nZXRjaCkgaWYgdHlwZSA9PSA6c3BhbgorICAgICAgICAgIGZhbHNlCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIEBzcmNbNF0gfHwgQHNyYy5tYXRjaGVkID09ICd7Oi99JworICAgICAgICAgIG5hbWUgPSAoQHNyY1s0XSA/ICJmb3IgJyN7QHNyY1s0XX0nICIgOiAnJykKKyAgICAgICAgICByZXR1cm4gZXJyb3JfYmxvY2suY2FsbCgiSW52YWxpZCBleHRlbnNpb24gc3RvcCB0YWcgI3tuYW1lfSBmb3VuZCBvbiBsaW5lICN7c3RhcnRfbGluZV9udW1iZXJ9IC0gaWdub3JpbmcgaXQiKQorICAgICAgICBlbmQKKworICAgICAgICBleHQgPSBAc3JjWzFdCisgICAgICAgIG9wdHMgPSB7fQorICAgICAgICBib2R5ID0gbmlsCisgICAgICAgIHBhcnNlX2F0dHJpYnV0ZV9saXN0KEBzcmNbMl0gfHwgJycsIG9wdHMpCisKKyAgICAgICAgaWYgIUBzcmNbM10KKyAgICAgICAgICBzdG9wX3JlID0gKHR5cGUgPT0gOmJsb2NrID8gLyN7RVhUX0JMT0NLX1NUT1BfU1RSICUgZXh0fS8gOiAvI3tFWFRfU1RPUF9TVFIgJSBleHR9LykKKyAgICAgICAgICBpZiByZXN1bHQgPSBAc3JjLnNjYW5fdW50aWwoc3RvcF9yZSkKKyAgICAgICAgICAgIGJvZHkgPSByZXN1bHQuc3ViIShzdG9wX3JlLCAnJykKKyAgICAgICAgICAgIGJvZHkuY2hvbXAhIGlmIHR5cGUgPT0gOmJsb2NrCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGVycm9yX2Jsb2NrLmNhbGwoIk5vIHN0b3AgdGFnIGZvciBleHRlbnNpb24gJyN7ZXh0fScgZm91bmQgb24gbGluZSAje3N0YXJ0X2xpbmVfbnVtYmVyfSAtIGlnbm9yaW5nIGl0IikKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgaWYgIWhhbmRsZV9leHRlbnNpb24oZXh0LCBvcHRzLCBib2R5LCB0eXBlLCBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgICBlcnJvcl9ibG9jay5jYWxsKCJJbnZhbGlkIGV4dGVuc2lvbiB3aXRoIG5hbWUgJyN7ZXh0fScgc3BlY2lmaWVkIG9uIGxpbmUgI3tzdGFydF9saW5lX251bWJlcn0gLSBpZ25vcmluZyBpdCIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICB0cnVlCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBoYW5kbGVfZXh0ZW5zaW9uKG5hbWUsIG9wdHMsIGJvZHksIHR5cGUsIGxpbmVfbm8gPSBuaWwpCisgICAgICAgIGNhc2UgbmFtZQorICAgICAgICB3aGVuICdjb21tZW50JworICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDpjb21tZW50LCBib2R5LCBuaWwsIDpjYXRlZ29yeSA9PiB0eXBlLCA6bG9jYXRpb24gPT4gbGluZV9ubykgaWYgYm9keS5raW5kX29mPyhTdHJpbmcpCisgICAgICAgICAgdHJ1ZQorICAgICAgICB3aGVuICdub21hcmtkb3duJworICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDpyYXcsIGJvZHksIG5pbCwgOmNhdGVnb3J5ID0+IHR5cGUsIDpsb2NhdGlvbiA9PiBsaW5lX25vLCA6dHlwZSA9PiBvcHRzWyd0eXBlJ10udG9fcy5zcGxpdCgvXHMrLykpIGlmIGJvZHkua2luZF9vZj8oU3RyaW5nKQorICAgICAgICAgIHRydWUKKyAgICAgICAgd2hlbiAnb3B0aW9ucycKKyAgICAgICAgICBvcHRzLnNlbGVjdCBkbyB8ayx2fAorICAgICAgICAgICAgayA9IGsudG9fc3ltCisgICAgICAgICAgICBpZiBLcmFtZG93bjo6T3B0aW9ucy5kZWZpbmVkPyhrKQorICAgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICAgIHZhbCA9IEtyYW1kb3duOjpPcHRpb25zLnBhcnNlKGssIHYpCisgICAgICAgICAgICAgICAgQG9wdGlvbnNba10gPSB2YWwKKyAgICAgICAgICAgICAgICAoQHJvb3Qub3B0aW9uc1s6b3B0aW9uc10gfHw9IHt9KVtrXSA9IHZhbAorICAgICAgICAgICAgICByZXNjdWUKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgIGZhbHNlCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRydWUKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZC5lYWNoIGRvIHxrLHZ8CisgICAgICAgICAgICB3YXJuaW5nKCJVbmtub3duIGtyYW1kb3duIG9wdGlvbiAnI3trfSciKQorICAgICAgICAgIGVuZAorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IG5ld19ibG9ja19lbCg6ZW9iLCA6ZXh0ZW5zaW9uKSBpZiB0eXBlID09IDpibG9jaworICAgICAgICAgIHRydWUKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZhbHNlCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKworICAgICAgQUxEX0lEX0NIQVJTID0gL1tcdy1dLworICAgICAgQUxEX0FOWV9DSEFSUyA9IC9cXFx9fFteXH1dLworICAgICAgQUxEX0lEX05BTUUgPSAvXHcje0FMRF9JRF9DSEFSU30qLworICAgICAgQUxEX0NMQVNTX05BTUUgPSAvW15cc1wuI10rLworICAgICAgQUxEX1RZUEVfS0VZX1ZBTFVFX1BBSVIgPSAvKCN7QUxEX0lEX05BTUV9KT0oInwnKSgoPzpcXFx9fFxcXDJ8W15cfVwyXSkqPylcMi8KKyAgICAgIEFMRF9UWVBFX0NMQVNTX05BTUUgPSAvXC4oI3tBTERfQ0xBU1NfTkFNRX0pLworICAgICAgQUxEX1RZUEVfSURfTkFNRSA9IC8jKFtBLVphLXpdW1x3Oi1dKikvCisgICAgICBBTERfVFlQRV9JRF9PUl9DTEFTUyA9IC8je0FMRF9UWVBFX0lEX05BTUV9fCN7QUxEX1RZUEVfQ0xBU1NfTkFNRX0vCisgICAgICBBTERfVFlQRV9JRF9PUl9DTEFTU19NVUxUSSA9IC8oKD86I3tBTERfVFlQRV9JRF9OQU1FfXwje0FMRF9UWVBFX0NMQVNTX05BTUV9KSspLworICAgICAgQUxEX1RZUEVfUkVGID0gLygje0FMRF9JRF9OQU1FfSkvCisgICAgICBBTERfVFlQRV9BTlkgPSAvKD86XEF8XHMpKD86I3tBTERfVFlQRV9LRVlfVkFMVUVfUEFJUn18I3tBTERfVFlQRV9SRUZ9fCN7QUxEX1RZUEVfSURfT1JfQ0xBU1NfTVVMVEl9KSg/PVxzfFxaKS8KKyAgICAgIEFMRF9TVEFSVCA9IC9eI3tPUFRfU1BBQ0V9XHs6KCN7QUxEX0lEX05BTUV9KTooI3tBTERfQU5ZX0NIQVJTfSspXH1ccyo/XG4vCisKKyAgICAgIEVYVF9TVE9QX1NUUiA9ICJcXHs6Lyglcyk/XFx9IgorICAgICAgRVhUX1NUQVJUX1NUUiA9ICJcXHs6OihcXHcrKSg/Olxccygje0FMRF9BTllfQ0hBUlN9Kj8pfCkoXFwvKT9cXH0iCisgICAgICBFWFRfQkxPQ0tfU1RBUlQgPSAvXiN7T1BUX1NQQUNFfSg/OiN7RVhUX1NUQVJUX1NUUn18I3tFWFRfU1RPUF9TVFIgJSBBTERfSURfTkFNRX0pXHMqP1xuLworICAgICAgRVhUX0JMT0NLX1NUT1BfU1RSID0gIl4je09QVF9TUEFDRX0je0VYVF9TVE9QX1NUUn1ccyo/XG4iCisKKyAgICAgIElBTF9CTE9DSyA9IC9cezooPyE6fFwvKSgje0FMRF9BTllfQ0hBUlN9KylcfVxzKj9cbi8KKyAgICAgIElBTF9CTE9DS19TVEFSVCA9IC9eI3tPUFRfU1BBQ0V9I3tJQUxfQkxPQ0t9LworCisgICAgICBCTE9DS19FWFRFTlNJT05TX1NUQVJUID0gL14je09QVF9TUEFDRX1cezovCisKKyAgICAgICMgUGFyc2Ugb25lIG9mIHRoZSBibG9jayBleHRlbnNpb25zIChBTEQsIGJsb2NrIElBTCBvciBnZW5lcmljIGV4dGVuc2lvbikgYXQgdGhlIGN1cnJlbnQKKyAgICAgICMgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfYmxvY2tfZXh0ZW5zaW9ucworICAgICAgICBpZiBAc3JjLnNjYW4oQUxEX1NUQVJUKQorICAgICAgICAgIHBhcnNlX2F0dHJpYnV0ZV9saXN0KEBzcmNbMl0sIEBhbGRzW0BzcmNbMV1dIHx8PSBVdGlsczo6T3JkZXJlZEhhc2gubmV3KQorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IG5ld19ibG9ja19lbCg6ZW9iLCA6YWxkKQorICAgICAgICAgIHRydWUKKyAgICAgICAgZWxzaWYgQHNyYy5jaGVjayhFWFRfQkxPQ0tfU1RBUlQpCisgICAgICAgICAgcGFyc2VfZXh0ZW5zaW9uX3N0YXJ0X3RhZyg6YmxvY2spCisgICAgICAgIGVsc2lmIEBzcmMuc2NhbihJQUxfQkxPQ0tfU1RBUlQpCisgICAgICAgICAgaWYgQHRyZWUuY2hpbGRyZW4ubGFzdCAmJiBAdHJlZS5jaGlsZHJlbi5sYXN0LnR5cGUgIT0gOmJsYW5rICYmCisgICAgICAgICAgICAgIChAdHJlZS5jaGlsZHJlbi5sYXN0LnR5cGUgIT0gOmVvYiB8fCBbOmxpbmtfZGVmLCA6YWJicmV2X2RlZiwgOmZvb3Rub3RlX2RlZl0uaW5jbHVkZT8oQHRyZWUuY2hpbGRyZW4ubGFzdC52YWx1ZSkpCisgICAgICAgICAgICBwYXJzZV9hdHRyaWJ1dGVfbGlzdChAc3JjWzFdLCBAdHJlZS5jaGlsZHJlbi5sYXN0Lm9wdGlvbnNbOmlhbF0gfHw9IFV0aWxzOjpPcmRlcmVkSGFzaC5uZXcpCisgICAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBuZXdfYmxvY2tfZWwoOmVvYiwgOmlhbCkgdW5sZXNzIEBzcmMuY2hlY2soSUFMX0JMT0NLX1NUQVJUKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcnNlX2F0dHJpYnV0ZV9saXN0KEBzcmNbMV0sIEBibG9ja19pYWwgfHw9IFV0aWxzOjpPcmRlcmVkSGFzaC5uZXcpCisgICAgICAgICAgZW5kCisgICAgICAgICAgdHJ1ZQorICAgICAgICBlbHNlCisgICAgICAgICAgZmFsc2UKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOmJsb2NrX2V4dGVuc2lvbnMsIEJMT0NLX0VYVEVOU0lPTlNfU1RBUlQpCisKKworICAgICAgRVhUX1NQQU5fU1RBUlQgPSAvI3tFWFRfU1RBUlRfU1RSfXwje0VYVF9TVE9QX1NUUiAlIEFMRF9JRF9OQU1FfS8KKyAgICAgIElBTF9TUEFOX1NUQVJUID0gL1x7Oigje0FMRF9BTllfQ0hBUlN9KylcfS8KKyAgICAgIFNQQU5fRVhURU5TSU9OU19TVEFSVCA9IC9cezovCisKKyAgICAgICMgUGFyc2UgdGhlIGV4dGVuc2lvbiBzcGFuIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICAgICAgZGVmIHBhcnNlX3NwYW5fZXh0ZW5zaW9ucworICAgICAgICBpZiBAc3JjLmNoZWNrKEVYVF9TUEFOX1NUQVJUKQorICAgICAgICAgIHBhcnNlX2V4dGVuc2lvbl9zdGFydF90YWcoOnNwYW4pCisgICAgICAgIGVsc2lmIEBzcmMuY2hlY2soSUFMX1NQQU5fU1RBUlQpCisgICAgICAgICAgaWYgQHRyZWUuY2hpbGRyZW4ubGFzdCAmJiBAdHJlZS5jaGlsZHJlbi5sYXN0LnR5cGUgIT0gOnRleHQKKyAgICAgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgICAgICBhdHRyID0gVXRpbHM6Ok9yZGVyZWRIYXNoLm5ldworICAgICAgICAgICAgcGFyc2VfYXR0cmlidXRlX2xpc3QoQHNyY1sxXSwgYXR0cikKKyAgICAgICAgICAgIHVwZGF0ZV9pYWxfd2l0aF9pYWwoQHRyZWUuY2hpbGRyZW4ubGFzdC5vcHRpb25zWzppYWxdIHx8PSBVdGlsczo6T3JkZXJlZEhhc2gubmV3LCBhdHRyKQorICAgICAgICAgICAgdXBkYXRlX2F0dHJfd2l0aF9pYWwoQHRyZWUuY2hpbGRyZW4ubGFzdC5hdHRyLCBhdHRyKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdhcm5pbmcoIkZvdW5kIHNwYW4gSUFMIGFmdGVyIHRleHQgLSBpZ25vcmluZyBpdCIpCisgICAgICAgICAgICBhZGRfdGV4dChAc3JjLmdldGNoKQorICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgYWRkX3RleHQoQHNyYy5nZXRjaCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOnNwYW5fZXh0ZW5zaW9ucywgU1BBTl9FWFRFTlNJT05TX1NUQVJULCAnXHs6JykKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZm9vdG5vdGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9mb290bm90ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJkODE1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZm9vdG5vdGUucmIKQEAgLTAsMCArMSw2MyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZXh0ZW5zaW9ucycKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibGFua19saW5lJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2NvZGVibG9jaycKKworbW9kdWxlIEtyYW1kb3duCisgIG1vZHVsZSBQYXJzZXIKKyAgICBjbGFzcyBLcmFtZG93bgorCisgICAgICBGT09UTk9URV9ERUZJTklUSU9OX1NUQVJUID0gL14je09QVF9TUEFDRX1cW1xeKCN7QUxEX0lEX05BTUV9KVxdOlxzKj8oLio/XG4je0NPREVCTE9DS19NQVRDSH0pLworCisgICAgICAjIFBhcnNlIHRoZSBmb290IG5vdGUgZGVmaW5pdGlvbiBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV9mb290bm90ZV9kZWZpbml0aW9uCisgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisKKyAgICAgICAgZWwgPSBFbGVtZW50Lm5ldyg6Zm9vdG5vdGVfZGVmLCBuaWwsIG5pbCwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKQorICAgICAgICBwYXJzZV9ibG9ja3MoZWwsIEBzcmNbMl0uZ3N1YihJTkRFTlQsICcnKSkKKyAgICAgICAgd2FybmluZygiRHVwbGljYXRlIGZvb3Rub3RlIG5hbWUgJyN7QHNyY1sxXX0nIG9uIGxpbmUgI3tzdGFydF9saW5lX251bWJlcn0gLSBvdmVyd3JpdGluZyIpIGlmIEBmb290bm90ZXNbQHNyY1sxXV0KKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgbmV3X2Jsb2NrX2VsKDplb2IsIDpmb290bm90ZV9kZWYpCisgICAgICAgIChAZm9vdG5vdGVzW0BzcmNbMV1dID0ge30pWzpjb250ZW50XSA9IGVsCisgICAgICAgIEBmb290bm90ZXNbQHNyY1sxXV1bOmVvYl0gPSBAdHJlZS5jaGlsZHJlbi5sYXN0CisgICAgICAgIHRydWUKKyAgICAgIGVuZAorICAgICAgZGVmaW5lX3BhcnNlcig6Zm9vdG5vdGVfZGVmaW5pdGlvbiwgRk9PVE5PVEVfREVGSU5JVElPTl9TVEFSVCkKKworCisgICAgICBGT09UTk9URV9NQVJLRVJfU1RBUlQgPSAvXFtcXigje0FMRF9JRF9OQU1FfSlcXS8KKworICAgICAgIyBQYXJzZSB0aGUgZm9vdG5vdGUgbWFya2VyIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICAgICAgZGVmIHBhcnNlX2Zvb3Rub3RlX21hcmtlcgorICAgICAgICBzdGFydF9saW5lX251bWJlciA9IEBzcmMuY3VycmVudF9saW5lX251bWJlcgorICAgICAgICBAc3JjLnBvcyArPSBAc3JjLm1hdGNoZWRfc2l6ZQorICAgICAgICBmbl9kZWYgPSBAZm9vdG5vdGVzW0BzcmNbMV1dCisgICAgICAgIGlmIGZuX2RlZgorICAgICAgICAgIGlmIGZuX2RlZls6ZW9iXQorICAgICAgICAgICAgdXBkYXRlX2F0dHJfd2l0aF9pYWwoZm5fZGVmWzplb2JdLmF0dHIsIGZuX2RlZls6ZW9iXS5vcHRpb25zWzppYWxdIHx8IHt9KQorICAgICAgICAgICAgZm5fZGVmWzphdHRyXSA9IGZuX2RlZls6ZW9iXS5hdHRyCisgICAgICAgICAgICBmbl9kZWZbOm9wdGlvbnNdID0gZm5fZGVmWzplb2JdLm9wdGlvbnMKKyAgICAgICAgICAgIGZuX2RlZi5kZWxldGUoOmVvYikKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBmbl9kZWZbOm1hcmtlcl0gfHw9IFtdCisgICAgICAgICAgZm5fZGVmWzptYXJrZXJdLnB1c2goRWxlbWVudC5uZXcoOmZvb3Rub3RlLCBmbl9kZWZbOmNvbnRlbnRdLCBmbl9kZWZbOmF0dHJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuX2RlZls6b3B0aW9uc10ubWVyZ2UoOm5hbWUgPT4gQHNyY1sxXSwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKSkpCisgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgZm5fZGVmWzptYXJrZXJdLmxhc3QKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdhcm5pbmcoIkZvb3Rub3RlIGRlZmluaXRpb24gZm9yICcje0BzcmNbMV19JyBub3QgZm91bmQgb24gbGluZSAje3N0YXJ0X2xpbmVfbnVtYmVyfSIpCisgICAgICAgICAgYWRkX3RleHQoQHNyYy5tYXRjaGVkKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgZGVmaW5lX3BhcnNlcig6Zm9vdG5vdGVfbWFya2VyLCBGT09UTk9URV9NQVJLRVJfU1RBUlQsICdcWycpCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2hlYWRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2hlYWRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg4MmRkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vaGVhZGVyLnJiCkBAIC0wLDAgKzEsNTkgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2Jsb2NrX2JvdW5kYXJ5JworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFBhcnNlcgorICAgIGNsYXNzIEtyYW1kb3duCisKKyAgICAgIEhFQURFUl9JRD0vKD86WyBcdF0rXHsjKFtBLVphLXpdW1x3Oi1dKilcfSk/LworICAgICAgU0VURVhUX0hFQURFUl9TVEFSVCA9IC9eKCN7T1BUX1NQQUNFfVteIFx0XS4qPykje0hFQURFUl9JRH1bIFx0XSo/XG4oLXw9KStccyo/XG4vCisKKyAgICAgICMgUGFyc2UgdGhlIFNldGV4dCBoZWFkZXIgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2Vfc2V0ZXh0X2hlYWRlcgorICAgICAgICByZXR1cm4gZmFsc2UgaWYgIWFmdGVyX2Jsb2NrX2JvdW5kYXJ5PworCisgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgIHRleHQsIGlkLCBsZXZlbCA9IEBzcmNbMV0sIEBzcmNbMl0sIEBzcmNbM10KKyAgICAgICAgdGV4dC5zdHJpcCEKKyAgICAgICAgZWwgPSBuZXdfYmxvY2tfZWwoOmhlYWRlciwgbmlsLCBuaWwsIDpsZXZlbCA9PiAobGV2ZWwgPT0gJy0nID8gMiA6IDEpLCA6cmF3X3RleHQgPT4gdGV4dCwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKQorICAgICAgICBhZGRfdGV4dCh0ZXh0LCBlbCkKKyAgICAgICAgZWwuYXR0clsnaWQnXSA9IGlkIGlmIGlkCisgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IGVsCisgICAgICAgIHRydWUKKyAgICAgIGVuZAorICAgICAgZGVmaW5lX3BhcnNlcig6c2V0ZXh0X2hlYWRlciwgU0VURVhUX0hFQURFUl9TVEFSVCkKKworCisgICAgICBBVFhfSEVBREVSX1NUQVJUID0gL15cI3sxLDZ9LworICAgICAgQVRYX0hFQURFUl9NQVRDSCA9IC9eKFwjezEsNn0pKC4rPyg/OlxcIyk/KVxzKj8jKiN7SEVBREVSX0lEfVxzKj9cbi8KKworICAgICAgIyBQYXJzZSB0aGUgQXR4IGhlYWRlciBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV9hdHhfaGVhZGVyCisgICAgICAgIHJldHVybiBmYWxzZSBpZiAhYWZ0ZXJfYmxvY2tfYm91bmRhcnk/CisKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgQHNyYy5jaGVjayhBVFhfSEVBREVSX01BVENIKQorICAgICAgICBsZXZlbCwgdGV4dCwgaWQgPSBAc3JjWzFdLCBAc3JjWzJdLnRvX3Muc3RyaXAsIEBzcmNbM10KKyAgICAgICAgcmV0dXJuIGZhbHNlIGlmIHRleHQuZW1wdHk/CisKKyAgICAgICAgQHNyYy5wb3MgKz0gQHNyYy5tYXRjaGVkX3NpemUKKyAgICAgICAgZWwgPSBuZXdfYmxvY2tfZWwoOmhlYWRlciwgbmlsLCBuaWwsIDpsZXZlbCA9PiBsZXZlbC5sZW5ndGgsIDpyYXdfdGV4dCA9PiB0ZXh0LCA6bG9jYXRpb24gPT4gc3RhcnRfbGluZV9udW1iZXIpCisgICAgICAgIGFkZF90ZXh0KHRleHQsIGVsKQorICAgICAgICBlbC5hdHRyWydpZCddID0gaWQgaWYgaWQKKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgZWwKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDphdHhfaGVhZGVyLCBBVFhfSEVBREVSX1NUQVJUKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ob3Jpem9udGFsX3J1bGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ob3Jpem9udGFsX3J1bGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3MDFlMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2hvcml6b250YWxfcnVsZS5yYgpAQCAtMCwwICsxLDI3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgSFJfU1RBUlQgPSAvXiN7T1BUX1NQQUNFfShcKnwtfF8pWyBcdF0qXDFbIFx0XSpcMShcMXxbIFx0XSkqXG4vCisKKyAgICAgICMgUGFyc2UgdGhlIGhvcml6b250YWwgcnVsZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV9ob3Jpem9udGFsX3J1bGUKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgQHNyYy5wb3MgKz0gQHNyYy5tYXRjaGVkX3NpemUKKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgbmV3X2Jsb2NrX2VsKDpociwgbmlsLCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpob3Jpem9udGFsX3J1bGUsIEhSX1NUQVJUKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9odG1sLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vaHRtbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI2YjRlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vaHRtbC5yYgpAQCAtMCwwICsxLDE2MyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIvaHRtbCcKKworbW9kdWxlIEtyYW1kb3duCisgIG1vZHVsZSBQYXJzZXIKKyAgICBjbGFzcyBLcmFtZG93bgorCisgICAgICBpbmNsdWRlIEtyYW1kb3duOjpQYXJzZXI6Okh0bWw6OlBhcnNlcgorCisgICAgICAjIE1hcHBpbmcgb2YgbWFya2Rvd24gYXR0cmlidXRlIHZhbHVlIHRvIGNvbnRlbnQgbW9kZWwuIEkuZS4gOnJhdyB3aGVuICIwIiwgOmRlZmF1bHQgd2hlbiAiMSIKKyAgICAgICMgKHVzZSBkZWZhdWx0IGNvbnRlbnQgbW9kZWwgZm9yIHRoZSBIVE1MIGVsZW1lbnQpLCA6c3BhbiB3aGVuICJzcGFuIiwgOmJsb2NrIHdoZW4gYmxvY2sgYW5kCisgICAgICAjIGZvciBldmVyeXRoaW5nIGVsc2UgK25pbCsgaXMgcmV0dXJuZWQuCisgICAgICBIVE1MX01BUktET1dOX0FUVFJfTUFQID0geyIwIiA9PiA6cmF3LCAiMSIgPT4gOmRlZmF1bHQsICJzcGFuIiA9PiA6c3BhbiwgImJsb2NrIiA9PiA6YmxvY2t9CisKKyAgICAgIFRSQUlMSU5HX1dISVRFU1BBQ0UgPSAvWyBcdF0qXG4vCisKKyAgICAgIGRlZiBoYW5kbGVfa3JhbWRvd25faHRtbF90YWcoZWwsIGNsb3NlZCwgaGFuZGxlX2JvZHkpCisgICAgICAgIGlmIEBibG9ja19pYWwKKyAgICAgICAgICBlbC5vcHRpb25zWzppYWxdID0gQGJsb2NrX2lhbAorICAgICAgICAgIEBibG9ja19pYWwgPSBuaWwKKyAgICAgICAgZW5kCisKKyAgICAgICAgY29udGVudF9tb2RlbCA9IGlmIEB0cmVlLnR5cGUgIT0gOmh0bWxfZWxlbWVudCB8fCBAdHJlZS5vcHRpb25zWzpjb250ZW50X21vZGVsXSAhPSA6cmF3CisgICAgICAgICAgICAgICAgICAgICAgICAgIChAb3B0aW9uc1s6cGFyc2VfYmxvY2tfaHRtbF0gPyBIVE1MX0NPTlRFTlRfTU9ERUxbZWwudmFsdWVdIDogOnJhdykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOnJhdworICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgIGlmIHZhbCA9IEhUTUxfTUFSS0RPV05fQVRUUl9NQVBbZWwuYXR0ci5kZWxldGUoJ21hcmtkb3duJyldCisgICAgICAgICAgY29udGVudF9tb2RlbCA9ICh2YWwgPT0gOmRlZmF1bHQgPyBIVE1MX0NPTlRFTlRfTU9ERUxbZWwudmFsdWVdIDogdmFsKQorICAgICAgICBlbmQKKworICAgICAgICBAc3JjLnNjYW4oVFJBSUxJTkdfV0hJVEVTUEFDRSkgaWYgY29udGVudF9tb2RlbCA9PSA6YmxvY2sKKyAgICAgICAgZWwub3B0aW9uc1s6Y29udGVudF9tb2RlbF0gPSBjb250ZW50X21vZGVsCisgICAgICAgIGVsLm9wdGlvbnNbOmlzX2Nsb3NlZF0gPSBjbG9zZWQKKworICAgICAgICBpZiAhY2xvc2VkICYmIGhhbmRsZV9ib2R5CisgICAgICAgICAgaWYgY29udGVudF9tb2RlbCA9PSA6YmxvY2sKKyAgICAgICAgICAgIGlmICFwYXJzZV9ibG9ja3MoZWwpCisgICAgICAgICAgICAgIHdhcm5pbmcoIkZvdW5kIG5vIGVuZCB0YWcgZm9yICcje2VsLnZhbHVlfScgKGxpbmUgI3tlbC5vcHRpb25zWzpsb2NhdGlvbl19KSAtIGF1dG8tY2xvc2luZyBpdCIpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbHNpZiBjb250ZW50X21vZGVsID09IDpzcGFuCisgICAgICAgICAgICBjdXJwb3MgPSBAc3JjLnBvcworICAgICAgICAgICAgaWYgQHNyYy5zY2FuX3VudGlsKC8oPz08XC8je2VsLnZhbHVlfVxzKj4pL21pKQorICAgICAgICAgICAgICBhZGRfdGV4dChleHRyYWN0X3N0cmluZyhjdXJwb3MuLi5Ac3JjLnBvcywgQHNyYyksIGVsKQorICAgICAgICAgICAgICBAc3JjLnNjYW4oSFRNTF9UQUdfQ0xPU0VfUkUpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGFkZF90ZXh0KEBzcmMucmVzdCwgZWwpCisgICAgICAgICAgICAgIEBzcmMudGVybWluYXRlCisgICAgICAgICAgICAgIHdhcm5pbmcoIkZvdW5kIG5vIGVuZCB0YWcgZm9yICcje2VsLnZhbHVlfScgKGxpbmUgI3tlbC5vcHRpb25zWzpsb2NhdGlvbl19KSAtIGF1dG8tY2xvc2luZyBpdCIpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJzZV9yYXdfaHRtbChlbCwgJm1ldGhvZCg6aGFuZGxlX2tyYW1kb3duX2h0bWxfdGFnKSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBAc3JjLnNjYW4oVFJBSUxJTkdfV0hJVEVTUEFDRSkgdW5sZXNzIChAdHJlZS50eXBlID09IDpodG1sX2VsZW1lbnQgJiYgQHRyZWUub3B0aW9uc1s6Y29udGVudF9tb2RlbF0gPT0gOnJhdykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworCisgICAgICBIVE1MX0JMT0NLX1NUQVJUID0gL14je09QVF9TUEFDRX08KCN7UkVYTUw6OlBhcnNlcnM6OkJhc2VQYXJzZXI6OlVOQU1FX1NUUn18XD98IS0tfFwvKS8KKworICAgICAgIyBQYXJzZSB0aGUgSFRNTCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhcyBibG9jay1sZXZlbCBIVE1MLgorICAgICAgZGVmIHBhcnNlX2Jsb2NrX2h0bWwKKyAgICAgICAgbGluZSA9IEBzcmMuY3VycmVudF9saW5lX251bWJlcgorICAgICAgICBpZiByZXN1bHQgPSBAc3JjLnNjYW4oSFRNTF9DT01NRU5UX1JFKQorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDp4bWxfY29tbWVudCwgcmVzdWx0LCBuaWwsIDpjYXRlZ29yeSA9PiA6YmxvY2ssIDpsb2NhdGlvbiA9PiBsaW5lKQorICAgICAgICAgIEBzcmMuc2NhbihUUkFJTElOR19XSElURVNQQUNFKQorICAgICAgICAgIHRydWUKKyAgICAgICAgZWxzaWYgcmVzdWx0ID0gQHNyYy5zY2FuKEhUTUxfSU5TVFJVQ1RJT05fUkUpCisgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgRWxlbWVudC5uZXcoOnhtbF9waSwgcmVzdWx0LCBuaWwsIDpjYXRlZ29yeSA9PiA6YmxvY2ssIDpsb2NhdGlvbiA9PiBsaW5lKQorICAgICAgICAgIEBzcmMuc2NhbihUUkFJTElOR19XSElURVNQQUNFKQorICAgICAgICAgIHRydWUKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmIHJlc3VsdCA9IEBzcmMuY2hlY2soL14je09QVF9TUEFDRX0je0hUTUxfVEFHX1JFfS8pICYmICFIVE1MX1NQQU5fRUxFTUVOVFMuaW5jbHVkZT8oQHNyY1sxXS5kb3duY2FzZSkKKyAgICAgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgICAgICBoYW5kbGVfaHRtbF9zdGFydF90YWcobGluZSwgJm1ldGhvZCg6aGFuZGxlX2tyYW1kb3duX2h0bWxfdGFnKSkKKyAgICAgICAgICAgIEtyYW1kb3duOjpQYXJzZXI6Okh0bWw6OkVsZW1lbnRDb252ZXJ0ZXIuY29udmVydChAcm9vdCwgQHRyZWUuY2hpbGRyZW4ubGFzdCkgaWYgQG9wdGlvbnNbOmh0bWxfdG9fbmF0aXZlXQorICAgICAgICAgICAgdHJ1ZQorICAgICAgICAgIGVsc2lmIHJlc3VsdCA9IEBzcmMuY2hlY2soL14je09QVF9TUEFDRX0je0hUTUxfVEFHX0NMT1NFX1JFfS8pICYmICFIVE1MX1NQQU5fRUxFTUVOVFMuaW5jbHVkZT8oQHNyY1sxXS5kb3duY2FzZSkKKyAgICAgICAgICAgIG5hbWUgPSBAc3JjWzFdLmRvd25jYXNlCisKKyAgICAgICAgICAgIGlmIEB0cmVlLnR5cGUgPT0gOmh0bWxfZWxlbWVudCAmJiBAdHJlZS52YWx1ZSA9PSBuYW1lCisgICAgICAgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgICAgICAgIHRocm93IDpzdG9wX2Jsb2NrX3BhcnNpbmcsIDpmb3VuZAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmYWxzZQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZmFsc2UKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOmJsb2NrX2h0bWwsIEhUTUxfQkxPQ0tfU1RBUlQpCisKKworICAgICAgSFRNTF9TUEFOX1NUQVJUID0gLzwoI3tSRVhNTDo6UGFyc2Vyczo6QmFzZVBhcnNlcjo6VU5BTUVfU1RSfXxcP3whLS18XC8pLworCisgICAgICAjIFBhcnNlIHRoZSBIVE1MIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFzIHNwYW4tbGV2ZWwgSFRNTC4KKyAgICAgIGRlZiBwYXJzZV9zcGFuX2h0bWwKKyAgICAgICAgbGluZSA9IEBzcmMuY3VycmVudF9saW5lX251bWJlcgorICAgICAgICBpZiByZXN1bHQgPSBAc3JjLnNjYW4oSFRNTF9DT01NRU5UX1JFKQorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDp4bWxfY29tbWVudCwgcmVzdWx0LCBuaWwsIDpjYXRlZ29yeSA9PiA6c3BhbiwgOmxvY2F0aW9uID0+IGxpbmUpCisgICAgICAgIGVsc2lmIHJlc3VsdCA9IEBzcmMuc2NhbihIVE1MX0lOU1RSVUNUSU9OX1JFKQorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDp4bWxfcGksIHJlc3VsdCwgbmlsLCA6Y2F0ZWdvcnkgPT4gOnNwYW4sIDpsb2NhdGlvbiA9PiBsaW5lKQorICAgICAgICBlbHNpZiByZXN1bHQgPSBAc3JjLnNjYW4oSFRNTF9UQUdfQ0xPU0VfUkUpCisgICAgICAgICAgd2FybmluZygiRm91bmQgaW52YWxpZGx5IHVzZWQgSFRNTCBjbG9zaW5nIHRhZyBmb3IgJyN7QHNyY1sxXX0nIG9uIGxpbmUgI3tsaW5lfSIpCisgICAgICAgICAgYWRkX3RleHQocmVzdWx0KQorICAgICAgICBlbHNpZiByZXN1bHQgPSBAc3JjLnNjYW4oSFRNTF9UQUdfUkUpCisgICAgICAgICAgdGFnX25hbWUgPSBAc3JjWzFdCisgICAgICAgICAgdGFnX25hbWUuZG93bmNhc2UhIGlmIEhUTUxfRUxFTUVOVFt0YWdfbmFtZS5kb3duY2FzZV0KKyAgICAgICAgICBpZiBIVE1MX0JMT0NLX0VMRU1FTlRTLmluY2x1ZGU/KHRhZ19uYW1lKQorICAgICAgICAgICAgd2FybmluZygiRm91bmQgYmxvY2sgSFRNTCB0YWcgJyN7dGFnX25hbWV9JyBpbiBzcGFuLWxldmVsIHRleHQgb24gbGluZSAje2xpbmV9IikKKyAgICAgICAgICAgIGFkZF90ZXh0KHJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgIGVuZAorCisgICAgICAgICAgYXR0cnMgPSBwYXJzZV9odG1sX2F0dHJpYnV0ZXMoQHNyY1syXSwgbGluZSwgSFRNTF9FTEVNRU5UW3RhZ19uYW1lXSkKKyAgICAgICAgICBhdHRycy5lYWNoIHt8bmFtZSwgdmFsdWV8IHZhbHVlLmdzdWIhKC9cbisvLCAnICcpfQorCisgICAgICAgICAgZG9fcGFyc2luZyA9IChIVE1MX0NPTlRFTlRfTU9ERUxbdGFnX25hbWVdID09IDpyYXcgfHwgQHRyZWUub3B0aW9uc1s6Y29udGVudF9tb2RlbF0gPT0gOnJhdyA/IGZhbHNlIDogQG9wdGlvbnNbOnBhcnNlX3NwYW5faHRtbF0pCisgICAgICAgICAgaWYgdmFsID0gSFRNTF9NQVJLRE9XTl9BVFRSX01BUFthdHRycy5kZWxldGUoJ21hcmtkb3duJyldCisgICAgICAgICAgICBpZiB2YWwgPT0gOmJsb2NrCisgICAgICAgICAgICAgIHdhcm5pbmcoIkNhbm5vdCB1c2UgYmxvY2stbGV2ZWwgcGFyc2luZyBpbiBzcGFuLWxldmVsIEhUTUwgdGFnIChsaW5lICN7bGluZX0pIC0gdXNpbmcgZGVmYXVsdCBtb2RlIikKKyAgICAgICAgICAgIGVsc2lmIHZhbCA9PSA6c3BhbgorICAgICAgICAgICAgICBkb19wYXJzaW5nID0gdHJ1ZQorICAgICAgICAgICAgZWxzaWYgdmFsID09IDpkZWZhdWx0CisgICAgICAgICAgICAgIGRvX3BhcnNpbmcgPSBIVE1MX0NPTlRFTlRfTU9ERUxbdGFnX25hbWVdICE9IDpyYXcKKyAgICAgICAgICAgIGVsc2lmIHZhbCA9PSA6cmF3CisgICAgICAgICAgICAgIGRvX3BhcnNpbmcgPSBmYWxzZQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBlbCA9IEVsZW1lbnQubmV3KDpodG1sX2VsZW1lbnQsIHRhZ19uYW1lLCBhdHRycywgOmNhdGVnb3J5ID0+IDpzcGFuLCA6bG9jYXRpb24gPT4gbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb250ZW50X21vZGVsID0+IChkb19wYXJzaW5nID8gOnNwYW4gOiA6cmF3KSwgOmlzX2Nsb3NlZCA9PiAhIUBzcmNbNF0pCisgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgZWwKKyAgICAgICAgICBzdG9wX3JlID0gLzxcLyN7UmVnZXhwLmVzY2FwZSh0YWdfbmFtZSl9XHMqPi8KKyAgICAgICAgICBzdG9wX3JlID0gUmVnZXhwLm5ldyhzdG9wX3JlLnNvdXJjZSwgUmVnZXhwOjpJR05PUkVDQVNFKSBpZiBIVE1MX0VMRU1FTlRbdGFnX25hbWVdCisgICAgICAgICAgaWYgIUBzcmNbNF0gJiYgIUhUTUxfRUxFTUVOVFNfV0lUSE9VVF9CT0RZLmluY2x1ZGU/KGVsLnZhbHVlKQorICAgICAgICAgICAgaWYgcGFyc2Vfc3BhbnMoZWwsIHN0b3BfcmUsIChkb19wYXJzaW5nID8gbmlsIDogWzpzcGFuX2h0bWxdKSkKKyAgICAgICAgICAgICAgQHNyYy5zY2FuKHN0b3BfcmUpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHdhcm5pbmcoIkZvdW5kIG5vIGVuZCB0YWcgZm9yICcje2VsLnZhbHVlfScgKGxpbmUgI3tsaW5lfSkgLSBhdXRvLWNsb3NpbmcgaXQiKQorICAgICAgICAgICAgICBhZGRfdGV4dChAc3JjLnJlc3QsIGVsKQorICAgICAgICAgICAgICBAc3JjLnRlcm1pbmF0ZQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgICAgS3JhbWRvd246OlBhcnNlcjo6SHRtbDo6RWxlbWVudENvbnZlcnRlci5jb252ZXJ0KEByb290LCBlbCkgaWYgQG9wdGlvbnNbOmh0bWxfdG9fbmF0aXZlXQorICAgICAgICBlbHNlCisgICAgICAgICAgYWRkX3RleHQoQHNyYy5nZXRjaCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOnNwYW5faHRtbCwgSFRNTF9TUEFOX1NUQVJULCAnPCcpCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2h0bWxfZW50aXR5LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vaHRtbF9lbnRpdHkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzYmM4NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2h0bWxfZW50aXR5LnJiCkBAIC0wLDAgKzEsMzMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2h0bWwnCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgIyBQYXJzZSB0aGUgSFRNTCBlbnRpdHkgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfaHRtbF9lbnRpdHkKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgQHNyYy5wb3MgKz0gQHNyYy5tYXRjaGVkX3NpemUKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6ZW50aXR5LCA6OktyYW1kb3duOjpVdGlsczo6RW50aXRpZXMuZW50aXR5KEBzcmNbMV0gfHwgKEBzcmNbMl0gJiYgQHNyY1syXS50b19pKSB8fCBAc3JjWzNdLmhleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsLCA6b3JpZ2luYWwgPT4gQHNyYy5tYXRjaGVkLCA6bG9jYXRpb24gPT4gc3RhcnRfbGluZV9udW1iZXIpCisgICAgICAgIHJlc2N1ZSA6OktyYW1kb3duOjpFcnJvcgorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDplbnRpdHksIDo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ2FtcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbCwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKQorICAgICAgICAgIGFkZF90ZXh0KEBzcmMubWF0Y2hlZFsxLi4tMV0pCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpodG1sX2VudGl0eSwgS3JhbWRvd246OlBhcnNlcjo6SHRtbDo6Q29uc3RhbnRzOjpIVE1MX0VOVElUWV9SRSwgJyYnKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9saW5lX2JyZWFrLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vbGluZV9icmVhay5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTIyOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vbGluZV9icmVhay5yYgpAQCAtMCwwICsxLDI1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgTElORV9CUkVBSyA9IC8oICB8XFxcXCkoPz1cbikvCisKKyAgICAgICMgUGFyc2UgdGhlIGxpbmUgYnJlYWsgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfbGluZV9icmVhaworICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6YnIsIG5pbCwgbmlsLCA6bG9jYXRpb24gPT4gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyKQorICAgICAgICBAc3JjLnBvcyArPSBAc3JjLm1hdGNoZWRfc2l6ZQorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpsaW5lX2JyZWFrLCBMSU5FX0JSRUFLLCAnKCAgfFxcXFwpKD89XG4pJykKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vbGluay5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2xpbmsucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhNWM2NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2xpbmsucmIKQEAgLTAsMCArMSwxNDMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2VzY2FwZWRfY2hhcnMnCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgIyBOb3JtYWxpemUgdGhlIGxpbmsgaWRlbnRpZmllci4KKyAgICAgIGRlZiBub3JtYWxpemVfbGlua19pZChpZCkKKyAgICAgICAgaWQuZ3N1YigvW1xzXSsvLCAnICcpLmRvd25jYXNlCisgICAgICBlbmQKKworICAgICAgTElOS19ERUZJTklUSU9OX1NUQVJUID0gL14je09QVF9TUEFDRX1cWyhbXlxuXF1dKylcXTpbIFx0XSooPzo8KC4qPyk+fChbXlxuXSo/XFNbXlxuXSo/KSkoPzooPzpbIFx0XSo/XG58WyBcdF0rPylbIFx0XSo/KFsiJ10pKC4rPylcNCk/WyBcdF0qP1xuLworCisgICAgICAjIFBhcnNlIHRoZSBsaW5rIGRlZmluaXRpb24gYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfbGlua19kZWZpbml0aW9uCisgICAgICAgIHJldHVybiBmYWxzZSBpZiBAc3JjWzNdLnRvX3MgPX4gL1sgXHRdK1siJ10vCisgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgIGxpbmtfaWQsIGxpbmtfdXJsLCBsaW5rX3RpdGxlID0gbm9ybWFsaXplX2xpbmtfaWQoQHNyY1sxXSksIEBzcmNbMl0gfHwgQHNyY1szXSwgQHNyY1s1XQorICAgICAgICB3YXJuaW5nKCJEdXBsaWNhdGUgbGluayBJRCAnI3tsaW5rX2lkfScgb24gbGluZSAje0BzcmMuY3VycmVudF9saW5lX251bWJlcn0gLSBvdmVyd3JpdGluZyIpIGlmIEBsaW5rX2RlZnNbbGlua19pZF0KKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgbmV3X2Jsb2NrX2VsKDplb2IsIDpsaW5rX2RlZikKKyAgICAgICAgQGxpbmtfZGVmc1tsaW5rX2lkXSA9IFtsaW5rX3VybCwgbGlua190aXRsZSwgQHRyZWUuY2hpbGRyZW4ubGFzdF0KKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpsaW5rX2RlZmluaXRpb24sIExJTktfREVGSU5JVElPTl9TVEFSVCkKKworCisgICAgICAjIFRoaXMgaGVscGVyIG1ldGhvZHMgYWRkcyB0aGUgYXBwcm9yaWF0ZSBhdHRyaWJ1dGVzIHRvIHRoZSBlbGVtZW50ICtlbCsgb2YgdHlwZSArYSsgb3IgK2ltZysKKyAgICAgICMgYW5kIHRoZSBlbGVtZW50IGl0c2VsZiB0byB0aGUgQHRyZWUuCisgICAgICBkZWYgYWRkX2xpbmsoZWwsIGhyZWYsIHRpdGxlLCBhbHRfdGV4dCA9IG5pbCwgaWFsID0gbmlsKQorICAgICAgICBlbC5vcHRpb25zWzppYWxdID0gaWFsCisgICAgICAgIHVwZGF0ZV9hdHRyX3dpdGhfaWFsKGVsLmF0dHIsIGlhbCkgaWYgaWFsCisgICAgICAgIGlmIGVsLnR5cGUgPT0gOmEKKyAgICAgICAgICBlbC5hdHRyWydocmVmJ10gPSBocmVmCisgICAgICAgIGVsc2UKKyAgICAgICAgICBlbC5hdHRyWydzcmMnXSA9IGhyZWYKKyAgICAgICAgICBlbC5hdHRyWydhbHQnXSA9IGFsdF90ZXh0CisgICAgICAgICAgZWwuY2hpbGRyZW4uY2xlYXIKKyAgICAgICAgZW5kCisgICAgICAgIGVsLmF0dHJbJ3RpdGxlJ10gPSB0aXRsZSBpZiB0aXRsZQorICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBlbAorICAgICAgZW5kCisKKyAgICAgIExJTktfQlJBQ0tFVF9TVE9QX1JFID0gLyhcXSl8IT9cWy8KKyAgICAgIExJTktfUEFSRU5fU1RPUF9SRSA9IC8oXCgpfChcKSl8XHMoPz1bJyJdKS8KKyAgICAgIExJTktfSU5MSU5FX0lEX1JFID0gL1xzKj9cWyhbXlxdXSspP1xdLworICAgICAgTElOS19JTkxJTkVfVElUTEVfUkUgPSAvXHMqPyhbIiddKSguKz8pXDFccyo/XCkvbQorICAgICAgTElOS19TVEFSVCA9IC8hP1xbKD89W15eXSkvCisKKyAgICAgICMgUGFyc2UgdGhlIGxpbmsgYXQgdGhlIGN1cnJlbnQgc2Nhbm5lciBwb3NpdGlvbi4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBwYXJzZSBub3JtYWwgbGlua3MgYXMKKyAgICAgICMgd2VsbCBhcyBpbWFnZSBsaW5rcy4KKyAgICAgIGRlZiBwYXJzZV9saW5rCisgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgIHJlc3VsdCA9IEBzcmMuc2NhbihMSU5LX1NUQVJUKQorICAgICAgICBjdXJfcG9zID0gQHNyYy5wb3MKKyAgICAgICAgc2F2ZWRfcG9zID0gQHNyYy5zYXZlX3BvcworCisgICAgICAgIGxpbmtfdHlwZSA9IChyZXN1bHQgPX4gL14hLyA/IDppbWcgOiA6YSkKKworICAgICAgICAjIG5vIG5lc3RlZCBsaW5rcyBhbGxvd2VkCisgICAgICAgIGlmIGxpbmtfdHlwZSA9PSA6YSAmJiAoQHRyZWUudHlwZSA9PSA6aW1nIHx8IEB0cmVlLnR5cGUgPT0gOmEgfHwgQHN0YWNrLmFueT8ge3x0LHN8IHQgJiYgKHQudHlwZSA9PSA6aW1nIHx8IHQudHlwZSA9PSA6YSl9KQorICAgICAgICAgIGFkZF90ZXh0KHJlc3VsdCkKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW5kCisgICAgICAgIGVsID0gRWxlbWVudC5uZXcobGlua190eXBlLCBuaWwsIG5pbCwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKQorCisgICAgICAgIGNvdW50ID0gMQorICAgICAgICBmb3VuZCA9IHBhcnNlX3NwYW5zKGVsLCBMSU5LX0JSQUNLRVRfU1RPUF9SRSkgZG8KKyAgICAgICAgICBjb3VudCA9IGNvdW50ICsgKEBzcmNbMV0gPyAtMSA6IDEpCisgICAgICAgICAgY291bnQgLSBlbC5jaGlsZHJlbi5zZWxlY3Qge3xjfCBjLnR5cGUgPT0gOmltZ30uc2l6ZSA9PSAwCisgICAgICAgIGVuZAorICAgICAgICB1bmxlc3MgZm91bmQKKyAgICAgICAgICBAc3JjLnJldmVydF9wb3Moc2F2ZWRfcG9zKQorICAgICAgICAgIGFkZF90ZXh0KHJlc3VsdCkKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW5kCisgICAgICAgIGFsdF90ZXh0ID0gZXh0cmFjdF9zdHJpbmcoY3VyX3Bvcy4uLkBzcmMucG9zLCBAc3JjKS5nc3ViKEVTQ0FQRURfQ0hBUlMsICdcMScpCisgICAgICAgIEBzcmMuc2NhbihMSU5LX0JSQUNLRVRfU1RPUF9SRSkKKworICAgICAgICAjIHJlZmVyZW5jZSBzdHlsZSBsaW5rIG9yIG5vIGxpbmsgdXJsCisgICAgICAgIGlmIEBzcmMuc2NhbihMSU5LX0lOTElORV9JRF9SRSkgfHwgIUBzcmMuY2hlY2soL1woLykKKyAgICAgICAgICBsaW5rX2lkID0gbm9ybWFsaXplX2xpbmtfaWQoQHNyY1sxXSB8fCBhbHRfdGV4dCkKKyAgICAgICAgICBpZiBAbGlua19kZWZzLmhhc19rZXk/KGxpbmtfaWQpCisgICAgICAgICAgICBhZGRfbGluayhlbCwgQGxpbmtfZGVmc1tsaW5rX2lkXVswXSwgQGxpbmtfZGVmc1tsaW5rX2lkXVsxXSwgYWx0X3RleHQsCisgICAgICAgICAgICAgICAgICAgICBAbGlua19kZWZzW2xpbmtfaWRdWzJdICYmIEBsaW5rX2RlZnNbbGlua19pZF1bMl0ub3B0aW9uc1s6aWFsXSkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB3YXJuaW5nKCJObyBsaW5rIGRlZmluaXRpb24gZm9yIGxpbmsgSUQgJyN7bGlua19pZH0nIGZvdW5kIG9uIGxpbmUgI3tzdGFydF9saW5lX251bWJlcn0iKQorICAgICAgICAgICAgQHNyYy5yZXZlcnRfcG9zKHNhdmVkX3BvcykKKyAgICAgICAgICAgIGFkZF90ZXh0KHJlc3VsdCkKKyAgICAgICAgICBlbmQKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBsaW5rIHVybCBpbiBwYXJlbnRoZXNlcworICAgICAgICBpZiBAc3JjLnNjYW4oL1woPCguKj8pPi8pCisgICAgICAgICAgbGlua191cmwgPSBAc3JjWzFdCisgICAgICAgICAgaWYgQHNyYy5zY2FuKC9cKS8pCisgICAgICAgICAgICBhZGRfbGluayhlbCwgbGlua191cmwsIG5pbCwgYWx0X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxpbmtfdXJsID0gJycKKyAgICAgICAgICBucl9vZl9icmFja2V0cyA9IDAKKyAgICAgICAgICB3aGlsZSB0ZW1wID0gQHNyYy5zY2FuX3VudGlsKExJTktfUEFSRU5fU1RPUF9SRSkKKyAgICAgICAgICAgIGxpbmtfdXJsIDw8IHRlbXAKKyAgICAgICAgICAgIGlmIEBzcmNbMl0KKyAgICAgICAgICAgICAgbnJfb2ZfYnJhY2tldHMgLT0gMQorICAgICAgICAgICAgICBicmVhayBpZiBucl9vZl9icmFja2V0cyA9PSAwCisgICAgICAgICAgICBlbHNpZiBAc3JjWzFdCisgICAgICAgICAgICAgIG5yX29mX2JyYWNrZXRzICs9IDEKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICAgIGxpbmtfdXJsID0gbGlua191cmxbMS4uLTJdCisgICAgICAgICAgbGlua191cmwuc3RyaXAhCisKKyAgICAgICAgICBpZiBucl9vZl9icmFja2V0cyA9PSAwCisgICAgICAgICAgICBhZGRfbGluayhlbCwgbGlua191cmwsIG5pbCwgYWx0X3RleHQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgaWYgQHNyYy5zY2FuKExJTktfSU5MSU5FX1RJVExFX1JFKQorICAgICAgICAgIGFkZF9saW5rKGVsLCBsaW5rX3VybCwgQHNyY1syXSwgYWx0X3RleHQpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAc3JjLnJldmVydF9wb3Moc2F2ZWRfcG9zKQorICAgICAgICAgIGFkZF90ZXh0KHJlc3VsdCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOmxpbmssIExJTktfU1RBUlQsICchP1xbJykKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vbGlzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2xpc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3YjQwMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2xpc3QucmIKQEAgLTAsMCArMSwyNTUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2JsYW5rX2xpbmUnCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZW9iJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2hvcml6b250YWxfcnVsZScKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9leHRlbnNpb25zJworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFBhcnNlcgorICAgIGNsYXNzIEtyYW1kb3duCisKKyAgICAgIExJU1RfSVRFTV9JQUwgPSAvXlxzKig/Olx7Oig/ISg/OiN7QUxEX0lEX05BTUV9KT86fFwvKSgje0FMRF9BTllfQ0hBUlN9KylcfSlccyovCisgICAgICBMSVNUX0lURU1fSUFMX0NIRUNLID0gL14je0xJU1RfSVRFTV9JQUx9P1xzKlxuLworCisgICAgICBQQVJTRV9GSVJTVF9MSVNUX0xJTkVfUkVHRVhQX0NBQ0hFID0gSGFzaC5uZXcgZG8gfGgsIGluZGVudGF0aW9ufAorICAgICAgICBpbmRlbnRfcmUgPSAvXiB7I3tpbmRlbnRhdGlvbn19LworICAgICAgICBjb250ZW50X3JlID0gL14oPzooPzpcdHwgezR9KXsje2luZGVudGF0aW9uIC8gNH19IHsje2luZGVudGF0aW9uICUgNH19fCg/Olx0fCB7NH0peyN7aW5kZW50YXRpb24gLyA0ICsgMX19KS4qXFMuKlxuLworICAgICAgICBsYXp5X3JlID0gLyg/IV4gezAsI3tbaW5kZW50YXRpb24sIDNdLm1pbn19KD86I3tJQUxfQkxPQ0t9fCN7TEFaWV9FTkRfSFRNTF9TVE9QfXwje0xBWllfRU5EX0hUTUxfU1RBUlR9KSkuKlxTLipcbi8KKworICAgICAgICBoW2luZGVudGF0aW9uXSA9IFtjb250ZW50X3JlLCBsYXp5X3JlLCBpbmRlbnRfcmVdCisgICAgICBlbmQKKworICAgICAgIyBVc2VkIGZvciBwYXJzaW5nIHRoZSBmaXJzdCBsaW5lIG9mIGEgbGlzdCBpdGVtIG9yIGEgZGVmaW5pdGlvbiwgaS5lLiB0aGUgbGluZSB3aXRoIGxpc3QgaXRlbQorICAgICAgIyBtYXJrZXIgb3IgdGhlIGRlZmluaXRpb24gbWFya2VyLgorICAgICAgZGVmIHBhcnNlX2ZpcnN0X2xpc3RfbGluZShpbmRlbnRhdGlvbiwgY29udGVudCkKKyAgICAgICAgaWYgY29udGVudCA9fiBzZWxmLmNsYXNzOjpMSVNUX0lURU1fSUFMX0NIRUNLCisgICAgICAgICAgaW5kZW50YXRpb24gPSA0CisgICAgICAgIGVsc2UKKyAgICAgICAgICB3aGlsZSBjb250ZW50ID1+IC9eICpcdC8KKyAgICAgICAgICAgIHRlbXAgPSBjb250ZW50LnNjYW4oL14gKi8pLmZpcnN0Lmxlbmd0aCArIGluZGVudGF0aW9uCisgICAgICAgICAgICBjb250ZW50LnN1YiEoL14oICopKFx0KykvKSB7JDEgPDwgIiAiKig0IC0gKHRlbXAgJSA0KSArICgkMi5sZW5ndGggLSAxKSo0KX0KKyAgICAgICAgICBlbmQKKyAgICAgICAgICBpbmRlbnRhdGlvbiArPSBjb250ZW50Wy9eICovXS5sZW5ndGgKKyAgICAgICAgZW5kCisgICAgICAgIGNvbnRlbnQuc3ViISgvXlxzKi8sICcnKQorCisgICAgICAgIFtjb250ZW50LCBpbmRlbnRhdGlvbiwgKlBBUlNFX0ZJUlNUX0xJU1RfTElORV9SRUdFWFBfQ0FDSEVbaW5kZW50YXRpb25dXQorICAgICAgZW5kCisKKworICAgICAgTElTVF9TVEFSVF9VTCA9IC9eKCN7T1BUX1NQQUNFfVsrKi1dKShbXHR8IF0uKj9cbikvCisgICAgICBMSVNUX1NUQVJUX09MID0gL14oI3tPUFRfU1BBQ0V9XGQrXC4pKFtcdHwgXS4qP1xuKS8KKyAgICAgIExJU1RfU1RBUlQgPSAvI3tMSVNUX1NUQVJUX1VMfXwje0xJU1RfU1RBUlRfT0x9LworCisgICAgICAjIFBhcnNlIHRoZSBvcmRlcmVkIG9yIHVub3JkZXJlZCBsaXN0IGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICAgICAgZGVmIHBhcnNlX2xpc3QKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgdHlwZSwgbGlzdF9zdGFydF9yZSA9IChAc3JjLmNoZWNrKExJU1RfU1RBUlRfVUwpID8gWzp1bCwgTElTVF9TVEFSVF9VTF0gOiBbOm9sLCBMSVNUX1NUQVJUX09MXSkKKyAgICAgICAgbGlzdCA9IG5ld19ibG9ja19lbCh0eXBlLCBuaWwsIG5pbCwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKQorCisgICAgICAgIGl0ZW0gPSBuaWwKKyAgICAgICAgY29udGVudF9yZSwgbGF6eV9yZSwgaW5kZW50X3JlID0gbmlsCisgICAgICAgIGVvYl9mb3VuZCA9IGZhbHNlCisgICAgICAgIG5lc3RlZF9saXN0X2ZvdW5kID0gZmFsc2UKKyAgICAgICAgbGFzdF9pc19ibGFuayA9IGZhbHNlCisgICAgICAgIHdoaWxlICFAc3JjLmVvcz8KKyAgICAgICAgICBzdGFydF9saW5lX251bWJlciA9IEBzcmMuY3VycmVudF9saW5lX251bWJlcgorICAgICAgICAgIGlmIGxhc3RfaXNfYmxhbmsgJiYgQHNyYy5jaGVjayhIUl9TVEFSVCkKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZWxzaWYgQHNyYy5zY2FuKEVPQl9NQVJLRVIpCisgICAgICAgICAgICBlb2JfZm91bmQgPSB0cnVlCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGVsc2lmIEBzcmMuc2NhbihsaXN0X3N0YXJ0X3JlKQorICAgICAgICAgICAgaXRlbSA9IEVsZW1lbnQubmV3KDpsaSwgbmlsLCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgICAgIGl0ZW0udmFsdWUsIGluZGVudGF0aW9uLCBjb250ZW50X3JlLCBsYXp5X3JlLCBpbmRlbnRfcmUgPSBwYXJzZV9maXJzdF9saXN0X2xpbmUoQHNyY1sxXS5sZW5ndGgsIEBzcmNbMl0pCisgICAgICAgICAgICBsaXN0LmNoaWxkcmVuIDw8IGl0ZW0KKworICAgICAgICAgICAgaXRlbS52YWx1ZS5zdWIhKHNlbGYuY2xhc3M6OkxJU1RfSVRFTV9JQUwpIGRvIHxtYXRjaHwKKyAgICAgICAgICAgICAgcGFyc2VfYXR0cmlidXRlX2xpc3QoJDEsIGl0ZW0ub3B0aW9uc1s6aWFsXSB8fD0ge30pCisgICAgICAgICAgICAgICcnCisgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgbGlzdF9zdGFydF9yZSA9ICh0eXBlID09IDp1bCA/IC9eKCB7MCwje1szLCBpbmRlbnRhdGlvbiAtIDFdLm1pbn19WysqLV0pKFtcdHwgXS4qP1xuKS8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXiggezAsI3tbMywgaW5kZW50YXRpb24gLSAxXS5taW59fVxkK1wuKShbXHR8IF0uKj9cbikvKQorICAgICAgICAgICAgbmVzdGVkX2xpc3RfZm91bmQgPSAoaXRlbS52YWx1ZSA9fiBMSVNUX1NUQVJUKQorICAgICAgICAgICAgbGFzdF9pc19ibGFuayA9IGZhbHNlCisgICAgICAgICAgICBpdGVtLnZhbHVlID0gW2l0ZW0udmFsdWVdCisgICAgICAgICAgZWxzaWYgKHJlc3VsdCA9IEBzcmMuc2Nhbihjb250ZW50X3JlKSkgfHwgKCFsYXN0X2lzX2JsYW5rICYmIChyZXN1bHQgPSBAc3JjLnNjYW4obGF6eV9yZSkpKQorICAgICAgICAgICAgcmVzdWx0LnN1YiEoL14oXHQrKS8pIHsgIiAiICogNCAqICQxLmxlbmd0aCB9CisgICAgICAgICAgICBpbmRlbnRhdGlvbl9mb3VuZCA9IHJlc3VsdC5zdWIhKGluZGVudF9yZSwgJycpCisgICAgICAgICAgICBpZiAhbmVzdGVkX2xpc3RfZm91bmQgJiYgaW5kZW50YXRpb25fZm91bmQgJiYgcmVzdWx0ID1+IExJU1RfU1RBUlQKKyAgICAgICAgICAgICAgaXRlbS52YWx1ZSA8PCAnJworICAgICAgICAgICAgICBuZXN0ZWRfbGlzdF9mb3VuZCA9IHRydWUKKyAgICAgICAgICAgIGVsc2lmIG5lc3RlZF9saXN0X2ZvdW5kICYmICFpbmRlbnRhdGlvbl9mb3VuZCAmJiByZXN1bHQgPX4gTElTVF9TVEFSVAorICAgICAgICAgICAgICByZXN1bHQgPSAiICIgKiAoaW5kZW50YXRpb24gKyA0KSA8PCByZXN1bHQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgaXRlbS52YWx1ZS5sYXN0IDw8IHJlc3VsdAorICAgICAgICAgICAgbGFzdF9pc19ibGFuayA9IGZhbHNlCisgICAgICAgICAgZWxzaWYgcmVzdWx0ID0gQHNyYy5zY2FuKEJMQU5LX0xJTkUpCisgICAgICAgICAgICBuZXN0ZWRfbGlzdF9mb3VuZCA9IHRydWUKKyAgICAgICAgICAgIGxhc3RfaXNfYmxhbmsgPSB0cnVlCisgICAgICAgICAgICBpdGVtLnZhbHVlLmxhc3QgPDwgcmVzdWx0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgbGlzdAorCisgICAgICAgIGxhc3QgPSBuaWwKKyAgICAgICAgbGlzdC5jaGlsZHJlbi5lYWNoIGRvIHxpdHwKKyAgICAgICAgICB0ZW1wID0gRWxlbWVudC5uZXcoOnRlbXAsIG5pbCwgbmlsLCA6bG9jYXRpb24gPT4gaXQub3B0aW9uc1s6bG9jYXRpb25dKQorCisgICAgICAgICAgZW52ID0gc2F2ZV9lbnYKKyAgICAgICAgICBsb2NhdGlvbiA9IGl0Lm9wdGlvbnNbOmxvY2F0aW9uXQorICAgICAgICAgIGl0LnZhbHVlLmVhY2ggZG8gfHZhbHwKKyAgICAgICAgICAgIEBzcmMgPSA6OktyYW1kb3duOjpVdGlsczo6U3RyaW5nU2Nhbm5lci5uZXcodmFsLCBsb2NhdGlvbikKKyAgICAgICAgICAgIHBhcnNlX2Jsb2Nrcyh0ZW1wKQorICAgICAgICAgICAgbG9jYXRpb24gPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICByZXN0b3JlX2VudihlbnYpCisKKyAgICAgICAgICBpdC5jaGlsZHJlbiA9IHRlbXAuY2hpbGRyZW4KKyAgICAgICAgICBpdC52YWx1ZSA9IG5pbAorICAgICAgICAgIG5leHQgaWYgaXQuY2hpbGRyZW4uc2l6ZSA9PSAwCisKKyAgICAgICAgICAjIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiBFT0IgbWFya2VyIGlzIGluc2VydGVkIGJ5IGEgYmxvY2sgSUFMIGZvciB0aGUgZmlyc3QgcGFyYWdyYXBoCisgICAgICAgICAgaXQuY2hpbGRyZW4uZGVsZXRlX2F0KDEpIGlmIGl0LmNoaWxkcmVuLmZpcnN0LnR5cGUgPT0gOnAgJiYKKyAgICAgICAgICAgIGl0LmNoaWxkcmVuLmxlbmd0aCA+PSAyICYmIGl0LmNoaWxkcmVuWzFdLnR5cGUgPT0gOmVvYiAmJiBpdC5jaGlsZHJlbi5maXJzdC5vcHRpb25zWzppYWxdCisKKyAgICAgICAgICBpZiBpdC5jaGlsZHJlbi5maXJzdC50eXBlID09IDpwICYmCisgICAgICAgICAgICAgIChpdC5jaGlsZHJlbi5sZW5ndGggPCAyIHx8IGl0LmNoaWxkcmVuWzFdLnR5cGUgIT0gOmJsYW5rIHx8CisgICAgICAgICAgICAgICAoaXQgPT0gbGlzdC5jaGlsZHJlbi5sYXN0ICYmIGl0LmNoaWxkcmVuLmxlbmd0aCA9PSAyICYmICFlb2JfZm91bmQpKSAmJgorICAgICAgICAgICAgICAobGlzdC5jaGlsZHJlbi5sYXN0ICE9IGl0IHx8IGxpc3QuY2hpbGRyZW4uc2l6ZSA9PSAxIHx8CisgICAgICAgICAgICAgICBsaXN0LmNoaWxkcmVuWzAuLi0yXS5hbnk/IHt8Y2l0fCAhY2l0LmNoaWxkcmVuLmZpcnN0IHx8IGNpdC5jaGlsZHJlbi5maXJzdC50eXBlICE9IDpwIHx8IGNpdC5jaGlsZHJlbi5maXJzdC5vcHRpb25zWzp0cmFuc3BhcmVudF19KQorICAgICAgICAgICAgaXQuY2hpbGRyZW4uZmlyc3QuY2hpbGRyZW4uZmlyc3QudmFsdWUgPDwgIlxuIiBpZiBpdC5jaGlsZHJlbi5zaXplID4gMSAmJiBpdC5jaGlsZHJlblsxXS50eXBlICE9IDpibGFuaworICAgICAgICAgICAgaXQuY2hpbGRyZW4uZmlyc3Qub3B0aW9uc1s6dHJhbnNwYXJlbnRdID0gdHJ1ZQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgaWYgaXQuY2hpbGRyZW4ubGFzdC50eXBlID09IDpibGFuaworICAgICAgICAgICAgbGFzdCA9IGl0LmNoaWxkcmVuLnBvcAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxhc3QgPSBuaWwKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgbGFzdCBpZiAhbGFzdC5uaWw/ICYmICFlb2JfZm91bmQKKworICAgICAgICB0cnVlCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOmxpc3QsIExJU1RfU1RBUlQpCisKKworICAgICAgREVGSU5JVElPTl9MSVNUX1NUQVJUID0gL14oI3tPUFRfU1BBQ0V9OikoW1x0fCBdLio/XG4pLworCisgICAgICAjIFBhcnNlIHRoZSBvcmRlcmVkIG9yIHVub3JkZXJlZCBsaXN0IGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICAgICAgZGVmIHBhcnNlX2RlZmluaXRpb25fbGlzdAorICAgICAgICBjaGlsZHJlbiA9IEB0cmVlLmNoaWxkcmVuCisgICAgICAgIGlmICFjaGlsZHJlbi5sYXN0IHx8IChjaGlsZHJlbi5sZW5ndGggPT0gMSAmJiBjaGlsZHJlbi5sYXN0LnR5cGUgIT0gOnAgKSB8fAorICAgICAgICAgICAgKGNoaWxkcmVuLmxlbmd0aCA+PSAyICYmIGNoaWxkcmVuWy0xXS50eXBlICE9IDpwICYmIChjaGlsZHJlblstMV0udHlwZSAhPSA6YmxhbmsgfHwgY2hpbGRyZW5bLTFdLnZhbHVlICE9ICJcbiIgfHwgY2hpbGRyZW5bLTJdLnR5cGUgIT0gOnApKQorICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICBlbmQKKworICAgICAgICBmaXJzdF9hc19wYXJhID0gZmFsc2UKKyAgICAgICAgZGVmbGlzdCA9IG5ld19ibG9ja19lbCg6ZGwpCisgICAgICAgIHBhcmEgPSBAdHJlZS5jaGlsZHJlbi5wb3AKKyAgICAgICAgaWYgcGFyYS50eXBlID09IDpibGFuaworICAgICAgICAgIHBhcmEgPSBAdHJlZS5jaGlsZHJlbi5wb3AKKyAgICAgICAgICBmaXJzdF9hc19wYXJhID0gdHJ1ZQorICAgICAgICBlbmQKKyAgICAgICAgZGVmbGlzdC5vcHRpb25zWzpsb2NhdGlvbl0gPSBwYXJhLm9wdGlvbnNbOmxvY2F0aW9uXSAjIHRha2UgbG9jYXRpb24gZnJvbSBwcmVjZWRpbmcgcGFyYSB3aGljaCBpcyB0aGUgZmlyc3QgZGVmaW5pdGlvbiB0ZXJtCisgICAgICAgIHBhcmEuY2hpbGRyZW4uZmlyc3QudmFsdWUuc3BsaXQoL1xuLykuZWFjaCBkbyB8dGVybXwKKyAgICAgICAgICBlbCA9IEVsZW1lbnQubmV3KDpkdCwgbmlsLCBuaWwsIDpsb2NhdGlvbiA9PiBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIpCisgICAgICAgICAgdGVybS5zdWIhKHNlbGYuY2xhc3M6OkxJU1RfSVRFTV9JQUwpIGRvCisgICAgICAgICAgICBwYXJzZV9hdHRyaWJ1dGVfbGlzdCgkMSwgZWwub3B0aW9uc1s6aWFsXSB8fD0ge30pCisgICAgICAgICAgICAnJworICAgICAgICAgIGVuZAorICAgICAgICAgIGVsLm9wdGlvbnNbOnJhd190ZXh0XSA9IHRlcm0KKyAgICAgICAgICBlbC5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6cmF3X3RleHQsIHRlcm0pCisgICAgICAgICAgZGVmbGlzdC5jaGlsZHJlbiA8PCBlbAorICAgICAgICBlbmQKKyAgICAgICAgZGVmbGlzdC5vcHRpb25zWzppYWxdID0gcGFyYS5vcHRpb25zWzppYWxdCisKKyAgICAgICAgaXRlbSA9IG5pbAorICAgICAgICBjb250ZW50X3JlLCBsYXp5X3JlLCBpbmRlbnRfcmUgPSBuaWwKKyAgICAgICAgZGVmX3N0YXJ0X3JlID0gREVGSU5JVElPTl9MSVNUX1NUQVJUCisgICAgICAgIGxhc3RfaXNfYmxhbmsgPSBmYWxzZQorICAgICAgICB3aGlsZSAhQHNyYy5lb3M/CisgICAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgICBpZiBAc3JjLnNjYW4oZGVmX3N0YXJ0X3JlKQorICAgICAgICAgICAgaXRlbSA9IEVsZW1lbnQubmV3KDpkZCwgbmlsLCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgICAgIGl0ZW0ub3B0aW9uc1s6Zmlyc3RfYXNfcGFyYV0gPSBmaXJzdF9hc19wYXJhCisgICAgICAgICAgICBpdGVtLnZhbHVlLCBpbmRlbnRhdGlvbiwgY29udGVudF9yZSwgbGF6eV9yZSwgaW5kZW50X3JlID0gcGFyc2VfZmlyc3RfbGlzdF9saW5lKEBzcmNbMV0ubGVuZ3RoLCBAc3JjWzJdKQorICAgICAgICAgICAgZGVmbGlzdC5jaGlsZHJlbiA8PCBpdGVtCisKKyAgICAgICAgICAgIGl0ZW0udmFsdWUuc3ViIShzZWxmLmNsYXNzOjpMSVNUX0lURU1fSUFMKSBkbyB8bWF0Y2h8CisgICAgICAgICAgICAgIHBhcnNlX2F0dHJpYnV0ZV9saXN0KCQxLCBpdGVtLm9wdGlvbnNbOmlhbF0gfHw9IHt9KQorICAgICAgICAgICAgICAnJworICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgIGRlZl9zdGFydF9yZSA9IC9eKCB7MCwje1szLCBpbmRlbnRhdGlvbiAtIDFdLm1pbn19OikoW1x0fCBdLio/XG4pLworICAgICAgICAgICAgZmlyc3RfYXNfcGFyYSA9IGZhbHNlCisgICAgICAgICAgICBsYXN0X2lzX2JsYW5rID0gZmFsc2UKKyAgICAgICAgICBlbHNpZiBAc3JjLmNoZWNrKEVPQl9NQVJLRVIpCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGVsc2lmIChyZXN1bHQgPSBAc3JjLnNjYW4oY29udGVudF9yZSkpIHx8ICghbGFzdF9pc19ibGFuayAmJiAocmVzdWx0ID0gQHNyYy5zY2FuKGxhenlfcmUpKSkKKyAgICAgICAgICAgIHJlc3VsdC5zdWIhKC9eKFx0KykvKSB7ICIgIiooJDEgPyA0KiQxLmxlbmd0aCA6IDApIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdWIhKGluZGVudF9yZSwgJycpCisgICAgICAgICAgICBpdGVtLnZhbHVlIDw8IHJlc3VsdAorICAgICAgICAgICAgZmlyc3RfYXNfcGFyYSA9IGZhbHNlCisgICAgICAgICAgICBsYXN0X2lzX2JsYW5rID0gZmFsc2UKKyAgICAgICAgICBlbHNpZiByZXN1bHQgPSBAc3JjLnNjYW4oQkxBTktfTElORSkKKyAgICAgICAgICAgIGZpcnN0X2FzX3BhcmEgPSB0cnVlCisgICAgICAgICAgICBpdGVtLnZhbHVlIDw8IHJlc3VsdAorICAgICAgICAgICAgbGFzdF9pc19ibGFuayA9IHRydWUKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBsYXN0ID0gbmlsCisgICAgICAgIGRlZmxpc3QuY2hpbGRyZW4uZWFjaCBkbyB8aXR8CisgICAgICAgICAgbmV4dCBpZiBpdC50eXBlID09IDpkdAorCisgICAgICAgICAgcGFyc2VfYmxvY2tzKGl0LCBpdC52YWx1ZSkKKyAgICAgICAgICBpdC52YWx1ZSA9IG5pbAorICAgICAgICAgIG5leHQgaWYgaXQuY2hpbGRyZW4uc2l6ZSA9PSAwCisKKyAgICAgICAgICBpZiBpdC5jaGlsZHJlbi5sYXN0LnR5cGUgPT0gOmJsYW5rCisgICAgICAgICAgICBsYXN0ID0gaXQuY2hpbGRyZW4ucG9wCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbGFzdCA9IG5pbAorICAgICAgICAgIGVuZAorCisgICAgICAgICAgaWYgaXQuY2hpbGRyZW4uZmlyc3QgJiYgaXQuY2hpbGRyZW4uZmlyc3QudHlwZSA9PSA6cCAmJiAhaXQub3B0aW9ucy5kZWxldGUoOmZpcnN0X2FzX3BhcmEpCisgICAgICAgICAgICBpdC5jaGlsZHJlbi5maXJzdC5jaGlsZHJlbi5maXJzdC52YWx1ZSA8PCAiXG4iIGlmIGl0LmNoaWxkcmVuLnNpemUgPiAxCisgICAgICAgICAgICBpdC5jaGlsZHJlbi5maXJzdC5vcHRpb25zWzp0cmFuc3BhcmVudF0gPSB0cnVlCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIEB0cmVlLmNoaWxkcmVuLmxlbmd0aCA+PSAxICYmIEB0cmVlLmNoaWxkcmVuLmxhc3QudHlwZSA9PSA6ZGwKKyAgICAgICAgICBAdHJlZS5jaGlsZHJlblstMV0uY2hpbGRyZW4uY29uY2F0KGRlZmxpc3QuY2hpbGRyZW4pCisgICAgICAgIGVsc2lmIEB0cmVlLmNoaWxkcmVuLmxlbmd0aCA+PSAyICYmIEB0cmVlLmNoaWxkcmVuWy0xXS50eXBlID09IDpibGFuayAmJiBAdHJlZS5jaGlsZHJlblstMl0udHlwZSA9PSA6ZGwKKyAgICAgICAgICBAdHJlZS5jaGlsZHJlbi5wb3AKKyAgICAgICAgICBAdHJlZS5jaGlsZHJlblstMV0uY2hpbGRyZW4uY29uY2F0KGRlZmxpc3QuY2hpbGRyZW4pCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBkZWZsaXN0CisgICAgICAgIGVuZAorCisgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IGxhc3QgaWYgIWxhc3QubmlsPworCisgICAgICAgIHRydWUKKyAgICAgIGVuZAorICAgICAgZGVmaW5lX3BhcnNlcig6ZGVmaW5pdGlvbl9saXN0LCBERUZJTklUSU9OX0xJU1RfU1RBUlQpCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL21hdGgucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9tYXRoLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NWM0OTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9tYXRoLnJiCkBAIC0wLDAgKzEsNTQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2Jsb2NrX2JvdW5kYXJ5JworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFBhcnNlcgorICAgIGNsYXNzIEtyYW1kb3duCisKKyAgICAgIEJMT0NLX01BVEhfU1RBUlQgPSAvXiN7T1BUX1NQQUNFfShcXCk/XCRcJCguKj8pXCRcJChccyo/XG4pPy9tCisKKyAgICAgICMgUGFyc2UgdGhlIG1hdGggYmxvY2sgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfYmxvY2tfbWF0aAorICAgICAgICBzdGFydF9saW5lX251bWJlciA9IEBzcmMuY3VycmVudF9saW5lX251bWJlcgorICAgICAgICBpZiAhYWZ0ZXJfYmxvY2tfYm91bmRhcnk/CisgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgIGVsc2lmIEBzcmNbMV0KKyAgICAgICAgICBAc3JjLnNjYW4oL14je09QVF9TUEFDRX1cXC8pIGlmIEBzcmNbM10KKyAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgZW5kCisKKyAgICAgICAgc2F2ZWRfcG9zID0gQHNyYy5zYXZlX3BvcworICAgICAgICBAc3JjLnBvcyArPSBAc3JjLm1hdGNoZWRfc2l6ZQorICAgICAgICBkYXRhID0gQHNyY1syXS5zdHJpcAorICAgICAgICBpZiBiZWZvcmVfYmxvY2tfYm91bmRhcnk/CisgICAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgbmV3X2Jsb2NrX2VsKDptYXRoLCBkYXRhLCBuaWwsIDpjYXRlZ29yeSA9PiA6YmxvY2ssIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgICB0cnVlCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAc3JjLnJldmVydF9wb3Moc2F2ZWRfcG9zKQorICAgICAgICAgIGZhbHNlCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpibG9ja19tYXRoLCBCTE9DS19NQVRIX1NUQVJUKQorCisKKyAgICAgIElOTElORV9NQVRIX1NUQVJUID0gL1wkXCQoLio/KVwkXCQvbQorCisgICAgICAjIFBhcnNlIHRoZSBpbmxpbmUgbWF0aCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV9pbmxpbmVfbWF0aAorICAgICAgICBzdGFydF9saW5lX251bWJlciA9IEBzcmMuY3VycmVudF9saW5lX251bWJlcgorICAgICAgICBAc3JjLnBvcyArPSBAc3JjLm1hdGNoZWRfc2l6ZQorICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6bWF0aCwgQHNyY1sxXS5zdHJpcCwgbmlsLCA6Y2F0ZWdvcnkgPT4gOnNwYW4sIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgIGVuZAorICAgICAgZGVmaW5lX3BhcnNlcig6aW5saW5lX21hdGgsIElOTElORV9NQVRIX1NUQVJULCAnXCQnKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9wYXJhZ3JhcGgucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9wYXJhZ3JhcGgucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZTJmNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL3BhcmFncmFwaC5yYgpAQCAtMCwwICsxLDU1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKK3JlcXVpcmUgJ2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9ibGFua19saW5lJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2V4dGVuc2lvbnMnCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vZW9iJworcmVxdWlyZSAna3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL2xpc3QnCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vaHRtbCcKKworbW9kdWxlIEtyYW1kb3duCisgIG1vZHVsZSBQYXJzZXIKKyAgICBjbGFzcyBLcmFtZG93bgorCisgICAgICBMQVpZX0VORF9IVE1MX1NQQU5fRUxFTUVOVFMgPSBIVE1MX1NQQU5fRUxFTUVOVFMgKyAld3tzY3JpcHR9CisgICAgICBMQVpZX0VORF9IVE1MX1NUQVJUID0gLzwoPz4oPyEoPzoje0xBWllfRU5EX0hUTUxfU1BBTl9FTEVNRU5UUy5qb2luKCd8Jyl9KVxiKSN7UkVYTUw6OlBhcnNlcnM6OkJhc2VQYXJzZXI6OlVOQU1FX1NUUn0pLworICAgICAgTEFaWV9FTkRfSFRNTF9TVE9QID0gLzxcLyg/ISg/OiN7TEFaWV9FTkRfSFRNTF9TUEFOX0VMRU1FTlRTLmpvaW4oJ3wnKX0pXGIpI3tSRVhNTDo6UGFyc2Vyczo6QmFzZVBhcnNlcjo6VU5BTUVfU1RSfVxzKj4vbQorCisgICAgICBMQVpZX0VORCA9IC8je0JMQU5LX0xJTkV9fCN7SUFMX0JMT0NLX1NUQVJUfXwje0VPQl9NQVJLRVJ9fF4je09QVF9TUEFDRX0je0xBWllfRU5EX0hUTUxfU1RPUH18XiN7T1BUX1NQQUNFfSN7TEFaWV9FTkRfSFRNTF9TVEFSVH18XFovCisKKyAgICAgIFBBUkFHUkFQSF9TVEFSVCA9IC9eI3tPUFRfU1BBQ0V9W14gXHRdLio/XG4vCisgICAgICBQQVJBR1JBUEhfTUFUQ0ggPSAvXi4qP1xuLworICAgICAgUEFSQUdSQVBIX0VORCA9IC8je0xBWllfRU5EfXwje0RFRklOSVRJT05fTElTVF9TVEFSVH0vCisKKyAgICAgICMgUGFyc2UgdGhlIHBhcmFncmFwaCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV9wYXJhZ3JhcGgKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgcmVzdWx0ID0gQHNyYy5zY2FuKFBBUkFHUkFQSF9NQVRDSCkKKyAgICAgICAgd2hpbGUgIUBzcmMubWF0Y2g/KHBhcmFncmFwaF9lbmQpCisgICAgICAgICAgcmVzdWx0IDw8IEBzcmMuc2NhbihQQVJBR1JBUEhfTUFUQ0gpCisgICAgICAgIGVuZAorICAgICAgICByZXN1bHQucnN0cmlwIQorICAgICAgICBpZiBAdHJlZS5jaGlsZHJlbi5sYXN0ICYmIEB0cmVlLmNoaWxkcmVuLmxhc3QudHlwZSA9PSA6cAorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuLmxhc3QuY2hpbGRyZW4uZmlyc3QudmFsdWUgPDwgIlxuIiA8PCByZXN1bHQKKyAgICAgICAgZWxzZQorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IG5ld19ibG9ja19lbCg6cCwgbmlsLCBuaWwsIDpsb2NhdGlvbiA9PiBzdGFydF9saW5lX251bWJlcikKKyAgICAgICAgICByZXN1bHQubHN0cmlwIQorICAgICAgICAgIGFkZF90ZXh0KHJlc3VsdCwgQHRyZWUuY2hpbGRyZW4ubGFzdCkKKyAgICAgICAgZW5kCisgICAgICAgIHRydWUKKyAgICAgIGVuZAorICAgICAgZGVmaW5lX3BhcnNlcig6cGFyYWdyYXBoLCBQQVJBR1JBUEhfU1RBUlQpCisKKyAgICAgIGRlZiBwYXJhZ3JhcGhfZW5kCisgICAgICAgIHNlbGYuY2xhc3M6OlBBUkFHUkFQSF9FTkQKKyAgICAgIGVuZAorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9zbWFydF9xdW90ZXMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi9zbWFydF9xdW90ZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxZjAzOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL3NtYXJ0X3F1b3Rlcy5yYgpAQCAtMCwwICsxLDE3NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworIy0tCisjIFBhcnRzIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gY29kZSBmcm9tIFJ1YnlQYW50czoKKyMKKyMgPSBSdWJ5UGFudHMgLS0gU21hcnR5UGFudHMgcG9ydGVkIHRvIFJ1YnkKKyMKKyMgUG9ydGVkIGJ5IENocmlzdGlhbiBOZXVraXJjaGVuIDxtYWlsdG86Y2huZXVraXJjaGVuQGdtYWlsLmNvbT4KKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQgQ2hyaXN0aWFuIE5ldWtpcmNoZW4KKyMKKyMgSW5jb29wb3JhdGVzIGlkZWFzLCBjb21tZW50cyBhbmQgZG9jdW1lbnRhdGlvbiBieSBDaGFkIE1pbGxlcgorIyAgIENvcHlyaWdodCAoQykgMjAwNCBDaGFkIE1pbGxlcgorIworIyBPcmlnaW5hbCBTbWFydHlQYW50cyBieSBKb2huIEdydWJlcgorIyAgIENvcHlyaWdodCAoQykgMjAwMyBKb2huIEdydWJlcgorIworIworIyA9IFJ1YnlQYW50cyAtLSBTbWFydHlQYW50cyBwb3J0ZWQgdG8gUnVieQorIworIworIyBbc25pcF0KKyMKKyMgPT0gQXV0aG9ycworIworIyBKb2huIEdydWJlciBkaWQgYWxsIG9mIHRoZSBoYXJkIHdvcmsgb2Ygd3JpdGluZyB0aGlzIHNvZnR3YXJlIGluCisjIFBlcmwgZm9yIE1vdmFibGUgVHlwZSBhbmQgYWxtb3N0IGFsbCBvZiB0aGlzIHVzZWZ1bCBkb2N1bWVudGF0aW9uLgorIyBDaGFkIE1pbGxlciBwb3J0ZWQgaXQgdG8gUHl0aG9uIHRvIHVzZSB3aXRoIFB5Ymxvc3hvbS4KKyMKKyMgQ2hyaXN0aWFuIE5ldWtpcmNoZW4gcHJvdmlkZWQgdGhlIFJ1YnkgcG9ydCwgYXMgYSBnZW5lcmFsLXB1cnBvc2UKKyMgbGlicmFyeSB0aGF0IGZvbGxvd3MgdGhlICpDbG90aCBBUEkuCisjCisjCisjID09IENvcHlyaWdodCBhbmQgTGljZW5zZQorIworIyA9PT0gU21hcnR5UGFudHMgbGljZW5zZToKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzIEpvaG4gR3J1YmVyCisjIChodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0KQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjCisjICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyMgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjICAgZGlzdHJpYnV0aW9uLgorIworIyAqIE5laXRoZXIgdGhlIG5hbWUgIlNtYXJ0eVBhbnRzIiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyMgICBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIyAiYXMgaXMiIGFuZCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdAorIyBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcworIyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuIEluIG5vIGV2ZW50IHNoYWxsIHRoZQorIyBjb3B5cmlnaHQgb3duZXIgb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsCisjIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIChpbmNsdWRpbmcsCisjIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKyMgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlcgorIyBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKKyMgbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4KKyMgYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlCisjIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorIworIyA9PT0gUnVieVBhbnRzIGxpY2Vuc2UKKyMKKyMgUnVieVBhbnRzIGlzIGEgZGVyaXZhdGl2ZSB3b3JrIG9mIFNtYXJ0eVBhbnRzIGFuZCBzbWFydHlwYW50cy5weS4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIworIyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisjICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyAgIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycworIyAiYXMgaXMiIGFuZCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdAorIyBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcworIyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuIEluIG5vIGV2ZW50IHNoYWxsIHRoZQorIyBjb3B5cmlnaHQgb3duZXIgb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsCisjIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIChpbmNsdWRpbmcsCisjIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKyMgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlcgorIyBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKKyMgbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4KKyMgYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlCisjIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorIworIyA9PSBMaW5rcworIworIyBKb2huIEdydWJlcjo6IGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQKKyMgU21hcnR5UGFudHM6OiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL3NtYXJ0eXBhbnRzCisjCisjIENoYWQgTWlsbGVyOjogaHR0cDovL3dlYi5jaGFkLm9yZworIworIyBDaHJpc3RpYW4gTmV1a2lyY2hlbjo6IGh0dHA6Ly9rcm9uYXZpdGEuZGUvY2hyaXMKKyMKKyMrKworIworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFBhcnNlcgorICAgIGNsYXNzIEtyYW1kb3duCisKKyAgICAgIFNRX1BVTkNUID0gJ1shIiNcJFwlXCcoKSorLFwtLlwvOjs8PT4/XEBcW1xcXFxcXVxeX2B7fH1+XScKKyAgICAgIFNRX0NMT1NFID0gJSFbXlwgXFxcXFx0XHJcblxcW3soLV0hCisKKyAgICAgIFNRX1JVTEVTID0gWworICAgICAgICAgICAgICAgICAgWy8oInwnKSg/PVtfKl17MSwyfVxTKS8sIFs6bHF1b3RlMV1dLAorICAgICAgICAgICAgICAgICAgWy8oInwnKSg/PSN7U1FfUFVOQ1R9KD8hXC5cLilcQikvLCBbOnJxdW90ZTFdXSwKKyAgICAgICAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBkb3VibGUgc2V0cyBvZiBxdW90ZXMsIGUuZy46CisgICAgICAgICAgICAgICAgICAjICAgPHA+SGUgc2FpZCwgIidRdW90ZWQnIHdvcmRzIGluIGEgbGFyZ2VyIHF1b3RlLiI8L3A+CisgICAgICAgICAgICAgICAgICBbLyhccz8pIicoPz1cdykvLCBbMSwgOmxkcXVvLCA6bHNxdW9dXSwKKyAgICAgICAgICAgICAgICAgIFsvKFxzPyknIig/PVx3KS8sIFsxLCA6bHNxdW8sIDpsZHF1b11dLAorICAgICAgICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIGRlY2FkZSBhYmJyZXZpYXRpb25zICh0aGUgJzgwcyk6CisgICAgICAgICAgICAgICAgICBbLyhccz8pJyg/PVxkXGRzKS8sIFsxLCA6cnNxdW9dXSwKKworICAgICAgICAgICAgICAgICAgIyBHZXQgbW9zdCBvcGVuaW5nIHNpbmdsZS9kb3VibGUgcXVvdGVzOgorICAgICAgICAgICAgICAgICAgWy8oXHMpKCd8IikoPz1cdykvLCBbMSwgOmxxdW90ZTJdXSwKKyAgICAgICAgICAgICAgICAgICMgU2luZ2xlL2RvdWJsZSBjbG9zaW5nIHF1b3RlczoKKyAgICAgICAgICAgICAgICAgIFsvKCN7U1FfQ0xPU0V9KSgnfCIpLywgWzEsIDpycXVvdGUyXV0sCisgICAgICAgICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgZS5nLiAiPGk+Q3VzdGVyPC9pPidzIExhc3QgU3RhbmQuIgorICAgICAgICAgICAgICAgICAgWy8oInwnKSg/PVxzfHNcYnwkKS8sIFs6cnF1b3RlMV1dLAorICAgICAgICAgICAgICAgICAgIyBBbnkgcmVtYWluaW5nIHNpbmdsZSBxdW90ZXMgc2hvdWxkIGJlIG9wZW5pbmcgb25lczoKKyAgICAgICAgICAgICAgICAgIFsvKC4/KScvbSwgWzEsIDpsc3F1b11dLAorICAgICAgICAgICAgICAgICAgWy8oLj8pIi9tLCBbMSwgOmxkcXVvXV0sCisgICAgICAgICAgICAgICAgIF0gIyciCisKKyAgICAgIFNRX1NVQlNUUyA9IHsKKyAgICAgICAgWzpycXVvdGUxLCAnIiddID0+IDpyZHF1bywKKyAgICAgICAgWzpycXVvdGUxLCAiJyJdID0+IDpyc3F1bywKKyAgICAgICAgWzpycXVvdGUyLCAnIiddID0+IDpyZHF1bywKKyAgICAgICAgWzpycXVvdGUyLCAiJyJdID0+IDpyc3F1bywKKyAgICAgICAgWzpscXVvdGUxLCAnIiddID0+IDpsZHF1bywKKyAgICAgICAgWzpscXVvdGUxLCAiJyJdID0+IDpsc3F1bywKKyAgICAgICAgWzpscXVvdGUyLCAnIiddID0+IDpsZHF1bywKKyAgICAgICAgWzpscXVvdGUyLCAiJyJdID0+IDpsc3F1bywKKyAgICAgIH0KKyAgICAgIFNNQVJUX1FVT1RFU19SRSA9IC9bXlxcXT9bIiddLworCisgICAgICAjIFBhcnNlIHRoZSBzbWFydCBxdW90ZXMgYXQgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV9zbWFydF9xdW90ZXMKKyAgICAgICAgc3RhcnRfbGluZV9udW1iZXIgPSBAc3JjLmN1cnJlbnRfbGluZV9udW1iZXIKKyAgICAgICAgc3Vic3RzID0gU1FfUlVMRVMuZmluZCB7fHJlZywgc3Vic3R8IEBzcmMuc2NhbihyZWcpfVsxXQorICAgICAgICBzdWJzdHMuZWFjaCBkbyB8c3Vic3R8CisgICAgICAgICAgaWYgc3Vic3Qua2luZF9vZj8oSW50ZWdlcikKKyAgICAgICAgICAgIGFkZF90ZXh0KEBzcmNbc3Vic3RdKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbCA9IFNRX1NVQlNUU1tbc3Vic3QsIEBzcmNbc3Vic3QudG9fc1stMSwxXS50b19pXV1dIHx8IHN1YnN0CisgICAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6c21hcnRfcXVvdGUsIHZhbCwgbmlsLCA6bG9jYXRpb24gPT4gc3RhcnRfbGluZV9udW1iZXIpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDpzbWFydF9xdW90ZXMsIFNNQVJUX1FVT1RFU19SRSwgJ1teXFxcXF0/WyJcJ10nKQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi90YWJsZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vcGFyc2VyL2tyYW1kb3duL3RhYmxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTM3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi90YWJsZS5yYgpAQCAtMCwwICsxLDE3MyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXIva3JhbWRvd24vYmxvY2tfYm91bmRhcnknCisKK21vZHVsZSBLcmFtZG93bgorICBtb2R1bGUgUGFyc2VyCisgICAgY2xhc3MgS3JhbWRvd24KKworICAgICAgVEFCTEVfU0VQX0xJTkUgPSAvXihbK3w6IFx0LV0qPy1bK3w6IFx0LV0qPylbIFx0XSpcbi8KKyAgICAgIFRBQkxFX0hTRVBfQUxJR04gPSAvWyBcdF0/KDo/KS0rKDo/KVsgXHRdPy8KKyAgICAgIFRBQkxFX0ZTRVBfTElORSA9IC9eWyt8OiBcdD1dKj89Wyt8OiBcdD1dKj9bIFx0XSpcbi8KKyAgICAgIFRBQkxFX1JPV19MSU5FID0gL14oLio/KVsgXHRdKlxuLworICAgICAgVEFCTEVfUElQRV9DSEVDSyA9IC8oPzpcfHwuKj9bXlxcXG5dXHwpLworICAgICAgVEFCTEVfTElORSA9IC8je1RBQkxFX1BJUEVfQ0hFQ0t9Lio/XG4vCisgICAgICBUQUJMRV9TVEFSVCA9IC9eI3tPUFRfU1BBQ0V9KD89XFMpI3tUQUJMRV9MSU5FfS8KKworICAgICAgIyBQYXJzZSB0aGUgdGFibGUgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICBkZWYgcGFyc2VfdGFibGUKKyAgICAgICAgcmV0dXJuIGZhbHNlIGlmICFhZnRlcl9ibG9ja19ib3VuZGFyeT8KKworICAgICAgICBzYXZlZF9wb3MgPSBAc3JjLnNhdmVfcG9zCisgICAgICAgIG9yaWdfcG9zID0gQHNyYy5wb3MKKyAgICAgICAgdGFibGUgPSBuZXdfYmxvY2tfZWwoOnRhYmxlLCBuaWwsIG5pbCwgOmFsaWdubWVudCA9PiBbXSwgOmxvY2F0aW9uID0+IEBzcmMuY3VycmVudF9saW5lX251bWJlcikKKyAgICAgICAgbGVhZGluZ19waXBlID0gKEBzcmMuY2hlY2soVEFCTEVfTElORSkgPX4gL15ccypcfC8pCisgICAgICAgIEBzcmMuc2NhbihUQUJMRV9TRVBfTElORSkKKworICAgICAgICByb3dzID0gW10KKyAgICAgICAgaGFzX2Zvb3RlciA9IGZhbHNlCisgICAgICAgIGNvbHVtbnMgPSAwCisKKyAgICAgICAgYWRkX2NvbnRhaW5lciA9IGxhbWJkYSBkbyB8dHlwZSwgZm9yY2V8CisgICAgICAgICAgaWYgIWhhc19mb290ZXIgfHwgdHlwZSAhPSA6dGJvZHkgfHwgZm9yY2UKKyAgICAgICAgICAgIGNvbnQgPSBFbGVtZW50Lm5ldyh0eXBlKQorICAgICAgICAgICAgY29udC5jaGlsZHJlbiwgcm93cyA9IHJvd3MsIFtdCisgICAgICAgICAgICB0YWJsZS5jaGlsZHJlbiA8PCBjb250CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHdoaWxlICFAc3JjLmVvcz8KKyAgICAgICAgICBicmVhayBpZiAhQHNyYy5jaGVjayhUQUJMRV9MSU5FKQorICAgICAgICAgIGlmIEBzcmMuc2NhbihUQUJMRV9TRVBfTElORSkKKyAgICAgICAgICAgIGlmIHJvd3MuZW1wdHk/CisgICAgICAgICAgICAgICMgbm90aGluZyB0byBkbywgaWdub3JpbmcgbXVsdGlwbGUgY29uc2VjdXRpdmUgc2VwYXJhdG9yIGxpbmVzCisgICAgICAgICAgICBlbHNpZiB0YWJsZS5vcHRpb25zWzphbGlnbm1lbnRdLmVtcHR5PyAmJiAhaGFzX2Zvb3RlcgorICAgICAgICAgICAgICBhZGRfY29udGFpbmVyLmNhbGwoOnRoZWFkLCBmYWxzZSkKKyAgICAgICAgICAgICAgdGFibGUub3B0aW9uc1s6YWxpZ25tZW50XSA9IEBzcmNbMV0uc2NhbihUQUJMRV9IU0VQX0FMSUdOKS5tYXAgZG8gfGxlZnQsIHJpZ2h0fAorICAgICAgICAgICAgICAgIChsZWZ0LmVtcHR5PyAmJiByaWdodC5lbXB0eT8gJiYgOmRlZmF1bHQpIHx8IChyaWdodC5lbXB0eT8gJiYgOmxlZnQpIHx8IChsZWZ0LmVtcHR5PyAmJiA6cmlnaHQpIHx8IDpjZW50ZXIKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbHNlICMgdHJlYXQgYXMgbm9ybWFsIHNlcGFyYXRvciBsaW5lCisgICAgICAgICAgICAgIGFkZF9jb250YWluZXIuY2FsbCg6dGJvZHksIGZhbHNlKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZWxzaWYgQHNyYy5zY2FuKFRBQkxFX0ZTRVBfTElORSkKKyAgICAgICAgICAgIGFkZF9jb250YWluZXIuY2FsbCg6dGJvZHksIHRydWUpIGlmICFyb3dzLmVtcHR5PworICAgICAgICAgICAgaGFzX2Zvb3RlciA9IHRydWUKKyAgICAgICAgICBlbHNpZiBAc3JjLnNjYW4oVEFCTEVfUk9XX0xJTkUpCisgICAgICAgICAgICB0cm93ID0gRWxlbWVudC5uZXcoOnRyKQorCisgICAgICAgICAgICAjIHBhcnNlIHBvc3NpYmxlIGNvZGUgc3BhbnMgb24gdGhlIGxpbmUgYW5kIGNvcnJlY3RseSBzcGxpdCB0aGUgbGluZSBpbnRvIGNlbGxzCisgICAgICAgICAgICBlbnYgPSBzYXZlX2VudgorICAgICAgICAgICAgY2VsbHMgPSBbXQorICAgICAgICAgICAgQHNyY1sxXS5zcGxpdCgvKDxjb2RlLio/Pi4qPzxcL2NvZGU+KS8pLmVhY2hfd2l0aF9pbmRleCBkbyB8c3RyLCBpfAorICAgICAgICAgICAgICBpZiBpICUgMiA9PSAxCisgICAgICAgICAgICAgICAgKGNlbGxzLmVtcHR5PyA/IGNlbGxzIDogY2VsbHMubGFzdCkgPDwgc3RyCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXNldF9lbnYoOnNyYyA9PiBLcmFtZG93bjo6VXRpbHM6OlN0cmluZ1NjYW5uZXIubmV3KHN0ciwgQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICByb290ID0gRWxlbWVudC5uZXcoOnJvb3QpCisgICAgICAgICAgICAgICAgcGFyc2Vfc3BhbnMocm9vdCwgbmlsLCBbOmNvZGVzcGFuXSkKKworICAgICAgICAgICAgICAgIHJvb3QuY2hpbGRyZW4uZWFjaCBkbyB8Y3wKKyAgICAgICAgICAgICAgICAgIGlmIGMudHlwZSA9PSA6cmF3X3RleHQKKyAgICAgICAgICAgICAgICAgICAgIyBPbmx5IG9uIFJ1YnkgMS45OiBmLCAqbCA9IGMudmFsdWUuc3BsaXQoLyg/PCFcXClcfC8pLm1hcCB7fHR8IHQuZ3N1YigvXFxcfC8sICd8Jyl9CisgICAgICAgICAgICAgICAgICAgIGYsICpsID0gYy52YWx1ZS5zcGxpdCgvXFxcfC8sIC0xKS5tYXAge3x0fCB0LnNwbGl0KC9cfC8sIC0xKX0uaW5qZWN0KFtdKSBkbyB8bWVtbywgdHwKKyAgICAgICAgICAgICAgICAgICAgICBtZW1vLmxhc3QgPDwgInwje3Quc2hpZnR9IiBpZiBtZW1vLnNpemUgPiAwCisgICAgICAgICAgICAgICAgICAgICAgbWVtby5jb25jYXQodCkKKyAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgIChjZWxscy5lbXB0eT8gPyBjZWxscyA6IGNlbGxzLmxhc3QpIDw8IGYKKyAgICAgICAgICAgICAgICAgICAgY2VsbHMuY29uY2F0KGwpCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlbGltID0gKGMudmFsdWUuc2NhbigvYCsvKS5tYXggfHwgJycpICsgJ2AnCisgICAgICAgICAgICAgICAgICAgIHRtcCA9ICIje2RlbGltfSN7JyAnIGlmIGRlbGltLnNpemUgPiAxfSN7Yy52YWx1ZX0jeycgJyBpZiBkZWxpbS5zaXplID4gMX0je2RlbGltfSIKKyAgICAgICAgICAgICAgICAgICAgKGNlbGxzLmVtcHR5PyA/IGNlbGxzIDogY2VsbHMubGFzdCkgPDwgdG1wCisgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIHJlc3RvcmVfZW52KGVudikKKworICAgICAgICAgICAgY2VsbHMuc2hpZnQgaWYgbGVhZGluZ19waXBlICYmIGNlbGxzLmZpcnN0LnN0cmlwLmVtcHR5PworICAgICAgICAgICAgY2VsbHMucG9wIGlmIGNlbGxzLmxhc3Quc3RyaXAuZW1wdHk/CisgICAgICAgICAgICBjZWxscy5lYWNoIGRvIHxjZWxsX3RleHR8CisgICAgICAgICAgICAgIHRjZWxsID0gRWxlbWVudC5uZXcoOnRkKQorICAgICAgICAgICAgICB0Y2VsbC5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6cmF3X3RleHQsIGNlbGxfdGV4dC5zdHJpcCkKKyAgICAgICAgICAgICAgdHJvdy5jaGlsZHJlbiA8PCB0Y2VsbAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBjb2x1bW5zID0gW2NvbHVtbnMsIGNlbGxzLmxlbmd0aF0ubWF4CisgICAgICAgICAgICByb3dzIDw8IHRyb3cKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBpZiAhYmVmb3JlX2Jsb2NrX2JvdW5kYXJ5PworICAgICAgICAgIEBzcmMucmV2ZXJ0X3BvcyhzYXZlZF9wb3MpCisgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgIGVuZAorCisgICAgICAgICMgUGFyc2UgYWxsIGxpbmVzIG9mIHRoZSB0YWJsZSB3aXRoIHRoZSBjb2RlIHNwYW4gcGFyc2VyCisgICAgICAgIGVudiA9IHNhdmVfZW52CisgICAgICAgIGxfc3JjID0gOjpLcmFtZG93bjo6VXRpbHM6OlN0cmluZ1NjYW5uZXIubmV3KGV4dHJhY3Rfc3RyaW5nKG9yaWdfcG9zLi4uKEBzcmMucG9zLTEpLCBAc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyKQorICAgICAgICByZXNldF9lbnYoOnNyYyA9PiBsX3NyYykKKyAgICAgICAgcm9vdCA9IEVsZW1lbnQubmV3KDpyb290KQorICAgICAgICBwYXJzZV9zcGFucyhyb290LCBuaWwsIFs6Y29kZXNwYW4sIDpzcGFuX2h0bWxdKQorICAgICAgICByZXN0b3JlX2VudihlbnYpCisKKyAgICAgICAgIyBDaGVjayBpZiBlYWNoIGxpbmUgaGFzIGF0IGxlYXN0IG9uZSB1bmVzY2FwZWQgcGlwZSB0aGF0IGlzIG5vdCBpbnNpZGUgYSBjb2RlIHNwYW4vY29kZQorICAgICAgICAjIEhUTUwgZWxlbWVudAorICAgICAgICAjIE5vdGU6IEl0IGRvZXNuJ3QgbWF0dGVyIHRoYXQgd2UgcGFyc2UgKmFsbCogc3BhbiBIVE1MIGVsZW1lbnRzIGJlY2F1c2UgdGhlIHJvdyBzcGxpdHRpbmcKKyAgICAgICAgIyBhbGdvcml0aG0gYWJvdmUgb25seSB0YWtlcyA8Y29kZT4gZWxlbWVudHMgaW50byBhY2NvdW50IQorICAgICAgICBwaXBlX29uX2xpbmUgPSBmYWxzZQorICAgICAgICB3aGlsZSAoYyA9IHJvb3QuY2hpbGRyZW4uc2hpZnQpCisgICAgICAgICAgbGluZXMgPSBjLnZhbHVlLnNwbGl0KC9cbi8pCisgICAgICAgICAgaWYgYy50eXBlID09IDpjb2Rlc3BhbgorICAgICAgICAgICAgaWYgbGluZXMuc2l6ZSA+IDIgfHwgKGxpbmVzLnNpemUgPT0gMiAmJiAhcGlwZV9vbl9saW5lKQorICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzaWYgbGluZXMuc2l6ZSA9PSAyICYmIHBpcGVfb25fbGluZQorICAgICAgICAgICAgICBwaXBlX29uX2xpbmUgPSBmYWxzZQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWsgaWYgbGluZXMuc2l6ZSA+IDEgJiYgIXBpcGVfb25fbGluZSAmJiBsaW5lcy5maXJzdCAhfiAvXiN7VEFCTEVfUElQRV9DSEVDS30vCisgICAgICAgICAgICBwaXBlX29uX2xpbmUgPSAobGluZXMuc2l6ZSA+IDEgPyBmYWxzZSA6IHBpcGVfb25fbGluZSkgfHwgKGxpbmVzLmxhc3QgPX4gL14je1RBQkxFX1BJUEVfQ0hFQ0t9LykKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIEBzcmMucmV2ZXJ0X3BvcyhzYXZlZF9wb3MpIGFuZCByZXR1cm4gZmFsc2UgaWYgIXBpcGVfb25fbGluZQorCisgICAgICAgIGFkZF9jb250YWluZXIuY2FsbChoYXNfZm9vdGVyID8gOnRmb290IDogOnRib2R5LCBmYWxzZSkgaWYgIXJvd3MuZW1wdHk/CisKKyAgICAgICAgaWYgIXRhYmxlLmNoaWxkcmVuLmFueT8ge3xlbHwgZWwudHlwZSA9PSA6dGJvZHl9CisgICAgICAgICAgd2FybmluZygiRm91bmQgdGFibGUgd2l0aG91dCBib2R5IG9uIGxpbmUgI3t0YWJsZS5vcHRpb25zWzpsb2NhdGlvbl19IC0gaWdub3JpbmcgaXQiKQorICAgICAgICAgIEBzcmMucmV2ZXJ0X3BvcyhzYXZlZF9wb3MpCisgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgIGVuZAorCisgICAgICAgICMgYWRqdXN0IGFsbCB0YWJsZSByb3dzIHRvIGhhdmUgZXF1YWwgbnVtYmVyIG9mIGNvbHVtbnMsIHNhbWUgZm9yIGFsaWdubWVudCBkZWZzCisgICAgICAgIHRhYmxlLmNoaWxkcmVuLmVhY2ggZG8gfGtpbmR8CisgICAgICAgICAga2luZC5jaGlsZHJlbi5lYWNoIGRvIHxyb3d8CisgICAgICAgICAgICAoY29sdW1ucyAtIHJvdy5jaGlsZHJlbi5sZW5ndGgpLnRpbWVzIGRvCisgICAgICAgICAgICAgIHJvdy5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6dGQpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIGlmIHRhYmxlLm9wdGlvbnNbOmFsaWdubWVudF0ubGVuZ3RoID4gY29sdW1ucworICAgICAgICAgIHRhYmxlLm9wdGlvbnNbOmFsaWdubWVudF0gPSB0YWJsZS5vcHRpb25zWzphbGlnbm1lbnRdWzAuLi5jb2x1bW5zXQorICAgICAgICBlbHNlCisgICAgICAgICAgdGFibGUub3B0aW9uc1s6YWxpZ25tZW50XSArPSBbOmRlZmF1bHRdICogKGNvbHVtbnMgLSB0YWJsZS5vcHRpb25zWzphbGlnbm1lbnRdLmxlbmd0aCkKKyAgICAgICAgZW5kCisKKyAgICAgICAgQHRyZWUuY2hpbGRyZW4gPDwgdGFibGUKKworICAgICAgICB0cnVlCisgICAgICBlbmQKKyAgICAgIGRlZmluZV9wYXJzZXIoOnRhYmxlLCBUQUJMRV9TVEFSVCkKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vdHlwb2dyYXBoaWNfc3ltYm9sLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIva3JhbWRvd24vdHlwb2dyYXBoaWNfc3ltYm9sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTVlZTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9rcmFtZG93bi90eXBvZ3JhcGhpY19zeW1ib2wucmIKQEAgLTAsMCArMSw0NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFBhcnNlcgorICAgIGNsYXNzIEtyYW1kb3duCisKKyAgICAgIFRZUE9HUkFQSElDX1NZTVMgPSBbWyctLS0nLCA6bWRhc2hdLCBbJy0tJywgOm5kYXNoXSwgWycuLi4nLCA6aGVsbGlwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWydcXDw8JywgJyZsdDsmbHQ7J10sIFsnXFw+PicsICcmZ3Q7Jmd0OyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJzw8ICcsIDpsYXF1b19zcGFjZV0sIFsnID4+JywgOnJhcXVvX3NwYWNlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyc8PCcsIDpsYXF1b10sIFsnPj4nLCA6cmFxdW9dXQorICAgICAgVFlQT0dSQVBISUNfU1lNU19TVUJTVCA9IEhhc2hbKlRZUE9HUkFQSElDX1NZTVMuZmxhdHRlbl0KKyAgICAgIFRZUE9HUkFQSElDX1NZTVNfUkUgPSAvI3tUWVBPR1JBUEhJQ19TWU1TLm1hcCB7fGssdnwgUmVnZXhwLmVzY2FwZShrKX0uam9pbignfCcpfS8KKworICAgICAgIyBQYXJzZSB0aGUgdHlwb2dyYXBoaWMgc3ltYm9scyBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgIGRlZiBwYXJzZV90eXBvZ3JhcGhpY19zeW1zCisgICAgICAgIHN0YXJ0X2xpbmVfbnVtYmVyID0gQHNyYy5jdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgIEBzcmMucG9zICs9IEBzcmMubWF0Y2hlZF9zaXplCisgICAgICAgIHZhbCA9IFRZUE9HUkFQSElDX1NZTVNfU1VCU1RbQHNyYy5tYXRjaGVkXQorICAgICAgICBpZiB2YWwua2luZF9vZj8oU3ltYm9sKQorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDp0eXBvZ3JhcGhpY19zeW0sIHZhbCwgbmlsLCA6bG9jYXRpb24gPT4gc3RhcnRfbGluZV9udW1iZXIpCisgICAgICAgIGVsc2lmIEBzcmMubWF0Y2hlZCA9PSAnXFw8PCcKKyAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6ZW50aXR5LCA6OktyYW1kb3duOjpVdGlsczo6RW50aXRpZXMuZW50aXR5KCdsdCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbCwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKQorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDplbnRpdHksIDo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ2x0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsLCA6bG9jYXRpb24gPT4gc3RhcnRfbGluZV9udW1iZXIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAdHJlZS5jaGlsZHJlbiA8PCBFbGVtZW50Lm5ldyg6ZW50aXR5LCA6OktyYW1kb3duOjpVdGlsczo6RW50aXRpZXMuZW50aXR5KCdndCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbCwgOmxvY2F0aW9uID0+IHN0YXJ0X2xpbmVfbnVtYmVyKQorICAgICAgICAgIEB0cmVlLmNoaWxkcmVuIDw8IEVsZW1lbnQubmV3KDplbnRpdHksIDo6S3JhbWRvd246OlV0aWxzOjpFbnRpdGllcy5lbnRpdHkoJ2d0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsLCA6bG9jYXRpb24gPT4gc3RhcnRfbGluZV9udW1iZXIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBkZWZpbmVfcGFyc2VyKDp0eXBvZ3JhcGhpY19zeW1zLCBUWVBPR1JBUEhJQ19TWU1TX1JFLCAnLS18XFwuXFwuXFwufCg/OlxcXFx8ICk/KD86PDx8Pj4pJykKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIvbWFya2Rvd24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3BhcnNlci9tYXJrZG93bi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTFmYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi9wYXJzZXIvbWFya2Rvd24ucmIKQEAgLTAsMCArMSw1NiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdrcmFtZG93bi9wYXJzZXInCisKK21vZHVsZSBLcmFtZG93bgorCisgIG1vZHVsZSBQYXJzZXIKKworICAgICMgVXNlZCBmb3IgcGFyc2luZyBhIGRvY3VtZW50IGluIE1hcmtkb3duIGZvcm1hdC4KKyAgICAjCisgICAgIyBUaGlzIHBhcnNlciBpcyBiYXNlZCBvbiB0aGUga3JhbWRvd24gcGFyc2VyIGFuZCByZW1vdmVzIHRoZSBwYXJzZXIgbWV0aG9kcyBmb3IgdGhlIGFkZGl0aW9uYWwKKyAgICAjIG5vbi1NYXJrZG93biBmZWF0dXJlcy4gSG93ZXZlciwgc2luY2Ugc29tZSB0aGluZ3MgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgYnkgdGhlIGtyYW1kb3duCisgICAgIyBwYXJzZXIgbWV0aG9kcyAobGlrZSBkZWNpZGluZyB3aGVuIGEgbGlzdCBpdGVtIGNvbnRhaW5zIGp1c3QgdGV4dCksIHRoaXMgcGFyc2VyIGRpZmZlcnMgZnJvbQorICAgICMgcmVhbCBNYXJrZG93biBwYXJzZXJzIGluIHNvbWUgcmVzcGVjdHMuCisgICAgIworICAgICMgTm90ZSwgdGhvdWdoLCB0aGF0IHRoZSBwYXJzZXIgYmFzaWNhbGx5IGZhaWxzIGp1c3Qgb25lIG9mIHRoZSBNYXJrZG93biB0ZXN0IGNhc2VzIChzb21lIG90aGVycworICAgICMgYWxzbyBmYWlsIGJ1dCB0aG9zZSBmYWlsdXJlcyBhcmUgbmVnbGlnaWJsZSkuCisgICAgY2xhc3MgTWFya2Rvd24gPCBLcmFtZG93bgorCisgICAgICAjIEFycmF5IHdpdGggYWxsIHRoZSBwYXJzaW5nIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdGFuZGFyZCBrcmFtZG93biBwYXJzZXIuCisgICAgICBFWFRFTkRFRCA9IFs6Y29kZWJsb2NrX2ZlbmNlZCwgOnRhYmxlLCA6ZGVmaW5pdGlvbl9saXN0LCA6Zm9vdG5vdGVfZGVmaW5pdGlvbiwgOmFiYnJldl9kZWZpbml0aW9uLCA6YmxvY2tfbWF0aCwKKyAgICAgICAgICAgICAgICAgIDpibG9ja19leHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgOmZvb3Rub3RlX21hcmtlciwgOnNtYXJ0X3F1b3RlcywgOmlubGluZV9tYXRoLCA6c3Bhbl9leHRlbnNpb25zLCA6dHlwb2dyYXBoaWNfc3ltc10KKworICAgICAgZGVmIGluaXRpYWxpemUoc291cmNlLCBvcHRpb25zKSAjIDpub2RvYzoKKyAgICAgICAgc3VwZXIKKyAgICAgICAgQGJsb2NrX3BhcnNlcnMuZGVsZXRlX2lmIHt8aXwgRVhURU5ERUQuaW5jbHVkZT8oaSl9CisgICAgICAgIEBzcGFuX3BhcnNlcnMuZGVsZXRlX2lmIHt8aXwgRVhURU5ERUQuaW5jbHVkZT8oaSl9CisgICAgICBlbmQKKworICAgICAgIyA6c3RvcGRvYzoKKworICAgICAgQkxPQ0tfQk9VTkRBUlkgPSAvI3tCTEFOS19MSU5FfXwje0VPQl9NQVJLRVJ9fFxaLworICAgICAgTEFaWV9FTkQgPSAvI3tCTEFOS19MSU5FfXwje0VPQl9NQVJLRVJ9fF4je09QVF9TUEFDRX0je0xBWllfRU5EX0hUTUxfU1RPUH18XiN7T1BUX1NQQUNFfSN7TEFaWV9FTkRfSFRNTF9TVEFSVH18XFovCisgICAgICBDT0RFQkxPQ0tfTUFUQ0ggPSAvKD86I3tCTEFOS19MSU5FfT8oPzoje0lOREVOVH1bIFx0XSpcUy4qXG4pKykqLworICAgICAgUEFSQUdSQVBIX0VORCA9IExBWllfRU5ECisKKyAgICAgIElBTF9SQU5EX0NIQVJTID0gKCgnYScuLid6JykudG9fYSArICgnMCcuLic5JykudG9fYSkKKyAgICAgIElBTF9SQU5EX1NUUklORyA9ICgxLi4yMCkuY29sbGVjdCB7fGF8IElBTF9SQU5EX0NIQVJTW3JhbmQoSUFMX1JBTkRfQ0hBUlMuc2l6ZSldfS5qb2luCisgICAgICBMSVNUX0lURU1fSUFMID0gL15ccyooI3tJQUxfUkFORF9TVFJJTkd9KT9ccypcbi8KKyAgICAgIElBTF9TUEFOX1NUQVJUID0gTElTVF9JVEVNX0lBTAorCisgICAgICAjIDpzdGFydGRvYzoKKworICAgIGVuZAorCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vdXRpbHMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3V0aWxzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNTNlNDgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3V0aWxzLnJiCkBAIC0wLDAgKzEsNTggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duCisKKyAgIyA9PSBcVXRpbHMgTW9kdWxlCisgICMKKyAgIyBUaGlzIG1vZHVsZSBjb250YWlucyB1dGlsaXR5IGNsYXNzL21vZHVsZXMvbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGJvdGggcGFyc2VycyBhbmQKKyAgIyBjb252ZXJ0ZXJzLgorICBtb2R1bGUgVXRpbHMKKworICAgIGF1dG9sb2FkIDpFbnRpdGllcywgJ2tyYW1kb3duL3V0aWxzL2VudGl0aWVzJworICAgIGF1dG9sb2FkIDpIdG1sLCAna3JhbWRvd24vdXRpbHMvaHRtbCcKKyAgICBhdXRvbG9hZCA6T3JkZXJlZEhhc2gsICdrcmFtZG93bi91dGlscy9vcmRlcmVkX2hhc2gnCisgICAgYXV0b2xvYWQgOlVuaWRlY29kZXIsICdrcmFtZG93bi91dGlscy91bmlkZWNvZGVyJworICAgIGF1dG9sb2FkIDpTdHJpbmdTY2FubmVyLCAna3JhbWRvd24vdXRpbHMvc3RyaW5nX3NjYW5uZXInCisgICAgYXV0b2xvYWQgOkNvbmZpZ3VyYWJsZSwgJ2tyYW1kb3duL3V0aWxzL2NvbmZpZ3VyYWJsZScKKworICAgICMgVHJlYXQgK25hbWUrIGFzIGlmIGl0IHdlcmUgc25ha2UgY2FzZWQgKGUuZy4gc25ha2VfY2FzZSkgYW5kIGNhbWVsaXplIGl0IChlLmcuIFNuYWtlQ2FzZSkuCisgICAgZGVmIHNlbGYuY2FtZWxpemUobmFtZSkKKyAgICAgIG5hbWUuc3BsaXQoJ18nKS5pbmplY3QoJycpIHt8cyx4fCBzIDw8IHhbMC4uMF0udXBjYXNlIDw8IHhbMS4uLTFdIH0KKyAgICBlbmQKKworICAgICMgVHJlYXQgK25hbWUrIGFzIGlmIGl0IHdlcmUgY2FtZWxpemVkIChlLmcuIENhbWVsaXplZE5hbWUpIGFuZCBzbmFrZS1jYXNlIGl0IChlLmcuIGNhbWVsaXplZF9uYW1lKS4KKyAgICBkZWYgc2VsZi5zbmFrZV9jYXNlKG5hbWUpCisgICAgICBuYW1lID0gbmFtZS5kdXAKKyAgICAgIG5hbWUuZ3N1YiEoLyhbQS1aXSspKFtBLVpdW2Etel0pLywnXDFfXDInKQorICAgICAgbmFtZS5nc3ViISgvKFthLXpdKShbQS1aXSkvLCdcMV9cMicpCisgICAgICBuYW1lLmRvd25jYXNlIQorICAgICAgbmFtZQorICAgIGVuZAorCisgICAgaWYgUlVCWV9WRVJTSU9OIDwgJzIuMCcKKworICAgICAgIyBSZXNvbHZlIHRoZSByZWN1cnNpdmUgY29uc3RhbnQgK3N0cisuCisgICAgICBkZWYgc2VsZi5kZWVwX2NvbnN0X2dldChzdHIpCisgICAgICAgIG5hbWVzID0gc3RyLnNwbGl0KC86Oi8pCisgICAgICAgIG5hbWVzLnNoaWZ0IGlmIG5hbWVzLmZpcnN0LmVtcHR5PworICAgICAgICBuYW1lcy5pbmplY3QoOjpPYmplY3QpIHt8bW9kLCBzfCBtb2QuY29uc3RfZ2V0KHMpfQorICAgICAgZW5kCisKKyAgICBlbHNlCisKKyAgICAgIGRlZiBzZWxmLmRlZXBfY29uc3RfZ2V0KHN0cikKKyAgICAgICAgOjpPYmplY3QuY29uc3RfZ2V0KHN0cikKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi91dGlscy9jb25maWd1cmFibGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3V0aWxzL2NvbmZpZ3VyYWJsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFiODQwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi91dGlscy9jb25maWd1cmFibGUucmIKQEAgLTAsMCArMSw0NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFV0aWxzCisKKyAgICAjIE1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nIGNvbmZpZ3VyYWJsZSBleHRlbnNpb25zLgorICAgIG1vZHVsZSBDb25maWd1cmFibGUKKworICAgICAgIyBDcmVhdGUgYSBuZXcgY29uZmlndXJhYmxlIGV4dGVuc2lvbiBjYWxsZWQgK25hbWUrLgorICAgICAgIworICAgICAgIyBUaHJlZSBtZXRob2RzIHdpbGwgYmUgZGVmaW5lZCBvbiB0aGUgY2FsbGluZyBvYmplY3Qgd2hpY2ggYWxsb3cgdG8gdXNlIHRoaXMgY29uZmlndXJhYmxlCisgICAgICAjIGV4dGVuc2lvbjoKKyAgICAgICMKKyAgICAgICMgY29uZmlndXJhYmxlczo6IFJldHVybnMgYSBoYXNoIG9mIGhhc2hlcyB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgYWxsIGNvbmZpZ3VyYWJsZXMgb2YgdGhlCisgICAgICAjICAgICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAjCisgICAgICAjIDxuYW1lPihleHRfbmFtZSk6OiBSZXR1cm4gdGhlIGNvbmZpZ3VyZWQgZXh0ZW5zaW9uICtleHRfbmFtZSsuCisgICAgICAjCisgICAgICAjIGFkZF88bmFtZT4oZXh0X25hbWUsIGRhdGE9bmlsLCAmYmxvY2spOjogRGVmaW5lIGFuIGV4dGVuc2lvbiArZXh0X25hbWUrIGJ5IHNwZWNpZnlpbmcgZWl0aGVyCisgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgYXMgYXJndW1lbnQgb3IgYnkgdXNpbmcgYSBibG9jay4KKyAgICAgIGRlZiBjb25maWd1cmFibGUobmFtZSkKKyAgICAgICAgc2luZ2xldG9uX2NsYXNzID0gKGNsYXNzIDw8IHNlbGY7IHNlbGY7IGVuZCkKKyAgICAgICAgc2luZ2xldG9uX2NsYXNzLnNlbmQoOmRlZmluZV9tZXRob2QsIDpjb25maWd1cmFibGVzKSBkbworICAgICAgICAgIEBfY29uZmlndXJhYmxlcyB8fD0gSGFzaC5uZXcge3xoLCBrfCBoW2tdID0ge319CisgICAgICAgIGVuZCB1bmxlc3MgcmVzcG9uZF90bz8oOmNvbmZpZ3VyYWJsZXMpCisgICAgICAgIHNpbmdsZXRvbl9jbGFzcy5zZW5kKDpkZWZpbmVfbWV0aG9kLCBuYW1lKSBkbyB8ZGF0YXwKKyAgICAgICAgICBjb25maWd1cmFibGVzW25hbWVdW2RhdGFdCisgICAgICAgIGVuZAorICAgICAgICBzaW5nbGV0b25fY2xhc3Muc2VuZCg6ZGVmaW5lX21ldGhvZCwgImFkZF8je25hbWV9Ii5pbnRlcm4pIGRvIHxkYXRhLCAqYXJncywgJmJsb2NrfAorICAgICAgICAgIGNvbmZpZ3VyYWJsZXNbbmFtZV1bZGF0YV0gPSBhcmdzLmZpcnN0IHx8IGJsb2NrCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICBlbmQKKworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi91dGlscy9lbnRpdGllcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vdXRpbHMvZW50aXRpZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMWYwZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vdXRpbHMvZW50aXRpZXMucmIKQEAgLTAsMCArMSwzNDcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duCisKKyAgbW9kdWxlIFV0aWxzCisKKyAgICAjIFByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGhhbmRsaW5nIG5hbWVkIGFuZCBudW1lcmljIGVudGl0aWVzLgorICAgIG1vZHVsZSBFbnRpdGllcworCisgICAgICAjIFJlcHJlc2VudHMgYW4gZW50aXR5IHRoYXQgaGFzIGEgK2NvZGVfcG9pbnQrIGFuZCArbmFtZSsuCisgICAgICBjbGFzcyBFbnRpdHkgPCBTdHJ1Y3QubmV3KDpjb2RlX3BvaW50LCA6bmFtZSkKKworICAgICAgICAjIFJldHVybiB0aGUgVVRGOCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW50aXR5LgorICAgICAgICBkZWYgY2hhcgorICAgICAgICAgIFtjb2RlX3BvaW50XS5wYWNrKCdVKicpIHJlc2N1ZSBuaWwKKyAgICAgICAgZW5kCisKKyAgICAgIGVuZAorCisgICAgICAjIEFycmF5IG9mIGFycmF5cy4gRWFjaCBzdWItYXJyYXkgc3BlY2lmaWVzIGEgY29kZSBwb2ludCBhbmQgdGhlIGFzc29jaWF0ZWQgbmFtZS4KKyAgICAgICMKKyAgICAgICMgVGhpcyB0YWJsZSBpcyBub3QgdXNlZCBkaXJlY3RseSAtLSBFbnRpdHkgb2JqZWN0cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZyb20gaXQgYW5kIHB1dAorICAgICAgIyBpbnRvIGEgSGFzaCBtYXAgd2hlbiB0aGlzIGZpbGUgaXMgbG9hZGVkLgorICAgICAgRU5USVRZX1RBQkxFID0gWworICAgICAgICAgICAgICAgICAgICAgIFs5MTMsICdBbHBoYSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5MTQsICdCZXRhJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzkxNSwgJ0dhbW1hJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzkxNiwgJ0RlbHRhJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzkxNywgJ0Vwc2lsb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTE4LCAnWmV0YSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5MTksICdFdGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTIwLCAnVGhldGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTIxLCAnSW90YSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5MjIsICdLYXBwYSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5MjMsICdMYW1iZGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTI0LCAnTXUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTI1LCAnTnUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTI2LCAnWGknXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTI3LCAnT21pY3JvbiddLAorICAgICAgICAgICAgICAgICAgICAgIFs5MjgsICdQaSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5MjksICdSaG8nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTMxLCAnU2lnbWEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTMyLCAnVGF1J10sCisgICAgICAgICAgICAgICAgICAgICAgWzkzMywgJ1Vwc2lsb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTM0LCAnUGhpJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzkzNSwgJ0NoaSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5MzYsICdQc2knXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTM3LCAnT21lZ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTQ1LCAnYWxwaGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTQ2LCAnYmV0YSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5NDcsICdnYW1tYSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5NDgsICdkZWx0YSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5NDksICdlcHNpbG9uJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk1MCwgJ3pldGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTUxLCAnZXRhJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk1MiwgJ3RoZXRhJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk1MywgJ2lvdGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTU0LCAna2FwcGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTU1LCAnbGFtYmRhJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk1NiwgJ211J10sCisgICAgICAgICAgICAgICAgICAgICAgWzk1NywgJ251J10sCisgICAgICAgICAgICAgICAgICAgICAgWzk1OCwgJ3hpJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk1OSwgJ29taWNyb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTYwLCAncGknXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTYxLCAncmhvJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk2MywgJ3NpZ21hJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk2NCwgJ3RhdSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5NjUsICd1cHNpbG9uJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk2NiwgJ3BoaSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5NjcsICdjaGknXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTY4LCAncHNpJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk2OSwgJ29tZWdhJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk2MiwgJ3NpZ21hZiddLAorICAgICAgICAgICAgICAgICAgICAgIFs5NzcsICd0aGV0YXN5bSddLAorICAgICAgICAgICAgICAgICAgICAgIFs5NzgsICd1cHNpaCddLAorICAgICAgICAgICAgICAgICAgICAgIFs5ODIsICdwaXYnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODIwNCwgJ3p3bmonXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODIwNSwgJ3p3aiddLAorICAgICAgICAgICAgICAgICAgICAgIFs4MjA2LCAnbHJtJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzgyMDcsICdybG0nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODIzMCwgJ2hlbGxpcCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4MjQyLCAncHJpbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODI0MywgJ1ByaW1lJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzgyNTQsICdvbGluZSddLAorICAgICAgICAgICAgICAgICAgICAgIFs4MjYwLCAnZnJhc2wnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODQ3MiwgJ3dlaWVycCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NDY1LCAnaW1hZ2UnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODQ3NiwgJ3JlYWwnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODUwMSwgJ2FsZWZzeW0nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODIyNiwgJ2J1bGwnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODQ4MiwgJ3RyYWRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg1OTIsICdsYXJyJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg1OTQsICdyYXJyJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg1OTMsICd1YXJyJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg1OTUsICdkYXJyJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg1OTYsICdoYXJyJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg2MjksICdjcmFyciddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NjU3LCAndUFyciddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NjU5LCAnZEFyciddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NjU2LCAnbEFyciddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NjU4LCAnckFyciddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NjYwLCAnaEFyciddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzA0LCAnZm9yYWxsJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg3MDYsICdwYXJ0J10sCisgICAgICAgICAgICAgICAgICAgICAgWzg3MDcsICdleGlzdCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzA5LCAnZW1wdHknXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODcxMSwgJ25hYmxhJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg3MTIsICdpc2luJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg3MTUsICduaSddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzEzLCAnbm90aW4nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODcyMSwgJ3N1bSddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzE5LCAncHJvZCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzIyLCAnbWludXMnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODcyNywgJ2xvd2FzdCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzMwLCAncmFkaWMnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODczMywgJ3Byb3AnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODczNCwgJ2luZmluJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg3MzYsICdhbmcnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODc0MywgJ2FuZCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzQ0LCAnb3InXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODc0NSwgJ2N1cCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzQ2LCAnY2FwJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg3NDcsICdpbnQnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODc1NiwgJ3RoZXJlNCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzY0LCAnc2ltJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg3NzYsICdhc3ltcCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4NzczLCAnY29uZyddLAorICAgICAgICAgICAgICAgICAgICAgIFs4ODAwLCAnbmUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODgwMSwgJ2VxdWl2J10sCisgICAgICAgICAgICAgICAgICAgICAgWzg4MDQsICdsZSddLAorICAgICAgICAgICAgICAgICAgICAgIFs4ODA1LCAnZ2UnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODgzNCwgJ3N1YiddLAorICAgICAgICAgICAgICAgICAgICAgIFs4ODM1LCAnc3VwJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg4MzgsICdzdWJlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg4MzksICdzdXBlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg4MzYsICduc3ViJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg4NTMsICdvcGx1cyddLAorICAgICAgICAgICAgICAgICAgICAgIFs4ODU1LCAnb3RpbWVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg4NjksICdwZXJwJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg5MDEsICdzZG90J10sCisgICAgICAgICAgICAgICAgICAgICAgWzg5NDIsICd2ZWxsaXAnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODk2OCwgJ3JjZWlsJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg5NjksICdsY2VpbCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4OTcwLCAnbGZsb29yJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzg5NzEsICdyZmxvb3InXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTAwMSwgJ3JhbmcnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTAwMiwgJ2xhbmcnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbOTY3NCwgJ2xveiddLAorICAgICAgICAgICAgICAgICAgICAgIFs5ODI0LCAnc3BhZGVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk4MjcsICdjbHVicyddLAorICAgICAgICAgICAgICAgICAgICAgIFs5ODI5LCAnaGVhcnRzJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzk4MzAsICdkaWFtcyddLAorICAgICAgICAgICAgICAgICAgICAgIFszOCwgJ2FtcCddLAorICAgICAgICAgICAgICAgICAgICAgIFszNCwgJ3F1b3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMzksICdhcG9zJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE2OSwgJ2NvcHknXSwKKyAgICAgICAgICAgICAgICAgICAgICBbNjAsICdsdCddLAorICAgICAgICAgICAgICAgICAgICAgIFs2MiwgJ2d0J10sCisgICAgICAgICAgICAgICAgICAgICAgWzMzOCwgJ09FbGlnJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzMzOSwgJ29lbGlnJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzM1MiwgJ1NjYXJvbiddLAorICAgICAgICAgICAgICAgICAgICAgIFszNTMsICdzY2Fyb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMzc2LCAnWXVtbCddLAorICAgICAgICAgICAgICAgICAgICAgIFs3MTAsICdjaXJjJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzczMiwgJ3RpbGRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzgyMTEsICduZGFzaCddLAorICAgICAgICAgICAgICAgICAgICAgIFs4MjEyLCAnbWRhc2gnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODIxNiwgJ2xzcXVvJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzgyMTcsICdyc3F1byddLAorICAgICAgICAgICAgICAgICAgICAgIFs4MjIwLCAnbGRxdW8nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODIyMSwgJ3JkcXVvJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzgyMjQsICdkYWdnZXInXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODIyNSwgJ0RhZ2dlciddLAorICAgICAgICAgICAgICAgICAgICAgIFs4MjQwLCAncGVybWlsJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzgzNjQsICdldXJvJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzgyNDksICdsc2FxdW8nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODI1MCwgJ3JzYXF1byddLAorICAgICAgICAgICAgICAgICAgICAgIFsxNjAsICduYnNwJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE2MSwgJ2lleGNsJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE2MywgJ3BvdW5kJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE2NCwgJ2N1cnJlbiddLAorICAgICAgICAgICAgICAgICAgICAgIFsxNjUsICd5ZW4nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTY2LCAnYnJ2YmFyJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE2NywgJ3NlY3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTY4LCAndW1sJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE3MSwgJ2xhcXVvJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE4NywgJ3JhcXVvJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE3NCwgJ3JlZyddLAorICAgICAgICAgICAgICAgICAgICAgIFsxNzAsICdvcmRmJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE3MiwgJ25vdCddLAorICAgICAgICAgICAgICAgICAgICAgIFsxNzMsICdzaHknXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTc1LCAnbWFjciddLAorICAgICAgICAgICAgICAgICAgICAgIFsxNzYsICdkZWcnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTc3LCAncGx1c21uJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE4MCwgJ2FjdXRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE4MSwgJ21pY3JvJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE4MiwgJ3BhcmEnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTgzLCAnbWlkZG90J10sCisgICAgICAgICAgICAgICAgICAgICAgWzE4NCwgJ2NlZGlsJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE4NiwgJ29yZG0nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTYyLCAnY2VudCddLAorICAgICAgICAgICAgICAgICAgICAgIFsxODUsICdzdXAxJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE3OCwgJ3N1cDInXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTc5LCAnc3VwMyddLAorICAgICAgICAgICAgICAgICAgICAgIFsxODksICdmcmFjMTInXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTg4LCAnZnJhYzE0J10sCisgICAgICAgICAgICAgICAgICAgICAgWzE5MCwgJ2ZyYWMzNCddLAorICAgICAgICAgICAgICAgICAgICAgIFsxOTEsICdpcXVlc3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTkyLCAnQWdyYXZlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzE5MywgJ0FhY3V0ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsxOTQsICdBY2lyYyddLAorICAgICAgICAgICAgICAgICAgICAgIFsxOTUsICdBdGlsZGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTk2LCAnQXVtbCddLAorICAgICAgICAgICAgICAgICAgICAgIFsxOTcsICdBcmluZyddLAorICAgICAgICAgICAgICAgICAgICAgIFsxOTgsICdBRWxpZyddLAorICAgICAgICAgICAgICAgICAgICAgIFsxOTksICdDY2VkaWwnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjAwLCAnRWdyYXZlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzIwMSwgJ0VhY3V0ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMDIsICdFY2lyYyddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMDMsICdFdW1sJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzIwNCwgJ0lncmF2ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMDUsICdJYWN1dGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjA2LCAnSWNpcmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjA3LCAnSXVtbCddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMDgsICdFVEgnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjA5LCAnTnRpbGRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzIxMCwgJ09ncmF2ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMTEsICdPYWN1dGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjEyLCAnT2NpcmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjEzLCAnT3RpbGRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzIxNCwgJ091bWwnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjE1LCAndGltZXMnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjE2LCAnT3NsYXNoJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzIxNywgJ1VncmF2ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMTgsICdVYWN1dGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjE5LCAnVWNpcmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjIwLCAnVXVtbCddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMjEsICdZYWN1dGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjIyLCAnVEhPUk4nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjIzLCAnc3psaWcnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjI0LCAnYWdyYXZlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzIyNSwgJ2FhY3V0ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMjYsICdhY2lyYyddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMjcsICdhdGlsZGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjI4LCAnYXVtbCddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMjksICdhcmluZyddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMzAsICdhZWxpZyddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMzEsICdjY2VkaWwnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjMyLCAnZWdyYXZlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzIzMywgJ2VhY3V0ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMzQsICdlY2lyYyddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMzUsICdldW1sJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzIzNiwgJ2lncmF2ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsyMzcsICdpYWN1dGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjM4LCAnaWNpcmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjM5LCAnaXVtbCddLAorICAgICAgICAgICAgICAgICAgICAgIFsyNDAsICdldGgnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjQxLCAnbnRpbGRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzI0MiwgJ29ncmF2ZSddLAorICAgICAgICAgICAgICAgICAgICAgIFsyNDMsICdvYWN1dGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjQ0LCAnb2NpcmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjQ1LCAnb3RpbGRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzI0NiwgJ291bWwnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjQ3LCAnZGl2aWRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzI0OCwgJ29zbGFzaCddLAorICAgICAgICAgICAgICAgICAgICAgIFsyNDksICd1Z3JhdmUnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjUwLCAndWFjdXRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzI1MSwgJ3VjaXJjJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzI1MiwgJ3V1bWwnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMjUzLCAneWFjdXRlJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzI1NCwgJ3Rob3JuJ10sCisgICAgICAgICAgICAgICAgICAgICAgWzI1NSwgJ3l1bWwnXSwKKworICAgICAgICAgICAgICAgICAgICAgIFs4MjE4LCAnc2JxdW8nXSwKKyAgICAgICAgICAgICAgICAgICAgICBbNDAyLCAnZm5vZiddLAorICAgICAgICAgICAgICAgICAgICAgIFs4MjIyLCAnYmRxdW8nXSwKKworICAgICAgICAgICAgICAgICAgICAgIFsxMjgsIDgzNjRdLAorICAgICAgICAgICAgICAgICAgICAgIFsxMzAsIDgyMThdLAorICAgICAgICAgICAgICAgICAgICAgIFsxMzEsIDQwMl0sCisgICAgICAgICAgICAgICAgICAgICAgWzEzMiwgODIyMl0sCisgICAgICAgICAgICAgICAgICAgICAgWzEzMywgODIzMF0sCisgICAgICAgICAgICAgICAgICAgICAgWzEzNCwgODIyNF0sCisgICAgICAgICAgICAgICAgICAgICAgWzEzNSwgODIyNV0sCisgICAgICAgICAgICAgICAgICAgICAgWzEzNiwgNzEwXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTM3LCA4MjQwXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTM4LCAzNTJdLAorICAgICAgICAgICAgICAgICAgICAgIFsxMzksIDgyNDldLAorICAgICAgICAgICAgICAgICAgICAgIFsxNDAsIDMzOF0sCisgICAgICAgICAgICAgICAgICAgICAgWzE0MiwgMzgxXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTQ1LCA4MjE2XSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTQ2LCA4MjE3XSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTQ3LCA4MjIwXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTQ4LCA4MjIxXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTQ5LCA4MjI2XSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTUwLCA4MjExXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTUxLCA4MjEyXSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTUyLCA3MzJdLAorICAgICAgICAgICAgICAgICAgICAgIFsxNTMsIDg0ODJdLAorICAgICAgICAgICAgICAgICAgICAgIFsxNTQsIDM1M10sCisgICAgICAgICAgICAgICAgICAgICAgWzE1NSwgODI1MF0sCisgICAgICAgICAgICAgICAgICAgICAgWzE1NiwgMzM5XSwKKyAgICAgICAgICAgICAgICAgICAgICBbMTU4LCAzODJdLAorICAgICAgICAgICAgICAgICAgICAgIFsxNTksIDM3Nl0sCisKKyAgICAgICAgICAgICAgICAgICAgICBbODE5NCwgJ2Vuc3AnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODE5NSwgJ2Vtc3AnXSwKKyAgICAgICAgICAgICAgICAgICAgICBbODIwMSwgJ3RoaW5zcCddLAorICAgICAgICAgICAgICAgICAgICAgXQorCisgICAgICAjIENvbnRhaW5zIHRoZSBtYXBwaW5nIG9mIGNvZGUgcG9pbnQgKG9yIG5hbWUpIHRvIHRoZSBhY3R1YWwgRW50aXR5IG9iamVjdC4KKyAgICAgIEVOVElUWV9NQVAgPSBIYXNoLm5ldyBkbyB8aCxrfAorICAgICAgICBpZiBrLmtpbmRfb2Y/KEludGVnZXIpCisgICAgICAgICAgaFtrXSA9IEVudGl0eS5uZXcoaywgbmlsKQorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgS3JhbWRvd246OkVycm9yLCAiQ2FuJ3QgaGFuZGxlIGdlbmVyaWMgbm9uLWludGVnZXIgY2hhcmFjdGVyIHJlZmVyZW5jZSAnI3trfSciCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEVOVElUWV9UQUJMRS5lYWNoIGRvIHxjb2RlX3BvaW50LCBkYXRhfAorICAgICAgICBpZiBkYXRhLmtpbmRfb2Y/KFN0cmluZykKKyAgICAgICAgICBFTlRJVFlfTUFQW2NvZGVfcG9pbnRdID0gRU5USVRZX01BUFtkYXRhXSA9IEVudGl0eS5uZXcoY29kZV9wb2ludCwgZGF0YSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIEVOVElUWV9NQVBbY29kZV9wb2ludF0gPSBFTlRJVFlfTUFQW2RhdGFdCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJuIHRoZSBlbnRpdHkgZm9yIHRoZSBnaXZlbiBjb2RlIHBvaW50IG9yIG5hbWUgK3BvaW50X29yX25hbWUrLgorICAgICAgZGVmIGVudGl0eShwb2ludF9vcl9uYW1lKQorICAgICAgICBFTlRJVFlfTUFQW3BvaW50X29yX25hbWVdCisgICAgICBlbmQKKworICAgICAgbW9kdWxlX2Z1bmN0aW9uIDplbnRpdHkKKworICAgIGVuZAorCisgIGVuZAorCitlbmQKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi91dGlscy9odG1sLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi91dGlscy9odG1sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGRkY2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3V0aWxzL2h0bWwucmIKQEAgLTAsMCArMSw3NyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCityZXF1aXJlICdyZXhtbC9wYXJzZXJzL2Jhc2VwYXJzZXInCisKK21vZHVsZSBLcmFtZG93bgorCisgIG1vZHVsZSBVdGlscworCisgICAgIyBQcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBIVE1MIHJlbGF0ZWQgdGFza3MuCisgICAgIworICAgICMgKk5vdGUqIHRoYXQgdGhpcyBtb2R1bGUgaGFzIHRvIGJlIG1peGVkIGludG8gYSBjbGFzcyB0aGF0IGhhcyBhIEByb290IChjb250YWluaW5nIGFuIGVsZW1lbnQKKyAgICAjIG9mIHR5cGUgOnJvb3QpIGFuZCBhbiBAb3B0aW9ucyAoY29udGFpbmluZyBhbiBvcHRpb25zIGhhc2gpIGluc3RhbmNlIHZhcmlhYmxlIHNvIHRoYXQgc29tZSBvZgorICAgICMgdGhlIG1ldGhvZHMgY2FuIHdvcmsgY29ycmVjdGx5LgorICAgIG1vZHVsZSBIdG1sCisKKyAgICAgICMgQ29udmVydCB0aGUgZW50aXR5ICtlKyB0byBhIHN0cmluZy4gVGhlIG9wdGlvbmFsIHBhcmFtZXRlciArb3JpZ2luYWwrIG1heSBjb250YWluIHRoZQorICAgICAgIyBvcmlnaW5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW50aXR5LgorICAgICAgIworICAgICAgIyBUaGlzIG1ldGhvZCB1c2VzIHRoZSBvcHRpb24gK2VudGl0eV9vdXRwdXQrIHRvIGRldGVybWluZSB0aGUgb3V0cHV0IGZvcm0gZm9yIHRoZSBlbnRpdHkuCisgICAgICBkZWYgZW50aXR5X3RvX3N0cihlLCBvcmlnaW5hbCA9IG5pbCkKKyAgICAgICAgZW50aXR5X291dHB1dCA9IEBvcHRpb25zWzplbnRpdHlfb3V0cHV0XQorCisgICAgICAgIGlmIGUuY2hhci5yZXNwb25kX3RvPyg6ZW5jb2RpbmcpICYmIGVudGl0eV9vdXRwdXQgPT0gOmFzX2NoYXIgJiYKKyAgICAgICAgICAgIChjID0gZS5jaGFyLmVuY29kZShAcm9vdC5vcHRpb25zWzplbmNvZGluZ10pIHJlc2N1ZSBuaWwpICYmCisgICAgICAgICAgICAoKGMgPSBlLmNoYXIpID09ICciJyB8fCAhRVNDQVBFX01BUC5oYXNfa2V5PyhjKSkKKyAgICAgICAgICBjCisgICAgICAgIGVsc2lmIChlbnRpdHlfb3V0cHV0ID09IDphc19pbnB1dCB8fCBlbnRpdHlfb3V0cHV0ID09IDphc19jaGFyKSAmJiBvcmlnaW5hbAorICAgICAgICAgIG9yaWdpbmFsCisgICAgICAgIGVsc2lmIChlbnRpdHlfb3V0cHV0ID09IDpzeW1ib2xpYyB8fCBFU0NBUEVfTUFQLmhhc19rZXk/KGUuY2hhcikpICYmICFlLm5hbWUubmlsPworICAgICAgICAgICImI3tlLm5hbWV9OyIKKyAgICAgICAgZWxzZSAjIGRlZmF1bHQgdG8gOm51bWVyaWMKKyAgICAgICAgICAiJiMje2UuY29kZV9wb2ludH07IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybiB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXR0cmlidXRlcyArYXR0cisuCisgICAgICBkZWYgaHRtbF9hdHRyaWJ1dGVzKGF0dHIpCisgICAgICAgIGF0dHIubWFwIHt8ayx2fCB2Lm5pbD8gfHwgKGsgPT0gJ2lkJyAmJiB2LnN0cmlwLmVtcHR5PykgPyAnJyA6ICIgI3trfT1cIiN7ZXNjYXBlX2h0bWwodi50b19zLCA6YXR0cmlidXRlKX1cIiIgfS5qb2luKCcnKQorICAgICAgZW5kCisKKyAgICAgICMgOnN0b3Bkb2M6CisgICAgICBFU0NBUEVfTUFQID0geworICAgICAgICAnPCcgPT4gJyZsdDsnLAorICAgICAgICAnPicgPT4gJyZndDsnLAorICAgICAgICAnJicgPT4gJyZhbXA7JywKKyAgICAgICAgJyInID0+ICcmcXVvdDsnCisgICAgICB9CisgICAgICBFU0NBUEVfQUxMX1JFID0gLzx8PnwmLworICAgICAgRVNDQVBFX1RFWFRfUkUgPSBSZWdleHAudW5pb24oUkVYTUw6OlBhcnNlcnM6OkJhc2VQYXJzZXI6OlJFRkVSRU5DRV9SRSwgLzx8PnwmLykKKyAgICAgIEVTQ0FQRV9BVFRSSUJVVEVfUkUgPSBSZWdleHAudW5pb24oUkVYTUw6OlBhcnNlcnM6OkJhc2VQYXJzZXI6OlJFRkVSRU5DRV9SRSwgLzx8PnwmfCIvKQorICAgICAgRVNDQVBFX1JFX0ZST01fVFlQRSA9IHsKKyAgICAgICAgOmFsbCA9PiBFU0NBUEVfQUxMX1JFLAorICAgICAgICA6dGV4dCA9PiBFU0NBUEVfVEVYVF9SRSwKKyAgICAgICAgOmF0dHJpYnV0ZSA9PiBFU0NBUEVfQVRUUklCVVRFX1JFCisgICAgICB9CisgICAgICAjIDpzdGFydGRvYzoKKworICAgICAgIyBFc2NhcGUgdGhlIHNwZWNpYWwgSFRNTCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgK3N0cisuIFRoZSBwYXJhbWV0ZXIgK3R5cGUrIHNwZWNpZmllcyB3aGF0CisgICAgICAjIGlzIGVzY2FwZWQ6IDphbGwgLSBhbGwgc3BlY2lhbCBIVE1MIGNoYXJhY3RlcnMgZXhjZXB0IHRoZSBxdW90YXRpb24gbWFyayBhcyB3ZWxsIGFzCisgICAgICAjIGVudGl0aWVzLCA6dGV4dCAtIGFsbCBzcGVjaWFsIEhUTUwgY2hhcmFjdGVycyBleGNlcHQgdGhlIHF1b3RhdGlvbiBtYXJrIGJ1dCBubyBlbnRpdGllcyBhbmQKKyAgICAgICMgOmF0dHJpYnV0ZSAtIGFsbCBzcGVjaWFsIEhUTUwgY2hhcmFjdGVycyBpbmNsdWRpbmcgdGhlIHF1b3RhdGlvbiBtYXJrIGJ1dCBubyBlbnRpdGllcy4KKyAgICAgIGRlZiBlc2NhcGVfaHRtbChzdHIsIHR5cGUgPSA6YWxsKQorICAgICAgICBzdHIuZ3N1YihFU0NBUEVfUkVfRlJPTV9UWVBFW3R5cGVdKSB7fG18IEVTQ0FQRV9NQVBbbV0gfHwgbX0KKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi91dGlscy9vcmRlcmVkX2hhc2gucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3V0aWxzL29yZGVyZWRfaGFzaC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU3NzNkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi91dGlscy9vcmRlcmVkX2hhc2gucmIKQEAgLTAsMCArMSw5MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNiBUaG9tYXMgTGVpdG5lciA8dF9sZWl0bmVyQGdteC5hdD4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Yga3JhbWRvd24gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVC4KKyMrKworIworCittb2R1bGUgS3JhbWRvd24KKworICBtb2R1bGUgVXRpbHMKKworICAgIGlmIFJVQllfVkVSU0lPTiA8ICcxLjknCisKKyAgICAgICMgQSBwYXJ0aWFsIGhhc2ggaW1wbGVtZW50YXRpb24gd2hpY2ggcHJlc2VydmVzIHRoZSBpbnNlcnRpb24gb3JkZXIgb2YgdGhlIGtleXMuCisgICAgICAjCisgICAgICAjICpOb3RlKiB0aGF0IHRoaXMgY2xhc3MgaXMgb25seSB1c2VkIG9uIFJ1YnkgMS44IHNpbmNlIHRoZSBidWlsdC1pbiBIYXNoIG9uIFJ1YnkgMS45CisgICAgICAjIGF1dG9tYXRpY2FsbHkgcHJlc2VydmVzIHRoZSBpbnNlcnRpb24gb3JkZXIuIEhvd2V2ZXIsIHRvIHJlbWFpbiBjb21wYXRpYmlsaXR5IG9ubHkgdGhlCisgICAgICAjIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIG1heSBiZSB1c2VkIHdoZW4gd29ya2luZyB3aXRoIE9yZGVyZWRIYXNoIG9uIFJ1YnkgMS45LgorICAgICAgY2xhc3MgT3JkZXJlZEhhc2gKKworICAgICAgICBpbmNsdWRlIEVudW1lcmFibGUKKworICAgICAgICAjIEluaXRpYWxpemUgdGhlIE9yZGVyZWRIYXNoIG9iamVjdC4KKyAgICAgICAgZGVmIGluaXRpYWxpemUKKyAgICAgICAgICBAZGF0YSA9ICB7fQorICAgICAgICAgIEBvcmRlciA9IFtdCisgICAgICAgIGVuZAorCisgICAgICAgICMgSXRlcmF0ZSBvdmVyIHRoZSBzdG9yZWQga2V5cyBpbiBpbnNlcnRpb24gb3JkZXIuCisgICAgICAgIGRlZiBlYWNoCisgICAgICAgICAgQG9yZGVyLmVhY2gge3xrfCB5aWVsZChrLCBAZGF0YVtrXSl9CisgICAgICAgIGVuZAorCisgICAgICAgICMgUmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlICtrZXkrLgorICAgICAgICBkZWYgW10oa2V5KQorICAgICAgICAgIEBkYXRhW2tleV0KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBSZXR1cm4gK3RydWUrIGlmIHRoZSBoYXNoIGNvbnRhaW5zIHRoZSBrZXkuCisgICAgICAgIGRlZiBoYXNfa2V5PyhrZXkpCisgICAgICAgICAgQGRhdGEuaGFzX2tleT8oa2V5KQorICAgICAgICBlbmQKKworICAgICAgICAjIFJldHVybiArdHJ1ZSsgaWYgdGhlIGhhc2ggY29udGFpbnMgbm8ga2V5cy4KKyAgICAgICAgZGVmIGVtcHR5PworICAgICAgICAgIEBkYXRhLmVtcHR5PworICAgICAgICBlbmQKKworICAgICAgICAjIFNldCB0aGUgdmFsdWUgZm9yIHRoZSAra2V5KyB0byArdmFsKy4KKyAgICAgICAgZGVmIFtdPShrZXksIHZhbCkKKyAgICAgICAgICBAb3JkZXIgPDwga2V5IGlmICFAZGF0YS5oYXNfa2V5PyhrZXkpCisgICAgICAgICAgQGRhdGFba2V5XSA9IHZhbAorICAgICAgICBlbmQKKworICAgICAgICAjIERlbGV0ZSB0aGUgK2tleSsuCisgICAgICAgIGRlZiBkZWxldGUoa2V5KQorICAgICAgICAgIEBvcmRlci5kZWxldGUoa2V5KQorICAgICAgICAgIEBkYXRhLmRlbGV0ZShrZXkpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBtZXJnZSEob3RoZXIpCisgICAgICAgICAgb3RoZXIuZWFjaCB7fGssdnwgc2VsZltrXSA9IHZ9CisgICAgICAgICAgc2VsZgorICAgICAgICBlbmQKKworICAgICAgICBkZWYgZHVwICM6bm9kb2M6CisgICAgICAgICAgbmV3X29iamVjdCA9IHN1cGVyCisgICAgICAgICAgbmV3X29iamVjdC5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBkYXRhLCBAZGF0YS5kdXApCisgICAgICAgICAgbmV3X29iamVjdC5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBvcmRlciwgQG9yZGVyLmR1cCkKKyAgICAgICAgICBuZXdfb2JqZWN0CisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiA9PShvdGhlcikgIzpub2RvYzoKKyAgICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIG90aGVyLmtpbmRfb2Y/KHNlbGYuY2xhc3MpCisgICAgICAgICAgQGRhdGEgPT0gb3RoZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAZGF0YSkgJiYgQG9yZGVyID09IG90aGVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QG9yZGVyKQorICAgICAgICBlbmQKKworICAgICAgICBkZWYgaW5zcGVjdCAjOm5vZG9jOgorICAgICAgICAgICJ7IiArIG1hcCB7fGssdnwgIiN7ay5pbnNwZWN0fT0+I3t2Lmluc3BlY3R9In0uam9pbigiICIpICsgIn0iCisgICAgICAgIGVuZAorCisgICAgICBlbmQKKworICAgIGVsc2UKKyAgICAgIE9yZGVyZWRIYXNoID0gSGFzaAorICAgIGVuZAorCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vdXRpbHMvc3RyaW5nX3NjYW5uZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3V0aWxzL3N0cmluZ19zY2FubmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjNiZWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbGliL2tyYW1kb3duL3V0aWxzL3N0cmluZ19zY2FubmVyLnJiCkBAIC0wLDAgKzEsODIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworCityZXF1aXJlICdzdHJzY2FuJworCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFV0aWxzCisKKyAgICAjIFRoaXMgcGF0Y2hlZCBTdHJpbmdTY2FubmVyIGFkZHMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGN1cnJlbnQgc2NhbiBwb3NpdGlvbiBhbmQgYQorICAgICMgc3RhcnRfbGluZV9udW1iZXIgb3ZlcnJpZGUgZm9yIG5lc3RlZCBTdHJpbmdTY2FubmVycy4KKyAgICBjbGFzcyBTdHJpbmdTY2FubmVyIDwgOjpTdHJpbmdTY2FubmVyCisKKyAgICAgICMgVGhlIHN0YXJ0IGxpbmUgbnVtYmVyLiBVc2VkIGZvciBuZXN0ZWQgU3RyaW5nU2Nhbm5lcnMgdGhhdCBzY2FuIGEgc3ViLXN0cmluZyBvZiB0aGUgc291cmNlCisgICAgICAjIGRvY3VtZW50LiBUaGUga3JhbWRvd24gcGFyc2VyIHVzZXMgdGhpcywgZS5nLiwgZm9yIHNwYW4gbGV2ZWwgcGFyc2Vycy4KKyAgICAgIGF0dHJfcmVhZGVyIDpzdGFydF9saW5lX251bWJlcgorCisgICAgICAjIFRha2VzIHRoZSBzdGFydCBsaW5lIG51bWJlciBhcyBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQuCisgICAgICAjCisgICAgICAjIE5vdGU6IFRoZSBvcmlnaW5hbCBzZWNvbmQgYXJndW1lbnQgaXMgbm8gbG9uZ2VyIHVzZWQgc28gdGhpcyBzaG91bGQgYmUgc2FmZS4KKyAgICAgIGRlZiBpbml0aWFsaXplKHN0cmluZywgc3RhcnRfbGluZV9udW1iZXIgPSAxKQorICAgICAgICBzdXBlcihzdHJpbmcpCisgICAgICAgIEBzdGFydF9saW5lX251bWJlciA9IHN0YXJ0X2xpbmVfbnVtYmVyIHx8IDEKKyAgICAgICAgQHByZXZpb3VzX3BvcyA9IDAKKyAgICAgICAgQHByZXZpb3VzX2xpbmVfbnVtYmVyID0gQHN0YXJ0X2xpbmVfbnVtYmVyCisgICAgICBlbmQKKworICAgICAgIyBTZXRzIHRoZSBieXRlIHBvc2l0aW9uIG9mIHRoZSBzY2FuIHBvaW50ZXIuCisgICAgICAjCisgICAgICAjIE5vdGU6IFRoaXMgYWxzbyByZXNldHMgc29tZSBpbnRlcm5hbCB2YXJpYWJsZXMsIHNvIGFsd2F5cyB1c2UgcG9zPSB3aGVuIHNldHRpbmcgdGhlIHBvc2l0aW9uCisgICAgICAjIGFuZCBkb24ndCB1c2UgYW55IG90aGVyIG1ldGhvZCBmb3IgdGhhdCEKKyAgICAgIGRlZiBwb3M9KHBvcykKKyAgICAgICAgaWYgc2VsZi5wb3MgPiBwb3MKKyAgICAgICAgICBAcHJldmlvdXNfbGluZV9udW1iZXIgPSBAc3RhcnRfbGluZV9udW1iZXIKKyAgICAgICAgICBAcHJldmlvdXNfcG9zID0gMAorICAgICAgICBlbmQKKyAgICAgICAgc3VwZXIKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmV2ZXJ0IHRoZSBieXRlIHBvc2l0aW9uIG9mIHRoZSBzdHJpbmcgc2Nhbm5lciBpbiBhIHBlcmZvcm1hbnQKKyAgICAgICMgd2F5LgorICAgICAgIworICAgICAgIyBUaGUgcmV0dXJuZWQgZGF0YSBjYW4gYmUgZmVkIHRvICNyZXZlcnRfcG9zIHRvIHJldmVydCB0aGUgcG9zaXRpb24gdG8gdGhlIHNhdmVkIG9uZS4KKyAgICAgICMKKyAgICAgICMgTm90ZTogSnVzdCBzYXZpbmcgI3BvcyB3b24ndCBiZSBlbm91Z2guCisgICAgICBkZWYgc2F2ZV9wb3MKKyAgICAgICAgW3BvcywgQHByZXZpb3VzX3BvcywgQHByZXZpb3VzX2xpbmVfbnVtYmVyXQorICAgICAgZW5kCisKKyAgICAgICMgUmV2ZXJ0IHRoZSBwb3NpdGlvbiB0byBvbmUgc2F2ZWQgYnkgI3NhdmVfcG9zLgorICAgICAgZGVmIHJldmVydF9wb3MoZGF0YSkKKyAgICAgICAgc2VsZi5wb3MgPSBkYXRhWzBdCisgICAgICAgIEBwcmV2aW91c19wb3MsIEBwcmV2aW91c19saW5lX251bWJlciA9IGRhdGFbMV0sIGRhdGFbMl0KKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIGZvciBjdXJyZW50IGNoYXJwb3MuCisgICAgICAjCisgICAgICAjIE5PVEU6IFJlcXVpcmVzIHRoYXQgYWxsIGxpbmUgZW5kaW5ncyBhcmUgbm9ybWFsaXplZCB0byAnXG4nCisgICAgICAjCisgICAgICAjIE5PVEU6IE5vcm1hbGx5IHdlJ2QgaGF2ZSB0byBhZGQgb25lIHRvIHRoZSBjb3VudCBvZiBuZXdsaW5lcyB0byBnZXQgdGhlIGNvcnJlY3QgbGluZSBudW1iZXIuCisgICAgICAjIEhvd2V2ZXIgd2UgYWRkIHRoZSBvbmUgaW5kaXJlY3RseSBieSB1c2luZyBhIG9uZS1iYXNlZCBzdGFydF9saW5lX251bWJlci4KKyAgICAgIGRlZiBjdXJyZW50X2xpbmVfbnVtYmVyCisgICAgICAgICMgTm90IHVzaW5nIHN0cmluZ1tAcHJldmlvdXNfcG9zLi5iZXN0X3Bvc10uY291bnQoJ1xuJykgYmVjYXVzZSBpdCBpcyBzbG93ZXIKKyAgICAgICAgc3Ryc2NhbiA9IDo6U3RyaW5nU2Nhbm5lci5uZXcoc3RyaW5nKQorICAgICAgICBzdHJzY2FuLnBvcyA9IEBwcmV2aW91c19wb3MKKyAgICAgICAgb2xkX3BvcyA9IHBvcyArIDEKKyAgICAgICAgQHByZXZpb3VzX2xpbmVfbnVtYmVyICs9IDEgd2hpbGUgc3Ryc2Nhbi5za2lwX3VudGlsKC9cbi8pICYmIHN0cnNjYW4ucG9zIDw9IG9sZF9wb3MKKworICAgICAgICBAcHJldmlvdXNfcG9zID0gKGVvcz8gPyBwb3MgOiBwb3MgKyAxKQorICAgICAgICBAcHJldmlvdXNfbGluZV9udW1iZXIKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vdXRpbHMvdW5pZGVjb2Rlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vdXRpbHMvdW5pZGVjb2Rlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMyNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi91dGlscy91bmlkZWNvZGVyLnJiCkBAIC0wLDAgKzEsNDggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKyMgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGNvZGUgb3JpZ2luYWxseSBmcm9tIHRoZSBTdHJpbmdleCBsaWJyYXJ5IGFuZCBuZWVkcyB0aGUgZGF0YSBmaWxlcyBmcm9tCisjIFN0cmluZ2V4IHRvIHdvcmsgY29ycmVjdGx5LgorCittb2R1bGUgS3JhbWRvd24KKyAgbW9kdWxlIFV0aWxzCisKKyAgICAjIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHRyYW5saXRlcmF0ZSBVbmljb2RlIHN0cmluZ3MgaW50byBwbGFpbiBBU0NJSSBvbmVzLgorICAgIG1vZHVsZSBVbmlkZWNvZGVyCisKKyAgICAgIGdlbSAnc3RyaW5nZXgnIGlmIGRlZmluZWQ/KEdlbSkKKyAgICAgIHBhdGggPSAkOi5maW5kIHt8ZGlyfCBGaWxlLmRpcmVjdG9yeT8oRmlsZS5qb2luKEZpbGUuZXhwYW5kX3BhdGgoZGlyKSwgInN0cmluZ2V4IiwgInVuaWRlY29kZXJfZGF0YSIpKX0KKworICAgICAgaWYgUlVCWV9WRVJTSU9OIDw9ICcxLjguNicgfHwgIXBhdGgKKyAgICAgICAgZGVmIHNlbGYuZGVjb2RlKHN0cmluZykKKyAgICAgICAgICBzdHJpbmcKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisKKyAgICAgICAgQ09ERVBPSU5UUyA9IEhhc2gubmV3IGRvIHxoLCBrfAorICAgICAgICAgIGhba10gPSBZQU1MLmxvYWRfZmlsZShGaWxlLmpvaW4ocGF0aCwgInN0cmluZ2V4IiwgInVuaWRlY29kZXJfZGF0YSIsICIje2t9LnltbCIpKQorICAgICAgICBlbmQKKworICAgICAgICAjIFRyYW5zbGl0ZXJhdGUgc3RyaW5nIGZyb20gVW5pY29kZSBpbnRvIEFTQ0lJLgorICAgICAgICBkZWYgc2VsZi5kZWNvZGUoc3RyaW5nKQorICAgICAgICAgIHN0cmluZy5nc3ViKC9bXlx4MDAtXHg3Zl0vdSkgZG8gfGNvZGVwb2ludHwKKyAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgIHVucGFja2VkID0gY29kZXBvaW50LnVucGFjaygiVSIpWzBdCisgICAgICAgICAgICAgIENPREVQT0lOVFNbInglMDJ4IiAlICh1bnBhY2tlZCA+PiA4KV1bdW5wYWNrZWQgJiAyNTVdCisgICAgICAgICAgICByZXNjdWUKKyAgICAgICAgICAgICAgIj8iCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vdmVyc2lvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9saWIva3JhbWRvd24vdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDdjMGMzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL2xpYi9rcmFtZG93bi92ZXJzaW9uLnJiCkBAIC0wLDAgKzEsMTUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworbW9kdWxlIEtyYW1kb3duCisKKyAgIyBUaGUga3JhbWRvd24gdmVyc2lvbi4KKyAgVkVSU0lPTiA9ICcxLjE0LjAnCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL21hbi9tYW4xL2tyYW1kb3duLjEgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvbWFuL21hbjEva3JhbWRvd24uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjM0ZGZhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL21hbi9tYW4xL2tyYW1kb3duLjEKQEAgLTAsMCArMSwzNjggQEAKKy5cIiBnZW5lcmF0ZWQgYnkga3JhbWRvd24KKy5USCAiS1JBTURPV04iICIxIiAiTm92ZW1iZXIgMjAxNiIKKy5TSCBOQU1FCitrcmFtZG93biBcLSBhIGZhc3QsIHB1cmVcLVJ1YnkgTWFya2Rvd25cLXN1cGVyc2V0IGNvbnZlcnRlcgorLlNIICJTWU5PUFNJUyIKK1xmQmtyYW1kb3duXGZQIFtcZklvcHRpb25zXGZQXSBbXGZJRklMRVxmUFwuXC5cLl0KKy5TSCAiREVTQ1JJUFRJT04iCitrcmFtZG93biBpcyBwcmltYXJpbHkgdXNlZCBmb3IgcGFyc2luZyBhIHN1cGVyc2V0IG9mIE1hcmtkb3duIGFuZCBjb252ZXJ0aW5nIGl0IHRvIGRpZmZlcmVudCBvdXRwdXQgZm9ybWF0c1wuIEl0IHN1cHBvcnRzIHN0YW5kYXJkIE1hcmtkb3duICh3aXRoIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucykgYW5kIHZhcmlvdXMgZXh0ZW5zaW9ucyBsaWtlIHRhYmxlcyBhbmQgZGVmaW5pdGlvbiBsaXN0c1wuIER1ZSB0byBpdHMgbW9kdWxhciBhcmNoaXRlY3R1cmUgaXQgYWxzbyBhbGxvd3Mgb3RoZXIgaW5wdXQgZm9ybWF0cyB0aGFuIE1hcmtkb3duLCBmb3IgZXhhbXBsZSwgSFRNTCBvciBHaXRodWIgRmxhdm9yZWQgTWFya2Rvd25cLgorLlAKK0lmIFxmSUZJTEVcZlAgaXMgbm90IHNwZWNpZmllZCwga3JhbWRvd24gcmVhZHMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXRcLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gdGhlIHN0YW5kYXJkIG91dHB1dFwuCisuUAorVGhlcmUgYXJlIHR3byBzZXRzIG9mIG9wdGlvbnMgdGhhdCBrcmFtZG93biBhY2NlcHRzOiBUaGUgZmlyc3Qgb25lIGluY2x1ZGVzIHRoZSBvcHRpb25zIHRoYXQgYXJlIHVzZWQgZGlyZWN0bHkgYnkgdGhlIGtyYW1kb3duIGJpbmFyeVwuIFRoZSBzZWNvbmQgc2V0IG9mIG9wdGlvbnMgY29udHJvbHMgaG93IGtyYW1kb3duIHBhcnNlcyBhbmQgY29udmVydHMgaXRzIGlucHV0XC4KKy5TSCAiQ0xJXC1PTkxZIE9QVElPTlMiCisuVFAKK1xmQlwtaVxmUCBcZklGT1JNQVRcZlAsIFxmQlwtXC1pbnB1dFxmUCBcZklGT1JNQVRcZlAKK1NwZWNpZnkgdGhlIGlucHV0IGZvcm1hdFwuIEF2YWlsYWJsZSBpbnB1dCBmb3JtYXRzOiBcZklrcmFtZG93blxmUCAodGhpcyBpcyB0aGUgZGVmYXVsdCksIFxmSW1hcmtkb3duXGZQLCBcZklHRk1cZlAgb3IgXGZJaHRtbFxmUFwmXC4KKy5UUAorXGZCXC1vXGZQIFxmSUZPUk1BVFxmUCwgXGZCXC1cLW91dHB1dFxmUCBcZklGT1JNQVRcZlAKK1NwZWNpZnkgb25lIG9yIG1vcmUgb3V0cHV0IGZvcm1hdHMgc2VwYXJhdGVkIGJ5IGNvbW1hczogXGZJaHRtbFxmUCAoZGVmYXVsdCksIFxmSWtyYW1kb3duXGZQLCBcZklsYXRleFxmUCwgXGZJcGRmXGZQLCBcZkltYW5cZlAgb3IgXGZJcmVtb3ZlX2h0bWxfdGFnc1xmUFwmXC4KKy5UUAorXGZCXC12XGZQLCBcZkJcLVwtdmVyc2lvblxmUAorU2hvdyB0aGUgdmVyc2lvbiBvZiBrcmFtZG93blwuCisuVFAKK1xmQlwtaFxmUCwgXGZCXC1cLWhlbHBcZlAKK1Nob3cgdGhlIGhlbHBcLgorLlNIICJLUkFNRE9XTiBPUFRJT05TIgorLlRQCitcZkJcLVwtYXV0b1wtaWRcLXByZWZpeFxmUCBcZklBUkdcZlAKK1ByZWZpeCB1c2VkIGZvciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBoZWFkZXIgSURzCisuUlMKKy5QCitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZXQgYSBwcmVmaXggZm9yIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBoZWFkZXIgSURzIHNvIHRoYXQgdGhlcmUgaXMgbm8gY29uZmxpY3Qgd2hlbiByZW5kZXJpbmcgbXVsdGlwbGUga3JhbWRvd24gZG9jdW1lbnRzIGludG8gb25lIG91dHB1dCBmaWxlIHNlcGFyYXRlbHlcLiBUaGUgcHJlZml4IHNob3VsZCBvbmx5IGNvbnRhaW4gY2hhcmFjdGVycyB0aGF0IGFyZSB2YWxpZCBpbiBhbiBJRCEKKy5QCitEZWZhdWx0OiBcW3UyMDE4XVxbdTIwMTldIFVzZWQgYnk6IEhUTUwvTGF0ZXggY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLVtub1wtXWF1dG9cLWlkXC1zdHJpcHBpbmdcZlAKK1N0cmlwIGFsbCBmb3JtYXR0aW5nIGZyb20gaGVhZGVyIHRleHQgZm9yIGF1dG9tYXRpYyBJRCBnZW5lcmF0aW9uCisuUlMKKy5QCitJZiB0aGlzIG9wdGlvbiBpcyBcZkJ0cnVlXGZQLCBvbmx5IHRoZSB0ZXh0IGVsZW1lbnRzIG9mIGEgaGVhZGVyIGFyZSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBJRCBsYXRlciAoaW4gY29udHJhc3QgdG8ganVzdCB1c2luZyB0aGUgcmF3IGhlYWRlciB0ZXh0IGxpbmUpXC4KKy5QCitUaGlzIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAyXC4wIGJlY2F1c2UgdGhpcyB3aWxsIGJlIHRoZSBkZWZhdWx0IHRoZW5cLgorLlAKK0RlZmF1bHQ6IGZhbHNlIFVzZWQgYnk6IGtyYW1kb3duIHBhcnNlcgorLlJFCisuVFAKK1xmQlwtXC1bbm9cLV1hdXRvXC1pZHNcZlAKK1VzZSBhdXRvbWF0aWMgaGVhZGVyIElEIGdlbmVyYXRpb24KKy5SUworLlAKK0lmIHRoaXMgb3B0aW9uIGlzIFxmQnRydWVcZlAsIElEIHZhbHVlcyBmb3IgYWxsIGhlYWRlcnMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGlmIG5vIElEIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkXC4KKy5QCitEZWZhdWx0OiB0cnVlIFVzZWQgYnk6IEhUTUwvTGF0ZXggY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLWNvZGVyYXlcLWJvbGRcLWV2ZXJ5XGZQIFxmSUFSR1xmUAorRGVmaW5lcyBob3cgb2Z0ZW4gYSBsaW5lIG51bWJlciBzaG91bGQgYmUgbWFkZSBib2xkCisuUlMKKy5QCitDYW4gZWl0aGVyIGJlIGFuIGludGVnZXIgb3IgZmFsc2UgKHRvIHR1cm4gb2ZmIGJvbGQgbGluZSBudW1iZXJzIGNvbXBsZXRlbHkpXC4KKy5QCitEZWZhdWx0OiAxMCBVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorLlJFCisuVFAKK1xmQlwtXC1jb2RlcmF5XC1jc3NcZlAgXGZJQVJHXGZQCitEZWZpbmVzIGhvdyB0aGUgaGlnaGxpZ2h0ZWQgY29kZSBnZXRzIHN0eWxlZAorLlJTCisuUAorUG9zc2libGUgdmFsdWVzIGFyZSA6Y2xhc3MgKENTUyBjbGFzc2VzIGFyZSBhcHBsaWVkIHRvIHRoZSBjb2RlIGVsZW1lbnRzLCBvbmUgbXVzdCBzdXBwbHkgdGhlIG5lZWRlZCBDU1MgZmlsZSkgb3IgOnN0eWxlIChkZWZhdWx0IENTUyBzdHlsZXMgYXJlIGRpcmVjdGx5IGFwcGxpZWQgdG8gdGhlIGNvZGUgZWxlbWVudHMpXC4KKy5QCitEZWZhdWx0OiBzdHlsZSBVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorLlJFCisuVFAKK1xmQlwtXC1jb2RlcmF5XC1kZWZhdWx0XC1sYW5nXGZQIFxmSUFSR1xmUAorU2V0cyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBmb3IgaGlnaGxpZ2h0aW5nIGNvZGUgYmxvY2tzCisuUlMKKy5QCitJZiBubyBsYW5ndWFnZSBpcyBzZXQgZm9yIGEgY29kZSBibG9jaywgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgdXNlZCBpbnN0ZWFkXC4gVGhlIHZhbHVlIGhhcyB0byBiZSBvbmUgb2YgdGhlIGxhbmd1YWdlcyBzdXBwb3J0ZWQgYnkgY29kZXJheSBvciBuaWwgaWYgbm8gZGVmYXVsdCBsYW5ndWFnZSBzaG91bGQgYmUgdXNlZFwuCisuUAorRGVmYXVsdDogbmlsIFVzZWQgYnk6IEhUTUwgY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLWNvZGVyYXlcLWxpbmVcLW51bWJlclwtc3RhcnRcZlAgXGZJQVJHXGZQCitUaGUgc3RhcnQgdmFsdWUgZm9yIHRoZSBsaW5lIG51bWJlcnMKKy5SUworLlAKK0RlZmF1bHQ6IDEgVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKKy5SRQorLlRQCitcZkJcLVwtY29kZXJheVwtbGluZVwtbnVtYmVyc1xmUCBcZklBUkdcZlAKK0RlZmluZXMgaG93IGFuZCBpZiBsaW5lIG51bWJlcnMgc2hvdWxkIGJlIHNob3duCisuUlMKKy5QCitUaGUgcG9zc2libGUgdmFsdWVzIGFyZSA6dGFibGUsIDppbmxpbmUgb3IgbmlsXC4gSWYgdGhpcyBvcHRpb24gaXMgbmlsLCBubyBsaW5lIG51bWJlcnMgYXJlIHNob3duXC4KKy5QCitEZWZhdWx0OiA6aW5saW5lIFVzZWQgYnk6IEhUTUwgY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLWNvZGVyYXlcLXRhYlwtd2lkdGhcZlAgXGZJQVJHXGZQCitUaGUgdGFiIHdpZHRoIHVzZWQgaW4gaGlnaGxpZ2h0ZWQgY29kZQorLlJTCisuUAorVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKKy5SRQorLlRQCitcZkJcLVwtY29kZXJheVwtd3JhcFxmUCBcZklBUkdcZlAKK0RlZmluZXMgaG93IHRoZSBoaWdobGlnaHRlZCBjb2RlIHNob3VsZCBiZSB3cmFwcGVkCisuUlMKKy5QCitUaGUgcG9zc2libGUgdmFsdWVzIGFyZSA6c3BhbiwgOmRpdiBvciBuaWxcLgorLlAKK0RlZmF1bHQ6IDpkaXYgVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKKy5SRQorLlRQCitcZkJcLVwtW25vXC1dZW5hYmxlXC1jb2RlcmF5XGZQCitVc2UgY29kZXJheSBmb3Igc3ludGF4IGhpZ2hsaWdodGluZworLlJTCisuUAorSWYgdGhpcyBvcHRpb24gaXMgXGZCdHJ1ZVxmUCwgY29kZXJheSBpcyB1c2VkIGJ5IHRoZSBIVE1MIGNvbnZlcnRlciBmb3Igc3ludGF4IGhpZ2hsaWdodGluZyB0aGUgY29udGVudCBvZiBjb2RlIHNwYW5zIGFuZCBjb2RlIGJsb2Nrc1wuCisuUAorRGVmYXVsdDogdHJ1ZSBVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorLlJFCisuVFAKK1xmQlwtXC1lbnRpdHlcLW91dHB1dFxmUCBcZklBUkdcZlAKK0RlZmluZXMgaG93IGVudGl0aWVzIGFyZSBvdXRwdXQKKy5SUworLlAKK1RoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIDphc19pbnB1dCAoZW50aXRpZXMgYXJlIG91dHB1dCBpbiB0aGUgc2FtZSBmb3JtIGFzIGZvdW5kIGluIHRoZSBpbnB1dCksIDpudW1lcmljIChlbnRpdGllcyBhcmUgb3V0cHV0IGluIG51bWVyaWMgZm9ybSksIDpzeW1ib2xpYyAoZW50aXRpZXMgYXJlIG91dHB1dCBpbiBzeW1ib2xpYyBmb3JtIGlmIHBvc3NpYmxlKSBvciA6YXNfY2hhciAoZW50aXRpZXMgYXJlIG91dHB1dCBhcyBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlLCBvbmx5IGF2YWlsYWJsZSBvbiBSdWJ5IDFcLjkpXC4KKy5QCitEZWZhdWx0OiA6YXNfY2hhciBVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlciwga3JhbWRvd24gY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLWZvb3Rub3RlXC1iYWNrbGlua1xmUCBcZklBUkdcZlAKK0RlZmluZXMgdGhlIHRleHQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGZvb3Rub3RlIGJhY2tsaW5rcworLlJTCisuUAorVGhlIGZvb3Rub3RlIGJhY2tsaW5rIGlzIGp1c3QgdGV4dCwgc28gYW55IHNwZWNpYWwgSFRNTCBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZFwuCisuUAorSWYgdGhlIGZvb3Rub3RlIGJhY2tsaW50IHRleHQgaXMgYW4gZW1wdHkgc3RyaW5nLCBubyBmb290bm90ZSBiYWNrbGlua3Mgd2lsbCBiZSBnZW5lcmF0ZWRcLgorLlAKK0RlZmF1bHQ6IFxbdTIwMThdXFt1MDAyNl04NjE3O1xbdTIwMTldIFVzZWQgYnk6IEhUTUwgY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLWZvb3Rub3RlXC1uclxmUCBcZklBUkdcZlAKK1RoZSBudW1iZXIgb2YgdGhlIGZpcnN0IGZvb3Rub3RlCisuUlMKKy5QCitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgdGhhdCBpcyB1c2VkIGZvciB0aGUgZmlyc3QgZm9vdG5vdGVcLgorLlAKK0RlZmF1bHQ6IDEgVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKKy5SRQorLlRQCitcZkJcLVwtZ2ZtXC1xdWlya3NcZlAgXGZJQVJHXGZQCitFbmFibGVzIGEgc2V0IG9mIEdGTSBzcGVjaWZpYyBxdWlya3MKKy5SUworLlAKK1RoZSB3YXkgaG93IEdGTSBpcyB0cmFuc2Zvcm1lZCBvbiBHaXRodWIgb2Z0ZW4gZGlmZmVycyBmcm9tIHRoZSB3YXkga3JhbWRvd24gZG9lcyB0aGluZ3NcLiBNYW55IG9mIHRoZXNlIGRpZmZlcmVuY2VzIGFyZSBuZWdsaWdpYmxlIGJ1dCBvdGhlcnMgYXJlIG5vdFwuCisuUAorVGhpcyBvcHRpb24gYWxsb3dzIG9uZSB0byBlbmFibGUvZGlzYWJsZSBjZXJ0YWluIEdGTSBxdWlya3MsIGlcLmVcLiB3YXlzIGluIHdoaWNoIEdGTSBwYXJzaW5nIGRpZmZlcnMgZnJvbSBrcmFtZG93biBwYXJzaW5nXC4KKy5QCitUaGUgdmFsdWUgaGFzIHRvIGJlIGEgbGlzdCBvZiBxdWlyayBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkLCBzZXBhcmF0ZWQgYnkgY29tbWFzXC4gUG9zc2libGUgbmFtZXMgYXJlOgorLklQIFwoYnUgNAorcGFyYWdyYXBoX2VuZAorLlJTCisuUAorRGlzYWJsZXMgdGhlIGtyYW1kb3duIHJlc3RyaWN0aW9uIHRoYXQgYXQgbGVhc3Qgb25lIGJsYW5rIGxpbmUgaGFzIHRvIGJlIHVzZWQgYWZ0ZXIgYSBwYXJhZ3JhcGggYmVmb3JlIGEgbmV3IGJsb2NrIGVsZW1lbnQgY2FuIGJlIHN0YXJ0ZWRcLgorLlAKK05vdGUgdGhhdCBpZiB0aGlzIHF1aXJrIGlzIHVzZWQsIGxhenkgbGluZSB3cmFwcGluZyBkb2VzIG5vdCBmdWxseSB3b3JrIGFueW1vcmUhCisuUkUKKy5QCitEZWZhdWx0OiBwYXJhZ3JhcGhfZW5kIFVzZWQgYnk6IEdGTSBwYXJzZXIKKy5SRQorLlRQCitcZkJcLVwtW25vXC1daGFyZFwtd3JhcFxmUAorSW50ZXJwcmV0cyBsaW5lIGJyZWFrcyBsaXRlcmFsbHkKKy5SUworLlAKK0luc2VydCBIVE1MIFxmQjxiciAvPlxmUCB0YWdzIGluc2lkZSBwYXJhZ3JhcGhzIHdoZXJlIHRoZSBvcmlnaW5hbCBNYXJrZG93biBkb2N1bWVudCBoYWQgbmV3bGluZXMgKGJ5IGRlZmF1bHQsIE1hcmtkb3duIGlnbm9yZXMgdGhlc2UgbmV3bGluZXMpXC4KKy5QCitEZWZhdWx0OiB0cnVlIFVzZWQgYnk6IEdGTSBwYXJzZXIKKy5SRQorLlRQCitcZkJcLVwtaGVhZGVyXC1vZmZzZXRcZlAgXGZJQVJHXGZQCitTZXRzIHRoZSBvdXRwdXQgb2Zmc2V0IGZvciBoZWFkZXJzCisuUlMKKy5QCitJZiB0aGlzIG9wdGlvbiBpcyBjIChtYXkgYWxzbyBiZSBuZWdhdGl2ZSkgdGhlbiBhIGhlYWRlciB3aXRoIGxldmVsIG4gd2lsbCBiZSBvdXRwdXQgYXMgYSBoZWFkZXIgd2l0aCBsZXZlbCBjK25cLiBJZiBjK24gaXMgbG93ZXIgdGhhbiAxLCBsZXZlbCAxIHdpbGwgYmUgdXNlZFwuIElmIGMrbiBpcyBncmVhdGVyIHRoYW4gNiwgbGV2ZWwgNiB3aWxsIGJlIHVzZWRcLgorLlAKK0RlZmF1bHQ6IDAgVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIsIEtyYW1kb3duIGNvbnZlcnRlciwgTGF0ZXggY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLVtub1wtXWh0bWxcLXRvXC1uYXRpdmVcZlAKK0NvbnZlcnQgSFRNTCBlbGVtZW50cyB0byBuYXRpdmUgZWxlbWVudHMKKy5SUworLlAKK0lmIHRoaXMgb3B0aW9uIGlzIFxmQnRydWVcZlAsIHRoZSBwYXJzZXIgY29udmVydHMgSFRNTCBlbGVtZW50cyB0byBuYXRpdmUgZWxlbWVudHNcLiBGb3IgZXhhbXBsZSwgd2hlbiBwYXJzaW5nIFxmQjxlbT5oYWxsbzwvZW0+XGZQIHRoZSBlbXBoYXNpcyB0YWcgd291bGQgbm9ybWFsbHkgYmUgY29udmVydGVkIHRvIGFuIFxmQjpodG1sXGZQIGVsZW1lbnQgd2l0aCB0YWcgdHlwZSBcZkI6ZW1cZlBcJlwuIElmIFxmQmh0bWxfdG9fbmF0aXZlXGZQIGlzIFxmQnRydWVcZlAsIHRoZW4gdGhlIGVtcGhhc2lzIHdvdWxkIGJlIGNvbnZlcnRlZCB0byBhIG5hdGl2ZSBcZkI6ZW1cZlAgZWxlbWVudFwuCisuUAorVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnZlcnRlcnMgdGhhdCBjYW5ub3QgZGVhbCB3aXRoIEhUTUwgZWxlbWVudHNcLgorLlAKK0RlZmF1bHQ6IGZhbHNlIFVzZWQgYnk6IGtyYW1kb3duIHBhcnNlcgorLlJFCisuVFAKK1xmQlwtXC1sYXRleFwtaGVhZGVyc1xmUCBcZklBUkdcZlAKK0RlZmluZXMgdGhlIExhVGVYIGNvbW1hbmRzIGZvciBkaWZmZXJlbnQgaGVhZGVyIGxldmVscworLlJTCisuUAorVGhlIGNvbW1hbmRzIGZvciB0aGUgaGVhZGVyIGxldmVscyBvbmUgdG8gc2l4IGNhbiBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggY29tbWFzXC4KKy5QCitEZWZhdWx0OiBzZWN0aW9uLHN1YnNlY3Rpb24sc3Vic3Vic2VjdGlvbixwYXJhZ3JhcGgsc3VicGFyYWdyYXBoLHN1YnBhcmFncmFwaCBVc2VkIGJ5OiBMYXRleCBjb252ZXJ0ZXIKKy5SRQorLlRQCitcZkJcLVwtbGluZVwtd2lkdGhcZlAgXGZJQVJHXGZQCitEZWZpbmVzIHRoZSBsaW5lIHdpZHRoIHRvIGJlIHVzZWQgd2hlbiBvdXRwdXR0aW5nIGEgZG9jdW1lbnQKKy5SUworLlAKK0RlZmF1bHQ6IDcyIFVzZWQgYnk6IGtyYW1kb3duIGNvbnZlcnRlcgorLlJFCisuVFAKK1xmQlwtXC1saW5rXC1kZWZzXGZQIFxmSUFSR1xmUAorUHJlXC1kZWZpbmVzIGxpbmsgZGVmaW5pdGlvbnMKKy5SUworLlAKK1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHByZVwtZGVmaW5lIGxpbmsgZGVmaW5pdGlvbnNcLiBUaGUgdmFsdWUgbmVlZHMgdG8gYmUgYSBIYXNoIHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgbGluayBpZGVudGlmaWVycyBhbmQgdGhlIHZhbHVlcyBhcmUgdHdvIGVsZW1lbnQgQXJyYXlzIHdpdGggdGhlIGxpbmsgVVJMIGFuZCB0aGUgbGluayB0aXRsZVwuCisuUAorSWYgdGhlIHZhbHVlIGlzIGEgU3RyaW5nLCBpdCBoYXMgdG8gY29udGFpbiBhIHZhbGlkIFlBTUwgaGFzaCBhbmQgdGhlIGhhc2ggaGFzIHRvIGZvbGxvdyB0aGUgYWJvdmUgZ3VpZGVsaW5lc1wuCisuUAorRGVmYXVsdDoge30gVXNlZCBieToga3JhbWRvd24gcGFyc2VyCisuUkUKKy5UUAorXGZCXC1cLW1hdGhcLWVuZ2luZVxmUCBcZklBUkdcZlAKK1NldCB0aGUgbWF0aCBlbmdpbmUKKy5SUworLlAKK1NwZWNpZmllcyB0aGUgbWF0aCBlbmdpbmUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgY29udmVydGluZyBtYXRoIGJsb2Nrcy9zcGFuc1wuIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byArbmlsKywgbm8gbWF0aCBlbmdpbmUgaXMgdXNlZCBhbmQgdGhlIG1hdGggYmxvY2tzL3NwYW5zIGFyZSBvdXRwdXQgYXMgaXNcLgorLlAKK09wdGlvbnMgZm9yIHRoZSBzZWxlY3RlZCBtYXRoIGVuZ2luZSBjYW4gYmUgc2V0IHdpdGggdGhlIG1hdGhfZW5naW5lX29wdHMgY29uZmlndXJhdGlvbiBvcHRpb25cLgorLlAKK0RlZmF1bHQ6IG1hdGhqYXggVXNlZCBieTogSFRNTCBjb252ZXJ0ZXIKKy5SRQorLlRQCitcZkJcLVwtbWF0aFwtZW5naW5lXC1vcHRzXGZQIFxmSUFSR1xmUAorU2V0IHRoZSBtYXRoIGVuZ2luZSBvcHRpb25zCisuUlMKKy5QCitTcGVjaWZpZXMgb3B0aW9ucyBmb3IgdGhlIG1hdGggZW5naW5lIHNldCB2aWEgdGhlIG1hdGhfZW5naW5lIGNvbmZpZ3VyYXRpb24gb3B0aW9uXC4KKy5QCitUaGUgdmFsdWUgbmVlZHMgdG8gYmUgYSBoYXNoIHdpdGgga2V5XC12YWx1ZSBwYWlycyB0aGF0IGFyZSB1bmRlcnN0b29kIGJ5IHRoZSB1c2VkIG1hdGggZW5naW5lXC4KKy5QCitEZWZhdWx0OiB7fSBVc2VkIGJ5OiBIVE1MIGNvbnZlcnRlcgorLlJFCisuVFAKK1xmQlwtXC1bbm9cLV1wYXJzZVwtYmxvY2tcLWh0bWxcZlAKK1Byb2Nlc3Mga3JhbWRvd24gc3ludGF4IGluIGJsb2NrIEhUTUwgdGFncworLlJTCisuUAorSWYgdGhpcyBvcHRpb24gaXMgXGZCdHJ1ZVxmUCwgdGhlIGtyYW1kb3duIHBhcnNlciBwcm9jZXNzZXMgdGhlIGNvbnRlbnQgb2YgYmxvY2sgSFRNTCB0YWdzIGFzIHRleHQgY29udGFpbmluZyBibG9ja1wtbGV2ZWwgZWxlbWVudHNcLiBTaW5jZSB0aGlzIGlzIG5vdCB3YW50ZWQgbm9ybWFsbHksIHRoZSBkZWZhdWx0IGlzIFxmQmZhbHNlXGZQXCZcLiBJdCBpcyBub3JtYWxseSBiZXR0ZXIgdG8gc2VsZWN0aXZlbHkgZW5hYmxlIGtyYW1kb3duIHByb2Nlc3NpbmcgdmlhIHRoZSBtYXJrZG93biBhdHRyaWJ1dGVcLgorLlAKK0RlZmF1bHQ6IGZhbHNlIFVzZWQgYnk6IGtyYW1kb3duIHBhcnNlcgorLlJFCisuVFAKK1xmQlwtXC1bbm9cLV1wYXJzZVwtc3BhblwtaHRtbFxmUAorUHJvY2VzcyBrcmFtZG93biBzeW50YXggaW4gc3BhbiBIVE1MIHRhZ3MKKy5SUworLlAKK0lmIHRoaXMgb3B0aW9uIGlzIFxmQnRydWVcZlAsIHRoZSBrcmFtZG93biBwYXJzZXIgcHJvY2Vzc2VzIHRoZSBjb250ZW50IG9mIHNwYW4gSFRNTCB0YWdzIGFzIHRleHQgY29udGFpbmluZyBzcGFuXC1sZXZlbCBlbGVtZW50c1wuCisuUAorRGVmYXVsdDogdHJ1ZSBVc2VkIGJ5OiBrcmFtZG93biBwYXJzZXIKKy5SRQorLlRQCitcZkJcLVwtW25vXC1dcmVtb3ZlXC1ibG9ja1wtaHRtbFwtdGFnc1xmUAorUmVtb3ZlIGJsb2NrIEhUTUwgdGFncworLlJTCisuUAorSWYgdGhpcyBvcHRpb24gaXMgXGZCdHJ1ZVxmUCwgdGhlIFJlbW92ZUh0bWxUYWdzIGNvbnZlcnRlciByZW1vdmVzIGJsb2NrIEhUTUwgdGFnc1wuCisuUAorRGVmYXVsdDogdHJ1ZSBVc2VkIGJ5OiBSZW1vdmVIdG1sVGFncyBjb252ZXJ0ZXIKKy5SRQorLlRQCitcZkJcLVwtW25vXC1dcmVtb3ZlXC1zcGFuXC1odG1sXC10YWdzXGZQCitSZW1vdmUgc3BhbiBIVE1MIHRhZ3MKKy5SUworLlAKK0lmIHRoaXMgb3B0aW9uIGlzIFxmQnRydWVcZlAsIHRoZSBSZW1vdmVIdG1sVGFncyBjb252ZXJ0ZXIgcmVtb3ZlcyBzcGFuIEhUTUwgdGFnc1wuCisuUAorRGVmYXVsdDogZmFsc2UgVXNlZCBieTogUmVtb3ZlSHRtbFRhZ3MgY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLXNtYXJ0XC1xdW90ZXNcZlAgXGZJQVJHXGZQCitEZWZpbmVzIHRoZSBIVE1MIGVudGl0eSBuYW1lcyBvciBjb2RlIHBvaW50cyBmb3Igc21hcnQgcXVvdGUgb3V0cHV0CisuUlMKKy5QCitUaGUgZW50aXRpZXMgaWRlbnRpZmllZCBieSBlbnRpdHkgbmFtZSBvciBjb2RlIHBvaW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yLCBpbiBvcmRlciwgYSBsZWZ0IHNpbmdsZSBxdW90ZSwgYSByaWdodCBzaW5nbGUgcXVvdGUsIGEgbGVmdCBkb3VibGUgYW5kIGEgcmlnaHQgZG91YmxlIHF1b3RlIGFyZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggY29tbWFzXC4KKy5QCitEZWZhdWx0OiBsc3F1byxyc3F1byxsZHF1byxyZHF1byBVc2VkIGJ5OiBIVE1ML0xhdGV4IGNvbnZlcnRlcgorLlJFCisuVFAKK1xmQlwtXC1zeW50YXhcLWhpZ2hsaWdodGVyXGZQIFxmSUFSR1xmUAorU2V0IHRoZSBzeW50YXggaGlnaGxpZ2h0ZXIKKy5SUworLlAKK1NwZWNpZmllcyB0aGUgc3ludGF4IGhpZ2hsaWdodGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGhpZ2hsaWdodGluZyBjb2RlIGJsb2NrcyBhbmQgc3BhbnNcLiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gK25pbCssIG5vIHN5bnRheCBoaWdobGlnaHRpbmcgaXMgZG9uZVwuCisuUAorT3B0aW9ucyBmb3IgdGhlIHN5bnRheCBoaWdobGlnaHRlciBjYW4gYmUgc2V0IHdpdGggdGhlIHN5bnRheF9oaWdobGlnaHRlcl9vcHRzIGNvbmZpZ3VyYXRpb24gb3B0aW9uXC4KKy5QCitEZWZhdWx0OiBjb2RlcmF5IFVzZWQgYnk6IEhUTUwvTGF0ZXggY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLXN5bnRheFwtaGlnaGxpZ2h0ZXJcLW9wdHNcZlAgXGZJQVJHXGZQCitTZXQgdGhlIHN5bnRheCBoaWdobGlnaHRlciBvcHRpb25zCisuUlMKKy5QCitTcGVjaWZpZXMgb3B0aW9ucyBmb3IgdGhlIHN5bnRheCBoaWdobGlnaHRlciBzZXQgdmlhIHRoZSBzeW50YXhfaGlnaGxpZ2h0ZXIgY29uZmlndXJhdGlvbiBvcHRpb25cLgorLlAKK1RoZSB2YWx1ZSBuZWVkcyB0byBiZSBhIGhhc2ggd2l0aCBrZXlcLXZhbHVlIHBhaXJzIHRoYXQgYXJlIHVuZGVyc3Rvb2QgYnkgdGhlIHVzZWQgc3ludGF4IGhpZ2hsaWdodGVyXC4KKy5QCitEZWZhdWx0OiB7fSBVc2VkIGJ5OiBIVE1ML0xhdGV4IGNvbnZlcnRlcgorLlJFCisuVFAKK1xmQlwtXC10ZW1wbGF0ZVxmUCBcZklBUkdcZlAKK1RoZSBuYW1lIG9mIGFuIEVSQiB0ZW1wbGF0ZSBmaWxlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gd3JhcCB0aGUgb3V0cHV0IG9yIHRoZSBFUkIgdGVtcGxhdGUgaXRzZWxmXC4KKy5SUworLlAKK1RoaXMgaXMgdXNlZCB0byB3cmFwIHRoZSBvdXRwdXQgaW4gYW4gZW52aXJvbm1lbnQgc28gdGhhdCB0aGUgb3V0cHV0IGNhbiBiZSB1c2VkIGFzIGEgc3RhbmRcLWFsb25lIGRvY3VtZW50XC4gRm9yIGV4YW1wbGUsIGFuIEhUTUwgdGVtcGxhdGUgd291bGQgcHJvdmlkZSB0aGUgbmVlZGVkIGhlYWRlciBhbmQgYm9keSB0YWdzIHNvIHRoYXQgdGhlIHdob2xlIG91dHB1dCBpcyBhIHZhbGlkIEhUTUwgZmlsZVwuIElmIG5vIHRlbXBsYXRlIGlzIHNwZWNpZmllZCwgdGhlIG91dHB1dCB3aWxsIGJlIGp1c3QgdGhlIGNvbnZlcnRlZCB0ZXh0XC4KKy5QCitXaGVuIHJlc29sdmluZyB0aGUgdGVtcGxhdGUgZmlsZSwgdGhlIGdpdmVuIHRlbXBsYXRlIG5hbWUgaXMgdXNlZCBmaXJzdFwuIElmIHN1Y2ggYSBmaWxlIGlzIG5vdCBmb3VuZCwgdGhlIGNvbnZlcnRlciBleHRlbnNpb24gKHRoZSBzYW1lIGFzIHRoZSBjb252ZXJ0ZXIgbmFtZSkgaXMgYXBwZW5kZWRcLiBJZiB0aGUgZmlsZSBzdGlsbCBjYW5ub3QgYmUgZm91bmQsIHRoZSB0ZW1wbGF0ZXMgbmFtZSBpcyBpbnRlcnByZXRlZCBhcyBhIHRlbXBsYXRlIG5hbWUgdGhhdCBpcyBwcm92aWRlZCBieSBrcmFtZG93biAod2l0aG91dCB0aGUgY29udmVydGVyIGV4dGVuc2lvbilcLiBJZiB0aGUgZmlsZSBpcyBzdGlsbCBub3QgZm91bmQsIHRoZSB0ZW1wbGF0ZSBuYW1lIGlzIGNoZWNrZWQgaWYgaXQgc3RhcnRzIHdpdGggXFt1MjAxOF1zdHJpbmc6Ly9cW3UyMDE5XSBhbmQgaWYgaXQgZG9lcywgdGhpcyBwcmVmaXggaXMgcmVtb3ZlZCBhbmQgdGhlIHJlc3QgaXMgdXNlZCBhcyB0ZW1wbGF0ZSBjb250ZW50XC4KKy5QCitrcmFtZG93biBwcm92aWRlcyBhIGRlZmF1bHQgdGVtcGxhdGUgbmFtZWQgXFt1MjAxOF1kb2N1bWVudFxbdTIwMTldIGZvciBlYWNoIGNvbnZlcnRlclwuCisuUAorRGVmYXVsdDogXFt1MjAxOF1cW3UyMDE5XSBVc2VkIGJ5OiBhbGwgY29udmVydGVycworLlJFCisuVFAKK1xmQlwtXC10b2NcLWxldmVsc1xmUCBcZklBUkdcZlAKK0RlZmluZXMgdGhlIGxldmVscyB0aGF0IGFyZSB1c2VkIGZvciB0aGUgdGFibGUgb2YgY29udGVudHMKKy5SUworLlAKK1RoZSBpbmRpdmlkdWFsIGxldmVscyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIGNvbW1hcyAoZVwuZ1wuIDEsMiwzKSBvciBieSB1c2luZyB0aGUgcmFuZ2Ugc3ludGF4IChlXC5nXC4gMVwuXC4zKVwuIE9ubHkgdGhlIHNwZWNpZmllZCBsZXZlbHMgYXJlIHVzZWQgZm9yIHRoZSB0YWJsZSBvZiBjb250ZW50c1wuCisuUAorRGVmYXVsdDogMVwuXC42IFVzZWQgYnk6IEhUTUwvTGF0ZXggY29udmVydGVyCisuUkUKKy5UUAorXGZCXC1cLVtub1wtXXRyYW5zbGl0ZXJhdGVkXC1oZWFkZXJcLWlkc1xmUAorVHJhbnNsaXRlcmF0ZSB0aGUgaGVhZGVyIHRleHQgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIElECisuUlMKKy5QCitPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgYXJlIHVzZWQgaW4gaGVhZGVycyBJRHNcLiBUaGlzIGlzIG5vdCBnb29kIGZvciBsYW5ndWFnZXMgd2l0aCBtYW55IG5vblwtQVNDSUkgY2hhcmFjdGVyc1wuIEJ5IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHRoZSBoZWFkZXIgdGV4dCBpcyB0cmFuc2xpdGVyYXRlZCB0byBBU0NJSSBhcyBnb29kIGFzIHBvc3NpYmxlIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBoZWFkZXIgSUQgaXMgbW9yZSB1c2VmdWxcLgorLlAKK1RoZSBzdHJpbmdleCBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBmb3IgdGhpcyBmZWF0dXJlIHRvIHdvcmshCisuUAorRGVmYXVsdDogZmFsc2UgVXNlZCBieTogSFRNTC9MYXRleCBjb252ZXJ0ZXIKKy5SRQorLlNIICJFWElUIFNUQVRVUyIKK1RoZSBleGl0IHN0YXR1cyBpcyAwIGlmIG5vIGVycm9yIGhhcHBlbmVkXC4gT3RoZXJ3aXNlIGl0IGlzIDFcLgorLlNIICJTRUUgQUxTTyIKK1RoZSBrcmFtZG93biB3ZWJzaXRlIAorLlVSIGh0dHA6Ly9rcmFtZG93blwuZ2V0dGFsb25nXC5vcmcKKy5VRQorZm9yIG1vcmUgaW5mb3JtYXRpb24sIGVzcGVjaWFsbHkgb24gdGhlIHN1cHBvcnRlZCBpbnB1dCBzeW50YXhcLgorLlNIICJBVVRIT1IiCitrcmFtZG93biB3YXMgd3JpdHRlbiBieSBUaG9tYXMgTGVpdG5lciAKKy5NVCB0X2xlaXRuZXJAZ214XC5hdAorLlVFCitcJlwuCisuUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBUaG9tYXMgTGVpdG5lciAKKy5NVCB0X2xlaXRuZXJAZ214XC5hdAorLlVFCitcJlwuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvc2V0dXAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvc2V0dXAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxZTE5OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC9zZXR1cC5yYgpAQCAtMCwwICsxLDE1ODUgQEAKKyMKKyMgc2V0dXAucmIKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2kKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuCisjIFlvdSBjYW4gZGlzdHJpYnV0ZS9tb2RpZnkgdGhpcyBwcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZgorIyB0aGUgR05VIExHUEwsIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLgorIworCit1bmxlc3MgRW51bWVyYWJsZS5tZXRob2RfZGVmaW5lZD8oOm1hcCkgICAjIFJ1YnkgMS40LjYKKyAgbW9kdWxlIEVudW1lcmFibGUKKyAgICBhbGlhcyBtYXAgY29sbGVjdAorICBlbmQKK2VuZAorCit1bmxlc3MgRmlsZS5yZXNwb25kX3RvPyg6cmVhZCkgICAjIFJ1YnkgMS42CisgIGRlZiBGaWxlLnJlYWQoZm5hbWUpCisgICAgb3BlbihmbmFtZSkge3xmfAorICAgICAgcmV0dXJuIGYucmVhZAorICAgIH0KKyAgZW5kCitlbmQKKwordW5sZXNzIEVycm5vLmNvbnN0X2RlZmluZWQ/KDpFTk9URU1QVFkpICAgIyBXaW5kb3dzPworICBtb2R1bGUgRXJybm8KKyAgICBjbGFzcyBFTk9URU1QVFkKKyAgICAgICMgV2UgZG8gbm90IHJhaXNlIHRoaXMgZXhjZXB0aW9uLCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgbmVlZGVkLgorICAgIGVuZAorICBlbmQKK2VuZAorCitkZWYgRmlsZS5iaW5yZWFkKGZuYW1lKQorICBvcGVuKGZuYW1lLCAncmInKSB7fGZ8CisgICAgcmV0dXJuIGYucmVhZAorICB9CitlbmQKKworIyBmb3IgY29ycnVwdGVkIFdpbmRvd3MnIHN0YXQoMikKK2RlZiBGaWxlLmRpcj8ocGF0aCkKKyAgRmlsZS5kaXJlY3Rvcnk/KChwYXRoWy0xLDFdID09ICcvJykgPyBwYXRoIDogcGF0aCArICcvJykKK2VuZAorCisKK2NsYXNzIENvbmZpZ1RhYmxlCisKKyAgaW5jbHVkZSBFbnVtZXJhYmxlCisKKyAgZGVmIGluaXRpYWxpemUocmJjb25maWcpCisgICAgQHJiY29uZmlnID0gcmJjb25maWcKKyAgICBAaXRlbXMgPSBbXQorICAgIEB0YWJsZSA9IHt9CisgICAgIyBvcHRpb25zCisgICAgQGluc3RhbGxfcHJlZml4ID0gbmlsCisgICAgQGNvbmZpZ19vcHQgPSBuaWwKKyAgICBAdmVyYm9zZSA9IHRydWUKKyAgICBAbm9faGFybSA9IGZhbHNlCisgIGVuZAorCisgIGF0dHJfYWNjZXNzb3IgOmluc3RhbGxfcHJlZml4CisgIGF0dHJfYWNjZXNzb3IgOmNvbmZpZ19vcHQKKworICBhdHRyX3dyaXRlciA6dmVyYm9zZQorCisgIGRlZiB2ZXJib3NlPworICAgIEB2ZXJib3NlCisgIGVuZAorCisgIGF0dHJfd3JpdGVyIDpub19oYXJtCisKKyAgZGVmIG5vX2hhcm0/CisgICAgQG5vX2hhcm0KKyAgZW5kCisKKyAgZGVmIFtdKGtleSkKKyAgICBsb29rdXAoa2V5KS5yZXNvbHZlKHNlbGYpCisgIGVuZAorCisgIGRlZiBbXT0oa2V5LCB2YWwpCisgICAgbG9va3VwKGtleSkuc2V0IHZhbAorICBlbmQKKworICBkZWYgbmFtZXMKKyAgICBAaXRlbXMubWFwIHt8aXwgaS5uYW1lIH0KKyAgZW5kCisKKyAgZGVmIGVhY2goJmJsb2NrKQorICAgIEBpdGVtcy5lYWNoKCZibG9jaykKKyAgZW5kCisKKyAgZGVmIGtleT8obmFtZSkKKyAgICBAdGFibGUua2V5PyhuYW1lKQorICBlbmQKKworICBkZWYgbG9va3VwKG5hbWUpCisgICAgQHRhYmxlW25hbWVdIG9yIHNldHVwX3JiX2Vycm9yICJubyBzdWNoIGNvbmZpZyBpdGVtOiAje25hbWV9IgorICBlbmQKKworICBkZWYgYWRkKGl0ZW0pCisgICAgQGl0ZW1zLnB1c2ggaXRlbQorICAgIEB0YWJsZVtpdGVtLm5hbWVdID0gaXRlbQorICBlbmQKKworICBkZWYgcmVtb3ZlKG5hbWUpCisgICAgaXRlbSA9IGxvb2t1cChuYW1lKQorICAgIEBpdGVtcy5kZWxldGVfaWYge3xpfCBpLm5hbWUgPT0gbmFtZSB9CisgICAgQHRhYmxlLmRlbGV0ZV9pZiB7fG5hbWUsIGl8IGkubmFtZSA9PSBuYW1lIH0KKyAgICBpdGVtCisgIGVuZAorCisgIGRlZiBsb2FkX3NjcmlwdChwYXRoLCBpbnN0ID0gbmlsKQorICAgIGlmIEZpbGUuZmlsZT8ocGF0aCkKKyAgICAgIE1ldGFDb25maWdFbnZpcm9ubWVudC5uZXcoc2VsZiwgaW5zdCkuaW5zdGFuY2VfZXZhbCBGaWxlLnJlYWQocGF0aCksIHBhdGgKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHNhdmVmaWxlCisgICAgJy5jb25maWcnCisgIGVuZAorCisgIGRlZiBsb2FkX3NhdmVmaWxlCisgICAgYmVnaW4KKyAgICAgIEZpbGUuZm9yZWFjaChzYXZlZmlsZSgpKSBkbyB8bGluZXwKKyAgICAgICAgaywgdiA9ICpsaW5lLnNwbGl0KC89LywgMikKKyAgICAgICAgc2VsZltrXSA9IHYuc3RyaXAKKyAgICAgIGVuZAorICAgIHJlc2N1ZSBFcnJubzo6RU5PRU5UCisgICAgICBzZXR1cF9yYl9lcnJvciAkIS5tZXNzYWdlICsgIlxuI3tGaWxlLmJhc2VuYW1lKCQwKX0gY29uZmlnIGZpcnN0IgorICAgIGVuZAorICBlbmQKKworICBkZWYgc2F2ZQorICAgIEBpdGVtcy5lYWNoIHt8aXwgaS52YWx1ZSB9CisgICAgRmlsZS5vcGVuKHNhdmVmaWxlKCksICd3Jykge3xmfAorICAgICAgQGl0ZW1zLmVhY2ggZG8gfGl8CisgICAgICAgIGYucHJpbnRmICIlcz0lc1xuIiwgaS5uYW1lLCBpLnZhbHVlIGlmIGkudmFsdWU/IGFuZCBpLnZhbHVlCisgICAgICBlbmQKKyAgICB9CisgIGVuZAorCisgIGRlZiBsb2FkX3N0YW5kYXJkX2VudHJpZXMKKyAgICBzdGFuZGFyZF9lbnRyaWVzKEByYmNvbmZpZykuZWFjaCBkbyB8ZW50fAorICAgICAgYWRkIGVudAorICAgIGVuZAorICBlbmQKKworICBkZWYgc3RhbmRhcmRfZW50cmllcyhyYmNvbmZpZykKKyAgICBjID0gcmJjb25maWcKKworICAgIHJ1YnlwYXRoID0gRmlsZS5qb2luKGNbJ2JpbmRpciddLCBjWydydWJ5X2luc3RhbGxfbmFtZSddICsgY1snRVhFRVhUJ10pCisKKyAgICBtYWpvciA9IGNbJ01BSk9SJ10udG9faQorICAgIG1pbm9yID0gY1snTUlOT1InXS50b19pCisgICAgdGVlbnkgPSBjWydURUVOWSddLnRvX2kKKyAgICB2ZXJzaW9uID0gIiN7bWFqb3J9LiN7bWlub3J9IgorCisgICAgIyBydWJ5IHZlci4gPj0gMS40LjQ/CisgICAgbmV3cGF0aF9wID0gKChtYWpvciA+PSAyKSBvcgorICAgICAgICAgICAgICAgICAoKG1ham9yID09IDEpIGFuZAorICAgICAgICAgICAgICAgICAgKChtaW5vciA+PSA1KSBvcgorICAgICAgICAgICAgICAgICAgICgobWlub3IgPT0gNCkgYW5kICh0ZWVueSA+PSA0KSkpKSkKKworICAgIGlmIGNbJ3J1YnlsaWJkaXInXQorICAgICAgIyBWID4gMS42LjMKKyAgICAgIGxpYnJ1YnkgICAgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieSIKKyAgICAgIGxpYnJ1Ynl2ZXIgICAgICA9IGNbJ3J1YnlsaWJkaXInXQorICAgICAgbGlicnVieXZlcmFyY2ggID0gY1snYXJjaGRpciddCisgICAgICBzaXRlcnVieSAgICAgICAgPSBjWydzaXRlZGlyJ10KKyAgICAgIHNpdGVydWJ5dmVyICAgICA9IGNbJ3NpdGVsaWJkaXInXQorICAgICAgc2l0ZXJ1Ynl2ZXJhcmNoID0gY1snc2l0ZWFyY2hkaXInXQorICAgIGVsc2lmIG5ld3BhdGhfcAorICAgICAgIyAxLjQuNCA8PSBWIDw9IDEuNi4zCisgICAgICBsaWJydWJ5ICAgICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkiCisgICAgICBsaWJydWJ5dmVyICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkvI3t2ZXJzaW9ufSIKKyAgICAgIGxpYnJ1Ynl2ZXJhcmNoICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259LyN7Y1snYXJjaCddfSIKKyAgICAgIHNpdGVydWJ5ICAgICAgICA9IGNbJ3NpdGVkaXInXQorICAgICAgc2l0ZXJ1Ynl2ZXIgICAgID0gIiRzaXRlcnVieS8je3ZlcnNpb259IgorICAgICAgc2l0ZXJ1Ynl2ZXJhcmNoID0gIiRzaXRlcnVieXZlci8je2NbJ2FyY2gnXX0iCisgICAgZWxzZQorICAgICAgIyBWIDwgMS40LjQKKyAgICAgIGxpYnJ1YnkgICAgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieSIKKyAgICAgIGxpYnJ1Ynl2ZXIgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259IgorICAgICAgbGlicnVieXZlcmFyY2ggID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0vI3tjWydhcmNoJ119IgorICAgICAgc2l0ZXJ1YnkgICAgICAgID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0vc2l0ZV9ydWJ5IgorICAgICAgc2l0ZXJ1Ynl2ZXIgICAgID0gc2l0ZXJ1YnkKKyAgICAgIHNpdGVydWJ5dmVyYXJjaCA9ICIkc2l0ZXJ1Ynl2ZXIvI3tjWydhcmNoJ119IgorICAgIGVuZAorICAgIHBhcmFtZXRlcml6ZSA9IGxhbWJkYSB7fHBhdGh8CisgICAgICBwYXRoLnN1YigvXEEje1JlZ2V4cC5xdW90ZShjWydwcmVmaXgnXSl9LywgJyRwcmVmaXgnKQorICAgIH0KKworICAgIGlmIGFyZyA9IGNbJ2NvbmZpZ3VyZV9hcmdzJ10uc3BsaXQuZGV0ZWN0IHt8YXJnfCAvLS13aXRoLW1ha2UtcHJvZz0vID1+IGFyZyB9CisgICAgICBtYWtlcHJvZyA9IGFyZy5zdWIoLycvLCAnJykuc3BsaXQoLz0vLCAyKVsxXQorICAgIGVsc2UKKyAgICAgIG1ha2Vwcm9nID0gJ21ha2UnCisgICAgZW5kCisKKyAgICBbCisgICAgICBFeGVjSXRlbS5uZXcoJ2luc3RhbGxkaXJzJywgJ3N0ZC9zaXRlL2hvbWUnLAorICAgICAgICAgICAgICAgICAgICdzdGQ6IGluc3RhbGwgdW5kZXIgbGlicnVieTsgc2l0ZTogaW5zdGFsbCB1bmRlciBzaXRlX3J1Ynk7IGhvbWU6IGluc3RhbGwgdW5kZXIgJEhPTUUnKVwKKyAgICAgICAgICB7fHZhbCwgdGFibGV8CisgICAgICAgICAgICBjYXNlIHZhbAorICAgICAgICAgICAgd2hlbiAnc3RkJworICAgICAgICAgICAgICB0YWJsZVsncmJkaXInXSA9ICckbGlicnVieXZlcicKKyAgICAgICAgICAgICAgdGFibGVbJ3NvZGlyJ10gPSAnJGxpYnJ1Ynl2ZXJhcmNoJworICAgICAgICAgICAgd2hlbiAnc2l0ZScKKyAgICAgICAgICAgICAgdGFibGVbJ3JiZGlyJ10gPSAnJHNpdGVydWJ5dmVyJworICAgICAgICAgICAgICB0YWJsZVsnc29kaXInXSA9ICckc2l0ZXJ1Ynl2ZXJhcmNoJworICAgICAgICAgICAgd2hlbiAnaG9tZScKKyAgICAgICAgICAgICAgc2V0dXBfcmJfZXJyb3IgJyRIT01FIHdhcyBub3Qgc2V0JyB1bmxlc3MgRU5WWydIT01FJ10KKyAgICAgICAgICAgICAgdGFibGVbJ3ByZWZpeCddID0gRU5WWydIT01FJ10KKyAgICAgICAgICAgICAgdGFibGVbJ3JiZGlyJ10gPSAnJGxpYmRpci9ydWJ5JworICAgICAgICAgICAgICB0YWJsZVsnc29kaXInXSA9ICckbGliZGlyL3J1YnknCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICB9LAorICAgICAgUGF0aEl0ZW0ubmV3KCdwcmVmaXgnLCAncGF0aCcsIGNbJ3ByZWZpeCddLAorICAgICAgICAgICAgICAgICAgICdwYXRoIHByZWZpeCBvZiB0YXJnZXQgZW52aXJvbm1lbnQnKSwKKyAgICAgIFBhdGhJdGVtLm5ldygnYmluZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydiaW5kaXInXSksCisgICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGNvbW1hbmRzJyksCisgICAgICBQYXRoSXRlbS5uZXcoJ2xpYmRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snbGliZGlyJ10pLAorICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBsaWJyYXJpZXMnKSwKKyAgICAgIFBhdGhJdGVtLm5ldygnZGF0YWRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snZGF0YWRpciddKSwKKyAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3Igc2hhcmVkIGRhdGEnKSwKKyAgICAgIFBhdGhJdGVtLm5ldygnbWFuZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydtYW5kaXInXSksCisgICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIG1hbiBwYWdlcycpLAorICAgICAgUGF0aEl0ZW0ubmV3KCdzeXNjb25mZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydzeXNjb25mZGlyJ10pLAorICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBzeXN0ZW0gY29uZmlndXJhdGlvbiBmaWxlcycpLAorICAgICAgUGF0aEl0ZW0ubmV3KCdsb2NhbHN0YXRlZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydsb2NhbHN0YXRlZGlyJ10pLAorICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBsb2NhbCBzdGF0ZSBkYXRhJyksCisgICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1YnknLCAncGF0aCcsIGxpYnJ1YnksCisgICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHJ1YnkgbGlicmFyaWVzJyksCisgICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1Ynl2ZXInLCAncGF0aCcsIGxpYnJ1Ynl2ZXIsCisgICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHN0YW5kYXJkIHJ1YnkgbGlicmFyaWVzJyksCisgICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1Ynl2ZXJhcmNoJywgJ3BhdGgnLCBsaWJydWJ5dmVyYXJjaCwKKyAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3Igc3RhbmRhcmQgcnVieSBleHRlbnNpb25zJyksCisgICAgICBQYXRoSXRlbS5uZXcoJ3NpdGVydWJ5JywgJ3BhdGgnLCBzaXRlcnVieSwKKyAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgdmVyc2lvbi1pbmRlcGVuZGVudCBhdXggcnVieSBsaWJyYXJpZXMnKSwKKyAgICAgIFBhdGhJdGVtLm5ldygnc2l0ZXJ1Ynl2ZXInLCAncGF0aCcsIHNpdGVydWJ5dmVyLAorICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBhdXggcnVieSBsaWJyYXJpZXMnKSwKKyAgICAgIFBhdGhJdGVtLm5ldygnc2l0ZXJ1Ynl2ZXJhcmNoJywgJ3BhdGgnLCBzaXRlcnVieXZlcmFyY2gsCisgICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGF1eCBydWJ5IGJpbmFyaWVzJyksCisgICAgICBQYXRoSXRlbS5uZXcoJ3JiZGlyJywgJ3BhdGgnLCAnJHNpdGVydWJ5dmVyJywKKyAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgcnVieSBzY3JpcHRzJyksCisgICAgICBQYXRoSXRlbS5uZXcoJ3NvZGlyJywgJ3BhdGgnLCAnJHNpdGVydWJ5dmVyYXJjaCcsCisgICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHJ1YnkgZXh0ZW50aW9ucycpLAorICAgICAgUGF0aEl0ZW0ubmV3KCdydWJ5cGF0aCcsICdwYXRoJywgcnVieXBhdGgsCisgICAgICAgICAgICAgICAgICAgJ3RoZSBwYXRoIHRvIHNldCB0byAjISBsaW5lJyksCisgICAgICBQcm9ncmFtSXRlbS5uZXcoJ3J1Ynlwcm9nJywgJ25hbWUnLCBydWJ5cGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAndGhlIHJ1YnkgcHJvZ3JhbSB1c2luZyBmb3IgaW5zdGFsbGF0aW9uJyksCisgICAgICBQcm9ncmFtSXRlbS5uZXcoJ21ha2Vwcm9nJywgJ25hbWUnLCBtYWtlcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAndGhlIG1ha2UgcHJvZ3JhbSB0byBjb21waWxlIHJ1YnkgZXh0ZW50aW9ucycpLAorICAgICAgU2VsZWN0SXRlbS5uZXcoJ3NoZWJhbmcnLCAnYWxsL3J1YnkvbmV2ZXInLCAncnVieScsCisgICAgICAgICAgICAgICAgICAgICAnc2hlYmFuZyBsaW5lICgjISkgZWRpdGluZyBtb2RlJyksCisgICAgICBCb29sSXRlbS5uZXcoJ3dpdGhvdXQtZXh0JywgJ3llcy9ubycsICdubycsCisgICAgICAgICAgICAgICAgICAgJ2RvZXMgbm90IGNvbXBpbGUvaW5zdGFsbCBydWJ5IGV4dGVudGlvbnMnKQorICAgIF0KKyAgZW5kCisgIHByaXZhdGUgOnN0YW5kYXJkX2VudHJpZXMKKworICBkZWYgbG9hZF9tdWx0aXBhY2thZ2VfZW50cmllcworICAgIG11bHRpcGFja2FnZV9lbnRyaWVzKCkuZWFjaCBkbyB8ZW50fAorICAgICAgYWRkIGVudAorICAgIGVuZAorICBlbmQKKworICBkZWYgbXVsdGlwYWNrYWdlX2VudHJpZXMKKyAgICBbCisgICAgICBQYWNrYWdlU2VsZWN0aW9uSXRlbS5uZXcoJ3dpdGgnLCAnbmFtZSxuYW1lLi4uJywgJycsICdBTEwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlIG5hbWVzIHRoYXQgeW91IHdhbnQgdG8gaW5zdGFsbCcpLAorICAgICAgUGFja2FnZVNlbGVjdGlvbkl0ZW0ubmV3KCd3aXRob3V0JywgJ25hbWUsbmFtZS4uLicsICcnLCAnTk9ORScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UgbmFtZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gaW5zdGFsbCcpCisgICAgXQorICBlbmQKKyAgcHJpdmF0ZSA6bXVsdGlwYWNrYWdlX2VudHJpZXMKKworICBBTElBU0VTID0geworICAgICdzdGQtcnVieScgICAgICAgICA9PiAnbGlicnVieXZlcicsCisgICAgJ3N0ZHJ1YnknICAgICAgICAgID0+ICdsaWJydWJ5dmVyJywKKyAgICAncnVieWxpYmRpcicgICAgICAgPT4gJ2xpYnJ1Ynl2ZXInLAorICAgICdhcmNoZGlyJyAgICAgICAgICA9PiAnbGlicnVieXZlcmFyY2gnLAorICAgICdzaXRlLXJ1YnktY29tbW9uJyA9PiAnc2l0ZXJ1YnknLCAgICAgIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICdzaXRlLXJ1YnknICAgICAgICA9PiAnc2l0ZXJ1Ynl2ZXInLCAgIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICdiaW4tZGlyJyAgICAgICAgICA9PiAnYmluZGlyJywKKyAgICAnYmluLWRpcicgICAgICAgICAgPT4gJ2JpbmRpcicsCisgICAgJ3JiLWRpcicgICAgICAgICAgID0+ICdyYmRpcicsCisgICAgJ3NvLWRpcicgICAgICAgICAgID0+ICdzb2RpcicsCisgICAgJ2RhdGEtZGlyJyAgICAgICAgID0+ICdkYXRhZGlyJywKKyAgICAncnVieS1wYXRoJyAgICAgICAgPT4gJ3J1YnlwYXRoJywKKyAgICAncnVieS1wcm9nJyAgICAgICAgPT4gJ3J1Ynlwcm9nJywKKyAgICAncnVieScgICAgICAgICAgICAgPT4gJ3J1Ynlwcm9nJywKKyAgICAnbWFrZS1wcm9nJyAgICAgICAgPT4gJ21ha2Vwcm9nJywKKyAgICAnbWFrZScgICAgICAgICAgICAgPT4gJ21ha2Vwcm9nJworICB9CisKKyAgZGVmIGZpeHVwCisgICAgQUxJQVNFUy5lYWNoIGRvIHxhbGksIG5hbWV8CisgICAgICBAdGFibGVbYWxpXSA9IEB0YWJsZVtuYW1lXQorICAgIGVuZAorICAgIEBpdGVtcy5mcmVlemUKKyAgICBAdGFibGUuZnJlZXplCisgICAgQG9wdGlvbnNfcmUgPSAvXEEtLSgje0B0YWJsZS5rZXlzLmpvaW4oJ3wnKX0pKD86PSguKikpP1x6LworICBlbmQKKworICBkZWYgcGFyc2Vfb3B0KG9wdCkKKyAgICBtID0gQG9wdGlvbnNfcmUubWF0Y2gob3B0KSBvciBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiB1bmtub3duIG9wdGlvbiAje29wdH0iCisgICAgbS50b19hWzEsMl0KKyAgZW5kCisKKyAgZGVmIGRsbGV4dAorICAgIEByYmNvbmZpZ1snRExFWFQnXQorICBlbmQKKworICBkZWYgdmFsdWVfY29uZmlnPyhuYW1lKQorICAgIGxvb2t1cChuYW1lKS52YWx1ZT8KKyAgZW5kCisKKyAgY2xhc3MgSXRlbQorICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHRlbXBsYXRlLCBkZWZhdWx0LCBkZXNjKQorICAgICAgQG5hbWUgPSBuYW1lLmZyZWV6ZQorICAgICAgQHRlbXBsYXRlID0gdGVtcGxhdGUKKyAgICAgIEB2YWx1ZSA9IGRlZmF1bHQKKyAgICAgIEBkZWZhdWx0ID0gZGVmYXVsdAorICAgICAgQGRlc2NyaXB0aW9uID0gZGVzYworICAgIGVuZAorCisgICAgYXR0cl9yZWFkZXIgOm5hbWUKKyAgICBhdHRyX3JlYWRlciA6ZGVzY3JpcHRpb24KKworICAgIGF0dHJfYWNjZXNzb3IgOmRlZmF1bHQKKyAgICBhbGlhcyBoZWxwX2RlZmF1bHQgZGVmYXVsdAorCisgICAgZGVmIGhlbHBfb3B0CisgICAgICAiLS0je0BuYW1lfT0je0B0ZW1wbGF0ZX0iCisgICAgZW5kCisKKyAgICBkZWYgdmFsdWU/CisgICAgICB0cnVlCisgICAgZW5kCisKKyAgICBkZWYgdmFsdWUKKyAgICAgIEB2YWx1ZQorICAgIGVuZAorCisgICAgZGVmIHJlc29sdmUodGFibGUpCisgICAgICBAdmFsdWUuZ3N1YiglcjxcJChbXi9dKyk+KSB7IHRhYmxlWyQxXSB9CisgICAgZW5kCisKKyAgICBkZWYgc2V0KHZhbCkKKyAgICAgIEB2YWx1ZSA9IGNoZWNrKHZhbCkKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBjaGVjayh2YWwpCisgICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiAtLSN7bmFtZX0gcmVxdWlyZXMgYXJndW1lbnQiIHVubGVzcyB2YWwKKyAgICAgIHZhbAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBCb29sSXRlbSA8IEl0ZW0KKyAgICBkZWYgY29uZmlnX3R5cGUKKyAgICAgICdib29sJworICAgIGVuZAorCisgICAgZGVmIGhlbHBfb3B0CisgICAgICAiLS0je0BuYW1lfSIKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBjaGVjayh2YWwpCisgICAgICByZXR1cm4gJ3llcycgdW5sZXNzIHZhbAorICAgICAgY2FzZSB2YWwKKyAgICAgIHdoZW4gL1xBeShlcyk/XHovaSwgL1xBdChydWUpP1x6L2kgdGhlbiAneWVzJworICAgICAgd2hlbiAvXEFuKG8pP1x6L2ksIC9cQWYoYWxzZSlcei9pICB0aGVuICdubycKKyAgICAgIGVsc2UKKyAgICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogLS0je0BuYW1lfSBhY2NlcHRzIG9ubHkgeWVzL25vIGZvciBhcmd1bWVudCIKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBQYXRoSXRlbSA8IEl0ZW0KKyAgICBkZWYgY29uZmlnX3R5cGUKKyAgICAgICdwYXRoJworICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIGNoZWNrKHBhdGgpCisgICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiAtLSN7QG5hbWV9IHJlcXVpcmVzIGFyZ3VtZW50IiAgdW5sZXNzIHBhdGgKKyAgICAgIHBhdGhbMCwxXSA9PSAnJCcgPyBwYXRoIDogRmlsZS5leHBhbmRfcGF0aChwYXRoKQorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBQcm9ncmFtSXRlbSA8IEl0ZW0KKyAgICBkZWYgY29uZmlnX3R5cGUKKyAgICAgICdwcm9ncmFtJworICAgIGVuZAorICBlbmQKKworICBjbGFzcyBTZWxlY3RJdGVtIDwgSXRlbQorICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHNlbGVjdGlvbiwgZGVmYXVsdCwgZGVzYykKKyAgICAgIHN1cGVyCisgICAgICBAb2sgPSBzZWxlY3Rpb24uc3BsaXQoJy8nKQorICAgIGVuZAorCisgICAgZGVmIGNvbmZpZ190eXBlCisgICAgICAnc2VsZWN0JworICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIGNoZWNrKHZhbCkKKyAgICAgIHVubGVzcyBAb2suaW5jbHVkZT8odmFsLnN0cmlwKQorICAgICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiB1c2UgLS0je0BuYW1lfT0je0B0ZW1wbGF0ZX0gKCN7dmFsfSkiCisgICAgICBlbmQKKyAgICAgIHZhbC5zdHJpcAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBFeGVjSXRlbSA8IEl0ZW0KKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBzZWxlY3Rpb24sIGRlc2MsICZibG9jaykKKyAgICAgIHN1cGVyIG5hbWUsIHNlbGVjdGlvbiwgbmlsLCBkZXNjCisgICAgICBAb2sgPSBzZWxlY3Rpb24uc3BsaXQoJy8nKQorICAgICAgQGFjdGlvbiA9IGJsb2NrCisgICAgZW5kCisKKyAgICBkZWYgY29uZmlnX3R5cGUKKyAgICAgICdleGVjJworICAgIGVuZAorCisgICAgZGVmIHZhbHVlPworICAgICAgZmFsc2UKKyAgICBlbmQKKworICAgIGRlZiByZXNvbHZlKHRhYmxlKQorICAgICAgc2V0dXBfcmJfZXJyb3IgIiQje25hbWUoKX0gd3JvbmdseSB1c2VkIGFzIG9wdGlvbiB2YWx1ZSIKKyAgICBlbmQKKworICAgIHVuZGVmIHNldAorCisgICAgZGVmIGV2YWx1YXRlKHZhbCwgdGFibGUpCisgICAgICB2ID0gdmFsLnN0cmlwLmRvd25jYXNlCisgICAgICB1bmxlc3MgQG9rLmluY2x1ZGU/KHYpCisgICAgICAgIHNldHVwX3JiX2Vycm9yICJpbnZhbGlkIG9wdGlvbiAtLSN7QG5hbWV9PSN7dmFsfSAodXNlICN7QHRlbXBsYXRlfSkiCisgICAgICBlbmQKKyAgICAgIEBhY3Rpb24uY2FsbCB2LCB0YWJsZQorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBQYWNrYWdlU2VsZWN0aW9uSXRlbSA8IEl0ZW0KKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCB0ZW1wbGF0ZSwgZGVmYXVsdCwgaGVscF9kZWZhdWx0LCBkZXNjKQorICAgICAgc3VwZXIgbmFtZSwgdGVtcGxhdGUsIGRlZmF1bHQsIGRlc2MKKyAgICAgIEBoZWxwX2RlZmF1bHQgPSBoZWxwX2RlZmF1bHQKKyAgICBlbmQKKworICAgIGF0dHJfcmVhZGVyIDpoZWxwX2RlZmF1bHQKKworICAgIGRlZiBjb25maWdfdHlwZQorICAgICAgJ3BhY2thZ2UnCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgY2hlY2sodmFsKQorICAgICAgdW5sZXNzIEZpbGUuZGlyPygicGFja2FnZXMvI3t2YWx9IikKKyAgICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogbm8gc3VjaCBwYWNrYWdlOiAje3ZhbH0iCisgICAgICBlbmQKKyAgICAgIHZhbAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBNZXRhQ29uZmlnRW52aXJvbm1lbnQKKyAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcsIGluc3RhbGxlcikKKyAgICAgIEBjb25maWcgPSBjb25maWcKKyAgICAgIEBpbnN0YWxsZXIgPSBpbnN0YWxsZXIKKyAgICBlbmQKKworICAgIGRlZiBjb25maWdfbmFtZXMKKyAgICAgIEBjb25maWcubmFtZXMKKyAgICBlbmQKKworICAgIGRlZiBjb25maWc/KG5hbWUpCisgICAgICBAY29uZmlnLmtleT8obmFtZSkKKyAgICBlbmQKKworICAgIGRlZiBib29sX2NvbmZpZz8obmFtZSkKKyAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmNvbmZpZ190eXBlID09ICdib29sJworICAgIGVuZAorCisgICAgZGVmIHBhdGhfY29uZmlnPyhuYW1lKQorICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuY29uZmlnX3R5cGUgPT0gJ3BhdGgnCisgICAgZW5kCisKKyAgICBkZWYgdmFsdWVfY29uZmlnPyhuYW1lKQorICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuY29uZmlnX3R5cGUgIT0gJ2V4ZWMnCisgICAgZW5kCisKKyAgICBkZWYgYWRkX2NvbmZpZyhpdGVtKQorICAgICAgQGNvbmZpZy5hZGQgaXRlbQorICAgIGVuZAorCisgICAgZGVmIGFkZF9ib29sX2NvbmZpZyhuYW1lLCBkZWZhdWx0LCBkZXNjKQorICAgICAgQGNvbmZpZy5hZGQgQm9vbEl0ZW0ubmV3KG5hbWUsICd5ZXMvbm8nLCBkZWZhdWx0ID8gJ3llcycgOiAnbm8nLCBkZXNjKQorICAgIGVuZAorCisgICAgZGVmIGFkZF9wYXRoX2NvbmZpZyhuYW1lLCBkZWZhdWx0LCBkZXNjKQorICAgICAgQGNvbmZpZy5hZGQgUGF0aEl0ZW0ubmV3KG5hbWUsICdwYXRoJywgZGVmYXVsdCwgZGVzYykKKyAgICBlbmQKKworICAgIGRlZiBzZXRfY29uZmlnX2RlZmF1bHQobmFtZSwgZGVmYXVsdCkKKyAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmRlZmF1bHQgPSBkZWZhdWx0CisgICAgZW5kCisKKyAgICBkZWYgcmVtb3ZlX2NvbmZpZyhuYW1lKQorICAgICAgQGNvbmZpZy5yZW1vdmUobmFtZSkKKyAgICBlbmQKKworICAgICMgRm9yIG9ubHkgbXVsdGlwYWNrYWdlCisgICAgZGVmIHBhY2thZ2VzCisgICAgICByYWlzZSAnW3NldHVwLnJiIGZhdGFsXSBtdWx0aS1wYWNrYWdlIG1ldGFjb25maWcgQVBJIHBhY2thZ2VzKCkgY2FsbGVkIGZvciBzaW5nbGUtcGFja2FnZTsgY29udGFjdCBhcHBsaWNhdGlvbiBwYWNrYWdlIHZlbmRvcicgdW5sZXNzIEBpbnN0YWxsZXIKKyAgICAgIEBpbnN0YWxsZXIucGFja2FnZXMKKyAgICBlbmQKKworICAgICMgRm9yIG9ubHkgbXVsdGlwYWNrYWdlCisgICAgZGVmIGRlY2xhcmVfcGFja2FnZXMobGlzdCkKKyAgICAgIHJhaXNlICdbc2V0dXAucmIgZmF0YWxdIG11bHRpLXBhY2thZ2UgbWV0YWNvbmZpZyBBUEkgZGVjbGFyZV9wYWNrYWdlcygpIGNhbGxlZCBmb3Igc2luZ2xlLXBhY2thZ2U7IGNvbnRhY3QgYXBwbGljYXRpb24gcGFja2FnZSB2ZW5kb3InIHVubGVzcyBAaW5zdGFsbGVyCisgICAgICBAaW5zdGFsbGVyLnBhY2thZ2VzID0gbGlzdAorICAgIGVuZAorICBlbmQKKworZW5kICAgIyBjbGFzcyBDb25maWdUYWJsZQorCisKKyMgVGhpcyBtb2R1bGUgcmVxdWlyZXM6ICN2ZXJib3NlPywgI25vX2hhcm0/Cittb2R1bGUgRmlsZU9wZXJhdGlvbnMKKworICBkZWYgbWtkaXJfcChkaXJuYW1lLCBwcmVmaXggPSBuaWwpCisgICAgZGlybmFtZSA9IHByZWZpeCArIEZpbGUuZXhwYW5kX3BhdGgoZGlybmFtZSkgaWYgcHJlZml4CisgICAgJHN0ZGVyci5wdXRzICJta2RpciAtcCAje2Rpcm5hbWV9IiBpZiB2ZXJib3NlPworICAgIHJldHVybiBpZiBub19oYXJtPworCisgICAgIyBEb2VzIG5vdCBjaGVjayAnLycsIGl0J3MgdG9vIGFibm9ybWFsLgorICAgIGRpcnMgPSBGaWxlLmV4cGFuZF9wYXRoKGRpcm5hbWUpLnNwbGl0KCVyPCg/PS8pPikKKyAgICBpZiAvXEFbYS16XTpcei9pID1+IGRpcnNbMF0KKyAgICAgIGRpc2sgPSBkaXJzLnNoaWZ0CisgICAgICBkaXJzWzBdID0gZGlzayArIGRpcnNbMF0KKyAgICBlbmQKKyAgICBkaXJzLmVhY2hfaW5kZXggZG8gfGlkeHwKKyAgICAgIHBhdGggPSBkaXJzWzAuLmlkeF0uam9pbignJykKKyAgICAgIERpci5ta2RpciBwYXRoIHVubGVzcyBGaWxlLmRpcj8ocGF0aCkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHJtX2YocGF0aCkKKyAgICAkc3RkZXJyLnB1dHMgInJtIC1mICN7cGF0aH0iIGlmIHZlcmJvc2U/CisgICAgcmV0dXJuIGlmIG5vX2hhcm0/CisgICAgZm9yY2VfcmVtb3ZlX2ZpbGUgcGF0aAorICBlbmQKKworICBkZWYgcm1fcmYocGF0aCkKKyAgICAkc3RkZXJyLnB1dHMgInJtIC1yZiAje3BhdGh9IiBpZiB2ZXJib3NlPworICAgIHJldHVybiBpZiBub19oYXJtPworICAgIHJlbW92ZV90cmVlIHBhdGgKKyAgZW5kCisKKyAgZGVmIHJlbW92ZV90cmVlKHBhdGgpCisgICAgaWYgRmlsZS5zeW1saW5rPyhwYXRoKQorICAgICAgcmVtb3ZlX2ZpbGUgcGF0aAorICAgIGVsc2lmIEZpbGUuZGlyPyhwYXRoKQorICAgICAgcmVtb3ZlX3RyZWUwIHBhdGgKKyAgICBlbHNlCisgICAgICBmb3JjZV9yZW1vdmVfZmlsZSBwYXRoCisgICAgZW5kCisgIGVuZAorCisgIGRlZiByZW1vdmVfdHJlZTAocGF0aCkKKyAgICBEaXIuZm9yZWFjaChwYXRoKSBkbyB8ZW50fAorICAgICAgbmV4dCBpZiBlbnQgPT0gJy4nCisgICAgICBuZXh0IGlmIGVudCA9PSAnLi4nCisgICAgICBlbnRwYXRoID0gIiN7cGF0aH0vI3tlbnR9IgorICAgICAgaWYgRmlsZS5zeW1saW5rPyhlbnRwYXRoKQorICAgICAgICByZW1vdmVfZmlsZSBlbnRwYXRoCisgICAgICBlbHNpZiBGaWxlLmRpcj8oZW50cGF0aCkKKyAgICAgICAgcmVtb3ZlX3RyZWUwIGVudHBhdGgKKyAgICAgIGVsc2UKKyAgICAgICAgZm9yY2VfcmVtb3ZlX2ZpbGUgZW50cGF0aAorICAgICAgZW5kCisgICAgZW5kCisgICAgYmVnaW4KKyAgICAgIERpci5ybWRpciBwYXRoCisgICAgcmVzY3VlIEVycm5vOjpFTk9URU1QVFkKKyAgICAgICMgZGlyZWN0b3J5IG1heSBub3QgYmUgZW1wdHkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIG1vdmVfZmlsZShzcmMsIGRlc3QpCisgICAgZm9yY2VfcmVtb3ZlX2ZpbGUgZGVzdAorICAgIGJlZ2luCisgICAgICBGaWxlLnJlbmFtZSBzcmMsIGRlc3QKKyAgICByZXNjdWUKKyAgICAgIEZpbGUub3BlbihkZXN0LCAnd2InKSB7fGZ8CisgICAgICAgIGYud3JpdGUgRmlsZS5iaW5yZWFkKHNyYykKKyAgICAgIH0KKyAgICAgIEZpbGUuY2htb2QgRmlsZS5zdGF0KHNyYykubW9kZSwgZGVzdAorICAgICAgRmlsZS51bmxpbmsgc3JjCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBmb3JjZV9yZW1vdmVfZmlsZShwYXRoKQorICAgIGJlZ2luCisgICAgICByZW1vdmVfZmlsZSBwYXRoCisgICAgcmVzY3VlCisgICAgZW5kCisgIGVuZAorCisgIGRlZiByZW1vdmVfZmlsZShwYXRoKQorICAgIEZpbGUuY2htb2QgMDc3NywgcGF0aAorICAgIEZpbGUudW5saW5rIHBhdGgKKyAgZW5kCisKKyAgZGVmIGluc3RhbGwoZnJvbSwgZGVzdCwgbW9kZSwgcHJlZml4ID0gbmlsKQorICAgICRzdGRlcnIucHV0cyAiaW5zdGFsbCAje2Zyb219ICN7ZGVzdH0iIGlmIHZlcmJvc2U/CisgICAgcmV0dXJuIGlmIG5vX2hhcm0/CisKKyAgICByZWFsZGVzdCA9IHByZWZpeCA/IHByZWZpeCArIEZpbGUuZXhwYW5kX3BhdGgoZGVzdCkgOiBkZXN0CisgICAgcmVhbGRlc3QgPSBGaWxlLmpvaW4ocmVhbGRlc3QsIEZpbGUuYmFzZW5hbWUoZnJvbSkpIGlmIEZpbGUuZGlyPyhyZWFsZGVzdCkKKyAgICBzdHIgPSBGaWxlLmJpbnJlYWQoZnJvbSkKKyAgICBpZiBkaWZmPyhzdHIsIHJlYWxkZXN0KQorICAgICAgdmVyYm9zZV9vZmYgeworICAgICAgICBybV9mIHJlYWxkZXN0IGlmIEZpbGUuZXhpc3Q/KHJlYWxkZXN0KQorICAgICAgfQorICAgICAgRmlsZS5vcGVuKHJlYWxkZXN0LCAnd2InKSB7fGZ8CisgICAgICAgIGYud3JpdGUgc3RyCisgICAgICB9CisgICAgICBGaWxlLmNobW9kIG1vZGUsIHJlYWxkZXN0CisKKyAgICAgIEZpbGUub3BlbigiI3tvYmpkaXJfcm9vdCgpfS9JbnN0YWxsZWRGaWxlcyIsICdhJykge3xmfAorICAgICAgICBpZiBwcmVmaXgKKyAgICAgICAgICBmLnB1dHMgcmVhbGRlc3Quc3ViKHByZWZpeCwgJycpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBmLnB1dHMgcmVhbGRlc3QKKyAgICAgICAgZW5kCisgICAgICB9CisgICAgZW5kCisgIGVuZAorCisgIGRlZiBkaWZmPyhuZXdfY29udGVudCwgcGF0aCkKKyAgICByZXR1cm4gdHJ1ZSB1bmxlc3MgRmlsZS5leGlzdD8ocGF0aCkKKyAgICBuZXdfY29udGVudCAhPSBGaWxlLmJpbnJlYWQocGF0aCkKKyAgZW5kCisKKyAgZGVmIGNvbW1hbmQoKmFyZ3MpCisgICAgJHN0ZGVyci5wdXRzIGFyZ3Muam9pbignICcpIGlmIHZlcmJvc2U/CisgICAgc3lzdGVtKCphcmdzKSBvciByYWlzZSBSdW50aW1lRXJyb3IsCisgICAgICAgICJzeXN0ZW0oI3thcmdzLm1hcHt8YXwgYS5pbnNwZWN0IH0uam9pbignICcpfSkgZmFpbGVkIgorICBlbmQKKworICBkZWYgcnVieSgqYXJncykKKyAgICBjb21tYW5kIGNvbmZpZygncnVieXByb2cnKSwgKmFyZ3MKKyAgZW5kCisgIAorICBkZWYgbWFrZSh0YXNrID0gbmlsKQorICAgIGNvbW1hbmQoKltjb25maWcoJ21ha2Vwcm9nJyksIHRhc2tdLmNvbXBhY3QpCisgIGVuZAorCisgIGRlZiBleHRkaXI/KGRpcikKKyAgICBGaWxlLmV4aXN0PygiI3tkaXJ9L01BTklGRVNUIikgb3IgRmlsZS5leGlzdD8oIiN7ZGlyfS9leHRjb25mLnJiIikKKyAgZW5kCisKKyAgZGVmIGZpbGVzX29mKGRpcikKKyAgICBEaXIub3BlbihkaXIpIHt8ZHwKKyAgICAgIHJldHVybiBkLnNlbGVjdCB7fGVudHwgRmlsZS5maWxlPygiI3tkaXJ9LyN7ZW50fSIpIH0KKyAgICB9CisgIGVuZAorCisgIERJUl9SRUpFQ1QgPSAldyggLiAuLiBDVlMgU0NDUyBSQ1MgQ1ZTLmFkbSAuc3ZuICkKKworICBkZWYgZGlyZWN0b3JpZXNfb2YoZGlyKQorICAgIERpci5vcGVuKGRpcikge3xkfAorICAgICAgcmV0dXJuIGQuc2VsZWN0IHt8ZW50fCBGaWxlLmRpcj8oIiN7ZGlyfS8je2VudH0iKSB9IC0gRElSX1JFSkVDVAorICAgIH0KKyAgZW5kCisKK2VuZAorCisKKyMgVGhpcyBtb2R1bGUgcmVxdWlyZXM6ICNzcmNkaXJfcm9vdCwgI29iamRpcl9yb290LCAjcmVscGF0aAorbW9kdWxlIEhvb2tTY3JpcHRBUEkKKworICBkZWYgZ2V0X2NvbmZpZyhrZXkpCisgICAgQGNvbmZpZ1trZXldCisgIGVuZAorCisgIGFsaWFzIGNvbmZpZyBnZXRfY29uZmlnCisKKyAgIyBvYnNvbGV0ZTogdXNlIG1ldGFjb25maWcgdG8gY2hhbmdlIGNvbmZpZ3VyYXRpb24KKyAgZGVmIHNldF9jb25maWcoa2V5LCB2YWwpCisgICAgQGNvbmZpZ1trZXldID0gdmFsCisgIGVuZAorCisgICMKKyAgIyBzcmNkaXIvb2JqZGlyICh3b3JrcyBvbmx5IGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSkKKyAgIworCisgIGRlZiBjdXJyX3NyY2RpcgorICAgICIje3NyY2Rpcl9yb290KCl9LyN7cmVscGF0aCgpfSIKKyAgZW5kCisKKyAgZGVmIGN1cnJfb2JqZGlyCisgICAgIiN7b2JqZGlyX3Jvb3QoKX0vI3tyZWxwYXRoKCl9IgorICBlbmQKKworICBkZWYgc3JjZmlsZShwYXRoKQorICAgICIje2N1cnJfc3JjZGlyKCl9LyN7cGF0aH0iCisgIGVuZAorCisgIGRlZiBzcmNleGlzdD8ocGF0aCkKKyAgICBGaWxlLmV4aXN0PyhzcmNmaWxlKHBhdGgpKQorICBlbmQKKworICBkZWYgc3JjZGlyZWN0b3J5PyhwYXRoKQorICAgIEZpbGUuZGlyPyhzcmNmaWxlKHBhdGgpKQorICBlbmQKKyAgCisgIGRlZiBzcmNmaWxlPyhwYXRoKQorICAgIEZpbGUuZmlsZT8oc3JjZmlsZShwYXRoKSkKKyAgZW5kCisKKyAgZGVmIHNyY2VudHJpZXMocGF0aCA9ICcuJykKKyAgICBEaXIub3BlbigiI3tjdXJyX3NyY2RpcigpfS8je3BhdGh9Iikge3xkfAorICAgICAgcmV0dXJuIGQudG9fYSAtICV3KC4gLi4pCisgICAgfQorICBlbmQKKworICBkZWYgc3JjZmlsZXMocGF0aCA9ICcuJykKKyAgICBzcmNlbnRyaWVzKHBhdGgpLnNlbGVjdCB7fGZuYW1lfAorICAgICAgRmlsZS5maWxlPyhGaWxlLmpvaW4oY3Vycl9zcmNkaXIoKSwgcGF0aCwgZm5hbWUpKQorICAgIH0KKyAgZW5kCisKKyAgZGVmIHNyY2RpcmVjdG9yaWVzKHBhdGggPSAnLicpCisgICAgc3JjZW50cmllcyhwYXRoKS5zZWxlY3Qge3xmbmFtZXwKKyAgICAgIEZpbGUuZGlyPyhGaWxlLmpvaW4oY3Vycl9zcmNkaXIoKSwgcGF0aCwgZm5hbWUpKQorICAgIH0KKyAgZW5kCisKK2VuZAorCisKK2NsYXNzIFRvcGxldmVsSW5zdGFsbGVyCisKKyAgVmVyc2lvbiAgID0gJzMuNC4xJworICBDb3B5cmlnaHQgPSAnQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2knCisKKyAgVEFTS1MgPSBbCisgICAgWyAnYWxsJywgICAgICAnZG8gY29uZmlnLCBzZXR1cCwgdGhlbiBpbnN0YWxsJyBdLAorICAgIFsgJ2NvbmZpZycsICAgJ3NhdmVzIHlvdXIgY29uZmlndXJhdGlvbnMnIF0sCisgICAgWyAnc2hvdycsICAgICAnc2hvd3MgY3VycmVudCBjb25maWd1cmF0aW9uJyBdLAorICAgIFsgJ3NldHVwJywgICAgJ2NvbXBpbGVzIHJ1YnkgZXh0ZW50aW9ucyBhbmQgb3RoZXJzJyBdLAorICAgIFsgJ2luc3RhbGwnLCAgJ2luc3RhbGxzIGZpbGVzJyBdLAorICAgIFsgJ3Rlc3QnLCAgICAgJ3J1biBhbGwgdGVzdHMgaW4gdGVzdC8nIF0sCisgICAgWyAnY2xlYW4nLCAgICAiZG9lcyBgbWFrZSBjbGVhbicgZm9yIGVhY2ggZXh0ZW50aW9uIiBdLAorICAgIFsgJ2Rpc3RjbGVhbicsImRvZXMgYG1ha2UgZGlzdGNsZWFuJyBmb3IgZWFjaCBleHRlbnRpb24iIF0KKyAgXQorCisgIGRlZiBUb3BsZXZlbEluc3RhbGxlci5pbnZva2UKKyAgICBjb25maWcgPSBDb25maWdUYWJsZS5uZXcobG9hZF9yYmNvbmZpZygpKQorICAgIGNvbmZpZy5sb2FkX3N0YW5kYXJkX2VudHJpZXMKKyAgICBjb25maWcubG9hZF9tdWx0aXBhY2thZ2VfZW50cmllcyBpZiBtdWx0aXBhY2thZ2U/CisgICAgY29uZmlnLmZpeHVwCisgICAga2xhc3MgPSAobXVsdGlwYWNrYWdlPygpID8gVG9wbGV2ZWxJbnN0YWxsZXJNdWx0aSA6IFRvcGxldmVsSW5zdGFsbGVyKQorICAgIGtsYXNzLm5ldyhGaWxlLmRpcm5hbWUoJDApLCBjb25maWcpLmludm9rZQorICBlbmQKKworICBkZWYgVG9wbGV2ZWxJbnN0YWxsZXIubXVsdGlwYWNrYWdlPworICAgIEZpbGUuZGlyPyhGaWxlLmRpcm5hbWUoJDApICsgJy9wYWNrYWdlcycpCisgIGVuZAorCisgIGRlZiBUb3BsZXZlbEluc3RhbGxlci5sb2FkX3JiY29uZmlnCisgICAgaWYgYXJnID0gQVJHVi5kZXRlY3Qge3xhcmd8IC9cQS0tcmJjb25maWc9LyA9fiBhcmcgfQorICAgICAgQVJHVi5kZWxldGUoYXJnKQorICAgICAgbG9hZCBGaWxlLmV4cGFuZF9wYXRoKGFyZy5zcGxpdCgvPS8sIDIpWzFdKQorICAgICAgJCIucHVzaCAncmJjb25maWcucmInCisgICAgZWxzZQorICAgICAgcmVxdWlyZSAncmJjb25maWcnCisgICAgZW5kCisgICAgOjpSYkNvbmZpZzo6Q09ORklHCisgIGVuZAorCisgIGRlZiBpbml0aWFsaXplKGFyZGlyX3Jvb3QsIGNvbmZpZykKKyAgICBAYXJkaXIgPSBGaWxlLmV4cGFuZF9wYXRoKGFyZGlyX3Jvb3QpCisgICAgQGNvbmZpZyA9IGNvbmZpZworICAgICMgY2FjaGUKKyAgICBAdmFsaWRfdGFza19yZSA9IG5pbAorICBlbmQKKworICBkZWYgY29uZmlnKGtleSkKKyAgICBAY29uZmlnW2tleV0KKyAgZW5kCisKKyAgZGVmIGluc3BlY3QKKyAgICAiIzwje3NlbGYuY2xhc3N9ICN7X19pZF9fKCl9PiIKKyAgZW5kCisKKyAgZGVmIGludm9rZQorICAgIHJ1bl9tZXRhY29uZmlncworICAgIGNhc2UgdGFzayA9IHBhcnNlYXJnX2dsb2JhbCgpCisgICAgd2hlbiBuaWwsICdhbGwnCisgICAgICBwYXJzZWFyZ19jb25maWcKKyAgICAgIGluaXRfaW5zdGFsbGVycworICAgICAgZXhlY19jb25maWcKKyAgICAgIGV4ZWNfc2V0dXAKKyAgICAgIGV4ZWNfaW5zdGFsbAorICAgIGVsc2UKKyAgICAgIGNhc2UgdGFzaworICAgICAgd2hlbiAnY29uZmlnJywgJ3Rlc3QnCisgICAgICAgIDsKKyAgICAgIHdoZW4gJ2NsZWFuJywgJ2Rpc3RjbGVhbicKKyAgICAgICAgQGNvbmZpZy5sb2FkX3NhdmVmaWxlIGlmIEZpbGUuZXhpc3Q/KEBjb25maWcuc2F2ZWZpbGUpCisgICAgICBlbHNlCisgICAgICAgIEBjb25maWcubG9hZF9zYXZlZmlsZQorICAgICAgZW5kCisgICAgICBfX3NlbmRfXyAicGFyc2VhcmdfI3t0YXNrfSIKKyAgICAgIGluaXRfaW5zdGFsbGVycworICAgICAgX19zZW5kX18gImV4ZWNfI3t0YXNrfSIKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgcnVuX21ldGFjb25maWdzCisgICAgQGNvbmZpZy5sb2FkX3NjcmlwdCAiI3tAYXJkaXJ9L21ldGFjb25maWciCisgIGVuZAorCisgIGRlZiBpbml0X2luc3RhbGxlcnMKKyAgICBAaW5zdGFsbGVyID0gSW5zdGFsbGVyLm5ldyhAY29uZmlnLCBAYXJkaXIsIEZpbGUuZXhwYW5kX3BhdGgoJy4nKSkKKyAgZW5kCisKKyAgIworICAjIEhvb2sgU2NyaXB0IEFQSSBiYXNlcworICAjCisKKyAgZGVmIHNyY2Rpcl9yb290CisgICAgQGFyZGlyCisgIGVuZAorCisgIGRlZiBvYmpkaXJfcm9vdAorICAgICcuJworICBlbmQKKworICBkZWYgcmVscGF0aAorICAgICcuJworICBlbmQKKworICAjCisgICMgT3B0aW9uIFBhcnNpbmcKKyAgIworCisgIGRlZiBwYXJzZWFyZ19nbG9iYWwKKyAgICB3aGlsZSBhcmcgPSBBUkdWLnNoaWZ0CisgICAgICBjYXNlIGFyZworICAgICAgd2hlbiAvXEFcdytcei8KKyAgICAgICAgc2V0dXBfcmJfZXJyb3IgImludmFsaWQgdGFzazogI3thcmd9IiB1bmxlc3MgdmFsaWRfdGFzaz8oYXJnKQorICAgICAgICByZXR1cm4gYXJnCisgICAgICB3aGVuICctcScsICctLXF1aWV0JworICAgICAgICBAY29uZmlnLnZlcmJvc2UgPSBmYWxzZQorICAgICAgd2hlbiAnLS12ZXJib3NlJworICAgICAgICBAY29uZmlnLnZlcmJvc2UgPSB0cnVlCisgICAgICB3aGVuICctLWhlbHAnCisgICAgICAgIHByaW50X3VzYWdlICRzdGRvdXQKKyAgICAgICAgZXhpdCAwCisgICAgICB3aGVuICctLXZlcnNpb24nCisgICAgICAgIHB1dHMgIiN7RmlsZS5iYXNlbmFtZSgkMCl9IHZlcnNpb24gI3tWZXJzaW9ufSIKKyAgICAgICAgZXhpdCAwCisgICAgICB3aGVuICctLWNvcHlyaWdodCcKKyAgICAgICAgcHV0cyBDb3B5cmlnaHQKKyAgICAgICAgZXhpdCAwCisgICAgICBlbHNlCisgICAgICAgIHNldHVwX3JiX2Vycm9yICJ1bmtub3duIGdsb2JhbCBvcHRpb24gJyN7YXJnfSciCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBuaWwKKyAgZW5kCisKKyAgZGVmIHZhbGlkX3Rhc2s/KHQpCisgICAgdmFsaWRfdGFza19yZSgpID1+IHQKKyAgZW5kCisKKyAgZGVmIHZhbGlkX3Rhc2tfcmUKKyAgICBAdmFsaWRfdGFza19yZSB8fD0gL1xBKD86I3tUQVNLUy5tYXAge3x0YXNrLGRlc2N8IHRhc2sgfS5qb2luKCd8Jyl9KVx6LworICBlbmQKKworICBkZWYgcGFyc2Vhcmdfbm9fb3B0aW9ucworICAgIHVubGVzcyBBUkdWLmVtcHR5PworICAgICAgdGFzayA9IGNhbGxlcigwKS5maXJzdC5zbGljZSglcjxgcGFyc2VhcmdfKFx3KyknPiwgMSkKKyAgICAgIHNldHVwX3JiX2Vycm9yICIje3Rhc2t9OiB1bmtub3duIG9wdGlvbnM6ICN7QVJHVi5qb2luKCcgJyl9IgorICAgIGVuZAorICBlbmQKKworICBhbGlhcyBwYXJzZWFyZ19zaG93ICAgICAgIHBhcnNlYXJnX25vX29wdGlvbnMKKyAgYWxpYXMgcGFyc2Vhcmdfc2V0dXAgICAgICBwYXJzZWFyZ19ub19vcHRpb25zCisgIGFsaWFzIHBhcnNlYXJnX3Rlc3QgICAgICAgcGFyc2Vhcmdfbm9fb3B0aW9ucworICBhbGlhcyBwYXJzZWFyZ19jbGVhbiAgICAgIHBhcnNlYXJnX25vX29wdGlvbnMKKyAgYWxpYXMgcGFyc2VhcmdfZGlzdGNsZWFuICBwYXJzZWFyZ19ub19vcHRpb25zCisKKyAgZGVmIHBhcnNlYXJnX2NvbmZpZworICAgIGV2YWxvcHQgPSBbXQorICAgIHNldCA9IFtdCisgICAgQGNvbmZpZy5jb25maWdfb3B0ID0gW10KKyAgICB3aGlsZSBpID0gQVJHVi5zaGlmdAorICAgICAgaWYgL1xBLS0/XHovID1+IGkKKyAgICAgICAgQGNvbmZpZy5jb25maWdfb3B0ID0gQVJHVi5kdXAKKyAgICAgICAgYnJlYWsKKyAgICAgIGVuZAorICAgICAgbmFtZSwgdmFsdWUgPSAqQGNvbmZpZy5wYXJzZV9vcHQoaSkKKyAgICAgIGlmIEBjb25maWcudmFsdWVfY29uZmlnPyhuYW1lKQorICAgICAgICBAY29uZmlnW25hbWVdID0gdmFsdWUKKyAgICAgIGVsc2UKKyAgICAgICAgZXZhbG9wdC5wdXNoIFtuYW1lLCB2YWx1ZV0KKyAgICAgIGVuZAorICAgICAgc2V0LnB1c2ggbmFtZQorICAgIGVuZAorICAgIGV2YWxvcHQuZWFjaCBkbyB8bmFtZSwgdmFsdWV8CisgICAgICBAY29uZmlnLmxvb2t1cChuYW1lKS5ldmFsdWF0ZSB2YWx1ZSwgQGNvbmZpZworICAgIGVuZAorICAgICMgQ2hlY2sgaWYgY29uZmlndXJhdGlvbiBpcyB2YWxpZAorICAgIHNldC5lYWNoIGRvIHxufAorICAgICAgQGNvbmZpZ1tuXSBpZiBAY29uZmlnLnZhbHVlX2NvbmZpZz8obikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHBhcnNlYXJnX2luc3RhbGwKKyAgICBAY29uZmlnLm5vX2hhcm0gPSBmYWxzZQorICAgIEBjb25maWcuaW5zdGFsbF9wcmVmaXggPSAnJworICAgIHdoaWxlIGEgPSBBUkdWLnNoaWZ0CisgICAgICBjYXNlIGEKKyAgICAgIHdoZW4gJy0tbm8taGFybScKKyAgICAgICAgQGNvbmZpZy5ub19oYXJtID0gdHJ1ZQorICAgICAgd2hlbiAvXEEtLXByZWZpeD0vCisgICAgICAgIHBhdGggPSBhLnNwbGl0KC89LywgMilbMV0KKyAgICAgICAgcGF0aCA9IEZpbGUuZXhwYW5kX3BhdGgocGF0aCkgdW5sZXNzIHBhdGhbMCwxXSA9PSAnLycKKyAgICAgICAgQGNvbmZpZy5pbnN0YWxsX3ByZWZpeCA9IHBhdGgKKyAgICAgIGVsc2UKKyAgICAgICAgc2V0dXBfcmJfZXJyb3IgImluc3RhbGw6IHVua25vd24gb3B0aW9uICN7YX0iCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHByaW50X3VzYWdlKG91dCkKKyAgICBvdXQucHV0cyAnVHlwaWNhbCBJbnN0YWxsYXRpb24gUHJvY2VkdXJlOicKKyAgICBvdXQucHV0cyAiICAkIHJ1YnkgI3tGaWxlLmJhc2VuYW1lICQwfSBjb25maWciCisgICAgb3V0LnB1dHMgIiAgJCBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gc2V0dXAiCisgICAgb3V0LnB1dHMgIiAgIyBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gaW5zdGFsbCAobWF5IHJlcXVpcmUgcm9vdCBwcml2aWxlZ2UpIgorICAgIG91dC5wdXRzCisgICAgb3V0LnB1dHMgJ0RldGFpbGVkIFVzYWdlOicKKyAgICBvdXQucHV0cyAiICBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gPGdsb2JhbCBvcHRpb24+IgorICAgIG91dC5wdXRzICIgIHJ1YnkgI3tGaWxlLmJhc2VuYW1lICQwfSBbPGdsb2JhbCBvcHRpb25zPl0gPHRhc2s+IFs8dGFzayBvcHRpb25zPl0iCisKKyAgICBmbXQgPSAiICAlLTI0cyAlc1xuIgorICAgIG91dC5wdXRzCisgICAgb3V0LnB1dHMgJ0dsb2JhbCBvcHRpb25zOicKKyAgICBvdXQucHJpbnRmIGZtdCwgJy1xLC0tcXVpZXQnLCAgICdzdXBwcmVzcyBtZXNzYWdlIG91dHB1dHMnCisgICAgb3V0LnByaW50ZiBmbXQsICcgICAtLXZlcmJvc2UnLCAnb3V0cHV0IG1lc3NhZ2VzIHZlcmJvc2VseScKKyAgICBvdXQucHJpbnRmIGZtdCwgJyAgIC0taGVscCcsICAgICdwcmludCB0aGlzIG1lc3NhZ2UnCisgICAgb3V0LnByaW50ZiBmbXQsICcgICAtLXZlcnNpb24nLCAncHJpbnQgdmVyc2lvbiBhbmQgcXVpdCcKKyAgICBvdXQucHJpbnRmIGZtdCwgJyAgIC0tY29weXJpZ2h0JywgICdwcmludCBjb3B5cmlnaHQgYW5kIHF1aXQnCisgICAgb3V0LnB1dHMKKyAgICBvdXQucHV0cyAnVGFza3M6JworICAgIFRBU0tTLmVhY2ggZG8gfG5hbWUsIGRlc2N8CisgICAgICBvdXQucHJpbnRmIGZtdCwgbmFtZSwgZGVzYworICAgIGVuZAorCisgICAgZm10ID0gIiAgJS0yNHMgJXMgWyVzXVxuIgorICAgIG91dC5wdXRzCisgICAgb3V0LnB1dHMgJ09wdGlvbnMgZm9yIENPTkZJRyBvciBBTEw6JworICAgIEBjb25maWcuZWFjaCBkbyB8aXRlbXwKKyAgICAgIG91dC5wcmludGYgZm10LCBpdGVtLmhlbHBfb3B0LCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmhlbHBfZGVmYXVsdAorICAgIGVuZAorICAgIG91dC5wcmludGYgZm10LCAnLS1yYmNvbmZpZz1wYXRoJywgJ3JiY29uZmlnLnJiIHRvIGxvYWQnLCJydW5uaW5nIHJ1YnkncyIKKyAgICBvdXQucHV0cworICAgIG91dC5wdXRzICdPcHRpb25zIGZvciBJTlNUQUxMOicKKyAgICBvdXQucHJpbnRmIGZtdCwgJy0tbm8taGFybScsICdvbmx5IGRpc3BsYXkgd2hhdCB0byBkbyBpZiBnaXZlbicsICdvZmYnCisgICAgb3V0LnByaW50ZiBmbXQsICctLXByZWZpeD1wYXRoJywgICdpbnN0YWxsIHBhdGggcHJlZml4JywgJycKKyAgICBvdXQucHV0cworICBlbmQKKworICAjCisgICMgVGFzayBIYW5kbGVycworICAjCisKKyAgZGVmIGV4ZWNfY29uZmlnCisgICAgQGluc3RhbGxlci5leGVjX2NvbmZpZworICAgIEBjb25maWcuc2F2ZSAgICMgbXVzdCBiZSBmaW5hbAorICBlbmQKKworICBkZWYgZXhlY19zZXR1cAorICAgIEBpbnN0YWxsZXIuZXhlY19zZXR1cAorICBlbmQKKworICBkZWYgZXhlY19pbnN0YWxsCisgICAgQGluc3RhbGxlci5leGVjX2luc3RhbGwKKyAgZW5kCisKKyAgZGVmIGV4ZWNfdGVzdAorICAgIEBpbnN0YWxsZXIuZXhlY190ZXN0CisgIGVuZAorCisgIGRlZiBleGVjX3Nob3cKKyAgICBAY29uZmlnLmVhY2ggZG8gfGl8CisgICAgICBwcmludGYgIiUtMjBzICVzXG4iLCBpLm5hbWUsIGkudmFsdWUgaWYgaS52YWx1ZT8KKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIGV4ZWNfY2xlYW4KKyAgICBAaW5zdGFsbGVyLmV4ZWNfY2xlYW4KKyAgZW5kCisKKyAgZGVmIGV4ZWNfZGlzdGNsZWFuCisgICAgQGluc3RhbGxlci5leGVjX2Rpc3RjbGVhbgorICBlbmQKKworZW5kICAgIyBjbGFzcyBUb3BsZXZlbEluc3RhbGxlcgorCisKK2NsYXNzIFRvcGxldmVsSW5zdGFsbGVyTXVsdGkgPCBUb3BsZXZlbEluc3RhbGxlcgorCisgIGluY2x1ZGUgRmlsZU9wZXJhdGlvbnMKKworICBkZWYgaW5pdGlhbGl6ZShhcmRpcl9yb290LCBjb25maWcpCisgICAgc3VwZXIKKyAgICBAcGFja2FnZXMgPSBkaXJlY3Rvcmllc19vZigiI3tAYXJkaXJ9L3BhY2thZ2VzIikKKyAgICByYWlzZSAnbm8gcGFja2FnZSBleGlzdHMnIGlmIEBwYWNrYWdlcy5lbXB0eT8KKyAgICBAcm9vdF9pbnN0YWxsZXIgPSBJbnN0YWxsZXIubmV3KEBjb25maWcsIEBhcmRpciwgRmlsZS5leHBhbmRfcGF0aCgnLicpKQorICBlbmQKKworICBkZWYgcnVuX21ldGFjb25maWdzCisgICAgQGNvbmZpZy5sb2FkX3NjcmlwdCAiI3tAYXJkaXJ9L21ldGFjb25maWciLCBzZWxmCisgICAgQHBhY2thZ2VzLmVhY2ggZG8gfG5hbWV8CisgICAgICBAY29uZmlnLmxvYWRfc2NyaXB0ICIje0BhcmRpcn0vcGFja2FnZXMvI3tuYW1lfS9tZXRhY29uZmlnIgorICAgIGVuZAorICBlbmQKKworICBhdHRyX3JlYWRlciA6cGFja2FnZXMKKworICBkZWYgcGFja2FnZXM9KGxpc3QpCisgICAgcmFpc2UgJ3BhY2thZ2UgbGlzdCBpcyBlbXB0eScgaWYgbGlzdC5lbXB0eT8KKyAgICBsaXN0LmVhY2ggZG8gfG5hbWV8CisgICAgICByYWlzZSAiZGlyZWN0b3J5IHBhY2thZ2VzLyN7bmFtZX0gZG9lcyBub3QgZXhpc3QiXAorICAgICAgICAgICAgICB1bmxlc3MgRmlsZS5kaXI/KCIje0BhcmRpcn0vcGFja2FnZXMvI3tuYW1lfSIpCisgICAgZW5kCisgICAgQHBhY2thZ2VzID0gbGlzdAorICBlbmQKKworICBkZWYgaW5pdF9pbnN0YWxsZXJzCisgICAgQGluc3RhbGxlcnMgPSB7fQorICAgIEBwYWNrYWdlcy5lYWNoIGRvIHxwYWNrfAorICAgICAgQGluc3RhbGxlcnNbcGFja10gPSBJbnN0YWxsZXIubmV3KEBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI3tAYXJkaXJ9L3BhY2thZ2VzLyN7cGFja30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2VzLyN7cGFja30iKQorICAgIGVuZAorICAgIHdpdGggICAgPSBleHRyYWN0X3NlbGVjdGlvbihjb25maWcoJ3dpdGgnKSkKKyAgICB3aXRob3V0ID0gZXh0cmFjdF9zZWxlY3Rpb24oY29uZmlnKCd3aXRob3V0JykpCisgICAgQHNlbGVjdGVkID0gQGluc3RhbGxlcnMua2V5cy5zZWxlY3Qge3xuYW1lfAorICAgICAgICAgICAgICAgICAgKHdpdGguZW1wdHk/IG9yIHdpdGguaW5jbHVkZT8obmFtZSkpIFwKKyAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHdpdGhvdXQuaW5jbHVkZT8obmFtZSkKKyAgICAgICAgICAgICAgICB9CisgIGVuZAorCisgIGRlZiBleHRyYWN0X3NlbGVjdGlvbihsaXN0KQorICAgIGEgPSBsaXN0LnNwbGl0KC8sLykKKyAgICBhLmVhY2ggZG8gfG5hbWV8CisgICAgICBzZXR1cF9yYl9lcnJvciAibm8gc3VjaCBwYWNrYWdlOiAje25hbWV9IiAgdW5sZXNzIEBpbnN0YWxsZXJzLmtleT8obmFtZSkKKyAgICBlbmQKKyAgICBhCisgIGVuZAorCisgIGRlZiBwcmludF91c2FnZShmKQorICAgIHN1cGVyCisgICAgZi5wdXRzICdJbmx1ZGVkIHBhY2thZ2VzOicKKyAgICBmLnB1dHMgJyAgJyArIEBwYWNrYWdlcy5zb3J0LmpvaW4oJyAnKQorICAgIGYucHV0cworICBlbmQKKworICAjCisgICMgVGFzayBIYW5kbGVycworICAjCisKKyAgZGVmIGV4ZWNfY29uZmlnCisgICAgcnVuX2hvb2sgJ3ByZS1jb25maWcnCisgICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX2NvbmZpZyB9CisgICAgcnVuX2hvb2sgJ3Bvc3QtY29uZmlnJworICAgIEBjb25maWcuc2F2ZSAgICMgbXVzdCBiZSBmaW5hbAorICBlbmQKKworICBkZWYgZXhlY19zZXR1cAorICAgIHJ1bl9ob29rICdwcmUtc2V0dXAnCisgICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX3NldHVwIH0KKyAgICBydW5faG9vayAncG9zdC1zZXR1cCcKKyAgZW5kCisKKyAgZGVmIGV4ZWNfaW5zdGFsbAorICAgIHJ1bl9ob29rICdwcmUtaW5zdGFsbCcKKyAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfaW5zdGFsbCB9CisgICAgcnVuX2hvb2sgJ3Bvc3QtaW5zdGFsbCcKKyAgZW5kCisKKyAgZGVmIGV4ZWNfdGVzdAorICAgIHJ1bl9ob29rICdwcmUtdGVzdCcKKyAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfdGVzdCB9CisgICAgcnVuX2hvb2sgJ3Bvc3QtdGVzdCcKKyAgZW5kCisKKyAgZGVmIGV4ZWNfY2xlYW4KKyAgICBybV9mIEBjb25maWcuc2F2ZWZpbGUKKyAgICBydW5faG9vayAncHJlLWNsZWFuJworICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19jbGVhbiB9CisgICAgcnVuX2hvb2sgJ3Bvc3QtY2xlYW4nCisgIGVuZAorCisgIGRlZiBleGVjX2Rpc3RjbGVhbgorICAgIHJtX2YgQGNvbmZpZy5zYXZlZmlsZQorICAgIHJ1bl9ob29rICdwcmUtZGlzdGNsZWFuJworICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19kaXN0Y2xlYW4gfQorICAgIHJ1bl9ob29rICdwb3N0LWRpc3RjbGVhbicKKyAgZW5kCisKKyAgIworICAjIGxpYgorICAjCisKKyAgZGVmIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycworICAgIERpci5ta2RpciAncGFja2FnZXMnIHVubGVzcyBGaWxlLmRpcj8oJ3BhY2thZ2VzJykKKyAgICBAc2VsZWN0ZWQuZWFjaCBkbyB8cGFja3wKKyAgICAgICRzdGRlcnIucHV0cyAiUHJvY2Vzc2luZyB0aGUgcGFja2FnZSBgI3twYWNrfScgLi4uIiBpZiB2ZXJib3NlPworICAgICAgRGlyLm1rZGlyICJwYWNrYWdlcy8je3BhY2t9IiB1bmxlc3MgRmlsZS5kaXI/KCJwYWNrYWdlcy8je3BhY2t9IikKKyAgICAgIERpci5jaGRpciAicGFja2FnZXMvI3twYWNrfSIKKyAgICAgIHlpZWxkIEBpbnN0YWxsZXJzW3BhY2tdCisgICAgICBEaXIuY2hkaXIgJy4uLy4uJworICAgIGVuZAorICBlbmQKKworICBkZWYgcnVuX2hvb2soaWQpCisgICAgQHJvb3RfaW5zdGFsbGVyLnJ1bl9ob29rIGlkCisgIGVuZAorCisgICMgbW9kdWxlIEZpbGVPcGVyYXRpb25zIHJlcXVpcmVzIHRoaXMKKyAgZGVmIHZlcmJvc2U/CisgICAgQGNvbmZpZy52ZXJib3NlPworICBlbmQKKworICAjIG1vZHVsZSBGaWxlT3BlcmF0aW9ucyByZXF1aXJlcyB0aGlzCisgIGRlZiBub19oYXJtPworICAgIEBjb25maWcubm9faGFybT8KKyAgZW5kCisKK2VuZCAgICMgY2xhc3MgVG9wbGV2ZWxJbnN0YWxsZXJNdWx0aQorCisKK2NsYXNzIEluc3RhbGxlcgorCisgIEZJTEVUWVBFUyA9ICV3KCBiaW4gbGliIGV4dCBkYXRhIGNvbmYgbWFuICkKKworICBpbmNsdWRlIEZpbGVPcGVyYXRpb25zCisgIGluY2x1ZGUgSG9va1NjcmlwdEFQSQorCisgIGRlZiBpbml0aWFsaXplKGNvbmZpZywgc3Jjcm9vdCwgb2Jqcm9vdCkKKyAgICBAY29uZmlnID0gY29uZmlnCisgICAgQHNyY2RpciA9IEZpbGUuZXhwYW5kX3BhdGgoc3Jjcm9vdCkKKyAgICBAb2JqZGlyID0gRmlsZS5leHBhbmRfcGF0aChvYmpyb290KQorICAgIEBjdXJyZGlyID0gJy4nCisgIGVuZAorCisgIGRlZiBpbnNwZWN0CisgICAgIiM8I3tzZWxmLmNsYXNzfSAje0ZpbGUuYmFzZW5hbWUoQHNyY2Rpcil9PiIKKyAgZW5kCisKKyAgZGVmIG5vb3AocmVsKQorICBlbmQKKworICAjCisgICMgSG9vayBTY3JpcHQgQVBJIGJhc2UgbWV0aG9kcworICAjCisKKyAgZGVmIHNyY2Rpcl9yb290CisgICAgQHNyY2RpcgorICBlbmQKKworICBkZWYgb2JqZGlyX3Jvb3QKKyAgICBAb2JqZGlyCisgIGVuZAorCisgIGRlZiByZWxwYXRoCisgICAgQGN1cnJkaXIKKyAgZW5kCisKKyAgIworICAjIENvbmZpZyBBY2Nlc3MKKyAgIworCisgICMgbW9kdWxlIEZpbGVPcGVyYXRpb25zIHJlcXVpcmVzIHRoaXMKKyAgZGVmIHZlcmJvc2U/CisgICAgQGNvbmZpZy52ZXJib3NlPworICBlbmQKKworICAjIG1vZHVsZSBGaWxlT3BlcmF0aW9ucyByZXF1aXJlcyB0aGlzCisgIGRlZiBub19oYXJtPworICAgIEBjb25maWcubm9faGFybT8KKyAgZW5kCisKKyAgZGVmIHZlcmJvc2Vfb2ZmCisgICAgYmVnaW4KKyAgICAgIHNhdmUsIEBjb25maWcudmVyYm9zZSA9IEBjb25maWcudmVyYm9zZT8sIGZhbHNlCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgQGNvbmZpZy52ZXJib3NlID0gc2F2ZQorICAgIGVuZAorICBlbmQKKworICAjCisgICMgVEFTSyBjb25maWcKKyAgIworCisgIGRlZiBleGVjX2NvbmZpZworICAgIGV4ZWNfdGFza190cmF2ZXJzZSAnY29uZmlnJworICBlbmQKKworICBhbGlhcyBjb25maWdfZGlyX2JpbiBub29wCisgIGFsaWFzIGNvbmZpZ19kaXJfbGliIG5vb3AKKworICBkZWYgY29uZmlnX2Rpcl9leHQocmVsKQorICAgIGV4dGNvbmYgaWYgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQorICBlbmQKKworICBhbGlhcyBjb25maWdfZGlyX2RhdGEgbm9vcAorICBhbGlhcyBjb25maWdfZGlyX2NvbmYgbm9vcAorICBhbGlhcyBjb25maWdfZGlyX21hbiBub29wCisKKyAgZGVmIGV4dGNvbmYKKyAgICBydWJ5ICIje2N1cnJfc3JjZGlyKCl9L2V4dGNvbmYucmIiLCAqQGNvbmZpZy5jb25maWdfb3B0CisgIGVuZAorCisgICMKKyAgIyBUQVNLIHNldHVwCisgICMKKworICBkZWYgZXhlY19zZXR1cAorICAgIGV4ZWNfdGFza190cmF2ZXJzZSAnc2V0dXAnCisgIGVuZAorCisgIGRlZiBzZXR1cF9kaXJfYmluKHJlbCkKKyAgICBmaWxlc19vZihjdXJyX3NyY2RpcigpKS5lYWNoIGRvIHxmbmFtZXwKKyAgICAgIHVwZGF0ZV9zaGViYW5nX2xpbmUgIiN7Y3Vycl9zcmNkaXIoKX0vI3tmbmFtZX0iCisgICAgZW5kCisgIGVuZAorCisgIGFsaWFzIHNldHVwX2Rpcl9saWIgbm9vcAorCisgIGRlZiBzZXR1cF9kaXJfZXh0KHJlbCkKKyAgICBtYWtlIGlmIGV4dGRpcj8oY3Vycl9zcmNkaXIoKSkKKyAgZW5kCisKKyAgYWxpYXMgc2V0dXBfZGlyX2RhdGEgbm9vcAorICBhbGlhcyBzZXR1cF9kaXJfY29uZiBub29wCisgIGFsaWFzIHNldHVwX2Rpcl9tYW4gbm9vcAorCisgIGRlZiB1cGRhdGVfc2hlYmFuZ19saW5lKHBhdGgpCisgICAgcmV0dXJuIGlmIG5vX2hhcm0/CisgICAgcmV0dXJuIGlmIGNvbmZpZygnc2hlYmFuZycpID09ICduZXZlcicKKyAgICBvbGQgPSBTaGViYW5nLmxvYWQocGF0aCkKKyAgICBpZiBvbGQKKyAgICAgICRzdGRlcnIucHV0cyAid2FybmluZzogI3twYXRofTogU2hlYmFuZyBsaW5lIGluY2x1ZGVzIHRvbyBtYW55IGFyZ3MuICBJdCBpcyBub3QgcG9ydGFibGUgYW5kIHlvdXIgcHJvZ3JhbSBtYXkgbm90IHdvcmsuIiBpZiBvbGQuYXJncy5zaXplID4gMQorICAgICAgbmV3ID0gbmV3X3NoZWJhbmcob2xkKQorICAgICAgcmV0dXJuIGlmIG5ldy50b19zID09IG9sZC50b19zCisgICAgZWxzZQorICAgICAgcmV0dXJuIHVubGVzcyBjb25maWcoJ3NoZWJhbmcnKSA9PSAnYWxsJworICAgICAgbmV3ID0gU2hlYmFuZy5uZXcoY29uZmlnKCdydWJ5cGF0aCcpKQorICAgIGVuZAorICAgICRzdGRlcnIucHV0cyAidXBkYXRpbmcgc2hlYmFuZzogI3tGaWxlLmJhc2VuYW1lKHBhdGgpfSIgaWYgdmVyYm9zZT8KKyAgICBvcGVuX2F0b21pY193cml0ZXIocGF0aCkge3xvdXRwdXR8CisgICAgICBGaWxlLm9wZW4ocGF0aCwgJ3JiJykge3xmfAorICAgICAgICBmLmdldHMgaWYgb2xkICAgIyBkaXNjYXJkCisgICAgICAgIG91dHB1dC5wdXRzIG5ldy50b19zCisgICAgICAgIG91dHB1dC5wcmludCBmLnJlYWQKKyAgICAgIH0KKyAgICB9CisgIGVuZAorCisgIGRlZiBuZXdfc2hlYmFuZyhvbGQpCisgICAgaWYgL1xBcnVieS8gPX4gRmlsZS5iYXNlbmFtZShvbGQuY21kKQorICAgICAgU2hlYmFuZy5uZXcoY29uZmlnKCdydWJ5cGF0aCcpLCBvbGQuYXJncykKKyAgICBlbHNpZiBGaWxlLmJhc2VuYW1lKG9sZC5jbWQpID09ICdlbnYnIGFuZCBvbGQuYXJncy5maXJzdCA9PSAncnVieScKKyAgICAgIFNoZWJhbmcubmV3KGNvbmZpZygncnVieXBhdGgnKSwgb2xkLmFyZ3NbMS4uLTFdKQorICAgIGVsc2UKKyAgICAgIHJldHVybiBvbGQgdW5sZXNzIGNvbmZpZygnc2hlYmFuZycpID09ICdhbGwnCisgICAgICBTaGViYW5nLm5ldyhjb25maWcoJ3J1YnlwYXRoJykpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBvcGVuX2F0b21pY193cml0ZXIocGF0aCwgJmJsb2NrKQorICAgIHRtcGZpbGUgPSBGaWxlLmJhc2VuYW1lKHBhdGgpICsgJy50bXAnCisgICAgYmVnaW4KKyAgICAgIEZpbGUub3Blbih0bXBmaWxlLCAnd2InLCAmYmxvY2spCisgICAgICBGaWxlLnJlbmFtZSB0bXBmaWxlLCBGaWxlLmJhc2VuYW1lKHBhdGgpCisgICAgZW5zdXJlCisgICAgICBGaWxlLnVubGluayB0bXBmaWxlIGlmIEZpbGUuZXhpc3Q/KHRtcGZpbGUpCisgICAgZW5kCisgIGVuZAorCisgIGNsYXNzIFNoZWJhbmcKKyAgICBkZWYgU2hlYmFuZy5sb2FkKHBhdGgpCisgICAgICBsaW5lID0gbmlsCisgICAgICBGaWxlLm9wZW4ocGF0aCkge3xmfAorICAgICAgICBsaW5lID0gZi5nZXRzCisgICAgICB9CisgICAgICByZXR1cm4gbmlsIHVubGVzcyAvXEEjIS8gPX4gbGluZQorICAgICAgcGFyc2UobGluZSkKKyAgICBlbmQKKworICAgIGRlZiBTaGViYW5nLnBhcnNlKGxpbmUpCisgICAgICBjbWQsICphcmdzID0gKmxpbmUuc3RyaXAuc3ViKC9cQVwjIS8sICcnKS5zcGxpdCgnICcpCisgICAgICBuZXcoY21kLCBhcmdzKQorICAgIGVuZAorCisgICAgZGVmIGluaXRpYWxpemUoY21kLCBhcmdzID0gW10pCisgICAgICBAY21kID0gY21kCisgICAgICBAYXJncyA9IGFyZ3MKKyAgICBlbmQKKworICAgIGF0dHJfcmVhZGVyIDpjbWQKKyAgICBhdHRyX3JlYWRlciA6YXJncworCisgICAgZGVmIHRvX3MKKyAgICAgICIjISAje0BjbWR9IiArIChAYXJncy5lbXB0eT8gPyAnJyA6ICIgI3tAYXJncy5qb2luKCcgJyl9IikKKyAgICBlbmQKKyAgZW5kCisKKyAgIworICAjIFRBU0sgaW5zdGFsbAorICAjCisKKyAgZGVmIGV4ZWNfaW5zdGFsbAorICAgIHJtX2YgJ0luc3RhbGxlZEZpbGVzJworICAgIGV4ZWNfdGFza190cmF2ZXJzZSAnaW5zdGFsbCcKKyAgZW5kCisKKyAgZGVmIGluc3RhbGxfZGlyX2JpbihyZWwpCisgICAgaW5zdGFsbF9maWxlcyB0YXJnZXRmaWxlcygpLCAiI3tjb25maWcoJ2JpbmRpcicpfS8je3JlbH0iLCAwNzU1CisgIGVuZAorCisgIGRlZiBpbnN0YWxsX2Rpcl9saWIocmVsKQorICAgIGluc3RhbGxfZmlsZXMgbGliZmlsZXMoKSwgIiN7Y29uZmlnKCdyYmRpcicpfS8je3JlbH0iLCAwNjQ0CisgIGVuZAorCisgIGRlZiBpbnN0YWxsX2Rpcl9leHQocmVsKQorICAgIHJldHVybiB1bmxlc3MgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQorICAgIGluc3RhbGxfZmlsZXMgcnVieWV4dGVudGlvbnMoJy4nKSwKKyAgICAgICAgICAgICAgICAgICIje2NvbmZpZygnc29kaXInKX0vI3tGaWxlLmRpcm5hbWUocmVsKX0iLAorICAgICAgICAgICAgICAgICAgMDU1NQorICBlbmQKKworICBkZWYgaW5zdGFsbF9kaXJfZGF0YShyZWwpCisgICAgaW5zdGFsbF9maWxlcyB0YXJnZXRmaWxlcygpLCAiI3tjb25maWcoJ2RhdGFkaXInKX0vI3tyZWx9IiwgMDY0NAorICBlbmQKKworICBkZWYgaW5zdGFsbF9kaXJfY29uZihyZWwpCisgICAgIyBGSVhNRTogc2hvdWxkIG5vdCByZW1vdmUgY3VycmVudCBjb25maWcgZmlsZXMKKyAgICAjIChyZW5hbWUgcHJldmlvdXMgZmlsZSB0byAub2xkLy5vcmcpCisgICAgaW5zdGFsbF9maWxlcyB0YXJnZXRmaWxlcygpLCAiI3tjb25maWcoJ3N5c2NvbmZkaXInKX0vI3tyZWx9IiwgMDY0NAorICBlbmQKKworICBkZWYgaW5zdGFsbF9kaXJfbWFuKHJlbCkKKyAgICBpbnN0YWxsX2ZpbGVzIHRhcmdldGZpbGVzKCksICIje2NvbmZpZygnbWFuZGlyJyl9LyN7cmVsfSIsIDA2NDQKKyAgZW5kCisKKyAgZGVmIGluc3RhbGxfZmlsZXMobGlzdCwgZGVzdCwgbW9kZSkKKyAgICBta2Rpcl9wIGRlc3QsIEBjb25maWcuaW5zdGFsbF9wcmVmaXgKKyAgICBsaXN0LmVhY2ggZG8gfGZuYW1lfAorICAgICAgaW5zdGFsbCBmbmFtZSwgZGVzdCwgbW9kZSwgQGNvbmZpZy5pbnN0YWxsX3ByZWZpeAorICAgIGVuZAorICBlbmQKKworICBkZWYgbGliZmlsZXMKKyAgICBnbG9iX3JlamVjdCgldygqLnkgKi5vdXRwdXQpLCB0YXJnZXRmaWxlcygpKQorICBlbmQKKworICBkZWYgcnVieWV4dGVudGlvbnMoZGlyKQorICAgIGVudHMgPSBnbG9iX3NlbGVjdCgiKi4je0Bjb25maWcuZGxsZXh0fSIsIHRhcmdldGZpbGVzKCkpCisgICAgaWYgZW50cy5lbXB0eT8KKyAgICAgIHNldHVwX3JiX2Vycm9yICJubyBydWJ5IGV4dGVudGlvbiBleGlzdHM6ICdydWJ5ICN7JDB9IHNldHVwJyBmaXJzdCIKKyAgICBlbmQKKyAgICBlbnRzCisgIGVuZAorCisgIGRlZiB0YXJnZXRmaWxlcworICAgIG1hcGRpcihleGlzdGZpbGVzKCkgLSBob29rZmlsZXMoKSkKKyAgZW5kCisKKyAgZGVmIG1hcGRpcihlbnRzKQorICAgIGVudHMubWFwIHt8ZW50fAorICAgICAgaWYgRmlsZS5leGlzdD8oZW50KQorICAgICAgdGhlbiBlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpkaXIKKyAgICAgIGVsc2UgIiN7Y3Vycl9zcmNkaXIoKX0vI3tlbnR9IiAgICMgc3JjZGlyCisgICAgICBlbmQKKyAgICB9CisgIGVuZAorCisgICMgcGlja2VkIHVwIG1hbnkgZW50cmllcyBmcm9tIGN2cy0xLjExLjEvc3JjL2lnbm9yZS5jCisgIEpVTktfRklMRVMgPSAldyggCisgICAgY29yZSBSQ1NMT0cgdGFncyBUQUdTIC5tYWtlLnN0YXRlCisgICAgLm5zZV9kZXBpbmZvICMqIC4jKiBjdnNsb2cuKiAsKiAuZGVsLSogKi5vbGIKKyAgICAqfiAqLm9sZCAqLmJhayAqLkJBSyAqLm9yaWcgKi5yZWogXyQqICokCisKKyAgICAqLm9yZyAqLmluIC4qCisgICkKKworICBkZWYgZXhpc3RmaWxlcworICAgIGdsb2JfcmVqZWN0KEpVTktfRklMRVMsIChmaWxlc19vZihjdXJyX3NyY2RpcigpKSB8IGZpbGVzX29mKCcuJykpKQorICBlbmQKKworICBkZWYgaG9va2ZpbGVzCisgICAgJXcoIHByZS0lcyBwb3N0LSVzIHByZS0lcy5yYiBwb3N0LSVzLnJiICkubWFwIHt8Zm10fAorICAgICAgJXcoIGNvbmZpZyBzZXR1cCBpbnN0YWxsIGNsZWFuICkubWFwIHt8dHwgc3ByaW50ZihmbXQsIHQpIH0KKyAgICB9LmZsYXR0ZW4KKyAgZW5kCisKKyAgZGVmIGdsb2Jfc2VsZWN0KHBhdCwgZW50cykKKyAgICByZSA9IGdsb2JzMnJlKFtwYXRdKQorICAgIGVudHMuc2VsZWN0IHt8ZW50fCByZSA9fiBlbnQgfQorICBlbmQKKworICBkZWYgZ2xvYl9yZWplY3QocGF0cywgZW50cykKKyAgICByZSA9IGdsb2JzMnJlKHBhdHMpCisgICAgZW50cy5yZWplY3Qge3xlbnR8IHJlID1+IGVudCB9CisgIGVuZAorCisgIEdMT0IyUkVHRVggPSB7CisgICAgJy4nID0+ICdcLicsCisgICAgJyQnID0+ICdcJCcsCisgICAgJyMnID0+ICdcIycsCisgICAgJyonID0+ICcuKicKKyAgfQorCisgIGRlZiBnbG9iczJyZShwYXRzKQorICAgIC9cQSg/OiN7CisgICAgICBwYXRzLm1hcCB7fHBhdHwgcGF0LmdzdWIoL1tcLlwkXCNcKl0vKSB7fGNofCBHTE9CMlJFR0VYW2NoXSB9IH0uam9pbignfCcpCisgICAgfSlcei8KKyAgZW5kCisKKyAgIworICAjIFRBU0sgdGVzdAorICAjCisKKyAgVEVTVERJUiA9ICd0ZXN0JworCisgIGRlZiBleGVjX3Rlc3QKKyAgICB1bmxlc3MgRmlsZS5kaXJlY3Rvcnk/KCd0ZXN0JykKKyAgICAgICRzdGRlcnIucHV0cyAnbm8gdGVzdCBpbiB0aGlzIHBhY2thZ2UnIGlmIHZlcmJvc2U/CisgICAgICByZXR1cm4KKyAgICBlbmQKKyAgICAkc3RkZXJyLnB1dHMgJ1J1bm5pbmcgdGVzdHMuLi4nIGlmIHZlcmJvc2U/CisgICAgYmVnaW4KKyAgICAgIHJlcXVpcmUgJ3Rlc3QvdW5pdCcKKyAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICBzZXR1cF9yYl9lcnJvciAndGVzdC91bml0IGNhbm5vdCBsb2FkZWQuICBZb3UgbmVlZCBSdWJ5IDEuOCBvciBsYXRlciB0byBpbnZva2UgdGhpcyB0YXNrLicKKyAgICBlbmQKKyAgICBydW5uZXIgPSBUZXN0OjpVbml0OjpBdXRvUnVubmVyLm5ldyh0cnVlKQorICAgIHJ1bm5lci50b19ydW4gPDwgVEVTVERJUgorICAgIHJ1bm5lci5ydW4KKyAgZW5kCisKKyAgIworICAjIFRBU0sgY2xlYW4KKyAgIworCisgIGRlZiBleGVjX2NsZWFuCisgICAgZXhlY190YXNrX3RyYXZlcnNlICdjbGVhbicKKyAgICBybV9mIEBjb25maWcuc2F2ZWZpbGUKKyAgICBybV9mICdJbnN0YWxsZWRGaWxlcycKKyAgZW5kCisKKyAgYWxpYXMgY2xlYW5fZGlyX2JpbiBub29wCisgIGFsaWFzIGNsZWFuX2Rpcl9saWIgbm9vcAorICBhbGlhcyBjbGVhbl9kaXJfZGF0YSBub29wCisgIGFsaWFzIGNsZWFuX2Rpcl9jb25mIG5vb3AKKyAgYWxpYXMgY2xlYW5fZGlyX21hbiBub29wCisKKyAgZGVmIGNsZWFuX2Rpcl9leHQocmVsKQorICAgIHJldHVybiB1bmxlc3MgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQorICAgIG1ha2UgJ2NsZWFuJyBpZiBGaWxlLmZpbGU/KCdNYWtlZmlsZScpCisgIGVuZAorCisgICMKKyAgIyBUQVNLIGRpc3RjbGVhbgorICAjCisKKyAgZGVmIGV4ZWNfZGlzdGNsZWFuCisgICAgZXhlY190YXNrX3RyYXZlcnNlICdkaXN0Y2xlYW4nCisgICAgcm1fZiBAY29uZmlnLnNhdmVmaWxlCisgICAgcm1fZiAnSW5zdGFsbGVkRmlsZXMnCisgIGVuZAorCisgIGFsaWFzIGRpc3RjbGVhbl9kaXJfYmluIG5vb3AKKyAgYWxpYXMgZGlzdGNsZWFuX2Rpcl9saWIgbm9vcAorCisgIGRlZiBkaXN0Y2xlYW5fZGlyX2V4dChyZWwpCisgICAgcmV0dXJuIHVubGVzcyBleHRkaXI/KGN1cnJfc3JjZGlyKCkpCisgICAgbWFrZSAnZGlzdGNsZWFuJyBpZiBGaWxlLmZpbGU/KCdNYWtlZmlsZScpCisgIGVuZAorCisgIGFsaWFzIGRpc3RjbGVhbl9kaXJfZGF0YSBub29wCisgIGFsaWFzIGRpc3RjbGVhbl9kaXJfY29uZiBub29wCisgIGFsaWFzIGRpc3RjbGVhbl9kaXJfbWFuIG5vb3AKKworICAjCisgICMgVHJhdmVyc2luZworICAjCisKKyAgZGVmIGV4ZWNfdGFza190cmF2ZXJzZSh0YXNrKQorICAgIHJ1bl9ob29rICJwcmUtI3t0YXNrfSIKKyAgICBGSUxFVFlQRVMuZWFjaCBkbyB8dHlwZXwKKyAgICAgIGlmIHR5cGUgPT0gJ2V4dCcgYW5kIGNvbmZpZygnd2l0aG91dC1leHQnKSA9PSAneWVzJworICAgICAgICAkc3RkZXJyLnB1dHMgJ3NraXBwaW5nIGV4dC8qIGJ5IHVzZXIgb3B0aW9uJyBpZiB2ZXJib3NlPworICAgICAgICBuZXh0CisgICAgICBlbmQKKyAgICAgIHRyYXZlcnNlIHRhc2ssIHR5cGUsICIje3Rhc2t9X2Rpcl8je3R5cGV9IgorICAgIGVuZAorICAgIHJ1bl9ob29rICJwb3N0LSN7dGFza30iCisgIGVuZAorCisgIGRlZiB0cmF2ZXJzZSh0YXNrLCByZWwsIG1pZCkKKyAgICBkaXZlX2ludG8ocmVsKSB7CisgICAgICBydW5faG9vayAicHJlLSN7dGFza30iCisgICAgICBfX3NlbmRfXyBtaWQsIHJlbC5zdWIoJXJbXEEuKj8oPzovfFx6KV0sICcnKQorICAgICAgZGlyZWN0b3JpZXNfb2YoY3Vycl9zcmNkaXIoKSkuZWFjaCBkbyB8ZHwKKyAgICAgICAgdHJhdmVyc2UgdGFzaywgIiN7cmVsfS8je2R9IiwgbWlkCisgICAgICBlbmQKKyAgICAgIHJ1bl9ob29rICJwb3N0LSN7dGFza30iCisgICAgfQorICBlbmQKKworICBkZWYgZGl2ZV9pbnRvKHJlbCkKKyAgICByZXR1cm4gdW5sZXNzIEZpbGUuZGlyPygiI3tAc3JjZGlyfS8je3JlbH0iKQorCisgICAgZGlyID0gRmlsZS5iYXNlbmFtZShyZWwpCisgICAgRGlyLm1rZGlyIGRpciB1bmxlc3MgRmlsZS5kaXI/KGRpcikKKyAgICBwcmV2ZGlyID0gRGlyLnB3ZAorICAgIERpci5jaGRpciBkaXIKKyAgICAkc3RkZXJyLnB1dHMgJy0tLT4gJyArIHJlbCBpZiB2ZXJib3NlPworICAgIEBjdXJyZGlyID0gcmVsCisgICAgeWllbGQKKyAgICBEaXIuY2hkaXIgcHJldmRpcgorICAgICRzdGRlcnIucHV0cyAnPC0tLSAnICsgcmVsIGlmIHZlcmJvc2U/CisgICAgQGN1cnJkaXIgPSBGaWxlLmRpcm5hbWUocmVsKQorICBlbmQKKworICBkZWYgcnVuX2hvb2soaWQpCisgICAgcGF0aCA9IFsgIiN7Y3Vycl9zcmNkaXIoKX0vI3tpZH0iLAorICAgICAgICAgICAgICIje2N1cnJfc3JjZGlyKCl9LyN7aWR9LnJiIiBdLmRldGVjdCB7fGNhbmR8IEZpbGUuZmlsZT8oY2FuZCkgfQorICAgIHJldHVybiB1bmxlc3MgcGF0aAorICAgIGJlZ2luCisgICAgICBpbnN0YW5jZV9ldmFsIEZpbGUucmVhZChwYXRoKSwgcGF0aCwgMQorICAgIHJlc2N1ZQorICAgICAgcmFpc2UgaWYgJERFQlVHCisgICAgICBzZXR1cF9yYl9lcnJvciAiaG9vayAje3BhdGh9IGZhaWxlZDpcbiIgKyAkIS5tZXNzYWdlCisgICAgZW5kCisgIGVuZAorCitlbmQgICAjIGNsYXNzIEluc3RhbGxlcgorCisKK2NsYXNzIFNldHVwRXJyb3IgPCBTdGFuZGFyZEVycm9yOyBlbmQKKworZGVmIHNldHVwX3JiX2Vycm9yKG1zZykKKyAgcmFpc2UgU2V0dXBFcnJvciwgbXNnCitlbmQKKworaWYgJDAgPT0gX19GSUxFX18KKyAgYmVnaW4KKyAgICBUb3BsZXZlbEluc3RhbGxlci5pbnZva2UKKyAgcmVzY3VlIFNldHVwRXJyb3IKKyAgICByYWlzZSBpZiAkREVCVUcKKyAgICAkc3RkZXJyLnB1dHMgJCEubWVzc2FnZQorICAgICRzdGRlcnIucHV0cyAiVHJ5ICdydWJ5ICN7JDB9IC0taGVscCcgZm9yIGRldGFpbGVkIHVzYWdlLiIKKyAgICBleGl0IDEKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3J1bl90ZXN0cy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3J1bl90ZXN0cy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2EyNDFhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvcnVuX3Rlc3RzLnJiCkBAIC0wLDAgKzEsNDYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworJDoudW5zaGlmdCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi9saWInCityZXF1aXJlICdrcmFtZG93bicKK3JlcXVpcmUgJ3Rlc3QvdW5pdC9hc3NlcnRpb25zJworcmVxdWlyZSAneWFtbCcKKworaW5jbHVkZSBUZXN0OjpVbml0OjpBc3NlcnRpb25zCisKK2FyZyA9IEFSR1ZbMF0gfHwgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICd0ZXN0Y2FzZXMnKQorCithcmcgPSBpZiBGaWxlLmRpcmVjdG9yeT8oYXJnKQorICAgICAgICBGaWxlLmpvaW4oYXJnLCAnKiovKi50ZXh0JykKKyAgICAgIGVsc2UKKyAgICAgICAgYXJnICsgJy50ZXh0JworICAgICAgZW5kCisKK3dpZHRoID0gKChzaXplID0gJXh7c3R0eSBzaXplIDI+L2Rldi9udWxsfSkubGVuZ3RoID4gMCA/IHNpemUuc3BsaXQubGFzdC50b19pIDogNzIpIHJlc2N1ZSA3Mgord2lkdGggLT0gOAorZndpZHRoID0gMAorRGlyW2FyZ10uZWFjaCB7fGZ8IGZ3aWR0aCA9IFtmd2lkdGgsIGYubGVuZ3RoICsgMTBdLm1heCB9LmVhY2ggZG8gfGZpbGV8CisgIHByaW50KCgnVGVzdGluZyAnICsgZmlsZSArICcgJykubGp1c3QoW2Z3aWR0aCwgd2lkdGhdLm1pbikpCisgICRzdGRvdXQuZmx1c2gKKworICBodG1sX2ZpbGUgPSBmaWxlLnN1YignLnRleHQnLCAnLmh0bWwnKQorICBvcHRzX2ZpbGUgPSBmaWxlLnN1YignLnRleHQnLCAnLm9wdGlvbnMnKQorICBvcHRzX2ZpbGUgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKGZpbGUpLCAnb3B0aW9ucycpIGlmICFGaWxlLmV4aXN0PyhvcHRzX2ZpbGUpCisgIG9wdGlvbnMgPSBGaWxlLmV4aXN0PyhvcHRzX2ZpbGUpID8gWUFNTDo6bG9hZChGaWxlLnJlYWQob3B0c19maWxlKSkgOiB7OmF1dG9faWRzID0+IGZhbHNlLCA6Zm9vdG5vdGVfbnIgPT4gMX0KKyAgZG9jID0gS3JhbWRvd246OkRvY3VtZW50Lm5ldyhGaWxlLnJlYWQoZmlsZSksIG9wdGlvbnMpCisgIGJlZ2luCisgICAgYXNzZXJ0X2VxdWFsKEZpbGUucmVhZChodG1sX2ZpbGUpLCBkb2MudG9faHRtbCkKKyAgICBwdXRzICdQQVNTRUQnCisgIHJlc2N1ZSBFeGNlcHRpb24gPT4gZQorICAgIHB1dHMgJyAgRkFJTEVEJworICAgIHB1dHMgJCEubWVzc2FnZSBpZiAkVkVSQk9TRQorICAgIHB1dHMgJCEuYmFja3RyYWNlIGlmICRERUJVRworICBlbmQKKyAgcHV0cyAiV2FybmluZ3M6XG4iICsgZG9jLndhcm5pbmdzLmpvaW4oIlxuIikgaWYgIWRvYy53YXJuaW5ncy5lbXB0eT8gJiYgJFZFUkJPU0UKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdF9maWxlcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RfZmlsZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5ZWQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RfZmlsZXMucmIKQEAgLTAsMCArMSw0MTYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworcmVxdWlyZSAnbWluaXRlc3QvYXV0b3J1bicKK3JlcXVpcmUgJ2tyYW1kb3duJworcmVxdWlyZSAneWFtbCcKK3JlcXVpcmUgJ3RtcGRpcicKKworYmVnaW4KKyAgcmVxdWlyZSAna3JhbWRvd24vY29udmVydGVyL3N5bnRheF9oaWdobGlnaHRlci9yb3VnZScKKworICBjbGFzcyBLcmFtZG93bjo6Q29udmVydGVyOjpTeW50YXhIaWdobGlnaHRlcjo6Um91Z2U6OkZPUk1BVFRFUl9DTEFTUworICAgIGRlZiBmb3JtYXQodG9rZW5zLCAmYikKKyAgICAgIHN1cGVyLnN1YigvPFwvY29kZT48XC9wcmU+XG4/LywgIjwvY29kZT48L3ByZT5cbiIpCisgICAgZW5kCisgIGVuZAorCisgICMgY3VzdG9tIGZvcm1hdHRlciBmb3IgdGVzdHMKKyAgY2xhc3MgUm91Z2VIVE1MRm9ybWF0dGVycyA8IEtyYW1kb3duOjpDb252ZXJ0ZXI6OlN5bnRheEhpZ2hsaWdodGVyOjpSb3VnZTo6Rk9STUFUVEVSX0NMQVNTCisgICAgdGFnICdyb3VnZV9odG1sX2Zvcm1hdHRlcnMnCisKKyAgICBkZWYgc3RyZWFtKHRva2VucywgJmIpCisgICAgICB5aWVsZCAlKDxkaXYgY2xhc3M9ImN1c3RvbS1jbGFzcyI+KQorICAgICAgc3VwZXIKKyAgICAgIHlpZWxkICUoPC9kaXY+KQorICAgIGVuZAorICBlbmQKK3Jlc2N1ZSBMb2FkRXJyb3IsIFN5bnRheEVycm9yLCBOYW1lRXJyb3IKK2VuZAorCitFbmNvZGluZy5kZWZhdWx0X2V4dGVybmFsID0gJ3V0Zi04JyBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKworY2xhc3MgVGVzdEZpbGVzIDwgTWluaXRlc3Q6OlRlc3QKKworICBFWENMVURFX0tEX0ZJTEVTID0gWygndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZHMudGV4dCcgaWYgUlVCWV9WRVJTSU9OIDw9ICcxLjguNicpLCAjIGJjIG9mIGRlcCBzdHJpbmdleCBub3Qgd29ya2luZworICAgICAgICAgICAgICAgICAgICAgICgndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9yb3VnZS8nIGlmIFJVQllfVkVSU0lPTiA8ICcyLjAnKSwgI2JjIG9mIHJvdWdlCisgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvJyBpZiBSVUJZX1ZFUlNJT04gPCAnMi4wJyksICNiYyBvZiByb3VnZQorICAgICAgICAgICAgICAgICAgICAgICgndGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9pdGV4Mm1tbC50ZXh0JyBpZiBSVUJZX1BMQVRGT1JNID09ICdqYXZhJyksICMgYmMgb2YgaXRleHRvbW1sCisgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvaXRleDJtbWwudGV4dCcgaWYgUlVCWV9QTEFURk9STSA9PSAnamF2YScpLCAjIGJjIG9mIGl0ZXh0b21tbAorICAgICAgICAgICAgICAgICAgICAgXS5jb21wYWN0CisKKyAgIyBHZW5lcmF0ZSB0ZXN0IG1ldGhvZHMgZm9yIGtyYW1kb3duLXRvLXh4eCBjb252ZXJzaW9uCisgIERpcltGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy90ZXN0Y2FzZXMvKiovKi50ZXh0J10uZWFjaCBkbyB8dGV4dF9maWxlfAorICAgIG5leHQgaWYgRVhDTFVERV9LRF9GSUxFUy5hbnk/IHt8ZnwgdGV4dF9maWxlID1+IC8je2Z9L30KKyAgICBiYXNlbmFtZSA9IHRleHRfZmlsZS5zdWIoL1wudGV4dCQvLCAnJykKKyAgICBvcHRzX2ZpbGUgPSB0ZXh0X2ZpbGUuc3ViKC9cLnRleHQkLywgJy5vcHRpb25zJykKKyAgICAoRGlyW2Jhc2VuYW1lICsgIi4qIl0gLSBbdGV4dF9maWxlLCBvcHRzX2ZpbGVdKS5lYWNoIGRvIHxvdXRwdXRfZmlsZXwKKyAgICAgIG5leHQgaWYgKFJVQllfVkVSU0lPTiA+PSAnMS45JyAmJiBGaWxlLmV4aXN0PyhvdXRwdXRfZmlsZSArICcuMTknKSkgfHwKKyAgICAgICAgKFJVQllfVkVSU0lPTiA8ICcxLjknICYmIG91dHB1dF9maWxlID1+IC9cLjE5JC8pCisgICAgICBvdXRwdXRfZm9ybWF0ID0gRmlsZS5leHRuYW1lKG91dHB1dF9maWxlLnN1YigvXC4xOSQvLCAnJykpWzEuLi0xXQorICAgICAgbmV4dCBpZiAhS3JhbWRvd246OkNvbnZlcnRlci5jb25zdF9kZWZpbmVkPyhvdXRwdXRfZm9ybWF0WzAuLjBdLnVwY2FzZSArIG91dHB1dF9mb3JtYXRbMS4uLTFdKQorICAgICAgZGVmaW5lX21ldGhvZCgndGVzdF8nICsgdGV4dF9maWxlLnRyKCcuJywgJ18nKSArICJfdG9fI3tvdXRwdXRfZm9ybWF0fSIpIGRvCisgICAgICAgIG9wdHNfZmlsZSA9IEZpbGUuam9pbihGaWxlLmRpcm5hbWUodGV4dF9maWxlKSwgJ29wdGlvbnMnKSBpZiAhRmlsZS5leGlzdD8ob3B0c19maWxlKQorICAgICAgICBvcHRpb25zID0gRmlsZS5leGlzdD8ob3B0c19maWxlKSA/IFlBTUw6OmxvYWQoRmlsZS5yZWFkKG9wdHNfZmlsZSkpIDogezphdXRvX2lkcyA9PiBmYWxzZSwgOmZvb3Rub3RlX25yID0+IDF9CisgICAgICAgIGRvYyA9IEtyYW1kb3duOjpEb2N1bWVudC5uZXcoRmlsZS5yZWFkKHRleHRfZmlsZSksIG9wdGlvbnMpCisgICAgICAgIGFzc2VydF9lcXVhbChGaWxlLnJlYWQob3V0cHV0X2ZpbGUpLCBkb2Muc2VuZCgidG9fI3tvdXRwdXRfZm9ybWF0fSIpKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgICMgR2VuZXJhdGUgdGVzdCBtZXRob2RzIGZvciBodG1sLXRvLXtodG1sLGtyYW1kb3dufSBjb252ZXJzaW9uCisgIGB0aWR5IC12IDI+JjFgCisgIGlmICQ/LmV4aXRzdGF0dXMgIT0gMAorICAgIHdhcm4oIlNraXBwaW5nIGh0bWwtdG8te2h0bWwsa3JhbWRvd259IHRlc3RzIGJlY2F1c2UgdGlkeSBleGVjdXRhYmxlIGlzIG1pc3NpbmciKQorICBlbHNlCisgICAgRVhDTFVERV9IVE1MX0ZJTEVTID0gWyd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2hpdGVzcGFjZS5odG1sJywgIyBiYyBvZiBzcGFuIGluc2lkZSBwcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvc2ltcGxlLmh0bWwnLCAjIGJjIG9mIHhtbCBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9oaWdobGlnaHRpbmcuaHRtbCcsICMgYmMgb2Ygc3BhbiBlbGVtZW50cyBpbnNpZGUgY29kZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkcy5odG1sJywgIyBiYyBvZiBhdXRvX2lkcz10cnVlIG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2hlYWRlcl90eXBlX29mZnNldC5odG1sJywgIyBiYyBvZiBoZWFkZXJfb2Zmc2V0IG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL3NpbXBsZS5odG1sJywgIyBiYyBvZiBkb3VibGUgc3Vycm91bmRpbmcgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9tdWx0aXBsZS5odG1sJywgIyBiYyBvZiBkb3VibGUgc3Vycm91bmRpbmcgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL3JvdWdlL3NpbXBsZS5odG1sJyBpZiBSVUJZX1ZFUlNJT04gPCAnMi4wJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9yb3VnZS9kaXNhYmxlZC5odG1sJyBpZiBSVUJZX1ZFUlNJT04gPCAnMi4wJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL3JpdGV4Lmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9yaXRleC5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL2l0ZXgybW1sLmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9pdGV4Mm1tbC5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlLmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfbm90ZXhoaW50cy5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlX3NlbWFudGljcy5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvbWF0aGpheG5vZGUuaHRtbCcsICMgYmMgb2YgdGlkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXcuaHRtbCcsICMgYmMgb2YgbWF0aGpheCBwcmV2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlld19zaW1wbGUuaHRtbCcsICMgYmMgb2YgbWF0aGpheCBwcmV2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlld19hc19jb2RlLmh0bWwnLCAjIGJjIG9mIG1hdGhqYXggcHJldmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL21hcmtfZWxlbWVudC5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3htbC5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwveG1sLmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbXBhY3QKKyAgICBFWENMVURFX0hUTUxfVEVYVF9GSUxFUyA9IFsndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19zcGFuLmh0bWxpbnB1dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYXNfcmF3Lmh0bWxpbnB1dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbXBhY3QKKyAgICBEaXJbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVzdGNhc2VzLyoqLyoue2h0bWwsaHRtbC4xOSxodG1saW5wdXQsaHRtbGlucHV0LjE5fSddLmVhY2ggZG8gfGh0bWxfZmlsZXwKKyAgICAgIG5leHQgaWYgRVhDTFVERV9IVE1MX0ZJTEVTLmFueT8ge3xmfCBodG1sX2ZpbGUgPX4gLyN7Zn0oXC4xOSk/JC99CisgICAgICBuZXh0IGlmIChSVUJZX1ZFUlNJT04gPj0gJzEuOScgJiYgRmlsZS5leGlzdD8oaHRtbF9maWxlICsgJy4xOScpKSB8fAorICAgICAgICAoUlVCWV9WRVJTSU9OIDwgJzEuOScgJiYgaHRtbF9maWxlID1+IC9cLjE5JC8pCisKKyAgICAgIG91dF9maWxlcyA9IFtdCisgICAgICBvdXRfZmlsZXMgPDwgWyhodG1sX2ZpbGUgPX4gL1wuaHRtbGlucHV0KFwuMTkpPyQvID8gaHRtbF9maWxlLnN1YigvaW5wdXQoXC4xOSk/JC8sICcnKSA6IGh0bWxfZmlsZSksIDp0b19odG1sXQorICAgICAgaWYgaHRtbF9maWxlID1+IC9cLmh0bWxpbnB1dChcLjE5KT8kLyAmJiAhRVhDTFVERV9IVE1MX1RFWFRfRklMRVMuYW55PyB7fGZ8IGh0bWxfZmlsZSA9fiAvI3tmfS99CisgICAgICAgIG91dF9maWxlcyA8PCBbaHRtbF9maWxlLnN1YigvaHRtbGlucHV0KFwuMTkpPyQvLCAndGV4dCcpLCA6dG9fa3JhbWRvd25dCisgICAgICBlbmQKKyAgICAgIG91dF9maWxlcy5zZWxlY3Qge3xmLCBffCBGaWxlLmV4aXN0PyhmKX0uZWFjaCBkbyB8b3V0X2ZpbGUsIG91dF9tZXRob2R8CisgICAgICAgIGRlZmluZV9tZXRob2QoJ3Rlc3RfJyArIGh0bWxfZmlsZS50cignLicsICdfJykgKyAiX3RvXyN7RmlsZS5leHRuYW1lKG91dF9maWxlKX0iKSBkbworICAgICAgICAgIG9wdHNfZmlsZSA9IGh0bWxfZmlsZS5zdWIoL1wuaHRtbChpbnB1dCk/KFwuMTkpPyQvLCAnLm9wdGlvbnMnKQorICAgICAgICAgIG9wdHNfZmlsZSA9IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoaHRtbF9maWxlKSwgJ29wdGlvbnMnKSBpZiAhRmlsZS5leGlzdD8ob3B0c19maWxlKQorICAgICAgICAgIG9wdGlvbnMgPSBGaWxlLmV4aXN0PyhvcHRzX2ZpbGUpID8gWUFNTDo6bG9hZChGaWxlLnJlYWQob3B0c19maWxlKSkgOiB7OmF1dG9faWRzID0+IGZhbHNlLCA6Zm9vdG5vdGVfbnIgPT4gMX0KKyAgICAgICAgICBkb2MgPSBLcmFtZG93bjo6RG9jdW1lbnQubmV3KEZpbGUucmVhZChodG1sX2ZpbGUpLCBvcHRpb25zLm1lcmdlKDppbnB1dCA9PiAnaHRtbCcpKQorICAgICAgICAgIGlmIG91dF9tZXRob2QgPT0gOnRvX2h0bWwKKyAgICAgICAgICAgIGFzc2VydF9lcXVhbCh0aWR5X291dHB1dChGaWxlLnJlYWQob3V0X2ZpbGUpKSwgdGlkeV9vdXRwdXQoZG9jLnNlbmQob3V0X21ldGhvZCkpKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydF9lcXVhbChGaWxlLnJlYWQob3V0X2ZpbGUpLCBkb2Muc2VuZChvdXRfbWV0aG9kKSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRpZHlfb3V0cHV0KG91dCkKKyAgICBjbWQgPSAidGlkeSAtcSAtLWRvY3R5cGUgb21pdCAje1JVQllfVkVSU0lPTiA+PSAnMS45JyA/ICctdXRmOCcgOiAnLXJhdyd9IDI+L2Rldi9udWxsIgorICAgIHJlc3VsdCA9IElPLnBvcGVuKGNtZCwgJ3IrJykgZG8gfGlvfAorICAgICAgaW8ud3JpdGUob3V0KQorICAgICAgaW8uY2xvc2Vfd3JpdGUKKyAgICAgIGlvLnJlYWQKKyAgICBlbmQKKyAgICBpZiAkPy5leGl0c3RhdHVzID09IDIKKyAgICAgIHJhaXNlICJQcm9ibGVtIHVzaW5nIHRpZHkiCisgICAgZW5kCisgICAgcmVzdWx0CisgIGVuZAorCisgICMgR2VuZXJhdGUgdGVzdCBtZXRob2RzIGZvciB0ZXh0LXRvLWxhdGV4IGNvbnZlcnNpb24gYW5kIGNvbXBpbGF0aW9uCisgIGBsYXRleCAtdiAyPiYxYAorICBpZiAkPy5leGl0c3RhdHVzICE9IDAKKyAgICB3YXJuKCJTa2lwcGluZyBsYXRleCBjb21waWxhdGlvbiB0ZXN0cyBiZWNhdXNlIGxhdGV4IGV4ZWN1dGFibGUgaXMgbWlzc2luZyIpCisgIGVsc2UKKyAgICBFWENMVURFX0xBVEVYX0ZJTEVTID0gWyd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW1hZ2VfaW5fYS50ZXh0JywgIyBiYyBvZiBpbWFnZSBsaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2ltYWdlbGlua3MudGV4dCcsICMgYmMgb2YgaW1hZ2UgbGlua3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvZW1wdHlfdGl0bGUudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9tYXJrZXJzLnRleHQnLCAjIGJjIG9mIGZvb3Rub3RlIGluIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrX25hbWVfd2l0aF9kYXNoLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrX2FueV9jaGFyLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbXBhY3QKKyAgICBEaXJbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVzdGNhc2VzLyoqLyoudGV4dCddLmVhY2ggZG8gfHRleHRfZmlsZXwKKyAgICAgIG5leHQgaWYgRVhDTFVERV9MQVRFWF9GSUxFUy5hbnk/IHt8ZnwgdGV4dF9maWxlID1+IC8je2Z9JC99CisgICAgICBkZWZpbmVfbWV0aG9kKCd0ZXN0XycgKyB0ZXh0X2ZpbGUudHIoJy4nLCAnXycpICsgIl90b19sYXRleF9jb21waWxhdGlvbiIpIGRvCisgICAgICAgIGxhdGV4ID0gIEtyYW1kb3duOjpEb2N1bWVudC5uZXcoRmlsZS5yZWFkKHRleHRfZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmF1dG9faWRzID0+IGZhbHNlLCA6Zm9vdG5vdGVfbnIgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dGVtcGxhdGUgPT4gJ2RvY3VtZW50JykudG9fbGF0ZXgKKyAgICAgICAgRGlyLm1rdG1wZGlyIGRvIHx0bXBkaXJ8CisgICAgICAgICAgcmVzdWx0ID0gSU8ucG9wZW4oImxhdGV4IC1vdXRwdXQtZGlyZWN0b3J5PScje3RtcGRpcn0nIDI+L2Rldi9udWxsIiwgJ3IrJykgZG8gfGlvfAorICAgICAgICAgICAgaW8ud3JpdGUobGF0ZXgpCisgICAgICAgICAgICBpby5jbG9zZV93cml0ZQorICAgICAgICAgICAgaW8ucmVhZAorICAgICAgICAgIGVuZAorICAgICAgICAgIGFzc2VydCgkPy5leGl0c3RhdHVzID09IDAsIHJlc3VsdC5zY2FuKC9eISguKlxuLiopLykuam9pbigiXG4iKSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBHZW5lcmF0ZSB0ZXN0IG1ldGhvZHMgZm9yIHRleHQtPmtyYW1kb3duLT5odG1sIGNvbnZlcnNpb24KKyAgYHRpZHkgLXYgMj4mMWAKKyAgaWYgJD8uZXhpdHN0YXR1cyAhPSAwCisgICAgd2FybigiU2tpcHBpbmcgdGV4dC0+a3JhbWRvd24tPmh0bWwgdGVzdHMgYmVjYXVzZSB0aWR5IGV4ZWN1dGFibGUgaXMgbWlzc2luZyIpCisgIGVsc2UKKyAgICBFWENMVURFX1RFWFRfRklMRVMgPSBbJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9tYXJrZG93bl9hdHRyLnRleHQnLCAgIyBiYyBvZiBtYXJrZG93biBhdHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL21hcmtkb3duX2F0dHIudGV4dCcsICMgYmMgb2YgbWFya2Rvd24gYXR0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vb3B0aW9ucy50ZXh0JywgICAgICAjIGJjIG9mIHBhcnNlX3NwYW5faHRtbCBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9vcHRpb25zLnRleHQnLCAgIyBiYyBvZiBvcHRpb25zIG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMzLnRleHQnLCAjIGJjIG9mIG9wdGlvbnMgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvdGFibGVzLnRleHQnLCAgIyBiYyBvZiBwYXJzZV9ibG9ja19odG1sIG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9oZWFkZXIudGV4dCcsICMgYmMgb2YgYXV0b19pZHMgb3B0aW9uIHRoYXQgaW50ZXJmZXJlcworICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS90YWJsZV9zaW1wbGUudGV4dCcsICMgYmMgb2YgdHIgc3R5bGUgYXR0ciBnZXR0aW5nIHJlbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvc2ltcGxlLnRleHQnLCAgICAgICAgIyBiYyBvZiB3ZWJnZW46YmxvY2sgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzExX2lhbC9zaW1wbGUudGV4dCcsICAgICAgICAgIyBiYyBvZiBjaGFuZ2Ugb2Ygb3JkZXJpbmcgb2YgYXR0cmlidXRlcyBpbiBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL2NvbW1lbnQudGV4dCcsICAgICAgIyBiYyBvZiBjb21tZW50IHRleHQgbW9kaWZpY2F0aW9ucyAoY2FuIHRoaXMgYmUgYXZvaWRlZD8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvaGVhZGVyX3R5cGVfb2Zmc2V0LnRleHQnLCAjIGJjIG9mIGhlYWRlcl9vZmZzZXQgYmVpbmcgYXBwbGllZCB0d2ljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRzLnRleHQnIGlmIFJVQllfVkVSU0lPTiA8PSAnMS44LjYnKSwgIyBiYyBvZiBkZXAgc3RyaW5nZXggbm90IHdvcmtpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL3JvdWdlL3NpbXBsZS50ZXh0JyBpZiBSVUJZX1ZFUlNJT04gPCAnMi4wJyksICNiYyBvZiByb3VnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2UvZGlzYWJsZWQudGV4dCcgaWYgUlVCWV9WRVJTSU9OIDwgJzIuMCcpLCAjYmMgb2Ygcm91Z2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9zaW1wbGUudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvbXVsdGlwbGUudGV4dCcsICMgY2hlY2ssIHdoYXQgZG9jdW1lbnQgY29udGFpbiBtb3JlLCB0aGFuIG9uZSBjb2RlIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL3JpdGV4LnRleHQnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9yaXRleC50ZXh0JywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL2l0ZXgybW1sLnRleHQnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9pdGV4Mm1tbC50ZXh0JywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlLnRleHQnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfbm90ZXhoaW50cy50ZXh0JywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlX3NlbWFudGljcy50ZXh0JywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvbWF0aGpheG5vZGUudGV4dCcsICMgYmMgb2YgdGlkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2xpbmtfZGVmc193aXRoX2lhbC50ZXh0JywgIyBiYyBvZiBhdHRyaWJ1dGUgb3JkZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9tYXJrX2VsZW1lbnQudGV4dCcsICMgYmMgb2YgdGlkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC94bWwudGV4dCcsICMgYmMgb2YgdGlkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL3htbC50ZXh0JywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgXS5jb21wYWN0CisgICAgRGlyW0ZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3Rlc3RjYXNlcy8qKi8qLnRleHQnXS5lYWNoIGRvIHx0ZXh0X2ZpbGV8CisgICAgICBuZXh0IGlmIEVYQ0xVREVfVEVYVF9GSUxFUy5hbnk/IHt8ZnwgdGV4dF9maWxlID1+IC8je2Z9JC99CisgICAgICBodG1sX2ZpbGUgPSB0ZXh0X2ZpbGUuc3ViKC9cLnRleHQkLywgJy5odG1sJykKKyAgICAgIGh0bWxfZmlsZSArPSAnLjE5JyBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScgJiYgRmlsZS5leGlzdD8oaHRtbF9maWxlICsgJy4xOScpCisgICAgICBuZXh0IHVubGVzcyBGaWxlLmV4aXN0PyhodG1sX2ZpbGUpCisgICAgICBkZWZpbmVfbWV0aG9kKCd0ZXN0XycgKyB0ZXh0X2ZpbGUudHIoJy4nLCAnXycpICsgIl90b19rcmFtZG93bl90b19odG1sIikgZG8KKyAgICAgICAgb3B0c19maWxlID0gdGV4dF9maWxlLnN1YigvXC50ZXh0JC8sICcub3B0aW9ucycpCisgICAgICAgIG9wdHNfZmlsZSA9IEZpbGUuam9pbihGaWxlLmRpcm5hbWUodGV4dF9maWxlKSwgJ29wdGlvbnMnKSBpZiAhRmlsZS5leGlzdD8ob3B0c19maWxlKQorICAgICAgICBvcHRpb25zID0gRmlsZS5leGlzdD8ob3B0c19maWxlKSA/IFlBTUw6OmxvYWQoRmlsZS5yZWFkKG9wdHNfZmlsZSkpIDogezphdXRvX2lkcyA9PiBmYWxzZSwgOmZvb3Rub3RlX25yID0+IDF9CisgICAgICAgIGtkdGV4dCA9IEtyYW1kb3duOjpEb2N1bWVudC5uZXcoRmlsZS5yZWFkKHRleHRfZmlsZSksIG9wdGlvbnMpLnRvX2tyYW1kb3duCisgICAgICAgIGh0bWwgPSBLcmFtZG93bjo6RG9jdW1lbnQubmV3KGtkdGV4dCwgb3B0aW9ucykudG9faHRtbAorICAgICAgICBhc3NlcnRfZXF1YWwodGlkeV9vdXRwdXQoRmlsZS5yZWFkKGh0bWxfZmlsZSkpLCB0aWR5X291dHB1dChodG1sKSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICAjIEdlbmVyYXRlIHRlc3QgbWV0aG9kcyBmb3IgaHRtbC10by1rcmFtZG93bi10by1odG1sIGNvbnZlcnNpb24KKyAgYHRpZHkgLXYgMj4mMWAKKyAgaWYgJD8uZXhpdHN0YXR1cyAhPSAwCisgICAgd2FybigiU2tpcHBpbmcgaHRtbC10by1rcmFtZG93bi10by1odG1sIHRlc3RzIGJlY2F1c2UgdGlkeSBleGVjdXRhYmxlIGlzIG1pc3NpbmciKQorICBlbHNlCisgICAgRVhDTFVERV9IVE1MX0tEX0ZJTEVTID0gWyd0ZXN0L3Rlc3RjYXNlcy9zcGFuL2V4dGVuc2lvbi9vcHRpb25zLmh0bWwnLCAgICAgICAgIyBiYyBvZiBwYXJzZV9zcGFuX2h0bWwgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbm9ybWFsLmh0bWwnLCAgICAgICAgICAgIyBiYyBvZiBiciB0YWcgYmVmb3JlIGNsb3NpbmcgcCB0YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9ub21hcmtkb3duLmh0bWwnLCAjIGJjIG9mIG5vbWFya2Rvd24gZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3NpbXBsZS5odG1sJywgICAgICAgICAgIyBiYyBvZiB3ZWJnZW46YmxvY2sgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvbWFya2Rvd25fYXR0ci5odG1sJywgICAjIGJjIG9mIG1hcmtkb3duIGF0dHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvdGFibGVfc2ltcGxlLmh0bWwnLCAjIGJjIG9mIGludmFsaWRseSBjb252ZXJ0ZWQgc2ltcGxlIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2hpdGVzcGFjZS5odG1sJywgIyBiYyBvZiBlbnRpdHkgdG8gY2hhciBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2Uvc2ltcGxlLmh0bWwnLCAjIGJjIG9mIGRvdWJsZSBzdXJyb3VuZGluZyA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL211bHRpcGxlLmh0bWwnLCAjIGJjIG9mIGRvdWJsZSBzdXJyb3VuZGluZyA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMTFfaWFsL3NpbXBsZS5odG1sJywgICAgICAgICAgICMgYmMgb2YgY2hhbmdlIG9mIG9yZGVyaW5nIG9mIGF0dHJpYnV0ZXMgaW4gaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2hpZ2hsaWdodGluZy5odG1sJywgIyBiYyBvZiBzcGFuIGVsZW1lbnRzIGluc2lkZSBjb2RlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRzLmh0bWwnLCAjIGJjIG9mIGF1dG9faWRzPXRydWUgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvaGVhZGVyX3R5cGVfb2Zmc2V0Lmh0bWwnLCAjIGJjIG9mIGhlYWRlcl9vZmZzZXQgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX2V4Y2x1ZGUuaHRtbCcsICAgICAgIyBiYyBvZiBkaWZmZXJlbnQgYXR0cmlidXRlIG9yZGVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuL2F1dG9saW5rcy91cmxfbGlua3MuaHRtbCcsICAgICAgIyBiYyBvZiBxdW90IGVudGl0eSBiZWluZyBjb252ZXJ0ZWQgdG8gY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2Uvc2ltcGxlLmh0bWwnIGlmIFJVQllfVkVSU0lPTiA8ICcyLjAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL3JvdWdlL2Rpc2FibGVkLmh0bWwnIGlmIFJVQllfVkVSU0lPTiA8ICcyLjAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvcml0ZXguaHRtbCcsICMgYmMgb2YgdGlkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL3JpdGV4Lmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvaXRleDJtbWwuaHRtbCcsICMgYmMgb2YgdGlkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL2l0ZXgybW1sLmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGUuaHRtbCcsICMgYmMgb2YgdGlkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZV9ub3RleGhpbnRzLmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfc2VtYW50aWNzLmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9tYXRoamF4bm9kZS5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlldy5odG1sJywgIyBiYyBvZiBtYXRoamF4IHByZXZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3X3NpbXBsZS5odG1sJywgIyBiYyBvZiBtYXRoamF4IHByZXZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3X2FzX2NvZGUuaHRtbCcsICMgYmMgb2YgbWF0aGpheCBwcmV2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvbGlua19kZWZzX3dpdGhfaWFsLmh0bWwnLCAjIGJjIG9mIGF0dHJpYnV0ZSBvcmRlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL21hcmtfZWxlbWVudC5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3htbC5odG1sJywgIyBiYyBvZiB0aWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwveG1sLmh0bWwnLCAjIGJjIG9mIHRpZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbXBhY3QKKyAgICBEaXJbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVzdGNhc2VzLyoqLyoue2h0bWwsaHRtbC4xOX0nXS5lYWNoIGRvIHxodG1sX2ZpbGV8CisgICAgICBuZXh0IGlmIEVYQ0xVREVfSFRNTF9LRF9GSUxFUy5hbnk/IHt8ZnwgaHRtbF9maWxlID1+IC8je2Z9KFwuMTkpPyQvfQorICAgICAgbmV4dCBpZiAoUlVCWV9WRVJTSU9OID49ICcxLjknICYmIEZpbGUuZXhpc3Q/KGh0bWxfZmlsZSArICcuMTknKSkgfHwKKyAgICAgICAgKFJVQllfVkVSU0lPTiA8ICcxLjknICYmIGh0bWxfZmlsZSA9fiAvXC4xOSQvKQorICAgICAgZGVmaW5lX21ldGhvZCgndGVzdF8nICsgaHRtbF9maWxlLnRyKCcuJywgJ18nKSArICJfdG9fa3JhbWRvd25fdG9faHRtbCIpIGRvCisgICAgICAgIGtkID0gS3JhbWRvd246OkRvY3VtZW50Lm5ldyhGaWxlLnJlYWQoaHRtbF9maWxlKSwgOmlucHV0ID0+ICdodG1sJywgOmF1dG9faWRzID0+IGZhbHNlLCA6Zm9vdG5vdGVfbnIgPT4gMSkudG9fa3JhbWRvd24KKyAgICAgICAgb3B0c19maWxlID0gaHRtbF9maWxlLnN1YigvXC5odG1sKFwuMTkpPyQvLCAnLm9wdGlvbnMnKQorICAgICAgICBvcHRzX2ZpbGUgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKGh0bWxfZmlsZSksICdvcHRpb25zJykgaWYgIUZpbGUuZXhpc3Q/KG9wdHNfZmlsZSkKKyAgICAgICAgb3B0aW9ucyA9IEZpbGUuZXhpc3Q/KG9wdHNfZmlsZSkgPyBZQU1MOjpsb2FkKEZpbGUucmVhZChvcHRzX2ZpbGUpKSA6IHs6YXV0b19pZHMgPT4gZmFsc2UsIDpmb290bm90ZV9uciA9PiAxfQorICAgICAgICBkb2MgPSBLcmFtZG93bjo6RG9jdW1lbnQubmV3KGtkLCBvcHRpb25zKQorICAgICAgICBhc3NlcnRfZXF1YWwodGlkeV9vdXRwdXQoRmlsZS5yZWFkKGh0bWxfZmlsZSkpLCB0aWR5X291dHB1dChkb2MudG9faHRtbCkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBHZW5lcmF0ZSB0ZXN0IG1ldGhvZHMgZm9yIHRleHQtbWFucGFnZSBjb252ZXJzaW9uCisgIERpcltGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy90ZXN0Y2FzZXMvbWFuLyoqLyoudGV4dCddLmVhY2ggZG8gfHRleHRfZmlsZXwKKyAgICBkZWZpbmVfbWV0aG9kKCd0ZXN0XycgKyB0ZXh0X2ZpbGUudHIoJy4nLCAnXycpICsgIl90b19tYW4iKSBkbworICAgICAgbWFuX2ZpbGUgPSB0ZXh0X2ZpbGUuc3ViKC9cLnRleHQkLywgJy5tYW4nKQorICAgICAgZG9jID0gIEtyYW1kb3duOjpEb2N1bWVudC5uZXcoRmlsZS5yZWFkKHRleHRfZmlsZSkpCisgICAgICBhc3NlcnRfZXF1YWwoRmlsZS5yZWFkKG1hbl9maWxlKSwgZG9jLnRvX21hbikKKyAgICBlbmQKKyAgZW5kCisKKyAgRVhDTFVERV9HRk1fRklMRVMgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvbm9fbmV3bGluZV9hdF9lbmQudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvaW5kZW50ZWQudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvdHdvX3BhcmEudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvYXR4X2hlYWRlci50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9zZXRleHRfaGVhZGVyLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZHMudGV4dCcsICMgYmMgb2YgSUQgZ2VuZXJhdGlvbiBkaWZmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkX3ByZWZpeC50ZXh0JywgIyBiYyBvZiBJRCBnZW5lcmF0aW9uIGRpZmZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvaW5kZW50ZWQudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL2xhenkudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL25lc3RlZC50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvbm9fbmV3bGluZV9hdF9lbmQudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svZXJyb3IudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvZXJyb3IudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2VzY2FwaW5nLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9pdGVtX2lhbC50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGF6eS50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGlzdF9hbmRfb3RoZXJzLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9vdGhlcl9maXJzdF9lbGVtZW50LnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zaW1wbGVfdWwudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L3NwZWNpYWxfY2FzZXMudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2xhenlfYW5kX25lc3RlZC50ZXh0JywgIyBiYyBvZiBjaGFuZ2UgaW4gbGF6eSBsaW5lIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbW1lbnQudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2NvZGUudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2VtcGhhc2lzLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS90eXBvZ3JhcGh5LnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19yYXcudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3NpbXBsZS50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9jb21tZW50LnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL2lnbm9yZWQudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vbm9tYXJrZG93bi50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9pdGVtX2lhbC50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9tdWx0aXBsZV90ZXJtcy50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9ub19kZWZfbGlzdC50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9zaW1wbGUudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvd2l0aF9ibG9ja3MudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9lcnJvcnMudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9lc2NhcGluZy50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL3NpbXBsZS50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbm9ybWFsLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY193aXRoX2Zvb3Rub3Rlcy50ZXh0JywgIyBiYyBvZiBJRCBnZW5lcmF0aW9uIGRpZmZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL2VuY29kaW5nLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2lubGluZS50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9saW5rX2RlZnMudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvcmVmZXJlbmNlLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMl9lbXBoYXNpcy9ub3JtYWwudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL25vcm1hbC50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZGVmaW5pdGlvbnMudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL21hcmtlcnMudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvYWNyb3NzX2xpbmVzLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL21hcmtkb3duX2F0dHIudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbm9ybWFsLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL3Jhd19zcGFuX2VsZW1lbnRzLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi9hdXRvbGlua3MvdXJsX2xpbmtzLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vY29tbWVudC50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vaWFsL3NpbXBsZS50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vbGluZV9icmVha3Mvbm9ybWFsLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL25vcm1hbC50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX2FzX2NoYXIudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllcy50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL3R5cG9ncmFwaHkudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICgndGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9yb3VnZS9zaW1wbGUudGV4dCcgaWYgUlVCWV9WRVJTSU9OIDwgJzIuMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAoJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2UvZGlzYWJsZWQudGV4dCcgaWYgUlVCWV9WRVJTSU9OIDwgJzIuMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAoJ3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9zaW1wbGUudGV4dCcgaWYgUlVCWV9WRVJTSU9OIDwgJzIuMCcpLCAjYmMgb2Ygcm91Z2UKKyAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvZGlzYWJsZWQudGV4dCcgaWYgUlVCWV9WRVJTSU9OIDwgJzIuMCcpLCAjYmMgb2Ygcm91Z2UKKyAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvbXVsdGlwbGUudGV4dCcgaWYgUlVCWV9WRVJTSU9OIDwgJzIuMCcpLCAjYmMgb2Ygcm91Z2UKKyAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL2l0ZXgybW1sLnRleHQnIGlmIFJVQllfUExBVEZPUk0gPT0gJ2phdmEnKSwgIyBiYyBvZiBpdGV4dG9tbWwKKyAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvaXRleDJtbWwudGV4dCcgaWYgUlVCWV9QTEFURk9STSA9PSAnamF2YScpLCAjIGJjIG9mIGl0ZXh0b21tbAorICAgICAgICAgICAgICAgICAgICAgIF0uY29tcGFjdAorCisgICMgR2VuZXJhdGUgdGVzdCBtZXRob2RzIGZvciBnZm0tdG8taHRtbCBjb252ZXJzaW9uCisgIERpcltGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy97dGVzdGNhc2VzLHRlc3RjYXNlc19nZm19LyoqLyoudGV4dCddLmVhY2ggZG8gfHRleHRfZmlsZXwKKyAgICBuZXh0IGlmIEVYQ0xVREVfR0ZNX0ZJTEVTLmFueT8ge3xmfCB0ZXh0X2ZpbGUgPX4gLyN7Zn0kL30KKyAgICBiYXNlbmFtZSA9IHRleHRfZmlsZS5zdWIoL1wudGV4dCQvLCAnJykKKworICAgIGh0bWxfZmlsZSA9IFsoIi5odG1sLjE5IiBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScpLCAiLmh0bWwiXS5jb21wYWN0LgorICAgICAgbWFwIHt8ZXh0fCBiYXNlbmFtZSArIGV4dCB9LgorICAgICAgZGV0ZWN0IHt8ZmlsZXwgRmlsZS5leGlzdD8oZmlsZSkgfQorICAgIG5leHQgdW5sZXNzIGh0bWxfZmlsZQorCisgICAgZGVmaW5lX21ldGhvZCgndGVzdF9nZm1fJyArIHRleHRfZmlsZS50cignLicsICdfJykgKyAiX3RvX2h0bWwiKSBkbworICAgICAgb3B0c19maWxlID0gYmFzZW5hbWUgKyAnLm9wdGlvbnMnCisgICAgICBvcHRzX2ZpbGUgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKGh0bWxfZmlsZSksICdvcHRpb25zJykgaWYgIUZpbGUuZXhpc3Q/KG9wdHNfZmlsZSkKKyAgICAgIG9wdGlvbnMgPSBGaWxlLmV4aXN0PyhvcHRzX2ZpbGUpID8gWUFNTDo6bG9hZChGaWxlLnJlYWQob3B0c19maWxlKSkgOiB7OmF1dG9faWRzID0+IGZhbHNlLCA6Zm9vdG5vdGVfbnIgPT4gMX0KKyAgICAgIGRvYyA9IEtyYW1kb3duOjpEb2N1bWVudC5uZXcoRmlsZS5yZWFkKHRleHRfZmlsZSksIG9wdGlvbnMubWVyZ2UoOmlucHV0ID0+ICdHRk0nKSkKKyAgICAgIGFzc2VydF9lcXVhbChGaWxlLnJlYWQoaHRtbF9maWxlKSwgZG9jLnRvX2h0bWwpCisgICAgZW5kCisgIGVuZAorCisKKyAgRVhDTFVERV9QREZfTU9ESUZZID0gWyd0ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllcy50ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19udW1lcmljLnRleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX2FzX2NoYXIudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfYXNfaW5wdXQudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfc3ltYm9saWMudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZHMudGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgIF0uY29tcGFjdAorCisgIEVYQ0xVREVfTU9ESUZZID0gWyd0ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvbXVsdGlwbGUudGV4dCcsICMgYmMgb2YgSFRNTEZvcm1hdGVyIGluIG9wdGlvbnMKKyAgICAgICAgICAgICAgICAgICBdCisKKyAgIyBHZW5lcmF0ZSB0ZXN0IG1ldGhvZHMgZm9yIGFzc2VydGluZyB0aGF0IGNvbnZlcnRlcnMgZG9uJ3QgbW9kaWZ5IHRoZSBkb2N1bWVudCB0cmVlLgorICBEaXJbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVzdGNhc2VzLyoqLyoudGV4dCddLmVhY2ggZG8gfHRleHRfZmlsZXwKKyAgICBvcHRzX2ZpbGUgPSB0ZXh0X2ZpbGUuc3ViKC9cLnRleHQkLywgJy5vcHRpb25zJykKKyAgICBvcHRpb25zID0gRmlsZS5leGlzdD8ob3B0c19maWxlKSA/IFlBTUw6OmxvYWQoRmlsZS5yZWFkKG9wdHNfZmlsZSkpIDogezphdXRvX2lkcyA9PiBmYWxzZSwgOmZvb3Rub3RlX25yID0+IDF9CisgICAgKEtyYW1kb3duOjpDb252ZXJ0ZXIuY29uc3RhbnRzLm1hcCB7fGN8IGMudG9fc3ltfSAtIFs6QmFzZSwgOlJlbW92ZUh0bWxUYWdzLCA6TWF0aEVuZ2luZSwgOlN5bnRheEhpZ2hsaWdodGVyXSkuZWFjaCBkbyB8Y29udl9jbGFzc3wKKyAgICAgIG5leHQgaWYgRVhDTFVERV9NT0RJRlkuYW55PyB7fGZ8IHRleHRfZmlsZSA9fiAvI3tmfSQvfQorICAgICAgbmV4dCBpZiBjb252X2NsYXNzID09IDpQZGYgJiYgKFJVQllfVkVSU0lPTiA8ICcyLjAnIHx8IEVYQ0xVREVfUERGX01PRElGWS5hbnk/IHt8ZnwgdGV4dF9maWxlID1+IC8je2Z9JC99KQorICAgICAgZGVmaW5lX21ldGhvZCgidGVzdF93aGV0aGVyXyN7Y29udl9jbGFzc31fbW9kaWZpZXNfdHJlZV93aXRoX2ZpbGVfI3t0ZXh0X2ZpbGUudHIoJy4nLCAnXycpfSIpIGRvCisgICAgICAgIGRvYyA9IEtyYW1kb3duOjpEb2N1bWVudC5uZXcoRmlsZS5yZWFkKHRleHRfZmlsZSksIG9wdGlvbnMpCisgICAgICAgIG9wdGlvbnNfYmVmb3JlID0gTWFyc2hhbC5sb2FkKE1hcnNoYWwuZHVtcChkb2Mub3B0aW9ucykpCisgICAgICAgIHRyZWVfYmVmb3JlID0gTWFyc2hhbC5sb2FkKE1hcnNoYWwuZHVtcChkb2Mucm9vdCkpCisgICAgICAgIEtyYW1kb3duOjpDb252ZXJ0ZXIuY29uc3RfZ2V0KGNvbnZfY2xhc3MpLmNvbnZlcnQoZG9jLnJvb3QsIGRvYy5vcHRpb25zKQorICAgICAgICBhc3NlcnRfZXF1YWwob3B0aW9uc19iZWZvcmUsIGRvYy5vcHRpb25zKQorICAgICAgICBhc3NlcnRfdHJlZV9ub3RfY2hhbmdlZCh0cmVlX2JlZm9yZSwgZG9jLnJvb3QpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIGFzc2VydF90cmVlX25vdF9jaGFuZ2VkKG9sZCwgbmV3KQorICAgIGFzc2VydF9lcXVhbChvbGQudHlwZSwgbmV3LnR5cGUsICJ0eXBlIG1pc21hdGNoIikKKyAgICBpZiBvbGQudmFsdWUua2luZF9vZj8oS3JhbWRvd246OkVsZW1lbnQpCisgICAgICBhc3NlcnRfdHJlZV9ub3RfY2hhbmdlZChvbGQudmFsdWUsIG5ldy52YWx1ZSkKKyAgICBlbHNlCisgICAgICBhc3NlcnQob2xkLnZhbHVlID09IG5ldy52YWx1ZSwgInZhbHVlIG1pc21hdGNoIikKKyAgICBlbmQKKyAgICBhc3NlcnRfZXF1YWwob2xkLmF0dHIsIG5ldy5hdHRyLCAiYXR0ciBtaXNtYXRjaCIpCisgICAgYXNzZXJ0X2VxdWFsKG9sZC5vcHRpb25zLCBuZXcub3B0aW9ucywgIm9wdGlvbnMgbWlzbWF0Y2giKQorICAgIGFzc2VydF9lcXVhbChvbGQuY2hpbGRyZW4ubGVuZ3RoLCBuZXcuY2hpbGRyZW4ubGVuZ3RoLCAiY2hpbGRyZW4gY291bnQgbWlzbWF0Y2giKQorCisgICAgb2xkLmNoaWxkcmVuLmVhY2hfd2l0aF9pbmRleCBkbyB8Y2hpbGQsIGluZGV4fAorICAgICAgYXNzZXJ0X3RyZWVfbm90X2NoYW5nZWQoY2hpbGQsIG5ldy5jaGlsZHJlbltpbmRleF0pCisgICAgZW5kCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RfbG9jYXRpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0X2xvY2F0aW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NzdmYmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0X2xvY2F0aW9uLnJiCkBAIC0wLDAgKzEsMjI5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIy0tCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDE2IFRob21hcyBMZWl0bmVyIDx0X2xlaXRuZXJAZ214LmF0PgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBrcmFtZG93biB3aGljaCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlULgorIysrCisjCisKKworcmVxdWlyZSAnbWluaXRlc3QvYXV0b3J1bicKK3JlcXVpcmUgJ2tyYW1kb3duJworCitFbmNvZGluZy5kZWZhdWx0X2V4dGVybmFsID0gJ3V0Zi04JyBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKworZGVzY3JpYmUgJ2xvY2F0aW9uJyBkbworCisgICMgY2hlY2tzIHRoYXQgK2VsZW1lbnQrJ3MgOmxvY2F0aW9uIG9wdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gc3RvcmVkCisgICMgaW4gdGhlIGVsZW1lbnQuYXR0clsnY2xhc3MnXQorICBkZWYgY2hlY2tfZWxlbWVudF9mb3JfbG9jYXRpb24oZWxlbWVudCkKKyAgICBpZiAobWF0Y2ggPSAvXmxpbmUtKFxkKykvLm1hdGNoKGVsZW1lbnQuYXR0clsnY2xhc3MnXSB8fCAnJykpCisgICAgICBleHBlY3RlZF9saW5lID0gbWF0Y2hbMV0udG9faQorICAgICAgZWxlbWVudC5vcHRpb25zWzpsb2NhdGlvbl0ubXVzdF9lcXVhbChleHBlY3RlZF9saW5lKQorICAgIGVuZAorICAgIGVsZW1lbnQuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICBjaGVja19lbGVtZW50X2Zvcl9sb2NhdGlvbihjaGlsZCkKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBUZXN0IGNhc2VzIGNvbnNpc3Qgb2YgYSBrcmFtZG93biBzdHJpbmcgdGhhdCB1c2VzIElBTHMgdG8gc3BlY2lmeSB0aGUgZXhwZWN0ZWQKKyAgIyBsaW5lIG51bWJlcnMgZm9yIGEgZ2l2ZW4gZWxlbWVudC4KKyAgdGVzdF9jYXNlcyA9IHsKKyAgICAnYXV0b2xpbmsnID0+ICUodGVzdGluZyBhdXRvbGlua3NcblxuPGh0dHA6Ly9rcmFtZG93bi5vcmc+ezoubGluZS0zfSksCisgICAgJ2Jsb2NrcXVvdGUnID0+ICUoCisgICAgICA+IGJsb2NrIHF1b3RlMQorICAgICAgPgorICAgICAgPiAqIHs6LmxpbmUtM30gbGlzdCBpdGVtIGluIGJsb2NrIHF1b3RlCisgICAgICA+ICogezoubGluZS00fSBsaXN0IGl0ZW0gaW4gYmxvY2sgcXVvdGUKKyAgICAgID4gezoubGluZS0zfQorICAgICAgezoubGluZS0xfQorCisgICAgICA+IGJsb2NrIHF1b3RlMgorICAgICAgezoubGluZS04fQorICAgICksCisgICAgJ2NvZGVibG9jaycgPT4gJShcbmEgcGFyYVxuXG5+fn5+XG50ZXN0IGNvZGUgMVxufn5+flxuezoubGluZS0zfVxuXG4gICAgdGVzdCBjb2RlIDJcbns6LmxpbmUtOH1cbiksCisgICAgJ2NvZGVzcGFuJyA9PiAlKGEgcGFyYVxuXG5hbm90aGVyIHBhcmEgYDxjb2RlPmB7Oi5saW5lLTN9IHdpdGggY29kZVxuKSwKKyAgICAnZW1waGFzaXMnID0+ICUoCisgICAgICBwYXJhICpzcGFuKns6LmxpbmUtMX0KKyAgICAgIHs6LmxpbmUtMX0KKworICAgICAgIyMgaGVhZGVyICpzcGFuKns6LmxpbmUtNH0KKyAgICAgIHs6LmxpbmUtNH0KKworICAgICAgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kCisgICAgICB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sCisgICAgICBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbworICAgICAgY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZQorICAgICAgY2lsbHVtICpzaG9ydCBzcGFuIG9uIHNpbmdsZSBsaW5lKns6LmxpbmUtMTF9CisgICAgICBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uCisgICAgICAqbG9uZyBzcGFuIG92ZXIgbXVsdGlwbGUgbGluZXMgLSBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudAorICAgICAgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uKns6LmxpbmUtMTN9CisgICAgICBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QKKyAgICAgIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwKKyAgICAgIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvCisgICAgICBgY29kZSBzcGFuYHs6LmxpbmUtMTh9CisgICAgICBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QKKyAgICAgIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwKKyAgICAgIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvCisgICAgICB7Oi5saW5lLTd9CisgICAgKSwKKyAgICAnaGVhZGVyJyA9PiAlKAorICAgICAgIyBoZWFkZXIxCisgICAgICB7Oi5saW5lLTF9CisKKyAgICAgICMjIGhlYWRlcjIKKyAgICAgIHs6LmxpbmUtNH0KKworICAgICAgIyMgaGVhZGVyMworICAgICAgezoubGluZS03fQorCisgICAgICBoZWFkZXI0CisgICAgICA9PT09PT09CisgICAgICB7Oi5saW5lLTEwfQorCisgICAgICBeCisKKyAgICAgIGhlYWRlcjUKKyAgICAgIC0tLS0tLS0KKyAgICAgIHs6LmxpbmUtMTZ9CisgICAgKSwKKyAgICAnaG9yaXpvbnRhbF9ydWxlJyA9PiAlKFxuYSBwYXJhXG5cbi0tLS1cbns6LmxpbmUtM31cbiksCisgICAgJ2h0bWxfZW50aXR5JyA9PiAiYSBwYXJhXG5cbmFub3RoZXIgcGFyYSB3aXRoICZhbXA7ezoubGluZS0zfSBodG1sIGVudGl0eS5cbiIsCisgICAgJ2xpbmsnID0+ICUoCisgICAgICBhIHBhcmEKKworICAgICAgVGhpcyBpcyBbYSBsaW5rXShodHRwOi8vcnVieWZvcmdlLm9yZyl7Oi5saW5lLTN9IHRvIGEgcGFnZS4KKworICAgICAgSGVyZSBjb21lcyBhICFbc21pbGV5XSguLi9pbWFnZXMvc21pbGV5LnBuZyl7Oi5saW5lLTV9CisgICAgKSwKKyAgICAnbGlzdCcgPT4gJSgKKyAgICAgICogezoubGluZS0xfSBsaXN0IGl0ZW0KKyAgICAgICogezoubGluZS0yfSBsaXN0IGl0ZW0KKyAgICAgICogezoubGluZS0zfSBsaXN0IGl0ZW0KKyAgICAgIHs6LmxpbmUtMX0KKworICAgICAgezoubGluZS03fQorICAgICAgMS4gezoubGluZS03fSBsaXN0IGl0ZW0KKyAgICAgIDIuIHs6LmxpbmUtOH0gbGlzdCBpdGVtCisgICAgICAzLiB7Oi5saW5lLTl9IGxpc3QgaXRlbQorCisgICAgICB7Oi5saW5lLTEyfQorICAgICAgZGVmaW5pdGlvbiB0ZXJtIDEKKyAgICAgIDogezoubGluZS0xM30gZGVmaW5pdGlvbiBkZWZpbml0aW9uIDEKKyAgICAgIGRlZmluaXRpb24gdGVybSAyCisgICAgICA6IHs6LmxpbmUtMTV9IGRlZmluaXRpb24gZGVmaW5pdGlvbiAyCisgICAgKSwKKyAgICAnbWF0aF9ibG9jaycgPT4gJShcbmEgcGFyYVxuXG4kJDUrNSQkXG57Oi5saW5lLTN9XG4pLAorICAgICdtYXRoX2lubGluZScgPT4gJShcbmEgcGFyYVxuXG5hbm90aGVyIHBhcmEgd2l0aCBpbmxpbmUgbWF0aCAkJDUrNSQkezoubGluZS0zfVxuKSwKKyAgICAncGFyYWdyYXBoJyA9PiAlKAorICAgICAgcGFyYTEKKyAgICAgIHs6LmxpbmUtMX0KKworICAgICAgcGFyYTIKKyAgICAgIHs6LmxpbmUtNH0KKworICAgICAgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kCisgICAgICB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sCisgICAgICBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbworICAgICAgY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZQorICAgICAgezoubGluZS03fQorCisgICAgICB7Oi5saW5lLTE0fQorICAgICAgcGFyYSB3aXRoIGxlYWRpbmcgSUFMCisgICAgKSwKKyAgICAndGFibGUnID0+ICUoCisgICAgICBhIHBhcmEKKworICAgICAgfGZpcnN0fHNlY29uZHx0aGlyZHwKKyAgICAgIHwtLS0tLXwtLS0tLS18LS0tLS18CisgICAgICB8YSAgICB8YiAgICAgfGMgICAgfAorICAgICAgezoubGluZS0zfQorICAgICksCisgICAgJ3R5cG9ncmFwaGljX3N5bWJvbCcgPT4gJSgKKyAgICAgIGEgcGFyYQorCisgICAgICBhbm90aGVyIHBhcmEgLS0tezoubGluZS0zfQorCisgICAgICBhbm90aGVyIHBhcmEgLi4uezoubGluZS01fQorICAgICksCisgICAgJ2doIGlzc3VlIDEyOScgPT4gJSgKKyAgICAgIGB8YAorICAgICAgezoubGluZS0xfQorICAgICksCisgICAgJ2doIGlzc3VlIDEzMScgPT4gJSgKKyAgICAgICogezoubGluZS0xfSB0ZXN0CisgICAgICAgIGxpbmUgMgorICAgICAgICAqIHs6LmxpbmUtM30gc2Vjb25kCisgICAgICAgICogezoubGluZS00fSB0aGlyZAorICAgICAgKiB7Oi5saW5lLTV9ICogezoubGluZS01fSBvbmUKKyAgICAgICAgKiB7Oi5saW5lLTZ9IHR3bworICAgICksCisgICAgJ2doIGlzc3VlIDE1OCcgPT4gJSgKKyAgICAgIPCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgfCfmIHwn5iB8J+YgQorICAgICAgezoubGluZS0xfQorCisgICAgICAtIHs6LmxpbmUtNH0gVAorICAgICAgezoubGluZS00fQorCisgICAgICAjIFQKKyAgICAgIHs6LmxpbmUtN30KKyAgICApLAorICAgICdnaCBpc3N1ZSAyNDMgLSBIVE1MIHJhdyBlbGVtZW50cycgPT4gJSgKKyAgICAgIDx1bCBjbGFzcz0ibGluZS0xIj4KKyAgICAgICAgPGxpIGNsYXNzPSJsaW5lLTIiPlRlc3Q8L2xpPgorICAgICAgPC91bD4KKyAgICApLAorICB9CisgIHRlc3RfY2FzZXMuZWFjaCBkbyB8bmFtZSwgdGVzdF9zdHJpbmd8CisgICAgaXQgIkhhbmRsZXMgI3sgbmFtZSB9IiBkbworICAgICAgZG9jID0gS3JhbWRvd246OkRvY3VtZW50Lm5ldyh0ZXN0X3N0cmluZy5nc3ViKC9eICAgICAgLywgJycpLnN0cmlwKQorICAgICAgY2hlY2tfZWxlbWVudF9mb3JfbG9jYXRpb24oZG9jLnJvb3QpCisgICAgZW5kCisgIGVuZAorCisgIGl0ICdhZGRzIGxvY2F0aW9uIGluZm8gdG8gZHVwbGljYXRlIGFiYnJldmlhdGlvbiBkZWZpbml0aW9uIHdhcm5pbmdzJyBkbworICAgIHRlc3Rfc3RyaW5nID0gJShUaGlzIHNuaXBwZXQgY29udGFpbnMgYSBkdXBsaWNhdGUgYWJicmV2aWF0aW9uIGRlZmluaXRpb24KKworKltkdXBsaWNhdGVdOiBUaGUgZmlyc3QgZGVmaW5pdGlvbgorKltkdXBsaWNhdGVdOiBUaGUgc2Vjb25kIGRlZmluaXRpb24KKyAgICApCisgICAgZG9jID0gS3JhbWRvd246OkRvY3VtZW50Lm5ldyh0ZXN0X3N0cmluZy5zdHJpcCkKKyAgICBkb2Mud2FybmluZ3MubXVzdF9lcXVhbCBbIkR1cGxpY2F0ZSBhYmJyZXZpYXRpb24gSUQgJ2R1cGxpY2F0ZScgb24gbGluZSA0IC0gb3ZlcndyaXRpbmciXQorICBlbmQKKworICBpdCAnaGFuZGxlcyBhYmJyZXZpYXRpb25zJyBkbworICAgIHN0ciA9ICJUaGlzICppcyogQUJDIGFuZFxuKiphbmQqKiBBQkMgc2Vjb25kXG5hbm90aGVyIEFCQ1xuYXMgQUJDIGFzXG5BQkMgYXQgdGhlIGVuZC5cblxuKltBQkNdOiBBQkMiCisgICAgZG9jID0gS3JhbWRvd246OkRvY3VtZW50Lm5ldyhzdHIpCisgICAgZG9jLnJvb3QuY2hpbGRyZW4uZmlyc3QuY2hpbGRyZW4uc2VsZWN0IHt8ZXwgZS50eXBlID09IDphYmJyZXZpYXRpb259LmVhY2hfd2l0aF9pbmRleCBkbyB8ZSwgaXwKKyAgICAgIGFzc2VydF9lcXVhbChpICsgMSwgZS5vcHRpb25zWzpsb2NhdGlvbl0pCisgICAgZW5kCisgIGVuZAorCisgIGl0ICdoYW5kbGVzIGxpbmUgYnJlYWtzJyBkbworICAgIHN0ciA9ICJGaXJzdCAgXG5zZWNvbmRcXFxcXG50aGlyZCAgXG4iCisgICAgZG9jID0gS3JhbWRvd246OkRvY3VtZW50Lm5ldyhzdHIpCisgICAgZG9jLnJvb3QuY2hpbGRyZW4uZmlyc3QuY2hpbGRyZW4uc2VsZWN0IHt8ZXwgZS50eXBlID09IDpicn0uZWFjaF93aXRoX2luZGV4IGRvIHxlLCBpfAorICAgICAgYXNzZXJ0X2VxdWFsKGkgKyAxLCBlLm9wdGlvbnNbOmxvY2F0aW9uXSkKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgJ2hhbmRsZXMgc21hcnQgcXVvdGVzJyBkbworICAgIHN0ciA9ICJUaGlzIGlzICdmaXJzdCdcbmFuZCAnc2Vjb25kJyBhbmRcbid0aGlyZCciCisgICAgZG9jID0gS3JhbWRvd246OkRvY3VtZW50Lm5ldyhzdHIpCisgICAgZG9jLnJvb3QuY2hpbGRyZW4uZmlyc3QuY2hpbGRyZW4uc2VsZWN0IHt8ZXwgZS50eXBlID09IDpzbWFydF9xdW90ZX0uZWFjaF93aXRoX2luZGV4IGRvIHxlLCBpfAorICAgICAgYXNzZXJ0X2VxdWFsKCgoaSArIDEpIC8yLjApLmNlaWwsIGUub3B0aW9uc1s6bG9jYXRpb25dKQorICAgIGVuZAorICBlbmQKKworICBpdCAnaGFuZGxlcyBoYXJkIHdyYXBwZWQgcGFyYWdyYXBocyB3aXRoIHRoZSBHRk0gcGFyc2VyJyBkbworICAgIHN0ciA9ICJBKmIqQ1xuQSpiKkNcbkEqYipDIgorICAgIGRvYyA9IEtyYW1kb3duOjpEb2N1bWVudC5uZXcoc3RyLCA6aW5wdXQgPT4gJ0dGTScsIDpoYXJkX3dyYXAgPT4gdHJ1ZSkKKyAgICBwYXJhID0gZG9jLnJvb3QuY2hpbGRyZW4uZmlyc3QKKyAgICAxLnVwdG8oMykgZG8gfGxpbmV8CisgICAgICAwLnVwdG8obGluZSA9PSAzID8gMiA6IDMpIGRvIHxlbGVtZW50fAorICAgICAgICBhc3NlcnRfZXF1YWwobGluZSwgcGFyYS5jaGlsZHJlbls0KihsaW5lIC0gMSkgKyBlbGVtZW50XS5vcHRpb25zWzpsb2NhdGlvbl0pCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3Rfc3RyaW5nX3NjYW5uZXJfa3JhbWRvd24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0X3N0cmluZ19zY2FubmVyX2tyYW1kb3duLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWMxZWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0X3N0cmluZ19zY2FubmVyX2tyYW1kb3duLnJiCkBAIC0wLDAgKzEsMzAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTYgVGhvbWFzIExlaXRuZXIgPHRfbGVpdG5lckBnbXguYXQ+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGtyYW1kb3duIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQuCisjKysKKyMKKworCityZXF1aXJlICdtaW5pdGVzdC9hdXRvcnVuJworcmVxdWlyZSAna3JhbWRvd24vdXRpbHMvc3RyaW5nX3NjYW5uZXInCisKK2Rlc2NyaWJlIEtyYW1kb3duOjpVdGlsczo6U3RyaW5nU2Nhbm5lciBkbworCisgIFsKKyAgICBbIi4uLi4uLi4uLi4uWC4uLi4uLi4uLi4uLiIsIFsvWC9dLCAxXSwKKyAgICBbIjFcbjJcbjNcbjRcbjVcbjZYIiwgWy9YL10sIDZdLAorICAgIFsiMVxuMlxuM1xuNFxuNVxuNlhcbjdcbjhYIiwgWy9YLywvWC9dLCA4XSwKKyAgICBbKCIuXG4iICogMTAwMCkgKyAnWCcsIFsvWC9dLCAxMDAxXQorICBdLmVhY2hfd2l0aF9pbmRleCBkbyB8dGVzdF9kYXRhLCBpfAorICAgIHRlc3Rfc3RyaW5nLCBzY2FuX3JlZ2V4ZXMsIGV4cGVjdCA9IHRlc3RfZGF0YQorICAgIGl0ICJjb21wdXRlcyB0aGUgY29ycmVjdCBjdXJyZW50X2xpbmVfbnVtYmVyIGZvciBleGFtcGxlICMje2krMX0iIGRvCisgICAgICBzdHJfc2MgPSBLcmFtZG93bjo6VXRpbHM6OlN0cmluZ1NjYW5uZXIubmV3KHRlc3Rfc3RyaW5nKQorICAgICAgc2Nhbl9yZWdleGVzLmVhY2ggeyB8c2Nhbl9yZXwgc3RyX3NjLnNjYW5fdW50aWwoc2Nhbl9yZSkgfQorICAgICAgc3RyX3NjLmN1cnJlbnRfbGluZV9udW1iZXIubXVzdF9lcXVhbCBleHBlY3QKKyAgICBlbmQKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAxX2JsYW5rX2xpbmUvc3BhY2VzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDFfYmxhbmtfbGluZS9zcGFjZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAxX2JsYW5rX2xpbmUvc3BhY2VzLmh0bWwKQEAgLTAsMCArMSBAQAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDFfYmxhbmtfbGluZS9zcGFjZXMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMV9ibGFua19saW5lL3NwYWNlcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYmRhYTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDFfYmxhbmtfbGluZS9zcGFjZXMudGV4dApAQCAtMCwwICsxLDMgQEAKKworICAgICAgICAgICAgIAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDFfYmxhbmtfbGluZS90YWJzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDFfYmxhbmtfbGluZS90YWJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMzc4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMV9ibGFua19saW5lL3RhYnMuaHRtbApAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMV9ibGFua19saW5lL3RhYnMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMV9ibGFua19saW5lL3RhYnMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ2YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAxX2JsYW5rX2xpbmUvdGFicy50ZXh0CkBAIC0wLDAgKzEsNiBAQAorCQorCQkJCisJCisJCQorCisJCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDJfZW9iL2JlZ2lubmluZy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAyX2VvYi9iZWdpbm5pbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAyX2VvYi9iZWdpbm5pbmcuaHRtbApAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMl9lb2IvYmVnaW5uaW5nLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDJfZW9iL2JlZ2lubmluZy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMTU4MDIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDJfZW9iL2JlZ2lubmluZy50ZXh0CkBAIC0wLDAgKzEsMyBAQAorXgorCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMl9lb2IvZW5kLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDJfZW9iL2VuZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDJfZW9iL2VuZC5odG1sCkBAIC0wLDAgKzEgQEAKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAyX2VvYi9lbmQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMl9lb2IvZW5kLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1NmVjMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMl9lb2IvZW5kLnRleHQKQEAgLTAsMCArMSwzIEBACisKKworXgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAyX2VvYi9taWRkbGUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMl9lb2IvbWlkZGxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMzc4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wMl9lb2IvbWlkZGxlLmh0bWwKQEAgLTAsMCArMSBAQAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDJfZW9iL21pZGRsZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAyX2VvYi9taWRkbGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzIxMGExCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAyX2VvYi9taWRkbGUudGV4dApAQCAtMCwwICsxLDUgQEAKKworCiteCisKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9pbmRlbnRlZC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9pbmRlbnRlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMGNmYzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDNfcGFyYWdyYXBoL2luZGVudGVkLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPHA+VGhpcyBpcyBhIHBhcmEuPC9wPgorCis8cD5UaGlzIGlzIGEgcGFyYS48L3A+CisKKzxwPlRoaXMgaXMgYSBwYXJhLjwvcD4KKworPHA+VGhpcyBpcyBhIHBhcmEuPC9wPgorCis8cHJlPjxjb2RlPlRoaXMgaXMgYSBjb2RlIGJsb2NrLgorPC9jb2RlPjwvcHJlPgorCis8cD5BbmQgdGhpcyBpcyBhbm90aGVyLjwvcD4KKworPHA+QSBwYXJhCisgd2l0aAorICBtaXhlZAoraW5kZW50cy4KKyAgIGFuZCB3aXRoIG11Y2ggaW5kZW50PC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9pbmRlbnRlZC5odG1sLmdmbSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvaW5kZW50ZWQuaHRtbC5nZm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0MGM2MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvaW5kZW50ZWQuaHRtbC5nZm0KQEAgLTAsMCArMSwxOCBAQAorPHA+VGhpcyBpcyBhIHBhcmEuPC9wPgorCis8cD5UaGlzIGlzIGEgcGFyYS48L3A+CisKKzxwPlRoaXMgaXMgYSBwYXJhLjwvcD4KKworPHA+VGhpcyBpcyBhIHBhcmEuPC9wPgorCis8cHJlPjxjb2RlPlRoaXMgaXMgYSBjb2RlIGJsb2NrLgorPC9jb2RlPjwvcHJlPgorCis8cD5BbmQgdGhpcyBpcyBhbm90aGVyLjwvcD4KKworPHA+QSBwYXJhCis8YnIgLz4gd2l0aAorPGJyIC8+ICBtaXhlZAorPGJyIC8+aW5kZW50cy4KKzxiciAvPiAgIGFuZCB3aXRoIG11Y2ggaW5kZW50PC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9pbmRlbnRlZC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9pbmRlbnRlZC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDlmNWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDNfcGFyYWdyYXBoL2luZGVudGVkLnRleHQKQEAgLTAsMCArMSwxOSBAQAorVGhpcyBpcyBhIHBhcmEuCisKKyBUaGlzIGlzIGEgcGFyYS4KKworICBUaGlzIGlzIGEgcGFyYS4KKworICAgVGhpcyBpcyBhIHBhcmEuCisKKyAgICBUaGlzIGlzIGEgY29kZSBibG9jay4KKworCisgICAgICAgCitBbmQgdGhpcyBpcyBhbm90aGVyLgorCitBIHBhcmEKKyB3aXRoCisgIG1peGVkCitpbmRlbnRzLgorICAgYW5kIHdpdGggbXVjaCBpbmRlbnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvbm9fbmV3bGluZV9hdF9lbmQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvbm9fbmV3bGluZV9hdF9lbmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTIwOWUyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9ub19uZXdsaW5lX2F0X2VuZC5odG1sCkBAIC0wLDAgKzEsNSBAQAorPHA+T25lIHBhcmFncmFwaAorb3ZlcgorICAgbXVsdGlwbGUgbGluZXMuPC9wPgorCis8cD5TZWNvbmQgb25lIHdpdGhvdXQgbmV3bGluZS48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDNfcGFyYWdyYXBoL25vX25ld2xpbmVfYXRfZW5kLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDNfcGFyYWdyYXBoL25vX25ld2xpbmVfYXRfZW5kLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxMTY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvbm9fbmV3bGluZV9hdF9lbmQudGV4dApAQCAtMCwwICsxLDUgQEAKKyAgT25lIHBhcmFncmFwaAorb3ZlcgorICAgbXVsdGlwbGUgbGluZXMuCisKK1NlY29uZCBvbmUgd2l0aG91dCBuZXdsaW5lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvb25lX3BhcmEuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvb25lX3BhcmEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDIwZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9vbmVfcGFyYS5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPlRoaXMgaXMganVzdCBhIG5vcm1hbCBwYXJhZ3JhcGguPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9vbmVfcGFyYS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC9vbmVfcGFyYS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMDEzMjQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDNfcGFyYWdyYXBoL29uZV9wYXJhLnRleHQKQEAgLTAsMCArMSBAQAorVGhpcyBpcyBqdXN0IGEgbm9ybWFsIHBhcmFncmFwaC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvdHdvX3BhcmEuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvdHdvX3BhcmEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjE5NGVhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzAzX3BhcmFncmFwaC90d29fcGFyYS5odG1sCkBAIC0wLDAgKzEsNCBAQAorPHA+VGhpcyBpcyBqdXN0IGEgbm9ybWFsIHBhcmFncmFwaC4KK1RoYXQgZ29lcyBvbiB0byB0aGUgc2Vjb25kIGxpbmUuPC9wPgorCis8cD5Bbm90aGVyIHBhcmFncmFwaC48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDNfcGFyYWdyYXBoL3R3b19wYXJhLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDNfcGFyYWdyYXBoL3R3b19wYXJhLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjNzMwZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wM19wYXJhZ3JhcGgvdHdvX3BhcmEudGV4dApAQCAtMCwwICsxLDQgQEAKK1RoaXMgaXMganVzdCBhIG5vcm1hbCBwYXJhZ3JhcGguCitUaGF0IGdvZXMgb24gdG8gdGhlIHNlY29uZCBsaW5lLgorCitBbm90aGVyIHBhcmFncmFwaC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvYXR4X2hlYWRlci5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9hdHhfaGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwYzI3MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvYXR4X2hlYWRlci5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzxoMT5UaGlzIGlzIGEgaGVhZGVyPC9oMT4KKworPGgyPlRoaXMgaXMgYSBoZWFkZXI8L2gyPgorCis8aDM+VGhpcyBpcyBhIGhlYWRlcjwvaDM+CisKKzxoND5UaGlzIGlzIGEgaGVhZGVyPC9oND4KKworPGg1PlRoaXMgaXMgYSBoZWFkZXI8L2g1PgorCis8aDY+VGhpcyBpcyBhIGhlYWRlcjwvaDY+CisKKzxoMT5IZWFkZXI8L2gxPgorPGgxPkhlYWRlcjwvaDE+CisKKzxoMj5IZWFkZXI8L2gyPgorPGJsb2NrcXVvdGU+CisgIDxwPmJsb2NrcXVvdGU8L3A+Cis8L2Jsb2NrcXVvdGU+CisKKzxoNj5oZWFkZXI8L2g2PgorPHA+cGFyYWdyYXBoPC9wPgorCis8YmxvY2txdW90ZT4KKyAgPHA+YmxvY2txdW90ZQorIyMjIG5vdCBhIGhlYWRlcjwvcD4KKzwvYmxvY2txdW90ZT4KKworPGgxPmhlYWRlciAjPC9oMT4KKworPGgxPmhlYWRlcjwvaDE+CisKKzxwPiM8L3A+CisKKzxwPiM8L3A+CisKKzxoMyBpZD0iaWQiPkhlYWRlcjwvaDM+CisKKzxoMyBpZD0iSWQiPkhlYWRlcjwvaDM+CisKKzxoMyBpZD0iaWQiPkhlYWRlcjwvaDM+CisKKzxoMyBpZD0iQS1aYS16MC05Xzp0Ij5IZWFkZXI8L2gzPgorCis8aDM+SGVhZGVyIHsjOWFifTwvaDM+CisKKzxoMz5IZWFkZXJ7I25vaWR9PC9oMz4KKworPGgzPkhlYWRlciAjI3sjbm9pZH08L2gzPgorCis8aDM+TGFzdDwvaDM+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2F0eF9oZWFkZXIudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvYXR4X2hlYWRlci50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDcwM2YKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2F0eF9oZWFkZXIudGV4dApAQCAtMCwwICsxLDQ4IEBACisjIFRoaXMgaXMgYSBoZWFkZXIKKworIyMgVGhpcyBpcyBhIGhlYWRlcgorCisjIyMgVGhpcyBpcyBhIGhlYWRlcgorCisjIyMjIFRoaXMgaXMgYSBoZWFkZXIKKworIyMjIyMgVGhpcyBpcyBhIGhlYWRlcgorCisjIyMjIyMgVGhpcyBpcyBhIGhlYWRlcgorCisjIEhlYWRlcgorXgorIyBIZWFkZXIKKworIyNIZWFkZXIgICAjIyMjIworPiBibG9ja3F1b3RlCisKKyMjIyMjIyBoZWFkZXIgCitwYXJhZ3JhcGgKKworPiBibG9ja3F1b3RlCisjIyMgbm90IGEgaGVhZGVyCisKKyMgaGVhZGVyIFwjCisKKyMgaGVhZGVyCisKKyMgCisKKyMKKworIyMjIEhlYWRlciB7I2lkfQorCisjIyMgSGVhZGVyICMjIHsjSWR9ICAKKworIyMjIEhlYWRlciAgICAjIyAgICB7I2lkfQorCisjIyMgSGVhZGVyIHsjQS1aYS16MC05Xzp0fQorCisjIyMgSGVhZGVyIHsjOWFifQorCisjIyMgSGVhZGVyeyNub2lkfQorCisjIyMgSGVhZGVyICMjeyNub2lkfQorCisjIyMgTGFzdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9hdHhfaGVhZGVyX25vX25ld2xpbmVfYXRfZW5kLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2F0eF9oZWFkZXJfbm9fbmV3bGluZV9hdF9lbmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjQ5YzNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9hdHhfaGVhZGVyX25vX25ld2xpbmVfYXRfZW5kLmh0bWwKQEAgLTAsMCArMSBAQAorPGgxPmhlYWRlcjwvaDE+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2F0eF9oZWFkZXJfbm9fbmV3bGluZV9hdF9lbmQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvYXR4X2hlYWRlcl9ub19uZXdsaW5lX2F0X2VuZC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNzRiZTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2F0eF9oZWFkZXJfbm9fbmV3bGluZV9hdF9lbmQudGV4dApAQCAtMCwwICsxIEBACisjIGhlYWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvaGVhZGVyX3R5cGVfb2Zmc2V0Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2hlYWRlcl90eXBlX29mZnNldC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMzFiOWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2hlYWRlcl90eXBlX29mZnNldC5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxoMj5Mb3JlbSBpcHN1bTwvaDI+CisKKzxoMz5Mb3JlbSBpcHN1bTwvaDM+CisKKzxoND5Mb3JlbSBpcHN1bTwvaDQ+CisKKzxoNj5Mb3JlbSBpcHN1bTwvaDY+CisKKzxoMj5Mb3JlbSBpcHN1bTwvaDI+CisKKzxoMz5Mb3JlbSBpcHN1bTwvaDM+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2hlYWRlcl90eXBlX29mZnNldC5rcmFtZG93biBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvaGVhZGVyX3R5cGVfb2Zmc2V0LmtyYW1kb3duCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3N2RlYjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2hlYWRlcl90eXBlX29mZnNldC5rcmFtZG93bgpAQCAtMCwwICsxLDEyIEBACisjIyBMb3JlbSBpcHN1bQorCisjIyMgTG9yZW0gaXBzdW0KKworIyMjIyBMb3JlbSBpcHN1bQorCisjIyMjIyMgTG9yZW0gaXBzdW0KKworIyMgTG9yZW0gaXBzdW0KKworIyMjIExvcmVtIGlwc3VtCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvaGVhZGVyX3R5cGVfb2Zmc2V0LmxhdGV4IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9oZWFkZXJfdHlwZV9vZmZzZXQubGF0ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwMTdlNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvaGVhZGVyX3R5cGVfb2Zmc2V0LmxhdGV4CkBAIC0wLDAgKzEsMTIgQEAKK1xzdWJzZWN0aW9uKntMb3JlbSBpcHN1bX0KKworXHN1YnN1YnNlY3Rpb24qe0xvcmVtIGlwc3VtfQorCitccGFyYWdyYXBoKntMb3JlbSBpcHN1bX0KKworXHN1YnBhcmFncmFwaCp7TG9yZW0gaXBzdW19CisKK1xzdWJzZWN0aW9uKntMb3JlbSBpcHN1bX0KKworXHN1YnN1YnNlY3Rpb24qe0xvcmVtIGlwc3VtfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL2hlYWRlcl90eXBlX29mZnNldC5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9oZWFkZXJfdHlwZV9vZmZzZXQub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODA1MDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9oZWFkZXJfdHlwZV9vZmZzZXQub3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKKzpoZWFkZXJfb2Zmc2V0OiAxCis6YXV0b19pZHM6IGZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9oZWFkZXJfdHlwZV9vZmZzZXQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvaGVhZGVyX3R5cGVfb2Zmc2V0LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhZWZhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvaGVhZGVyX3R5cGVfb2Zmc2V0LnRleHQKQEAgLTAsMCArMSwxMyBAQAorIyBMb3JlbSBpcHN1bQorCisjIyBMb3JlbSBpcHN1bQorCisjIyMgTG9yZW0gaXBzdW0KKworIyMjIyMjIExvcmVtIGlwc3VtCisKK0xvcmVtIGlwc3VtCis9PT09PT09PT09PQorCitMb3JlbSBpcHN1bQorLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvc2V0ZXh0X2hlYWRlci5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9zZXRleHRfaGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3YzM0NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvc2V0ZXh0X2hlYWRlci5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKzxoMj50ZXN0PC9oMj4KKworPGgxPnRlc3QyPC9oMT4KKworPGgyPnRlc3Q8L2gyPgorPHA+cGFyYTwvcD4KKworPHByZT48Y29kZT4gICBoZWFkZXIgPQorPC9jb2RlPjwvcHJlPgorCis8cD49PC9wPgorCis8cD5UaGlzIGlzIGEgcGFyYS4KK1dpdGggdHdvIGxpbmVzLgorQW5kIG5vdCBhIGhlYWRlci4KKz09PT09PT09PT09PT09PT09PC9wPgorCis8YmxvY2txdW90ZT4KKyAgPHA+QmxvY2txdW90ZS4KK05vdCBhIEhlYWRlcgorLTwvcD4KKzwvYmxvY2txdW90ZT4KKworPGgyIGlkPSJpZCI+aGVhZGVyPC9oMj4KKworPGgxIGlkPSJJZCI+aGVhZGVyPC9oMT4KKworPGgyIGlkPSJBLVphLXowLTlfOiI+aGVhZGVyPC9oMj4KKworPGgyPmhlYWRlcnsjbm9pZH08L2gyPgorCis8aDI+aGVhZGVyPC9oMj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvc2V0ZXh0X2hlYWRlci50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9zZXRleHRfaGVhZGVyLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5NGVjZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvc2V0ZXh0X2hlYWRlci50ZXh0CkBAIC0wLDAgKzEsMzkgQEAKK3Rlc3QKKy0KKwordGVzdDIKKz09PT09PT09PQorCit0ZXN0CistCitwYXJhCisKKyAgICAgICBoZWFkZXIKKz0KKworCis9CisKK1RoaXMgaXMgYSBwYXJhLgorV2l0aCB0d28gbGluZXMuCitBbmQgbm90IGEgaGVhZGVyLgorPT09PT09PT09PT09PT09PT0KKworPiBCbG9ja3F1b3RlLgorTm90IGEgSGVhZGVyCistCisKK2hlYWRlciB7I2lkfSAgCistLS0tLS0tLS0tLS0KKworaGVhZGVyICAgICAgICB7I0lkfQorPT09PT09CisKK2hlYWRlciB7I0EtWmEtejAtOV86fQorLS0tLS0tCisKK2hlYWRlcnsjbm9pZH0KKy0tLS0tCisKK2hlYWRlcgorLS0tLS0tCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3NldGV4dF9oZWFkZXJfbm9fbmV3bGluZV9hdF9lbmQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvc2V0ZXh0X2hlYWRlcl9ub19uZXdsaW5lX2F0X2VuZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDljM2IKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3NldGV4dF9oZWFkZXJfbm9fbmV3bGluZV9hdF9lbmQuaHRtbApAQCAtMCwwICsxIEBACis8aDE+aGVhZGVyPC9oMT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvc2V0ZXh0X2hlYWRlcl9ub19uZXdsaW5lX2F0X2VuZC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci9zZXRleHRfaGVhZGVyX25vX25ld2xpbmVfYXRfZW5kLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMDc1MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvc2V0ZXh0X2hlYWRlcl9ub19uZXdsaW5lX2F0X2VuZC50ZXh0CkBAIC0wLDAgKzEsMiBAQAoraGVhZGVyCis9PT09PT0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZF9wcmVmaXguaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkX3ByZWZpeC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGQzOTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZF9wcmVmaXguaHRtbApAQCAtMCwwICsxLDMgQEAKKzxoMSBpZD0iaGFsbG9faGVhZGVyLTEiPkhlYWRlciAxPC9oMT4KKworPGgxIGlkPSJoYWxsb19zZWN0aW9uIj4xMjM8L2gxPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRfcHJlZml4Lm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZF9wcmVmaXgub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzMwNWNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRfcHJlZml4Lm9wdGlvbnMKQEAgLTAsMCArMSwyIEBACis6YXV0b19pZHM6IHRydWUKKzphdXRvX2lkX3ByZWZpeDogaGFsbG9fCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZF9wcmVmaXgudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkX3ByZWZpeC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjA5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZF9wcmVmaXgudGV4dApAQCAtMCwwICsxLDMgQEAKKyMgSGVhZGVyIDEKKworIyAxMjMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkX3N0cmlwcGluZy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRfc3RyaXBwaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzNDJjZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkX3N0cmlwcGluZy5odG1sCkBAIC0wLDAgKzEgQEAKKzxoMSBpZD0idGhpcy1pcy1hLWhlYWRlciI+PGVtIGNsYXNzPSJub25lIj5UaGlzIGlzIGEgaGVhZGVyPC9lbT48L2gxPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRfc3RyaXBwaW5nLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZF9zdHJpcHBpbmcub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODgwMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRfc3RyaXBwaW5nLm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOmF1dG9faWRfc3RyaXBwaW5nOiB0cnVlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZF9zdHJpcHBpbmcudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkX3N0cmlwcGluZy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTdiYzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZF9zdHJpcHBpbmcudGV4dApAQCAtMCwwICsxIEBACisjIDxlbSBjbGFzcz0ibm9uZSI+VGhpcyBpcyBhIGhlYWRlcjwvZW0+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZHMuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODEyNmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZHMuaHRtbApAQCAtMCwwICsxLDIxIEBACis8aDEgaWQ9InRoaXMtaXMtYS1oZWFkZXIiPlRoaXMgaXMgYSBoZWFkZXI8L2gxPgorCis8aDIgaWQ9ImFub3RoZXItb25lLTEtaGVyZSI+MTIuIEFub3RoZXIgb25lLTEtaGVyZTwvaDI+CisKKzxoMyBpZD0iZG8tLWl0LW5vdyI+RG8gXiZhbXA7IGl0IG5vdzwvaDM+CisKKzxoMSBpZD0iaGFsbG8iPkhhbGxvPC9oMT4KKworPGgyIGlkPSJub3Qtbm93Ij5Ob3Qgbm93PC9oMj4KKworPGgxIGlkPSJoYWxsby0xIj5IYWxsbzwvaDE+CisKKzxoMSBpZD0ic2VjdGlvbiI+MjMyMzI8L2gxPgorCis8aDEgaWQ9InNlY3Rpb24tMSI+MzMzMzM8L2gxPgorCis8aDIgaWQ9ImhhbGxvLTIiPmhhbGxPPC9oMj4KKworPGgxPkhlYWRlciB3aXRob3V0IElEPC9oMT4KKworPGgxIGlkPSJ0cmFuc2xpdGVyYXRlZC1kYXktbGEtdmktZHUiPlRyYW5zbGl0ZXJhdGVkOiDEkMOieS1sw6AtdsOtLWThu6U8L2gxPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRzLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZHMub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTFmZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA0X2hlYWRlci93aXRoX2F1dG9faWRzLm9wdGlvbnMKQEAgLTAsMCArMSwyIEBACis6YXV0b19pZHM6IHRydWUKKzp0cmFuc2xpdGVyYXRlZF9oZWFkZXJfaWRzOiB0cnVlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZHMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNF9oZWFkZXIvd2l0aF9hdXRvX2lkcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Y2Q5MWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDRfaGVhZGVyL3dpdGhfYXV0b19pZHMudGV4dApAQCAtMCwwICsxLDI0IEBACisjIFRoaXMgaXMgYSBoZWFkZXIKKworIyMgMTIuIEFub3RoZXIgb25lLTEtaGVyZQorCisjIyMgRG8gXiYgaXQgbm93CisKK0hhbGxvCis9PT09PQorCitOb3Qgbm93CistLS0tLS0tCisKKyMgSGFsbG8KKworIyAyMzIzMgorCisjIDMzMzMzCisKKyMjIGhhbGxPCisKKyMgSGVhZGVyIHdpdGhvdXQgSUQKK3s6IGlkPSIifQorCisjIFRyYW5zbGl0ZXJhdGVkOiDEkMOieS1sw6AtdsOtLWThu6UKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL2luZGVudGVkLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS9pbmRlbnRlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNGJiN2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS9pbmRlbnRlZC5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzxibG9ja3F1b3RlPgorICA8cD5BIG5vcm1hbCBibG9ja3F1b3RlLjwvcD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+CisgIDxwPkEgbm9ybWFsIGJsb2NrcXVvdGUuPC9wPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKyAgPHA+QSBub3JtYWwgYmxvY2txdW90ZS48L3A+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorICA8cD5BIG5vcm1hbCBibG9ja3F1b3RlLjwvcD4KKzwvYmxvY2txdW90ZT4KKworPHByZT48Y29kZT4mZ3Q7IEEgY29kZWJsb2NrCis8L2NvZGU+PC9wcmU+CisKKzxibG9ja3F1b3RlPgorICA8cD5CbG9ja3F1b3RlCit3aXRoCittaXhlZAoraW5kZW50cy48L3A+Cis8L2Jsb2NrcXVvdGU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS9pbmRlbnRlZC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvaW5kZW50ZWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg1MGIwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvaW5kZW50ZWQudGV4dApAQCAtMCwwICsxLDE0IEBACis+IEEgbm9ybWFsIGJsb2NrcXVvdGUuCisKKyA+IEEgbm9ybWFsIGJsb2NrcXVvdGUuCisKKyAgPiBBIG5vcm1hbCBibG9ja3F1b3RlLgorCisgICA+IEEgbm9ybWFsIGJsb2NrcXVvdGUuCisKKyAgICA+IEEgY29kZWJsb2NrCisKKz4gQmxvY2txdW90ZQorID4gd2l0aAorICA+bWl4ZWQKKz4gaW5kZW50cy4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL2xhenkuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL2xhenkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGEyMTAyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvbGF6eS5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxibG9ja3F1b3RlPgorICA8cD5UaGlzIGlzIGEgbG9uZworbG9uZyBsaW5lLjwvcD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPk5lc3RlZCBxdW90ZQoraW5zaWRlCitzdGlsbCBpbnNpZGU8L3A+CisgIDwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoaXMgaXMgYSBzdWJxdW90ZS4KK292ZXIgbXVsdGlwbGluZSBsaW5lcy4KK2NvbnRpbnVpbmcKK2hlcmU8L3A+CisgIDwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+CisgIDxwPlRoaXMgaXMgYSBxdW90ZQorICAgIG5vIGNvZGU8L3A+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlIGlkPSJpZCI+CisgIDxwPlRoaXMgaXMgYSBxdW90ZTwvcD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+CisgIDxwPlRoaXMgaXMgYSBxdW90ZTwvcD4KKzwvYmxvY2txdW90ZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL2xhenkudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL2xhenkudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGRlNmE2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvbGF6eS50ZXh0CkBAIC0wLDAgKzEsMjAgQEAKKz4gVGhpcyBpcyBhIGxvbmcKK2xvbmcgbGluZS4KKworPiA+IE5lc3RlZCBxdW90ZQoraW5zaWRlCis+IHN0aWxsIGluc2lkZQorCis+ID4gVGhpcyBpcyBhIHN1YnF1b3RlLgorPiA+IG92ZXIgbXVsdGlwbGluZSBsaW5lcy4KKz4gY29udGludWluZworaGVyZQorCis+IFRoaXMgaXMgYSBxdW90ZQorICAgIG5vIGNvZGUKKworPiBUaGlzIGlzIGEgcXVvdGUKK3s6ICNpZH0KKworPiBUaGlzIGlzIGEgcXVvdGUKK14KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL25lc3RlZC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvbmVzdGVkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjOTRmMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL25lc3RlZC5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxibG9ja3F1b3RlPgorICA8cD5mb288L3A+CisKKyAgPGJsb2NrcXVvdGU+CisgICAgPHA+YmFyCisgYmF6PC9wPgorICA8L2Jsb2NrcXVvdGU+CisKKyAgPHA+Zm9vPC9wPgorPC9ibG9ja3F1b3RlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvbmVzdGVkLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS9uZXN0ZWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc2ODgyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvbmVzdGVkLnRleHQKQEAgLTAsMCArMSw2IEBACis+IGZvbworPgorPiA+IGJhcgorPj4gIGJhegorPgorPiBmb28KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL25vX25ld2xpbmVfYXRfZW5kLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS9ub19uZXdsaW5lX2F0X2VuZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTRhNjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS9ub19uZXdsaW5lX2F0X2VuZC5odG1sCkBAIC0wLDAgKzEsNCBAQAorPGJsb2NrcXVvdGU+CisgIDxwPlRoaXMgaXMgYSBibG9jayBxdW90ZQord2l0aCBubyBuZXdsaW5lLjwvcD4KKzwvYmxvY2txdW90ZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL25vX25ld2xpbmVfYXRfZW5kLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS9ub19uZXdsaW5lX2F0X2VuZC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjY0OGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS9ub19uZXdsaW5lX2F0X2VuZC50ZXh0CkBAIC0wLDAgKzEsMiBAQAorPiBUaGlzIGlzIGEgYmxvY2sgcXVvdGUKKz4gd2l0aCBubyBuZXdsaW5lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL3ZlcnlfbG9uZ19saW5lLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS92ZXJ5X2xvbmdfbGluZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOWFhZjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS92ZXJ5X2xvbmdfbGluZS5odG1sCkBAIC0wLDAgKzEsMyBAQAorPGJsb2NrcXVvdGU+CisgIDxwPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uPC9wPgorPC9ibG9ja3F1b3RlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvdmVyeV9sb25nX2xpbmUudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL3ZlcnlfbG9uZ19saW5lLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiMzNiZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL3ZlcnlfbG9uZ19saW5lLnRleHQKQEAgLTAsMCArMSBAQAorPiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvd2l0aF9jb2RlX2Jsb2Nrcy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA1X2Jsb2NrcXVvdGUvd2l0aF9jb2RlX2Jsb2Nrcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWJkOTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS93aXRoX2NvZGVfYmxvY2tzLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGJsb2NrcXVvdGU+CisgIDxwPkV4YW1wbGU6PC9wPgorCisgIDxwcmU+PGNvZGU+c3ViIHN0YXR1cyB7CisgICAgcHJpbnQgIndvcmtpbmciOworfQorPC9jb2RlPjwvcHJlPgorCisgIDxwPk9yOjwvcD4KKworICA8cHJlPjxjb2RlPnN1YiBzdGF0dXMgeworICAgIHJldHVybiAid29ya2luZyI7Cit9Cis8L2NvZGU+PC9wcmU+Cis8L2Jsb2NrcXVvdGU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS93aXRoX2NvZGVfYmxvY2tzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDVfYmxvY2txdW90ZS93aXRoX2NvZGVfYmxvY2tzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxODhkZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNV9ibG9ja3F1b3RlL3dpdGhfY29kZV9ibG9ja3MudGV4dApAQCAtMCwwICsxLDExIEBACis+RXhhbXBsZToKKz4gCis+ICAgICBzdWIgc3RhdHVzIHsKKz4gICAgICAgICBwcmludCAid29ya2luZyI7Cis+ICAgICB9Cis+IAorPiBPcjoKKz4gCis+ICAgICBzdWIgc3RhdHVzIHsKKz4gICAgICAgICByZXR1cm4gIndvcmtpbmciOworPiAgICAgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9kaXNhYmxlLWhpZ2hsaWdodGluZy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9kaXNhYmxlLWhpZ2hsaWdodGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MmE1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2Rpc2FibGUtaGlnaGxpZ2h0aW5nLmh0bWwKQEAgLTAsMCArMSw0IEBACis8cHJlPjxjb2RlPnggPSBDbGFzcy5uZXcKKzwvY29kZT48L3ByZT4KKzxwcmUgbGFuZz0iaHRtbCI+PGNvZGU+Jmx0O2EmZ3Q7aHJlZiZsdDsvYSZndDsKKzwvY29kZT48L3ByZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svZGlzYWJsZS1oaWdobGlnaHRpbmcub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svZGlzYWJsZS1oaWdobGlnaHRpbmcub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmU5YmMxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9kaXNhYmxlLWhpZ2hsaWdodGluZy5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzplbmFibGVfY29kZXJheTogZmFsc2UKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svZGlzYWJsZS1oaWdobGlnaHRpbmcudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svZGlzYWJsZS1oaWdobGlnaHRpbmcudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjRkMGJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9kaXNhYmxlLWhpZ2hsaWdodGluZy50ZXh0CkBAIC0wLDAgKzEsNCBAQAorICAgIHggPSBDbGFzcy5uZXcKK14KKyAgICA8YT5ocmVmPC9hPgorezogbGFuZz0iaHRtbCJ9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2Vycm9yLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2Vycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmOWRhMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svZXJyb3IuaHRtbApAQCAtMCwwICsxLDQgQEAKKzxwPlNvbWUgcGFyYTwvcD4KKworPHA+fn5+fn5+Citub3QgY29kZWJsb2NrPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9lcnJvci50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9lcnJvci50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWEzNjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2Vycm9yLnRleHQKQEAgLTAsMCArMSw0IEBACitTb21lIHBhcmEKKworfn5+fn5+Citub3QgY29kZWJsb2NrCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1taW50ZWQtd2l0aC1vcHRzLmxhdGV4IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctbWludGVkLXdpdGgtb3B0cy5sYXRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDkyYTFmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctbWludGVkLXdpdGgtb3B0cy5sYXRleApAQCAtMCwwICsxLDkgQEAKK1xiZWdpbnttaW50ZWR9W2JyZWFrbGluZXMsbGluZW5vc117cnVieX0KK3ggPSBDbGFzcy5uZXcKKworXGVuZHttaW50ZWR9CisKK1xiZWdpbnttaW50ZWR9W2JyZWFrbGluZXMsbGluZW5vc117aHRtbH0KKzxhPnRoaXMgaXMgYSByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCByZWFhbGx5LCBsb25nIGxpbms8L2E+CisKK1xlbmR7bWludGVkfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctbWludGVkLXdpdGgtb3B0cy5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctbWludGVkLXdpdGgtb3B0cy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NzNmYzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1taW50ZWQtd2l0aC1vcHRzLm9wdGlvbnMKQEAgLTAsMCArMSw0IEBACis6c3ludGF4X2hpZ2hsaWdodGVyOiBtaW50ZWQKKzpzeW50YXhfaGlnaGxpZ2h0ZXJfb3B0czoKKyAgd3JhcDogdHJ1ZQorICBsaW5lX251bWJlcnM6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLW1pbnRlZC13aXRoLW9wdHMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLW1pbnRlZC13aXRoLW9wdHMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjM2NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctbWludGVkLXdpdGgtb3B0cy50ZXh0CkBAIC0wLDAgKzEsNSBAQAorICAgIHggPSBDbGFzcy5uZXcKK3s6IC5sYW5ndWFnZS1ydWJ5fQorCisgICAgPGE+dGhpcyBpcyBhIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIHJlYWFsbHksIGxvbmcgbGluazwvYT4KK3s6IC5sYW5ndWFnZS1odG1sfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctbWludGVkLmxhdGV4IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctbWludGVkLmxhdGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NGQ2YWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1taW50ZWQubGF0ZXgKQEAgLTAsMCArMSw4IEBACitcYmVnaW57bWludGVkfVtde3J1Ynl9Cit4ID0gQ2xhc3MubmV3CisKK1xlbmR7bWludGVkfQorXGJlZ2lue21pbnRlZH1bXXtodG1sfQorPGE+aHJlZjwvYT4KKworXGVuZHttaW50ZWR9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1taW50ZWQub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLW1pbnRlZC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWUxODkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1taW50ZWQub3B0aW9ucwpAQCAtMCwwICsxLDMgQEAKKzpzeW50YXhfaGlnaGxpZ2h0ZXI6IG1pbnRlZAorOnN5bnRheF9oaWdobGlnaHRlcl9vcHRzOgorICBkZWZhdWx0X2xhbmc6IHJ1YnkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLW1pbnRlZC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctbWludGVkLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjNDc0NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLW1pbnRlZC50ZXh0CkBAIC0wLDAgKzEsNCBAQAorICAgIHggPSBDbGFzcy5uZXcKK14KKyAgICA8YT5ocmVmPC9hPgorezogLmxhbmd1YWdlLWh0bWx9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1vcHRzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1vcHRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyZWE0OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLW9wdHMuaHRtbApAQCAtMCwwICsxLDYgQEAKKzxkaXYgY2xhc3M9Imxhbmd1YWdlLXJ1YnkgaGlnaGxpZ2h0ZXItY29kZXJheSI+PHNwYW4gY2xhc3M9IkNvZGVSYXkiPnggPSA8c3BhbiBjbGFzcz0iY29uc3RhbnQiPkNsYXNzPC9zcGFuPi5uZXcKKzwvc3Bhbj4KKzwvZGl2PgorPGRpdiBjbGFzcz0ibGFuZ3VhZ2UtaHRtbCBoaWdobGlnaHRlci1jb2RlcmF5Ij48c3BhbiBjbGFzcz0iQ29kZVJheSI+PHNwYW4gY2xhc3M9InRhZyI+Jmx0O2EmZ3Q7PC9zcGFuPmhyZWY8c3BhbiBjbGFzcz0idGFnIj4mbHQ7L2EmZ3Q7PC9zcGFuPgorPC9zcGFuPgorPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1vcHRzLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1vcHRzLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMWEzMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLW9wdHMub3B0aW9ucwpAQCAtMCwwICsxLDcgQEAKKzpzeW50YXhfaGlnaGxpZ2h0ZXJfb3B0czoKKyAgYmxvY2s6CisgICAgY3NzOiBjbGFzcworICBkZWZhdWx0X2xhbmc6IHJ1YnkKKyAgd3JhcDogc3BhbgorICBsaW5lX251bWJlcnM6IG51bGwKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctb3B0cy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmctb3B0cy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzQ3NDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy1vcHRzLnRleHQKQEAgLTAsMCArMSw0IEBACisgICAgeCA9IENsYXNzLm5ldworXgorICAgIDxhPmhyZWY8L2E+Cit7OiAubGFuZ3VhZ2UtaHRtbH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmVhNDgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy5odG1sCkBAIC0wLDAgKzEsNiBAQAorPGRpdiBjbGFzcz0ibGFuZ3VhZ2UtcnVieSBoaWdobGlnaHRlci1jb2RlcmF5Ij48c3BhbiBjbGFzcz0iQ29kZVJheSI+eCA9IDxzcGFuIGNsYXNzPSJjb25zdGFudCI+Q2xhc3M8L3NwYW4+Lm5ldworPC9zcGFuPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJsYW5ndWFnZS1odG1sIGhpZ2hsaWdodGVyLWNvZGVyYXkiPjxzcGFuIGNsYXNzPSJDb2RlUmF5Ij48c3BhbiBjbGFzcz0idGFnIj4mbHQ7YSZndDs8L3NwYW4+aHJlZjxzcGFuIGNsYXNzPSJ0YWciPiZsdDsvYSZndDs8L3NwYW4+Cis8L3NwYW4+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzM1MzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2hpZ2hsaWdodGluZy5vcHRpb25zCkBAIC0wLDAgKzEsNSBAQAorOmNvZGVyYXlfZGVmYXVsdF9sYW5nOiBydWJ5Cis6Y29kZXJheV93cmFwOiBzcGFuCis6Y29kZXJheV9saW5lX251bWJlcnM6IH4KKzpjb2RlcmF5X2NzczogY2xhc3MKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9oaWdobGlnaHRpbmcudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjNDc0NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaGlnaGxpZ2h0aW5nLnRleHQKQEAgLTAsMCArMSw0IEBACisgICAgeCA9IENsYXNzLm5ldworXgorICAgIDxhPmhyZWY8L2E+Cit7OiAubGFuZ3VhZ2UtaHRtbH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaXNzdWVfZ2g0NS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9pc3N1ZV9naDQ1Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5NmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaXNzdWVfZ2g0NS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACisKKzxwPkI8L3A+CisKKzxwcmU+PGNvZGU+ICAgICAgICAgICAgICAgICAgICAgICBCQkJCQkJCQi4gCisKKworCisgICAgICAgICAgIEJCQkIgQkIgQkJCQkJCQkIgQkJCQkIuIEJCQkJCQkIgQkIgQkJCQkIgQkIgQkJCIEJCQkIgQkJCQkIgQkJCIEJCQiBCQkJCIEJCQiBCQkJCQkJCIEJCQiBCQkJCQkJCLiBCIEJCQidCIEJCQkJCIEJCQkIgQkJCIEJCQkIgQkJCQkJCQiBCQkJCIEJCQkIgQkJCQiBCQkJCQkJCQi4KKworCisgICAgICAgICAgICAgICAgQkJCIEJCQkJCIEJCQkJCIEJCQiBCQkJCIEJCQkIgQkJCQiwgQkJCIEJCQkJCIEJCIEJCQkJCIEJCQiBCQiBCQkJCQkIgQkJCQiBCQkIgQkJCQkIgQkJCQiBCQi4gQkJCQkIgQkJCIEJCQkJCIEJCQkJCIEJCQiBCQkJCIEJCIEJCQkIgQkJCQiBCQkJCQi4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgQkJCQiBCQkJCQiwgQkJCQkIsIEJCQkJCQkJCPworCisgICAgICAgICAgICAgICAgICAgQkIgQkJCIEJCIEJCQkIgQkJCIEJCQkIgQkJCIEJCQkJCQiAvQkJCIEJCIEJCQkJCQkJCQiBCQkJCIEJCQkJCQkIgQkJCQkJCIEJCIEJCQi4gCisKKworICAgICAgICAgICAgICAgICAgIEJCQkIgQkJCQkJCQkIgQkJCIEJCQkIgQkIgQkJCQkIgQkJCIEJCQkJCQiBCQkJCIEJCQkJCIEJCQkJCQiBCQkJCQkJCQkIgQkJCQiBCQiBCQkJCQi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICAgICAgICAgICAgQkJCQkIgQidCIEJCQiBCQkJCQi4gQkJCQiBCQkJCQiBCQkJCQi4gKCBCIEJCQkJCIEJCQkJCQkJCQkIgQkJCQkIgQkJCQidCIEJCQkJCIEJCQkJCLiBCQkIgQkJCQiBCQkJCQiBCQkJCIEJCQkIuIEJCQkJCQkIgQkJCIEJCIEJCQkJCQkIgQkJCIEJCQiBCIEJCQkIgQkJCQkJCQkJCQkJCLiBCQkJCQiBCQkJCQi4pCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICAgICAgICAgICBCQkJCJ0IgQkIKKzwvY29kZT48L3ByZT4KKworPHA+LjwvcD4KKworPHByZT48Y29kZT4gICAgICAgIEIgQkJCIEJCQiBCQkIgPyBCLiBCIEJCQiBCQkJCQkIgQkJCQiBCQkIgQkJCQi4gQkJCQkJCQiBCQiBCQkJCQkJCIEIgQkJCQiBCQkJCIEJCQiBCQkJCQkIuIAorCisKKworCisKKworCisKKworCisKKworCisgICAgICAgICBCQkJCIEJCICdCQkJCJyBCQkJCIEJCQkJCLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCQkJCQkJCIEIgQkJCQiBCQkJCQkIgQkIgQkJCQkJCQkIgQkJCIEJCQkJCQkIgQkJCQkJCQiBCQkJCQkJCLiAKKworCisgICAgIEIgQkJCQiBCQiBCQkJCLiBCQkJCQiBCQkJCQkJCQi4gQkJCIEJCIEJCLiBCQiBCQiBCQkJCIEJCIEJCQkJCQkJCQkIuIEJCIEJCQkJCQkJCIEJCIEJCQkJCQkJCQi4gCisKKworICAgICAgICAgICAgICAgICAgICAgQkJCQkJCQkIgQkIgQkJCQi4gQkJCQkJCQiBCQkIgQkJCQkIgQkJCQkIgQkJCQkIuIEInQkIgQkJCQkJCQiBCQiBCQkJCQiBCQkJCQiBCQkJCQkJCIEJCQiBCQkJCQi4gQkJCQi4gCisKKyAgQiBCQkJCQkIgQkJCQiBCQiBCQkJCIEJCQi4gKEJCIEJCQiBCQkJCQiBCQkJCQi4uLi4uLi4uLi4uLi4uLkIpCisKKworCisgICAgICAgICAgIEJCQkIhCisKKworCisgICAgICAgICBCQkJCIEJCIEJCQiBCQkJCQkJCIEJCQkJCQi4gICAgICAgICAgICBCCis8L2NvZGU+PC9wcmU+CisKKzxwPkI8L3A+CisKKzxwcmU+PGNvZGU+ICAgICBCQkJCQiBCQi9CQkIgQkJCQkIhICBCQkJCIEJCQkIgQkJCQkJCQkJCQkIgJ0JCQidCIEJCQkJCQi4nIAorCisKKworCisKKworCisKKworCisKKworCisKKyAgICAgICAgICBCQkJCIEJCQkJCQkIgQkJCQiBCQiBCQkIgQkJCQkJCQkIgQkIgQkJCQiBCQkJCQkIgQkJCIEJCQkJCQkJCQiBCQkJCLiBCQkJCQkJCQiBCQkJCQkJCIEJCQkIgQkJCQiBCQkJCIEJCIEJCQkIgQkIgQkJCQiBCQiBCQkJCIEIgQkJCIEJCIEJCQkJCIEJCQkJCQi4gIEIgQkJCQiBCQkJCQkJCIEJCIEJCQkIgQkJCQkIgQiBCQkIgQkJCQkJCQiBCQiBCQkJCQiBCQkJCLiBCQkIgQkJCQkJCQiBCQkJCLiBCIEJCQiBCQkJCIEJCQkIgQiBCQkJCIEJCQkJCQiBCQkIgQiBCQkJCQkIgQkJCQkJCLiBCQkIgQkIgQkJCQkJCIEJCQkJCQiBCQkJCQkJCQkJCIEJCLi4uQkJCQkIgQkJCQiBCQkJCIEJCIEJCQkJCLiAoQkJCQkJCQiBCQkIgQkJCQkJCIEJCQidCIEJCQkIgQkJCIEJCQkJCIEJCQiBCQiBCQkJCQiBCQkJCQkJCQkJCQiAgQkJCQkIgQiBCQkJCIEJCQkIgQkJCQkIuIAorCisKKworCisKKworCisKKworQkJCQkIgQkIgQkIgQkJCQiBCJ0IgQkJCQiBCQkJCQiBCQkJCQiBCQkIgQkIgQkJCQkJCL0JCQiAoQkJCQkIpIEJCQkJCQiBCQi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJCQkJCQkJCLiBCIEJCQiBCQkJCIEJCIEJCIEJCQi9CQkJCQkIgQkJCQkJCIEJCQiBCQkJCIEJCQkJCQkJCIEJCIEJCIEIgQkJCQkJCIEJCQkJCQiBCQkJCQi4gKEJCQi9CIEJCQiBCQkJCIEJCQkIuLi5CQkIgQkJCIEJCQiBCQkJCIEJCIEJCIEIgQkJCQiBCQiBCQkIgQkI/IEJCQkJCQkIgQiBCQkIgQiBCQkJCIEJCQkJCQkJCIEJCQiBCIEJCQiBCQkIgQkJCQkIgQkJCQiBCQkIgQkJCQiBCQiBCIEJCQkJCQkJCIEJCIEJCQkJCIEJCIEJCIEJCQiBCQkJCQiBCQkIgQkIgQkJCQkIgQkJCQkJCQiBCIEJCQiBCQkJCQkJCLiBCQkJCQkIgKEJCQkJCKSBCQkJCIEJCQkJCIEJCQkJCQkIgQkJCQkIgQkJCQiBCQkJCIEJCQi4gMTAwIEJCQkJCQiBCQiBCQkJCQi4gQkJCQiBCQkIgQkJCIEJCQkJCQiBCQkIgQkIuIEJCQiBCQkJCIEJCIEJCQiBCQkJCQiEgQkJCIEJCIEJCQkJCQiBCQkJCQiBCIEJCQidCIEJCQkJCQkJCQiBCQkJCIEJCQiBCQkIuIChCQkJCQkIgQkJCQkJCQiBCQiBCQkJCIEJCQkJCIChCQkJCQkIgQkJCQkIgQkJCQkIgQkJCQkIuKSkKKworCisgICAgQkJCIEIgQkJCQkJCQkJCQkIgQkJCQiBCQkIgQkIgQkJCLiBCQkJCQiBCQkIgQkJCQkIgQiBCQkJCIEJCQkJCQiBCQkJCQiBCQkIuIEJCIEJCQkJCQiBCQkIgQkJCQiBCIEJCQiBCQiBCQkJCQkJCQiBCQkJCQkIgQkJCQiBCQkIgQiBCQkJCQkIgQkJCQiBCQkJCQkIgQkJCQkJCQiBCQkJCIEJCQkIgQkJCIEJCQkJCQkJCLgorCisKKworCisKKworCisKKworCisKKyAgICAgICAgICAgQkJCQkIhISEhISEhCisKKworICAgICAgICAgQiBCQkIgQkJCQiBCQkJCQkIgQkJCQiBCQkJCIEJCQkIgQiBCQkIgQkJCQkIgQkJCIEJCQkJCIEIgQkJCQiBCQkJCQkJCIEJCIEJCIEJCQkIgQkJCQkJCQkJCLiBCIEJCQkIgQkJCQkJCIEJCQkJCQkIgQkJCQiBCQkJCIEJCQiBCQkJCLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCIEJCLCBCQiBCQkJCQkIgQkJCQiwgKEJCQkJCQiBCQiBCQkIgQkJCQiAuIEJCQkJCIEJCIEJCQkIgQkJCQiBCQiBCQiBCQkJCIEJCQkIgQiBCQkJCIEJCIEJCIChCQiBCQkJCIEJCIEJCQiBCQkJCQkJCIEJCIEJCQkJCQkIuICkpIEJCJ0JCIEJCQiBCQkInQiBCQiBCQiBCQkJCIEJCIEIgQkJCQiBCIEJCQkJCIChCQiBCQkJCQkIgQkIgQkJCIEInQkIgQkJCQkJCQkIgQkIgQkJCQiBCQkJCLikKKworCisgIEIgQkJCQkIgQidCQiBCQkIgQkIgQkJCQiBCQkIgQkJCLgorPC9jb2RlPjwvcHJlPgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2lzc3VlX2doNDUudGVzdCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svaXNzdWVfZ2g0NS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjg5MDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2lzc3VlX2doNDUudGVzdApAQCAtMCwwICsxLDE4OCBAQAorICAgDQorIA0KKyBCDQorIA0KKyANCisgDQorIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCQkJCQkJCLiANCisNCisNCisNCisgICAgICAgICAgICAgICBCQkJCIEJCIEJCQkJCQkJCIEJCQkJCLiBCQkJCQkJCIEJCIEJCQkJCIEJCIEJCQiBCQkJCIEJCQkJCIEJCQiBCQkIgQkJCQiBCQkIgQkJCQkJCQiBCQkIgQkJCQkJCQi4gQiBCQkInQiBCQkJCQiBCQkJCIEJCQiBCQkJCIEJCQkJCQkIgQkJCQiBCQkJCIEJCQkIgQkJCQkJCQkIuDQorDQorDQorICAgICAgICAgICAgICAgICAgICBCQkIgQkJCQkIgQkJCQkIgQkJCIEJCQkIgQkJCQiBCQkJCLCBCQkIgQkJCQkIgQkIgQkJCQkIgQkJCIEJCIEJCQkJCQiBCQkJCIEJCQiBCQkJCQiBCQkJCIEJCLiBCQkJCQiBCQkIgQkJCQkIgQkJCQkIgQkJCIEJCQkIgQkIgQkJCQiBCQkJCIEJCQkJCLg0KKw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkJCQiBCQkJCQiwgQkJCQkIsIEJCQkJCQkJCPw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgQkIgQkJCIEJCIEJCQkIgQkJCIEJCQkIgQkJCIEJCQkJCQiAvQkJCIEJCIEJCQkJCQkJCQiBCQkJCIEJCQkJCQkIgQkJCQkJCIEJCIEJCQi4gDQorDQorDQorICAgICAgICAgICAgICAgICAgICAgICBCQkJCIEJCQkJCQkJCIEJCQiBCQkJCIEJCIEJCQkJCIEJCQiBCQkJCQkIgQkJCQiBCQkJCQiBCQkJCQkIgQkJCQkJCQkJCIEJCQkIgQkIgQkJCQkIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorICAgICAgICAgICAgICAgICAgQkJCQkIgQidCIEJCQiBCQkJCQi4gQkJCQiBCQkJCQiBCQkJCQi4gKCBCIEJCQkJCIEJCQkJCQkJCQkIgQkJCQkIgQkJCQidCIEJCQkJCIEJCQkJCLiBCQkIgQkJCQiBCQkJCQiBCQkJCIEJCQkIuIEJCQkJCQkIgQkJCIEJCIEJCQkJCQkIgQkJCIEJCQiBCIEJCQkIgQkJCQkJCQkJCQkJCLiBCQkJCQiBCQkJCQi4pDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorICAgICAgICAgICAgICAgICBCQkJCJ0IgQkINCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisuDQorDQorICAgICAgICAgICAgQiBCQkIgQkJCIEJCQiA/IEIuIEIgQkJCIEJCQkJCQiBCQkJCIEJCQiBCQkJCLiBCQkJCQkJCIEJCIEJCQkJCQkIgQiBCQkJCIEJCQkIgQkJCIEJCQkJCQi4gDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorICAgICAgICAgICAgIEJCQkIgQkIgJ0JCQkInIEJCQkIgQkJCQkIuDQorDQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCQkJCQkJCIEIgQkJCQiBCQkJCQkIgQkIgQkJCQkJCQkIgQkJCIEJCQkJCQkIgQkJCQkJCQiBCQkJCQkJCLiANCisNCisNCisgICAgICAgICBCIEJCQkIgQkIgQkJCQi4gQkJCQkIgQkJCQkJCQkIuIEJCQiBCQiBCQi4gQkIgQkIgQkJCQiBCQiBCQkJCQkJCQkJCLiBCQiBCQkJCQkJCQiBCQiBCQkJCQkJCQkIuIA0KKw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICBCQkJCQkJCQiBCQiBCQkJCLiBCQkJCQkJCIEJCQiBCQkJCQiBCQkJCQiBCQkJCQi4gQidCQiBCQkJCQkJCIEJCIEJCQkJCIEJCQkJCIEJCQkJCQkIgQkJCIEJCQkJCLiBCQkJCLiANCisNCisgICAgICBCIEJCQkJCQiBCQkJCIEJCIEJCQkIgQkJCLiAoQkIgQkJCIEJCQkJCIEJCQkJCLi4uLi4uLi4uLi4uLi4uQikNCisNCisNCisNCisgICAgICAgICAgICAgICBCQkJCIQ0KKw0KKw0KKw0KKyAgICAgICAgICAgICBCQkJCIEJCIEJCQiBCQkJCQkJCIEJCQkJCQi4gICAgICAgICAgIA0KK0INCisNCitCDQorDQorDQorDQorICAgICAgICAgQkJCQkIgQkIvQkJCIEJCQkJCISAgQkJCQiBCQkJCIEJCQkJCQkJCQkJCICdCQkInQiBCQkJCQkIuJyANCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisgICAgICAgICAgICAgIEJCQkIgQkJCQkJCQiBCQkJCIEJCIEJCQiBCQkJCQkJCQiBCQiBCQkJCIEJCQkJCQiBCQkIgQkJCQkJCQkJCIEJCQkIuIEJCQkJCQkJCIEJCQkJCQkIgQkJCQiBCQkJCIEJCQkIgQkIgQkJCQiBCQiBCQkJCIEJCIEJCQkIgQiBCQkIgQkIgQkJCQkIgQkJCQkJCLiAgQiBCQkJCIEJCQkJCQkIgQkIgQkJCQiBCQkJCQiBCIEJCQiBCQkJCQkJCIEJCIEJCQkJCIEJCQkIuIEJCQiBCQkJCQkJCIEJCQkIuIEIgQkJCIEJCQkIgQkJCQiBCIEJCQkIgQkJCQkJCIEJCQiBCIEJCQkJCQiBCQkJCQkIuIEJCQiBCQiBCQkJCQkIgQkJCQkJCIEJCQkJCQkJCQkIgQkIuLi5CQkJCQiBCQkJCIEJCQkIgQkIgQkJCQkIuIChCQkJCQkJCIEJCQiBCQkJCQkIgQkJCJ0IgQkJCQiBCQkIgQkJCQkIgQkJCIEJCIEJCQkJCIEJCQkJCQkJCQkJCICBCQkJCQiBCIEJCQkIgQkJCQiBCQkJCQi4gDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorICAgIEJCQkJCIEJCIEJCIEJCQkIgQidCIEJCQkIgQkJCQkIgQkJCQkIgQkJCIEJCIEJCQkJCQi9CQkIgKEJCQkJCKSBCQkJCQkIgQkIuIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCQkJCQkJCLiBCIEJCQiBCQkJCIEJCIEJCIEJCQi9CQkJCQkIgQkJCQkJCIEJCQiBCQkJCIEJCQkJCQkJCIEJCIEJCIEIgQkJCQkJCIEJCQkJCQiBCQkJCQi4gKEJCQi9CIEJCQiBCQkJCIEJCQkIuLi5CQkIgQkJCIEJCQiBCQkJCIEJCIEJCIEIgQkJCQiBCQiBCQkIgQkI/IEJCQkJCQkIgQiBCQkIgQiBCQkJCIEJCQkJCQkJCIEJCQiBCIEJCQiBCQkIgQkJCQkIgQkJCQiBCQkIgQkJCQiBCQiBCIEJCQkJCQkJCIEJCIEJCQkJCIEJCIEJCIEJCQiBCQkJCQiBCQkIgQkIgQkJCQkIgQkJCQkJCQiBCIEJCQiBCQkJCQkJCLiBCQkJCQkIgKEJCQkJCKSBCQkJCIEJCQkJCIEJCQkJCQkIgQkJCQkIgQkJCQiBCQkJCIEJCQi4gMTAwIEJCQkJCQiBCQiBCQkJCQi4gQkJCQiBCQkIgQkJCIEJCQkJCQiBCQkIgQkIuIEJCQiBCQkJCIEJCIEJCQiBCQkJCQiEgQkJCIEJCIEJCQkJCQiBCQkJCQiBCIEJCQidCIEJCQkJCQkJCQiBCQkJCIEJCQiBCQkIuIChCQkJCQkIgQkJCQkJCQiBCQiBCQkJCIEJCQkJCIChCQkJCQkIgQkJCQkIgQkJCQkIgQkJCQkIuKSkNCisNCisNCisgICAgICAgIEJCQiBCIEJCQkJCQkJCQkJCIEJCQkIgQkJCIEJCIEJCQi4gQkJCQkIgQkJCIEJCQkJCIEIgQkJCQiBCQkJCQkIgQkJCQkIgQkJCLiBCQiBCQkJCQkIgQkJCIEJCQkIgQiBCQkIgQkIgQkJCQkJCQkIgQkJCQkJCIEJCQkIgQkJCIEIgQkJCQkJCIEJCQkIgQkJCQkJCIEJCQkJCQkIgQkJCQiBCQkJCIEJCQiBCQkJCQkJCQi4NCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisNCisgICAgICAgICAgICAgICBCQkJCQiEhISEhISENCisNCisNCisgICAgICAgICAgICAgQiBCQkIgQkJCQiBCQkJCQkIgQkJCQiBCQkJCIEJCQkIgQiBCQkIgQkJCQkIgQkJCIEJCQkJCIEIgQkJCQiBCQkJCQkJCIEJCIEJCIEJCQkIgQkJCQkJCQkJCLiBCIEJCQkIgQkJCQkJCIEJCQkJCQkIgQkJCQiBCQkJCIEJCQiBCQkJCLg0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCIEJCLCBCQiBCQkJCQkIgQkJCQiwgKEJCQkJCQiBCQiBCQkIgQkJCQiAuIEJCQkJCIEJCIEJCQkIgQkJCQiBCQiBCQiBCQkJCIEJCQkIgQiBCQkJCIEJCIEJCIChCQiBCQkJCIEJCIEJCQiBCQkJCQkJCIEJCIEJCQkJCQkIuICkpIEJCJ0JCIEJCQiBCQkInQiBCQiBCQiBCQkJCIEJCIEIgQkJCQiBCIEJCQkJCIChCQiBCQkJCQkIgQkIgQkJCIEInQkIgQkJCQkJCQkIgQkIgQkJCQiBCQkJCLikNCisNCisNCisgICAgICBCIEJCQkJCIEInQkIgQkJCIEJCIEJCQkIgQkJCIEJCQi4NCisNCisNCisgICAgICAgDQorDQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9sYXp5Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2xhenkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzE4OGYyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9sYXp5Lmh0bWwKQEAgLTAsMCArMSw0IEBACis8cHJlPjxjb2RlPlRoaXMgaXMgc29tZSBjb2RlCisKK1RoaXMgaXMgc29tZSAgb3RoZXIgY29kZQorPC9jb2RlPjwvcHJlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9sYXp5LnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL2xhenkudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTk1ZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9sYXp5LnRleHQKQEAgLTAsMCArMSw1IEBACisgICAgVGhpcyBpcyBzb21lCitjb2RlCisKKyAgICBUaGlzIGlzIHNvbWUKKyBvdGhlciBjb2RlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vX25ld2xpbmVfYXRfZW5kLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vX25ld2xpbmVfYXRfZW5kLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwMDNiMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svbm9fbmV3bGluZV9hdF9lbmQuaHRtbApAQCAtMCwwICsxLDIgQEAKKzxwcmU+PGNvZGU+dGVzdCAgCis8L2NvZGU+PC9wcmU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vX25ld2xpbmVfYXRfZW5kLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vX25ld2xpbmVfYXRfZW5kLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0NTYzZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svbm9fbmV3bGluZV9hdF9lbmQudGV4dApAQCAtMCwwICsxIEBACisgICAgdGVzdCAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9ub19uZXdsaW5lX2F0X2VuZF8xLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vX25ld2xpbmVfYXRfZW5kXzEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU4NzBlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9ub19uZXdsaW5lX2F0X2VuZF8xLmh0bWwKQEAgLTAsMCArMSwyIEBACis8cHJlPjxjb2RlPnRlc3QgICB0ZXN0Cis8L2NvZGU+PC9wcmU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vX25ld2xpbmVfYXRfZW5kXzEudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svbm9fbmV3bGluZV9hdF9lbmRfMS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZGY3MWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vX25ld2xpbmVfYXRfZW5kXzEudGV4dApAQCAtMCwwICsxLDIgQEAKKyAgICB0ZXN0ICAKK3Rlc3QKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svbm9ybWFsLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vcm1hbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZDJjMWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vcm1hbC5odG1sCkBAIC0wLDAgKzEsMTMgQEAKKzxwcmU+PGNvZGU+c3RhcnRpbmcgY29kZQorPC9jb2RlPjwvcHJlPgorCis8cD5wYXJhZ3JhcGg8L3A+CisKKzxwcmU+PGNvZGU+b3RoZXIgY29kZSAgCit3aXRoIHNhbXBsZXMgCis8L2NvZGU+PC9wcmU+CisKKzxwPnBhcmFncmFwaDwvcD4KKworPHByZT48Y29kZT4gIGVuZGluZyBjb2RlCis8L2NvZGU+PC9wcmU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL25vcm1hbC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9ub3JtYWwudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVhNzAyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9ub3JtYWwudGV4dApAQCAtMCwwICsxLDEwIEBACisgICAgc3RhcnRpbmcgY29kZQorCitwYXJhZ3JhcGgKKworICAgIG90aGVyIGNvZGUgIAorICAgIHdpdGggc2FtcGxlcyAKKworcGFyYWdyYXBoCisKKyAgICAgIGVuZGluZyBjb2RlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL2Rpc2FibGVkLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL2Rpc2FibGVkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjMzRkMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvZGlzYWJsZWQuaHRtbApAQCAtMCwwICsxLDIgQEAKKzxwcmU+PGNvZGU+eCA9IENsYXNzLm5ldworPC9jb2RlPjwvcHJlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9kaXNhYmxlZC5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9kaXNhYmxlZC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODg4MjgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL2Rpc2FibGVkLm9wdGlvbnMKQEAgLTAsMCArMSw0IEBACis6c3ludGF4X2hpZ2hsaWdodGVyOiByb3VnZQorOnN5bnRheF9oaWdobGlnaHRlcl9vcHRzOgorICBibG9jazoKKyAgICBkaXNhYmxlOiB0cnVlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL2Rpc2FibGVkLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL2Rpc2FibGVkLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1MGI0MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvZGlzYWJsZWQudGV4dApAQCAtMCwwICsxIEBACisgICAgeCA9IENsYXNzLm5ldwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9tdWx0aXBsZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9tdWx0aXBsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2FmNzkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL211bHRpcGxlLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGRpdiBjbGFzcz0ibGFuZ3VhZ2UtcnVieSBoaWdobGlnaHRlci1yb3VnZSI+PGRpdiBjbGFzcz0iY3VzdG9tLWNsYXNzIj48cHJlIGNsYXNzPSJoaWdobGlnaHQiPjxjb2RlPjxzcGFuIGNsYXNzPSJuYiI+cHV0czwvc3Bhbj4gPHNwYW4gY2xhc3M9InMyIj4iSGVsbG8iPC9zcGFuPgorPC9jb2RlPjwvcHJlPgorPC9kaXY+PC9kaXY+CisKKzxkaXYgY2xhc3M9Imxhbmd1YWdlLXJ1YnkgaGlnaGxpZ2h0ZXItcm91Z2UiPjxkaXYgY2xhc3M9ImN1c3RvbS1jbGFzcyI+PHByZSBjbGFzcz0iaGlnaGxpZ2h0Ij48Y29kZT48c3BhbiBjbGFzcz0ibmIiPnB1dHM8L3NwYW4+IDxzcGFuIGNsYXNzPSJzMiI+IldvcmxkIjwvc3Bhbj4KKzwvY29kZT48L3ByZT4KKzwvZGl2PjwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYW5ndWFnZS1waHAgaGlnaGxpZ2h0ZXItcm91Z2UiPjxkaXYgY2xhc3M9ImN1c3RvbS1jbGFzcyI+PHByZSBjbGFzcz0iaGlnaGxpZ2h0Ij48Y29kZT48c3BhbiBjbGFzcz0ibnYiPiRmb288L3NwYW4+IDxzcGFuIGNsYXNzPSJvIj49PC9zcGFuPiA8c3BhbiBjbGFzcz0iayI+bmV3PC9zcGFuPiA8c3BhbiBjbGFzcz0ibngiPkJhcjwvc3Bhbj48c3BhbiBjbGFzcz0icCI+Ozwvc3Bhbj4KKzwvY29kZT48L3ByZT4KKzwvZGl2PjwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9tdWx0aXBsZS5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9tdWx0aXBsZS5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OWU3YjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL211bHRpcGxlLm9wdGlvbnMKQEAgLTAsMCArMSw0IEBACis6c3ludGF4X2hpZ2hsaWdodGVyOiByb3VnZQorOnN5bnRheF9oaWdobGlnaHRlcl9vcHRzOgorICBkZWZhdWx0X2xhbmc6IHJ1YnkKKyAgZm9ybWF0dGVyOiAhcnVieS9jbGFzcyAnUm91Z2VIVE1MRm9ybWF0dGVycycKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvbXVsdGlwbGUudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2UvbXVsdGlwbGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRkMjgzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9tdWx0aXBsZS50ZXh0CkBAIC0wLDAgKzEsMTEgQEAKK35+fiBydWJ5CitwdXRzICJIZWxsbyIKK35+fgorCit+fn4gcnVieQorcHV0cyAiV29ybGQiCit+fn4KKworfn5+IHBocD9zdGFydF9pbmxpbmU9MQorJGZvbyA9IG5ldyBCYXI7Cit+fn4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL3NpbXBsZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9zaW1wbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ3MWNmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9zaW1wbGUuaHRtbApAQCAtMCwwICsxLDEwIEBACis8ZGl2IGNsYXNzPSJsYW5ndWFnZS1ydWJ5IGhpZ2hsaWdodGVyLXJvdWdlIj48cHJlIGNsYXNzPSJoaWdobGlnaHQiPjxjb2RlPjxzcGFuIGNsYXNzPSJuIj54PC9zcGFuPiA8c3BhbiBjbGFzcz0ibyI+PTwvc3Bhbj4gPHNwYW4gY2xhc3M9Im5vIj5DbGFzczwvc3Bhbj48c3BhbiBjbGFzcz0icCI+Ljwvc3Bhbj48c3BhbiBjbGFzcz0ibmYiPm5ldzwvc3Bhbj4KKzwvY29kZT48L3ByZT4KKzwvZGl2PgorPGRpdiBjbGFzcz0ibGFuZ3VhZ2UtaHRtbCBoaWdobGlnaHRlci1yb3VnZSI+PHByZSBjbGFzcz0iaGlnaGxpZ2h0Ij48Y29kZT48c3BhbiBjbGFzcz0ibnQiPiZsdDthJmd0Ozwvc3Bhbj5ocmVmPHNwYW4gY2xhc3M9Im50Ij4mbHQ7L2EmZ3Q7PC9zcGFuPgorPC9jb2RlPjwvcHJlPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9Imxhbmd1YWdlLXBocCBoaWdobGlnaHRlci1yb3VnZSI+PHByZSBjbGFzcz0iaGlnaGxpZ2h0Ij48Y29kZT48c3BhbiBjbGFzcz0ibnYiPiRmb288L3NwYW4+IDxzcGFuIGNsYXNzPSJvIj49PC9zcGFuPiA8c3BhbiBjbGFzcz0iayI+bmV3PC9zcGFuPiA8c3BhbiBjbGFzcz0ibngiPkJhcjwvc3Bhbj48c3BhbiBjbGFzcz0icCI+Ozwvc3Bhbj4KKzwvY29kZT48L3ByZT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay9yb3VnZS9zaW1wbGUub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2Uvc2ltcGxlLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5ZTBmZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2Uvc2ltcGxlLm9wdGlvbnMKQEAgLTAsMCArMSwzIEBACis6c3ludGF4X2hpZ2hsaWdodGVyOiByb3VnZQorOnN5bnRheF9oaWdobGlnaHRlcl9vcHRzOgorICBkZWZhdWx0X2xhbmc6IHJ1YnkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svcm91Z2Uvc2ltcGxlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL3NpbXBsZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzQwZTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3JvdWdlL3NpbXBsZS50ZXh0CkBAIC0wLDAgKzEsOSBAQAorICAgIHggPSBDbGFzcy5uZXcKK14KKyAgICA8YT5ocmVmPC9hPgorezogLmxhbmd1YWdlLWh0bWx9CisKKworfn5+IHBocD9zdGFydF9pbmxpbmU9MQorJGZvbyA9IG5ldyBCYXI7Cit+fn4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svdGlsZGVfc3ludGF4Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3RpbGRlX3N5bnRheC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZGQ5MWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3RpbGRlX3N5bnRheC5odG1sCkBAIC0wLDAgKzEsNyBAQAorPHByZT48Y29kZT5IZXJlIGNvbWVzIHNvbWUgY29kZS4KKzwvY29kZT48L3ByZT4KKworPHByZT48Y29kZT5+fn5+fn5+Citjb2RlIHdpdGggdGlsZGVzCit+fn5+fn5+fgorPC9jb2RlPjwvcHJlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay90aWxkZV9zeW50YXgudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svdGlsZGVfc3ludGF4LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyNWExYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svdGlsZGVfc3ludGF4LnRleHQKQEAgLTAsMCArMSw5IEBACit+fn5+fn5+fgorSGVyZSBjb21lcyBzb21lIGNvZGUuCit+fn5+fn5+fgorCit+fn5+fn5+fn5+fn4KK35+fn5+fn4KK2NvZGUgd2l0aCB0aWxkZXMKK35+fn5+fn5+Cit+fn5+fn5+fn5+fn5+fn5+fn4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2hpdGVzcGFjZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aGl0ZXNwYWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiYjQwZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2hpdGVzcGFjZS5odG1sCkBAIC0wLDAgKzEsMyBAQAorPHByZSBjbGFzcz0ic2hvdy13aGl0ZXNwYWNlcyI+PGNvZGU+VGhpczxzcGFuIGNsYXNzPSJ3cy10YWIiPgk8L3NwYW4+aXM8c3BhbiBjbGFzcz0id3Mtc3BhY2UiPiYjODkwMTs8L3NwYW4+c29tZTxzcGFuIGNsYXNzPSJ3cy1zcGFjZS1yIj4mIzg5MDE7PC9zcGFuPjxzcGFuIGNsYXNzPSJ3cy1zcGFjZS1yIj4mIzg5MDE7PC9zcGFuPgorPHNwYW4gY2xhc3M9IndzLXNwYWNlLWwiPiYjODkwMTs8L3NwYW4+PHNwYW4gY2xhc3M9IndzLXNwYWNlLWwiPiYjODkwMTs8L3NwYW4+PHNwYW4gY2xhc3M9IndzLXNwYWNlLWwiPiYjODkwMTs8L3NwYW4+PHNwYW4gY2xhc3M9IndzLXNwYWNlLWwiPiYjODkwMTs8L3NwYW4+d2hpdGVzcGFjZTxzcGFuIGNsYXNzPSJ3cy1zcGFjZS1yIj4mIzg5MDE7PC9zcGFuPjxzcGFuIGNsYXNzPSJ3cy1zcGFjZS1yIj4mIzg5MDE7PC9zcGFuPgorPC9jb2RlPjwvcHJlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aGl0ZXNwYWNlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3doaXRlc3BhY2UudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTVjOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aGl0ZXNwYWNlLnRleHQKQEAgLTAsMCArMSwzIEBACisgICAgVGhpcwlpcyBzb21lICAKKyAgICAgICAgd2hpdGVzcGFjZSAgCit7Oi5zaG93LXdoaXRlc3BhY2VzfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2JsYW5rX2xpbmUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9ibGFua19saW5lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjMjBiMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9ibGFua19saW5lLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPHA+cGFyYWdyYXBoPC9wPgorCis8cHJlPjxjb2RlPmNvZGUgYmxvY2sKKworY29udGludWVkIGhlcmUKKzwvY29kZT48L3ByZT4KKworPHA+ZW5kZWQ8L3A+CisKKzxwcmU+PGNvZGU+bmV4dCBibGFuayBsaW5lIGhhcyA0IHNwYWNlcworPC9jb2RlPjwvcHJlPgorCis8cD5wYXJhZ3JhcGg8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfYmxhbmtfbGluZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2JsYW5rX2xpbmUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTFkZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2JsYW5rX2xpbmUudGV4dApAQCAtMCwwICsxLDEyIEBACitwYXJhZ3JhcGgKKworICAgIGNvZGUgYmxvY2sKKworICAgIGNvbnRpbnVlZCBoZXJlCisgICAgCisKK2VuZGVkCisKKyAgICBuZXh0IGJsYW5rIGxpbmUgaGFzIDQgc3BhY2VzCisgICAgCitwYXJhZ3JhcGgKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9lb2JfbWFya2VyLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfZW9iX21hcmtlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTE3YTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfZW9iX21hcmtlci5odG1sCkBAIC0wLDAgKzEsNiBAQAorPHByZT48Y29kZT5jb2RlIGJsb2NrCisKK2NvbnRpbnVlZCBoZXJlCis8L2NvZGU+PC9wcmU+Cis8cHJlPjxjb2RlPm5ldyBibG9jayBoZXJlCis8L2NvZGU+PC9wcmU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfZW9iX21hcmtlci50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2VvYl9tYXJrZXIudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzRjNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2VvYl9tYXJrZXIudGV4dApAQCAtMCwwICsxLDUgQEAKKyAgICBjb2RlIGJsb2NrCisKKyAgICBjb250aW51ZWQgaGVyZQorXgorICAgIG5ldyBibG9jayBoZXJlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfaWFsLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfaWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwODViMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9pYWwuaHRtbApAQCAtMCwwICsxLDYgQEAKKzxwcmUgY2xhc3M9ImNscyI+PGNvZGU+Y29kZSBibG9jaworCitjb250aW51ZWQgaGVyZQorPC9jb2RlPjwvcHJlPgorPHByZT48Y29kZT5uZXcgYmxvY2sgaGVyZQorPC9jb2RlPjwvcHJlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2lhbC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2lhbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODlmMmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfaWFsLnRleHQKQEAgLTAsMCArMSw1IEBACisgICAgY29kZSBibG9jaworCisgICAgY29udGludWVkIGhlcmUKK3s6LmNsc30KKyAgICBuZXcgYmxvY2sgaGVyZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2suaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTg3MmMzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrLmh0bWwKQEAgLTAsMCArMSwyNCBAQAorPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtcnVieSI+ZGVmIHdoYXQ/CisgIDQyCitlbmQKKzwvY29kZT48L3ByZT4KKworPHByZSBjbGFzcz0iY2xhc3MxIj48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtcnVieSI+ZGVmIHdoYXQ/CisgIDQyCitlbmQKKzwvY29kZT48L3ByZT4KKworPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtcnVieSI+ZGVmIHdoYXQ/CisgIDQyCitlbmQKKzwvY29kZT48L3ByZT4KKworPHByZSBjbGFzcz0ibGFuZ3VhZ2UtcHl0aG9uIj48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtcnVieSI+ZGVmIHdoYXQ/CisgIDQyCitlbmQKKzwvY29kZT48L3ByZT4KKworPHByZSBjbGFzcz0ibGFuZ3VhZ2UtcHl0aG9uIj48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtcnVieSI+ZGVmIHdoYXQ/CisgIDQyCitlbmQKKzwvY29kZT48L3ByZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9jay5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxOTIzYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9jay5vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorOmVuYWJsZV9jb2RlcmF5OiBmYWxzZQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2sudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9jay50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjQzN2UKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2sudGV4dApAQCAtMCwwICsxLDMzIEBACit+fn4gcnVieQorZGVmIHdoYXQ/CisgIDQyCitlbmQKK35+fgorCit+fn4gcnVieQorZGVmIHdoYXQ/CisgIDQyCitlbmQKK35+fgorezouY2xhc3MxfQorCit+fn4KK2RlZiB3aGF0PworICA0MgorZW5kCit+fn4KK3s6IC5sYW5ndWFnZS1ydWJ5fQorCit+fn4gcnVieQorZGVmIHdoYXQ/CisgIDQyCitlbmQKK35+fgorezogLmxhbmd1YWdlLXB5dGhvbn0KKworfn5+IHJ1YnkKK2RlZiB3aGF0PworICA0MgorZW5kCit+fn4KK3s6IGNsYXNzPSJsYW5ndWFnZS1weXRob24ifQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrX2FueV9jaGFyLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2tfYW55X2NoYXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTMwYjFlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrX2FueV9jaGFyLmh0bWwKQEAgLTAsMCArMSw4IEBACis8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS1hc24uMSI+dGV4dAorPC9jb2RlPjwvcHJlPgorCis8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS1hc24jdzEiPnRleHQKKzwvY29kZT48L3ByZT4KKworPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2Ut0YDRg9GB0YHQutC40LkiPnRleHQKKzwvY29kZT48L3ByZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9ja19hbnlfY2hhci5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrX2FueV9jaGFyLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxOTIzYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9ja19hbnlfY2hhci5vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorOmVuYWJsZV9jb2RlcmF5OiBmYWxzZQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2tfYW55X2NoYXIudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9ja19hbnlfY2hhci50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDI0YTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2tfYW55X2NoYXIudGV4dApAQCAtMCwwICsxLDExIEBACit+fn4gYXNuLjEKK3RleHQKK35+fgorCit+fn4gYXNuI3cxCit0ZXh0Cit+fn4KKworfn5+INGA0YPRgdGB0LrQuNC5Cit0ZXh0Cit+fn4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9ja19uYW1lX3dpdGhfZGFzaC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrX25hbWVfd2l0aF9kYXNoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0YjYwZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9ja19uYW1lX3dpdGhfZGFzaC5odG1sCkBAIC0wLDAgKzEsMyBAQAorPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtYWN0LWlpaSI+czEnZGltJ2EnNTAwJ20nNTAwJ3EnNTAwJycKK2luZGV4J2onaisxJ2otMScnCis8L2NvZGU+PC9wcmU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2tfbmFtZV93aXRoX2Rhc2gub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wNl9jb2RlYmxvY2svd2l0aF9sYW5nX2luX2ZlbmNlZF9ibG9ja19uYW1lX3dpdGhfZGFzaC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTkyM2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2tfbmFtZV93aXRoX2Rhc2gub3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKKzplbmFibGVfY29kZXJheTogZmFsc2UKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrX25hbWVfd2l0aF9kYXNoLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDZfY29kZWJsb2NrL3dpdGhfbGFuZ19pbl9mZW5jZWRfYmxvY2tfbmFtZV93aXRoX2Rhc2gudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjNkNWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA2X2NvZGVibG9jay93aXRoX2xhbmdfaW5fZmVuY2VkX2Jsb2NrX25hbWVfd2l0aF9kYXNoLnRleHQKQEAgLTAsMCArMSw0IEBACit+fn4gYWN0LWlpaQorczEnZGltJ2EnNTAwJ20nNTAwJ3EnNTAwJycKK2luZGV4J2onaisxJ2otMScnCit+fn4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvZXJyb3IuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvZXJyb3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjAxYmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA3X2hvcml6b250YWxfcnVsZS9lcnJvci5odG1sCkBAIC0wLDAgKzEsNyBAQAorPHA+XyAqIF88L3A+CisKKzxwPiYjODIxMjsgKiAqICo8L3A+CisKKzxwPl8gLSAqPC9wPgorCis8cD4mIzgyMTI7JiM4MjEyOyYjODIxMjsmIzgyMTI7JiM4MjEyOyYjODIxMjsmIzgyMTI7JiM4MjEyOyYjODIxMjsmIzgyMTI7JiM4MjEyOyYjODIxMjsmIzgyMTI7JiM4MjEyOyYjODIxMjstIHRlc3Q8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL2Vycm9yLmh0bWwuMTkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL2Vycm9yLmh0bWwuMTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4ODExYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvZXJyb3IuaHRtbC4xOQpAQCAtMCwwICsxLDcgQEAKKzxwPl8gKiBfPC9wPgorCis8cD7igJQgKiAqICo8L3A+CisKKzxwPl8gLSAqPC9wPgorCis8cD7igJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJQtIHRlc3Q8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL2Vycm9yLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL2Vycm9yLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyNDcxMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvZXJyb3IudGV4dApAQCAtMCwwICsxLDcgQEAKK18gKiBfCisKKy0tLSAqICogKgorCitfIC0gKgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlc3QKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvbm9ybWFsLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL25vcm1hbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NGI2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL25vcm1hbC5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzxociAvPgorPGhyIC8+Cis8aHIgLz4KKworPHA+ZC0gLTwvcD4KKworPGhyIC8+Cis8aHIgLz4KKzxociAvPgorCis8aDI+cGFyYTwvaDI+Cis8cD50ZXh0PC9wPgorCis8aHIgLz4KKworPHByZT48Y29kZT4tIC0gLQorPC9jb2RlPjwvcHJlPgorCis8aHIgY2xhc3M9InRlc3QiIC8+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL25vcm1hbC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA3X2hvcml6b250YWxfcnVsZS9ub3JtYWwudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODYxMDFhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA3X2hvcml6b250YWxfcnVsZS9ub3JtYWwudGV4dApAQCAtMCwwICsxLDIwIEBACisqKioKKyogKiAqCistICAtIC0gICAKKworZC0gLQorCistLS0KK19fXworKioqCisKK3BhcmEKKy0tLS0tLS0tLS0tCit0ZXh0CisKKyogKiAqCisKKyAgICAtIC0gLQorCisqICogKgorezoudGVzdH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvc2Vwc3BhY2VzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL3NlcHNwYWNlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjg2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL3NlcHNwYWNlcy5odG1sCkBAIC0wLDAgKzEsMyBAQAorPGhyIC8+Cis8aHIgLz4KKzxociAvPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA3X2hvcml6b250YWxfcnVsZS9zZXBzcGFjZXMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvc2Vwc3BhY2VzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3OThiMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvc2Vwc3BhY2VzLnRleHQKQEAgLTAsMCArMSwzIEBACistIC0gLQorKiAgICAgICogICAgICAqCitfICBfIF8gICAgXyAgXwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA3X2hvcml6b250YWxfcnVsZS9zZXB0YWJzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL3NlcHRhYnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmI4NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA3X2hvcml6b250YWxfcnVsZS9zZXB0YWJzLmh0bWwKQEAgLTAsMCArMSwzIEBACis8aHIgLz4KKzxociAvPgorPGhyIC8+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL3NlcHRhYnMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wN19ob3Jpem9udGFsX3J1bGUvc2VwdGFicy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGZlMjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDdfaG9yaXpvbnRhbF9ydWxlL3NlcHRhYnMudGV4dApAQCAtMCwwICsxLDMgQEAKKy0JLQktCisqCQkqCQkqCitfCQlfCV8JCQlfCV8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2VzY2FwaW5nLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9lc2NhcGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYzc5NWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9lc2NhcGluZy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzxwPkkgaGF2ZSByZWFkIHRoZSBib29rCisxOTg0LiBJdCB3YXMgZ3JlYXQKKy0gb3RoZXIgc2F5IHRoYXQsIHRvbyE8L3A+CisKKzxwPkkgaGF2ZSByZWFkIHRoZSBib29rCisxOTg0LiBJdCB3YXMgZ3JlYXQKKy0gb3RoZXIgc2F5IHRoYXQsIHRvbyE8L3A+CisKKzxwPkkgaGF2ZSByZWFkIHRoZSBib29rCisgIDE5ODQuIEl0IHdhcyBncmVhdC48L3A+CisKKzxwPkkgaGF2ZSByZWFkIHRoZSBib29rIDE5ODQuCisgIC0gaXQgd2FzIGdyZWF0ITwvcD4KKworPHA+MTk4NC4gV2FzIGdyZWF0ITwvcD4KKworPHA+LSBUaGlzIHRvbyE8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9lc2NhcGluZy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvZXNjYXBpbmcudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2IxYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvZXNjYXBpbmcudGV4dApAQCAtMCwwICsxLDE3IEBACitJIGhhdmUgcmVhZCB0aGUgYm9vaworMTk4NC4gSXQgd2FzIGdyZWF0CistIG90aGVyIHNheSB0aGF0LCB0b28hCisKK0kgaGF2ZSByZWFkIHRoZSBib29rCisxOTg0XC4gSXQgd2FzIGdyZWF0CitcLSBvdGhlciBzYXkgdGhhdCwgdG9vIQorCitJIGhhdmUgcmVhZCB0aGUgYm9vaworICAxOTg0LiBJdCB3YXMgZ3JlYXQuCisKK0kgaGF2ZSByZWFkIHRoZSBib29rIDE5ODQuCisgIC0gaXQgd2FzIGdyZWF0IQorCisxOTg0XC4gV2FzIGdyZWF0IQorCitcLSBUaGlzIHRvbyEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2l0ZW1faWFsLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9pdGVtX2lhbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZGZkM2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9pdGVtX2lhbC5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzx1bD4KKyAgPGxpIGNsYXNzPSJjbHMiPklBTCBhdCBmaXJzdAorY29udGludWVkPC9saT4KKyAgPGxpPmFub3RoZXIgezouY2xzfTwvbGk+CisgIDxsaSBjbGFzcz0iY2xzIj5JQUwgYXQgbGFzdAorICAgIGNvZGU8L2xpPgorICA8bGk+WAorICB0ZXN0PC9saT4KKyAgPGxpPlggT0s8L2xpPgorPC91bD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2l0ZW1faWFsLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9pdGVtX2lhbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmVlNzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9pdGVtX2lhbC50ZXh0CkBAIC0wLDAgKzEsOCBAQAorKiAgIHs6LmNsc30gSUFMIGF0IGZpcnN0CisgICAgY29udGludWVkCisqIGFub3RoZXIgezouY2xzfQorKiB7Oi5jbHN9IElBTCBhdCBsYXN0CisgICAgICBjb2RlCisqIHs6Om5vbWFya2Rvd24gdHlwZT0iaHRtbCJ9WHs6L25vbWFya2Rvd259CisgICAgdGVzdAorKiB7Ojpub21hcmtkb3duIHR5cGU9Imh0bWwifVh7Oi9ub21hcmtkb3dufSBPSwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGF6eS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGF6eS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTVmOWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9sYXp5Lmh0bWwKQEAgLTAsMCArMSwzOSBAQAorPHVsPgorICA8bGk+VGhpcyBpcyBhIHNpbXBsZQorbGlzdCBpdGVtPC9saT4KKyAgPGxpPgorICAgIDxwPkZvbGxvd2VkIGJ5IGFub3RoZXIKK2xpc3QgaXRlbTwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPkZvbGxvd2VkIGJ5PC9wPgorCisgICAgPHA+YSBwYXJhIGxpc3QgaXRlbQorY29udGludWVkIGhlcmU8L3A+CisgIDwvbGk+CisgIDxsaT5hbmQgYSBub3JtYWwgb25lPC9saT4KKyAgPGxpPgorICAgIDxwPmFuZDwvcD4KKworICAgIDxwPmEgcGFyYQorY29udGludWVkIGhlcmU8L3A+CisgIDwvbGk+Cis8L3VsPgorCis8cD5wYXJhPC9wPgorCis8dWw+CisgIDxsaT5tdWx0aSBsaW5lCitsaXN0IGl0ZW08L2xpPgorPC91bD4KKworPHA+cGFyYTwvcD4KKworPHVsPgorICA8bGk+bGlzdCBpdGVtIGxpbmUxCisgb25lIGxpbmUKKyAgdHdvIGxpbmVzPC9saT4KKyAgPGxpPmxpc3QgaXRlbSBsaW5lMgorb25lIGxpbmUKK3R3byBsaW5lczwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGF6eS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGF6eS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzI0MjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9sYXp5LnRleHQKQEAgLTAsMCArMSwyOSBAQAorKiBUaGlzIGlzIGEgc2ltcGxlCitsaXN0IGl0ZW0KKyogRm9sbG93ZWQgYnkgYW5vdGhlcgorbGlzdCBpdGVtCisKKworKiBGb2xsb3dlZCBieQorCisgICAgYSBwYXJhIGxpc3QgaXRlbQorY29udGludWVkIGhlcmUKKyogYW5kIGEgbm9ybWFsIG9uZQorKiBhbmQKKworICAgIGEgcGFyYQorY29udGludWVkIGhlcmUKKworcGFyYQorCisqIG11bHRpIGxpbmUKK2xpc3QgaXRlbQorCitwYXJhCisKKyogIGxpc3QgaXRlbSBsaW5lMQorIG9uZSBsaW5lCisgIHR3byBsaW5lcworKiAgbGlzdCBpdGVtIGxpbmUyCisgICBvbmUgbGluZQordHdvIGxpbmVzCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9sYXp5X2FuZF9uZXN0ZWQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2xhenlfYW5kX25lc3RlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzc0NDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9sYXp5X2FuZF9uZXN0ZWQuaHRtbApAQCAtMCwwICsxLDkgQEAKKzxvbD4KKyAgPGxpPlJvb3QgbGV2ZWwKKyAgKiBTZWNvbmQgbGV2ZWwKKyAgICA8dWw+CisgICAgICA8bGk+VGhpcmQgbGV2ZWwKKyAgICAgICogQmFjayB0byBzZWNvbmQgbGV2ZWw8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+Cis8L29sPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGF6eV9hbmRfbmVzdGVkLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9sYXp5X2FuZF9uZXN0ZWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2E3NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGF6eV9hbmRfbmVzdGVkLnRleHQKQEAgLTAsMCArMSw0IEBACisxLiBSb290IGxldmVsCisgICogU2Vjb25kIGxldmVsCisgICAgKiBUaGlyZCBsZXZlbAorICAqIEJhY2sgdG8gc2Vjb25kIGxldmVsCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9saXN0X2FuZF9oci5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGlzdF9hbmRfaHIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y1MWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGlzdF9hbmRfaHIuaHRtbApAQCAtMCwwICsxLDkgQEAKKzx1bD4KKyAgPGxpPlN0YXJ0aW5nIGEgbGlzdDwvbGk+Cis8L3VsPgorCis8aHIgLz4KKworPHVsPgorICA8bGk+U3RhcnRpbmcgYSBuZXcgbGlzdDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGlzdF9hbmRfaHIudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2xpc3RfYW5kX2hyLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmY2Q0NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2xpc3RfYW5kX2hyLnRleHQKQEAgLTAsMCArMSw1IEBACisqIFN0YXJ0aW5nIGEgbGlzdAorCisqICogKgorCisqIFN0YXJ0aW5nIGEgbmV3IGxpc3QKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2xpc3RfYW5kX290aGVycy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbGlzdF9hbmRfb3RoZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyNDI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2xpc3RfYW5kX290aGVycy5odG1sCkBAIC0wLDAgKzEsNDAgQEAKKzx1bD4KKyAgPGxpPmxpc3QgaXRlbTwvbGk+Cis8L3VsPgorCis8YmxvY2txdW90ZT4KKyAgPHA+YmxvY2txdW90ZTwvcD4KKzwvYmxvY2txdW90ZT4KKworPHA+cGFyYQorKiAqICoKK3BhcmEKKyAgLSBubyBsaXN0PC9wPgorCis8dWw+CisgIDxsaT4KKyAgICA8cD5pdGVtPC9wPgorCisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cD5ibG9jazwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+CisKKyAgICA8aDI+aGVhZGVyPC9oMj4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPnRlc3Q8L3A+CisKKyAgICA8cHJlPjxjb2RlPmNvZGVibG9jaworPC9jb2RlPjwvcHJlPgorCisgICAgPHA+dGVzdDwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPnRlc3Q8L3A+CisKKyAgICA8cHJlPjxjb2RlPmNvZGVibG9jaworPC9jb2RlPjwvcHJlPgorCisgICAgPHA+dGVzdDwvcD4KKyAgPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9saXN0X2FuZF9vdGhlcnMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L2xpc3RfYW5kX290aGVycy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODAyNjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9saXN0X2FuZF9vdGhlcnMudGV4dApAQCAtMCwwICsxLDI2IEBACisqIGxpc3QgaXRlbQorCis+IGJsb2NrcXVvdGUKKworcGFyYQorKiAqICoKK3BhcmEKKyAgLSBubyBsaXN0CisKKysgaXRlbQorCisgID4gYmxvY2sKKworICAjIyBoZWFkZXIKKworKiB0ZXN0CisKKyAgICAgIGNvZGVibG9jaworCisgIHRlc3QKKworKgl0ZXN0CisKKwkJY29kZWJsb2NrCisKKwl0ZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9taXhlZC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbWl4ZWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM0N2UzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbWl4ZWQuaHRtbApAQCAtMCwwICsxLDExNyBAQAorPHA+V2l0aCB0YWJzL3NwYWNlcywgbm8gcGFyYXM6PC9wPgorCis8dWw+CisgIDxsaT5pdGVtMTwvbGk+CisgIDxsaT5pdGVtMjwvbGk+CisgIDxsaT5pdGVtMzwvbGk+Cis8L3VsPgorCis8cD5XaXRoIHRhYnMvc3BhY2VzLCBwYXJhczo8L3A+CisKKzx1bD4KKyAgPGxpPgorICAgIDxwPml0ZW0xPC9wPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+aXRlbTI8L3A+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8cD5pdGVtMzwvcD4KKyAgPC9saT4KKzwvdWw+CisKKzxwPldpdGggdGFicy9zcGFjZXMsIG5vIHBhcmFzOjwvcD4KKworPG9sPgorICA8bGk+aXRlbTE8L2xpPgorICA8bGk+aXRlbTI8L2xpPgorICA8bGk+aXRlbTM8L2xpPgorPC9vbD4KKworPHA+V2l0aCB0YWJzL3NwYWNlcywgcGFyYXM6PC9wPgorCis8b2w+CisgIDxsaT4KKyAgICA8cD5pdGVtMTwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPml0ZW0yPC9wPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+aXRlbTM8L3A+CisgIDwvbGk+Cis8L29sPgorCis8cD5OZXN0ZWQsIHdpdGhvdXQgcGFyYXM6PC9wPgorCis8dWw+CisgIDxsaT5pdGVtMQorICAgIDx1bD4KKyAgICAgIDxsaT5pdGVtMgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPml0ZW0zPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKzwvdWw+CisKKzxwPk5lc3RlZCwgd2l0aCBwYXJhczo8L3A+CisKKzx1bD4KKyAgPGxpPgorICAgIDxwPml0ZW0xPC9wPgorCisgICAgPHVsPgorICAgICAgPGxpPml0ZW0yCisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aXRlbTMgKGxldmVsIDMpPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKzwvdWw+CisKKzxwPk9yZGVyZWQsIHdpdGhvdXQgcGFyYXM6PC9wPgorCis8b2w+CisgIDxsaT5pdGVtMTwvbGk+CisgIDxsaT5pdGVtMgorICAgIDx1bD4KKyAgICAgIDxsaT5kbzwvbGk+CisgICAgICA8bGk+aXQ8L2xpPgorICAgICAgPGxpPm5vdzwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKyAgPGxpPml0ZW0zPC9saT4KKzwvb2w+CisKKzxwPk9yZGVyZWQsIHdpdGggcGFyYXM6PC9wPgorCis8b2w+CisgIDxsaT4KKyAgICA8cD5pdGVtMTwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPml0ZW0yPC9wPgorCisgICAgPHVsPgorICAgICAgPGxpPmRvPC9saT4KKyAgICAgIDxsaT5pdDwvbGk+CisgICAgICA8bGk+bm93PC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+aXRlbTM8L3A+CisgIDwvbGk+Cis8L29sPgorCis8cD5NaXhlZCB0YWJzIGFuZCBzcGFjZXM6PC9wPgorCis8dWw+CisgIDxsaT5zb21lIHRleHQKKyAgICA8dWw+CisgICAgICA8bGk+bmVzdGVkPC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorPC91bD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L21peGVkLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9taXhlZC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjU3OGQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9taXhlZC50ZXh0CkBAIC0wLDAgKzEsNjYgQEAKK1dpdGggdGFicy9zcGFjZXMsIG5vIHBhcmFzOgorCisqCWl0ZW0xCisrICAgaXRlbTIKKy0JaXRlbTMKKworV2l0aCB0YWJzL3NwYWNlcywgcGFyYXM6CisKKy0JaXRlbTEKKworKiAgIGl0ZW0yCisKKysJaXRlbTMKKworV2l0aCB0YWJzL3NwYWNlcywgbm8gcGFyYXM6CisKKzEuCWl0ZW0xCisyMC4gaXRlbTIKKzMuCWl0ZW0zCisKK1dpdGggdGFicy9zcGFjZXMsIHBhcmFzOgorCisxLglpdGVtMQorCisyLiAgaXRlbTIKKworMy4JaXRlbTMKKworTmVzdGVkLCB3aXRob3V0IHBhcmFzOgorCisqCWl0ZW0xCisgICAgKiAgICBpdGVtMgorCSAgICAgKglpdGVtMworCitOZXN0ZWQsIHdpdGggcGFyYXM6CisKKysgICBpdGVtMQorCisJKiBpdGVtMgorICAgICAgKiBpdGVtMyAobGV2ZWwgMykKKworT3JkZXJlZCwgd2l0aG91dCBwYXJhczoKKworMS4gaXRlbTEKKzIuIGl0ZW0yCisJKiBkbworICAgICogaXQKKyAgICAqIG5vdworMy4gaXRlbTMKKworT3JkZXJlZCwgd2l0aCBwYXJhczoKKworMS4gaXRlbTEKKworMi4gaXRlbTIKKworCSogZG8KKyAgICAqIGl0CisgICAgKiBub3cKKworMy4gaXRlbTMKKworTWl4ZWQgdGFicyBhbmQgc3BhY2VzOgorCisqIAkgIAlzb21lIHRleHQKKyAgICAgICAgKiBuZXN0ZWQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L25lc3RlZC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbmVzdGVkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyMWVlOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L25lc3RlZC5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzx1bD4KKyAgPGxpPnNvbWUgaXRlbQorICAgIDx1bD4KKyAgICAgIDxsaT5uZXN0ZWQ8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT5sYXN0IGl0ZW08L2xpPgorPC91bD4KKzx1bD4KKyAgPGxpPgorICAgIDxwPnNvbWUgdGV4dDwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT5uZXN0ZWQ8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbmVzdGVkLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9uZXN0ZWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzFkODY0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3QvbmVzdGVkLnRleHQKQEAgLTAsMCArMSw3IEBACisqIHNvbWUgaXRlbQorICAgICogbmVzdGVkCisqIGxhc3QgaXRlbQorXgorKglzb21lIHRleHQKKworCSogbmVzdGVkCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9vdGhlcl9maXJzdF9lbGVtZW50Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9vdGhlcl9maXJzdF9lbGVtZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0Y2QwZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L290aGVyX2ZpcnN0X2VsZW1lbnQuaHRtbApAQCAtMCwwICsxLDM5IEBACis8dWw+CisgIDxsaT4KKyAgICA8cHJlPjxjb2RlPlRoaXMgaXMgYSBjb2RlIGJsb2NrLgorPC9jb2RlPjwvcHJlPgorICA8L2xpPgorICA8bGk+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cD5UaGlzIGlzIGEgYmxvY2txdW90ZS48L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2xpPgorICA8bGk+CisgICAgPGgyPkEgaGVhZGVyPC9oMj4KKyAgPC9saT4KKzwvdWw+Cis8dWw+CisgIDxsaT4KKyAgICA8cHJlPjxjb2RlPlRoaXMgaXMgYSBjb2RlIGJsb2NrLgorPC9jb2RlPjwvcHJlPgorICA8L2xpPgorICA8bGk+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cD5UaGlzIGlzIGEgYmxvY2txdW90ZS4KK2NvbnRpbnVlZCBieSBzb21lIHBhcmEuPC9wPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxoMT5BIGhlYWRlcjwvaDE+CisgICAgPHA+YSBwYXJhPC9wPgorICA8L2xpPgorPC91bD4KKzx1bD4KKyAgPGxpPgorICAgIDx1bD4KKyAgICAgIDxsaT5uZXN0ZWQgbGlzdDwvbGk+CisgICAgICA8bGk+b3RoZXIgbmVzdGVkIGl0ZW08L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT5pdGVtIDI8L2xpPgorPC91bD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L290aGVyX2ZpcnN0X2VsZW1lbnQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L290aGVyX2ZpcnN0X2VsZW1lbnQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjFjZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvb3RoZXJfZmlyc3RfZWxlbWVudC50ZXh0CkBAIC0wLDAgKzEsMTggQEAKKyogCisgICAgICAgIFRoaXMgaXMgYSBjb2RlIGJsb2NrLgorKiAgID4gVGhpcyBpcyBhIGJsb2NrcXVvdGUuCisqICAgIyMgQSBoZWFkZXIKK14KKyogCisgICAgICAgIFRoaXMgaXMgYSBjb2RlIGJsb2NrLgorCisqICAgID4gVGhpcyBpcyBhIGJsb2NrcXVvdGUuCisgICAgIGNvbnRpbnVlZCBieSBzb21lIHBhcmEuCisKKyogICBBIGhlYWRlcgorICAgID09PT09PT09PQorICAgIGEgcGFyYQorXgorKiAgICogbmVzdGVkIGxpc3QKKyAgICAqIG90aGVyIG5lc3RlZCBpdGVtCisqICAgaXRlbSAyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zaW1wbGVfb2wuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L3NpbXBsZV9vbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTVhNmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zaW1wbGVfb2wuaHRtbApAQCAtMCwwICsxLDE5IEBACis8b2w+CisgIDxsaT5UaGlzIGlzIGEgc2ltcGxlIGxpc3QgaXRlbTwvbGk+CisgIDxsaT4KKyAgICA8cD5Gb2xsb3dlZCBieSBhbm90aGVyPC9wPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+Rm9sbG93ZWQgYnk8L3A+CisKKyAgICA8cD5hIHBhcmEgbGlzdCBpdGVtPC9wPgorICA8L2xpPgorICA8bGk+YW5kIGEgbm9ybWFsIG9uZTwvbGk+CisgIDxsaT4KKyAgICA8cD5hbmQ8L3A+CisKKyAgICA8cD5hIHBhcmE8L3A+CisgIDwvbGk+Cis8L29sPgorCis8cD5wYXJhPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvc2ltcGxlX29sLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zaW1wbGVfb2wudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWY3ZGFlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvc2ltcGxlX29sLnRleHQKQEAgLTAsMCArMSwxMyBAQAorMS4gVGhpcyBpcyBhIHNpbXBsZSBsaXN0IGl0ZW0KKzMuIEZvbGxvd2VkIGJ5IGFub3RoZXIKKworCisxMC4JRm9sbG93ZWQgYnkKKworICAgIGEgcGFyYSBsaXN0IGl0ZW0KKzEuIGFuZCBhIG5vcm1hbCBvbmUKKzIuIGFuZAorCisgICAgYSBwYXJhCisKK3BhcmEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L3NpbXBsZV91bC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvc2ltcGxlX3VsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkYjA1ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L3NpbXBsZV91bC5odG1sCkBAIC0wLDAgKzEsNDggQEAKKzx1bD4KKyAgPGxpPlRoaXMgaXMgYSBzaW1wbGUgbGlzdCBpdGVtPC9saT4KKyAgPGxpPgorICAgIDxwPkZvbGxvd2VkIGJ5IGFub3RoZXI8L3A+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8cD5Gb2xsb3dlZCBieTwvcD4KKworICAgIDxwPmEgcGFyYSBsaXN0IGl0ZW08L3A+CisgIDwvbGk+CisgIDxsaT5hbmQgYSBub3JtYWwgb25lPC9saT4KKyAgPGxpPgorICAgIDxwPmFuZDwvcD4KKworICAgIDxwPmEgcGFyYTwvcD4KKyAgPC9saT4KKzwvdWw+CisKKzxwPnBhcmE8L3A+CisKKzx1bD4KKyAgPGxpPm11bHRpIGxpbmUKK2xpc3QgaXRlbTwvbGk+Cis8L3VsPgorCis8cD5wYXJhPC9wPgorCis8dWw+CisgIDxsaT5saXN0IGl0ZW0gbGluZTEKK29uZSBsaW5lCit0d28gbGluZXM8L2xpPgorICA8bGk+bGlzdCBpdGVtIGxpbmUyCitvbmUgbGluZQordHdvIGxpbmVzPC9saT4KKzwvdWw+CisKKzxwPnBhcmE8L3A+CisKKzx1bD4KKyAgPGxpPmxpc3QgaXRlbSBsaW5lMworb25lIGxpbmUKK3R3byBsaW5lczwvbGk+CisgIDxsaT5saXN0IGl0ZW0gbGluZTQKKyBvbmUgbGluZQorICB0d28gbGluZXM8L2xpPgorPC91bD4KKworPHA+cGFyYTwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L3NpbXBsZV91bC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvc2ltcGxlX3VsLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkMjVjMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L3NpbXBsZV91bC50ZXh0CkBAIC0wLDAgKzEsMzYgQEAKKyogVGhpcyBpcyBhIHNpbXBsZSBsaXN0IGl0ZW0KKyogRm9sbG93ZWQgYnkgYW5vdGhlcgorCisKKyogRm9sbG93ZWQgYnkKKworICAgIGEgcGFyYSBsaXN0IGl0ZW0KKyogYW5kIGEgbm9ybWFsIG9uZQorKiBhbmQKKworICAgIGEgcGFyYQorCitwYXJhCisKKyogbXVsdGkgbGluZQorICBsaXN0IGl0ZW0KKworcGFyYQorCisqICBsaXN0IGl0ZW0gbGluZTEKKyAgIG9uZSBsaW5lCisgICB0d28gbGluZXMKKyogIGxpc3QgaXRlbSBsaW5lMgorICAgb25lIGxpbmUKKyAgIHR3byBsaW5lcworCitwYXJhCisKKyogICBsaXN0IGl0ZW0gbGluZTMKKyAgICBvbmUgbGluZQorICAgIHR3byBsaW5lcworKiAgbGlzdCBpdGVtIGxpbmU0CisgICAgb25lIGxpbmUKKyAgICAgdHdvIGxpbmVzCisKK3BhcmEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L3NpbmdsZV9pdGVtLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zaW5nbGVfaXRlbS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzk0NjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zaW5nbGVfaXRlbS5odG1sCkBAIC0wLDAgKzEsMyBAQAorPHVsPgorICA8bGk+c2luZ2xlPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zaW5nbGVfaXRlbS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvc2luZ2xlX2l0ZW0udGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzdkMzY5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvc2luZ2xlX2l0ZW0udGV4dApAQCAtMCwwICsxIEBACisqIHNpbmdsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvc3BlY2lhbF9jYXNlcy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA4X2xpc3Qvc3BlY2lhbF9jYXNlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzc3NWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zcGVjaWFsX2Nhc2VzLmh0bWwKQEAgLTAsMCArMSw2MiBAQAorPHVsPgorICA8bGk+CisgICAgPHA+bm90IGEgcGFyYQoraGVyZTwvcD4KKworICAgIDxibG9ja3F1b3RlPgorICAgICAgPHA+YmxvY2txdW90ZTwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8cD5hbmQgbm90CisgIGhlcmU8L3A+CisKKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwPmJsb2NrcXVvdGU8L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+dGhpcyBpcyBhIHBhcmE8L3A+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwPmJsb2NrcXVvdGU8L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+dGhpcyB0b288L3A+CisgIDwvbGk+Cis8L3VsPgorCis8cD5BIHBhcmFncmFwaAorICAxLiBmb2xsb3dlZCBub3QgYnkgb2wKKy0gZm9sbG93ZWQgbm90IGJ5IHVsPC9wPgorCis8cD5BIGNvbXBhY3QgbGlzdDo8L3A+CisKKzx1bD4KKyAgPGxpPmNvbXBhY3Q8L2xpPgorICA8bGk+bGlzdDwvbGk+CisgIDxsaT5pdGVtczwvbGk+Cis8L3VsPgorCis8cD5BIG5vcm1hbCBsaXN0OjwvcD4KKworPHVsPgorICA8bGk+CisgICAgPHA+bm90PC9wPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+Y29tcGFjdDwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPmJ1dCBoZXJlPC9wPgorICA8L2xpPgorPC91bD4KKworPHA+TGlzdCBpdGVtIHdpdGhvdXQgY29udGVudDo8L3A+CisKKzx1bD4KKyAgPGxpPjwvbGk+CisgIDxsaT5hPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zcGVjaWFsX2Nhc2VzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDhfbGlzdC9zcGVjaWFsX2Nhc2VzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwNjMwNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOF9saXN0L3NwZWNpYWxfY2FzZXMudGV4dApAQCAtMCwwICsxLDQwIEBACisqIG5vdCBhIHBhcmEKKyAgaGVyZQorCisgICAgPiBibG9ja3F1b3RlCisKKyogYW5kIG5vdAorICAgIGhlcmUKKworICAgID5ibG9ja3F1b3RlCisKKyogdGhpcyBpcyBhIHBhcmEKKworKiA+IGJsb2NrcXVvdGUKKworKiB0aGlzIHRvbworCiteCisKK0EgcGFyYWdyYXBoCisgIDEuIGZvbGxvd2VkIG5vdCBieSBvbAorLSBmb2xsb3dlZCBub3QgYnkgdWwKKworQSBjb21wYWN0IGxpc3Q6CisKKyogY29tcGFjdAorKiBsaXN0CisqIGl0ZW1zCisKK0Egbm9ybWFsIGxpc3Q6CisKKyogbm90CisKKyogY29tcGFjdAorCisqIGJ1dCBoZXJlCisKK0xpc3QgaXRlbSB3aXRob3V0IGNvbnRlbnQ6CisKKyogCisqIGEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbW1lbnQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbW1lbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDMxYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvY29tbWVudC5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhLS1jb21tZW50LS0+CisKKzxwPnBhcmExPC9wPgorCis8IS0tIENvbW1lbnQgLS0+CisKKzxwPnBhcmEyPC9wPgorCis8IS0tCitCbGFoCitCbGFoCistLT4KKzxwPnBhcmE8L3A+CisKKzxibG9ja3F1b3RlPgorICA8cD5UaGlzIGlzCis8IS0tIGEgY29tbWVudCAtLT48L3A+Cis8L2Jsb2NrcXVvdGU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9jb21tZW50LnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9jb21tZW50LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzMmJmMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbW1lbnQudGV4dApAQCAtMCwwICsxLDE1IEBACis8IS0tY29tbWVudC0tPgorCitwYXJhMQorCis8IS0tIENvbW1lbnQgLS0+CisKK3BhcmEyCisKKzwhLS0KK0JsYWgKK0JsYWgKKy0tPiBwYXJhCisKKz4gVGhpcyBpcworPiA8IS0tIGEgY29tbWVudCAtLT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvZGVmbGlzdHMuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvZGVmbGlzdHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODdkNTVhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvY29udGVudF9tb2RlbC9kZWZsaXN0cy5odG1sCkBAIC0wLDAgKzEsNiBAQAorPGRsPgorICA8ZHQ+PGVtPnRleHQ8L2VtPjwvZHQ+CisgIDxkZD4KKyAgICA8cD5wYXJhPC9wPgorICA8L2RkPgorPC9kbD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvZGVmbGlzdHMub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvZGVmbGlzdHMub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYwZGEyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvY29udGVudF9tb2RlbC9kZWZsaXN0cy5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzpwYXJzZV9ibG9ja19odG1sOiB0cnVlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9jb250ZW50X21vZGVsL2RlZmxpc3RzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9jb250ZW50X21vZGVsL2RlZmxpc3RzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzODFkMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvZGVmbGlzdHMudGV4dApAQCAtMCwwICsxLDYgQEAKKzxkbD4KKzxkdD4qdGV4dCo8L2R0PgorPGRkPgorcGFyYQorPC9kZD4KKzwvZGw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9jb250ZW50X21vZGVsL3RhYmxlcy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvY29udGVudF9tb2RlbC90YWJsZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTFkYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvY29udGVudF9tb2RlbC90YWJsZXMuaHRtbApAQCAtMCwwICsxLDE0IEBACis8dGFibGUgY2xhc3M9ImV4YW1wbGVzIj4KKzx0cj4KKyAgPHRoPjxlbT5Vc2FnZTwvZW0+PC90aD4KKyAgPHRoPgorT3V0cHV0CisgIDwvdGg+Cis8L3RyPgorPHRyPgorICA8dGQ+U29tZSA8ZW0+ZGF0YTwvZW0+PC90ZD4KKyAgPHRkPgorICAgICAgPGgxIGlkPSJzb21lLW1vcmUiPlNvbWUgbW9yZTwvaDE+CisgICAgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvY29udGVudF9tb2RlbC90YWJsZXMub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvdGFibGVzLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2MGRhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvdGFibGVzLm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOnBhcnNlX2Jsb2NrX2h0bWw6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2NvbnRlbnRfbW9kZWwvdGFibGVzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9jb250ZW50X21vZGVsL3RhYmxlcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwY2YyZTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9jb250ZW50X21vZGVsL3RhYmxlcy50ZXh0CkBAIC0wLDAgKzEsMTQgQEAKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZXMiPgorPHRyPgorICA8dGggbWFya2Rvd249InNwYW4iPipVc2FnZSo8L3RoPgorICA8dGg+CitPdXRwdXQKKyAgPC90aD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBtYXJrZG93bj0ic3BhbiI+U29tZSAqZGF0YSo8L3RkPgorICA8dGQgbWFya2Rvd249IjEiPgorIyBTb21lIG1vcmUKKyAgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbDVfYXR0cmlidXRlcy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbDVfYXR0cmlidXRlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OGE0MzIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sNV9hdHRyaWJ1dGVzLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPHAgbGFuZz0iZW4iIHN0eWxlPSJub3RoaW5nIiBjbGFzcz0iIj5wYXJhZ3JhcGg8L3A+CisKKzxwIGxhbmc9ImVuIiBzdHlsZT0ibm90aGluZyIgY2xhc3M9IiI+cGFyYWdyYXBoPC9wPgorCis8cCBsYW5nPSJlbiIgc3R5bGU9Im5vdGhpbmciIGNsYXNzPSIiPnBhcmFncmFwaDwvcD4KKworPHAgbGFuZz0iZW4iIGNsYXNzPSIiIHN0eWxlPSJub3RoaW5nIj5wYXJhZ3JhcGg8L3A+CisKKzxwIGNsYXNzPSIiIGxhbmc9ImVuIiBzdHlsZT0ibm90aGluZyI+cGFyYWdyYXBoPC9wPgorCis8cCBjbGFzcz0iIj5wYXJhZ3JhcGg8L3A+CisKKzxwIGNsYXNzPSIiPnBhcmFncmFwaDwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWw1X2F0dHJpYnV0ZXMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWw1X2F0dHJpYnV0ZXMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTE4MmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbDVfYXR0cmlidXRlcy50ZXh0CkBAIC0wLDAgKzEsMTMgQEAKKzxwIGxhbmc9ImVuIiBzdHlsZT0nbm90aGluZycgY2xhc3M+cGFyYWdyYXBoPC9wPgorCis8cCBsYW5nPSdlbicgc3R5bGU9Im5vdGhpbmciIGNsYXNzPnBhcmFncmFwaDwvcD4KKworPHAgbGFuZz0nZW4nIHN0eWxlPSJub3RoaW5nIiBjbGFzcyA+cGFyYWdyYXBoPC9wPgorCis8cCBsYW5nPSdlbicgY2xhc3Mgc3R5bGU9Im5vdGhpbmciPnBhcmFncmFwaDwvcD4KKworPHAgY2xhc3MgbGFuZz0nZW4nIHN0eWxlPSJub3RoaW5nIj5wYXJhZ3JhcGg8L3A+CisKKzxwIGNMYVNzPnBhcmFncmFwaDwvcD4KKworPHAgY2xhc3MgPnBhcmFncmFwaDwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfYWZ0ZXJfYmxvY2suaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfYWZ0ZXJfYmxvY2suaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTFjNzViCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF9hZnRlcl9ibG9jay5odG1sCkBAIC0wLDAgKzEsNyBAQAorPHA+UGFyYTwvcD4KKzxkaXYgY2xhc3M9InRlc3QiPmRpdmlzaW9uPC9kaXY+CisKKzxibG9ja3F1b3RlPgorICA8cD5RdW90ZTwvcD4KKzwvYmxvY2txdW90ZT4KKzxkaXYgY2xhc3M9InRlc3QiPmRpdmlzaW9uPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX2FmdGVyX2Jsb2NrLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX2FmdGVyX2Jsb2NrLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjYmZmNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfYWZ0ZXJfYmxvY2sudGV4dApAQCAtMCwwICsxLDUgQEAKK1BhcmEKKzxkaXYgY2xhc3M9InRlc3QiPmRpdmlzaW9uPC9kaXY+CisKKz4gUXVvdGUKKzxkaXYgY2xhc3M9InRlc3QiPmRpdmlzaW9uPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX2FuZF9jb2RlYmxvY2tzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX2FuZF9jb2RlYmxvY2tzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkNjk1YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfYW5kX2NvZGVibG9ja3MuaHRtbApAQCAtMCwwICsxLDE1IEBACis8cD5wYXJhPC9wPgorCis8cHJlPjxjb2RlPmNvZGVibG9jaworPC9jb2RlPjwvcHJlPgorCis8ZGl2PgorICA8cD50ZXN0PC9wPgorPC9kaXY+CisKKzxwcmU+PGNvZGU+Jmx0O3AmZ3Q7Y29kZWJsb2NrJmx0Oy9wJmd0OworPC9jb2RlPjwvcHJlPgorCis8ZGl2PgorICA8cD50ZXN0PC9wPgorPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX2FuZF9jb2RlYmxvY2tzLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX2FuZF9jb2RlYmxvY2tzLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2MGRhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfYW5kX2NvZGVibG9ja3Mub3B0aW9ucwpAQCAtMCwwICsxIEBACis6cGFyc2VfYmxvY2tfaHRtbDogdHJ1ZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF9hbmRfY29kZWJsb2Nrcy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF9hbmRfY29kZWJsb2Nrcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzY2ZkYTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX2FuZF9jb2RlYmxvY2tzLnRleHQKQEAgLTAsMCArMSwxMyBAQAorcGFyYQorCisgICAgY29kZWJsb2NrCisKKzxkaXY+CisgIHRlc3QKKzwvZGl2PgorCisgICAgPHA+Y29kZWJsb2NrPC9wPgorCis8ZGl2PgorICB0ZXN0Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfYW5kX2hlYWRlcnMuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfYW5kX2hlYWRlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNiN2UyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF9hbmRfaGVhZGVycy5odG1sCkBAIC0wLDAgKzEsNSBAQAorPGgxPmhlYWRlcjwvaDE+CisKKzxkaXY+Cis9PT09PT0KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF9hbmRfaGVhZGVycy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF9hbmRfaGVhZGVycy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZGM0NzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX2FuZF9oZWFkZXJzLnRleHQKQEAgLTAsMCArMSw2IEBACitoZWFkZXIKKz09PT09PQorCis8ZGl2PgorPT09PT09Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2NvZGUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2NvZGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIzMjIxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvY29kZS5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxwPlRoaXMgaXMgYSA8Y29kZT5jb2RlIHNwYW4gd2l0aCAmbHQ7ZW50aXRpZXMmZ3Q7IHRoYXQgc2hvdWxkIGJlIHByZXNlcnZlZDwvY29kZT4uCitUaGlzIGlzIGEgPGNvZGU+c2ltcGxlIGNvZGU8L2NvZGU+IHNwYW4uPC9wPgorCis8cD5Tb21lIDxjb2RlPiZsdDs8L2NvZGU+PC9wPgorCis8cHJlPjxjb2RlPlNvbWUgdmVyeSBpbXBvcnRhbnQgJmx0OyB0aGluZworPC9jb2RlPjwvcHJlPgorCis8cHJlPjxjb2RlPlNvbWUgY29kZSZsdDsmbHQ7Cis8L2NvZGU+PC9wcmU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9jb2RlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9jb2RlLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhN2RiNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2NvZGUudGV4dApAQCAtMCwwICsxLDkgQEAKK1RoaXMgaXMgYSA8Y29kZT5jb2RlIHNwYW4gPGI+d2l0aDwvYj4gJmx0O2VudGl0aWVzJmd0OyB0aGF0IHNob3VsZCBiZSBwcmVzZXJ2ZWQ8L2NvZGU+LgorVGhpcyBpcyBhIDxjb2RlPnNpbXBsZSBjb2RlPC9jb2RlPiBzcGFuLgorCis8cD5Tb21lIDxjb2RlPiZsdDs8L2NvZGU+PC9wPgorCis8cHJlPlNvbWUgdmVyeSBpbXBvcnRhbnQgPGI+Jmx0OzwvYj4gdGhpbmc8L3ByZT4KKworPHByZT48Y29kZT5Tb21lIGNvZGU8c3Bhbj4mbHQ7PC9zcGFuPiZsdDsKKzwvY29kZT48L3ByZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2NvbW1lbnQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2NvbW1lbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNkNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvY29tbWVudC5odG1sCkBAIC0wLDAgKzEsNyBAQAorPGRpdj4KKyAgPCEtLWNvbW1lbnQtLT4KKyAgPCEtLQorQmxhaAorQmxhaAorLS0+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2NvbW1lbnQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2NvbW1lbnQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg4NjMwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvY29tbWVudC50ZXh0CkBAIC0wLDAgKzEsOCBAQAorPGRpdj4KKyAgPCEtLWNvbW1lbnQtLT4KKworICA8IS0tCitCbGFoCitCbGFoCistLT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvZW1waGFzaXMuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2VtcGhhc2lzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzODljMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2VtcGhhc2lzLmh0bWwKQEAgLTAsMCArMSw2IEBACis8cD5UaGlzIGlzIDxlbT5zaXplZDxzdHJvbmc+aGFsbG88L3N0cm9uZz48L2VtPi48L3A+CisKKzxwPlRoaXMgaXMgPHN0cm9uZz5zdHJvbmc8ZW0+aXRhbGljPC9lbT4sIHllcyE8L3N0cm9uZz4uPC9wPgorCis8cD5UaGlzIGlzIDxlbT4gbm90PC9lbT4gY29udmVydGVkLCBhcyA8ZW0+aXMKKzwvZW0+IHRoaXMuPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvZW1waGFzaXMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2VtcGhhc2lzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3NTkzMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2VtcGhhc2lzLnRleHQKQEAgLTAsMCArMSw2IEBACitUaGlzIGlzIDxlbT5zaXplZDxzdHJvbmc+aGFsbG88L3N0cm9uZz48L2VtPi4KKworVGhpcyBpcyA8Yj5zdHJvbmc8aT5pdGFsaWM8L2k+LCB5ZXMhPC9iPi4KKworVGhpcyBpcyA8ZW0+IG5vdDwvZW0+IGNvbnZlcnRlZCwgYXMgPGVtPmlzCis8L2VtPiB0aGlzLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvZW50aXR5Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9lbnRpdHkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzgwY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvZW50aXR5Lmh0bWwKQEAgLTAsMCArMSBAQAorPHA+VGhpcyBpcyAqcmF3KiBIVE1MIHRleHQgY29udGFpbmluZyAmbHQ7IGVudGl0aWVzITwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2VudGl0eS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvZW50aXR5LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4MGNlNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2VudGl0eS50ZXh0CkBAIC0wLDAgKzEgQEAKKzxwPlRoaXMgaXMgKnJhdyogSFRNTCB0ZXh0IGNvbnRhaW5pbmcgJmx0OyBlbnRpdGllcyE8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9oZWFkZXIuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2hlYWRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYmIyMDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9oZWFkZXIuaHRtbApAQCAtMCwwICsxLDYgQEAKKzxoMSBpZD0ic29tZS1oZWFkZXJoZXJlIj5Tb21lIDxlbSBjbGFzcz0iY2xzIj5oZWFkZXI8L2VtPmhlcmUhPC9oMT4KKzxoMiBpZD0idGVzdCI+aGFsbG88L2gyPgorPGgzIGlkPSJoYWxsbyI+aGFsbG88L2gzPgorPGg0IGlkPSJoYWxsby0xIj5oYWxsbzwvaDQ+Cis8aDUgaWQ9ImhhbGxvLTIiPmhhbGxvPC9oNT4KKzxoNiBpZD0iaGFsbG8tMyI+aGFsbG88L2g2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvaGVhZGVyLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9oZWFkZXIub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODdiNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvaGVhZGVyLm9wdGlvbnMKQEAgLTAsMCArMSwyIEBACis6YXV0b19pZHM6IHRydWUKKzpodG1sX3RvX25hdGl2ZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvaGVhZGVyLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9oZWFkZXIudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2VlZDNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvaGVhZGVyLnRleHQKQEAgLTAsMCArMSw2IEBACis8aDE+U29tZSA8ZW0gY2xhc3M9J2Nscyc+aGVhZGVyPC9lbT5oZXJlITwvaDE+Cis8aDIgaWQ9InRlc3QiPmhhbGxvPC9oMj4KKzxoMz5oYWxsbzwvaDM+Cis8aDQ+aGFsbG88L2g0PgorPGg1PmhhbGxvPC9oNT4KKzxoNj5oYWxsbzwvaDY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X2RsLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X2RsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhY2NmZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2xpc3RfZGwuaHRtbApAQCAtMCwwICsxLDggQEAKKzxkbD4KKyAgPGR0PmtyYW08L2R0PgorICA8ZGQ+ZG93bjwvZGQ+CisgIDxkdD5rcmFtPC9kdD4KKyAgPGRkPmRvd248L2RkPgorICA8ZHQ+a3JhbTwvZHQ+CisgIDxkZD5kb3duPC9kZD4KKzwvZGw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X2RsLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X2RsLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhY2NmZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2xpc3RfZGwudGV4dApAQCAtMCwwICsxLDggQEAKKzxkbD4KKyAgPGR0PmtyYW08L2R0PgorICA8ZGQ+ZG93bjwvZGQ+CisgIDxkdD5rcmFtPC9kdD4KKyAgPGRkPmRvd248L2RkPgorICA8ZHQ+a3JhbTwvZHQ+CisgIDxkZD5kb3duPC9kZD4KKzwvZGw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X29sLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X29sLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlYmRmYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2xpc3Rfb2wuaHRtbApAQCAtMCwwICsxLDE1IEBACis8b2w+CisgIDxsaT5UaGlzIGlzIGEgc2ltcGxlIGxpc3QgaXRlbTwvbGk+CisgIDxsaT4KKyAgICA8cD5Gb2xsb3dlZCBieSBhbm90aGVyPC9wPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+Rm9sbG93ZWQgYnk8L3A+CisgICAgPHA+YSBwYXJhIGxpc3QgaXRlbTwvcD4KKyAgPC9saT4KKyAgPGxpPmFuZCBhIG5vcm1hbCBvbmU8L2xpPgorICA8bGk+CisgICAgPHA+YW5kPC9wPgorICAgIDxwPmEgcGFyYTwvcD4KKyAgPC9saT4KKzwvb2w+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X29sLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X29sLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyNDZkZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL2xpc3Rfb2wudGV4dApAQCAtMCwwICsxLDE3IEBACis8b2w+CisgIDxsaT5UaGlzIGlzIGEgc2ltcGxlIGxpc3QgaXRlbTwvbGk+CisgIDxsaT4KKyAgICA8cD5Gb2xsb3dlZCBieSBhbm90aGVyPC9wPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+Rm9sbG93ZWQgYnk8L3A+CisKKyAgICA8cD5hIHBhcmEgbGlzdCBpdGVtPC9wPgorICA8L2xpPgorICA8bGk+YW5kIGEgbm9ybWFsIG9uZTwvbGk+CisgIDxsaT4KKyAgICA8cD5hbmQ8L3A+CisKKyAgICA8cD5hIHBhcmE8L3A+CisgIDwvbGk+Cis8L29sPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvbGlzdF91bC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvbGlzdF91bC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjM4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X3VsLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPHVsPgorICA8bGk+VGhpcyBpcyBhIHNpbXBsZSBsaXN0IGl0ZW08L2xpPgorICA8bGk+CisgICAgPHA+Rm9sbG93ZWQgYnkgYW5vdGhlcjwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPkZvbGxvd2VkIGJ5PC9wPgorICAgIDxwPmEgcGFyYSBsaXN0IGl0ZW08L3A+CisgIDwvbGk+CisgIDxsaT5hbmQgYSBub3JtYWwgb25lPC9saT4KKyAgPGxpPgorICAgIDxwPmFuZDwvcD4KKyAgICA8cD5hIHBhcmE8L3A+CisgIDwvbGk+Cis8L3VsPgorCis8dWw+CisgIDxsaT5tdWx0aSBsaW5lIGxpc3QgaXRlbTwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvbGlzdF91bC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvbGlzdF91bC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmQ2OGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9saXN0X3VsLnRleHQKQEAgLTAsMCArMSwyMiBAQAorPHVsPgorICA8bGk+VGhpcyBpcyBhIHNpbXBsZSBsaXN0IGl0ZW08L2xpPgorICA8bGk+CisgICAgPHA+Rm9sbG93ZWQgYnkgYW5vdGhlcjwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPkZvbGxvd2VkIGJ5PC9wPgorCisgICAgPHA+YSBwYXJhIGxpc3QgaXRlbTwvcD4KKyAgPC9saT4KKyAgPGxpPmFuZCBhIG5vcm1hbCBvbmU8L2xpPgorICA8bGk+CisgICAgPHA+YW5kPC9wPgorCisgICAgPHA+YSBwYXJhPC9wPgorICA8L2xpPgorPC91bD4KKworPHVsPgorICA8bGk+bXVsdGkgbGluZQorbGlzdCBpdGVtPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzkzNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvb3B0aW9ucwpAQCAtMCwwICsxIEBACis6aHRtbF90b19uYXRpdmU6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3BhcmFncmFwaC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvcGFyYWdyYXBoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NmIxYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3BhcmFncmFwaC5odG1sCkBAIC0wLDAgKzEsMyBAQAorPHA+U29tZSB0ZXh0IGhlcmU8c3Bhbj4gYW5kIDwvc3Bhbj5lbmQ8L3A+CisKKzxwPlNvbWUgb3RoZXIgdGV4dCBoZXJlPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvcGFyYWdyYXBoLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS9wYXJhZ3JhcGgudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTAwMzVjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvcGFyYWdyYXBoLnRleHQKQEAgLTAsMCArMSw0IEBACis8cD5Tb21lIHRleHQgaGVyZTxzcGFuPiBhbmQgPC9zcGFuPmVuZAorPC9wPgorCis8cD5Tb21lIG90aGVyIHRleHQgaGVyZTwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3RhYmxlX25vcm1hbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvdGFibGVfbm9ybWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNzllZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3RhYmxlX25vcm1hbC5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZXMiPgorPHRyPgorICA8dGg+VXNhZ2U8L3RoPgorICA8dGg+T3RoZXI8L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkPlNvbWUgKmRhdGEqPC90ZD4KKyAgPHRkPgorICAgIDxwPlNvbWUgbW9yZTwvcD4KKyAgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvdGFibGVfbm9ybWFsLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS90YWJsZV9ub3JtYWwudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQ3OWVlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvdGFibGVfbm9ybWFsLnRleHQKQEAgLTAsMCArMSwxMiBAQAorPHRhYmxlIGNsYXNzPSJleGFtcGxlcyI+Cis8dHI+CisgIDx0aD5Vc2FnZTwvdGg+CisgIDx0aD5PdGhlcjwvdGg+Cis8L3RyPgorPHRyPgorICA8dGQ+U29tZSAqZGF0YSo8L3RkPgorICA8dGQ+CisgICAgPHA+U29tZSBtb3JlPC9wPgorICA8L3RkPgorPC90cj4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS90YWJsZV9zaW1wbGUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3RhYmxlX3NpbXBsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDllNmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS90YWJsZV9zaW1wbGUuaHRtbApAQCAtMCwwICsxLDYxIEBACis8dGFibGUgY2xhc3M9ImV4YW1wbGVzIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5Vc2FnZTwvdGQ+CisgICAgICA8dGQ+T3V0cHV0PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5Tb21lICpkYXRhKjwvdGQ+CisgICAgICA8dGQ+U29tZSBtb3JlPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlcyI+CisgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGg+VXNhZ2U8L3RoPgorICAgICAgPHRoPk91dHB1dDwvdGg+CisgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5Tb21lICpkYXRhKjwvdGQ+CisgICAgICA8dGQ+U29tZSBtb3JlPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorICA8dGZvb3Q+CisgICAgPHRyPgorICAgICAgPHRkPmZvb3Q8L3RkPgorICAgICAgPHRkPmxvY2tlcjwvdGQ+CisgICAgPC90cj4KKyAgPC90Zm9vdD4KKzwvdGFibGU+CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZXMiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0Ij5Vc2FnZTwvdGQ+CisgICAgICA8dGQgc3R5bGU9IndpZHRoOiAxMGVtIj5PdXRwdXQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0Ij5Tb21lICpkYXRhKjwvdGQ+CisgICAgICA8dGQ+U29tZSBtb3JlPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlcyI+Cis8dHI+CisgIDx0aD5Vc2FnZTwvdGg+CisgIDx0aD4KK091dHB1dAorICA8L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkPlNvbWUgKmRhdGEqPC90ZD4KKyAgPHRkPgorU29tZSBtb3JlCisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3RhYmxlX3NpbXBsZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvdGFibGVfc2ltcGxlLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3ODUyYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3RhYmxlX3NpbXBsZS50ZXh0CkBAIC0wLDAgKzEsNzEgQEAKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZXMiPgorPHRyPgorICA8dGQ+VXNhZ2U8L3RkPgorICA8dGQ+CitPdXRwdXQKKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD5Tb21lICpkYXRhKjwvdGQ+CisgIDx0ZD4KK1NvbWUgbW9yZQorICA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZXMiPgorPHRoZWFkPgorPHRyPgorICA8dGg+VXNhZ2U8L3RoPgorICA8dGg+CitPdXRwdXQKKyAgPC90aD4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHRyPgorICA8dGQ+U29tZSAqZGF0YSo8L3RkPgorICA8dGQ+CitTb21lIG1vcmUKKyAgPC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPHRmb290PgorPHRyPgorICA8dGQ+Zm9vdDwvdGQ+CisgIDx0ZD4KK2xvY2tlcgorICA8L3RkPgorPC90cj4KKzwvdGZvb3Q+Cis8L3RhYmxlPgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGVzIj4KKzx0cj4KKyAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0Ij5Vc2FnZTwvdGQ+CisgIDx0ZCBzdHlsZT0id2lkdGg6IDEwZW0iPgorT3V0cHV0CisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQiPlNvbWUgKmRhdGEqPC90ZD4KKyAgPHRkPgorU29tZSBtb3JlCisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlcyI+Cis8dHI+CisgIDx0aD5Vc2FnZTwvdGg+CisgIDx0aD4KK091dHB1dAorICA8L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkPlNvbWUgKmRhdGEqPC90ZD4KKyAgPHRkPgorU29tZSBtb3JlCisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3R5cG9ncmFwaHkuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3R5cG9ncmFwaHkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjg2NWFhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvdHlwb2dyYXBoeS5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPlRoaXMgaXMgJiM4MjMwOyBzb21ldGhpbmcgJiM4MjIwO3RvIHJlbWVtYmVyJiM4MjIxOyE8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS90eXBvZ3JhcGh5Lmh0bWwuMTkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS90eXBvZ3JhcGh5Lmh0bWwuMTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0Mzk2NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2h0bWxfdG9fbmF0aXZlL3R5cG9ncmFwaHkuaHRtbC4xOQpAQCAtMCwwICsxIEBACis8cD5UaGlzIGlzIOKApiBzb21ldGhpbmcg4oCcdG8gcmVtZW1iZXLigJ0hPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvdHlwb2dyYXBoeS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaHRtbF90b19uYXRpdmUvdHlwb2dyYXBoeS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzNjNWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9odG1sX3RvX25hdGl2ZS90eXBvZ3JhcGh5LnRleHQKQEAgLTAsMCArMSBAQAorPHA+VGhpcyBpcyAmaGVsbGlwOyBzb21ldGhpbmcgJmxkcXVvO3RvIHJlbWVtYmVyJnJkcXVvOyE8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9pbnZhbGlkX2h0bWxfMS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaW52YWxpZF9odG1sXzEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UwZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaW52YWxpZF9odG1sXzEuaHRtbApAQCAtMCwwICsxLDUgQEAKKzxwPnBhcmE8L3A+CisKKzxwPiZsdDsvZGl2Jmd0OzwvcD4KKworPHA+cGFyYTwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2ludmFsaWRfaHRtbF8xLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9pbnZhbGlkX2h0bWxfMS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZmM4MzQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9pbnZhbGlkX2h0bWxfMS50ZXh0CkBAIC0wLDAgKzEsNSBAQAorcGFyYQorCis8L2Rpdj4KKworcGFyYQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvaW52YWxpZF9odG1sXzIuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2ludmFsaWRfaHRtbF8yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkYTEyZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2ludmFsaWRfaHRtbF8yLmh0bWwKQEAgLTAsMCArMSw1IEBACis8cD5wYXJhPC9wPgorCis8aHIgLz4KKworPHA+cGFyYTwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL2ludmFsaWRfaHRtbF8yLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9pbnZhbGlkX2h0bWxfMi50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWM5NGYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9pbnZhbGlkX2h0bWxfMi50ZXh0CkBAIC0wLDAgKzEsNSBAQAorcGFyYQorCis8aHI+CisKK3BhcmEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL21hcmtkb3duX2F0dHIuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL21hcmtkb3duX2F0dHIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBiOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvbWFya2Rvd25fYXR0ci5odG1sCkBAIC0wLDAgKzEsMzggQEAKKzxkaXY+CisgIDxwPjxlbT5wYXJhPC9lbT48L3A+Cis8L2Rpdj4KKworPGRpdj4KKzxlbT5wYXJhPC9lbT4KKzwvZGl2PgorCis8ZGl2PgorICA8cD48ZW0+cGFyYTwvZW0+PC9wPgorPC9kaXY+CisKKzxkaXY+CisqcGFyYSoKKzwvZGl2PgorCis8cD4KKyAgPHA+PGVtPnBhcmE8L2VtPjwvcD4KKzwvcD4KKworPHA+Cis8ZW0+cGFyYTwvZW0+Cis8L3A+CisKKzxwPgorPGVtPnBhcmE8L2VtPgorPC9wPgorCis8cD4KKypwYXJhKgorPC9wPgorCis8ZGw+CisgIDxkdD48ZW0+ZW1waGFzaXplPC9lbT48L2R0PgorICA8ZGQ+CisgICAgPHA+cGFyYTwvcD4KKyAgPC9kZD4KKzwvZGw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9tYXJrZG93bl9hdHRyLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9tYXJrZG93bl9hdHRyLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlNWFlZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL21hcmtkb3duX2F0dHIudGV4dApAQCAtMCwwICsxLDM4IEBACis8ZGl2IG1hcmtkb3duPSJibG9jayI+CisqcGFyYSoKKzwvZGl2PgorCis8ZGl2IG1hcmtkb3duPSJzcGFuIj4KKypwYXJhKgorPC9kaXY+CisKKzxkaXYgbWFya2Rvd249IjEiPgorKnBhcmEqCis8L2Rpdj4KKworPGRpdiBtYXJrZG93bj0iMCI+CisqcGFyYSoKKzwvZGl2PgorCis8cCBtYXJrZG93bj0iYmxvY2siPgorKnBhcmEqCis8L3A+CisKKzxwIG1hcmtkb3duPSJzcGFuIj4KKypwYXJhKgorPC9wPgorCis8cCBtYXJrZG93bj0iMSI+CisqcGFyYSoKKzwvcD4KKworPHAgbWFya2Rvd249IjAiPgorKnBhcmEqCis8L3A+CisKKzxkbD4KKyAgPGR0IG1hcmtkb3duPSIxIj4qZW1waGFzaXplKjwvZHQ+CisgIDxkZCBtYXJrZG93bj0iMSI+CitwYXJhCis8L2RkPgorPC9kbD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL25vdF9wYXJzZWQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL25vdF9wYXJzZWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJkYTAzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvbm90X3BhcnNlZC5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzxkaXY+CitUaGlzIGlzIHNvbWUgdGV4dAorPC9kaXY+CisKKzxkaXY+PGRpdj4KK1RoaXMgaXMgc29tZSB0ZXh0Cis8L2Rpdj48L2Rpdj4KKworPGRpdj4KKyZsdDsvcCZndDsKKzwvZGl2PgorCis8ZGl2PgorPHA+PGEgaHJlZj0iLyI+Rm9vPC9hPjwvcD4KKzwvZGl2PgorCis8cD5UaGlzIGlzIHNvbWUKK3RleHQ8L3A+CisKKzxwPjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbSI+aHR0cDovL2V4YW1wbGUuY29tPC9hPjwvcD4KKworPGRpdj4KKyZsdDtodHRwOi8vZXhhbXBsZS5jb20mZ3Q7Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL25vdF9wYXJzZWQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL25vdF9wYXJzZWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDFjNzFjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvbm90X3BhcnNlZC50ZXh0CkBAIC0wLDAgKzEsMjQgQEAKKzxkaXY+CitUaGlzIGlzIHNvbWUgdGV4dAorPC9kaXY+CisKKzxkaXY+PGRpdj4KK1RoaXMgaXMgc29tZSB0ZXh0Cis8L2Rpdj48L2Rpdj4KKworPGRpdj4KKzwvcD4KKzwvZGl2PgorCis8ZGl2PgorPHA+PGEgaHJlZj0iLyI+Rm9vPC9hPjwvcD4KKzwvZGl2PgorCis8cD5UaGlzIGlzIHNvbWUKK3RleHQ8L3A+CisKKzxodHRwOi8vZXhhbXBsZS5jb20+CisKKzxkaXY+Cis8aHR0cDovL2V4YW1wbGUuY29tPgorPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19yYXcuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2FzX3Jhdy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGY5YjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19yYXcuaHRtbApAQCAtMCwwICsxLDM1IEBACis8cD5iYXogeyB8cXV4fCBxdXV4IH08L3A+CisKKzxwPlRoaXMgaXMgc29tZSBwYXJhLgorPHNjcmlwdCB0eXBlPSJqYXZhc2NyaXB0Ij4KK1RoaXMgKnRleHQqIG11c3Qgbm90IGJlIGNvbnZlcnRlZC4KKyAgPC9zY3JpcHQ+PC9wPgorCis8c2NyaXB0Pk5vdCAqcGFyc2VkKiBoZXJlPC9zY3JpcHQ+CisKKzxzY3JpcHQ+Km5vdCo8L3NjcmlwdD4KKzxwPjxlbT5wYXJzZWQ8L2VtPgorVGhpcyB0b28KKzwvcD4KKworPHNjcmlwdD4qbm90KjxwPipwYXJzZWQqCitUaGlzIHRvbworPC9wPjwvc2NyaXB0PgorCis8c2NyaXB0PnNvbWV0aGluZzxwPipub3QqPC9wPjwvc2NyaXB0PgorCis8c2NyaXB0Pjwvc2NyaXB0PgorCis8c2NyaXB0PgorVGhpcyBzaG91bGQgYmUgb3V0cHV0Cis8cD4gKmFzKiBpcworPC9wPiBhbmQgbm90aGluZyBzaG91bGQgYmUgZG9uZQorYWJvdXQgaXQKKzwvbm90PgorPC9wPgorPC9zY3JpcHQ+CisKKzxwPjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbSI+aHR0cDovL2V4YW1wbGUuY29tPC9hPjwvcD4KKworPHN0eWxlPiBib2R5ID4gKiB7IGJhY2tncm91bmQtY29sb3I6IFJlZDsgfSA8L3N0eWxlPgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19yYXcuaHRtbGlucHV0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYXNfcmF3Lmh0bWxpbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmI5ZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYXNfcmF3Lmh0bWxpbnB1dApAQCAtMCwwICsxLDM0IEBACis8cD5iYXogeyB8cXV4fCBxdXV4IH08L3A+CisKKzxwPlRoaXMgaXMgc29tZSBwYXJhLgorPHNjcmlwdCB0eXBlPSJqYXZhc2NyaXB0Ij4KK1RoaXMgKnRleHQqIG11c3Qgbm90IGJlIGNvbnZlcnRlZC4KKyAgPC9TQ1JJUFQ+PC9wPgorCis8c2NyaXB0Pk5vdCAqcGFyc2VkKiBoZXJlPC9zY3JpcHQ+CisKKzxzQ1JJcHQ+Km5vdCo8L3NjcmlwdD4KKzxwPjxlbT5wYXJzZWQ8L2VtPgorVGhpcyB0b28KKzwvcD4KKworPHNjcmlwdD4qbm90KjxwPipwYXJzZWQqCitUaGlzIHRvbworPC9wPjwvc2NyaXB0PgorCis8c0NSSXB0PnNvbWV0aGluZzxwPipub3QqPC9wPjwvc2NySVB0PgorCis8c2NyaXB0Pjwvc2NyaXB0PgorCis8c2NyaXB0PgorVGhpcyBzaG91bGQgYmUgb3V0cHV0Cis8cD4gKmFzKiBpcworPC9wPiBhbmQgbm90aGluZyBzaG91bGQgYmUgZG9uZQorYWJvdXQgaXQKKzwvbm90PgorPC9wPgorPC9zY3JpcHQ+CisKKzxwPjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbSI+aHR0cDovL2V4YW1wbGUuY29tPC9hPjwvcD4KKworPHN0eWxlPiBib2R5ID4gKiB7IGJhY2tncm91bmQtY29sb3I6IFJlZDsgfSA8L3N0eWxlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYXNfcmF3Lm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19yYXcub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYwZGEyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYXNfcmF3Lm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOnBhcnNlX2Jsb2NrX2h0bWw6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2FzX3Jhdy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYXNfcmF3LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MTdjNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2FzX3Jhdy50ZXh0CkBAIC0wLDAgKzEsMzMgQEAKKzxwPmJheiB7IHxxdXh8IHF1dXggfTwvcD4KKworVGhpcyBpcyBzb21lIHBhcmEuCis8c2NyaXB0IHR5cGU9ImphdmFzY3JpcHQiPgorVGhpcyAqdGV4dCogbXVzdCBub3QgYmUgY29udmVydGVkLgorICA8L1NDUklQVD4KKworPHNjcmlwdD5Ob3QgKnBhcnNlZCogaGVyZTwvc2NyaXB0PgorCis8c2NyaXB0Pipub3QqPC9zY3JpcHQ+PHA+KnBhcnNlZCoKK1RoaXMgdG9vCis8L3A+CisKKzxzY3JpcHQ+Km5vdCo8cD4qcGFyc2VkKgorVGhpcyB0b28KKzwvcD48L3NjcmlwdD4KKworPHNjcmlwdD5zb21ldGhpbmc8cD4qbm90KjwvcD48L3NjcmlwdD4KKworPHNjcmlwdD48L3NjcmlwdD4KKworPHNjcmlwdD4KK1RoaXMgc2hvdWxkIGJlIG91dHB1dAorPHA+ICphcyogaXMKKzwvcD4gYW5kIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUKK2Fib3V0IGl0Cis8L25vdD4KKzwvcD4KKzwvc2NyaXB0PgorCis8aHR0cDovL2V4YW1wbGUuY29tPgorCis8c3R5bGU+IGJvZHkgPiAqIHsgYmFja2dyb3VuZC1jb2xvcjogUmVkOyB9IDwvc3R5bGU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19zcGFuLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19zcGFuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2MTkxZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2FzX3NwYW4uaHRtbApAQCAtMCwwICsxLDEyIEBACis8cD5UaGlzIDxlbT50ZXh0CitzaG91bGQ8L2VtPiBiZSBwYXJzZWQKK2FzIHNwYW4KKzwvcD4KKworPHA+VGhpcyBwcm9kdWNlcyBgPC9wPgorPHA+YCBhbiB1bndhbnRlZCByZXN1bHQuJmx0Oy9wJmd0OzwvcD4KKworPHA+VGhpcyA8ZW0+dGV4dDwvZW0+IHRvbzwvcD4KKzxwPgorc29tZSB0ZXh0Cis8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19zcGFuLmh0bWxpbnB1dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2FzX3NwYW4uaHRtbGlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTliOGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19zcGFuLmh0bWxpbnB1dApAQCAtMCwwICsxLDEyIEBACis8UD5UaGlzIDxFTT50ZXh0CitzaG91bGQ8L2VtPiBiZSBwYXJzZWQKK2FzIHNwYW4KKzwvcD4KKworPHA+VGhpcyBwcm9kdWNlcyBgPC9wPgorPHA+YCBhbiB1bndhbnRlZCByZXN1bHQuJmx0Oy9wJmd0OzwvcD4KKworPHA+VGhpcyA8ZW0+dGV4dDwvRU0+IHRvbzwvUD4KKzxwPgorc29tZSB0ZXh0Cis8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19zcGFuLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19zcGFuLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2MGRhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2FzX3NwYW4ub3B0aW9ucwpAQCAtMCwwICsxIEBACis6cGFyc2VfYmxvY2tfaHRtbDogdHJ1ZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYXNfc3Bhbi50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYXNfc3Bhbi50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2NmNmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9hc19zcGFuLnRleHQKQEAgLTAsMCArMSw5IEBACis8cD5UaGlzICp0ZXh0CitzaG91bGQqIGJlIHBhcnNlZAorYXMgc3BhbgorPC9QPgorCis8cD5UaGlzIHByb2R1Y2VzIGA8L3A+YCBhbiB1bndhbnRlZCByZXN1bHQuPC9wPgorCis8cD5UaGlzICp0ZXh0KiB0b288L3A+PHA+Citzb21lIHRleHQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2Jsb2NrX2h0bWwuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2Jsb2NrX2h0bWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU3OGMwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYmxvY2tfaHRtbC5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzxkaXY+CisgIDxwPnRlc3Q8L3A+Cis8L2Rpdj4KKworPGRpdj4KKyAgPHByZT48Y29kZT50ZXN0Cis8L2NvZGU+PC9wcmU+CisgIDxkaXY+CisgICAgPHByZT48Y29kZT50ZXN0Cis8L2NvZGU+PC9wcmU+CisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXY+CisgIDxwcmU+PGNvZGU+Y29kZSBibG9jayB3aXRoICZsdDsvZGl2Jmd0OworPC9jb2RlPjwvcHJlPgorPC9kaXY+CisKKzxkaXY+CisgIDxwPk5vIG1hdGNoaW5nIGVuZCB0YWc8L3A+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2Jsb2NrX2h0bWwub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2Jsb2NrX2h0bWwub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYwZGEyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcGFyc2VfYmxvY2tfaHRtbC5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzpwYXJzZV9ibG9ja19odG1sOiB0cnVlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9ibG9ja19odG1sLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wYXJzZV9ibG9ja19odG1sLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiMTg0NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3BhcnNlX2Jsb2NrX2h0bWwudGV4dApAQCAtMCwwICsxLDE3IEBACis8RElWPgorICB0ZXN0Cis8L2RpVj4KKworPGRpdj4KKyAgICB0ZXN0CisgIDxkaXY+CisgICAgdGVzdAorICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2PgorICAgIGNvZGUgYmxvY2sgd2l0aCA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2PgorTm8gbWF0Y2hpbmcgZW5kIHRhZwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcHJvY2Vzc2luZ19pbnN0cnVjdGlvbi5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcHJvY2Vzc2luZ19pbnN0cnVjdGlvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOTJhMDUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wcm9jZXNzaW5nX2luc3RydWN0aW9uLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzxwPnBhcmE8L3A+CisKKzw/ICB0ZXN0ICA/PgorPHA+cGFyYTwvcD4KKworPHA+b3RoZXI8L3A+CisKKzw/CittdWx0aWxpbmUgKnRleHQqCitpcyBhbGxvd2VkCis/PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcHJvY2Vzc2luZ19pbnN0cnVjdGlvbi50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvcHJvY2Vzc2luZ19pbnN0cnVjdGlvbi50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYjg2NmYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9wcm9jZXNzaW5nX2luc3RydWN0aW9uLnRleHQKQEAgLTAsMCArMSwxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKK3BhcmEKKworPD8gIHRlc3QgID8+IHBhcmEKKworb3RoZXIKKworPD8KK211bHRpbGluZSAqdGV4dCoKK2lzIGFsbG93ZWQKKz8+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9zaW1wbGUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3NpbXBsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzYxNTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9zaW1wbGUuaHRtbApAQCAtMCwwICsxLDYwIEBACis8ZGl2PgorICA8cD50ZXN0PC9wPgorPC9kaXY+CisKKzxwPgorcGFyYTIKKzwvcD4KKworPGRpdiBpZD0idGVzdCI+CisgIDxwPnRlczwvcD4KKworICA8cD50ZXN0Cit3ZWl0ZXIKKzwvcD4KKzwvZGl2PgorCis8cD5wYXJhNDwvcD4KKworPGRpdj4KKyAgPGRpdj4KKyAgICA8ZGl2PgorICAgICAgPHA+Zm9vPC9wPgorICAgIDwvZGl2PgorICAgIDxkaXYgc3R5bGU9IiZuYnNwOyI+PC9kaXY+CisgIDwvZGl2PgorICA8ZGl2PgorICAgIDxwPmJhciZuYnNwOzwvcD4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPHA+cGFyYTU8L3A+CisKKzxkaXY+CisgIDxwPmlkPC9wPgorPC9kaXY+Cis8cD50ZXN0PC9wPgorCis8ZGl2PgorICA8cD5oYWxsbzwvcD4KKzwvZGl2PgorPGRpdj4KKyAgPHA+aGFsbG88L3A+Cis8L2Rpdj4KKworPHA+cGFyYTY8L3A+CisKKzxkaXY+CisgIDxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj4KKyAgPHA+QW5vdGhlciBwYXJhLjwvcD4KKzwvZGl2PgorCis8cD48ZW0+VGVzdDwvZW0+PC9wPgorCis8cD48ZW0+VGVzdDwvZW0+PC9wPgorCis8cD48ZW0+VGVzdAorPC9lbT4KKzwvcD4KKworPGlmcmFtZT48L2lmcmFtZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3NpbXBsZS5odG1sLjE5IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvc2ltcGxlLmh0bWwuMTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5MjZjNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3NpbXBsZS5odG1sLjE5CkBAIC0wLDAgKzEsNjAgQEAKKzxkaXY+CisgIDxwPnRlc3Q8L3A+Cis8L2Rpdj4KKworPHA+CitwYXJhMgorPC9wPgorCis8ZGl2IGlkPSJ0ZXN0Ij4KKyAgPHA+dGVzPC9wPgorCisgIDxwPnRlc3QKK3dlaXRlcgorPC9wPgorPC9kaXY+CisKKzxwPnBhcmE0PC9wPgorCis8ZGl2PgorICA8ZGl2PgorICAgIDxkaXY+CisgICAgICA8cD5mb288L3A+CisgICAgPC9kaXY+CisgICAgPGRpdiBzdHlsZT0iJm5ic3A7Ij48L2Rpdj4KKyAgPC9kaXY+CisgIDxkaXY+CisgICAgPHA+YmFywqA8L3A+CisgIDwvZGl2PgorPC9kaXY+CisKKzxwPnBhcmE1PC9wPgorCis8ZGl2PgorICA8cD5pZDwvcD4KKzwvZGl2PgorPHA+dGVzdDwvcD4KKworPGRpdj4KKyAgPHA+aGFsbG88L3A+Cis8L2Rpdj4KKzxkaXY+CisgIDxwPmhhbGxvPC9wPgorPC9kaXY+CisKKzxwPnBhcmE2PC9wPgorCis8ZGl2PgorICA8ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+CisgIDxwPkFub3RoZXIgcGFyYS48L3A+Cis8L2Rpdj4KKworPHA+PGVtPlRlc3Q8L2VtPjwvcD4KKworPHA+PGVtPlRlc3Q8L2VtPjwvcD4KKworPHA+PGVtPlRlc3QKKzwvZW0+Cis8L3A+CisKKzxpZnJhbWU+PC9pZnJhbWU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9zaW1wbGUub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3NpbXBsZS5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjBkYTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9zaW1wbGUub3B0aW9ucwpAQCAtMCwwICsxIEBACis6cGFyc2VfYmxvY2tfaHRtbDogdHJ1ZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvc2ltcGxlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC9zaW1wbGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmZmZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvc2ltcGxlLnRleHQKQEAgLTAsMCArMSw1NSBAQAorICA8ZGl2PiAgIAordGVzdAorPC9kaXY+CisKKzxwPgorcGFyYTIKKzwvcD4KKworPGRpdiBpZD0ndGVzdCc+CisgIDxwPnRlczwvcD4KKworICA8cD50ZXN0Cit3ZWl0ZXIKKzwvcD4KKzwvZGl2PgorCitwYXJhNAorCis8ZGl2PgorPGRpdj4KKzxkaXY+Citmb28KKzwvZGl2PgorICAgPGRpdiBzdHlsZT0iJm5ic3A7Ij48L2Rpdj4KKzwvZGl2PgorPGRpdj5iYXImbmJzcDsKKzwvZGl2PgorPC9kaXY+CisKK3BhcmE1CisKKzxkaXY+aWQKKzwvZGl2PiB0ZXN0CisKKzxkaXY+CitoYWxsbworPC9kaXY+IDxkaXY+CitoYWxsbworPC9kaXY+CisKK3BhcmE2CisKKzxkaXY+PERpViBjTEFTcz0iY2xlYXIiPjwvZEl2PgorQW5vdGhlciBwYXJhLgorPC9kaXY+CisKKzxlbT5UZXN0PC9lbT4KKworPHA+PGVtPlRlc3Q8L2VtPjwvcD4KKworPHA+PGVtPlRlc3QKKzwvZW0+Cis8L3A+CisKKzxpZnJhbWU+PC9pZnJhbWU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC90ZXh0YXJlYS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvdGV4dGFyZWEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU2OTNlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvdGV4dGFyZWEuaHRtbApAQCAtMCwwICsxLDggQEAKKzxwPlRoaXMgaXMgYSA8dGV4dGFyZWE+aW5saW5lPC90ZXh0YXJlYT48L3A+CisKKzx0ZXh0YXJlYT5UaGlzCitpcworCitzb21lCit0ZXh0Cis8L3RleHRhcmVhPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwvdGV4dGFyZWEudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3RleHRhcmVhLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0MGY1YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3RleHRhcmVhLnRleHQKQEAgLTAsMCArMSw4IEBACitUaGlzIGlzIGEgPHRleHRhcmVhPmlubGluZTwvdGV4dGFyZWE+CisKKzx0ZXh0YXJlYT5UaGlzCitpcworCitzb21lCit0ZXh0Cis8L3RleHRhcmVhPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwveG1sLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC94bWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQxYmMwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzA5X2h0bWwveG1sLmh0bWwKQEAgLTAsMCArMSw4IEBACis8d2ViZ2VuOmJsb2NrIG5hbWU9InRlc3QiIC8+CisKKzxzb21lOnVybCBuYW1lOnNwYWM9ImhhbGxvIj5kb2l0PC9zb21lOnVybD4KKworPFNvTWU6VXJMIE5hbUU6U3BBQz0idGVzdCI+ZG9pdDwvU29NZTpVckw+CisKKzxTb01lPmRvaXQmbHQ7L3NvbWUmZ3Q7Cis8L1NvTWU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC94bWwudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8wOV9odG1sL3htbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjdmYWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMDlfaHRtbC94bWwudGV4dApAQCAtMCwwICsxLDcgQEAKKzx3ZWJnZW46YmxvY2sgbmFtZT0idGVzdCIgLz4KKworPHNvbWU6dXJsIG5hbWU6c3BhYz0naGFsbG8nPmRvaXQ8L3NvbWU6dXJsPgorCis8U29NZTpVckwgTmFtRTpTcEFDPSd0ZXN0Jz5kb2l0PC9Tb01lOlVyTD4KKworPFNvTWU+ZG9pdDwvc29tZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMF9hbGQvc2ltcGxlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTBfYWxkL3NpbXBsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjAzZDUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTBfYWxkL3NpbXBsZS5odG1sCkBAIC0wLDAgKzEsMiBAQAorPHA+U29tZSBwYXJhZ3JhcGg8L3A+CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMF9hbGQvc2ltcGxlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTBfYWxkL3NpbXBsZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODc2OGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTBfYWxkL3NpbXBsZS50ZXh0CkBAIC0wLDAgKzEsOCBAQAorU29tZSBwYXJhZ3JhcGgKKworezppZDogcmVmMX0KK3s6aWQ6IC5jbGFzczF9CisgezppZDogI2lkfQorICB7OmlkOiBrZXk9InZhbHVlIn0KKyAgIHs6aWQ6IC5jbGFzczIgLmNsYXNzMyByZWYyICNpZC13aXRoIGtleT0idmFsdWUiIGtleT0ndmFsdWUnIGtleT0nZGZzZFx9JyB9Cit7OnRlc3Q6IGsgZXk9dmFsdWV9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTFfaWFsL2F1dG9faWRfYW5kX2lhbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzExX2lhbC9hdXRvX2lkX2FuZF9pYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU3YTAzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzExX2lhbC9hdXRvX2lkX2FuZF9pYWwuaHRtbApAQCAtMCwwICsxIEBACis8aDIgaWQ9Im15aWQiIGNsYXNzPSJjbHMiPkEgaGVhZGVyPC9oMj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvYXV0b19pZF9hbmRfaWFsLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTFfaWFsL2F1dG9faWRfYW5kX2lhbC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzZiNTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTFfaWFsL2F1dG9faWRfYW5kX2lhbC5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzphdXRvX2lkczogdHJ1ZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzExX2lhbC9hdXRvX2lkX2FuZF9pYWwudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvYXV0b19pZF9hbmRfaWFsLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyMWZiMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvYXV0b19pZF9hbmRfaWFsLnRleHQKQEAgLTAsMCArMSwyIEBACisjIyBBIGhlYWRlcgorezojbXlpZCAuY2xzfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzExX2lhbC9uZXN0ZWQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvbmVzdGVkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjYzM2OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvbmVzdGVkLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGRpdiBjbGFzcz0iY2xzIiBpZD0iaWQiPgordGVzdAorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImNscyIgaWQ9ImlkIj4KKyAgPHA+dGVzdDwvcD4KKzwvZGl2PgorCis8YmxvY2txdW90ZSBjbGFzcz0iY2xzIiBpZD0iaWQiPgorICA8cD5wYXJhPC9wPgorPC9ibG9ja3F1b3RlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzExX2lhbC9uZXN0ZWQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvbmVzdGVkLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NjQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvbmVzdGVkLnRleHQKQEAgLTAsMCArMSwxNSBAQAorezouY2xzfQorPGRpdj4KK3Rlc3QKKzwvZGl2PgorezojaWR9CisKK3s6LmNsc30KKzxkaXYgbWFya2Rvd249IjEiPgordGVzdAorPC9kaXY+Cit7OiNpZH0KKworezouY2xzfQorPiBwYXJhCit7OiNpZH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvc2ltcGxlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTFfaWFsL3NpbXBsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODZmMGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTFfaWFsL3NpbXBsZS5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzxwIGtleTE9InZhbCZxdW90OyIga2V5Mj0idmFsJyIgY2xhc3M9Im90aGVyLWNsYXNzIG15Y2xhc3MgY2xhc3MgLWNsYXNzIiBpZD0ib3RoZXIiIGtleT0idmFsIj5Tb21lIHBhcmFncmFwaC48L3A+CisKKzxwIGNsYXNzPSJjbHMxIGNsczIiIGlkPSJpZCI+U29tZSBwYXJhZ3JhcGguPC9wPgorCis8YmxvY2txdW90ZSBpZD0iaWQiIGNsYXNzPSJjbGFzcyI+CisgIDxwPnF1b3RlPC9wPgorPC9ibG9ja3F1b3RlPgorCis8dWwga2V5PSJ2YWwiPgorICA8bGk+bGlzdDwvbGk+Cis8L3VsPgorCis8cHJlIGlkPSJvdGhlciI+PGNvZGU+Y29kZSBibG9jaworPC9jb2RlPjwvcHJlPgorCis8cHJlPjxjb2RlPm90aGVyIGNvZGUgYmxvY2sKKzwvY29kZT48L3ByZT4KKworPGgyIGlkPSJteWlkIj5BIGhlYWRlcjwvaDI+CisKKzxwIGNsYXNzPSJjbHMiPlNvbWUgcGFyYWdyYXBoIGhlcmU8L3A+CisKKzxwIGNsYXNzPSJjbHMxIGNsczIiPlNvbWUgcGFyYWdyYXBoIGhlcmU8L3A+CisKKzxwIGNsYXNzPSJjbHMiPlBhcmFncmFwaDwvcD4KKzxwPlBhcmFncmFwaDwvcD4KKworPGgxIGNsYXNzPSJjbGFzcyIgaWQ9Im90aGVyIj5Bbm90aGVyIGhlYWRlcjwvaDE+CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMV9pYWwvc2ltcGxlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTFfaWFsL3NpbXBsZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5N2VlZjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTFfaWFsL3NpbXBsZS50ZXh0CkBAIC0wLDAgKzEsNDEgQEAKK1NvbWUgcGFyYWdyYXBoLgorezouY2xhc3MgLi1jbGFzcyBpZCBrZXk9InZhbCJ9CisKK1NvbWUgcGFyYWdyYXBoLgorezouY2xzMSNpZC5jbHMyfQorCis+IHF1b3RlCit7OiAjaWR9CisgIHs6IC5jbGFzc30KKworKiBsaXN0Cit7OiBrZXk9InZhbCJ9CisKKyAgICBjb2RlIGJsb2NrCit7OiAjb3RoZXJ9CisKKyAgICBvdGhlciBjb2RlIGJsb2NrCisKKyMjIEEgaGVhZGVyCit7OiNteWlkfQorCit7Oi5jbHN9CitTb21lIHBhcmFncmFwaCBoZXJlCisKK3s6LmNsczF9Cit7Oi5jbHMyfQorU29tZSBwYXJhZ3JhcGggaGVyZQorCitQYXJhZ3JhcGgKK3s6LmNsc30KK1BhcmFncmFwaAorCitBbm90aGVyIGhlYWRlcgorPT09PT09PT09PT09PT0KK3s6IC5jbGFzcyAjb3RoZXJ9CisKK3s6aWQ6ICNpZCBrZXk9InZhbG8ifQorezppZDogI290aGVyIC5teWNsYXNzIG90aGVyfQorezpvdGhlcjoga2V5MT0idmFsXCIiICAtIGlnLm5vcmVkIGFzX2lzI3RoaXMga2V5Mj0ndmFsXCcnIC5vdGhlci1jbGFzc30KKworezouaW52YWxpZH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vY29tbWVudC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9jb21tZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiNGM2NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vY29tbWVudC5odG1sCkBAIC0wLDAgKzEsOCBAQAorPHA+VGhpcyBpcyBhIHNpbXBsZSBwYXJhZ3JhcGguPC9wPgorCis8IS0tIFRoaXMgaXMgYSBjb21tZW50IHs6L313aGljaCBpcyB7Oi9jb21tZW50fSBpZ25vcmVkLiAtLT4KKworPHA+QW5kIGFub3RoZXIgcGFyYWdyYXBoPC9wPgorCis8cD57Ojpjb21tZW50fQorQW5vdGhlciBwYXJhZ3JhcGg8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL2NvbW1lbnQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vY29tbWVudC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmM5MTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL2NvbW1lbnQudGV4dApAQCAtMCwwICsxLDEyIEBACitUaGlzIGlzIGEgc2ltcGxlIHBhcmFncmFwaC4KKworezo6Y29tbWVudH0KK1RoaXMgaXMgYSBjb21tZW50IHs6L313aGljaCBpcyB7Oi9jb21tZW50fSBpZ25vcmVkLgorezovY29tbWVudH0KKworQW5kIGFub3RoZXIgcGFyYWdyYXBoCisKK3s6OmNvbW1lbnQgdGhpcz0naXMnIC5pZ25vcmUgL30KKworezo6Y29tbWVudH0KK0Fub3RoZXIgcGFyYWdyYXBoCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL2lnbm9yZWQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vaWdub3JlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWFlNWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL2lnbm9yZWQuaHRtbApAQCAtMCwwICsxLDggQEAKKzxwPnBhcmFncmFwaDwvcD4KKworPHA+ezo6c29tZXRoaW5nfQorYW5vdGhlcnRoaW5nCit7Oi9zb21ldGhpbmd9PC9wPgorCis8cD57Ojpzb21ldGhpbmcvfQorcGFyYWdyYXBoPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9pZ25vcmVkLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL2lnbm9yZWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTk0YThmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9pZ25vcmVkLnRleHQKQEAgLTAsMCArMSw4IEBACitwYXJhZ3JhcGgKKworezo6c29tZXRoaW5nfQorYW5vdGhlcnRoaW5nCit7Oi9zb21ldGhpbmd9CisKK3s6OnNvbWV0aGluZy99CitwYXJhZ3JhcGgKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vbm9tYXJrZG93bi5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9ub21hcmtkb3duLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlNThkNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vbm9tYXJrZG93bi5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxwPlRoaXMgaXMgYSBzaW1wbGUgcGFyYWdyYXBoLjwvcD4KKworVGhpcyAqaXMqIG5vdCBwcm9jZXNzZWQgCisKKzxwPkFuZCBhbm90aGVyIHBhcmFncmFwaDwvcD4KKworPGVtPmJvbGQ8L2VtPgorCis8cD57Ojpub21hcmtkb3dufQorQW5vdGhlciBwYXJhZ3JhcGg8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL25vbWFya2Rvd24ua3JhbWRvd24gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL25vbWFya2Rvd24ua3JhbWRvd24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlZTUxMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vbm9tYXJrZG93bi5rcmFtZG93bgpAQCAtMCwwICsxLDIwIEBACitUaGlzIGlzIGEgc2ltcGxlIHBhcmFncmFwaC4KKworezo6bm9tYXJrZG93bn0KK1RoaXMgKmlzKiBub3QgcHJvY2Vzc2VkIAorezovfQorCitBbmQgYW5vdGhlciBwYXJhZ3JhcGgKKworezo6bm9tYXJrZG93biB0eXBlPSJodG1sIn0KKzxlbT5ib2xkPC9lbT4KK3s6L30KKworezo6bm9tYXJrZG93biB0eXBlPSJsYXRleCJ9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtW1llc10gWUVTU1NTIQorXGVuZHtpdGVtaXplfQorezovfQorCitcezo6bm9tYXJrZG93bn0gQW5vdGhlciBwYXJhZ3JhcGgKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9ub21hcmtkb3duLmxhdGV4IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9ub21hcmtkb3duLmxhdGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjAyNjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL25vbWFya2Rvd24ubGF0ZXgKQEAgLTAsMCArMSwxMyBAQAorVGhpcyBpcyBhIHNpbXBsZSBwYXJhZ3JhcGguCisKK1RoaXMgKmlzKiBub3QgcHJvY2Vzc2VkIAorCitBbmQgYW5vdGhlciBwYXJhZ3JhcGgKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbVtZZXNdIFlFU1NTUyEKK1xlbmR7aXRlbWl6ZX0KKworXHs6Om5vbWFya2Rvd25cfQorQW5vdGhlciBwYXJhZ3JhcGgKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9ub21hcmtkb3duLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL25vbWFya2Rvd24udGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q0NDFkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9ub21hcmtkb3duLnRleHQKQEAgLTAsMCArMSwyMSBAQAorVGhpcyBpcyBhIHNpbXBsZSBwYXJhZ3JhcGguCisKK3s6Om5vbWFya2Rvd259ICAKK1RoaXMgKmlzKiBub3QgcHJvY2Vzc2VkIAorICB7Oi9ub21hcmtkb3dufQorCitBbmQgYW5vdGhlciBwYXJhZ3JhcGgKKworezo6bm9tYXJrZG93biB0aGlzPSdpcycgLmlnbm9yZSAvfQorCit7Ojpub21hcmtkb3duIHR5cGU9J2h0bWwnfQorPGVtPmJvbGQ8L2VtPgorezovfQorezo6bm9tYXJrZG93biB0eXBlPSJsYXRleCJ9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtW1llc10gWUVTU1NTIQorXGVuZHtpdGVtaXplfQorezovfQorCit7Ojpub21hcmtkb3dufQorQW5vdGhlciBwYXJhZ3JhcGgKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vb3B0aW9ucy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9vcHRpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjNjlmMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vb3B0aW9ucy5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzxoMT5ObyBoZWFkZXIgaWQ8L2gxPgorCis8aDE+d2l0aG91dCBoZWFkZXIgaWQ8L2gxPgorCis8ZGl2Pgorc29tZSA8c3Bhbj4qcGFyYSo8L3NwYW4+Cis8L2Rpdj4KKworPGRpdj4KKyAgPHA+c29tZSA8c3Bhbj48ZW0+cGFyYTwvZW0+PC9zcGFuPjwvcD4KKzwvZGl2PgorCis8cD5Tb21lIHRleHQ8c3VwIGlkPSJmbnJlZjphYiI+PGEgaHJlZj0iI2ZuOmFiIiBjbGFzcz0iZm9vdG5vdGUiPjEwPC9hPjwvc3VwPi48L3A+CisKKzxkaXYgY2xhc3M9ImZvb3Rub3RlcyI+CisgIDxvbCBzdGFydD0iMTAiPgorICAgIDxsaSBpZD0iZm46YWIiPgorICAgICAgPHA+U29tZSB0ZXh0LiZuYnNwOzxhIGhyZWY9IiNmbnJlZjphYiIgY2xhc3M9InJldmVyc2Vmb290bm90ZSI+JiM4NjE3OzwvYT48L3A+CisgICAgPC9saT4KKyAgPC9vbD4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9vcHRpb25zLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTkxYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9vcHRpb25zLnRleHQKQEAgLTAsMCArMSwyMSBAQAorIyBObyBoZWFkZXIgaWQKKworezo6b3B0aW9ucyB1bnVzZWR2YXI9InZhbCIgL30KKworIyB3aXRob3V0IGhlYWRlciBpZAorCis8ZGl2Pgorc29tZSA8c3Bhbj4qcGFyYSo8L3NwYW4+Cis8L2Rpdj4KKworezo6b3B0aW9ucyBwYXJzZV9ibG9ja19odG1sPSJ0cnVlIiBwYXJzZV9zcGFuX2h0bWw9InRydWUiIC99CisKKzxkaXY+Citzb21lIDxzcGFuPipwYXJhKjwvc3Bhbj4KKzwvZGl2PgorCit7OjpvcHRpb25zIGZvb3Rub3RlX25yPSIxMCIgL30KKworU29tZSB0ZXh0W15hYl0uCisKK1teYWJdOiBTb21lIHRleHQuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMyLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyNGQzYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vb3B0aW9uczIuaHRtbApAQCAtMCwwICsxLDEwIEBACisKKzxwPlNvbWUgdGV4dDxzdXAgaWQ9ImZucmVmOmFiIj48YSBocmVmPSIjZm46YWIiIGNsYXNzPSJmb290bm90ZSI+MTwvYT48L3N1cD4uPC9wPgorCis8ZGl2IGNsYXNzPSJmb290bm90ZXMiPgorICA8b2w+CisgICAgPGxpIGlkPSJmbjphYiI+CisgICAgICA8cD5Tb21lIHRleHQuJm5ic3A7PGEgaHJlZj0iI2ZucmVmOmFiIiBjbGFzcz0icmV2ZXJzZWZvb3Rub3RlIj4mIzg2MTc7PC9hPjwvcD4KKyAgICA8L2xpPgorICA8L29sPgorPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMyLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMyLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYmZiZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vb3B0aW9uczIudGV4dApAQCAtMCwwICsxLDUgQEAKK3s6Om9wdGlvbnMgZm9vdG5vdGVfbnI9ImRhMTAiIC99CisKK1NvbWUgdGV4dFteYWJdLgorCitbXmFiXTogU29tZSB0ZXh0LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9vcHRpb25zMy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEyX2V4dGVuc2lvbi9vcHRpb25zMy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MzRkZjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMzLmh0bWwKQEAgLTAsMCArMSw3IEBACis8ZGl2IGNsYXNzPSJsYW5ndWFnZS1ydWJ5IGhpZ2hsaWdodGVyLWNvZGVyYXkiPjxzcGFuIGNsYXNzPSJDb2RlUmF5Ij54ID0gPHNwYW4gY2xhc3M9ImNvbnN0YW50Ij5DbGFzczwvc3Bhbj4ubmV3Cis8L3NwYW4+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGFuZ3VhZ2UtcnVieSBoaWdobGlnaHRlci1jb2RlcmF5Ij48c3BhbiBjbGFzcz0iQ29kZVJheSI+eCA9IDxzcGFuIGNsYXNzPSJjb25zdGFudCI+Q2xhc3M8L3NwYW4+Lm5ldworPC9zcGFuPgorPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTJfZXh0ZW5zaW9uL29wdGlvbnMzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlZTg3YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xMl9leHRlbnNpb24vb3B0aW9uczMudGV4dApAQCAtMCwwICsxLDcgQEAKKyAgICB4ID0gQ2xhc3MubmV3Cit7OiAubGFuZ3VhZ2UtcnVieX0KKworezo6b3B0aW9ucyBjb2RlcmF5X3dyYXA9InNwYW4iIGNvZGVyYXlfbGluZV9udW1iZXJzPSIiIGNvZGVyYXlfY3NzPSJjbGFzcyIgY29kZXJheV90YWJfd2lkdGg9IjQiIC99CisKKyAgICB4ID0gQ2xhc3MubmV3Cit7OiAubGFuZ3VhZ2UtcnVieX0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvYXV0b19pZHMuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvYXV0b19pZHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTg2MjhhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9hdXRvX2lkcy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxkbD4KKyAgPGR0IGlkPSJpdGVtIj5pdGVtPC9kdD4KKyAgPGRkPmRlZjwvZGQ+CisgIDxkdCBpZD0iaXRlbTIiPml0ZW0yPC9kdD4KKyAgPGRkPmRlZjwvZGQ+Cis8L2RsPgorCis8ZGw+CisgIDxkdCBpZD0icHJlZml4LWl0ZW0iPml0ZW08L2R0PgorICA8ZGQ+ZGVmPC9kZD4KKyAgPGR0IGlkPSJwcmVmaXgtaXRlbTIiPml0ZW0yPC9kdD4KKyAgPGRkPmRlZjwvZGQ+CisgIDxkdCBpZD0iaWQiPml0ZW0zPC9kdD4KKyAgPGRkPmRlZjwvZGQ+Cis8L2RsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9hdXRvX2lkcy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9hdXRvX2lkcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzk3YTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2F1dG9faWRzLnRleHQKQEAgLTAsMCArMSwxOCBAQAorezphdXRvX2lkc30KK2l0ZW0KKzogZGVmCisKK2l0ZW0yCis6IGRlZgorCiteCisKK3s6YXV0b19pZHMtcHJlZml4LX0KK2l0ZW0KKzogZGVmCisKK2l0ZW0yCis6IGRlZgorCit7OiNpZH0gaXRlbTMKKzogZGVmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2RlZmluaXRpb25fYXRfYmVnaW5uaW5nLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2RlZmluaXRpb25fYXRfYmVnaW5uaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1Y2MwNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvZGVmaW5pdGlvbl9hdF9iZWdpbm5pbmcuaHRtbApAQCAtMCwwICsxIEBACis8cD46IG5vIGRlZmluaXRpb248L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2RlZmluaXRpb25fYXRfYmVnaW5uaW5nLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2RlZmluaXRpb25fYXRfYmVnaW5uaW5nLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzNjcxYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvZGVmaW5pdGlvbl9hdF9iZWdpbm5pbmcudGV4dApAQCAtMCwwICsxIEBACis6IG5vIGRlZmluaXRpb24KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvZGVmbGlzdF9pYWwuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvZGVmbGlzdF9pYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDkwYjFlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9kZWZsaXN0X2lhbC5odG1sCkBAIC0wLDAgKzEsNCBAQAorPGRsIGNsYXNzPSJkbC1ob3Jpem9udGFsIGRsLW90aGVyIj4KKyAgPGR0Pml0ZW08L2R0PgorICA8ZGQ+ZGVmaW5pdGlvbjwvZGQ+Cis8L2RsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9kZWZsaXN0X2lhbC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9kZWZsaXN0X2lhbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4N2MzYjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2RlZmxpc3RfaWFsLnRleHQKQEAgLTAsMCArMSw0IEBACit7Oi5kbC1ob3Jpem9udGFsfQoraXRlbQorOiAgIGRlZmluaXRpb24KK3s6LmRsLW90aGVyfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9pdGVtX2lhbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9pdGVtX2lhbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDExOTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2l0ZW1faWFsLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPGRsPgorICA8ZHQ+aXRlbTwvZHQ+CisgIDxkZCBjbGFzcz0iY2xzIj5kZWZpbml0aW9uCitjb250aW51ZWQ8L2RkPgorICA8ZGQ+YW5vdGhlciB7Oi5jbHN9PC9kZD4KKyAgPGRkIGNsYXNzPSJjbGFzcyI+CisgICAgPHByZT48Y29kZT5jb2RlCis8L2NvZGU+PC9wcmU+CisgIDwvZGQ+CisgIDxkZCBjbGFzcz0iY2xzIj5JQUwgYXQgbGFzdAorICAgIG5vIGNvZGUgYmMgb2YgdGV4dDwvZGQ+CisgIDxkdCBjbGFzcz0iY2xhc3MiPnRlcm08L2R0PgorICA8ZGQ+ZGVmaW5pdGlvbjwvZGQ+CisgIDxkdCBjbGFzcz0iY2xhc3MxIj50ZXJtMTwvZHQ+CisgIDxkdCBjbGFzcz0iY2xhc3MyIj50ZXJtMjwvZHQ+CisgIDxkZD5kZWZpbml0aW9uPC9kZD4KKzwvZGw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2l0ZW1faWFsLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L2l0ZW1faWFsLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1OGQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvaXRlbV9pYWwudGV4dApAQCAtMCwwICsxLDE2IEBACitpdGVtCis6ICAgezouY2xzfSBkZWZpbml0aW9uCisgICAgY29udGludWVkCis6IGFub3RoZXIgezouY2xzfQorOiB7Oi5jbGFzc30KKyAgICAgICAgY29kZQorOiB7Oi5jbHN9IElBTCBhdCBsYXN0CisgICAgICBubyBjb2RlIGJjIG9mIHRleHQKKworCit7Oi5jbGFzc30gdGVybQorOiBkZWZpbml0aW9uCisKK3s6LmNsYXNzMX0gdGVybTEKK3s6LmNsYXNzMn0gdGVybTIKKzogZGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9tdWx0aXBsZV90ZXJtcy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9tdWx0aXBsZV90ZXJtcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTA4OWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L211bHRpcGxlX3Rlcm1zLmh0bWwKQEAgLTAsMCArMSwxMyBAQAorPGRsPgorICA8ZHQ+a3JhbTwvZHQ+CisgIDxkdD48ZW0+ZG93bjwvZW0+PC9kdD4KKyAgPGR0Pm5vdzwvZHQ+CisgIDxkZD5kZWZpbml0aW9uIDE8L2RkPgorICA8ZGQ+ZGVmaW5pdGlvbiAyPC9kZD4KKyAgPGRkPgorICAgIDxwPmRlZmluaXRpb24gMzwvcD4KKyAgPC9kZD4KKyAgPGRkPgorICAgIDxwPmRlZmluaXRpb24gNDwvcD4KKyAgPC9kZD4KKzwvZGw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L211bHRpcGxlX3Rlcm1zLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L211bHRpcGxlX3Rlcm1zLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzNDI1OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvbXVsdGlwbGVfdGVybXMudGV4dApAQCAtMCwwICsxLDEwIEBACitrcmFtCisqZG93bioKK25vdworOiBkZWZpbml0aW9uIDEKKzogZGVmaW5pdGlvbiAyCisKKzogZGVmaW5pdGlvbiAzCisKKworOiBkZWZpbml0aW9uIDQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvbm9fZGVmX2xpc3QuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvbm9fZGVmX2xpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZmOTYyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9ub19kZWZfbGlzdC5odG1sCkBAIC0wLDAgKzEsMiBAQAorPHA+VGhpcyBpcyBhIHBhcmEKKzogYW5kIG5vdCBhIGRlZmluaXRpb24gbGlzdDwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvbm9fZGVmX2xpc3QudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvbm9fZGVmX2xpc3QudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGI1MmIzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9ub19kZWZfbGlzdC50ZXh0CkBAIC0wLDAgKzEsMiBAQAorVGhpcyBpcyBhIHBhcmEKK1w6IGFuZCBub3QgYSBkZWZpbml0aW9uIGxpc3QKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvcGFyYV93cmFwcGluZy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9wYXJhX3dyYXBwaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyOGZkZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvcGFyYV93cmFwcGluZy5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxkbD4KKyAgPGR0PnRlcm08L2R0PgorICA8ZGQ+CisgICAgPHA+ZGVmaW5pdGlvbjwvcD4KKyAgPC9kZD4KKyAgPGRkPmRlZmluaXRpb248L2RkPgorICA8ZGQ+CisgICAgPHA+ZGVmaW5pdGlvbjwvcD4KKyAgPC9kZD4KKzwvZGw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3BhcmFfd3JhcHBpbmcudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvcGFyYV93cmFwcGluZy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGZhNDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3BhcmFfd3JhcHBpbmcudGV4dApAQCAtMCwwICsxLDYgQEAKK3Rlcm0KKworOiBkZWZpbml0aW9uCis6IGRlZmluaXRpb24KKworOiBkZWZpbml0aW9uCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3NlcGFyYXRlZF9ieV9lb2IuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvc2VwYXJhdGVkX2J5X2VvYi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMWM0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3NlcGFyYXRlZF9ieV9lb2IuaHRtbApAQCAtMCwwICsxLDggQEAKKzxkbD4KKyAgPGR0PmtyYW08L2R0PgorICA8ZGQ+ZG93bjwvZGQ+Cis8L2RsPgorPGRsPgorICA8ZHQ+a3JhbTwvZHQ+CisgIDxkZD5kb3duPC9kZD4KKzwvZGw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3NlcGFyYXRlZF9ieV9lb2IudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvc2VwYXJhdGVkX2J5X2VvYi50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmVkZjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3NlcGFyYXRlZF9ieV9lb2IudGV4dApAQCAtMCwwICsxLDUgQEAKK2tyYW0KKzogZG93bgorXgora3JhbQorOiBkb3duCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3NpbXBsZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9zaW1wbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFmMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9zaW1wbGUuaHRtbApAQCAtMCwwICsxLDEwIEBACis8ZGw+CisgIDxkdD5rcmFtPC9kdD4KKyAgPGRkPmRvd248L2RkPgorICA8ZHQ+bm92YWx1ZTwvZHQ+CisgIDxkZD48L2RkPgorICA8ZHQ+a3JhbTwvZHQ+CisgIDxkZD5kb3duCitrcmFtPC9kZD4KKyAgPGRkPmRvd248L2RkPgorPC9kbD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvc2ltcGxlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3NpbXBsZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYmY3MzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3NpbXBsZS50ZXh0CkBAIC0wLDAgKzEsMTAgQEAKK2tyYW0KKzogZG93bgorCitub3ZhbHVlCis6IAorCitrcmFtCis6ICAgZG93bgora3JhbQorOiBkb3duCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3N0eWxlZF90ZXJtcy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9zdHlsZWRfdGVybXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdkNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9zdHlsZWRfdGVybXMuaHRtbApAQCAtMCwwICsxLDQgQEAKKzxkbD4KKyAgPGR0PjxlbT5rcmFtPC9lbT48L2R0PgorICA8ZGQ+ZG93bjwvZGQ+Cis8L2RsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC9zdHlsZWRfdGVybXMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvc3R5bGVkX3Rlcm1zLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlYjM1NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvc3R5bGVkX3Rlcm1zLnRleHQKQEAgLTAsMCArMSwyIEBACisqa3JhbSoKKzogZG93bgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC90b29fbXVjaF9zcGFjZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC90b29fbXVjaF9zcGFjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGY4NzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3Rvb19tdWNoX3NwYWNlLmh0bWwKQEAgLTAsMCArMSwzIEBACis8cD5wYXJhPC9wPgorCis8cD46IG5vIGRlZmluaXRpb248L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3Rvb19tdWNoX3NwYWNlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3Rvb19tdWNoX3NwYWNlLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhYjQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3QvdG9vX211Y2hfc3BhY2UudGV4dApAQCAtMCwwICsxLDQgQEAKK3BhcmEKKworCis6IG5vIGRlZmluaXRpb24KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvd2l0aF9ibG9ja3MuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xM19kZWZpbml0aW9uX2xpc3Qvd2l0aF9ibG9ja3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWI1ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC93aXRoX2Jsb2Nrcy5odG1sCkBAIC0wLDAgKzEsMzggQEAKKzxkbD4KKyAgPGR0PmtyYW08L2R0PgorICA8ZGQ+dGhpcyBpcyBzb21lCit0ZXh0PC9kZD4KKyAgPGRkPgorICAgIDxwPnRoaXMgaXMgc29tZQorbW9yZSB0ZXh0PC9wPgorICA8L2RkPgorICA8ZHQ+a3JhbTwvZHQ+CisgIDxkZD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwPmJsb2NrcXVvdGU8L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2RkPgorICA8ZHQ+a3JhbTwvZHQ+CisgIDxkZD4KKyAgICA8cHJlPjxjb2RlPmNvZGUKKzwvY29kZT48L3ByZT4KKyAgPC9kZD4KKyAgPGR0PmtyYW08L2R0PgorICA8ZGQ+CisgICAgPGRsPgorICAgICAgPGR0PmtyYW08L2R0PgorICAgICAgPGRkPmRvd248L2RkPgorICAgIDwvZGw+CisgIDwvZGQ+CisgIDxkdD5rcmFtPC9kdD4KKyAgPGRkPgorICAgIDxoMT5oZWFkZXI8L2gxPgorICA8L2RkPgorICA8ZHQ+a3JhbTwvZHQ+CisgIDxkZD4KKyAgICA8dWw+CisgICAgICA8bGk+bGlzdDwvbGk+CisgICAgICA8bGk+aXRlbXM8L2xpPgorICAgIDwvdWw+CisgIDwvZGQ+Cis8L2RsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC93aXRoX2Jsb2Nrcy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzEzX2RlZmluaXRpb25fbGlzdC93aXRoX2Jsb2Nrcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTk1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTNfZGVmaW5pdGlvbl9saXN0L3dpdGhfYmxvY2tzLnRleHQKQEAgLTAsMCArMSwyNCBAQAora3JhbQorOiB0aGlzIGlzIHNvbWUKKyAgdGV4dAorCisgOiAgIHRoaXMgaXMgc29tZQorICAgICBtb3JlIHRleHQKKwora3JhbQorOiA+IGJsb2NrcXVvdGUKKwora3JhbQorOiAKKyAgICAgICAgY29kZQorCitrcmFtCis6IGtyYW0KKyAgOiBkb3duCisKK2tyYW0KKzogIyBoZWFkZXIKKwora3JhbQorOiAqIGxpc3QKKyAgKiBpdGVtcwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL2Vycm9ycy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL2Vycm9ycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmU5N2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZXJyb3JzLmh0bWwKQEAgLTAsMCArMSwxMiBAQAorPHA+Tm8gdGFibGUgYm9keTwvcD4KKworPHA+fC18LXwtPC9wPgorCis8cD58bm98dGFibGV8aGVyZXw8L3A+CisKKzxwPnxub3x0YWJsZXxoZXJlfAorcGFyYWdyYXBoPC9wPgorCis8cD58LXwtfAorfC18LXw8L3A+CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9lcnJvcnMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9lcnJvcnMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTY1ZDViCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL2Vycm9ycy50ZXh0CkBAIC0wLDAgKzEsMTMgQEAKK05vIHRhYmxlIGJvZHkKKworfC18LXwtCisKK1s1XTogdGVzdAorfG5vfHRhYmxlfGhlcmV8CisKK3xub3x0YWJsZXxoZXJlfAorcGFyYWdyYXBoCisKK3wtfC18Cit8LXwtfAorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZXNjYXBpbmcuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9lc2NhcGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTI4YTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZXNjYXBpbmcuaHRtbApAQCAtMCwwICsxLDUyIEBACis8cD48Y29kZT5jZWxsIDEgfCBjZWxsIDI8L2NvZGU+PC9wPgorCis8cD5jZWxsIDEgfCBjZWxsIDI8L3A+CisKKzx0YWJsZT4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsIDE8L3RkPgorICAgICAgPHRkPmNlbGwgMiB8IGNvbnRpbnVlZDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzx0YWJsZT4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsIDE8L3RkPgorICAgICAgPHRkPmNlbGwgPGNvZGU+MjwvY29kZT48L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbCAxPC90ZD4KKyAgICAgIDx0ZD48Y29kZT5jb2RlIHwgc3BhbjwvY29kZT48L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5jZWxsIDEgPGNvZGU+Y29kZSB8IHNwYW48L2NvZGU+PC9wPgorCis8cD5jZWxsIDEgfCA8Y29kZT5jb2RlIHwgc3BhbjwvY29kZT48L3A+CisKKzx0YWJsZT4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsIDE8L3RkPgorICAgICAgPHRkPmNlbGwgYDI8L3RkPgorICAgICAgPHRkPmNlbGwgMzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbCAxYDwvdGQ+CisgICAgICA8dGQ+Y2VsbCAyPC90ZD4KKyAgICAgIDx0ZD5jZWxsIDM8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5jZWxsIDEgfCBjZWxsIDxjb2RlPjIgfCBjZWxsIDMKK2NlbGwgMTwvY29kZT4gfCBjZWxsIDIgfCBjZWxsIDM8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZXNjYXBpbmcudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9lc2NhcGluZy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTI0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZXNjYXBpbmcudGV4dApAQCAtMCwwICsxLDE5IEBACitgY2VsbCAxIHwgY2VsbCAyYAorCitjZWxsIDEgXHwgY2VsbCAyCisKK2NlbGwgMSB8IGNlbGwgMiBcfCBjb250aW51ZWQKKworY2VsbCAxIHwgY2VsbCBgMmAKKworY2VsbCAxIHwgYGNvZGUgfCBzcGFuYAorCitjZWxsIDEgYGNvZGUgfCBzcGFuYAorCitjZWxsIDEgXHwgYGNvZGUgfCBzcGFuYAorCitjZWxsIDEgfCBjZWxsIGAyIHwgY2VsbCAzCitjZWxsIDFgIHwgY2VsbCAyIHwgY2VsbCAzCisKK2NlbGwgMSBcfCBjZWxsIGAyIHwgY2VsbCAzCitjZWxsIDFgIHwgY2VsbCAyIHwgY2VsbCAzCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZm9vdGVyLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZm9vdGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1OTZlZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9mb290ZXIuaHRtbApAQCAtMCwwICsxLDY1IEBACis8cD5TaW1wbGUgZm9vdGVyPC9wPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDE8L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorICA8dGZvb3Q+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwzPC90ZD4KKyAgICAgIDx0ZD5jZWxsNDwvdGQ+CisgICAgPC90cj4KKyAgPC90Zm9vdD4KKzwvdGFibGU+CisKKzxwPkZ1bGwgZm9vdGVyPC9wPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDE8L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorICA8dGZvb3Q+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwzPC90ZD4KKyAgICAgIDx0ZD5jZWxsNDwvdGQ+CisgICAgPC90cj4KKyAgPC90Zm9vdD4KKzwvdGFibGU+CisKKzxwPkZvb3RlciB3aXRoIHNlcGFyYXRvciBsaW5lczwvcD4KKworPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwxPC90ZD4KKyAgICAgIDx0ZD5jZWxsMjwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKyAgPHRmb290PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMzwvdGQ+CisgICAgICA8dGQ+Y2VsbDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGw1PC90ZD4KKyAgICAgIDx0ZD5jZWxsNjwvdGQ+CisgICAgPC90cj4KKyAgPC90Zm9vdD4KKzwvdGFibGU+CisKKzxwPkVtcHR5IGZvb3RlcjwvcD4KKworPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwxPC90ZD4KKyAgICAgIDx0ZD5jZWxsMjwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZm9vdGVyLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvZm9vdGVyLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhZWQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9mb290ZXIudGV4dApAQCAtMCwwICsxLDI1IEBACitTaW1wbGUgZm9vdGVyCisKK3wgY2VsbDEgfCBjZWxsMgorfD0KK3wgY2VsbDMgfCBjZWxsNAorCitGdWxsIGZvb3RlcgorCit8IGNlbGwxIHwgY2VsbDIKK3w9PT09PT09fD09PT09PT18Cit8IGNlbGwzIHwgY2VsbDQKKworRm9vdGVyIHdpdGggc2VwYXJhdG9yIGxpbmVzCisKK3wgY2VsbDEgfCBjZWxsMgorfD09PT09PT18PT09PT09PXwKK3wgY2VsbDMgfCBjZWxsNAorfC0tLQorfCBjZWxsNSB8IGNlbGw2Cit8LS0tCisKK0VtcHR5IGZvb3RlcgorCit8IGNlbGwxIHwgY2VsbDIKK3w9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvaGVhZGVyLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvaGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3ZjJjNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9oZWFkZXIuaHRtbApAQCAtMCwwICsxLDExNyBAQAorPHA+U2ltcGxlIGhlYWRlcjwvcD4KKworPHRhYmxlPgorICA8dGhlYWQ+CisgICAgPHRyPgorICAgICAgPHRoPmNlbGwxPC90aD4KKyAgICAgIDx0aD5jZWxsMjwvdGg+CisgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMzwvdGQ+CisgICAgICA8dGQ+Y2VsbDQ8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5GdWxsIGhlYWRlcjwvcD4KKworPHRhYmxlPgorICA8dGhlYWQ+CisgICAgPHRyPgorICAgICAgPHRoPmNlbGwxPC90aD4KKyAgICAgIDx0aD5jZWxsMjwvdGg+CisgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMzwvdGQ+CisgICAgICA8dGQ+Y2VsbDQ8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5XaXRoIGFsaWdubWVudCBhbmQgc3VwZXJmbHVvdXMgYWxpZ25tZW50IGRlZnM8L3A+CisKKzx0YWJsZT4KKyAgPHRoZWFkPgorICAgIDx0cj4KKyAgICAgIDx0aD5kZWZhdWx0PC90aD4KKyAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdCI+bGVmdDwvdGg+CisgICAgICA8dGggc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Y2VudGVyPC90aD4KKyAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPnJpZ2h0PC90aD4KKyAgICAgIDx0aD5kZWZhdWx0PC90aD4KKyAgICA8L3RyPgorICA8L3RoZWFkPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwxPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdCI+Y2VsbDI8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPmNlbGwzPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPmNlbGw0PC90ZD4KKyAgICAgIDx0ZD5jZWxsNTwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPldpdGggbGVhZGluZyBzZXAgbGluZTwvcD4KKworPHRhYmxlPgorICA8dGhlYWQ+CisgICAgPHRyPgorICAgICAgPHRoPmNlbGwxPC90aD4KKyAgICAgIDx0aD5jZWxsMjwvdGg+CisgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMzwvdGQ+CisgICAgICA8dGQ+Y2VsbDQ8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5NdWx0aXBsZSBib2RpZXM8L3A+CisKKzx0YWJsZT4KKyAgPHRoZWFkPgorICAgIDx0cj4KKyAgICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj5jZWxsMTwvdGg+CisgICAgICA8dGg+Y2VsbDI8L3RoPgorICAgIDwvdHI+CisgIDwvdGhlYWQ+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Y2VsbDM8L3RkPgorICAgICAgPHRkPmNlbGw0PC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPmNlbGw1PC90ZD4KKyAgICAgIDx0ZD5jZWxsNjwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPlNlcCBsaW5lIHdpdGggdGFiPC9wPgorCis8dGFibGU+CisgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGggc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0Ij5yaWdodDwvdGg+CisgICAgICA8dGggc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Y2VudGVyPC90aD4KKyAgICA8L3RyPgorICA8L3RoZWFkPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodCI+Y2VsbDE8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPmNlbGwyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPmNlbGwzPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj5jZWxsNDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvaGVhZGVyLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvaGVhZGVyLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2MWJmYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9oZWFkZXIudGV4dApAQCAtMCwwICsxLDM5IEBACitTaW1wbGUgaGVhZGVyCisKK3wgY2VsbDEgfCBjZWxsMgorfC0tLS0tCit8IGNlbGwzIHwgY2VsbDQKKworRnVsbCBoZWFkZXIKKworfCBjZWxsMSB8IGNlbGwyCit8LS0tLS0tLXwtLS0tLS0tfAorfCBjZWxsMyB8IGNlbGw0CisKK1dpdGggYWxpZ25tZW50IGFuZCBzdXBlcmZsdW91cyBhbGlnbm1lbnQgZGVmcworCit8IGRlZmF1bHQgfCBsZWZ0IHwgY2VudGVyIHwgcmlnaHQgfCBkZWZhdWx0Cit8LXwgOi0gfDotOiB8IC06IHwgLSB8IDotOiB8IDotCit8IGNlbGwxIHwgY2VsbDIgfCBjZWxsMyB8IGNlbGw0IHwgY2VsbDUKKworV2l0aCBsZWFkaW5nIHNlcCBsaW5lCisKK3w6LTp8LTp8Cit8IGNlbGwxIHwgY2VsbDIKK3wtLS0tLS0tfC0tLS0tLS18Cit8IGNlbGwzIHwgY2VsbDQKKworTXVsdGlwbGUgYm9kaWVzCisKK3wgY2VsbDEgfCBjZWxsMgorKyA6LTogfAorfCBjZWxsMyB8IGNlbGw0Cit8LS0tLXx8fAorfCBjZWxsNSB8IGNlbGw2CisKK1NlcCBsaW5lIHdpdGggdGFiCisKK3JpZ2h0IHwgY2VudGVyCistLS06ICAJfAk6LS0tOgorY2VsbDEgfCBjZWxsMgorY2VsbDMgfCBjZWxsNApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL25vX3RhYmxlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvbm9fdGFibGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2U0NmIxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL25vX3RhYmxlLmh0bWwKQEAgLTAsMCArMSwzIEBACis8cD5ObyB0YWJsZTwvcD4KKworPHA+fCBTb21lIHwgdGhpbmcgfCBoZXJlPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL25vX3RhYmxlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvbm9fdGFibGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGY5MGIzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL25vX3RhYmxlLnRleHQKQEAgLTAsMCArMSwzIEBACitObyB0YWJsZQorCitcfCBTb21lIFx8IHRoaW5nIFx8IGhlcmUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9zaW1wbGUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9zaW1wbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODZiMWExCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL3NpbXBsZS5odG1sCkBAIC0wLDAgKzEsMTc3IEBACis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDE8L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMzwvdGQ+CisgICAgICA8dGQ+Y2VsbDQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGw1PC90ZD4KKyAgICAgIDx0ZD5jZWxsNiB8PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsNzwvdGQ+CisgICAgICA8dGQ+Y2VsbDg8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5NaXNzaW5nIGNlbGxzIGF0IGVuZDwvcD4KKworPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwxPC90ZD4KKyAgICAgIDx0ZD5jZWxsMjwvdGQ+CisgICAgICA8dGQ+Y2VsbDM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwxPC90ZD4KKyAgICAgIDx0ZD4mIzE2MDs8L3RkPgorICAgICAgPHRkPiYjMTYwOzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+JiMxNjA7PC90ZD4KKyAgICAgIDx0ZD5jZWxsMjwvdGQ+CisgICAgICA8dGQ+Y2VsbDM8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5Fc2NhcGVkIHBpcGUgY2hhcmFjdGVyczwvcD4KKworPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwxIHwgY2VsbDE8L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMTwvdGQ+CisgICAgICA8dGQ+Y2VsbDIgfDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDEgPGNvZGU+fDwvY29kZT4gY29uPC90ZD4KKyAgICAgIDx0ZD5jZWxsMjwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPlRhYmxlIHdpdGggY29kZSBlbGVtZW50czwvcD4KKworPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPlRoaXMgaXMgYSA8Y29kZT5zcGFuIHwgd2l0aDwvY29kZT4gYSBwaXBlLjwvdGQ+CisgICAgICA8dGQ+JiMxNjA7PC90ZD4KKyAgICAgIDx0ZD4mIzE2MDs8L3RkPgorICAgICAgPHRkPiYjMTYwOzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+U29tZSA8ZW0+c3BhbjwvZW0+PC90ZD4KKyAgICAgIDx0ZD4mbHQ7L2VtJmd0OyBoZXJlPC90ZD4KKyAgICAgIDx0ZD5hIDxjb2RlPnNwYW4gfCB3aXRoPC9jb2RlPiBhPC90ZD4KKyAgICAgIDx0ZD5waXBlLjwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPlNwZWNpYWwgY2FzZXMgcmVnYXJkaW5nIGNvZGVzcGFuIHN5bnRheDwvcD4KKworPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPmE8L3RkPgorICAgICAgPHRkPjxjb2RlPmI8L2NvZGU+PC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPjxjb2RlPmE8L2NvZGU+PC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHRhYmxlIGNsYXNzPSJjbHMiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPnRhYmxlPC90ZD4KKyAgICAgIDx0ZD53aXRoPC90ZD4KKyAgICAgIDx0ZD5pYWw8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8dGFibGUgY2xhc3M9ImNscyI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+dGFibGU8L3RkPgorICAgICAgPHRkPndpdGg8L3RkPgorICAgICAgPHRkPmlhbDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPm5vdCBzdGFydGluZyB3aXRoIGEgYmFyPC9wPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+c2ltcGxlPC90ZD4KKyAgICAgIDx0ZD50YWJsZTwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzx0YWJsZT4KKyAgPHRoZWFkPgorICAgIDx0cj4KKyAgICAgIDx0aD5oZWFkMTwvdGg+CisgICAgICA8dGg+aGVhZDI8L3RoPgorICAgIDwvdHI+CisgIDwvdGhlYWQ+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDE8L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHRhYmxlPgorICA8dGhlYWQ+CisgICAgPHRyPgorICAgICAgPHRoPmhlYWQxPC90aD4KKyAgICAgIDx0aD5oZWFkMjwvdGg+CisgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD4mIzE2MDs8L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPmE8L3RkPgorICAgICAgPHRkPmI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmM8L3RkPgorICAgICAgPHRkPmQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmU8L3RkPgorICAgICAgPHRkPmY8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL3NpbXBsZS5odG1sLjE5IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL3NpbXBsZS5odG1sLjE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiN2M4OTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvc2ltcGxlLmh0bWwuMTkKQEAgLTAsMCArMSwxNzcgQEAKKzx0YWJsZT4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMTwvdGQ+CisgICAgICA8dGQ+Y2VsbDI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwzPC90ZD4KKyAgICAgIDx0ZD5jZWxsNDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDU8L3RkPgorICAgICAgPHRkPmNlbGw2IHw8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGw3PC90ZD4KKyAgICAgIDx0ZD5jZWxsODwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPk1pc3NpbmcgY2VsbHMgYXQgZW5kPC9wPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDE8L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICAgIDx0ZD5jZWxsMzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDE8L3RkPgorICAgICAgPHRkPsKgPC90ZD4KKyAgICAgIDx0ZD7CoDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+wqA8L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICAgIDx0ZD5jZWxsMzwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPkVzY2FwZWQgcGlwZSBjaGFyYWN0ZXJzPC9wPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+Y2VsbDEgfCBjZWxsMTwvdGQ+CisgICAgICA8dGQ+Y2VsbDI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmNlbGwxPC90ZD4KKyAgICAgIDx0ZD5jZWxsMiB8PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMSA8Y29kZT58PC9jb2RlPiBjb248L3RkPgorICAgICAgPHRkPmNlbGwyPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHA+VGFibGUgd2l0aCBjb2RlIGVsZW1lbnRzPC9wPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+VGhpcyBpcyBhIDxjb2RlPnNwYW4gfCB3aXRoPC9jb2RlPiBhIHBpcGUuPC90ZD4KKyAgICAgIDx0ZD7CoDwvdGQ+CisgICAgICA8dGQ+wqA8L3RkPgorICAgICAgPHRkPsKgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5Tb21lIDxlbT5zcGFuPC9lbT48L3RkPgorICAgICAgPHRkPiZsdDsvZW0mZ3Q7IGhlcmU8L3RkPgorICAgICAgPHRkPmEgPGNvZGU+c3BhbiB8IHdpdGg8L2NvZGU+IGE8L3RkPgorICAgICAgPHRkPnBpcGUuPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHA+U3BlY2lhbCBjYXNlcyByZWdhcmRpbmcgY29kZXNwYW4gc3ludGF4PC9wPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+YTwvdGQ+CisgICAgICA8dGQ+PGNvZGU+YjwvY29kZT48L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8dGFibGU+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+PGNvZGU+YTwvY29kZT48L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8dGFibGUgY2xhc3M9ImNscyI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+dGFibGU8L3RkPgorICAgICAgPHRkPndpdGg8L3RkPgorICAgICAgPHRkPmlhbDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzx0YWJsZSBjbGFzcz0iY2xzIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD50YWJsZTwvdGQ+CisgICAgICA8dGQ+d2l0aDwvdGQ+CisgICAgICA8dGQ+aWFsPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHA+bm90IHN0YXJ0aW5nIHdpdGggYSBiYXI8L3A+CisKKzx0YWJsZT4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5zaW1wbGU8L3RkPgorICAgICAgPHRkPnRhYmxlPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHRhYmxlPgorICA8dGhlYWQ+CisgICAgPHRyPgorICAgICAgPHRoPmhlYWQxPC90aD4KKyAgICAgIDx0aD5oZWFkMjwvdGg+CisgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5jZWxsMTwvdGQ+CisgICAgICA8dGQ+Y2VsbDI8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8dGFibGU+CisgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGg+aGVhZDE8L3RoPgorICAgICAgPHRoPmhlYWQyPC90aD4KKyAgICA8L3RyPgorICA8L3RoZWFkPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPsKgPC90ZD4KKyAgICAgIDx0ZD5jZWxsMjwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzx0YWJsZT4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD5hPC90ZD4KKyAgICAgIDx0ZD5iPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5jPC90ZD4KKyAgICAgIDx0ZD5kPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5lPC90ZD4KKyAgICAgIDx0ZD5mPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9zaW1wbGUudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS9zaW1wbGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzE3NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL3NpbXBsZS50ZXh0CkBAIC0wLDAgKzEsNDkgQEAKK3wgY2VsbDEgfCBjZWxsMiB8Cit8Y2VsbDMgfCBjZWxsNHwKK3xjZWxsNXxjZWxsNiBcfAkKK3wgY2VsbDd8Y2VsbDggICAKKworTWlzc2luZyBjZWxscyBhdCBlbmQKKworfCBjZWxsMSB8IGNlbGwyIHwgY2VsbDMgfAorfCBjZWxsMSB8fAorfHwgY2VsbDIgfCBjZWxsMworCitFc2NhcGVkIHBpcGUgY2hhcmFjdGVycworCit8IGNlbGwxIFx8IGNlbGwxIHwgY2VsbDIgfAorfCBjZWxsMSAgICAgICAgICB8IGNlbGwyIFx8Cit8IGNlbGwxIGB8YCBjb24gfCBjZWxsMgorCitUYWJsZSB3aXRoIGNvZGUgZWxlbWVudHMKKworfCBUaGlzIGlzIGEgPGNvZGU+c3BhbiB8IHdpdGg8L2NvZGU+IGEgcGlwZS4KK3wgU29tZSA8ZW0+c3BhbiB8IDwvZW0+IGhlcmUgfCBhIDxjb2RlPnNwYW4gfCB3aXRoPC9jb2RlPiBhIHwgcGlwZS4KKworU3BlY2lhbCBjYXNlcyByZWdhcmRpbmcgY29kZXNwYW4gc3ludGF4CisKK3xhfGBiYAorCit8YGFgCisKK3s6LmNsc30KK3wgdGFibGUgfCB3aXRoIHwgaWFsCisKK3wgdGFibGUgfCB3aXRoIHwgaWFsCit7Oi5jbHN9CisKK25vdCBzdGFydGluZyB3aXRoIGEgYmFyCisKK3NpbXBsZSB8IHRhYmxlCisKK2hlYWQxIHwgaGVhZDIKKy0tLS0tLXwtLS0tLS0KK2NlbGwxIHwgY2VsbDIKKworIGhlYWQxIHwgaGVhZDIKKy0tLS0tLS18LS0tLS0tCisgICAgICAgfCBjZWxsMgorCit8IGEgfCBiIHwKKyAgYyB8IGQKK3wgZSB8IGYgfApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL3RhYmxlX3dpdGhfZm9vdG5vdGUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS90YWJsZV93aXRoX2Zvb3Rub3RlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmNjc4MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS90YWJsZV93aXRoX2Zvb3Rub3RlLmh0bWwKQEAgLTAsMCArMSwyNSBAQAorPHRhYmxlPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPnRoaXMgaXMgPHN1cCBpZD0iZm5yZWY6MSI+PGEgaHJlZj0iI2ZuOjEiIGNsYXNzPSJmb290bm90ZSI+MTwvYT48L3N1cD48L3RkPgorICAgICAgPHRkPmEgdGFibGU8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPndpdGggYTwvdGQ+CisgICAgICA8dGQ+Zm9vdG5vdGU8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8ZGl2IGNsYXNzPSJmb290bm90ZXMiPgorICA8b2w+CisgICAgPGxpIGlkPSJmbjoxIj4KKyAgICAgIDxwPlNvbWV0aGluZzwvcD4KKworICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgIDxwPnNwZWNpYWwgaGVyZTwvcD4KKyAgICAgIDwvYmxvY2txdW90ZT4KKyAgICAgIDxwPjxhIGhyZWY9IiNmbnJlZjoxIiBjbGFzcz0icmV2ZXJzZWZvb3Rub3RlIj4mIzg2MTc7PC9hPjwvcD4KKyAgICA8L2xpPgorICA8L29sPgorPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvdGFibGVfd2l0aF9mb290bm90ZS5sYXRleCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNF90YWJsZS90YWJsZV93aXRoX2Zvb3Rub3RlLmxhdGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjUzMTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvdGFibGVfd2l0aF9mb290bm90ZS5sYXRleApAQCAtMCwwICsxLDExIEBACitcYmVnaW57bG9uZ3RhYmxlfXt8bHxsfH0KK1xobGluZQordGhpcyBpcyBcZm9vdG5vdGV7U29tZXRoaW5nCisKK1xiZWdpbntxdW90ZX0KK3NwZWNpYWwgaGVyZQorXGVuZHtxdW90ZX19ICYgYSB0YWJsZVxcCit3aXRoIGEgJiBmb290bm90ZVxcCitcaGxpbmUKK1xlbmR7bG9uZ3RhYmxlfQorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTRfdGFibGUvdGFibGVfd2l0aF9mb290bm90ZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL3RhYmxlX3dpdGhfZm9vdG5vdGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDVmYzVkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE0X3RhYmxlL3RhYmxlX3dpdGhfZm9vdG5vdGUudGV4dApAQCAtMCwwICsxLDYgQEAKK3wgdGhpcyBpcyBbXjFdIHwgYSB0YWJsZQorfCB3aXRoIGEgfCBmb290bm90ZQorCitbXjFdOiBTb21ldGhpbmcKKworICAgID4gc3BlY2lhbCBoZXJlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9naF8xMjguaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL2doXzEyOC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjdiNGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9naF8xMjguaHRtbApAQCAtMCwwICsxLDIgQEAKKzxzY3JpcHQgdHlwZT0ibWF0aC90ZXg7IG1vZGU9ZGlzcGxheSI+JSA8IVtDREFUQVsKK2FsZXJ0KCdhJykgYWxlcnQoJ2I8JykgJV1dPjwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvZ2hfMTI4LnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9naF8xMjgudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTI1MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvZ2hfMTI4LnRleHQKQEAgLTAsMCArMSBAQAorJCQgPHNjcmlwdD5hbGVydCgnYScpPC9zY3JpcHQ+IDxzY3JpcHQ+YWxlcnQoJ2I8Jyk8L3NjcmlwdD4gJCQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL2l0ZXgybW1sLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9pdGV4Mm1tbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDIxMmEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9pdGV4Mm1tbC5odG1sCkBAIC0wLDAgKzEgQEAKKzxtYXRoIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJyBkaXNwbGF5PSdibG9jayc+PHNlbWFudGljcz48bXJvdz48bWk+ZjwvbWk+PG1vIHN0cmV0Y2h5PSJmYWxzZSI+KDwvbW8+PG1pPng8L21pPjxtbyBzdHJldGNoeT0iZmFsc2UiPik8L21vPjxtbz49PC9tbz48bWk+YTwvbWk+PG1yb3c+PG1zdXA+PG1pPng8L21pPiA8bW4+MzwvbW4+PC9tc3VwPjwvbXJvdz48bW8+KzwvbW8+PG1pPmI8L21pPjxtcm93Pjxtc3VwPjxtaT54PC9taT4gPG1uPjI8L21uPjwvbXN1cD48L21yb3c+PG1vPis8L21vPjxtaT5jeDwvbWk+PG1vPis8L21vPjxtaT5kPC9taT48L21yb3c+PGFubm90YXRpb24gZW5jb2Rpbmc9J2FwcGxpY2F0aW9uL3gtdGV4Jz5mKHgpID0gYXt4XjN9ICsgYnt4XjJ9ICsgY3ggKyBkPC9hbm5vdGF0aW9uPjwvc2VtYW50aWNzPjwvbWF0aD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL2l0ZXgybW1sLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9pdGV4Mm1tbC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2JkYWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9pdGV4Mm1tbC5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzptYXRoX2VuZ2luZTogaXRleDJtbWwKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL2l0ZXgybW1sLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9pdGV4Mm1tbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZmUyOTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9pdGV4Mm1tbC50ZXh0CkBAIC0wLDAgKzEgQEAKKyQkZih4KSA9IGF7eF4zfSArIGJ7eF4yfSArIGN4ICsgZCQkCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXcuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjNhODMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXcuaHRtbApAQCAtMCwwICsxLDQgQEAKKzxwPlRoaXMgaXMgYSA8c3BhbiBjbGFzcz0iTWF0aEpheF9QcmV2aWV3Ij41ICsgNTwvc3Bhbj48c2NyaXB0IHR5cGU9Im1hdGgvdGV4Ij41ICsgNTwvc2NyaXB0PiBzdGF0ZW1lbnQ8L3A+CisKKzxkaXYgY2xhc3M9Ik1hdGhKYXhfUHJldmlldyI+NSArIDU8L2Rpdj4KKzxzY3JpcHQgdHlwZT0ibWF0aC90ZXg7IG1vZGU9ZGlzcGxheSI+NSArIDU8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlldy5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3Lm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmNzAyYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlldy5vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorOm1hdGhfZW5naW5lX29wdHM6CisgIDpwcmV2aWV3OiB0cnVlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXcudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlldy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjg3NjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXcudGV4dApAQCAtMCwwICsxLDUgQEAKK1RoaXMgaXMgYSAkJDUgKyA1JCQgc3RhdGVtZW50CisKKyQkCis1ICsgNQorJCQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlld19hc19jb2RlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfYXNfY29kZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTIwZDQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfYXNfY29kZS5odG1sCkBAIC0wLDAgKzEsNCBAQAorPHA+VGhpcyBpcyBhIDxjb2RlIGNsYXNzPSJNYXRoSmF4X1ByZXZpZXciPjUgKyA1PC9jb2RlPjxzY3JpcHQgdHlwZT0ibWF0aC90ZXgiPjUgKyA1PC9zY3JpcHQ+IHN0YXRlbWVudDwvcD4KKworPHByZSBjbGFzcz0iTWF0aEpheF9QcmV2aWV3Ij48Y29kZT41ICsgNTwvY29kZT48L3ByZT4KKzxzY3JpcHQgdHlwZT0ibWF0aC90ZXg7IG1vZGU9ZGlzcGxheSI+NSArIDU8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlld19hc19jb2RlLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfYXNfY29kZS5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMGJjNTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfYXNfY29kZS5vcHRpb25zCkBAIC0wLDAgKzEsMyBAQAorOm1hdGhfZW5naW5lX29wdHM6CisgIDpwcmV2aWV3OiB0cnVlCisgIDpwcmV2aWV3X2FzX2NvZGU6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhfcHJldmlld19hc19jb2RlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfYXNfY29kZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjg3NjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfYXNfY29kZS50ZXh0CkBAIC0wLDAgKzEsNSBAQAorVGhpcyBpcyBhICQkNSArIDUkJCBzdGF0ZW1lbnQKKworJCQKKzUgKyA1CiskJApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3X3NpbXBsZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3X3NpbXBsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2QyODYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfc2ltcGxlLmh0bWwKQEAgLTAsMCArMSw0IEBACis8cD5UaGlzIGlzIGEgPHNwYW4gY2xhc3M9Ik1hdGhKYXhfUHJldmlldyI+bWF0aDwvc3Bhbj48c2NyaXB0IHR5cGU9Im1hdGgvdGV4Ij41ICsgNTwvc2NyaXB0PiBzdGF0ZW1lbnQ8L3A+CisKKzxkaXYgY2xhc3M9Ik1hdGhKYXhfUHJldmlldyI+bWF0aDwvZGl2PgorPHNjcmlwdCB0eXBlPSJtYXRoL3RleDsgbW9kZT1kaXNwbGF5Ij41ICsgNTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3X3NpbXBsZS5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3X3NpbXBsZS5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTY4YjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfc2ltcGxlLm9wdGlvbnMKQEAgLTAsMCArMSwyIEBACis6bWF0aF9lbmdpbmVfb3B0czoKKyAgOnByZXZpZXc6ICdtYXRoJwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3X3NpbXBsZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheF9wcmV2aWV3X3NpbXBsZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjg3NjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4X3ByZXZpZXdfc2ltcGxlLnRleHQKQEAgLTAsMCArMSw1IEBACitUaGlzIGlzIGEgJCQ1ICsgNSQkIHN0YXRlbWVudAorCiskJAorNSArIDUKKyQkCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZS5odG1sLjE5IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGUuaHRtbC4xOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk1ZThjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGUuaHRtbC4xOQpAQCAtMCwwICsxLDI3IEBACis8bWF0aCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIgZGlzcGxheT0iYmxvY2siPgorICA8bWk+ZjwvbWk+CisgIDxtbyBzdHJldGNoeT0iZmFsc2UiPig8L21vPgorICA8bWk+eDwvbWk+CisgIDxtbyBzdHJldGNoeT0iZmFsc2UiPik8L21vPgorICA8bW8+PTwvbW8+CisgIDxtaT5hPC9taT4KKyAgPG1yb3cgY2xhc3M9Ik1KWC1UZVhBdG9tLU9SRCI+CisgICAgPG1zdXA+CisgICAgICA8bWk+eDwvbWk+CisgICAgICA8bW4+MzwvbW4+CisgICAgPC9tc3VwPgorICA8L21yb3c+CisgIDxtbz4rPC9tbz4KKyAgPG1pPmI8L21pPgorICA8bXJvdyBjbGFzcz0iTUpYLVRlWEF0b20tT1JEIj4KKyAgICA8bXN1cD4KKyAgICAgIDxtaT54PC9taT4KKyAgICAgIDxtbj4yPC9tbj4KKyAgICA8L21zdXA+CisgIDwvbXJvdz4KKyAgPG1vPis8L21vPgorICA8bWk+YzwvbWk+CisgIDxtaT54PC9taT4KKyAgPG1vPis8L21vPgorICA8bWk+ZDwvbWk+Cis8L21hdGg+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZS5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGUub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMyN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGUub3B0aW9ucwpAQCAtMCwwICsxIEBACis6bWF0aF9lbmdpbmU6IG1hdGhqYXhub2RlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZlMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGUudGV4dApAQCAtMCwwICsxIEBACiskJGYoeCkgPSBhe3heM30gKyBie3heMn0gKyBjeCArIGQkJApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfbm90ZXhoaW50cy5odG1sLjE5IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfbm90ZXhoaW50cy5odG1sLjE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OGY0N2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZV9ub3RleGhpbnRzLmh0bWwuMTkKQEAgLTAsMCArMSwyMyBAQAorPG1hdGggeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiIGRpc3BsYXk9ImJsb2NrIj4KKyAgPG1pPmY8L21pPgorICA8bW8gc3RyZXRjaHk9ImZhbHNlIj4oPC9tbz4KKyAgPG1pPng8L21pPgorICA8bW8gc3RyZXRjaHk9ImZhbHNlIj4pPC9tbz4KKyAgPG1vPj08L21vPgorICA8bWk+YTwvbWk+CisgIDxtc3VwPgorICAgIDxtaT54PC9taT4KKyAgICA8bW4+MzwvbW4+CisgIDwvbXN1cD4KKyAgPG1vPis8L21vPgorICA8bWk+YjwvbWk+CisgIDxtc3VwPgorICAgIDxtaT54PC9taT4KKyAgICA8bW4+MjwvbW4+CisgIDwvbXN1cD4KKyAgPG1vPis8L21vPgorICA8bWk+YzwvbWk+CisgIDxtaT54PC9taT4KKyAgPG1vPis8L21vPgorICA8bWk+ZDwvbWk+Cis8L21hdGg+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZV9ub3RleGhpbnRzLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZV9ub3RleGhpbnRzLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3ZTQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlX25vdGV4aGludHMub3B0aW9ucwpAQCAtMCwwICsxLDMgQEAKKzptYXRoX2VuZ2luZTogbWF0aGpheG5vZGUKKzptYXRoX2VuZ2luZV9vcHRzOgorICA6dGV4aGludHM6IGZhbHNlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZV9ub3RleGhpbnRzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZV9ub3RleGhpbnRzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmZTI5NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlX25vdGV4aGludHMudGV4dApAQCAtMCwwICsxIEBACiskJGYoeCkgPSBhe3heM30gKyBie3heMn0gKyBjeCArIGQkJApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfc2VtYW50aWNzLmh0bWwuMTkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9tYXRoamF4bm9kZV9zZW1hbnRpY3MuaHRtbC4xOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM5YzIwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfc2VtYW50aWNzLmh0bWwuMTkKQEAgLTAsMCArMSwzMiBAQAorPG1hdGggeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiIGRpc3BsYXk9ImJsb2NrIj4KKyAgPHNlbWFudGljcz4KKyAgICA8bXJvdz4KKyAgICAgIDxtaT5mPC9taT4KKyAgICAgIDxtbyBzdHJldGNoeT0iZmFsc2UiPig8L21vPgorICAgICAgPG1pPng8L21pPgorICAgICAgPG1vIHN0cmV0Y2h5PSJmYWxzZSI+KTwvbW8+CisgICAgICA8bW8+PTwvbW8+CisgICAgICA8bWk+YTwvbWk+CisgICAgICA8bXJvdyBjbGFzcz0iTUpYLVRlWEF0b20tT1JEIj4KKyAgICAgICAgPG1zdXA+CisgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgIDxtbj4zPC9tbj4KKyAgICAgICAgPC9tc3VwPgorICAgICAgPC9tcm93PgorICAgICAgPG1vPis8L21vPgorICAgICAgPG1pPmI8L21pPgorICAgICAgPG1yb3cgY2xhc3M9Ik1KWC1UZVhBdG9tLU9SRCI+CisgICAgICAgIDxtc3VwPgorICAgICAgICAgIDxtaT54PC9taT4KKyAgICAgICAgICA8bW4+MjwvbW4+CisgICAgICAgIDwvbXN1cD4KKyAgICAgIDwvbXJvdz4KKyAgICAgIDxtbz4rPC9tbz4KKyAgICAgIDxtaT5jPC9taT4KKyAgICAgIDxtaT54PC9taT4KKyAgICAgIDxtbz4rPC9tbz4KKyAgICAgIDxtaT5kPC9taT4KKyAgICA8L21yb3c+CisgICAgPGFubm90YXRpb24gZW5jb2Rpbmc9ImFwcGxpY2F0aW9uL3gtdGV4Ij5mKHgpID0gYXt4XjN9ICsgYnt4XjJ9ICsgY3ggKyBkPC9hbm5vdGF0aW9uPgorICA8L3NlbWFudGljcz4KKzwvbWF0aD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlX3NlbWFudGljcy5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfc2VtYW50aWNzLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2NDViMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlX3NlbWFudGljcy5vcHRpb25zCkBAIC0wLDAgKzEsMyBAQAorOm1hdGhfZW5naW5lOiBtYXRoamF4bm9kZQorOm1hdGhfZW5naW5lX29wdHM6CisgIDpzZW1hbnRpY3M6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlX3NlbWFudGljcy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbWF0aGpheG5vZGVfc2VtYW50aWNzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmZTI5NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL21hdGhqYXhub2RlX3NlbWFudGljcy50ZXh0CkBAIC0wLDAgKzEgQEAKKyQkZih4KSA9IGF7eF4zfSArIGJ7eF4yfSArIGN4ICsgZCQkCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9ub19lbmdpbmUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL25vX2VuZ2luZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNmIzNDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9ub19lbmdpbmUuaHRtbApAQCAtMCwwICsxLDMgQEAKKzxkaXYgaWQ9Im1hdGgtaWQiIGNsYXNzPSJrZG1hdGgiPiQkCis1KzUKKyQkPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9ub19lbmdpbmUub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL25vX2VuZ2luZS5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZDU1OWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9ub19lbmdpbmUub3B0aW9ucwpAQCAtMCwwICsxIEBACis6bWF0aF9lbmdpbmU6IH4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL25vX2VuZ2luZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbm9fZW5naW5lLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlZTVjZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL25vX2VuZ2luZS50ZXh0CkBAIC0wLDAgKzEsMiBAQAorezogI21hdGgtaWR9CiskJDUrNSQkCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9ub3JtYWwuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL25vcm1hbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDBhODYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9ub3JtYWwuaHRtbApAQCAtMCwwICsxLDI5IEBACis8cD5UaGlzIGlzIGEgcGFyYS4KKzxzY3JpcHQgdHlwZT0ibWF0aC90ZXgiPlx0ZXh0e0xhVGVYfSBcbGFtYmRhXzU8L3NjcmlwdD48L3A+CisKKzxzY3JpcHQgdHlwZT0ibWF0aC90ZXg7IG1vZGU9ZGlzcGxheSI+XGxhbWJkYV81ID0gXGFscGhhICsgNDwvc2NyaXB0PgorCis8cD48c2NyaXB0IHR5cGU9Im1hdGgvdGV4Ij5cbGFtYmRhX1xhbHBoYSA+IDU8L3NjcmlwdD4KK1RoaXMgaXMgYSBwYXJhLjwvcD4KKworPHNjcmlwdCB0eXBlPSJtYXRoL3RleDsgbW9kZT1kaXNwbGF5Ij4lIDwhW0NEQVRBWworXGJlZ2lue2FsaWduKn0KKyY9NSBcXAorJj02IFxcCitcZW5ke2FsaWduKn0gJV1dPjwvc2NyaXB0PgorCis8c2NyaXB0IHR5cGU9Im1hdGgvdGV4OyBtb2RlPWRpc3BsYXkiPjUrNTwvc2NyaXB0PgorCis8c2NyaXB0IHR5cGU9Im1hdGgvdGV4OyBtb2RlPWRpc3BsYXkiPjUrNTwvc2NyaXB0PgorCis8c2NyaXB0IHR5cGU9Im1hdGgvdGV4OyBtb2RlPWRpc3BsYXkiPjUrNTwvc2NyaXB0PgorCis8c2NyaXB0IHR5cGU9Im1hdGgvdGV4OyBtb2RlPWRpc3BsYXkiPjUrNTwvc2NyaXB0PgorCis8cHJlPjxjb2RlPiQkNSs1JCQKKzwvY29kZT48L3ByZT4KKworPHNjcmlwdCB0eXBlPSJtYXRoL3RleDsgbW9kZT1kaXNwbGF5Ij41KzU8L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0ibWF0aC90ZXg7IG1vZGU9ZGlzcGxheSI+NSs1PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0ibWF0aC90ZXg7IG1vZGU9ZGlzcGxheSI+fHh8ID0gNTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbm9ybWFsLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9ub3JtYWwudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTU5ODRhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE1X21hdGgvbm9ybWFsLnRleHQKQEAgLTAsMCArMSwzMCBAQAorVGhpcyBpcyBhIHBhcmEuCiskJCBcdGV4dHtMYVRlWH0gXGxhbWJkYV81ICQkCisKKyQkXGxhbWJkYV81ID0gXGFscGhhICsgNCQkCisKKyQkXGxhbWJkYV9cYWxwaGEgPiA1JCQKK1RoaXMgaXMgYSBwYXJhLgorCiskJFxiZWdpbnthbGlnbip9CismPTUgXFwKKyY9NiBcXAorXGVuZHthbGlnbip9JCQKKworJCQ1KzUkJCAKKworICQkNSs1JCQJCisKKyAgJCQ1KzUkJAorCisgICAkJDUrNSQkCisKKyAgICAkJDUrNSQkCisKK3s6LmNsc30KKyQkNSs1JCQKK14KKyQkNSs1JCQKK3s6LmNsc30KKworJCR8eHwgPSA1JCQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL3JpdGV4Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9yaXRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDYxYjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9yaXRleC5odG1sCkBAIC0wLDAgKzEgQEAKKzxtYXRoIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIiBkaXNwbGF5PSJibG9jayI+PG1pPmY8L21pPjxtbyBzdHJldGNoeT0nZmFsc2UnPig8L21vPjxtaT54PC9taT48bW8gc3RyZXRjaHk9J2ZhbHNlJz4pPC9tbz48bW8+PTwvbW8+PG1pPmE8L21pPjxtcm93Pjxtc3VwPjxtaT54PC9taT48bW4+MzwvbW4+PC9tc3VwPjwvbXJvdz48bW8+KzwvbW8+PG1pPmI8L21pPjxtcm93Pjxtc3VwPjxtaT54PC9taT48bW4+MjwvbW4+PC9tc3VwPjwvbXJvdz48bW8+KzwvbW8+PG1pPmM8L21pPjxtaT54PC9taT48bW8+KzwvbW8+PG1pPmQ8L21pPjwvbWF0aD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL3JpdGV4Lm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9yaXRleC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjU0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9yaXRleC5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzptYXRoX2VuZ2luZTogcml0ZXgKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNV9tYXRoL3JpdGV4LnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9yaXRleC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZmUyOTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTVfbWF0aC9yaXRleC50ZXh0CkBAIC0wLDAgKzEgQEAKKyQkZih4KSA9IGF7eF4zfSArIGJ7eF4yfSArIGN4ICsgZCQkCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL25vX3RvYy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy9ub190b2MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI4MzFlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy9ub190b2MuaHRtbApAQCAtMCwwICsxLDE0IEBACisKKzxoMT5IZWFkZXIgbGV2ZWwgMTwvaDE+CisKKzxoMj5IZWFkZXIgbGV2ZWwgMjwvaDI+CisKKzxoMz5IZWFkZXIgbGV2ZWwgMzwvaDM+CisKKzxoND5IZWFkZXIgbGV2ZWwgNDwvaDQ+CisKKzxoMT5PdGhlciBoZWFkZXIgbGV2ZWwgMTwvaDE+CisKKzxoMj5PdGhlciBoZWFkZXIgbGV2ZWwgMjwvaDI+CisKKzxoMz5PdGhlciBoZWFkZXIgbGV2ZWwgMzwvaDM+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL25vX3RvYy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy9ub190b2MudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFkODI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy9ub190b2MudGV4dApAQCAtMCwwICsxLDE2IEBACisqIEhlcmUgY29tZXMgdGhlIHRhYmxlIG9mIGNvbnRlbnQKK3s6dG9jfQorCisjIEhlYWRlciBsZXZlbCAxCisKKyMjIEhlYWRlciBsZXZlbCAyCisKKyMjIyBIZWFkZXIgbGV2ZWwgMworCisjIyMjIEhlYWRlciBsZXZlbCA0CisKKyMgT3RoZXIgaGVhZGVyIGxldmVsIDEKKworIyMgT3RoZXIgaGVhZGVyIGxldmVsIDIKKworIyMjIE90aGVyIGhlYWRlciBsZXZlbCAzCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY19leGNsdWRlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY19leGNsdWRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1MjY4NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX2V4Y2x1ZGUuaHRtbApAQCAtMCwwICsxLDM1IEBACis8aDEgY2xhc3M9Im5vX3RvYyIgaWQ9ImNvbnRlbnRzIj5Db250ZW50czwvaDE+CisKKzx1bCBpZD0ibWFya2Rvd24tdG9jIj4KKyAgPGxpPjxhIGhyZWY9IiNoZWFkZXItbGV2ZWwtMSIgaWQ9Im1hcmtkb3duLXRvYy1oZWFkZXItbGV2ZWwtMSI+SGVhZGVyIGxldmVsIDE8L2E+ICAgIDx1bD4KKyAgICAgIDxsaT48YSBocmVmPSIjaGVhZGVyLWxldmVsLTIiIGlkPSJtYXJrZG93bi10b2MtaGVhZGVyLWxldmVsLTIiPkhlYWRlciBsZXZlbCAyPC9hPiAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT48YSBocmVmPSIjaGVhZGVyLWxldmVsLTMiIGlkPSJtYXJrZG93bi10b2MtaGVhZGVyLWxldmVsLTMiPkhlYWRlciBsZXZlbCAzPC9hPiAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNoZWFkZXItbGV2ZWwtNCIgaWQ9Im1hcmtkb3duLXRvYy1oZWFkZXItbGV2ZWwtNCI+SGVhZGVyIGxldmVsIDQ8L2E+PC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNvdGhlci1oZWFkZXItbGV2ZWwtMSIgaWQ9Im1hcmtkb3duLXRvYy1vdGhlci1oZWFkZXItbGV2ZWwtMSI+T3RoZXIgaGVhZGVyIGxldmVsIDE8L2E+ICAgIDx1bD4KKyAgICAgIDxsaT48YSBocmVmPSIjb3RoZXItaGVhZGVyLWxldmVsLTIiIGlkPSJtYXJrZG93bi10b2Mtb3RoZXItaGVhZGVyLWxldmVsLTIiPk90aGVyIGhlYWRlciBsZXZlbCAyPC9hPiAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT48YSBocmVmPSIjb3RoZXItaGVhZGVyLWxldmVsLTMiIGlkPSJtYXJrZG93bi10b2Mtb3RoZXItaGVhZGVyLWxldmVsLTMiPk90aGVyIGhlYWRlciBsZXZlbCAzPC9hPjwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+Cis8L3VsPgorCis8aDEgaWQ9ImhlYWRlci1sZXZlbC0xIj5IZWFkZXIgbGV2ZWwgMTwvaDE+CisKKzxoMiBpZD0iaGVhZGVyLWxldmVsLTIiPkhlYWRlciBsZXZlbCAyPC9oMj4KKworPGgzIGlkPSJoZWFkZXItbGV2ZWwtMyI+SGVhZGVyIGxldmVsIDM8L2gzPgorCis8aDQgaWQ9ImhlYWRlci1sZXZlbC00Ij5IZWFkZXIgbGV2ZWwgNDwvaDQ+CisKKzxoMSBpZD0ib3RoZXItaGVhZGVyLWxldmVsLTEiPk90aGVyIGhlYWRlciBsZXZlbCAxPC9oMT4KKworPGgyIGlkPSJvdGhlci1oZWFkZXItbGV2ZWwtMiI+T3RoZXIgaGVhZGVyIGxldmVsIDI8L2gyPgorCis8aDMgaWQ9Im90aGVyLWhlYWRlci1sZXZlbC0zIj5PdGhlciBoZWFkZXIgbGV2ZWwgMzwvaDM+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY19leGNsdWRlLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY19leGNsdWRlLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3NmI1NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX2V4Y2x1ZGUub3B0aW9ucwpAQCAtMCwwICsxIEBACis6YXV0b19pZHM6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX2V4Y2x1ZGUudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX2V4Y2x1ZGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGYwYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy90b2NfZXhjbHVkZS50ZXh0CkBAIC0wLDAgKzEsMTkgQEAKKyMgQ29udGVudHMKK3s6Lm5vX3RvY30KKworKiBIZXJlIGNvbWVzIHRoZSB0YWJsZSBvZiBjb250ZW50Cit7OnRvY30KKworIyBIZWFkZXIgbGV2ZWwgMQorCisjIyBIZWFkZXIgbGV2ZWwgMgorCisjIyMgSGVhZGVyIGxldmVsIDMKKworIyMjIyBIZWFkZXIgbGV2ZWwgNAorCisjIE90aGVyIGhlYWRlciBsZXZlbCAxCisKKyMjIE90aGVyIGhlYWRlciBsZXZlbCAyCisKKyMjIyBPdGhlciBoZWFkZXIgbGV2ZWwgMwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy90b2NfbGV2ZWxzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY19sZXZlbHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBhMDdjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy90b2NfbGV2ZWxzLmh0bWwKQEAgLTAsMCArMSwyNCBAQAorPHVsIGlkPSJtYXJrZG93bi10b2MiPgorICA8bGk+PGEgaHJlZj0iI2hlYWRlci0tbGV2ZWwtMiIgaWQ9Im1hcmtkb3duLXRvYy1oZWFkZXItLWxldmVsLTIiPkhlYWRlciBcYCBsZXZlbCAyPC9hPiAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI2hlYWRlci1sZXZlbC0zIiBpZD0ibWFya2Rvd24tdG9jLWhlYWRlci1sZXZlbC0zIj5IZWFkZXIgbGV2ZWwgMzwvYT48L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT48YSBocmVmPSIjb3RoZXItaGVhZGVyLWxldmVsLTIiIGlkPSJtYXJrZG93bi10b2Mtb3RoZXItaGVhZGVyLWxldmVsLTIiPk90aGVyIGhlYWRlciBsZXZlbCAyPC9hPiAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI290aGVyLWhlYWRlci1sZXZlbC0zIiBpZD0ibWFya2Rvd24tdG9jLW90aGVyLWhlYWRlci1sZXZlbC0zIj5PdGhlciBoZWFkZXIgbGV2ZWwgMzwvYT48L2xpPgorICAgIDwvdWw+CisgIDwvbGk+Cis8L3VsPgorCis8aDEgaWQ9ImhlYWRlci1sZXZlbC0xIj5IZWFkZXIgbGV2ZWwgMTwvaDE+CisKKzxoMiBpZD0iaGVhZGVyLS1sZXZlbC0yIj5IZWFkZXIgXGAgbGV2ZWwgMjwvaDI+CisKKzxoMyBpZD0iaGVhZGVyLWxldmVsLTMiPkhlYWRlciBsZXZlbCAzPC9oMz4KKworPGg0IGlkPSJoZWFkZXItbGV2ZWwtNCI+SGVhZGVyIGxldmVsIDQ8L2g0PgorCis8aDEgaWQ9Im90aGVyLWhlYWRlci1sZXZlbC0xIj5PdGhlciBoZWFkZXIgbGV2ZWwgMTwvaDE+CisKKzxoMiBpZD0ib3RoZXItaGVhZGVyLWxldmVsLTIiPk90aGVyIGhlYWRlciBsZXZlbCAyPC9oMj4KKworPGgzIGlkPSJvdGhlci1oZWFkZXItbGV2ZWwtMyI+T3RoZXIgaGVhZGVyIGxldmVsIDM8L2gzPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy90b2NfbGV2ZWxzLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY19sZXZlbHMub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGZiZWJhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy90b2NfbGV2ZWxzLm9wdGlvbnMKQEAgLTAsMCArMSwyIEBACis6dG9jX2xldmVsczogMi4uMworOmF1dG9faWRzOiB0cnVlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY19sZXZlbHMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX2xldmVscy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjJkZWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY19sZXZlbHMudGV4dApAQCAtMCwwICsxLDE2IEBACisqIEhlcmUgY29tZXMgdGhlIHRhYmxlIG9mIGNvbnRlbnQKK3s6dG9jfQorCisjIEhlYWRlciBsZXZlbCAxCisKKyMjIEhlYWRlciBcXFxgIGxldmVsIDIKKworIyMjIEhlYWRlciBsZXZlbCAzCisKKyMjIyMgSGVhZGVyIGxldmVsIDQKKworIyBPdGhlciBoZWFkZXIgbGV2ZWwgMQorCisjIyBPdGhlciBoZWFkZXIgbGV2ZWwgMgorCisjIyMgT3RoZXIgaGVhZGVyIGxldmVsIDMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX3dpdGhfZm9vdG5vdGVzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY193aXRoX2Zvb3Rub3Rlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NmE3ODAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY193aXRoX2Zvb3Rub3Rlcy5odG1sCkBAIC0wLDAgKzEsMTMgQEAKKzx1bCBpZD0ibWFya2Rvd24tdG9jIj4KKyAgPGxpPjxhIGhyZWY9IiNoZWFkZXIxLWxldmVsLTEiIGlkPSJtYXJrZG93bi10b2MtaGVhZGVyMS1sZXZlbC0xIj5IZWFkZXIgbGV2ZWwgMTwvYT48L2xpPgorPC91bD4KKworPGgxIGlkPSJoZWFkZXIxLWxldmVsLTEiPkhlYWRlcjxzdXAgaWQ9ImZucmVmOjEiPjxhIGhyZWY9IiNmbjoxIiBjbGFzcz0iZm9vdG5vdGUiPjE8L2E+PC9zdXA+IGxldmVsIDE8L2gxPgorCis8ZGl2IGNsYXNzPSJmb290bm90ZXMiPgorICA8b2w+CisgICAgPGxpIGlkPSJmbjoxIj4KKyAgICAgIDxwPlNvbWUgZm9vdG5vdGUgY29udGVudCBoZXJlJm5ic3A7PGEgaHJlZj0iI2ZucmVmOjEiIGNsYXNzPSJyZXZlcnNlZm9vdG5vdGUiPiYjODYxNzs8L2E+PC9wPgorICAgIDwvbGk+CisgIDwvb2w+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX3dpdGhfZm9vdG5vdGVzLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY193aXRoX2Zvb3Rub3Rlcy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzZiNTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvYmxvY2svMTZfdG9jL3RvY193aXRoX2Zvb3Rub3Rlcy5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzphdXRvX2lkczogdHJ1ZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2Jsb2NrLzE2X3RvYy90b2Nfd2l0aF9mb290bm90ZXMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX3dpdGhfZm9vdG5vdGVzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3OWVkNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9ibG9jay8xNl90b2MvdG9jX3dpdGhfZm9vdG5vdGVzLnRleHQKQEAgLTAsMCArMSw2IEBACisqIEhlcmUgY29tZXMgdGhlIHRhYmxlIG9mIGNvbnRlbnQKK3s6dG9jfQorCisjIEhlYWRlclteMV0gbGV2ZWwgMQorCitbXjFdOiBTb21lIGZvb3Rub3RlIGNvbnRlbnQgaGVyZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2VuY29kaW5nLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvZW5jb2RpbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzM5MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL2VuY29kaW5nLmh0bWwKQEAgLTAsMCArMSw0NiBAQAorPHA+RGFzIGlzdCBnZXfDtmhubGljaCA8ZW0+ZWluPC9lbT4gPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnIj7DnGJlci1Qcm9ibGVtPC9hPiBtaXQgbWFuY2hlbjxiciAvPgorU8OkbGVuIDxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZyI+aHR0cDovL2V4YW1wbGUub3JnPC9hPiB1bmQgPHNwYW4gaWQ9InRlc3QiPmFuZGVyZW4gRGluZ2U8L3NwYW4+LiBTaWVoZQorPGltZyBzcmM9Imh0dHA6Ly9leGFtcGxlLm9yZyIgYWx0PSLDnGJlciBtaWNoIiAvPiE8L3A+CisKKzxibG9ja3F1b3RlIGNsYXNzPSJ0ZXN0Ij4KKyAgPHA+VmllbGxlaWNodCA8ZW0gY2xhc3M9InJlZCI+aMO2cmU8L2VtPiBpY2ggbmljaHQgcmljaHRpZz88L3A+Cis8L2Jsb2NrcXVvdGU+CisKKzx1bD4KKyAgPGxpPlNvbGx0ZW4gd2lyIHVucyBkYXMgw7xiZXJsPGVtPmVnZW48L2VtPj8gPGVtPlZlcmjDtmhuZTwvZW0+IG1pY2ggbmljaHQhPC9saT4KKyAgPGxpPkhvIGhvIGjDtmhlciEgU2luZCAqd2lyKiBkYT88L2xpPgorPC91bD4KKworPGgxPlRpdGVsIHNpbmQgdXJzY2jDtm48L2gxPgorCis8aDIgaWQ9ImhvdCI+TWFuY2hlIG3DtmdlbnMgPGVtPsOkcm1lcjwvZW0+PC9oMj4KKworPHByZT48Y29kZT7DtmhhCit3YXMgbnVuPworPC9jb2RlPjwvcHJlPgorCis8ZGw+CisgIDxkdD5Uw7ZuZTwvZHQ+CisgIDxkZD5MYXV0ZSBHZXLDpHVzY2hlPC9kZD4KKyAgPGRkPnZpZWxsZWljaHQgbm9jaCB3YXMgw6Q8ZW0+aG5saWNoZXM8L2VtPjwvZGQ+Cis8L2RsPgorCis8dGFibGU+CisgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGg+aG9jaDwvdGg+CisgICAgICA8dGg+aMO2aGVyPC90aD4KKyAgICAgIDx0aD5hbSBow7ZjaHN0ZW48L3RoPgorICAgIDwvdHI+CisgIDwvdGhlYWQ+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQ+w7xiZXI8L3RkPgorICAgICAgPHRkPmRyw7xiZXI8L3RkPgorICAgICAgPHRkPm3DvGRlPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHA+RGFzIGlzdCBzY2jDtm4KK2dlbWFjaHQ8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvZW5jb2RpbmcudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9lbmNvZGluZy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZWRmNGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvZW5jb2RpbmcudGV4dApAQCAtMCwwICsxLDI4IEBACitEYXMgaXN0IGdld8O2aG5saWNoICplaW4qIFvDnGJlci1Qcm9ibGVtXShodHRwOi8vZXhhbXBsZS5vcmcpIG1pdCBtYW5jaGVuICAKK1PDpGxlbiA8aHR0cDovL2V4YW1wbGUub3JnPiB1bmQgPHNwYW4gaWQ9J3Rlc3QnPmFuZGVyZW4gRGluZ2U8L3NwYW4+LiBTaWVoZQorIVvDnGJlciBtaWNoXShodHRwOi8vZXhhbXBsZS5vcmcpIQorCis+IFZpZWxsZWljaHQgKmjDtnJlKns6LnJlZH0gaWNoIG5pY2h0IHJpY2h0aWc/Cit7Oi50ZXN0fQorCisqIFNvbGx0ZW4gd2lyIHVucyBkYXMgw7xiZXJsKmVnZW4qPyAqVmVyaMO2aG5lKiBtaWNoIG5pY2h0IQorKiBIbyBobyBow7ZoZXIhIFNpbmQgXCp3aXJcKiBkYT8KKworVGl0ZWwgc2luZCB1cnNjaMO2bgorPT09PT09PT09PT09PT09PT09CisKKyMjIE1hbmNoZSBtw7ZnZW5zICrDpHJtZXIqICAgeyNob3R9CisKKyAgICDDtmhhCisgICAgd2FzIG51bj8KKworVMO2bmUKKzogTGF1dGUgR2Vyw6R1c2NoZQorOiB2aWVsbGVpY2h0IG5vY2ggd2FzIMOkKmhubGljaGVzKgorCit8IGhvY2ggfCBow7ZoZXIgfCBhbSBow7ZjaHN0ZW4gfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IMO8YmVyIHwgZHLDvGJlciB8IG3DvGRlICAgICAgIHwKKworPHAgbWFya2Rvd249JzEnPkRhcyBpc3Qgc2Now7ZuCitnZW1hY2h0PC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9leGFtcGxlLm1hbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vZXhhbXBsZS5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhZmVlNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vZXhhbXBsZS5tYW4KQEAgLTAsMCArMSwxMjMgQEAKKy5cIiBnZW5lcmF0ZWQgYnkga3JhbWRvd24KKy5USCAiTkFNRSIgIjEiICJOb3ZlbWJlciAyMDE2IiAiU29tZSBleHRyYSBkYXRhIgorLlNIIE5BTUUKK25hbWUgXC0gZGVzY3JpcHRpb24KKy5TSCAiU1lOT1BTSVMiCitcZkJuYW1lXGZQIFtcZkJPUFRJT05TXGZQXSBcZklhcmd1bWVudHNcZlBcLlwuXC4KKy5TSCAiREVTQ1JJUFRJT04iCitUaGlzIGlzIGEgbm9ybWFsIHBhcmFncmFwaFwuCisuc3AKKy5QRCAwCisuSVAgXChidSA0CitBCisuSVAgXChidSA0Citjb21wYWN0CisuSVAgXChidSA0CitsaXN0CisuSVAgXChidSA0Cit3aXRoIG11bHRpcGxlIAorLlJTCisuSVAgXChidSA0CitpdGVtcyBhbmQgCisuUlMKKy5JUCBcKGJ1IDQKK25lc3RlZAorLlJFCisuUkUKKy5JUCBcKGJ1IDQKK2FzIHdlbGwKKy5QRAorLlJTCisuUAorYmxvY2txdW90ZXMgYXJlIGZpbmUKKy5JUCAxLiA0CitudW1iZXJlZCBsaXN0cworLklQIDIuIDQKK3dvcmsgdG9vIAorLlJTCisuSVAgMS4gNAorYW5kIHRoZXkKKy5JUCAyLiA0CitjYW4gYmUgCisuUlMKKy5JUCAxLiA0CituZXN0ZWQKKy5SRQorLlJFCisuSVAgMy4gNAorYWdhaW4KKy5SRQorLnNwCisuUlMgNAorLkVYCitTb21lIGZhbmN5IGNvZGUKKyAgIGdvaW5nCisgICAgIG9uCisgICAgICAgaGVyZQorLkVFCisuUkUKKy5UUAorXGZCXC1vXGZQCisuVFEKK1xmQlwtXC1vcHRpb25cZlAKK0Rlc2NyaXB0aW9uIGxpc3RzCisuc3AKK2FyZSB1c2VmdWwgYXMgd2VsbAorLlAKK0FuZCBjb21wYWN0IGRlZmluaXRpb24gbGlzdHM6Cisuc3AKKy5QRCAwCisuVFAKK1xmQm9cZlAKK09wdGlvbgorLlRQCitcZkJrXGZQCitLZXkKKy5UUAorXGZCdlxmUAorVmFsdWUKKy5QRAorLlRTCitib3ggY2VudGVyIDsKK2wgbCBsIGwgLgordGFibGVzCWNhbgliZQljZW50ZXJlZAkKKy5URQorLnNwCisuVFMKK2JveCA7CitsYiBsYiBjYiByYiAuCitEZWZhdWx0IGFsaWduZWQJTGVmdCBhbGlnbmVkCUNlbnRlciBhbGlnbmVkCVJpZ2h0IGFsaWduZWQJCis9CisuVCYKK2wgbCBjIHIgLgorRmlyc3QgYm9keSBwYXJ0CVNlY29uZCBjZWxsCVRoaXJkIGNlbGwJZm91cnRoIGNlbGwJCitTZWNvbmQgXGZJbGluZVxmUAlmb28JXGZCc3Ryb25nXGZQCWJhegkKK1RoaXJkIGxpbmUJXGZCcXV1eFxmUAliYXoJYmFyCQorXworLlQmCitsIGwgYyByIC4KK1NlY29uZCBib2R5CQkJCQorMm5kIGxpbmUJCQkJCis9CitGb290ZXIgcm93IG9uZQkJCQkKK0Zvb3RlciByb3cgdHdvCQkJCQorLlRFCisuc3AKKy5QCitJbmxpbmUgZm9ybWF0dGluZyBsaWtlIFxmSWVtcGhhc2lzXGZQLCBcZkJzdHJvbmdcZlAgYW5kIFxmQmNvZGUgc3BhblxmUCB3b3JrIGFzIHVzdXNhbFwuIAorLlVSIGFyZV93ZWxsXC5odG1sCitMaW5rcworLlVFCit3b3JrLCB0b28hIEFzIGRvCisuYnIKK2xpbmUgYnJlYWtzXC4KKy5QCitBYmJyZXZpYXRpb25zIGxpa2UgTUQgY2FuIGJlIHVzZWQgYnV0IHRoZSBhYmJyZXZpYXRpb24gdGl0bGUgaXMgaWdub3JlZFwuCisuUAorTWF0aCBlbGVtZW50cyB3b3JrIFxmQlxlbCA9IDVcZlAgaW5saW5lIGFuZCBpbiBibG9jayBmb3JtOgorLnNwCisuUlMgNAorLkVYCitcZWxhbWJkYV81ID0gXGVhbHBoYSArIDQKKy5FRQorLlJFCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2V4YW1wbGUudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vZXhhbXBsZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjAxMWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2V4YW1wbGUudGV4dApAQCAtMCwwICsxLDg1IEBACisjIG5hbWUoMSkgLSBkZXNjcmlwdGlvbgorezogZGF0YS1kYXRlPSJOb3ZlbWJlciAyMDE2IiBkYXRhLWV4dHJhPSJTb21lIGV4dHJhIGRhdGEifQorCisjIyBTWU5PUFNJUworCitgbmFtZWAgXFtgT1BUSU9OU2BcXSAqYXJndW1lbnRzKi4uLgorCisjIyBERVNDUklQVElPTgorCitUaGlzIGlzIGEgbm9ybWFsIHBhcmFncmFwaC4KKworKiBBCisqIGNvbXBhY3QKKyogbGlzdAorKiB3aXRoIG11bHRpcGxlCisgICogaXRlbXMgYW5kCisgICAgKiBuZXN0ZWQKKyogYXMgd2VsbAorezouY29tcGFjdH0KKworPiBibG9ja3F1b3RlcyBhcmUgZmluZQorPgorPiAxLiBudW1iZXJlZCBsaXN0cworPgorPiAyLiB3b3JrIHRvbworPiAgICAxLiBhbmQgdGhleQorPiAgICAyLiBjYW4gYmUKKz4gICAgICAgMS4gbmVzdGVkCis+Cis+IDMuIGFnYWluCisKK35+fgorU29tZSBmYW5jeSBjb2RlCisgICBnb2luZworICAgICBvbgorICAgICAgIGhlcmUKK35+fgorCitgLW9gCitgLS1vcHRpb25gCis6IERlc2NyaXB0aW9uIGxpc3RzCis6IGFyZSB1c2VmdWwgYXMgd2VsbAorCitBbmQgY29tcGFjdCBkZWZpbml0aW9uIGxpc3RzOgorCitgb2AKKzogT3B0aW9uCisKK2BrYAorOiBLZXkKKworYHZgCis6IFZhbHVlCit7Oi5jb21wYWN0fQorCit8IHRhYmxlcyB8IGNhbiB8IGJlIHwgY2VudGVyZWQgfAorezouY2VudGVyfQorCit8LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS18Cit8IERlZmF1bHQgYWxpZ25lZCB8TGVmdCBhbGlnbmVkfCBDZW50ZXIgYWxpZ25lZCAgfCBSaWdodCBhbGlnbmVkICB8Cit8LS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS06fC0tLS0tLS0tLS0tLS0tLTp8Cit8IEZpcnN0IGJvZHkgcGFydCB8U2Vjb25kIGNlbGwgfCBUaGlyZCBjZWxsICAgICAgfCBmb3VydGggY2VsbCAgICB8Cit8IFNlY29uZCAqbGluZSogICB8Zm9vICAgICAgICAgfCAqKnN0cm9uZyoqICAgICAgfCBiYXogICAgICAgICAgICB8Cit8IFRoaXJkIGxpbmUgICAgICB8YHF1dXhgICAgICAgfCBiYXogICAgICAgICAgICAgfCBiYXIgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS18Cit8IFNlY29uZCBib2R5ICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cit8IDJuZCBsaW5lICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cit8PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT18Cit8IEZvb3RlciByb3cgb25lICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cit8IEZvb3RlciByb3cgdHdvICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS18CisKKworSW5saW5lIGZvcm1hdHRpbmcgbGlrZSAqZW1waGFzaXMqLCAqKnN0cm9uZyoqIGFuZCBgY29kZSBzcGFuYCB3b3JrCithcyB1c3VzYWwuIFtMaW5rc10oYXJlX3dlbGwuaHRtbCkgd29yaywgdG9vISBBcyBkb1xcCitsaW5lIGJyZWFrcy4KKworQWJicmV2aWF0aW9ucyBsaWtlIE1EIGNhbiBiZSB1c2VkIGJ1dCB0aGUgYWJicmV2aWF0aW9uIHRpdGxlIGlzCitpZ25vcmVkLgorCisqW01EXTogTWFya2Rvd24KKworTWF0aCBlbGVtZW50cyB3b3JrICQkXGwgPSA1JCQgaW5saW5lIGFuZCBpbiBibG9jayBmb3JtOgorCiskJFxsYW1iZGFfNSA9IFxhbHBoYSArIDQkJApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtZGFzaC1kZXNjcmlwdGlvbi5tYW4gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1kYXNoLWRlc2NyaXB0aW9uLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ3NTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtZGFzaC1kZXNjcmlwdGlvbi5tYW4KQEAgLTAsMCArMSw0IEBACisuXCIgZ2VuZXJhdGVkIGJ5IGtyYW1kb3duCisuVEggIk5BTUUiICI3IgorLlNIIE5BTUUKK25hbWUgXC0gZGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vaGVhZGluZy1uYW1lLWRhc2gtZGVzY3JpcHRpb24udGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vaGVhZGluZy1uYW1lLWRhc2gtZGVzY3JpcHRpb24udGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzJjOTIxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtZGFzaC1kZXNjcmlwdGlvbi50ZXh0CkBAIC0wLDAgKzEgQEAKKyMgbmFtZSAtLSBkZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtZGVzY3JpcHRpb24ubWFuIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtZGVzY3JpcHRpb24ubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OWRjNWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1kZXNjcmlwdGlvbi5tYW4KQEAgLTAsMCArMSw0IEBACisuXCIgZ2VuZXJhdGVkIGJ5IGtyYW1kb3duCisuVEggIk5BTUUiICIxIiAiTm92ZW1iZXIgMjAxNiIgIlNvbWV0aGluZyBleHRyYSIKKy5TSCBOQU1FCituYW1lIFwtIGRlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1kZXNjcmlwdGlvbi50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtZGVzY3JpcHRpb24udGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDE0ODJjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtZGVzY3JpcHRpb24udGV4dApAQCAtMCwwICsxLDIgQEAKKyMgbmFtZSBkZXNjcmlwdGlvbgorezogZGF0YS1zZWN0aW9uPSIxIiBkYXRhLWRhdGU9Ik5vdmVtYmVyIDIwMTYiIGRhdGEtZXh0cmE9IlNvbWV0aGluZyBleHRyYSJ9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1zZWN0aW9uLWRlc2NyaXB0aW9uLm1hbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vaGVhZGluZy1uYW1lLXNlY3Rpb24tZGVzY3JpcHRpb24ubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjRmZjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1zZWN0aW9uLWRlc2NyaXB0aW9uLm1hbgpAQCAtMCwwICsxLDQgQEAKKy5cIiBnZW5lcmF0ZWQgYnkga3JhbWRvd24KKy5USCAiTkFNRSIgIjEiCisuU0ggTkFNRQorbmFtZSBcLSBkZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtc2VjdGlvbi1kZXNjcmlwdGlvbi50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUtc2VjdGlvbi1kZXNjcmlwdGlvbi50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2U3NjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1zZWN0aW9uLWRlc2NyaXB0aW9uLnRleHQKQEAgLTAsMCArMSBAQAorIyBuYW1lKDEpIC0tIGRlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1zZWN0aW9uLm1hbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vaGVhZGluZy1uYW1lLXNlY3Rpb24ubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTg3NTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1zZWN0aW9uLm1hbgpAQCAtMCwwICsxLDIgQEAKKy5cIiBnZW5lcmF0ZWQgYnkga3JhbWRvd24KKy5USCAiTkFNRSIgIjEiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1zZWN0aW9uLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS1zZWN0aW9uLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5OGRiZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vaGVhZGluZy1uYW1lLXNlY3Rpb24udGV4dApAQCAtMCwwICsxIEBACisjIG5hbWUoMSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vaGVhZGluZy1uYW1lLm1hbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vaGVhZGluZy1uYW1lLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDg4NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9oZWFkaW5nLW5hbWUubWFuCkBAIC0wLDAgKzEsMiBAQAorLlwiIGdlbmVyYXRlZCBieSBrcmFtZG93bgorLlRIICJOQU1FIiAiNyIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vaGVhZGluZy1uYW1lLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDY1NmEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL2hlYWRpbmctbmFtZS50ZXh0CkBAIC0wLDAgKzEgQEAKKyMgbmFtZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9zZWN0aW9ucy5tYW4gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL3NlY3Rpb25zLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFiMjMzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9zZWN0aW9ucy5tYW4KQEAgLTAsMCArMSw0IEBACisuXCIgZ2VuZXJhdGVkIGJ5IGtyYW1kb3duCisuU0ggIk5BTUUiCit3b3JrcworLlNTICJTdWIgc2VjdGlvbiIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vc2VjdGlvbnMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9tYW4vc2VjdGlvbnMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY1Zjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi9zZWN0aW9ucy50ZXh0CkBAIC0wLDAgKzEsMTEgQEAKKyMjIE5BTUUKKword29ya3MKKworIyMjIFN1YiBzZWN0aW9uCisKKyMjIyMgSWdub3JlZAorCisjIyMjIyBJZ25vcmVkCisKKyMjIyMjIyBJZ25vcmVkCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL3RleHQtZXNjYXBpbmcubWFuIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi90ZXh0LWVzY2FwaW5nLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBhNGYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi90ZXh0LWVzY2FwaW5nLm1hbgpAQCAtMCwwICsxLDggQEAKKy5cIiBnZW5lcmF0ZWQgYnkga3JhbWRvd24KK1wmXC4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lCisuUAorbGluZSB3aXRoIFxlZkIgYmFja3NsYXNoIHN5bWJvbAorLlAKK3NvbWUgXC4gb3RoZXIgXC0gZXNjYXBlZCBcJyBzeW1ib2xzCisuUAorXCZcLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi90ZXh0LWVzY2FwaW5nLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvbWFuL3RleHQtZXNjYXBpbmcudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTJiOTRmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL21hbi90ZXh0LWVzY2FwaW5nLnRleHQKQEAgLTAsMCArMSw3IEBACisuIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZQorCitsaW5lIHdpdGggXGZCIGJhY2tzbGFzaCBzeW1ib2wKKworc29tZSAuIG90aGVyIC0gZXNjYXBlZCBcJyBzeW1ib2xzCisKKy4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvZW1wdHkuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvZW1wdHkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTEwMmVhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9lbXB0eS5odG1sCkBAIC0wLDAgKzEsNSBAQAorPHA+VGhpcyBpcyBbXSBlbXB0eS48L3A+CisKKzxwPlRoaXMgaXMgW11bXSBlbXB0eS48L3A+CisKKzxwPlRoaXMgaXMgPGEgaHJlZj0idGVzdC5odG1sIj48L2E+IGVtcHR5LjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvZW1wdHkudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvZW1wdHkudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E1ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9lbXB0eS50ZXh0CkBAIC0wLDAgKzEsNSBAQAorVGhpcyBpcyBbXSBlbXB0eS4KKworVGhpcyBpcyBbXVtdIGVtcHR5LgorCitUaGlzIGlzIFtdKHRlc3QuaHRtbCkgZW1wdHkuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2VtcHR5X3RpdGxlLmh0bWxpbnB1dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvZW1wdHlfdGl0bGUuaHRtbGlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWIyY2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2VtcHR5X3RpdGxlLmh0bWxpbnB1dApAQCAtMCwwICsxLDMgQEAKKzxwPkltYWdlIHdpdGggZW1wdHkgdGl0bGU6IDxpbWcgc3JjPSIvaW1hZ2VzL290aGVyLnBuZyIgYWx0PSJhbHQgdGV4dCIgdGl0bGU9IiIgLz48L3A+CisKKzxwPkxpbmsgPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUudGxkIiB0aXRsZT0iIj5yZWZlcmVuY2U8L2E+IHdpdGggZW1wdHkgdGl0bGUuPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9lbXB0eV90aXRsZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9lbXB0eV90aXRsZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYWJlN2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2VtcHR5X3RpdGxlLnRleHQKQEAgLTAsMCArMSw3IEBACitJbWFnZSB3aXRoIGVtcHR5IHRpdGxlOiAhW2FsdCB0ZXh0XSgvaW1hZ2VzL290aGVyLnBuZykKKworTGluayBbcmVmZXJlbmNlXVsxXSB3aXRoIGVtcHR5IHRpdGxlLgorCisKKworWzFdOiBodHRwOi8vZXhhbXBsZS50bGQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW1hZ2VfaW5fYS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9pbWFnZV9pbl9hLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmNGFkZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW1hZ2VfaW5fYS5odG1sCkBAIC0wLDAgKzEsNSBAQAorPHA+U2ltcGxlOiA8YSBocmVmPSJsb2NhbC5odG1sIj5Tb21lIDxpbWcgc3JjPSIvaW1hZ2VzL290aGVyLnBuZyIgYWx0PSJhbHQgdGV4dCIgLz48L2E+PC9wPgorCis8cD5OZXN0ZWQ6IDxhIGhyZWY9ImxvY2FsLmh0bWwiPlNvbWUgPGltZyBzcmM9Ii9pbWFnZXMvb3RoZXIucG5nIiBhbHQ9ImFsdCAhW2ltZ10odGV4dC5wbmcpIHRleHQiIC8+PC9hPjwvcD4KKworPHA+U2ltcGxlOiA8YSBocmVmPSJsb2NhbC5odG1sIj5Tb21lIDxlbT50ZXh0IDxpbWcgc3JjPSIvaW1hZ2VzL290aGVyLnBuZyIgYWx0PSJhbHQgdGV4dCIgLz4gdGV4dDwvZW0+PC9hPjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW1hZ2VfaW5fYS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9pbWFnZV9pbl9hLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiZmI2NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW1hZ2VfaW5fYS50ZXh0CkBAIC0wLDAgKzEsNSBAQAorU2ltcGxlOiBbU29tZSAhW2FsdCB0ZXh0XSgvaW1hZ2VzL290aGVyLnBuZyldKGxvY2FsLmh0bWwpCisKK05lc3RlZDogW1NvbWUgIVthbHQgIVtpbWddKHRleHQucG5nKSB0ZXh0XSgvaW1hZ2VzL290aGVyLnBuZyldKGxvY2FsLmh0bWwpCisKK1NpbXBsZTogW1NvbWUgKnRleHQgIVthbHQgdGV4dF0oL2ltYWdlcy9vdGhlci5wbmcpIHRleHQqXShsb2NhbC5odG1sKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9pbWFnZWxpbmtzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2ltYWdlbGlua3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjVkMzZmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9pbWFnZWxpbmtzLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPHA+U2ltcGxlOiA8aW1nIHNyYz0iL2ltYWdlcy9vdGhlci5wbmciIGFsdD0iYWx0IHRleHQiIC8+PC9wPgorCis8cD5TaW1wbGUgd2l0aCB0aXRsZTogPGltZyBzcmM9Ii9pbWFnZXMvb3RoZXIucG5nIiBhbHQ9ImFsdCB0ZXh0IiB0aXRsZT0idGl0bGUiIC8+PC9wPgorCis8cD5FbXB0eSBpbWcgbGluazogPGltZyBzcmM9IiIgYWx0PSJhbHQgdGV4dCIgLz48L3A+CisKKzxwPlJlZmVyZW5jZSBzdHlsZTogPGltZyBzcmM9Im90aGVyLnBuZyIgYWx0PSJhbHQgdGV4dCIgLz48L3A+CisKKzxwPlJlZmVyZW5jZSBzdHlsZSB3aXRoIHRpdGxlOiA8aW1nIHNyYz0ib3RoZXIucG5nIiBhbHQ9ImFsdCB0ZXh0IiB0aXRsZT0iVGl0bGUiIC8+PC9wPgorCis8cD5ObyBhbHQgdGV4dDogPGltZyBzcmM9Im90aGVyLnBuZyIgYWx0PSIiIC8+PC9wPgorCis8cD5ObyBpZDogPGltZyBzcmM9Im90aGVyLnBuZyIgYWx0PSJpbWdvIiB0aXRsZT0iVGl0bGUiIC8+PC9wPgorCis8cD5XaXRoIGVzY2FwZWQgcGlwZTogPGltZyBzcmM9Im90aGVyLnBuZyIgYWx0PSJhbiB8IHBpcGUiIC8+PC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9pbWFnZWxpbmtzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2ltYWdlbGlua3MudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA1MGEyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9pbWFnZWxpbmtzLnRleHQKQEAgLTAsMCArMSwxOCBAQAorU2ltcGxlOiAhW2FsdCB0ZXh0XSgvaW1hZ2VzL290aGVyLnBuZykKKworU2ltcGxlIHdpdGggdGl0bGU6ICFbYWx0IHRleHRdKC9pbWFnZXMvb3RoZXIucG5nICJ0aXRsZSIpCisKK0VtcHR5IGltZyBsaW5rOiAhW2FsdCB0ZXh0XSgpCisKK1JlZmVyZW5jZSBzdHlsZTogIVthbHQgdGV4dF1baW1nXQorCitSZWZlcmVuY2Ugc3R5bGUgd2l0aCB0aXRsZTogIVthbHQgdGV4dF1baW1nb10KKworTm8gYWx0IHRleHQ6ICFbXShvdGhlci5wbmcpCisKK05vIGlkOiAhW2ltZ29dCisKK1tpbWddOiBvdGhlci5wbmcKK1tpbWdvXTogb3RoZXIucG5nICJUaXRsZSIKKworV2l0aCBlc2NhcGVkIHBpcGU6ICFbYW4gXHwgcGlwZV0ob3RoZXIucG5nKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9pbmxpbmUuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW5saW5lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxMGJjNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW5saW5lLmh0bWwKQEAgLTAsMCArMSw0NiBAQAorPHA+c2ltcGxlIDxhIGhyZWY9IiI+VVJMPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIj5VUkw8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ic29tZXRoaW5nLmh0bWwiPlVSTCA8ZW0+d2l0aDwvZW0+IGZvcm1hdHRpbmc8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ic29tZXRoaW5nLmh0bWwiIHRpdGxlPSJhIHQmcXVvdDtpdGxlIj5VUkwgd2l0aCBzaW5nbGUgcXVvdGVkIHRpdGxlPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIiB0aXRsZT0iYSB0J2l0bGUiPlVSTCB3aXRoIGRvdWJsZSBxdW90ZWQgdGl0bGU8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ic29tZXRoaW5nLmh0bWwiPlVSTCBbd2l0aCBdIGVzY2FwZWQ8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ic29tZXRoaW5nLmh0bWwiPlVSTCB3aXRoIF0gZXNjYXBlZDwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSJzb21ldGhpbmcuaHRtbCI+VVJMIFt3aXRoXSBuZXN0ZWQ8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ic29tZXRoaW5nLmh0bWwiPlVSTCB3aXRoIFtub10obGluay5odG1sKSBpbnNpZGU8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0iL3NvbWV0aGluZy90byhkbykiPlVSTCB3aXRoIHBhcmVuczwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSIvc29tZXRoaW5nL3RvKGRvIiB0aXRsZT0iZG9pdCI+VVJMIHdpdGggcGFyZW5zPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIiB0aXRsZT0idGl0bGUiPlVSTCBicm9rZW4KK29uIGxpbmU8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0id2l0aCBzcGFjZXMuaHRtbCI+VVJMIHdpdGggc3BhY2VzPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9IndpdGggc3BhY2VzLmh0bWwiIHRpdGxlPSJ0aXRsZSI+VVJMIHdpdGggc3BhY2VzPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9IndpdGggKHNwYWNlcykuaHRtbCI+VVJMIHdpdGggc3BhY2VzPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNwYWNlcy5odG1sIj5sZWFkaW5nL3RyYWlsaW5nIHNwYWNlczwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSJzcGFjZXMuaHRtbCI+bGVhZGluZy90cmFpbGluZyBzcGFjZXM8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ic3BhY2VzLmh0bWwiPmxlYWRpbmcvdHJhaWxpbmcgc3BhY2VzPC9hPjwvcD4KKworPHA+YmFkIFtVUkwgPGEgaHJlZj0ic29tZXRoaW5nLmh0bWwiPm5vdDwvYT48L3A+CisKKzxwPmJhZCBbVVJMIHdpdGggcGFyZW5zXShzb21ldGhpbmcobmV3Lmh0bWwpPC9wPgorCis8cD5iYWQgW1VSTCB3aXRoIGVtcHR5IHRpdGxlXShzb21ldGhpbmcuaHRtbCAmIzgyMTY7JiM4MjE3Oyk8L3A+CisKKzxwPmJhZCBbVVJMXSg8L3A+CisKKzxwPmJhZCBbVVJMXShubzwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW5saW5lLmh0bWwuMTkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2lubGluZS5odG1sLjE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDBlZmEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2lubGluZS5odG1sLjE5CkBAIC0wLDAgKzEsNDYgQEAKKzxwPnNpbXBsZSA8YSBocmVmPSIiPlVSTDwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSJzb21ldGhpbmcuaHRtbCI+VVJMPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIj5VUkwgPGVtPndpdGg8L2VtPiBmb3JtYXR0aW5nPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIiB0aXRsZT0iYSB0JnF1b3Q7aXRsZSI+VVJMIHdpdGggc2luZ2xlIHF1b3RlZCB0aXRsZTwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSJzb21ldGhpbmcuaHRtbCIgdGl0bGU9ImEgdCdpdGxlIj5VUkwgd2l0aCBkb3VibGUgcXVvdGVkIHRpdGxlPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIj5VUkwgW3dpdGggXSBlc2NhcGVkPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIj5VUkwgd2l0aCBdIGVzY2FwZWQ8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ic29tZXRoaW5nLmh0bWwiPlVSTCBbd2l0aF0gbmVzdGVkPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIj5VUkwgd2l0aCBbbm9dKGxpbmsuaHRtbCkgaW5zaWRlPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9Ii9zb21ldGhpbmcvdG8oZG8pIj5VUkwgd2l0aCBwYXJlbnM8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0iL3NvbWV0aGluZy90byhkbyIgdGl0bGU9ImRvaXQiPlVSTCB3aXRoIHBhcmVuczwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSJzb21ldGhpbmcuaHRtbCIgdGl0bGU9InRpdGxlIj5VUkwgYnJva2VuCitvbiBsaW5lPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9IndpdGggc3BhY2VzLmh0bWwiPlVSTCB3aXRoIHNwYWNlczwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSJ3aXRoIHNwYWNlcy5odG1sIiB0aXRsZT0idGl0bGUiPlVSTCB3aXRoIHNwYWNlczwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSJ3aXRoIChzcGFjZXMpLmh0bWwiPlVSTCB3aXRoIHNwYWNlczwvYT48L3A+CisKKzxwPnNpbXBsZSA8YSBocmVmPSJzcGFjZXMuaHRtbCI+bGVhZGluZy90cmFpbGluZyBzcGFjZXM8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ic3BhY2VzLmh0bWwiPmxlYWRpbmcvdHJhaWxpbmcgc3BhY2VzPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9InNwYWNlcy5odG1sIj5sZWFkaW5nL3RyYWlsaW5nIHNwYWNlczwvYT48L3A+CisKKzxwPmJhZCBbVVJMIDxhIGhyZWY9InNvbWV0aGluZy5odG1sIj5ub3Q8L2E+PC9wPgorCis8cD5iYWQgW1VSTCB3aXRoIHBhcmVuc10oc29tZXRoaW5nKG5ldy5odG1sKTwvcD4KKworPHA+YmFkIFtVUkwgd2l0aCBlbXB0eSB0aXRsZV0oc29tZXRoaW5nLmh0bWwg4oCY4oCZKTwvcD4KKworPHA+YmFkIFtVUkxdKDwvcD4KKworPHA+YmFkIFtVUkxdKG5vPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9pbmxpbmUudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW5saW5lLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwNTc2NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvaW5saW5lLnRleHQKQEAgLTAsMCArMSw0OCBAQAorc2ltcGxlIFtVUkxdKCkKKworc2ltcGxlIFtVUkxdKHNvbWV0aGluZy5odG1sKQorCitzaW1wbGUgW1VSTCAqd2l0aCogZm9ybWF0dGluZ10oc29tZXRoaW5nLmh0bWwpCisKK3NpbXBsZSBbVVJMIHdpdGggc2luZ2xlIHF1b3RlZCB0aXRsZV0oc29tZXRoaW5nLmh0bWwgJ2EgdCJpdGxlJykKKworc2ltcGxlIFtVUkwgd2l0aCBkb3VibGUgcXVvdGVkIHRpdGxlXShzb21ldGhpbmcuaHRtbCAiYSB0J2l0bGUiKQorCitzaW1wbGUgW1VSTCBcW3dpdGggXF0gZXNjYXBlZF0oc29tZXRoaW5nLmh0bWwpCisKK3NpbXBsZSBbVVJMIHdpdGggXF0gZXNjYXBlZF0oc29tZXRoaW5nLmh0bWwpCisKK3NpbXBsZSBbVVJMIFt3aXRoXSBuZXN0ZWRdKHNvbWV0aGluZy5odG1sKQorCitzaW1wbGUgW1VSTCB3aXRoIFtub10obGluay5odG1sKSBpbnNpZGVdKHNvbWV0aGluZy5odG1sKQorCitzaW1wbGUgW1VSTCB3aXRoIHBhcmVuc10oL3NvbWV0aGluZy90byhkbykpCisKK3NpbXBsZSBbVVJMIHdpdGggcGFyZW5zXSgvc29tZXRoaW5nL3RvKGRvICJkb2l0IikKKworc2ltcGxlIFtVUkwgYnJva2VuCitvbiBsaW5lXShzb21ldGhpbmcuaHRtbAorInRpdGxlIikKKworc2ltcGxlIFtVUkwgd2l0aCBzcGFjZXNdKHdpdGggc3BhY2VzLmh0bWwpCisKK3NpbXBsZSBbVVJMIHdpdGggc3BhY2VzXSh3aXRoIHNwYWNlcy5odG1sICd0aXRsZScpCisKK3NpbXBsZSBbVVJMIHdpdGggc3BhY2VzXSh3aXRoIChzcGFjZXMpLmh0bWwpCisKK3NpbXBsZSBbbGVhZGluZy90cmFpbGluZyBzcGFjZXNdKCAgc3BhY2VzLmh0bWwpCisKK3NpbXBsZSBbbGVhZGluZy90cmFpbGluZyBzcGFjZXNdKHNwYWNlcy5odG1sICApCisKK3NpbXBsZSBbbGVhZGluZy90cmFpbGluZyBzcGFjZXNdKCAgc3BhY2VzLmh0bWwgICkKKworCitiYWQgW1VSTCBbbm90XShzb21ldGhpbmcuaHRtbCkKKworYmFkIFtVUkwgd2l0aCBwYXJlbnNdKHNvbWV0aGluZyhuZXcuaHRtbCkKKworYmFkIFtVUkwgd2l0aCBlbXB0eSB0aXRsZV0oc29tZXRoaW5nLmh0bWwgJycpCisKK2JhZCBbVVJMXSgKKworYmFkIFtVUkxdKG5vCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2xpbmtfZGVmcy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9saW5rX2RlZnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWUyY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9saW5rX2RlZnMuaHRtbApAQCAtMCwwICsxLDkgQEAKKzxwPlRoaXMgaXMgYSBwYXJhLgorW2lkXTogaHR0cDovL3d3dy5leGFtcGxlLmNvbS88L3A+CisKKzxwcmU+PGNvZGU+WzRdOiBub3VybAorPC9jb2RlPjwvcHJlPgorCis8cD5Qb2ludHMgdG8gPGEgaHJlZj0ib25lLnVybCI+MTwvYT4gYW5kIDxhIGhyZWY9InR3by51cmwiPjI8L2E+IGFuZCA8YSBocmVmPSJ0aHJlZS51cmwiPjM8L2E+IGJ1dCBub3QgWzRdPC9wPgorCis8cD5Qb2ludHMgdG8gPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUuY29tIj5fLjosOyE/LTwvYT4gYW5kIDxhIGhyZWY9InRlc3QuaHRtbCMndGVzdCciIHRpdGxlPSJ0aXRsZSI+b3RoZXJpZDg8L2E+PC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9saW5rX2RlZnMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvbGlua19kZWZzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhMjViNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvbGlua19kZWZzLnRleHQKQEAgLTAsMCArMSwyNyBAQAorVGhpcyBpcyBhIHBhcmEuCitbaWRdOiBodHRwOi8vd3d3LmV4YW1wbGUuY29tLworCitbb3RoZXJpZDFdOiBodHRwOi8vd3d3dy5leGFtcGxlLmNvbS8gInRpdGxlIDEiCitbb3RoZXJpZDJdOiBodHRwOi8vd3d3dy5leGFtcGxlLmNvbS8gJ3RpdGxlIDInCitbb3RoZXJpZDNdOiA8c29tZSBzcGFjZXMuaHRtbD4KK1tvdGhlcmlkNF06IDxzb21lIHNwYWNlcy5odG1sPiAndGl0bGUnCitbb3RoZXJpZDVdOiBzb21lIHNwYWNlcy5odG1sCitbb3RoZXJpZDZdOiBzb21lIHNwYWNlcy5odG1sICd0aXRsZScKK1tvdGhlcmlkN106IHNvbWUgc3BhY2VzCisgICAgICAgICAgICAidGl0bGUiCitbb3RoZXJpZDhdOnRlc3QuaHRtbCMndGVzdCcgJ3RpdGxlJworCitbYnJlYWtdOglodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvYXNkZi5odG1sCisgICAgICAgICAgICAgICAgJ0Fub3RoZXIgdGl0bGUnCisKK1sxXTogaWdub3JlZC51cmwKKyBbMV06IG9uZS51cmwKKyAgWzJdOiB0d28udXJsCisgICBbM106IHRocmVlLnVybAorICAgIFs0XTogbm91cmwKKworUG9pbnRzIHRvIFsxXSBhbmQgWzJdIGFuZCBbM10gYnV0IG5vdCBbNF0KKworW18uOiw7IT8tXTogaHR0cDovL2V4YW1wbGUuY29tCisKK1BvaW50cyB0byBbXy46LDshPy1dIGFuZCBbb3RoZXJpZDhdCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2xpbmtfZGVmc193aXRoX2lhbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9saW5rX2RlZnNfd2l0aF9pYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTZkNzdkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9saW5rX2RlZnNfd2l0aF9pYWwuaHRtbApAQCAtMCwwICsxLDQgQEAKKzxwPkxpbmsgZGVmIHdpdGggPGEgaHJlZmxhbmc9ImVuIiBjbGFzcz0idGVzdCIgaHJlZj0iaHR0cDovL2V4YW1wbGUuY29tIiB0aXRsZT0idGl0bGUiPmF0dHI8L2E+IGFuZCA8YSBocmVmbGFuZz0iZW4iIGNsYXNzPSJ0ZXN0IiBocmVmPSJodHRwOi8vZXhhbXBsZS5jb20iIHRpdGxlPSJ0aXRsZSI+YXR0ciAyPC9hPiBhbmQgPGEgY2xhc3M9InRlc3QiIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbSI+YXR0ciAzPC9hPiBhbmQgPGEgaHJlZmxhbmc9ImVuIiBjbGFzcz0idGVzdCIgaHJlZj0iaHR0cDovL2V4YW1wbGUuY29tIj5hdHRyIGJlZm9yZTwvYT48L3A+CisKKzxwPnRlc3Q8L3A+CisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvbGlua19kZWZzX3dpdGhfaWFsLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2xpbmtfZGVmc193aXRoX2lhbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Mzk4YTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2xpbmtfZGVmc193aXRoX2lhbC50ZXh0CkBAIC0wLDAgKzEsMTYgQEAKK0xpbmsgZGVmIHdpdGggW2F0dHJdIGFuZCBbYXR0ciAyXSBhbmQgW2F0dHIgM10gYW5kIFthdHRyIGJlZm9yZV0KKworW2F0dHJdOiBodHRwOi8vZXhhbXBsZS5jb20gJ3RpdGxlJworezogaHJlZmxhbmc9ImVuIiAudGVzdH0KKworW2F0dHIgMl06IGh0dHA6Ly9leGFtcGxlLmNvbSAndGl0bGUnCit7OiBocmVmbGFuZz0iZW4ifQorezogLnRlc3R9CisKK1thdHRyIDNdOiBodHRwOi8vZXhhbXBsZS5jb20KK3s6IC50ZXN0fQordGVzdAorCit7OiBocmVmbGFuZz0iZW4ifQorezogLnRlc3R9CitbYXR0ciBiZWZvcmVdOiBodHRwOi8vZXhhbXBsZS5jb20KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvbGlua3Nfd2l0aF9hbmdsZV9icmFja2V0cy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9saW5rc193aXRoX2FuZ2xlX2JyYWNrZXRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhYTMxZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvbGlua3Nfd2l0aF9hbmdsZV9icmFja2V0cy5odG1sCkBAIC0wLDAgKzEsMyBAQAorPHA+VGhpcyBpcyBhIDxhIGhyZWY9IndpdGggYW5nbGUuaHRtbCI+bGluazwvYT4uPC9wPgorCis8cD5UaGlzIGlzIGEgPGEgaHJlZj0id2l0aCBhbmdsZS5odG1sIiB0aXRsZT0iYW5kIHRpdGxlIj5saW5rPC9hPi48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2xpbmtzX3dpdGhfYW5nbGVfYnJhY2tldHMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvbGlua3Nfd2l0aF9hbmdsZV9icmFja2V0cy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjBlY2UKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL2xpbmtzX3dpdGhfYW5nbGVfYnJhY2tldHMudGV4dApAQCAtMCwwICsxLDMgQEAKK1RoaXMgaXMgYSBbbGlua10oPHdpdGggYW5nbGUuaHRtbD4pLgorCitUaGlzIGlzIGEgW2xpbmtdKDx3aXRoIGFuZ2xlLmh0bWw+ICdhbmQgdGl0bGUnKS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvcmVmZXJlbmNlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL3JlZmVyZW5jZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YWZkMmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL3JlZmVyZW5jZS5odG1sCkBAIC0wLDAgKzEsMzcgQEAKKworPHA+c2ltcGxlIDxhIGhyZWY9Im90aGVydXJsLmh0bWwiPlVSTDwvYT4gYW5kIDxhIGhyZWY9InNvbWV1cmwuaHRtbCI+VVJMPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9Im90aGVydXJsLmh0bWwiPlVSTDwvYT4gYW5kIDxhIGhyZWY9InNvbWV1cmwuaHRtbCI+VVJMPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9Im90aGVydXJsLmh0bWwiPjE8L2E+IGFuZCA8YSBocmVmPSJzb21ldXJsLmh0bWwiPmlzdXJsPC9hPjwvcD4KKworPHA+c2ltcGxlIDxhIGhyZWY9Im90aGVydXJsLmh0bWwiPjE8L2E+IGFuZCA8YSBocmVmPSJzb21ldXJsLmh0bWwiPmlzdXJsPC9hPjwvcD4KKworPHA+dGhpcyBpcyBbYSBob2x5IDxhIGhyZWY9InNvbWV1cmwuaHRtbCI+aXN1cmw8L2E+XTwvcD4KKworPHA+bm8gW3Jlc29sdXRpb25dW10gaGVyZSBhbmQgW2hlcmVdPC9wPgorCis8cD53aXRoIGEgPGEgaHJlZj0idXJsLmh0bWwiPmJyZWFrIAkgaW4KK3RoZSB0ZXh0PC9hPjwvcD4KKworPHA+dGhpcyBub3QgW2lzdXJsXSBhbmQgbm90IFtpc3VybF08L3A+CisKKzxwPmEgPGEgaHJlZj0ibGV0dGVycy5odG1sIiB0aXRsZT0iVGhpcyBpcyB0aGUgdGl0bGUiPkxpbmsgd2l0aF9CSUc8L2E+IGxldHRlcnM8L3A+CisKKzxwPmJhZCBbbm8gVVJMXSBkIDxhIGhyZWY9InNvbWV1cmwuaHRtbCI+aXN1cmw8L2E+PC9wPgorCis8cD5bbm8gdXJsXSBpbnZhbGlkLmh0bWwKK1tubyB1cmxdOjwvcD4KKworPHA+JiM4MjIwO3RpdGxlJiM4MjIxOzwvcD4KKworPHA+dGVzdCA8YSBocmVmPSJpbnZhbGlkLmh0bWwiPnVybCBidXQgbm8gdGl0bGU8L2E+Cit0ZXN0IFt1cmxkZWZdPC9wPgorCis8cD5bdXJsZGVmXTogc29tZS51cmwgJiM4MjE2O3RpdGxlJiM4MjIxOzwvcD4KKworPHA+c29tZSA8YSBocmVmPSJ3aXRoIHNwYWNlcy5odG1sIiB0aXRsZT0idGl0bGUiPndpdGggc3BhY2VzPC9hPjwvcD4KKworPHA+dGhpcyA8YSBocmVmPSJvY2Nhc2lvbi5odG1sIj5pcyBhICYjODIxNjtzcGVjaWFsJiM4MjE3OyBvY2Nhc2lvbiBmb3IgL2FsbC8gb2YgdXM8L2E+PC9wPgorCis8cD50aGlzIGlzIDxhIGhyZWY9InByZWRlZmluZWQuaHRtbCI+cHJlZGVmaW5lZDwvYT4gZm9yIDxhIGhyZWY9InVyaS5odG1sIiB0aXRsZT0iTXkgVVJJIj5VUkk8L2E+PC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9yZWZlcmVuY2UuaHRtbC4xOSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvcmVmZXJlbmNlLmh0bWwuMTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmZWQxOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAxX2xpbmsvcmVmZXJlbmNlLmh0bWwuMTkKQEAgLTAsMCArMSwzNyBAQAorCis8cD5zaW1wbGUgPGEgaHJlZj0ib3RoZXJ1cmwuaHRtbCI+VVJMPC9hPiBhbmQgPGEgaHJlZj0ic29tZXVybC5odG1sIj5VUkw8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ib3RoZXJ1cmwuaHRtbCI+VVJMPC9hPiBhbmQgPGEgaHJlZj0ic29tZXVybC5odG1sIj5VUkw8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ib3RoZXJ1cmwuaHRtbCI+MTwvYT4gYW5kIDxhIGhyZWY9InNvbWV1cmwuaHRtbCI+aXN1cmw8L2E+PC9wPgorCis8cD5zaW1wbGUgPGEgaHJlZj0ib3RoZXJ1cmwuaHRtbCI+MTwvYT4gYW5kIDxhIGhyZWY9InNvbWV1cmwuaHRtbCI+aXN1cmw8L2E+PC9wPgorCis8cD50aGlzIGlzIFthIGhvbHkgPGEgaHJlZj0ic29tZXVybC5odG1sIj5pc3VybDwvYT5dPC9wPgorCis8cD5ubyBbcmVzb2x1dGlvbl1bXSBoZXJlIGFuZCBbaGVyZV08L3A+CisKKzxwPndpdGggYSA8YSBocmVmPSJ1cmwuaHRtbCI+YnJlYWsgCSBpbgordGhlIHRleHQ8L2E+PC9wPgorCis8cD50aGlzIG5vdCBbaXN1cmxdIGFuZCBub3QgW2lzdXJsXTwvcD4KKworPHA+YSA8YSBocmVmPSJsZXR0ZXJzLmh0bWwiIHRpdGxlPSJUaGlzIGlzIHRoZSB0aXRsZSI+TGluayB3aXRoX0JJRzwvYT4gbGV0dGVyczwvcD4KKworPHA+YmFkIFtubyBVUkxdIGQgPGEgaHJlZj0ic29tZXVybC5odG1sIj5pc3VybDwvYT48L3A+CisKKzxwPltubyB1cmxdIGludmFsaWQuaHRtbAorW25vIHVybF06PC9wPgorCis8cD7igJx0aXRsZeKAnTwvcD4KKworPHA+dGVzdCA8YSBocmVmPSJpbnZhbGlkLmh0bWwiPnVybCBidXQgbm8gdGl0bGU8L2E+Cit0ZXN0IFt1cmxkZWZdPC9wPgorCis8cD5bdXJsZGVmXTogc29tZS51cmwg4oCYdGl0bGXigJ08L3A+CisKKzxwPnNvbWUgPGEgaHJlZj0id2l0aCBzcGFjZXMuaHRtbCIgdGl0bGU9InRpdGxlIj53aXRoIHNwYWNlczwvYT48L3A+CisKKzxwPnRoaXMgPGEgaHJlZj0ib2NjYXNpb24uaHRtbCI+aXMgYSDigJhzcGVjaWFs4oCZIG9jY2FzaW9uIGZvciAvYWxsLyBvZiB1czwvYT48L3A+CisKKzxwPnRoaXMgaXMgPGEgaHJlZj0icHJlZGVmaW5lZC5odG1sIj5wcmVkZWZpbmVkPC9hPiBmb3IgPGEgaHJlZj0idXJpLmh0bWwiIHRpdGxlPSJNeSBVUkkiPlVSSTwvYT48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL3JlZmVyZW5jZS5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9yZWZlcmVuY2Uub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmI0YjAxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9yZWZlcmVuY2Uub3B0aW9ucwpAQCAtMCwwICsxLDMgQEAKKzpsaW5rX2RlZnM6CisgIHByZWRlZmluZWQ6IFtwcmVkZWZpbmVkLmh0bWxdCisgIFVSSTogW3VyaS5odG1sLCBNeSBVUkldCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMV9saW5rL3JlZmVyZW5jZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9yZWZlcmVuY2UudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM5ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDFfbGluay9yZWZlcmVuY2UudGV4dApAQCAtMCwwICsxLDUzIEBACitbaXN1cmxdOiBzb21ldXJsLmh0bWwKKyBbMV06ICAgICBvdGhlcnVybC5odG1sCisKK3NpbXBsZSBbVVJMXVsxXSBhbmQgW1VSTF1baXN1cmxdCisKK3NpbXBsZSBbVVJMXSBbMV0gYW5kIFtVUkxdCitbaXN1cmxdCisKK3NpbXBsZSBbMV1bXSBhbmQgW2lzdXJsXVtdCisKK3NpbXBsZSBbMV0gYW5kIFtpc3VybF0KKwordGhpcyBpcyBbYSBob2x5IFtpc3VybF1dCisKK25vIFtyZXNvbHV0aW9uXVtdIGhlcmUgYW5kIFtoZXJlXQorCit3aXRoIGEgW2JyZWFrIAkgaW4KK3RoZSB0ZXh0XQorCisgIFticmVhayBpbiB0aGUgdGV4dF06IHVybC5odG1sCisKK3RoaXMgbm90IFxbaXN1cmxdIGFuZCBub3QgW2lzdXJsXF0KKworYSBbTGluayB3aXRoX0JJR10gbGV0dGVycworCisgICBbbGluayBXSVRIX2JpZ106IGxldHRlcnMuaHRtbAorICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyB0aGUgdGl0bGUnCisKK2JhZCBbbm8gVVJMXSBkIFtpc3VybF0KKworW25vIHVybF0gaW52YWxpZC5odG1sCitbbm8gdXJsXToKKworW1VSTCBidXQgbm8gdGl0bGVdOiBpbnZhbGlkLmh0bWwKKworICAgInRpdGxlIgorCit0ZXN0IFt1cmwgYnV0IG5vIHRpdGxlXQordGVzdCBbdXJsZGVmXQorCitbdXJsZGVmXTogc29tZS51cmwgJ3RpdGxlIgorCisKK3NvbWUgW3dpdGggc3BhY2VzXQorCitbd2l0aCBzcGFjZXNdOiB3aXRoIHNwYWNlcy5odG1sICJ0aXRsZSIKKwordGhpcyBbaXMgYSAnc3BlY2lhbCcgb2NjYXNpb24gZm9yIC9hbGwvIG9mIHVzXQorCitbaXMgYSAnc3BlY2lhbCcgb2NjYXNpb24gZm9yIC9hbGwvIG9mIHVzXTogb2NjYXNpb24uaHRtbAorCisKK3RoaXMgaXMgW3ByZWRlZmluZWRdIGZvciBbVVJJXQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvZW1wdHkuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL2VtcHR5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZTY5NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL2VtcHR5Lmh0bWwKQEAgLTAsMCArMSwzIEBACis8cD5UaGlzIF9faXMgKiplbXB0eS48L3A+CisKKzxwPlRoaXMgPGVtPioqPC9lbT5pcyBlbXB0eS48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMl9lbXBoYXNpcy9lbXB0eS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvZW1wdHkudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTlkMDUzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvZW1wdHkudGV4dApAQCAtMCwwICsxLDMgQEAKK1RoaXMgX19pcyAqKmVtcHR5LgorCitUaGlzICoqKippcyBlbXB0eS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL2Vycm9ycy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvZXJyb3JzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyZjAzZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL2Vycm9ycy5odG1sCkBAIC0wLDAgKzEsOSBAQAorPHA+VGhpcyBpcyBhICpzdGFyLjwvcD4KKworPHA+VGhpcyBpcyBhICoqc3Rhci48L3A+CisKKzxwPlRoaXMgaXMgPGVtPiphICpzdGFyPC9lbT4uPC9wPgorCis8cD5UaGlzIGlzICphIHN0YXIqLjwvcD4KKworPHA+VGhpcyoqIGlzKiogYSBzdGFyLjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL2Vycm9ycy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvZXJyb3JzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwZTVlYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL2Vycm9ycy50ZXh0CkBAIC0wLDAgKzEsOSBAQAorVGhpcyBpcyBhICpzdGFyLgorCitUaGlzIGlzIGEgKipzdGFyLgorCitUaGlzIGlzICoqYSAqc3RhciouCisKK1RoaXMgaXMgKmEgc3RhclwqLgorCitUaGlzKiogaXMqKiBhIHN0YXIuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMl9lbXBoYXNpcy9uZXN0aW5nLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMl9lbXBoYXNpcy9uZXN0aW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNGNlZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL25lc3RpbmcuaHRtbApAQCAtMCwwICsxLDQxIEBACis8dWw+CisgIDxsaT48c3Ryb25nPjxlbT50ZXN0IHRlc3Q8L2VtPjwvc3Ryb25nPjwvbGk+CisgIDxsaT48c3Ryb25nPjxlbT50ZXN0IHRlc3Q8L2VtPjwvc3Ryb25nPjwvbGk+CisgIDxsaT48ZW0+dGVzdCA8c3Ryb25nPnRlc3Q8L3N0cm9uZz48L2VtPjwvbGk+CisgIDxsaT48c3Ryb25nPnRlc3QgPGVtPnRlc3Q8L2VtPjwvc3Ryb25nPjwvbGk+CisgIDxsaT48c3Ryb25nPjxlbT50ZXN0PC9lbT4gdGVzdDwvc3Ryb25nPjwvbGk+CisgIDxsaT48ZW0+PHN0cm9uZz50ZXN0PC9zdHJvbmc+IHRlc3Q8L2VtPjwvbGk+CisgIDxsaT48c3Ryb25nPjxlbT50ZXN0PC9lbT4gdGVzdDwvc3Ryb25nPjwvbGk+CisgIDxsaT48c3Ryb25nPnRlc3QgPGVtPnRlc3Q8L2VtPjwvc3Ryb25nPjwvbGk+CisgIDxsaT48ZW0+dGVzdCA8c3Ryb25nPnRlc3Q8L3N0cm9uZz48L2VtPjwvbGk+CisgIDxsaT48ZW0+dGVzdCA8c3Ryb25nPnRlc3Q8L3N0cm9uZz48L2VtPjwvbGk+CisgIDxsaT48c3Ryb25nPnRlc3QgPGVtPnRlc3Q8L2VtPjwvc3Ryb25nPjwvbGk+CisgIDxsaT48c3Ryb25nPjxlbT50ZXN0PC9lbT4gdGVzdDwvc3Ryb25nPjwvbGk+CisgIDxsaT48ZW0+PHN0cm9uZz50ZXN0PC9zdHJvbmc+IHRlc3Q8L2VtPjwvbGk+CisgIDxsaT48c3Ryb25nPjxlbT50ZXN0PC9lbT4gdGVzdDwvc3Ryb25nPjwvbGk+CisgIDxsaT48c3Ryb25nPnRlc3QgPGVtPnRlc3Q8L2VtPjwvc3Ryb25nPjwvbGk+CisgIDxsaT48ZW0+dGVzdCA8c3Ryb25nPnRlc3Q8L3N0cm9uZz48L2VtPjwvbGk+Cis8L3VsPgorPHVsPgorICA8bGk+PGVtPmE8L2VtPmI8L2xpPgorICA8bGk+YTxlbT5iPC9lbT48L2xpPgorICA8bGk+YTxlbT5iPC9lbT5jPC9saT4KKyAgPGxpPjxzdHJvbmc+YTwvc3Ryb25nPmI8L2xpPgorICA8bGk+YTxzdHJvbmc+Yjwvc3Ryb25nPjwvbGk+CisgIDxsaT5hPHN0cm9uZz5iPC9zdHJvbmc+YzwvbGk+Cis8L3VsPgorPHVsPgorICA8bGk+X2FfYjwvbGk+CisgIDxsaT5hX2JfPC9saT4KKyAgPGxpPmFfYl9jPC9saT4KKyAgPGxpPl9fYV9fYjwvbGk+CisgIDxsaT5hX19iX188L2xpPgorICA8bGk+YV9fYl9fYzwvbGk+CisgIDxsaT5hX18yX19jPC9saT4KKyAgPGxpPmFfXzJfXzM8L2xpPgorICA8bGk+MV9fMl9fMzwvbGk+Cis8L3VsPgorPHVsPgorICA8bGk+PGVtPmEgX2JfIGM8L2VtPjwvbGk+CisgIDxsaT48c3Ryb25nPmEgX19iX18gYzwvc3Ryb25nPjwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvbmVzdGluZy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvbmVzdGluZy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjdlODQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMl9lbXBoYXNpcy9uZXN0aW5nLnRleHQKQEAgLTAsMCArMSwzNiBAQAorLSAqKip0ZXN0IHRlc3QqKioKKy0gX19fdGVzdCB0ZXN0X19fCistICp0ZXN0ICoqdGVzdCoqKgorLSAqKnRlc3QgKnRlc3QqKioKKy0gKioqdGVzdCogdGVzdCoqCistICoqKnRlc3QqKiB0ZXN0KgorLSAqKip0ZXN0KiB0ZXN0KioKKy0gKip0ZXN0ICp0ZXN0KioqCistICp0ZXN0ICoqdGVzdCoqKgorLSBfdGVzdCBfX3Rlc3RfX18KKy0gX190ZXN0IF90ZXN0X19fCistIF9fX3Rlc3RfIHRlc3RfXworLSBfX190ZXN0X18gdGVzdF8KKy0gX19fdGVzdF8gdGVzdF9fCistIF9fdGVzdCBfdGVzdF9fXworLSBfdGVzdCBfX3Rlc3RfX18KK14KKy0gICphKmIKKy0gICBhKmIqCistICAgYSpiKmMKKy0gKiphKipiCistICAgYSoqYioqCistICAgYSoqYioqYworXgorLSAgX2FfYgorLSAgIGFfYl8KKy0gICBhX2JfYworLSBfX2FfX2IKKy0gICBhX19iX18KKy0gICBhX19iX19jCistICAgYV9fMl9fYworLSAgIGFfXzJfXzMKKy0gICAxX18yX18zCiteCistICAqYSBfYl8gYyoKKy0gICoqYSBfX2JfXyBjKioKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL25vcm1hbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvbm9ybWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1M2NmZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL25vcm1hbC5odG1sCkBAIC0wLDAgKzEsNjEgQEAKKzxwPlRoaXMgPGVtPmlzPC9lbT4gc28gPHN0cm9uZz5oYXJkPC9zdHJvbmc+LjwvcD4KKworPHA+VGhpcyA8ZW0+aXM8L2VtPiBzbyA8c3Ryb25nPmhhcmQ8L3N0cm9uZz4gdG9vLjwvcD4KKworPHA+PGVtPkF0PC9lbT4gc3RhcnQKKzxlbT5BdDwvZW0+IHN0YXJ0PC9wPgorCis8cD5BdCA8ZW0+ZW5kPC9lbT4KK0F0IDxlbT5lbmQ8L2VtPjwvcD4KKworPHA+PGVtPkF0PC9lbT4gc3RhcnQKKzxlbT5BdDwvZW0+IHN0YXJ0PC9wPgorCis8cD5BdCA8ZW0+ZW5kPC9lbT4KK0F0IDxlbT5lbmQ8L2VtPjwvcD4KKworPHA+QW5kIDxlbT5uZXN0PHN0cm9uZz5lZDwvc3Ryb25nPjwvZW0+LjwvcD4KKworPHA+QW5kIDxlbT5uZXN0KiplZDwvZW0+LjwvcD4KKworPHA+QW5kICpuZXN0PHN0cm9uZz5lZCogbGlrZTwvc3Ryb25nPiB0aGlzLjwvcD4KKworPHA+QW5kIDxlbT5ub3RfbmVzdF9lZDwvZW0+LjwvcD4KKworPHA+QW5kIDxzdHJvbmc+PGVtPm5lc3RlZDwvZW0+PC9zdHJvbmc+LjwvcD4KKworPHA+QW5kIDxzdHJvbmc+PGVtPm5lc3RlZDwvZW0+PC9zdHJvbmc+LjwvcD4KKworPHA+QW5kIDxzdHJvbmc+bmVzdDxlbT5lPC9lbT48L3N0cm9uZz4uPC9wPgorCis8cD5BbmQgbG9uZWx5ICogaGVyZSouPC9wPgorCis8cD5BbmQgbG9uZWx5ICoqIGhlcmUqKi48L3A+CisKKzxwPkFuZCA8c3Ryb25nPmxvbmVseSAqKiBoZXJlPC9zdHJvbmc+LjwvcD4KKworPHA+KiogYW5kIGhlcmUqKi48L3A+CisKKzxwPkFuZCA8c3Ryb25nPmNvbXBsaSpjYXRlZCAqPC9zdHJvbmc+IGhlcmU8L3A+CisKKzxwPlNvbWU8ZW0+Kip3aGF0PC9lbT4gbW9yZSAqIDxlbT4qKmhlPC9lbT5yZTwvcD4KKworPHA+RG8gaXQgPGVtPip0aGlzKjwvZW0+IHdheQorT3IgdGhpcyAqPGVtPnRoaXM8L2VtPiogd2F5CitPciB0aGF0IDxlbT4qdGhhdDwvZW0+KiB3YXkKK09yIHRoYXQgKjxlbT50aGF0KjwvZW0+IHdheTwvcD4KKworPHA+PGEgaHJlZj0iaHR0cDovL2JsYWguY29tL2JsYWhfJTI4Ij5odHRwOi8vYmxhaC5jb20vYmxhaF8lMjg8L2E+PC9wPgorCis8cD48YSBocmVmPSJBXy1CIj5BLV9CPC9hPjwvcD4KKworPHVsPgorICA8bGk+PGVtPnRlc3Q8L2VtPjwvbGk+CisgIDxsaT4mIzgyMTY7PGVtPnRlc3Q8L2VtPiYjODIxNzs8L2xpPgorICA8bGk+JiM4MjIwOzxlbT50ZXN0PC9lbT4mIzgyMjE7PC9saT4KKyAgPGxpPigmIzgyMjA7PGVtPnRlc3Q8L2VtPiYjODIyMTspPC9saT4KKyAgPGxpPig8ZW0+dGVzdDwvZW0+KTwvbGk+CisgIDxsaT7igJw8ZW0+dGVzdDwvZW0+4oCdPC9saT4KKyAgPGxpPmA8ZW0+dGVzdDwvZW0+JiM4MjE3OzwvbGk+CisgIDxsaT7igJ48ZW0+dGVzdDwvZW0+4oCcPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMl9lbXBoYXNpcy9ub3JtYWwub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL25vcm1hbC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmUwYTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wMl9lbXBoYXNpcy9ub3JtYWwub3B0aW9ucwpAQCAtMCwwICsxIEBACis6ZW50aXR5X291dHB1dDogOm51bWVyaWMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL25vcm1hbC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDJfZW1waGFzaXMvbm9ybWFsLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzMDkxMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAyX2VtcGhhc2lzL25vcm1hbC50ZXh0CkBAIC0wLDAgKzEsNTkgQEAKK1RoaXMgKmlzKiBzbyAqKmhhcmQqKi4KKworVGhpcyBfaXNfIHNvIF9faGFyZF9fIHRvby4KKworKkF0KiBzdGFydAorKkF0KiBzdGFydAorCitBdCAqZW5kKgorQXQgKmVuZCoKKworX0F0XyBzdGFydAorX0F0XyBzdGFydAorCitBdCBfZW5kXworQXQgX2VuZF8KKworQW5kICpuZXN0KiplZCoqKi4KKworQW5kICpuZXN0KiplZCouCisKK0FuZCAqbmVzdCoqZWQqIGxpa2UqKiB0aGlzLgorCitBbmQgKm5vdF9uZXN0X2VkKi4KKworQW5kICoqKm5lc3RlZCoqKi4KKworQW5kIF9fX25lc3RlZF9fXy4KKworQW5kICoqbmVzdCplKioqLgorCitBbmQgbG9uZWx5ICogaGVyZSouCisKK0FuZCBsb25lbHkgKiogaGVyZSoqLgorCitBbmQgKipsb25lbHkgKiogaGVyZSoqLgorCisqKiBhbmQgaGVyZSoqLgorCitBbmQgKipjb21wbGkqY2F0ZWQgXCoqKiBoZXJlCisKK1NvbWUqKip3aGF0KiBtb3JlICogKioqaGUqcmUKKworRG8gaXQgKlwqdGhpc1wqKiB3YXkKK09yIHRoaXMgXCoqdGhpcypcKiB3YXkKK09yIHRoYXQgKlwqdGhhdCpcKiB3YXkKK09yIHRoYXQgXCoqdGhhdFwqKiB3YXkKKworW2h0dHA6Ly9ibGFoLmNvbS9ibGFoXyUyOF0oaHR0cDovL2JsYWguY29tL2JsYWhfJTI4KQorCitbQS1fQl0oQV8tQikKKworLSBfdGVzdF8KKy0gJ190ZXN0XycKKy0gIl90ZXN0XyIKKy0gKCJfdGVzdF8iKQorLSAoX3Rlc3RfKQorLSDigJxfdGVzdF/igJ0KKy0gXGBfdGVzdF8nCistIOKAnl90ZXN0X+KAnApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vZW1wdHkuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2VtcHR5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNTA1MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2VtcHR5Lmh0bWwKQEAgLTAsMCArMSw1IEBACis8cD5UaGlzIGlzIGBgIGVtcHR5LjwvcD4KKworPHA+VGhpcyBpcyBgYGVtcHR5LjwvcD4KKworPHA+VGhpcyBpcyBgYGBgZW1wdHkuPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vZW1wdHkudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2VtcHR5LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiOTE1MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2VtcHR5LnRleHQKQEAgLTAsMCArMSw1IEBACitUaGlzIGlzIGBgIGVtcHR5LgorCitUaGlzIGlzIGBgZW1wdHkuCisKK1RoaXMgaXMgYGBgYGVtcHR5LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vZXJyb3JzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9lcnJvcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDM0MWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vZXJyb3JzLmh0bWwKQEAgLTAsMCArMSBAQAorPHA+Tm90IGVuZGVkIGBzcGFuLjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2Vycm9ycy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vZXJyb3JzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5NDhiNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2Vycm9ycy50ZXh0CkBAIC0wLDAgKzEgQEAKK05vdCBlbmRlZCBgc3Bhbi4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2hpZ2hsaWdodGluZy1taW50ZWQubGF0ZXggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9oaWdobGlnaHRpbmctbWludGVkLmxhdGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjg0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9oaWdobGlnaHRpbmctbWludGVkLmxhdGV4CkBAIC0wLDAgKzEsMiBAQAorWW91IGNhbiBzYXkgXG1pbnRpbmxpbmV7cnVieX17eCA9IENsYXNzLm5ld30sIGZvciBleGFtcGxlLgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9oaWdobGlnaHRpbmctbWludGVkLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9oaWdobGlnaHRpbmctbWludGVkLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExZWJiNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2hpZ2hsaWdodGluZy1taW50ZWQub3B0aW9ucwpAQCAtMCwwICsxIEBACis6c3ludGF4X2hpZ2hsaWdodGVyOiBtaW50ZWQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2hpZ2hsaWdodGluZy1taW50ZWQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2hpZ2hsaWdodGluZy1taW50ZWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzczMjkwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vaGlnaGxpZ2h0aW5nLW1pbnRlZC50ZXh0CkBAIC0wLDAgKzEgQEAKK1lvdSBjYW4gc2F5IGB4ID0gQ2xhc3MubmV3YHs6Lmxhbmd1YWdlLXJ1Ynl9LCBmb3IgZXhhbXBsZS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2hpZ2hsaWdodGluZy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vaGlnaGxpZ2h0aW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4NjBmNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2hpZ2hsaWdodGluZy5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPllvdSBjYW4gc2F5IDxjb2RlIGNsYXNzPSJsYW5ndWFnZS1ydWJ5IGhpZ2hsaWdodGVyLWNvZGVyYXkiPjxzcGFuIGNsYXNzPSJDb2RlUmF5Ij54ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiMwMzY7Zm9udC13ZWlnaHQ6Ym9sZCI+Q2xhc3M8L3NwYW4+Lm5ldzwvc3Bhbj48L2NvZGU+LCBmb3IgZXhhbXBsZS48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9oaWdobGlnaHRpbmcudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL2hpZ2hsaWdodGluZy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzMyOTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9oaWdobGlnaHRpbmcudGV4dApAQCAtMCwwICsxIEBACitZb3UgY2FuIHNheSBgeCA9IENsYXNzLm5ld2B7Oi5sYW5ndWFnZS1ydWJ5fSwgZm9yIGV4YW1wbGUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9ub3JtYWwuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL25vcm1hbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZWRkYmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9ub3JtYWwuaHRtbApAQCAtMCwwICsxLDE2IEBACis8cD5UaGlzIGlzIDxjb2RlPmE8L2NvZGU+IHNpbXBsZSBzcGFuLjwvcD4KKworPHA+V2l0aCA8Y29kZT5zb21lJmx0O2h0Jmd0OyZhbXA7bWw8L2NvZGU+IGluIGl0LjwvcD4KKworPHA+QW5kIDxjb2RlPmA8L2NvZGU+IGJhY2t0aWNrcy48L3A+CisKKzxwPkFuZCA8Y29kZT5gYHNvbWVgYDwvY29kZT4gbW9yZS48L3A+CisKKzxwPldpdGggYmFja3NsYXNoIDxjb2RlPmluXDwvY29kZT4gaXQuPC9wPgorCis8cD5UaGlzIGlzIGEgYCBsaXRlcmFsIGJhY2t0aWNrLgorQXMgYGFyZWAgdGhlc2UhPC9wPgorCis8cD5ObyA8Y29kZT5saXRlcmFsIGJhY2t0aWNrPC9jb2RlPi48L3A+CisKKzxwPjxjb2RlPnNvbWV0aGluZzwvY29kZT48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9ub3JtYWwudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL25vcm1hbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDA2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9ub3JtYWwudGV4dApAQCAtMCwwICsxLDE2IEBACitUaGlzIGlzIGBhYCBzaW1wbGUgc3Bhbi4KKworV2l0aCBgc29tZTxodD4mbWxgIGluIGl0LgorCitBbmQgYGAgYCBgYCBiYWNrdGlja3MuCisKK0FuZCBgYGAgYGBzb21lYGAgYGBgIG1vcmUuCisKK1dpdGggYmFja3NsYXNoIGBpblxgIGl0LgorCitUaGlzIGlzIGEgYCBsaXRlcmFsIGJhY2t0aWNrLgorQXMgXGBhcmVcYCB0aGVzZSEKKworTm8gYGAgbGl0ZXJhbCBiYWNrdGlja2BgLgorCitgc29tZXRoaW5nYApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2UvZGlzYWJsZWQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL3JvdWdlL2Rpc2FibGVkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyMmY3OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL3JvdWdlL2Rpc2FibGVkLmh0bWwKQEAgLTAsMCArMSBAQAorPHA+WW91IGNhbiBzYXkgPGNvZGUgY2xhc3M9Imxhbmd1YWdlLXJ1YnkiPkNsYXNzPC9jb2RlPi48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9yb3VnZS9kaXNhYmxlZC5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2UvZGlzYWJsZWQub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA5NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2UvZGlzYWJsZWQub3B0aW9ucwpAQCAtMCwwICsxLDQgQEAKKzpzeW50YXhfaGlnaGxpZ2h0ZXI6IHJvdWdlCis6c3ludGF4X2hpZ2hsaWdodGVyX29wdHM6CisgIHNwYW46CisgICAgZGlzYWJsZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2UvZGlzYWJsZWQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL3JvdWdlL2Rpc2FibGVkLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1OGQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL3JvdWdlL2Rpc2FibGVkLnRleHQKQEAgLTAsMCArMSBAQAorWW91IGNhbiBzYXkgYENsYXNzYHs6Lmxhbmd1YWdlLXJ1Ynl9LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2Uvc2ltcGxlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9yb3VnZS9zaW1wbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk0NTQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2Uvc2ltcGxlLmh0bWwKQEAgLTAsMCArMSBAQAorPHA+WW91IGNhbiBzYXkgPGNvZGUgY2xhc3M9Imxhbmd1YWdlLXJ1YnkgaGlnaGxpZ2h0ZXItcm91Z2UiPjxzcGFuIGNsYXNzPSJuIj54PC9zcGFuPiA8c3BhbiBjbGFzcz0ibyI+PTwvc3Bhbj4gPHNwYW4gY2xhc3M9Im5vIj5DbGFzczwvc3Bhbj48c3BhbiBjbGFzcz0icCI+Ljwvc3Bhbj48c3BhbiBjbGFzcz0ibmYiPm5ldzwvc3Bhbj48L2NvZGU+LCBmb3IgZXhhbXBsZS48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9yb3VnZS9zaW1wbGUub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzAzX2NvZGVzcGFuL3JvdWdlL3NpbXBsZS5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzYxZTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9yb3VnZS9zaW1wbGUub3B0aW9ucwpAQCAtMCwwICsxIEBACis6c3ludGF4X2hpZ2hsaWdodGVyOiByb3VnZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2Uvc2ltcGxlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wM19jb2Rlc3Bhbi9yb3VnZS9zaW1wbGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzczMjkwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDNfY29kZXNwYW4vcm91Z2Uvc2ltcGxlLnRleHQKQEAgLTAsMCArMSBAQAorWW91IGNhbiBzYXkgYHggPSBDbGFzcy5uZXdgezoubGFuZ3VhZ2UtcnVieX0sIGZvciBleGFtcGxlLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvYmFja2xpbmtfdGV4dC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvYmFja2xpbmtfdGV4dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDYzMTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9iYWNrbGlua190ZXh0Lmh0bWwKQEAgLTAsMCArMSw5IEBACis8cD5Tb21lIGZvb3Rub3RlIGhlcmU8c3VwIGlkPSJmbnJlZjpmbiI+PGEgaHJlZj0iI2ZuOmZuIiBjbGFzcz0iZm9vdG5vdGUiPjE8L2E+PC9zdXA+PC9wPgorCis8ZGl2IGNsYXNzPSJmb290bm90ZXMiPgorICA8b2w+CisgICAgPGxpIGlkPSJmbjpmbiI+CisgICAgICA8cD5Tb21lIHRleHQgaGVyZSZuYnNwOzxhIGhyZWY9IiNmbnJlZjpmbiIgY2xhc3M9InJldmVyc2Vmb290bm90ZSI+dGV4dCAmODYxNzsgJmx0O2ltZyAvJmd0OzwvYT48L3A+CisgICAgPC9saT4KKyAgPC9vbD4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvYmFja2xpbmtfdGV4dC5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvYmFja2xpbmtfdGV4dC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjc3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9iYWNrbGlua190ZXh0Lm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOmZvb3Rub3RlX2JhY2tsaW5rOiAndGV4dCAmODYxNzsgPGltZyAvPicKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL2JhY2tsaW5rX3RleHQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL2JhY2tsaW5rX3RleHQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWE2Zjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvYmFja2xpbmtfdGV4dC50ZXh0CkBAIC0wLDAgKzEsMyBAQAorU29tZSBmb290bm90ZSBoZXJlW15mbl0KKworW15mbl06IFNvbWUgdGV4dCBoZXJlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9kZWZpbml0aW9ucy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZGVmaW5pdGlvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDEyY2MwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZGVmaW5pdGlvbnMuaHRtbApAQCAtMCwwICsxLDE3IEBACis8cD5Tb21lIHBhcmEuPC9wPgorCis8YmxvY2txdW90ZT4KKyAgPHA+YmxvY2txdW90ZTwvcD4KKzwvYmxvY2txdW90ZT4KKworPHVsPgorICA8bGk+YSBsaXN0Cit3aXRoIHNvbWUgdGV4dDwvbGk+Cis8L3VsPgorCis8dWw+CisgIDxsaT5vdGhlciBsaXN0PC9saT4KKzwvdWw+Cis8cHJlPjxjb2RlPmNvZGUKKzwvY29kZT48L3ByZT4KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZGVmaW5pdGlvbnMubGF0ZXggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9kZWZpbml0aW9ucy5sYXRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY2OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZGVmaW5pdGlvbnMubGF0ZXgKQEAgLTAsMCArMSwxNyBAQAorU29tZSBwYXJhLgorCitcYmVnaW57cXVvdGV9CitibG9ja3F1b3RlCitcZW5ke3F1b3RlfQorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIGEgbGlzdAord2l0aCBzb21lIHRleHQKK1xlbmR7aXRlbWl6ZX0KKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBvdGhlciBsaXN0CitcZW5ke2l0ZW1pemV9CitcYmVnaW57dmVyYmF0aW19Y29kZQorXGVuZHt2ZXJiYXRpbX0KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZGVmaW5pdGlvbnMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL2RlZmluaXRpb25zLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiNTJlMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL2RlZmluaXRpb25zLnRleHQKQEAgLTAsMCArMSwyNCBAQAorU29tZSBwYXJhLgorCitbXmZvb3Rub3RlXTogaWdub3JlZCBkZWZpbml0aW9uCitbXmZvb3Rub3RlXTogU29tZSBmb290bm90ZSB0ZXh0CisKKz4gYmxvY2txdW90ZQorCitbXm90aGVyXTogc29tZQorICAgIGZvb3QKKworICAgIG5vdGUgdGV4dAorCisqIGEgbGlzdAorICB3aXRoIHNvbWUgdGV4dAorCitbXnRub3RlXTogZm9vdCBub3RlCisKKyogb3RoZXIgbGlzdAorXgorICAgIGNvZGUKKworW14xXToKKyAgICA+IGEgYmxvY2txdW90ZQorICAgIGFuZCBzb21lIHBhcmEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL2Zvb3Rub3RlX25yLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9mb290bm90ZV9uci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2VmZjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9mb290bm90ZV9uci5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxwPlRoaXMgaXMgYSBmb290bm90ZTxzdXAgaWQ9ImZucmVmOmFiIj48YSBocmVmPSIjZm46YWIiIGNsYXNzPSJmb290bm90ZSI+MzU8L2E+PC9zdXA+LiBBbmQgYW5vdGhlcjxzdXAgaWQ9ImZucmVmOmJjIj48YSBocmVmPSIjZm46YmMiIGNsYXNzPSJmb290bm90ZSI+MzY8L2E+PC9zdXA+LjwvcD4KKworPGRpdiBjbGFzcz0iZm9vdG5vdGVzIj4KKyAgPG9sIHN0YXJ0PSIzNSI+CisgICAgPGxpIGlkPSJmbjphYiI+CisgICAgICA8cD5Tb21lIHRleHQuJm5ic3A7PGEgaHJlZj0iI2ZucmVmOmFiIiBjbGFzcz0icmV2ZXJzZWZvb3Rub3RlIj4mIzg2MTc7PC9hPjwvcD4KKyAgICA8L2xpPgorICAgIDxsaSBpZD0iZm46YmMiPgorICAgICAgPHA+U29tZSBvdGhlciB0ZXh0LiZuYnNwOzxhIGhyZWY9IiNmbnJlZjpiYyIgY2xhc3M9InJldmVyc2Vmb290bm90ZSI+JiM4NjE3OzwvYT48L3A+CisgICAgPC9saT4KKyAgPC9vbD4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZm9vdG5vdGVfbnIubGF0ZXggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9mb290bm90ZV9uci5sYXRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjA3ZGRlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZm9vdG5vdGVfbnIubGF0ZXgKQEAgLTAsMCArMSwyIEBACitUaGlzIGlzIGEgZm9vdG5vdGVcZm9vdG5vdGV7U29tZSB0ZXh0Ln0uIEFuZCBhbm90aGVyXGZvb3Rub3Rle1NvbWUgb3RoZXIgdGV4dC59LgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9mb290bm90ZV9uci5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZm9vdG5vdGVfbnIub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjA2ZWNmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZm9vdG5vdGVfbnIub3B0aW9ucwpAQCAtMCwwICsxIEBACis6Zm9vdG5vdGVfbnI6IDM1CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9mb290bm90ZV9uci50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZm9vdG5vdGVfbnIudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQyOTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvZm9vdG5vdGVfbnIudGV4dApAQCAtMCwwICsxLDQgQEAKK1RoaXMgaXMgYSBmb290bm90ZVteYWJdLiBBbmQgYW5vdGhlclteYmNdLgorCitbXmFiXTogU29tZSB0ZXh0LgorW15iY106IFNvbWUgb3RoZXIgdGV4dC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL2luc2lkZV9mb290bm90ZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvaW5zaWRlX2Zvb3Rub3RlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1YmM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL2luc2lkZV9mb290bm90ZS5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzxwPkxvcmVtIGlwc3VtPHN1cCBpZD0iZm5yZWY6Zmlyc3QiPjxhIGhyZWY9IiNmbjpmaXJzdCIgY2xhc3M9ImZvb3Rub3RlIj4xPC9hPjwvc3VwPiBkb2xvciBzaXQgYW1ldC48L3A+CisKKzxwPkxvcmVtIGlwc3VtPHN1cCBpZD0iZm5yZWY6c2Vjb25kIj48YSBocmVmPSIjZm46c2Vjb25kIiBjbGFzcz0iZm9vdG5vdGUiPjI8L2E+PC9zdXA+IGRvbG9yIHNpdCBhbWV0LjwvcD4KKworPGRpdiBjbGFzcz0iZm9vdG5vdGVzIj4KKyAgPG9sPgorICAgIDxsaSBpZD0iZm46Zmlyc3QiPgorICAgICAgPHA+Q29uc2VjdXR1ciBhZGlzcGluZy48c3VwIGlkPSJmbnJlZjp0aGlyZCI+PGEgaHJlZj0iI2ZuOnRoaXJkIiBjbGFzcz0iZm9vdG5vdGUiPjM8L2E+PC9zdXA+Jm5ic3A7PGEgaHJlZj0iI2ZucmVmOmZpcnN0IiBjbGFzcz0icmV2ZXJzZWZvb3Rub3RlIj4mIzg2MTc7PC9hPjwvcD4KKyAgICA8L2xpPgorICAgIDxsaSBpZD0iZm46c2Vjb25kIj4KKyAgICAgIDxwPlNlZCB1dCBwZXJzcGljaWF0aXMgdW5kZSBvbW5pcy4mbmJzcDs8YSBocmVmPSIjZm5yZWY6c2Vjb25kIiBjbGFzcz0icmV2ZXJzZWZvb3Rub3RlIj4mIzg2MTc7PC9hPjwvcD4KKyAgICA8L2xpPgorICAgIDxsaSBpZD0iZm46dGhpcmQiPgorICAgICAgPHA+U2VkIHV0LiZuYnNwOzxhIGhyZWY9IiNmbnJlZjp0aGlyZCIgY2xhc3M9InJldmVyc2Vmb290bm90ZSI+JiM4NjE3OzwvYT48L3A+CisgICAgPC9saT4KKyAgPC9vbD4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvaW5zaWRlX2Zvb3Rub3RlLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9pbnNpZGVfZm9vdG5vdGUudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGY5MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvaW5zaWRlX2Zvb3Rub3RlLnRleHQKQEAgLTAsMCArMSw5IEBACitMb3JlbSBpcHN1bVteZmlyc3RdIGRvbG9yIHNpdCBhbWV0LgorCitMb3JlbSBpcHN1bVtec2Vjb25kXSBkb2xvciBzaXQgYW1ldC4KKworW15maXJzdF06IENvbnNlY3V0dXIgYWRpc3BpbmcuW150aGlyZF0KKworW15zZWNvbmRdOiBTZWQgdXQgcGVyc3BpY2lhdGlzIHVuZGUgb21uaXMuCisKK1tedGhpcmRdOiBTZWQgdXQuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9tYXJrZXJzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9tYXJrZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjNDVkNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL21hcmtlcnMuaHRtbApAQCAtMCwwICsxLDQ2IEBACis8cD5UaGlzIGlzIHNvbWUgKnJlZi48c3VwIGlkPSJmbnJlZjpmbiI+PGEgaHJlZj0iI2ZuOmZuIiBjbGFzcz0iZm9vdG5vdGUiPjE8L2E+PC9zdXA+PC9wPgorCis8YmxvY2txdW90ZT4KKyAgPHA+YSBibG9ja3F1b3RlIDxzdXAgaWQ9ImZucmVmOjMiPjxhIGhyZWY9IiNmbjozIiBjbGFzcz0iZm9vdG5vdGUiPjI8L2E+PC9zdXA+PC9wPgorPC9ibG9ja3F1b3RlPgorCis8dWw+CisgIDxsaT5hbmQgYSBsaXN0IGl0ZW0gPHN1cCBpZD0iZm5yZWY6MSI+PGEgaHJlZj0iI2ZuOjEiIGNsYXNzPSJmb290bm90ZSI+MzwvYT48L3N1cD48L2xpPgorPC91bD4KKworPGgxPkFuZCBhIGhlYWRlcjxzdXAgaWQ9ImZucmVmOm5vdyI+PGEgaHJlZj0iI2ZuOm5vdyIgY2xhc3M9ImZvb3Rub3RlIj40PC9hPjwvc3VwPjwvaDE+CisKKzxwPkEgbWFya2VyIHdpdGhvdXQgYSBkZWZpbml0aW9uIFted2l0aG91dF0uPC9wPgorCis8cD5BIG1hcmtlciA8c3VwIGlkPSJmbnJlZjplbXB0eSI+PGEgaHJlZj0iI2ZuOmVtcHR5IiBjbGFzcz0iZm9vdG5vdGUiPjU8L2E+PC9zdXA+IHVzZWQgdHdpY2U8c3VwIGlkPSJmbnJlZjpmbjoxIj48YSBocmVmPSIjZm46Zm4iIGNsYXNzPSJmb290bm90ZSI+MTwvYT48L3N1cD4gYW5kIHRocmljZTxzdXAgaWQ9ImZucmVmOmZuOjIiPjxhIGhyZWY9IiNmbjpmbiIgY2xhc3M9ImZvb3Rub3RlIj4xPC9hPjwvc3VwPi48L3A+CisKKzxkaXYgY2xhc3M9ImZvb3Rub3RlcyI+CisgIDxvbD4KKyAgICA8bGkgaWQ9ImZuOmZuIj4KKyAgICAgIDxwPlNvbWUgZm9vdCBub3RlIHRleHQmbmJzcDs8YSBocmVmPSIjZm5yZWY6Zm4iIGNsYXNzPSJyZXZlcnNlZm9vdG5vdGUiPiYjODYxNzs8L2E+Jm5ic3A7PGEgaHJlZj0iI2ZucmVmOmZuOjEiIGNsYXNzPSJyZXZlcnNlZm9vdG5vdGUiPiYjODYxNzs8c3VwPjI8L3N1cD48L2E+Jm5ic3A7PGEgaHJlZj0iI2ZucmVmOmZuOjIiIGNsYXNzPSJyZXZlcnNlZm9vdG5vdGUiPiYjODYxNzs8c3VwPjM8L3N1cD48L2E+PC9wPgorICAgIDwvbGk+CisgICAgPGxpIGlkPSJmbjozIj4KKyAgICAgIDxwPm90aGVyIHRleHQKK3dpdGggbW9yZSBsaW5lczwvcD4KKworICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgIDxwPmFuZCBhIHF1b3RlPC9wPgorICAgICAgPC9ibG9ja3F1b3RlPgorICAgICAgPHA+PGEgaHJlZj0iI2ZucmVmOjMiIGNsYXNzPSJyZXZlcnNlZm9vdG5vdGUiPiYjODYxNzs8L2E+PC9wPgorICAgIDwvbGk+CisgICAgPGxpIGlkPSJmbjoxIj4KKyAgICAgIDxwPnNvbWUgPGVtPnRleHQ8L2VtPiZuYnNwOzxhIGhyZWY9IiNmbnJlZjoxIiBjbGFzcz0icmV2ZXJzZWZvb3Rub3RlIj4mIzg2MTc7PC9hPjwvcD4KKyAgICA8L2xpPgorICAgIDxsaSBpZD0iZm46bm93Ij4KKworICAgICAgPHByZT48Y29kZT5jb2RlIGJsb2NrCitjb250aW51ZWQgaGVyZQorPC9jb2RlPjwvcHJlPgorICAgICAgPHA+PGEgaHJlZj0iI2ZucmVmOm5vdyIgY2xhc3M9InJldmVyc2Vmb290bm90ZSI+JiM4NjE3OzwvYT48L3A+CisgICAgPC9saT4KKyAgICA8bGkgaWQ9ImZuOmVtcHR5Ij4KKworICAgICAgPHA+PGEgaHJlZj0iI2ZucmVmOmVtcHR5IiBjbGFzcz0icmV2ZXJzZWZvb3Rub3RlIj4mIzg2MTc7PC9hPjwvcD4KKyAgICA8L2xpPgorICA8L29sPgorPC9kaXY+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9tYXJrZXJzLmxhdGV4IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvbWFya2Vycy5sYXRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjUyMzdlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvbWFya2Vycy5sYXRleApAQCAtMCwwICsxLDIzIEBACitUaGlzIGlzIHNvbWUgKnJlZi5cZm9vdG5vdGV7U29tZSBmb290IG5vdGUgdGV4dH0KKworXGJlZ2lue3F1b3RlfQorYSBibG9ja3F1b3RlIFxmb290bm90ZXtvdGhlciB0ZXh0Cit3aXRoIG1vcmUgbGluZXMKKworXGJlZ2lue3F1b3RlfQorYW5kIGEgcXVvdGUKK1xlbmR7cXVvdGV9fQorXGVuZHtxdW90ZX0KKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBhbmQgYSBsaXN0IGl0ZW0gXGZvb3Rub3Rle3NvbWUgXGVtcGh7dGV4dH19CitcZW5ke2l0ZW1pemV9CisKK1xzZWN0aW9uKntBbmQgYSBoZWFkZXJcZm9vdG5vdGV7XGJlZ2lue3ZlcmJhdGltfWNvZGUgYmxvY2sKK2NvbnRpbnVlZCBoZXJlCitcZW5ke3ZlcmJhdGltfX19CisKK0EgbWFya2VyIHdpdGhvdXQgYSBkZWZpbml0aW9uIFtcXnt9d2l0aG91dF0uCisKK0EgbWFya2VyIFxmb290bm90ZXt9IHVzZWQgdHdpY2VcZm9vdG5vdGV7U29tZSBmb290IG5vdGUgdGV4dH0gYW5kIHRocmljZVxmb290bm90ZXtTb21lIGZvb3Qgbm90ZSB0ZXh0fS4KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvbWFya2Vycy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvbWFya2Vycy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjc3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9tYXJrZXJzLnRleHQKQEAgLTAsMCArMSwyNyBAQAorVGhpcyBpcyBzb21lICpyZWYuW15mbl0KKworW15mbl06IFNvbWUgZm9vdCBub3RlIHRleHQKK3s6IC5jbGFzc30KKworPiBhIGJsb2NrcXVvdGUgW14zXQorCisqIGFuZCBhIGxpc3QgaXRlbSBbXjFdCisKKyMgQW5kIGEgaGVhZGVyW15ub3ddCisKK1teMV06c29tZSAqdGV4dCoKK1teM106IG90aGVyIHRleHQKKyAgICB3aXRoIG1vcmUgbGluZXMKKworICAgID4gYW5kIGEgcXVvdGUKKworQSBtYXJrZXIgd2l0aG91dCBhIGRlZmluaXRpb24gW153aXRob3V0XS4KKworQSBtYXJrZXIgW15lbXB0eV0gdXNlZCB0d2ljZVteZm5dIGFuZCB0aHJpY2VbXmZuXS4KKworW15ub3ddOgorCisgICAgCWNvZGUgYmxvY2sKKyAgICAgICAgY29udGludWVkIGhlcmUKKworW15lbXB0eV06CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9wbGFjZW1lbnQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL3BsYWNlbWVudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NTQzYTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9wbGFjZW1lbnQuaHRtbApAQCAtMCwwICsxLDExIEBACis8ZGl2IGNsYXNzPSJmb290bm90ZXMiPgorICA8b2w+CisgICAgPGxpIGlkPSJmbjoxIj4KKyAgICAgIDxwPkZvb3Rub3RlIFxgIHRleHQmbmJzcDs8YSBocmVmPSIjZm5yZWY6MSIgY2xhc3M9InJldmVyc2Vmb290bm90ZSI+JiM4NjE3OzwvYT48L3A+CisgICAgPC9saT4KKyAgPC9vbD4KKzwvZGl2PgorCis8cD5Tb21lIHBhcmEgd2l0aCBhPHN1cCBpZD0iZm5yZWY6MSI+PGEgaHJlZj0iI2ZuOjEiIGNsYXNzPSJmb290bm90ZSI+MTwvYT48L3N1cD4gZm9vdG5vdGUuPC9wPgorCis8cD5BbmQgYW5vdGhlciBwYXJhLjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL3BsYWNlbWVudC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvcGxhY2VtZW50LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjMGFiMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL3BsYWNlbWVudC50ZXh0CkBAIC0wLDAgKzEsOCBAQAorKiBmb290bm90ZXMgd2lsbCBiZSBwbGFjZWQgaGVyZQorezpmb290bm90ZXN9CisKK1NvbWUgcGFyYSB3aXRoIGFbXjFdIGZvb3Rub3RlLgorCitbXjFdOiBGb290bm90ZSBcXFxgIHRleHQKKworQW5kIGFub3RoZXIgcGFyYS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL3JlZ2V4cF9wcm9ibGVtLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9yZWdleHBfcHJvYmxlbS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDZhMzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS9yZWdleHBfcHJvYmxlbS5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxoMT5Tb21ldGhpbmc8L2gxPgorPHA+c29tZXRoaW5nPHN1cCBpZD0iZm5yZWY6bm90ZTEiPjxhIGhyZWY9IiNmbjpub3RlMSIgY2xhc3M9ImZvb3Rub3RlIj4xPC9hPjwvc3VwPi48L3A+CisKKzxoMT5Gb290bm90ZXM8L2gxPgorCis8aDE+VGVzdDwvaDE+Cis8ZGl2IGNsYXNzPSJmb290bm90ZXMiPgorICA8b2w+CisgICAgPGxpIGlkPSJmbjpub3RlMSI+CisKKyAgICAgIDxwPkEgbm90ZSZuYnNwOzxhIGhyZWY9IiNmbnJlZjpub3RlMSIgY2xhc3M9InJldmVyc2Vmb290bm90ZSI+JiM4NjE3OzwvYT48L3A+CisgICAgPC9saT4KKyAgPC9vbD4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvcmVnZXhwX3Byb2JsZW0udGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL3JlZ2V4cF9wcm9ibGVtLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2MGM2MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL3JlZ2V4cF9wcm9ibGVtLnRleHQKQEAgLTAsMCArMSw1MiBAQAorIyBTb21ldGhpbmcKK3NvbWV0aGluZ1tebm90ZTFdLgorCisjIEZvb3Rub3RlcworW15ub3RlMV06CisgICAgQSBub3RlCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRlc3QKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL3dpdGhvdXRfYmFja2xpbmsuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA0X2Zvb3Rub3RlL3dpdGhvdXRfYmFja2xpbmsuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjVlOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvd2l0aG91dF9iYWNrbGluay5odG1sCkBAIC0wLDAgKzEsOSBAQAorPHA+U29tZSBmb290bm90ZSBoZXJlPHN1cCBpZD0iZm5yZWY6Zm4iPjxhIGhyZWY9IiNmbjpmbiIgY2xhc3M9ImZvb3Rub3RlIj4xPC9hPjwvc3VwPjwvcD4KKworPGRpdiBjbGFzcz0iZm9vdG5vdGVzIj4KKyAgPG9sPgorICAgIDxsaSBpZD0iZm46Zm4iPgorICAgICAgPHA+U29tZSB0ZXh0IGhlcmU8L3A+CisgICAgPC9saT4KKyAgPC9vbD4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvd2l0aG91dF9iYWNrbGluay5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvd2l0aG91dF9iYWNrbGluay5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTJkZDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS93aXRob3V0X2JhY2tsaW5rLm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOmZvb3Rub3RlX2JhY2tsaW5rOiAnJwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvd2l0aG91dF9iYWNrbGluay50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDRfZm9vdG5vdGUvd2l0aG91dF9iYWNrbGluay50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTZmOTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNF9mb290bm90ZS93aXRob3V0X2JhY2tsaW5rLnRleHQKQEAgLTAsMCArMSwzIEBACitTb21lIGZvb3Rub3RlIGhlcmVbXmZuXQorCitbXmZuXTogU29tZSB0ZXh0IGhlcmUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvYWNyb3NzX2xpbmVzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL2Fjcm9zc19saW5lcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Y2VjNDAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL2Fjcm9zc19saW5lcy5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPkxpbms6IDxhIGhyZWY9InRlc3QgZm9vIj50ZXN0PC9hPjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvYWNyb3NzX2xpbmVzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL2Fjcm9zc19saW5lcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzlkOTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL2Fjcm9zc19saW5lcy50ZXh0CkBAIC0wLDAgKzEsMiBAQAorTGluazogPGEgaHJlZj0idGVzdAorZm9vIj50ZXN0PC9hPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9idXR0b24uaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvYnV0dG9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5YmI1MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvYnV0dG9uLmh0bWwKQEAgLTAsMCArMSw3IEBACis8cD48YnV0dG9uPlNvbWUgVGV4dDwvYnV0dG9uPjwvcD4KKworPHA+Rmlyc3Qgc29tZSB0ZXh0IGFuZCB0aGVuIGEgPGJ1dHRvbj5oZXJlPC9idXR0b24+PC9wPgorCis8cD48YnV0dG9uPkEgYnV0dG9uPC9idXR0b24+IGFuZCB0aGVuIHRleHQuPC9wPgorCis8cD5BIDxidXR0b24+d2l0aCA8c3Ryb25nPnNvbWU8L3N0cm9uZz4gPGNvZGU+Y29kZTwvY29kZT4gaW4gPGltZyBzcmM9ImltYWdlLnBuZyIgYWx0PSJhbHQiIC8+PC9idXR0b24+IGl0LjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvYnV0dG9uLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL2J1dHRvbi50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTc3ODMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL2J1dHRvbi50ZXh0CkBAIC0wLDAgKzEsNyBAQAorPGJ1dHRvbj5Tb21lIFRleHQ8L2J1dHRvbj4KKworRmlyc3Qgc29tZSB0ZXh0IGFuZCB0aGVuIGEgPGJ1dHRvbj5oZXJlPC9idXR0b24+CisKKzxidXR0b24+QSBidXR0b248L2J1dHRvbj4gYW5kIHRoZW4gdGV4dC4KKworQSA8YnV0dG9uPndpdGggKipzb21lKiogYGNvZGVgIGluICFbYWx0XShpbWFnZS5wbmcpPC9idXR0b24+IGl0LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9pbnZhbGlkLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL2ludmFsaWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA1NTJmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9pbnZhbGlkLmh0bWwKQEAgLTAsMCArMSBAQAorPHA+VGhpcyBpcyA8c3Bhbj5zb21lIHRleHQ8L3NwYW4+PC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9pbnZhbGlkLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL2ludmFsaWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNmMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9pbnZhbGlkLnRleHQKQEAgLTAsMCArMSBAQAorVGhpcyBpcyA8c3Bhbj5zb21lIHRleHQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbGlua193aXRoX21haWx0by5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9saW5rX3dpdGhfbWFpbHRvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwZDZhZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbGlua193aXRoX21haWx0by5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPkxpbms6IDxhIGhyZWY9Im1haWx0bzp0ZXN0QGV4YW1wbGUuY29tIj50ZXh0PC9hPjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbGlua193aXRoX21haWx0by50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9saW5rX3dpdGhfbWFpbHRvLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwMTYxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbGlua193aXRoX21haWx0by50ZXh0CkBAIC0wLDAgKzEgQEAKK0xpbms6IDxhIGhyZWY9Im1haWx0bzp0ZXN0QGV4YW1wbGUuY29tIj50ZXh0PC9hPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9tYXJrX2VsZW1lbnQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbWFya19lbGVtZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5ODliNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbWFya19lbGVtZW50Lmh0bWwKQEAgLTAsMCArMSwzIEBACis8cD5Mb3JlbSBpcHN1bS48L3A+CisKKzxwPjxtYXJrPlRlc3Q8L21hcms+PC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9tYXJrX2VsZW1lbnQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbWFya19lbGVtZW50LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlMzBlMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbWFya19lbGVtZW50LnRleHQKQEAgLTAsMCArMSwzIEBACitMb3JlbSBpcHN1bS4KKworPG1hcms+VGVzdDwvbWFyaz4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbWFya2Rvd25fYXR0ci5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9tYXJrZG93bl9hdHRyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxNThjMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbWFya2Rvd25fYXR0ci5odG1sCkBAIC0wLDAgKzEsNiBAQAorPHA+VGhpcyBpcyA8c3Bhbj48ZW0+dGV4dDwvZW0+PC9zcGFuPgorVGhpcyBpcyA8c3Bhbj4qdGV4dCo8L3NwYW4+CitUaGlzIGlzIDxzcGFuPjxlbT50ZXh0PC9lbT48L3NwYW4+CitUaGlzIGlzIDxzcGFuPjxlbT50ZXh0PC9lbT48L3NwYW4+CitUaGlzIGlzIDxzcGFuPipub3RoaW5nKiA8c3Ryb25nPnRvIDxlbT5mZWFyPC9lbT48L3N0cm9uZz4gYWJvdXQ8L3NwYW4+LgorVGhpcyBpcyA8c3Bhbj4mbHQ7aHR0cDovL2V4YW1wbGUuY29tJmd0Ozwvc3Bhbj4uPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9tYXJrZG93bl9hdHRyLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL21hcmtkb3duX2F0dHIudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2MxMGZmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9tYXJrZG93bl9hdHRyLnRleHQKQEAgLTAsMCArMSw2IEBACitUaGlzIGlzIDxzcGFuIG1hcmtkb3duPSIxIj4qdGV4dCo8L3NwYW4+CitUaGlzIGlzIDxzcGFuIG1hcmtkb3duPSIwIj4qdGV4dCo8L3NwYW4+CitUaGlzIGlzIDxzcGFuIG1hcmtkb3duPSJzcGFuIj4qdGV4dCo8L3NwYW4+CitUaGlzIGlzIDxzcGFuIG1hcmtkb3duPSJibG9jayI+KnRleHQqPC9zcGFuPgorVGhpcyBpcyA8c3BhbiBtYXJrZG93bj0iMCI+Km5vdGhpbmcqIDxzdHJvbmcgbWFya2Rvd249IjEiPnRvICpmZWFyKjwvc3Ryb25nPiBhYm91dDwvc3Bhbj4uCitUaGlzIGlzIDxzcGFuIG1hcmtkb3duPSIwIj48aHR0cDovL2V4YW1wbGUuY29tPjwvc3Bhbj4uCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL25vcm1hbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9ub3JtYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGE1ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9ub3JtYWwuaHRtbApAQCAtMCwwICsxLDQzIEBACis8cD5FbXB0eSA8YSBuYW1lPSJhbmNob3IiIGlkPSJhbmNob3IiIGNsYXNzPSIiPjwvYT4hPC9wPgorCis8cD48YSBocmVmPSJ0ZXN0Ij50aXRsZTwvYT4gaXMgYSB0aXRsZS48L3A+CisKKzxwPlRoaXMgaXMgPD8gYSBQSSA/Pi48L3A+CisKKzxwPlRoaXMgaXMgPCEtLSBhIC0tPiBjb21tZW50LjwvcD4KKworPHA+VGhpcyBpcyA8IS0tIGEKKy0tPiBtdWx0aWxpbmUgY29tbWVudC48L3A+CisKKzxwPlRoaXMgaXMgPHNwYW4+dGFnCitub3cgPC9zcGFuPi48L3A+CisKKzxwPlRoaXMgaXMgPHNwYW4+dGFnCis8L3NwYW4+IG5vdy48L3A+CisKKzxwPlRoaXMgaXMgYW4gZW1wdHkgPHNwYW4+PC9zcGFuPiB0YWcuPC9wPgorCis8cD5UaGlzIGlzIDxlbT5zb21ldGhpbmc8c3BhbiB0ZXN0PSJkb19pdCI+PC9zcGFuPiBzdHJhbmdlPC9lbT4uPC9wPgorCis8cD5BdXRvLWNsb3Npbmc6IDxiciAvPjwvcD4KKworPHA+RXhwYW5kaW5nOiA8dGV4dGFyZWE+PC90ZXh0YXJlYT48L3A+CisKKzxwPkFuIGludmFsaWQgdGFnOiAmbHQ7aFImZ3Q7PC9wPgorCis8cD5BICZsdDtwJmd0O2Jsb2NrIHRhZyZsdDsvcCZndDsuPC9wPgorCis8cD5BbiBpbnZhbGlkICZsdDsvY2xvc2luZyZndDsgdGFnLjwvcD4KKworPHA+QSA8c2NyaXB0Pipub3QqPC9zY3JpcHQ+IHRhZy48L3A+CisKKzxwPkFuIDxzcGFuPnVuY2xvc2VkIDxlbT50YWcuPC9lbT48L3NwYW4+PC9wPgorCis8cD5Tb21lIDxjb2RlPmVsZW1lbnQgd2l0aCB8IHBpcGUgc3ltYm9sPC9jb2RlPjwvcD4KKworPHA+U29tZSA8c3Bhbj48Y29kZT5lbGVtZW50IHdpdGggfCBwaXBlIHN5bWJvbDwvY29kZT48L3NwYW4+PC9wPgorCis8cD5Tb21lIDxjb2RlPmVsZW1lbnQgd2l0aCB8IHBpcGUKK3N5bWJvbHw8L2NvZGU+PC9wPgorCis8cD48dT51bmRlcmxpbmVkPC91PjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvbm9ybWFsLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL25vcm1hbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTZkN2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL25vcm1hbC50ZXh0CkBAIC0wLDAgKzEsNDMgQEAKK0VtcHR5IDxhIE5hTWU9ImFuY2hvciIgSUQ9ImFuY2hvciIgY0xhU3M+PC9BPiEKKworPGEgaHJlZj0idGVzdCI+dGl0bGU8L2E+IGlzIGEgdGl0bGUuCisKK1RoaXMgaXMgPD8gYSBQSSA/Pi4KKworVGhpcyBpcyA8IS0tIGEgLS0+IGNvbW1lbnQuCisKK1RoaXMgaXMgPCEtLSBhCistLT4gbXVsdGlsaW5lIGNvbW1lbnQuCisKK1RoaXMgaXMgPHNwYW4+dGFnCitub3cgPC9zcGFuPi4KKworVGhpcyBpcyA8c1BBbj50YWcKKzwvU1BBTj4gbm93LgorCitUaGlzIGlzIGFuIGVtcHR5IDxzcGFuPjwvc3Bhbj4gdGFnLgorCitUaGlzIGlzIF9zb21ldGhpbmc8c3BhbiB0ZXN0PSJkb19pdCIgLz4gc3RyYW5nZV8uCisKK0F1dG8tY2xvc2luZzogPGJyPgorCitFeHBhbmRpbmc6IDx0ZXh0YXJlYT48L3RleHRhcmVhPgorCitBbiBpbnZhbGlkIHRhZzogPGhSPgorCitBIDxwPmJsb2NrIHRhZzwvcD4uCisKK0FuIGludmFsaWQgPC9jbG9zaW5nPiB0YWcuCisKK0EgPHNjcmlwdD4qbm90Kjwvc2NyaXB0PiB0YWcuCisKK0FuIDxzcGFuPnVuY2xvc2VkICp0YWcuKgorCitTb21lIDxjb2RlPmVsZW1lbnQgd2l0aCB8IHBpcGUgc3ltYm9sPC9jb2RlPgorCitTb21lIDxzcGFuPjxjb2RlPmVsZW1lbnQgd2l0aCB8IHBpcGUgc3ltYm9sPC9jb2RlPjwvc3Bhbj4KKworU29tZSA8Y29kZT5lbGVtZW50IHdpdGggfCBwaXBlCitzeW1ib2x8PC9jb2RlPgorCis8dT51bmRlcmxpbmVkPC91PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9yYXdfc3Bhbl9lbGVtZW50cy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC9yYXdfc3Bhbl9lbGVtZW50cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGYxZGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL3Jhd19zcGFuX2VsZW1lbnRzLmh0bWwKQEAgLTAsMCArMSwyIEBACis8cD5UaGlzIGlzIHJhdyA8a2JkPi0tdmVyc2lvbjwva2JkPiBhbmQgPHNhbXA+LS12ZXJzaW9uPC9zYW1wPiBhbmQgPHZhcj4tLXZlcnNpb248L3Zhcj4gYW5kCis8Y29kZT4tLS12ZXJzaW9uPC9jb2RlPi48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL3Jhd19zcGFuX2VsZW1lbnRzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL3Jhd19zcGFuX2VsZW1lbnRzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxMjhmYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwvcmF3X3NwYW5fZWxlbWVudHMudGV4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgaXMgcmF3IDxrYmQ+LS12ZXJzaW9uPC9rYmQ+IGFuZCA8c2FtcD4tLXZlcnNpb248L3NhbXA+IGFuZCA8dmFyPi0tdmVyc2lvbjwvdmFyPiBhbmQKKzxjb2RlPi0tLXZlcnNpb248L2NvZGU+LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vMDVfaHRtbC94bWwuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwveG1sLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiNDNjMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwveG1sLmh0bWwKQEAgLTAsMCArMSw1IEBACis8cD5UaGlzIDxzb21lOnVybCBuYW1lOnNwYWM9ImhhbGxvIj5kb2l0PC9zb21lOnVybD4gdGVzdDwvcD4KKworPHA+VGhpcyA8U29NZTpVckwgTmFtRTpTcEFDPSJ0ZXN0Ij5kb2l0PC9Tb01lOlVyTD4gdGVzdDwvcD4KKworPHA+VGhpcyA8U29NZT5kb2l0Jmx0Oy9zb21lJmd0OyB0ZXN0PC9Tb01lPjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuLzA1X2h0bWwveG1sLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL3htbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjM0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi8wNV9odG1sL3htbC50ZXh0CkBAIC0wLDAgKzEsNSBAQAorVGhpcyA8c29tZTp1cmwgbmFtZTpzcGFjPSdoYWxsbyc+ZG9pdDwvc29tZTp1cmw+IHRlc3QKKworVGhpcyA8U29NZTpVckwgTmFtRTpTcEFDPSd0ZXN0Jz5kb2l0PC9Tb01lOlVyTD4gdGVzdAorCitUaGlzIDxTb01lPmRvaXQ8L3NvbWU+IHRlc3QKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2FiYnJldmlhdGlvbnMvYWJicmV2Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9hYmJyZXZpYXRpb25zL2FiYnJldi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDdjNTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9hYmJyZXZpYXRpb25zL2FiYnJldi5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzxwPlRoaXMgPGFiYnIgdGl0bGU9Ikl0IGlzLCB5ZXMiPmlzIHNvbWU8L2FiYnI+IHRleHQuPC9wPgorCis8cD5UaGVyZSA8ZW0+PGFiYnIgdGl0bGU9Ikl0IGlzLCB5ZXMiPmlzIHNvbWU8L2FiYnI+IHJlYWw8L2VtPiBjb25jZXJuIGFib3V0IDxhYmJyIHRpdGxlPSJUaGlzICZhbXA7IHRoYXQiPk90SGVSITwvYWJicj48L3A+CisKKzxwPjxhYmJyIHRpdGxlPSJJdCBpcywgeWVzIj5pcyBzb21lPC9hYmJyPiBUaGluayA8YWJicj5lbXB0eTwvYWJicj4gYWJvdXQgPGFiYnIgdGl0bGU9IlZlcnkgbmljZSBjb3VudHJ5Ij5PZXN0ZXJyZWljaDwvYWJicj4uIDxhYmJyIHRpdGxlPSJDYXNjYWRpbmciPkNTUzwvYWJicj4gdW5kIDxhYmJyIHRpdGxlPSJDYXNjYWRpbmcgMyI+Q1NTMzwvYWJicj48L3A+CisKKzxwPm5vIGFiYnJldiBoZXJlIGJlY2F1c2UgdGhlcmUgaXMgc29tZW9uZSBhbmQga3VsaXMgc29tZTwvcD4KKworPHVsPgorICA8bGk+PGFiYnIgdGl0bGU9IihlWHRlbnNpYmxlKSBIeXBlclRleHQgTWFya3VwIExhbmd1YWdlIj4oWClIVE1MPC9hYmJyPiB0ZXN0PC9saT4KKyAgPGxpPmxpbmUgdHdvPC9saT4KKzwvdWw+CisKKzxwPjxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWGh0bWwiPjxhYmJyIHRpdGxlPSIoZVh0ZW5zaWJsZSkgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSI+KFgpSFRNTDwvYWJicj48L2E+PC9wPgorCis8dWw+CisgIDxsaT50ZXN0IDxhYmJyIHRpdGxlPSIoZVh0ZW5zaWJsZSkgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSI+KFgpSFRNTDwvYWJicj48L2xpPgorPC91bD4KKworPHA+VGhpcyBpcyA8YWJiciBjbGFzcz0idGVzdGl0IHRlc3QiIHRpdGxlPSJTb21lIHRleHQgaGVyZSI+YXdlc29tZTwvYWJicj4uPC9wPgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9hYmJyZXZpYXRpb25zL2FiYnJldi50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vYWJicmV2aWF0aW9ucy9hYmJyZXYudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWE4MTAwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vYWJicmV2aWF0aW9ucy9hYmJyZXYudGV4dApAQCAtMCwwICsxLDM0IEBACitUaGlzIGlzIHNvbWUgdGV4dC4KKworKltpcyBzb21lXTogWWVzIGl0IGlzICAKKypbT3RIZVIhXTogVGhpcyAmIHRoYXQKKworKltpcyBzb21lXTogSXQgaXMsIHllcyAgCisqW2VtcHR5XToKKworVGhlcmUgKmlzIHNvbWUgcmVhbCogY29uY2VybiBhYm91dCBPdEhlUiEKKworaXMgc29tZSBUaGluayBlbXB0eSBhYm91dCBPZXN0ZXJyZWljaC4gQ1NTIHVuZCBDU1MzCisKK25vIGFiYnJldiBoZXJlIGJlY2F1c2UgdGhlcmUgaXMgc29tZW9uZSBhbmQga3VsaXMgc29tZQorCisqW09lc3RlcnJlaWNoXTogCVZlcnkgbmljZSBjb3VudHJ5CQorCisqW0NTU106IENhc2NhZGluZworKltDU1MzXTogQ2FzY2FkaW5nIDMKKworKiAoWClIVE1MIHRlc3QgCisqIGxpbmUgdHdvCisKK1soWClIVE1MXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hodG1sKQorCisqIHRlc3QgKFgpSFRNTAorCisqWyhYKUhUTUxdOiAoZVh0ZW5zaWJsZSkgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZQorCisKK1RoaXMgaXMgYXdlc29tZS4KKworezoudGVzdGl0fQorKlthd2Vzb21lXTogU29tZSB0ZXh0IGhlcmUKK3s6LnRlc3R9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9hYmJyZXZpYXRpb25zL2FiYnJldl9kZWZzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9hYmJyZXZpYXRpb25zL2FiYnJldl9kZWZzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4ZmNmYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2FiYnJldmlhdGlvbnMvYWJicmV2X2RlZnMuaHRtbApAQCAtMCwwICsxLDIgQEAKKzxwcmU+PGNvZGU+Kls0XTogbm9hYmJyZXYKKzwvY29kZT48L3ByZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2FiYnJldmlhdGlvbnMvYWJicmV2X2RlZnMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2FiYnJldmlhdGlvbnMvYWJicmV2X2RlZnMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjNhMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vYWJicmV2aWF0aW9ucy9hYmJyZXZfZGVmcy50ZXh0CkBAIC0wLDAgKzEsNSBAQAorKltBQkJSXTogU29tZSBhYmJyZXZpYXRpb25zICAgCisgKltvbmUgYWJicl06IG9uZSBhYmJyZXYKKyAgKlsyIGFuZCBvdGhlcl06IGFub3RoZXIKKyAgICpbM106IHlldCBhbm90aGVyIAorICAgICpbNF06IG5vYWJicmV2CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9hdXRvbGlua3MvdXJsX2xpbmtzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9hdXRvbGlua3MvdXJsX2xpbmtzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlYWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2F1dG9saW5rcy91cmxfbGlua3MuaHRtbApAQCAtMCwwICsxLDE1IEBACis8cD5UaGlzIHNob3VsZCBiZSBhIDxhIGhyZWY9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIj5odHRwOi8vd3d3LmV4YW1wbGUuY29tLzwvYT4gbGluay4KK1RoaXMgc2hvdWxkIGJlIGEgPGEgaHJlZj0ibWFpbHRvOmpvaG4uZG9lQGV4YW1wbGUuY29tIj5qb2huLmRvZUBleGFtcGxlLmNvbTwvYT4gbGluay4KK0FzIHNob3VsZCA8YSBocmVmPSJtYWlsdG86am9obi5kb2VAZXhhbXBsZS5jb20iPmpvaG4uZG9lQGV4YW1wbGUuY29tPC9hPiB0aGlzLgorQXMgc2hvdWxkIDxhIGhyZWY9Im1haWx0bzpqb2huX2RvZUBleGFtcGxlLmNvbSI+am9obl9kb2VAZXhhbXBsZS5jb208L2E+IHRoaXMuCitBcyBzaG91bGQgPGEgaHJlZj0ibWFpbHRvOkNTU0BleGFtcGxlLmNvbSI+PGFiYnIgdGl0bGU9IkNhc2NhZGluZyI+Q1NTPC9hYmJyPkBleGFtcGxlLmNvbTwvYT4gdGhpcy4KK0Fub3RoZXIgYW1wZXJzYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vP2RvaXQmYW1wO3g9eSI+aHR0cDovL3d3dy5leGFtcGxlLmNvbS8/ZG9pdCZhbXA7eD15PC9hPiBsaW5rLgorTW9yZSBlbnRpdGllcyAgPGEgaHJlZj0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS8/ZG9pdCZhbXA7eD0mcXVvdDt5JmFtcDt6PXkiPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vP2RvaXQmYW1wO3g9JnF1b3Q7eSZhbXA7ej15PC9hPi48L3A+CisKKzxwPkVtYWlsIGludGVybmF0aW9uYWwgPGEgaHJlZj0ibWFpbHRvOsO8YnVuZ0BtYWNodC5kZW4ubWVpc3Rlci5kZSI+w7xidW5nQG1hY2h0LmRlbi5tZWlzdGVyLmRlPC9hPiwgPGEgaHJlZj0ibWFpbHRvOsO8LsOkw59AaMO8bHNlLmRlIj7DvC7DpMOfQGjDvGxzZS5kZTwvYT4KK0VtYWlsIGludmFsaWQ6ICZsdDs8YSBocmVmPSJtYWlsdG9zOm1lQGV4YW1wbGUuY29tIj5tZUBleGFtcGxlLmNvbTwvYT4mZ3Q7PC9wPgorCis8cD5BdXRvbGluayB3aXRoIHVuZGVyc2NvcmU6IDxhIGhyZWY9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vd2l0aF91bmRlcl9zY29yZSI+aHR0cDovL3d3dy5leGFtcGxlLmNvbS93aXRoX3VuZGVyX3Njb3JlPC9hPjwvcD4KKworPHA+PGEgaHJlZj0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iPmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vPC9hPjwvcD4KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vYXV0b2xpbmtzL3VybF9saW5rcy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vYXV0b2xpbmtzL3VybF9saW5rcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2U4YWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9hdXRvbGlua3MvdXJsX2xpbmtzLnRleHQKQEAgLTAsMCArMSwxNiBAQAorVGhpcyBzaG91bGQgYmUgYSA8aHR0cDovL3d3dy5leGFtcGxlLmNvbS8+IGxpbmsuCitUaGlzIHNob3VsZCBiZSBhIDxtYWlsdG86am9obi5kb2VAZXhhbXBsZS5jb20+IGxpbmsuCitBcyBzaG91bGQgPGpvaG4uZG9lQGV4YW1wbGUuY29tPiB0aGlzLgorQXMgc2hvdWxkIDxqb2huX2RvZUBleGFtcGxlLmNvbT4gdGhpcy4KK0FzIHNob3VsZCA8Q1NTQGV4YW1wbGUuY29tPiB0aGlzLgorQW5vdGhlciBhbXBlcnNhbmQgPGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vP2RvaXQmeD15PiBsaW5rLgorTW9yZSBlbnRpdGllcyAgPGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vP2RvaXQmYW1wO3g9JnF1b3Q7eSZ6PXk+LgorCitFbWFpbCBpbnRlcm5hdGlvbmFsIDzDvGJ1bmdAbWFjaHQuZGVuLm1laXN0ZXIuZGU+LCA8w7wuw6TDn0Bow7xsc2UuZGU+CitFbWFpbCBpbnZhbGlkOiA8W21lQGV4YW1wbGUuY29tXShtYWlsdG9zOm1lQGV4YW1wbGUuY29tKT4KKworQXV0b2xpbmsgd2l0aCB1bmRlcnNjb3JlOiA8aHR0cDovL3d3dy5leGFtcGxlLmNvbS93aXRoX3VuZGVyX3Njb3JlPgorCis8aHR0cDovL3d3dy5leGFtcGxlLmNvbS8+CisKKypbQ1NTXTogQ2FzY2FkaW5nCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9lc2NhcGVkX2NoYXJzL25vcm1hbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXNjYXBlZF9jaGFycy9ub3JtYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTVkNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXNjYXBlZF9jaGFycy9ub3JtYWwuaHRtbApAQCAtMCwwICsxLDQ3IEBACis8cD5cPC9wPgorCis8cD4uPC9wPgorCis8cD4qPC9wPgorCis8cD5fPC9wPgorCis8cD4rPC9wPgorCis8cD4tPC9wPgorCis8cD5gPC9wPgorCis8cD4oPC9wPgorCis8cD4pPC9wPgorCis8cD5bPC9wPgorCis8cD5dPC9wPgorCis8cD57PC9wPgorCis8cD59PC9wPgorCis8cD4jPC9wPgorCis8cD4hPC9wPgorCis8cD4mbHQ7Jmx0OzwvcD4KKworPHA+Jmd0OyZndDs8L3A+CisKKzxwPjo8L3A+CisKKzxwPnw8L3A+CisKKzxwPiI8L3A+CisKKzxwPic8L3A+CisKKzxwPj08L3A+CisKKzxwPiZndDs8L3A+CisKKzxwPiZsdDs8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9lc2NhcGVkX2NoYXJzL25vcm1hbC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXNjYXBlZF9jaGFycy9ub3JtYWwudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQ3MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXNjYXBlZF9jaGFycy9ub3JtYWwudGV4dApAQCAtMCwwICsxLDQ3IEBACitcXAorCitcLgorCitcKgorCitcXworCitcKworCitcLQorCitcYAorCitcKAorCitcKQorCitcWworCitcXQorCitceworCitcfQorCitcIworCitcIQorCitcPDwKKworXD4+CisKK1w6CisKK1x8CisKK1wiCisKK1wnCisKK1w9CisKK1w+CisKK1w8CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vY29tbWVudC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL2NvbW1lbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ0ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL2NvbW1lbnQuaHRtbApAQCAtMCwwICsxLDYgQEAKKzxwPlRoaXMgaXMgYSA8IS0tIHNpbXBsZSAtLT4gcGFyYWdyYXBoLgorVGhpcyBpcyBhIDwhLS0gc2ltcGxlIC0tPiBwYXJhZ3JhcGguCitUaGlzIGlzIGEgPCEtLSBzaW1wbGUgezovb3RoZXJ9IHBhcmFncmFwaCAtLT4uCitUaGlzIGlzIGEgIHBhcmFncmFwaC4KK1RoaXMgaXMgYSB7Oi9jb21tZW50fSBzaW1wbGUgezovfSBwYXJhZ3JhcGguCitUaGlzIGlzIGEgezo6Y29tbWVudH0gcGFyYWdyYXBoLjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2V4dGVuc2lvbi9jb21tZW50LnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vY29tbWVudC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWU4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vY29tbWVudC50ZXh0CkBAIC0wLDAgKzEsNiBAQAorVGhpcyBpcyBhIHs6OmNvbW1lbnR9c2ltcGxlezovfSBwYXJhZ3JhcGguCitUaGlzIGlzIGEgezo6Y29tbWVudH1zaW1wbGV7Oi9jb21tZW50fSBwYXJhZ3JhcGguCitUaGlzIGlzIGEgezo6Y29tbWVudH1zaW1wbGUgezovb3RoZXJ9IHBhcmFncmFwaHs6L2NvbW1lbnR9LgorVGhpcyBpcyBhIHs6OmNvbW1lbnQvfSBwYXJhZ3JhcGguCitUaGlzIGlzIGEgezovY29tbWVudH0gc2ltcGxlIHs6L30gcGFyYWdyYXBoLgorVGhpcyBpcyBhIHs6OmNvbW1lbnR9IHBhcmFncmFwaC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2V4dGVuc2lvbi9pZ25vcmVkLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vaWdub3JlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzJjNDAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vaWdub3JlZC5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPlRoaXMgaXMgezo6c29tZXRoaW5nfXBhcmFncmFwaHs6L308L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vaWdub3JlZC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL2lnbm9yZWQudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2U3NzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL2lnbm9yZWQudGV4dApAQCAtMCwwICsxIEBACitUaGlzIGlzIHs6OnNvbWV0aGluZ31wYXJhZ3JhcGh7Oi99CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vbm9tYXJrZG93bi5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL25vbWFya2Rvd24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RlOTMxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL25vbWFya2Rvd24uaHRtbApAQCAtMCwwICsxIEBACis8cD5UaGlzIGlzICpzb21lKiB0ZXh0LjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2V4dGVuc2lvbi9ub21hcmtkb3duLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vbm9tYXJrZG93bi50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YzRiMzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vbm9tYXJrZG93bi50ZXh0CkBAIC0wLDAgKzEgQEAKK1RoaXMgaXMgezo6bm9tYXJrZG93bn0qc29tZSp7Oi99IHRleHQuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vb3B0aW9ucy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL29wdGlvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGUzMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL29wdGlvbnMuaHRtbApAQCAtMCwwICsxIEBACis8cD5UaGlzIGlzIGFuICBvcHRpb24gPHNwYW4+KnRydWUqPC9zcGFuPiE8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9leHRlbnNpb24vb3B0aW9ucy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL29wdGlvbnMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjg5NDkxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vZXh0ZW5zaW9uL29wdGlvbnMudGV4dApAQCAtMCwwICsxIEBACitUaGlzIGlzIGFuIHs6Om9wdGlvbnMgcGFyc2Vfc3Bhbl9odG1sPSJmYWxzZSIgL30gb3B0aW9uIDxzcGFuPip0cnVlKjwvc3Bhbj4hCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9pYWwvc2ltcGxlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9pYWwvc2ltcGxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmM2E0NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2lhbC9zaW1wbGUuaHRtbApAQCAtMCwwICsxLDYgQEAKKzxwPlRoaXMgaXMgYSA8Y29kZSBjbGFzcz0iaHVuZCIgaWQ9ImRvZyI+c3BhbjwvY29kZT4uPC9wPgorCis8cD5UaGlzIGlzIGEgPGNvZGUgY2xhc3M9Imh1bmQga2F0eiIgaWQ9ImRvZyIga2V5PSJ2YWwiPnNwYW48L2NvZGU+LjwvcD4KKworPHA+VGhpcyBpcyBhbns6IC5pZ25vcmVkfSBzcGFuIGlhbC4KK1RoaXMgaXMgYW57OiAuZXNjYXBlZH0gc3BhbiBpYWwuPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vaWFsL3NpbXBsZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vaWFsL3NpbXBsZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDU2MDIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9pYWwvc2ltcGxlLnRleHQKQEAgLTAsMCArMSw2IEBACitUaGlzIGlzIGEgYHNwYW5gezogLmh1bmQgI2RvZ30uCisKK1RoaXMgaXMgYSBgc3BhbmB7OiAuaHVuZCAjZG9nfXs6IC5rYXR6IGtleT0ndmFsJ30uCisKK1RoaXMgaXMgYW57OiAuaWdub3JlZH0gc3BhbiBpYWwuCitUaGlzIGlzIGFuXHs6IC5lc2NhcGVkfSBzcGFuIGlhbC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2xpbmVfYnJlYWtzL25vcm1hbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbGluZV9icmVha3Mvbm9ybWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNjZhNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL2xpbmVfYnJlYWtzL25vcm1hbC5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxwPlRoaXMgaXMgYSBsaW5lPGJyIC8+Cit3aXRoIGEgbGluZSBicmVhay48L3A+CisKKzxwPlRoaXMgaXMgYSBsaW5lIAord2l0aG91dCBhIGxpbmUgYnJlYWsuPC9wPgorCis8cD5UaGlzIGlzIGEgbGluZSA8YnIgLz4KK3dpdGggYSBsaW5lXCA8YnIgLz4KK2JyZWFrLjwvcD4KKworPHA+TGluZSBicmVhayBvbiBsYXN0IGxpbmUuPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbGluZV9icmVha3Mvbm9ybWFsLmxhdGV4IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbGluZV9icmVha3Mvbm9ybWFsLmxhdGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmZmNTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9saW5lX2JyZWFrcy9ub3JtYWwubGF0ZXgKQEAgLTAsMCArMSwxMiBAQAorVGhpcyBpcyBhIGxpbmVcbmV3bGluZQord2l0aCBhIGxpbmUgYnJlYWsuCisKK1RoaXMgaXMgYSBsaW5lIAord2l0aG91dCBhIGxpbmUgYnJlYWsuCisKK1RoaXMgaXMgYSBsaW5lIFxuZXdsaW5lCit3aXRoIGEgbGluZVx0ZXh0YmFja3NsYXNoe30gXG5ld2xpbmUKK2JyZWFrLgorCitMaW5lIGJyZWFrIG9uIGxhc3QgbGluZS4KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbGluZV9icmVha3Mvbm9ybWFsLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9saW5lX2JyZWFrcy9ub3JtYWwudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmY4NjZmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbGluZV9icmVha3Mvbm9ybWFsLnRleHQKQEAgLTAsMCArMSwxMSBAQAorVGhpcyBpcyBhIGxpbmUgIAord2l0aCBhIGxpbmUgYnJlYWsuICAKKworVGhpcyBpcyBhIGxpbmUgCit3aXRob3V0IGEgbGluZSBicmVhay4KKworVGhpcyBpcyBhIGxpbmUgXFwKK3dpdGggYSBsaW5lXFwgICAKK2JyZWFrLgorCitMaW5lIGJyZWFrIG9uIGxhc3QgbGluZS4gIApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9pdGV4Mm1tbC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9pdGV4Mm1tbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTk1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL2l0ZXgybW1sLmh0bWwKQEAgLTAsMCArMSBAQAorPHA+VGhpcyBpcyA8bWF0aCB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcgZGlzcGxheT0naW5saW5lJz48c2VtYW50aWNzPjxtcm93PjxtaT5mPC9taT48bW8gc3RyZXRjaHk9ImZhbHNlIj4oPC9tbz48bWk+eDwvbWk+PG1vIHN0cmV0Y2h5PSJmYWxzZSI+KTwvbW8+PG1vPj08L21vPjxtaT5hPC9taT48bXJvdz48bXN1cD48bWk+eDwvbWk+IDxtbj4zPC9tbj48L21zdXA+PC9tcm93Pjxtbz4rPC9tbz48bWk+YjwvbWk+PG1yb3c+PG1zdXA+PG1pPng8L21pPiA8bW4+MjwvbW4+PC9tc3VwPjwvbXJvdz48bW8+KzwvbW8+PG1pPmN4PC9taT48bW8+KzwvbW8+PG1pPmQ8L21pPjwvbXJvdz48YW5ub3RhdGlvbiBlbmNvZGluZz0nYXBwbGljYXRpb24veC10ZXgnPmYoeCkgPSBhe3heM30gKyBie3heMn0gKyBjeCArIGQ8L2Fubm90YXRpb24+PC9zZW1hbnRpY3M+PC9tYXRoPiBzb21ldGhpbmchPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9pdGV4Mm1tbC5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9pdGV4Mm1tbC5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2JkYWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL2l0ZXgybW1sLm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOm1hdGhfZW5naW5lOiBpdGV4Mm1tbApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9pdGV4Mm1tbC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9pdGV4Mm1tbC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjBiNTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL2l0ZXgybW1sLnRleHQKQEAgLTAsMCArMSBAQAorVGhpcyBpcyAkJGYoeCkgPSBhe3heM30gKyBie3heMn0gKyBjeCArIGQkJCBzb21ldGhpbmchCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL21hdGhqYXhub2RlLmh0bWwuMTkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL21hdGhqYXhub2RlLmh0bWwuMTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhM2E2OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvbWF0aGpheG5vZGUuaHRtbC4xOQpAQCAtMCwwICsxLDI3IEBACis8cD5UaGlzIGlzIDxtYXRoIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIj4KKyAgPG1pPmY8L21pPgorICA8bW8gc3RyZXRjaHk9ImZhbHNlIj4oPC9tbz4KKyAgPG1pPng8L21pPgorICA8bW8gc3RyZXRjaHk9ImZhbHNlIj4pPC9tbz4KKyAgPG1vPj08L21vPgorICA8bWk+YTwvbWk+CisgIDxtcm93IGNsYXNzPSJNSlgtVGVYQXRvbS1PUkQiPgorICAgIDxtc3VwPgorICAgICAgPG1pPng8L21pPgorICAgICAgPG1uPjM8L21uPgorICAgIDwvbXN1cD4KKyAgPC9tcm93PgorICA8bW8+KzwvbW8+CisgIDxtaT5iPC9taT4KKyAgPG1yb3cgY2xhc3M9Ik1KWC1UZVhBdG9tLU9SRCI+CisgICAgPG1zdXA+CisgICAgICA8bWk+eDwvbWk+CisgICAgICA8bW4+MjwvbW4+CisgICAgPC9tc3VwPgorICA8L21yb3c+CisgIDxtbz4rPC9tbz4KKyAgPG1pPmM8L21pPgorICA8bWk+eDwvbWk+CisgIDxtbz4rPC9tbz4KKyAgPG1pPmQ8L21pPgorPC9tYXRoPiBzb21ldGhpbmchPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9tYXRoamF4bm9kZS5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9tYXRoamF4bm9kZS5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzI3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL21hdGhqYXhub2RlLm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOm1hdGhfZW5naW5lOiBtYXRoamF4bm9kZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9tYXRoamF4bm9kZS50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9tYXRoamF4bm9kZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjBiNTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL21hdGhqYXhub2RlLnRleHQKQEAgLTAsMCArMSBAQAorVGhpcyBpcyAkJGYoeCkgPSBhe3heM30gKyBie3heMn0gKyBjeCArIGQkJCBzb21ldGhpbmchCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL25vX2VuZ2luZS5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9ub19lbmdpbmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjkzYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9ub19lbmdpbmUuaHRtbApAQCAtMCwwICsxIEBACis8cD48c3BhbiBjbGFzcz0ia2RtYXRoIj4kNSs1JDwvc3Bhbj4gaW5saW5lIG1hdGg8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL25vX2VuZ2luZS5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9ub19lbmdpbmUub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ1NTllCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9ub19lbmdpbmUub3B0aW9ucwpAQCAtMCwwICsxIEBACis6bWF0aF9lbmdpbmU6IH4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvbm9fZW5naW5lLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL25vX2VuZ2luZS50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMmY5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL25vX2VuZ2luZS50ZXh0CkBAIC0wLDAgKzEgQEAKKyQkNSs1JCQgaW5saW5lIG1hdGgKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvbm9ybWFsLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL25vcm1hbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTEzMGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi9tYXRoL25vcm1hbC5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxwPlRoaXMgaXMgPHNjcmlwdCB0eXBlPSJtYXRoL3RleCI+XGxhbWJkYV9cYWxwaGEgPiA1PC9zY3JpcHQ+IHNvbWUgbWF0aC4gV2l0aCA8c2NyaXB0IHR5cGU9Im1hdGgvdGV4Ij4xCisrIDE8L3NjcmlwdD4gbmV3IGxpbmUgY2hhcmFjdGVycyBpbiBiZXR3ZWVuLjwvcD4KKworPHA+PHNjcmlwdCB0eXBlPSJtYXRoL3RleCI+NSs1PC9zY3JpcHQ+IGlubGluZSBtYXRoLCAkNS4wMCAkJG5vIG1hdGgkJDwvcD4KKworPHA+JCQ1KzUkJCBpbmxpbmUgbWF0aDwvcD4KKworPHA+PHNjcmlwdCB0eXBlPSJtYXRoL3RleCI+NSs1PC9zY3JpcHQ+PC9wPgorCis8cD4kJDUrNSQkPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9ub3JtYWwudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvbm9ybWFsLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3YTAwNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvbm9ybWFsLnRleHQKQEAgLTAsMCArMSwxMCBAQAorVGhpcyBpcyAkJFxsYW1iZGFfXGFscGhhID4gNSQkIHNvbWUgbWF0aC4gV2l0aCAkJDEKKysgMSQkIG5ldyBsaW5lIGNoYXJhY3RlcnMgaW4gYmV0d2Vlbi4KKworJCQ1KzUkJCBpbmxpbmUgbWF0aCwgJDUuMDAgXCQkbm8gbWF0aCQkCisKK1wkXCQ1KzUkJCBpbmxpbmUgbWF0aAorCitcJCQ1KzUkJAorCitcJFwkNSs1JCQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvcml0ZXguaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvcml0ZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJhOGZlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9yaXRleC5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPlRoaXMgaXMgPG1hdGggeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiIGRpc3BsYXk9ImlubGluZSI+PG1pPmY8L21pPjxtbyBzdHJldGNoeT0nZmFsc2UnPig8L21vPjxtaT54PC9taT48bW8gc3RyZXRjaHk9J2ZhbHNlJz4pPC9tbz48bW8+PTwvbW8+PG1pPmE8L21pPjxtcm93Pjxtc3VwPjxtaT54PC9taT48bW4+MzwvbW4+PC9tc3VwPjwvbXJvdz48bW8+KzwvbW8+PG1pPmI8L21pPjxtcm93Pjxtc3VwPjxtaT54PC9taT48bW4+MjwvbW4+PC9tc3VwPjwvbXJvdz48bW8+KzwvbW8+PG1pPmM8L21pPjxtaT54PC9taT48bW8+KzwvbW8+PG1pPmQ8L21pPjwvbWF0aD4gc29tZXRoaW5nITwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvcml0ZXgub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvcml0ZXgub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY1NGViCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9yaXRleC5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzptYXRoX2VuZ2luZTogcml0ZXgKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvcml0ZXgudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL21hdGgvcml0ZXgudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTIwYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vbWF0aC9yaXRleC50ZXh0CkBAIC0wLDAgKzEgQEAKK1RoaXMgaXMgJCRmKHgpID0gYXt4XjN9ICsgYnt4XjJ9ICsgY3ggKyBkJCQgc29tZXRoaW5nIQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIzYjVjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzLmh0bWwKQEAgLTAsMCArMSw2IEBACis8cD5UaGlzIGlzIHRoZSBBJmFtcDtPLiAmY29weTsgMjAwOCBieSBtZQorQXMgd2VsbCBcJmFtcDsgYXMgdGhpcy4gU29tZSAmIzM0Mzsgb3RoZXIKK3ZhbHVlcyBtYXkgJiN4QUY7IG1heSBhbHNvIHNob3cgYnV0Citub3Qgc3QuIGxpa2UgJmFtcDsjeFlaOy48L3A+CisKKzxwPlRoaXMgaXMgQlMmYW1wO1Q7IGRvbmUhPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXMub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZjNTYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzLm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOmVudGl0eV9vdXRwdXQ6IDphc19pbnB1dApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXMudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQ2ZjRjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzLnRleHQKQEAgLTAsMCArMSw2IEBACitUaGlzIGlzIHRoZSBBJk8uICZjb3B5OyAyMDA4IGJ5IG1lCitBcyB3ZWxsIFwmIGFzIHRoaXMuIFNvbWUgJiMzNDM7IG90aGVyCit2YWx1ZXMgbWF5ICYjeEFGOyBtYXkgYWxzbyBzaG93IGJ1dAorbm90IHN0LiBsaWtlICYjeFlaOy4KKworVGhpcyBpcyBCUyZUOyBkb25lIQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX2FzX2NoYXIuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19jaGFyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwN2Y3NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19jaGFyLmh0bWwKQEAgLTAsMCArMSBAQAorPHA+VGhpcyAmcXVvdDtpcyZxdW90OyAmIzM5O3RoZSYjMzk7IEEmYW1wO08uICZjb3B5OyAyMDA4IGJ5IG1lICYjMzQzOyBhbmQgJiN4M2JiOzwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19jaGFyLmh0bWwuMTkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfYXNfY2hhci5odG1sLjE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjgxN2IKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfYXNfY2hhci5odG1sLjE5CkBAIC0wLDAgKzEgQEAKKzxwPlRoaXMgImlzIiAndGhlJyBBJmFtcDtPLiDCqSAyMDA4IGJ5IG1lIMWXIGFuZCDOuzwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19jaGFyLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfYXNfY2hhci5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYTc1MWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfYXNfY2hhci5vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorOmVudGl0eV9vdXRwdXQ6IDphc19jaGFyCis6c21hcnRfcXVvdGVzOiBhcG9zLGFwb3MscXVvdCxxdW90CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfYXNfY2hhci50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX2FzX2NoYXIudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzliNTExCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX2FzX2NoYXIudGV4dApAQCAtMCwwICsxIEBACitUaGlzICJpcyIgJ3RoZScgQSZPLiAmY29weTsgMjAwOCBieSBtZSAmIzM0MzsgYW5kICYjeDNiYjsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19pbnB1dC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX2FzX2lucHV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlZWM5ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19pbnB1dC5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPlRoaXMgaXMgdGhlIEEmYW1wO08uICZjb3B5OyAyMDA4IGJ5IG1lICYjMzQzOyBhbmQgJiN4M2JiOzwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19pbnB1dC5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX2FzX2lucHV0Lm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2YzU2MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19pbnB1dC5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzplbnRpdHlfb3V0cHV0OiA6YXNfaW5wdXQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19pbnB1dC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX2FzX2lucHV0LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkZjdjZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19hc19pbnB1dC50ZXh0CkBAIC0wLDAgKzEgQEAKK1RoaXMgaXMgdGhlIEEmTy4gJmNvcHk7IDIwMDggYnkgbWUgJiMzNDM7IGFuZCAmI3gzYmI7CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfbnVtZXJpYy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX251bWVyaWMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ2MTNlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX251bWVyaWMuaHRtbApAQCAtMCwwICsxIEBACis8cD5UaGlzIGlzIHRoZSBBJmFtcDtPLiAmIzE2OTsgMjAwOCBieSBtZSAmIzM0MzsgYW5kICYjOTU1OzwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19udW1lcmljLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfbnVtZXJpYy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmUwYTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfbnVtZXJpYy5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzplbnRpdHlfb3V0cHV0OiA6bnVtZXJpYwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX251bWVyaWMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19udW1lcmljLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkZjdjZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19udW1lcmljLnRleHQKQEAgLTAsMCArMSBAQAorVGhpcyBpcyB0aGUgQSZPLiAmY29weTsgMjAwOCBieSBtZSAmIzM0MzsgYW5kICYjeDNiYjsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19zeW1ib2xpYy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2VudGl0aWVzX3N5bWJvbGljLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4YmExNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19zeW1ib2xpYy5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPlRoaXMgaXMgdGhlIEEmYW1wO08uICZjb3B5OyAyMDA4IGJ5IG1lICYjMzQzOyBhbmQgJmxhbWJkYTs8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfc3ltYm9saWMub3B0aW9ucyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19zeW1ib2xpYy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTU3ODUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfc3ltYm9saWMub3B0aW9ucwpAQCAtMCwwICsxIEBACis6ZW50aXR5X291dHB1dDogOnN5bWJvbGljCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfc3ltYm9saWMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9lbnRpdGllc19zeW1ib2xpYy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZGY3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZW50aXRpZXNfc3ltYm9saWMudGV4dApAQCAtMCwwICsxIEBACitUaGlzIGlzIHRoZSBBJk8uICZjb3B5OyAyMDA4IGJ5IG1lICYjMzQzOyBhbmQgJiN4M2JiOwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2dyZWF0ZXJ0aGFuLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZ3JlYXRlcnRoYW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2NlNGNjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2dyZWF0ZXJ0aGFuLmh0bWwKQEAgLTAsMCArMSBAQAorPHA+MiAmZ3Q7IDEgJmd0OyAwPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2dyZWF0ZXJ0aGFuLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvZ3JlYXRlcnRoYW4udGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGZiN2YxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL2dyZWF0ZXJ0aGFuLnRleHQKQEAgLTAsMCArMSBAQAorMiA+IDEgPiAwCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvbG93ZXJ0aGFuLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvbG93ZXJ0aGFuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViYWMyMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9sb3dlcnRoYW4uaHRtbApAQCAtMCwwICsxIEBACis8cD4wICZsdDsgMSAmbHQ7IDI8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvbG93ZXJ0aGFuLnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvbG93ZXJ0aGFuLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZGY4YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy9sb3dlcnRoYW4udGV4dApAQCAtMCwwICsxIEBACiswIDwgMSA8IDIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy90eXBvZ3JhcGh5Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvdHlwb2dyYXBoeS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDFkYmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvdHlwb2dyYXBoeS5odG1sCkBAIC0wLDAgKzEsNDAgQEAKKzxwPlRoaXMgaXMmaGVsbGlwOyBzb21ldGhpbmcmbWRhc2g7dGhpcyB0b28mbmRhc2g7ITwvcD4KKworPHA+VGhpcyAmbGFxdW87aXMmcmFxdW87IHNvbWUgdGV4dCwgJmxhcXVvOyZuYnNwO3RoaXMmbmJzcDsmcmFxdW87IHRvbyE8L3A+CisKKzxwPiZsZHF1bztGYW5jeSBxdW90ZXMmcmRxdW87IGFyZSAmbHNxdW87Y29vbCZyc3F1bzssIGV2ZW4gaW4gdGhlICZyc3F1bzs4MHMhCitKZSB0JnJzcXVvOyBhaW1lLiBZb3UmcnNxdW87cmUgYSBmdW5ueSBvbmUhIFRob21hcyZyc3F1bzsgbmFtZQorTWFyayZyc3F1bztzIG5hbWUuICZsZHF1bzsmaGVsbGlwO3lvdSZyZHF1bzsKKyZsZHF1bzsmbHNxdW87TmVzdGVkJnJzcXVvOyBxdW90ZXMgYXJlICZsc3F1bztwb3NzaWJsZSZyc3F1bzsmcmRxdW87LCB0b28hCismbHNxdW87JmxkcXVvO090aGVyd2F5JnJkcXVvOyBpcyAmbGRxdW87cm91bmQmcmRxdW87JnJzcXVvOyE8L3A+CisKKzxwPiZsc3F1bztPcGVuaW5nIG5vdyEmcnNxdW87PC9wPgorCis8cD4mcnNxdW87ODBzIGFyZSByZWFsbHkgY29vbC48L3A+CisKKzxwPjxlbT5DbHVzdGVyPC9lbT4mcnNxdW87cyBMYXN0IFN0YW5kLjwvcD4KKworPHA+TmFtIGxpYmVyIHRlbXBvcgorJmxkcXVvOyZoZWxsaXA7QXQgdmVybyBlb3MgZXQgYWNjdXNhbSZyZHF1bzs8L3A+CisKKzxwPiZsZHF1bzs8ZW0+U2luZ2xlIHVuZGVyc2NvcmVzPC9lbT4gc2hvdWxkIHdvcmsuJnJkcXVvOzwvcD4KKworPHA+JmxkcXVvOzxlbT5TaW5nbGUgYXN0ZXJpc2tzPC9lbT4gc2hvdWxkIHdvcmsuJnJkcXVvOzwvcD4KKworPHA+JmxzcXVvOzxzdHJvbmc+RG91YmxlIHVuZGVyc2NvcmVzPC9zdHJvbmc+IHNob3VsZCB3b3JrLiZyc3F1bzs8L3A+CisKKzxwPiZsc3F1bzs8c3Ryb25nPkRvdWJsZSBhc3Rlcmlza3M8L3N0cm9uZz4gc2hvdWxkIHdvcmsuJnJzcXVvOzwvcD4KKworPHA+JmxkcXVvOzxlbT5IdXJyYWghPC9lbT4mcmRxdW87PC9wPgorCis8cD4mbHNxdW87PHN0cm9uZz5BYnNvbHV0ZWx5PC9zdHJvbmc+LiZyc3F1bzs8L3A+CisKKzxwPiZsZHF1bzsmaGVsbGlwO3NvbWUgVGV4dCZyZHF1bzs8L3A+CisKKzxwPiZsZHF1bzsmaGVsbGlwOyBzb21lIFRleHQmcmRxdW87PC9wPgorCis8cD5UaGlzOiAmbGRxdW87JmhlbGxpcDtzb21lIFRleHQmcmRxdW87PC9wPgorCis8cD5UaGlzOiAmbGRxdW87JmhlbGxpcDsgc29tZSBUZXh0JnJkcXVvOzwvcD4KKworPHA+JnJkcXVvO1tmb29dJnJkcXVvOyAmbGRxdW87W2Zvb10mcmRxdW87IGQgJmxkcXVvO1tmb29dJnJkcXVvOzwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy90eXBvZ3JhcGh5Lm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvdHlwb2dyYXBoeS5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMWMxN2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXMvc3Bhbi90ZXh0X3N1YnN0aXR1dGlvbnMvdHlwb2dyYXBoeS5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzplbnRpdHlfb3V0cHV0OiBzeW1ib2xpYwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzL3NwYW4vdGV4dF9zdWJzdGl0dXRpb25zL3R5cG9ncmFwaHkudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy90eXBvZ3JhcGh5LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMDkwZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlcy9zcGFuL3RleHRfc3Vic3RpdHV0aW9ucy90eXBvZ3JhcGh5LnRleHQKQEAgLTAsMCArMSw0MCBAQAorVGhpcyBpcy4uLiBzb21ldGhpbmctLS10aGlzIHRvby0tIQorCitUaGlzIDw8aXM+PiBzb21lIHRleHQsIDw8IHRoaXMgPj4gdG9vIQorCisiRmFuY3kgcXVvdGVzIiBhcmUgJ2Nvb2wnLCBldmVuIGluIHRoZSAnODBzIQorSmUgdCcgYWltZS4gWW91J3JlIGEgZnVubnkgb25lISBUaG9tYXMnIG5hbWUKK01hcmsncyBuYW1lLiAiLi4ueW91IgorIidOZXN0ZWQnIHF1b3RlcyBhcmUgJ3Bvc3NpYmxlJyIsIHRvbyEKKyciT3RoZXJ3YXkiIGlzICJyb3VuZCInIQorCisnT3BlbmluZyBub3chJworCisnODBzIGFyZSByZWFsbHkgY29vbC4KKworPGVtPkNsdXN0ZXI8L2VtPidzIExhc3QgU3RhbmQuCisKK05hbSBsaWJlciB0ZW1wb3IKKyIuLi5BdCB2ZXJvIGVvcyBldCBhY2N1c2FtIgorCisiX1NpbmdsZSB1bmRlcnNjb3Jlc18gc2hvdWxkIHdvcmsuIgorCisiKlNpbmdsZSBhc3Rlcmlza3MqIHNob3VsZCB3b3JrLiIKKworJ19fRG91YmxlIHVuZGVyc2NvcmVzX18gc2hvdWxkIHdvcmsuJworCisnKipEb3VibGUgYXN0ZXJpc2tzKiogc2hvdWxkIHdvcmsuJworCisiX0h1cnJhaCFfIgorCisnX19BYnNvbHV0ZWx5X18uJworCisiLi4uc29tZSBUZXh0IgorCisiLi4uIHNvbWUgVGV4dCIKKworVGhpczogIi4uLnNvbWUgVGV4dCIKKworVGhpczogIi4uLiBzb21lIFRleHQiCisKKyJcW2Zvb10iICJcW2Zvb10iIGQgIlxbZm9vXSIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vYXR4X2hlYWRlci5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9hdHhfaGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2ZDdhMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vYXR4X2hlYWRlci5odG1sCkBAIC0wLDAgKzEsMyBAQAorPGgxPmhlYWRlcjwvaDE+CisKKzxwPiNubyBoZWFkZXI8L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2F0eF9oZWFkZXIudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vYXR4X2hlYWRlci50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzBlMmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2F0eF9oZWFkZXIudGV4dApAQCAtMCwwICsxLDMgQEAKKyMgaGVhZGVyCisKKyNubyBoZWFkZXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vYmFja3RpY2tzX2Rpc2FibGVfaGlnaGxpZ2h0aW5nLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2JhY2t0aWNrc19kaXNhYmxlX2hpZ2hsaWdodGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTBkMDkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2JhY2t0aWNrc19kaXNhYmxlX2hpZ2hsaWdodGluZy5odG1sCkBAIC0wLDAgKzEsMiBAQAorPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtcnVieSI+S3JhbWRvd246OkRvY3VtZW50Lm5ldyh0ZXh0LCA6aW5wdXQgPSZndDsgJ0dGTScpCis8L2NvZGU+PC9wcmU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2JhY2t0aWNrc19kaXNhYmxlX2hpZ2hsaWdodGluZy5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9iYWNrdGlja3NfZGlzYWJsZV9oaWdobGlnaHRpbmcub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmU5YmMxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9iYWNrdGlja3NfZGlzYWJsZV9oaWdobGlnaHRpbmcub3B0aW9ucwpAQCAtMCwwICsxIEBACis6ZW5hYmxlX2NvZGVyYXk6IGZhbHNlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2JhY2t0aWNrc19kaXNhYmxlX2hpZ2hsaWdodGluZy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9iYWNrdGlja3NfZGlzYWJsZV9oaWdobGlnaHRpbmcudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGNmM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9iYWNrdGlja3NfZGlzYWJsZV9oaWdobGlnaHRpbmcudGV4dApAQCAtMCwwICsxLDMgQEAKK2BgYHJ1YnkKK0tyYW1kb3duOjpEb2N1bWVudC5uZXcodGV4dCwgOmlucHV0ID0+ICdHRk0nKQorYGBgCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2JhY2t0aWNrc19zeW50YXguaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vYmFja3RpY2tzX3N5bnRheC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTA3OWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2JhY2t0aWNrc19zeW50YXguaHRtbApAQCAtMCwwICsxLDIwIEBACis8cHJlPjxjb2RlPlRocmVlIGJhY2t0aWNrcworPC9jb2RlPjwvcHJlPgorCis8cHJlPjxjb2RlPkZvdXIgYmFja3RpY2tzCis8L2NvZGU+PC9wcmU+CisKKzxwcmU+PGNvZGU+VW5iYWxhbmNlZCBib3R0b20gaGVhdnkKKzwvY29kZT48L3ByZT4KKworPGRpdiBjbGFzcz0ibGFuZ3VhZ2UtcnVieSBoaWdobGlnaHRlci1jb2RlcmF5Ij48ZGl2IGNsYXNzPSJDb2RlUmF5Ij4KKyAgPGRpdiBjbGFzcz0iY29kZSI+PHByZT48c3BhbiBjbGFzcz0ibGluZS1udW1iZXJzIj48YSBocmVmPSIjbjEiIG5hbWU9Im4xIj4xPC9hPjwvc3Bhbj5sYW5ndWFnZSBubyBzcGFjZQorPC9wcmU+PC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYW5ndWFnZS1ydWJ5IGhpZ2hsaWdodGVyLWNvZGVyYXkiPjxkaXYgY2xhc3M9IkNvZGVSYXkiPgorICA8ZGl2IGNsYXNzPSJjb2RlIj48cHJlPjxzcGFuIGNsYXNzPSJsaW5lLW51bWJlcnMiPjxhIGhyZWY9IiNuMSIgbmFtZT0ibjEiPjE8L2E+PC9zcGFuPmxhbmd1YWdlIHdpdGggc3BhY2UKKzwvcHJlPjwvZGl2PgorPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vYmFja3RpY2tzX3N5bnRheC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9iYWNrdGlja3Nfc3ludGF4LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1YzYxMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vYmFja3RpY2tzX3N5bnRheC50ZXh0CkBAIC0wLDAgKzEsMTkgQEAKK2BgYAorVGhyZWUgYmFja3RpY2tzCitgYGAKKworYGBgYAorRm91ciBiYWNrdGlja3MKK2BgYGAKKworYGBgCitVbmJhbGFuY2VkIGJvdHRvbSBoZWF2eQorYGBgYGBgCisKK2BgYGBydWJ5CitsYW5ndWFnZSBubyBzcGFjZQorYGBgYAorCitgYGBgIHJ1YnkKK2xhbmd1YWdlIHdpdGggc3BhY2UKK2BgYGAKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vY29kZWJsb2NrX2ZlbmNlZC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9jb2RlYmxvY2tfZmVuY2VkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkZWZkYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vY29kZWJsb2NrX2ZlbmNlZC5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzxwPm5vcm1hbDwvcD4KKworPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtcnVieSI+cmVxdWlyZSAna3JhbWRvd24nCisKK0tyYW1kb3duOjpEb2N1bWVudC5uZXcodGV4dCkudG9faHRtbAorPC9jb2RlPjwvcHJlPgorCis8cD5pbmRlbnQgd2l0aCB0YWI8L3A+CisKKzxwcmU+PGNvZGU+YGBgcnVieQorcmVxdWlyZSAna3JhbWRvd24nCisKK0tyYW1kb3duOjpEb2N1bWVudC5uZXcodGV4dCkudG9faHRtbAorYGBgCis8L2NvZGU+PC9wcmU+CisKKzxwPmluZGVudCB3aXRoIDIgc3BhY2VzPC9wPgorCis8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS1qcyI+ICBjb25zb2xlLmxvZygiaGVsbG8iKTsKKzwvY29kZT48L3ByZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vY29kZWJsb2NrX2ZlbmNlZC5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9jb2RlYmxvY2tfZmVuY2VkLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlOWJjMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vY29kZWJsb2NrX2ZlbmNlZC5vcHRpb25zCkBAIC0wLDAgKzEgQEAKKzplbmFibGVfY29kZXJheTogZmFsc2UKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vY29kZWJsb2NrX2ZlbmNlZC50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9jb2RlYmxvY2tfZmVuY2VkLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzZTE5MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vY29kZWJsb2NrX2ZlbmNlZC50ZXh0CkBAIC0wLDAgKzEsMjEgQEAKK25vcm1hbAorCitgYGBydWJ5CityZXF1aXJlICdrcmFtZG93bicKKworS3JhbWRvd246OkRvY3VtZW50Lm5ldyh0ZXh0KS50b19odG1sCitgYGAKKworaW5kZW50IHdpdGggdGFiCisKKwlgYGBydWJ5CisJcmVxdWlyZSAna3JhbWRvd24nCisKKwlLcmFtZG93bjo6RG9jdW1lbnQubmV3KHRleHQpLnRvX2h0bWwKKwlgYGAKKworaW5kZW50IHdpdGggMiBzcGFjZXMKKworICBgYGBqcworICBjb25zb2xlLmxvZygiaGVsbG8iKTsKKyAgYGBgCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hhcmRfbGluZV9icmVha3MuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGFyZF9saW5lX2JyZWFrcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZmIyZjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hhcmRfbGluZV9icmVha3MuaHRtbApAQCAtMCwwICsxLDMgQEAKKzxwPm9uZTxiciAvPgorPGVtPnR3bzwvZW0+PGJyIC8+Cit0aHJlZTwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGFyZF9saW5lX2JyZWFrcy50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oYXJkX2xpbmVfYnJlYWtzLnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyODdiZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGFyZF9saW5lX2JyZWFrcy50ZXh0CkBAIC0wLDAgKzEsMyBAQAorb25lCitfdHdvXwordGhyZWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGFyZF9saW5lX2JyZWFrc19vZmYuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGFyZF9saW5lX2JyZWFrc19vZmYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWRiYTJiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oYXJkX2xpbmVfYnJlYWtzX29mZi5odG1sCkBAIC0wLDAgKzEsMiBAQAorPHA+VGhpcyBpcyBqdXN0IGEgbm9ybWFsIHBhcmFncmFwaC48YnIgLz4KK0NvbnRhaW5pbmcgYSBtYW51YWwgbGluZSBicmVhayBhYm92ZS48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hhcmRfbGluZV9icmVha3Nfb2ZmLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hhcmRfbGluZV9icmVha3Nfb2ZmLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkYTY4MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGFyZF9saW5lX2JyZWFrc19vZmYub3B0aW9ucwpAQCAtMCwwICsxIEBACis6aGFyZF93cmFwOiBmYWxzZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oYXJkX2xpbmVfYnJlYWtzX29mZi50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oYXJkX2xpbmVfYnJlYWtzX29mZi50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTg4YjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hhcmRfbGluZV9icmVha3Nfb2ZmLnRleHQKQEAgLTAsMCArMSwyIEBACitUaGlzIGlzIGp1c3QgYSBub3JtYWwgcGFyYWdyYXBoLiAgCitDb250YWluaW5nIGEgbWFudWFsIGxpbmUgYnJlYWsgYWJvdmUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hlYWRlcl9pZHMuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGVhZGVyX2lkcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTI2NTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hlYWRlcl9pZHMuaHRtbApAQCAtMCwwICsxLDI3IEBACis8aDMgaWQ9Im15aWQiPnRlc3Q8L2gzPgorCis8aDMgaWQ9InZhcmlhYmxlX25hbWUiPnZhcmlhYmxlX25hbWU8L2gzPgorCis8aDMgaWQ9ImFiYy1kZWYtIj5hYmMgZGVmIMO2w7rDnzwvaDM+CisKKzxoMyBpZD0iMTkyLWFiYy0xOTIiPjE5MiBhYmMgMTkyPC9oMz4KKworPGgzPjsuOzs8L2gzPgorCis8aDMgaWQ9InZhcmlhYmxlX25hbWUtMSI+dmFyaWFibGVfbmFtZTwvaDM+CisKKzxoMyBpZD0idmFyaWFibGVfbmFtZS0yIj52YXJpYWJsZV9uYW1lPC9oMz4KKworPGgzIGlkPSItMSI+Ozs8L2gzPgorCis8aDMgaWQ9ImJlZm9yZS0tYWZ0ZXItdGFiIj5iZWZvcmUgCWFmdGVyIHRhYjwvaDM+CisKKzxoMyBpZD0id2l0aC1jb2RlIj53aXRoIDxjb2RlPmNvZGU8L2NvZGU+PC9oMz4KKworPGgzIGlkPSJ3aXRoLXNwYWNlIj53aXRoICZuYnNwOyZhdW1sOyZuYnNwO3NwYWNlPC9oMz4KKworPGgzIGlkPSJ3aXRoLXNtYXJ0LXF1b3RlcyI+V2l0aCAmIzgyMjA7c21hcnQmIzgyMjE7IHF1b3RlczwvaDM+CisKKzxoMyBpZD0id2l0aC0tdHlwb2dyYXBoaWMtLXN5bWJvbHMiPndpdGggJiM4MjEyOyAmIzE3MTsmIzE2MDt0eXBvZ3JhcGhpYyYjMTYwOyYjMTg3OyAmIzgyMzA7IHN5bWJvbHM8L2gzPgorCis8aDMgaWQ9IndpdGgtbTUiPndpdGggPHNjcmlwdCB0eXBlPSJtYXRoL3RleCI+bT01PC9zY3JpcHQ+PC9oMz4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGVhZGVyX2lkcy5odG1sLjE5IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oZWFkZXJfaWRzLmh0bWwuMTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1ZmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGVhZGVyX2lkcy5odG1sLjE5CkBAIC0wLDAgKzEsMjcgQEAKKzxoMyBpZD0ibXlpZCI+dGVzdDwvaDM+CisKKzxoMyBpZD0idmFyaWFibGVfbmFtZSI+dmFyaWFibGVfbmFtZTwvaDM+CisKKzxoMyBpZD0iYWJjLWRlZi3DtsO6w58iPmFiYyBkZWYgw7bDusOfPC9oMz4KKworPGgzIGlkPSIxOTItYWJjLTE5MiI+MTkyIGFiYyAxOTI8L2gzPgorCis8aDM+Oy47OzwvaDM+CisKKzxoMyBpZD0idmFyaWFibGVfbmFtZS0xIj52YXJpYWJsZV9uYW1lPC9oMz4KKworPGgzIGlkPSJ2YXJpYWJsZV9uYW1lLTIiPnZhcmlhYmxlX25hbWU8L2gzPgorCis8aDMgaWQ9Ii0xIj47OzwvaDM+CisKKzxoMyBpZD0iYmVmb3JlLS1hZnRlci10YWIiPmJlZm9yZSAJYWZ0ZXIgdGFiPC9oMz4KKworPGgzIGlkPSJ3aXRoLWNvZGUiPndpdGggPGNvZGU+Y29kZTwvY29kZT48L2gzPgorCis8aDMgaWQ9IndpdGgtw6RzcGFjZSI+d2l0aCDCoMOkwqBzcGFjZTwvaDM+CisKKzxoMyBpZD0id2l0aC1zbWFydC1xdW90ZXMiPldpdGgg4oCcc21hcnTigJ0gcXVvdGVzPC9oMz4KKworPGgzIGlkPSJ3aXRoLS10eXBvZ3JhcGhpYy0tc3ltYm9scyI+d2l0aCDigJQgwqvCoHR5cG9ncmFwaGljwqDCuyDigKYgc3ltYm9sczwvaDM+CisKKzxoMyBpZD0id2l0aC1tNSI+d2l0aCA8c2NyaXB0IHR5cGU9Im1hdGgvdGV4Ij5tPTU8L3NjcmlwdD48L2gzPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oZWFkZXJfaWRzLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hlYWRlcl9pZHMub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc2YjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oZWFkZXJfaWRzLm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOmF1dG9faWRzOiB0cnVlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hlYWRlcl9pZHMudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGVhZGVyX2lkcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhODljMGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hlYWRlcl9pZHMudGV4dApAQCAtMCwwICsxLDI3IEBACisjIyMgdGVzdCB7I215aWR9CisKKyMjIyB2YXJpYWJsZV9uYW1lCisKKyMjIyBhYmMgZGVmIMO2w7rDnworCisjIyMgMTkyIGFiYyAxOTIKKworIyMjIDsuOzsKKworIyMjIHZhcmlhYmxlX25hbWUKKworIyMjIHZhcmlhYmxlX25hbWUKKworIyMjIDs7CisKKyMjIyBiZWZvcmUgCWFmdGVyIHRhYgorCisjIyMgd2l0aCBgY29kZWAKKworIyMjIHdpdGggJm5ic3A7JmF1bWw7Jm5ic3A7c3BhY2UKKworIyMjIFdpdGggInNtYXJ0IiBxdW90ZXMKKworIyMjIHdpdGggLS0tIDw8IHR5cG9ncmFwaGljID4+IC4uLiBzeW1ib2xzCisKKyMjIyB3aXRoICQkbT01JCQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGVhZGVyX2lkc193aXRoX3ByZWZpeC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oZWFkZXJfaWRzX3dpdGhfcHJlZml4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhYjA3MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGVhZGVyX2lkc193aXRoX3ByZWZpeC5odG1sCkBAIC0wLDAgKzEsMyBAQAorPGgxIGlkPSJoYWxsby1oZWFkZXItMSI+SGVhZGVyIDE8L2gxPgorCis8aDEgaWQ9ImhhbGxvLTEyMyI+MTIzPC9oMT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGVhZGVyX2lkc193aXRoX3ByZWZpeC5vcHRpb25zIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oZWFkZXJfaWRzX3dpdGhfcHJlZml4Lm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3MjU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vaGVhZGVyX2lkc193aXRoX3ByZWZpeC5vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorOmF1dG9faWRzOiB0cnVlCis6YXV0b19pZF9wcmVmaXg6IGhhbGxvLQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oZWFkZXJfaWRzX3dpdGhfcHJlZml4LnRleHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL2hlYWRlcl9pZHNfd2l0aF9wcmVmaXgudGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2YwOWZlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9oZWFkZXJfaWRzX3dpdGhfcHJlZml4LnRleHQKQEAgLTAsMCArMSwzIEBACisjIEhlYWRlciAxCisKKyMgMTIzCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQtZGlzYWJsZWQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vcGFyYWdyYXBoX2VuZC1kaXNhYmxlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGZiM2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQtZGlzYWJsZWQuaHRtbApAQCAtMCwwICsxLDMxIEBACis8cD5BPGJyIC8+CisgIC0gYjwvcD4KKworPHA+VGhpcyBpcyBhIGxpc3Q8YnIgLz4KKy0gb3IgaXMgaXQ8L3A+CisKKzxwPmJsb2NrcXVvdGU8YnIgLz4KKyZndDsgdGV4dDwvcD4KKworPHA+aGVhZGVyPGJyIC8+CisjIHRleHQ8L3A+CisKKzxwPmNvZGVibG9jayBmZW5jZWQ8YnIgLz4KKzxjb2RlPgorcHV0cyBoZWxsbyB3b3JsZAorPC9jb2RlPjwvcD4KKworPHVsPgorICA8bGk+CisgICAgPHA+bGV2ZWwgMTxiciAvPgorc29tZSB0ZXh0PC9wPgorCisgICAgPHA+YmVnaW4gbGV2ZWwgMjxiciAvPgorKiBsZXZlbCAyPGJyIC8+CisqIGxldmVsIDI8L3A+CisgIDwvbGk+Cis8L3VsPgorCis8aDEgaWQ9ImgxIj5oMTwvaDE+Cis8cD4jIyBoMjxiciAvPgorIyMjIGgzPC9wPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9wYXJhZ3JhcGhfZW5kLWRpc2FibGVkLm9wdGlvbnMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQtZGlzYWJsZWQub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRmNjQzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9wYXJhZ3JhcGhfZW5kLWRpc2FibGVkLm9wdGlvbnMKQEAgLTAsMCArMSBAQAorOmdmbV9xdWlya3M6IFtdCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQtZGlzYWJsZWQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vcGFyYWdyYXBoX2VuZC1kaXNhYmxlZC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDllMDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQtZGlzYWJsZWQudGV4dApAQCAtMCwwICsxLDI3IEBACitBCisgIC0gYgorCitUaGlzIGlzIGEgbGlzdAorLSBvciBpcyBpdAorCitibG9ja3F1b3RlCis+IHRleHQKKworaGVhZGVyCisjIHRleHQKKworY29kZWJsb2NrIGZlbmNlZAorYGBgCitwdXRzIGhlbGxvIHdvcmxkCitgYGAKKworKiBsZXZlbCAxCisgIHNvbWUgdGV4dAorCisgIGJlZ2luIGxldmVsIDIKKyAgKiBsZXZlbCAyCisgICogbGV2ZWwgMgorCisjIGgxCisjIyBoMgorIyMjIGgzCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vcGFyYWdyYXBoX2VuZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzdkNjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQuaHRtbApAQCAtMCwwICsxLDM4IEBACis8cD5BPC9wPgorPHVsPgorICA8bGk+YjwvbGk+Cis8L3VsPgorCis8cD5UaGlzIGlzIGEgbGlzdDwvcD4KKzx1bD4KKyAgPGxpPm9yIGlzIGl0PC9saT4KKzwvdWw+CisKKzxwPmJsb2NrcXVvdGU8L3A+Cis8YmxvY2txdW90ZT4KKyAgPHA+dGV4dDwvcD4KKzwvYmxvY2txdW90ZT4KKworPHA+aGVhZGVyPC9wPgorPGgxPnRleHQ8L2gxPgorCis8cD5jb2RlYmxvY2sgZmVuY2VkPC9wPgorPHByZT48Y29kZT5wdXRzIGhlbGxvIHdvcmxkCis8L2NvZGU+PC9wcmU+CisKKzx1bD4KKyAgPGxpPgorICAgIDxwPmxldmVsIDE8YnIgLz4KK3NvbWUgdGV4dDwvcD4KKworICAgIDxwPmJlZ2luIGxldmVsIDI8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmxldmVsIDI8L2xpPgorICAgICAgPGxpPmxldmVsIDI8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+Cis8L3VsPgorCis8aDE+aDE8L2gxPgorPGgyPmgyPC9oMj4KKzxoMz5oMzwvaDM+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vcGFyYWdyYXBoX2VuZC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDllMDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3BhcmFncmFwaF9lbmQudGV4dApAQCAtMCwwICsxLDI3IEBACitBCisgIC0gYgorCitUaGlzIGlzIGEgbGlzdAorLSBvciBpcyBpdAorCitibG9ja3F1b3RlCis+IHRleHQKKworaGVhZGVyCisjIHRleHQKKworY29kZWJsb2NrIGZlbmNlZAorYGBgCitwdXRzIGhlbGxvIHdvcmxkCitgYGAKKworKiBsZXZlbCAxCisgIHNvbWUgdGV4dAorCisgIGJlZ2luIGxldmVsIDIKKyAgKiBsZXZlbCAyCisgICogbGV2ZWwgMgorCisjIGgxCisjIyBoMgorIyMjIGgzCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3N0cmlrZXRocm91Z2guaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vc3RyaWtldGhyb3VnaC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDMyYWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3N0cmlrZXRocm91Z2guaHRtbApAQCAtMCwwICsxLDI3IEBACis8cD48ZGVsPlRoaXMgaXMgYSB0ZXN0PC9kZWw+PC9wPgorCis8cD5+PGRlbD5UaGlzIGlzIGFub3RoZXIgdGVzdDwvZGVsPn48L3A+CisKKzxwPjxkZWw+VGhpcyBpcyB5ZXQgYW5vdGhlciB0ZXN0PC9kZWw+fjwvcD4KKworPHA+fn4gVGhpcyBpcyBhIHRlc3Qgb2YgaXQgTk9UIHdvcmtpbmcgfn48L3A+CisKKzxwPn5+PGJyIC8+CitUaGlzPGJyIC8+CitpczxiciAvPgorYTxiciAvPgorPHN0cm9uZz5tdWx0aWxpbmU8L3N0cm9uZz48YnIgLz4KK3Rlc3Q8YnIgLz4KK35+PC9wPgorCis8cD5UaGlzIGlzIGFuIDxkZWw+PGVtPmlubGluZTwvZW0+IDxzdHJvbmc+c3RyaWtldGhyb3VnaDwvc3Ryb25nPjwvZGVsPiB0ZXN0PC9wPgorCis8cD5UaGlzIGlzIGFuIH5+ZXNjYXBlZH5+IHN0cmlrZXRocm91Z2guPC9wPgorCis8cD5UaGlzIGlzIGEgPGRlbD5zdHJpa2V0aHJvdWdoIHdpdGggYSB+IGluIHRoZSBtaWRkbGU8L2RlbD48L3A+CisKKzxwPkkgPGRlbD5kb24mIzgyMTc7dCBldmVuPC9kZWw+fiBoYXZlIGFuIGV4dHJhIHRpbGRlLjwvcD4KKworPHA+VGhpcyBzaG91bGQgfn5ub3QgYmUgc3RydWNrLjwvcD4KKworPHA+VGhpcyA8ZGVsPmlzIGEgY29tcGxleCA8ZW0+c3RyaWtlPC9lbT4gdGhyb3VnaCAqdGVzdCB+fndpdGggbmVzdGluZzwvZGVsPiBpbnZvbHZlZCogaGVyZX5+LjwvcD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vc3RyaWtldGhyb3VnaC5odG1sLjE5IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS9zdHJpa2V0aHJvdWdoLmh0bWwuMTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyODk5NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vc3RyaWtldGhyb3VnaC5odG1sLjE5CkBAIC0wLDAgKzEsMjcgQEAKKzxwPjxkZWw+VGhpcyBpcyBhIHRlc3Q8L2RlbD48L3A+CisKKzxwPn48ZGVsPlRoaXMgaXMgYW5vdGhlciB0ZXN0PC9kZWw+fjwvcD4KKworPHA+PGRlbD5UaGlzIGlzIHlldCBhbm90aGVyIHRlc3Q8L2RlbD5+PC9wPgorCis8cD5+fiBUaGlzIGlzIGEgdGVzdCBvZiBpdCBOT1Qgd29ya2luZyB+fjwvcD4KKworPHA+fn48YnIgLz4KK1RoaXM8YnIgLz4KK2lzPGJyIC8+CithPGJyIC8+Cis8c3Ryb25nPm11bHRpbGluZTwvc3Ryb25nPjxiciAvPgordGVzdDxiciAvPgorfn48L3A+CisKKzxwPlRoaXMgaXMgYW4gPGRlbD48ZW0+aW5saW5lPC9lbT4gPHN0cm9uZz5zdHJpa2V0aHJvdWdoPC9zdHJvbmc+PC9kZWw+IHRlc3Q8L3A+CisKKzxwPlRoaXMgaXMgYW4gfn5lc2NhcGVkfn4gc3RyaWtldGhyb3VnaC48L3A+CisKKzxwPlRoaXMgaXMgYSA8ZGVsPnN0cmlrZXRocm91Z2ggd2l0aCBhIH4gaW4gdGhlIG1pZGRsZTwvZGVsPjwvcD4KKworPHA+SSA8ZGVsPmRvbuKAmXQgZXZlbjwvZGVsPn4gaGF2ZSBhbiBleHRyYSB0aWxkZS48L3A+CisKKzxwPlRoaXMgc2hvdWxkIH5+bm90IGJlIHN0cnVjay48L3A+CisKKzxwPlRoaXMgPGRlbD5pcyBhIGNvbXBsZXggPGVtPnN0cmlrZTwvZW0+IHRocm91Z2ggKnRlc3Qgfn53aXRoIG5lc3Rpbmc8L2RlbD4gaW52b2x2ZWQqIGhlcmV+fi48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3N0cmlrZXRocm91Z2gudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vc3RyaWtldGhyb3VnaC50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZWZmYzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3N0cmlrZXRocm91Z2gudGV4dApAQCAtMCwwICsxLDI3IEBACit+flRoaXMgaXMgYSB0ZXN0fn4KKworfn5+VGhpcyBpcyBhbm90aGVyIHRlc3R+fn4KKworfn5UaGlzIGlzIHlldCBhbm90aGVyIHRlc3R+fn4KKworfn4gVGhpcyBpcyBhIHRlc3Qgb2YgaXQgTk9UIHdvcmtpbmcgfn4KKworfn4KK1RoaXMKK2lzCithCisqKm11bHRpbGluZSoqCit0ZXN0Cit+fgorCitUaGlzIGlzIGFuIH5+X2lubGluZV8gKipzdHJpa2V0aHJvdWdoKip+fiB0ZXN0CisKK1RoaXMgaXMgYW4gXH5+ZXNjYXBlZH5+IHN0cmlrZXRocm91Z2guCisKK1RoaXMgaXMgYSB+fnN0cmlrZXRocm91Z2ggd2l0aCBhIH4gaW4gdGhlIG1pZGRsZX5+CisKK0kgfn5kb24ndCBldmVufn5+IGhhdmUgYW4gZXh0cmEgdGlsZGUuCisKK1RoaXMgc2hvdWxkIH5+bm90IGJlIHN0cnVjay4KKworVGhpcyB+fmlzIGEgY29tcGxleCAqc3RyaWtlKiB0aHJvdWdoICp0ZXN0IH5+d2l0aCBuZXN0aW5nfn4gaW52b2x2ZWQqIGhlcmV+fi4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vdHdvX3BhcmFfaGFyZF9saW5lX2JyZWFrcy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMva3JhbWRvd24tMS4xNC4wL3Rlc3QvdGVzdGNhc2VzX2dmbS90d29fcGFyYV9oYXJkX2xpbmVfYnJlYWtzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViYTJlNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vdHdvX3BhcmFfaGFyZF9saW5lX2JyZWFrcy5odG1sCkBAIC0wLDAgKzEsNCBAQAorPHA+VGhpcyBpcyBqdXN0IGEgbm9ybWFsIHBhcmFncmFwaC4gIDxiciAvPgorQ29udGFpbmluZyBhIGxpbmUgYnJlYWsuPC9wPgorCis8cD5Bbm90aGVyIHBhcmFncmFwaC48L3A+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3R3b19wYXJhX2hhcmRfbGluZV9icmVha3MudGV4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2tyYW1kb3duLTEuMTQuMC90ZXN0L3Rlc3RjYXNlc19nZm0vdHdvX3BhcmFfaGFyZF9saW5lX2JyZWFrcy50ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2Q3YzUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9rcmFtZG93bi0xLjE0LjAvdGVzdC90ZXN0Y2FzZXNfZ2ZtL3R3b19wYXJhX2hhcmRfbGluZV9icmVha3MudGV4dApAQCAtMCwwICsxLDQgQEAKK1RoaXMgaXMganVzdCBhIG5vcm1hbCBwYXJhZ3JhcGguICAKK0NvbnRhaW5pbmcgYSBsaW5lIGJyZWFrLgorCitBbm90aGVyIHBhcmFncmFwaC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9IaXN0b3J5Lm1kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL0hpc3RvcnkubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxN2FlYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9IaXN0b3J5Lm1kCkBAIC0wLDAgKzEsMjMyIEBACisjIExpcXVpZCBDaGFuZ2UgTG9nCisKKyMjIDQuMC4wIC8gbm90IHlldCByZWxlYXNlZCAvIGJyYW5jaCAibWFzdGVyIgorCisjIyMgQ2hhbmdlZAorKiBSZW5kZXIgYW4gb3BhcXVlIGludGVybmFsIGVycm9yIGJ5IGRlZmF1bHQgZm9yIG5vbi1MaXF1aWQ6OkVycm9yICgjODM1KSBbRHlsYW4gVGhhY2tlci1TbWl0aF0KKyogUnVieSAyLjAgc3VwcG9ydCBkcm9wcGVkICgjODMyKSBbRHlsYW4gVGhhY2tlci1TbWl0aF0KKyogQWRkIHRvX251bWJlciBEcm9wIG1ldGhvZCB0byBhbGxvdyBjdXN0b20gZHJvcHMgdG8gd29yayB3aXRoIG51bWJlciBmaWx0ZXJzICgjNzMxKQorKiBBZGQgc3RyaWN0X3ZhcmlhYmxlcyBhbmQgc3RyaWN0X2ZpbHRlcnMgb3B0aW9ucyB0byBkZXRlY3QgdW5kZWZpbmVkIHJlZmVyZW5jZXMgKCM2OTEpCisqIEltcHJvdmUgbG9vcCBwZXJmb3JtYW5jZSAoIzY4MSkgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogUmVuYW1lIERyb3AgbWV0aG9kIGBiZWZvcmVfbWV0aG9kYCB0byBgbGlxdWlkX21ldGhvZF9taXNzaW5nYCAoIzY2MSkgW1RoaWVycnkgSm95YWxdCisqIEFkZCB1cmxfZGVjb2RlIGZpbHRlciB0byBpbnZlcnQgdXJsX2VuY29kZSAoIzY0NSkgW0xhcnJ5IEFyY2hlcl0KKyogQWRkIGdsb2JhbF9maWx0ZXIgdG8gYXBwbHkgYSBmaWx0ZXIgdG8gYWxsIG91dHB1dCAoIzYxMCkgW0xvcmVuIEhhbGVdCisqIEFkZCBjb21wYWN0IGZpbHRlciAoIzYwMCkgW0NhcnNvbiBSZWlua2VdCisqIFJlbmFtZSBkZXByZWNhdGVkICJoYXNfa2V5PyIgYW5kICJoYXNfaW50ZXJydXB0PyIgbWV0aG9kcyAoIzU5MykgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogSW5jbHVkZSB0ZW1wbGF0ZSBuYW1lIHdpdGggbGluZSBudW1iZXJzIGluIHJlbmRlciBlcnJvcnMgKDU3NCkgW0R5bGFuIFRoYWNrZXItU21pdGhdCisqIEFkZCBzb3J0X25hdHVyYWwgZmlsdGVyICgjNTU0KSBbTWFydGluIEhhbnplbF0KKyogQWRkIGZvcmxvb3AucGFyZW50bG9vcCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IGxvb3AgKCM1MjApIFtKdXN0aW4gTGldCisqIEJsb2NrIHBhcnNpbmcgbW92ZWQgdG8gQmxvY2tCb2R5IGNsYXNzICgjNDU4KSBbRHlsYW4gVGhhY2tlci1TbWl0aF0KKyogQWRkIGNvbmNhdCBmaWx0ZXIgdG8gY29uY2F0ZW5hdGUgYXJyYXlzICgjNDI5KSBbRGlvZ28gQmVhdG9dCisqIFJ1YnkgMS45IHN1cHBvcnQgZHJvcHBlZCAoIzQ5MSkgW0p1c3RpbiBMaV0KKyogTGlxdWlkOjpUZW1wbGF0ZS5maWxlX3N5c3RlbSdzIHJlYWRfdGVtcGxhdGVfZmlsZSBtZXRob2QgaXMgbm8gbG9uZ2VyIHBhc3NlZCB0aGUgY29udGV4dC4gKCM0NDEpIFtKYW1lcyBSZWlkLVNtaXRoXQorKiBSZW1vdmUgc3VwcG9ydCBmb3IgYGxpcXVpZF9tZXRob2RzYAorKiBMaXF1aWQ6OlRlbXBsYXRlLnJlZ2lzdGVyX2ZpbHRlciByYWlzZXMgd2hlbiB0aGUgbW9kdWxlIG92ZXJyaWRlcyByZWdpc3RlcmVkIHB1YmxpYyBtZXRob2RzIGFzIHByaXZhdGUgb3IgcHJvdGVjdGVkICgjNzA1KSBbR2F1cmF2IENoYW5kZV0KKworIyMjIEZpeGVkCisqIEZpeCBtYXAgZmlsdGVyIHdoZW4gdmFsdWUgaXMgYSBQcm9jICgjNjcyKSBbR3VpbGxhdW1lIE1hbGV0dGVdCisqIEZpeCB0cnVuY2F0ZSBmaWx0ZXIgd2hlbiB2YWx1ZSBpcyBub3QgYSBzdHJpbmcgKCM2NzIpIFtHdWlsbGF1bWUgTWFsZXR0ZV0KKyogRml4IGJlaGF2aW91ciBvZiBlc2NhcGUgZmlsdGVyIHdoZW4gaW5wdXQgaXMgbmlsICgjNjY1KSBbVGFuZWwgSmFrb2Jzb29dCisqIEZpeCBzb3J0IGZpbHRlciBiZWhhdmlvdXIgd2l0aCBlbXB0eSBhcnJheSBpbnB1dCAoIzY1MikgW01hcmNlbCBDYXJ5XQorKiBGaXggdGVzdCBmYWlsdXJlIHVuZGVyIGNlcnRhaW4gdGltZXpvbmVzICgjNjMxKSBbRHlsYW4gVGhhY2tlci1TbWl0aF0KKyogRml4IGJ1ZyBpbiB1bmlxIGZpbHRlciAoIzU5NSkgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogRml4IGJ1ZyB3aGVuICJibGFuayIgYW5kICJlbXB0eSIgYXJlIHVzZWQgYXMgdmFyaWFibGUgbmFtZXMgKCM1OTIpIFtGbG9yaWFuIFdlaW5nYXJ0ZW5dCisqIEZpeCBjb25kaXRpb24gcGFyc2Ugb3JkZXIgaW4gc3RyaWN0IG1vZGUgKCM1NjkpIFtKdXN0aW4gTGldCisqIEZpeCBuYW1pbmcgb2YgdGhlICJjb250ZXh0IHZhcmlhYmxlIiB3aGVuIGR5bmFtaWNhbGx5IGluY2x1ZGluZyBhIHRlbXBsYXRlICgjNTU5KSBbSnVzdGluIExpXQorKiBHcmFjZWZ1bGx5IGFjY2VwdCBlbXB0eSBzdHJpbmdzIGluIHRoZSBkYXRlIGZpbHRlciAoIzU1NSkgW0xvcmVuIEhhbGVdCisqIEZpeCBjYXB0dXJpbmcgaW50byB2YXJpYWJsZXMgd2l0aCBhIGh5cGhlbiBpbiB0aGUgbmFtZSAoIzUwNSkgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogRml4IGNhc2Ugc2Vuc2l0aXZpdHkgcmVncmVzc2lvbiBpbiBkYXRlIHN0YW5kYXJkIGZpbHRlciAoIzQ5OSkgW0tlbGxleSBSZXlub2xkc10KKyogRGlzYWxsb3cgZmlsdGVycyB3aXRoIG5vIHZhcmlhYmxlIGluIHN0cmljdCBtb2RlICgjNDc1KSBbSnVzdGluIExpXQorKiBEaXNhbGxvdyB2YXJpYWJsZSBuYW1lcyBpbiB0aGUgc3RyaWN0IHBhcnNlciB0aGF0IGFyZSBub3QgdmFsaWQgaW4gdGhlIGxheCBwYXJzZXIgKCM0NjMpIFtKdXN0aW4gTGldCisqIEZpeCBCbG9ja0JvZHkjd2FybmluZ3MgdGFraW5nIGV4cG9uZW50aWFsIHRpbWUgdG8gY29tcHV0ZSAoIzQ4NikgW0p1c3RpbiBMaV0KKworIyMgMy4wLjUgLyAyMDE1LTA3LTIzIC8gYnJhbmNoICIzLTAtc3RhYmxlIgorCisqIEZpeCB0ZXN0IGZhaWx1cmUgdW5kZXIgY2VydGFpbiB0aW1lem9uZXMgW0R5bGFuIFRoYWNrZXItU21pdGhdCisKKyMjIDMuMC40IC8gMjAxNS0wNy0xNworCisqIEZpeCBjaGFpbmVkIGFjY2VzcyB0byBtdWx0aS1kaW1lbnNpb25hbCBoYXNoZXMgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKworIyMgMy4wLjMgLyAyMDE1LTA1LTI4CisKKyogRml4IGNvbmRpdGlvbiBwYXJzZSBvcmRlciBpbiBzdHJpY3QgbW9kZSAoIzU2OSkgW0p1c3RpbiBMaV0KKworIyMgMy4wLjIgLyAyMDE1LTA0LTI0CisKKyogRXhwb3NlIFZhcmlhYmxlTG9va3VwIHByaXZhdGUgbWVtYmVycyAoIzU1MSkgW0p1c3RpbiBMaV0KKyogRG9jdW1lbnRhdGlvbiBmaXhlcworCisjIyAzLjAuMSAvIDIwMTUtMDEtMjMKKworKiBSZW1vdmUgZHVwbGljYXRlIGBpbmRleDBgIGtleSBpbiBUYWJsZVJvdyB0YWcgKCM1MDIpIFtBbGZyZWQgWGluZ10KKworIyMgMy4wLjAgLyAyMDE0LTExLTEyCisKKyogUmVtb3ZlZCBCbG9jayNlbmRfdGFnLiBJbnN0ZWFkLCBvdmVycmlkZSBwYXJzZSB3aXRoIGBzdXBlcmAgZm9sbG93ZWQgYnkgeW91ciBjb2RlLiBTZWUgIzQ0NiBbRHlsYW4gVGhhY2tlci1TbWl0aF0KKyogRml4ZWQgY29uZGl0aW9uIHdpdGggd3JvbmcgZGF0YSB0eXBlcyAoIzQyMykgW0JvZ2RhbiBHdXNpZXZdCisqIEFkZCB1cmxfZW5jb2RlIHRvIHN0YW5kYXJkIGZpbHRlcnMgKCM0MjEpIFtEZXJyaWNrIFJlaW1lcl0KKyogQWRkIHVuaXEgdG8gc3RhbmRhcmQgZmlsdGVycyBbRmxvcmlhbiBXZWluZ2FydGVuXQorKiBBZGQgZXhjZXB0aW9uX2hhbmRsZXIgZmVhdHVyZSAoIzM5NykgYW5kICMyNTQgW0JvZ2RhbiBHdXNpZXYsIEZsb3JpYW4gV2VpbmdhcnRlbl0KKyogT3B0aW1pemUgdmFyaWFibGUgcGFyc2luZyB0byBhdm9pZCByZXBlYXRlZCByZWdleCBldmFsdWF0aW9uIGR1cmluZyB0ZW1wbGF0ZSByZW5kZXJpbmcgIzM4MyBbSmFzb24gSGlsdHotTGFmb3JnZV0KKyogT3B0aW1pemUgY2hlY2tpbmcgZm9yIGJsb2NrIGludGVycnVwdHMgdG8gcmVkdWNlIG9iamVjdCBhbGxvY2F0aW9uICMzODAgW0phc29uIEhpbHR6LUxhZm9yZ2VdCisqIFByb3Blcmx5IHNldCBjb250ZXh0IHJldGhyb3dfZXJyb3JzIG9uIHJlbmRlciEgIzM0OSBbVGhpZXJyeSBKb3lhbF0KKyogRml4IGJyb2tlbiByZW5kZXJpbmcgb2YgdmFyaWFibGVzIHdoaWNoIGFyZSBlcXVhbCB0byBmYWxzZSAoIzM0NSkgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogUmVtb3ZlIEFjdGlvblZpZXcgdGVtcGxhdGUgaGFuZGxlciBbRHlsYW4gVGhhY2tlci1TbWl0aF0KKyogRnJlZXplIGxvdHMgb2Ygc3RyaW5nIGxpdGVyYWxzIGZvciBuZXcgUnVieSAyLjEgb3B0aW1pemF0aW9uICgjMjk3KSBbRmxvcmlhbiBXZWluZ2FydGVuXQorKiBBbGxvdyBuZXdsaW5lcyBpbiB0YWdzIGFuZCB2YXJpYWJsZXMgKCMzMjQpIFtEeWxhbiBUaGFja2VyLVNtaXRoXQorKiBUYWcjcGFyc2UgaXMgY2FsbGVkIGFmdGVyIGluaXRpYWxpemUsIHdoaWNoIG5vdyB0YWtlcyBvcHRpb25zIGluc3RlYWQgb2YgdG9rZW5zIGFzIHRoZSAzcmQgYXJndW1lbnQuIFNlZSAjMzIxIFtEeWxhbiBUaGFja2VyLVNtaXRoXQorKiBSYWlzZSBgTGlxdWlkOjpBcmd1bWVudEVycm9yYCBpbnN0ZWFkIG9mIGA6OkFyZ3VtZW50RXJyb3JgIHdoZW4gZmlsdGVyIGhhcyB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICMzMDkgW0JvZ2RhbiBHdXNpZXZdCisqIEFkZCBhIHRvX3MgZGVmYXVsdCBmb3IgbGlxdWlkIGRyb3BzICgjMzA2KSBbQWRhbSBEb2VsZXJdCisqIEFkZCBzdHJpcCwgbHN0cmlwLCBhbmQgcnN0cmlwIHRvIHN0YW5kYXJkIGZpbHRlcnMgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogTWFrZSBpZiwgZm9yICYgY2FzZSB0YWdzIHJldHVybiBjb21wbGV0ZSBhbmQgY29uc2lzdGVudCBub2RlbGlzdHMgKCMyNTApIFtOaWNrIEpvbmVzXQorKiBQcmV2ZW50IGFyYml0cmFyeSBtZXRob2QgaW52b2NhdGlvbiBvbiBjb25kaXRpb24gb2JqZWN0cyAoIzI3NCkgW0R5bGFuIFRoYWNrZXItU21pdGhdCisqIERvbid0IGNhbGwgdG9fc3ltIHdoZW4gY3JlYXRpbmcgY29uZGl0aW9ucyBmb3Igc2VjdXJpdHkgcmVhc29ucyAoIzI3MykgW0JvdWtlIHZhbiBkZXIgQmlqbF0KKyogRml4IHJlc291cmNlIGNvdW50aW5nIGJ1ZyB3aXRoIHJlc3BvbmRfdG8/KDpsZW5ndGgpICgjMjYzKSBbRmxvcmlhbiBXZWluZ2FydGVuXQorKiBBbGxvdyBzcGVjaWZ5aW5nIGN1c3RvbSBwYXR0ZXJucyBmb3IgdGVtcGxhdGUgZmlsZW5hbWVzICgjMjg0KSBbQW5kcmVpIEdsYWRreWldCisqIEFsbG93IGRyb3BzIHRvIG9wdGltaXplIGxvYWRpbmcgYSBzbGljZSBvZiBlbGVtZW50cyAoIzI4MikgW1RvbSBCdXJuc10KKyogU3VwcG9ydCBmb3IgcGFzc2luZyB2YXJpYWJsZXMgdG8gc25pcHBldHMgaW4gc3ViZGlycyAoIzI3MSkgW0pvb3N0IEhpZXRicmlua10KKyogQWRkIGEgY2xhc3MgY2FjaGUgdG8gYXZvaWQgcnVudGltZSBleHRlbmQgY2FsbHMgKCMyNDkpIFtKYW1lcyBUdWNrZXJdCisqIFJlbW92ZSBzb21lIGxlZ2FjeSBSdWJ5IDEuOCBjb21wYXRpYmlsaXR5IGNvZGUgKCMyNzYpIFtGbG9yaWFuIFdlaW5nYXJ0ZW5dCisqIEFkZCBkZWZhdWx0IGZpbHRlciB0byBzdGFuZGFyZCBmaWx0ZXJzICgjMjY3KSBbRGVycmljayBSZWltZXJdCisqIEFkZCBvcHRpb25hbCBzdHJpY3QgcGFyc2luZyBhbmQgd2FybiBwYXJzaW5nICgjMjM1KSBbVHJpc3RhbiBIdW1lXQorKiBBZGQgSTE4biBzeW50YXggZXJyb3IgdHJhbnNsYXRpb24gKCMyNDEpIFtTaW1vbiBIw7hydXAgRXNraWxkc2VuLCBTaXJ1cHNlbl0KKyogTWFrZSBzb3J0IGZpbHRlciB3b3JrIG9uIGVudW1lcmFibGUgZHJvcHMgKCMyMzkpIFtGbG9yaWFuIFdlaW5nYXJ0ZW5dCisqIEZpeCBjbGFzaGluZyBtZXRob2QgbmFtZXMgaW4gZW51bWVyYWJsZSBkcm9wcyAoIzIzOCkgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogTWFrZSBtYXAgZmlsdGVyIHdvcmsgb24gZW51bWVyYWJsZSBkcm9wcyAoIzIzMykgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogSW1wcm92ZWQgd2hpdGVzcGFjZSBzdHJpcHBpbmcgZm9yIGJsYW5rIGJsb2NrcywgcmVsYXRlZCB0byAjMjE2IFtGbG9yaWFuIFdlaW5nYXJ0ZW5dCisKKyMjIDIuNi4zIC8gMjAxNS0wNy0yMyAvIGJyYW5jaCAiMi02LXN0YWJsZSIKKworKiBGaXggdGVzdCBmYWlsdXJlIHVuZGVyIGNlcnRhaW4gdGltZXpvbmVzIFtEeWxhbiBUaGFja2VyLVNtaXRoXQorCisjIyAyLjYuMiAvIDIwMTUtMDEtMjMKKworKiBSZW1vdmUgZHVwbGljYXRlIGhhc2gga2V5IFtQYXJrZXIgTW9vcmVdCisKKyMjIDIuNi4xIC8gMjAxNC0wMS0xMAorCitTZWN1cml0eSBmaXgsIGNoZXJyeS1waWNrZWQgZnJvbSBtYXN0ZXIgKDRlMTRhNjUpOgorKiBEb24ndCBjYWxsIHRvX3N5bSB3aGVuIGNyZWF0aW5nIGNvbmRpdGlvbnMgZm9yIHNlY3VyaXR5IHJlYXNvbnMgKCMyNzMpIFtCb3VrZSB2YW4gZGVyIEJpamxdCisqIFByZXZlbnQgYXJiaXRyYXJ5IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGNvbmRpdGlvbiBvYmplY3RzICgjMjc0KSBbRHlsYW4gVGhhY2tlci1TbWl0aF0KKworIyMgMi42LjAgLyAyMDEzLTExLTI1CisKK0lNUE9SVEFOVDogTGlxdWlkIDIuNiBpcyBnb2luZyB0byBiZSB0aGUgbGFzdCB2ZXJzaW9uIG9mIExpcXVpZCB3aGljaCBtYWludGFpbnMgZXhwbGljaXQgUnVieSAxLjggY29tcGF0YWJpbGl0eS4KK1RoZSBmb2xsb3dpbmcgcmVsZWFzZXMgd2lsbCBvbmx5IGJlIHRlc3RlZCBhZ2FpbnN0IFJ1YnkgMS45IGFuZCBSdWJ5IDIuMCBhbmQgYXJlIGxpa2VseSB0byBicmVhayBvbiBSdWJ5IDEuOC4KKworKiBCdWdmaXggZm9yICMxMDY6IGZpeCBleGFtcGxlIHNlcnZsZXQgW2dub3dvZWxdCisqIEJ1Z2ZpeCBmb3IgIzk3OiBzdHJpcF9odG1sIGZpbHRlciBzdXBwb3J0cyBtdWx0aS1saW5lIHRhZ3MgW0pvIExpc3NdCisqIEJ1Z2ZpeCBmb3IgIzExNDogc3RyaXBfaHRtbCBmaWx0ZXIgc3VwcG9ydHMgc3R5bGUgdGFncyBbSmFtZXMgQWxsYXJkaWNlXQorKiBCdWdmaXggZm9yICMxMTc6ICdub3cnIHN1cHBvcnQgZm9yIGRhdGUgZmlsdGVyIGluIFJ1YnkgMS45IFtOb3RyZSBEYW1lIFdlYmdyb3VwXQorKiBCdWdmaXggZm9yICMxNjY6IHRydW5jYXRlIGZpbHRlciBvbiBVVEYtOCBzdHJpbmdzIHdpdGggUnVieSAxLjggW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKyogQnVnZml4IGZvciAjMjA0OiAncmF3JyBwYXJzaW5nIGJ1ZyBbRmxvcmlhbiBXZWluZ2FydGVuXQorKiBCdWdmaXggZm9yICMxNTA6ICdmb3InIHBhcnNpbmcgYnVnIFtQZXRlciBTY2hyw7ZkZXJdCisqIEJ1Z2ZpeCBmb3IgIzEyNjogU3RyaXAgQ1JMRiBpbiBzdHJpcF9uZXdsaW5lIFtQZXRlciBTY2hyw7ZkZXJdCisqIEJ1Z2ZpeCBmb3IgIzE3NCwgImNhbid0IGNvbnZlcnQgRml4bnVtIGludG8gU3RyaW5nIiBmb3IgInJlcGxhY2UiIFtqc3cwNTI4XQorKiBBbGxvdyBhIExpcXVpZDo6RHJvcCB0byBiZSBwYXNzZWQgaW50byBUZW1wbGF0ZSNyZW5kZXIgW0RhbmllbCBIdWNrc3RlcF0KKyogUmVzb3VyY2UgbGltaXRzIFtGbG9yaWFuIFdlaW5nYXJ0ZW5dCisqIEFkZCByZXZlcnNlIGZpbHRlciBbSmF5IFN0cnliaXNdCisqIEFkZCB1dGYtOCBzdXBwb3J0CisqIFVzZSBhcnJheSBpbnN0ZWFkIG9mIEhhc2ggdG8ga2VlcCB0aGUgcmVnaXN0ZXJlZCBmaWx0ZXJzIFtUYXNvcyBTdGF0aG9wb3Vsb3NdCisqIENhY2hlIHRva2VuaXplZCBwYXJ0aWFsIHRlbXBsYXRlcyBbVG9tIEJ1cm5zXQorKiBBdm9pZCB3YXJuaW5ncyBpbiBSdWJ5IDEuOS4zIFtNYXJjdXMgU3RvbGxzdGVpbWVyXQorKiBCZXR0ZXIgZG9jdW1lbnRhdGlvbiBmb3IgJ2luY2x1ZGUnIHRhZyAoY2xvc2VzICMxNjMpIFtQZXRlciBTY2hyw7ZkZXJdCisqIFVzZSBvZiBCaWdEZWNpbWFsIG9uIGZpbHRlcnMgdG8gaGF2ZSBiZXR0ZXIgcHJlY2lzaW9uIChjbG9zZXMgIzE1NSkgW0FydGh1ciBOb2d1ZWlyYSBOZXZlc10KKworIyMgMi41LjUgLyAyMDE0LTAxLTEwIC8gYnJhbmNoICIyLTUtc3RhYmxlIgorCitTZWN1cml0eSBmaXgsIGNoZXJyeS1waWNrZWQgZnJvbSBtYXN0ZXIgKDRlMTRhNjUpOgorKiBEb24ndCBjYWxsIHRvX3N5bSB3aGVuIGNyZWF0aW5nIGNvbmRpdGlvbnMgZm9yIHNlY3VyaXR5IHJlYXNvbnMgKCMyNzMpIFtCb3VrZSB2YW4gZGVyIEJpamxdCisqIFByZXZlbnQgYXJiaXRyYXJ5IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGNvbmRpdGlvbiBvYmplY3RzICgjMjc0KSBbRHlsYW4gVGhhY2tlci1TbWl0aF0KKworIyMgMi41LjQgLyAyMDEzLTExLTExCisKKyogRml4ICJjYW4ndCBjb252ZXJ0IEZpeG51bSBpbnRvIFN0cmluZyIgZm9yICJyZXBsYWNlIiAoIzE3MyksIFtqc3cwNTI4XQorCisjIyAyLjUuMyAvIDIwMTMtMTAtMDkKKworKiAjMjMyLCAjMjM0LCAjMjM3OiBGaXggbWFwIGZpbHRlciBidWdzIFtGbG9yaWFuIFdlaW5nYXJ0ZW5dCisKKyMjIDIuNS4yIC8gMjAxMy0wOS0wMyAvIGRlbGV0ZWQKKworWWFua2VkIGZyb20gcnVieWdlbXMsIGFzIGl0IGNvbnRhaW5lZCB0b28gbWFueSBjaGFuZ2VzIHRoYXQgYnJva2UgY29tcGF0aWJpbGl0eS4gVGhvc2UgY2hhbmdlcyB3aWxsIGJlIG9uIGZvbGxvd2luZyBtYWpvciByZWxlYXNlcy4KKworIyMgMi41LjEgLyAyMDEzLTA3LTI0CisKKyogIzIzMDogRml4IHNlY3VyaXR5IGlzc3VlIHdpdGggbWFwIGZpbHRlciwgVXNlIGludm9rZV9kcm9wIGluIG1hcCBmaWx0ZXIgW0Zsb3JpYW4gV2VpbmdhcnRlbl0KKworIyMgMi41LjAgLyAyMDEzLTAzLTA2CisKKyogUHJldmVudCBPYmplY3QgbWV0aG9kcyBmcm9tIGJlaW5nIGNhbGxlZCBvbiBkcm9wcworKiBBdm9pZCBzeW1ib2wgaW5qZWN0aW9uIGZyb20gbGlxdWlkCisqIEFkZGVkIGJyZWFrIGFuZCBjb250aW51ZSBzdGF0ZW1lbnRzCisqIEZpeCBmaWx0ZXIgcGFyc2VyIGZvciBhcmdzIHdpdGhvdXQgc3BhY2Ugc2VwYXJhdG9ycworKiBBZGQgc3VwcG9ydCBmb3IgZmlsdGVyIGtleXdvcmQgYXJndW1lbnRzCisKKworIyMgMi40LjAgLyAyMDEyLTA4LTAzCisKKyogUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCisqIEFsbG93IGZpbHRlcnMgaW4gYGFzc2lnbmAKKyogQWRkIGBtb2R1bG9gIGZpbHRlcgorKiBSdWJ5IDEuOCwgMS45LCBhbmQgUnViaW5pdXMgY29tcGF0aWJpbGl0eSBmaXhlcworKiBBZGQgc3VwcG9ydCBmb3IgYHF1b3RlZFsncmVmZXJlbmNlcyddYCBpbiBgdGFibGVyb3dgCisqIEFkZCBzdXBwb3J0IGZvciBFbnVtZXJhYmxlIHRvIGB0YWJsZXJvd2AKKyogYHN0cmlwX2h0bWxgIGZpbHRlciByZW1vdmVzIGh0bWwgY29tbWVudHMKKworCisjIyAyLjMuMCAvIDIwMTEtMTAtMTYKKworKiBTZXZlcmFsIHNwZWVkL21lbW9yeSBpbXByb3ZlbWVudHMKKyogTnVtZXJvdXMgYnVnIGZpeGVzCisqIEFkZGVkIHN1cHBvcnQgZm9yIE1SSSAxLjksIFJ1YmluaXVzLCBhbmQgSlJ1YnkKKyogQWRkZWQgc3VwcG9ydCBmb3IgaW50ZWdlciBkcm9wIHBhcmFtZXRlcnMKKyogQWRkZWQgZXBvY2ggc3VwcG9ydCB0byBgZGF0ZWAgZmlsdGVyCisqIE5ldyBgcmF3YCB0YWcgdGhhdCBzdXBwcmVzc2VzIHBhcnNpbmcKKyogQWRkZWQgYGVsc2VgIG9wdGlvbiB0byBgZm9yYCB0YWcKKyogTmV3IGBpbmNyZW1lbnRgIHRhZworKiBOZXcgYHNwbGl0YCBmaWx0ZXIKKworCisjIyAyLjIuMSAvIDIwMTAtMDgtMjMKKworKiBBZGRlZCBzdXBwb3J0IGZvciBsaXRlcmFsIHRhZ3MKKworCisjIyAyLjIuMCAvIDIwMTAtMDgtMjIKKworKiBDb21wYXRpYmxlIHdpdGggUnVieSAxLjguNywgMS45LjEgYW5kIDEuOS4yLXAwCisqIE1lcmdlZCBzb21lIGNoYW5nZWQgbWFkZSBieSB0aGUgY29tbXVuaXR5CisKKworIyMgMS45LjAgLyAyMDA4LTAzLTA0CisKKyogRml4ZWQgZ2VtIGluc3RhbGwgcmFrZSB0YXNrCisqIEltcHJvdmUgRXJyb3IgZW5jYXBzdWxhdGlvbiBpbiBsaXF1aWQgYnkgbWFpbnRhaW5pbmcgYSBvd24gc2V0IG9mIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHJ1YnkgYnVpbGQgaW5zCisKKworIyMgQmVmb3JlIDEuOS4wCisKKyogQWRkZWQgSWYgd2l0aCBvciAvIGFuZCBleHByZXNzaW9ucworKiBJbXBsZW1lbnRlZCAudG9fbGlxdWlkIGZvciBhbGwgb2JqZWN0cyB3aGljaCBjYW4gYmUgcGFzc2VkIHRvIGxpcXVpZCBsaWtlIFN0cmluZ3MgQXJyYXlzIEhhc2hlcyBOdW1lcmljcyBhbmQgQm9vbGVhbnMuIFRvIGV4cG9ydCBuZXcgb2JqZWN0cyB0byBsaXF1aWQganVzdCBpbXBsZW1lbnQgLnRvX2xpcXVpZCBvbiB0aGVtIGFuZCByZXR1cm4gb2JqZWN0cyB3aGljaCB0aGVtc2VsdmVzIGhhdmUgLnRvX2xpcXVpZCBtZXRob2RzLgorKiBBZGRlZCBtb3JlIHRhZ3MgdG8gc3RhbmRhcmQgbGlicmFyeQorKiBBZGRlZCBpbmNsdWRlIHRhZyAoIGxpa2UgcGFydGlhbHMgaW4gcmFpbHMgKQorKiBbLi4uXSBHYXppbGxpb24gb2YgZGV0YWlsIGltcHJvdmVtZW50cworKiBBZGRlZCBzdHJhaW5lcnMgYXMgZmlsdGVyIGhvc3RzIGZvciBiZXR0ZXIgc2VjdXJpdHkgW1RvYmlhcyBMdWV0a2VdCisqIEZpeGVkIHRoYXQgcmFpbHMgaW50ZWdyYXRpb24gd291bGQgY2FsbCBmaWx0ZXIgd2l0aCB0aGUgd3JvbmcgInNlbGYiIFtNaWNoYWVsIEdlYXJ5XQorKiBGaXhlZCBiYWQgZXJyb3IgcmVwb3J0aW5nIHdoZW4gYSBmaWx0ZXIgY2FsbGVkIGEgbWV0aG9kIHdoaWNoIGRvZXNuJ3QgZXhpc3QuIExpcXVpZCB0b2xkIHlvdSB0aGF0IGl0IGNvdWxkbid0IGZpbmQgdGhlIGZpbHRlciB3aGljaCB3YXMgb2J2aW91c2x5IG1pc2xlYWRpbmcgW1RvYmlhcyBMdWV0a2VdCisqIFJlbW92ZWQgY291bnQgaGVscGVyIGZyb20gc3RhbmRhcmQgbGliLiB1c2Ugc2l6ZSBbVG9iaWFzIEx1ZXRrZV0KKyogRml4ZWQgYnVnIHdpdGggc3RyaW5nIGZpbHRlciBwYXJhbWV0ZXJzIGZhaWxpbmcgdG8gdG9sZXJhdGUgY29tbWFzIGluIHN0cmluZ3MuIFtQYXVsIEhhbW1vbmRdCisqIEltcHJvdmVkIGZpbHRlciBwYXJhbWV0ZXJzLiBGaWx0ZXIgcGFyYW1ldGVycyBhcmUgbm93IGNvbnRleHQgc2Vuc2l0aXZlOyBUeXBlcyBhcmUgcmVzb2x2ZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgY29udGV4dC4gTXVsdGlwbGUgcGFyYW1ldGVycyBhcmUgbm93IHNlcGFyYXRlZCBieSB0aGUgTGlxdWlkOjpBcmd1bWVudFNlcGFyYXRvcjogLCBieSBkZWZhdWx0IFtQYXVsIEhhbW1vbmRdCisgICAge3sgJ1R5cG8nIHwgbGlua190bzogJ2h0dHA6Ly90eXBvLmxlZXRzb2Z0LmNvbScsICdUeXBvIC0gYSBtb2Rlcm4gd2VibG9nIGVuZ2luZScgfX0KKyogQWRkZWQgTGlxdWlkOjpEcm9wLiBBIGJhc2UgY2xhc3Mgd2hpY2ggeW91IGNhbiB1c2UgZm9yIGV4cG9ydGluZyBwcm94eSBvYmplY3RzIHRvIGxpcXVpZCB3aGljaCBjYW4gYWNxdWlyZSBtb3JlIGRhdGEgd2hlbiB1c2VkIGluIGxpcXVpZC4gW1RvYmlhcyBMdWV0a2VdCisKKyAgY2xhc3MgUHJvZHVjdERyb3AgPCBMaXF1aWQ6OkRyb3AKKyAgICBkZWYgdG9wX3NhbGVzCisgICAgICAgU2hvcC5jdXJyZW50LnByb2R1Y3RzLmZpbmQoOmFsbCwgOm9yZGVyID0+ICdzYWxlcycsIDpsaW1pdCA9PiAxMCApCisgICAgZW5kCisgIGVuZAorICB0ID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSggJyB7JSBmb3IgcHJvZHVjdCBpbiBwcm9kdWN0LnRvcF9zYWxlcyAlfSB7eyBwcm9kdWN0Lm5hbWUgfX0geyUgZW5kZm9yICV9ICcgICkKKyAgdC5yZW5kZXIoJ3Byb2R1Y3QnID0+IFByb2R1Y3REcm9wLm5ldyApCisqIEFkZGVkIGZpbHRlciBwYXJhbWV0ZXJzIHN1cHBvcnQuIEV4YW1wbGU6IHt7IGRhdGUgfCBmb3JtYXRfZGF0ZTogIiVZIiB9fSBbUGF1bCBIYW1tb25kXQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL0xJQ0VOU0UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZiMDRlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL0xJQ0VOU0UKQEAgLTAsMCArMSwyMCBAQAorQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IFRvYmlhcyBMdWV0a2UKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3ZmRmNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9SRUFETUUubWQKQEAgLTAsMCArMSwxMDYgQEAKK1shW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly9hcGkudHJhdmlzLWNpLm9yZy9TaG9waWZ5L2xpcXVpZC5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHA6Ly90cmF2aXMtY2kub3JnL1Nob3BpZnkvbGlxdWlkKQorWyFbSW5saW5lIGRvY3NdKGh0dHA6Ly9pbmNoLWNpLm9yZy9naXRodWIvU2hvcGlmeS9saXF1aWQuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwOi8vaW5jaC1jaS5vcmcvZ2l0aHViL1Nob3BpZnkvbGlxdWlkKQorCisjIExpcXVpZCB0ZW1wbGF0ZSBlbmdpbmUKKworKiBbQ29udHJpYnV0aW5nIGd1aWRlbGluZXNdKENPTlRSSUJVVElORy5tZCkKKyogW1ZlcnNpb24gaGlzdG9yeV0oSGlzdG9yeS5tZCkKKyogW0xpcXVpZCBkb2N1bWVudGF0aW9uIGZyb20gU2hvcGlmeV0oaHR0cDovL2RvY3Muc2hvcGlmeS5jb20vdGhlbWVzL2xpcXVpZC1iYXNpY3MpCisqIFtMaXF1aWQgV2lraSBhdCBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TaG9waWZ5L2xpcXVpZC93aWtpKQorKiBbV2Vic2l0ZV0oaHR0cDovL2xpcXVpZG1hcmt1cC5vcmcvKQorCisjIyBJbnRyb2R1Y3Rpb24KKworTGlxdWlkIGlzIGEgdGVtcGxhdGUgZW5naW5lIHdoaWNoIHdhcyB3cml0dGVuIHdpdGggdmVyeSBzcGVjaWZpYyByZXF1aXJlbWVudHM6CisKKyogSXQgaGFzIHRvIGhhdmUgYmVhdXRpZnVsIGFuZCBzaW1wbGUgbWFya3VwLiBUZW1wbGF0ZSBlbmdpbmVzIHdoaWNoIGRvbid0IHByb2R1Y2UgZ29vZCBsb29raW5nIG1hcmt1cCBhcmUgbm8gZnVuIHRvIHVzZS4KKyogSXQgbmVlZHMgdG8gYmUgbm9uIGV2YWxpbmcgYW5kIHNlY3VyZS4gTGlxdWlkIHRlbXBsYXRlcyBhcmUgbWFkZSBzbyB0aGF0IHVzZXJzIGNhbiBlZGl0IHRoZW0uIFlvdSBkb24ndCB3YW50IHRvIHJ1biBjb2RlIG9uIHlvdXIgc2VydmVyIHdoaWNoIHlvdXIgdXNlcnMgd3JvdGUuCisqIEl0IGhhcyB0byBiZSBzdGF0ZWxlc3MuIENvbXBpbGUgYW5kIHJlbmRlciBzdGVwcyBoYXZlIHRvIGJlIHNlcGFyYXRlIHNvIHRoYXQgdGhlIGV4cGVuc2l2ZSBwYXJzaW5nIGFuZCBjb21waWxpbmcgY2FuIGJlIGRvbmUgb25jZSBhbmQgbGF0ZXIgb24geW91IGNhbiBqdXN0IHJlbmRlciBpdCBwYXNzaW5nIGluIGEgaGFzaCB3aXRoIGxvY2FsIHZhcmlhYmxlcyBhbmQgb2JqZWN0cy4KKworIyMgV2h5IHlvdSBzaG91bGQgdXNlIExpcXVpZAorCisqIFlvdSB3YW50IHRvIGFsbG93IHlvdXIgdXNlcnMgdG8gZWRpdCB0aGUgYXBwZWFyYW5jZSBvZiB5b3VyIGFwcGxpY2F0aW9uIGJ1dCBkb24ndCB3YW50IHRoZW0gdG8gcnVuICoqaW5zZWN1cmUgY29kZSBvbiB5b3VyIHNlcnZlcioqLgorKiBZb3Ugd2FudCB0byByZW5kZXIgdGVtcGxhdGVzIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlLgorKiBZb3UgbGlrZSBzbWFydHkgKFBIUCkgc3R5bGUgdGVtcGxhdGUgZW5naW5lcy4KKyogWW91IG5lZWQgYSB0ZW1wbGF0ZSBlbmdpbmUgd2hpY2ggZG9lcyBIVE1MIGp1c3QgYXMgd2VsbCBhcyBlbWFpbHMuCisqIFlvdSBkb24ndCBsaWtlIHRoZSBtYXJrdXAgb2YgeW91ciBjdXJyZW50IHRlbXBsYXRpbmcgZW5naW5lLgorCisjIyBXaGF0IGRvZXMgaXQgbG9vayBsaWtlPworCitgYGBodG1sCis8dWwgaWQ9InByb2R1Y3RzIj4KKyAgeyUgZm9yIHByb2R1Y3QgaW4gcHJvZHVjdHMgJX0KKyAgICA8bGk+CisgICAgICA8aDI+e3sgcHJvZHVjdC5uYW1lIH19PC9oMj4KKyAgICAgIE9ubHkge3sgcHJvZHVjdC5wcmljZSB8IHByaWNlIH19CisKKyAgICAgIHt7IHByb2R1Y3QuZGVzY3JpcHRpb24gfCBwcmV0dHlwcmludCB8IHBhcmFncmFwaCB9fQorICAgIDwvbGk+CisgIHslIGVuZGZvciAlfQorPC91bD4KK2BgYAorCisjIyBIb3cgdG8gdXNlIExpcXVpZAorCitMaXF1aWQgc3VwcG9ydHMgYSB2ZXJ5IHNpbXBsZSBBUEkgYmFzZWQgYXJvdW5kIHRoZSBMaXF1aWQ6OlRlbXBsYXRlIGNsYXNzLgorRm9yIHN0YW5kYXJkIHVzZSB5b3UgY2FuIGp1c3QgcGFzcyBpdCB0aGUgY29udGVudCBvZiBhIGZpbGUgYW5kIGNhbGwgcmVuZGVyIHdpdGggYSBwYXJhbWV0ZXJzIGhhc2guCisKK2BgYHJ1YnkKK0B0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoImhpIHt7bmFtZX19IikgIyBQYXJzZXMgYW5kIGNvbXBpbGVzIHRoZSB0ZW1wbGF0ZQorQHRlbXBsYXRlLnJlbmRlcignbmFtZScgPT4gJ3RvYmknKSAgICAgICAgICAgICAgICAjID0+ICJoaSB0b2JpIgorYGBgCisKKyMjIyBFcnJvciBNb2RlcworCitTZXR0aW5nIHRoZSBlcnJvciBtb2RlIG9mIExpcXVpZCBsZXRzIHlvdSBzcGVjaWZ5IGhvdyBzdHJpY3RseSB5b3Ugd2FudCB5b3VyIHRlbXBsYXRlcyB0byBiZSBpbnRlcnByZXRlZC4KK05vcm1hbGx5IHRoZSBwYXJzZXIgaXMgdmVyeSBsYXggYW5kIHdpbGwgYWNjZXB0IGFsbW9zdCBhbnl0aGluZyB3aXRob3V0IGVycm9yLiBVbmZvcnR1bmF0ZWx5IHRoaXMgY2FuIG1ha2UKK2l0IHZlcnkgaGFyZCB0byBkZWJ1ZyBhbmQgY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvdXIuIAorCitMaXF1aWQgYWxzbyBjb21lcyB3aXRoIGEgc3RyaWN0ZXIgcGFyc2VyIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBlZGl0aW5nIHRlbXBsYXRlcyB0byBnaXZlIGJldHRlciBlcnJvciBtZXNzYWdlcword2hlbiB0ZW1wbGF0ZXMgYXJlIGludmFsaWQuIFlvdSBjYW4gZW5hYmxlIHRoaXMgbmV3IHBhcnNlciBsaWtlIHRoaXM6CisKK2BgYHJ1YnkKK0xpcXVpZDo6VGVtcGxhdGUuZXJyb3JfbW9kZSA9IDpzdHJpY3QgIyBSYWlzZXMgYSBTeW50YXhFcnJvciB3aGVuIGludmFsaWQgc3ludGF4IGlzIHVzZWQKK0xpcXVpZDo6VGVtcGxhdGUuZXJyb3JfbW9kZSA9IDp3YXJuICMgQWRkcyBlcnJvcnMgdG8gdGVtcGxhdGUuZXJyb3JzIGJ1dCBjb250aW51ZXMgYXMgbm9ybWFsCitMaXF1aWQ6OlRlbXBsYXRlLmVycm9yX21vZGUgPSA6bGF4ICMgVGhlIGRlZmF1bHQgbW9kZSwgYWNjZXB0cyBhbG1vc3QgYW55dGhpbmcuCitgYGAKKworSWYgeW91IHdhbnQgdG8gc2V0IHRoZSBlcnJvciBtb2RlIG9ubHkgb24gc3BlY2lmaWMgdGVtcGxhdGVzIHlvdSBjYW4gcGFzcyBgOmVycm9yX21vZGVgIGFzIGFuIG9wdGlvbiB0byBgcGFyc2VgOgorYGBgcnVieQorTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZShzb3VyY2UsIDplcnJvcl9tb2RlID0+IDpzdHJpY3QpCitgYGAKK1RoaXMgaXMgdXNlZnVsIGZvciBkb2luZyB0aGluZ3MgbGlrZSBlbmFibGluZyBzdHJpY3QgbW9kZSBvbmx5IGluIHRoZSB0aGVtZSBlZGl0b3IuCisKK0l0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGVuYWJsZSBgOnN0cmljdGAgb3IgYDp3YXJuYCBtb2RlIG9uIG5ldyBhcHBzIHRvIHN0b3AgaW52YWxpZCB0ZW1wbGF0ZXMgZnJvbSBiZWluZyBjcmVhdGVkLgorSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgaXQgaW4gdGhlIHRlbXBsYXRlIGVkaXRvcnMgb2YgZXhpc3RpbmcgYXBwcyB0byBnaXZlIGVkaXRvcnMgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLgorCisjIyMgVW5kZWZpbmVkIHZhcmlhYmxlcyBhbmQgZmlsdGVycworCitCeSBkZWZhdWx0LCB0aGUgcmVuZGVyZXIgZG9lc24ndCByYWlzZSBvciBpbiBhbnkgb3RoZXIgd2F5IG5vdGlmeSB5b3UgaWYgc29tZSB2YXJpYWJsZXMgb3IgZmlsdGVycyBhcmUgbWlzc2luZywgaS5lLiBub3QgcGFzc2VkIHRvIHRoZSBgcmVuZGVyYCBtZXRob2QuCitZb3UgY2FuIGltcHJvdmUgdGhpcyBzaXR1YXRpb24gYnkgcGFzc2luZyBgc3RyaWN0X3ZhcmlhYmxlczogdHJ1ZWAgYW5kL29yIGBzdHJpY3RfZmlsdGVyczogdHJ1ZWAgb3B0aW9ucyB0byB0aGUgYHJlbmRlcmAgbWV0aG9kLgorV2hlbiBvbmUgb2YgdGhlc2Ugb3B0aW9ucyBpcyBzZXQgdG8gdHJ1ZSwgYWxsIGVycm9ycyBhYm91dCB1bmRlZmluZWQgdmFyaWFibGVzIGFuZCB1bmRlZmluZWQgZmlsdGVycyB3aWxsIGJlIHN0b3JlZCBpbiBgZXJyb3JzYCBhcnJheSBvZiBhIGBMaXF1aWQ6OlRlbXBsYXRlYCBpbnN0YW5jZS4KK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKK2BgYHJ1YnkKK3RlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgie3t4fX0ge3t5fX0ge3t6LmF9fSB7e3ouYn19IikKK3RlbXBsYXRlLnJlbmRlcih7ICd4JyA9PiAxLCAneicgPT4geyAnYScgPT4gMiB9IH0sIHsgc3RyaWN0X3ZhcmlhYmxlczogdHJ1ZSB9KQorIz0+ICcxICAyICcgIyB3aGVuIGEgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCBpdCdzIHJlbmRlcmVkIGFzIG5pbAordGVtcGxhdGUuZXJyb3JzCisjPT4gWyM8TGlxdWlkOjpVbmRlZmluZWRWYXJpYWJsZTogTGlxdWlkIGVycm9yOiB1bmRlZmluZWQgdmFyaWFibGUgeT4sICM8TGlxdWlkOjpVbmRlZmluZWRWYXJpYWJsZTogTGlxdWlkIGVycm9yOiB1bmRlZmluZWQgdmFyaWFibGUgYj5dCitgYGAKKworYGBgcnVieQordGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7e3ggfCBmaWx0ZXIxIHwgdXBjYXNlfX0iKQordGVtcGxhdGUucmVuZGVyKHsgJ3gnID0+ICdmb28nIH0sIHsgc3RyaWN0X2ZpbHRlcnM6IHRydWUgfSkKKyM9PiAnJyAjIHdoZW4gYXQgbGVhc3Qgb25lIGZpbHRlciBpbiB0aGUgZmlsdGVyIGNoYWluIGlzIHVuZGVmaW5lZCwgYSB3aG9sZSBleHByZXNzaW9uIGlzIHJlbmRlcmVkIGFzIG5pbAordGVtcGxhdGUuZXJyb3JzCisjPT4gWyM8TGlxdWlkOjpVbmRlZmluZWRGaWx0ZXI6IExpcXVpZCBlcnJvcjogdW5kZWZpbmVkIGZpbHRlciBmaWx0ZXIxPl0KK2BgYAorCitJZiB5b3Ugd2FudCB0byByYWlzZSBvbiBhIGZpcnN0IGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHB1c2hpbmcgYWxsIG9mIHRoZW0gaW4gYGVycm9yc2AsIHlvdSBjYW4gdXNlIGByZW5kZXIhYCBtZXRob2Q6CisKK2BgYHJ1YnkKK3RlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgie3t4fX0ge3t5fX0iKQordGVtcGxhdGUucmVuZGVyISh7ICd4JyA9PiAxfSwgeyBzdHJpY3RfdmFyaWFibGVzOiB0cnVlIH0pCisjPT4gTGlxdWlkOjpVbmRlZmluZWRWYXJpYWJsZTogTGlxdWlkIGVycm9yOiB1bmRlZmluZWQgdmFyaWFibGUgeQorYGBgCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOWRhMjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC5yYgpAQCAtMCwwICsxLDc5IEBACisjIENvcHlyaWdodCAoYykgMjAwNSBUb2JpYXMgTHVldGtlCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisjIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisjIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyMgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisjIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCittb2R1bGUgTGlxdWlkCisgIEZpbHRlclNlcGFyYXRvciAgICAgICAgICAgICA9IC9cfC8KKyAgQXJndW1lbnRTZXBhcmF0b3IgICAgICAgICAgID0gJywnLmZyZWV6ZQorICBGaWx0ZXJBcmd1bWVudFNlcGFyYXRvciAgICAgPSAnOicuZnJlZXplCisgIFZhcmlhYmxlQXR0cmlidXRlU2VwYXJhdG9yICA9ICcuJy5mcmVlemUKKyAgV2hpdGVzcGFjZUNvbnRyb2wgICAgICAgICAgID0gJy0nLmZyZWV6ZQorICBUYWdTdGFydCAgICAgICAgICAgICAgICAgICAgPSAvXHtcJS8KKyAgVGFnRW5kICAgICAgICAgICAgICAgICAgICAgID0gL1wlXH0vCisgIFZhcmlhYmxlU2lnbmF0dXJlICAgICAgICAgICA9IC9cKD9bXHdcLVwuXFtcXV1cKT8vCisgIFZhcmlhYmxlU2VnbWVudCAgICAgICAgICAgICA9IC9bXHdcLV0vCisgIFZhcmlhYmxlU3RhcnQgICAgICAgICAgICAgICA9IC9ce1x7LworICBWYXJpYWJsZUVuZCAgICAgICAgICAgICAgICAgPSAvXH1cfS8KKyAgVmFyaWFibGVJbmNvbXBsZXRlRW5kICAgICAgID0gL1x9XH0/LworICBRdW90ZWRTdHJpbmcgICAgICAgICAgICAgICAgPSAvIlteIl0qInwnW14nXSonLworICBRdW90ZWRGcmFnbWVudCAgICAgICAgICAgICAgPSAvI3tRdW90ZWRTdHJpbmd9fCg/OlteXHMsXHwnIl18I3tRdW90ZWRTdHJpbmd9KSsvbworICBUYWdBdHRyaWJ1dGVzICAgICAgICAgICAgICAgPSAvKFx3KylccypcOlxzKigje1F1b3RlZEZyYWdtZW50fSkvbworICBBbnlTdGFydGluZ1RhZyAgICAgICAgICAgICAgPSAvI3tUYWdTdGFydH18I3tWYXJpYWJsZVN0YXJ0fS9vCisgIFBhcnRpYWxUZW1wbGF0ZVBhcnNlciAgICAgICA9IC8je1RhZ1N0YXJ0fS4qPyN7VGFnRW5kfXwje1ZhcmlhYmxlU3RhcnR9Lio/I3tWYXJpYWJsZUluY29tcGxldGVFbmR9L29tCisgIFRlbXBsYXRlUGFyc2VyICAgICAgICAgICAgICA9IC8oI3tQYXJ0aWFsVGVtcGxhdGVQYXJzZXJ9fCN7QW55U3RhcnRpbmdUYWd9KS9vbQorICBWYXJpYWJsZVBhcnNlciAgICAgICAgICAgICAgPSAvXFtbXlxdXStcXXwje1ZhcmlhYmxlU2VnbWVudH0rXD8/L28KKworICBzaW5nbGV0b25fY2xhc3Muc2VuZCg6YXR0cl9hY2Nlc3NvciwgOmNhY2hlX2NsYXNzZXMpCisgIHNlbGYuY2FjaGVfY2xhc3NlcyA9IHRydWUKK2VuZAorCityZXF1aXJlICJsaXF1aWQvdmVyc2lvbiIKK3JlcXVpcmUgJ2xpcXVpZC9sZXhlcicKK3JlcXVpcmUgJ2xpcXVpZC9wYXJzZXInCityZXF1aXJlICdsaXF1aWQvaTE4bicKK3JlcXVpcmUgJ2xpcXVpZC9kcm9wJworcmVxdWlyZSAnbGlxdWlkL3RhYmxlcm93bG9vcF9kcm9wJworcmVxdWlyZSAnbGlxdWlkL2Zvcmxvb3BfZHJvcCcKK3JlcXVpcmUgJ2xpcXVpZC9leHRlbnNpb25zJworcmVxdWlyZSAnbGlxdWlkL2Vycm9ycycKK3JlcXVpcmUgJ2xpcXVpZC9pbnRlcnJ1cHRzJworcmVxdWlyZSAnbGlxdWlkL3N0cmFpbmVyJworcmVxdWlyZSAnbGlxdWlkL2V4cHJlc3Npb24nCityZXF1aXJlICdsaXF1aWQvY29udGV4dCcKK3JlcXVpcmUgJ2xpcXVpZC9wYXJzZXJfc3dpdGNoaW5nJworcmVxdWlyZSAnbGlxdWlkL3RhZycKK3JlcXVpcmUgJ2xpcXVpZC9ibG9jaycKK3JlcXVpcmUgJ2xpcXVpZC9ibG9ja19ib2R5JworcmVxdWlyZSAnbGlxdWlkL2RvY3VtZW50JworcmVxdWlyZSAnbGlxdWlkL3ZhcmlhYmxlJworcmVxdWlyZSAnbGlxdWlkL3ZhcmlhYmxlX2xvb2t1cCcKK3JlcXVpcmUgJ2xpcXVpZC9yYW5nZV9sb29rdXAnCityZXF1aXJlICdsaXF1aWQvZmlsZV9zeXN0ZW0nCityZXF1aXJlICdsaXF1aWQvcmVzb3VyY2VfbGltaXRzJworcmVxdWlyZSAnbGlxdWlkL3RlbXBsYXRlJworcmVxdWlyZSAnbGlxdWlkL3N0YW5kYXJkZmlsdGVycycKK3JlcXVpcmUgJ2xpcXVpZC9jb25kaXRpb24nCityZXF1aXJlICdsaXF1aWQvdXRpbHMnCityZXF1aXJlICdsaXF1aWQvdG9rZW5pemVyJworcmVxdWlyZSAnbGlxdWlkL3BhcnNlX2NvbnRleHQnCisKKyMgTG9hZCBhbGwgdGhlIHRhZ3Mgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkKKyMKK0RpclsiI3tfX2Rpcl9ffS9saXF1aWQvdGFncy8qLnJiIl0uZWFjaCB7IHxmfCByZXF1aXJlIGYgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvYmxvY2sucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9ibG9jay5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQwNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvYmxvY2sucmIKQEAgLTAsMCArMSw2NyBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBCbG9jayA8IFRhZworICAgIGRlZiBpbml0aWFsaXplKHRhZ19uYW1lLCBtYXJrdXAsIG9wdGlvbnMpCisgICAgICBzdXBlcgorICAgICAgQGJsYW5rID0gdHJ1ZQorICAgIGVuZAorCisgICAgZGVmIHBhcnNlKHRva2VucykKKyAgICAgIEBib2R5ID0gQmxvY2tCb2R5Lm5ldworICAgICAgd2hpbGUgcGFyc2VfYm9keShAYm9keSwgdG9rZW5zKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVuZGVyKGNvbnRleHQpCisgICAgICBAYm9keS5yZW5kZXIoY29udGV4dCkKKyAgICBlbmQKKworICAgIGRlZiBibGFuaz8KKyAgICAgIEBibGFuaworICAgIGVuZAorCisgICAgZGVmIG5vZGVsaXN0CisgICAgICBAYm9keS5ub2RlbGlzdAorICAgIGVuZAorCisgICAgZGVmIHVua25vd25fdGFnKHRhZywgX3BhcmFtcywgX3Rva2VucykKKyAgICAgIGNhc2UgdGFnCisgICAgICB3aGVuICdlbHNlJy5mcmVlemUKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KHBhcnNlX2NvbnRleHQubG9jYWxlLnQoImVycm9ycy5zeW50YXgudW5leHBlY3RlZF9lbHNlIi5mcmVlemUsCisgICAgICAgICAgYmxvY2tfbmFtZTogYmxvY2tfbmFtZSkpCisgICAgICB3aGVuICdlbmQnLmZyZWV6ZQorICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcocGFyc2VfY29udGV4dC5sb2NhbGUudCgiZXJyb3JzLnN5bnRheC5pbnZhbGlkX2RlbGltaXRlciIuZnJlZXplLAorICAgICAgICAgIGJsb2NrX25hbWU6IGJsb2NrX25hbWUsCisgICAgICAgICAgYmxvY2tfZGVsaW1pdGVyOiBibG9ja19kZWxpbWl0ZXIpKQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcocGFyc2VfY29udGV4dC5sb2NhbGUudCgiZXJyb3JzLnN5bnRheC51bmtub3duX3RhZyIuZnJlZXplLCB0YWc6IHRhZykpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBibG9ja19uYW1lCisgICAgICBAdGFnX25hbWUKKyAgICBlbmQKKworICAgIGRlZiBibG9ja19kZWxpbWl0ZXIKKyAgICAgIEBibG9ja19kZWxpbWl0ZXIgfHw9ICJlbmQje2Jsb2NrX25hbWV9IgorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICBkZWYgcGFyc2VfYm9keShib2R5LCB0b2tlbnMpCisgICAgICBib2R5LnBhcnNlKHRva2VucywgcGFyc2VfY29udGV4dCkgZG8gfGVuZF90YWdfbmFtZSwgZW5kX3RhZ19wYXJhbXN8CisgICAgICAgIEBibGFuayAmJj0gYm9keS5ibGFuaz8KKworICAgICAgICByZXR1cm4gZmFsc2UgaWYgZW5kX3RhZ19uYW1lID09IGJsb2NrX2RlbGltaXRlcgorICAgICAgICB1bmxlc3MgZW5kX3RhZ19uYW1lCisgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KHBhcnNlX2NvbnRleHQubG9jYWxlLnQoImVycm9ycy5zeW50YXgudGFnX25ldmVyX2Nsb3NlZCIuZnJlZXplLCBibG9ja19uYW1lOiBibG9ja19uYW1lKSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyB0aGlzIHRhZyBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzeXN0ZW0KKyAgICAgICAgIyBwYXNzIGl0IHRvIHRoZSBjdXJyZW50IGJsb2NrIGZvciBzcGVjaWFsIGhhbmRsaW5nIG9yIGVycm9yIHJlcG9ydGluZworICAgICAgICB1bmtub3duX3RhZyhlbmRfdGFnX25hbWUsIGVuZF90YWdfcGFyYW1zLCB0b2tlbnMpCisgICAgICBlbmQKKworICAgICAgdHJ1ZQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvYmxvY2tfYm9keS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2Jsb2NrX2JvZHkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyYTRjOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2Jsb2NrX2JvZHkucmIKQEAgLTAsMCArMSwxMzkgQEAKK21vZHVsZSBMaXF1aWQKKyAgY2xhc3MgQmxvY2tCb2R5CisgICAgRnVsbFRva2VuID0gL1xBI3tUYWdTdGFydH0je1doaXRlc3BhY2VDb250cm9sfT9ccyooXHcrKVxzKiguKj8pI3tXaGl0ZXNwYWNlQ29udHJvbH0/I3tUYWdFbmR9XHovb20KKyAgICBDb250ZW50T2ZWYXJpYWJsZSA9IC9cQSN7VmFyaWFibGVTdGFydH0je1doaXRlc3BhY2VDb250cm9sfT8oLio/KSN7V2hpdGVzcGFjZUNvbnRyb2x9PyN7VmFyaWFibGVFbmR9XHovb20KKyAgICBUQUdTVEFSVCA9ICJ7JSIuZnJlZXplCisgICAgVkFSU1RBUlQgPSAie3siLmZyZWV6ZQorCisgICAgYXR0cl9yZWFkZXIgOm5vZGVsaXN0CisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgQG5vZGVsaXN0ID0gW10KKyAgICAgIEBibGFuayA9IHRydWUKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZSh0b2tlbml6ZXIsIHBhcnNlX2NvbnRleHQpCisgICAgICBwYXJzZV9jb250ZXh0LmxpbmVfbnVtYmVyID0gdG9rZW5pemVyLmxpbmVfbnVtYmVyCisgICAgICB3aGlsZSB0b2tlbiA9IHRva2VuaXplci5zaGlmdAorICAgICAgICB1bmxlc3MgdG9rZW4uZW1wdHk/CisgICAgICAgICAgY2FzZQorICAgICAgICAgIHdoZW4gdG9rZW4uc3RhcnRfd2l0aD8oVEFHU1RBUlQpCisgICAgICAgICAgICB3aGl0ZXNwYWNlX2hhbmRsZXIodG9rZW4sIHBhcnNlX2NvbnRleHQpCisgICAgICAgICAgICBpZiB0b2tlbiA9fiBGdWxsVG9rZW4KKyAgICAgICAgICAgICAgdGFnX25hbWUgPSAkMQorICAgICAgICAgICAgICBtYXJrdXAgPSAkMgorICAgICAgICAgICAgICAjIGZldGNoIHRoZSB0YWcgZnJvbSByZWdpc3RlcmVkIGJsb2NrcworICAgICAgICAgICAgICBpZiB0YWcgPSByZWdpc3RlcmVkX3RhZ3NbdGFnX25hbWVdCisgICAgICAgICAgICAgICAgbmV3X3RhZyA9IHRhZy5wYXJzZSh0YWdfbmFtZSwgbWFya3VwLCB0b2tlbml6ZXIsIHBhcnNlX2NvbnRleHQpCisgICAgICAgICAgICAgICAgQGJsYW5rICYmPSBuZXdfdGFnLmJsYW5rPworICAgICAgICAgICAgICAgIEBub2RlbGlzdCA8PCBuZXdfdGFnCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAjIGVuZCBwYXJzaW5nIGlmIHdlIHJlYWNoIGFuIHVua25vd24gdGFnIGFuZCBsZXQgdGhlIGNhbGxlciBkZWNpZGUKKyAgICAgICAgICAgICAgICAjIGRldGVybWluZSBob3cgdG8gcHJvY2VlZAorICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCB0YWdfbmFtZSwgbWFya3VwCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByYWlzZV9taXNzaW5nX3RhZ190ZXJtaW5hdG9yKHRva2VuLCBwYXJzZV9jb250ZXh0KQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgd2hlbiB0b2tlbi5zdGFydF93aXRoPyhWQVJTVEFSVCkKKyAgICAgICAgICAgIHdoaXRlc3BhY2VfaGFuZGxlcih0b2tlbiwgcGFyc2VfY29udGV4dCkKKyAgICAgICAgICAgIEBub2RlbGlzdCA8PCBjcmVhdGVfdmFyaWFibGUodG9rZW4sIHBhcnNlX2NvbnRleHQpCisgICAgICAgICAgICBAYmxhbmsgPSBmYWxzZQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIHBhcnNlX2NvbnRleHQudHJpbV93aGl0ZXNwYWNlCisgICAgICAgICAgICAgIHRva2VuLmxzdHJpcCEKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgcGFyc2VfY29udGV4dC50cmltX3doaXRlc3BhY2UgPSBmYWxzZQorICAgICAgICAgICAgQG5vZGVsaXN0IDw8IHRva2VuCisgICAgICAgICAgICBAYmxhbmsgJiY9ICEhKHRva2VuID1+IC9cQVxzKlx6LykKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIHBhcnNlX2NvbnRleHQubGluZV9udW1iZXIgPSB0b2tlbml6ZXIubGluZV9udW1iZXIKKyAgICAgIGVuZAorCisgICAgICB5aWVsZCBuaWwsIG5pbAorICAgIGVuZAorCisgICAgZGVmIHdoaXRlc3BhY2VfaGFuZGxlcih0b2tlbiwgcGFyc2VfY29udGV4dCkKKyAgICAgIGlmIHRva2VuWzJdID09IFdoaXRlc3BhY2VDb250cm9sCisgICAgICAgIHByZXZpb3VzX3Rva2VuID0gQG5vZGVsaXN0Lmxhc3QKKyAgICAgICAgaWYgcHJldmlvdXNfdG9rZW4uaXNfYT8gU3RyaW5nCisgICAgICAgICAgcHJldmlvdXNfdG9rZW4ucnN0cmlwIQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgcGFyc2VfY29udGV4dC50cmltX3doaXRlc3BhY2UgPSAodG9rZW5bLTNdID09IFdoaXRlc3BhY2VDb250cm9sKQorICAgIGVuZAorCisgICAgZGVmIGJsYW5rPworICAgICAgQGJsYW5rCisgICAgZW5kCisKKyAgICBkZWYgcmVuZGVyKGNvbnRleHQpCisgICAgICBvdXRwdXQgPSBbXQorICAgICAgY29udGV4dC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX3Njb3JlICs9IEBub2RlbGlzdC5sZW5ndGgKKworICAgICAgQG5vZGVsaXN0LmVhY2ggZG8gfHRva2VufAorICAgICAgICAjIEJyZWFrIG91dCBpZiB3ZSBoYXZlIGFueSB1bmhhbmRlZCBpbnRlcnJ1cHRzLgorICAgICAgICBicmVhayBpZiBjb250ZXh0LmludGVycnVwdD8KKworICAgICAgICBiZWdpbgorICAgICAgICAgICMgSWYgd2UgZ2V0IGFuIEludGVycnVwdCB0aGF0IG1lYW5zIHRoZSBibG9jayBtdXN0IHN0b3AgcHJvY2Vzc2luZy4gQW4KKyAgICAgICAgICAjIEludGVycnVwdCBpcyBhbnkgY29tbWFuZCB0aGF0IHN0b3BzIGJsb2NrIGV4ZWN1dGlvbiBzdWNoIGFzIHslIGJyZWFrICV9CisgICAgICAgICAgIyBvciB7JSBjb250aW51ZSAlfQorICAgICAgICAgIGlmIHRva2VuLmlzX2E/KENvbnRpbnVlKSB8fCB0b2tlbi5pc19hPyhCcmVhaykKKyAgICAgICAgICAgIGNvbnRleHQucHVzaF9pbnRlcnJ1cHQodG9rZW4uaW50ZXJydXB0KQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIG5vZGVfb3V0cHV0ID0gcmVuZGVyX25vZGUodG9rZW4sIGNvbnRleHQpCisKKyAgICAgICAgICB1bmxlc3MgdG9rZW4uaXNfYT8oQmxvY2spICYmIHRva2VuLmJsYW5rPworICAgICAgICAgICAgb3V0cHV0IDw8IG5vZGVfb3V0cHV0CisgICAgICAgICAgZW5kCisgICAgICAgIHJlc2N1ZSBNZW1vcnlFcnJvciA9PiBlCisgICAgICAgICAgcmFpc2UgZQorICAgICAgICByZXNjdWUgVW5kZWZpbmVkVmFyaWFibGUsIFVuZGVmaW5lZERyb3BNZXRob2QsIFVuZGVmaW5lZEZpbHRlciA9PiBlCisgICAgICAgICAgY29udGV4dC5oYW5kbGVfZXJyb3IoZSwgdG9rZW4ubGluZV9udW1iZXIsIHRva2VuLnJhdykKKyAgICAgICAgICBvdXRwdXQgPDwgbmlsCisgICAgICAgIHJlc2N1ZSA6OlN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICAgIG91dHB1dCA8PCBjb250ZXh0LmhhbmRsZV9lcnJvcihlLCB0b2tlbi5saW5lX251bWJlciwgdG9rZW4ucmF3KQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBvdXRwdXQuam9pbgorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIHJlbmRlcl9ub2RlKG5vZGUsIGNvbnRleHQpCisgICAgICBub2RlX291dHB1dCA9IChub2RlLnJlc3BvbmRfdG8/KDpyZW5kZXIpID8gbm9kZS5yZW5kZXIoY29udGV4dCkgOiBub2RlKQorICAgICAgbm9kZV9vdXRwdXQgPSBub2RlX291dHB1dC5pc19hPyhBcnJheSkgPyBub2RlX291dHB1dC5qb2luIDogbm9kZV9vdXRwdXQudG9fcworCisgICAgICBjb250ZXh0LnJlc291cmNlX2xpbWl0cy5yZW5kZXJfbGVuZ3RoICs9IG5vZGVfb3V0cHV0Lmxlbmd0aAorICAgICAgaWYgY29udGV4dC5yZXNvdXJjZV9saW1pdHMucmVhY2hlZD8KKyAgICAgICAgcmFpc2UgTWVtb3J5RXJyb3IubmV3KCJNZW1vcnkgbGltaXRzIGV4Y2VlZGVkIi5mcmVlemUpCisgICAgICBlbmQKKyAgICAgIG5vZGVfb3V0cHV0CisgICAgZW5kCisKKyAgICBkZWYgY3JlYXRlX3ZhcmlhYmxlKHRva2VuLCBwYXJzZV9jb250ZXh0KQorICAgICAgdG9rZW4uc2NhbihDb250ZW50T2ZWYXJpYWJsZSkgZG8gfGNvbnRlbnR8CisgICAgICAgIG1hcmt1cCA9IGNvbnRlbnQuZmlyc3QKKyAgICAgICAgcmV0dXJuIFZhcmlhYmxlLm5ldyhtYXJrdXAsIHBhcnNlX2NvbnRleHQpCisgICAgICBlbmQKKyAgICAgIHJhaXNlX21pc3NpbmdfdmFyaWFibGVfdGVybWluYXRvcih0b2tlbiwgcGFyc2VfY29udGV4dCkKKyAgICBlbmQKKworICAgIGRlZiByYWlzZV9taXNzaW5nX3RhZ190ZXJtaW5hdG9yKHRva2VuLCBwYXJzZV9jb250ZXh0KQorICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KHBhcnNlX2NvbnRleHQubG9jYWxlLnQoImVycm9ycy5zeW50YXgudGFnX3Rlcm1pbmF0aW9uIi5mcmVlemUsIHRva2VuOiB0b2tlbiwgdGFnX2VuZDogVGFnRW5kLmluc3BlY3QpKQorICAgIGVuZAorCisgICAgZGVmIHJhaXNlX21pc3NpbmdfdmFyaWFibGVfdGVybWluYXRvcih0b2tlbiwgcGFyc2VfY29udGV4dCkKKyAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldyhwYXJzZV9jb250ZXh0LmxvY2FsZS50KCJlcnJvcnMuc3ludGF4LnZhcmlhYmxlX3Rlcm1pbmF0aW9uIi5mcmVlemUsIHRva2VuOiB0b2tlbiwgdGFnX2VuZDogVmFyaWFibGVFbmQuaW5zcGVjdCkpCisgICAgZW5kCisKKyAgICBkZWYgcmVnaXN0ZXJlZF90YWdzCisgICAgICBUZW1wbGF0ZS50YWdzCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9jb25kaXRpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9jb25kaXRpb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3M2Y2YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2NvbmRpdGlvbi5yYgpAQCAtMCwwICsxLDEzMiBAQAorbW9kdWxlIExpcXVpZAorICAjIENvbnRhaW5lciBmb3IgbGlxdWlkIG5vZGVzIHdoaWNoIGNvbnZlbmllbnRseSB3cmFwcyBkZWNpc2lvbiBtYWtpbmcgbG9naWMKKyAgIworICAjIEV4YW1wbGU6CisgICMKKyAgIyAgIGMgPSBDb25kaXRpb24ubmV3KDEsICc9PScsIDEpCisgICMgICBjLmV2YWx1YXRlICM9PiB0cnVlCisgICMKKyAgY2xhc3MgQ29uZGl0aW9uICM6bm9kb2M6CisgICAgQEBvcGVyYXRvcnMgPSB7CisgICAgICAnPT0nLmZyZWV6ZSA9PiAtPihjb25kLCBsZWZ0LCByaWdodCkgeyAgY29uZC5zZW5kKDplcXVhbF92YXJpYWJsZXMsIGxlZnQsIHJpZ2h0KSB9LAorICAgICAgJyE9Jy5mcmVlemUgPT4gLT4oY29uZCwgbGVmdCwgcmlnaHQpIHsgIWNvbmQuc2VuZCg6ZXF1YWxfdmFyaWFibGVzLCBsZWZ0LCByaWdodCkgfSwKKyAgICAgICc8PicuZnJlZXplID0+IC0+KGNvbmQsIGxlZnQsIHJpZ2h0KSB7ICFjb25kLnNlbmQoOmVxdWFsX3ZhcmlhYmxlcywgbGVmdCwgcmlnaHQpIH0sCisgICAgICAnPCcuZnJlZXplICA9PiA6PCwKKyAgICAgICc+Jy5mcmVlemUgID0+IDo+LAorICAgICAgJz49Jy5mcmVlemUgPT4gOj49LAorICAgICAgJzw9Jy5mcmVlemUgPT4gOjw9LAorICAgICAgJ2NvbnRhaW5zJy5mcmVlemUgPT4gbGFtYmRhIGRvIHxjb25kLCBsZWZ0LCByaWdodHwKKyAgICAgICAgaWYgbGVmdCAmJiByaWdodCAmJiBsZWZ0LnJlc3BvbmRfdG8/KDppbmNsdWRlPykKKyAgICAgICAgICByaWdodCA9IHJpZ2h0LnRvX3MgaWYgbGVmdC5pc19hPyhTdHJpbmcpCisgICAgICAgICAgbGVmdC5pbmNsdWRlPyhyaWdodCkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZhbHNlCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgfQorCisgICAgZGVmIHNlbGYub3BlcmF0b3JzCisgICAgICBAQG9wZXJhdG9ycworICAgIGVuZAorCisgICAgYXR0cl9yZWFkZXIgOmF0dGFjaG1lbnQKKyAgICBhdHRyX2FjY2Vzc29yIDpsZWZ0LCA6b3BlcmF0b3IsIDpyaWdodAorCisgICAgZGVmIGluaXRpYWxpemUobGVmdCA9IG5pbCwgb3BlcmF0b3IgPSBuaWwsIHJpZ2h0ID0gbmlsKQorICAgICAgQGxlZnQgPSBsZWZ0CisgICAgICBAb3BlcmF0b3IgPSBvcGVyYXRvcgorICAgICAgQHJpZ2h0ID0gcmlnaHQKKyAgICAgIEBjaGlsZF9yZWxhdGlvbiAgPSBuaWwKKyAgICAgIEBjaGlsZF9jb25kaXRpb24gPSBuaWwKKyAgICBlbmQKKworICAgIGRlZiBldmFsdWF0ZShjb250ZXh0ID0gQ29udGV4dC5uZXcpCisgICAgICByZXN1bHQgPSBpbnRlcnByZXRfY29uZGl0aW9uKGxlZnQsIHJpZ2h0LCBvcGVyYXRvciwgY29udGV4dCkKKworICAgICAgY2FzZSBAY2hpbGRfcmVsYXRpb24KKyAgICAgIHdoZW4gOm9yCisgICAgICAgIHJlc3VsdCB8fCBAY2hpbGRfY29uZGl0aW9uLmV2YWx1YXRlKGNvbnRleHQpCisgICAgICB3aGVuIDphbmQKKyAgICAgICAgcmVzdWx0ICYmIEBjaGlsZF9jb25kaXRpb24uZXZhbHVhdGUoY29udGV4dCkKKyAgICAgIGVsc2UKKyAgICAgICAgcmVzdWx0CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBvcihjb25kaXRpb24pCisgICAgICBAY2hpbGRfcmVsYXRpb24gPSA6b3IKKyAgICAgIEBjaGlsZF9jb25kaXRpb24gPSBjb25kaXRpb24KKyAgICBlbmQKKworICAgIGRlZiBhbmQoY29uZGl0aW9uKQorICAgICAgQGNoaWxkX3JlbGF0aW9uID0gOmFuZAorICAgICAgQGNoaWxkX2NvbmRpdGlvbiA9IGNvbmRpdGlvbgorICAgIGVuZAorCisgICAgZGVmIGF0dGFjaChhdHRhY2htZW50KQorICAgICAgQGF0dGFjaG1lbnQgPSBhdHRhY2htZW50CisgICAgZW5kCisKKyAgICBkZWYgZWxzZT8KKyAgICAgIGZhbHNlCisgICAgZW5kCisKKyAgICBkZWYgaW5zcGVjdAorICAgICAgIiM8Q29uZGl0aW9uICN7W0BsZWZ0LCBAb3BlcmF0b3IsIEByaWdodF0uY29tcGFjdC5qb2luKCcgJy5mcmVlemUpfT4iCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgZXF1YWxfdmFyaWFibGVzKGxlZnQsIHJpZ2h0KQorICAgICAgaWYgbGVmdC5pc19hPyhMaXF1aWQ6OkV4cHJlc3Npb246Ok1ldGhvZExpdGVyYWwpCisgICAgICAgIGlmIHJpZ2h0LnJlc3BvbmRfdG8/KGxlZnQubWV0aG9kX25hbWUpCisgICAgICAgICAgcmV0dXJuIHJpZ2h0LnNlbmQobGVmdC5tZXRob2RfbmFtZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBuaWwKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgaWYgcmlnaHQuaXNfYT8oTGlxdWlkOjpFeHByZXNzaW9uOjpNZXRob2RMaXRlcmFsKQorICAgICAgICBpZiBsZWZ0LnJlc3BvbmRfdG8/KHJpZ2h0Lm1ldGhvZF9uYW1lKQorICAgICAgICAgIHJldHVybiBsZWZ0LnNlbmQocmlnaHQubWV0aG9kX25hbWUpCisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gbmlsCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGxlZnQgPT0gcmlnaHQKKyAgICBlbmQKKworICAgIGRlZiBpbnRlcnByZXRfY29uZGl0aW9uKGxlZnQsIHJpZ2h0LCBvcCwgY29udGV4dCkKKyAgICAgICMgSWYgdGhlIG9wZXJhdG9yIGlzIGVtcHR5IHRoaXMgbWVhbnMgdGhhdCB0aGUgZGVjaXNpb24gc3RhdGVtZW50IGlzIGp1c3QKKyAgICAgICMgYSBzaW5nbGUgdmFyaWFibGUuIFdlIGNhbiBqdXN0IHBvbGwgdGhpcyB2YXJpYWJsZSBmcm9tIHRoZSBjb250ZXh0IGFuZAorICAgICAgIyByZXR1cm4gdGhpcyBhcyB0aGUgcmVzdWx0LgorICAgICAgcmV0dXJuIGNvbnRleHQuZXZhbHVhdGUobGVmdCkgaWYgb3AubmlsPworCisgICAgICBsZWZ0ID0gY29udGV4dC5ldmFsdWF0ZShsZWZ0KQorICAgICAgcmlnaHQgPSBjb250ZXh0LmV2YWx1YXRlKHJpZ2h0KQorCisgICAgICBvcGVyYXRpb24gPSBzZWxmLmNsYXNzLm9wZXJhdG9yc1tvcF0gfHwgcmFpc2UoTGlxdWlkOjpBcmd1bWVudEVycm9yLm5ldygiVW5rbm93biBvcGVyYXRvciAje29wfSIpKQorCisgICAgICBpZiBvcGVyYXRpb24ucmVzcG9uZF90bz8oOmNhbGwpCisgICAgICAgIG9wZXJhdGlvbi5jYWxsKHNlbGYsIGxlZnQsIHJpZ2h0KQorICAgICAgZWxzaWYgbGVmdC5yZXNwb25kX3RvPyhvcGVyYXRpb24pICYmIHJpZ2h0LnJlc3BvbmRfdG8/KG9wZXJhdGlvbikKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBsZWZ0LnNlbmQob3BlcmF0aW9uLCByaWdodCkKKyAgICAgICAgcmVzY3VlIDo6QXJndW1lbnRFcnJvciA9PiBlCisgICAgICAgICAgcmFpc2UgTGlxdWlkOjpBcmd1bWVudEVycm9yLm5ldyhlLm1lc3NhZ2UpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGNsYXNzIEVsc2VDb25kaXRpb24gPCBDb25kaXRpb24KKyAgICBkZWYgZWxzZT8KKyAgICAgIHRydWUKKyAgICBlbmQKKworICAgIGRlZiBldmFsdWF0ZShfY29udGV4dCkKKyAgICAgIHRydWUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2NvbnRleHQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9jb250ZXh0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTIzNTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9jb250ZXh0LnJiCkBAIC0wLDAgKzEsMjI0IEBACittb2R1bGUgTGlxdWlkCisgICMgQ29udGV4dCBrZWVwcyB0aGUgdmFyaWFibGUgc3RhY2sgYW5kIHJlc29sdmVzIHZhcmlhYmxlcywgYXMgd2VsbCBhcyBrZXl3b3JkcworICAjCisgICMgICBjb250ZXh0Wyd2YXJpYWJsZSddID0gJ3Rlc3RpbmcnCisgICMgICBjb250ZXh0Wyd2YXJpYWJsZSddICM9PiAndGVzdGluZycKKyAgIyAgIGNvbnRleHRbJ3RydWUnXSAgICAgIz0+IHRydWUKKyAgIyAgIGNvbnRleHRbJzEwLjIyMzInXSAgIz0+IDEwLjIyMzIKKyAgIworICAjICAgY29udGV4dC5zdGFjayBkbworICAjICAgICAgY29udGV4dFsnYm9iJ10gPSAnYm9ic2VuJworICAjICAgZW5kCisgICMKKyAgIyAgIGNvbnRleHRbJ2JvYiddICAjPT4gbmlsICBjbGFzcyBDb250ZXh0CisgIGNsYXNzIENvbnRleHQKKyAgICBhdHRyX3JlYWRlciA6c2NvcGVzLCA6ZXJyb3JzLCA6cmVnaXN0ZXJzLCA6ZW52aXJvbm1lbnRzLCA6cmVzb3VyY2VfbGltaXRzCisgICAgYXR0cl9hY2Nlc3NvciA6ZXhjZXB0aW9uX3JlbmRlcmVyLCA6dGVtcGxhdGVfbmFtZSwgOnBhcnRpYWwsIDpnbG9iYWxfZmlsdGVyLCA6c3RyaWN0X3ZhcmlhYmxlcywgOnN0cmljdF9maWx0ZXJzCisKKyAgICBkZWYgaW5pdGlhbGl6ZShlbnZpcm9ubWVudHMgPSB7fSwgb3V0ZXJfc2NvcGUgPSB7fSwgcmVnaXN0ZXJzID0ge30sIHJldGhyb3dfZXJyb3JzID0gZmFsc2UsIHJlc291cmNlX2xpbWl0cyA9IG5pbCkKKyAgICAgIEBlbnZpcm9ubWVudHMgICAgID0gW2Vudmlyb25tZW50c10uZmxhdHRlbgorICAgICAgQHNjb3BlcyAgICAgICAgICAgPSBbKG91dGVyX3Njb3BlIHx8IHt9KV0KKyAgICAgIEByZWdpc3RlcnMgICAgICAgID0gcmVnaXN0ZXJzCisgICAgICBAZXJyb3JzICAgICAgICAgICA9IFtdCisgICAgICBAcGFydGlhbCAgICAgICAgICA9IGZhbHNlCisgICAgICBAc3RyaWN0X3ZhcmlhYmxlcyA9IGZhbHNlCisgICAgICBAcmVzb3VyY2VfbGltaXRzICA9IHJlc291cmNlX2xpbWl0cyB8fCBSZXNvdXJjZUxpbWl0cy5uZXcoVGVtcGxhdGUuZGVmYXVsdF9yZXNvdXJjZV9saW1pdHMpCisgICAgICBzcXVhc2hfaW5zdGFuY2VfYXNzaWduc193aXRoX2Vudmlyb25tZW50cworCisgICAgICBAdGhpc19zdGFja191c2VkID0gZmFsc2UKKworICAgICAgc2VsZi5leGNlcHRpb25fcmVuZGVyZXIgPSBUZW1wbGF0ZS5kZWZhdWx0X2V4Y2VwdGlvbl9yZW5kZXJlcgorICAgICAgaWYgcmV0aHJvd19lcnJvcnMKKyAgICAgICAgc2VsZi5leGNlcHRpb25fcmVuZGVyZXIgPSAtPihlKSB7IHJhaXNlIH0KKyAgICAgIGVuZAorCisgICAgICBAaW50ZXJydXB0cyA9IFtdCisgICAgICBAZmlsdGVycyA9IFtdCisgICAgICBAZ2xvYmFsX2ZpbHRlciA9IG5pbAorICAgIGVuZAorCisgICAgZGVmIHdhcm5pbmdzCisgICAgICBAd2FybmluZ3MgfHw9IFtdCisgICAgZW5kCisKKyAgICBkZWYgc3RyYWluZXIKKyAgICAgIEBzdHJhaW5lciB8fD0gU3RyYWluZXIuY3JlYXRlKHNlbGYsIEBmaWx0ZXJzKQorICAgIGVuZAorCisgICAgIyBBZGRzIGZpbHRlcnMgdG8gdGhpcyBjb250ZXh0LgorICAgICMKKyAgICAjIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHJlZ2lzdGVyIHRoZSBmaWx0ZXJzIHdpdGggdGhlIG1haW4gVGVtcGxhdGUgb2JqZWN0LiBzZWUgPHR0PlRlbXBsYXRlLnJlZ2lzdGVyX2ZpbHRlcjwvdHQ+CisgICAgIyBmb3IgdGhhdAorICAgIGRlZiBhZGRfZmlsdGVycyhmaWx0ZXJzKQorICAgICAgZmlsdGVycyA9IFtmaWx0ZXJzXS5mbGF0dGVuLmNvbXBhY3QKKyAgICAgIEBmaWx0ZXJzICs9IGZpbHRlcnMKKyAgICAgIEBzdHJhaW5lciA9IG5pbAorICAgIGVuZAorCisgICAgZGVmIGFwcGx5X2dsb2JhbF9maWx0ZXIob2JqKQorICAgICAgZ2xvYmFsX2ZpbHRlci5uaWw/ID8gb2JqIDogZ2xvYmFsX2ZpbHRlci5jYWxsKG9iaikKKyAgICBlbmQKKworICAgICMgYXJlIHRoZXJlIGFueSBub3QgaGFuZGxlZCBpbnRlcnJ1cHRzPworICAgIGRlZiBpbnRlcnJ1cHQ/CisgICAgICAhQGludGVycnVwdHMuZW1wdHk/CisgICAgZW5kCisKKyAgICAjIHB1c2ggYW4gaW50ZXJydXB0IHRvIHRoZSBzdGFjay4gdGhpcyBpbnRlcnJ1cHQgaXMgY29uc2lkZXJlZCBub3QgaGFuZGxlZC4KKyAgICBkZWYgcHVzaF9pbnRlcnJ1cHQoZSkKKyAgICAgIEBpbnRlcnJ1cHRzLnB1c2goZSkKKyAgICBlbmQKKworICAgICMgcG9wIGFuIGludGVycnVwdCBmcm9tIHRoZSBzdGFjaworICAgIGRlZiBwb3BfaW50ZXJydXB0CisgICAgICBAaW50ZXJydXB0cy5wb3AKKyAgICBlbmQKKworICAgIGRlZiBoYW5kbGVfZXJyb3IoZSwgbGluZV9udW1iZXIgPSBuaWwsIHJhd190b2tlbiA9IG5pbCkKKyAgICAgIGUgPSBpbnRlcm5hbF9lcnJvciB1bmxlc3MgZS5pc19hPyhMaXF1aWQ6OkVycm9yKQorICAgICAgZS50ZW1wbGF0ZV9uYW1lIHx8PSB0ZW1wbGF0ZV9uYW1lCisgICAgICBlLmxpbmVfbnVtYmVyIHx8PSBsaW5lX251bWJlcgorICAgICAgZXJyb3JzLnB1c2goZSkKKyAgICAgIGV4Y2VwdGlvbl9yZW5kZXJlci5jYWxsKGUpLnRvX3MKKyAgICBlbmQKKworICAgIGRlZiBpbnZva2UobWV0aG9kLCAqYXJncykKKyAgICAgIHN0cmFpbmVyLmludm9rZShtZXRob2QsICphcmdzKS50b19saXF1aWQKKyAgICBlbmQKKworICAgICMgUHVzaCBuZXcgbG9jYWwgc2NvcGUgb24gdGhlIHN0YWNrLiB1c2UgPHR0PkNvbnRleHQjc3RhY2s8L3R0PiBpbnN0ZWFkCisgICAgZGVmIHB1c2gobmV3X3Njb3BlID0ge30pCisgICAgICBAc2NvcGVzLnVuc2hpZnQobmV3X3Njb3BlKQorICAgICAgcmFpc2UgU3RhY2tMZXZlbEVycm9yLCAiTmVzdGluZyB0b28gZGVlcCIuZnJlZXplIGlmIEBzY29wZXMubGVuZ3RoID4gMTAwCisgICAgZW5kCisKKyAgICAjIE1lcmdlIGEgaGFzaCBvZiB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgbG9jYWwgc2NvcGUKKyAgICBkZWYgbWVyZ2UobmV3X3Njb3BlcykKKyAgICAgIEBzY29wZXNbMF0ubWVyZ2UhKG5ld19zY29wZXMpCisgICAgZW5kCisKKyAgICAjIFBvcCBmcm9tIHRoZSBzdGFjay4gdXNlIDx0dD5Db250ZXh0I3N0YWNrPC90dD4gaW5zdGVhZAorICAgIGRlZiBwb3AKKyAgICAgIHJhaXNlIENvbnRleHRFcnJvciBpZiBAc2NvcGVzLnNpemUgPT0gMQorICAgICAgQHNjb3Blcy5zaGlmdAorICAgIGVuZAorCisgICAgIyBQdXNoZXMgYSBuZXcgbG9jYWwgc2NvcGUgb24gdGhlIHN0YWNrLCBwb3BzIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrCisgICAgIworICAgICMgRXhhbXBsZToKKyAgICAjICAgY29udGV4dC5zdGFjayBkbworICAgICMgICAgICBjb250ZXh0Wyd2YXInXSA9ICdoaScKKyAgICAjICAgZW5kCisgICAgIworICAgICMgICBjb250ZXh0Wyd2YXJdICAjPT4gbmlsCisgICAgZGVmIHN0YWNrKG5ld19zY29wZSA9IG5pbCkKKyAgICAgIG9sZF9zdGFja191c2VkID0gQHRoaXNfc3RhY2tfdXNlZAorICAgICAgaWYgbmV3X3Njb3BlCisgICAgICAgIHB1c2gobmV3X3Njb3BlKQorICAgICAgICBAdGhpc19zdGFja191c2VkID0gdHJ1ZQorICAgICAgZWxzZQorICAgICAgICBAdGhpc19zdGFja191c2VkID0gZmFsc2UKKyAgICAgIGVuZAorCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgcG9wIGlmIEB0aGlzX3N0YWNrX3VzZWQKKyAgICAgIEB0aGlzX3N0YWNrX3VzZWQgPSBvbGRfc3RhY2tfdXNlZAorICAgIGVuZAorCisgICAgZGVmIGNsZWFyX2luc3RhbmNlX2Fzc2lnbnMKKyAgICAgIEBzY29wZXNbMF0gPSB7fQorICAgIGVuZAorCisgICAgIyBPbmx5IGFsbG93IFN0cmluZywgTnVtZXJpYywgSGFzaCwgQXJyYXksIFByb2MsIEJvb2xlYW4gb3IgPHR0PkxpcXVpZDo6RHJvcDwvdHQ+CisgICAgZGVmIFtdPShrZXksIHZhbHVlKQorICAgICAgdW5sZXNzIEB0aGlzX3N0YWNrX3VzZWQKKyAgICAgICAgQHRoaXNfc3RhY2tfdXNlZCA9IHRydWUKKyAgICAgICAgcHVzaCh7fSkKKyAgICAgIGVuZAorICAgICAgQHNjb3Blc1swXVtrZXldID0gdmFsdWUKKyAgICBlbmQKKworICAgICMgTG9vayB1cCB2YXJpYWJsZSwgZWl0aGVyIHJlc29sdmUgZGlyZWN0bHkgYWZ0ZXIgY29uc2lkZXJpbmcgdGhlIG5hbWUuIFdlIGNhbiBkaXJlY3RseSBoYW5kbGUKKyAgICAjIFN0cmluZ3MsIGRpZ2l0cywgZmxvYXRzIGFuZCBib29sZWFucyAodHJ1ZSxmYWxzZSkuCisgICAgIyBJZiBubyBtYXRjaCBpcyBtYWRlIHdlIGxvb2t1cCB0aGUgdmFyaWFibGUgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYW5kCisgICAgIyBsYXRlciBtb3ZlIHVwIHRvIHRoZSBwYXJlbnQgYmxvY2tzIHRvIHNlZSBpZiB3ZSBjYW4gcmVzb2x2ZSB0aGUgdmFyaWFibGUgc29tZXdoZXJlIHVwIHRoZSB0cmVlLgorICAgICMgU29tZSBzcGVjaWFsIGtleXdvcmRzIHJldHVybiBzeW1ib2xzLiBUaG9zZSBzeW1ib2xzIGFyZSB0byBiZSBjYWxsZWQgb24gdGhlIHJocyBvYmplY3QgaW4gZXhwcmVzc2lvbnMKKyAgICAjCisgICAgIyBFeGFtcGxlOgorICAgICMgICBwcm9kdWN0cyA9PSBlbXB0eSAjPT4gcHJvZHVjdHMuZW1wdHk/CisgICAgZGVmIFtdKGV4cHJlc3Npb24pCisgICAgICBldmFsdWF0ZShFeHByZXNzaW9uLnBhcnNlKGV4cHJlc3Npb24pKQorICAgIGVuZAorCisgICAgZGVmIGtleT8oa2V5KQorICAgICAgc2VsZltrZXldICE9IG5pbAorICAgIGVuZAorCisgICAgZGVmIGV2YWx1YXRlKG9iamVjdCkKKyAgICAgIG9iamVjdC5yZXNwb25kX3RvPyg6ZXZhbHVhdGUpID8gb2JqZWN0LmV2YWx1YXRlKHNlbGYpIDogb2JqZWN0CisgICAgZW5kCisKKyAgICAjIEZldGNoZXMgYW4gb2JqZWN0IHN0YXJ0aW5nIGF0IHRoZSBsb2NhbCBzY29wZSBhbmQgdGhlbiBtb3ZpbmcgdXAgdGhlIGhpZXJhY2h5CisgICAgZGVmIGZpbmRfdmFyaWFibGUoa2V5KQorICAgICAgIyBUaGlzIHdhcyBjaGFuZ2VkIGZyb20gZmluZCgpIHRvIGZpbmRfaW5kZXgoKSBiZWNhdXNlIHRoaXMgaXMgYSB2ZXJ5IGhvdAorICAgICAgIyBwYXRoIGFuZCBmaW5kX2luZGV4KCkgaXMgb3B0aW1pemVkIGluIE1SSSB0byByZWR1Y2Ugb2JqZWN0IGFsbG9jYXRpb24KKyAgICAgIGluZGV4ID0gQHNjb3Blcy5maW5kX2luZGV4IHsgfHN8IHMua2V5PyhrZXkpIH0KKyAgICAgIHNjb3BlID0gQHNjb3Blc1tpbmRleF0gaWYgaW5kZXgKKworICAgICAgdmFyaWFibGUgPSBuaWwKKworICAgICAgaWYgc2NvcGUubmlsPworICAgICAgICBAZW52aXJvbm1lbnRzLmVhY2ggZG8gfGV8CisgICAgICAgICAgdmFyaWFibGUgPSBsb29rdXBfYW5kX2V2YWx1YXRlKGUsIGtleSkKKyAgICAgICAgICB1bmxlc3MgdmFyaWFibGUubmlsPworICAgICAgICAgICAgc2NvcGUgPSBlCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzY29wZSB8fD0gQGVudmlyb25tZW50cy5sYXN0IHx8IEBzY29wZXMubGFzdAorICAgICAgdmFyaWFibGUgfHw9IGxvb2t1cF9hbmRfZXZhbHVhdGUoc2NvcGUsIGtleSkKKworICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZS50b19saXF1aWQKKyAgICAgIHZhcmlhYmxlLmNvbnRleHQgPSBzZWxmIGlmIHZhcmlhYmxlLnJlc3BvbmRfdG8/KDpjb250ZXh0PSkKKworICAgICAgdmFyaWFibGUKKyAgICBlbmQKKworICAgIGRlZiBsb29rdXBfYW5kX2V2YWx1YXRlKG9iaiwga2V5KQorICAgICAgaWYgQHN0cmljdF92YXJpYWJsZXMgJiYgb2JqLnJlc3BvbmRfdG8/KDprZXk/KSAmJiAhb2JqLmtleT8oa2V5KQorICAgICAgICByYWlzZSBMaXF1aWQ6OlVuZGVmaW5lZFZhcmlhYmxlLCAidW5kZWZpbmVkIHZhcmlhYmxlICN7a2V5fSIKKyAgICAgIGVuZAorCisgICAgICB2YWx1ZSA9IG9ialtrZXldCisKKyAgICAgIGlmIHZhbHVlLmlzX2E/KFByb2MpICYmIG9iai5yZXNwb25kX3RvPyg6W109KQorICAgICAgICBvYmpba2V5XSA9ICh2YWx1ZS5hcml0eSA9PSAwKSA/IHZhbHVlLmNhbGwgOiB2YWx1ZS5jYWxsKHNlbGYpCisgICAgICBlbHNlCisgICAgICAgIHZhbHVlCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBpbnRlcm5hbF9lcnJvcgorICAgICAgIyByYWlzZSBhbmQgY2F0Y2ggdG8gc2V0IGJhY2t0cmFjZSBhbmQgY2F1c2Ugb24gZXhjZXB0aW9uCisgICAgICByYWlzZSBMaXF1aWQ6OkludGVybmFsRXJyb3IsICdpbnRlcm5hbCcKKyAgICByZXNjdWUgTGlxdWlkOjpJbnRlcm5hbEVycm9yID0+IGV4YworICAgICAgZXhjCisgICAgZW5kCisKKyAgICBkZWYgc3F1YXNoX2luc3RhbmNlX2Fzc2lnbnNfd2l0aF9lbnZpcm9ubWVudHMKKyAgICAgIEBzY29wZXMubGFzdC5lYWNoX2tleSBkbyB8a3wKKyAgICAgICAgQGVudmlyb25tZW50cy5lYWNoIGRvIHxlbnZ8CisgICAgICAgICAgaWYgZW52LmtleT8oaykKKyAgICAgICAgICAgIHNjb3Blcy5sYXN0W2tdID0gbG9va3VwX2FuZF9ldmFsdWF0ZShlbnYsIGspCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZCAjIHNxdWFzaF9pbnN0YW5jZV9hc3NpZ25zX3dpdGhfZW52aXJvbm1lbnRzCisgIGVuZCAjIENvbnRleHQKK2VuZCAjIExpcXVpZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZG9jdW1lbnQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9kb2N1bWVudC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDM1ZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZG9jdW1lbnQucmIKQEAgLTAsMCArMSwyNyBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBEb2N1bWVudCA8IEJsb2NrQm9keQorICAgIGRlZiBzZWxmLnBhcnNlKHRva2VucywgcGFyc2VfY29udGV4dCkKKyAgICAgIGRvYyA9IG5ldworICAgICAgZG9jLnBhcnNlKHRva2VucywgcGFyc2VfY29udGV4dCkKKyAgICAgIGRvYworICAgIGVuZAorCisgICAgZGVmIHBhcnNlKHRva2VucywgcGFyc2VfY29udGV4dCkKKyAgICAgIHN1cGVyIGRvIHxlbmRfdGFnX25hbWUsIGVuZF90YWdfcGFyYW1zfAorICAgICAgICB1bmtub3duX3RhZyhlbmRfdGFnX25hbWUsIHBhcnNlX2NvbnRleHQpIGlmIGVuZF90YWdfbmFtZQorICAgICAgZW5kCisgICAgcmVzY3VlIFN5bnRheEVycm9yID0+IGUKKyAgICAgIGUubGluZV9udW1iZXIgfHw9IHBhcnNlX2NvbnRleHQubGluZV9udW1iZXIKKyAgICAgIHJhaXNlCisgICAgZW5kCisKKyAgICBkZWYgdW5rbm93bl90YWcodGFnLCBwYXJzZV9jb250ZXh0KQorICAgICAgY2FzZSB0YWcKKyAgICAgIHdoZW4gJ2Vsc2UnLmZyZWV6ZSwgJ2VuZCcuZnJlZXplCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldyhwYXJzZV9jb250ZXh0LmxvY2FsZS50KCJlcnJvcnMuc3ludGF4LnVuZXhwZWN0ZWRfb3V0ZXJfdGFnIi5mcmVlemUsIHRhZzogdGFnKSkKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KHBhcnNlX2NvbnRleHQubG9jYWxlLnQoImVycm9ycy5zeW50YXgudW5rbm93bl90YWciLmZyZWV6ZSwgdGFnOiB0YWcpKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9kcm9wLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZHJvcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjVhYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZHJvcC5yYgpAQCAtMCwwICsxLDc4IEBACityZXF1aXJlICdzZXQnCisKK21vZHVsZSBMaXF1aWQKKyAgIyBBIGRyb3AgaW4gbGlxdWlkIGlzIGEgY2xhc3Mgd2hpY2ggYWxsb3dzIHlvdSB0byBleHBvcnQgRE9NIGxpa2UgdGhpbmdzIHRvIGxpcXVpZC4KKyAgIyBNZXRob2RzIG9mIGRyb3BzIGFyZSBjYWxsYWJsZS4KKyAgIyBUaGUgbWFpbiB1c2UgZm9yIGxpcXVpZCBkcm9wcyBpcyB0byBpbXBsZW1lbnQgbGF6eSBsb2FkZWQgb2JqZWN0cy4KKyAgIyBJZiB5b3Ugd291bGQgbGlrZSB0byBtYWtlIGRhdGEgYXZhaWxhYmxlIHRvIHRoZSB3ZWIgZGVzaWduZXJzIHdoaWNoIHlvdSBkb24ndCB3YW50IGxvYWRlZCB1bmxlc3MgbmVlZGVkIHRoZW4KKyAgIyBhIGRyb3AgaXMgYSBncmVhdCB3YXkgdG8gZG8gdGhhdC4KKyAgIworICAjIEV4YW1wbGU6CisgICMKKyAgIyAgIGNsYXNzIFByb2R1Y3REcm9wIDwgTGlxdWlkOjpEcm9wCisgICMgICAgIGRlZiB0b3Bfc2FsZXMKKyAgIyAgICAgICBTaG9wLmN1cnJlbnQucHJvZHVjdHMuZmluZCg6YWxsLCA6b3JkZXIgPT4gJ3NhbGVzJywgOmxpbWl0ID0+IDEwICkKKyAgIyAgICAgZW5kCisgICMgICBlbmQKKyAgIworICAjICAgdG1wbCA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoICcgeyUgZm9yIHByb2R1Y3QgaW4gcHJvZHVjdC50b3Bfc2FsZXMgJX0ge3sgcHJvZHVjdC5uYW1lIH19IHslZW5kZm9yJX0gJyAgKQorICAjICAgdG1wbC5yZW5kZXIoJ3Byb2R1Y3QnID0+IFByb2R1Y3REcm9wLm5ldyApICMgd2lsbCBpbnZva2UgdG9wX3NhbGVzIHF1ZXJ5LgorICAjCisgICMgWW91ciBkcm9wIGNhbiBlaXRoZXIgaW1wbGVtZW50IHRoZSBtZXRob2RzIHNhbnMgYW55IHBhcmFtZXRlcnMKKyAgIyBvciBpbXBsZW1lbnQgdGhlIGxpcXVpZF9tZXRob2RfbWlzc2luZyhuYW1lKSBtZXRob2Qgd2hpY2ggaXMgYSBjYXRjaCBhbGwuCisgIGNsYXNzIERyb3AKKyAgICBhdHRyX3dyaXRlciA6Y29udGV4dAorCisgICAgIyBDYXRjaCBhbGwgZm9yIHRoZSBtZXRob2QKKyAgICBkZWYgbGlxdWlkX21ldGhvZF9taXNzaW5nKG1ldGhvZCkKKyAgICAgIHJldHVybiBuaWwgdW5sZXNzIEBjb250ZXh0ICYmIEBjb250ZXh0LnN0cmljdF92YXJpYWJsZXMKKyAgICAgIHJhaXNlIExpcXVpZDo6VW5kZWZpbmVkRHJvcE1ldGhvZCwgInVuZGVmaW5lZCBtZXRob2QgI3ttZXRob2R9IgorICAgIGVuZAorCisgICAgIyBjYWxsZWQgYnkgbGlxdWlkIHRvIGludm9rZSBhIGRyb3AKKyAgICBkZWYgaW52b2tlX2Ryb3AobWV0aG9kX29yX2tleSkKKyAgICAgIGlmIHNlbGYuY2xhc3MuaW52b2thYmxlPyhtZXRob2Rfb3Jfa2V5KQorICAgICAgICBzZW5kKG1ldGhvZF9vcl9rZXkpCisgICAgICBlbHNlCisgICAgICAgIGxpcXVpZF9tZXRob2RfbWlzc2luZyhtZXRob2Rfb3Jfa2V5KQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYga2V5PyhfbmFtZSkKKyAgICAgIHRydWUKKyAgICBlbmQKKworICAgIGRlZiBpbnNwZWN0CisgICAgICBzZWxmLmNsYXNzLnRvX3MKKyAgICBlbmQKKworICAgIGRlZiB0b19saXF1aWQKKyAgICAgIHNlbGYKKyAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICBzZWxmLmNsYXNzLm5hbWUKKyAgICBlbmQKKworICAgIGFsaWFzX21ldGhvZCA6W10sIDppbnZva2VfZHJvcAorCisgICAgIyBDaGVjayBmb3IgbWV0aG9kIGV4aXN0ZW5jZSB3aXRob3V0IGludm9raW5nIHJlc3BvbmRfdG8/LCB3aGljaCBjcmVhdGVzIHN5bWJvbHMKKyAgICBkZWYgc2VsZi5pbnZva2FibGU/KG1ldGhvZF9uYW1lKQorICAgICAgaW52b2thYmxlX21ldGhvZHMuaW5jbHVkZT8obWV0aG9kX25hbWUudG9fcykKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmludm9rYWJsZV9tZXRob2RzCisgICAgICBAaW52b2thYmxlX21ldGhvZHMgfHw9IGJlZ2luCisgICAgICAgIGJsYWNrbGlzdCA9IExpcXVpZDo6RHJvcC5wdWJsaWNfaW5zdGFuY2VfbWV0aG9kcyArIFs6ZWFjaF0KKworICAgICAgICBpZiBpbmNsdWRlPyhFbnVtZXJhYmxlKQorICAgICAgICAgIGJsYWNrbGlzdCArPSBFbnVtZXJhYmxlLnB1YmxpY19pbnN0YW5jZV9tZXRob2RzCisgICAgICAgICAgYmxhY2tsaXN0IC09IFs6c29ydCwgOmNvdW50LCA6Zmlyc3QsIDptaW4sIDptYXgsIDppbmNsdWRlP10KKyAgICAgICAgZW5kCisKKyAgICAgICAgd2hpdGVsaXN0ID0gWzp0b19saXF1aWRdICsgKHB1YmxpY19pbnN0YW5jZV9tZXRob2RzIC0gYmxhY2tsaXN0KQorICAgICAgICBTZXQubmV3KHdoaXRlbGlzdC5tYXAoJjp0b19zKSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZXJyb3JzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZXJyb3JzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmE1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9lcnJvcnMucmIKQEAgLTAsMCArMSw1NiBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBFcnJvciA8IDo6U3RhbmRhcmRFcnJvcgorICAgIGF0dHJfYWNjZXNzb3IgOmxpbmVfbnVtYmVyCisgICAgYXR0cl9hY2Nlc3NvciA6dGVtcGxhdGVfbmFtZQorICAgIGF0dHJfYWNjZXNzb3IgOm1hcmt1cF9jb250ZXh0CisKKyAgICBkZWYgdG9fcyh3aXRoX3ByZWZpeCA9IHRydWUpCisgICAgICBzdHIgPSAiIgorICAgICAgc3RyIDw8IG1lc3NhZ2VfcHJlZml4IGlmIHdpdGhfcHJlZml4CisgICAgICBzdHIgPDwgc3VwZXIoKQorCisgICAgICBpZiBtYXJrdXBfY29udGV4dAorICAgICAgICBzdHIgPDwgIiAiCisgICAgICAgIHN0ciA8PCBtYXJrdXBfY29udGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0cgorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIG1lc3NhZ2VfcHJlZml4CisgICAgICBzdHIgPSAiIgorICAgICAgaWYgaXNfYT8oU3ludGF4RXJyb3IpCisgICAgICAgIHN0ciA8PCAiTGlxdWlkIHN5bnRheCBlcnJvciIKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyIDw8ICJMaXF1aWQgZXJyb3IiCisgICAgICBlbmQKKworICAgICAgaWYgbGluZV9udW1iZXIKKyAgICAgICAgc3RyIDw8ICIgKCIKKyAgICAgICAgc3RyIDw8IHRlbXBsYXRlX25hbWUgPDwgIiAiIGlmIHRlbXBsYXRlX25hbWUKKyAgICAgICAgc3RyIDw8ICJsaW5lICIgPDwgbGluZV9udW1iZXIudG9fcyA8PCAiKSIKKyAgICAgIGVuZAorCisgICAgICBzdHIgPDwgIjogIgorICAgICAgc3RyCisgICAgZW5kCisgIGVuZAorCisgIEFyZ3VtZW50RXJyb3IgPSBDbGFzcy5uZXcoRXJyb3IpCisgIENvbnRleHRFcnJvciA9IENsYXNzLm5ldyhFcnJvcikKKyAgRmlsZVN5c3RlbUVycm9yID0gQ2xhc3MubmV3KEVycm9yKQorICBTdGFuZGFyZEVycm9yID0gQ2xhc3MubmV3KEVycm9yKQorICBTeW50YXhFcnJvciA9IENsYXNzLm5ldyhFcnJvcikKKyAgU3RhY2tMZXZlbEVycm9yID0gQ2xhc3MubmV3KEVycm9yKQorICBUYWludGVkRXJyb3IgPSBDbGFzcy5uZXcoRXJyb3IpCisgIE1lbW9yeUVycm9yID0gQ2xhc3MubmV3KEVycm9yKQorICBaZXJvRGl2aXNpb25FcnJvciA9IENsYXNzLm5ldyhFcnJvcikKKyAgRmxvYXREb21haW5FcnJvciA9IENsYXNzLm5ldyhFcnJvcikKKyAgVW5kZWZpbmVkVmFyaWFibGUgPSBDbGFzcy5uZXcoRXJyb3IpCisgIFVuZGVmaW5lZERyb3BNZXRob2QgPSBDbGFzcy5uZXcoRXJyb3IpCisgIFVuZGVmaW5lZEZpbHRlciA9IENsYXNzLm5ldyhFcnJvcikKKyAgTWV0aG9kT3ZlcnJpZGVFcnJvciA9IENsYXNzLm5ldyhFcnJvcikKKyAgSW50ZXJuYWxFcnJvciA9IENsYXNzLm5ldyhFcnJvcikKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZXhwcmVzc2lvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2V4cHJlc3Npb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyNWFlNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2V4cHJlc3Npb24ucmIKQEAgLTAsMCArMSw0NSBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBFeHByZXNzaW9uCisgICAgY2xhc3MgTWV0aG9kTGl0ZXJhbAorICAgICAgYXR0cl9yZWFkZXIgOm1ldGhvZF9uYW1lLCA6dG9fcworCisgICAgICBkZWYgaW5pdGlhbGl6ZShtZXRob2RfbmFtZSwgdG9fcykKKyAgICAgICAgQG1ldGhvZF9uYW1lID0gbWV0aG9kX25hbWUKKyAgICAgICAgQHRvX3MgPSB0b19zCisgICAgICBlbmQKKworICAgICAgZGVmIHRvX2xpcXVpZAorICAgICAgICB0b19zCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIExJVEVSQUxTID0geworICAgICAgbmlsID0+IG5pbCwgJ25pbCcuZnJlZXplID0+IG5pbCwgJ251bGwnLmZyZWV6ZSA9PiBuaWwsICcnLmZyZWV6ZSA9PiBuaWwsCisgICAgICAndHJ1ZScuZnJlZXplICA9PiB0cnVlLAorICAgICAgJ2ZhbHNlJy5mcmVlemUgPT4gZmFsc2UsCisgICAgICAnYmxhbmsnLmZyZWV6ZSA9PiBNZXRob2RMaXRlcmFsLm5ldyg6Ymxhbms/LCAnJykuZnJlZXplLAorICAgICAgJ2VtcHR5Jy5mcmVlemUgPT4gTWV0aG9kTGl0ZXJhbC5uZXcoOmVtcHR5PywgJycpLmZyZWV6ZQorICAgIH0KKworICAgIGRlZiBzZWxmLnBhcnNlKG1hcmt1cCkKKyAgICAgIGlmIExJVEVSQUxTLmtleT8obWFya3VwKQorICAgICAgICBMSVRFUkFMU1ttYXJrdXBdCisgICAgICBlbHNlCisgICAgICAgIGNhc2UgbWFya3VwCisgICAgICAgIHdoZW4gL1xBJyguKiknXHovbSAjIFNpbmdsZSBxdW90ZWQgc3RyaW5ncworICAgICAgICAgICQxCisgICAgICAgIHdoZW4gL1xBIiguKikiXHovbSAjIERvdWJsZSBxdW90ZWQgc3RyaW5ncworICAgICAgICAgICQxCisgICAgICAgIHdoZW4gL1xBKC0/XGQrKVx6LyAjIEludGVnZXIgYW5kIGZsb2F0cworICAgICAgICAgICQxLnRvX2kKKyAgICAgICAgd2hlbiAvXEFcKChcUyspXC5cLihcUyspXClcei8gIyBSYW5nZXMKKyAgICAgICAgICBSYW5nZUxvb2t1cC5wYXJzZSgkMSwgJDIpCisgICAgICAgIHdoZW4gL1xBKC0/XGRbXGRcLl0rKVx6LyAjIEZsb2F0cworICAgICAgICAgICQxLnRvX2YKKyAgICAgICAgZWxzZQorICAgICAgICAgIFZhcmlhYmxlTG9va3VwLnBhcnNlKG1hcmt1cCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2V4dGVuc2lvbnMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9leHRlbnNpb25zLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNWJjZWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9leHRlbnNpb25zLnJiCkBAIC0wLDAgKzEsNjggQEAKK3JlcXVpcmUgJ3RpbWUnCityZXF1aXJlICdkYXRlJworCitjbGFzcyBTdHJpbmcgIyA6bm9kb2M6CisgIGRlZiB0b19saXF1aWQKKyAgICBzZWxmCisgIGVuZAorZW5kCisKK2NsYXNzIEFycmF5ICMgOm5vZG9jOgorICBkZWYgdG9fbGlxdWlkCisgICAgc2VsZgorICBlbmQKK2VuZAorCitjbGFzcyBIYXNoICMgOm5vZG9jOgorICBkZWYgdG9fbGlxdWlkCisgICAgc2VsZgorICBlbmQKK2VuZAorCitjbGFzcyBOdW1lcmljICMgOm5vZG9jOgorICBkZWYgdG9fbGlxdWlkCisgICAgc2VsZgorICBlbmQKK2VuZAorCitjbGFzcyBSYW5nZSAjIDpub2RvYzoKKyAgZGVmIHRvX2xpcXVpZAorICAgIHNlbGYKKyAgZW5kCitlbmQKKworY2xhc3MgVGltZSAjIDpub2RvYzoKKyAgZGVmIHRvX2xpcXVpZAorICAgIHNlbGYKKyAgZW5kCitlbmQKKworY2xhc3MgRGF0ZVRpbWUgPCBEYXRlICMgOm5vZG9jOgorICBkZWYgdG9fbGlxdWlkCisgICAgc2VsZgorICBlbmQKK2VuZAorCitjbGFzcyBEYXRlICMgOm5vZG9jOgorICBkZWYgdG9fbGlxdWlkCisgICAgc2VsZgorICBlbmQKK2VuZAorCitjbGFzcyBUcnVlQ2xhc3MKKyAgZGVmIHRvX2xpcXVpZCAjIDpub2RvYzoKKyAgICBzZWxmCisgIGVuZAorZW5kCisKK2NsYXNzIEZhbHNlQ2xhc3MKKyAgZGVmIHRvX2xpcXVpZCAjIDpub2RvYzoKKyAgICBzZWxmCisgIGVuZAorZW5kCisKK2NsYXNzIE5pbENsYXNzCisgIGRlZiB0b19saXF1aWQgIyA6bm9kb2M6CisgICAgc2VsZgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZmlsZV9zeXN0ZW0ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9maWxlX3N5c3RlbS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2YxZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZmlsZV9zeXN0ZW0ucmIKQEAgLTAsMCArMSw3MyBAQAorbW9kdWxlIExpcXVpZAorICAjIEEgTGlxdWlkIGZpbGUgc3lzdGVtIGlzIGEgd2F5IHRvIGxldCB5b3VyIHRlbXBsYXRlcyByZXRyaWV2ZSBvdGhlciB0ZW1wbGF0ZXMgZm9yIHVzZSB3aXRoIHRoZSBpbmNsdWRlIHRhZy4KKyAgIworICAjIFlvdSBjYW4gaW1wbGVtZW50IHN1YmNsYXNzZXMgdGhhdCByZXRyaWV2ZSB0ZW1wbGF0ZXMgZnJvbSB0aGUgZGF0YWJhc2UsIGZyb20gdGhlIGZpbGUgc3lzdGVtIHVzaW5nIGEgZGlmZmVyZW50CisgICMgcGF0aCBzdHJ1Y3R1cmUsIHlvdSBjYW4gcHJvdmlkZSB0aGVtIGFzIGhhcmQtY29kZWQgaW5saW5lIHN0cmluZ3MsIG9yIGFueSBtYW5uZXIgdGhhdCB5b3Ugc2VlIGZpdC4KKyAgIworICAjIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgaW5zdGFuY2UgdmFyaWFibGVzLCBhcmd1bWVudHMsIG9yIG1ldGhvZHMgYXMgbmVlZGVkLgorICAjCisgICMgRXhhbXBsZToKKyAgIworICAjICAgTGlxdWlkOjpUZW1wbGF0ZS5maWxlX3N5c3RlbSA9IExpcXVpZDo6TG9jYWxGaWxlU3lzdGVtLm5ldyh0ZW1wbGF0ZV9wYXRoKQorICAjICAgbGlxdWlkID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSh0ZW1wbGF0ZSkKKyAgIworICAjIFRoaXMgd2lsbCBwYXJzZSB0aGUgdGVtcGxhdGUgd2l0aCBhIExvY2FsRmlsZVN5c3RlbSBpbXBsZW1lbnRhdGlvbiByb290ZWQgYXQgJ3RlbXBsYXRlX3BhdGgnLgorICBjbGFzcyBCbGFua0ZpbGVTeXN0ZW0KKyAgICAjIENhbGxlZCBieSBMaXF1aWQgdG8gcmV0cmlldmUgYSB0ZW1wbGF0ZSBmaWxlCisgICAgZGVmIHJlYWRfdGVtcGxhdGVfZmlsZShfdGVtcGxhdGVfcGF0aCkKKyAgICAgIHJhaXNlIEZpbGVTeXN0ZW1FcnJvciwgIlRoaXMgbGlxdWlkIGNvbnRleHQgZG9lcyBub3QgYWxsb3cgaW5jbHVkZXMuIgorICAgIGVuZAorICBlbmQKKworICAjIFRoaXMgaW1wbGVtZW50cyBhbiBhYnN0cmFjdCBmaWxlIHN5c3RlbSB3aGljaCByZXRyaWV2ZXMgdGVtcGxhdGUgZmlsZXMgbmFtZWQgaW4gYSBtYW5uZXIgc2ltaWxhciB0byBSYWlscyBwYXJ0aWFscywKKyAgIyBpZS4gd2l0aCB0aGUgdGVtcGxhdGUgbmFtZSBwcmVmaXhlZCB3aXRoIGFuIHVuZGVyc2NvcmUuIFRoZSBleHRlbnNpb24gIi5saXF1aWQiIGlzIGFsc28gYWRkZWQuCisgICMKKyAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgdGVtcGxhdGUgcGF0aHMgYXJlIG9ubHkgYWxsb3dlZCB0byBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3JlLgorICAjCisgICMgRXhhbXBsZToKKyAgIworICAjICAgZmlsZV9zeXN0ZW0gPSBMaXF1aWQ6OkxvY2FsRmlsZVN5c3RlbS5uZXcoIi9zb21lL3BhdGgiKQorICAjCisgICMgICBmaWxlX3N5c3RlbS5mdWxsX3BhdGgoIm15cGFydGlhbCIpICAgICAgICMgPT4gIi9zb21lL3BhdGgvX215cGFydGlhbC5saXF1aWQiCisgICMgICBmaWxlX3N5c3RlbS5mdWxsX3BhdGgoImRpci9teXBhcnRpYWwiKSAgICMgPT4gIi9zb21lL3BhdGgvZGlyL19teXBhcnRpYWwubGlxdWlkIgorICAjCisgICMgT3B0aW9uYWxseSBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHlvdSBjYW4gc3BlY2lmeSBhIGN1c3RvbSBwYXR0ZXJuIGZvciB0ZW1wbGF0ZSBmaWxlbmFtZXMuCisgICMgVGhlIEtlcm5lbDo6c3ByaW50ZiBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyB1c2VkLgorICAjIERlZmF1bHQgcGF0dGVybiBpcyAiXyVzLmxpcXVpZCIuCisgICMKKyAgIyBFeGFtcGxlOgorICAjCisgICMgICBmaWxlX3N5c3RlbSA9IExpcXVpZDo6TG9jYWxGaWxlU3lzdGVtLm5ldygiL3NvbWUvcGF0aCIsICIlcy5odG1sIikKKyAgIworICAjICAgZmlsZV9zeXN0ZW0uZnVsbF9wYXRoKCJpbmRleCIpICMgPT4gIi9zb21lL3BhdGgvaW5kZXguaHRtbCIKKyAgIworICBjbGFzcyBMb2NhbEZpbGVTeXN0ZW0KKyAgICBhdHRyX2FjY2Vzc29yIDpyb290CisKKyAgICBkZWYgaW5pdGlhbGl6ZShyb290LCBwYXR0ZXJuID0gIl8lcy5saXF1aWQiLmZyZWV6ZSkKKyAgICAgIEByb290ID0gcm9vdAorICAgICAgQHBhdHRlcm4gPSBwYXR0ZXJuCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF90ZW1wbGF0ZV9maWxlKHRlbXBsYXRlX3BhdGgpCisgICAgICBmdWxsX3BhdGggPSBmdWxsX3BhdGgodGVtcGxhdGVfcGF0aCkKKyAgICAgIHJhaXNlIEZpbGVTeXN0ZW1FcnJvciwgIk5vIHN1Y2ggdGVtcGxhdGUgJyN7dGVtcGxhdGVfcGF0aH0nIiB1bmxlc3MgRmlsZS5leGlzdD8oZnVsbF9wYXRoKQorCisgICAgICBGaWxlLnJlYWQoZnVsbF9wYXRoKQorICAgIGVuZAorCisgICAgZGVmIGZ1bGxfcGF0aCh0ZW1wbGF0ZV9wYXRoKQorICAgICAgcmFpc2UgRmlsZVN5c3RlbUVycm9yLCAiSWxsZWdhbCB0ZW1wbGF0ZSBuYW1lICcje3RlbXBsYXRlX3BhdGh9JyIgdW5sZXNzIHRlbXBsYXRlX3BhdGggPX4gL1xBW14uXC9dW2EtekEtWjAtOV9cL10rXHovCisKKyAgICAgIGZ1bGxfcGF0aCA9IGlmIHRlbXBsYXRlX3BhdGguaW5jbHVkZT8oJy8nLmZyZWV6ZSkKKyAgICAgICAgRmlsZS5qb2luKHJvb3QsIEZpbGUuZGlybmFtZSh0ZW1wbGF0ZV9wYXRoKSwgQHBhdHRlcm4gJSBGaWxlLmJhc2VuYW1lKHRlbXBsYXRlX3BhdGgpKQorICAgICAgZWxzZQorICAgICAgICBGaWxlLmpvaW4ocm9vdCwgQHBhdHRlcm4gJSB0ZW1wbGF0ZV9wYXRoKQorICAgICAgZW5kCisKKyAgICAgIHJhaXNlIEZpbGVTeXN0ZW1FcnJvciwgIklsbGVnYWwgdGVtcGxhdGUgcGF0aCAnI3tGaWxlLmV4cGFuZF9wYXRoKGZ1bGxfcGF0aCl9JyIgdW5sZXNzIEZpbGUuZXhwYW5kX3BhdGgoZnVsbF9wYXRoKS5zdGFydF93aXRoPyhGaWxlLmV4cGFuZF9wYXRoKHJvb3QpKQorCisgICAgICBmdWxsX3BhdGgKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2Zvcmxvb3BfZHJvcC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2Zvcmxvb3BfZHJvcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWIyZDFhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvZm9ybG9vcF9kcm9wLnJiCkBAIC0wLDAgKzEsNDIgQEAKK21vZHVsZSBMaXF1aWQKKyAgY2xhc3MgRm9ybG9vcERyb3AgPCBEcm9wCisgICAgZGVmIGluaXRpYWxpemUobmFtZSwgbGVuZ3RoLCBwYXJlbnRsb29wKQorICAgICAgQG5hbWUgPSBuYW1lCisgICAgICBAbGVuZ3RoID0gbGVuZ3RoCisgICAgICBAcGFyZW50bG9vcCA9IHBhcmVudGxvb3AKKyAgICAgIEBpbmRleCA9IDAKKyAgICBlbmQKKworICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6bGVuZ3RoLCA6cGFyZW50bG9vcAorCisgICAgZGVmIGluZGV4CisgICAgICBAaW5kZXggKyAxCisgICAgZW5kCisKKyAgICBkZWYgaW5kZXgwCisgICAgICBAaW5kZXgKKyAgICBlbmQKKworICAgIGRlZiByaW5kZXgKKyAgICAgIEBsZW5ndGggLSBAaW5kZXgKKyAgICBlbmQKKworICAgIGRlZiByaW5kZXgwCisgICAgICBAbGVuZ3RoIC0gQGluZGV4IC0gMQorICAgIGVuZAorCisgICAgZGVmIGZpcnN0CisgICAgICBAaW5kZXggPT0gMAorICAgIGVuZAorCisgICAgZGVmIGxhc3QKKyAgICAgIEBpbmRleCA9PSBAbGVuZ3RoIC0gMQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICBkZWYgaW5jcmVtZW50IQorICAgICAgQGluZGV4ICs9IDEKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2kxOG4ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9pMThuLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OThkNTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9pMThuLnJiCkBAIC0wLDAgKzEsMzkgQEAKK3JlcXVpcmUgJ3lhbWwnCisKK21vZHVsZSBMaXF1aWQKKyAgY2xhc3MgSTE4bgorICAgIERFRkFVTFRfTE9DQUxFID0gRmlsZS5qb2luKEZpbGUuZXhwYW5kX3BhdGgoX19kaXJfXyksICJsb2NhbGVzIiwgImVuLnltbCIpCisKKyAgICBUcmFuc2xhdGlvbkVycm9yID0gQ2xhc3MubmV3KFN0YW5kYXJkRXJyb3IpCisKKyAgICBhdHRyX3JlYWRlciA6cGF0aAorCisgICAgZGVmIGluaXRpYWxpemUocGF0aCA9IERFRkFVTFRfTE9DQUxFKQorICAgICAgQHBhdGggPSBwYXRoCisgICAgZW5kCisKKyAgICBkZWYgdHJhbnNsYXRlKG5hbWUsIHZhcnMgPSB7fSkKKyAgICAgIGludGVycG9sYXRlKGRlZXBfZmV0Y2hfdHJhbnNsYXRpb24obmFtZSksIHZhcnMpCisgICAgZW5kCisgICAgYWxpYXNfbWV0aG9kIDp0LCA6dHJhbnNsYXRlCisKKyAgICBkZWYgbG9jYWxlCisgICAgICBAbG9jYWxlIHx8PSBZQU1MLmxvYWRfZmlsZShAcGF0aCkKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBpbnRlcnBvbGF0ZShuYW1lLCB2YXJzKQorICAgICAgbmFtZS5nc3ViKC8lXHsoXHcrKVx9LykgZG8KKyAgICAgICAgIyByYWlzZSBUcmFuc2xhdGlvbkVycm9yLCAiVW5kZWZpbmVkIGtleSAjeyQxfSBmb3IgaW50ZXJwb2xhdGlvbiBpbiB0cmFuc2xhdGlvbiAje25hbWV9IiAgdW5sZXNzIHZhcnNbJDEudG9fc3ltXQorICAgICAgICAiI3t2YXJzWyQxLnRvX3N5bV19IgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgZGVlcF9mZXRjaF90cmFuc2xhdGlvbihuYW1lKQorICAgICAgbmFtZS5zcGxpdCgnLicuZnJlZXplKS5yZWR1Y2UobG9jYWxlKSBkbyB8bGV2ZWwsIGN1cnwKKyAgICAgICAgbGV2ZWxbY3VyXSBvciByYWlzZSBUcmFuc2xhdGlvbkVycm9yLCAiVHJhbnNsYXRpb24gZm9yICN7bmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gbG9jYWxlICN7cGF0aH0iCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2ludGVycnVwdHMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9pbnRlcnJ1cHRzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzU5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9pbnRlcnJ1cHRzLnJiCkBAIC0wLDAgKzEsMTYgQEAKK21vZHVsZSBMaXF1aWQKKyAgIyBBbiBpbnRlcnJ1cHQgaXMgYW55IGNvbW1hbmQgdGhhdCBicmVha3MgcHJvY2Vzc2luZyBvZiBhIGJsb2NrIChleDogYSBmb3IgbG9vcCkuCisgIGNsYXNzIEludGVycnVwdAorICAgIGF0dHJfcmVhZGVyIDptZXNzYWdlCisKKyAgICBkZWYgaW5pdGlhbGl6ZShtZXNzYWdlID0gbmlsKQorICAgICAgQG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICJpbnRlcnJ1cHQiLmZyZWV6ZQorICAgIGVuZAorICBlbmQKKworICAjIEludGVycnVwdCB0aGF0IGlzIHRocm93biB3aGVuZXZlciBhIHslIGJyZWFrICV9IGlzIGNhbGxlZC4KKyAgY2xhc3MgQnJlYWtJbnRlcnJ1cHQgPCBJbnRlcnJ1cHQ7IGVuZAorCisgICMgSW50ZXJydXB0IHRoYXQgaXMgdGhyb3duIHdoZW5ldmVyIGEgeyUgY29udGludWUgJX0gaXMgY2FsbGVkLgorICBjbGFzcyBDb250aW51ZUludGVycnVwdCA8IEludGVycnVwdDsgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2xleGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvbGV4ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmMjQyMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2xleGVyLnJiCkBAIC0wLDAgKzEsNTMgQEAKK3JlcXVpcmUgInN0cnNjYW4iCittb2R1bGUgTGlxdWlkCisgIGNsYXNzIExleGVyCisgICAgU1BFQ0lBTFMgPSB7CisgICAgICAnfCcuZnJlZXplID0+IDpwaXBlLAorICAgICAgJy4nLmZyZWV6ZSA9PiA6ZG90LAorICAgICAgJzonLmZyZWV6ZSA9PiA6Y29sb24sCisgICAgICAnLCcuZnJlZXplID0+IDpjb21tYSwKKyAgICAgICdbJy5mcmVlemUgPT4gOm9wZW5fc3F1YXJlLAorICAgICAgJ10nLmZyZWV6ZSA9PiA6Y2xvc2Vfc3F1YXJlLAorICAgICAgJygnLmZyZWV6ZSA9PiA6b3Blbl9yb3VuZCwKKyAgICAgICcpJy5mcmVlemUgPT4gOmNsb3NlX3JvdW5kLAorICAgICAgJz8nLmZyZWV6ZSA9PiA6cXVlc3Rpb24sCisgICAgICAnLScuZnJlZXplID0+IDpkYXNoCisgICAgfQorICAgIElERU5USUZJRVIgPSAvW2EtekEtWl9dW1x3LV0qXD8/LworICAgIFNJTkdMRV9TVFJJTkdfTElURVJBTCA9IC8nW15cJ10qJy8KKyAgICBET1VCTEVfU1RSSU5HX0xJVEVSQUwgPSAvIlteXCJdKiIvCisgICAgTlVNQkVSX0xJVEVSQUwgPSAvLT9cZCsoXC5cZCspPy8KKyAgICBET1RET1QgPSAvXC5cLi8KKyAgICBDT01QQVJJU09OX09QRVJBVE9SID0gLz09fCE9fDw+fDw9P3w+PT98Y29udGFpbnMvCisKKyAgICBkZWYgaW5pdGlhbGl6ZShpbnB1dCkKKyAgICAgIEBzcyA9IFN0cmluZ1NjYW5uZXIubmV3KGlucHV0LnJzdHJpcCkKKyAgICBlbmQKKworICAgIGRlZiB0b2tlbml6ZQorICAgICAgQG91dHB1dCA9IFtdCisKKyAgICAgIHVudGlsIEBzcy5lb3M/CisgICAgICAgIEBzcy5za2lwKC9ccyovKQorICAgICAgICB0b2sgPSBjYXNlCisgICAgICAgIHdoZW4gdCA9IEBzcy5zY2FuKENPTVBBUklTT05fT1BFUkFUT1IpIHRoZW4gWzpjb21wYXJpc29uLCB0XQorICAgICAgICB3aGVuIHQgPSBAc3Muc2NhbihTSU5HTEVfU1RSSU5HX0xJVEVSQUwpIHRoZW4gWzpzdHJpbmcsIHRdCisgICAgICAgIHdoZW4gdCA9IEBzcy5zY2FuKERPVUJMRV9TVFJJTkdfTElURVJBTCkgdGhlbiBbOnN0cmluZywgdF0KKyAgICAgICAgd2hlbiB0ID0gQHNzLnNjYW4oTlVNQkVSX0xJVEVSQUwpIHRoZW4gWzpudW1iZXIsIHRdCisgICAgICAgIHdoZW4gdCA9IEBzcy5zY2FuKElERU5USUZJRVIpIHRoZW4gWzppZCwgdF0KKyAgICAgICAgd2hlbiB0ID0gQHNzLnNjYW4oRE9URE9UKSB0aGVuIFs6ZG90ZG90LCB0XQorICAgICAgICBlbHNlCisgICAgICAgICAgYyA9IEBzcy5nZXRjaAorICAgICAgICAgIGlmIHMgPSBTUEVDSUFMU1tjXQorICAgICAgICAgICAgW3MsIGNdCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJVbmV4cGVjdGVkIGNoYXJhY3RlciAje2N9IgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgQG91dHB1dCA8PCB0b2sKKyAgICAgIGVuZAorCisgICAgICBAb3V0cHV0IDw8IFs6ZW5kX29mX3N0cmluZ10KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2xvY2FsZXMvZW4ueW1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvbG9jYWxlcy9lbi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyNTliZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL2xvY2FsZXMvZW4ueW1sCkBAIC0wLDAgKzEsMjYgQEAKKy0tLQorICBlcnJvcnM6CisgICAgc3ludGF4OgorICAgICAgdGFnX3VuZXhwZWN0ZWRfYXJnczogIlN5bnRheCBFcnJvciBpbiAnJXt0YWd9JyAtIFZhbGlkIHN5bnRheDogJXt0YWd9IgorICAgICAgYXNzaWduOiAiU3ludGF4IEVycm9yIGluICdhc3NpZ24nIC0gVmFsaWQgc3ludGF4OiBhc3NpZ24gW3Zhcl0gPSBbc291cmNlXSIKKyAgICAgIGNhcHR1cmU6ICJTeW50YXggRXJyb3IgaW4gJ2NhcHR1cmUnIC0gVmFsaWQgc3ludGF4OiBjYXB0dXJlIFt2YXJdIgorICAgICAgY2FzZTogIlN5bnRheCBFcnJvciBpbiAnY2FzZScgLSBWYWxpZCBzeW50YXg6IGNhc2UgW2NvbmRpdGlvbl0iCisgICAgICBjYXNlX2ludmFsaWRfd2hlbjogIlN5bnRheCBFcnJvciBpbiB0YWcgJ2Nhc2UnIC0gVmFsaWQgd2hlbiBjb25kaXRpb246IHslIHdoZW4gW2NvbmRpdGlvbl0gW29yIGNvbmRpdGlvbjIuLi5dICV9IgorICAgICAgY2FzZV9pbnZhbGlkX2Vsc2U6ICJTeW50YXggRXJyb3IgaW4gdGFnICdjYXNlJyAtIFZhbGlkIGVsc2UgY29uZGl0aW9uOiB7JSBlbHNlICV9IChubyBwYXJhbWV0ZXJzKSAiCisgICAgICBjeWNsZTogIlN5bnRheCBFcnJvciBpbiAnY3ljbGUnIC0gVmFsaWQgc3ludGF4OiBjeWNsZSBbbmFtZSA6XSB2YXIgWywgdmFyMiwgdmFyMyAuLi5dIgorICAgICAgZm9yOiAiU3ludGF4IEVycm9yIGluICdmb3IgbG9vcCcgLSBWYWxpZCBzeW50YXg6IGZvciBbaXRlbV0gaW4gW2NvbGxlY3Rpb25dIgorICAgICAgZm9yX2ludmFsaWRfaW46ICJGb3IgbG9vcHMgcmVxdWlyZSBhbiAnaW4nIGNsYXVzZSIKKyAgICAgIGZvcl9pbnZhbGlkX2F0dHJpYnV0ZTogIkludmFsaWQgYXR0cmlidXRlIGluIGZvciBsb29wLiBWYWxpZCBhdHRyaWJ1dGVzIGFyZSBsaW1pdCBhbmQgb2Zmc2V0IgorICAgICAgaWY6ICJTeW50YXggRXJyb3IgaW4gdGFnICdpZicgLSBWYWxpZCBzeW50YXg6IGlmIFtleHByZXNzaW9uXSIKKyAgICAgIGluY2x1ZGU6ICJFcnJvciBpbiB0YWcgJ2luY2x1ZGUnIC0gVmFsaWQgc3ludGF4OiBpbmNsdWRlICdbdGVtcGxhdGVdJyAod2l0aHxmb3IpIFtvYmplY3R8Y29sbGVjdGlvbl0iCisgICAgICB1bmtub3duX3RhZzogIlVua25vd24gdGFnICcle3RhZ30nIgorICAgICAgaW52YWxpZF9kZWxpbWl0ZXI6ICInZW5kJyBpcyBub3QgYSB2YWxpZCBkZWxpbWl0ZXIgZm9yICV7YmxvY2tfbmFtZX0gdGFncy4gdXNlICV7YmxvY2tfZGVsaW1pdGVyfSIKKyAgICAgIHVuZXhwZWN0ZWRfZWxzZTogIiV7YmxvY2tfbmFtZX0gdGFnIGRvZXMgbm90IGV4cGVjdCAnZWxzZScgdGFnIgorICAgICAgdW5leHBlY3RlZF9vdXRlcl90YWc6ICJVbmV4cGVjdGVkIG91dGVyICcle3RhZ30nIHRhZyIKKyAgICAgIHRhZ190ZXJtaW5hdGlvbjogIlRhZyAnJXt0b2tlbn0nIHdhcyBub3QgcHJvcGVybHkgdGVybWluYXRlZCB3aXRoIHJlZ2V4cDogJXt0YWdfZW5kfSIKKyAgICAgIHZhcmlhYmxlX3Rlcm1pbmF0aW9uOiAiVmFyaWFibGUgJyV7dG9rZW59JyB3YXMgbm90IHByb3Blcmx5IHRlcm1pbmF0ZWQgd2l0aCByZWdleHA6ICV7dGFnX2VuZH0iCisgICAgICB0YWdfbmV2ZXJfY2xvc2VkOiAiJyV7YmxvY2tfbmFtZX0nIHRhZyB3YXMgbmV2ZXIgY2xvc2VkIgorICAgICAgbWV0YV9zeW50YXhfZXJyb3I6ICJMaXF1aWQgc3ludGF4IGVycm9yOiAje2UubWVzc2FnZX0iCisgICAgICB0YWJsZV9yb3c6ICJTeW50YXggRXJyb3IgaW4gJ3RhYmxlX3JvdyBsb29wJyAtIFZhbGlkIHN5bnRheDogdGFibGVfcm93IFtpdGVtXSBpbiBbY29sbGVjdGlvbl0gY29scz0zIgorICAgIGFyZ3VtZW50OgorICAgICAgaW5jbHVkZTogIkFyZ3VtZW50IGVycm9yIGluIHRhZyAnaW5jbHVkZScgLSBJbGxlZ2FsIHRlbXBsYXRlIG5hbWUiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9wYXJzZV9jb250ZXh0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvcGFyc2VfY29udGV4dC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDk4NmRkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvcGFyc2VfY29udGV4dC5yYgpAQCAtMCwwICsxLDM3IEBACittb2R1bGUgTGlxdWlkCisgIGNsYXNzIFBhcnNlQ29udGV4dAorICAgIGF0dHJfYWNjZXNzb3IgOmxvY2FsZSwgOmxpbmVfbnVtYmVyLCA6dHJpbV93aGl0ZXNwYWNlCisgICAgYXR0cl9yZWFkZXIgOnBhcnRpYWwsIDp3YXJuaW5ncywgOmVycm9yX21vZGUKKworICAgIGRlZiBpbml0aWFsaXplKG9wdGlvbnMgPSB7fSkKKyAgICAgIEB0ZW1wbGF0ZV9vcHRpb25zID0gb3B0aW9ucyA/IG9wdGlvbnMuZHVwIDoge30KKyAgICAgIEBsb2NhbGUgPSBAdGVtcGxhdGVfb3B0aW9uc1s6bG9jYWxlXSB8fD0gSTE4bi5uZXcKKyAgICAgIEB3YXJuaW5ncyA9IFtdCisgICAgICBzZWxmLnBhcnRpYWwgPSBmYWxzZQorICAgIGVuZAorCisgICAgZGVmIFtdKG9wdGlvbl9rZXkpCisgICAgICBAb3B0aW9uc1tvcHRpb25fa2V5XQorICAgIGVuZAorCisgICAgZGVmIHBhcnRpYWw9KHZhbHVlKQorICAgICAgQHBhcnRpYWwgPSB2YWx1ZQorICAgICAgQG9wdGlvbnMgPSB2YWx1ZSA/IHBhcnRpYWxfb3B0aW9ucyA6IEB0ZW1wbGF0ZV9vcHRpb25zCisgICAgICBAZXJyb3JfbW9kZSA9IEBvcHRpb25zWzplcnJvcl9tb2RlXSB8fCBUZW1wbGF0ZS5lcnJvcl9tb2RlCisgICAgICB2YWx1ZQorICAgIGVuZAorCisgICAgZGVmIHBhcnRpYWxfb3B0aW9ucworICAgICAgQHBhcnRpYWxfb3B0aW9ucyB8fD0gYmVnaW4KKyAgICAgICAgZG9udF9wYXNzID0gQHRlbXBsYXRlX29wdGlvbnNbOmluY2x1ZGVfb3B0aW9uc19ibGFja2xpc3RdCisgICAgICAgIGlmIGRvbnRfcGFzcyA9PSB0cnVlCisgICAgICAgICAgeyBsb2NhbGU6IGxvY2FsZSB9CisgICAgICAgIGVsc2lmIGRvbnRfcGFzcy5pc19hPyhBcnJheSkKKyAgICAgICAgICBAdGVtcGxhdGVfb3B0aW9ucy5yZWplY3QgeyB8aywgdnwgZG9udF9wYXNzLmluY2x1ZGU/KGspIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIEB0ZW1wbGF0ZV9vcHRpb25zCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9wYXJzZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9wYXJzZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1NDM0MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3BhcnNlci5yYgpAQCAtMCwwICsxLDkwIEBACittb2R1bGUgTGlxdWlkCisgIGNsYXNzIFBhcnNlcgorICAgIGRlZiBpbml0aWFsaXplKGlucHV0KQorICAgICAgbCA9IExleGVyLm5ldyhpbnB1dCkKKyAgICAgIEB0b2tlbnMgPSBsLnRva2VuaXplCisgICAgICBAcCA9IDAgIyBwb2ludGVyIHRvIGN1cnJlbnQgbG9jYXRpb24KKyAgICBlbmQKKworICAgIGRlZiBqdW1wKHBvaW50KQorICAgICAgQHAgPSBwb2ludAorICAgIGVuZAorCisgICAgZGVmIGNvbnN1bWUodHlwZSA9IG5pbCkKKyAgICAgIHRva2VuID0gQHRva2Vuc1tAcF0KKyAgICAgIGlmIHR5cGUgJiYgdG9rZW5bMF0gIT0gdHlwZQorICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgIkV4cGVjdGVkICN7dHlwZX0gYnV0IGZvdW5kICN7QHRva2Vuc1tAcF0uZmlyc3R9IgorICAgICAgZW5kCisgICAgICBAcCArPSAxCisgICAgICB0b2tlblsxXQorICAgIGVuZAorCisgICAgIyBPbmx5IGNvbnN1bWVzIHRoZSB0b2tlbiBpZiBpdCBtYXRjaGVzIHRoZSB0eXBlCisgICAgIyBSZXR1cm5zIHRoZSB0b2tlbidzIGNvbnRlbnRzIGlmIGl0IHdhcyBjb25zdW1lZAorICAgICMgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGRlZiBjb25zdW1lPyh0eXBlKQorICAgICAgdG9rZW4gPSBAdG9rZW5zW0BwXQorICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyB0b2tlbiAmJiB0b2tlblswXSA9PSB0eXBlCisgICAgICBAcCArPSAxCisgICAgICB0b2tlblsxXQorICAgIGVuZAorCisgICAgIyBMaWtlIGNvbnN1bWU/IEV4Y2VwdCBmb3IgYW4gOmlkIHRva2VuIG9mIGEgY2VydGFpbiBuYW1lCisgICAgZGVmIGlkPyhzdHIpCisgICAgICB0b2tlbiA9IEB0b2tlbnNbQHBdCisgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHRva2VuICYmIHRva2VuWzBdID09IDppZAorICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyB0b2tlblsxXSA9PSBzdHIKKyAgICAgIEBwICs9IDEKKyAgICAgIHRva2VuWzFdCisgICAgZW5kCisKKyAgICBkZWYgbG9vayh0eXBlLCBhaGVhZCA9IDApCisgICAgICB0b2sgPSBAdG9rZW5zW0BwICsgYWhlYWRdCisgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHRvaworICAgICAgdG9rWzBdID09IHR5cGUKKyAgICBlbmQKKworICAgIGRlZiBleHByZXNzaW9uCisgICAgICB0b2tlbiA9IEB0b2tlbnNbQHBdCisgICAgICBpZiB0b2tlblswXSA9PSA6aWQKKyAgICAgICAgdmFyaWFibGVfc2lnbmF0dXJlCisgICAgICBlbHNpZiBbOnN0cmluZywgOm51bWJlcl0uaW5jbHVkZT8gdG9rZW5bMF0KKyAgICAgICAgY29uc3VtZQorICAgICAgZWxzaWYgdG9rZW4uZmlyc3QgPT0gOm9wZW5fcm91bmQKKyAgICAgICAgY29uc3VtZQorICAgICAgICBmaXJzdCA9IGV4cHJlc3Npb24KKyAgICAgICAgY29uc3VtZSg6ZG90ZG90KQorICAgICAgICBsYXN0ID0gZXhwcmVzc2lvbgorICAgICAgICBjb25zdW1lKDpjbG9zZV9yb3VuZCkKKyAgICAgICAgIigje2ZpcnN0fS4uI3tsYXN0fSkiCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiI3t0b2tlbn0gaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbiIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGFyZ3VtZW50CisgICAgICBzdHIgPSAiIgorICAgICAgIyBtaWdodCBiZSBhIGtleXdvcmQgYXJndW1lbnQgKGlkZW50aWZpZXI6IGV4cHJlc3Npb24pCisgICAgICBpZiBsb29rKDppZCkgJiYgbG9vayg6Y29sb24sIDEpCisgICAgICAgIHN0ciA8PCBjb25zdW1lIDw8IGNvbnN1bWUgPDwgJyAnLmZyZWV6ZQorICAgICAgZW5kCisKKyAgICAgIHN0ciA8PCBleHByZXNzaW9uCisgICAgICBzdHIKKyAgICBlbmQKKworICAgIGRlZiB2YXJpYWJsZV9zaWduYXR1cmUKKyAgICAgIHN0ciA9IGNvbnN1bWUoOmlkKQorICAgICAgd2hpbGUgbG9vayg6b3Blbl9zcXVhcmUpCisgICAgICAgIHN0ciA8PCBjb25zdW1lCisgICAgICAgIHN0ciA8PCBleHByZXNzaW9uCisgICAgICAgIHN0ciA8PCBjb25zdW1lKDpjbG9zZV9zcXVhcmUpCisgICAgICBlbmQKKyAgICAgIGlmIGxvb2soOmRvdCkKKyAgICAgICAgc3RyIDw8IGNvbnN1bWUKKyAgICAgICAgc3RyIDw8IHZhcmlhYmxlX3NpZ25hdHVyZQorICAgICAgZW5kCisgICAgICBzdHIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3BhcnNlcl9zd2l0Y2hpbmcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9wYXJzZXJfc3dpdGNoaW5nLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYTY2NGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9wYXJzZXJfc3dpdGNoaW5nLnJiCkBAIC0wLDAgKzEsMzEgQEAKK21vZHVsZSBMaXF1aWQKKyAgbW9kdWxlIFBhcnNlclN3aXRjaGluZworICAgIGRlZiBwYXJzZV93aXRoX3NlbGVjdGVkX3BhcnNlcihtYXJrdXApCisgICAgICBjYXNlIHBhcnNlX2NvbnRleHQuZXJyb3JfbW9kZQorICAgICAgd2hlbiA6c3RyaWN0IHRoZW4gc3RyaWN0X3BhcnNlX3dpdGhfZXJyb3JfY29udGV4dChtYXJrdXApCisgICAgICB3aGVuIDpsYXggICAgdGhlbiBsYXhfcGFyc2UobWFya3VwKQorICAgICAgd2hlbiA6d2FybgorICAgICAgICBiZWdpbgorICAgICAgICAgIHJldHVybiBzdHJpY3RfcGFyc2Vfd2l0aF9lcnJvcl9jb250ZXh0KG1hcmt1cCkKKyAgICAgICAgcmVzY3VlIFN5bnRheEVycm9yID0+IGUKKyAgICAgICAgICBwYXJzZV9jb250ZXh0Lndhcm5pbmdzIDw8IGUKKyAgICAgICAgICByZXR1cm4gbGF4X3BhcnNlKG1hcmt1cCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBzdHJpY3RfcGFyc2Vfd2l0aF9lcnJvcl9jb250ZXh0KG1hcmt1cCkKKyAgICAgIHN0cmljdF9wYXJzZShtYXJrdXApCisgICAgcmVzY3VlIFN5bnRheEVycm9yID0+IGUKKyAgICAgIGUubGluZV9udW1iZXIgPSBsaW5lX251bWJlcgorICAgICAgZS5tYXJrdXBfY29udGV4dCA9IG1hcmt1cF9jb250ZXh0KG1hcmt1cCkKKyAgICAgIHJhaXNlIGUKKyAgICBlbmQKKworICAgIGRlZiBtYXJrdXBfY29udGV4dChtYXJrdXApCisgICAgICAiaW4gXCIje21hcmt1cC5zdHJpcH1cIiIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3Byb2ZpbGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvcHJvZmlsZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5ZGI2MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3Byb2ZpbGVyLnJiCkBAIC0wLDAgKzEsMTU4IEBACityZXF1aXJlICdsaXF1aWQvcHJvZmlsZXIvaG9va3MnCisKK21vZHVsZSBMaXF1aWQKKyAgIyBQcm9maWxlciBlbmFibGVzIHN1cHBvcnQgZm9yIHByb2ZpbGluZyB0ZW1wbGF0ZSByZW5kZXJpbmcgdG8gaGVscCB0cmFjayBkb3duIHBlcmZvcm1hbmNlIGlzc3Vlcy4KKyAgIworICAjIFRvIGVuYWJsZSBwcm9maWxpbmcsIGZpcnN0IHJlcXVpcmUgJ2xpcXVpZC9wcm9maWxlcicuCisgICMgVGhlbiwgdG8gcHJvZmlsZSBhIHBhcnNlL3JlbmRlciBjeWNsZSwgcGFzcyB0aGUgPHR0PnByb2ZpbGU6IHRydWU8L3R0PiBvcHRpb24gdG8gPHR0PkxpcXVpZDo6VGVtcGxhdGUucGFyc2U8L3R0Pi4KKyAgIyBBZnRlciA8dHQ+TGlxdWlkOjpUZW1wbGF0ZSNyZW5kZXI8L3R0PiBpcyBjYWxsZWQsIHRoZSB0ZW1wbGF0ZSBvYmplY3QgbWFrZXMgYXZhaWxhYmxlIGFuIGluc3RhbmNlIG9mIHRoaXMKKyAgIyBjbGFzcyB2aWEgdGhlIDx0dD5MaXF1aWQ6OlRlbXBsYXRlI3Byb2ZpbGVyPC90dD4gbWV0aG9kLgorICAjCisgICMgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UodGVtcGxhdGVfY29udGVudCwgcHJvZmlsZTogdHJ1ZSkKKyAgIyAgIG91dHB1dCAgPSB0ZW1wbGF0ZS5yZW5kZXIKKyAgIyAgIHByb2ZpbGUgPSB0ZW1wbGF0ZS5wcm9maWxlcgorICAjCisgICMgVGhpcyBvYmplY3QgY29udGFpbnMgYWxsIHByb2ZpbGluZyBpbmZvcm1hdGlvbiwgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiB3aGF0IHRhZ3Mgd2VyZSByZW5kZXJlZCwKKyAgIyB3aGVyZSBpbiB0aGUgdGVtcGxhdGVzIHRoZXNlIHRhZ3MgbGl2ZSwgYW5kIGhvdyBsb25nIGVhY2ggdGFnIHRvb2sgdG8gcmVuZGVyLgorICAjCisgICMgVGhpcyBpcyBhIHRyZWUgc3RydWN0dXJlIHRoYXQgaXMgRW51bWVyYWJsZSBhbGwgdGhlIHdheSBkb3duLCBhbmQga2VlcHMgdHJhY2sgb2YgdGFncyBhbmQgcmVuZGVyaW5nIHRpbWVzCisgICMgaW5zaWRlIG9mIDx0dD57JSBpbmNsdWRlICV9PC90dD4gdGFncy4KKyAgIworICAjICAgcHJvZmlsZS5lYWNoIGRvIHxub2RlfAorICAjICAgICAjIEFjY2VzcyB0byB0aGUgbm9kZSBpdHNlbGYKKyAgIyAgICAgbm9kZS5jb2RlCisgICMKKyAgIyAgICAgIyBXaGljaCB0ZW1wbGF0ZSBhbmQgbGluZSBudW1iZXIgb2YgdGhpcyBub2RlLgorICAjICAgICAjIElmIHRvcCBsZXZlbCwgdGhpcyB3aWxsIGJlICI8cm9vdD4iLgorICAjICAgICBub2RlLnBhcnRpYWwKKyAgIyAgICAgbm9kZS5saW5lX251bWJlcgorICAjCisgICMgICAgICMgUmVuZGVyIHRpbWUgaW4gc2Vjb25kcyBvZiB0aGlzIG5vZGUKKyAgIyAgICAgbm9kZS5yZW5kZXJfdGltZQorICAjCisgICMgICAgICMgSWYgdGhlIHRlbXBsYXRlIHVzZWQgeyUgaW5jbHVkZSAlfSwgdGhpcyBub2RlIHdpbGwgYWxzbyBoYXZlIGNoaWxkcmVuLgorICAjICAgICBub2RlLmNoaWxkcmVuLmVhY2ggZG8gfGNoaWxkMnwKKyAgIyAgICAgICAjIC4uLgorICAjICAgICBlbmQKKyAgIyAgIGVuZAorICAjCisgICMgUHJvZmlsZXIgYWxzbyBleHBvc2VzIHRoZSB0b3RhbCB0aW1lIG9mIHRoZSB0ZW1wbGF0ZSdzIHJlbmRlciBpbiA8dHQ+TGlxdWlkOjpQcm9maWxlciN0b3RhbF9yZW5kZXJfdGltZTwvdHQ+LgorICAjCisgICMgQWxsIHJlbmRlciB0aW1lcyBhcmUgaW4gc2Vjb25kcy4gVGhlcmUgaXMgYSBzbWFsbCBwZXJmb3JtYW5jZSBoaXQgd2hlbiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KKyAgIworICBjbGFzcyBQcm9maWxlcgorICAgIGluY2x1ZGUgRW51bWVyYWJsZQorCisgICAgY2xhc3MgVGltaW5nCisgICAgICBhdHRyX3JlYWRlciA6Y29kZSwgOnBhcnRpYWwsIDpsaW5lX251bWJlciwgOmNoaWxkcmVuCisKKyAgICAgIGRlZiBpbml0aWFsaXplKG5vZGUsIHBhcnRpYWwpCisgICAgICAgIEBjb2RlICAgICAgICA9IG5vZGUucmVzcG9uZF90bz8oOnJhdykgPyBub2RlLnJhdyA6IG5vZGUKKyAgICAgICAgQHBhcnRpYWwgICAgID0gcGFydGlhbAorICAgICAgICBAbGluZV9udW1iZXIgPSBub2RlLnJlc3BvbmRfdG8/KDpsaW5lX251bWJlcikgPyBub2RlLmxpbmVfbnVtYmVyIDogbmlsCisgICAgICAgIEBjaGlsZHJlbiAgICA9IFtdCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuc3RhcnQobm9kZSwgcGFydGlhbCkKKyAgICAgICAgbmV3KG5vZGUsIHBhcnRpYWwpLnRhcCgmOnN0YXJ0KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdGFydAorICAgICAgICBAc3RhcnRfdGltZSA9IFRpbWUubm93CisgICAgICBlbmQKKworICAgICAgZGVmIGZpbmlzaAorICAgICAgICBAZW5kX3RpbWUgPSBUaW1lLm5vdworICAgICAgZW5kCisKKyAgICAgIGRlZiByZW5kZXJfdGltZQorICAgICAgICBAZW5kX3RpbWUgLSBAc3RhcnRfdGltZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5wcm9maWxlX25vZGVfcmVuZGVyKG5vZGUpCisgICAgICBpZiBQcm9maWxlci5jdXJyZW50X3Byb2ZpbGUgJiYgbm9kZS5yZXNwb25kX3RvPyg6cmVuZGVyKQorICAgICAgICBQcm9maWxlci5jdXJyZW50X3Byb2ZpbGUuc3RhcnRfbm9kZShub2RlKQorICAgICAgICBvdXRwdXQgPSB5aWVsZAorICAgICAgICBQcm9maWxlci5jdXJyZW50X3Byb2ZpbGUuZW5kX25vZGUobm9kZSkKKyAgICAgICAgb3V0cHV0CisgICAgICBlbHNlCisgICAgICAgIHlpZWxkCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLnByb2ZpbGVfY2hpbGRyZW4odGVtcGxhdGVfbmFtZSkKKyAgICAgIGlmIFByb2ZpbGVyLmN1cnJlbnRfcHJvZmlsZQorICAgICAgICBQcm9maWxlci5jdXJyZW50X3Byb2ZpbGUucHVzaF9wYXJ0aWFsKHRlbXBsYXRlX25hbWUpCisgICAgICAgIG91dHB1dCA9IHlpZWxkCisgICAgICAgIFByb2ZpbGVyLmN1cnJlbnRfcHJvZmlsZS5wb3BfcGFydGlhbAorICAgICAgICBvdXRwdXQKKyAgICAgIGVsc2UKKyAgICAgICAgeWllbGQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHNlbGYuY3VycmVudF9wcm9maWxlCisgICAgICBUaHJlYWQuY3VycmVudFs6bGlxdWlkX3Byb2ZpbGVyXQorICAgIGVuZAorCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBwYXJ0aWFsX3N0YWNrID0gWyI8cm9vdD4iXQorCisgICAgICBAcm9vdF90aW1pbmcgPSBUaW1pbmcubmV3KCIiLCBjdXJyZW50X3BhcnRpYWwpCisgICAgICBAdGltaW5nX3N0YWNrID0gW0Byb290X3RpbWluZ10KKworICAgICAgQHJlbmRlcl9zdGFydF9hdCA9IFRpbWUubm93CisgICAgICBAcmVuZGVyX2VuZF9hdCA9IEByZW5kZXJfc3RhcnRfYXQKKyAgICBlbmQKKworICAgIGRlZiBzdGFydAorICAgICAgVGhyZWFkLmN1cnJlbnRbOmxpcXVpZF9wcm9maWxlcl0gPSBzZWxmCisgICAgICBAcmVuZGVyX3N0YXJ0X2F0ID0gVGltZS5ub3cKKyAgICBlbmQKKworICAgIGRlZiBzdG9wCisgICAgICBUaHJlYWQuY3VycmVudFs6bGlxdWlkX3Byb2ZpbGVyXSA9IG5pbAorICAgICAgQHJlbmRlcl9lbmRfYXQgPSBUaW1lLm5vdworICAgIGVuZAorCisgICAgZGVmIHRvdGFsX3JlbmRlcl90aW1lCisgICAgICBAcmVuZGVyX2VuZF9hdCAtIEByZW5kZXJfc3RhcnRfYXQKKyAgICBlbmQKKworICAgIGRlZiBlYWNoKCZibG9jaykKKyAgICAgIEByb290X3RpbWluZy5jaGlsZHJlbi5lYWNoKCZibG9jaykKKyAgICBlbmQKKworICAgIGRlZiBbXShpZHgpCisgICAgICBAcm9vdF90aW1pbmcuY2hpbGRyZW5baWR4XQorICAgIGVuZAorCisgICAgZGVmIGxlbmd0aAorICAgICAgQHJvb3RfdGltaW5nLmNoaWxkcmVuLmxlbmd0aAorICAgIGVuZAorCisgICAgZGVmIHN0YXJ0X25vZGUobm9kZSkKKyAgICAgIEB0aW1pbmdfc3RhY2sucHVzaChUaW1pbmcuc3RhcnQobm9kZSwgY3VycmVudF9wYXJ0aWFsKSkKKyAgICBlbmQKKworICAgIGRlZiBlbmRfbm9kZShfbm9kZSkKKyAgICAgIHRpbWluZyA9IEB0aW1pbmdfc3RhY2sucG9wCisgICAgICB0aW1pbmcuZmluaXNoCisKKyAgICAgIEB0aW1pbmdfc3RhY2subGFzdC5jaGlsZHJlbiA8PCB0aW1pbmcKKyAgICBlbmQKKworICAgIGRlZiBjdXJyZW50X3BhcnRpYWwKKyAgICAgIEBwYXJ0aWFsX3N0YWNrLmxhc3QKKyAgICBlbmQKKworICAgIGRlZiBwdXNoX3BhcnRpYWwocGFydGlhbF9uYW1lKQorICAgICAgQHBhcnRpYWxfc3RhY2sucHVzaChwYXJ0aWFsX25hbWUpCisgICAgZW5kCisKKyAgICBkZWYgcG9wX3BhcnRpYWwKKyAgICAgIEBwYXJ0aWFsX3N0YWNrLnBvcAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvcHJvZmlsZXIvaG9va3MucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9wcm9maWxlci9ob29rcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhkNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvcHJvZmlsZXIvaG9va3MucmIKQEAgLTAsMCArMSwyMyBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBCbG9ja0JvZHkKKyAgICBkZWYgcmVuZGVyX25vZGVfd2l0aF9wcm9maWxpbmcobm9kZSwgY29udGV4dCkKKyAgICAgIFByb2ZpbGVyLnByb2ZpbGVfbm9kZV9yZW5kZXIobm9kZSkgZG8KKyAgICAgICAgcmVuZGVyX25vZGVfd2l0aG91dF9wcm9maWxpbmcobm9kZSwgY29udGV4dCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgYWxpYXNfbWV0aG9kIDpyZW5kZXJfbm9kZV93aXRob3V0X3Byb2ZpbGluZywgOnJlbmRlcl9ub2RlCisgICAgYWxpYXNfbWV0aG9kIDpyZW5kZXJfbm9kZSwgOnJlbmRlcl9ub2RlX3dpdGhfcHJvZmlsaW5nCisgIGVuZAorCisgIGNsYXNzIEluY2x1ZGUgPCBUYWcKKyAgICBkZWYgcmVuZGVyX3dpdGhfcHJvZmlsaW5nKGNvbnRleHQpCisgICAgICBQcm9maWxlci5wcm9maWxlX2NoaWxkcmVuKGNvbnRleHQuZXZhbHVhdGUoQHRlbXBsYXRlX25hbWVfZXhwcikudG9fcykgZG8KKyAgICAgICAgcmVuZGVyX3dpdGhvdXRfcHJvZmlsaW5nKGNvbnRleHQpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGFsaWFzX21ldGhvZCA6cmVuZGVyX3dpdGhvdXRfcHJvZmlsaW5nLCA6cmVuZGVyCisgICAgYWxpYXNfbWV0aG9kIDpyZW5kZXIsIDpyZW5kZXJfd2l0aF9wcm9maWxpbmcKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3JhbmdlX2xvb2t1cC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3JhbmdlX2xvb2t1cC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2JiNDIwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvcmFuZ2VfbG9va3VwLnJiCkBAIC0wLDAgKzEsMzcgQEAKK21vZHVsZSBMaXF1aWQKKyAgY2xhc3MgUmFuZ2VMb29rdXAKKyAgICBkZWYgc2VsZi5wYXJzZShzdGFydF9tYXJrdXAsIGVuZF9tYXJrdXApCisgICAgICBzdGFydF9vYmogPSBFeHByZXNzaW9uLnBhcnNlKHN0YXJ0X21hcmt1cCkKKyAgICAgIGVuZF9vYmogPSBFeHByZXNzaW9uLnBhcnNlKGVuZF9tYXJrdXApCisgICAgICBpZiBzdGFydF9vYmoucmVzcG9uZF90bz8oOmV2YWx1YXRlKSB8fCBlbmRfb2JqLnJlc3BvbmRfdG8/KDpldmFsdWF0ZSkKKyAgICAgICAgbmV3KHN0YXJ0X29iaiwgZW5kX29iaikKKyAgICAgIGVsc2UKKyAgICAgICAgc3RhcnRfb2JqLnRvX2kuLmVuZF9vYmoudG9faQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzdGFydF9vYmosIGVuZF9vYmopCisgICAgICBAc3RhcnRfb2JqID0gc3RhcnRfb2JqCisgICAgICBAZW5kX29iaiA9IGVuZF9vYmoKKyAgICBlbmQKKworICAgIGRlZiBldmFsdWF0ZShjb250ZXh0KQorICAgICAgc3RhcnRfaW50ID0gdG9faW50ZWdlcihjb250ZXh0LmV2YWx1YXRlKEBzdGFydF9vYmopKQorICAgICAgZW5kX2ludCA9IHRvX2ludGVnZXIoY29udGV4dC5ldmFsdWF0ZShAZW5kX29iaikpCisgICAgICBzdGFydF9pbnQuLmVuZF9pbnQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiB0b19pbnRlZ2VyKGlucHV0KQorICAgICAgY2FzZSBpbnB1dAorICAgICAgd2hlbiBJbnRlZ2VyCisgICAgICAgIGlucHV0CisgICAgICB3aGVuIE5pbENsYXNzLCBTdHJpbmcKKyAgICAgICAgaW5wdXQudG9faQorICAgICAgZWxzZQorICAgICAgICBVdGlscy50b19pbnRlZ2VyKGlucHV0KQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9yZXNvdXJjZV9saW1pdHMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9yZXNvdXJjZV9saW1pdHMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiMzU5YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3Jlc291cmNlX2xpbWl0cy5yYgpAQCAtMCwwICsxLDIzIEBACittb2R1bGUgTGlxdWlkCisgIGNsYXNzIFJlc291cmNlTGltaXRzCisgICAgYXR0cl9hY2Nlc3NvciA6cmVuZGVyX2xlbmd0aCwgOnJlbmRlcl9zY29yZSwgOmFzc2lnbl9zY29yZSwKKyAgICAgIDpyZW5kZXJfbGVuZ3RoX2xpbWl0LCA6cmVuZGVyX3Njb3JlX2xpbWl0LCA6YXNzaWduX3Njb3JlX2xpbWl0CisKKyAgICBkZWYgaW5pdGlhbGl6ZShsaW1pdHMpCisgICAgICBAcmVuZGVyX2xlbmd0aF9saW1pdCA9IGxpbWl0c1s6cmVuZGVyX2xlbmd0aF9saW1pdF0KKyAgICAgIEByZW5kZXJfc2NvcmVfbGltaXQgPSBsaW1pdHNbOnJlbmRlcl9zY29yZV9saW1pdF0KKyAgICAgIEBhc3NpZ25fc2NvcmVfbGltaXQgPSBsaW1pdHNbOmFzc2lnbl9zY29yZV9saW1pdF0KKyAgICAgIHJlc2V0CisgICAgZW5kCisKKyAgICBkZWYgcmVhY2hlZD8KKyAgICAgIChAcmVuZGVyX2xlbmd0aF9saW1pdCAmJiBAcmVuZGVyX2xlbmd0aCA+IEByZW5kZXJfbGVuZ3RoX2xpbWl0KSB8fAorICAgICAgICAoQHJlbmRlcl9zY29yZV9saW1pdCAmJiBAcmVuZGVyX3Njb3JlID4gQHJlbmRlcl9zY29yZV9saW1pdCkgfHwKKyAgICAgICAgKEBhc3NpZ25fc2NvcmVfbGltaXQgJiYgQGFzc2lnbl9zY29yZSA+IEBhc3NpZ25fc2NvcmVfbGltaXQpCisgICAgZW5kCisKKyAgICBkZWYgcmVzZXQKKyAgICAgIEByZW5kZXJfbGVuZ3RoID0gQHJlbmRlcl9zY29yZSA9IEBhc3NpZ25fc2NvcmUgPSAwCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9zdGFuZGFyZGZpbHRlcnMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC9zdGFuZGFyZGZpbHRlcnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1NmY0YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3N0YW5kYXJkZmlsdGVycy5yYgpAQCAtMCwwICsxLDQyMCBAQAorcmVxdWlyZSAnY2dpJworcmVxdWlyZSAnYmlnZGVjaW1hbCcKKworbW9kdWxlIExpcXVpZAorICBtb2R1bGUgU3RhbmRhcmRGaWx0ZXJzCisgICAgSFRNTF9FU0NBUEUgPSB7CisgICAgICAnJicuZnJlZXplID0+ICcmYW1wOycuZnJlZXplLAorICAgICAgJz4nLmZyZWV6ZSA9PiAnJmd0OycuZnJlZXplLAorICAgICAgJzwnLmZyZWV6ZSA9PiAnJmx0OycuZnJlZXplLAorICAgICAgJyInLmZyZWV6ZSA9PiAnJnF1b3Q7Jy5mcmVlemUsCisgICAgICAiJyIuZnJlZXplID0+ICcmIzM5OycuZnJlZXplCisgICAgfQorICAgIEhUTUxfRVNDQVBFX09OQ0VfUkVHRVhQID0gL1siPjwnXXwmKD8hKFthLXpBLVpdK3woI1xkKykpOykvCisKKyAgICAjIFJldHVybiB0aGUgc2l6ZSBvZiBhbiBhcnJheSBvciBvZiBhbiBzdHJpbmcKKyAgICBkZWYgc2l6ZShpbnB1dCkKKyAgICAgIGlucHV0LnJlc3BvbmRfdG8/KDpzaXplKSA/IGlucHV0LnNpemUgOiAwCisgICAgZW5kCisKKyAgICAjIGNvbnZlcnQgYW4gaW5wdXQgc3RyaW5nIHRvIERPV05DQVNFCisgICAgZGVmIGRvd25jYXNlKGlucHV0KQorICAgICAgaW5wdXQudG9fcy5kb3duY2FzZQorICAgIGVuZAorCisgICAgIyBjb252ZXJ0IGFuIGlucHV0IHN0cmluZyB0byBVUENBU0UKKyAgICBkZWYgdXBjYXNlKGlucHV0KQorICAgICAgaW5wdXQudG9fcy51cGNhc2UKKyAgICBlbmQKKworICAgICMgY2FwaXRhbGl6ZSB3b3JkcyBpbiB0aGUgaW5wdXQgY2VudGVuY2UKKyAgICBkZWYgY2FwaXRhbGl6ZShpbnB1dCkKKyAgICAgIGlucHV0LnRvX3MuY2FwaXRhbGl6ZQorICAgIGVuZAorCisgICAgZGVmIGVzY2FwZShpbnB1dCkKKyAgICAgIENHSS5lc2NhcGVIVE1MKGlucHV0KS51bnRhaW50IHVubGVzcyBpbnB1dC5uaWw/CisgICAgZW5kCisgICAgYWxpYXNfbWV0aG9kIDpoLCA6ZXNjYXBlCisKKyAgICBkZWYgZXNjYXBlX29uY2UoaW5wdXQpCisgICAgICBpbnB1dC50b19zLmdzdWIoSFRNTF9FU0NBUEVfT05DRV9SRUdFWFAsIEhUTUxfRVNDQVBFKQorICAgIGVuZAorCisgICAgZGVmIHVybF9lbmNvZGUoaW5wdXQpCisgICAgICBDR0kuZXNjYXBlKGlucHV0KSB1bmxlc3MgaW5wdXQubmlsPworICAgIGVuZAorCisgICAgZGVmIHVybF9kZWNvZGUoaW5wdXQpCisgICAgICBDR0kudW5lc2NhcGUoaW5wdXQpIHVubGVzcyBpbnB1dC5uaWw/CisgICAgZW5kCisKKyAgICBkZWYgc2xpY2UoaW5wdXQsIG9mZnNldCwgbGVuZ3RoID0gbmlsKQorICAgICAgb2Zmc2V0ID0gVXRpbHMudG9faW50ZWdlcihvZmZzZXQpCisgICAgICBsZW5ndGggPSBsZW5ndGggPyBVdGlscy50b19pbnRlZ2VyKGxlbmd0aCkgOiAxCisKKyAgICAgIGlmIGlucHV0LmlzX2E/KEFycmF5KQorICAgICAgICBpbnB1dC5zbGljZShvZmZzZXQsIGxlbmd0aCkgfHwgW10KKyAgICAgIGVsc2UKKyAgICAgICAgaW5wdXQudG9fcy5zbGljZShvZmZzZXQsIGxlbmd0aCkgfHwgJycKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUcnVuY2F0ZSBhIHN0cmluZyBkb3duIHRvIHggY2hhcmFjdGVycworICAgIGRlZiB0cnVuY2F0ZShpbnB1dCwgbGVuZ3RoID0gNTAsIHRydW5jYXRlX3N0cmluZyA9ICIuLi4iLmZyZWV6ZSkKKyAgICAgIHJldHVybiBpZiBpbnB1dC5uaWw/CisgICAgICBpbnB1dF9zdHIgPSBpbnB1dC50b19zCisgICAgICBsZW5ndGggPSBVdGlscy50b19pbnRlZ2VyKGxlbmd0aCkKKyAgICAgIHRydW5jYXRlX3N0cmluZ19zdHIgPSB0cnVuY2F0ZV9zdHJpbmcudG9fcworICAgICAgbCA9IGxlbmd0aCAtIHRydW5jYXRlX3N0cmluZ19zdHIubGVuZ3RoCisgICAgICBsID0gMCBpZiBsIDwgMAorICAgICAgaW5wdXRfc3RyLmxlbmd0aCA+IGxlbmd0aCA/IGlucHV0X3N0clswLi4ubF0gKyB0cnVuY2F0ZV9zdHJpbmdfc3RyIDogaW5wdXRfc3RyCisgICAgZW5kCisKKyAgICBkZWYgdHJ1bmNhdGV3b3JkcyhpbnB1dCwgd29yZHMgPSAxNSwgdHJ1bmNhdGVfc3RyaW5nID0gIi4uLiIuZnJlZXplKQorICAgICAgcmV0dXJuIGlmIGlucHV0Lm5pbD8KKyAgICAgIHdvcmRsaXN0ID0gaW5wdXQudG9fcy5zcGxpdAorICAgICAgd29yZHMgPSBVdGlscy50b19pbnRlZ2VyKHdvcmRzKQorICAgICAgbCA9IHdvcmRzIC0gMQorICAgICAgbCA9IDAgaWYgbCA8IDAKKyAgICAgIHdvcmRsaXN0Lmxlbmd0aCA+IGwgPyB3b3JkbGlzdFswLi5sXS5qb2luKCIgIi5mcmVlemUpICsgdHJ1bmNhdGVfc3RyaW5nLnRvX3MgOiBpbnB1dAorICAgIGVuZAorCisgICAgIyBTcGxpdCBpbnB1dCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdWJzdHJpbmdzIHNlcGFyYXRlZCBieSBnaXZlbiBwYXR0ZXJuLgorICAgICMKKyAgICAjIEV4YW1wbGU6CisgICAgIyAgIDxkaXYgY2xhc3M9InN1bW1hcnkiPnt7IHBvc3QgfCBzcGxpdCAnLy8nIHwgZmlyc3QgfX08L2Rpdj4KKyAgICAjCisgICAgZGVmIHNwbGl0KGlucHV0LCBwYXR0ZXJuKQorICAgICAgaW5wdXQudG9fcy5zcGxpdChwYXR0ZXJuLnRvX3MpCisgICAgZW5kCisKKyAgICBkZWYgc3RyaXAoaW5wdXQpCisgICAgICBpbnB1dC50b19zLnN0cmlwCisgICAgZW5kCisKKyAgICBkZWYgbHN0cmlwKGlucHV0KQorICAgICAgaW5wdXQudG9fcy5sc3RyaXAKKyAgICBlbmQKKworICAgIGRlZiByc3RyaXAoaW5wdXQpCisgICAgICBpbnB1dC50b19zLnJzdHJpcAorICAgIGVuZAorCisgICAgZGVmIHN0cmlwX2h0bWwoaW5wdXQpCisgICAgICBlbXB0eSA9ICcnLmZyZWV6ZQorICAgICAgaW5wdXQudG9fcy5nc3ViKC88c2NyaXB0Lio/PFwvc2NyaXB0Pi9tLCBlbXB0eSkuZ3N1YigvPCEtLS4qPy0tPi9tLCBlbXB0eSkuZ3N1YigvPHN0eWxlLio/PFwvc3R5bGU+L20sIGVtcHR5KS5nc3ViKC88Lio/Pi9tLCBlbXB0eSkKKyAgICBlbmQKKworICAgICMgUmVtb3ZlIGFsbCBuZXdsaW5lcyBmcm9tIHRoZSBzdHJpbmcKKyAgICBkZWYgc3RyaXBfbmV3bGluZXMoaW5wdXQpCisgICAgICBpbnB1dC50b19zLmdzdWIoL1xyP1xuLywgJycuZnJlZXplKQorICAgIGVuZAorCisgICAgIyBKb2luIGVsZW1lbnRzIG9mIHRoZSBhcnJheSB3aXRoIGNlcnRhaW4gY2hhcmFjdGVyIGJldHdlZW4gdGhlbQorICAgIGRlZiBqb2luKGlucHV0LCBnbHVlID0gJyAnLmZyZWV6ZSkKKyAgICAgIElucHV0SXRlcmF0b3IubmV3KGlucHV0KS5qb2luKGdsdWUpCisgICAgZW5kCisKKyAgICAjIFNvcnQgZWxlbWVudHMgb2YgdGhlIGFycmF5CisgICAgIyBwcm92aWRlIG9wdGlvbmFsIHByb3BlcnR5IHdpdGggd2hpY2ggdG8gc29ydCBhbiBhcnJheSBvZiBoYXNoZXMgb3IgZHJvcHMKKyAgICBkZWYgc29ydChpbnB1dCwgcHJvcGVydHkgPSBuaWwpCisgICAgICBhcnkgPSBJbnB1dEl0ZXJhdG9yLm5ldyhpbnB1dCkKKyAgICAgIGlmIHByb3BlcnR5Lm5pbD8KKyAgICAgICAgYXJ5LnNvcnQKKyAgICAgIGVsc2lmIGFyeS5lbXB0eT8gIyBUaGUgbmV4dCB0d28gY2FzZXMgYXNzdW1lIGEgbm9uLWVtcHR5IGFycmF5LgorICAgICAgICBbXQorICAgICAgZWxzaWYgYXJ5LmZpcnN0LnJlc3BvbmRfdG8/KDpbXSkgJiYgIWFyeS5maXJzdFtwcm9wZXJ0eV0ubmlsPworICAgICAgICBhcnkuc29ydCBkbyB8YSwgYnwKKyAgICAgICAgICBhID0gYVtwcm9wZXJ0eV0KKyAgICAgICAgICBiID0gYltwcm9wZXJ0eV0KKyAgICAgICAgICBpZiBhICYmIGIKKyAgICAgICAgICAgIGEgPD0+IGIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhID8gLTEgOiAxCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFNvcnQgZWxlbWVudHMgb2YgYW4gYXJyYXkgaWdub3JpbmcgY2FzZSBpZiBzdHJpbmdzCisgICAgIyBwcm92aWRlIG9wdGlvbmFsIHByb3BlcnR5IHdpdGggd2hpY2ggdG8gc29ydCBhbiBhcnJheSBvZiBoYXNoZXMgb3IgZHJvcHMKKyAgICBkZWYgc29ydF9uYXR1cmFsKGlucHV0LCBwcm9wZXJ0eSA9IG5pbCkKKyAgICAgIGFyeSA9IElucHV0SXRlcmF0b3IubmV3KGlucHV0KQorCisgICAgICBpZiBwcm9wZXJ0eS5uaWw/CisgICAgICAgIGFyeS5zb3J0IHsgfGEsIGJ8IGEuY2FzZWNtcChiKSB9CisgICAgICBlbHNpZiBhcnkuZW1wdHk/ICMgVGhlIG5leHQgdHdvIGNhc2VzIGFzc3VtZSBhIG5vbi1lbXB0eSBhcnJheS4KKyAgICAgICAgW10KKyAgICAgIGVsc2lmIGFyeS5maXJzdC5yZXNwb25kX3RvPyg6W10pICYmICFhcnkuZmlyc3RbcHJvcGVydHldLm5pbD8KKyAgICAgICAgYXJ5LnNvcnQgeyB8YSwgYnwgYVtwcm9wZXJ0eV0uY2FzZWNtcChiW3Byb3BlcnR5XSkgfQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJlbW92ZSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSBhbiBhcnJheQorICAgICMgcHJvdmlkZSBvcHRpb25hbCBwcm9wZXJ0eSB3aXRoIHdoaWNoIHRvIGRldGVybWluZSB1bmlxdWVuZXNzCisgICAgZGVmIHVuaXEoaW5wdXQsIHByb3BlcnR5ID0gbmlsKQorICAgICAgYXJ5ID0gSW5wdXRJdGVyYXRvci5uZXcoaW5wdXQpCisKKyAgICAgIGlmIHByb3BlcnR5Lm5pbD8KKyAgICAgICAgYXJ5LnVuaXEKKyAgICAgIGVsc2lmIGFyeS5lbXB0eT8gIyBUaGUgbmV4dCB0d28gY2FzZXMgYXNzdW1lIGEgbm9uLWVtcHR5IGFycmF5LgorICAgICAgICBbXQorICAgICAgZWxzaWYgYXJ5LmZpcnN0LnJlc3BvbmRfdG8/KDpbXSkKKyAgICAgICAgYXJ5LnVuaXF7IHxhfCBhW3Byb3BlcnR5XSB9CisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUmV2ZXJzZSB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkKKyAgICBkZWYgcmV2ZXJzZShpbnB1dCkKKyAgICAgIGFyeSA9IElucHV0SXRlcmF0b3IubmV3KGlucHV0KQorICAgICAgYXJ5LnJldmVyc2UKKyAgICBlbmQKKworICAgICMgbWFwL2NvbGxlY3Qgb24gYSBnaXZlbiBwcm9wZXJ0eQorICAgIGRlZiBtYXAoaW5wdXQsIHByb3BlcnR5KQorICAgICAgSW5wdXRJdGVyYXRvci5uZXcoaW5wdXQpLm1hcCBkbyB8ZXwKKyAgICAgICAgZSA9IGUuY2FsbCBpZiBlLmlzX2E/KFByb2MpCisKKyAgICAgICAgaWYgcHJvcGVydHkgPT0gInRvX2xpcXVpZCIuZnJlZXplCisgICAgICAgICAgZQorICAgICAgICBlbHNpZiBlLnJlc3BvbmRfdG8/KDpbXSkKKyAgICAgICAgICByID0gZVtwcm9wZXJ0eV0KKyAgICAgICAgICByLmlzX2E/KFByb2MpID8gci5jYWxsIDogcgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZW1vdmUgbmlscyB3aXRoaW4gYW4gYXJyYXkKKyAgICAjIHByb3ZpZGUgb3B0aW9uYWwgcHJvcGVydHkgd2l0aCB3aGljaCB0byBjaGVjayBmb3IgbmlsCisgICAgZGVmIGNvbXBhY3QoaW5wdXQsIHByb3BlcnR5ID0gbmlsKQorICAgICAgYXJ5ID0gSW5wdXRJdGVyYXRvci5uZXcoaW5wdXQpCisKKyAgICAgIGlmIHByb3BlcnR5Lm5pbD8KKyAgICAgICAgYXJ5LmNvbXBhY3QKKyAgICAgIGVsc2lmIGFyeS5lbXB0eT8gIyBUaGUgbmV4dCB0d28gY2FzZXMgYXNzdW1lIGEgbm9uLWVtcHR5IGFycmF5LgorICAgICAgICBbXQorICAgICAgZWxzaWYgYXJ5LmZpcnN0LnJlc3BvbmRfdG8/KDpbXSkKKyAgICAgICAgYXJ5LnJlamVjdHsgfGF8IGFbcHJvcGVydHldLm5pbD8gfQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJlcGxhY2Ugb2NjdXJyZW5jZXMgb2YgYSBzdHJpbmcgd2l0aCBhbm90aGVyCisgICAgZGVmIHJlcGxhY2UoaW5wdXQsIHN0cmluZywgcmVwbGFjZW1lbnQgPSAnJy5mcmVlemUpCisgICAgICBpbnB1dC50b19zLmdzdWIoc3RyaW5nLnRvX3MsIHJlcGxhY2VtZW50LnRvX3MpCisgICAgZW5kCisKKyAgICAjIFJlcGxhY2UgdGhlIGZpcnN0IG9jY3VycmVuY2VzIG9mIGEgc3RyaW5nIHdpdGggYW5vdGhlcgorICAgIGRlZiByZXBsYWNlX2ZpcnN0KGlucHV0LCBzdHJpbmcsIHJlcGxhY2VtZW50ID0gJycuZnJlZXplKQorICAgICAgaW5wdXQudG9fcy5zdWIoc3RyaW5nLnRvX3MsIHJlcGxhY2VtZW50LnRvX3MpCisgICAgZW5kCisKKyAgICAjIHJlbW92ZSBhIHN1YnN0cmluZworICAgIGRlZiByZW1vdmUoaW5wdXQsIHN0cmluZykKKyAgICAgIGlucHV0LnRvX3MuZ3N1YihzdHJpbmcudG9fcywgJycuZnJlZXplKQorICAgIGVuZAorCisgICAgIyByZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2VzIG9mIGEgc3Vic3RyaW5nCisgICAgZGVmIHJlbW92ZV9maXJzdChpbnB1dCwgc3RyaW5nKQorICAgICAgaW5wdXQudG9fcy5zdWIoc3RyaW5nLnRvX3MsICcnLmZyZWV6ZSkKKyAgICBlbmQKKworICAgICMgYWRkIG9uZSBzdHJpbmcgdG8gYW5vdGhlcgorICAgIGRlZiBhcHBlbmQoaW5wdXQsIHN0cmluZykKKyAgICAgIGlucHV0LnRvX3MgKyBzdHJpbmcudG9fcworICAgIGVuZAorCisgICAgZGVmIGNvbmNhdChpbnB1dCwgYXJyYXkpCisgICAgICB1bmxlc3MgYXJyYXkucmVzcG9uZF90bz8oOnRvX2FyeSkKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoImNvbmNhdCBmaWx0ZXIgcmVxdWlyZXMgYW4gYXJyYXkgYXJndW1lbnQiKQorICAgICAgZW5kCisgICAgICBJbnB1dEl0ZXJhdG9yLm5ldyhpbnB1dCkuY29uY2F0KGFycmF5KQorICAgIGVuZAorCisgICAgIyBwcmVwZW5kIGEgc3RyaW5nIHRvIGFub3RoZXIKKyAgICBkZWYgcHJlcGVuZChpbnB1dCwgc3RyaW5nKQorICAgICAgc3RyaW5nLnRvX3MgKyBpbnB1dC50b19zCisgICAgZW5kCisKKyAgICAjIEFkZCA8YnIgLz4gdGFncyBpbiBmcm9udCBvZiBhbGwgbmV3bGluZXMgaW4gaW5wdXQgc3RyaW5nCisgICAgZGVmIG5ld2xpbmVfdG9fYnIoaW5wdXQpCisgICAgICBpbnB1dC50b19zLmdzdWIoL1xuLywgIjxiciAvPlxuIi5mcmVlemUpCisgICAgZW5kCisKKyAgICAjIFJlZm9ybWF0IGEgZGF0ZSB1c2luZyBSdWJ5J3MgY29yZSBUaW1lI3N0cmZ0aW1lKCBzdHJpbmcgKSAtPiBzdHJpbmcKKyAgICAjCisgICAgIyAgICVhIC0gVGhlIGFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZSAoYGBTdW4nJykKKyAgICAjICAgJUEgLSBUaGUgIGZ1bGwgIHdlZWtkYXkgIG5hbWUgKGBgU3VuZGF5JycpCisgICAgIyAgICViIC0gVGhlIGFiYnJldmlhdGVkIG1vbnRoIG5hbWUgKGBgSmFuJycpCisgICAgIyAgICVCIC0gVGhlICBmdWxsICBtb250aCAgbmFtZSAoYGBKYW51YXJ5JycpCisgICAgIyAgICVjIC0gVGhlIHByZWZlcnJlZCBsb2NhbCBkYXRlIGFuZCB0aW1lIHJlcHJlc2VudGF0aW9uCisgICAgIyAgICVkIC0gRGF5IG9mIHRoZSBtb250aCAoMDEuLjMxKQorICAgICMgICAlSCAtIEhvdXIgb2YgdGhlIGRheSwgMjQtaG91ciBjbG9jayAoMDAuLjIzKQorICAgICMgICAlSSAtIEhvdXIgb2YgdGhlIGRheSwgMTItaG91ciBjbG9jayAoMDEuLjEyKQorICAgICMgICAlaiAtIERheSBvZiB0aGUgeWVhciAoMDAxLi4zNjYpCisgICAgIyAgICVtIC0gTW9udGggb2YgdGhlIHllYXIgKDAxLi4xMikKKyAgICAjICAgJU0gLSBNaW51dGUgb2YgdGhlIGhvdXIgKDAwLi41OSkKKyAgICAjICAgJXAgLSBNZXJpZGlhbiBpbmRpY2F0b3IgKGBgQU0nJyAgb3IgIGBgUE0nJykKKyAgICAjICAgJXMgLSBOdW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwIFVUQy4KKyAgICAjICAgJVMgLSBTZWNvbmQgb2YgdGhlIG1pbnV0ZSAoMDAuLjYwKQorICAgICMgICAlVSAtIFdlZWsgIG51bWJlciAgb2YgdGhlIGN1cnJlbnQgeWVhciwKKyAgICAjICAgICAgICAgICBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBTdW5kYXkgYXMgdGhlIGZpcnN0CisgICAgIyAgICAgICAgICAgZGF5IG9mIHRoZSBmaXJzdCB3ZWVrICgwMC4uNTMpCisgICAgIyAgICVXIC0gV2VlayAgbnVtYmVyICBvZiB0aGUgY3VycmVudCB5ZWFyLAorICAgICMgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IE1vbmRheSBhcyB0aGUgZmlyc3QKKyAgICAjICAgICAgICAgICBkYXkgb2YgdGhlIGZpcnN0IHdlZWsgKDAwLi41MykKKyAgICAjICAgJXcgLSBEYXkgb2YgdGhlIHdlZWsgKFN1bmRheSBpcyAwLCAwLi42KQorICAgICMgICAleCAtIFByZWZlcnJlZCByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGRhdGUgYWxvbmUsIG5vIHRpbWUKKyAgICAjICAgJVggLSBQcmVmZXJyZWQgcmVwcmVzZW50YXRpb24gZm9yIHRoZSB0aW1lIGFsb25lLCBubyBkYXRlCisgICAgIyAgICV5IC0gWWVhciB3aXRob3V0IGEgY2VudHVyeSAoMDAuLjk5KQorICAgICMgICAlWSAtIFllYXIgd2l0aCBjZW50dXJ5CisgICAgIyAgICVaIC0gVGltZSB6b25lIG5hbWUKKyAgICAjICAgJSUgLSBMaXRlcmFsIGBgJScnIGNoYXJhY3RlcgorICAgICMKKyAgICAjICAgU2VlIGFsc286IGh0dHA6Ly93d3cucnVieS1kb2Mub3JnL2NvcmUvVGltZS5odG1sI21ldGhvZC1pLXN0cmZ0aW1lCisgICAgZGVmIGRhdGUoaW5wdXQsIGZvcm1hdCkKKyAgICAgIHJldHVybiBpbnB1dCBpZiBmb3JtYXQudG9fcy5lbXB0eT8KKworICAgICAgcmV0dXJuIGlucHV0IHVubGVzcyBkYXRlID0gVXRpbHMudG9fZGF0ZShpbnB1dCkKKworICAgICAgZGF0ZS5zdHJmdGltZShmb3JtYXQudG9fcykKKyAgICBlbmQKKworICAgICMgR2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBwYXNzZWQgaW4gYXJyYXkKKyAgICAjCisgICAgIyBFeGFtcGxlOgorICAgICMgICAge3sgcHJvZHVjdC5pbWFnZXMgfCBmaXJzdCB8IHRvX2ltZyB9fQorICAgICMKKyAgICBkZWYgZmlyc3QoYXJyYXkpCisgICAgICBhcnJheS5maXJzdCBpZiBhcnJheS5yZXNwb25kX3RvPyg6Zmlyc3QpCisgICAgZW5kCisKKyAgICAjIEdldCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXNzZWQgaW4gYXJyYXkKKyAgICAjCisgICAgIyBFeGFtcGxlOgorICAgICMgICAge3sgcHJvZHVjdC5pbWFnZXMgfCBsYXN0IHwgdG9faW1nIH19CisgICAgIworICAgIGRlZiBsYXN0KGFycmF5KQorICAgICAgYXJyYXkubGFzdCBpZiBhcnJheS5yZXNwb25kX3RvPyg6bGFzdCkKKyAgICBlbmQKKworICAgICMgYWJzb2x1dGUgdmFsdWUKKyAgICBkZWYgYWJzKGlucHV0KQorICAgICAgcmVzdWx0ID0gVXRpbHMudG9fbnVtYmVyKGlucHV0KS5hYnMKKyAgICAgIHJlc3VsdC5pc19hPyhCaWdEZWNpbWFsKSA/IHJlc3VsdC50b19mIDogcmVzdWx0CisgICAgZW5kCisKKyAgICAjIGFkZGl0aW9uCisgICAgZGVmIHBsdXMoaW5wdXQsIG9wZXJhbmQpCisgICAgICBhcHBseV9vcGVyYXRpb24oaW5wdXQsIG9wZXJhbmQsIDorKQorICAgIGVuZAorCisgICAgIyBzdWJ0cmFjdGlvbgorICAgIGRlZiBtaW51cyhpbnB1dCwgb3BlcmFuZCkKKyAgICAgIGFwcGx5X29wZXJhdGlvbihpbnB1dCwgb3BlcmFuZCwgOi0pCisgICAgZW5kCisKKyAgICAjIG11bHRpcGxpY2F0aW9uCisgICAgZGVmIHRpbWVzKGlucHV0LCBvcGVyYW5kKQorICAgICAgYXBwbHlfb3BlcmF0aW9uKGlucHV0LCBvcGVyYW5kLCA6KikKKyAgICBlbmQKKworICAgICMgZGl2aXNpb24KKyAgICBkZWYgZGl2aWRlZF9ieShpbnB1dCwgb3BlcmFuZCkKKyAgICAgIGFwcGx5X29wZXJhdGlvbihpbnB1dCwgb3BlcmFuZCwgOi8pCisgICAgcmVzY3VlIDo6WmVyb0RpdmlzaW9uRXJyb3IgPT4gZQorICAgICAgcmFpc2UgTGlxdWlkOjpaZXJvRGl2aXNpb25FcnJvciwgZS5tZXNzYWdlCisgICAgZW5kCisKKyAgICBkZWYgbW9kdWxvKGlucHV0LCBvcGVyYW5kKQorICAgICAgYXBwbHlfb3BlcmF0aW9uKGlucHV0LCBvcGVyYW5kLCA6JSkKKyAgICByZXNjdWUgOjpaZXJvRGl2aXNpb25FcnJvciA9PiBlCisgICAgICByYWlzZSBMaXF1aWQ6Olplcm9EaXZpc2lvbkVycm9yLCBlLm1lc3NhZ2UKKyAgICBlbmQKKworICAgIGRlZiByb3VuZChpbnB1dCwgbiA9IDApCisgICAgICByZXN1bHQgPSBVdGlscy50b19udW1iZXIoaW5wdXQpLnJvdW5kKFV0aWxzLnRvX251bWJlcihuKSkKKyAgICAgIHJlc3VsdCA9IHJlc3VsdC50b19mIGlmIHJlc3VsdC5pc19hPyhCaWdEZWNpbWFsKQorICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvX2kgaWYgbiA9PSAwCisgICAgICByZXN1bHQKKyAgICByZXNjdWUgOjpGbG9hdERvbWFpbkVycm9yID0+IGUKKyAgICAgIHJhaXNlIExpcXVpZDo6RmxvYXREb21haW5FcnJvciwgZS5tZXNzYWdlCisgICAgZW5kCisKKyAgICBkZWYgY2VpbChpbnB1dCkKKyAgICAgIFV0aWxzLnRvX251bWJlcihpbnB1dCkuY2VpbC50b19pCisgICAgcmVzY3VlIDo6RmxvYXREb21haW5FcnJvciA9PiBlCisgICAgICByYWlzZSBMaXF1aWQ6OkZsb2F0RG9tYWluRXJyb3IsIGUubWVzc2FnZQorICAgIGVuZAorCisgICAgZGVmIGZsb29yKGlucHV0KQorICAgICAgVXRpbHMudG9fbnVtYmVyKGlucHV0KS5mbG9vci50b19pCisgICAgcmVzY3VlIDo6RmxvYXREb21haW5FcnJvciA9PiBlCisgICAgICByYWlzZSBMaXF1aWQ6OkZsb2F0RG9tYWluRXJyb3IsIGUubWVzc2FnZQorICAgIGVuZAorCisgICAgZGVmIGRlZmF1bHQoaW5wdXQsIGRlZmF1bHRfdmFsdWUgPSAnJy5mcmVlemUpCisgICAgICBpZiAhaW5wdXQgfHwgaW5wdXQucmVzcG9uZF90bz8oOmVtcHR5PykgJiYgaW5wdXQuZW1wdHk/CisgICAgICAgIGRlZmF1bHRfdmFsdWUKKyAgICAgIGVsc2UKKyAgICAgICAgaW5wdXQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIGFwcGx5X29wZXJhdGlvbihpbnB1dCwgb3BlcmFuZCwgb3BlcmF0aW9uKQorICAgICAgcmVzdWx0ID0gVXRpbHMudG9fbnVtYmVyKGlucHV0KS5zZW5kKG9wZXJhdGlvbiwgVXRpbHMudG9fbnVtYmVyKG9wZXJhbmQpKQorICAgICAgcmVzdWx0LmlzX2E/KEJpZ0RlY2ltYWwpID8gcmVzdWx0LnRvX2YgOiByZXN1bHQKKyAgICBlbmQKKworICAgIGNsYXNzIElucHV0SXRlcmF0b3IKKyAgICAgIGluY2x1ZGUgRW51bWVyYWJsZQorCisgICAgICBkZWYgaW5pdGlhbGl6ZShpbnB1dCkKKyAgICAgICAgQGlucHV0ID0gaWYgaW5wdXQuaXNfYT8oQXJyYXkpCisgICAgICAgICAgaW5wdXQuZmxhdHRlbgorICAgICAgICBlbHNpZiBpbnB1dC5pc19hPyhIYXNoKQorICAgICAgICAgIFtpbnB1dF0KKyAgICAgICAgZWxzaWYgaW5wdXQuaXNfYT8oRW51bWVyYWJsZSkKKyAgICAgICAgICBpbnB1dAorICAgICAgICBlbHNlCisgICAgICAgICAgQXJyYXkoaW5wdXQpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBqb2luKGdsdWUpCisgICAgICAgIHRvX2Euam9pbihnbHVlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb25jYXQoYXJncykKKyAgICAgICAgdG9fYS5jb25jYXQoYXJncykKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmV2ZXJzZQorICAgICAgICByZXZlcnNlX2VhY2gudG9fYQorICAgICAgZW5kCisKKyAgICAgIGRlZiB1bmlxKCZibG9jaykKKyAgICAgICAgdG9fYS51bmlxKCZibG9jaykKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29tcGFjdAorICAgICAgICB0b19hLmNvbXBhY3QKKyAgICAgIGVuZAorCisgICAgICBkZWYgZW1wdHk/CisgICAgICAgIEBpbnB1dC5lYWNoIHsgcmV0dXJuIGZhbHNlIH0KKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBlYWNoCisgICAgICAgIEBpbnB1dC5lYWNoIGRvIHxlfAorICAgICAgICAgIHlpZWxkKGUucmVzcG9uZF90bz8oOnRvX2xpcXVpZCkgPyBlLnRvX2xpcXVpZCA6IGUpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIFRlbXBsYXRlLnJlZ2lzdGVyX2ZpbHRlcihTdGFuZGFyZEZpbHRlcnMpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3N0cmFpbmVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvc3RyYWluZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhOWMyOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3N0cmFpbmVyLnJiCkBAIC0wLDAgKzEsNjYgQEAKK3JlcXVpcmUgJ3NldCcKKworbW9kdWxlIExpcXVpZAorICAjIFN0cmFpbmVyIGlzIHRoZSBwYXJlbnQgY2xhc3MgZm9yIHRoZSBmaWx0ZXJzIHN5c3RlbS4KKyAgIyBOZXcgZmlsdGVycyBhcmUgbWl4ZWQgaW50byB0aGUgc3RyYWluZXIgY2xhc3Mgd2hpY2ggaXMgdGhlbiBpbnN0YW50aWF0ZWQgZm9yIGVhY2ggbGlxdWlkIHRlbXBsYXRlIHJlbmRlciBydW4uCisgICMKKyAgIyBUaGUgU3RyYWluZXIgb25seSBhbGxvd3MgbWV0aG9kIGNhbGxzIGRlZmluZWQgaW4gZmlsdGVycyBnaXZlbiB0byBpdCB2aWEgU3RyYWluZXIuZ2xvYmFsX2ZpbHRlciwKKyAgIyBDb250ZXh0I2FkZF9maWx0ZXJzIG9yIFRlbXBsYXRlLnJlZ2lzdGVyX2ZpbHRlcgorICBjbGFzcyBTdHJhaW5lciAjOm5vZG9jOgorICAgIEBAZ2xvYmFsX3N0cmFpbmVyID0gQ2xhc3MubmV3KFN0cmFpbmVyKSBkbworICAgICAgQGZpbHRlcl9tZXRob2RzID0gU2V0Lm5ldworICAgIGVuZAorICAgIEBAc3RyYWluZXJfY2xhc3NfY2FjaGUgPSBIYXNoLm5ldyBkbyB8aGFzaCwgZmlsdGVyc3wKKyAgICAgIGhhc2hbZmlsdGVyc10gPSBDbGFzcy5uZXcoQEBnbG9iYWxfc3RyYWluZXIpIGRvCisgICAgICAgIEBmaWx0ZXJfbWV0aG9kcyA9IEBAZ2xvYmFsX3N0cmFpbmVyLmZpbHRlcl9tZXRob2RzLmR1cAorICAgICAgICBmaWx0ZXJzLmVhY2ggeyB8ZnwgYWRkX2ZpbHRlcihmKSB9CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBpbml0aWFsaXplKGNvbnRleHQpCisgICAgICBAY29udGV4dCA9IGNvbnRleHQKKyAgICBlbmQKKworICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgIGF0dHJfcmVhZGVyIDpmaWx0ZXJfbWV0aG9kcworICAgIGVuZAorCisgICAgZGVmIHNlbGYuYWRkX2ZpbHRlcihmaWx0ZXIpCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiRXhwZWN0ZWQgbW9kdWxlIGJ1dCBnb3Q6ICN7ZmlsdGVyLmNsYXNzfSIgdW5sZXNzIGZpbHRlci5pc19hPyhNb2R1bGUpCisgICAgICB1bmxlc3Mgc2VsZi5jbGFzcy5pbmNsdWRlPyhmaWx0ZXIpCisgICAgICAgIGludm9rYWJsZV9ub25fcHVibGljX21ldGhvZHMgPSAoZmlsdGVyLnByaXZhdGVfaW5zdGFuY2VfbWV0aG9kcyArIGZpbHRlci5wcm90ZWN0ZWRfaW5zdGFuY2VfbWV0aG9kcykuc2VsZWN0IHsgfG18IGludm9rYWJsZT8obSkgfQorICAgICAgICBpZiBpbnZva2FibGVfbm9uX3B1YmxpY19tZXRob2RzLmFueT8KKyAgICAgICAgICByYWlzZSBNZXRob2RPdmVycmlkZUVycm9yLCAiRmlsdGVyIG92ZXJyaWRlcyByZWdpc3RlcmVkIHB1YmxpYyBtZXRob2RzIGFzIG5vbiBwdWJsaWM6ICN7aW52b2thYmxlX25vbl9wdWJsaWNfbWV0aG9kcy5qb2luKCcsICcpfSIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNlbmQoOmluY2x1ZGUsIGZpbHRlcikKKyAgICAgICAgICBAZmlsdGVyX21ldGhvZHMubWVyZ2UoZmlsdGVyLnB1YmxpY19pbnN0YW5jZV9tZXRob2RzLm1hcCgmOnRvX3MpKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHNlbGYuZ2xvYmFsX2ZpbHRlcihmaWx0ZXIpCisgICAgICBAQHN0cmFpbmVyX2NsYXNzX2NhY2hlLmNsZWFyCisgICAgICBAQGdsb2JhbF9zdHJhaW5lci5hZGRfZmlsdGVyKGZpbHRlcikKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmludm9rYWJsZT8obWV0aG9kKQorICAgICAgQGZpbHRlcl9tZXRob2RzLmluY2x1ZGU/KG1ldGhvZC50b19zKQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuY3JlYXRlKGNvbnRleHQsIGZpbHRlcnMgPSBbXSkKKyAgICAgIEBAc3RyYWluZXJfY2xhc3NfY2FjaGVbZmlsdGVyc10ubmV3KGNvbnRleHQpCisgICAgZW5kCisKKyAgICBkZWYgaW52b2tlKG1ldGhvZCwgKmFyZ3MpCisgICAgICBpZiBzZWxmLmNsYXNzLmludm9rYWJsZT8obWV0aG9kKQorICAgICAgICBzZW5kKG1ldGhvZCwgKmFyZ3MpCisgICAgICBlbHNpZiBAY29udGV4dCAmJiBAY29udGV4dC5zdHJpY3RfZmlsdGVycworICAgICAgICByYWlzZSBMaXF1aWQ6OlVuZGVmaW5lZEZpbHRlciwgInVuZGVmaW5lZCBmaWx0ZXIgI3ttZXRob2R9IgorICAgICAgZWxzZQorICAgICAgICBhcmdzLmZpcnN0CisgICAgICBlbmQKKyAgICByZXNjdWUgOjpBcmd1bWVudEVycm9yID0+IGUKKyAgICAgIHJhaXNlIExpcXVpZDo6QXJndW1lbnRFcnJvciwgZS5tZXNzYWdlLCBlLmJhY2t0cmFjZQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFibGVyb3dsb29wX2Ryb3AucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWJsZXJvd2xvb3BfZHJvcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGE0YTFlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFibGVyb3dsb29wX2Ryb3AucmIKQEAgLTAsMCArMSw2MiBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBUYWJsZXJvd2xvb3BEcm9wIDwgRHJvcAorICAgIGRlZiBpbml0aWFsaXplKGxlbmd0aCwgY29scykKKyAgICAgIEBsZW5ndGggPSBsZW5ndGgKKyAgICAgIEByb3cgPSAxCisgICAgICBAY29sID0gMQorICAgICAgQGNvbHMgPSBjb2xzCisgICAgICBAaW5kZXggPSAwCisgICAgZW5kCisKKyAgICBhdHRyX3JlYWRlciA6bGVuZ3RoLCA6Y29sLCA6cm93CisKKyAgICBkZWYgaW5kZXgKKyAgICAgIEBpbmRleCArIDEKKyAgICBlbmQKKworICAgIGRlZiBpbmRleDAKKyAgICAgIEBpbmRleAorICAgIGVuZAorCisgICAgZGVmIGNvbDAKKyAgICAgIEBjb2wgLSAxCisgICAgZW5kCisKKyAgICBkZWYgcmluZGV4CisgICAgICBAbGVuZ3RoIC0gQGluZGV4CisgICAgZW5kCisKKyAgICBkZWYgcmluZGV4MAorICAgICAgQGxlbmd0aCAtIEBpbmRleCAtIDEKKyAgICBlbmQKKworICAgIGRlZiBmaXJzdAorICAgICAgQGluZGV4ID09IDAKKyAgICBlbmQKKworICAgIGRlZiBsYXN0CisgICAgICBAaW5kZXggPT0gQGxlbmd0aCAtIDEKKyAgICBlbmQKKworICAgIGRlZiBjb2xfZmlyc3QKKyAgICAgIEBjb2wgPT0gMQorICAgIGVuZAorCisgICAgZGVmIGNvbF9sYXN0CisgICAgICBAY29sID09IEBjb2xzCisgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKworICAgIGRlZiBpbmNyZW1lbnQhCisgICAgICBAaW5kZXggKz0gMQorCisgICAgICBpZiBAY29sID09IEBjb2xzCisgICAgICAgIEBjb2wgPSAxCisgICAgICAgIEByb3cgKz0gMQorICAgICAgZWxzZQorICAgICAgICBAY29sICs9IDEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFnLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFnLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OTcwYzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWcucmIKQEAgLTAsMCArMSw0MyBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBUYWcKKyAgICBhdHRyX3JlYWRlciA6bm9kZWxpc3QsIDp0YWdfbmFtZSwgOmxpbmVfbnVtYmVyLCA6cGFyc2VfY29udGV4dAorICAgIGFsaWFzX21ldGhvZCA6b3B0aW9ucywgOnBhcnNlX2NvbnRleHQKKyAgICBpbmNsdWRlIFBhcnNlclN3aXRjaGluZworCisgICAgY2xhc3MgPDwgc2VsZgorICAgICAgZGVmIHBhcnNlKHRhZ19uYW1lLCBtYXJrdXAsIHRva2VuaXplciwgb3B0aW9ucykKKyAgICAgICAgdGFnID0gbmV3KHRhZ19uYW1lLCBtYXJrdXAsIG9wdGlvbnMpCisgICAgICAgIHRhZy5wYXJzZSh0b2tlbml6ZXIpCisgICAgICAgIHRhZworICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUgOm5ldworICAgIGVuZAorCisgICAgZGVmIGluaXRpYWxpemUodGFnX25hbWUsIG1hcmt1cCwgcGFyc2VfY29udGV4dCkKKyAgICAgIEB0YWdfbmFtZSAgID0gdGFnX25hbWUKKyAgICAgIEBtYXJrdXAgICAgID0gbWFya3VwCisgICAgICBAcGFyc2VfY29udGV4dCA9IHBhcnNlX2NvbnRleHQKKyAgICAgIEBsaW5lX251bWJlciA9IHBhcnNlX2NvbnRleHQubGluZV9udW1iZXIKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZShfdG9rZW5zKQorICAgIGVuZAorCisgICAgZGVmIHJhdworICAgICAgIiN7QHRhZ19uYW1lfSAje0BtYXJrdXB9IgorICAgIGVuZAorCisgICAgZGVmIG5hbWUKKyAgICAgIHNlbGYuY2xhc3MubmFtZS5kb3duY2FzZQorICAgIGVuZAorCisgICAgZGVmIHJlbmRlcihfY29udGV4dCkKKyAgICAgICcnLmZyZWV6ZQorICAgIGVuZAorCisgICAgZGVmIGJsYW5rPworICAgICAgZmFsc2UKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvYXNzaWduLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9hc3NpZ24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjZDVmYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvYXNzaWduLnJiCkBAIC0wLDAgKzEsNTEgQEAKK21vZHVsZSBMaXF1aWQKKyAgIyBBc3NpZ24gc2V0cyBhIHZhcmlhYmxlIGluIHlvdXIgdGVtcGxhdGUuCisgICMKKyAgIyAgIHslIGFzc2lnbiBmb28gPSAnbW9ua2V5JyAlfQorICAjCisgICMgWW91IGNhbiB0aGVuIHVzZSB0aGUgdmFyaWFibGUgbGF0ZXIgaW4gdGhlIHBhZ2UuCisgICMKKyAgIyAge3sgZm9vIH19CisgICMKKyAgY2xhc3MgQXNzaWduIDwgVGFnCisgICAgU3ludGF4ID0gLygje1ZhcmlhYmxlU2lnbmF0dXJlfSspXHMqPVxzKiguKilccyovb20KKworICAgIGRlZiBpbml0aWFsaXplKHRhZ19uYW1lLCBtYXJrdXAsIG9wdGlvbnMpCisgICAgICBzdXBlcgorICAgICAgaWYgbWFya3VwID1+IFN5bnRheAorICAgICAgICBAdG8gPSAkMQorICAgICAgICBAZnJvbSA9IFZhcmlhYmxlLm5ldygkMiwgb3B0aW9ucykKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3IG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5hc3NpZ24iLmZyZWV6ZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlbmRlcihjb250ZXh0KQorICAgICAgdmFsID0gQGZyb20ucmVuZGVyKGNvbnRleHQpCisgICAgICBjb250ZXh0LnNjb3Blcy5sYXN0W0B0b10gPSB2YWwKKyAgICAgIGNvbnRleHQucmVzb3VyY2VfbGltaXRzLmFzc2lnbl9zY29yZSArPSBhc3NpZ25fc2NvcmVfb2YodmFsKQorICAgICAgJycuZnJlZXplCisgICAgZW5kCisKKyAgICBkZWYgYmxhbms/CisgICAgICB0cnVlCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgYXNzaWduX3Njb3JlX29mKHZhbCkKKyAgICAgIGlmIHZhbC5pbnN0YW5jZV9vZj8oU3RyaW5nKQorICAgICAgICB2YWwubGVuZ3RoCisgICAgICBlbHNpZiB2YWwuaW5zdGFuY2Vfb2Y/KEFycmF5KSB8fCB2YWwuaW5zdGFuY2Vfb2Y/KEhhc2gpCisgICAgICAgIHN1bSA9IDEKKyAgICAgICAgIyBVc2VzICNlYWNoIHRvIGF2b2lkIGV4dHJhIGFsbG9jYXRpb25zLgorICAgICAgICB2YWwuZWFjaCB7IHxjaGlsZHwgc3VtICs9IGFzc2lnbl9zY29yZV9vZihjaGlsZCkgfQorICAgICAgICBzdW0KKyAgICAgIGVsc2UKKyAgICAgICAgMQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIFRlbXBsYXRlLnJlZ2lzdGVyX3RhZygnYXNzaWduJy5mcmVlemUsIEFzc2lnbikKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9icmVhay5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvYnJlYWsucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlMDk2OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvYnJlYWsucmIKQEAgLTAsMCArMSwxOCBAQAorbW9kdWxlIExpcXVpZAorICAjIEJyZWFrIHRhZyB0byBiZSB1c2VkIHRvIGJyZWFrIG91dCBvZiBhIGZvciBsb29wLgorICAjCisgICMgPT0gQmFzaWMgVXNhZ2U6CisgICMgICAgeyUgZm9yIGl0ZW0gaW4gY29sbGVjdGlvbiAlfQorICAjICAgICAgeyUgaWYgaXRlbS5jb25kaXRpb24gJX0KKyAgIyAgICAgICAgeyUgYnJlYWsgJX0KKyAgIyAgICAgIHslIGVuZGlmICV9CisgICMgICAgeyUgZW5kZm9yICV9CisgICMKKyAgY2xhc3MgQnJlYWsgPCBUYWcKKyAgICBkZWYgaW50ZXJydXB0CisgICAgICBCcmVha0ludGVycnVwdC5uZXcKKyAgICBlbmQKKyAgZW5kCisKKyAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdicmVhaycuZnJlZXplLCBCcmVhaykKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9jYXB0dXJlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9jYXB0dXJlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzQzNTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2NhcHR1cmUucmIKQEAgLTAsMCArMSwzOCBAQAorbW9kdWxlIExpcXVpZAorICAjIENhcHR1cmUgc3RvcmVzIHRoZSByZXN1bHQgb2YgYSBibG9jayBpbnRvIGEgdmFyaWFibGUgd2l0aG91dCByZW5kZXJpbmcgaXQgaW5wbGFjZS4KKyAgIworICAjICAgeyUgY2FwdHVyZSBoZWFkaW5nICV9CisgICMgICAgIE1vbmtleXMhCisgICMgICB7JSBlbmRjYXB0dXJlICV9CisgICMgICAuLi4KKyAgIyAgIDxoMT57eyBoZWFkaW5nIH19PC9oMT4KKyAgIworICAjIENhcHR1cmUgaXMgdXNlZnVsIGZvciBzYXZpbmcgY29udGVudCBmb3IgdXNlIGxhdGVyIGluIHlvdXIgdGVtcGxhdGUsIHN1Y2ggYXMKKyAgIyBpbiBhIHNpZGViYXIgb3IgZm9vdGVyLgorICAjCisgIGNsYXNzIENhcHR1cmUgPCBCbG9jaworICAgIFN5bnRheCA9IC8oI3tWYXJpYWJsZVNpZ25hdHVyZX0rKS9vCisKKyAgICBkZWYgaW5pdGlhbGl6ZSh0YWdfbmFtZSwgbWFya3VwLCBvcHRpb25zKQorICAgICAgc3VwZXIKKyAgICAgIGlmIG1hcmt1cCA9fiBTeW50YXgKKyAgICAgICAgQHRvID0gJDEKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5jYXB0dXJlIikpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiByZW5kZXIoY29udGV4dCkKKyAgICAgIG91dHB1dCA9IHN1cGVyCisgICAgICBjb250ZXh0LnNjb3Blcy5sYXN0W0B0b10gPSBvdXRwdXQKKyAgICAgIGNvbnRleHQucmVzb3VyY2VfbGltaXRzLmFzc2lnbl9zY29yZSArPSBvdXRwdXQubGVuZ3RoCisgICAgICAnJy5mcmVlemUKKyAgICBlbmQKKworICAgIGRlZiBibGFuaz8KKyAgICAgIHRydWUKKyAgICBlbmQKKyAgZW5kCisKKyAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdjYXB0dXJlJy5mcmVlemUsIENhcHR1cmUpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvY2FzZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvY2FzZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTNiNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9jYXNlLnJiCkBAIC0wLDAgKzEsODYgQEAKK21vZHVsZSBMaXF1aWQKKyAgY2xhc3MgQ2FzZSA8IEJsb2NrCisgICAgU3ludGF4ICAgICA9IC8oI3tRdW90ZWRGcmFnbWVudH0pL28KKyAgICBXaGVuU3ludGF4ID0gLygje1F1b3RlZEZyYWdtZW50fSkoPzooPzpccytvclxzK3xccypcLFxzKikoI3tRdW90ZWRGcmFnbWVudH0uKikpPy9vbQorCisgICAgZGVmIGluaXRpYWxpemUodGFnX25hbWUsIG1hcmt1cCwgb3B0aW9ucykKKyAgICAgIHN1cGVyCisgICAgICBAYmxvY2tzID0gW10KKworICAgICAgaWYgbWFya3VwID1+IFN5bnRheAorICAgICAgICBAbGVmdCA9IEV4cHJlc3Npb24ucGFyc2UoJDEpCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldyhvcHRpb25zWzpsb2NhbGVdLnQoImVycm9ycy5zeW50YXguY2FzZSIuZnJlZXplKSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHBhcnNlKHRva2VucykKKyAgICAgIGJvZHkgPSBCbG9ja0JvZHkubmV3CisgICAgICB3aGlsZSBwYXJzZV9ib2R5KGJvZHksIHRva2VucykKKyAgICAgICAgYm9keSA9IEBibG9ja3MubGFzdC5hdHRhY2htZW50CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBub2RlbGlzdAorICAgICAgQGJsb2Nrcy5tYXAoJjphdHRhY2htZW50KQorICAgIGVuZAorCisgICAgZGVmIHVua25vd25fdGFnKHRhZywgbWFya3VwLCB0b2tlbnMpCisgICAgICBjYXNlIHRhZworICAgICAgd2hlbiAnd2hlbicuZnJlZXplCisgICAgICAgIHJlY29yZF93aGVuX2NvbmRpdGlvbihtYXJrdXApCisgICAgICB3aGVuICdlbHNlJy5mcmVlemUKKyAgICAgICAgcmVjb3JkX2Vsc2VfY29uZGl0aW9uKG1hcmt1cCkKKyAgICAgIGVsc2UKKyAgICAgICAgc3VwZXIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlbmRlcihjb250ZXh0KQorICAgICAgY29udGV4dC5zdGFjayBkbworICAgICAgICBleGVjdXRlX2Vsc2VfYmxvY2sgPSB0cnVlCisKKyAgICAgICAgb3V0cHV0ID0gJycKKyAgICAgICAgQGJsb2Nrcy5lYWNoIGRvIHxibG9ja3wKKyAgICAgICAgICBpZiBibG9jay5lbHNlPworICAgICAgICAgICAgcmV0dXJuIGJsb2NrLmF0dGFjaG1lbnQucmVuZGVyKGNvbnRleHQpIGlmIGV4ZWN1dGVfZWxzZV9ibG9jaworICAgICAgICAgIGVsc2lmIGJsb2NrLmV2YWx1YXRlKGNvbnRleHQpCisgICAgICAgICAgICBleGVjdXRlX2Vsc2VfYmxvY2sgPSBmYWxzZQorICAgICAgICAgICAgb3V0cHV0IDw8IGJsb2NrLmF0dGFjaG1lbnQucmVuZGVyKGNvbnRleHQpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBvdXRwdXQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIHJlY29yZF93aGVuX2NvbmRpdGlvbihtYXJrdXApCisgICAgICBib2R5ID0gQmxvY2tCb2R5Lm5ldworCisgICAgICB3aGlsZSBtYXJrdXAKKyAgICAgICAgdW5sZXNzIG1hcmt1cCA9fiBXaGVuU3ludGF4CisgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5jYXNlX2ludmFsaWRfd2hlbiIuZnJlZXplKSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgbWFya3VwID0gJDIKKworICAgICAgICBibG9jayA9IENvbmRpdGlvbi5uZXcoQGxlZnQsICc9PScuZnJlZXplLCBFeHByZXNzaW9uLnBhcnNlKCQxKSkKKyAgICAgICAgYmxvY2suYXR0YWNoKGJvZHkpCisgICAgICAgIEBibG9ja3MgPDwgYmxvY2sKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlY29yZF9lbHNlX2NvbmRpdGlvbihtYXJrdXApCisgICAgICB1bmxlc3MgbWFya3VwLnN0cmlwLmVtcHR5PworICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcob3B0aW9uc1s6bG9jYWxlXS50KCJlcnJvcnMuc3ludGF4LmNhc2VfaW52YWxpZF9lbHNlIi5mcmVlemUpKQorICAgICAgZW5kCisKKyAgICAgIGJsb2NrID0gRWxzZUNvbmRpdGlvbi5uZXcKKyAgICAgIGJsb2NrLmF0dGFjaChCbG9ja0JvZHkubmV3KQorICAgICAgQGJsb2NrcyA8PCBibG9jaworICAgIGVuZAorICBlbmQKKworICBUZW1wbGF0ZS5yZWdpc3Rlcl90YWcoJ2Nhc2UnLmZyZWV6ZSwgQ2FzZSkKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9jb21tZW50LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9jb21tZW50LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1N2M5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2NvbW1lbnQucmIKQEAgLTAsMCArMSwxNiBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBDb21tZW50IDwgQmxvY2sKKyAgICBkZWYgcmVuZGVyKF9jb250ZXh0KQorICAgICAgJycuZnJlZXplCisgICAgZW5kCisKKyAgICBkZWYgdW5rbm93bl90YWcoX3RhZywgX21hcmt1cCwgX3Rva2VucykKKyAgICBlbmQKKworICAgIGRlZiBibGFuaz8KKyAgICAgIHRydWUKKyAgICBlbmQKKyAgZW5kCisKKyAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdjb21tZW50Jy5mcmVlemUsIENvbW1lbnQpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvY29udGludWUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2NvbnRpbnVlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODFlYzIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2NvbnRpbnVlLnJiCkBAIC0wLDAgKzEsMTggQEAKK21vZHVsZSBMaXF1aWQKKyAgIyBDb250aW51ZSB0YWcgdG8gYmUgdXNlZCB0byBicmVhayBvdXQgb2YgYSBmb3IgbG9vcC4KKyAgIworICAjID09IEJhc2ljIFVzYWdlOgorICAjICAgIHslIGZvciBpdGVtIGluIGNvbGxlY3Rpb24gJX0KKyAgIyAgICAgIHslIGlmIGl0ZW0uY29uZGl0aW9uICV9CisgICMgICAgICAgIHslIGNvbnRpbnVlICV9CisgICMgICAgICB7JSBlbmRpZiAlfQorICAjICAgIHslIGVuZGZvciAlfQorICAjCisgIGNsYXNzIENvbnRpbnVlIDwgVGFnCisgICAgZGVmIGludGVycnVwdAorICAgICAgQ29udGludWVJbnRlcnJ1cHQubmV3CisgICAgZW5kCisgIGVuZAorCisgIFRlbXBsYXRlLnJlZ2lzdGVyX3RhZygnY29udGludWUnLmZyZWV6ZSwgQ29udGludWUpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvY3ljbGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2N5Y2xlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NWI5ODgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2N5Y2xlLnJiCkBAIC0wLDAgKzEsNTcgQEAKK21vZHVsZSBMaXF1aWQKKyAgIyBDeWNsZSBpcyB1c3VhbGx5IHVzZWQgd2l0aGluIGEgbG9vcCB0byBhbHRlcm5hdGUgYmV0d2VlbiB2YWx1ZXMsIGxpa2UgY29sb3JzIG9yIERPTSBjbGFzc2VzLgorICAjCisgICMgICB7JSBmb3IgaXRlbSBpbiBpdGVtcyAlfQorICAjICAgICA8ZGl2IGNsYXNzPSJ7JSBjeWNsZSAncmVkJywgJ2dyZWVuJywgJ2JsdWUnICV9Ij4ge3sgaXRlbSB9fSA8L2Rpdj4KKyAgIyAgIHslIGVuZCAlfQorICAjCisgICMgICAgPGRpdiBjbGFzcz0icmVkIj4gSXRlbSBvbmUgPC9kaXY+CisgICMgICAgPGRpdiBjbGFzcz0iZ3JlZW4iPiBJdGVtIHR3byA8L2Rpdj4KKyAgIyAgICA8ZGl2IGNsYXNzPSJibHVlIj4gSXRlbSB0aHJlZSA8L2Rpdj4KKyAgIyAgICA8ZGl2IGNsYXNzPSJyZWQiPiBJdGVtIGZvdXIgPC9kaXY+CisgICMgICAgPGRpdiBjbGFzcz0iZ3JlZW4iPiBJdGVtIGZpdmU8L2Rpdj4KKyAgIworICBjbGFzcyBDeWNsZSA8IFRhZworICAgIFNpbXBsZVN5bnRheCA9IC9cQSN7UXVvdGVkRnJhZ21lbnR9Ky9vCisgICAgTmFtZWRTeW50YXggID0gL1xBKCN7UXVvdGVkRnJhZ21lbnR9KVxzKlw6XHMqKC4qKS9vbQorCisgICAgZGVmIGluaXRpYWxpemUodGFnX25hbWUsIG1hcmt1cCwgb3B0aW9ucykKKyAgICAgIHN1cGVyCisgICAgICBjYXNlIG1hcmt1cAorICAgICAgd2hlbiBOYW1lZFN5bnRheAorICAgICAgICBAdmFyaWFibGVzID0gdmFyaWFibGVzX2Zyb21fc3RyaW5nKCQyKQorICAgICAgICBAbmFtZSA9IEV4cHJlc3Npb24ucGFyc2UoJDEpCisgICAgICB3aGVuIFNpbXBsZVN5bnRheAorICAgICAgICBAdmFyaWFibGVzID0gdmFyaWFibGVzX2Zyb21fc3RyaW5nKG1hcmt1cCkKKyAgICAgICAgQG5hbWUgPSBAdmFyaWFibGVzLnRvX3MKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5jeWNsZSIuZnJlZXplKSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlbmRlcihjb250ZXh0KQorICAgICAgY29udGV4dC5yZWdpc3RlcnNbOmN5Y2xlXSB8fD0gSGFzaC5uZXcoMCkKKworICAgICAgY29udGV4dC5zdGFjayBkbworICAgICAgICBrZXkgPSBjb250ZXh0LmV2YWx1YXRlKEBuYW1lKQorICAgICAgICBpdGVyYXRpb24gPSBjb250ZXh0LnJlZ2lzdGVyc1s6Y3ljbGVdW2tleV0KKyAgICAgICAgcmVzdWx0ID0gY29udGV4dC5ldmFsdWF0ZShAdmFyaWFibGVzW2l0ZXJhdGlvbl0pCisgICAgICAgIGl0ZXJhdGlvbiArPSAxCisgICAgICAgIGl0ZXJhdGlvbiAgPSAwIGlmIGl0ZXJhdGlvbiA+PSBAdmFyaWFibGVzLnNpemUKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcnNbOmN5Y2xlXVtrZXldID0gaXRlcmF0aW9uCisgICAgICAgIHJlc3VsdAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgdmFyaWFibGVzX2Zyb21fc3RyaW5nKG1hcmt1cCkKKyAgICAgIG1hcmt1cC5zcGxpdCgnLCcpLmNvbGxlY3QgZG8gfHZhcnwKKyAgICAgICAgdmFyID1+IC9ccyooI3tRdW90ZWRGcmFnbWVudH0pXHMqL28KKyAgICAgICAgJDEgPyBFeHByZXNzaW9uLnBhcnNlKCQxKSA6IG5pbAorICAgICAgZW5kLmNvbXBhY3QKKyAgICBlbmQKKyAgZW5kCisKKyAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdjeWNsZScsIEN5Y2xlKQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2RlY3JlbWVudC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvZGVjcmVtZW50LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2RhYWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2RlY3JlbWVudC5yYgpAQCAtMCwwICsxLDM1IEBACittb2R1bGUgTGlxdWlkCisgICMgZGVjcmVtZW50IGlzIHVzZWQgaW4gYSBwbGFjZSB3aGVyZSBvbmUgbmVlZHMgdG8gaW5zZXJ0IGEgY291bnRlcgorICAjICAgICBpbnRvIGEgdGVtcGxhdGUsIGFuZCBuZWVkcyB0aGUgY291bnRlciB0byBzdXJ2aXZlIGFjcm9zcworICAjICAgICBtdWx0aXBsZSBpbnN0YW50aWF0aW9ucyBvZiB0aGUgdGVtcGxhdGUuCisgICMgICAgIE5PVEU6IGRlY3JlbWVudCBpcyBhIHByZS1kZWNyZW1lbnQsIC0taSwKKyAgIyAgICAgICAgICAgd2hpbGUgaW5jcmVtZW50IGlzIHBvc3Q6ICAgICAgaSsrLgorICAjCisgICMgICAgIChUbyBhY2hpZXZlIHRoZSBzdXJ2aXZhbCwgdGhlIGFwcGxpY2F0aW9uIG11c3Qga2VlcCB0aGUgY29udGV4dCkKKyAgIworICAjICAgICBpZiB0aGUgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgd2l0aCB2YWx1ZSAwLgorCisgICMgICBIZWxsbzogeyUgZGVjcmVtZW50IHZhcmlhYmxlICV9CisgICMKKyAgIyBnaXZlcyB5b3U6CisgICMKKyAgIyAgICBIZWxsbzogLTEKKyAgIyAgICBIZWxsbzogLTIKKyAgIyAgICBIZWxsbzogLTMKKyAgIworICBjbGFzcyBEZWNyZW1lbnQgPCBUYWcKKyAgICBkZWYgaW5pdGlhbGl6ZSh0YWdfbmFtZSwgbWFya3VwLCBvcHRpb25zKQorICAgICAgc3VwZXIKKyAgICAgIEB2YXJpYWJsZSA9IG1hcmt1cC5zdHJpcAorICAgIGVuZAorCisgICAgZGVmIHJlbmRlcihjb250ZXh0KQorICAgICAgdmFsdWUgPSBjb250ZXh0LmVudmlyb25tZW50cy5maXJzdFtAdmFyaWFibGVdIHx8PSAwCisgICAgICB2YWx1ZSAtPSAxCisgICAgICBjb250ZXh0LmVudmlyb25tZW50cy5maXJzdFtAdmFyaWFibGVdID0gdmFsdWUKKyAgICAgIHZhbHVlLnRvX3MKKyAgICBlbmQKKyAgZW5kCisKKyAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdkZWNyZW1lbnQnLmZyZWV6ZSwgRGVjcmVtZW50KQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2Zvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvZm9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDExYjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2Zvci5yYgpAQCAtMCwwICsxLDE5NSBAQAorbW9kdWxlIExpcXVpZAorICAjICJGb3IiIGl0ZXJhdGVzIG92ZXIgYW4gYXJyYXkgb3IgY29sbGVjdGlvbi4KKyAgIyBTZXZlcmFsIHVzZWZ1bCB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSB0byB5b3Ugd2l0aGluIHRoZSBsb29wLgorICAjCisgICMgPT0gQmFzaWMgdXNhZ2U6CisgICMgICAgeyUgZm9yIGl0ZW0gaW4gY29sbGVjdGlvbiAlfQorICAjICAgICAge3sgZm9ybG9vcC5pbmRleCB9fToge3sgaXRlbS5uYW1lIH19CisgICMgICAgeyUgZW5kZm9yICV9CisgICMKKyAgIyA9PSBBZHZhbmNlZCB1c2FnZToKKyAgIyAgICB7JSBmb3IgaXRlbSBpbiBjb2xsZWN0aW9uICV9CisgICMgICAgICA8ZGl2IHslIGlmIGZvcmxvb3AuZmlyc3QgJX1jbGFzcz0iZmlyc3QieyUgZW5kaWYgJX0+CisgICMgICAgICAgIEl0ZW0ge3sgZm9ybG9vcC5pbmRleCB9fToge3sgaXRlbS5uYW1lIH19CisgICMgICAgICA8L2Rpdj4KKyAgIyAgICB7JSBlbHNlICV9CisgICMgICAgICBUaGVyZSBpcyBub3RoaW5nIGluIHRoZSBjb2xsZWN0aW9uLgorICAjICAgIHslIGVuZGZvciAlfQorICAjCisgICMgWW91IGNhbiBhbHNvIGRlZmluZSBhIGxpbWl0IGFuZCBvZmZzZXQgbXVjaCBsaWtlIFNRTC4gIFJlbWVtYmVyCisgICMgdGhhdCBvZmZzZXQgc3RhcnRzIGF0IDAgZm9yIHRoZSBmaXJzdCBpdGVtLgorICAjCisgICMgICAgeyUgZm9yIGl0ZW0gaW4gY29sbGVjdGlvbiBsaW1pdDo1IG9mZnNldDoxMCAlfQorICAjICAgICAge3sgaXRlbS5uYW1lIH19CisgICMgICAgeyUgZW5kICV9CisgICMKKyAgIyAgVG8gcmV2ZXJzZSB0aGUgZm9yIGxvb3Agc2ltcGx5IHVzZSB7JSBmb3IgaXRlbSBpbiBjb2xsZWN0aW9uIHJldmVyc2VkICV9CisgICMKKyAgIyA9PSBBdmFpbGFibGUgdmFyaWFibGVzOgorICAjCisgICMgZm9ybG9vcC5uYW1lOjogJ2l0ZW0tY29sbGVjdGlvbicKKyAgIyBmb3Jsb29wLmxlbmd0aDo6IExlbmd0aCBvZiB0aGUgbG9vcAorICAjIGZvcmxvb3AuaW5kZXg6OiBUaGUgY3VycmVudCBpdGVtJ3MgcG9zaXRpb24gaW4gdGhlIGNvbGxlY3Rpb247CisgICMgICAgICAgICAgICAgICAgIGZvcmxvb3AuaW5kZXggc3RhcnRzIGF0IDEuCisgICMgICAgICAgICAgICAgICAgIFRoaXMgaXMgaGVscGZ1bCBmb3Igbm9uLXByb2dyYW1tZXJzIHdobyBzdGFydCBiZWxpZXZlCisgICMgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBpdGVtIGluIGFuIGFycmF5IGlzIDEsIG5vdCAwLgorICAjIGZvcmxvb3AuaW5kZXgwOjogVGhlIGN1cnJlbnQgaXRlbSdzIHBvc2l0aW9uIGluIHRoZSBjb2xsZWN0aW9uCisgICMgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZmlyc3QgaXRlbSBpcyAwCisgICMgZm9ybG9vcC5yaW5kZXg6OiBOdW1iZXIgb2YgaXRlbXMgcmVtYWluaW5nIGluIHRoZSBsb29wCisgICMgICAgICAgICAgICAgICAgICAobGVuZ3RoIC0gaW5kZXgpIHdoZXJlIDEgaXMgdGhlIGxhc3QgaXRlbS4KKyAgIyBmb3Jsb29wLnJpbmRleDA6OiBOdW1iZXIgb2YgaXRlbXMgcmVtYWluaW5nIGluIHRoZSBsb29wCisgICMgICAgICAgICAgICAgICAgICAgd2hlcmUgMCBpcyB0aGUgbGFzdCBpdGVtLgorICAjIGZvcmxvb3AuZmlyc3Q6OiBSZXR1cm5zIHRydWUgaWYgdGhlIGl0ZW0gaXMgdGhlIGZpcnN0IGl0ZW0uCisgICMgZm9ybG9vcC5sYXN0OjogUmV0dXJucyB0cnVlIGlmIHRoZSBpdGVtIGlzIHRoZSBsYXN0IGl0ZW0uCisgICMgZm9ybG9vcC5wYXJlbnRsb29wOjogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBwYXJlbnQgbG9vcCwgaWYgcHJlc2VudC4KKyAgIworICBjbGFzcyBGb3IgPCBCbG9jaworICAgIFN5bnRheCA9IC9cQSgje1ZhcmlhYmxlU2VnbWVudH0rKVxzK2luXHMrKCN7UXVvdGVkRnJhZ21lbnR9KylccyoocmV2ZXJzZWQpPy9vCisKKyAgICBkZWYgaW5pdGlhbGl6ZSh0YWdfbmFtZSwgbWFya3VwLCBvcHRpb25zKQorICAgICAgc3VwZXIKKyAgICAgIEBmcm9tID0gQGxpbWl0ID0gbmlsCisgICAgICBwYXJzZV93aXRoX3NlbGVjdGVkX3BhcnNlcihtYXJrdXApCisgICAgICBAZm9yX2Jsb2NrID0gQmxvY2tCb2R5Lm5ldworICAgICAgQGVsc2VfYmxvY2sgPSBuaWwKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZSh0b2tlbnMpCisgICAgICByZXR1cm4gdW5sZXNzIHBhcnNlX2JvZHkoQGZvcl9ibG9jaywgdG9rZW5zKQorICAgICAgcGFyc2VfYm9keShAZWxzZV9ibG9jaywgdG9rZW5zKQorICAgIGVuZAorCisgICAgZGVmIG5vZGVsaXN0CisgICAgICBAZWxzZV9ibG9jayA/IFtAZm9yX2Jsb2NrLCBAZWxzZV9ibG9ja10gOiBbQGZvcl9ibG9ja10KKyAgICBlbmQKKworICAgIGRlZiB1bmtub3duX3RhZyh0YWcsIG1hcmt1cCwgdG9rZW5zKQorICAgICAgcmV0dXJuIHN1cGVyIHVubGVzcyB0YWcgPT0gJ2Vsc2UnLmZyZWV6ZQorICAgICAgQGVsc2VfYmxvY2sgPSBCbG9ja0JvZHkubmV3CisgICAgZW5kCisKKyAgICBkZWYgcmVuZGVyKGNvbnRleHQpCisgICAgICBzZWdtZW50ID0gY29sbGVjdGlvbl9zZWdtZW50KGNvbnRleHQpCisKKyAgICAgIGlmIHNlZ21lbnQuZW1wdHk/CisgICAgICAgIHJlbmRlcl9lbHNlKGNvbnRleHQpCisgICAgICBlbHNlCisgICAgICAgIHJlbmRlcl9zZWdtZW50KGNvbnRleHQsIHNlZ21lbnQpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgZGVmIGxheF9wYXJzZShtYXJrdXApCisgICAgICBpZiBtYXJrdXAgPX4gU3ludGF4CisgICAgICAgIEB2YXJpYWJsZV9uYW1lID0gJDEKKyAgICAgICAgY29sbGVjdGlvbl9uYW1lID0gJDIKKyAgICAgICAgQHJldmVyc2VkID0gISEkMworICAgICAgICBAbmFtZSA9ICIje0B2YXJpYWJsZV9uYW1lfS0je2NvbGxlY3Rpb25fbmFtZX0iCisgICAgICAgIEBjb2xsZWN0aW9uX25hbWUgPSBFeHByZXNzaW9uLnBhcnNlKGNvbGxlY3Rpb25fbmFtZSkKKyAgICAgICAgbWFya3VwLnNjYW4oVGFnQXR0cmlidXRlcykgZG8gfGtleSwgdmFsdWV8CisgICAgICAgICAgc2V0X2F0dHJpYnV0ZShrZXksIHZhbHVlKQorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5mb3IiLmZyZWV6ZSkpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBzdHJpY3RfcGFyc2UobWFya3VwKQorICAgICAgcCA9IFBhcnNlci5uZXcobWFya3VwKQorICAgICAgQHZhcmlhYmxlX25hbWUgPSBwLmNvbnN1bWUoOmlkKQorICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5mb3JfaW52YWxpZF9pbiIuZnJlZXplKSkgdW5sZXNzIHAuaWQ/KCdpbicuZnJlZXplKQorICAgICAgY29sbGVjdGlvbl9uYW1lID0gcC5leHByZXNzaW9uCisgICAgICBAbmFtZSA9ICIje0B2YXJpYWJsZV9uYW1lfS0je2NvbGxlY3Rpb25fbmFtZX0iCisgICAgICBAY29sbGVjdGlvbl9uYW1lID0gRXhwcmVzc2lvbi5wYXJzZShjb2xsZWN0aW9uX25hbWUpCisgICAgICBAcmV2ZXJzZWQgPSBwLmlkPygncmV2ZXJzZWQnLmZyZWV6ZSkKKworICAgICAgd2hpbGUgcC5sb29rKDppZCkgJiYgcC5sb29rKDpjb2xvbiwgMSkKKyAgICAgICAgdW5sZXNzIGF0dHJpYnV0ZSA9IHAuaWQ/KCdsaW1pdCcuZnJlZXplKSB8fCBwLmlkPygnb2Zmc2V0Jy5mcmVlemUpCisgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5mb3JfaW52YWxpZF9hdHRyaWJ1dGUiLmZyZWV6ZSkpCisgICAgICAgIGVuZAorICAgICAgICBwLmNvbnN1bWUKKyAgICAgICAgc2V0X2F0dHJpYnV0ZShhdHRyaWJ1dGUsIHAuZXhwcmVzc2lvbikKKyAgICAgIGVuZAorICAgICAgcC5jb25zdW1lKDplbmRfb2Zfc3RyaW5nKQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIGNvbGxlY3Rpb25fc2VnbWVudChjb250ZXh0KQorICAgICAgb2Zmc2V0cyA9IGNvbnRleHQucmVnaXN0ZXJzWzpmb3JdIHx8PSBIYXNoLm5ldygwKQorCisgICAgICBmcm9tID0gaWYgQGZyb20gPT0gOmNvbnRpbnVlCisgICAgICAgIG9mZnNldHNbQG5hbWVdLnRvX2kKKyAgICAgIGVsc2UKKyAgICAgICAgY29udGV4dC5ldmFsdWF0ZShAZnJvbSkudG9faQorICAgICAgZW5kCisKKyAgICAgIGNvbGxlY3Rpb24gPSBjb250ZXh0LmV2YWx1YXRlKEBjb2xsZWN0aW9uX25hbWUpCisgICAgICBjb2xsZWN0aW9uID0gY29sbGVjdGlvbi50b19hIGlmIGNvbGxlY3Rpb24uaXNfYT8oUmFuZ2UpCisKKyAgICAgIGxpbWl0ID0gY29udGV4dC5ldmFsdWF0ZShAbGltaXQpCisgICAgICB0byA9IGxpbWl0ID8gbGltaXQudG9faSArIGZyb20gOiBuaWwKKworICAgICAgc2VnbWVudCA9IFV0aWxzLnNsaWNlX2NvbGxlY3Rpb24oY29sbGVjdGlvbiwgZnJvbSwgdG8pCisgICAgICBzZWdtZW50LnJldmVyc2UhIGlmIEByZXZlcnNlZAorCisgICAgICBvZmZzZXRzW0BuYW1lXSA9IGZyb20gKyBzZWdtZW50Lmxlbmd0aAorCisgICAgICBzZWdtZW50CisgICAgZW5kCisKKyAgICBkZWYgcmVuZGVyX3NlZ21lbnQoY29udGV4dCwgc2VnbWVudCkKKyAgICAgIGZvcl9zdGFjayA9IGNvbnRleHQucmVnaXN0ZXJzWzpmb3Jfc3RhY2tdIHx8PSBbXQorICAgICAgbGVuZ3RoID0gc2VnbWVudC5sZW5ndGgKKworICAgICAgcmVzdWx0ID0gJycKKworICAgICAgY29udGV4dC5zdGFjayBkbworICAgICAgICBsb29wX3ZhcnMgPSBMaXF1aWQ6OkZvcmxvb3BEcm9wLm5ldyhAbmFtZSwgbGVuZ3RoLCBmb3Jfc3RhY2tbLTFdKQorCisgICAgICAgIGZvcl9zdGFjay5wdXNoKGxvb3BfdmFycykKKworICAgICAgICBiZWdpbgorICAgICAgICAgIGNvbnRleHRbJ2Zvcmxvb3AnLmZyZWV6ZV0gPSBsb29wX3ZhcnMKKworICAgICAgICAgIHNlZ21lbnQuZWFjaF93aXRoX2luZGV4IGRvIHxpdGVtLCBpbmRleHwKKyAgICAgICAgICAgIGNvbnRleHRbQHZhcmlhYmxlX25hbWVdID0gaXRlbQorICAgICAgICAgICAgcmVzdWx0IDw8IEBmb3JfYmxvY2sucmVuZGVyKGNvbnRleHQpCisgICAgICAgICAgICBsb29wX3ZhcnMuc2VuZCg6aW5jcmVtZW50ISkKKworICAgICAgICAgICAgIyBIYW5kbGUgYW55IGludGVycnVwdHMgaWYgdGhleSBleGlzdC4KKyAgICAgICAgICAgIGlmIGNvbnRleHQuaW50ZXJydXB0PworICAgICAgICAgICAgICBpbnRlcnJ1cHQgPSBjb250ZXh0LnBvcF9pbnRlcnJ1cHQKKyAgICAgICAgICAgICAgYnJlYWsgaWYgaW50ZXJydXB0LmlzX2E/IEJyZWFrSW50ZXJydXB0CisgICAgICAgICAgICAgIG5leHQgaWYgaW50ZXJydXB0LmlzX2E/IENvbnRpbnVlSW50ZXJydXB0CisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5zdXJlCisgICAgICAgICAgZm9yX3N0YWNrLnBvcAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBzZXRfYXR0cmlidXRlKGtleSwgZXhwcikKKyAgICAgIGNhc2Uga2V5CisgICAgICB3aGVuICdvZmZzZXQnLmZyZWV6ZQorICAgICAgICBAZnJvbSA9IGlmIGV4cHIgPT0gJ2NvbnRpbnVlJy5mcmVlemUKKyAgICAgICAgICA6Y29udGludWUKKyAgICAgICAgZWxzZQorICAgICAgICAgIEV4cHJlc3Npb24ucGFyc2UoZXhwcikKKyAgICAgICAgZW5kCisgICAgICB3aGVuICdsaW1pdCcuZnJlZXplCisgICAgICAgIEBsaW1pdCA9IEV4cHJlc3Npb24ucGFyc2UoZXhwcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlbmRlcl9lbHNlKGNvbnRleHQpCisgICAgICBAZWxzZV9ibG9jayA/IEBlbHNlX2Jsb2NrLnJlbmRlcihjb250ZXh0KSA6ICcnLmZyZWV6ZQorICAgIGVuZAorICBlbmQKKworICBUZW1wbGF0ZS5yZWdpc3Rlcl90YWcoJ2ZvcicuZnJlZXplLCBGb3IpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvaWYucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2lmLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTc2YmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2lmLnJiCkBAIC0wLDAgKzEsMTExIEBACittb2R1bGUgTGlxdWlkCisgICMgSWYgaXMgdGhlIGNvbmRpdGlvbmFsIGJsb2NrCisgICMKKyAgIyAgIHslIGlmIHVzZXIuYWRtaW4gJX0KKyAgIyAgICAgQWRtaW4gdXNlciEKKyAgIyAgIHslIGVsc2UgJX0KKyAgIyAgICAgTm90IGFkbWluIHVzZXIKKyAgIyAgIHslIGVuZGlmICV9CisgICMKKyAgIyAgICBUaGVyZSBhcmUgeyUgaWYgY291bnQgPCA1ICV9IGxlc3MgeyUgZWxzZSAlfSBtb3JlIHslIGVuZGlmICV9IGl0ZW1zIHRoYW4geW91IG5lZWQuCisgICMKKyAgY2xhc3MgSWYgPCBCbG9jaworICAgIFN5bnRheCA9IC8oI3tRdW90ZWRGcmFnbWVudH0pXHMqKFs9ITw+YS16X10rKT9ccyooI3tRdW90ZWRGcmFnbWVudH0pPy9vCisgICAgRXhwcmVzc2lvbnNBbmRPcGVyYXRvcnMgPSAvKD86XGIoPzpccz9hbmRccz98XHM/b3Jccz8pXGJ8KD86XHMqKD8hXGIoPzpccz9hbmRccz98XHM/b3Jccz8pXGIpKD86I3tRdW90ZWRGcmFnbWVudH18XFMrKVxzKikrKS9vCisgICAgQk9PTEVBTl9PUEVSQVRPUlMgPSAldyhhbmQgb3IpCisKKyAgICBkZWYgaW5pdGlhbGl6ZSh0YWdfbmFtZSwgbWFya3VwLCBvcHRpb25zKQorICAgICAgc3VwZXIKKyAgICAgIEBibG9ja3MgPSBbXQorICAgICAgcHVzaF9ibG9jaygnaWYnLmZyZWV6ZSwgbWFya3VwKQorICAgIGVuZAorCisgICAgZGVmIHBhcnNlKHRva2VucykKKyAgICAgIHdoaWxlIHBhcnNlX2JvZHkoQGJsb2Nrcy5sYXN0LmF0dGFjaG1lbnQsIHRva2VucykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIG5vZGVsaXN0CisgICAgICBAYmxvY2tzLm1hcCgmOmF0dGFjaG1lbnQpCisgICAgZW5kCisKKyAgICBkZWYgdW5rbm93bl90YWcodGFnLCBtYXJrdXAsIHRva2VucykKKyAgICAgIGlmIFsnZWxzaWYnLmZyZWV6ZSwgJ2Vsc2UnLmZyZWV6ZV0uaW5jbHVkZT8odGFnKQorICAgICAgICBwdXNoX2Jsb2NrKHRhZywgbWFya3VwKQorICAgICAgZWxzZQorICAgICAgICBzdXBlcgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVuZGVyKGNvbnRleHQpCisgICAgICBjb250ZXh0LnN0YWNrIGRvCisgICAgICAgIEBibG9ja3MuZWFjaCBkbyB8YmxvY2t8CisgICAgICAgICAgaWYgYmxvY2suZXZhbHVhdGUoY29udGV4dCkKKyAgICAgICAgICAgIHJldHVybiBibG9jay5hdHRhY2htZW50LnJlbmRlcihjb250ZXh0KQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgJycuZnJlZXplCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBwdXNoX2Jsb2NrKHRhZywgbWFya3VwKQorICAgICAgYmxvY2sgPSBpZiB0YWcgPT0gJ2Vsc2UnLmZyZWV6ZQorICAgICAgICBFbHNlQ29uZGl0aW9uLm5ldworICAgICAgZWxzZQorICAgICAgICBwYXJzZV93aXRoX3NlbGVjdGVkX3BhcnNlcihtYXJrdXApCisgICAgICBlbmQKKworICAgICAgQGJsb2Nrcy5wdXNoKGJsb2NrKQorICAgICAgYmxvY2suYXR0YWNoKEJsb2NrQm9keS5uZXcpCisgICAgZW5kCisKKyAgICBkZWYgbGF4X3BhcnNlKG1hcmt1cCkKKyAgICAgIGV4cHJlc3Npb25zID0gbWFya3VwLnNjYW4oRXhwcmVzc2lvbnNBbmRPcGVyYXRvcnMpCisgICAgICByYWlzZShTeW50YXhFcnJvci5uZXcob3B0aW9uc1s6bG9jYWxlXS50KCJlcnJvcnMuc3ludGF4LmlmIi5mcmVlemUpKSkgdW5sZXNzIGV4cHJlc3Npb25zLnBvcCA9fiBTeW50YXgKKworICAgICAgY29uZGl0aW9uID0gQ29uZGl0aW9uLm5ldyhFeHByZXNzaW9uLnBhcnNlKCQxKSwgJDIsIEV4cHJlc3Npb24ucGFyc2UoJDMpKQorCisgICAgICB1bnRpbCBleHByZXNzaW9ucy5lbXB0eT8KKyAgICAgICAgb3BlcmF0b3IgPSBleHByZXNzaW9ucy5wb3AudG9fcy5zdHJpcAorCisgICAgICAgIHJhaXNlKFN5bnRheEVycm9yLm5ldyhvcHRpb25zWzpsb2NhbGVdLnQoImVycm9ycy5zeW50YXguaWYiLmZyZWV6ZSkpKSB1bmxlc3MgZXhwcmVzc2lvbnMucG9wLnRvX3MgPX4gU3ludGF4CisKKyAgICAgICAgbmV3X2NvbmRpdGlvbiA9IENvbmRpdGlvbi5uZXcoRXhwcmVzc2lvbi5wYXJzZSgkMSksICQyLCBFeHByZXNzaW9uLnBhcnNlKCQzKSkKKyAgICAgICAgcmFpc2UoU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5pZiIuZnJlZXplKSkpIHVubGVzcyBCT09MRUFOX09QRVJBVE9SUy5pbmNsdWRlPyhvcGVyYXRvcikKKyAgICAgICAgbmV3X2NvbmRpdGlvbi5zZW5kKG9wZXJhdG9yLCBjb25kaXRpb24pCisgICAgICAgIGNvbmRpdGlvbiA9IG5ld19jb25kaXRpb24KKyAgICAgIGVuZAorCisgICAgICBjb25kaXRpb24KKyAgICBlbmQKKworICAgIGRlZiBzdHJpY3RfcGFyc2UobWFya3VwKQorICAgICAgcCA9IFBhcnNlci5uZXcobWFya3VwKQorICAgICAgY29uZGl0aW9uID0gcGFyc2VfYmluYXJ5X2NvbXBhcmlzb24ocCkKKyAgICAgIHAuY29uc3VtZSg6ZW5kX29mX3N0cmluZykKKyAgICAgIGNvbmRpdGlvbgorICAgIGVuZAorCisgICAgZGVmIHBhcnNlX2JpbmFyeV9jb21wYXJpc29uKHApCisgICAgICBjb25kaXRpb24gPSBwYXJzZV9jb21wYXJpc29uKHApCisgICAgICBpZiBvcCA9IChwLmlkPygnYW5kJy5mcmVlemUpIHx8IHAuaWQ/KCdvcicuZnJlZXplKSkKKyAgICAgICAgY29uZGl0aW9uLnNlbmQob3AsIHBhcnNlX2JpbmFyeV9jb21wYXJpc29uKHApKQorICAgICAgZW5kCisgICAgICBjb25kaXRpb24KKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9jb21wYXJpc29uKHApCisgICAgICBhID0gRXhwcmVzc2lvbi5wYXJzZShwLmV4cHJlc3Npb24pCisgICAgICBpZiBvcCA9IHAuY29uc3VtZT8oOmNvbXBhcmlzb24pCisgICAgICAgIGIgPSBFeHByZXNzaW9uLnBhcnNlKHAuZXhwcmVzc2lvbikKKyAgICAgICAgQ29uZGl0aW9uLm5ldyhhLCBvcCwgYikKKyAgICAgIGVsc2UKKyAgICAgICAgQ29uZGl0aW9uLm5ldyhhKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIFRlbXBsYXRlLnJlZ2lzdGVyX3RhZygnaWYnLmZyZWV6ZSwgSWYpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvaWZjaGFuZ2VkLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9pZmNoYW5nZWQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwY2JlMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvaWZjaGFuZ2VkLnJiCkBAIC0wLDAgKzEsMTggQEAKK21vZHVsZSBMaXF1aWQKKyAgY2xhc3MgSWZjaGFuZ2VkIDwgQmxvY2sKKyAgICBkZWYgcmVuZGVyKGNvbnRleHQpCisgICAgICBjb250ZXh0LnN0YWNrIGRvCisgICAgICAgIG91dHB1dCA9IHN1cGVyCisKKyAgICAgICAgaWYgb3V0cHV0ICE9IGNvbnRleHQucmVnaXN0ZXJzWzppZmNoYW5nZWRdCisgICAgICAgICAgY29udGV4dC5yZWdpc3RlcnNbOmlmY2hhbmdlZF0gPSBvdXRwdXQKKyAgICAgICAgICBvdXRwdXQKKyAgICAgICAgZWxzZQorICAgICAgICAgICcnLmZyZWV6ZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBUZW1wbGF0ZS5yZWdpc3Rlcl90YWcoJ2lmY2hhbmdlZCcuZnJlZXplLCBJZmNoYW5nZWQpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvaW5jbHVkZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvaW5jbHVkZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM0ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9pbmNsdWRlLnJiCkBAIC0wLDAgKzEsMTEzIEBACittb2R1bGUgTGlxdWlkCisgICMgSW5jbHVkZSBhbGxvd3MgdGVtcGxhdGVzIHRvIHJlbGF0ZSB3aXRoIG90aGVyIHRlbXBsYXRlcworICAjCisgICMgU2ltcGx5IGluY2x1ZGUgYW5vdGhlciB0ZW1wbGF0ZToKKyAgIworICAjICAgeyUgaW5jbHVkZSAncHJvZHVjdCcgJX0KKyAgIworICAjIEluY2x1ZGUgYSB0ZW1wbGF0ZSB3aXRoIGEgbG9jYWwgdmFyaWFibGU6CisgICMKKyAgIyAgIHslIGluY2x1ZGUgJ3Byb2R1Y3QnIHdpdGggcHJvZHVjdHNbMF0gJX0KKyAgIworICAjIEluY2x1ZGUgYSB0ZW1wbGF0ZSBmb3IgYSBjb2xsZWN0aW9uOgorICAjCisgICMgICB7JSBpbmNsdWRlICdwcm9kdWN0JyBmb3IgcHJvZHVjdHMgJX0KKyAgIworICBjbGFzcyBJbmNsdWRlIDwgVGFnCisgICAgU3ludGF4ID0gLygje1F1b3RlZEZyYWdtZW50fSspKFxzKyg/OndpdGh8Zm9yKVxzKygje1F1b3RlZEZyYWdtZW50fSspKT8vbworCisgICAgZGVmIGluaXRpYWxpemUodGFnX25hbWUsIG1hcmt1cCwgb3B0aW9ucykKKyAgICAgIHN1cGVyCisKKyAgICAgIGlmIG1hcmt1cCA9fiBTeW50YXgKKworICAgICAgICB0ZW1wbGF0ZV9uYW1lID0gJDEKKyAgICAgICAgdmFyaWFibGVfbmFtZSA9ICQzCisKKyAgICAgICAgQHZhcmlhYmxlX25hbWVfZXhwciA9IHZhcmlhYmxlX25hbWUgPyBFeHByZXNzaW9uLnBhcnNlKHZhcmlhYmxlX25hbWUpIDogbmlsCisgICAgICAgIEB0ZW1wbGF0ZV9uYW1lX2V4cHIgPSBFeHByZXNzaW9uLnBhcnNlKHRlbXBsYXRlX25hbWUpCisgICAgICAgIEBhdHRyaWJ1dGVzID0ge30KKworICAgICAgICBtYXJrdXAuc2NhbihUYWdBdHRyaWJ1dGVzKSBkbyB8a2V5LCB2YWx1ZXwKKyAgICAgICAgICBAYXR0cmlidXRlc1trZXldID0gRXhwcmVzc2lvbi5wYXJzZSh2YWx1ZSkKKyAgICAgICAgZW5kCisKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC5pbmNsdWRlIi5mcmVlemUpKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2UoX3Rva2VucykKKyAgICBlbmQKKworICAgIGRlZiByZW5kZXIoY29udGV4dCkKKyAgICAgIHRlbXBsYXRlX25hbWUgPSBjb250ZXh0LmV2YWx1YXRlKEB0ZW1wbGF0ZV9uYW1lX2V4cHIpCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldyhvcHRpb25zWzpsb2NhbGVdLnQoImVycm9ycy5hcmd1bWVudC5pbmNsdWRlIikpIHVubGVzcyB0ZW1wbGF0ZV9uYW1lCisKKyAgICAgIHBhcnRpYWwgPSBsb2FkX2NhY2hlZF9wYXJ0aWFsKHRlbXBsYXRlX25hbWUsIGNvbnRleHQpCisgICAgICBjb250ZXh0X3ZhcmlhYmxlX25hbWUgPSB0ZW1wbGF0ZV9uYW1lLnNwbGl0KCcvJy5mcmVlemUpLmxhc3QKKworICAgICAgdmFyaWFibGUgPSBpZiBAdmFyaWFibGVfbmFtZV9leHByCisgICAgICAgIGNvbnRleHQuZXZhbHVhdGUoQHZhcmlhYmxlX25hbWVfZXhwcikKKyAgICAgIGVsc2UKKyAgICAgICAgY29udGV4dC5maW5kX3ZhcmlhYmxlKHRlbXBsYXRlX25hbWUpCisgICAgICBlbmQKKworICAgICAgb2xkX3RlbXBsYXRlX25hbWUgPSBjb250ZXh0LnRlbXBsYXRlX25hbWUKKyAgICAgIG9sZF9wYXJ0aWFsID0gY29udGV4dC5wYXJ0aWFsCisgICAgICBiZWdpbgorICAgICAgICBjb250ZXh0LnRlbXBsYXRlX25hbWUgPSB0ZW1wbGF0ZV9uYW1lCisgICAgICAgIGNvbnRleHQucGFydGlhbCA9IHRydWUKKyAgICAgICAgY29udGV4dC5zdGFjayBkbworICAgICAgICAgIEBhdHRyaWJ1dGVzLmVhY2ggZG8gfGtleSwgdmFsdWV8CisgICAgICAgICAgICBjb250ZXh0W2tleV0gPSBjb250ZXh0LmV2YWx1YXRlKHZhbHVlKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgaWYgdmFyaWFibGUuaXNfYT8oQXJyYXkpCisgICAgICAgICAgICB2YXJpYWJsZS5jb2xsZWN0IGRvIHx2YXJ8CisgICAgICAgICAgICAgIGNvbnRleHRbY29udGV4dF92YXJpYWJsZV9uYW1lXSA9IHZhcgorICAgICAgICAgICAgICBwYXJ0aWFsLnJlbmRlcihjb250ZXh0KQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udGV4dFtjb250ZXh0X3ZhcmlhYmxlX25hbWVdID0gdmFyaWFibGUKKyAgICAgICAgICAgIHBhcnRpYWwucmVuZGVyKGNvbnRleHQpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5zdXJlCisgICAgICAgIGNvbnRleHQudGVtcGxhdGVfbmFtZSA9IG9sZF90ZW1wbGF0ZV9uYW1lCisgICAgICAgIGNvbnRleHQucGFydGlhbCA9IG9sZF9wYXJ0aWFsCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGFsaWFzX21ldGhvZCA6cGFyc2VfY29udGV4dCwgOm9wdGlvbnMKKyAgICBwcml2YXRlIDpwYXJzZV9jb250ZXh0CisKKyAgICBkZWYgbG9hZF9jYWNoZWRfcGFydGlhbCh0ZW1wbGF0ZV9uYW1lLCBjb250ZXh0KQorICAgICAgY2FjaGVkX3BhcnRpYWxzID0gY29udGV4dC5yZWdpc3RlcnNbOmNhY2hlZF9wYXJ0aWFsc10gfHwge30KKworICAgICAgaWYgY2FjaGVkID0gY2FjaGVkX3BhcnRpYWxzW3RlbXBsYXRlX25hbWVdCisgICAgICAgIHJldHVybiBjYWNoZWQKKyAgICAgIGVuZAorICAgICAgc291cmNlID0gcmVhZF90ZW1wbGF0ZV9mcm9tX2ZpbGVfc3lzdGVtKGNvbnRleHQpCisgICAgICBiZWdpbgorICAgICAgICBwYXJzZV9jb250ZXh0LnBhcnRpYWwgPSB0cnVlCisgICAgICAgIHBhcnRpYWwgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKHNvdXJjZSwgcGFyc2VfY29udGV4dCkKKyAgICAgIGVuc3VyZQorICAgICAgICBwYXJzZV9jb250ZXh0LnBhcnRpYWwgPSBmYWxzZQorICAgICAgZW5kCisgICAgICBjYWNoZWRfcGFydGlhbHNbdGVtcGxhdGVfbmFtZV0gPSBwYXJ0aWFsCisgICAgICBjb250ZXh0LnJlZ2lzdGVyc1s6Y2FjaGVkX3BhcnRpYWxzXSA9IGNhY2hlZF9wYXJ0aWFscworICAgICAgcGFydGlhbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfdGVtcGxhdGVfZnJvbV9maWxlX3N5c3RlbShjb250ZXh0KQorICAgICAgZmlsZV9zeXN0ZW0gPSBjb250ZXh0LnJlZ2lzdGVyc1s6ZmlsZV9zeXN0ZW1dIHx8IExpcXVpZDo6VGVtcGxhdGUuZmlsZV9zeXN0ZW0KKworICAgICAgZmlsZV9zeXN0ZW0ucmVhZF90ZW1wbGF0ZV9maWxlKGNvbnRleHQuZXZhbHVhdGUoQHRlbXBsYXRlX25hbWVfZXhwcikpCisgICAgZW5kCisgIGVuZAorCisgIFRlbXBsYXRlLnJlZ2lzdGVyX3RhZygnaW5jbHVkZScuZnJlZXplLCBJbmNsdWRlKQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2luY3JlbWVudC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvaW5jcmVtZW50LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTBjYmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL2luY3JlbWVudC5yYgpAQCAtMCwwICsxLDMxIEBACittb2R1bGUgTGlxdWlkCisgICMgaW5jcmVtZW50IGlzIHVzZWQgaW4gYSBwbGFjZSB3aGVyZSBvbmUgbmVlZHMgdG8gaW5zZXJ0IGEgY291bnRlcgorICAjICAgICBpbnRvIGEgdGVtcGxhdGUsIGFuZCBuZWVkcyB0aGUgY291bnRlciB0byBzdXJ2aXZlIGFjcm9zcworICAjICAgICBtdWx0aXBsZSBpbnN0YW50aWF0aW9ucyBvZiB0aGUgdGVtcGxhdGUuCisgICMgICAgIChUbyBhY2hpZXZlIHRoZSBzdXJ2aXZhbCwgdGhlIGFwcGxpY2F0aW9uIG11c3Qga2VlcCB0aGUgY29udGV4dCkKKyAgIworICAjICAgICBpZiB0aGUgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgd2l0aCB2YWx1ZSAwLgorICAjCisgICMgICBIZWxsbzogeyUgaW5jcmVtZW50IHZhcmlhYmxlICV9CisgICMKKyAgIyBnaXZlcyB5b3U6CisgICMKKyAgIyAgICBIZWxsbzogMAorICAjICAgIEhlbGxvOiAxCisgICMgICAgSGVsbG86IDIKKyAgIworICBjbGFzcyBJbmNyZW1lbnQgPCBUYWcKKyAgICBkZWYgaW5pdGlhbGl6ZSh0YWdfbmFtZSwgbWFya3VwLCBvcHRpb25zKQorICAgICAgc3VwZXIKKyAgICAgIEB2YXJpYWJsZSA9IG1hcmt1cC5zdHJpcAorICAgIGVuZAorCisgICAgZGVmIHJlbmRlcihjb250ZXh0KQorICAgICAgdmFsdWUgPSBjb250ZXh0LmVudmlyb25tZW50cy5maXJzdFtAdmFyaWFibGVdIHx8PSAwCisgICAgICBjb250ZXh0LmVudmlyb25tZW50cy5maXJzdFtAdmFyaWFibGVdID0gdmFsdWUgKyAxCisgICAgICB2YWx1ZS50b19zCisgICAgZW5kCisgIGVuZAorCisgIFRlbXBsYXRlLnJlZ2lzdGVyX3RhZygnaW5jcmVtZW50Jy5mcmVlemUsIEluY3JlbWVudCkKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9yYXcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL3Jhdy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQ2MWJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy9yYXcucmIKQEAgLTAsMCArMSw0NyBAQAorbW9kdWxlIExpcXVpZAorICBjbGFzcyBSYXcgPCBCbG9jaworICAgIFN5bnRheCA9IC9cQVxzKlx6LworICAgIEZ1bGxUb2tlblBvc3NpYmx5SW52YWxpZCA9IC9cQSguKikje1RhZ1N0YXJ0fVxzKihcdyspXHMqKC4qKT8je1RhZ0VuZH1cei9vbQorCisgICAgZGVmIGluaXRpYWxpemUodGFnX25hbWUsIG1hcmt1cCwgcGFyc2VfY29udGV4dCkKKyAgICAgIHN1cGVyCisKKyAgICAgIGVuc3VyZV92YWxpZF9tYXJrdXAodGFnX25hbWUsIG1hcmt1cCwgcGFyc2VfY29udGV4dCkKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZSh0b2tlbnMpCisgICAgICBAYm9keSA9ICcnCisgICAgICB3aGlsZSB0b2tlbiA9IHRva2Vucy5zaGlmdAorICAgICAgICBpZiB0b2tlbiA9fiBGdWxsVG9rZW5Qb3NzaWJseUludmFsaWQKKyAgICAgICAgICBAYm9keSA8PCAkMSBpZiAkMSAhPSAiIi5mcmVlemUKKyAgICAgICAgICByZXR1cm4gaWYgYmxvY2tfZGVsaW1pdGVyID09ICQyCisgICAgICAgIGVuZAorICAgICAgICBAYm9keSA8PCB0b2tlbiB1bmxlc3MgdG9rZW4uZW1wdHk/CisgICAgICBlbmQKKworICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KHBhcnNlX2NvbnRleHQubG9jYWxlLnQoImVycm9ycy5zeW50YXgudGFnX25ldmVyX2Nsb3NlZCIuZnJlZXplLCBibG9ja19uYW1lOiBibG9ja19uYW1lKSkKKyAgICBlbmQKKworICAgIGRlZiByZW5kZXIoX2NvbnRleHQpCisgICAgICBAYm9keQorICAgIGVuZAorCisgICAgZGVmIG5vZGVsaXN0CisgICAgICBbQGJvZHldCisgICAgZW5kCisKKyAgICBkZWYgYmxhbms/CisgICAgICBAYm9keS5lbXB0eT8KKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgZGVmIGVuc3VyZV92YWxpZF9tYXJrdXAodGFnX25hbWUsIG1hcmt1cCwgcGFyc2VfY29udGV4dCkKKyAgICAgIHVubGVzcyBtYXJrdXAgPX4gU3ludGF4CisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldyhwYXJzZV9jb250ZXh0LmxvY2FsZS50KCJlcnJvcnMuc3ludGF4LnRhZ191bmV4cGVjdGVkX2FyZ3MiLmZyZWV6ZSwgdGFnOiB0YWdfbmFtZSkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdyYXcnLmZyZWV6ZSwgUmF3KQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL3RhYmxlX3Jvdy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RhZ3MvdGFibGVfcm93LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDkxZTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL3RhYmxlX3Jvdy5yYgpAQCAtMCwwICsxLDU0IEBACittb2R1bGUgTGlxdWlkCisgIGNsYXNzIFRhYmxlUm93IDwgQmxvY2sKKyAgICBTeW50YXggPSAvKFx3KylccytpblxzKygje1F1b3RlZEZyYWdtZW50fSspL28KKworICAgIGRlZiBpbml0aWFsaXplKHRhZ19uYW1lLCBtYXJrdXAsIG9wdGlvbnMpCisgICAgICBzdXBlcgorICAgICAgaWYgbWFya3VwID1+IFN5bnRheAorICAgICAgICBAdmFyaWFibGVfbmFtZSA9ICQxCisgICAgICAgIEBjb2xsZWN0aW9uX25hbWUgPSBFeHByZXNzaW9uLnBhcnNlKCQyKQorICAgICAgICBAYXR0cmlidXRlcyA9IHt9CisgICAgICAgIG1hcmt1cC5zY2FuKFRhZ0F0dHJpYnV0ZXMpIGRvIHxrZXksIHZhbHVlfAorICAgICAgICAgIEBhdHRyaWJ1dGVzW2tleV0gPSBFeHByZXNzaW9uLnBhcnNlKHZhbHVlKQorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KG9wdGlvbnNbOmxvY2FsZV0udCgiZXJyb3JzLnN5bnRheC50YWJsZV9yb3ciLmZyZWV6ZSkpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiByZW5kZXIoY29udGV4dCkKKyAgICAgIGNvbGxlY3Rpb24gPSBjb250ZXh0LmV2YWx1YXRlKEBjb2xsZWN0aW9uX25hbWUpIG9yIHJldHVybiAnJy5mcmVlemUKKworICAgICAgZnJvbSA9IEBhdHRyaWJ1dGVzLmtleT8oJ29mZnNldCcuZnJlZXplKSA/IGNvbnRleHQuZXZhbHVhdGUoQGF0dHJpYnV0ZXNbJ29mZnNldCcuZnJlZXplXSkudG9faSA6IDAKKyAgICAgIHRvID0gQGF0dHJpYnV0ZXMua2V5PygnbGltaXQnLmZyZWV6ZSkgPyBmcm9tICsgY29udGV4dC5ldmFsdWF0ZShAYXR0cmlidXRlc1snbGltaXQnLmZyZWV6ZV0pLnRvX2kgOiBuaWwKKworICAgICAgY29sbGVjdGlvbiA9IFV0aWxzLnNsaWNlX2NvbGxlY3Rpb24oY29sbGVjdGlvbiwgZnJvbSwgdG8pCisKKyAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoCisKKyAgICAgIGNvbHMgPSBjb250ZXh0LmV2YWx1YXRlKEBhdHRyaWJ1dGVzWydjb2xzJy5mcmVlemVdKS50b19pCisKKyAgICAgIHJlc3VsdCA9ICI8dHIgY2xhc3M9XCJyb3cxXCI+XG4iCisgICAgICBjb250ZXh0LnN0YWNrIGRvCisgICAgICAgIHRhYmxlcm93bG9vcCA9IExpcXVpZDo6VGFibGVyb3dsb29wRHJvcC5uZXcobGVuZ3RoLCBjb2xzKQorICAgICAgICBjb250ZXh0Wyd0YWJsZXJvd2xvb3AnLmZyZWV6ZV0gPSB0YWJsZXJvd2xvb3AKKworICAgICAgICBjb2xsZWN0aW9uLmVhY2hfd2l0aF9pbmRleCBkbyB8aXRlbSwgaW5kZXh8CisgICAgICAgICAgY29udGV4dFtAdmFyaWFibGVfbmFtZV0gPSBpdGVtCisKKyAgICAgICAgICByZXN1bHQgPDwgIjx0ZCBjbGFzcz1cImNvbCN7dGFibGVyb3dsb29wLmNvbH1cIj4iIDw8IHN1cGVyIDw8ICc8L3RkPicKKworICAgICAgICAgIGlmIHRhYmxlcm93bG9vcC5jb2xfbGFzdCAmJiAhdGFibGVyb3dsb29wLmxhc3QKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiPC90cj5cbjx0ciBjbGFzcz1cInJvdyN7dGFibGVyb3dsb29wLnJvdyArIDF9XCI+IgorICAgICAgICAgIGVuZAorCisgICAgICAgICAgdGFibGVyb3dsb29wLnNlbmQoOmluY3JlbWVudCEpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICByZXN1bHQgPDwgIjwvdHI+XG4iCisgICAgICByZXN1bHQKKyAgICBlbmQKKyAgZW5kCisKKyAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCd0YWJsZXJvdycuZnJlZXplLCBUYWJsZVJvdykKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy91bmxlc3MucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90YWdzL3VubGVzcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQyODBkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdGFncy91bmxlc3MucmIKQEAgLTAsMCArMSwzMCBAQAorcmVxdWlyZV9yZWxhdGl2ZSAnaWYnCisKK21vZHVsZSBMaXF1aWQKKyAgIyBVbmxlc3MgaXMgYSBjb25kaXRpb25hbCBqdXN0IGxpa2UgJ2lmJyBidXQgd29ya3Mgb24gdGhlIGludmVyc2UgbG9naWMuCisgICMKKyAgIyAgIHslIHVubGVzcyB4IDwgMCAlfSB4IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIHslIGVuZHVubGVzcyAlfQorICAjCisgIGNsYXNzIFVubGVzcyA8IElmCisgICAgZGVmIHJlbmRlcihjb250ZXh0KQorICAgICAgY29udGV4dC5zdGFjayBkbworICAgICAgICAjIEZpcnN0IGNvbmRpdGlvbiBpcyBpbnRlcnByZXRlZCBiYWNrd2FyZHMgKCBpZiBub3QgKQorICAgICAgICBmaXJzdF9ibG9jayA9IEBibG9ja3MuZmlyc3QKKyAgICAgICAgdW5sZXNzIGZpcnN0X2Jsb2NrLmV2YWx1YXRlKGNvbnRleHQpCisgICAgICAgICAgcmV0dXJuIGZpcnN0X2Jsb2NrLmF0dGFjaG1lbnQucmVuZGVyKGNvbnRleHQpCisgICAgICAgIGVuZAorCisgICAgICAgICMgQWZ0ZXIgdGhlIGZpcnN0IGNvbmRpdGlvbiB1bmxlc3Mgd29ya3MganVzdCBsaWtlIGlmCisgICAgICAgIEBibG9ja3NbMS4uLTFdLmVhY2ggZG8gfGJsb2NrfAorICAgICAgICAgIGlmIGJsb2NrLmV2YWx1YXRlKGNvbnRleHQpCisgICAgICAgICAgICByZXR1cm4gYmxvY2suYXR0YWNobWVudC5yZW5kZXIoY29udGV4dCkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgJycuZnJlZXplCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCd1bmxlc3MnLmZyZWV6ZSwgVW5sZXNzKQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90ZW1wbGF0ZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3RlbXBsYXRlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTY3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90ZW1wbGF0ZS5yYgpAQCAtMCwwICsxLDI1NCBAQAorbW9kdWxlIExpcXVpZAorICAjIFRlbXBsYXRlcyBhcmUgY2VudHJhbCB0byBsaXF1aWQuCisgICMgSW50ZXJwcmV0YXRpbmcgdGVtcGxhdGVzIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcy4gRmlyc3QgeW91IGNvbXBpbGUgdGhlCisgICMgc291cmNlIGNvZGUgeW91IGdvdC4gRHVyaW5nIGNvbXBpbGUgdGltZSBzb21lIGV4dGVuc2l2ZSBlcnJvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCisgICMgeW91ciBjb2RlIHNob3VsZCBleHBlY3QgdG8gZ2V0IHNvbWUgU3ludGF4RXJyb3JzLgorICAjCisgICMgQWZ0ZXIgeW91IGhhdmUgYSBjb21waWxlZCB0ZW1wbGF0ZSB5b3UgY2FuIHRoZW4gPHR0PnJlbmRlcjwvdHQ+IGl0LgorICAjIFlvdSBjYW4gdXNlIGEgY29tcGlsZWQgdGVtcGxhdGUgb3ZlciBhbmQgb3ZlciBhZ2FpbiBhbmQga2VlcCBpdCBjYWNoZWQuCisgICMKKyAgIyBFeGFtcGxlOgorICAjCisgICMgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2Uoc291cmNlKQorICAjICAgdGVtcGxhdGUucmVuZGVyKCd1c2VyX25hbWUnID0+ICdib2InKQorICAjCisgIGNsYXNzIFRlbXBsYXRlCisgICAgYXR0cl9hY2Nlc3NvciA6cm9vdAorICAgIGF0dHJfcmVhZGVyIDpyZXNvdXJjZV9saW1pdHMsIDp3YXJuaW5ncworCisgICAgQEBmaWxlX3N5c3RlbSA9IEJsYW5rRmlsZVN5c3RlbS5uZXcKKworICAgIGNsYXNzIFRhZ1JlZ2lzdHJ5CisgICAgICBpbmNsdWRlIEVudW1lcmFibGUKKworICAgICAgZGVmIGluaXRpYWxpemUKKyAgICAgICAgQHRhZ3MgPSB7fQorICAgICAgICBAY2FjaGUgPSB7fQorICAgICAgZW5kCisKKyAgICAgIGRlZiBbXSh0YWdfbmFtZSkKKyAgICAgICAgcmV0dXJuIG5pbCB1bmxlc3MgQHRhZ3Mua2V5Pyh0YWdfbmFtZSkKKyAgICAgICAgcmV0dXJuIEBjYWNoZVt0YWdfbmFtZV0gaWYgTGlxdWlkLmNhY2hlX2NsYXNzZXMKKworICAgICAgICBsb29rdXBfY2xhc3MoQHRhZ3NbdGFnX25hbWVdKS50YXAgeyB8b3wgQGNhY2hlW3RhZ19uYW1lXSA9IG8gfQorICAgICAgZW5kCisKKyAgICAgIGRlZiBbXT0odGFnX25hbWUsIGtsYXNzKQorICAgICAgICBAdGFnc1t0YWdfbmFtZV0gID0ga2xhc3MubmFtZQorICAgICAgICBAY2FjaGVbdGFnX25hbWVdID0ga2xhc3MKKyAgICAgIGVuZAorCisgICAgICBkZWYgZGVsZXRlKHRhZ19uYW1lKQorICAgICAgICBAdGFncy5kZWxldGUodGFnX25hbWUpCisgICAgICAgIEBjYWNoZS5kZWxldGUodGFnX25hbWUpCisgICAgICBlbmQKKworICAgICAgZGVmIGVhY2goJmJsb2NrKQorICAgICAgICBAdGFncy5lYWNoKCZibG9jaykKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBsb29rdXBfY2xhc3MobmFtZSkKKyAgICAgICAgbmFtZS5zcGxpdCgiOjoiKS5yZWplY3QoJjplbXB0eT8pLnJlZHVjZShPYmplY3QpIHsgfHNjb3BlLCBjb25zdHwgc2NvcGUuY29uc3RfZ2V0KGNvbnN0KSB9CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGF0dHJfcmVhZGVyIDpwcm9maWxlcgorCisgICAgY2xhc3MgPDwgc2VsZgorICAgICAgIyBTZXRzIGhvdyBzdHJpY3QgdGhlIHBhcnNlciBzaG91bGQgYmUuCisgICAgICAjIDpsYXggYWN0cyBsaWtlIGxpcXVpZCAyLjUgYW5kIHNpbGVudGx5IGlnbm9yZXMgbWFsZm9ybWVkIHRhZ3MgaW4gbW9zdCBjYXNlcy4KKyAgICAgICMgOndhcm4gaXMgdGhlIGRlZmF1bHQgYW5kIHdpbGwgZ2l2ZSBkZXByZWNhdGlvbiB3YXJuaW5ncyB3aGVuIGludmFsaWQgc3ludGF4IGlzIHVzZWQuCisgICAgICAjIDpzdHJpY3Qgd2lsbCBlbmZvcmNlIGNvcnJlY3Qgc3ludGF4LgorICAgICAgYXR0cl93cml0ZXIgOmVycm9yX21vZGUKKworICAgICAgIyBTZXRzIGhvdyBzdHJpY3QgdGhlIHRhaW50IGNoZWNrZXIgc2hvdWxkIGJlLgorICAgICAgIyA6bGF4IGlzIHRoZSBkZWZhdWx0LCBhbmQgaWdub3JlcyB0aGUgdGFpbnQgZmxhZyBjb21wbGV0ZWx5CisgICAgICAjIDp3YXJuIGFkZHMgYSB3YXJuaW5nLCBidXQgZG9lcyBub3QgaW50ZXJydXB0IHRoZSByZW5kZXJpbmcKKyAgICAgICMgOmVycm9yIHJhaXNlcyBhbiBlcnJvciB3aGVuIHRhaW50ZWQgb3V0cHV0IGlzIHVzZWQKKyAgICAgIGF0dHJfd3JpdGVyIDp0YWludF9tb2RlCisKKyAgICAgIGF0dHJfYWNjZXNzb3IgOmRlZmF1bHRfZXhjZXB0aW9uX3JlbmRlcmVyCisgICAgICBUZW1wbGF0ZS5kZWZhdWx0X2V4Y2VwdGlvbl9yZW5kZXJlciA9IGxhbWJkYSBkbyB8ZXhjZXB0aW9ufAorICAgICAgICBleGNlcHRpb24KKyAgICAgIGVuZAorCisgICAgICBkZWYgZmlsZV9zeXN0ZW0KKyAgICAgICAgQEBmaWxlX3N5c3RlbQorICAgICAgZW5kCisKKyAgICAgIGRlZiBmaWxlX3N5c3RlbT0ob2JqKQorICAgICAgICBAQGZpbGVfc3lzdGVtID0gb2JqCisgICAgICBlbmQKKworICAgICAgZGVmIHJlZ2lzdGVyX3RhZyhuYW1lLCBrbGFzcykKKyAgICAgICAgdGFnc1tuYW1lLnRvX3NdID0ga2xhc3MKKyAgICAgIGVuZAorCisgICAgICBkZWYgdGFncworICAgICAgICBAdGFncyB8fD0gVGFnUmVnaXN0cnkubmV3CisgICAgICBlbmQKKworICAgICAgZGVmIGVycm9yX21vZGUKKyAgICAgICAgQGVycm9yX21vZGUgfHw9IDpsYXgKKyAgICAgIGVuZAorCisgICAgICBkZWYgdGFpbnRfbW9kZQorICAgICAgICBAdGFpbnRfbW9kZSB8fD0gOmxheAorICAgICAgZW5kCisKKyAgICAgICMgUGFzcyBhIG1vZHVsZSB3aXRoIGZpbHRlciBtZXRob2RzIHdoaWNoIHNob3VsZCBiZSBhdmFpbGFibGUKKyAgICAgICMgdG8gYWxsIGxpcXVpZCB2aWV3cy4gR29vZCBmb3IgcmVnaXN0ZXJpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkKKyAgICAgIGRlZiByZWdpc3Rlcl9maWx0ZXIobW9kKQorICAgICAgICBTdHJhaW5lci5nbG9iYWxfZmlsdGVyKG1vZCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgZGVmYXVsdF9yZXNvdXJjZV9saW1pdHMKKyAgICAgICAgQGRlZmF1bHRfcmVzb3VyY2VfbGltaXRzIHx8PSB7fQorICAgICAgZW5kCisKKyAgICAgICMgY3JlYXRlcyBhIG5ldyA8dHQ+VGVtcGxhdGU8L3R0PiBvYmplY3QgZnJvbSBsaXF1aWQgc291cmNlIGNvZGUKKyAgICAgICMgVG8gZW5hYmxlIHByb2ZpbGluZywgcGFzcyBpbiA8dHQ+cHJvZmlsZTogdHJ1ZTwvdHQ+IGFzIGFuIG9wdGlvbi4KKyAgICAgICMgU2VlIExpcXVpZDo6UHJvZmlsZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgICAgIGRlZiBwYXJzZShzb3VyY2UsIG9wdGlvbnMgPSB7fSkKKyAgICAgICAgdGVtcGxhdGUgPSBUZW1wbGF0ZS5uZXcKKyAgICAgICAgdGVtcGxhdGUucGFyc2Uoc291cmNlLCBvcHRpb25zKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgQHJldGhyb3dfZXJyb3JzID0gZmFsc2UKKyAgICAgIEByZXNvdXJjZV9saW1pdHMgPSBSZXNvdXJjZUxpbWl0cy5uZXcoc2VsZi5jbGFzcy5kZWZhdWx0X3Jlc291cmNlX2xpbWl0cykKKyAgICBlbmQKKworICAgICMgUGFyc2Ugc291cmNlIGNvZGUuCisgICAgIyBSZXR1cm5zIHNlbGYgZm9yIGVhc3kgY2hhaW5pbmcKKyAgICBkZWYgcGFyc2Uoc291cmNlLCBvcHRpb25zID0ge30pCisgICAgICBAb3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgIEBwcm9maWxpbmcgPSBvcHRpb25zWzpwcm9maWxlXQorICAgICAgQGxpbmVfbnVtYmVycyA9IG9wdGlvbnNbOmxpbmVfbnVtYmVyc10gfHwgQHByb2ZpbGluZworICAgICAgcGFyc2VfY29udGV4dCA9IG9wdGlvbnMuaXNfYT8oUGFyc2VDb250ZXh0KSA/IG9wdGlvbnMgOiBQYXJzZUNvbnRleHQubmV3KG9wdGlvbnMpCisgICAgICBAcm9vdCA9IERvY3VtZW50LnBhcnNlKHRva2VuaXplKHNvdXJjZSksIHBhcnNlX2NvbnRleHQpCisgICAgICBAd2FybmluZ3MgPSBwYXJzZV9jb250ZXh0Lndhcm5pbmdzCisgICAgICBzZWxmCisgICAgZW5kCisKKyAgICBkZWYgcmVnaXN0ZXJzCisgICAgICBAcmVnaXN0ZXJzIHx8PSB7fQorICAgIGVuZAorCisgICAgZGVmIGFzc2lnbnMKKyAgICAgIEBhc3NpZ25zIHx8PSB7fQorICAgIGVuZAorCisgICAgZGVmIGluc3RhbmNlX2Fzc2lnbnMKKyAgICAgIEBpbnN0YW5jZV9hc3NpZ25zIHx8PSB7fQorICAgIGVuZAorCisgICAgZGVmIGVycm9ycworICAgICAgQGVycm9ycyB8fD0gW10KKyAgICBlbmQKKworICAgICMgUmVuZGVyIHRha2VzIGEgaGFzaCB3aXRoIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAjCisgICAgIyBpZiB5b3UgdXNlIHRoZSBzYW1lIGZpbHRlcnMgb3ZlciBhbmQgb3ZlciBhZ2FpbiBjb25zaWRlciByZWdpc3RlcmluZyB0aGVtIGdsb2JhbGx5CisgICAgIyB3aXRoIDx0dD5UZW1wbGF0ZS5yZWdpc3Rlcl9maWx0ZXI8L3R0PgorICAgICMKKyAgICAjIGlmIHByb2ZpbGluZyB3YXMgZW5hYmxlZCBpbiA8dHQ+VGVtcGxhdGUjcGFyc2U8L3R0PiB0aGVuIHRoZSByZXN1bHRpbmcgcHJvZmlsaW5nIGluZm9ybWF0aW9uCisgICAgIyB3aWxsIGJlIGF2YWlsYWJsZSB2aWEgPHR0PlRlbXBsYXRlI3Byb2ZpbGVyPC90dD4KKyAgICAjCisgICAgIyBGb2xsb3dpbmcgb3B0aW9ucyBjYW4gYmUgcGFzc2VkOgorICAgICMKKyAgICAjICAqIDx0dD5maWx0ZXJzPC90dD4gOiBhcnJheSB3aXRoIGxvY2FsIGZpbHRlcnMKKyAgICAjICAqIDx0dD5yZWdpc3RlcnM8L3R0PiA6IGhhc2ggd2l0aCByZWdpc3RlciB2YXJpYWJsZXMuIFRob3NlIGNhbiBiZSBhY2Nlc3NlZCBmcm9tCisgICAgIyAgICBmaWx0ZXJzIGFuZCB0YWdzIGFuZCBtaWdodCBiZSB1c2VmdWwgdG8gaW50ZWdyYXRlIGxpcXVpZCBtb3JlIHdpdGggaXRzIGhvc3QgYXBwbGljYXRpb24KKyAgICAjCisgICAgZGVmIHJlbmRlcigqYXJncykKKyAgICAgIHJldHVybiAnJy5mcmVlemUgaWYgQHJvb3QubmlsPworCisgICAgICBjb250ZXh0ID0gY2FzZSBhcmdzLmZpcnN0CisgICAgICB3aGVuIExpcXVpZDo6Q29udGV4dAorICAgICAgICBjID0gYXJncy5zaGlmdAorCisgICAgICAgIGlmIEByZXRocm93X2Vycm9ycworICAgICAgICAgIGMuZXhjZXB0aW9uX3JlbmRlcmVyID0gLT4oZSkgeyByYWlzZSB9CisgICAgICAgIGVuZAorCisgICAgICAgIGMKKyAgICAgIHdoZW4gTGlxdWlkOjpEcm9wCisgICAgICAgIGRyb3AgPSBhcmdzLnNoaWZ0CisgICAgICAgIGRyb3AuY29udGV4dCA9IENvbnRleHQubmV3KFtkcm9wLCBhc3NpZ25zXSwgaW5zdGFuY2VfYXNzaWducywgcmVnaXN0ZXJzLCBAcmV0aHJvd19lcnJvcnMsIEByZXNvdXJjZV9saW1pdHMpCisgICAgICB3aGVuIEhhc2gKKyAgICAgICAgQ29udGV4dC5uZXcoW2FyZ3Muc2hpZnQsIGFzc2lnbnNdLCBpbnN0YW5jZV9hc3NpZ25zLCByZWdpc3RlcnMsIEByZXRocm93X2Vycm9ycywgQHJlc291cmNlX2xpbWl0cykKKyAgICAgIHdoZW4gbmlsCisgICAgICAgIENvbnRleHQubmV3KGFzc2lnbnMsIGluc3RhbmNlX2Fzc2lnbnMsIHJlZ2lzdGVycywgQHJldGhyb3dfZXJyb3JzLCBAcmVzb3VyY2VfbGltaXRzKQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiRXhwZWN0ZWQgSGFzaCBvciBMaXF1aWQ6OkNvbnRleHQgYXMgcGFyYW1ldGVyIgorICAgICAgZW5kCisKKyAgICAgIGNhc2UgYXJncy5sYXN0CisgICAgICB3aGVuIEhhc2gKKyAgICAgICAgb3B0aW9ucyA9IGFyZ3MucG9wCisKKyAgICAgICAgcmVnaXN0ZXJzLm1lcmdlIShvcHRpb25zWzpyZWdpc3RlcnNdKSBpZiBvcHRpb25zWzpyZWdpc3RlcnNdLmlzX2E/KEhhc2gpCisKKyAgICAgICAgYXBwbHlfb3B0aW9uc190b19jb250ZXh0KGNvbnRleHQsIG9wdGlvbnMpCisgICAgICB3aGVuIE1vZHVsZSwgQXJyYXkKKyAgICAgICAgY29udGV4dC5hZGRfZmlsdGVycyhhcmdzLnBvcCkKKyAgICAgIGVuZAorCisgICAgICAjIFJldHJ5aW5nIGEgcmVuZGVyIHJlc2V0cyByZXNvdXJjZSB1c2FnZQorICAgICAgY29udGV4dC5yZXNvdXJjZV9saW1pdHMucmVzZXQKKworICAgICAgYmVnaW4KKyAgICAgICAgIyByZW5kZXIgdGhlIG5vZGVsaXN0LgorICAgICAgICAjIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIGdldCBhbiBhcnJheSBiYWNrIGhlcmUuIGpvaW4gd2lsbCBtYWtlIGEgc3RyaW5nIG91dCBvZiBpdC4KKyAgICAgICAgcmVzdWx0ID0gd2l0aF9wcm9maWxpbmcoY29udGV4dCkgZG8KKyAgICAgICAgICBAcm9vdC5yZW5kZXIoY29udGV4dCkKKyAgICAgICAgZW5kCisgICAgICAgIHJlc3VsdC5yZXNwb25kX3RvPyg6am9pbikgPyByZXN1bHQuam9pbiA6IHJlc3VsdAorICAgICAgcmVzY3VlIExpcXVpZDo6TWVtb3J5RXJyb3IgPT4gZQorICAgICAgICBjb250ZXh0LmhhbmRsZV9lcnJvcihlKQorICAgICAgZW5zdXJlCisgICAgICAgIEBlcnJvcnMgPSBjb250ZXh0LmVycm9ycworICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVuZGVyISgqYXJncykKKyAgICAgIEByZXRocm93X2Vycm9ycyA9IHRydWUKKyAgICAgIHJlbmRlcigqYXJncykKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiB0b2tlbml6ZShzb3VyY2UpCisgICAgICBUb2tlbml6ZXIubmV3KHNvdXJjZSwgQGxpbmVfbnVtYmVycykKKyAgICBlbmQKKworICAgIGRlZiB3aXRoX3Byb2ZpbGluZyhjb250ZXh0KQorICAgICAgaWYgQHByb2ZpbGluZyAmJiAhY29udGV4dC5wYXJ0aWFsCisgICAgICAgIHJhaXNlICJQcm9maWxlciBub3QgbG9hZGVkLCByZXF1aXJlICdsaXF1aWQvcHJvZmlsZXInIGZpcnN0IiB1bmxlc3MgZGVmaW5lZD8oTGlxdWlkOjpQcm9maWxlcikKKworICAgICAgICBAcHJvZmlsZXIgPSBQcm9maWxlci5uZXcKKyAgICAgICAgQHByb2ZpbGVyLnN0YXJ0CisKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICB5aWVsZAorICAgICAgICBlbnN1cmUKKyAgICAgICAgICBAcHJvZmlsZXIuc3RvcAorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgeWllbGQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGFwcGx5X29wdGlvbnNfdG9fY29udGV4dChjb250ZXh0LCBvcHRpb25zKQorICAgICAgY29udGV4dC5hZGRfZmlsdGVycyhvcHRpb25zWzpmaWx0ZXJzXSkgaWYgb3B0aW9uc1s6ZmlsdGVyc10KKyAgICAgIGNvbnRleHQuZ2xvYmFsX2ZpbHRlciA9IG9wdGlvbnNbOmdsb2JhbF9maWx0ZXJdIGlmIG9wdGlvbnNbOmdsb2JhbF9maWx0ZXJdCisgICAgICBjb250ZXh0LmV4Y2VwdGlvbl9yZW5kZXJlciA9IG9wdGlvbnNbOmV4Y2VwdGlvbl9yZW5kZXJlcl0gaWYgb3B0aW9uc1s6ZXhjZXB0aW9uX3JlbmRlcmVyXQorICAgICAgY29udGV4dC5zdHJpY3RfdmFyaWFibGVzID0gb3B0aW9uc1s6c3RyaWN0X3ZhcmlhYmxlc10gaWYgb3B0aW9uc1s6c3RyaWN0X3ZhcmlhYmxlc10KKyAgICAgIGNvbnRleHQuc3RyaWN0X2ZpbHRlcnMgPSBvcHRpb25zWzpzdHJpY3RfZmlsdGVyc10gaWYgb3B0aW9uc1s6c3RyaWN0X2ZpbHRlcnNdCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90b2tlbml6ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC90b2tlbml6ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzNjU3ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3Rva2VuaXplci5yYgpAQCAtMCwwICsxLDMxIEBACittb2R1bGUgTGlxdWlkCisgIGNsYXNzIFRva2VuaXplcgorICAgIGF0dHJfcmVhZGVyIDpsaW5lX251bWJlcgorCisgICAgZGVmIGluaXRpYWxpemUoc291cmNlLCBsaW5lX251bWJlcnMgPSBmYWxzZSkKKyAgICAgIEBzb3VyY2UgPSBzb3VyY2UKKyAgICAgIEBsaW5lX251bWJlciA9IGxpbmVfbnVtYmVycyA/IDEgOiBuaWwKKyAgICAgIEB0b2tlbnMgPSB0b2tlbml6ZQorICAgIGVuZAorCisgICAgZGVmIHNoaWZ0CisgICAgICB0b2tlbiA9IEB0b2tlbnMuc2hpZnQKKyAgICAgIEBsaW5lX251bWJlciArPSB0b2tlbi5jb3VudCgiXG4iKSBpZiBAbGluZV9udW1iZXIgJiYgdG9rZW4KKyAgICAgIHRva2VuCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgdG9rZW5pemUKKyAgICAgIEBzb3VyY2UgPSBAc291cmNlLnNvdXJjZSBpZiBAc291cmNlLnJlc3BvbmRfdG8/KDpzb3VyY2UpCisgICAgICByZXR1cm4gW10gaWYgQHNvdXJjZS50b19zLmVtcHR5PworCisgICAgICB0b2tlbnMgPSBAc291cmNlLnNwbGl0KFRlbXBsYXRlUGFyc2VyKQorCisgICAgICAjIHJlbW92ZXMgdGhlIHJvZ3VlIGVtcHR5IGVsZW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkKKyAgICAgIHRva2Vucy5zaGlmdCBpZiB0b2tlbnNbMF0gJiYgdG9rZW5zWzBdLmVtcHR5PworCisgICAgICB0b2tlbnMKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3V0aWxzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdXRpbHMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwNWFjNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3V0aWxzLnJiCkBAIC0wLDAgKzEsODMgQEAKK21vZHVsZSBMaXF1aWQKKyAgbW9kdWxlIFV0aWxzCisgICAgZGVmIHNlbGYuc2xpY2VfY29sbGVjdGlvbihjb2xsZWN0aW9uLCBmcm9tLCB0bykKKyAgICAgIGlmIChmcm9tICE9IDAgfHwgIXRvLm5pbD8pICYmIGNvbGxlY3Rpb24ucmVzcG9uZF90bz8oOmxvYWRfc2xpY2UpCisgICAgICAgIGNvbGxlY3Rpb24ubG9hZF9zbGljZShmcm9tLCB0bykKKyAgICAgIGVsc2UKKyAgICAgICAgc2xpY2VfY29sbGVjdGlvbl91c2luZ19lYWNoKGNvbGxlY3Rpb24sIGZyb20sIHRvKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5zbGljZV9jb2xsZWN0aW9uX3VzaW5nX2VhY2goY29sbGVjdGlvbiwgZnJvbSwgdG8pCisgICAgICBzZWdtZW50cyA9IFtdCisgICAgICBpbmRleCA9IDAKKworICAgICAgIyBNYWludGFpbnMgUnVieSAxLjguNyBTdHJpbmcjZWFjaCBiZWhhdmlvdXIgb24gMS45CisgICAgICBpZiBjb2xsZWN0aW9uLmlzX2E/KFN0cmluZykKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uZW1wdHk/ID8gW10gOiBbY29sbGVjdGlvbl0KKyAgICAgIGVuZAorICAgICAgcmV0dXJuIFtdIHVubGVzcyBjb2xsZWN0aW9uLnJlc3BvbmRfdG8/KDplYWNoKQorCisgICAgICBjb2xsZWN0aW9uLmVhY2ggZG8gfGl0ZW18CisgICAgICAgIGlmIHRvICYmIHRvIDw9IGluZGV4CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZW5kCisKKyAgICAgICAgaWYgZnJvbSA8PSBpbmRleAorICAgICAgICAgIHNlZ21lbnRzIDw8IGl0ZW0KKyAgICAgICAgZW5kCisKKyAgICAgICAgaW5kZXggKz0gMQorICAgICAgZW5kCisKKyAgICAgIHNlZ21lbnRzCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi50b19pbnRlZ2VyKG51bSkKKyAgICAgIHJldHVybiBudW0gaWYgbnVtLmlzX2E/KEludGVnZXIpCisgICAgICBudW0gPSBudW0udG9fcworICAgICAgYmVnaW4KKyAgICAgICAgSW50ZWdlcihudW0pCisgICAgICByZXNjdWUgOjpBcmd1bWVudEVycm9yCisgICAgICAgIHJhaXNlIExpcXVpZDo6QXJndW1lbnRFcnJvciwgImludmFsaWQgaW50ZWdlciIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHNlbGYudG9fbnVtYmVyKG9iaikKKyAgICAgIGNhc2Ugb2JqCisgICAgICB3aGVuIEZsb2F0CisgICAgICAgIEJpZ0RlY2ltYWwubmV3KG9iai50b19zKQorICAgICAgd2hlbiBOdW1lcmljCisgICAgICAgIG9iagorICAgICAgd2hlbiBTdHJpbmcKKyAgICAgICAgKG9iai5zdHJpcCA9fiAvXEEtP1xkK1wuXGQrXHovKSA/IEJpZ0RlY2ltYWwubmV3KG9iaikgOiBvYmoudG9faQorICAgICAgZWxzZQorICAgICAgICBpZiBvYmoucmVzcG9uZF90bz8oOnRvX251bWJlcikKKyAgICAgICAgICBvYmoudG9fbnVtYmVyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAwCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi50b19kYXRlKG9iaikKKyAgICAgIHJldHVybiBvYmogaWYgb2JqLnJlc3BvbmRfdG8/KDpzdHJmdGltZSkKKworICAgICAgaWYgb2JqLmlzX2E/KFN0cmluZykKKyAgICAgICAgcmV0dXJuIG5pbCBpZiBvYmouZW1wdHk/CisgICAgICAgIG9iaiA9IG9iai5kb3duY2FzZQorICAgICAgZW5kCisKKyAgICAgIGNhc2Ugb2JqCisgICAgICB3aGVuICdub3cnLmZyZWV6ZSwgJ3RvZGF5Jy5mcmVlemUKKyAgICAgICAgVGltZS5ub3cKKyAgICAgIHdoZW4gL1xBXGQrXHovLCBJbnRlZ2VyCisgICAgICAgIFRpbWUuYXQob2JqLnRvX2kpCisgICAgICB3aGVuIFN0cmluZworICAgICAgICBUaW1lLnBhcnNlKG9iaikKKyAgICAgIGVuZAorICAgIHJlc2N1ZSA6OkFyZ3VtZW50RXJyb3IKKyAgICAgIG5pbAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdmFyaWFibGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC92YXJpYWJsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDA2YWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdmFyaWFibGUucmIKQEAgLTAsMCArMSwxMzYgQEAKK21vZHVsZSBMaXF1aWQKKyAgIyBIb2xkcyB2YXJpYWJsZXMuIFZhcmlhYmxlcyBhcmUgb25seSBsb2FkZWQgImp1c3QgaW4gdGltZSIKKyAgIyBhbmQgYXJlIG5vdCBldmFsdWF0ZWQgYXMgcGFydCBvZiB0aGUgcmVuZGVyIHN0YWdlCisgICMKKyAgIyAgIHt7IG1vbmtleSB9fQorICAjICAge3sgdXNlci5uYW1lIH19CisgICMKKyAgIyBWYXJpYWJsZXMgY2FuIGJlIGNvbWJpbmVkIHdpdGggZmlsdGVyczoKKyAgIworICAjICAge3sgdXNlciB8IGxpbmsgfX0KKyAgIworICBjbGFzcyBWYXJpYWJsZQorICAgIEZpbHRlclBhcnNlciA9IC8oPzpccyt8I3tRdW90ZWRGcmFnbWVudH18I3tBcmd1bWVudFNlcGFyYXRvcn0pKy9vCisgICAgYXR0cl9hY2Nlc3NvciA6ZmlsdGVycywgOm5hbWUsIDpsaW5lX251bWJlcgorICAgIGF0dHJfcmVhZGVyIDpwYXJzZV9jb250ZXh0CisgICAgYWxpYXNfbWV0aG9kIDpvcHRpb25zLCA6cGFyc2VfY29udGV4dAorICAgIGluY2x1ZGUgUGFyc2VyU3dpdGNoaW5nCisKKyAgICBkZWYgaW5pdGlhbGl6ZShtYXJrdXAsIHBhcnNlX2NvbnRleHQpCisgICAgICBAbWFya3VwICA9IG1hcmt1cAorICAgICAgQG5hbWUgICAgPSBuaWwKKyAgICAgIEBwYXJzZV9jb250ZXh0ID0gcGFyc2VfY29udGV4dAorICAgICAgQGxpbmVfbnVtYmVyID0gcGFyc2VfY29udGV4dC5saW5lX251bWJlcgorCisgICAgICBwYXJzZV93aXRoX3NlbGVjdGVkX3BhcnNlcihtYXJrdXApCisgICAgZW5kCisKKyAgICBkZWYgcmF3CisgICAgICBAbWFya3VwCisgICAgZW5kCisKKyAgICBkZWYgbWFya3VwX2NvbnRleHQobWFya3VwKQorICAgICAgImluIFwie3sje21hcmt1cH19fVwiIgorICAgIGVuZAorCisgICAgZGVmIGxheF9wYXJzZShtYXJrdXApCisgICAgICBAZmlsdGVycyA9IFtdCisgICAgICByZXR1cm4gdW5sZXNzIG1hcmt1cCA9fiAvKCN7UXVvdGVkRnJhZ21lbnR9KSguKikvb20KKworICAgICAgbmFtZV9tYXJrdXAgPSAkMQorICAgICAgZmlsdGVyX21hcmt1cCA9ICQyCisgICAgICBAbmFtZSA9IEV4cHJlc3Npb24ucGFyc2UobmFtZV9tYXJrdXApCisgICAgICBpZiBmaWx0ZXJfbWFya3VwID1+IC8je0ZpbHRlclNlcGFyYXRvcn1ccyooLiopL29tCisgICAgICAgIGZpbHRlcnMgPSAkMS5zY2FuKEZpbHRlclBhcnNlcikKKyAgICAgICAgZmlsdGVycy5lYWNoIGRvIHxmfAorICAgICAgICAgIG5leHQgdW5sZXNzIGYgPX4gL1x3Ky8KKyAgICAgICAgICBmaWx0ZXJuYW1lID0gUmVnZXhwLmxhc3RfbWF0Y2goMCkKKyAgICAgICAgICBmaWx0ZXJhcmdzID0gZi5zY2FuKC8oPzoje0ZpbHRlckFyZ3VtZW50U2VwYXJhdG9yfXwje0FyZ3VtZW50U2VwYXJhdG9yfSlccyooKD86XHcrXHMqXDpccyopPyN7UXVvdGVkRnJhZ21lbnR9KS9vKS5mbGF0dGVuCisgICAgICAgICAgQGZpbHRlcnMgPDwgcGFyc2VfZmlsdGVyX2V4cHJlc3Npb25zKGZpbHRlcm5hbWUsIGZpbHRlcmFyZ3MpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc3RyaWN0X3BhcnNlKG1hcmt1cCkKKyAgICAgIEBmaWx0ZXJzID0gW10KKyAgICAgIHAgPSBQYXJzZXIubmV3KG1hcmt1cCkKKworICAgICAgQG5hbWUgPSBFeHByZXNzaW9uLnBhcnNlKHAuZXhwcmVzc2lvbikKKyAgICAgIHdoaWxlIHAuY29uc3VtZT8oOnBpcGUpCisgICAgICAgIGZpbHRlcm5hbWUgPSBwLmNvbnN1bWUoOmlkKQorICAgICAgICBmaWx0ZXJhcmdzID0gcC5jb25zdW1lPyg6Y29sb24pID8gcGFyc2VfZmlsdGVyYXJncyhwKSA6IFtdCisgICAgICAgIEBmaWx0ZXJzIDw8IHBhcnNlX2ZpbHRlcl9leHByZXNzaW9ucyhmaWx0ZXJuYW1lLCBmaWx0ZXJhcmdzKQorICAgICAgZW5kCisgICAgICBwLmNvbnN1bWUoOmVuZF9vZl9zdHJpbmcpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfZmlsdGVyYXJncyhwKQorICAgICAgIyBmaXJzdCBhcmd1bWVudAorICAgICAgZmlsdGVyYXJncyA9IFtwLmFyZ3VtZW50XQorICAgICAgIyBmb2xsb3dlZCBieSBjb21tYSBzZXBhcmF0ZWQgb3RoZXJzCisgICAgICBmaWx0ZXJhcmdzIDw8IHAuYXJndW1lbnQgd2hpbGUgcC5jb25zdW1lPyg6Y29tbWEpCisgICAgICBmaWx0ZXJhcmdzCisgICAgZW5kCisKKyAgICBkZWYgcmVuZGVyKGNvbnRleHQpCisgICAgICBvYmogPSBAZmlsdGVycy5pbmplY3QoY29udGV4dC5ldmFsdWF0ZShAbmFtZSkpIGRvIHxvdXRwdXQsIChmaWx0ZXJfbmFtZSwgZmlsdGVyX2FyZ3MsIGZpbHRlcl9rd2FyZ3MpfAorICAgICAgICBmaWx0ZXJfYXJncyA9IGV2YWx1YXRlX2ZpbHRlcl9leHByZXNzaW9ucyhjb250ZXh0LCBmaWx0ZXJfYXJncywgZmlsdGVyX2t3YXJncykKKyAgICAgICAgY29udGV4dC5pbnZva2UoZmlsdGVyX25hbWUsIG91dHB1dCwgKmZpbHRlcl9hcmdzKQorICAgICAgZW5kCisKKyAgICAgIG9iaiA9IGNvbnRleHQuYXBwbHlfZ2xvYmFsX2ZpbHRlcihvYmopCisKKyAgICAgIHRhaW50X2NoZWNrKGNvbnRleHQsIG9iaikKKworICAgICAgb2JqCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgcGFyc2VfZmlsdGVyX2V4cHJlc3Npb25zKGZpbHRlcl9uYW1lLCB1bnBhcnNlZF9hcmdzKQorICAgICAgZmlsdGVyX2FyZ3MgPSBbXQorICAgICAga2V5d29yZF9hcmdzID0ge30KKyAgICAgIHVucGFyc2VkX2FyZ3MuZWFjaCBkbyB8YXwKKyAgICAgICAgaWYgbWF0Y2hlcyA9IGEubWF0Y2goL1xBI3tUYWdBdHRyaWJ1dGVzfVx6L28pCisgICAgICAgICAga2V5d29yZF9hcmdzW21hdGNoZXNbMV1dID0gRXhwcmVzc2lvbi5wYXJzZShtYXRjaGVzWzJdKQorICAgICAgICBlbHNlCisgICAgICAgICAgZmlsdGVyX2FyZ3MgPDwgRXhwcmVzc2lvbi5wYXJzZShhKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgcmVzdWx0ID0gW2ZpbHRlcl9uYW1lLCBmaWx0ZXJfYXJnc10KKyAgICAgIHJlc3VsdCA8PCBrZXl3b3JkX2FyZ3MgdW5sZXNzIGtleXdvcmRfYXJncy5lbXB0eT8KKyAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgZGVmIGV2YWx1YXRlX2ZpbHRlcl9leHByZXNzaW9ucyhjb250ZXh0LCBmaWx0ZXJfYXJncywgZmlsdGVyX2t3YXJncykKKyAgICAgIHBhcnNlZF9hcmdzID0gZmlsdGVyX2FyZ3MubWFweyB8ZXhwcnwgY29udGV4dC5ldmFsdWF0ZShleHByKSB9CisgICAgICBpZiBmaWx0ZXJfa3dhcmdzCisgICAgICAgIHBhcnNlZF9rd2FyZ3MgPSB7fQorICAgICAgICBmaWx0ZXJfa3dhcmdzLmVhY2ggZG8gfGtleSwgZXhwcnwKKyAgICAgICAgICBwYXJzZWRfa3dhcmdzW2tleV0gPSBjb250ZXh0LmV2YWx1YXRlKGV4cHIpCisgICAgICAgIGVuZAorICAgICAgICBwYXJzZWRfYXJncyA8PCBwYXJzZWRfa3dhcmdzCisgICAgICBlbmQKKyAgICAgIHBhcnNlZF9hcmdzCisgICAgZW5kCisKKyAgICBkZWYgdGFpbnRfY2hlY2soY29udGV4dCwgb2JqKQorICAgICAgcmV0dXJuIHVubGVzcyBvYmoudGFpbnRlZD8KKyAgICAgIHJldHVybiBpZiBUZW1wbGF0ZS50YWludF9tb2RlID09IDpsYXgKKworICAgICAgQG1hcmt1cCA9fiBRdW90ZWRGcmFnbWVudAorICAgICAgbmFtZSA9IFJlZ2V4cC5sYXN0X21hdGNoKDApCisKKyAgICAgIGVycm9yID0gVGFpbnRlZEVycm9yLm5ldygidmFyaWFibGUgJyN7bmFtZX0nIGlzIHRhaW50ZWQgYW5kIHdhcyBub3QgZXNjYXBlZCIpCisgICAgICBlcnJvci5saW5lX251bWJlciA9IGxpbmVfbnVtYmVyCisgICAgICBlcnJvci50ZW1wbGF0ZV9uYW1lID0gY29udGV4dC50ZW1wbGF0ZV9uYW1lCisKKyAgICAgIGNhc2UgVGVtcGxhdGUudGFpbnRfbW9kZQorICAgICAgd2hlbiA6d2FybgorICAgICAgICBjb250ZXh0Lndhcm5pbmdzIDw8IGVycm9yCisgICAgICB3aGVuIDplcnJvcgorICAgICAgICByYWlzZSBlcnJvcgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC92YXJpYWJsZV9sb29rdXAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC92YXJpYWJsZV9sb29rdXAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkNGU0YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC9saWIvbGlxdWlkL3ZhcmlhYmxlX2xvb2t1cC5yYgpAQCAtMCwwICsxLDgyIEBACittb2R1bGUgTGlxdWlkCisgIGNsYXNzIFZhcmlhYmxlTG9va3VwCisgICAgU1FVQVJFX0JSQUNLRVRFRCA9IC9cQVxbKC4qKVxdXHovbQorICAgIENPTU1BTkRfTUVUSE9EUyA9IFsnc2l6ZScuZnJlZXplLCAnZmlyc3QnLmZyZWV6ZSwgJ2xhc3QnLmZyZWV6ZV0KKworICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6bG9va3VwcworCisgICAgZGVmIHNlbGYucGFyc2UobWFya3VwKQorICAgICAgbmV3KG1hcmt1cCkKKyAgICBlbmQKKworICAgIGRlZiBpbml0aWFsaXplKG1hcmt1cCkKKyAgICAgIGxvb2t1cHMgPSBtYXJrdXAuc2NhbihWYXJpYWJsZVBhcnNlcikKKworICAgICAgbmFtZSA9IGxvb2t1cHMuc2hpZnQKKyAgICAgIGlmIG5hbWUgPX4gU1FVQVJFX0JSQUNLRVRFRAorICAgICAgICBuYW1lID0gRXhwcmVzc2lvbi5wYXJzZSgkMSkKKyAgICAgIGVuZAorICAgICAgQG5hbWUgPSBuYW1lCisKKyAgICAgIEBsb29rdXBzID0gbG9va3VwcworICAgICAgQGNvbW1hbmRfZmxhZ3MgPSAwCisKKyAgICAgIEBsb29rdXBzLmVhY2hfaW5kZXggZG8gfGl8CisgICAgICAgIGxvb2t1cCA9IGxvb2t1cHNbaV0KKyAgICAgICAgaWYgbG9va3VwID1+IFNRVUFSRV9CUkFDS0VURUQKKyAgICAgICAgICBsb29rdXBzW2ldID0gRXhwcmVzc2lvbi5wYXJzZSgkMSkKKyAgICAgICAgZWxzaWYgQ09NTUFORF9NRVRIT0RTLmluY2x1ZGU/KGxvb2t1cCkKKyAgICAgICAgICBAY29tbWFuZF9mbGFncyB8PSAxIDw8IGkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBldmFsdWF0ZShjb250ZXh0KQorICAgICAgbmFtZSA9IGNvbnRleHQuZXZhbHVhdGUoQG5hbWUpCisgICAgICBvYmplY3QgPSBjb250ZXh0LmZpbmRfdmFyaWFibGUobmFtZSkKKworICAgICAgQGxvb2t1cHMuZWFjaF9pbmRleCBkbyB8aXwKKyAgICAgICAga2V5ID0gY29udGV4dC5ldmFsdWF0ZShAbG9va3Vwc1tpXSkKKworICAgICAgICAjIElmIG9iamVjdCBpcyBhIGhhc2gtIG9yIGFycmF5LWxpa2Ugb2JqZWN0IHdlIGxvb2sgZm9yIHRoZQorICAgICAgICAjIHByZXNlbmNlIG9mIHRoZSBrZXkgYW5kIGlmIGl0cyBhdmFpbGFibGUgd2UgcmV0dXJuIGl0CisgICAgICAgIGlmIG9iamVjdC5yZXNwb25kX3RvPyg6W10pICYmCisgICAgICAgICAgICAoKG9iamVjdC5yZXNwb25kX3RvPyg6a2V5PykgJiYgb2JqZWN0LmtleT8oa2V5KSkgfHwKKyAgICAgICAgICAgICAob2JqZWN0LnJlc3BvbmRfdG8/KDpmZXRjaCkgJiYga2V5LmlzX2E/KEludGVnZXIpKSkKKworICAgICAgICAgICMgaWYgaXRzIGEgcHJvYyB3ZSB3aWxsIHJlcGxhY2UgdGhlIGVudHJ5IHdpdGggdGhlIHByb2MKKyAgICAgICAgICByZXMgPSBjb250ZXh0Lmxvb2t1cF9hbmRfZXZhbHVhdGUob2JqZWN0LCBrZXkpCisgICAgICAgICAgb2JqZWN0ID0gcmVzLnRvX2xpcXVpZAorCisgICAgICAgICAgIyBTb21lIHNwZWNpYWwgY2FzZXMuIElmIHRoZSBwYXJ0IHdhc24ndCBpbiBzcXVhcmUgYnJhY2tldHMgYW5kCisgICAgICAgICAgIyBubyBrZXkgd2l0aCB0aGUgc2FtZSBuYW1lIHdhcyBmb3VuZCB3ZSBpbnRlcnByZXQgZm9sbG93aW5nIGNhbGxzCisgICAgICAgICAgIyBhcyBjb21tYW5kcyBhbmQgY2FsbCB0aGVtIG9uIHRoZSBjdXJyZW50IG9iamVjdAorICAgICAgICBlbHNpZiBAY29tbWFuZF9mbGFncyAmICgxIDw8IGkpICE9IDAgJiYgb2JqZWN0LnJlc3BvbmRfdG8/KGtleSkKKyAgICAgICAgICBvYmplY3QgPSBvYmplY3Quc2VuZChrZXkpLnRvX2xpcXVpZAorCisgICAgICAgICAgIyBObyBrZXkgd2FzIHByZXNlbnQgd2l0aCB0aGUgZGVzaXJlZCB2YWx1ZSBhbmQgaXQgd2Fzbid0IG9uZSBvZiB0aGUgZGlyZWN0bHkgc3VwcG9ydGVkCisgICAgICAgICAgIyBrZXl3b3JkcyBlaXRoZXIuIFRoZSBvbmx5IHRoaW5nIHdlIGdvdCBsZWZ0IGlzIHRvIHJldHVybiBuaWwgb3IKKyAgICAgICAgICAjIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBgc3RyaWN0X3ZhcmlhYmxlc2Agb3B0aW9uIGlzIHNldCB0byB0cnVlCisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gbmlsIHVubGVzcyBjb250ZXh0LnN0cmljdF92YXJpYWJsZXMKKyAgICAgICAgICByYWlzZSBMaXF1aWQ6OlVuZGVmaW5lZFZhcmlhYmxlLCAidW5kZWZpbmVkIHZhcmlhYmxlICN7a2V5fSIKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgZHJvcCBoZXJlIHdlIGhhdmUgdG8KKyAgICAgICAgb2JqZWN0LmNvbnRleHQgPSBjb250ZXh0IGlmIG9iamVjdC5yZXNwb25kX3RvPyg6Y29udGV4dD0pCisgICAgICBlbmQKKworICAgICAgb2JqZWN0CisgICAgZW5kCisKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICBzZWxmLmNsYXNzID09IG90aGVyLmNsYXNzICYmIHN0YXRlID09IG90aGVyLnN0YXRlCisgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKworICAgIGRlZiBzdGF0ZQorICAgICAgW0BuYW1lLCBAbG9va3VwcywgQGNvbW1hbmRfZmxhZ3NdCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvbGliL2xpcXVpZC92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjE1ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL2xpYi9saXF1aWQvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDQgQEAKKyMgZW5jb2Rpbmc6IHV0Zi04Cittb2R1bGUgTGlxdWlkCisgIFZFUlNJT04gPSAiNC4wLjAiCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ZpeHR1cmVzL2VuX2xvY2FsZS55bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9maXh0dXJlcy9lbl9sb2NhbGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMTEzYzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9maXh0dXJlcy9lbl9sb2NhbGUueW1sCkBAIC0wLDAgKzEsOSBAQAorLS0tCisgIHNpbXBsZTogImxlc3MgaXMgbW9yZSIKKyAgd2hhdGV2ZXI6ICJzb21ldGhpbmcgJXtzb21ldGhpbmd9IgorICBlcnJvcnM6CisgICAgaTE4bjoKKyAgICAgIHVuZGVmaW5lZF9pbnRlcnBvbGF0aW9uOiAidW5kZWZpbmVkIGtleSAle2tleX0iCisgICAgICB1bmtub3duX3RyYW5zbGF0aW9uOiAidHJhbnNsYXRpb24gJyV7bmFtZX0nIHdhc24ndCBmb3VuZCIKKyAgICBzeW50YXg6CisgICAgICBvb3BzOiAic29tZXRoaW5nIHdhc24ndCByaWdodCIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL2Fzc2lnbl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vYXNzaWduX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwMjI4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL2Fzc2lnbl90ZXN0LnJiCkBAIC0wLDAgKzEsNDggQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBBc3NpZ25UZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9hc3NpZ25fd2l0aF9oeXBoZW5faW5fdmFyaWFibGVfbmFtZQorICAgIHRlbXBsYXRlX3NvdXJjZSA9IDw8LUVORF9URU1QTEFURQorICAgIHslIGFzc2lnbiB0aGlzLXRoaW5nID0gJ1ByaW50IHRoaXMtdGhpbmcnICV9CisgICAge3sgdGhpcy10aGluZyB9fQorICAgIEVORF9URU1QTEFURQorICAgIHRlbXBsYXRlID0gVGVtcGxhdGUucGFyc2UodGVtcGxhdGVfc291cmNlKQorICAgIHJlbmRlcmVkID0gdGVtcGxhdGUucmVuZGVyIQorICAgIGFzc2VydF9lcXVhbCAiUHJpbnQgdGhpcy10aGluZyIsIHJlbmRlcmVkLnN0cmlwCisgIGVuZAorCisgIGRlZiB0ZXN0X2Fzc2lnbmVkX3ZhcmlhYmxlCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnLmZvby4nLAorICAgICAgJ3slIGFzc2lnbiBmb28gPSB2YWx1ZXMgJX0ue3sgZm9vWzBdIH19LicsCisgICAgICAndmFsdWVzJyA9PiAldyhmb28gYmFyIGJheikpCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcuYmFyLicsCisgICAgICAneyUgYXNzaWduIGZvbyA9IHZhbHVlcyAlfS57eyBmb29bMV0gfX0uJywKKyAgICAgICd2YWx1ZXMnID0+ICV3KGZvbyBiYXIgYmF6KSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXNzaWduX3dpdGhfZmlsdGVyCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnLmJhci4nLAorICAgICAgJ3slIGFzc2lnbiBmb28gPSB2YWx1ZXMgfCBzcGxpdDogIiwiICV9Lnt7IGZvb1sxXSB9fS4nLAorICAgICAgJ3ZhbHVlcycgPT4gImZvbyxiYXIsYmF6IikKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXNzaWduX3N5bnRheF9lcnJvcgorICAgIGFzc2VydF9tYXRjaF9zeW50YXhfZXJyb3IoL2Fzc2lnbi8sCisgICAgICAneyUgYXNzaWduIGZvbyBub3QgdmFsdWVzICV9LicsCisgICAgICAndmFsdWVzJyA9PiAiZm9vLGJhcixiYXoiKQorICBlbmQKKworICBkZWYgdGVzdF9hc3NpZ25fdXNlc19lcnJvcl9tb2RlCisgICAgd2l0aF9lcnJvcl9tb2RlKDpzdHJpY3QpIGRvCisgICAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgICBUZW1wbGF0ZS5wYXJzZSgieyUgYXNzaWduIGZvbyA9ICgnWCcgfCBkb3duY2FzZSkgJX0iKQorICAgICAgZW5kCisgICAgZW5kCisgICAgd2l0aF9lcnJvcl9tb2RlKDpsYXgpIGRvCisgICAgICBhc3NlcnQgVGVtcGxhdGUucGFyc2UoInslIGFzc2lnbiBmb28gPSAoJ1gnIHwgZG93bmNhc2UpICV9IikKKyAgICBlbmQKKyAgZW5kCitlbmQgIyBBc3NpZ25UZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9ibGFua190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vYmxhbmtfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWI1NmRmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vYmxhbmtfdGVzdC5yYgpAQCAtMCwwICsxLDEwNiBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIEZvb2JhclRhZyA8IExpcXVpZDo6VGFnCisgIGRlZiByZW5kZXIoKmFyZ3MpCisgICAgIiAiCisgIGVuZAorCisgIExpcXVpZDo6VGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdmb29iYXInLCBGb29iYXJUYWcpCitlbmQKKworY2xhc3MgQmxhbmtUZXN0RmlsZVN5c3RlbQorICBkZWYgcmVhZF90ZW1wbGF0ZV9maWxlKHRlbXBsYXRlX3BhdGgpCisgICAgdGVtcGxhdGVfcGF0aAorICBlbmQKK2VuZAorCitjbGFzcyBCbGFua1Rlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorICBOID0gMTAKKworICBkZWYgd3JhcF9pbl9mb3IoYm9keSkKKyAgICAieyUgZm9yIGkgaW4gKDEuLiN7Tn0pICV9I3tib2R5fXslIGVuZGZvciAlfSIKKyAgZW5kCisKKyAgZGVmIHdyYXBfaW5faWYoYm9keSkKKyAgICAieyUgaWYgdHJ1ZSAlfSN7Ym9keX17JSBlbmRpZiAlfSIKKyAgZW5kCisKKyAgZGVmIHdyYXAoYm9keSkKKyAgICB3cmFwX2luX2Zvcihib2R5KSArIHdyYXBfaW5faWYoYm9keSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmV3X3RhZ3NfYXJlX25vdF9ibGFua19ieV9kZWZhdWx0CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiICIgKiBOLCB3cmFwX2luX2ZvcigieyUgZm9vYmFyICV9IikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvb3BzX2FyZV9ibGFuaworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoIiIsIHdyYXBfaW5fZm9yKCIgIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2lmX2Vsc2VfYXJlX2JsYW5rCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiIiwgInslIGlmIHRydWUgJX0geyUgZWxzaWYgZmFsc2UgJX0geyUgZWxzZSAlfSB7JSBlbmRpZiAlfSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3VubGVzc19pc19ibGFuaworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoIiIsIHdyYXAoInslIHVubGVzcyB0cnVlICV9IHslIGVuZHVubGVzcyAlfSIpKQorICBlbmQKKworICBkZWYgdGVzdF9tYXJrX2FzX2JsYW5rX29ubHlfZHVyaW5nX3BhcnNpbmcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCIgIiAqIChOICsgMSksIHdyYXAoIiB7JSBpZiBmYWxzZSAlfSB0aGlzIG5ldmVyIGhhcHBlbnMsIGJ1dCBzdGlsbCwgdGhpcyBibG9jayBpcyBub3QgYmxhbmsgeyUgZW5kaWYgJX0iKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tbWVudHNfYXJlX2JsYW5rCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiIiwgd3JhcCgiIHslIGNvbW1lbnQgJX0gd2hhdGV2ZXIgeyUgZW5kY29tbWVudCAlfSAiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FwdHVyZXNfYXJlX2JsYW5rCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiIiwgd3JhcCgiIHslIGNhcHR1cmUgZm9vICV9IHdoYXRldmVyIHslIGVuZGNhcHR1cmUgJX0gIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9ibG9ja3NfYXJlX2JsYW5rX2J1dF9vbmx5X2lmX2FsbF9jaGlsZHJlbl9hcmUKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCIiLCB3cmFwKHdyYXAoIiAiKSkpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiXG4gICAgICAgYnV0IHRoaXMgaXMgbm90ICIgKiAoTiArIDEpLAorICAgICAgd3JhcCgneyUgaWYgdHJ1ZSAlfSB7JSBjb21tZW50ICV9IHRoaXMgaXMgYmxhbmsgeyUgZW5kY29tbWVudCAlfSB7JSBlbmRpZiAlfQorICAgICAgeyUgaWYgdHJ1ZSAlfSBidXQgdGhpcyBpcyBub3QgeyUgZW5kaWYgJX0nKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXNzaWduc19hcmVfYmxhbmsKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCIiLCB3cmFwKCcgeyUgYXNzaWduIGZvbyA9ICJiYXIiICV9ICcpKQorICBlbmQKKworICBkZWYgdGVzdF93aGl0ZXNwYWNlX2lzX2JsYW5rCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiIiwgd3JhcCgiICIpKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoIiIsIHdyYXAoIlx0IikpCisgIGVuZAorCisgIGRlZiB0ZXN0X3doaXRlc3BhY2VfaXNfbm90X2JsYW5rX2lmX290aGVyX3N0dWZmX2lzX3ByZXNlbnQKKyAgICBib2R5ID0gIiAgICAgeCAiCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChib2R5ICogKE4gKyAxKSwgd3JhcChib2R5KSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jcmVtZW50X2lzX25vdF9ibGFuaworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoIiAwIiAqIDIgKiAoTiArIDEpLCB3cmFwKCJ7JSBhc3NpZ24gZm9vID0gMCAlfSB7JSBpbmNyZW1lbnQgZm9vICV9IHslIGRlY3JlbWVudCBmb28gJX0iKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3ljbGVfaXNfbm90X2JsYW5rCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiICAiICogKChOICsgMSkgLyAyKSArICIgIiwgd3JhcCgieyUgY3ljbGUgJyAnLCAnICcgJX0iKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmF3X2lzX25vdF9ibGFuaworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoIiAgIiAqIChOICsgMSksIHdyYXAoIiB7JSByYXcgJX0geyUgZW5kcmF3ICV9IikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2luY2x1ZGVfaXNfYmxhbmsKKyAgICBMaXF1aWQ6OlRlbXBsYXRlLmZpbGVfc3lzdGVtID0gQmxhbmtUZXN0RmlsZVN5c3RlbS5uZXcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICJmb29iYXIiICogKE4gKyAxKSwgd3JhcCgieyUgaW5jbHVkZSAnZm9vYmFyJyAlfSIpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiIGZvb2JhciAiICogKE4gKyAxKSwgd3JhcCgieyUgaW5jbHVkZSAnIGZvb2JhciAnICV9IikKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICIgICAiICogKE4gKyAxKSwgd3JhcCgiIHslIGluY2x1ZGUgJyAnICV9ICIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Nhc2VfaXNfYmxhbmsKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCIiLCB3cmFwKCIgeyUgYXNzaWduIGZvbyA9ICdiYXInICV9IHslIGNhc2UgZm9vICV9IHslIHdoZW4gJ2JhcicgJX0geyUgd2hlbiAnd2hhdGV2ZXInICV9IHslIGVsc2UgJX0geyUgZW5kY2FzZSAlfSAiKSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCIiLCB3cmFwKCIgeyUgYXNzaWduIGZvbyA9ICdlbHNlJyAlfSB7JSBjYXNlIGZvbyAlfSB7JSB3aGVuICdiYXInICV9IHslIHdoZW4gJ3doYXRldmVyJyAlfSB7JSBlbHNlICV9IHslIGVuZGNhc2UgJX0gIikpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiICAgeCAgIiAqIChOICsgMSksIHdyYXAoIiB7JSBhc3NpZ24gZm9vID0gJ2Vsc2UnICV9IHslIGNhc2UgZm9vICV9IHslIHdoZW4gJ2JhcicgJX0geyUgd2hlbiAnd2hhdGV2ZXInICV9IHslIGVsc2UgJX0geCB7JSBlbmRjYXNlICV9ICIpKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vY2FwdHVyZV90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vY2FwdHVyZV90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTY1YjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9jYXB0dXJlX3Rlc3QucmIKQEAgLTAsMCArMSw1MCBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIENhcHR1cmVUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9jYXB0dXJlc19ibG9ja19jb250ZW50X2luX3ZhcmlhYmxlCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgidGVzdCBzdHJpbmciLCAieyUgY2FwdHVyZSAndmFyJyAlfXRlc3Qgc3RyaW5neyUgZW5kY2FwdHVyZSAlfXt7dmFyfX0iLCB7fSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FwdHVyZV93aXRoX2h5cGhlbl9pbl92YXJpYWJsZV9uYW1lCisgICAgdGVtcGxhdGVfc291cmNlID0gPDwtRU5EX1RFTVBMQVRFCisgICAgeyUgY2FwdHVyZSB0aGlzLXRoaW5nICV9UHJpbnQgdGhpcy10aGluZ3slIGVuZGNhcHR1cmUgJX0KKyAgICB7eyB0aGlzLXRoaW5nIH19CisgICAgRU5EX1RFTVBMQVRFCisgICAgdGVtcGxhdGUgPSBUZW1wbGF0ZS5wYXJzZSh0ZW1wbGF0ZV9zb3VyY2UpCisgICAgcmVuZGVyZWQgPSB0ZW1wbGF0ZS5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsICJQcmludCB0aGlzLXRoaW5nIiwgcmVuZGVyZWQuc3RyaXAKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FwdHVyZV90b192YXJpYWJsZV9mcm9tX291dGVyX3Njb3BlX2lmX2V4aXN0aW5nCisgICAgdGVtcGxhdGVfc291cmNlID0gPDwtRU5EX1RFTVBMQVRFCisgICAgeyUgYXNzaWduIHZhciA9ICcnICV9CisgICAgeyUgaWYgdHJ1ZSAlfQorICAgIHslIGNhcHR1cmUgdmFyICV9Zmlyc3QtYmxvY2stc3RyaW5neyUgZW5kY2FwdHVyZSAlfQorICAgIHslIGVuZGlmICV9CisgICAgeyUgaWYgdHJ1ZSAlfQorICAgIHslIGNhcHR1cmUgdmFyICV9dGVzdC1zdHJpbmd7JSBlbmRjYXB0dXJlICV9CisgICAgeyUgZW5kaWYgJX0KKyAgICB7e3Zhcn19CisgICAgRU5EX1RFTVBMQVRFCisgICAgdGVtcGxhdGUgPSBUZW1wbGF0ZS5wYXJzZSh0ZW1wbGF0ZV9zb3VyY2UpCisgICAgcmVuZGVyZWQgPSB0ZW1wbGF0ZS5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsICJ0ZXN0LXN0cmluZyIsIHJlbmRlcmVkLmdzdWIoL1xzLywgJycpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Fzc2lnbmluZ19mcm9tX2NhcHR1cmUKKyAgICB0ZW1wbGF0ZV9zb3VyY2UgPSA8PC1FTkRfVEVNUExBVEUKKyAgICB7JSBhc3NpZ24gZmlyc3QgPSAnJyAlfQorICAgIHslIGFzc2lnbiBzZWNvbmQgPSAnJyAlfQorICAgIHslIGZvciBudW1iZXIgaW4gKDEuLjMpICV9CisgICAgeyUgY2FwdHVyZSBmaXJzdCAlfXt7bnVtYmVyfX17JSBlbmRjYXB0dXJlICV9CisgICAgeyUgYXNzaWduIHNlY29uZCA9IGZpcnN0ICV9CisgICAgeyUgZW5kZm9yICV9CisgICAge3sgZmlyc3QgfX0te3sgc2Vjb25kIH19CisgICAgRU5EX1RFTVBMQVRFCisgICAgdGVtcGxhdGUgPSBUZW1wbGF0ZS5wYXJzZSh0ZW1wbGF0ZV9zb3VyY2UpCisgICAgcmVuZGVyZWQgPSB0ZW1wbGF0ZS5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsICIzLTMiLCByZW5kZXJlZC5nc3ViKC9ccy8sICcnKQorICBlbmQKK2VuZCAjIENhcHR1cmVUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9jb250ZXh0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9jb250ZXh0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxMDliYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL2NvbnRleHRfdGVzdC5yYgpAQCAtMCwwICsxLDMyIEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgQ29udGV4dFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiB0ZXN0X292ZXJyaWRlX2dsb2JhbF9maWx0ZXIKKyAgICBnbG9iYWwgPSBNb2R1bGUubmV3IGRvCisgICAgICBkZWYgbm90aWNlKG91dHB1dCkKKyAgICAgICAgIkdsb2JhbCAje291dHB1dH0iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGxvY2FsID0gTW9kdWxlLm5ldyBkbworICAgICAgZGVmIG5vdGljZShvdXRwdXQpCisgICAgICAgICJMb2NhbCAje291dHB1dH0iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHdpdGhfZ2xvYmFsX2ZpbHRlcihnbG9iYWwpIGRvCisgICAgICBhc3NlcnRfZXF1YWwgJ0dsb2JhbCB0ZXN0JywgVGVtcGxhdGUucGFyc2UoInt7J3Rlc3QnIHwgbm90aWNlIH19IikucmVuZGVyIQorICAgICAgYXNzZXJ0X2VxdWFsICdMb2NhbCB0ZXN0JywgVGVtcGxhdGUucGFyc2UoInt7J3Rlc3QnIHwgbm90aWNlIH19IikucmVuZGVyISh7fSwgZmlsdGVyczogW2xvY2FsXSkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfaGFzX2tleV93aWxsX25vdF9hZGRfYW5fZXJyb3JfZm9yX21pc3Npbmdfa2V5cworICAgIHdpdGhfZXJyb3JfbW9kZSA6c3RyaWN0IGRvCisgICAgICBjb250ZXh0ID0gQ29udGV4dC5uZXcKKyAgICAgIGNvbnRleHQua2V5PygndW5rbm93bicpCisgICAgICBhc3NlcnRfZW1wdHkgY29udGV4dC5lcnJvcnMKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL2RvY3VtZW50X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9kb2N1bWVudF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzRhMjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9kb2N1bWVudF90ZXN0LnJiCkBAIC0wLDAgKzEsMTkgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBEb2N1bWVudFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiB0ZXN0X3VuZXhwZWN0ZWRfb3V0ZXJfdGFnCisgICAgZXhjID0gYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcikgZG8KKyAgICAgIFRlbXBsYXRlLnBhcnNlKCJ7JSBlbHNlICV9IikKKyAgICBlbmQKKyAgICBhc3NlcnRfZXF1YWwgZXhjLm1lc3NhZ2UsICJMaXF1aWQgc3ludGF4IGVycm9yOiBVbmV4cGVjdGVkIG91dGVyICdlbHNlJyB0YWciCisgIGVuZAorCisgIGRlZiB0ZXN0X3Vua25vd25fdGFnCisgICAgZXhjID0gYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcikgZG8KKyAgICAgIFRlbXBsYXRlLnBhcnNlKCJ7JSBmb28gJX0iKQorICAgIGVuZAorICAgIGFzc2VydF9lcXVhbCBleGMubWVzc2FnZSwgIkxpcXVpZCBzeW50YXggZXJyb3I6IFVua25vd24gdGFnICdmb28nIgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vZHJvcF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vZHJvcF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZTRhNWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9kcm9wX3Rlc3QucmIKQEAgLTAsMCArMSwyNzMgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBDb250ZXh0RHJvcCA8IExpcXVpZDo6RHJvcAorICBkZWYgc2NvcGVzCisgICAgQGNvbnRleHQuc2NvcGVzLnNpemUKKyAgZW5kCisKKyAgZGVmIHNjb3Blc19hc19hcnJheQorICAgICgxLi5AY29udGV4dC5zY29wZXMuc2l6ZSkudG9fYQorICBlbmQKKworICBkZWYgbG9vcF9wb3MKKyAgICBAY29udGV4dFsnZm9ybG9vcC5pbmRleCddCisgIGVuZAorCisgIGRlZiBsaXF1aWRfbWV0aG9kX21pc3NpbmcobWV0aG9kKQorICAgIEBjb250ZXh0W21ldGhvZF0KKyAgZW5kCitlbmQKKworY2xhc3MgUHJvZHVjdERyb3AgPCBMaXF1aWQ6OkRyb3AKKyAgY2xhc3MgVGV4dERyb3AgPCBMaXF1aWQ6OkRyb3AKKyAgICBkZWYgYXJyYXkKKyAgICAgIFsndGV4dDEnLCAndGV4dDInXQorICAgIGVuZAorCisgICAgZGVmIHRleHQKKyAgICAgICd0ZXh0MScKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgQ2F0Y2hhbGxEcm9wIDwgTGlxdWlkOjpEcm9wCisgICAgZGVmIGxpcXVpZF9tZXRob2RfbWlzc2luZyhtZXRob2QpCisgICAgICAnY2F0Y2hhbGxfbWV0aG9kOiAnIDw8IG1ldGhvZC50b19zCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXh0cworICAgIFRleHREcm9wLm5ldworICBlbmQKKworICBkZWYgY2F0Y2hhbGwKKyAgICBDYXRjaGFsbERyb3AubmV3CisgIGVuZAorCisgIGRlZiBjb250ZXh0CisgICAgQ29udGV4dERyb3AubmV3CisgIGVuZAorCisgIGRlZiB1c2VyX2lucHV0CisgICAgImZvbyIudGFpbnQKKyAgZW5kCisKKyAgcHJvdGVjdGVkCisKKyAgZGVmIGNhbGxtZW5vdAorICAgICJwcm90ZWN0ZWQiCisgIGVuZAorZW5kCisKK2NsYXNzIEVudW1lcmFibGVEcm9wIDwgTGlxdWlkOjpEcm9wCisgIGRlZiBsaXF1aWRfbWV0aG9kX21pc3NpbmcobWV0aG9kKQorICAgIG1ldGhvZAorICBlbmQKKworICBkZWYgc2l6ZQorICAgIDMKKyAgZW5kCisKKyAgZGVmIGZpcnN0CisgICAgMQorICBlbmQKKworICBkZWYgY291bnQKKyAgICAzCisgIGVuZAorCisgIGRlZiBtaW4KKyAgICAxCisgIGVuZAorCisgIGRlZiBtYXgKKyAgICAzCisgIGVuZAorCisgIGRlZiBlYWNoCisgICAgeWllbGQgMQorICAgIHlpZWxkIDIKKyAgICB5aWVsZCAzCisgIGVuZAorZW5kCisKK2NsYXNzIFJlYWxFbnVtZXJhYmxlRHJvcCA8IExpcXVpZDo6RHJvcAorICBpbmNsdWRlIEVudW1lcmFibGUKKworICBkZWYgbGlxdWlkX21ldGhvZF9taXNzaW5nKG1ldGhvZCkKKyAgICBtZXRob2QKKyAgZW5kCisKKyAgZGVmIGVhY2gKKyAgICB5aWVsZCAxCisgICAgeWllbGQgMgorICAgIHlpZWxkIDMKKyAgZW5kCitlbmQKKworY2xhc3MgRHJvcHNUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9wcm9kdWN0X2Ryb3AKKyAgICB0cGwgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCcgICcpCisgICAgYXNzZXJ0X2VxdWFsICcgICcsIHRwbC5yZW5kZXIhKCdwcm9kdWN0JyA9PiBQcm9kdWN0RHJvcC5uZXcpCisgIGVuZAorCisgIGRlZiB0ZXN0X3JlbmRlcmluZ19yYWlzZXNfb25fdGFpbnRlZF9hdHRyCisgICAgd2l0aF90YWludF9tb2RlKDplcnJvcikgZG8KKyAgICAgIHRwbCA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3t7IHByb2R1Y3QudXNlcl9pbnB1dCB9fScpCisgICAgICBhc3NlcnRfcmFpc2VzIFRhaW50ZWRFcnJvciBkbworICAgICAgICB0cGwucmVuZGVyISgncHJvZHVjdCcgPT4gUHJvZHVjdERyb3AubmV3KQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3JlbmRlcmluZ193YXJuc19vbl90YWludGVkX2F0dHIKKyAgICB3aXRoX3RhaW50X21vZGUoOndhcm4pIGRvCisgICAgICB0cGwgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7eyBwcm9kdWN0LnVzZXJfaW5wdXQgfX0nKQorICAgICAgY29udGV4dCA9IENvbnRleHQubmV3KCdwcm9kdWN0JyA9PiBQcm9kdWN0RHJvcC5uZXcpCisgICAgICB0cGwucmVuZGVyIShjb250ZXh0KQorICAgICAgYXNzZXJ0X2VxdWFsIFtMaXF1aWQ6OlRhaW50ZWRFcnJvcl0sIGNvbnRleHQud2FybmluZ3MubWFwKCY6Y2xhc3MpCisgICAgICBhc3NlcnRfZXF1YWwgInZhcmlhYmxlICdwcm9kdWN0LnVzZXJfaW5wdXQnIGlzIHRhaW50ZWQgYW5kIHdhcyBub3QgZXNjYXBlZCIsIGNvbnRleHQud2FybmluZ3MuZmlyc3QudG9fcyhmYWxzZSkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVuZGVyaW5nX2RvZXNudF9yYWlzZV9vbl9lc2NhcGVkX3RhaW50ZWRfYXR0cgorICAgIHdpdGhfdGFpbnRfbW9kZSg6ZXJyb3IpIGRvCisgICAgICB0cGwgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7eyBwcm9kdWN0LnVzZXJfaW5wdXQgfCBlc2NhcGUgfX0nKQorICAgICAgdHBsLnJlbmRlciEoJ3Byb2R1Y3QnID0+IFByb2R1Y3REcm9wLm5ldykKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZHJvcF9kb2VzX29ubHlfcmVzcG9uZF90b193aGl0ZWxpc3RlZF9tZXRob2RzCisgICAgYXNzZXJ0X2VxdWFsICIiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7eyBwcm9kdWN0Lmluc3BlY3QgfX0iKS5yZW5kZXIhKCdwcm9kdWN0JyA9PiBQcm9kdWN0RHJvcC5uZXcpCisgICAgYXNzZXJ0X2VxdWFsICIiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7eyBwcm9kdWN0LnByZXR0eV9pbnNwZWN0IH19IikucmVuZGVyISgncHJvZHVjdCcgPT4gUHJvZHVjdERyb3AubmV3KQorICAgIGFzc2VydF9lcXVhbCAiIiwgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgie3sgcHJvZHVjdC53aGF0ZXZlciB9fSIpLnJlbmRlciEoJ3Byb2R1Y3QnID0+IFByb2R1Y3REcm9wLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgIiIsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3t7IHByb2R1Y3QgfCBtYXA6ICJpbnNwZWN0IiB9fScpLnJlbmRlciEoJ3Byb2R1Y3QnID0+IFByb2R1Y3REcm9wLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgIiIsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3t7IHByb2R1Y3QgfCBtYXA6ICJwcmV0dHlfaW5zcGVjdCIgfX0nKS5yZW5kZXIhKCdwcm9kdWN0JyA9PiBQcm9kdWN0RHJvcC5uZXcpCisgICAgYXNzZXJ0X2VxdWFsICIiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7eyBwcm9kdWN0IHwgbWFwOiAid2hhdGV2ZXIiIH19JykucmVuZGVyISgncHJvZHVjdCcgPT4gUHJvZHVjdERyb3AubmV3KQorICBlbmQKKworICBkZWYgdGVzdF9kcm9wc19yZXNwb25kX3RvX3RvX2xpcXVpZAorICAgIGFzc2VydF9lcXVhbCAidGV4dDEiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7eyBwcm9kdWN0LnRvX2xpcXVpZC50ZXh0cy50ZXh0IH19IikucmVuZGVyISgncHJvZHVjdCcgPT4gUHJvZHVjdERyb3AubmV3KQorICAgIGFzc2VydF9lcXVhbCAidGV4dDEiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7eyBwcm9kdWN0IHwgbWFwOiAidG9fbGlxdWlkIiB8IG1hcDogInRleHRzIiB8IG1hcDogInRleHQiIH19JykucmVuZGVyISgncHJvZHVjdCcgPT4gUHJvZHVjdERyb3AubmV3KQorICBlbmQKKworICBkZWYgdGVzdF90ZXh0X2Ryb3AKKyAgICBvdXRwdXQgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCcge3sgcHJvZHVjdC50ZXh0cy50ZXh0IH19ICcpLnJlbmRlciEoJ3Byb2R1Y3QnID0+IFByb2R1Y3REcm9wLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgJyB0ZXh0MSAnLCBvdXRwdXQKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2F0Y2hhbGxfdW5rbm93bl9tZXRob2QKKyAgICBvdXRwdXQgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCcge3sgcHJvZHVjdC5jYXRjaGFsbC51bmtub3duIH19ICcpLnJlbmRlciEoJ3Byb2R1Y3QnID0+IFByb2R1Y3REcm9wLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgJyBjYXRjaGFsbF9tZXRob2Q6IHVua25vd24gJywgb3V0cHV0CisgIGVuZAorCisgIGRlZiB0ZXN0X2NhdGNoYWxsX2ludGVnZXJfYXJndW1lbnRfZHJvcAorICAgIG91dHB1dCA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJyB7eyBwcm9kdWN0LmNhdGNoYWxsWzhdIH19ICcpLnJlbmRlciEoJ3Byb2R1Y3QnID0+IFByb2R1Y3REcm9wLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgJyBjYXRjaGFsbF9tZXRob2Q6IDggJywgb3V0cHV0CisgIGVuZAorCisgIGRlZiB0ZXN0X3RleHRfYXJyYXlfZHJvcAorICAgIG91dHB1dCA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3slIGZvciB0ZXh0IGluIHByb2R1Y3QudGV4dHMuYXJyYXkgJX0ge3t0ZXh0fX0geyUgZW5kZm9yICV9JykucmVuZGVyISgncHJvZHVjdCcgPT4gUHJvZHVjdERyb3AubmV3KQorICAgIGFzc2VydF9lcXVhbCAnIHRleHQxICB0ZXh0MiAnLCBvdXRwdXQKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29udGV4dF9kcm9wCisgICAgb3V0cHV0ID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgnIHt7IGNvbnRleHQuYmFyIH19ICcpLnJlbmRlciEoJ2NvbnRleHQnID0+IENvbnRleHREcm9wLm5ldywgJ2JhcicgPT4gImNhcnJvdCIpCisgICAgYXNzZXJ0X2VxdWFsICcgY2Fycm90ICcsIG91dHB1dAorICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfY29udGV4dF9kcm9wCisgICAgb3V0cHV0ID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgnIHt7IHByb2R1Y3QuY29udGV4dC5mb28gfX0gJykucmVuZGVyISgncHJvZHVjdCcgPT4gUHJvZHVjdERyb3AubmV3LCAnZm9vJyA9PiAibW9ua2V5IikKKyAgICBhc3NlcnRfZXF1YWwgJyBtb25rZXkgJywgb3V0cHV0CisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb3RlY3RlZAorICAgIG91dHB1dCA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJyB7eyBwcm9kdWN0LmNhbGxtZW5vdCB9fSAnKS5yZW5kZXIhKCdwcm9kdWN0JyA9PiBQcm9kdWN0RHJvcC5uZXcpCisgICAgYXNzZXJ0X2VxdWFsICcgICcsIG91dHB1dAorICBlbmQKKworICBkZWYgdGVzdF9vYmplY3RfbWV0aG9kc19ub3RfYWxsb3dlZAorICAgIFs6ZHVwLCA6Y2xvbmUsIDpzaW5nbGV0b25fY2xhc3MsIDpldmFsLCA6Y2xhc3NfZXZhbCwgOmluc3BlY3RdLmVhY2ggZG8gfG1ldGhvZHwKKyAgICAgIG91dHB1dCA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoIiB7eyBwcm9kdWN0LiN7bWV0aG9kfSB9fSAiKS5yZW5kZXIhKCdwcm9kdWN0JyA9PiBQcm9kdWN0RHJvcC5uZXcpCisgICAgICBhc3NlcnRfZXF1YWwgJyAgJywgb3V0cHV0CisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3Njb3BlCisgICAgYXNzZXJ0X2VxdWFsICcxJywgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgne3sgY29udGV4dC5zY29wZXMgfX0nKS5yZW5kZXIhKCdjb250ZXh0JyA9PiBDb250ZXh0RHJvcC5uZXcpCisgICAgYXNzZXJ0X2VxdWFsICcyJywgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgneyVmb3IgaSBpbiBkdW1teSV9e3sgY29udGV4dC5zY29wZXMgfX17JWVuZGZvciV9JykucmVuZGVyISgnY29udGV4dCcgPT4gQ29udGV4dERyb3AubmV3LCAnZHVtbXknID0+IFsxXSkKKyAgICBhc3NlcnRfZXF1YWwgJzMnLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7JWZvciBpIGluIGR1bW15JX17JWZvciBpIGluIGR1bW15JX17eyBjb250ZXh0LnNjb3BlcyB9fXslZW5kZm9yJX17JWVuZGZvciV9JykucmVuZGVyISgnY29udGV4dCcgPT4gQ29udGV4dERyb3AubmV3LCAnZHVtbXknID0+IFsxXSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2NvcGVfdGhvdWdoX3Byb2MKKyAgICBhc3NlcnRfZXF1YWwgJzEnLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7eyBzIH19JykucmVuZGVyISgnY29udGV4dCcgPT4gQ29udGV4dERyb3AubmV3LCAncycgPT4gcHJvY3sgfGN8IGNbJ2NvbnRleHQuc2NvcGVzJ10gfSkKKyAgICBhc3NlcnRfZXF1YWwgJzInLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7JWZvciBpIGluIGR1bW15JX17eyBzIH19eyVlbmRmb3IlfScpLnJlbmRlciEoJ2NvbnRleHQnID0+IENvbnRleHREcm9wLm5ldywgJ3MnID0+IHByb2N7IHxjfCBjWydjb250ZXh0LnNjb3BlcyddIH0sICdkdW1teScgPT4gWzFdKQorICAgIGFzc2VydF9lcXVhbCAnMycsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3slZm9yIGkgaW4gZHVtbXklfXslZm9yIGkgaW4gZHVtbXklfXt7IHMgfX17JWVuZGZvciV9eyVlbmRmb3IlfScpLnJlbmRlciEoJ2NvbnRleHQnID0+IENvbnRleHREcm9wLm5ldywgJ3MnID0+IHByb2N7IHxjfCBjWydjb250ZXh0LnNjb3BlcyddIH0sICdkdW1teScgPT4gWzFdKQorICBlbmQKKworICBkZWYgdGVzdF9zY29wZV93aXRoX2Fzc2lnbnMKKyAgICBhc3NlcnRfZXF1YWwgJ3ZhcmlhYmxlJywgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgneyUgYXNzaWduIGEgPSAidmFyaWFibGUiJX17e2F9fScpLnJlbmRlciEoJ2NvbnRleHQnID0+IENvbnRleHREcm9wLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgJ3ZhcmlhYmxlJywgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgneyUgYXNzaWduIGEgPSAidmFyaWFibGUiJX17JWZvciBpIGluIGR1bW15JX17e2F9fXslZW5kZm9yJX0nKS5yZW5kZXIhKCdjb250ZXh0JyA9PiBDb250ZXh0RHJvcC5uZXcsICdkdW1teScgPT4gWzFdKQorICAgIGFzc2VydF9lcXVhbCAndGVzdCcsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3slIGFzc2lnbiBoZWFkZXJfZ2lmID0gInRlc3QiJX17e2hlYWRlcl9naWZ9fScpLnJlbmRlciEoJ2NvbnRleHQnID0+IENvbnRleHREcm9wLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgJ3Rlc3QnLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7JSBhc3NpZ24gaGVhZGVyX2dpZiA9ICd0ZXN0JyV9e3toZWFkZXJfZ2lmfX0iKS5yZW5kZXIhKCdjb250ZXh0JyA9PiBDb250ZXh0RHJvcC5uZXcpCisgIGVuZAorCisgIGRlZiB0ZXN0X3Njb3BlX2Zyb21fdGFncworICAgIGFzc2VydF9lcXVhbCAnMScsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3slIGZvciBpIGluIGNvbnRleHQuc2NvcGVzX2FzX2FycmF5ICV9e3tpfX17JSBlbmRmb3IgJX0nKS5yZW5kZXIhKCdjb250ZXh0JyA9PiBDb250ZXh0RHJvcC5uZXcsICdkdW1teScgPT4gWzFdKQorICAgIGFzc2VydF9lcXVhbCAnMTInLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7JWZvciBhIGluIGR1bW15JX17JSBmb3IgaSBpbiBjb250ZXh0LnNjb3Blc19hc19hcnJheSAlfXt7aX19eyUgZW5kZm9yICV9eyUgZW5kZm9yICV9JykucmVuZGVyISgnY29udGV4dCcgPT4gQ29udGV4dERyb3AubmV3LCAnZHVtbXknID0+IFsxXSkKKyAgICBhc3NlcnRfZXF1YWwgJzEyMycsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3slZm9yIGEgaW4gZHVtbXklfXslZm9yIGEgaW4gZHVtbXklfXslIGZvciBpIGluIGNvbnRleHQuc2NvcGVzX2FzX2FycmF5ICV9e3tpfX17JSBlbmRmb3IgJX17JSBlbmRmb3IgJX17JSBlbmRmb3IgJX0nKS5yZW5kZXIhKCdjb250ZXh0JyA9PiBDb250ZXh0RHJvcC5uZXcsICdkdW1teScgPT4gWzFdKQorICBlbmQKKworICBkZWYgdGVzdF9hY2Nlc3NfY29udGV4dF9mcm9tX2Ryb3AKKyAgICBhc3NlcnRfZXF1YWwgJzEyMycsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3slZm9yIGEgaW4gZHVtbXklfXt7IGNvbnRleHQubG9vcF9wb3MgfX17JSBlbmRmb3IgJX0nKS5yZW5kZXIhKCdjb250ZXh0JyA9PiBDb250ZXh0RHJvcC5uZXcsICdkdW1teScgPT4gWzEsIDIsIDNdKQorICBlbmQKKworICBkZWYgdGVzdF9lbnVtZXJhYmxlX2Ryb3AKKyAgICBhc3NlcnRfZXF1YWwgJzEyMycsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3slIGZvciBjIGluIGNvbGxlY3Rpb24gJX17e2N9fXslIGVuZGZvciAlfScpLnJlbmRlciEoJ2NvbGxlY3Rpb24nID0+IEVudW1lcmFibGVEcm9wLm5ldykKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW51bWVyYWJsZV9kcm9wX3NpemUKKyAgICBhc3NlcnRfZXF1YWwgJzMnLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7e2NvbGxlY3Rpb24uc2l6ZX19JykucmVuZGVyISgnY29sbGVjdGlvbicgPT4gRW51bWVyYWJsZURyb3AubmV3KQorICBlbmQKKworICBkZWYgdGVzdF9lbnVtZXJhYmxlX2Ryb3Bfd2lsbF9pbnZva2VfbGlxdWlkX21ldGhvZF9taXNzaW5nX2Zvcl9jbGFzaGluZ19tZXRob2RfbmFtZXMKKyAgICBbInNlbGVjdCIsICJlYWNoIiwgIm1hcCIsICJjeWNsZSJdLmVhY2ggZG8gfG1ldGhvZHwKKyAgICAgIGFzc2VydF9lcXVhbCBtZXRob2QudG9fcywgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgie3tjb2xsZWN0aW9uLiN7bWV0aG9kfX19IikucmVuZGVyISgnY29sbGVjdGlvbicgPT4gRW51bWVyYWJsZURyb3AubmV3KQorICAgICAgYXNzZXJ0X2VxdWFsIG1ldGhvZC50b19zLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7e2NvbGxlY3Rpb25bXCIje21ldGhvZH1cIl19fSIpLnJlbmRlciEoJ2NvbGxlY3Rpb24nID0+IEVudW1lcmFibGVEcm9wLm5ldykKKyAgICAgIGFzc2VydF9lcXVhbCBtZXRob2QudG9fcywgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgie3tjb2xsZWN0aW9uLiN7bWV0aG9kfX19IikucmVuZGVyISgnY29sbGVjdGlvbicgPT4gUmVhbEVudW1lcmFibGVEcm9wLm5ldykKKyAgICAgIGFzc2VydF9lcXVhbCBtZXRob2QudG9fcywgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgie3tjb2xsZWN0aW9uW1wiI3ttZXRob2R9XCJdfX0iKS5yZW5kZXIhKCdjb2xsZWN0aW9uJyA9PiBSZWFsRW51bWVyYWJsZURyb3AubmV3KQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9zb21lX2VudW1lcmFibGVfbWV0aG9kc19zdGlsbF9nZXRfaW52b2tlZAorICAgIFsgOmNvdW50LCA6bWF4IF0uZWFjaCBkbyB8bWV0aG9kfAorICAgICAgYXNzZXJ0X2VxdWFsICIzIiwgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgie3tjb2xsZWN0aW9uLiN7bWV0aG9kfX19IikucmVuZGVyISgnY29sbGVjdGlvbicgPT4gUmVhbEVudW1lcmFibGVEcm9wLm5ldykKKyAgICAgIGFzc2VydF9lcXVhbCAiMyIsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoInt7Y29sbGVjdGlvbltcIiN7bWV0aG9kfVwiXX19IikucmVuZGVyISgnY29sbGVjdGlvbicgPT4gUmVhbEVudW1lcmFibGVEcm9wLm5ldykKKyAgICAgIGFzc2VydF9lcXVhbCAiMyIsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoInt7Y29sbGVjdGlvbi4je21ldGhvZH19fSIpLnJlbmRlciEoJ2NvbGxlY3Rpb24nID0+IEVudW1lcmFibGVEcm9wLm5ldykKKyAgICAgIGFzc2VydF9lcXVhbCAiMyIsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoInt7Y29sbGVjdGlvbltcIiN7bWV0aG9kfVwiXX19IikucmVuZGVyISgnY29sbGVjdGlvbicgPT4gRW51bWVyYWJsZURyb3AubmV3KQorICAgIGVuZAorCisgICAgYXNzZXJ0X2VxdWFsICJ5ZXMiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7JSBpZiBjb2xsZWN0aW9uIGNvbnRhaW5zIDMgJX15ZXN7JSBlbmRpZiAlfSIpLnJlbmRlciEoJ2NvbGxlY3Rpb24nID0+IFJlYWxFbnVtZXJhYmxlRHJvcC5uZXcpCisKKyAgICBbIDptaW4sIDpmaXJzdCBdLmVhY2ggZG8gfG1ldGhvZHwKKyAgICAgIGFzc2VydF9lcXVhbCAiMSIsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoInt7Y29sbGVjdGlvbi4je21ldGhvZH19fSIpLnJlbmRlciEoJ2NvbGxlY3Rpb24nID0+IFJlYWxFbnVtZXJhYmxlRHJvcC5uZXcpCisgICAgICBhc3NlcnRfZXF1YWwgIjEiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7e2NvbGxlY3Rpb25bXCIje21ldGhvZH1cIl19fSIpLnJlbmRlciEoJ2NvbGxlY3Rpb24nID0+IFJlYWxFbnVtZXJhYmxlRHJvcC5uZXcpCisgICAgICBhc3NlcnRfZXF1YWwgIjEiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7e2NvbGxlY3Rpb24uI3ttZXRob2R9fX0iKS5yZW5kZXIhKCdjb2xsZWN0aW9uJyA9PiBFbnVtZXJhYmxlRHJvcC5uZXcpCisgICAgICBhc3NlcnRfZXF1YWwgIjEiLCBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJ7e2NvbGxlY3Rpb25bXCIje21ldGhvZH1cIl19fSIpLnJlbmRlciEoJ2NvbGxlY3Rpb24nID0+IEVudW1lcmFibGVEcm9wLm5ldykKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nX3ZhbHVlX2FjY2VzcworICAgIGFzc2VydF9lcXVhbCAnJywgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgne3sgcHJvZHVjdFt2YWx1ZV0gfX0nKS5yZW5kZXIhKCdwcm9kdWN0JyA9PiBQcm9kdWN0RHJvcC5uZXcsICd2YWx1ZScgPT4gJycpCisgIGVuZAorCisgIGRlZiB0ZXN0X25pbF92YWx1ZV9hY2Nlc3MKKyAgICBhc3NlcnRfZXF1YWwgJycsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3t7IHByb2R1Y3RbdmFsdWVdIH19JykucmVuZGVyISgncHJvZHVjdCcgPT4gUHJvZHVjdERyb3AubmV3LCAndmFsdWUnID0+IG5pbCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVmYXVsdF90b19zX29uX2Ryb3BzCisgICAgYXNzZXJ0X2VxdWFsICdQcm9kdWN0RHJvcCcsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoInt7IHByb2R1Y3QgfX0iKS5yZW5kZXIhKCdwcm9kdWN0JyA9PiBQcm9kdWN0RHJvcC5uZXcpCisgICAgYXNzZXJ0X2VxdWFsICdFbnVtZXJhYmxlRHJvcCcsIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3t7IGNvbGxlY3Rpb24gfX0nKS5yZW5kZXIhKCdjb2xsZWN0aW9uJyA9PiBFbnVtZXJhYmxlRHJvcC5uZXcpCisgIGVuZAorZW5kICMgRHJvcHNUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9lcnJvcl9oYW5kbGluZ190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vZXJyb3JfaGFuZGxpbmdfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgxODYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vZXJyb3JfaGFuZGxpbmdfdGVzdC5yYgpAQCAtMCwwICsxLDI2MCBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIEVycm9ySGFuZGxpbmdUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF90ZW1wbGF0ZXNfcGFyc2VkX3dpdGhfbGluZV9udW1iZXJzX3JlbmRlcnNfdGhlbV9pbl9lcnJvcnMKKyAgICB0ZW1wbGF0ZSA9IDw8LUxJUVVJRAorICAgICAgSGVsbG8sCisKKyAgICAgIHt7IGVycm9ycy5zdGFuZGFyZF9lcnJvciB9fSB3aWxsIHJhaXNlIGEgc3RhbmRhcmQgZXJyb3IuCisKKyAgICAgIEJsYSBibGEgdGVzdC4KKworICAgICAge3sgZXJyb3JzLnN5bnRheF9lcnJvciB9fSB3aWxsIHJhaXNlIGEgc3ludGF4IGVycm9yLgorCisgICAgICBUaGlzIGlzIGFuIGFyZ3VtZW50IGVycm9yOiB7eyBlcnJvcnMuYXJndW1lbnRfZXJyb3IgfX0KKworICAgICAgQmxhLgorICAgIExJUVVJRAorCisgICAgZXhwZWN0ZWQgPSA8PC1URVhUCisgICAgICBIZWxsbywKKworICAgICAgTGlxdWlkIGVycm9yIChsaW5lIDMpOiBzdGFuZGFyZCBlcnJvciB3aWxsIHJhaXNlIGEgc3RhbmRhcmQgZXJyb3IuCisKKyAgICAgIEJsYSBibGEgdGVzdC4KKworICAgICAgTGlxdWlkIHN5bnRheCBlcnJvciAobGluZSA3KTogc3ludGF4IGVycm9yIHdpbGwgcmFpc2UgYSBzeW50YXggZXJyb3IuCisKKyAgICAgIFRoaXMgaXMgYW4gYXJndW1lbnQgZXJyb3I6IExpcXVpZCBlcnJvciAobGluZSA5KTogYXJndW1lbnQgZXJyb3IKKworICAgICAgQmxhLgorICAgIFRFWFQKKworICAgIG91dHB1dCA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UodGVtcGxhdGUsIGxpbmVfbnVtYmVyczogdHJ1ZSkucmVuZGVyKCdlcnJvcnMnID0+IEVycm9yRHJvcC5uZXcpCisgICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBvdXRwdXQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RhbmRhcmRfZXJyb3IKKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJyB7eyBlcnJvcnMuc3RhbmRhcmRfZXJyb3IgfX0gJykKKyAgICBhc3NlcnRfZXF1YWwgJyBMaXF1aWQgZXJyb3I6IHN0YW5kYXJkIGVycm9yICcsIHRlbXBsYXRlLnJlbmRlcignZXJyb3JzJyA9PiBFcnJvckRyb3AubmV3KQorCisgICAgYXNzZXJ0X2VxdWFsIDEsIHRlbXBsYXRlLmVycm9ycy5zaXplCisgICAgYXNzZXJ0X2VxdWFsIFN0YW5kYXJkRXJyb3IsIHRlbXBsYXRlLmVycm9ycy5maXJzdC5jbGFzcworICBlbmQKKworICBkZWYgdGVzdF9zeW50YXgKKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJyB7eyBlcnJvcnMuc3ludGF4X2Vycm9yIH19ICcpCisgICAgYXNzZXJ0X2VxdWFsICcgTGlxdWlkIHN5bnRheCBlcnJvcjogc3ludGF4IGVycm9yICcsIHRlbXBsYXRlLnJlbmRlcignZXJyb3JzJyA9PiBFcnJvckRyb3AubmV3KQorCisgICAgYXNzZXJ0X2VxdWFsIDEsIHRlbXBsYXRlLmVycm9ycy5zaXplCisgICAgYXNzZXJ0X2VxdWFsIFN5bnRheEVycm9yLCB0ZW1wbGF0ZS5lcnJvcnMuZmlyc3QuY2xhc3MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXJndW1lbnQKKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJyB7eyBlcnJvcnMuYXJndW1lbnRfZXJyb3IgfX0gJykKKyAgICBhc3NlcnRfZXF1YWwgJyBMaXF1aWQgZXJyb3I6IGFyZ3VtZW50IGVycm9yICcsIHRlbXBsYXRlLnJlbmRlcignZXJyb3JzJyA9PiBFcnJvckRyb3AubmV3KQorCisgICAgYXNzZXJ0X2VxdWFsIDEsIHRlbXBsYXRlLmVycm9ycy5zaXplCisgICAgYXNzZXJ0X2VxdWFsIEFyZ3VtZW50RXJyb3IsIHRlbXBsYXRlLmVycm9ycy5maXJzdC5jbGFzcworICBlbmQKKworICBkZWYgdGVzdF9taXNzaW5nX2VuZHRhZ19wYXJzZV90aW1lX2Vycm9yCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6OlN5bnRheEVycm9yKSBkbworICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgnIHslIGZvciBhIGluIGIgJX0gLi4uICcpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3VucmVjb2duaXplZF9vcGVyYXRvcgorICAgIHdpdGhfZXJyb3JfbW9kZSg6c3RyaWN0KSBkbworICAgICAgYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcikgZG8KKyAgICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgnIHslIGlmIDEgPSEgMiAlfW9reyUgZW5kaWYgJX0gJykKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9sYXhfdW5yZWNvZ25pemVkX29wZXJhdG9yCisgICAgdGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCcgeyUgaWYgMSA9ISAyICV9b2t7JSBlbmRpZiAlfSAnLCBlcnJvcl9tb2RlOiA6bGF4KQorICAgIGFzc2VydF9lcXVhbCAnIExpcXVpZCBlcnJvcjogVW5rbm93biBvcGVyYXRvciA9ISAnLCB0ZW1wbGF0ZS5yZW5kZXIKKyAgICBhc3NlcnRfZXF1YWwgMSwgdGVtcGxhdGUuZXJyb3JzLnNpemUKKyAgICBhc3NlcnRfZXF1YWwgTGlxdWlkOjpBcmd1bWVudEVycm9yLCB0ZW1wbGF0ZS5lcnJvcnMuZmlyc3QuY2xhc3MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfd2l0aF9saW5lX251bWJlcnNfYWRkc19udW1iZXJzX3RvX3BhcnNlcl9lcnJvcnMKKyAgICBlcnIgPSBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSglcSgKKyAgICAgICAgICBmb29iYXIKKworICAgICAgICAgIHslICJjYXQiIHwgZm9vYmFyICV9CisKKyAgICAgICAgICBibGEKKyAgICAgICAgKSwKKyAgICAgICAgbGluZV9udW1iZXJzOiB0cnVlCisgICAgICApCisgICAgZW5kCisKKyAgICBhc3NlcnRfbWF0Y2goL0xpcXVpZCBzeW50YXggZXJyb3IgXChsaW5lIDRcKS8sIGVyci5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF93aXRoX2xpbmVfbnVtYmVyc19hZGRzX251bWJlcnNfdG9fcGFyc2VyX2Vycm9yc193aXRoX3doaXRlc3BhY2VfdHJpbQorICAgIGVyciA9IGFzc2VydF9yYWlzZXMoU3ludGF4RXJyb3IpIGRvCisgICAgICBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCVxKAorICAgICAgICAgIGZvb2JhcgorCisgICAgICAgICAgeyUtICJjYXQiIHwgZm9vYmFyIC0lfQorCisgICAgICAgICAgYmxhCisgICAgICAgICksCisgICAgICAgIGxpbmVfbnVtYmVyczogdHJ1ZQorICAgICAgKQorICAgIGVuZAorCisgICAgYXNzZXJ0X21hdGNoKC9MaXF1aWQgc3ludGF4IGVycm9yIFwobGluZSA0XCkvLCBlcnIubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFyc2luZ193YXJuX3dpdGhfbGluZV9udW1iZXJzX2FkZHNfbnVtYmVyc190b19sZXhlcl9lcnJvcnMKKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJworICAgICAgICBmb29iYXIKKworICAgICAgICB7JSBpZiAxID0hIDIgJX1va3slIGVuZGlmICV9CisKKyAgICAgICAgYmxhCisgICAgICAgICAgICAnLAorICAgICAgZXJyb3JfbW9kZTogOndhcm4sCisgICAgICBsaW5lX251bWJlcnM6IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBhc3NlcnRfZXF1YWwgWydMaXF1aWQgc3ludGF4IGVycm9yIChsaW5lIDQpOiBVbmV4cGVjdGVkIGNoYXJhY3RlciA9IGluICIxID0hIDIiJ10sCisgICAgICB0ZW1wbGF0ZS53YXJuaW5ncy5tYXAoJjptZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF9wYXJzaW5nX3N0cmljdF93aXRoX2xpbmVfbnVtYmVyc19hZGRzX251bWJlcnNfdG9fbGV4ZXJfZXJyb3JzCisgICAgZXJyID0gYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcikgZG8KKyAgICAgIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJworICAgICAgICAgIGZvb2JhcgorCisgICAgICAgICAgeyUgaWYgMSA9ISAyICV9b2t7JSBlbmRpZiAlfQorCisgICAgICAgICAgYmxhCisgICAgICAgICAgICAgICAgJywKKyAgICAgICAgZXJyb3JfbW9kZTogOnN0cmljdCwKKyAgICAgICAgbGluZV9udW1iZXJzOiB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgIGVuZAorCisgICAgYXNzZXJ0X2VxdWFsICdMaXF1aWQgc3ludGF4IGVycm9yIChsaW5lIDQpOiBVbmV4cGVjdGVkIGNoYXJhY3RlciA9IGluICIxID0hIDIiJywgZXJyLm1lc3NhZ2UKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3ludGF4X2Vycm9yc19pbl9uZXN0ZWRfYmxvY2tzX2hhdmVfY29ycmVjdF9saW5lX251bWJlcgorICAgIGVyciA9IGFzc2VydF9yYWlzZXMoU3ludGF4RXJyb3IpIGRvCisgICAgICBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCcKKyAgICAgICAgICBmb29iYXIKKworICAgICAgICAgIHslIGlmIDEgIT0gMiAlfQorICAgICAgICAgICAgeyUgZm9vICV9CisgICAgICAgICAgeyUgZW5kaWYgJX0KKworICAgICAgICAgIGJsYQorICAgICAgICAgICAgICAgICcsCisgICAgICAgIGxpbmVfbnVtYmVyczogdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICBlbmQKKworICAgIGFzc2VydF9lcXVhbCAiTGlxdWlkIHN5bnRheCBlcnJvciAobGluZSA1KTogVW5rbm93biB0YWcgJ2ZvbyciLCBlcnIubWVzc2FnZQorICBlbmQKKworICBkZWYgdGVzdF9zdHJpY3RfZXJyb3JfbWVzc2FnZXMKKyAgICBlcnIgPSBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgnIHslIGlmIDEgPSEgMiAlfW9reyUgZW5kaWYgJX0gJywgZXJyb3JfbW9kZTogOnN0cmljdCkKKyAgICBlbmQKKyAgICBhc3NlcnRfZXF1YWwgJ0xpcXVpZCBzeW50YXggZXJyb3I6IFVuZXhwZWN0ZWQgY2hhcmFjdGVyID0gaW4gIjEgPSEgMiInLCBlcnIubWVzc2FnZQorCisgICAgZXJyID0gYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcikgZG8KKyAgICAgIExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3t7JSUlfX0nLCBlcnJvcl9tb2RlOiA6c3RyaWN0KQorICAgIGVuZAorICAgIGFzc2VydF9lcXVhbCAnTGlxdWlkIHN5bnRheCBlcnJvcjogVW5leHBlY3RlZCBjaGFyYWN0ZXIgJSBpbiAie3slJSV9fSInLCBlcnIubWVzc2FnZQorICBlbmQKKworICBkZWYgdGVzdF93YXJuaW5ncworICAgIHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgneyUgaWYgfn5+ICV9e3slJSV9fXslIGVsc2UgJX17eyBoZWxsby4gfX17JSBlbmRpZiAlfScsIGVycm9yX21vZGU6IDp3YXJuKQorICAgIGFzc2VydF9lcXVhbCAzLCB0ZW1wbGF0ZS53YXJuaW5ncy5zaXplCisgICAgYXNzZXJ0X2VxdWFsICdVbmV4cGVjdGVkIGNoYXJhY3RlciB+IGluICJ+fn4iJywgdGVtcGxhdGUud2FybmluZ3NbMF0udG9fcyhmYWxzZSkKKyAgICBhc3NlcnRfZXF1YWwgJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyICUgaW4gInt7JSUlfX0iJywgdGVtcGxhdGUud2FybmluZ3NbMV0udG9fcyhmYWxzZSkKKyAgICBhc3NlcnRfZXF1YWwgJ0V4cGVjdGVkIGlkIGJ1dCBmb3VuZCBlbmRfb2Zfc3RyaW5nIGluICJ7eyBoZWxsby4gfX0iJywgdGVtcGxhdGUud2FybmluZ3NbMl0udG9fcyhmYWxzZSkKKyAgICBhc3NlcnRfZXF1YWwgJycsIHRlbXBsYXRlLnJlbmRlcgorICBlbmQKKworICBkZWYgdGVzdF93YXJuaW5nX2xpbmVfbnVtYmVycworICAgIHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgieyUgaWYgfn5+ICV9XG57eyUlJX19eyUgZWxzZSAlfVxue3sgaGVsbG8uIH19eyUgZW5kaWYgJX0iLCBlcnJvcl9tb2RlOiA6d2FybiwgbGluZV9udW1iZXJzOiB0cnVlKQorICAgIGFzc2VydF9lcXVhbCAnTGlxdWlkIHN5bnRheCBlcnJvciAobGluZSAxKTogVW5leHBlY3RlZCBjaGFyYWN0ZXIgfiBpbiAifn5+IicsIHRlbXBsYXRlLndhcm5pbmdzWzBdLm1lc3NhZ2UKKyAgICBhc3NlcnRfZXF1YWwgJ0xpcXVpZCBzeW50YXggZXJyb3IgKGxpbmUgMik6IFVuZXhwZWN0ZWQgY2hhcmFjdGVyICUgaW4gInt7JSUlfX0iJywgdGVtcGxhdGUud2FybmluZ3NbMV0ubWVzc2FnZQorICAgIGFzc2VydF9lcXVhbCAnTGlxdWlkIHN5bnRheCBlcnJvciAobGluZSAzKTogRXhwZWN0ZWQgaWQgYnV0IGZvdW5kIGVuZF9vZl9zdHJpbmcgaW4gInt7IGhlbGxvLiB9fSInLCB0ZW1wbGF0ZS53YXJuaW5nc1syXS5tZXNzYWdlCisgICAgYXNzZXJ0X2VxdWFsIDMsIHRlbXBsYXRlLndhcm5pbmdzLnNpemUKKyAgICBhc3NlcnRfZXF1YWwgWzEsIDIsIDNdLCB0ZW1wbGF0ZS53YXJuaW5ncy5tYXAoJjpsaW5lX251bWJlcikKKyAgZW5kCisKKyAgIyBMaXF1aWQgc2hvdWxkIG5vdCBjYXRjaCBFeGNlcHRpb25zIHRoYXQgYXJlIG5vdCBzdWJjbGFzc2VzIG9mIFN0YW5kYXJkRXJyb3IsIGxpa2UgSW50ZXJydXB0IGFuZCBOb01lbW9yeUVycm9yCisgIGRlZiB0ZXN0X2V4Y2VwdGlvbnNfcHJvcGFnYXRlCisgICAgYXNzZXJ0X3JhaXNlcyBFeGNlcHRpb24gZG8KKyAgICAgIHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgne3sgZXJyb3JzLmV4Y2VwdGlvbiB9fScpCisgICAgICB0ZW1wbGF0ZS5yZW5kZXIoJ2Vycm9ycycgPT4gRXJyb3JEcm9wLm5ldykKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVmYXVsdF9leGNlcHRpb25fcmVuZGVyZXJfd2l0aF9pbnRlcm5hbF9lcnJvcgorICAgIHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgnVGhpcyBpcyBhIHJ1bnRpbWUgZXJyb3I6IHt7IGVycm9ycy5ydW50aW1lX2Vycm9yIH19JywgbGluZV9udW1iZXJzOiB0cnVlKQorCisgICAgb3V0cHV0ID0gdGVtcGxhdGUucmVuZGVyKHsgJ2Vycm9ycycgPT4gRXJyb3JEcm9wLm5ldyB9KQorCisgICAgYXNzZXJ0X2VxdWFsICdUaGlzIGlzIGEgcnVudGltZSBlcnJvcjogTGlxdWlkIGVycm9yIChsaW5lIDEpOiBpbnRlcm5hbCcsIG91dHB1dAorICAgIGFzc2VydF9lcXVhbCBbTGlxdWlkOjpJbnRlcm5hbEVycm9yXSwgdGVtcGxhdGUuZXJyb3JzLm1hcCgmOmNsYXNzKQorICBlbmQKKworICBkZWYgdGVzdF9zZXR0aW5nX2RlZmF1bHRfZXhjZXB0aW9uX3JlbmRlcmVyCisgICAgb2xkX2V4Y2VwdGlvbl9yZW5kZXJlciA9IExpcXVpZDo6VGVtcGxhdGUuZGVmYXVsdF9leGNlcHRpb25fcmVuZGVyZXIKKyAgICBleGNlcHRpb25zID0gW10KKyAgICBMaXF1aWQ6OlRlbXBsYXRlLmRlZmF1bHRfZXhjZXB0aW9uX3JlbmRlcmVyID0gLT4oZSkgeyBleGNlcHRpb25zIDw8IGU7ICcnIH0KKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ1RoaXMgaXMgYSBydW50aW1lIGVycm9yOiB7eyBlcnJvcnMuYXJndW1lbnRfZXJyb3IgfX0nKQorCisgICAgb3V0cHV0ID0gdGVtcGxhdGUucmVuZGVyKHsgJ2Vycm9ycycgPT4gRXJyb3JEcm9wLm5ldyB9KQorCisgICAgYXNzZXJ0X2VxdWFsICdUaGlzIGlzIGEgcnVudGltZSBlcnJvcjogJywgb3V0cHV0CisgICAgYXNzZXJ0X2VxdWFsIFtMaXF1aWQ6OkFyZ3VtZW50RXJyb3JdLCB0ZW1wbGF0ZS5lcnJvcnMubWFwKCY6Y2xhc3MpCisgIGVuc3VyZQorICAgIExpcXVpZDo6VGVtcGxhdGUuZGVmYXVsdF9leGNlcHRpb25fcmVuZGVyZXIgPSBvbGRfZXhjZXB0aW9uX3JlbmRlcmVyIGlmIG9sZF9leGNlcHRpb25fcmVuZGVyZXIKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXhjZXB0aW9uX3JlbmRlcmVyX2V4cG9zaW5nX25vbl9saXF1aWRfZXJyb3IKKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ1RoaXMgaXMgYSBydW50aW1lIGVycm9yOiB7eyBlcnJvcnMucnVudGltZV9lcnJvciB9fScsIGxpbmVfbnVtYmVyczogdHJ1ZSkKKyAgICBleGNlcHRpb25zID0gW10KKyAgICBoYW5kbGVyID0gLT4oZSkgeyBleGNlcHRpb25zIDw8IGU7IGUuY2F1c2UgfQorCisgICAgb3V0cHV0ID0gdGVtcGxhdGUucmVuZGVyKHsgJ2Vycm9ycycgPT4gRXJyb3JEcm9wLm5ldyB9LCBleGNlcHRpb25fcmVuZGVyZXI6IGhhbmRsZXIpCisKKyAgICBhc3NlcnRfZXF1YWwgJ1RoaXMgaXMgYSBydW50aW1lIGVycm9yOiBydW50aW1lIGVycm9yJywgb3V0cHV0CisgICAgYXNzZXJ0X2VxdWFsIFtMaXF1aWQ6OkludGVybmFsRXJyb3JdLCBleGNlcHRpb25zLm1hcCgmOmNsYXNzKQorICAgIGFzc2VydF9lcXVhbCBleGNlcHRpb25zLCB0ZW1wbGF0ZS5lcnJvcnMKKyAgICBhc3NlcnRfZXF1YWwgJyM8UnVudGltZUVycm9yOiBydW50aW1lIGVycm9yPicsIGV4Y2VwdGlvbnMuZmlyc3QuY2F1c2UuaW5zcGVjdAorICBlbmQKKworICBjbGFzcyBUZXN0RmlsZVN5c3RlbQorICAgIGRlZiByZWFkX3RlbXBsYXRlX2ZpbGUodGVtcGxhdGVfcGF0aCkKKyAgICAgICJ7eyBlcnJvcnMuYXJndW1lbnRfZXJyb3IgfX0iCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2luY2x1ZGVkX3RlbXBsYXRlX25hbWVfd2l0aF9saW5lX251bWJlcnMKKyAgICBvbGRfZmlsZV9zeXN0ZW0gPSBMaXF1aWQ6OlRlbXBsYXRlLmZpbGVfc3lzdGVtCisKKyAgICBiZWdpbgorICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5maWxlX3N5c3RlbSA9IFRlc3RGaWxlU3lzdGVtLm5ldworICAgICAgdGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCJBcmd1bWVudCBlcnJvcjpcbnslIGluY2x1ZGUgJ3Byb2R1Y3QnICV9IiwgbGluZV9udW1iZXJzOiB0cnVlKQorICAgICAgcGFnZSA9IHRlbXBsYXRlLnJlbmRlcignZXJyb3JzJyA9PiBFcnJvckRyb3AubmV3KQorICAgIGVuc3VyZQorICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5maWxlX3N5c3RlbSA9IG9sZF9maWxlX3N5c3RlbQorICAgIGVuZAorICAgIGFzc2VydF9lcXVhbCAiQXJndW1lbnQgZXJyb3I6XG5MaXF1aWQgZXJyb3IgKHByb2R1Y3QgbGluZSAxKTogYXJndW1lbnQgZXJyb3IiLCBwYWdlCisgICAgYXNzZXJ0X2VxdWFsICJwcm9kdWN0IiwgdGVtcGxhdGUuZXJyb3JzLmZpcnN0LnRlbXBsYXRlX25hbWUKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL2ZpbHRlcl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vZmlsdGVyX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjODgwZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL2ZpbHRlcl90ZXN0LnJiCkBAIC0wLDAgKzEsMTc4IEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworbW9kdWxlIE1vbmV5RmlsdGVyCisgIGRlZiBtb25leShpbnB1dCkKKyAgICBzcHJpbnRmKCcgJWQkICcsIGlucHV0KQorICBlbmQKKworICBkZWYgbW9uZXlfd2l0aF91bmRlcnNjb3JlKGlucHV0KQorICAgIHNwcmludGYoJyAlZCQgJywgaW5wdXQpCisgIGVuZAorZW5kCisKK21vZHVsZSBDYW5hZGlhbk1vbmV5RmlsdGVyCisgIGRlZiBtb25leShpbnB1dCkKKyAgICBzcHJpbnRmKCcgJWQkIENBRCAnLCBpbnB1dCkKKyAgZW5kCitlbmQKKworbW9kdWxlIFN1YnN0aXR1dGVGaWx0ZXIKKyAgZGVmIHN1YnN0aXR1dGUoaW5wdXQsIHBhcmFtcyA9IHt9KQorICAgIGlucHV0LmdzdWIoLyVceyhcdyspXH0vKSB7IHxtYXRjaHwgcGFyYW1zWyQxXSB9CisgIGVuZAorZW5kCisKK2NsYXNzIEZpbHRlcnNUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBtb2R1bGUgT3ZlcnJpZGVPYmplY3RNZXRob2RGaWx0ZXIKKyAgICBkZWYgdGFwKGlucHV0KQorICAgICAgInRhcCBvdmVycmlkZGVuIgorICAgIGVuZAorICBlbmQKKworICBkZWYgc2V0dXAKKyAgICBAY29udGV4dCA9IENvbnRleHQubmV3CisgIGVuZAorCisgIGRlZiB0ZXN0X2xvY2FsX2ZpbHRlcgorICAgIEBjb250ZXh0Wyd2YXInXSA9IDEwMDAKKyAgICBAY29udGV4dC5hZGRfZmlsdGVycyhNb25leUZpbHRlcikKKworICAgIGFzc2VydF9lcXVhbCAnIDEwMDAkICcsIFRlbXBsYXRlLnBhcnNlKCJ7e3ZhciB8IG1vbmV5fX0iKS5yZW5kZXIoQGNvbnRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuZGVyc2NvcmVfaW5fZmlsdGVyX25hbWUKKyAgICBAY29udGV4dFsndmFyJ10gPSAxMDAwCisgICAgQGNvbnRleHQuYWRkX2ZpbHRlcnMoTW9uZXlGaWx0ZXIpCisgICAgYXNzZXJ0X2VxdWFsICcgMTAwMCQgJywgVGVtcGxhdGUucGFyc2UoInt7dmFyIHwgbW9uZXlfd2l0aF91bmRlcnNjb3JlfX0iKS5yZW5kZXIoQGNvbnRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlY29uZF9maWx0ZXJfb3ZlcndyaXRlc19maXJzdAorICAgIEBjb250ZXh0Wyd2YXInXSA9IDEwMDAKKyAgICBAY29udGV4dC5hZGRfZmlsdGVycyhNb25leUZpbHRlcikKKyAgICBAY29udGV4dC5hZGRfZmlsdGVycyhDYW5hZGlhbk1vbmV5RmlsdGVyKQorCisgICAgYXNzZXJ0X2VxdWFsICcgMTAwMCQgQ0FEICcsIFRlbXBsYXRlLnBhcnNlKCJ7e3ZhciB8IG1vbmV5fX0iKS5yZW5kZXIoQGNvbnRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpemUKKyAgICBAY29udGV4dFsndmFyJ10gPSAnYWJjZCcKKyAgICBAY29udGV4dC5hZGRfZmlsdGVycyhNb25leUZpbHRlcikKKworICAgIGFzc2VydF9lcXVhbCAnNCcsIFRlbXBsYXRlLnBhcnNlKCJ7e3ZhciB8IHNpemV9fSIpLnJlbmRlcihAY29udGV4dCkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfam9pbgorICAgIEBjb250ZXh0Wyd2YXInXSA9IFsxLCAyLCAzLCA0XQorCisgICAgYXNzZXJ0X2VxdWFsICIxIDIgMyA0IiwgVGVtcGxhdGUucGFyc2UoInt7dmFyIHwgam9pbn19IikucmVuZGVyKEBjb250ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9zb3J0CisgICAgQGNvbnRleHRbJ3ZhbHVlJ10gPSAzCisgICAgQGNvbnRleHRbJ251bWJlcnMnXSA9IFsyLCAxLCA0LCAzXQorICAgIEBjb250ZXh0Wyd3b3JkcyddID0gWydleHBlY3RlZCcsICdhcycsICdhbHBoYWJldGljJ10KKyAgICBAY29udGV4dFsnYXJyYXlzJ10gPSBbJ2Zsb3dlcicsICdhcmUnXQorICAgIEBjb250ZXh0WydjYXNlX3NlbnNpdGl2ZSddID0gWydzZW5zaXRpdmUnLCAnRXhwZWN0ZWQnLCAnY2FzZSddCisKKyAgICBhc3NlcnRfZXF1YWwgJzEgMiAzIDQnLCBUZW1wbGF0ZS5wYXJzZSgie3tudW1iZXJzIHwgc29ydCB8IGpvaW59fSIpLnJlbmRlcihAY29udGV4dCkKKyAgICBhc3NlcnRfZXF1YWwgJ2FscGhhYmV0aWMgYXMgZXhwZWN0ZWQnLCBUZW1wbGF0ZS5wYXJzZSgie3t3b3JkcyB8IHNvcnQgfCBqb2lufX0iKS5yZW5kZXIoQGNvbnRleHQpCisgICAgYXNzZXJ0X2VxdWFsICczJywgVGVtcGxhdGUucGFyc2UoInt7dmFsdWUgfCBzb3J0fX0iKS5yZW5kZXIoQGNvbnRleHQpCisgICAgYXNzZXJ0X2VxdWFsICdhcmUgZmxvd2VyJywgVGVtcGxhdGUucGFyc2UoInt7YXJyYXlzIHwgc29ydCB8IGpvaW59fSIpLnJlbmRlcihAY29udGV4dCkKKyAgICBhc3NlcnRfZXF1YWwgJ0V4cGVjdGVkIGNhc2Ugc2Vuc2l0aXZlJywgVGVtcGxhdGUucGFyc2UoInt7Y2FzZV9zZW5zaXRpdmUgfCBzb3J0IHwgam9pbn19IikucmVuZGVyKEBjb250ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9zb3J0X25hdHVyYWwKKyAgICBAY29udGV4dFsnd29yZHMnXSA9IFsnY2FzZScsICdBc3NlcnQnLCAnSW5zZW5zaXRpdmUnXQorICAgIEBjb250ZXh0WydoYXNoZXMnXSA9IFt7ICdhJyA9PiAnQScgfSwgeyAnYScgPT4gJ2InIH0sIHsgJ2EnID0+ICdDJyB9XQorICAgIEBjb250ZXh0WydvYmplY3RzJ10gPSBbVGVzdE9iamVjdC5uZXcoJ0EnKSwgVGVzdE9iamVjdC5uZXcoJ2InKSwgVGVzdE9iamVjdC5uZXcoJ0MnKV0KKworICAgICMgVGVzdCBzdHJpbmdzCisgICAgYXNzZXJ0X2VxdWFsICdBc3NlcnQgY2FzZSBJbnNlbnNpdGl2ZScsIFRlbXBsYXRlLnBhcnNlKCJ7e3dvcmRzIHwgc29ydF9uYXR1cmFsIHwgam9pbn19IikucmVuZGVyKEBjb250ZXh0KQorCisgICAgIyBUZXN0IGhhc2hlcworICAgIGFzc2VydF9lcXVhbCAnQSBiIEMnLCBUZW1wbGF0ZS5wYXJzZSgie3toYXNoZXMgfCBzb3J0X25hdHVyYWw6ICdhJyB8IG1hcDogJ2EnIHwgam9pbn19IikucmVuZGVyKEBjb250ZXh0KQorCisgICAgIyBUZXN0IG9iamVjdHMKKyAgICBhc3NlcnRfZXF1YWwgJ0EgYiBDJywgVGVtcGxhdGUucGFyc2UoInt7b2JqZWN0cyB8IHNvcnRfbmF0dXJhbDogJ2EnIHwgbWFwOiAnYScgfCBqb2lufX0iKS5yZW5kZXIoQGNvbnRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBhY3QKKyAgICBAY29udGV4dFsnd29yZHMnXSA9IFsnYScsIG5pbCwgJ2InLCBuaWwsICdjJ10KKyAgICBAY29udGV4dFsnaGFzaGVzJ10gPSBbeyAnYScgPT4gJ0EnIH0sIHsgJ2EnID0+IG5pbCB9LCB7ICdhJyA9PiAnQycgfV0KKyAgICBAY29udGV4dFsnb2JqZWN0cyddID0gW1Rlc3RPYmplY3QubmV3KCdBJyksIFRlc3RPYmplY3QubmV3KG5pbCksIFRlc3RPYmplY3QubmV3KCdDJyldCisKKyAgICAjIFRlc3Qgc3RyaW5ncworICAgIGFzc2VydF9lcXVhbCAnYSBiIGMnLCBUZW1wbGF0ZS5wYXJzZSgie3t3b3JkcyB8IGNvbXBhY3QgfCBqb2lufX0iKS5yZW5kZXIoQGNvbnRleHQpCisKKyAgICAjIFRlc3QgaGFzaGVzCisgICAgYXNzZXJ0X2VxdWFsICdBIEMnLCBUZW1wbGF0ZS5wYXJzZSgie3toYXNoZXMgfCBjb21wYWN0OiAnYScgfCBtYXA6ICdhJyB8IGpvaW59fSIpLnJlbmRlcihAY29udGV4dCkKKworICAgICMgVGVzdCBvYmplY3RzCisgICAgYXNzZXJ0X2VxdWFsICdBIEMnLCBUZW1wbGF0ZS5wYXJzZSgie3tvYmplY3RzIHwgY29tcGFjdDogJ2EnIHwgbWFwOiAnYScgfCBqb2lufX0iKS5yZW5kZXIoQGNvbnRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmlwX2h0bWwKKyAgICBAY29udGV4dFsndmFyJ10gPSAiPGI+YmxhIGJsdWI8L2E+IgorCisgICAgYXNzZXJ0X2VxdWFsICJibGEgYmx1YiIsIFRlbXBsYXRlLnBhcnNlKCJ7eyB2YXIgfCBzdHJpcF9odG1sIH19IikucmVuZGVyKEBjb250ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9zdHJpcF9odG1sX2lnbm9yZV9jb21tZW50c193aXRoX2h0bWwKKyAgICBAY29udGV4dFsndmFyJ10gPSAiPCEtLSBzcGxpdCBhbmQgc29tZSA8dWw+IHRhZyAtLT48Yj5ibGEgYmx1YjwvYT4iCisKKyAgICBhc3NlcnRfZXF1YWwgImJsYSBibHViIiwgVGVtcGxhdGUucGFyc2UoInt7IHZhciB8IHN0cmlwX2h0bWwgfX0iKS5yZW5kZXIoQGNvbnRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NhcGl0YWxpemUKKyAgICBAY29udGV4dFsndmFyJ10gPSAiYmx1YiIKKworICAgIGFzc2VydF9lcXVhbCAiQmx1YiIsIFRlbXBsYXRlLnBhcnNlKCJ7eyB2YXIgfCBjYXBpdGFsaXplIH19IikucmVuZGVyKEBjb250ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9ub25leGlzdGVudF9maWx0ZXJfaXNfaWdub3JlZAorICAgIEBjb250ZXh0Wyd2YXInXSA9IDEwMDAKKworICAgIGFzc2VydF9lcXVhbCAnMTAwMCcsIFRlbXBsYXRlLnBhcnNlKCJ7eyB2YXIgfCB4eXp6eSB9fSIpLnJlbmRlcihAY29udGV4dCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmlsdGVyX3dpdGhfa2V5d29yZF9hcmd1bWVudHMKKyAgICBAY29udGV4dFsnc3VybmFtZSddID0gJ2pvaG4nCisgICAgQGNvbnRleHRbJ2lucHV0J10gPSAnaGVsbG8gJXtmaXJzdF9uYW1lfSwgJXtsYXN0X25hbWV9JworICAgIEBjb250ZXh0LmFkZF9maWx0ZXJzKFN1YnN0aXR1dGVGaWx0ZXIpCisgICAgb3V0cHV0ID0gVGVtcGxhdGUucGFyc2UoJSh7eyBpbnB1dCB8IHN1YnN0aXR1dGU6IGZpcnN0X25hbWU6IHN1cm5hbWUsIGxhc3RfbmFtZTogJ2RvZScgfX0pKS5yZW5kZXIoQGNvbnRleHQpCisgICAgYXNzZXJ0X2VxdWFsICdoZWxsbyBqb2huLCBkb2UnLCBvdXRwdXQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfb3ZlcnJpZGVfb2JqZWN0X21ldGhvZF9pbl9maWx0ZXIKKyAgICBhc3NlcnRfZXF1YWwgInRhcCBvdmVycmlkZGVuIiwgVGVtcGxhdGUucGFyc2UoInt7dmFyIHwgdGFwfX0iKS5yZW5kZXIhKHsgJ3ZhcicgPT4gMTAwMCB9LCBmaWx0ZXJzOiBbT3ZlcnJpZGVPYmplY3RNZXRob2RGaWx0ZXJdKQorCisgICAgIyB0YXAgc3RpbGwgdHJlYXRlZCBhcyBhIG5vbi1leGlzdGVudCBmaWx0ZXIKKyAgICBhc3NlcnRfZXF1YWwgIjEwMDAiLCBUZW1wbGF0ZS5wYXJzZSgie3t2YXIgfCB0YXB9fSIpLnJlbmRlciEoeyAndmFyJyA9PiAxMDAwIH0pCisgIGVuZAorZW5kCisKK2NsYXNzIEZpbHRlcnNJblRlbXBsYXRlIDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9sb2NhbF9nbG9iYWwKKyAgICB3aXRoX2dsb2JhbF9maWx0ZXIoTW9uZXlGaWx0ZXIpIGRvCisgICAgICBhc3NlcnRfZXF1YWwgIiAxMDAwJCAiLCBUZW1wbGF0ZS5wYXJzZSgie3sxMDAwIHwgbW9uZXl9fSIpLnJlbmRlciEobmlsLCBuaWwpCisgICAgICBhc3NlcnRfZXF1YWwgIiAxMDAwJCBDQUQgIiwgVGVtcGxhdGUucGFyc2UoInt7MTAwMCB8IG1vbmV5fX0iKS5yZW5kZXIhKG5pbCwgZmlsdGVyczogQ2FuYWRpYW5Nb25leUZpbHRlcikKKyAgICAgIGFzc2VydF9lcXVhbCAiIDEwMDAkIENBRCAiLCBUZW1wbGF0ZS5wYXJzZSgie3sxMDAwIHwgbW9uZXl9fSIpLnJlbmRlciEobmlsLCBmaWx0ZXJzOiBbQ2FuYWRpYW5Nb25leUZpbHRlcl0pCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvY2FsX2ZpbHRlcl93aXRoX2RlcHJlY2F0ZWRfc3ludGF4CisgICAgYXNzZXJ0X2VxdWFsICIgMTAwMCQgQ0FEICIsIFRlbXBsYXRlLnBhcnNlKCJ7ezEwMDAgfCBtb25leX19IikucmVuZGVyIShuaWwsIENhbmFkaWFuTW9uZXlGaWx0ZXIpCisgICAgYXNzZXJ0X2VxdWFsICIgMTAwMCQgQ0FEICIsIFRlbXBsYXRlLnBhcnNlKCJ7ezEwMDAgfCBtb25leX19IikucmVuZGVyIShuaWwsIFtDYW5hZGlhbk1vbmV5RmlsdGVyXSkKKyAgZW5kCitlbmQgIyBGaWx0ZXJzVGVzdAorCitjbGFzcyBUZXN0T2JqZWN0IDwgTGlxdWlkOjpEcm9wCisgIGF0dHJfYWNjZXNzb3IgOmEKKyAgZGVmIGluaXRpYWxpemUoYSkKKyAgICBAYSA9IGEKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL2hhc2hfb3JkZXJpbmdfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL2hhc2hfb3JkZXJpbmdfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmMxYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vaGFzaF9vcmRlcmluZ190ZXN0LnJiCkBAIC0wLDAgKzEsMjMgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBIYXNoT3JkZXJpbmdUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgbW9kdWxlIE1vbmV5RmlsdGVyCisgICAgZGVmIG1vbmV5KGlucHV0KQorICAgICAgc3ByaW50ZignICVkJCAnLCBpbnB1dCkKKyAgICBlbmQKKyAgZW5kCisKKyAgbW9kdWxlIENhbmFkaWFuTW9uZXlGaWx0ZXIKKyAgICBkZWYgbW9uZXkoaW5wdXQpCisgICAgICBzcHJpbnRmKCcgJWQkIENBRCAnLCBpbnB1dCkKKyAgICBlbmQKKyAgZW5kCisKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9nbG9iYWxfcmVnaXN0ZXJfb3JkZXIKKyAgICB3aXRoX2dsb2JhbF9maWx0ZXIoTW9uZXlGaWx0ZXIsIENhbmFkaWFuTW9uZXlGaWx0ZXIpIGRvCisgICAgICBhc3NlcnRfZXF1YWwgIiAxMDAwJCBDQUQgIiwgVGVtcGxhdGUucGFyc2UoInt7MTAwMCB8IG1vbmV5fX0iKS5yZW5kZXIobmlsLCBuaWwpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9vdXRwdXRfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL291dHB1dF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Y2Y5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9vdXRwdXRfdGVzdC5yYgpAQCAtMCwwICsxLDEyMyBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK21vZHVsZSBGdW5ueUZpbHRlcgorICBkZWYgbWFrZV9mdW5ueShpbnB1dCkKKyAgICAnTE9MJworICBlbmQKKworICBkZWYgY2l0ZV9mdW5ueShpbnB1dCkKKyAgICAiTE9MOiAje2lucHV0fSIKKyAgZW5kCisKKyAgZGVmIGFkZF9zbWlsZXkoaW5wdXQsIHNtaWxleSA9ICI6LSkiKQorICAgICIje2lucHV0fSAje3NtaWxleX0iCisgIGVuZAorCisgIGRlZiBhZGRfdGFnKGlucHV0LCB0YWcgPSAicCIsIGlkID0gImZvbyIpCisgICAgJSg8I3t0YWd9IGlkPSIje2lkfSI+I3tpbnB1dH08LyN7dGFnfT4pCisgIGVuZAorCisgIGRlZiBwYXJhZ3JhcGgoaW5wdXQpCisgICAgIjxwPiN7aW5wdXR9PC9wPiIKKyAgZW5kCisKKyAgZGVmIGxpbmtfdG8obmFtZSwgdXJsKQorICAgICUoPGEgaHJlZj0iI3t1cmx9Ij4je25hbWV9PC9hPikKKyAgZW5kCitlbmQKKworY2xhc3MgT3V0cHV0VGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgZGVmIHNldHVwCisgICAgQGFzc2lnbnMgPSB7CisgICAgICAnYmVzdF9jYXJzJyA9PiAnYm13JywKKyAgICAgICdjYXInID0+IHsgJ2JtdycgPT4gJ2dvb2QnLCAnZ20nID0+ICdiYWQnIH0KKyAgICB9CisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlCisgICAgdGV4dCA9ICUoIHt7YmVzdF9jYXJzfX0gKQorCisgICAgZXhwZWN0ZWQgPSAlKCBibXcgKQorICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgVGVtcGxhdGUucGFyc2UodGV4dCkucmVuZGVyIShAYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyaWFibGVfdHJhdmVyc2luZ193aXRoX3R3b19icmFja2V0cworICAgIHRleHQgPSAlKHt7IHNpdGUuZGF0YS5tZW51W2luY2x1ZGUubWVudV1baW5jbHVkZS5sb2NhbGVdIH19KQorICAgIGFzc2VydF9lcXVhbCAiaXQgd29ya3MhIiwgVGVtcGxhdGUucGFyc2UodGV4dCkucmVuZGVyISgKKyAgICAgICJzaXRlIiA9PiB7ICJkYXRhIiA9PiB7ICJtZW51IiA9PiB7ICJmb28iID0+IHsgImJhciIgPT4gIml0IHdvcmtzISIgfSB9IH0gfSwKKyAgICAgICJpbmNsdWRlIiA9PiB7ICJtZW51IiA9PiAiZm9vIiwgImxvY2FsZSIgPT4gImJhciIgfQorICAgICkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyaWFibGVfdHJhdmVyc2luZworICAgIHRleHQgPSAlKCB7e2Nhci5ibXd9fSB7e2Nhci5nbX19IHt7Y2FyLmJtd319ICkKKworICAgIGV4cGVjdGVkID0gJSggZ29vZCBiYWQgZ29vZCApCisgICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBUZW1wbGF0ZS5wYXJzZSh0ZXh0KS5yZW5kZXIhKEBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZV9waXBpbmcKKyAgICB0ZXh0ID0gJSgge3sgY2FyLmdtIHwgbWFrZV9mdW5ueSB9fSApCisgICAgZXhwZWN0ZWQgPSAlKCBMT0wgKQorCisgICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBUZW1wbGF0ZS5wYXJzZSh0ZXh0KS5yZW5kZXIhKEBhc3NpZ25zLCBmaWx0ZXJzOiBbRnVubnlGaWx0ZXJdKQorICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZV9waXBpbmdfd2l0aF9pbnB1dAorICAgIHRleHQgPSAlKCB7eyBjYXIuZ20gfCBjaXRlX2Z1bm55IH19ICkKKyAgICBleHBlY3RlZCA9ICUoIExPTDogYmFkICkKKworICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgVGVtcGxhdGUucGFyc2UodGV4dCkucmVuZGVyIShAYXNzaWducywgZmlsdGVyczogW0Z1bm55RmlsdGVyXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyaWFibGVfcGlwaW5nX3dpdGhfYXJncworICAgIHRleHQgPSAlISB7eyBjYXIuZ20gfCBhZGRfc21pbGV5IDogJzotKCcgfX0gIQorICAgIGV4cGVjdGVkID0gJXwgYmFkIDotKCB8CisKKyAgICBhc3NlcnRfZXF1YWwgZXhwZWN0ZWQsIFRlbXBsYXRlLnBhcnNlKHRleHQpLnJlbmRlciEoQGFzc2lnbnMsIGZpbHRlcnM6IFtGdW5ueUZpbHRlcl0pCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX3BpcGluZ193aXRoX25vX2FyZ3MKKyAgICB0ZXh0ID0gJSgge3sgY2FyLmdtIHwgYWRkX3NtaWxleSB9fSApCisgICAgZXhwZWN0ZWQgPSAlfCBiYWQgOi0pIHwKKworICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgVGVtcGxhdGUucGFyc2UodGV4dCkucmVuZGVyIShAYXNzaWducywgZmlsdGVyczogW0Z1bm55RmlsdGVyXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlwbGVfdmFyaWFibGVfcGlwaW5nX3dpdGhfYXJncworICAgIHRleHQgPSAlISB7eyBjYXIuZ20gfCBhZGRfc21pbGV5IDogJzotKCcgfCBhZGRfc21pbGV5IDogJzotKCd9fSAhCisgICAgZXhwZWN0ZWQgPSAlfCBiYWQgOi0oIDotKCB8CisKKyAgICBhc3NlcnRfZXF1YWwgZXhwZWN0ZWQsIFRlbXBsYXRlLnBhcnNlKHRleHQpLnJlbmRlciEoQGFzc2lnbnMsIGZpbHRlcnM6IFtGdW5ueUZpbHRlcl0pCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX3BpcGluZ193aXRoX211bHRpcGxlX2FyZ3MKKyAgICB0ZXh0ID0gJSgge3sgY2FyLmdtIHwgYWRkX3RhZyA6ICdzcGFuJywgJ2Jhcid9fSApCisgICAgZXhwZWN0ZWQgPSAlKCA8c3BhbiBpZD0iYmFyIj5iYWQ8L3NwYW4+ICkKKworICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgVGVtcGxhdGUucGFyc2UodGV4dCkucmVuZGVyIShAYXNzaWducywgZmlsdGVyczogW0Z1bm55RmlsdGVyXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyaWFibGVfcGlwaW5nX3dpdGhfdmFyaWFibGVfYXJncworICAgIHRleHQgPSAlKCB7eyBjYXIuZ20gfCBhZGRfdGFnIDogJ3NwYW4nLCBjYXIuYm13fX0gKQorICAgIGV4cGVjdGVkID0gJSggPHNwYW4gaWQ9Imdvb2QiPmJhZDwvc3Bhbj4gKQorCisgICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBUZW1wbGF0ZS5wYXJzZSh0ZXh0KS5yZW5kZXIhKEBhc3NpZ25zLCBmaWx0ZXJzOiBbRnVubnlGaWx0ZXJdKQorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aXBsZV9waXBpbmdzCisgICAgdGV4dCA9ICUoIHt7IGJlc3RfY2FycyB8IGNpdGVfZnVubnkgfCBwYXJhZ3JhcGggfX0gKQorICAgIGV4cGVjdGVkID0gJSggPHA+TE9MOiBibXc8L3A+ICkKKworICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgVGVtcGxhdGUucGFyc2UodGV4dCkucmVuZGVyIShAYXNzaWducywgZmlsdGVyczogW0Z1bm55RmlsdGVyXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGlua190bworICAgIHRleHQgPSAlKCB7eyAnVHlwbycgfCBsaW5rX3RvOiAnaHR0cDovL3R5cG8ubGVldHNvZnQuY29tJyB9fSApCisgICAgZXhwZWN0ZWQgPSAlKCA8YSBocmVmPSJodHRwOi8vdHlwby5sZWV0c29mdC5jb20iPlR5cG88L2E+ICkKKworICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgVGVtcGxhdGUucGFyc2UodGV4dCkucmVuZGVyIShAYXNzaWducywgZmlsdGVyczogW0Z1bm55RmlsdGVyXSkKKyAgZW5kCitlbmQgIyBPdXRwdXRUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9wYXJzaW5nX3F1aXJrc190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vcGFyc2luZ19xdWlya3NfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTMxMzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vcGFyc2luZ19xdWlya3NfdGVzdC5yYgpAQCAtMCwwICsxLDExOCBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIFBhcnNpbmdRdWlya3NUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9wYXJzaW5nX2NzcworICAgIHRleHQgPSAiIGRpdiB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9ICIKKyAgICBhc3NlcnRfZXF1YWwgdGV4dCwgVGVtcGxhdGUucGFyc2UodGV4dCkucmVuZGVyIQorICBlbmQKKworICBkZWYgdGVzdF9yYWlzZV9vbl9zaW5nbGVfY2xvc2VfYnJhY2V0CisgICAgYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcikgZG8KKyAgICAgIFRlbXBsYXRlLnBhcnNlKCJ0ZXh0IHt7bWV0aG9kfSBvaCBub3MhIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmFpc2Vfb25fbGFiZWxfYW5kX25vX2Nsb3NlX2JyYWNldHMKKyAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgVGVtcGxhdGUucGFyc2UoIlRFU1Qge3sgIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmFpc2Vfb25fbGFiZWxfYW5kX25vX2Nsb3NlX2JyYWNldHNfcGVyY2VudAorICAgIGFzc2VydF9yYWlzZXMoU3ludGF4RXJyb3IpIGRvCisgICAgICBUZW1wbGF0ZS5wYXJzZSgiVEVTVCB7JSAiKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9lcnJvcl9vbl9lbXB0eV9maWx0ZXIKKyAgICBhc3NlcnQgVGVtcGxhdGUucGFyc2UoInt7dGVzdH19IikKKworICAgIHdpdGhfZXJyb3JfbW9kZSg6bGF4KSBkbworICAgICAgYXNzZXJ0IFRlbXBsYXRlLnBhcnNlKCJ7e3x0ZXN0fX0iKQorICAgIGVuZAorCisgICAgd2l0aF9lcnJvcl9tb2RlKDpzdHJpY3QpIGRvCisgICAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSB7IFRlbXBsYXRlLnBhcnNlKCJ7e3x0ZXN0fX0iKSB9CisgICAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSB7IFRlbXBsYXRlLnBhcnNlKCJ7e3Rlc3QgfGF8Ynx9fSIpIH0KKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWVhbmluZ2xlc3NfcGFyZW5zX2Vycm9yCisgICAgd2l0aF9lcnJvcl9tb2RlKDpzdHJpY3QpIGRvCisgICAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgICBtYXJrdXAgPSAiYSA9PSAnZm9vJyBvciAoYiA9PSAnYmFyJyBhbmQgYyA9PSAnYmF6Jykgb3IgZmFsc2UiCisgICAgICAgIFRlbXBsYXRlLnBhcnNlKCJ7JSBpZiAje21hcmt1cH0gJX0gWUVTIHslIGVuZGlmICV9IikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF91bmV4cGVjdGVkX2NoYXJhY3RlcnNfc3ludGF4X2Vycm9yCisgICAgd2l0aF9lcnJvcl9tb2RlKDpzdHJpY3QpIGRvCisgICAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgICBtYXJrdXAgPSAidHJ1ZSAmJiBmYWxzZSIKKyAgICAgICAgVGVtcGxhdGUucGFyc2UoInslIGlmICN7bWFya3VwfSAlfSBZRVMgeyUgZW5kaWYgJX0iKQorICAgICAgZW5kCisgICAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgICBtYXJrdXAgPSAiZmFsc2UgfHwgdHJ1ZSIKKyAgICAgICAgVGVtcGxhdGUucGFyc2UoInslIGlmICN7bWFya3VwfSAlfSBZRVMgeyUgZW5kaWYgJX0iKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25vX2Vycm9yX29uX2xheF9lbXB0eV9maWx0ZXIKKyAgICBhc3NlcnQgVGVtcGxhdGUucGFyc2UoInt7dGVzdCB8YXxifH19IiwgZXJyb3JfbW9kZTogOmxheCkKKyAgICBhc3NlcnQgVGVtcGxhdGUucGFyc2UoInt7dGVzdH19IiwgZXJyb3JfbW9kZTogOmxheCkKKyAgICBhc3NlcnQgVGVtcGxhdGUucGFyc2UoInt7fHRlc3R8fX0iLCBlcnJvcl9tb2RlOiA6bGF4KQorICBlbmQKKworICBkZWYgdGVzdF9tZWFuaW5nbGVzc19wYXJlbnNfbGF4CisgICAgd2l0aF9lcnJvcl9tb2RlKDpsYXgpIGRvCisgICAgICBhc3NpZ25zID0geyAnYicgPT4gJ2JhcicsICdjJyA9PiAnYmF6JyB9CisgICAgICBtYXJrdXAgPSAiYSA9PSAnZm9vJyBvciAoYiA9PSAnYmFyJyBhbmQgYyA9PSAnYmF6Jykgb3IgZmFsc2UiCisgICAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICJ7JSBpZiAje21hcmt1cH0gJX0gWUVTIHslIGVuZGlmICV9IiwgYXNzaWducykKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5leHBlY3RlZF9jaGFyYWN0ZXJzX3NpbGVudGx5X2VhdF9sb2dpY19sYXgKKyAgICB3aXRoX2Vycm9yX21vZGUoOmxheCkgZG8KKyAgICAgIG1hcmt1cCA9ICJ0cnVlICYmIGZhbHNlIgorICAgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAieyUgaWYgI3ttYXJrdXB9ICV9IFlFUyB7JSBlbmRpZiAlfSIpCisgICAgICBtYXJrdXAgPSAiZmFsc2UgfHwgdHJ1ZSIKKyAgICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICJ7JSBpZiAje21hcmt1cH0gJX0gWUVTIHslIGVuZGlmICV9IikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmFpc2Vfb25faW52YWxpZF90YWdfZGVsaW1pdGVyCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6OlN5bnRheEVycm9yKSBkbworICAgICAgVGVtcGxhdGUubmV3LnBhcnNlKCd7JSBlbmQgJX0nKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF91bmFuY2hvcmVkX2ZpbHRlcl9hcmd1bWVudHMKKyAgICB3aXRoX2Vycm9yX21vZGUoOmxheCkgZG8KKyAgICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2hpJywgInt7ICdoaSB0aGVyZScgfCBzcGxpdCQkJDonICcgfCBmaXJzdCB9fSIpCisKKyAgICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ3gnLCAie3sgJ1gnIHwgZG93bmNhc2UpIH19IikKKworICAgICAgIyBBZnRlciB0aGUgbWVzc2VkIHVwIHF1b3RlcyBhIGZpbHRlciB3aXRob3V0IHBhcmFtZXRlcnMgKHJldmVyc2UpIHNob3VsZCB3b3JrCisgICAgICAjIGJ1dCBvbmUgd2l0aCBwYXJhbWV0ZXJzIChyZW1vdmUpIHNob3VsZG4ndCBiZSBkZXRlY3RlZC4KKyAgICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2hlcmUnLCAgInt7ICdoaSB0aGVyZScgfCBzcGxpdDpcInRcIlwiIHwgcmV2ZXJzZSB8IGZpcnN0fX0iKQorICAgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnaGkgJywgICJ7eyAnaGkgdGhlcmUnIHwgc3BsaXQ6XCJ0XCJcIiB8IHJlbW92ZTpcImlcIiB8IGZpcnN0fX0iKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9pbnZhbGlkX3ZhcmlhYmxlc193b3JrCisgICAgd2l0aF9lcnJvcl9tb2RlKDpsYXgpIGRvCisgICAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdiYXInLCAieyUgYXNzaWduIDEyM2ZvbyA9ICdiYXInICV9e3sgMTIzZm9vIH19IikKKyAgICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzEyMycsICJ7JSBhc3NpZ24gMTIzID0gJ2JhcicgJX17eyAxMjMgfX0iKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9leHRyYV9kb3RzX2luX3JhbmdlcworICAgIHdpdGhfZXJyb3JfbW9kZSg6bGF4KSBkbworICAgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnMTIzNDUnLCAieyUgZm9yIGkgaW4gKDEuLi41KSAlfXt7IGkgfX17JSBlbmRmb3IgJX0iKQorICAgIGVuZAorICBlbmQKK2VuZCAjIFBhcnNpbmdRdWlya3NUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9yZW5kZXJfcHJvZmlsaW5nX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9yZW5kZXJfcHJvZmlsaW5nX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxMTFlNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3JlbmRlcl9wcm9maWxpbmdfdGVzdC5yYgpAQCAtMCwwICsxLDE1NCBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIFJlbmRlclByb2ZpbGluZ1Rlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGNsYXNzIFByb2ZpbGluZ0ZpbGVTeXN0ZW0KKyAgICBkZWYgcmVhZF90ZW1wbGF0ZV9maWxlKHRlbXBsYXRlX3BhdGgpCisgICAgICAiUmVuZGVyaW5nIHRlbXBsYXRlIHslIGFzc2lnbiB0ZW1wbGF0ZV9uYW1lID0gJyN7dGVtcGxhdGVfcGF0aH0nJX1cbnt7IHRlbXBsYXRlX25hbWUgfX0iCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBzZXR1cAorICAgIExpcXVpZDo6VGVtcGxhdGUuZmlsZV9zeXN0ZW0gPSBQcm9maWxpbmdGaWxlU3lzdGVtLm5ldworICBlbmQKKworICBkZWYgdGVzdF90ZW1wbGF0ZV9hbGxvd3NfZmxhZ2dpbmdfcHJvZmlsaW5nCisgICAgdCA9IFRlbXBsYXRlLnBhcnNlKCJ7eyAnYSBzdHJpbmcnIHwgdXBjYXNlIH19IikKKyAgICB0LnJlbmRlciEKKworICAgIGFzc2VydF9uaWwgdC5wcm9maWxlcgorICBlbmQKKworICBkZWYgdGVzdF9wYXJzZV9tYWtlc19hdmFpbGFibGVfc2ltcGxlX3Byb2ZpbGluZworICAgIHQgPSBUZW1wbGF0ZS5wYXJzZSgie3sgJ2Egc3RyaW5nJyB8IHVwY2FzZSB9fSIsIHByb2ZpbGU6IHRydWUpCisgICAgdC5yZW5kZXIhCisKKyAgICBhc3NlcnRfZXF1YWwgMSwgdC5wcm9maWxlci5sZW5ndGgKKworICAgIG5vZGUgPSB0LnByb2ZpbGVyWzBdCisgICAgYXNzZXJ0X2VxdWFsICIgJ2Egc3RyaW5nJyB8IHVwY2FzZSAiLCBub2RlLmNvZGUKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVuZGVyX2lnbm9yZXNfcmF3X3N0cmluZ3Nfd2hlbl9wcm9maWxpbmcKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoIlRoaXMgaXMgcmF3IHN0cmluZ1xuc3R1ZmZcbk5ld2xpbmUiLCBwcm9maWxlOiB0cnVlKQorICAgIHQucmVuZGVyIQorCisgICAgYXNzZXJ0X2VxdWFsIDAsIHQucHJvZmlsZXIubGVuZ3RoCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb2ZpbGluZ19pbmNsdWRlc19saW5lX251bWJlcnNfb2ZfbGlxdWlkX25vZGVzCisgICAgdCA9IFRlbXBsYXRlLnBhcnNlKCJ7eyAnYSBzdHJpbmcnIHwgdXBjYXNlIH19XG57JSBpbmNyZW1lbnQgdGVzdCAlfSIsIHByb2ZpbGU6IHRydWUpCisgICAgdC5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsIDIsIHQucHJvZmlsZXIubGVuZ3RoCisKKyAgICAjIHt7ICdhIHN0cmluZycgfCB1cGNhc2UgfX0KKyAgICBhc3NlcnRfZXF1YWwgMSwgdC5wcm9maWxlclswXS5saW5lX251bWJlcgorICAgICMge3sgaW5jcmVtZW50IHRlc3QgfX0KKyAgICBhc3NlcnRfZXF1YWwgMiwgdC5wcm9maWxlclsxXS5saW5lX251bWJlcgorICBlbmQKKworICBkZWYgdGVzdF9wcm9maWxpbmdfaW5jbHVkZXNfbGluZV9udW1iZXJzX29mX2luY2x1ZGVkX3BhcnRpYWxzCisgICAgdCA9IFRlbXBsYXRlLnBhcnNlKCJ7JSBpbmNsdWRlICdhX3RlbXBsYXRlJyAlfSIsIHByb2ZpbGU6IHRydWUpCisgICAgdC5yZW5kZXIhCisKKyAgICBpbmNsdWRlZF9jaGlsZHJlbiA9IHQucHJvZmlsZXJbMF0uY2hpbGRyZW4KKworICAgICMgeyUgYXNzaWduIHRlbXBsYXRlX25hbWUgPSAnYV90ZW1wbGF0ZScgJX0KKyAgICBhc3NlcnRfZXF1YWwgMSwgaW5jbHVkZWRfY2hpbGRyZW5bMF0ubGluZV9udW1iZXIKKyAgICAjIHt7IHRlbXBsYXRlX25hbWUgfX0KKyAgICBhc3NlcnRfZXF1YWwgMiwgaW5jbHVkZWRfY2hpbGRyZW5bMV0ubGluZV9udW1iZXIKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHJvZmlsaW5nX3RpbWVzX3RoZV9yZW5kZXJpbmdfb2ZfdG9rZW5zCisgICAgdCA9IFRlbXBsYXRlLnBhcnNlKCJ7JSBpbmNsdWRlICdhX3RlbXBsYXRlJyAlfSIsIHByb2ZpbGU6IHRydWUpCisgICAgdC5yZW5kZXIhCisKKyAgICBub2RlID0gdC5wcm9maWxlclswXQorICAgIHJlZnV0ZV9uaWwgbm9kZS5yZW5kZXJfdGltZQorICBlbmQKKworICBkZWYgdGVzdF9wcm9maWxpbmdfdGltZXNfdGhlX2VudGlyZV9yZW5kZXIKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInslIGluY2x1ZGUgJ2FfdGVtcGxhdGUnICV9IiwgcHJvZmlsZTogdHJ1ZSkKKyAgICB0LnJlbmRlciEKKworICAgIGFzc2VydCB0LnByb2ZpbGVyLnRvdGFsX3JlbmRlcl90aW1lID49IDAsICJUb3RhbCByZW5kZXIgdGltZSB3YXMgbm90IGNhbGN1bGF0ZWQiCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb2ZpbGluZ191c2VzX2luY2x1ZGVfdG9fbWFya19jaGlsZHJlbgorICAgIHQgPSBUZW1wbGF0ZS5wYXJzZSgie3sgJ2Egc3RyaW5nJyB8IHVwY2FzZSB9fVxueyUgaW5jbHVkZSAnYV90ZW1wbGF0ZScgJX0iLCBwcm9maWxlOiB0cnVlKQorICAgIHQucmVuZGVyIQorCisgICAgaW5jbHVkZV9ub2RlID0gdC5wcm9maWxlclsxXQorICAgIGFzc2VydF9lcXVhbCAyLCBpbmNsdWRlX25vZGUuY2hpbGRyZW4ubGVuZ3RoCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb2ZpbGluZ19tYXJrc19jaGlsZHJlbl93aXRoX3RoZV9uYW1lX29mX2luY2x1ZGVkX3BhcnRpYWwKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInt7ICdhIHN0cmluZycgfCB1cGNhc2UgfX1cbnslIGluY2x1ZGUgJ2FfdGVtcGxhdGUnICV9IiwgcHJvZmlsZTogdHJ1ZSkKKyAgICB0LnJlbmRlciEKKworICAgIGluY2x1ZGVfbm9kZSA9IHQucHJvZmlsZXJbMV0KKyAgICBpbmNsdWRlX25vZGUuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICBhc3NlcnRfZXF1YWwgImFfdGVtcGxhdGUiLCBjaGlsZC5wYXJ0aWFsCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb2ZpbGluZ19zdXBwb3J0c19tdWx0aXBsZV90ZW1wbGF0ZXMKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInt7ICdhIHN0cmluZycgfCB1cGNhc2UgfX1cbnslIGluY2x1ZGUgJ2FfdGVtcGxhdGUnICV9XG57JSBpbmNsdWRlICdiX3RlbXBsYXRlJyAlfSIsIHByb2ZpbGU6IHRydWUpCisgICAgdC5yZW5kZXIhCisKKyAgICBhX3RlbXBsYXRlID0gdC5wcm9maWxlclsxXQorICAgIGFfdGVtcGxhdGUuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICBhc3NlcnRfZXF1YWwgImFfdGVtcGxhdGUiLCBjaGlsZC5wYXJ0aWFsCisgICAgZW5kCisKKyAgICBiX3RlbXBsYXRlID0gdC5wcm9maWxlclsyXQorICAgIGJfdGVtcGxhdGUuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICBhc3NlcnRfZXF1YWwgImJfdGVtcGxhdGUiLCBjaGlsZC5wYXJ0aWFsCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb2ZpbGluZ19zdXBwb3J0c19yZW5kZXJpbmdfdGhlX3NhbWVfcGFydGlhbF9tdWx0aXBsZV90aW1lcworICAgIHQgPSBUZW1wbGF0ZS5wYXJzZSgie3sgJ2Egc3RyaW5nJyB8IHVwY2FzZSB9fVxueyUgaW5jbHVkZSAnYV90ZW1wbGF0ZScgJX1cbnslIGluY2x1ZGUgJ2FfdGVtcGxhdGUnICV9IiwgcHJvZmlsZTogdHJ1ZSkKKyAgICB0LnJlbmRlciEKKworICAgIGFfdGVtcGxhdGUxID0gdC5wcm9maWxlclsxXQorICAgIGFfdGVtcGxhdGUxLmNoaWxkcmVuLmVhY2ggZG8gfGNoaWxkfAorICAgICAgYXNzZXJ0X2VxdWFsICJhX3RlbXBsYXRlIiwgY2hpbGQucGFydGlhbAorICAgIGVuZAorCisgICAgYV90ZW1wbGF0ZTIgPSB0LnByb2ZpbGVyWzJdCisgICAgYV90ZW1wbGF0ZTIuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICBhc3NlcnRfZXF1YWwgImFfdGVtcGxhdGUiLCBjaGlsZC5wYXJ0aWFsCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2Nhbl9pdGVyYXRlX292ZXJfZWFjaF9wcm9maWxpbmdfZW50cnkKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInt7ICdhIHN0cmluZycgfCB1cGNhc2UgfX1cbnslIGluY3JlbWVudCB0ZXN0ICV9IiwgcHJvZmlsZTogdHJ1ZSkKKyAgICB0LnJlbmRlciEKKworICAgIHRpbWluZ19jb3VudCA9IDAKKyAgICB0LnByb2ZpbGVyLmVhY2ggZG8gfHRpbWluZ3wKKyAgICAgIHRpbWluZ19jb3VudCArPSAxCisgICAgZW5kCisKKyAgICBhc3NlcnRfZXF1YWwgMiwgdGltaW5nX2NvdW50CisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb2ZpbGluZ19tYXJrc19jaGlsZHJlbl9vZl9pZl9ibG9ja3MKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInslIGlmIHRydWUgJX0geyUgaW5jcmVtZW50IHRlc3QgJX0ge3sgdGVzdCB9fSB7JSBlbmRpZiAlfSIsIHByb2ZpbGU6IHRydWUpCisgICAgdC5yZW5kZXIhCisKKyAgICBhc3NlcnRfZXF1YWwgMSwgdC5wcm9maWxlci5sZW5ndGgKKyAgICBhc3NlcnRfZXF1YWwgMiwgdC5wcm9maWxlclswXS5jaGlsZHJlbi5sZW5ndGgKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHJvZmlsaW5nX21hcmtzX2NoaWxkcmVuX29mX2Zvcl9ibG9ja3MKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInslIGZvciBpdGVtIGluIGNvbGxlY3Rpb24gJX0ge3sgaXRlbSB9fSB7JSBlbmRmb3IgJX0iLCBwcm9maWxlOiB0cnVlKQorICAgIHQucmVuZGVyISh7ICJjb2xsZWN0aW9uIiA9PiBbIm9uZSIsICJ0d28iXSB9KQorCisgICAgYXNzZXJ0X2VxdWFsIDEsIHQucHJvZmlsZXIubGVuZ3RoCisgICAgIyBXaWxsIHByb2ZpbGUgZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBmb3IgYmxvY2sKKyAgICBhc3NlcnRfZXF1YWwgMiwgdC5wcm9maWxlclswXS5jaGlsZHJlbi5sZW5ndGgKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3NlY3VyaXR5X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9zZWN1cml0eV90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTc0OTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi9zZWN1cml0eV90ZXN0LnJiCkBAIC0wLDAgKzEsNjYgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCittb2R1bGUgU2VjdXJpdHlGaWx0ZXIKKyAgZGVmIGFkZF9vbmUoaW5wdXQpCisgICAgIiN7aW5wdXR9ICsgMSIKKyAgZW5kCitlbmQKKworY2xhc3MgU2VjdXJpdHlUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgc2V0dXAKKyAgICBAYXNzaWducyA9IHt9CisgIGVuZAorCisgIGRlZiB0ZXN0X25vX2luc3RhbmNlX2V2YWwKKyAgICB0ZXh0ID0gJSgge3sgJzErMScgfCBpbnN0YW5jZV9ldmFsIH19ICkKKyAgICBleHBlY3RlZCA9ICUoIDErMSApCisKKyAgICBhc3NlcnRfZXF1YWwgZXhwZWN0ZWQsIFRlbXBsYXRlLnBhcnNlKHRleHQpLnJlbmRlciEoQGFzc2lnbnMpCisgIGVuZAorCisgIGRlZiB0ZXN0X25vX2V4aXN0aW5nX2luc3RhbmNlX2V2YWwKKyAgICB0ZXh0ID0gJSgge3sgJzErMScgfCBfX2luc3RhbmNlX2V2YWxfXyB9fSApCisgICAgZXhwZWN0ZWQgPSAlKCAxKzEgKQorCisgICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBUZW1wbGF0ZS5wYXJzZSh0ZXh0KS5yZW5kZXIhKEBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9ub19pbnN0YW5jZV9ldmFsX2FmdGVyX21peGluZ19pbl9uZXdfZmlsdGVyCisgICAgdGV4dCA9ICUoIHt7ICcxKzEnIHwgaW5zdGFuY2VfZXZhbCB9fSApCisgICAgZXhwZWN0ZWQgPSAlKCAxKzEgKQorCisgICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBUZW1wbGF0ZS5wYXJzZSh0ZXh0KS5yZW5kZXIhKEBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9ub19pbnN0YW5jZV9ldmFsX2xhdGVyX2luX2NoYWluCisgICAgdGV4dCA9ICUoIHt7ICcxKzEnIHwgYWRkX29uZSB8IGluc3RhbmNlX2V2YWwgfX0gKQorICAgIGV4cGVjdGVkID0gJSggMSsxICsgMSApCisKKyAgICBhc3NlcnRfZXF1YWwgZXhwZWN0ZWQsIFRlbXBsYXRlLnBhcnNlKHRleHQpLnJlbmRlciEoQGFzc2lnbnMsIGZpbHRlcnM6IFNlY3VyaXR5RmlsdGVyKQorICBlbmQKKworICBkZWYgdGVzdF9kb2VzX25vdF9hZGRfZmlsdGVyc190b19zeW1ib2xfdGFibGUKKyAgICBjdXJyZW50X3N5bWJvbHMgPSBTeW1ib2wuYWxsX3N5bWJvbHMKKworICAgIHRlc3QgPSAlKCB7eyAic29tZV9zdHJpbmciIHwgYV9iYWRfZmlsdGVyIH19ICkKKworICAgIHRlbXBsYXRlID0gVGVtcGxhdGUucGFyc2UodGVzdCkKKyAgICBhc3NlcnRfZXF1YWwgW10sIChTeW1ib2wuYWxsX3N5bWJvbHMgLSBjdXJyZW50X3N5bWJvbHMpCisKKyAgICB0ZW1wbGF0ZS5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsIFtdLCAoU3ltYm9sLmFsbF9zeW1ib2xzIC0gY3VycmVudF9zeW1ib2xzKQorICBlbmQKKworICBkZWYgdGVzdF9kb2VzX25vdF9hZGRfZHJvcF9tZXRob2RzX3RvX3N5bWJvbF90YWJsZQorICAgIGN1cnJlbnRfc3ltYm9scyA9IFN5bWJvbC5hbGxfc3ltYm9scworCisgICAgYXNzaWducyA9IHsgJ2Ryb3AnID0+IERyb3AubmV3IH0KKyAgICBhc3NlcnRfZXF1YWwgIiIsIFRlbXBsYXRlLnBhcnNlKCJ7eyBkcm9wLmN1c3RvbV9tZXRob2RfMSB9fSIsIGFzc2lnbnMpLnJlbmRlciEKKyAgICBhc3NlcnRfZXF1YWwgIiIsIFRlbXBsYXRlLnBhcnNlKCJ7eyBkcm9wLmN1c3RvbV9tZXRob2RfMiB9fSIsIGFzc2lnbnMpLnJlbmRlciEKKyAgICBhc3NlcnRfZXF1YWwgIiIsIFRlbXBsYXRlLnBhcnNlKCJ7eyBkcm9wLmN1c3RvbV9tZXRob2RfMyB9fSIsIGFzc2lnbnMpLnJlbmRlciEKKworICAgIGFzc2VydF9lcXVhbCBbXSwgKFN5bWJvbC5hbGxfc3ltYm9scyAtIGN1cnJlbnRfc3ltYm9scykKKyAgZW5kCitlbmQgIyBTZWN1cml0eVRlc3QKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3N0YW5kYXJkX2ZpbHRlcl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vc3RhbmRhcmRfZmlsdGVyX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3N0YW5kYXJkX2ZpbHRlcl90ZXN0LnJiCkBAIC0wLDAgKzEsNTM1IEBACisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgRmlsdGVycworICBpbmNsdWRlIExpcXVpZDo6U3RhbmRhcmRGaWx0ZXJzCitlbmQKKworY2xhc3MgVGVzdFRoaW5nCisgIGF0dHJfcmVhZGVyIDpmb28KKworICBkZWYgaW5pdGlhbGl6ZQorICAgIEBmb28gPSAwCisgIGVuZAorCisgIGRlZiB0b19zCisgICAgIndvb3Q6ICN7QGZvb30iCisgIGVuZAorCisgIGRlZiBbXSh3aGF0ZXZlcikKKyAgICB0b19zCisgIGVuZAorCisgIGRlZiB0b19saXF1aWQKKyAgICBAZm9vICs9IDEKKyAgICBzZWxmCisgIGVuZAorZW5kCisKK2NsYXNzIFRlc3REcm9wIDwgTGlxdWlkOjpEcm9wCisgIGRlZiB0ZXN0CisgICAgInRlc3Rmb28iCisgIGVuZAorZW5kCisKK2NsYXNzIFRlc3RFbnVtZXJhYmxlIDwgTGlxdWlkOjpEcm9wCisgIGluY2x1ZGUgRW51bWVyYWJsZQorCisgIGRlZiBlYWNoKCZibG9jaykKKyAgICBbIHsgImZvbyIgPT4gMSwgImJhciIgPT4gMiB9LCB7ICJmb28iID0+IDIsICJiYXIiID0+IDEgfSwgeyAiZm9vIiA9PiAzLCAiYmFyIiA9PiAzIH0gXS5lYWNoKCZibG9jaykKKyAgZW5kCitlbmQKKworY2xhc3MgTnVtYmVyTGlrZVRoaW5nIDwgTGlxdWlkOjpEcm9wCisgIGRlZiBpbml0aWFsaXplKGFtb3VudCkKKyAgICBAYW1vdW50ID0gYW1vdW50CisgIGVuZAorCisgIGRlZiB0b19udW1iZXIKKyAgICBAYW1vdW50CisgIGVuZAorZW5kCisKK2NsYXNzIFN0YW5kYXJkRmlsdGVyc1Rlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiBzZXR1cAorICAgIEBmaWx0ZXJzID0gRmlsdGVycy5uZXcKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2l6ZQorICAgIGFzc2VydF9lcXVhbCAzLCBAZmlsdGVycy5zaXplKFsxLCAyLCAzXSkKKyAgICBhc3NlcnRfZXF1YWwgMCwgQGZpbHRlcnMuc2l6ZShbXSkKKyAgICBhc3NlcnRfZXF1YWwgMCwgQGZpbHRlcnMuc2l6ZShuaWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Rvd25jYXNlCisgICAgYXNzZXJ0X2VxdWFsICd0ZXN0aW5nJywgQGZpbHRlcnMuZG93bmNhc2UoIlRlc3RpbmciKQorICAgIGFzc2VydF9lcXVhbCAnJywgQGZpbHRlcnMuZG93bmNhc2UobmlsKQorICBlbmQKKworICBkZWYgdGVzdF91cGNhc2UKKyAgICBhc3NlcnRfZXF1YWwgJ1RFU1RJTkcnLCBAZmlsdGVycy51cGNhc2UoIlRlc3RpbmciKQorICAgIGFzc2VydF9lcXVhbCAnJywgQGZpbHRlcnMudXBjYXNlKG5pbCkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2xpY2UKKyAgICBhc3NlcnRfZXF1YWwgJ29vYicsIEBmaWx0ZXJzLnNsaWNlKCdmb29iYXInLCAxLCAzKQorICAgIGFzc2VydF9lcXVhbCAnb29iYXInLCBAZmlsdGVycy5zbGljZSgnZm9vYmFyJywgMSwgMTAwMCkKKyAgICBhc3NlcnRfZXF1YWwgJycsIEBmaWx0ZXJzLnNsaWNlKCdmb29iYXInLCAxLCAwKQorICAgIGFzc2VydF9lcXVhbCAnbycsIEBmaWx0ZXJzLnNsaWNlKCdmb29iYXInLCAxLCAxKQorICAgIGFzc2VydF9lcXVhbCAnYmFyJywgQGZpbHRlcnMuc2xpY2UoJ2Zvb2JhcicsIDMsIDMpCisgICAgYXNzZXJ0X2VxdWFsICdhcicsIEBmaWx0ZXJzLnNsaWNlKCdmb29iYXInLCAtMiwgMikKKyAgICBhc3NlcnRfZXF1YWwgJ2FyJywgQGZpbHRlcnMuc2xpY2UoJ2Zvb2JhcicsIC0yLCAxMDAwKQorICAgIGFzc2VydF9lcXVhbCAncicsIEBmaWx0ZXJzLnNsaWNlKCdmb29iYXInLCAtMSkKKyAgICBhc3NlcnRfZXF1YWwgJycsIEBmaWx0ZXJzLnNsaWNlKG5pbCwgMCkKKyAgICBhc3NlcnRfZXF1YWwgJycsIEBmaWx0ZXJzLnNsaWNlKCdmb29iYXInLCAxMDAsIDEwKQorICAgIGFzc2VydF9lcXVhbCAnJywgQGZpbHRlcnMuc2xpY2UoJ2Zvb2JhcicsIC0xMDAsIDEwKQorICAgIGFzc2VydF9lcXVhbCAnb29iJywgQGZpbHRlcnMuc2xpY2UoJ2Zvb2JhcicsICcxJywgJzMnKQorICAgIGFzc2VydF9yYWlzZXMoTGlxdWlkOjpBcmd1bWVudEVycm9yKSBkbworICAgICAgQGZpbHRlcnMuc2xpY2UoJ2Zvb2JhcicsIG5pbCkKKyAgICBlbmQKKyAgICBhc3NlcnRfcmFpc2VzKExpcXVpZDo6QXJndW1lbnRFcnJvcikgZG8KKyAgICAgIEBmaWx0ZXJzLnNsaWNlKCdmb29iYXInLCAwLCAiIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2xpY2Vfb25fYXJyYXlzCisgICAgaW5wdXQgPSAnZm9vYmFyJy5zcGxpdCgvLykKKyAgICBhc3NlcnRfZXF1YWwgJXcobyBvIGIpLCBAZmlsdGVycy5zbGljZShpbnB1dCwgMSwgMykKKyAgICBhc3NlcnRfZXF1YWwgJXcobyBvIGIgYSByKSwgQGZpbHRlcnMuc2xpY2UoaW5wdXQsIDEsIDEwMDApCisgICAgYXNzZXJ0X2VxdWFsICV3KCksIEBmaWx0ZXJzLnNsaWNlKGlucHV0LCAxLCAwKQorICAgIGFzc2VydF9lcXVhbCAldyhvKSwgQGZpbHRlcnMuc2xpY2UoaW5wdXQsIDEsIDEpCisgICAgYXNzZXJ0X2VxdWFsICV3KGIgYSByKSwgQGZpbHRlcnMuc2xpY2UoaW5wdXQsIDMsIDMpCisgICAgYXNzZXJ0X2VxdWFsICV3KGEgciksIEBmaWx0ZXJzLnNsaWNlKGlucHV0LCAtMiwgMikKKyAgICBhc3NlcnRfZXF1YWwgJXcoYSByKSwgQGZpbHRlcnMuc2xpY2UoaW5wdXQsIC0yLCAxMDAwKQorICAgIGFzc2VydF9lcXVhbCAldyhyKSwgQGZpbHRlcnMuc2xpY2UoaW5wdXQsIC0xKQorICAgIGFzc2VydF9lcXVhbCAldygpLCBAZmlsdGVycy5zbGljZShpbnB1dCwgMTAwLCAxMCkKKyAgICBhc3NlcnRfZXF1YWwgJXcoKSwgQGZpbHRlcnMuc2xpY2UoaW5wdXQsIC0xMDAsIDEwKQorICBlbmQKKworICBkZWYgdGVzdF90cnVuY2F0ZQorICAgIGFzc2VydF9lcXVhbCAnMTIzNC4uLicsIEBmaWx0ZXJzLnRydW5jYXRlKCcxMjM0NTY3ODkwJywgNykKKyAgICBhc3NlcnRfZXF1YWwgJzEyMzQ1Njc4OTAnLCBAZmlsdGVycy50cnVuY2F0ZSgnMTIzNDU2Nzg5MCcsIDIwKQorICAgIGFzc2VydF9lcXVhbCAnLi4uJywgQGZpbHRlcnMudHJ1bmNhdGUoJzEyMzQ1Njc4OTAnLCAwKQorICAgIGFzc2VydF9lcXVhbCAnMTIzNDU2Nzg5MCcsIEBmaWx0ZXJzLnRydW5jYXRlKCcxMjM0NTY3ODkwJykKKyAgICBhc3NlcnRfZXF1YWwgIua1i+ivlS4uLiIsIEBmaWx0ZXJzLnRydW5jYXRlKCLmtYvor5XmtYvor5XmtYvor5XmtYvor5UiLCA1KQorICAgIGFzc2VydF9lcXVhbCAnMTIzNDEnLCBAZmlsdGVycy50cnVuY2F0ZSgiMTIzNDU2Nzg5MCIsIDUsIDEpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NwbGl0CisgICAgYXNzZXJ0X2VxdWFsIFsnMTInLCAnMzQnXSwgQGZpbHRlcnMuc3BsaXQoJzEyfjM0JywgJ34nKQorICAgIGFzc2VydF9lcXVhbCBbJ0E/ICcsICcgLFonXSwgQGZpbHRlcnMuc3BsaXQoJ0E/IH4gfiB+ICxaJywgJ34gfiB+JykKKyAgICBhc3NlcnRfZXF1YWwgWydBP1onXSwgQGZpbHRlcnMuc3BsaXQoJ0E/WicsICd+JykKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBmaWx0ZXJzLnNwbGl0KG5pbCwgJyAnKQorICAgIGFzc2VydF9lcXVhbCBbJ0EnLCAnWiddLCBAZmlsdGVycy5zcGxpdCgnQTFaJywgMSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXNjYXBlCisgICAgYXNzZXJ0X2VxdWFsICcmbHQ7c3Ryb25nJmd0OycsIEBmaWx0ZXJzLmVzY2FwZSgnPHN0cm9uZz4nKQorICAgIGFzc2VydF9lcXVhbCBuaWwsIEBmaWx0ZXJzLmVzY2FwZShuaWwpCisgICAgYXNzZXJ0X2VxdWFsICcmbHQ7c3Ryb25nJmd0OycsIEBmaWx0ZXJzLmgoJzxzdHJvbmc+JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXNjYXBlX29uY2UKKyAgICBhc3NlcnRfZXF1YWwgJyZsdDtzdHJvbmcmZ3Q7SHVsayZsdDsvc3Ryb25nJmd0OycsIEBmaWx0ZXJzLmVzY2FwZV9vbmNlKCcmbHQ7c3Ryb25nJmd0O0h1bGs8L3N0cm9uZz4nKQorICBlbmQKKworICBkZWYgdGVzdF91cmxfZW5jb2RlCisgICAgYXNzZXJ0X2VxdWFsICdmb28lMkIxJTQwZXhhbXBsZS5jb20nLCBAZmlsdGVycy51cmxfZW5jb2RlKCdmb28rMUBleGFtcGxlLmNvbScpCisgICAgYXNzZXJ0X2VxdWFsIG5pbCwgQGZpbHRlcnMudXJsX2VuY29kZShuaWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X3VybF9kZWNvZGUKKyAgICBhc3NlcnRfZXF1YWwgJ2ZvbyBiYXInLCBAZmlsdGVycy51cmxfZGVjb2RlKCdmb28rYmFyJykKKyAgICBhc3NlcnRfZXF1YWwgJ2ZvbyBiYXInLCBAZmlsdGVycy51cmxfZGVjb2RlKCdmb28lMjBiYXInKQorICAgIGFzc2VydF9lcXVhbCAnZm9vKzFAZXhhbXBsZS5jb20nLCBAZmlsdGVycy51cmxfZGVjb2RlKCdmb28lMkIxJTQwZXhhbXBsZS5jb20nKQorICAgIGFzc2VydF9lcXVhbCBuaWwsIEBmaWx0ZXJzLnVybF9kZWNvZGUobmlsKQorICBlbmQKKworICBkZWYgdGVzdF90cnVuY2F0ZXdvcmRzCisgICAgYXNzZXJ0X2VxdWFsICdvbmUgdHdvIHRocmVlJywgQGZpbHRlcnMudHJ1bmNhdGV3b3Jkcygnb25lIHR3byB0aHJlZScsIDQpCisgICAgYXNzZXJ0X2VxdWFsICdvbmUgdHdvLi4uJywgQGZpbHRlcnMudHJ1bmNhdGV3b3Jkcygnb25lIHR3byB0aHJlZScsIDIpCisgICAgYXNzZXJ0X2VxdWFsICdvbmUgdHdvIHRocmVlJywgQGZpbHRlcnMudHJ1bmNhdGV3b3Jkcygnb25lIHR3byB0aHJlZScpCisgICAgYXNzZXJ0X2VxdWFsICdUd28gc21hbGwgKDEzJiM4MjIxOyB4IDUuNSYjODIyMTsgeCAxMCYjODIyMTsgaGlnaCkgYmFza2V0cyBmaXQgaW5zaWRlIG9uZSBsYXJnZSBiYXNrZXQgKDEzJiM4MjIxOy4uLicsIEBmaWx0ZXJzLnRydW5jYXRld29yZHMoJ1R3byBzbWFsbCAoMTMmIzgyMjE7IHggNS41JiM4MjIxOyB4IDEwJiM4MjIxOyBoaWdoKSBiYXNrZXRzIGZpdCBpbnNpZGUgb25lIGxhcmdlIGJhc2tldCAoMTMmIzgyMjE7IHggMTYmIzgyMjE7IHggMTAuNSYjODIyMTsgaGlnaCkgd2l0aCBjb3Zlci4nLCAxNSkKKyAgICBhc3NlcnRfZXF1YWwgIua1i+ivlea1i+ivlea1i+ivlea1i+ivlSIsIEBmaWx0ZXJzLnRydW5jYXRld29yZHMoJ+a1i+ivlea1i+ivlea1i+ivlea1i+ivlScsIDUpCisgICAgYXNzZXJ0X2VxdWFsICdvbmUgdHdvMScsIEBmaWx0ZXJzLnRydW5jYXRld29yZHMoIm9uZSB0d28gdGhyZWUiLCAyLCAxKQorICBlbmQKKworICBkZWYgdGVzdF9zdHJpcF9odG1sCisgICAgYXNzZXJ0X2VxdWFsICd0ZXN0JywgQGZpbHRlcnMuc3RyaXBfaHRtbCgiPGRpdj50ZXN0PC9kaXY+IikKKyAgICBhc3NlcnRfZXF1YWwgJ3Rlc3QnLCBAZmlsdGVycy5zdHJpcF9odG1sKCI8ZGl2IGlkPSd0ZXN0Jz50ZXN0PC9kaXY+IikKKyAgICBhc3NlcnRfZXF1YWwgJycsIEBmaWx0ZXJzLnN0cmlwX2h0bWwoIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz5kb2N1bWVudC53cml0ZSgnc29tZSBzdHVmZicpOzwvc2NyaXB0PiIpCisgICAgYXNzZXJ0X2VxdWFsICcnLCBAZmlsdGVycy5zdHJpcF9odG1sKCI8c3R5bGUgdHlwZT0ndGV4dC9jc3MnPmZvbyBiYXI8L3N0eWxlPiIpCisgICAgYXNzZXJ0X2VxdWFsICd0ZXN0JywgQGZpbHRlcnMuc3RyaXBfaHRtbCgiPGRpdlxuY2xhc3M9J211bHRpbGluZSc+dGVzdDwvZGl2PiIpCisgICAgYXNzZXJ0X2VxdWFsICd0ZXN0JywgQGZpbHRlcnMuc3RyaXBfaHRtbCgiPCEtLSBmb28gYmFyIFxuIHRlc3QgLS0+dGVzdCIpCisgICAgYXNzZXJ0X2VxdWFsICcnLCBAZmlsdGVycy5zdHJpcF9odG1sKG5pbCkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfam9pbgorICAgIGFzc2VydF9lcXVhbCAnMSAyIDMgNCcsIEBmaWx0ZXJzLmpvaW4oWzEsIDIsIDMsIDRdKQorICAgIGFzc2VydF9lcXVhbCAnMSAtIDIgLSAzIC0gNCcsIEBmaWx0ZXJzLmpvaW4oWzEsIDIsIDMsIDRdLCAnIC0gJykKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc29ydAorICAgIGFzc2VydF9lcXVhbCBbMSwgMiwgMywgNF0sIEBmaWx0ZXJzLnNvcnQoWzQsIDMsIDIsIDFdKQorICAgIGFzc2VydF9lcXVhbCBbeyAiYSIgPT4gMSB9LCB7ICJhIiA9PiAyIH0sIHsgImEiID0+IDMgfSwgeyAiYSIgPT4gNCB9XSwgQGZpbHRlcnMuc29ydChbeyAiYSIgPT4gNCB9LCB7ICJhIiA9PiAzIH0sIHsgImEiID0+IDEgfSwgeyAiYSIgPT4gMiB9XSwgImEiKQorICBlbmQKKworICBkZWYgdGVzdF9zb3J0X3doZW5fcHJvcGVydHlfaXNfc29tZXRpbWVzX21pc3NpbmdfcHV0c19uaWxzX2xhc3QKKyAgICBpbnB1dCA9IFsKKyAgICAgIHsgInByaWNlIiA9PiA0LCAiaGFuZGxlIiA9PiAiYWxwaGEiIH0sCisgICAgICB7ICJoYW5kbGUiID0+ICJiZXRhIiB9LAorICAgICAgeyAicHJpY2UiID0+IDEsICJoYW5kbGUiID0+ICJnYW1tYSIgfSwKKyAgICAgIHsgImhhbmRsZSIgPT4gImRlbHRhIiB9LAorICAgICAgeyAicHJpY2UiID0+IDIsICJoYW5kbGUiID0+ICJlcHNpbG9uIiB9CisgICAgXQorICAgIGV4cGVjdGF0aW9uID0gWworICAgICAgeyAicHJpY2UiID0+IDEsICJoYW5kbGUiID0+ICJnYW1tYSIgfSwKKyAgICAgIHsgInByaWNlIiA9PiAyLCAiaGFuZGxlIiA9PiAiZXBzaWxvbiIgfSwKKyAgICAgIHsgInByaWNlIiA9PiA0LCAiaGFuZGxlIiA9PiAiYWxwaGEiIH0sCisgICAgICB7ICJoYW5kbGUiID0+ICJkZWx0YSIgfSwKKyAgICAgIHsgImhhbmRsZSIgPT4gImJldGEiIH0KKyAgICBdCisgICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGF0aW9uLCBAZmlsdGVycy5zb3J0KGlucHV0LCAicHJpY2UiKQorICBlbmQKKworICBkZWYgdGVzdF9zb3J0X2VtcHR5X2FycmF5CisgICAgYXNzZXJ0X2VxdWFsIFtdLCBAZmlsdGVycy5zb3J0KFtdLCAiYSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NvcnRfbmF0dXJhbF9lbXB0eV9hcnJheQorICAgIGFzc2VydF9lcXVhbCBbXSwgQGZpbHRlcnMuc29ydF9uYXR1cmFsKFtdLCAiYSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2xlZ2FjeV9zb3J0X2hhc2gKKyAgICBhc3NlcnRfZXF1YWwgW3sgYTogMSwgYjogMiB9XSwgQGZpbHRlcnMuc29ydCh7IGE6IDEsIGI6IDIgfSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbnVtZXJpY2FsX3ZzX2xleGljb2dyYXBoaWNhbF9zb3J0CisgICAgYXNzZXJ0X2VxdWFsIFsyLCAxMF0sIEBmaWx0ZXJzLnNvcnQoWzEwLCAyXSkKKyAgICBhc3NlcnRfZXF1YWwgW3sgImEiID0+IDIgfSwgeyAiYSIgPT4gMTAgfV0sIEBmaWx0ZXJzLnNvcnQoW3sgImEiID0+IDEwIH0sIHsgImEiID0+IDIgfV0sICJhIikKKyAgICBhc3NlcnRfZXF1YWwgWyIxMCIsICIyIl0sIEBmaWx0ZXJzLnNvcnQoWyIxMCIsICIyIl0pCisgICAgYXNzZXJ0X2VxdWFsIFt7ICJhIiA9PiAiMTAiIH0sIHsgImEiID0+ICIyIiB9XSwgQGZpbHRlcnMuc29ydChbeyAiYSIgPT4gIjEwIiB9LCB7ICJhIiA9PiAiMiIgfV0sICJhIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5pcQorICAgIGFzc2VydF9lcXVhbCBbImZvbyJdLCBAZmlsdGVycy51bmlxKCJmb28iKQorICAgIGFzc2VydF9lcXVhbCBbMSwgMywgMiwgNF0sIEBmaWx0ZXJzLnVuaXEoWzEsIDEsIDMsIDIsIDMsIDEsIDQsIDMsIDIsIDFdKQorICAgIGFzc2VydF9lcXVhbCBbeyAiYSIgPT4gMSB9LCB7ICJhIiA9PiAzIH0sIHsgImEiID0+IDIgfV0sIEBmaWx0ZXJzLnVuaXEoW3sgImEiID0+IDEgfSwgeyAiYSIgPT4gMyB9LCB7ICJhIiA9PiAxIH0sIHsgImEiID0+IDIgfV0sICJhIikKKyAgICB0ZXN0ZHJvcCA9IFRlc3REcm9wLm5ldworICAgIGFzc2VydF9lcXVhbCBbdGVzdGRyb3BdLCBAZmlsdGVycy51bmlxKFt0ZXN0ZHJvcCwgVGVzdERyb3AubmV3XSwgJ3Rlc3QnKQorICBlbmQKKworICBkZWYgdGVzdF91bmlxX2VtcHR5X2FycmF5CisgICAgYXNzZXJ0X2VxdWFsIFtdLCBAZmlsdGVycy51bmlxKFtdLCAiYSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBhY3RfZW1wdHlfYXJyYXkKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBmaWx0ZXJzLmNvbXBhY3QoW10sICJhIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmV2ZXJzZQorICAgIGFzc2VydF9lcXVhbCBbNCwgMywgMiwgMV0sIEBmaWx0ZXJzLnJldmVyc2UoWzEsIDIsIDMsIDRdKQorICBlbmQKKworICBkZWYgdGVzdF9sZWdhY3lfcmV2ZXJzZV9oYXNoCisgICAgYXNzZXJ0X2VxdWFsIFt7IGE6IDEsIGI6IDIgfV0sIEBmaWx0ZXJzLnJldmVyc2UoYTogMSwgYjogMikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwCisgICAgYXNzZXJ0X2VxdWFsIFsxLCAyLCAzLCA0XSwgQGZpbHRlcnMubWFwKFt7ICJhIiA9PiAxIH0sIHsgImEiID0+IDIgfSwgeyAiYSIgPT4gMyB9LCB7ICJhIiA9PiA0IH1dLCAnYScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnYWJjJywgInt7IGFyeSB8IG1hcDonZm9vJyB8IG1hcDonYmFyJyB9fSIsCisgICAgICAnYXJ5JyA9PiBbeyAnZm9vJyA9PiB7ICdiYXInID0+ICdhJyB9IH0sIHsgJ2ZvbycgPT4geyAnYmFyJyA9PiAnYicgfSB9LCB7ICdmb28nID0+IHsgJ2JhcicgPT4gJ2MnIH0gfV0KKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX2RvZXNudF9jYWxsX2FyYml0cmFyeV9zdHVmZgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIiIsICd7eyAiZm9vIiB8IG1hcDogIl9faWRfXyIgfX0nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiIiwgJ3t7ICJmb28iIHwgbWFwOiAiaW5zcGVjdCIgfX0nCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF9jYWxsc190b19saXF1aWQKKyAgICB0ID0gVGVzdFRoaW5nLm5ldworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIndvb3Q6IDEiLCAne3sgZm9vIHwgbWFwOiAid2hhdGV2ZXIiIH19JywgImZvbyIgPT4gW3RdCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF9vbl9oYXNoZXMKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI0MjE3IiwgJ3t7IHRoaW5nIHwgbWFwOiAiZm9vIiB8IG1hcDogImJhciIgfX0nLAorICAgICAgInRoaW5nIiA9PiB7ICJmb28iID0+IFsgeyAiYmFyIiA9PiA0MiB9LCB7ICJiYXIiID0+IDE3IH0gXSB9CisgIGVuZAorCisgIGRlZiB0ZXN0X2xlZ2FjeV9tYXBfb25faGFzaGVzX3dpdGhfZHluYW1pY19rZXkKKyAgICB0ZW1wbGF0ZSA9ICJ7JSBhc3NpZ24ga2V5ID0gJ2ZvbycgJX17eyB0aGluZyB8IG1hcDoga2V5IHwgbWFwOiAnYmFyJyB9fSIKKyAgICBoYXNoID0geyAiZm9vIiA9PiB7ICJiYXIiID0+IDQyIH0gfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjQyIiwgdGVtcGxhdGUsICJ0aGluZyIgPT4gaGFzaAorICBlbmQKKworICBkZWYgdGVzdF9zb3J0X2NhbGxzX3RvX2xpcXVpZAorICAgIHQgPSBUZXN0VGhpbmcubmV3CisgICAgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgne3sgZm9vIHwgc29ydDogIndoYXRldmVyIiB9fScpLnJlbmRlcigiZm9vIiA9PiBbdF0pCisgICAgYXNzZXJ0IHQuZm9vID4gMAorICBlbmQKKworICBkZWYgdGVzdF9tYXBfb3Zlcl9wcm9jCisgICAgZHJvcCA9IFRlc3REcm9wLm5ldworICAgIHAgPSBwcm9jeyBkcm9wIH0KKyAgICB0ZW1wbCA9ICd7eyBwcm9jcyB8IG1hcDogInRlc3QiIH19JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgInRlc3Rmb28iLCB0ZW1wbCwgInByb2NzIiA9PiBbcF0KKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX292ZXJfZHJvcHNfcmV0dXJuaW5nX3Byb2NzCisgICAgZHJvcHMgPSBbCisgICAgICB7CisgICAgICAgICJwcm9jIiA9PiAtPnsgImZvbyIgfSwKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJwcm9jIiA9PiAtPnsgImJhciIgfSwKKyAgICAgIH0sCisgICAgXQorICAgIHRlbXBsID0gJ3t7IGRyb3BzIHwgbWFwOiAicHJvYyIgfX0nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiZm9vYmFyIiwgdGVtcGwsICJkcm9wcyIgPT4gZHJvcHMKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX3dvcmtzX29uX2VudW1lcmFibGVzCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiMTIzIiwgJ3t7IGZvbyB8IG1hcDogImZvbyIgfX0nLCAiZm9vIiA9PiBUZXN0RW51bWVyYWJsZS5uZXcKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc29ydF93b3Jrc19vbl9lbnVtZXJhYmxlcworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjIxMyIsICd7eyBmb28gfCBzb3J0OiAiYmFyIiB8IG1hcDogImZvbyIgfX0nLCAiZm9vIiA9PiBUZXN0RW51bWVyYWJsZS5uZXcKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmlyc3RfYW5kX2xhc3RfY2FsbF90b19saXF1aWQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICdmb29iYXInLCAne3sgZm9vIHwgZmlyc3QgfX0nLCAnZm9vJyA9PiBbVGhpbmdXaXRoVG9MaXF1aWQubmV3XQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJ2Zvb2JhcicsICd7eyBmb28gfCBsYXN0IH19JywgJ2ZvbycgPT4gW1RoaW5nV2l0aFRvTGlxdWlkLm5ld10KKyAgZW5kCisKKyAgZGVmIHRlc3RfdHJ1bmNhdGVfY2FsbHNfdG9fbGlxdWlkCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAid28uLi4iLCAne3sgZm9vIHwgdHJ1bmNhdGU6IDUgfX0nLCAiZm9vIiA9PiBUZXN0VGhpbmcubmV3CisgIGVuZAorCisgIGRlZiB0ZXN0X2RhdGUKKyAgICBhc3NlcnRfZXF1YWwgJ01heScsIEBmaWx0ZXJzLmRhdGUoVGltZS5wYXJzZSgiMjAwNi0wNS0wNSAxMDowMDowMCIpLCAiJUIiKQorICAgIGFzc2VydF9lcXVhbCAnSnVuZScsIEBmaWx0ZXJzLmRhdGUoVGltZS5wYXJzZSgiMjAwNi0wNi0wNSAxMDowMDowMCIpLCAiJUIiKQorICAgIGFzc2VydF9lcXVhbCAnSnVseScsIEBmaWx0ZXJzLmRhdGUoVGltZS5wYXJzZSgiMjAwNi0wNy0wNSAxMDowMDowMCIpLCAiJUIiKQorCisgICAgYXNzZXJ0X2VxdWFsICdNYXknLCBAZmlsdGVycy5kYXRlKCIyMDA2LTA1LTA1IDEwOjAwOjAwIiwgIiVCIikKKyAgICBhc3NlcnRfZXF1YWwgJ0p1bmUnLCBAZmlsdGVycy5kYXRlKCIyMDA2LTA2LTA1IDEwOjAwOjAwIiwgIiVCIikKKyAgICBhc3NlcnRfZXF1YWwgJ0p1bHknLCBAZmlsdGVycy5kYXRlKCIyMDA2LTA3LTA1IDEwOjAwOjAwIiwgIiVCIikKKworICAgIGFzc2VydF9lcXVhbCAnMjAwNi0wNy0wNSAxMDowMDowMCcsIEBmaWx0ZXJzLmRhdGUoIjIwMDYtMDctMDUgMTA6MDA6MDAiLCAiIikKKyAgICBhc3NlcnRfZXF1YWwgJzIwMDYtMDctMDUgMTA6MDA6MDAnLCBAZmlsdGVycy5kYXRlKCIyMDA2LTA3LTA1IDEwOjAwOjAwIiwgIiIpCisgICAgYXNzZXJ0X2VxdWFsICcyMDA2LTA3LTA1IDEwOjAwOjAwJywgQGZpbHRlcnMuZGF0ZSgiMjAwNi0wNy0wNSAxMDowMDowMCIsICIiKQorICAgIGFzc2VydF9lcXVhbCAnMjAwNi0wNy0wNSAxMDowMDowMCcsIEBmaWx0ZXJzLmRhdGUoIjIwMDYtMDctMDUgMTA6MDA6MDAiLCBuaWwpCisKKyAgICBhc3NlcnRfZXF1YWwgJzA3LzA1LzIwMDYnLCBAZmlsdGVycy5kYXRlKCIyMDA2LTA3LTA1IDEwOjAwOjAwIiwgIiVtLyVkLyVZIikKKworICAgIGFzc2VydF9lcXVhbCAiMDcvMTYvMjAwNCIsIEBmaWx0ZXJzLmRhdGUoIkZyaSBKdWwgMTYgMDE6MDA6MDAgMjAwNCIsICIlbS8lZC8lWSIpCisgICAgYXNzZXJ0X2VxdWFsICIje0RhdGUudG9kYXkueWVhcn0iLCBAZmlsdGVycy5kYXRlKCdub3cnLCAnJVknKQorICAgIGFzc2VydF9lcXVhbCAiI3tEYXRlLnRvZGF5LnllYXJ9IiwgQGZpbHRlcnMuZGF0ZSgndG9kYXknLCAnJVknKQorICAgIGFzc2VydF9lcXVhbCAiI3tEYXRlLnRvZGF5LnllYXJ9IiwgQGZpbHRlcnMuZGF0ZSgnVG9kYXknLCAnJVknKQorCisgICAgYXNzZXJ0X2VxdWFsIG5pbCwgQGZpbHRlcnMuZGF0ZShuaWwsICIlQiIpCisKKyAgICBhc3NlcnRfZXF1YWwgJycsIEBmaWx0ZXJzLmRhdGUoJycsICIlQiIpCisKKyAgICB3aXRoX3RpbWV6b25lKCJVVEMiKSBkbworICAgICAgYXNzZXJ0X2VxdWFsICIwNy8wNS8yMDA2IiwgQGZpbHRlcnMuZGF0ZSgxMTUyMDk4OTU1LCAiJW0vJWQvJVkiKQorICAgICAgYXNzZXJ0X2VxdWFsICIwNy8wNS8yMDA2IiwgQGZpbHRlcnMuZGF0ZSgiMTE1MjA5ODk1NSIsICIlbS8lZC8lWSIpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2ZpcnN0X2xhc3QKKyAgICBhc3NlcnRfZXF1YWwgMSwgQGZpbHRlcnMuZmlyc3QoWzEsIDIsIDNdKQorICAgIGFzc2VydF9lcXVhbCAzLCBAZmlsdGVycy5sYXN0KFsxLCAyLCAzXSkKKyAgICBhc3NlcnRfZXF1YWwgbmlsLCBAZmlsdGVycy5maXJzdChbXSkKKyAgICBhc3NlcnRfZXF1YWwgbmlsLCBAZmlsdGVycy5sYXN0KFtdKQorICBlbmQKKworICBkZWYgdGVzdF9yZXBsYWNlCisgICAgYXNzZXJ0X2VxdWFsICcyIDIgMiAyJywgQGZpbHRlcnMucmVwbGFjZSgnMSAxIDEgMScsICcxJywgMikKKyAgICBhc3NlcnRfZXF1YWwgJzIgMiAyIDInLCBAZmlsdGVycy5yZXBsYWNlKCcxIDEgMSAxJywgMSwgMikKKyAgICBhc3NlcnRfZXF1YWwgJzIgMSAxIDEnLCBAZmlsdGVycy5yZXBsYWNlX2ZpcnN0KCcxIDEgMSAxJywgJzEnLCAyKQorICAgIGFzc2VydF9lcXVhbCAnMiAxIDEgMScsIEBmaWx0ZXJzLnJlcGxhY2VfZmlyc3QoJzEgMSAxIDEnLCAxLCAyKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJzIgMSAxIDEnLCAie3sgJzEgMSAxIDEnIHwgcmVwbGFjZV9maXJzdDogJzEnLCAyIH19IgorICBlbmQKKworICBkZWYgdGVzdF9yZW1vdmUKKyAgICBhc3NlcnRfZXF1YWwgJyAgICcsIEBmaWx0ZXJzLnJlbW92ZSgiYSBhIGEgYSIsICdhJykKKyAgICBhc3NlcnRfZXF1YWwgJyAgICcsIEBmaWx0ZXJzLnJlbW92ZSgiMSAxIDEgMSIsIDEpCisgICAgYXNzZXJ0X2VxdWFsICdhIGEgYScsIEBmaWx0ZXJzLnJlbW92ZV9maXJzdCgiYSBhIGEgYSIsICdhICcpCisgICAgYXNzZXJ0X2VxdWFsICcgMSAxIDEnLCBAZmlsdGVycy5yZW1vdmVfZmlyc3QoIjEgMSAxIDEiLCAxKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJ2EgYSBhJywgInt7ICdhIGEgYSBhJyB8IHJlbW92ZV9maXJzdDogJ2EgJyB9fSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGlwZXNfaW5fc3RyaW5nX2FyZ3VtZW50cworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJ2Zvb2JhcicsICJ7eyAnZm9vfGJhcicgfCByZW1vdmU6ICd8JyB9fSIKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyaXAKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICdhYiBjJywgInt7IHNvdXJjZSB8IHN0cmlwIH19IiwgJ3NvdXJjZScgPT4gIiBhYiBjICAiCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnYWIgYycsICJ7eyBzb3VyY2UgfCBzdHJpcCB9fSIsICdzb3VyY2UnID0+ICIgXHRhYiBjICBcbiBcdCIKKyAgZW5kCisKKyAgZGVmIHRlc3RfbHN0cmlwCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnYWIgYyAgJywgInt7IHNvdXJjZSB8IGxzdHJpcCB9fSIsICdzb3VyY2UnID0+ICIgYWIgYyAgIgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgImFiIGMgIFxuIFx0IiwgInt7IHNvdXJjZSB8IGxzdHJpcCB9fSIsICdzb3VyY2UnID0+ICIgXHRhYiBjICBcbiBcdCIKKyAgZW5kCisKKyAgZGVmIHRlc3RfcnN0cmlwCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiIGFiIGMiLCAie3sgc291cmNlIHwgcnN0cmlwIH19IiwgJ3NvdXJjZScgPT4gIiBhYiBjICAiCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiIFx0YWIgYyIsICJ7eyBzb3VyY2UgfCByc3RyaXAgfX0iLCAnc291cmNlJyA9PiAiIFx0YWIgYyAgXG4gXHQiCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmlwX25ld2xpbmVzCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnYWJjJywgInt7IHNvdXJjZSB8IHN0cmlwX25ld2xpbmVzIH19IiwgJ3NvdXJjZScgPT4gImFcbmJcbmMiCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnYWJjJywgInt7IHNvdXJjZSB8IHN0cmlwX25ld2xpbmVzIH19IiwgJ3NvdXJjZScgPT4gImFcclxuYlxuYyIKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmV3bGluZXNfdG9fYnIKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICJhPGJyIC8+XG5iPGJyIC8+XG5jIiwgInt7IHNvdXJjZSB8IG5ld2xpbmVfdG9fYnIgfX0iLCAnc291cmNlJyA9PiAiYVxuYlxuYyIKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGx1cworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjIiLCAie3sgMSB8IHBsdXM6MSB9fSIKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICIyLjAiLCAie3sgJzEnIHwgcGx1czonMS4wJyB9fSIKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjUiLCAie3sgcHJpY2UgfCBwbHVzOicyJyB9fSIsICdwcmljZScgPT4gTnVtYmVyTGlrZVRoaW5nLm5ldygzKQorICBlbmQKKworICBkZWYgdGVzdF9taW51cworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjQiLCAie3sgaW5wdXQgfCBtaW51czpvcGVyYW5kIH19IiwgJ2lucHV0JyA9PiA1LCAnb3BlcmFuZCcgPT4gMQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjIuMyIsICJ7eyAnNC4zJyB8IG1pbnVzOicyJyB9fSIKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjUiLCAie3sgcHJpY2UgfCBtaW51czonMicgfX0iLCAncHJpY2UnID0+IE51bWJlckxpa2VUaGluZy5uZXcoNykKKyAgZW5kCisKKyAgZGVmIHRlc3RfYWJzCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiMTciLCAie3sgMTcgfCBhYnMgfX0iCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiMTciLCAie3sgLTE3IHwgYWJzIH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjE3IiwgInt7ICcxNycgfCBhYnMgfX0iCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiMTciLCAie3sgJy0xNycgfCBhYnMgfX0iCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiMCIsICJ7eyAwIHwgYWJzIH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjAiLCAie3sgJzAnIHwgYWJzIH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjE3LjQyIiwgInt7IDE3LjQyIHwgYWJzIH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjE3LjQyIiwgInt7IC0xNy40MiB8IGFicyB9fSIKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICIxNy40MiIsICJ7eyAnMTcuNDInIHwgYWJzIH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjE3LjQyIiwgInt7ICctMTcuNDInIHwgYWJzIH19IgorICBlbmQKKworICBkZWYgdGVzdF90aW1lcworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjEyIiwgInt7IDMgfCB0aW1lczo0IH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjAiLCAie3sgJ2ZvbycgfCB0aW1lczo0IH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjYiLCAie3sgJzIuMScgfCB0aW1lczozIHwgcmVwbGFjZTogJy4nLCctJyB8IHBsdXM6MH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjcuMjUiLCAie3sgMC4wNzI1IHwgdGltZXM6MTAwIH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIi03LjI1IiwgJ3t7ICItMC4wNzI1IiB8IHRpbWVzOjEwMCB9fScKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI3LjI1IiwgJ3t7ICItMC4wNzI1IiB8IHRpbWVzOiAtMTAwIH19JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjQiLCAie3sgcHJpY2UgfCB0aW1lczoyIH19IiwgJ3ByaWNlJyA9PiBOdW1iZXJMaWtlVGhpbmcubmV3KDIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2RpdmlkZWRfYnkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI0IiwgInt7IDEyIHwgZGl2aWRlZF9ieTozIH19IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjQiLCAie3sgMTQgfCBkaXZpZGVkX2J5OjMgfX0iCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI1IiwgInt7IDE1IHwgZGl2aWRlZF9ieTozIH19IgorICAgIGFzc2VydF9lcXVhbCAiTGlxdWlkIGVycm9yOiBkaXZpZGVkIGJ5IDAiLCBUZW1wbGF0ZS5wYXJzZSgie3sgNSB8IGRpdmlkZWRfYnk6MCB9fSIpLnJlbmRlcgorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiMC41IiwgInt7IDIuMCB8IGRpdmlkZWRfYnk6NCB9fSIKKyAgICBhc3NlcnRfcmFpc2VzKExpcXVpZDo6WmVyb0RpdmlzaW9uRXJyb3IpIGRvCisgICAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI0IiwgInt7IDEgfCBtb2R1bG86IDAgfX0iCisgICAgZW5kCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI1IiwgInt7IHByaWNlIHwgZGl2aWRlZF9ieToyIH19IiwgJ3ByaWNlJyA9PiBOdW1iZXJMaWtlVGhpbmcubmV3KDEwKQorICBlbmQKKworICBkZWYgdGVzdF9tb2R1bG8KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICIxIiwgInt7IDMgfCBtb2R1bG86MiB9fSIKKyAgICBhc3NlcnRfcmFpc2VzKExpcXVpZDo6WmVyb0RpdmlzaW9uRXJyb3IpIGRvCisgICAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI0IiwgInt7IDEgfCBtb2R1bG86IDAgfX0iCisgICAgZW5kCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICIxIiwgInt7IHByaWNlIHwgbW9kdWxvOjIgfX0iLCAncHJpY2UnID0+IE51bWJlckxpa2VUaGluZy5uZXcoMykKKyAgZW5kCisKKyAgZGVmIHRlc3Rfcm91bmQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI1IiwgInt7IGlucHV0IHwgcm91bmQgfX0iLCAnaW5wdXQnID0+IDQuNgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjQiLCAie3sgJzQuMycgfCByb3VuZCB9fSIKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI0LjU2IiwgInt7IGlucHV0IHwgcm91bmQ6IDIgfX0iLCAnaW5wdXQnID0+IDQuNTYxMgorICAgIGFzc2VydF9yYWlzZXMoTGlxdWlkOjpGbG9hdERvbWFpbkVycm9yKSBkbworICAgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiNCIsICJ7eyAxLjAgfCBkaXZpZGVkX2J5OiAwLjAgfCByb3VuZCB9fSIKKyAgICBlbmQKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjUiLCAie3sgcHJpY2UgfCByb3VuZCB9fSIsICdwcmljZScgPT4gTnVtYmVyTGlrZVRoaW5nLm5ldyg0LjYpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiNCIsICJ7eyBwcmljZSB8IHJvdW5kIH19IiwgJ3ByaWNlJyA9PiBOdW1iZXJMaWtlVGhpbmcubmV3KDQuMykKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2VpbAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjUiLCAie3sgaW5wdXQgfCBjZWlsIH19IiwgJ2lucHV0JyA9PiA0LjYKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI1IiwgInt7ICc0LjMnIHwgY2VpbCB9fSIKKyAgICBhc3NlcnRfcmFpc2VzKExpcXVpZDo6RmxvYXREb21haW5FcnJvcikgZG8KKyAgICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjQiLCAie3sgMS4wIHwgZGl2aWRlZF9ieTogMC4wIHwgY2VpbCB9fSIKKyAgICBlbmQKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjUiLCAie3sgcHJpY2UgfCBjZWlsIH19IiwgJ3ByaWNlJyA9PiBOdW1iZXJMaWtlVGhpbmcubmV3KDQuNikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmxvb3IKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI0IiwgInt7IGlucHV0IHwgZmxvb3IgfX0iLCAnaW5wdXQnID0+IDQuNgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjQiLCAie3sgJzQuMycgfCBmbG9vciB9fSIKKyAgICBhc3NlcnRfcmFpc2VzKExpcXVpZDo6RmxvYXREb21haW5FcnJvcikgZG8KKyAgICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIjQiLCAie3sgMS4wIHwgZGl2aWRlZF9ieTogMC4wIHwgZmxvb3IgfX0iCisgICAgZW5kCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICI1IiwgInt7IHByaWNlIHwgZmxvb3IgfX0iLCAncHJpY2UnID0+IE51bWJlckxpa2VUaGluZy5uZXcoNS40KQorICBlbmQKKworICBkZWYgdGVzdF9hcHBlbmQKKyAgICBhc3NpZ25zID0geyAnYScgPT4gJ2JjJywgJ2InID0+ICdkJyB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnYmNkJywgInt7IGEgfCBhcHBlbmQ6ICdkJ319IiwgYXNzaWducykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdiY2QnLCAie3sgYSB8IGFwcGVuZDogYn19IiwgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29uY2F0CisgICAgYXNzZXJ0X2VxdWFsIFsxLCAyLCAzLCA0XSwgQGZpbHRlcnMuY29uY2F0KFsxLCAyXSwgWzMsIDRdKQorICAgIGFzc2VydF9lcXVhbCBbMSwgMiwgJ2EnXSwgIEBmaWx0ZXJzLmNvbmNhdChbMSwgMl0sIFsnYSddKQorICAgIGFzc2VydF9lcXVhbCBbMSwgMiwgMTBdLCAgIEBmaWx0ZXJzLmNvbmNhdChbMSwgMl0sIFsxMF0pCisKKyAgICBhc3NlcnRfcmFpc2VzKExpcXVpZDo6QXJndW1lbnRFcnJvciwgImNvbmNhdCBmaWx0ZXIgcmVxdWlyZXMgYW4gYXJyYXkgYXJndW1lbnQiKSBkbworICAgICAgQGZpbHRlcnMuY29uY2F0KFsxLCAyXSwgMTApCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3ByZXBlbmQKKyAgICBhc3NpZ25zID0geyAnYScgPT4gJ2JjJywgJ2InID0+ICdhJyB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnYWJjJywgInt7IGEgfCBwcmVwZW5kOiAnYSd9fSIsIGFzc2lnbnMpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnYWJjJywgInt7IGEgfCBwcmVwZW5kOiBifX0iLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9kZWZhdWx0CisgICAgYXNzZXJ0X2VxdWFsICJmb28iLCBAZmlsdGVycy5kZWZhdWx0KCJmb28iLCAiYmFyIikKKyAgICBhc3NlcnRfZXF1YWwgImJhciIsIEBmaWx0ZXJzLmRlZmF1bHQobmlsLCAiYmFyIikKKyAgICBhc3NlcnRfZXF1YWwgImJhciIsIEBmaWx0ZXJzLmRlZmF1bHQoIiIsICJiYXIiKQorICAgIGFzc2VydF9lcXVhbCAiYmFyIiwgQGZpbHRlcnMuZGVmYXVsdChmYWxzZSwgImJhciIpCisgICAgYXNzZXJ0X2VxdWFsICJiYXIiLCBAZmlsdGVycy5kZWZhdWx0KFtdLCAiYmFyIikKKyAgICBhc3NlcnRfZXF1YWwgImJhciIsIEBmaWx0ZXJzLmRlZmF1bHQoe30sICJiYXIiKQorICBlbmQKKworICBkZWYgdGVzdF9jYW5ub3RfYWNjZXNzX3ByaXZhdGVfbWV0aG9kcworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2EnLCAie3sgJ2EnIHwgdG9fbnVtYmVyIH19IikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGF0ZV9yYWlzZXNfbm90aGluZworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICJ7eyAnJyB8IGRhdGU6ICclRCcgfX0iKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2FiYycsICJ7eyAnYWJjJyB8IGRhdGU6ICclRCcgfX0iKQorICBlbmQKKworICBwcml2YXRlCisKKyAgZGVmIHdpdGhfdGltZXpvbmUodHopCisgICAgb2xkX3R6ID0gRU5WWydUWiddCisgICAgRU5WWydUWiddID0gdHoKKyAgICB5aWVsZAorICBlbnN1cmUKKyAgICBFTlZbJ1RaJ10gPSBvbGRfdHoKKyAgZW5kCitlbmQgIyBTdGFuZGFyZEZpbHRlcnNUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL2JyZWFrX3RhZ190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy9icmVha190YWdfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJkZTgzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy9icmVha190YWdfdGVzdC5yYgpAQCAtMCwwICsxLDE1IEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgQnJlYWtUYWdUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICAjIHRlc3RzIHRoYXQgbm8gd2VpcmQgZXJyb3JzIGFyZSByYWlzZWQgaWYgYnJlYWsgaXMgY2FsbGVkIG91dHNpZGUgb2YgYQorICAjIGJsb2NrCisgIGRlZiB0ZXN0X2JyZWFrX3dpdGhfbm9fYmxvY2sKKyAgICBhc3NpZ25zID0geyAnaScgPT4gMSB9CisgICAgbWFya3VwID0gJ3slIGJyZWFrICV9JworICAgIGV4cGVjdGVkID0gJycKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvY29udGludWVfdGFnX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL2NvbnRpbnVlX3RhZ190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNGMxNTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL2NvbnRpbnVlX3RhZ190ZXN0LnJiCkBAIC0wLDAgKzEsMTUgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBDb250aW51ZVRhZ1Rlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgICMgdGVzdHMgdGhhdCBubyB3ZWlyZCBlcnJvcnMgYXJlIHJhaXNlZCBpZiBjb250aW51ZSBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhCisgICMgYmxvY2sKKyAgZGVmIHRlc3RfY29udGludWVfd2l0aF9ub19ibG9jaworICAgIGFzc2lnbnMgPSB7fQorICAgIG1hcmt1cCA9ICd7JSBjb250aW51ZSAlfScKKyAgICBleHBlY3RlZCA9ICcnCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCBtYXJrdXAsIGFzc2lnbnMpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL2Zvcl90YWdfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvZm9yX3RhZ190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDM5NmYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL2Zvcl90YWdfdGVzdC5yYgpAQCAtMCwwICsxLDQxMCBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIFRoaW5nV2l0aFZhbHVlIDwgTGlxdWlkOjpEcm9wCisgIGRlZiB2YWx1ZQorICAgIDMKKyAgZW5kCitlbmQKKworY2xhc3MgRm9yVGFnVGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgZGVmIHRlc3RfZm9yCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIHlvICB5byAgeW8gIHlvICcsICd7JWZvciBpdGVtIGluIGFycmF5JX0geW8geyVlbmRmb3IlfScsICdhcnJheScgPT4gWzEsIDIsIDMsIDRdKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ3lveW8nLCAneyVmb3IgaXRlbSBpbiBhcnJheSV9eW97JWVuZGZvciV9JywgJ2FycmF5JyA9PiBbMSwgMl0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIHlvICcsICd7JWZvciBpdGVtIGluIGFycmF5JX0geW8geyVlbmRmb3IlfScsICdhcnJheScgPT4gWzFdKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JWZvciBpdGVtIGluIGFycmF5JX17JWVuZGZvciV9JywgJ2FycmF5JyA9PiBbMSwgMl0pCisgICAgZXhwZWN0ZWQgPSA8PEhFUkUKKworICB5bworCisgIHlvCisKKyAgeW8KKworSEVSRQorICAgIHRlbXBsYXRlID0gPDxIRVJFCit7JWZvciBpdGVtIGluIGFycmF5JX0KKyAgeW8KK3slZW5kZm9yJX0KK0hFUkUKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZW1wbGF0ZSwgJ2FycmF5JyA9PiBbMSwgMiwgM10pCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zvcl9yZXZlcnNlZAorICAgIGFzc2lnbnMgPSB7ICdhcnJheScgPT4gWyAxLCAyLCAzXSB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnMzIxJywgJ3slZm9yIGl0ZW0gaW4gYXJyYXkgcmV2ZXJzZWQgJX17e2l0ZW19fXslZW5kZm9yJX0nLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9mb3Jfd2l0aF9yYW5nZQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyAxICAyICAzICcsICd7JWZvciBpdGVtIGluICgxLi4zKSAlfSB7e2l0ZW19fSB7JWVuZGZvciV9JykKKworICAgIGFzc2VydF9yYWlzZXMoTGlxdWlkOjpBcmd1bWVudEVycm9yKSBkbworICAgICAgVGVtcGxhdGUucGFyc2UoJ3slIGZvciBpIGluIChhLi4yKSAlfXslIGVuZGZvciAlfScpLnJlbmRlciEoImEiID0+IFsxLCAyXSkKKyAgICBlbmQKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyAwICAxICAyICAzICcsICd7JSBmb3IgaXRlbSBpbiAoYS4uMykgJX0ge3tpdGVtfX0geyUgZW5kZm9yICV9JywgImEiID0+ICJpbnZhbGlkIGludGVnZXIiKQorICBlbmQKKworICBkZWYgdGVzdF9mb3Jfd2l0aF92YXJpYWJsZV9yYW5nZQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyAxICAyICAzICcsICd7JWZvciBpdGVtIGluICgxLi5mb29iYXIpICV9IHt7aXRlbX19IHslZW5kZm9yJX0nLCAiZm9vYmFyIiA9PiAzKQorICBlbmQKKworICBkZWYgdGVzdF9mb3Jfd2l0aF9oYXNoX3ZhbHVlX3JhbmdlCisgICAgZm9vYmFyID0geyAidmFsdWUiID0+IDMgfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyAxICAyICAzICcsICd7JWZvciBpdGVtIGluICgxLi5mb29iYXIudmFsdWUpICV9IHt7aXRlbX19IHslZW5kZm9yJX0nLCAiZm9vYmFyIiA9PiBmb29iYXIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zvcl93aXRoX2Ryb3BfdmFsdWVfcmFuZ2UKKyAgICBmb29iYXIgPSBUaGluZ1dpdGhWYWx1ZS5uZXcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgMSAgMiAgMyAnLCAneyVmb3IgaXRlbSBpbiAoMS4uZm9vYmFyLnZhbHVlKSAlfSB7e2l0ZW19fSB7JWVuZGZvciV9JywgImZvb2JhciIgPT4gZm9vYmFyKQorICBlbmQKKworICBkZWYgdGVzdF9mb3Jfd2l0aF92YXJpYWJsZQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyAxICAyICAzICcsICd7JWZvciBpdGVtIGluIGFycmF5JX0ge3tpdGVtfX0geyVlbmRmb3IlfScsICdhcnJheScgPT4gWzEsIDIsIDNdKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzEyMycsICd7JWZvciBpdGVtIGluIGFycmF5JX17e2l0ZW19fXslZW5kZm9yJX0nLCAnYXJyYXknID0+IFsxLCAyLCAzXSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcxMjMnLCAneyUgZm9yIGl0ZW0gaW4gYXJyYXkgJX17e2l0ZW19fXslIGVuZGZvciAlfScsICdhcnJheScgPT4gWzEsIDIsIDNdKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2FiY2QnLCAneyVmb3IgaXRlbSBpbiBhcnJheSV9e3tpdGVtfX17JWVuZGZvciV9JywgJ2FycmF5JyA9PiBbJ2EnLCAnYicsICdjJywgJ2QnXSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdhIGIgYycsICd7JWZvciBpdGVtIGluIGFycmF5JX17e2l0ZW19fXslZW5kZm9yJX0nLCAnYXJyYXknID0+IFsnYScsICcgJywgJ2InLCAnICcsICdjJ10pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnYWJjJywgJ3slZm9yIGl0ZW0gaW4gYXJyYXklfXt7aXRlbX19eyVlbmRmb3IlfScsICdhcnJheScgPT4gWydhJywgJycsICdiJywgJycsICdjJ10pCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zvcl9oZWxwZXJzCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiBbMSwgMiwgM10gfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyAxLzMgIDIvMyAgMy8zICcsCisgICAgICAneyVmb3IgaXRlbSBpbiBhcnJheSV9IHt7Zm9ybG9vcC5pbmRleH19L3t7Zm9ybG9vcC5sZW5ndGh9fSB7JWVuZGZvciV9JywKKyAgICAgIGFzc2lnbnMpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIDEgIDIgIDMgJywgJ3slZm9yIGl0ZW0gaW4gYXJyYXklfSB7e2Zvcmxvb3AuaW5kZXh9fSB7JWVuZGZvciV9JywgYXNzaWducykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgMCAgMSAgMiAnLCAneyVmb3IgaXRlbSBpbiBhcnJheSV9IHt7Zm9ybG9vcC5pbmRleDB9fSB7JWVuZGZvciV9JywgYXNzaWducykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgMiAgMSAgMCAnLCAneyVmb3IgaXRlbSBpbiBhcnJheSV9IHt7Zm9ybG9vcC5yaW5kZXgwfX0geyVlbmRmb3IlfScsIGFzc2lnbnMpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIDMgIDIgIDEgJywgJ3slZm9yIGl0ZW0gaW4gYXJyYXklfSB7e2Zvcmxvb3AucmluZGV4fX0geyVlbmRmb3IlfScsIGFzc2lnbnMpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIHRydWUgIGZhbHNlICBmYWxzZSAnLCAneyVmb3IgaXRlbSBpbiBhcnJheSV9IHt7Zm9ybG9vcC5maXJzdH19IHslZW5kZm9yJX0nLCBhc3NpZ25zKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBmYWxzZSAgZmFsc2UgIHRydWUgJywgJ3slZm9yIGl0ZW0gaW4gYXJyYXklfSB7e2Zvcmxvb3AubGFzdH19IHslZW5kZm9yJX0nLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9mb3JfYW5kX2lmCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiBbMSwgMiwgM10gfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJystLScsCisgICAgICAneyVmb3IgaXRlbSBpbiBhcnJheSV9eyUgaWYgZm9ybG9vcC5maXJzdCAlfSt7JSBlbHNlICV9LXslIGVuZGlmICV9eyVlbmRmb3IlfScsCisgICAgICBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9mb3JfZWxzZQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJysrKycsICd7JWZvciBpdGVtIGluIGFycmF5JX0reyVlbHNlJX0teyVlbmRmb3IlfScsICdhcnJheScgPT4gWzEsIDIsIDNdKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJy0nLCAgICd7JWZvciBpdGVtIGluIGFycmF5JX0reyVlbHNlJX0teyVlbmRmb3IlfScsICdhcnJheScgPT4gW10pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnLScsICAgJ3slZm9yIGl0ZW0gaW4gYXJyYXklfSt7JWVsc2UlfS17JWVuZGZvciV9JywgJ2FycmF5JyA9PiBuaWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpbWl0aW5nCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMF0gfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzEyJywgJ3slZm9yIGkgaW4gYXJyYXkgbGltaXQ6MiAlfXt7IGkgfX17JWVuZGZvciV9JywgYXNzaWducykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcxMjM0JywgJ3slZm9yIGkgaW4gYXJyYXkgbGltaXQ6NCAlfXt7IGkgfX17JWVuZGZvciV9JywgYXNzaWducykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCczNDU2JywgJ3slZm9yIGkgaW4gYXJyYXkgbGltaXQ6NCBvZmZzZXQ6MiAlfXt7IGkgfX17JWVuZGZvciV9JywgYXNzaWducykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCczNDU2JywgJ3slZm9yIGkgaW4gYXJyYXkgbGltaXQ6IDQgb2Zmc2V0OiAyICV9e3sgaSB9fXslZW5kZm9yJX0nLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9keW5hbWljX3ZhcmlhYmxlX2xpbWl0aW5nCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMF0gfQorICAgIGFzc2lnbnNbJ2xpbWl0J10gPSAyCisgICAgYXNzaWduc1snb2Zmc2V0J10gPSAyCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCczNCcsICd7JWZvciBpIGluIGFycmF5IGxpbWl0OiBsaW1pdCBvZmZzZXQ6IG9mZnNldCAlfXt7IGkgfX17JWVuZGZvciV9JywgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2ZvcgorICAgIGFzc2lnbnMgPSB7ICdhcnJheScgPT4gW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dIH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcxMjM0NTYnLCAneyVmb3IgaXRlbSBpbiBhcnJheSV9eyVmb3IgaSBpbiBpdGVtJX17eyBpIH19eyVlbmRmb3IlfXslZW5kZm9yJX0nLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9vZmZzZXRfb25seQorICAgIGFzc2lnbnMgPSB7ICdhcnJheScgPT4gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDBdIH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCc4OTAnLCAneyVmb3IgaSBpbiBhcnJheSBvZmZzZXQ6NyAlfXt7IGkgfX17JWVuZGZvciV9JywgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGF1c2VfcmVzdW1lCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiB7ICdpdGVtcycgPT4gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDBdIH0gfQorICAgIG1hcmt1cCA9IDw8LU1LVVAKKyAgICAgIHslZm9yIGkgaW4gYXJyYXkuaXRlbXMgbGltaXQ6IDMgJX17e2l9fXslZW5kZm9yJX0KKyAgICAgIG5leHQKKyAgICAgIHslZm9yIGkgaW4gYXJyYXkuaXRlbXMgb2Zmc2V0OmNvbnRpbnVlIGxpbWl0OiAzICV9e3tpfX17JWVuZGZvciV9CisgICAgICBuZXh0CisgICAgICB7JWZvciBpIGluIGFycmF5Lml0ZW1zIG9mZnNldDpjb250aW51ZSBsaW1pdDogMyAlfXt7aX19eyVlbmRmb3IlfQorICAgICAgTUtVUAorICAgIGV4cGVjdGVkID0gPDwtWFBDVEQKKyAgICAgIDEyMworICAgICAgbmV4dAorICAgICAgNDU2CisgICAgICBuZXh0CisgICAgICA3ODkKKyAgICAgIFhQQ1RECisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgbWFya3VwLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9wYXVzZV9yZXN1bWVfbGltaXQKKyAgICBhc3NpZ25zID0geyAnYXJyYXknID0+IHsgJ2l0ZW1zJyA9PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMF0gfSB9CisgICAgbWFya3VwID0gPDwtTUtVUAorICAgICAgeyVmb3IgaSBpbiBhcnJheS5pdGVtcyBsaW1pdDozICV9e3tpfX17JWVuZGZvciV9CisgICAgICBuZXh0CisgICAgICB7JWZvciBpIGluIGFycmF5Lml0ZW1zIG9mZnNldDpjb250aW51ZSBsaW1pdDozICV9e3tpfX17JWVuZGZvciV9CisgICAgICBuZXh0CisgICAgICB7JWZvciBpIGluIGFycmF5Lml0ZW1zIG9mZnNldDpjb250aW51ZSBsaW1pdDoxICV9e3tpfX17JWVuZGZvciV9CisgICAgICBNS1VQCisgICAgZXhwZWN0ZWQgPSA8PC1YUENURAorICAgICAgMTIzCisgICAgICBuZXh0CisgICAgICA0NTYKKyAgICAgIG5leHQKKyAgICAgIDcKKyAgICAgIFhQQ1RECisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgbWFya3VwLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9wYXVzZV9yZXN1bWVfQklHX2xpbWl0CisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiB7ICdpdGVtcycgPT4gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDBdIH0gfQorICAgIG1hcmt1cCA9IDw8LU1LVVAKKyAgICAgIHslZm9yIGkgaW4gYXJyYXkuaXRlbXMgbGltaXQ6MyAlfXt7aX19eyVlbmRmb3IlfQorICAgICAgbmV4dAorICAgICAgeyVmb3IgaSBpbiBhcnJheS5pdGVtcyBvZmZzZXQ6Y29udGludWUgbGltaXQ6MyAlfXt7aX19eyVlbmRmb3IlfQorICAgICAgbmV4dAorICAgICAgeyVmb3IgaSBpbiBhcnJheS5pdGVtcyBvZmZzZXQ6Y29udGludWUgbGltaXQ6MTAwMCAlfXt7aX19eyVlbmRmb3IlfQorICAgICAgTUtVUAorICAgIGV4cGVjdGVkID0gPDwtWFBDVEQKKyAgICAgIDEyMworICAgICAgbmV4dAorICAgICAgNDU2CisgICAgICBuZXh0CisgICAgICA3ODkwCisgICAgICBYUENURAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGF1c2VfcmVzdW1lX0JJR19vZmZzZXQKKyAgICBhc3NpZ25zID0geyAnYXJyYXknID0+IHsgJ2l0ZW1zJyA9PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMF0gfSB9CisgICAgbWFya3VwID0gJ3slZm9yIGkgaW4gYXJyYXkuaXRlbXMgbGltaXQ6MyAlfXt7aX19eyVlbmRmb3IlfQorICAgICAgbmV4dAorICAgICAgeyVmb3IgaSBpbiBhcnJheS5pdGVtcyBvZmZzZXQ6Y29udGludWUgbGltaXQ6MyAlfXt7aX19eyVlbmRmb3IlfQorICAgICAgbmV4dAorICAgICAgeyVmb3IgaSBpbiBhcnJheS5pdGVtcyBvZmZzZXQ6Y29udGludWUgbGltaXQ6MyBvZmZzZXQ6MTAwMCAlfXt7aX19eyVlbmRmb3IlfScKKyAgICBleHBlY3RlZCA9ICcxMjMKKyAgICAgIG5leHQKKyAgICAgIDQ1NgorICAgICAgbmV4dAorICAgICAgJworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9yX3dpdGhfYnJlYWsKKyAgICBhc3NpZ25zID0geyAnYXJyYXknID0+IHsgJ2l0ZW1zJyA9PiBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdIH0gfQorCisgICAgbWFya3VwID0gJ3slIGZvciBpIGluIGFycmF5Lml0ZW1zICV9eyUgYnJlYWsgJX17JSBlbmRmb3IgJX0nCisgICAgZXhwZWN0ZWQgPSAiIgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKworICAgIG1hcmt1cCA9ICd7JSBmb3IgaSBpbiBhcnJheS5pdGVtcyAlfXt7IGkgfX17JSBicmVhayAlfXslIGVuZGZvciAlfScKKyAgICBleHBlY3RlZCA9ICIxIgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKworICAgIG1hcmt1cCA9ICd7JSBmb3IgaSBpbiBhcnJheS5pdGVtcyAlfXslIGJyZWFrICV9e3sgaSB9fXslIGVuZGZvciAlfScKKyAgICBleHBlY3RlZCA9ICIiCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgbWFya3VwLCBhc3NpZ25zKQorCisgICAgbWFya3VwID0gJ3slIGZvciBpIGluIGFycmF5Lml0ZW1zICV9e3sgaSB9fXslIGlmIGkgPiAzICV9eyUgYnJlYWsgJX17JSBlbmRpZiAlfXslIGVuZGZvciAlfScKKyAgICBleHBlY3RlZCA9ICIxMjM0IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKworICAgICMgdGVzdHMgdG8gZW5zdXJlIGl0IG9ubHkgYnJlYWtzIG91dCBvZiB0aGUgbG9jYWwgZm9yIGxvb3AKKyAgICAjIGFuZCBub3QgYWxsIG9mIHRoZW0uCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiBbWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0gfQorICAgIG1hcmt1cCA9ICd7JSBmb3IgaXRlbSBpbiBhcnJheSAlfScgXAorICAgICAgICAgICAgICAgJ3slIGZvciBpIGluIGl0ZW0gJX0nIFwKKyAgICAgICAgICAgICAgICAgJ3slIGlmIGkgPT0gMSAlfScgXAorICAgICAgICAgICAgICAgICAgICd7JSBicmVhayAlfScgXAorICAgICAgICAgICAgICAgICAneyUgZW5kaWYgJX0nIFwKKyAgICAgICAgICAgICAgICAgJ3t7IGkgfX0nIFwKKyAgICAgICAgICAgICAgICd7JSBlbmRmb3IgJX0nIFwKKyAgICAgICAgICAgICAneyUgZW5kZm9yICV9JworICAgIGV4cGVjdGVkID0gJzM0NTYnCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgbWFya3VwLCBhc3NpZ25zKQorCisgICAgIyB0ZXN0IGJyZWFrIGRvZXMgbm90aGluZyB3aGVuIHVucmVhY2hlZAorICAgIGFzc2lnbnMgPSB7ICdhcnJheScgPT4geyAnaXRlbXMnID0+IFsxLCAyLCAzLCA0LCA1XSB9IH0KKyAgICBtYXJrdXAgPSAneyUgZm9yIGkgaW4gYXJyYXkuaXRlbXMgJX17JSBpZiBpID09IDk5OTkgJX17JSBicmVhayAlfXslIGVuZGlmICV9e3sgaSB9fXslIGVuZGZvciAlfScKKyAgICBleHBlY3RlZCA9ICcxMjM0NScKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCBtYXJrdXAsIGFzc2lnbnMpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zvcl93aXRoX2NvbnRpbnVlCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiB7ICdpdGVtcycgPT4gWzEsIDIsIDMsIDQsIDVdIH0gfQorCisgICAgbWFya3VwID0gJ3slIGZvciBpIGluIGFycmF5Lml0ZW1zICV9eyUgY29udGludWUgJX17JSBlbmRmb3IgJX0nCisgICAgZXhwZWN0ZWQgPSAiIgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKworICAgIG1hcmt1cCA9ICd7JSBmb3IgaSBpbiBhcnJheS5pdGVtcyAlfXt7IGkgfX17JSBjb250aW51ZSAlfXslIGVuZGZvciAlfScKKyAgICBleHBlY3RlZCA9ICIxMjM0NSIKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCBtYXJrdXAsIGFzc2lnbnMpCisKKyAgICBtYXJrdXAgPSAneyUgZm9yIGkgaW4gYXJyYXkuaXRlbXMgJX17JSBjb250aW51ZSAlfXt7IGkgfX17JSBlbmRmb3IgJX0nCisgICAgZXhwZWN0ZWQgPSAiIgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKworICAgIG1hcmt1cCA9ICd7JSBmb3IgaSBpbiBhcnJheS5pdGVtcyAlfXslIGlmIGkgPiAzICV9eyUgY29udGludWUgJX17JSBlbmRpZiAlfXt7IGkgfX17JSBlbmRmb3IgJX0nCisgICAgZXhwZWN0ZWQgPSAiMTIzIgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKworICAgIG1hcmt1cCA9ICd7JSBmb3IgaSBpbiBhcnJheS5pdGVtcyAlfXslIGlmIGkgPT0gMyAlfXslIGNvbnRpbnVlICV9eyUgZWxzZSAlfXt7IGkgfX17JSBlbmRpZiAlfXslIGVuZGZvciAlfScKKyAgICBleHBlY3RlZCA9ICIxMjQ1IgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKworICAgICMgdGVzdHMgdG8gZW5zdXJlIGl0IG9ubHkgY29udGludWVzIHRoZSBsb2NhbCBmb3IgbG9vcCBhbmQgbm90IGFsbCBvZiB0aGVtLgorICAgIGFzc2lnbnMgPSB7ICdhcnJheScgPT4gW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dIH0KKyAgICBtYXJrdXAgPSAneyUgZm9yIGl0ZW0gaW4gYXJyYXkgJX0nIFwKKyAgICAgICAgICAgICAgICd7JSBmb3IgaSBpbiBpdGVtICV9JyBcCisgICAgICAgICAgICAgICAgICd7JSBpZiBpID09IDEgJX0nIFwKKyAgICAgICAgICAgICAgICAgICAneyUgY29udGludWUgJX0nIFwKKyAgICAgICAgICAgICAgICAgJ3slIGVuZGlmICV9JyBcCisgICAgICAgICAgICAgICAgICd7eyBpIH19JyBcCisgICAgICAgICAgICAgICAneyUgZW5kZm9yICV9JyBcCisgICAgICAgICAgICAgJ3slIGVuZGZvciAlfScKKyAgICBleHBlY3RlZCA9ICcyMzQ1NicKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCBtYXJrdXAsIGFzc2lnbnMpCisKKyAgICAjIHRlc3QgY29udGludWUgZG9lcyBub3RoaW5nIHdoZW4gdW5yZWFjaGVkCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiB7ICdpdGVtcycgPT4gWzEsIDIsIDMsIDQsIDVdIH0gfQorICAgIG1hcmt1cCA9ICd7JSBmb3IgaSBpbiBhcnJheS5pdGVtcyAlfXslIGlmIGkgPT0gOTk5OSAlfXslIGNvbnRpbnVlICV9eyUgZW5kaWYgJX17eyBpIH19eyUgZW5kZm9yICV9JworICAgIGV4cGVjdGVkID0gJzEyMzQ1JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIG1hcmt1cCwgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9yX3RhZ19zdHJpbmcKKyAgICAjIHJ1YnkgMS44LjcgIlN0cmluZyIuZWFjaCA9PiBFbnVtZXJhdG9yIHdpdGggc2luZ2xlICJTdHJpbmciIGVsZW1lbnQuCisgICAgIyBydWJ5IDEuOS4zIG5vIGxvbmdlciBzdXBwb3J0cyAuZWFjaCBvbiBTdHJpbmcgdGhvdWdoIHdlIG1pbWljCisgICAgIyB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ3Rlc3Qgc3RyaW5nJywKKyAgICAgICd7JWZvciB2YWwgaW4gc3RyaW5nJX17e3ZhbH19eyVlbmRmb3IlfScsCisgICAgICAnc3RyaW5nJyA9PiAidGVzdCBzdHJpbmciKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgndGVzdCBzdHJpbmcnLAorICAgICAgJ3slZm9yIHZhbCBpbiBzdHJpbmcgbGltaXQ6MSV9e3t2YWx9fXslZW5kZm9yJX0nLAorICAgICAgJ3N0cmluZycgPT4gInRlc3Qgc3RyaW5nIikKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ3ZhbC1zdHJpbmctMS0xLTAtMS0wLXRydWUtdHJ1ZS10ZXN0IHN0cmluZycsCisgICAgICAneyVmb3IgdmFsIGluIHN0cmluZyV9JyBcCisgICAgICAne3tmb3Jsb29wLm5hbWV9fS0nIFwKKyAgICAgICd7e2Zvcmxvb3AuaW5kZXh9fS0nIFwKKyAgICAgICd7e2Zvcmxvb3AubGVuZ3RofX0tJyBcCisgICAgICAne3tmb3Jsb29wLmluZGV4MH19LScgXAorICAgICAgJ3t7Zm9ybG9vcC5yaW5kZXh9fS0nIFwKKyAgICAgICd7e2Zvcmxvb3AucmluZGV4MH19LScgXAorICAgICAgJ3t7Zm9ybG9vcC5maXJzdH19LScgXAorICAgICAgJ3t7Zm9ybG9vcC5sYXN0fX0tJyBcCisgICAgICAne3t2YWx9fXslZW5kZm9yJX0nLAorICAgICAgJ3N0cmluZycgPT4gInRlc3Qgc3RyaW5nIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9yX3BhcmVudGxvb3BfcmVmZXJlbmNlc19wYXJlbnRfbG9vcAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzEuMSAxLjIgMS4zIDIuMSAyLjIgMi4zICcsCisgICAgICAneyUgZm9yIGlubmVyIGluIG91dGVyICV9eyUgZm9yIGsgaW4gaW5uZXIgJX0nIFwKKyAgICAgICd7eyBmb3Jsb29wLnBhcmVudGxvb3AuaW5kZXggfX0ue3sgZm9ybG9vcC5pbmRleCB9fSAnIFwKKyAgICAgICd7JSBlbmRmb3IgJX17JSBlbmRmb3IgJX0nLAorICAgICAgJ291dGVyJyA9PiBbWzEsIDEsIDFdLCBbMSwgMSwgMV1dKQorICBlbmQKKworICBkZWYgdGVzdF9mb3JfcGFyZW50bG9vcF9uaWxfd2hlbl9ub3RfcHJlc2VudAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJy4xIC4yICcsCisgICAgICAneyUgZm9yIGlubmVyIGluIG91dGVyICV9JyBcCisgICAgICAne3sgZm9ybG9vcC5wYXJlbnRsb29wLmluZGV4IH19Lnt7IGZvcmxvb3AuaW5kZXggfX0gJyBcCisgICAgICAneyUgZW5kZm9yICV9JywKKyAgICAgICdvdXRlcicgPT4gW1sxLCAxLCAxXSwgWzEsIDEsIDFdXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5uZXJfZm9yX292ZXJfZW1wdHlfaW5wdXQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICdvbycsICd7JSBmb3IgYSBpbiAoMS4uMikgJX1veyUgZm9yIGIgaW4gZW1wdHkgJX17JSBlbmRmb3IgJX17JSBlbmRmb3IgJX0nCisgIGVuZAorCisgIGRlZiB0ZXN0X2JsYW5rX3N0cmluZ19ub3RfaXRlcmFibGUKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAieyUgZm9yIGNoYXIgaW4gY2hhcmFjdGVycyAlfUkgV0lMTCBOT1QgQkUgT1VUUFVUeyUgZW5kZm9yICV9IiwgJ2NoYXJhY3RlcnMnID0+ICcnKQorICBlbmQKKworICBkZWYgdGVzdF9iYWRfdmFyaWFibGVfbmFtaW5nX2luX2Zvcl9sb29wCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6OlN5bnRheEVycm9yKSBkbworICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgneyUgZm9yIGEvYiBpbiB4ICV9eyUgZW5kZm9yICV9JykKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3BhY2luZ193aXRoX3ZhcmlhYmxlX25hbWluZ19pbl9mb3JfbG9vcAorICAgIGV4cGVjdGVkID0gJzEyMzQ1JworICAgIHRlbXBsYXRlID0gJ3slIGZvciAgICAgICBpdGVtICAgaW4gICBpdGVtcyAlfXt7aXRlbX19eyUgZW5kZm9yICV9JworICAgIGFzc2lnbnMgID0geyAnaXRlbXMnID0+IFsxLCAyLCAzLCA0LCA1XSB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGVtcGxhdGUsIGFzc2lnbnMpCisgIGVuZAorCisgIGNsYXNzIExvYWRlckRyb3AgPCBMaXF1aWQ6OkRyb3AKKyAgICBhdHRyX2FjY2Vzc29yIDplYWNoX2NhbGxlZCwgOmxvYWRfc2xpY2VfY2FsbGVkCisKKyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhKQorICAgICAgQGRhdGEgPSBkYXRhCisgICAgZW5kCisKKyAgICBkZWYgZWFjaAorICAgICAgQGVhY2hfY2FsbGVkID0gdHJ1ZQorICAgICAgQGRhdGEuZWFjaCB7IHxlbHwgeWllbGQgZWwgfQorICAgIGVuZAorCisgICAgZGVmIGxvYWRfc2xpY2UoZnJvbSwgdG8pCisgICAgICBAbG9hZF9zbGljZV9jYWxsZWQgPSB0cnVlCisgICAgICBAZGF0YVsoZnJvbS4udG8gLSAxKV0KKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfaXRlcmF0ZV93aXRoX2VhY2hfd2hlbl9ub19saW1pdF9hcHBsaWVkCisgICAgbG9hZGVyID0gTG9hZGVyRHJvcC5uZXcoWzEsIDIsIDMsIDQsIDVdKQorICAgIGFzc2lnbnMgPSB7ICdpdGVtcycgPT4gbG9hZGVyIH0KKyAgICBleHBlY3RlZCA9ICcxMjM0NScKKyAgICB0ZW1wbGF0ZSA9ICd7JSBmb3IgaXRlbSBpbiBpdGVtcyAlfXt7aXRlbX19eyUgZW5kZm9yICV9JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRlbXBsYXRlLCBhc3NpZ25zKQorICAgIGFzc2VydCBsb2FkZXIuZWFjaF9jYWxsZWQKKyAgICBhc3NlcnQgIWxvYWRlci5sb2FkX3NsaWNlX2NhbGxlZAorICBlbmQKKworICBkZWYgdGVzdF9pdGVyYXRlX3dpdGhfbG9hZF9zbGljZV93aGVuX2xpbWl0X2FwcGxpZWQKKyAgICBsb2FkZXIgPSBMb2FkZXJEcm9wLm5ldyhbMSwgMiwgMywgNCwgNV0pCisgICAgYXNzaWducyA9IHsgJ2l0ZW1zJyA9PiBsb2FkZXIgfQorICAgIGV4cGVjdGVkID0gJzEnCisgICAgdGVtcGxhdGUgPSAneyUgZm9yIGl0ZW0gaW4gaXRlbXMgbGltaXQ6MSAlfXt7aXRlbX19eyUgZW5kZm9yICV9JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRlbXBsYXRlLCBhc3NpZ25zKQorICAgIGFzc2VydCAhbG9hZGVyLmVhY2hfY2FsbGVkCisgICAgYXNzZXJ0IGxvYWRlci5sb2FkX3NsaWNlX2NhbGxlZAorICBlbmQKKworICBkZWYgdGVzdF9pdGVyYXRlX3dpdGhfbG9hZF9zbGljZV93aGVuX2xpbWl0X2FuZF9vZmZzZXRfYXBwbGllZAorICAgIGxvYWRlciA9IExvYWRlckRyb3AubmV3KFsxLCAyLCAzLCA0LCA1XSkKKyAgICBhc3NpZ25zID0geyAnaXRlbXMnID0+IGxvYWRlciB9CisgICAgZXhwZWN0ZWQgPSAnMzQnCisgICAgdGVtcGxhdGUgPSAneyUgZm9yIGl0ZW0gaW4gaXRlbXMgb2Zmc2V0OjIgbGltaXQ6MiAlfXt7aXRlbX19eyUgZW5kZm9yICV9JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRlbXBsYXRlLCBhc3NpZ25zKQorICAgIGFzc2VydCAhbG9hZGVyLmVhY2hfY2FsbGVkCisgICAgYXNzZXJ0IGxvYWRlci5sb2FkX3NsaWNlX2NhbGxlZAorICBlbmQKKworICBkZWYgdGVzdF9pdGVyYXRlX3dpdGhfbG9hZF9zbGljZV9yZXR1cm5zX3NhbWVfcmVzdWx0c19hc193aXRob3V0CisgICAgbG9hZGVyID0gTG9hZGVyRHJvcC5uZXcoWzEsIDIsIDMsIDQsIDVdKQorICAgIGxvYWRlcl9hc3NpZ25zID0geyAnaXRlbXMnID0+IGxvYWRlciB9CisgICAgYXJyYXlfYXNzaWducyA9IHsgJ2l0ZW1zJyA9PiBbMSwgMiwgMywgNCwgNV0gfQorICAgIGV4cGVjdGVkID0gJzM0JworICAgIHRlbXBsYXRlID0gJ3slIGZvciBpdGVtIGluIGl0ZW1zIG9mZnNldDoyIGxpbWl0OjIgJX17e2l0ZW19fXslIGVuZGZvciAlfScKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZW1wbGF0ZSwgbG9hZGVyX2Fzc2lnbnMpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGVtcGxhdGUsIGFycmF5X2Fzc2lnbnMpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zvcl9jbGVhbnNfdXBfcmVnaXN0ZXJzCisgICAgY29udGV4dCA9IENvbnRleHQubmV3KEVycm9yRHJvcC5uZXcpCisKKyAgICBhc3NlcnRfcmFpc2VzKFN0YW5kYXJkRXJyb3IpIGRvCisgICAgICBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7JSBmb3IgaSBpbiAoMS4uMikgJX17eyBzdGFuZGFyZF9lcnJvciB9fXslIGVuZGZvciAlfScpLnJlbmRlciEoY29udGV4dCkKKyAgICBlbmQKKworICAgIGFzc2VydCBjb250ZXh0LnJlZ2lzdGVyc1s6Zm9yX3N0YWNrXS5lbXB0eT8KKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvaWZfZWxzZV90YWdfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvaWZfZWxzZV90YWdfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWE1ZDNhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy9pZl9lbHNlX3RhZ190ZXN0LnJiCkBAIC0wLDAgKzEsMTg4IEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgSWZFbHNlVGFnVGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgZGVmIHRlc3RfaWYKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgICcsICcgeyUgaWYgZmFsc2UgJX0gdGhpcyB0ZXh0IHNob3VsZCBub3QgZ28gaW50byB0aGUgb3V0cHV0IHslIGVuZGlmICV9ICcpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnICB0aGlzIHRleHQgc2hvdWxkIGdvIGludG8gdGhlIG91dHB1dCAgJywKKyAgICAgICcgeyUgaWYgdHJ1ZSAlfSB0aGlzIHRleHQgc2hvdWxkIGdvIGludG8gdGhlIG91dHB1dCB7JSBlbmRpZiAlfSAnKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyAgeW91IHJvY2sgPycsICd7JSBpZiBmYWxzZSAlfSB5b3Ugc3VjayB7JSBlbmRpZiAlfSB7JSBpZiB0cnVlICV9IHlvdSByb2NrIHslIGVuZGlmICV9PycpCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpdGVyYWxfY29tcGFyaXNvbnMKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgTk8gJywgJ3slIGFzc2lnbiB2ID0gZmFsc2UgJX17JSBpZiB2ICV9IFlFUyB7JSBlbHNlICV9IE5PIHslIGVuZGlmICV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBhc3NpZ24gdiA9IG5pbCAlfXslIGlmIHYgPT0gbmlsICV9IFlFUyB7JSBlbHNlICV9IE5PIHslIGVuZGlmICV9JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWZfZWxzZQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIGZhbHNlICV9IE5PIHslIGVsc2UgJX0gWUVTIHslIGVuZGlmICV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiB0cnVlICV9IFlFUyB7JSBlbHNlICV9IE5PIHslIGVuZGlmICV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiAiZm9vIiAlfSBZRVMgeyUgZWxzZSAlfSBOTyB7JSBlbmRpZiAlfScpCisgIGVuZAorCisgIGRlZiB0ZXN0X2lmX2Jvb2xlYW4KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiB2YXIgJX0gWUVTIHslIGVuZGlmICV9JywgJ3ZhcicgPT4gdHJ1ZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWZfb3IKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiBhIG9yIGIgJX0gWUVTIHslIGVuZGlmICV9JywgJ2EnID0+IHRydWUsICdiJyA9PiB0cnVlKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIGEgb3IgYiAlfSBZRVMgeyUgZW5kaWYgJX0nLCAnYScgPT4gdHJ1ZSwgJ2InID0+IGZhbHNlKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIGEgb3IgYiAlfSBZRVMgeyUgZW5kaWYgJX0nLCAnYScgPT4gZmFsc2UsICdiJyA9PiB0cnVlKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICAgICAgJ3slIGlmIGEgb3IgYiAlfSBZRVMgeyUgZW5kaWYgJX0nLCAnYScgPT4gZmFsc2UsICdiJyA9PiBmYWxzZSkKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIGEgb3IgYiBvciBjICV9IFlFUyB7JSBlbmRpZiAlfScsICdhJyA9PiBmYWxzZSwgJ2InID0+IGZhbHNlLCAnYycgPT4gdHJ1ZSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAgICAgICd7JSBpZiBhIG9yIGIgb3IgYyAlfSBZRVMgeyUgZW5kaWYgJX0nLCAnYScgPT4gZmFsc2UsICdiJyA9PiBmYWxzZSwgJ2MnID0+IGZhbHNlKQorICBlbmQKKworICBkZWYgdGVzdF9pZl9vcl93aXRoX29wZXJhdG9ycworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIGEgPT0gdHJ1ZSBvciBiID09IHRydWUgJX0gWUVTIHslIGVuZGlmICV9JywgJ2EnID0+IHRydWUsICdiJyA9PiB0cnVlKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIGEgPT0gdHJ1ZSBvciBiID09IGZhbHNlICV9IFlFUyB7JSBlbmRpZiAlfScsICdhJyA9PiB0cnVlLCAnYicgPT4gdHJ1ZSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgaWYgYSA9PSBmYWxzZSBvciBiID09IGZhbHNlICV9IFlFUyB7JSBlbmRpZiAlfScsICdhJyA9PiB0cnVlLCAnYicgPT4gdHJ1ZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcGFyaXNvbl9vZl9zdHJpbmdzX2NvbnRhaW5pbmdfYW5kX29yX29yCisgICAgYXdmdWxfbWFya3VwID0gImEgPT0gJ2FuZCcgYW5kIGIgPT0gJ29yJyBhbmQgYyA9PSAnZm9vIGFuZCBiYXInIGFuZCBkID09ICdiYXIgb3IgYmF6JyBhbmQgZSA9PSAnZm9vJyBhbmQgZm9vIGFuZCBiYXIiCisgICAgYXNzaWducyA9IHsgJ2EnID0+ICdhbmQnLCAnYicgPT4gJ29yJywgJ2MnID0+ICdmb28gYW5kIGJhcicsICdkJyA9PiAnYmFyIG9yIGJheicsICdlJyA9PiAnZm9vJywgJ2ZvbycgPT4gdHJ1ZSwgJ2JhcicgPT4gdHJ1ZSB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAieyUgaWYgI3thd2Z1bF9tYXJrdXB9ICV9IFlFUyB7JSBlbmRpZiAlfSIsIGFzc2lnbnMpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBhcmlzb25fb2ZfZXhwcmVzc2lvbnNfc3RhcnRpbmdfd2l0aF9hbmRfb3Jfb3IKKyAgICBhc3NpZ25zID0geyAnb3JkZXInID0+IHsgJ2l0ZW1zX2NvdW50JyA9PiAwIH0sICdhbmRyb2lkJyA9PiB7ICduYW1lJyA9PiAnUm95JyB9IH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCJZRVMiLAorICAgICAgInslIGlmIGFuZHJvaWQubmFtZSA9PSAnUm95JyAlfVlFU3slIGVuZGlmICV9IiwKKyAgICAgIGFzc2lnbnMpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiWUVTIiwKKyAgICAgICJ7JSBpZiBvcmRlci5pdGVtc19jb3VudCA9PSAwICV9WUVTeyUgZW5kaWYgJX0iLAorICAgICAgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWZfYW5kCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAneyUgaWYgdHJ1ZSBhbmQgdHJ1ZSAlfSBZRVMgeyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBmYWxzZSBhbmQgdHJ1ZSAlfSBZRVMgeyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBmYWxzZSBhbmQgdHJ1ZSAlfSBZRVMgeyUgZW5kaWYgJX0nKQorICBlbmQKKworICBkZWYgdGVzdF9oYXNoX21pc3NfZ2VuZXJhdGVzX2ZhbHNlCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGlmIGZvby5iYXIgJX0gTk8geyUgZW5kaWYgJX0nLCAnZm9vJyA9PiB7fSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWZfZnJvbV92YXJpYWJsZQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiB2YXIgJX0gTk8geyUgZW5kaWYgJX0nLCAndmFyJyA9PiBmYWxzZSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgaWYgdmFyICV9IE5PIHslIGVuZGlmICV9JywgJ3ZhcicgPT4gbmlsKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBmb28uYmFyICV9IE5PIHslIGVuZGlmICV9JywgJ2ZvbycgPT4geyAnYmFyJyA9PiBmYWxzZSB9KQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBmb28uYmFyICV9IE5PIHslIGVuZGlmICV9JywgJ2ZvbycgPT4ge30pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGlmIGZvby5iYXIgJX0gTk8geyUgZW5kaWYgJX0nLCAnZm9vJyA9PiBuaWwpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGlmIGZvby5iYXIgJX0gTk8geyUgZW5kaWYgJX0nLCAnZm9vJyA9PiB0cnVlKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAneyUgaWYgdmFyICV9IFlFUyB7JSBlbmRpZiAlfScsICd2YXInID0+ICJ0ZXh0IikKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiB2YXIgJX0gWUVTIHslIGVuZGlmICV9JywgJ3ZhcicgPT4gdHJ1ZSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiB2YXIgJX0gWUVTIHslIGVuZGlmICV9JywgJ3ZhcicgPT4gMSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiB2YXIgJX0gWUVTIHslIGVuZGlmICV9JywgJ3ZhcicgPT4ge30pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAneyUgaWYgdmFyICV9IFlFUyB7JSBlbmRpZiAlfScsICd2YXInID0+IFtdKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmICJmb28iICV9IFlFUyB7JSBlbmRpZiAlfScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAneyUgaWYgZm9vLmJhciAlfSBZRVMgeyUgZW5kaWYgJX0nLCAnZm9vJyA9PiB7ICdiYXInID0+IHRydWUgfSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiBmb28uYmFyICV9IFlFUyB7JSBlbmRpZiAlfScsICdmb28nID0+IHsgJ2JhcicgPT4gInRleHQiIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAneyUgaWYgZm9vLmJhciAlfSBZRVMgeyUgZW5kaWYgJX0nLCAnZm9vJyA9PiB7ICdiYXInID0+IDEgfSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiBmb28uYmFyICV9IFlFUyB7JSBlbmRpZiAlfScsICdmb28nID0+IHsgJ2JhcicgPT4ge30gfSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiBmb28uYmFyICV9IFlFUyB7JSBlbmRpZiAlfScsICdmb28nID0+IHsgJ2JhcicgPT4gW10gfSkKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIHZhciAlfSBOTyB7JSBlbHNlICV9IFlFUyB7JSBlbmRpZiAlfScsICd2YXInID0+IGZhbHNlKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIHZhciAlfSBOTyB7JSBlbHNlICV9IFlFUyB7JSBlbmRpZiAlfScsICd2YXInID0+IG5pbCkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiB2YXIgJX0gWUVTIHslIGVsc2UgJX0gTk8geyUgZW5kaWYgJX0nLCAndmFyJyA9PiB0cnVlKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmICJmb28iICV9IFlFUyB7JSBlbHNlICV9IE5PIHslIGVuZGlmICV9JywgJ3ZhcicgPT4gInRleHQiKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAneyUgaWYgZm9vLmJhciAlfSBOTyB7JSBlbHNlICV9IFlFUyB7JSBlbmRpZiAlfScsICdmb28nID0+IHsgJ2JhcicgPT4gZmFsc2UgfSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiBmb28uYmFyICV9IFlFUyB7JSBlbHNlICV9IE5PIHslIGVuZGlmICV9JywgJ2ZvbycgPT4geyAnYmFyJyA9PiB0cnVlIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAneyUgaWYgZm9vLmJhciAlfSBZRVMgeyUgZWxzZSAlfSBOTyB7JSBlbmRpZiAlfScsICdmb28nID0+IHsgJ2JhcicgPT4gInRleHQiIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIFlFUyAnLCAneyUgaWYgZm9vLmJhciAlfSBOTyB7JSBlbHNlICV9IFlFUyB7JSBlbmRpZiAlfScsICdmb28nID0+IHsgJ25vdGJhcicgPT4gdHJ1ZSB9KQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIGZvby5iYXIgJX0gTk8geyUgZWxzZSAlfSBZRVMgeyUgZW5kaWYgJX0nLCAnZm9vJyA9PiB7fSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiBmb28uYmFyICV9IE5PIHslIGVsc2UgJX0gWUVTIHslIGVuZGlmICV9JywgJ25vdGZvbycgPT4geyAnYmFyJyA9PiB0cnVlIH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9pZgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBmYWxzZSAlfXslIGlmIGZhbHNlICV9IE5PIHslIGVuZGlmICV9eyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBmYWxzZSAlfXslIGlmIHRydWUgJX0gTk8geyUgZW5kaWYgJX17JSBlbmRpZiAlfScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGlmIHRydWUgJX17JSBpZiBmYWxzZSAlfSBOTyB7JSBlbmRpZiAlfXslIGVuZGlmICV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiB0cnVlICV9eyUgaWYgdHJ1ZSAlfSBZRVMgeyUgZW5kaWYgJX17JSBlbmRpZiAlfScpCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSBpZiB0cnVlICV9eyUgaWYgdHJ1ZSAlfSBZRVMgeyUgZWxzZSAlfSBOTyB7JSBlbmRpZiAlfXslIGVsc2UgJX0gTk8geyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIHRydWUgJX17JSBpZiBmYWxzZSAlfSBOTyB7JSBlbHNlICV9IFlFUyB7JSBlbmRpZiAlfXslIGVsc2UgJX0gTk8geyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIGlmIGZhbHNlICV9eyUgaWYgdHJ1ZSAlfSBOTyB7JSBlbHNlICV9IE5PTk8geyUgZW5kaWYgJX17JSBlbHNlICV9IFlFUyB7JSBlbmRpZiAlfScpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBhcmlzb25zX29uX251bGwKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgaWYgbnVsbCA8IDEwICV9IE5PIHslIGVuZGlmICV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgaWYgbnVsbCA8PSAxMCAlfSBOTyB7JSBlbmRpZiAlfScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGlmIG51bGwgPj0gMTAgJX0gTk8geyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBudWxsID4gMTAgJX0gTk8geyUgZW5kaWYgJX0nKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGlmIDEwIDwgbnVsbCAlfSBOTyB7JSBlbmRpZiAlfScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGlmIDEwIDw9IG51bGwgJX0gTk8geyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiAxMCA+PSBudWxsICV9IE5PIHslIGVuZGlmICV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgaWYgMTAgPiBudWxsICV9IE5PIHslIGVuZGlmICV9JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWxzZV9pZgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzAnLCAneyUgaWYgMCA9PSAwICV9MHslIGVsc2lmIDEgPT0gMSV9MXslIGVsc2UgJX0yeyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzEnLCAneyUgaWYgMCAhPSAwICV9MHslIGVsc2lmIDEgPT0gMSV9MXslIGVsc2UgJX0yeyUgZW5kaWYgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzInLCAneyUgaWYgMCAhPSAwICV9MHslIGVsc2lmIDEgIT0gMSV9MXslIGVsc2UgJX0yeyUgZW5kaWYgJX0nKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnZWxzaWYnLCAneyUgaWYgZmFsc2UgJX1pZnslIGVsc2lmIHRydWUgJX1lbHNpZnslIGVuZGlmICV9JykKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3ludGF4X2Vycm9yX25vX3ZhcmlhYmxlCisgICAgYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcil7IGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBqZXJyeSA9PSAxICV9JykgfQorICBlbmQKKworICBkZWYgdGVzdF9zeW50YXhfZXJyb3Jfbm9fZXhwcmVzc2lvbgorICAgIGFzc2VydF9yYWlzZXMoU3ludGF4RXJyb3IpIHsgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGlmICV9JykgfQorICBlbmQKKworICBkZWYgdGVzdF9pZl93aXRoX2N1c3RvbV9jb25kaXRpb24KKyAgICBvcmlnaW5hbF9vcCA9IENvbmRpdGlvbi5vcGVyYXRvcnNbJ2NvbnRhaW5zJ10KKyAgICBDb25kaXRpb24ub3BlcmF0b3JzWydjb250YWlucyddID0gOltdCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCd5ZXMnLCAlKHslIGlmICdib2InIGNvbnRhaW5zICdvJyAlfXllc3slIGVuZGlmICV9KSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdubycsICUoeyUgaWYgJ2JvYicgY29udGFpbnMgJ2YnICV9eWVzeyUgZWxzZSAlfW5veyUgZW5kaWYgJX0pKQorICBlbnN1cmUKKyAgICBDb25kaXRpb24ub3BlcmF0b3JzWydjb250YWlucyddID0gb3JpZ2luYWxfb3AKKyAgZW5kCisKKyAgZGVmIHRlc3Rfb3BlcmF0b3JzX2FyZV9pZ25vcmVkX3VubGVzc19pc29sYXRlZAorICAgIG9yaWdpbmFsX29wID0gQ29uZGl0aW9uLm9wZXJhdG9yc1snY29udGFpbnMnXQorICAgIENvbmRpdGlvbi5vcGVyYXRvcnNbJ2NvbnRhaW5zJ10gPSA6W10KKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ3llcycsCisgICAgICAlKHslIGlmICdnbm9tZXNsYWItYW5kLW9yLWxpcXVpZCcgY29udGFpbnMgJ2dub21lc2xhYi1hbmQtb3ItbGlxdWlkJyAlfXllc3slIGVuZGlmICV9KSkKKyAgZW5zdXJlCisgICAgQ29uZGl0aW9uLm9wZXJhdG9yc1snY29udGFpbnMnXSA9IG9yaWdpbmFsX29wCisgIGVuZAorCisgIGRlZiB0ZXN0X29wZXJhdG9yc19hcmVfd2hpdGVsaXN0ZWQKKyAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJSh7JSBpZiAxIG9yIHRocm93IG9yIG9yIDEgJX15ZXN7JSBlbmRpZiAlfSkpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpcGxlX2NvbmRpdGlvbnMKKyAgICB0cGwgPSAieyUgaWYgYSBvciBiIGFuZCBjICV9dHJ1ZXslIGVsc2UgJX1mYWxzZXslIGVuZGlmICV9IgorCisgICAgdGVzdHMgPSB7CisgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZV0gPT4gdHJ1ZSwKKyAgICAgIFt0cnVlLCB0cnVlLCBmYWxzZV0gPT4gdHJ1ZSwKKyAgICAgIFt0cnVlLCBmYWxzZSwgdHJ1ZV0gPT4gdHJ1ZSwKKyAgICAgIFt0cnVlLCBmYWxzZSwgZmFsc2VdID0+IHRydWUsCisgICAgICBbZmFsc2UsIHRydWUsIHRydWVdID0+IHRydWUsCisgICAgICBbZmFsc2UsIHRydWUsIGZhbHNlXSA9PiBmYWxzZSwKKyAgICAgIFtmYWxzZSwgZmFsc2UsIHRydWVdID0+IGZhbHNlLAorICAgICAgW2ZhbHNlLCBmYWxzZSwgZmFsc2VdID0+IGZhbHNlLAorICAgIH0KKworICAgIHRlc3RzLmVhY2ggZG8gfHZhbHMsIGV4cGVjdGVkfAorICAgICAgYSwgYiwgYyA9IHZhbHMKKyAgICAgIGFzc2lnbnMgPSB7ICdhJyA9PiBhLCAnYicgPT4gYiwgJ2MnID0+IGMgfQorICAgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCBleHBlY3RlZC50b19zLCB0cGwsIGFzc2lnbnMsIGFzc2lnbnMudG9fcworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy9pbmNsdWRlX3RhZ190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy9pbmNsdWRlX3RhZ190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGUzZjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL2luY2x1ZGVfdGFnX3Rlc3QucmIKQEAgLTAsMCArMSwyMzggQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBUZXN0RmlsZVN5c3RlbQorICBkZWYgcmVhZF90ZW1wbGF0ZV9maWxlKHRlbXBsYXRlX3BhdGgpCisgICAgY2FzZSB0ZW1wbGF0ZV9wYXRoCisgICAgd2hlbiAicHJvZHVjdCIKKyAgICAgICJQcm9kdWN0OiB7eyBwcm9kdWN0LnRpdGxlIH19ICIKKworICAgIHdoZW4gImxvY2FsZV92YXJpYWJsZXMiCisgICAgICAiTG9jYWxlOiB7e2VjaG8xfX0ge3tlY2hvMn19IgorCisgICAgd2hlbiAidmFyaWFudCIKKyAgICAgICJWYXJpYW50OiB7eyB2YXJpYW50LnRpdGxlIH19IgorCisgICAgd2hlbiAibmVzdGVkX3RlbXBsYXRlIgorICAgICAgInslIGluY2x1ZGUgJ2hlYWRlcicgJX0geyUgaW5jbHVkZSAnYm9keScgJX0geyUgaW5jbHVkZSAnZm9vdGVyJyAlfSIKKworICAgIHdoZW4gImJvZHkiCisgICAgICAiYm9keSB7JSBpbmNsdWRlICdib2R5X2RldGFpbCcgJX0iCisKKyAgICB3aGVuICJuZXN0ZWRfcHJvZHVjdF90ZW1wbGF0ZSIKKyAgICAgICJQcm9kdWN0OiB7eyBuZXN0ZWRfcHJvZHVjdF90ZW1wbGF0ZS50aXRsZSB9fSB7JWluY2x1ZGUgJ2RldGFpbHMnJX0gIgorCisgICAgd2hlbiAicmVjdXJzaXZlbHlfbmVzdGVkX3RlbXBsYXRlIgorICAgICAgIi17JSBpbmNsdWRlICdyZWN1cnNpdmVseV9uZXN0ZWRfdGVtcGxhdGUnICV9IgorCisgICAgd2hlbiAicGlja19hX3NvdXJjZSIKKyAgICAgICJmcm9tIFRlc3RGaWxlU3lzdGVtIgorCisgICAgd2hlbiAnYXNzaWdubWVudHMnCisgICAgICAieyUgYXNzaWduIGZvbyA9ICdiYXInICV9IgorCisgICAgZWxzZQorICAgICAgdGVtcGxhdGVfcGF0aAorICAgIGVuZAorICBlbmQKK2VuZAorCitjbGFzcyBPdGhlckZpbGVTeXN0ZW0KKyAgZGVmIHJlYWRfdGVtcGxhdGVfZmlsZSh0ZW1wbGF0ZV9wYXRoKQorICAgICdmcm9tIE90aGVyRmlsZVN5c3RlbScKKyAgZW5kCitlbmQKKworY2xhc3MgQ291bnRpbmdGaWxlU3lzdGVtCisgIGF0dHJfcmVhZGVyIDpjb3VudAorICBkZWYgcmVhZF90ZW1wbGF0ZV9maWxlKHRlbXBsYXRlX3BhdGgpCisgICAgQGNvdW50IHx8PSAwCisgICAgQGNvdW50ICs9IDEKKyAgICAnZnJvbSBDb3VudGluZ0ZpbGVTeXN0ZW0nCisgIGVuZAorZW5kCisKK2NsYXNzIEN1c3RvbUluY2x1ZGUgPCBMaXF1aWQ6OlRhZworICBTeW50YXggPSAvKCN7TGlxdWlkOjpRdW90ZWRGcmFnbWVudH0rKShccysoPzp3aXRofGZvcilccysoI3tMaXF1aWQ6OlF1b3RlZEZyYWdtZW50fSspKT8vbworCisgIGRlZiBpbml0aWFsaXplKHRhZ19uYW1lLCBtYXJrdXAsIHRva2VucykKKyAgICBtYXJrdXAgPX4gU3ludGF4CisgICAgQHRlbXBsYXRlX25hbWUgPSAkMQorICAgIHN1cGVyCisgIGVuZAorCisgIGRlZiBwYXJzZSh0b2tlbnMpCisgIGVuZAorCisgIGRlZiByZW5kZXIoY29udGV4dCkKKyAgICBAdGVtcGxhdGVfbmFtZVsxLi4tMl0KKyAgZW5kCitlbmQKKworY2xhc3MgSW5jbHVkZVRhZ1Rlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiBzZXR1cAorICAgIExpcXVpZDo6VGVtcGxhdGUuZmlsZV9zeXN0ZW0gPSBUZXN0RmlsZVN5c3RlbS5uZXcKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZV90YWdfbG9va3NfZm9yX2ZpbGVfc3lzdGVtX2luX3JlZ2lzdGVyc19maXJzdAorICAgIGFzc2VydF9lcXVhbCAnZnJvbSBPdGhlckZpbGVTeXN0ZW0nLAorICAgICAgVGVtcGxhdGUucGFyc2UoInslIGluY2x1ZGUgJ3BpY2tfYV9zb3VyY2UnICV9IikucmVuZGVyISh7fSwgcmVnaXN0ZXJzOiB7IGZpbGVfc3lzdGVtOiBPdGhlckZpbGVTeXN0ZW0ubmV3IH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X2luY2x1ZGVfdGFnX3dpdGgKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICJQcm9kdWN0OiBEcmFmdCAxNTFjbSAiLAorICAgICAgInslIGluY2x1ZGUgJ3Byb2R1Y3QnIHdpdGggcHJvZHVjdHNbMF0gJX0iLCAicHJvZHVjdHMiID0+IFsgeyAndGl0bGUnID0+ICdEcmFmdCAxNTFjbScgfSwgeyAndGl0bGUnID0+ICdFbGVtZW50IDE1NWNtJyB9IF0KKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZV90YWdfd2l0aF9kZWZhdWx0X25hbWUKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICJQcm9kdWN0OiBEcmFmdCAxNTFjbSAiLAorICAgICAgInslIGluY2x1ZGUgJ3Byb2R1Y3QnICV9IiwgInByb2R1Y3QiID0+IHsgJ3RpdGxlJyA9PiAnRHJhZnQgMTUxY20nIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZV90YWdfZm9yCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiUHJvZHVjdDogRHJhZnQgMTUxY20gUHJvZHVjdDogRWxlbWVudCAxNTVjbSAiLAorICAgICAgInslIGluY2x1ZGUgJ3Byb2R1Y3QnIGZvciBwcm9kdWN0cyAlfSIsICJwcm9kdWN0cyIgPT4gWyB7ICd0aXRsZScgPT4gJ0RyYWZ0IDE1MWNtJyB9LCB7ICd0aXRsZScgPT4gJ0VsZW1lbnQgMTU1Y20nIH0gXQorICBlbmQKKworICBkZWYgdGVzdF9pbmNsdWRlX3RhZ193aXRoX2xvY2FsX3ZhcmlhYmxlcworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIkxvY2FsZTogdGVzdDEyMyAiLCAieyUgaW5jbHVkZSAnbG9jYWxlX3ZhcmlhYmxlcycgZWNobzE6ICd0ZXN0MTIzJyAlfSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZV90YWdfd2l0aF9tdWx0aXBsZV9sb2NhbF92YXJpYWJsZXMKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICJMb2NhbGU6IHRlc3QxMjMgdGVzdDMyMSIsCisgICAgICAieyUgaW5jbHVkZSAnbG9jYWxlX3ZhcmlhYmxlcycgZWNobzE6ICd0ZXN0MTIzJywgZWNobzI6ICd0ZXN0MzIxJyAlfSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZV90YWdfd2l0aF9tdWx0aXBsZV9sb2NhbF92YXJpYWJsZXNfZnJvbV9jb250ZXh0CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiTG9jYWxlOiB0ZXN0MTIzIHRlc3QzMjEiLAorICAgICAgInslIGluY2x1ZGUgJ2xvY2FsZV92YXJpYWJsZXMnIGVjaG8xOiBlY2hvMSwgZWNobzI6IG1vcmVfZWNob3MuZWNobzIgJX0iLAorICAgICAgJ2VjaG8xJyA9PiAndGVzdDEyMycsICdtb3JlX2VjaG9zJyA9PiB7ICJlY2hvMiIgPT4gJ3Rlc3QzMjEnIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZWRfdGVtcGxhdGVzX2Fzc2lnbnNfdmFyaWFibGVzCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiYmFyIiwgInslIGluY2x1ZGUgJ2Fzc2lnbm1lbnRzJyAlfXt7IGZvbyB9fSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2luY2x1ZGVfdGFnCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiYm9keSBib2R5X2RldGFpbCIsICJ7JSBpbmNsdWRlICdib2R5JyAlfSIKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgImhlYWRlciBib2R5IGJvZHlfZGV0YWlsIGZvb3RlciIsICJ7JSBpbmNsdWRlICduZXN0ZWRfdGVtcGxhdGUnICV9IgorICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfaW5jbHVkZV93aXRoX3ZhcmlhYmxlCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiUHJvZHVjdDogRHJhZnQgMTUxY20gZGV0YWlscyAiLAorICAgICAgInslIGluY2x1ZGUgJ25lc3RlZF9wcm9kdWN0X3RlbXBsYXRlJyB3aXRoIHByb2R1Y3QgJX0iLCAicHJvZHVjdCIgPT4geyAidGl0bGUiID0+ICdEcmFmdCAxNTFjbScgfQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiUHJvZHVjdDogRHJhZnQgMTUxY20gZGV0YWlscyBQcm9kdWN0OiBFbGVtZW50IDE1NWNtIGRldGFpbHMgIiwKKyAgICAgICJ7JSBpbmNsdWRlICduZXN0ZWRfcHJvZHVjdF90ZW1wbGF0ZScgZm9yIHByb2R1Y3RzICV9IiwgInByb2R1Y3RzIiA9PiBbeyAidGl0bGUiID0+ICdEcmFmdCAxNTFjbScgfSwgeyAidGl0bGUiID0+ICdFbGVtZW50IDE1NWNtJyB9XQorICBlbmQKKworICBkZWYgdGVzdF9yZWN1cnNpdmVseV9pbmNsdWRlZF90ZW1wbGF0ZV9kb2VzX25vdF9wcm9kdWNlX2VuZGxlc3NfbG9vcAorICAgIGluZmluaXRlX2ZpbGVfc3lzdGVtID0gQ2xhc3MubmV3IGRvCisgICAgICBkZWYgcmVhZF90ZW1wbGF0ZV9maWxlKHRlbXBsYXRlX3BhdGgpCisgICAgICAgICIteyUgaW5jbHVkZSAnbG9vcCcgJX0iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIExpcXVpZDo6VGVtcGxhdGUuZmlsZV9zeXN0ZW0gPSBpbmZpbml0ZV9maWxlX3N5c3RlbS5uZXcKKworICAgIGFzc2VydF9yYWlzZXMoTGlxdWlkOjpTdGFja0xldmVsRXJyb3IsIFN5c3RlbVN0YWNrRXJyb3IpIGRvCisgICAgICBUZW1wbGF0ZS5wYXJzZSgieyUgaW5jbHVkZSAnbG9vcCcgJX0iKS5yZW5kZXIhCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2R5bmFtaWNhbGx5X2Nob29zZW5fdGVtcGxhdGUKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICJUZXN0MTIzIiwgInslIGluY2x1ZGUgdGVtcGxhdGUgJX0iLCAidGVtcGxhdGUiID0+ICdUZXN0MTIzJworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIlRlc3QzMjEiLCAieyUgaW5jbHVkZSB0ZW1wbGF0ZSAlfSIsICJ0ZW1wbGF0ZSIgPT4gJ1Rlc3QzMjEnCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICJQcm9kdWN0OiBEcmFmdCAxNTFjbSAiLCAieyUgaW5jbHVkZSB0ZW1wbGF0ZSBmb3IgcHJvZHVjdCAlfSIsCisgICAgICAidGVtcGxhdGUiID0+ICdwcm9kdWN0JywgJ3Byb2R1Y3QnID0+IHsgJ3RpdGxlJyA9PiAnRHJhZnQgMTUxY20nIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZV90YWdfY2FjaGVzX3NlY29uZF9yZWFkX29mX3NhbWVfcGFydGlhbAorICAgIGZpbGVfc3lzdGVtID0gQ291bnRpbmdGaWxlU3lzdGVtLm5ldworICAgIGFzc2VydF9lcXVhbCAnZnJvbSBDb3VudGluZ0ZpbGVTeXN0ZW1mcm9tIENvdW50aW5nRmlsZVN5c3RlbScsCisgICAgICBUZW1wbGF0ZS5wYXJzZSgieyUgaW5jbHVkZSAncGlja19hX3NvdXJjZScgJX17JSBpbmNsdWRlICdwaWNrX2Ffc291cmNlJyAlfSIpLnJlbmRlciEoe30sIHJlZ2lzdGVyczogeyBmaWxlX3N5c3RlbTogZmlsZV9zeXN0ZW0gfSkKKyAgICBhc3NlcnRfZXF1YWwgMSwgZmlsZV9zeXN0ZW0uY291bnQKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZV90YWdfZG9lc250X2NhY2hlX3BhcnRpYWxzX2Fjcm9zc19yZW5kZXJzCisgICAgZmlsZV9zeXN0ZW0gPSBDb3VudGluZ0ZpbGVTeXN0ZW0ubmV3CisgICAgYXNzZXJ0X2VxdWFsICdmcm9tIENvdW50aW5nRmlsZVN5c3RlbScsCisgICAgICBUZW1wbGF0ZS5wYXJzZSgieyUgaW5jbHVkZSAncGlja19hX3NvdXJjZScgJX0iKS5yZW5kZXIhKHt9LCByZWdpc3RlcnM6IHsgZmlsZV9zeXN0ZW06IGZpbGVfc3lzdGVtIH0pCisgICAgYXNzZXJ0X2VxdWFsIDEsIGZpbGVfc3lzdGVtLmNvdW50CisKKyAgICBhc3NlcnRfZXF1YWwgJ2Zyb20gQ291bnRpbmdGaWxlU3lzdGVtJywKKyAgICAgIFRlbXBsYXRlLnBhcnNlKCJ7JSBpbmNsdWRlICdwaWNrX2Ffc291cmNlJyAlfSIpLnJlbmRlciEoe30sIHJlZ2lzdGVyczogeyBmaWxlX3N5c3RlbTogZmlsZV9zeXN0ZW0gfSkKKyAgICBhc3NlcnRfZXF1YWwgMiwgZmlsZV9zeXN0ZW0uY291bnQKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5jbHVkZV90YWdfd2l0aGluX2lmX3N0YXRlbWVudAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgImZvb19pZl90cnVlIiwgInslIGlmIHRydWUgJX17JSBpbmNsdWRlICdmb29faWZfdHJ1ZScgJX17JSBlbmRpZiAlfSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3VzdG9tX2luY2x1ZGVfdGFnCisgICAgb3JpZ2luYWxfdGFnID0gTGlxdWlkOjpUZW1wbGF0ZS50YWdzWydpbmNsdWRlJ10KKyAgICBMaXF1aWQ6OlRlbXBsYXRlLnRhZ3NbJ2luY2x1ZGUnXSA9IEN1c3RvbUluY2x1ZGUKKyAgICBiZWdpbgorICAgICAgYXNzZXJ0X2VxdWFsICJjdXN0b21fZm9vIiwKKyAgICAgICAgVGVtcGxhdGUucGFyc2UoInslIGluY2x1ZGUgJ2N1c3RvbV9mb28nICV9IikucmVuZGVyIQorICAgIGVuc3VyZQorICAgICAgTGlxdWlkOjpUZW1wbGF0ZS50YWdzWydpbmNsdWRlJ10gPSBvcmlnaW5hbF90YWcKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3VzdG9tX2luY2x1ZGVfdGFnX3dpdGhpbl9pZl9zdGF0ZW1lbnQKKyAgICBvcmlnaW5hbF90YWcgPSBMaXF1aWQ6OlRlbXBsYXRlLnRhZ3NbJ2luY2x1ZGUnXQorICAgIExpcXVpZDo6VGVtcGxhdGUudGFnc1snaW5jbHVkZSddID0gQ3VzdG9tSW5jbHVkZQorICAgIGJlZ2luCisgICAgICBhc3NlcnRfZXF1YWwgImN1c3RvbV9mb29faWZfdHJ1ZSIsCisgICAgICAgIFRlbXBsYXRlLnBhcnNlKCJ7JSBpZiB0cnVlICV9eyUgaW5jbHVkZSAnY3VzdG9tX2Zvb19pZl90cnVlJyAlfXslIGVuZGlmICV9IikucmVuZGVyIQorICAgIGVuc3VyZQorICAgICAgTGlxdWlkOjpUZW1wbGF0ZS50YWdzWydpbmNsdWRlJ10gPSBvcmlnaW5hbF90YWcKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZG9lc19ub3RfYWRkX2Vycm9yX2luX3N0cmljdF9tb2RlX2Zvcl9taXNzaW5nX3ZhcmlhYmxlCisgICAgTGlxdWlkOjpUZW1wbGF0ZS5maWxlX3N5c3RlbSA9IFRlc3RGaWxlU3lzdGVtLm5ldworCisgICAgYSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJyB7JSBpbmNsdWRlICJuZXN0ZWRfdGVtcGxhdGUiICV9JykKKyAgICBhLnJlbmRlciEKKyAgICBhc3NlcnRfZW1wdHkgYS5lcnJvcnMKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFzc2luZ19vcHRpb25zX3RvX2luY2x1ZGVkX3RlbXBsYXRlcworICAgIGFzc2VydF9yYWlzZXMoTGlxdWlkOjpTeW50YXhFcnJvcikgZG8KKyAgICAgIFRlbXBsYXRlLnBhcnNlKCJ7JSBpbmNsdWRlIHRlbXBsYXRlICV9IiwgZXJyb3JfbW9kZTogOnN0cmljdCkucmVuZGVyISgidGVtcGxhdGUiID0+ICd7eyAiWCIgfHwgZG93bmNhc2UgfX0nKQorICAgIGVuZAorICAgIHdpdGhfZXJyb3JfbW9kZSg6bGF4KSBkbworICAgICAgYXNzZXJ0X2VxdWFsICd4JywgVGVtcGxhdGUucGFyc2UoInslIGluY2x1ZGUgdGVtcGxhdGUgJX0iLCBlcnJvcl9tb2RlOiA6c3RyaWN0LCBpbmNsdWRlX29wdGlvbnNfYmxhY2tsaXN0OiB0cnVlKS5yZW5kZXIhKCJ0ZW1wbGF0ZSIgPT4gJ3t7ICJYIiB8fCBkb3duY2FzZSB9fScpCisgICAgZW5kCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6OlN5bnRheEVycm9yKSBkbworICAgICAgVGVtcGxhdGUucGFyc2UoInslIGluY2x1ZGUgdGVtcGxhdGUgJX0iLCBlcnJvcl9tb2RlOiA6c3RyaWN0LCBpbmNsdWRlX29wdGlvbnNfYmxhY2tsaXN0OiBbOmxvY2FsZV0pLnJlbmRlciEoInRlbXBsYXRlIiA9PiAne3sgIlgiIHx8IGRvd25jYXNlIH19JykKKyAgICBlbmQKKyAgICB3aXRoX2Vycm9yX21vZGUoOmxheCkgZG8KKyAgICAgIGFzc2VydF9lcXVhbCAneCcsIFRlbXBsYXRlLnBhcnNlKCJ7JSBpbmNsdWRlIHRlbXBsYXRlICV9IiwgZXJyb3JfbW9kZTogOnN0cmljdCwgaW5jbHVkZV9vcHRpb25zX2JsYWNrbGlzdDogWzplcnJvcl9tb2RlXSkucmVuZGVyISgidGVtcGxhdGUiID0+ICd7eyAiWCIgfHwgZG93bmNhc2UgfX0nKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9yZW5kZXJfcmFpc2VfYXJndW1lbnRfZXJyb3Jfd2hlbl90ZW1wbGF0ZV9pc191bmRlZmluZWQKKyAgICBhc3NlcnRfcmFpc2VzKExpcXVpZDo6QXJndW1lbnRFcnJvcikgZG8KKyAgICAgIHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgneyUgaW5jbHVkZSB1bmRlZmluZWRfdmFyaWFibGUgJX0nKQorICAgICAgdGVtcGxhdGUucmVuZGVyIQorICAgIGVuZAorICAgIGFzc2VydF9yYWlzZXMoTGlxdWlkOjpBcmd1bWVudEVycm9yKSBkbworICAgICAgdGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7JSBpbmNsdWRlIG5pbCAlfScpCisgICAgICB0ZW1wbGF0ZS5yZW5kZXIhCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2luY2x1ZGluZ192aWFfdmFyaWFibGVfdmFsdWUKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICJmcm9tIFRlc3RGaWxlU3lzdGVtIiwgInslIGFzc2lnbiBwYWdlID0gJ3BpY2tfYV9zb3VyY2UnICV9eyUgaW5jbHVkZSBwYWdlICV9IgorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAiUHJvZHVjdDogRHJhZnQgMTUxY20gIiwgInslIGFzc2lnbiBwYWdlID0gJ3Byb2R1Y3QnICV9eyUgaW5jbHVkZSBwYWdlICV9IiwgInByb2R1Y3QiID0+IHsgJ3RpdGxlJyA9PiAnRHJhZnQgMTUxY20nIH0KKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgIlByb2R1Y3Q6IERyYWZ0IDE1MWNtICIsICJ7JSBhc3NpZ24gcGFnZSA9ICdwcm9kdWN0JyAlfXslIGluY2x1ZGUgcGFnZSBmb3IgZm9vICV9IiwgImZvbyIgPT4geyAndGl0bGUnID0+ICdEcmFmdCAxNTFjbScgfQorICBlbmQKK2VuZCAjIEluY2x1ZGVUYWdUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL2luY3JlbWVudF90YWdfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvaW5jcmVtZW50X3RhZ190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzUxYWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL2luY3JlbWVudF90YWdfdGVzdC5yYgpAQCAtMCwwICsxLDIzIEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgSW5jcmVtZW50VGFnVGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgZGVmIHRlc3RfaW5jCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnMCcsICd7JWluY3JlbWVudCBwb3J0ICV9Jywge30pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnMCAxJywgJ3slaW5jcmVtZW50IHBvcnQgJX0geyVpbmNyZW1lbnQgcG9ydCV9Jywge30pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnMCAwIDEgMiAxJywKKyAgICAgICd7JWluY3JlbWVudCBwb3J0ICV9IHslaW5jcmVtZW50IHN0YXJib2FyZCV9ICcgXAorICAgICAgJ3slaW5jcmVtZW50IHBvcnQgJX0geyVpbmNyZW1lbnQgcG9ydCV9ICcgXAorICAgICAgJ3slaW5jcmVtZW50IHN0YXJib2FyZCAlfScsIHt9KQorICBlbmQKKworICBkZWYgdGVzdF9kZWMKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCc5JywgJ3slZGVjcmVtZW50IHBvcnQgJX0nLCB7ICdwb3J0JyA9PiAxMCB9KQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJy0xIC0yJywgJ3slZGVjcmVtZW50IHBvcnQgJX0geyVkZWNyZW1lbnQgcG9ydCV9Jywge30pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnMSA1IDIgMiA1JywKKyAgICAgICd7JWluY3JlbWVudCBwb3J0ICV9IHslaW5jcmVtZW50IHN0YXJib2FyZCV9ICcgXAorICAgICAgJ3slaW5jcmVtZW50IHBvcnQgJX0geyVkZWNyZW1lbnQgcG9ydCV9ICcgXAorICAgICAgJ3slZGVjcmVtZW50IHN0YXJib2FyZCAlfScsIHsgJ3BvcnQnID0+IDEsICdzdGFyYm9hcmQnID0+IDUgfSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvcmF3X3RhZ190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy9yYXdfdGFnX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0ZDA1MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvcmF3X3RhZ190ZXN0LnJiCkBAIC0wLDAgKzEsMzEgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBSYXdUYWdUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF90YWdfaW5fcmF3CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAneyUgY29tbWVudCAlfSB0ZXN0IHslIGVuZGNvbW1lbnQgJX0nLAorICAgICAgJ3slIHJhdyAlfXslIGNvbW1lbnQgJX0gdGVzdCB7JSBlbmRjb21tZW50ICV9eyUgZW5kcmF3ICV9JworICBlbmQKKworICBkZWYgdGVzdF9vdXRwdXRfaW5fcmF3CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAne3sgdGVzdCB9fScsICd7JSByYXcgJX17eyB0ZXN0IH19eyUgZW5kcmF3ICV9JworICBlbmQKKworICBkZWYgdGVzdF9vcGVuX3RhZ19pbl9yYXcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgRm9vYmFyIHslIGludmFsaWQgJywgJ3slIHJhdyAlfSBGb29iYXIgeyUgaW52YWxpZCB7JSBlbmRyYXcgJX0nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnIEZvb2JhciBpbnZhbGlkICV9ICcsICd7JSByYXcgJX0gRm9vYmFyIGludmFsaWQgJX0geyUgZW5kcmF3ICV9JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJyBGb29iYXIge3sgaW52YWxpZCAnLCAneyUgcmF3ICV9IEZvb2JhciB7eyBpbnZhbGlkIHslIGVuZHJhdyAlfScKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgRm9vYmFyIGludmFsaWQgfX0gJywgJ3slIHJhdyAlfSBGb29iYXIgaW52YWxpZCB9fSB7JSBlbmRyYXcgJX0nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnIEZvb2JhciB7JSBpbnZhbGlkIHslIHslIGVuZHJhdyAnLCAneyUgcmF3ICV9IEZvb2JhciB7JSBpbnZhbGlkIHslIHslIGVuZHJhdyB7JSBlbmRyYXcgJX0nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnIEZvb2JhciB7JSB7JSB7JSAnLCAneyUgcmF3ICV9IEZvb2JhciB7JSB7JSB7JSB7JSBlbmRyYXcgJX0nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnIHRlc3QgeyUgcmF3ICV9IHslIGVuZHJhdyAlfScsICd7JSByYXcgJX0gdGVzdCB7JSByYXcgJX0geyUgeyUgZW5kcmF3ICV9ZW5kcmF3ICV9JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJyBGb29iYXIge3sgaW52YWxpZCAxJywgJ3slIHJhdyAlfSBGb29iYXIge3sgaW52YWxpZCB7JSBlbmRyYXcgJX17eyAxIH19JworICBlbmQKKworICBkZWYgdGVzdF9pbnZhbGlkX3JhdworICAgIGFzc2VydF9tYXRjaF9zeW50YXhfZXJyb3IoL3RhZyB3YXMgbmV2ZXIgY2xvc2VkLywgJ3slIHJhdyAlfSBmb28nKQorICAgIGFzc2VydF9tYXRjaF9zeW50YXhfZXJyb3IoL1ZhbGlkIHN5bnRheC8sICd7JSByYXcgfSBmb28geyUgZW5kcmF3ICV9JykKKyAgICBhc3NlcnRfbWF0Y2hfc3ludGF4X2Vycm9yKC9WYWxpZCBzeW50YXgvLCAneyUgcmF3IH0gZm9vICV9eyUgZW5kcmF3ICV9JykKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3Mvc3RhbmRhcmRfdGFnX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL3N0YW5kYXJkX3RhZ190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDcwM2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90YWdzL3N0YW5kYXJkX3RhZ190ZXN0LnJiCkBAIC0wLDAgKzEsMjk2IEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgU3RhbmRhcmRUYWdUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9ub190cmFuc2Zvcm0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCd0aGlzIHRleHQgc2hvdWxkIGNvbWUgb3V0IG9mIHRoZSB0ZW1wbGF0ZSB3aXRob3V0IGNoYW5nZS4uLicsCisgICAgICAndGhpcyB0ZXh0IHNob3VsZCBjb21lIG91dCBvZiB0aGUgdGVtcGxhdGUgd2l0aG91dCBjaGFuZ2UuLi4nKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnYmxhaCcsICdibGFoJykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCc8YmxhaD4nLCAnPGJsYWg+JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCd8LC46JywgJ3wsLjonKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICcnKQorCisgICAgdGV4dCA9ICUodGhpcyBzaG91bGRudCBzZWUgYW55IHRyYW5zZm9ybWF0aW9uIGVpdGhlciBidXQgaGFzIG11bHRpcGxlIGxpbmVzCisgICAgICAgICAgICAgIGFzIHlvdSBjYW4gY2xlYXJseSBzZWUgaGVyZSAuLi4pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCh0ZXh0LCB0ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9oYXNfYV9ibG9ja193aGljaF9kb2VzX25vdGhpbmcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCUodGhlIGNvbW1lbnQgYmxvY2sgc2hvdWxkIGJlIHJlbW92ZWQgIC4uIHJpZ2h0PyksCisgICAgICAlKHRoZSBjb21tZW50IGJsb2NrIHNob3VsZCBiZSByZW1vdmVkIHslY29tbWVudCV9IGJlIGdvbmUuLiB7JWVuZGNvbW1lbnQlfSAuLiByaWdodD8pKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slY29tbWVudCV9eyVlbmRjb21tZW50JX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JWNvbW1lbnQlfXslIGVuZGNvbW1lbnQgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBjb21tZW50ICV9eyVlbmRjb21tZW50JX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBjb21tZW50ICV9eyUgZW5kY29tbWVudCAlfScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slY29tbWVudCV9Y29tbWVudHslZW5kY29tbWVudCV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgY29tbWVudCAlfWNvbW1lbnR7JSBlbmRjb21tZW50ICV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgY29tbWVudCAlfSAxIHslIGNvbW1lbnQgJX0gMiB7JSBlbmRjb21tZW50ICV9IDMgeyUgZW5kY29tbWVudCAlfScpCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyVjb21tZW50JX17JWJsYWJsYSV9eyVlbmRjb21tZW50JX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBjb21tZW50ICV9eyUgYmxhYmxhICV9eyUgZW5kY29tbWVudCAlfScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slY29tbWVudCV9eyUgZW5kaWYgJX17JWVuZGNvbW1lbnQlfScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgJ3slIGNvbW1lbnQgJX17JSBlbmR3aGF0ZXZlciAlfXslIGVuZGNvbW1lbnQgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBjb21tZW50ICV9eyUgcmF3ICV9IHt7JSUlJX19ICB9fSB7IHslIGVuZGNvbW1lbnQgJX0geyUgY29tbWVudCB7JSBlbmRyYXcgJX0geyUgZW5kY29tbWVudCAlfScpCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdmb29iYXInLCAnZm9veyVjb21tZW50JX1jb21tZW50eyVlbmRjb21tZW50JX1iYXInKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2Zvb2JhcicsICdmb297JSBjb21tZW50ICV9Y29tbWVudHslIGVuZGNvbW1lbnQgJX1iYXInKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2Zvb2JhcicsICdmb297JWNvbW1lbnQlfSBjb21tZW50IHslZW5kY29tbWVudCV9YmFyJykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdmb29iYXInLCAnZm9veyUgY29tbWVudCAlfSBjb21tZW50IHslIGVuZGNvbW1lbnQgJX1iYXInKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnZm9vICBiYXInLCAnZm9vIHslY29tbWVudCV9IHslZW5kY29tbWVudCV9IGJhcicpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnZm9vICBiYXInLCAnZm9vIHslY29tbWVudCV9Y29tbWVudHslZW5kY29tbWVudCV9IGJhcicpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnZm9vICBiYXInLCAnZm9vIHslY29tbWVudCV9IGNvbW1lbnQgeyVlbmRjb21tZW50JX0gYmFyJykKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2Zvb2JhcicsICdmb297JWNvbW1lbnQlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHslZW5kY29tbWVudCV9YmFyJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfaHlwaGVuYXRlZF9hc3NpZ24KKyAgICBhc3NpZ25zID0geyAnYS1iJyA9PiAnMScgfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2EtYjoxIGEtYjoyJywgJ2EtYjp7e2EtYn19IHslYXNzaWduIGEtYiA9IDIgJX1hLWI6e3thLWJ9fScsIGFzc2lnbnMpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Fzc2lnbl93aXRoX2NvbG9uX2FuZF9zcGFjZXMKKyAgICBhc3NpZ25zID0geyAndmFyJyA9PiB7ICdhOmIgYycgPT4geyAncGFnZWQnID0+ICcxJyB9IH0gfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ3ZhcjI6IDEnLCAneyVhc3NpZ24gdmFyMiA9IHZhclsiYTpiIGMiXS5wYWdlZCAlfXZhcjI6IHt7dmFyMn19JywgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FwdHVyZQorICAgIGFzc2lnbnMgPSB7ICd2YXInID0+ICdjb250ZW50JyB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnY29udGVudCBmb28gY29udGVudCBmb28gJywKKyAgICAgICd7eyB2YXIyIH19eyUgY2FwdHVyZSB2YXIyICV9e3sgdmFyIH19IGZvbyB7JSBlbmRjYXB0dXJlICV9e3sgdmFyMiB9fXt7IHZhcjIgfX0nLAorICAgICAgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FwdHVyZV9kZXRlY3RzX2JhZF9zeW50YXgKKyAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnY29udGVudCBmb28gY29udGVudCBmb28gJywKKyAgICAgICAgJ3t7IHZhcjIgfX17JSBjYXB0dXJlICV9e3sgdmFyIH19IGZvbyB7JSBlbmRjYXB0dXJlICV9e3sgdmFyMiB9fXt7IHZhcjIgfX0nLAorICAgICAgICB7ICd2YXInID0+ICdjb250ZW50JyB9KQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9jYXNlCisgICAgYXNzaWducyA9IHsgJ2NvbmRpdGlvbicgPT4gMiB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIGl0cyAyICcsCisgICAgICAneyUgY2FzZSBjb25kaXRpb24gJX17JSB3aGVuIDEgJX0gaXRzIDEgeyUgd2hlbiAyICV9IGl0cyAyIHslIGVuZGNhc2UgJX0nLAorICAgICAgYXNzaWducykKKworICAgIGFzc2lnbnMgPSB7ICdjb25kaXRpb24nID0+IDEgfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBpdHMgMSAnLAorICAgICAgJ3slIGNhc2UgY29uZGl0aW9uICV9eyUgd2hlbiAxICV9IGl0cyAxIHslIHdoZW4gMiAlfSBpdHMgMiB7JSBlbmRjYXNlICV9JywKKyAgICAgIGFzc2lnbnMpCisKKyAgICBhc3NpZ25zID0geyAnY29uZGl0aW9uJyA9PiAzIH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLAorICAgICAgJ3slIGNhc2UgY29uZGl0aW9uICV9eyUgd2hlbiAxICV9IGl0cyAxIHslIHdoZW4gMiAlfSBpdHMgMiB7JSBlbmRjYXNlICV9JywKKyAgICAgIGFzc2lnbnMpCisKKyAgICBhc3NpZ25zID0geyAnY29uZGl0aW9uJyA9PiAic3RyaW5nIGhlcmUiIH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgaGl0ICcsCisgICAgICAneyUgY2FzZSBjb25kaXRpb24gJX17JSB3aGVuICJzdHJpbmcgaGVyZSIgJX0gaGl0IHslIGVuZGNhc2UgJX0nLAorICAgICAgYXNzaWducykKKworICAgIGFzc2lnbnMgPSB7ICdjb25kaXRpb24nID0+ICJiYWQgc3RyaW5nIGhlcmUiIH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLAorICAgICAgJ3slIGNhc2UgY29uZGl0aW9uICV9eyUgd2hlbiAic3RyaW5nIGhlcmUiICV9IGhpdCB7JSBlbmRjYXNlICV9JyxcCisgICAgICBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9jYXNlX3dpdGhfZWxzZQorICAgIGFzc2lnbnMgPSB7ICdjb25kaXRpb24nID0+IDUgfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBoaXQgJywKKyAgICAgICd7JSBjYXNlIGNvbmRpdGlvbiAlfXslIHdoZW4gNSAlfSBoaXQgeyUgZWxzZSAlfSBlbHNlIHslIGVuZGNhc2UgJX0nLAorICAgICAgYXNzaWducykKKworICAgIGFzc2lnbnMgPSB7ICdjb25kaXRpb24nID0+IDYgfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBlbHNlICcsCisgICAgICAneyUgY2FzZSBjb25kaXRpb24gJX17JSB3aGVuIDUgJX0gaGl0IHslIGVsc2UgJX0gZWxzZSB7JSBlbmRjYXNlICV9JywKKyAgICAgIGFzc2lnbnMpCisKKyAgICBhc3NpZ25zID0geyAnY29uZGl0aW9uJyA9PiA2IH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgZWxzZSAnLAorICAgICAgJ3slIGNhc2UgY29uZGl0aW9uICV9IHslIHdoZW4gNSAlfSBoaXQgeyUgZWxzZSAlfSBlbHNlIHslIGVuZGNhc2UgJX0nLAorICAgICAgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FzZV9vbl9zaXplCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgICd7JSBjYXNlIGEuc2l6ZSAlfXslIHdoZW4gMSAlfTF7JSB3aGVuIDIgJX0yeyUgZW5kY2FzZSAlfScsICdhJyA9PiBbXSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcxJywgJ3slIGNhc2UgYS5zaXplICV9eyUgd2hlbiAxICV9MXslIHdoZW4gMiAlfTJ7JSBlbmRjYXNlICV9JywgJ2EnID0+IFsxXSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcyJywgJ3slIGNhc2UgYS5zaXplICV9eyUgd2hlbiAxICV9MXslIHdoZW4gMiAlfTJ7JSBlbmRjYXNlICV9JywgJ2EnID0+IFsxLCAxXSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAgJ3slIGNhc2UgYS5zaXplICV9eyUgd2hlbiAxICV9MXslIHdoZW4gMiAlfTJ7JSBlbmRjYXNlICV9JywgJ2EnID0+IFsxLCAxLCAxXSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAgJ3slIGNhc2UgYS5zaXplICV9eyUgd2hlbiAxICV9MXslIHdoZW4gMiAlfTJ7JSBlbmRjYXNlICV9JywgJ2EnID0+IFsxLCAxLCAxLCAxXSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAgJ3slIGNhc2UgYS5zaXplICV9eyUgd2hlbiAxICV9MXslIHdoZW4gMiAlfTJ7JSBlbmRjYXNlICV9JywgJ2EnID0+IFsxLCAxLCAxLCAxLCAxXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FzZV9vbl9zaXplX3dpdGhfZWxzZQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2Vsc2UnLAorICAgICAgJ3slIGNhc2UgYS5zaXplICV9eyUgd2hlbiAxICV9MXslIHdoZW4gMiAlfTJ7JSBlbHNlICV9ZWxzZXslIGVuZGNhc2UgJX0nLAorICAgICAgJ2EnID0+IFtdKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnMScsCisgICAgICAneyUgY2FzZSBhLnNpemUgJX17JSB3aGVuIDEgJX0xeyUgd2hlbiAyICV9MnslIGVsc2UgJX1lbHNleyUgZW5kY2FzZSAlfScsCisgICAgICAnYScgPT4gWzFdKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnMicsCisgICAgICAneyUgY2FzZSBhLnNpemUgJX17JSB3aGVuIDEgJX0xeyUgd2hlbiAyICV9MnslIGVsc2UgJX1lbHNleyUgZW5kY2FzZSAlfScsCisgICAgICAnYScgPT4gWzEsIDFdKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnZWxzZScsCisgICAgICAneyUgY2FzZSBhLnNpemUgJX17JSB3aGVuIDEgJX0xeyUgd2hlbiAyICV9MnslIGVsc2UgJX1lbHNleyUgZW5kY2FzZSAlfScsCisgICAgICAnYScgPT4gWzEsIDEsIDFdKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnZWxzZScsCisgICAgICAneyUgY2FzZSBhLnNpemUgJX17JSB3aGVuIDEgJX0xeyUgd2hlbiAyICV9MnslIGVsc2UgJX1lbHNleyUgZW5kY2FzZSAlfScsCisgICAgICAnYScgPT4gWzEsIDEsIDEsIDFdKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnZWxzZScsCisgICAgICAneyUgY2FzZSBhLnNpemUgJX17JSB3aGVuIDEgJX0xeyUgd2hlbiAyICV9MnslIGVsc2UgJX1lbHNleyUgZW5kY2FzZSAlfScsCisgICAgICAnYScgPT4gWzEsIDEsIDEsIDEsIDFdKQorICBlbmQKKworICBkZWYgdGVzdF9jYXNlX29uX2xlbmd0aF93aXRoX2Vsc2UKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdlbHNlJywKKyAgICAgICd7JSBjYXNlIGEuZW1wdHk/ICV9eyUgd2hlbiB0cnVlICV9dHJ1ZXslIHdoZW4gZmFsc2UgJX1mYWxzZXslIGVsc2UgJX1lbHNleyUgZW5kY2FzZSAlfScsCisgICAgICB7fSkKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ2ZhbHNlJywKKyAgICAgICd7JSBjYXNlIGZhbHNlICV9eyUgd2hlbiB0cnVlICV9dHJ1ZXslIHdoZW4gZmFsc2UgJX1mYWxzZXslIGVsc2UgJX1lbHNleyUgZW5kY2FzZSAlfScsCisgICAgICB7fSkKKworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ3RydWUnLAorICAgICAgJ3slIGNhc2UgdHJ1ZSAlfXslIHdoZW4gdHJ1ZSAlfXRydWV7JSB3aGVuIGZhbHNlICV9ZmFsc2V7JSBlbHNlICV9ZWxzZXslIGVuZGNhc2UgJX0nLAorICAgICAge30pCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdlbHNlJywKKyAgICAgICd7JSBjYXNlIE5VTEwgJX17JSB3aGVuIHRydWUgJX10cnVleyUgd2hlbiBmYWxzZSAlfWZhbHNleyUgZWxzZSAlfWVsc2V7JSBlbmRjYXNlICV9JywKKyAgICAgIHt9KQorICBlbmQKKworICBkZWYgdGVzdF9hc3NpZ25fZnJvbV9jYXNlCisgICAgIyBFeGFtcGxlIGZyb20gdGhlIHNob3BpZnkgZm9ydW1zCisgICAgY29kZSA9ICJ7JSBjYXNlIGNvbGxlY3Rpb24uaGFuZGxlICV9eyUgd2hlbiAnbWVuc3dlYXItamFja2V0cycgJX17JSBhc3NpZ24gcHRpdGxlID0gJ21lbnN3ZWFyJyAlfXslIHdoZW4gJ21lbnN3ZWFyLXQtc2hpcnRzJyAlfXslIGFzc2lnbiBwdGl0bGUgPSAnbWVuc3dlYXInICV9eyUgZWxzZSAlfXslIGFzc2lnbiBwdGl0bGUgPSAnd29tZW5zd2VhcicgJX17JSBlbmRjYXNlICV9e3sgcHRpdGxlIH19IgorICAgIHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZShjb2RlKQorICAgIGFzc2VydF9lcXVhbCAibWVuc3dlYXIiLCAgIHRlbXBsYXRlLnJlbmRlciEoImNvbGxlY3Rpb24iID0+IHsgJ2hhbmRsZScgPT4gJ21lbnN3ZWFyLWphY2tldHMnIH0pCisgICAgYXNzZXJ0X2VxdWFsICJtZW5zd2VhciIsICAgdGVtcGxhdGUucmVuZGVyISgiY29sbGVjdGlvbiIgPT4geyAnaGFuZGxlJyA9PiAnbWVuc3dlYXItdC1zaGlydHMnIH0pCisgICAgYXNzZXJ0X2VxdWFsICJ3b21lbnN3ZWFyIiwgdGVtcGxhdGUucmVuZGVyISgiY29sbGVjdGlvbiIgPT4geyAnaGFuZGxlJyA9PiAneCcgfSkKKyAgICBhc3NlcnRfZXF1YWwgIndvbWVuc3dlYXIiLCB0ZW1wbGF0ZS5yZW5kZXIhKCJjb2xsZWN0aW9uIiA9PiB7ICdoYW5kbGUnID0+ICd5JyB9KQorICAgIGFzc2VydF9lcXVhbCAid29tZW5zd2VhciIsIHRlbXBsYXRlLnJlbmRlciEoImNvbGxlY3Rpb24iID0+IHsgJ2hhbmRsZScgPT4gJ3onIH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X2Nhc2Vfd2hlbl9vcgorICAgIGNvZGUgPSAneyUgY2FzZSBjb25kaXRpb24gJX17JSB3aGVuIDEgb3IgMiBvciAzICV9IGl0cyAxIG9yIDIgb3IgMyB7JSB3aGVuIDQgJX0gaXRzIDQgeyUgZW5kY2FzZSAlfScKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgaXRzIDEgb3IgMiBvciAzICcsIGNvZGUsIHsgJ2NvbmRpdGlvbicgPT4gMSB9KQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBpdHMgMSBvciAyIG9yIDMgJywgY29kZSwgeyAnY29uZGl0aW9uJyA9PiAyIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIGl0cyAxIG9yIDIgb3IgMyAnLCBjb2RlLCB7ICdjb25kaXRpb24nID0+IDMgfSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgaXRzIDQgJywgY29kZSwgeyAnY29uZGl0aW9uJyA9PiA0IH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgY29kZSwgeyAnY29uZGl0aW9uJyA9PiA1IH0pCisKKyAgICBjb2RlID0gJ3slIGNhc2UgY29uZGl0aW9uICV9eyUgd2hlbiAxIG9yICJzdHJpbmciIG9yIG51bGwgJX0gaXRzIDEgb3IgMiBvciAzIHslIHdoZW4gNCAlfSBpdHMgNCB7JSBlbmRjYXNlICV9JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBpdHMgMSBvciAyIG9yIDMgJywgY29kZSwgeyAnY29uZGl0aW9uJyA9PiAxIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIGl0cyAxIG9yIDIgb3IgMyAnLCBjb2RlLCB7ICdjb25kaXRpb24nID0+ICdzdHJpbmcnIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIGl0cyAxIG9yIDIgb3IgMyAnLCBjb2RlLCB7ICdjb25kaXRpb24nID0+IG5pbCB9KQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsIGNvZGUsIHsgJ2NvbmRpdGlvbicgPT4gJ3NvbWV0aGluZyBlbHNlJyB9KQorICBlbmQKKworICBkZWYgdGVzdF9jYXNlX3doZW5fY29tbWEKKyAgICBjb2RlID0gJ3slIGNhc2UgY29uZGl0aW9uICV9eyUgd2hlbiAxLCAyLCAzICV9IGl0cyAxIG9yIDIgb3IgMyB7JSB3aGVuIDQgJX0gaXRzIDQgeyUgZW5kY2FzZSAlfScKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgaXRzIDEgb3IgMiBvciAzICcsIGNvZGUsIHsgJ2NvbmRpdGlvbicgPT4gMSB9KQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBpdHMgMSBvciAyIG9yIDMgJywgY29kZSwgeyAnY29uZGl0aW9uJyA9PiAyIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIGl0cyAxIG9yIDIgb3IgMyAnLCBjb2RlLCB7ICdjb25kaXRpb24nID0+IDMgfSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgaXRzIDQgJywgY29kZSwgeyAnY29uZGl0aW9uJyA9PiA0IH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgY29kZSwgeyAnY29uZGl0aW9uJyA9PiA1IH0pCisKKyAgICBjb2RlID0gJ3slIGNhc2UgY29uZGl0aW9uICV9eyUgd2hlbiAxLCAic3RyaW5nIiwgbnVsbCAlfSBpdHMgMSBvciAyIG9yIDMgeyUgd2hlbiA0ICV9IGl0cyA0IHslIGVuZGNhc2UgJX0nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIGl0cyAxIG9yIDIgb3IgMyAnLCBjb2RlLCB7ICdjb25kaXRpb24nID0+IDEgfSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgaXRzIDEgb3IgMiBvciAzICcsIGNvZGUsIHsgJ2NvbmRpdGlvbicgPT4gJ3N0cmluZycgfSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgaXRzIDEgb3IgMiBvciAzICcsIGNvZGUsIHsgJ2NvbmRpdGlvbicgPT4gbmlsIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnJywgY29kZSwgeyAnY29uZGl0aW9uJyA9PiAnc29tZXRoaW5nIGVsc2UnIH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X2Fzc2lnbgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJ3ZhcmlhYmxlJywgJ3slIGFzc2lnbiBhID0gInZhcmlhYmxlIiV9e3thfX0nCisgIGVuZAorCisgIGRlZiB0ZXN0X2Fzc2lnbl91bmFzc2lnbmVkCisgICAgYXNzaWducyA9IHsgJ3ZhcicgPT4gJ2NvbnRlbnQnIH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCd2YXIyOiAgdmFyMjpjb250ZW50JywgJ3ZhcjI6e3t2YXIyfX0geyVhc3NpZ24gdmFyMiA9IHZhciV9IHZhcjI6e3t2YXIyfX0nLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9hc3NpZ25fYW5fZW1wdHlfc3RyaW5nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnJywgJ3slIGFzc2lnbiBhID0gIiIlfXt7YX19JworICBlbmQKKworICBkZWYgdGVzdF9hc3NpZ25faXNfZ2xvYmFsCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAndmFyaWFibGUnLCAneyVmb3IgaSBpbiAoMS4uMikgJX17JSBhc3NpZ24gYSA9ICJ2YXJpYWJsZSIlfXslIGVuZGZvciAlfXt7YX19JworICBlbmQKKworICBkZWYgdGVzdF9jYXNlX2RldGVjdHNfYmFkX3N5bnRheAorICAgIGFzc2VydF9yYWlzZXMoU3ludGF4RXJyb3IpIGRvCisgICAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAgJ3slIGNhc2UgZmFsc2UgJX17JSB3aGVuICV9dHJ1ZXslIGVuZGNhc2UgJX0nLCB7fSkKKyAgICBlbmQKKworICAgIGFzc2VydF9yYWlzZXMoU3ludGF4RXJyb3IpIGRvCisgICAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAgJ3slIGNhc2UgZmFsc2UgJX17JSBodWggJX10cnVleyUgZW5kY2FzZSAlfScsIHt9KQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9jeWNsZQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ29uZScsICd7JWN5Y2xlICJvbmUiLCAidHdvIiV9JykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdvbmUgdHdvJywgJ3slY3ljbGUgIm9uZSIsICJ0d28iJX0geyVjeWNsZSAib25lIiwgInR3byIlfScpCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnIHR3bycsICd7JWN5Y2xlICIiLCAidHdvIiV9IHslY3ljbGUgIiIsICJ0d28iJX0nKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnb25lIHR3byBvbmUnLCAneyVjeWNsZSAib25lIiwgInR3byIlfSB7JWN5Y2xlICJvbmUiLCAidHdvIiV9IHslY3ljbGUgIm9uZSIsICJ0d28iJX0nKQorCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgndGV4dC1hbGlnbjogbGVmdCB0ZXh0LWFsaWduOiByaWdodCcsCisgICAgICAneyVjeWNsZSAidGV4dC1hbGlnbjogbGVmdCIsICJ0ZXh0LWFsaWduOiByaWdodCIgJX0geyVjeWNsZSAidGV4dC1hbGlnbjogbGVmdCIsICJ0ZXh0LWFsaWduOiByaWdodCIlfScpCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpcGxlX2N5Y2xlcworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzEgMiAxIDEgMiAzIDEnLAorICAgICAgJ3slY3ljbGUgMSwyJX0geyVjeWNsZSAxLDIlfSB7JWN5Y2xlIDEsMiV9IHslY3ljbGUgMSwyLDMlfSB7JWN5Y2xlIDEsMiwzJX0geyVjeWNsZSAxLDIsMyV9IHslY3ljbGUgMSwyLDMlfScpCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpcGxlX25hbWVkX2N5Y2xlcworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJ29uZSBvbmUgdHdvIHR3byBvbmUgb25lJywKKyAgICAgICd7JWN5Y2xlIDE6ICJvbmUiLCAidHdvIiAlfSB7JWN5Y2xlIDI6ICJvbmUiLCAidHdvIiAlfSB7JWN5Y2xlIDE6ICJvbmUiLCAidHdvIiAlfSB7JWN5Y2xlIDI6ICJvbmUiLCAidHdvIiAlfSB7JWN5Y2xlIDE6ICJvbmUiLCAidHdvIiAlfSB7JWN5Y2xlIDI6ICJvbmUiLCAidHdvIiAlfScpCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpcGxlX25hbWVkX2N5Y2xlc193aXRoX25hbWVzX2Zyb21fY29udGV4dAorICAgIGFzc2lnbnMgPSB7ICJ2YXIxIiA9PiAxLCAidmFyMiIgPT4gMiB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnb25lIG9uZSB0d28gdHdvIG9uZSBvbmUnLAorICAgICAgJ3slY3ljbGUgdmFyMTogIm9uZSIsICJ0d28iICV9IHslY3ljbGUgdmFyMjogIm9uZSIsICJ0d28iICV9IHslY3ljbGUgdmFyMTogIm9uZSIsICJ0d28iICV9IHslY3ljbGUgdmFyMjogIm9uZSIsICJ0d28iICV9IHslY3ljbGUgdmFyMTogIm9uZSIsICJ0d28iICV9IHslY3ljbGUgdmFyMjogIm9uZSIsICJ0d28iICV9JywgYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2l6ZV9vZl9hcnJheQorICAgIGFzc2lnbnMgPSB7ICJhcnJheSIgPT4gWzEsIDIsIDMsIDRdIH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCdhcnJheSBoYXMgNCBlbGVtZW50cycsICJhcnJheSBoYXMge3sgYXJyYXkuc2l6ZSB9fSBlbGVtZW50cyIsIGFzc2lnbnMpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpemVfb2ZfaGFzaAorICAgIGFzc2lnbnMgPSB7ICJoYXNoIiA9PiB7IGE6IDEsIGI6IDIsIGM6IDMsIGQ6IDQgfSB9CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgnaGFzaCBoYXMgNCBlbGVtZW50cycsICJoYXNoIGhhcyB7eyBoYXNoLnNpemUgfX0gZWxlbWVudHMiLCBhc3NpZ25zKQorICBlbmQKKworICBkZWYgdGVzdF9pbGxlZ2FsX3N5bWJvbHMKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgaWYgdHJ1ZSA9PSBlbXB0eSAlfT97JSBlbmRpZiAlfScsIHt9KQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiB0cnVlID09IG51bGwgJX0/eyUgZW5kaWYgJX0nLCB7fSkKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcnLCAneyUgaWYgZW1wdHkgPT0gdHJ1ZSAlfT97JSBlbmRpZiAlfScsIHt9KQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJycsICd7JSBpZiBudWxsID09IHRydWUgJX0/eyUgZW5kaWYgJX0nLCB7fSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWZjaGFuZ2VkCisgICAgYXNzaWducyA9IHsgJ2FycmF5JyA9PiBbIDEsIDEsIDIsIDIsIDMsIDNdIH0KKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcxMjMnLCAneyVmb3IgaXRlbSBpbiBhcnJheSV9eyVpZmNoYW5nZWQlfXt7aXRlbX19eyUgZW5kaWZjaGFuZ2VkICV9eyVlbmRmb3IlfScsIGFzc2lnbnMpCisKKyAgICBhc3NpZ25zID0geyAnYXJyYXknID0+IFsgMSwgMSwgMSwgMV0gfQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJzEnLCAneyVmb3IgaXRlbSBpbiBhcnJheSV9eyVpZmNoYW5nZWQlfXt7aXRlbX19eyUgZW5kaWZjaGFuZ2VkICV9eyVlbmRmb3IlfScsIGFzc2lnbnMpCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpbGluZV90YWcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcwIDEgMiAzJywgIjB7JVxuZm9yIGkgaW4gKDEuLjMpXG4lfSB7e1xuaVxufX17JVxuZW5kZm9yXG4lfSIKKyAgZW5kCitlbmQgIyBTdGFuZGFyZFRhZ1Rlc3QKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3Mvc3RhdGVtZW50c190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy9zdGF0ZW1lbnRzX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmZjE2NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3Mvc3RhdGVtZW50c190ZXN0LnJiCkBAIC0wLDAgKzEsMTExIEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgU3RhdGVtZW50c1Rlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiB0ZXN0X3RydWVfZXFsX3RydWUKKyAgICB0ZXh0ID0gJyB7JSBpZiB0cnVlID09IHRydWUgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQKKyAgZW5kCisKKyAgZGVmIHRlc3RfdHJ1ZV9ub3RfZXFsX3RydWUKKyAgICB0ZXh0ID0gJyB7JSBpZiB0cnVlICE9IHRydWUgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIGZhbHNlICAnLCB0ZXh0CisgIGVuZAorCisgIGRlZiB0ZXN0X3RydWVfbHFfdHJ1ZQorICAgIHRleHQgPSAnIHslIGlmIDAgPiAwICV9IHRydWUgeyUgZWxzZSAlfSBmYWxzZSB7JSBlbmRpZiAlfSAnCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnICBmYWxzZSAgJywgdGV4dAorICBlbmQKKworICBkZWYgdGVzdF9vbmVfbHFfemVybworICAgIHRleHQgPSAnIHslIGlmIDEgPiAwICV9IHRydWUgeyUgZWxzZSAlfSBmYWxzZSB7JSBlbmRpZiAlfSAnCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnICB0cnVlICAnLCB0ZXh0CisgIGVuZAorCisgIGRlZiB0ZXN0X3plcm9fbHFfb25lCisgICAgdGV4dCA9ICcgeyUgaWYgMCA8IDEgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQKKyAgZW5kCisKKyAgZGVmIHRlc3RfemVyb19scV9vcl9lcXVhbF9vbmUKKyAgICB0ZXh0ID0gJyB7JSBpZiAwIDw9IDAgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQKKyAgZW5kCisKKyAgZGVmIHRlc3RfemVyb19scV9vcl9lcXVhbF9vbmVfaW52b2x2aW5nX25pbAorICAgIHRleHQgPSAnIHslIGlmIG51bGwgPD0gMCAlfSB0cnVlIHslIGVsc2UgJX0gZmFsc2UgeyUgZW5kaWYgJX0gJworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJyAgZmFsc2UgICcsIHRleHQKKworICAgIHRleHQgPSAnIHslIGlmIDAgPD0gbnVsbCAlfSB0cnVlIHslIGVsc2UgJX0gZmFsc2UgeyUgZW5kaWYgJX0gJworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJyAgZmFsc2UgICcsIHRleHQKKyAgZW5kCisKKyAgZGVmIHRlc3RfemVyb19scXFfb3JfZXF1YWxfb25lCisgICAgdGV4dCA9ICcgeyUgaWYgMCA+PSAwICV9IHRydWUgeyUgZWxzZSAlfSBmYWxzZSB7JSBlbmRpZiAlfSAnCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnICB0cnVlICAnLCB0ZXh0CisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ3MKKyAgICB0ZXh0ID0gIiB7JSBpZiAndGVzdCcgPT0gJ3Rlc3QnICV9IHRydWUgeyUgZWxzZSAlfSBmYWxzZSB7JSBlbmRpZiAlfSAiCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnICB0cnVlICAnLCB0ZXh0CisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ3Nfbm90X2VxdWFsCisgICAgdGV4dCA9ICIgeyUgaWYgJ3Rlc3QnICE9ICd0ZXN0JyAlfSB0cnVlIHslIGVsc2UgJX0gZmFsc2UgeyUgZW5kaWYgJX0gIgorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJyAgZmFsc2UgICcsIHRleHQKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyX3N0cmluZ3NfZXF1YWwKKyAgICB0ZXh0ID0gJyB7JSBpZiB2YXIgPT0gImhlbGxvIHRoZXJlISIgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQsICd2YXInID0+ICdoZWxsbyB0aGVyZSEnCisgIGVuZAorCisgIGRlZiB0ZXN0X3Zhcl9zdHJpbmdzX2FyZV9ub3RfZXF1YWwKKyAgICB0ZXh0ID0gJyB7JSBpZiAiaGVsbG8gdGhlcmUhIiA9PSB2YXIgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQsICd2YXInID0+ICdoZWxsbyB0aGVyZSEnCisgIGVuZAorCisgIGRlZiB0ZXN0X3Zhcl9hbmRfbG9uZ19zdHJpbmdfYXJlX2VxdWFsCisgICAgdGV4dCA9ICIgeyUgaWYgdmFyID09ICdoZWxsbyB0aGVyZSEnICV9IHRydWUgeyUgZWxzZSAlfSBmYWxzZSB7JSBlbmRpZiAlfSAiCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCAnICB0cnVlICAnLCB0ZXh0LCAndmFyJyA9PiAnaGVsbG8gdGhlcmUhJworICBlbmQKKworICBkZWYgdGVzdF92YXJfYW5kX2xvbmdfc3RyaW5nX2FyZV9lcXVhbF9iYWNrd2FyZHMKKyAgICB0ZXh0ID0gIiB7JSBpZiAnaGVsbG8gdGhlcmUhJyA9PSB2YXIgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICIKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQsICd2YXInID0+ICdoZWxsbyB0aGVyZSEnCisgIGVuZAorCisgICMgZGVmIHRlc3RfaXNfbmlsCisgICMgIHRleHQgPSAlfCB7JSBpZiB2YXIgIT0gbmlsICV9IHRydWUgeyUgZWxzZSAlfSBmYWxzZSB7JSBlbmQgJX0gfAorICAjICBAdGVtcGxhdGUuYXNzaWducyA9IHsgJ3ZhcicgPT4gJ2hlbGxvIHRoZXJlISd9CisgICMgIGV4cGVjdGVkID0gJXwgIHRydWUgIHwKKyAgIyAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBAdGVtcGxhdGUucGFyc2UodGV4dCkKKyAgIyBlbmQKKworICBkZWYgdGVzdF9pc19jb2xsZWN0aW9uX2VtcHR5CisgICAgdGV4dCA9ICcgeyUgaWYgYXJyYXkgPT0gZW1wdHkgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQsICdhcnJheScgPT4gW10KKyAgZW5kCisKKyAgZGVmIHRlc3RfaXNfbm90X2NvbGxlY3Rpb25fZW1wdHkKKyAgICB0ZXh0ID0gJyB7JSBpZiBhcnJheSA9PSBlbXB0eSAlfSB0cnVlIHslIGVsc2UgJX0gZmFsc2UgeyUgZW5kaWYgJX0gJworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJyAgZmFsc2UgICcsIHRleHQsICdhcnJheScgPT4gWzEsIDIsIDNdCisgIGVuZAorCisgIGRlZiB0ZXN0X25pbAorICAgIHRleHQgPSAnIHslIGlmIHZhciA9PSBuaWwgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQsICd2YXInID0+IG5pbAorCisgICAgdGV4dCA9ICcgeyUgaWYgdmFyID09IG51bGwgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQsICd2YXInID0+IG5pbAorICBlbmQKKworICBkZWYgdGVzdF9ub3RfbmlsCisgICAgdGV4dCA9ICcgeyUgaWYgdmFyICE9IG5pbCAlfSB0cnVlIHslIGVsc2UgJX0gZmFsc2UgeyUgZW5kaWYgJX0gJworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJyAgdHJ1ZSAgJywgdGV4dCwgJ3ZhcicgPT4gMQorCisgICAgdGV4dCA9ICcgeyUgaWYgdmFyICE9IG51bGwgJX0gdHJ1ZSB7JSBlbHNlICV9IGZhbHNlIHslIGVuZGlmICV9ICcKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgIHRydWUgICcsIHRleHQsICd2YXInID0+IDEKKyAgZW5kCitlbmQgIyBTdGF0ZW1lbnRzVGVzdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy90YWJsZV9yb3dfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvdGFibGVfcm93X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiYzE0YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvdGFibGVfcm93X3Rlc3QucmIKQEAgLTAsMCArMSw2NCBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIFRhYmxlUm93VGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgY2xhc3MgQXJyYXlEcm9wIDwgTGlxdWlkOjpEcm9wCisgICAgaW5jbHVkZSBFbnVtZXJhYmxlCisKKyAgICBkZWYgaW5pdGlhbGl6ZShhcnJheSkKKyAgICAgIEBhcnJheSA9IGFycmF5CisgICAgZW5kCisKKyAgICBkZWYgZWFjaCgmYmxvY2spCisgICAgICBAYXJyYXkuZWFjaCgmYmxvY2spCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3RhYmxlX3JvdworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoIjx0ciBjbGFzcz1cInJvdzFcIj5cbjx0ZCBjbGFzcz1cImNvbDFcIj4gMSA8L3RkPjx0ZCBjbGFzcz1cImNvbDJcIj4gMiA8L3RkPjx0ZCBjbGFzcz1cImNvbDNcIj4gMyA8L3RkPjwvdHI+XG48dHIgY2xhc3M9XCJyb3cyXCI+PHRkIGNsYXNzPVwiY29sMVwiPiA0IDwvdGQ+PHRkIGNsYXNzPVwiY29sMlwiPiA1IDwvdGQ+PHRkIGNsYXNzPVwiY29sM1wiPiA2IDwvdGQ+PC90cj5cbiIsCisgICAgICAneyUgdGFibGVyb3cgbiBpbiBudW1iZXJzIGNvbHM6MyV9IHt7bn19IHslIGVuZHRhYmxlcm93ICV9JywKKyAgICAgICdudW1iZXJzJyA9PiBbMSwgMiwgMywgNCwgNSwgNl0pCisKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCI8dHIgY2xhc3M9XCJyb3cxXCI+XG48L3RyPlxuIiwKKyAgICAgICd7JSB0YWJsZXJvdyBuIGluIG51bWJlcnMgY29sczozJX0ge3tufX0geyUgZW5kdGFibGVyb3cgJX0nLAorICAgICAgJ251bWJlcnMnID0+IFtdKQorICBlbmQKKworICBkZWYgdGVzdF90YWJsZV9yb3dfd2l0aF9kaWZmZXJlbnRfY29scworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoIjx0ciBjbGFzcz1cInJvdzFcIj5cbjx0ZCBjbGFzcz1cImNvbDFcIj4gMSA8L3RkPjx0ZCBjbGFzcz1cImNvbDJcIj4gMiA8L3RkPjx0ZCBjbGFzcz1cImNvbDNcIj4gMyA8L3RkPjx0ZCBjbGFzcz1cImNvbDRcIj4gNCA8L3RkPjx0ZCBjbGFzcz1cImNvbDVcIj4gNSA8L3RkPjwvdHI+XG48dHIgY2xhc3M9XCJyb3cyXCI+PHRkIGNsYXNzPVwiY29sMVwiPiA2IDwvdGQ+PC90cj5cbiIsCisgICAgICAneyUgdGFibGVyb3cgbiBpbiBudW1iZXJzIGNvbHM6NSV9IHt7bn19IHslIGVuZHRhYmxlcm93ICV9JywKKyAgICAgICdudW1iZXJzJyA9PiBbMSwgMiwgMywgNCwgNSwgNl0pCisgIGVuZAorCisgIGRlZiB0ZXN0X3RhYmxlX2NvbF9jb3VudGVyCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiPHRyIGNsYXNzPVwicm93MVwiPlxuPHRkIGNsYXNzPVwiY29sMVwiPjE8L3RkPjx0ZCBjbGFzcz1cImNvbDJcIj4yPC90ZD48L3RyPlxuPHRyIGNsYXNzPVwicm93MlwiPjx0ZCBjbGFzcz1cImNvbDFcIj4xPC90ZD48dGQgY2xhc3M9XCJjb2wyXCI+MjwvdGQ+PC90cj5cbjx0ciBjbGFzcz1cInJvdzNcIj48dGQgY2xhc3M9XCJjb2wxXCI+MTwvdGQ+PHRkIGNsYXNzPVwiY29sMlwiPjI8L3RkPjwvdHI+XG4iLAorICAgICAgJ3slIHRhYmxlcm93IG4gaW4gbnVtYmVycyBjb2xzOjIlfXt7dGFibGVyb3dsb29wLmNvbH19eyUgZW5kdGFibGVyb3cgJX0nLAorICAgICAgJ251bWJlcnMnID0+IFsxLCAyLCAzLCA0LCA1LCA2XSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcXVvdGVkX2ZyYWdtZW50CisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiPHRyIGNsYXNzPVwicm93MVwiPlxuPHRkIGNsYXNzPVwiY29sMVwiPiAxIDwvdGQ+PHRkIGNsYXNzPVwiY29sMlwiPiAyIDwvdGQ+PHRkIGNsYXNzPVwiY29sM1wiPiAzIDwvdGQ+PC90cj5cbjx0ciBjbGFzcz1cInJvdzJcIj48dGQgY2xhc3M9XCJjb2wxXCI+IDQgPC90ZD48dGQgY2xhc3M9XCJjb2wyXCI+IDUgPC90ZD48dGQgY2xhc3M9XCJjb2wzXCI+IDYgPC90ZD48L3RyPlxuIiwKKyAgICAgICJ7JSB0YWJsZXJvdyBuIGluIGNvbGxlY3Rpb25zLmZyb250cGFnZSBjb2xzOjMlfSB7e259fSB7JSBlbmR0YWJsZXJvdyAlfSIsCisgICAgICAnY29sbGVjdGlvbnMnID0+IHsgJ2Zyb250cGFnZScgPT4gWzEsIDIsIDMsIDQsIDUsIDZdIH0pCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdCgiPHRyIGNsYXNzPVwicm93MVwiPlxuPHRkIGNsYXNzPVwiY29sMVwiPiAxIDwvdGQ+PHRkIGNsYXNzPVwiY29sMlwiPiAyIDwvdGQ+PHRkIGNsYXNzPVwiY29sM1wiPiAzIDwvdGQ+PC90cj5cbjx0ciBjbGFzcz1cInJvdzJcIj48dGQgY2xhc3M9XCJjb2wxXCI+IDQgPC90ZD48dGQgY2xhc3M9XCJjb2wyXCI+IDUgPC90ZD48dGQgY2xhc3M9XCJjb2wzXCI+IDYgPC90ZD48L3RyPlxuIiwKKyAgICAgICJ7JSB0YWJsZXJvdyBuIGluIGNvbGxlY3Rpb25zWydmcm9udHBhZ2UnXSBjb2xzOjMlfSB7e259fSB7JSBlbmR0YWJsZXJvdyAlfSIsCisgICAgICAnY29sbGVjdGlvbnMnID0+IHsgJ2Zyb250cGFnZScgPT4gWzEsIDIsIDMsIDQsIDUsIDZdIH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X2VudW1lcmFibGVfZHJvcAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoIjx0ciBjbGFzcz1cInJvdzFcIj5cbjx0ZCBjbGFzcz1cImNvbDFcIj4gMSA8L3RkPjx0ZCBjbGFzcz1cImNvbDJcIj4gMiA8L3RkPjx0ZCBjbGFzcz1cImNvbDNcIj4gMyA8L3RkPjwvdHI+XG48dHIgY2xhc3M9XCJyb3cyXCI+PHRkIGNsYXNzPVwiY29sMVwiPiA0IDwvdGQ+PHRkIGNsYXNzPVwiY29sMlwiPiA1IDwvdGQ+PHRkIGNsYXNzPVwiY29sM1wiPiA2IDwvdGQ+PC90cj5cbiIsCisgICAgICAneyUgdGFibGVyb3cgbiBpbiBudW1iZXJzIGNvbHM6MyV9IHt7bn19IHslIGVuZHRhYmxlcm93ICV9JywKKyAgICAgICdudW1iZXJzJyA9PiBBcnJheURyb3AubmV3KFsxLCAyLCAzLCA0LCA1LCA2XSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X29mZnNldF9hbmRfbGltaXQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCI8dHIgY2xhc3M9XCJyb3cxXCI+XG48dGQgY2xhc3M9XCJjb2wxXCI+IDEgPC90ZD48dGQgY2xhc3M9XCJjb2wyXCI+IDIgPC90ZD48dGQgY2xhc3M9XCJjb2wzXCI+IDMgPC90ZD48L3RyPlxuPHRyIGNsYXNzPVwicm93MlwiPjx0ZCBjbGFzcz1cImNvbDFcIj4gNCA8L3RkPjx0ZCBjbGFzcz1cImNvbDJcIj4gNSA8L3RkPjx0ZCBjbGFzcz1cImNvbDNcIj4gNiA8L3RkPjwvdHI+XG4iLAorICAgICAgJ3slIHRhYmxlcm93IG4gaW4gbnVtYmVycyBjb2xzOjMgb2Zmc2V0OjEgbGltaXQ6NiV9IHt7bn19IHslIGVuZHRhYmxlcm93ICV9JywKKyAgICAgICdudW1iZXJzJyA9PiBbMCwgMSwgMiwgMywgNCwgNSwgNiwgN10pCisgIGVuZAorCisgIGRlZiB0ZXN0X2JsYW5rX3N0cmluZ19ub3RfaXRlcmFibGUKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCI8dHIgY2xhc3M9XCJyb3cxXCI+XG48L3RyPlxuIiwgInslIHRhYmxlcm93IGNoYXIgaW4gY2hhcmFjdGVycyBjb2xzOjMgJX1JIFdJTEwgTk9UIEJFIE9VVFBVVHslIGVuZHRhYmxlcm93ICV9IiwgJ2NoYXJhY3RlcnMnID0+ICcnKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGFncy91bmxlc3NfZWxzZV90YWdfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvdW5sZXNzX2Vsc2VfdGFnX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxNGE3MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RhZ3MvdW5sZXNzX2Vsc2VfdGFnX3Rlc3QucmIKQEAgLTAsMCArMSwyNiBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIFVubGVzc0Vsc2VUYWdUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF91bmxlc3MKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgICcsICcgeyUgdW5sZXNzIHRydWUgJX0gdGhpcyB0ZXh0IHNob3VsZCBub3QgZ28gaW50byB0aGUgb3V0cHV0IHslIGVuZHVubGVzcyAlfSAnKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyAgdGhpcyB0ZXh0IHNob3VsZCBnbyBpbnRvIHRoZSBvdXRwdXQgICcsCisgICAgICAnIHslIHVubGVzcyBmYWxzZSAlfSB0aGlzIHRleHQgc2hvdWxkIGdvIGludG8gdGhlIG91dHB1dCB7JSBlbmR1bmxlc3MgJX0gJykKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgIHlvdSByb2NrID8nLCAneyUgdW5sZXNzIHRydWUgJX0geW91IHN1Y2sgeyUgZW5kdW5sZXNzICV9IHslIHVubGVzcyBmYWxzZSAlfSB5b3Ugcm9jayB7JSBlbmR1bmxlc3MgJX0/JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5sZXNzX2Vsc2UKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KCcgWUVTICcsICd7JSB1bmxlc3MgdHJ1ZSAlfSBOTyB7JSBlbHNlICV9IFlFUyB7JSBlbmR1bmxlc3MgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIHVubGVzcyBmYWxzZSAlfSBZRVMgeyUgZWxzZSAlfSBOTyB7JSBlbmR1bmxlc3MgJX0nKQorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoJyBZRVMgJywgJ3slIHVubGVzcyAiZm9vIiAlfSBOTyB7JSBlbHNlICV9IFlFUyB7JSBlbmR1bmxlc3MgJX0nKQorICBlbmQKKworICBkZWYgdGVzdF91bmxlc3NfaW5fbG9vcAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJzIzJywgJ3slIGZvciBpIGluIGNob2ljZXMgJX17JSB1bmxlc3MgaSAlfXt7IGZvcmxvb3AuaW5kZXggfX17JSBlbmR1bmxlc3MgJX17JSBlbmRmb3IgJX0nLCAnY2hvaWNlcycgPT4gWzEsIG5pbCwgZmFsc2VdCisgIGVuZAorCisgIGRlZiB0ZXN0X3VubGVzc19lbHNlX2luX2xvb3AKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0ICcgVFJVRSAgMiAgMyAnLCAneyUgZm9yIGkgaW4gY2hvaWNlcyAlfXslIHVubGVzcyBpICV9IHt7IGZvcmxvb3AuaW5kZXggfX0geyUgZWxzZSAlfSBUUlVFIHslIGVuZHVubGVzcyAlfXslIGVuZGZvciAlfScsICdjaG9pY2VzJyA9PiBbMSwgbmlsLCBmYWxzZV0KKyAgZW5kCitlbmQgIyBVbmxlc3NFbHNlVGVzdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdGVtcGxhdGVfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RlbXBsYXRlX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzYjk3NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L2ludGVncmF0aW9uL3RlbXBsYXRlX3Rlc3QucmIKQEAgLTAsMCArMSwzMjMgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworcmVxdWlyZSAndGltZW91dCcKKworY2xhc3MgVGVtcGxhdGVDb250ZXh0RHJvcCA8IExpcXVpZDo6RHJvcAorICBkZWYgbGlxdWlkX21ldGhvZF9taXNzaW5nKG1ldGhvZCkKKyAgICBtZXRob2QKKyAgZW5kCisKKyAgZGVmIGZvbworICAgICdmaXp6YnV6eicKKyAgZW5kCisKKyAgZGVmIGJhegorICAgIEBjb250ZXh0LnJlZ2lzdGVyc1snbHVseiddCisgIGVuZAorZW5kCisKK2NsYXNzIFNvbWV0aGluZ1dpdGhMZW5ndGggPCBMaXF1aWQ6OkRyb3AKKyAgZGVmIGxlbmd0aAorICAgIG5pbAorICBlbmQKK2VuZAorCitjbGFzcyBFcnJvbmVvdXNEcm9wIDwgTGlxdWlkOjpEcm9wCisgIGRlZiBiYWRfbWV0aG9kCisgICAgcmFpc2UgJ3J1YnkgZXJyb3IgaW4gZHJvcCcKKyAgZW5kCitlbmQKKworY2xhc3MgRHJvcFdpdGhVbmRlZmluZWRNZXRob2QgPCBMaXF1aWQ6OkRyb3AKKyAgZGVmIGZvbworICAgICdmb28nCisgIGVuZAorZW5kCisKK2NsYXNzIFRlbXBsYXRlVGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgZGVmIHRlc3RfaW5zdGFuY2VfYXNzaWduc19wZXJzaXN0X29uX3NhbWVfdGVtcGxhdGVfb2JqZWN0X2JldHdlZW5fcGFyc2VzCisgICAgdCA9IFRlbXBsYXRlLm5ldworICAgIGFzc2VydF9lcXVhbCAnZnJvbSBpbnN0YW5jZSBhc3NpZ25zJywgdC5wYXJzZSgieyUgYXNzaWduIGZvbyA9ICdmcm9tIGluc3RhbmNlIGFzc2lnbnMnICV9e3sgZm9vIH19IikucmVuZGVyIQorICAgIGFzc2VydF9lcXVhbCAnZnJvbSBpbnN0YW5jZSBhc3NpZ25zJywgdC5wYXJzZSgie3sgZm9vIH19IikucmVuZGVyIQorICBlbmQKKworICBkZWYgdGVzdF93YXJuaW5nc19pc19ub3RfZXhwb25lbnRpYWxfdGltZQorICAgIHN0ciA9ICJmYWxzZSIKKyAgICAxMDAudGltZXMgZG8KKyAgICAgIHN0ciA9ICJ7JSBpZiB0cnVlICV9dHJ1ZXslIGVsc2UgJX0je3N0cn17JSBlbmRpZiAlfSIKKyAgICBlbmQKKworICAgIHQgPSBUZW1wbGF0ZS5wYXJzZShzdHIpCisgICAgYXNzZXJ0X2VxdWFsIFtdLCBUaW1lb3V0LnRpbWVvdXQoMSkgeyB0Lndhcm5pbmdzIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5zdGFuY2VfYXNzaWduc19wZXJzaXN0X29uX3NhbWVfdGVtcGxhdGVfcGFyc2luZ19iZXR3ZWVuX3JlbmRlcnMKKyAgICB0ID0gVGVtcGxhdGUubmV3LnBhcnNlKCJ7eyBmb28gfX17JSBhc3NpZ24gZm9vID0gJ2ZvbycgJX17eyBmb28gfX0iKQorICAgIGFzc2VydF9lcXVhbCAnZm9vJywgdC5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsICdmb29mb28nLCB0LnJlbmRlciEKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3VzdG9tX2Fzc2lnbnNfZG9fbm90X3BlcnNpc3Rfb25fc2FtZV90ZW1wbGF0ZQorICAgIHQgPSBUZW1wbGF0ZS5uZXcKKyAgICBhc3NlcnRfZXF1YWwgJ2Zyb20gY3VzdG9tIGFzc2lnbnMnLCB0LnBhcnNlKCJ7eyBmb28gfX0iKS5yZW5kZXIhKCdmb28nID0+ICdmcm9tIGN1c3RvbSBhc3NpZ25zJykKKyAgICBhc3NlcnRfZXF1YWwgJycsIHQucGFyc2UoInt7IGZvbyB9fSIpLnJlbmRlciEKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3VzdG9tX2Fzc2lnbnNfc3F1YXNoX2luc3RhbmNlX2Fzc2lnbnMKKyAgICB0ID0gVGVtcGxhdGUubmV3CisgICAgYXNzZXJ0X2VxdWFsICdmcm9tIGluc3RhbmNlIGFzc2lnbnMnLCB0LnBhcnNlKCJ7JSBhc3NpZ24gZm9vID0gJ2Zyb20gaW5zdGFuY2UgYXNzaWducycgJX17eyBmb28gfX0iKS5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsICdmcm9tIGN1c3RvbSBhc3NpZ25zJywgdC5wYXJzZSgie3sgZm9vIH19IikucmVuZGVyISgnZm9vJyA9PiAnZnJvbSBjdXN0b20gYXNzaWducycpCisgIGVuZAorCisgIGRlZiB0ZXN0X3BlcnNpc3RlbnRfYXNzaWduc19zcXVhc2hfaW5zdGFuY2VfYXNzaWducworICAgIHQgPSBUZW1wbGF0ZS5uZXcKKyAgICBhc3NlcnRfZXF1YWwgJ2Zyb20gaW5zdGFuY2UgYXNzaWducycsIHQucGFyc2UoInslIGFzc2lnbiBmb28gPSAnZnJvbSBpbnN0YW5jZSBhc3NpZ25zJyAlfXt7IGZvbyB9fSIpLnJlbmRlciEKKyAgICB0LmFzc2lnbnNbJ2ZvbyddID0gJ2Zyb20gcGVyc2lzdGVudCBhc3NpZ25zJworICAgIGFzc2VydF9lcXVhbCAnZnJvbSBwZXJzaXN0ZW50IGFzc2lnbnMnLCB0LnBhcnNlKCJ7eyBmb28gfX0iKS5yZW5kZXIhCisgIGVuZAorCisgIGRlZiB0ZXN0X2xhbWJkYV9pc19jYWxsZWRfb25jZV9mcm9tX3BlcnNpc3RlbnRfYXNzaWduc19vdmVyX211bHRpcGxlX3BhcnNlc19hbmRfcmVuZGVycworICAgIHQgPSBUZW1wbGF0ZS5uZXcKKyAgICB0LmFzc2lnbnNbJ251bWJlciddID0gLT4geyBAZ2xvYmFsIHx8PSAwOyBAZ2xvYmFsICs9IDEgfQorICAgIGFzc2VydF9lcXVhbCAnMScsIHQucGFyc2UoInt7bnVtYmVyfX0iKS5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsICcxJywgdC5wYXJzZSgie3tudW1iZXJ9fSIpLnJlbmRlciEKKyAgICBhc3NlcnRfZXF1YWwgJzEnLCB0LnJlbmRlciEKKyAgICBAZ2xvYmFsID0gbmlsCisgIGVuZAorCisgIGRlZiB0ZXN0X2xhbWJkYV9pc19jYWxsZWRfb25jZV9mcm9tX2N1c3RvbV9hc3NpZ25zX292ZXJfbXVsdGlwbGVfcGFyc2VzX2FuZF9yZW5kZXJzCisgICAgdCA9IFRlbXBsYXRlLm5ldworICAgIGFzc2lnbnMgPSB7ICdudW1iZXInID0+IC0+IHsgQGdsb2JhbCB8fD0gMDsgQGdsb2JhbCArPSAxIH0gfQorICAgIGFzc2VydF9lcXVhbCAnMScsIHQucGFyc2UoInt7bnVtYmVyfX0iKS5yZW5kZXIhKGFzc2lnbnMpCisgICAgYXNzZXJ0X2VxdWFsICcxJywgdC5wYXJzZSgie3tudW1iZXJ9fSIpLnJlbmRlciEoYXNzaWducykKKyAgICBhc3NlcnRfZXF1YWwgJzEnLCB0LnJlbmRlciEoYXNzaWducykKKyAgICBAZ2xvYmFsID0gbmlsCisgIGVuZAorCisgIGRlZiB0ZXN0X3Jlc291cmNlX2xpbWl0c193b3Jrc193aXRoX2N1c3RvbV9sZW5ndGhfbWV0aG9kCisgICAgdCA9IFRlbXBsYXRlLnBhcnNlKCJ7JSBhc3NpZ24gZm9vID0gYmFyICV9IikKKyAgICB0LnJlc291cmNlX2xpbWl0cy5yZW5kZXJfbGVuZ3RoX2xpbWl0ID0gNDIKKyAgICBhc3NlcnRfZXF1YWwgIiIsIHQucmVuZGVyISgiYmFyIiA9PiBTb21ldGhpbmdXaXRoTGVuZ3RoLm5ldykKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVzb3VyY2VfbGltaXRzX3JlbmRlcl9sZW5ndGgKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoIjAxMjM0NTY3ODkiKQorICAgIHQucmVzb3VyY2VfbGltaXRzLnJlbmRlcl9sZW5ndGhfbGltaXQgPSA1CisgICAgYXNzZXJ0X2VxdWFsICJMaXF1aWQgZXJyb3I6IE1lbW9yeSBsaW1pdHMgZXhjZWVkZWQiLCB0LnJlbmRlcgorICAgIGFzc2VydCB0LnJlc291cmNlX2xpbWl0cy5yZWFjaGVkPworCisgICAgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX2xlbmd0aF9saW1pdCA9IDEwCisgICAgYXNzZXJ0X2VxdWFsICIwMTIzNDU2Nzg5IiwgdC5yZW5kZXIhCisgICAgcmVmdXRlX25pbCB0LnJlc291cmNlX2xpbWl0cy5yZW5kZXJfbGVuZ3RoCisgIGVuZAorCisgIGRlZiB0ZXN0X3Jlc291cmNlX2xpbWl0c19yZW5kZXJfc2NvcmUKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInslIGZvciBhIGluICgxLi4xMCkgJX0geyUgZm9yIGEgaW4gKDEuLjEwKSAlfSBmb28geyUgZW5kZm9yICV9IHslIGVuZGZvciAlfSIpCisgICAgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX3Njb3JlX2xpbWl0ID0gNTAKKyAgICBhc3NlcnRfZXF1YWwgIkxpcXVpZCBlcnJvcjogTWVtb3J5IGxpbWl0cyBleGNlZWRlZCIsIHQucmVuZGVyCisgICAgYXNzZXJ0IHQucmVzb3VyY2VfbGltaXRzLnJlYWNoZWQ/CisKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInslIGZvciBhIGluICgxLi4xMDApICV9IGZvbyB7JSBlbmRmb3IgJX0iKQorICAgIHQucmVzb3VyY2VfbGltaXRzLnJlbmRlcl9zY29yZV9saW1pdCA9IDUwCisgICAgYXNzZXJ0X2VxdWFsICJMaXF1aWQgZXJyb3I6IE1lbW9yeSBsaW1pdHMgZXhjZWVkZWQiLCB0LnJlbmRlcgorICAgIGFzc2VydCB0LnJlc291cmNlX2xpbWl0cy5yZWFjaGVkPworCisgICAgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX3Njb3JlX2xpbWl0ID0gMjAwCisgICAgYXNzZXJ0X2VxdWFsICgiIGZvbyAiICogMTAwKSwgdC5yZW5kZXIhCisgICAgcmVmdXRlX25pbCB0LnJlc291cmNlX2xpbWl0cy5yZW5kZXJfc2NvcmUKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVzb3VyY2VfbGltaXRzX2Fzc2lnbl9zY29yZQorICAgIHQgPSBUZW1wbGF0ZS5wYXJzZSgieyUgYXNzaWduIGZvbyA9IDQyICV9eyUgYXNzaWduIGJhciA9IDIzICV9IikKKyAgICB0LnJlc291cmNlX2xpbWl0cy5hc3NpZ25fc2NvcmVfbGltaXQgPSAxCisgICAgYXNzZXJ0X2VxdWFsICJMaXF1aWQgZXJyb3I6IE1lbW9yeSBsaW1pdHMgZXhjZWVkZWQiLCB0LnJlbmRlcgorICAgIGFzc2VydCB0LnJlc291cmNlX2xpbWl0cy5yZWFjaGVkPworCisgICAgdC5yZXNvdXJjZV9saW1pdHMuYXNzaWduX3Njb3JlX2xpbWl0ID0gMgorICAgIGFzc2VydF9lcXVhbCAiIiwgdC5yZW5kZXIhCisgICAgcmVmdXRlX25pbCB0LnJlc291cmNlX2xpbWl0cy5hc3NpZ25fc2NvcmUKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVzb3VyY2VfbGltaXRzX2Fzc2lnbl9zY29yZV9uZXN0ZWQKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInslIGFzc2lnbiBmb28gPSAnYWFhYScgfCByZXZlcnNlICV9IikKKworICAgIHQucmVzb3VyY2VfbGltaXRzLmFzc2lnbl9zY29yZV9saW1pdCA9IDMKKyAgICBhc3NlcnRfZXF1YWwgIkxpcXVpZCBlcnJvcjogTWVtb3J5IGxpbWl0cyBleGNlZWRlZCIsIHQucmVuZGVyCisgICAgYXNzZXJ0IHQucmVzb3VyY2VfbGltaXRzLnJlYWNoZWQ/CisKKyAgICB0LnJlc291cmNlX2xpbWl0cy5hc3NpZ25fc2NvcmVfbGltaXQgPSA1CisgICAgYXNzZXJ0X2VxdWFsICIiLCB0LnJlbmRlciEKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVzb3VyY2VfbGltaXRzX2Fib3J0c19yZW5kZXJpbmdfYWZ0ZXJfZmlyc3RfZXJyb3IKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInslIGZvciBhIGluICgxLi4xMDApICV9IGZvbzEgeyUgZW5kZm9yICV9IGJhciB7JSBmb3IgYSBpbiAoMS4uMTAwKSAlfSBmb28yIHslIGVuZGZvciAlfSIpCisgICAgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX3Njb3JlX2xpbWl0ID0gNTAKKyAgICBhc3NlcnRfZXF1YWwgIkxpcXVpZCBlcnJvcjogTWVtb3J5IGxpbWl0cyBleGNlZWRlZCIsIHQucmVuZGVyCisgICAgYXNzZXJ0IHQucmVzb3VyY2VfbGltaXRzLnJlYWNoZWQ/CisgIGVuZAorCisgIGRlZiB0ZXN0X3Jlc291cmNlX2xpbWl0c19oYXNoX2luX3RlbXBsYXRlX2dldHNfdXBkYXRlZF9ldmVuX2lmX25vX2xpbWl0c19hcmVfc2V0CisgICAgdCA9IFRlbXBsYXRlLnBhcnNlKCJ7JSBmb3IgYSBpbiAoMS4uMTAwKSAlfSB7JSBhc3NpZ24gZm9vID0gMSAlfSB7JSBlbmRmb3IgJX0iKQorICAgIHQucmVuZGVyIQorICAgIGFzc2VydCB0LnJlc291cmNlX2xpbWl0cy5hc3NpZ25fc2NvcmUgPiAwCisgICAgYXNzZXJ0IHQucmVzb3VyY2VfbGltaXRzLnJlbmRlcl9zY29yZSA+IDAKKyAgICBhc3NlcnQgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX2xlbmd0aCA+IDAKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVuZGVyX2xlbmd0aF9wZXJzaXN0c19iZXR3ZWVuX2Jsb2NrcworICAgIHQgPSBUZW1wbGF0ZS5wYXJzZSgieyUgaWYgdHJ1ZSAlfWFhYWF7JSBlbmRpZiAlfSIpCisgICAgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX2xlbmd0aF9saW1pdCA9IDcKKyAgICBhc3NlcnRfZXF1YWwgIkxpcXVpZCBlcnJvcjogTWVtb3J5IGxpbWl0cyBleGNlZWRlZCIsIHQucmVuZGVyCisgICAgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX2xlbmd0aF9saW1pdCA9IDgKKyAgICBhc3NlcnRfZXF1YWwgImFhYWEiLCB0LnJlbmRlcgorCisgICAgdCA9IFRlbXBsYXRlLnBhcnNlKCJ7JSBpZiB0cnVlICV9YWFhYXslIGVuZGlmICV9eyUgaWYgdHJ1ZSAlfWJiYnslIGVuZGlmICV9IikKKyAgICB0LnJlc291cmNlX2xpbWl0cy5yZW5kZXJfbGVuZ3RoX2xpbWl0ID0gMTMKKyAgICBhc3NlcnRfZXF1YWwgIkxpcXVpZCBlcnJvcjogTWVtb3J5IGxpbWl0cyBleGNlZWRlZCIsIHQucmVuZGVyCisgICAgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX2xlbmd0aF9saW1pdCA9IDE0CisgICAgYXNzZXJ0X2VxdWFsICJhYWFhYmJiIiwgdC5yZW5kZXIKKworICAgIHQgPSBUZW1wbGF0ZS5wYXJzZSgieyUgaWYgdHJ1ZSAlfWF7JSBlbmRpZiAlfXslIGlmIHRydWUgJX1ieyUgZW5kaWYgJX17JSBpZiB0cnVlICV9YXslIGVuZGlmICV9eyUgaWYgdHJ1ZSAlfWJ7JSBlbmRpZiAlfXslIGlmIHRydWUgJX1heyUgZW5kaWYgJX17JSBpZiB0cnVlICV9YnslIGVuZGlmICV9IikKKyAgICB0LnJlc291cmNlX2xpbWl0cy5yZW5kZXJfbGVuZ3RoX2xpbWl0ID0gNQorICAgIGFzc2VydF9lcXVhbCAiTGlxdWlkIGVycm9yOiBNZW1vcnkgbGltaXRzIGV4Y2VlZGVkIiwgdC5yZW5kZXIKKyAgICB0LnJlc291cmNlX2xpbWl0cy5yZW5kZXJfbGVuZ3RoX2xpbWl0ID0gMTEKKyAgICBhc3NlcnRfZXF1YWwgIkxpcXVpZCBlcnJvcjogTWVtb3J5IGxpbWl0cyBleGNlZWRlZCIsIHQucmVuZGVyCisgICAgdC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX2xlbmd0aF9saW1pdCA9IDEyCisgICAgYXNzZXJ0X2VxdWFsICJhYmFiYWIiLCB0LnJlbmRlcgorICBlbmQKKworICBkZWYgdGVzdF9kZWZhdWx0X3Jlc291cmNlX2xpbWl0c191bmFmZmVjdGVkX2J5X3JlbmRlcl93aXRoX2NvbnRleHQKKyAgICBjb250ZXh0ID0gQ29udGV4dC5uZXcKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInslIGZvciBhIGluICgxLi4xMDApICV9IHslIGFzc2lnbiBmb28gPSAxICV9IHslIGVuZGZvciAlfSIpCisgICAgdC5yZW5kZXIhKGNvbnRleHQpCisgICAgYXNzZXJ0IGNvbnRleHQucmVzb3VyY2VfbGltaXRzLmFzc2lnbl9zY29yZSA+IDAKKyAgICBhc3NlcnQgY29udGV4dC5yZXNvdXJjZV9saW1pdHMucmVuZGVyX3Njb3JlID4gMAorICAgIGFzc2VydCBjb250ZXh0LnJlc291cmNlX2xpbWl0cy5yZW5kZXJfbGVuZ3RoID4gMAorICBlbmQKKworICBkZWYgdGVzdF9jYW5fdXNlX2Ryb3BfYXNfY29udGV4dAorICAgIHQgPSBUZW1wbGF0ZS5uZXcKKyAgICB0LnJlZ2lzdGVyc1snbHVseiddID0gJ2hhaGEnCisgICAgZHJvcCA9IFRlbXBsYXRlQ29udGV4dERyb3AubmV3CisgICAgYXNzZXJ0X2VxdWFsICdmaXp6YnV6eicsIHQucGFyc2UoJ3t7Zm9vfX0nKS5yZW5kZXIhKGRyb3ApCisgICAgYXNzZXJ0X2VxdWFsICdiYXInLCB0LnBhcnNlKCd7e2Jhcn19JykucmVuZGVyIShkcm9wKQorICAgIGFzc2VydF9lcXVhbCAnaGFoYScsIHQucGFyc2UoInt7YmF6fX0iKS5yZW5kZXIhKGRyb3ApCisgIGVuZAorCisgIGRlZiB0ZXN0X3JlbmRlcl9iYW5nX2ZvcmNlX3JldGhyb3dfZXJyb3JzX29uX3Bhc3NlZF9jb250ZXh0CisgICAgY29udGV4dCA9IENvbnRleHQubmV3KHsgJ2Ryb3AnID0+IEVycm9uZW91c0Ryb3AubmV3IH0pCisgICAgdCA9IFRlbXBsYXRlLm5ldy5wYXJzZSgne3sgZHJvcC5iYWRfbWV0aG9kIH19JykKKworICAgIGUgPSBhc3NlcnRfcmFpc2VzIFJ1bnRpbWVFcnJvciBkbworICAgICAgdC5yZW5kZXIhKGNvbnRleHQpCisgICAgZW5kCisgICAgYXNzZXJ0X2VxdWFsICdydWJ5IGVycm9yIGluIGRyb3AnLCBlLm1lc3NhZ2UKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXhjZXB0aW9uX3JlbmRlcmVyX3RoYXRfcmV0dXJuc19zdHJpbmcKKyAgICBleGNlcHRpb24gPSBuaWwKKyAgICBoYW5kbGVyID0gLT4oZSkgeyBleGNlcHRpb24gPSBlOyAnPCEtLSBlcnJvciAtLT4nIH0KKworICAgIG91dHB1dCA9IFRlbXBsYXRlLnBhcnNlKCJ7eyAxIHwgZGl2aWRlZF9ieTogMCB9fSIpLnJlbmRlcih7fSwgZXhjZXB0aW9uX3JlbmRlcmVyOiBoYW5kbGVyKQorCisgICAgYXNzZXJ0IGV4Y2VwdGlvbi5pc19hPyhMaXF1aWQ6Olplcm9EaXZpc2lvbkVycm9yKQorICAgIGFzc2VydF9lcXVhbCAnPCEtLSBlcnJvciAtLT4nLCBvdXRwdXQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXhjZXB0aW9uX3JlbmRlcmVyX3RoYXRfcmFpc2VzCisgICAgZXhjZXB0aW9uID0gbmlsCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6Olplcm9EaXZpc2lvbkVycm9yKSBkbworICAgICAgVGVtcGxhdGUucGFyc2UoInt7IDEgfCBkaXZpZGVkX2J5OiAwIH19IikucmVuZGVyKHt9LCBleGNlcHRpb25fcmVuZGVyZXI6IC0+KGUpIHsgZXhjZXB0aW9uID0gZTsgcmFpc2UgfSkKKyAgICBlbmQKKyAgICBhc3NlcnQgZXhjZXB0aW9uLmlzX2E/KExpcXVpZDo6WmVyb0RpdmlzaW9uRXJyb3IpCisgIGVuZAorCisgIGRlZiB0ZXN0X2dsb2JhbF9maWx0ZXJfb3B0aW9uX29uX3JlbmRlcgorICAgIGdsb2JhbF9maWx0ZXJfcHJvYyA9IC0+KG91dHB1dCkgeyAiI3tvdXRwdXR9IGZpbHRlcmVkIiB9CisgICAgcmVuZGVyZWRfdGVtcGxhdGUgPSBUZW1wbGF0ZS5wYXJzZSgie3tuYW1lfX0iKS5yZW5kZXIoeyAibmFtZSIgPT4gImJvYiIgfSwgZ2xvYmFsX2ZpbHRlcjogZ2xvYmFsX2ZpbHRlcl9wcm9jKQorCisgICAgYXNzZXJ0X2VxdWFsICdib2IgZmlsdGVyZWQnLCByZW5kZXJlZF90ZW1wbGF0ZQorICBlbmQKKworICBkZWYgdGVzdF9nbG9iYWxfZmlsdGVyX29wdGlvbl93aGVuX25hdGl2ZV9maWx0ZXJzX2V4aXN0CisgICAgZ2xvYmFsX2ZpbHRlcl9wcm9jID0gLT4ob3V0cHV0KSB7ICIje291dHB1dH0gZmlsdGVyZWQiIH0KKyAgICByZW5kZXJlZF90ZW1wbGF0ZSA9IFRlbXBsYXRlLnBhcnNlKCJ7e25hbWUgfCB1cGNhc2V9fSIpLnJlbmRlcih7ICJuYW1lIiA9PiAiYm9iIiB9LCBnbG9iYWxfZmlsdGVyOiBnbG9iYWxfZmlsdGVyX3Byb2MpCisKKyAgICBhc3NlcnRfZXF1YWwgJ0JPQiBmaWx0ZXJlZCcsIHJlbmRlcmVkX3RlbXBsYXRlCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuZGVmaW5lZF92YXJpYWJsZXMKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInt7eH19IHt7eX19IHt7ei5hfX0ge3t6LmJ9fSB7e3ouYy5kfX0iKQorICAgIHJlc3VsdCA9IHQucmVuZGVyKHsgJ3gnID0+IDMzLCAneicgPT4geyAnYScgPT4gMzIsICdjJyA9PiB7ICdlJyA9PiAzMSB9IH0gfSwgeyBzdHJpY3RfdmFyaWFibGVzOiB0cnVlIH0pCisKKyAgICBhc3NlcnRfZXF1YWwgJzMzICAzMiAgJywgcmVzdWx0CisgICAgYXNzZXJ0X2VxdWFsIDMsIHQuZXJyb3JzLmNvdW50CisgICAgYXNzZXJ0X2luc3RhbmNlX29mIExpcXVpZDo6VW5kZWZpbmVkVmFyaWFibGUsIHQuZXJyb3JzWzBdCisgICAgYXNzZXJ0X2VxdWFsICdMaXF1aWQgZXJyb3I6IHVuZGVmaW5lZCB2YXJpYWJsZSB5JywgdC5lcnJvcnNbMF0ubWVzc2FnZQorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBMaXF1aWQ6OlVuZGVmaW5lZFZhcmlhYmxlLCB0LmVycm9yc1sxXQorICAgIGFzc2VydF9lcXVhbCAnTGlxdWlkIGVycm9yOiB1bmRlZmluZWQgdmFyaWFibGUgYicsIHQuZXJyb3JzWzFdLm1lc3NhZ2UKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgTGlxdWlkOjpVbmRlZmluZWRWYXJpYWJsZSwgdC5lcnJvcnNbMl0KKyAgICBhc3NlcnRfZXF1YWwgJ0xpcXVpZCBlcnJvcjogdW5kZWZpbmVkIHZhcmlhYmxlIGQnLCB0LmVycm9yc1syXS5tZXNzYWdlCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuZGVmaW5lZF92YXJpYWJsZXNfcmFpc2UKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInt7eH19IHt7eX19IHt7ei5hfX0ge3t6LmJ9fSB7e3ouYy5kfX0iKQorCisgICAgYXNzZXJ0X3JhaXNlcyBVbmRlZmluZWRWYXJpYWJsZSBkbworICAgICAgdC5yZW5kZXIhKHsgJ3gnID0+IDMzLCAneicgPT4geyAnYScgPT4gMzIsICdjJyA9PiB7ICdlJyA9PiAzMSB9IH0gfSwgeyBzdHJpY3RfdmFyaWFibGVzOiB0cnVlIH0pCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuZGVmaW5lZF9kcm9wX21ldGhvZHMKKyAgICBkID0gRHJvcFdpdGhVbmRlZmluZWRNZXRob2QubmV3CisgICAgdCA9IFRlbXBsYXRlLm5ldy5wYXJzZSgne3sgZm9vIH19IHt7IHdvb3QgfX0nKQorICAgIHJlc3VsdCA9IHQucmVuZGVyKGQsIHsgc3RyaWN0X3ZhcmlhYmxlczogdHJ1ZSB9KQorCisgICAgYXNzZXJ0X2VxdWFsICdmb28gJywgcmVzdWx0CisgICAgYXNzZXJ0X2VxdWFsIDEsIHQuZXJyb3JzLmNvdW50CisgICAgYXNzZXJ0X2luc3RhbmNlX29mIExpcXVpZDo6VW5kZWZpbmVkRHJvcE1ldGhvZCwgdC5lcnJvcnNbMF0KKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5kZWZpbmVkX2Ryb3BfbWV0aG9kc19yYWlzZQorICAgIGQgPSBEcm9wV2l0aFVuZGVmaW5lZE1ldGhvZC5uZXcKKyAgICB0ID0gVGVtcGxhdGUubmV3LnBhcnNlKCd7eyBmb28gfX0ge3sgd29vdCB9fScpCisKKyAgICBhc3NlcnRfcmFpc2VzIFVuZGVmaW5lZERyb3BNZXRob2QgZG8KKyAgICAgIHQucmVuZGVyIShkLCB7IHN0cmljdF92YXJpYWJsZXM6IHRydWUgfSkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5kZWZpbmVkX2ZpbHRlcnMKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInt7YX19IHt7eCB8IHVwY2FzZSB8IHNvbWVmaWx0ZXIxIHwgc29tZWZpbHRlcjIgfCBzb21lZmlsdGVyM319IikKKyAgICBmaWx0ZXJzID0gTW9kdWxlLm5ldyBkbworICAgICAgZGVmIHNvbWVmaWx0ZXIzKHYpCisgICAgICAgICItI3t2fS0iCisgICAgICBlbmQKKyAgICBlbmQKKyAgICByZXN1bHQgPSB0LnJlbmRlcih7ICdhJyA9PiAxMjMsICd4JyA9PiAnZm9vJyB9LCB7IGZpbHRlcnM6IFtmaWx0ZXJzXSwgc3RyaWN0X2ZpbHRlcnM6IHRydWUgfSkKKworICAgIGFzc2VydF9lcXVhbCAnMTIzICcsIHJlc3VsdAorICAgIGFzc2VydF9lcXVhbCAxLCB0LmVycm9ycy5jb3VudAorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBMaXF1aWQ6OlVuZGVmaW5lZEZpbHRlciwgdC5lcnJvcnNbMF0KKyAgICBhc3NlcnRfZXF1YWwgJ0xpcXVpZCBlcnJvcjogdW5kZWZpbmVkIGZpbHRlciBzb21lZmlsdGVyMScsIHQuZXJyb3JzWzBdLm1lc3NhZ2UKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5kZWZpbmVkX2ZpbHRlcnNfcmFpc2UKKyAgICB0ID0gVGVtcGxhdGUucGFyc2UoInt7eCB8IHNvbWVmaWx0ZXIxIHwgdXBjYXNlIHwgc29tZWZpbHRlcjJ9fSIpCisKKyAgICBhc3NlcnRfcmFpc2VzIFVuZGVmaW5lZEZpbHRlciBkbworICAgICAgdC5yZW5kZXIhKHsgJ3gnID0+ICdmb28nIH0sIHsgc3RyaWN0X2ZpbHRlcnM6IHRydWUgfSkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXNpbmdfcmFuZ2VfbGl0ZXJhbF93b3Jrc19hc19leHBlY3RlZAorICAgIHQgPSBUZW1wbGF0ZS5wYXJzZSgieyUgYXNzaWduIGZvbyA9ICh4Li55KSAlfXt7IGZvbyB9fSIpCisgICAgcmVzdWx0ID0gdC5yZW5kZXIoeyAneCcgPT4gMSwgJ3knID0+IDUgfSkKKyAgICBhc3NlcnRfZXF1YWwgJzEuLjUnLCByZXN1bHQKKworICAgIHQgPSBUZW1wbGF0ZS5wYXJzZSgieyUgYXNzaWduIG51bXMgPSAoeC4ueSkgJX17JSBmb3IgbnVtIGluIG51bXMgJX17eyBudW0gfX17JSBlbmRmb3IgJX0iKQorICAgIHJlc3VsdCA9IHQucmVuZGVyKHsgJ3gnID0+IDEsICd5JyA9PiA1IH0pCisgICAgYXNzZXJ0X2VxdWFsICcxMjM0NScsIHJlc3VsdAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdHJpbV9tb2RlX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi90cmltX21vZGVfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI0ZmUzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdHJpbV9tb2RlX3Rlc3QucmIKQEAgLTAsMCArMSw1MjUgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBUcmltTW9kZVRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgICMgTWFrZSBzdXJlIHRoZSB0cmltIGlzbid0IGFwcGxpZWQgdG8gc3RhbmRhcmQgb3V0cHV0CisgIGRlZiB0ZXN0X3N0YW5kYXJkX291dHB1dAorICAgIHRleHQgPSA8PC1FTkRfVEVNUExBVEUKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorICAgICAgICAgIHt7ICdKb2huJyB9fQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+CisgICAgICAgICAgSm9obgorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfRVhQRUNURUQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZV9vdXRwdXRfd2l0aF9tdWx0aXBsZV9ibGFua19saW5lcworICAgIHRleHQgPSA8PC1FTkRfVEVNUExBVEUKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorCisKKyAgICAgICAgICB7ey0gJ0pvaG4nIC19fQorCisKKyAgICAgICAgPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX1RFTVBMQVRFCisgICAgZXhwZWN0ZWQgPSA8PC1FTkRfRVhQRUNURUQKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPkpvaG48L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfRVhQRUNURUQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF90YWdfb3V0cHV0X3dpdGhfbXVsdGlwbGVfYmxhbmtfbGluZXMKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKworCisgICAgICAgICAgeyUtIGlmIHRydWUgLSV9CisgICAgICAgICAgeWVzCisgICAgICAgICAgeyUtIGVuZGlmIC0lfQorCisKKyAgICAgICAgPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX1RFTVBMQVRFCisgICAgZXhwZWN0ZWQgPSA8PC1FTkRfRVhQRUNURUQKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPnllczwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorCisgICMgTWFrZSBzdXJlIHRoZSB0cmltIGlzbid0IGFwcGxpZWQgdG8gc3RhbmRhcmQgdGFncworICBkZWYgdGVzdF9zdGFuZGFyZF90YWdzCisgICAgd2hpdGVzcGFjZSA9ICcgICAgICAgICAgJworICAgIHRleHQgPSA8PC1FTkRfVEVNUExBVEUKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorICAgICAgICAgIHslIGlmIHRydWUgJX0KKyAgICAgICAgICB5ZXMKKyAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+Cisje3doaXRlc3BhY2V9CisgICAgICAgICAgeWVzCisje3doaXRlc3BhY2V9CisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7JSBpZiBmYWxzZSAlfQorICAgICAgICAgIG5vCisgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX1RFTVBMQVRFCisgICAgZXhwZWN0ZWQgPSA8PC1FTkRfRVhQRUNURUQKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorI3t3aGl0ZXNwYWNlfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfRVhQRUNURUQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICAjIE1ha2Ugc3VyZSB0aGUgdHJpbSBpc24ndCB0b28gYWdyZXNzaXZlCisgIGRlZiB0ZXN0X25vX3RyaW1fb3V0cHV0CisgICAgdGV4dCA9ICc8cD57ey0gXCdKb2huXCcgLX19PC9wPicKKyAgICBleHBlY3RlZCA9ICc8cD5Kb2huPC9wPicKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICAjIE1ha2Ugc3VyZSB0aGUgdHJpbSBpc24ndCB0b28gYWdyZXNzaXZlCisgIGRlZiB0ZXN0X25vX3RyaW1fdGFncworICAgIHRleHQgPSAnPHA+eyUtIGlmIHRydWUgLSV9eWVzeyUtIGVuZGlmIC0lfTwvcD4nCisgICAgZXhwZWN0ZWQgPSAnPHA+eWVzPC9wPicKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorCisgICAgdGV4dCA9ICc8cD57JS0gaWYgZmFsc2UgLSV9bm97JS0gZW5kaWYgLSV9PC9wPicKKyAgICBleHBlY3RlZCA9ICc8cD48L3A+JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpbmdsZV9saW5lX291dGVyX3RhZworICAgIHRleHQgPSAnPHA+IHslLSBpZiB0cnVlICV9IHllcyB7JSBlbmRpZiAtJX0gPC9wPicKKyAgICBleHBlY3RlZCA9ICc8cD4geWVzIDwvcD4nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKworICAgIHRleHQgPSAnPHA+IHslLSBpZiBmYWxzZSAlfSBubyB7JSBlbmRpZiAtJX0gPC9wPicKKyAgICBleHBlY3RlZCA9ICc8cD48L3A+JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpbmdsZV9saW5lX2lubmVyX3RhZworICAgIHRleHQgPSAnPHA+IHslIGlmIHRydWUgLSV9IHllcyB7JS0gZW5kaWYgJX0gPC9wPicKKyAgICBleHBlY3RlZCA9ICc8cD4geWVzIDwvcD4nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKworICAgIHRleHQgPSAnPHA+IHslIGlmIGZhbHNlIC0lfSBubyB7JS0gZW5kaWYgJX0gPC9wPicKKyAgICBleHBlY3RlZCA9ICc8cD4gIDwvcD4nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2luZ2xlX2xpbmVfcG9zdF90YWcKKyAgICB0ZXh0ID0gJzxwPiB7JSBpZiB0cnVlIC0lfSB5ZXMgeyUgZW5kaWYgLSV9IDwvcD4nCisgICAgZXhwZWN0ZWQgPSAnPHA+IHllcyA8L3A+JworICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisKKyAgICB0ZXh0ID0gJzxwPiB7JSBpZiBmYWxzZSAtJX0gbm8geyUgZW5kaWYgLSV9IDwvcD4nCisgICAgZXhwZWN0ZWQgPSAnPHA+IDwvcD4nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2luZ2xlX2xpbmVfcHJlX3RhZworICAgIHRleHQgPSAnPHA+IHslLSBpZiB0cnVlICV9IHllcyB7JS0gZW5kaWYgJX0gPC9wPicKKyAgICBleHBlY3RlZCA9ICc8cD4geWVzIDwvcD4nCisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKworICAgIHRleHQgPSAnPHA+IHslLSBpZiBmYWxzZSAlfSBubyB7JS0gZW5kaWYgJX0gPC9wPicKKyAgICBleHBlY3RlZCA9ICc8cD4gPC9wPicKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9wcmVfdHJpbV9vdXRwdXQKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7ey0gJ0pvaG4nIH19CisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9URU1QTEFURQorICAgIGV4cGVjdGVkID0gPDwtRU5EX0VYUEVDVEVECisgICAgICA8ZGl2PgorICAgICAgICA8cD5Kb2huCisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3ByZV90cmltX3RhZ3MKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7JS0gaWYgdHJ1ZSAlfQorICAgICAgICAgIHllcworICAgICAgICAgIHslLSBlbmRpZiAlfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+CisgICAgICAgICAgeWVzCisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7JS0gaWYgZmFsc2UgJX0KKyAgICAgICAgICBubworICAgICAgICAgIHslLSBlbmRpZiAlfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+CisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3Bvc3RfdHJpbV9vdXRwdXQKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7eyAnSm9obicgLX19CisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9URU1QTEFURQorICAgIGV4cGVjdGVkID0gPDwtRU5EX0VYUEVDVEVECisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICBKb2huPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX0VYUEVDVEVECisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcG9zdF90cmltX3RhZ3MKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7JSBpZiB0cnVlIC0lfQorICAgICAgICAgIHllcworICAgICAgICAgIHslIGVuZGlmIC0lfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+CisgICAgICAgICAgeWVzCisgICAgICAgICAgPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX0VYUEVDVEVECisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKworICAgIHRleHQgPSA8PC1FTkRfVEVNUExBVEUKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorICAgICAgICAgIHslIGlmIGZhbHNlIC0lfQorICAgICAgICAgIG5vCisgICAgICAgICAgeyUgZW5kaWYgLSV9CisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9URU1QTEFURQorICAgIGV4cGVjdGVkID0gPDwtRU5EX0VYUEVDVEVECisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfRVhQRUNURUQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9wcmVfYW5kX3Bvc3RfdHJpbV90YWdzCisgICAgdGV4dCA9IDw8LUVORF9URU1QTEFURQorICAgICAgPGRpdj4KKyAgICAgICAgPHA+CisgICAgICAgICAgeyUtIGlmIHRydWUgJX0KKyAgICAgICAgICB5ZXMKKyAgICAgICAgICB7JSBlbmRpZiAtJX0KKyAgICAgICAgPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX1RFTVBMQVRFCisgICAgZXhwZWN0ZWQgPSA8PC1FTkRfRVhQRUNURUQKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorICAgICAgICAgIHllcworICAgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7JS0gaWYgZmFsc2UgJX0KKyAgICAgICAgICBubworICAgICAgICAgIHslIGVuZGlmIC0lfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+PC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX0VYUEVDVEVECisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcG9zdF9hbmRfcHJlX3RyaW1fdGFncworICAgIHRleHQgPSA8PC1FTkRfVEVNUExBVEUKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorICAgICAgICAgIHslIGlmIHRydWUgLSV9CisgICAgICAgICAgeWVzCisgICAgICAgICAgeyUtIGVuZGlmICV9CisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9URU1QTEFURQorICAgIGV4cGVjdGVkID0gPDwtRU5EX0VYUEVDVEVECisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB5ZXMKKyAgICAgICAgPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX0VYUEVDVEVECisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKworICAgIHdoaXRlc3BhY2UgPSAnICAgICAgICAgICcKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7JSBpZiBmYWxzZSAtJX0KKyAgICAgICAgICBubworICAgICAgICAgIHslLSBlbmRpZiAlfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+Cisje3doaXRlc3BhY2V9CisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3RyaW1fb3V0cHV0CisgICAgdGV4dCA9IDw8LUVORF9URU1QTEFURQorICAgICAgPGRpdj4KKyAgICAgICAgPHA+CisgICAgICAgICAge3stICdKb2huJyAtfX0KKyAgICAgICAgPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX1RFTVBMQVRFCisgICAgZXhwZWN0ZWQgPSA8PC1FTkRfRVhQRUNURUQKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPkpvaG48L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfRVhQRUNURUQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF90cmltX3RhZ3MKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7JS0gaWYgdHJ1ZSAtJX0KKyAgICAgICAgICB5ZXMKKyAgICAgICAgICB7JS0gZW5kaWYgLSV9CisgICAgICAgIDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9URU1QTEFURQorICAgIGV4cGVjdGVkID0gPDwtRU5EX0VYUEVDVEVECisgICAgICA8ZGl2PgorICAgICAgICA8cD55ZXM8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfRVhQRUNURUQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorCisgICAgdGV4dCA9IDw8LUVORF9URU1QTEFURQorICAgICAgPGRpdj4KKyAgICAgICAgPHA+CisgICAgICAgICAgeyUtIGlmIGZhbHNlIC0lfQorICAgICAgICAgIG5vCisgICAgICAgICAgeyUtIGVuZGlmIC0lfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+PC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX0VYUEVDVEVECisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfd2hpdGVzcGFjZV90cmltX291dHB1dAorICAgIHRleHQgPSA8PC1FTkRfVEVNUExBVEUKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorICAgICAgICAgIHt7LSAnSm9obicgLX19LAorICAgICAgICAgIHt7LSAnMzAnIC19fQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+Sm9obiwzMDwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3doaXRlc3BhY2VfdHJpbV90YWdzCisgICAgdGV4dCA9IDw8LUVORF9URU1QTEFURQorICAgICAgPGRpdj4KKyAgICAgICAgPHA+CisgICAgICAgICAgeyUtIGlmIHRydWUgLSV9CisgICAgICAgICAgeWVzCisgICAgICAgICAgeyUtIGVuZGlmIC0lfQorICAgICAgICA8L3A+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+eWVzPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX0VYUEVDVEVECisgICAgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGV4dCkKKworICAgIHRleHQgPSA8PC1FTkRfVEVNUExBVEUKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPgorICAgICAgICAgIHslLSBpZiBmYWxzZSAtJX0KKyAgICAgICAgICBubworICAgICAgICAgIHslLSBlbmRpZiAtJX0KKyAgICAgICAgPC9wPgorICAgICAgPC9kaXY+CisgICAgRU5EX1RFTVBMQVRFCisgICAgZXhwZWN0ZWQgPSA8PC1FTkRfRVhQRUNURUQKKyAgICAgIDxkaXY+CisgICAgICAgIDxwPjwvcD4KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBsZXhfdHJpbV9vdXRwdXQKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICA8cD4KKyAgICAgICAgICB7ey0gJ0pvaG4nIC19fQorICAgICAgICAgIHt7LSAnMzAnIC19fQorICAgICAgICA8L3A+CisgICAgICAgIDxiPgorICAgICAgICAgIHt7ICdKb2huJyAtfX0KKyAgICAgICAgICB7ey0gJzMwJyB9fQorICAgICAgICA8L2I+CisgICAgICAgIDxpPgorICAgICAgICAgIHt7LSAnSm9obicgfX0KKyAgICAgICAgICB7eyAnMzAnIC19fQorICAgICAgICA8L2k+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyAgICAgICAgPHA+Sm9objMwPC9wPgorICAgICAgICA8Yj4KKyAgICAgICAgICBKb2huMzAKKyAgICAgICAgPC9iPgorICAgICAgICA8aT5Kb2huCisgICAgICAgICAgMzA8L2k+CisgICAgICA8L2Rpdj4KKyAgICBFTkRfRVhQRUNURUQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9jb21wbGV4X3RyaW0KKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICB7JS0gaWYgdHJ1ZSAtJX0KKyAgICAgICAgICB7JS0gaWYgdHJ1ZSAtJX0KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICB7ey0gJ0pvaG4nIC19fQorICAgICAgICAgICAgPC9wPgorICAgICAgICAgIHslLSBlbmRpZiAtJX0KKyAgICAgICAgeyUtIGVuZGlmIC0lfQorICAgICAgPC9kaXY+CisgICAgRU5EX1RFTVBMQVRFCisgICAgZXhwZWN0ZWQgPSA8PC1FTkRfRVhQRUNURUQKKyAgICAgIDxkaXY+PHA+Sm9objwvcD48L2Rpdj4KKyAgICBFTkRfRVhQRUNURUQKKyAgICBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0KGV4cGVjdGVkLCB0ZXh0KQorICBlbmQKKworICBkZWYgdGVzdF9yYXdfb3V0cHV0CisgICAgd2hpdGVzcGFjZSA9ICcgICAgICAgICcKKyAgICB0ZXh0ID0gPDwtRU5EX1RFTVBMQVRFCisgICAgICA8ZGl2PgorICAgICAgICB7JSByYXcgJX0KKyAgICAgICAgICB7JS0gaWYgdHJ1ZSAtJX0KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICB7ey0gJ0pvaG4nIC19fQorICAgICAgICAgICAgPC9wPgorICAgICAgICAgIHslLSBlbmRpZiAtJX0KKyAgICAgICAgeyUgZW5kcmF3ICV9CisgICAgICA8L2Rpdj4KKyAgICBFTkRfVEVNUExBVEUKKyAgICBleHBlY3RlZCA9IDw8LUVORF9FWFBFQ1RFRAorICAgICAgPGRpdj4KKyN7d2hpdGVzcGFjZX0KKyAgICAgICAgICB7JS0gaWYgdHJ1ZSAtJX0KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICB7ey0gJ0pvaG4nIC19fQorICAgICAgICAgICAgPC9wPgorICAgICAgICAgIHslLSBlbmRpZiAtJX0KKyN7d2hpdGVzcGFjZX0KKyAgICAgIDwvZGl2PgorICAgIEVORF9FWFBFQ1RFRAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQoZXhwZWN0ZWQsIHRleHQpCisgIGVuZAorZW5kICMgVHJpbU1vZGVUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC9pbnRlZ3JhdGlvbi92YXJpYWJsZV90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdmFyaWFibGVfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGRmODMzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvaW50ZWdyYXRpb24vdmFyaWFibGVfdGVzdC5yYgpAQCAtMCwwICsxLDkyIEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgVmFyaWFibGVUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9zaW1wbGVfdmFyaWFibGUKKyAgICB0ZW1wbGF0ZSA9IFRlbXBsYXRlLnBhcnNlKCUoe3t0ZXN0fX0pKQorICAgIGFzc2VydF9lcXVhbCAnd29ya2VkJywgdGVtcGxhdGUucmVuZGVyISgndGVzdCcgPT4gJ3dvcmtlZCcpCisgICAgYXNzZXJ0X2VxdWFsICd3b3JrZWQgd29uZGVyZnVsbHknLCB0ZW1wbGF0ZS5yZW5kZXIhKCd0ZXN0JyA9PiAnd29ya2VkIHdvbmRlcmZ1bGx5JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyaWFibGVfcmVuZGVyX2NhbGxzX3RvX2xpcXVpZAorICAgIGFzc2VydF90ZW1wbGF0ZV9yZXN1bHQgJ2Zvb2JhcicsICd7eyBmb28gfX0nLCAnZm9vJyA9PiBUaGluZ1dpdGhUb0xpcXVpZC5uZXcKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2ltcGxlX3dpdGhfd2hpdGVzcGFjZXMKKyAgICB0ZW1wbGF0ZSA9IFRlbXBsYXRlLnBhcnNlKCUoICB7eyB0ZXN0IH19ICApKQorICAgIGFzc2VydF9lcXVhbCAnICB3b3JrZWQgICcsIHRlbXBsYXRlLnJlbmRlciEoJ3Rlc3QnID0+ICd3b3JrZWQnKQorICAgIGFzc2VydF9lcXVhbCAnICB3b3JrZWQgd29uZGVyZnVsbHkgICcsIHRlbXBsYXRlLnJlbmRlciEoJ3Rlc3QnID0+ICd3b3JrZWQgd29uZGVyZnVsbHknKQorICBlbmQKKworICBkZWYgdGVzdF9pZ25vcmVfdW5rbm93bgorICAgIHRlbXBsYXRlID0gVGVtcGxhdGUucGFyc2UoJSh7eyB0ZXN0IH19KSkKKyAgICBhc3NlcnRfZXF1YWwgJycsIHRlbXBsYXRlLnJlbmRlciEKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXNpbmdfYmxhbmtfYXNfdmFyaWFibGVfbmFtZQorICAgIHRlbXBsYXRlID0gVGVtcGxhdGUucGFyc2UoInslIGFzc2lnbiBmb28gPSBibGFuayAlfXt7IGZvbyB9fSIpCisgICAgYXNzZXJ0X2VxdWFsICcnLCB0ZW1wbGF0ZS5yZW5kZXIhCisgIGVuZAorCisgIGRlZiB0ZXN0X3VzaW5nX2VtcHR5X2FzX3ZhcmlhYmxlX25hbWUKKyAgICB0ZW1wbGF0ZSA9IFRlbXBsYXRlLnBhcnNlKCJ7JSBhc3NpZ24gZm9vID0gZW1wdHkgJX17eyBmb28gfX0iKQorICAgIGFzc2VydF9lcXVhbCAnJywgdGVtcGxhdGUucmVuZGVyIQorICBlbmQKKworICBkZWYgdGVzdF9oYXNoX3Njb3BpbmcKKyAgICB0ZW1wbGF0ZSA9IFRlbXBsYXRlLnBhcnNlKCUoe3sgdGVzdC50ZXN0IH19KSkKKyAgICBhc3NlcnRfZXF1YWwgJ3dvcmtlZCcsIHRlbXBsYXRlLnJlbmRlciEoJ3Rlc3QnID0+IHsgJ3Rlc3QnID0+ICd3b3JrZWQnIH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X2ZhbHNlX3JlbmRlcnNfYXNfZmFsc2UKKyAgICBhc3NlcnRfZXF1YWwgJ2ZhbHNlJywgVGVtcGxhdGUucGFyc2UoInt7IGZvbyB9fSIpLnJlbmRlciEoJ2ZvbycgPT4gZmFsc2UpCisgICAgYXNzZXJ0X2VxdWFsICdmYWxzZScsIFRlbXBsYXRlLnBhcnNlKCJ7eyBmYWxzZSB9fSIpLnJlbmRlciEKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmlsX3JlbmRlcnNfYXNfZW1wdHlfc3RyaW5nCisgICAgYXNzZXJ0X2VxdWFsICcnLCBUZW1wbGF0ZS5wYXJzZSgie3sgbmlsIH19IikucmVuZGVyIQorICAgIGFzc2VydF9lcXVhbCAnY2F0JywgVGVtcGxhdGUucGFyc2UoInt7IG5pbCB8IGFwcGVuZDogJ2NhdCcgfX0iKS5yZW5kZXIhCisgIGVuZAorCisgIGRlZiB0ZXN0X3ByZXNldF9hc3NpZ25zCisgICAgdGVtcGxhdGUgPSBUZW1wbGF0ZS5wYXJzZSglKHt7IHRlc3QgfX0pKQorICAgIHRlbXBsYXRlLmFzc2lnbnNbJ3Rlc3QnXSA9ICd3b3JrZWQnCisgICAgYXNzZXJ0X2VxdWFsICd3b3JrZWQnLCB0ZW1wbGF0ZS5yZW5kZXIhCisgIGVuZAorCisgIGRlZiB0ZXN0X3JldXNlX3BhcnNlZF90ZW1wbGF0ZQorICAgIHRlbXBsYXRlID0gVGVtcGxhdGUucGFyc2UoJSh7eyBncmVldGluZyB9fSB7eyBuYW1lIH19KSkKKyAgICB0ZW1wbGF0ZS5hc3NpZ25zWydncmVldGluZyddID0gJ0dvb2RieWUnCisgICAgYXNzZXJ0X2VxdWFsICdIZWxsbyBUb2JpJywgdGVtcGxhdGUucmVuZGVyISgnZ3JlZXRpbmcnID0+ICdIZWxsbycsICduYW1lJyA9PiAnVG9iaScpCisgICAgYXNzZXJ0X2VxdWFsICdIZWxsbyAnLCB0ZW1wbGF0ZS5yZW5kZXIhKCdncmVldGluZycgPT4gJ0hlbGxvJywgJ3Vua25vd24nID0+ICdUb2JpJykKKyAgICBhc3NlcnRfZXF1YWwgJ0hlbGxvIEJyaWFuJywgdGVtcGxhdGUucmVuZGVyISgnZ3JlZXRpbmcnID0+ICdIZWxsbycsICduYW1lJyA9PiAnQnJpYW4nKQorICAgIGFzc2VydF9lcXVhbCAnR29vZGJ5ZSBCcmlhbicsIHRlbXBsYXRlLnJlbmRlciEoJ25hbWUnID0+ICdCcmlhbicpCisgICAgYXNzZXJ0X2VxdWFsKHsgJ2dyZWV0aW5nJyA9PiAnR29vZGJ5ZScgfSwgdGVtcGxhdGUuYXNzaWducykKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXNzaWduc19ub3RfcG9sbHV0ZWRfZnJvbV90ZW1wbGF0ZQorICAgIHRlbXBsYXRlID0gVGVtcGxhdGUucGFyc2UoJSh7eyB0ZXN0IH19eyUgYXNzaWduIHRlc3QgPSAnYmFyJyAlfXt7IHRlc3QgfX0pKQorICAgIHRlbXBsYXRlLmFzc2lnbnNbJ3Rlc3QnXSA9ICdiYXonCisgICAgYXNzZXJ0X2VxdWFsICdiYXpiYXInLCB0ZW1wbGF0ZS5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsICdiYXpiYXInLCB0ZW1wbGF0ZS5yZW5kZXIhCisgICAgYXNzZXJ0X2VxdWFsICdmb29iYXInLCB0ZW1wbGF0ZS5yZW5kZXIhKCd0ZXN0JyA9PiAnZm9vJykKKyAgICBhc3NlcnRfZXF1YWwgJ2JhemJhcicsIHRlbXBsYXRlLnJlbmRlciEKKyAgZW5kCisKKyAgZGVmIHRlc3RfaGFzaF93aXRoX2RlZmF1bHRfcHJvYworICAgIHRlbXBsYXRlID0gVGVtcGxhdGUucGFyc2UoJShIZWxsbyB7eyB0ZXN0IH19KSkKKyAgICBhc3NpZ25zID0gSGFzaC5uZXcgeyB8aCwga3wgcmFpc2UgIlVua25vd24gdmFyaWFibGUgJyN7a30nIiB9CisgICAgYXNzaWduc1sndGVzdCddID0gJ1RvYmknCisgICAgYXNzZXJ0X2VxdWFsICdIZWxsbyBUb2JpJywgdGVtcGxhdGUucmVuZGVyIShhc3NpZ25zKQorICAgIGFzc2lnbnMuZGVsZXRlKCd0ZXN0JykKKyAgICBlID0gYXNzZXJ0X3JhaXNlcyhSdW50aW1lRXJyb3IpIGRvCisgICAgICB0ZW1wbGF0ZS5yZW5kZXIhKGFzc2lnbnMpCisgICAgZW5kCisgICAgYXNzZXJ0X2VxdWFsICJVbmtub3duIHZhcmlhYmxlICd0ZXN0JyIsIGUubWVzc2FnZQorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aWxpbmVfdmFyaWFibGUKKyAgICBhc3NlcnRfZXF1YWwgJ3dvcmtlZCcsIFRlbXBsYXRlLnBhcnNlKCJ7e1xudGVzdFxufX0iKS5yZW5kZXIhKCd0ZXN0JyA9PiAnd29ya2VkJykKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3Rlc3RfaGVscGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdGVzdF9oZWxwZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlNGQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3Rlc3RfaGVscGVyLnJiCkBAIC0wLDAgKzEsMTE3IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKK0VOVlsiTVRfTk9fRVhQRUNUQVRJT05TIl0gPSAiMSIKK3JlcXVpcmUgJ21pbml0ZXN0L2F1dG9ydW4nCityZXF1aXJlICdzcHkvaW50ZWdyYXRpb24nCisKKyRMT0FEX1BBVEgudW5zaGlmdChGaWxlLmpvaW4oRmlsZS5leHBhbmRfcGF0aChfX2Rpcl9fKSwgJy4uJywgJ2xpYicpKQorcmVxdWlyZSAnbGlxdWlkLnJiJworcmVxdWlyZSAnbGlxdWlkL3Byb2ZpbGVyJworCittb2RlID0gOnN0cmljdAoraWYgZW52X21vZGUgPSBFTlZbJ0xJUVVJRF9QQVJTRVJfTU9ERSddCisgIHB1dHMgIi0tICN7ZW52X21vZGUudXBjYXNlfSBFUlJPUiBNT0RFIgorICBtb2RlID0gZW52X21vZGUudG9fc3ltCitlbmQKK0xpcXVpZDo6VGVtcGxhdGUuZXJyb3JfbW9kZSA9IG1vZGUKKworaWYgRU5WWydMSVFVSUQtQyddID09ICcxJworICBwdXRzICItLSBMSVFVSUQgQyIKKyAgcmVxdWlyZSAnbGlxdWlkL2MnCitlbmQKKworaWYgTWluaXRlc3QuY29uc3RfZGVmaW5lZD8oJ1Rlc3QnKQorICAjIFdlJ3JlIG9uIE1pbml0ZXN0IDUrLiBOb3RoaW5nIHRvIGRvIGhlcmUuCitlbHNlCisgICMgTWluaXRlc3QgNCBkb2Vzbid0IGhhdmUgTWluaXRlc3Q6OlRlc3QgeWV0LgorICBNaW5pdGVzdDo6VGVzdCA9IE1pbmlUZXN0OjpVbml0OjpUZXN0Q2FzZQorZW5kCisKK21vZHVsZSBNaW5pdGVzdAorICBjbGFzcyBUZXN0CisgICAgZGVmIGZpeHR1cmUobmFtZSkKKyAgICAgIEZpbGUuam9pbihGaWxlLmV4cGFuZF9wYXRoKF9fZGlyX18pLCAiZml4dHVyZXMiLCBuYW1lKQorICAgIGVuZAorICBlbmQKKworICBtb2R1bGUgQXNzZXJ0aW9ucworICAgIGluY2x1ZGUgTGlxdWlkCisKKyAgICBkZWYgYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGVtcGxhdGUsIGFzc2lnbnMgPSB7fSwgbWVzc2FnZSA9IG5pbCkKKyAgICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgVGVtcGxhdGUucGFyc2UodGVtcGxhdGUpLnJlbmRlciEoYXNzaWducyksIG1lc3NhZ2UKKyAgICBlbmQKKworICAgIGRlZiBhc3NlcnRfdGVtcGxhdGVfcmVzdWx0X21hdGNoZXMoZXhwZWN0ZWQsIHRlbXBsYXRlLCBhc3NpZ25zID0ge30sIG1lc3NhZ2UgPSBuaWwpCisgICAgICByZXR1cm4gYXNzZXJ0X3RlbXBsYXRlX3Jlc3VsdChleHBlY3RlZCwgdGVtcGxhdGUsIGFzc2lnbnMsIG1lc3NhZ2UpIHVubGVzcyBleHBlY3RlZC5pc19hPyBSZWdleHAKKworICAgICAgYXNzZXJ0X21hdGNoIGV4cGVjdGVkLCBUZW1wbGF0ZS5wYXJzZSh0ZW1wbGF0ZSkucmVuZGVyIShhc3NpZ25zKSwgbWVzc2FnZQorICAgIGVuZAorCisgICAgZGVmIGFzc2VydF9tYXRjaF9zeW50YXhfZXJyb3IobWF0Y2gsIHRlbXBsYXRlLCBhc3NpZ25zID0ge30pCisgICAgICBleGNlcHRpb24gPSBhc3NlcnRfcmFpc2VzKExpcXVpZDo6U3ludGF4RXJyb3IpIGRvCisgICAgICAgIFRlbXBsYXRlLnBhcnNlKHRlbXBsYXRlKS5yZW5kZXIoYXNzaWducykKKyAgICAgIGVuZAorICAgICAgYXNzZXJ0X21hdGNoIG1hdGNoLCBleGNlcHRpb24ubWVzc2FnZQorICAgIGVuZAorCisgICAgZGVmIHdpdGhfZ2xvYmFsX2ZpbHRlcigqZ2xvYmFscykKKyAgICAgIG9yaWdpbmFsX2dsb2JhbF9zdHJhaW5lciA9IExpcXVpZDo6U3RyYWluZXIuY2xhc3NfdmFyaWFibGVfZ2V0KDpAQGdsb2JhbF9zdHJhaW5lcikKKyAgICAgIExpcXVpZDo6U3RyYWluZXIuY2xhc3NfdmFyaWFibGVfc2V0KDpAQGdsb2JhbF9zdHJhaW5lciwgQ2xhc3MubmV3KExpcXVpZDo6U3RyYWluZXIpIGRvCisgICAgICAgIEBmaWx0ZXJfbWV0aG9kcyA9IFNldC5uZXcKKyAgICAgIGVuZCkKKyAgICAgIExpcXVpZDo6U3RyYWluZXIuY2xhc3NfdmFyaWFibGVfZ2V0KDpAQHN0cmFpbmVyX2NsYXNzX2NhY2hlKS5jbGVhcgorCisgICAgICBnbG9iYWxzLmVhY2ggZG8gfGdsb2JhbHwKKyAgICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5yZWdpc3Rlcl9maWx0ZXIoZ2xvYmFsKQorICAgICAgZW5kCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgTGlxdWlkOjpTdHJhaW5lci5jbGFzc192YXJpYWJsZV9nZXQoOkBAc3RyYWluZXJfY2xhc3NfY2FjaGUpLmNsZWFyCisgICAgICBMaXF1aWQ6OlN0cmFpbmVyLmNsYXNzX3ZhcmlhYmxlX3NldCg6QEBnbG9iYWxfc3RyYWluZXIsIG9yaWdpbmFsX2dsb2JhbF9zdHJhaW5lcikKKyAgICBlbmQKKworICAgIGRlZiB3aXRoX3RhaW50X21vZGUobW9kZSkKKyAgICAgIG9sZF9tb2RlID0gTGlxdWlkOjpUZW1wbGF0ZS50YWludF9tb2RlCisgICAgICBMaXF1aWQ6OlRlbXBsYXRlLnRhaW50X21vZGUgPSBtb2RlCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgTGlxdWlkOjpUZW1wbGF0ZS50YWludF9tb2RlID0gb2xkX21vZGUKKyAgICBlbmQKKworICAgIGRlZiB3aXRoX2Vycm9yX21vZGUobW9kZSkKKyAgICAgIG9sZF9tb2RlID0gTGlxdWlkOjpUZW1wbGF0ZS5lcnJvcl9tb2RlCisgICAgICBMaXF1aWQ6OlRlbXBsYXRlLmVycm9yX21vZGUgPSBtb2RlCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgTGlxdWlkOjpUZW1wbGF0ZS5lcnJvcl9tb2RlID0gb2xkX21vZGUKKyAgICBlbmQKKyAgZW5kCitlbmQKKworY2xhc3MgVGhpbmdXaXRoVG9MaXF1aWQKKyAgZGVmIHRvX2xpcXVpZAorICAgICdmb29iYXInCisgIGVuZAorZW5kCisKK2NsYXNzIEVycm9yRHJvcCA8IExpcXVpZDo6RHJvcAorICBkZWYgc3RhbmRhcmRfZXJyb3IKKyAgICByYWlzZSBMaXF1aWQ6OlN0YW5kYXJkRXJyb3IsICdzdGFuZGFyZCBlcnJvcicKKyAgZW5kCisKKyAgZGVmIGFyZ3VtZW50X2Vycm9yCisgICAgcmFpc2UgTGlxdWlkOjpBcmd1bWVudEVycm9yLCAnYXJndW1lbnQgZXJyb3InCisgIGVuZAorCisgIGRlZiBzeW50YXhfZXJyb3IKKyAgICByYWlzZSBMaXF1aWQ6OlN5bnRheEVycm9yLCAnc3ludGF4IGVycm9yJworICBlbmQKKworICBkZWYgcnVudGltZV9lcnJvcgorICAgIHJhaXNlICdydW50aW1lIGVycm9yJworICBlbmQKKworICBkZWYgZXhjZXB0aW9uCisgICAgcmFpc2UgRXhjZXB0aW9uLCAnZXhjZXB0aW9uJworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9ibG9ja191bml0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L2Jsb2NrX3VuaXRfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI3YTdkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9ibG9ja191bml0X3Rlc3QucmIKQEAgLTAsMCArMSw1OCBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIEJsb2NrVW5pdFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiB0ZXN0X2JsYW5rc3BhY2UKKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoIiAgIikKKyAgICBhc3NlcnRfZXF1YWwgWyIgICJdLCB0ZW1wbGF0ZS5yb290Lm5vZGVsaXN0CisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX2JlZ2lubmluZworICAgIHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgie3tmdW5rfX0gICIpCisgICAgYXNzZXJ0X2VxdWFsIDIsIHRlbXBsYXRlLnJvb3Qubm9kZWxpc3Quc2l6ZQorICAgIGFzc2VydF9lcXVhbCBWYXJpYWJsZSwgdGVtcGxhdGUucm9vdC5ub2RlbGlzdFswXS5jbGFzcworICAgIGFzc2VydF9lcXVhbCBTdHJpbmcsIHRlbXBsYXRlLnJvb3Qubm9kZWxpc3RbMV0uY2xhc3MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyaWFibGVfZW5kCisgICAgdGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCIgIHt7ZnVua319IikKKyAgICBhc3NlcnRfZXF1YWwgMiwgdGVtcGxhdGUucm9vdC5ub2RlbGlzdC5zaXplCisgICAgYXNzZXJ0X2VxdWFsIFN0cmluZywgdGVtcGxhdGUucm9vdC5ub2RlbGlzdFswXS5jbGFzcworICAgIGFzc2VydF9lcXVhbCBWYXJpYWJsZSwgdGVtcGxhdGUucm9vdC5ub2RlbGlzdFsxXS5jbGFzcworICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZV9taWRkbGUKKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoIiAge3tmdW5rfX0gICIpCisgICAgYXNzZXJ0X2VxdWFsIDMsIHRlbXBsYXRlLnJvb3Qubm9kZWxpc3Quc2l6ZQorICAgIGFzc2VydF9lcXVhbCBTdHJpbmcsIHRlbXBsYXRlLnJvb3Qubm9kZWxpc3RbMF0uY2xhc3MKKyAgICBhc3NlcnRfZXF1YWwgVmFyaWFibGUsIHRlbXBsYXRlLnJvb3Qubm9kZWxpc3RbMV0uY2xhc3MKKyAgICBhc3NlcnRfZXF1YWwgU3RyaW5nLCB0ZW1wbGF0ZS5yb290Lm5vZGVsaXN0WzJdLmNsYXNzCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX21hbnlfZW1iZWRkZWRfZnJhZ21lbnRzCisgICAgdGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCIgIHt7ZnVua319IHt7c299fSB7e2Jyb3RoZXJ9fSAiKQorICAgIGFzc2VydF9lcXVhbCA3LCB0ZW1wbGF0ZS5yb290Lm5vZGVsaXN0LnNpemUKKyAgICBhc3NlcnRfZXF1YWwgW1N0cmluZywgVmFyaWFibGUsIFN0cmluZywgVmFyaWFibGUsIFN0cmluZywgVmFyaWFibGUsIFN0cmluZ10sCisgICAgICBibG9ja190eXBlcyh0ZW1wbGF0ZS5yb290Lm5vZGVsaXN0KQorICBlbmQKKworICBkZWYgdGVzdF93aXRoX2Jsb2NrCisgICAgdGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCIgIHslIGNvbW1lbnQgJX0geyUgZW5kY29tbWVudCAlfSAiKQorICAgIGFzc2VydF9lcXVhbCBbU3RyaW5nLCBDb21tZW50LCBTdHJpbmddLCBibG9ja190eXBlcyh0ZW1wbGF0ZS5yb290Lm5vZGVsaXN0KQorICAgIGFzc2VydF9lcXVhbCAzLCB0ZW1wbGF0ZS5yb290Lm5vZGVsaXN0LnNpemUKKyAgZW5kCisKKyAgZGVmIHRlc3Rfd2l0aF9jdXN0b21fdGFnCisgICAgTGlxdWlkOjpUZW1wbGF0ZS5yZWdpc3Rlcl90YWcoInRlc3R0YWciLCBCbG9jaykKKyAgICBhc3NlcnQgTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgieyUgdGVzdHRhZyAlfSB7JSBlbmR0ZXN0dGFnICV9IikKKyAgZW5zdXJlCisgICAgTGlxdWlkOjpUZW1wbGF0ZS50YWdzLmRlbGV0ZSgndGVzdHRhZycpCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgYmxvY2tfdHlwZXMobm9kZWxpc3QpCisgICAgbm9kZWxpc3QuY29sbGVjdCgmOmNsYXNzKQorICBlbmQKK2VuZCAjIFZhcmlhYmxlVGVzdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9jb25kaXRpb25fdW5pdF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9jb25kaXRpb25fdW5pdF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmM3ODgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L2NvbmRpdGlvbl91bml0X3Rlc3QucmIKQEAgLTAsMCArMSwxNTggQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBDb25kaXRpb25Vbml0VGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgZGVmIHNldHVwCisgICAgQGNvbnRleHQgPSBMaXF1aWQ6OkNvbnRleHQubmV3CisgIGVuZAorCisgIGRlZiB0ZXN0X2Jhc2ljX2NvbmRpdGlvbgorICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgQ29uZGl0aW9uLm5ldygxLCAnPT0nLCAyKS5ldmFsdWF0ZQorICAgIGFzc2VydF9lcXVhbCB0cnVlLCAgQ29uZGl0aW9uLm5ldygxLCAnPT0nLCAxKS5ldmFsdWF0ZQorICBlbmQKKworICBkZWYgdGVzdF9kZWZhdWx0X29wZXJhdG9yc19ldmFsdXRlX3RydWUKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgMSwgJz09JywgMQorICAgIGFzc2VydF9ldmFsdWF0ZXNfdHJ1ZSAxLCAnIT0nLCAyCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlIDEsICc8PicsIDIKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgMSwgJzwnLCAyCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlIDIsICc+JywgMQorICAgIGFzc2VydF9ldmFsdWF0ZXNfdHJ1ZSAxLCAnPj0nLCAxCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlIDIsICc+PScsIDEKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgMSwgJzw9JywgMgorICAgIGFzc2VydF9ldmFsdWF0ZXNfdHJ1ZSAxLCAnPD0nLCAxCisgICAgIyBuZWdhdGl2ZSBudW1iZXJzCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlIDEsICc+JywgLTEKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgKC0xKSwgJzwnLCAxCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlIDEuMCwgJz4nLCAtMS4wCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlICgtMS4wKSwgJzwnLCAxLjAKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVmYXVsdF9vcGVyYXRvcnNfZXZhbHV0ZV9mYWxzZQorICAgIGFzc2VydF9ldmFsdWF0ZXNfZmFsc2UgMSwgJz09JywgMgorICAgIGFzc2VydF9ldmFsdWF0ZXNfZmFsc2UgMSwgJyE9JywgMQorICAgIGFzc2VydF9ldmFsdWF0ZXNfZmFsc2UgMSwgJzw+JywgMQorICAgIGFzc2VydF9ldmFsdWF0ZXNfZmFsc2UgMSwgJzwnLCAwCisgICAgYXNzZXJ0X2V2YWx1YXRlc19mYWxzZSAyLCAnPicsIDQKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlIDEsICc+PScsIDMKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlIDIsICc+PScsIDQKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlIDEsICc8PScsIDAKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlIDEsICc8PScsIDAKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29udGFpbnNfd29ya3Nfb25fc3RyaW5ncworICAgIGFzc2VydF9ldmFsdWF0ZXNfdHJ1ZSAnYm9iJywgJ2NvbnRhaW5zJywgJ28nCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlICdib2InLCAnY29udGFpbnMnLCAnYicKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgJ2JvYicsICdjb250YWlucycsICdibycKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgJ2JvYicsICdjb250YWlucycsICdvYicKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgJ2JvYicsICdjb250YWlucycsICdib2InCisKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlICdib2InLCAnY29udGFpbnMnLCAnYm9iMicKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlICdib2InLCAnY29udGFpbnMnLCAnYScKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlICdib2InLCAnY29udGFpbnMnLCAnLS0tJworICBlbmQKKworICBkZWYgdGVzdF9pbnZhbGlkX2NvbXBhcmF0aW9uX29wZXJhdG9yCisgICAgYXNzZXJ0X2V2YWx1YXRlc19hcmd1bWVudF9lcnJvciAxLCAnfn4nLCAwCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBhcmF0aW9uX29mX2ludF9hbmRfc3RyCisgICAgYXNzZXJ0X2V2YWx1YXRlc19hcmd1bWVudF9lcnJvciAnMScsICc+JywgMAorICAgIGFzc2VydF9ldmFsdWF0ZXNfYXJndW1lbnRfZXJyb3IgJzEnLCAnPCcsIDAKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2FyZ3VtZW50X2Vycm9yICcxJywgJz49JywgMAorICAgIGFzc2VydF9ldmFsdWF0ZXNfYXJndW1lbnRfZXJyb3IgJzEnLCAnPD0nLCAwCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbnRhaW5zX3dvcmtzX29uX2FycmF5cworICAgIEBjb250ZXh0ID0gTGlxdWlkOjpDb250ZXh0Lm5ldworICAgIEBjb250ZXh0WydhcnJheSddID0gWzEsIDIsIDMsIDQsIDVdCisgICAgYXJyYXlfZXhwciA9IFZhcmlhYmxlTG9va3VwLm5ldygiYXJyYXkiKQorCisgICAgYXNzZXJ0X2V2YWx1YXRlc19mYWxzZSBhcnJheV9leHByLCAnY29udGFpbnMnLCAwCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlIGFycmF5X2V4cHIsICdjb250YWlucycsIDEKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgYXJyYXlfZXhwciwgJ2NvbnRhaW5zJywgMgorICAgIGFzc2VydF9ldmFsdWF0ZXNfdHJ1ZSBhcnJheV9leHByLCAnY29udGFpbnMnLCAzCisgICAgYXNzZXJ0X2V2YWx1YXRlc190cnVlIGFycmF5X2V4cHIsICdjb250YWlucycsIDQKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgYXJyYXlfZXhwciwgJ2NvbnRhaW5zJywgNQorICAgIGFzc2VydF9ldmFsdWF0ZXNfZmFsc2UgYXJyYXlfZXhwciwgJ2NvbnRhaW5zJywgNgorICAgIGFzc2VydF9ldmFsdWF0ZXNfZmFsc2UgYXJyYXlfZXhwciwgJ2NvbnRhaW5zJywgIjEiCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbnRhaW5zX3JldHVybnNfZmFsc2VfZm9yX25pbF9vcGVyYW5kcworICAgIEBjb250ZXh0ID0gTGlxdWlkOjpDb250ZXh0Lm5ldworICAgIGFzc2VydF9ldmFsdWF0ZXNfZmFsc2UgVmFyaWFibGVMb29rdXAubmV3KCdub3RfYXNzaWduZWQnKSwgJ2NvbnRhaW5zJywgJzAnCisgICAgYXNzZXJ0X2V2YWx1YXRlc19mYWxzZSAwLCAnY29udGFpbnMnLCBWYXJpYWJsZUxvb2t1cC5uZXcoJ25vdF9hc3NpZ25lZCcpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbnRhaW5zX3JldHVybl9mYWxzZV9vbl93cm9uZ19kYXRhX3R5cGUKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlIDEsICdjb250YWlucycsIDAKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29udGFpbnNfd2l0aF9zdHJpbmdfbGVmdF9vcGVyYW5kX2NvZXJjZXNfcmlnaHRfb3BlcmFuZF90b19zdHJpbmcKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgJyAxICcsICdjb250YWlucycsIDEKKyAgICBhc3NlcnRfZXZhbHVhdGVzX2ZhbHNlICcgMSAnLCAnY29udGFpbnMnLCAyCisgIGVuZAorCisgIGRlZiB0ZXN0X29yX2NvbmRpdGlvbgorICAgIGNvbmRpdGlvbiA9IENvbmRpdGlvbi5uZXcoMSwgJz09JywgMikKKworICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgY29uZGl0aW9uLmV2YWx1YXRlCisKKyAgICBjb25kaXRpb24ub3IgQ29uZGl0aW9uLm5ldygyLCAnPT0nLCAxKQorCisgICAgYXNzZXJ0X2VxdWFsIGZhbHNlLCBjb25kaXRpb24uZXZhbHVhdGUKKworICAgIGNvbmRpdGlvbi5vciBDb25kaXRpb24ubmV3KDEsICc9PScsIDEpCisKKyAgICBhc3NlcnRfZXF1YWwgdHJ1ZSwgY29uZGl0aW9uLmV2YWx1YXRlCisgIGVuZAorCisgIGRlZiB0ZXN0X2FuZF9jb25kaXRpb24KKyAgICBjb25kaXRpb24gPSBDb25kaXRpb24ubmV3KDEsICc9PScsIDEpCisKKyAgICBhc3NlcnRfZXF1YWwgdHJ1ZSwgY29uZGl0aW9uLmV2YWx1YXRlCisKKyAgICBjb25kaXRpb24uYW5kIENvbmRpdGlvbi5uZXcoMiwgJz09JywgMikKKworICAgIGFzc2VydF9lcXVhbCB0cnVlLCBjb25kaXRpb24uZXZhbHVhdGUKKworICAgIGNvbmRpdGlvbi5hbmQgQ29uZGl0aW9uLm5ldygyLCAnPT0nLCAxKQorCisgICAgYXNzZXJ0X2VxdWFsIGZhbHNlLCBjb25kaXRpb24uZXZhbHVhdGUKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2hvdWxkX2FsbG93X2N1c3RvbV9wcm9jX29wZXJhdG9yCisgICAgQ29uZGl0aW9uLm9wZXJhdG9yc1snc3RhcnRzX3dpdGgnXSA9IHByb2MgeyB8Y29uZCwgbGVmdCwgcmlnaHR8IGxlZnQgPX4gJXJ7XiN7cmlnaHR9fSB9CisKKyAgICBhc3NlcnRfZXZhbHVhdGVzX3RydWUgJ2JvYicsICdzdGFydHNfd2l0aCcsICdiJworICAgIGFzc2VydF9ldmFsdWF0ZXNfZmFsc2UgJ2JvYicsICdzdGFydHNfd2l0aCcsICdvJworICBlbnN1cmUKKyAgICBDb25kaXRpb24ub3BlcmF0b3JzLmRlbGV0ZSAnc3RhcnRzX3dpdGgnCisgIGVuZAorCisgIGRlZiB0ZXN0X2xlZnRfb3JfcmlnaHRfbWF5X2NvbnRhaW5fb3BlcmF0b3JzCisgICAgQGNvbnRleHQgPSBMaXF1aWQ6OkNvbnRleHQubmV3CisgICAgQGNvbnRleHRbJ29uZSddID0gQGNvbnRleHRbJ2Fub3RoZXInXSA9ICJnbm9tZXNsYWItYW5kLW9yLWxpcXVpZCIKKworICAgIGFzc2VydF9ldmFsdWF0ZXNfdHJ1ZSBWYXJpYWJsZUxvb2t1cC5uZXcoIm9uZSIpLCAnPT0nLCBWYXJpYWJsZUxvb2t1cC5uZXcoImFub3RoZXIiKQorICBlbmQKKworICBwcml2YXRlCisKKyAgZGVmIGFzc2VydF9ldmFsdWF0ZXNfdHJ1ZShsZWZ0LCBvcCwgcmlnaHQpCisgICAgYXNzZXJ0IENvbmRpdGlvbi5uZXcobGVmdCwgb3AsIHJpZ2h0KS5ldmFsdWF0ZShAY29udGV4dCksCisgICAgICAiRXZhbHVhdGVkIGZhbHNlOiAje2xlZnR9ICN7b3B9ICN7cmlnaHR9IgorICBlbmQKKworICBkZWYgYXNzZXJ0X2V2YWx1YXRlc19mYWxzZShsZWZ0LCBvcCwgcmlnaHQpCisgICAgYXNzZXJ0ICFDb25kaXRpb24ubmV3KGxlZnQsIG9wLCByaWdodCkuZXZhbHVhdGUoQGNvbnRleHQpLAorICAgICAgIkV2YWx1YXRlZCB0cnVlOiAje2xlZnR9ICN7b3B9ICN7cmlnaHR9IgorICBlbmQKKworICBkZWYgYXNzZXJ0X2V2YWx1YXRlc19hcmd1bWVudF9lcnJvcihsZWZ0LCBvcCwgcmlnaHQpCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6OkFyZ3VtZW50RXJyb3IpIGRvCisgICAgICBDb25kaXRpb24ubmV3KGxlZnQsIG9wLCByaWdodCkuZXZhbHVhdGUoQGNvbnRleHQpCisgICAgZW5kCisgIGVuZAorZW5kICMgQ29uZGl0aW9uVGVzdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9jb250ZXh0X3VuaXRfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvY29udGV4dF91bml0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1NTg2NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvY29udGV4dF91bml0X3Rlc3QucmIKQEAgLTAsMCArMSw0ODMgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBIdW5kcmVkQ2VudGVzCisgIGRlZiB0b19saXF1aWQKKyAgICAxMDAKKyAgZW5kCitlbmQKKworY2xhc3MgQ2VudHNEcm9wIDwgTGlxdWlkOjpEcm9wCisgIGRlZiBhbW91bnQKKyAgICBIdW5kcmVkQ2VudGVzLm5ldworICBlbmQKKworICBkZWYgbm9uX3plcm8/CisgICAgdHJ1ZQorICBlbmQKK2VuZAorCitjbGFzcyBDb250ZXh0U2Vuc2l0aXZlRHJvcCA8IExpcXVpZDo6RHJvcAorICBkZWYgdGVzdAorICAgIEBjb250ZXh0Wyd0ZXN0J10KKyAgZW5kCitlbmQKKworY2xhc3MgQ2F0ZWdvcnkgPCBMaXF1aWQ6OkRyb3AKKyAgYXR0cl9hY2Nlc3NvciA6bmFtZQorCisgIGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgQG5hbWUgPSBuYW1lCisgIGVuZAorCisgIGRlZiB0b19saXF1aWQKKyAgICBDYXRlZ29yeURyb3AubmV3KHNlbGYpCisgIGVuZAorZW5kCisKK2NsYXNzIENhdGVnb3J5RHJvcAorICBhdHRyX2FjY2Vzc29yIDpjYXRlZ29yeSwgOmNvbnRleHQKKyAgZGVmIGluaXRpYWxpemUoY2F0ZWdvcnkpCisgICAgQGNhdGVnb3J5ID0gY2F0ZWdvcnkKKyAgZW5kCitlbmQKKworY2xhc3MgQ291bnRlckRyb3AgPCBMaXF1aWQ6OkRyb3AKKyAgZGVmIGNvdW50CisgICAgQGNvdW50IHx8PSAwCisgICAgQGNvdW50ICs9IDEKKyAgZW5kCitlbmQKKworY2xhc3MgQXJyYXlMaWtlCisgIGRlZiBmZXRjaChpbmRleCkKKyAgZW5kCisKKyAgZGVmIFtdKGluZGV4KQorICAgIEBjb3VudHMgfHw9IFtdCisgICAgQGNvdW50c1tpbmRleF0gfHw9IDAKKyAgICBAY291bnRzW2luZGV4XSArPSAxCisgIGVuZAorCisgIGRlZiB0b19saXF1aWQKKyAgICBzZWxmCisgIGVuZAorZW5kCisKK2NsYXNzIENvbnRleHRVbml0VGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgZGVmIHNldHVwCisgICAgQGNvbnRleHQgPSBMaXF1aWQ6OkNvbnRleHQubmV3CisgIGVuZAorCisgIGRlZiB0ZWFyZG93bgorICAgIFNweS50ZWFyZG93bgorICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZXMKKyAgICBAY29udGV4dFsnc3RyaW5nJ10gPSAnc3RyaW5nJworICAgIGFzc2VydF9lcXVhbCAnc3RyaW5nJywgQGNvbnRleHRbJ3N0cmluZyddCisKKyAgICBAY29udGV4dFsnbnVtJ10gPSA1CisgICAgYXNzZXJ0X2VxdWFsIDUsIEBjb250ZXh0WydudW0nXQorCisgICAgQGNvbnRleHRbJ3RpbWUnXSA9IFRpbWUucGFyc2UoJzIwMDYtMDYtMDYgMTI6MDA6MDAnKQorICAgIGFzc2VydF9lcXVhbCBUaW1lLnBhcnNlKCcyMDA2LTA2LTA2IDEyOjAwOjAwJyksIEBjb250ZXh0Wyd0aW1lJ10KKworICAgIEBjb250ZXh0WydkYXRlJ10gPSBEYXRlLnRvZGF5CisgICAgYXNzZXJ0X2VxdWFsIERhdGUudG9kYXksIEBjb250ZXh0WydkYXRlJ10KKworICAgIG5vdyA9IERhdGVUaW1lLm5vdworICAgIEBjb250ZXh0WydkYXRldGltZSddID0gbm93CisgICAgYXNzZXJ0X2VxdWFsIG5vdywgQGNvbnRleHRbJ2RhdGV0aW1lJ10KKworICAgIEBjb250ZXh0Wydib29sJ10gPSB0cnVlCisgICAgYXNzZXJ0X2VxdWFsIHRydWUsIEBjb250ZXh0Wydib29sJ10KKworICAgIEBjb250ZXh0Wydib29sJ10gPSBmYWxzZQorICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgQGNvbnRleHRbJ2Jvb2wnXQorCisgICAgQGNvbnRleHRbJ25pbCddID0gbmlsCisgICAgYXNzZXJ0X2VxdWFsIG5pbCwgQGNvbnRleHRbJ25pbCddCisgICAgYXNzZXJ0X2VxdWFsIG5pbCwgQGNvbnRleHRbJ25pbCddCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlc19ub3RfZXhpc3RpbmcKKyAgICBhc3NlcnRfZXF1YWwgbmlsLCBAY29udGV4dFsnZG9lc19ub3RfZXhpc3QnXQorICBlbmQKKworICBkZWYgdGVzdF9zY29waW5nCisgICAgQGNvbnRleHQucHVzaAorICAgIEBjb250ZXh0LnBvcAorCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6OkNvbnRleHRFcnJvcikgZG8KKyAgICAgIEBjb250ZXh0LnBvcAorICAgIGVuZAorCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6OkNvbnRleHRFcnJvcikgZG8KKyAgICAgIEBjb250ZXh0LnB1c2gKKyAgICAgIEBjb250ZXh0LnBvcAorICAgICAgQGNvbnRleHQucG9wCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2xlbmd0aF9xdWVyeQorICAgIEBjb250ZXh0WydudW1iZXJzJ10gPSBbMSwgMiwgMywgNF0KKworICAgIGFzc2VydF9lcXVhbCA0LCBAY29udGV4dFsnbnVtYmVycy5zaXplJ10KKworICAgIEBjb250ZXh0WydudW1iZXJzJ10gPSB7IDEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCB9CisKKyAgICBhc3NlcnRfZXF1YWwgNCwgQGNvbnRleHRbJ251bWJlcnMuc2l6ZSddCisKKyAgICBAY29udGV4dFsnbnVtYmVycyddID0geyAxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQsICdzaXplJyA9PiAxMDAwIH0KKworICAgIGFzc2VydF9lcXVhbCAxMDAwLCBAY29udGV4dFsnbnVtYmVycy5zaXplJ10KKyAgZW5kCisKKyAgZGVmIHRlc3RfaHlwaGVuYXRlZF92YXJpYWJsZQorICAgIEBjb250ZXh0WydvaC1teSddID0gJ2dvZHonCisgICAgYXNzZXJ0X2VxdWFsICdnb2R6JywgQGNvbnRleHRbJ29oLW15J10KKyAgZW5kCisKKyAgZGVmIHRlc3RfYWRkX2ZpbHRlcgorICAgIGZpbHRlciA9IE1vZHVsZS5uZXcgZG8KKyAgICAgIGRlZiBoaShvdXRwdXQpCisgICAgICAgIG91dHB1dCArICcgaGkhJworICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjb250ZXh0ID0gQ29udGV4dC5uZXcKKyAgICBjb250ZXh0LmFkZF9maWx0ZXJzKGZpbHRlcikKKyAgICBhc3NlcnRfZXF1YWwgJ2hpPyBoaSEnLCBjb250ZXh0Lmludm9rZSg6aGksICdoaT8nKQorCisgICAgY29udGV4dCA9IENvbnRleHQubmV3CisgICAgYXNzZXJ0X2VxdWFsICdoaT8nLCBjb250ZXh0Lmludm9rZSg6aGksICdoaT8nKQorCisgICAgY29udGV4dC5hZGRfZmlsdGVycyhmaWx0ZXIpCisgICAgYXNzZXJ0X2VxdWFsICdoaT8gaGkhJywgY29udGV4dC5pbnZva2UoOmhpLCAnaGk/JykKKyAgZW5kCisKKyAgZGVmIHRlc3Rfb25seV9pbnRlbmRlZF9maWx0ZXJzX21ha2VfaXRfdGhlcmUKKyAgICBmaWx0ZXIgPSBNb2R1bGUubmV3IGRvCisgICAgICBkZWYgaGkob3V0cHV0KQorICAgICAgICBvdXRwdXQgKyAnIGhpIScKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgY29udGV4dCA9IENvbnRleHQubmV3CisgICAgYXNzZXJ0X2VxdWFsICJXb29raWUiLCBjb250ZXh0Lmludm9rZSgiaGkiLCAiV29va2llIikKKworICAgIGNvbnRleHQuYWRkX2ZpbHRlcnMoZmlsdGVyKQorICAgIGFzc2VydF9lcXVhbCAiV29va2llIGhpISIsIGNvbnRleHQuaW52b2tlKCJoaSIsICJXb29raWUiKQorICBlbmQKKworICBkZWYgdGVzdF9hZGRfaXRlbV9pbl9vdXRlcl9zY29wZQorICAgIEBjb250ZXh0Wyd0ZXN0J10gPSAndGVzdCcKKyAgICBAY29udGV4dC5wdXNoCisgICAgYXNzZXJ0X2VxdWFsICd0ZXN0JywgQGNvbnRleHRbJ3Rlc3QnXQorICAgIEBjb250ZXh0LnBvcAorICAgIGFzc2VydF9lcXVhbCAndGVzdCcsIEBjb250ZXh0Wyd0ZXN0J10KKyAgZW5kCisKKyAgZGVmIHRlc3RfYWRkX2l0ZW1faW5faW5uZXJfc2NvcGUKKyAgICBAY29udGV4dC5wdXNoCisgICAgQGNvbnRleHRbJ3Rlc3QnXSA9ICd0ZXN0JworICAgIGFzc2VydF9lcXVhbCAndGVzdCcsIEBjb250ZXh0Wyd0ZXN0J10KKyAgICBAY29udGV4dC5wb3AKKyAgICBhc3NlcnRfZXF1YWwgbmlsLCBAY29udGV4dFsndGVzdCddCisgIGVuZAorCisgIGRlZiB0ZXN0X2hpZXJhY2hpY2FsX2RhdGEKKyAgICBAY29udGV4dFsnaGFzaCddID0geyAibmFtZSIgPT4gJ3RvYmknIH0KKyAgICBhc3NlcnRfZXF1YWwgJ3RvYmknLCBAY29udGV4dFsnaGFzaC5uYW1lJ10KKyAgICBhc3NlcnRfZXF1YWwgJ3RvYmknLCBAY29udGV4dFsnaGFzaFsibmFtZSJdJ10KKyAgZW5kCisKKyAgZGVmIHRlc3Rfa2V5d29yZHMKKyAgICBhc3NlcnRfZXF1YWwgdHJ1ZSwgQGNvbnRleHRbJ3RydWUnXQorICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgQGNvbnRleHRbJ2ZhbHNlJ10KKyAgZW5kCisKKyAgZGVmIHRlc3RfZGlnaXRzCisgICAgYXNzZXJ0X2VxdWFsIDEwMCwgQGNvbnRleHRbJzEwMCddCisgICAgYXNzZXJ0X2VxdWFsIDEwMC4wMCwgQGNvbnRleHRbJzEwMC4wMCddCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ3MKKyAgICBhc3NlcnRfZXF1YWwgImhlbGxvISIsIEBjb250ZXh0WyciaGVsbG8hIiddCisgICAgYXNzZXJ0X2VxdWFsICJoZWxsbyEiLCBAY29udGV4dFsiJ2hlbGxvISciXQorICBlbmQKKworICBkZWYgdGVzdF9tZXJnZQorICAgIEBjb250ZXh0Lm1lcmdlKHsgInRlc3QiID0+ICJ0ZXN0IiB9KQorICAgIGFzc2VydF9lcXVhbCAndGVzdCcsIEBjb250ZXh0Wyd0ZXN0J10KKyAgICBAY29udGV4dC5tZXJnZSh7ICJ0ZXN0IiA9PiAibmV3dmFsdWUiLCAiZm9vIiA9PiAiYmFyIiB9KQorICAgIGFzc2VydF9lcXVhbCAnbmV3dmFsdWUnLCBAY29udGV4dFsndGVzdCddCisgICAgYXNzZXJ0X2VxdWFsICdiYXInLCBAY29udGV4dFsnZm9vJ10KKyAgZW5kCisKKyAgZGVmIHRlc3RfYXJyYXlfbm90YXRpb24KKyAgICBAY29udGV4dFsndGVzdCddID0gWzEsIDIsIDMsIDQsIDVdCisKKyAgICBhc3NlcnRfZXF1YWwgMSwgQGNvbnRleHRbJ3Rlc3RbMF0nXQorICAgIGFzc2VydF9lcXVhbCAyLCBAY29udGV4dFsndGVzdFsxXSddCisgICAgYXNzZXJ0X2VxdWFsIDMsIEBjb250ZXh0Wyd0ZXN0WzJdJ10KKyAgICBhc3NlcnRfZXF1YWwgNCwgQGNvbnRleHRbJ3Rlc3RbM10nXQorICAgIGFzc2VydF9lcXVhbCA1LCBAY29udGV4dFsndGVzdFs0XSddCisgIGVuZAorCisgIGRlZiB0ZXN0X3JlY291cnNpdmVfYXJyYXlfbm90YXRpb24KKyAgICBAY29udGV4dFsndGVzdCddID0geyAndGVzdCcgPT4gWzEsIDIsIDMsIDQsIDVdIH0KKworICAgIGFzc2VydF9lcXVhbCAxLCBAY29udGV4dFsndGVzdC50ZXN0WzBdJ10KKworICAgIEBjb250ZXh0Wyd0ZXN0J10gPSBbeyAndGVzdCcgPT4gJ3dvcmtlZCcgfV0KKworICAgIGFzc2VydF9lcXVhbCAnd29ya2VkJywgQGNvbnRleHRbJ3Rlc3RbMF0udGVzdCddCisgIGVuZAorCisgIGRlZiB0ZXN0X2hhc2hfdG9fYXJyYXlfdHJhbnNpdGlvbgorICAgIEBjb250ZXh0Wydjb2xvcnMnXSA9IHsKKyAgICAgICdCbHVlJyAgICA9PiBbJzAwMzM2NicsICczMzY2OTknLCAnNjY5OUNDJywgJzk5Q0NGRiddLAorICAgICAgJ0dyZWVuJyAgID0+IFsnMDAzMzAwJywgJzMzNjYzMycsICc2Njk5NjYnLCAnOTlDQzk5J10sCisgICAgICAnWWVsbG93JyAgPT4gWydDQzk5MDAnLCAnRkZDQzAwJywgJ0ZGRkY5OScsICdGRkZGQ0MnXSwKKyAgICAgICdSZWQnICAgICA9PiBbJzY2MDAwMCcsICc5OTMzMzMnLCAnQ0M2NjY2JywgJ0ZGOTk5OSddCisgICAgfQorCisgICAgYXNzZXJ0X2VxdWFsICcwMDMzNjYnLCBAY29udGV4dFsnY29sb3JzLkJsdWVbMF0nXQorICAgIGFzc2VydF9lcXVhbCAnRkY5OTk5JywgQGNvbnRleHRbJ2NvbG9ycy5SZWRbM10nXQorICBlbmQKKworICBkZWYgdGVzdF90cnlfZmlyc3QKKyAgICBAY29udGV4dFsndGVzdCddID0gWzEsIDIsIDMsIDQsIDVdCisKKyAgICBhc3NlcnRfZXF1YWwgMSwgQGNvbnRleHRbJ3Rlc3QuZmlyc3QnXQorICAgIGFzc2VydF9lcXVhbCA1LCBAY29udGV4dFsndGVzdC5sYXN0J10KKworICAgIEBjb250ZXh0Wyd0ZXN0J10gPSB7ICd0ZXN0JyA9PiBbMSwgMiwgMywgNCwgNV0gfQorCisgICAgYXNzZXJ0X2VxdWFsIDEsIEBjb250ZXh0Wyd0ZXN0LnRlc3QuZmlyc3QnXQorICAgIGFzc2VydF9lcXVhbCA1LCBAY29udGV4dFsndGVzdC50ZXN0Lmxhc3QnXQorCisgICAgQGNvbnRleHRbJ3Rlc3QnXSA9IFsxXQorICAgIGFzc2VydF9lcXVhbCAxLCBAY29udGV4dFsndGVzdC5maXJzdCddCisgICAgYXNzZXJ0X2VxdWFsIDEsIEBjb250ZXh0Wyd0ZXN0Lmxhc3QnXQorICBlbmQKKworICBkZWYgdGVzdF9hY2Nlc3NfaGFzaGVzX3dpdGhfaGFzaF9ub3RhdGlvbgorICAgIEBjb250ZXh0Wydwcm9kdWN0cyddID0geyAnY291bnQnID0+IDUsICd0YWdzJyA9PiBbJ2RlZXBzbm93JywgJ2ZyZWVzdHlsZSddIH0KKyAgICBAY29udGV4dFsncHJvZHVjdCddID0geyAndmFyaWFudHMnID0+IFsgeyAndGl0bGUnID0+ICdkcmFmdDE1MWNtJyB9LCB7ICd0aXRsZScgPT4gJ2VsZW1lbnQxNTFjbScgfSBdIH0KKworICAgIGFzc2VydF9lcXVhbCA1LCBAY29udGV4dFsncHJvZHVjdHNbImNvdW50Il0nXQorICAgIGFzc2VydF9lcXVhbCAnZGVlcHNub3cnLCBAY29udGV4dFsncHJvZHVjdHNbInRhZ3MiXVswXSddCisgICAgYXNzZXJ0X2VxdWFsICdkZWVwc25vdycsIEBjb250ZXh0Wydwcm9kdWN0c1sidGFncyJdLmZpcnN0J10KKyAgICBhc3NlcnRfZXF1YWwgJ2RyYWZ0MTUxY20nLCBAY29udGV4dFsncHJvZHVjdFsidmFyaWFudHMiXVswXVsidGl0bGUiXSddCisgICAgYXNzZXJ0X2VxdWFsICdlbGVtZW50MTUxY20nLCBAY29udGV4dFsncHJvZHVjdFsidmFyaWFudHMiXVsxXVsidGl0bGUiXSddCisgICAgYXNzZXJ0X2VxdWFsICdkcmFmdDE1MWNtJywgQGNvbnRleHRbJ3Byb2R1Y3RbInZhcmlhbnRzIl1bMF1bInRpdGxlIl0nXQorICAgIGFzc2VydF9lcXVhbCAnZWxlbWVudDE1MWNtJywgQGNvbnRleHRbJ3Byb2R1Y3RbInZhcmlhbnRzIl0ubGFzdFsidGl0bGUiXSddCisgIGVuZAorCisgIGRlZiB0ZXN0X2FjY2Vzc192YXJpYWJsZV93aXRoX2hhc2hfbm90YXRpb24KKyAgICBAY29udGV4dFsnZm9vJ10gPSAnYmF6JworICAgIEBjb250ZXh0WydiYXInXSA9ICdmb28nCisKKyAgICBhc3NlcnRfZXF1YWwgJ2JheicsIEBjb250ZXh0WydbImZvbyJdJ10KKyAgICBhc3NlcnRfZXF1YWwgJ2JheicsIEBjb250ZXh0WydbYmFyXSddCisgIGVuZAorCisgIGRlZiB0ZXN0X2FjY2Vzc19oYXNoZXNfd2l0aF9oYXNoX2FjY2Vzc192YXJpYWJsZXMKKyAgICBAY29udGV4dFsndmFyJ10gPSAndGFncycKKyAgICBAY29udGV4dFsnbmVzdGVkJ10gPSB7ICd2YXInID0+ICd0YWdzJyB9CisgICAgQGNvbnRleHRbJ3Byb2R1Y3RzJ10gPSB7ICdjb3VudCcgPT4gNSwgJ3RhZ3MnID0+IFsnZGVlcHNub3cnLCAnZnJlZXN0eWxlJ10gfQorCisgICAgYXNzZXJ0X2VxdWFsICdkZWVwc25vdycsIEBjb250ZXh0Wydwcm9kdWN0c1t2YXJdLmZpcnN0J10KKyAgICBhc3NlcnRfZXF1YWwgJ2ZyZWVzdHlsZScsIEBjb250ZXh0Wydwcm9kdWN0c1tuZXN0ZWQudmFyXS5sYXN0J10KKyAgZW5kCisKKyAgZGVmIHRlc3RfaGFzaF9ub3RhdGlvbl9vbmx5X2Zvcl9oYXNoX2FjY2VzcworICAgIEBjb250ZXh0WydhcnJheSddID0gWzEsIDIsIDMsIDQsIDVdCisgICAgQGNvbnRleHRbJ2hhc2gnXSA9IHsgJ2ZpcnN0JyA9PiAnSGVsbG8nIH0KKworICAgIGFzc2VydF9lcXVhbCAxLCBAY29udGV4dFsnYXJyYXkuZmlyc3QnXQorICAgIGFzc2VydF9lcXVhbCBuaWwsIEBjb250ZXh0WydhcnJheVsiZmlyc3QiXSddCisgICAgYXNzZXJ0X2VxdWFsICdIZWxsbycsIEBjb250ZXh0WydoYXNoWyJmaXJzdCJdJ10KKyAgZW5kCisKKyAgZGVmIHRlc3RfZmlyc3RfY2FuX2FwcGVhcl9pbl9taWRkbGVfb2ZfY2FsbGNoYWluCisgICAgQGNvbnRleHRbJ3Byb2R1Y3QnXSA9IHsgJ3ZhcmlhbnRzJyA9PiBbIHsgJ3RpdGxlJyA9PiAnZHJhZnQxNTFjbScgfSwgeyAndGl0bGUnID0+ICdlbGVtZW50MTUxY20nIH0gXSB9CisKKyAgICBhc3NlcnRfZXF1YWwgJ2RyYWZ0MTUxY20nLCBAY29udGV4dFsncHJvZHVjdC52YXJpYW50c1swXS50aXRsZSddCisgICAgYXNzZXJ0X2VxdWFsICdlbGVtZW50MTUxY20nLCBAY29udGV4dFsncHJvZHVjdC52YXJpYW50c1sxXS50aXRsZSddCisgICAgYXNzZXJ0X2VxdWFsICdkcmFmdDE1MWNtJywgQGNvbnRleHRbJ3Byb2R1Y3QudmFyaWFudHMuZmlyc3QudGl0bGUnXQorICAgIGFzc2VydF9lcXVhbCAnZWxlbWVudDE1MWNtJywgQGNvbnRleHRbJ3Byb2R1Y3QudmFyaWFudHMubGFzdC50aXRsZSddCisgIGVuZAorCisgIGRlZiB0ZXN0X2NlbnRzCisgICAgQGNvbnRleHQubWVyZ2UoImNlbnRzIiA9PiBIdW5kcmVkQ2VudGVzLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgMTAwLCBAY29udGV4dFsnY2VudHMnXQorICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfY2VudHMKKyAgICBAY29udGV4dC5tZXJnZSgiY2VudHMiID0+IHsgJ2Ftb3VudCcgPT4gSHVuZHJlZENlbnRlcy5uZXcgfSkKKyAgICBhc3NlcnRfZXF1YWwgMTAwLCBAY29udGV4dFsnY2VudHMuYW1vdW50J10KKworICAgIEBjb250ZXh0Lm1lcmdlKCJjZW50cyIgPT4geyAnY2VudHMnID0+IHsgJ2Ftb3VudCcgPT4gSHVuZHJlZENlbnRlcy5uZXcgfSB9KQorICAgIGFzc2VydF9lcXVhbCAxMDAsIEBjb250ZXh0WydjZW50cy5jZW50cy5hbW91bnQnXQorICBlbmQKKworICBkZWYgdGVzdF9jZW50c190aHJvdWdoX2Ryb3AKKyAgICBAY29udGV4dC5tZXJnZSgiY2VudHMiID0+IENlbnRzRHJvcC5uZXcpCisgICAgYXNzZXJ0X2VxdWFsIDEwMCwgQGNvbnRleHRbJ2NlbnRzLmFtb3VudCddCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9jZW50c190aHJvdWdoX2Ryb3AKKyAgICBAY29udGV4dC5tZXJnZSgidmFycyIgPT4geyAiY2VudHMiID0+IENlbnRzRHJvcC5uZXcgfSkKKyAgICBhc3NlcnRfZXF1YWwgMTAwLCBAY29udGV4dFsndmFycy5jZW50cy5hbW91bnQnXQorICBlbmQKKworICBkZWYgdGVzdF9kcm9wX21ldGhvZHNfd2l0aF9xdWVzdGlvbl9tYXJrcworICAgIEBjb250ZXh0Lm1lcmdlKCJjZW50cyIgPT4gQ2VudHNEcm9wLm5ldykKKyAgICBhc3NlcnQgQGNvbnRleHRbJ2NlbnRzLm5vbl96ZXJvPyddCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbnRleHRfZnJvbV93aXRoaW5fZHJvcAorICAgIEBjb250ZXh0Lm1lcmdlKCJ0ZXN0IiA9PiAnMTIzJywgInZhcnMiID0+IENvbnRleHRTZW5zaXRpdmVEcm9wLm5ldykKKyAgICBhc3NlcnRfZXF1YWwgJzEyMycsIEBjb250ZXh0Wyd2YXJzLnRlc3QnXQorICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfY29udGV4dF9mcm9tX3dpdGhpbl9kcm9wCisgICAgQGNvbnRleHQubWVyZ2UoInRlc3QiID0+ICcxMjMnLCAidmFycyIgPT4geyAibG9jYWwiID0+IENvbnRleHRTZW5zaXRpdmVEcm9wLm5ldyB9KQorICAgIGFzc2VydF9lcXVhbCAnMTIzJywgQGNvbnRleHRbJ3ZhcnMubG9jYWwudGVzdCddCisgIGVuZAorCisgIGRlZiB0ZXN0X3JhbmdlcworICAgIEBjb250ZXh0Lm1lcmdlKCJ0ZXN0IiA9PiAnNScpCisgICAgYXNzZXJ0X2VxdWFsICgxLi41KSwgQGNvbnRleHRbJygxLi41KSddCisgICAgYXNzZXJ0X2VxdWFsICgxLi41KSwgQGNvbnRleHRbJygxLi50ZXN0KSddCisgICAgYXNzZXJ0X2VxdWFsICg1Li41KSwgQGNvbnRleHRbJyh0ZXN0Li50ZXN0KSddCisgIGVuZAorCisgIGRlZiB0ZXN0X2NlbnRzX3Rocm91Z2hfZHJvcF9uZXN0ZWRseQorICAgIEBjb250ZXh0Lm1lcmdlKCJjZW50cyIgPT4geyAiY2VudHMiID0+IENlbnRzRHJvcC5uZXcgfSkKKyAgICBhc3NlcnRfZXF1YWwgMTAwLCBAY29udGV4dFsnY2VudHMuY2VudHMuYW1vdW50J10KKworICAgIEBjb250ZXh0Lm1lcmdlKCJjZW50cyIgPT4geyAiY2VudHMiID0+IHsgImNlbnRzIiA9PiBDZW50c0Ryb3AubmV3IH0gfSkKKyAgICBhc3NlcnRfZXF1YWwgMTAwLCBAY29udGV4dFsnY2VudHMuY2VudHMuY2VudHMuYW1vdW50J10KKyAgZW5kCisKKyAgZGVmIHRlc3RfZHJvcF93aXRoX3ZhcmlhYmxlX2NhbGxlZF9vbmx5X29uY2UKKyAgICBAY29udGV4dFsnY291bnRlciddID0gQ291bnRlckRyb3AubmV3CisKKyAgICBhc3NlcnRfZXF1YWwgMSwgQGNvbnRleHRbJ2NvdW50ZXIuY291bnQnXQorICAgIGFzc2VydF9lcXVhbCAyLCBAY29udGV4dFsnY291bnRlci5jb3VudCddCisgICAgYXNzZXJ0X2VxdWFsIDMsIEBjb250ZXh0Wydjb3VudGVyLmNvdW50J10KKyAgZW5kCisKKyAgZGVmIHRlc3RfZHJvcF93aXRoX2tleV9jYWxsZWRfb25seV9vbmNlCisgICAgQGNvbnRleHRbJ2NvdW50ZXInXSA9IENvdW50ZXJEcm9wLm5ldworCisgICAgYXNzZXJ0X2VxdWFsIDEsIEBjb250ZXh0Wydjb3VudGVyWyJjb3VudCJdJ10KKyAgICBhc3NlcnRfZXF1YWwgMiwgQGNvbnRleHRbJ2NvdW50ZXJbImNvdW50Il0nXQorICAgIGFzc2VydF9lcXVhbCAzLCBAY29udGV4dFsnY291bnRlclsiY291bnQiXSddCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb2NfYXNfdmFyaWFibGUKKyAgICBAY29udGV4dFsnZHluYW1pYyddID0gcHJvYyB7ICdIZWxsbycgfQorCisgICAgYXNzZXJ0X2VxdWFsICdIZWxsbycsIEBjb250ZXh0WydkeW5hbWljJ10KKyAgZW5kCisKKyAgZGVmIHRlc3RfbGFtYmRhX2FzX3ZhcmlhYmxlCisgICAgQGNvbnRleHRbJ2R5bmFtaWMnXSA9IHByb2MgeyAnSGVsbG8nIH0KKworICAgIGFzc2VydF9lcXVhbCAnSGVsbG8nLCBAY29udGV4dFsnZHluYW1pYyddCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9sYW1iZGFfYXNfdmFyaWFibGUKKyAgICBAY29udGV4dFsnZHluYW1pYyddID0geyAibGFtYmRhIiA9PiBwcm9jIHsgJ0hlbGxvJyB9IH0KKworICAgIGFzc2VydF9lcXVhbCAnSGVsbG8nLCBAY29udGV4dFsnZHluYW1pYy5sYW1iZGEnXQorICBlbmQKKworICBkZWYgdGVzdF9hcnJheV9jb250YWluaW5nX2xhbWJkYV9hc192YXJpYWJsZQorICAgIEBjb250ZXh0WydkeW5hbWljJ10gPSBbMSwgMiwgcHJvYyB7ICdIZWxsbycgfSwgNCwgNV0KKworICAgIGFzc2VydF9lcXVhbCAnSGVsbG8nLCBAY29udGV4dFsnZHluYW1pY1syXSddCisgIGVuZAorCisgIGRlZiB0ZXN0X2xhbWJkYV9pc19jYWxsZWRfb25jZQorICAgIEBjb250ZXh0WydjYWxsY291bnQnXSA9IHByb2MgeyBAZ2xvYmFsIHx8PSAwOyBAZ2xvYmFsICs9IDE7IEBnbG9iYWwudG9fcyB9CisKKyAgICBhc3NlcnRfZXF1YWwgJzEnLCBAY29udGV4dFsnY2FsbGNvdW50J10KKyAgICBhc3NlcnRfZXF1YWwgJzEnLCBAY29udGV4dFsnY2FsbGNvdW50J10KKyAgICBhc3NlcnRfZXF1YWwgJzEnLCBAY29udGV4dFsnY2FsbGNvdW50J10KKworICAgIEBnbG9iYWwgPSBuaWwKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2xhbWJkYV9pc19jYWxsZWRfb25jZQorICAgIEBjb250ZXh0WydjYWxsY291bnQnXSA9IHsgImxhbWJkYSIgPT4gcHJvYyB7IEBnbG9iYWwgfHw9IDA7IEBnbG9iYWwgKz0gMTsgQGdsb2JhbC50b19zIH0gfQorCisgICAgYXNzZXJ0X2VxdWFsICcxJywgQGNvbnRleHRbJ2NhbGxjb3VudC5sYW1iZGEnXQorICAgIGFzc2VydF9lcXVhbCAnMScsIEBjb250ZXh0WydjYWxsY291bnQubGFtYmRhJ10KKyAgICBhc3NlcnRfZXF1YWwgJzEnLCBAY29udGV4dFsnY2FsbGNvdW50LmxhbWJkYSddCisKKyAgICBAZ2xvYmFsID0gbmlsCisgIGVuZAorCisgIGRlZiB0ZXN0X2xhbWJkYV9pbl9hcnJheV9pc19jYWxsZWRfb25jZQorICAgIEBjb250ZXh0WydjYWxsY291bnQnXSA9IFsxLCAyLCBwcm9jIHsgQGdsb2JhbCB8fD0gMDsgQGdsb2JhbCArPSAxOyBAZ2xvYmFsLnRvX3MgfSwgNCwgNV0KKworICAgIGFzc2VydF9lcXVhbCAnMScsIEBjb250ZXh0WydjYWxsY291bnRbMl0nXQorICAgIGFzc2VydF9lcXVhbCAnMScsIEBjb250ZXh0WydjYWxsY291bnRbMl0nXQorICAgIGFzc2VydF9lcXVhbCAnMScsIEBjb250ZXh0WydjYWxsY291bnRbMl0nXQorCisgICAgQGdsb2JhbCA9IG5pbAorICBlbmQKKworICBkZWYgdGVzdF9hY2Nlc3NfdG9fY29udGV4dF9mcm9tX3Byb2MKKyAgICBAY29udGV4dC5yZWdpc3RlcnNbOm1hZ2ljXSA9IDM0NTM5MgorCisgICAgQGNvbnRleHRbJ21hZ2ljJ10gPSBwcm9jIHsgQGNvbnRleHQucmVnaXN0ZXJzWzptYWdpY10gfQorCisgICAgYXNzZXJ0X2VxdWFsIDM0NTM5MiwgQGNvbnRleHRbJ21hZ2ljJ10KKyAgZW5kCisKKyAgZGVmIHRlc3RfdG9fbGlxdWlkX2FuZF9jb250ZXh0X2F0X2ZpcnN0X2xldmVsCisgICAgQGNvbnRleHRbJ2NhdGVnb3J5J10gPSBDYXRlZ29yeS5uZXcoImZvb2JhciIpCisgICAgYXNzZXJ0X2tpbmRfb2YgQ2F0ZWdvcnlEcm9wLCBAY29udGV4dFsnY2F0ZWdvcnknXQorICAgIGFzc2VydF9lcXVhbCBAY29udGV4dCwgQGNvbnRleHRbJ2NhdGVnb3J5J10uY29udGV4dAorICBlbmQKKworICBkZWYgdGVzdF91c2VfZW1wdHlfaW5zdGVhZF9vZl9hbnlfaW5faW50ZXJydXB0X2hhbmRsaW5nX3RvX2F2b2lkX2xvdHNfb2ZfdW5uZWNlc3Nhcnlfb2JqZWN0X2FsbG9jYXRpb25zCisgICAgbW9ja19hbnkgPSBTcHkub25faW5zdGFuY2VfbWV0aG9kKEFycmF5LCA6YW55PykKKyAgICBtb2NrX2VtcHR5ID0gU3B5Lm9uX2luc3RhbmNlX21ldGhvZChBcnJheSwgOmVtcHR5PykKKworICAgIEBjb250ZXh0LmludGVycnVwdD8KKworICAgIHJlZnV0ZSBtb2NrX2FueS5oYXNfYmVlbl9jYWxsZWQ/CisgICAgYXNzZXJ0IG1vY2tfZW1wdHkuaGFzX2JlZW5fY2FsbGVkPworICBlbmQKKworICBkZWYgdGVzdF9jb250ZXh0X2luaXRpYWxpemF0aW9uX3dpdGhfYV9wcm9jX2luX2Vudmlyb25tZW50CisgICAgY29udHggPSBDb250ZXh0Lm5ldyhbdGVzdDogLT4oYykgeyBjWydwb3V0aW5lJ10gfV0sIHsgdGVzdDogOmZvbyB9KQorCisgICAgYXNzZXJ0IGNvbnR4CisgICAgYXNzZXJ0X25pbCBjb250eFsncG91dGluZSddCisgIGVuZAorCisgIGRlZiB0ZXN0X2FwcGx5X2dsb2JhbF9maWx0ZXIKKyAgICBnbG9iYWxfZmlsdGVyX3Byb2MgPSAtPihvdXRwdXQpIHsgIiN7b3V0cHV0fSBmaWx0ZXJlZCIgfQorCisgICAgY29udGV4dCA9IENvbnRleHQubmV3CisgICAgY29udGV4dC5nbG9iYWxfZmlsdGVyID0gZ2xvYmFsX2ZpbHRlcl9wcm9jCisKKyAgICBhc3NlcnRfZXF1YWwgJ2hpIGZpbHRlcmVkJywgY29udGV4dC5hcHBseV9nbG9iYWxfZmlsdGVyKCdoaScpCisgIGVuZAorCisgIGRlZiB0ZXN0X2FwcGx5X2dsb2JhbF9maWx0ZXJfd2hlbl9ub19nbG9iYWxfZmlsdGVyX2V4aXN0CisgICAgY29udGV4dCA9IENvbnRleHQubmV3CisgICAgYXNzZXJ0X2VxdWFsICdoaScsIGNvbnRleHQuYXBwbHlfZ2xvYmFsX2ZpbHRlcignaGknKQorICBlbmQKK2VuZCAjIENvbnRleHRUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L2ZpbGVfc3lzdGVtX3VuaXRfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvZmlsZV9zeXN0ZW1fdW5pdF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzI1MGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L2ZpbGVfc3lzdGVtX3VuaXRfdGVzdC5yYgpAQCAtMCwwICsxLDM1IEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgRmlsZVN5c3RlbVVuaXRUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9kZWZhdWx0CisgICAgYXNzZXJ0X3JhaXNlcyhGaWxlU3lzdGVtRXJyb3IpIGRvCisgICAgICBCbGFua0ZpbGVTeXN0ZW0ubmV3LnJlYWRfdGVtcGxhdGVfZmlsZSgiZHVtbXkiKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9sb2NhbAorICAgIGZpbGVfc3lzdGVtID0gTGlxdWlkOjpMb2NhbEZpbGVTeXN0ZW0ubmV3KCIvc29tZS9wYXRoIikKKyAgICBhc3NlcnRfZXF1YWwgIi9zb21lL3BhdGgvX215cGFydGlhbC5saXF1aWQiLCBmaWxlX3N5c3RlbS5mdWxsX3BhdGgoIm15cGFydGlhbCIpCisgICAgYXNzZXJ0X2VxdWFsICIvc29tZS9wYXRoL2Rpci9fbXlwYXJ0aWFsLmxpcXVpZCIsIGZpbGVfc3lzdGVtLmZ1bGxfcGF0aCgiZGlyL215cGFydGlhbCIpCisKKyAgICBhc3NlcnRfcmFpc2VzKEZpbGVTeXN0ZW1FcnJvcikgZG8KKyAgICAgIGZpbGVfc3lzdGVtLmZ1bGxfcGF0aCgiLi4vZGlyL215cGFydGlhbCIpCisgICAgZW5kCisKKyAgICBhc3NlcnRfcmFpc2VzKEZpbGVTeXN0ZW1FcnJvcikgZG8KKyAgICAgIGZpbGVfc3lzdGVtLmZ1bGxfcGF0aCgiL2Rpci8uLi8uLi9kaXIvbXlwYXJ0aWFsIikKKyAgICBlbmQKKworICAgIGFzc2VydF9yYWlzZXMoRmlsZVN5c3RlbUVycm9yKSBkbworICAgICAgZmlsZV9zeXN0ZW0uZnVsbF9wYXRoKCIvZXRjL3Bhc3N3ZCIpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2N1c3RvbV90ZW1wbGF0ZV9maWxlbmFtZV9wYXR0ZXJucworICAgIGZpbGVfc3lzdGVtID0gTGlxdWlkOjpMb2NhbEZpbGVTeXN0ZW0ubmV3KCIvc29tZS9wYXRoIiwgIiVzLmh0bWwiKQorICAgIGFzc2VydF9lcXVhbCAiL3NvbWUvcGF0aC9teXBhcnRpYWwuaHRtbCIsIGZpbGVfc3lzdGVtLmZ1bGxfcGF0aCgibXlwYXJ0aWFsIikKKyAgICBhc3NlcnRfZXF1YWwgIi9zb21lL3BhdGgvZGlyL215cGFydGlhbC5odG1sIiwgZmlsZV9zeXN0ZW0uZnVsbF9wYXRoKCJkaXIvbXlwYXJ0aWFsIikKKyAgZW5kCitlbmQgIyBGaWxlU3lzdGVtVGVzdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9pMThuX3VuaXRfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvaTE4bl91bml0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3NTAwZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvaTE4bl91bml0X3Rlc3QucmIKQEAgLTAsMCArMSwzNyBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIEkxOG5Vbml0VGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGluY2x1ZGUgTGlxdWlkCisKKyAgZGVmIHNldHVwCisgICAgQGkxOG4gPSBJMThuLm5ldyhmaXh0dXJlKCJlbl9sb2NhbGUueW1sIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpbXBsZV90cmFuc2xhdGVfc3RyaW5nCisgICAgYXNzZXJ0X2VxdWFsICJsZXNzIGlzIG1vcmUiLCBAaTE4bi50cmFuc2xhdGUoInNpbXBsZSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF90cmFuc2xhdGVfc3RyaW5nCisgICAgYXNzZXJ0X2VxdWFsICJzb21ldGhpbmcgd2Fzbid0IHJpZ2h0IiwgQGkxOG4udHJhbnNsYXRlKCJlcnJvcnMuc3ludGF4Lm9vcHMiKQorICBlbmQKKworICBkZWYgdGVzdF9zaW5nbGVfc3RyaW5nX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgInNvbWV0aGluZyBkaWZmZXJlbnQiLCBAaTE4bi50cmFuc2xhdGUoIndoYXRldmVyIiwgc29tZXRoaW5nOiAiZGlmZmVyZW50IikKKyAgZW5kCisKKyAgIyBkZWYgdGVzdF9yYWlzZXNfdHJhbnNsYXRpb25fZXJyb3Jfb25fdW5kZWZpbmVkX2ludGVycG9sYXRpb25fa2V5CisgICMgICBhc3NlcnRfcmFpc2VzIEkxOG46OlRyYW5zbGF0aW9uRXJyb3IgZG8KKyAgIyAgICAgQGkxOG4udHJhbnNsYXRlKCJ3aGF0ZXZlciIsIDpvb3BzdHlwb3MgPT4gInllcyIpCisgICMgICBlbmQKKyAgIyBlbmQKKworICBkZWYgdGVzdF9yYWlzZXNfdW5rbm93bl90cmFuc2xhdGlvbgorICAgIGFzc2VydF9yYWlzZXMgSTE4bjo6VHJhbnNsYXRpb25FcnJvciBkbworICAgICAgQGkxOG4udHJhbnNsYXRlKCJkb2VzbnRfZXhpc3QiKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9zZXRzX2RlZmF1bHRfcGF0aF90b19lbgorICAgIGFzc2VydF9lcXVhbCBJMThuOjpERUZBVUxUX0xPQ0FMRSwgSTE4bi5uZXcucGF0aAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9sZXhlcl91bml0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L2xleGVyX3VuaXRfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjljMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9sZXhlcl91bml0X3Rlc3QucmIKQEAgLTAsMCArMSw1MSBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIExleGVyVW5pdFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiB0ZXN0X3N0cmluZ3MKKyAgICB0b2tlbnMgPSBMZXhlci5uZXcoJSggJ3RoaXMgaXMgYSB0ZXN0IiInICJ3YXQgJ2xvbCciKSkudG9rZW5pemUKKyAgICBhc3NlcnRfZXF1YWwgW1s6c3RyaW5nLCAlKCd0aGlzIGlzIGEgdGVzdCIiJyldLCBbOnN0cmluZywgJSgid2F0ICdsb2wnIildLCBbOmVuZF9vZl9zdHJpbmddXSwgdG9rZW5zCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVnZXIKKyAgICB0b2tlbnMgPSBMZXhlci5uZXcoJ2hpIDUwJykudG9rZW5pemUKKyAgICBhc3NlcnRfZXF1YWwgW1s6aWQsICdoaSddLCBbOm51bWJlciwgJzUwJ10sIFs6ZW5kX29mX3N0cmluZ11dLCB0b2tlbnMKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmxvYXQKKyAgICB0b2tlbnMgPSBMZXhlci5uZXcoJ2hpIDUuMCcpLnRva2VuaXplCisgICAgYXNzZXJ0X2VxdWFsIFtbOmlkLCAnaGknXSwgWzpudW1iZXIsICc1LjAnXSwgWzplbmRfb2Zfc3RyaW5nXV0sIHRva2VucworICBlbmQKKworICBkZWYgdGVzdF9jb21wYXJpc29uCisgICAgdG9rZW5zID0gTGV4ZXIubmV3KCc9PSA8PiBjb250YWlucycpLnRva2VuaXplCisgICAgYXNzZXJ0X2VxdWFsIFtbOmNvbXBhcmlzb24sICc9PSddLCBbOmNvbXBhcmlzb24sICc8PiddLCBbOmNvbXBhcmlzb24sICdjb250YWlucyddLCBbOmVuZF9vZl9zdHJpbmddXSwgdG9rZW5zCisgIGVuZAorCisgIGRlZiB0ZXN0X3NwZWNpYWxzCisgICAgdG9rZW5zID0gTGV4ZXIubmV3KCd8IC46JykudG9rZW5pemUKKyAgICBhc3NlcnRfZXF1YWwgW1s6cGlwZSwgJ3wnXSwgWzpkb3QsICcuJ10sIFs6Y29sb24sICc6J10sIFs6ZW5kX29mX3N0cmluZ11dLCB0b2tlbnMKKyAgICB0b2tlbnMgPSBMZXhlci5uZXcoJ1ssXScpLnRva2VuaXplCisgICAgYXNzZXJ0X2VxdWFsIFtbOm9wZW5fc3F1YXJlLCAnWyddLCBbOmNvbW1hLCAnLCddLCBbOmNsb3NlX3NxdWFyZSwgJ10nXSwgWzplbmRfb2Zfc3RyaW5nXV0sIHRva2VucworICBlbmQKKworICBkZWYgdGVzdF9mYW5jeV9pZGVudGlmaWVycworICAgIHRva2VucyA9IExleGVyLm5ldygnaGkgZml2ZT8nKS50b2tlbml6ZQorICAgIGFzc2VydF9lcXVhbCBbWzppZCwgJ2hpJ10sIFs6aWQsICdmaXZlPyddLCBbOmVuZF9vZl9zdHJpbmddXSwgdG9rZW5zCisKKyAgICB0b2tlbnMgPSBMZXhlci5uZXcoJzJmb28nKS50b2tlbml6ZQorICAgIGFzc2VydF9lcXVhbCBbWzpudW1iZXIsICcyJ10sIFs6aWQsICdmb28nXSwgWzplbmRfb2Zfc3RyaW5nXV0sIHRva2VucworICBlbmQKKworICBkZWYgdGVzdF93aGl0ZXNwYWNlCisgICAgdG9rZW5zID0gTGV4ZXIubmV3KCJmaXZlfFxuXHQgPT0iKS50b2tlbml6ZQorICAgIGFzc2VydF9lcXVhbCBbWzppZCwgJ2ZpdmUnXSwgWzpwaXBlLCAnfCddLCBbOmNvbXBhcmlzb24sICc9PSddLCBbOmVuZF9vZl9zdHJpbmddXSwgdG9rZW5zCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuZXhwZWN0ZWRfY2hhcmFjdGVyCisgICAgYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcikgZG8KKyAgICAgIExleGVyLm5ldygiJSIpLnRva2VuaXplCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3BhcnNlcl91bml0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3BhcnNlcl91bml0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyMzMzNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvcGFyc2VyX3VuaXRfdGVzdC5yYgpAQCAtMCwwICsxLDgyIEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgUGFyc2VyVW5pdFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiB0ZXN0X2NvbnN1bWUKKyAgICBwID0gUGFyc2VyLm5ldygid2F0OiA3IikKKyAgICBhc3NlcnRfZXF1YWwgJ3dhdCcsIHAuY29uc3VtZSg6aWQpCisgICAgYXNzZXJ0X2VxdWFsICc6JywgcC5jb25zdW1lKDpjb2xvbikKKyAgICBhc3NlcnRfZXF1YWwgJzcnLCBwLmNvbnN1bWUoOm51bWJlcikKKyAgZW5kCisKKyAgZGVmIHRlc3RfanVtcAorICAgIHAgPSBQYXJzZXIubmV3KCJ3YXQ6IDciKQorICAgIHAuanVtcCgyKQorICAgIGFzc2VydF9lcXVhbCAnNycsIHAuY29uc3VtZSg6bnVtYmVyKQorICBlbmQKKworICBkZWYgdGVzdF9jb25zdW1lPworICAgIHAgPSBQYXJzZXIubmV3KCJ3YXQ6IDciKQorICAgIGFzc2VydF9lcXVhbCAnd2F0JywgcC5jb25zdW1lPyg6aWQpCisgICAgYXNzZXJ0X2VxdWFsIGZhbHNlLCBwLmNvbnN1bWU/KDpkb3QpCisgICAgYXNzZXJ0X2VxdWFsICc6JywgcC5jb25zdW1lKDpjb2xvbikKKyAgICBhc3NlcnRfZXF1YWwgJzcnLCBwLmNvbnN1bWU/KDpudW1iZXIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2lkPworICAgIHAgPSBQYXJzZXIubmV3KCJ3YXQgNiBQZXRlciBIZWdlbW9uIikKKyAgICBhc3NlcnRfZXF1YWwgJ3dhdCcsIHAuaWQ/KCd3YXQnKQorICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgcC5pZD8oJ2VuZGdhbWUnKQorICAgIGFzc2VydF9lcXVhbCAnNicsIHAuY29uc3VtZSg6bnVtYmVyKQorICAgIGFzc2VydF9lcXVhbCAnUGV0ZXInLCBwLmlkPygnUGV0ZXInKQorICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgcC5pZD8oJ0FjaGlsbGVzJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbG9vaworICAgIHAgPSBQYXJzZXIubmV3KCJ3YXQgNiBQZXRlciBIZWdlbW9uIikKKyAgICBhc3NlcnRfZXF1YWwgdHJ1ZSwgcC5sb29rKDppZCkKKyAgICBhc3NlcnRfZXF1YWwgJ3dhdCcsIHAuY29uc3VtZSg6aWQpCisgICAgYXNzZXJ0X2VxdWFsIGZhbHNlLCBwLmxvb2soOmNvbXBhcmlzb24pCisgICAgYXNzZXJ0X2VxdWFsIHRydWUsIHAubG9vayg6bnVtYmVyKQorICAgIGFzc2VydF9lcXVhbCB0cnVlLCBwLmxvb2soOmlkLCAxKQorICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgcC5sb29rKDpudW1iZXIsIDEpCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4cHJlc3Npb25zCisgICAgcCA9IFBhcnNlci5uZXcoImhpLnRoZXJlIGhpP1s1XS50aGVyZT8gaGkudGhlcmUuYm9iIikKKyAgICBhc3NlcnRfZXF1YWwgJ2hpLnRoZXJlJywgcC5leHByZXNzaW9uCisgICAgYXNzZXJ0X2VxdWFsICdoaT9bNV0udGhlcmU/JywgcC5leHByZXNzaW9uCisgICAgYXNzZXJ0X2VxdWFsICdoaS50aGVyZS5ib2InLCBwLmV4cHJlc3Npb24KKworICAgIHAgPSBQYXJzZXIubmV3KCI1NjcgNi4wICdsb2wnIFwid3V0XCIiKQorICAgIGFzc2VydF9lcXVhbCAnNTY3JywgcC5leHByZXNzaW9uCisgICAgYXNzZXJ0X2VxdWFsICc2LjAnLCBwLmV4cHJlc3Npb24KKyAgICBhc3NlcnRfZXF1YWwgIidsb2wnIiwgcC5leHByZXNzaW9uCisgICAgYXNzZXJ0X2VxdWFsICcid3V0IicsIHAuZXhwcmVzc2lvbgorICBlbmQKKworICBkZWYgdGVzdF9yYW5nZXMKKyAgICBwID0gUGFyc2VyLm5ldygiKDUuLjcpICgxLjUuLjkuNikgKHlvdW5nLi5vbGQpIChoaVs1XS53YXQuLm9sZCkiKQorICAgIGFzc2VydF9lcXVhbCAnKDUuLjcpJywgcC5leHByZXNzaW9uCisgICAgYXNzZXJ0X2VxdWFsICcoMS41Li45LjYpJywgcC5leHByZXNzaW9uCisgICAgYXNzZXJ0X2VxdWFsICcoeW91bmcuLm9sZCknLCBwLmV4cHJlc3Npb24KKyAgICBhc3NlcnRfZXF1YWwgJyhoaVs1XS53YXQuLm9sZCknLCBwLmV4cHJlc3Npb24KKyAgZW5kCisKKyAgZGVmIHRlc3RfYXJndW1lbnRzCisgICAgcCA9IFBhcnNlci5uZXcoImZpbHRlcjogaGkudGhlcmVbNV0sIGtleWFyZzogNyIpCisgICAgYXNzZXJ0X2VxdWFsICdmaWx0ZXInLCBwLmNvbnN1bWUoOmlkKQorICAgIGFzc2VydF9lcXVhbCAnOicsIHAuY29uc3VtZSg6Y29sb24pCisgICAgYXNzZXJ0X2VxdWFsICdoaS50aGVyZVs1XScsIHAuYXJndW1lbnQKKyAgICBhc3NlcnRfZXF1YWwgJywnLCBwLmNvbnN1bWUoOmNvbW1hKQorICAgIGFzc2VydF9lcXVhbCAna2V5YXJnOiA3JywgcC5hcmd1bWVudAorICBlbmQKKworICBkZWYgdGVzdF9pbnZhbGlkX2V4cHJlc3Npb24KKyAgICBhc3NlcnRfcmFpc2VzKFN5bnRheEVycm9yKSBkbworICAgICAgcCA9IFBhcnNlci5uZXcoIj09IikKKyAgICAgIHAuZXhwcmVzc2lvbgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9yZWdleHBfdW5pdF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9yZWdleHBfdW5pdF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MjEyMjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3JlZ2V4cF91bml0X3Rlc3QucmIKQEAgLTAsMCArMSw0NCBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIFJlZ2V4cFVuaXRUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9lbXB0eQorICAgIGFzc2VydF9lcXVhbCBbXSwgJycuc2NhbihRdW90ZWRGcmFnbWVudCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcXVvdGUKKyAgICBhc3NlcnRfZXF1YWwgWyciYXJnIDEiJ10sICciYXJnIDEiJy5zY2FuKFF1b3RlZEZyYWdtZW50KQorICBlbmQKKworICBkZWYgdGVzdF93b3JkcworICAgIGFzc2VydF9lcXVhbCBbJ2FyZzEnLCAnYXJnMiddLCAnYXJnMSBhcmcyJy5zY2FuKFF1b3RlZEZyYWdtZW50KQorICBlbmQKKworICBkZWYgdGVzdF90YWdzCisgICAgYXNzZXJ0X2VxdWFsIFsnPHRyPicsICc8L3RyPiddLCAnPHRyPiA8L3RyPicuc2NhbihRdW90ZWRGcmFnbWVudCkKKyAgICBhc3NlcnRfZXF1YWwgWyc8dHI+PC90cj4nXSwgJzx0cj48L3RyPicuc2NhbihRdW90ZWRGcmFnbWVudCkKKyAgICBhc3NlcnRfZXF1YWwgWyc8c3R5bGUnLCAnY2xhc3M9ImhlbGxvIj4nLCAnPC9zdHlsZT4nXSwgJSg8c3R5bGUgY2xhc3M9ImhlbGxvIj4nIDwvc3R5bGU+KS5zY2FuKFF1b3RlZEZyYWdtZW50KQorICBlbmQKKworICBkZWYgdGVzdF9kb3VibGVfcXVvdGVkX3dvcmRzCisgICAgYXNzZXJ0X2VxdWFsIFsnYXJnMScsICdhcmcyJywgJyJhcmcgMyInXSwgJ2FyZzEgYXJnMiAiYXJnIDMiJy5zY2FuKFF1b3RlZEZyYWdtZW50KQorICBlbmQKKworICBkZWYgdGVzdF9zaW5nbGVfcXVvdGVkX3dvcmRzCisgICAgYXNzZXJ0X2VxdWFsIFsnYXJnMScsICdhcmcyJywgIidhcmcgMyciXSwgJ2FyZzEgYXJnMiBcJ2FyZyAzXCcnLnNjYW4oUXVvdGVkRnJhZ21lbnQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3F1b3RlZF93b3Jkc19pbl90aGVfbWlkZGxlCisgICAgYXNzZXJ0X2VxdWFsIFsnYXJnMScsICdhcmcyJywgJyJhcmcgMyInLCAnYXJnNCddLCAnYXJnMSBhcmcyICJhcmcgMyIgYXJnNCAgICcuc2NhbihRdW90ZWRGcmFnbWVudCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyaWFibGVfcGFyc2VyCisgICAgYXNzZXJ0X2VxdWFsIFsndmFyJ10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YXInLnNjYW4oVmFyaWFibGVQYXJzZXIpCisgICAgYXNzZXJ0X2VxdWFsIFsndmFyJywgJ21ldGhvZCddLCAgICAgICAgICAgICAgICAgICAgICd2YXIubWV0aG9kJy5zY2FuKFZhcmlhYmxlUGFyc2VyKQorICAgIGFzc2VydF9lcXVhbCBbJ3ZhcicsICdbbWV0aG9kXSddLCAgICAgICAgICAgICAgICAgICAndmFyW21ldGhvZF0nLnNjYW4oVmFyaWFibGVQYXJzZXIpCisgICAgYXNzZXJ0X2VxdWFsIFsndmFyJywgJ1ttZXRob2RdJywgJ1swXSddLCAgICAgICAgICAgICd2YXJbbWV0aG9kXVswXScuc2NhbihWYXJpYWJsZVBhcnNlcikKKyAgICBhc3NlcnRfZXF1YWwgWyd2YXInLCAnWyJtZXRob2QiXScsICdbMF0nXSwgICAgICAgICAgJ3ZhclsibWV0aG9kIl1bMF0nLnNjYW4oVmFyaWFibGVQYXJzZXIpCisgICAgYXNzZXJ0X2VxdWFsIFsndmFyJywgJ1ttZXRob2RdJywgJ1swXScsICdtZXRob2QnXSwgICd2YXJbbWV0aG9kXVswXS5tZXRob2QnLnNjYW4oVmFyaWFibGVQYXJzZXIpCisgIGVuZAorZW5kICMgUmVnZXhwVGVzdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9zdHJhaW5lcl91bml0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3N0cmFpbmVyX3VuaXRfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2NkYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC9zdHJhaW5lcl91bml0X3Rlc3QucmIKQEAgLTAsMCArMSwxNDggQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBTdHJhaW5lclVuaXRUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBtb2R1bGUgQWNjZXNzU2NvcGVGaWx0ZXJzCisgICAgZGVmIHB1YmxpY19maWx0ZXIKKyAgICAgICJwdWJsaWMiCisgICAgZW5kCisKKyAgICBkZWYgcHJpdmF0ZV9maWx0ZXIKKyAgICAgICJwcml2YXRlIgorICAgIGVuZAorICAgIHByaXZhdGUgOnByaXZhdGVfZmlsdGVyCisgIGVuZAorCisgIFN0cmFpbmVyLmdsb2JhbF9maWx0ZXIoQWNjZXNzU2NvcGVGaWx0ZXJzKQorCisgIGRlZiB0ZXN0X3N0cmFpbmVyCisgICAgc3RyYWluZXIgPSBTdHJhaW5lci5jcmVhdGUobmlsKQorICAgIGFzc2VydF9lcXVhbCA1LCBzdHJhaW5lci5pbnZva2UoJ3NpemUnLCAnaW5wdXQnKQorICAgIGFzc2VydF9lcXVhbCAicHVibGljIiwgc3RyYWluZXIuaW52b2tlKCJwdWJsaWNfZmlsdGVyIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RhaW5lcl9yYWlzZXNfYXJndW1lbnRfZXJyb3IKKyAgICBzdHJhaW5lciA9IFN0cmFpbmVyLmNyZWF0ZShuaWwpCisgICAgYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6OkFyZ3VtZW50RXJyb3IpIGRvCisgICAgICBzdHJhaW5lci5pbnZva2UoInB1YmxpY19maWx0ZXIiLCAxKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9zdGFpbmVyX2FyZ3VtZW50X2Vycm9yX2NvbnRhaW5zX2JhY2t0cmFjZQorICAgIHN0cmFpbmVyID0gU3RyYWluZXIuY3JlYXRlKG5pbCkKKyAgICBiZWdpbgorICAgICAgc3RyYWluZXIuaW52b2tlKCJwdWJsaWNfZmlsdGVyIiwgMSkKKyAgICByZXNjdWUgTGlxdWlkOjpBcmd1bWVudEVycm9yID0+IGUKKyAgICAgIGFzc2VydF9tYXRjaCgKKyAgICAgICAgL1xBTGlxdWlkIGVycm9yOiB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIFwoKDEgZm9yIDB8Z2l2ZW4gMSwgZXhwZWN0ZWQgMClcKVx6LywKKyAgICAgICAgZS5tZXNzYWdlKQorICAgICAgYXNzZXJ0X2VxdWFsIGUuYmFja3RyYWNlWzBdLnNwbGl0KCc6JylbMF0sIF9fRklMRV9fCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmFpbmVyX29ubHlfaW52b2tlc19wdWJsaWNfZmlsdGVyX21ldGhvZHMKKyAgICBzdHJhaW5lciA9IFN0cmFpbmVyLmNyZWF0ZShuaWwpCisgICAgYXNzZXJ0X2VxdWFsIGZhbHNlLCBzdHJhaW5lci5jbGFzcy5pbnZva2FibGU/KCdfX3Rlc3RfXycpCisgICAgYXNzZXJ0X2VxdWFsIGZhbHNlLCBzdHJhaW5lci5jbGFzcy5pbnZva2FibGU/KCd0ZXN0JykKKyAgICBhc3NlcnRfZXF1YWwgZmFsc2UsIHN0cmFpbmVyLmNsYXNzLmludm9rYWJsZT8oJ2luc3RhbmNlX2V2YWwnKQorICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgc3RyYWluZXIuY2xhc3MuaW52b2thYmxlPygnX19zZW5kX18nKQorICAgIGFzc2VydF9lcXVhbCB0cnVlLCBzdHJhaW5lci5jbGFzcy5pbnZva2FibGU/KCdzaXplJykgIyBmcm9tIHRoZSBzdGFuZGFyZCBsaWIKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyYWluZXJfcmV0dXJuc19uaWxfaWZfbm9fZmlsdGVyX21ldGhvZF9mb3VuZAorICAgIHN0cmFpbmVyID0gU3RyYWluZXIuY3JlYXRlKG5pbCkKKyAgICBhc3NlcnRfbmlsIHN0cmFpbmVyLmludm9rZSgicHJpdmF0ZV9maWx0ZXIiKQorICAgIGFzc2VydF9uaWwgc3RyYWluZXIuaW52b2tlKCJ1bmRlZl90aGVfZmlsdGVyIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyYWluZXJfcmV0dXJuc19maXJzdF9hcmd1bWVudF9pZl9ub19tZXRob2RfYW5kX2FyZ3VtZW50c19naXZlbgorICAgIHN0cmFpbmVyID0gU3RyYWluZXIuY3JlYXRlKG5pbCkKKyAgICBhc3NlcnRfZXF1YWwgInBhc3N3b3JkIiwgc3RyYWluZXIuaW52b2tlKCJ1bmRlZl90aGVfbWV0aG9kIiwgInBhc3N3b3JkIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyYWluZXJfb25seV9hbGxvd3NfbWV0aG9kc19kZWZpbmVkX2luX2ZpbHRlcnMKKyAgICBzdHJhaW5lciA9IFN0cmFpbmVyLmNyZWF0ZShuaWwpCisgICAgYXNzZXJ0X2VxdWFsICIxICsgMSIsIHN0cmFpbmVyLmludm9rZSgiaW5zdGFuY2VfZXZhbCIsICIxICsgMSIpCisgICAgYXNzZXJ0X2VxdWFsICJwdXRzIiwgIHN0cmFpbmVyLmludm9rZSgiX19zZW5kX18iLCAicHV0cyIsICJIaSBNb20iKQorICAgIGFzc2VydF9lcXVhbCAiaGFzX21ldGhvZD8iLCBzdHJhaW5lci5pbnZva2UoImludm9rZSIsICJoYXNfbWV0aG9kPyIsICJpbnZva2UiKQorICBlbmQKKworICBkZWYgdGVzdF9zdHJhaW5lcl91c2VzX2FfY2xhc3NfY2FjaGVfdG9fYXZvaWRfbWV0aG9kX2NhY2hlX2ludmFsaWRhdGlvbgorICAgIGEgPSBNb2R1bGUubmV3CisgICAgYiA9IE1vZHVsZS5uZXcKKyAgICBzdHJhaW5lciA9IFN0cmFpbmVyLmNyZWF0ZShuaWwsIFthLCBiXSkKKyAgICBhc3NlcnRfa2luZF9vZiBTdHJhaW5lciwgc3RyYWluZXIKKyAgICBhc3NlcnRfa2luZF9vZiBhLCBzdHJhaW5lcgorICAgIGFzc2VydF9raW5kX29mIGIsIHN0cmFpbmVyCisgICAgYXNzZXJ0X2tpbmRfb2YgTGlxdWlkOjpTdGFuZGFyZEZpbHRlcnMsIHN0cmFpbmVyCisgIGVuZAorCisgIGRlZiB0ZXN0X2FkZF9maWx0ZXJfd2hlbl93cm9uZ19maWx0ZXJfY2xhc3MKKyAgICBjID0gQ29udGV4dC5uZXcKKyAgICBzID0gYy5zdHJhaW5lcgorICAgIHdyb25nX2ZpbHRlciA9IC0+KHYpIHsgdi5yZXZlcnNlIH0KKworICAgIGFzc2VydF9yYWlzZXMgQXJndW1lbnRFcnJvciBkbworICAgICAgcy5jbGFzcy5hZGRfZmlsdGVyKHdyb25nX2ZpbHRlcikKKyAgICBlbmQKKyAgZW5kCisKKyAgbW9kdWxlIFByaXZhdGVNZXRob2RPdmVycmlkZUZpbHRlcgorICAgIHByaXZhdGUKKworICAgIGRlZiBwdWJsaWNfZmlsdGVyCisgICAgICAib3ZlcnJpZGVuIGFzIHByaXZhdGUiCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2FkZF9maWx0ZXJfcmFpc2VzX3doZW5fbW9kdWxlX3ByaXZhdGVseV9vdmVycmlkZXNfcmVnaXN0ZXJlZF9wdWJsaWNfbWV0aG9kcworICAgIHN0cmFpbmVyID0gQ29udGV4dC5uZXcuc3RyYWluZXIKKworICAgIGVycm9yID0gYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6Ok1ldGhvZE92ZXJyaWRlRXJyb3IpIGRvCisgICAgICBzdHJhaW5lci5jbGFzcy5hZGRfZmlsdGVyKFByaXZhdGVNZXRob2RPdmVycmlkZUZpbHRlcikKKyAgICBlbmQKKyAgICBhc3NlcnRfZXF1YWwgJ0xpcXVpZCBlcnJvcjogRmlsdGVyIG92ZXJyaWRlcyByZWdpc3RlcmVkIHB1YmxpYyBtZXRob2RzIGFzIG5vbiBwdWJsaWM6IHB1YmxpY19maWx0ZXInLCBlcnJvci5tZXNzYWdlCisgIGVuZAorCisgIG1vZHVsZSBQcm90ZWN0ZWRNZXRob2RPdmVycmlkZUZpbHRlcgorICAgIHByb3RlY3RlZAorCisgICAgZGVmIHB1YmxpY19maWx0ZXIKKyAgICAgICJvdmVycmlkZW4gYXMgcHJvdGVjdGVkIgorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9hZGRfZmlsdGVyX3JhaXNlc193aGVuX21vZHVsZV9vdmVycmlkZXNfcmVnaXN0ZXJlZF9wdWJsaWNfbWV0aG9kX2FzX3Byb3RlY3RlZAorICAgIHN0cmFpbmVyID0gQ29udGV4dC5uZXcuc3RyYWluZXIKKworICAgIGVycm9yID0gYXNzZXJ0X3JhaXNlcyhMaXF1aWQ6Ok1ldGhvZE92ZXJyaWRlRXJyb3IpIGRvCisgICAgICBzdHJhaW5lci5jbGFzcy5hZGRfZmlsdGVyKFByb3RlY3RlZE1ldGhvZE92ZXJyaWRlRmlsdGVyKQorICAgIGVuZAorICAgIGFzc2VydF9lcXVhbCAnTGlxdWlkIGVycm9yOiBGaWx0ZXIgb3ZlcnJpZGVzIHJlZ2lzdGVyZWQgcHVibGljIG1ldGhvZHMgYXMgbm9uIHB1YmxpYzogcHVibGljX2ZpbHRlcicsIGVycm9yLm1lc3NhZ2UKKyAgZW5kCisKKyAgbW9kdWxlIFB1YmxpY01ldGhvZE92ZXJyaWRlRmlsdGVyCisgICAgZGVmIHB1YmxpY19maWx0ZXIKKyAgICAgICJwdWJsaWMiCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2FkZF9maWx0ZXJfZG9lc19ub3RfcmFpc2Vfd2hlbl9tb2R1bGVfb3ZlcnJpZGVzX3ByZXZpb3VzbHlfcmVnaXN0ZXJlZF9tZXRob2QKKyAgICBzdHJhaW5lciA9IENvbnRleHQubmV3LnN0cmFpbmVyCisgICAgc3RyYWluZXIuY2xhc3MuYWRkX2ZpbHRlcihQdWJsaWNNZXRob2RPdmVycmlkZUZpbHRlcikKKyAgICBhc3NlcnQgc3RyYWluZXIuY2xhc3MuZmlsdGVyX21ldGhvZHMuaW5jbHVkZT8oJ3B1YmxpY19maWx0ZXInKQorICBlbmQKKworICBtb2R1bGUgTGF0ZUFkZGVkRmlsdGVyCisgICAgZGVmIGxhdGVfYWRkZWRfZmlsdGVyKGlucHV0KQorICAgICAgImZpbHRlcmVkIgorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9nbG9iYWxfZmlsdGVyX2NsZWFyc19jYWNoZQorICAgIGFzc2VydF9lcXVhbCAnaW5wdXQnLCBTdHJhaW5lci5jcmVhdGUobmlsKS5pbnZva2UoJ2xhdGVfYWRkZWRfZmlsdGVyJywgJ2lucHV0JykKKyAgICBTdHJhaW5lci5nbG9iYWxfZmlsdGVyKExhdGVBZGRlZEZpbHRlcikKKyAgICBhc3NlcnRfZXF1YWwgJ2ZpbHRlcmVkJywgU3RyYWluZXIuY3JlYXRlKG5pbCkuaW52b2tlKCdsYXRlX2FkZGVkX2ZpbHRlcicsICdpbnB1dCcpCisgIGVuZAorZW5kICMgU3RyYWluZXJUZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3RhZ191bml0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3RhZ191bml0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiOTAxYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvdGFnX3VuaXRfdGVzdC5yYgpAQCAtMCwwICsxLDIxIEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgVGFnVW5pdFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiB0ZXN0X3RhZworICAgIHRhZyA9IFRhZy5wYXJzZSgndGFnJywgIiIsIFRva2VuaXplci5uZXcoIiIpLCBQYXJzZUNvbnRleHQubmV3KQorICAgIGFzc2VydF9lcXVhbCAnbGlxdWlkOjp0YWcnLCB0YWcubmFtZQorICAgIGFzc2VydF9lcXVhbCAnJywgdGFnLnJlbmRlcihDb250ZXh0Lm5ldykKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmV0dXJuX3Jhd190ZXh0X29mX3RhZworICAgIHRhZyA9IFRhZy5wYXJzZSgibG9uZ190YWciLCAicGFyYW0xLCBwYXJhbTIsIHBhcmFtMyIsIFRva2VuaXplci5uZXcoIiIpLCBQYXJzZUNvbnRleHQubmV3KQorICAgIGFzc2VydF9lcXVhbCgibG9uZ190YWcgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMyIsIHRhZy5yYXcpCisgIGVuZAorCisgIGRlZiB0ZXN0X3RhZ19uYW1lX3Nob3VsZF9yZXR1cm5fbmFtZV9vZl90aGVfdGFnCisgICAgdGFnID0gVGFnLnBhcnNlKCJzb21lX3RhZyIsICIiLCBUb2tlbml6ZXIubmV3KCIiKSwgUGFyc2VDb250ZXh0Lm5ldykKKyAgICBhc3NlcnRfZXF1YWwgJ3NvbWVfdGFnJywgdGFnLnRhZ19uYW1lCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3RhZ3MvY2FzZV90YWdfdW5pdF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC90YWdzL2Nhc2VfdGFnX3VuaXRfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTEwMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC90YWdzL2Nhc2VfdGFnX3VuaXRfdGVzdC5yYgpAQCAtMCwwICsxLDEwIEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgQ2FzZVRhZ1VuaXRUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9jYXNlX25vZGVsaXN0CisgICAgdGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7JSBjYXNlIHZhciAlfXslIHdoZW4gdHJ1ZSAlfVdIRU57JSBlbHNlICV9RUxTRXslIGVuZGNhc2UgJX0nKQorICAgIGFzc2VydF9lcXVhbCBbJ1dIRU4nLCAnRUxTRSddLCB0ZW1wbGF0ZS5yb290Lm5vZGVsaXN0WzBdLm5vZGVsaXN0Lm1hcCgmOm5vZGVsaXN0KS5mbGF0dGVuCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3RhZ3MvZm9yX3RhZ191bml0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3RhZ3MvZm9yX3RhZ191bml0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmYzUyMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvdGFncy9mb3JfdGFnX3VuaXRfdGVzdC5yYgpAQCAtMCwwICsxLDEzIEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgRm9yVGFnVW5pdFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBkZWYgdGVzdF9mb3Jfbm9kZWxpc3QKKyAgICB0ZW1wbGF0ZSA9IExpcXVpZDo6VGVtcGxhdGUucGFyc2UoJ3slIGZvciBpdGVtIGluIGl0ZW1zICV9Rk9SeyUgZW5kZm9yICV9JykKKyAgICBhc3NlcnRfZXF1YWwgWydGT1InXSwgdGVtcGxhdGUucm9vdC5ub2RlbGlzdFswXS5ub2RlbGlzdC5tYXAoJjpub2RlbGlzdCkuZmxhdHRlbgorICBlbmQKKworICBkZWYgdGVzdF9mb3JfZWxzZV9ub2RlbGlzdAorICAgIHRlbXBsYXRlID0gTGlxdWlkOjpUZW1wbGF0ZS5wYXJzZSgneyUgZm9yIGl0ZW0gaW4gaXRlbXMgJX1GT1J7JSBlbHNlICV9RUxTRXslIGVuZGZvciAlfScpCisgICAgYXNzZXJ0X2VxdWFsIFsnRk9SJywgJ0VMU0UnXSwgdGVtcGxhdGUucm9vdC5ub2RlbGlzdFswXS5ub2RlbGlzdC5tYXAoJjpub2RlbGlzdCkuZmxhdHRlbgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC90YWdzL2lmX3RhZ191bml0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3RhZ3MvaWZfdGFnX3VuaXRfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNmYzQwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC90YWdzL2lmX3RhZ191bml0X3Rlc3QucmIKQEAgLTAsMCArMSw4IEBACityZXF1aXJlICd0ZXN0X2hlbHBlcicKKworY2xhc3MgSWZUYWdVbml0VGVzdCA8IE1pbml0ZXN0OjpUZXN0CisgIGRlZiB0ZXN0X2lmX25vZGVsaXN0CisgICAgdGVtcGxhdGUgPSBMaXF1aWQ6OlRlbXBsYXRlLnBhcnNlKCd7JSBpZiB0cnVlICV9SUZ7JSBlbHNlICV9RUxTRXslIGVuZGlmICV9JykKKyAgICBhc3NlcnRfZXF1YWwgWydJRicsICdFTFNFJ10sIHRlbXBsYXRlLnJvb3Qubm9kZWxpc3RbMF0ubm9kZWxpc3QubWFwKCY6bm9kZWxpc3QpLmZsYXR0ZW4KKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvdGVtcGxhdGVfdW5pdF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC90ZW1wbGF0ZV91bml0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyOGJlNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvdGVtcGxhdGVfdW5pdF90ZXN0LnJiCkBAIC0wLDAgKzEsNzggQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBUZW1wbGF0ZVVuaXRUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBMaXF1aWQKKworICBkZWYgdGVzdF9zZXRzX2RlZmF1bHRfbG9jYWxpemF0aW9uX2luX2RvY3VtZW50CisgICAgdCA9IFRlbXBsYXRlLm5ldworICAgIHQucGFyc2UoJ3slY29tbWVudCV9eyVlbmRjb21tZW50JX0nKQorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBJMThuLCB0LnJvb3Qubm9kZWxpc3RbMF0ub3B0aW9uc1s6bG9jYWxlXQorICBlbmQKKworICBkZWYgdGVzdF9zZXRzX2RlZmF1bHRfbG9jYWxpemF0aW9uX2luX2NvbnRleHRfd2l0aF9xdWlja19pbml0aWFsaXphdGlvbgorICAgIHQgPSBUZW1wbGF0ZS5uZXcKKyAgICB0LnBhcnNlKCd7JWNvbW1lbnQlfXslZW5kY29tbWVudCV9JywgbG9jYWxlOiBJMThuLm5ldyhmaXh0dXJlKCJlbl9sb2NhbGUueW1sIikpKQorCisgICAgbG9jYWxlID0gdC5yb290Lm5vZGVsaXN0WzBdLm9wdGlvbnNbOmxvY2FsZV0KKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgSTE4biwgbG9jYWxlCisgICAgYXNzZXJ0X2VxdWFsIGZpeHR1cmUoImVuX2xvY2FsZS55bWwiKSwgbG9jYWxlLnBhdGgKKyAgZW5kCisKKyAgZGVmIHRlc3Rfd2l0aF9jYWNoZV9jbGFzc2VzX3RhZ3NfcmV0dXJuc190aGVfc2FtZV9jbGFzcworICAgIG9yaWdpbmFsX2NhY2hlX3NldHRpbmcgPSBMaXF1aWQuY2FjaGVfY2xhc3NlcworICAgIExpcXVpZC5jYWNoZV9jbGFzc2VzID0gdHJ1ZQorCisgICAgb3JpZ2luYWxfa2xhc3MgPSBDbGFzcy5uZXcKKyAgICBPYmplY3Quc2VuZCg6Y29uc3Rfc2V0LCA6Q3VzdG9tVGFnLCBvcmlnaW5hbF9rbGFzcykKKyAgICBUZW1wbGF0ZS5yZWdpc3Rlcl90YWcoJ2N1c3RvbScsIEN1c3RvbVRhZykKKworICAgIE9iamVjdC5zZW5kKDpyZW1vdmVfY29uc3QsIDpDdXN0b21UYWcpCisKKyAgICBuZXdfa2xhc3MgPSBDbGFzcy5uZXcKKyAgICBPYmplY3Quc2VuZCg6Y29uc3Rfc2V0LCA6Q3VzdG9tVGFnLCBuZXdfa2xhc3MpCisKKyAgICBhc3NlcnQgVGVtcGxhdGUudGFnc1snY3VzdG9tJ10uZXF1YWw/KG9yaWdpbmFsX2tsYXNzKQorICBlbnN1cmUKKyAgICBPYmplY3Quc2VuZCg6cmVtb3ZlX2NvbnN0LCA6Q3VzdG9tVGFnKQorICAgIFRlbXBsYXRlLnRhZ3MuZGVsZXRlKCdjdXN0b20nKQorICAgIExpcXVpZC5jYWNoZV9jbGFzc2VzID0gb3JpZ2luYWxfY2FjaGVfc2V0dGluZworICBlbmQKKworICBkZWYgdGVzdF93aXRob3V0X2NhY2hlX2NsYXNzZXNfdGFnc19yZWxvYWRzX3RoZV9jbGFzcworICAgIG9yaWdpbmFsX2NhY2hlX3NldHRpbmcgPSBMaXF1aWQuY2FjaGVfY2xhc3NlcworICAgIExpcXVpZC5jYWNoZV9jbGFzc2VzID0gZmFsc2UKKworICAgIG9yaWdpbmFsX2tsYXNzID0gQ2xhc3MubmV3CisgICAgT2JqZWN0LnNlbmQoOmNvbnN0X3NldCwgOkN1c3RvbVRhZywgb3JpZ2luYWxfa2xhc3MpCisgICAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdjdXN0b20nLCBDdXN0b21UYWcpCisKKyAgICBPYmplY3Quc2VuZCg6cmVtb3ZlX2NvbnN0LCA6Q3VzdG9tVGFnKQorCisgICAgbmV3X2tsYXNzID0gQ2xhc3MubmV3CisgICAgT2JqZWN0LnNlbmQoOmNvbnN0X3NldCwgOkN1c3RvbVRhZywgbmV3X2tsYXNzKQorCisgICAgYXNzZXJ0IFRlbXBsYXRlLnRhZ3NbJ2N1c3RvbSddLmVxdWFsPyhuZXdfa2xhc3MpCisgIGVuc3VyZQorICAgIE9iamVjdC5zZW5kKDpyZW1vdmVfY29uc3QsIDpDdXN0b21UYWcpCisgICAgVGVtcGxhdGUudGFncy5kZWxldGUoJ2N1c3RvbScpCisgICAgTGlxdWlkLmNhY2hlX2NsYXNzZXMgPSBvcmlnaW5hbF9jYWNoZV9zZXR0aW5nCisgIGVuZAorCisgIGNsYXNzIEZha2VUYWc7IGVuZAorCisgIGRlZiB0ZXN0X3RhZ3NfZGVsZXRlCisgICAgVGVtcGxhdGUucmVnaXN0ZXJfdGFnKCdmYWtlJywgRmFrZVRhZykKKyAgICBhc3NlcnRfZXF1YWwgRmFrZVRhZywgVGVtcGxhdGUudGFnc1snZmFrZSddCisKKyAgICBUZW1wbGF0ZS50YWdzLmRlbGV0ZSgnZmFrZScpCisgICAgYXNzZXJ0X25pbCBUZW1wbGF0ZS50YWdzWydmYWtlJ10KKyAgZW5kCisKKyAgZGVmIHRlc3RfdGFnc19jYW5fYmVfbG9vcGVkX292ZXIKKyAgICBUZW1wbGF0ZS5yZWdpc3Rlcl90YWcoJ2Zha2UnLCBGYWtlVGFnKQorICAgIHJlc3VsdCA9IFRlbXBsYXRlLnRhZ3MubWFwIHsgfG5hbWUsIGtsYXNzfCBbbmFtZSwga2xhc3NdIH0KKyAgICBhc3NlcnQgcmVzdWx0LmluY2x1ZGU/KFsiZmFrZSIsICJUZW1wbGF0ZVVuaXRUZXN0OjpGYWtlVGFnIl0pCisgIGVuc3VyZQorICAgIFRlbXBsYXRlLnRhZ3MuZGVsZXRlKCdmYWtlJykKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvdG9rZW5pemVyX3VuaXRfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvdG9rZW5pemVyX3VuaXRfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTg0YzFmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlxdWlkLTQuMC4wL3Rlc3QvdW5pdC90b2tlbml6ZXJfdW5pdF90ZXN0LnJiCkBAIC0wLDAgKzEsNTUgQEAKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworCitjbGFzcyBUb2tlbml6ZXJUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKyAgZGVmIHRlc3RfdG9rZW5pemVfc3RyaW5ncworICAgIGFzc2VydF9lcXVhbCBbJyAnXSwgdG9rZW5pemUoJyAnKQorICAgIGFzc2VydF9lcXVhbCBbJ2hlbGxvIHdvcmxkJ10sIHRva2VuaXplKCdoZWxsbyB3b3JsZCcpCisgIGVuZAorCisgIGRlZiB0ZXN0X3Rva2VuaXplX3ZhcmlhYmxlcworICAgIGFzc2VydF9lcXVhbCBbJ3t7ZnVua319J10sIHRva2VuaXplKCd7e2Z1bmt9fScpCisgICAgYXNzZXJ0X2VxdWFsIFsnICcsICd7e2Z1bmt9fScsICcgJ10sIHRva2VuaXplKCcge3tmdW5rfX0gJykKKyAgICBhc3NlcnRfZXF1YWwgWycgJywgJ3t7ZnVua319JywgJyAnLCAne3tzb319JywgJyAnLCAne3ticm90aGVyfX0nLCAnICddLCB0b2tlbml6ZSgnIHt7ZnVua319IHt7c299fSB7e2Jyb3RoZXJ9fSAnKQorICAgIGFzc2VydF9lcXVhbCBbJyAnLCAne3sgIGZ1bmsgIH19JywgJyAnXSwgdG9rZW5pemUoJyB7eyAgZnVuayAgfX0gJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfdG9rZW5pemVfYmxvY2tzCisgICAgYXNzZXJ0X2VxdWFsIFsneyVjb21tZW50JX0nXSwgdG9rZW5pemUoJ3slY29tbWVudCV9JykKKyAgICBhc3NlcnRfZXF1YWwgWycgJywgJ3slY29tbWVudCV9JywgJyAnXSwgdG9rZW5pemUoJyB7JWNvbW1lbnQlfSAnKQorCisgICAgYXNzZXJ0X2VxdWFsIFsnICcsICd7JWNvbW1lbnQlfScsICcgJywgJ3slZW5kY29tbWVudCV9JywgJyAnXSwgdG9rZW5pemUoJyB7JWNvbW1lbnQlfSB7JWVuZGNvbW1lbnQlfSAnKQorICAgIGFzc2VydF9lcXVhbCBbJyAgJywgJ3slIGNvbW1lbnQgJX0nLCAnICcsICd7JSBlbmRjb21tZW50ICV9JywgJyAnXSwgdG9rZW5pemUoIiAgeyUgY29tbWVudCAlfSB7JSBlbmRjb21tZW50ICV9ICIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NhbGN1bGF0ZV9saW5lX251bWJlcnNfcGVyX3Rva2VuX3dpdGhfcHJvZmlsaW5nCisgICAgYXNzZXJ0X2VxdWFsIFsxXSwgICAgICAgdG9rZW5pemVfbGluZV9udW1iZXJzKCJ7e2Z1bmt9fSIpCisgICAgYXNzZXJ0X2VxdWFsIFsxLCAxLCAxXSwgdG9rZW5pemVfbGluZV9udW1iZXJzKCIge3tmdW5rfX0gIikKKyAgICBhc3NlcnRfZXF1YWwgWzEsIDIsIDJdLCB0b2tlbml6ZV9saW5lX251bWJlcnMoIlxue3tmdW5rfX1cbiIpCisgICAgYXNzZXJ0X2VxdWFsIFsxLCAxLCAzXSwgdG9rZW5pemVfbGluZV9udW1iZXJzKCIge3tcbiBmdW5rIFxufX0gIikKKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgIGRlZiB0b2tlbml6ZShzb3VyY2UpCisgICAgdG9rZW5pemVyID0gTGlxdWlkOjpUb2tlbml6ZXIubmV3KHNvdXJjZSkKKyAgICB0b2tlbnMgPSBbXQorICAgIHdoaWxlIHQgPSB0b2tlbml6ZXIuc2hpZnQKKyAgICAgIHRva2VucyA8PCB0CisgICAgZW5kCisgICAgdG9rZW5zCisgIGVuZAorCisgIGRlZiB0b2tlbml6ZV9saW5lX251bWJlcnMoc291cmNlKQorICAgIHRva2VuaXplciA9IExpcXVpZDo6VG9rZW5pemVyLm5ldyhzb3VyY2UsIHRydWUpCisgICAgbGluZV9udW1iZXJzID0gW10KKyAgICBsb29wIGRvCisgICAgICBsaW5lX251bWJlciA9IHRva2VuaXplci5saW5lX251bWJlcgorICAgICAgaWYgdG9rZW5pemVyLnNoaWZ0CisgICAgICAgIGxpbmVfbnVtYmVycyA8PCBsaW5lX251bWJlcgorICAgICAgZWxzZQorICAgICAgICBicmVhaworICAgICAgZW5kCisgICAgZW5kCisgICAgbGluZV9udW1iZXJzCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3ZhcmlhYmxlX3VuaXRfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpcXVpZC00LjAuMC90ZXN0L3VuaXQvdmFyaWFibGVfdW5pdF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMjFhY2UKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXF1aWQtNC4wLjAvdGVzdC91bml0L3ZhcmlhYmxlX3VuaXRfdGVzdC5yYgpAQCAtMCwwICsxLDE2MiBAQAorcmVxdWlyZSAndGVzdF9oZWxwZXInCisKK2NsYXNzIFZhcmlhYmxlVW5pdFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorICBpbmNsdWRlIExpcXVpZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCdoZWxsbycpCisgICAgYXNzZXJ0X2VxdWFsIFZhcmlhYmxlTG9va3VwLm5ldygnaGVsbG8nKSwgdmFyLm5hbWUKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmlsdGVycworICAgIHZhciA9IGNyZWF0ZV92YXJpYWJsZSgnaGVsbG8gfCB0ZXh0aWxlemUnKQorICAgIGFzc2VydF9lcXVhbCBWYXJpYWJsZUxvb2t1cC5uZXcoJ2hlbGxvJyksIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ3RleHRpbGV6ZScsIFtdXV0sIHZhci5maWx0ZXJzCisKKyAgICB2YXIgPSBjcmVhdGVfdmFyaWFibGUoJ2hlbGxvIHwgdGV4dGlsZXplIHwgcGFyYWdyYXBoJykKKyAgICBhc3NlcnRfZXF1YWwgVmFyaWFibGVMb29rdXAubmV3KCdoZWxsbycpLCB2YXIubmFtZQorICAgIGFzc2VydF9lcXVhbCBbWyd0ZXh0aWxlemUnLCBbXV0sIFsncGFyYWdyYXBoJywgW11dXSwgdmFyLmZpbHRlcnMKKworICAgIHZhciA9IGNyZWF0ZV92YXJpYWJsZSglKCBoZWxsbyB8IHN0cmZ0aW1lOiAnJVknKSkKKyAgICBhc3NlcnRfZXF1YWwgVmFyaWFibGVMb29rdXAubmV3KCdoZWxsbycpLCB2YXIubmFtZQorICAgIGFzc2VydF9lcXVhbCBbWydzdHJmdGltZScsIFsnJVknXV1dLCB2YXIuZmlsdGVycworCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCUoICd0eXBvJyB8IGxpbmtfdG86ICdUeXBvJywgdHJ1ZSApKQorICAgIGFzc2VydF9lcXVhbCAndHlwbycsIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ2xpbmtfdG8nLCBbJ1R5cG8nLCB0cnVlXV1dLCB2YXIuZmlsdGVycworCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCUoICd0eXBvJyB8IGxpbmtfdG86ICdUeXBvJywgZmFsc2UgKSkKKyAgICBhc3NlcnRfZXF1YWwgJ3R5cG8nLCB2YXIubmFtZQorICAgIGFzc2VydF9lcXVhbCBbWydsaW5rX3RvJywgWydUeXBvJywgZmFsc2VdXV0sIHZhci5maWx0ZXJzCisKKyAgICB2YXIgPSBjcmVhdGVfdmFyaWFibGUoJSggJ2ZvbycgfCByZXBlYXQ6IDMgKSkKKyAgICBhc3NlcnRfZXF1YWwgJ2ZvbycsIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ3JlcGVhdCcsIFszXV1dLCB2YXIuZmlsdGVycworCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCUoICdmb28nIHwgcmVwZWF0OiAzLCAzICkpCisgICAgYXNzZXJ0X2VxdWFsICdmb28nLCB2YXIubmFtZQorICAgIGFzc2VydF9lcXVhbCBbWydyZXBlYXQnLCBbMywgM11dXSwgdmFyLmZpbHRlcnMKKworICAgIHZhciA9IGNyZWF0ZV92YXJpYWJsZSglKCAnZm9vJyB8IHJlcGVhdDogMywgMywgMyApKQorICAgIGFzc2VydF9lcXVhbCAnZm9vJywgdmFyLm5hbWUKKyAgICBhc3NlcnRfZXF1YWwgW1sncmVwZWF0JywgWzMsIDMsIDNdXV0sIHZhci5maWx0ZXJzCisKKyAgICB2YXIgPSBjcmVhdGVfdmFyaWFibGUoJSggaGVsbG8gfCBzdHJmdGltZTogJyVZLCBva2F5PycpKQorICAgIGFzc2VydF9lcXVhbCBWYXJpYWJsZUxvb2t1cC5uZXcoJ2hlbGxvJyksIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ3N0cmZ0aW1lJywgWyclWSwgb2theT8nXV1dLCB2YXIuZmlsdGVycworCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCUoIGhlbGxvIHwgdGhpbmdzOiAiJVksIG9rYXk/IiwgJ3RoZSBvdGhlciBvbmUnKSkKKyAgICBhc3NlcnRfZXF1YWwgVmFyaWFibGVMb29rdXAubmV3KCdoZWxsbycpLCB2YXIubmFtZQorICAgIGFzc2VydF9lcXVhbCBbWyd0aGluZ3MnLCBbJyVZLCBva2F5PycsICd0aGUgb3RoZXIgb25lJ11dXSwgdmFyLmZpbHRlcnMKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmlsdGVyX3dpdGhfZGF0ZV9wYXJhbWV0ZXIKKyAgICB2YXIgPSBjcmVhdGVfdmFyaWFibGUoJSggJzIwMDYtMDYtMDYnIHwgZGF0ZTogIiVtLyVkLyVZIikpCisgICAgYXNzZXJ0X2VxdWFsICcyMDA2LTA2LTA2JywgdmFyLm5hbWUKKyAgICBhc3NlcnRfZXF1YWwgW1snZGF0ZScsIFsnJW0vJWQvJVknXV1dLCB2YXIuZmlsdGVycworICBlbmQKKworICBkZWYgdGVzdF9maWx0ZXJzX3dpdGhvdXRfd2hpdGVzcGFjZQorICAgIHZhciA9IGNyZWF0ZV92YXJpYWJsZSgnaGVsbG8gfCB0ZXh0aWxlemUgfCBwYXJhZ3JhcGgnKQorICAgIGFzc2VydF9lcXVhbCBWYXJpYWJsZUxvb2t1cC5uZXcoJ2hlbGxvJyksIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ3RleHRpbGV6ZScsIFtdXSwgWydwYXJhZ3JhcGgnLCBbXV1dLCB2YXIuZmlsdGVycworCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCdoZWxsb3x0ZXh0aWxlemV8cGFyYWdyYXBoJykKKyAgICBhc3NlcnRfZXF1YWwgVmFyaWFibGVMb29rdXAubmV3KCdoZWxsbycpLCB2YXIubmFtZQorICAgIGFzc2VydF9lcXVhbCBbWyd0ZXh0aWxlemUnLCBbXV0sIFsncGFyYWdyYXBoJywgW11dXSwgdmFyLmZpbHRlcnMKKworICAgIHZhciA9IGNyZWF0ZV92YXJpYWJsZSgiaGVsbG98cmVwbGFjZTonZm9vJywnYmFyJ3x0ZXh0aWxlemUiKQorICAgIGFzc2VydF9lcXVhbCBWYXJpYWJsZUxvb2t1cC5uZXcoJ2hlbGxvJyksIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ3JlcGxhY2UnLCBbJ2ZvbycsICdiYXInXV0sIFsndGV4dGlsZXplJywgW11dXSwgdmFyLmZpbHRlcnMKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3ltYm9sCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCJodHRwOi8vZGlzbmV5LmNvbS9sb2dvLmdpZiB8IGltYWdlOiAnbWVkJyAiLCBlcnJvcl9tb2RlOiA6bGF4KQorICAgIGFzc2VydF9lcXVhbCBWYXJpYWJsZUxvb2t1cC5uZXcoJ2h0dHA6Ly9kaXNuZXkuY29tL2xvZ28uZ2lmJyksIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ2ltYWdlJywgWydtZWQnXV1dLCB2YXIuZmlsdGVycworICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmdfdG9fZmlsdGVyCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCInaHR0cDovL2Rpc25leS5jb20vbG9nby5naWYnIHwgaW1hZ2U6ICdtZWQnICIpCisgICAgYXNzZXJ0X2VxdWFsICdodHRwOi8vZGlzbmV5LmNvbS9sb2dvLmdpZicsIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ2ltYWdlJywgWydtZWQnXV1dLCB2YXIuZmlsdGVycworICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmdfc2luZ2xlX3F1b3RlZAorICAgIHZhciA9IGNyZWF0ZV92YXJpYWJsZSglKCAiaGVsbG8iICkpCisgICAgYXNzZXJ0X2VxdWFsICdoZWxsbycsIHZhci5uYW1lCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19kb3VibGVfcXVvdGVkCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCUoICdoZWxsbycgKSkKKyAgICBhc3NlcnRfZXF1YWwgJ2hlbGxvJywgdmFyLm5hbWUKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZWdlcgorICAgIHZhciA9IGNyZWF0ZV92YXJpYWJsZSglKCAxMDAwICkpCisgICAgYXNzZXJ0X2VxdWFsIDEwMDAsIHZhci5uYW1lCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zsb2F0CisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCUoIDEwMDAuMDEgKSkKKyAgICBhc3NlcnRfZXF1YWwgMTAwMC4wMSwgdmFyLm5hbWUKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGFzaGVzCisgICAgYXNzZXJ0X2VxdWFsIFZhcmlhYmxlTG9va3VwLm5ldygnZm9vLWJhcicpLCBjcmVhdGVfdmFyaWFibGUoJ2Zvby1iYXInKS5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFZhcmlhYmxlTG9va3VwLm5ldygnZm9vLWJhci0yJyksIGNyZWF0ZV92YXJpYWJsZSgnZm9vLWJhci0yJykubmFtZQorCisgICAgd2l0aF9lcnJvcl9tb2RlIDpzdHJpY3QgZG8KKyAgICAgIGFzc2VydF9yYWlzZXMoTGlxdWlkOjpTeW50YXhFcnJvcikgeyBjcmVhdGVfdmFyaWFibGUoJ2ZvbyAtIGJhcicpIH0KKyAgICAgIGFzc2VydF9yYWlzZXMoTGlxdWlkOjpTeW50YXhFcnJvcikgeyBjcmVhdGVfdmFyaWFibGUoJy1mb28nKSB9CisgICAgICBhc3NlcnRfcmFpc2VzKExpcXVpZDo6U3ludGF4RXJyb3IpIHsgY3JlYXRlX3ZhcmlhYmxlKCcyZm9vJykgfQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmdfd2l0aF9zcGVjaWFsX2NoYXJzCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCUoICdoZWxsbyEgJCFALjsiZGRhc2QiICcgKSkKKyAgICBhc3NlcnRfZXF1YWwgJ2hlbGxvISAkIUAuOyJkZGFzZCIgJywgdmFyLm5hbWUKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyaW5nX2RvdAorICAgIHZhciA9IGNyZWF0ZV92YXJpYWJsZSglKCB0ZXN0LnRlc3QgKSkKKyAgICBhc3NlcnRfZXF1YWwgVmFyaWFibGVMb29rdXAubmV3KCd0ZXN0LnRlc3QnKSwgdmFyLm5hbWUKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmlsdGVyX3dpdGhfa2V5d29yZF9hcmd1bWVudHMKKyAgICB2YXIgPSBjcmVhdGVfdmFyaWFibGUoJSggaGVsbG8gfCB0aGluZ3M6IGdyZWV0aW5nOiAid29ybGQiLCBmYXJld2VsbDogJ2dvb2RieWUnKSkKKyAgICBhc3NlcnRfZXF1YWwgVmFyaWFibGVMb29rdXAubmV3KCdoZWxsbycpLCB2YXIubmFtZQorICAgIGFzc2VydF9lcXVhbCBbWyd0aGluZ3MnLCBbXSwgeyAnZ3JlZXRpbmcnID0+ICd3b3JsZCcsICdmYXJld2VsbCcgPT4gJ2dvb2RieWUnIH1dXSwgdmFyLmZpbHRlcnMKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGF4X2ZpbHRlcl9hcmd1bWVudF9wYXJzaW5nCisgICAgdmFyID0gY3JlYXRlX3ZhcmlhYmxlKCUoIG51bWJlcl9vZl9jb21tZW50cyB8IHBsdXJhbGl6ZTogJ2NvbW1lbnQnOiAnY29tbWVudHMnICksIGVycm9yX21vZGU6IDpsYXgpCisgICAgYXNzZXJ0X2VxdWFsIFZhcmlhYmxlTG9va3VwLm5ldygnbnVtYmVyX29mX2NvbW1lbnRzJyksIHZhci5uYW1lCisgICAgYXNzZXJ0X2VxdWFsIFtbJ3BsdXJhbGl6ZScsIFsnY29tbWVudCcsICdjb21tZW50cyddXV0sIHZhci5maWx0ZXJzCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmljdF9maWx0ZXJfYXJndW1lbnRfcGFyc2luZworICAgIHdpdGhfZXJyb3JfbW9kZSg6c3RyaWN0KSBkbworICAgICAgYXNzZXJ0X3JhaXNlcyhTeW50YXhFcnJvcikgZG8KKyAgICAgICAgY3JlYXRlX3ZhcmlhYmxlKCUoIG51bWJlcl9vZl9jb21tZW50cyB8IHBsdXJhbGl6ZTogJ2NvbW1lbnQnOiAnY29tbWVudHMnICkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfb3V0cHV0X3Jhd19zb3VyY2Vfb2ZfdmFyaWFibGUKKyAgICB2YXIgPSBjcmVhdGVfdmFyaWFibGUoJSggbmFtZV9vZl92YXJpYWJsZSB8IHVwY2FzZSApKQorICAgIGFzc2VydF9lcXVhbCAiIG5hbWVfb2ZfdmFyaWFibGUgfCB1cGNhc2UgIiwgdmFyLnJhdworICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZV9sb29rdXBfaW50ZXJmYWNlCisgICAgbG9va3VwID0gVmFyaWFibGVMb29rdXAubmV3KCdhLmIuYycpCisgICAgYXNzZXJ0X2VxdWFsICdhJywgbG9va3VwLm5hbWUKKyAgICBhc3NlcnRfZXF1YWwgWydiJywgJ2MnXSwgbG9va3VwLmxvb2t1cHMKKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgIGRlZiBjcmVhdGVfdmFyaWFibGUobWFya3VwLCBvcHRpb25zID0ge30pCisgICAgVmFyaWFibGUubmV3KG1hcmt1cCwgUGFyc2VDb250ZXh0Lm5ldyhvcHRpb25zKSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9DSEFOR0VMT0cubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvQ0hBTkdFTE9HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMmFkYmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvQ0hBTkdFTE9HLm1kCkBAIC0wLDAgKzEgQEAKKyMgTW92ZWQgdG8gW0dpdEh1YiByZWxlYXNlc10oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9yZWxlYXNlcykgcGFnZS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9DT05UUklCVVRJTkcubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNWQ2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvQ09OVFJJQlVUSU5HLm1kCkBAIC0wLDAgKzEsMzggQEAKK0NvbnRyaWJ1dGUgdG8gTGlzdGVuCis9PT09PT09PT09PT09PT09PT09CisKK0ZpbGUgYW4gaXNzdWUKKy0tLS0tLS0tLS0tLS0KKworSWYgeW91IGhhdmVuJ3QgYWxyZWFkeSwgZmlyc3Qgc2VlIFtUUk9VQkxFU0hPT1RJTkddKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vd2lraS9Ucm91Ymxlc2hvb3RpbmcpIGZvciBrbm93biBpc3N1ZXMsIHNvbHV0aW9ucyBhbmQgd29ya2Fyb3VuZHMuCisKK1lvdSBjYW4gcmVwb3J0IGJ1Z3MgYW5kIGZlYXR1cmUgcmVxdWVzdHMgdG8gW0dpdEh1YiBJc3N1ZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vaXNzdWVzKS4KKworKipQbGVhc2UgZG9uJ3QgYXNrIHF1ZXN0aW9uIGluIHRoZSBpc3N1ZSB0cmFja2VyKiosIGluc3RlYWQgYXNrIHRoZW0gaW4gb3VyCitbR29vZ2xlIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvZ3VhcmQtZGV2KSBvciBvbiBgI2d1YXJkYCAoaXJjLmZyZWVub2RlLm5ldCkuCisKK1RyeSB0byBmaWd1cmUgb3V0IHdoZXJlIHRoZSBpc3N1ZSBiZWxvbmdzIHRvOiBJcyBpdCBhbiBpc3N1ZSB3aXRoIExpc3RlbiBpdHNlbGYgb3Igd2l0aCBHdWFyZD8KKworCisqKkl0J3MgbW9zdCBsaWtlbHkgdGhhdCB5b3VyIGJ1ZyBnZXRzIHJlc29sdmVkIGZhc3RlciBpZiB5b3UgcHJvdmlkZSBhcyBtdWNoIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlISoqCisKK1RoZSBNT1NUIHVzZWZ1bCBpbmZvcm1hdGlvbiBpcyBkZWJ1Z2dpbmcgb3V0cHV0IGZyb20gTGlzdGVuIChgTElTVEVOX0dFTV9ERUJVR0dJTkc9MWApIC0gc2VlIFtUUk9VQkxFU0hPT1RJTkddKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vd2lraS9Ucm91Ymxlc2hvb3RpbmcpIGZvciBkZXRhaWxzLgorCisKK0RldmVsb3BtZW50CistLS0tLS0tLS0tLQorCisqIERvY3VtZW50YXRpb24gaG9zdGVkIGF0IFtSdWJ5RG9jXShodHRwOi8vcnVieWRvYy5pbmZvL2dpdGh1Yi9ndWFyZC9saXN0ZW4vbWFzdGVyL2ZyYW1lcykuCisqIFNvdXJjZSBob3N0ZWQgYXQgW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3RlbikuCisKK1B1bGwgcmVxdWVzdHMgYXJlIHZlcnkgd2VsY29tZSEgUGxlYXNlIHRyeSB0byBmb2xsb3cgdGhlc2Ugc2ltcGxlIHJ1bGVzIGlmIGFwcGxpY2FibGU6CisKKyogUGxlYXNlIGNyZWF0ZSBhIHRvcGljIGJyYW5jaCBmb3IgZXZlcnkgc2VwYXJhdGUgY2hhbmdlIHlvdSBtYWtlLgorKiBNYWtlIHN1cmUgeW91ciBwYXRjaGVzIGFyZSB3ZWxsIHRlc3RlZC4gQWxsIHNwZWNzIHJ1biB3aXRoIGByYWtlIHNwZWNgIG11c3QgcGFzcy4KKyogVXBkYXRlIHRoZSBbWWFyZF0oaHR0cDovL3lhcmRvYy5vcmcvKSBkb2N1bWVudGF0aW9uLgorKiBVcGRhdGUgdGhlIFtSRUFETUVdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vYmxvYi9tYXN0ZXIvUkVBRE1FLm1kKS4KKyogVXBkYXRlIHRoZSBbQ0hBTkdFTE9HXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2Jsb2IvbWFzdGVyL0NIQU5HRUxPRy5tZCkgZm9yIG5vdGV3b3J0aHkgY2hhbmdlcy4KKyogUGxlYXNlICoqZG8gbm90IGNoYW5nZSoqIHRoZSB2ZXJzaW9uIG51bWJlci4KKworRm9yIHF1ZXN0aW9ucyBwbGVhc2Ugam9pbiB1cyBpbiBvdXIgW0dvb2dsZSBncm91cF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2d1YXJkLWRldikgb3Igb24KK2AjZ3VhcmRgIChpcmMuZnJlZW5vZGUubmV0KS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9MSUNFTlNFLnR4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY3MWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjIgQEAKK0NvcHlyaWdodCAoYykgMjAxMyBUaGliYXVkIEd1aWxsYXVtZS1HZW50aWwKKworTUlUIExpY2Vuc2UKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhNTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9SRUFETUUubWQKQEAgLTAsMCArMSwyOTMgQEAKKzpleGNsYW1hdGlvbjogTGlzdGVuIGlzIGN1cnJlbnRseSBhY2NlcHRpbmcgbW9yZSBtYWludGFpbmVycy4gUGxlYXNlIFtyZWFkIHRoaXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9ndWFyZC93aWtpL01haW50YWluZXJzKSBpZiB5b3UncmUgaW50ZXJlc3RlZCBpbiBqb2luaW5nIHRoZSB0ZWFtLgorCisjIExpc3RlbgorCitbIVtHZW0gVmVyc2lvbl0oaHR0cHM6Ly9iYWRnZS5mdXJ5LmlvL3JiL2xpc3Rlbi5wbmcpXShodHRwOi8vYmFkZ2UuZnVyeS5pby9yYi9saXN0ZW4pIFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2d1YXJkL2xpc3Rlbi5wbmcpXShodHRwczovL3RyYXZpcy1jaS5vcmcvZ3VhcmQvbGlzdGVuKSBbIVtEZXBlbmRlbmN5IFN0YXR1c10oaHR0cHM6Ly9nZW1uYXNpdW0uY29tL2d1YXJkL2xpc3Rlbi5wbmcpXShodHRwczovL2dlbW5hc2l1bS5jb20vZ3VhcmQvbGlzdGVuKSBbIVtDb2RlIENsaW1hdGVdKGh0dHBzOi8vY29kZWNsaW1hdGUuY29tL2dpdGh1Yi9ndWFyZC9saXN0ZW4ucG5nKV0oaHR0cHM6Ly9jb2RlY2xpbWF0ZS5jb20vZ2l0aHViL2d1YXJkL2xpc3RlbikgWyFbQ292ZXJhZ2UgU3RhdHVzXShodHRwczovL2NvdmVyYWxscy5pby9yZXBvcy9ndWFyZC9saXN0ZW4vYmFkZ2UucG5nP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL2NvdmVyYWxscy5pby9yL2d1YXJkL2xpc3RlbikKKworVGhlIExpc3RlbiBnZW0gbGlzdGVucyB0byBmaWxlIG1vZGlmaWNhdGlvbnMgYW5kIG5vdGlmaWVzIHlvdSBhYm91dCB0aGUgY2hhbmdlcy4KKworIyMgRmVhdHVyZXMKKworKiBPUy1vcHRpbWl6ZWQgYWRhcHRlcnMgb24gTVJJIGZvciBNYWMgT1MgWCAxMC42KywgTGludXgsIFwqQlNEIGFuZCBXaW5kb3dzLCBbbW9yZSBpbmZvXSgjbGlzdGVuLWFkYXB0ZXJzKSBiZWxvdy4KKyogRGV0ZWN0cyBmaWxlIG1vZGlmaWNhdGlvbiwgYWRkaXRpb24gYW5kIHJlbW92YWwuCisqIFlvdSBjYW4gd2F0Y2ggbXVsdGlwbGUgZGlyZWN0b3JpZXMuCisqIFJlZ2V4cC1wYXR0ZXJucyBmb3IgaWdub3JpbmcgcGF0aHMgZm9yIG1vcmUgYWNjdXJhY3kgYW5kIHNwZWVkCisqIEluY3JlYXNlZCBjaGFuZ2UgZGV0ZWN0aW9uIGFjY3VyYWN5IG9uIE9TIFggSEZTIGFuZCBWRkFUIHZvbHVtZXMuCisqIFRlc3RlZCBvbiBNUkkgUnVieSBlbnZpcm9ubWVudHMgKDIuMCsgb25seSkgdmlhIFtUcmF2aXMgQ0ldKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9ndWFyZC9saXN0ZW4pLAorCisjIyBJc3N1ZXMgLyBsaW1pdGF0aW9ucworCisqIExpbWl0ZWQgc3VwcG9ydCBmb3Igc3ltbGlua2VkIGRpcmVjdG9yaWVzIChbIzI3OV0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9pc3N1ZXMvMjc5KSk6CisgICogU3ltbGlua3MgYXJlIGFsd2F5cyBmb2xsb3dlZCAoWyMyNV0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9pc3N1ZXMvMjUpKS4KKyAgKiBTeW1saW5rZWQgZGlyZWN0b3JpZXMgcG9pbnRpbmcgd2l0aGluIGEgd2F0Y2hlZCBkaXJlY3RvcnkgYXJlIG5vdCBzdXBwb3J0ZWQgKFsjMjczXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL3B1bGwvMjczKS0gc2VlIFtEdXBsaWNhdGUgZGlyZWN0b3J5IGVycm9yc10oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi93aWtpL0R1cGxpY2F0ZS1kaXJlY3RvcnktZXJyb3JzKSkuCisqIE5vIGRpcmVjdG9yeS9hZGFwdGVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyogU3VwcG9ydCBmb3IgcGx1Z2lucyBwbGFubmVkIGZvciBmdXR1cmUuCisqIFRDUCBmdW5jdGlvbmFsaXR5IHdhcyByZW1vdmVkIGluIExpc3RlbiBbMy4wLjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vcmVsZWFzZXMvdGFnL3YzLjAuMCkgKFsjMzE5XShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2lzc3Vlcy8zMTkpLCBbIzIxOF0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9pc3N1ZXMvMjE4KSkuIFRoZXJlIGFyZSBwbGFucyB0byBleHRyYWN0IHRoaXMgZmVhdHVyZSB0byBzZXBhcmF0ZSBnZW1zIChbIzI1OF0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9pc3N1ZXMvMjU4KSksIHVudGlsIHRoaXMgaXMgZmluaXNoZWQsIHlvdSBjYW4gdXNlIGJ5IGxvY2tpbmcgdGhlIGBsaXN0ZW5gIGdlbSB0byB2ZXJzaW9uIGAnfj4gMi4xMCdgLgorKiBTb21lIGZpbGVzeXN0ZW1zIHdvbid0IHdvcmsgd2l0aG91dCBwb2xsaW5nIChWTS9WYWdyYW50IFNoYXJlZCBmb2xkZXJzLCBORlMsIFNhbWJhLCBzc2hmcywgZXRjLikuCisqIFNwZWNzIHN1aXRlIG9uIEpSdWJ5IGFuZCBSdWJpbml1cyBhcmVuJ3QgcmVsaWFibGUgb24gVHJhdmlzIENJLCBidXQgc2hvdWxkIHdvcmsuCisqIFdpbmRvd3MgYW5kIFwqQlNEIGFkYXB0ZXIgYXJlbid0IGNvbnRpbnVvdXNseSBhbmQgYXV0b21hdGljYWxseSB0ZXN0ZWQuCisqIE9TWCBhZGFwdGVyIGhhcyBzb21lIHBlcmZvcm1hbmNlIGxpbWl0YXRpb25zIChbIzM0Ml0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9pc3N1ZXMvMzQyKSkuCisqIFJ1YnkgMS45LjMgaXMgbm8gbG9uZ2VyIG1haW50YWluZWQgKGFuZCBtYXkgbm90IHdvcmsgd2l0aCBMaXN0ZW4pIC0gaXQncyBiZXN0IHRvIHVwZ3JhZGUgdG8gUnVieSAyLjIuMi4KKworUHVsbCByZXF1ZXN0cyBvciBoZWxwIGlzIHZlcnkgd2VsY29tZSBmb3IgdGhlc2UuCisKKyMjIEluc3RhbGwKKworVGhlIHNpbXBsZXN0IHdheSB0byBpbnN0YWxsIExpc3RlbiBpcyB0byB1c2UgW0J1bmRsZXJdKGh0dHA6Ly9idW5kbGVyLmlvKS4KKworYGBgcnVieQorZ2VtICdsaXN0ZW4nLCAnfj4gMy4wJyAjIE5PVEU6IGZvciBUQ1AgZnVuY3Rpb25hbGl0eSwgdXNlICd+PiAyLjEwJyBmb3Igbm93CitgYGAKKworIyMgVXNhZ2UKKworQ2FsbCBgTGlzdGVuLnRvYCB3aXRoIGVpdGhlciBhIHNpbmdsZSBkaXJlY3Rvcnkgb3IgbXVsdGlwbGUgZGlyZWN0b3JpZXMsIHRoZW4gZGVmaW5lIHRoZSAiY2hhbmdlcyIgY2FsbGJhY2sgaW4gYSBibG9jay4KKworYGBgIHJ1YnkKK2xpc3RlbmVyID0gTGlzdGVuLnRvKCdkaXIvdG8vbGlzdGVuJywgJ2Rpci90by9saXN0ZW4yJykgZG8gfG1vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZHwKKyAgcHV0cyAibW9kaWZpZWQgYWJzb2x1dGUgcGF0aDogI3ttb2RpZmllZH0iCisgIHB1dHMgImFkZGVkIGFic29sdXRlIHBhdGg6ICN7YWRkZWR9IgorICBwdXRzICJyZW1vdmVkIGFic29sdXRlIHBhdGg6ICN7cmVtb3ZlZH0iCitlbmQKK2xpc3RlbmVyLnN0YXJ0ICMgbm90IGJsb2NraW5nCitzbGVlcAorYGBgCisKKyMjIyBQYXVzZSAvIHVucGF1c2UgLyBzdG9wCisKK0xpc3RlbmVycyBjYW4gYWxzbyBiZSBlYXNpbHkgcGF1c2VkL3VucGF1c2VkOgorCitgYGAgcnVieQorbGlzdGVuZXIgPSBMaXN0ZW4udG8oJ2Rpci9wYXRoL3RvL2xpc3RlbicpIHsgfG1vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZHwgcHV0cyAnaGFuZGxlIGNoYW5nZXMgaGVyZS4uLicgfQorCitsaXN0ZW5lci5zdGFydAorbGlzdGVuZXIucGF1c2VkPyAjID0+IGZhbHNlCitsaXN0ZW5lci5wcm9jZXNzaW5nPyAjID0+IHRydWUKKworbGlzdGVuZXIucGF1c2UgICAjIHN0b3BzIHByb2Nlc3NpbmcgY2hhbmdlcyAoYnV0IGtlZXBzIG9uIGNvbGxlY3RpbmcgdGhlbSkKK2xpc3RlbmVyLnBhdXNlZD8gIyA9PiB0cnVlCitsaXN0ZW5lci5wcm9jZXNzaW5nPyAjID0+IGZhbHNlCisKK2xpc3RlbmVyLnVucGF1c2UgIyByZXN1bWVzIHByb2Nlc3NpbmcgY2hhbmdlcyAoInN0YXJ0IiB3b3VsZCBkbyB0aGUgc2FtZSkKK2xpc3RlbmVyLnN0b3AgICAgIyBzdG9wIGJvdGggbGlzdGVuaW5nIHRvIGNoYW5nZXMgYW5kIHByb2Nlc3NpbmcgdGhlbQorYGBgCisKKyAgTm90ZTogV2hpbGUgcGF1c2VkLCBMaXN0ZW4ga2VlcHMgb24gY29sbGVjdGluZyBjaGFuZ2VzIGluIHRoZSBiYWNrZ3JvdW5kIC0gdG8gY2xlYXIgdGhlbSwgY2FsbCAic3RvcCIKKworICBOb3RlOiBZb3Ugc2hvdWxkIGtlZXAgdHJhY2sgb2YgYWxsIHN0YXJ0ZWQgbGlzdGVuZXJzIGFuZCBzdG9wIHRoZW0gcHJvcGVybHkgb24gZmluaXNoLgorCisjIyMgSWdub3JlIC8gaWdub3JlIQorCitMaXN0ZW4gaWdub3JlcyBzb21lIGRpcmVjdG9yaWVzIGFuZCBleHRlbnNpb25zIGJ5IGRlZmF1bHQgKFNlZSBERUZBVUxUX0lHTk9SRURfRElSRUNUT1JJRVMgYW5kIERFRkFVTFRfSUdOT1JFRF9FWFRFTlNJT05TIGluIExpc3Rlbjo6U2lsZW5jZXIpLCB5b3UgY2FuIGFkZCBpZ25vcmluZyBwYXR0ZXJucyB3aXRoIHRoZSBgaWdub3JlYCBvcHRpb24vbWV0aG9kIG9yIG92ZXJ3cml0ZSBkZWZhdWx0IHdpdGggYGlnbm9yZSFgIG9wdGlvbi9tZXRob2QuCisKK2BgYCBydWJ5CitsaXN0ZW5lciA9IExpc3Rlbi50bygnZGlyL3BhdGgvdG8vbGlzdGVuJywgaWdub3JlOiAvXC50eHQvKSB7IHxtb2RpZmllZCwgYWRkZWQsIHJlbW92ZWR8ICMgLi4uIH0KK2xpc3RlbmVyLnN0YXJ0CitsaXN0ZW5lci5pZ25vcmUhIC9cLnBrZy8gIyBvdmVyd3JpdGUgYWxsIHBhdHRlcm5zIGFuZCBvbmx5IGlnbm9yZSBwa2cgZXh0ZW5zaW9uLgorbGlzdGVuZXIuaWdub3JlIC9cLnJiLyAgICMgaWdub3JlIHJiIGV4dGVuc2lvbiBpbiBhZGRpdGlvbiBvZiBwa2cuCitzbGVlcAorYGBgCisKK05vdGU6IGA6aWdub3JlYCByZWdleHAgcGF0dGVybnMgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0IHJlbGF0aXZlIHBhdGhzLgorCitOb3RlOiBJZ25vcmluZyBwYXRocyBkb2VzIG5vdCBpbXByb3ZlIHBlcmZvcm1hbmNlLCBleGNlcHQgd2hlbiBQb2xsaW5nIChbIzI3NF0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9pc3N1ZXMvMjc0KSkKKworIyMjIE9ubHkKKworTGlzdGVuIGNhdGNoZXMgYWxsIGZpbGVzIChsZXNzIHRoZSBpZ25vcmVkIG9uZXMpIGJ5IGRlZmF1bHQuIElmIHlvdSB3YW50IHRvIG9ubHkgbGlzdGVuIHRvIGEgc3BlY2lmaWMgdHlwZSBvZiBmaWxlIChpLmUuLCBqdXN0IGAucmJgIGV4dGVuc2lvbiksIHlvdSBzaG91bGQgdXNlIHRoZSBgb25seWAgb3B0aW9uL21ldGhvZC4KKworYGBgIHJ1YnkKK2xpc3RlbmVyID0gTGlzdGVuLnRvKCdkaXIvcGF0aC90by9saXN0ZW4nLCBvbmx5OiAvXC5yYiQvKSB7IHxtb2RpZmllZCwgYWRkZWQsIHJlbW92ZWR8ICMgLi4uIH0KK2xpc3RlbmVyLnN0YXJ0CitsaXN0ZW5lci5vbmx5IC9fc3BlY1wucmIkLyAjIG92ZXJ3cml0ZSBhbGwgZXhpc3Rpbmcgb25seSBwYXR0ZXJucy4KK3NsZWVwCitgYGAKKworTm90ZTogYDpvbmx5YCByZWdleHAgcGF0dGVybnMgYXJlIGV2YWx1YXRlZCBvbmx5IGFnYWluc3QgcmVsYXRpdmUgKipmaWxlKiogcGF0aHMuCisKKworIyMgQ2hhbmdlcyBjYWxsYmFjaworCitDaGFuZ2VzIHRvIHRoZSBsaXN0ZW5lZC10byBkaXJlY3RvcmllcyBnZXRzIHJlcG9ydGVkIGJhY2sgdG8gdGhlIHVzZXIgaW4gYSBjYWxsYmFjay4KK1RoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGdldHMgaW52b2tlZCwgd2hlbiB0aGVyZSBhcmUgY2hhbmdlcywgd2l0aCAqKnRocmVlKiogcGFyYW1ldGVyczoKK2Btb2RpZmllZGAsIGBhZGRlZGAgYW5kIGByZW1vdmVkYCBwYXRocywgaW4gdGhhdCBwYXJ0aWN1bGFyIG9yZGVyLgorUGF0aHMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbiB0aGVpciBhYnNvbHV0ZSBmb3JtLgorCitFeGFtcGxlOgorCitgYGBydWJ5CitsaXN0ZW5lciA9IExpc3Rlbi50bygncGF0aC90by9hcHAnKSBkbyB8bW9kaWZpZWQsIGFkZGVkLCByZW1vdmVkfAorICAjIFRoaXMgYmxvY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgY2hhbmdlcy4KK2VuZAorbGlzdGVuZXIuc3RhcnQKK3NsZWVwCitgYGAKKworb3IgLi4uCisKK2BgYHJ1YnkKKyMgQ3JlYXRlIGEgY2FsbGJhY2sKK2NhbGxiYWNrID0gUHJvYy5uZXcgZG8gfG1vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZHwKKyAgIyBUaGlzIHByb2Mgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgY2hhbmdlcy4KK2VuZAorbGlzdGVuZXIgPSBMaXN0ZW4udG8oJ2RpcicsICZjYWxsYmFjaykKK2xpc3RlbmVyLnN0YXJ0CitzbGVlcAorYGBgCisKKyMjIE9wdGlvbnMKKworQWxsIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBjYW4gYmUgc2V0IHRocm91Z2ggdGhlIGBMaXN0ZW4udG9gIGFmdGVyIHRoZSBkaXJlY3RvcnkgcGF0aChzKSBwYXJhbXMuCisKK2BgYHJ1YnkKK2lnbm9yZTogWyVyey9mb28vYmFyfSwgL1wucGlkJC8sIC9cLmNvZmZlZSQvXSAgICMgSWdub3JlIGEgbGlzdCBvZiBwYXRocworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWZhdWx0OiBTZWUgREVGQVVMVF9JR05PUkVEX0RJUkVDVE9SSUVTIGFuZCBERUZBVUxUX0lHTk9SRURfRVhURU5TSU9OUyBpbiBMaXN0ZW46OlNpbGVuY2VyCisKK2lnbm9yZSE6ICVyey9mb28vYmFyfSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2FtZSBhcyBpZ25vcmUgb3B0aW9ucywgYnV0IG92ZXJ3cml0ZSBkZWZhdWx0IGlnbm9yZWQgcGF0aHMuCisKK29ubHk6ICVyey5yYiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT25seSBsaXN0ZW4gdG8gc3BlY2lmaWMgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVmYXVsdDogbm9uZQorCitsYXRlbmN5OiAwLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCB0aGUgZGVsYXkgKCoqaW4gc2Vjb25kcyoqKSBiZXR3ZWVuIGNoZWNraW5nIGZvciBjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmF1bHQ6IDAuMjUgc2VjICgxLjAgc2VjIGZvciBwb2xsaW5nKQorCit3YWl0X2Zvcl9kZWxheTogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCB0aGUgZGVsYXkgKCoqaW4gc2Vjb25kcyoqKSBiZXR3ZWVuIGNhbGxzIHRvIHRoZSBjYWxsYmFjayB3aGVuIGNoYW5nZXMgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVmYXVsdDogMC4xMCBzZWMKKworZm9yY2VfcG9sbGluZzogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JjZSB0aGUgdXNlIG9mIHRoZSBwb2xsaW5nIGFkYXB0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVmYXVsdDogbm9uZQorCityZWxhdGl2ZTogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdoZXRoZXIgY2hhbmdlcyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gY3VycmVudCBkaXIgb3Igbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmF1bHQ6IGZhbHNlCisKK3BvbGxpbmdfZmFsbGJhY2tfbWVzc2FnZTogJ2N1c3RvbSBtZXNzYWdlJyAgICAgICMgU2V0IGEgY3VzdG9tIHBvbGxpbmcgZmFsbGJhY2sgbWVzc2FnZSAob3IgZGlzYWJsZSBpdCB3aXRoIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWZhdWx0OiAiTGlzdGVuIHdpbGwgYmUgcG9sbGluZyBmb3IgY2hhbmdlcy4gTGVhcm4gbW9yZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuI2xpc3Rlbi1hZGFwdGVycy4iCitgYGAKKworIyMgRGVidWdnaW5nCisKK1NldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGBMSVNURU5fR0VNX0RFQlVHR0lORz0xYCBzZXRzIHVwIHRoZSBJTkZPIGxldmVsIGxvZ2dlciwgd2hpbGUgYExJU1RFTl9HRU1fREVCVUdHSU5HPTJgIHNldHMgdXAgdGhlIERFQlVHIGxldmVsIGxvZ2dlci4gCisKK1lvdSBjYW4gYWxzbyBzZXQgYExpc3Rlbi5sb2dnZXJgIHRvIGEgY3VzdG9tIGxvZ2dlci4KKworCisjIyBMaXN0ZW4gYWRhcHRlcnMKKworVGhlIExpc3RlbiBnZW0gaGFzIGEgc2V0IG9mIGFkYXB0ZXJzIHRvIG5vdGlmeSBpdCB3aGVuIHRoZXJlIGFyZSBjaGFuZ2VzLgorCitUaGVyZSBhcmUgNCBPUy1zcGVjaWZpYyBhZGFwdGVycyB0byBzdXBwb3J0IERhcndpbiwgTGludXgsIFwqQlNEIGFuZCBXaW5kb3dzLgorVGhlc2UgYWRhcHRlcnMgYXJlIGZhc3QgYXMgdGhleSB1c2Ugc29tZSBzeXN0ZW0tY2FsbHMgdG8gaW1wbGVtZW50IHRoZSBub3RpZnlpbmcgZnVuY3Rpb24uCisKK1RoZXJlIGlzIGFsc28gYSBwb2xsaW5nIGFkYXB0ZXIgLSBhbHRob3VnaCBpdCdzIG11Y2ggc2xvd2VyIHRoYW4gb3RoZXIgYWRhcHRlcnMsCitpdCB3b3JrcyBvbiBldmVyeSBwbGF0Zm9ybS9zeXN0ZW0gYW5kIHNjZW5hcmlvIChpbmNsdWRpbmcgbmV0d29yayBmaWxlc3lzdGVtcyBzdWNoIGFzIFZNIHNoYXJlZCBmb2xkZXJzKS4KKworVGhlIERhcndpbiBhbmQgTGludXggYWRhcHRlcnMgYXJlIGRlcGVuZGVuY2llcyBvZiB0aGUgTGlzdGVuIGdlbSBzbyB0aGV5IHdvcmsgb3V0IG9mIHRoZSBib3guIEZvciBvdGhlciBhZGFwdGVycyBhIHNwZWNpZmljIGdlbSB3aWxsIGhhdmUgdG8gYmUgYWRkZWQgdG8geW91ciBHZW1maWxlLCBwbGVhc2UgcmVhZCBiZWxvdy4KKworVGhlIExpc3RlbiBnZW0gd2lsbCBjaG9vc2UgdGhlIGJlc3QgYWRhcHRlciBhdXRvbWF0aWNhbGx5LCBpZiBwcmVzZW50LiBJZiB5b3UKK3dhbnQgdG8gZm9yY2UgdGhlIHVzZSBvZiB0aGUgcG9sbGluZyBhZGFwdGVyLCB1c2UgdGhlIGA6Zm9yY2VfcG9sbGluZ2Agb3B0aW9uCit3aGlsZSBpbml0aWFsaXppbmcgdGhlIGxpc3RlbmVyLgorCisjIyMgT24gV2luZG93cworCitJZiB5b3UgYXJlIG9uIFdpbmRvd3MsIGl0J3MgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBbYHdkbWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9NYWhlcjRFdmVyL3dkbSkgYWRhcHRlciBpbnN0ZWFkIG9mIHBvbGxpbmcuCisKK1BsZWFzZSBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIEdlbWZpbGU6CisKK2BgYHJ1YnkKK2dlbSAnd2RtJywgJz49IDAuMS4wJyBpZiBHZW0ud2luX3BsYXRmb3JtPworYGBgCisKKyMjIyBPbiBcKkJTRAorCitJZiB5b3UgYXJlIG9uIFwqQlNEIHlvdSBjYW4gdHJ5IHRvIHVzZSB0aGUgW2ByYi1rcXVldWVgXShodHRwczovL2dpdGh1Yi5jb20vbWF0ODEzL3JiLWtxdWV1ZSkgYWRhcHRlciBpbnN0ZWFkIG9mIHBvbGxpbmcuCisKK1BsZWFzZSBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIEdlbWZpbGU6CisKK2BgYHJ1YnkKK3JlcXVpcmUgJ3JiY29uZmlnJworaWYgUmJDb25maWc6OkNPTkZJR1sndGFyZ2V0X29zJ10gPX4gL2JzZHxkcmFnb25mbHkvaQorICBnZW0gJ3JiLWtxdWV1ZScsICc+PSAwLjInCitlbmQKKworYGBgCisKKyMjIyBHZXR0aW5nIHRoZSBbcG9sbGluZyBmYWxsYmFjayBtZXNzYWdlXSgjb3B0aW9ucyk/CisKK1BsZWFzZSB2aXNpdCB0aGUgW2luc3RhbGxhdGlvbiBzZWN0aW9uIG9mIHRoZSBMaXN0ZW4gV0lLSV0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi93aWtpI2luc3RhbGxhdGlvbikgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIG9wdGlvbnMgZm9yIHBvdGVudGlhbCBmaXhlcy4KKworIyMjIElzc3VlcyBhbmQgdHJvdWJsZXNob290aW5nCisKKypOT1RFOiB3aXRob3V0IHByb3ZpZGluZyB0aGUgb3V0cHV0IGFmdGVyIHNldHRpbmcgdGhlIGBMSVNURU5fR0VNX0RFQlVHR0lORz0xYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaXQgY2FuIGJlIGFsbW9zdCBpbXBvc3NpYmxlIHRvIGd1ZXNzIHdoeSBsaXN0ZW4gaXMgbm90IHdvcmtpbmcgYXMgZXhwZWN0ZWQuKgorCitTZWUgW1RST1VCTEVTSE9PVElOR10oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi93aWtpL1Ryb3VibGVzaG9vdGluZykKKworIyMgUGVyZm9ybWFuY2UKKworSWYgTGlzdGVuIHNlZW1zIHNsb3cgb3IgdW5yZXNwb25zaXZlLCBtYWtlIHN1cmUgeW91J3JlIG5vdCB1c2luZyB0aGUgUG9sbGluZyBhZGFwdGVyICh5b3Ugc2hvdWxkIHNlZSBhIHdhcm5pbmcgdXBvbiBzdGFydHVwIGlmIHlvdSBhcmUpLgorCitBbHNvLCBpZiB0aGUgZGlyZWN0b3JpZXMgeW91J3JlIHdhdGNoaW5nIGNvbnRhaW4gbWFueSBmaWxlcywgbWFrZSBzdXJlIHlvdSdyZToKKworKiBub3QgdXNpbmcgUG9sbGluZyAoaWRlYWxseSkKKyogdXNpbmcgYDppZ25vcmVgIGFuZCBgOm9ubHlgIG9wdGlvbnMgdG8gYXZvaWQgdHJhY2tpbmcgZGlyZWN0b3JpZXMgeW91IGRvbid0IGNhcmUgYWJvdXQgKGltcG9ydGFudCB3aXRoIFBvbGxpbmcgYW5kIG9uIE1hY09TKQorKiBydW5uaW5nIExpc3RlbiB3aXRoIHRoZSBgOmxhdGVuY3lgIGFuZCBgOndhaXRfZm9yX2RlbGF5YCBvcHRpb25zIG5vdCB0b28gc21hbGwgb3IgdG9vIGJpZyAoZGVwZW5kcyBvbiBuZWVkcykKKyogbm90IHdhdGNoaW5nIGRpcmVjdG9yaWVzIHdpdGggbG9nIGZpbGVzLCBkYXRhYmFzZSBmaWxlcyBvciBvdGhlciBmcmVxdWVudGx5IGNoYW5naW5nIGZpbGVzCisqIG5vdCB1c2luZyBhIHZlcnNpb24gb2YgTGlzdGVuIHByaW9yIHRvIDIuNy43CisqIG5vdCBnZXR0aW5nIHNpbGVudCBjcmFzaGVzIHdpdGhpbiBMaXN0ZW4gKHNlZSBMSVNURU5fR0VNX0RFQlVHR0lORz0yKQorKiBub3QgcnVubmluZyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTGlzdGVuIGluIHRoZSBiYWNrZ3JvdW5kCisqIHVzaW5nIGEgZmlsZSBzeXN0ZW0gd2l0aCBhdGltZSBtb2RpZmljYXRpb24gZGlzYWJsZWQgKGlkZWFsbHkpCisqIG5vdCB1c2luZyBhIGZpbGVzeXN0ZW0gd2l0aCBpbmFjY3VyYXRlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIChpZGVhbGx5KSwgZS5nLiBIRlMsIFZGQVQKKyogbm90IGJ1ZmZlcmluZyB0byBhIHNsb3cgdGVybWluYWwgKGUuZy4gdHJhbnNwYXJlbmN5ICsgZmFuY3kgZm9udCArIHNsb3cgZ2Z4IGNhcmQgKyBsb3RzIG9mIG91dHB1dCkKKyogaWRlYWxseSBub3QgcnVubmluZyBhIHNsb3cgZW5jcnlwdGlvbiBzdGFjaywgZS5nLiBidHJmcyArIGVjcnlwdGZzCisKK1doZW4gaW4gZG91YnQsIExJU1RFTl9HRU1fREVCVUdHSU5HPTIgY2FuIGhlbHAgZGlzY292ZXIgdGhlIGFjdHVhbCBldmVudHMgYW5kIHRpbWUgdGhleSBoYXBwZW5lZC4KKworU2VlIGFsc28gW1RpcHMgYW5kIFRlY2huaXF1ZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vd2lraS9UaXBzLWFuZC1UZWNobmlxdWVzKS4KKworIyMgRGV2ZWxvcG1lbnQKKworKiBEb2N1bWVudGF0aW9uIGhvc3RlZCBhdCBbUnVieURvY10oaHR0cDovL3J1Ynlkb2MuaW5mby9naXRodWIvZ3VhcmQvbGlzdGVuL21hc3Rlci9mcmFtZXMpLgorKiBTb3VyY2UgaG9zdGVkIGF0IFtHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4pLgorCitQdWxsIHJlcXVlc3RzIGFyZSB2ZXJ5IHdlbGNvbWUhIFBsZWFzZSB0cnkgdG8gZm9sbG93IHRoZXNlIHNpbXBsZSBydWxlcyBpZiBhcHBsaWNhYmxlOgorCisqIFBsZWFzZSBjcmVhdGUgYSB0b3BpYyBicmFuY2ggZm9yIGV2ZXJ5IHNlcGFyYXRlIGNoYW5nZSB5b3UgbWFrZS4KKyogTWFrZSBzdXJlIHlvdXIgcGF0Y2hlcyBhcmUgd2VsbCB0ZXN0ZWQuIEFsbCBzcGVjcyBtdXN0IHBhc3Mgb24gW1RyYXZpcyBDSV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2d1YXJkL2xpc3RlbikuCisqIFVwZGF0ZSB0aGUgW1lhcmRdKGh0dHA6Ly95YXJkb2Mub3JnLykgZG9jdW1lbnRhdGlvbi4KKyogVXBkYXRlIHRoZSBbUkVBRE1FXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCkuCisqIFBsZWFzZSAqKmRvIG5vdCBjaGFuZ2UqKiB0aGUgdmVyc2lvbiBudW1iZXIuCisKK0ZvciBxdWVzdGlvbnMgcGxlYXNlIGpvaW4gdXMgaW4gb3VyIFtHb29nbGUgZ3JvdXBdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9ndWFyZC1kZXYpIG9yIG9uCitgI2d1YXJkYCAoaXJjLmZyZWVub2RlLm5ldCkuCisKKyMjIEFja25vd2xlZGdtZW50cworCisqIFtNaWNoYWVsIEtlc3NsZXIgKG5ldHpwaXJhdCldW10gZm9yIGhhdmluZyB3cml0dGVuIHRoZSBbaW5pdGlhbCBzcGVjc10oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9jb21taXQvMWU0NTdiMTNiMWJiOGEyNWQyMjQwNDI4Y2U1ZWQ0ODhiYWZiZWQxZikuCisqIFtUcmF2aXMgVGlsbGV5ICh0dGlsbGV5KV1bXSBmb3IgdGhpcyBhd2Vzb21lIHdvcmsgb24gW2Zzc21dW10gJiBbcmItZnNldmVudF1bXS4KKyogW05hdGhhbiBXZWl6ZW5iYXVtIChuZXgzKV1bXSBmb3IgW3JiLWlub3RpZnldW10sIGEgdGhvcm91Z2ggaW5vdGlmeSB3cmFwcGVyLgorKiBbTWF0aGlldSBBcm5vbGQgKG1hdDgxMyldW10gZm9yIFtyYi1rcXVldWVdW10sIGEgc2ltcGxlIGtxdWV1ZSB3cmFwcGVyLgorKiBbTWFoZXIgU2FsbGFtXVtdIGZvciBbd2RtXVtdLCB3aW5kb3dzIHN1cHBvcnQgd291bGRuJ3QgZXhpc3Qgd2l0aG91dCBoaW0uCisqIFtZZWh1ZGEgS2F0eiAod3ljYXRzKV1bXSBmb3IgW3ZpZ2lsb11bXSwgdGhhdCBoYXMgYmVlbiBhIGdyZWF0IHNvdXJjZSBvZiBpbnNwaXJhdGlvbi4KKworIyMgQXV0aG9yCisKK1tUaGliYXVkIEd1aWxsYXVtZS1HZW50aWxdKGh0dHBzOi8vZ2l0aHViLmNvbS90aGliYXVkZ2cpIChbQHRoaWJhdWRnZ10oaHR0cHM6Ly90d2l0dGVyLmNvbS90aGliYXVkZ2cpKQorCisjIyBDb250cmlidXRvcnMKKworW2h0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vZ3JhcGhzL2NvbnRyaWJ1dG9yc10oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9ncmFwaHMvY29udHJpYnV0b3JzKQorCitbVGhpYmF1ZCBHdWlsbGF1bWUtR2VudGlsICh0aGliYXVkZ2cpXTogaHR0cHM6Ly9naXRodWIuY29tL3RoaWJhdWRnZworW01haGVyIFNhbGxhbV06IGh0dHBzOi8vZ2l0aHViLmNvbS9NYWhlcjRFdmVyCitbTWljaGFlbCBLZXNzbGVyIChuZXR6cGlyYXQpXTogaHR0cHM6Ly9naXRodWIuY29tL25ldHpwaXJhdAorW1RyYXZpcyBUaWxsZXkgKHR0aWxsZXkpXTogaHR0cHM6Ly9naXRodWIuY29tL3R0aWxsZXkKK1tmc3NtXTogaHR0cHM6Ly9naXRodWIuY29tL3R0aWxsZXkvZnNzbQorW3JiLWZzZXZlbnRdOiBodHRwczovL2dpdGh1Yi5jb20vdGhpYmF1ZGdnL3JiLWZzZXZlbnQKK1tNYXRoaWV1IEFybm9sZCAobWF0ODEzKV06IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXQ4MTMKK1tOYXRoYW4gV2VpemVuYmF1bSAobmV4MyldOiBodHRwczovL2dpdGh1Yi5jb20vbmV4MworW3JiLWlub3RpZnldOiBodHRwczovL2dpdGh1Yi5jb20vbmV4My9yYi1pbm90aWZ5Citbc3RlcmVvYm9vc3Rlcl06IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVyZW9ib29zdGVyCitbcmItZmNoYW5nZV06IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVyZW9ib29zdGVyL3JiLWZjaGFuZ2UKK1tyYi1rcXVldWVdOiBodHRwczovL2dpdGh1Yi5jb20vbWF0ODEzL3JiLWtxdWV1ZQorW1llaHVkYSBLYXR6ICh3eWNhdHMpXTogaHR0cHM6Ly9naXRodWIuY29tL3d5Y2F0cworW3ZpZ2lsb106IGh0dHBzOi8vZ2l0aHViLmNvbS93eWNhdHMvdmlnaWxvCitbd2RtXTogaHR0cHM6Ly9naXRodWIuY29tL01haGVyNEV2ZXIvd2RtCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvYmluL2xpc3RlbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9iaW4vbGlzdGVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiYmRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvYmluL2xpc3RlbgpAQCAtMCwwICsxLDEyIEBACisjIS91c3IvYmluL2VudiBydWJ5CisKK3JlcXVpcmUgJ2xpc3RlbicKK3JlcXVpcmUgJ2xpc3Rlbi9jbGknCisKK3VubGVzcyBkZWZpbmVkPyhKUlVCWV9WRVJTSU9OKQorICBpZiBTaWduYWwubGlzdC5rZXlzLmluY2x1ZGU/KCdJTlQnKQorICAgIFNpZ25hbC50cmFwKCdJTlQnKSB7IFRocmVhZC5uZXcgeyBMaXN0ZW4uc3RvcCB9IH0KKyAgZW5kCitlbmQKKworTGlzdGVuOjpDTEkuc3RhcnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkNGExYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuLnJiCkBAIC0wLDAgKzEsNTUgQEAKK3JlcXVpcmUgJ2xvZ2dlcicKK3JlcXVpcmUgJ2xpc3Rlbi9sb2dnZXInCityZXF1aXJlICdsaXN0ZW4vbGlzdGVuZXInCisKK3JlcXVpcmUgJ2xpc3Rlbi9pbnRlcm5hbHMvdGhyZWFkX3Bvb2wnCisKKyMgQWx3YXlzIHNldCB1cCBsb2dnaW5nIGJ5IGRlZmF1bHQgZmlyc3QgdGltZSBmaWxlIGlzIHJlcXVpcmVkCisjCisjIE5PVEU6IElmIHlvdSBuZWVkIHRvIGNsZWFyIHRoZSBsb2dnZXIgY29tcGxldGVseSwgZG8gc28gKmFmdGVyKgorIyByZXF1aXJpbmcgdGhpcyBmaWxlLiBJZiB5b3UgbmVlZCB0byBzZXQgYSBjdXN0b20gbG9nZ2VyLAorIyByZXF1aXJlIHRoZSBsaXN0ZW4vbG9nZ2VyIGZpbGUgYW5kIHNldCB0aGUgbG9nZ2VyIGJlZm9yZSByZXF1aXJpbmcKKyMgdGhpcyBmaWxlLgorTGlzdGVuLnNldHVwX2RlZmF1bHRfbG9nZ2VyX2lmX3Vuc2V0CisKKyMgV29uJ3QgcHJpbnQgYW55dGhpbmcgYnkgZGVmYXVsdCBiZWNhdXNlIG9mIGxldmVsIC0gdW5sZXNzIHlvdSd2ZSBzZXQKKyMgTElTVEVOX0dFTV9ERUJVR0dJTkcgb3IgcHJvdmlkZWQgeW91ciBvd24gbG9nZ2VyIHdpdGggYSBoaWdoIGVub3VnaCBsZXZlbAorTGlzdGVuOjpMb2dnZXIuaW5mbyAiTGlzdGVuIGxvZ2xldmVsIHNldCB0bzogI3tMaXN0ZW4ubG9nZ2VyLmxldmVsfSIKK0xpc3Rlbjo6TG9nZ2VyLmluZm8gIkxpc3RlbiB2ZXJzaW9uOiAje0xpc3Rlbjo6VkVSU0lPTn0iCisKK21vZHVsZSBMaXN0ZW4KKyAgY2xhc3MgPDwgc2VsZgorICAgICMgTGlzdGVucyB0byBmaWxlIHN5c3RlbSBtb2RpZmljYXRpb25zIG9uIGEgZWl0aGVyIHNpbmdsZSBkaXJlY3Rvcnkgb3IKKyAgICAjIG11bHRpcGxlIGRpcmVjdG9yaWVzLgorICAgICMKKyAgICAjIEBwYXJhbSAoc2VlIExpc3Rlbjo6TGlzdGVuZXIjbmV3KQorICAgICMKKyAgICAjIEB5aWVsZCBbbW9kaWZpZWQsIGFkZGVkLCByZW1vdmVkXSB0aGUgY2hhbmdlZCBmaWxlcworICAgICMgQHlpZWxkcGFyYW0gW0FycmF5PFN0cmluZz5dIG1vZGlmaWVkIHRoZSBsaXN0IG9mIG1vZGlmaWVkIGZpbGVzCisgICAgIyBAeWllbGRwYXJhbSBbQXJyYXk8U3RyaW5nPl0gYWRkZWQgdGhlIGxpc3Qgb2YgYWRkZWQgZmlsZXMKKyAgICAjIEB5aWVsZHBhcmFtIFtBcnJheTxTdHJpbmc+XSByZW1vdmVkIHRoZSBsaXN0IG9mIHJlbW92ZWQgZmlsZXMKKyAgICAjCisgICAgIyBAcmV0dXJuIFtMaXN0ZW46Okxpc3RlbmVyXSB0aGUgbGlzdGVuZXIKKyAgICAjCisgICAgZGVmIHRvKCphcmdzLCAmYmxvY2spCisgICAgICBAbGlzdGVuZXJzIHx8PSBbXQorICAgICAgTGlzdGVuZXIubmV3KCphcmdzLCAmYmxvY2spLnRhcCBkbyB8bGlzdGVuZXJ8CisgICAgICAgIEBsaXN0ZW5lcnMgPDwgbGlzdGVuZXIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGlzIGlzIHVzZWQgYnkgdGhlIGBsaXN0ZW5gIGJpbmFyeSB0byBoYW5kbGUgQ3RybC1DCisgICAgIworICAgIGRlZiBzdG9wCisgICAgICBJbnRlcm5hbHM6OlRocmVhZFBvb2wuc3RvcAorICAgICAgQGxpc3RlbmVycyB8fD0gW10KKworICAgICAgIyBUT0RPOiBzaG91bGQgdXNlIGEgbXV0ZXggZm9yIHRoaXMKKyAgICAgIEBsaXN0ZW5lcnMuZWFjaCBkbyB8bGlzdGVuZXJ8CisgICAgICAgICMgY2FsbCBzdG9wIHRvIGhhbHQgdGhlIG1haW4gbG9vcAorICAgICAgICBsaXN0ZW5lci5zdG9wCisgICAgICBlbmQKKyAgICAgIEBsaXN0ZW5lcnMgPSBuaWwKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9hZGFwdGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OGJjYjQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9hZGFwdGVyLnJiCkBAIC0wLDAgKzEsNDMgQEAKK3JlcXVpcmUgJ2xpc3Rlbi9hZGFwdGVyL2Jhc2UnCityZXF1aXJlICdsaXN0ZW4vYWRhcHRlci9ic2QnCityZXF1aXJlICdsaXN0ZW4vYWRhcHRlci9kYXJ3aW4nCityZXF1aXJlICdsaXN0ZW4vYWRhcHRlci9saW51eCcKK3JlcXVpcmUgJ2xpc3Rlbi9hZGFwdGVyL3BvbGxpbmcnCityZXF1aXJlICdsaXN0ZW4vYWRhcHRlci93aW5kb3dzJworCittb2R1bGUgTGlzdGVuCisgIG1vZHVsZSBBZGFwdGVyCisgICAgT1BUSU1JWkVEX0FEQVBURVJTID0gW0RhcndpbiwgTGludXgsIEJTRCwgV2luZG93c10KKyAgICBQT0xMSU5HX0ZBTExCQUNLX01FU1NBR0UgPSAnTGlzdGVuIHdpbGwgYmUgcG9sbGluZyBmb3IgY2hhbmdlcy4nXAorICAgICAgJ0xlYXJuIG1vcmUgYXQgaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3RlbiNsaXN0ZW4tYWRhcHRlcnMuJworCisgICAgZGVmIHNlbGYuc2VsZWN0KG9wdGlvbnMgPSB7fSkKKyAgICAgIF9sb2cgOmRlYnVnLCAnQWRhcHRlcjogY29uc2lkZXJpbmcgcG9sbGluZyAuLi4nCisgICAgICByZXR1cm4gUG9sbGluZyBpZiBvcHRpb25zWzpmb3JjZV9wb2xsaW5nXQorICAgICAgX2xvZyA6ZGVidWcsICdBZGFwdGVyOiBjb25zaWRlcmluZyBvcHRpbWl6ZWQgYmFja2VuZC4uLicKKyAgICAgIHJldHVybiBfdXNhYmxlX2FkYXB0ZXJfY2xhc3MgaWYgX3VzYWJsZV9hZGFwdGVyX2NsYXNzCisgICAgICBfbG9nIDpkZWJ1ZywgJ0FkYXB0ZXI6IGZhbGxpbmcgYmFjayB0byBwb2xsaW5nLi4uJworICAgICAgX3dhcm5fcG9sbGluZ19mYWxsYmFjayhvcHRpb25zKQorICAgICAgUG9sbGluZworICAgIHJlc2N1ZQorICAgICAgX2xvZyA6d2FybiwgZm9ybWF0KCdBZGFwdGVyOiBmYWlsZWQ6ICVzOiVzJywgJEVSUk9SX1BPU0lUSU9OLmluc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgJEVSUk9SX1BPU0lUSU9OICogIlxuIikKKyAgICAgIHJhaXNlCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgc2VsZi5fdXNhYmxlX2FkYXB0ZXJfY2xhc3MKKyAgICAgIE9QVElNSVpFRF9BREFQVEVSUy5kZXRlY3QoJjp1c2FibGU/KQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuX3dhcm5fcG9sbGluZ19mYWxsYmFjayhvcHRpb25zKQorICAgICAgbXNnID0gb3B0aW9ucy5mZXRjaCg6cG9sbGluZ19mYWxsYmFja19tZXNzYWdlLCBQT0xMSU5HX0ZBTExCQUNLX01FU1NBR0UpCisgICAgICBLZXJuZWwud2FybiAiW0xpc3RlbiB3YXJuaW5nXTpcbiAgI3ttc2d9IiBpZiBtc2cKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLl9sb2codHlwZSwgbWVzc2FnZSkKKyAgICAgIExpc3Rlbjo6TG9nZ2VyLnNlbmQodHlwZSwgbWVzc2FnZSkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvYmFzZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvYmFzZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjU5ZDliCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vYWRhcHRlci9iYXNlLnJiCkBAIC0wLDAgKzEsMTM3IEBACityZXF1aXJlICdsaXN0ZW4vb3B0aW9ucycKK3JlcXVpcmUgJ2xpc3Rlbi9yZWNvcmQnCityZXF1aXJlICdsaXN0ZW4vY2hhbmdlJworCittb2R1bGUgTGlzdGVuCisgIG1vZHVsZSBBZGFwdGVyCisgICAgY2xhc3MgQmFzZQorICAgICAgYXR0cl9yZWFkZXIgOm9wdGlvbnMKKworICAgICAgIyBUT0RPOiBvbmx5IHVzZWQgYnkgdGVzdHMKKyAgICAgIERFRkFVTFRTID0ge30KKworICAgICAgYXR0cl9yZWFkZXIgOmNvbmZpZworCisgICAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcpCisgICAgICAgIEBzdGFydGVkID0gZmFsc2UKKyAgICAgICAgQGNvbmZpZyA9IGNvbmZpZworCisgICAgICAgIEBjb25maWd1cmVkID0gbmlsCisKKyAgICAgICAgZmFpbCAnTm8gZGlyZWN0b3JpZXMgdG8gd2F0Y2ghJyBpZiBjb25maWcuZGlyZWN0b3JpZXMuZW1wdHk/CisKKyAgICAgICAgZGVmYXVsdHMgPSBzZWxmLmNsYXNzLmNvbnN0X2dldCgnREVGQVVMVFMnKQorICAgICAgICBAb3B0aW9ucyA9IExpc3Rlbjo6T3B0aW9ucy5uZXcoY29uZmlnLmFkYXB0ZXJfb3B0aW9ucywgZGVmYXVsdHMpCisgICAgICByZXNjdWUKKyAgICAgICAgX2xvZ19leGNlcHRpb24gJ2FkYXB0ZXIgY29uZmlnIGZhaWxlZDogJXM6JXMgY2FsbGVkIGZyb206ICVzJywgY2FsbGVyCisgICAgICAgIHJhaXNlCisgICAgICBlbmQKKworICAgICAgIyBUT0RPOiBpdCdzIGEgc2VwYXJhdGUgbWV0aG9kIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIHRlc3RzCisgICAgICBkZWYgY29uZmlndXJlCisgICAgICAgIGlmIEBjb25maWd1cmVkCisgICAgICAgICAgX2xvZyg6d2FybiwgJ0FkYXB0ZXIgYWxyZWFkeSBjb25maWd1cmVkIScpCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVuZAorCisgICAgICAgIEBjb25maWd1cmVkID0gdHJ1ZQorCisgICAgICAgIEBjYWxsYmFja3MgfHw9IHt9CisgICAgICAgIGNvbmZpZy5kaXJlY3Rvcmllcy5lYWNoIGRvIHxkaXJ8CisgICAgICAgICAgY2FsbGJhY2sgPSBAY2FsbGJhY2tzW2Rpcl0gfHwgbGFtYmRhIGRvIHxldmVudHwKKyAgICAgICAgICAgIF9wcm9jZXNzX2V2ZW50KGRpciwgZXZlbnQpCisgICAgICAgICAgZW5kCisgICAgICAgICAgQGNhbGxiYWNrc1tkaXJdID0gY2FsbGJhY2sKKyAgICAgICAgICBfY29uZmlndXJlKGRpciwgJmNhbGxiYWNrKQorICAgICAgICBlbmQKKworICAgICAgICBAc25hcHNob3RzIHx8PSB7fQorICAgICAgICAjIFRPRE86IHNlcGFyYXRlIGNvbmZpZyBwZXIgZGlyZWN0b3J5IChzb21lIGRheSBtYXliZSkKKyAgICAgICAgY2hhbmdlX2NvbmZpZyA9IENoYW5nZTo6Q29uZmlnLm5ldyhjb25maWcucXVldWUsIGNvbmZpZy5zaWxlbmNlcikKKyAgICAgICAgY29uZmlnLmRpcmVjdG9yaWVzLmVhY2ggZG8gfGRpcnwKKyAgICAgICAgICByZWNvcmQgPSBSZWNvcmQubmV3KGRpcikKKyAgICAgICAgICBzbmFwc2hvdCA9IENoYW5nZS5uZXcoY2hhbmdlX2NvbmZpZywgcmVjb3JkKQorICAgICAgICAgIEBzbmFwc2hvdHNbZGlyXSA9IHNuYXBzaG90CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdGFydGVkPworICAgICAgICBAc3RhcnRlZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdGFydAorICAgICAgICBjb25maWd1cmUKKworICAgICAgICBpZiBzdGFydGVkPworICAgICAgICAgIF9sb2coOndhcm4sICdBZGFwdGVyIGFscmVhZHkgc3RhcnRlZCEnKQorICAgICAgICAgIHJldHVybgorICAgICAgICBlbmQKKworICAgICAgICBAc3RhcnRlZCA9IHRydWUKKworICAgICAgICBjYWxsaW5nX3N0YWNrID0gY2FsbGVyLmR1cAorICAgICAgICBMaXN0ZW46OkludGVybmFsczo6VGhyZWFkUG9vbC5hZGQgZG8KKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgQHNuYXBzaG90cy52YWx1ZXMuZWFjaCBkbyB8c25hcHNob3R8CisgICAgICAgICAgICAgIF90aW1lZCgnUmVjb3JkLmJ1aWxkKCknKSB7IHNuYXBzaG90LnJlY29yZC5idWlsZCB9CisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIF9ydW4KKyAgICAgICAgICByZXNjdWUKKyAgICAgICAgICAgIG1zZyA9ICdydW4oKSBpbiB0aHJlYWQgZmFpbGVkOiAlczpcbidcCisgICAgICAgICAgICAgICcgJXNcblxuY2FsbGVkIGZyb206XG4gJXMnCisgICAgICAgICAgICBfbG9nX2V4Y2VwdGlvbihtc2csIGNhbGxpbmdfc3RhY2spCisgICAgICAgICAgICByYWlzZSAjIGZvciB1bml0IHRlc3RzIG1vc3RseQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3RvcAorICAgICAgICBfc3RvcAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnVzYWJsZT8KKyAgICAgICAgY29uc3RfZ2V0KCdPU19SRUdFWFAnKSA9fiBSYkNvbmZpZzo6Q09ORklHWyd0YXJnZXRfb3MnXQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgZGVmIF9zdG9wCisgICAgICBlbmQKKworICAgICAgZGVmIF90aW1lZCh0aXRsZSkKKyAgICAgICAgc3RhcnQgPSBUaW1lLm5vdy50b19mCisgICAgICAgIHlpZWxkCisgICAgICAgIGRpZmYgPSBUaW1lLm5vdy50b19mIC0gc3RhcnQKKyAgICAgICAgTGlzdGVuOjpMb2dnZXIuaW5mbyBmb3JtYXQoJyVzOiAlLjA1ZiBzZWNvbmRzJywgdGl0bGUsIGRpZmYpCisgICAgICByZXNjdWUKKyAgICAgICAgTGlzdGVuOjpMb2dnZXIud2FybiAiI3t0aXRsZX0gY3Jhc2hlZDogI3skRVJST1JfSU5GTy5pbnNwZWN0fSIKKyAgICAgICAgcmFpc2UKKyAgICAgIGVuZAorCisgICAgICAjIFRPRE86IGFsbG93IGJhY2tlbmQgYWRhcHRlcnMgdG8gcGFzcyBzcGVjaWZpYyBpbnZhbGlkYXRpb24gb2JqZWN0cworICAgICAgIyBlLmcuIERhcndpbiAtPiBEaXJSZXNjYW4sIElOb3RpZnkgLT4gTW92ZVNjYW4sIGV0Yy4KKyAgICAgIGRlZiBfcXVldWVfY2hhbmdlKHR5cGUsIGRpciwgcmVsX3BhdGgsIG9wdGlvbnMpCisgICAgICAgIEBzbmFwc2hvdHNbZGlyXS5pbnZhbGlkYXRlKHR5cGUsIHJlbF9wYXRoLCBvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfbG9nKCphcmdzLCAmYmxvY2spCisgICAgICAgIHNlbGYuY2xhc3Muc2VuZCg6X2xvZywgKmFyZ3MsICZibG9jaykKKyAgICAgIGVuZAorCisgICAgICBkZWYgX2xvZ19leGNlcHRpb24obXNnLCBjYWxsZXJfc3RhY2spCisgICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdCgKKyAgICAgICAgICBtc2csCisgICAgICAgICAgJEVSUk9SX0lORk8sCisgICAgICAgICAgJEVSUk9SX1BPU0lUSU9OICogIlxuIiwKKyAgICAgICAgICBjYWxsZXJfc3RhY2sgKiAiXG4iCisgICAgICAgICkKKworICAgICAgICBfbG9nKDplcnJvciwgZm9ybWF0dGVkKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLl9sb2coKmFyZ3MsICZibG9jaykKKyAgICAgICAgTGlzdGVuOjpMb2dnZXIuc2VuZCgqYXJncywgJmJsb2NrKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9hZGFwdGVyL2JzZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvYnNkLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTkwNDkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9hZGFwdGVyL2JzZC5yYgpAQCAtMCwwICsxLDEwNiBAQAorIyBMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBmb3IgQlNEJ3MgYGtxdWV1ZWAuCisjIEBzZWUgaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvbWFuLmNnaT9xdWVyeT1rcXVldWUKKyMgQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWF0ODEzL3JiLWtxdWV1ZS9ibG9iL21hc3Rlci9saWIvcmIta3F1ZXVlL3F1ZXVlLnJiCisjCittb2R1bGUgTGlzdGVuCisgIG1vZHVsZSBBZGFwdGVyCisgICAgY2xhc3MgQlNEIDwgQmFzZQorICAgICAgT1NfUkVHRVhQID0gL2JzZHxkcmFnb25mbHkvaQorCisgICAgICBERUZBVUxUUyA9IHsKKyAgICAgICAgZXZlbnRzOiBbCisgICAgICAgICAgOmRlbGV0ZSwKKyAgICAgICAgICA6d3JpdGUsCisgICAgICAgICAgOmV4dGVuZCwKKyAgICAgICAgICA6YXR0cmliLAorICAgICAgICAgIDpyZW5hbWUKKyAgICAgICAgICAjIDpsaW5rLCA6cmV2b2tlCisgICAgICAgIF0KKyAgICAgIH0KKworICAgICAgQlVORExFUl9ERUNMQVJFX0dFTSA9IDw8LUVPUy5nc3ViKC9eIHs2fS8sICcnKQorICAgICAgICBQbGVhc2UgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBHZW1maWxlIHRvIGF2b2lkIHBvbGxpbmcgZm9yIGNoYW5nZXM6CisgICAgICAgICAgcmVxdWlyZSAncmJjb25maWcnCisgICAgICAgICAgaWYgUmJDb25maWc6OkNPTkZJR1sndGFyZ2V0X29zJ10gPX4gLyN7T1NfUkVHRVhQfS8KKyAgICAgICAgICAgIGdlbSAncmIta3F1ZXVlJywgJz49IDAuMicKKyAgICAgICAgICBlbmQKKyAgICAgIEVPUworCisgICAgICBkZWYgc2VsZi51c2FibGU/CisgICAgICAgIHJldHVybiBmYWxzZSB1bmxlc3Mgc3VwZXIKKyAgICAgICAgcmVxdWlyZSAncmIta3F1ZXVlJworICAgICAgICByZXF1aXJlICdmaW5kJworICAgICAgICB0cnVlCisgICAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICAgIEtlcm5lbC53YXJuIEJVTkRMRVJfREVDTEFSRV9HRU0KKyAgICAgICAgZmFsc2UKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBfY29uZmlndXJlKGRpcmVjdG9yeSwgJl9jYWxsYmFjaykKKyAgICAgICAgQHdvcmtlciB8fD0gS1F1ZXVlOjpRdWV1ZS5uZXcKKyAgICAgICAgQGNhbGxiYWNrID0gX2NhbGxiYWNrCisgICAgICAgICMgdXNlIFJlY29yZCB0byBtYWtlIGEgc25hcHNob3Qgb2YgZGlyLCBzbyB3ZQorICAgICAgICAjIGNhbiBkZXRlY3QgbmV3IGZpbGVzCisgICAgICAgIF9maW5kKGRpcmVjdG9yeS50b19zKSB7IHxwYXRofCBfd2F0Y2hfZmlsZShwYXRoLCBAd29ya2VyKSB9CisgICAgICBlbmQKKworICAgICAgZGVmIF9ydW4KKyAgICAgICAgQHdvcmtlci5ydW4KKyAgICAgIGVuZAorCisgICAgICBkZWYgX3Byb2Nlc3NfZXZlbnQoZGlyLCBldmVudCkKKyAgICAgICAgZnVsbF9wYXRoID0gX2V2ZW50X3BhdGgoZXZlbnQpCisgICAgICAgIGlmIGZ1bGxfcGF0aC5kaXJlY3Rvcnk/CisgICAgICAgICAgIyBGb3JjZSBkaXIgY29udGVudCB0cmFja2luZyB0byBraWNrIGluLCBvciB3ZSB3b24ndCBoYXZlCisgICAgICAgICAgIyBuYW1lcyBvZiBhZGRlZCBmaWxlcworICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCAnLicsIHJlY3Vyc2l2ZTogdHJ1ZSkKKyAgICAgICAgZWxzaWYgZnVsbF9wYXRoLmV4aXN0PworICAgICAgICAgIHBhdGggPSBmdWxsX3BhdGgucmVsYXRpdmVfcGF0aF9mcm9tKGRpcikKKyAgICAgICAgICBfcXVldWVfY2hhbmdlKDpmaWxlLCBkaXIsIHBhdGgudG9fcywgY2hhbmdlOiBfY2hhbmdlKGV2ZW50LmZsYWdzKSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBJZiBpdCBpcyBhIGRpcmVjdG9yeSwgYW5kIGl0IGhhcyBhIHdyaXRlIGZsYWcsIGl0IG1lYW5zIGEKKyAgICAgICAgIyBmaWxlIGhhcyBiZWVuIGFkZGVkIHNvIGZpbmQgb3V0IHdoaWNoIGFuZCBkZWFsIHdpdGggaXQuCisgICAgICAgICMgTm8gbmVlZCB0byBjaGVjayBmb3IgcmVtb3ZlZCBmaWxlcywga3F1ZXVlIHdpbGwgZm9yZ2V0IHRoZW0KKyAgICAgICAgIyB3aGVuIHRoZSB2ZnMgZG9lcy4KKyAgICAgICAgX3dhdGNoX2Zvcl9uZXdfZmlsZShldmVudCkgaWYgZnVsbF9wYXRoLmRpcmVjdG9yeT8KKyAgICAgIGVuZAorCisgICAgICBkZWYgX2NoYW5nZShldmVudF9mbGFncykKKyAgICAgICAgeyBtb2RpZmllZDogWzphdHRyaWIsIDpleHRlbmRdLAorICAgICAgICAgIGFkZGVkOiAgICBbOndyaXRlXSwKKyAgICAgICAgICByZW1vdmVkOiAgWzpyZW5hbWUsIDpkZWxldGVdCisgICAgICAgIH0uZWFjaCBkbyB8Y2hhbmdlLCBmbGFnc3wKKyAgICAgICAgICByZXR1cm4gY2hhbmdlIHVubGVzcyAoZmxhZ3MgJiBldmVudF9mbGFncykuZW1wdHk/CisgICAgICAgIGVuZAorICAgICAgICBuaWwKKyAgICAgIGVuZAorCisgICAgICBkZWYgX2V2ZW50X3BhdGgoZXZlbnQpCisgICAgICAgIFBhdGhuYW1lLm5ldyhldmVudC53YXRjaGVyLnBhdGgpCisgICAgICBlbmQKKworICAgICAgZGVmIF93YXRjaF9mb3JfbmV3X2ZpbGUoZXZlbnQpCisgICAgICAgIHF1ZXVlID0gZXZlbnQud2F0Y2hlci5xdWV1ZQorICAgICAgICBfZmluZChfZXZlbnRfcGF0aChldmVudCkudG9fcykgZG8gfGZpbGVfcGF0aHwKKyAgICAgICAgICB1bmxlc3MgcXVldWUud2F0Y2hlcnMuZGV0ZWN0IHsgfF8sIHZ8IHYucGF0aCA9PSBmaWxlX3BhdGgudG9fcyB9CisgICAgICAgICAgICBfd2F0Y2hfZmlsZShmaWxlX3BhdGgsIHF1ZXVlKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3dhdGNoX2ZpbGUocGF0aCwgcXVldWUpCisgICAgICAgIHF1ZXVlLndhdGNoX2ZpbGUocGF0aCwgKm9wdGlvbnMuZXZlbnRzLCAmQGNhbGxiYWNrKQorICAgICAgcmVzY3VlIEVycm5vOjpFTk9FTlQgPT4gZQorICAgICAgICBfbG9nIDp3YXJuLCAia3F1ZXVlOiB3YXRjaCBmaWxlIGZhaWxlZDogI3tlLm1lc3NhZ2V9IgorICAgICAgZW5kCisKKyAgICAgICMgUXVpY2sgcnVib2NvcCB3b3JrYXJvdW5kCisgICAgICBkZWYgX2ZpbmQoKnBhdGhzLCAmYmxvY2spCisgICAgICAgIEZpbmQuc2VuZCg6ZmluZCwgKnBhdGhzLCAmYmxvY2spCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvY29uZmlnLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vYWRhcHRlci9jb25maWcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNTY3YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvY29uZmlnLnJiCkBAIC0wLDAgKzEsMjYgQEAKK3JlcXVpcmUgJ3BhdGhuYW1lJworCittb2R1bGUgTGlzdGVuCisgIG1vZHVsZSBBZGFwdGVyCisgICAgY2xhc3MgQ29uZmlnCisgICAgICBhdHRyX3JlYWRlciA6ZGlyZWN0b3JpZXMKKyAgICAgIGF0dHJfcmVhZGVyIDpzaWxlbmNlcgorICAgICAgYXR0cl9yZWFkZXIgOnF1ZXVlCisgICAgICBhdHRyX3JlYWRlciA6YWRhcHRlcl9vcHRpb25zCisKKyAgICAgIGRlZiBpbml0aWFsaXplKGRpcmVjdG9yaWVzLCBxdWV1ZSwgc2lsZW5jZXIsIGFkYXB0ZXJfb3B0aW9ucykKKyAgICAgICAgIyBEZWZhdWx0IHRvIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vIGRpcmVjdG9yaWVzIGFyZSBzdXBwbGllZAorICAgICAgICBkaXJlY3RvcmllcyA9IFtEaXIucHdkXSBpZiBkaXJlY3Rvcmllcy50b19hLmVtcHR5PworICAgICAgICAKKyAgICAgICAgIyBUT0RPOiBmaXggKGZsYXR0ZW4sIGFycmF5LCBjb21wYWN0PykKKyAgICAgICAgQGRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXMubWFwIGRvIHxkaXJlY3Rvcnl8CisgICAgICAgICAgUGF0aG5hbWUubmV3KGRpcmVjdG9yeS50b19zKS5yZWFscGF0aAorICAgICAgICBlbmQKKworICAgICAgICBAc2lsZW5jZXIgPSBzaWxlbmNlcgorICAgICAgICBAcXVldWUgPSBxdWV1ZQorICAgICAgICBAYWRhcHRlcl9vcHRpb25zID0gYWRhcHRlcl9vcHRpb25zCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvZGFyd2luLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vYWRhcHRlci9kYXJ3aW4ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhY2Y5NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvZGFyd2luLnJiCkBAIC0wLDAgKzEsODggQEAKK3JlcXVpcmUgJ3RocmVhZCcKK3JlcXVpcmUgJ2xpc3Rlbi9pbnRlcm5hbHMvdGhyZWFkX3Bvb2wnCisKK21vZHVsZSBMaXN0ZW4KKyAgbW9kdWxlIEFkYXB0ZXIKKyAgICAjIEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gZm9yIE1hYyBPUyBYIGBGU0V2ZW50c2AuCisgICAgIworICAgIGNsYXNzIERhcndpbiA8IEJhc2UKKyAgICAgIE9TX1JFR0VYUCA9IC9kYXJ3aW4oPzxtYWpvcl92ZXJzaW9uPjFcZCspL2kKKworICAgICAgIyBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNoZWNraW5nIGZvciBjaGFuZ2VzLgorICAgICAgREVGQVVMVFMgPSB7IGxhdGVuY3k6IDAuMSB9CisKKyAgICAgIElOQ09NUEFUSUJMRV9HRU1fVkVSU0lPTiA9IDw8LUVPUy5nc3ViKC9eIHs4fS8sICcnKQorICAgICAgICByYi1mc2V2ZW50ID4gMC45LjQgbm8gbG9uZ2VyIHN1cHBvcnRzIE9TIFggMTAuNiB0aHJvdWdoIDEwLjguCisKKyAgICAgICAgUGxlYXNlIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgR2VtZmlsZSB0byBhdm9pZCBwb2xsaW5nIGZvciBjaGFuZ2VzOgorICAgICAgICAgIHJlcXVpcmUgJ3JiY29uZmlnJworICAgICAgICAgIGlmIFJiQ29uZmlnOjpDT05GSUdbJ3RhcmdldF9vcyddID1+IC9kYXJ3aW4oMVswLTNdKS9pCisgICAgICAgICAgICBnZW0gJ3JiLWZzZXZlbnQnLCAnPD0gMC45LjQnCisgICAgICAgICAgZW5kCisgICAgICBFT1MKKworICAgICAgZGVmIHNlbGYudXNhYmxlPworICAgICAgICByZXF1aXJlICdyYi1mc2V2ZW50JworICAgICAgICBkYXJ3aW5fdmVyc2lvbiA9IFJiQ29uZmlnOjpDT05GSUdbJ3RhcmdldF9vcyddW09TX1JFR0VYUCwgOm1ham9yX3ZlcnNpb25dIG9yIHJldHVybiBmYWxzZQorICAgICAgICByZXR1cm4gdHJ1ZSBpZiBkYXJ3aW5fdmVyc2lvbi50b19pID49IDEzICMgZGFyd2luMTMgaXMgT1MgWCAxMC45CisgICAgICAgIHJldHVybiB0cnVlIGlmIEdlbTo6VmVyc2lvbi5uZXcoRlNFdmVudDo6VkVSU0lPTikgPD0gR2VtOjpWZXJzaW9uLm5ldygnMC45LjQnKQorICAgICAgICBLZXJuZWwud2FybiBJTkNPTVBBVElCTEVfR0VNX1ZFUlNJT04KKyAgICAgICAgZmFsc2UKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgICMgTk9URTogZWFjaCBkaXJlY3RvcnkgZ2V0cyBhIERJRkZFUkVOVCBjYWxsYmFjayEKKyAgICAgIGRlZiBfY29uZmlndXJlKGRpciwgJmNhbGxiYWNrKQorICAgICAgICBvcHRzID0geyBsYXRlbmN5OiBvcHRpb25zLmxhdGVuY3kgfQorCisgICAgICAgIEB3b3JrZXJzIHx8PSA6OlF1ZXVlLm5ldworICAgICAgICBAd29ya2VycyA8PCBGU0V2ZW50Lm5ldy50YXAgZG8gfHdvcmtlcnwKKyAgICAgICAgICBfbG9nIDpkZWJ1ZywgImZzZXZlbnQ6IHdhdGNoaW5nOiAje2Rpci50b19zLmluc3BlY3R9IgorICAgICAgICAgIHdvcmtlci53YXRjaChkaXIudG9fcywgb3B0cywgJmNhbGxiYWNrKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3J1bgorICAgICAgICBmaXJzdCA9IEB3b3JrZXJzLnBvcAorCisgICAgICAgICMgTk9URTogX3J1biBpcyBjYWxsZWQgd2l0aGluIGEgdGhyZWFkLCBzbyBydW4gZXZlcnkgb3RoZXIKKyAgICAgICAgIyB3b3JrZXIgaW4gaXQncyBvd24gdGhyZWFkCisgICAgICAgIF9ydW5fd29ya2Vyc19pbl9iYWNrZ3JvdW5kKF90b19hcnJheShAd29ya2VycykpCisgICAgICAgIF9ydW5fd29ya2VyKGZpcnN0KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfcHJvY2Vzc19ldmVudChkaXIsIGV2ZW50KQorICAgICAgICBfbG9nIDpkZWJ1ZywgImZzZXZlbnQ6IHByb2Nlc3NpbmcgZXZlbnQ6ICN7ZXZlbnQuaW5zcGVjdH0iCisgICAgICAgIGV2ZW50LmVhY2ggZG8gfHBhdGh8CisgICAgICAgICAgbmV3X3BhdGggPSBQYXRobmFtZS5uZXcocGF0aC5zdWIoL1wvJC8sICcnKSkKKyAgICAgICAgICBfbG9nIDpkZWJ1ZywgImZzZXZlbnQ6ICN7bmV3X3BhdGh9IgorICAgICAgICAgICMgVE9ETzogZG9lcyB0aGlzIHByZXNlcnZlIHN5bWxpbmtzPworICAgICAgICAgIHJlbF9wYXRoID0gbmV3X3BhdGgucmVsYXRpdmVfcGF0aF9mcm9tKGRpcikudG9fcworICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCByZWxfcGF0aCwgcmVjdXJzaXZlOiB0cnVlKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3J1bl93b3JrZXIod29ya2VyKQorICAgICAgICBfbG9nIDpkZWJ1ZywgImZzZXZlbnQ6IHJ1bm5pbmcgd29ya2VyOiAje3dvcmtlci5pbnNwZWN0fSIKKyAgICAgICAgd29ya2VyLnJ1bgorICAgICAgcmVzY3VlCisgICAgICAgIF9sb2dfZXhjZXB0aW9uICdmc2V2ZW50OiBydW5uaW5nIHdvcmtlciBmYWlsZWQ6ICVzOiVzIGNhbGxlZCBmcm9tOiAlcycsIGNhbGxlcgorICAgICAgZW5kCisKKyAgICAgIGRlZiBfcnVuX3dvcmtlcnNfaW5fYmFja2dyb3VuZCh3b3JrZXJzKQorICAgICAgICB3b3JrZXJzLmVhY2ggZG8gfHdvcmtlcnwKKyAgICAgICAgICAjIE5PVEU6IHdoaWxlIHBhc3NpbmcgbG9jYWwgdmFyaWFibGVzIHRvIHRoZSBibG9jayBiZWxvdyBpcyBub3QKKyAgICAgICAgICAjIHRocmVhZCBzYWZlLCB1c2luZyAnd29ya2VyJyBmcm9tIHRoZSBlbnVtZXJhdG9yIGFib3ZlIGlzIG9rCisgICAgICAgICAgTGlzdGVuOjpJbnRlcm5hbHM6OlRocmVhZFBvb2wuYWRkIHsgX3J1bl93b3JrZXIod29ya2VyKSB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBfdG9fYXJyYXkocXVldWUpCisgICAgICAgIHdvcmtlcnMgPSBbXQorICAgICAgICB3b3JrZXJzIDw8IHF1ZXVlLnBvcCB1bnRpbCBxdWV1ZS5lbXB0eT8KKyAgICAgICAgd29ya2VycworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9hZGFwdGVyL2xpbnV4LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vYWRhcHRlci9saW51eC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI5Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vYWRhcHRlci9saW51eC5yYgpAQCAtMCwwICsxLDEwOCBAQAorbW9kdWxlIExpc3RlbgorICBtb2R1bGUgQWRhcHRlcgorICAgICMgQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmV4My9yYi1pbm90aWZ5CisgICAgY2xhc3MgTGludXggPCBCYXNlCisgICAgICBPU19SRUdFWFAgPSAvbGludXgvaQorCisgICAgICBERUZBVUxUUyA9IHsKKyAgICAgICAgZXZlbnRzOiBbCisgICAgICAgICAgOnJlY3Vyc2l2ZSwKKyAgICAgICAgICA6YXR0cmliLAorICAgICAgICAgIDpjcmVhdGUsCisgICAgICAgICAgOmRlbGV0ZSwKKyAgICAgICAgICA6bW92ZSwKKyAgICAgICAgICA6Y2xvc2Vfd3JpdGUKKyAgICAgICAgXSwKKyAgICAgICAgd2FpdF9mb3JfZGVsYXk6IDAuMQorICAgICAgfQorCisgICAgICBwcml2YXRlCisKKyAgICAgIFdJS0lfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4nXAorICAgICAgICAnL3dpa2kvSW5jcmVhc2luZy10aGUtYW1vdW50LW9mLWlub3RpZnktd2F0Y2hlcnMnCisKKyAgICAgIElOT1RJRllfTElNSVRfTUVTU0FHRSA9IDw8LUVPUy5nc3ViKC9eXHMqLywgJycpCisgICAgICAgIEZBVEFMOiBMaXN0ZW4gZXJyb3I6IHVuYWJsZSB0byBtb25pdG9yIGRpcmVjdG9yaWVzIGZvciBjaGFuZ2VzLgorICAgICAgICBWaXNpdCAje1dJS0lfVVJMfSBmb3IgaW5mbyBvbiBob3cgdG8gZml4IHRoaXMuCisgICAgICBFT1MKKworICAgICAgZGVmIF9jb25maWd1cmUoZGlyZWN0b3J5LCAmY2FsbGJhY2spCisgICAgICAgIHJlcXVpcmUgJ3JiLWlub3RpZnknCisgICAgICAgIEB3b3JrZXIgfHw9IDo6SU5vdGlmeTo6Tm90aWZpZXIubmV3CisgICAgICAgIEB3b3JrZXIud2F0Y2goZGlyZWN0b3J5LnRvX3MsICpvcHRpb25zLmV2ZW50cywgJmNhbGxiYWNrKQorICAgICAgcmVzY3VlIEVycm5vOjpFTk9TUEMKKyAgICAgICAgYWJvcnQoSU5PVElGWV9MSU1JVF9NRVNTQUdFKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfcnVuCisgICAgICAgIFRocmVhZC5jdXJyZW50WzpsaXN0ZW5fYmxvY2tpbmdfcmVhZF90aHJlYWRdID0gdHJ1ZQorICAgICAgICBAd29ya2VyLnJ1bgorICAgICAgICBUaHJlYWQuY3VycmVudFs6bGlzdGVuX2Jsb2NraW5nX3JlYWRfdGhyZWFkXSA9IGZhbHNlCisgICAgICBlbmQKKworICAgICAgZGVmIF9wcm9jZXNzX2V2ZW50KGRpciwgZXZlbnQpCisgICAgICAgICMgTk9URTogYXZvaWQgdXNpbmcgZXZlbnQuYWJzb2x1dGVfbmFtZSBzaW5jZSBuZXcgQVBJCisgICAgICAgICMgd2lsbCBuZWVkIHRvIGhhdmUgYSBjdXN0b20gcmVjdXJzaW9uIGltcGxlbWVudGVkCisgICAgICAgICMgdG8gcHJvcGVybHkgbWF0Y2ggZXZlbnRzIHRvIGNvbmZpZ3VyZWQgZGlyZWN0b3JpZXMKKyAgICAgICAgcGF0aCA9IFBhdGhuYW1lLm5ldyhldmVudC53YXRjaGVyLnBhdGgpICsgZXZlbnQubmFtZQorICAgICAgICByZWxfcGF0aCA9IHBhdGgucmVsYXRpdmVfcGF0aF9mcm9tKGRpcikudG9fcworCisgICAgICAgIF9sb2coOmRlYnVnKSB7ICJpbm90aWZ5OiAje3JlbF9wYXRofSAoI3tldmVudC5mbGFncy5pbnNwZWN0fSkiIH0KKworICAgICAgICBpZiAvMXx0cnVlLyA9fiBFTlZbJ0xJU1RFTl9HRU1fU0lNVUxBVEVfRlNFVkVOVCddCisgICAgICAgICAgaWYgKGV2ZW50LmZsYWdzICYgWzptb3ZlZF90bywgOm1vdmVkX2Zyb21dKSB8fCBfZGlyX2V2ZW50PyhldmVudCkKKyAgICAgICAgICAgIHJlbF9wYXRoID0gcGF0aC5kaXJuYW1lLnJlbGF0aXZlX3BhdGhfZnJvbShkaXIpLnRvX3MKKyAgICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCByZWxfcGF0aCwge30pCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX3F1ZXVlX2NoYW5nZSg6ZGlyLCBkaXIsIHJlbF9wYXRoLCB7fSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW5kCisKKyAgICAgICAgcmV0dXJuIGlmIF9za2lwX2V2ZW50PyhldmVudCkKKworICAgICAgICBjb29raWVfcGFyYW1zID0gZXZlbnQuY29va2llLnplcm8/ID8ge30gOiB7IGNvb2tpZTogZXZlbnQuY29va2llIH0KKworICAgICAgICAjIE5vdGU6IGRvbid0IHBhc3Mgb3B0aW9ucyB0byBmb3JjZSByZXNjYW5uaW5nIHRoZSBkaXJlY3RvcnksIHNvIHdlIGNhbgorICAgICAgICAjIGRldGVjdCBtb3ZpbmcvZGVsZXRpbmcgYSB3aG9sZSB0cmVlCisgICAgICAgIGlmIF9kaXJfZXZlbnQ/KGV2ZW50KQorICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCByZWxfcGF0aCwgY29va2llX3BhcmFtcykKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW5kCisKKyAgICAgICAgcGFyYW1zID0gY29va2llX3BhcmFtcy5tZXJnZShjaGFuZ2U6IF9jaGFuZ2UoZXZlbnQuZmxhZ3MpKQorCisgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmZpbGUsIGRpciwgcmVsX3BhdGgsIHBhcmFtcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3NraXBfZXZlbnQ/KGV2ZW50KQorICAgICAgICAjIEV2ZW50IG9uIHJvb3QgZGlyZWN0b3J5CisgICAgICAgIHJldHVybiB0cnVlIGlmIGV2ZW50Lm5hbWUgPT0gJycKKyAgICAgICAgIyBJTm90aWZ5IHJlcG9ydHMgY2hhbmdlcyB0byBmaWxlcyBpbnNpZGUgZGlyZWN0b3JpZXMgYXMgZXZlbnRzCisgICAgICAgICMgb24gdGhlIGRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMgdG9vLgorICAgICAgICAjCisgICAgICAgICMgQHNlZSBodHRwOi8vbGludXguZGllLm5ldC9tYW4vNy9pbm90aWZ5CisgICAgICAgIF9kaXJfZXZlbnQ/KGV2ZW50KSAmJiAoZXZlbnQuZmxhZ3MgJiBbOmNsb3NlLCA6bW9kaWZ5XSkuYW55PworICAgICAgZW5kCisKKyAgICAgIGRlZiBfY2hhbmdlKGV2ZW50X2ZsYWdzKQorICAgICAgICB7IG1vZGlmaWVkOiAgIFs6YXR0cmliLCA6Y2xvc2Vfd3JpdGVdLAorICAgICAgICAgIG1vdmVkX3RvOiAgIFs6bW92ZWRfdG9dLAorICAgICAgICAgIG1vdmVkX2Zyb206IFs6bW92ZWRfZnJvbV0sCisgICAgICAgICAgYWRkZWQ6ICAgICAgWzpjcmVhdGVdLAorICAgICAgICAgIHJlbW92ZWQ6ICAgIFs6ZGVsZXRlXSB9LmVhY2ggZG8gfGNoYW5nZSwgZmxhZ3N8CisgICAgICAgICAgcmV0dXJuIGNoYW5nZSB1bmxlc3MgKGZsYWdzICYgZXZlbnRfZmxhZ3MpLmVtcHR5PworICAgICAgICBlbmQKKyAgICAgICAgbmlsCisgICAgICBlbmQKKworICAgICAgZGVmIF9kaXJfZXZlbnQ/KGV2ZW50KQorICAgICAgICBldmVudC5mbGFncy5pbmNsdWRlPyg6aXNkaXIpCisgICAgICBlbmQKKworICAgICAgZGVmIF9zdG9wCisgICAgICAgIEB3b3JrZXIgJiYgQHdvcmtlci5jbG9zZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9hZGFwdGVyL3BvbGxpbmcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9hZGFwdGVyL3BvbGxpbmcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkNTdiZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvcG9sbGluZy5yYgpAQCAtMCwwICsxLDM3IEBACittb2R1bGUgTGlzdGVuCisgIG1vZHVsZSBBZGFwdGVyCisgICAgIyBQb2xsaW5nIEFkYXB0ZXIgdGhhdCB3b3JrcyBjcm9zcy1wbGF0Zm9ybSBhbmQKKyAgICAjIGhhcyBubyBkZXBlbmRlbmNpZXMuIFRoaXMgaXMgdGhlIGFkYXB0ZXIgdGhhdAorICAgICMgdXNlcyB0aGUgbW9zdCBDUFUgcHJvY2Vzc2luZyBwb3dlciBhbmQgaGFzIGhpZ2hlcgorICAgICMgZmlsZSBJTyB0aGFuIHRoZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMuCisgICAgIworICAgIGNsYXNzIFBvbGxpbmcgPCBCYXNlCisgICAgICBPU19SRUdFWFAgPSAvLyAjIG1hdGNoIGV2ZXJ5IE9TCisKKyAgICAgIERFRkFVTFRTID0geyBsYXRlbmN5OiAxLjAsIHdhaXRfZm9yX2RlbGF5OiAwLjA1IH0KKworICAgICAgcHJpdmF0ZQorCisgICAgICBkZWYgX2NvbmZpZ3VyZShfLCAmY2FsbGJhY2spCisgICAgICAgIEBwb2xsaW5nX2NhbGxiYWNrcyB8fD0gW10KKyAgICAgICAgQHBvbGxpbmdfY2FsbGJhY2tzIDw8IGNhbGxiYWNrCisgICAgICBlbmQKKworICAgICAgZGVmIF9ydW4KKyAgICAgICAgbG9vcCBkbworICAgICAgICAgIHN0YXJ0ID0gVGltZS5ub3cudG9fZgorICAgICAgICAgIEBwb2xsaW5nX2NhbGxiYWNrcy5lYWNoIGRvIHxjYWxsYmFja3wKKyAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwobmlsKQorICAgICAgICAgICAgbmFwX3RpbWUgPSBvcHRpb25zLmxhdGVuY3kgLSAoVGltZS5ub3cudG9fZiAtIHN0YXJ0KQorICAgICAgICAgICAgIyBUT0RPOiB3YXJuIGlmIG5hcF90aW1lIGlzIG5lZ2F0aXZlIChwb2xsaW5nIHRvbyBzbG93KQorICAgICAgICAgICAgc2xlZXAobmFwX3RpbWUpIGlmIG5hcF90aW1lID4gMAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3Byb2Nlc3NfZXZlbnQoZGlyLCBfKQorICAgICAgICBfcXVldWVfY2hhbmdlKDpkaXIsIGRpciwgJy4nLCByZWN1cnNpdmU6IHRydWUpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvd2luZG93cy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2FkYXB0ZXIvd2luZG93cy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTVmYjRjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vYWRhcHRlci93aW5kb3dzLnJiCkBAIC0wLDAgKzEsOTkgQEAKK21vZHVsZSBMaXN0ZW4KKyAgbW9kdWxlIEFkYXB0ZXIKKyAgICAjIEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gZm9yIFdpbmRvd3MgYHdkbWAuCisgICAgIworICAgIGNsYXNzIFdpbmRvd3MgPCBCYXNlCisgICAgICBPU19SRUdFWFAgPSAvbXN3aW58bWluZ3d8Y3lnd2luL2kKKworICAgICAgQlVORExFUl9ERUNMQVJFX0dFTSA9IDw8LUVPUy5nc3ViKC9eIHs2fS8sICcnKQorICAgICAgICBQbGVhc2UgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBHZW1maWxlIHRvIGF2b2lkIHBvbGxpbmcgZm9yIGNoYW5nZXM6CisgICAgICAgICAgZ2VtICd3ZG0nLCAnPj0gMC4xLjAnIGlmIEdlbS53aW5fcGxhdGZvcm0/CisgICAgICBFT1MKKworICAgICAgZGVmIHNlbGYudXNhYmxlPworICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHN1cGVyCisgICAgICAgIHJlcXVpcmUgJ3dkbScKKyAgICAgICAgdHJ1ZQorICAgICAgcmVzY3VlIExvYWRFcnJvcgorICAgICAgICBfbG9nIDpkZWJ1ZywgZm9ybWF0KCd3ZG0gLSBsb2FkIGZhaWxlZDogJXM6JXMnLCAkRVJST1JfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRVJST1JfUE9TSVRJT04gKiAiXG4iKQorCisgICAgICAgIEtlcm5lbC53YXJuIEJVTkRMRVJfREVDTEFSRV9HRU0KKyAgICAgICAgZmFsc2UKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBfY29uZmlndXJlKGRpciwgJmNhbGxiYWNrKQorICAgICAgICByZXF1aXJlICd3ZG0nCisgICAgICAgIF9sb2cgOmRlYnVnLCAnd2RtIC0gc3RhcnRpbmcuLi4nCisgICAgICAgIEB3b3JrZXIgfHw9IFdETTo6TW9uaXRvci5uZXcKKyAgICAgICAgQHdvcmtlci53YXRjaF9yZWN1cnNpdmVseShkaXIudG9fcywgOmZpbGVzKSBkbyB8Y2hhbmdlfAorICAgICAgICAgIGNhbGxiYWNrLmNhbGwoWzpmaWxlLCBjaGFuZ2VdKQorICAgICAgICBlbmQKKworICAgICAgICBAd29ya2VyLndhdGNoX3JlY3Vyc2l2ZWx5KGRpci50b19zLCA6ZGlyZWN0b3JpZXMpIGRvIHxjaGFuZ2V8CisgICAgICAgICAgY2FsbGJhY2suY2FsbChbOmRpciwgY2hhbmdlXSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgZXZlbnRzID0gWzphdHRyaWJ1dGVzLCA6bGFzdF93cml0ZV0KKyAgICAgICAgQHdvcmtlci53YXRjaF9yZWN1cnNpdmVseShkaXIudG9fcywgKmV2ZW50cykgZG8gfGNoYW5nZXwKKyAgICAgICAgICBjYWxsYmFjay5jYWxsKFs6YXR0ciwgY2hhbmdlXSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIF9ydW4KKyAgICAgICAgQHdvcmtlci5ydW4hCisgICAgICBlbmQKKworICAgICAgZGVmIF9wcm9jZXNzX2V2ZW50KGRpciwgZXZlbnQpCisgICAgICAgIF9sb2cgOmRlYnVnLCAid2RtIC0gY2FsbGJhY2s6ICN7ZXZlbnQuaW5zcGVjdH0iCisKKyAgICAgICAgdHlwZSwgY2hhbmdlID0gZXZlbnQKKworICAgICAgICBmdWxsX3BhdGggPSBQYXRobmFtZShjaGFuZ2UucGF0aCkKKworICAgICAgICByZWxfcGF0aCA9IGZ1bGxfcGF0aC5yZWxhdGl2ZV9wYXRoX2Zyb20oZGlyKS50b19zCisKKyAgICAgICAgb3B0aW9ucyA9IHsgY2hhbmdlOiBfY2hhbmdlKGNoYW5nZS50eXBlKSB9CisKKyAgICAgICAgY2FzZSB0eXBlCisgICAgICAgIHdoZW4gOmZpbGUKKyAgICAgICAgICBfcXVldWVfY2hhbmdlKDpmaWxlLCBkaXIsIHJlbF9wYXRoLCBvcHRpb25zKQorICAgICAgICB3aGVuIDphdHRyCisgICAgICAgICAgdW5sZXNzIGZ1bGxfcGF0aC5kaXJlY3Rvcnk/CisgICAgICAgICAgICBfcXVldWVfY2hhbmdlKDpmaWxlLCBkaXIsIHJlbF9wYXRoLCBvcHRpb25zKQorICAgICAgICAgIGVuZAorICAgICAgICB3aGVuIDpkaXIKKyAgICAgICAgICBpZiBjaGFuZ2UudHlwZSA9PSA6cmVtb3ZlZAorICAgICAgICAgICAgIyBUT0RPOiBjaGVjayBpZiB3YXRjaGVkIGRpcj8KKyAgICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCBQYXRobmFtZShyZWxfcGF0aCkuZGlybmFtZS50b19zLCB7fSkKKyAgICAgICAgICBlbHNpZiBjaGFuZ2UudHlwZSA9PSA6YWRkZWQKKyAgICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCByZWxfcGF0aCwge30pCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBkbyBub3RoaW5nIC0gY2hhbmdlZCBkaXJlY3RvcnkgbWVhbnMgZWl0aGVyOgorICAgICAgICAgICAgIyAgIC0gcmVtb3ZlZCBzdWJkaXJzIChoYW5kbGVkIGFib3ZlKQorICAgICAgICAgICAgIyAgIC0gYWRkZWQgc3ViZGlycyAoaGFuZGxlZCBhYm92ZSkKKyAgICAgICAgICAgICMgICAtIHJlbW92ZWQgZmlsZXMgKGhhbmRsZWQgYnkgX2ZpbGVfY2FsbGJhY2spCisgICAgICAgICAgICAjICAgLSBhZGRlZCBmaWxlcyAoaGFuZGxlZCBieSBfZmlsZV9jYWxsYmFjaykKKyAgICAgICAgICAgICMgc28gd2hhdCdzIGxlZnQ/CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgcmVzY3VlCisgICAgICAgIGRldGFpbHMgPSBldmVudC5pbnNwZWN0CisgICAgICAgIF9sb2cgOmVycm9yLCBmb3JtYXQoJ3dkbSAtIGNhbGxiYWNrICglKTogJXM6JXMnLCBkZXRhaWxzLCAkRVJST1JfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRVJST1JfUE9TSVRJT04gKiAiXG4iKQorICAgICAgICByYWlzZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfY2hhbmdlKHR5cGUpCisgICAgICAgIHsgbW9kaWZpZWQ6IFs6bW9kaWZpZWQsIDphdHRyaWJdLCAjIFRPRE86IGlzIGF0dHJpYiByZWFsbHkgcGFzc2VkPworICAgICAgICAgIGFkZGVkOiAgICBbOmFkZGVkLCA6cmVuYW1lZF9uZXdfZmlsZV0sCisgICAgICAgICAgcmVtb3ZlZDogIFs6cmVtb3ZlZCwgOnJlbmFtZWRfb2xkX2ZpbGVdIH0uZWFjaCBkbyB8Y2hhbmdlLCB0eXBlc3wKKyAgICAgICAgICByZXR1cm4gY2hhbmdlIGlmIHR5cGVzLmluY2x1ZGU/KHR5cGUpCisgICAgICAgIGVuZAorICAgICAgICBuaWwKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vYmFja2VuZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2JhY2tlbmQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4ZjYwMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2JhY2tlbmQucmIKQEAgLTAsMCArMSw0MyBAQAorcmVxdWlyZSAnbGlzdGVuL2FkYXB0ZXInCityZXF1aXJlICdsaXN0ZW4vYWRhcHRlci9iYXNlJworcmVxdWlyZSAnbGlzdGVuL2FkYXB0ZXIvY29uZmlnJworCityZXF1aXJlICdmb3J3YXJkYWJsZScKKworIyBUaGlzIGNsYXNzIGp1c3QgYWdncmVnYXRlcyBjb25maWd1cmF0aW9uIG9iamVjdCB0byBhdm9pZCBMaXN0ZW5lciBzcGVjcworIyBmcm9tIGV4cGxvZGluZyB3aXRoIGh1Z2UgdGVzdCBzZXR1cCBibG9ja3MKK21vZHVsZSBMaXN0ZW4KKyAgY2xhc3MgQmFja2VuZAorICAgIGRlZiBpbml0aWFsaXplKGRpcmVjdG9yaWVzLCBxdWV1ZSwgc2lsZW5jZXIsIGNvbmZpZykKKyAgICAgIGFkYXB0ZXJfc2VsZWN0X29wdHMgPSBjb25maWcuYWRhcHRlcl9zZWxlY3Rfb3B0aW9ucworCisgICAgICBhZGFwdGVyX2NsYXNzID0gQWRhcHRlci5zZWxlY3QoYWRhcHRlcl9zZWxlY3Rfb3B0cykKKworICAgICAgIyBVc2UgZGVmYXVsdCBmcm9tIGFkYXB0ZXIgaWYgcG9zc2libGUKKyAgICAgIEBtaW5fZGVsYXlfYmV0d2Vlbl9ldmVudHMgPSBjb25maWcubWluX2RlbGF5X2JldHdlZW5fZXZlbnRzCisgICAgICBAbWluX2RlbGF5X2JldHdlZW5fZXZlbnRzIHx8PSBhZGFwdGVyX2NsYXNzOjpERUZBVUxUU1s6d2FpdF9mb3JfZGVsYXldCisgICAgICBAbWluX2RlbGF5X2JldHdlZW5fZXZlbnRzIHx8PSAwLjEKKworICAgICAgYWRhcHRlcl9vcHRzID0gY29uZmlnLmFkYXB0ZXJfaW5zdGFuY2Vfb3B0aW9ucyhhZGFwdGVyX2NsYXNzKQorCisgICAgICBhY29uZmlnID0gQWRhcHRlcjo6Q29uZmlnLm5ldyhkaXJlY3RvcmllcywgcXVldWUsIHNpbGVuY2VyLCBhZGFwdGVyX29wdHMpCisgICAgICBAYWRhcHRlciA9IGFkYXB0ZXJfY2xhc3MubmV3KGFjb25maWcpCisgICAgZW5kCisKKyAgICBkZWYgc3RhcnQKKyAgICAgIGFkYXB0ZXIuc3RhcnQKKyAgICBlbmQKKworICAgIGRlZiBzdG9wCisgICAgICBhZGFwdGVyLnN0b3AKKyAgICBlbmQKKworICAgIGRlZiBtaW5fZGVsYXlfYmV0d2Vlbl9ldmVudHMKKyAgICAgIEBtaW5fZGVsYXlfYmV0d2Vlbl9ldmVudHMKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGF0dHJfcmVhZGVyIDphZGFwdGVyCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9jaGFuZ2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9jaGFuZ2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczMDI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2NoYW5nZS5yYgpAQCAtMCwwICsxLDc4IEBACityZXF1aXJlICdsaXN0ZW4vZmlsZScKK3JlcXVpcmUgJ2xpc3Rlbi9kaXJlY3RvcnknCisKK21vZHVsZSBMaXN0ZW4KKyAgIyBUT0RPOiByZW5hbWUgdG8gU25hcHNob3QKKyAgY2xhc3MgQ2hhbmdlCisgICAgIyBUT0RPOiB0ZXN0IHRoaXMgY2xhc3MgZm9yIGNvdmVyYWdlCisgICAgY2xhc3MgQ29uZmlnCisgICAgICBkZWYgaW5pdGlhbGl6ZShxdWV1ZSwgc2lsZW5jZXIpCisgICAgICAgIEBxdWV1ZSA9IHF1ZXVlCisgICAgICAgIEBzaWxlbmNlciA9IHNpbGVuY2VyCisgICAgICBlbmQKKworICAgICAgZGVmIHNpbGVuY2VkPyhwYXRoLCB0eXBlKQorICAgICAgICBAc2lsZW5jZXIuc2lsZW5jZWQ/KFBhdGhuYW1lKHBhdGgpLCB0eXBlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBxdWV1ZSgqYXJncykKKyAgICAgICAgQHF1ZXVlIDw8IGFyZ3MKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgYXR0cl9yZWFkZXIgOnJlY29yZAorCisgICAgZGVmIGluaXRpYWxpemUoY29uZmlnLCByZWNvcmQpCisgICAgICBAY29uZmlnID0gY29uZmlnCisgICAgICBAcmVjb3JkID0gcmVjb3JkCisgICAgZW5kCisKKyAgICAjIEludmFsaWRhdGUgc29tZSBwYXJ0IG9mIHRoZSBzbmFwc2hvdC9yZWNvcmQgKGRpciwgZmlsZSwgc3VidHJlZSwgZXRjLikKKyAgICBkZWYgaW52YWxpZGF0ZSh0eXBlLCByZWxfcGF0aCwgb3B0aW9ucykKKyAgICAgIHdhdGNoZWRfZGlyID0gUGF0aG5hbWUubmV3KHJlY29yZC5yb290KQorCisgICAgICBjaGFuZ2UgPSBvcHRpb25zWzpjaGFuZ2VdCisgICAgICBjb29raWUgPSBvcHRpb25zWzpjb29raWVdCisKKyAgICAgIGlmICFjb29raWUgJiYgY29uZmlnLnNpbGVuY2VkPyhyZWxfcGF0aCwgdHlwZSkKKyAgICAgICAgTGlzdGVuOjpMb2dnZXIuZGVidWcgeyAgIihzaWxlbmNlZCk6ICN7cmVsX3BhdGguaW5zcGVjdH0iIH0KKyAgICAgICAgcmV0dXJuCisgICAgICBlbmQKKworICAgICAgcGF0aCA9IHdhdGNoZWRfZGlyICsgcmVsX3BhdGgKKworICAgICAgTGlzdGVuOjpMb2dnZXIuZGVidWcgZG8KKyAgICAgICAgbG9nX2RldGFpbHMgPSBvcHRpb25zWzpzaWxlbmNlXSAmJiAncmVjb3JkaW5nJyB8fCBjaGFuZ2UgfHwgJ3Vua25vd24nCisgICAgICAgICIje2xvZ19kZXRhaWxzfTogI3t0eXBlfToje3BhdGh9ICgje29wdGlvbnMuaW5zcGVjdH0pIgorICAgICAgZW5kCisKKyAgICAgIGlmIGNoYW5nZQorICAgICAgICBvcHRpb25zID0gY29va2llID8geyBjb29raWU6IGNvb2tpZSB9IDoge30KKyAgICAgICAgY29uZmlnLnF1ZXVlKHR5cGUsIGNoYW5nZSwgd2F0Y2hlZF9kaXIsIHJlbF9wYXRoLCBvcHRpb25zKQorICAgICAgZWxzZQorICAgICAgICBpZiB0eXBlID09IDpkaXIKKyAgICAgICAgICAjIE5PVEU6IFBPU1NJQkxFIFJFQ1VSU0lPTgorICAgICAgICAgICMgVE9ETzogZml4IC0gdXNlIGEgcXVldWUgaW5zdGVhZAorICAgICAgICAgIERpcmVjdG9yeS5zY2FuKHNlbGYsIHJlbF9wYXRoLCBvcHRpb25zKQorICAgICAgICBlbHNlCisgICAgICAgICAgY2hhbmdlID0gRmlsZS5jaGFuZ2UocmVjb3JkLCByZWxfcGF0aCkKKyAgICAgICAgICByZXR1cm4gaWYgIWNoYW5nZSB8fCBvcHRpb25zWzpzaWxlbmNlXQorICAgICAgICAgIGNvbmZpZy5xdWV1ZSg6ZmlsZSwgY2hhbmdlLCB3YXRjaGVkX2RpciwgcmVsX3BhdGgpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgcmVzY3VlIFJ1bnRpbWVFcnJvciA9PiBleAorICAgICAgbXNnID0gZm9ybWF0KAorICAgICAgICAnJXMjJXMgY3Jhc2hlZCAlczolcycsCisgICAgICAgIHNlbGYuY2xhc3MsCisgICAgICAgIF9fbWV0aG9kX18sCisgICAgICAgIGV4aW5zcGVjdCwKKyAgICAgICAgZXguYmFja3RyYWNlICogIlxuIikKKyAgICAgIExpc3Rlbjo6TG9nZ2VyLmVycm9yKG1zZykKKyAgICAgIHJhaXNlCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBhdHRyX3JlYWRlciA6Y29uZmlnCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9jbGkucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9jbGkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxZjA2MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2NsaS5yYgpAQCAtMCwwICsxLDY1IEBACityZXF1aXJlICd0aG9yJworcmVxdWlyZSAnbGlzdGVuJworcmVxdWlyZSAnbG9nZ2VyJworCittb2R1bGUgTGlzdGVuCisgIGNsYXNzIENMSSA8IFRob3IKKyAgICBkZWZhdWx0X3Rhc2sgOnN0YXJ0CisKKyAgICBkZXNjICdzdGFydCcsICdTdGFydHMgTGlzdGVuJworCisgICAgY2xhc3Nfb3B0aW9uIDp2ZXJib3NlLAorICAgICAgICAgICAgICAgICB0eXBlOiAgICA6Ym9vbGVhbiwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsCisgICAgICAgICAgICAgICAgIGFsaWFzZXM6ICctdicsCisgICAgICAgICAgICAgICAgIGJhbm5lcjogICdWZXJib3NlJworCisgICAgY2xhc3Nfb3B0aW9uIDpkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgIHR5cGU6ICAgIDphcnJheSwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDogJy4nLAorICAgICAgICAgICAgICAgICBhbGlhc2VzOiAnLWQnLAorICAgICAgICAgICAgICAgICBiYW5uZXI6ICAnVGhlIGRpcmVjdG9yeSB0byBsaXN0ZW4gdG8nCisKKyAgICBjbGFzc19vcHRpb24gOnJlbGF0aXZlLAorICAgICAgICAgICAgICAgICB0eXBlOiAgICA6Ym9vbGVhbiwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsCisgICAgICAgICAgICAgICAgIGFsaWFzZXM6ICctcicsCisgICAgICAgICAgICAgICAgIGJhbm5lcjogICdDb252ZXJ0IHBhdGhzIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5JworCisgICAgZGVmIHN0YXJ0CisgICAgICBMaXN0ZW46OkZvcndhcmRlci5uZXcob3B0aW9ucykuc3RhcnQKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgRm9yd2FyZGVyCisgICAgYXR0cl9yZWFkZXIgOmxvZ2dlcgorICAgIGRlZiBpbml0aWFsaXplKG9wdGlvbnMpCisgICAgICBAb3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgIEBsb2dnZXIgPSA6OkxvZ2dlci5uZXcoU1RET1VUKQorICAgICAgQGxvZ2dlci5sZXZlbCA9IDo6TG9nZ2VyOjpJTkZPCisgICAgICBAbG9nZ2VyLmZvcm1hdHRlciA9IHByb2MgeyB8XywgXywgXywgbXNnfCAiI3ttc2d9XG4iIH0KKyAgICBlbmQKKworICAgIGRlZiBzdGFydAorICAgICAgbG9nZ2VyLmluZm8gJ1N0YXJ0aW5nIGxpc3Rlbi4uLicKKyAgICAgIGRpcmVjdG9yeSA9IEBvcHRpb25zWzpkaXJlY3RvcnldCisgICAgICByZWxhdGl2ZSA9IEBvcHRpb25zWzpyZWxhdGl2ZV0KKyAgICAgIGNhbGxiYWNrID0gcHJvYyBkbyB8bW9kaWZpZWQsIGFkZGVkLCByZW1vdmVkfAorICAgICAgICBpZiBAb3B0aW9uc1s6dmVyYm9zZV0KKyAgICAgICAgICBsb2dnZXIuaW5mbyAiKyAje2FkZGVkfSIgdW5sZXNzIGFkZGVkLmVtcHR5PworICAgICAgICAgIGxvZ2dlci5pbmZvICItICN7cmVtb3ZlZH0iIHVubGVzcyByZW1vdmVkLmVtcHR5PworICAgICAgICAgIGxvZ2dlci5pbmZvICI+ICN7bW9kaWZpZWR9IiB1bmxlc3MgbW9kaWZpZWQuZW1wdHk/CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGxpc3RlbmVyID0gTGlzdGVuLnRvKAorICAgICAgICBkaXJlY3RvcnksCisgICAgICAgIHJlbGF0aXZlOiByZWxhdGl2ZSwKKyAgICAgICAgJmNhbGxiYWNrKQorCisgICAgICBsaXN0ZW5lci5zdGFydAorCisgICAgICBzbGVlcCAwLjUgd2hpbGUgbGlzdGVuZXIucHJvY2Vzc2luZz8KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2RpcmVjdG9yeS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2RpcmVjdG9yeS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjllY2FhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vZGlyZWN0b3J5LnJiCkBAIC0wLDAgKzEsODcgQEAKK3JlcXVpcmUgJ3NldCcKKworbW9kdWxlIExpc3RlbgorICAjIFRPRE86IHJlZmFjdG9yICh0dXJuIGl0IGludG8gYSBub3JtYWwgb2JqZWN0LCBjYWNoZSB0aGUgc3RhdCwgZXRjKQorICBjbGFzcyBEaXJlY3RvcnkKKyAgICBkZWYgc2VsZi5zY2FuKHNuYXBzaG90LCByZWxfcGF0aCwgb3B0aW9ucykKKyAgICAgIHJlY29yZCA9IHNuYXBzaG90LnJlY29yZAorICAgICAgZGlyID0gUGF0aG5hbWUubmV3KHJlY29yZC5yb290KQorICAgICAgcHJldmlvdXMgPSByZWNvcmQuZGlyX2VudHJpZXMocmVsX3BhdGgpCisKKyAgICAgIHJlY29yZC5hZGRfZGlyKHJlbF9wYXRoKQorCisgICAgICAjIFRPRE86IHVzZSBjaGlsZHJlbih3aXRoX2RpcmVjdG9yeTogZmFsc2UpCisgICAgICBwYXRoID0gZGlyICsgcmVsX3BhdGgKKyAgICAgIGN1cnJlbnQgPSBTZXQubmV3KF9jaGlsZHJlbihwYXRoKSkKKworICAgICAgTGlzdGVuOjpMb2dnZXIuZGVidWcgZG8KKyAgICAgICAgZm9ybWF0KCclczogJXMoJXMpOiAlcyAtPiAlcycsCisgICAgICAgICAgICAgICAob3B0aW9uc1s6c2lsZW5jZV0gPyAnUmVjb3JkaW5nJyA6ICdTY2FubmluZycpLAorICAgICAgICAgICAgICAgcmVsX3BhdGgsIG9wdGlvbnMuaW5zcGVjdCwgcHJldmlvdXMuaW5zcGVjdCwgY3VycmVudC5pbnNwZWN0KQorICAgICAgZW5kCisKKyAgICAgIGJlZ2luCisgICAgICAgIGN1cnJlbnQuZWFjaCBkbyB8ZnVsbF9wYXRofAorICAgICAgICAgIHR5cGUgPSA6OkZpbGUubHN0YXQoZnVsbF9wYXRoLnRvX3MpLmRpcmVjdG9yeT8gPyA6ZGlyIDogOmZpbGUKKyAgICAgICAgICBpdGVtX3JlbF9wYXRoID0gZnVsbF9wYXRoLnJlbGF0aXZlX3BhdGhfZnJvbShkaXIpLnRvX3MKKyAgICAgICAgICBfY2hhbmdlKHNuYXBzaG90LCB0eXBlLCBpdGVtX3JlbF9wYXRoLCBvcHRpb25zKQorICAgICAgICBlbmQKKyAgICAgIHJlc2N1ZSBFcnJubzo6RU5PRU5UCisgICAgICAgICMgVGhlIGRpcmVjdG9yeSBjaGFuZ2VkIG1lYW53aGlsZSwgc28gcmVzY2FuIGl0CisgICAgICAgIGN1cnJlbnQgPSBTZXQubmV3KF9jaGlsZHJlbihwYXRoKSkKKyAgICAgICAgcmV0cnkKKyAgICAgIGVuZAorCisgICAgICAjIFRPRE86IHRoaXMgaXMgbm90IHRlc3RlZCBwcm9wZXJseQorICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy5yZWplY3QgeyB8ZW50cnksIF98IGN1cnJlbnQuaW5jbHVkZT8gcGF0aCArIGVudHJ5IH0KKworICAgICAgX2FzeW5jX2NoYW5nZXMoc25hcHNob3QsIFBhdGhuYW1lLm5ldyhyZWxfcGF0aCksIHByZXZpb3VzLCBvcHRpb25zKQorCisgICAgcmVzY3VlIEVycm5vOjpFTk9FTlQsIEVycm5vOjpFSE9TVERPV04KKyAgICAgIHJlY29yZC51bnNldF9wYXRoKHJlbF9wYXRoKQorICAgICAgX2FzeW5jX2NoYW5nZXMoc25hcHNob3QsIFBhdGhuYW1lLm5ldyhyZWxfcGF0aCksIHByZXZpb3VzLCBvcHRpb25zKQorCisgICAgcmVzY3VlIEVycm5vOjpFTk9URElSCisgICAgICAjIFRPRE86IHBhdGggbm90IHRlc3RlZAorICAgICAgcmVjb3JkLnVuc2V0X3BhdGgocmVsX3BhdGgpCisgICAgICBfYXN5bmNfY2hhbmdlcyhzbmFwc2hvdCwgcGF0aCwgcHJldmlvdXMsIG9wdGlvbnMpCisgICAgICBfY2hhbmdlKHNuYXBzaG90LCA6ZmlsZSwgcmVsX3BhdGgsIG9wdGlvbnMpCisgICAgcmVzY3VlCisgICAgICBMaXN0ZW46OkxvZ2dlci53YXJuIGRvCisgICAgICAgIGZvcm1hdCgnc2NhbiBESUVEOiAlczolcycsICRFUlJPUl9JTkZPLCAkRVJST1JfUE9TSVRJT04gKiAiXG4iKQorICAgICAgZW5kCisgICAgICByYWlzZQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuX2FzeW5jX2NoYW5nZXMoc25hcHNob3QsIHBhdGgsIHByZXZpb3VzLCBvcHRpb25zKQorICAgICAgZmFpbCAiTm90IGEgUGF0aG5hbWU6ICN7cGF0aC5pbnNwZWN0fSIgdW5sZXNzIHBhdGgucmVzcG9uZF90bz8oOmNoaWxkcmVuKQorICAgICAgcHJldmlvdXMuZWFjaCBkbyB8ZW50cnksIGRhdGF8CisgICAgICAgICMgVE9ETzogdGhpcyBpcyBhIGhhY2sgd2l0aCBpbnN1ZmZpY2llbnQgdGVzdGluZworICAgICAgICB0eXBlID0gZGF0YS5rZXk/KDptdGltZSkgPyA6ZmlsZSA6IDpkaXIKKyAgICAgICAgcmVsX3BhdGhfcyA9IChwYXRoICsgZW50cnkpLnRvX3MKKyAgICAgICAgX2NoYW5nZShzbmFwc2hvdCwgdHlwZSwgcmVsX3BhdGhfcywgb3B0aW9ucykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHNlbGYuX2NoYW5nZShzbmFwc2hvdCwgdHlwZSwgcGF0aCwgb3B0aW9ucykKKyAgICAgIHJldHVybiBzbmFwc2hvdC5pbnZhbGlkYXRlKHR5cGUsIHBhdGgsIG9wdGlvbnMpIGlmIHR5cGUgPT0gOmRpcgorCisgICAgICAjIE1pbm9yIHBhcmFtIGNsZWFudXAgZm9yIHRlc3RzCisgICAgICAjIFRPRE86IHVzZSBhIGRlZGljYXRlZCBFdmVudCBjbGFzcworICAgICAgb3B0cyA9IG9wdGlvbnMuZHVwCisgICAgICBvcHRzLmRlbGV0ZSg6cmVjdXJzaXZlKQorICAgICAgc25hcHNob3QuaW52YWxpZGF0ZSh0eXBlLCBwYXRoLCBvcHRzKQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuX2NoaWxkcmVuKHBhdGgpCisgICAgICByZXR1cm4gcGF0aC5jaGlsZHJlbiB1bmxlc3MgUlVCWV9FTkdJTkUgPT0gJ2pydWJ5JworCisgICAgICAjIEpSdWJ5IGluY29uc2lzdGVuY3kgd29ya2Fyb3VuZCwgc2VlOgorICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vanJ1YnkvanJ1YnkvaXNzdWVzLzM4NDAKKyAgICAgIGV4aXN0cyA9IHBhdGguZXhpc3Q/CisgICAgICBkaXJlY3RvcnkgPSBwYXRoLmRpcmVjdG9yeT8KKyAgICAgIHJldHVybiBwYXRoLmNoaWxkcmVuIHVubGVzcyAoZXhpc3RzICYmICFkaXJlY3RvcnkpCisgICAgICByYWlzZSBFcnJubzo6RU5PVERJUiwgcGF0aC50b19zCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9ldmVudC9jb25maWcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9ldmVudC9jb25maWcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxM2JkNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2V2ZW50L2NvbmZpZy5yYgpAQCAtMCwwICsxLDU5IEBACittb2R1bGUgTGlzdGVuCisgIG1vZHVsZSBFdmVudAorICAgIGNsYXNzIENvbmZpZworICAgICAgZGVmIGluaXRpYWxpemUoCisgICAgICAgIGxpc3RlbmVyLAorICAgICAgICBldmVudF9xdWV1ZSwKKyAgICAgICAgcXVldWVfb3B0aW1pemVyLAorICAgICAgICB3YWl0X2Zvcl9kZWxheSwKKyAgICAgICAgJmJsb2NrKQorCisgICAgICAgIEBsaXN0ZW5lciA9IGxpc3RlbmVyCisgICAgICAgIEBldmVudF9xdWV1ZSA9IGV2ZW50X3F1ZXVlCisgICAgICAgIEBxdWV1ZV9vcHRpbWl6ZXIgPSBxdWV1ZV9vcHRpbWl6ZXIKKyAgICAgICAgQG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cyA9IHdhaXRfZm9yX2RlbGF5CisgICAgICAgIEBibG9jayA9IGJsb2NrCisgICAgICBlbmQKKworICAgICAgZGVmIHNsZWVwKCphcmdzKQorICAgICAgICBLZXJuZWwuc2xlZXAoKmFyZ3MpCisgICAgICBlbmQKKworICAgICAgZGVmIGNhbGwoKmFyZ3MpCisgICAgICAgIEBibG9jay5jYWxsKCphcmdzKSBpZiBAYmxvY2sKKyAgICAgIGVuZAorCisgICAgICBkZWYgdGltZXN0YW1wCisgICAgICAgIFRpbWUubm93LnRvX2YKKyAgICAgIGVuZAorCisgICAgICBkZWYgZXZlbnRfcXVldWUKKyAgICAgICAgQGV2ZW50X3F1ZXVlCisgICAgICBlbmQKKworICAgICAgZGVmIGNhbGxhYmxlPworICAgICAgICBAYmxvY2sKKyAgICAgIGVuZAorCisgICAgICBkZWYgb3B0aW1pemVfY2hhbmdlcyhjaGFuZ2VzKQorICAgICAgICBAcXVldWVfb3B0aW1pemVyLnNtb29zaF9jaGFuZ2VzKGNoYW5nZXMpCisgICAgICBlbmQKKworICAgICAgZGVmIG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cworICAgICAgICBAbWluX2RlbGF5X2JldHdlZW5fZXZlbnRzCisgICAgICBlbmQKKworICAgICAgZGVmIHN0b3BwZWQ/CisgICAgICAgIGxpc3RlbmVyLnN0YXRlID09IDpzdG9wcGVkCisgICAgICBlbmQKKworICAgICAgZGVmIHBhdXNlZD8KKyAgICAgICAgbGlzdGVuZXIuc3RhdGUgPT0gOnBhdXNlZAorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgYXR0cl9yZWFkZXIgOmxpc3RlbmVyCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9ldmVudC9sb29wLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vZXZlbnQvbG9vcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDhkYmZiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vZXZlbnQvbG9vcC5yYgpAQCAtMCwwICsxLDExNyBAQAorcmVxdWlyZSAndGhyZWFkJworCityZXF1aXJlICd0aW1lb3V0JworcmVxdWlyZSAnbGlzdGVuL2V2ZW50L3Byb2Nlc3NvcicKKworbW9kdWxlIExpc3RlbgorICBtb2R1bGUgRXZlbnQKKyAgICBjbGFzcyBMb29wCisgICAgICBjbGFzcyBFcnJvciA8IFJ1bnRpbWVFcnJvcgorICAgICAgICBjbGFzcyBOb3RTdGFydGVkIDwgRXJyb3IKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGluaXRpYWxpemUoY29uZmlnKQorICAgICAgICBAY29uZmlnID0gY29uZmlnCisgICAgICAgIEB3YWl0X3RocmVhZCA9IG5pbAorICAgICAgICBAc3RhdGUgPSA6cGF1c2VkCisgICAgICAgIEByZWFzb25zID0gOjpRdWV1ZS5uZXcKKyAgICAgIGVuZAorCisgICAgICBkZWYgd2FrZXVwX29uX2V2ZW50CisgICAgICAgIHJldHVybiBpZiBzdG9wcGVkPworICAgICAgICByZXR1cm4gdW5sZXNzIHByb2Nlc3Npbmc/CisgICAgICAgIHJldHVybiB1bmxlc3Mgd2FpdF90aHJlYWQuYWxpdmU/CisgICAgICAgIF93YWtldXAoOmV2ZW50KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBwYXVzZWQ/CisgICAgICAgIHdhaXRfdGhyZWFkICYmIHN0YXRlID09IDpwYXVzZWQKKyAgICAgIGVuZAorCisgICAgICBkZWYgcHJvY2Vzc2luZz8KKyAgICAgICAgcmV0dXJuIGZhbHNlIGlmIHN0b3BwZWQ/CisgICAgICAgIHJldHVybiBmYWxzZSBpZiBwYXVzZWQ/CisgICAgICAgIHN0YXRlID09IDpwcm9jZXNzaW5nCisgICAgICBlbmQKKworICAgICAgZGVmIHNldHVwCisgICAgICAgICMgVE9ETzogdXNlIGEgRmliZXIgaW5zdGVhZD8KKyAgICAgICAgcSA9IDo6UXVldWUubmV3CisgICAgICAgIEB3YWl0X3RocmVhZCA9IEludGVybmFsczo6VGhyZWFkUG9vbC5hZGQgZG8KKyAgICAgICAgICBfd2FpdF9mb3JfY2hhbmdlcyhxLCBjb25maWcpCisgICAgICAgIGVuZAorCisgICAgICAgIExpc3Rlbjo6TG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGZvciBwcm9jZXNzaW5nIHRvIHN0YXJ0Li4uJykKKyAgICAgICAgVGltZW91dC50aW1lb3V0KDUpIHsgcS5wb3AgfQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZXN1bWUKKyAgICAgICAgZmFpbCBFcnJvcjo6Tm90U3RhcnRlZCBpZiBzdG9wcGVkPworICAgICAgICByZXR1cm4gdW5sZXNzIHdhaXRfdGhyZWFkCisgICAgICAgIF93YWtldXAoOnJlc3VtZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgcGF1c2UKKyAgICAgICAgIyBUT0RPOiB3b3Jrcz8KKyAgICAgICAgIyBmYWlsIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgIGVuZAorCisgICAgICBkZWYgdGVhcmRvd24KKyAgICAgICAgcmV0dXJuIHVubGVzcyB3YWl0X3RocmVhZAorICAgICAgICBpZiB3YWl0X3RocmVhZC5hbGl2ZT8KKyAgICAgICAgICBfd2FrZXVwKDp0ZWFyZG93bikKKyAgICAgICAgICB3YWl0X3RocmVhZC5qb2luCisgICAgICAgIGVuZAorICAgICAgICBAd2FpdF90aHJlYWQgPSBuaWwKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3RvcHBlZD8KKyAgICAgICAgIXdhaXRfdGhyZWFkCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBhdHRyX3JlYWRlciA6Y29uZmlnCisgICAgICBhdHRyX3JlYWRlciA6d2FpdF90aHJlYWQKKworICAgICAgYXR0cl9hY2Nlc3NvciA6c3RhdGUKKworICAgICAgZGVmIF93YWl0X2Zvcl9jaGFuZ2VzKHJlYWR5X3F1ZXVlLCBjb25maWcpCisgICAgICAgIHByb2Nlc3NvciA9IEV2ZW50OjpQcm9jZXNzb3IubmV3KGNvbmZpZywgQHJlYXNvbnMpCisKKyAgICAgICAgX3dhaXRfdW50aWxfcmVzdW1lZChyZWFkeV9xdWV1ZSkKKyAgICAgICAgcHJvY2Vzc29yLmxvb3BfZm9yKGNvbmZpZy5taW5fZGVsYXlfYmV0d2Vlbl9ldmVudHMpCisgICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBleAorICAgICAgICBfbmljZV9lcnJvcihleCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3NsZWVwKCphcmdzKQorICAgICAgICBLZXJuZWwuc2xlZXAoKmFyZ3MpCisgICAgICBlbmQKKworICAgICAgZGVmIF93YWl0X3VudGlsX3Jlc3VtZWQocmVhZHlfcXVldWUpCisgICAgICAgIHNlbGYuc3RhdGUgPSA6cGF1c2VkCisgICAgICAgIHJlYWR5X3F1ZXVlIDw8IDpyZWFkeQorICAgICAgICBzbGVlcAorICAgICAgICBzZWxmLnN0YXRlID0gOnByb2Nlc3NpbmcKKyAgICAgIGVuZAorCisgICAgICBkZWYgX25pY2VfZXJyb3IoZXgpCisgICAgICAgIGluZGVudCA9ICJcbiAtLSAiCisgICAgICAgIG1zZyA9IGZvcm1hdCgKKyAgICAgICAgICAnZXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgZXZlbnRzOiAlcyBCYWNrdHJhY2U6JXMlcycsCisgICAgICAgICAgZXgsCisgICAgICAgICAgaW5kZW50LAorICAgICAgICAgIGV4LmJhY2t0cmFjZSAqIGluZGVudAorICAgICAgICApCisgICAgICAgIExpc3Rlbjo6TG9nZ2VyLmVycm9yKG1zZykKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3dha2V1cChyZWFzb24pCisgICAgICAgIEByZWFzb25zIDw8IHJlYXNvbgorICAgICAgICB3YWl0X3RocmVhZC53YWtldXAKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vZXZlbnQvcHJvY2Vzc29yLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vZXZlbnQvcHJvY2Vzc29yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDkyZTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9ldmVudC9wcm9jZXNzb3IucmIKQEAgLTAsMCArMSwxMjIgQEAKK21vZHVsZSBMaXN0ZW4KKyAgbW9kdWxlIEV2ZW50CisgICAgY2xhc3MgUHJvY2Vzc29yCisgICAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcsIHJlYXNvbnMpCisgICAgICAgIEBjb25maWcgPSBjb25maWcKKyAgICAgICAgQHJlYXNvbnMgPSByZWFzb25zCisgICAgICAgIF9yZXNldF9ub191bnByb2Nlc3NlZF9ldmVudHMKKyAgICAgIGVuZAorCisgICAgICAjIFRPRE86IGltcGxlbWVudCB0aGlzIHByb3Blcmx5IGluc3RlYWQgb2YgY2hlY2tpbmcgdGhlIHN0YXRlIGF0IGFyYml0cmFyeQorICAgICAgIyBwb2ludHMgaW4gdGltZQorICAgICAgZGVmIGxvb3BfZm9yKGxhdGVuY3kpCisgICAgICAgIEBsYXRlbmN5ID0gbGF0ZW5jeQorCisgICAgICAgIGxvb3AgZG8KKyAgICAgICAgICBfd2FpdF91bnRpbF9ldmVudHMKKyAgICAgICAgICBfd2FpdF91bnRpbF9ldmVudHNfY2FsbV9kb3duCisgICAgICAgICAgX3dhaXRfdW50aWxfbm9fbG9uZ2VyX3BhdXNlZAorICAgICAgICAgIF9wcm9jZXNzX2NoYW5nZXMKKyAgICAgICAgZW5kCisgICAgICByZXNjdWUgU3RvcHBlZAorICAgICAgICBMaXN0ZW46OkxvZ2dlci5kZWJ1ZygnUHJvY2Vzc2luZyBzdG9wcGVkJykKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGNsYXNzIFN0b3BwZWQgPCBSdW50aW1lRXJyb3IKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3dhaXRfdW50aWxfZXZlbnRzX2NhbG1fZG93bgorICAgICAgICBsb29wIGRvCisgICAgICAgICAgbm93ID0gX3RpbWVzdGFtcAorCisgICAgICAgICAgIyBBc3N1cmUgdGhlcmUncyBhdCBsZWFzdCBsYXRlbmN5IGJldHdlZW4gY2FsbGJhY2tzIHRvIGFsbG93CisgICAgICAgICAgIyBmb3IgYWNjdW11bGF0aW5nIGNoYW5nZXMKKyAgICAgICAgICBkaWZmID0gX2RlYWRsaW5lIC0gbm93CisgICAgICAgICAgYnJlYWsgaWYgZGlmZiA8PSAwCisKKyAgICAgICAgICAjIGdpdmUgZXZlbnRzIGEgYml0IG9mIHRpbWUgdG8gYWNjdW11bGF0ZSBzbyB0aGV5IGNhbiBiZQorICAgICAgICAgICMgY29tcHJlc3NlZC9vcHRpbWl6ZWQKKyAgICAgICAgICBfc2xlZXAoOndhaXRpbmdfdW50aWxfbGF0ZW5jeSwgZGlmZikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIF93YWl0X3VudGlsX25vX2xvbmdlcl9wYXVzZWQKKyAgICAgICAgIyBUT0RPOiBtYXkgbm90IGJlIGEgZ29vZCBpZGVhPworICAgICAgICBfc2xlZXAoOndhaXRpbmdfZm9yX3VucGF1c2UpIHdoaWxlIGNvbmZpZy5wYXVzZWQ/CisgICAgICBlbmQKKworICAgICAgZGVmIF9jaGVja19zdG9wcGVkCisgICAgICAgIHJldHVybiB1bmxlc3MgY29uZmlnLnN0b3BwZWQ/CisKKyAgICAgICAgX2ZsdXNoX3dha2V1cF9yZWFzb25zCisgICAgICAgIHJhaXNlIFN0b3BwZWQKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3NsZWVwKF9sb2NhbF9yZWFzb24sICphcmdzKQorICAgICAgICBfY2hlY2tfc3RvcHBlZAorICAgICAgICBzbGVlcF9kdXJhdGlvbiA9IGNvbmZpZy5zbGVlcCgqYXJncykKKyAgICAgICAgX2NoZWNrX3N0b3BwZWQKKworICAgICAgICBfZmx1c2hfd2FrZXVwX3JlYXNvbnMgZG8gfHJlYXNvbnwKKyAgICAgICAgICBuZXh0IHVubGVzcyByZWFzb24gPT0gOmV2ZW50CisgICAgICAgICAgX3JlbWVtYmVyX3RpbWVfb2ZfZmlyc3RfdW5wcm9jZXNzZWRfZXZlbnQgdW5sZXNzIGNvbmZpZy5wYXVzZWQ/CisgICAgICAgIGVuZAorCisgICAgICAgIHNsZWVwX2R1cmF0aW9uCisgICAgICBlbmQKKworICAgICAgZGVmIF9yZW1lbWJlcl90aW1lX29mX2ZpcnN0X3VucHJvY2Vzc2VkX2V2ZW50CisgICAgICAgIEBmaXJzdF91bnByb2Nlc3NlZF9ldmVudF90aW1lIHx8PSBfdGltZXN0YW1wCisgICAgICBlbmQKKworICAgICAgZGVmIF9yZXNldF9ub191bnByb2Nlc3NlZF9ldmVudHMKKyAgICAgICAgQGZpcnN0X3VucHJvY2Vzc2VkX2V2ZW50X3RpbWUgPSBuaWwKKyAgICAgIGVuZAorCisgICAgICBkZWYgX2RlYWRsaW5lCisgICAgICAgIEBmaXJzdF91bnByb2Nlc3NlZF9ldmVudF90aW1lICsgQGxhdGVuY3kKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3dhaXRfdW50aWxfZXZlbnRzCisgICAgICAgICMgVE9ETzogbG9uZyBzbGVlcCBtYXkgbm90IGJlIGEgZ29vZCBpZGVhPworICAgICAgICBfc2xlZXAoOndhaXRpbmdfZm9yX2V2ZW50cykgd2hpbGUgY29uZmlnLmV2ZW50X3F1ZXVlLmVtcHR5PworICAgICAgICBAZmlyc3RfdW5wcm9jZXNzZWRfZXZlbnRfdGltZSB8fD0gX3RpbWVzdGFtcAorICAgICAgZW5kCisKKyAgICAgIGRlZiBfZmx1c2hfd2FrZXVwX3JlYXNvbnMKKyAgICAgICAgcmVhc29ucyA9IEByZWFzb25zCisgICAgICAgIHVudGlsIHJlYXNvbnMuZW1wdHk/CisgICAgICAgICAgcmVhc29uID0gcmVhc29ucy5wb3AKKyAgICAgICAgICB5aWVsZCByZWFzb24gaWYgYmxvY2tfZ2l2ZW4/CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBfdGltZXN0YW1wCisgICAgICAgIGNvbmZpZy50aW1lc3RhbXAKKyAgICAgIGVuZAorCisgICAgICAjIGZvciBlYXNpZXIgdGVzdGluZyB3aXRob3V0IHNsZWVwIGxvb3AKKyAgICAgIGRlZiBfcHJvY2Vzc19jaGFuZ2VzCisgICAgICAgIF9yZXNldF9ub191bnByb2Nlc3NlZF9ldmVudHMKKworICAgICAgICBjaGFuZ2VzID0gW10KKyAgICAgICAgY2hhbmdlcyA8PCBjb25maWcuZXZlbnRfcXVldWUucG9wIHVudGlsIGNvbmZpZy5ldmVudF9xdWV1ZS5lbXB0eT8KKworICAgICAgICBjYWxsYWJsZSA9IGNvbmZpZy5jYWxsYWJsZT8KKyAgICAgICAgcmV0dXJuIHVubGVzcyBjYWxsYWJsZQorCisgICAgICAgIGhhc2ggPSBjb25maWcub3B0aW1pemVfY2hhbmdlcyhjaGFuZ2VzKQorICAgICAgICByZXN1bHQgPSBbaGFzaFs6bW9kaWZpZWRdLCBoYXNoWzphZGRlZF0sIGhhc2hbOnJlbW92ZWRdXQorICAgICAgICByZXR1cm4gaWYgcmVzdWx0LmFsbD8oJjplbXB0eT8pCisKKyAgICAgICAgYmxvY2tfc3RhcnQgPSBfdGltZXN0YW1wCisgICAgICAgIGNvbmZpZy5jYWxsKCpyZXN1bHQpCisgICAgICAgIExpc3Rlbjo6TG9nZ2VyLmRlYnVnICJDYWxsYmFjayB0b29rICN7X3RpbWVzdGFtcCAtIGJsb2NrX3N0YXJ0fSBzZWMiCisgICAgICBlbmQKKworICAgICAgYXR0cl9yZWFkZXIgOmNvbmZpZworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vZXZlbnQvcXVldWUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9ldmVudC9xdWV1ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjUwNzIwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vZXZlbnQvcXVldWUucmIKQEAgLTAsMCArMSw1OCBAQAorcmVxdWlyZSAndGhyZWFkJworCityZXF1aXJlICdmb3J3YXJkYWJsZScKKworbW9kdWxlIExpc3RlbgorICBtb2R1bGUgRXZlbnQKKyAgICBjbGFzcyBRdWV1ZQorICAgICAgY2xhc3MgQ29uZmlnCisgICAgICAgIGRlZiBpbml0aWFsaXplKHJlbGF0aXZlKQorICAgICAgICAgIEByZWxhdGl2ZSA9IHJlbGF0aXZlCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiByZWxhdGl2ZT8KKyAgICAgICAgICBAcmVsYXRpdmUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGluaXRpYWxpemUoY29uZmlnLCAmYmxvY2spCisgICAgICAgIEBldmVudF9xdWV1ZSA9IDo6UXVldWUubmV3CisgICAgICAgIEBibG9jayA9IGJsb2NrCisgICAgICAgIEBjb25maWcgPSBjb25maWcKKyAgICAgIGVuZAorCisgICAgICBkZWYgPDwoYXJncykKKyAgICAgICAgdHlwZSwgY2hhbmdlLCBkaXIsIHBhdGgsIG9wdGlvbnMgPSAqYXJncworICAgICAgICBmYWlsICJJbnZhbGlkIHR5cGU6ICN7dHlwZS5pbnNwZWN0fSIgdW5sZXNzIFs6ZGlyLCA6ZmlsZV0uaW5jbHVkZT8gdHlwZQorICAgICAgICBmYWlsICJJbnZhbGlkIGNoYW5nZTogI3tjaGFuZ2UuaW5zcGVjdH0iIHVubGVzcyBjaGFuZ2UuaXNfYT8oU3ltYm9sKQorICAgICAgICBmYWlsICJJbnZhbGlkIHBhdGg6ICN7cGF0aC5pbnNwZWN0fSIgdW5sZXNzIHBhdGguaXNfYT8oU3RyaW5nKQorCisgICAgICAgIGRpciA9IF9zYWZlX3JlbGF0aXZlX2Zyb21fY3dkKGRpcikKKyAgICAgICAgZXZlbnRfcXVldWUucHVibGljX3NlbmQoOjw8LCBbdHlwZSwgY2hhbmdlLCBkaXIsIHBhdGgsIG9wdGlvbnNdKQorCisgICAgICAgIGJsb2NrLmNhbGwoYXJncykgaWYgYmxvY2sKKyAgICAgIGVuZAorCisgICAgICBkZWYgZW1wdHk/CisgICAgICAgIGV2ZW50X3F1ZXVlLmVtcHR5PworICAgICAgZW5kCisKKyAgICAgIGRlZiBwb3AKKyAgICAgICAgZXZlbnRfcXVldWUucG9wCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBhdHRyX3JlYWRlciA6ZXZlbnRfcXVldWUKKyAgICAgIGF0dHJfcmVhZGVyIDpibG9jaworICAgICAgYXR0cl9yZWFkZXIgOmNvbmZpZworCisgICAgICBkZWYgX3NhZmVfcmVsYXRpdmVfZnJvbV9jd2QoZGlyKQorICAgICAgICByZXR1cm4gZGlyIHVubGVzcyBjb25maWcucmVsYXRpdmU/CisgICAgICAgIGRpci5yZWxhdGl2ZV9wYXRoX2Zyb20oUGF0aG5hbWUucHdkKQorICAgICAgcmVzY3VlIEFyZ3VtZW50RXJyb3IKKyAgICAgICAgZGlyCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2ZpbGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9maWxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGJjOTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9maWxlLnJiCkBAIC0wLDAgKzEsODAgQEAKK3JlcXVpcmUgJ2RpZ2VzdC9tZDUnCisKK21vZHVsZSBMaXN0ZW4KKyAgY2xhc3MgRmlsZQorICAgIGRlZiBzZWxmLmNoYW5nZShyZWNvcmQsIHJlbF9wYXRoKQorICAgICAgcGF0aCA9IFBhdGhuYW1lLm5ldyhyZWNvcmQucm9vdCkgKyByZWxfcGF0aAorICAgICAgbHN0YXQgPSBwYXRoLmxzdGF0CisKKyAgICAgIGRhdGEgPSB7IG10aW1lOiBsc3RhdC5tdGltZS50b19mLCBtb2RlOiBsc3RhdC5tb2RlIH0KKworICAgICAgcmVjb3JkX2RhdGEgPSByZWNvcmQuZmlsZV9kYXRhKHJlbF9wYXRoKQorCisgICAgICBpZiByZWNvcmRfZGF0YS5lbXB0eT8KKyAgICAgICAgcmVjb3JkLnVwZGF0ZV9maWxlKHJlbF9wYXRoLCBkYXRhKQorICAgICAgICByZXR1cm4gOmFkZGVkCisgICAgICBlbmQKKworICAgICAgaWYgZGF0YVs6bW9kZV0gIT0gcmVjb3JkX2RhdGFbOm1vZGVdCisgICAgICAgIHJlY29yZC51cGRhdGVfZmlsZShyZWxfcGF0aCwgZGF0YSkKKyAgICAgICAgcmV0dXJuIDptb2RpZmllZAorICAgICAgZW5kCisKKyAgICAgIGlmIGRhdGFbOm10aW1lXSAhPSByZWNvcmRfZGF0YVs6bXRpbWVdCisgICAgICAgIHJlY29yZC51cGRhdGVfZmlsZShyZWxfcGF0aCwgZGF0YSkKKyAgICAgICAgcmV0dXJuIDptb2RpZmllZAorICAgICAgZW5kCisKKyAgICAgIHJldHVybiBpZiAvMXx0cnVlLyA9fiBFTlZbJ0xJU1RFTl9HRU1fRElTQUJMRV9IQVNISU5HJ10KKyAgICAgIHJldHVybiB1bmxlc3Mgc2VsZi5pbmFjY3VyYXRlX21hY190aW1lPyhsc3RhdCkKKworICAgICAgIyBDaGVjayBpZiBjaGFuZ2UgaGFwcGVuZWQgd2l0aGluIDEgc2Vjb25kIChtYXliZSBpdCdzIGV2ZW4KKyAgICAgICMgdG9vIG11Y2gsIGUuZy4gMC4zLTAuNSBjb3VsZCBiZSBzdWZmaWNpZW50KS4KKyAgICAgICMKKyAgICAgICMgV2l0aCByYi1mc2V2ZW50LCB0aGVyZSdzIGEgKGNvbmZpZ3VyYWJsZSkgbGF0ZW5jeSBiZXR3ZWVuCisgICAgICAjIHdoZW4gZmlsZSB3YXMgY2hhbmdlZCBhbmQgd2hlbiB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZC4KKyAgICAgICMKKyAgICAgICMgSWYgYSBmaWxlIGlzIHNhdmVkIGF0ID8/PzE0Ljk5OCwgYnkgdGhlIHRpbWUgdGhlIGV2ZW50IGlzCisgICAgICAjIGFjdHVhbGx5IHJlY2VpdmVkIGJ5IExpc3RlbiwgdGhlIHRpbWUgY291bGQgYWxyZWFkeSBiZSBlLmcuCisgICAgICAjID8/PzE1LjcuCisgICAgICAjCisgICAgICAjIEFuZCBzaW5jZSBEYXJ3aW4gYWRhcHRlciB1c2VzIGRpcmVjdG9yeSBzY2FubmluZywgdGhlIGZpbGUKKyAgICAgICMgbXRpbWUgbWF5IGJlIHRoZSBzYW1lIChlLmcuIGZpbGUgd2FzIGNoYW5nZWQgYXQgPz8/MTQuMDAxLAorICAgICAgIyB0aGVuIGF0ID8/PzE0Ljk5OCwgYnV0IHRoZSBmc3RhdCB0aW1lIHdvdWxkIGJlID8/PzE0LjAgaW4KKyAgICAgICMgYm90aCBjYXNlcykuCisgICAgICAjCisgICAgICAjIElmIGNoYW5nZSBoYXBwZW5kIGF0ID8/PzE0Ljk5OTk5NywgdGhlIG10aW1lIGlzIDE0LjAsIHNvIGZvcgorICAgICAgIyBhbiBtdGltZT0/Pz8xNC4wIHdlIGFzc3VtZSBpdCBjb3VsZCBldmVuIGJlIGFsbW9zdCA/Pz8xNS4wCisgICAgICAjCisgICAgICAjIFNvIGlmIFRpbWUubm93LnRvX2YgaXMgPz8/MTUuOTk5OTk4IGFuZCBzdGF0IHJlcG9ydHMgbXRpbWUKKyAgICAgICMgYXQgPz8/MTQuMCwgdGhlbiBldmVudCB3YXMgZHVlIHRvIHRoYXQgZmlsZSdkIGNoYW5nZSB3aGVuOgorICAgICAgIworICAgICAgIyA/Pz8xNS45OTk5OTcgLSA/Pz8xNC45OTk5OTggPCAxLjBzCisgICAgICAjCisgICAgICAjIFNvIHRoZSAiMiIgaXMgIjEgKyAxIiAoMXMgdG8gY292ZXIgcmItZnNldmVudCBsYXRlbmN5ICsKKyAgICAgICMgMXMgbWF4aW11bSBkaWZmZXJlbmNlIGJldHdlZW4gcmVhbCBtdGltZSBhbmQgdGhhdCByZWNvcmRlZAorICAgICAgIyBpbiB0aGUgZmlsZSBzeXN0ZW0pCisgICAgICAjCisgICAgICByZXR1cm4gaWYgZGF0YVs6bXRpbWVdLnRvX2kgKyAyIDw9IFRpbWUubm93LnRvX2YKKworICAgICAgbWQ1ID0gRGlnZXN0OjpNRDUuZmlsZShwYXRoKS5kaWdlc3QKKyAgICAgIHJlY29yZC51cGRhdGVfZmlsZShyZWxfcGF0aCwgZGF0YS5tZXJnZShtZDU6IG1kNSkpCisgICAgICA6bW9kaWZpZWQgaWYgcmVjb3JkX2RhdGFbOm1kNV0gJiYgbWQ1ICE9IHJlY29yZF9kYXRhWzptZDVdCisgICAgcmVzY3VlIFN5c3RlbUNhbGxFcnJvcgorICAgICAgcmVjb3JkLnVuc2V0X3BhdGgocmVsX3BhdGgpCisgICAgICA6cmVtb3ZlZAorICAgIHJlc2N1ZQorICAgICAgTGlzdGVuOjpMb2dnZXIuZGVidWcgImxzdGF0IGZhaWxlZCBmb3I6ICN7cmVsX3BhdGh9ICgjeyRFUlJPUl9JTkZPfSkiCisgICAgICByYWlzZQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuaW5hY2N1cmF0ZV9tYWNfdGltZT8oc3RhdCkKKyAgICAgICMgJ21hYycgbWVhbnMgTW9kaWZpZWQvQWNjZXNzZWQvQ3JlYXRlZAorCisgICAgICAjIFNpbmNlIHByZWNpc2lvbiBkZXBlbmRzIG9uIG1vdW50ZWQgRlMgKGUuZy4geW91IGNhbiBoYXZlIGEgRkFUIHBhcnRpaW9uCisgICAgICAjIG1vdW50ZWQgb24gTGludXgpLCBjaGVjayBmb3IgZmllbGRzIHdpdGggYSByZW1haW5kZXIgdG8gZGV0ZWN0IHRoaXMKKworICAgICAgW3N0YXQubXRpbWUsIHN0YXQuY3RpbWUsIHN0YXQuYXRpbWVdLm1hcCgmOnVzZWMpLmFsbD8oJjp6ZXJvPykKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2ZzbS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2ZzbS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk0NmYyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vZnNtLnJiCkBAIC0wLDAgKzEsMTMxIEBACisjIENvZGUgY29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2NlbGx1bG9pZC9jZWxsdWxvaWQtZnNtCittb2R1bGUgTGlzdGVuCisgIG1vZHVsZSBGU00KKyAgICBERUZBVUxUX1NUQVRFID0gOmRlZmF1bHQgIyBEZWZhdWx0IHN0YXRlIG5hbWUgdW5sZXNzIG9uZSBpcyBleHBsaWNpdGx5IHNldAorCisgICAgIyBJbmNsdWRlZCBob29rIHRvIGV4dGVuZCBjbGFzcyBtZXRob2RzCisgICAgZGVmIHNlbGYuaW5jbHVkZWQoa2xhc3MpCisgICAgICBrbGFzcy5zZW5kIDpleHRlbmQsIENsYXNzTWV0aG9kcworICAgIGVuZAorCisgICAgbW9kdWxlIENsYXNzTWV0aG9kcworICAgICAgIyBPYnRhaW4gb3Igc2V0IHRoZSBkZWZhdWx0IHN0YXRlCisgICAgICAjIFBhc3NpbmcgYSBzdGF0ZSBuYW1lIHNldHMgdGhlIGRlZmF1bHQgc3RhdGUKKyAgICAgIGRlZiBkZWZhdWx0X3N0YXRlKG5ld19kZWZhdWx0ID0gbmlsKQorICAgICAgICBpZiBuZXdfZGVmYXVsdAorICAgICAgICAgIEBkZWZhdWx0X3N0YXRlID0gbmV3X2RlZmF1bHQudG9fc3ltCisgICAgICAgIGVsc2UKKyAgICAgICAgICBkZWZpbmVkPyhAZGVmYXVsdF9zdGF0ZSkgPyBAZGVmYXVsdF9zdGF0ZSA6IERFRkFVTFRfU1RBVEUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBPYnRhaW4gdGhlIHZhbGlkIHN0YXRlcyBmb3IgdGhpcyBGU00KKyAgICAgIGRlZiBzdGF0ZXMKKyAgICAgICAgQHN0YXRlcyB8fD0ge30KKyAgICAgIGVuZAorCisgICAgICAjIERlY2xhcmUgYW4gRlNNIHN0YXRlIGFuZCBvcHRpb25hbGx5IHByb3ZpZGUgYSBjYWxsYmFjayBibG9jayB0byBmaXJlCisgICAgICAjIE9wdGlvbnM6CisgICAgICAjICogdG86IGEgc3RhdGUgb3IgYXJyYXkgb2Ygc3RhdGVzIHRoaXMgc3RhdGUgY2FuIHRyYW5zaXRpb24gdG8KKyAgICAgIGRlZiBzdGF0ZSgqYXJncywgJmJsb2NrKQorICAgICAgICBpZiBhcmdzLmxhc3QuaXNfYT8gSGFzaAorICAgICAgICAgICMgU3RyaW5naWZ5IGtleXMgOi8KKyAgICAgICAgICBvcHRpb25zID0gYXJncy5wb3AuZWFjaF93aXRoX29iamVjdCh7fSkgeyB8KGssIHYpLCBofCBoW2sudG9fc10gPSB2IH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG9wdGlvbnMgPSB7fQorICAgICAgICBlbmQKKworICAgICAgICBhcmdzLmVhY2ggZG8gfG5hbWV8CisgICAgICAgICAgbmFtZSA9IG5hbWUudG9fc3ltCisgICAgICAgICAgZGVmYXVsdF9zdGF0ZSBuYW1lIGlmIG9wdGlvbnNbJ2RlZmF1bHQnXQorICAgICAgICAgIHN0YXRlc1tuYW1lXSA9IFN0YXRlLm5ldyhuYW1lLCBvcHRpb25zWyd0byddLCAmYmxvY2spCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEJlIGtpbmQgYW5kIGNhbGwgc3VwZXIgaWYgeW91IG11c3QgcmVkZWZpbmUgaW5pdGlhbGl6ZQorICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAc3RhdGUgPSBzZWxmLmNsYXNzLmRlZmF1bHRfc3RhdGUKKyAgICBlbmQKKworICAgICMgT2J0YWluIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBGU00KKyAgICBhdHRyX3JlYWRlciA6c3RhdGUKKworICAgIGRlZiB0cmFuc2l0aW9uKHN0YXRlX25hbWUpCisgICAgICBuZXdfc3RhdGUgPSB2YWxpZGF0ZV9hbmRfc2FuaXRpemVfbmV3X3N0YXRlKHN0YXRlX25hbWUpCisgICAgICByZXR1cm4gdW5sZXNzIG5ld19zdGF0ZQorICAgICAgdHJhbnNpdGlvbl93aXRoX2NhbGxiYWNrcyEobmV3X3N0YXRlKQorICAgIGVuZAorCisgICAgIyBJbW1lZGlhdGUgc3RhdGUgdHJhbnNpdGlvbiB3aXRoIG5vIGNoZWNrcywgb3IgY2FsbGJhY2tzLiAiRGFuZ2Vyb3VzISIKKyAgICBkZWYgdHJhbnNpdGlvbiEoc3RhdGVfbmFtZSkKKyAgICAgIEBzdGF0ZSA9IHN0YXRlX25hbWUKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgZGVmIHZhbGlkYXRlX2FuZF9zYW5pdGl6ZV9uZXdfc3RhdGUoc3RhdGVfbmFtZSkKKyAgICAgIHN0YXRlX25hbWUgPSBzdGF0ZV9uYW1lLnRvX3N5bQorCisgICAgICByZXR1cm4gaWYgY3VycmVudF9zdGF0ZV9uYW1lID09IHN0YXRlX25hbWUKKworICAgICAgaWYgY3VycmVudF9zdGF0ZSAmJiAhY3VycmVudF9zdGF0ZS52YWxpZF90cmFuc2l0aW9uPyhzdGF0ZV9uYW1lKQorICAgICAgICB2YWxpZCA9IGN1cnJlbnRfc3RhdGUudHJhbnNpdGlvbnMubWFwKCY6dG9fcykuam9pbignLCAnKQorICAgICAgICBtc2cgPSAiI3tzZWxmLmNsYXNzfSBjYW4ndCBjaGFuZ2Ugc3RhdGUgZnJvbSAnI3tAc3RhdGV9JyJcCisgICAgICAgICAgIiB0byAnI3tzdGF0ZV9uYW1lfScsIG9ubHkgdG86ICN7dmFsaWR9IgorICAgICAgICBmYWlsIEFyZ3VtZW50RXJyb3IsIG1zZworICAgICAgZW5kCisKKyAgICAgIG5ld19zdGF0ZSA9IHN0YXRlc1tzdGF0ZV9uYW1lXQorCisgICAgICB1bmxlc3MgbmV3X3N0YXRlCisgICAgICAgIHJldHVybiBpZiBzdGF0ZV9uYW1lID09IGRlZmF1bHRfc3RhdGUKKyAgICAgICAgZmFpbCBBcmd1bWVudEVycm9yLCAiaW52YWxpZCBzdGF0ZSBmb3IgI3tzZWxmLmNsYXNzfTogI3tzdGF0ZV9uYW1lfSIKKyAgICAgIGVuZAorCisgICAgICBuZXdfc3RhdGUKKyAgICBlbmQKKworICAgIGRlZiB0cmFuc2l0aW9uX3dpdGhfY2FsbGJhY2tzIShzdGF0ZV9uYW1lKQorICAgICAgdHJhbnNpdGlvbiEgc3RhdGVfbmFtZS5uYW1lCisgICAgICBzdGF0ZV9uYW1lLmNhbGwoc2VsZikKKyAgICBlbmQKKworICAgIGRlZiBzdGF0ZXMKKyAgICAgIHNlbGYuY2xhc3Muc3RhdGVzCisgICAgZW5kCisKKyAgICBkZWYgZGVmYXVsdF9zdGF0ZQorICAgICAgc2VsZi5jbGFzcy5kZWZhdWx0X3N0YXRlCisgICAgZW5kCisKKyAgICBkZWYgY3VycmVudF9zdGF0ZQorICAgICAgc3RhdGVzW0BzdGF0ZV0KKyAgICBlbmQKKworICAgIGRlZiBjdXJyZW50X3N0YXRlX25hbWUKKyAgICAgIGN1cnJlbnRfc3RhdGUgJiYgY3VycmVudF9zdGF0ZS5uYW1lIHx8ICcnCisgICAgZW5kCisKKyAgICBjbGFzcyBTdGF0ZQorICAgICAgYXR0cl9yZWFkZXIgOm5hbWUsIDp0cmFuc2l0aW9ucworCisgICAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCB0cmFuc2l0aW9ucyA9IG5pbCwgJmJsb2NrKQorICAgICAgICBAbmFtZSwgQGJsb2NrID0gbmFtZSwgYmxvY2sKKyAgICAgICAgQHRyYW5zaXRpb25zID0gbmlsCisgICAgICAgIEB0cmFuc2l0aW9ucyA9IEFycmF5KHRyYW5zaXRpb25zKS5tYXAoJjp0b19zeW0pIGlmIHRyYW5zaXRpb25zCisgICAgICBlbmQKKworICAgICAgZGVmIGNhbGwob2JqKQorICAgICAgICBvYmouaW5zdGFuY2VfZXZhbCgmQGJsb2NrKSBpZiBAYmxvY2sKKyAgICAgIGVuZAorCisgICAgICBkZWYgdmFsaWRfdHJhbnNpdGlvbj8obmV3X3N0YXRlKQorICAgICAgICAjIEFsbCB0cmFuc2l0aW9ucyBhcmUgYWxsb3dlZCB1bmxlc3MgZXhwcmVzc2x5CisgICAgICAgIHJldHVybiB0cnVlIHVubGVzcyBAdHJhbnNpdGlvbnMKKworICAgICAgICBAdHJhbnNpdGlvbnMuaW5jbHVkZT8gbmV3X3N0YXRlLnRvX3N5bQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9pbnRlcm5hbHMvdGhyZWFkX3Bvb2wucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9pbnRlcm5hbHMvdGhyZWFkX3Bvb2wucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExMmQ5MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2ludGVybmFscy90aHJlYWRfcG9vbC5yYgpAQCAtMCwwICsxLDI5IEBACittb2R1bGUgTGlzdGVuCisgICMgQHByaXZhdGUgYXBpCisgIG1vZHVsZSBJbnRlcm5hbHMKKyAgICBtb2R1bGUgVGhyZWFkUG9vbAorICAgICAgZGVmIHNlbGYuYWRkKCZibG9jaykKKyAgICAgICAgVGhyZWFkLm5ldyB7IGJsb2NrLmNhbGwgfS50YXAgZG8gfHRofAorICAgICAgICAgIChAdGhyZWFkcyB8fD0gUXVldWUubmV3KSA8PCB0aAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdG9wCisgICAgICAgIHJldHVybiB1bmxlc3MgQHRocmVhZHMgfHw9IG5pbAorICAgICAgICByZXR1cm4gaWYgQHRocmVhZHMuZW1wdHk/ICMgcmV0dXJuIHRvIGF2b2lkIHVzaW5nIHBvc3NpYmx5IHN0dWJiZWQgUXVldWUKKworICAgICAgICBraWxsZWQgPSBRdWV1ZS5uZXcKKyAgICAgICAgIyBZb3UgY2FuJ3Qga2lsbCBhIHJlYWQgb24gYSBkZXNjcmlwdG9yIGluIEpSdWJ5LCBzbyBsZXQncyBqdXN0CisgICAgICAgICMgaWdub3JlIHJ1bm5pbmcgdGhyZWFkcyAobGlzdGVuIHJiLWlub3RpZnkgd2FpdGluZyBmb3IgZGlzayBhY3Rpdml0eQorICAgICAgICAjIGJlZm9yZSBjbG9zaW5nKSAgcHJheSB0aHJlYWRzIGRpZSBmYXN0ZXIgdGhhbiB0aGV5IGFyZSBjcmVhdGVkLi4uCisgICAgICAgIGxpbWl0ID0gUlVCWV9FTkdJTkUgPT0gJ2pydWJ5JyA/IFsxXSA6IFtdCisKKyAgICAgICAga2lsbGVkIDw8IEB0aHJlYWRzLnBvcC5raWxsIHVudGlsIEB0aHJlYWRzLmVtcHR5PworICAgICAgICB1bnRpbCBraWxsZWQuZW1wdHk/CisgICAgICAgICAgdGggPSBraWxsZWQucG9wCisgICAgICAgICAgdGguam9pbigqbGltaXQpIHVubGVzcyB0aFs6bGlzdGVuX2Jsb2NraW5nX3JlYWRfdGhyZWFkXQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vbGlzdGVuZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9saXN0ZW5lci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGU2MTUyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vbGlzdGVuZXIucmIKQEAgLTAsMCArMSwxMzIgQEAKK3JlcXVpcmUgJ0VuZ2xpc2gnCisKK3JlcXVpcmUgJ2xpc3Rlbi92ZXJzaW9uJworCityZXF1aXJlICdsaXN0ZW4vYmFja2VuZCcKKworcmVxdWlyZSAnbGlzdGVuL3NpbGVuY2VyJworcmVxdWlyZSAnbGlzdGVuL3NpbGVuY2VyL2NvbnRyb2xsZXInCisKK3JlcXVpcmUgJ2xpc3Rlbi9xdWV1ZV9vcHRpbWl6ZXInCisKK3JlcXVpcmUgJ2xpc3Rlbi9mc20nCisKK3JlcXVpcmUgJ2xpc3Rlbi9ldmVudC9sb29wJworcmVxdWlyZSAnbGlzdGVuL2V2ZW50L3F1ZXVlJworcmVxdWlyZSAnbGlzdGVuL2V2ZW50L2NvbmZpZycKKworcmVxdWlyZSAnbGlzdGVuL2xpc3RlbmVyL2NvbmZpZycKKworbW9kdWxlIExpc3RlbgorICBjbGFzcyBMaXN0ZW5lcgorICAgIGluY2x1ZGUgTGlzdGVuOjpGU00KKworICAgICMgSW5pdGlhbGl6ZXMgdGhlIGRpcmVjdG9yaWVzIGxpc3RlbmVyLgorICAgICMKKyAgICAjIEBwYXJhbSBbU3RyaW5nXSBkaXJlY3RvcnkgdGhlIGRpcmVjdG9yaWVzIHRvIGxpc3RlbiB0bworICAgICMgQHBhcmFtIFtIYXNoXSBvcHRpb25zIHRoZSBsaXN0ZW4gb3B0aW9ucyAoc2VlIExpc3Rlbjo6TGlzdGVuZXI6Ok9wdGlvbnMpCisgICAgIworICAgICMgQHlpZWxkIFttb2RpZmllZCwgYWRkZWQsIHJlbW92ZWRdIHRoZSBjaGFuZ2VkIGZpbGVzCisgICAgIyBAeWllbGRwYXJhbSBbQXJyYXk8U3RyaW5nPl0gbW9kaWZpZWQgdGhlIGxpc3Qgb2YgbW9kaWZpZWQgZmlsZXMKKyAgICAjIEB5aWVsZHBhcmFtIFtBcnJheTxTdHJpbmc+XSBhZGRlZCB0aGUgbGlzdCBvZiBhZGRlZCBmaWxlcworICAgICMgQHlpZWxkcGFyYW0gW0FycmF5PFN0cmluZz5dIHJlbW92ZWQgdGhlIGxpc3Qgb2YgcmVtb3ZlZCBmaWxlcworICAgICMKKyAgICBkZWYgaW5pdGlhbGl6ZSgqZGlycywgJmJsb2NrKQorICAgICAgb3B0aW9ucyA9IGRpcnMubGFzdC5pc19hPyhIYXNoKSA/IGRpcnMucG9wIDoge30KKworICAgICAgQGNvbmZpZyA9IENvbmZpZy5uZXcob3B0aW9ucykKKworICAgICAgZXFfY29uZmlnID0gRXZlbnQ6OlF1ZXVlOjpDb25maWcubmV3KEBjb25maWcucmVsYXRpdmU/KQorICAgICAgcXVldWUgPSBFdmVudDo6UXVldWUubmV3KGVxX2NvbmZpZykgeyBAcHJvY2Vzc29yLndha2V1cF9vbl9ldmVudCB9CisKKyAgICAgIHNpbGVuY2VyID0gU2lsZW5jZXIubmV3CisgICAgICBydWxlcyA9IEBjb25maWcuc2lsZW5jZXJfcnVsZXMKKyAgICAgIEBzaWxlbmNlcl9jb250cm9sbGVyID0gU2lsZW5jZXI6OkNvbnRyb2xsZXIubmV3KHNpbGVuY2VyLCBydWxlcykKKworICAgICAgQGJhY2tlbmQgPSBCYWNrZW5kLm5ldyhkaXJzLCBxdWV1ZSwgc2lsZW5jZXIsIEBjb25maWcpCisKKyAgICAgIG9wdGltaXplcl9jb25maWcgPSBRdWV1ZU9wdGltaXplcjo6Q29uZmlnLm5ldyhAYmFja2VuZCwgc2lsZW5jZXIpCisKKyAgICAgIHBjb25maWcgPSBFdmVudDo6Q29uZmlnLm5ldygKKyAgICAgICAgc2VsZiwKKyAgICAgICAgcXVldWUsCisgICAgICAgIFF1ZXVlT3B0aW1pemVyLm5ldyhvcHRpbWl6ZXJfY29uZmlnKSwKKyAgICAgICAgQGJhY2tlbmQubWluX2RlbGF5X2JldHdlZW5fZXZlbnRzLAorICAgICAgICAmYmxvY2spCisKKyAgICAgIEBwcm9jZXNzb3IgPSBFdmVudDo6TG9vcC5uZXcocGNvbmZpZykKKworICAgICAgc3VwZXIoKSAjIEZTTQorICAgIGVuZAorCisgICAgZGVmYXVsdF9zdGF0ZSA6aW5pdGlhbGl6aW5nCisKKyAgICBzdGF0ZSA6aW5pdGlhbGl6aW5nLCB0bzogWzpiYWNrZW5kX3N0YXJ0ZWQsIDpzdG9wcGVkXQorCisgICAgc3RhdGUgOmJhY2tlbmRfc3RhcnRlZCwgdG86IFs6ZnJvbnRlbmRfcmVhZHksIDpzdG9wcGVkXSBkbworICAgICAgYmFja2VuZC5zdGFydAorICAgIGVuZAorCisgICAgc3RhdGUgOmZyb250ZW5kX3JlYWR5LCB0bzogWzpwcm9jZXNzaW5nX2V2ZW50cywgOnN0b3BwZWRdIGRvCisgICAgICBwcm9jZXNzb3Iuc2V0dXAKKyAgICBlbmQKKworICAgIHN0YXRlIDpwcm9jZXNzaW5nX2V2ZW50cywgdG86IFs6cGF1c2VkLCA6c3RvcHBlZF0gZG8KKyAgICAgIHByb2Nlc3Nvci5yZXN1bWUKKyAgICBlbmQKKworICAgIHN0YXRlIDpwYXVzZWQsIHRvOiBbOnByb2Nlc3NpbmdfZXZlbnRzLCA6c3RvcHBlZF0gZG8KKyAgICAgIHByb2Nlc3Nvci5wYXVzZQorICAgIGVuZAorCisgICAgc3RhdGUgOnN0b3BwZWQsIHRvOiBbOmJhY2tlbmRfc3RhcnRlZF0gZG8KKyAgICAgIGJhY2tlbmQuc3RvcCAjIHNob3VsZCBiZSBiZWZvcmUgcHJvY2Vzc29yLnRlYXJkb3duIHRvIGhhbHQgZXZlbnRzIEFTQVAKKyAgICAgIHByb2Nlc3Nvci50ZWFyZG93bgorICAgIGVuZAorCisgICAgIyBTdGFydHMgcHJvY2Vzc2luZyBldmVudHMgYW5kIHN0YXJ0cyBhZGFwdGVycworICAgICMgb3IgcmVzdW1lcyBpbnZva2luZyBjYWxsYmFja3MgaWYgcGF1c2VkCisgICAgZGVmIHN0YXJ0CisgICAgICB0cmFuc2l0aW9uIDpiYWNrZW5kX3N0YXJ0ZWQgaWYgc3RhdGUgPT0gOmluaXRpYWxpemluZworICAgICAgdHJhbnNpdGlvbiA6ZnJvbnRlbmRfcmVhZHkgaWYgc3RhdGUgPT0gOmJhY2tlbmRfc3RhcnRlZAorICAgICAgdHJhbnNpdGlvbiA6cHJvY2Vzc2luZ19ldmVudHMgaWYgc3RhdGUgPT0gOmZyb250ZW5kX3JlYWR5CisgICAgICB0cmFuc2l0aW9uIDpwcm9jZXNzaW5nX2V2ZW50cyBpZiBzdGF0ZSA9PSA6cGF1c2VkCisgICAgZW5kCisKKyAgICAjIFN0b3BzIGJvdGggbGlzdGVuaW5nIGZvciBldmVudHMgYW5kIHByb2Nlc3NpbmcgdGhlbQorICAgIGRlZiBzdG9wCisgICAgICB0cmFuc2l0aW9uIDpzdG9wcGVkCisgICAgZW5kCisKKyAgICAjIFN0b3BzIGludm9raW5nIGNhbGxiYWNrcyAobWVzc2FnZXMgcGlsZSB1cCkKKyAgICBkZWYgcGF1c2UKKyAgICAgIHRyYW5zaXRpb24gOnBhdXNlZAorICAgIGVuZAorCisgICAgIyBwcm9jZXNzaW5nIG1lYW5zIGNhbGxiYWNrcyBhcmUgY2FsbGVkCisgICAgZGVmIHByb2Nlc3Npbmc/CisgICAgICBzdGF0ZSA9PSA6cHJvY2Vzc2luZ19ldmVudHMKKyAgICBlbmQKKworICAgIGRlZiBwYXVzZWQ/CisgICAgICBzdGF0ZSA9PSA6cGF1c2VkCisgICAgZW5kCisKKyAgICBkZWYgaWdub3JlKHJlZ2V4cHMpCisgICAgICBAc2lsZW5jZXJfY29udHJvbGxlci5hcHBlbmRfaWdub3JlcyhyZWdleHBzKQorICAgIGVuZAorCisgICAgZGVmIGlnbm9yZSEocmVnZXhwcykKKyAgICAgIEBzaWxlbmNlcl9jb250cm9sbGVyLnJlcGxhY2Vfd2l0aF9iYW5nX2lnbm9yZXMocmVnZXhwcykKKyAgICBlbmQKKworICAgIGRlZiBvbmx5KHJlZ2V4cHMpCisgICAgICBAc2lsZW5jZXJfY29udHJvbGxlci5yZXBsYWNlX3dpdGhfb25seShyZWdleHBzKQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgYXR0cl9yZWFkZXIgOnByb2Nlc3NvcgorICAgIGF0dHJfcmVhZGVyIDpiYWNrZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9saXN0ZW5lci9jb25maWcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9saXN0ZW5lci9jb25maWcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNzdhNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2xpc3RlbmVyL2NvbmZpZy5yYgpAQCAtMCwwICsxLDQ1IEBACittb2R1bGUgTGlzdGVuCisgIGNsYXNzIExpc3RlbmVyCisgICAgY2xhc3MgQ29uZmlnCisgICAgICBERUZBVUxUUyA9IHsKKyAgICAgICAgIyBMaXN0ZW5lciBvcHRpb25zCisgICAgICAgIGRlYnVnOiBmYWxzZSwgIyBUT0RPOiBpcyB0aGlzIGJyb2tlbj8KKyAgICAgICAgd2FpdF9mb3JfZGVsYXk6IG5pbCwgIyBOT1RFOiBzaG91bGQgYmUgcHJvdmlkZWQgYnkgYWRhcHRlciBpZiBwb3NzaWJsZQorICAgICAgICByZWxhdGl2ZTogZmFsc2UsCisKKyAgICAgICAgIyBCYWNrZW5kIHNlbGVjdGluZyBvcHRpb25zCisgICAgICAgIGZvcmNlX3BvbGxpbmc6IGZhbHNlLAorICAgICAgICBwb2xsaW5nX2ZhbGxiYWNrX21lc3NhZ2U6IG5pbAorICAgICAgfQorCisgICAgICBkZWYgaW5pdGlhbGl6ZShvcHRzKQorICAgICAgICBAb3B0aW9ucyA9IERFRkFVTFRTLm1lcmdlKG9wdHMpCisgICAgICAgIEByZWxhdGl2ZSA9IEBvcHRpb25zWzpyZWxhdGl2ZV0KKyAgICAgICAgQG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cyA9IEBvcHRpb25zWzp3YWl0X2Zvcl9kZWxheV0KKyAgICAgICAgQHNpbGVuY2VyX3J1bGVzID0gQG9wdGlvbnMgIyBzaWxlbmNlciB3aWxsIGV4dHJhY3Qgd2hhdCBpdCBuZWVkcworICAgICAgZW5kCisKKyAgICAgIGRlZiByZWxhdGl2ZT8KKyAgICAgICAgQHJlbGF0aXZlCisgICAgICBlbmQKKworICAgICAgZGVmIG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cworICAgICAgICBAbWluX2RlbGF5X2JldHdlZW5fZXZlbnRzCisgICAgICBlbmQKKworICAgICAgZGVmIHNpbGVuY2VyX3J1bGVzCisgICAgICAgIEBzaWxlbmNlcl9ydWxlcworICAgICAgZW5kCisKKyAgICAgIGRlZiBhZGFwdGVyX2luc3RhbmNlX29wdGlvbnMoa2xhc3MpCisgICAgICAgIHZhbGlkX2tleXMgPSBrbGFzcy5jb25zdF9nZXQoJ0RFRkFVTFRTJykua2V5cworICAgICAgICBIYXNoW0BvcHRpb25zLnNlbGVjdCB7IHxrZXksIF98IHZhbGlkX2tleXMuaW5jbHVkZT8oa2V5KSB9XQorICAgICAgZW5kCisKKyAgICAgIGRlZiBhZGFwdGVyX3NlbGVjdF9vcHRpb25zCisgICAgICAgIHZhbGlkX2tleXMgPSAldyhmb3JjZV9wb2xsaW5nIHBvbGxpbmdfZmFsbGJhY2tfbWVzc2FnZSkubWFwKCY6dG9fc3ltKQorICAgICAgICBIYXNoW0BvcHRpb25zLnNlbGVjdCB7IHxrZXksIF98IHZhbGlkX2tleXMuaW5jbHVkZT8oa2V5KSB9XQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9sb2dnZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9sb2dnZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlNjMzMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL2xvZ2dlci5yYgpAQCAtMCwwICsxLDMyIEBACittb2R1bGUgTGlzdGVuCisgIGRlZiBzZWxmLmxvZ2dlcgorICAgIEBsb2dnZXIgfHw9IG5pbAorICBlbmQKKworICBkZWYgc2VsZi5sb2dnZXI9KGxvZ2dlcikKKyAgICBAbG9nZ2VyID0gbG9nZ2VyCisgIGVuZAorCisgIGRlZiBzZWxmLnNldHVwX2RlZmF1bHRfbG9nZ2VyX2lmX3Vuc2V0CisgICAgc2VsZi5sb2dnZXIgfHw9IDo6TG9nZ2VyLm5ldyhTVERFUlIpLnRhcCBkbyB8bG9nZ2VyfAorICAgICAgZGVidWdnaW5nID0gRU5WWydMSVNURU5fR0VNX0RFQlVHR0lORyddCisgICAgICBsb2dnZXIubGV2ZWwgPQorICAgICAgICBjYXNlIGRlYnVnZ2luZy50b19zCisgICAgICAgIHdoZW4gLzIvCisgICAgICAgICAgOjpMb2dnZXI6OkRFQlVHCisgICAgICAgIHdoZW4gL3RydWV8eWVzfDEvaQorICAgICAgICAgIDo6TG9nZ2VyOjpJTkZPCisgICAgICAgIGVsc2UKKyAgICAgICAgICA6OkxvZ2dlcjo6RVJST1IKKyAgICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGNsYXNzIExvZ2dlcgorICAgIFs6ZmF0YWwsIDplcnJvciwgOndhcm4sIDppbmZvLCA6ZGVidWddLmVhY2ggZG8gfG1ldGh8CisgICAgICBkZWZpbmVfc2luZ2xldG9uX21ldGhvZChtZXRoKSBkbyB8KmFyZ3MsICZibG9ja3wKKyAgICAgICAgTGlzdGVuLmxvZ2dlci5wdWJsaWNfc2VuZChtZXRoLCAqYXJncywgJmJsb2NrKSBpZiBMaXN0ZW4ubG9nZ2VyCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL29wdGlvbnMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9vcHRpb25zLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTM2YTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9vcHRpb25zLnJiCkBAIC0wLDAgKzEsMjMgQEAKK21vZHVsZSBMaXN0ZW4KKyAgY2xhc3MgT3B0aW9ucworICAgIGRlZiBpbml0aWFsaXplKG9wdHMsIGRlZmF1bHRzKQorICAgICAgQG9wdGlvbnMgPSB7fQorICAgICAgZ2l2ZW5fb3B0aW9ucyA9IG9wdHMuZHVwCisgICAgICBkZWZhdWx0cy5rZXlzLmVhY2ggZG8gfGtleXwKKyAgICAgICAgQG9wdGlvbnNba2V5XSA9IGdpdmVuX29wdGlvbnMuZGVsZXRlKGtleSkgfHwgZGVmYXVsdHNba2V5XQorICAgICAgZW5kCisKKyAgICAgIHJldHVybiBpZiBnaXZlbl9vcHRpb25zLmVtcHR5PworCisgICAgICBtc2cgPSAiVW5rbm93biBvcHRpb25zOiAje2dpdmVuX29wdGlvbnMuaW5zcGVjdH0iCisgICAgICBMaXN0ZW46OkxvZ2dlci53YXJuIG1zZworICAgICAgZmFpbCBtc2cKKyAgICBlbmQKKworICAgIGRlZiBtZXRob2RfbWlzc2luZyhuYW1lLCAqXykKKyAgICAgIHJldHVybiBAb3B0aW9uc1tuYW1lXSBpZiBAb3B0aW9ucy5rZXk/KG5hbWUpCisgICAgICBtc2cgPSAiQmFkIG9wdGlvbjogI3tuYW1lLmluc3BlY3R9ICh2YWxpZDoje0BvcHRpb25zLmtleXMuaW5zcGVjdH0pIgorICAgICAgZmFpbCBOYW1lRXJyb3IsIG1zZworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vcXVldWVfb3B0aW1pemVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vcXVldWVfb3B0aW1pemVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzdiODkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9xdWV1ZV9vcHRpbWl6ZXIucmIKQEAgLTAsMCArMSwxMzIgQEAKK21vZHVsZSBMaXN0ZW4KKyAgY2xhc3MgUXVldWVPcHRpbWl6ZXIKKyAgICBjbGFzcyBDb25maWcKKyAgICAgIGRlZiBpbml0aWFsaXplKGFkYXB0ZXJfY2xhc3MsIHNpbGVuY2VyKQorICAgICAgICBAYWRhcHRlcl9jbGFzcyA9IGFkYXB0ZXJfY2xhc3MKKyAgICAgICAgQHNpbGVuY2VyID0gc2lsZW5jZXIKKyAgICAgIGVuZAorCisgICAgICBkZWYgZXhpc3Q/KHBhdGgpCisgICAgICAgIFBhdGhuYW1lKHBhdGgpLmV4aXN0PworICAgICAgZW5kCisKKyAgICAgIGRlZiBzaWxlbmNlZD8ocGF0aCwgdHlwZSkKKyAgICAgICAgQHNpbGVuY2VyLnNpbGVuY2VkPyhwYXRoLCB0eXBlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBkZWJ1ZygqYXJncywgJmJsb2NrKQorICAgICAgICBMaXN0ZW4ubG9nZ2VyLmRlYnVnKCphcmdzLCAmYmxvY2spCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBzbW9vc2hfY2hhbmdlcyhjaGFuZ2VzKQorICAgICAgIyBUT0RPOiBhZGFwdGVyIGNvdWxkIGJlIG5pbCBhdCB0aGlzIHBvaW50IChzaHV0ZG93bikKKyAgICAgIGNvb2tpZXMgPSBjaGFuZ2VzLmdyb3VwX2J5IGRvIHxfLCBfLCBfLCBfLCBvcHRpb25zfAorICAgICAgICAob3B0aW9ucyB8fCB7fSlbOmNvb2tpZV0KKyAgICAgIGVuZAorICAgICAgX3NxdWFzaF9jaGFuZ2VzKF9yZWludGVycHJldF9yZWxhdGVkX2NoYW5nZXMoY29va2llcykpCisgICAgZW5kCisKKyAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcpCisgICAgICBAY29uZmlnID0gY29uZmlnCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBhdHRyX3JlYWRlciA6Y29uZmlnCisKKyAgICAjIGdyb3VwcyBjaGFuZ2VzIGludG8gdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSBleHBlY3RlZCBieQorICAgICMgY2xpZW50cworICAgIGRlZiBfc3F1YXNoX2NoYW5nZXMoY2hhbmdlcykKKyAgICAgICMgV2UgY29tYmluZSBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAjIE5ld2VyIGNsaWVudHMgc2hvdWxkIHJlY2VpdmUgZGlyIGFuZCBwYXRoIHNlcGFyYXRlbHkKKyAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzLm1hcCB7IHxjaGFuZ2UsIGRpciwgcGF0aHwgW2NoYW5nZSwgZGlyICsgcGF0aF0gfQorCisgICAgICBhY3Rpb25zID0gY2hhbmdlcy5ncm91cF9ieSgmOmxhc3QpLm1hcCBkbyB8cGF0aCwgYWN0aW9uX2xpc3R8CisgICAgICAgIFtfbG9naWNhbF9hY3Rpb25fZm9yKHBhdGgsIGFjdGlvbl9saXN0Lm1hcCgmOmZpcnN0KSksIHBhdGgudG9fc10KKyAgICAgIGVuZAorCisgICAgICBjb25maWcuZGVidWcoImxpc3RlbjogcmF3IGNoYW5nZXM6ICN7YWN0aW9ucy5pbnNwZWN0fSIpCisKKyAgICAgIHsgbW9kaWZpZWQ6IFtdLCBhZGRlZDogW10sIHJlbW92ZWQ6IFtdIH0udGFwIGRvIHxzcXVhc2hlZHwKKyAgICAgICAgYWN0aW9ucy5lYWNoIGRvIHx0eXBlLCBwYXRofAorICAgICAgICAgIHNxdWFzaGVkW3R5cGVdIDw8IHBhdGggdW5sZXNzIHR5cGUubmlsPworICAgICAgICBlbmQKKyAgICAgICAgY29uZmlnLmRlYnVnKCJsaXN0ZW46IGZpbmFsIGNoYW5nZXM6ICN7c3F1YXNoZWQuaW5zcGVjdH0iKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgX2xvZ2ljYWxfYWN0aW9uX2ZvcihwYXRoLCBhY3Rpb25zKQorICAgICAgYWN0aW9ucyA8PCA6YWRkZWQgaWYgYWN0aW9ucy5kZWxldGUoOm1vdmVkX3RvKQorICAgICAgYWN0aW9ucyA8PCA6cmVtb3ZlZCBpZiBhY3Rpb25zLmRlbGV0ZSg6bW92ZWRfZnJvbSkKKworICAgICAgbW9kaWZpZWQgPSBhY3Rpb25zLmRldGVjdCB7IHx4fCB4ID09IDptb2RpZmllZCB9CisgICAgICBfY2FsY3VsYXRlX2FkZF9yZW1vdmVfZGlmZmVyZW5jZShhY3Rpb25zLCBwYXRoLCBtb2RpZmllZCkKKyAgICBlbmQKKworICAgIGRlZiBfY2FsY3VsYXRlX2FkZF9yZW1vdmVfZGlmZmVyZW5jZShhY3Rpb25zLCBwYXRoLCBkZWZhdWx0X2lmX2V4aXN0cykKKyAgICAgIGFkZGVkID0gYWN0aW9ucy5jb3VudCB7IHx4fCB4ID09IDphZGRlZCB9CisgICAgICByZW1vdmVkID0gYWN0aW9ucy5jb3VudCB7IHx4fCB4ID09IDpyZW1vdmVkIH0KKyAgICAgIGRpZmYgPSBhZGRlZCAtIHJlbW92ZWQKKworICAgICAgIyBUT0RPOiBhdm9pZCBjaGVja2luZyBpZiBwYXRoIGV4aXN0cyBhbmQgaW5zdGVhZCBhc3N1bWUgdGhlIGV2ZW50cyBhcmUKKyAgICAgICMgaW4gb3JkZXIgKGlmIGxhc3QgaXMgOnJlbW92ZWQsIGl0IGRvZXNuJ3QgZXhpc3QsIGV0Yy4pCisgICAgICBpZiBjb25maWcuZXhpc3Q/KHBhdGgpCisgICAgICAgIGlmIGRpZmYgPiAwCisgICAgICAgICAgOmFkZGVkCisgICAgICAgIGVsc2lmIGRpZmYuemVybz8gJiYgYWRkZWQgPiAwCisgICAgICAgICAgOm1vZGlmaWVkCisgICAgICAgIGVsc2UKKyAgICAgICAgICBkZWZhdWx0X2lmX2V4aXN0cworICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgZGlmZiA8IDAgPyA6cmVtb3ZlZCA6IG5pbAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIHJlbW92ZSBleHRyYW5lb3VzIHJiLWlub3RpZnkgZXZlbnRzLCBrZWVwaW5nIHRoZW0gb25seSBpZiBpdCdzIGEgcG9zc2libGUKKyAgICAjIGVkaXRvciByZW5hbWUoKSBjYWxsIChlLmcuIEthdGUgYW5kIFN1YmxpbWUpCisgICAgZGVmIF9yZWludGVycHJldF9yZWxhdGVkX2NoYW5nZXMoY29va2llcykKKyAgICAgIHRhYmxlID0geyBtb3ZlZF90bzogOmFkZGVkLCBtb3ZlZF9mcm9tOiA6cmVtb3ZlZCB9CisgICAgICBjb29raWVzLm1hcCBkbyB8XywgY2hhbmdlc3wKKyAgICAgICAgZGF0YSA9IF9kZXRlY3RfcG9zc2libGVfZWRpdG9yX3NhdmUoY2hhbmdlcykKKyAgICAgICAgaWYgZGF0YQorICAgICAgICAgIHRvX2RpciwgdG9fZmlsZSA9IGRhdGEKKyAgICAgICAgICBbWzptb2RpZmllZCwgdG9fZGlyLCB0b19maWxlXV0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG5vdF9zaWxlbmNlZCA9IGNoYW5nZXMucmVqZWN0IGRvIHx0eXBlLCBfLCBfLCBwYXRoLCBffAorICAgICAgICAgICAgY29uZmlnLnNpbGVuY2VkPyhQYXRobmFtZShwYXRoKSwgdHlwZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBub3Rfc2lsZW5jZWQubWFwIGRvIHxfLCBjaGFuZ2UsIGRpciwgcGF0aCwgX3wKKyAgICAgICAgICAgIFt0YWJsZS5mZXRjaChjaGFuZ2UsIGNoYW5nZSksIGRpciwgcGF0aF0KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQuZmxhdHRlbigxKQorICAgIGVuZAorCisgICAgZGVmIF9kZXRlY3RfcG9zc2libGVfZWRpdG9yX3NhdmUoY2hhbmdlcykKKyAgICAgIHJldHVybiB1bmxlc3MgY2hhbmdlcy5zaXplID09IDIKKworICAgICAgZnJvbV90eXBlID0gZnJvbV9jaGFuZ2UgPSBmcm9tID0gbmlsCisgICAgICB0b190eXBlID0gdG9fY2hhbmdlID0gdG9fZGlyID0gdG8gPSBuaWwKKworICAgICAgY2hhbmdlcy5lYWNoIGRvIHxkYXRhfAorICAgICAgICBjYXNlIGRhdGFbMV0KKyAgICAgICAgd2hlbiA6bW92ZWRfZnJvbQorICAgICAgICAgIGZyb21fdHlwZSwgZnJvbV9jaGFuZ2UsIF8sIGZyb20sIF8gPSBkYXRhCisgICAgICAgIHdoZW4gOm1vdmVkX3RvCisgICAgICAgICAgdG9fdHlwZSwgdG9fY2hhbmdlLCB0b19kaXIsIHRvLCBfID0gZGF0YQorICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIG5pbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gdW5sZXNzIGZyb20gJiYgdG8KKworICAgICAgIyBFeHBlY3QgYW4gaWdub3JlZCBtb3ZlZF9mcm9tIGFuZCBub24taWdub3JlZCBtb3ZlZF90bworICAgICAgIyB0byBxdWFsaWZ5IGFzIGFuICJlZGl0b3IgbW9kaWZ5IgorICAgICAgcmV0dXJuIHVubGVzcyBjb25maWcuc2lsZW5jZWQ/KFBhdGhuYW1lKGZyb20pLCBmcm9tX3R5cGUpCisgICAgICBjb25maWcuc2lsZW5jZWQ/KFBhdGhuYW1lKHRvKSwgdG9fdHlwZSkgPyBuaWwgOiBbdG9fZGlyLCB0b10KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL3JlY29yZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL3JlY29yZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGUzNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vcmVjb3JkLnJiCkBAIC0wLDAgKzEsMTIwIEBACityZXF1aXJlICd0aHJlYWQnCityZXF1aXJlICdsaXN0ZW4vcmVjb3JkL2VudHJ5JworcmVxdWlyZSAnbGlzdGVuL3JlY29yZC9zeW1saW5rX2RldGVjdG9yJworCittb2R1bGUgTGlzdGVuCisgIGNsYXNzIFJlY29yZAorICAgICMgVE9ETzogb25lIFJlY29yZCBvYmplY3QgcGVyIHdhdGNoZWQgZGlyZWN0b3J5PworICAgICMgVE9ETzogZGVwcmVjYXRlCisKKyAgICBhdHRyX3JlYWRlciA6cm9vdAorICAgIGRlZiBpbml0aWFsaXplKGRpcmVjdG9yeSkKKyAgICAgIEB0cmVlID0gX2F1dG9faGFzaAorICAgICAgQHJvb3QgPSBkaXJlY3RvcnkudG9fcworICAgIGVuZAorCisgICAgZGVmIGFkZF9kaXIocmVsX3BhdGgpCisgICAgICByZXR1cm4gaWYgW25pbCwgJycsICcuJ10uaW5jbHVkZT8gcmVsX3BhdGgKKyAgICAgIEB0cmVlW3JlbF9wYXRoXSB8fD0ge30KKyAgICBlbmQKKworICAgIGRlZiB1cGRhdGVfZmlsZShyZWxfcGF0aCwgZGF0YSkKKyAgICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gUGF0aG5hbWUocmVsX3BhdGgpLnNwbGl0Lm1hcCgmOnRvX3MpCisgICAgICBfZmFzdF91cGRhdGVfZmlsZShkaXJuYW1lLCBiYXNlbmFtZSwgZGF0YSkKKyAgICBlbmQKKworICAgIGRlZiB1bnNldF9wYXRoKHJlbF9wYXRoKQorICAgICAgZGlybmFtZSwgYmFzZW5hbWUgPSBQYXRobmFtZShyZWxfcGF0aCkuc3BsaXQubWFwKCY6dG9fcykKKyAgICAgIF9mYXN0X3Vuc2V0X3BhdGgoZGlybmFtZSwgYmFzZW5hbWUpCisgICAgZW5kCisKKyAgICBkZWYgZmlsZV9kYXRhKHJlbF9wYXRoKQorICAgICAgZGlybmFtZSwgYmFzZW5hbWUgPSBQYXRobmFtZShyZWxfcGF0aCkuc3BsaXQubWFwKCY6dG9fcykKKyAgICAgIGlmIFtuaWwsICcnLCAnLiddLmluY2x1ZGU/IGRpcm5hbWUKKyAgICAgICAgdHJlZVtiYXNlbmFtZV0gfHw9IHt9CisgICAgICAgIHRyZWVbYmFzZW5hbWVdLmR1cAorICAgICAgZWxzZQorICAgICAgICB0cmVlW2Rpcm5hbWVdIHx8PSB7fQorICAgICAgICB0cmVlW2Rpcm5hbWVdW2Jhc2VuYW1lXSB8fD0ge30KKyAgICAgICAgdHJlZVtkaXJuYW1lXVtiYXNlbmFtZV0uZHVwCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBkaXJfZW50cmllcyhyZWxfcGF0aCkKKyAgICAgIHN1YnRyZWUgPQorICAgICAgICBpZiBbbmlsLCAnJywgJy4nXS5pbmNsdWRlPyByZWxfcGF0aC50b19zCisgICAgICAgICAgdHJlZQorICAgICAgICBlbHNlCisgICAgICAgICAgdHJlZVtyZWxfcGF0aC50b19zXSB8fD0gX2F1dG9faGFzaAorICAgICAgICAgIHRyZWVbcmVsX3BhdGgudG9fc10KKyAgICAgICAgZW5kCisKKyAgICAgIHJlc3VsdCA9IHt9CisgICAgICBzdWJ0cmVlLmVhY2ggZG8gfGtleSwgdmFsdWVzfAorICAgICAgICAjIG9ubHkgZ2V0IGRhdGEgZm9yIGZpbGUgZW50cmllcworICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlcy5rZXk/KDptdGltZSkgPyB2YWx1ZXMgOiB7fQorICAgICAgZW5kCisgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBidWlsZAorICAgICAgQHRyZWUgPSBfYXV0b19oYXNoCisgICAgICAjIFRPRE86IHRlc3Qgd2l0aCBhIGZpbGUgbmFtZSBnaXZlbgorICAgICAgIyBUT0RPOiB0ZXN0IG90aGVyIHBlcm1pc3Npb25zCisgICAgICAjIFRPRE86IHRlc3Qgd2l0aCBtaXhlZCBlbmNvZGluZworICAgICAgc3ltbGlua19kZXRlY3RvciA9IFN5bWxpbmtEZXRlY3Rvci5uZXcKKyAgICAgIHJlbWFpbmluZyA9IDo6UXVldWUubmV3CisgICAgICByZW1haW5pbmcgPDwgRW50cnkubmV3KHJvb3QsIG5pbCwgbmlsKQorICAgICAgX2Zhc3RfYnVpbGRfZGlyKHJlbWFpbmluZywgc3ltbGlua19kZXRlY3RvcikgdW50aWwgcmVtYWluaW5nLmVtcHR5PworICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIF9hdXRvX2hhc2gKKyAgICAgIEhhc2gubmV3IHsgfGgsIGt8IGhba10gPSBIYXNoLm5ldyB9CisgICAgZW5kCisKKyAgICBkZWYgdHJlZQorICAgICAgQHRyZWUKKyAgICBlbmQKKworICAgIGRlZiBfZmFzdF91cGRhdGVfZmlsZShkaXJuYW1lLCBiYXNlbmFtZSwgZGF0YSkKKyAgICAgIGlmIFtuaWwsICcnLCAnLiddLmluY2x1ZGU/IGRpcm5hbWUKKyAgICAgICAgdHJlZVtiYXNlbmFtZV0gPSAodHJlZVtiYXNlbmFtZV0gfHwge30pLm1lcmdlKGRhdGEpCisgICAgICBlbHNlCisgICAgICAgIHRyZWVbZGlybmFtZV0gfHw9IHt9CisgICAgICAgIHRyZWVbZGlybmFtZV1bYmFzZW5hbWVdID0gKHRyZWVbZGlybmFtZV1bYmFzZW5hbWVdIHx8IHt9KS5tZXJnZShkYXRhKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgX2Zhc3RfdW5zZXRfcGF0aChkaXJuYW1lLCBiYXNlbmFtZSkKKyAgICAgICMgdGhpcyBtYXkgbmVlZCB0byBiZSByZXdvcmtlZCB0byBwcm9wZXJseSByZW1vdmUKKyAgICAgICMgZW50cmllcyBmcm9tIGEgdHJlZSwgd2l0aG91dCBhZGRpbmcgbm9uLWV4aXN0aW5nIGRpcnMgdG8gdGhlIHJlY29yZAorICAgICAgaWYgW25pbCwgJycsICcuJ10uaW5jbHVkZT8gZGlybmFtZQorICAgICAgICByZXR1cm4gdW5sZXNzIHRyZWUua2V5PyhiYXNlbmFtZSkKKyAgICAgICAgdHJlZS5kZWxldGUoYmFzZW5hbWUpCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiB1bmxlc3MgdHJlZS5rZXk/KGRpcm5hbWUpCisgICAgICAgIHRyZWVbZGlybmFtZV0uZGVsZXRlKGJhc2VuYW1lKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgX2Zhc3RfYnVpbGRfZGlyKHJlbWFpbmluZywgc3ltbGlua19kZXRlY3RvcikKKyAgICAgIGVudHJ5ID0gcmVtYWluaW5nLnBvcAorICAgICAgY2hpbGRyZW4gPSBlbnRyeS5jaGlsZHJlbiAjIE5PVEU6IGNoaWxkcmVuKCkgaW1wbGljaXRseSB0ZXN0cyBpZiBkaXIKKyAgICAgIHN5bWxpbmtfZGV0ZWN0b3IudmVyaWZ5X3Vud2F0Y2hlZCEoZW50cnkpCisgICAgICBjaGlsZHJlbi5lYWNoIHsgfGNoaWxkfCByZW1haW5pbmcgPDwgY2hpbGQgfQorICAgICAgYWRkX2RpcihlbnRyeS5yZWNvcmRfZGlyX2tleSkKKyAgICByZXNjdWUgRXJybm86OkVOT1RESVIKKyAgICAgIF9mYXN0X3RyeV9maWxlKGVudHJ5KQorICAgIHJlc2N1ZSBTeXN0ZW1DYWxsRXJyb3IsIFN5bWxpbmtEZXRlY3Rvcjo6RXJyb3IKKyAgICAgIF9mYXN0X3Vuc2V0X3BhdGgoZW50cnkucmVsYXRpdmUsIGVudHJ5Lm5hbWUpCisgICAgZW5kCisKKyAgICBkZWYgX2Zhc3RfdHJ5X2ZpbGUoZW50cnkpCisgICAgICBfZmFzdF91cGRhdGVfZmlsZShlbnRyeS5yZWxhdGl2ZSwgZW50cnkubmFtZSwgZW50cnkubWV0YSkKKyAgICByZXNjdWUgU3lzdGVtQ2FsbEVycm9yCisgICAgICBfZmFzdF91bnNldF9wYXRoKGVudHJ5LnJlbGF0aXZlLCBlbnRyeS5uYW1lKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vcmVjb3JkL2VudHJ5LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vcmVjb3JkL2VudHJ5LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzdiOWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9yZWNvcmQvZW50cnkucmIKQEAgLTAsMCArMSw2MiBAQAorbW9kdWxlIExpc3RlbgorICAjIEBwcml2YXRlIGFwaQorICBjbGFzcyBSZWNvcmQKKyAgICAjIFJlcHJlc2VudHMgYSBkaXJlY3RvcnkgZW50cnkgKGRpciBvciBmaWxlKQorICAgIGNsYXNzIEVudHJ5CisgICAgICAjIGZpbGU6ICIvaG9tZS9tZS93YXRjaGVkX2RpciIsICJhcHAvbW9kZWxzIiwgImZvby5yYiIKKyAgICAgICMgZGlyLCAiL2hvbWUvbWUvd2F0Y2hlZF9kaXIiLCAiLiIKKyAgICAgIGRlZiBpbml0aWFsaXplKHJvb3QsIHJlbGF0aXZlLCBuYW1lID0gbmlsKQorICAgICAgICBAcm9vdCwgQHJlbGF0aXZlLCBAbmFtZSA9IHJvb3QsIHJlbGF0aXZlLCBuYW1lCisgICAgICBlbmQKKworICAgICAgYXR0cl9yZWFkZXIgOnJvb3QsIDpyZWxhdGl2ZSwgOm5hbWUKKworICAgICAgZGVmIGNoaWxkcmVuCisgICAgICAgIGNoaWxkX3JlbGF0aXZlID0gX2pvaW4KKyAgICAgICAgKF9lbnRyaWVzKHN5c19wYXRoKSAtICV3KC4gLi4pKS5tYXAgZG8gfG5hbWV8CisgICAgICAgICAgRW50cnkubmV3KEByb290LCBjaGlsZF9yZWxhdGl2ZSwgbmFtZSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIG1ldGEKKyAgICAgICAgbHN0YXQgPSA6OkZpbGUubHN0YXQoc3lzX3BhdGgpCisgICAgICAgIHsgbXRpbWU6IGxzdGF0Lm10aW1lLnRvX2YsIG1vZGU6IGxzdGF0Lm1vZGUgfQorICAgICAgZW5kCisKKyAgICAgICMgcmVjb3JkIGhhc2ggaXMgZS5nLgorICAgICAgIyBpZiBAcmVjb3JkWyIvaG9tZS9tZS93YXRjaGVkX2RpciJdWyJwcm9qZWN0L2FwcC9tb2RlbHMiXVsiZm9vLnJiIl0KKyAgICAgICMgaWYgQHJlY29yZFsiL2hvbWUvbWUvd2F0Y2hlZF9kaXIiXVsicHJvamVjdC9hcHAiXVsibW9kZWxzIl0KKyAgICAgICMgcmVjb3JkX2Rpcl9rZXkgaXMgInByb2plY3QvYXBwL21vZGVscyIKKyAgICAgIGRlZiByZWNvcmRfZGlyX2tleQorICAgICAgICA6OkZpbGUuam9pbigqW0ByZWxhdGl2ZSwgQG5hbWVdLmNvbXBhY3QpCisgICAgICBlbmQKKworICAgICAgZGVmIHN5c19wYXRoCisgICAgICAgICMgVXNlIGZ1bGwgcGF0aCBpbiBjYXNlIHNvbWVvbmUgdXNlcyBjaGRpcgorICAgICAgICA6OkZpbGUuam9pbigqW0Byb290LCBAcmVsYXRpdmUsIEBuYW1lXS5jb21wYWN0KQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZWFsX3BhdGgKKyAgICAgICAgQHJlYWxfcGF0aCB8fD0gOjpGaWxlLnJlYWxwYXRoKHN5c19wYXRoKQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgZGVmIF9qb2luCisgICAgICAgIGFyZ3MgPSBbQHJlbGF0aXZlLCBAbmFtZV0uY29tcGFjdAorICAgICAgICBhcmdzLmVtcHR5PyA/IG5pbCA6IDo6RmlsZS5qb2luKCphcmdzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfZW50cmllcyhkaXIpCisgICAgICAgIHJldHVybiBEaXIuZW50cmllcyhkaXIpIHVubGVzcyBSVUJZX0VOR0lORSA9PSAnanJ1YnknCisKKyAgICAgICAgIyBKUnVieSBpbmNvbnNpc3RlbmN5IHdvcmthcm91bmQsIHNlZToKKyAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vanJ1YnkvanJ1YnkvaXNzdWVzLzM4NDAKKyAgICAgICAgZXhpc3RzID0gOjpGaWxlLmV4aXN0PyhkaXIpCisgICAgICAgIGRpcmVjdG9yeSA9IDo6RmlsZS5kaXJlY3Rvcnk/KGRpcikKKyAgICAgICAgcmV0dXJuIERpci5lbnRyaWVzKGRpcikgdW5sZXNzIChleGlzdHMgJiYgIWRpcmVjdG9yeSkKKyAgICAgICAgcmFpc2UgRXJybm86OkVOT1RESVIsIGRpcgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9yZWNvcmQvc3ltbGlua19kZXRlY3Rvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL3JlY29yZC9zeW1saW5rX2RldGVjdG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjFhMWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9yZWNvcmQvc3ltbGlua19kZXRlY3Rvci5yYgpAQCAtMCwwICsxLDM5IEBACityZXF1aXJlICdzZXQnCisKK21vZHVsZSBMaXN0ZW4KKyAgIyBAcHJpdmF0ZSBhcGkKKyAgY2xhc3MgUmVjb3JkCisgICAgY2xhc3MgU3ltbGlua0RldGVjdG9yCisgICAgICBXSUtJID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vd2lraS9EdXBsaWNhdGUtZGlyZWN0b3J5LWVycm9ycycKKworICAgICAgU1lNTElOS19MT09QX0VSUk9SID0gPDwtRU9TCisgICAgICAgICoqIEVSUk9SOiBkaXJlY3RvcnkgaXMgYWxyZWFkeSBiZWluZyB3YXRjaGVkISAqKgorCisgICAgICAgIERpcmVjdG9yeTogJXMKKworICAgICAgICBpcyBhbHJlYWR5IGJlaW5nIHdhdGNoZWQgdGhyb3VnaDogJXMKKworICAgICAgICBNT1JFIElORk86ICN7V0lLSX0KKyAgICAgIEVPUworCisgICAgICBjbGFzcyBFcnJvciA8IFJ1bnRpbWVFcnJvcgorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbml0aWFsaXplCisgICAgICAgIEByZWFsX2RpcnMgPSBTZXQubmV3CisgICAgICBlbmQKKworICAgICAgZGVmIHZlcmlmeV91bndhdGNoZWQhKGVudHJ5KQorICAgICAgICByZWFsX3BhdGggPSBlbnRyeS5yZWFsX3BhdGgKKyAgICAgICAgQHJlYWxfZGlycy5hZGQ/KHJlYWxfcGF0aCkgfHwgX2ZhaWwoZW50cnkuc3lzX3BhdGgsIHJlYWxfcGF0aCkKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBfZmFpbChzeW1saW5rZWQsIHJlYWxfcGF0aCkKKyAgICAgICAgU1RERVJSLnB1dHMgZm9ybWF0KFNZTUxJTktfTE9PUF9FUlJPUiwgc3ltbGlua2VkLCByZWFsX3BhdGgpCisgICAgICAgIGZhaWwgRXJyb3IsICdGYWlsZWQgZHVlIHRvIGxvb3BlZCBzeW1saW5rcycKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vc2lsZW5jZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9zaWxlbmNlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzlmODRiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vc2lsZW5jZXIucmIKQEAgLTAsMCArMSw5NyBAQAorbW9kdWxlIExpc3RlbgorICBjbGFzcyBTaWxlbmNlcgorICAgICMgVGhlIGRlZmF1bHQgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IGdldCBpZ25vcmVkLgorICAgIERFRkFVTFRfSUdOT1JFRF9ESVJFQ1RPUklFUyA9ICVye14oPzoKKyAgICAgIFwuZ2l0CisgICAgICB8IFwuc3ZuCisgICAgICB8IFwuaGcKKyAgICAgIHwgXC5yYngKKyAgICAgIHwgXC5idW5kbGUKKyAgICAgIHwgYnVuZGxlCisgICAgICB8IHZlbmRvci9idW5kbGUKKyAgICAgIHwgbG9nCisgICAgICB8IHRtcAorICAgICAgfHZlbmRvci9ydWJ5CisgICAgKSgvfCQpfXgKKworICAgICMgVGhlIGRlZmF1bHQgbGlzdCBvZiBmaWxlcyB0aGF0IGdldCBpZ25vcmVkLgorICAgIERFRkFVTFRfSUdOT1JFRF9FWFRFTlNJT05TICA9IC8oPzoKKyAgICAgICMgS2F0ZSdzIHRtcFwvc3dwIGZpbGVzCisgICAgICBcLi4qXGQrXC5uZXcKKyAgICAgIHwgXC5rYXRlLXN3cAorCisgICAgICAjIEdlZGl0IHRtcCBmaWxlcworICAgICAgfCBcLmdvdXRwdXRzdHJlYW0tLns2fQorCisgICAgICAjIEludGVsbGlqIGZpbGVzCisgICAgICB8IF9fX2piX2Jha19fXworICAgICAgfCBfX19qYl9vbGRfX18KKworICAgICAgIyBWaW0gc3dhcCBmaWxlcyBhbmQgd3JpdGUgdGVzdAorICAgICAgfCBcLnN3W3B4XQorICAgICAgfCBcLnN3cHgKKyAgICAgIHwgXjQ5MTMKKworICAgICAgIyBTZWQgdGVtcG9yYXJ5IGZpbGVzIC0gYnV0IHdpdGhvdXQgYWN0dWFsIHdvcmRzLCBsaWtlICdzZWRhdGl2ZXMnCisgICAgICB8ICg/Ol4KKyAgICAgICAgIHNlZAorCisgICAgICAgICAoPzoKKyAgICAgICAgICBbYS16QS1aMC05XXswfVtBLVpdezF9W2EtekEtWjAtOV17NX0gfAorICAgICAgICAgIFthLXpBLVowLTldezF9W0EtWl17MX1bYS16QS1aMC05XXs0fSB8CisgICAgICAgICAgW2EtekEtWjAtOV17Mn1bQS1aXXsxfVthLXpBLVowLTldezN9IHwKKyAgICAgICAgICBbYS16QS1aMC05XXszfVtBLVpdezF9W2EtekEtWjAtOV17Mn0gfAorICAgICAgICAgIFthLXpBLVowLTldezR9W0EtWl17MX1bYS16QS1aMC05XXsxfSB8CisgICAgICAgICAgW2EtekEtWjAtOV17NX1bQS1aXXsxfVthLXpBLVowLTldezB9CisgICAgICAgICApCisgICAgICAgICkKKworICAgICAgIyBvdGhlciBmaWxlcworICAgICAgfCBcLkRTX1N0b3JlCisgICAgICB8IFwudG1wCisgICAgICB8IH4KKyAgICApJC94CisKKyAgICBhdHRyX2FjY2Vzc29yIDpvbmx5X3BhdHRlcm5zLCA6aWdub3JlX3BhdHRlcm5zCisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgY29uZmlndXJlKHt9KQorICAgIGVuZAorCisgICAgZGVmIGNvbmZpZ3VyZShvcHRpb25zKQorICAgICAgQG9ubHlfcGF0dGVybnMgPSBvcHRpb25zWzpvbmx5XSA/IEFycmF5KG9wdGlvbnNbOm9ubHldKSA6IG5pbAorICAgICAgQGlnbm9yZV9wYXR0ZXJucyA9IF9pbml0X2lnbm9yZXMob3B0aW9uc1s6aWdub3JlXSwgb3B0aW9uc1s6aWdub3JlIV0pCisgICAgZW5kCisKKyAgICAjIE5vdGU6IHJlbGF0aXZlX3BhdGggaXMgdGVtcG9yYXJpbHkgZXhwZWN0ZWQgdG8gYmUgYSByZWxhdGl2ZSBQYXRobmFtZSB0bworICAgICMgbWFrZSByZWZhY3RvcmluZyBlYXNpZXIgKGlkZWFsbHksIGl0IHdvdWxkIHRha2UgYSBzdHJpbmcpCisKKyAgICAjIFRPRE86IHN3aXRjaCB0eXBlIGFuZCBwYXRoIHBsYWNlcyAtIGFuZCB2ZXJpZnkKKyAgICBkZWYgc2lsZW5jZWQ/KHJlbGF0aXZlX3BhdGgsIHR5cGUpCisgICAgICBwYXRoID0gcmVsYXRpdmVfcGF0aC50b19zCisKKyAgICAgIGlmIG9ubHlfcGF0dGVybnMgJiYgdHlwZSA9PSA6ZmlsZQorICAgICAgICByZXR1cm4gdHJ1ZSB1bmxlc3Mgb25seV9wYXR0ZXJucy5hbnk/IHsgfHBhdHRlcm58IHBhdGggPX4gcGF0dGVybiB9CisgICAgICBlbmQKKworICAgICAgaWdub3JlX3BhdHRlcm5zLmFueT8geyB8cGF0dGVybnwgcGF0aCA9fiBwYXR0ZXJuIH0KKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGF0dHJfcmVhZGVyIDpvcHRpb25zCisKKyAgICBkZWYgX2luaXRfaWdub3JlcyhpZ25vcmVzLCBvdmVycmlkZXMpCisgICAgICBwYXR0ZXJucyA9IFtdCisgICAgICB1bmxlc3Mgb3ZlcnJpZGVzCisgICAgICAgIHBhdHRlcm5zIDw8IERFRkFVTFRfSUdOT1JFRF9ESVJFQ1RPUklFUworICAgICAgICBwYXR0ZXJucyA8PCBERUZBVUxUX0lHTk9SRURfRVhURU5TSU9OUworICAgICAgZW5kCisKKyAgICAgIHBhdHRlcm5zIDw8IGlnbm9yZXMKKyAgICAgIHBhdHRlcm5zIDw8IG92ZXJyaWRlcworCisgICAgICBwYXR0ZXJucy5jb21wYWN0LmZsYXR0ZW4KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL2xpc3Rlbi0zLjAuOC9saWIvbGlzdGVuL3NpbGVuY2VyL2NvbnRyb2xsZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9zaWxlbmNlci9jb250cm9sbGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2UwYWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi9zaWxlbmNlci9jb250cm9sbGVyLnJiCkBAIC0wLDAgKzEsNDggQEAKK21vZHVsZSBMaXN0ZW4KKyAgY2xhc3MgU2lsZW5jZXIKKyAgICBjbGFzcyBDb250cm9sbGVyCisgICAgICBkZWYgaW5pdGlhbGl6ZShzaWxlbmNlciwgZGVmYXVsdF9vcHRpb25zKQorICAgICAgICBAc2lsZW5jZXIgPSBzaWxlbmNlcgorCisgICAgICAgIG9wdHMgPSBkZWZhdWx0X29wdGlvbnMKKworICAgICAgICBAcHJldl9zaWxlbmNlcl9vcHRpb25zID0ge30KKyAgICAgICAgcnVsZXMgPSBbOm9ubHksIDppZ25vcmUsIDppZ25vcmUhXS5tYXAgZG8gfG9wdGlvbnwKKyAgICAgICAgICBbb3B0aW9uLCBvcHRzW29wdGlvbl1dIGlmIG9wdHMua2V5PyBvcHRpb24KKyAgICAgICAgZW5kCisKKyAgICAgICAgX3JlY29uZmlndXJlX3NpbGVuY2VyKEhhc2hbcnVsZXMuY29tcGFjdF0pCisgICAgICBlbmQKKworICAgICAgZGVmIGFwcGVuZF9pZ25vcmVzKCpyZWdleHBzKQorICAgICAgICBwcmV2X2lnbm9yZXMgPSBBcnJheShAcHJldl9zaWxlbmNlcl9vcHRpb25zWzppZ25vcmVdKQorICAgICAgICBfcmVjb25maWd1cmVfc2lsZW5jZXIoaWdub3JlOiBbcHJldl9pZ25vcmVzICsgcmVnZXhwc10pCisgICAgICBlbmQKKworICAgICAgZGVmIHJlcGxhY2Vfd2l0aF9iYW5nX2lnbm9yZXMocmVnZXhwcykKKyAgICAgICAgX3JlY29uZmlndXJlX3NpbGVuY2VyKGlnbm9yZSE6IHJlZ2V4cHMpCisgICAgICBlbmQKKworICAgICAgZGVmIHJlcGxhY2Vfd2l0aF9vbmx5KHJlZ2V4cHMpCisgICAgICAgIF9yZWNvbmZpZ3VyZV9zaWxlbmNlcihvbmx5OiByZWdleHBzKQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgZGVmIF9yZWNvbmZpZ3VyZV9zaWxlbmNlcihleHRyYV9vcHRpb25zKQorICAgICAgICBvcHRzID0gZXh0cmFfb3B0aW9ucy5kdXAKKyAgICAgICAgb3B0cyA9IG9wdHMubWFwIGRvIHxrZXksIHZhbHVlfAorICAgICAgICAgIFtrZXksIEFycmF5KHZhbHVlKS5mbGF0dGVuLmNvbXBhY3RdCisgICAgICAgIGVuZAorICAgICAgICBvcHRzID0gSGFzaFtvcHRzXQorCisgICAgICAgIGlmIG9wdHMua2V5Pyg6aWdub3JlKSAmJiBvcHRzWzppZ25vcmVdLmVtcHR5PworICAgICAgICAgIG9wdHMuZGVsZXRlKDppZ25vcmUpCisgICAgICAgIGVuZAorCisgICAgICAgIEBwcmV2X3NpbGVuY2VyX29wdGlvbnMgPSBvcHRzCisgICAgICAgIEBzaWxlbmNlci5jb25maWd1cmUoQHByZXZfc2lsZW5jZXJfb3B0aW9ucy5kdXAuZnJlZXplKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9saXN0ZW4tMy4wLjgvbGliL2xpc3Rlbi92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNjOThlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbGlzdGVuLTMuMC44L2xpYi9saXN0ZW4vdmVyc2lvbi5yYgpAQCAtMCwwICsxLDMgQEAKK21vZHVsZSBMaXN0ZW4KKyAgVkVSU0lPTiA9ICczLjAuOCcKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42Ly5naXRpZ25vcmUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODdkNGJlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwxNyBAQAorKi5nZW0KKyoucmJjCisuYnVuZGxlCisuY29uZmlnCisueWFyZG9jCitHZW1maWxlLmxvY2sKK0luc3RhbGxlZEZpbGVzCitfeWFyZG9jCitjb3ZlcmFnZQorZG9jLworbGliL2J1bmRsZXIvbWFuCitwa2cKK3Jkb2MKK3NwZWMvcmVwb3J0cwordGVzdC90bXAKK3Rlc3QvdmVyc2lvbl90bXAKK3RtcApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42Ly5yc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi8ucnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxNjQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi8ucnNwZWMKQEAgLTAsMCArMSwyIEBACistLWNvbG9yCistLWZvcm1hdCBwcm9ncmVzcwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42Ly50cmF2aXMueW1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42Ly50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzI2MWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvLnRyYXZpcy55bWwKQEAgLTAsMCArMSwxNSBAQAorbGFuZ3VhZ2U6IHJ1YnkKK3J2bToKKyAgLSAxLjkuMworICAtIDIuMC4wCisgIC0gMi4xCitzdWRvOiBmYWxzZQorY2FjaGU6IGJ1bmRsZXIKK2JlZm9yZV9zY3JpcHQ6IGJ1bmRsZSB1cGRhdGUKK3NjcmlwdDogIi4vc2NyaXB0L2NpYnVpbGQiCitub3RpZmljYXRpb25zOgorICBlbWFpbDoKKyAgICByZWNpcGllbnRzOgorICAgICAgLSBtZXJjZW5hcnlAamVreWxscmIuY29tCisgICAgb25fc3VjY2VzczogY2hhbmdlCisgICAgb25fZmFpbHVyZTogY2hhbmdlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvR2VtZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9HZW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzkwZGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvR2VtZmlsZQpAQCAtMCwwICsxLDQgQEAKK3NvdXJjZSAnaHR0cHM6Ly9ydWJ5Z2Vtcy5vcmcnCisKKyMgU3BlY2lmeSB5b3VyIGdlbSdzIGRlcGVuZGVuY2llcyBpbiBtZXJjZW5hcnkuZ2Vtc3BlYworZ2Vtc3BlYwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L0hpc3RvcnkubWFya2Rvd24gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvSGlzdG9yeS5tYXJrZG93bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjBiODNmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L0hpc3RvcnkubWFya2Rvd24KQEAgLTAsMCArMSwxMDkgQEAKKyMjIDAuMy42IC8gMjAxNi0wNC0wNworCisjIyMgQnVnIEZpeGVzCisKKyAgKiBQcmVzZW50ZXI6IE9wdGlvbnMgc2hvdWxkIGluY2x1ZGUgdGhvc2UgZnJvbSBwYXJlbnQgY29tbWFuZCAoIzQyKQorCisjIyAwLjMuNSAvIDIwMTQtMTEtMTIKKworIyMjIEJ1ZyBGaXhlcworCisgICogQ2FwdHVyZSBgT3B0aW9uc1BhcnNlcjo6SW52YWxpZE9wdGlvbmAgYW5kIHNob3cgYSBuaWNlIGVycm9yIG1lc3NhZ2UgKCMzOCkKKyAgKiBBYnNvbHV0ZSBwYXRocyBmb3IgcmVxdWlyZXMgYW5kIGF1dG9sb2FkcyAoIzM5KQorCisjIyMgRGV2ZWxvcG1lbnQgRml4ZXMKKworICAqIEJ1bXAgdG8gUlNwZWMgMyAoIzQwKQorCisjIyAwLjMuNCAvIDIwMTQtMDctMTEKKworIyMjIEJ1ZyBGaXhlcworCisgICogVXNlIG9wdGlvbiBvYmplY3QgYXMga2V5IGluIHRoZSBjb21tYW5kJ3MgYEBtYXBgIGhhc2ggKCMzNSkKKworIyMgMC4zLjMgLyAyMDE0LTA1LTA3CisKKyMjIyBCdWcgRml4ZXMKKworICAqIFRoZSBgLS12ZXJzaW9uYCBmbGFnIHNob3VsZCBub3QgZXhpdCB3aXRoIGNvZGUgMSwgYnV0IGluc3RlYWQgY29kZSAwLiAoIzMzKQorCisjIyAwLjMuMiAvIDIwMTQtMDMtMTgKKworIyMjIEJ1ZyBGaXhlcworCisgICogUmVtb3ZlIGR1cGxpY2F0ZSBjb21tYW5kcyBmcm9tIGhlbHAgb3V0cHV0OyBzaG93IGFsaWFzZXMgdy9jb21tYW5kIG5hbWVzICgjMjkpCisKKyMjIDAuMy4xIC8gMjAxNC0wMi0yMQorCisjIyMgTWlub3IgRW5oYW5jZW1lbnRzCisKKyAgKiBBZGQgYC10Ly0tdHJhY2VgIHRvIGxpc3Qgb2Ygb3B0aW9ucyBpbiBoZWxwIG1lc3NhZ2UgKCMxOSkKKworIyMjIEJ1ZyBGaXhlcworCisgICogYE1lcmNlbmFyeTo6T3B0aW9uYCBub3cgYWNjZXB0cyByZXR1cm4gdmFsdWVzIGluIHRoZSBmb3JtIG9mIENsYXNzIGNvbnN0YW50cyAoIzIyKQorCisjIyAwLjMuMCAvIDIwMTQtMDItMjAKKworIyMjIE1ham9yIEVuaGFuY2VtZW50cworCisgICogT2ZmaWNpYWxseSBkcm9wIDEuOC43IHN1cHBvcnQgKCMxNCkKKyAgKiBBbGxvdyBDb21tYW5kcyB0byBzZXQgdGhlaXIgb3duIHZlcnNpb25zICgjMTcpCisgICogU2hvdyBzdWJjb21tYW5kcywgb3B0aW9ucyBhbmQgdXNhZ2UgaW4gaGVscCBhbmQgYXR0YWNoIHRvIGFsbCBjb21tYW5kcyAoIzE4KQorICAqIEFkZCBgLXQsIC0tdHJhY2VgIHRvIGFsbG93IGZ1bGwgZXhjZXB0aW9uIGJhY2t0cmFjZSB0byBwcmludCwgb3RoZXJ3aXNlIHByaW50IGp1c3QgdGhlIGVycm9yIG1lc3NhZ2UgKCMxOSkKKworIyMjIE1pbm9yIEVuaGFuY2VtZW50cworCisgICogTG9nZ2luZyBzdGF0ZSBpcyBtYWludGFpbmVkIHRocm91Z2hvdXQgcHJvY2VzcyAoIzEyKQorICAqIFRpZHkgdXAgQ29tbWFuZCNsb2dnZXIgb3V0cHV0ICgjMjEpCisKKyMjIyBEZXZlbG9wbWVudCBGaXhlcworCisgICogQWRkZWQgc3BlY3MgZm9yIGBQcm9ncmFtYCAoIzEzKQorCisjIyAwLjIuMSAvIDIwMTMtMTItMjUKKworIyMjIEJ1ZyBGaXhlcworCisgICogQWRkZWQgbWlzc2luZyBjb21tYSB0byBmaXggJy12JyBhbmQgJy0tdmVyc2lvbicgb3B0aW9ucyAoIzkpCisKKyMjIDAuMi4wIC8gMjAxMy0xMS0zMAorCisjIyMgTWFqb3IgRW5oYW5jZW1lbnRzCisKKyAgKiBBZGQgYENvbW1hbmQjZGVmYXVsdF9jb21tYW5kYCB0byBzcGVjaWZ5IGEgZGVmYXVsdCBjb21tYW5kIGlmIG5vbmUgaXMgZ2l2ZW4gYnkgdGhlIHVzZXIgYXQgcnVudGltZSAoIzcpCisKKyMjIyBNaW5vciBFbmhhbmNlbWVudHMKKworICAqIEFkZCBgQ29tbWFuZCNleGVjdXRlYCB0byBleGVjdXRlIHRoZSBhY3Rpb25zIG9mIGEgY29tbWFuZCAoIzYpCisKKyMjIyBEZXZlbG9wbWVudCBGaXhlcworCisgICogQWRkIHN0YW5kYXJkIEdpdEh1YiBib290c3RyYXAgYW5kIGNpYnVpbGQgc2NyaXB0cyB0byBgc2NyaXB0L2AgKCMyKQorCisjIyAwLjEuMCAvIDIwMTMtMTEtMDgKKworIyMjIE1ham9yIEVuaGFuY2VtZW50cworCisgICogSXQgd29ya3MhCisKKyMjIyBNaW5vciBFbmhhbmNlbWVudHMKKworICAqIEFkZCBhIGxvZ2dlciB0byBgQ29tbWFuZGAKKyAgKiBBZGQgYC0tdmVyc2lvbmAgc3dpdGNoIHRvIGFsbCBwcm9ncmFtcworCisjIyMgQnVnIEZpeGVzCisKKyAgKiBGaXggYENvbW1hbmQjc3ludGF4YCBhbmQgYENvbW1hbmQjZGVzY3JpcHRpb25gJ3MgaGFuZGluZyBvZiBzZXR0aW5nIHZzIGdldHRpbmcKKyAgKiBGaXggbG9hZCBwYXRoIHByb2JsZW0gaW4gYGxpYi9tZXJjZW5hcnkucmJgCisKKyMjIyBEZXZlbG9wbWVudCBGaXhlcworCisgICogQWRkIFRvbURvYyB0byBldmVyeXRoaW5nCisgICogQWRkIGEgY291cGxlIHN0YXJ0ZXIgc3BlY3MKKyAgKiBBZGQgVHJhdmlzQ0kgYmFkZ2UKKyAgKiBBZGQgVHJhdmlzIGNvbmZpZ3VyYXRpb24KKworIyMgMC4wLjEgLyAyMDEzLTExLTA2CisKKyAgKiBCaXJ0aGRheSEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9MSUNFTlNFLnR4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTRjMGIyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjIgQEAKK0NvcHlyaWdodCAoYykgMjAxMy0yMDE0IFBhcmtlciBNb29yZQorCitNSVQgTGljZW5zZQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvUkVBRE1FLm1kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDliMWExCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L1JFQURNRS5tZApAQCAtMCwwICsxLDI1MCBAQAorIyBNZXJjZW5hcnkKKworTGlnaHR3ZWlnaHQgYW5kIGZsZXhpYmxlIGxpYnJhcnkgZm9yIHdyaXRpbmcgY29tbWFuZC1saW5lIGFwcHMgaW4gUnVieS4KKworWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3NlY3VyZS50cmF2aXMtY2kub3JnL2pla3lsbC9tZXJjZW5hcnkucG5nKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2pla3lsbC9tZXJjZW5hcnkpCisKKyMjIEluc3RhbGxhdGlvbgorCitBZGQgdGhpcyBsaW5lIHRvIHlvdXIgYXBwbGljYXRpb24ncyBHZW1maWxlOgorCisgICAgZ2VtICdtZXJjZW5hcnknCisKK0FuZCB0aGVuIGV4ZWN1dGU6CisKKyAgICAkIGJ1bmRsZQorCitPciBpbnN0YWxsIGl0IHlvdXJzZWxmIGFzOgorCisgICAgJCBnZW0gaW5zdGFsbCBtZXJjZW5hcnkKKworKipOb3RlOiBNZXJjZW5hcnkgbWF5IG5vdCB3b3JrIHdpdGggUnVieSA8IDEuOS4zLioqCisKKyMjIFVzYWdlCisKK0NyZWF0aW5nIHByb2dyYW1zIGFuZCBjb21tYW5kcyB3aXRoIE1lcmNlbmFyeSBpcyBlYXN5OgorCitgYGBydWJ5CitNZXJjZW5hcnkucHJvZ3JhbSg6amVreWxsKSBkbyB8cHwKKyAgcC52ZXJzaW9uIEpla3lsbDo6VkVSU0lPTgorICBwLmRlc2NyaXB0aW9uICdKZWt5bGwgaXMgYSBibG9nLWF3YXJlLCBzdGF0aWMgc2l0ZSBnZW5lcmF0b3IgaW4gUnVieScKKyAgcC5zeW50YXggImpla3lsbCA8c3ViY29tbWFuZD4gW29wdGlvbnNdIgorCisgIHAuY29tbWFuZCg6bmV3KSBkbyB8Y3wKKyAgICBjLnN5bnRheCAibmV3IFBBVEgiICMgZG8gbm90IGluY2x1ZGUgdGhlIHByb2dyYW0gbmFtZSBvciBzdXBlciBjb21tYW5kcworICAgIGMuZGVzY3JpcHRpb24gIkNyZWF0ZXMgYSBuZXcgSmVreWxsIHNpdGUgc2NhZmZvbGQgaW4gUEFUSCIKKyAgICBjLm9wdGlvbiAnYmxhbmsnLCAnLS1ibGFuaycsICdJbml0aWFsaXplIHRoZSBuZXcgc2l0ZSB3aXRob3V0IGFueSBjb250ZW50LicKKworICAgIGMuYWN0aW9uIGRvIHxhcmdzLCBvcHRpb25zfAorICAgICAgSmVreWxsOjpDb21tYW5kczo6TmV3LnByb2Nlc3MoYXJncywgYmxhbms6IG9wdGlvbnNbJ2JsYW5rJ10pCisgICAgZW5kCisgIGVuZAorCisgIHAuY29tbWFuZCg6YnVpbGQpIGRvIHxjfAorICAgIGMuc3ludGF4ICJidWlsZCBbb3B0aW9uc10iCisgICAgYy5kZXNjcmlwdGlvbiAiQnVpbGRzIHlvdXIgSmVreWxsIHNpdGUiCisKKyAgICBjLm9wdGlvbiAnc2FmZScsICctLXNhZmUnLCAnUnVuIGluIHNhZmUgbW9kZScKKyAgICBjLm9wdGlvbiAnc291cmNlJywgJy0tc291cmNlIERJUicsICdGcm9tIHdoZXJlIHRvIGNvbGxlY3QgdGhlIHNvdXJjZSBmaWxlcycKKyAgICBjLm9wdGlvbiAnZGVzdGluYXRpb24nLCAnLS1kZXN0IERJUicsICdUbyB3aGVyZSB0aGUgY29tcGlsZWQgZmlsZXMgc2hvdWxkIGJlIHdyaXR0ZW4nCisKKyAgICBjLmFjdGlvbiBkbyB8Xywgb3B0aW9uc3wKKyAgICAgIEpla3lsbDo6Q29tbWFuZHM6OkJ1aWxkLnByb2Nlc3Mob3B0aW9ucykKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBCcmluZyBpbiBjb21tYW5kIGJ1bmRsZWQgaW4gZXh0ZXJuYWwgZ2VtCisgIGJlZ2luCisgICAgcmVxdWlyZSAiamVreWxsLWltcG9ydCIKKyAgICBKZWt5bGxJbXBvcnQuaW5pdF93aXRoX3Byb2dyYW0ocCkKKyAgcmVzY3VlIExvYWRFcnJvcgorICBlbmQKKworICBwLmRlZmF1bHRfY29tbWFuZCg6YnVpbGQpCitlbmQKK2BgYAorCitBbGwgY29tbWFuZHMgaGF2ZSB0aGUgZm9sbG93aW5nIGRlZmF1bHQgb3B0aW9uczoKKworLSBgLWgvLS1oZWxwYCAtIHNob3cgYSBoZWxwIG1lc3NhZ2UKKy0gYC12Ly0tdmVyc2lvbmAgLSBzaG93IHRoZSBwcm9ncmFtIHZlcnNpb24KKy0gYC10Ly0tdHJhY2VgIC0gc2hvdyB0aGUgZnVsbCBiYWNrdHJhY2Ugd2hlbiBhbiBlcnJvciBvY2N1cnMKKworIyMgQVBJCisKKyMjIyBgTWVyY2VuYXJ5YAorCisjIyMjIGAucHJvZ3JhbWAKKworQ3JlYXRlcyBhbmQgZXhlY3V0ZXMgYSBwcm9ncmFtLiBBY2NlcHRzIHR3byBhcmd1bWVudHM6CisKKy0gYG5hbWVgIC0gcHJvZ3JhbSBuYW1lIGFzIGEgU3ltYm9sCistIGBibG9ja2AgLSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIHByb2dyYW0sIHBhc3NlZCB0aGUgcHJvZ3JhbSBpbnN0YW5jZSBhcyBhbgorICBhcmd1bWVudC4KKworRXhhbXBsZSBpcyBhYm92ZSwgdW5kZXIgdGhlIGhlYWRpbmcgW1VzYWdlXSgjdXNhZ2UpLgorCisjIyMgYFByb2dyYW1gCisKK2BQcm9ncmFtYCBpcyBhIHN1YmNsYXNzIG9mIGBDb21tYW5kYCwgc28gaXQgaGFzIGFsbCBvZiB0aGUgbWV0aG9kcyBkb2N1bWVudGVkCitiZWxvdyBhcyB3ZWxsIGFzIHRob3NlIGZvciBgQ29tbWFuZGAuCisKKyMjIyMgYCNjb25maWdgCisKK0ZldGNoZXMgdGhlIHByb2dyYW0gY29uZmlndXJhdGlvbiBoYXNoLgorCisjIyMgYENvbW1hbmRgCisKKyMjIyMgYCNuZXdgCisKK0NyZWF0ZSBhIG5ldyBjb21tYW5kLiBBY2NlcHRzIHR3byBhcmd1bWVudHM6CisKKy0gYG5hbWVgIC0gdGhlIG5hbWUgb2YgeW91ciBjb21tYW5kLCBhcyBhIHN5bWJvbAorLSBgcGFyZW50YCAtIChvcHRpb25hbCkgdGhlIHBhcmVudCBDb21tYW5kCisKKyMjIyMgYCN2ZXJzaW9uYAorCitTZXRzIG9yIGdldHMgdGhlIHZlcnNpb24gb2YgdGhlIGNvbW1hbmQuIEFjY2VwdHMgYW4gb3B0aW9uYWwgYXJndW1lbnQ6CisKKy0gYHZlcnNpb25gIC0gKG9wdGlvbmFsKSB0aGUgdmVyc2lvbiB0byBzZXQgZm9yIHRoZSBjb21tYW5kLiBJZiBwcmVzZW50LCB0aGlzCisgIGJlY29tZXMgdGhlIG5ldyB2ZXJzaW9uIGZvciB0aGUgY29tbWFuZCBhbmQgcGVyc2lzdHMuCisKKyMjIyMgYCNzeW50YXhgCisKK1NldHMgb3IgZ2V0cyB0aGUgc3ludGF4IG9mIHRoZSBjb21tYW5kLiBCdWlsdCBvbiBwYXJlbnQgc3ludGF4ZXMgaWYgYSBwYXJlbnQKK2V4aXN0cy4gQWNjZXB0cyBvbmUgb3B0aW9uYWwgYXJndW1lbnQ6CisKKy0gYHN5bnRheGAgLSAob3B0aW9uYWwpIHRoZSBzeW50YXggdG8gc2V0IGZvciB0aGUgY29tbWFuZC4gV2lsbCBpbmhlcml0IGZyb20gdGhlCisgIHBhcmVudCBjb21tYW5kcyBvciBwcm9ncmFtLiBVc3VhbGx5IGluIHRoZSBmb3JtIG9mCisgIGAiY29tbWFuZF9uYW1lIDxTVUJDT01NQU5EPiBbT1BUSU9OU10iYAorCitXaGVuIGEgcGFyZW50IGNvbW1hbmQgZXhpc3RzLCBzYXkgYHN1cGVyY29tbWFuZGAsIHdpdGggc3ludGF4IHNldCBhcworYHN1cGVyY29tbWFuZCA8U1VCQ09NTUFORD4gW09QVElPTlNdYCwgdGhlIHN5bnRheCBvZiB0aGUgY29tbWFuZCBpbiBxdWVzdGlvbgord2lsbCBiZSBgc3VwZXJjb21tYW5kIGNvbW1hbmRfbmFtZSA8U1VCQ09NTUFORD4gW09QVElPTlNdYCB3aXRoIGJvdGgKK2A8U1VCQ09NTUFORD5gIGFuZCBgW09QVElPTlNdYCBzdHJpcHBlZCBvdXQuIEFueSB0ZXh0IGJldHdlZW4gYDxgIGFuZCBgPmAgb3IKK2JldHdlZW4gYFtgIGFuZCBgXWAgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHBhcmVudCBjb21tYW5kIHN5bnRheGVzLiBUaGUgcHVycG9zZQorb2YgdGhpcyBjaGFpbmluZyBpcyB0byByZWR1Y2UgcmVkdW5kYW5jeS4KKworIyMjIyBgI2Rlc2NyaXB0aW9uYAorCitTZXRzIG9yIGdldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLiBBY2NlcHRzIG9uZSBvcHRpb25hbCBhcmd1bWVudDoKKworLSBgZGVzY2AgLSAob3B0aW9uYWwpIHRoZSBkZXNjcmlwdGlvbiB0byBzZXQgZm9yIHRoZSBjb21tYW5kLiBJZgorICBwcm92aWRlZCwgd2lsbCBvdmVycmlkZSBhbnkgcHJldmlvdXMgZGVzY3JpcHRpb24gc2V0IGZvciB0aGUgY29tbWFuZC4KKworIyMjIyBgI2RlZmF1bHRfY29tbWFuZGAKKworU2V0cyBvciBnZXRzIHRoZSBkZWZhdWx0IHN1YmNvbW1hbmQgb2YgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBpbiB0aGUgZXZlbnQgbm8KK3N1YmNvbW1hbmQgaXMgcGFzc2VkIGR1cmluZyBleGVjdXRpb24uIEFjY2VwdHMgb25lIG9wdGlvbmFsIGFyZ3VtZW50OgorCistIGBjb21tYW5kX25hbWVgIC0gKG9wdGlvbmFsKSB0aGUgYFN5bWJvbGAgbmFtZSBvZiB0aGUgc3ViY29tbWFuZCB0byBiZQorICBleGVjdXRlZC4gUmFpc2VzIGFuIGBBcmd1bWVudEVycm9yYCBpZiB0aGUgc3ViY29tbWFuZCBkb2Vzbid0IGV4aXN0LgorICBPdmVyd3JpdGVzIHByZXZpb3VzbHktc2V0IGRlZmF1bHQgY29tbWFuZHMuCisKKyMjIyMgYCNvcHRpb25gCisKK0FkZHMgYSBuZXcgb3B0aW9uIHRvIHRoZSBjb21tYW5kLiBBY2NlcHRzIG1hbnkgYXJndW1lbnRzOgorCistIGBjb25maWdfa2V5YCAtIHRoZSBjb25maWd1cmF0aW9uIGtleSB0aGF0IHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbiBtYXBzIHRvLgorLSBgKm9wdGlvbnNgIC0gYWxsIHRoZSBvcHRpb25zLCBnbG9iYmVkLCB0byBiZSBwYXNzZWQgdG8gYE9wdGlvblBhcnNlcmAsIG5hbWVseSB0aGUKKyAgc3dpdGNoZXMgYW5kIHRoZSBvcHRpb24gZGVzY3JpcHRpb24uIFVzdWFsbHkgaW4gdGhlIGZvcm1hdAorICBgIi1zIiwgIi0tc3dpdGNoIiwgIlNldHMgdGhlICdzd2l0Y2gnIGZsYWciYC4KKworVmFsaWQgb3B0aW9uIGNhbGxzOgorCitgYGBydWJ5CitjbWQub3B0aW9uICdjb25maWdfa2V5JywgJy1jJywgJ1NldHMgdGhlICJjb25maWciIGZsYWcnCitjbWQub3B0aW9uICdjb25maWdfa2V5JywgJy0tY29uZmlnJywgJ1NldHMgdGhlICJjb25maWciIGZsYWcnCitjbWQub3B0aW9uICdjb25maWdfa2V5JywgJy1jJywgJy0tY29uZmlnJywgJ1NldHMgdGhlICJjb25maWciIGZsYWcuJworY21kLm9wdGlvbiAnY29uZmlnX2tleScsICctYyBGSUxFJywgJy0tY29uZmlnIEZJTEUnLCAnVGhlIGNvbmZpZyBmaWxlLicKK2NtZC5vcHRpb24gJ2NvbmZpZ19rZXknLCAnLWMgRklMRTFbLEZJTEUyWyxGSUxFMy4uLl1dJywgJy0tY29uZmlnIEZJTEUxWyxGSUxFMlssRklMRTMuLi5dXScsIEFycmF5LCAnVGhlIGNvbmZpZyBmaWxlcy4nCitgYGAKKworTm90aWNlIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGVpdGhlciBhIHNob3J0IHN3aXRjaCwgYSBsb25nIHN3aXRjaCwgb3IgYm90aC4gSWYKK3lvdSB3YW50IHRvIGFjY2VwdCBhbiBhcmd1bWVudCwgeW91IGhhdmUgdG8gc3BlY2lmeSBpdCBpbiB0aGUgc3dpdGNoIHN0cmluZ3MuCitUaGUgY2xhc3Mgb2YgdGhlIGFyZ3VtZW50IGRlZmF1bHRzIHRvIGBTdHJpbmdgLCBidXQgeW91IGNhbiBvcHRpb25hbGx5IHNldCBhCitkaWZmZXJlbnQgY2xhc3MgdG8gY3JlYXRlLCBlLmcuIGBBcnJheWAsIGlmIHlvdSBhcmUgZXhwZWN0aW5nIGEgcGFydGljdWxhciBjbGFzcworaW4geW91ciBjb2RlIGZyb20gdGhpcyBvcHRpb24ncyB2YWx1ZS4gVGhlIGRlc2NyaXB0aW9uIGlzIGFsc28gb3B0aW9uYWwsIGJ1dAoraXQncyBoaWdobHkgcmVjb21tZW5kZWQgdG8gaW5jbHVkZSBhIGRlc2NyaXB0aW9uLgorCisjIyMjIGAjYWxpYXNgIAorCitTcGVjaWZpZXMgYW4gYWxpYXMgZm9yIHRoaXMgY29tbWFuZCBzdWNoIHRoYXQgdGhlIGFsaWFzIG1heSBiZSB1c2VkIGluIHBsYWNlIG9mCit0aGUgY29tbWFuZCBkdXJpbmcgZXhlY3V0aW9uLiBBY2NlcHRzIG9uZSBhcmd1bWVudDoKKworLSBgY21kX25hbWVgIC0gdGhlIGFsaWFzIG5hbWUgZm9yIHRoaXMgY29tbWFuZCBhcyBhIGBTeW1ib2xgCisKK0V4YW1wbGU6CisKK2BgYHJ1YnkKK2NtZC5hbGlhcyg6bXlfYWxpYXMpCisjIE5vdyBgY21kYCBpcyBub3cgYWxzbyBleGVjdXRhYmxlIHZpYSAibXlfYWxpYXMiCitgYGAKKworIyMjIyBgI2FjdGlvbmAKKworU3BlY2lmaWVzIGEgYmxvY2sgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIGV2ZW50IHRoZSBjb21tYW5kIGlzIHNwZWNpZmllZCBhdAorcnVudGltZS4gVGhlIGJsb2NrIGlzIGdpdmVuIHR3byBhcmd1bWVudHM6CisKKy0gYGFyZ3NgIC0gdGhlIG5vbi1zd2l0Y2ggYXJndW1lbnRzIGdpdmVuIGZyb20gdGhlIGNvbW1hbmQtbGluZQorLSBgb3B0aW9uc2AgLSB0aGUgb3B0aW9ucyBoYXNoIGJ1aWx0IHZpYSB0aGUgc3dpdGNoZXMgcGFzc2VkCisKKyoqTm90ZSB0aGF0IGFjdGlvbnMgYXJlIGFkZGl0aXZlKiosIG1lYW5pbmcgYW55IG5ldyBjYWxsIHRvIGAjYWN0aW9uYCB3aWxsCityZXN1bHQgaW4gYW5vdGhlciBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgcnVudGltZS4gQWN0aW9ucyB3aWxsIGJlIGV4ZWN1dGVkIGluCit0aGUgb3JkZXIgdGhleSBhcmUgc3BlY2lmaWVkIGluLgorCitFeGFtcGxlOgorCitgYGBydWJ5CitjbWQuYWN0aW9uIGRvIHxhcmdzLCBvcHRpb25zfAorICAjIGRvIHNvbWV0aGluZyEKK2VuZAorYGBgCisKKyMjIyMgYCNsb2dnZXJgCisKK0FjY2VzcyB0aGUgbG9nZ2VyIGZvciB0aGlzIGNvbW1hbmQuIFVzZWZ1bCBmb3Igb3V0cHV0dGluZyBpbmZvcm1hdGlvbiB0byBTVERPVVQuCitBY2NlcHRzIG9uZSBvcHRpb25hbCBhcmd1bWVudDoKKworLSBgbGV2ZWxgIC0gKG9wdGlvbmFsKSB0aGUgc2V2ZXJpdHkgdGhyZXNob2xkIGF0IHdoaWNoIHRvIGJlZ2luIGxvZ2dpbmcuIFVzZXMKKyAgUnVieSdzIGJ1aWx0LWluCisgIFtgTG9nZ2VyYF0oaHR0cDovL3d3dy5ydWJ5LWRvYy5vcmcvc3RkbGliLTIuMS4wL2xpYmRvYy9sb2dnZXIvcmRvYy9Mb2dnZXIuaHRtbCkKKyAgbGV2ZWxzLgorCitMb2cgbGV2ZWwgZGVmYXVsdHMgdG8gYExvZ2dlcjo6SU5GT2AuCisKK0V4YW1wbGVzOgorCitgYGBydWJ5CitjbWQubG9nZ2VyKExvZ2dlcjo6REVCVUcpCitjbWQubG9nZ2VyLmRlYnVnICJNeSBkZWJ1ZyBtZXNzYWdlLiIKK2NtZC5sb2dnZXIuaW5mbyAiTXkgaW5mb3JtYXRpdmUgbWVzc2FnZS4iCitjbWQubG9nZ2VyLndhcm4gIkFDSFRVTkchISIKK2NtZC5sb2dnZXIuZXJyb3IgIlNvbWV0aGluZyB0ZXJyaWJsZSBoYXMgaGFwcGVuZWQuIgorY21kLmxvZ2dlci5mYXRhbCAiSSBjYW4ndCBjb250aW51ZSBkb2luZyB3aGF0IEknbSBkb2luZy4iCitgYGAKKworIyMjIyBgI2NvbW1hbmRgCisKK0NyZWF0ZXMgYSBuZXcgc3ViY29tbWFuZCBmb3IgdGhlIGN1cnJlbnQgY29tbWFuZC4gQWNjZXB0cyB0d28gYXJndW1lbnRzOgorCistIGBjbWRfbmFtZWAgLSB0aGUgY29tbWFuZCBuYW1lLCBhcyBhIFN5bWJvbAorLSBgYmxvY2tgIC0gIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzdWJjb21tYW5kIGluIGEgYmxvY2sKKworRXhhbXBsZToKKworYGBgcnVieQorbXlfY29tbWFuZC5jb21tYW5kKDpteV9zdWJjb21tYW5kKSBkbyB8c3ViY21kfAorICBzdWJjbWQuZGVzY3JpcHRpb24gJ015IHN1YmNvbW1hbmQnCisgIHN1YmNtZC5zeW50YXggJ215X3N1YmNvbW1hbmQgW09QVElPTlNdJworICAjIC4uLgorZW5kCitgYGAKKworIyMgQ29udHJpYnV0aW5nCisKKzEuIEZvcmsgaXQKKzIuIENyZWF0ZSB5b3VyIGZlYXR1cmUgYnJhbmNoIChgZ2l0IGNoZWNrb3V0IC1iIG15LW5ldy1mZWF0dXJlYCkKKzMuIENvbW1pdCB5b3VyIGNoYW5nZXMgKGBnaXQgY29tbWl0IC1hbSAnQWRkIHNvbWUgZmVhdHVyZSdgKQorNC4gUHVzaCB0byB0aGUgYnJhbmNoIChgZ2l0IHB1c2ggb3JpZ2luIG15LW5ldy1mZWF0dXJlYCkKKzUuIENyZWF0ZSBuZXcgUHVsbCBSZXF1ZXN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvUmFrZWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvUmFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NTUyNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9SYWtlZmlsZQpAQCAtMCwwICsxIEBACityZXF1aXJlICJidW5kbGVyL2dlbV90YXNrcyIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9leGFtcGxlcy9oZWxwX2RpYWxvZ3VlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2V4YW1wbGVzL2hlbHBfZGlhbG9ndWUucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODA3ZTU4NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9leGFtcGxlcy9oZWxwX2RpYWxvZ3VlLnJiCkBAIC0wLDAgKzEsNDYgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKworJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3eyAuLiBsaWIgfSkKKworcmVxdWlyZSAibWVyY2VuYXJ5IgorCisjIFRoaXMgZXhhbXBsZSBzZXRzIHRoZSBsb2dnaW5nIG1vZGUgb2YgbWVyY2VuYXJ5IHRvCisjIGRlYnVnLiBMb2dnaW5nIG1lc3NhZ2VzIGZyb20gInAubG9nZ2VyLmRlYnVnIiB3aWxsCisjIGJlIG91dHB1dCB0byBTVERPVVQuCisKK01lcmNlbmFyeS5wcm9ncmFtKDpoZWxwX2RpYWxvZ3VlKSBkbyB8cHwKKworICBwLnZlcnNpb24gIjIuMC4xIgorICBwLmRlc2NyaXB0aW9uICdBbiBleGFtcGxlIG9mIHRoZSBoZWxwIGRpYWxvZ3VlIGluIE1lcmNlbmFyeScKKyAgcC5zeW50YXggJ2hlbHBfZGlhbG9ndWUgPHN1YmNvbW1hbmQ+JworCisgIHAuY29tbWFuZCg6c29tZV9zdWJjb21tYW5kKSBkbyB8Y3wKKyAgICBjLnZlcnNpb24gJzEuNC4yJworICAgIGMuc3ludGF4ICdzb21lX3N1YmNvbW1hbmQgPHN1YmNvbW1hbmQ+IFtvcHRpb25zXScKKyAgICBjLmRlc2NyaXB0aW9uICdTb21lIHN1YmNvbW1hbmQgdG8gZG8gc29tZXRoaW5nJworICAgIGMub3B0aW9uICdhbl9vcHRpb24nLCAnLW8nLCAnLS1vcHRpb24nLCAnU29tZSBvcHRpb24nCisgICAgYy5hbGlhcyg6YmxhaCkKKworICAgIGMuY29tbWFuZCg6eWV0X2Fub3RoZXJfc3ViKSBkbyB8ZnwKKyAgICAgIGYuc3ludGF4ICd5ZXRfYW5vdGhlcl9zdWIgW29wdGlvbnNdJworICAgICAgZi5kZXNjcmlwdGlvbiAnRG8gYW1hemluZyB0aGluZ3MnCisgICAgICBmLm9wdGlvbiAnYmxhaCcsICctYicsICctLWJsYWgnLCAnVHJpZ2dlciBibGFoIGZsYWcnCisgICAgICBmLm9wdGlvbiAnaGVoJywgJy1IIEFSRycsICctLWhlaCBBUkcnLCAnR2l2ZSBhIGhlaCcKKworICAgICAgZi5hY3Rpb24gZG8gfGFyZ3MsIG9wdGlvbnN8CisgICAgICAgIHByaW50ICJBcmdzOiAiCisgICAgICAgIHAgYXJncworICAgICAgICBwcmludCAiT3B0czogIgorICAgICAgICBwIG9wdGlvbnMKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBwLmNvbW1hbmQoOmFub3RoZXJfc3ViY29tbWFuZCkgZG8gfGN8CisgICAgYy5zeW50YXggJ2Fub3RoZXJfc3ViY29tbWFuZCA8c3ViY29tbWFuZD4gW29wdGlvbnNdJworICAgIGMuZGVzY3JpcHRpb24gJ0Fub3RoZXIgc3ViY29tbWFuZCB0byBkbyBzb21ldGhpbmcgZGlmZmVyZW50LicKKyAgICBjLm9wdGlvbiAnYW5fb3B0aW9uJywgJy1PJywgJy0tb3B0aW9uJywgJ1NvbWUgb3B0aW9uJworICAgIGMub3B0aW9uICdhbm90aGVyX29wdGlvbnMnLCAnLS1wbHVnaW56enonLCAnU2V0IHdoZXJlIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBmb3VuZCBmcm9tJworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvZXhhbXBsZXMvbG9nZ2luZy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9leGFtcGxlcy9sb2dnaW5nLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjg2N2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvZXhhbXBsZXMvbG9nZ2luZy5yYgpAQCAtMCwwICsxLDM5IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyQ6LnVuc2hpZnQgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICold3sgLi4gbGliIH0pCisKK3JlcXVpcmUgIm1lcmNlbmFyeSIKKworIyBUaGlzIGV4YW1wbGUgc2V0cyB0aGUgbG9nZ2luZyBtb2RlIG9mIG1lcmNlbmFyeSB0bworIyBkZWJ1Zy4gTG9nZ2luZyBtZXNzYWdlcyBmcm9tICJwLmxvZ2dlci5kZWJ1ZyIgd2lsbAorIyBiZSBvdXRwdXQgdG8gU1RET1VULgorCitNZXJjZW5hcnkucHJvZ3JhbSg6bG9nZ2VyX291dHB1dCkgZG8gfHB8CisKKyAgcC52ZXJzaW9uICI1LjIuNiIKKyAgcC5kZXNjcmlwdGlvbiAnQW4gZXhhbXBsZSBvZiB0dXJuaW5nIG9uIGxvZ2dpbmcgZm9yIE1lcmNlbmFyeS4nCisgIHAuc3ludGF4ICdsb2dnZXJfb3V0cHV0JworCisKKyAgcC5sb2dnZXIuaW5mbyAiVGhlIGRlZmF1bHQgbG9nIGxldmVsIGlzIElORk8uIFNvIHRoaXMgd2lsbCBvdXRwdXQuIgorICBwLmxvZ2dlci5kZWJ1ZyAiU2luY2UgREVCVUcgaXMgYmVsb3cgSU5GTywgdGhpcyB3aWxsIG5vdCBvdXRwdXQuIgorCisgIHAubG9nZ2VyKExvZ2dlcjo6REVCVUcpCisgIHAubG9nZ2VyLmRlYnVnICJMb2dnZXIgbGV2ZWwgbm93IHNldCB0byBERUJVRy4gU28gZXZlcnl0aGluZyB3aWxsIG91dHB1dC4iCisgIAorICBwLmxvZ2dlci5kZWJ1ZyAgICAiRXhhbXBsZSBvZiBERUJVRyBsZXZlbCBtZXNzYWdlLiIKKyAgcC5sb2dnZXIuaW5mbyAgICAgIkV4YW1wbGUgb2YgSU5GTyBsZXZlbCBtZXNzYWdlLiIKKyAgcC5sb2dnZXIud2FybiAgICAgIkV4YW1wbGUgb2YgV0FSTiBsZXZlbCBtZXNzYWdlLiIKKyAgcC5sb2dnZXIuZXJyb3IgICAgIkV4YW1wbGUgb2YgRVJST1IgbGV2ZWwgbWVzc2FnZS4iCisgIHAubG9nZ2VyLmZhdGFsICAgICJFeGFtcGxlIG9mIEZBVEFMIGxldmVsIG1lc3NhZ2UuIgorICBwLmxvZ2dlci51bmtub3duICAiRXhhbXBsZSBvZiBVTktOT1dOIGxldmVsIG1lc3NhZ2UuIgorCisgIHAuYWN0aW9uIGRvIHxhcmdzLCBvcHRpb25zfAorICAgIAorICAgIHAubG9nZ2VyKExvZ2dlcjo6SU5GTykKKyAgICBwLmxvZ2dlci5kZWJ1ZyAiTG9nZ2VyIGxldmVsIGJhY2sgdG8gSU5GTy4gVGhpcyBsaW5lIHdpbGwgbm90IG91dHB1dC4iCisgICAgcC5sb2dnZXIuaW5mbyAiVGhpcyBJTkZPIG1lc3NhZ2Ugd2lsbCBvdXRwdXQuIgorCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9leGFtcGxlcy90cmFjZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9leGFtcGxlcy90cmFjZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFhMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2V4YW1wbGVzL3RyYWNlLnJiCkBAIC0wLDAgKzEsMjEgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKworJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3eyAuLiBsaWIgfSkKKworcmVxdWlyZSAibWVyY2VuYXJ5IgorCisjIFRoaXMgZXhhbXBsZSBzZXRzIHRoZSBsb2dnaW5nIG1vZGUgb2YgbWVyY2VuYXJ5IHRvCisjIGRlYnVnLiBMb2dnaW5nIG1lc3NhZ2VzIGZyb20gInAubG9nZ2VyLmRlYnVnIiB3aWxsCisjIGJlIG91dHB1dCB0byBTVERPVVQuCisKK01lcmNlbmFyeS5wcm9ncmFtKDp0cmFjZSkgZG8gfHB8CisKKyAgcC52ZXJzaW9uICIyLjAuMSIKKyAgcC5kZXNjcmlwdGlvbiAnQW4gZXhhbXBsZSBvZiB0cmFjZXMgaW4gTWVyY2VuYXJ5JworICBwLnN5bnRheCAndHJhY2UgPHN1YmNvbW1hbmQ+JworCisgIHAuYWN0aW9uIGRvIHxfLCBffAorICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJZT1UgRElEIFNPTUVUSElORyBURVJSSUJMRSBZT1UgQlVGRk9PTiIpCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9saWIvbWVyY2VuYXJ5LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2xpYi9tZXJjZW5hcnkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0YmU2MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9saWIvbWVyY2VuYXJ5LnJiCkBAIC0wLDAgKzEsMjEgQEAKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiLi4vbWVyY2VuYXJ5L3ZlcnNpb24iLCBfX0ZJTEVfXykKK3JlcXVpcmUgIm9wdHBhcnNlIgorcmVxdWlyZSAibG9nZ2VyIgorCittb2R1bGUgTWVyY2VuYXJ5CisgIGF1dG9sb2FkIDpDb21tYW5kLCAgIEZpbGUuZXhwYW5kX3BhdGgoIi4uL21lcmNlbmFyeS9jb21tYW5kIiwgX19GSUxFX18pCisgIGF1dG9sb2FkIDpPcHRpb24sICAgIEZpbGUuZXhwYW5kX3BhdGgoIi4uL21lcmNlbmFyeS9vcHRpb24iLCBfX0ZJTEVfXykKKyAgYXV0b2xvYWQgOlByZXNlbnRlciwgRmlsZS5leHBhbmRfcGF0aCgiLi4vbWVyY2VuYXJ5L3ByZXNlbnRlciIsIF9fRklMRV9fKQorICBhdXRvbG9hZCA6UHJvZ3JhbSwgICBGaWxlLmV4cGFuZF9wYXRoKCIuLi9tZXJjZW5hcnkvcHJvZ3JhbSIsIF9fRklMRV9fKQorCisgICMgUHVibGljOiBJbnN0YW50aWF0ZSBhIG5ldyBwcm9ncmFtIGFuZCBleGVjdXRlLgorICAjCisgICMgbmFtZSAtIHRoZSBuYW1lIG9mIHlvdXIgcHJvZ3JhbQorICAjCisgICMgUmV0dXJucyBub3RoaW5nLgorICBkZWYgc2VsZi5wcm9ncmFtKG5hbWUpCisgICAgcHJvZ3JhbSA9IFByb2dyYW0ubmV3KG5hbWUpCisgICAgeWllbGQgcHJvZ3JhbQorICAgIHByb2dyYW0uZ28oQVJHVikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9saWIvbWVyY2VuYXJ5L2NvbW1hbmQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvbGliL21lcmNlbmFyeS9jb21tYW5kLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiY2M0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvbGliL21lcmNlbmFyeS9jb21tYW5kLnJiCkBAIC0wLDAgKzEsMjgwIEBACittb2R1bGUgTWVyY2VuYXJ5CisgIGNsYXNzIENvbW1hbmQKKyAgICBhdHRyX3JlYWRlciA6bmFtZQorICAgIGF0dHJfcmVhZGVyIDpkZXNjcmlwdGlvbgorICAgIGF0dHJfcmVhZGVyIDpzeW50YXgKKyAgICBhdHRyX2FjY2Vzc29yIDpvcHRpb25zCisgICAgYXR0cl9hY2Nlc3NvciA6Y29tbWFuZHMKKyAgICBhdHRyX2FjY2Vzc29yIDphY3Rpb25zCisgICAgYXR0cl9yZWFkZXIgOm1hcAorICAgIGF0dHJfYWNjZXNzb3IgOnBhcmVudAorICAgIGF0dHJfcmVhZGVyIDp0cmFjZQorICAgIGF0dHJfcmVhZGVyIDphbGlhc2VzCisKKyAgICAjIFB1YmxpYzogQ3JlYXRlcyBhIG5ldyBDb21tYW5kCisgICAgIworICAgICMgbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kCisgICAgIyBwYXJlbnQgLSAob3B0aW9uYWwpIHRoZSBpbnN0YW5jY2Ugb2YgTWVyY2VuYXJ5OjpDb21tYW5kIHdoaWNoIHlvdSB3aXNoIHRvCisgICAgIyAgICAgICAgICBiZSB0aGUgcGFyZW50IG9mIHRoaXMgY29tbWFuZAorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHBhcmVudCA9IG5pbCkKKyAgICAgIEBuYW1lICAgICA9IG5hbWUKKyAgICAgIEBvcHRpb25zICA9IFtdCisgICAgICBAY29tbWFuZHMgPSB7fQorICAgICAgQGFjdGlvbnMgID0gW10KKyAgICAgIEBtYXAgICAgICA9IHt9CisgICAgICBAcGFyZW50ICAgPSBwYXJlbnQKKyAgICAgIEB0cmFjZSAgICA9IGZhbHNlCisgICAgICBAYWxpYXNlcyAgPSBbXQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFNldHMgb3IgZ2V0cyB0aGUgY29tbWFuZCB2ZXJzaW9uCisgICAgIworICAgICMgdmVyc2lvbiAtIHRoZSBjb21tYW5kIHZlcnNpb24gKG9wdGlvbmFsKQorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHZlcnNpb24gYW5kIHNldHMgaXQgaWYgYW4gYXJndW1lbnQgaXMgbm9uLW5pbAorICAgIGRlZiB2ZXJzaW9uKHZlcnNpb24gPSBuaWwpCisgICAgICBAdmVyc2lvbiA9IHZlcnNpb24gaWYgdmVyc2lvbgorICAgICAgQHZlcnNpb24KKyAgICBlbmQKKworICAgICMgUHVibGljOiBTZXRzIG9yIGdldHMgdGhlIHN5bnRheCBzdHJpbmcKKyAgICAjCisgICAgIyBzeW50YXggLSB0aGUgc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGlzIGNvbW1hbmQncyB1c2FnZSBzeW50YXggKG9wdGlvbmFsKQorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHN5bnRheCBzdHJpbmcgYW5kIHNldHMgaXQgaWYgYW4gYXJndW1lbnQgaXMgcHJlc2VudAorICAgIGRlZiBzeW50YXgoc3ludGF4ID0gbmlsKQorICAgICAgQHN5bnRheCA9IHN5bnRheCBpZiBzeW50YXgKKyAgICAgIHN5bnRheF9saXN0ID0gW10KKyAgICAgIGlmIHBhcmVudAorICAgICAgICBzeW50YXhfbGlzdCA8PCBwYXJlbnQuc3ludGF4LnRvX3MuZ3N1YigvPFtcd1xzLV0rPi8sICcnKS5nc3ViKC9cW1tcd1xzLV0rXF0vLCAnJykuc3RyaXAKKyAgICAgIGVuZAorICAgICAgc3ludGF4X2xpc3QgPDwgKEBzeW50YXggfHwgbmFtZS50b19zKQorICAgICAgc3ludGF4X2xpc3Quam9pbigiICIpCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogU2V0cyBvciBnZXRzIHRoZSBjb21tYW5kIGRlc2NyaXB0aW9uCisgICAgIworICAgICMgZGVzY3JpcHRpb24gLSB0aGUgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgY29tbWFuZCBkb2VzIChvcHRpb25hbCkKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBhbmQgc2V0cyBpdCBpZiBhbiBhcmd1bWVudCBpcyBwcmVzZW50CisgICAgZGVmIGRlc2NyaXB0aW9uKGRlc2MgPSBuaWwpCisgICAgICBAZGVzY3JpcHRpb24gPSBkZXNjIGlmIGRlc2MKKyAgICAgIEBkZXNjcmlwdGlvbgorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFNldHMgdGhlIGRlZmF1bHQgY29tbWFuZAorICAgICMKKyAgICAjIGNvbW1hbmRfbmFtZSAtIHRoZSBjb21tYW5kIG5hbWUgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIGV2ZW50IG5vIGFyZ3MgYXJlCisgICAgIyAgICAgICAgICAgICAgICBwcmVzZW50CisgICAgIworICAgICMgUmV0dXJucyB0aGUgZGVmYXVsdCBjb21tYW5kIGlmIHRoZXJlIGlzIG9uZSwgYG5pbGAgb3RoZXJ3aXNlCisgICAgZGVmIGRlZmF1bHRfY29tbWFuZChjb21tYW5kX25hbWUgPSBuaWwpCisgICAgICBpZiBjb21tYW5kX25hbWUKKyAgICAgICAgaWYgY29tbWFuZHMuaGFzX2tleT8oY29tbWFuZF9uYW1lKQorICAgICAgICAgIEBkZWZhdWx0X2NvbW1hbmQgPSBjb21tYW5kc1tjb21tYW5kX25hbWVdIGlmIGNvbW1hbmRfbmFtZQorICAgICAgICAgIEBkZWZhdWx0X2NvbW1hbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCInI3tjb21tYW5kX25hbWV9JyBjb3VsZG4ndCBiZSBmb3VuZCBpbiB0aGlzIGNvbW1hbmQncyBsaXN0IG9mIGNvbW1hbmRzLiIpCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBAZGVmYXVsdF9jb21tYW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUHVibGljOiBBZGRzIGFuIG9wdGlvbiBzd2l0Y2gKKyAgICAjCisgICAgIyBzeW0gLSB0aGUgdmFyaWFibGUga2V5IHdoaWNoIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHZhbHVlIG9mIHRoZSBzd2l0Y2gKKyAgICAjICAgICAgIGF0IHJ1bnRpbWUgaW4gdGhlIG9wdGlvbnMgaGFzaAorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBvcHRpb24oc3ltLCAqb3B0aW9ucykKKyAgICAgIG5ld19vcHRpb24gPSBPcHRpb24ubmV3KHN5bSwgb3B0aW9ucykKKyAgICAgIEBvcHRpb25zIDw8IG5ld19vcHRpb24KKyAgICAgIEBtYXBbbmV3X29wdGlvbl0gPSBzeW0KKyAgICBlbmQKKworICAgICMgUHVibGljOiBBZGRzIGEgc3ViY29tbWFuZAorICAgICMKKyAgICAjIGNtZF9uYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQKKyAgICAjIGJsb2NrICAgIC0gYSBibG9jayBhY2NlcHRpbmcgdGhlIG5ldyBpbnN0YW5jZSBvZiBNZXJjZW5hcnk6OkNvbW1hbmQgdG8gYmUKKyAgICAjICAgICAgICAgICAgbW9kaWZpZWQgKG9wdGlvbmFsKQorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBjb21tYW5kKGNtZF9uYW1lKQorICAgICAgY21kID0gQ29tbWFuZC5uZXcoY21kX25hbWUsIHNlbGYpCisgICAgICB5aWVsZCBjbWQKKyAgICAgIEBjb21tYW5kc1tjbWRfbmFtZV0gPSBjbWQKKyAgICBlbmQKKworICAgICMgUHVibGljOiBBZGQgYW4gYWxpYXMgZm9yIHRoaXMgY29tbWFuZCdzIG5hbWUgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIHBhcmVudAorICAgICMKKyAgICAjIGNtZF9uYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGFsaWFzCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nCisgICAgZGVmIGFsaWFzKGNtZF9uYW1lKQorICAgICAgbG9nZ2VyLmRlYnVnICJhZGRpbmcgYWxpYXMgdG8gcGFyZW50IGZvciBzZWxmOiAnI3tjbWRfbmFtZX0nIgorICAgICAgYWxpYXNlcyA8PCBjbWRfbmFtZQorICAgICAgQHBhcmVudC5jb21tYW5kc1tjbWRfbmFtZV0gPSBzZWxmCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogQWRkIGFuIGFjdGlvbiBQcm9jIHRvIGJlIGV4ZWN1dGVkIGF0IHJ1bnRpbWUKKyAgICAjCisgICAgIyBibG9jayAtIHRoZSBQcm9jIHRvIGJlIGV4ZWN1dGVkIGF0IHJ1bnRpbWUKKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBkZWYgYWN0aW9uKCZibG9jaykKKyAgICAgIEBhY3Rpb25zIDw8IGJsb2NrCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogRmV0Y2ggYSBMb2dnZXIgKHN0ZGxpYikKKyAgICAjCisgICAgIyBsZXZlbCAtIHRoZSBsb2dnZXIgbGV2ZWwgKGEgTG9nZ2VyIGNvbnN0YW50LCBzZWUgZG9jcyBmb3IgbW9yZSBpbmZvKQorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIExvZ2dlcgorICAgIGRlZiBsb2dnZXIobGV2ZWwgPSBuaWwpCisgICAgICB1bmxlc3MgQGxvZ2dlcgorICAgICAgICBAbG9nZ2VyID0gTG9nZ2VyLm5ldyhTVERPVVQpCisgICAgICAgIEBsb2dnZXIubGV2ZWwgPSBsZXZlbCB8fCBMb2dnZXI6OklORk8KKyAgICAgICAgQGxvZ2dlci5mb3JtYXR0ZXIgPSBwcm9jIGRvIHxzZXZlcml0eSwgZGF0ZXRpbWUsIHByb2duYW1lLCBtc2d8CisgICAgICAgICAgIiN7aWRlbnRpdHl9IHwgIiA8PCAiI3tzZXZlcml0eS5kb3duY2FzZS5jYXBpdGFsaXplfToiLmxqdXN0KDcpIDw8ICIgI3ttc2d9XG4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEBsb2dnZXIubGV2ZWwgPSBsZXZlbCB1bmxlc3MgbGV2ZWwubmlsPworICAgICAgQGxvZ2dlcgorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFJ1biB0aGUgY29tbWFuZAorICAgICMKKyAgICAjIGFyZ3YgICAtIGFuIGFycmF5IG9mIHN0cmluZyBhcmdzCisgICAgIyBvcHRzICAgLSB0aGUgaW5zdGFuY2Ugb2YgT3B0aW9uUGFyc2VyCisgICAgIyBjb25maWcgLSB0aGUgb3V0cHV0IGNvbmZpZyBoYXNoCisgICAgIworICAgICMgUmV0dXJucyB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZAorICAgIGRlZiBnbyhhcmd2LCBvcHRzLCBjb25maWcpCisgICAgICBvcHRzLmJhbm5lciA9ICJVc2FnZTogI3tzeW50YXh9IgorICAgICAgcHJvY2Vzc19vcHRpb25zKG9wdHMsIGNvbmZpZykKKyAgICAgIGFkZF9kZWZhdWx0X29wdGlvbnMob3B0cykKKworICAgICAgaWYgYXJndlswXSAmJiBjbWQgPSBjb21tYW5kc1thcmd2WzBdLnRvX3N5bV0KKyAgICAgICAgbG9nZ2VyLmRlYnVnICJGb3VuZCBzdWJjb21tYW5kICcje2NtZC5uYW1lfSciCisgICAgICAgIGFyZ3Yuc2hpZnQKKyAgICAgICAgY21kLmdvKGFyZ3YsIG9wdHMsIGNvbmZpZykKKyAgICAgIGVsc2UKKyAgICAgICAgbG9nZ2VyLmRlYnVnICJObyBhZGRpdGlvbmFsIGNvbW1hbmQgZm91bmQsIHRpbWUgdG8gZXhlYyIKKyAgICAgICAgc2VsZgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogQWRkIHRoaXMgY29tbWFuZCdzIG9wdGlvbnMgdG8gT3B0aW9uUGFyc2VyIGFuZCBzZXQgYSBkZWZhdWx0CisgICAgIyAgICAgICAgIGFjdGlvbiBvZiBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uIHRvIHRoZSBpbnB1dHRlZCBoYXNoCisgICAgIworICAgICMgb3B0cyAtIGluc3RhbmNlIG9mIE9wdGlvblBhcnNlcgorICAgICMgY29uZmlnIC0gdGhlIEhhc2ggaW4gd2hpY2ggdGhlIG9wdGlvbiB2YWx1ZXMgc2hvdWxkIGJlIHBsYWNlZAorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBwcm9jZXNzX29wdGlvbnMob3B0cywgY29uZmlnKQorICAgICAgb3B0aW9ucy5lYWNoIGRvIHxvcHRpb258CisgICAgICAgIG9wdHMub24oKm9wdGlvbi5mb3Jfb3B0aW9uX3BhcnNlcikgZG8gfHh8CisgICAgICAgICAgY29uZmlnW21hcFtvcHRpb25dXSA9IHgKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUHVibGljOiBBZGQgdmVyc2lvbiBhbmQgaGVscCBvcHRpb25zIHRvIHRoZSBjb21tYW5kCisgICAgIworICAgICMgb3B0cyAtIGluc3RhbmNlIG9mIE9wdGlvblBhcnNlcgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBhZGRfZGVmYXVsdF9vcHRpb25zKG9wdHMpCisgICAgICBvcHRpb24gJ3Nob3dfaGVscCcsICctaCcsICctLWhlbHAnLCAnU2hvdyB0aGlzIG1lc3NhZ2UnCisgICAgICBvcHRpb24gJ3Nob3dfdmVyc2lvbicsICctdicsICctLXZlcnNpb24nLCAnUHJpbnQgdGhlIG5hbWUgYW5kIHZlcnNpb24nCisgICAgICBvcHRpb24gJ3Nob3dfYmFja3RyYWNlJywgJy10JywgJy0tdHJhY2UnLCAnU2hvdyB0aGUgZnVsbCBiYWNrdHJhY2Ugd2hlbiBhbiBlcnJvciBvY2N1cnMnCisgICAgICBvcHRzLm9uKCItdiIsICItLXZlcnNpb24iLCAiUHJpbnQgdGhlIHZlcnNpb24iKSBkbworICAgICAgICBwdXRzICIje25hbWV9ICN7dmVyc2lvbn0iCisgICAgICAgIGV4aXQoMCkKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCctdCcsICctLXRyYWNlJywgJ1Nob3cgZnVsbCBiYWNrdHJhY2UgaWYgYW4gZXJyb3Igb2NjdXJzJykgZG8KKyAgICAgICAgQHRyYWNlID0gdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIG9wdHMub25fdGFpbCgiLWgiLCAiLS1oZWxwIiwgIlNob3cgdGhpcyBtZXNzYWdlIikgZG8KKyAgICAgICAgcHV0cyBzZWxmCisgICAgICAgIGV4aXQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IEV4ZWN1dGUgYWxsIGFjdGlvbnMgZ2l2ZW4gdGhlIGlucHV0dGVkIGFyZ3MgYW5kIG9wdGlvbnMKKyAgICAjCisgICAgIyBhcmd2IC0gKG9wdGlvbmFsKSBjb21tYW5kLWxpbmUgYXJncyAoc2FucyBvcHRzKQorICAgICMgY29uZmlnIC0gKG9wdGlvbmFsKSB0aGUgSGFzaCBjb25maWd1cmF0aW9uIG9mIHN0cmluZyBrZXkgdG8gdmFsdWUKKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcKKyAgICBkZWYgZXhlY3V0ZShhcmd2ID0gW10sIGNvbmZpZyA9IHt9KQorICAgICAgaWYgYWN0aW9ucy5lbXB0eT8gJiYgIWRlZmF1bHRfY29tbWFuZC5uaWw/CisgICAgICAgIGRlZmF1bHRfY29tbWFuZC5leGVjdXRlCisgICAgICBlbHNlCisgICAgICAgIGFjdGlvbnMuZWFjaCB7IHxhfCBhLmNhbGwoYXJndiwgY29uZmlnKSB9CisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUHVibGljOiBDaGVjayBpZiB0aGlzIGNvbW1hbmQgaGFzIGEgc3ViY29tbWFuZAorICAgICMKKyAgICAjIHN1Yl9jb21tYW5kIC0gdGhlIG5hbWUgb2YgdGhlIHN1YmNvbW1hbmQKKyAgICAjCisgICAgIyBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21tYW5kIGlzIHRoZSBwYXJlbnQgb2YgYSBjb21tYW5kIG9mIG5hbWUKKyAgICAjICdzdWJfY29tbWFuZCcgYW5kIGZhbHNlIG90aGVyd2lzZQorICAgIGRlZiBoYXNfY29tbWFuZD8oc3ViX2NvbW1hbmQpCisgICAgICBjb21tYW5kcy5rZXlzLmluY2x1ZGU/KHN1Yl9jb21tYW5kKQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IElkZW50aWZ5IHRoaXMgY29tbWFuZAorICAgICMKKyAgICAjIFJldHVybnMgYSBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGlzIGNvbW1hbmQKKyAgICBkZWYgaWRlbnQKKyAgICAgICI8Q29tbWFuZCBuYW1lPSN7aWRlbnRpdHl9PiIKKyAgICBlbmQKKworICAgICMgUHVibGljOiBHZXQgdGhlIGZ1bGwgaWRlbnRpdHkgKG5hbWUgJiB2ZXJzaW9uKSBvZiB0aGlzIGNvbW1hbmQKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgYW5kIHZlcnNpb24gaWYgaXQgZXhpc3RzCisgICAgZGVmIGlkZW50aXR5CisgICAgICAiI3tmdWxsX25hbWV9ICN7dmVyc2lvbiBpZiB2ZXJzaW9ufSIuc3RyaXAKKyAgICBlbmQKKworICAgICMgUHVibGljOiBHZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgY29tbWFuZCBwbHVzIHRoYXQgb2YKKyAgICAjICAgaXRzIHBhcmVudCBjb21tYW5kcworICAgICMKKyAgICAjIFJldHVybnMgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY29tbWFuZAorICAgIGRlZiBmdWxsX25hbWUKKyAgICAgIHRoZV9uYW1lID0gW10KKyAgICAgIHRoZV9uYW1lIDw8IHBhcmVudC5mdWxsX25hbWUgaWYgcGFyZW50ICYmIHBhcmVudC5mdWxsX25hbWUKKyAgICAgIHRoZV9uYW1lIDw8IG5hbWUKKyAgICAgIHRoZV9uYW1lLmpvaW4oIiAiKQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IFJldHVybiBhbGwgdGhlIG5hbWVzIGFuZCBhbGlhc2VzIGZvciB0aGlzIGNvbW1hbmQuCisgICAgIworICAgICMgUmV0dXJucyBhIGNvbW1hLXNlcGFyYXRlZCBTdHJpbmcgbGlzdCBvZiB0aGUgbmFtZSBmb2xsb3dlZCBieSBpdHMgYWxpYXNlcworICAgIGRlZiBuYW1lc19hbmRfYWxpYXNlcworICAgICAgKFtuYW1lLnRvX3NdICsgYWxpYXNlcykuY29tcGFjdC5qb2luKCIsICIpCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogQnVpbGQgYSBzdHJpbmcgY29udGFpbmluZyBhIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmQKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgb25lLWxpbmUgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC4KKyAgICBkZWYgc3VtbWFyaXplCisgICAgICAiICAje25hbWVzX2FuZF9hbGlhc2VzLmxqdXN0KDIwKX0gICN7ZGVzY3JpcHRpb259IgorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IEJ1aWxkIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbmFtZSwgb3B0aW9ucyBhbmQgYW55IHN1YmNvbW1hbmRzCisgICAgIworICAgICMgUmV0dXJucyB0aGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgY29tbWFuZCwgaXRzIG9wdGlvbnMgYW5kIGl0cyBzdWJjb21tYW5kcworICAgIGRlZiB0b19zCisgICAgICBQcmVzZW50ZXIubmV3KHNlbGYpLnByaW50X2NvbW1hbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9saWIvbWVyY2VuYXJ5L29wdGlvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9saWIvbWVyY2VuYXJ5L29wdGlvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE0OWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2xpYi9tZXJjZW5hcnkvb3B0aW9uLnJiCkBAIC0wLDAgKzEsODcgQEAKK21vZHVsZSBNZXJjZW5hcnkKKyAgY2xhc3MgT3B0aW9uCisgICAgYXR0cl9yZWFkZXIgOmNvbmZpZ19rZXksIDpkZXNjcmlwdGlvbiwgOnNob3J0LCA6bG9uZywgOnJldHVybl90eXBlCisKKyAgICAjIFB1YmxpYzogQ3JlYXRlIGEgbmV3IE9wdGlvbgorICAgICMKKyAgICAjIGNvbmZpZ19rZXkgLSB0aGUga2V5IGluIHRoZSBjb25maWcgaGFzaCB0byB3aGljaCB0aGUgdmFsdWUgb2YgdGhpcyBvcHRpb24KKyAgICAjICAgICAgICAgICAgICB3aWxsIG1hcAorICAgICMgaW5mbyAgICAgICAtIGFuIGFycmF5IGNvbnRhaW5pbmcgZmlyc3QgdGhlIHN3aXRjaGVzLCB0aGVuIGFuIG9wdGlvbmFsCisgICAgIyAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgKGUuZy4gQXJyYXkpLCB0aGVuIGEgZGVzY3JpcHRpb24gb2YgdGhlIG9wdGlvbgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBpbml0aWFsaXplKGNvbmZpZ19rZXksIGluZm8pCisgICAgICBAY29uZmlnX2tleSAgPSBjb25maWdfa2V5CisgICAgICB3aGlsZSBhcmcgPSBpbmZvLnNoaWZ0CisgICAgICAgIGJlZ2luCisgICAgICAgICAgQHJldHVybl90eXBlID0gT2JqZWN0LmNvbnN0X2dldCgiI3thcmd9IikKKyAgICAgICAgICBuZXh0CisgICAgICAgIHJlc2N1ZSBOYW1lRXJyb3IKKyAgICAgICAgZW5kCisgICAgICAgIGlmIGFyZy5zdGFydF93aXRoPygiLSIpCisgICAgICAgICAgaWYgYXJnLnN0YXJ0X3dpdGg/KCItLSIpCisgICAgICAgICAgICBAbG9uZyA9IGFyZworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEBzaG9ydCA9IGFyZworICAgICAgICAgIGVuZAorICAgICAgICAgIG5leHQKKyAgICAgICAgZW5kCisgICAgICAgIEBkZXNjcmlwdGlvbiA9IGFyZworICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogRmV0Y2ggdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGluZm8gT3B0aW9uUGFyc2VyIGlzIGludGVyZXN0ZWQgaW4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBhcnJheSB3aGljaCBPcHRpb25QYXJzZXIjb24gd2FudHMKKyAgICBkZWYgZm9yX29wdGlvbl9wYXJzZXIKKyAgICAgIFtzaG9ydCwgbG9uZywgcmV0dXJuX3R5cGUsIGRlc2NyaXB0aW9uXS5mbGF0dGVuLnJlamVjdHsgfG98IG8udG9fcy5lbXB0eT8gfQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IEJ1aWxkIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb3B0aW9uIGluY2x1ZGluZyB0aGUKKyAgICAjICAgc3dpdGNoZXMgYW5kIGRlc2NyaXB0aW9uCisgICAgIworICAgICMgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9wdGlvbgorICAgIGRlZiB0b19zCisgICAgICAiI3tmb3JtYXR0ZWRfc3dpdGNoZXN9ICAje2Rlc2NyaXB0aW9ufSIKKyAgICBlbmQKKworICAgICMgUHVibGljOiBCdWlsZCBhIGJlYXV0aWZ1bGx5LWZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN3aXRjaGVzCisgICAgIworICAgICMgUmV0dXJucyBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN3aXRjaGVzCisgICAgZGVmIGZvcm1hdHRlZF9zd2l0Y2hlcworICAgICAgWworICAgICAgICBzd2l0Y2hlcy5maXJzdC5yanVzdCgxMCksCisgICAgICAgIHN3aXRjaGVzLmxhc3QubGp1c3QoMTMpCisgICAgICBdLmpvaW4oIiwgIikuZ3N1YigvICwgLywgJyAgICcpLmdzdWIoLywgICAvLCAnICAgICcpCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogSGFzaCBiYXNlZCBvbiB0aGUgaGFzaCB2YWx1ZSBvZiBpbnN0YW5jZSB2YXJpYWJsZXMKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgRml4bnVtIHdoaWNoIGlzIHVuaXF1ZSB0byB0aGlzIE9wdGlvbiBiYXNlZCBvbiB0aGUgaW5zdGFuY2UgdmFyaWFibGVzCisgICAgZGVmIGhhc2gKKyAgICAgIGluc3RhbmNlX3ZhcmlhYmxlcy5tYXAgZG8gfHZhcnwKKyAgICAgICAgaW5zdGFuY2VfdmFyaWFibGVfZ2V0KHZhcikuaGFzaAorICAgICAgZW5kLnJlZHVjZSg6XikKKyAgICBlbmQKKworICAgICMgUHVibGljOiBDaGVjayBlcXVpdmFsZW5jZSBvZiB0d28gT3B0aW9ucyBiYXNlZCBvbiBlcXVpdmFsZW5jZSBvZiB0aGVpcgorICAgICMgICBpbnN0YW5jZSB2YXJpYWJsZXMKKyAgICAjCisgICAgIyBSZXR1cm5zIHRydWUgaWYgYWxsIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UKKyAgICBkZWYgZXFsPyhvdGhlcikKKyAgICAgIHJldHVybiBmYWxzZSB1bmxlc3Mgc2VsZi5jbGFzcy5lcWw/KG90aGVyLmNsYXNzKQorICAgICAgaW5zdGFuY2VfdmFyaWFibGVzLm1hcCBkbyB8dmFyfAorICAgICAgICBpbnN0YW5jZV92YXJpYWJsZV9nZXQodmFyKS5lcWw/KG90aGVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCh2YXIpKQorICAgICAgZW5kLmFsbD8KKyAgICBlbmQKKworICAgICMgUHVibGljOiBGZXRjaCBhbiBhcnJheSBvZiBzd2l0Y2hlcywgaW5jbHVkaW5nIHRoZSBzaG9ydCBhbmQgbG9uZyB2ZXJzaW9ucworICAgICMKKyAgICAjIFJldHVybnMgYW4gYXJyYXkgb2YgdHdvIHN0cmluZ3MuIEFuIGVtcHR5IHN0cmluZyByZXByZXNlbnRzIG5vIHN3aXRjaCBpbgorICAgICMgdGhhdCBwb3NpdGlvbi4KKyAgICBkZWYgc3dpdGNoZXMKKyAgICAgIFtzaG9ydCwgbG9uZ10ubWFwKCY6dG9fcykKKyAgICBlbmQKKworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2xpYi9tZXJjZW5hcnkvcHJlc2VudGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2xpYi9tZXJjZW5hcnkvcHJlc2VudGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjFlZTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvbGliL21lcmNlbmFyeS9wcmVzZW50ZXIucmIKQEAgLTAsMCArMSw5NCBAQAorbW9kdWxlIE1lcmNlbmFyeQorICBjbGFzcyBQcmVzZW50ZXIKKyAgICBhdHRyX2FjY2Vzc29yIDpjb21tYW5kCisKKyAgICAjIFB1YmxpYzogTWFrZSBhIG5ldyBQcmVzZW50ZXIKKyAgICAjCisgICAgIyBjb21tYW5kIC0gYSBNZXJjZW5hcnk6OkNvbW1hbmQgdG8gcHJlc2VudAorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBpbml0aWFsaXplKGNvbW1hbmQpCisgICAgICBAY29tbWFuZCA9IGNvbW1hbmQKKyAgICBlbmQKKworICAgICMgUHVibGljOiBCdWlsZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgdXNhZ2UKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgdXNhZ2UKKyAgICBkZWYgdXNhZ2VfcHJlc2VudGF0aW9uCisgICAgICAiICAje2NvbW1hbmQuc3ludGF4fSIKKyAgICBlbmQKKworICAgICMgUHVibGljOiBCdWlsZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9wdGlvbnMKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9wdGlvbnMKKyAgICBkZWYgb3B0aW9uc19wcmVzZW50YXRpb24KKyAgICAgIHJldHVybiBuaWwgdW5sZXNzIGNvbW1hbmRfb3B0aW9uc19wcmVzZW50YXRpb24gfHwgcGFyZW50X2NvbW1hbmRfb3B0aW9uc19wcmVzZW50YXRpb24KKyAgICAgIFtjb21tYW5kX29wdGlvbnNfcHJlc2VudGF0aW9uLCBwYXJlbnRfY29tbWFuZF9vcHRpb25zX3ByZXNlbnRhdGlvbl0uY29tcGFjdC5qb2luKCJcbiIpCisgICAgZW5kCisKKyAgICBkZWYgY29tbWFuZF9vcHRpb25zX3ByZXNlbnRhdGlvbgorICAgICAgcmV0dXJuIG5pbCB1bmxlc3MgY29tbWFuZC5vcHRpb25zLnNpemUgPiAwCisgICAgICBjb21tYW5kLm9wdGlvbnMubWFwKCY6dG9fcykuam9pbigiXG4iKQorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IEJ1aWxkcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3B0aW9ucyBmb3IgcGFyZW50CisgICAgIyBjb21tYW5kcworICAgICMKKyAgICAjIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3B0aW9ucyBmb3IgcGFyZW50IGNvbW1hbmRzCisgICAgZGVmIHBhcmVudF9jb21tYW5kX29wdGlvbnNfcHJlc2VudGF0aW9uCisgICAgICByZXR1cm4gbmlsIHVubGVzcyBjb21tYW5kLnBhcmVudAorICAgICAgUHJlc2VudGVyLm5ldyhjb21tYW5kLnBhcmVudCkub3B0aW9uc19wcmVzZW50YXRpb24KKyAgICBlbmQKKworICAgICMgUHVibGljOiBCdWlsZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN1YmNvbW1hbmRzCisgICAgIworICAgICMgUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdWJjb21tYW5kcworICAgIGRlZiBzdWJjb21tYW5kc19wcmVzZW50YXRpb24KKyAgICAgIHJldHVybiBuaWwgdW5sZXNzIGNvbW1hbmQuY29tbWFuZHMuc2l6ZSA+IDAKKyAgICAgIGNvbW1hbmQuY29tbWFuZHMudmFsdWVzLnVuaXEubWFwKCY6c3VtbWFyaXplKS5qb2luKCJcbiIpCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogQnVpbGRzIHRoZSBjb21tYW5kIGhlYWRlciwgaW5jbHVkaW5nIHRoZSBjb21tYW5kIGlkZW50aXR5IGFuZCBkZXNjcmlwdGlvbgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIGNvbW1hbmQgaGVhZGVyIGFzIGEgU3RyaW5nCisgICAgZGVmIGNvbW1hbmRfaGVhZGVyCisgICAgICBoZWFkZXIgPSAiI3tjb21tYW5kLmlkZW50aXR5fSIKKyAgICAgIGhlYWRlciA8PCAiIC0tICN7Y29tbWFuZC5kZXNjcmlwdGlvbn0iIGlmIGNvbW1hbmQuZGVzY3JpcHRpb24KKyAgICAgIGhlYWRlcgorICAgIGVuZAorCisgICAgIyBQdWJsaWM6IEJ1aWxkcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2hvbGUgY29tbWFuZAorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2hvbGUgY29tbWFuZAorICAgIGRlZiBjb21tYW5kX3ByZXNlbnRhdGlvbgorICAgICAgbXNnID0gW10KKyAgICAgIG1zZyA8PCBjb21tYW5kX2hlYWRlcgorICAgICAgbXNnIDw8ICJVc2FnZToiCisgICAgICBtc2cgPDwgdXNhZ2VfcHJlc2VudGF0aW9uCisKKyAgICAgIGlmIG9wdHMgPSBvcHRpb25zX3ByZXNlbnRhdGlvbgorICAgICAgICBtc2cgPDwgIk9wdGlvbnM6XG4je29wdHN9IgorICAgICAgZW5kCisgICAgICBpZiBzdWJjb21tYW5kcyA9IHN1YmNvbW1hbmRzX3ByZXNlbnRhdGlvbgorICAgICAgICBtc2cgPDwgIlN1YmNvbW1hbmRzOlxuI3tzdWJjb21tYW5kc19wcmVzZW50YXRpb259IgorICAgICAgZW5kCisgICAgICBtc2cuam9pbigiXG5cbiIpCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogVHVybiBhIHByaW50XyogaW50byBhICpfcHJlc2VudGF0aW9uIG9yIGZyZWFrIG91dAorICAgICMKKyAgICAjIG1ldGggIC0gdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQKKyAgICAjIGFyZ3MgIC0gYW4gYXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbWlzc2luZyBtZXRob2QKKyAgICAjIGJsb2NrIC0gdGhlIGJsb2NrIHBhc3NlZCB0byB0aGUgbWlzc2luZyBtZXRob2QKKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB3aGF0ZXZlciBmdW5jdGlvbiBpcyBjYWxsZWQKKyAgICBkZWYgbWV0aG9kX21pc3NpbmcobWV0aCwgKmFyZ3MsICZibG9jaykKKyAgICAgIGlmIG1ldGgudG9fcyA9fiAvXnByaW50XyguKykkLworICAgICAgICBzZW5kKCIjeyQxLmRvd25jYXNlfV9wcmVzZW50YXRpb24iKQorICAgICAgZWxzZQorICAgICAgICBzdXBlciAjIFlvdSAqbXVzdCogY2FsbCBzdXBlciBpZiB5b3UgZG9uJ3QgaGFuZGxlIHRoZSBtZXRob2QsCisgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIHlvdSdsbCBtZXNzIHVwIFJ1YnkncyBtZXRob2QgbG9va3VwLgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvbGliL21lcmNlbmFyeS9wcm9ncmFtLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2xpYi9tZXJjZW5hcnkvcHJvZ3JhbS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzU5MWMwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2xpYi9tZXJjZW5hcnkvcHJvZ3JhbS5yYgpAQCAtMCwwICsxLDUzIEBACittb2R1bGUgTWVyY2VuYXJ5CisgIGNsYXNzIFByb2dyYW0gPCBDb21tYW5kCisgICAgYXR0cl9yZWFkZXIgOm9wdHBhcnNlCisgICAgYXR0cl9yZWFkZXIgOmNvbmZpZworCisgICAgIyBQdWJsaWM6IENyZWF0ZXMgYSBuZXcgUHJvZ3JhbQorICAgICMKKyAgICAjIG5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbQorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZworICAgIGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgICBAY29uZmlnID0ge30KKyAgICAgIHN1cGVyKG5hbWUpCisgICAgZW5kCisKKyAgICAjIFB1YmxpYzogUnVuIHRoZSBwcm9ncmFtCisgICAgIworICAgICMgYXJndiAtIGFuIGFycmF5IG9mIHN0cmluZyBhcmdzICh1c3VhbGx5IEFSR1YpCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nCisgICAgZGVmIGdvKGFyZ3YpCisgICAgICBsb2dnZXIuZGVidWcoIlVzaW5nIGFyZ3MgcGFzc2VkIGluOiAje2FyZ3YuaW5zcGVjdH0iKQorCisgICAgICBjbWQgPSBuaWwKKworICAgICAgQG9wdHBhcnNlID0gT3B0aW9uUGFyc2VyLm5ldyBkbyB8b3B0c3wKKyAgICAgICAgY21kID0gc3VwZXIoYXJndiwgb3B0cywgQGNvbmZpZykKKyAgICAgIGVuZAorCisgICAgICBiZWdpbgorICAgICAgICBAb3B0cGFyc2UucGFyc2UhKGFyZ3YpCisgICAgICByZXNjdWUgT3B0aW9uUGFyc2VyOjpJbnZhbGlkT3B0aW9uID0+IGUKKyAgICAgICAgbG9nZ2VyLmVycm9yICJXaG9vcHMsIHdlIGNhbid0IHVuZGVyc3RhbmQgeW91ciBjb21tYW5kLiIKKyAgICAgICAgbG9nZ2VyLmVycm9yICIje2UubWVzc2FnZX0iCisgICAgICAgIGxvZ2dlci5lcnJvciAiUnVuIHlvdXIgY29tbWFuZCBhZ2FpbiB3aXRoIHRoZSAtLWhlbHAgc3dpdGNoIHRvIHNlZSBhdmFpbGFibGUgb3B0aW9ucy4iCisgICAgICAgIGFib3J0CisgICAgICBlbmQKKworICAgICAgbG9nZ2VyLmRlYnVnKCJQYXJzZWQgY29uZmlnOiAje0Bjb25maWcuaW5zcGVjdH0iKQorCisgICAgICBiZWdpbgorICAgICAgICBjbWQuZXhlY3V0ZShhcmd2LCBAY29uZmlnKQorICAgICAgcmVzY3VlID0+IGUKKyAgICAgICAgaWYgY21kLnRyYWNlCisgICAgICAgICAgcmFpc2UgZQorICAgICAgICBlbHNlCisgICAgICAgICAgbG9nZ2VyLmVycm9yIGUubWVzc2FnZQorICAgICAgICAgIGFib3J0CisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvbGliL21lcmNlbmFyeS92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2xpYi9tZXJjZW5hcnkvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTYwNDZiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L2xpYi9tZXJjZW5hcnkvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDMgQEAKK21vZHVsZSBNZXJjZW5hcnkKKyAgVkVSU0lPTiA9ICIwLjMuNiIKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L21lcmNlbmFyeS5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L21lcmNlbmFyeS5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZjgyOTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvbWVyY2VuYXJ5LmdlbXNwZWMKQEAgLTAsMCArMSwyNCBAQAorIyBjb2Rpbmc6IHV0Zi04CitsaWIgPSBGaWxlLmV4cGFuZF9wYXRoKCcuLi9saWInLCBfX0ZJTEVfXykKKyRMT0FEX1BBVEgudW5zaGlmdChsaWIpIHVubGVzcyAkTE9BRF9QQVRILmluY2x1ZGU/KGxpYikKK3JlcXVpcmUgJ21lcmNlbmFyeS92ZXJzaW9uJworCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzcGVjfAorICBzcGVjLm5hbWUgICAgICAgICAgPSAibWVyY2VuYXJ5IgorICBzcGVjLnZlcnNpb24gICAgICAgPSBNZXJjZW5hcnk6OlZFUlNJT04KKyAgc3BlYy5hdXRob3JzICAgICAgID0gWyJUb20gUHJlc3Rvbi1XZXJuZXIiLCAiUGFya2VyIE1vb3JlIl0KKyAgc3BlYy5lbWFpbCAgICAgICAgID0gWyJ0b21AbW9qb21iby5jb20iLCAicGFya3Jtb29yZUBnbWFpbC5jb20iXQorICBzcGVjLmRlc2NyaXB0aW9uICAgPSAlcXtMaWdodHdlaWdodCBhbmQgZmxleGlibGUgbGlicmFyeSBmb3Igd3JpdGluZyBjb21tYW5kLWxpbmUgYXBwcyBpbiBSdWJ5Ln0KKyAgc3BlYy5zdW1tYXJ5ICAgICAgID0gJXF7TGlnaHR3ZWlnaHQgYW5kIGZsZXhpYmxlIGxpYnJhcnkgZm9yIHdyaXRpbmcgY29tbWFuZC1saW5lIGFwcHMgaW4gUnVieS59CisgIHNwZWMuaG9tZXBhZ2UgICAgICA9ICJodHRwczovL2dpdGh1Yi5jb20vamVreWxsL21lcmNlbmFyeSIKKyAgc3BlYy5saWNlbnNlICAgICAgID0gIk1JVCIKKworICBzcGVjLmZpbGVzICAgICAgICAgPSBgZ2l0IGxzLWZpbGVzYC5zcGxpdCgkLykKKyAgc3BlYy5leGVjdXRhYmxlcyAgID0gc3BlYy5maWxlcy5ncmVwKCVye15iaW4vfSkgeyB8ZnwgRmlsZS5iYXNlbmFtZShmKSB9CisgIHNwZWMudGVzdF9maWxlcyAgICA9IHNwZWMuZmlsZXMuZ3JlcCglcnteKHRlc3R8c3BlY3xmZWF0dXJlcykvfSkKKyAgc3BlYy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiXQorCisgIHNwZWMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgImJ1bmRsZXIiLCAifj4gMS4zIgorICBzcGVjLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJyYWtlIgorICBzcGVjLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJyc3BlYyIsICJ+PiAzLjAiCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zY3JpcHQvYm9vdHN0cmFwIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NjcmlwdC9ib290c3RyYXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTBjZjI2MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zY3JpcHQvYm9vdHN0cmFwCkBAIC0wLDAgKzEsNyBAQAorIyEgL2Jpbi9zaAorCitzZXQgLWUKKworZWNobyAiVGltZSB0byBnZXQgc2V0IHVwLiIKK2J1bmRsZSBpbnN0YWxsCitlY2hvICJCb29tLiIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zY3JpcHQvY2lidWlsZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zY3JpcHQvY2lidWlsZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNjBlMzYzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NjcmlwdC9jaWJ1aWxkCkBAIC0wLDAgKzEsNiBAQAorIyEgL2Jpbi9zaAorCitzZXQgLWV4CisKK2J1bmRsZSBleGVjIHJzcGVjCisuL3NjcmlwdC9leGFtcGxlcwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NjcmlwdC9jb25zb2xlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NjcmlwdC9jb25zb2xlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3ZWQyNzkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvc2NyaXB0L2NvbnNvbGUKQEAgLTAsMCArMSwzIEBACisjISAvYmluL2Jhc2gKKworaXJiIC1yLi9saWIvbWVyY2VuYXJ5LnJiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvc2NyaXB0L2V4YW1wbGVzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NjcmlwdC9leGFtcGxlcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNzIyYWIzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NjcmlwdC9leGFtcGxlcwpAQCAtMCwwICsxLDE4IEBACisjISAvYmluL2Jhc2gKKworc2V0IC1lCisKK2Z1bmN0aW9uIHJ1biAoKSB7CisgIGVjaG8gIisgcnVieSAuL2V4YW1wbGVzLyRAIgorICBydWJ5IC1lICJwdXRzICc9JyAqIDc5IgorICBydWJ5IC4vZXhhbXBsZXMvJEAKKyAgcnVieSAtZSAicHV0cyAnPScgKiA3OSIKK30KKworcnVuIGxvZ2dpbmcucmIKK3J1biBsb2dnaW5nLnJiIC12CitydW4gaGVscF9kaWFsb2d1ZS5yYiAtaAorcnVuIGhlbHBfZGlhbG9ndWUucmIgc29tZV9zdWJjb21tYW5kIC1oCitydW4gaGVscF9kaWFsb2d1ZS5yYiBhbm90aGVyX3N1YmNvbW1hbmQgLWgKK3J1biBoZWxwX2RpYWxvZ3VlLnJiIHNvbWVfc3ViY29tbWFuZCB5ZXRfYW5vdGhlcl9zdWIgLWgKK3J1biBoZWxwX2RpYWxvZ3VlLnJiIHNvbWVfc3ViY29tbWFuZCB5ZXRfYW5vdGhlcl9zdWIgLWIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zcGVjL2NvbW1hbmRfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zcGVjL2NvbW1hbmRfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWMwMjlhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NwZWMvY29tbWFuZF9zcGVjLnJiCkBAIC0wLDAgKzEsOTggQEAKK3JlcXVpcmUgInNwZWNfaGVscGVyIgorCitkZXNjcmliZShNZXJjZW5hcnk6OkNvbW1hbmQpIGRvCisKKyAgY29udGV4dCAiYSBiYXNpYyBjb21tYW5kIiBkbworICAgIGxldCg6Y29tbWFuZCkgeyBNZXJjZW5hcnk6OkNvbW1hbmQubmV3KDpteV9uYW1lKSB9CisgICAgbGV0KDpwYXJlbnQpICB7IE1lcmNlbmFyeTo6Q29tbWFuZC5uZXcoOm15X3BhcmVudCkgfQorICAgIGxldCg6d2l0aF9zdWIpIGRvCisgICAgICBjID0gTWVyY2VuYXJ5OjpDb21tYW5kLm5ldyg6aV9oYXZlX3N1YmNvbW1hbmQpCisgICAgICBhZGRfc3ViLmNhbGwoYykKKyAgICAgIGMKKyAgICBlbmQKKyAgICBsZXQoOmNvbW1hbmRfd2l0aF9wYXJlbnQpIGRvCisgICAgICBNZXJjZW5hcnk6OkNvbW1hbmQubmV3KAorICAgICAgICA6aV9oYXZlX3BhcmVudCwKKyAgICAgICAgcGFyZW50CisgICAgICApCisgICAgZW5kCisgICAgbGV0KDphZGRfc3ViKSBkbworICAgICAgUHJvYy5uZXcgZG8gfGN8CisgICAgICAgIGMuY29tbWFuZCg6c3ViX2NvbW1hbmQpIHsgfHB8IH0KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgImNhbiBiZSBjcmVhdGVkIHdpdGgganVzdCBhIG5hbWUiIGRvCisgICAgICBleHBlY3QoY29tbWFuZC5uYW1lKS50byBlcWwoOm15X25hbWUpCisgICAgZW5kCisKKyAgICBpdCAiY2FuIGhvbGQgYSBwYXJlbnQgY29tbWFuZCIgZG8KKyAgICAgIGV4cGVjdChjb21tYW5kX3dpdGhfcGFyZW50LnBhcmVudCkudG8gZXFsKHBhcmVudCkKKyAgICBlbmQKKworICAgIGl0ICJjYW4gY3JlYXRlIHN1YmNvbW1hbmRzIiBkbworICAgICAgZXhwZWN0KGFkZF9zdWIuY2FsbChjb21tYW5kKSkudG8gYmVfYShNZXJjZW5hcnk6OkNvbW1hbmQpCisgICAgICBleHBlY3QoYWRkX3N1Yi5jYWxsKGNvbW1hbmQpLnBhcmVudCkudG8gZXEoY29tbWFuZCkKKyAgICBlbmQKKworICAgIGl0ICJjYW4gc2V0IGl0cyB2ZXJzaW9uIiBkbworICAgICAgdmVyc2lvbiA9ICIxLjQuMiIKKyAgICAgIGNvbW1hbmQudmVyc2lvbiB2ZXJzaW9uCisgICAgICBleHBlY3QoY29tbWFuZC52ZXJzaW9uKS50byBlcSh2ZXJzaW9uKQorICAgIGVuZAorCisgICAgaXQgImNhbiBzZXQgaXRzIHN5bnRheCIgZG8KKyAgICAgIHN5bnRheF9zdHJpbmcgPSAibXlfbmFtZSBbb3B0aW9uc10iCisgICAgICBjbWQgPSBkZXNjcmliZWRfY2xhc3MubmV3KDpteV9uYW1lKQorICAgICAgY21kLnN5bnRheCBzeW50YXhfc3RyaW5nCisgICAgICBleHBlY3QoY21kLnN5bnRheCkudG8gZXEoc3ludGF4X3N0cmluZykKKyAgICBlbmQKKworICAgIGl0ICJjYW4gc2V0IGl0cyBkZXNjcmlwdGlvbiIgZG8KKyAgICAgIGRlc2MgPSAicnVuIGFsbCB0aGUgdGhpbmdzIgorICAgICAgY29tbWFuZC5kZXNjcmlwdGlvbiBkZXNjCisgICAgICBleHBlY3QoY29tbWFuZC5kZXNjcmlwdGlvbikudG8gZXEoZGVzYykKKyAgICBlbmQKKworICAgIGl0ICJjYW4gc2V0IGl0cyBvcHRpb25zIiBkbworICAgICAgbmFtZSA9ICJzaG93X2RyYWZ0cyIKKyAgICAgIG9wdHMgID0gWyctLWRyYWZ0cycsICdSZW5kZXIgcG9zdHMgaW4gdGhlIF9kcmFmdHMgZm9sZGVyJ10KKyAgICAgIG9wdGlvbiA9IE1lcmNlbmFyeTo6T3B0aW9uLm5ldyhuYW1lLCBvcHRzKQorICAgICAgY29tbWFuZC5vcHRpb24gbmFtZSwgKm9wdHMKKyAgICAgIGV4cGVjdChjb21tYW5kLm9wdGlvbnMpLnRvIGVxbChbb3B0aW9uXSkKKyAgICAgIGV4cGVjdChjb21tYW5kLm1hcC52YWx1ZXMpLnRvIGluY2x1ZGUobmFtZSkKKyAgICBlbmQKKworICAgIGl0ICJrbm93cyBpdHMgZnVsbCBuYW1lIiBkbworICAgICAgZXhwZWN0KGNvbW1hbmRfd2l0aF9wYXJlbnQuZnVsbF9uYW1lKS50byBlcWwoIm15X3BhcmVudCBpX2hhdmVfcGFyZW50IikKKyAgICBlbmQKKworICAgIGl0ICJrbm93cyBpdHMgaWRlbnRpdHkiIGRvCisgICAgICBjb21tYW5kX3dpdGhfcGFyZW50LnZlcnNpb24gJzEuOC43JworICAgICAgZXhwZWN0KGNvbW1hbmRfd2l0aF9wYXJlbnQuaWRlbnRpdHkpLnRvIGVxbCgibXlfcGFyZW50IGlfaGF2ZV9wYXJlbnQgMS44LjciKQorICAgIGVuZAorCisgICAgaXQgInJhaXNlcyBhbiBBcmd1bWVudEVycm9yIGlmIEkgc3BlY2lmeSBhIGRlZmF1bHRfY29tbWFuZCB0aGF0IGlzbid0IHRoZXJlIiBkbworICAgICAgYyA9IGNvbW1hbmQgIyBzb21lIHdlaXJkIE5hbWVFcnJvciB3aXRoIHRoZSBibG9jayBiZWxvdz8KKyAgICAgIGV4cGVjdCB7IGMuZGVmYXVsdF9jb21tYW5kKDpub3BlKSB9LnRvIHJhaXNlX2Vycm9yKEFyZ3VtZW50RXJyb3IpCisgICAgZW5kCisKKyAgICBpdCAic2V0cyB0aGUgZGVmYXVsdF9jb21tYW5kIiBkbworICAgICAgZXhwZWN0KHdpdGhfc3ViLmRlZmF1bHRfY29tbWFuZCg6c3ViX2NvbW1hbmQpLm5hbWUpLnRvIGVxKDpzdWJfY29tbWFuZCkKKyAgICBlbmQKKworICAgIGNvbnRleHQgIndpdGggYW4gYWxpYXMiIGRvCisgICAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICAgIGNvbW1hbmRfd2l0aF9wYXJlbnQuYWxpYXMoOmFuX2FsaWFzKQorICAgICAgZW5kCisgICAgICBpdCAic2hvd3MgdGhlIGFsaWFzIGluIHRoZSBzdW1tYXJ5IiBkbworICAgICAgICBleHBlY3QoY29tbWFuZF93aXRoX3BhcmVudC5zdW1tYXJpemUpLnRvIGVxbCgiICBpX2hhdmVfcGFyZW50LCBhbl9hbGlhcyAgIikKKyAgICAgIGVuZAorCisgICAgICBpdCAiaXRzIG5hbWVzX2FuZF9hbGlhc2VzIG1ldGhvZCByZXBvcnRzIGJvdGggdGhlIG5hbWUgYW5kIGFsaWFzIiBkbworICAgICAgICBleHBlY3QoY29tbWFuZF93aXRoX3BhcmVudC5uYW1lc19hbmRfYWxpYXNlcykudG8gZXFsKCJpX2hhdmVfcGFyZW50LCBhbl9hbGlhcyIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NwZWMvb3B0aW9uX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9tZXJjZW5hcnktMC4zLjYvc3BlYy9vcHRpb25fc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2U1OGZkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NwZWMvb3B0aW9uX3NwZWMucmIKQEAgLTAsMCArMSw4MyBAQAorcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlKE1lcmNlbmFyeTo6T3B0aW9uKSBkbworICBsZXQoOmNvbmZpZ19rZXkpICB7ICJsYXJnbyIgfQorICBsZXQoOmRlc2NyaXB0aW9uKSB7ICJUaGlzIGlzIGEgZGVzY3JpcHRpb24iIH0KKyAgbGV0KDpzd2l0Y2hlcykgICAgeyBbJy1sJywgJy0tbGFyZ28nXSB9CisgIGxldCg6b3B0aW9uKSAgICAgIHsgZGVzY3JpYmVkX2NsYXNzLm5ldyhjb25maWdfa2V5LCBbc3dpdGNoZXMsIGRlc2NyaXB0aW9uXS5mbGF0dGVuLnJlamVjdCgmOm5pbD8pKSB9CisKKyAgaXQgImtub3dzIGl0cyBjb25maWcga2V5IiBkbworICAgIGV4cGVjdChvcHRpb24uY29uZmlnX2tleSkudG8gZXFsKGNvbmZpZ19rZXkpCisgIGVuZAorCisgIGl0ICJrbm93cyBpdHMgZGVzY3JpcHRpb24iIGRvCisgICAgZXhwZWN0KG9wdGlvbi5kZXNjcmlwdGlvbikudG8gZXFsKGRlc2NyaXB0aW9uKQorICBlbmQKKworICBpdCAia25vd3MgaXRzIHN3aXRjaGVzIiBkbworICAgIGV4cGVjdChvcHRpb24uc3dpdGNoZXMpLnRvIGVxbChzd2l0Y2hlcykKKyAgZW5kCisKKyAgaXQgImtub3dzIGhvdyB0byBwcmVzZW50IGl0c2VsZiIgZG8KKyAgICBleHBlY3Qob3B0aW9uLnRvX3MpLnRvIGVxbCgiICAgICAgICAtbCwgLS1sYXJnbyAgICAgICAgI3tkZXNjcmlwdGlvbn0iKQorICBlbmQKKworICBpdCAiaGFzIGFuIE9wdGlvblBhcnNlciByZXByZXNlbnRhdGlvbiIgZG8KKyAgICBleHBlY3Qob3B0aW9uLmZvcl9vcHRpb25fcGFyc2VyKS50byBlcWwoW3N3aXRjaGVzLCBkZXNjcmlwdGlvbl0uZmxhdHRlbikKKyAgZW5kCisKKyAgaXQgImNvbXBhcmVzIGl0c2VsZiB3aXRoIG90aGVyIG9wdGlvbnMgd2VsbCIgZG8KKyAgICBuZXdfb3B0aW9uID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhjb25maWdfa2V5LCBbJy1sJywgJy0tbGFyZ28nLCBkZXNjcmlwdGlvbl0pCisgICAgZXhwZWN0KG9wdGlvbi5lcWw/KG5ld19vcHRpb24pKS50byBiZSh0cnVlKQorICAgIGV4cGVjdChvcHRpb24uaGFzaC5lcWw/KG5ld19vcHRpb24uaGFzaCkpLnRvIGJlKHRydWUpCisgIGVuZAorCisgIGl0ICJoYXMgYSBjdXN0b20gI2hhc2giIGRvCisgICAgZXhwZWN0KG9wdGlvbi5oYXNoLnRvX3MpLnRvIG1hdGNoKC9cZCsvKQorICBlbmQKKworICBjb250ZXh0ICJ3aXRoIGp1c3QgdGhlIGxvbmcgc3dpdGNoIiBkbworICAgIGxldCg6c3dpdGNoZXMpIHsgWyctLWxhcmdvJ10gfQorCisgICAgaXQgImFkZHMgYW4gZW1wdHkgc3RyaW5nIGluIHBsYWNlIG9mIHRoZSBzaG9ydCBzd2l0Y2giIGRvCisgICAgICBleHBlY3Qob3B0aW9uLnN3aXRjaGVzKS50byBlcWwoWycnLCAnLS1sYXJnbyddKQorICAgIGVuZAorCisgICAgaXQgInNldHMgaXRzIGRlc2NyaXB0aW9uIHByb3Blcmx5IiBkbworICAgICAgZXhwZWN0KG9wdGlvbi5kZXNjcmlwdGlvbikudG8gZXFsKGRlc2NyaXB0aW9uKQorICAgIGVuZAorCisgICAgaXQgImtub3dzIGhvdyB0byBwcmVzZW50IHRoZSBzd2l0Y2giIGRvCisgICAgICBleHBlY3Qob3B0aW9uLmZvcm1hdHRlZF9zd2l0Y2hlcykudG8gZXFsKCIgICAgICAgICAgICAtLWxhcmdvICAgICAgIikKKyAgICBlbmQKKyAgZW5kCisKKyAgY29udGV4dCAid2l0aCBqdXN0IHRoZSBzaG9ydCBzd2l0Y2giIGRvCisgICAgbGV0KDpzd2l0Y2hlcykgeyBbJy1sJ10gfQorCisgICAgaXQgImFkZHMgYW4gZW1wdHkgc3RyaW5nIGluIHBsYWNlIG9mIHRoZSBsb25nIHN3aXRjaCIgZG8KKyAgICAgIGV4cGVjdChvcHRpb24uc3dpdGNoZXMpLnRvIGVxbChbJy1sJywgJyddKQorICAgIGVuZAorCisgICAgaXQgInNldHMgaXRzIGRlc2NyaXB0aW9uIHByb3Blcmx5IiBkbworICAgICAgZXhwZWN0KG9wdGlvbi5kZXNjcmlwdGlvbikudG8gZXFsKGRlc2NyaXB0aW9uKQorICAgIGVuZAorCisgICAgaXQgImtub3dzIGhvdyB0byBwcmVzZW50IHRoZSBzd2l0Y2giIGRvCisgICAgICBleHBlY3Qob3B0aW9uLmZvcm1hdHRlZF9zd2l0Y2hlcykudG8gZXFsKCIgICAgICAgIC1sICAgICAgICAgICAgICAgIikKKyAgICBlbmQKKyAgZW5kCisKKyAgY29udGV4dCAid2l0aG91dCBhIGRlc2NyaXB0aW9uIiBkbworICAgIGxldCg6ZGVzY3JpcHRpb24pIHsgbmlsIH0KKworICAgIGl0ICJrbm93cyB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbiIgZG8KKyAgICAgIGV4cGVjdChvcHRpb24uZGVzY3JpcHRpb24pLnRvIGJlKG5pbCkKKyAgICBlbmQKKworICAgIGl0ICJrbm93cyBib3RoIGlucHV0cyBhcmUgc3dpdGNoZXMiIGRvCisgICAgICBleHBlY3Qob3B0aW9uLnN3aXRjaGVzKS50byBlcWwoc3dpdGNoZXMpCisgICAgZW5kCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zcGVjL3ByZXNlbnRlcl9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NwZWMvcHJlc2VudGVyX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zcGVjL3ByZXNlbnRlcl9zcGVjLnJiCkBAIC0wLDAgKzEsMzkgQEAKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZShNZXJjZW5hcnk6OlByZXNlbnRlcikgZG8KKyAgbGV0KDpzdXBlcmNvbW1hbmQpIHsgTWVyY2VuYXJ5OjpDb21tYW5kLm5ldyg6c2NyaXB0X25hbWUpIH0KKyAgbGV0KDpjb21tYW5kKSB7IE1lcmNlbmFyeTo6Q29tbWFuZC5uZXcoOnN1YmNvbW1hbmQsIHN1cGVyY29tbWFuZCkgfQorICBsZXQoOnByZXNlbnRlcikgeyBkZXNjcmliZWRfY2xhc3MubmV3KGNvbW1hbmQpIH0KKworICBiZWZvcmUoOmVhY2gpIGRvCisgICAgY29tbWFuZC52ZXJzaW9uICcxLjQuMicKKyAgICBjb21tYW5kLmRlc2NyaXB0aW9uICdEbyBhbGwgdGhlIHRoaW5ncy4nCisgICAgY29tbWFuZC5vcHRpb24gJ29uZScsICctMScsICctLW9uZScsICdUaGUgZmlyc3Qgb3B0aW9uJworICAgIGNvbW1hbmQub3B0aW9uICd0d28nLCAnLTInLCAnLS10d28nLCAnVGhlIHNlY29uZCBvcHRpb24nCisgICAgY29tbWFuZC5hbGlhcyA6Y21kCisgICAgc3VwZXJjb21tYW5kLmNvbW1hbmRzW2NvbW1hbmQubmFtZV0gPSBjb21tYW5kCisgIGVuZAorCisgIGl0ICJrbm93cyBob3cgdG8gcHJlc2VudCB0aGUgY29tbWFuZCIgZG8KKyAgICBleHBlY3QocHJlc2VudGVyLmNvbW1hbmRfcHJlc2VudGF0aW9uKS50byBlcWwoInNjcmlwdF9uYW1lIHN1YmNvbW1hbmQgMS40LjIgLS0gRG8gYWxsIHRoZSB0aGluZ3MuXG5cblVzYWdlOlxuXG4gIHNjcmlwdF9uYW1lIHN1YmNvbW1hbmRcblxuT3B0aW9uczpcbiAgICAgICAgLTEsIC0tb25lICAgICAgICAgIFRoZSBmaXJzdCBvcHRpb25cbiAgICAgICAgLTIsIC0tdHdvICAgICAgICAgIFRoZSBzZWNvbmQgb3B0aW9uIikKKyAgZW5kCisKKyAgaXQgImtub3dzIGhvdyB0byBwcmVzZW50IHRoZSBzdWJjb21tYW5kcywgd2l0aG91dCBkdXBsaWNhdGVzIGZvciBhbGlhc2VzIiBkbworICAgIGV4cGVjdChkZXNjcmliZWRfY2xhc3MubmV3KHN1cGVyY29tbWFuZCkuc3ViY29tbWFuZHNfcHJlc2VudGF0aW9uKS50byBlcWwoIiAgc3ViY29tbWFuZCwgY21kICAgICAgIERvIGFsbCB0aGUgdGhpbmdzLiIpCisgIGVuZAorCisgIGl0ICJrbm93cyBob3cgdG8gcHJlc2VudCB0aGUgdXNhZ2UiIGRvCisgICAgZXhwZWN0KHByZXNlbnRlci51c2FnZV9wcmVzZW50YXRpb24pLnRvIGVxbCgiICBzY3JpcHRfbmFtZSBzdWJjb21tYW5kIikKKyAgZW5kCisKKyAgaXQgImtub3dzIGhvdyB0byBwcmVzZW50IHRoZSBvcHRpb25zIiBkbworICAgIGV4cGVjdChwcmVzZW50ZXIub3B0aW9uc19wcmVzZW50YXRpb24pLnRvIGVxbCgiICAgICAgICAtMSwgLS1vbmUgICAgICAgICAgVGhlIGZpcnN0IG9wdGlvblxuICAgICAgICAtMiwgLS10d28gICAgICAgICAgVGhlIHNlY29uZCBvcHRpb24iKQorICBlbmQKKworICBpdCAiYWxsb3dzIHlvdSB0byBzYXkgcHJpbnRfKiBpbnN0ZWFkIG9mICpfcHJlc2VudGF0aW9uIiBkbworICAgIGV4cGVjdChwcmVzZW50ZXIucHJpbnRfdXNhZ2UpLnRvICAgICAgIGVxbChwcmVzZW50ZXIudXNhZ2VfcHJlc2VudGF0aW9uKQorICAgIGV4cGVjdChwcmVzZW50ZXIucHJpbnRfc3ViY29tbWFuZHMpLnRvIGVxbChwcmVzZW50ZXIuc3ViY29tbWFuZHNfcHJlc2VudGF0aW9uKQorICAgIGV4cGVjdChwcmVzZW50ZXIucHJpbnRfb3B0aW9ucykudG8gICAgIGVxbChwcmVzZW50ZXIub3B0aW9uc19wcmVzZW50YXRpb24pCisgICAgZXhwZWN0KHByZXNlbnRlci5wcmludF9jb21tYW5kKS50byAgICAgZXFsKHByZXNlbnRlci5jb21tYW5kX3ByZXNlbnRhdGlvbikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zcGVjL3Byb2dyYW1fc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zcGVjL3Byb2dyYW1fc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQ5NjFlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NwZWMvcHJvZ3JhbV9zcGVjLnJiCkBAIC0wLDAgKzEsMTkgQEAKK3JlcXVpcmUgInNwZWNfaGVscGVyIgorCitkZXNjcmliZShNZXJjZW5hcnk6OlByb2dyYW0pIGRvCisKKyAgY29udGV4dCAiYSBiYXNpYyBwcm9ncmFtIiBkbworICAgIGxldCg6cHJvZ3JhbSkgeyBNZXJjZW5hcnk6OlByb2dyYW0ubmV3KDpteV9uYW1lKSB9CisKKyAgICBpdCAiY2FuIGJlIGNyZWF0ZWQgd2l0aCBqdXN0IGEgbmFtZSIgZG8KKyAgICAgIGV4cGVjdChwcm9ncmFtLm5hbWUpLnRvIGVxbCg6bXlfbmFtZSkKKyAgICBlbmQKKworICAgIGl0ICJjYW4gc2V0IGl0cyB2ZXJzaW9uIiBkbworICAgICAgdmVyc2lvbiA9IE1lcmNlbmFyeTo6VkVSU0lPTgorICAgICAgcHJvZ3JhbS52ZXJzaW9uIHZlcnNpb24KKyAgICAgIGV4cGVjdChwcm9ncmFtLnZlcnNpb24pLnRvIGVxKHZlcnNpb24pCisgICAgZW5kCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zcGVjL3NwZWNfaGVscGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWVyY2VuYXJ5LTAuMy42L3NwZWMvc3BlY19oZWxwZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3OTk4NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21lcmNlbmFyeS0wLjMuNi9zcGVjL3NwZWNfaGVscGVyLnJiCkBAIC0wLDAgKzEsMTQgQEAKK2xpYiA9IEZpbGUuZXhwYW5kX3BhdGgoJy4uLy4uL2xpYicsIF9fRklMRV9fKQorJExPQURfUEFUSC51bnNoaWZ0KGxpYikgdW5sZXNzICRMT0FEX1BBVEguaW5jbHVkZT8obGliKQorcmVxdWlyZSAnbWVyY2VuYXJ5JworCitSU3BlYy5jb25maWd1cmUgZG8gfGNvbmZpZ3wKKyAgY29uZmlnLnJ1bl9hbGxfd2hlbl9ldmVyeXRoaW5nX2ZpbHRlcmVkID0gdHJ1ZQorICBjb25maWcuZmlsdGVyX3J1biA6Zm9jdXMKKworICAjIFJ1biBzcGVjcyBpbiByYW5kb20gb3JkZXIgdG8gc3VyZmFjZSBvcmRlciBkZXBlbmRlbmNpZXMuIElmIHlvdSBmaW5kIGFuCisgICMgb3JkZXIgZGVwZW5kZW5jeSBhbmQgd2FudCB0byBkZWJ1ZyBpdCwgeW91IGNhbiBmaXggdGhlIG9yZGVyIGJ5IHByb3ZpZGluZworICAjIHRoZSBzZWVkLCB3aGljaCBpcyBwcmludGVkIGFmdGVyIGVhY2ggcnVuLgorICAjICAgICAtLXNlZWQgMTIzNAorICBjb25maWcub3JkZXIgPSAncmFuZG9tJworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvTElDRU5TRS50eHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjM2MyZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDIxIEBACitUaGUgTUlUIExpY2Vuc2UgKE1JVCkKKworQ29weXJpZ2h0IChjKSAyMDE2IFBhcmtlciBNb29yZQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9SRUFETUUubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmVlNWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQ3IEBACisjIG1pbmltYQorCisqTWluaW1hIGlzIGEgb25lLXNpemUtZml0cy1hbGwgSmVreWxsIHRoZW1lIGZvciB3cml0ZXJzKi4gSXQncyBKZWt5bGwncyBkZWZhdWx0IChhbmQgZmlyc3QpIHRoZW1lLiBJdCdzIHdoYXQgeW91IGdldCB3aGVuIHlvdSBydW4gYGpla3lsbCBuZXdgLgorCitbVGhlbWUgcHJldmlld10oaHR0cHM6Ly9qZWt5bGwuZ2l0aHViLmlvL21pbmltYS8pCisKKyFbbWluaW1hIHRoZW1lIHByZXZpZXddKC9zY3JlZW5zaG90LnBuZykKKworIyMgSW5zdGFsbGF0aW9uCisKK0FkZCB0aGlzIGxpbmUgdG8geW91ciBKZWt5bGwgc2l0ZSdzIEdlbWZpbGU6CisKK2BgYHJ1YnkKK2dlbSAibWluaW1hIgorYGBgCisKK0FuZCBhZGQgdGhpcyBsaW5lIHRvIHlvdXIgSmVreWxsIHNpdGU6CisKK2BgYHlhbWwKK3RoZW1lOiBtaW5pbWEKK2BgYAorCitBbmQgdGhlbiBleGVjdXRlOgorCisgICAgJCBidW5kbGUKKworCisjIyBDb250ZW50cyBBdC1BLUdsYW5jZQorCitNaW5pbWEgaGFzIGJlZW4gc2NhZmZvbGRlZCBieSB0aGUgYGpla3lsbCBuZXctdGhlbWVgIGNvbW1hbmQgYW5kIHRoZXJlZm9yZSBoYXMgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIGhhdmUgYSBuZXcgSmVreWxsIHNpdGUgdXAgYW5kIHJ1bm5pbmcgd2l0aCB6ZXJvLWNvbmZpZ3VyYXRpb24uCisKKyMjIyBMYXlvdXRzCisKK1JlZmVycyB0byBmaWxlcyB3aXRoaW4gdGhlIGBfbGF5b3V0c2AgZGlyZWN0b3J5LCB0aGF0IGRlZmluZSB0aGUgbWFya3VwIGZvciB5b3VyIHRoZW1lLgorCisgIC0gYGRlZmF1bHQuaHRtbGAgJm1kYXNoOyBUaGUgYmFzZSBsYXlvdXQgdGhhdCBsYXlzIHRoZSBmb3VuZGF0aW9uIGZvciBzdWJzZXF1ZW50IGxheW91dHMuIFRoZSBkZXJpdmVkIGxheW91dHMgaW5qZWN0IHRoZWlyIGNvbnRlbnRzIGludG8gdGhpcyBmaWxlIGF0IHRoZSBsaW5lIHRoYXQgc2F5cyBgIHt7IGNvbnRlbnQgfX0gYCBhbmQgYXJlIGxpbmtlZCB0byB0aGlzIGZpbGUgdmlhIFtGcm9udE1hdHRlcl0oaHR0cHM6Ly9qZWt5bGxyYi5jb20vZG9jcy9mcm9udG1hdHRlci8pIGRlY2xhcmF0aW9uIGBsYXlvdXQ6IGRlZmF1bHRgLgorICAtIGBob21lLmh0bWxgICZtZGFzaDsgVGhlIGxheW91dCBmb3IgeW91ciBsYW5kaW5nLXBhZ2UgLyBob21lLXBhZ2UgLyBpbmRleC1wYWdlLgorICAtIGBwYWdlLmh0bWxgICZtZGFzaDsgVGhlIGxheW91dCBmb3IgeW91ciBkb2N1bWVudHMgdGhhdCBjb250YWluIEZyb250TWF0dGVyLCBidXQgYXJlIG5vdCBwb3N0cy4KKyAgLSBgcG9zdC5odG1sYCAmbWRhc2g7IFRoZSBsYXlvdXQgZm9yIHlvdXIgcG9zdHMuCisKKyMjIyBJbmNsdWRlcworCitSZWZlcnMgdG8gc25pcHBldHMgb2YgY29kZSB3aXRoaW4gdGhlIGBfaW5jbHVkZXNgIGRpcmVjdG9yeSB0aGF0IGNhbiBiZSBpbnNlcnRlZCBpbiBtdWx0aXBsZSBsYXlvdXRzIChhbmQgYW5vdGhlciBpbmNsdWRlLWZpbGUgYXMgd2VsbCkgd2l0aGluIHRoZSBzYW1lIHRoZW1lLWdlbS4KKworICAtIGBkaXNxdXNfY29tbWVudHMuaHRtbGAgJm1kYXNoOyBDb2RlIHRvIG1hcmt1cCBkaXNxdXMgY29tbWVudCBib3guCisgIC0gYGZvb3Rlci5odG1sYCAmbWRhc2g7IERlZmluZXMgdGhlIHNpdGUncyBmb290ZXIgc2VjdGlvbi4KKyAgLSBgZ29vZ2xlLWFuYWx5dGljcy5odG1sYCAmbWRhc2g7IEluc2VydHMgR29vZ2xlIEFuYWx5dGljcyBtb2R1bGUgKGFjdGl2ZSBvbmx5IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQpLgorICAtIGBoZWFkLmh0bWxgICZtZGFzaDsgQ29kZS1ibG9jayB0aGF0IGRlZmluZXMgdGhlIGA8aGVhZD48L2hlYWQ+YCBpbiAqZGVmYXVsdCogbGF5b3V0LgorICAtIGBoZWFkZXIuaHRtbGAgJm1kYXNoOyBEZWZpbmVzIHRoZSBzaXRlJ3MgbWFpbiBoZWFkZXIgc2VjdGlvbi4KKyAgLSBgaWNvbi0qIGZpbGVzYCAmbWRhc2g7IEluc2VydHMgZ2l0aHViIGFuZCB0d2l0dGVyIGlkcyB3aXRoIHJlc3BlY3RpdmUgaWNvbnMuCisKKyMjIyBTYXNzCisKK1JlZmVycyB0byBgLnNjc3NgIGZpbGVzIHdpdGhpbiB0aGUgYF9zYXNzYCBkaXJlY3RvcnkgdGhhdCBkZWZpbmUgdGhlIHRoZW1lJ3Mgc3R5bGVzLgorCisgIC0gYG1pbmltYS5zY3NzYCAmbWRhc2g7IFRoZSBjb3JlIGZpbGUgaW1wb3J0ZWQgYnkgcHJlcHJvY2Vzc2VkIGBtYWluLnNjc3NgLCBpdCBkZWZpbmVzIHRoZSB2YXJpYWJsZSBkZWZhdWx0cyBmb3IgdGhlIHRoZW1lIGFuZCBhbHNvIGZ1cnRoZXIgaW1wb3J0cyBzYXNzIHBhcnRpYWxzIHRvIHN1cHBsZW1lbnQgaXRzZWxmLgorICAtIGBtaW5pbWEvX2Jhc2Uuc2Nzc2AgJm1kYXNoOyBSZXNldHMgYW5kIGRlZmluZXMgYmFzZSBzdHlsZXMgZm9yIHZhcmlvdXMgSFRNTCBlbGVtZW50cy4KKyAgLSBgbWluaW1hL19sYXlvdXQuc2Nzc2AgJm1kYXNoOyBEZWZpbmVzIHRoZSB2aXN1YWwgc3R5bGUgZm9yIHZhcmlvdXMgbGF5b3V0cy4KKyAgLSBgbWluaW1hL19zeW50YXgtaGlnaGxpZ2h0aW5nLnNjc3NgICZtZGFzaDsgRGVmaW5lcyB0aGUgc3R5bGVzIGZvciBzeW50YXgtaGlnaGxpZ2h0aW5nLgorCisjIyMgQXNzZXRzCisKK1JlZmVycyB0byB2YXJpb3VzIGFzc2V0IGZpbGVzIHdpdGhpbiB0aGUgYGFzc2V0c2AgZGlyZWN0b3J5LgorQ29udGFpbnMgdGhlIGBtYWluLnNjc3NgIHRoYXQgaW1wb3J0cyBzYXNzIGZpbGVzIGZyb20gd2l0aGluIHRoZSBgX3Nhc3NgIGRpcmVjdG9yeS4gVGhpcyBgbWFpbi5zY3NzYCBpcyB3aGF0IGdldHMgcHJvY2Vzc2VkIGludG8gdGhlIHRoZW1lJ3MgbWFpbiBzdHlsZXNoZWV0IGBtYWluLmNzc2AgY2FsbGVkIGJ5IGBfbGF5b3V0cy9kZWZhdWx0Lmh0bWxgIHZpYSBgX2luY2x1ZGVzL2hlYWQuaHRtbGAuCisKK1RoaXMgZGlyZWN0b3J5IGNhbiBpbmNsdWRlIHN1Yi1kaXJlY3RvcmllcyB0byBtYW5hZ2UgYXNzZXRzIG9mIHNpbWlsYXIgdHlwZSwgYW5kIHdpbGwgYmUgY29waWVkIG92ZXIgYXMgaXMsIHRvIHRoZSBmaW5hbCB0cmFuc2Zvcm1lZCBzaXRlIGRpcmVjdG9yeS4KKworCisjIyBVc2FnZQorCisjIyMgQ3VzdG9taXphdGlvbgorCitUbyBvdmVycmlkZSB0aGUgZGVmYXVsdCBzdHJ1Y3R1cmUgYW5kIHN0eWxlIG9mIG1pbmltYSwgc2ltcGx5IGNyZWF0ZSB0aGUgY29uY2VybmVkIGRpcmVjdG9yeSBhdCB0aGUgcm9vdCBvZiB5b3VyIHNpdGUsIGNvcHkgdGhlIGZpbGUgeW91IHdpc2ggdG8gY3VzdG9taXplIHRvIHRoYXQgZGlyZWN0b3J5LCBhbmQgdGhlbiBlZGl0IHRoZSBmaWxlLgorZS5nLiwgdG8gb3ZlcnJpZGUgdGhlIFtgX2luY2x1ZGVzL2hlYWQuaHRtbCBgXShfaW5jbHVkZXMvaGVhZC5odG1sKSBmaWxlIHRvIHNwZWNpZnkgYSBjdXN0b20gc3R5bGUgcGF0aCwgY3JlYXRlIGFuIGBfaW5jbHVkZXNgIGRpcmVjdG9yeSwgY29weSBgX2luY2x1ZGVzL2hlYWQuaHRtbGAgZnJvbSBtaW5pbWEgZ2VtIGZvbGRlciB0byBgPHlvdXJzaXRlPi9faW5jbHVkZXNgIGFuZCBzdGFydCBlZGl0aW5nIHRoYXQgZmlsZS4KKworVGhlIHNpdGUncyBkZWZhdWx0IENTUyBoYXMgbm93IG1vdmVkIHRvIGEgbmV3IHBsYWNlIHdpdGhpbiB0aGUgZ2VtIGl0c2VsZiwgW2Bhc3NldHMvbWFpbi5zY3NzYF0oYXNzZXRzL21haW4uc2NzcykuIFRvICoqb3ZlcnJpZGUgdGhlIGRlZmF1bHQgQ1NTKiosIHRoZSBmaWxlIGhhcyB0byBleGlzdCBhdCB5b3VyIHNpdGUgc291cmNlLiBEbyBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZzoKKy0gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGBtYWluLnNjc3NgIGF0IHNpdGUgc291cmNlLgorICAtIENyZWF0ZSBhIG5ldyBmaWxlIGBtYWluLnNjc3NgIGF0IGA8eW91ci1zaXRlPi9hc3NldHMvYAorICAtIEFkZCB0aGUgZnJvbnRtYXR0ZXIgZGFzaGVzLCBhbmQKKyAgLSBBZGQgYEBpbXBvcnQgIm1pbmltYSI7YCwgdG8gYDx5b3VyLXNpdGU+L2Fzc2V0cy9tYWluLnNjc3NgCisgIC0gQWRkIHlvdXIgY3VzdG9tIENTUy4KKy0gRG93bmxvYWQgdGhlIGZpbGUgZnJvbSB0aGlzIHJlcG8KKyAgLSBDcmVhdGUgIGEgbmV3IGZpbGUgYG1haW4uc2Nzc2AgYXQgYDx5b3VyLXNpdGU+L2Fzc2V0cy9gCisgIC0gQ29weSB0aGUgY29udGVudHMgYXQgW2Fzc2V0cy9tYWluLnNjc3NdKGFzc2V0cy9tYWluLnNjc3MpIG9udG8gdGhlIGBtYWluLnNjc3NgIHlvdSBqdXN0IGNyZWF0ZWQsIGFuZCBlZGl0IGF3YXkhCistIENvcHkgZGlyZWN0bHkgZnJvbSBNaW5pbWEgMi4wIGdlbQorICAtIEdvIHRvIHlvdXIgbG9jYWwgbWluaW1hIGdlbSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICggcnVuIGBidW5kbGUgc2hvdyBtaW5pbWFgIHRvIGdldCB0aGUgcGF0aCB0byBpdCApLgorICAtIENvcHkgdGhlIGBhc3NldHMvYCBmb2xkZXIgZnJvbSB0aGVyZSBpbnRvIHRoZSByb290IG9mIGA8eW91ci1zaXRlPmAKKyAgLSBDaGFuZ2Ugd2hhdGV2ZXIgdmFsdWVzIHlvdSB3YW50LCBpbnNpZGUgYDx5b3VyLXNpdGU+L2Fzc2V0cy9tYWluLnNjc3NgCisKKy0tCisKKyMjIyBDaGFuZ2UgZGVmYXVsdCBkYXRlIGZvcm1hdAorCitZb3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCBieSBzcGVjaWZ5aW5nIGBzaXRlLm1pbmltYS5kYXRlX2Zvcm1hdGAKK2luIGBfY29uZmlnLnltbGAuCisKK2BgYAorIyBNaW5pbWEgZGF0ZSBmb3JtYXQKKyMgcmVmZXIgdG8gaHR0cDovL3Nob3BpZnkuZ2l0aHViLmlvL2xpcXVpZC9maWx0ZXJzL2RhdGUvIGlmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGlzCittaW5pbWE6CisgIGRhdGVfZm9ybWF0OiAiJWIgJS1kLCAlWSIKK2BgYAorCistLQorCisjIyMgRW5hYmxpbmcgY29tbWVudHMgKHZpYSBEaXNxdXMpCisKK09wdGlvbmFsbHksIGlmIHlvdSBoYXZlIGEgRGlzcXVzIGFjY291bnQsIHlvdSBjYW4gdGVsbCBKZWt5bGwgdG8gdXNlIGl0IHRvIHNob3cgYSBjb21tZW50cyBzZWN0aW9uIGJlbG93IGVhY2ggcG9zdC4KKworVG8gZW5hYmxlIGl0LCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byB5b3VyIEpla3lsbCBzaXRlOgorCitgYGB5YW1sCisgIGRpc3F1czoKKyAgICBzaG9ydG5hbWU6IG15X2Rpc3F1c19zaG9ydG5hbWUKK2BgYAorCitZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgRGlzcXVzJyBzaG9ydG5hbWVzIFtoZXJlXShodHRwczovL2hlbHAuZGlzcXVzLmNvbS9jdXN0b21lci9wb3J0YWwvYXJ0aWNsZXMvNDY2MjA4KS4KKworQ29tbWVudHMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgd2lsbCBvbmx5IGFwcGVhciBpbiBwcm9kdWN0aW9uLCBpLmUuLCBgSkVLWUxMX0VOVj1wcm9kdWN0aW9uYAorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byBkaXNwbGF5IGNvbW1lbnRzIGZvciBhIHBhcnRpY3VsYXIgcG9zdCB5b3UgY2FuIGRpc2FibGUgdGhlbSBieSBhZGRpbmcgYGNvbW1lbnRzOiBmYWxzZWAgdG8gdGhhdCBwb3N0J3MgWUFNTCBGcm9udCBNYXR0ZXIuCisKKy0tCisKKyMjIyBFbmFibGluZyBHb29nbGUgQW5hbHl0aWNzCisKK1RvIGVuYWJsZSBHb29nbGUgQW5heXRpY3MsIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHlvdXIgSmVreWxsIHNpdGU6CisKK2BgYHlhbWwKKyAgZ29vZ2xlX2FuYWx5dGljczogVUEtTk5OTk5OTk4tTgorYGBgCisKK0dvb2dsZSBBbmFseXRpY3Mgd2lsbCBvbmx5IGFwcGVhciBpbiBwcm9kdWN0aW9uLCBpLmUuLCBgSkVLWUxMX0VOVj1wcm9kdWN0aW9uYAorCisjIyBDb250cmlidXRpbmcKKworQnVnIHJlcG9ydHMgYW5kIHB1bGwgcmVxdWVzdHMgYXJlIHdlbGNvbWUgb24gR2l0SHViIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9qZWt5bGwvbWluaW1hLiBUaGlzIHByb2plY3QgaXMgaW50ZW5kZWQgdG8gYmUgYSBzYWZlLCB3ZWxjb21pbmcgc3BhY2UgZm9yIGNvbGxhYm9yYXRpb24sIGFuZCBjb250cmlidXRvcnMgYXJlIGV4cGVjdGVkIHRvIGFkaGVyZSB0byB0aGUgW0NvbnRyaWJ1dG9yIENvdmVuYW50XShodHRwOi8vY29udHJpYnV0b3ItY292ZW5hbnQub3JnKSBjb2RlIG9mIGNvbmR1Y3QuCisKKyMjIERldmVsb3BtZW50CisKK1RvIHNldCB1cCB5b3VyIGVudmlyb25tZW50IHRvIGRldmVsb3AgdGhpcyB0aGVtZSwgcnVuIGBzY3JpcHQvYm9vdHN0cmFwYC4KKworVG8gdGVzdCB5b3VyIHRoZW1lLCBydW4gYHNjcmlwdC9zZXJ2ZXJgIChvciBgYnVuZGxlIGV4ZWMgamVreWxsIHNlcnZlYCkgYW5kIG9wZW4geW91ciBicm93c2VyIGF0IGBodHRwOi8vbG9jYWxob3N0OjQwMDBgLiBUaGlzIHN0YXJ0cyBhIEpla3lsbCBzZXJ2ZXIgdXNpbmcgeW91ciB0aGVtZSBhbmQgdGhlIGNvbnRlbnRzLiBBcyB5b3UgbWFrZSBtb2RpZmljYXRpb25zLCB5b3VyIHNpdGUgd2lsbCByZWdlbmVyYXRlIGFuZCB5b3Ugc2hvdWxkIHNlZSB0aGUgY2hhbmdlcyBpbiB0aGUgYnJvd3NlciBhZnRlciBhIHJlZnJlc2guCisKKyMjIExpY2Vuc2UKKworVGhlIHRoZW1lIGlzIGF2YWlsYWJsZSBhcyBvcGVuIHNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFtNSVQgTGljZW5zZV0oaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2Rpc3F1c19jb21tZW50cy5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19pbmNsdWRlcy9kaXNxdXNfY29tbWVudHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZhMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19pbmNsdWRlcy9kaXNxdXNfY29tbWVudHMuaHRtbApAQCAtMCwwICsxLDIwIEBACit7JSBpZiBwYWdlLmNvbW1lbnRzICE9IGZhbHNlIGFuZCBqZWt5bGwuZW52aXJvbm1lbnQgPT0gInByb2R1Y3Rpb24iICV9CisKKyAgPGRpdiBpZD0iZGlzcXVzX3RocmVhZCI+PC9kaXY+CisgIDxzY3JpcHQ+CisgICAgdmFyIGRpc3F1c19jb25maWcgPSBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnBhZ2UudXJsID0gJ3t7IHBhZ2UudXJsIHwgYWJzb2x1dGVfdXJsIH19JzsKKyAgICAgIHRoaXMucGFnZS5pZGVudGlmaWVyID0gJ3t7IHBhZ2UudXJsIHwgYWJzb2x1dGVfdXJsIH19JzsKKyAgICB9OworCisgICAgKGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGQgPSBkb2N1bWVudCwgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CisKKyAgICAgIHMuc3JjID0gJ2h0dHBzOi8ve3sgc2l0ZS5kaXNxdXMuc2hvcnRuYW1lIH19LmRpc3F1cy5jb20vZW1iZWQuanMnOworCisgICAgICBzLnNldEF0dHJpYnV0ZSgnZGF0YS10aW1lc3RhbXAnLCArbmV3IERhdGUoKSk7CisgICAgICAoZC5oZWFkIHx8IGQuYm9keSkuYXBwZW5kQ2hpbGQocyk7CisgICAgfSkoKTsKKyAgPC9zY3JpcHQ+CisgIDxub3NjcmlwdD5QbGVhc2UgZW5hYmxlIEphdmFTY3JpcHQgdG8gdmlldyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNxdXMuY29tLz9yZWZfbm9zY3JpcHQiIHJlbD0ibm9mb2xsb3ciPmNvbW1lbnRzIHBvd2VyZWQgYnkgRGlzcXVzLjwvYT48L25vc2NyaXB0PgoreyUgZW5kaWYgJX0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9faW5jbHVkZXMvZm9vdGVyLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2Zvb3Rlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjY1MDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2Zvb3Rlci5odG1sCkBAIC0wLDAgKzEsNDYgQEAKKzxmb290ZXIgY2xhc3M9InNpdGUtZm9vdGVyIj4KKworICA8ZGl2IGNsYXNzPSJ3cmFwcGVyIj4KKworICAgIDxoMiBjbGFzcz0iZm9vdGVyLWhlYWRpbmciPnt7IHNpdGUudGl0bGUgfCBlc2NhcGUgfX08L2gyPgorCisgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNvbC13cmFwcGVyIj4KKyAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1jb2wgZm9vdGVyLWNvbC0xIj4KKyAgICAgICAgPHVsIGNsYXNzPSJjb250YWN0LWxpc3QiPgorICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgIHslIGlmIHNpdGUuYXV0aG9yICV9CisgICAgICAgICAgICAgIHt7IHNpdGUuYXV0aG9yIHwgZXNjYXBlIH19CisgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICAgIHt7IHNpdGUudGl0bGUgfCBlc2NhcGUgfX0KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgeyUgaWYgc2l0ZS5lbWFpbCAlfQorICAgICAgICAgICAgPGxpPjxhIGhyZWY9Im1haWx0bzp7eyBzaXRlLmVtYWlsIH19Ij57eyBzaXRlLmVtYWlsIH19PC9hPjwvbGk+CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICA8L3VsPgorICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1jb2wgZm9vdGVyLWNvbC0yIj4KKyAgICAgICAgPHVsIGNsYXNzPSJzb2NpYWwtbWVkaWEtbGlzdCI+CisgICAgICAgICAgeyUgaWYgc2l0ZS5naXRodWJfdXNlcm5hbWUgJX0KKyAgICAgICAgICA8bGk+CisgICAgICAgICAgICB7JSBpbmNsdWRlIGljb24tZ2l0aHViLmh0bWwgdXNlcm5hbWU9c2l0ZS5naXRodWJfdXNlcm5hbWUgJX0KKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgICB7JSBpZiBzaXRlLnR3aXR0ZXJfdXNlcm5hbWUgJX0KKyAgICAgICAgICA8bGk+CisgICAgICAgICAgICB7JSBpbmNsdWRlIGljb24tdHdpdHRlci5odG1sIHVzZXJuYW1lPXNpdGUudHdpdHRlcl91c2VybmFtZSAlfQorICAgICAgICAgIDwvbGk+CisgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC91bD4KKyAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItY29sIGZvb3Rlci1jb2wtMyI+CisgICAgICAgIDxwPnt7IHNpdGUuZGVzY3JpcHRpb24gfCBlc2NhcGUgfX08L3A+CisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKworPC9mb290ZXI+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2dvb2dsZS1hbmFseXRpY3MuaHRtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9faW5jbHVkZXMvZ29vZ2xlLWFuYWx5dGljcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMmE2OTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2dvb2dsZS1hbmFseXRpY3MuaHRtbApAQCAtMCwwICsxLDExIEBACis8c2NyaXB0PgorICAoZnVuY3Rpb24oaSxzLG8sZyxyLGEsbSl7aVsnR29vZ2xlQW5hbHl0aWNzT2JqZWN0J109cjtpW3JdPWlbcl18fGZ1bmN0aW9uKCl7CisgIChpW3JdLnE9aVtyXS5xfHxbXSkucHVzaChhcmd1bWVudHMpfSxpW3JdLmw9MSpuZXcgRGF0ZSgpO2E9cy5jcmVhdGVFbGVtZW50KG8pLAorICBtPXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF07YS5hc3luYz0xO2Euc3JjPWc7bS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLG0pCisgIH0pKHdpbmRvdyxkb2N1bWVudCwnc2NyaXB0JywnaHR0cHM6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vYW5hbHl0aWNzLmpzJywnZ2EnKTsKKworICBnYSgnY3JlYXRlJywgJ3t7IHNpdGUuZ29vZ2xlX2FuYWx5dGljcyB9fScsICdhdXRvJyk7CisgIGdhKCdzZW5kJywgJ3BhZ2V2aWV3Jyk7CisKKzwvc2NyaXB0PgorICAKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9faW5jbHVkZXMvaGVhZC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19pbmNsdWRlcy9oZWFkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliNjk4ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9faW5jbHVkZXMvaGVhZC5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxoZWFkPgorICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CisgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CisKKyAgPHRpdGxlPnslIGlmIHBhZ2UudGl0bGUgJX17eyBwYWdlLnRpdGxlIHwgZXNjYXBlIH19eyUgZWxzZSAlfXt7IHNpdGUudGl0bGUgfCBlc2NhcGUgfX17JSBlbmRpZiAlfTwvdGl0bGU+CisgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJ7eyBwYWdlLmV4Y2VycHQgfCBkZWZhdWx0OiBzaXRlLmRlc2NyaXB0aW9uIHwgc3RyaXBfaHRtbCB8IG5vcm1hbGl6ZV93aGl0ZXNwYWNlIHwgdHJ1bmNhdGU6IDE2MCB8IGVzY2FwZSB9fSI+CisKKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7eyAiL2Fzc2V0cy9tYWluLmNzcyIgfCByZWxhdGl2ZV91cmwgfX0iPgorICA8bGluayByZWw9ImNhbm9uaWNhbCIgaHJlZj0ie3sgcGFnZS51cmwgfCByZXBsYWNlOidpbmRleC5odG1sJywnJyB8IGFic29sdXRlX3VybCB9fSI+CisgIDxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJhcHBsaWNhdGlvbi9yc3MreG1sIiB0aXRsZT0ie3sgc2l0ZS50aXRsZSB8IGVzY2FwZSB9fSIgaHJlZj0ie3sgIi9mZWVkLnhtbCIgfCByZWxhdGl2ZV91cmwgfX0iPgorICAKKyAgeyUgaWYgamVreWxsLmVudmlyb25tZW50ID09ICdwcm9kdWN0aW9uJyBhbmQgc2l0ZS5nb29nbGVfYW5hbHl0aWNzICV9CisgIHslIGluY2x1ZGUgZ29vZ2xlLWFuYWx5dGljcy5odG1sICV9CisgIHslIGVuZGlmICV9Cis8L2hlYWQ+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2hlYWRlci5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19pbmNsdWRlcy9oZWFkZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjcyNTUwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19pbmNsdWRlcy9oZWFkZXIuaHRtbApAQCAtMCwwICsxLDMyIEBACis8aGVhZGVyIGNsYXNzPSJzaXRlLWhlYWRlciIgcm9sZT0iYmFubmVyIj4KKworICA8ZGl2IGNsYXNzPSJ3cmFwcGVyIj4KKyAgICB7JSBhc3NpZ24gZGVmYXVsdF9wYXRocyA9IHNpdGUucGFnZXMgfCBtYXA6ICJwYXRoIiAlfQorICAgIHslIGFzc2lnbiBwYWdlX3BhdGhzID0gc2l0ZS5oZWFkZXJfcGFnZXMgfCBkZWZhdWx0OiBkZWZhdWx0X3BhdGhzICV9CisgICAgPGEgY2xhc3M9InNpdGUtdGl0bGUiIGhyZWY9Int7ICIvIiB8IHJlbGF0aXZlX3VybCB9fSI+e3sgc2l0ZS50aXRsZSB8IGVzY2FwZSB9fTwvYT4KKyAgCisgICAgeyUgaWYgcGFnZV9wYXRocyAlfQorICAgICAgPG5hdiBjbGFzcz0ic2l0ZS1uYXYiPgorICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJuYXYtdHJpZ2dlciIgY2xhc3M9Im5hdi10cmlnZ2VyIiAvPgorICAgICAgICA8bGFiZWwgZm9yPSJuYXYtdHJpZ2dlciI+CisgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lbnUtaWNvbiI+CisgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAxOCAxNSIgd2lkdGg9IjE4cHgiIGhlaWdodD0iMTVweCI+CisgICAgICAgICAgICAgIDxwYXRoIGZpbGw9IiM0MjQyNDIiIGQ9Ik0xOCwxLjQ4NGMwLDAuODItMC42NjUsMS40ODQtMS40ODQsMS40ODRIMS40ODRDMC42NjUsMi45NjksMCwyLjMwNCwwLDEuNDg0bDAsMEMwLDAuNjY1LDAuNjY1LDAsMS40ODQsMCBoMTUuMDMxQzE3LjMzNSwwLDE4LDAuNjY1LDE4LDEuNDg0TDE4LDEuNDg0eiIvPgorICAgICAgICAgICAgICA8cGF0aCBmaWxsPSIjNDI0MjQyIiBkPSJNMTgsNy41MTZDMTgsOC4zMzUsMTcuMzM1LDksMTYuNTE2LDlIMS40ODRDMC42NjUsOSwwLDguMzM1LDAsNy41MTZsMCwwYzAtMC44MiwwLjY2NS0xLjQ4NCwxLjQ4NC0xLjQ4NCBoMTUuMDMxQzE3LjMzNSw2LjAzMSwxOCw2LjY5NiwxOCw3LjUxNkwxOCw3LjUxNnoiLz4KKyAgICAgICAgICAgICAgPHBhdGggZmlsbD0iIzQyNDI0MiIgZD0iTTE4LDEzLjUxNkMxOCwxNC4zMzUsMTcuMzM1LDE1LDE2LjUxNiwxNUgxLjQ4NEMwLjY2NSwxNSwwLDE0LjMzNSwwLDEzLjUxNmwwLDAgYzAtMC44MiwwLjY2NS0xLjQ4NCwxLjQ4NC0xLjQ4NGgxNS4wMzFDMTcuMzM1LDEyLjAzMSwxOCwxMi42OTYsMTgsMTMuNTE2TDE4LDEzLjUxNnoiLz4KKyAgICAgICAgICAgIDwvc3ZnPgorICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgPC9sYWJlbD4KKworICAgICAgICA8ZGl2IGNsYXNzPSJ0cmlnZ2VyIj4KKyAgICAgICAgICB7JSBmb3IgcGF0aCBpbiBwYWdlX3BhdGhzICV9CisgICAgICAgICAgICB7JSBhc3NpZ24gbXlfcGFnZSA9IHNpdGUucGFnZXMgfCB3aGVyZTogInBhdGgiLCBwYXRoIHwgZmlyc3QgJX0KKyAgICAgICAgICAgIHslIGlmIG15X3BhZ2UudGl0bGUgJX0KKyAgICAgICAgICAgIDxhIGNsYXNzPSJwYWdlLWxpbmsiIGhyZWY9Int7IG15X3BhZ2UudXJsIHwgcmVsYXRpdmVfdXJsIH19Ij57eyBteV9wYWdlLnRpdGxlIHwgZXNjYXBlIH19PC9hPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgPC9kaXY+CisgICAgICA8L25hdj4KKyAgICB7JSBlbmRpZiAlfQorICA8L2Rpdj4KKzwvaGVhZGVyPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19pbmNsdWRlcy9pY29uLWdpdGh1Yi5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19pbmNsdWRlcy9pY29uLWdpdGh1Yi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDFhMTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2ljb24tZ2l0aHViLmh0bWwKQEAgLTAsMCArMSBAQAorPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3t7IGluY2x1ZGUudXNlcm5hbWUgfX0iPjxzcGFuIGNsYXNzPSJpY29uIGljb24tLWdpdGh1YiI+eyUgaW5jbHVkZSBpY29uLWdpdGh1Yi5zdmcgJX08L3NwYW4+PHNwYW4gY2xhc3M9InVzZXJuYW1lIj57eyBpbmNsdWRlLnVzZXJuYW1lIH19PC9zcGFuPjwvYT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9faW5jbHVkZXMvaWNvbi1naXRodWIuc3ZnIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19pbmNsdWRlcy9pY29uLWdpdGh1Yi5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjNWY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9faW5jbHVkZXMvaWNvbi1naXRodWIuc3ZnCkBAIC0wLDAgKzEgQEAKKzxzdmcgdmlld0JveD0iMCAwIDE2IDE2IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4Ij48cGF0aCBmaWxsPSIjODI4MjgyIiBkPSJNNy45OTksMC40MzFjLTQuMjg1LDAtNy43NiwzLjQ3NC03Ljc2LDcuNzYxIGMwLDMuNDI4LDIuMjIzLDYuMzM3LDUuMzA3LDcuMzYzYzAuMzg4LDAuMDcxLDAuNTMtMC4xNjgsMC41My0wLjM3NGMwLTAuMTg0LTAuMDA3LTAuNjcyLTAuMDEtMS4zMiBjLTIuMTU5LDAuNDY5LTIuNjE0LTEuMDQtMi42MTQtMS4wNGMtMC4zNTMtMC44OTYtMC44NjItMS4xMzUtMC44NjItMS4xMzVjLTAuNzA1LTAuNDgxLDAuMDUzLTAuNDcyLDAuMDUzLTAuNDcyIGMwLjc3OSwwLjA1NSwxLjE4OSwwLjgsMS4xODksMC44YzAuNjkyLDEuMTg2LDEuODE2LDAuODQzLDIuMjU4LDAuNjQ1YzAuMDcxLTAuNTAyLDAuMjcxLTAuODQzLDAuNDkzLTEuMDM3IEM0Ljg2LDExLjQyNSwzLjA0OSwxMC43NiwzLjA0OSw3Ljc4NmMwLTAuODQ3LDAuMzAyLTEuNTQsMC43OTktMi4wODJDMy43NjgsNS41MDcsMy41MDEsNC43MTgsMy45MjQsMy42NSBjMCwwLDAuNjUyLTAuMjA5LDIuMTM0LDAuNzk2QzYuNjc3LDQuMjczLDcuMzQsNC4xODcsOCw0LjE4NGMwLjY1OSwwLjAwMywxLjMyMywwLjA4OSwxLjk0MywwLjI2MSBjMS40ODItMS4wMDQsMi4xMzItMC43OTYsMi4xMzItMC43OTZjMC40MjMsMS4wNjgsMC4xNTcsMS44NTcsMC4wNzcsMi4wNTRjMC40OTcsMC41NDIsMC43OTgsMS4yMzUsMC43OTgsMi4wODIgYzAsMi45ODEtMS44MTQsMy42MzctMy41NDMsMy44MjljMC4yNzksMC4yNCwwLjUyNywwLjcxMywwLjUyNywxLjQzN2MwLDEuMDM3LTAuMDEsMS44NzQtMC4wMSwyLjEyOSBjMCwwLjIwOCwwLjE0LDAuNDQ5LDAuNTM0LDAuMzczYzMuMDgxLTEuMDI4LDUuMzAyLTMuOTM1LDUuMzAyLTcuMzYyQzE1Ljc2LDMuOTA2LDEyLjI4NSwwLjQzMSw3Ljk5OSwwLjQzMXoiLz48L3N2Zz4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9faW5jbHVkZXMvaWNvbi10d2l0dGVyLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2ljb24tdHdpdHRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjNkYmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2ljb24tdHdpdHRlci5odG1sCkBAIC0wLDAgKzEgQEAKKzxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20ve3sgaW5jbHVkZS51c2VybmFtZSB9fSI+PHNwYW4gY2xhc3M9Imljb24gaWNvbi0tdHdpdHRlciI+eyUgaW5jbHVkZSBpY29uLXR3aXR0ZXIuc3ZnICV9PC9zcGFuPjxzcGFuIGNsYXNzPSJ1c2VybmFtZSI+e3sgaW5jbHVkZS51c2VybmFtZSB9fTwvc3Bhbj48L2E+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2ljb24tdHdpdHRlci5zdmcgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2luY2x1ZGVzL2ljb24tdHdpdHRlci5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjMGVjZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9faW5jbHVkZXMvaWNvbi10d2l0dGVyLnN2ZwpAQCAtMCwwICsxIEBACis8c3ZnIHZpZXdCb3g9IjAgMCAxNiAxNiIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCI+PHBhdGggZmlsbD0iIzgyODI4MiIgZD0iTTE1Ljk2OSwzLjA1OGMtMC41ODYsMC4yNi0xLjIxNywwLjQzNi0xLjg3OCwwLjUxNWMwLjY3NS0wLjQwNSwxLjE5NC0xLjA0NSwxLjQzOC0xLjgwOWMtMC42MzIsMC4zNzUtMS4zMzIsMC42NDctMi4wNzYsMC43OTNjLTAuNTk2LTAuNjM2LTEuNDQ2LTEuMDMzLTIuMzg3LTEuMDMzYy0xLjgwNiwwLTMuMjcsMS40NjQtMy4yNywzLjI3IGMwLDAuMjU2LDAuMDI5LDAuNTA2LDAuMDg1LDAuNzQ1QzUuMTYzLDUuNDA0LDIuNzUzLDQuMTAyLDEuMTQsMi4xMjRDMC44NTksMi42MDcsMC42OTgsMy4xNjgsMC42OTgsMy43NjcgYzAsMS4xMzQsMC41NzcsMi4xMzUsMS40NTUsMi43MjJDMS42MTYsNi40NzIsMS4xMTIsNi4zMjUsMC42NzEsNi4wOGMwLDAuMDE0LDAsMC4wMjcsMCwwLjA0MWMwLDEuNTg0LDEuMTI3LDIuOTA2LDIuNjIzLDMuMjA2IEMzLjAyLDkuNDAyLDIuNzMxLDkuNDQyLDIuNDMzLDkuNDQyYy0wLjIxMSwwLTAuNDE2LTAuMDIxLTAuNjE1LTAuMDU5YzAuNDE2LDEuMjk5LDEuNjI0LDIuMjQ1LDMuMDU1LDIuMjcxIGMtMS4xMTksMC44NzctMi41MjksMS40LTQuMDYxLDEuNGMtMC4yNjQsMC0wLjUyNC0wLjAxNS0wLjc4LTAuMDQ2YzEuNDQ3LDAuOTI4LDMuMTY2LDEuNDY5LDUuMDEzLDEuNDY5IGM2LjAxNSwwLDkuMzA0LTQuOTgzLDkuMzA0LTkuMzA0YzAtMC4xNDItMC4wMDMtMC4yODMtMC4wMDktMC40MjNDMTQuOTc2LDQuMjksMTUuNTMxLDMuNzE0LDE1Ljk2OSwzLjA1OHoiLz48L3N2Zz4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9fbGF5b3V0cy9kZWZhdWx0Lmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2xheW91dHMvZGVmYXVsdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDg1YmYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2xheW91dHMvZGVmYXVsdC5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWwgbGFuZz0ie3sgcGFnZS5sYW5nIHwgZGVmYXVsdDogc2l0ZS5sYW5nIHwgZGVmYXVsdDogImVuIiB9fSI+CisKKyAgeyUgaW5jbHVkZSBoZWFkLmh0bWwgJX0KKworICA8Ym9keT4KKworICAgIHslIGluY2x1ZGUgaGVhZGVyLmh0bWwgJX0KKworICAgIDxtYWluIGNsYXNzPSJwYWdlLWNvbnRlbnQiIGFyaWEtbGFiZWw9IkNvbnRlbnQiPgorICAgICAgPGRpdiBjbGFzcz0id3JhcHBlciI+CisgICAgICAgIHt7IGNvbnRlbnQgfX0KKyAgICAgIDwvZGl2PgorICAgIDwvbWFpbj4KKworICAgIHslIGluY2x1ZGUgZm9vdGVyLmh0bWwgJX0KKworICA8L2JvZHk+CisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9fbGF5b3V0cy9ob21lLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2xheW91dHMvaG9tZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmY2MDQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2xheW91dHMvaG9tZS5odG1sCkBAIC0wLDAgKzEsMjYgQEAKKy0tLQorbGF5b3V0OiBkZWZhdWx0CistLS0KKworPGRpdiBjbGFzcz0iaG9tZSI+CisKKyAgPGgxIGNsYXNzPSJwYWdlLWhlYWRpbmciPlBvc3RzPC9oMT4KKyAgCisgIHt7IGNvbnRlbnQgfX0KKworICA8dWwgY2xhc3M9InBvc3QtbGlzdCI+CisgICAgeyUgZm9yIHBvc3QgaW4gc2l0ZS5wb3N0cyAlfQorICAgICAgPGxpPgorICAgICAgICB7JSBhc3NpZ24gZGF0ZV9mb3JtYXQgPSBzaXRlLm1pbmltYS5kYXRlX2Zvcm1hdCB8IGRlZmF1bHQ6ICIlYiAlLWQsICVZIiAlfQorICAgICAgICA8c3BhbiBjbGFzcz0icG9zdC1tZXRhIj57eyBwb3N0LmRhdGUgfCBkYXRlOiBkYXRlX2Zvcm1hdCB9fTwvc3Bhbj4KKworICAgICAgICA8aDI+CisgICAgICAgICAgPGEgY2xhc3M9InBvc3QtbGluayIgaHJlZj0ie3sgcG9zdC51cmwgfCByZWxhdGl2ZV91cmwgfX0iPnt7IHBvc3QudGl0bGUgfCBlc2NhcGUgfX08L2E+CisgICAgICAgIDwvaDI+CisgICAgICA8L2xpPgorICAgIHslIGVuZGZvciAlfQorICA8L3VsPgorCisgIDxwIGNsYXNzPSJyc3Mtc3Vic2NyaWJlIj5zdWJzY3JpYmUgPGEgaHJlZj0ie3sgIi9mZWVkLnhtbCIgfCByZWxhdGl2ZV91cmwgfX0iPnZpYSBSU1M8L2E+PC9wPgorCis8L2Rpdj4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9fbGF5b3V0cy9wYWdlLmh0bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2xheW91dHMvcGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTRiMmEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2xheW91dHMvcGFnZS5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKy0tLQorbGF5b3V0OiBkZWZhdWx0CistLS0KKzxhcnRpY2xlIGNsYXNzPSJwb3N0Ij4KKworICA8aGVhZGVyIGNsYXNzPSJwb3N0LWhlYWRlciI+CisgICAgPGgxIGNsYXNzPSJwb3N0LXRpdGxlIj57eyBwYWdlLnRpdGxlIHwgZXNjYXBlIH19PC9oMT4KKyAgPC9oZWFkZXI+CisKKyAgPGRpdiBjbGFzcz0icG9zdC1jb250ZW50Ij4KKyAgICB7eyBjb250ZW50IH19CisgIDwvZGl2PgorCis8L2FydGljbGU+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX2xheW91dHMvcG9zdC5odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19sYXlvdXRzL3Bvc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWVjMTFiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19sYXlvdXRzL3Bvc3QuaHRtbApAQCAtMCwwICsxLDI1IEBACistLS0KK2xheW91dDogZGVmYXVsdAorLS0tCis8YXJ0aWNsZSBjbGFzcz0icG9zdCIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9CbG9nUG9zdGluZyI+CisKKyAgPGhlYWRlciBjbGFzcz0icG9zdC1oZWFkZXIiPgorICAgIDxoMSBjbGFzcz0icG9zdC10aXRsZSIgaXRlbXByb3A9Im5hbWUgaGVhZGxpbmUiPnt7IHBhZ2UudGl0bGUgfCBlc2NhcGUgfX08L2gxPgorICAgIDxwIGNsYXNzPSJwb3N0LW1ldGEiPgorICAgICAgPHRpbWUgZGF0ZXRpbWU9Int7IHBhZ2UuZGF0ZSB8IGRhdGVfdG9feG1sc2NoZW1hIH19IiBpdGVtcHJvcD0iZGF0ZVB1Ymxpc2hlZCI+CisgICAgICAgIHslIGFzc2lnbiBkYXRlX2Zvcm1hdCA9IHNpdGUubWluaW1hLmRhdGVfZm9ybWF0IHwgZGVmYXVsdDogIiViICUtZCwgJVkiICV9CisgICAgICAgIHt7IHBhZ2UuZGF0ZSB8IGRhdGU6IGRhdGVfZm9ybWF0IH19CisgICAgICA8L3RpbWU+CisgICAgICB7JSBpZiBwYWdlLmF1dGhvciAlfQorICAgICAgICDigKIgPHNwYW4gaXRlbXByb3A9ImF1dGhvciIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9QZXJzb24iPjxzcGFuIGl0ZW1wcm9wPSJuYW1lIj57eyBwYWdlLmF1dGhvciB9fTwvc3Bhbj48L3NwYW4+CisgICAgICB7JSBlbmRpZiAlfTwvcD4KKyAgPC9oZWFkZXI+CisKKyAgPGRpdiBjbGFzcz0icG9zdC1jb250ZW50IiBpdGVtcHJvcD0iYXJ0aWNsZUJvZHkiPgorICAgIHt7IGNvbnRlbnQgfX0KKyAgPC9kaXY+CisKKyAgeyUgaWYgc2l0ZS5kaXNxdXMuc2hvcnRuYW1lICV9CisgICAgeyUgaW5jbHVkZSBkaXNxdXNfY29tbWVudHMuaHRtbCAlfQorICB7JSBlbmRpZiAlfQorPC9hcnRpY2xlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19zYXNzL21pbmltYS5zY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19zYXNzL21pbmltYS5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTRhOGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX3Nhc3MvbWluaW1hLnNjc3MKQEAgLTAsMCArMSw0OSBAQAorQGNoYXJzZXQgInV0Zi04IjsKKworLy8gRGVmaW5lIGRlZmF1bHRzIGZvciBlYWNoIHZhcmlhYmxlLgorCiskYmFzZS1mb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiAhZGVmYXVsdDsKKyRiYXNlLWZvbnQtc2l6ZTogICAxNnB4ICFkZWZhdWx0OworJGJhc2UtZm9udC13ZWlnaHQ6IDQwMCAhZGVmYXVsdDsKKyRzbWFsbC1mb250LXNpemU6ICAkYmFzZS1mb250LXNpemUgKiAwLjg3NSAhZGVmYXVsdDsKKyRiYXNlLWxpbmUtaGVpZ2h0OiAxLjUgIWRlZmF1bHQ7CisKKyRzcGFjaW5nLXVuaXQ6ICAgICAzMHB4ICFkZWZhdWx0OworCiskdGV4dC1jb2xvcjogICAgICAgIzExMSAhZGVmYXVsdDsKKyRiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmZGZkICFkZWZhdWx0OworJGJyYW5kLWNvbG9yOiAgICAgICMyYTdhZTIgIWRlZmF1bHQ7CisKKyRncmV5LWNvbG9yOiAgICAgICAjODI4MjgyICFkZWZhdWx0OworJGdyZXktY29sb3ItbGlnaHQ6IGxpZ2h0ZW4oJGdyZXktY29sb3IsIDQwJSkgIWRlZmF1bHQ7CiskZ3JleS1jb2xvci1kYXJrOiAgZGFya2VuKCRncmV5LWNvbG9yLCAyNSUpICFkZWZhdWx0OworCisvLyBXaWR0aCBvZiB0aGUgY29udGVudCBhcmVhCiskY29udGVudC13aWR0aDogICAgODAwcHggIWRlZmF1bHQ7CisKKyRvbi1wYWxtOiAgICAgICAgICA2MDBweCAhZGVmYXVsdDsKKyRvbi1sYXB0b3A6ICAgICAgICA4MDBweCAhZGVmYXVsdDsKKworLy8gVXNlIG1lZGlhIHF1ZXJpZXMgbGlrZSB0aGlzOgorLy8gQGluY2x1ZGUgbWVkaWEtcXVlcnkoJG9uLXBhbG0pIHsKKy8vICAgLndyYXBwZXIgeworLy8gICAgIHBhZGRpbmctcmlnaHQ6ICRzcGFjaW5nLXVuaXQgLyAyOworLy8gICAgIHBhZGRpbmctbGVmdDogJHNwYWNpbmctdW5pdCAvIDI7CisvLyAgIH0KKy8vIH0KK0BtaXhpbiBtZWRpYS1xdWVyeSgkZGV2aWNlKSB7CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRkZXZpY2UpIHsKKyAgICBAY29udGVudDsKKyAgfQorfQorCitAbWl4aW4gcmVsYXRpdmUtZm9udC1zaXplKCRyYXRpbykgeworICBmb250LXNpemU6ICRiYXNlLWZvbnQtc2l6ZSAqICRyYXRpbzsKK30KKworLy8gSW1wb3J0IHBhcnRpYWxzLgorQGltcG9ydAorICAibWluaW1hL2Jhc2UiLAorICAibWluaW1hL2xheW91dCIsCisgICJtaW5pbWEvc3ludGF4LWhpZ2hsaWdodGluZyIKKzsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9fc2Fzcy9taW5pbWEvX2Jhc2Uuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9fc2Fzcy9taW5pbWEvX2Jhc2Uuc2NzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBmZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19zYXNzL21pbmltYS9fYmFzZS5zY3NzCkBAIC0wLDAgKzEsMjE1IEBACisvKioKKyAqIFJlc2V0IHNvbWUgYmFzaWMgZWxlbWVudHMKKyAqLworYm9keSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwKK3AsIGJsb2NrcXVvdGUsIHByZSwgaHIsCitkbCwgZGQsIG9sLCB1bCwgZmlndXJlIHsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorCisKKworLyoqCisgKiBCYXNpYyBzdHlsaW5nCisgKi8KK2JvZHkgeworICBmb250OiAkYmFzZS1mb250LXdlaWdodCAjeyRiYXNlLWZvbnQtc2l6ZX0vI3skYmFzZS1saW5lLWhlaWdodH0gJGJhc2UtZm9udC1mYW1pbHk7CisgIGNvbG9yOiAkdGV4dC1jb2xvcjsKKyAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQtY29sb3I7CisgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsKKyAgLXdlYmtpdC1mb250LWZlYXR1cmUtc2V0dGluZ3M6ICJrZXJuIiAxOworICAgICAtbW96LWZvbnQtZmVhdHVyZS1zZXR0aW5nczogImtlcm4iIDE7CisgICAgICAgLW8tZm9udC1mZWF0dXJlLXNldHRpbmdzOiAia2VybiIgMTsKKyAgICAgICAgICBmb250LWZlYXR1cmUtc2V0dGluZ3M6ICJrZXJuIiAxOworICBmb250LWtlcm5pbmc6IG5vcm1hbDsKK30KKworCisKKy8qKgorICogU2V0IGBtYXJnaW4tYm90dG9tYCB0byBtYWludGFpbiB2ZXJ0aWNhbCByaHl0aG0KKyAqLworaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwKK3AsIGJsb2NrcXVvdGUsIHByZSwKK3VsLCBvbCwgZGwsIGZpZ3VyZSwKKyV2ZXJ0aWNhbC1yaHl0aG0geworICBtYXJnaW4tYm90dG9tOiAkc3BhY2luZy11bml0IC8gMjsKK30KKworCisKKy8qKgorICogSW1hZ2VzCisgKi8KK2ltZyB7CisgIG1heC13aWR0aDogMTAwJTsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworCisKKy8qKgorICogRmlndXJlcworICovCitmaWd1cmUgPiBpbWcgeworICBkaXNwbGF5OiBibG9jazsKK30KKworZmlnY2FwdGlvbiB7CisgIGZvbnQtc2l6ZTogJHNtYWxsLWZvbnQtc2l6ZTsKK30KKworCisKKy8qKgorICogTGlzdHMKKyAqLwordWwsIG9sIHsKKyAgbWFyZ2luLWxlZnQ6ICRzcGFjaW5nLXVuaXQ7Cit9CisKK2xpIHsKKyAgPiB1bCwKKyAgPiBvbCB7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgfQorfQorCisKKworLyoqCisgKiBIZWFkaW5ncworICovCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKKyAgZm9udC13ZWlnaHQ6ICRiYXNlLWZvbnQtd2VpZ2h0OworfQorCisKKworLyoqCisgKiBMaW5rcworICovCithIHsKKyAgY29sb3I6ICRicmFuZC1jb2xvcjsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworCisgICY6dmlzaXRlZCB7CisgICAgY29sb3I6IGRhcmtlbigkYnJhbmQtY29sb3IsIDE1JSk7CisgIH0KKworICAmOmhvdmVyIHsKKyAgICBjb2xvcjogJHRleHQtY29sb3I7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgIH0KKworICAuc29jaWFsLW1lZGlhLWxpc3QgJjpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworCisgICAgLnVzZXJuYW1lIHsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgIH0KKyAgfQorfQorCisKKy8qKgorICogQmxvY2txdW90ZXMKKyAqLworYmxvY2txdW90ZSB7CisgIGNvbG9yOiAkZ3JleS1jb2xvcjsKKyAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAkZ3JleS1jb2xvci1saWdodDsKKyAgcGFkZGluZy1sZWZ0OiAkc3BhY2luZy11bml0IC8gMjsKKyAgQGluY2x1ZGUgcmVsYXRpdmUtZm9udC1zaXplKDEuMTI1KTsKKyAgbGV0dGVyLXNwYWNpbmc6IC0xcHg7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKworICA+IDpsYXN0LWNoaWxkIHsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICB9Cit9CisKKworCisvKioKKyAqIENvZGUgZm9ybWF0dGluZworICovCitwcmUsCitjb2RlIHsKKyAgQGluY2x1ZGUgcmVsYXRpdmUtZm9udC1zaXplKDAuOTM3NSk7CisgIGJvcmRlcjogMXB4IHNvbGlkICRncmV5LWNvbG9yLWxpZ2h0OworICBib3JkZXItcmFkaXVzOiAzcHg7CisgIGJhY2tncm91bmQtY29sb3I6ICNlZWY7Cit9CisKK2NvZGUgeworICBwYWRkaW5nOiAxcHggNXB4OworfQorCitwcmUgeworICBwYWRkaW5nOiA4cHggMTJweDsKKyAgb3ZlcmZsb3cteDogYXV0bzsKKworICA+IGNvZGUgeworICAgIGJvcmRlcjogMDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAwOworICAgIHBhZGRpbmctbGVmdDogMDsKKyAgfQorfQorCisKKworLyoqCisgKiBXcmFwcGVyCisgKi8KKy53cmFwcGVyIHsKKyAgbWF4LXdpZHRoOiAtd2Via2l0LWNhbGMoI3skY29udGVudC13aWR0aH0gLSAoI3skc3BhY2luZy11bml0fSAqIDIpKTsKKyAgbWF4LXdpZHRoOiAgICAgICAgIGNhbGMoI3skY29udGVudC13aWR0aH0gLSAoI3skc3BhY2luZy11bml0fSAqIDIpKTsKKyAgbWFyZ2luLXJpZ2h0OiBhdXRvOworICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgcGFkZGluZy1yaWdodDogJHNwYWNpbmctdW5pdDsKKyAgcGFkZGluZy1sZWZ0OiAkc3BhY2luZy11bml0OworICBAZXh0ZW5kICVjbGVhcmZpeDsKKworICBAaW5jbHVkZSBtZWRpYS1xdWVyeSgkb24tbGFwdG9wKSB7CisgICAgbWF4LXdpZHRoOiAtd2Via2l0LWNhbGMoI3skY29udGVudC13aWR0aH0gLSAoI3skc3BhY2luZy11bml0fSkpOworICAgIG1heC13aWR0aDogICAgICAgICBjYWxjKCN7JGNvbnRlbnQtd2lkdGh9IC0gKCN7JHNwYWNpbmctdW5pdH0pKTsKKyAgICBwYWRkaW5nLXJpZ2h0OiAkc3BhY2luZy11bml0IC8gMjsKKyAgICBwYWRkaW5nLWxlZnQ6ICRzcGFjaW5nLXVuaXQgLyAyOworICB9Cit9CisKKworCisvKioKKyAqIENsZWFyZml4CisgKi8KKyVjbGVhcmZpeDphZnRlciB7CisgIGNvbnRlbnQ6ICIiOworICBkaXNwbGF5OiB0YWJsZTsKKyAgY2xlYXI6IGJvdGg7Cit9CisKKworCisvKioKKyAqIEljb25zCisgKi8KKy5pY29uID4gc3ZnIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworCisgIHBhdGggeworICAgIGZpbGw6ICRncmV5LWNvbG9yOworICB9Cit9CisKKy5zb2NpYWwtbWVkaWEtbGlzdCB7CisgIC5pY29uIHsKKyAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7CisgIH0KKworICBsaSArIGxpIHsKKyAgICBwYWRkaW5nLXRvcDogNXB4OworICB9Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX3Nhc3MvbWluaW1hL19sYXlvdXQuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9fc2Fzcy9taW5pbWEvX2xheW91dC5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTA0MmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvX3Nhc3MvbWluaW1hL19sYXlvdXQuc2NzcwpAQCAtMCwwICsxLDI1MCBAQAorLyoqCisgKiBTaXRlIGhlYWRlcgorICovCisuc2l0ZS1oZWFkZXIgeworICBib3JkZXItdG9wOiA1cHggc29saWQgJGdyZXktY29sb3ItZGFyazsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRncmV5LWNvbG9yLWxpZ2h0OworICBtaW4taGVpZ2h0OiAkc3BhY2luZy11bml0ICogMS44NjU7CisKKyAgLy8gUG9zaXRpb25pbmcgY29udGV4dCBmb3IgdGhlIG1vYmlsZSBuYXZpZ2F0aW9uIGljb24KKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisuc2l0ZS10aXRsZSB7CisgIEBpbmNsdWRlIHJlbGF0aXZlLWZvbnQtc2l6ZSgxLjYyNSk7CisgIGZvbnQtd2VpZ2h0OiAzMDA7CisgIGxpbmUtaGVpZ2h0OiAkYmFzZS1saW5lLWhlaWdodCAqICRiYXNlLWZvbnQtc2l6ZSAqIDIuMjU7CisgIGxldHRlci1zcGFjaW5nOiAtMXB4OworICBtYXJnaW4tYm90dG9tOiAwOworICBmbG9hdDogbGVmdDsKKworICAmLAorICAmOnZpc2l0ZWQgeworICAgIGNvbG9yOiAkZ3JleS1jb2xvci1kYXJrOworICB9Cit9CisKKy5zaXRlLW5hdiB7CisgIGZsb2F0OiByaWdodDsKKyAgbGluZS1oZWlnaHQ6ICRiYXNlLWxpbmUtaGVpZ2h0ICogJGJhc2UtZm9udC1zaXplICogMi4yNTsKKworICAubmF2LXRyaWdnZXIgeworICAgICAgZGlzcGxheTogbm9uZTsKKyAgfQorCisgIC5tZW51LWljb24geworICAgIGRpc3BsYXk6IG5vbmU7CisgIH0KKworICAucGFnZS1saW5rIHsKKyAgICBjb2xvcjogJHRleHQtY29sb3I7CisgICAgbGluZS1oZWlnaHQ6ICRiYXNlLWxpbmUtaGVpZ2h0OworCisgICAgLy8gR2FwcyBiZXR3ZWVuIG5hdiBpdGVtcywgYnV0IG5vdCBvbiB0aGUgbGFzdCBvbmUKKyAgICAmOm5vdCg6bGFzdC1jaGlsZCkgeworICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OworICAgIH0KKyAgfQorCisgIEBpbmNsdWRlIG1lZGlhLXF1ZXJ5KCRvbi1wYWxtKSB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogOXB4OworICAgIHJpZ2h0OiAkc3BhY2luZy11bml0IC8gMjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZC1jb2xvcjsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAkZ3JleS1jb2xvci1saWdodDsKKyAgICBib3JkZXItcmFkaXVzOiA1cHg7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisKKyAgICBsYWJlbFtmb3I9Im5hdi10cmlnZ2VyIl0geworICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICB3aWR0aDogMzZweDsKKyAgICAgIGhlaWdodDogMzZweDsKKyAgICAgIHotaW5kZXg6IDI7CisgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgfQorCisgICAgLm1lbnUtaWNvbiB7CisgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgIHdpZHRoOiAzNnB4OworICAgICAgaGVpZ2h0OiAyNnB4OworICAgICAgbGluZS1oZWlnaHQ6IDA7CisgICAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKworICAgICAgPiBzdmcgcGF0aCB7CisgICAgICAgIGZpbGw6ICRncmV5LWNvbG9yLWRhcms7CisgICAgICB9CisgICAgfQorCisgICAgaW5wdXQgfiAudHJpZ2dlciB7CisgICAgICBjbGVhcjogYm90aDsKKyAgICAgIGRpc3BsYXk6IG5vbmU7CisgICAgfQorCisgICAgaW5wdXQ6Y2hlY2tlZCB+IC50cmlnZ2VyIHsKKyAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgcGFkZGluZy1ib3R0b206IDVweDsKKyAgICB9CisKKyAgICAucGFnZS1saW5rIHsKKyAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgcGFkZGluZzogNXB4IDEwcHg7CisKKyAgICAgICY6bm90KDpsYXN0LWNoaWxkKSB7CisgICAgICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICAgIH0KKyAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OworICAgIH0KKyAgfQorfQorCisKKworLyoqCisgKiBTaXRlIGZvb3RlcgorICovCisuc2l0ZS1mb290ZXIgeworICBib3JkZXItdG9wOiAxcHggc29saWQgJGdyZXktY29sb3ItbGlnaHQ7CisgIHBhZGRpbmc6ICRzcGFjaW5nLXVuaXQgMDsKK30KKworLmZvb3Rlci1oZWFkaW5nIHsKKyAgQGluY2x1ZGUgcmVsYXRpdmUtZm9udC1zaXplKDEuMTI1KTsKKyAgbWFyZ2luLWJvdHRvbTogJHNwYWNpbmctdW5pdCAvIDI7Cit9CisKKy5jb250YWN0LWxpc3QsCisuc29jaWFsLW1lZGlhLWxpc3QgeworICBsaXN0LXN0eWxlOiBub25lOworICBtYXJnaW4tbGVmdDogMDsKK30KKworLmZvb3Rlci1jb2wtd3JhcHBlciB7CisgIEBpbmNsdWRlIHJlbGF0aXZlLWZvbnQtc2l6ZSgwLjkzNzUpOworICBjb2xvcjogJGdyZXktY29sb3I7CisgIG1hcmdpbi1sZWZ0OiAtJHNwYWNpbmctdW5pdCAvIDI7CisgIEBleHRlbmQgJWNsZWFyZml4OworfQorCisuZm9vdGVyLWNvbCB7CisgIGZsb2F0OiBsZWZ0OworICBtYXJnaW4tYm90dG9tOiAkc3BhY2luZy11bml0IC8gMjsKKyAgcGFkZGluZy1sZWZ0OiAkc3BhY2luZy11bml0IC8gMjsKK30KKworLmZvb3Rlci1jb2wtMSB7CisgIHdpZHRoOiAtd2Via2l0LWNhbGMoMzUlIC0gKCN7JHNwYWNpbmctdW5pdH0gLyAyKSk7CisgIHdpZHRoOiAgICAgICAgIGNhbGMoMzUlIC0gKCN7JHNwYWNpbmctdW5pdH0gLyAyKSk7Cit9CisKKy5mb290ZXItY29sLTIgeworICB3aWR0aDogLXdlYmtpdC1jYWxjKDIwJSAtICgjeyRzcGFjaW5nLXVuaXR9IC8gMikpOworICB3aWR0aDogICAgICAgICBjYWxjKDIwJSAtICgjeyRzcGFjaW5nLXVuaXR9IC8gMikpOworfQorCisuZm9vdGVyLWNvbC0zIHsKKyAgd2lkdGg6IC13ZWJraXQtY2FsYyg0NSUgLSAoI3skc3BhY2luZy11bml0fSAvIDIpKTsKKyAgd2lkdGg6ICAgICAgICAgY2FsYyg0NSUgLSAoI3skc3BhY2luZy11bml0fSAvIDIpKTsKK30KKworQGluY2x1ZGUgbWVkaWEtcXVlcnkoJG9uLWxhcHRvcCkgeworICAuZm9vdGVyLWNvbC0xLAorICAuZm9vdGVyLWNvbC0yIHsKKyAgICB3aWR0aDogLXdlYmtpdC1jYWxjKDUwJSAtICgjeyRzcGFjaW5nLXVuaXR9IC8gMikpOworICAgIHdpZHRoOiAgICAgICAgIGNhbGMoNTAlIC0gKCN7JHNwYWNpbmctdW5pdH0gLyAyKSk7CisgIH0KKworICAuZm9vdGVyLWNvbC0zIHsKKyAgICB3aWR0aDogLXdlYmtpdC1jYWxjKDEwMCUgLSAoI3skc3BhY2luZy11bml0fSAvIDIpKTsKKyAgICB3aWR0aDogICAgICAgICBjYWxjKDEwMCUgLSAoI3skc3BhY2luZy11bml0fSAvIDIpKTsKKyAgfQorfQorCitAaW5jbHVkZSBtZWRpYS1xdWVyeSgkb24tcGFsbSkgeworICAuZm9vdGVyLWNvbCB7CisgICAgZmxvYXQ6IG5vbmU7CisgICAgd2lkdGg6IC13ZWJraXQtY2FsYygxMDAlIC0gKCN7JHNwYWNpbmctdW5pdH0gLyAyKSk7CisgICAgd2lkdGg6ICAgICAgICAgY2FsYygxMDAlIC0gKCN7JHNwYWNpbmctdW5pdH0gLyAyKSk7CisgIH0KK30KKworCisKKy8qKgorICogUGFnZSBjb250ZW50CisgKi8KKy5wYWdlLWNvbnRlbnQgeworICBwYWRkaW5nOiAkc3BhY2luZy11bml0IDA7Cit9CisKKy5wYWdlLWhlYWRpbmcgeworICBAaW5jbHVkZSByZWxhdGl2ZS1mb250LXNpemUoMS4yNSk7Cit9CisKKy5wb3N0LWxpc3QgeworICBtYXJnaW4tbGVmdDogMDsKKyAgbGlzdC1zdHlsZTogbm9uZTsKKworICA+IGxpIHsKKyAgICBtYXJnaW4tYm90dG9tOiAkc3BhY2luZy11bml0OworICB9Cit9CisKKy5wb3N0LW1ldGEgeworICBmb250LXNpemU6ICRzbWFsbC1mb250LXNpemU7CisgIGNvbG9yOiAkZ3JleS1jb2xvcjsKK30KKworLnBvc3QtbGluayB7CisgIGRpc3BsYXk6IGJsb2NrOworICBAaW5jbHVkZSByZWxhdGl2ZS1mb250LXNpemUoMS41KTsKK30KKworCisKKy8qKgorICogUG9zdHMKKyAqLworLnBvc3QtaGVhZGVyIHsKKyAgbWFyZ2luLWJvdHRvbTogJHNwYWNpbmctdW5pdDsKK30KKworLnBvc3QtdGl0bGUgeworICBAaW5jbHVkZSByZWxhdGl2ZS1mb250LXNpemUoMi42MjUpOworICBsZXR0ZXItc3BhY2luZzogLTFweDsKKyAgbGluZS1oZWlnaHQ6IDE7CisKKyAgQGluY2x1ZGUgbWVkaWEtcXVlcnkoJG9uLWxhcHRvcCkgeworICAgIEBpbmNsdWRlIHJlbGF0aXZlLWZvbnQtc2l6ZSgyLjI1KTsKKyAgfQorfQorCisucG9zdC1jb250ZW50IHsKKyAgbWFyZ2luLWJvdHRvbTogJHNwYWNpbmctdW5pdDsKKworICBoMiB7CisgICAgQGluY2x1ZGUgcmVsYXRpdmUtZm9udC1zaXplKDIpOworCisgICAgQGluY2x1ZGUgbWVkaWEtcXVlcnkoJG9uLWxhcHRvcCkgeworICAgICAgQGluY2x1ZGUgcmVsYXRpdmUtZm9udC1zaXplKDEuNzUpOworICAgIH0KKyAgfQorCisgIGgzIHsKKyAgICBAaW5jbHVkZSByZWxhdGl2ZS1mb250LXNpemUoMS42MjUpOworCisgICAgQGluY2x1ZGUgbWVkaWEtcXVlcnkoJG9uLWxhcHRvcCkgeworICAgICAgQGluY2x1ZGUgcmVsYXRpdmUtZm9udC1zaXplKDEuMzc1KTsKKyAgICB9CisgIH0KKworICBoNCB7CisgICAgQGluY2x1ZGUgcmVsYXRpdmUtZm9udC1zaXplKDEuMjUpOworCisgICAgQGluY2x1ZGUgbWVkaWEtcXVlcnkoJG9uLWxhcHRvcCkgeworICAgICAgQGluY2x1ZGUgcmVsYXRpdmUtZm9udC1zaXplKDEuMTI1KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9fc2Fzcy9taW5pbWEvX3N5bnRheC1oaWdobGlnaHRpbmcuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9fc2Fzcy9taW5pbWEvX3N5bnRheC1oaWdobGlnaHRpbmcuc2NzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2NkYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvbWluaW1hLTIuMS4xL19zYXNzL21pbmltYS9fc3ludGF4LWhpZ2hsaWdodGluZy5zY3NzCkBAIC0wLDAgKzEsNzEgQEAKKy8qKgorICogU3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZXMKKyAqLworLmhpZ2hsaWdodCB7CisgIGJhY2tncm91bmQ6ICNmZmY7CisgIEBleHRlbmQgJXZlcnRpY2FsLXJoeXRobTsKKworICAuaGlnaGxpZ2h0ZXItcm91Z2UgJiB7CisgICAgYmFja2dyb3VuZDogI2VlZjsKKyAgfQorCisgIC5jICAgICB7IGNvbG9yOiAjOTk4OyBmb250LXN0eWxlOiBpdGFsaWMgfSAvLyBDb21tZW50CisgIC5lcnIgICB7IGNvbG9yOiAjYTYxNzE3OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNkMmQyIH0gLy8gRXJyb3IKKyAgLmsgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvLyBLZXl3b3JkCisgIC5vICAgICB7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLy8gT3BlcmF0b3IKKyAgLmNtICAgIHsgY29sb3I6ICM5OTg7IGZvbnQtc3R5bGU6IGl0YWxpYyB9IC8vIENvbW1lbnQuTXVsdGlsaW5lCisgIC5jcCAgICB7IGNvbG9yOiAjOTk5OyBmb250LXdlaWdodDogYm9sZCB9IC8vIENvbW1lbnQuUHJlcHJvYworICAuYzEgICAgeyBjb2xvcjogIzk5ODsgZm9udC1zdHlsZTogaXRhbGljIH0gLy8gQ29tbWVudC5TaW5nbGUKKyAgLmNzICAgIHsgY29sb3I6ICM5OTk7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXN0eWxlOiBpdGFsaWMgfSAvLyBDb21tZW50LlNwZWNpYWwKKyAgLmdkICAgIHsgY29sb3I6ICMwMDA7IGJhY2tncm91bmQtY29sb3I6ICNmZGQgfSAvLyBHZW5lcmljLkRlbGV0ZWQKKyAgLmdkIC54IHsgY29sb3I6ICMwMDA7IGJhY2tncm91bmQtY29sb3I6ICNmYWEgfSAvLyBHZW5lcmljLkRlbGV0ZWQuU3BlY2lmaWMKKyAgLmdlICAgIHsgZm9udC1zdHlsZTogaXRhbGljIH0gLy8gR2VuZXJpYy5FbXBoCisgIC5nciAgICB7IGNvbG9yOiAjYTAwIH0gLy8gR2VuZXJpYy5FcnJvcgorICAuZ2ggICAgeyBjb2xvcjogIzk5OSB9IC8vIEdlbmVyaWMuSGVhZGluZworICAuZ2kgICAgeyBjb2xvcjogIzAwMDsgYmFja2dyb3VuZC1jb2xvcjogI2RmZCB9IC8vIEdlbmVyaWMuSW5zZXJ0ZWQKKyAgLmdpIC54IHsgY29sb3I6ICMwMDA7IGJhY2tncm91bmQtY29sb3I6ICNhZmEgfSAvLyBHZW5lcmljLkluc2VydGVkLlNwZWNpZmljCisgIC5nbyAgICB7IGNvbG9yOiAjODg4IH0gLy8gR2VuZXJpYy5PdXRwdXQKKyAgLmdwICAgIHsgY29sb3I6ICM1NTUgfSAvLyBHZW5lcmljLlByb21wdAorICAuZ3MgICAgeyBmb250LXdlaWdodDogYm9sZCB9IC8vIEdlbmVyaWMuU3Ryb25nCisgIC5ndSAgICB7IGNvbG9yOiAjYWFhIH0gLy8gR2VuZXJpYy5TdWJoZWFkaW5nCisgIC5ndCAgICB7IGNvbG9yOiAjYTAwIH0gLy8gR2VuZXJpYy5UcmFjZWJhY2sKKyAgLmtjICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvLyBLZXl3b3JkLkNvbnN0YW50CisgIC5rZCAgICB7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLy8gS2V5d29yZC5EZWNsYXJhdGlvbgorICAua3AgICAgeyBmb250LXdlaWdodDogYm9sZCB9IC8vIEtleXdvcmQuUHNldWRvCisgIC5rciAgICB7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLy8gS2V5d29yZC5SZXNlcnZlZAorICAua3QgICAgeyBjb2xvcjogIzQ1ODsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvLyBLZXl3b3JkLlR5cGUKKyAgLm0gICAgIHsgY29sb3I6ICMwOTkgfSAvLyBMaXRlcmFsLk51bWJlcgorICAucyAgICAgeyBjb2xvcjogI2QxNCB9IC8vIExpdGVyYWwuU3RyaW5nCisgIC5uYSAgICB7IGNvbG9yOiAjMDA4MDgwIH0gLy8gTmFtZS5BdHRyaWJ1dGUKKyAgLm5iICAgIHsgY29sb3I6ICMwMDg2QjMgfSAvLyBOYW1lLkJ1aWx0aW4KKyAgLm5jICAgIHsgY29sb3I6ICM0NTg7IGZvbnQtd2VpZ2h0OiBib2xkIH0gLy8gTmFtZS5DbGFzcworICAubm8gICAgeyBjb2xvcjogIzAwODA4MCB9IC8vIE5hbWUuQ29uc3RhbnQKKyAgLm5pICAgIHsgY29sb3I6ICM4MDAwODAgfSAvLyBOYW1lLkVudGl0eQorICAubmUgICAgeyBjb2xvcjogIzkwMDsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvLyBOYW1lLkV4Y2VwdGlvbgorICAubmYgICAgeyBjb2xvcjogIzkwMDsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvLyBOYW1lLkZ1bmN0aW9uCisgIC5ubiAgICB7IGNvbG9yOiAjNTU1IH0gLy8gTmFtZS5OYW1lc3BhY2UKKyAgLm50ICAgIHsgY29sb3I6ICMwMDAwODAgfSAvLyBOYW1lLlRhZworICAubnYgICAgeyBjb2xvcjogIzAwODA4MCB9IC8vIE5hbWUuVmFyaWFibGUKKyAgLm93ICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfSAvLyBPcGVyYXRvci5Xb3JkCisgIC53ICAgICB7IGNvbG9yOiAjYmJiIH0gLy8gVGV4dC5XaGl0ZXNwYWNlCisgIC5tZiAgICB7IGNvbG9yOiAjMDk5IH0gLy8gTGl0ZXJhbC5OdW1iZXIuRmxvYXQKKyAgLm1oICAgIHsgY29sb3I6ICMwOTkgfSAvLyBMaXRlcmFsLk51bWJlci5IZXgKKyAgLm1pICAgIHsgY29sb3I6ICMwOTkgfSAvLyBMaXRlcmFsLk51bWJlci5JbnRlZ2VyCisgIC5tbyAgICB7IGNvbG9yOiAjMDk5IH0gLy8gTGl0ZXJhbC5OdW1iZXIuT2N0CisgIC5zYiAgICB7IGNvbG9yOiAjZDE0IH0gLy8gTGl0ZXJhbC5TdHJpbmcuQmFja3RpY2sKKyAgLnNjICAgIHsgY29sb3I6ICNkMTQgfSAvLyBMaXRlcmFsLlN0cmluZy5DaGFyCisgIC5zZCAgICB7IGNvbG9yOiAjZDE0IH0gLy8gTGl0ZXJhbC5TdHJpbmcuRG9jCisgIC5zMiAgICB7IGNvbG9yOiAjZDE0IH0gLy8gTGl0ZXJhbC5TdHJpbmcuRG91YmxlCisgIC5zZSAgICB7IGNvbG9yOiAjZDE0IH0gLy8gTGl0ZXJhbC5TdHJpbmcuRXNjYXBlCisgIC5zaCAgICB7IGNvbG9yOiAjZDE0IH0gLy8gTGl0ZXJhbC5TdHJpbmcuSGVyZWRvYworICAuc2kgICAgeyBjb2xvcjogI2QxNCB9IC8vIExpdGVyYWwuU3RyaW5nLkludGVycG9sCisgIC5zeCAgICB7IGNvbG9yOiAjZDE0IH0gLy8gTGl0ZXJhbC5TdHJpbmcuT3RoZXIKKyAgLnNyICAgIHsgY29sb3I6ICMwMDk5MjYgfSAvLyBMaXRlcmFsLlN0cmluZy5SZWdleAorICAuczEgICAgeyBjb2xvcjogI2QxNCB9IC8vIExpdGVyYWwuU3RyaW5nLlNpbmdsZQorICAuc3MgICAgeyBjb2xvcjogIzk5MDA3MyB9IC8vIExpdGVyYWwuU3RyaW5nLlN5bWJvbAorICAuYnAgICAgeyBjb2xvcjogIzk5OSB9IC8vIE5hbWUuQnVpbHRpbi5Qc2V1ZG8KKyAgLnZjICAgIHsgY29sb3I6ICMwMDgwODAgfSAvLyBOYW1lLlZhcmlhYmxlLkNsYXNzCisgIC52ZyAgICB7IGNvbG9yOiAjMDA4MDgwIH0gLy8gTmFtZS5WYXJpYWJsZS5HbG9iYWwKKyAgLnZpICAgIHsgY29sb3I6ICMwMDgwODAgfSAvLyBOYW1lLlZhcmlhYmxlLkluc3RhbmNlCisgIC5pbCAgICB7IGNvbG9yOiAjMDk5IH0gLy8gTGl0ZXJhbC5OdW1iZXIuSW50ZWdlci5Mb25nCit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvYXNzZXRzL21haW4uc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL21pbmltYS0yLjEuMS9hc3NldHMvbWFpbi5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGViZTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9taW5pbWEtMi4xLjEvYXNzZXRzL21haW4uc2NzcwpAQCAtMCwwICsxLDUgQEAKKy0tLQorIyBPbmx5IHRoZSBtYWluIFNhc3MgZmlsZSBuZWVkcyBmcm9udCBtYXR0ZXIgKHRoZSBkYXNoZXMgYXJlIGVub3VnaCkKKy0tLQorCitAaW1wb3J0ICJtaW5pbWEiOwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcGF0aHV0aWwtMC4xNC4wL0dlbWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wYXRodXRpbC0wLjE0LjAvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDBlOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcGF0aHV0aWwtMC4xNC4wL0dlbWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZyb3plbi1zdHJpbmctbGl0ZXJhbDogdHJ1ZQorIyBDb3B5cmlnaHQ6IDIwMTUtMjAxNiBKb3Jkb24gQmVkd2VsbCAtIE1JVCBMaWNlbnNlCisjIEVuY29kaW5nOiB1dGYtOAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NvdXJjZSAiaHR0cHM6Ly9ydWJ5Z2Vtcy5vcmciCitnZW0gInJha2UiLCA6cmVxdWlyZSA9PiBmYWxzZQorZ2Vtc3BlYworCitncm91cCA6dGVzdCBkbworICBnZW0gImx1bmEtcnNwZWMtZm9ybWF0dGVycyIsIDpyZXF1aXJlID0+IGZhbHNlCisgIGdlbSAiY29kZWNsaW1hdGUtdGVzdC1yZXBvcnRlciIsIDpyZXF1aXJlID0+IGZhbHNlCisgIGdlbSAic2FmZV95YW1sIiwgOnJlcXVpcmUgPT4gZmFsc2UKK2VuZAorCitncm91cCA6ZGV2ZWxvcG1lbnQgZG8KKyAgZ2VtICJyc3BlYyIsIDpyZXF1aXJlID0+IGZhbHNlCisgIGdlbSAicnNwZWMtaGVscGVycyIsIDpyZXF1aXJlID0+IGZhbHNlCisgIGdlbSAibHVuYS1ydWJvY29wLWZvcm1hdHRlcnMiLCA6cmVxdWlyZSA9PiBmYWxzZQorICBnZW0gInJ1Ym9jb3AiLCA6Z2l0aHViID0+ICJiYmF0c292L3J1Ym9jb3AiLCA6cmVxdWlyZSA9PiBmYWxzZQorICBnZW0gImJlbmNobWFyay1pcHMiLCA6cmVxdWlyZSA9PiBmYWxzZQorICBnZW0gInNpbXBsZS1hbnNpIiwgOnJlcXVpcmUgPT4gZmFsc2UKKyAgZ2VtICJwcnkiLCA6cmVxdWlyZSA9PiBmYWxzZQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wYXRodXRpbC0wLjE0LjAvTElDRU5TRSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3BhdGh1dGlsLTAuMTQuMC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDNhNzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wYXRodXRpbC0wLjE0LjAvTElDRU5TRQpAQCAtMCwwICsxLDE5IEBACitDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBKb3Jkb24gQmVkd2VsbAorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCitTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3BhdGh1dGlsLTAuMTQuMC9SYWtlZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3BhdGh1dGlsLTAuMTQuMC9SYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2FmM2MxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcGF0aHV0aWwtMC4xNC4wL1Jha2VmaWxlCkBAIC0wLDAgKzEsODMgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGcm96ZW4tc3RyaW5nLWxpdGVyYWw6IHRydWUKKyMgQ29weXJpZ2h0OiAyMDE1LTIwMTYgSm9yZG9uIEJlZHdlbGwgLSBNSVQgTGljZW5zZQorIyBFbmNvZGluZzogdXRmLTgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZXF1aXJlICJvcGVuMyIKK3JlcXVpcmUgInJzcGVjL2NvcmUvcmFrZV90YXNrIgorcmVxdWlyZV9yZWxhdGl2ZSAiYmVuY2htYXJrL3N1cHBvcnQvdGFzayIKK3JlcXVpcmUgImx1bmEvcnVib2NvcC9yYWtlL3Rhc2siCityZXF1aXJlICJzaW1wbGUvYW5zaSIKK3JlcXVpcmUgInBhdGh1dGlsIgorcmVxdWlyZSAianNvbiIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Rhc2sgOmRlZmF1bHQgPT4gWworICBFTlZbIkJFTkNITUFSSyJdID8gOmJlbmNobWFyayA6IDpzcGVjCitdCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZW5jaG1hcmtUYXNrLm5ldyA6YmVuY2htYXJrCitSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3IDpzcGVjCit0YXNrIDp0ZXN0ID0+IDpzcGVjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgOmRpZmYgZG8KKyAgZGVzYyAiTGlzdCBtZXRob2RzIHdlIGhhdmUgdGhhdCBQYXRobmFtZSBkb2Vzbid0LiIKKyAgdGFzayA6bWV0aG9kcyBkbworICAgIG1ldGhvZHMgPSBQYXRodXRpbC5pbnN0YW5jZV9tZXRob2RzIC0gUGF0aG5hbWUuaW5zdGFuY2VfbWV0aG9kcyAtIE9iamVjdC5pbnN0YW5jZV9tZXRob2RzCisgICAgbWV0aG9kcy5lYWNoIGRvIHxtZXRob2R8CisgICAgICAkc3Rkb3V0LnByaW50ICItICIsICJgIiwgbWV0aG9kLCAiYCIsICJcbiIKKyAgICBlbmQKKyAgZW5kCitlbmQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSA6bWlzc2luZyBkbworICBkZXNjICJMaXN0IG1ldGhvZHMgd2UgYXJlIG1pc3NpbmcuIgorICB0YXNrIDptZXRob2RzIGRvCisgICAgbWV0aG9kcyA9IFBhdGhuYW1lLmluc3RhbmNlX21ldGhvZHMgLSBQYXRodXRpbC5pbnN0YW5jZV9tZXRob2RzIC0gT2JqZWN0Lmluc3RhbmNlX21ldGhvZHMKKyAgICBtZXRob2RzLT0gWworICAgICAgOmNsZWFucGF0aAorICAgIF0KKworICAgIG1ldGhvZHMuZWFjaCBkbyB8bWV0aG9kfAorICAgICAgJHN0ZG91dC5wdXRzIG1ldGhvZAorICAgIGVuZAorICBlbmQKK2VuZAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIDpwYXRobmFtZSBkbworICBkZXNjICJMaXN0IGFsbCBvZiBQYXRobmFtZXMgbWV0aG9kcy4iCisgIHRhc2sgOm1ldGhvZHMgZG8KKyAgICBtZXRob2RzID0gUGF0aG5hbWUuaW5zdGFuY2VfbWV0aG9kcyAtIE9iamVjdC5pbnN0YW5jZV9tZXRob2RzCisgICAgbWV0aG9kcy5lYWNoX3dpdGhfaW5kZXggZG8gfG1ldGhvZCwgaW5kZXh8CisgICAgICAkc3Rkb3V0LnByaW50IG1ldGhvZAorICAgICAgdW5sZXNzIGluZGV4ID09IG1ldGhvZHMuc2l6ZSAtIDEKKyAgICAgICAgJHN0ZG91dC5wcmludCAiLCAiCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICRzdGRvdXQucHV0cworICBlbmQKK2VuZAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVzYyAiTGlzdCBhbGwgb2YgUGF0aHV0aWxzIG1ldGhvZHMuIgordGFzayA6bWV0aG9kcyBkbworICBtZXRob2RzID0gUGF0aHV0aWwuaW5zdGFuY2VfbWV0aG9kcyAtIE9iamVjdC5pbnN0YW5jZV9tZXRob2RzCisgIG1ldGhvZHMuZWFjaF93aXRoX2luZGV4IGRvIHxtZXRob2QsIGluZGV4fAorICAgICRzdGRvdXQucHJpbnQgImAiLCBtZXRob2QsICJgIgorICAgICRzdGRvdXQucHJpbnQgIiwgIiB1bmxlc3MgaW5kZXggPT0gbWV0aG9kcy5zaXplIC0gMQorICBlbmQKKworICAkc3Rkb3V0LnB1dHMKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcGF0aHV0aWwtMC4xNC4wL2xpYi9wYXRodXRpbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3BhdGh1dGlsLTAuMTQuMC9saWIvcGF0aHV0aWwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3ODM5MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3BhdGh1dGlsLTAuMTQuMC9saWIvcGF0aHV0aWwucmIKQEAgLTAsMCArMSw5MTMgQEAKKyMgRnJvemVuLXN0cmluZy1saXRlcmFsOiB0cnVlCisjIENvcHlyaWdodDogMjAxNS0yMDE2IEpvcmRvbiBCZWR3ZWxsIC0gTUlUIExpY2Vuc2UKKyMgRW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgInBhdGh1dGlsL2hlbHBlcnMiCityZXF1aXJlICJmb3J3YXJkYWJsZS9leHRlbmRlZCIKK3JlcXVpcmUgImZpbmQiCisKK2NsYXNzIFBhdGh1dGlsCisgIGF0dHJfd3JpdGVyIDplbmNvZGluZworICBleHRlbmQgRm9yd2FyZGFibGU6OkV4dGVuZGVkCisgIGV4dGVuZCBIZWxwZXJzCisKKyAgIyAtLQorICAjIEBub3RlIEEgbG90IG9mIHRoaXMgY2xhc3MgY2FuIGJlIGNvbXBhdGlibGUgd2l0aCBQYXRobmFtZS4KKyAgIyBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlLgorICAjIEByZXR1cm4gUGF0aHV0aWwKKyAgIyAtLQorICBkZWYgaW5pdGlhbGl6ZShwYXRoKQorICAgIHJldHVybiBAcGF0aCA9IHBhdGggaWYgcGF0aC5pc19hPyhTdHJpbmcpCisgICAgcmV0dXJuIEBwYXRoID0gcGF0aC50b19wYXRoIGlmIHBhdGgucmVzcG9uZF90bz8oOnRvX3BhdGgpCisgICAgcmV0dXJuIEBwYXRoID0gcGF0aC50b19zCisgIGVuZAorCisgICMgLS0KKyAgIyBNYWtlIGEgcGF0aCByZWxhdGl2ZS4KKyAgIyAtLQorCisgIGRlZiByZWxhdGl2ZQorICAgIHJldHVybiBzZWxmIGlmIHJlbGF0aXZlPworICAgIHNlbGYuY2xhc3MubmV3KHN0cmlwX3dpbmRvd3NfZHJpdmUuZ3N1YigKKyAgICAgICVyIVxBKFxcK3wvKykhLCAiIgorICAgICkpCisgIGVuZAorCisgICMgLS0KKyAgIyBNYWtlIGEgcGF0aCBhYnNvbHV0ZQorICAjIC0tCisKKyAgZGVmIGFic29sdXRlCisgICAgcmV0dXJuIHNlbGYgaWYgYWJzb2x1dGU/CisgICAgc2VsZi5jbGFzcy5uZXcoIi8iKS5qb2luKAorICAgICAgQHBhdGgKKyAgICApCisgIGVuZAorCisgICMgLS0KKyAgIyBAc2VlIFBhdGhuYW1lI2NsZWFucGF0aC4KKyAgIyBAbm90ZSBUaGlzIGlzIGEgd2hvbGVzYWxlIHJpcCBhbmQgY2xlYW51cCBvZiBQYXRobmFtZSNjbGVhbnBhdGgKKyAgIyBAcmV0dXJuIFBhdGh1dGlsCisgICMgLS0KKyAgZGVmIGNsZWFucGF0aChzeW1saW5rID0gZmFsc2UpCisgICAgc3ltbGluayA/IGNvbnNlcnZhdGl2ZV9jbGVhbnBhdGggOiBhZ2dyZXNzaXZlX2NsZWFucGF0aAorICBlbmQKKworICAjIC0tCisgICMgQHlpZWxkIFBhdGh1dGlsCisgICMgQG5vdGUgSXQgd2lsbCByZXR1cm4gYWxsIHJlc3VsdHMgdGhhdCBpdCBmaW5kcyBhY3Jvc3MgYWxsIGFzY2VuZGluZyBwYXRocy4KKyAgIyBAZXhhbXBsZSBQYXRodXRpbC5uZXcoIn4vIikuZXhwYW5kX3BhdGguc2VhcmNoX2JhY2t3YXJkcygiLmJhc2hyYyIpID0+IFsjPFBhdGh1dGlsOi9ob21lL3VzZXIvLmJhc2hyYz5dCisgICMgU2VhcmNoIGJhY2t3YXJkcyBmb3IgYSBmaWxlIChsaWtlIFJha2VmaWxlLCBfY29uZmlnLnltbCwgb3B0cy55bWwpLgorICAjIEByZXR1cm4gRW51bQorICAjIC0tCisgIGRlZiBzZWFyY2hfYmFja3dhcmRzKGZpbGUsIGJhY2t3YXJkczogRmxvYXQ6OklORklOSVRZKQorICAgIGFyeSA9IFtdCisKKyAgICBhc2NlbmQud2l0aF9pbmRleCgxKS5lYWNoIGRvIHxwYXRoLCBpbmRleHwKKyAgICAgIGlmIGluZGV4ID4gYmFja3dhcmRzCisgICAgICAgIGJyZWFrCisKKyAgICAgIGVsc2UKKyAgICAgICAgRGlyLmNoZGlyIHBhdGggZG8KKyAgICAgICAgICBpZiBibG9ja19naXZlbj8KKyAgICAgICAgICAgIGZpbGUgPSBzZWxmLmNsYXNzLm5ldyhmaWxlKQorICAgICAgICAgICAgaWYgeWllbGQoZmlsZSkKKyAgICAgICAgICAgICAgYXJ5LnB1c2goCisgICAgICAgICAgICAgICAgZmlsZQorICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbmQKKworICAgICAgICAgIGVsc2lmIEZpbGUuZXhpc3Q/KGZpbGUpCisgICAgICAgICAgICBhcnkucHVzaChzZWxmLmNsYXNzLm5ldygKKyAgICAgICAgICAgICAgcGF0aC5qb2luKGZpbGUpCisgICAgICAgICAgICApKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgYXJ5CisgIGVuZAorCisgICMgLS0KKyAgIyBSZWFkIHRoZSBmaWxlIGFzIGEgWUFNTCBmaWxlIHR1cm5pbmcgaXQgaW50byBhbiBvYmplY3QuCisgICMgQHNlZSBzZWxmLmNsYXNzLmxvYWRfeWFtbCBhcyB0aGlzIGEgZGlyZWN0IGFsaWFzIG9mIHRoYXQgbWV0aG9kLgorICAjIEByZXR1cm4gSGFzaAorICAjIC0tCisgIGRlZiByZWFkX3lhbWwodGhyb3dfbWlzc2luZzogZmFsc2UsICoqa3dkKQorICAgIHNlbGYuY2xhc3MubG9hZF95YW1sKAorICAgICAgcmVhZCwgKiprd2QKKyAgICApCisKKyAgcmVzY3VlIEVycm5vOjpFTk9FTlQKKyAgICB0aHJvd19taXNzaW5nID8gcmFpc2UgOiAoCisgICAgICByZXR1cm4ge30KKyAgICApCisgIGVuZAorCisgICMgLS0KKyAgIyBSZWFkIHRoZSBmaWxlIGFzIGEgSlNPTiBmaWxlIHR1cm5pbmcgaXQgaW50byBhbiBvYmplY3QuCisgICMgQHNlZSBzZWxmLmNsYXNzLnJlYWRfanNvbiBhcyB0aGlzIGlzIGEgZGlyZWN0IGFsaWFzIG9mIHRoYXQgbWV0aG9kLgorICAjIEByZXR1cm4gSGFzaAorICAjIC0tCisgIGRlZiByZWFkX2pzb24odGhyb3dfbWlzc2luZzogZmFsc2UpCisgICAgSlNPTi5wYXJzZSgKKyAgICAgIHJlYWQKKyAgICApCisKKyAgcmVzY3VlIEVycm5vOjpFTk9FTlQKKyAgICB0aHJvd19taXNzaW5nID8gcmFpc2UgOiAoCisgICAgICByZXR1cm4ge30KKyAgICApCisgIGVuZAorCisgICMgLS0KKyAgIyBAbm90ZSBUaGUgYmxhbmsgcGFydCBpcyBpbnRlbnRpb25hbGx5IGxlZnQgdGhlcmUgc28gdGhhdCB5b3UgY2FuIHJlam9pbi4KKyAgIyBTcGxpdHMgdGhlIHBhdGggaW50byBhbGwgcGFydHMgc28gdGhhdCB5b3UgY2FuIGRvIHN0ZXAgYnkgc3RlcCBjb21wYXJpc29ucworICAjIEBleGFtcGxlIFBhdGh1dGlsLm5ldygiL215L3BhdGgiKS5zcGxpdF9wYXRoICMgPT4gWyIiLCAibXkiLCAicGF0aCJdCisgICMgQHJldHVybiBBcnJheTxTdHJpbmc+CisgICMgLS0KKyAgZGVmIHNwbGl0X3BhdGgKKyAgICBAcGF0aC5zcGxpdCgKKyAgICAgICVyIVxcK3wvKyEKKyAgICApCisgIGVuZAorCisgICMgLS0KKyAgIyBAc2VlIGBTdHJpbmcjPT1gIGZvciBtb3JlIGRldGFpbHMuCisgICMgQSBzdHJpY3RlciB2ZXJzaW9uIG9mIGA9PWAgdGhhdCBhbHNvIG1ha2VzIHN1cmUgdGhlIG9iamVjdCBtYXRjaGVzLgorICAjIEByZXR1cm4gdHJ1ZXxmYWxzZQorICAjIC0tCisgIGRlZiA9PT0ob3RoZXIpCisgICAgb3RoZXIuaXNfYT8oc2VsZi5jbGFzcykgJiYgQHBhdGggPT0gb3RoZXIKKyAgZW5kCisKKyAgIyAtLQorICAjIEBleGFtcGxlIFBhdGh1dGlsLm5ldygiL2hlbGxvIikgPj0gUGF0aHV0aWwubmV3KCIvIikgIyA9PiB0cnVlCisgICMgQGV4YW1wbGUgUGF0aHV0aWwubmV3KCIvaGVsbG8iKSA+PSBQYXRodXRpbC5uZXcoIi9oZWxsbyIpICMgPT4gdHJ1ZQorICAjIENoZWNrcyB0byBzZWUgaWYgYSBwYXRoIGZhbGxzIHdpdGhpbiBhIHBhdGggYW5kIGRlZXBlciBvciBpcyB0aGUgb3RoZXIuCisgICMgQHJldHVybiB0cnVlfGZhbHNlCisgICMgLS0KKyAgZGVmID49KG90aGVyKQorICAgIG1pbmUsIG90aGVyID0gZXhwYW5kZWRfcGF0aHMob3RoZXIpCisgICAgcmV0dXJuIHRydWUgaWYgb3RoZXIgPT0gbWluZQorICAgIG1pbmUuaW5fcGF0aD8ob3RoZXIpCisgIGVuZAorCisgICMgLS0KKyAgIyBAZXhhbXBsZSBQYXRodXRpbC5uZXcoIi9oZWxsby93b3JsZCIpID4gUGF0aHV0aWwubmV3KCIvaGVsbG8iKSAjID0+IHRydWUKKyAgIyBTdHJpY3RseSBjaGVja3MgdG8gc2VlIGlmIGEgcGF0aCBpcyBkZWVwZXIgYnV0IHdpdGhpbiB0aGUgcGF0aCBvZiB0aGUgb3RoZXIuCisgICMgQHJldHVybiB0cnVlfGZhbHNlCisgICMgLS0KKyAgZGVmID4ob3RoZXIpCisgICAgbWluZSwgb3RoZXIgPSBleHBhbmRlZF9wYXRocyhvdGhlcikKKyAgICByZXR1cm4gZmFsc2UgaWYgb3RoZXIgPT0gbWluZQorICAgIG1pbmUuaW5fcGF0aD8ob3RoZXIpCisgIGVuZAorCisgICMgLS0KKyAgIyBAZXhhbXBsZSBQYXRodXRpbC5uZXcoIi8iKSA8IFBhdGh1dGlsLm5ldygiL2hlbGxvIikgIyA9PiB0cnVlCisgICMgU3RyaWN0bHkgY2hlY2sgdG8gc2VlIGlmIGEgcGF0aCBpcyBiZWhpbmQgb3RoZXIgcGF0aCBidXQgd2l0aGluIGl0LgorICAjIEByZXR1cm4gdHJ1ZXxmYWxzZQorICAjIC0tCisgIGRlZiA8KG90aGVyKQorICAgIG1pbmUsIG90aGVyID0gZXhwYW5kZWRfcGF0aHMob3RoZXIpCisgICAgcmV0dXJuIGZhbHNlIGlmIG90aGVyID09IG1pbmUKKyAgICBvdGhlci5pbl9wYXRoPyhtaW5lKQorICBlbmQKKworICAjIC0tCisgICMgQ2hlY2sgdG8gc2VlIGlmIGEgcGF0aCBpcyBiZWhpbmQgdGhlIG90aGVyIHBhdGggYnV0IHdpdGhpbiBpdC4KKyAgIyBAZXhhbXBsZSBQYXRodXRpbC5uZXcoIi9oZWxsbyIpIDwgUGF0aHV0aWwubmV3KCIvaGVsbG8iKSAjID0+IHRydWUKKyAgIyBAZXhhbXBsZSBQYXRodXRpbC5uZXcoIi8iKSA8IFBhdGh1dGlsLm5ldygiL2hlbGxvIikgIyA9PiB0cnVlCisgICMgQHJldHVybiB0cnVlfGZhbHNlCisgICMgLS0KKyAgZGVmIDw9KG90aGVyKQorICAgIG1pbmUsIG90aGVyID0gZXhwYW5kZWRfcGF0aHMob3RoZXIpCisgICAgcmV0dXJuIHRydWUgaWYgb3RoZXIgPT0gbWluZQorICAgIG90aGVyLmluX3BhdGg/KG1pbmUpCisgIGVuZAorCisgICMgLS0KKyAgIyBAbm90ZSAiLi8iIGlzIGNvbnNpZGVyZWQgcmVsYXRpdmUuCisgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLCBhcyBpbjogc3RhcnRzIHdpdGggIi8iCisgICMgQHJldHVybiB0cnVlfGZhbHNlCisgICMgLS0KKyAgZGVmIGFic29sdXRlPworICAgIHJldHVybiAhISgKKyAgICAgIEBwYXRoID1+ICVyIVxBKD86W0EtWmEtel06KT8oPzpcXCt8LyspIQorICAgICkKKyAgZW5kCisKKyAgIyAtLQorICAjIEB5aWVsZCBQYXRodXRpbAorICAjIEJyZWFrIGFwYXJ0IHRoZSBwYXRoIGFuZCB5aWVsZCBlYWNoIHdpdGggdGhlIHByZXZpb3VzIHBhcnRzLgorICAjIEBleGFtcGxlIFBhdGh1dGlsLm5ldygiL2hlbGxvL3dvcmxkIikuYXNjZW5kLnRvX2EgIyA9PiBbIi8iLCAiL2hlbGxvIiwgIi9oZWxsby93b3JsZCJdCisgICMgQGV4YW1wbGUgUGF0aHV0aWwubmV3KCIvaGVsbG8vd29ybGQiKS5hc2NlbmQgeyB8cGF0aHwgJHN0ZG91dC5wdXRzIHBhdGggfQorICAjIEByZXR1cm4gRW51bQorICAjIC0tCisgIGRlZiBhc2NlbmQKKyAgICB1bmxlc3MgYmxvY2tfZ2l2ZW4/CisgICAgICByZXR1cm4gdG9fZW51bSgKKyAgICAgICAgX19tZXRob2RfXworICAgICAgKQorICAgIGVuZAorCisgICAgeWllbGQoCisgICAgICBwYXRoID0gc2VsZgorICAgICkKKworICAgIHdoaWxlIChuZXdfcGF0aCA9IHBhdGguZGlybmFtZSkKKyAgICAgIGlmIHBhdGggPT0gbmV3X3BhdGggfHwgbmV3X3BhdGggPT0gIi4iCisgICAgICAgIGJyZWFrCisgICAgICBlbHNlCisgICAgICAgIHBhdGggPSBuZXdfcGF0aAorICAgICAgICB5aWVsZCAgbmV3X3BhdGgKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgbmlsCisgIGVuZAorCisgICMgLS0KKyAgIyBAeWllbGQgUGF0aHV0aWwKKyAgIyBCcmVhayBhcGFydCB0aGUgcGF0aCBpbiByZXZlcnNlIG9yZGVyIGFuZCBkZXNjZW5kIGludG8gdGhlIHBhdGguCisgICMgQGV4YW1wbGUgUGF0aHV0aWwubmV3KCIvaGVsbG8vd29ybGQiKS5kZXNjZW5kLnRvX2EgIyA9PiBbIi9oZWxsby93b3JsZCIsICIvaGVsbG8iLCAiLyJdCisgICMgQGV4YW1wbGUgUGF0aHV0aWwubmV3KCIvaGVsbG8vd29ybGQiKS5kZXNjZW5kIHsgfHBhdGh8ICRzdGRvdXQucHV0cyBwYXRoIH0KKyAgIyBAcmV0dXJuIEVudW0KKyAgIyAtLQorICBkZWYgZGVzY2VuZAorICAgIHVubGVzcyBibG9ja19naXZlbj8KKyAgICAgIHJldHVybiB0b19lbnVtKAorICAgICAgICBfX21ldGhvZF9fCisgICAgICApCisgICAgZW5kCisKKyAgICBhc2NlbmQudG9fYS5yZXZlcnNlX2VhY2ggZG8gfHZhbHwKKyAgICAgIHlpZWxkIHZhbAorICAgIGVuZAorCisgICAgbmlsCisgIGVuZAorCisgICMgLS0KKyAgIyBAeWllbGQgUGF0aHV0aWwKKyAgIyBAZXhhbXBsZSBQYXRodXRpbC5uZXcoIi9oZWxsby93b3JsZCIpLmVhY2hfbGluZSB7IHxsaW5lfCAkc3Rkb3V0LnB1dHMgbGluZSB9CisgICMgV3JhcHMgYHJlYWRsaW5lc2AgYW5kIGFsbG93cyB5b3UgdG8geWllbGQgb24gdGhlIHJlc3VsdC4KKyAgIyBAcmV0dXJuIEVudW0KKyAgIyAtLQorICBkZWYgZWFjaF9saW5lCisgICAgcmV0dXJuIHRvX2VudW0oX19tZXRob2RfXykgdW5sZXNzIGJsb2NrX2dpdmVuPworICAgIHJlYWRsaW5lcy5lYWNoIGRvIHxsaW5lfAorICAgICAgeWllbGQgbGluZQorICAgIGVuZAorCisgICAgbmlsCisgIGVuZAorCisgICMgLS0KKyAgIyBAZXhhbXBsZSBQYXRodXRpbC5uZXcoIi9oZWxsbyIpLmZubWF0Y2g/KCIvaGVsbG8iKSAjID0+IHRydWUKKyAgIyBVbmxpa2UgdHJhZGl0aW9uYWwgYGZubWF0Y2hgLCB3aXRoIHRoaXMgb25lIGBSZWdleHBgIGlzIGFsbG93ZWQuCisgICMgQGV4YW1wbGUgUGF0aHV0aWwubmV3KCIvaGVsbG8iKS5mbm1hdGNoPygvaC8pICMgPT4gdHJ1ZQorICAjIEBzZWUgYEZpbGUjZm5tYXRjaGAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICMgQHJldHVybiB0cnVlfGZhbHNlCisgICMgLS0KKyAgZGVmIGZubWF0Y2g/KG1hdGNoZXIpCisgICAgbWF0Y2hlci5pc19hPyhSZWdleHApID8gISEoc2VsZiA9fiBtYXRjaGVyKSA6IFwKKyAgICAgIEZpbGUuZm5tYXRjaChtYXRjaGVyLCBzZWxmKQorICBlbmQKKworICAjIC0tCisgICMgQWxsb3dzIHlvdSB0byBxdWlja2x5IGRldGVybWluZSBpZiB0aGUgZmlsZSBpcyB0aGUgcm9vdCBmb2xkZXIuCisgICMgQHJldHVybiB0cnVlfGZhbHNlCisgICMgLS0KKyAgZGVmIHJvb3Q/CisgICAgISEoc2VsZiA9fiAlciFcQSg/OltBLVphLXpdOik/KD86XFwrfC8rKVx6ISkKKyAgZW5kCisKKyAgIyAtLQorICAjIEFsbG93cyB5b3UgdG8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcGF0aCBpcyBpbiB0aGUgcGF0aCB5b3Ugd2FudC4KKyAgIyBAcmV0dXJuIHRydWV8ZmFsc2UKKyAgIyAtLQorICBkZWYgaW5fcGF0aD8ocGF0aCkKKyAgICBwYXRoID0gc2VsZi5jbGFzcy5uZXcocGF0aCkuZXhwYW5kX3BhdGguc3BsaXRfcGF0aAorICAgIG1pbmUgPSAoc3ltbGluaz8/IGV4cGFuZF9wYXRoLnJlYWxwYXRoIDogZXhwYW5kX3BhdGgpLnNwbGl0X3BhdGgKKyAgICBwYXRoLmVhY2hfd2l0aF9pbmRleCB7IHxwYXJ0LCBpbmRleHwgcmV0dXJuIGZhbHNlIGlmIG1pbmVbaW5kZXhdICE9IHBhcnQgfQorICAgIHRydWUKKyAgZW5kCisKKyAgIyAtLQorCisgIGRlZiBpbnNwZWN0CisgICAgIiM8I3tzZWxmLmNsYXNzfToje0BwYXRofT4iCisgIGVuZAorCisgICMgLS0KKyAgIyBAcmV0dXJuIEFycmF5PFBhdGh1dGlsPgorICAjIEdyYWIgYWxsIG9mIHRoZSBjaGlsZHJlbiBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgaW5jbHVkaW5nIGhpZGRlbi4KKyAgIyBAeWllbGQgUGF0aHV0aWwKKyAgIyAtLQorICBkZWYgY2hpbGRyZW4KKyAgICBhcnkgPSBbXQorCisgICAgRGlyLmZvcmVhY2goQHBhdGgpIGRvIHxwYXRofAorICAgICAgaWYgcGF0aCA9PSAiLiIgfHwgcGF0aCA9PSAiLi4iCisgICAgICAgIG5leHQKKyAgICAgIGVsc2UKKyAgICAgICAgcGF0aCA9IHNlbGYuY2xhc3MubmV3KEZpbGUuam9pbihAcGF0aCwgcGF0aCkpCisgICAgICAgIHlpZWxkIHBhdGggaWYgYmxvY2tfZ2l2ZW4/CisgICAgICAgIGFyeS5wdXNoKAorICAgICAgICAgIHBhdGgKKyAgICAgICAgKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBhcnkKKyAgZW5kCisKKyAgIyAtLQorICAjIEB5aWVsZCBQYXRodXRpbAorICAjIEFsbG93cyB5b3UgdG8gZ2xvYiBob3dldmVyIHlvdSB3aXNoIHRvIGdsb2IgaW4gdGhlIGN1cnJlbnQgYFBhdGh1dGlsYAorICAjIEBzZWUgYEZpbGU6OkNvbnN0YW50c2AgZm9yIGEgbGlzdCBvZiBmbGFncy4KKyAgIyBAcmV0dXJuIEVudW0KKyAgIyAtLQorICBkZWYgZ2xvYihwYXR0ZXJuLCBmbGFncyA9IDApCisgICAgdW5sZXNzIGJsb2NrX2dpdmVuPworICAgICAgcmV0dXJuIHRvX2VudW0oCisgICAgICAgIF9fbWV0aG9kX18sIHBhdHRlcm4sIGZsYWdzCisgICAgICApCisgICAgZW5kCisKKyAgICBjaGRpciBkbworICAgICAgRGlyLmdsb2IocGF0dGVybiwgZmxhZ3MpLmVhY2ggZG8gfGZpbGV8CisgICAgICAgIHlpZWxkIHNlbGYuY2xhc3MubmV3KAorICAgICAgICAgIEZpbGUuam9pbihAcGF0aCwgZmlsZSkKKyAgICAgICAgKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBuaWwKKyAgZW5kCisKKyAgIyAtLQorICAjIEB5aWVsZCAmYmxvY2sKKyAgIyBNb3ZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0ZW1wb3JhcmlseSAob3IgZm9yIGdvb2QpIGFuZCBkbyB3b3JrIHNvbi4KKyAgIyBAbm90ZSB5b3UgZG8gbm90IG5lZWQgdG8gc2hpcCBhIGJsb2NrIGF0IGFsbC4KKyAgIyBAcmV0dXJuIG5pbAorICAjIC0tCisgIGRlZiBjaGRpcgorICAgIGlmICFibG9ja19naXZlbj8KKyAgICAgIERpci5jaGRpcigKKyAgICAgICAgQHBhdGgKKyAgICAgICkKKworICAgIGVsc2UKKyAgICAgIERpci5jaGRpciBAcGF0aCBkbworICAgICAgICB5aWVsZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgICMgLS0KKyAgIyBAeWllbGQgUGF0aHV0aWwKKyAgIyBGaW5kIGFsbCBmaWxlcyB3aXRob3V0IGNhcmUgYW5kIHlpZWxkIHRoZSBnaXZlbiBibG9jay4KKyAgIyBAcmV0dXJuIEVudW0KKyAgIyAtLQorICBkZWYgZmluZAorICAgIHJldHVybiB0b19lbnVtKF9fbWV0aG9kX18pIHVubGVzcyBibG9ja19naXZlbj8KKyAgICBGaW5kLmZpbmQgQHBhdGggZG8gfHZhbHwKKyAgICAgIHlpZWxkIHNlbGYuY2xhc3MubmV3KHZhbCkKKyAgICBlbmQKKyAgZW5kCisKKyAgIyAtLQorICAjIEB5aWVsZCBQYXRodXRpbAorICAjIFNwbGl0cyB0aGUgcGF0aCByZXR1cm5pbmcgZWFjaCBwYXJ0IChmaWxlbmFtZSkgYmFjayB0byB5b3UuCisgICMgQHJldHVybiBFbnVtCisgICMgLS0KKyAgZGVmIGVhY2hfZmlsZW5hbWUKKyAgICByZXR1cm4gdG9fZW51bShfX21ldGhvZF9fKSB1bmxlc3MgYmxvY2tfZ2l2ZW4/CisgICAgQHBhdGguc3BsaXQoRmlsZTo6U0VQQVJBVE9SKS5kZWxldGVfaWYoJjplbXB0eT8pLmVhY2ggZG8gfGZpbGV8CisgICAgICB5aWVsZCBmaWxlCisgICAgZW5kCisgIGVuZAorCisgICMgLS0KKyAgIyBHZXQgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBwYXRoLgorICAjIEBub3RlIFRoaXMgd2lsbCBzaW1wbHkgcmV0dXJuIHNlbGYgaWYgIi8iLgorICAjIEByZXR1cm4gUGF0aHV0aWwKKyAgIyAtLQorICBkZWYgcGFyZW50CisgICAgcmV0dXJuIHNlbGYgaWYgQHBhdGggPT0gIi8iCisgICAgc2VsZi5jbGFzcy5uZXcoYWJzb2x1dGU/PyBGaWxlLmRpcm5hbWUoQHBhdGgpIDogRmlsZS5qb2luKAorICAgICAgQHBhdGgsICIuLiIKKyAgICApKQorICBlbmQKKworICAjIC0tCisgICMgQHlpZWxkIFBhdGh1dGlsCisgICMgU3BsaXQgdGhlIGZpbGUgaW50byBpdHMgZGlybmFtZSBhbmQgYmFzZW5hbWUsIHNvIHlvdSBjYW4gZG8gc3R1ZmYuCisgICMgQHJldHVybiBuaWwKKyAgIyAtLQorICBkZWYgc3BsaXQKKyAgICBGaWxlLnNwbGl0KEBwYXRoKS5jb2xsZWN0ISBkbyB8cGF0aHwKKyAgICAgIHNlbGYuY2xhc3MubmV3KHBhdGgpCisgICAgZW5kCisgIGVuZAorCisgICMgLS0KKyAgIyBAbm90ZSBZb3VyIGV4dGVuc2lvbiBzaG91bGQgc3RhcnQgd2l0aCAiLiIKKyAgIyBSZXBsYWNlIGEgZmlsZXMgZXh0ZW5zaW9uIHdpdGggeW91ciBnaXZlbiBleHRlbnNpb24uCisgICMgQHJldHVybiBQYXRodXRpbAorICAjIC0tCisgIGRlZiBzdWJfZXh0KGV4dCkKKyAgICBzZWxmLmNsYXNzLm5ldyhAcGF0aC5jaG9tcChGaWxlLmV4dG5hbWUoQHBhdGgpKSArIGV4dCkKKyAgZW5kCisKKyAgIyAtLQorICAjIEEgbGVzcyBjb21wbGV4IHZlcnNpb24gb2YgYHJlbGF0aXZlX3BhdGhfZnJvbWAgdGhhdCBzaW1wbHkgdXNlcyBhCisgICMgYFJlZ2V4cGAgYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKyAgIyBAcmV0dXJuIFBhdGh1dGlsCisgICMgLS0KKyAgZGVmIHJlbGF0aXZlX3BhdGhfZnJvbShmcm9tKQorICAgIGZyb20gPSBzZWxmLmNsYXNzLm5ldyhmcm9tKS5leHBhbmRfcGF0aC5nc3ViKCVyIS8kISwgIiIpCisgICAgc2VsZi5jbGFzcy5uZXcoZXhwYW5kX3BhdGguZ3N1YiglciFeI3sKKyAgICAgIGZyb20ucmVnZXhwX2VzY2FwZQorICAgIH0vISwgIiIpKQorICBlbmQKKworICAjIC0tCisgICMgRXhwYW5kcyB0aGUgcGF0aCBhbmQgbGVmdCBqb2lucyB0aGUgcm9vdCB0byB0aGUgcGF0aC4KKyAgIyBAcmV0dXJuIFBhdGh1dGlsCisgICMgLS0KKyAgZGVmIGVuZm9yY2Vfcm9vdChyb290KQorICAgIHJldHVybiBzZWxmIGlmICFyZWxhdGl2ZT8gJiYgaW5fcGF0aD8ocm9vdCkKKyAgICBzZWxmLmNsYXNzLm5ldyhyb290KS5qb2luKAorICAgICAgc2VsZgorICAgICkKKyAgZW5kCisKKyAgIyAtLQorICAjIENvcHkgYSBkaXJlY3RvcnksIGFsbG93aW5nIHN5bWxpbmtzIGlmIHRoZSBsaW5rIGZhbGxzIGluc2lkZSBvZiB0aGUgcm9vdC4KKyAgIyBUaGlzIGlzIGluZGVudGVkIGZvciBwZW9wbGUgd2hvIHdpc2ggc29tZSBzYWZldHkgdG8gdGhlaXIgY29waWVzLgorICAjIEBub3RlIElnbm9yZSBpcyBpZ25vcmVkIG9uIHNhZmVfY29weSBmaWxlIGJlY2F1c2UgaXQncyBleHBsaWNpdC4KKyAgIyBAcmV0dXJuIG5pbAorICAjIC0tCisgIGRlZiBzYWZlX2NvcHkodG8sIHJvb3Q6IG5pbCwgaWdub3JlOiBbXSkKKyAgICByYWlzZSBBcmd1bWVudEVycm9yLCAibXVzdCBnaXZlIGEgcm9vdCIgdW5sZXNzIHJvb3QKKyAgICByb290ID0gc2VsZi5jbGFzcy5uZXcocm9vdCkKKyAgICB0byAgID0gc2VsZi5jbGFzcy5uZXcodG8pCisKKyAgICBpZiBkaXJlY3Rvcnk/CisgICAgICBzYWZlX2NvcHlfZGlyZWN0b3J5KHRvLCB7CisgICAgICAgIDpyb290ID0+IHJvb3QsIDppZ25vcmUgPT4gaWdub3JlCisgICAgICB9KQorCisgICAgZWxzZQorICAgICAgc2FmZV9jb3B5X2ZpbGUodG8sIHsKKyAgICAgICAgOnJvb3QgPT4gcm9vdAorICAgICAgfSkKKyAgICBlbmQKKyAgZW5kCisKKyAgIyAtLQorICAjIEBzZWUgYHNlbGYuY2xhc3Mubm9ybWFsaXplYCBhcyB0aGlzIGlzIGFuIGFsaWFzLgorICAjIC0tCisgIGRlZiBub3JtYWxpemUKKyAgICByZXR1cm4gQG5vcm1hbGl6ZSB8fD0gYmVnaW4KKyAgICAgIHNlbGYuY2xhc3Mubm9ybWFsaXplCisgICAgZW5kCisgIGVuZAorCisgICMgLS0KKyAgIyBAc2VlIGBzZWxmLmNsYXNzLmVuY29kaW5nYCBhcyB0aGlzIGlzIGFuIGFsaWFzLgorICAjIC0tCisgIGRlZiBlbmNvZGluZworICAgIHJldHVybiBAZW5jb2RpbmcgfHw9IGJlZ2luCisgICAgICBzZWxmLmNsYXNzLmVuY29kaW5nCisgICAgZW5kCisgIGVuZAorCisgICMgLS0KKyAgIyBAbm90ZSBZb3UgY2FuIHNldCB0aGUgZGVmYXVsdCBlbmNvZGluZ3MgdmlhIHRoZSBjbGFzcy4KKyAgIyBSZWFkIHRvb2sgdHdvIHN0ZXJvaWQgc2hvdHM6IGl0IGNhbiBub3JtYWxpemUgeW91ciBzdHJpbmcsIGFuZCBlbmNvZGUuCisgICMgQHJldHVybiBTdHJpbmcKKyAgIyAtLQorICBkZWYgcmVhZCgqYXJncywgKiprd2QpCisgICAga3dkWzplbmNvZGluZ10gfHw9IGVuY29kaW5nCisKKyAgICBpZiBub3JtYWxpemVbOnJlYWRdCisgICAgICBGaWxlLnJlYWQoc2VsZiwgKmFyZ3MsIGt3ZCkuZW5jb2RlKHsKKyAgICAgICAgOnVuaXZlcnNhbF9uZXdsaW5lID0+IHRydWUKKyAgICAgIH0pCisKKyAgICBlbHNlCisgICAgICBGaWxlLnJlYWQoCisgICAgICAgIHNlbGYsICphcmdzLCBrd2QKKyAgICAgICkKKyAgICBlbmQKKyAgZW5kCisKKyAgIyAtLQorICAjIEBub3RlIFlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IGVuY29kaW5ncyB2aWEgdGhlIGNsYXNzLgorICAjIEJpbnJlYWQgdG9vayB0d28gc3Rlcm9pZCBzaG90czogaXQgY2FuIG5vcm1hbGl6ZSB5b3VyIHN0cmluZywgYW5kIGVuY29kZS4KKyAgIyBAcmV0dXJuIFN0cmluZworICAjIC0tCisgIGRlZiBiaW5yZWFkKCphcmdzLCAqKmt3ZCkKKyAgICBrd2RbOmVuY29kaW5nXSB8fD0gZW5jb2RpbmcKKworICAgIGlmIG5vcm1hbGl6ZVs6cmVhZF0KKyAgICAgIEZpbGUuYmlucmVhZChzZWxmLCAqYXJncywga3dkKS5lbmNvZGUoeworICAgICAgICA6dW5pdmVyc2FsX25ld2xpbmUgPT4gdHJ1ZQorICAgICAgfSkKKworICAgIGVsc2UKKyAgICAgIEZpbGUucmVhZCgKKyAgICAgICAgc2VsZiwgKmFyZ3MsIGt3ZAorICAgICAgKQorICAgIGVuZAorICBlbmQKKworICAjIC0tCisgICMgQG5vdGUgWW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgZW5jb2RpbmdzIHZpYSB0aGUgY2xhc3MuCisgICMgUmVhZGxpbmVzIHRvb2sgdHdvIHN0ZXJvaWQgc2hvdHM6IGl0IGNhbiBub3JtYWxpemUgeW91ciBzdHJpbmcsIGFuZCBlbmNvZGUuCisgICMgQHJldHVybiBBcnJheTxTdHJpbmc+CisgICMgLS0KKyAgZGVmIHJlYWRsaW5lcygqYXJncywgKiprd2QpCisgICAga3dkWzplbmNvZGluZ10gfHw9IGVuY29kaW5nCisKKyAgICBpZiBub3JtYWxpemVbOnJlYWRdCisgICAgICBGaWxlLnJlYWRsaW5lcyhzZWxmLCAqYXJncywga3dkKS5lbmNvZGUoeworICAgICAgICA6dW5pdmVyc2FsX25ld2xpbmUgPT4gdHJ1ZQorICAgICAgfSkKKworICAgIGVsc2UKKyAgICAgIEZpbGUucmVhZGxpbmVzKAorICAgICAgICBzZWxmLCAqYXJncywga3dkCisgICAgICApCisgICAgZW5kCisgIGVuZAorCisgICMgLS0KKyAgIyBAbm90ZSBZb3UgY2FuIHNldCB0aGUgZGVmYXVsdCBlbmNvZGluZ3MgdmlhIHRoZSBjbGFzcy4KKyAgIyBXcml0ZSB0b29rIHR3byBzdGVyb2lkIHNob3RzOiBpdCBjYW4gbm9ybWFsaXplIHlvdXIgc3RyaW5nLCBhbmQgZW5jb2RlLgorICAjIEByZXR1cm4gRml4bnVtPEJ5dGVzPgorICAjIC0tCisgIGRlZiB3cml0ZShkYXRhLCAqYXJncywgKiprd2QpCisgICAga3dkWzplbmNvZGluZ10gfHw9IGVuY29kaW5nCisKKyAgICBpZiBub3JtYWxpemVbOndyaXRlXQorICAgICAgRmlsZS53cml0ZShzZWxmLCBkYXRhLmVuY29kZSgKKyAgICAgICAgOmNybGZfbmV3bGluZSA9PiB0cnVlCisgICAgICApLCAqYXJncywga3dkKQorCisgICAgZWxzZQorICAgICAgRmlsZS53cml0ZSgKKyAgICAgICAgc2VsZiwgZGF0YSwgKmFyZ3MsIGt3ZAorICAgICAgKQorICAgIGVuZAorICBlbmQKKworICAjIC0tCisgICMgQG5vdGUgWW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgZW5jb2RpbmdzIHZpYSB0aGUgY2xhc3MuCisgICMgQmlud3JpdGUgdG9vayB0d28gc3Rlcm9pZCBzaG90czogaXQgY2FuIG5vcm1hbGl6ZSB5b3VyIHN0cmluZywgYW5kIGVuY29kZS4KKyAgIyBAcmV0dXJuIEZpeG51bTxCeXRlcz4KKyAgIyAtLQorICBkZWYgYmlud3JpdGUoZGF0YSwgKmFyZ3MsICoqa3dkKQorICAgIGt3ZFs6ZW5jb2RpbmddIHx8PSBlbmNvZGluZworCisgICAgaWYgbm9ybWFsaXplWzp3cml0ZV0KKyAgICAgIEZpbGUuYmlud3JpdGUoc2VsZiwgZGF0YS5lbmNvZGUoCisgICAgICAgIDpjcmxmX25ld2xpbmUgPT4gdHJ1ZQorICAgICAgKSwgKmFyZ3MsIGt3ZCkKKworICAgIGVsc2UKKyAgICAgIEZpbGUuYmlud3JpdGUoCisgICAgICAgIHNlbGYsIGRhdGEsICphcmdzLCBrd2QKKyAgICAgICkKKyAgICBlbmQKKyAgZW5kCisKKyAgIyAtLQorCisgIGRlZiB0b19yZWdleHAoZ3VhcmQ6IHRydWUpCisgICAgUmVnZXhwLm5ldygoZ3VhcmQgPyAiXFxBIiA6ICIiKSArIFJlZ2V4cC5lc2NhcGUoCisgICAgICBzZWxmCisgICAgKSkKKyAgZW5kCisKKyAgIyAtLQorICAjIFN0cmlwcyB0aGUgd2luZG93cyBkcml2ZSBmcm9tIHRoZSBwYXRoLgorICAjIC0tCisKKyAgZGVmIHN0cmlwX3dpbmRvd3NfZHJpdmUocGF0aCA9IEBwYXRoKQorICAgIHNlbGYuY2xhc3MubmV3KHBhdGguZ3N1YigKKyAgICAgICVyIVxBW0EtWmEtel06KD86XFwrfC8rKSEsICIiCisgICAgKSkKKyAgZW5kCisKKyAgIyAtLQorICAjIHJ1Ym9jb3A6ZGlzYWJsZSBNZXRyaWNzL0FiY1NpemUKKyAgIyBydWJvY29wOmRpc2FibGUgTWV0cmljcy9DeWNsb21hdGljQ29tcGxleGl0eQorICAjIHJ1Ym9jb3A6ZGlzYWJsZSBNZXRyaWNzL1BlcmNlaXZlZENvbXBsZXhpdHkKKyAgIyAtLQorCisgIGRlZiBhZ2dyZXNzaXZlX2NsZWFucGF0aAorICAgIHJldHVybiBzZWxmLmNsYXNzLm5ldygiLyIpIGlmIHJvb3Q/CisKKyAgICBfb3V0ID0gc3BsaXRfcGF0aC5lYWNoX3dpdGhfb2JqZWN0KFtdKSBkbyB8cGFydCwgb3V0fAorICAgICAgbmV4dCBpZiBwYXJ0ID09ICIuIiB8fCAocGFydCA9PSAiLi4iICYmIG91dC5sYXN0ID09ICIiKQorICAgICAgaWYgcGFydCA9PSAiLi4iICYmIG91dC5sYXN0ICYmIG91dC5sYXN0ICE9ICIuLiIKKyAgICAgICAgb3V0LnBvcAorCisgICAgICBlbHNlCisgICAgICAgIG91dC5wdXNoKAorICAgICAgICAgIHBhcnQKKyAgICAgICAgKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIC0tCisKKyAgICByZXR1cm4gc2VsZi5jbGFzcy5uZXcoIi8iKSBpZiBfb3V0ID09IFsiIl0uZnJlZXplCisgICAgcmV0dXJuIHNlbGYuY2xhc3MubmV3KCIuIikgaWYgX291dC5lbXB0eT8gJiYgKGVuZF93aXRoPygiLiIpIHx8IHJlbGF0aXZlPykKKyAgICBzZWxmLmNsYXNzLm5ldyhfb3V0LmpvaW4oIi8iKSkKKyAgZW5kCisKKyAgIyAtLQorCisgIGRlZiBjb25zZXJ2YXRpdmVfY2xlYW5wYXRoCisgICAgX291dCA9IHNwbGl0X3BhdGguZWFjaF93aXRoX29iamVjdChbXSkgZG8gfHBhcnQsIG91dHwKKyAgICAgIG5leHQgaWYgcGFydCA9PSAiLiIgfHwgKHBhcnQgPT0gIi4uIiAmJiBvdXQubGFzdCA9PSAiIikKKyAgICAgIG91dC5wdXNoKAorICAgICAgICBwYXJ0CisgICAgICApCisgICAgZW5kCisKKyAgICAjIC0tCisKKyAgICBpZiAhX291dC5lbXB0eT8gJiYgYmFzZW5hbWUgPT0gIi4iICYmIF9vdXQubGFzdCAhPSAiIiAmJiBfb3V0Lmxhc3QgIT0gIi4uIgorICAgICAgX291dCA8PCAiLiIKKyAgICBlbmQKKworICAgICMgLS0KKworICAgIHJldHVybiBzZWxmLmNsYXNzLm5ldygiLyIpIGlmIF9vdXQgPT0gWyIiXS5mcmVlemUKKyAgICByZXR1cm4gc2VsZi5jbGFzcy5uZXcoIi4iKSBpZiBfb3V0LmVtcHR5PyAmJiAoZW5kX3dpdGg/KCIuIikgfHwgcmVsYXRpdmU/KQorICAgIHJldHVybiBzZWxmLmNsYXNzLm5ldyhfb3V0LmpvaW4oIi8iKSkuam9pbigiIikgaWYgQHBhdGggPX4gJXIhL1x6ISBcCisgICAgICAmJiBfb3V0Lmxhc3QgIT0gIi4iICYmIF9vdXQubGFzdCAhPSAiLi4iCisgICAgc2VsZi5jbGFzcy5uZXcoX291dC5qb2luKCIvIikpCisgIGVuZAorCisgICMgLS0KKyAgIyBydWJvY29wOmVuYWJsZSBNZXRyaWNzL0FiY1NpemUKKyAgIyBydWJvY29wOmVuYWJsZSBNZXRyaWNzL0N5Y2xvbWF0aWNDb21wbGV4aXR5CisgICMgcnVib2NvcDplbmFibGUgTWV0cmljcy9QZXJjZWl2ZWRDb21wbGV4aXR5CisgICMgRXhwYW5kIHRoZSBwYXRocyBhbmQgcmV0dXJuLgorICAjIC0tCisgIHByaXZhdGUKKyAgZGVmIGV4cGFuZGVkX3BhdGhzKHBhdGgpCisgICAgcmV0dXJuIGV4cGFuZF9wYXRoLCBzZWxmLmNsYXNzLm5ldyhwYXRoKS5leHBhbmRfcGF0aAorICBlbmQKKworICAjIC0tCisgICMgU2FmZWx5IGNvcHkgYSBmaWxlLgorICAjIC0tCisgIHByaXZhdGUKKyAgZGVmIHNhZmVfY29weV9maWxlKHRvLCByb290OiBuaWwpCisgICAgcmFpc2UgRXJybm86OkVQRVJNLCAiI3tzZWxmfSBub3QgaW4gI3tyb290fSIgdW5sZXNzIGluX3BhdGg/KHJvb3QpCisgICAgRmlsZVV0aWxzLmNwKHNlbGYsIHRvLCB7CisgICAgICA6cHJlc2VydmUgPT4gdHJ1ZQorICAgIH0pCisgIGVuZAorCisgICMgLS0KKyAgIyBTYWZlbHkgY29weSBhIGRpcmVjdG9yeSBhbmQgaXQncyBzdWItZmlsZXMuCisgICMgLS0KKyAgcHJpdmF0ZQorICBkZWYgc2FmZV9jb3B5X2RpcmVjdG9yeSh0bywgcm9vdDogbmlsLCBpZ25vcmU6IFtdKQorICAgIGlnbm9yZSA9IFtpZ25vcmVdLmZsYXR0ZW4udW5pcQorCisgICAgaWYgIWluX3BhdGg/KHJvb3QpCisgICAgICByYWlzZSBFcnJubzo6RVBFUk0sICIje3NlbGZ9IG5vdCBpbiAjeworICAgICAgICByb290CisgICAgICB9IgorCisgICAgZWxzZQorICAgICAgdG8ubWtkaXJfcCB1bmxlc3MgdG8uZXhpc3Q/CisgICAgICBjaGlsZHJlbiBkbyB8ZmlsZXwKKyAgICAgICAgdW5sZXNzIGlnbm9yZS5hbnk/IHsgfHBhdGh8IGZpbGUuaW5fcGF0aD8ocGF0aCkgfQorICAgICAgICAgIGlmICFmaWxlLmluX3BhdGg/KHJvb3QpCisgICAgICAgICAgICByYWlzZSBFcnJubzo6RVBFUk0sICIje2ZpbGV9IG5vdCBpbiAjeworICAgICAgICAgICAgICByb290CisgICAgICAgICAgICB9IgorCisgICAgICAgICAgZWxzaWYgZmlsZS5maWxlPworICAgICAgICAgICAgRmlsZVV0aWxzLmNwKGZpbGUsIHRvLCB7CisgICAgICAgICAgICAgIDpwcmVzZXJ2ZSA9PiB0cnVlCisgICAgICAgICAgICB9KQorCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcGF0aCA9IGZpbGUucmVhbHBhdGgKKyAgICAgICAgICAgIHBhdGguc2FmZV9jb3B5KHRvLmpvaW4oZmlsZS5iYXNlbmFtZSksIHsKKyAgICAgICAgICAgICAgOnJvb3QgPT4gcm9vdCwgOmlnbm9yZSA9PiBpZ25vcmUKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGNsYXNzIDw8IHNlbGYKKyAgICBhdHRyX3dyaXRlciA6ZW5jb2RpbmcKKworICAgICMgLS0KKyAgICAjIEBub3RlIFdlIGRvIG5vdGhpbmcgc3BlY2lhbCBoZXJlLgorICAgICMgR2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IFJ1Ynkga25vd3MgYWJvdXQuCisgICAgIyBAcmV0dXJuIFBhdGh1dGlsCisgICAgIyAtLQorICAgIGRlZiBwd2QKKyAgICAgIG5ldygKKyAgICAgICAgRGlyLnB3ZAorICAgICAgKQorICAgIGVuZAorCisgICAgYWxpYXMgZ2N3ZCBwd2QKKyAgICBhbGlhcyBjd2QgIHB3ZAorCisgICAgIyAtLQorICAgICMgQG5vdGUgeW91IGFyZSBlbmNvdXJhZ2VkIHRvIG92ZXJyaWRlIHRoaXMgaWYgeW91IG5lZWQgdG8uCisgICAgIyBBbGlhc2VzIHRoZSBkZWZhdWx0IHN5c3RlbSBlbmNvZGluZyB0byB1cyBzbyB0aGF0IHdlIGNhbiBkbyBtb3N0IHJlYWQKKyAgICAjIGFuZCB3cml0ZSBvcGVyYXRpb25zIHdpdGggdGhhdCBlbmNvZGluZywgaW5zdGVhZCBvZiBiZWluZyBjcmF6eS4KKyAgICAjIC0tCisgICAgZGVmIGVuY29kaW5nCisgICAgICByZXR1cm4gQGVuY29kaW5nIHx8PSBiZWdpbgorICAgICAgICBFbmNvZGluZy5kZWZhdWx0X2V4dGVybmFsCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgLS0KKyAgICAjIE5vcm1hbGl6ZSBDUkxGIC0+IExGICAgb24gV2luZG93cyByZWFkcywgdG8gZWFzZSAgeW91ciB0cm91Ymxlcy4KKyAgICAjIE5vcm1hbGl6ZSBMRiAgIC0+IENMUkYgb24gV2luZG93cyB3cml0ZSwgdG8gZWFzZSAgeW91ciB0cm91Ymxlcy4KKyAgICAjIC0tCisgICAgZGVmIG5vcm1hbGl6ZQorICAgICAgcmV0dXJuIEBub3JtYWxpemUgfHw9IHsKKyAgICAgICAgOnJlYWQgID0+IEdlbS53aW5fcGxhdGZvcm0/LAorICAgICAgICA6d3JpdGUgPT4gR2VtLndpbl9wbGF0Zm9ybT8KKyAgICAgIH0KKyAgICBlbmQKKworICAgICMgLS0KKyAgICAjIE1ha2UgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LgorICAgICMgQG5vdGUgaWYgeW91IGFkcnVwdGx5IGV4aXQgaXQgd2lsbCBub3QgcmVtb3ZlIHRoZSBkaXIuCisgICAgIyBAbm90ZSB0aGlzIGRpcmVjdG9yeSBpcyByZW1vdmVkIG9uIGV4aXQuCisgICAgIyBAcmV0dXJuIFBhdGh1dGlsCisgICAgIyAtLQorICAgIGRlZiB0bXBkaXIoKmFyZ3MpCisgICAgICBydG4gPSBuZXcobWFrZV90bXBuYW1lKCphcmdzKSkudGFwKCY6bWtkaXIpCisgICAgICBPYmplY3RTcGFjZS5kZWZpbmVfZmluYWxpemVyKHJ0biwgcHJvYyBkbworICAgICAgICBydG4ucm1fcmYKKyAgICAgIGVuZCkKKworICAgICAgcnRuCisgICAgZW5kCisKKyAgICAjIC0tCisgICAgIyBNYWtlIGEgdGVtcG9yYXJ5IGZpbGUuCisgICAgIyBAbm90ZSBpZiB5b3UgYWRydXB0bHkgZXhpdCBpdCB3aWxsIG5vdCByZW1vdmUgdGhlIGRpci4KKyAgICAjIEBub3RlIHRoaXMgZmlsZSBpcyByZW1vdmVkIG9uIGV4aXQuCisgICAgIyBAcmV0dXJuIFBhdGh1dGlsCisgICAgIyAtLQorICAgIGRlZiB0bXBmaWxlKCphcmdzKQorICAgICAgcnRuID0gbmV3KG1ha2VfdG1wbmFtZSgqYXJncykpLnRhcCgmOnRvdWNoKQorICAgICAgT2JqZWN0U3BhY2UuZGVmaW5lX2ZpbmFsaXplcihydG4sIHByb2MgZG8KKyAgICAgICAgcnRuLnJtX3JmCisgICAgICBlbmQpCisKKyAgICAgIHJ0bgorICAgIGVuZAorICBlbmQKKworICAjIC0tCisKKyAgcmJfZGVsZWdhdGUgOmdjd2QsIDp0byA9PiA6InNlbGYuY2xhc3MiCisgIHJiX2RlbGVnYXRlIDpwd2QsICA6dG8gPT4gOiJzZWxmLmNsYXNzIgorCisgICMgLS0KKworICByYl9kZWxlZ2F0ZSA6c3ViLCAgICAgICAgIDp0byA9PiA6QHBhdGgsIDp3cmFwID0+IHRydWUKKyAgcmJfZGVsZWdhdGUgOmNob21wLCAgICAgICA6dG8gPT4gOkBwYXRoLCA6d3JhcCA9PiB0cnVlCisgIHJiX2RlbGVnYXRlIDpnc3ViLCAgICAgICAgOnRvID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6PX4sICAgICAgICAgIDp0byA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOj09LCAgICAgICAgICA6dG8gPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDp0b19zLCAgICAgICAgOnRvID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6ZnJlZXplLCAgICAgIDp0byA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOmVuZF93aXRoPywgICA6dG8gPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpzdGFydF93aXRoPywgOnRvID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6ZnJvemVuPywgICAgIDp0byA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOnRvX3N0ciwgICAgICA6dG8gPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDoiIX4iLCAgICAgICAgOnRvID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6PD0+LCAgICAgICAgIDp0byA9PiA6QHBhdGgKKworICAjIC0tCisKKyAgcmJfZGVsZWdhdGUgOmNobW9kLCAgICAgICAgOnRvID0+IDpGaWxlLCA6YXJncyA9PiB7IDphZnRlciA9PiA6QHBhdGggfQorICByYl9kZWxlZ2F0ZSA6bGNob3duLCAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IHsgOmFmdGVyID0+IDpAcGF0aCB9CisgIHJiX2RlbGVnYXRlIDpsY2htb2QsICAgICAgIDp0byA9PiA6RmlsZSwgOmFyZ3MgPT4geyA6YWZ0ZXIgPT4gOkBwYXRoIH0KKyAgcmJfZGVsZWdhdGUgOmNob3duLCAgICAgICAgOnRvID0+IDpGaWxlLCA6YXJncyA9PiB7IDphZnRlciA9PiA6QHBhdGggfQorICByYl9kZWxlZ2F0ZSA6YmFzZW5hbWUsICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6ZGlybmFtZSwgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6cmVhZGxpbmssICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6ZXhwYW5kX3BhdGgsICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6cmVhbGRpcnBhdGgsICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6cmVhbHBhdGgsICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6cmVuYW1lLCAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6am9pbiwgICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aCwgOndyYXAgPT4gdHJ1ZQorICByYl9kZWxlZ2F0ZSA6c2l6ZSwgICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6bGluaywgICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6YXRpbWUsICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6Y3RpbWUsICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6bHN0YXQsICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6dXRpbWUsICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6c3lzb3BlbiwgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6YmlydGh0aW1lLCAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6bW91bnRwb2ludD8sICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6dHJ1bmNhdGUsICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6c3ltbGluaywgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6ZXh0bmFtZSwgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6emVybz8sICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6ZnR5cGUsICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6bXRpbWUsICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6b3BlbiwgICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6c3RhdCwgICAgICAgICA6dG8gPT4gOkZpbGUsIDphcmdzID0+IDpAcGF0aAorCisgICMgLS0KKworICByYl9kZWxlZ2F0ZSA6cGlwZT8sICAgICAgICAgICAgOnRvID0+IDpGaWxlVGVzdCwgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpmaWxlPywgICAgICAgICAgICA6dG8gPT4gOkZpbGVUZXN0LCA6YXJncyA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOm93bmVkPywgICAgICAgICAgIDp0byA9PiA6RmlsZVRlc3QsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6c2V0Z2lkPywgICAgICAgICAgOnRvID0+IDpGaWxlVGVzdCwgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpzb2NrZXQ/LCAgICAgICAgICA6dG8gPT4gOkZpbGVUZXN0LCA6YXJncyA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOnJlYWRhYmxlPywgICAgICAgIDp0byA9PiA6RmlsZVRlc3QsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6YmxvY2tkZXY/LCAgICAgICAgOnRvID0+IDpGaWxlVGVzdCwgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpkaXJlY3Rvcnk/LCAgICAgICA6dG8gPT4gOkZpbGVUZXN0LCA6YXJncyA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOnJlYWRhYmxlX3JlYWw/LCAgIDp0byA9PiA6RmlsZVRlc3QsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6d29ybGRfcmVhZGFibGU/LCAgOnRvID0+IDpGaWxlVGVzdCwgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpleGVjdXRhYmxlX3JlYWw/LCA6dG8gPT4gOkZpbGVUZXN0LCA6YXJncyA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOndvcmxkX3dyaXRhYmxlPywgIDp0byA9PiA6RmlsZVRlc3QsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6d3JpdGFibGVfcmVhbD8sICAgOnRvID0+IDpGaWxlVGVzdCwgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpleGVjdXRhYmxlPywgICAgICA6dG8gPT4gOkZpbGVUZXN0LCA6YXJncyA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOndyaXRhYmxlPywgICAgICAgIDp0byA9PiA6RmlsZVRlc3QsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6Z3Jwb3duZWQ/LCAgICAgICAgOnRvID0+IDpGaWxlVGVzdCwgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpjaGFyZGV2PywgICAgICAgICA6dG8gPT4gOkZpbGVUZXN0LCA6YXJncyA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOnN5bWxpbms/LCAgICAgICAgIDp0byA9PiA6RmlsZVRlc3QsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6c3RpY2t5PywgICAgICAgICAgOnRvID0+IDpGaWxlVGVzdCwgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpzZXR1aWQ/LCAgICAgICAgICA6dG8gPT4gOkZpbGVUZXN0LCA6YXJncyA9PiA6QHBhdGgKKyAgcmJfZGVsZWdhdGUgOmV4aXN0PywgICAgICAgICAgIDp0byA9PiA6RmlsZVRlc3QsIDphcmdzID0+IDpAcGF0aAorICByYl9kZWxlZ2F0ZSA6c2l6ZT8sICAgICAgICAgICAgOnRvID0+IDpGaWxlVGVzdCwgOmFyZ3MgPT4gOkBwYXRoCisKKyAgIyAtLQorCisgIHJiX2RlbGVnYXRlIDpybV9yZiwgICA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpybV9yLCAgICA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpybV9mLCAgICA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpybSwgICAgICA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpjcF9yLCAgICA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDp0b3VjaCwgICA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpta2Rpcl9wLCA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpta3BhdGgsICA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpjcCwgICAgICA6dG8gPT4gOkZpbGVVdGlscywgOmFyZ3MgPT4gOkBwYXRoCisKKyAgIyAtLQorCisgIHJiX2RlbGVnYXRlIDplYWNoX2NoaWxkLCA6dG8gPT4gOmNoaWxkcmVuCisgIHJiX2RlbGVnYXRlIDplYWNoX2VudHJ5LCA6dG8gPT4gOmNoaWxkcmVuCisgIHJiX2RlbGVnYXRlIDp0b19hLCAgICAgICA6dG8gPT4gOmNoaWxkcmVuCisKKyAgIyAtLQorCisgIHJiX2RlbGVnYXRlIDpvcGVuZGlyLCA6dG8gPT4gOkRpciwgOmFsaWFzX29mID0+IDpvcGVuCisgIHJiX2RlbGVnYXRlIDpyZWxhdGl2ZT8sIDp0byA9PiA6c2VsZiwgOmFsaWFzX29mID0+IDphYnNvbHV0ZT8sIDpib29sID0+IDpyZXZlcnNlCisgIHJiX2RlbGVnYXRlIDpyZWdleHBfZXNjYXBlLCA6dG8gPT4gOlJlZ2V4cCwgOmFyZ3MgPT4gOkBwYXRoLCA6YWxpYXNfb2YgPT4gOmVzY2FwZQorICByYl9kZWxlZ2F0ZSA6c2hlbGxlc2NhcGUsIDp0byA9PiA6U2hlbGx3b3JkcywgOmFyZ3MgPT4gOkBwYXRoCisgIHJiX2RlbGVnYXRlIDpta2RpciwgOnRvID0+IDpEaXIsIDphcmdzID0+IDpAcGF0aAorCisgICMgLS0KKworICBhbGlhcyArIGpvaW4KKyAgYWxpYXMgZGVsZXRlIHJtCisgIGFsaWFzIHJtdHJlZSBybV9yCisgIGFsaWFzIHRvX3BhdGggdG9fcworICBhbGlhcyBsYXN0IGJhc2VuYW1lCisgIGFsaWFzIGVudHJpZXMgY2hpbGRyZW4KKyAgYWxpYXMgbWFrZV9zeW1saW5rIHN5bWxpbmsKKyAgYWxpYXMgY2xlYW5wYXRoX2NvbnNlcnZhdGl2ZSBjb25zZXJ2YXRpdmVfY2xlYW5wYXRoCisgIGFsaWFzIGNsZWFucGF0aF9hZ2dyZXNzaXZlIGFnZ3Jlc3NpdmVfY2xlYW5wYXRoCisgIGFsaWFzIHByZXBlbmQgZW5mb3JjZV9yb290CisgIGFsaWFzIGZubWF0Y2ggZm5tYXRjaD8KKyAgYWxpYXMgbWFrZV9saW5rIGxpbmsKKyAgYWxpYXMgZmlyc3QgZGlybmFtZQorICBhbGlhcyBybWRpciBybV9yCisgIGFsaWFzIHVubGluayBybQorICBhbGlhcyAvIGpvaW4KK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcGF0aHV0aWwtMC4xNC4wL2xpYi9wYXRodXRpbC9oZWxwZXJzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcGF0aHV0aWwtMC4xNC4wL2xpYi9wYXRodXRpbC9oZWxwZXJzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWM4MzUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wYXRodXRpbC0wLjE0LjAvbGliL3BhdGh1dGlsL2hlbHBlcnMucmIKQEAgLTAsMCArMSwxMDggQEAKK2NsYXNzIFBhdGh1dGlsCisgIG1vZHVsZSBIZWxwZXJzCisgICAgZXh0ZW5kIHNlbGYKKworICAgICMgLS0KKworICAgIGRlZiBhbGxvd2VkCisgICAgICByZXR1cm4gQGFsbG93ZWQgfHw9IGJlZ2luCisgICAgICAgIHsKKyAgICAgICAgICA6eWFtbCA9PiB7CisgICAgICAgICAgICA6Y2xhc3NlcyA9PiBbXSwKKyAgICAgICAgICAgIDpzeW1ib2xzID0+IFtdCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgLS0KKyAgICAjIFdyYXBzIGFyb3VuZCBZQU1MIGFuZCBTYWZlWUFNTCB0byBwcm92aWRlIGFsdGVybmF0aXZlcyB0byBSdWJpZXMuCisgICAgIyBAbm90ZSBXZSBkZWZhdWx0IGFsaWFzZXMgdG8geWVzIHNvIHdlIGNhbiBkZXRlY3QgaWYgeW91IGV4cGxpY2l0IHRydWUuCisgICAgIyBAcmV0dXJuIEhhc2gKKyAgICAjIC0tCisgICAgZGVmIGxvYWRfeWFtbChkYXRhLCBzYWZlOiB0cnVlLCB3aGl0ZWxpc3RfY2xhc3NlczogYWxsb3dlZFs6eWFtbF1bOmNsYXNzZXNdLCBcCisgICAgICAgIHdoaXRlbGlzdF9zeW1ib2xzOiBhbGxvd2VkWzp5YW1sXVs6c3ltYm9sc10sIGFsaWFzZXM6IDp5ZXMpCisKKyAgICAgIHJlcXVpcmUgInlhbWwiCisgICAgICB1bmxlc3Mgc2FmZQorICAgICAgICByZXR1cm4gWUFNTC5sb2FkKAorICAgICAgICAgIGRhdGEKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGlmICFZQU1MLnJlc3BvbmRfdG8/KDpzYWZlX2xvYWQpCisgICAgICAgIHNldHVwX3NhZmVfeWFtbCB3aGl0ZWxpc3RfY2xhc3NlcywgYWxpYXNlcworICAgICAgICBTYWZlWUFNTC5sb2FkKAorICAgICAgICAgIGRhdGEKKyAgICAgICAgKQorCisgICAgICBlbHNlCisgICAgICAgIFlBTUwuc2FmZV9sb2FkKAorICAgICAgICAgIGRhdGEsCisgICAgICAgICAgd2hpdGVsaXN0X2NsYXNzZXMsCisgICAgICAgICAgd2hpdGVsaXN0X3N5bWJvbHMsCisgICAgICAgICAgYWxpYXNlcworICAgICAgICApCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgLS0KKyAgICAjIE1ha2UgYSB0ZW1wb3JhcnkgbmFtZSBzdWl0YWJsZSBmb3IgdGVtcG9yYXJ5IGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKyAgICAjIEByZXR1cm4gU3RyaW5nCisgICAgIyAtLQorICAgIGRlZiBtYWtlX3RtcG5hbWUocHJlZml4ID0gIiIsIHN1ZmZpeCA9IG5pbCwgcm9vdCA9IG5pbCkKKyAgICAgIHByZWZpeCA9IHRtcG5hbWVfcHJlZml4KHByZWZpeCkKKyAgICAgIHN1ZmZpeCA9IHRtcG5hbWVfc3VmZml4KHN1ZmZpeCkKKworICAgICAgcm9vdCB8fD0gRGlyOjpUbXBuYW1lLnRtcGRpcgorICAgICAgRmlsZS5qb2luKHJvb3QsIERpcjo6VG1wbmFtZS5tYWtlX3RtcG5hbWUoCisgICAgICAgIHByZWZpeCwgc3VmZml4CisgICAgICApKQorICAgIGVuZAorCisgICAgIyAtLQorCisgICAgcHJpdmF0ZQorICAgIGRlZiB0bXBuYW1lX3N1ZmZpeChzdWZmaXgpCisgICAgICBzdWZmaXggPSBzdWZmaXguam9pbigiLSIpIGlmIHN1ZmZpeC5pc19hPyhBcnJheSkKKyAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5nc3ViKC9cQVwtLywgIiIpIHVubGVzcyAhc3VmZml4IHx8IHN1ZmZpeC5lbXB0eT8KKyAgICAgIHN1ZmZpeAorICAgIGVuZAorCisgICAgIyAtLQorICAgICMgQ2xlYW51cCB0aGUgdGVtcCBuYW1lIHByZWZpeCwgam9pbmluZyBpZiBuZWNlc3NhcnkuCisgICAgIyBydWJvY29wOmRpc2FibGUgU3R5bGUvUGFyYWxsZWxBc3NpZ25tZW50CisgICAgIyAtLQorICAgIHByaXZhdGUKKyAgICBkZWYgdG1wbmFtZV9wcmVmaXgocHJlZml4KQorICAgICAgZXh0LCBwcmVmaXggPSBwcmVmaXgsICIiIGlmICFwcmVmaXguaXNfYT8oQXJyYXkpICYmIHByZWZpeC5zdGFydF93aXRoPygiLiIpCisgICAgICBleHQgPSBwcmVmaXgucG9wIGlmIHByZWZpeC5pc19hPyhBcnJheSkgJiYgcHJlZml4Wy0xXS5zdGFydF93aXRoPygiLiIpCisgICAgICBwcmVmaXggPSBwcmVmaXguam9pbigiLSIpIGlmIHByZWZpeC5pc19hPyhBcnJheSkKKworICAgICAgdW5sZXNzIHByZWZpeC5lbXB0eT8KKyAgICAgICAgcHJlZml4ID0gcHJlZml4LmdzdWIoL1wtXFovLCAiIikgXAorICAgICAgICAgICsgIi0iCisgICAgICBlbmQKKworICAgICAgcmV0dXJuIFsKKyAgICAgICAgcHJlZml4LCBleHQgfHwgIiIKKyAgICAgIF0KKyAgICBlbmQKKworICAgICMgLS0KKyAgICAjIFdyYXAgYXJvdW5kLCBjbGVhbnVwLCBkZXByZWNhdGUgYW5kIHVzZSBTYWZlWUFNTC4KKyAgICAjIHJ1Ym9jb3A6ZW5hYmxlIFN0eWxlL1BhcmFsbGVsQXNzaWdubWVudAorICAgICMgLS0KKyAgICBwcml2YXRlCisgICAgZGVmIHNldHVwX3NhZmVfeWFtbCh3aGl0ZWxpc3RfY2xhc3NlcywgYWxpYXNlcykKKyAgICAgIHdhcm4gIldBUk46IFNhZmVZQU1MIGRvZXMgbm90IHN1cHBvcnQgZGlzYWJsaW5nICBvZiBhbGlhc2VzLiIgaWYgYWxpYXNlcyAmJiBhbGlhc2VzICE9IDp5ZXMKKyAgICAgIHdhcm4gIldBUk46IFNhZmVZQU1MIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIFJ1YnkgMi4wIGdvZXMgRU9MLiIKKyAgICAgIHJlcXVpcmUgInNhZmVfeWFtbC9sb2FkIgorCisgICAgICBTYWZlWUFNTC5yZXN0b3JlX2RlZmF1bHRzIQorICAgICAgd2hpdGVsaXN0X2NsYXNzZXMubWFwKCZTYWZlWUFNTC5tZXRob2QoCisgICAgICAgIDp3aGl0ZWxpc3RfY2xhc3MhCisgICAgICApKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcGF0aHV0aWwtMC4xNC4wL2xpYi9wYXRodXRpbC92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcGF0aHV0aWwtMC4xNC4wL2xpYi9wYXRodXRpbC92ZXJzaW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmY0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wYXRodXRpbC0wLjE0LjAvbGliL3BhdGh1dGlsL3ZlcnNpb24ucmIKQEAgLTAsMCArMSw3IEBACisjIEZyb3plbi1zdHJpbmctbGl0ZXJhbDogdHJ1ZQorIyBDb3B5cmlnaHQ6IDIwMTUtMjAxNiBKb3Jkb24gQmVkd2VsbCAtIE1JVCBMaWNlbnNlCisjIEVuY29kaW5nOiB1dGYtOAorCitjbGFzcyBQYXRodXRpbAorICBWRVJTSU9OID0gIjAuMTQuMCIKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC8uZ2l0aWdub3JlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNWEzMGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorIyBCdW5kbGVyCisuYnVuZGxlCitHZW1maWxlLmxvY2sKK3BrZy8qCisKKyMgUnViaW5pdXMKKyoucmJjCisKKyMgWUFSRAorLnlhcmRvYworeWFyZG9jLwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC8ucnVib2NvcC55bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wLy5ydWJvY29wLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFmMGQzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC8ucnVib2NvcC55bWwKQEAgLTAsMCArMSwzMiBAQAoraW5oZXJpdF9mcm9tOgorICAtIC5ydWJvY29wX2RlZmF1bHRzLnltbAorCitBbGxDb3BzOgorICBFeGNsdWRlOgorICAgICMgRXhjbHVkZSAuZ2Vtc3BlYyBmaWxlcyBiZWNhdXNlIHRoZXkgYXJlIGdlbmVyYWxseSBhdXRvLWdlbmVyYXRlZAorICAgIC0gJyouZ2Vtc3BlYycKKyAgICAjIEV4Y2x1ZGUgdmVuZG9yZWQgZm9sZGVycworICAgIC0gJ3RtcC8qKi8qJworICAgIC0gJ3ZlbmRvci8qKi8qJworICAgICMgRXhjbHVkZSBhcnRpZmFjdHMKKyAgICAtICdwa2cvKiovKicKKyAgICAjIE90aGVyCisgICAgLSAndGVzdC9iZW5jaG1hcmtzLyoqLyonCisgICAgLSAndGVzdC9wcm9maWxlcnMvKiovKicKKworU3R5bGUvQ2xhc3NBbmRNb2R1bGVDaGlsZHJlbjoKKyAgRXhjbHVkZToKKyAgICAtICdzcGVjLyoqLypfc3BlYy5yYicKKyAgICAtICd0ZXN0LyoqLypfdGVzdC5yYicKKworIyBEZWFyIFJ1Ym9jb3AsIEkgZG9uJ3Qgd2FudCB0byB1c2UgU3RyaW5nI3N0cmlwX2hlcmVkb2MKK0xheW91dC9JbmRlbnRIZXJlZG9jOgorICBFbmFibGVkOiBmYWxzZQorCitTdHlsZS9Xb3JkQXJyYXk6CisgIEVuYWJsZWQ6IGZhbHNlCisgIE1pblNpemU6IDMKKworU3R5bGUvU3ltYm9sQXJyYXk6CisgIEVuYWJsZWQ6IGZhbHNlCisgIE1pblNpemU6IDMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvLnJ1Ym9jb3BfZGVmYXVsdHMueW1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC8ucnVib2NvcF9kZWZhdWx0cy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhOGU4MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvLnJ1Ym9jb3BfZGVmYXVsdHMueW1sCkBAIC0wLDAgKzEsMTc0IEBACitBbGxDb3BzOgorICBFeGNsdWRlOgorICAgICMgRXhjbHVkZSAuZ2Vtc3BlYyBmaWxlcyBiZWNhdXNlIHRoZXkgYXJlIGdlbmVyYWxseSBhdXRvLWdlbmVyYXRlZAorICAgIC0gJyouZ2Vtc3BlYycKKyAgICAjIEV4Y2x1ZGUgdmVuZG9yZWQgZm9sZGVycworICAgIC0gJ3RtcC8qKi8qJworICAgIC0gJ3ZlbmRvci8qKi8qJworCisjIFtjb2Rlc21lbGxdCitNZXRyaWNzL0FiY1NpemU6CisgIEVuYWJsZWQ6IGZhbHNlCisgIEV4Y2x1ZGU6CisgICAgLSAnc3BlYy8qKi8qX3NwZWMucmInCisgICAgLSAndGVzdC8qKi8qX3Rlc3QucmInCisKKyMgW2NvZGVzbWVsbF0KK01ldHJpY3MvQmxvY2tMZW5ndGg6CisgIEVuYWJsZWQ6IGZhbHNlCisKKyMgW2NvZGVzbWVsbF0KK01ldHJpY3MvQ3ljbG9tYXRpY0NvbXBsZXhpdHk6CisgIEVuYWJsZWQ6IGZhbHNlCisgIEV4Y2x1ZGU6CisgICAgLSAnc3BlYy8qKi8qX3NwZWMucmInCisgICAgLSAndGVzdC8qKi8qX3Rlc3QucmInCisKKyMgW2NvZGVzbWVsbF0KK01ldHJpY3MvQ2xhc3NMZW5ndGg6CisgIEVuYWJsZWQ6IGZhbHNlCisgIEV4Y2x1ZGU6CisgICAgLSAnc3BlYy8qKi8qX3NwZWMucmInCisgICAgLSAndGVzdC8qKi8qX3Rlc3QucmInCisKKyMgW2NvZGVzbWVsbF0KK01ldHJpY3MvTGluZUxlbmd0aDoKKyAgRW5hYmxlZDogZmFsc2UKKyAgRXhjbHVkZToKKyAgICAtICdzcGVjLyoqLypfc3BlYy5yYicKKyAgICAtICd0ZXN0LyoqLypfdGVzdC5yYicKKyAgTWF4OiAxMDAKKworIyBbY29kZXNtZWxsXQorTWV0cmljcy9NZXRob2RMZW5ndGg6CisgIEVuYWJsZWQ6IGZhbHNlCisgIEV4Y2x1ZGU6CisgICAgLSAnc3BlYy8qKi8qX3NwZWMucmInCisgICAgLSAndGVzdC8qKi8qX3Rlc3QucmInCisgIE1heDogMTAKKworIyBbY29kZXNtZWxsXQorTWV0cmljcy9Nb2R1bGVMZW5ndGg6CisgIEVuYWJsZWQ6IGZhbHNlCisgIEV4Y2x1ZGU6CisgICAgLSAnc3BlYy8qKi8qX3NwZWMucmInCisgICAgLSAndGVzdC8qKi8qX3Rlc3QucmInCisKKyMgW2NvZGVzbWVsbF0KK01ldHJpY3MvUGFyYW1ldGVyTGlzdHM6CisgIEVuYWJsZWQ6IGZhbHNlCisgIE1heDogNQorCisjIFtjb2Rlc21lbGxdCitNZXRyaWNzL1BlcmNlaXZlZENvbXBsZXhpdHk6CisgIEVuYWJsZWQ6IGZhbHNlCisKKyMgW2NvZGVzbWVsbF0KKyMgSSBkb24ndCByZWFsbHkgZ2V0IHRoZSBwb2ludCBvZiB0aGlzIGNvcC4KK1BlcmZvcm1hbmNlL1JlZHVuZGFudE1lcmdlOgorICBFbmFibGVkOiBmYWxzZQorCisjIERvIG5vdCB1c2UgImFuZCIgb3IgIm9yIiBpbiBjb25kaXRpb25hbHMsIGJ1dCBmb3IgcmVhZGFiaWxpdHkgd2UgY2FuIHVzZSBpdAorIyB0byBjaGFpbiBleGVjdXRpb25zLiBKdXN0IGJld2FyZSBvZiBvcGVyYXRvciBvcmRlci4KK1N0eWxlL0FuZE9yOgorICBFbmZvcmNlZFN0eWxlOiBjb25kaXRpb25hbHMKKworU3R5bGUvRG9jdW1lbnRhdGlvbjoKKyAgRXhjbHVkZToKKyAgICAtICdzcGVjLyoqLyonCisgICAgLSAndGVzdC8qKi8qJworCisjIERvdWJsZSBlbXB0eSBsaW5lcyBhcmUgdXNlZnVsIHRvIHNlcGFyYXRlIGNvbmNlcHR1YWxseSBkaWZmZXJlbnQgbWV0aG9kcworIyBpbiB0aGUgc2FtZSBjbGFzcyBvciBtb2R1bGUuCitMYXlvdXQvRW1wdHlMaW5lczoKKyAgRW5hYmxlZDogZmFsc2UKKworIyBJbiBtb3N0IGNhc2VzLCBhIHNwYWNlIGlzIG5pY2UuIFNvbWV0aW1lcywgaXQncyBub3QuCisjIEp1c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSBzdXJyb3VuZGluZyBjb2RlLgorTGF5b3V0L0VtcHR5TGluZXNBcm91bmRDbGFzc0JvZHk6CisgIEVuYWJsZWQ6IGZhbHNlCisKKyMgSW4gbW9zdCBjYXNlcywgYSBzcGFjZSBpcyBuaWNlLiBTb21ldGltZXMsIGl0J3Mgbm90LgorIyBKdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3Vycm91bmRpbmcgY29kZS4KK0xheW91dC9FbXB0eUxpbmVzQXJvdW5kTW9kdWxlQm9keToKKyAgRW5hYmxlZDogZmFsc2UKKworIyBUaGlzIGlzIHF1aXRlIGJ1Z2d5LCBhcyBpdCBkb2Vzbid0IHJlY29nbml6ZSBkb3VibGUgbGluZXMuCisjIERvdWJsZSBlbXB0eSBsaW5lcyBhcmUgdXNlZnVsIHRvIHNlcGFyYXRlIGNvbmNlcHR1YWxseSBkaWZmZXJlbnQgbWV0aG9kcworIyBpbiB0aGUgc2FtZSBjbGFzcyBvciBtb2R1bGUuCitMYXlvdXQvRW1wdHlMaW5lQmV0d2VlbkRlZnM6CisgIEVuYWJsZWQ6IGZhbHNlCisKKyMgSSBwZXJzb25hbGx5IGRvbid0IGNhcmUgYWJvdXQgdGhlIGZvcm1hdCBzdHlsZS4KKyMgSW4gbW9zdCBjYXNlcyBJIGxpa2UgdG8gdXNlICUsIGJ1dCBub3QgYXQgdGhlIHBvaW50IEkgd2FudCB0byBlbmZvcmNlIGl0CisjIGFzIGEgY29udmVudGlvbiBpbiB0aGUgZW50aXJlIGNvZGUuCitTdHlsZS9Gb3JtYXRTdHJpbmc6CisgIEVuYWJsZWQ6IGZhbHNlCisKKyMgUHJlZmVyIHRoZSBsYXRlc3QgSGFzaCBzeW50YXgKK1N0eWxlL0hhc2hTeW50YXg6CisgIEV4Y2x1ZGU6CisgICAgIyBCdXQgUmFrZWZpbGVzIGdlbmVyYWxseSBoYXZlIHNvbWUgZGVmaW5pdGlvbiBsaWtlCisgICAgIyAgIDpkZWZhdWx0ID0+IDp0ZXN0CisgICAgIyB0aGF0IGxvb2tzIG5pY2VyIHdpdGggdGhlIG9sZCByb2NrZXQgc3ludGF4LgorICAgIC0gJ1Jha2VmaWxlJworCisjIEFycmF5IGluZGVudGF0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGxpa2UgTXVsdGlsaW5lTWV0aG9kQ2FsbEluZGVudGF0aW9uIGluZGVudGF0aW9uCisjIGFuZCB1c2UgNCBzcGFjZXMgaW5zdGVhZCBvZiAyLgorTGF5b3V0L0luZGVudEFycmF5OgorICBJbmRlbnRhdGlvbldpZHRoOiA0CisKKyMgSGFzaCBpbmRlbnRhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBsaWtlIE11bHRpbGluZU1ldGhvZENhbGxJbmRlbnRhdGlvbiBpbmRlbnRhdGlvbgorIyBhbmQgdXNlIDQgc3BhY2VzIGluc3RlYWQgb2YgMi4KK0xheW91dC9JbmRlbnRIYXNoOgorICBJbmRlbnRhdGlvbldpZHRoOiA0CisKKyMgTXVsdGktbGluZSBkaWZmZXJzIGZyb20gc3RhbmRhcmQgaW5kZW50YXRpb24sIHRoZXkgYXJlIGluZGVudGVkIHR3aWNlLgorTGF5b3V0L011bHRpbGluZU1ldGhvZENhbGxJbmRlbnRhdGlvbjoKKyAgRW5mb3JjZWRTdHlsZTogaW5kZW50ZWQKKyAgSW5kZW50YXRpb25XaWR0aDogNAorCisjIHVubGVzcyBpcyBub3QgYWx3YXlzIGNvb2wuCitTdHlsZS9OZWdhdGVkSWY6CisgIEVuYWJsZWQ6IGZhbHNlCisKKyMgRm9yIHllYXJzLCAldygpIGhhcyBiZWVuIHRoZSBkZS1mYWN0byBzdGFuZGFyZC4gQSBsb3Qgb2YgbGlicmFyaWVzIGFyZSB1c2luZyAoKS4KKyMgU3dpdGNoaW5nIHRvIFtdIHdvdWxkIGJlIGEgbmlnaHRtYXJlLgorU3R5bGUvUGVyY2VudExpdGVyYWxEZWxpbWl0ZXJzOgorICBFbmFibGVkOiBmYWxzZQorCisjIFRoZXJlIGFyZSBjYXNlcyB3ZXJlIHRoZSBpbmxpbmUgcmVzY3VlIGlzIG9rLiBXZSBjYW4gZWl0aGVyIGRvd25ncmFkZSB0aGUgc2V2ZXJpdHksCisjIG9yIHJlbHkgb24gdGhlIGRldmVsb3BlciBqdWRnZW1lbnQgb24gYSBjYXNlLWJ5LWNhc2UgYmFzaXMuCitTdHlsZS9SZXNjdWVNb2RpZmllcjoKKyAgRW5hYmxlZDogZmFsc2UKKworIyBTb3JyeSwgYnV0IHVzaW5nIHRyYWlsaW5nIHNwYWNlcyBoZWxwcyByZWFkYWJpbGl0eS4KKyMKKyMgICAldyggZm9vIGJhciApCisjCisjIGxvb2tzIGJldHRlciB0byBtZSB0aGFuCisjCisjICAgJXcoIGZvbyBiYXIgKQorIworTGF5b3V0L1NwYWNlSW5zaWRlUGVyY2VudExpdGVyYWxEZWxpbWl0ZXJzOgorICBFbmFibGVkOiBmYWxzZQorCisjIEhhdGUgSXQgb3IgTG92ZSBJdCwgSSBwcmVmZXIgZG91YmxlIHF1b3RlcyBhcyB0aGlzIGlzIG1vcmUgY29uc2lzdGVudAorIyB3aXRoIHNldmVyYWwgb3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFuZCB0aGUgb3V0cHV0IG9mIHB1dHMgYW5kIGluc3BlY3QuCitTdHlsZS9TdHJpbmdMaXRlcmFsczoKKyAgRW5mb3JjZWRTdHlsZTogZG91YmxlX3F1b3RlcworCisjIEl0J3MgbmljZSB0byBiZSBjb25zaXN0ZW50LiBUaGUgdHJhaWxpbmcgY29tbWEgYWxzbyBhbGxvd3MgZWFzeSByZW9yZGVyaW5nLAorIyBhbmQgZG9lc24ndCBjYXVzZSBhIGRpZmYgaW4gR2l0IHdoZW4geW91IGFkZCBhIGxpbmUgdG8gdGhlIGJvdHRvbS4KK1N0eWxlL1RyYWlsaW5nQ29tbWFJbkxpdGVyYWw6CisgIEVuZm9yY2VkU3R5bGVGb3JNdWx0aWxpbmU6IGNvbnNpc3RlbnRfY29tbWEKKworU3R5bGUvVHJpdmlhbEFjY2Vzc29yczoKKyAgIyBJZ25vcmVDbGFzc01ldGhvZHMgYmVjYXVzZSBJIHdhbnQgdG8gYmUgYWJsZSB0byBkZWZpbmUgY2xhc3MtbGV2ZWwgYWNjZXNzb3JzCisgICMgdGhhdCBzZXRzIGFuIGluc3RhbmNlIHZhcmlhYmxlIG9uIHRoZSBtZXRhY2xhc3MsIHN1Y2ggYXM6CisgICMKKyAgIyAgICBkZWYgc2VsZi5kZWZhdWx0PSh2YWx1ZSkKKyAgIyAgICAgIEBkZWZhdWx0ID0gdmFsdWUKKyAgIyAgICBlbmQKKyAgIworICBJZ25vcmVDbGFzc01ldGhvZHM6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvLnJ1YnktZ2Vtc2V0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC8ucnVieS1nZW1zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwNzBhZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvLnJ1YnktZ2Vtc2V0CkBAIC0wLDAgKzEgQEAKK3B1YmxpY3N1ZmZpeApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvLnRyYXZpcy55bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2VhODQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMjYgQEAKK2xhbmd1YWdlOiBydWJ5CisKK3J2bToKKyAgLSAyLjEKKyAgLSAyLjIKKyAgLSAyLjMuMworICAtIDIuNC4wCisgIC0gcnVieS1oZWFkCisgIC0ganJ1YnktOS4wLjUuMAorICAtIGpydWJ5LTkuMS4wLjAKKworYmVmb3JlX2luc3RhbGw6CisgIC0gZ2VtIHVwZGF0ZSAtLXN5c3RlbQorICAtIGdlbSBpbnN0YWxsIGJ1bmRsZXIKKworY2FjaGU6CisgIC0gYnVuZGxlcgorCitlbnY6CisgIC0gQ09WRVJBTEw9MQorCittYXRyaXg6CisgIGFsbG93X2ZhaWx1cmVzOgorICAgIC0gcnZtOiBydWJ5LWhlYWQKKyAgICAtIHJ2bToganJ1YnktOS4wLjUuMAorICAgIC0gcnZtOiBqcnVieS05LjEuMC4wCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wLy55YXJkb3B0cyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvLnlhcmRvcHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNzgyZGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wLy55YXJkb3B0cwpAQCAtMCwwICsxIEBACistLXRpdGxlICdSdWJ5IFB1YmxpYyBTdWZmaXggQVBJIERvY3VtZW50YXRpb24nCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wLzIuMC1VcGdyYWRlLm1kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC8yLjAtVXBncmFkZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTEwYmZiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC8yLjAtVXBncmFkZS5tZApAQCAtMCwwICsxLDUyIEBACisjIFdlbGNvbWUgdG8gUHVibGljU3VmZml4IDIuMCEKKworUHVibGljU3VmZml4IDIuMCBjb250YWlucyBhIHJld3JpdHRlbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBhbmQgY29tcGFyaXNvbiBsb2dpYywgdGhhdCBkcmFzdGljYWxseSBpbmNyZWFzZXMgdGhlIGxvb2t1cCBwZXJmb3JtYW5jZS4gVGhlIG5ldyB2ZXJzaW9uIGFsc28gY2hhbmdlcyBzZXZlcmFsIGludGVybmFsIGFuZCBleHRlcm5hbCBBUEkuCisKK1RoaXMgZG9jdW1lbnQgZG9jdW1lbnRzIHRoZSBtb3N0IHJlbGV2YW50IGNoYW5nZXMgdG8gaGVscCB5b3UgdXBncmFkaW5nIGZyb20gUHVibGljU3VmZml4IDEuMCB0byAyLjAuCisKKyMjIFdoYXQncyBOZXcKKworLSBUaGUgbGlicmFyeSBpcyBub3cgMTAwJSBjb21wbGlhbnRzIHdpdGggdGhlIG9mZmljaWFsIFB1YmxpY1N1ZmZpeCB0ZXN0cy4gVGhlIG1ham9yIGJyZWFraW5nIGNoYW5nZSB5b3UgbWF5IGV4cGVyaWVuY2UsIGlzIHRoYXQgaWYgYSBkb21haW4gcGFzc2VkIGFzIGlucHV0IGRvZXNuJ3QgbWF0Y2ggYW55IHJ1bGUsIHRoZSBydWxlIGAqYCBpcyBhc3N1bWVkLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgYnkgcGFzc2luZyBhIGN1c3RvbSBkZWZhdWx0IHJ1bGUgd2l0aCB0aGUgYGRlZmF1bHRfcnVsZWAgb3B0aW9uLiBUaGUgb2xkIGJlaGF2aW9yIGNhbiBiZSByZXN0b3JlZCBieSBwYXNzaW5nIGBkZWZhdWx0X3J1bGU6IG5pbGAuCistIGBQdWJsaWNTdWZmaXguZG9tYWluYCBpcyBhIG5ldyBtZXRob2QgdGhhdCBwYXJzZXMgdGhlIGlucHV0IGFuZCByZXR1cm5zIHRoZSBkb21haW4gKGNvbWJpbmF0aW9uIG9mIHNlY29uZCBsZXZlbCBkb21haW4gKyBzdWZmaXgpLiBUaGlzIGlzIGEgY29udmVuaWVudCBoZWxwZXIgdG8gcGFyc2UgYSBkb21haW4gbmFtZSwgZm9yIGV4YW1wbGUgd2hlbiB5b3UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIGNvb2tpZSBvciBTU0wgc2NvcGUuCistIEFkZGVkIHRoZSBhYmlsaXR5IHRvIGRpc2FibGUgdGhlIHVzZSBvZiBwcml2YXRlIGRvbWFpbnMgZWl0aGVyIGF0IHJ1bnRpbWUsIGluIGFkZGl0aW9uIHRvIHRoZSBhYmlsaXR5IHRvIG5vdCBsb2FkIHRoZSBwcml2YXRlIGRvbWFpbnMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgdGhlIGxpc3QgKGBwcml2YXRlX2RvbWFpbnM6IGZhbHNlYCkuIFRoaXMgZmVhdHVyZSBhbHNvIHN1cGVyc2VkZWQgdGhlIGBwcml2YXRlX2RvbWFpbnNgIGNsYXNzLWxldmVsIGF0dHJpYnV0ZSwgdGhhdCBpcyBubyBsb25nZXIgYXZhaWxhYmxlLgorCisjIyBVcGdyYWRlCisKK1doZW4gdXBncmFkaW5nLCBoZXJlJ3MgdGhlIG1vc3QgcmVsZXZhbnQgY2hhbmdlcyB0byBrZWVwIGFuIGV5ZSBvbjoKKworLSBTZXZlcmFsIGZ1dGlsZSB1dGlsaXR5IGhlbHBlcnMgd2VyZSByZW1vdmVkLCBzdWNoIGFzIGBEb21haW4jcnVsZWAsIGBEb21haW4jaXNfYV9kb21haW4/YCwgYERvbWFpbiNpc19hX3N1YmRvbWFpbj9gLCBgRG9tYWluI3ZhbGlkP2AuIFlvdSBjYW4gZWFzaWx5IG9idGFpbiB0aGUgc2FtZSByZXN1bHQgYnkgaGF2aW5nIGEgY3VzdG9tIG1ldGhvZCB0aGF0IHJlY29uc3RydWN0cyB0aGUgbG9naWMsIGFuZC9vciBjYWxsaW5nIGBQdWJsaWNTdWZmaXgue2RvbWFpbnxwYXJzZX0oZG9tYWluLnRvX3MpYC4KKy0gYFB1YmxpY1N1ZmZpeDo6TGlzdC5wcml2YXRlX2RvbWFpbnNgIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIEluc3RlYWQsIHlvdSBub3cgaGF2ZSB0d28gd2F5cyB0byBlbmFibGUvZGlzYWJsZSB0aGUgcHJpdmF0ZSBkb21haW5zOgorCisgICAgMS4gQXQgcnVudGltZSwgYnkgdXNpbmcgdGhlIGBpZ25vcmVfcHJpdmF0ZWAgb3B0aW9uCisKKyAgICBgYGBydWJ5CisgICAgUHVibGljU3VmZml4LmRvbWFpbigic29tZXRoaW5nLmJsb2dzcG90LmNvbSIsIGlnbm9yZV9wcml2YXRlOiB0cnVlKQorICAgIGBgYAorCisgICAgMS4gTG9hZGluZyBhIGZpbHRlcmVkIGxpc3Q6CisKKyAgICBgYGBydWJ5CisgICAgIyBEaXNhYmxlIHN1cHBvcnQgZm9yIHByaXZhdGUgVExEcworICAgIFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0ID0gUHVibGljU3VmZml4OjpMaXN0LnBhcnNlKEZpbGUucmVhZChQdWJsaWNTdWZmaXg6Okxpc3Q6OkRFRkFVTFRfTElTVF9QQVRIKSwgcHJpdmF0ZV9kb21haW5zOiBmYWxzZSkKKyAgICAjID0+ICJibG9nc3BvdC5jb20iCisgICAgUHVibGljU3VmZml4LmRvbWFpbigic29tZXRoaW5nLmJsb2dzcG90LmNvbSIpCisgICAgIyA9PiAiYmxvZ3Nwb3QuY29tIgorICAgIGBgYAorLSBOb3cgdGhhdCB0aGUgbGlicmFyeSBpcyAxMDAlIGNvbXBsaWFudCB3aXRoIHRoZSBvZmZpY2lhbCBQdWJsaWNTdWZmaXggYWxnb3JpdGhtLCBpZiBhIGRvbWFpbiBwYXNzZWQgYXMgaW5wdXQgZG9lc24ndCBtYXRjaCBhbnkgcnVsZSwgdGhlIHdpbGRjYXJkIHJ1bGUgYCpgIGlzIGFzc3VtZWQuIFRoaXMgbWVhbnMgdGhhdCB1bmxpc3RlZCBUTERzIHdpbGwgYmUgY29uc2lkZXJlZCB2YWxpZCBieSBkZWZhdWx0LCB3aGVuIHRoZXkgd291bGQgaGF2ZSBiZWVuIGludmFsaWQgaW4gMS54LiBIb3dldmVyLCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgdG8gZW11bGF0ZSB0aGUgMS54IGJlaGF2aW9yIGlmIG5lZWRlZDoKKworICAgIGBgYHJ1YnkKKyAgICAjIDEueDoKKworICAgIFB1YmxpY1N1ZmZpeC52YWxpZD8oImdvb2dsZS5jb21tbSIpCisgICAgIyA9PiBmYWxzZQorCisgICAgIyAyLng6CisKKyAgICBQdWJsaWNTdWZmaXgudmFsaWQ/KCJnb29nbGUuY29tbW0iKQorICAgICMgPT4gdHJ1ZQorCisgICAgIyBPdmVycmlkaW5nIDIueCBiZWhhdmlvciBpZiBuZWVkZWQ6CisKKyAgICBQdWJsaWNTdWZmaXgudmFsaWQ/KCJnb29nbGUuY29tbW0iLCBkZWZhdWx0X3J1bGU6IG5pbCkKKyAgICAjID0+IGZhbHNlCisgICAgYGBgYApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9DSEFOR0VMT0cubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL0NIQU5HRUxPRy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjYyZGRjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9DSEFOR0VMT0cubWQKQEAgLTAsMCArMSwzMjQgQEAKKyMgQ2hhbmdlbG9nCisKKworIyMjIyBSZWxlYXNlIDMuMC4wCisKK1RoaXMgbmV3IHZlcnNpb24gaW5jbHVkZXMgYSBtYWpvciByZWRlc2lnbiBvZiB0aGUgbGlicmFyeSBpbnRlcm5hbHMsIHdpdGggdGhlIGdvYWwgdG8gZHJhc3RpY2FsbHkKK2ltcHJvdmUgdGhlIGxvb2t1cCB0aW1lIHdoaWxlIHJlZHVjaW5nIHN0b3JhZ2Ugc3BhY2UuCisKK0ZvciB0aGlzIHJlYXNvbiwgc2V2ZXJhbCBwdWJsaWMgbWV0aG9kcyB0aGF0IGFyZSBubyBsb25nZXIgYXBwbGljYWJsZSBoYXZlIGJlZW4gZGVwcmVjYXRlZAorYW5kL29yIHJlbW92ZWQuIFlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGF0IEdILTEzMy4KKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorLSBDSEFOR0VEOiBEcm9wcGVkIHN1cHBvcnQgZm9yIFJ1YnkgPCAyLjEKKy0gQ0hBTkdFRDogYFB1YmxpY1N1ZmZpeDo6TGlzdCNydWxlc2AgaXMgbm93IHByb3RlY3RlZC4gWW91IHNob3VsZCBub3QgcmVseSBvbiBpdCBhcyB0aGUgaW50ZXJuYWwgcnVsZSByZXByZXNlbnRhdGlvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZSB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZXMuCistIENIQU5HRUQ6IFJlbW92ZWQgYFB1YmxpY1N1ZmZpeDo6TGlzdC5jbGVhcmAsIGl0IHdhcyBhbiB1bm5lY2Vzc2FyeSBhY2Nlc3NvciBtZXRob2QuIFVzZSBgUHVibGljU3VmZml4OjpMaXN0LmRlZmF1bHQgPSBuaWxgIGlmIHlvdSAqKnJlYWxseSoqIG5lZWQgdG8gcmVzZXQgdGhlIGRlZmF1bHQgbGlzdC4gWW91IHNob3VsZG4ndC4KKy0gQ0hBTkdFRDogYFB1YmxpY1N1ZmZpeDo6TGlzdCNzZWxlY3RgIGlzIG5vdyBwcml2YXRlLiBZb3Ugc2hvdWxkIG5vdCB1c2UgaXQsIGluc3RlYWQgdXNlIGBQdWJsaWNTdWZmaXg6Okxpc3QjZmluZGAuCistIENIQU5HRUQ6IGBQdWJsaWNTdWZmaXg6Okxpc3RgIG5vIGxvbmdlciBpbXBsZW1lbnRzIEVudW1lcmFibGUuIEluc3RlYWQsIHVzZSBgI2VhY2hgIHRvIGxvb3Agb3Zlciwgb3IgZ2V0IGFuIEVudW1lcmF0b3IuCistIENIQU5HRUQ6IFJlZGVzaWduZWQgaW50ZXJuYWwgbGlzdCBzdG9yYWdlIGFuZCBsb29rdXAgYWxnb3JpdGhtIHRvIGFjaGlldmUgTygxKSBsb29rdXAgdGltZSAoc2VlIEdILTEzMykuCisKKworIyMjIyBSZWxlYXNlIDIuMC41CisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKy0gQ0hBTkdFRDogSW5pdGlhbGl6YXRpb24gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIChHSC0xMjgpLiBbVGhhbmtzIEBjYXNwZXJpc2ZpbmVdCisKKworIyMjIyBSZWxlYXNlIDIuMC40CisKKy0gRklYRUQ6IEZpeCBhIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgR0VNIHRvIGJlIHB1Ymxpc2hlZCB3aXRoIHRoZSB3cm9uZyB2ZXJzaW9uIG51bWJlciBpbiB0aGUgZ2Vtc3BlYyAoR0gtMTIxKS4KKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorCisKKyMjIyMgUmVsZWFzZSAyLjAuMworCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDIuMC4yCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMi4wLjEKKworLSBGSVhFRDogRml4IGJ1ZyB0aGF0IHByZXZlbnRlZCAudmFsaWQ/IHRvIHJlc2V0IHRoZSBkZWZhdWx0IHJ1bGUKKworCisjIyMjIFJlbGVhc2UgMi4wLjAKKworLSBORVc6IEFkZGVkIFB1YmxpY1N1ZmZpeC5kb21haW4gIyA9PiBzbGQudGxkCistIE5FVzogQWRkZWQgdGhlIGFiaWxpdHkgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIHByaXZhdGUgZG9tYWlucyBlaXRoZXIgYXQgcnVudGltZSwgaW4gYWRkaXRpb24gdG8gdGhlIGFiaWxpdHkgdG8gbm90IGxvYWQgdGhlIHByaXZhdGUgZG9tYWlucyBzZWN0aW9uIHdoZW4gcmVhZGluZyB0aGUgbGlzdCAoYHByaXZhdGVfZG9tYWluczogZmFsc2VgKS4gVGhpcyBmZWF0dXJlIGFsc28gc3VwZXJzZWRlZCB0aGUgYHByaXZhdGVfZG9tYWluc2AgY2xhc3MtbGV2ZWwgYXR0cmlidXRlLCB0aGF0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisKKy0gQ0hBTkdFRDogQ29uc2lkZXJhYmxlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyAoR0gtOTIpCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCistIENIQU5HRUQ6IFJlbW92ZWQgZGVwcmVjYXRlZCBQdWJsaWNTdWZmaXg6OkludmFsaWREb21haW4gZXhjZXB0aW9uCistIENIQU5HRUQ6IElmIHRoZSBzdWZmaXggaXMgbm93IGxpc3RlZCwgdGhlbiB0aGUgcHJldmFsaW5nIHJ1bGUgaXMgIioiIGFzIGRlZmluZWQgYnkgdGhlIFBTTCBhbGdvcml0aG0gKEdILTkxKQorLSBDSEFOR0VEOiBJbnB1dCB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCBvbmx5IGlmIHlvdSBjYWxsIGBQdWJsaWNTdWZmaXgucGFyc2VgIG9yIGBQdWJsaWNTdWZmaXgubGlzdGAKKy0gQ0hBTkdFRDogSW5wdXQgd2l0aCBsZWFkaW5nIGRvdCBpcyBpbnZhbGlkIHBlciBQU0wgYWNjZXB0YW5jZSB0ZXN0cworLSBDSEFOR0VEOiBSZW1vdmVkIGBwcml2YXRlX2RvbWFpbnNgIGNsYXNzLWxldmVsIGF0dHJpYnV0ZS4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGBwcml2YXRlX2RvbWFpbnM6IGZhbHNlYCBvcHRpb24gaW4gdGhlIGxpc3QgcGFyc2UgbWV0aG9kLgorLSBDSEFOR0VEOiBUaGUgZGVmYXVsdCBsaXN0IG5vdyBhc3N1bWVzIHlvdSB1c2UgVVRGLTggZm9yIHJlYWRpbmcgdGhlIGlucHV0IChHSC05NCksCisKKy0gUkVNT1ZFRDogUmVtb3ZlZCBmdXRpbGUgdXRpbGl0eSBoZWxwZXJzIHN1Y2ggYXMgYERvbWFpbiNydWxlYCwgYERvbWFpbiNpc19hX2RvbWFpbj9gLCBgRG9tYWluI2lzX2Ffc3ViZG9tYWluP2AsIGBEb21haW4jdmFsaWQ/YC4gWW91IGNhbiBlYXNpbHkgb2J0YWluIHRoZSBzYW1lIHJlc3VsdCBieSBoYXZpbmcgYSBjdXN0b20gbWV0aG9kIHRoYXQgcmVjb25zdHJ1Y3RzIHRoZSBsb2dpYywgYW5kL29yIGNhbGxpbmcgYFB1YmxpY1N1ZmZpeC57ZG9tYWlufHBhcnNlfShkb21haW4udG9fcylgLgorCisKKyMjIyMgUmVsZWFzZSAxLjUuMworCistIEZJWEVEOiBEb24ndCBkdXBsaWNhdGUgcnVsZSBpbmRpY2VzIHdoZW4gY3JlYXRpbmcgaW5kZXggKEdILTc3KS4gW1RoYW5rcyBAYWdzXQorCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDEuNS4yCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMS41LjEKKworLSBGSVhFRDogSWdub3JlIGNhc2UgZm9yIHBhcnNpbmcgYW5kIHZhbGlkYXRpbmcgKEdILTYyKQorCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDEuNS4wCisKKy0gQ0hBTkdFRDogRHJvcHBlZCBzdXBwb3J0IGZvciBSdWJ5IDwgMi4wCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMS40LjYKKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorCisKKyMjIyMgUmVsZWFzZSAxLjQuNQorCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDEuNC40CisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMS40LjMKKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorCisKKyMjIyMgUmVsZWFzZSAxLjQuMgorCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDEuNC4xCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMS40LjAKKworLSBDSEFOR0VEOiBNb3ZlZCB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIGxpYiBmb2xkZXIuCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMS4zLjMKKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorCisKKyMjIyMgUmVsZWFzZSAxLjMuMgorCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDEuMy4xCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMS4zLjAKKworLSBORVc6IEFiaWxpdHkgdG8gc2tpcCBQcml2YXRlIERvbWFpbnMgKEdILTI4KS4gW1RoYW5rcyBAcmIya10KKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorCisKKyMjIyMgUmVsZWFzZSAxLjIuMQorCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDEuMi4wCisKKy0gTkVXOiBBbGxvdyBhIGN1c3RvbSBMaXN0IG9uIGBQdWJsaWNTdWZmaXgucGFyc2VgIChHSC0yNikuIFtUaGFua3MgQGl0c3ByaWRkbGVdCisKKy0gRklYRUQ6IFB1YmxpY1N1ZmZpeC5wYXJzZSBhbmQgUHVibGljU3VmZml4LnZhbGlkPyBjcmFzaGVzIHdoZW4gaW5wdXQgaXMgbmlsIChHSC0yMCkuCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMS4xLjMKKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorCisKKyMjIyMgUmVsZWFzZSAxLjEuMgorCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDEuMS4xCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworCisjIyMjIFJlbGVhc2UgMS4xLjAKKworLSBGSVhFRDogI3ZhbGlkPyBhbmQgI3BhcnNlIGNvbnNpZGVyIFVSSXMgYXMgdmFsaWQgZG9tYWlucyAoR0gtMTUpCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucy4KKworLSBDSEFOR0VEOiBSZW1vdmVkIGRlcHJlY2F0ZCBQdWJsaWNTdWZmaXhTZXJ2aWNlOjpSdWxlTGlzdC4KKworCisjIyMjIFJlbGVhc2UgMS4wLjAKKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorCisKKyMjIyMgUmVsZWFzZSAxLjAuMC5yYzEKKworVGhlIGxpYnJhcnkgaXMgbm93IGtub3duIGFzIFB1YmxpY1N1ZmZpeC4KKworCisjIyMjIFJlbGVhc2UgMC45LjEKKworLSBDSEFOR0VEOiBSZW5hbWVkIFB1YmxpY1N1ZmZpeFNlcnZpY2U6OlJ1bGVMaXN0IHRvIFB1YmxpY1N1ZmZpeFNlcnZpY2U6Okxpc3QuCisKKy0gQ0hBTkdFRDogUmVuYW1lZCBQdWJsaWNTdWZmaXhTZXJ2aWNlOjpMaXN0I2xpc3QgdG8gUHVibGljU3VmZml4U2VydmljZTo6TGlzdCNydWxlcy4KKworLSBDSEFOR0VEOiBSZW5hbWVkIFB1YmxpY1N1ZmZpeFNlcnZpY2UgdG8gUHVibGljU3VmZml4LgorCistIENIQU5HRUQ6IFVwZGF0ZWQgZGVmaW5pdGlvbnMuCisKKworIyMjIyBSZWxlYXNlIDAuOS4wCisKKy0gQ0hBTkdFRDogTWluaW11bSBSdWJ5IHZlcnNpb24gaW5jcmVhc2VkIHRvIFJ1YnkgMS44LjcuCisKKy0gQ0hBTkdFRDogcmFrZS9nZW1wYWNrYWdldGFzayBpcyBkZXByZWNhdGVkLiAgVXNlIHJ1YnlnZW1zL3BhY2thZ2VfdGFzayBpbnN0ZWFkLgorCisKKyMjIyMgUmVsZWFzZSAwLjguNAorCistIEZJWEVEOiBSZXZlcnRlZCBidWdmaXggZm9yIGlzc3VlICMxMiBmb3IgUnVieSAxLjguNi4KKyAgVGhpcyBpcyB0aGUgbGF0ZXN0IHZlcnNpb24gY29tcGF0aWJsZSB3aXRoIFJ1YnkgMS44LjYuCisKKworIyMjIyBSZWxlYXNlIDAuOC4zCisKKy0gRklYRUQ6IEZpeGVkIEFyZ3VtZW50RXJyb3I6IGludmFsaWQgYnl0ZSBzZXF1ZW5jZSBpbiBVUy1BU0NJSSB3aXRoIFJ1YnkgMS45LjIgKCMxMikuCisKKy0gQ0hBTkdFRDogVXBkYXRlZCBkZWZpbml0aW9ucyAoIzExKS4KKworLSBDSEFOR0VEOiBSZW5hbWVkIGRlZmluaXRpb25zLnR4dCB0byBkZWZpbml0aW9ucy5kYXQuCisKKworIyMjIyBSZWxlYXNlIDAuOC4yCisKKy0gTkVXOiBBZGRlZCBzdXBwb3J0IGZvciBydWJ5Z2Vtcy10ZXN0LgorCistIENIQU5HRUQ6IEludGVncmF0ZWQgQnVuZGxlci4KKworLSBDSEFOR0VEOiBVcGRhdGVkIGRlZmluaXRpb25zLgorCisKKyMjIyMgUmVsZWFzZSAwLjguMQorCistIEZJWEVEOiBUaGUgZmlsZXMgaW4gdGhlIHJlbGVhc2UgMC44LjAgaGF2ZSB3cm9uZyBwZXJtaXNzaW9uIDYwMCBhbmQgY2FuJ3QgYmUgbG9hZGVkICgjMTApLgorCisKKyMjIyMgUmVsZWFzZSAwLjguMAorCistIENIQU5HRUQ6IFVwZGF0ZSBwdWJsaWMgc3VmZml4IGxpc3QgdG8gZDFhNTU5OWI0OWZhIDIwMTAtMTAtMjUgMTU6MTAgKzAxMDAgKCM5KQorCistIE5FVzogQWRkIHN1cHBvcnQgZm9yIEZ1bGx5IFF1YWxpZmllZCBEb21haW4gTmFtZXMgKCM3KQorCisKKyMjIyMgUmVsZWFzZSAwLjcuMAorCistIENIQU5HRUQ6IFVzaW5nIFlBUkQgdG8gZG9jdW1lbnQgdGhlIGNvZGUgaW5zdGVhZCBvZiBSRG9jLgorCistIEZJWEVEOiBSdWxlTGlzdCBjYWNoZSBpcyBub3QgcmVjcmVhdGVkIHdoZW4gYSBuZXcgcnVsZSBpcyBhcHBlbmRlZCB0byB0aGUgbGlzdCAoIzYpCisKKy0gRklYRUQ6IFB1YmxpY1N1ZmZpeFNlcnZpY2UudmFsaWQ/IHNob3VsZCByZXR1cm4gZmFsc2UgaWYgdGhlIGRvbWFpbiBpcyBub3QgZGVmaW5lZCBvciBub3QgYWxsb3dlZCAoIzQsICM1KQorCisKKyMjIyMgUmVsZWFzZSAwLjYuMAorCistIE5FVzogIFB1YmxpY1N1ZmZpeFNlcnZpY2UucGFyc2UgcmFpc2VzIERvbWFpbk5vdEFsbG93ZWQgd2hlbiB0cnlpbmcgdG8gcGFyc2UgYSBkb21haW4gbmFtZQorICB3aGljaCBleGlzdHMsIGJ1dCBpcyBub3QgYWxsb3dlZCBieSB0aGUgY3VycmVudCBkZWZpbml0aW9uIGxpc3QgKCMzKQorCisgICAgICAgIFB1YmxpY1N1ZmZpeFNlcnZpY2UucGFyc2UoIm5pYy5kbyIpCisgICAgICAgICMgPT4gUHVibGljU3VmZml4U2VydmljZTo6RG9tYWluTm90QWxsb3dlZAorCistIENIQU5HRUQ6IFJlbmFtZWQgUHVibGljU3VmZml4U2VydmljZTo6SW52YWxpZERvbWFpbiB0byBQdWJsaWNTdWZmaXhTZXJ2aWNlOjpEb21haW5JbnZhbGlkCisKKworIyMjIyBSZWxlYXNlIDAuNS4yCisKKy0gQ0hBTkdFRDogVXBkYXRlIHB1YmxpYyBzdWZmaXggbGlzdCB0byAyNDhlYTY5MGQ2NzEgMjAxMC0wOS0xNiAxODowMiArMDEwMAorCisKKyMjIyMgUmVsZWFzZSAwLjUuMQorCistIENIQU5HRUQ6IFVwZGF0ZSBwdWJsaWMgc3VmZml4IGxpc3QgdG8gMTRkYzY2ZGQ1M2MxIDIwMTAtMDktMTUgMTc6MDkgKzAxMDAKKworCisjIyMjIFJlbGVhc2UgMC41LjAKKworLSBDSEFOR0VEOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gZm9yIERvbWFpbiNkb21haW4gYW5kIERvbWFpbiNzdWJkb21haW4gKCMxKS4KKworLSBDSEFOR0VEOiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgKCMyKS4KKworCisjIyMjIFJlbGVhc2UgMC40LjAKKworLSBDSEFOR0VEOiBSZW5hbWUgbGlicmFyeSBmcm9tIERvbWFpbk5hbWUgdG8gUHVibGljU3VmZml4U2VydmljZSB0byByZWR1Y2UgdGhlIHByb2JhYmlsaXR5IG9mIG5hbWUgY29uZmxpY3RzLgorCisKKyMjIyMgUmVsZWFzZSAwLjMuMQorCistIERlcHJlY2F0ZWQgRG9tYWluTmFtZSBsaWJyYXJ5LgorCisKKyMjIyMgUmVsZWFzZSAwLjMuMAorCistIENIQU5HRUQ6IERvbWFpbk5hbWUjZG9tYWluIGFuZCBEb21haW5OYW1lI3N1YmRvbWFpbiBhcmUgbm8gbG9uZ2VyIGFsaWFzIG9mIERvbWFpbiNzbGQgYW5kIERvbWFpbiN0bGQuCisKKy0gQ0hBTkdFRDogUmVtb3ZlZCBEb21haW5OYW1lI2xhYmVscyBhbmQgZGVjb3VwbGVkIFJ1bGUgZnJvbSBEb21haW5OYW1lLgorCistIENIQU5HRUQ6IERvbWFpbk5hbWUjdmFsaWQ/IG5vIGxvbmdlciBpbnN0YW50aWF0ZXMgbmV3IERvbWFpbk5hbWUgb2JqZWN0cy4gVGhpcyBtZWFucyBsZXNzIG92ZXJoZWFkLgorCistIENIQU5HRUQ6IFJlZmFjdG9yaW5nIHRoZSBlbnRpcmUgRG9tYWluTmFtZSBBUEkuIFJlbW92ZWQgdGhlIGludGVybmFsIG9uLXRoZS1mbHkgcGFyc2luZy4gQWRkZWQgYSBidW5jaCBvZiBuZXcgbWV0aG9kcyB0byBjaGVjayBhbmQgdmFsaWRhdGUgdGhlIERvbWFpbk5hbWUuCisKKworIyMjIyBSZWxlYXNlIDAuMi4wCisKKy0gTkVXOiBEb21haW5OYW1lI3ZhbGlkPworCistIE5FVzogRG9tYWluTmFtZSNwYXJzZSBhbmQgRG9tYWluTmFtZSNwYXJzZSEKKworLSBORVc6IERvbWFpbk5hbWUjdmFsaWRfZG9tYWluPyBhbmQgRG9tYWluTmFtZSN2YWxpZF9zdWJkb21haW4/CisKKy0gQ0hBTkdFRDogTWFrZSBzdXJlIFJ1bGVMaXN0IGxvb2t1cCBpcyBvbmx5IHBlcmZvcm1lZCBvbmNlLgorCisKKyMjIyMgUmVsZWFzZSAwLjEuMAorCistIEluaXRpYWwgdmVyc2lvbgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9HZW1maWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9HZW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjJiNzQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL0dlbWZpbGUKQEAgLTAsMCArMSwxMCBAQAorc291cmNlICJodHRwczovL3J1YnlnZW1zLm9yZyIKKworZ2Vtc3BlYworCitnZW0gImNvdmVyYWxscyIsIHJlcXVpcmU6IGZhbHNlCitnZW0gIm1pbml0ZXN0IgorZ2VtICJtaW5pdGVzdC1yZXBvcnRlcnMiCitnZW0gInJ1Ym9jb3AiLCByZXF1aXJlOiBmYWxzZQorCitnZW0gIm1lbW9yeV9wcm9maWxlciIsIHJlcXVpcmU6IGZhbHNlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL0xJQ0VOU0UudHh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZlOTRkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDIyIEBACitDb3B5cmlnaHQgKGMpIDIwMDktMjAxNyBTaW1vbmUgQ2FybGV0dGkgPHdlcHBvc0B3ZXBwb3MubmV0PgorCitNSVQgTGljZW5zZQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDliNWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL1JFQURNRS5tZApAQCAtMCwwICsxLDIwMiBAQAorIyBQdWJsaWMgU3VmZml4IDxzbWFsbD5mb3IgUnVieTwvc21hbGw+CisKKzx0dD5QdWJsaWNTdWZmaXg8L3R0PiBpcyBhIFJ1YnkgZG9tYWluIG5hbWUgcGFyc2VyIGJhc2VkIG9uIHRoZSBbUHVibGljIFN1ZmZpeCBMaXN0XShodHRwczovL3B1YmxpY3N1ZmZpeC5vcmcvKS4KKworWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvd2VwcG9zL3B1YmxpY3N1ZmZpeC1ydWJ5LnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL3dlcHBvcy9wdWJsaWNzdWZmaXgtcnVieSkKKworCisjIyBSZXF1aXJlbWVudHMKKworLSBSdWJ5ID49IDIuMAorCitGb3IgYW4gb2xkZXIgdmVyc2lvbnMgb2YgUnVieSB1c2UgYSBwcmV2aW91cyByZWxlYXNlLgorCisKKyMjIEluc3RhbGxhdGlvbgorCitZb3UgY2FuIGluc3RhbGwgdGhlIGdlbSBtYW51YWxseToKKworYGBgc2hlbGwKKyQgZ2VtIGluc3RhbGwgcHVibGljX3N1ZmZpeAorYGBgCisKK09yIHVzZSBCdW5kbGVyIGFuZCBkZWZpbmUgaXQgYXMgYSBkZXBlbmRlbmN5IGluIHlvdXIgYEdlbWZpbGVgOgorCitgYGBydWJ5CitnZW0gJ3B1YmxpY19zdWZmaXgnCitgYGAKKworSWYgeW91IGFyZSB1cGdyYWRpbmcgdG8gMi4wLCBzZWUgWzIuMC1VcGdyYWRlLm1kXSgyLjAtVXBncmFkZS5tZCkuCisKKyMjIFVzYWdlCisKK0V4dHJhY3QgdGhlIGRvbWFpbiBvdXQgZnJvbSBhIG5hbWU6CisKK2BgYHJ1YnkKK1B1YmxpY1N1ZmZpeC5kb21haW4oImdvb2dsZS5jb20iKQorIyA9PiAiZ29vZ2xlLmNvbSIKK1B1YmxpY1N1ZmZpeC5kb21haW4oInd3dy5nb29nbGUuY29tIikKKyMgPT4gImdvb2dsZS5jb20iCitQdWJsaWNTdWZmaXguZG9tYWluKCJ3d3cuZ29vZ2xlLmNvLnVrIikKKyMgPT4gImdvb2dsZS5jby51ayIKK2BgYAorCitQYXJzZSBhIGRvbWFpbiB3aXRob3V0IHN1YmRvbWFpbnM6CisKK2BgYHJ1YnkKK2RvbWFpbiA9IFB1YmxpY1N1ZmZpeC5wYXJzZSgiZ29vZ2xlLmNvbSIpCisjID0+ICM8UHVibGljU3VmZml4OjpEb21haW4+Citkb21haW4udGxkCisjID0+ICJjb20iCitkb21haW4uc2xkCisjID0+ICJnb29nbGUiCitkb21haW4udHJkCisjID0+IG5pbAorZG9tYWluLmRvbWFpbgorIyA9PiAiZ29vZ2xlLmNvbSIKK2RvbWFpbi5zdWJkb21haW4KKyMgPT4gbmlsCitgYGAKKworUGFyc2UgYSBkb21haW4gd2l0aCBzdWJkb21haW5zOgorCitgYGBydWJ5Citkb21haW4gPSBQdWJsaWNTdWZmaXgucGFyc2UoInd3dy5nb29nbGUuY29tIikKKyMgPT4gIzxQdWJsaWNTdWZmaXg6OkRvbWFpbj4KK2RvbWFpbi50bGQKKyMgPT4gImNvbSIKK2RvbWFpbi5zbGQKKyMgPT4gImdvb2dsZSIKK2RvbWFpbi50cmQKKyMgPT4gInd3dyIKK2RvbWFpbi5kb21haW4KKyMgPT4gImdvb2dsZS5jb20iCitkb21haW4uc3ViZG9tYWluCisjID0+ICJ3d3cuZ29vZ2xlLmNvbSIKK2BgYAorCitTaW1wbGUgdmFsaWRhdGlvbiBleGFtcGxlOgorCitgYGBydWJ5CitQdWJsaWNTdWZmaXgudmFsaWQ/KCJnb29nbGUuY29tIikKKyMgPT4gdHJ1ZQorCitQdWJsaWNTdWZmaXgudmFsaWQ/KCJ3d3cuZ29vZ2xlLmNvbSIpCisjID0+IHRydWUKKworIyBFeHBsaWNpdGx5IGZvcmJpZGRlbiwgaXQgaXMgbGlzdGVkIGFzIGEgcHJpdmF0ZSBkb21haW4KK1B1YmxpY1N1ZmZpeC52YWxpZD8oImJsb2dzcG90LmNvbSIpCisjID0+IGZhbHNlCisKKyMgVW5rbm93bi9ub3QtbGlzdGVkIFRMRCBkb21haW5zIGFyZSB2YWxpZCBieSBkZWZhdWx0CitQdWJsaWNTdWZmaXgudmFsaWQ/KCJleGFtcGxlLnRsZG5vdGxpc3RlZCIpCisjID0+IHRydWUKK2BgYAorCitTdHJpY3QgdmFsaWRhdGlvbiAod2l0aG91dCBhcHBseWluZyB0aGUgZGVmYXVsdCAqIHJ1bGUpOgorCitgYGBydWJ5CitQdWJsaWNTdWZmaXgudmFsaWQ/KCJleGFtcGxlLnRsZG5vdGxpc3RlZCIsIGRlZmF1bHRfcnVsZTogbmlsKQorIyA9PiBmYWxzZQorYGBgCisKKworIyMgRnVsbHkgUXVhbGlmaWVkIERvbWFpbiBOYW1lcworCitUaGlzIGxpYnJhcnkgYXV0b21hdGljYWxseSByZWNvZ25pemVzIEZ1bGx5IFF1YWxpZmllZCBEb21haW4gTmFtZXMuIEEgRlFETiBpcyBhIGRvbWFpbiBuYW1lIHRoYXQgZW5kIHdpdGggYSB0cmFpbGluZyBkb3QuCisKK2BgYHJ1YnkKKyMgUGFyc2UgYSBzdGFuZGFyZCBkb21haW4gbmFtZQorUHVibGljU3VmZml4LmRvbWFpbigid3d3Lmdvb2dsZS5jb20iKQorIyA9PiAiZ29vZ2xlLmNvbSIKKworIyBQYXJzZSBhIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZQorUHVibGljU3VmZml4LmRvbWFpbigid3d3Lmdvb2dsZS5jb20uIikKKyMgPT4gImdvb2dsZS5jb20iCitgYGAKKworIyMgUHJpdmF0ZSBkb21haW5zCisKK1RoaXMgbGlicmFyeSBoYXMgc3VwcG9ydCBmb3Igc3dpdGNoaW5nIG9mZiBzdXBwb3J0IGZvciBwcml2YXRlIChub24tSUNBTk4pLgorCitgYGBydWJ5CisjIEV4dHJhY3QgYSBkb21haW4gaW5jbHVkaW5nIHByaXZhdGUgZG9tYWlucyAoYnkgZGVmYXVsdCkKK1B1YmxpY1N1ZmZpeC5kb21haW4oInNvbWV0aGluZy5ibG9nc3BvdC5jb20iKQorIyA9PiAic29tZXRoaW5nLmJsb2dzcG90LmNvbSIKKworIyBFeHRyYWN0IGEgZG9tYWluIGV4Y2x1ZGluZyBwcml2YXRlIGRvbWFpbnMKK1B1YmxpY1N1ZmZpeC5kb21haW4oInNvbWV0aGluZy5ibG9nc3BvdC5jb20iLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkKKyMgPT4gImJsb2dzcG90LmNvbSIKKworIyBJdCBhbHNvIHdvcmtzIGZvciAjcGFyc2UgYW5kICN2YWxpZD8KK1B1YmxpY1N1ZmZpeC5wYXJzZSgic29tZXRoaW5nLmJsb2dzcG90LmNvbSIsIGlnbm9yZV9wcml2YXRlOiB0cnVlKQorUHVibGljU3VmZml4LnZhbGlkPygic29tZXRoaW5nLmJsb2dzcG90LmNvbSIsIGlnbm9yZV9wcml2YXRlOiB0cnVlKQorYGBgCisKK0lmIHlvdSBkb24ndCBjYXJlIGFib3V0IHByaXZhdGUgZG9tYWlucyBhdCBhbGwsIGl0J3MgbW9yZSBlZmZpY2llbnQgdG8gZXhjbHVkZSB0aGVtIHdoZW4gdGhlIGxpc3QgaXMgcGFyc2VkOgorCitgYGBydWJ5CisjIERpc2FibGUgc3VwcG9ydCBmb3IgcHJpdmF0ZSBUTERzCitQdWJsaWNTdWZmaXg6Okxpc3QuZGVmYXVsdCA9IFB1YmxpY1N1ZmZpeDo6TGlzdC5wYXJzZShGaWxlLnJlYWQoUHVibGljU3VmZml4OjpMaXN0OjpERUZBVUxUX0xJU1RfUEFUSCksIHByaXZhdGVfZG9tYWluczogZmFsc2UpCisjID0+ICJibG9nc3BvdC5jb20iCitQdWJsaWNTdWZmaXguZG9tYWluKCJzb21ldGhpbmcuYmxvZ3Nwb3QuY29tIikKKyMgPT4gImJsb2dzcG90LmNvbSIKK2BgYAorCisKKyMjIFdoYXQgaXMgdGhlIFB1YmxpYyBTdWZmaXggTGlzdD8KKworVGhlIFtQdWJsaWMgU3VmZml4IExpc3RdKGh0dHBzOi8vcHVibGljc3VmZml4Lm9yZykgaXMgYSBjcm9zcy12ZW5kb3IgaW5pdGlhdGl2ZSB0byBwcm92aWRlIGFuIGFjY3VyYXRlIGxpc3Qgb2YgZG9tYWluIG5hbWUgc3VmZml4ZXMuCisKK1RoZSBQdWJsaWMgU3VmZml4IExpc3QgaXMgYW4gaW5pdGlhdGl2ZSBvZiB0aGUgTW96aWxsYSBQcm9qZWN0LCBidXQgaXMgbWFpbnRhaW5lZCBhcyBhIGNvbW11bml0eSByZXNvdXJjZS4gSXQgaXMgYXZhaWxhYmxlIGZvciB1c2UgaW4gYW55IHNvZnR3YXJlLCBidXQgd2FzIG9yaWdpbmFsbHkgY3JlYXRlZCB0byBtZWV0IHRoZSBuZWVkcyBvZiBicm93c2VyIG1hbnVmYWN0dXJlcnMuCisKK0EgInB1YmxpYyBzdWZmaXgiIGlzIG9uZSB1bmRlciB3aGljaCBJbnRlcm5ldCB1c2VycyBjYW4gZGlyZWN0bHkgcmVnaXN0ZXIgbmFtZXMuIFNvbWUgZXhhbXBsZXMgb2YgcHVibGljIHN1ZmZpeGVzIGFyZSAiLmNvbSIsICIuY28udWsiIGFuZCAicHZ0LmsxMi53eS51cyIuIFRoZSBQdWJsaWMgU3VmZml4IExpc3QgaXMgYSBsaXN0IG9mIGFsbCBrbm93biBwdWJsaWMgc3VmZml4ZXMuCisKKworIyMgV2h5IHRoZSBQdWJsaWMgU3VmZml4IExpc3QgaXMgYmV0dGVyIHRoYW4gYW55IGF2YWlsYWJsZSBSZWd1bGFyIEV4cHJlc3Npb24gcGFyc2VyPworCitQcmV2aW91c2x5LCBicm93c2VycyB1c2VkIGFuIGFsZ29yaXRobSB3aGljaCBiYXNpY2FsbHkgb25seSBkZW5pZWQgc2V0dGluZyB3aWRlLXJhbmdpbmcgY29va2llcyBmb3IgdG9wLWxldmVsIGRvbWFpbnMgd2l0aCBubyBkb3RzIChlLmcuIGNvbSBvciBvcmcpLiBIb3dldmVyLCB0aGlzIGRpZCBub3Qgd29yayBmb3IgdG9wLWxldmVsIGRvbWFpbnMgd2hlcmUgb25seSB0aGlyZC1sZXZlbCByZWdpc3RyYXRpb25zIGFyZSBhbGxvd2VkIChlLmcuIGNvLnVrKS4gSW4gdGhlc2UgY2FzZXMsIHdlYnNpdGVzIGNvdWxkIHNldCBhIGNvb2tpZSBmb3IgY28udWsgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb250byBldmVyeSB3ZWJzaXRlIHJlZ2lzdGVyZWQgdW5kZXIgY28udWsuCisKK0NsZWFybHksIHRoaXMgd2FzIGEgc2VjdXJpdHkgcmlzayBhcyBpdCBhbGxvd2VkIHdlYnNpdGVzIG90aGVyIHRoYW4gdGhlIG9uZSBzZXR0aW5nIHRoZSBjb29raWUgdG8gcmVhZCBpdCwgYW5kIHRoZXJlZm9yZSBwb3RlbnRpYWxseSBleHRyYWN0IHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4KKworU2luY2UgdGhlcmUgaXMgbm8gYWxnb3JpdGhtaWMgbWV0aG9kIG9mIGZpbmRpbmcgdGhlIGhpZ2hlc3QgbGV2ZWwgYXQgd2hpY2ggYSBkb21haW4gbWF5IGJlIHJlZ2lzdGVyZWQgZm9yIGEgcGFydGljdWxhciB0b3AtbGV2ZWwgZG9tYWluICh0aGUgcG9saWNpZXMgZGlmZmVyIHdpdGggZWFjaCByZWdpc3RyeSksIHRoZSBvbmx5IG1ldGhvZCBpcyB0byBjcmVhdGUgYSBsaXN0IG9mIGFsbCB0b3AtbGV2ZWwgZG9tYWlucyBhbmQgdGhlIGxldmVsIGF0IHdoaWNoIGRvbWFpbnMgY2FuIGJlIHJlZ2lzdGVyZWQuIFRoaXMgaXMgdGhlIGFpbSBvZiB0aGUgZWZmZWN0aXZlIFRMRCBsaXN0LgorCitBcyB3ZWxsIGFzIGJlaW5nIHVzZWQgdG8gcHJldmVudCBjb29raWVzIGZyb20gYmVpbmcgc2V0IHdoZXJlIHRoZXkgc2hvdWxkbid0IGJlLCB0aGUgbGlzdCBjYW4gYWxzbyBwb3RlbnRpYWxseSBiZSB1c2VkIGZvciBvdGhlciBhcHBsaWNhdGlvbnMgd2hlcmUgdGhlIHJlZ2lzdHJ5IGNvbnRyb2xsZWQgYW5kIHByaXZhdGVseSBjb250cm9sbGVkIHBhcnRzIG9mIGEgZG9tYWluIG5hbWUgbmVlZCB0byBiZSBrbm93biwgZm9yIGV4YW1wbGUgd2hlbiBncm91cGluZyBieSB0b3AtbGV2ZWwgZG9tYWlucy4KKworU291cmNlOiBodHRwczovL3dpa2kubW96aWxsYS5vcmcvUHVibGljX1N1ZmZpeF9MaXN0CisKK05vdCBjb252aW5jZWQgeWV0PyBDaGVjayBvdXQgW3RoaXMgcmVhbCB3b3JsZCBleGFtcGxlXShodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMjg4ODEwLzEyMzUyNykuCisKKworIyMgRG9lcyA8dHQ+UHVibGljU3VmZml4PC90dD4gbWFrZSByZXF1ZXN0cyB0byBQdWJsaWMgU3VmZml4IExpc3Qgd2Vic2l0ZT8KKworTm8uIDx0dD5QdWJsaWNTdWZmaXg8L3R0PiBjb21lcyB3aXRoIGEgYnVuZGxlZCBsaXN0LiBJdCBkb2VzIG5vdCBtYWtlIGFueSBIVFRQIHJlcXVlc3RzIHRvIHBhcnNlIG9yIHZhbGlkYXRlIGEgZG9tYWluLgorCisKKyMjIEZlZWRiYWNrIGFuZCBidWcgcmVwb3J0cworCitJZiB5b3UgdXNlIHRoaXMgbGlicmFyeSBhbmQgZmluZCB5b3Vyc2VsZiBtaXNzaW5nIGFueSBmdW5jdGlvbmFsaXR5LCBwbGVhc2UgW2xldCBtZSBrbm93XShtYWlsdG86d2VwcG9zQHdlcHBvcy5uZXQpLgorCitQdWxsIHJlcXVlc3RzIGFyZSB2ZXJ5IHdlbGNvbWUhIFBsZWFzZSBpbmNsdWRlIHRlc3RzIGFuZC9vciBmZWF0dXJlIGNvdmVyYWdlIGZvciBldmVyeSBwYXRjaCwgYW5kIGNyZWF0ZSBhIHRvcGljIGJyYW5jaCBmb3IgZXZlcnkgc2VwYXJhdGUgY2hhbmdlIHlvdSBtYWtlLgorCitSZXBvcnQgaXNzdWVzIG9yIGZlYXR1cmUgcmVxdWVzdHMgdG8gW0dpdEh1YiBJc3N1ZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS93ZXBwb3MvcHVibGljc3VmZml4LXJ1YnkvaXNzdWVzKS4KKworCisjIyBNb3JlCisKKy0gW0hvbWVwYWdlXShodHRwczovL3NpbW9uZWNhcmxldHRpLmNvbS9jb2RlL3B1YmxpY3N1ZmZpeC1ydWJ5KQorLSBbUmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL3dlcHBvcy9wdWJsaWNzdWZmaXgtcnVieSkKKy0gW0FQSSBEb2N1bWVudGF0aW9uXShodHRwOi8vcnVieWRvYy5pbmZvL2dlbXMvcHVibGljX3N1ZmZpeCkKKy0gW0ludHJvZHVjaW5nIHRoZSBQdWJsaWMgU3VmZml4IExpc3QgbGlicmFyeSBmb3IgUnVieV0oaHR0cHM6Ly9zaW1vbmVjYXJsZXR0aS5jb20vYmxvZy8yMDEwLzA2L3B1YmxpYy1zdWZmaXgtbGlzdC1saWJyYXJ5LWZvci1ydWJ5LykKKworCisjIyBDaGFuZ2Vsb2cKKworU2VlIHRoZSBbQ0hBTkdFTE9HLm1kXShDSEFOR0VMT0cubWQpIGZpbGUgZm9yIGRldGFpbHMuCisKKworIyMgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxNyBTaW1vbmUgQ2FybGV0dGkuIFRoaXMgaXMgRnJlZSBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCisKK1RoZSBbUHVibGljIFN1ZmZpeCBMaXN0IHNvdXJjZV0oaHR0cHM6Ly9wdWJsaWNzdWZmaXgub3JnL2xpc3QvKSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9SYWtlZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvUmFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwNGI2NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvUmFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorcmVxdWlyZSAiYnVuZGxlci9nZW1fdGFza3MiCisKKyMgQnkgZGVmYXVsdCwgcnVuIHRlc3RzIGFuZCBsaW50ZXIuCit0YXNrIGRlZmF1bHQ6IFs6dGVzdCwgOnJ1Ym9jb3BdCisKKworcmVxdWlyZSAicmFrZS90ZXN0dGFzayIKKworUmFrZTo6VGVzdFRhc2submV3IGRvIHx0fAorICB0LmxpYnMgPSAldyggbGliIHRlc3QgKQorICB0LnBhdHRlcm4gPSAidGVzdC8qKi8qX3Rlc3QucmIiCisgIHQudmVyYm9zZSA9ICFFTlZbIlZFUkJPU0UiXS5uaWw/CisgIHQud2FybmluZyA9ICFFTlZbIldBUk5JTkciXS5uaWw/CitlbmQKKworcmVxdWlyZSAicnVib2NvcC9yYWtlX3Rhc2siCisKK1J1Ym9Db3A6OlJha2VUYXNrLm5ldworCisKK3JlcXVpcmUgInlhcmQvcmFrZS95YXJkb2NfdGFzayIKKworWUFSRDo6UmFrZTo6WWFyZG9jVGFzay5uZXcoOnlhcmRvYykgZG8gfHl8CisgIHkub3B0aW9ucyA9IFsiLS1vdXRwdXQtZGlyIiwgInlhcmRvYyJdCitlbmQKKworQ0xPQkJFUi5pbmNsdWRlICJ5YXJkb2MiCisKKwordGFzayA6YmVuY2htYXJrcyBkbworICBEaXJbImJlbmNobWFya3MvYm1fKi5yYiJdLmVhY2ggZG8gfGZpbGV8CisgICAgc2ggInJ1YnkgI3tmaWxlfSIKKyAgZW5kCitlbmQKK3Rhc2sgZGVmYXVsdDogWzpiZW5jaG1hcmtzXSBpZiBFTlZbIkJFTkNITUFSS1MiXSA9PSAiMSIKKworCitkZXNjICJEb3dubG9hZHMgdGhlIFB1YmxpYyBTdWZmaXggTGlzdCBmaWxlIGZyb20gdGhlIHJlcG9zaXRvcnkgYW5kIHN0b3JlcyBpdCBsb2NhbGx5LiIKK3Rhc2sgOiJ1cGRhdGUtbGlzdCIgZG8KKyAgcmVxdWlyZSAibmV0L2h0dHAiCisKKyAgREVGSU5JVElPTl9VUkwgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3B1YmxpY3N1ZmZpeC9saXN0L21hc3Rlci9wdWJsaWNfc3VmZml4X2xpc3QuZGF0Ii5mcmVlemUKKworICBGaWxlLm9wZW4oImRhdGEvbGlzdC50eHQiLCAidysiKSBkbyB8ZnwKKyAgICByZXNwb25zZSA9IE5ldDo6SFRUUC5nZXRfcmVzcG9uc2UoVVJJLnBhcnNlKERFRklOSVRJT05fVVJMKSkKKyAgICByZXNwb25zZS5ib2R5CisgICAgZi53cml0ZShyZXNwb25zZS5ib2R5KQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9iaW4vY29uc29sZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvYmluL2NvbnNvbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmQwZjczOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvYmluL2NvbnNvbGUKQEAgLTAsMCArMSwxNCBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorCityZXF1aXJlICJidW5kbGVyL3NldHVwIgorcmVxdWlyZSAicHVibGljX3N1ZmZpeCIKKworIyBZb3UgY2FuIGFkZCBmaXh0dXJlcyBhbmQvb3IgaW5pdGlhbGl6YXRpb24gY29kZSBoZXJlIHRvIG1ha2UgZXhwZXJpbWVudGluZworIyB3aXRoIHlvdXIgZ2VtIGVhc2llci4gWW91IGNhbiBhbHNvIHVzZSBhIGRpZmZlcmVudCBjb25zb2xlLCBpZiB5b3UgbGlrZS4KKworIyAoSWYgeW91IHVzZSB0aGlzLCBkb24ndCBmb3JnZXQgdG8gYWRkIHByeSB0byB5b3VyIEdlbWZpbGUhKQorIyByZXF1aXJlICJwcnkiCisjIFByeS5zdGFydAorCityZXF1aXJlICJpcmIiCitJUkIuc3RhcnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvZGF0YS9saXN0LnR4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvZGF0YS9saXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjU4YmRkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9kYXRhL2xpc3QudHh0CkBAIC0wLDAgKzEsMTIyMjUgQEAKKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWMKKy8vIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKy8vIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBQbGVhc2UgcHVsbCB0aGlzIGxpc3QgZnJvbSwgYW5kIG9ubHkgZnJvbSBodHRwczovL3B1YmxpY3N1ZmZpeC5vcmcvbGlzdC9wdWJsaWNfc3VmZml4X2xpc3QuZGF0LAorLy8gcmF0aGVyIHRoYW4gYW55IG90aGVyIFZDUyBzaXRlcy4gUHVsbGluZyBmcm9tIGFueSBvdGhlciBVUkwgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkLgorCisvLyBJbnN0cnVjdGlvbnMgb24gcHVsbGluZyBhbmQgdXNpbmcgdGhpcyBsaXN0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3B1YmxpY3N1ZmZpeC5vcmcvbGlzdC8uCisKKy8vID09PUJFR0lOIElDQU5OIERPTUFJTlM9PT0KKworLy8gYWMgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYWMKK2FjCitjb20uYWMKK2VkdS5hYworZ292LmFjCituZXQuYWMKK21pbC5hYworb3JnLmFjCisKKy8vIGFkIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmFkCithZAorbm9tLmFkCisKKy8vIGFlIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmFlCisvLyBzZWUgYWxzbzogIkRvbWFpbiBOYW1lIEVsaWdpYmlsaXR5IFBvbGljeSIgYXQgaHR0cDovL3d3dy5hZWRhLmFlL2VuZy9hZXBvbGljeS5waHAKK2FlCitjby5hZQorbmV0LmFlCitvcmcuYWUKK3NjaC5hZQorYWMuYWUKK2dvdi5hZQorbWlsLmFlCisKKy8vIGFlcm8gOiBzZWUgaHR0cHM6Ly93d3cuaW5mb3JtYXRpb24uYWVyby9pbmRleC5waHA/aWQ9NjYKK2Flcm8KK2FjY2lkZW50LWludmVzdGlnYXRpb24uYWVybworYWNjaWRlbnQtcHJldmVudGlvbi5hZXJvCithZXJvYmF0aWMuYWVybworYWVyb2NsdWIuYWVybworYWVyb2Ryb21lLmFlcm8KK2FnZW50cy5hZXJvCithaXJjcmFmdC5hZXJvCithaXJsaW5lLmFlcm8KK2FpcnBvcnQuYWVybworYWlyLXN1cnZlaWxsYW5jZS5hZXJvCithaXJ0cmFmZmljLmFlcm8KK2Fpci10cmFmZmljLWNvbnRyb2wuYWVybworYW1idWxhbmNlLmFlcm8KK2FtdXNlbWVudC5hZXJvCithc3NvY2lhdGlvbi5hZXJvCithdXRob3IuYWVybworYmFsbG9vbmluZy5hZXJvCiticm9rZXIuYWVybworY2FhLmFlcm8KK2NhcmdvLmFlcm8KK2NhdGVyaW5nLmFlcm8KK2NlcnRpZmljYXRpb24uYWVybworY2hhbXBpb25zaGlwLmFlcm8KK2NoYXJ0ZXIuYWVybworY2l2aWxhdmlhdGlvbi5hZXJvCitjbHViLmFlcm8KK2NvbmZlcmVuY2UuYWVybworY29uc3VsdGFudC5hZXJvCitjb25zdWx0aW5nLmFlcm8KK2NvbnRyb2wuYWVybworY291bmNpbC5hZXJvCitjcmV3LmFlcm8KK2Rlc2lnbi5hZXJvCitkZ2NhLmFlcm8KK2VkdWNhdG9yLmFlcm8KK2VtZXJnZW5jeS5hZXJvCitlbmdpbmUuYWVybworZW5naW5lZXIuYWVybworZW50ZXJ0YWlubWVudC5hZXJvCitlcXVpcG1lbnQuYWVybworZXhjaGFuZ2UuYWVybworZXhwcmVzcy5hZXJvCitmZWRlcmF0aW9uLmFlcm8KK2ZsaWdodC5hZXJvCitmcmVpZ2h0LmFlcm8KK2Z1ZWwuYWVybworZ2xpZGluZy5hZXJvCitnb3Zlcm5tZW50LmFlcm8KK2dyb3VuZGhhbmRsaW5nLmFlcm8KK2dyb3VwLmFlcm8KK2hhbmdnbGlkaW5nLmFlcm8KK2hvbWVidWlsdC5hZXJvCitpbnN1cmFuY2UuYWVybworam91cm5hbC5hZXJvCitqb3VybmFsaXN0LmFlcm8KK2xlYXNpbmcuYWVybworbG9naXN0aWNzLmFlcm8KK21hZ2F6aW5lLmFlcm8KK21haW50ZW5hbmNlLmFlcm8KK21lZGlhLmFlcm8KK21pY3JvbGlnaHQuYWVybworbW9kZWxsaW5nLmFlcm8KK25hdmlnYXRpb24uYWVybworcGFyYWNodXRpbmcuYWVybworcGFyYWdsaWRpbmcuYWVybworcGFzc2VuZ2VyLWFzc29jaWF0aW9uLmFlcm8KK3BpbG90LmFlcm8KK3ByZXNzLmFlcm8KK3Byb2R1Y3Rpb24uYWVybworcmVjcmVhdGlvbi5hZXJvCityZXBib2R5LmFlcm8KK3Jlcy5hZXJvCityZXNlYXJjaC5hZXJvCityb3RvcmNyYWZ0LmFlcm8KK3NhZmV0eS5hZXJvCitzY2llbnRpc3QuYWVybworc2VydmljZXMuYWVybworc2hvdy5hZXJvCitza3lkaXZpbmcuYWVybworc29mdHdhcmUuYWVybworc3R1ZGVudC5hZXJvCit0cmFkZXIuYWVybwordHJhZGluZy5hZXJvCit0cmFpbmVyLmFlcm8KK3VuaW9uLmFlcm8KK3dvcmtpbmdncm91cC5hZXJvCit3b3Jrcy5hZXJvCisKKy8vIGFmIDogaHR0cDovL3d3dy5uaWMuYWYvaGVscC5qc3AKK2FmCitnb3YuYWYKK2NvbS5hZgorb3JnLmFmCituZXQuYWYKK2VkdS5hZgorCisvLyBhZyA6IGh0dHA6Ly93d3cubmljLmFnL3ByaWNlcy5odG0KK2FnCitjb20uYWcKK29yZy5hZworbmV0LmFnCitjby5hZworbm9tLmFnCisKKy8vIGFpIDogaHR0cDovL25pYy5jb20uYWkvCithaQorb2ZmLmFpCitjb20uYWkKK25ldC5haQorb3JnLmFpCisKKy8vIGFsIDogaHR0cDovL3d3dy5lcnQuZ292LmFsL2VydF9hbGIvZmFxX2RldC5odG1sP0lkPTMxCithbAorY29tLmFsCitlZHUuYWwKK2dvdi5hbAorbWlsLmFsCituZXQuYWwKK29yZy5hbAorCisvLyBhbSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5hbQorYW0KKworLy8gYW8gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYW8KKy8vIGh0dHA6Ly93d3cuZG5zLmFvL1JFR0lTVFIuRE9DCithbworZWQuYW8KK2d2LmFvCitvZy5hbworY28uYW8KK3BiLmFvCitpdC5hbworCisvLyBhcSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5hcQorYXEKKworLy8gYXIgOiBodHRwczovL25pYy5hci9uaWMtYXJnZW50aW5hL25vcm1hdGl2YS12aWdlbnRlCithcgorY29tLmFyCitlZHUuYXIKK2dvYi5hcgorZ292LmFyCitpbnQuYXIKK21pbC5hcgorbXVzaWNhLmFyCituZXQuYXIKK29yZy5hcgordHVyLmFyCisKKy8vIGFycGEgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYXJwYQorLy8gQ29uZmlybWVkIGJ5IHJlZ2lzdHJ5IDxpYW5hLXF1ZXN0aW9uc0BpY2Fubi5vcmc+IDIwMDgtMDYtMTgKK2FycGEKK2UxNjQuYXJwYQoraW4tYWRkci5hcnBhCitpcDYuYXJwYQoraXJpcy5hcnBhCit1cmkuYXJwYQordXJuLmFycGEKKworLy8gYXMgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYXMKK2FzCitnb3YuYXMKKworLy8gYXNpYSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5hc2lhCithc2lhCisKKy8vIGF0IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmF0CisvLyBDb25maXJtZWQgYnkgcmVnaXN0cnkgPGl0QG5pYy5hdD4gMjAwOC0wNi0xNworYXQKK2FjLmF0Citjby5hdAorZ3YuYXQKK29yLmF0CisKKy8vIGF1IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmF1CisvLyBodHRwOi8vd3d3LmF1ZGEub3JnLmF1LworYXUKKy8vIDJMRHMKK2NvbS5hdQorbmV0LmF1CitvcmcuYXUKK2VkdS5hdQorZ292LmF1Cithc24uYXUKK2lkLmF1CisvLyBIaXN0b3JpYyAyTERzIChjbG9zZWQgdG8gbmV3IHJlZ2lzdHJhdGlvbiwgYnV0IHNpdGVzIHN0aWxsIGV4aXN0KQoraW5mby5hdQorY29uZi5hdQorb3ouYXUKKy8vIENHRE5zIC0gaHR0cDovL3d3dy5jZ2RuLm9yZy5hdS8KK2FjdC5hdQorbnN3LmF1CitudC5hdQorcWxkLmF1CitzYS5hdQordGFzLmF1Cit2aWMuYXUKK3dhLmF1CisvLyAzTERzCithY3QuZWR1LmF1Cituc3cuZWR1LmF1CitudC5lZHUuYXUKK3FsZC5lZHUuYXUKK3NhLmVkdS5hdQordGFzLmVkdS5hdQordmljLmVkdS5hdQord2EuZWR1LmF1CisvLyBhY3QuZ292LmF1ICBCdWcgOTg0ODI0IC0gUmVtb3ZlZCBhdCByZXF1ZXN0IG9mIEdyZWcgVGFua2FyZAorLy8gbnN3Lmdvdi5hdSAgQnVnIDU0Nzk4NSAtIFJlbW92ZWQgYXQgcmVxdWVzdCBvZiA8U2hhZS5Eb25lbGFuQHNlcnZpY2VzLm5zdy5nb3YuYXU+CisvLyBudC5nb3YuYXUgIEJ1ZyA5NDA0NzggLSBSZW1vdmVkIGF0IHJlcXVlc3Qgb2YgR3JlZyBDb25ub3JzIDxHcmVnLkNvbm5vcnNAbnQuZ292LmF1PgorcWxkLmdvdi5hdQorc2EuZ292LmF1Cit0YXMuZ292LmF1Cit2aWMuZ292LmF1Cit3YS5nb3YuYXUKKworLy8gYXcgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYXcKK2F3Citjb20uYXcKKworLy8gYXggOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYXgKK2F4CisKKy8vIGF6IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmF6CithegorY29tLmF6CituZXQuYXoKK2ludC5hegorZ292LmF6CitvcmcuYXoKK2VkdS5hegoraW5mby5hegorcHAuYXoKK21pbC5hegorbmFtZS5hegorcHJvLmF6CitiaXouYXoKKworLy8gYmEgOiBodHRwOi8vbmljLmJhL3VzZXJzX2RhdGEvZmlsZXMvcHJhdmlsbmlrX29fcmVnaXN0cmFjaWppLnBkZgorYmEKK2NvbS5iYQorZWR1LmJhCitnb3YuYmEKK21pbC5iYQorbmV0LmJhCitvcmcuYmEKKworLy8gYmIgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYmIKK2JiCitiaXouYmIKK2NvLmJiCitjb20uYmIKK2VkdS5iYgorZ292LmJiCitpbmZvLmJiCituZXQuYmIKK29yZy5iYgorc3RvcmUuYmIKK3R2LmJiCisKKy8vIGJkIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmJkCisqLmJkCisKKy8vIGJlIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmJlCisvLyBDb25maXJtZWQgYnkgcmVnaXN0cnkgPHRlY2hAZG5zLmJlPiAyMDA4LTA2LTA4CitiZQorYWMuYmUKKworLy8gYmYgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYmYKK2JmCitnb3YuYmYKKworLy8gYmcgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYmcKKy8vIGh0dHBzOi8vd3d3LnJlZ2lzdGVyLmJnL3VzZXIvc3RhdGljL3J1bGVzL2VuL2luZGV4Lmh0bWwKK2JnCithLmJnCitiLmJnCitjLmJnCitkLmJnCitlLmJnCitmLmJnCitnLmJnCitoLmJnCitpLmJnCitqLmJnCitrLmJnCitsLmJnCittLmJnCituLmJnCitvLmJnCitwLmJnCitxLmJnCityLmJnCitzLmJnCit0LmJnCit1LmJnCit2LmJnCit3LmJnCit4LmJnCit5LmJnCit6LmJnCiswLmJnCisxLmJnCisyLmJnCiszLmJnCis0LmJnCis1LmJnCis2LmJnCis3LmJnCis4LmJnCis5LmJnCisKKy8vIGJoIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmJoCitiaAorY29tLmJoCitlZHUuYmgKK25ldC5iaAorb3JnLmJoCitnb3YuYmgKKworLy8gYmkgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYmkKKy8vIGh0dHA6Ly93aG9pcy5uaWMuYmkvCitiaQorY28uYmkKK2NvbS5iaQorZWR1LmJpCitvci5iaQorb3JnLmJpCisKKy8vIGJpeiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5iaXoKK2JpegorCisvLyBiaiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5iagorYmoKK2Fzc28uYmoKK2JhcnJlYXUuYmoKK2dvdXYuYmoKKworLy8gYm0gOiBodHRwOi8vd3d3LmJlcm11ZGFuaWMuYm0vZG5yLXRleHQudHh0CitibQorY29tLmJtCitlZHUuYm0KK2dvdi5ibQorbmV0LmJtCitvcmcuYm0KKworLy8gYm4gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYm4KKyouYm4KKworLy8gYm8gOiBodHRwOi8vd3d3Lm5pYy5iby8KK2JvCitjb20uYm8KK2VkdS5ibworZ292LmJvCitnb2IuYm8KK2ludC5ibworb3JnLmJvCituZXQuYm8KK21pbC5ibwordHYuYm8KKworLy8gYnIgOiBodHRwOi8vcmVnaXN0cm8uYnIvZG9taW5pby9jYXRlZ29yaWEuaHRtbAorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxmbmV2ZXNAcmVnaXN0cm8uYnI+CiticgorYWRtLmJyCithZHYuYnIKK2Fnci5icgorYW0uYnIKK2FycS5icgorYXJ0LmJyCithdG8uYnIKK2IuYnIKK2JlbGVtLmJyCitiaW8uYnIKK2Jsb2cuYnIKK2JtZC5icgorY2ltLmJyCitjbmcuYnIKK2NudC5icgorY29tLmJyCitjb29wLmJyCitjcmkuYnIKK2RlZi5icgorZWNuLmJyCitlY28uYnIKK2VkdS5icgorZW1wLmJyCitlbmcuYnIKK2VzcC5icgorZXRjLmJyCitldGkuYnIKK2Zhci5icgorZmxvZy5icgorZmxvcmlwYS5icgorZm0uYnIKK2ZuZC5icgorZm90LmJyCitmc3QuYnIKK2cxMi5icgorZ2dmLmJyCitnb3YuYnIKKy8vIGdvdi5iciAyNiBzdGF0ZXMgKyBkZiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdGF0ZXNfb2ZfQnJhemlsCithYy5nb3YuYnIKK2FsLmdvdi5icgorYW0uZ292LmJyCithcC5nb3YuYnIKK2JhLmdvdi5icgorY2UuZ292LmJyCitkZi5nb3YuYnIKK2VzLmdvdi5icgorZ28uZ292LmJyCittYS5nb3YuYnIKK21nLmdvdi5icgorbXMuZ292LmJyCittdC5nb3YuYnIKK3BhLmdvdi5icgorcGIuZ292LmJyCitwZS5nb3YuYnIKK3BpLmdvdi5icgorcHIuZ292LmJyCityai5nb3YuYnIKK3JuLmdvdi5icgorcm8uZ292LmJyCityci5nb3YuYnIKK3JzLmdvdi5icgorc2MuZ292LmJyCitzZS5nb3YuYnIKK3NwLmdvdi5icgordG8uZ292LmJyCitpbWIuYnIKK2luZC5icgoraW5mLmJyCitqYW1wYS5icgoram9yLmJyCitqdXMuYnIKK2xlZy5icgorbGVsLmJyCittYXQuYnIKK21lZC5icgorbWlsLmJyCittcC5icgorbXVzLmJyCituZXQuYnIKKyoubm9tLmJyCitub3QuYnIKK250ci5icgorb2RvLmJyCitvcmcuYnIKK3BvYS5icgorcHBnLmJyCitwcm8uYnIKK3BzYy5icgorcHNpLmJyCitxc2wuYnIKK3JhZGlvLmJyCityZWMuYnIKK3JlY2lmZS5icgorc2xnLmJyCitzcnYuYnIKK3RheGkuYnIKK3Rlby5icgordG1wLmJyCit0cmQuYnIKK3R1ci5icgordHYuYnIKK3ZldC5icgordml4LmJyCit2bG9nLmJyCit3aWtpLmJyCit6bGcuYnIKKworLy8gYnMgOiBodHRwOi8vd3d3Lm5pYy5icy9ydWxlcy5odG1sCiticworY29tLmJzCituZXQuYnMKK29yZy5icworZWR1LmJzCitnb3YuYnMKKworLy8gYnQgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYnQKK2J0Citjb20uYnQKK2VkdS5idAorZ292LmJ0CituZXQuYnQKK29yZy5idAorCisvLyBidiA6IE5vIHJlZ2lzdHJhdGlvbnMgYXQgdGhpcyB0aW1lLgorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxqYXJsZUB1bmluZXR0Lm5vPgorYnYKKworLy8gYncgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uYncKKy8vIGh0dHA6Ly93d3cuZ29iaW4uaW5mby9kb21haW5uYW1lL2J3LmRvYworLy8gbGlzdCBvZiBvdGhlciAybmQgbGV2ZWwgdGxkcyA/CitidworY28uYncKK29yZy5idworCisvLyBieSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5ieQorLy8gaHR0cDovL3RsZC5ieS9ydWxlc18yMDA2X2VuLmh0bWwKKy8vIGxpc3Qgb2Ygb3RoZXIgMm5kIGxldmVsIHRsZHMgPworYnkKK2dvdi5ieQorbWlsLmJ5CisvLyBPZmZpY2lhbCBpbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGNvbS5ieSBpcyBhIHJlc2VydmVkCisvLyBzZWNvbmQtbGV2ZWwgZG9tYWluLCBidXQgaXQncyBiZWluZyB1c2VkIGFzIG9uZSAoc2VlIHd3dy5nb29nbGUuY29tLmJ5IGFuZAorLy8gd3d3LnlhaG9vLmNvbS5ieSwgZm9yIGV4YW1wbGUpLCBzbyB3ZSBsaXN0IGl0IGhlcmUgZm9yIHNhZmV0eSdzIHNha2UuCitjb20uYnkKKworLy8gaHR0cDovL2hvc3Rlci5ieS8KK29mLmJ5CisKKy8vIGJ6IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmJ6CisvLyBodHRwOi8vd3d3LmJlbGl6ZW5pYy5iei8KK2J6Citjb20uYnoKK25ldC5iegorb3JnLmJ6CitlZHUuYnoKK2dvdi5iegorCisvLyBjYSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jYQorY2EKKy8vIGNhIGdlb2dyYXBoaWNhbCBuYW1lcworYWIuY2EKK2JjLmNhCittYi5jYQorbmIuY2EKK25mLmNhCitubC5jYQorbnMuY2EKK250LmNhCitudS5jYQorb24uY2EKK3BlLmNhCitxYy5jYQorc2suY2EKK3lrLmNhCisvLyBnYy5jYTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmdjLmNhCisvLyBzZWUgYWxzbzogaHR0cDovL3JlZ2lzdHJ5LmdjLmNhL2VuL1N1YmRvbWFpbkZBUQorZ2MuY2EKKworLy8gY2F0IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmNhdAorY2F0CisKKy8vIGNjIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmNjCitjYworCisvLyBjZCA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jZAorLy8gc2VlIGFsc286IGh0dHBzOi8vd3d3Lm5pYy5jZC9kb21haW4vaW5zZXJ0RG9tYWluXzIuanNwP2FjdD0xCitjZAorZ292LmNkCisKKy8vIGNmIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmNmCitjZgorCisvLyBjZyA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jZworY2cKKworLy8gY2ggOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uY2gKK2NoCisKKy8vIGNpIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmNpCisvLyBodHRwOi8vd3d3Lm5pYy5jaS9pbmRleC5waHA/cGFnZT1jaGFydGUKK2NpCitvcmcuY2kKK29yLmNpCitjb20uY2kKK2NvLmNpCitlZHUuY2kKK2VkLmNpCithYy5jaQorbmV0LmNpCitnby5jaQorYXNzby5jaQorYcOpcm9wb3J0LmNpCitpbnQuY2kKK3ByZXNzZS5jaQorbWQuY2kKK2dvdXYuY2kKKworLy8gY2sgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uY2sKKyouY2sKKyF3d3cuY2sKKworLy8gY2wgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uY2wKK2NsCitnb3YuY2wKK2dvYi5jbAorY28uY2wKK21pbC5jbAorCisvLyBjbSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jbSBwbHVzIGJ1ZyA5ODE5MjcKK2NtCitjby5jbQorY29tLmNtCitnb3YuY20KK25ldC5jbQorCisvLyBjbiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jbgorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDx0YW55YWxpbmdAY25uaWMuY24+CitjbgorYWMuY24KK2NvbS5jbgorZWR1LmNuCitnb3YuY24KK25ldC5jbgorb3JnLmNuCittaWwuY24KK+WFrOWPuC5jbgor572R57ucLmNuCivntrLntaEuY24KKy8vIGNuIGdlb2dyYXBoaWMgbmFtZXMKK2FoLmNuCitiai5jbgorY3EuY24KK2ZqLmNuCitnZC5jbgorZ3MuY24KK2d6LmNuCitneC5jbgoraGEuY24KK2hiLmNuCitoZS5jbgoraGkuY24KK2hsLmNuCitobi5jbgoramwuY24KK2pzLmNuCitqeC5jbgorbG4uY24KK25tLmNuCitueC5jbgorcWguY24KK3NjLmNuCitzZC5jbgorc2guY24KK3NuLmNuCitzeC5jbgordGouY24KK3hqLmNuCit4ei5jbgoreW4uY24KK3pqLmNuCitoay5jbgorbW8uY24KK3R3LmNuCisKKy8vIGNvIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmNvCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPHRlY25pY29AdW5pYW5kZXMuZWR1LmNvPgorY28KK2FydHMuY28KK2NvbS5jbworZWR1LmNvCitmaXJtLmNvCitnb3YuY28KK2luZm8uY28KK2ludC5jbworbWlsLmNvCituZXQuY28KK25vbS5jbworb3JnLmNvCityZWMuY28KK3dlYi5jbworCisvLyBjb20gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uY29tCitjb20KKworLy8gY29vcCA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jb29wCitjb29wCisKKy8vIGNyIDogaHR0cDovL3d3dy5uaWMuY3IvbmljY3JfcHVibGljby9zaG93UmVnaXN0cm9Eb21pbmlvc1NjcmVlbi5kbworY3IKK2FjLmNyCitjby5jcgorZWQuY3IKK2ZpLmNyCitnby5jcgorb3IuY3IKK3NhLmNyCisKKy8vIGN1IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmN1CitjdQorY29tLmN1CitlZHUuY3UKK29yZy5jdQorbmV0LmN1Citnb3YuY3UKK2luZi5jdQorCisvLyBjdiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jdgorY3YKKworLy8gY3cgOiBodHRwOi8vd3d3LnVuYS5jdy9jd19yZWdpc3RyeS8KKy8vIENvbmZpcm1lZCBieSByZWdpc3RyeSA8cmVnaXN0cnlAdW5hLm5ldD4gMjAxMy0wMy0yNgorY3cKK2NvbS5jdworZWR1LmN3CituZXQuY3cKK29yZy5jdworCisvLyBjeCA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jeAorLy8gbGlzdCBvZiBvdGhlciAybmQgbGV2ZWwgdGxkcyA/CitjeAorZ292LmN4CisKKy8vIGN5IDogaHR0cDovL3d3dy5uaWMuY3kvCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgUGFuYXlpb3RvdSBGb3RpYSA8Y3lkbnNAdWN5LmFjLmN5PgorY3kKK2FjLmN5CitiaXouY3kKK2NvbS5jeQorZWtsb2dlcy5jeQorZ292LmN5CitsdGQuY3kKK25hbWUuY3kKK25ldC5jeQorb3JnLmN5CitwYXJsaWFtZW50LmN5CitwcmVzcy5jeQorcHJvLmN5Cit0bS5jeQorCisvLyBjeiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jegorY3oKKworLy8gZGUgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZGUKKy8vIENvbmZpcm1lZCBieSByZWdpc3RyeSA8b3BzQGRlbmljLmRlPiAod2l0aCB0ZWNobmljYWwKKy8vIHJlc2VydmF0aW9ucykgMjAwOC0wNy0wMQorZGUKKworLy8gZGogOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZGoKK2RqCisKKy8vIGRrIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmRrCisvLyBDb25maXJtZWQgYnkgcmVnaXN0cnkgPHJvYmVydEBkay1ob3N0bWFzdGVyLmRrPiAyMDA4LTA2LTE3CitkaworCisvLyBkbSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5kbQorZG0KK2NvbS5kbQorbmV0LmRtCitvcmcuZG0KK2VkdS5kbQorZ292LmRtCisKKy8vIGRvIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmRvCitkbworYXJ0LmRvCitjb20uZG8KK2VkdS5kbworZ29iLmRvCitnb3YuZG8KK21pbC5kbworbmV0LmRvCitvcmcuZG8KK3NsZC5kbword2ViLmRvCisKKy8vIGR6IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmR6CitkegorY29tLmR6CitvcmcuZHoKK25ldC5kegorZ292LmR6CitlZHUuZHoKK2Fzc28uZHoKK3BvbC5kegorYXJ0LmR6CisKKy8vIGVjIDogaHR0cDovL3d3dy5uaWMuZWMvcmVnL3Bhc28xLmFzcAorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDx2YWJib3VkQG5pYy5lYz4KK2VjCitjb20uZWMKK2luZm8uZWMKK25ldC5lYworZmluLmVjCitrMTIuZWMKK21lZC5lYworcHJvLmVjCitvcmcuZWMKK2VkdS5lYworZ292LmVjCitnb2IuZWMKK21pbC5lYworCisvLyBlZHUgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZWR1CitlZHUKKworLy8gZWUgOiBodHRwOi8vd3d3LmVlbmV0LmVlL0VFTmV0L2RvbV9yZWVnbGlkLmh0bWwjbGlzYV9CCitlZQorZWR1LmVlCitnb3YuZWUKK3JpaWsuZWUKK2xpYi5lZQorbWVkLmVlCitjb20uZWUKK3ByaS5lZQorYWlwLmVlCitvcmcuZWUKK2ZpZS5lZQorCisvLyBlZyA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5lZworZWcKK2NvbS5lZworZWR1LmVnCitldW4uZWcKK2dvdi5lZworbWlsLmVnCituYW1lLmVnCituZXQuZWcKK29yZy5lZworc2NpLmVnCisKKy8vIGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmVyCisqLmVyCisKKy8vIGVzIDogaHR0cHM6Ly93d3cubmljLmVzL3NpdGVfaW5nbGVzL2luZ2xlcy9kb21pbmlvcy9pbmRleC5odG1sCitlcworY29tLmVzCitub20uZXMKK29yZy5lcworZ29iLmVzCitlZHUuZXMKKworLy8gZXQgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZXQKK2V0Citjb20uZXQKK2dvdi5ldAorb3JnLmV0CitlZHUuZXQKK2Jpei5ldAorbmFtZS5ldAoraW5mby5ldAorbmV0LmV0CisKKy8vIGV1IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmV1CitldQorCisvLyBmaSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5maQorZmkKKy8vIGFsYW5kLmZpIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmF4CisvLyBUaGlzIGRvbWFpbiBpcyBiZWluZyBwaGFzZWQgb3V0IGluIGZhdm9yIG9mIC5heC4gQXMgdGhlcmUgYXJlIHN0aWxsIG1hbnkKKy8vIGRvbWFpbnMgdW5kZXIgYWxhbmQuZmksIHdlIHN0aWxsIGtlZXAgaXQgb24gdGhlIGxpc3QgdW50aWwgYWxhbmQuZmkgaXMKKy8vIGNvbXBsZXRlbHkgcmVtb3ZlZC4KKy8vIFRPRE86IENoZWNrIGZvciB1cGRhdGVzIChleHBlY3RlZCB0byBiZSBwaGFzZWQgb3V0IGFyb3VuZCBRMS8yMDA5KQorYWxhbmQuZmkKKworLy8gZmogOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZmoKKyouZmoKKworLy8gZmsgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZmsKKyouZmsKKworLy8gZm0gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZm0KK2ZtCisKKy8vIGZvIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmZvCitmbworCisvLyBmciA6IGh0dHA6Ly93d3cuYWZuaWMuZnIvCisvLyBkb21haW5lcyBkZXNjcmlwdGlmcyA6IGh0dHA6Ly93d3cuYWZuaWMuZnIvb2J0ZW5pci9jaGFydGVzL25vbW1hZ2UtZnIvYW5uZXhlLWRlc2NyaXB0aWZzCitmcgorY29tLmZyCithc3NvLmZyCitub20uZnIKK3ByZC5mcgorcHJlc3NlLmZyCit0bS5mcgorLy8gZG9tYWluZXMgc2VjdG9yaWVscyA6IGh0dHA6Ly93d3cuYWZuaWMuZnIvb2J0ZW5pci9jaGFydGVzL25vbW1hZ2UtZnIvYW5uZXhlLXNlY3RvcmllbHMKK2Flcm9wb3J0LmZyCithc3NlZGljLmZyCithdm9jYXQuZnIKK2F2b3Vlcy5mcgorY2NpLmZyCitjaGFtYmFncmkuZnIKK2NoaXJ1cmdpZW5zLWRlbnRpc3Rlcy5mcgorZXhwZXJ0cy1jb21wdGFibGVzLmZyCitnZW9tZXRyZS1leHBlcnQuZnIKK2dvdXYuZnIKK2dyZXRhLmZyCitodWlzc2llci1qdXN0aWNlLmZyCittZWRlY2luLmZyCitub3RhaXJlcy5mcgorcGhhcm1hY2llbi5mcgorcG9ydC5mcgordmV0ZXJpbmFpcmUuZnIKKworLy8gZ2EgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZ2EKK2dhCisKKy8vIGdiIDogVGhpcyByZWdpc3RyeSBpcyBlZmZlY3RpdmVseSBkb3JtYW50CisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPERhbWllbi5TaGF3QGphLm5ldD4KK2diCisKKy8vIGdkIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmdkCitnZAorCisvLyBnZSA6IGh0dHA6Ly93d3cubmljLm5ldC5nZS9wb2xpY3lfZW4ucGRmCitnZQorY29tLmdlCitlZHUuZ2UKK2dvdi5nZQorb3JnLmdlCittaWwuZ2UKK25ldC5nZQorcHZ0LmdlCisKKy8vIGdmIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmdmCitnZgorCisvLyBnZyA6IGh0dHA6Ly93d3cuY2hhbm5lbGlzbGVzLm5ldC9yZWdpc3Rlci1kb21haW5zLworLy8gQ29uZmlybWVkIGJ5IHJlZ2lzdHJ5IDxuaWdlbEBjaGFubmVsaXNsZXMubmV0PiAyMDEzLTExLTI4CitnZworY28uZ2cKK25ldC5nZworb3JnLmdnCisKKy8vIGdoIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmdoCisvLyBzZWUgYWxzbzogaHR0cDovL3d3dy5uaWMuZ2gvcmVnX25vdy5waHAKKy8vIEFsdGhvdWdoIGRvbWFpbnMgZGlyZWN0bHkgYXQgc2Vjb25kIGxldmVsIGFyZSBub3QgcG9zc2libGUgYXQgdGhlIG1vbWVudCwKKy8vIHRoZXkgaGF2ZSBiZWVuIHBvc3NpYmxlIGZvciBzb21lIHRpbWUgYW5kIG1heSBjb21lIGJhY2suCitnaAorY29tLmdoCitlZHUuZ2gKK2dvdi5naAorb3JnLmdoCittaWwuZ2gKKworLy8gZ2kgOiBodHRwOi8vd3d3Lm5pYy5naS9ydWxlcy5odG1sCitnaQorY29tLmdpCitsdGQuZ2kKK2dvdi5naQorbW9kLmdpCitlZHUuZ2kKK29yZy5naQorCisvLyBnbCA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5nbAorLy8gaHR0cDovL25pYy5nbAorZ2wKK2NvLmdsCitjb20uZ2wKK2VkdS5nbAorbmV0LmdsCitvcmcuZ2wKKworLy8gZ20gOiBodHRwOi8vd3d3Lm5pYy5nbS9odG1scGFnZXMlNUNnbS1wb2xpY3kuaHRtCitnbQorCisvLyBnbiA6IGh0dHA6Ly9wc2cuY29tL2Rucy9nbi9nbi50eHQKKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8cmFuZHlAcHNnLmNvbT4KK2duCithYy5nbgorY29tLmduCitlZHUuZ24KK2dvdi5nbgorb3JnLmduCituZXQuZ24KKworLy8gZ292IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmdvdgorZ292CisKKy8vIGdwIDogaHR0cDovL3d3dy5uaWMuZ3AvaW5kZXgucGhwP2xhbmc9ZW4KK2dwCitjb20uZ3AKK25ldC5ncAorbW9iaS5ncAorZWR1LmdwCitvcmcuZ3AKK2Fzc28uZ3AKKworLy8gZ3EgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZ3EKK2dxCisKKy8vIGdyIDogaHR0cHM6Ly9ncndlYi5pY3MuZm9ydGguZ3IvZW5nbGlzaC8xNjE3LUItMjAwNS5odG1sCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPHNlZ3JlZEBpY3MuZm9ydGguZ3I+CitncgorY29tLmdyCitlZHUuZ3IKK25ldC5ncgorb3JnLmdyCitnb3YuZ3IKKworLy8gZ3MgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZ3MKK2dzCisKKy8vIGd0IDogaHR0cDovL3d3dy5ndC9wb2xpdGljYXNfZGVfcmVnaXN0cm8uaHRtbAorZ3QKK2NvbS5ndAorZWR1Lmd0Citnb2IuZ3QKK2luZC5ndAorbWlsLmd0CituZXQuZ3QKK29yZy5ndAorCisvLyBndSA6IGh0dHA6Ly9nYWRhby5nb3YuZ3UvcmVnaXN0cmF0aW9uLnR4dAorKi5ndQorCisvLyBndyA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5ndworZ3cKKworLy8gZ3kgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uZ3kKKy8vIGh0dHA6Ly9yZWdpc3RyeS5neS8KK2d5Citjby5neQorY29tLmd5CitlZHUuZ3kKK2dvdi5neQorbmV0Lmd5CitvcmcuZ3kKKworLy8gaGsgOiBodHRwczovL3d3dy5oa2Ruci5oaworLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxoay50ZWNoQGhraXJjLmhrPgoraGsKK2NvbS5oaworZWR1LmhrCitnb3YuaGsKK2lkdi5oaworbmV0LmhrCitvcmcuaGsKK+WFrOWPuC5oawor5pWZ6IKyLmhrCivmlY7ogrIuaGsKK+aUv+W6nC5oawor5YCL5Lq6LmhrCivkuKrkurouaGsKK+euh+S6ui5oawor57ay57ucLmhrCivnvZHnu5wuaGsKK+e7hOe5lC5oawor57ay57WhLmhrCivnvZHntaEuaGsKK+e7hOe7hy5oawor57WE57mULmhrCivntYTnu4cuaGsKKworLy8gaG0gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uaG0KK2htCisKKy8vIGhuIDogaHR0cDovL3d3dy5uaWMuaG4vcG9saXRpY2FzL3BzMDIsLDA1Lmh0bWwKK2huCitjb20uaG4KK2VkdS5obgorb3JnLmhuCituZXQuaG4KK21pbC5obgorZ29iLmhuCisKKy8vIGhyIDogaHR0cDovL3d3dy5kbnMuaHIvZG9jdW1lbnRzL3BkZi9IUlRMRC1yZWd1bGF0aW9ucy5wZGYKK2hyCitpei5ocgorZnJvbS5ocgorbmFtZS5ocgorY29tLmhyCisKKy8vIGh0IDogaHR0cDovL3d3dy5uaWMuaHQvaW5mby9jaGFydGUuY2ZtCitodAorY29tLmh0CitzaG9wLmh0CitmaXJtLmh0CitpbmZvLmh0CithZHVsdC5odAorbmV0Lmh0Citwcm8uaHQKK29yZy5odAorbWVkLmh0CithcnQuaHQKK2Nvb3AuaHQKK3BvbC5odAorYXNzby5odAorZWR1Lmh0CityZWwuaHQKK2dvdXYuaHQKK3BlcnNvLmh0CisKKy8vIGh1IDogaHR0cDovL3d3dy5kb21haW4uaHUvZG9tYWluL0VuZ2xpc2gvc2xkLmh0bWwKKy8vIENvbmZpcm1lZCBieSByZWdpc3RyeSA8cGFzenRvckBpc3p0Lmh1PiAyMDA4LTA2LTEyCitodQorY28uaHUKK2luZm8uaHUKK29yZy5odQorcHJpdi5odQorc3BvcnQuaHUKK3RtLmh1CisyMDAwLmh1CithZ3Jhci5odQorYm9sdC5odQorY2FzaW5vLmh1CitjaXR5Lmh1Citlcm90aWNhLmh1Citlcm90aWthLmh1CitmaWxtLmh1Citmb3J1bS5odQorZ2FtZXMuaHUKK2hvdGVsLmh1CitpbmdhdGxhbi5odQoram9nYXN6Lmh1Citrb255dmVsby5odQorbGFrYXMuaHUKK21lZGlhLmh1CituZXdzLmh1CityZWtsYW0uaHUKK3NleC5odQorc2hvcC5odQorc3VsaS5odQorc3pleC5odQordG96c2RlLmh1Cit1dGF6YXMuaHUKK3ZpZGVvLmh1CisKKy8vIGlkIDogaHR0cHM6Ly9yZWdpc3Rlci5wYW5kaS5vci5pZC8KK2lkCithYy5pZAorYml6LmlkCitjby5pZAorZGVzYS5pZAorZ28uaWQKK21pbC5pZAorbXkuaWQKK25ldC5pZAorb3IuaWQKK3NjaC5pZAord2ViLmlkCisKKy8vIGllIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmllCitpZQorZ292LmllCisKKy8vIGlsIDogaHR0cDovL3d3dy5pc29jLm9yZy5pbC9kb21haW5zLworaWwKK2FjLmlsCitjby5pbAorZ292LmlsCitpZGYuaWwKK2sxMi5pbAorbXVuaS5pbAorbmV0LmlsCitvcmcuaWwKKworLy8gaW0gOiBodHRwczovL3d3dy5uaWMuaW0vCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPGluZm9AbmljLmltPgoraW0KK2FjLmltCitjby5pbQorY29tLmltCitsdGQuY28uaW0KK25ldC5pbQorb3JnLmltCitwbGMuY28uaW0KK3R0LmltCit0di5pbQorCisvLyBpbiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5pbgorLy8gc2VlIGFsc286IGh0dHBzOi8vcmVnaXN0cnkuaW4vUG9saWNpZXMKKy8vIFBsZWFzZSBub3RlLCB0aGF0IG5pYy5pbiBpcyBub3QgYW4gb2ZmaWNpYWwgZVRMRCwgYnV0IHVzZWQgYnkgbW9zdAorLy8gZ292ZXJubWVudCBpbnN0aXR1dGlvbnMuCitpbgorY28uaW4KK2Zpcm0uaW4KK25ldC5pbgorb3JnLmluCitnZW4uaW4KK2luZC5pbgorbmljLmluCithYy5pbgorZWR1LmluCityZXMuaW4KK2dvdi5pbgorbWlsLmluCisKKy8vIGluZm8gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uaW5mbworaW5mbworCisvLyBpbnQgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uaW50CisvLyBDb25maXJtZWQgYnkgcmVnaXN0cnkgPGlhbmEtcXVlc3Rpb25zQGljYW5uLm9yZz4gMjAwOC0wNi0xOAoraW50CitldS5pbnQKKworLy8gaW8gOiBodHRwOi8vd3d3Lm5pYy5pby9ydWxlcy5odG1sCisvLyBsaXN0IG9mIG90aGVyIDJuZCBsZXZlbCB0bGRzID8KK2lvCitjb20uaW8KKworLy8gaXEgOiBodHRwOi8vd3d3LmNtYy5pcS9lbmdsaXNoL2lxL2lxcmVnaXN0ZXIxLmh0bQoraXEKK2dvdi5pcQorZWR1LmlxCittaWwuaXEKK2NvbS5pcQorb3JnLmlxCituZXQuaXEKKworLy8gaXIgOiBodHRwOi8vd3d3Lm5pYy5pci9UZXJtc19hbmRfQ29uZGl0aW9uc19pcixfQXBwZW5kaXhfMV9Eb21haW5fUnVsZXMKKy8vIEFsc28gc2VlIGh0dHA6Ly93d3cubmljLmlyL0ludGVybmF0aW9uYWxpemVkX0RvbWFpbl9OYW1lcworLy8gVHdvIDxpcmFuPi5pciBlbnRyaWVzIGFkZGVkIGF0IHJlcXVlc3Qgb2YgPHRlY2gtdGVhbUBuaWMuaXI+LCAyMDEwLTA0LTE2CitpcgorYWMuaXIKK2NvLmlyCitnb3YuaXIKK2lkLmlyCituZXQuaXIKK29yZy5pcgorc2NoLmlyCisvLyB4bi0tbWdiYTNhNGYxNmEuaXIgKDxpcmFuPi5pciwgUGVyc2lhbiBZRUgpCivYp9uM2LHYp9mGLmlyCisvLyB4bi0tbWdiYTNhNGZyYS5pciAoPGlyYW4+LmlyLCBBcmFiaWMgWUVIKQor2KfZitix2KfZhi5pcgorCisvLyBpcyA6IGh0dHA6Ly93d3cuaXNuaWMuaXMvZG9tYWluL3J1bGVzLnBocAorLy8gQ29uZmlybWVkIGJ5IHJlZ2lzdHJ5IDxtYXJpdXNAaXNnYXRlLmlzPiAyMDA4LTEyLTA2CitpcworbmV0LmlzCitjb20uaXMKK2VkdS5pcworZ292LmlzCitvcmcuaXMKK2ludC5pcworCisvLyBpdCA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5pdAoraXQKK2dvdi5pdAorZWR1Lml0CisvLyBSZXNlcnZlZCBnZW8tbmFtZXM6CisvLyBodHRwOi8vd3d3Lm5pYy5pdC9kb2N1bWVudGkvcmVnb2xhbWVudGktZS1saW5lZS1ndWlkYS9yZWdvbGFtZW50by1hc3NlZ25hemlvbmUtdmVyc2lvbmUtNi4wLnBkZgorLy8gVGhlcmUgaXMgYWxzbyBhIGxpc3Qgb2YgcmVzZXJ2ZWQgZ2VvLW5hbWVzIGNvcnJlc3BvbmRpbmcgdG8gSXRhbGlhbiBtdW5pY2lwYWxpdGllcworLy8gaHR0cDovL3d3dy5uaWMuaXQvZG9jdW1lbnRpL2FwcGVuZGljZS1jLnBkZiwgYnV0IGl0IGlzIG5vdCBpbmNsdWRlZCBoZXJlLgorLy8gUmVnaW9ucworYWJyLml0CithYnJ1enpvLml0Cithb3N0YS12YWxsZXkuaXQKK2Fvc3RhdmFsbGV5Lml0CitiYXMuaXQKK2Jhc2lsaWNhdGEuaXQKK2NhbC5pdAorY2FsYWJyaWEuaXQKK2NhbS5pdAorY2FtcGFuaWEuaXQKK2VtaWxpYS1yb21hZ25hLml0CitlbWlsaWFyb21hZ25hLml0CitlbXIuaXQKK2ZyaXVsaS12LWdpdWxpYS5pdAorZnJpdWxpLXZlLWdpdWxpYS5pdAorZnJpdWxpLXZlZ2l1bGlhLml0Citmcml1bGktdmVuZXppYS1naXVsaWEuaXQKK2ZyaXVsaS12ZW5lemlhZ2l1bGlhLml0Citmcml1bGktdmdpdWxpYS5pdAorZnJpdWxpdi1naXVsaWEuaXQKK2ZyaXVsaXZlLWdpdWxpYS5pdAorZnJpdWxpdmVnaXVsaWEuaXQKK2ZyaXVsaXZlbmV6aWEtZ2l1bGlhLml0Citmcml1bGl2ZW5lemlhZ2l1bGlhLml0Citmcml1bGl2Z2l1bGlhLml0CitmdmcuaXQKK2xhei5pdAorbGF6aW8uaXQKK2xpZy5pdAorbGlndXJpYS5pdAorbG9tLml0Citsb21iYXJkaWEuaXQKK2xvbWJhcmR5Lml0CitsdWNhbmlhLml0CittYXIuaXQKK21hcmNoZS5pdAorbW9sLml0Cittb2xpc2UuaXQKK3BpZWRtb250Lml0CitwaWVtb250ZS5pdAorcG1uLml0CitwdWcuaXQKK3B1Z2xpYS5pdAorc2FyLml0CitzYXJkZWduYS5pdAorc2FyZGluaWEuaXQKK3NpYy5pdAorc2ljaWxpYS5pdAorc2ljaWx5Lml0Cit0YWEuaXQKK3Rvcy5pdAordG9zY2FuYS5pdAordHJlbnRpbm8tYS1hZGlnZS5pdAordHJlbnRpbm8tYWFkaWdlLml0Cit0cmVudGluby1hbHRvLWFkaWdlLml0Cit0cmVudGluby1hbHRvYWRpZ2UuaXQKK3RyZW50aW5vLXMtdGlyb2wuaXQKK3RyZW50aW5vLXN0aXJvbC5pdAordHJlbnRpbm8tc3VkLXRpcm9sLml0Cit0cmVudGluby1zdWR0aXJvbC5pdAordHJlbnRpbm8tc3VlZC10aXJvbC5pdAordHJlbnRpbm8tc3VlZHRpcm9sLml0Cit0cmVudGlub2EtYWRpZ2UuaXQKK3RyZW50aW5vYWFkaWdlLml0Cit0cmVudGlub2FsdG8tYWRpZ2UuaXQKK3RyZW50aW5vYWx0b2FkaWdlLml0Cit0cmVudGlub3MtdGlyb2wuaXQKK3RyZW50aW5vc3Rpcm9sLml0Cit0cmVudGlub3N1ZC10aXJvbC5pdAordHJlbnRpbm9zdWR0aXJvbC5pdAordHJlbnRpbm9zdWVkLXRpcm9sLml0Cit0cmVudGlub3N1ZWR0aXJvbC5pdAordHVzY2FueS5pdAordW1iLml0Cit1bWJyaWEuaXQKK3ZhbC1kLWFvc3RhLml0Cit2YWwtZGFvc3RhLml0Cit2YWxkLWFvc3RhLml0Cit2YWxkYW9zdGEuaXQKK3ZhbGxlLWFvc3RhLml0Cit2YWxsZS1kLWFvc3RhLml0Cit2YWxsZS1kYW9zdGEuaXQKK3ZhbGxlYW9zdGEuaXQKK3ZhbGxlZC1hb3N0YS5pdAordmFsbGVkYW9zdGEuaXQKK3ZhbGxlZS1hb3N0ZS5pdAordmFsbGVlYW9zdGUuaXQKK3Zhby5pdAordmRhLml0Cit2ZW4uaXQKK3ZlbmV0by5pdAorLy8gUHJvdmluY2VzCithZy5pdAorYWdyaWdlbnRvLml0CithbC5pdAorYWxlc3NhbmRyaWEuaXQKK2FsdG8tYWRpZ2UuaXQKK2FsdG9hZGlnZS5pdAorYW4uaXQKK2FuY29uYS5pdAorYW5kcmlhLWJhcmxldHRhLXRyYW5pLml0CithbmRyaWEtdHJhbmktYmFybGV0dGEuaXQKK2FuZHJpYWJhcmxldHRhdHJhbmkuaXQKK2FuZHJpYXRyYW5pYmFybGV0dGEuaXQKK2FvLml0Cithb3N0YS5pdAorYW9zdGUuaXQKK2FwLml0CithcS5pdAorYXF1aWxhLml0Cithci5pdAorYXJlenpvLml0Cithc2NvbGktcGljZW5vLml0Cithc2NvbGlwaWNlbm8uaXQKK2FzdGkuaXQKK2F0Lml0Cithdi5pdAorYXZlbGxpbm8uaXQKK2JhLml0CitiYWxzYW4uaXQKK2JhcmkuaXQKK2JhcmxldHRhLXRyYW5pLWFuZHJpYS5pdAorYmFybGV0dGF0cmFuaWFuZHJpYS5pdAorYmVsbHVuby5pdAorYmVuZXZlbnRvLml0CitiZXJnYW1vLml0CitiZy5pdAorYmkuaXQKK2JpZWxsYS5pdAorYmwuaXQKK2JuLml0Citiby5pdAorYm9sb2duYS5pdAorYm9semFuby5pdAorYm96ZW4uaXQKK2JyLml0CiticmVzY2lhLml0CiticmluZGlzaS5pdAorYnMuaXQKK2J0Lml0Citiei5pdAorY2EuaXQKK2NhZ2xpYXJpLml0CitjYWx0YW5pc3NldHRhLml0CitjYW1waWRhbm8tbWVkaW8uaXQKK2NhbXBpZGFub21lZGlvLml0CitjYW1wb2Jhc3NvLml0CitjYXJib25pYS1pZ2xlc2lhcy5pdAorY2FyYm9uaWFpZ2xlc2lhcy5pdAorY2FycmFyYS1tYXNzYS5pdAorY2FycmFyYW1hc3NhLml0CitjYXNlcnRhLml0CitjYXRhbmlhLml0CitjYXRhbnphcm8uaXQKK2NiLml0CitjZS5pdAorY2VzZW5hLWZvcmxpLml0CitjZXNlbmFmb3JsaS5pdAorY2guaXQKK2NoaWV0aS5pdAorY2kuaXQKK2NsLml0Citjbi5pdAorY28uaXQKK2NvbW8uaXQKK2Nvc2VuemEuaXQKK2NyLml0CitjcmVtb25hLml0Citjcm90b25lLml0Citjcy5pdAorY3QuaXQKK2N1bmVvLml0Citjei5pdAorZGVsbC1vZ2xpYXN0cmEuaXQKK2RlbGxvZ2xpYXN0cmEuaXQKK2VuLml0Citlbm5hLml0CitmYy5pdAorZmUuaXQKK2Zlcm1vLml0CitmZXJyYXJhLml0CitmZy5pdAorZmkuaXQKK2ZpcmVuemUuaXQKK2Zsb3JlbmNlLml0CitmbS5pdAorZm9nZ2lhLml0Citmb3JsaS1jZXNlbmEuaXQKK2ZvcmxpY2VzZW5hLml0Citmci5pdAorZnJvc2lub25lLml0CitnZS5pdAorZ2Vub2EuaXQKK2dlbm92YS5pdAorZ28uaXQKK2dvcml6aWEuaXQKK2dyLml0Citncm9zc2V0by5pdAoraWdsZXNpYXMtY2FyYm9uaWEuaXQKK2lnbGVzaWFzY2FyYm9uaWEuaXQKK2ltLml0CitpbXBlcmlhLml0Citpcy5pdAoraXNlcm5pYS5pdAora3IuaXQKK2xhLXNwZXppYS5pdAorbGFxdWlsYS5pdAorbGFzcGV6aWEuaXQKK2xhdGluYS5pdAorbGMuaXQKK2xlLml0CitsZWNjZS5pdAorbGVjY28uaXQKK2xpLml0CitsaXZvcm5vLml0Citsby5pdAorbG9kaS5pdAorbHQuaXQKK2x1Lml0CitsdWNjYS5pdAorbWFjZXJhdGEuaXQKK21hbnRvdmEuaXQKK21hc3NhLWNhcnJhcmEuaXQKK21hc3NhY2FycmFyYS5pdAorbWF0ZXJhLml0CittYi5pdAorbWMuaXQKK21lLml0CittZWRpby1jYW1waWRhbm8uaXQKK21lZGlvY2FtcGlkYW5vLml0CittZXNzaW5hLml0CittaS5pdAorbWlsYW4uaXQKK21pbGFuby5pdAorbW4uaXQKK21vLml0Cittb2RlbmEuaXQKK21vbnphLWJyaWFuemEuaXQKK21vbnphLWUtZGVsbGEtYnJpYW56YS5pdAorbW9uemEuaXQKK21vbnphYnJpYW56YS5pdAorbW9uemFlYnJpYW56YS5pdAorbW9uemFlZGVsbGFicmlhbnphLml0Cittcy5pdAorbXQuaXQKK25hLml0CituYXBsZXMuaXQKK25hcG9saS5pdAorbm8uaXQKK25vdmFyYS5pdAorbnUuaXQKK251b3JvLml0CitvZy5pdAorb2dsaWFzdHJhLml0CitvbGJpYS10ZW1waW8uaXQKK29sYmlhdGVtcGlvLml0Citvci5pdAorb3Jpc3Rhbm8uaXQKK290Lml0CitwYS5pdAorcGFkb3ZhLml0CitwYWR1YS5pdAorcGFsZXJtby5pdAorcGFybWEuaXQKK3BhdmlhLml0CitwYy5pdAorcGQuaXQKK3BlLml0CitwZXJ1Z2lhLml0CitwZXNhcm8tdXJiaW5vLml0CitwZXNhcm91cmJpbm8uaXQKK3Blc2NhcmEuaXQKK3BnLml0CitwaS5pdAorcGlhY2VuemEuaXQKK3Bpc2EuaXQKK3Bpc3RvaWEuaXQKK3BuLml0Citwby5pdAorcG9yZGVub25lLml0Citwb3RlbnphLml0Citwci5pdAorcHJhdG8uaXQKK3B0Lml0CitwdS5pdAorcHYuaXQKK3B6Lml0CityYS5pdAorcmFndXNhLml0CityYXZlbm5hLml0CityYy5pdAorcmUuaXQKK3JlZ2dpby1jYWxhYnJpYS5pdAorcmVnZ2lvLWVtaWxpYS5pdAorcmVnZ2lvY2FsYWJyaWEuaXQKK3JlZ2dpb2VtaWxpYS5pdAorcmcuaXQKK3JpLml0CityaWV0aS5pdAorcmltaW5pLml0CitybS5pdAorcm4uaXQKK3JvLml0Cityb21hLml0Cityb21lLml0Cityb3ZpZ28uaXQKK3NhLml0CitzYWxlcm5vLml0CitzYXNzYXJpLml0CitzYXZvbmEuaXQKK3NpLml0CitzaWVuYS5pdAorc2lyYWN1c2EuaXQKK3NvLml0Citzb25kcmlvLml0CitzcC5pdAorc3IuaXQKK3NzLml0CitzdWVkdGlyb2wuaXQKK3N2Lml0Cit0YS5pdAordGFyYW50by5pdAordGUuaXQKK3RlbXBpby1vbGJpYS5pdAordGVtcGlvb2xiaWEuaXQKK3RlcmFtby5pdAordGVybmkuaXQKK3RuLml0Cit0by5pdAordG9yaW5vLml0Cit0cC5pdAordHIuaXQKK3RyYW5pLWFuZHJpYS1iYXJsZXR0YS5pdAordHJhbmktYmFybGV0dGEtYW5kcmlhLml0Cit0cmFuaWFuZHJpYWJhcmxldHRhLml0Cit0cmFuaWJhcmxldHRhYW5kcmlhLml0Cit0cmFwYW5pLml0Cit0cmVudGluby5pdAordHJlbnRvLml0Cit0cmV2aXNvLml0Cit0cmllc3RlLml0Cit0cy5pdAordHVyaW4uaXQKK3R2Lml0Cit1ZC5pdAordWRpbmUuaXQKK3VyYmluby1wZXNhcm8uaXQKK3VyYmlub3Blc2Fyby5pdAordmEuaXQKK3ZhcmVzZS5pdAordmIuaXQKK3ZjLml0Cit2ZS5pdAordmVuZXppYS5pdAordmVuaWNlLml0Cit2ZXJiYW5pYS5pdAordmVyY2VsbGkuaXQKK3Zlcm9uYS5pdAordmkuaXQKK3ZpYm8tdmFsZW50aWEuaXQKK3ZpYm92YWxlbnRpYS5pdAordmljZW56YS5pdAordml0ZXJiby5pdAordnIuaXQKK3ZzLml0Cit2dC5pdAordnYuaXQKKworLy8gamUgOiBodHRwOi8vd3d3LmNoYW5uZWxpc2xlcy5uZXQvcmVnaXN0ZXItZG9tYWlucy8KKy8vIENvbmZpcm1lZCBieSByZWdpc3RyeSA8bmlnZWxAY2hhbm5lbGlzbGVzLm5ldD4gMjAxMy0xMS0yOAoramUKK2NvLmplCituZXQuamUKK29yZy5qZQorCisvLyBqbSA6IGh0dHA6Ly93d3cuY29tLmptL3JlZ2lzdGVyLmh0bWwKKyouam0KKworLy8gam8gOiBodHRwOi8vd3d3LmRucy5qby9SZWdpc3RyYXRpb25fcG9saWN5LmFzcHgKK2pvCitjb20uam8KK29yZy5qbworbmV0LmpvCitlZHUuam8KK3NjaC5qbworZ292LmpvCittaWwuam8KK25hbWUuam8KKworLy8gam9icyA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5qb2JzCitqb2JzCisKKy8vIGpwIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmpwCisvLyBodHRwOi8vanBycy5jby5qcC9lbi9qcGRvbWFpbi5odG1sCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPGluZm9AanBycy5qcD4KK2pwCisvLyBqcCBvcmdhbml6YXRpb25hbCB0eXBlIG5hbWVzCithYy5qcAorYWQuanAKK2NvLmpwCitlZC5qcAorZ28uanAKK2dyLmpwCitsZy5qcAorbmUuanAKK29yLmpwCisvLyBqcCBwcmVmZWN0dXJlIHR5cGUgbmFtZXMKK2FpY2hpLmpwCitha2l0YS5qcAorYW9tb3JpLmpwCitjaGliYS5qcAorZWhpbWUuanAKK2Z1a3VpLmpwCitmdWt1b2thLmpwCitmdWt1c2hpbWEuanAKK2dpZnUuanAKK2d1bm1hLmpwCitoaXJvc2hpbWEuanAKK2hva2thaWRvLmpwCitoeW9nby5qcAoraWJhcmFraS5qcAoraXNoaWthd2EuanAKK2l3YXRlLmpwCitrYWdhd2EuanAKK2thZ29zaGltYS5qcAora2FuYWdhd2EuanAKK2tvY2hpLmpwCitrdW1hbW90by5qcAora3lvdG8uanAKK21pZS5qcAorbWl5YWdpLmpwCittaXlhemFraS5qcAorbmFnYW5vLmpwCituYWdhc2FraS5qcAorbmFyYS5qcAorbmlpZ2F0YS5qcAorb2l0YS5qcAorb2theWFtYS5qcAorb2tpbmF3YS5qcAorb3Nha2EuanAKK3NhZ2EuanAKK3NhaXRhbWEuanAKK3NoaWdhLmpwCitzaGltYW5lLmpwCitzaGl6dW9rYS5qcAordG9jaGlnaS5qcAordG9rdXNoaW1hLmpwCit0b2t5by5qcAordG90dG9yaS5qcAordG95YW1hLmpwCit3YWtheWFtYS5qcAoreWFtYWdhdGEuanAKK3lhbWFndWNoaS5qcAoreWFtYW5hc2hpLmpwCivmoIPmnKguanAKK+aEm+efpS5qcAor5oSb5aqbLmpwCivlhbXluqsuanAKK+eGiuacrC5qcAor6Iyo5Z+OLmpwCivljJfmtbfpgZMuanAKK+WNg+iRiS5qcAor5ZKM5q2M5bGxLmpwCivplbfltI4uanAKK+mVt+mHji5qcAor5paw5r2fLmpwCivpnZLmo64uanAKK+mdmeWyoS5qcAor5p2x5LqsLmpwCivnn7Plt50uanAKK+WfvOeOiS5qcAor5LiJ6YeNLmpwCivkuqzpg70uanAKK+S9kOizgC5qcAor5aSn5YiGLmpwCivlpKfpmKouanAKK+WliOiJry5qcAor5a6u5Z+OLmpwCivlrq7ltI4uanAKK+WvjOWxsS5qcAor5bGx5Y+jLmpwCivlsbHlvaIuanAKK+WxseaiqC5qcAor5bKp5omLLmpwCivlspDpmJwuanAKK+WyoeWxsS5qcAor5bO25qC5LmpwCivluoPls7YuanAKK+W+s+Wzti5qcAor5rKW57iELmpwCivmu4vos4AuanAKK+elnuWliOW3nS5qcAor56aP5LqVLmpwCivnpo/lsqEuanAKK+emj+Wzti5qcAor56eL55SwLmpwCivnvqTppqwuanAKK+mmmeW3nS5qcAor6auY55+lLmpwCivps6Xlj5YuanAKK+m5v+WFkOWzti5qcAorLy8ganAgZ2VvZ3JhcGhpYyB0eXBlIG5hbWVzCisvLyBodHRwOi8vanBycy5qcC9kb2MvcnVsZS9zYWlzb2t1LTEuaHRtbAorKi5rYXdhc2FraS5qcAorKi5raXRha3l1c2h1LmpwCisqLmtvYmUuanAKKyoubmFnb3lhLmpwCisqLnNhcHBvcm8uanAKKyouc2VuZGFpLmpwCisqLnlva29oYW1hLmpwCishY2l0eS5rYXdhc2FraS5qcAorIWNpdHkua2l0YWt5dXNodS5qcAorIWNpdHkua29iZS5qcAorIWNpdHkubmFnb3lhLmpwCishY2l0eS5zYXBwb3JvLmpwCishY2l0eS5zZW5kYWkuanAKKyFjaXR5Lnlva29oYW1hLmpwCisvLyA0dGggbGV2ZWwgcmVnaXN0cmF0aW9uCithaXNhaS5haWNoaS5qcAorYW1hLmFpY2hpLmpwCithbmpvLmFpY2hpLmpwCithc3VrZS5haWNoaS5qcAorY2hpcnl1LmFpY2hpLmpwCitjaGl0YS5haWNoaS5qcAorZnVzby5haWNoaS5qcAorZ2FtYWdvcmkuYWljaGkuanAKK2hhbmRhLmFpY2hpLmpwCitoYXp1LmFpY2hpLmpwCitoZWtpbmFuLmFpY2hpLmpwCitoaWdhc2hpdXJhLmFpY2hpLmpwCitpY2hpbm9taXlhLmFpY2hpLmpwCitpbmF6YXdhLmFpY2hpLmpwCitpbnV5YW1hLmFpY2hpLmpwCitpc3NoaWtpLmFpY2hpLmpwCitpd2FrdXJhLmFpY2hpLmpwCitrYW5pZS5haWNoaS5qcAora2FyaXlhLmFpY2hpLmpwCitrYXN1Z2FpLmFpY2hpLmpwCitraXJhLmFpY2hpLmpwCitraXlvc3UuYWljaGkuanAKK2tvbWFraS5haWNoaS5qcAora29uYW4uYWljaGkuanAKK2tvdGEuYWljaGkuanAKK21paGFtYS5haWNoaS5qcAorbWl5b3NoaS5haWNoaS5qcAorbmlzaGlvLmFpY2hpLmpwCituaXNzaGluLmFpY2hpLmpwCitvYnUuYWljaGkuanAKK29ndWNoaS5haWNoaS5qcAorb2hhcnUuYWljaGkuanAKK29rYXpha2kuYWljaGkuanAKK293YXJpYXNhaGkuYWljaGkuanAKK3NldG8uYWljaGkuanAKK3NoaWthdHN1LmFpY2hpLmpwCitzaGluc2hpcm8uYWljaGkuanAKK3NoaXRhcmEuYWljaGkuanAKK3RhaGFyYS5haWNoaS5qcAordGFrYWhhbWEuYWljaGkuanAKK3RvYmlzaGltYS5haWNoaS5qcAordG9laS5haWNoaS5qcAordG9nby5haWNoaS5qcAordG9rYWkuYWljaGkuanAKK3Rva29uYW1lLmFpY2hpLmpwCit0b3lvYWtlLmFpY2hpLmpwCit0b3lvaGFzaGkuYWljaGkuanAKK3RveW9rYXdhLmFpY2hpLmpwCit0b3lvbmUuYWljaGkuanAKK3RveW90YS5haWNoaS5qcAordHN1c2hpbWEuYWljaGkuanAKK3lhdG9taS5haWNoaS5qcAorYWtpdGEuYWtpdGEuanAKK2RhaXNlbi5ha2l0YS5qcAorZnVqaXNhdG8uYWtpdGEuanAKK2dvam9tZS5ha2l0YS5qcAoraGFjaGlyb2dhdGEuYWtpdGEuanAKK2hhcHBvdS5ha2l0YS5qcAoraGlnYXNoaW5hcnVzZS5ha2l0YS5qcAoraG9uam8uYWtpdGEuanAKK2hvbmp5by5ha2l0YS5qcAoraWthd2EuYWtpdGEuanAKK2thbWlrb2FuaS5ha2l0YS5qcAora2FtaW9rYS5ha2l0YS5qcAora2F0YWdhbWkuYWtpdGEuanAKK2thenVuby5ha2l0YS5qcAora2l0YWFraXRhLmFraXRhLmpwCitrb3Nha2EuYWtpdGEuanAKK2t5b3dhLmFraXRhLmpwCittaXNhdG8uYWtpdGEuanAKK21pdGFuZS5ha2l0YS5qcAorbW9yaXlvc2hpLmFraXRhLmpwCituaWthaG8uYWtpdGEuanAKK25vc2hpcm8uYWtpdGEuanAKK29kYXRlLmFraXRhLmpwCitvZ2EuYWtpdGEuanAKK29nYXRhLmFraXRhLmpwCitzZW1ib2t1LmFraXRhLmpwCit5b2tvdGUuYWtpdGEuanAKK3l1cmlob25qby5ha2l0YS5qcAorYW9tb3JpLmFvbW9yaS5qcAorZ29ub2hlLmFvbW9yaS5qcAoraGFjaGlub2hlLmFvbW9yaS5qcAoraGFzaGlrYW1pLmFvbW9yaS5qcAoraGlyYW5haS5hb21vcmkuanAKK2hpcm9zYWtpLmFvbW9yaS5qcAoraXRheWFuYWdpLmFvbW9yaS5qcAora3Vyb2lzaGkuYW9tb3JpLmpwCittaXNhd2EuYW9tb3JpLmpwCittdXRzdS5hb21vcmkuanAKK25ha2Fkb21hcmkuYW9tb3JpLmpwCitub2hlamkuYW9tb3JpLmpwCitvaXJhc2UuYW9tb3JpLmpwCitvd2FuaS5hb21vcmkuanAKK3Jva3Vub2hlLmFvbW9yaS5qcAorc2Fubm9oZS5hb21vcmkuanAKK3NoaWNoaW5vaGUuYW9tb3JpLmpwCitzaGluZ28uYW9tb3JpLmpwCit0YWtrby5hb21vcmkuanAKK3Rvd2FkYS5hb21vcmkuanAKK3RzdWdhcnUuYW9tb3JpLmpwCit0c3VydXRhLmFvbW9yaS5qcAorYWJpa28uY2hpYmEuanAKK2FzYWhpLmNoaWJhLmpwCitjaG9uYW4uY2hpYmEuanAKK2Nob3NlaS5jaGliYS5qcAorY2hvc2hpLmNoaWJhLmpwCitjaHVvLmNoaWJhLmpwCitmdW5hYmFzaGkuY2hpYmEuanAKK2Z1dHRzdS5jaGliYS5qcAoraGFuYW1pZ2F3YS5jaGliYS5qcAoraWNoaWhhcmEuY2hpYmEuanAKK2ljaGlrYXdhLmNoaWJhLmpwCitpY2hpbm9taXlhLmNoaWJhLmpwCitpbnphaS5jaGliYS5qcAoraXN1bWkuY2hpYmEuanAKK2thbWFnYXlhLmNoaWJhLmpwCitrYW1vZ2F3YS5jaGliYS5qcAora2FzaGl3YS5jaGliYS5qcAora2F0b3JpLmNoaWJhLmpwCitrYXRzdXVyYS5jaGliYS5qcAora2ltaXRzdS5jaGliYS5qcAora2lzYXJhenUuY2hpYmEuanAKK2tvemFraS5jaGliYS5qcAora3VqdWt1cmkuY2hpYmEuanAKK2t5b25hbi5jaGliYS5qcAorbWF0c3Vkby5jaGliYS5qcAorbWlkb3JpLmNoaWJhLmpwCittaWhhbWEuY2hpYmEuanAKK21pbmFtaWJvc28uY2hpYmEuanAKK21vYmFyYS5jaGliYS5qcAorbXV0c3V6YXdhLmNoaWJhLmpwCituYWdhcmEuY2hpYmEuanAKK25hZ2FyZXlhbWEuY2hpYmEuanAKK25hcmFzaGluby5jaGliYS5qcAorbmFyaXRhLmNoaWJhLmpwCitub2RhLmNoaWJhLmpwCitvYW1pc2hpcmFzYXRvLmNoaWJhLmpwCitvbWlnYXdhLmNoaWJhLmpwCitvbmp1a3UuY2hpYmEuanAKK290YWtpLmNoaWJhLmpwCitzYWthZS5jaGliYS5qcAorc2FrdXJhLmNoaWJhLmpwCitzaGltb2Z1c2EuY2hpYmEuanAKK3NoaXJha28uY2hpYmEuanAKK3NoaXJvaS5jaGliYS5qcAorc2hpc3VpLmNoaWJhLmpwCitzb2RlZ2F1cmEuY2hpYmEuanAKK3Nvc2EuY2hpYmEuanAKK3Rha28uY2hpYmEuanAKK3RhdGV5YW1hLmNoaWJhLmpwCit0b2dhbmUuY2hpYmEuanAKK3RvaG5vc2hvLmNoaWJhLmpwCit0b21pc2F0by5jaGliYS5qcAordXJheWFzdS5jaGliYS5qcAoreWFjaGltYXRhLmNoaWJhLmpwCit5YWNoaXlvLmNoaWJhLmpwCit5b2thaWNoaWJhLmNoaWJhLmpwCit5b2tvc2hpYmFoaWthcmkuY2hpYmEuanAKK3lvdHN1a2FpZG8uY2hpYmEuanAKK2FpbmFuLmVoaW1lLmpwCitob25haS5laGltZS5qcAoraWthdGEuZWhpbWUuanAKK2ltYWJhcmkuZWhpbWUuanAKK2l5by5laGltZS5qcAora2FtaWppbWEuZWhpbWUuanAKK2tpaG9rdS5laGltZS5qcAora3VtYWtvZ2VuLmVoaW1lLmpwCittYXNha2kuZWhpbWUuanAKK21hdHN1bm8uZWhpbWUuanAKK21hdHN1eWFtYS5laGltZS5qcAorbmFtaWthdGEuZWhpbWUuanAKK25paWhhbWEuZWhpbWUuanAKK296dS5laGltZS5qcAorc2Fpam8uZWhpbWUuanAKK3NlaXlvLmVoaW1lLmpwCitzaGlrb2t1Y2h1by5laGltZS5qcAordG9iZS5laGltZS5qcAordG9vbi5laGltZS5qcAordWNoaWtvLmVoaW1lLmpwCit1d2FqaW1hLmVoaW1lLmpwCit5YXdhdGFoYW1hLmVoaW1lLmpwCitlY2hpemVuLmZ1a3VpLmpwCitlaWhlaWppLmZ1a3VpLmpwCitmdWt1aS5mdWt1aS5qcAoraWtlZGEuZnVrdWkuanAKK2thdHN1eWFtYS5mdWt1aS5qcAorbWloYW1hLmZ1a3VpLmpwCittaW5hbWllY2hpemVuLmZ1a3VpLmpwCitvYmFtYS5mdWt1aS5qcAorb2hpLmZ1a3VpLmpwCitvbm8uZnVrdWkuanAKK3NhYmFlLmZ1a3VpLmpwCitzYWthaS5mdWt1aS5qcAordGFrYWhhbWEuZnVrdWkuanAKK3RzdXJ1Z2EuZnVrdWkuanAKK3dha2FzYS5mdWt1aS5qcAorYXNoaXlhLmZ1a3Vva2EuanAKK2J1emVuLmZ1a3Vva2EuanAKK2NoaWt1Z28uZnVrdW9rYS5qcAorY2hpa3Voby5mdWt1b2thLmpwCitjaGlrdWpvLmZ1a3Vva2EuanAKK2NoaWt1c2hpbm8uZnVrdW9rYS5qcAorY2hpa3V6ZW4uZnVrdW9rYS5qcAorY2h1by5mdWt1b2thLmpwCitkYXphaWZ1LmZ1a3Vva2EuanAKK2Z1a3VjaGkuZnVrdW9rYS5qcAoraGFrYXRhLmZ1a3Vva2EuanAKK2hpZ2FzaGkuZnVrdW9rYS5qcAoraGlyb2thd2EuZnVrdW9rYS5qcAoraGlzYXlhbWEuZnVrdW9rYS5qcAoraWl6dWthLmZ1a3Vva2EuanAKK2luYXRzdWtpLmZ1a3Vva2EuanAKK2thaG8uZnVrdW9rYS5qcAora2FzdWdhLmZ1a3Vva2EuanAKK2thc3V5YS5mdWt1b2thLmpwCitrYXdhcmEuZnVrdW9rYS5qcAora2Vpc2VuLmZ1a3Vva2EuanAKK2tvZ2EuZnVrdW9rYS5qcAora3VyYXRlLmZ1a3Vva2EuanAKK2t1cm9naS5mdWt1b2thLmpwCitrdXJ1bWUuZnVrdW9rYS5qcAorbWluYW1pLmZ1a3Vva2EuanAKK21peWFrby5mdWt1b2thLmpwCittaXlhbWEuZnVrdW9rYS5qcAorbWl5YXdha2EuZnVrdW9rYS5qcAorbWl6dW1ha2kuZnVrdW9rYS5qcAorbXVuYWthdGEuZnVrdW9rYS5qcAorbmFrYWdhd2EuZnVrdW9rYS5qcAorbmFrYW1hLmZ1a3Vva2EuanAKK25pc2hpLmZ1a3Vva2EuanAKK25vZ2F0YS5mdWt1b2thLmpwCitvZ29yaS5mdWt1b2thLmpwCitva2FnYWtpLmZ1a3Vva2EuanAKK29rYXdhLmZ1a3Vva2EuanAKK29raS5mdWt1b2thLmpwCitvbXV0YS5mdWt1b2thLmpwCitvbmdhLmZ1a3Vva2EuanAKK29ub2pvLmZ1a3Vva2EuanAKK290by5mdWt1b2thLmpwCitzYWlnYXdhLmZ1a3Vva2EuanAKK3Nhc2FndXJpLmZ1a3Vva2EuanAKK3NoaW5ndS5mdWt1b2thLmpwCitzaGlueW9zaGl0b21pLmZ1a3Vva2EuanAKK3Nob25haS5mdWt1b2thLmpwCitzb2VkYS5mdWt1b2thLmpwCitzdWUuZnVrdW9rYS5qcAordGFjaGlhcmFpLmZ1a3Vva2EuanAKK3RhZ2F3YS5mdWt1b2thLmpwCit0YWthdGEuZnVrdW9rYS5qcAordG9oby5mdWt1b2thLmpwCit0b3lvdHN1LmZ1a3Vva2EuanAKK3RzdWlraS5mdWt1b2thLmpwCit1a2loYS5mdWt1b2thLmpwCit1bWkuZnVrdW9rYS5qcAordXN1aS5mdWt1b2thLmpwCit5YW1hZGEuZnVrdW9rYS5qcAoreWFtZS5mdWt1b2thLmpwCit5YW5hZ2F3YS5mdWt1b2thLmpwCit5dWt1aGFzaGkuZnVrdW9rYS5qcAorYWl6dWJhbmdlLmZ1a3VzaGltYS5qcAorYWl6dW1pc2F0by5mdWt1c2hpbWEuanAKK2FpenV3YWthbWF0c3UuZnVrdXNoaW1hLmpwCithc2FrYXdhLmZ1a3VzaGltYS5qcAorYmFuZGFpLmZ1a3VzaGltYS5qcAorZGF0ZS5mdWt1c2hpbWEuanAKK2Z1a3VzaGltYS5mdWt1c2hpbWEuanAKK2Z1cnVkb25vLmZ1a3VzaGltYS5qcAorZnV0YWJhLmZ1a3VzaGltYS5qcAoraGFuYXdhLmZ1a3VzaGltYS5qcAoraGlnYXNoaS5mdWt1c2hpbWEuanAKK2hpcmF0YS5mdWt1c2hpbWEuanAKK2hpcm9uby5mdWt1c2hpbWEuanAKK2lpdGF0ZS5mdWt1c2hpbWEuanAKK2luYXdhc2hpcm8uZnVrdXNoaW1hLmpwCitpc2hpa2F3YS5mdWt1c2hpbWEuanAKK2l3YWtpLmZ1a3VzaGltYS5qcAoraXp1bWl6YWtpLmZ1a3VzaGltYS5qcAora2FnYW1paXNoaS5mdWt1c2hpbWEuanAKK2thbmV5YW1hLmZ1a3VzaGltYS5qcAora2F3YW1hdGEuZnVrdXNoaW1hLmpwCitraXRha2F0YS5mdWt1c2hpbWEuanAKK2tpdGFzaGlvYmFyYS5mdWt1c2hpbWEuanAKK2tvb3JpLmZ1a3VzaGltYS5qcAora29yaXlhbWEuZnVrdXNoaW1hLmpwCitrdW5pbWkuZnVrdXNoaW1hLmpwCittaWhhcnUuZnVrdXNoaW1hLmpwCittaXNoaW1hLmZ1a3VzaGltYS5qcAorbmFtaWUuZnVrdXNoaW1hLmpwCituYW5nby5mdWt1c2hpbWEuanAKK25pc2hpYWl6dS5mdWt1c2hpbWEuanAKK25pc2hpZ28uZnVrdXNoaW1hLmpwCitva3VtYS5mdWt1c2hpbWEuanAKK29tb3RlZ28uZnVrdXNoaW1hLmpwCitvbm8uZnVrdXNoaW1hLmpwCitvdGFtYS5mdWt1c2hpbWEuanAKK3NhbWVnYXdhLmZ1a3VzaGltYS5qcAorc2hpbW9nby5mdWt1c2hpbWEuanAKK3NoaXJha2F3YS5mdWt1c2hpbWEuanAKK3Nob3dhLmZ1a3VzaGltYS5qcAorc29tYS5mdWt1c2hpbWEuanAKK3N1a2FnYXdhLmZ1a3VzaGltYS5qcAordGFpc2hpbi5mdWt1c2hpbWEuanAKK3RhbWFrYXdhLmZ1a3VzaGltYS5qcAordGFuYWd1cmEuZnVrdXNoaW1hLmpwCit0ZW5laS5mdWt1c2hpbWEuanAKK3lhYnVraS5mdWt1c2hpbWEuanAKK3lhbWF0by5mdWt1c2hpbWEuanAKK3lhbWF0c3VyaS5mdWt1c2hpbWEuanAKK3lhbmFpenUuZnVrdXNoaW1hLmpwCit5dWdhd2EuZnVrdXNoaW1hLmpwCithbnBhY2hpLmdpZnUuanAKK2VuYS5naWZ1LmpwCitnaWZ1LmdpZnUuanAKK2dpbmFuLmdpZnUuanAKK2dvZG8uZ2lmdS5qcAorZ3Vqby5naWZ1LmpwCitoYXNoaW1hLmdpZnUuanAKK2hpY2hpc28uZ2lmdS5qcAoraGlkYS5naWZ1LmpwCitoaWdhc2hpc2hpcmFrYXdhLmdpZnUuanAKK2liaWdhd2EuZ2lmdS5qcAoraWtlZGEuZ2lmdS5qcAora2FrYW1pZ2FoYXJhLmdpZnUuanAKK2thbmkuZ2lmdS5qcAora2FzYWhhcmEuZ2lmdS5qcAora2FzYW1hdHN1LmdpZnUuanAKK2thd2F1ZS5naWZ1LmpwCitraXRhZ2F0YS5naWZ1LmpwCittaW5vLmdpZnUuanAKK21pbm9rYW1vLmdpZnUuanAKK21pdGFrZS5naWZ1LmpwCittaXp1bmFtaS5naWZ1LmpwCittb3Rvc3UuZ2lmdS5qcAorbmFrYXRzdWdhd2EuZ2lmdS5qcAorb2dha2kuZ2lmdS5qcAorc2FrYWhvZ2kuZ2lmdS5qcAorc2VraS5naWZ1LmpwCitzZWtpZ2FoYXJhLmdpZnUuanAKK3NoaXJha2F3YS5naWZ1LmpwCit0YWppbWkuZ2lmdS5qcAordGFrYXlhbWEuZ2lmdS5qcAordGFydWkuZ2lmdS5qcAordG9raS5naWZ1LmpwCit0b21pa2EuZ2lmdS5qcAord2Fub3VjaGkuZ2lmdS5qcAoreWFtYWdhdGEuZ2lmdS5qcAoreWFvdHN1LmdpZnUuanAKK3lvcm8uZ2lmdS5qcAorYW5uYWthLmd1bm1hLmpwCitjaGl5b2RhLmd1bm1hLmpwCitmdWppb2thLmd1bm1hLmpwCitoaWdhc2hpYWdhdHN1bWEuZ3VubWEuanAKK2lzZXNha2kuZ3VubWEuanAKK2l0YWt1cmEuZ3VubWEuanAKK2thbm5hLmd1bm1hLmpwCitrYW5yYS5ndW5tYS5qcAora2F0YXNoaW5hLmd1bm1hLmpwCitrYXdhYmEuZ3VubWEuanAKK2tpcnl1Lmd1bm1hLmpwCitrdXNhdHN1Lmd1bm1hLmpwCittYWViYXNoaS5ndW5tYS5qcAorbWVpd2EuZ3VubWEuanAKK21pZG9yaS5ndW5tYS5qcAorbWluYWthbWkuZ3VubWEuanAKK25hZ2Fub2hhcmEuZ3VubWEuanAKK25ha2Fub2pvLmd1bm1hLmpwCituYW5tb2t1Lmd1bm1hLmpwCitudW1hdGEuZ3VubWEuanAKK29penVtaS5ndW5tYS5qcAorb3JhLmd1bm1hLmpwCitvdGEuZ3VubWEuanAKK3NoaWJ1a2F3YS5ndW5tYS5qcAorc2hpbW9uaXRhLmd1bm1hLmpwCitzaGludG8uZ3VubWEuanAKK3Nob3dhLmd1bm1hLmpwCit0YWthc2FraS5ndW5tYS5qcAordGFrYXlhbWEuZ3VubWEuanAKK3RhbWFtdXJhLmd1bm1hLmpwCit0YXRlYmF5YXNoaS5ndW5tYS5qcAordG9taW9rYS5ndW5tYS5qcAordHN1a2l5b25vLmd1bm1hLmpwCit0c3VtYWdvaS5ndW5tYS5qcAordWVuby5ndW5tYS5qcAoreW9zaGlva2EuZ3VubWEuanAKK2FzYW1pbmFtaS5oaXJvc2hpbWEuanAKK2RhaXdhLmhpcm9zaGltYS5qcAorZXRhamltYS5oaXJvc2hpbWEuanAKK2Z1Y2h1Lmhpcm9zaGltYS5qcAorZnVrdXlhbWEuaGlyb3NoaW1hLmpwCitoYXRzdWthaWNoaS5oaXJvc2hpbWEuanAKK2hpZ2FzaGloaXJvc2hpbWEuaGlyb3NoaW1hLmpwCitob25nby5oaXJvc2hpbWEuanAKK2ppbnNla2lrb2dlbi5oaXJvc2hpbWEuanAKK2thaXRhLmhpcm9zaGltYS5qcAora3VpLmhpcm9zaGltYS5qcAora3VtYW5vLmhpcm9zaGltYS5qcAora3VyZS5oaXJvc2hpbWEuanAKK21paGFyYS5oaXJvc2hpbWEuanAKK21peW9zaGkuaGlyb3NoaW1hLmpwCituYWthLmhpcm9zaGltYS5qcAorb25vbWljaGkuaGlyb3NoaW1hLmpwCitvc2FraWthbWlqaW1hLmhpcm9zaGltYS5qcAorb3Rha2UuaGlyb3NoaW1hLmpwCitzYWthLmhpcm9zaGltYS5qcAorc2VyYS5oaXJvc2hpbWEuanAKK3NlcmFuaXNoaS5oaXJvc2hpbWEuanAKK3NoaW5pY2hpLmhpcm9zaGltYS5qcAorc2hvYmFyYS5oaXJvc2hpbWEuanAKK3Rha2VoYXJhLmhpcm9zaGltYS5qcAorYWJhc2hpcmkuaG9ra2FpZG8uanAKK2FiaXJhLmhva2thaWRvLmpwCithaWJldHN1Lmhva2thaWRvLmpwCitha2FiaXJhLmhva2thaWRvLmpwCitha2tlc2hpLmhva2thaWRvLmpwCithc2FoaWthd2EuaG9ra2FpZG8uanAKK2FzaGliZXRzdS5ob2trYWlkby5qcAorYXNob3JvLmhva2thaWRvLmpwCithc3NhYnUuaG9ra2FpZG8uanAKK2F0c3VtYS5ob2trYWlkby5qcAorYmliYWkuaG9ra2FpZG8uanAKK2JpZWkuaG9ra2FpZG8uanAKK2JpZnVrYS5ob2trYWlkby5qcAorYmlob3JvLmhva2thaWRvLmpwCitiaXJhdG9yaS5ob2trYWlkby5qcAorY2hpcHB1YmV0c3UuaG9ra2FpZG8uanAKK2NoaXRvc2UuaG9ra2FpZG8uanAKK2RhdGUuaG9ra2FpZG8uanAKK2ViZXRzdS5ob2trYWlkby5qcAorZW1iZXRzdS5ob2trYWlkby5qcAorZW5pd2EuaG9ra2FpZG8uanAKK2VyaW1vLmhva2thaWRvLmpwCitlc2FuLmhva2thaWRvLmpwCitlc2FzaGkuaG9ra2FpZG8uanAKK2Z1a2FnYXdhLmhva2thaWRvLmpwCitmdWt1c2hpbWEuaG9ra2FpZG8uanAKK2Z1cmFuby5ob2trYWlkby5qcAorZnVydWJpcmEuaG9ra2FpZG8uanAKK2hhYm9yby5ob2trYWlkby5qcAoraGFrb2RhdGUuaG9ra2FpZG8uanAKK2hhbWF0b25iZXRzdS5ob2trYWlkby5qcAoraGlkYWthLmhva2thaWRvLmpwCitoaWdhc2hpa2FndXJhLmhva2thaWRvLmpwCitoaWdhc2hpa2F3YS5ob2trYWlkby5qcAoraGlyb28uaG9ra2FpZG8uanAKK2hva3VyeXUuaG9ra2FpZG8uanAKK2hva3V0by5ob2trYWlkby5qcAoraG9uYmV0c3UuaG9ra2FpZG8uanAKK2hvcm9rYW5haS5ob2trYWlkby5qcAoraG9yb25vYmUuaG9ra2FpZG8uanAKK2lrZWRhLmhva2thaWRvLmpwCitpbWFrYW5lLmhva2thaWRvLmpwCitpc2hpa2FyaS5ob2trYWlkby5qcAoraXdhbWl6YXdhLmhva2thaWRvLmpwCitpd2FuYWkuaG9ra2FpZG8uanAKK2thbWlmdXJhbm8uaG9ra2FpZG8uanAKK2thbWlrYXdhLmhva2thaWRvLmpwCitrYW1pc2hpaG9yby5ob2trYWlkby5qcAora2FtaXN1bmFnYXdhLmhva2thaWRvLmpwCitrYW1vZW5haS5ob2trYWlkby5qcAora2F5YWJlLmhva2thaWRvLmpwCitrZW1idWNoaS5ob2trYWlkby5qcAora2lrb25haS5ob2trYWlkby5qcAora2ltb2JldHN1Lmhva2thaWRvLmpwCitraXRhaGlyb3NoaW1hLmhva2thaWRvLmpwCitraXRhbWkuaG9ra2FpZG8uanAKK2tpeW9zYXRvLmhva2thaWRvLmpwCitrb3NoaW1penUuaG9ra2FpZG8uanAKK2t1bm5lcHB1Lmhva2thaWRvLmpwCitrdXJpeWFtYS5ob2trYWlkby5qcAora3Vyb21hdHN1bmFpLmhva2thaWRvLmpwCitrdXNoaXJvLmhva2thaWRvLmpwCitrdXRjaGFuLmhva2thaWRvLmpwCitreW93YS5ob2trYWlkby5qcAorbWFzaGlrZS5ob2trYWlkby5qcAorbWF0c3VtYWUuaG9ra2FpZG8uanAKK21pa2FzYS5ob2trYWlkby5qcAorbWluYW1pZnVyYW5vLmhva2thaWRvLmpwCittb21iZXRzdS5ob2trYWlkby5qcAorbW9zZXVzaGkuaG9ra2FpZG8uanAKK211a2F3YS5ob2trYWlkby5qcAorbXVyb3Jhbi5ob2trYWlkby5qcAorbmFpZS5ob2trYWlkby5qcAorbmFrYWdhd2EuaG9ra2FpZG8uanAKK25ha2FzYXRzdW5haS5ob2trYWlkby5qcAorbmFrYXRvbWJldHN1Lmhva2thaWRvLmpwCituYW5hZS5ob2trYWlkby5qcAorbmFucG9yby5ob2trYWlkby5qcAorbmF5b3JvLmhva2thaWRvLmpwCituZW11cm8uaG9ra2FpZG8uanAKK25paWthcHB1Lmhva2thaWRvLmpwCituaWtpLmhva2thaWRvLmpwCituaXNoaW9rb3BwZS5ob2trYWlkby5qcAorbm9ib3JpYmV0c3UuaG9ra2FpZG8uanAKK251bWF0YS5ob2trYWlkby5qcAorb2JpaGlyby5ob2trYWlkby5qcAorb2JpcmEuaG9ra2FpZG8uanAKK29rZXRvLmhva2thaWRvLmpwCitva29wcGUuaG9ra2FpZG8uanAKK290YXJ1Lmhva2thaWRvLmpwCitvdG9iZS5ob2trYWlkby5qcAorb3RvZnVrZS5ob2trYWlkby5qcAorb3RvaW5lcHB1Lmhva2thaWRvLmpwCitvdW11Lmhva2thaWRvLmpwCitvem9yYS5ob2trYWlkby5qcAorcGlwcHUuaG9ra2FpZG8uanAKK3Jhbmtvc2hpLmhva2thaWRvLmpwCityZWJ1bi5ob2trYWlkby5qcAorcmlrdWJldHN1Lmhva2thaWRvLmpwCityaXNoaXJpLmhva2thaWRvLmpwCityaXNoaXJpZnVqaS5ob2trYWlkby5qcAorc2Fyb21hLmhva2thaWRvLmpwCitzYXJ1ZnV0c3UuaG9ra2FpZG8uanAKK3NoYWtvdGFuLmhva2thaWRvLmpwCitzaGFyaS5ob2trYWlkby5qcAorc2hpYmVjaGEuaG9ra2FpZG8uanAKK3NoaWJldHN1Lmhva2thaWRvLmpwCitzaGlrYWJlLmhva2thaWRvLmpwCitzaGlrYW9pLmhva2thaWRvLmpwCitzaGltYW1ha2kuaG9ra2FpZG8uanAKK3NoaW1penUuaG9ra2FpZG8uanAKK3NoaW1va2F3YS5ob2trYWlkby5qcAorc2hpbnNoaW5vdHN1Lmhva2thaWRvLmpwCitzaGludG9rdS5ob2trYWlkby5qcAorc2hpcmFudWthLmhva2thaWRvLmpwCitzaGlyYW9pLmhva2thaWRvLmpwCitzaGlyaXVjaGkuaG9ra2FpZG8uanAKK3NvYmV0c3UuaG9ra2FpZG8uanAKK3N1bmFnYXdhLmhva2thaWRvLmpwCit0YWlraS5ob2trYWlkby5qcAordGFrYXN1Lmhva2thaWRvLmpwCit0YWtpa2F3YS5ob2trYWlkby5qcAordGFraW5vdWUuaG9ra2FpZG8uanAKK3Rlc2hpa2FnYS5ob2trYWlkby5qcAordG9iZXRzdS5ob2trYWlkby5qcAordG9obWEuaG9ra2FpZG8uanAKK3RvbWFrb21haS5ob2trYWlkby5qcAordG9tYXJpLmhva2thaWRvLmpwCit0b3lhLmhva2thaWRvLmpwCit0b3lha28uaG9ra2FpZG8uanAKK3RveW90b21pLmhva2thaWRvLmpwCit0b3lvdXJhLmhva2thaWRvLmpwCit0c3ViZXRzdS5ob2trYWlkby5qcAordHN1a2lnYXRhLmhva2thaWRvLmpwCit1cmFrYXdhLmhva2thaWRvLmpwCit1cmF1c3UuaG9ra2FpZG8uanAKK3VyeXUuaG9ra2FpZG8uanAKK3V0YXNoaW5haS5ob2trYWlkby5qcAord2Fra2FuYWkuaG9ra2FpZG8uanAKK3dhc3NhbXUuaG9ra2FpZG8uanAKK3lha3Vtby5ob2trYWlkby5qcAoreW9pY2hpLmhva2thaWRvLmpwCithaW9pLmh5b2dvLmpwCitha2FzaGkuaHlvZ28uanAKK2Frby5oeW9nby5qcAorYW1hZ2FzYWtpLmh5b2dvLmpwCithb2dha2kuaHlvZ28uanAKK2FzYWdvLmh5b2dvLmpwCithc2hpeWEuaHlvZ28uanAKK2F3YWppLmh5b2dvLmpwCitmdWt1c2FraS5oeW9nby5qcAorZ29zaGlraS5oeW9nby5qcAoraGFyaW1hLmh5b2dvLmpwCitoaW1lamkuaHlvZ28uanAKK2ljaGlrYXdhLmh5b2dvLmpwCitpbmFnYXdhLmh5b2dvLmpwCitpdGFtaS5oeW9nby5qcAora2Frb2dhd2EuaHlvZ28uanAKK2thbWlnb3JpLmh5b2dvLmpwCitrYW1pa2F3YS5oeW9nby5qcAora2FzYWkuaHlvZ28uanAKK2thc3VnYS5oeW9nby5qcAora2F3YW5pc2hpLmh5b2dvLmpwCittaWtpLmh5b2dvLmpwCittaW5hbWlhd2FqaS5oeW9nby5qcAorbmlzaGlub21peWEuaHlvZ28uanAKK25pc2hpd2FraS5oeW9nby5qcAorb25vLmh5b2dvLmpwCitzYW5kYS5oeW9nby5qcAorc2FubmFuLmh5b2dvLmpwCitzYXNheWFtYS5oeW9nby5qcAorc2F5by5oeW9nby5qcAorc2hpbmd1Lmh5b2dvLmpwCitzaGlub25zZW4uaHlvZ28uanAKK3NoaXNvLmh5b2dvLmpwCitzdW1vdG8uaHlvZ28uanAKK3RhaXNoaS5oeW9nby5qcAordGFrYS5oeW9nby5qcAordGFrYXJhenVrYS5oeW9nby5qcAordGFrYXNhZ28uaHlvZ28uanAKK3Rha2luby5oeW9nby5qcAordGFtYmEuaHlvZ28uanAKK3RhdHN1bm8uaHlvZ28uanAKK3RveW9va2EuaHlvZ28uanAKK3lhYnUuaHlvZ28uanAKK3lhc2hpcm8uaHlvZ28uanAKK3lva2EuaHlvZ28uanAKK3lva2F3YS5oeW9nby5qcAorYW1pLmliYXJha2kuanAKK2FzYWhpLmliYXJha2kuanAKK2JhbmRvLmliYXJha2kuanAKK2NoaWt1c2VpLmliYXJha2kuanAKK2RhaWdvLmliYXJha2kuanAKK2Z1amlzaGlyby5pYmFyYWtpLmpwCitoaXRhY2hpLmliYXJha2kuanAKK2hpdGFjaGluYWthLmliYXJha2kuanAKK2hpdGFjaGlvbWl5YS5pYmFyYWtpLmpwCitoaXRhY2hpb3RhLmliYXJha2kuanAKK2liYXJha2kuaWJhcmFraS5qcAoraW5hLmliYXJha2kuanAKK2luYXNoaWtpLmliYXJha2kuanAKK2l0YWtvLmliYXJha2kuanAKK2l3YW1hLmliYXJha2kuanAKK2pvc28uaWJhcmFraS5qcAora2FtaXN1LmliYXJha2kuanAKK2thc2FtYS5pYmFyYWtpLmpwCitrYXNoaW1hLmliYXJha2kuanAKK2thc3VtaWdhdXJhLmliYXJha2kuanAKK2tvZ2EuaWJhcmFraS5qcAorbWloby5pYmFyYWtpLmpwCittaXRvLmliYXJha2kuanAKK21vcml5YS5pYmFyYWtpLmpwCituYWthLmliYXJha2kuanAKK25hbWVnYXRhLmliYXJha2kuanAKK29hcmFpLmliYXJha2kuanAKK29nYXdhLmliYXJha2kuanAKK29taXRhbWEuaWJhcmFraS5qcAorcnl1Z2FzYWtpLmliYXJha2kuanAKK3Nha2FpLmliYXJha2kuanAKK3Nha3VyYWdhd2EuaWJhcmFraS5qcAorc2hpbW9kYXRlLmliYXJha2kuanAKK3NoaW1vdHN1bWEuaWJhcmFraS5qcAorc2hpcm9zYXRvLmliYXJha2kuanAKK3Nvd2EuaWJhcmFraS5qcAorc3VpZnUuaWJhcmFraS5qcAordGFrYWhhZ2kuaWJhcmFraS5qcAordGFtYXRzdWt1cmkuaWJhcmFraS5qcAordG9rYWkuaWJhcmFraS5qcAordG9tb2JlLmliYXJha2kuanAKK3RvbmUuaWJhcmFraS5qcAordG9yaWRlLmliYXJha2kuanAKK3RzdWNoaXVyYS5pYmFyYWtpLmpwCit0c3VrdWJhLmliYXJha2kuanAKK3VjaGloYXJhLmliYXJha2kuanAKK3VzaGlrdS5pYmFyYWtpLmpwCit5YWNoaXlvLmliYXJha2kuanAKK3lhbWFnYXRhLmliYXJha2kuanAKK3lhd2FyYS5pYmFyYWtpLmpwCit5dWtpLmliYXJha2kuanAKK2FuYW1penUuaXNoaWthd2EuanAKK2hha3VpLmlzaGlrYXdhLmpwCitoYWt1c2FuLmlzaGlrYXdhLmpwCitrYWdhLmlzaGlrYXdhLmpwCitrYWhva3UuaXNoaWthd2EuanAKK2thbmF6YXdhLmlzaGlrYXdhLmpwCitrYXdha2l0YS5pc2hpa2F3YS5qcAora29tYXRzdS5pc2hpa2F3YS5qcAorbmFrYW5vdG8uaXNoaWthd2EuanAKK25hbmFvLmlzaGlrYXdhLmpwCitub21pLmlzaGlrYXdhLmpwCitub25vaWNoaS5pc2hpa2F3YS5qcAorbm90by5pc2hpa2F3YS5qcAorc2hpa2EuaXNoaWthd2EuanAKK3N1enUuaXNoaWthd2EuanAKK3RzdWJhdGEuaXNoaWthd2EuanAKK3RzdXJ1Z2kuaXNoaWthd2EuanAKK3VjaGluYWRhLmlzaGlrYXdhLmpwCit3YWppbWEuaXNoaWthd2EuanAKK2Z1ZGFpLml3YXRlLmpwCitmdWppc2F3YS5pd2F0ZS5qcAoraGFuYW1ha2kuaXdhdGUuanAKK2hpcmFpenVtaS5pd2F0ZS5qcAoraGlyb25vLml3YXRlLmpwCitpY2hpbm9oZS5pd2F0ZS5qcAoraWNoaW5vc2VraS5pd2F0ZS5qcAoraXdhaXp1bWkuaXdhdGUuanAKK2l3YXRlLml3YXRlLmpwCitqb2JvamkuaXdhdGUuanAKK2thbWFpc2hpLml3YXRlLmpwCitrYW5lZ2FzYWtpLml3YXRlLmpwCitrYXJ1bWFpLml3YXRlLmpwCitrYXdhaS5pd2F0ZS5qcAora2l0YWthbWkuaXdhdGUuanAKK2t1amkuaXdhdGUuanAKK2t1bm9oZS5pd2F0ZS5qcAora3V6dW1ha2kuaXdhdGUuanAKK21peWFrby5pd2F0ZS5qcAorbWl6dXNhd2EuaXdhdGUuanAKK21vcmlva2EuaXdhdGUuanAKK25pbm9oZS5pd2F0ZS5qcAorbm9kYS5pd2F0ZS5qcAorb2Z1bmF0by5pd2F0ZS5qcAorb3NodS5pd2F0ZS5qcAorb3RzdWNoaS5pd2F0ZS5qcAorcmlrdXplbnRha2F0YS5pd2F0ZS5qcAorc2hpd2EuaXdhdGUuanAKK3NoaXp1a3Vpc2hpLml3YXRlLmpwCitzdW1pdGEuaXdhdGUuanAKK3Rhbm9oYXRhLml3YXRlLmpwCit0b25vLml3YXRlLmpwCit5YWhhYmEuaXdhdGUuanAKK3lhbWFkYS5pd2F0ZS5qcAorYXlhZ2F3YS5rYWdhd2EuanAKK2hpZ2FzaGlrYWdhd2Eua2FnYXdhLmpwCitrYW5vbmppLmthZ2F3YS5qcAora290b2hpcmEua2FnYXdhLmpwCittYW5uby5rYWdhd2EuanAKK21hcnVnYW1lLmthZ2F3YS5qcAorbWl0b3lvLmthZ2F3YS5qcAorbmFvc2hpbWEua2FnYXdhLmpwCitzYW51a2kua2FnYXdhLmpwCit0YWRvdHN1LmthZ2F3YS5qcAordGFrYW1hdHN1LmthZ2F3YS5qcAordG9ub3Noby5rYWdhd2EuanAKK3VjaGlub21pLmthZ2F3YS5qcAordXRhenUua2FnYXdhLmpwCit6ZW50c3VqaS5rYWdhd2EuanAKK2FrdW5lLmthZ29zaGltYS5qcAorYW1hbWkua2Fnb3NoaW1hLmpwCitoaW9raS5rYWdvc2hpbWEuanAKK2lzYS5rYWdvc2hpbWEuanAKK2lzZW4ua2Fnb3NoaW1hLmpwCitpenVtaS5rYWdvc2hpbWEuanAKK2thZ29zaGltYS5rYWdvc2hpbWEuanAKK2thbm95YS5rYWdvc2hpbWEuanAKK2thd2FuYWJlLmthZ29zaGltYS5qcAora2lua28ua2Fnb3NoaW1hLmpwCitrb3V5YW1hLmthZ29zaGltYS5qcAorbWFrdXJhemFraS5rYWdvc2hpbWEuanAKK21hdHN1bW90by5rYWdvc2hpbWEuanAKK21pbmFtaXRhbmUua2Fnb3NoaW1hLmpwCituYWthdGFuZS5rYWdvc2hpbWEuanAKK25pc2hpbm9vbW90ZS5rYWdvc2hpbWEuanAKK3NhdHN1bWFzZW5kYWkua2Fnb3NoaW1hLmpwCitzb28ua2Fnb3NoaW1hLmpwCit0YXJ1bWl6dS5rYWdvc2hpbWEuanAKK3l1c3VpLmthZ29zaGltYS5qcAorYWlrYXdhLmthbmFnYXdhLmpwCithdHN1Z2kua2FuYWdhd2EuanAKK2F5YXNlLmthbmFnYXdhLmpwCitjaGlnYXNha2kua2FuYWdhd2EuanAKK2ViaW5hLmthbmFnYXdhLmpwCitmdWppc2F3YS5rYW5hZ2F3YS5qcAoraGFkYW5vLmthbmFnYXdhLmpwCitoYWtvbmUua2FuYWdhd2EuanAKK2hpcmF0c3VrYS5rYW5hZ2F3YS5qcAoraXNlaGFyYS5rYW5hZ2F3YS5qcAora2Fpc2VpLmthbmFnYXdhLmpwCitrYW1ha3VyYS5rYW5hZ2F3YS5qcAora2l5b2thd2Eua2FuYWdhd2EuanAKK21hdHN1ZGEua2FuYWdhd2EuanAKK21pbmFtaWFzaGlnYXJhLmthbmFnYXdhLmpwCittaXVyYS5rYW5hZ2F3YS5qcAorbmFrYWkua2FuYWdhd2EuanAKK25pbm9taXlhLmthbmFnYXdhLmpwCitvZGF3YXJhLmthbmFnYXdhLmpwCitvaS5rYW5hZ2F3YS5qcAorb2lzby5rYW5hZ2F3YS5qcAorc2FnYW1paGFyYS5rYW5hZ2F3YS5qcAorc2FtdWthd2Eua2FuYWdhd2EuanAKK3RzdWt1aS5rYW5hZ2F3YS5qcAoreWFtYWtpdGEua2FuYWdhd2EuanAKK3lhbWF0by5rYW5hZ2F3YS5qcAoreW9rb3N1a2Eua2FuYWdhd2EuanAKK3l1Z2F3YXJhLmthbmFnYXdhLmpwCit6YW1hLmthbmFnYXdhLmpwCit6dXNoaS5rYW5hZ2F3YS5qcAorYWtpLmtvY2hpLmpwCitnZWlzZWkua29jaGkuanAKK2hpZGFrYS5rb2NoaS5qcAoraGlnYXNoaXRzdW5vLmtvY2hpLmpwCitpbm8ua29jaGkuanAKK2thZ2FtaS5rb2NoaS5qcAora2FtaS5rb2NoaS5qcAora2l0YWdhd2Eua29jaGkuanAKK2tvY2hpLmtvY2hpLmpwCittaWhhcmEua29jaGkuanAKK21vdG95YW1hLmtvY2hpLmpwCittdXJvdG8ua29jaGkuanAKK25haGFyaS5rb2NoaS5qcAorbmFrYW11cmEua29jaGkuanAKK25hbmtva3Uua29jaGkuanAKK25pc2hpdG9zYS5rb2NoaS5qcAorbml5b2RvZ2F3YS5rb2NoaS5qcAorb2NoaS5rb2NoaS5qcAorb2thd2Eua29jaGkuanAKK290b3lvLmtvY2hpLmpwCitvdHN1a2kua29jaGkuanAKK3Nha2F3YS5rb2NoaS5qcAorc3VrdW1vLmtvY2hpLmpwCitzdXNha2kua29jaGkuanAKK3Rvc2Eua29jaGkuanAKK3Rvc2FzaGltaXp1LmtvY2hpLmpwCit0b3lvLmtvY2hpLmpwCit0c3Vuby5rb2NoaS5qcAordW1hamkua29jaGkuanAKK3lhc3VkYS5rb2NoaS5qcAoreXVzdWhhcmEua29jaGkuanAKK2FtYWt1c2Eua3VtYW1vdG8uanAKK2FyYW8ua3VtYW1vdG8uanAKK2Fzby5rdW1hbW90by5qcAorY2hveW8ua3VtYW1vdG8uanAKK2d5b2t1dG8ua3VtYW1vdG8uanAKK2thbWlhbWFrdXNhLmt1bWFtb3RvLmpwCitraWt1Y2hpLmt1bWFtb3RvLmpwCitrdW1hbW90by5rdW1hbW90by5qcAorbWFzaGlraS5rdW1hbW90by5qcAorbWlmdW5lLmt1bWFtb3RvLmpwCittaW5hbWF0YS5rdW1hbW90by5qcAorbWluYW1pb2d1bmkua3VtYW1vdG8uanAKK25hZ2FzdS5rdW1hbW90by5qcAorbmlzaGloYXJhLmt1bWFtb3RvLmpwCitvZ3VuaS5rdW1hbW90by5qcAorb3p1Lmt1bWFtb3RvLmpwCitzdW1vdG8ua3VtYW1vdG8uanAKK3Rha2Ftb3JpLmt1bWFtb3RvLmpwCit1a2kua3VtYW1vdG8uanAKK3V0by5rdW1hbW90by5qcAoreWFtYWdhLmt1bWFtb3RvLmpwCit5YW1hdG8ua3VtYW1vdG8uanAKK3lhdHN1c2hpcm8ua3VtYW1vdG8uanAKK2F5YWJlLmt5b3RvLmpwCitmdWt1Y2hpeWFtYS5reW90by5qcAoraGlnYXNoaXlhbWEua3lvdG8uanAKK2lkZS5reW90by5qcAoraW5lLmt5b3RvLmpwCitqb3lvLmt5b3RvLmpwCitrYW1lb2thLmt5b3RvLmpwCitrYW1vLmt5b3RvLmpwCitraXRhLmt5b3RvLmpwCitraXp1Lmt5b3RvLmpwCitrdW1peWFtYS5reW90by5qcAora3lvdGFtYmEua3lvdG8uanAKK2t5b3RhbmFiZS5reW90by5qcAora3lvdGFuZ28ua3lvdG8uanAKK21haXp1cnUua3lvdG8uanAKK21pbmFtaS5reW90by5qcAorbWluYW1peWFtYXNoaXJvLmt5b3RvLmpwCittaXlhenUua3lvdG8uanAKK211a28ua3lvdG8uanAKK25hZ2Fva2FreW8ua3lvdG8uanAKK25ha2FneW8ua3lvdG8uanAKK25hbnRhbi5reW90by5qcAorb3lhbWF6YWtpLmt5b3RvLmpwCitzYWt5by5reW90by5qcAorc2Vpa2Eua3lvdG8uanAKK3RhbmFiZS5reW90by5qcAordWppLmt5b3RvLmpwCit1aml0YXdhcmEua3lvdG8uanAKK3dhenVrYS5reW90by5qcAoreWFtYXNoaW5hLmt5b3RvLmpwCit5YXdhdGEua3lvdG8uanAKK2FzYWhpLm1pZS5qcAoraW5hYmUubWllLmpwCitpc2UubWllLmpwCitrYW1leWFtYS5taWUuanAKK2thd2Fnb2UubWllLmpwCitraWhvLm1pZS5qcAora2lzb3Nha2kubWllLmpwCitraXdhLm1pZS5qcAora29tb25vLm1pZS5qcAora3VtYW5vLm1pZS5qcAora3V3YW5hLm1pZS5qcAorbWF0c3VzYWthLm1pZS5qcAorbWVpd2EubWllLmpwCittaWhhbWEubWllLmpwCittaW5hbWlpc2UubWllLmpwCittaXN1Z2kubWllLmpwCittaXlhbWEubWllLmpwCituYWJhcmkubWllLmpwCitzaGltYS5taWUuanAKK3N1enVrYS5taWUuanAKK3RhZG8ubWllLmpwCit0YWlraS5taWUuanAKK3Rha2kubWllLmpwCit0YW1ha2kubWllLmpwCit0b2JhLm1pZS5qcAordHN1Lm1pZS5qcAordWRvbm8ubWllLmpwCit1cmVzaGluby5taWUuanAKK3dhdGFyYWkubWllLmpwCit5b2trYWljaGkubWllLmpwCitmdXJ1a2F3YS5taXlhZ2kuanAKK2hpZ2FzaGltYXRzdXNoaW1hLm1peWFnaS5qcAoraXNoaW5vbWFraS5taXlhZ2kuanAKK2l3YW51bWEubWl5YWdpLmpwCitrYWt1ZGEubWl5YWdpLmpwCitrYW1pLm1peWFnaS5qcAora2F3YXNha2kubWl5YWdpLmpwCittYXJ1bW9yaS5taXlhZ2kuanAKK21hdHN1c2hpbWEubWl5YWdpLmpwCittaW5hbWlzYW5yaWt1Lm1peWFnaS5qcAorbWlzYXRvLm1peWFnaS5qcAorbXVyYXRhLm1peWFnaS5qcAorbmF0b3JpLm1peWFnaS5qcAorb2dhd2FyYS5taXlhZ2kuanAKK29oaXJhLm1peWFnaS5qcAorb25hZ2F3YS5taXlhZ2kuanAKK29zYWtpLm1peWFnaS5qcAorcmlmdS5taXlhZ2kuanAKK3NlbWluZS5taXlhZ2kuanAKK3NoaWJhdGEubWl5YWdpLmpwCitzaGljaGlrYXNodWt1Lm1peWFnaS5qcAorc2hpa2FtYS5taXlhZ2kuanAKK3NoaW9nYW1hLm1peWFnaS5qcAorc2hpcm9pc2hpLm1peWFnaS5qcAordGFnYWpvLm1peWFnaS5qcAordGFpd2EubWl5YWdpLmpwCit0b21lLm1peWFnaS5qcAordG9taXlhLm1peWFnaS5qcAord2FrdXlhLm1peWFnaS5qcAord2F0YXJpLm1peWFnaS5qcAoreWFtYW1vdG8ubWl5YWdpLmpwCit6YW8ubWl5YWdpLmpwCitheWEubWl5YXpha2kuanAKK2ViaW5vLm1peWF6YWtpLmpwCitnb2thc2UubWl5YXpha2kuanAKK2h5dWdhLm1peWF6YWtpLmpwCitrYWRvZ2F3YS5taXlhemFraS5qcAora2F3YW1pbmFtaS5taXlhemFraS5qcAora2lqby5taXlhemFraS5qcAora2l0YWdhd2EubWl5YXpha2kuanAKK2tpdGFrYXRhLm1peWF6YWtpLmpwCitraXRhdXJhLm1peWF6YWtpLmpwCitrb2JheWFzaGkubWl5YXpha2kuanAKK2t1bml0b21pLm1peWF6YWtpLmpwCitrdXNoaW1hLm1peWF6YWtpLmpwCittaW1hdGEubWl5YXpha2kuanAKK21peWFrb25vam8ubWl5YXpha2kuanAKK21peWF6YWtpLm1peWF6YWtpLmpwCittb3JvdHN1a2EubWl5YXpha2kuanAKK25pY2hpbmFuLm1peWF6YWtpLmpwCituaXNoaW1lcmEubWl5YXpha2kuanAKK25vYmVva2EubWl5YXpha2kuanAKK3NhaXRvLm1peWF6YWtpLmpwCitzaGlpYmEubWl5YXpha2kuanAKK3NoaW50b21pLm1peWF6YWtpLmpwCit0YWthaGFydS5taXlhemFraS5qcAordGFrYW5hYmUubWl5YXpha2kuanAKK3Rha2F6YWtpLm1peWF6YWtpLmpwCit0c3Vuby5taXlhemFraS5qcAorYWNoaS5uYWdhbm8uanAKK2FnZW1hdHN1Lm5hZ2Fuby5qcAorYW5hbi5uYWdhbm8uanAKK2Fva2kubmFnYW5vLmpwCithc2FoaS5uYWdhbm8uanAKK2F6dW1pbm8ubmFnYW5vLmpwCitjaGlrdWhva3UubmFnYW5vLmpwCitjaGlrdW1hLm5hZ2Fuby5qcAorY2hpbm8ubmFnYW5vLmpwCitmdWppbWkubmFnYW5vLmpwCitoYWt1YmEubmFnYW5vLmpwCitoYXJhLm5hZ2Fuby5qcAoraGlyYXlhLm5hZ2Fuby5qcAoraWlkYS5uYWdhbm8uanAKK2lpamltYS5uYWdhbm8uanAKK2lpeWFtYS5uYWdhbm8uanAKK2lpenVuYS5uYWdhbm8uanAKK2lrZWRhLm5hZ2Fuby5qcAoraWt1c2FrYS5uYWdhbm8uanAKK2luYS5uYWdhbm8uanAKK2thcnVpemF3YS5uYWdhbm8uanAKK2thd2FrYW1pLm5hZ2Fuby5qcAora2lzby5uYWdhbm8uanAKK2tpc29mdWt1c2hpbWEubmFnYW5vLmpwCitraXRhYWlraS5uYWdhbm8uanAKK2tvbWFnYW5lLm5hZ2Fuby5qcAora29tb3JvLm5hZ2Fuby5qcAorbWF0c3VrYXdhLm5hZ2Fuby5qcAorbWF0c3Vtb3RvLm5hZ2Fuby5qcAorbWlhc2EubmFnYW5vLmpwCittaW5hbWlhaWtpLm5hZ2Fuby5qcAorbWluYW1pbWFraS5uYWdhbm8uanAKK21pbmFtaW1pbm93YS5uYWdhbm8uanAKK21pbm93YS5uYWdhbm8uanAKK21peWFkYS5uYWdhbm8uanAKK21peW90YS5uYWdhbm8uanAKK21vY2hpenVraS5uYWdhbm8uanAKK25hZ2Fuby5uYWdhbm8uanAKK25hZ2F3YS5uYWdhbm8uanAKK25hZ2lzby5uYWdhbm8uanAKK25ha2FnYXdhLm5hZ2Fuby5qcAorbmFrYW5vLm5hZ2Fuby5qcAorbm96YXdhb25zZW4ubmFnYW5vLmpwCitvYnVzZS5uYWdhbm8uanAKK29nYXdhLm5hZ2Fuby5qcAorb2theWEubmFnYW5vLmpwCitvbWFjaGkubmFnYW5vLmpwCitvbWkubmFnYW5vLmpwCitvb2t1d2EubmFnYW5vLmpwCitvb3NoaWthLm5hZ2Fuby5qcAorb3Rha2kubmFnYW5vLmpwCitvdGFyaS5uYWdhbm8uanAKK3Nha2FlLm5hZ2Fuby5qcAorc2FrYWtpLm5hZ2Fuby5qcAorc2FrdS5uYWdhbm8uanAKK3Nha3Voby5uYWdhbm8uanAKK3NoaW1vc3V3YS5uYWdhbm8uanAKK3NoaW5hbm9tYWNoaS5uYWdhbm8uanAKK3NoaW9qaXJpLm5hZ2Fuby5qcAorc3V3YS5uYWdhbm8uanAKK3N1emFrYS5uYWdhbm8uanAKK3Rha2FnaS5uYWdhbm8uanAKK3Rha2Ftb3JpLm5hZ2Fuby5qcAordGFrYXlhbWEubmFnYW5vLmpwCit0YXRlc2hpbmEubmFnYW5vLmpwCit0YXRzdW5vLm5hZ2Fuby5qcAordG9nYWt1c2hpLm5hZ2Fuby5qcAordG9ndXJhLm5hZ2Fuby5qcAordG9taS5uYWdhbm8uanAKK3VlZGEubmFnYW5vLmpwCit3YWRhLm5hZ2Fuby5qcAoreWFtYWdhdGEubmFnYW5vLmpwCit5YW1hbm91Y2hpLm5hZ2Fuby5qcAoreWFzYWthLm5hZ2Fuby5qcAoreWFzdW9rYS5uYWdhbm8uanAKK2NoaWppd2EubmFnYXNha2kuanAKK2Z1dHN1Lm5hZ2FzYWtpLmpwCitnb3RvLm5hZ2FzYWtpLmpwCitoYXNhbWkubmFnYXNha2kuanAKK2hpcmFkby5uYWdhc2FraS5qcAoraWtpLm5hZ2FzYWtpLmpwCitpc2FoYXlhLm5hZ2FzYWtpLmpwCitrYXdhdGFuYS5uYWdhc2FraS5qcAora3VjaGlub3RzdS5uYWdhc2FraS5qcAorbWF0c3V1cmEubmFnYXNha2kuanAKK25hZ2FzYWtpLm5hZ2FzYWtpLmpwCitvYmFtYS5uYWdhc2FraS5qcAorb211cmEubmFnYXNha2kuanAKK29zZXRvLm5hZ2FzYWtpLmpwCitzYWlrYWkubmFnYXNha2kuanAKK3Nhc2Viby5uYWdhc2FraS5qcAorc2VpaGkubmFnYXNha2kuanAKK3NoaW1hYmFyYS5uYWdhc2FraS5qcAorc2hpbmthbWlnb3RvLm5hZ2FzYWtpLmpwCit0b2dpdHN1Lm5hZ2FzYWtpLmpwCit0c3VzaGltYS5uYWdhc2FraS5qcAordW56ZW4ubmFnYXNha2kuanAKK2FuZG8ubmFyYS5qcAorZ29zZS5uYXJhLmpwCitoZWd1cmkubmFyYS5qcAoraGlnYXNoaXlvc2hpbm8ubmFyYS5qcAoraWthcnVnYS5uYXJhLmpwCitpa29tYS5uYXJhLmpwCitrYW1pa2l0YXlhbWEubmFyYS5qcAora2FubWFraS5uYXJhLmpwCitrYXNoaWJhLm5hcmEuanAKK2thc2hpaGFyYS5uYXJhLmpwCitrYXRzdXJhZ2kubmFyYS5qcAora2F3YWkubmFyYS5qcAora2F3YWthbWkubmFyYS5qcAora2F3YW5pc2hpLm5hcmEuanAKK2tvcnlvLm5hcmEuanAKK2t1cm90YWtpLm5hcmEuanAKK21pdHN1ZS5uYXJhLmpwCittaXlha2UubmFyYS5qcAorbmFyYS5uYXJhLmpwCitub3NlZ2F3YS5uYXJhLmpwCitvamkubmFyYS5qcAorb3VkYS5uYXJhLmpwCitveW9kby5uYXJhLmpwCitzYWt1cmFpLm5hcmEuanAKK3NhbmdvLm5hcmEuanAKK3NoaW1vaWNoaS5uYXJhLmpwCitzaGltb2tpdGF5YW1hLm5hcmEuanAKK3NoaW5qby5uYXJhLmpwCitzb25pLm5hcmEuanAKK3Rha2F0b3JpLm5hcmEuanAKK3Rhd2FyYW1vdG8ubmFyYS5qcAordGVua2F3YS5uYXJhLmpwCit0ZW5yaS5uYXJhLmpwCit1ZGEubmFyYS5qcAoreWFtYXRva29yaXlhbWEubmFyYS5qcAoreWFtYXRvdGFrYWRhLm5hcmEuanAKK3lhbWF6b2UubmFyYS5qcAoreW9zaGluby5uYXJhLmpwCithZ2EubmlpZ2F0YS5qcAorYWdhbm8ubmlpZ2F0YS5qcAorZ29zZW4ubmlpZ2F0YS5qcAoraXRvaWdhd2EubmlpZ2F0YS5qcAoraXp1bW96YWtpLm5paWdhdGEuanAKK2pvZXRzdS5uaWlnYXRhLmpwCitrYW1vLm5paWdhdGEuanAKK2thcml3YS5uaWlnYXRhLmpwCitrYXNoaXdhemFraS5uaWlnYXRhLmpwCittaW5hbWl1b251bWEubmlpZ2F0YS5qcAorbWl0c3VrZS5uaWlnYXRhLmpwCittdWlrYS5uaWlnYXRhLmpwCittdXJha2FtaS5uaWlnYXRhLmpwCitteW9rby5uaWlnYXRhLmpwCituYWdhb2thLm5paWdhdGEuanAKK25paWdhdGEubmlpZ2F0YS5qcAorb2ppeWEubmlpZ2F0YS5qcAorb21pLm5paWdhdGEuanAKK3NhZG8ubmlpZ2F0YS5qcAorc2Fuam8ubmlpZ2F0YS5qcAorc2Vpcm8ubmlpZ2F0YS5qcAorc2Vpcm91Lm5paWdhdGEuanAKK3Nla2lrYXdhLm5paWdhdGEuanAKK3NoaWJhdGEubmlpZ2F0YS5qcAordGFnYW1pLm5paWdhdGEuanAKK3RhaW5haS5uaWlnYXRhLmpwCit0b2NoaW8ubmlpZ2F0YS5qcAordG9rYW1hY2hpLm5paWdhdGEuanAKK3RzdWJhbWUubmlpZ2F0YS5qcAordHN1bmFuLm5paWdhdGEuanAKK3VvbnVtYS5uaWlnYXRhLmpwCit5YWhpa28ubmlpZ2F0YS5qcAoreW9pdGEubmlpZ2F0YS5qcAoreXV6YXdhLm5paWdhdGEuanAKK2JlcHB1Lm9pdGEuanAKK2J1bmdvb25vLm9pdGEuanAKK2J1bmdvdGFrYWRhLm9pdGEuanAKK2hhc2FtYS5vaXRhLmpwCitoaWppLm9pdGEuanAKK2hpbWVzaGltYS5vaXRhLmpwCitoaXRhLm9pdGEuanAKK2thbWl0c3VlLm9pdGEuanAKK2tva29ub2Uub2l0YS5qcAora3VqdS5vaXRhLmpwCitrdW5pc2FraS5vaXRhLmpwCitrdXN1Lm9pdGEuanAKK29pdGEub2l0YS5qcAorc2Fpa2kub2l0YS5qcAordGFrZXRhLm9pdGEuanAKK3RzdWt1bWkub2l0YS5qcAordXNhLm9pdGEuanAKK3VzdWtpLm9pdGEuanAKK3l1ZnUub2l0YS5qcAorYWthaXdhLm9rYXlhbWEuanAKK2FzYWt1Y2hpLm9rYXlhbWEuanAKK2JpemVuLm9rYXlhbWEuanAKK2hheWFzaGltYS5va2F5YW1hLmpwCitpYmFyYS5va2F5YW1hLmpwCitrYWdhbWluby5va2F5YW1hLmpwCitrYXNhb2thLm9rYXlhbWEuanAKK2tpYmljaHVvLm9rYXlhbWEuanAKK2t1bWVuYW4ub2theWFtYS5qcAora3VyYXNoaWtpLm9rYXlhbWEuanAKK21hbml3YS5va2F5YW1hLmpwCittaXNha2kub2theWFtYS5qcAorbmFnaS5va2F5YW1hLmpwCituaWltaS5va2F5YW1hLmpwCituaXNoaWF3YWt1cmEub2theWFtYS5qcAorb2theWFtYS5va2F5YW1hLmpwCitzYXRvc2hvLm9rYXlhbWEuanAKK3NldG91Y2hpLm9rYXlhbWEuanAKK3NoaW5qby5va2F5YW1hLmpwCitzaG9vLm9rYXlhbWEuanAKK3NvamEub2theWFtYS5qcAordGFrYWhhc2hpLm9rYXlhbWEuanAKK3RhbWFuby5va2F5YW1hLmpwCit0c3V5YW1hLm9rYXlhbWEuanAKK3dha2Uub2theWFtYS5qcAoreWFrYWdlLm9rYXlhbWEuanAKK2FndW5pLm9raW5hd2EuanAKK2dpbm93YW4ub2tpbmF3YS5qcAorZ2lub3phLm9raW5hd2EuanAKK2d1c2hpa2FtaS5va2luYXdhLmpwCitoYWViYXJ1Lm9raW5hd2EuanAKK2hpZ2FzaGkub2tpbmF3YS5qcAoraGlyYXJhLm9raW5hd2EuanAKK2loZXlhLm9raW5hd2EuanAKK2lzaGlnYWtpLm9raW5hd2EuanAKK2lzaGlrYXdhLm9raW5hd2EuanAKK2l0b21hbi5va2luYXdhLmpwCitpemVuYS5va2luYXdhLmpwCitrYWRlbmEub2tpbmF3YS5qcAora2luLm9raW5hd2EuanAKK2tpdGFkYWl0by5va2luYXdhLmpwCitraXRhbmFrYWd1c3VrdS5va2luYXdhLmpwCitrdW1lamltYS5va2luYXdhLmpwCitrdW5pZ2FtaS5va2luYXdhLmpwCittaW5hbWlkYWl0by5va2luYXdhLmpwCittb3RvYnUub2tpbmF3YS5qcAorbmFnby5va2luYXdhLmpwCituYWhhLm9raW5hd2EuanAKK25ha2FndXN1a3Uub2tpbmF3YS5qcAorbmFraWppbi5va2luYXdhLmpwCituYW5qby5va2luYXdhLmpwCituaXNoaWhhcmEub2tpbmF3YS5qcAorb2dpbWkub2tpbmF3YS5qcAorb2tpbmF3YS5va2luYXdhLmpwCitvbm5hLm9raW5hd2EuanAKK3NoaW1vamkub2tpbmF3YS5qcAordGFrZXRvbWkub2tpbmF3YS5qcAordGFyYW1hLm9raW5hd2EuanAKK3Rva2FzaGlraS5va2luYXdhLmpwCit0b21pZ3VzdWt1Lm9raW5hd2EuanAKK3RvbmFraS5va2luYXdhLmpwCit1cmFzb2Uub2tpbmF3YS5qcAordXJ1bWEub2tpbmF3YS5qcAoreWFlc2Uub2tpbmF3YS5qcAoreW9taXRhbi5va2luYXdhLmpwCit5b25hYmFydS5va2luYXdhLmpwCit5b25hZ3VuaS5va2luYXdhLmpwCit6YW1hbWkub2tpbmF3YS5qcAorYWJlbm8ub3Nha2EuanAKK2NoaWhheWFha2FzYWthLm9zYWthLmpwCitjaHVvLm9zYWthLmpwCitkYWl0by5vc2FrYS5qcAorZnVqaWlkZXJhLm9zYWthLmpwCitoYWJpa2luby5vc2FrYS5qcAoraGFubmFuLm9zYWthLmpwCitoaWdhc2hpb3Nha2Eub3Nha2EuanAKK2hpZ2FzaGlzdW1peW9zaGkub3Nha2EuanAKK2hpZ2FzaGl5b2RvZ2F3YS5vc2FrYS5qcAoraGlyYWthdGEub3Nha2EuanAKK2liYXJha2kub3Nha2EuanAKK2lrZWRhLm9zYWthLmpwCitpenVtaS5vc2FrYS5qcAoraXp1bWlvdHN1Lm9zYWthLmpwCitpenVtaXNhbm8ub3Nha2EuanAKK2thZG9tYS5vc2FrYS5qcAora2FpenVrYS5vc2FrYS5qcAora2FuYW4ub3Nha2EuanAKK2thc2hpd2FyYS5vc2FrYS5qcAora2F0YW5vLm9zYWthLmpwCitrYXdhY2hpbmFnYW5vLm9zYWthLmpwCitraXNoaXdhZGEub3Nha2EuanAKK2tpdGEub3Nha2EuanAKK2t1bWF0b3JpLm9zYWthLmpwCittYXRzdWJhcmEub3Nha2EuanAKK21pbmF0by5vc2FrYS5qcAorbWlub2gub3Nha2EuanAKK21pc2FraS5vc2FrYS5qcAorbW9yaWd1Y2hpLm9zYWthLmpwCituZXlhZ2F3YS5vc2FrYS5qcAorbmlzaGkub3Nha2EuanAKK25vc2Uub3Nha2EuanAKK29zYWthc2F5YW1hLm9zYWthLmpwCitzYWthaS5vc2FrYS5qcAorc2F5YW1hLm9zYWthLmpwCitzZW5uYW4ub3Nha2EuanAKK3NldHRzdS5vc2FrYS5qcAorc2hpam9uYXdhdGUub3Nha2EuanAKK3NoaW1hbW90by5vc2FrYS5qcAorc3VpdGEub3Nha2EuanAKK3RhZGFva2Eub3Nha2EuanAKK3RhaXNoaS5vc2FrYS5qcAordGFqaXJpLm9zYWthLmpwCit0YWthaXNoaS5vc2FrYS5qcAordGFrYXRzdWtpLm9zYWthLmpwCit0b25kYWJheWFzaGkub3Nha2EuanAKK3RveW9uYWthLm9zYWthLmpwCit0b3lvbm8ub3Nha2EuanAKK3lhby5vc2FrYS5qcAorYXJpYWtlLnNhZ2EuanAKK2FyaXRhLnNhZ2EuanAKK2Z1a3Vkb21pLnNhZ2EuanAKK2dlbmthaS5zYWdhLmpwCitoYW1hdGFtYS5zYWdhLmpwCitoaXplbi5zYWdhLmpwCitpbWFyaS5zYWdhLmpwCitrYW1pbWluZS5zYWdhLmpwCitrYW56YWtpLnNhZ2EuanAKK2thcmF0c3Uuc2FnYS5qcAora2FzaGltYS5zYWdhLmpwCitraXRhZ2F0YS5zYWdhLmpwCitraXRhaGF0YS5zYWdhLmpwCitraXlhbWEuc2FnYS5qcAora291aG9rdS5zYWdhLmpwCitreXVyYWdpLnNhZ2EuanAKK25pc2hpYXJpdGEuc2FnYS5qcAorb2dpLnNhZ2EuanAKK29tYWNoaS5zYWdhLmpwCitvdWNoaS5zYWdhLmpwCitzYWdhLnNhZ2EuanAKK3NoaXJvaXNoaS5zYWdhLmpwCit0YWt1LnNhZ2EuanAKK3RhcmEuc2FnYS5qcAordG9zdS5zYWdhLmpwCit5b3NoaW5vZ2FyaS5zYWdhLmpwCithcmFrYXdhLnNhaXRhbWEuanAKK2FzYWthLnNhaXRhbWEuanAKK2NoaWNoaWJ1LnNhaXRhbWEuanAKK2Z1amltaS5zYWl0YW1hLmpwCitmdWppbWluby5zYWl0YW1hLmpwCitmdWtheWEuc2FpdGFtYS5qcAoraGFubm8uc2FpdGFtYS5qcAoraGFueXUuc2FpdGFtYS5qcAoraGFzdWRhLnNhaXRhbWEuanAKK2hhdG9nYXlhLnNhaXRhbWEuanAKK2hhdG95YW1hLnNhaXRhbWEuanAKK2hpZGFrYS5zYWl0YW1hLmpwCitoaWdhc2hpY2hpY2hpYnUuc2FpdGFtYS5qcAoraGlnYXNoaW1hdHN1eWFtYS5zYWl0YW1hLmpwCitob25qby5zYWl0YW1hLmpwCitpbmEuc2FpdGFtYS5qcAoraXJ1bWEuc2FpdGFtYS5qcAoraXdhdHN1a2kuc2FpdGFtYS5qcAora2FtaWl6dW1pLnNhaXRhbWEuanAKK2thbWlrYXdhLnNhaXRhbWEuanAKK2thbWlzYXRvLnNhaXRhbWEuanAKK2thc3VrYWJlLnNhaXRhbWEuanAKK2thd2Fnb2Uuc2FpdGFtYS5qcAora2F3YWd1Y2hpLnNhaXRhbWEuanAKK2thd2FqaW1hLnNhaXRhbWEuanAKK2them8uc2FpdGFtYS5qcAora2l0YW1vdG8uc2FpdGFtYS5qcAora29zaGlnYXlhLnNhaXRhbWEuanAKK2tvdW5vc3Uuc2FpdGFtYS5qcAora3VraS5zYWl0YW1hLmpwCitrdW1hZ2F5YS5zYWl0YW1hLmpwCittYXRzdWJ1c2hpLnNhaXRhbWEuanAKK21pbmFuby5zYWl0YW1hLmpwCittaXNhdG8uc2FpdGFtYS5qcAorbWl5YXNoaXJvLnNhaXRhbWEuanAKK21peW9zaGkuc2FpdGFtYS5qcAorbW9yb3lhbWEuc2FpdGFtYS5qcAorbmFnYXRvcm8uc2FpdGFtYS5qcAorbmFtZWdhd2Euc2FpdGFtYS5qcAorbmlpemEuc2FpdGFtYS5qcAorb2dhbm8uc2FpdGFtYS5qcAorb2dhd2Euc2FpdGFtYS5qcAorb2dvc2Uuc2FpdGFtYS5qcAorb2tlZ2F3YS5zYWl0YW1hLmpwCitvbWl5YS5zYWl0YW1hLmpwCitvdGFraS5zYWl0YW1hLmpwCityYW56YW4uc2FpdGFtYS5qcAorcnlva2FtaS5zYWl0YW1hLmpwCitzYWl0YW1hLnNhaXRhbWEuanAKK3Nha2Fkby5zYWl0YW1hLmpwCitzYXR0ZS5zYWl0YW1hLmpwCitzYXlhbWEuc2FpdGFtYS5qcAorc2hpa2kuc2FpdGFtYS5qcAorc2hpcmFva2Euc2FpdGFtYS5qcAorc29rYS5zYWl0YW1hLmpwCitzdWdpdG8uc2FpdGFtYS5qcAordG9kYS5zYWl0YW1hLmpwCit0b2tpZ2F3YS5zYWl0YW1hLmpwCit0b2tvcm96YXdhLnNhaXRhbWEuanAKK3RzdXJ1Z2FzaGltYS5zYWl0YW1hLmpwCit1cmF3YS5zYWl0YW1hLmpwCit3YXJhYmkuc2FpdGFtYS5qcAoreWFzaGlvLnNhaXRhbWEuanAKK3lva296ZS5zYWl0YW1hLmpwCit5b25vLnNhaXRhbWEuanAKK3lvcmlpLnNhaXRhbWEuanAKK3lvc2hpZGEuc2FpdGFtYS5qcAoreW9zaGlrYXdhLnNhaXRhbWEuanAKK3lvc2hpbWkuc2FpdGFtYS5qcAorYWlzaG8uc2hpZ2EuanAKK2dhbW8uc2hpZ2EuanAKK2hpZ2FzaGlvbWkuc2hpZ2EuanAKK2hpa29uZS5zaGlnYS5qcAora29rYS5zaGlnYS5qcAora29uYW4uc2hpZ2EuanAKK2tvc2VpLnNoaWdhLmpwCitrb3RvLnNoaWdhLmpwCitrdXNhdHN1LnNoaWdhLmpwCittYWliYXJhLnNoaWdhLmpwCittb3JpeWFtYS5zaGlnYS5qcAorbmFnYWhhbWEuc2hpZ2EuanAKK25pc2hpYXphaS5zaGlnYS5qcAorbm90b2dhd2Euc2hpZ2EuanAKK29taWhhY2hpbWFuLnNoaWdhLmpwCitvdHN1LnNoaWdhLmpwCityaXR0by5zaGlnYS5qcAorcnl1b2guc2hpZ2EuanAKK3Rha2FzaGltYS5zaGlnYS5qcAordGFrYXRzdWtpLnNoaWdhLmpwCit0b3JhaGltZS5zaGlnYS5qcAordG95b3NhdG8uc2hpZ2EuanAKK3lhc3Uuc2hpZ2EuanAKK2FrYWdpLnNoaW1hbmUuanAKK2FtYS5zaGltYW5lLmpwCitnb3RzdS5zaGltYW5lLmpwCitoYW1hZGEuc2hpbWFuZS5qcAoraGlnYXNoaWl6dW1vLnNoaW1hbmUuanAKK2hpa2F3YS5zaGltYW5lLmpwCitoaWtpbWkuc2hpbWFuZS5qcAoraXp1bW8uc2hpbWFuZS5qcAora2FraW5va2kuc2hpbWFuZS5qcAorbWFzdWRhLnNoaW1hbmUuanAKK21hdHN1ZS5zaGltYW5lLmpwCittaXNhdG8uc2hpbWFuZS5qcAorbmlzaGlub3NoaW1hLnNoaW1hbmUuanAKK29oZGEuc2hpbWFuZS5qcAorb2tpbm9zaGltYS5zaGltYW5lLmpwCitva3VpenVtby5zaGltYW5lLmpwCitzaGltYW5lLnNoaW1hbmUuanAKK3RhbWF5dS5zaGltYW5lLmpwCit0c3V3YW5vLnNoaW1hbmUuanAKK3VubmFuLnNoaW1hbmUuanAKK3lha3Vtby5zaGltYW5lLmpwCit5YXN1Z2kuc2hpbWFuZS5qcAoreWF0c3VrYS5zaGltYW5lLmpwCithcmFpLnNoaXp1b2thLmpwCithdGFtaS5zaGl6dW9rYS5qcAorZnVqaS5zaGl6dW9rYS5qcAorZnVqaWVkYS5zaGl6dW9rYS5qcAorZnVqaWthd2Euc2hpenVva2EuanAKK2Z1amlub21peWEuc2hpenVva2EuanAKK2Z1a3Vyb2kuc2hpenVva2EuanAKK2dvdGVtYmEuc2hpenVva2EuanAKK2hhaWJhcmEuc2hpenVva2EuanAKK2hhbWFtYXRzdS5zaGl6dW9rYS5qcAoraGlnYXNoaWl6dS5zaGl6dW9rYS5qcAoraXRvLnNoaXp1b2thLmpwCitpd2F0YS5zaGl6dW9rYS5qcAoraXp1LnNoaXp1b2thLmpwCitpenVub2t1bmkuc2hpenVva2EuanAKK2tha2VnYXdhLnNoaXp1b2thLmpwCitrYW5uYW1pLnNoaXp1b2thLmpwCitrYXdhbmVob24uc2hpenVva2EuanAKK2thd2F6dS5zaGl6dW9rYS5qcAora2lrdWdhd2Euc2hpenVva2EuanAKK2tvc2FpLnNoaXp1b2thLmpwCittYWtpbm9oYXJhLnNoaXp1b2thLmpwCittYXRzdXpha2kuc2hpenVva2EuanAKK21pbmFtaWl6dS5zaGl6dW9rYS5qcAorbWlzaGltYS5zaGl6dW9rYS5qcAorbW9yaW1hY2hpLnNoaXp1b2thLmpwCituaXNoaWl6dS5zaGl6dW9rYS5qcAorbnVtYXp1LnNoaXp1b2thLmpwCitvbWFlemFraS5zaGl6dW9rYS5qcAorc2hpbWFkYS5zaGl6dW9rYS5qcAorc2hpbWl6dS5zaGl6dW9rYS5qcAorc2hpbW9kYS5zaGl6dW9rYS5qcAorc2hpenVva2Euc2hpenVva2EuanAKK3N1c29uby5zaGl6dW9rYS5qcAoreWFpenUuc2hpenVva2EuanAKK3lvc2hpZGEuc2hpenVva2EuanAKK2FzaGlrYWdhLnRvY2hpZ2kuanAKK2JhdG8udG9jaGlnaS5qcAoraGFnYS50b2NoaWdpLmpwCitpY2hpa2FpLnRvY2hpZ2kuanAKK2l3YWZ1bmUudG9jaGlnaS5qcAora2FtaW5va2F3YS50b2NoaWdpLmpwCitrYW51bWEudG9jaGlnaS5qcAora2FyYXN1eWFtYS50b2NoaWdpLmpwCitrdXJvaXNvLnRvY2hpZ2kuanAKK21hc2hpa28udG9jaGlnaS5qcAorbWlidS50b2NoaWdpLmpwCittb2thLnRvY2hpZ2kuanAKK21vdGVnaS50b2NoaWdpLmpwCituYXN1LnRvY2hpZ2kuanAKK25hc3VzaGlvYmFyYS50b2NoaWdpLmpwCituaWtrby50b2NoaWdpLmpwCituaXNoaWthdGEudG9jaGlnaS5qcAorbm9naS50b2NoaWdpLmpwCitvaGlyYS50b2NoaWdpLmpwCitvaHRhd2FyYS50b2NoaWdpLmpwCitveWFtYS50b2NoaWdpLmpwCitzYWt1cmEudG9jaGlnaS5qcAorc2Fuby50b2NoaWdpLmpwCitzaGltb3RzdWtlLnRvY2hpZ2kuanAKK3NoaW95YS50b2NoaWdpLmpwCit0YWthbmV6YXdhLnRvY2hpZ2kuanAKK3RvY2hpZ2kudG9jaGlnaS5qcAordHN1Z2EudG9jaGlnaS5qcAordWppaWUudG9jaGlnaS5qcAordXRzdW5vbWl5YS50b2NoaWdpLmpwCit5YWl0YS50b2NoaWdpLmpwCithaXp1bWkudG9rdXNoaW1hLmpwCithbmFuLnRva3VzaGltYS5qcAoraWNoaWJhLnRva3VzaGltYS5qcAoraXRhbm8udG9rdXNoaW1hLmpwCitrYWluYW4udG9rdXNoaW1hLmpwCitrb21hdHN1c2hpbWEudG9rdXNoaW1hLmpwCittYXRzdXNoaWdlLnRva3VzaGltYS5qcAorbWltYS50b2t1c2hpbWEuanAKK21pbmFtaS50b2t1c2hpbWEuanAKK21peW9zaGkudG9rdXNoaW1hLmpwCittdWdpLnRva3VzaGltYS5qcAorbmFrYWdhd2EudG9rdXNoaW1hLmpwCituYXJ1dG8udG9rdXNoaW1hLmpwCitzYW5hZ29jaGkudG9rdXNoaW1hLmpwCitzaGlzaGlrdWkudG9rdXNoaW1hLmpwCit0b2t1c2hpbWEudG9rdXNoaW1hLmpwCit3YWppa2kudG9rdXNoaW1hLmpwCithZGFjaGkudG9reW8uanAKK2FraXJ1bm8udG9reW8uanAKK2FraXNoaW1hLnRva3lvLmpwCithb2dhc2hpbWEudG9reW8uanAKK2FyYWthd2EudG9reW8uanAKK2J1bmt5by50b2t5by5qcAorY2hpeW9kYS50b2t5by5qcAorY2hvZnUudG9reW8uanAKK2NodW8udG9reW8uanAKK2Vkb2dhd2EudG9reW8uanAKK2Z1Y2h1LnRva3lvLmpwCitmdXNzYS50b2t5by5qcAoraGFjaGlqby50b2t5by5qcAoraGFjaGlvamkudG9reW8uanAKK2hhbXVyYS50b2t5by5qcAoraGlnYXNoaWt1cnVtZS50b2t5by5qcAoraGlnYXNoaW11cmF5YW1hLnRva3lvLmpwCitoaWdhc2hpeWFtYXRvLnRva3lvLmpwCitoaW5vLnRva3lvLmpwCitoaW5vZGUudG9reW8uanAKK2hpbm9oYXJhLnRva3lvLmpwCitpbmFnaS50b2t5by5qcAoraXRhYmFzaGkudG9reW8uanAKK2thdHN1c2hpa2EudG9reW8uanAKK2tpdGEudG9reW8uanAKK2tpeW9zZS50b2t5by5qcAora29kYWlyYS50b2t5by5qcAora29nYW5laS50b2t5by5qcAora29rdWJ1bmppLnRva3lvLmpwCitrb21hZS50b2t5by5qcAora290by50b2t5by5qcAora291enVzaGltYS50b2t5by5qcAora3VuaXRhY2hpLnRva3lvLmpwCittYWNoaWRhLnRva3lvLmpwCittZWd1cm8udG9reW8uanAKK21pbmF0by50b2t5by5qcAorbWl0YWthLnRva3lvLmpwCittaXp1aG8udG9reW8uanAKK211c2FzaGltdXJheWFtYS50b2t5by5qcAorbXVzYXNoaW5vLnRva3lvLmpwCituYWthbm8udG9reW8uanAKK25lcmltYS50b2t5by5qcAorb2dhc2F3YXJhLnRva3lvLmpwCitva3V0YW1hLnRva3lvLmpwCitvbWUudG9reW8uanAKK29zaGltYS50b2t5by5qcAorb3RhLnRva3lvLmpwCitzZXRhZ2F5YS50b2t5by5qcAorc2hpYnV5YS50b2t5by5qcAorc2hpbmFnYXdhLnRva3lvLmpwCitzaGluanVrdS50b2t5by5qcAorc3VnaW5hbWkudG9reW8uanAKK3N1bWlkYS50b2t5by5qcAordGFjaGlrYXdhLnRva3lvLmpwCit0YWl0by50b2t5by5qcAordGFtYS50b2t5by5qcAordG9zaGltYS50b2t5by5qcAorY2hpenUudG90dG9yaS5qcAoraGluby50b3R0b3JpLmpwCitrYXdhaGFyYS50b3R0b3JpLmpwCitrb2dlLnRvdHRvcmkuanAKK2tvdG91cmEudG90dG9yaS5qcAorbWlzYXNhLnRvdHRvcmkuanAKK25hbmJ1LnRvdHRvcmkuanAKK25pY2hpbmFuLnRvdHRvcmkuanAKK3Nha2FpbWluYXRvLnRvdHRvcmkuanAKK3RvdHRvcmkudG90dG9yaS5qcAord2FrYXNhLnRvdHRvcmkuanAKK3lhenUudG90dG9yaS5qcAoreW9uYWdvLnRvdHRvcmkuanAKK2FzYWhpLnRveWFtYS5qcAorZnVjaHUudG95YW1hLmpwCitmdWt1bWl0c3UudG95YW1hLmpwCitmdW5haGFzaGkudG95YW1hLmpwCitoaW1pLnRveWFtYS5qcAoraW1penUudG95YW1hLmpwCitpbmFtaS50b3lhbWEuanAKK2pvaGFuYS50b3lhbWEuanAKK2thbWlpY2hpLnRveWFtYS5qcAora3Vyb2JlLnRveWFtYS5qcAorbmFrYW5paWthd2EudG95YW1hLmpwCituYW1lcmlrYXdhLnRveWFtYS5qcAorbmFudG8udG95YW1hLmpwCitueXV6ZW4udG95YW1hLmpwCitveWFiZS50b3lhbWEuanAKK3RhaXJhLnRveWFtYS5qcAordGFrYW9rYS50b3lhbWEuanAKK3RhdGV5YW1hLnRveWFtYS5qcAordG9nYS50b3lhbWEuanAKK3RvbmFtaS50b3lhbWEuanAKK3RveWFtYS50b3lhbWEuanAKK3VuYXp1a2kudG95YW1hLmpwCit1b3p1LnRveWFtYS5qcAoreWFtYWRhLnRveWFtYS5qcAorYXJpZGEud2FrYXlhbWEuanAKK2FyaWRhZ2F3YS53YWtheWFtYS5qcAorZ29iby53YWtheWFtYS5qcAoraGFzaGltb3RvLndha2F5YW1hLmpwCitoaWRha2Eud2FrYXlhbWEuanAKK2hpcm9nYXdhLndha2F5YW1hLmpwCitpbmFtaS53YWtheWFtYS5qcAoraXdhZGUud2FrYXlhbWEuanAKK2thaW5hbi53YWtheWFtYS5qcAora2FtaXRvbmRhLndha2F5YW1hLmpwCitrYXRzdXJhZ2kud2FrYXlhbWEuanAKK2tpbWluby53YWtheWFtYS5qcAora2lub2thd2Eud2FrYXlhbWEuanAKK2tpdGF5YW1hLndha2F5YW1hLmpwCitrb3lhLndha2F5YW1hLmpwCitrb3phLndha2F5YW1hLmpwCitrb3phZ2F3YS53YWtheWFtYS5qcAora3Vkb3lhbWEud2FrYXlhbWEuanAKK2t1c2hpbW90by53YWtheWFtYS5qcAorbWloYW1hLndha2F5YW1hLmpwCittaXNhdG8ud2FrYXlhbWEuanAKK25hY2hpa2F0c3V1cmEud2FrYXlhbWEuanAKK3NoaW5ndS53YWtheWFtYS5qcAorc2hpcmFoYW1hLndha2F5YW1hLmpwCit0YWlqaS53YWtheWFtYS5qcAordGFuYWJlLndha2F5YW1hLmpwCit3YWtheWFtYS53YWtheWFtYS5qcAoreXVhc2Eud2FrYXlhbWEuanAKK3l1cmEud2FrYXlhbWEuanAKK2FzYWhpLnlhbWFnYXRhLmpwCitmdW5hZ2F0YS55YW1hZ2F0YS5qcAoraGlnYXNoaW5lLnlhbWFnYXRhLmpwCitpaWRlLnlhbWFnYXRhLmpwCitrYWhva3UueWFtYWdhdGEuanAKK2thbWlub3lhbWEueWFtYWdhdGEuanAKK2thbmV5YW1hLnlhbWFnYXRhLmpwCitrYXdhbmlzaGkueWFtYWdhdGEuanAKK21hbXVyb2dhd2EueWFtYWdhdGEuanAKK21pa2F3YS55YW1hZ2F0YS5qcAorbXVyYXlhbWEueWFtYWdhdGEuanAKK25hZ2FpLnlhbWFnYXRhLmpwCituYWtheWFtYS55YW1hZ2F0YS5qcAorbmFueW8ueWFtYWdhdGEuanAKK25pc2hpa2F3YS55YW1hZ2F0YS5qcAorb2JhbmF6YXdhLnlhbWFnYXRhLmpwCitvZS55YW1hZ2F0YS5qcAorb2d1bmkueWFtYWdhdGEuanAKK29oa3VyYS55YW1hZ2F0YS5qcAorb2lzaGlkYS55YW1hZ2F0YS5qcAorc2FnYWUueWFtYWdhdGEuanAKK3Nha2F0YS55YW1hZ2F0YS5qcAorc2FrZWdhd2EueWFtYWdhdGEuanAKK3NoaW5qby55YW1hZ2F0YS5qcAorc2hpcmF0YWthLnlhbWFnYXRhLmpwCitzaG9uYWkueWFtYWdhdGEuanAKK3Rha2FoYXRhLnlhbWFnYXRhLmpwCit0ZW5kby55YW1hZ2F0YS5qcAordG96YXdhLnlhbWFnYXRhLmpwCit0c3VydW9rYS55YW1hZ2F0YS5qcAoreWFtYWdhdGEueWFtYWdhdGEuanAKK3lhbWFub2JlLnlhbWFnYXRhLmpwCit5b25lemF3YS55YW1hZ2F0YS5qcAoreXV6YS55YW1hZ2F0YS5qcAorYWJ1LnlhbWFndWNoaS5qcAoraGFnaS55YW1hZ3VjaGkuanAKK2hpa2FyaS55YW1hZ3VjaGkuanAKK2hvZnUueWFtYWd1Y2hpLmpwCitpd2FrdW5pLnlhbWFndWNoaS5qcAora3VkYW1hdHN1LnlhbWFndWNoaS5qcAorbWl0b3UueWFtYWd1Y2hpLmpwCituYWdhdG8ueWFtYWd1Y2hpLmpwCitvc2hpbWEueWFtYWd1Y2hpLmpwCitzaGltb25vc2VraS55YW1hZ3VjaGkuanAKK3NodW5hbi55YW1hZ3VjaGkuanAKK3RhYnVzZS55YW1hZ3VjaGkuanAKK3Rva3V5YW1hLnlhbWFndWNoaS5qcAordG95b3RhLnlhbWFndWNoaS5qcAordWJlLnlhbWFndWNoaS5qcAoreXV1LnlhbWFndWNoaS5qcAorY2h1by55YW1hbmFzaGkuanAKK2Rvc2hpLnlhbWFuYXNoaS5qcAorZnVlZnVraS55YW1hbmFzaGkuanAKK2Z1amlrYXdhLnlhbWFuYXNoaS5qcAorZnVqaWthd2FndWNoaWtvLnlhbWFuYXNoaS5qcAorZnVqaXlvc2hpZGEueWFtYW5hc2hpLmpwCitoYXlha2F3YS55YW1hbmFzaGkuanAKK2hva3V0by55YW1hbmFzaGkuanAKK2ljaGlrYXdhbWlzYXRvLnlhbWFuYXNoaS5qcAora2FpLnlhbWFuYXNoaS5qcAora29mdS55YW1hbmFzaGkuanAKK2tvc2h1LnlhbWFuYXNoaS5qcAora29zdWdlLnlhbWFuYXNoaS5qcAorbWluYW1pLWFscHMueWFtYW5hc2hpLmpwCittaW5vYnUueWFtYW5hc2hpLmpwCituYWthbWljaGkueWFtYW5hc2hpLmpwCituYW5idS55YW1hbmFzaGkuanAKK25hcnVzYXdhLnlhbWFuYXNoaS5qcAorbmlyYXNha2kueWFtYW5hc2hpLmpwCituaXNoaWthdHN1cmEueWFtYW5hc2hpLmpwCitvc2hpbm8ueWFtYW5hc2hpLmpwCitvdHN1a2kueWFtYW5hc2hpLmpwCitzaG93YS55YW1hbmFzaGkuanAKK3RhYmF5YW1hLnlhbWFuYXNoaS5qcAordHN1cnUueWFtYW5hc2hpLmpwCit1ZW5vaGFyYS55YW1hbmFzaGkuanAKK3lhbWFuYWtha28ueWFtYW5hc2hpLmpwCit5YW1hbmFzaGkueWFtYW5hc2hpLmpwCisKKy8vIGtlIDogaHR0cDovL3d3dy5rZW5pYy5vci5rZS9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0xMTcmSXRlbWlkPTE0NQorKi5rZQorCisvLyBrZyA6IGh0dHA6Ly93d3cuZG9tYWluLmtnL2Rtbl9uLmh0bWwKK2tnCitvcmcua2cKK25ldC5rZworY29tLmtnCitlZHUua2cKK2dvdi5rZworbWlsLmtnCisKKy8vIGtoIDogaHR0cDovL3d3dy5tcHRjLmdvdi5raC9kbnNfcmVnaXN0cmF0aW9uLmh0bQorKi5raAorCisvLyBraSA6IGh0dHA6Ly93d3cua2kvZG5zL2luZGV4Lmh0bWwKK2tpCitlZHUua2kKK2Jpei5raQorbmV0LmtpCitvcmcua2kKK2dvdi5raQoraW5mby5raQorY29tLmtpCisKKy8vIGttIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmttCisvLyBodHRwOi8vd3d3LmRvbWFpbmUua20vZG9jdW1lbnRzL2NoYXJ0ZS5kb2MKK2ttCitvcmcua20KK25vbS5rbQorZ292LmttCitwcmQua20KK3RtLmttCitlZHUua20KK21pbC5rbQorYXNzLmttCitjb20ua20KKy8vIFRoZXNlIGFyZSBvbmx5IG1lbnRpb25lZCBhcyBwcm9wb3NlZCBzdWdnZXN0aW9ucyBhdCBkb21haW5lLmttLCBidXQKKy8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5rbSBzYXlzIHRoZXkncmUgYXZhaWxhYmxlIGZvciByZWdpc3RyYXRpb246Citjb29wLmttCithc3NvLmttCitwcmVzc2Uua20KK21lZGVjaW4ua20KK25vdGFpcmVzLmttCitwaGFybWFjaWVucy5rbQordmV0ZXJpbmFpcmUua20KK2dvdXYua20KKworLy8ga24gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ua24KKy8vIGh0dHA6Ly93d3cuZG90LmtuL2RvbWFpblJ1bGVzLmh0bWwKK2tuCituZXQua24KK29yZy5rbgorZWR1LmtuCitnb3Yua24KKworLy8ga3AgOiBodHRwOi8vd3d3LmtjY2Uua3AvZW5faW5kZXgucGhwCitrcAorY29tLmtwCitlZHUua3AKK2dvdi5rcAorb3JnLmtwCityZXAua3AKK3RyYS5rcAorCisvLyBrciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5rcgorLy8gc2VlIGFsc286IGh0dHA6Ly9kb21haW4ubmlkYS5vci5rci9lbmcvcmVnaXN0cmF0aW9uLmpzcAora3IKK2FjLmtyCitjby5rcgorZXMua3IKK2dvLmtyCitocy5rcgora2cua3IKK21pbC5rcgorbXMua3IKK25lLmtyCitvci5rcgorcGUua3IKK3JlLmtyCitzYy5rcgorLy8ga3IgZ2VvZ3JhcGhpY2FsIG5hbWVzCitidXNhbi5rcgorY2h1bmdidWsua3IKK2NodW5nbmFtLmtyCitkYWVndS5rcgorZGFlamVvbi5rcgorZ2FuZ3dvbi5rcgorZ3dhbmdqdS5rcgorZ3llb25nYnVrLmtyCitneWVvbmdnaS5rcgorZ3llb25nbmFtLmtyCitpbmNoZW9uLmtyCitqZWp1LmtyCitqZW9uYnVrLmtyCitqZW9ubmFtLmtyCitzZW91bC5rcgordWxzYW4ua3IKKworLy8ga3cgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ua3cKKyoua3cKKworLy8ga3kgOiBodHRwOi8vd3d3LmljdGEua3kvZGFfa3lfcmVnX2RvbS5waHAKKy8vIENvbmZpcm1lZCBieSByZWdpc3RyeSA8a3lzdXBwb3J0QHBlcmltZXRlcnVzYS5jb20+IDIwMDgtMDYtMTcKK2t5CitlZHUua3kKK2dvdi5reQorY29tLmt5Citvcmcua3kKK25ldC5reQorCisvLyBreiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5regorLy8gc2VlIGFsc286IGh0dHA6Ly93d3cubmljLmt6L3J1bGVzL2luZGV4LmpzcAora3oKK29yZy5regorZWR1Lmt6CituZXQua3oKK2dvdi5regorbWlsLmt6Citjb20ua3oKKworLy8gbGEgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubGEKKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8Z2F2aW4uYnJvd25AbmljLmxhPgorbGEKK2ludC5sYQorbmV0LmxhCitpbmZvLmxhCitlZHUubGEKK2dvdi5sYQorcGVyLmxhCitjb20ubGEKK29yZy5sYQorCisvLyBsYiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5sYgorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxyYW5keUBwc2cuY29tPgorbGIKK2NvbS5sYgorZWR1LmxiCitnb3YubGIKK25ldC5sYgorb3JnLmxiCisKKy8vIGxjIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmxjCisvLyBzZWUgYWxzbzogaHR0cDovL3d3dy5uaWMubGMvcnVsZXMuaHRtCitsYworY29tLmxjCituZXQubGMKK2NvLmxjCitvcmcubGMKK2VkdS5sYworZ292LmxjCisKKy8vIGxpIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmxpCitsaQorCisvLyBsayA6IGh0dHA6Ly93d3cubmljLmxrL3NlY2xldnByLmh0bWwKK2xrCitnb3YubGsKK3NjaC5saworbmV0LmxrCitpbnQubGsKK2NvbS5saworb3JnLmxrCitlZHUubGsKK25nby5saworc29jLmxrCit3ZWIubGsKK2x0ZC5saworYXNzbi5saworZ3JwLmxrCitob3RlbC5saworYWMubGsKKworLy8gbHIgOiBodHRwOi8vcHNnLmNvbS9kbnMvbHIvbHIudHh0CisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPHJhbmR5QHBzZy5jb20+CitscgorY29tLmxyCitlZHUubHIKK2dvdi5scgorb3JnLmxyCituZXQubHIKKworLy8gbHMgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubHMKK2xzCitjby5scworb3JnLmxzCisKKy8vIGx0IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLmx0CitsdAorLy8gZ292Lmx0IDogaHR0cDovL3d3dy5nb3YubHQvaW5kZXhfZW4ucGhwCitnb3YubHQKKworLy8gbHUgOiBodHRwOi8vd3d3LmRucy5sdS9lbi8KK2x1CisKKy8vIGx2IDogaHR0cDovL3d3dy5uaWMubHYvRE5TL0VuL2dlbmVyaWMucGhwCitsdgorY29tLmx2CitlZHUubHYKK2dvdi5sdgorb3JnLmx2CittaWwubHYKK2lkLmx2CituZXQubHYKK2Fzbi5sdgorY29uZi5sdgorCisvLyBseSA6IGh0dHA6Ly93d3cubmljLmx5L3JlZ3VsYXRpb25zLnBocAorbHkKK2NvbS5seQorbmV0Lmx5Citnb3YubHkKK3BsYy5seQorZWR1Lmx5CitzY2gubHkKK21lZC5seQorb3JnLmx5CitpZC5seQorCisvLyBtYSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5tYQorLy8gaHR0cDovL3d3dy5hbnJ0Lm1hL2ZyL2FkbWluL2Rvd25sb2FkL3VwbG9hZC9maWxlX2ZyNzgyLnBkZgorbWEKK2NvLm1hCituZXQubWEKK2dvdi5tYQorb3JnLm1hCithYy5tYQorcHJlc3MubWEKKworLy8gbWMgOiBodHRwOi8vd3d3Lm5pYy5tYy8KK21jCit0bS5tYworYXNzby5tYworCisvLyBtZCA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5tZAorbWQKKworLy8gbWUgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubWUKK21lCitjby5tZQorbmV0Lm1lCitvcmcubWUKK2VkdS5tZQorYWMubWUKK2dvdi5tZQoraXRzLm1lCitwcml2Lm1lCisKKy8vIG1nIDogaHR0cDovL25pYy5tZy9uaWNtZy8/cGFnZV9pZD0zOQorbWcKK29yZy5tZworbm9tLm1nCitnb3YubWcKK3ByZC5tZwordG0ubWcKK2VkdS5tZworbWlsLm1nCitjb20ubWcKK2NvLm1nCisKKy8vIG1oIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLm1oCittaAorCisvLyBtaWwgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubWlsCittaWwKKworLy8gbWsgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubWsKKy8vIHNlZSBhbHNvOiBodHRwOi8vZG5zLm1hcm5ldC5uZXQubWsvcG9zdGFwa2EucGhwCittaworY29tLm1rCitvcmcubWsKK25ldC5taworZWR1Lm1rCitnb3YubWsKK2luZi5taworbmFtZS5taworCisvLyBtbCA6IGh0dHA6Ly93d3cuZ29iaW4uaW5mby9kb21haW5uYW1lL21sLXRlbXBsYXRlLmRvYworLy8gc2VlIGFsc286IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5tbAorbWwKK2NvbS5tbAorZWR1Lm1sCitnb3V2Lm1sCitnb3YubWwKK25ldC5tbAorb3JnLm1sCitwcmVzc2UubWwKKworLy8gbW0gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubW0KKyoubW0KKworLy8gbW4gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubW4KK21uCitnb3YubW4KK2VkdS5tbgorb3JnLm1uCisKKy8vIG1vIDogaHR0cDovL3d3dy5tb25pYy5uZXQubW8vCittbworY29tLm1vCituZXQubW8KK29yZy5tbworZWR1Lm1vCitnb3YubW8KKworLy8gbW9iaSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5tb2JpCittb2JpCisKKy8vIG1wIDogaHR0cDovL3d3dy5kb3QubXAvCisvLyBDb25maXJtZWQgYnkgcmVnaXN0cnkgPGRjYW1hY2hvQHNhaXBhbi5jb20+IDIwMDgtMDYtMTcKK21wCisKKy8vIG1xIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLm1xCittcQorCisvLyBtciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5tcgorbXIKK2dvdi5tcgorCisvLyBtcyA6IGh0dHA6Ly93d3cubmljLm1zL3BkZi9NU19Eb21haW5fTmFtZV9SdWxlcy5wZGYKK21zCitjb20ubXMKK2VkdS5tcworZ292Lm1zCituZXQubXMKK29yZy5tcworCisvLyBtdCA6IGh0dHBzOi8vd3d3Lm5pYy5vcmcubXQvZ28vcG9saWN5CisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPGhlbHBAbmljLm9yZy5tdD4KK210Citjb20ubXQKK2VkdS5tdAorbmV0Lm10CitvcmcubXQKKworLy8gbXUgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubXUKK211Citjb20ubXUKK25ldC5tdQorb3JnLm11Citnb3YubXUKK2FjLm11Citjby5tdQorb3IubXUKKworLy8gbXVzZXVtIDogaHR0cDovL2Fib3V0Lm11c2V1bS9uYW1pbmcvCisvLyBodHRwOi8vaW5kZXgubXVzZXVtLworbXVzZXVtCithY2FkZW15Lm11c2V1bQorYWdyaWN1bHR1cmUubXVzZXVtCithaXIubXVzZXVtCithaXJndWFyZC5tdXNldW0KK2FsYWJhbWEubXVzZXVtCithbGFza2EubXVzZXVtCithbWJlci5tdXNldW0KK2FtYnVsYW5jZS5tdXNldW0KK2FtZXJpY2FuLm11c2V1bQorYW1lcmljYW5hLm11c2V1bQorYW1lcmljYW5hbnRpcXVlcy5tdXNldW0KK2FtZXJpY2FuYXJ0Lm11c2V1bQorYW1zdGVyZGFtLm11c2V1bQorYW5kLm11c2V1bQorYW5uZWZyYW5rLm11c2V1bQorYW50aHJvLm11c2V1bQorYW50aHJvcG9sb2d5Lm11c2V1bQorYW50aXF1ZXMubXVzZXVtCithcXVhcml1bS5tdXNldW0KK2FyYm9yZXR1bS5tdXNldW0KK2FyY2hhZW9sb2dpY2FsLm11c2V1bQorYXJjaGFlb2xvZ3kubXVzZXVtCithcmNoaXRlY3R1cmUubXVzZXVtCithcnQubXVzZXVtCithcnRhbmRkZXNpZ24ubXVzZXVtCithcnRjZW50ZXIubXVzZXVtCithcnRkZWNvLm11c2V1bQorYXJ0ZWR1Y2F0aW9uLm11c2V1bQorYXJ0Z2FsbGVyeS5tdXNldW0KK2FydHMubXVzZXVtCithcnRzYW5kY3JhZnRzLm11c2V1bQorYXNtYXRhcnQubXVzZXVtCithc3Nhc3NpbmF0aW9uLm11c2V1bQorYXNzaXNpLm11c2V1bQorYXNzb2NpYXRpb24ubXVzZXVtCithc3Ryb25vbXkubXVzZXVtCithdGxhbnRhLm11c2V1bQorYXVzdGluLm11c2V1bQorYXVzdHJhbGlhLm11c2V1bQorYXV0b21vdGl2ZS5tdXNldW0KK2F2aWF0aW9uLm11c2V1bQorYXhpcy5tdXNldW0KK2JhZGFqb3oubXVzZXVtCitiYWdoZGFkLm11c2V1bQorYmFobi5tdXNldW0KK2JhbGUubXVzZXVtCitiYWx0aW1vcmUubXVzZXVtCitiYXJjZWxvbmEubXVzZXVtCitiYXNlYmFsbC5tdXNldW0KK2Jhc2VsLm11c2V1bQorYmF0aHMubXVzZXVtCitiYXVlcm4ubXVzZXVtCitiZWF1eGFydHMubXVzZXVtCitiZWVsZGVuZ2VsdWlkLm11c2V1bQorYmVsbGV2dWUubXVzZXVtCitiZXJnYmF1Lm11c2V1bQorYmVya2VsZXkubXVzZXVtCitiZXJsaW4ubXVzZXVtCitiZXJuLm11c2V1bQorYmlibGUubXVzZXVtCitiaWxiYW8ubXVzZXVtCitiaWxsLm11c2V1bQorYmlyZGFydC5tdXNldW0KK2JpcnRocGxhY2UubXVzZXVtCitib25uLm11c2V1bQorYm9zdG9uLm11c2V1bQorYm90YW5pY2FsLm11c2V1bQorYm90YW5pY2FsZ2FyZGVuLm11c2V1bQorYm90YW5pY2dhcmRlbi5tdXNldW0KK2JvdGFueS5tdXNldW0KK2JyYW5keXdpbmV2YWxsZXkubXVzZXVtCiticmFzaWwubXVzZXVtCiticmlzdG9sLm11c2V1bQorYnJpdGlzaC5tdXNldW0KK2JyaXRpc2hjb2x1bWJpYS5tdXNldW0KK2Jyb2FkY2FzdC5tdXNldW0KK2JydW5lbC5tdXNldW0KK2JydXNzZWwubXVzZXVtCiticnVzc2Vscy5tdXNldW0KK2JydXhlbGxlcy5tdXNldW0KK2J1aWxkaW5nLm11c2V1bQorYnVyZ2hvZi5tdXNldW0KK2J1cy5tdXNldW0KK2J1c2hleS5tdXNldW0KK2NhZGFxdWVzLm11c2V1bQorY2FsaWZvcm5pYS5tdXNldW0KK2NhbWJyaWRnZS5tdXNldW0KK2Nhbi5tdXNldW0KK2NhbmFkYS5tdXNldW0KK2NhcGVicmV0b24ubXVzZXVtCitjYXJyaWVyLm11c2V1bQorY2FydG9vbmFydC5tdXNldW0KK2Nhc2FkZWxhbW9uZWRhLm11c2V1bQorY2FzdGxlLm11c2V1bQorY2FzdHJlcy5tdXNldW0KK2NlbHRpYy5tdXNldW0KK2NlbnRlci5tdXNldW0KK2NoYXR0YW5vb2dhLm11c2V1bQorY2hlbHRlbmhhbS5tdXNldW0KK2NoZXNhcGVha2ViYXkubXVzZXVtCitjaGljYWdvLm11c2V1bQorY2hpbGRyZW4ubXVzZXVtCitjaGlsZHJlbnMubXVzZXVtCitjaGlsZHJlbnNnYXJkZW4ubXVzZXVtCitjaGlyb3ByYWN0aWMubXVzZXVtCitjaG9jb2xhdGUubXVzZXVtCitjaHJpc3RpYW5zYnVyZy5tdXNldW0KK2NpbmNpbm5hdGkubXVzZXVtCitjaW5lbWEubXVzZXVtCitjaXJjdXMubXVzZXVtCitjaXZpbGlzYXRpb24ubXVzZXVtCitjaXZpbGl6YXRpb24ubXVzZXVtCitjaXZpbHdhci5tdXNldW0KK2NsaW50b24ubXVzZXVtCitjbG9jay5tdXNldW0KK2NvYWwubXVzZXVtCitjb2FzdGFsZGVmZW5jZS5tdXNldW0KK2NvZHkubXVzZXVtCitjb2xkd2FyLm11c2V1bQorY29sbGVjdGlvbi5tdXNldW0KK2NvbG9uaWFsd2lsbGlhbXNidXJnLm11c2V1bQorY29sb3JhZG9wbGF0ZWF1Lm11c2V1bQorY29sdW1iaWEubXVzZXVtCitjb2x1bWJ1cy5tdXNldW0KK2NvbW11bmljYXRpb24ubXVzZXVtCitjb21tdW5pY2F0aW9ucy5tdXNldW0KK2NvbW11bml0eS5tdXNldW0KK2NvbXB1dGVyLm11c2V1bQorY29tcHV0ZXJoaXN0b3J5Lm11c2V1bQorY29tdW5pY2HDp8O1ZXMubXVzZXVtCitjb250ZW1wb3JhcnkubXVzZXVtCitjb250ZW1wb3JhcnlhcnQubXVzZXVtCitjb252ZW50Lm11c2V1bQorY29wZW5oYWdlbi5tdXNldW0KK2NvcnBvcmF0aW9uLm11c2V1bQorY29ycmVpb3MtZS10ZWxlY29tdW5pY2HDp8O1ZXMubXVzZXVtCitjb3J2ZXR0ZS5tdXNldW0KK2Nvc3R1bWUubXVzZXVtCitjb3VudHJ5ZXN0YXRlLm11c2V1bQorY291bnR5Lm11c2V1bQorY3JhZnRzLm11c2V1bQorY3JhbmJyb29rLm11c2V1bQorY3JlYXRpb24ubXVzZXVtCitjdWx0dXJhbC5tdXNldW0KK2N1bHR1cmFsY2VudGVyLm11c2V1bQorY3VsdHVyZS5tdXNldW0KK2N5YmVyLm11c2V1bQorY3ltcnUubXVzZXVtCitkYWxpLm11c2V1bQorZGFsbGFzLm11c2V1bQorZGF0YWJhc2UubXVzZXVtCitkZHIubXVzZXVtCitkZWNvcmF0aXZlYXJ0cy5tdXNldW0KK2RlbGF3YXJlLm11c2V1bQorZGVsbWVuaG9yc3QubXVzZXVtCitkZW5tYXJrLm11c2V1bQorZGVwb3QubXVzZXVtCitkZXNpZ24ubXVzZXVtCitkZXRyb2l0Lm11c2V1bQorZGlub3NhdXIubXVzZXVtCitkaXNjb3ZlcnkubXVzZXVtCitkb2xscy5tdXNldW0KK2Rvbm9zdGlhLm11c2V1bQorZHVyaGFtLm11c2V1bQorZWFzdGFmcmljYS5tdXNldW0KK2Vhc3Rjb2FzdC5tdXNldW0KK2VkdWNhdGlvbi5tdXNldW0KK2VkdWNhdGlvbmFsLm11c2V1bQorZWd5cHRpYW4ubXVzZXVtCitlaXNlbmJhaG4ubXVzZXVtCitlbGJ1cmcubXVzZXVtCitlbHZlbmRyZWxsLm11c2V1bQorZW1icm9pZGVyeS5tdXNldW0KK2VuY3ljbG9wZWRpYy5tdXNldW0KK2VuZ2xhbmQubXVzZXVtCitlbnRvbW9sb2d5Lm11c2V1bQorZW52aXJvbm1lbnQubXVzZXVtCitlbnZpcm9ubWVudGFsY29uc2VydmF0aW9uLm11c2V1bQorZXBpbGVwc3kubXVzZXVtCitlc3NleC5tdXNldW0KK2VzdGF0ZS5tdXNldW0KK2V0aG5vbG9neS5tdXNldW0KK2V4ZXRlci5tdXNldW0KK2V4aGliaXRpb24ubXVzZXVtCitmYW1pbHkubXVzZXVtCitmYXJtLm11c2V1bQorZmFybWVxdWlwbWVudC5tdXNldW0KK2Zhcm1lcnMubXVzZXVtCitmYXJtc3RlYWQubXVzZXVtCitmaWVsZC5tdXNldW0KK2ZpZ3VlcmVzLm11c2V1bQorZmlsYXRlbGlhLm11c2V1bQorZmlsbS5tdXNldW0KK2ZpbmVhcnQubXVzZXVtCitmaW5lYXJ0cy5tdXNldW0KK2ZpbmxhbmQubXVzZXVtCitmbGFuZGVycy5tdXNldW0KK2Zsb3JpZGEubXVzZXVtCitmb3JjZS5tdXNldW0KK2ZvcnRtaXNzb3VsYS5tdXNldW0KK2ZvcnR3b3J0aC5tdXNldW0KK2ZvdW5kYXRpb24ubXVzZXVtCitmcmFuY2Fpc2UubXVzZXVtCitmcmFua2Z1cnQubXVzZXVtCitmcmFuemlza2FuZXIubXVzZXVtCitmcmVlbWFzb25yeS5tdXNldW0KK2ZyZWlidXJnLm11c2V1bQorZnJpYm91cmcubXVzZXVtCitmcm9nLm11c2V1bQorZnVuZGFjaW8ubXVzZXVtCitmdXJuaXR1cmUubXVzZXVtCitnYWxsZXJ5Lm11c2V1bQorZ2FyZGVuLm11c2V1bQorZ2F0ZXdheS5tdXNldW0KK2dlZWx2aW5jay5tdXNldW0KK2dlbW9sb2dpY2FsLm11c2V1bQorZ2VvbG9neS5tdXNldW0KK2dlb3JnaWEubXVzZXVtCitnaWVzc2VuLm11c2V1bQorZ2xhcy5tdXNldW0KK2dsYXNzLm11c2V1bQorZ29yZ2UubXVzZXVtCitncmFuZHJhcGlkcy5tdXNldW0KK2dyYXoubXVzZXVtCitndWVybnNleS5tdXNldW0KK2hhbGxvZmZhbWUubXVzZXVtCitoYW1idXJnLm11c2V1bQoraGFuZHNvbi5tdXNldW0KK2hhcnZlc3RjZWxlYnJhdGlvbi5tdXNldW0KK2hhd2FpaS5tdXNldW0KK2hlYWx0aC5tdXNldW0KK2hlaW1hdHVuZHVocmVuLm11c2V1bQoraGVsbGFzLm11c2V1bQoraGVsc2lua2kubXVzZXVtCitoZW1ieWdkc2ZvcmJ1bmQubXVzZXVtCitoZXJpdGFnZS5tdXNldW0KK2hpc3RvaXJlLm11c2V1bQoraGlzdG9yaWNhbC5tdXNldW0KK2hpc3RvcmljYWxzb2NpZXR5Lm11c2V1bQoraGlzdG9yaWNob3VzZXMubXVzZXVtCitoaXN0b3Jpc2NoLm11c2V1bQoraGlzdG9yaXNjaGVzLm11c2V1bQoraGlzdG9yeS5tdXNldW0KK2hpc3RvcnlvZnNjaWVuY2UubXVzZXVtCitob3JvbG9neS5tdXNldW0KK2hvdXNlLm11c2V1bQoraHVtYW5pdGllcy5tdXNldW0KK2lsbHVzdHJhdGlvbi5tdXNldW0KK2ltYWdlYW5kc291bmQubXVzZXVtCitpbmRpYW4ubXVzZXVtCitpbmRpYW5hLm11c2V1bQoraW5kaWFuYXBvbGlzLm11c2V1bQoraW5kaWFubWFya2V0Lm11c2V1bQoraW50ZWxsaWdlbmNlLm11c2V1bQoraW50ZXJhY3RpdmUubXVzZXVtCitpcmFxLm11c2V1bQoraXJvbi5tdXNldW0KK2lzbGVvZm1hbi5tdXNldW0KK2phbWlzb24ubXVzZXVtCitqZWZmZXJzb24ubXVzZXVtCitqZXJ1c2FsZW0ubXVzZXVtCitqZXdlbHJ5Lm11c2V1bQoramV3aXNoLm11c2V1bQoramV3aXNoYXJ0Lm11c2V1bQoramZrLm11c2V1bQoram91cm5hbGlzbS5tdXNldW0KK2p1ZGFpY2EubXVzZXVtCitqdWR5Z2FybGFuZC5tdXNldW0KK2p1ZWRpc2NoZXMubXVzZXVtCitqdWlmLm11c2V1bQora2FyYXRlLm11c2V1bQora2FyaWthdHVyLm11c2V1bQora2lkcy5tdXNldW0KK2tvZWJlbmhhdm4ubXVzZXVtCitrb2Vsbi5tdXNldW0KK2t1bnN0Lm11c2V1bQora3Vuc3RzYW1tbHVuZy5tdXNldW0KK2t1bnN0dW5kZGVzaWduLm11c2V1bQorbGFib3IubXVzZXVtCitsYWJvdXIubXVzZXVtCitsYWpvbGxhLm11c2V1bQorbGFuY2FzaGlyZS5tdXNldW0KK2xhbmRlcy5tdXNldW0KK2xhbnMubXVzZXVtCitsw6Rucy5tdXNldW0KK2xhcnNzb24ubXVzZXVtCitsZXdpc21pbGxlci5tdXNldW0KK2xpbmNvbG4ubXVzZXVtCitsaW56Lm11c2V1bQorbGl2aW5nLm11c2V1bQorbGl2aW5naGlzdG9yeS5tdXNldW0KK2xvY2FsaGlzdG9yeS5tdXNldW0KK2xvbmRvbi5tdXNldW0KK2xvc2FuZ2VsZXMubXVzZXVtCitsb3V2cmUubXVzZXVtCitsb3lhbGlzdC5tdXNldW0KK2x1Y2VybmUubXVzZXVtCitsdXhlbWJvdXJnLm11c2V1bQorbHV6ZXJuLm11c2V1bQorbWFkLm11c2V1bQorbWFkcmlkLm11c2V1bQorbWFsbG9yY2EubXVzZXVtCittYW5jaGVzdGVyLm11c2V1bQorbWFuc2lvbi5tdXNldW0KK21hbnNpb25zLm11c2V1bQorbWFueC5tdXNldW0KK21hcmJ1cmcubXVzZXVtCittYXJpdGltZS5tdXNldW0KK21hcml0aW1vLm11c2V1bQorbWFyeWxhbmQubXVzZXVtCittYXJ5bGh1cnN0Lm11c2V1bQorbWVkaWEubXVzZXVtCittZWRpY2FsLm11c2V1bQorbWVkaXppbmhpc3RvcmlzY2hlcy5tdXNldW0KK21lZXJlcy5tdXNldW0KK21lbW9yaWFsLm11c2V1bQorbWVzYXZlcmRlLm11c2V1bQorbWljaGlnYW4ubXVzZXVtCittaWRhdGxhbnRpYy5tdXNldW0KK21pbGl0YXJ5Lm11c2V1bQorbWlsbC5tdXNldW0KK21pbmVycy5tdXNldW0KK21pbmluZy5tdXNldW0KK21pbm5lc290YS5tdXNldW0KK21pc3NpbGUubXVzZXVtCittaXNzb3VsYS5tdXNldW0KK21vZGVybi5tdXNldW0KK21vbWEubXVzZXVtCittb25leS5tdXNldW0KK21vbm1vdXRoLm11c2V1bQorbW9udGljZWxsby5tdXNldW0KK21vbnRyZWFsLm11c2V1bQorbW9zY293Lm11c2V1bQorbW90b3JjeWNsZS5tdXNldW0KK211ZW5jaGVuLm11c2V1bQorbXVlbnN0ZXIubXVzZXVtCittdWxob3VzZS5tdXNldW0KK211bmNpZS5tdXNldW0KK211c2VldC5tdXNldW0KK211c2V1bWNlbnRlci5tdXNldW0KK211c2V1bXZlcmVuaWdpbmcubXVzZXVtCittdXNpYy5tdXNldW0KK25hdGlvbmFsLm11c2V1bQorbmF0aW9uYWxmaXJlYXJtcy5tdXNldW0KK25hdGlvbmFsaGVyaXRhZ2UubXVzZXVtCituYXRpdmVhbWVyaWNhbi5tdXNldW0KK25hdHVyYWxoaXN0b3J5Lm11c2V1bQorbmF0dXJhbGhpc3RvcnltdXNldW0ubXVzZXVtCituYXR1cmFsc2NpZW5jZXMubXVzZXVtCituYXR1cmUubXVzZXVtCituYXR1cmhpc3RvcmlzY2hlcy5tdXNldW0KK25hdHV1cndldGVuc2NoYXBwZW4ubXVzZXVtCituYXVtYnVyZy5tdXNldW0KK25hdmFsLm11c2V1bQorbmVicmFza2EubXVzZXVtCituZXVlcy5tdXNldW0KK25ld2hhbXBzaGlyZS5tdXNldW0KK25ld2plcnNleS5tdXNldW0KK25ld21leGljby5tdXNldW0KK25ld3BvcnQubXVzZXVtCituZXdzcGFwZXIubXVzZXVtCituZXd5b3JrLm11c2V1bQorbmllcGNlLm11c2V1bQorbm9yZm9say5tdXNldW0KK25vcnRoLm11c2V1bQorbnJ3Lm11c2V1bQorbnVlcm5iZXJnLm11c2V1bQorbnVyZW1iZXJnLm11c2V1bQorbnljLm11c2V1bQorbnlueS5tdXNldW0KK29jZWFub2dyYXBoaWMubXVzZXVtCitvY2Vhbm9ncmFwaGlxdWUubXVzZXVtCitvbWFoYS5tdXNldW0KK29ubGluZS5tdXNldW0KK29udGFyaW8ubXVzZXVtCitvcGVuYWlyLm11c2V1bQorb3JlZ29uLm11c2V1bQorb3JlZ29udHJhaWwubXVzZXVtCitvdGFnby5tdXNldW0KK294Zm9yZC5tdXNldW0KK3BhY2lmaWMubXVzZXVtCitwYWRlcmJvcm4ubXVzZXVtCitwYWxhY2UubXVzZXVtCitwYWxlby5tdXNldW0KK3BhbG1zcHJpbmdzLm11c2V1bQorcGFuYW1hLm11c2V1bQorcGFyaXMubXVzZXVtCitwYXNhZGVuYS5tdXNldW0KK3BoYXJtYWN5Lm11c2V1bQorcGhpbGFkZWxwaGlhLm11c2V1bQorcGhpbGFkZWxwaGlhYXJlYS5tdXNldW0KK3BoaWxhdGVseS5tdXNldW0KK3Bob2VuaXgubXVzZXVtCitwaG90b2dyYXBoeS5tdXNldW0KK3BpbG90cy5tdXNldW0KK3BpdHRzYnVyZ2gubXVzZXVtCitwbGFuZXRhcml1bS5tdXNldW0KK3BsYW50YXRpb24ubXVzZXVtCitwbGFudHMubXVzZXVtCitwbGF6YS5tdXNldW0KK3BvcnRhbC5tdXNldW0KK3BvcnRsYW5kLm11c2V1bQorcG9ydGxsaWdhdC5tdXNldW0KK3Bvc3RzLWFuZC10ZWxlY29tbXVuaWNhdGlvbnMubXVzZXVtCitwcmVzZXJ2YXRpb24ubXVzZXVtCitwcmVzaWRpby5tdXNldW0KK3ByZXNzLm11c2V1bQorcHJvamVjdC5tdXNldW0KK3B1YmxpYy5tdXNldW0KK3B1Ym9sLm11c2V1bQorcXVlYmVjLm11c2V1bQorcmFpbHJvYWQubXVzZXVtCityYWlsd2F5Lm11c2V1bQorcmVzZWFyY2gubXVzZXVtCityZXNpc3RhbmNlLm11c2V1bQorcmlvZGVqYW5laXJvLm11c2V1bQorcm9jaGVzdGVyLm11c2V1bQorcm9ja2FydC5tdXNldW0KK3JvbWEubXVzZXVtCitydXNzaWEubXVzZXVtCitzYWludGxvdWlzLm11c2V1bQorc2FsZW0ubXVzZXVtCitzYWx2YWRvcmRhbGkubXVzZXVtCitzYWx6YnVyZy5tdXNldW0KK3NhbmRpZWdvLm11c2V1bQorc2FuZnJhbmNpc2NvLm11c2V1bQorc2FudGFiYXJiYXJhLm11c2V1bQorc2FudGFjcnV6Lm11c2V1bQorc2FudGFmZS5tdXNldW0KK3Nhc2thdGNoZXdhbi5tdXNldW0KK3NhdHgubXVzZXVtCitzYXZhbm5haGdhLm11c2V1bQorc2NobGVzaXNjaGVzLm11c2V1bQorc2Nob2VuYnJ1bm4ubXVzZXVtCitzY2hva29sYWRlbi5tdXNldW0KK3NjaG9vbC5tdXNldW0KK3NjaHdlaXoubXVzZXVtCitzY2llbmNlLm11c2V1bQorc2NpZW5jZWFuZGhpc3RvcnkubXVzZXVtCitzY2llbmNlYW5kaW5kdXN0cnkubXVzZXVtCitzY2llbmNlY2VudGVyLm11c2V1bQorc2NpZW5jZWNlbnRlcnMubXVzZXVtCitzY2llbmNlLWZpY3Rpb24ubXVzZXVtCitzY2llbmNlaGlzdG9yeS5tdXNldW0KK3NjaWVuY2VzLm11c2V1bQorc2NpZW5jZXNuYXR1cmVsbGVzLm11c2V1bQorc2NvdGxhbmQubXVzZXVtCitzZWFwb3J0Lm11c2V1bQorc2V0dGxlbWVudC5tdXNldW0KK3NldHRsZXJzLm11c2V1bQorc2hlbGwubXVzZXVtCitzaGVyYnJvb2tlLm11c2V1bQorc2liZW5pay5tdXNldW0KK3NpbGsubXVzZXVtCitza2kubXVzZXVtCitza29sZS5tdXNldW0KK3NvY2lldHkubXVzZXVtCitzb2xvZ25lLm11c2V1bQorc291bmRhbmR2aXNpb24ubXVzZXVtCitzb3V0aGNhcm9saW5hLm11c2V1bQorc291dGh3ZXN0Lm11c2V1bQorc3BhY2UubXVzZXVtCitzcHkubXVzZXVtCitzcXVhcmUubXVzZXVtCitzdGFkdC5tdXNldW0KK3N0YWxiYW5zLm11c2V1bQorc3Rhcm5iZXJnLm11c2V1bQorc3RhdGUubXVzZXVtCitzdGF0ZW9mZGVsYXdhcmUubXVzZXVtCitzdGF0aW9uLm11c2V1bQorc3RlYW0ubXVzZXVtCitzdGVpZXJtYXJrLm11c2V1bQorc3Rqb2huLm11c2V1bQorc3RvY2tob2xtLm11c2V1bQorc3RwZXRlcnNidXJnLm11c2V1bQorc3R1dHRnYXJ0Lm11c2V1bQorc3Vpc3NlLm11c2V1bQorc3VyZ2VvbnNoYWxsLm11c2V1bQorc3VycmV5Lm11c2V1bQorc3ZpenplcmEubXVzZXVtCitzd2VkZW4ubXVzZXVtCitzeWRuZXkubXVzZXVtCit0YW5rLm11c2V1bQordGNtLm11c2V1bQordGVjaG5vbG9neS5tdXNldW0KK3RlbGVrb21tdW5pa2F0aW9uLm11c2V1bQordGVsZXZpc2lvbi5tdXNldW0KK3RleGFzLm11c2V1bQordGV4dGlsZS5tdXNldW0KK3RoZWF0ZXIubXVzZXVtCit0aW1lLm11c2V1bQordGltZWtlZXBpbmcubXVzZXVtCit0b3BvbG9neS5tdXNldW0KK3Rvcmluby5tdXNldW0KK3RvdWNoLm11c2V1bQordG93bi5tdXNldW0KK3RyYW5zcG9ydC5tdXNldW0KK3RyZWUubXVzZXVtCit0cm9sbGV5Lm11c2V1bQordHJ1c3QubXVzZXVtCit0cnVzdGVlLm11c2V1bQordWhyZW4ubXVzZXVtCit1bG0ubXVzZXVtCit1bmRlcnNlYS5tdXNldW0KK3VuaXZlcnNpdHkubXVzZXVtCit1c2EubXVzZXVtCit1c2FudGlxdWVzLm11c2V1bQordXNhcnRzLm11c2V1bQordXNjb3VudHJ5ZXN0YXRlLm11c2V1bQordXNjdWx0dXJlLm11c2V1bQordXNkZWNvcmF0aXZlYXJ0cy5tdXNldW0KK3VzZ2FyZGVuLm11c2V1bQordXNoaXN0b3J5Lm11c2V1bQordXNodWFpYS5tdXNldW0KK3VzbGl2aW5naGlzdG9yeS5tdXNldW0KK3V0YWgubXVzZXVtCit1dmljLm11c2V1bQordmFsbGV5Lm11c2V1bQordmFudGFhLm11c2V1bQordmVyc2FpbGxlcy5tdXNldW0KK3Zpa2luZy5tdXNldW0KK3ZpbGxhZ2UubXVzZXVtCit2aXJnaW5pYS5tdXNldW0KK3ZpcnR1YWwubXVzZXVtCit2aXJ0dWVsLm11c2V1bQordmxhYW5kZXJlbi5tdXNldW0KK3ZvbGtlbmt1bmRlLm11c2V1bQord2FsZXMubXVzZXVtCit3YWxsb25pZS5tdXNldW0KK3dhci5tdXNldW0KK3dhc2hpbmd0b25kYy5tdXNldW0KK3dhdGNoYW5kY2xvY2subXVzZXVtCit3YXRjaC1hbmQtY2xvY2subXVzZXVtCit3ZXN0ZXJuLm11c2V1bQord2VzdGZhbGVuLm11c2V1bQord2hhbGluZy5tdXNldW0KK3dpbGRsaWZlLm11c2V1bQord2lsbGlhbXNidXJnLm11c2V1bQord2luZG1pbGwubXVzZXVtCit3b3Jrc2hvcC5tdXNldW0KK3lvcmsubXVzZXVtCit5b3Jrc2hpcmUubXVzZXVtCit5b3NlbWl0ZS5tdXNldW0KK3lvdXRoLm11c2V1bQorem9vbG9naWNhbC5tdXNldW0KK3pvb2xvZ3kubXVzZXVtCivXmdeo15XXqdec15nXnS5tdXNldW0KK9C40LrQvtC8Lm11c2V1bQorCisvLyBtdiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5tdgorLy8gIm12IiBpbmNsdWRlZCBiZWNhdXNlLCBjb250cmEgV2lraXBlZGlhLCBnb29nbGUubXYgZXhpc3RzLgorbXYKK2Flcm8ubXYKK2Jpei5tdgorY29tLm12Citjb29wLm12CitlZHUubXYKK2dvdi5tdgoraW5mby5tdgoraW50Lm12CittaWwubXYKK211c2V1bS5tdgorbmFtZS5tdgorbmV0Lm12CitvcmcubXYKK3Byby5tdgorCisvLyBtdyA6IGh0dHA6Ly93d3cucmVnaXN0cmFyLm13LworbXcKK2FjLm13CitiaXoubXcKK2NvLm13Citjb20ubXcKK2Nvb3AubXcKK2VkdS5tdworZ292Lm13CitpbnQubXcKK211c2V1bS5tdworbmV0Lm13CitvcmcubXcKKworLy8gbXggOiBodHRwOi8vd3d3Lm5pYy5teC8KKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8ZmFyaWFzQG5pYy5teD4KK214Citjb20ubXgKK29yZy5teAorZ29iLm14CitlZHUubXgKK25ldC5teAorCisvLyBteSA6IGh0dHA6Ly93d3cubXluaWMubmV0Lm15LworbXkKK2NvbS5teQorbmV0Lm15CitvcmcubXkKK2dvdi5teQorZWR1Lm15CittaWwubXkKK25hbWUubXkKKworLy8gbXogOiBodHRwOi8vd3d3LnVlbS5tei8KKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8YW50b25pb0B1ZW0ubXo+CittegorYWMubXoKK2Fkdi5tegorY28ubXoKK2VkdS5tegorZ292Lm16CittaWwubXoKK25ldC5tegorb3JnLm16CisKKy8vIG5hIDogaHR0cDovL3d3dy5uYS1uaWMuY29tLm5hLworLy8gaHR0cDovL3d3dy5pbmZvLm5hL2RvbWFpbi8KK25hCitpbmZvLm5hCitwcm8ubmEKK25hbWUubmEKK3NjaG9vbC5uYQorb3IubmEKK2RyLm5hCit1cy5uYQorbXgubmEKK2NhLm5hCitpbi5uYQorY2MubmEKK3R2Lm5hCit3cy5uYQorbW9iaS5uYQorY28ubmEKK2NvbS5uYQorb3JnLm5hCisKKy8vIG5hbWUgOiBoYXMgMm5kLWxldmVsIHRsZHMsIGJ1dCB0aGVyZSdzIG5vIGxpc3Qgb2YgdGhlbQorbmFtZQorCisvLyBuYyA6IGh0dHA6Ly93d3cuY2N0bGQubmMvCituYworYXNzby5uYworbm9tLm5jCisKKy8vIG5lIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLm5lCituZQorCisvLyBuZXQgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubmV0CituZXQKKworLy8gbmYgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ubmYKK25mCitjb20ubmYKK25ldC5uZgorcGVyLm5mCityZWMubmYKK3dlYi5uZgorYXJ0cy5uZgorZmlybS5uZgoraW5mby5uZgorb3RoZXIubmYKK3N0b3JlLm5mCisKKy8vIG5nIDogaHR0cDovL3d3dy5uaXJhLm9yZy5uZy9pbmRleC5waHAvam9pbi11cy9yZWdpc3Rlci1uZy1kb21haW4vMTg5LW5pcmEtc2xkcworbmcKK2NvbS5uZworZWR1Lm5nCitnb3YubmcKK2kubmcKK21pbC5uZworbW9iaS5uZworbmFtZS5uZworbmV0Lm5nCitvcmcubmcKK3NjaC5uZworCisvLyBuaSA6IGh0dHA6Ly93d3cubmljLm5pLworbmkKK2FjLm5pCitiaXoubmkKK2NvLm5pCitjb20ubmkKK2VkdS5uaQorZ29iLm5pCitpbi5uaQoraW5mby5uaQoraW50Lm5pCittaWwubmkKK25ldC5uaQorbm9tLm5pCitvcmcubmkKK3dlYi5uaQorCisvLyBubCA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5ubAorLy8gICAgICBodHRwczovL3d3dy5zaWRuLm5sLworLy8gICAgICBjY1RMRCBmb3IgdGhlIE5ldGhlcmxhbmRzCitubAorCisvLyBCVi5ubCB3aWxsIGJlIGEgcmVnaXN0cnkgZm9yIGR1dGNoIEJWJ3MgKGJlc2xvdGVuIHZlbm5vb3RzY2hhcCkKK2J2Lm5sCisKKy8vIG5vIDogaHR0cDovL3d3dy5ub3JpZC5uby9yZWdlbHZlcmsvaW5kZXguZW4uaHRtbAorLy8gVGhlIE5vcndlZ2lhbiByZWdpc3RyeSBoYXMgZGVjbGluZWQgdG8gbm90aWZ5IHVzIG9mIHVwZGF0ZXMuIFRoZSB3ZWIgcGFnZXMKKy8vIHJlZmVyZW5jZWQgYmVsb3cgYXJlIHRoZSBvZmZpY2lhbCBzb3VyY2Ugb2YgdGhlIGRhdGEuIFRoZXJlIGlzIGFsc28gYW4KKy8vIGFubm91bmNlIG1haWxpbmcgbGlzdDoKKy8vIGh0dHBzOi8vcG9zdGxpc3Rlci51bmluZXR0Lm5vL3N5bXBhL2luZm8vbm9yaWQtZGlza3Vzam9uCitubworLy8gTm9yaWQgZ2VuZXJpYyBkb21haW5zIDogaHR0cDovL3d3dy5ub3JpZC5uby9yZWdlbHZlcmsvdmVkbGVnZy1jLmVuLmh0bWwKK2Zocy5ubwordmdzLm5vCitmeWxrZXNiaWJsLm5vCitmb2xrZWJpYmwubm8KK211c2V1bS5ubworaWRyZXR0Lm5vCitwcml2Lm5vCisvLyBOb24tTm9yaWQgZ2VuZXJpYyBkb21haW5zIDogaHR0cDovL3d3dy5ub3JpZC5uby9yZWdlbHZlcmsvdmVkbGVnZy1kLmVuLmh0bWwKK21pbC5ubworc3RhdC5ubworZGVwLm5vCitrb21tdW5lLm5vCitoZXJhZC5ubworLy8gbm8gZ2VvZ3JhcGhpY2FsIG5hbWVzIDogaHR0cDovL3d3dy5ub3JpZC5uby9yZWdlbHZlcmsvdmVkbGVnZy1iLmVuLmh0bWwKKy8vIGNvdW50aWVzCithYS5ubworYWgubm8KK2J1Lm5vCitmbS5ubworaGwubm8KK2htLm5vCitqYW4tbWF5ZW4ubm8KK21yLm5vCitubC5ubworbnQubm8KK29mLm5vCitvbC5ubworb3Nsby5ubworcmwubm8KK3NmLm5vCitzdC5ubworc3ZhbGJhcmQubm8KK3RtLm5vCit0ci5ubwordmEubm8KK3ZmLm5vCisvLyBwcmltYXJ5IGFuZCBsb3dlciBzZWNvbmRhcnkgc2Nob29scyBwZXIgY291bnR5Citncy5hYS5ubworZ3MuYWgubm8KK2dzLmJ1Lm5vCitncy5mbS5ubworZ3MuaGwubm8KK2dzLmhtLm5vCitncy5qYW4tbWF5ZW4ubm8KK2dzLm1yLm5vCitncy5ubC5ubworZ3MubnQubm8KK2dzLm9mLm5vCitncy5vbC5ubworZ3Mub3Nsby5ubworZ3Mucmwubm8KK2dzLnNmLm5vCitncy5zdC5ubworZ3Muc3ZhbGJhcmQubm8KK2dzLnRtLm5vCitncy50ci5ubworZ3MudmEubm8KK2dzLnZmLm5vCisvLyBjaXRpZXMKK2FrcmVoYW1uLm5vCivDpWtyZWhhbW4ubm8KK2FsZ2FyZC5ubworw6VsZ8OlcmQubm8KK2FybmEubm8KK2JydW11bmRkYWwubm8KK2JyeW5lLm5vCiticm9ubm95c3VuZC5ubworYnLDuG5uw7h5c3VuZC5ubworZHJvYmFrLm5vCitkcsO4YmFrLm5vCitlZ2Vyc3VuZC5ubworZmV0c3VuZC5ubworZmxvcm8ubm8KK2Zsb3LDuC5ubworZnJlZHJpa3N0YWQubm8KK2hva2tzdW5kLm5vCitob25lZm9zcy5ubworaMO4bmVmb3NzLm5vCitqZXNzaGVpbS5ubworam9ycGVsYW5kLm5vCitqw7hycGVsYW5kLm5vCitraXJrZW5lcy5ubwora29wZXJ2aWsubm8KK2tyb2tzdGFkZWx2YS5ubworbGFuZ2V2YWcubm8KK2xhbmdldsOlZy5ubworbGVpcnZpay5ubworbWpvbmRhbGVuLm5vCittasO4bmRhbGVuLm5vCittby1pLXJhbmEubm8KK21vc2pvZW4ubm8KK21vc2rDuGVuLm5vCituZXNvZGR0YW5nZW4ubm8KK29ya2FuZ2VyLm5vCitvc295cm8ubm8KK29zw7h5cm8ubm8KK3JhaG9sdC5ubworcsOlaG9sdC5ubworc2FuZG5lc3Nqb2VuLm5vCitzYW5kbmVzc2rDuGVuLm5vCitza2Vkc21va29yc2V0Lm5vCitzbGF0dHVtLm5vCitzcGplbGthdmlrLm5vCitzdGF0aGVsbGUubm8KK3N0YXZlcm4ubm8KK3N0am9yZGFsc2hhbHNlbi5ubworc3Rqw7hyZGFsc2hhbHNlbi5ubwordGFuYW5nZXIubm8KK3RyYW5ieS5ubwordm9zc2V2YW5nZW4ubm8KKy8vIGNvbW11bml0aWVzCithZmpvcmQubm8KK8OlZmpvcmQubm8KK2FnZGVuZXMubm8KK2FsLm5vCivDpWwubm8KK2FsZXN1bmQubm8KK8OlbGVzdW5kLm5vCithbHN0YWhhdWcubm8KK2FsdGEubm8KK8OhbHTDoS5ubworYWxhaGVhZGp1Lm5vCivDoWxhaGVhZGp1Lm5vCithbHZkYWwubm8KK2FtbGkubm8KK8OlbWxpLm5vCithbW90Lm5vCivDpW1vdC5ubworYW5kZWJ1Lm5vCithbmRveS5ubworYW5kw7h5Lm5vCithbmRhc3VvbG8ubm8KK2FyZGFsLm5vCivDpXJkYWwubm8KK2FyZW1hcmsubm8KK2FyZW5kYWwubm8KK8Olcy5ubworYXNlcmFsLm5vCivDpXNlcmFsLm5vCithc2tlci5ubworYXNraW0ubm8KK2Fza3ZvbGwubm8KK2Fza295Lm5vCithc2vDuHkubm8KK2FzbmVzLm5vCivDpXNuZXMubm8KK2F1ZG5lZGFsbi5ubworYXVrcmEubm8KK2F1cmUubm8KK2F1cmxhbmQubm8KK2F1cnNrb2ctaG9sYW5kLm5vCithdXJza29nLWjDuGxhbmQubm8KK2F1c3Rldm9sbC5ubworYXVzdHJoZWltLm5vCithdmVyb3kubm8KK2F2ZXLDuHkubm8KK2JhbGVzdHJhbmQubm8KK2JhbGxhbmdlbi5ubworYmFsYXQubm8KK2LDoWzDoXQubm8KK2JhbHNmam9yZC5ubworYmFoY2NhdnVvdG5hLm5vCitiw6FoY2NhdnVvdG5hLm5vCitiYW1ibGUubm8KK2JhcmR1Lm5vCitiZWFyZHUubm8KK2JlaWFybi5ubworYmFqZGRhci5ubworYsOhamRkYXIubm8KK2JhaWRhci5ubworYsOhaWTDoXIubm8KK2Jlcmcubm8KK2Jlcmdlbi5ubworYmVybGV2YWcubm8KK2JlcmxldsOlZy5ubworYmVhcmFsdmFoa2kubm8KK2JlYXJhbHbDoWhraS5ubworYmluZGFsLm5vCitiaXJrZW5lcy5ubworYmphcmtveS5ubworYmphcmvDuHkubm8KK2JqZXJrcmVpbS5ubworYmp1Z24ubm8KK2JvZG8ubm8KK2JvZMO4Lm5vCitiYWRhZGRqYS5ubworYsOlZMOlZGRqw6Uubm8KK2J1ZGVqanUubm8KK2Jva24ubm8KK2JyZW1hbmdlci5ubworYnJvbm5veS5ubworYnLDuG5uw7h5Lm5vCitieWdsYW5kLm5vCitieWtsZS5ubworYmFydW0ubm8KK2LDpnJ1bS5ubworYm8udGVsZW1hcmsubm8KK2LDuC50ZWxlbWFyay5ubworYm8ubm9yZGxhbmQubm8KK2LDuC5ub3JkbGFuZC5ubworYmlldmF0Lm5vCitiaWV2w6F0Lm5vCitib21sby5ubworYsO4bWxvLm5vCitiYXRzZmpvcmQubm8KK2LDpXRzZmpvcmQubm8KK2JhaGNhdnVvdG5hLm5vCitiw6FoY2F2dW90bmEubm8KK2RvdnJlLm5vCitkcmFtbWVuLm5vCitkcmFuZ2VkYWwubm8KK2R5cm95Lm5vCitkeXLDuHkubm8KK2Rvbm5hLm5vCitkw7hubmEubm8KK2VpZC5ubworZWlkZmpvcmQubm8KK2VpZHNiZXJnLm5vCitlaWRza29nLm5vCitlaWRzdm9sbC5ubworZWlnZXJzdW5kLm5vCitlbHZlcnVtLm5vCitlbmViYWtrLm5vCitlbmdlcmRhbC5ubworZXRuZS5ubworZXRuZWRhbC5ubworZXZlbmVzLm5vCitldmVuYXNzaS5ubworZXZlbsOhxaHFoWkubm8KK2V2amUtb2ctaG9ybm5lcy5ubworZmFyc3VuZC5ubworZmF1c2tlLm5vCitmdW9zc2tvLm5vCitmdW9pc2t1Lm5vCitmZWRqZS5ubworZmV0Lm5vCitmaW5ub3kubm8KK2Zpbm7DuHkubm8KK2ZpdGphci5ubworZmphbGVyLm5vCitmamVsbC5ubworZmxha3N0YWQubm8KK2ZsYXRhbmdlci5ubworZmxla2tlZmpvcmQubm8KK2ZsZXNiZXJnLm5vCitmbG9yYS5ubworZmxhLm5vCitmbMOlLm5vCitmb2xsZGFsLm5vCitmb3JzYW5kLm5vCitmb3NuZXMubm8KK2ZyZWkubm8KK2Zyb2duLm5vCitmcm9sYW5kLm5vCitmcm9zdGEubm8KK2ZyYW5hLm5vCitmcsOmbmEubm8KK2Zyb3lhLm5vCitmcsO4eWEubm8KK2Z1c2Eubm8KK2Z5cmVzZGFsLm5vCitmb3JkZS5ubworZsO4cmRlLm5vCitnYW12aWsubm8KK2dhbmdhdmlpa2Eubm8KK2fDocWLZ2F2aWlrYS5ubworZ2F1bGFyLm5vCitnYXVzZGFsLm5vCitnaWxkZXNrYWwubm8KK2dpbGRlc2vDpWwubm8KK2dpc2tlLm5vCitnamVtbmVzLm5vCitnamVyZHJ1bS5ubworZ2plcnN0YWQubm8KK2dqZXNkYWwubm8KK2dqb3Zpay5ubworZ2rDuHZpay5ubworZ2xvcHBlbi5ubworZ29sLm5vCitncmFuLm5vCitncmFuZS5ubworZ3JhbnZpbi5ubworZ3JhdGFuZ2VuLm5vCitncmltc3RhZC5ubworZ3Jvbmcubm8KK2tyYWFuZ2hrZS5ubwora3LDpWFuZ2hrZS5ubworZ3J1ZS5ubworZ3VsZW4ubm8KK2hhZHNlbC5ubworaGFsZGVuLm5vCitoYWxzYS5ubworaGFtYXIubm8KK2hhbWFyb3kubm8KK2hhYm1lci5ubworaMOhYm1lci5ubworaGFwbWlyLm5vCitow6FwbWlyLm5vCitoYW1tZXJmZXN0Lm5vCitoYW1tYXJmZWFzdGEubm8KK2jDoW1tw6FyZmVhc3RhLm5vCitoYXJhbS5ubworaGFyZWlkLm5vCitoYXJzdGFkLm5vCitoYXN2aWsubm8KK2Frbm9sdW9rdGEubm8KK8Oha8WLb2x1b2t0YS5ubworaGF0dGZqZWxsZGFsLm5vCithYXJib3J0ZS5ubworaGF1Z2VzdW5kLm5vCitoZW1uZS5ubworaGVtbmVzLm5vCitoZW1zZWRhbC5ubworaGVyb3kubW9yZS1vZy1yb21zZGFsLm5vCitoZXLDuHkubcO4cmUtb2ctcm9tc2RhbC5ubworaGVyb3kubm9yZGxhbmQubm8KK2hlcsO4eS5ub3JkbGFuZC5ubworaGl0cmEubm8KK2hqYXJ0ZGFsLm5vCitoamVsbWVsYW5kLm5vCitob2JvbC5ubworaG9iw7hsLm5vCitob2Yubm8KK2hvbC5ubworaG9sZS5ubworaG9sbWVzdHJhbmQubm8KK2hvbHRhbGVuLm5vCitob2x0w6VsZW4ubm8KK2hvcm5pbmRhbC5ubworaG9ydGVuLm5vCitodXJkYWwubm8KK2h1cnVtLm5vCitodmFsZXIubm8KK2h5bGxlc3RhZC5ubworaGFnZWJvc3RhZC5ubworaMOmZ2Vib3N0YWQubm8KK2hveWFuZ2VyLm5vCitow7h5YW5nZXIubm8KK2hveWxhbmRldC5ubworaMO4eWxhbmRldC5ubworaGEubm8KK2jDpS5ubworaWJlc3RhZC5ubworaW5kZXJveS5ubworaW5kZXLDuHkubm8KK2l2ZWxhbmQubm8KK2pldm5ha2VyLm5vCitqb25kYWwubm8KK2pvbHN0ZXIubm8KK2rDuGxzdGVyLm5vCitrYXJhc2pvay5ubwora2FyYXNqb2hrYS5ubwora8OhcsOhxaFqb2hrYS5ubwora2FybHNveS5ubworZ2Fsc2Eubm8KK2fDoWxzw6Eubm8KK2thcm1veS5ubwora2FybcO4eS5ubwora2F1dG9rZWluby5ubworZ3VvdmRhZ2VhaWRudS5ubwora2xlcHAubm8KK2tsYWJ1Lm5vCitrbMOmYnUubm8KK2tvbmdzYmVyZy5ubwora29uZ3N2aW5nZXIubm8KK2tyYWdlcm8ubm8KK2tyYWdlcsO4Lm5vCitrcmlzdGlhbnNhbmQubm8KK2tyaXN0aWFuc3VuZC5ubwora3JvZHNoZXJhZC5ubwora3LDuGRzaGVyYWQubm8KK2t2YWxzdW5kLm5vCityYWhra2VyYXZqdS5ubworcsOhaGtrZXLDoXZqdS5ubwora3ZhbS5ubwora3ZpbmVzZGFsLm5vCitrdmlubmhlcmFkLm5vCitrdml0ZXNlaWQubm8KK2t2aXRzb3kubm8KK2t2aXRzw7h5Lm5vCitrdmFmam9yZC5ubwora3bDpmZqb3JkLm5vCitnaWVodGF2dW9hdG5hLm5vCitrdmFuYW5nZW4ubm8KK2t2w6ZuYW5nZW4ubm8KK25hdnVvdG5hLm5vCituw6F2dW90bmEubm8KK2thZmpvcmQubm8KK2vDpWZqb3JkLm5vCitnYWl2dW90bmEubm8KK2fDoWl2dW90bmEubm8KK2xhcnZpay5ubworbGF2YW5nZW4ubm8KK2xhdmFnaXMubm8KK2xvYWJhdC5ubworbG9hYsOhdC5ubworbGViZXNieS5ubworZGF2dmVzaWlkYS5ubworbGVpa2FuZ2VyLm5vCitsZWlyZmpvcmQubm8KK2xla2Eubm8KK2xla3N2aWsubm8KK2xlbnZpay5ubworbGVhbmdhdmlpa2Eubm8KK2xlYcWLZ2F2aWlrYS5ubworbGVzamEubm8KK2xldmFuZ2VyLm5vCitsaWVyLm5vCitsaWVybmUubm8KK2xpbGxlaGFtbWVyLm5vCitsaWxsZXNhbmQubm8KK2xpbmRlc25lcy5ubworbGluZGFzLm5vCitsaW5kw6VzLm5vCitsb20ubm8KK2xvcHBhLm5vCitsYWhwcGkubm8KK2zDoWhwcGkubm8KK2x1bmQubm8KK2x1bm5lci5ubworbHVyb3kubm8KK2x1csO4eS5ubworbHVzdGVyLm5vCitseW5nZGFsLm5vCitseW5nZW4ubm8KK2l2Z3Uubm8KK2xhcmRhbC5ubworbGVyZGFsLm5vCitsw6ZyZGFsLm5vCitsb2Rpbmdlbi5ubworbMO4ZGluZ2VuLm5vCitsb3JlbnNrb2cubm8KK2zDuHJlbnNrb2cubm8KK2xvdGVuLm5vCitsw7h0ZW4ubm8KK21hbHZpay5ubworbWFzb3kubm8KK23DpXPDuHkubm8KK211b3NhdC5ubworbXVvc8OhdC5ubworbWFuZGFsLm5vCittYXJrZXIubm8KK21hcm5hcmRhbC5ubworbWFzZmpvcmRlbi5ubworbWVsYW5kLm5vCittZWxkYWwubm8KK21lbGh1cy5ubworbWVsb3kubm8KK21lbMO4eS5ubworbWVyYWtlci5ubworbWVyw6VrZXIubm8KK21vYXJla2Uubm8KK21vw6VyZWtlLm5vCittaWRzdW5kLm5vCittaWR0cmUtZ2F1bGRhbC5ubworbW9kYWxlbi5ubworbW9kdW0ubm8KK21vbGRlLm5vCittb3NrZW5lcy5ubworbW9zcy5ubworbW9zdmlrLm5vCittYWxzZWx2Lm5vCittw6Vsc2Vsdi5ubworbWFsYXR2dW9wbWkubm8KK23DoWxhdHZ1b3BtaS5ubworbmFtZGFsc2VpZC5ubworYWVqcmllLm5vCituYW1zb3Mubm8KK25hbXNza29nYW4ubm8KK25hYW1lc2pldnVlbWllLm5vCituw6XDpW1lc2pldnVlbWllLm5vCitsYWFrZXN2dWVtaWUubm8KK25hbm5lc3RhZC5ubworbmFydmlrLm5vCituYXJ2aWlrYS5ubworbmF1c3RkYWwubm8KK25lZHJlLWVpa2VyLm5vCituZXMuYWtlcnNodXMubm8KK25lcy5idXNrZXJ1ZC5ubworbmVzbmEubm8KK25lc29kZGVuLm5vCituZXNzZWJ5Lm5vCit1bmphcmdhLm5vCit1bmrDoXJnYS5ubworbmVzc2V0Lm5vCituaXNzZWRhbC5ubworbml0dGVkYWwubm8KK25vcmQtYXVyZGFsLm5vCitub3JkLWZyb24ubm8KK25vcmQtb2RhbC5ubworbm9yZGRhbC5ubworbm9yZGthcHAubm8KK2RhdnZlbmphcmdhLm5vCitkYXZ2ZW5qw6FyZ2Eubm8KK25vcmRyZS1sYW5kLm5vCitub3JkcmVpc2Eubm8KK3JhaXNhLm5vCityw6Fpc2Eubm8KK25vcmUtb2ctdXZkYWwubm8KK25vdG9kZGVuLm5vCituYXJveS5ubworbsOmcsO4eS5ubworbm90dGVyb3kubm8KK27DuHR0ZXLDuHkubm8KK29kZGEubm8KK29rc25lcy5ubworw7hrc25lcy5ubworb3BwZGFsLm5vCitvcHBlZ2FyZC5ubworb3BwZWfDpXJkLm5vCitvcmtkYWwubm8KK29ybGFuZC5ubworw7hybGFuZC5ubworb3Jza29nLm5vCivDuHJza29nLm5vCitvcnN0YS5ubworw7hyc3RhLm5vCitvcy5oZWRtYXJrLm5vCitvcy5ob3JkYWxhbmQubm8KK29zZW4ubm8KK29zdGVyb3kubm8KK29zdGVyw7h5Lm5vCitvc3RyZS10b3Rlbi5ubworw7hzdHJlLXRvdGVuLm5vCitvdmVyaGFsbGEubm8KK292cmUtZWlrZXIubm8KK8O4dnJlLWVpa2VyLm5vCitveWVyLm5vCivDuHllci5ubworb3lnYXJkZW4ubm8KK8O4eWdhcmRlbi5ubworb3lzdHJlLXNsaWRyZS5ubworw7h5c3RyZS1zbGlkcmUubm8KK3BvcnNhbmdlci5ubworcG9yc2FuZ3Uubm8KK3BvcnPDocWLZ3Uubm8KK3BvcnNncnVubi5ubworcmFkb3kubm8KK3JhZMO4eS5ubworcmFra2VzdGFkLm5vCityYW5hLm5vCitydW92YXQubm8KK3JhbmRhYmVyZy5ubworcmF1bWEubm8KK3JlbmRhbGVuLm5vCityZW5uZWJ1Lm5vCityZW5uZXNveS5ubworcmVubmVzw7h5Lm5vCityaW5kYWwubm8KK3JpbmdlYnUubm8KK3JpbmdlcmlrZS5ubworcmluZ3Nha2VyLm5vCityaXNzYS5ubworcmlzb3Iubm8KK3Jpc8O4ci5ubworcm9hbi5ubworcm9sbGFnLm5vCityeWdnZS5ubworcmFsaW5nZW4ubm8KK3LDpmxpbmdlbi5ubworcm9kb3kubm8KK3LDuGTDuHkubm8KK3JvbXNrb2cubm8KK3LDuG1za29nLm5vCityb3Jvcy5ubworcsO4cm9zLm5vCityb3N0Lm5vCityw7hzdC5ubworcm95a2VuLm5vCityw7h5a2VuLm5vCityb3lydmlrLm5vCityw7h5cnZpay5ubworcmFkZS5ubworcsOlZGUubm8KK3NhbGFuZ2VuLm5vCitzaWVsbGFrLm5vCitzYWx0ZGFsLm5vCitzYWxhdC5ubworc8OhbMOhdC5ubworc8OhbGF0Lm5vCitzYW1uYW5nZXIubm8KK3NhbmRlLm1vcmUtb2ctcm9tc2RhbC5ubworc2FuZGUubcO4cmUtb2ctcm9tc2RhbC5ubworc2FuZGUudmVzdGZvbGQubm8KK3NhbmRlZmpvcmQubm8KK3NhbmRuZXMubm8KK3NhbmRveS5ubworc2FuZMO4eS5ubworc2FycHNib3JnLm5vCitzYXVkYS5ubworc2F1aGVyYWQubm8KK3NlbC5ubworc2VsYnUubm8KK3NlbGplLm5vCitzZWxqb3JkLm5vCitzaWdkYWwubm8KK3NpbGphbi5ubworc2lyZGFsLm5vCitza2F1bi5ubworc2tlZHNtby5ubworc2tpLm5vCitza2llbi5ubworc2tpcHR2ZXQubm8KK3NramVydm95Lm5vCitza2plcnbDuHkubm8KK3NraWVydmEubm8KK3NraWVydsOhLm5vCitza2phay5ubworc2tqw6VrLm5vCitza29kamUubm8KK3NrYW5sYW5kLm5vCitza8OlbmxhbmQubm8KK3NrYW5pdC5ubworc2vDoW5pdC5ubworc21vbGEubm8KK3Ntw7hsYS5ubworc25pbGxmam9yZC5ubworc25hc2Eubm8KK3Nuw6VzYS5ubworc25vYXNhLm5vCitzbmFhc2Uubm8KK3Nuw6Vhc2Uubm8KK3NvZ25kYWwubm8KK3Nva25kYWwubm8KK3NvbGEubm8KK3NvbHVuZC5ubworc29uZ2RhbGVuLm5vCitzb3J0bGFuZC5ubworc3B5ZGViZXJnLm5vCitzdGFuZ2Uubm8KK3N0YXZhbmdlci5ubworc3RlaWdlbi5ubworc3RlaW5ramVyLm5vCitzdGpvcmRhbC5ubworc3Rqw7hyZGFsLm5vCitzdG9ra2Uubm8KK3N0b3ItZWx2ZGFsLm5vCitzdG9yZC5ubworc3RvcmRhbC5ubworc3RvcmZqb3JkLm5vCitvbWFzdnVvdG5hLm5vCitzdHJhbmQubm8KK3N0cmFuZGEubm8KK3N0cnluLm5vCitzdWxhLm5vCitzdWxkYWwubm8KK3N1bmQubm8KK3N1bm5kYWwubm8KK3N1cm5hZGFsLm5vCitzdmVpby5ubworc3ZlbHZpay5ubworc3lra3lsdmVuLm5vCitzb2duZS5ubworc8O4Z25lLm5vCitzb21uYS5ubworc8O4bW5hLm5vCitzb25kcmUtbGFuZC5ubworc8O4bmRyZS1sYW5kLm5vCitzb3ItYXVyZGFsLm5vCitzw7hyLWF1cmRhbC5ubworc29yLWZyb24ubm8KK3PDuHItZnJvbi5ubworc29yLW9kYWwubm8KK3PDuHItb2RhbC5ubworc29yLXZhcmFuZ2VyLm5vCitzw7hyLXZhcmFuZ2VyLm5vCittYXR0YS12YXJqamF0Lm5vCittw6F0dGEtdsOhcmpqYXQubm8KK3NvcmZvbGQubm8KK3PDuHJmb2xkLm5vCitzb3JyZWlzYS5ubworc8O4cnJlaXNhLm5vCitzb3J1bS5ubworc8O4cnVtLm5vCit0YW5hLm5vCitkZWF0bnUubm8KK3RpbWUubm8KK3Rpbmd2b2xsLm5vCit0aW5uLm5vCit0amVsZHN1bmQubm8KK2RpZWxkZGFudW9ycmkubm8KK3Rqb21lLm5vCit0asO4bWUubm8KK3Rva2tlLm5vCit0b2xnYS5ubwordG9yc2tlbi5ubwordHJhbm95Lm5vCit0cmFuw7h5Lm5vCit0cm9tc28ubm8KK3Ryb21zw7gubm8KK3Ryb21zYS5ubworcm9tc2Eubm8KK3Ryb25kaGVpbS5ubwordHJvYW5kaW4ubm8KK3RyeXNpbC5ubwordHJhbmEubm8KK3Ryw6ZuYS5ubwordHJvZ3N0YWQubm8KK3Ryw7hnc3RhZC5ubwordHZlZGVzdHJhbmQubm8KK3R5ZGFsLm5vCit0eW5zZXQubm8KK3R5c2Zqb3JkLm5vCitkaXZ0YXN2dW9kbmEubm8KK2RpdnR0YXN2dW90bmEubm8KK3R5c25lcy5ubwordHlzdmFyLm5vCit0eXN2w6ZyLm5vCit0b25zYmVyZy5ubwordMO4bnNiZXJnLm5vCit1bGxlbnNha2VyLm5vCit1bGxlbnN2YW5nLm5vCit1bHZpay5ubwordXRzaXJhLm5vCit2YWRzby5ubwordmFkc8O4Lm5vCitjYWhjZXN1b2xvLm5vCivEjcOhaGNlc3VvbG8ubm8KK3Zha3NkYWwubm8KK3ZhbGxlLm5vCit2YW5nLm5vCit2YW55bHZlbi5ubwordmFyZG8ubm8KK3ZhcmTDuC5ubwordmFyZ2dhdC5ubwordsOhcmdnw6F0Lm5vCit2ZWZzbi5ubwordmFhcHN0ZS5ubwordmVnYS5ubwordmVnYXJzaGVpLm5vCit2ZWfDpXJzaGVpLm5vCit2ZW5uZXNsYS5ubwordmVyZGFsLm5vCit2ZXJyYW4ubm8KK3Zlc3RieS5ubwordmVzdG5lcy5ubwordmVzdHJlLXNsaWRyZS5ubwordmVzdHJlLXRvdGVuLm5vCit2ZXN0dmFnb3kubm8KK3Zlc3R2w6Vnw7h5Lm5vCit2ZXZlbHN0YWQubm8KK3Zpay5ubwordmlrbmEubm8KK3ZpbmRhZmpvcmQubm8KK3ZvbGRhLm5vCit2b3NzLm5vCit2YXJveS5ubwordsOmcsO4eS5ubwordmFnYW4ubm8KK3bDpWdhbi5ubwordm9hZ2F0Lm5vCit2YWdzb3kubm8KK3bDpWdzw7h5Lm5vCit2YWdhLm5vCit2w6Vnw6Uubm8KK3ZhbGVyLm9zdGZvbGQubm8KK3bDpWxlci7DuHN0Zm9sZC5ubwordmFsZXIuaGVkbWFyay5ubwordsOlbGVyLmhlZG1hcmsubm8KKworLy8gbnAgOiBodHRwOi8vd3d3Lm1vcy5jb20ubnAvcmVnaXN0ZXIuaHRtbAorKi5ucAorCisvLyBuciA6IGh0dHA6Ly9jZW5wYWMubmV0Lm5yL2Rucy9pbmRleC5odG1sCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPHRlY2huaWNpYW5AY2VucGFjLm5ldC5ucj4KK25yCitiaXoubnIKK2luZm8ubnIKK2dvdi5ucgorZWR1Lm5yCitvcmcubnIKK25ldC5ucgorY29tLm5yCisKKy8vIG51IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLm51CitudQorCisvLyBueiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5uegorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxqYXlAbnpycy5uZXQubno+CituegorYWMubnoKK2NvLm56CitjcmkubnoKK2dlZWsubnoKK2dlbi5uegorZ292dC5uegoraGVhbHRoLm56Citpd2kubnoKK2tpd2kubnoKK21hb3JpLm56CittaWwubnoKK23EgW9yaS5uegorbmV0Lm56CitvcmcubnoKK3BhcmxpYW1lbnQubnoKK3NjaG9vbC5uegorCisvLyBvbSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5vbQorb20KK2NvLm9tCitjb20ub20KK2VkdS5vbQorZ292Lm9tCittZWQub20KK211c2V1bS5vbQorbmV0Lm9tCitvcmcub20KK3Byby5vbQorCisvLyBvbmlvbiA6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3Njg2CitvbmlvbgorCisvLyBvcmcgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ub3JnCitvcmcKKworLy8gcGEgOiBodHRwOi8vd3d3Lm5pYy5wYS8KKy8vIFNvbWUgYWRkaXRpb25hbCBzZWNvbmQgbGV2ZWwgImRvbWFpbnMiIHJlc29sdmUgZGlyZWN0bHkgYXMgaG9zdG5hbWVzLCBzdWNoIGFzCisvLyBwYW5uZXQucGEsIHNvIHdlIGFkZCBhIHJ1bGUgZm9yICJwYSIuCitwYQorYWMucGEKK2dvYi5wYQorY29tLnBhCitvcmcucGEKK3NsZC5wYQorZWR1LnBhCituZXQucGEKK2luZy5wYQorYWJvLnBhCittZWQucGEKK25vbS5wYQorCisvLyBwZSA6IGh0dHBzOi8vd3d3Lm5pYy5wZS9JbmZvcm1lRmluYWxDb21pc2lvbi5wZGYKK3BlCitlZHUucGUKK2dvYi5wZQorbm9tLnBlCittaWwucGUKK29yZy5wZQorY29tLnBlCituZXQucGUKKworLy8gcGYgOiBodHRwOi8vd3d3LmdvYmluLmluZm8vZG9tYWlubmFtZS9mb3JtdWxhaXJlLXBmLnBkZgorcGYKK2NvbS5wZgorb3JnLnBmCitlZHUucGYKKworLy8gcGcgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ucGcKKyoucGcKKworLy8gcGggOiBodHRwOi8vd3d3LmRvbWFpbnMucGgvRkFRMi5hc3AKKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8amVkQGVtYWlsLmNvbS5waD4KK3BoCitjb20ucGgKK25ldC5waAorb3JnLnBoCitnb3YucGgKK2VkdS5waAorbmdvLnBoCittaWwucGgKK2kucGgKKworLy8gcGsgOiBodHRwOi8vcGs1LnBrbmljLm5ldC5way9wazUvbXNnTmFtZXBrLlBLCitwaworY29tLnBrCituZXQucGsKK2VkdS5waworb3JnLnBrCitmYW0ucGsKK2Jpei5waword2ViLnBrCitnb3YucGsKK2dvYi5waworZ29rLnBrCitnb24ucGsKK2dvcC5waworZ29zLnBrCitpbmZvLnBrCisKKy8vIHBsIGh0dHA6Ly93d3cuZG5zLnBsL2VuZ2xpc2gvaW5kZXguaHRtbAorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5CitwbAorY29tLnBsCituZXQucGwKK29yZy5wbAorLy8gcGwgZnVuY3Rpb25hbCBkb21haW5zIChodHRwOi8vd3d3LmRucy5wbC9lbmdsaXNoL2luZGV4Lmh0bWwpCithaWQucGwKK2Fncm8ucGwKK2F0bS5wbAorYXV0by5wbAorYml6LnBsCitlZHUucGwKK2dtaW5hLnBsCitnc20ucGwKK2luZm8ucGwKK21haWwucGwKK21pYXN0YS5wbAorbWVkaWEucGwKK21pbC5wbAorbmllcnVjaG9tb3NjaS5wbAorbm9tLnBsCitwYy5wbAorcG93aWF0LnBsCitwcml2LnBsCityZWFsZXN0YXRlLnBsCityZWwucGwKK3NleC5wbAorc2hvcC5wbAorc2tsZXAucGwKK3Nvcy5wbAorc3prb2xhLnBsCit0YXJnaS5wbAordG0ucGwKK3RvdXJpc20ucGwKK3RyYXZlbC5wbAordHVyeXN0eWthLnBsCisvLyBHb3Zlcm5tZW50IGRvbWFpbnMKK2dvdi5wbAorYXAuZ292LnBsCitpYy5nb3YucGwKK2lzLmdvdi5wbAordXMuZ292LnBsCitrbXBzcC5nb3YucGwKK2twcHNwLmdvdi5wbAora3dwc3AuZ292LnBsCitwc3AuZ292LnBsCit3c2tyLmdvdi5wbAora3dwLmdvdi5wbAorbXcuZ292LnBsCit1Zy5nb3YucGwKK3VtLmdvdi5wbAordW1pZy5nb3YucGwKK3VnaW0uZ292LnBsCit1cG93Lmdvdi5wbAordXcuZ292LnBsCitzdGFyb3N0d28uZ292LnBsCitwYS5nb3YucGwKK3BvLmdvdi5wbAorcHNzZS5nb3YucGwKK3B1cC5nb3YucGwKK3J6Z3cuZ292LnBsCitzYS5nb3YucGwKK3NvLmdvdi5wbAorc3IuZ292LnBsCit3c2EuZ292LnBsCitza28uZ292LnBsCit1enMuZ292LnBsCit3aWloLmdvdi5wbAord2luYi5nb3YucGwKK3BpbmIuZ292LnBsCit3aW9zLmdvdi5wbAord2l0ZC5nb3YucGwKK3d6bWl1dy5nb3YucGwKK3Bpdy5nb3YucGwKK3dpdy5nb3YucGwKK2dyaXcuZ292LnBsCit3aWYuZ292LnBsCitvdW0uZ292LnBsCitzZG4uZ292LnBsCit6cC5nb3YucGwKK3VwcG8uZ292LnBsCittdXAuZ292LnBsCit3dW96Lmdvdi5wbAora29uc3VsYXQuZ292LnBsCitvaXJtLmdvdi5wbAorLy8gcGwgcmVnaW9uYWwgZG9tYWlucyAoaHR0cDovL3d3dy5kbnMucGwvZW5nbGlzaC9pbmRleC5odG1sKQorYXVndXN0b3cucGwKK2JhYmlhLWdvcmEucGwKK2JlZHppbi5wbAorYmVza2lkeS5wbAorYmlhbG93aWV6YS5wbAorYmlhbHlzdG9rLnBsCitiaWVsYXdhLnBsCitiaWVzemN6YWR5LnBsCitib2xlc2xhd2llYy5wbAorYnlkZ29zemN6LnBsCitieXRvbS5wbAorY2llc3p5bi5wbAorY3plbGFkei5wbAorY3plc3QucGwKK2RsdWdvbGVrYS5wbAorZWxibGFnLnBsCitlbGsucGwKK2dsb2dvdy5wbAorZ25pZXpuby5wbAorZ29ybGljZS5wbAorZ3JhamV3by5wbAoraWxhd2EucGwKK2phd29yem5vLnBsCitqZWxlbmlhLWdvcmEucGwKK2pnb3JhLnBsCitrYWxpc3oucGwKK2themltaWVyei1kb2xueS5wbAora2FycGFjei5wbAora2FydHV6eS5wbAora2FzenVieS5wbAora2F0b3dpY2UucGwKK2tlcG5vLnBsCitrZXRyenluLnBsCitrbG9kemtvLnBsCitrb2JpZXJ6eWNlLnBsCitrb2xvYnJ6ZWcucGwKK2tvbmluLnBsCitrb25za293b2xhLnBsCitrdXRuby5wbAorbGFweS5wbAorbGVib3JrLnBsCitsZWduaWNhLnBsCitsZXphanNrLnBsCitsaW1hbm93YS5wbAorbG9temEucGwKK2xvd2ljei5wbAorbHViaW4ucGwKK2x1a293LnBsCittYWxib3JrLnBsCittYWxvcG9sc2thLnBsCittYXpvd3N6ZS5wbAorbWF6dXJ5LnBsCittaWVsZWMucGwKK21pZWxuby5wbAorbXJhZ293by5wbAorbmFrbG8ucGwKK25vd2FydWRhLnBsCitueXNhLnBsCitvbGF3YS5wbAorb2xlY2tvLnBsCitvbGt1c3oucGwKK29sc3p0eW4ucGwKK29wb2N6bm8ucGwKK29wb2xlLnBsCitvc3Ryb2RhLnBsCitvc3Ryb2xla2EucGwKK29zdHJvd2llYy5wbAorb3N0cm93d2xrcC5wbAorcGlsYS5wbAorcGlzei5wbAorcG9kaGFsZS5wbAorcG9kbGFzaWUucGwKK3BvbGtvd2ljZS5wbAorcG9tb3J6ZS5wbAorcG9tb3Jza2llLnBsCitwcm9jaG93aWNlLnBsCitwcnVzemtvdy5wbAorcHJ6ZXdvcnNrLnBsCitwdWxhd3kucGwKK3JhZG9tLnBsCityYXdhLW1hei5wbAorcnlibmlrLnBsCityemVzem93LnBsCitzYW5vay5wbAorc2VqbnkucGwKK3NsYXNrLnBsCitzbHVwc2sucGwKK3Nvc25vd2llYy5wbAorc3RhbG93YS13b2xhLnBsCitza29jem93LnBsCitzdGFyYWNob3dpY2UucGwKK3N0YXJnYXJkLnBsCitzdXdhbGtpLnBsCitzd2lkbmljYS5wbAorc3dpZWJvZHppbi5wbAorc3dpbm91anNjaWUucGwKK3N6Y3plY2luLnBsCitzemN6eXRuby5wbAordGFybm9icnplZy5wbAordGdvcnkucGwKK3R1cmVrLnBsCit0eWNoeS5wbAordXN0a2EucGwKK3dhbGJyenljaC5wbAord2FybWlhLnBsCit3YXJzemF3YS5wbAord2F3LnBsCit3ZWdyb3cucGwKK3dpZWx1bi5wbAord2xvY2wucGwKK3dsb2NsYXdlay5wbAord29kemlzbGF3LnBsCit3b2xvbWluLnBsCit3cm9jbGF3LnBsCit6YWNocG9tb3IucGwKK3phZ2FuLnBsCit6YXJvdy5wbAoremdvcmEucGwKK3pnb3J6ZWxlYy5wbAorCisvLyBwbSA6IGh0dHA6Ly93d3cuYWZuaWMuZnIvbWVkaWFzL2RvY3VtZW50cy9BRk5JQy1uYW1pbmctcG9saWN5MjAxMi5wZGYKK3BtCisKKy8vIHBuIDogaHR0cDovL3d3dy5nb3Zlcm5tZW50LnBuL1BuUmVnaXN0cnkvcG9saWNpZXMuaHRtCitwbgorZ292LnBuCitjby5wbgorb3JnLnBuCitlZHUucG4KK25ldC5wbgorCisvLyBwb3N0IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnBvc3QKK3Bvc3QKKworLy8gcHIgOiBodHRwOi8vd3d3Lm5pYy5wci9pbmRleC5hc3A/Zj0xCitwcgorY29tLnByCituZXQucHIKK29yZy5wcgorZ292LnByCitlZHUucHIKK2lzbGEucHIKK3Byby5wcgorYml6LnByCitpbmZvLnByCituYW1lLnByCisvLyB0aGVzZSBhcmVuJ3QgbWVudGlvbmVkIG9uIG5pYy5wciwgYnV0IG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5wcgorZXN0LnByCitwcm9mLnByCithYy5wcgorCisvLyBwcm8gOiBodHRwOi8vcmVnaXN0cnkucHJvL2dldC1wcm8KK3BybworYWFhLnBybworYWNhLnBybworYWNjdC5wcm8KK2F2b2NhdC5wcm8KK2Jhci5wcm8KK2NwYS5wcm8KK2VuZy5wcm8KK2p1ci5wcm8KK2xhdy5wcm8KK21lZC5wcm8KK3JlY2h0LnBybworCisvLyBwcyA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5wcworLy8gaHR0cDovL3d3dy5uaWMucHMvcmVnaXN0cmF0aW9uL3BvbGljeS5odG1sI3JlZworcHMKK2VkdS5wcworZ292LnBzCitzZWMucHMKK3Bsby5wcworY29tLnBzCitvcmcucHMKK25ldC5wcworCisvLyBwdCA6IGh0dHA6Ly9vbmxpbmUuZG5zLnB0L2Rucy9zdGFydF9kbnMKK3B0CituZXQucHQKK2dvdi5wdAorb3JnLnB0CitlZHUucHQKK2ludC5wdAorcHVibC5wdAorY29tLnB0Citub21lLnB0CisKKy8vIHB3IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnB3CitwdworY28ucHcKK25lLnB3Citvci5wdworZWQucHcKK2dvLnB3CitiZWxhdS5wdworCisvLyBweSA6IGh0dHA6Ly93d3cubmljLnB5L3BhdXRhcy5odG1sI3NlY2Npb25fOQorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5CitweQorY29tLnB5Citjb29wLnB5CitlZHUucHkKK2dvdi5weQorbWlsLnB5CituZXQucHkKK29yZy5weQorCisvLyBxYSA6IGh0dHA6Ly9kb21haW5zLnFhL2VuLworcWEKK2NvbS5xYQorZWR1LnFhCitnb3YucWEKK21pbC5xYQorbmFtZS5xYQorbmV0LnFhCitvcmcucWEKK3NjaC5xYQorCisvLyByZSA6IGh0dHA6Ly93d3cuYWZuaWMucmUvb2J0ZW5pci9jaGFydGVzL25vbW1hZ2UtcmUvYW5uZXhlLWRlc2NyaXB0aWZzCityZQorYXNzby5yZQorY29tLnJlCitub20ucmUKKworLy8gcm8gOiBodHRwOi8vd3d3LnJvdGxkLnJvLworcm8KK2FydHMucm8KK2NvbS5ybworZmlybS5ybworaW5mby5ybworbm9tLnJvCitudC5ybworb3JnLnJvCityZWMucm8KK3N0b3JlLnJvCit0bS5ybword3d3LnJvCisKKy8vIHJzIDogaHR0cHM6Ly93d3cucm5pZHMucnMvZW4vZG9tYWlucy9uYXRpb25hbC1kb21haW5zCitycworYWMucnMKK2NvLnJzCitlZHUucnMKK2dvdi5ycworaW4ucnMKK29yZy5ycworCisvLyBydSA6IGh0dHBzOi8vY2N0bGQucnUvZW4vZG9tYWlucy9kb21lbnNfcnUvcmVzZXJ2ZWQvCitydQorYWMucnUKK2VkdS5ydQorZ292LnJ1CitpbnQucnUKK21pbC5ydQordGVzdC5ydQorCisvLyBydyA6IGh0dHA6Ly93d3cubmljLnJ3L2NnaS1iaW4vcG9saWN5LnBsCitydworZ292LnJ3CituZXQucncKK2VkdS5ydworYWMucncKK2NvbS5ydworY28ucncKK2ludC5ydworbWlsLnJ3Citnb3V2LnJ3CisKKy8vIHNhIDogaHR0cDovL3d3dy5uaWMubmV0LnNhLworc2EKK2NvbS5zYQorbmV0LnNhCitvcmcuc2EKK2dvdi5zYQorbWVkLnNhCitwdWIuc2EKK2VkdS5zYQorc2NoLnNhCisKKy8vIHNiIDogaHR0cDovL3d3dy5zYm5pYy5uZXQuc2IvCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPGxlZS5odW1waHJpZXNAdGVsZWtvbS5jb20uc2I+CitzYgorY29tLnNiCitlZHUuc2IKK2dvdi5zYgorbmV0LnNiCitvcmcuc2IKKworLy8gc2MgOiBodHRwOi8vd3d3Lm5pYy5zYy8KK3NjCitjb20uc2MKK2dvdi5zYworbmV0LnNjCitvcmcuc2MKK2VkdS5zYworCisvLyBzZCA6IGh0dHA6Ly93d3cuaXNvYy5zZC9zdWRhbmljLmlzb2Muc2QvYmlsbGluZ19wcmljaW5nLmh0bQorLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxhZG1pbkBpc29jLnNkPgorc2QKK2NvbS5zZAorbmV0LnNkCitvcmcuc2QKK2VkdS5zZAorbWVkLnNkCit0di5zZAorZ292LnNkCitpbmZvLnNkCisKKy8vIHNlIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnNlCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPHBhdHJpay53YWxsc3Ryb21AaWlzLnNlPgorc2UKK2Euc2UKK2FjLnNlCitiLnNlCitiZC5zZQorYnJhbmQuc2UKK2Muc2UKK2Quc2UKK2Uuc2UKK2Yuc2UKK2ZoLnNlCitmaHNrLnNlCitmaHYuc2UKK2cuc2UKK2guc2UKK2kuc2UKK2suc2UKK2tvbWZvcmIuc2UKK2tvbW11bmFsZm9yYnVuZC5zZQora29tdnV4LnNlCitsLnNlCitsYW5iaWIuc2UKK20uc2UKK24uc2UKK25hdHVyYnJ1a3NneW1uLnNlCitvLnNlCitvcmcuc2UKK3Auc2UKK3BhcnRpLnNlCitwcC5zZQorcHJlc3Muc2UKK3Iuc2UKK3Muc2UKK3Quc2UKK3RtLnNlCit1LnNlCit3LnNlCit4LnNlCit5LnNlCit6LnNlCisKKy8vIHNnIDogaHR0cDovL3d3dy5uaWMubmV0LnNnL3BhZ2UvcmVnaXN0cmF0aW9uLXBvbGljaWVzLXByb2NlZHVyZXMtYW5kLWd1aWRlbGluZXMKK3NnCitjb20uc2cKK25ldC5zZworb3JnLnNnCitnb3Yuc2cKK2VkdS5zZworcGVyLnNnCisKKy8vIHNoIDogaHR0cDovL3d3dy5uaWMuc2gvcmVnaXN0cmFyLmh0bWwKK3NoCitjb20uc2gKK25ldC5zaAorZ292LnNoCitvcmcuc2gKK21pbC5zaAorCisvLyBzaSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5zaQorc2kKKworLy8gc2ogOiBObyByZWdpc3RyYXRpb25zIGF0IHRoaXMgdGltZS4KKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8amFybGVAdW5pbmV0dC5ubz4KK3NqCisKKy8vIHNrIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnNrCisvLyBsaXN0IG9mIDJuZCBsZXZlbCBkb21haW5zID8KK3NrCisKKy8vIHNsIDogaHR0cDovL3d3dy5uaWMuc2wKKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8YWRhbUBuZW9pcC5jb20+CitzbAorY29tLnNsCituZXQuc2wKK2VkdS5zbAorZ292LnNsCitvcmcuc2wKKworLy8gc20gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8uc20KK3NtCisKKy8vIHNuIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnNuCitzbgorYXJ0LnNuCitjb20uc24KK2VkdS5zbgorZ291di5zbgorb3JnLnNuCitwZXJzby5zbgordW5pdi5zbgorCisvLyBzbyA6IGh0dHA6Ly93d3cuc29yZWdpc3RyeS5jb20vCitzbworY29tLnNvCituZXQuc28KK29yZy5zbworCisvLyBzciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5zcgorc3IKKworLy8gc3QgOiBodHRwOi8vd3d3Lm5pYy5zdC9odG1sL3BvbGljeXJ1bGVzLworc3QKK2NvLnN0Citjb20uc3QKK2NvbnN1bGFkby5zdAorZWR1LnN0CitlbWJhaXhhZGEuc3QKK2dvdi5zdAorbWlsLnN0CituZXQuc3QKK29yZy5zdAorcHJpbmNpcGUuc3QKK3Nhb3RvbWUuc3QKK3N0b3JlLnN0CisKKy8vIHN1IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnN1CitzdQorCisvLyBzdiA6IGh0dHA6Ly93d3cuc3ZuZXQub3JnLnN2L25pdmVsZG9zLnBkZgorc3YKK2NvbS5zdgorZWR1LnN2Citnb2Iuc3YKK29yZy5zdgorcmVkLnN2CisKKy8vIHN4IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnN4CisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPGpjdmlnbmVzQG9wZW5yZWdpc3RyeS5jb20+CitzeAorZ292LnN4CisKKy8vIHN5IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnN5CisvLyBzZWUgYWxzbzogaHR0cDovL3d3dy5nb2Jpbi5pbmZvL2RvbWFpbm5hbWUvc3kuZG9jCitzeQorZWR1LnN5Citnb3Yuc3kKK25ldC5zeQorbWlsLnN5Citjb20uc3kKK29yZy5zeQorCisvLyBzeiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5zegorLy8gaHR0cDovL3d3dy5zaXNwYS5vcmcuc3ovCitzegorY28uc3oKK2FjLnN6Citvcmcuc3oKKworLy8gdGMgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8udGMKK3RjCisKKy8vIHRkIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnRkCit0ZAorCisvLyB0ZWw6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy50ZWwKKy8vIGh0dHA6Ly93d3cudGVsbmljLm9yZy8KK3RlbAorCisvLyB0ZiA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy50ZgordGYKKworLy8gdGcgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8udGcKKy8vIGh0dHA6Ly93d3cubmljLnRnLwordGcKKworLy8gdGggOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8udGgKKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8a3JpdEB0aGFpbnMuY28udGg+Cit0aAorYWMudGgKK2NvLnRoCitnby50aAoraW4udGgKK21pLnRoCituZXQudGgKK29yLnRoCisKKy8vIHRqIDogaHR0cDovL3d3dy5uaWMudGovcG9saWN5Lmh0bWwKK3RqCithYy50agorYml6LnRqCitjby50agorY29tLnRqCitlZHUudGoKK2dvLnRqCitnb3YudGoKK2ludC50agorbWlsLnRqCituYW1lLnRqCituZXQudGoKK25pYy50agorb3JnLnRqCit0ZXN0LnRqCit3ZWIudGoKKworLy8gdGsgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8udGsKK3RrCisKKy8vIHRsIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnRsCit0bAorZ292LnRsCisKKy8vIHRtIDogaHR0cDovL3d3dy5uaWMudG0vbG9jYWwuaHRtbAordG0KK2NvbS50bQorY28udG0KK29yZy50bQorbmV0LnRtCitub20udG0KK2dvdi50bQorbWlsLnRtCitlZHUudG0KKworLy8gdG4gOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8udG4KKy8vIGh0dHA6Ly93aG9pcy5hdGkudG4vCit0bgorY29tLnRuCitlbnMudG4KK2Zpbi50bgorZ292LnRuCitpbmQudG4KK2ludGwudG4KK25hdC50bgorbmV0LnRuCitvcmcudG4KK2luZm8udG4KK3BlcnNvLnRuCit0b3VyaXNtLnRuCitlZHVuZXQudG4KK3JucnQudG4KK3Jucy50bgorcm51LnRuCittaW5jb20udG4KK2FncmluZXQudG4KK2RlZmVuc2UudG4KK3R1cmVuLnRuCisKKy8vIHRvIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnRvCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPGVndWxsaWNoQGNvbG8udG8+Cit0bworY29tLnRvCitnb3YudG8KK25ldC50bworb3JnLnRvCitlZHUudG8KK21pbC50bworCisvLyBzdWJUTERzOiBodHRwczovL3d3dy5uaWMudHIvZm9ybXMvZW5nL3BvbGljaWVzLnBkZgorLy8gICAgIGFuZDogaHR0cHM6Ly93d3cubmljLnRyL2Zvcm1zL3BvbGl0aWthbGFyLnBkZgorLy8gU3VibWl0dGVkIGJ5IDxtZWhtZXRndXJldmluQGdtYWlsLmNvbT4KK3RyCitjb20udHIKK2luZm8udHIKK2Jpei50cgorbmV0LnRyCitvcmcudHIKK3dlYi50cgorZ2VuLnRyCit0di50cgorYXYudHIKK2RyLnRyCitiYnMudHIKK25hbWUudHIKK3RlbC50cgorZ292LnRyCitiZWwudHIKK3BvbC50cgorbWlsLnRyCitrMTIudHIKK2VkdS50cgora2VwLnRyCisKKy8vIFVzZWQgYnkgTm9ydGhlcm4gQ3lwcnVzCituYy50cgorCisvLyBVc2VkIGJ5IGdvdmVybm1lbnQgYWdlbmNpZXMgb2YgTm9ydGhlcm4gQ3lwcnVzCitnb3YubmMudHIKKworLy8gdHJhdmVsIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnRyYXZlbAordHJhdmVsCisKKy8vIHR0IDogaHR0cDovL3d3dy5uaWMudHQvCit0dAorY28udHQKK2NvbS50dAorb3JnLnR0CituZXQudHQKK2Jpei50dAoraW5mby50dAorcHJvLnR0CitpbnQudHQKK2Nvb3AudHQKK2pvYnMudHQKK21vYmkudHQKK3RyYXZlbC50dAorbXVzZXVtLnR0CithZXJvLnR0CituYW1lLnR0Citnb3YudHQKK2VkdS50dAorCisvLyB0diA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy50dgorLy8gTm90IGxpc3RpbmcgYW55IDJMRHMgYXMgcmVzZXJ2ZWQgc2luY2Ugbm9uZSBzZWVtIHRvIGV4aXN0IGluIHByYWN0aWNlLAorLy8gV2lraXBlZGlhIG5vdHdpdGhzdGFuZGluZy4KK3R2CisKKy8vIHR3IDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnR3Cit0dworZWR1LnR3Citnb3YudHcKK21pbC50dworY29tLnR3CituZXQudHcKK29yZy50dworaWR2LnR3CitnYW1lLnR3CitlYml6LnR3CitjbHViLnR3CivntrLot68udHcKK+e1hOe5lC50dwor5ZWG5qWtLnR3CisKKy8vIHR6IDogaHR0cDovL3d3dy50em5pYy5vci50ei9pbmRleC5waHAvZG9tYWlucworLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxtYW5hZ2VyQHR6bmljLm9yLnR6PgordHoKK2FjLnR6Citjby50egorZ28udHoKK2hvdGVsLnR6CitpbmZvLnR6CittZS50egorbWlsLnR6Cittb2JpLnR6CituZS50egorb3IudHoKK3NjLnR6Cit0di50egorCisvLyB1YSA6IGh0dHBzOi8vaG9zdG1hc3Rlci51YS9wb2xpY3kvP3VhCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPGRrQGNjdGxkLnVhPgordWEKKy8vIHVhIDJMRAorY29tLnVhCitlZHUudWEKK2dvdi51YQoraW4udWEKK25ldC51YQorb3JnLnVhCisvLyB1YSBnZW9ncmFwaGljIG5hbWVzCisvLyBodHRwczovL2hvc3RtYXN0ZXIudWEvMmxkLworY2hlcmthc3N5LnVhCitjaGVya2FzeS51YQorY2hlcm5pZ292LnVhCitjaGVybmloaXYudWEKK2NoZXJuaXZ0c2kudWEKK2NoZXJub3Z0c3kudWEKK2NrLnVhCitjbi51YQorY3IudWEKK2NyaW1lYS51YQorY3YudWEKK2RuLnVhCitkbmVwcm9wZXRyb3Zzay51YQorZG5pcHJvcGV0cm92c2sudWEKK2RvbWluaWMudWEKK2RvbmV0c2sudWEKK2RwLnVhCitpZi51YQoraXZhbm8tZnJhbmtpdnNrLnVhCitraC51YQora2hhcmtpdi51YQora2hhcmtvdi51YQora2hlcnNvbi51YQora2htZWxuaXRza2l5LnVhCitraG1lbG55dHNreWkudWEKK2tpZXYudWEKK2tpcm92b2dyYWQudWEKK2ttLnVhCitrci51YQora3J5bS51YQora3MudWEKK2t2LnVhCitreWl2LnVhCitsZy51YQorbHQudWEKK2x1Z2Fuc2sudWEKK2x1dHNrLnVhCitsdi51YQorbHZpdi51YQorbWsudWEKK215a29sYWl2LnVhCituaWtvbGFldi51YQorb2QudWEKK29kZXNhLnVhCitvZGVzc2EudWEKK3BsLnVhCitwb2x0YXZhLnVhCityaXZuZS51YQorcm92bm8udWEKK3J2LnVhCitzYi51YQorc2ViYXN0b3BvbC51YQorc2V2YXN0b3BvbC51YQorc20udWEKK3N1bXkudWEKK3RlLnVhCit0ZXJub3BpbC51YQordXoudWEKK3V6aGdvcm9kLnVhCit2aW5uaWNhLnVhCit2aW5ueXRzaWEudWEKK3ZuLnVhCit2b2x5bi51YQoreWFsdGEudWEKK3phcG9yaXpoemhlLnVhCit6YXBvcml6aHpoaWEudWEKK3poaXRvbWlyLnVhCit6aHl0b215ci51YQorenAudWEKK3p0LnVhCisKKy8vIHVnIDogaHR0cHM6Ly93d3cucmVnaXN0cnkuY28udWcvCit1ZworY28udWcKK29yLnVnCithYy51Zworc2MudWcKK2dvLnVnCituZS51ZworY29tLnVnCitvcmcudWcKKworLy8gdWsgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8udWsKKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8TWljaGFlbC5EYWx5QG5vbWluZXQub3JnLnVrPgordWsKK2FjLnVrCitjby51aworZ292LnVrCitsdGQudWsKK21lLnVrCituZXQudWsKK25ocy51aworb3JnLnVrCitwbGMudWsKK3BvbGljZS51aworKi5zY2gudWsKKworLy8gdXMgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8udXMKK3VzCitkbmkudXMKK2ZlZC51cworaXNhLnVzCitraWRzLnVzCituc24udXMKKy8vIHVzIGdlb2dyYXBoaWMgbmFtZXMKK2FrLnVzCithbC51cworYXIudXMKK2FzLnVzCithei51cworY2EudXMKK2NvLnVzCitjdC51cworZGMudXMKK2RlLnVzCitmbC51cworZ2EudXMKK2d1LnVzCitoaS51cworaWEudXMKK2lkLnVzCitpbC51cworaW4udXMKK2tzLnVzCitreS51cworbGEudXMKK21hLnVzCittZC51cworbWUudXMKK21pLnVzCittbi51cworbW8udXMKK21zLnVzCittdC51cworbmMudXMKK25kLnVzCituZS51cworbmgudXMKK25qLnVzCitubS51cworbnYudXMKK255LnVzCitvaC51cworb2sudXMKK29yLnVzCitwYS51cworcHIudXMKK3JpLnVzCitzYy51cworc2QudXMKK3RuLnVzCit0eC51cwordXQudXMKK3ZpLnVzCit2dC51cwordmEudXMKK3dhLnVzCit3aS51cword3YudXMKK3d5LnVzCisvLyBUaGUgcmVnaXN0cmFyIG5vdGVzIHNldmVyYWwgbW9yZSBzcGVjaWZpYyBkb21haW5zIGF2YWlsYWJsZSBpbiBlYWNoIHN0YXRlLAorLy8gc3VjaCBhcyBzdGF0ZS4qLnVzLCBkc3QuKi51cywgZXRjLiwgYnV0IHJlc29sdXRpb24gb2YgdGhlc2UgaXMgc29tZXdoYXQKKy8vIGhhcGhhemFyZDsgaW4gc29tZSBzdGF0ZXMgdGhlc2UgZG9tYWlucyByZXNvbHZlIGFzIGFkZHJlc3Nlcywgd2hpbGUgaW4gb3RoZXJzCisvLyBvbmx5IHN1YmRvbWFpbnMgYXJlIGF2YWlsYWJsZSwgb3IgZXZlbiBub3RoaW5nIGF0IGFsbC4gV2UgaW5jbHVkZSB0aGUKKy8vIG1vc3QgY29tbW9uIG9uZXMgd2hlcmUgaXQncyBjbGVhciB0aGF0IGRpZmZlcmVudCBzaXRlcyBhcmUgZGlmZmVyZW50CisvLyBlbnRpdGllcy4KK2sxMi5hay51cworazEyLmFsLnVzCitrMTIuYXIudXMKK2sxMi5hcy51cworazEyLmF6LnVzCitrMTIuY2EudXMKK2sxMi5jby51cworazEyLmN0LnVzCitrMTIuZGMudXMKK2sxMi5kZS51cworazEyLmZsLnVzCitrMTIuZ2EudXMKK2sxMi5ndS51cworLy8gazEyLmhpLnVzICBCdWcgNjE0NTY1IC0gSGF3YWlpIGhhcyBhIHN0YXRlLXdpZGUgRE9FIGxvZ2luCitrMTIuaWEudXMKK2sxMi5pZC51cworazEyLmlsLnVzCitrMTIuaW4udXMKK2sxMi5rcy51cworazEyLmt5LnVzCitrMTIubGEudXMKK2sxMi5tYS51cworazEyLm1kLnVzCitrMTIubWUudXMKK2sxMi5taS51cworazEyLm1uLnVzCitrMTIubW8udXMKK2sxMi5tcy51cworazEyLm10LnVzCitrMTIubmMudXMKKy8vIGsxMi5uZC51cyAgQnVnIDEwMjgzNDcgLSBSZW1vdmVkIGF0IHJlcXVlc3Qgb2YgVHJhdmlzIFJvc3NvIDx0cm9zc293QG5kLmdvdj4KK2sxMi5uZS51cworazEyLm5oLnVzCitrMTIubmoudXMKK2sxMi5ubS51cworazEyLm52LnVzCitrMTIubnkudXMKK2sxMi5vaC51cworazEyLm9rLnVzCitrMTIub3IudXMKK2sxMi5wYS51cworazEyLnByLnVzCitrMTIucmkudXMKK2sxMi5zYy51cworLy8gazEyLnNkLnVzICBCdWcgOTM0MTMxIC0gUmVtb3ZlZCBhdCByZXF1ZXN0IG9mIEphbWVzIEJvb3plIDxKYW1lcy5Cb296ZUBrMTIuc2QudXM+CitrMTIudG4udXMKK2sxMi50eC51cworazEyLnV0LnVzCitrMTIudmkudXMKK2sxMi52dC51cworazEyLnZhLnVzCitrMTIud2EudXMKK2sxMi53aS51cworLy8gazEyLnd2LnVzICBCdWcgOTQ3NzA1IC0gUmVtb3ZlZCBhdCByZXF1ZXN0IG9mIFZlcm5lIEJyaXR0b24gPHZlcm5lQHd2bmV0LmVkdT4KK2sxMi53eS51cworY2MuYWsudXMKK2NjLmFsLnVzCitjYy5hci51cworY2MuYXMudXMKK2NjLmF6LnVzCitjYy5jYS51cworY2MuY28udXMKK2NjLmN0LnVzCitjYy5kYy51cworY2MuZGUudXMKK2NjLmZsLnVzCitjYy5nYS51cworY2MuZ3UudXMKK2NjLmhpLnVzCitjYy5pYS51cworY2MuaWQudXMKK2NjLmlsLnVzCitjYy5pbi51cworY2Mua3MudXMKK2NjLmt5LnVzCitjYy5sYS51cworY2MubWEudXMKK2NjLm1kLnVzCitjYy5tZS51cworY2MubWkudXMKK2NjLm1uLnVzCitjYy5tby51cworY2MubXMudXMKK2NjLm10LnVzCitjYy5uYy51cworY2MubmQudXMKK2NjLm5lLnVzCitjYy5uaC51cworY2MubmoudXMKK2NjLm5tLnVzCitjYy5udi51cworY2MubnkudXMKK2NjLm9oLnVzCitjYy5vay51cworY2Mub3IudXMKK2NjLnBhLnVzCitjYy5wci51cworY2MucmkudXMKK2NjLnNjLnVzCitjYy5zZC51cworY2MudG4udXMKK2NjLnR4LnVzCitjYy51dC51cworY2MudmkudXMKK2NjLnZ0LnVzCitjYy52YS51cworY2Mud2EudXMKK2NjLndpLnVzCitjYy53di51cworY2Mud3kudXMKK2xpYi5hay51cworbGliLmFsLnVzCitsaWIuYXIudXMKK2xpYi5hcy51cworbGliLmF6LnVzCitsaWIuY2EudXMKK2xpYi5jby51cworbGliLmN0LnVzCitsaWIuZGMudXMKKy8vIGxpYi5kZS51cyAgSXNzdWUgIzI0MyAtIE1vdmVkIHRvIFByaXZhdGUgc2VjdGlvbiBhdCByZXF1ZXN0IG9mIEVkIE1vb3JlIDxFZC5Nb29yZUBsaWIuZGUudXM+CitsaWIuZmwudXMKK2xpYi5nYS51cworbGliLmd1LnVzCitsaWIuaGkudXMKK2xpYi5pYS51cworbGliLmlkLnVzCitsaWIuaWwudXMKK2xpYi5pbi51cworbGliLmtzLnVzCitsaWIua3kudXMKK2xpYi5sYS51cworbGliLm1hLnVzCitsaWIubWQudXMKK2xpYi5tZS51cworbGliLm1pLnVzCitsaWIubW4udXMKK2xpYi5tby51cworbGliLm1zLnVzCitsaWIubXQudXMKK2xpYi5uYy51cworbGliLm5kLnVzCitsaWIubmUudXMKK2xpYi5uaC51cworbGliLm5qLnVzCitsaWIubm0udXMKK2xpYi5udi51cworbGliLm55LnVzCitsaWIub2gudXMKK2xpYi5vay51cworbGliLm9yLnVzCitsaWIucGEudXMKK2xpYi5wci51cworbGliLnJpLnVzCitsaWIuc2MudXMKK2xpYi5zZC51cworbGliLnRuLnVzCitsaWIudHgudXMKK2xpYi51dC51cworbGliLnZpLnVzCitsaWIudnQudXMKK2xpYi52YS51cworbGliLndhLnVzCitsaWIud2kudXMKKy8vIGxpYi53di51cyAgQnVnIDk0MTY3MCAtIFJlbW92ZWQgYXQgcmVxdWVzdCBvZiBMYXJyeSBXIEFybm9sZCA8YXJub2xkQHd2bGMubGliLnd2LnVzPgorbGliLnd5LnVzCisvLyBrMTIubWEudXMgY29udGFpbnMgc2Nob29sIGRpc3RyaWN0cyBpbiBNYXNzYWNodXNldHRzLiBUaGUgNExEcyBhcmUKKy8vICBtYW5hZ2VkIGluZGVwZW5kZW50bHkgZXhjZXB0IGZvciBwcml2YXRlIChQVlQpLCBjaGFydGVyIChDSFRSKSBhbmQKKy8vICBwYXJvY2hpYWwgKFBBUk9DSCkgc2Nob29scy4gIFRob3NlIGFyZSBkZWxlZ2F0ZWQgZGlyZWN0bHkgdG8gdGhlCisvLyAgNUxEIG9wZXJhdG9ycy4gICA8azEyLW1hLWhvc3RtYXN0ZXIgXyBhdCBfIHJzdWMuZ3dlZXAubmV0PgorcHZ0LmsxMi5tYS51cworY2h0ci5rMTIubWEudXMKK3Bhcm9jaC5rMTIubWEudXMKKworLy8gdXkgOiBodHRwOi8vd3d3Lm5pYy5vcmcudXkvCit1eQorY29tLnV5CitlZHUudXkKK2d1Yi51eQorbWlsLnV5CituZXQudXkKK29yZy51eQorCisvLyB1eiA6IGh0dHA6Ly93d3cucmVnLnV6LwordXoKK2NvLnV6Citjb20udXoKK25ldC51egorb3JnLnV6CisKKy8vIHZhIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnZhCit2YQorCisvLyB2YyA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy52YworLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxrc2hhaEBjYS5hZmlsaWFzLmluZm8+Cit2YworY29tLnZjCituZXQudmMKK29yZy52YworZ292LnZjCittaWwudmMKK2VkdS52YworCisvLyB2ZSA6IGh0dHBzOi8vcmVnaXN0cm8ubmljLnZlLworLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5Cit2ZQorYXJ0cy52ZQorY28udmUKK2NvbS52ZQorZTEyLnZlCitlZHUudmUKK2Zpcm0udmUKK2dvYi52ZQorZ292LnZlCitpbmZvLnZlCitpbnQudmUKK21pbC52ZQorbmV0LnZlCitvcmcudmUKK3JlYy52ZQorc3RvcmUudmUKK3RlYy52ZQord2ViLnZlCisKKy8vIHZnIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnZnCit2ZworCisvLyB2aSA6IGh0dHA6Ly93d3cubmljLnZpL25ld2RvbWFpbmZvcm0uaHRtCisvLyBodHRwOi8vd3d3Lm5pYy52aS9Eb21haW5fUnVsZXMvYm9keV9kb21haW5fcnVsZXMuaHRtbCBpbmRpY2F0ZXMgc29tZSBvdGhlcgorLy8gVExEcyBhcmUgInJlc2VydmVkIiwgc3VjaCBhcyBlZHUudmkgYW5kIGdvdi52aSwgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgc2F5IHRoZXkKKy8vIGFyZSBhdmFpbGFibGUgZm9yIHJlZ2lzdHJhdGlvbiAod2hpY2ggdGhleSBkbyBub3Qgc2VlbSB0byBiZSkuCit2aQorY28udmkKK2NvbS52aQorazEyLnZpCituZXQudmkKK29yZy52aQorCisvLyB2biA6IGh0dHBzOi8vd3d3LmRvdC52bi92bm5pYy92bm5pYy9kb21haW5yZWdpc3RyYXRpb24uanNwCit2bgorY29tLnZuCituZXQudm4KK29yZy52bgorZWR1LnZuCitnb3Yudm4KK2ludC52bgorYWMudm4KK2Jpei52bgoraW5mby52bgorbmFtZS52bgorcHJvLnZuCitoZWFsdGgudm4KKworLy8gdnUgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8udnUKKy8vIGh0dHA6Ly93d3cudnVuaWMudnUvCit2dQorY29tLnZ1CitlZHUudnUKK25ldC52dQorb3JnLnZ1CisKKy8vIHdmIDogaHR0cDovL3d3dy5hZm5pYy5mci9tZWRpYXMvZG9jdW1lbnRzL0FGTklDLW5hbWluZy1wb2xpY3kyMDEyLnBkZgord2YKKworLy8gd3MgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8ud3MKKy8vIGh0dHA6Ly9zYW1vYW5pYy53cy9pbmRleC5kaHRtbAord3MKK2NvbS53cworbmV0LndzCitvcmcud3MKK2dvdi53cworZWR1LndzCisKKy8vIHl0IDogaHR0cDovL3d3dy5hZm5pYy5mci9tZWRpYXMvZG9jdW1lbnRzL0FGTklDLW5hbWluZy1wb2xpY3kyMDEyLnBkZgoreXQKKworLy8gSUROIGNjVExEcworLy8gV2hlbiBzdWJtaXR0aW5nIHBhdGNoZXMsIHBsZWFzZSBtYWludGFpbiBhIHNvcnQgYnkgSVNPIDMxNjYgY2NUTEQsIHRoZW4KKy8vIFUtbGFiZWwsIGFuZCBmb2xsb3cgdGhpcyBmb3JtYXQ6CisvLyAvLyBBLUxhYmVsICgiPExhdGluIHJlbmRlcmluZ3M+IiwgPGxhbmd1YWdlIG5hbWU+WywgdmFyaWFudCBpbmZvXSkgOiA8SVNPIDMxNjYgY2NUTEQ+CisvLyAvLyBbc3BvbnNvcmluZyBvcmddCisvLyBVLUxhYmVsCisKKy8vIHhuLS1tZ2JhYW03YThoICgiRW1lcmF0IiwgQXJhYmljKSA6IEFFCisvLyBodHRwOi8vbmljLmFlL2VuZ2xpc2gvYXJhYmljZG9tYWluL3J1bGVzLmpzcAor2KfZhdin2LHYp9iqCisKKy8vIHhuLS15OWEzYXEgKCJoeWUiLCBBcm1lbmlhbikgOiBBTQorLy8gSVNPQyBBTSAob3BlcmF0ZWQgYnkgLmFtIFJlZ2lzdHJ5KQor1bDVodW1CisKKy8vIHhuLS01NGI3ZnRhMGNjICgiQmFuZ2xhIiwgQmFuZ2xhKSA6IEJECivgpqzgpr7gpoLgprLgpr4KKworLy8geG4tLTkwYWUgKCJiZyIsIEJ1bGdhcmlhbikgOiBCRwor0LHQsworCisvLyB4bi0tOTBhaXMgKCJiZWwiLCBCZWxhcnVzaWFuL1J1c3NpYW4gQ3lyaWxsaWMpIDogQlkKKy8vIE9wZXJhdGVkIGJ5IC5ieSByZWdpc3RyeQor0LHQtdC7CisKKy8vIHhuLS1maXFzOHMgKCJaaG9uZ2d1by9DaGluYSIsIENoaW5lc2UsIFNpbXBsaWZpZWQpIDogQ04KKy8vIENOTklDCisvLyBodHRwOi8vY25uaWMuY24vaHRtbC9EaXIvMjAwNS8xMC8xMS8zMjE4Lmh0bQor5Lit5Zu9CisKKy8vIHhuLS1maXF6OXMgKCJaaG9uZ2d1by9DaGluYSIsIENoaW5lc2UsIFRyYWRpdGlvbmFsKSA6IENOCisvLyBDTk5JQworLy8gaHR0cDovL2NubmljLmNuL2h0bWwvRGlyLzIwMDUvMTAvMTEvMzIxOC5odG0KK+S4reWciworCisvLyB4bi0tbGdiYmF0MWFkOGogKCJBbGdlcmlhL0FsIEphemFpciIsIEFyYWJpYykgOiBEWgor2KfZhNis2LLYp9im2LEKKworLy8geG4tLXdnYmgxYyAoIkVneXB0L01hc3IiLCBBcmFiaWMpIDogRUcKKy8vIGh0dHA6Ly93d3cuZG90bWFzci5lZy8KK9mF2LXYsQorCisvLyB4bi0tZTFhNGMgKCJldSIsIEN5cmlsbGljKSA6IEVVCivQtdGOCisKKy8vIHhuLS1ub2RlICgiZ2UiLCBHZW9yZ2lhbiBNa2hlZHJ1bGkpIDogR0UKK+GDkuGDlAorCisvLyB4bi0tcXhhbSAoImVsIiwgR3JlZWspIDogR1IKKy8vIEhlbGxlbmljIE1pbmlzdHJ5IG9mIEluZnJhc3RydWN0dXJlLCBUcmFuc3BvcnQsIGFuZCBOZXR3b3JrcworzrXOuworCisvLyB4bi0tajZ3MTkzZyAoIkhvbmcgS29uZyIsIENoaW5lc2UpIDogSEsKKy8vIGh0dHBzOi8vd3d3Mi5oa2lyYy5oay9yZWdpc3Rlci9ydWxlcy5qc3AKK+mmmea4rworCisvLyB4bi0tMnNjcmo5YyAoIkJoYXJhdCIsIEthbm5hZGEpIDogSU4KKy8vIEluZGlhCivgsq3gsr7gsrDgsqQKKworLy8geG4tLTNoY3JqOWMgKCJCaGFyYXQiLCBPcml5YSkgOiBJTgorLy8gSW5kaWEKK+CsreCsvuCssOCspAorCisvLyB4bi0tNDVicjVjeWwgKCJCaGFyYXRhbSIsIEFzc2FtZXNlKSA6IElOCisvLyBJbmRpYQor4Kat4Ka+4Kew4KakCisKKy8vIHhuLS1oMmJyZWczZXZlICgiQmhhcmF0YW0iLCBTYW5za3JpdCkgOiBJTgorLy8gSW5kaWEKK+CkreCkvuCksOCkpOCkruCljQorCisvLyB4bi0taDJicmo5YzhjICgiQmhhcm90IiwgU2FudGFsaSkgOiBJTgorLy8gSW5kaWEKK+CkreCkvuCksOCli+CkpAorCisvLyB4bi0tbWdiZ3U4MmEgKCJCaGFyYXQiLCBTaW5kaGkpIDogSU4KKy8vIEluZGlhCivagNin2LHYqgorCisvLyB4bi0tcnZjMWUwYW0zZSAoIkJoYXJhdGFtIiwgTWFsYXlhbGFtKSA6IElOCisvLyBJbmRpYQor4LSt4LS+4LSw4LSk4LSCCisKKy8vIHhuLS1oMmJyajljICgiQmhhcmF0IiwgRGV2YW5hZ2FyaSkgOiBJTgorLy8gSW5kaWEKK+CkreCkvuCksOCkpAorCisvLyB4bi0tbWdiYmgxYTcxZSAoIkJoYXJhdCIsIEFyYWJpYykgOiBJTgorLy8gSW5kaWEKK9io2r7Yp9ix2KoKKworLy8geG4tLWZwY3JqOWMzZCAoIkJoYXJhdCIsIFRlbHVndSkgOiBJTgorLy8gSW5kaWEKK+CwreCwvuCwsOCwpOCxjQorCisvLyB4bi0tZ2Vjcmo5YyAoIkJoYXJhdCIsIEd1amFyYXRpKSA6IElOCisvLyBJbmRpYQor4Kqt4Kq+4Kqw4KqkCisKKy8vIHhuLS1zOWJyajljICgiQmhhcmF0IiwgR3VybXVraGkpIDogSU4KKy8vIEluZGlhCivgqK3gqL7gqLDgqKQKKworLy8geG4tLTQ1YnJqOWMgKCJCaGFyYXQiLCBCZW5nYWxpKSA6IElOCisvLyBJbmRpYQor4Kat4Ka+4Kaw4KakCisKKy8vIHhuLS14a2MyZGwzYTVlZTBoICgiSW5kaWEiLCBUYW1pbCkgOiBJTgorLy8gSW5kaWEKK+Cuh+CuqOCvjeCupOCuv+Cur+CuvgorCisvLyB4bi0tbWdiYTNhNGYxNmEgKCJJcmFuIiwgUGVyc2lhbikgOiBJUgor2KfbjNix2KfZhgorCisvLyB4bi0tbWdiYTNhNGZyYSAoIklyYW4iLCBBcmFiaWMpIDogSVIKK9in2YrYsdin2YYKKworLy8geG4tLW1nYnR4MmIgKCJJcmFxIiwgQXJhYmljKSA6IElRCisvLyBDb21tdW5pY2F0aW9ucyBhbmQgTWVkaWEgQ29tbWlzc2lvbgor2LnYsdin2YIKKworLy8geG4tLW1nYmF5aDdncGEgKCJhbC1PcmRvbiIsIEFyYWJpYykgOiBKTworLy8gTmF0aW9uYWwgSW5mb3JtYXRpb24gVGVjaG5vbG9neSBDZW50ZXIgKE5JVEMpCisvLyBSb3lhbCBTY2llbnRpZmljIFNvY2lldHksIEFsLUp1YmVpaGEKK9in2YTYp9ix2K/ZhgorCisvLyB4bi0tM2UwYjcwN2UgKCJSZXB1YmxpYyBvZiBLb3JlYSIsIEhhbmd1bCkgOiBLUgor7ZWc6rWtCisKKy8vIHhuLS04MGFvMjFhICgiS2F6IiwgS2F6YWtoKSA6IEtaCivSm9Cw0LcKKworLy8geG4tLWZ6YzJjOWUyYyAoIkxhbmthIiwgU2luaGFsZXNlLVNpbmhhbGEpIDogTEsKKy8vIGh0dHA6Ly9uaWMubGsKK+C2veC2guC2muC3jworCisvLyB4bi0teGtjMmFsM2h5ZTJhICgiSWxhbmdhaSIsIFRhbWlsKSA6IExLCisvLyBodHRwOi8vbmljLmxrCivgrofgrrLgrpngr43grpXgr4gKKworLy8geG4tLW1nYmMwYTlhemNnICgiTW9yb2Njby9hbC1NYWdocmliIiwgQXJhYmljKSA6IE1BCivYp9mE2YXYutix2KgKKworLy8geG4tLWQxYWxmICgibWtkIiwgTWFjZWRvbmlhbikgOiBNSworLy8gTUFSbmV0CivQvNC60LQKKworLy8geG4tLWwxYWNjICgibW9uIiwgTW9uZ29saWFuKSA6IE1OCivQvNC+0L0KKworLy8geG4tLW1peDg5MWYgKCJNYWNhbyIsIENoaW5lc2UsIFRyYWRpdGlvbmFsKSA6IE1PCisvLyBNT05JQyAvIEhORVQgQXNpYSAoUmVnaXN0cnkgT3BlcmF0b3IgZm9yIC5tbykKK+a+s+mWgAorCisvLyB4bi0tbWl4MDgyZiAoIk1hY2FvIiwgQ2hpbmVzZSwgU2ltcGxpZmllZCkgOiBNTwor5r6z6ZeoCisKKy8vIHhuLS1tZ2J4NGNkMGFiICgiTWFsYXlzaWEiLCBNYWxheSkgOiBNWQor2YXZhNmK2LPZitinCisKKy8vIHhuLS1tZ2I5YXdiZiAoIk9tYW4iLCBBcmFiaWMpIDogT00KK9i52YXYp9mGCisKKy8vIHhuLS1tZ2JhaTlhemdxcDZqICgiUGFraXN0YW4iLCBVcmR1L0FyYWJpYykgOiBQSwor2b7Yp9qp2LPYqtin2YYKKworLy8geG4tLW1nYmFpOWE1ZXZhMDBiICgiUGFraXN0YW4iLCBVcmR1L0FyYWJpYywgdmFyaWFudCkgOiBQSwor2b7Yp9mD2LPYqtin2YYKKworLy8geG4tLXlnYmkyYW1teCAoIkZhbGFzdGVlbiIsIEFyYWJpYykgOiBQUworLy8gVGhlIFBhbGVzdGluaWFuIE5hdGlvbmFsIEludGVybmV0IE5hbWluZyBBdXRob3JpdHkgKFBOSU5BKQorLy8gaHR0cDovL3d3dy5wbmluYS5wcwor2YHZhNiz2LfZitmGCisKKy8vIHhuLS05MGEzYWMgKCJzcmIiLCBDeXJpbGxpYykgOiBSUworLy8gaHR0cHM6Ly93d3cucm5pZHMucnMvZW4vZG9tYWlucy9uYXRpb25hbC1kb21haW5zCivRgdGA0LEKK9C/0YAu0YHRgNCxCivQvtGA0LMu0YHRgNCxCivQvtCx0YAu0YHRgNCxCivQvtC0LtGB0YDQsQor0YPQv9GALtGB0YDQsQor0LDQui7RgdGA0LEKKworLy8geG4tLXAxYWkgKCJyZiIsIFJ1c3NpYW4tQ3lyaWxsaWMpIDogUlUKKy8vIGh0dHA6Ly93d3cuY2N0bGQucnUvZW4vZG9jcy9ydWxlc3JmLnBocAor0YDRhAorCisvLyB4bi0td2dibDZhICgiUWF0YXIiLCBBcmFiaWMpIDogUUEKKy8vIGh0dHA6Ly93d3cuaWN0Lmdvdi5xYS8KK9mC2LfYsQorCisvLyB4bi0tbWdiZXJwNGE1ZDRhciAoIkFsU2F1ZGlhaCIsIEFyYWJpYykgOiBTQQorLy8gaHR0cDovL3d3dy5uaWMubmV0LnNhLwor2KfZhNiz2LnZiNiv2YrYqQorCisvLyB4bi0tbWdiZXJwNGE1ZDRhODdnICgiQWxTYXVkaWFoIiwgQXJhYmljLCB2YXJpYW50KSAgOiBTQQor2KfZhNiz2LnZiNiv24zYqQorCisvLyB4bi0tbWdicWx5N2MwYTY3ZmJjICgiQWxTYXVkaWFoIiwgQXJhYmljLCB2YXJpYW50KSA6IFNBCivYp9mE2LPYudmI2K/bjNuDCisKKy8vIHhuLS1tZ2JxbHk3Y3ZhZnIgKCJBbFNhdWRpYWgiLCBBcmFiaWMsIHZhcmlhbnQpIDogU0EKK9in2YTYs9i52YjYr9mK2YcKKworLy8geG4tLW1nYnBsMmZoICgic3VkYW4iLCBBcmFiaWMpIDogU0QKKy8vIE9wZXJhdGVkIGJ5IC5zZCByZWdpc3RyeQor2LPZiNiv2KfZhgorCisvLyB4bi0teWZybzRpNjdvIFNpbmdhcG9yZSAoIlNpbmdhcG9yZSIsIENoaW5lc2UpIDogU0cKK+aWsOWKoOWdoQorCisvLyB4bi0tY2xjaGMwZWEwYjJnMmE5Z2NkICgiU2luZ2Fwb3JlIiwgVGFtaWwpIDogU0cKK+CumuCuv+CumeCvjeCuleCuquCvjeCuquCvguCusOCvjQorCisvLyB4bi0tb2dicGY4ZmwgKCJTeXJpYSIsIEFyYWJpYykgOiBTWQor2LPZiNix2YrYqQorCisvLyB4bi0tbWdidGY4ZmwgKCJTeXJpYSIsIEFyYWJpYywgdmFyaWFudCkgOiBTWQor2LPZiNix2YrYpworCisvLyB4bi0tbzNjdzRoICgiVGhhaSIsIFRoYWkpIDogVEgKKy8vIGh0dHA6Ly93d3cudGhuaWMuY28udGgKK+C5hOC4l+C4ogor4Lio4Li24LiB4Lip4LiyLuC5hOC4l+C4ogor4LiY4Li44Lij4LiB4Li04LiILuC5hOC4l+C4ogor4Lij4Lix4LiQ4Lia4Liy4LilLuC5hOC4l+C4ogor4LiX4Lir4Liy4LijLuC5hOC4l+C4ogor4LmA4LiZ4LmH4LiVLuC5hOC4l+C4ogor4Lit4LiH4LiE4LmM4LiB4LijLuC5hOC4l+C4ogorCisvLyB4bi0tcGdiczBkaCAoIlR1bmlzaWEiLCBBcmFiaWMpIDogVE4KKy8vIGh0dHA6Ly9uaWMudG4KK9iq2YjZhtizCisKKy8vIHhuLS1rcHJ5NTdkICgiVGFpd2FuIiwgQ2hpbmVzZSwgVHJhZGl0aW9uYWwpIDogVFcKKy8vIGh0dHA6Ly93d3cudHduaWMubmV0L2VuZ2xpc2gvZG4vZG5fMDdhLmh0bQor5Y+w54GjCisKKy8vIHhuLS1rcHJ3MTNkICgiVGFpd2FuIiwgQ2hpbmVzZSwgU2ltcGxpZmllZCkgOiBUVworLy8gaHR0cDovL3d3dy50d25pYy5uZXQvZW5nbGlzaC9kbi9kbl8wN2EuaHRtCivlj7Dmub4KKworLy8geG4tLW5ueDM4OGEgKCJUYWl3YW4iLCBDaGluZXNlLCB2YXJpYW50KSA6IFRXCivoh7rngaMKKworLy8geG4tLWoxYW1oICgidWtyIiwgQ3lyaWxsaWMpIDogVUEKK9GD0LrRgAorCisvLyB4bi0tbWdiMmRkZXMgKCJBbFllbWVuIiwgQXJhYmljKSA6IFlFCivYp9mE2YrZhdmGCisKKy8vIHh4eCA6IGh0dHA6Ly9pY21yZWdpc3RyeS5jb20KK3h4eAorCisvLyB5ZSA6IGh0dHA6Ly93d3cueS5uZXQueWUvc2VydmljZXMvZG9tYWluX25hbWUuaHRtCisqLnllCisKKy8vIHphIDogaHR0cDovL3d3dy56YWRuYS5vcmcuemEvY29udGVudC9wYWdlL2RvbWFpbi1pbmZvcm1hdGlvbgorYWMuemEKK2FncmljLnphCithbHQuemEKK2NvLnphCitlZHUuemEKK2dvdi56YQorZ3JvbmRhci56YQorbGF3LnphCittaWwuemEKK25ldC56YQorbmdvLnphCituaXMuemEKK25vbS56YQorb3JnLnphCitzY2hvb2wuemEKK3RtLnphCit3ZWIuemEKKworLy8gem0gOiBodHRwczovL3ppY3RhLnptLworLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxpbmZvQHppY3RhLnptPgorem0KK2FjLnptCitiaXouem0KK2NvLnptCitjb20uem0KK2VkdS56bQorZ292LnptCitpbmZvLnptCittaWwuem0KK25ldC56bQorb3JnLnptCitzY2guem0KKworLy8gencgOiBodHRwczovL3d3dy5wb3RyYXouZ292Lnp3LworLy8gQ29uZmlybWVkIGJ5IHJlZ2lzdHJ5IDxibXRlbmd3YUBwb3RyYXouZ292Lnp3PiAyMDE3LTAxLTI1Cit6dworYWMuencKK2NvLnp3Citnb3YuencKK21pbC56dworb3JnLnp3CisKKy8vIExpc3Qgb2YgbmV3IGdUTERzIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9uZXdndGxkcy5pY2Fubi5vcmcvbmV3Z3RsZHMuY3N2IG9uIDIwMTctMDItMjNUMDA6NDY6MDlaCisKKy8vIGFhYSA6IDIwMTUtMDItMjYgQW1lcmljYW4gQXV0b21vYmlsZSBBc3NvY2lhdGlvbiwgSW5jLgorYWFhCisKKy8vIGFhcnAgOiAyMDE1LTA1LTIxIEFBUlAKK2FhcnAKKworLy8gYWJhcnRoIDogMjAxNS0wNy0zMCBGaWF0IENocnlzbGVyIEF1dG9tb2JpbGVzIE4uVi4KK2FiYXJ0aAorCisvLyBhYmIgOiAyMDE0LTEwLTI0IEFCQiBMdGQKK2FiYgorCisvLyBhYmJvdHQgOiAyMDE0LTA3LTI0IEFiYm90dCBMYWJvcmF0b3JpZXMsIEluYy4KK2FiYm90dAorCisvLyBhYmJ2aWUgOiAyMDE1LTA3LTMwIEFiYlZpZSBJbmMuCithYmJ2aWUKKworLy8gYWJjIDogMjAxNS0wNy0zMCBEaXNuZXkgRW50ZXJwcmlzZXMsIEluYy4KK2FiYworCisvLyBhYmxlIDogMjAxNS0wNi0yNSBBYmxlIEluYy4KK2FibGUKKworLy8gYWJvZ2FkbyA6IDIwMTQtMDQtMjQgVG9wIExldmVsIERvbWFpbiBIb2xkaW5ncyBMaW1pdGVkCithYm9nYWRvCisKKy8vIGFidWRoYWJpIDogMjAxNS0wNy0zMCBBYnUgRGhhYmkgU3lzdGVtcyBhbmQgSW5mb3JtYXRpb24gQ2VudHJlCithYnVkaGFiaQorCisvLyBhY2FkZW15IDogMjAxMy0xMS0wNyBIYWxmIE9ha3MsIExMQworYWNhZGVteQorCisvLyBhY2NlbnR1cmUgOiAyMDE0LTA4LTE1IEFjY2VudHVyZSBwbGMKK2FjY2VudHVyZQorCisvLyBhY2NvdW50YW50IDogMjAxNC0xMS0yMCBkb3QgQWNjb3VudGFudCBMaW1pdGVkCithY2NvdW50YW50CisKKy8vIGFjY291bnRhbnRzIDogMjAxNC0wMy0yMCBLbm9iIFRvd24sIExMQworYWNjb3VudGFudHMKKworLy8gYWNvIDogMjAxNS0wMS0wOCBBQ08gU2V2ZXJpbiBBaGxtYW5uIEdtYkggJiBDby4gS0cKK2FjbworCisvLyBhY3RpdmUgOiAyMDE0LTA1LTAxIFRoZSBBY3RpdmUgTmV0d29yaywgSW5jCithY3RpdmUKKworLy8gYWN0b3IgOiAyMDEzLTEyLTEyIFVuaXRlZCBUTEQgSG9sZGNvIEx0ZC4KK2FjdG9yCisKKy8vIGFkYWMgOiAyMDE1LTA3LTE2IEFsbGdlbWVpbmVyIERldXRzY2hlciBBdXRvbW9iaWwtQ2x1YiBlLlYuIChBREFDKQorYWRhYworCisvLyBhZHMgOiAyMDE0LTEyLTA0IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCithZHMKKworLy8gYWR1bHQgOiAyMDE0LTEwLTE2IElDTSBSZWdpc3RyeSBBRCBMTEMKK2FkdWx0CisKKy8vIGFlZyA6IDIwMTUtMDMtMTkgQWt0aWVib2xhZ2V0IEVsZWN0cm9sdXgKK2FlZworCisvLyBhZXRuYSA6IDIwMTUtMDUtMjEgQWV0bmEgTGlmZSBJbnN1cmFuY2UgQ29tcGFueQorYWV0bmEKKworLy8gYWZhbWlseWNvbXBhbnkgOiAyMDE1LTA3LTIzIEpvaG5zb24gU2hhcmVob2xkaW5ncywgSW5jLgorYWZhbWlseWNvbXBhbnkKKworLy8gYWZsIDogMjAxNC0xMC0wMiBBdXN0cmFsaWFuIEZvb3RiYWxsIExlYWd1ZQorYWZsCisKKy8vIGFmcmljYSA6IDIwMTQtMDMtMjQgWkEgQ2VudHJhbCBSZWdpc3RyeSBOUEMgdHJhZGluZyBhcyBSZWdpc3RyeS5BZnJpY2EKK2FmcmljYQorCisvLyBhZ2FraGFuIDogMjAxNS0wNC0yMyBGb25kYXRpb24gQWdhIEtoYW4gKEFnYSBLaGFuIEZvdW5kYXRpb24pCithZ2FraGFuCisKKy8vIGFnZW5jeSA6IDIwMTMtMTEtMTQgU3RlZWwgRmFsbHMsIExMQworYWdlbmN5CisKKy8vIGFpZyA6IDIwMTQtMTItMTggQW1lcmljYW4gSW50ZXJuYXRpb25hbCBHcm91cCwgSW5jLgorYWlnCisKKy8vIGFpZ28gOiAyMDE1LTA4LTA2IGFpZ28gRGlnaXRhbCBUZWNobm9sb2d5IENvLEx0ZC4KK2FpZ28KKworLy8gYWlyYnVzIDogMjAxNS0wNy0zMCBBaXJidXMgUy5BLlMuCithaXJidXMKKworLy8gYWlyZm9yY2UgOiAyMDE0LTAzLTA2IFVuaXRlZCBUTEQgSG9sZGNvIEx0ZC4KK2FpcmZvcmNlCisKKy8vIGFpcnRlbCA6IDIwMTQtMTAtMjQgQmhhcnRpIEFpcnRlbCBMaW1pdGVkCithaXJ0ZWwKKworLy8gYWtkbiA6IDIwMTUtMDQtMjMgRm9uZGF0aW9uIEFnYSBLaGFuIChBZ2EgS2hhbiBGb3VuZGF0aW9uKQorYWtkbgorCisvLyBhbGZhcm9tZW8gOiAyMDE1LTA3LTMxIEZpYXQgQ2hyeXNsZXIgQXV0b21vYmlsZXMgTi5WLgorYWxmYXJvbWVvCisKKy8vIGFsaWJhYmEgOiAyMDE1LTAxLTE1IEFsaWJhYmEgR3JvdXAgSG9sZGluZyBMaW1pdGVkCithbGliYWJhCisKKy8vIGFsaXBheSA6IDIwMTUtMDEtMTUgQWxpYmFiYSBHcm91cCBIb2xkaW5nIExpbWl0ZWQKK2FsaXBheQorCisvLyBhbGxmaW5hbnogOiAyMDE0LTA3LTAzIEFsbGZpbmFueiBEZXV0c2NoZSBWZXJtw7ZnZW5zYmVyYXR1bmcgQWt0aWVuZ2VzZWxsc2NoYWZ0CithbGxmaW5hbnoKKworLy8gYWxsc3RhdGUgOiAyMDE1LTA3LTMxIEFsbHN0YXRlIEZpcmUgYW5kIENhc3VhbHR5IEluc3VyYW5jZSBDb21wYW55CithbGxzdGF0ZQorCisvLyBhbGx5IDogMjAxNS0wNi0xOCBBbGx5IEZpbmFuY2lhbCBJbmMuCithbGx5CisKKy8vIGFsc2FjZSA6IDIwMTQtMDctMDIgUkVHSU9OIEQgQUxTQUNFCithbHNhY2UKKworLy8gYWxzdG9tIDogMjAxNS0wNy0zMCBBTFNUT00KK2Fsc3RvbQorCisvLyBhbWVyaWNhbmV4cHJlc3MgOiAyMDE1LTA3LTMxIEFtZXJpY2FuIEV4cHJlc3MgVHJhdmVsIFJlbGF0ZWQgU2VydmljZXMgQ29tcGFueSwgSW5jLgorYW1lcmljYW5leHByZXNzCisKKy8vIGFtZXJpY2FuZmFtaWx5IDogMjAxNS0wNy0yMyBBbUZhbSwgSW5jLgorYW1lcmljYW5mYW1pbHkKKworLy8gYW1leCA6IDIwMTUtMDctMzEgQW1lcmljYW4gRXhwcmVzcyBUcmF2ZWwgUmVsYXRlZCBTZXJ2aWNlcyBDb21wYW55LCBJbmMuCithbWV4CisKKy8vIGFtZmFtIDogMjAxNS0wNy0yMyBBbUZhbSwgSW5jLgorYW1mYW0KKworLy8gYW1pY2EgOiAyMDE1LTA1LTI4IEFtaWNhIE11dHVhbCBJbnN1cmFuY2UgQ29tcGFueQorYW1pY2EKKworLy8gYW1zdGVyZGFtIDogMjAxNC0wNy0yNCBHZW1lZW50ZSBBbXN0ZXJkYW0KK2Ftc3RlcmRhbQorCisvLyBhbmFseXRpY3MgOiAyMDE0LTEyLTE4IENhbXB1cyBJUCBMTEMKK2FuYWx5dGljcworCisvLyBhbmRyb2lkIDogMjAxNC0wOC0wNyBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorYW5kcm9pZAorCisvLyBhbnF1YW4gOiAyMDE1LTAxLTA4IFFJSE9PIDM2MCBURUNITk9MT0dZIENPLiBMVEQuCithbnF1YW4KKworLy8gYW56IDogMjAxNS0wNy0zMSBBdXN0cmFsaWEgYW5kIE5ldyBaZWFsYW5kIEJhbmtpbmcgR3JvdXAgTGltaXRlZAorYW56CisKKy8vIGFvbCA6IDIwMTUtMDktMTcgQU9MIEluYy4KK2FvbAorCisvLyBhcGFydG1lbnRzIDogMjAxNC0xMi0xMSBKdW5lIE1hcGxlLCBMTEMKK2FwYXJ0bWVudHMKKworLy8gYXBwIDogMjAxNS0wNS0xNCBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorYXBwCisKKy8vIGFwcGxlIDogMjAxNS0wNS0xNCBBcHBsZSBJbmMuCithcHBsZQorCisvLyBhcXVhcmVsbGUgOiAyMDE0LTA3LTI0IEFxdWFyZWxsZS5jb20KK2FxdWFyZWxsZQorCisvLyBhcmFiIDogMjAxNS0xMS0xMiBMZWFndWUgb2YgQXJhYiBTdGF0ZXMKK2FyYWIKKworLy8gYXJhbWNvIDogMjAxNC0xMS0yMCBBcmFtY28gU2VydmljZXMgQ29tcGFueQorYXJhbWNvCisKKy8vIGFyY2hpIDogMjAxNC0wMi0wNiBTVEFSVElORyBET1QgTElNSVRFRAorYXJjaGkKKworLy8gYXJteSA6IDIwMTQtMDMtMDYgVW5pdGVkIFRMRCBIb2xkY28gTHRkLgorYXJteQorCisvLyBhcnQgOiAyMDE2LTAzLTI0IFVLIENyZWF0aXZlIElkZWFzIExpbWl0ZWQKK2FydAorCisvLyBhcnRlIDogMjAxNC0xMi0xMSBBc3NvY2lhdGlvbiBSZWxhdGl2ZSDDoCBsYSBUw6lsw6l2aXNpb24gRXVyb3DDqWVubmUgRy5FLkkuRS4KK2FydGUKKworLy8gYXNkYSA6IDIwMTUtMDctMzEgV2FsLU1hcnQgU3RvcmVzLCBJbmMuCithc2RhCisKKy8vIGFzc29jaWF0ZXMgOiAyMDE0LTAzLTA2IEJheHRlciBIaWxsLCBMTEMKK2Fzc29jaWF0ZXMKKworLy8gYXRobGV0YSA6IDIwMTUtMDctMzAgVGhlIEdhcCwgSW5jLgorYXRobGV0YQorCisvLyBhdHRvcm5leSA6IDIwMTQtMDMtMjAKK2F0dG9ybmV5CisKKy8vIGF1Y3Rpb24gOiAyMDE0LTAzLTIwCithdWN0aW9uCisKKy8vIGF1ZGkgOiAyMDE1LTA1LTIxIEFVREkgQWt0aWVuZ2VzZWxsc2NoYWZ0CithdWRpCisKKy8vIGF1ZGlibGUgOiAyMDE1LTA2LTI1IEFtYXpvbiBFVSBTLsOgIHIubC4KK2F1ZGlibGUKKworLy8gYXVkaW8gOiAyMDE0LTAzLTIwIFVuaXJlZ2lzdHJ5LCBDb3JwLgorYXVkaW8KKworLy8gYXVzcG9zdCA6IDIwMTUtMDgtMTMgQXVzdHJhbGlhbiBQb3N0YWwgQ29ycG9yYXRpb24KK2F1c3Bvc3QKKworLy8gYXV0aG9yIDogMjAxNC0xMi0xOCBBbWF6b24gRVUgUy7DoCByLmwuCithdXRob3IKKworLy8gYXV0byA6IDIwMTQtMTEtMTMKK2F1dG8KKworLy8gYXV0b3MgOiAyMDE0LTAxLTA5IERFUkF1dG9zLCBMTEMKK2F1dG9zCisKKy8vIGF2aWFuY2EgOiAyMDE1LTAxLTA4IEFlcm92aWFzIGRlbCBDb250aW5lbnRlIEFtZXJpY2FubyBTLkEuIEF2aWFuY2EKK2F2aWFuY2EKKworLy8gYXdzIDogMjAxNS0wNi0yNSBBbWF6b24gRVUgUy7DoCByLmwuCithd3MKKworLy8gYXhhIDogMjAxMy0xMi0xOSBBWEEgU0EKK2F4YQorCisvLyBhenVyZSA6IDIwMTQtMTItMTggTWljcm9zb2Z0IENvcnBvcmF0aW9uCithenVyZQorCisvLyBiYWJ5IDogMjAxNS0wNC0wOSBKb2huc29uICYgSm9obnNvbiBTZXJ2aWNlcywgSW5jLgorYmFieQorCisvLyBiYWlkdSA6IDIwMTUtMDEtMDggQmFpZHUsIEluYy4KK2JhaWR1CisKKy8vIGJhbmFtZXggOiAyMDE1LTA3LTMwIENpdGlncm91cCBJbmMuCitiYW5hbWV4CisKKy8vIGJhbmFuYXJlcHVibGljIDogMjAxNS0wNy0zMSBUaGUgR2FwLCBJbmMuCitiYW5hbmFyZXB1YmxpYworCisvLyBiYW5kIDogMjAxNC0wNi0xMgorYmFuZAorCisvLyBiYW5rIDogMjAxNC0wOS0yNSBmVExEIFJlZ2lzdHJ5IFNlcnZpY2VzIExMQworYmFuaworCisvLyBiYXIgOiAyMDEzLTEyLTEyIFB1bnRvIDIwMTIgU29jaWVkYWQgQW5vbmltYSBQcm9tb3RvcmEgZGUgSW52ZXJzaW9uIGRlIENhcGl0YWwgVmFyaWFibGUKK2JhcgorCisvLyBiYXJjZWxvbmEgOiAyMDE0LTA3LTI0IE11bmljaXBpIGRlIEJhcmNlbG9uYQorYmFyY2Vsb25hCisKKy8vIGJhcmNsYXljYXJkIDogMjAxNC0xMS0yMCBCYXJjbGF5cyBCYW5rIFBMQworYmFyY2xheWNhcmQKKworLy8gYmFyY2xheXMgOiAyMDE0LTExLTIwIEJhcmNsYXlzIEJhbmsgUExDCitiYXJjbGF5cworCisvLyBiYXJlZm9vdCA6IDIwMTUtMDYtMTEgR2FsbG8gVmluZXlhcmRzLCBJbmMuCitiYXJlZm9vdAorCisvLyBiYXJnYWlucyA6IDIwMTMtMTEtMTQgSGFsZiBIYWxsb3csIExMQworYmFyZ2FpbnMKKworLy8gYmFzZWJhbGwgOiAyMDE1LTEwLTI5IE1MQiBBZHZhbmNlZCBNZWRpYSBESCwgTExDCitiYXNlYmFsbAorCisvLyBiYXNrZXRiYWxsIDogMjAxNS0wOC0yMCBGw6lkw6lyYXRpb24gSW50ZXJuYXRpb25hbGUgZGUgQmFza2V0YmFsbCAoRklCQSkKK2Jhc2tldGJhbGwKKworLy8gYmF1aGF1cyA6IDIwMTQtMDQtMTcgV2Vya2hhdXMgR21iSAorYmF1aGF1cworCisvLyBiYXllcm4gOiAyMDE0LTAxLTIzIEJheWVybiBDb25uZWN0IEdtYkgKK2JheWVybgorCisvLyBiYmMgOiAyMDE0LTEyLTE4IEJyaXRpc2ggQnJvYWRjYXN0aW5nIENvcnBvcmF0aW9uCitiYmMKKworLy8gYmJ0IDogMjAxNS0wNy0yMyBCQiZUIENvcnBvcmF0aW9uCitiYnQKKworLy8gYmJ2YSA6IDIwMTQtMTAtMDIgQkFOQ08gQklMQkFPIFZJWkNBWUEgQVJHRU5UQVJJQSwgUy5BLgorYmJ2YQorCisvLyBiY2cgOiAyMDE1LTA0LTAyIFRoZSBCb3N0b24gQ29uc3VsdGluZyBHcm91cCwgSW5jLgorYmNnCisKKy8vIGJjbiA6IDIwMTQtMDctMjQgTXVuaWNpcGkgZGUgQmFyY2Vsb25hCitiY24KKworLy8gYmVhdHMgOiAyMDE1LTA1LTE0IEJlYXRzIEVsZWN0cm9uaWNzLCBMTEMKK2JlYXRzCisKKy8vIGJlYXV0eSA6IDIwMTUtMTItMDMgTCdPcsOpYWwKK2JlYXV0eQorCisvLyBiZWVyIDogMjAxNC0wMS0wOSBUb3AgTGV2ZWwgRG9tYWluIEhvbGRpbmdzIExpbWl0ZWQKK2JlZXIKKworLy8gYmVudGxleSA6IDIwMTQtMTItMTggQmVudGxleSBNb3RvcnMgTGltaXRlZAorYmVudGxleQorCisvLyBiZXJsaW4gOiAyMDEzLTEwLTMxIGRvdEJFUkxJTiBHbWJIICYgQ28uIEtHCitiZXJsaW4KKworLy8gYmVzdCA6IDIwMTMtMTItMTkgQmVzdFRMRCBQdHkgTHRkCitiZXN0CisKKy8vIGJlc3RidXkgOiAyMDE1LTA3LTMxIEJCWSBTb2x1dGlvbnMsIEluYy4KK2Jlc3RidXkKKworLy8gYmV0IDogMjAxNS0wNS0wNyBBZmlsaWFzIHBsYworYmV0CisKKy8vIGJoYXJ0aSA6IDIwMTQtMDEtMDkgQmhhcnRpIEVudGVycHJpc2VzIChIb2xkaW5nKSBQcml2YXRlIExpbWl0ZWQKK2JoYXJ0aQorCisvLyBiaWJsZSA6IDIwMTQtMDYtMTkgQW1lcmljYW4gQmlibGUgU29jaWV0eQorYmlibGUKKworLy8gYmlkIDogMjAxMy0xMi0xOSBkb3QgQmlkIExpbWl0ZWQKK2JpZAorCisvLyBiaWtlIDogMjAxMy0wOC0yNyBHcmFuZCBIb2xsb3csIExMQworYmlrZQorCisvLyBiaW5nIDogMjAxNC0xMi0xOCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KK2JpbmcKKworLy8gYmluZ28gOiAyMDE0LTEyLTA0IFNhbmQgQ2VkYXIsIExMQworYmluZ28KKworLy8gYmlvIDogMjAxNC0wMy0wNiBTVEFSVElORyBET1QgTElNSVRFRAorYmlvCisKKy8vIGJsYWNrIDogMjAxNC0wMS0xNiBBZmlsaWFzIExpbWl0ZWQKK2JsYWNrCisKKy8vIGJsYWNrZnJpZGF5IDogMjAxNC0wMS0xNiBVbmlyZWdpc3RyeSwgQ29ycC4KK2JsYWNrZnJpZGF5CisKKy8vIGJsYW5jbyA6IDIwMTUtMDctMTYgQkxBTkNPIEdtYkggKyBDbyBLRworYmxhbmNvCisKKy8vIGJsb2NrYnVzdGVyIDogMjAxNS0wNy0zMCBEaXNoIERCUyBDb3Jwb3JhdGlvbgorYmxvY2tidXN0ZXIKKworLy8gYmxvZyA6IDIwMTUtMDUtMTQKK2Jsb2cKKworLy8gYmxvb21iZXJnIDogMjAxNC0wNy0xNyBCbG9vbWJlcmcgSVAgSG9sZGluZ3MgTExDCitibG9vbWJlcmcKKworLy8gYmx1ZSA6IDIwMTMtMTEtMDcgQWZpbGlhcyBMaW1pdGVkCitibHVlCisKKy8vIGJtcyA6IDIwMTQtMTAtMzAgQnJpc3RvbC1NeWVycyBTcXVpYmIgQ29tcGFueQorYm1zCisKKy8vIGJtdyA6IDIwMTQtMDEtMDkgQmF5ZXJpc2NoZSBNb3RvcmVuIFdlcmtlIEFrdGllbmdlc2VsbHNjaGFmdAorYm13CisKKy8vIGJubCA6IDIwMTQtMDctMjQgQmFuY2EgTmF6aW9uYWxlIGRlbCBMYXZvcm8KK2JubAorCisvLyBibnBwYXJpYmFzIDogMjAxNC0wNS0yOSBCTlAgUGFyaWJhcworYm5wcGFyaWJhcworCisvLyBib2F0cyA6IDIwMTQtMTItMDQgREVSQm9hdHMsIExMQworYm9hdHMKKworLy8gYm9laHJpbmdlciA6IDIwMTUtMDctMDkgQm9laHJpbmdlciBJbmdlbGhlaW0gSW50ZXJuYXRpb25hbCBHbWJICitib2VocmluZ2VyCisKKy8vIGJvZmEgOiAyMDE1LTA3LTMxIE5NUyBTZXJ2aWNlcywgSW5jLgorYm9mYQorCisvLyBib20gOiAyMDE0LTEwLTE2IE7DumNsZW8gZGUgSW5mb3JtYcOnw6NvIGUgQ29vcmRlbmHDp8OjbyBkbyBQb250byBCUiAtIE5JQy5icgorYm9tCisKKy8vIGJvbmQgOiAyMDE0LTA2LTA1IEJvbmQgVW5pdmVyc2l0eSBMaW1pdGVkCitib25kCisKKy8vIGJvbyA6IDIwMTQtMDEtMzAgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK2JvbworCisvLyBib29rIDogMjAxNS0wOC0yNyBBbWF6b24gRVUgUy7DoCByLmwuCitib29rCisKKy8vIGJvb2tpbmcgOiAyMDE1LTA3LTE2IEJvb2tpbmcuY29tIEIuVi4KK2Jvb2tpbmcKKworLy8gYm9vdHMgOiAyMDE1LTAxLTA4IFRIRSBCT09UUyBDT01QQU5ZIFBMQworYm9vdHMKKworLy8gYm9zY2ggOiAyMDE1LTA2LTE4IFJvYmVydCBCb3NjaCBHTUJICitib3NjaAorCisvLyBib3N0aWsgOiAyMDE1LTA1LTI4IEJvc3RpayBTQQorYm9zdGlrCisKKy8vIGJvc3RvbiA6IDIwMTUtMTItMTAKK2Jvc3RvbgorCisvLyBib3QgOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK2JvdAorCisvLyBib3V0aXF1ZSA6IDIwMTMtMTEtMTQgT3ZlciBHYWxsZXksIExMQworYm91dGlxdWUKKworLy8gYm94IDogMjAxNS0xMS0xMiBOUzEgTGltaXRlZAorYm94CisKKy8vIGJyYWRlc2NvIDogMjAxNC0xMi0xOCBCYW5jbyBCcmFkZXNjbyBTLkEuCiticmFkZXNjbworCisvLyBicmlkZ2VzdG9uZSA6IDIwMTQtMTItMTggQnJpZGdlc3RvbmUgQ29ycG9yYXRpb24KK2JyaWRnZXN0b25lCisKKy8vIGJyb2Fkd2F5IDogMjAxNC0xMi0yMiBDZWxlYnJhdGUgQnJvYWR3YXksIEluYy4KK2Jyb2Fkd2F5CisKKy8vIGJyb2tlciA6IDIwMTQtMTItMTEgSUcgR3JvdXAgSG9sZGluZ3MgUExDCiticm9rZXIKKworLy8gYnJvdGhlciA6IDIwMTUtMDEtMjkgQnJvdGhlciBJbmR1c3RyaWVzLCBMdGQuCiticm90aGVyCisKKy8vIGJydXNzZWxzIDogMjAxNC0wMi0wNiBETlMuYmUgdnp3CiticnVzc2VscworCisvLyBidWRhcGVzdCA6IDIwMTMtMTEtMjEgVG9wIExldmVsIERvbWFpbiBIb2xkaW5ncyBMaW1pdGVkCitidWRhcGVzdAorCisvLyBidWdhdHRpIDogMjAxNS0wNy0yMyBCdWdhdHRpIEludGVybmF0aW9uYWwgU0EKK2J1Z2F0dGkKKworLy8gYnVpbGQgOiAyMDEzLTExLTA3IFBsYW4gQmVlIExMQworYnVpbGQKKworLy8gYnVpbGRlcnMgOiAyMDEzLTExLTA3IEF0b21pYyBNYWRpc29uLCBMTEMKK2J1aWxkZXJzCisKKy8vIGJ1c2luZXNzIDogMjAxMy0xMS0wNyBTcHJpbmcgQ3Jvc3MsIExMQworYnVzaW5lc3MKKworLy8gYnV5IDogMjAxNC0xMi0xOCBBbWF6b24gRVUgUy7DoCByLmwuCitidXkKKworLy8gYnV6eiA6IDIwMTMtMTAtMDIgRE9UU1RSQVRFR1kgQ08uCitidXp6CisKKy8vIGJ6aCA6IDIwMTQtMDItMjcgQXNzb2NpYXRpb24gd3d3LmJ6aAorYnpoCisKKy8vIGNhYiA6IDIwMTMtMTAtMjQgSGFsZiBTdW5zZXQsIExMQworY2FiCisKKy8vIGNhZmUgOiAyMDE1LTAyLTExIFBpb25lZXIgQ2FueW9uLCBMTEMKK2NhZmUKKworLy8gY2FsIDogMjAxNC0wNy0yNCBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorY2FsCisKKy8vIGNhbGwgOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK2NhbGwKKworLy8gY2Fsdmlua2xlaW4gOiAyMDE1LTA3LTMwIFBWSCBnVExEIEhvbGRpbmdzIExMQworY2Fsdmlua2xlaW4KKworLy8gY2FtIDogMjAxNi0wNC0yMSBBQyBXZWJjb25uZWN0aW5nIEhvbGRpbmcgQi5WLgorY2FtCisKKy8vIGNhbWVyYSA6IDIwMTMtMDgtMjcgQXRvbWljIE1hcGxlLCBMTEMKK2NhbWVyYQorCisvLyBjYW1wIDogMjAxMy0xMS0wNyBEZWx0YSBEeW5hbWl0ZSwgTExDCitjYW1wCisKKy8vIGNhbmNlcnJlc2VhcmNoIDogMjAxNC0wNS0xNSBBdXN0cmFsaWFuIENhbmNlciBSZXNlYXJjaCBGb3VuZGF0aW9uCitjYW5jZXJyZXNlYXJjaAorCisvLyBjYW5vbiA6IDIwMTQtMDktMTIgQ2Fub24gSW5jLgorY2Fub24KKworLy8gY2FwZXRvd24gOiAyMDE0LTAzLTI0IFpBIENlbnRyYWwgUmVnaXN0cnkgTlBDIHRyYWRpbmcgYXMgWkEgQ2VudHJhbCBSZWdpc3RyeQorY2FwZXRvd24KKworLy8gY2FwaXRhbCA6IDIwMTQtMDMtMDYgRGVsdGEgTWlsbCwgTExDCitjYXBpdGFsCisKKy8vIGNhcGl0YWxvbmUgOiAyMDE1LTA4LTA2IENhcGl0YWwgT25lIEZpbmFuY2lhbCBDb3Jwb3JhdGlvbgorY2FwaXRhbG9uZQorCisvLyBjYXIgOiAyMDE1LTAxLTIyCitjYXIKKworLy8gY2FyYXZhbiA6IDIwMTMtMTItMTIgQ2FyYXZhbiBJbnRlcm5hdGlvbmFsLCBJbmMuCitjYXJhdmFuCisKKy8vIGNhcmRzIDogMjAxMy0xMi0wNSBGb2dneSBIb2xsb3csIExMQworY2FyZHMKKworLy8gY2FyZSA6IDIwMTQtMDMtMDYgR29vc2UgQ3Jvc3MKK2NhcmUKKworLy8gY2FyZWVyIDogMjAxMy0xMC0wOSBkb3RDYXJlZXIgTExDCitjYXJlZXIKKworLy8gY2FyZWVycyA6IDIwMTMtMTAtMDIgV2lsZCBDb3JuZXIsIExMQworY2FyZWVycworCisvLyBjYXJzIDogMjAxNC0xMS0xMworY2FycworCisvLyBjYXJ0aWVyIDogMjAxNC0wNi0yMyBSaWNoZW1vbnQgRE5TIEluYy4KK2NhcnRpZXIKKworLy8gY2FzYSA6IDIwMTMtMTEtMjEgVG9wIExldmVsIERvbWFpbiBIb2xkaW5ncyBMaW1pdGVkCitjYXNhCisKKy8vIGNhc2UgOiAyMDE1LTA5LTAzIENOSCBJbmR1c3RyaWFsIE4uVi4KK2Nhc2UKKworLy8gY2FzZWloIDogMjAxNS0wOS0wMyBDTkggSW5kdXN0cmlhbCBOLlYuCitjYXNlaWgKKworLy8gY2FzaCA6IDIwMTQtMDMtMDYgRGVsdGEgTGFrZSwgTExDCitjYXNoCisKKy8vIGNhc2lubyA6IDIwMTQtMTItMTggQmlua3kgU2t5LCBMTEMKK2Nhc2lubworCisvLyBjYXRlcmluZyA6IDIwMTMtMTItMDUgTmV3IEZhbGxzLiBMTEMKK2NhdGVyaW5nCisKKy8vIGNhdGhvbGljIDogMjAxNS0xMC0yMSBQb250aWZpY2l1bSBDb25zaWxpdW0gZGUgQ29tdW5pY2F0aW9uaWJ1cyBTb2NpYWxpYnVzIChQQ0NTKSAoUG9udGlmaWNhbCBDb3VuY2lsIGZvciBTb2NpYWwgQ29tbXVuaWNhdGlvbikKK2NhdGhvbGljCisKKy8vIGNiYSA6IDIwMTQtMDYtMjYgQ09NTU9OV0VBTFRIIEJBTksgT0YgQVVTVFJBTElBCitjYmEKKworLy8gY2JuIDogMjAxNC0wOC0yMiBUaGUgQ2hyaXN0aWFuIEJyb2FkY2FzdGluZyBOZXR3b3JrLCBJbmMuCitjYm4KKworLy8gY2JyZSA6IDIwMTUtMDctMDIgQ0JSRSwgSW5jLgorY2JyZQorCisvLyBjYnMgOiAyMDE1LTA4LTA2IENCUyBEb21haW5zIEluYy4KK2NicworCisvLyBjZWIgOiAyMDE1LTA0LTA5IFRoZSBDb3Jwb3JhdGUgRXhlY3V0aXZlIEJvYXJkIENvbXBhbnkKK2NlYgorCisvLyBjZW50ZXIgOiAyMDEzLTExLTA3IFRpbiBNaWxsLCBMTEMKK2NlbnRlcgorCisvLyBjZW8gOiAyMDEzLTExLTA3IENFT1RMRCBQdHkgTHRkCitjZW8KKworLy8gY2VybiA6IDIwMTQtMDYtMDUgRXVyb3BlYW4gT3JnYW5pemF0aW9uIGZvciBOdWNsZWFyIFJlc2VhcmNoICgiQ0VSTiIpCitjZXJuCisKKy8vIGNmYSA6IDIwMTQtMDgtMjggQ0ZBIEluc3RpdHV0ZQorY2ZhCisKKy8vIGNmZCA6IDIwMTQtMTItMTEgSUcgR3JvdXAgSG9sZGluZ3MgUExDCitjZmQKKworLy8gY2hhbmVsIDogMjAxNS0wNC0wOSBDaGFuZWwgSW50ZXJuYXRpb25hbCBCLlYuCitjaGFuZWwKKworLy8gY2hhbm5lbCA6IDIwMTQtMDUtMDggQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK2NoYW5uZWwKKworLy8gY2hhc2UgOiAyMDE1LTA0LTMwIEpQTW9yZ2FuIENoYXNlICYgQ28uCitjaGFzZQorCisvLyBjaGF0IDogMjAxNC0xMi0wNCBTYW5kIEZpZWxkcywgTExDCitjaGF0CisKKy8vIGNoZWFwIDogMjAxMy0xMS0xNCBTYW5kIENvdmVyLCBMTEMKK2NoZWFwCisKKy8vIGNoaW50YWkgOiAyMDE1LTA2LTExIENISU5UQUkgQ29ycG9yYXRpb24KK2NoaW50YWkKKworLy8gY2hsb2UgOiAyMDE0LTEwLTE2IFJpY2hlbW9udCBETlMgSW5jLgorY2hsb2UKKworLy8gY2hyaXN0bWFzIDogMjAxMy0xMS0yMSBVbmlyZWdpc3RyeSwgQ29ycC4KK2NocmlzdG1hcworCisvLyBjaHJvbWUgOiAyMDE0LTA3LTI0IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitjaHJvbWUKKworLy8gY2hyeXNsZXIgOiAyMDE1LTA3LTMwIEZDQSBVUyBMTEMuCitjaHJ5c2xlcgorCisvLyBjaHVyY2ggOiAyMDE0LTAyLTA2IEhvbGx5IEZpZWxkcywgTExDCitjaHVyY2gKKworLy8gY2lwcmlhbmkgOiAyMDE1LTAyLTE5IEhvdGVsIENpcHJpYW5pIFNybAorY2lwcmlhbmkKKworLy8gY2lyY2xlIDogMjAxNC0xMi0xOCBBbWF6b24gRVUgUy7DoCByLmwuCitjaXJjbGUKKworLy8gY2lzY28gOiAyMDE0LTEyLTIyIENpc2NvIFRlY2hub2xvZ3ksIEluYy4KK2Npc2NvCisKKy8vIGNpdGFkZWwgOiAyMDE1LTA3LTIzIENpdGFkZWwgRG9tYWluIExMQworY2l0YWRlbAorCisvLyBjaXRpIDogMjAxNS0wNy0zMCBDaXRpZ3JvdXAgSW5jLgorY2l0aQorCisvLyBjaXRpYyA6IDIwMTQtMDEtMDkgQ0lUSUMgR3JvdXAgQ29ycG9yYXRpb24KK2NpdGljCisKKy8vIGNpdHkgOiAyMDE0LTA1LTI5IFNub3cgU2t5LCBMTEMKK2NpdHkKKworLy8gY2l0eWVhdHMgOiAyMDE0LTEyLTExIExpZmVzdHlsZSBEb21haW4gSG9sZGluZ3MsIEluYy4KK2NpdHllYXRzCisKKy8vIGNsYWltcyA6IDIwMTQtMDMtMjAgQmxhY2sgQ29ybmVyLCBMTEMKK2NsYWltcworCisvLyBjbGVhbmluZyA6IDIwMTMtMTItMDUgRm94IFNoYWRvdywgTExDCitjbGVhbmluZworCisvLyBjbGljayA6IDIwMTQtMDYtMDUgVW5pcmVnaXN0cnksIENvcnAuCitjbGljaworCisvLyBjbGluaWMgOiAyMDE0LTAzLTIwIEdvb3NlIFBhcmssIExMQworY2xpbmljCisKKy8vIGNsaW5pcXVlIDogMjAxNS0xMC0wMSBUaGUgRXN0w6llIExhdWRlciBDb21wYW5pZXMgSW5jLgorY2xpbmlxdWUKKworLy8gY2xvdGhpbmcgOiAyMDEzLTA4LTI3IFN0ZWVsIExha2UsIExMQworY2xvdGhpbmcKKworLy8gY2xvdWQgOiAyMDE1LTA0LTE2IEFSVUJBIFMucC5BLgorY2xvdWQKKworLy8gY2x1YiA6IDIwMTMtMTEtMDggLkNMVUIgRE9NQUlOUywgTExDCitjbHViCisKKy8vIGNsdWJtZWQgOiAyMDE1LTA2LTI1IENsdWIgTcOpZGl0ZXJyYW7DqWUgUy5BLgorY2x1Ym1lZAorCisvLyBjb2FjaCA6IDIwMTQtMTAtMDkgS29rbyBJc2xhbmQsIExMQworY29hY2gKKworLy8gY29kZXMgOiAyMDEzLTEwLTMxIFB1ZmYgV2lsbG93LCBMTEMKK2NvZGVzCisKKy8vIGNvZmZlZSA6IDIwMTMtMTAtMTcgVHJpeHkgQ292ZXIsIExMQworY29mZmVlCisKKy8vIGNvbGxlZ2UgOiAyMDE0LTAxLTE2IFhZWi5DT00gTExDCitjb2xsZWdlCisKKy8vIGNvbG9nbmUgOiAyMDE0LTAyLTA1IE5ldENvbG9nbmUgR2VzZWxsc2NoYWZ0IGbDvHIgVGVsZWtvbW11bmlrYXRpb24gbWJICitjb2xvZ25lCisKKy8vIGNvbWNhc3QgOiAyMDE1LTA3LTIzIENvbWNhc3QgSVAgSG9sZGluZ3MgSSwgTExDCitjb21jYXN0CisKKy8vIGNvbW1iYW5rIDogMjAxNC0wNi0yNiBDT01NT05XRUFMVEggQkFOSyBPRiBBVVNUUkFMSUEKK2NvbW1iYW5rCisKKy8vIGNvbW11bml0eSA6IDIwMTMtMTItMDUgRm94IE9yY2hhcmQsIExMQworY29tbXVuaXR5CisKKy8vIGNvbXBhbnkgOiAyMDEzLTExLTA3IFNpbHZlciBBdmVudWUsIExMQworY29tcGFueQorCisvLyBjb21wYXJlIDogMjAxNS0xMC0wOCBpU2VsZWN0IEx0ZAorY29tcGFyZQorCisvLyBjb21wdXRlciA6IDIwMTMtMTAtMjQgUGluZSBNaWxsLCBMTEMKK2NvbXB1dGVyCisKKy8vIGNvbXNlYyA6IDIwMTUtMDEtMDggVmVyaVNpZ24sIEluYy4KK2NvbXNlYworCisvLyBjb25kb3MgOiAyMDEzLTEyLTA1IFBpbmUgSG91c2UsIExMQworY29uZG9zCisKKy8vIGNvbnN0cnVjdGlvbiA6IDIwMTMtMDktMTYgRm94IER5bmFtaXRlLCBMTEMKK2NvbnN0cnVjdGlvbgorCisvLyBjb25zdWx0aW5nIDogMjAxMy0xMi0wNQorY29uc3VsdGluZworCisvLyBjb250YWN0IDogMjAxNS0wMS0wOCBUb3AgTGV2ZWwgU3BlY3RydW0sIEluYy4KK2NvbnRhY3QKKworLy8gY29udHJhY3RvcnMgOiAyMDEzLTA5LTEwIE1hZ2ljIFdvb2RzLCBMTEMKK2NvbnRyYWN0b3JzCisKKy8vIGNvb2tpbmcgOiAyMDEzLTExLTIxIFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAorY29va2luZworCisvLyBjb29raW5nY2hhbm5lbCA6IDIwMTUtMDctMDIgTGlmZXN0eWxlIERvbWFpbiBIb2xkaW5ncywgSW5jLgorY29va2luZ2NoYW5uZWwKKworLy8gY29vbCA6IDIwMTMtMTEtMTQgS29rbyBMYWtlLCBMTEMKK2Nvb2wKKworLy8gY29yc2ljYSA6IDIwMTQtMDktMjUgQ29sbGVjdGl2aXTDqSBUZXJyaXRvcmlhbGUgZGUgQ29yc2UKK2NvcnNpY2EKKworLy8gY291bnRyeSA6IDIwMTMtMTItMTkgVG9wIExldmVsIERvbWFpbiBIb2xkaW5ncyBMaW1pdGVkCitjb3VudHJ5CisKKy8vIGNvdXBvbiA6IDIwMTUtMDItMjYgQW1hem9uIEVVIFMuw6Agci5sLgorY291cG9uCisKKy8vIGNvdXBvbnMgOiAyMDE1LTAzLTI2IEJsYWNrIElzbGFuZCwgTExDCitjb3Vwb25zCisKKy8vIGNvdXJzZXMgOiAyMDE0LTEyLTA0IE9QRU4gVU5JVkVSU0lUSUVTIEFVU1RSQUxJQSBQVFkgTFRECitjb3Vyc2VzCisKKy8vIGNyZWRpdCA6IDIwMTQtMDMtMjAgU25vdyBTaGFkb3csIExMQworY3JlZGl0CisKKy8vIGNyZWRpdGNhcmQgOiAyMDE0LTAzLTIwIEJpbmt5IEZyb3N0Yml0ZSwgTExDCitjcmVkaXRjYXJkCisKKy8vIGNyZWRpdHVuaW9uIDogMjAxNS0wMS0yMiBDVU5BIFBlcmZvcm1hbmNlIFJlc291cmNlcywgTExDCitjcmVkaXR1bmlvbgorCisvLyBjcmlja2V0IDogMjAxNC0xMC0wOSBkb3QgQ3JpY2tldCBMaW1pdGVkCitjcmlja2V0CisKKy8vIGNyb3duIDogMjAxNC0xMC0yNCBDcm93biBFcXVpcG1lbnQgQ29ycG9yYXRpb24KK2Nyb3duCisKKy8vIGNycyA6IDIwMTQtMDQtMDMgRmVkZXJhdGVkIENvLW9wZXJhdGl2ZXMgTGltaXRlZAorY3JzCisKKy8vIGNydWlzZSA6IDIwMTUtMTItMTAgVmlraW5nIFJpdmVyIENydWlzZXMgKEJlcm11ZGEpIEx0ZC4KK2NydWlzZQorCisvLyBjcnVpc2VzIDogMjAxMy0xMi0wNSBTcHJpbmcgV2F5LCBMTEMKK2NydWlzZXMKKworLy8gY3NjIDogMjAxNC0wOS0yNSBBbGxpYW5jZS1PbmUgU2VydmljZXMsIEluYy4KK2NzYworCisvLyBjdWlzaW5lbGxhIDogMjAxNC0wNC0wMyBTQUxNIFMuQS5TLgorY3Vpc2luZWxsYQorCisvLyBjeW1ydSA6IDIwMTQtMDUtMDggTm9taW5ldCBVSworY3ltcnUKKworLy8gY3lvdSA6IDIwMTUtMDEtMjIgQmVpamluZyBHYW1lYXNlIEFnZSBEaWdpdGFsIFRlY2hub2xvZ3kgQ28uLCBMdGQuCitjeW91CisKKy8vIGRhYnVyIDogMjAxNC0wMi0wNiBEYWJ1ciBJbmRpYSBMaW1pdGVkCitkYWJ1cgorCisvLyBkYWQgOiAyMDE0LTAxLTIzIENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitkYWQKKworLy8gZGFuY2UgOiAyMDEzLTEwLTI0IFVuaXRlZCBUTEQgSG9sZGNvIEx0ZC4KK2RhbmNlCisKKy8vIGRhdGEgOiAyMDE2LTA2LTAyIERpc2ggREJTIENvcnBvcmF0aW9uCitkYXRhCisKKy8vIGRhdGUgOiAyMDE0LTExLTIwIGRvdCBEYXRlIExpbWl0ZWQKK2RhdGUKKworLy8gZGF0aW5nIDogMjAxMy0xMi0wNSBQaW5lIEZlc3QsIExMQworZGF0aW5nCisKKy8vIGRhdHN1biA6IDIwMTQtMDMtMjcgTklTU0FOIE1PVE9SIENPLiwgTFRELgorZGF0c3VuCisKKy8vIGRheSA6IDIwMTQtMDEtMzAgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK2RheQorCisvLyBkY2xrIDogMjAxNC0xMS0yMCBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorZGNsaworCisvLyBkZHMgOiAyMDE1LTA1LTA3IFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAorZGRzCisKKy8vIGRlYWwgOiAyMDE1LTA2LTI1IEFtYXpvbiBFVSBTLsOgIHIubC4KK2RlYWwKKworLy8gZGVhbGVyIDogMjAxNC0xMi0yMiBEZWFsZXIgRG90IENvbSwgSW5jLgorZGVhbGVyCisKKy8vIGRlYWxzIDogMjAxNC0wNS0yMiBTYW5kIFN1bnNldCwgTExDCitkZWFscworCisvLyBkZWdyZWUgOiAyMDE0LTAzLTA2CitkZWdyZWUKKworLy8gZGVsaXZlcnkgOiAyMDE0LTA5LTExIFN0ZWVsIFN0YXRpb24sIExMQworZGVsaXZlcnkKKworLy8gZGVsbCA6IDIwMTQtMTAtMjQgRGVsbCBJbmMuCitkZWxsCisKKy8vIGRlbG9pdHRlIDogMjAxNS0wNy0zMSBEZWxvaXR0ZSBUb3VjaGUgVG9obWF0c3UKK2RlbG9pdHRlCisKKy8vIGRlbHRhIDogMjAxNS0wMi0xOSBEZWx0YSBBaXIgTGluZXMsIEluYy4KK2RlbHRhCisKKy8vIGRlbW9jcmF0IDogMjAxMy0xMC0yNCBVbml0ZWQgVExEIEhvbGRjbyBMdGQuCitkZW1vY3JhdAorCisvLyBkZW50YWwgOiAyMDE0LTAzLTIwIFRpbiBCaXJjaCwgTExDCitkZW50YWwKKworLy8gZGVudGlzdCA6IDIwMTQtMDMtMjAKK2RlbnRpc3QKKworLy8gZGVzaSA6IDIwMTMtMTEtMTQgRGVzaSBOZXR3b3JrcyBMTEMKK2Rlc2kKKworLy8gZGVzaWduIDogMjAxNC0xMS0wNyBUb3AgTGV2ZWwgRGVzaWduLCBMTEMKK2Rlc2lnbgorCisvLyBkZXYgOiAyMDE0LTEwLTE2IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitkZXYKKworLy8gZGhsIDogMjAxNS0wNy0yMyBEZXV0c2NoZSBQb3N0IEFHCitkaGwKKworLy8gZGlhbW9uZHMgOiAyMDEzLTA5LTIyIEpvaG4gRWRnZSwgTExDCitkaWFtb25kcworCisvLyBkaWV0IDogMjAxNC0wNi0yNiBVbmlyZWdpc3RyeSwgQ29ycC4KK2RpZXQKKworLy8gZGlnaXRhbCA6IDIwMTQtMDMtMDYgRGFzaCBQYXJrLCBMTEMKK2RpZ2l0YWwKKworLy8gZGlyZWN0IDogMjAxNC0wNC0xMCBIYWxmIFRyYWlsLCBMTEMKK2RpcmVjdAorCisvLyBkaXJlY3RvcnkgOiAyMDEzLTA5LTIwIEV4dHJhIE1hZGlzb24sIExMQworZGlyZWN0b3J5CisKKy8vIGRpc2NvdW50IDogMjAxNC0wMy0wNiBIb2xseSBIaWxsLCBMTEMKK2Rpc2NvdW50CisKKy8vIGRpc2NvdmVyIDogMjAxNS0wNy0yMyBEaXNjb3ZlciBGaW5hbmNpYWwgU2VydmljZXMKK2Rpc2NvdmVyCisKKy8vIGRpc2ggOiAyMDE1LTA3LTMwIERpc2ggREJTIENvcnBvcmF0aW9uCitkaXNoCisKKy8vIGRpeSA6IDIwMTUtMTEtMDUgTGlmZXN0eWxlIERvbWFpbiBIb2xkaW5ncywgSW5jLgorZGl5CisKKy8vIGRucCA6IDIwMTMtMTItMTMgRGFpIE5pcHBvbiBQcmludGluZyBDby4sIEx0ZC4KK2RucAorCisvLyBkb2NzIDogMjAxNC0xMC0xNiBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorZG9jcworCisvLyBkb2N0b3IgOiAyMDE2LTA2LTAyIEJyaWNlIFRyYWlsLCBMTEMKK2RvY3RvcgorCisvLyBkb2RnZSA6IDIwMTUtMDctMzAgRkNBIFVTIExMQy4KK2RvZGdlCisKKy8vIGRvZyA6IDIwMTQtMTItMDQgS29rbyBNaWxsLCBMTEMKK2RvZworCisvLyBkb2hhIDogMjAxNC0wOS0xOCBDb21tdW5pY2F0aW9ucyBSZWd1bGF0b3J5IEF1dGhvcml0eSAoQ1JBKQorZG9oYQorCisvLyBkb21haW5zIDogMjAxMy0xMC0xNyBTdWdhciBDcm9zcywgTExDCitkb21haW5zCisKKy8vIGRvdCA6IDIwMTUtMDUtMjEgRGlzaCBEQlMgQ29ycG9yYXRpb24KK2RvdAorCisvLyBkb3dubG9hZCA6IDIwMTQtMTEtMjAgZG90IFN1cHBvcnQgTGltaXRlZAorZG93bmxvYWQKKworLy8gZHJpdmUgOiAyMDE1LTAzLTA1IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitkcml2ZQorCisvLyBkdHYgOiAyMDE1LTA2LTA0IERpc2ggREJTIENvcnBvcmF0aW9uCitkdHYKKworLy8gZHViYWkgOiAyMDE1LTAxLTAxIER1YmFpIFNtYXJ0IEdvdmVybm1lbnQgRGVwYXJ0bWVudAorZHViYWkKKworLy8gZHVjayA6IDIwMTUtMDctMjMgSm9obnNvbiBTaGFyZWhvbGRpbmdzLCBJbmMuCitkdWNrCisKKy8vIGR1bmxvcCA6IDIwMTUtMDctMDIgVGhlIEdvb2R5ZWFyIFRpcmUgJiBSdWJiZXIgQ29tcGFueQorZHVubG9wCisKKy8vIGR1bnMgOiAyMDE1LTA4LTA2IFRoZSBEdW4gJiBCcmFkc3RyZWV0IENvcnBvcmF0aW9uCitkdW5zCisKKy8vIGR1cG9udCA6IDIwMTUtMDYtMjUgRS4gSS4gZHUgUG9udCBkZSBOZW1vdXJzIGFuZCBDb21wYW55CitkdXBvbnQKKworLy8gZHVyYmFuIDogMjAxNC0wMy0yNCBaQSBDZW50cmFsIFJlZ2lzdHJ5IE5QQyB0cmFkaW5nIGFzIFpBIENlbnRyYWwgUmVnaXN0cnkKK2R1cmJhbgorCisvLyBkdmFnIDogMjAxNC0wNi0yMyBEZXV0c2NoZSBWZXJtw7ZnZW5zYmVyYXR1bmcgQWt0aWVuZ2VzZWxsc2NoYWZ0IERWQUcKK2R2YWcKKworLy8gZHZyIDogMjAxNi0wNS0yNiBIdWdoZXMgU2F0ZWxsaXRlIFN5c3RlbXMgQ29ycG9yYXRpb24KK2R2cgorCisvLyBlYXJ0aCA6IDIwMTQtMTItMDQgSW50ZXJsaW5rIENvLiwgTHRkLgorZWFydGgKKworLy8gZWF0IDogMjAxNC0wMS0yMyBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorZWF0CisKKy8vIGVjbyA6IDIwMTYtMDctMDggQmlnIFJvb20gSW5jLgorZWNvCisKKy8vIGVkZWthIDogMjAxNC0xMi0xOCBFREVLQSBWZXJiYW5kIGthdWZtw6RubmlzY2hlciBHZW5vc3NlbnNjaGFmdGVuIGUuVi4KK2VkZWthCisKKy8vIGVkdWNhdGlvbiA6IDIwMTMtMTEtMDcgQnJpY2UgV2F5LCBMTEMKK2VkdWNhdGlvbgorCisvLyBlbWFpbCA6IDIwMTMtMTAtMzEgU3ByaW5nIE1hZGlzb24sIExMQworZW1haWwKKworLy8gZW1lcmNrIDogMjAxNC0wNC0wMyBNZXJjayBLR2FBCitlbWVyY2sKKworLy8gZW5lcmd5IDogMjAxNC0wOS0xMSBCaW5reSBCaXJjaCwgTExDCitlbmVyZ3kKKworLy8gZW5naW5lZXIgOiAyMDE0LTAzLTA2IFVuaXRlZCBUTEQgSG9sZGNvIEx0ZC4KK2VuZ2luZWVyCisKKy8vIGVuZ2luZWVyaW5nIDogMjAxNC0wMy0wNiBSb21lbyBDYW55b24KK2VuZ2luZWVyaW5nCisKKy8vIGVudGVycHJpc2VzIDogMjAxMy0wOS0yMCBTbm93IE9ha3MsIExMQworZW50ZXJwcmlzZXMKKworLy8gZXBvc3QgOiAyMDE1LTA3LTIzIERldXRzY2hlIFBvc3QgQUcKK2Vwb3N0CisKKy8vIGVwc29uIDogMjAxNC0xMi0wNCBTZWlrbyBFcHNvbiBDb3Jwb3JhdGlvbgorZXBzb24KKworLy8gZXF1aXBtZW50IDogMjAxMy0wOC0yNyBDb3JuIFN0YXRpb24sIExMQworZXF1aXBtZW50CisKKy8vIGVyaWNzc29uIDogMjAxNS0wNy0wOSBUZWxlZm9uYWt0aWVib2xhZ2V0IEwgTSBFcmljc3NvbgorZXJpY3Nzb24KKworLy8gZXJuaSA6IDIwMTQtMDQtMDMgRVJOSSBHcm91cCBIb2xkaW5nIEFHCitlcm5pCisKKy8vIGVzcSA6IDIwMTQtMDUtMDggQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK2VzcQorCisvLyBlc3RhdGUgOiAyMDEzLTA4LTI3IFRyaXh5IFBhcmssIExMQworZXN0YXRlCisKKy8vIGVzdXJhbmNlIDogMjAxNS0wNy0yMyBFc3VyYW5jZSBJbnN1cmFuY2UgQ29tcGFueQorZXN1cmFuY2UKKworLy8gZXRpc2FsYXQgOiAyMDE1LTA5LTAzIEVtaXJhdGVzIFRlbGVjb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbiAodHJhZGluZyBhcyBFdGlzYWxhdCkKK2V0aXNhbGF0CisKKy8vIGV1cm92aXNpb24gOiAyMDE0LTA0LTI0IEV1cm9wZWFuIEJyb2FkY2FzdGluZyBVbmlvbiAoRUJVKQorZXVyb3Zpc2lvbgorCisvLyBldXMgOiAyMDEzLTEyLTEyIFB1bnR1ZXVzIEZ1bmRhemlvYQorZXVzCisKKy8vIGV2ZW50cyA6IDIwMTMtMTItMDUgUGlvbmVlciBNYXBsZSwgTExDCitldmVudHMKKworLy8gZXZlcmJhbmsgOiAyMDE0LTA1LTE1IEV2ZXJCYW5rCitldmVyYmFuaworCisvLyBleGNoYW5nZSA6IDIwMTQtMDMtMDYgU3ByaW5nIEZhbGxzLCBMTEMKK2V4Y2hhbmdlCisKKy8vIGV4cGVydCA6IDIwMTMtMTEtMjEgTWFnaWMgUGFzcywgTExDCitleHBlcnQKKworLy8gZXhwb3NlZCA6IDIwMTMtMTItMDUgVmljdG9yIEJlYWNoLCBMTEMKK2V4cG9zZWQKKworLy8gZXhwcmVzcyA6IDIwMTUtMDItMTEgU2VhIFN1bnNldCwgTExDCitleHByZXNzCisKKy8vIGV4dHJhc3BhY2UgOiAyMDE1LTA1LTE0IEV4dHJhIFNwYWNlIFN0b3JhZ2UgTExDCitleHRyYXNwYWNlCisKKy8vIGZhZ2UgOiAyMDE0LTEyLTE4IEZhZ2UgSW50ZXJuYXRpb25hbCBTLkEuCitmYWdlCisKKy8vIGZhaWwgOiAyMDE0LTAzLTA2IEF0b21pYyBQaXBlLCBMTEMKK2ZhaWwKKworLy8gZmFpcndpbmRzIDogMjAxNC0xMS0xMyBGYWlyV2luZHMgUGFydG5lcnMsIExMQworZmFpcndpbmRzCisKKy8vIGZhaXRoIDogMjAxNC0xMS0yMCBkb3QgRmFpdGggTGltaXRlZAorZmFpdGgKKworLy8gZmFtaWx5IDogMjAxNS0wNC0wMgorZmFtaWx5CisKKy8vIGZhbiA6IDIwMTQtMDMtMDYKK2ZhbgorCisvLyBmYW5zIDogMjAxNC0xMS0wNyBBc2lhbWl4IERpZ2l0YWwgTGltaXRlZAorZmFucworCisvLyBmYXJtIDogMjAxMy0xMS0wNyBKdXN0IE1hcGxlLCBMTEMKK2Zhcm0KKworLy8gZmFybWVycyA6IDIwMTUtMDctMDkgRmFybWVycyBJbnN1cmFuY2UgRXhjaGFuZ2UKK2Zhcm1lcnMKKworLy8gZmFzaGlvbiA6IDIwMTQtMDctMDMgVG9wIExldmVsIERvbWFpbiBIb2xkaW5ncyBMaW1pdGVkCitmYXNoaW9uCisKKy8vIGZhc3QgOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK2Zhc3QKKworLy8gZmVkZXggOiAyMDE1LTA4LTA2IEZlZGVyYWwgRXhwcmVzcyBDb3Jwb3JhdGlvbgorZmVkZXgKKworLy8gZmVlZGJhY2sgOiAyMDEzLTEyLTE5IFRvcCBMZXZlbCBTcGVjdHJ1bSwgSW5jLgorZmVlZGJhY2sKKworLy8gZmVycmFyaSA6IDIwMTUtMDctMzEgRmlhdCBDaHJ5c2xlciBBdXRvbW9iaWxlcyBOLlYuCitmZXJyYXJpCisKKy8vIGZlcnJlcm8gOiAyMDE0LTEyLTE4IEZlcnJlcm8gVHJhZGluZyBMdXggUy5BLgorZmVycmVybworCisvLyBmaWF0IDogMjAxNS0wNy0zMSBGaWF0IENocnlzbGVyIEF1dG9tb2JpbGVzIE4uVi4KK2ZpYXQKKworLy8gZmlkZWxpdHkgOiAyMDE1LTA3LTMwIEZpZGVsaXR5IEJyb2tlcmFnZSBTZXJ2aWNlcyBMTEMKK2ZpZGVsaXR5CisKKy8vIGZpZG8gOiAyMDE1LTA4LTA2IFJvZ2VycyBDb21tdW5pY2F0aW9ucyBQYXJ0bmVyc2hpcAorZmlkbworCisvLyBmaWxtIDogMjAxNS0wMS0wOCBNb3Rpb24gUGljdHVyZSBEb21haW4gUmVnaXN0cnkgUHR5IEx0ZAorZmlsbQorCisvLyBmaW5hbCA6IDIwMTQtMTAtMTYgTsO6Y2xlbyBkZSBJbmZvcm1hw6fDo28gZSBDb29yZGVuYcOnw6NvIGRvIFBvbnRvIEJSIC0gTklDLmJyCitmaW5hbAorCisvLyBmaW5hbmNlIDogMjAxNC0wMy0yMCBDb3R0b24gQ3lwcmVzcywgTExDCitmaW5hbmNlCisKKy8vIGZpbmFuY2lhbCA6IDIwMTQtMDMtMDYgSnVzdCBDb3ZlciwgTExDCitmaW5hbmNpYWwKKworLy8gZmlyZSA6IDIwMTUtMDYtMjUgQW1hem9uIEVVIFMuw6Agci5sLgorZmlyZQorCisvLyBmaXJlc3RvbmUgOiAyMDE0LTEyLTE4IEJyaWRnZXN0b25lIENvcnBvcmF0aW9uCitmaXJlc3RvbmUKKworLy8gZmlybWRhbGUgOiAyMDE0LTAzLTI3IEZpcm1kYWxlIEhvbGRpbmdzIExpbWl0ZWQKK2Zpcm1kYWxlCisKKy8vIGZpc2ggOiAyMDEzLTEyLTEyIEZveCBXb29kcywgTExDCitmaXNoCisKKy8vIGZpc2hpbmcgOiAyMDEzLTExLTIxIFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAorZmlzaGluZworCisvLyBmaXQgOiAyMDE0LTExLTA3IFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAorZml0CisKKy8vIGZpdG5lc3MgOiAyMDE0LTAzLTA2IEJyaWNlIE9yY2hhcmQsIExMQworZml0bmVzcworCisvLyBmbGlja3IgOiAyMDE1LTA0LTAyIFlhaG9vISBEb21haW4gU2VydmljZXMgSW5jLgorZmxpY2tyCisKKy8vIGZsaWdodHMgOiAyMDEzLTEyLTA1IEZveCBTdGF0aW9uLCBMTEMKK2ZsaWdodHMKKworLy8gZmxpciA6IDIwMTUtMDctMjMgRkxJUiBTeXN0ZW1zLCBJbmMuCitmbGlyCisKKy8vIGZsb3Jpc3QgOiAyMDEzLTExLTA3IEhhbGYgQ3lwcmVzcywgTExDCitmbG9yaXN0CisKKy8vIGZsb3dlcnMgOiAyMDE0LTEwLTA5IFVuaXJlZ2lzdHJ5LCBDb3JwLgorZmxvd2VycworCisvLyBmbHkgOiAyMDE0LTA1LTA4IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitmbHkKKworLy8gZm9vIDogMjAxNC0wMS0yMyBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorZm9vCisKKy8vIGZvb2QgOiAyMDE2LTA0LTIxIExpZmVzdHlsZSBEb21haW4gSG9sZGluZ3MsIEluYy4KK2Zvb2QKKworLy8gZm9vZG5ldHdvcmsgOiAyMDE1LTA3LTAyIExpZmVzdHlsZSBEb21haW4gSG9sZGluZ3MsIEluYy4KK2Zvb2RuZXR3b3JrCisKKy8vIGZvb3RiYWxsIDogMjAxNC0xMi0xOCBGb2dneSBGYXJtcywgTExDCitmb290YmFsbAorCisvLyBmb3JkIDogMjAxNC0xMS0xMyBGb3JkIE1vdG9yIENvbXBhbnkKK2ZvcmQKKworLy8gZm9yZXggOiAyMDE0LTEyLTExIElHIEdyb3VwIEhvbGRpbmdzIFBMQworZm9yZXgKKworLy8gZm9yc2FsZSA6IDIwMTQtMDUtMjIKK2ZvcnNhbGUKKworLy8gZm9ydW0gOiAyMDE1LTA0LTAyIEZlZ2lzdHJ5LCBMTEMKK2ZvcnVtCisKKy8vIGZvdW5kYXRpb24gOiAyMDEzLTEyLTA1IEpvaG4gRGFsZSwgTExDCitmb3VuZGF0aW9uCisKKy8vIGZveCA6IDIwMTUtMDktMTEgRk9YIFJlZ2lzdHJ5LCBMTEMKK2ZveAorCisvLyBmcmVlIDogMjAxNS0xMi0xMCBBbWF6b24gRVUgUy7DoCByLmwuCitmcmVlCisKKy8vIGZyZXNlbml1cyA6IDIwMTUtMDctMzAgRnJlc2VuaXVzIEltbW9iaWxpZW4tVmVyd2FsdHVuZ3MtR21iSAorZnJlc2VuaXVzCisKKy8vIGZybCA6IDIwMTQtMDUtMTUgRlJMcmVnaXN0cnkgQi5WLgorZnJsCisKKy8vIGZyb2dhbnMgOiAyMDEzLTEyLTE5IE9QM0ZUCitmcm9nYW5zCisKKy8vIGZyb250ZG9vciA6IDIwMTUtMDctMDIgTGlmZXN0eWxlIERvbWFpbiBIb2xkaW5ncywgSW5jLgorZnJvbnRkb29yCisKKy8vIGZyb250aWVyIDogMjAxNS0wMi0wNSBGcm9udGllciBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbgorZnJvbnRpZXIKKworLy8gZnRyIDogMjAxNS0wNy0xNiBGcm9udGllciBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbgorZnRyCisKKy8vIGZ1aml0c3UgOiAyMDE1LTA3LTMwIEZ1aml0c3UgTGltaXRlZAorZnVqaXRzdQorCisvLyBmdWppeGVyb3ggOiAyMDE1LTA3LTIzIFhlcm94IEROSEMgTExDCitmdWppeGVyb3gKKworLy8gZnVuIDogMjAxNi0wMS0xNAorZnVuCisKKy8vIGZ1bmQgOiAyMDE0LTAzLTIwIEpvaG4gQ2FzdGxlLCBMTEMKK2Z1bmQKKworLy8gZnVybml0dXJlIDogMjAxNC0wMy0yMCBMb25lIEZpZWxkcywgTExDCitmdXJuaXR1cmUKKworLy8gZnV0Ym9sIDogMjAxMy0wOS0yMAorZnV0Ym9sCisKKy8vIGZ5aSA6IDIwMTUtMDQtMDIgU2lsdmVyIFRpZ2VycywgTExDCitmeWkKKworLy8gZ2FsIDogMjAxMy0xMS0wNyBBc29jaWFjacOzbiBwdW50b0dBTAorZ2FsCisKKy8vIGdhbGxlcnkgOiAyMDEzLTA5LTEzIFN1Z2FyIEhvdXNlLCBMTEMKK2dhbGxlcnkKKworLy8gZ2FsbG8gOiAyMDE1LTA2LTExIEdhbGxvIFZpbmV5YXJkcywgSW5jLgorZ2FsbG8KKworLy8gZ2FsbHVwIDogMjAxNS0wMi0xOSBHYWxsdXAsIEluYy4KK2dhbGx1cAorCisvLyBnYW1lIDogMjAxNS0wNS0yOCBVbmlyZWdpc3RyeSwgQ29ycC4KK2dhbWUKKworLy8gZ2FtZXMgOiAyMDE1LTA1LTI4CitnYW1lcworCisvLyBnYXAgOiAyMDE1LTA3LTMxIFRoZSBHYXAsIEluYy4KK2dhcAorCisvLyBnYXJkZW4gOiAyMDE0LTA2LTI2IFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAorZ2FyZGVuCisKKy8vIGdiaXogOiAyMDE0LTA3LTE3IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitnYml6CisKKy8vIGdkbiA6IDIwMTQtMDctMzEgSm9pbnQgU3RvY2sgQ29tcGFueSAiTmF2aWdhdGlvbi1pbmZvcm1hdGlvbiBzeXN0ZW1zIgorZ2RuCisKKy8vIGdlYSA6IDIwMTQtMTItMDQgR0VBIEdyb3VwIEFrdGllbmdlc2VsbHNjaGFmdAorZ2VhCisKKy8vIGdlbnQgOiAyMDE0LTAxLTIzIENPTUJFTEwgR1JPVVAgTlYvU0EKK2dlbnQKKworLy8gZ2VudGluZyA6IDIwMTUtMDMtMTIgUmVzb3J0cyBXb3JsZCBJbmMgUHRlLiBMdGQuCitnZW50aW5nCisKKy8vIGdlb3JnZSA6IDIwMTUtMDctMzEgV2FsLU1hcnQgU3RvcmVzLCBJbmMuCitnZW9yZ2UKKworLy8gZ2dlZSA6IDIwMTQtMDEtMDkgR01PIEludGVybmV0LCBJbmMuCitnZ2VlCisKKy8vIGdpZnQgOiAyMDEzLTEwLTE3IFVuaXJlZ2lzdHJ5LCBDb3JwLgorZ2lmdAorCisvLyBnaWZ0cyA6IDIwMTQtMDctMDMgR29vc2UgU2t5LCBMTEMKK2dpZnRzCisKKy8vIGdpdmVzIDogMjAxNC0wMy0wNiBVbml0ZWQgVExEIEhvbGRjbyBMdGQuCitnaXZlcworCisvLyBnaXZpbmcgOiAyMDE0LTExLTEzIEdpdmluZyBMaW1pdGVkCitnaXZpbmcKKworLy8gZ2xhZGUgOiAyMDE1LTA3LTIzIEpvaG5zb24gU2hhcmVob2xkaW5ncywgSW5jLgorZ2xhZGUKKworLy8gZ2xhc3MgOiAyMDEzLTExLTA3IEJsYWNrIENvdmVyLCBMTEMKK2dsYXNzCisKKy8vIGdsZSA6IDIwMTQtMDctMjQgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK2dsZQorCisvLyBnbG9iYWwgOiAyMDE0LTA0LTE3IERvdCBHTE9CQUwgQVMKK2dsb2JhbAorCisvLyBnbG9ibyA6IDIwMTMtMTItMTkgR2xvYm8gQ29tdW5pY2HDp8OjbyBlIFBhcnRpY2lwYcOnw7VlcyBTLkEKK2dsb2JvCisKKy8vIGdtYWlsIDogMjAxNC0wNS0wMSBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorZ21haWwKKworLy8gZ21iaCA6IDIwMTYtMDEtMjkgRXh0cmEgRHluYW1pdGUsIExMQworZ21iaAorCisvLyBnbW8gOiAyMDE0LTAxLTA5IEdNTyBJbnRlcm5ldCwgSW5jLgorZ21vCisKKy8vIGdteCA6IDIwMTQtMDQtMjQgMSYxIE1haWwgJiBNZWRpYSBHbWJICitnbXgKKworLy8gZ29kYWRkeSA6IDIwMTUtMDctMjMgR28gRGFkZHkgRWFzdCwgTExDCitnb2RhZGR5CisKKy8vIGdvbGQgOiAyMDE1LTAxLTIyIEp1bmUgRWRnZSwgTExDCitnb2xkCisKKy8vIGdvbGRwb2ludCA6IDIwMTQtMTEtMjAgWU9ET0JBU0hJIENBTUVSQSBDTy4sTFRELgorZ29sZHBvaW50CisKKy8vIGdvbGYgOiAyMDE0LTEyLTE4IExvbmUgZmFsbHMsIExMQworZ29sZgorCisvLyBnb28gOiAyMDE0LTEyLTE4IE5UVCBSZXNvbmFudCBJbmMuCitnb28KKworLy8gZ29vZGhhbmRzIDogMjAxNS0wNy0zMSBBbGxzdGF0ZSBGaXJlIGFuZCBDYXN1YWx0eSBJbnN1cmFuY2UgQ29tcGFueQorZ29vZGhhbmRzCisKKy8vIGdvb2R5ZWFyIDogMjAxNS0wNy0wMiBUaGUgR29vZHllYXIgVGlyZSAmIFJ1YmJlciBDb21wYW55Citnb29keWVhcgorCisvLyBnb29nIDogMjAxNC0xMS0yMCBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorZ29vZworCisvLyBnb29nbGUgOiAyMDE0LTA3LTI0IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitnb29nbGUKKworLy8gZ29wIDogMjAxNC0wMS0xNiBSZXB1YmxpY2FuIFN0YXRlIExlYWRlcnNoaXAgQ29tbWl0dGVlLCBJbmMuCitnb3AKKworLy8gZ290IDogMjAxNC0xMi0xOCBBbWF6b24gRVUgUy7DoCByLmwuCitnb3QKKworLy8gZ3JhaW5nZXIgOiAyMDE1LTA1LTA3IEdyYWluZ2VyIFJlZ2lzdHJ5IFNlcnZpY2VzLCBMTEMKK2dyYWluZ2VyCisKKy8vIGdyYXBoaWNzIDogMjAxMy0wOS0xMyBPdmVyIE1hZGlzb24sIExMQworZ3JhcGhpY3MKKworLy8gZ3JhdGlzIDogMjAxNC0wMy0yMCBQaW9uZWVyIFRpZ2VycywgTExDCitncmF0aXMKKworLy8gZ3JlZW4gOiAyMDE0LTA1LTA4IEFmaWxpYXMgTGltaXRlZAorZ3JlZW4KKworLy8gZ3JpcGUgOiAyMDE0LTAzLTA2IENvcm4gU3Vuc2V0LCBMTEMKK2dyaXBlCisKKy8vIGdyb2NlcnkgOiAyMDE2LTA2LTE2IFdhbC1NYXJ0IFN0b3JlcywgSW5jLgorZ3JvY2VyeQorCisvLyBncm91cCA6IDIwMTQtMDgtMTUgUm9tZW8gVG93biwgTExDCitncm91cAorCisvLyBndWFyZGlhbiA6IDIwMTUtMDctMzAgVGhlIEd1YXJkaWFuIExpZmUgSW5zdXJhbmNlIENvbXBhbnkgb2YgQW1lcmljYQorZ3VhcmRpYW4KKworLy8gZ3VjY2kgOiAyMDE0LTExLTEzIEd1Y2NpbyBHdWNjaSBTLnAuYS4KK2d1Y2NpCisKKy8vIGd1Z2UgOiAyMDE0LTA4LTI4IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitndWdlCisKKy8vIGd1aWRlIDogMjAxMy0wOS0xMyBTbm93IE1vb24sIExMQworZ3VpZGUKKworLy8gZ3VpdGFycyA6IDIwMTMtMTEtMTQgVW5pcmVnaXN0cnksIENvcnAuCitndWl0YXJzCisKKy8vIGd1cnUgOiAyMDEzLTA4LTI3IFBpb25lZXIgQ3lwcmVzcywgTExDCitndXJ1CisKKy8vIGhhaXIgOiAyMDE1LTEyLTAzIEwnT3LDqWFsCitoYWlyCisKKy8vIGhhbWJ1cmcgOiAyMDE0LTAyLTIwIEhhbWJ1cmcgVG9wLUxldmVsLURvbWFpbiBHbWJICitoYW1idXJnCisKKy8vIGhhbmdvdXQgOiAyMDE0LTExLTEzIENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitoYW5nb3V0CisKKy8vIGhhdXMgOiAyMDEzLTEyLTA1CitoYXVzCisKKy8vIGhibyA6IDIwMTUtMDctMzAgSEJPIFJlZ2lzdHJ5IFNlcnZpY2VzLCBJbmMuCitoYm8KKworLy8gaGRmYyA6IDIwMTUtMDctMzAgSE9VU0lORyBERVZFTE9QTUVOVCBGSU5BTkNFIENPUlBPUkFUSU9OIExJTUlURUQKK2hkZmMKKworLy8gaGRmY2JhbmsgOiAyMDE1LTAyLTEyIEhERkMgQmFuayBMaW1pdGVkCitoZGZjYmFuaworCisvLyBoZWFsdGggOiAyMDE1LTAyLTExIERvdEhlYWx0aCwgTExDCitoZWFsdGgKKworLy8gaGVhbHRoY2FyZSA6IDIwMTQtMDYtMTIgU2lsdmVyIEdsZW4sIExMQworaGVhbHRoY2FyZQorCisvLyBoZWxwIDogMjAxNC0wNi0yNiBVbmlyZWdpc3RyeSwgQ29ycC4KK2hlbHAKKworLy8gaGVsc2lua2kgOiAyMDE1LTAyLTA1IENpdHkgb2YgSGVsc2lua2kKK2hlbHNpbmtpCisKKy8vIGhlcmUgOiAyMDE0LTAyLTA2IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitoZXJlCisKKy8vIGhlcm1lcyA6IDIwMTQtMDctMTAgSEVSTUVTIElOVEVSTkFUSU9OQUwKK2hlcm1lcworCisvLyBoZ3R2IDogMjAxNS0wNy0wMiBMaWZlc3R5bGUgRG9tYWluIEhvbGRpbmdzLCBJbmMuCitoZ3R2CisKKy8vIGhpcGhvcCA6IDIwMTQtMDMtMDYgVW5pcmVnaXN0cnksIENvcnAuCitoaXBob3AKKworLy8gaGlzYW1pdHN1IDogMjAxNS0wNy0xNiBIaXNhbWl0c3UgUGhhcm1hY2V1dGljYWwgQ28uLEluYy4KK2hpc2FtaXRzdQorCisvLyBoaXRhY2hpIDogMjAxNC0xMC0zMSBIaXRhY2hpLCBMdGQuCitoaXRhY2hpCisKKy8vIGhpdiA6IDIwMTQtMDMtMTMKK2hpdgorCisvLyBoa3QgOiAyMDE1LTA1LTE0IFBDQ1ctSEtUIERhdGFDb20gU2VydmljZXMgTGltaXRlZAoraGt0CisKKy8vIGhvY2tleSA6IDIwMTUtMDMtMTkgSGFsZiBXaWxsb3csIExMQworaG9ja2V5CisKKy8vIGhvbGRpbmdzIDogMjAxMy0wOC0yNyBKb2huIE1hZGlzb24sIExMQworaG9sZGluZ3MKKworLy8gaG9saWRheSA6IDIwMTMtMTEtMDcgR29vc2UgV29vZHMsIExMQworaG9saWRheQorCisvLyBob21lZGVwb3QgOiAyMDE1LTA0LTAyIEhvbWVyIFRMQywgSW5jLgoraG9tZWRlcG90CisKKy8vIGhvbWVnb29kcyA6IDIwMTUtMDctMTYgVGhlIFRKWCBDb21wYW5pZXMsIEluYy4KK2hvbWVnb29kcworCisvLyBob21lcyA6IDIwMTQtMDEtMDkgREVSSG9tZXMsIExMQworaG9tZXMKKworLy8gaG9tZXNlbnNlIDogMjAxNS0wNy0xNiBUaGUgVEpYIENvbXBhbmllcywgSW5jLgoraG9tZXNlbnNlCisKKy8vIGhvbmRhIDogMjAxNC0xMi0xOCBIb25kYSBNb3RvciBDby4sIEx0ZC4KK2hvbmRhCisKKy8vIGhvbmV5d2VsbCA6IDIwMTUtMDctMjMgSG9uZXl3ZWxsIEdUTEQgTExDCitob25leXdlbGwKKworLy8gaG9yc2UgOiAyMDEzLTExLTIxIFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAoraG9yc2UKKworLy8gaG9zcGl0YWwgOiAyMDE2LTEwLTIwIFJ1YnkgUGlrZSwgTExDCitob3NwaXRhbAorCisvLyBob3N0IDogMjAxNC0wNC0xNyBEb3RIb3N0IEluYy4KK2hvc3QKKworLy8gaG9zdGluZyA6IDIwMTQtMDUtMjkgVW5pcmVnaXN0cnksIENvcnAuCitob3N0aW5nCisKKy8vIGhvdCA6IDIwMTUtMDgtMjcgQW1hem9uIEVVIFMuw6Agci5sLgoraG90CisKKy8vIGhvdGVsZXMgOiAyMDE1LTAzLTA1IFRyYXZlbCBSZXNlcnZhdGlvbnMgU1JMCitob3RlbGVzCisKKy8vIGhvdGVscyA6IDIwMTYtMDQtMDcgQm9va2luZy5jb20gQi5WLgoraG90ZWxzCisKKy8vIGhvdG1haWwgOiAyMDE0LTEyLTE4IE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgoraG90bWFpbAorCisvLyBob3VzZSA6IDIwMTMtMTEtMDcgU3VnYXIgUGFyaywgTExDCitob3VzZQorCisvLyBob3cgOiAyMDE0LTAxLTIzIENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitob3cKKworLy8gaHNiYyA6IDIwMTQtMTAtMjQgSFNCQyBIb2xkaW5ncyBQTEMKK2hzYmMKKworLy8gaHRjIDogMjAxNS0wNC0wMiBIVEMgY29ycG9yYXRpb24KK2h0YworCisvLyBodWdoZXMgOiAyMDE1LTA3LTMwIEh1Z2hlcyBTYXRlbGxpdGUgU3lzdGVtcyBDb3Jwb3JhdGlvbgoraHVnaGVzCisKKy8vIGh5YXR0IDogMjAxNS0wNy0zMCBIeWF0dCBHVExELCBMLkwuQy4KK2h5YXR0CisKKy8vIGh5dW5kYWkgOiAyMDE1LTA3LTA5IEh5dW5kYWkgTW90b3IgQ29tcGFueQoraHl1bmRhaQorCisvLyBpYm0gOiAyMDE0LTA3LTMxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24KK2libQorCisvLyBpY2JjIDogMjAxNS0wMi0xOSBJbmR1c3RyaWFsIGFuZCBDb21tZXJjaWFsIEJhbmsgb2YgQ2hpbmEgTGltaXRlZAoraWNiYworCisvLyBpY2UgOiAyMDE0LTEwLTMwIEludGVyY29udGluZW50YWxFeGNoYW5nZSwgSW5jLgoraWNlCisKKy8vIGljdSA6IDIwMTUtMDEtMDggT25lLmNvbSBBL1MKK2ljdQorCisvLyBpZWVlIDogMjAxNS0wNy0yMyBJRUVFIEdsb2JhbCBMTEMKK2llZWUKKworLy8gaWZtIDogMjAxNC0wMS0zMCBpZm0gZWxlY3Ryb25pYyBnbWJoCitpZm0KKworLy8gaWthbm8gOiAyMDE1LTA3LTA5IElrYW5vIFMuQS4KK2lrYW5vCisKKy8vIGltYW1hdCA6IDIwMTUtMDgtMDYgRm9uZGF0aW9uIEFnYSBLaGFuIChBZ2EgS2hhbiBGb3VuZGF0aW9uKQoraW1hbWF0CisKKy8vIGltZGIgOiAyMDE1LTA2LTI1IEFtYXpvbiBFVSBTLsOgIHIubC4KK2ltZGIKKworLy8gaW1tbyA6IDIwMTQtMDctMTAgQXVidXJuIEJsb29tLCBMTEMKK2ltbW8KKworLy8gaW1tb2JpbGllbiA6IDIwMTMtMTEtMDcgVW5pdGVkIFRMRCBIb2xkY28gTHRkLgoraW1tb2JpbGllbgorCisvLyBpbmR1c3RyaWVzIDogMjAxMy0xMi0wNSBPdXRlciBIb3VzZSwgTExDCitpbmR1c3RyaWVzCisKKy8vIGluZmluaXRpIDogMjAxNC0wMy0yNyBOSVNTQU4gTU9UT1IgQ08uLCBMVEQuCitpbmZpbml0aQorCisvLyBpbmcgOiAyMDE0LTAxLTIzIENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitpbmcKKworLy8gaW5rIDogMjAxMy0xMi0wNSBUb3AgTGV2ZWwgRGVzaWduLCBMTEMKK2luaworCisvLyBpbnN0aXR1dGUgOiAyMDEzLTExLTA3IE91dGVyIE1hcGxlLCBMTEMKK2luc3RpdHV0ZQorCisvLyBpbnN1cmFuY2UgOiAyMDE1LTAyLTE5IGZUTEQgUmVnaXN0cnkgU2VydmljZXMgTExDCitpbnN1cmFuY2UKKworLy8gaW5zdXJlIDogMjAxNC0wMy0yMCBQaW9uZWVyIFdpbGxvdywgTExDCitpbnN1cmUKKworLy8gaW50ZWwgOiAyMDE1LTA4LTA2IEludGVsIENvcnBvcmF0aW9uCitpbnRlbAorCisvLyBpbnRlcm5hdGlvbmFsIDogMjAxMy0xMS0wNyBXaWxkIFdheSwgTExDCitpbnRlcm5hdGlvbmFsCisKKy8vIGludHVpdCA6IDIwMTUtMDctMzAgSW50dWl0IEFkbWluaXN0cmF0aXZlIFNlcnZpY2VzLCBJbmMuCitpbnR1aXQKKworLy8gaW52ZXN0bWVudHMgOiAyMDE0LTAzLTIwIEhvbGx5IEdsZW4sIExMQworaW52ZXN0bWVudHMKKworLy8gaXBpcmFuZ2EgOiAyMDE0LTA4LTI4IElwaXJhbmdhIFByb2R1dG9zIGRlIFBldHJvbGVvIFMuQS4KK2lwaXJhbmdhCisKKy8vIGlyaXNoIDogMjAxNC0wOC0wNyBEb3QtSXJpc2ggTExDCitpcmlzaAorCisvLyBpc2VsZWN0IDogMjAxNS0wMi0xMSBpU2VsZWN0IEx0ZAoraXNlbGVjdAorCisvLyBpc21haWxpIDogMjAxNS0wOC0wNiBGb25kYXRpb24gQWdhIEtoYW4gKEFnYSBLaGFuIEZvdW5kYXRpb24pCitpc21haWxpCisKKy8vIGlzdCA6IDIwMTQtMDgtMjggSXN0YW5idWwgTWV0cm9wb2xpdGFuIE11bmljaXBhbGl0eQoraXN0CisKKy8vIGlzdGFuYnVsIDogMjAxNC0wOC0yOCBJc3RhbmJ1bCBNZXRyb3BvbGl0YW4gTXVuaWNpcGFsaXR5Citpc3RhbmJ1bAorCisvLyBpdGF1IDogMjAxNC0xMC0wMiBJdGF1IFVuaWJhbmNvIEhvbGRpbmcgUy5BLgoraXRhdQorCisvLyBpdHYgOiAyMDE1LTA3LTA5IElUViBTZXJ2aWNlcyBMaW1pdGVkCitpdHYKKworLy8gaXZlY28gOiAyMDE1LTA5LTAzIENOSCBJbmR1c3RyaWFsIE4uVi4KK2l2ZWNvCisKKy8vIGl3YyA6IDIwMTQtMDYtMjMgUmljaGVtb250IEROUyBJbmMuCitpd2MKKworLy8gamFndWFyIDogMjAxNC0xMS0xMyBKYWd1YXIgTGFuZCBSb3ZlciBMdGQKK2phZ3VhcgorCisvLyBqYXZhIDogMjAxNC0wNi0xOSBPcmFjbGUgQ29ycG9yYXRpb24KK2phdmEKKworLy8gamNiIDogMjAxNC0xMS0yMCBKQ0IgQ28uLCBMdGQuCitqY2IKKworLy8gamNwIDogMjAxNS0wNC0yMyBKQ1AgTWVkaWEsIEluYy4KK2pjcAorCisvLyBqZWVwIDogMjAxNS0wNy0zMCBGQ0EgVVMgTExDLgoramVlcAorCisvLyBqZXR6dCA6IDIwMTQtMDEtMDkKK2pldHp0CisKKy8vIGpld2VscnkgOiAyMDE1LTAzLTA1IFdpbGQgQmxvb20sIExMQworamV3ZWxyeQorCisvLyBqaW8gOiAyMDE1LTA0LTAyIEFmZmluaXR5IE5hbWVzLCBJbmMuCitqaW8KKworLy8gamxjIDogMjAxNC0xMi0wNCBSaWNoZW1vbnQgRE5TIEluYy4KK2psYworCisvLyBqbGwgOiAyMDE1LTA0LTAyIEpvbmVzIExhbmcgTGFTYWxsZSBJbmNvcnBvcmF0ZWQKK2psbAorCisvLyBqbXAgOiAyMDE1LTAzLTI2IE1hdHJpeCBJUCBMTEMKK2ptcAorCisvLyBqbmogOiAyMDE1LTA2LTE4IEpvaG5zb24gJiBKb2huc29uIFNlcnZpY2VzLCBJbmMuCitqbmoKKworLy8gam9idXJnIDogMjAxNC0wMy0yNCBaQSBDZW50cmFsIFJlZ2lzdHJ5IE5QQyB0cmFkaW5nIGFzIFpBIENlbnRyYWwgUmVnaXN0cnkKK2pvYnVyZworCisvLyBqb3QgOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK2pvdAorCisvLyBqb3kgOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK2pveQorCisvLyBqcG1vcmdhbiA6IDIwMTUtMDQtMzAgSlBNb3JnYW4gQ2hhc2UgJiBDby4KK2pwbW9yZ2FuCisKKy8vIGpwcnMgOiAyMDE0LTA5LTE4IEphcGFuIFJlZ2lzdHJ5IFNlcnZpY2VzIENvLiwgTHRkLgoranBycworCisvLyBqdWVnb3MgOiAyMDE0LTAzLTIwIFVuaXJlZ2lzdHJ5LCBDb3JwLgoranVlZ29zCisKKy8vIGp1bmlwZXIgOiAyMDE1LTA3LTMwIEpVTklQRVIgTkVUV09SS1MsIElOQy4KK2p1bmlwZXIKKworLy8ga2F1ZmVuIDogMjAxMy0xMS0wNyBVbml0ZWQgVExEIEhvbGRjbyBMdGQuCitrYXVmZW4KKworLy8ga2RkaSA6IDIwMTQtMDktMTIgS0RESSBDT1JQT1JBVElPTgora2RkaQorCisvLyBrZXJyeWhvdGVscyA6IDIwMTUtMDQtMzAgS2VycnkgVHJhZGluZyBDby4gTGltaXRlZAora2Vycnlob3RlbHMKKworLy8ga2Vycnlsb2dpc3RpY3MgOiAyMDE1LTA0LTA5IEtlcnJ5IFRyYWRpbmcgQ28uIExpbWl0ZWQKK2tlcnJ5bG9naXN0aWNzCisKKy8vIGtlcnJ5cHJvcGVydGllcyA6IDIwMTUtMDQtMDkgS2VycnkgVHJhZGluZyBDby4gTGltaXRlZAora2Vycnlwcm9wZXJ0aWVzCisKKy8vIGtmaCA6IDIwMTQtMTItMDQgS3V3YWl0IEZpbmFuY2UgSG91c2UKK2tmaAorCisvLyBraWEgOiAyMDE1LTA3LTA5IEtJQSBNT1RPUlMgQ09SUE9SQVRJT04KK2tpYQorCisvLyBraW0gOiAyMDEzLTA5LTIzIEFmaWxpYXMgTGltaXRlZAora2ltCisKKy8vIGtpbmRlciA6IDIwMTQtMTEtMDcgRmVycmVybyBUcmFkaW5nIEx1eCBTLkEuCitraW5kZXIKKworLy8ga2luZGxlIDogMjAxNS0wNi0yNSBBbWF6b24gRVUgUy7DoCByLmwuCitraW5kbGUKKworLy8ga2l0Y2hlbiA6IDIwMTMtMDktMjAgSnVzdCBHb29kYnllLCBMTEMKK2tpdGNoZW4KKworLy8ga2l3aSA6IDIwMTMtMDktMjAgRE9UIEtJV0kgTElNSVRFRAora2l3aQorCisvLyBrb2VsbiA6IDIwMTQtMDEtMDkgTmV0Q29sb2duZSBHZXNlbGxzY2hhZnQgZsO8ciBUZWxla29tbXVuaWthdGlvbiBtYkgKK2tvZWxuCisKKy8vIGtvbWF0c3UgOiAyMDE1LTAxLTA4IEtvbWF0c3UgTHRkLgora29tYXRzdQorCisvLyBrb3NoZXIgOiAyMDE1LTA4LTIwIEtvc2hlciBNYXJrZXRpbmcgQXNzZXRzIExMQwora29zaGVyCisKKy8vIGtwbWcgOiAyMDE1LTA0LTIzIEtQTUcgSW50ZXJuYXRpb25hbCBDb29wZXJhdGl2ZSAoS1BNRyBJbnRlcm5hdGlvbmFsIEdlbm9zc2Vuc2NoYWZ0KQora3BtZworCisvLyBrcG4gOiAyMDE1LTAxLTA4IEtvbmlua2xpamtlIEtQTiBOLlYuCitrcG4KKworLy8ga3JkIDogMjAxMy0xMi0wNSBLUkcgRGVwYXJ0bWVudCBvZiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5CitrcmQKKworLy8ga3JlZCA6IDIwMTMtMTItMTkgS3JlZFRMRCBQdHkgTHRkCitrcmVkCisKKy8vIGt1b2tncm91cCA6IDIwMTUtMDQtMDkgS2VycnkgVHJhZGluZyBDby4gTGltaXRlZAora3Vva2dyb3VwCisKKy8vIGt5b3RvIDogMjAxNC0xMS0wNyBBY2FkZW1pYyBJbnN0aXR1dGlvbjogS3lvdG8gSnlvaG8gR2FrdWVuCitreW90bworCisvLyBsYWNhaXhhIDogMjAxNC0wMS0wOSBDQUlYQSBEJ0VTVEFMVklTIEkgUEVOU0lPTlMgREUgQkFSQ0VMT05BCitsYWNhaXhhCisKKy8vIGxhZGJyb2tlcyA6IDIwMTUtMDgtMDYgTEFEQlJPS0VTIElOVEVSTkFUSU9OQUwgUExDCitsYWRicm9rZXMKKworLy8gbGFtYm9yZ2hpbmkgOiAyMDE1LTA2LTA0IEF1dG9tb2JpbGkgTGFtYm9yZ2hpbmkgUy5wLkEuCitsYW1ib3JnaGluaQorCisvLyBsYW1lciA6IDIwMTUtMTAtMDEgVGhlIEVzdMOpZSBMYXVkZXIgQ29tcGFuaWVzIEluYy4KK2xhbWVyCisKKy8vIGxhbmNhc3RlciA6IDIwMTUtMDItMTIgTEFOQ0FTVEVSCitsYW5jYXN0ZXIKKworLy8gbGFuY2lhIDogMjAxNS0wNy0zMSBGaWF0IENocnlzbGVyIEF1dG9tb2JpbGVzIE4uVi4KK2xhbmNpYQorCisvLyBsYW5jb21lIDogMjAxNS0wNy0yMyBMJ09yw6lhbAorbGFuY29tZQorCisvLyBsYW5kIDogMjAxMy0wOS0xMCBQaW5lIE1vb24sIExMQworbGFuZAorCisvLyBsYW5kcm92ZXIgOiAyMDE0LTExLTEzIEphZ3VhciBMYW5kIFJvdmVyIEx0ZAorbGFuZHJvdmVyCisKKy8vIGxhbnhlc3MgOiAyMDE1LTA3LTMwIExBTlhFU1MgQ29ycG9yYXRpb24KK2xhbnhlc3MKKworLy8gbGFzYWxsZSA6IDIwMTUtMDQtMDIgSm9uZXMgTGFuZyBMYVNhbGxlIEluY29ycG9yYXRlZAorbGFzYWxsZQorCisvLyBsYXQgOiAyMDE0LTEwLTE2IEVDT00tTEFDIEZlZGVyYWNpw7JuIGRlIExhdGlub2Ftw6hyaWNhIHkgZWwgQ2FyaWJlIHBhcmEgSW50ZXJuZXQgeSBlbCBDb21lcmNpbyBFbGVjdHLDsm5pY28KK2xhdAorCisvLyBsYXRpbm8gOiAyMDE1LTA3LTMwIERpc2ggREJTIENvcnBvcmF0aW9uCitsYXRpbm8KKworLy8gbGF0cm9iZSA6IDIwMTQtMDYtMTYgTGEgVHJvYmUgVW5pdmVyc2l0eQorbGF0cm9iZQorCisvLyBsYXcgOiAyMDE1LTAxLTIyIE1pbmRzICsgTWFjaGluZXMgR3JvdXAgTGltaXRlZAorbGF3CisKKy8vIGxhd3llciA6IDIwMTQtMDMtMjAKK2xhd3llcgorCisvLyBsZHMgOiAyMDE0LTAzLTIwIElSSSBEb21haW4gTWFuYWdlbWVudCwgTExDICgiQXBwbGljYW50IikKK2xkcworCisvLyBsZWFzZSA6IDIwMTQtMDMtMDYgVmljdG9yIFRyYWlsLCBMTEMKK2xlYXNlCisKKy8vIGxlY2xlcmMgOiAyMDE0LTA4LTA3IEEuQy5ELiBMRUMgQXNzb2NpYXRpb24gZGVzIENlbnRyZXMgRGlzdHJpYnV0ZXVycyBFZG91YXJkIExlY2xlcmMKK2xlY2xlcmMKKworLy8gbGVmcmFrIDogMjAxNS0wNy0xNiBMZUZyYWsgT3JnYW5pemF0aW9uLCBJbmMuCitsZWZyYWsKKworLy8gbGVnYWwgOiAyMDE0LTEwLTE2IEJsdWUgRmFsbHMsIExMQworbGVnYWwKKworLy8gbGVnbyA6IDIwMTUtMDctMTYgTEVHTyBKdXJpcyBBL1MKK2xlZ28KKworLy8gbGV4dXMgOiAyMDE1LTA0LTIzIFRPWU9UQSBNT1RPUiBDT1JQT1JBVElPTgorbGV4dXMKKworLy8gbGdidCA6IDIwMTQtMDUtMDggQWZpbGlhcyBMaW1pdGVkCitsZ2J0CisKKy8vIGxpYWlzb24gOiAyMDE0LTEwLTAyIExpYWlzb24gVGVjaG5vbG9naWVzLCBJbmNvcnBvcmF0ZWQKK2xpYWlzb24KKworLy8gbGlkbCA6IDIwMTQtMDktMTggU2Nod2FyeiBEb21haW5zIHVuZCBTZXJ2aWNlcyBHbWJIICYgQ28uIEtHCitsaWRsCisKKy8vIGxpZmUgOiAyMDE0LTAyLTA2IFRyaXh5IE9ha3MsIExMQworbGlmZQorCisvLyBsaWZlaW5zdXJhbmNlIDogMjAxNS0wMS0xNSBBbWVyaWNhbiBDb3VuY2lsIG9mIExpZmUgSW5zdXJlcnMKK2xpZmVpbnN1cmFuY2UKKworLy8gbGlmZXN0eWxlIDogMjAxNC0xMi0xMSBMaWZlc3R5bGUgRG9tYWluIEhvbGRpbmdzLCBJbmMuCitsaWZlc3R5bGUKKworLy8gbGlnaHRpbmcgOiAyMDEzLTA4LTI3IEpvaG4gTWNDb29rLCBMTEMKK2xpZ2h0aW5nCisKKy8vIGxpa2UgOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK2xpa2UKKworLy8gbGlsbHkgOiAyMDE1LTA3LTMxIEVsaSBMaWxseSBhbmQgQ29tcGFueQorbGlsbHkKKworLy8gbGltaXRlZCA6IDIwMTQtMDMtMDYgQmlnIEZlc3QsIExMQworbGltaXRlZAorCisvLyBsaW1vIDogMjAxMy0xMC0xNyBIaWRkZW4gRnJvc3RiaXRlLCBMTEMKK2xpbW8KKworLy8gbGluY29sbiA6IDIwMTQtMTEtMTMgRm9yZCBNb3RvciBDb21wYW55CitsaW5jb2xuCisKKy8vIGxpbmRlIDogMjAxNC0xMi0wNCBMaW5kZSBBa3RpZW5nZXNlbGxzY2hhZnQKK2xpbmRlCisKKy8vIGxpbmsgOiAyMDEzLTExLTE0IFVuaXJlZ2lzdHJ5LCBDb3JwLgorbGluaworCisvLyBsaXBzeSA6IDIwMTUtMDYtMjUgTGlwc3kgTHRkCitsaXBzeQorCisvLyBsaXZlIDogMjAxNC0xMi0wNAorbGl2ZQorCisvLyBsaXZpbmcgOiAyMDE1LTA3LTMwIExpZmVzdHlsZSBEb21haW4gSG9sZGluZ3MsIEluYy4KK2xpdmluZworCisvLyBsaXhpbCA6IDIwMTUtMDMtMTkgTElYSUwgR3JvdXAgQ29ycG9yYXRpb24KK2xpeGlsCisKKy8vIGxvYW4gOiAyMDE0LTExLTIwIGRvdCBMb2FuIExpbWl0ZWQKK2xvYW4KKworLy8gbG9hbnMgOiAyMDE0LTAzLTIwIEp1bmUgV29vZHMsIExMQworbG9hbnMKKworLy8gbG9ja2VyIDogMjAxNS0wNi0wNCBEaXNoIERCUyBDb3Jwb3JhdGlvbgorbG9ja2VyCisKKy8vIGxvY3VzIDogMjAxNS0wNi0yNSBMb2N1cyBBbmFseXRpY3MgTExDCitsb2N1cworCisvLyBsb2Z0IDogMjAxNS0wNy0zMCBBbm5jbywgSW5jLgorbG9mdAorCisvLyBsb2wgOiAyMDE1LTAxLTMwIFVuaXJlZ2lzdHJ5LCBDb3JwLgorbG9sCisKKy8vIGxvbmRvbiA6IDIwMTMtMTEtMTQgRG90IExvbmRvbiBEb21haW5zIExpbWl0ZWQKK2xvbmRvbgorCisvLyBsb3R0ZSA6IDIwMTQtMTEtMDcgTG90dGUgSG9sZGluZ3MgQ28uLCBMdGQuCitsb3R0ZQorCisvLyBsb3R0byA6IDIwMTQtMDQtMTAgQWZpbGlhcyBMaW1pdGVkCitsb3R0bworCisvLyBsb3ZlIDogMjAxNC0xMi0yMiBNZXJjaGFudCBMYXcgR3JvdXAgTExQCitsb3ZlCisKKy8vIGxwbCA6IDIwMTUtMDctMzAgTFBMIEhvbGRpbmdzLCBJbmMuCitscGwKKworLy8gbHBsZmluYW5jaWFsIDogMjAxNS0wNy0zMCBMUEwgSG9sZGluZ3MsIEluYy4KK2xwbGZpbmFuY2lhbAorCisvLyBsdGQgOiAyMDE0LTA5LTI1IE92ZXIgQ29ybmVyLCBMTEMKK2x0ZAorCisvLyBsdGRhIDogMjAxNC0wNC0xNyBET01BSU4gUk9CT1QgU0VSVklDT1MgREUgSE9TUEVEQUdFTSBOQSBJTlRFUk5FVCBMVERBCitsdGRhCisKKy8vIGx1bmRiZWNrIDogMjAxNS0wOC0wNiBILiBMdW5kYmVjayBBL1MKK2x1bmRiZWNrCisKKy8vIGx1cGluIDogMjAxNC0xMS0wNyBMVVBJTiBMSU1JVEVECitsdXBpbgorCisvLyBsdXhlIDogMjAxNC0wMS0wOSBUb3AgTGV2ZWwgRG9tYWluIEhvbGRpbmdzIExpbWl0ZWQKK2x1eGUKKworLy8gbHV4dXJ5IDogMjAxMy0xMC0xNyBMdXh1cnkgUGFydG5lcnMsIExMQworbHV4dXJ5CisKKy8vIG1hY3lzIDogMjAxNS0wNy0zMSBNYWN5cywgSW5jLgorbWFjeXMKKworLy8gbWFkcmlkIDogMjAxNC0wNS0wMSBDb211bmlkYWQgZGUgTWFkcmlkCittYWRyaWQKKworLy8gbWFpZiA6IDIwMTQtMTAtMDIgTXV0dWVsbGUgQXNzdXJhbmNlIEluc3RpdHV0ZXVyIEZyYW5jZSAoTUFJRikKK21haWYKKworLy8gbWFpc29uIDogMjAxMy0xMi0wNSBWaWN0b3IgRnJvc3RiaXRlLCBMTEMKK21haXNvbgorCisvLyBtYWtldXAgOiAyMDE1LTAxLTE1IEwnT3LDqWFsCittYWtldXAKKworLy8gbWFuIDogMjAxNC0xMi0wNCBNQU4gU0UKK21hbgorCisvLyBtYW5hZ2VtZW50IDogMjAxMy0xMS0wNyBKb2huIEdvb2RieWUsIExMQworbWFuYWdlbWVudAorCisvLyBtYW5nbyA6IDIwMTMtMTAtMjQgUFVOVE8gRkEgUy5MLgorbWFuZ28KKworLy8gbWFwIDogMjAxNi0wNi0wOSBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorbWFwCisKKy8vIG1hcmtldCA6IDIwMTQtMDMtMDYKK21hcmtldAorCisvLyBtYXJrZXRpbmcgOiAyMDEzLTExLTA3IEZlcm4gUGFzcywgTExDCittYXJrZXRpbmcKKworLy8gbWFya2V0cyA6IDIwMTQtMTItMTEgSUcgR3JvdXAgSG9sZGluZ3MgUExDCittYXJrZXRzCisKKy8vIG1hcnJpb3R0IDogMjAxNC0xMC0wOSBNYXJyaW90dCBXb3JsZHdpZGUgQ29ycG9yYXRpb24KK21hcnJpb3R0CisKKy8vIG1hcnNoYWxscyA6IDIwMTUtMDctMTYgVGhlIFRKWCBDb21wYW5pZXMsIEluYy4KK21hcnNoYWxscworCisvLyBtYXNlcmF0aSA6IDIwMTUtMDctMzEgRmlhdCBDaHJ5c2xlciBBdXRvbW9iaWxlcyBOLlYuCittYXNlcmF0aQorCisvLyBtYXR0ZWwgOiAyMDE1LTA4LTA2IE1hdHRlbCBTaXRlcywgSW5jLgorbWF0dGVsCisKKy8vIG1iYSA6IDIwMTUtMDQtMDIgTG9uZSBIb2xsb3csIExMQworbWJhCisKKy8vIG1jZCA6IDIwMTUtMDctMzAgTWNEb25hbGTigJlzIENvcnBvcmF0aW9uCittY2QKKworLy8gbWNkb25hbGRzIDogMjAxNS0wNy0zMCBNY0RvbmFsZOKAmXMgQ29ycG9yYXRpb24KK21jZG9uYWxkcworCisvLyBtY2tpbnNleSA6IDIwMTUtMDctMzEgTWNLaW5zZXkgSG9sZGluZ3MsIEluYy4KK21ja2luc2V5CisKKy8vIG1lZCA6IDIwMTUtMDgtMDYgTWVkaXN0cnkgTExDCittZWQKKworLy8gbWVkaWEgOiAyMDE0LTAzLTA2IEdyYW5kIEdsZW4sIExMQworbWVkaWEKKworLy8gbWVldCA6IDIwMTQtMDEtMTYKK21lZXQKKworLy8gbWVsYm91cm5lIDogMjAxNC0wNS0yOSBUaGUgQ3Jvd24gaW4gcmlnaHQgb2YgdGhlIFN0YXRlIG9mIFZpY3RvcmlhLCByZXByZXNlbnRlZCBieSBpdHMgRGVwYXJ0bWVudCBvZiBTdGF0ZSBEZXZlbG9wbWVudCwgQnVzaW5lc3MgYW5kIElubm92YXRpb24KK21lbGJvdXJuZQorCisvLyBtZW1lIDogMjAxNC0wMS0zMCBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorbWVtZQorCisvLyBtZW1vcmlhbCA6IDIwMTQtMTAtMTYgRG9nIEJlYWNoLCBMTEMKK21lbW9yaWFsCisKKy8vIG1lbiA6IDIwMTUtMDItMjYgRXhjbHVzaXZlIFJlZ2lzdHJ5IExpbWl0ZWQKK21lbgorCisvLyBtZW51IDogMjAxMy0wOS0xMSBXZWRkaW5nIFRMRDIsIExMQworbWVudQorCisvLyBtZW8gOiAyMDE0LTExLTA3IFBUIENvbXVuaWNhY29lcyBTLkEuCittZW8KKworLy8gbWVyY2ttc2QgOiAyMDE2LTA3LTE0IE1TRCBSZWdpc3RyeSBIb2xkaW5ncywgSW5jLgorbWVyY2ttc2QKKworLy8gbWV0bGlmZSA6IDIwMTUtMDUtMDcgTWV0TGlmZSBTZXJ2aWNlcyBhbmQgU29sdXRpb25zLCBMTEMKK21ldGxpZmUKKworLy8gbWlhbWkgOiAyMDEzLTEyLTE5IFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAorbWlhbWkKKworLy8gbWljcm9zb2Z0IDogMjAxNC0xMi0xOCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KK21pY3Jvc29mdAorCisvLyBtaW5pIDogMjAxNC0wMS0wOSBCYXllcmlzY2hlIE1vdG9yZW4gV2Vya2UgQWt0aWVuZ2VzZWxsc2NoYWZ0CittaW5pCisKKy8vIG1pbnQgOiAyMDE1LTA3LTMwIEludHVpdCBBZG1pbmlzdHJhdGl2ZSBTZXJ2aWNlcywgSW5jLgorbWludAorCisvLyBtaXQgOiAyMDE1LTA3LTAyIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKK21pdAorCisvLyBtaXRzdWJpc2hpIDogMjAxNS0wNy0yMyBNaXRzdWJpc2hpIENvcnBvcmF0aW9uCittaXRzdWJpc2hpCisKKy8vIG1sYiA6IDIwMTUtMDUtMjEgTUxCIEFkdmFuY2VkIE1lZGlhIERILCBMTEMKK21sYgorCisvLyBtbHMgOiAyMDE1LTA0LTIzIFRoZSBDYW5hZGlhbiBSZWFsIEVzdGF0ZSBBc3NvY2lhdGlvbgorbWxzCisKKy8vIG1tYSA6IDIwMTQtMTEtMDcgTU1BIElBUkQKK21tYQorCisvLyBtb2JpbGUgOiAyMDE2LTA2LTAyIERpc2ggREJTIENvcnBvcmF0aW9uCittb2JpbGUKKworLy8gbW9iaWx5IDogMjAxNC0xMi0xOCBHcmVlblRlY2ggQ29uc3VsdGFuY3kgQ29tcGFueSBXLkwuTC4KK21vYmlseQorCisvLyBtb2RhIDogMjAxMy0xMS0wNyBVbml0ZWQgVExEIEhvbGRjbyBMdGQuCittb2RhCisKKy8vIG1vZSA6IDIwMTMtMTEtMTMgSW50ZXJsaW5rIENvLiwgTHRkLgorbW9lCisKKy8vIG1vaSA6IDIwMTQtMTItMTggQW1hem9uIEVVIFMuw6Agci5sLgorbW9pCisKKy8vIG1vbSA6IDIwMTUtMDQtMTYgVW5pcmVnaXN0cnksIENvcnAuCittb20KKworLy8gbW9uYXNoIDogMjAxMy0wOS0zMCBNb25hc2ggVW5pdmVyc2l0eQorbW9uYXNoCisKKy8vIG1vbmV5IDogMjAxNC0xMC0xNiBPdXRlciBNY0Nvb2ssIExMQworbW9uZXkKKworLy8gbW9uc3RlciA6IDIwMTUtMDktMTEgTW9uc3RlciBXb3JsZHdpZGUsIEluYy4KK21vbnN0ZXIKKworLy8gbW9udGJsYW5jIDogMjAxNC0wNi0yMyBSaWNoZW1vbnQgRE5TIEluYy4KK21vbnRibGFuYworCisvLyBtb3BhciA6IDIwMTUtMDctMzAgRkNBIFVTIExMQy4KK21vcGFyCisKKy8vIG1vcm1vbiA6IDIwMTMtMTItMDUgSVJJIERvbWFpbiBNYW5hZ2VtZW50LCBMTEMgKCJBcHBsaWNhbnQiKQorbW9ybW9uCisKKy8vIG1vcnRnYWdlIDogMjAxNC0wMy0yMAorbW9ydGdhZ2UKKworLy8gbW9zY293IDogMjAxMy0xMi0xOSBGb3VuZGF0aW9uIGZvciBBc3Npc3RhbmNlIGZvciBJbnRlcm5ldCBUZWNobm9sb2dpZXMgYW5kIEluZnJhc3RydWN0dXJlIERldmVsb3BtZW50IChGQUlUSUQpCittb3Njb3cKKworLy8gbW90byA6IDIwMTUtMDYtMDQKK21vdG8KKworLy8gbW90b3JjeWNsZXMgOiAyMDE0LTAxLTA5IERFUk1vdG9yY3ljbGVzLCBMTEMKK21vdG9yY3ljbGVzCisKKy8vIG1vdiA6IDIwMTQtMDEtMzAgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK21vdgorCisvLyBtb3ZpZSA6IDIwMTUtMDItMDUgTmV3IEZyb3N0Yml0ZSwgTExDCittb3ZpZQorCisvLyBtb3Zpc3RhciA6IDIwMTQtMTAtMTYgVGVsZWbDs25pY2EgUy5BLgorbW92aXN0YXIKKworLy8gbXNkIDogMjAxNS0wNy0yMyBNU0QgUmVnaXN0cnkgSG9sZGluZ3MsIEluYy4KK21zZAorCisvLyBtdG4gOiAyMDE0LTEyLTA0IE1UTiBEdWJhaSBMaW1pdGVkCittdG4KKworLy8gbXRwYyA6IDIwMTQtMTEtMjAgTWl0c3ViaXNoaSBUYW5hYmUgUGhhcm1hIENvcnBvcmF0aW9uCittdHBjCisKKy8vIG10ciA6IDIwMTUtMDMtMTIgTVRSIENvcnBvcmF0aW9uIExpbWl0ZWQKK210cgorCisvLyBtdXR1YWwgOiAyMDE1LTA0LTAyIE5vcnRod2VzdGVybiBNdXR1YWwgTVUgVExEIFJlZ2lzdHJ5LCBMTEMKK211dHVhbAorCisvLyBuYWIgOiAyMDE1LTA4LTIwIE5hdGlvbmFsIEF1c3RyYWxpYSBCYW5rIExpbWl0ZWQKK25hYgorCisvLyBuYWRleCA6IDIwMTQtMTItMTEgSUcgR3JvdXAgSG9sZGluZ3MgUExDCituYWRleAorCisvLyBuYWdveWEgOiAyMDEzLTEwLTI0IEdNTyBSZWdpc3RyeSwgSW5jLgorbmFnb3lhCisKKy8vIG5hdGlvbndpZGUgOiAyMDE1LTA3LTIzIE5hdGlvbndpZGUgTXV0dWFsIEluc3VyYW5jZSBDb21wYW55CituYXRpb253aWRlCisKKy8vIG5hdHVyYSA6IDIwMTUtMDMtMTIgTkFUVVJBIENPU03DiVRJQ09TIFMuQS4KK25hdHVyYQorCisvLyBuYXZ5IDogMjAxNC0wMy0wNiBVbml0ZWQgVExEIEhvbGRjbyBMdGQuCituYXZ5CisKKy8vIG5iYSA6IDIwMTUtMDctMzEgTkJBIFJFR0lTVFJZLCBMTEMKK25iYQorCisvLyBuZWMgOiAyMDE1LTAxLTA4IE5FQyBDb3Jwb3JhdGlvbgorbmVjCisKKy8vIG5ldGJhbmsgOiAyMDE0LTA2LTI2IENPTU1PTldFQUxUSCBCQU5LIE9GIEFVU1RSQUxJQQorbmV0YmFuaworCisvLyBuZXRmbGl4IDogMjAxNS0wNi0xOCBOZXRmbGl4LCBJbmMuCituZXRmbGl4CisKKy8vIG5ldHdvcmsgOiAyMDEzLTExLTE0IFRyaXh5IE1hbm9yLCBMTEMKK25ldHdvcmsKKworLy8gbmV1c3RhciA6IDIwMTMtMTItMDUgTmV1U3RhciwgSW5jLgorbmV1c3RhcgorCisvLyBuZXcgOiAyMDE0LTAxLTMwIENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCituZXcKKworLy8gbmV3aG9sbGFuZCA6IDIwMTUtMDktMDMgQ05IIEluZHVzdHJpYWwgTi5WLgorbmV3aG9sbGFuZAorCisvLyBuZXdzIDogMjAxNC0xMi0xOAorbmV3cworCisvLyBuZXh0IDogMjAxNS0wNi0xOCBOZXh0IHBsYworbmV4dAorCisvLyBuZXh0ZGlyZWN0IDogMjAxNS0wNi0xOCBOZXh0IHBsYworbmV4dGRpcmVjdAorCisvLyBuZXh1cyA6IDIwMTQtMDctMjQgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK25leHVzCisKKy8vIG5mbCA6IDIwMTUtMDctMjMgTkZMIFJlZyBPcHMgTExDCituZmwKKworLy8gbmdvIDogMjAxNC0wMy0wNiBQdWJsaWMgSW50ZXJlc3QgUmVnaXN0cnkKK25nbworCisvLyBuaGsgOiAyMDE0LTAyLTEzIEphcGFuIEJyb2FkY2FzdGluZyBDb3Jwb3JhdGlvbiAoTkhLKQorbmhrCisKKy8vIG5pY28gOiAyMDE0LTEyLTA0IERXQU5HTyBDby4sIEx0ZC4KK25pY28KKworLy8gbmlrZSA6IDIwMTUtMDctMjMgTklLRSwgSW5jLgorbmlrZQorCisvLyBuaWtvbiA6IDIwMTUtMDUtMjEgTklLT04gQ09SUE9SQVRJT04KK25pa29uCisKKy8vIG5pbmphIDogMjAxMy0xMS0wNyBVbml0ZWQgVExEIEhvbGRjbyBMdGQuCituaW5qYQorCisvLyBuaXNzYW4gOiAyMDE0LTAzLTI3IE5JU1NBTiBNT1RPUiBDTy4sIExURC4KK25pc3NhbgorCisvLyBuaXNzYXkgOiAyMDE1LTEwLTI5IE5pcHBvbiBMaWZlIEluc3VyYW5jZSBDb21wYW55CituaXNzYXkKKworLy8gbm9raWEgOiAyMDE1LTAxLTA4IE5va2lhIENvcnBvcmF0aW9uCitub2tpYQorCisvLyBub3J0aHdlc3Rlcm5tdXR1YWwgOiAyMDE1LTA2LTE4IE5vcnRod2VzdGVybiBNdXR1YWwgUmVnaXN0cnksIExMQworbm9ydGh3ZXN0ZXJubXV0dWFsCisKKy8vIG5vcnRvbiA6IDIwMTQtMTItMDQgU3ltYW50ZWMgQ29ycG9yYXRpb24KK25vcnRvbgorCisvLyBub3cgOiAyMDE1LTA2LTI1IEFtYXpvbiBFVSBTLsOgIHIubC4KK25vdworCisvLyBub3dydXogOiAyMDE0LTA5LTA0IEFzaWEgR3JlZW4gSVQgU3lzdGVtIEJpbGdpc2F5YXIgU2FuLiB2ZSBUaWMuIEx0ZC4gU3RpLgorbm93cnV6CisKKy8vIG5vd3R2IDogMjAxNS0wNS0xNCBTdGFyYnVja3MgKEhLKSBMaW1pdGVkCitub3d0dgorCisvLyBucmEgOiAyMDE0LTA1LTIyIE5SQSBIb2xkaW5ncyBDb21wYW55LCBJTkMuCitucmEKKworLy8gbnJ3IDogMjAxMy0xMS0yMSBNaW5kcyArIE1hY2hpbmVzIEdtYkgKK25ydworCisvLyBudHQgOiAyMDE0LTEwLTMxIE5JUFBPTiBURUxFR1JBUEggQU5EIFRFTEVQSE9ORSBDT1JQT1JBVElPTgorbnR0CisKKy8vIG55YyA6IDIwMTQtMDEtMjMgVGhlIENpdHkgb2YgTmV3IFlvcmsgYnkgYW5kIHRocm91Z2ggdGhlIE5ldyBZb3JrIENpdHkgRGVwYXJ0bWVudCBvZiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5ICYgVGVsZWNvbW11bmljYXRpb25zCitueWMKKworLy8gb2JpIDogMjAxNC0wOS0yNSBPQkkgR3JvdXAgSG9sZGluZyBTRSAmIENvLiBLR2FBCitvYmkKKworLy8gb2JzZXJ2ZXIgOiAyMDE1LTA0LTMwCitvYnNlcnZlcgorCisvLyBvZmYgOiAyMDE1LTA3LTIzIEpvaG5zb24gU2hhcmVob2xkaW5ncywgSW5jLgorb2ZmCisKKy8vIG9mZmljZSA6IDIwMTUtMDMtMTIgTWljcm9zb2Z0IENvcnBvcmF0aW9uCitvZmZpY2UKKworLy8gb2tpbmF3YSA6IDIwMTMtMTItMDUgQnVzaW5lc3NSYWxsaWFydCBJbmMuCitva2luYXdhCisKKy8vIG9sYXlhbiA6IDIwMTUtMDUtMTQgQ3Jlc2NlbnQgSG9sZGluZyBHbWJICitvbGF5YW4KKworLy8gb2xheWFuZ3JvdXAgOiAyMDE1LTA1LTE0IENyZXNjZW50IEhvbGRpbmcgR21iSAorb2xheWFuZ3JvdXAKKworLy8gb2xkbmF2eSA6IDIwMTUtMDctMzEgVGhlIEdhcCwgSW5jLgorb2xkbmF2eQorCisvLyBvbGxvIDogMjAxNS0wNi0wNCBEaXNoIERCUyBDb3Jwb3JhdGlvbgorb2xsbworCisvLyBvbWVnYSA6IDIwMTUtMDEtMDggVGhlIFN3YXRjaCBHcm91cCBMdGQKK29tZWdhCisKKy8vIG9uZSA6IDIwMTQtMTEtMDcgT25lLmNvbSBBL1MKK29uZQorCisvLyBvbmcgOiAyMDE0LTAzLTA2IFB1YmxpYyBJbnRlcmVzdCBSZWdpc3RyeQorb25nCisKKy8vIG9ubCA6IDIwMTMtMDktMTYgSS1SZWdpc3RyeSBMdGQuCitvbmwKKworLy8gb25saW5lIDogMjAxNS0wMS0xNSBEb3RPbmxpbmUgSW5jLgorb25saW5lCisKKy8vIG9ueW91cnNpZGUgOiAyMDE1LTA3LTIzIE5hdGlvbndpZGUgTXV0dWFsIEluc3VyYW5jZSBDb21wYW55CitvbnlvdXJzaWRlCisKKy8vIG9vbyA6IDIwMTQtMDEtMDkgSU5GSUJFQU0gSU5DT1JQT1JBVElPTiBMSU1JVEVECitvb28KKworLy8gb3BlbiA6IDIwMTUtMDctMzEgQW1lcmljYW4gRXhwcmVzcyBUcmF2ZWwgUmVsYXRlZCBTZXJ2aWNlcyBDb21wYW55LCBJbmMuCitvcGVuCisKKy8vIG9yYWNsZSA6IDIwMTQtMDYtMTkgT3JhY2xlIENvcnBvcmF0aW9uCitvcmFjbGUKKworLy8gb3JhbmdlIDogMjAxNS0wMy0xMiBPcmFuZ2UgQnJhbmQgU2VydmljZXMgTGltaXRlZAorb3JhbmdlCisKKy8vIG9yZ2FuaWMgOiAyMDE0LTAzLTI3IEFmaWxpYXMgTGltaXRlZAorb3JnYW5pYworCisvLyBvcmlnaW5zIDogMjAxNS0xMC0wMSBUaGUgRXN0w6llIExhdWRlciBDb21wYW5pZXMgSW5jLgorb3JpZ2lucworCisvLyBvc2FrYSA6IDIwMTQtMDktMDQgSW50ZXJsaW5rIENvLiwgTHRkLgorb3Nha2EKKworLy8gb3RzdWthIDogMjAxMy0xMC0xMSBPdHN1a2EgSG9sZGluZ3MgQ28uLCBMdGQuCitvdHN1a2EKKworLy8gb3R0IDogMjAxNS0wNi0wNCBEaXNoIERCUyBDb3Jwb3JhdGlvbgorb3R0CisKKy8vIG92aCA6IDIwMTQtMDEtMTYgT1ZIIFNBUworb3ZoCisKKy8vIHBhZ2UgOiAyMDE0LTEyLTA0IENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCitwYWdlCisKKy8vIHBhbXBlcmVkY2hlZiA6IDIwMTUtMDItMDUgVGhlIFBhbXBlcmVkIENoZWYsIEx0ZC4KK3BhbXBlcmVkY2hlZgorCisvLyBwYW5hc29uaWMgOiAyMDE1LTA3LTMwIFBhbmFzb25pYyBDb3Jwb3JhdGlvbgorcGFuYXNvbmljCisKKy8vIHBhbmVyYWkgOiAyMDE0LTExLTA3IFJpY2hlbW9udCBETlMgSW5jLgorcGFuZXJhaQorCisvLyBwYXJpcyA6IDIwMTQtMDEtMzAgQ2l0eSBvZiBQYXJpcworcGFyaXMKKworLy8gcGFycyA6IDIwMTQtMDktMDQgQXNpYSBHcmVlbiBJVCBTeXN0ZW0gQmlsZ2lzYXlhciBTYW4uIHZlIFRpYy4gTHRkLiBTdGkuCitwYXJzCisKKy8vIHBhcnRuZXJzIDogMjAxMy0xMi0wNSBNYWdpYyBHbGVuLCBMTEMKK3BhcnRuZXJzCisKKy8vIHBhcnRzIDogMjAxMy0xMi0wNSBTZWEgR29vZGJ5ZSwgTExDCitwYXJ0cworCisvLyBwYXJ0eSA6IDIwMTQtMDktMTEgQmx1ZSBTa3kgUmVnaXN0cnkgTGltaXRlZAorcGFydHkKKworLy8gcGFzc2FnZW5zIDogMjAxNS0wMy0wNSBUcmF2ZWwgUmVzZXJ2YXRpb25zIFNSTAorcGFzc2FnZW5zCisKKy8vIHBheSA6IDIwMTUtMDgtMjcgQW1hem9uIEVVIFMuw6Agci5sLgorcGF5CisKKy8vIHBjY3cgOiAyMDE1LTA1LTE0IFBDQ1cgRW50ZXJwcmlzZXMgTGltaXRlZAorcGNjdworCisvLyBwZXQgOiAyMDE1LTA1LTA3IEFmaWxpYXMgcGxjCitwZXQKKworLy8gcGZpemVyIDogMjAxNS0wOS0xMSBQZml6ZXIgSW5jLgorcGZpemVyCisKKy8vIHBoYXJtYWN5IDogMjAxNC0wNi0xOSBOYXRpb25hbCBBc3NvY2lhdGlvbiBvZiBCb2FyZHMgb2YgUGhhcm1hY3kKK3BoYXJtYWN5CisKKy8vIHBoZCA6IDIwMTYtMDctMjggQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK3BoZAorCisvLyBwaGlsaXBzIDogMjAxNC0xMS0wNyBLb25pbmtsaWprZSBQaGlsaXBzIE4uVi4KK3BoaWxpcHMKKworLy8gcGhvbmUgOiAyMDE2LTA2LTAyIERpc2ggREJTIENvcnBvcmF0aW9uCitwaG9uZQorCisvLyBwaG90byA6IDIwMTMtMTEtMTQgVW5pcmVnaXN0cnksIENvcnAuCitwaG90bworCisvLyBwaG90b2dyYXBoeSA6IDIwMTMtMDktMjAgU3VnYXIgR2xlbiwgTExDCitwaG90b2dyYXBoeQorCisvLyBwaG90b3MgOiAyMDEzLTEwLTE3IFNlYSBDb3JuZXIsIExMQworcGhvdG9zCisKKy8vIHBoeXNpbyA6IDIwMTQtMDUtMDEgUGh5c0JpeiBQdHkgTHRkCitwaHlzaW8KKworLy8gcGlhZ2V0IDogMjAxNC0xMC0xNiBSaWNoZW1vbnQgRE5TIEluYy4KK3BpYWdldAorCisvLyBwaWNzIDogMjAxMy0xMS0xNCBVbmlyZWdpc3RyeSwgQ29ycC4KK3BpY3MKKworLy8gcGljdGV0IDogMjAxNC0wNi0yNiBQaWN0ZXQgRXVyb3BlIFMuQS4KK3BpY3RldAorCisvLyBwaWN0dXJlcyA6IDIwMTQtMDMtMDYgRm9nZ3kgU2t5LCBMTEMKK3BpY3R1cmVzCisKKy8vIHBpZCA6IDIwMTUtMDEtMDggVG9wIExldmVsIFNwZWN0cnVtLCBJbmMuCitwaWQKKworLy8gcGluIDogMjAxNC0xMi0xOCBBbWF6b24gRVUgUy7DoCByLmwuCitwaW4KKworLy8gcGluZyA6IDIwMTUtMDYtMTEgUGluZyBSZWdpc3RyeSBQcm92aWRlciwgSW5jLgorcGluZworCisvLyBwaW5rIDogMjAxMy0xMC0wMSBBZmlsaWFzIExpbWl0ZWQKK3BpbmsKKworLy8gcGlvbmVlciA6IDIwMTUtMDctMTYgUGlvbmVlciBDb3Jwb3JhdGlvbgorcGlvbmVlcgorCisvLyBwaXp6YSA6IDIwMTQtMDYtMjYgRm9nZ3kgTW9vbiwgTExDCitwaXp6YQorCisvLyBwbGFjZSA6IDIwMTQtMDQtMjQgU25vdyBHYWxsZXksIExMQworcGxhY2UKKworLy8gcGxheSA6IDIwMTUtMDMtMDUgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK3BsYXkKKworLy8gcGxheXN0YXRpb24gOiAyMDE1LTA3LTAyIFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCitwbGF5c3RhdGlvbgorCisvLyBwbHVtYmluZyA6IDIwMTMtMDktMTAgU3ByaW5nIFRpZ2VycywgTExDCitwbHVtYmluZworCisvLyBwbHVzIDogMjAxNS0wMi0wNSBTdWdhciBNaWxsLCBMTEMKK3BsdXMKKworLy8gcG5jIDogMjAxNS0wNy0wMiBQTkMgRG9tYWluIENvLiwgTExDCitwbmMKKworLy8gcG9obCA6IDIwMTQtMDYtMjMgRGV1dHNjaGUgVmVybcO2Z2Vuc2JlcmF0dW5nIEFrdGllbmdlc2VsbHNjaGFmdCBEVkFHCitwb2hsCisKKy8vIHBva2VyIDogMjAxNC0wNy0wMyBBZmlsaWFzIERvbWFpbnMgTm8uIDUgTGltaXRlZAorcG9rZXIKKworLy8gcG9saXRpZSA6IDIwMTUtMDgtMjAgUG9saXRpZSBOZWRlcmxhbmQKK3BvbGl0aWUKKworLy8gcG9ybiA6IDIwMTQtMTAtMTYgSUNNIFJlZ2lzdHJ5IFBOIExMQworcG9ybgorCisvLyBwcmFtZXJpY2EgOiAyMDE1LTA3LTMwIFBydWRlbnRpYWwgRmluYW5jaWFsLCBJbmMuCitwcmFtZXJpY2EKKworLy8gcHJheGkgOiAyMDEzLTEyLTA1IFByYXhpIFMucC5BLgorcHJheGkKKworLy8gcHJlc3MgOiAyMDE0LTA0LTAzIERvdFByZXNzIEluYy4KK3ByZXNzCisKKy8vIHByaW1lIDogMjAxNS0wNi0yNSBBbWF6b24gRVUgUy7DoCByLmwuCitwcmltZQorCisvLyBwcm9kIDogMjAxNC0wMS0yMyBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorcHJvZAorCisvLyBwcm9kdWN0aW9ucyA6IDIwMTMtMTItMDUgTWFnaWMgQmlyY2gsIExMQworcHJvZHVjdGlvbnMKKworLy8gcHJvZiA6IDIwMTQtMDctMjQgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK3Byb2YKKworLy8gcHJvZ3Jlc3NpdmUgOiAyMDE1LTA3LTIzIFByb2dyZXNzaXZlIENhc3VhbHR5IEluc3VyYW5jZSBDb21wYW55Citwcm9ncmVzc2l2ZQorCisvLyBwcm9tbyA6IDIwMTQtMTItMTgKK3Byb21vCisKKy8vIHByb3BlcnRpZXMgOiAyMDEzLTEyLTA1IEJpZyBQYXNzLCBMTEMKK3Byb3BlcnRpZXMKKworLy8gcHJvcGVydHkgOiAyMDE0LTA1LTIyIFVuaXJlZ2lzdHJ5LCBDb3JwLgorcHJvcGVydHkKKworLy8gcHJvdGVjdGlvbiA6IDIwMTUtMDQtMjMKK3Byb3RlY3Rpb24KKworLy8gcHJ1IDogMjAxNS0wNy0zMCBQcnVkZW50aWFsIEZpbmFuY2lhbCwgSW5jLgorcHJ1CisKKy8vIHBydWRlbnRpYWwgOiAyMDE1LTA3LTMwIFBydWRlbnRpYWwgRmluYW5jaWFsLCBJbmMuCitwcnVkZW50aWFsCisKKy8vIHB1YiA6IDIwMTMtMTItMTIgVW5pdGVkIFRMRCBIb2xkY28gTHRkLgorcHViCisKKy8vIHB3YyA6IDIwMTUtMTAtMjkgUHJpY2V3YXRlcmhvdXNlQ29vcGVycyBMTFAKK3B3YworCisvLyBxcG9uIDogMjAxMy0xMS0xNCBkb3RDT09MLCBJbmMuCitxcG9uCisKKy8vIHF1ZWJlYyA6IDIwMTMtMTItMTkgUG9pbnRRdcOpYmVjIEluYworcXVlYmVjCisKKy8vIHF1ZXN0IDogMjAxNS0wMy0yNiBRdWVzdCBJT04gTGltaXRlZAorcXVlc3QKKworLy8gcXZjIDogMjAxNS0wNy0zMCBRVkMsIEluYy4KK3F2YworCisvLyByYWNpbmcgOiAyMDE0LTEyLTA0IFByZW1pZXIgUmVnaXN0cnkgTGltaXRlZAorcmFjaW5nCisKKy8vIHJhZGlvIDogMjAxNi0wNy0yMSBFdXJvcGVhbiBCcm9hZGNhc3RpbmcgVW5pb24gKEVCVSkKK3JhZGlvCisKKy8vIHJhaWQgOiAyMDE1LTA3LTIzIEpvaG5zb24gU2hhcmVob2xkaW5ncywgSW5jLgorcmFpZAorCisvLyByZWFkIDogMjAxNC0xMi0xOCBBbWF6b24gRVUgUy7DoCByLmwuCityZWFkCisKKy8vIHJlYWxlc3RhdGUgOiAyMDE1LTA5LTExIGRvdFJlYWxFc3RhdGUgTExDCityZWFsZXN0YXRlCisKKy8vIHJlYWx0b3IgOiAyMDE0LTA1LTI5IFJlYWwgRXN0YXRlIERvbWFpbnMgTExDCityZWFsdG9yCisKKy8vIHJlYWx0eSA6IDIwMTUtMDMtMTkgRmVnaXN0cnksIExMQworcmVhbHR5CisKKy8vIHJlY2lwZXMgOiAyMDEzLTEwLTE3IEdyYW5kIElzbGFuZCwgTExDCityZWNpcGVzCisKKy8vIHJlZCA6IDIwMTMtMTEtMDcgQWZpbGlhcyBMaW1pdGVkCityZWQKKworLy8gcmVkc3RvbmUgOiAyMDE0LTEwLTMxIFJlZHN0b25lIEhhdXRlIENvdXR1cmUgQ28uLCBMdGQuCityZWRzdG9uZQorCisvLyByZWR1bWJyZWxsYSA6IDIwMTUtMDMtMjYgVHJhdmVsZXJzIFRMRCwgTExDCityZWR1bWJyZWxsYQorCisvLyByZWhhYiA6IDIwMTQtMDMtMDYgVW5pdGVkIFRMRCBIb2xkY28gTHRkLgorcmVoYWIKKworLy8gcmVpc2UgOiAyMDE0LTAzLTEzCityZWlzZQorCisvLyByZWlzZW4gOiAyMDE0LTAzLTA2IE5ldyBDeXByZXNzLCBMTEMKK3JlaXNlbgorCisvLyByZWl0IDogMjAxNC0wOS0wNCBOYXRpb25hbCBBc3NvY2lhdGlvbiBvZiBSZWFsIEVzdGF0ZSBJbnZlc3RtZW50IFRydXN0cywgSW5jLgorcmVpdAorCisvLyByZWxpYW5jZSA6IDIwMTUtMDQtMDIgUmVsaWFuY2UgSW5kdXN0cmllcyBMaW1pdGVkCityZWxpYW5jZQorCisvLyByZW4gOiAyMDEzLTEyLTEyIEJlaWppbmcgUWlhbnhpYW5nIFdhbmdqaW5nIFRlY2hub2xvZ3kgRGV2ZWxvcG1lbnQgQ28uLCBMdGQuCityZW4KKworLy8gcmVudCA6IDIwMTQtMTItMDQgREVSUmVudCwgTExDCityZW50CisKKy8vIHJlbnRhbHMgOiAyMDEzLTEyLTA1IEJpZyBIb2xsb3csTExDCityZW50YWxzCisKKy8vIHJlcGFpciA6IDIwMTMtMTEtMDcgTG9uZSBTdW5zZXQsIExMQworcmVwYWlyCisKKy8vIHJlcG9ydCA6IDIwMTMtMTItMDUgQmlua3kgR2xlbiwgTExDCityZXBvcnQKKworLy8gcmVwdWJsaWNhbiA6IDIwMTQtMDMtMjAgVW5pdGVkIFRMRCBIb2xkY28gTHRkLgorcmVwdWJsaWNhbgorCisvLyByZXN0IDogMjAxMy0xMi0xOSBQdW50byAyMDEyIFNvY2llZGFkIEFub25pbWEgUHJvbW90b3JhIGRlIEludmVyc2lvbiBkZSBDYXBpdGFsIFZhcmlhYmxlCityZXN0CisKKy8vIHJlc3RhdXJhbnQgOiAyMDE0LTA3LTAzIFNub3cgQXZlbnVlLCBMTEMKK3Jlc3RhdXJhbnQKKworLy8gcmV2aWV3IDogMjAxNC0xMS0yMCBkb3QgUmV2aWV3IExpbWl0ZWQKK3JldmlldworCisvLyByZXZpZXdzIDogMjAxMy0wOS0xMworcmV2aWV3cworCisvLyByZXhyb3RoIDogMjAxNS0wNi0xOCBSb2JlcnQgQm9zY2ggR01CSAorcmV4cm90aAorCisvLyByaWNoIDogMjAxMy0xMS0yMSBJLVJlZ2lzdHJ5IEx0ZC4KK3JpY2gKKworLy8gcmljaGFyZGxpIDogMjAxNS0wNS0xNCBQYWNpZmljIENlbnR1cnkgQXNzZXQgTWFuYWdlbWVudCAoSEspIExpbWl0ZWQKK3JpY2hhcmRsaQorCisvLyByaWNvaCA6IDIwMTQtMTEtMjAgUmljb2ggQ29tcGFueSwgTHRkLgorcmljb2gKKworLy8gcmlnaHRhdGhvbWUgOiAyMDE1LTA3LTIzIEpvaG5zb24gU2hhcmVob2xkaW5ncywgSW5jLgorcmlnaHRhdGhvbWUKKworLy8gcmlsIDogMjAxNS0wNC0wMiBSZWxpYW5jZSBJbmR1c3RyaWVzIExpbWl0ZWQKK3JpbAorCisvLyByaW8gOiAyMDE0LTAyLTI3IEVtcHJlc2EgTXVuaWNpcGFsIGRlIEluZm9ybcOhdGljYSBTQSAtIElQTEFOUklPCityaW8KKworLy8gcmlwIDogMjAxNC0wNy0xMCBVbml0ZWQgVExEIEhvbGRjbyBMdGQuCityaXAKKworLy8gcm1pdCA6IDIwMTUtMTEtMTkgUm95YWwgTWVsYm91cm5lIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CitybWl0CisKKy8vIHJvY2hlciA6IDIwMTQtMTItMTggRmVycmVybyBUcmFkaW5nIEx1eCBTLkEuCityb2NoZXIKKworLy8gcm9ja3MgOiAyMDEzLTExLTE0Cityb2NrcworCisvLyByb2RlbyA6IDIwMTMtMTItMTkgVG9wIExldmVsIERvbWFpbiBIb2xkaW5ncyBMaW1pdGVkCityb2RlbworCisvLyByb2dlcnMgOiAyMDE1LTA4LTA2IFJvZ2VycyBDb21tdW5pY2F0aW9ucyBQYXJ0bmVyc2hpcAorcm9nZXJzCisKKy8vIHJvb20gOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK3Jvb20KKworLy8gcnN2cCA6IDIwMTQtMDUtMDggQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK3JzdnAKKworLy8gcnVnYnkgOiAyMDE2LTEyLTE1IFdvcmxkIFJ1Z2J5IFN0cmF0ZWdpYyBEZXZlbG9wbWVudHMgTGltaXRlZAorcnVnYnkKKworLy8gcnVociA6IDIwMTMtMTAtMDIgcmVnaW9kb3QgR21iSCAmIENvLiBLRworcnVocgorCisvLyBydW4gOiAyMDE1LTAzLTE5IFNub3cgUGFyaywgTExDCitydW4KKworLy8gcndlIDogMjAxNS0wNC0wMiBSV0UgQUcKK3J3ZQorCisvLyByeXVreXUgOiAyMDE0LTAxLTA5IEJ1c2luZXNzUmFsbGlhcnQgSW5jLgorcnl1a3l1CisKKy8vIHNhYXJsYW5kIDogMjAxMy0xMi0xMiBkb3RTYWFybGFuZCBHbWJICitzYWFybGFuZAorCisvLyBzYWZlIDogMjAxNC0xMi0xOCBBbWF6b24gRVUgUy7DoCByLmwuCitzYWZlCisKKy8vIHNhZmV0eSA6IDIwMTUtMDEtMDggU2FmZXR5IFJlZ2lzdHJ5IFNlcnZpY2VzLCBMTEMuCitzYWZldHkKKworLy8gc2FrdXJhIDogMjAxNC0xMi0xOCBTQUtVUkEgSW50ZXJuZXQgSW5jLgorc2FrdXJhCisKKy8vIHNhbGUgOiAyMDE0LTEwLTE2CitzYWxlCisKKy8vIHNhbG9uIDogMjAxNC0xMi0xMSBPdXRlciBPcmNoYXJkLCBMTEMKK3NhbG9uCisKKy8vIHNhbXNjbHViIDogMjAxNS0wNy0zMSBXYWwtTWFydCBTdG9yZXMsIEluYy4KK3NhbXNjbHViCisKKy8vIHNhbXN1bmcgOiAyMDE0LTA0LTAzIFNBTVNVTkcgU0RTIENPLiwgTFRECitzYW1zdW5nCisKKy8vIHNhbmR2aWsgOiAyMDE0LTExLTEzIFNhbmR2aWsgQUIKK3NhbmR2aWsKKworLy8gc2FuZHZpa2Nvcm9tYW50IDogMjAxNC0xMS0wNyBTYW5kdmlrIEFCCitzYW5kdmlrY29yb21hbnQKKworLy8gc2Fub2ZpIDogMjAxNC0xMC0wOSBTYW5vZmkKK3Nhbm9maQorCisvLyBzYXAgOiAyMDE0LTAzLTI3IFNBUCBBRworc2FwCisKKy8vIHNhcG8gOiAyMDE0LTExLTA3IFBUIENvbXVuaWNhY29lcyBTLkEuCitzYXBvCisKKy8vIHNhcmwgOiAyMDE0LTA3LTAzIERlbHRhIE9yY2hhcmQsIExMQworc2FybAorCisvLyBzYXMgOiAyMDE1LTA0LTAyIFJlc2VhcmNoIElQIExMQworc2FzCisKKy8vIHNhdmUgOiAyMDE1LTA2LTI1IEFtYXpvbiBFVSBTLsOgIHIubC4KK3NhdmUKKworLy8gc2F4byA6IDIwMTQtMTAtMzEgU2F4byBCYW5rIEEvUworc2F4bworCisvLyBzYmkgOiAyMDE1LTAzLTEyIFNUQVRFIEJBTksgT0YgSU5ESUEKK3NiaQorCisvLyBzYnMgOiAyMDE0LTExLTA3IFNQRUNJQUwgQlJPQURDQVNUSU5HIFNFUlZJQ0UgQ09SUE9SQVRJT04KK3NicworCisvLyBzY2EgOiAyMDE0LTAzLTEzIFNWRU5TS0EgQ0VMTFVMT1NBIEFLVElFQk9MQUdFVCBTQ0EgKHB1YmwpCitzY2EKKworLy8gc2NiIDogMjAxNC0wMi0yMCBUaGUgU2lhbSBDb21tZXJjaWFsIEJhbmsgUHVibGljIENvbXBhbnkgTGltaXRlZCAoIlNDQiIpCitzY2IKKworLy8gc2NoYWVmZmxlciA6IDIwMTUtMDgtMDYgU2NoYWVmZmxlciBUZWNobm9sb2dpZXMgQUcgJiBDby4gS0cKK3NjaGFlZmZsZXIKKworLy8gc2NobWlkdCA6IDIwMTQtMDQtMDMgU0FMTSBTLkEuUy4KK3NjaG1pZHQKKworLy8gc2Nob2xhcnNoaXBzIDogMjAxNC0wNC0yNCBTY2hvbGFyc2hpcHMuY29tLCBMTEMKK3NjaG9sYXJzaGlwcworCisvLyBzY2hvb2wgOiAyMDE0LTEyLTE4IExpdHRsZSBHYWxsZXksIExMQworc2Nob29sCisKKy8vIHNjaHVsZSA6IDIwMTQtMDMtMDYgT3V0ZXIgTW9vbiwgTExDCitzY2h1bGUKKworLy8gc2Nod2FyeiA6IDIwMTQtMDktMTggU2Nod2FyeiBEb21haW5zIHVuZCBTZXJ2aWNlcyBHbWJIICYgQ28uIEtHCitzY2h3YXJ6CisKKy8vIHNjaWVuY2UgOiAyMDE0LTA5LTExIGRvdCBTY2llbmNlIExpbWl0ZWQKK3NjaWVuY2UKKworLy8gc2Nqb2huc29uIDogMjAxNS0wNy0yMyBKb2huc29uIFNoYXJlaG9sZGluZ3MsIEluYy4KK3Njam9obnNvbgorCisvLyBzY29yIDogMjAxNC0xMC0zMSBTQ09SIFNFCitzY29yCisKKy8vIHNjb3QgOiAyMDE0LTAxLTIzIERvdCBTY290IFJlZ2lzdHJ5IExpbWl0ZWQKK3Njb3QKKworLy8gc2VhcmNoIDogMjAxNi0wNi0wOSBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgorc2VhcmNoCisKKy8vIHNlYXQgOiAyMDE0LTA1LTIyIFNFQVQsIFMuQS4gKFNvY2llZGFkIFVuaXBlcnNvbmFsKQorc2VhdAorCisvLyBzZWN1cmUgOiAyMDE1LTA4LTI3IEFtYXpvbiBFVSBTLsOgIHIubC4KK3NlY3VyZQorCisvLyBzZWN1cml0eSA6IDIwMTUtMDUtMTQKK3NlY3VyaXR5CisKKy8vIHNlZWsgOiAyMDE0LTEyLTA0IFNlZWsgTGltaXRlZAorc2VlaworCisvLyBzZWxlY3QgOiAyMDE1LTEwLTA4IGlTZWxlY3QgTHRkCitzZWxlY3QKKworLy8gc2VuZXIgOiAyMDE0LTEwLTI0IFNlbmVyIEluZ2VuaWVyw61hIHkgU2lzdGVtYXMsIFMuQS4KK3NlbmVyCisKKy8vIHNlcnZpY2VzIDogMjAxNC0wMi0yNyBGb3ggQ2FzdGxlLCBMTEMKK3NlcnZpY2VzCisKKy8vIHNlcyA6IDIwMTUtMDctMjMgU0VTCitzZXMKKworLy8gc2V2ZW4gOiAyMDE1LTA4LTA2IFNldmVuIFdlc3QgTWVkaWEgTHRkCitzZXZlbgorCisvLyBzZXcgOiAyMDE0LTA3LTE3IFNFVy1FVVJPRFJJVkUgR21iSCAmIENvIEtHCitzZXcKKworLy8gc2V4IDogMjAxNC0xMS0xMyBJQ00gUmVnaXN0cnkgU1ggTExDCitzZXgKKworLy8gc2V4eSA6IDIwMTMtMDktMTEgVW5pcmVnaXN0cnksIENvcnAuCitzZXh5CisKKy8vIHNmciA6IDIwMTUtMDgtMTMgU29jaWV0ZSBGcmFuY2Fpc2UgZHUgUmFkaW90ZWxlcGhvbmUgLSBTRlIKK3NmcgorCisvLyBzaGFuZ3JpbGEgOiAyMDE1LTA5LTAzIFNoYW5ncmnigJBMYSBJbnRlcm5hdGlvbmFsIEhvdGVsIE1hbmFnZW1lbnQgTGltaXRlZAorc2hhbmdyaWxhCisKKy8vIHNoYXJwIDogMjAxNC0wNS0wMSBTaGFycCBDb3Jwb3JhdGlvbgorc2hhcnAKKworLy8gc2hhdyA6IDIwMTUtMDQtMjMgU2hhdyBDYWJsZXN5c3RlbXMgRy5QLgorc2hhdworCisvLyBzaGVsbCA6IDIwMTUtMDctMzAgU2hlbGwgSW5mb3JtYXRpb24gVGVjaG5vbG9neSBJbnRlcm5hdGlvbmFsIEluYworc2hlbGwKKworLy8gc2hpYSA6IDIwMTQtMDktMDQgQXNpYSBHcmVlbiBJVCBTeXN0ZW0gQmlsZ2lzYXlhciBTYW4uIHZlIFRpYy4gTHRkLiBTdGkuCitzaGlhCisKKy8vIHNoaWtzaGEgOiAyMDEzLTExLTE0IEFmaWxpYXMgTGltaXRlZAorc2hpa3NoYQorCisvLyBzaG9lcyA6IDIwMTMtMTAtMDIgQmlua3kgR2FsbGV5LCBMTEMKK3Nob2VzCisKKy8vIHNob3AgOiAyMDE2LTA0LTA4IEdNTyBSZWdpc3RyeSwgSW5jLgorc2hvcAorCisvLyBzaG9wcGluZyA6IDIwMTYtMDMtMzEKK3Nob3BwaW5nCisKKy8vIHNob3VqaSA6IDIwMTUtMDEtMDggUUlIT08gMzYwIFRFQ0hOT0xPR1kgQ08uIExURC4KK3Nob3VqaQorCisvLyBzaG93IDogMjAxNS0wMy0wNSBTbm93IEJlYWNoLCBMTEMKK3Nob3cKKworLy8gc2hvd3RpbWUgOiAyMDE1LTA4LTA2IENCUyBEb21haW5zIEluYy4KK3Nob3d0aW1lCisKKy8vIHNocmlyYW0gOiAyMDE0LTAxLTIzIFNocmlyYW0gQ2FwaXRhbCBMdGQuCitzaHJpcmFtCisKKy8vIHNpbGsgOiAyMDE1LTA2LTI1IEFtYXpvbiBFVSBTLsOgIHIubC4KK3NpbGsKKworLy8gc2luYSA6IDIwMTUtMDMtMTIgU2luYSBDb3Jwb3JhdGlvbgorc2luYQorCisvLyBzaW5nbGVzIDogMjAxMy0wOC0yNyBGZXJuIE1hZGlzb24sIExMQworc2luZ2xlcworCisvLyBzaXRlIDogMjAxNS0wMS0xNSBEb3RTaXRlIEluYy4KK3NpdGUKKworLy8gc2tpIDogMjAxNS0wNC0wOSBTVEFSVElORyBET1QgTElNSVRFRAorc2tpCisKKy8vIHNraW4gOiAyMDE1LTAxLTE1IEwnT3LDqWFsCitza2luCisKKy8vIHNreSA6IDIwMTQtMDYtMTkgU2t5IElQIEludGVybmF0aW9uYWwgTHRkLCBhIGNvbXBhbnkgaW5jb3Jwb3JhdGVkIGluIEVuZ2xhbmQgYW5kIFdhbGVzLCBvcGVyYXRpbmcgdmlhIGl0cyByZWdpc3RlcmVkIFN3aXNzIGJyYW5jaAorc2t5CisKKy8vIHNreXBlIDogMjAxNC0xMi0xOCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KK3NreXBlCisKKy8vIHNsaW5nIDogMjAxNS0wNy0zMCBIdWdoZXMgU2F0ZWxsaXRlIFN5c3RlbXMgQ29ycG9yYXRpb24KK3NsaW5nCisKKy8vIHNtYXJ0IDogMjAxNS0wNy0wOSBTbWFydCBDb21tdW5pY2F0aW9ucywgSW5jLiAoU01BUlQpCitzbWFydAorCisvLyBzbWlsZSA6IDIwMTQtMTItMTggQW1hem9uIEVVIFMuw6Agci5sLgorc21pbGUKKworLy8gc25jZiA6IDIwMTUtMDItMTkgU29jacOpdMOpIE5hdGlvbmFsZSBkZXMgQ2hlbWlucyBkZSBmZXIgRnJhbmNhaXMgUyBOIEMgRgorc25jZgorCisvLyBzb2NjZXIgOiAyMDE1LTAzLTI2IEZvZ2d5IFNoYWRvdywgTExDCitzb2NjZXIKKworLy8gc29jaWFsIDogMjAxMy0xMS0wNyBVbml0ZWQgVExEIEhvbGRjbyBMdGQuCitzb2NpYWwKKworLy8gc29mdGJhbmsgOiAyMDE1LTA3LTAyIFNvZnRCYW5rIENvcnAuCitzb2Z0YmFuaworCisvLyBzb2Z0d2FyZSA6IDIwMTQtMDMtMjAKK3NvZnR3YXJlCisKKy8vIHNvaHUgOiAyMDEzLTEyLTE5IFNvaHUuY29tIExpbWl0ZWQKK3NvaHUKKworLy8gc29sYXIgOiAyMDEzLTExLTA3IFJ1YnkgVG93biwgTExDCitzb2xhcgorCisvLyBzb2x1dGlvbnMgOiAyMDEzLTExLTA3IFNpbHZlciBDb3ZlciwgTExDCitzb2x1dGlvbnMKKworLy8gc29uZyA6IDIwMTUtMDItMjYgQW1hem9uIEVVIFMuw6Agci5sLgorc29uZworCisvLyBzb255IDogMjAxNS0wMS0wOCBTb255IENvcnBvcmF0aW9uCitzb255CisKKy8vIHNveSA6IDIwMTQtMDEtMjMgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK3NveQorCisvLyBzcGFjZSA6IDIwMTQtMDQtMDMgRG90U3BhY2UgSW5jLgorc3BhY2UKKworLy8gc3BpZWdlbCA6IDIwMTQtMDItMDUgU1BJRUdFTC1WZXJsYWcgUnVkb2xmIEF1Z3N0ZWluIEdtYkggJiBDby4gS0cKK3NwaWVnZWwKKworLy8gc3BvdCA6IDIwMTUtMDItMjYgQW1hem9uIEVVIFMuw6Agci5sLgorc3BvdAorCisvLyBzcHJlYWRiZXR0aW5nIDogMjAxNC0xMi0xMSBJRyBHcm91cCBIb2xkaW5ncyBQTEMKK3NwcmVhZGJldHRpbmcKKworLy8gc3JsIDogMjAxNS0wNS0wNyBteVNSTCBHbWJICitzcmwKKworLy8gc3J0IDogMjAxNS0wNy0zMCBGQ0EgVVMgTExDLgorc3J0CisKKy8vIHN0YWRhIDogMjAxNC0xMS0xMyBTVEFEQSBBcnpuZWltaXR0ZWwgQUcKK3N0YWRhCisKKy8vIHN0YXBsZXMgOiAyMDE1LTA3LTMwIFN0YXBsZXMsIEluYy4KK3N0YXBsZXMKKworLy8gc3RhciA6IDIwMTUtMDEtMDggU3RhciBJbmRpYSBQcml2YXRlIExpbWl0ZWQKK3N0YXIKKworLy8gc3Rhcmh1YiA6IDIwMTUtMDItMDUgU3Rhckh1YiBMdGQKK3N0YXJodWIKKworLy8gc3RhdGViYW5rIDogMjAxNS0wMy0xMiBTVEFURSBCQU5LIE9GIElORElBCitzdGF0ZWJhbmsKKworLy8gc3RhdGVmYXJtIDogMjAxNS0wNy0zMCBTdGF0ZSBGYXJtIE11dHVhbCBBdXRvbW9iaWxlIEluc3VyYW5jZSBDb21wYW55CitzdGF0ZWZhcm0KKworLy8gc3RhdG9pbCA6IDIwMTQtMTItMDQgU3RhdG9pbCBBU0EKK3N0YXRvaWwKKworLy8gc3RjIDogMjAxNC0xMC0wOSBTYXVkaSBUZWxlY29tIENvbXBhbnkKK3N0YworCisvLyBzdGNncm91cCA6IDIwMTQtMTAtMDkgU2F1ZGkgVGVsZWNvbSBDb21wYW55CitzdGNncm91cAorCisvLyBzdG9ja2hvbG0gOiAyMDE0LTEyLTE4IFN0b2NraG9sbXMga29tbXVuCitzdG9ja2hvbG0KKworLy8gc3RvcmFnZSA6IDIwMTQtMTItMjIgU2VsZiBTdG9yYWdlIENvbXBhbnkgTExDCitzdG9yYWdlCisKKy8vIHN0b3JlIDogMjAxNS0wNC0wOSBEb3RTdG9yZSBJbmMuCitzdG9yZQorCisvLyBzdHJlYW0gOiAyMDE2LTAxLTA4IGRvdCBTdHJlYW0gTGltaXRlZAorc3RyZWFtCisKKy8vIHN0dWRpbyA6IDIwMTUtMDItMTEKK3N0dWRpbworCisvLyBzdHVkeSA6IDIwMTQtMTItMTEgT1BFTiBVTklWRVJTSVRJRVMgQVVTVFJBTElBIFBUWSBMVEQKK3N0dWR5CisKKy8vIHN0eWxlIDogMjAxNC0xMi0wNCBCaW5reSBNb29uLCBMTEMKK3N0eWxlCisKKy8vIHN1Y2tzIDogMjAxNC0xMi0yMiBWb3ggUG9wdWxpIFJlZ2lzdHJ5IEluYy4KK3N1Y2tzCisKKy8vIHN1cHBsaWVzIDogMjAxMy0xMi0xOSBBdG9taWMgRmllbGRzLCBMTEMKK3N1cHBsaWVzCisKKy8vIHN1cHBseSA6IDIwMTMtMTItMTkgSGFsZiBGYWxscywgTExDCitzdXBwbHkKKworLy8gc3VwcG9ydCA6IDIwMTMtMTAtMjQgR3JhbmQgT3JjaGFyZCwgTExDCitzdXBwb3J0CisKKy8vIHN1cmYgOiAyMDE0LTAxLTA5IFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAorc3VyZgorCisvLyBzdXJnZXJ5IDogMjAxNC0wMy0yMCBUaW4gQXZlbnVlLCBMTEMKK3N1cmdlcnkKKworLy8gc3V6dWtpIDogMjAxNC0wMi0yMCBTVVpVS0kgTU9UT1IgQ09SUE9SQVRJT04KK3N1enVraQorCisvLyBzd2F0Y2ggOiAyMDE1LTAxLTA4IFRoZSBTd2F0Y2ggR3JvdXAgTHRkCitzd2F0Y2gKKworLy8gc3dpZnRjb3ZlciA6IDIwMTUtMDctMjMgU3dpZnRjb3ZlciBJbnN1cmFuY2UgU2VydmljZXMgTGltaXRlZAorc3dpZnRjb3ZlcgorCisvLyBzd2lzcyA6IDIwMTQtMTAtMTYgU3dpc3MgQ29uZmVkZXJhdGlvbgorc3dpc3MKKworLy8gc3lkbmV5IDogMjAxNC0wOS0xOCBTdGF0ZSBvZiBOZXcgU291dGggV2FsZXMsIERlcGFydG1lbnQgb2YgUHJlbWllciBhbmQgQ2FiaW5ldAorc3lkbmV5CisKKy8vIHN5bWFudGVjIDogMjAxNC0xMi0wNCBTeW1hbnRlYyBDb3Jwb3JhdGlvbgorc3ltYW50ZWMKKworLy8gc3lzdGVtcyA6IDIwMTMtMTEtMDcgRGFzaCBDeXByZXNzLCBMTEMKK3N5c3RlbXMKKworLy8gdGFiIDogMjAxNC0xMi0wNCBUYWJjb3JwIEhvbGRpbmdzIExpbWl0ZWQKK3RhYgorCisvLyB0YWlwZWkgOiAyMDE0LTA3LTEwIFRhaXBlaSBDaXR5IEdvdmVybm1lbnQKK3RhaXBlaQorCisvLyB0YWxrIDogMjAxNS0wNC0wOSBBbWF6b24gRVUgUy7DoCByLmwuCit0YWxrCisKKy8vIHRhb2JhbyA6IDIwMTUtMDEtMTUgQWxpYmFiYSBHcm91cCBIb2xkaW5nIExpbWl0ZWQKK3Rhb2JhbworCisvLyB0YXJnZXQgOiAyMDE1LTA3LTMxIFRhcmdldCBEb21haW4gSG9sZGluZ3MsIExMQwordGFyZ2V0CisKKy8vIHRhdGFtb3RvcnMgOiAyMDE1LTAzLTEyIFRhdGEgTW90b3JzIEx0ZAordGF0YW1vdG9ycworCisvLyB0YXRhciA6IDIwMTQtMDQtMjQgTGltaXRlZCBMaWFiaWxpdHkgQ29tcGFueSAiQ29vcmRpbmF0aW9uIENlbnRlciBvZiBSZWdpb25hbCBEb21haW4gb2YgVGF0YXJzdGFuIFJlcHVibGljIgordGF0YXIKKworLy8gdGF0dG9vIDogMjAxMy0wOC0zMCBVbmlyZWdpc3RyeSwgQ29ycC4KK3RhdHRvbworCisvLyB0YXggOiAyMDE0LTAzLTIwIFN0b3JtIE9yY2hhcmQsIExMQwordGF4CisKKy8vIHRheGkgOiAyMDE1LTAzLTE5IFBpbmUgRmFsbHMsIExMQwordGF4aQorCisvLyB0Y2kgOiAyMDE0LTA5LTEyIEFzaWEgR3JlZW4gSVQgU3lzdGVtIEJpbGdpc2F5YXIgU2FuLiB2ZSBUaWMuIEx0ZC4gU3RpLgordGNpCisKKy8vIHRkayA6IDIwMTUtMDYtMTEgVERLIENvcnBvcmF0aW9uCit0ZGsKKworLy8gdGVhbSA6IDIwMTUtMDMtMDUgQXRvbWljIExha2UsIExMQwordGVhbQorCisvLyB0ZWNoIDogMjAxNS0wMS0zMCBEb3QgVGVjaCBMTEMKK3RlY2gKKworLy8gdGVjaG5vbG9neSA6IDIwMTMtMDktMTMgQXVidXJuIEZhbGxzCit0ZWNobm9sb2d5CisKKy8vIHRlbGVjaXR5IDogMjAxNS0wMi0xOSBUZWxlY2l0eUdyb3VwIEludGVybmF0aW9uYWwgTGltaXRlZAordGVsZWNpdHkKKworLy8gdGVsZWZvbmljYSA6IDIwMTQtMTAtMTYgVGVsZWbDs25pY2EgUy5BLgordGVsZWZvbmljYQorCisvLyB0ZW1hc2VrIDogMjAxNC0wOC0wNyBUZW1hc2VrIEhvbGRpbmdzIChQcml2YXRlKSBMaW1pdGVkCit0ZW1hc2VrCisKKy8vIHRlbm5pcyA6IDIwMTQtMTItMDQgQ290dG9uIEJsb29tLCBMTEMKK3Rlbm5pcworCisvLyB0ZXZhIDogMjAxNS0wNy0wMiBUZXZhIFBoYXJtYWNldXRpY2FsIEluZHVzdHJpZXMgTGltaXRlZAordGV2YQorCisvLyB0aGQgOiAyMDE1LTA0LTAyIEhvbWVyIFRMQywgSW5jLgordGhkCisKKy8vIHRoZWF0ZXIgOiAyMDE1LTAzLTE5IEJsdWUgVGlnZXJzLCBMTEMKK3RoZWF0ZXIKKworLy8gdGhlYXRyZSA6IDIwMTUtMDUtMDcKK3RoZWF0cmUKKworLy8gdGlhYSA6IDIwMTUtMDctMjMgVGVhY2hlcnMgSW5zdXJhbmNlIGFuZCBBbm51aXR5IEFzc29jaWF0aW9uIG9mIEFtZXJpY2EKK3RpYWEKKworLy8gdGlja2V0cyA6IDIwMTUtMDItMDUgQWNjZW50IE1lZGlhIExpbWl0ZWQKK3RpY2tldHMKKworLy8gdGllbmRhIDogMjAxMy0xMS0xNCBWaWN0b3IgTWFub3IsIExMQwordGllbmRhCisKKy8vIHRpZmZhbnkgOiAyMDE1LTAxLTMwIFRpZmZhbnkgYW5kIENvbXBhbnkKK3RpZmZhbnkKKworLy8gdGlwcyA6IDIwMTMtMDktMjAgQ29ybiBXaWxsb3csIExMQwordGlwcworCisvLyB0aXJlcyA6IDIwMTQtMTEtMDcgRG9nIEVkZ2UsIExMQwordGlyZXMKKworLy8gdGlyb2wgOiAyMDE0LTA0LTI0IHB1bmt0IFRpcm9sIEdtYkgKK3Rpcm9sCisKKy8vIHRqbWF4eCA6IDIwMTUtMDctMTYgVGhlIFRKWCBDb21wYW5pZXMsIEluYy4KK3RqbWF4eAorCisvLyB0anggOiAyMDE1LTA3LTE2IFRoZSBUSlggQ29tcGFuaWVzLCBJbmMuCit0angKKworLy8gdGttYXh4IDogMjAxNS0wNy0xNiBUaGUgVEpYIENvbXBhbmllcywgSW5jLgordGttYXh4CisKKy8vIHRtYWxsIDogMjAxNS0wMS0xNSBBbGliYWJhIEdyb3VwIEhvbGRpbmcgTGltaXRlZAordG1hbGwKKworLy8gdG9kYXkgOiAyMDEzLTA5LTIwIFBlYXJsIFdvb2RzLCBMTEMKK3RvZGF5CisKKy8vIHRva3lvIDogMjAxMy0xMS0xMyBHTU8gUmVnaXN0cnksIEluYy4KK3Rva3lvCisKKy8vIHRvb2xzIDogMjAxMy0xMS0yMSBQaW9uZWVyIE5vcnRoLCBMTEMKK3Rvb2xzCisKKy8vIHRvcCA6IDIwMTQtMDMtMjAgSmlhbmdzdSBCYW5nbmluZyBTY2llbmNlICYgVGVjaG5vbG9neSBDby4sTHRkLgordG9wCisKKy8vIHRvcmF5IDogMjAxNC0xMi0xOCBUb3JheSBJbmR1c3RyaWVzLCBJbmMuCit0b3JheQorCisvLyB0b3NoaWJhIDogMjAxNC0wNC0xMCBUT1NISUJBIENvcnBvcmF0aW9uCit0b3NoaWJhCisKKy8vIHRvdGFsIDogMjAxNS0wOC0wNiBUb3RhbCBTQQordG90YWwKKworLy8gdG91cnMgOiAyMDE1LTAxLTIyIFN1Z2FyIFN0YXRpb24sIExMQwordG91cnMKKworLy8gdG93biA6IDIwMTQtMDMtMDYgS29rbyBNb29uLCBMTEMKK3Rvd24KKworLy8gdG95b3RhIDogMjAxNS0wNC0yMyBUT1lPVEEgTU9UT1IgQ09SUE9SQVRJT04KK3RveW90YQorCisvLyB0b3lzIDogMjAxNC0wMy0wNiBQaW9uZWVyIE9yY2hhcmQsIExMQwordG95cworCisvLyB0cmFkZSA6IDIwMTQtMDEtMjMgRWxpdGUgUmVnaXN0cnkgTGltaXRlZAordHJhZGUKKworLy8gdHJhZGluZyA6IDIwMTQtMTItMTEgSUcgR3JvdXAgSG9sZGluZ3MgUExDCit0cmFkaW5nCisKKy8vIHRyYWluaW5nIDogMjAxMy0xMS0wNyBXaWxkIFdpbGxvdywgTExDCit0cmFpbmluZworCisvLyB0cmF2ZWxjaGFubmVsIDogMjAxNS0wNy0wMiBMaWZlc3R5bGUgRG9tYWluIEhvbGRpbmdzLCBJbmMuCit0cmF2ZWxjaGFubmVsCisKKy8vIHRyYXZlbGVycyA6IDIwMTUtMDMtMjYgVHJhdmVsZXJzIFRMRCwgTExDCit0cmF2ZWxlcnMKKworLy8gdHJhdmVsZXJzaW5zdXJhbmNlIDogMjAxNS0wMy0yNiBUcmF2ZWxlcnMgVExELCBMTEMKK3RyYXZlbGVyc2luc3VyYW5jZQorCisvLyB0cnVzdCA6IDIwMTQtMTAtMTYKK3RydXN0CisKKy8vIHRydiA6IDIwMTUtMDMtMjYgVHJhdmVsZXJzIFRMRCwgTExDCit0cnYKKworLy8gdHViZSA6IDIwMTUtMDYtMTEgTGF0aW4gQW1lcmljYW4gVGVsZWNvbSBMTEMKK3R1YmUKKworLy8gdHVpIDogMjAxNC0wNy0wMyBUVUkgQUcKK3R1aQorCisvLyB0dW5lcyA6IDIwMTUtMDItMjYgQW1hem9uIEVVIFMuw6Agci5sLgordHVuZXMKKworLy8gdHVzaHUgOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK3R1c2h1CisKKy8vIHR2cyA6IDIwMTUtMDItMTkgVCBWIFNVTkRSQU0gSVlFTkdBUiAgJiBTT05TIExJTUlURUQKK3R2cworCisvLyB1YmFuayA6IDIwMTUtMDgtMjAgTmF0aW9uYWwgQXVzdHJhbGlhIEJhbmsgTGltaXRlZAordWJhbmsKKworLy8gdWJzIDogMjAxNC0xMi0xMSBVQlMgQUcKK3VicworCisvLyB1Y29ubmVjdCA6IDIwMTUtMDctMzAgRkNBIFVTIExMQy4KK3Vjb25uZWN0CisKKy8vIHVuaWNvbSA6IDIwMTUtMTAtMTUgQ2hpbmEgVW5pdGVkIE5ldHdvcmsgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24gTGltaXRlZAordW5pY29tCisKKy8vIHVuaXZlcnNpdHkgOiAyMDE0LTAzLTA2IExpdHRsZSBTdGF0aW9uLCBMTEMKK3VuaXZlcnNpdHkKKworLy8gdW5vIDogMjAxMy0wOS0xMSBEb3QgTGF0aW4gTExDCit1bm8KKworLy8gdW9sIDogMjAxNC0wNS0wMSBVQk4gSU5URVJORVQgTFREQS4KK3VvbAorCisvLyB1cHMgOiAyMDE1LTA2LTI1IFVQUyBNYXJrZXQgRHJpdmVyLCBJbmMuCit1cHMKKworLy8gdmFjYXRpb25zIDogMjAxMy0xMi0wNSBBdG9taWMgVGlnZXJzLCBMTEMKK3ZhY2F0aW9ucworCisvLyB2YW5hIDogMjAxNC0xMi0xMSBMaWZlc3R5bGUgRG9tYWluIEhvbGRpbmdzLCBJbmMuCit2YW5hCisKKy8vIHZhbmd1YXJkIDogMjAxNS0wOS0wMyBUaGUgVmFuZ3VhcmQgR3JvdXAsIEluYy4KK3Zhbmd1YXJkCisKKy8vIHZlZ2FzIDogMjAxNC0wMS0xNiBEb3QgVmVnYXMsIEluYy4KK3ZlZ2FzCisKKy8vIHZlbnR1cmVzIDogMjAxMy0wOC0yNyBCaW5reSBMYWtlLCBMTEMKK3ZlbnR1cmVzCisKKy8vIHZlcmlzaWduIDogMjAxNS0wOC0xMyBWZXJpU2lnbiwgSW5jLgordmVyaXNpZ24KKworLy8gdmVyc2ljaGVydW5nIDogMjAxNC0wMy0yMAordmVyc2ljaGVydW5nCisKKy8vIHZldCA6IDIwMTQtMDMtMDYKK3ZldAorCisvLyB2aWFqZXMgOiAyMDEzLTEwLTE3IEJsYWNrIE1hZGlzb24sIExMQwordmlhamVzCisKKy8vIHZpZGVvIDogMjAxNC0xMC0xNgordmlkZW8KKworLy8gdmlnIDogMjAxNS0wNS0xNCBWSUVOTkEgSU5TVVJBTkNFIEdST1VQIEFHIFdpZW5lciBWZXJzaWNoZXJ1bmcgR3J1cHBlCit2aWcKKworLy8gdmlraW5nIDogMjAxNS0wNC0wMiBWaWtpbmcgUml2ZXIgQ3J1aXNlcyAoQmVybXVkYSkgTHRkLgordmlraW5nCisKKy8vIHZpbGxhcyA6IDIwMTMtMTItMDUgTmV3IFNreSwgTExDCit2aWxsYXMKKworLy8gdmluIDogMjAxNS0wNi0xOCBIb2xseSBTaGFkb3csIExMQwordmluCisKKy8vIHZpcCA6IDIwMTUtMDEtMjIgTWluZHMgKyBNYWNoaW5lcyBHcm91cCBMaW1pdGVkCit2aXAKKworLy8gdmlyZ2luIDogMjAxNC0wOS0yNSBWaXJnaW4gRW50ZXJwcmlzZXMgTGltaXRlZAordmlyZ2luCisKKy8vIHZpc2EgOiAyMDE1LTA3LTMwIFZpc2EgV29ybGR3aWRlIFB0ZS4gTGltaXRlZAordmlzYQorCisvLyB2aXNpb24gOiAyMDEzLTEyLTA1IEtva28gU3RhdGlvbiwgTExDCit2aXNpb24KKworLy8gdmlzdGEgOiAyMDE0LTA5LTE4IFZpc3RhcHJpbnQgTGltaXRlZAordmlzdGEKKworLy8gdmlzdGFwcmludCA6IDIwMTQtMDktMTggVmlzdGFwcmludCBMaW1pdGVkCit2aXN0YXByaW50CisKKy8vIHZpdmEgOiAyMDE0LTExLTA3IFNhdWRpIFRlbGVjb20gQ29tcGFueQordml2YQorCisvLyB2aXZvIDogMjAxNS0wNy0zMSBUZWxlZm9uaWNhIEJyYXNpbCBTLkEuCit2aXZvCisKKy8vIHZsYWFuZGVyZW4gOiAyMDE0LTAyLTA2IEROUy5iZSB2encKK3ZsYWFuZGVyZW4KKworLy8gdm9ka2EgOiAyMDEzLTEyLTE5IFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAordm9ka2EKKworLy8gdm9sa3N3YWdlbiA6IDIwMTUtMDUtMTQgVm9sa3N3YWdlbiBHcm91cCBvZiBBbWVyaWNhIEluYy4KK3ZvbGtzd2FnZW4KKworLy8gdm9sdm8gOiAyMDE1LTExLTEyIFZvbHZvIEhvbGRpbmcgU3ZlcmlnZSBBa3RpZWJvbGFnCit2b2x2bworCisvLyB2b3RlIDogMjAxMy0xMS0yMSBNb25vbGl0aCBSZWdpc3RyeSBMTEMKK3ZvdGUKKworLy8gdm90aW5nIDogMjAxMy0xMS0xMyBWYWx1ZXRhaW5tZW50IENvcnAuCit2b3RpbmcKKworLy8gdm90byA6IDIwMTMtMTEtMjEgTW9ub2xpdGggUmVnaXN0cnkgTExDCit2b3RvCisKKy8vIHZveWFnZSA6IDIwMTMtMDgtMjcgUnVieSBIb3VzZSwgTExDCit2b3lhZ2UKKworLy8gdnVlbG9zIDogMjAxNS0wMy0wNSBUcmF2ZWwgUmVzZXJ2YXRpb25zIFNSTAordnVlbG9zCisKKy8vIHdhbGVzIDogMjAxNC0wNS0wOCBOb21pbmV0IFVLCit3YWxlcworCisvLyB3YWxtYXJ0IDogMjAxNS0wNy0zMSBXYWwtTWFydCBTdG9yZXMsIEluYy4KK3dhbG1hcnQKKworLy8gd2FsdGVyIDogMjAxNC0xMS0xMyBTYW5kdmlrIEFCCit3YWx0ZXIKKworLy8gd2FuZyA6IDIwMTMtMTAtMjQgWm9kaWFjIExlbyBMaW1pdGVkCit3YW5nCisKKy8vIHdhbmdnb3UgOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK3dhbmdnb3UKKworLy8gd2FybWFuIDogMjAxNS0wNi0xOCBXZWlyIEdyb3VwIElQIExpbWl0ZWQKK3dhcm1hbgorCisvLyB3YXRjaCA6IDIwMTMtMTEtMTQgU2FuZCBTaGFkb3csIExMQword2F0Y2gKKworLy8gd2F0Y2hlcyA6IDIwMTQtMTItMjIgUmljaGVtb250IEROUyBJbmMuCit3YXRjaGVzCisKKy8vIHdlYXRoZXIgOiAyMDE1LTAxLTA4IFRoZSBXZWF0aGVyIENoYW5uZWwsIExMQword2VhdGhlcgorCisvLyB3ZWF0aGVyY2hhbm5lbCA6IDIwMTUtMDMtMTIgVGhlIFdlYXRoZXIgQ2hhbm5lbCwgTExDCit3ZWF0aGVyY2hhbm5lbAorCisvLyB3ZWJjYW0gOiAyMDE0LTAxLTIzIGRvdCBXZWJjYW0gTGltaXRlZAord2ViY2FtCisKKy8vIHdlYmVyIDogMjAxNS0wNi0wNCBTYWludC1Hb2JhaW4gV2ViZXIgU0EKK3dlYmVyCisKKy8vIHdlYnNpdGUgOiAyMDE0LTA0LTAzIERvdFdlYnNpdGUgSW5jLgord2Vic2l0ZQorCisvLyB3ZWQgOiAyMDEzLTEwLTAxIEF0Z3JvbiwgSW5jLgord2VkCisKKy8vIHdlZGRpbmcgOiAyMDE0LTA0LTI0IFRvcCBMZXZlbCBEb21haW4gSG9sZGluZ3MgTGltaXRlZAord2VkZGluZworCisvLyB3ZWlibyA6IDIwMTUtMDMtMDUgU2luYSBDb3Jwb3JhdGlvbgord2VpYm8KKworLy8gd2VpciA6IDIwMTUtMDEtMjkgV2VpciBHcm91cCBJUCBMaW1pdGVkCit3ZWlyCisKKy8vIHdob3N3aG8gOiAyMDE0LTAyLTIwIFdobydzIFdobyBSZWdpc3RyeQord2hvc3dobworCisvLyB3aWVuIDogMjAxMy0xMC0yOCBwdW5rdC53aWVuIEdtYkgKK3dpZW4KKworLy8gd2lraSA6IDIwMTMtMTEtMDcgVG9wIExldmVsIERlc2lnbiwgTExDCit3aWtpCisKKy8vIHdpbGxpYW1oaWxsIDogMjAxNC0wMy0xMyBXaWxsaWFtIEhpbGwgT3JnYW5pemF0aW9uIExpbWl0ZWQKK3dpbGxpYW1oaWxsCisKKy8vIHdpbiA6IDIwMTQtMTEtMjAgRmlyc3QgUmVnaXN0cnkgTGltaXRlZAord2luCisKKy8vIHdpbmRvd3MgOiAyMDE0LTEyLTE4IE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgord2luZG93cworCisvLyB3aW5lIDogMjAxNS0wNi0xOCBKdW5lIFN0YXRpb24sIExMQword2luZQorCisvLyB3aW5uZXJzIDogMjAxNS0wNy0xNiBUaGUgVEpYIENvbXBhbmllcywgSW5jLgord2lubmVycworCisvLyB3bWUgOiAyMDE0LTAyLTEzIFdpbGxpYW0gTW9ycmlzIEVuZGVhdm9yIEVudGVydGFpbm1lbnQsIExMQword21lCisKKy8vIHdvbHRlcnNrbHV3ZXIgOiAyMDE1LTA4LTA2IFdvbHRlcnMgS2x1d2VyIE4uVi4KK3dvbHRlcnNrbHV3ZXIKKworLy8gd29vZHNpZGUgOiAyMDE1LTA3LTA5IFdvb2RzaWRlIFBldHJvbGV1bSBMaW1pdGVkCit3b29kc2lkZQorCisvLyB3b3JrIDogMjAxMy0xMi0xOSBUb3AgTGV2ZWwgRG9tYWluIEhvbGRpbmdzIExpbWl0ZWQKK3dvcmsKKworLy8gd29ya3MgOiAyMDEzLTExLTE0IExpdHRsZSBEeW5hbWl0ZSwgTExDCit3b3JrcworCisvLyB3b3JsZCA6IDIwMTQtMDYtMTIgQml0dGVyIEZpZWxkcywgTExDCit3b3JsZAorCisvLyB3b3cgOiAyMDE1LTEwLTA4IEFtYXpvbiBFVSBTLsOgIHIubC4KK3dvdworCisvLyB3dGMgOiAyMDEzLTEyLTE5IFdvcmxkIFRyYWRlIENlbnRlcnMgQXNzb2NpYXRpb24sIEluYy4KK3d0YworCisvLyB3dGYgOiAyMDE0LTAzLTA2IEhpZGRlbiBXYXksIExMQword3RmCisKKy8vIHhib3ggOiAyMDE0LTEyLTE4IE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgoreGJveAorCisvLyB4ZXJveCA6IDIwMTQtMTAtMjQgWGVyb3ggRE5IQyBMTEMKK3hlcm94CisKKy8vIHhmaW5pdHkgOiAyMDE1LTA3LTA5IENvbWNhc3QgSVAgSG9sZGluZ3MgSSwgTExDCit4ZmluaXR5CisKKy8vIHhpaHVhbiA6IDIwMTUtMDEtMDggUUlIT08gMzYwIFRFQ0hOT0xPR1kgQ08uIExURC4KK3hpaHVhbgorCisvLyB4aW4gOiAyMDE0LTEyLTExIEVsZWdhbnQgTGVhZGVyIExpbWl0ZWQKK3hpbgorCisvLyB4bi0tMTFiNGMzZCA6IDIwMTUtMDEtMTUgVmVyaVNpZ24gU2FybAor4KSV4KWJ4KSuCisKKy8vIHhuLS0xY2syZTFiIDogMjAxNS0wMi0yNiBBbWF6b24gRVUgUy7DoCByLmwuCivjgrvjg7zjg6sKKworLy8geG4tLTFxcXcyM2EgOiAyMDE0LTAxLTA5IEd1YW5nemhvdSBZVSBXZWkgSW5mb3JtYXRpb24gVGVjaG5vbG9neSBDby4sIEx0ZC4KK+S9m+WxsQorCisvLyB4bi0tMzBycjd5IDogMjAxNC0wNi0xMiBFeGNlbGxlbnQgRmlyc3QgTGltaXRlZAor5oWI5ZaECisKKy8vIHhuLS0zYnN0MDBtIDogMjAxMy0wOS0xMyBFYWdsZSBIb3Jpem9uIExpbWl0ZWQKK+mbhuWbogorCisvLyB4bi0tM2RzNDQzZyA6IDIwMTMtMDktMDggVExEIFJFR0lTVFJZIExJTUlURUQKK+WcqOe6vworCisvLyB4bi0tM29xMTh2bDhwbjM2YSA6IDIwMTUtMDctMDIgVm9sa3N3YWdlbiAoQ2hpbmEpIEludmVzdG1lbnQgQ28uLCBMdGQuCivlpKfkvJfmsb3ovaYKKworLy8geG4tLTNweHU4ayA6IDIwMTUtMDEtMTUgVmVyaVNpZ24gU2FybAor54K555yLCisKKy8vIHhuLS00MmMyZDlhIDogMjAxNS0wMS0xNSBWZXJpU2lnbiBTYXJsCivguITguK3guKEKKworLy8geG4tLTQ1cTExYyA6IDIwMTMtMTEtMjEgWm9kaWFjIFNjb3JwaW8gTGltaXRlZAor5YWr5Y2mCisKKy8vIHhuLS00Z2JyaW0gOiAyMDEzLTEwLTA0IFN1aHViIEVsZWN0cm9uaWMgRXN0YWJsaXNobWVudAor2YXZiNmC2LkKKworLy8geG4tLTU1cXc0MmcgOiAyMDEzLTExLTA4IENoaW5hIE9yZ2FuaXphdGlvbmFsIE5hbWUgQWRtaW5pc3RyYXRpb24gQ2VudGVyCivlhaznm4oKKworLy8geG4tLTU1cXg1ZCA6IDIwMTMtMTEtMTQgQ29tcHV0ZXIgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgb2YgQ2hpbmVzZSBBY2FkZW15IG9mIFNjaWVuY2VzIO+8iENoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVy77yJCivlhazlj7gKKworLy8geG4tLTVzdTM0ajkzNmJnc2cgOiAyMDE1LTA5LTAzIFNoYW5ncmnigJBMYSBJbnRlcm5hdGlvbmFsIEhvdGVsIE1hbmFnZW1lbnQgTGltaXRlZAor6aaZ5qC86YeM5ouJCisKKy8vIHhuLS01dHptNWcgOiAyMDE0LTEyLTIyIEdsb2JhbCBXZWJzaXRlIFRMRCBBc2lhIExpbWl0ZWQKK+e9keermQorCisvLyB4bi0tNmZyejgyZyA6IDIwMTMtMDktMjMgQWZpbGlhcyBMaW1pdGVkCivnp7vliqgKKworLy8geG4tLTZxcTk4NmIzeGwgOiAyMDEzLTA5LTEzIFR5Y29vbiBUcmVhc3VyZSBMaW1pdGVkCivmiJHniLHkvaAKKworLy8geG4tLTgwYWR4aGtzIDogMjAxMy0xMi0xOSBGb3VuZGF0aW9uIGZvciBBc3Npc3RhbmNlIGZvciBJbnRlcm5ldCBUZWNobm9sb2dpZXMgYW5kIEluZnJhc3RydWN0dXJlIERldmVsb3BtZW50IChGQUlUSUQpCivQvNC+0YHQutCy0LAKKworLy8geG4tLTgwYXFlY2RyMWEgOiAyMDE1LTEwLTIxIFBvbnRpZmljaXVtIENvbnNpbGl1bSBkZSBDb211bmljYXRpb25pYnVzIFNvY2lhbGlidXMgKFBDQ1MpIChQb250aWZpY2FsIENvdW5jaWwgZm9yIFNvY2lhbCBDb21tdW5pY2F0aW9uKQor0LrQsNGC0L7Qu9C40LoKKworLy8geG4tLTgwYXNlaGRiIDogMjAxMy0wNy0xNCBDT1JFIEFzc29jaWF0aW9uCivQvtC90LvQsNC50L0KKworLy8geG4tLTgwYXN3ZyA6IDIwMTMtMDctMTQgQ09SRSBBc3NvY2lhdGlvbgor0YHQsNC50YIKKworLy8geG4tLTh5MGEwNjNhIDogMjAxNS0wMy0yNiBDaGluYSBVbml0ZWQgTmV0d29yayBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbiBMaW1pdGVkCivogZTpgJoKKworLy8geG4tLTlkYnEyYSA6IDIwMTUtMDEtMTUgVmVyaVNpZ24gU2FybAor16fXldedCisKKy8vIHhuLS05ZXQ1MnUgOiAyMDE0LTA2LTEyIFJJU0UgVklDVE9SWSBMSU1JVEVECivml7blsJoKKworLy8geG4tLTlrcnQwMGEgOiAyMDE1LTAzLTEyIFNpbmEgQ29ycG9yYXRpb24KK+W+ruWNmgorCisvLyB4bi0tYjR3NjA1ZmVyZCA6IDIwMTQtMDgtMDcgVGVtYXNlayBIb2xkaW5ncyAoUHJpdmF0ZSkgTGltaXRlZAor5reh6ams6ZShCisKKy8vIHhuLS1iY2sxYjlhNWRyZTRjIDogMjAxNS0wMi0yNiBBbWF6b24gRVUgUy7DoCByLmwuCivjg5XjgqHjg4Pjgrfjg6fjg7MKKworLy8geG4tLWMxYXZnIDogMjAxMy0xMS0xNCBQdWJsaWMgSW50ZXJlc3QgUmVnaXN0cnkKK9C+0YDQsworCisvLyB4bi0tYzJicjdnIDogMjAxNS0wMS0xNSBWZXJpU2lnbiBTYXJsCivgpKjgpYfgpJ8KKworLy8geG4tLWNjazJiM2IgOiAyMDE1LTAyLTI2IEFtYXpvbiBFVSBTLsOgIHIubC4KK+OCueODiOOCogorCisvLyB4bi0tY2c0YmtpIDogMjAxMy0wOS0yNyBTQU1TVU5HIFNEUyBDTy4sIExURAor7IK87ISxCisKKy8vIHhuLS1jenI2OTRiIDogMjAxNC0wMS0xNiBEb3QgVHJhZGVtYXJrIFRMRCBIb2xkaW5nIENvbXBhbnkgTGltaXRlZAor5ZWG5qCHCisKKy8vIHhuLS1jenJzMHQgOiAyMDEzLTEyLTE5IFdpbGQgSXNsYW5kLCBMTEMKK+WVhuW6lworCisvLyB4bi0tY3pydTJkIDogMjAxMy0xMS0yMSBab2RpYWMgQ2Fwcmljb3JuIExpbWl0ZWQKK+WVhuWfjgorCisvLyB4bi0tZDFhY2ozYiA6IDIwMTMtMTEtMjAgVGhlIEZvdW5kYXRpb24gZm9yIE5ldHdvcmsgSW5pdGlhdGl2ZXMg4oCcVGhlIFNtYXJ0IEludGVybmV04oCdCivQtNC10YLQuAorCisvLyB4bi0tZWNrdmR0YzlkIDogMjAxNC0xMi0xOCBBbWF6b24gRVUgUy7DoCByLmwuCivjg53jgqTjg7Pjg4gKKworLy8geG4tLWVmdnk4OGggOiAyMDE0LTA4LTIyIFhpbmh1YSBOZXdzIEFnZW5jeSBHdWFuZ2RvbmcgQnJhbmNoIOaWsOWNjumAmuiur+ekvuW5v+S4nOWIhuekvgor5paw6Ze7CisKKy8vIHhuLS1lc3R2NzVnIDogMjAxNS0wMi0xOSBJbmR1c3RyaWFsIGFuZCBDb21tZXJjaWFsIEJhbmsgb2YgQ2hpbmEgTGltaXRlZAor5bel6KGMCisKKy8vIHhuLS1mY3Q0MjlrIDogMjAxNS0wNC0wOSBBbWF6b24gRVUgUy7DoCByLmwuCivlrrbpm7sKKworLy8geG4tLWZoYmVpIDogMjAxNS0wMS0xNSBWZXJpU2lnbiBTYXJsCivZg9mI2YUKKworLy8geG4tLWZpcTIyOGM1aHMgOiAyMDEzLTA5LTA4IFRMRCBSRUdJU1RSWSBMSU1JVEVECivkuK3mlofnvZEKKworLy8geG4tLWZpcTY0YiA6IDIwMTMtMTAtMTQgQ0lUSUMgR3JvdXAgQ29ycG9yYXRpb24KK+S4reS/oQorCisvLyB4bi0tZmpxNzIwYSA6IDIwMTQtMDUtMjIgV2lsbCBCbG9vbSwgTExDCivlqLHkuZAKKworLy8geG4tLWZsdzM1MWUgOiAyMDE0LTA3LTMxIENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCivosLfmrYwKKworLy8geG4tLWZ6eXM4ZDY5dXZnbSA6IDIwMTUtMDUtMTQgUENDVyBFbnRlcnByaXNlcyBMaW1pdGVkCivpm7voqIrnm4jnp5EKKworLy8geG4tLWcyeHg0OGMgOiAyMDE1LTAxLTMwIE1pbmRzICsgTWFjaGluZXMgR3JvdXAgTGltaXRlZAor6LSt54mpCisKKy8vIHhuLS1nY2tyM2YwZiA6IDIwMTUtMDItMjYgQW1hem9uIEVVIFMuw6Agci5sLgor44Kv44Op44Km44OJCisKKy8vIHhuLS1nazNhdDFlIDogMjAxNS0xMC0wOCBBbWF6b24gRVUgUy7DoCByLmwuCivpgJrosqkKKworLy8geG4tLWh4dDgxNGUgOiAyMDE0LTA1LTE1IFpvZGlhYyBMaWJyYSBMaW1pdGVkCivnvZHlupcKKworLy8geG4tLWkxYjZiMWE2YTJlIDogMjAxMy0xMS0xNCBQdWJsaWMgSW50ZXJlc3QgUmVnaXN0cnkKK+CkuOCkguCkl+CkoOCkqAorCisvLyB4bi0taW1yNTEzbiA6IDIwMTQtMTItMTEgRG90IFRyYWRlbWFyayBUTEQgSG9sZGluZyBDb21wYW55IExpbWl0ZWQKK+mkkOWOhQorCisvLyB4bi0taW8wYTdpIDogMjAxMy0xMS0xNCBDb21wdXRlciBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBvZiBDaGluZXNlIEFjYWRlbXkgb2YgU2NpZW5jZXMg77yIQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXLvvIkKK+e9kee7nAorCisvLyB4bi0tajFhZWYgOiAyMDE1LTAxLTE1IFZlcmlTaWduIFNhcmwKK9C60L7QvAorCisvLyB4bi0tamxxNjF1OXc3YiA6IDIwMTUtMDEtMDggTm9raWEgQ29ycG9yYXRpb24KK+ivuuWfuuS6mgorCisvLyB4bi0tanZyMTg5bSA6IDIwMTUtMDItMjYgQW1hem9uIEVVIFMuw6Agci5sLgor6aOf5ZOBCisKKy8vIHhuLS1rY3J4NzdkMXg0YSA6IDIwMTQtMTEtMDcgS29uaW5rbGlqa2UgUGhpbGlwcyBOLlYuCivpo57liKnmtaYKKworLy8geG4tLWtwdTcxNmYgOiAyMDE0LTEyLTIyIFJpY2hlbW9udCBETlMgSW5jLgor5omL6KGoCisKKy8vIHhuLS1rcHV0M2kgOiAyMDE0LTAyLTEzIEJlaWppbmcgUklUVC1OZXQgVGVjaG5vbG9neSBEZXZlbG9wbWVudCBDby4sIEx0ZAor5omL5py6CisKKy8vIHhuLS1tZ2JhM2EzZWp0IDogMjAxNC0xMS0yMCBBcmFtY28gU2VydmljZXMgQ29tcGFueQor2KfYsdin2YXZg9mICisKKy8vIHhuLS1tZ2JhN2MwYmJuMGEgOiAyMDE1LTA1LTE0IENyZXNjZW50IEhvbGRpbmcgR21iSAor2KfZhNi52YTZitin2YYKKworLy8geG4tLW1nYmFha2M3ZHZmIDogMjAxNS0wOS0wMyBFbWlyYXRlcyBUZWxlY29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24gKHRyYWRpbmcgYXMgRXRpc2FsYXQpCivYp9iq2LXYp9mE2KfYqgorCisvLyB4bi0tbWdiYWIyYmQgOiAyMDEzLTEwLTMxIENPUkUgQXNzb2NpYXRpb24KK9io2KfYstin2LEKKworLy8geG4tLW1nYmI5ZmJwb2IgOiAyMDE0LTEyLTE4IEdyZWVuVGVjaCBDb25zdWx0YW5jeSBDb21wYW55IFcuTC5MLgor2YXZiNio2KfZitmE2YoKKworLy8geG4tLW1nYmNhN2R6ZG8gOiAyMDE1LTA3LTMwIEFidSBEaGFiaSBTeXN0ZW1zIGFuZCBJbmZvcm1hdGlvbiBDZW50cmUKK9in2KjZiNi42KjZigorCisvLyB4bi0tbWdiaTRlY2V4cCA6IDIwMTUtMTAtMjEgUG9udGlmaWNpdW0gQ29uc2lsaXVtIGRlIENvbXVuaWNhdGlvbmlidXMgU29jaWFsaWJ1cyAoUENDUykgKFBvbnRpZmljYWwgQ291bmNpbCBmb3IgU29jaWFsIENvbW11bmljYXRpb24pCivZg9in2KvZiNmE2YrZgworCisvLyB4bi0tbWdidDNkaGQgOiAyMDE0LTA5LTA0IEFzaWEgR3JlZW4gSVQgU3lzdGVtIEJpbGdpc2F5YXIgU2FuLiB2ZSBUaWMuIEx0ZC4gU3RpLgor2YfZhdix2KfZhworCisvLyB4bi0tbWsxYnU0NGMgOiAyMDE1LTAxLTE1IFZlcmlTaWduIFNhcmwKK+uLt+y7tAorCisvLyB4bi0tbXh0cTFtIDogMjAxNC0wMy0wNiBOZXQtQ2hpbmVzZSBDby4sIEx0ZC4KK+aUv+W6nAorCisvLyB4bi0tbmdiYzVhemQgOiAyMDEzLTA3LTEzIEludGVybmF0aW9uYWwgRG9tYWluIFJlZ2lzdHJ5IFB0eS4gTHRkLgor2LTYqNmD2KkKKworLy8geG4tLW5nYmU5ZTBhIDogMjAxNC0xMi0wNCBLdXdhaXQgRmluYW5jZSBIb3VzZQor2KjZitiq2YMKKworLy8geG4tLW5nYnJ4IDogMjAxNS0xMS0xMiBMZWFndWUgb2YgQXJhYiBTdGF0ZXMKK9i52LHYqAorCisvLyB4bi0tbnF2N2YgOiAyMDEzLTExLTE0IFB1YmxpYyBJbnRlcmVzdCBSZWdpc3RyeQor5py65p6ECisKKy8vIHhuLS1ucXY3ZnMwMGVtYSA6IDIwMTMtMTEtMTQgUHVibGljIEludGVyZXN0IFJlZ2lzdHJ5Civnu4Tnu4fmnLrmnoQKKworLy8geG4tLW55cXkyNmEgOiAyMDE0LTExLTA3IFN0YWJsZSBUb25lIExpbWl0ZWQKK+WBpeW6tworCisvLyB4bi0tcDFhY2YgOiAyMDEzLTEyLTEyIFJ1c25hbWVzIExpbWl0ZWQKK9GA0YPRgQorCisvLyB4bi0tcGJ0OTc3YyA6IDIwMTQtMTItMjIgUmljaGVtb250IEROUyBJbmMuCivnj6Dlrp0KKworLy8geG4tLXBzc3kydSA6IDIwMTUtMDEtMTUgVmVyaVNpZ24gU2FybAor5aSn5ou/CisKKy8vIHhuLS1xOWp5YjRjIDogMjAxMy0wOS0xNyBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgor44G/44KT44GqCisKKy8vIHhuLS1xY2thMXBtYyA6IDIwMTQtMDctMzEgQ2hhcmxlc3RvbiBSb2FkIFJlZ2lzdHJ5IEluYy4KK+OCsOODvOOCsOODqworCisvLyB4bi0tcmhxdjk2ZyA6IDIwMTMtMDktMTEgU3RhYmxlIFRvbmUgTGltaXRlZAor5LiW55WMCisKKy8vIHhuLS1yb3Z1ODhiIDogMjAxNS0wMi0yNiBBbWF6b24gRVUgUy7DoCByLmwuCivmm7jnsY0KKworLy8geG4tLXNlczU1NGcgOiAyMDE0LTAxLTE2CivnvZHlnYAKKworLy8geG4tLXQ2MGI1NmEgOiAyMDE1LTAxLTE1IFZlcmlTaWduIFNhcmwKK+uLt+uEtworCisvLyB4bi0tdGNrd2UgOiAyMDE1LTAxLTE1IFZlcmlTaWduIFNhcmwKK+OCs+ODoAorCisvLyB4bi0tdGlxNDl4cXlqIDogMjAxNS0xMC0yMSBQb250aWZpY2l1bSBDb25zaWxpdW0gZGUgQ29tdW5pY2F0aW9uaWJ1cyBTb2NpYWxpYnVzIChQQ0NTKSAoUG9udGlmaWNhbCBDb3VuY2lsIGZvciBTb2NpYWwgQ29tbXVuaWNhdGlvbikKK+WkqeS4u+aVmQorCisvLyB4bi0tdW51cDR5IDogMjAxMy0wNy0xNCBTcHJpbmcgRmllbGRzLCBMTEMKK+a4uOaIjworCisvLyB4bi0tdmVybWdlbnNiZXJhdGVyLWN0YiA6IDIwMTQtMDYtMjMgRGV1dHNjaGUgVmVybcO2Z2Vuc2JlcmF0dW5nIEFrdGllbmdlc2VsbHNjaGFmdCBEVkFHCit2ZXJtw7ZnZW5zYmVyYXRlcgorCisvLyB4bi0tdmVybWdlbnNiZXJhdHVuZy1wd2IgOiAyMDE0LTA2LTIzIERldXRzY2hlIFZlcm3DtmdlbnNiZXJhdHVuZyBBa3RpZW5nZXNlbGxzY2hhZnQgRFZBRwordmVybcO2Z2Vuc2JlcmF0dW5nCisKKy8vIHhuLS12aHF1diA6IDIwMTMtMDgtMjcgRGFzaCBNY0Nvb2ssIExMQwor5LyB5LiaCisKKy8vIHhuLS12dXE4NjFiIDogMjAxNC0xMC0xNiBCZWlqaW5nIFRlbGUtaW5mbyBOZXR3b3JrIFRlY2hub2xvZ3kgQ28uLCBMdGQuCivkv6Hmga8KKworLy8geG4tLXc0cjg1ZWw4Zmh1NWRucmEgOiAyMDE1LTA0LTMwIEtlcnJ5IFRyYWRpbmcgQ28uIExpbWl0ZWQKK+WYiemHjOWkp+mFkuW6lworCisvLyB4bi0tdzRyczQwbCA6IDIwMTUtMDctMzAgS2VycnkgVHJhZGluZyBDby4gTGltaXRlZAor5ZiJ6YeMCisKKy8vIHhuLS14aHE1MjFiIDogMjAxMy0xMS0xNCBHdWFuZ3pob3UgWVUgV2VpIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgQ28uLCBMdGQuCivlub/kuJwKKworLy8geG4tLXpmcjE2NGIgOiAyMDEzLTExLTA4IENoaW5hIE9yZ2FuaXphdGlvbmFsIE5hbWUgQWRtaW5pc3RyYXRpb24gQ2VudGVyCivmlL/liqEKKworLy8geHBlcmlhIDogMjAxNS0wNS0xNCBTb255IE1vYmlsZSBDb21tdW5pY2F0aW9ucyBBQgoreHBlcmlhCisKKy8vIHh5eiA6IDIwMTMtMTItMDUgWFlaLkNPTSBMTEMKK3h5egorCisvLyB5YWNodHMgOiAyMDE0LTAxLTA5IERFUllhY2h0cywgTExDCit5YWNodHMKKworLy8geWFob28gOiAyMDE1LTA0LTAyIFlhaG9vISBEb21haW4gU2VydmljZXMgSW5jLgoreWFob28KKworLy8geWFtYXh1biA6IDIwMTQtMTItMTggQW1hem9uIEVVIFMuw6Agci5sLgoreWFtYXh1bgorCisvLyB5YW5kZXggOiAyMDE0LTA0LTEwIFlBTkRFWCwgTExDCit5YW5kZXgKKworLy8geW9kb2Jhc2hpIDogMjAxNC0xMS0yMCBZT0RPQkFTSEkgQ0FNRVJBIENPLixMVEQuCit5b2RvYmFzaGkKKworLy8geW9nYSA6IDIwMTQtMDUtMjkgVG9wIExldmVsIERvbWFpbiBIb2xkaW5ncyBMaW1pdGVkCit5b2dhCisKKy8vIHlva29oYW1hIDogMjAxMy0xMi0xMiBHTU8gUmVnaXN0cnksIEluYy4KK3lva29oYW1hCisKKy8vIHlvdSA6IDIwMTUtMDQtMDkgQW1hem9uIEVVIFMuw6Agci5sLgoreW91CisKKy8vIHlvdXR1YmUgOiAyMDE0LTA1LTAxIENoYXJsZXN0b24gUm9hZCBSZWdpc3RyeSBJbmMuCit5b3V0dWJlCisKKy8vIHl1biA6IDIwMTUtMDEtMDggUUlIT08gMzYwIFRFQ0hOT0xPR1kgQ08uIExURC4KK3l1bgorCisvLyB6YXBwb3MgOiAyMDE1LTA2LTI1IEFtYXpvbiBFVSBTLsOgIHIubC4KK3phcHBvcworCisvLyB6YXJhIDogMjAxNC0xMS0wNyBJbmR1c3RyaWEgZGUgRGlzZcOxbyBUZXh0aWwsIFMuQS4gKElORElURVgsIFMuQS4pCit6YXJhCisKKy8vIHplcm8gOiAyMDE0LTEyLTE4IEFtYXpvbiBFVSBTLsOgIHIubC4KK3plcm8KKworLy8gemlwIDogMjAxNC0wNS0wOCBDaGFybGVzdG9uIFJvYWQgUmVnaXN0cnkgSW5jLgoremlwCisKKy8vIHppcHBvIDogMjAxNS0wNy0wMiBaYWRjbyBDb21wYW55Cit6aXBwbworCisvLyB6b25lIDogMjAxMy0xMS0xNCBPdXRlciBGYWxscywgTExDCit6b25lCisKKy8vIHp1ZXJpY2ggOiAyMDE0LTExLTA3IEthbnRvbiBaw7xyaWNoIChDYW50b24gb2YgWnVyaWNoKQorenVlcmljaAorCisKKy8vID09PUVORCBJQ0FOTiBET01BSU5TPT09CisvLyA9PT1CRUdJTiBQUklWQVRFIERPTUFJTlM9PT0KKy8vIChOb3RlOiB0aGVzZSBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGJ5IGNvbXBhbnkgbmFtZSkKKworLy8gMUdCIExMQyA6IGh0dHBzOi8vd3d3LjFnYi51YS8KKy8vIFN1Ym1pdHRlZCBieSAxR0IgTExDIDxub2NAMWdiLmNvbS51YT4KK2NjLnVhCitpbmYudWEKK2x0ZC51YQorCisvLyBBZ25hdCBzcC4geiBvLm8uIDogaHR0cHM6Ly9kb21lbmEucGwKKy8vIFN1Ym1pdHRlZCBieSBQcnplbXlzbGF3IFBsZXdhIDxpdC1hZG1pbkBkb21lbmEucGw+CitiZWVwLnBsCisKKy8vIEFsY2VzIFNvZnR3YXJlIEx0ZCA6IGh0dHA6Ly9hbGNlcy1zb2Z0d2FyZS5jb20KKy8vIFN1Ym1pdHRlZCBieSBNYXJrIEouIFRpdG9yZW5rbyA8bWFyay50aXRvcmVua29AYWxjZXMtc29mdHdhcmUuY29tPgorKi5jb21wdXRlLmVzdGF0ZQorKi5hbGNlcy5uZXR3b3JrCisKKy8vIGFsd2F5c2RhdGEgOiBodHRwczovL3d3dy5hbHdheXNkYXRhLmNvbQorLy8gU3VibWl0dGVkIGJ5IEN5cmlsIDxhZG1pbkBhbHdheXNkYXRhLmNvbT4KKyouYWx3YXlzZGF0YS5uZXQKKworLy8gQW1hem9uIENsb3VkRnJvbnQgOiBodHRwczovL2F3cy5hbWF6b24uY29tL2Nsb3VkZnJvbnQvCisvLyBTdWJtaXR0ZWQgYnkgRG9uYXZhbiBNaWxsZXIgPGRvbmF2YW5tQGFtYXpvbi5jb20+CitjbG91ZGZyb250Lm5ldAorCisvLyBBbWF6b24gRWxhc3RpYyBDb21wdXRlIENsb3VkIDogaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9lYzIvCisvLyBTdWJtaXR0ZWQgYnkgTHVrZSBXZWxscyA8cHNsLW1haW50YWluZXJzQGFtYXpvbi5jb20+CisqLmNvbXB1dGUuYW1hem9uYXdzLmNvbQorKi5jb21wdXRlLTEuYW1hem9uYXdzLmNvbQorKi5jb21wdXRlLmFtYXpvbmF3cy5jb20uY24KK3VzLWVhc3QtMS5hbWF6b25hd3MuY29tCisKKy8vIEFtYXpvbiBFbGFzdGljIEJlYW5zdGFsayA6IGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vZWxhc3RpY2JlYW5zdGFsay8KKy8vIFN1Ym1pdHRlZCBieSBMdWtlIFdlbGxzIDxwc2wtbWFpbnRhaW5lcnNAYW1hem9uLmNvbT4KK2VsYXN0aWNiZWFuc3RhbGsuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuCisqLmVsYXN0aWNiZWFuc3RhbGsuY29tCisKKy8vIEFtYXpvbiBFbGFzdGljIExvYWQgQmFsYW5jaW5nIDogaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy8KKy8vIFN1Ym1pdHRlZCBieSBMdWtlIFdlbGxzIDxwc2wtbWFpbnRhaW5lcnNAYW1hem9uLmNvbT4KKyouZWxiLmFtYXpvbmF3cy5jb20KKyouZWxiLmFtYXpvbmF3cy5jb20uY24KKworLy8gQW1hem9uIFMzIDogaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zMy8KKy8vIFN1Ym1pdHRlZCBieSBMdWtlIFdlbGxzIDxwc2wtbWFpbnRhaW5lcnNAYW1hem9uLmNvbT4KK3MzLmFtYXpvbmF3cy5jb20KK3MzLWFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20KK3MzLWFwLW5vcnRoZWFzdC0yLmFtYXpvbmF3cy5jb20KK3MzLWFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbQorczMtYXAtc291dGhlYXN0LTEuYW1hem9uYXdzLmNvbQorczMtYXAtc291dGhlYXN0LTIuYW1hem9uYXdzLmNvbQorczMtY2EtY2VudHJhbC0xLmFtYXpvbmF3cy5jb20KK3MzLWV1LWNlbnRyYWwtMS5hbWF6b25hd3MuY29tCitzMy1ldS13ZXN0LTEuYW1hem9uYXdzLmNvbQorczMtZXUtd2VzdC0yLmFtYXpvbmF3cy5jb20KK3MzLWV4dGVybmFsLTEuYW1hem9uYXdzLmNvbQorczMtZmlwcy11cy1nb3Ytd2VzdC0xLmFtYXpvbmF3cy5jb20KK3MzLXNhLWVhc3QtMS5hbWF6b25hd3MuY29tCitzMy11cy1nb3Ytd2VzdC0xLmFtYXpvbmF3cy5jb20KK3MzLXVzLWVhc3QtMi5hbWF6b25hd3MuY29tCitzMy11cy13ZXN0LTEuYW1hem9uYXdzLmNvbQorczMtdXMtd2VzdC0yLmFtYXpvbmF3cy5jb20KK3MzLmFwLW5vcnRoZWFzdC0yLmFtYXpvbmF3cy5jb20KK3MzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbQorczMuY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuCitzMy5jYS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbQorczMuZXUtY2VudHJhbC0xLmFtYXpvbmF3cy5jb20KK3MzLmV1LXdlc3QtMi5hbWF6b25hd3MuY29tCitzMy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbQorczMuZHVhbHN0YWNrLmFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20KK3MzLmR1YWxzdGFjay5hcC1ub3J0aGVhc3QtMi5hbWF6b25hd3MuY29tCitzMy5kdWFsc3RhY2suYXAtc291dGgtMS5hbWF6b25hd3MuY29tCitzMy5kdWFsc3RhY2suYXAtc291dGhlYXN0LTEuYW1hem9uYXdzLmNvbQorczMuZHVhbHN0YWNrLmFwLXNvdXRoZWFzdC0yLmFtYXpvbmF3cy5jb20KK3MzLmR1YWxzdGFjay5jYS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbQorczMuZHVhbHN0YWNrLmV1LWNlbnRyYWwtMS5hbWF6b25hd3MuY29tCitzMy5kdWFsc3RhY2suZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20KK3MzLmR1YWxzdGFjay5ldS13ZXN0LTIuYW1hem9uYXdzLmNvbQorczMuZHVhbHN0YWNrLnNhLWVhc3QtMS5hbWF6b25hd3MuY29tCitzMy5kdWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20KK3MzLmR1YWxzdGFjay51cy1lYXN0LTIuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS11cy1lYXN0LTEuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS11cy13ZXN0LTEuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS11cy13ZXN0LTIuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS1hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tCitzMy13ZWJzaXRlLWFwLXNvdXRoZWFzdC0xLmFtYXpvbmF3cy5jb20KK3MzLXdlYnNpdGUtYXAtc291dGhlYXN0LTIuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS1ldS13ZXN0LTEuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS1zYS1lYXN0LTEuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS5hcC1ub3J0aGVhc3QtMi5hbWF6b25hd3MuY29tCitzMy13ZWJzaXRlLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS5jYS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS5ldS13ZXN0LTIuYW1hem9uYXdzLmNvbQorczMtd2Vic2l0ZS51cy1lYXN0LTIuYW1hem9uYXdzLmNvbQorCisvLyBBbXVuZSA6IGh0dHBzOi8vYW11bmUub3JnLworLy8gU3VibWl0dGVkIGJ5IFRlYW0gQW11bmUgPGNlcnRAYW11bmUub3JnPgordDNsM3AwcnQubmV0Cit0ZWxlLmFtdW5lLm9yZworCisvLyBBcHRpYmxlIDogaHR0cHM6Ly93d3cuYXB0aWJsZS5jb20vCisvLyBTdWJtaXR0ZWQgYnkgVGhvbWFzIE9yb3pjbyA8dGhvbWFzQGFwdGlibGUuY29tPgorb24tYXB0aWJsZS5jb20KKworLy8gQXNvY2lhY2nDs24gQW1pZ29zIGRlIGxhIEluZm9ybcOhdGljYSAiRXVza2FsYW1pZ2EiIDogaHR0cDovL2VuY291bnRlci5ldXMvCisvLyBTdWJtaXR0ZWQgYnkgSGVjdG9yIE1hcnRpbiA8bWFyY2FuQGV1c2thbGVuY291bnRlci5vcmc+Cit1c2VyLnBhcnR5LmV1cworCisvLyBBc3NvY2lhdGlvbiBwb3RhZ2VyLm9yZyA6IGh0dHBzOi8vcG90YWdlci5vcmcvCisvLyBTdWJtaXR0ZWQgYnkgTHVuYXIgPGphcmRpbmllcnNAcG90YWdlci5vcmc+CitwaW1pZW50YS5vcmcKK3BvaXZyb24ub3JnCitwb3RhZ2VyLm9yZworc3dlZXRwZXBwZXIub3JnCisKKy8vIEFTVVNUT1IgSW5jLiA6IGh0dHA6Ly93d3cuYXN1c3Rvci5jb20KKy8vIFN1Ym1pdHRlZCBieSBWaW5jZW50IFRzZW5nIDx2aW5jZW50dHNlbmdAYXN1c3Rvci5jb20+CitteWFzdXN0b3IuY29tCisKKy8vIEFWTSA6IGh0dHBzOi8vYXZtLmRlCisvLyBTdWJtaXR0ZWQgYnkgQW5kcmVhcyBXZWlzZSA8YS53ZWlzZUBhdm0uZGU+CitteWZyaXR6Lm5ldAorCisvLyBBVyBBZHZpc29yV2Vic2l0ZXMuY29tIFNvZnR3YXJlIEluYyA6IGh0dHBzOi8vYWR2aXNvcndlYnNpdGVzLmNvbQorLy8gU3VibWl0dGVkIGJ5IEphbWVzIEtlbm5lZHkgPGRvbWFpbnNAYWR2aXNvcndlYnNpdGVzLmNvbT4KKyouYXdkZXYuY2EKKyouYWR2aXNvci53cworCisvLyBiYWNrcGxhbmUgOiBodHRwczovL3d3dy5iYWNrcGxhbmUuaW8KKy8vIFN1Ym1pdHRlZCBieSBBbnRob255IFZvdXRhcyA8YW50aG9ueUBiYWNrcGxhbmUuaW8+CitiYWNrcGxhbmVhcHAuaW8KKworLy8gQmV0YUluQUJveAorLy8gU3VibWl0dGVkIGJ5IEFkcmlhbiA8YWRyaWFuQGJldGFpbmFib3guY29tPgorYmV0YWluYWJveC5jb20KKworLy8gQmluYXJ5TGFuZSA6IGh0dHA6Ly93d3cuYmluYXJ5bGFuZS5jb20KKy8vIFN1Ym1pdHRlZCBieSBOYXRoYW4gTydTdWxsaXZhbiA8bmF0aGFuQG1hbW1vdGguY29tLmF1PgorYm5yLmxhCisKKy8vIEJvb21sYSA6IGh0dHBzOi8vYm9vbWxhLmNvbQorLy8gU3VibWl0dGVkIGJ5IFRpYm9yIEhhbHRlciA8dGhhbHRlckBib29tbGEuY29tPgorYm9vbWxhLm5ldAorCisvLyBCb3hmdXNlIDogaHR0cHM6Ly9ib3hmdXNlLmNvbQorLy8gU3VibWl0dGVkIGJ5IEF4ZWwgRm9udGFpbmUgPGF4ZWxAYm94ZnVzZS5jb20+Citib3hmdXNlLmlvCisKKy8vIGJwbGFjZWQgOiBodHRwczovL3d3dy5icGxhY2VkLm5ldC8KKy8vIFN1Ym1pdHRlZCBieSBNaXJvc2xhdiBCb3ppYyA8c2VjdXJpdHlAYnBsYWNlZC5uZXQ+CitzcXVhcmU3LmNoCiticGxhY2VkLmNvbQorYnBsYWNlZC5kZQorc3F1YXJlNy5kZQorYnBsYWNlZC5uZXQKK3NxdWFyZTcubmV0CisKKy8vIEJyb3dzZXJTYWZldHlNYXJrCisvLyBTdWJtaXR0ZWQgYnkgRGF2ZSBUaGFycCA8YnJvd3NlcnNhZmV0eW1hcmsuaW9AcXVpY2luYy5jb20+Citicm93c2Vyc2FmZXR5bWFyay5pbworCisvLyBjYWxsaWRvbXVzIDogaHR0cHM6Ly93d3cuY2FsbGlkb211cy5jb20vCisvLyBTdWJtaXR0ZWQgYnkgTWFyY3VzIFBvcHAgPGFkbWluQGNhbGxpZG9tdXMuY29tPgorbXljZC5ldQorCisvLyBDZW50cmFsTmljIDogaHR0cDovL3d3dy5jZW50cmFsbmljLmNvbS9uYW1lcy9kb21haW5zCisvLyBTdWJtaXR0ZWQgYnkgcmVnaXN0cnkgPGdhdmluLmJyb3duQGNlbnRyYWxuaWMuY29tPgorYWUub3JnCithci5jb20KK2JyLmNvbQorY24uY29tCitjb20uZGUKK2NvbS5zZQorZGUuY29tCitldS5jb20KK2diLmNvbQorZ2IubmV0CitodS5jb20KK2h1Lm5ldAoranAubmV0CitqcG4uY29tCitrci5jb20KK21leC5jb20KK25vLmNvbQorcWMuY29tCitydS5jb20KK3NhLmNvbQorc2UuY29tCitzZS5uZXQKK3VrLmNvbQordWsubmV0Cit1cy5jb20KK3V5LmNvbQoremEuYnoKK3phLmNvbQorCisvLyBBZnJpY2EuY29tIFdlYiBTb2x1dGlvbnMgTHRkIDogaHR0cHM6Ly9yZWdpc3RyeS5hZnJpY2EuY29tCisvLyBTdWJtaXR0ZWQgYnkgR2F2aW4gQnJvd24gPGdhdmluLmJyb3duQGNlbnRyYWxuaWMuY29tPgorYWZyaWNhLmNvbQorCisvLyBpRE9UIFNlcnZpY2VzIExpbWl0ZWQgOiBodHRwOi8vd3d3LmRvbWFpbi5nci5jb20KKy8vIFN1Ym1pdHRlZCBieSBHYXZpbiBCcm93biA8Z2F2aW4uYnJvd25AY2VudHJhbG5pYy5jb20+Citnci5jb20KKworLy8gUmFkaXggRlpDIDogaHR0cDovL2RvbWFpbnMuaW4ubmV0CisvLyBTdWJtaXR0ZWQgYnkgR2F2aW4gQnJvd24gPGdhdmluLmJyb3duQGNlbnRyYWxuaWMuY29tPgoraW4ubmV0CisKKy8vIFVTIFJFR0lTVFJZIExMQyA6IGh0dHA6Ly91cy5vcmcKKy8vIFN1Ym1pdHRlZCBieSBHYXZpbiBCcm93biA8Z2F2aW4uYnJvd25AY2VudHJhbG5pYy5jb20+Cit1cy5vcmcKKworLy8gY28uY29tIFJlZ2lzdHJ5LCBMTEMgOiBodHRwczovL3JlZ2lzdHJ5LmNvLmNvbQorLy8gU3VibWl0dGVkIGJ5IEdhdmluIEJyb3duIDxnYXZpbi5icm93bkBjZW50cmFsbmljLmNvbT4KK2NvLmNvbQorCisvLyBjLmxhIDogaHR0cDovL3d3dy5jLmxhLworYy5sYQorCisvLyBjZXJ0bWdyLm9yZyA6IGh0dHBzOi8vY2VydG1nci5vcmcKKy8vIFN1Ym1pdHRlZCBieSBCLiBCbGVjaHNjaG1pZHQgPGhvc3RtYXN0ZXJAY2VydG1nci5vcmc+CitjZXJ0bWdyLm9yZworCisvLyBDaXRyaXggOiBodHRwczovL2NpdHJpeC5jb20KKy8vIFN1Ym1pdHRlZCBieSBBbGV4IFN0b2RkYXJkIDxhbGV4LnN0b2RkYXJkQGNpdHJpeC5jb20+Cit4ZW5hcHBvbmF6dXJlLmNvbQorCisvLyBDbGVhclZveCA6IGh0dHA6Ly93d3cuY2xlYXJ2b3gubmwvCisvLyBTdWJtaXR0ZWQgYnkgTGVvbiBSb3dsYW5kIDxsZW9uQGNsZWFydm94Lm5sPgordmlydHVlZWxkb21laW4ubmwKKworLy8gQ2xvdWQ2NiA6IGh0dHBzOi8vd3d3LmNsb3VkNjYuY29tLworLy8gU3VibWl0dGVkIGJ5IEtoYXNoIFNhamFkaSA8a2hhc2hAY2xvdWQ2Ni5jb20+CitjNjYubWUKKworLy8gQ2xvdWRBY2Nlc3MubmV0IDogaHR0cHM6Ly93d3cuY2xvdWRhY2Nlc3MubmV0LworLy8gU3VibWl0dGVkIGJ5IFBhd2VsIFBhbmVrIDxub2NAY2xvdWRhY2Nlc3MubmV0PgoramRldmNsb3VkLmNvbQord3BkZXZjbG91ZC5jb20KK2Nsb3VkYWNjZXNzLmhvc3QKK2ZyZWVzaXRlLmhvc3QKK2Nsb3VkYWNjZXNzLm5ldAorCisvLyBjbG91ZENvbnRyb2wgOiBodHRwczovL3d3dy5jbG91ZGNvbnRyb2wuY29tLworLy8gU3VibWl0dGVkIGJ5IFRvYmlhcyBXaWxrZW4gPHR3QGNsb3VkY29udHJvbC5jb20+CitjbG91ZGNvbnRyb2xsZWQuY29tCitjbG91ZGNvbnRyb2xhcHAuY29tCisKKy8vIGNvLmNhIDogaHR0cDovL3JlZ2lzdHJ5LmNvLmNhLworY28uY2EKKworLy8gaS1yZWdpc3RyeSBzLnIuby4gOiBodHRwOi8vd3d3LmktcmVnaXN0cnkuY3ovCisvLyBTdWJtaXR0ZWQgYnkgTWFydGluIFNlbXJhZCA8c2VtcmFkQGktcmVnaXN0cnkuY3o+Citjby5jegorCisvLyBDRE43Ny5jb20gOiBodHRwOi8vd3d3LmNkbjc3LmNvbQorLy8gU3VibWl0dGVkIGJ5IEphbiBLcnBlcyA8amFuLmtycGVzQGNkbjc3LmNvbT4KK2MuY2RuNzcub3JnCitjZG43Ny1zc2wubmV0CityLmNkbjc3Lm5ldAorcnNjLmNkbjc3Lm9yZworc3NsLm9yaWdpbi5jZG43Ny1zZWN1cmUub3JnCisKKy8vIENsb3VkIEROUyBMdGQgOiBodHRwOi8vd3d3LmNsb3VkbnMubmV0CisvLyBTdWJtaXR0ZWQgYnkgQWxla3NhbmRlciBIcmlzdG92IDxub2NAY2xvdWRucy5uZXQ+CitjbG91ZG5zLmFzaWEKK2Nsb3VkbnMuYml6CitjbG91ZG5zLmNsdWIKK2Nsb3VkbnMuY2MKK2Nsb3VkbnMuZXUKK2Nsb3VkbnMuaW4KK2Nsb3VkbnMuaW5mbworY2xvdWRucy5vcmcKK2Nsb3VkbnMucHJvCitjbG91ZG5zLnB3CitjbG91ZG5zLnVzCisKKy8vIENvRE5TIEIuVi4KK2NvLm5sCitjby5ubworCisvLyBDT1NJTU8gR21iSCA6IGh0dHA6Ly93d3cuY29zaW1vLmRlCisvLyBTdWJtaXR0ZWQgYnkgUmVuZSBNYXJ0aWNrZSA8cm1hcnRpY2tlQGNvc2ltby5kZT4KK2R5bi5jb3NpZG5zLmRlCitkeW5hbWlzY2hlcy1kbnMuZGUKK2Ruc3VwZGF0ZXIuZGUKK2ludGVybmV0LWRucy5kZQorbC1vLWctaS1uLmRlCitkeW5hbWljLWRucy5pbmZvCitmZXN0ZS1pcC5uZXQKK2tueC1zZXJ2ZXIubmV0CitzdGF0aWMtYWNjZXNzLm5ldAorCisvLyBDcmF5bmljLCBzLnIuby4gOiBodHRwOi8vd3d3LmNyYXluaWMuY29tLworLy8gU3VibWl0dGVkIGJ5IEFsZXMgS3Jham5payA8YWxlcy5rcmFqbmlrQGNyYXluaWMuY29tPgorcmVhbG0uY3oKKworLy8gQ3J5cHRvbm9taWMgOiBodHRwczovL2NyeXB0b25vbWljLm5ldC8KKy8vIFN1Ym1pdHRlZCBieSBBbmRyZXcgQ2FkeSA8cHVibGljLXN1ZmZpeC1saXN0QGNyeXB0b25vbWljLm5ldD4KKyouY3J5cHRvbm9taWMubmV0CisKKy8vIEN1cGNha2UgOiBodHRwczovL2N1cGNha2UuaW8vCisvLyBTdWJtaXR0ZWQgYnkgSm9uYXRoYW4gUnVkZW5iZXJnIDxqb25hdGhhbkBjdXBjYWtlLmlvPgorY3VwY2FrZS5pcworCisvLyBjeW9uIEdtYkggOiBodHRwczovL3d3dy5jeW9uLmNoLworLy8gU3VibWl0dGVkIGJ5IERvbWluaWMgTHVlY2hpbmdlciA8ZG9sQGN5b24uY2g+CitjeW9uLmxpbmsKK2N5b24uc2l0ZQorCisvLyBEYXBsaWUsIEluYyA6IGh0dHBzOi8vZGFwbGllLmNvbQorLy8gU3VibWl0dGVkIGJ5IEFKIE9OZWFsIDxhakBkYXBsaWUuY29tPgorZGFwbGllLm1lCitsb2NhbGhvc3QuZGFwbGllLm1lCisKKy8vIERhbnNrLm5ldCA6IGh0dHA6Ly93d3cuZGFuc2submV0LworLy8gU3VibWl0dGVkIGJ5IEFuYW5pIFZvdWxlIDxkaWdpdGFsQGRpZ2l0YWwuY28uZGs+CitiaXouZGsKK2NvLmRrCitmaXJtLmRrCityZWcuZGsKK3N0b3JlLmRrCisKKy8vIGRlU0VDIDogaHR0cHM6Ly9kZXNlYy5pby8KKy8vIFN1Ym1pdHRlZCBieSBQZXRlciBUaG9tYXNzZW4gPHBldGVyQGRlc2VjLmlvPgorZGVkeW4uaW8KKworLy8gRE5TaG9tZSA6IGh0dHBzOi8vd3d3LmRuc2hvbWUuZGUvCisvLyBTdWJtaXR0ZWQgYnkgTm9yYmVydCBBdWxlciA8bWFpbEBkbnNob21lLmRlPgorZG5zaG9tZS5kZQorCisvLyBEcmF5VGVrIENvcnAuIDogaHR0cHM6Ly93d3cuZHJheXRlay5jb20vCisvLyBTdWJtaXR0ZWQgYnkgUGF1bCBGYW5nIDxtaXNAZHJheXRlay5jb20+CitkcmF5ZGRucy5jb20KKworLy8gRHJlYW1Ib3N0IDogaHR0cDovL3d3dy5kcmVhbWhvc3QuY29tLworLy8gU3VibWl0dGVkIGJ5IEFuZHJldyBGYXJtZXIgPGFuZHJldy5mYXJtZXJAZHJlYW1ob3N0LmNvbT4KK2RyZWFtaG9zdGVycy5jb20KKworLy8gRHJvYm8gOiBodHRwOi8vd3d3LmRyb2JvLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBSaWNhcmRvIFBhZGlsaGEgPHJwYWRpbGhhQGRyb2JvLmNvbT4KK215ZHJvYm8uY29tCisKKy8vIERydWQgSG9sZGluZ3MsIExMQy4gOiBodHRwczovL3d3dy5kcnVkLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBLZXZpbiBCcmlkZ2VzIDxrZXZpbkBkcnVkLmNvbT4KK2RydWQuaW8KK2RydWQudXMKKworLy8gRHVja0ROUyA6IGh0dHA6Ly93d3cuZHVja2Rucy5vcmcvCisvLyBTdWJtaXR0ZWQgYnkgUmljaGFyZCBIYXJwZXIgPHJpY2hhcmRAZHVja2Rucy5vcmc+CitkdWNrZG5zLm9yZworCisvLyBkeS5maSA6IGh0dHA6Ly9keS5maS8KKy8vIFN1Ym1pdHRlZCBieSBIZWlra2kgSGFubmlrYWluZW4gPGhlc3N1QGhlcy5pa2kuZmk+CitkeS5maQordHVuay5vcmcKKworLy8gRHluRE5TLmNvbSA6IGh0dHA6Ly93d3cuZHluZG5zLmNvbS9zZXJ2aWNlcy9kbnMvZHluZG5zLworZHluZG5zLWF0LWhvbWUuY29tCitkeW5kbnMtYXQtd29yay5jb20KK2R5bmRucy1ibG9nLmNvbQorZHluZG5zLWZyZWUuY29tCitkeW5kbnMtaG9tZS5jb20KK2R5bmRucy1pcC5jb20KK2R5bmRucy1tYWlsLmNvbQorZHluZG5zLW9mZmljZS5jb20KK2R5bmRucy1waWNzLmNvbQorZHluZG5zLXJlbW90ZS5jb20KK2R5bmRucy1zZXJ2ZXIuY29tCitkeW5kbnMtd2ViLmNvbQorZHluZG5zLXdpa2kuY29tCitkeW5kbnMtd29yay5jb20KK2R5bmRucy5iaXoKK2R5bmRucy5pbmZvCitkeW5kbnMub3JnCitkeW5kbnMudHYKK2F0LWJhbmQtY2FtcC5uZXQKK2F0aC5jeAorYmFycmVsLW9mLWtub3dsZWRnZS5pbmZvCitiYXJyZWxsLW9mLWtub3dsZWRnZS5pbmZvCitiZXR0ZXItdGhhbi50dgorYmxvZ2Rucy5jb20KK2Jsb2dkbnMubmV0CitibG9nZG5zLm9yZworYmxvZ3NpdGUub3JnCitib2xkbHlnb2luZ25vd2hlcmUub3JnCiticm9rZS1pdC5uZXQKK2J1eXNob3VzZXMubmV0CitjZWNoaXJlLmNvbQorZG5zYWxpYXMuY29tCitkbnNhbGlhcy5uZXQKK2Ruc2FsaWFzLm9yZworZG5zZG9qby5jb20KK2Ruc2Rvam8ubmV0CitkbnNkb2pvLm9yZworZG9lcy1pdC5uZXQKK2RvZXNudGV4aXN0LmNvbQorZG9lc250ZXhpc3Qub3JnCitkb250ZXhpc3QuY29tCitkb250ZXhpc3QubmV0Citkb250ZXhpc3Qub3JnCitkb29tZG5zLmNvbQorZG9vbWRucy5vcmcKK2R2cmRucy5vcmcKK2R5bi1vLXNhdXIuY29tCitkeW5hbGlhcy5jb20KK2R5bmFsaWFzLm5ldAorZHluYWxpYXMub3JnCitkeW5hdGhvbWUubmV0CitkeW5kbnMud3MKK2VuZG9maW50ZXJuZXQubmV0CitlbmRvZmludGVybmV0Lm9yZworZW5kb2Z0aGVpbnRlcm5ldC5vcmcKK2VzdC1hLWxhLW1haXNvbi5jb20KK2VzdC1hLWxhLW1hc2lvbi5jb20KK2VzdC1sZS1wYXRyb24uY29tCitlc3QtbW9uLWJsb2d1ZXVyLmNvbQorZm9yLWJldHRlci5iaXoKK2Zvci1tb3JlLmJpegorZm9yLW91ci5pbmZvCitmb3Itc29tZS5iaXoKK2Zvci10aGUuYml6Citmb3Jnb3QuaGVyLm5hbWUKK2ZvcmdvdC5oaXMubmFtZQorZnJvbS1hay5jb20KK2Zyb20tYWwuY29tCitmcm9tLWFyLmNvbQorZnJvbS1hei5uZXQKK2Zyb20tY2EuY29tCitmcm9tLWNvLm5ldAorZnJvbS1jdC5jb20KK2Zyb20tZGMuY29tCitmcm9tLWRlLmNvbQorZnJvbS1mbC5jb20KK2Zyb20tZ2EuY29tCitmcm9tLWhpLmNvbQorZnJvbS1pYS5jb20KK2Zyb20taWQuY29tCitmcm9tLWlsLmNvbQorZnJvbS1pbi5jb20KK2Zyb20ta3MuY29tCitmcm9tLWt5LmNvbQorZnJvbS1sYS5uZXQKK2Zyb20tbWEuY29tCitmcm9tLW1kLmNvbQorZnJvbS1tZS5vcmcKK2Zyb20tbWkuY29tCitmcm9tLW1uLmNvbQorZnJvbS1tby5jb20KK2Zyb20tbXMuY29tCitmcm9tLW10LmNvbQorZnJvbS1uYy5jb20KK2Zyb20tbmQuY29tCitmcm9tLW5lLmNvbQorZnJvbS1uaC5jb20KK2Zyb20tbmouY29tCitmcm9tLW5tLmNvbQorZnJvbS1udi5jb20KK2Zyb20tbnkubmV0Citmcm9tLW9oLmNvbQorZnJvbS1vay5jb20KK2Zyb20tb3IuY29tCitmcm9tLXBhLmNvbQorZnJvbS1wci5jb20KK2Zyb20tcmkuY29tCitmcm9tLXNjLmNvbQorZnJvbS1zZC5jb20KK2Zyb20tdG4uY29tCitmcm9tLXR4LmNvbQorZnJvbS11dC5jb20KK2Zyb20tdmEuY29tCitmcm9tLXZ0LmNvbQorZnJvbS13YS5jb20KK2Zyb20td2kuY29tCitmcm9tLXd2LmNvbQorZnJvbS13eS5jb20KK2Z0cGFjY2Vzcy5jYworZnVldHRlcnRkYXNuZXR6LmRlCitnYW1lLWhvc3Qub3JnCitnYW1lLXNlcnZlci5jYworZ2V0bXlpcC5jb20KK2dldHMtaXQubmV0Citnby5keW5kbnMub3JnCitnb3RkbnMuY29tCitnb3RkbnMub3JnCitncm9rcy10aGUuaW5mbworZ3Jva3MtdGhpcy5pbmZvCitoYW0tcmFkaW8tb3AubmV0CitoZXJlLWZvci1tb3JlLmluZm8KK2hvYmJ5LXNpdGUuY29tCitob2JieS1zaXRlLm9yZworaG9tZS5keW5kbnMub3JnCitob21lZG5zLm9yZworaG9tZWZ0cC5uZXQKK2hvbWVmdHAub3JnCitob21laXAubmV0Citob21lbGludXguY29tCitob21lbGludXgubmV0Citob21lbGludXgub3JnCitob21ldW5peC5jb20KK2hvbWV1bml4Lm5ldAoraG9tZXVuaXgub3JnCitpYW1hbGxhbWEuY29tCitpbi10aGUtYmFuZC5uZXQKK2lzLWEtYW5hcmNoaXN0LmNvbQoraXMtYS1ibG9nZ2VyLmNvbQoraXMtYS1ib29ra2VlcGVyLmNvbQoraXMtYS1icnVpbnNmYW4ub3JnCitpcy1hLWJ1bGxzLWZhbi5jb20KK2lzLWEtY2FuZGlkYXRlLm9yZworaXMtYS1jYXRlcmVyLmNvbQoraXMtYS1jZWx0aWNzZmFuLm9yZworaXMtYS1jaGVmLmNvbQoraXMtYS1jaGVmLm5ldAoraXMtYS1jaGVmLm9yZworaXMtYS1jb25zZXJ2YXRpdmUuY29tCitpcy1hLWNwYS5jb20KK2lzLWEtY3ViaWNsZS1zbGF2ZS5jb20KK2lzLWEtZGVtb2NyYXQuY29tCitpcy1hLWRlc2lnbmVyLmNvbQoraXMtYS1kb2N0b3IuY29tCitpcy1hLWZpbmFuY2lhbGFkdmlzb3IuY29tCitpcy1hLWdlZWsuY29tCitpcy1hLWdlZWsubmV0Citpcy1hLWdlZWsub3JnCitpcy1hLWdyZWVuLmNvbQoraXMtYS1ndXJ1LmNvbQoraXMtYS1oYXJkLXdvcmtlci5jb20KK2lzLWEtaHVudGVyLmNvbQoraXMtYS1rbmlnaHQub3JnCitpcy1hLWxhbmRzY2FwZXIuY29tCitpcy1hLWxhd3llci5jb20KK2lzLWEtbGliZXJhbC5jb20KK2lzLWEtbGliZXJ0YXJpYW4uY29tCitpcy1hLWxpbnV4LXVzZXIub3JnCitpcy1hLWxsYW1hLmNvbQoraXMtYS1tdXNpY2lhbi5jb20KK2lzLWEtbmFzY2FyZmFuLmNvbQoraXMtYS1udXJzZS5jb20KK2lzLWEtcGFpbnRlci5jb20KK2lzLWEtcGF0c2Zhbi5vcmcKK2lzLWEtcGVyc29uYWx0cmFpbmVyLmNvbQoraXMtYS1waG90b2dyYXBoZXIuY29tCitpcy1hLXBsYXllci5jb20KK2lzLWEtcmVwdWJsaWNhbi5jb20KK2lzLWEtcm9ja3N0YXIuY29tCitpcy1hLXNvY2lhbGlzdC5jb20KK2lzLWEtc294ZmFuLm9yZworaXMtYS1zdHVkZW50LmNvbQoraXMtYS10ZWFjaGVyLmNvbQoraXMtYS10ZWNoaWUuY29tCitpcy1hLXRoZXJhcGlzdC5jb20KK2lzLWFuLWFjY291bnRhbnQuY29tCitpcy1hbi1hY3Rvci5jb20KK2lzLWFuLWFjdHJlc3MuY29tCitpcy1hbi1hbmFyY2hpc3QuY29tCitpcy1hbi1hcnRpc3QuY29tCitpcy1hbi1lbmdpbmVlci5jb20KK2lzLWFuLWVudGVydGFpbmVyLmNvbQoraXMtYnkudXMKK2lzLWNlcnRpZmllZC5jb20KK2lzLWZvdW5kLm9yZworaXMtZ29uZS5jb20KK2lzLWludG8tYW5pbWUuY29tCitpcy1pbnRvLWNhcnMuY29tCitpcy1pbnRvLWNhcnRvb25zLmNvbQoraXMtaW50by1nYW1lcy5jb20KK2lzLWxlZXQuY29tCitpcy1sb3N0Lm9yZworaXMtbm90LWNlcnRpZmllZC5jb20KK2lzLXNhdmVkLm9yZworaXMtc2xpY2suY29tCitpcy11YmVybGVldC5jb20KK2lzLXZlcnktYmFkLm9yZworaXMtdmVyeS1ldmlsLm9yZworaXMtdmVyeS1nb29kLm9yZworaXMtdmVyeS1uaWNlLm9yZworaXMtdmVyeS1zd2VldC5vcmcKK2lzLXdpdGgtdGhlYmFuZC5jb20KK2lzYS1nZWVrLmNvbQoraXNhLWdlZWsubmV0Citpc2EtZ2Vlay5vcmcKK2lzYS1ob2NrZXludXQuY29tCitpc3NtYXJ0ZXJ0aGFueW91LmNvbQoraXN0ZWluZ2Vlay5kZQoraXN0bWVpbi5kZQora2lja3MtYXNzLm5ldAora2lja3MtYXNzLm9yZwora25vd3NpdGFsbC5pbmZvCitsYW5kLTQtc2FsZS51cworbGVidGltbmV0ei5kZQorbGVpdHVuZ3Nlbi5kZQorbGlrZXMtcGllLmNvbQorbGlrZXNjYW5keS5jb20KK21lcnNlaW5lLm51CittaW5lLm51CittaXNjb25mdXNlZC5vcmcKK215cGV0cy53cworbXlwaG90b3MuY2MKK25lYXQtdXJsLmNvbQorb2ZmaWNlLW9uLXRoZS5uZXQKK29uLXRoZS13ZWIudHYKK3BvZHpvbmUubmV0Citwb2R6b25lLm9yZworcmVhZG15YmxvZy5vcmcKK3NhdmVzLXRoZS13aGFsZXMuY29tCitzY3JhcHBlci1zaXRlLm5ldAorc2NyYXBwaW5nLmNjCitzZWxmaXAuYml6CitzZWxmaXAuY29tCitzZWxmaXAuaW5mbworc2VsZmlwLm5ldAorc2VsZmlwLm9yZworc2VsbHMtZm9yLWxlc3MuY29tCitzZWxscy1mb3ItdS5jb20KK3NlbGxzLWl0Lm5ldAorc2VsbHN5b3VyaG9tZS5vcmcKK3NlcnZlYmJzLmNvbQorc2VydmViYnMubmV0CitzZXJ2ZWJicy5vcmcKK3NlcnZlZnRwLm5ldAorc2VydmVmdHAub3JnCitzZXJ2ZWdhbWUub3JnCitzaGFja25ldC5udQorc2ltcGxlLXVybC5jb20KK3NwYWNlLXRvLXJlbnQuY29tCitzdHVmZi00LXNhbGUub3JnCitzdHVmZi00LXNhbGUudXMKK3RlYWNoZXMteW9nYS5jb20KK3RocnVoZXJlLm5ldAordHJhZXVtdGdlcmFkZS5kZQord2ViaG9wLmJpegord2ViaG9wLmluZm8KK3dlYmhvcC5uZXQKK3dlYmhvcC5vcmcKK3dvcnNlLXRoYW4udHYKK3dyaXRlc3RoaXNibG9nLmNvbQorCisvLyBkZG5zcy5kZSA6IGh0dHBzOi8vd3d3LmRkbnNzLmRlLworLy8gU3VibWl0dGVkIGJ5IFJvYmVydCBOaWVkemllbGEgPHdlYm1hc3RlckBkZG5zcy5kZT4KK2RkbnNzLmRlCitkeW4uZGRuc3MuZGUKK2R5bmRucy5kZG5zcy5kZQorZHluZG5zMS5kZQorZHluLWlwMjQuZGUKK2hvbWUtd2Vic2VydmVyLmRlCitkeW4uaG9tZS13ZWJzZXJ2ZXIuZGUKK215aG9tZS1zZXJ2ZXIuZGUKK2RkbnNzLm9yZworCisvLyBEZWZpbmltYSA6IGh0dHA6Ly93d3cuZGVmaW5pbWEuY29tLworLy8gU3VibWl0dGVkIGJ5IE1heGVuY2UgQml0dGVybGkgPG1heGVuY2VAZGVmaW5pbWEuY29tPgorZGVmaW5pbWEubmV0CitkZWZpbmltYS5pbworCisvLyBEeW51LmNvbSA6IGh0dHBzOi8vd3d3LmR5bnUuY29tLworLy8gU3VibWl0dGVkIGJ5IFN1ZSBZZSA8c3VlQGR5bnUuY29tPgorZGRuc2ZyZWUuY29tCitkZG5zZ2Vlay5jb20KK2dpaXplLmNvbQorZ2xlZXplLmNvbQora296b3cuY29tCitsb3NleW91cmlwLmNvbQorb29ndXkuY29tCit0aGV3b3JrcGMuY29tCitjYXNhY2FtLm5ldAorZHludS5uZXQKK2FjY2Vzc2NhbS5vcmcKK2NhbWR2ci5vcmcKK2ZyZWVkZG5zLm9yZworbXl3aXJlLm9yZword2VicmVkaXJlY3Qub3JnCitteWRkbnMucm9ja3MKK2Jsb2dzaXRlLnh5egorCisvLyBkeW52NiA6IGh0dHBzOi8vZHludjYuY29tCisvLyBTdWJtaXR0ZWQgYnkgRG9taW5payBNZW5rZSA8ZG9tQGRpZ2luZW8uZGU+CitkeW52Ni5uZXQKKworLy8gRTRZT1Ugc3BvbC4gcy5yLm8uIDogaHR0cHM6Ly9lNHlvdS5jei8KKy8vIFN1Ym1pdHRlZCBieSBWbGFkaW1pciBEdWRyIDxpbmZvQGU0eW91LmN6PgorZTQuY3oKKworLy8gRW5hbGVhbiBTQVM6IGh0dHBzOi8vd3d3LmVuYWxlYW4uY29tCisvLyBTdWJtaXR0ZWQgYnkgVGhvbWFzIENvdHRpZXIgPHRob21hcy5jb3R0aWVyQGVuYWxlYW4uY29tPgorbXl0dWxlYXAuY29tCisKKy8vIEVub25pYyA6IGh0dHA6Ly9lbm9uaWMuY29tLworLy8gU3VibWl0dGVkIGJ5IEVyaWsgS2FhcmVuZy1TdW5kZSA8ZXN1QGVub25pYy5jb20+Citlbm9uaWMuaW8KK2N1c3RvbWVyLmVub25pYy5pbworCisvLyBFVS5vcmcgaHR0cHM6Ly9ldS5vcmcvCisvLyBTdWJtaXR0ZWQgYnkgUGllcnJlIEJleXNzYWMgPGhvc3RtYXN0ZXJAZXUub3JnPgorZXUub3JnCithbC5ldS5vcmcKK2Fzc28uZXUub3JnCithdC5ldS5vcmcKK2F1LmV1Lm9yZworYmUuZXUub3JnCitiZy5ldS5vcmcKK2NhLmV1Lm9yZworY2QuZXUub3JnCitjaC5ldS5vcmcKK2NuLmV1Lm9yZworY3kuZXUub3JnCitjei5ldS5vcmcKK2RlLmV1Lm9yZworZGsuZXUub3JnCitlZHUuZXUub3JnCitlZS5ldS5vcmcKK2VzLmV1Lm9yZworZmkuZXUub3JnCitmci5ldS5vcmcKK2dyLmV1Lm9yZworaHIuZXUub3JnCitodS5ldS5vcmcKK2llLmV1Lm9yZworaWwuZXUub3JnCitpbi5ldS5vcmcKK2ludC5ldS5vcmcKK2lzLmV1Lm9yZworaXQuZXUub3JnCitqcC5ldS5vcmcKK2tyLmV1Lm9yZworbHQuZXUub3JnCitsdS5ldS5vcmcKK2x2LmV1Lm9yZworbWMuZXUub3JnCittZS5ldS5vcmcKK21rLmV1Lm9yZworbXQuZXUub3JnCitteS5ldS5vcmcKK25ldC5ldS5vcmcKK25nLmV1Lm9yZworbmwuZXUub3JnCituby5ldS5vcmcKK256LmV1Lm9yZworcGFyaXMuZXUub3JnCitwbC5ldS5vcmcKK3B0LmV1Lm9yZworcS1hLmV1Lm9yZworcm8uZXUub3JnCitydS5ldS5vcmcKK3NlLmV1Lm9yZworc2kuZXUub3JnCitzay5ldS5vcmcKK3RyLmV1Lm9yZwordWsuZXUub3JnCit1cy5ldS5vcmcKKworLy8gRXZlbm5vZGUgOiBodHRwOi8vd3d3LmV2ZW5ub2RlLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBNaWNoYWwgS3JhbGlrIDxzdXBwb3J0QGV2ZW5ub2RlLmNvbT4KK2V1LTEuZXZlbm5vZGUuY29tCitldS0yLmV2ZW5ub2RlLmNvbQorZXUtMy5ldmVubm9kZS5jb20KK2V1LTQuZXZlbm5vZGUuY29tCit1cy0xLmV2ZW5ub2RlLmNvbQordXMtMi5ldmVubm9kZS5jb20KK3VzLTMuZXZlbm5vZGUuY29tCit1cy00LmV2ZW5ub2RlLmNvbQorCisvLyBlRGlyZWN0IENvcnAuIDogaHR0cHM6Ly9ob3N0aW5nLnVybC5jb20udHcvCisvLyBTdWJtaXR0ZWQgYnkgQy5TLiBjaGFuZyA8Y3NjaGFuZ0Bjb3JwLnVybC5jb20udHc+Cit0d21haWwuY2MKK3R3bWFpbC5uZXQKK3R3bWFpbC5vcmcKK215bWFpbGVyLmNvbS50dwordXJsLnR3CisKKy8vIEZhY2Vib29rLCBJbmMuCisvLyBTdWJtaXR0ZWQgYnkgUGV0ZXIgUnVpYmFsIDxwdWJsaWMtc3VmZml4QGZiLmNvbT4KK2FwcHMuZmJzYnguY29tCisKKy8vIEZBSVRJRCA6IGh0dHBzOi8vZmFpdGlkLm9yZy8KKy8vIFN1Ym1pdHRlZCBieSBNYXhpbSBBbHpvYmEgPHRlY2guY29udGFjdEBmYWl0aWQub3JnPgorLy8gaHR0cHM6Ly93d3cuZmxleGlyZWcubmV0L3N0YXRfaW5mbworcnUubmV0CithZHlnZXlhLnJ1CitiYXNoa2lyaWEucnUKK2Jpci5ydQorY2JnLnJ1Citjb20ucnUKK2RhZ2VzdGFuLnJ1Citncm96bnkucnUKK2thbG15a2lhLnJ1CitrdXN0YW5haS5ydQorbWFyaW5lLnJ1Cittb3Jkb3ZpYS5ydQorbXNrLnJ1CitteXRpcy5ydQorbmFsY2hpay5ydQorbm92LnJ1CitweWF0aWdvcnNrLnJ1CitzcGIucnUKK3ZsYWRpa2F2a2F6LnJ1Cit2bGFkaW1pci5ydQorYWJraGF6aWEuc3UKK2FkeWdleWEuc3UKK2FrdHl1Ymluc2suc3UKK2Fya2hhbmdlbHNrLnN1Cithcm1lbmlhLnN1Cithc2hnYWJhZC5zdQorYXplcmJhaWphbi5zdQorYmFsYXNob3Yuc3UKK2Jhc2hraXJpYS5zdQorYnJ5YW5zay5zdQorYnVraGFyYS5zdQorY2hpbWtlbnQuc3UKK2RhZ2VzdGFuLnN1CitlYXN0LWthemFraHN0YW4uc3UKK2V4bmV0LnN1CitnZW9yZ2lhLnN1Citncm96bnkuc3UKK2l2YW5vdm8uc3UKK2phbWJ5bC5zdQora2FsbXlraWEuc3UKK2thbHVnYS5zdQora2FyYWNvbC5zdQora2FyYWdhbmRhLnN1CitrYXJlbGlhLnN1CitraGFrYXNzaWEuc3UKK2tyYXNub2Rhci5zdQora3VyZ2FuLnN1CitrdXN0YW5haS5zdQorbGVudWcuc3UKK21hbmd5c2hsYWsuc3UKK21vcmRvdmlhLnN1Cittc2suc3UKK211cm1hbnNrLnN1CituYWxjaGlrLnN1CituYXZvaS5zdQorbm9ydGgta2F6YWtoc3Rhbi5zdQorbm92LnN1CitvYm5pbnNrLnN1CitwZW56YS5zdQorcG9rcm92c2suc3UKK3NvY2hpLnN1CitzcGIuc3UKK3Rhc2hrZW50LnN1Cit0ZXJtZXouc3UKK3RvZ2xpYXR0aS5zdQordHJvaXRzay5zdQordHNlbGlub2dyYWQuc3UKK3R1bGEuc3UKK3R1dmEuc3UKK3ZsYWRpa2F2a2F6LnN1Cit2bGFkaW1pci5zdQordm9sb2dkYS5zdQorCisvLyBGYXN0bHkgSW5jLiA6IGh0dHA6Ly93d3cuZmFzdGx5LmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBGYXN0bHkgU2VjdXJpdHkgPHNlY3VyaXR5QGZhc3RseS5jb20+CitmYXN0bHlsYi5uZXQKK21hcC5mYXN0bHlsYi5uZXQKK2ZyZWV0bHMuZmFzdGx5Lm5ldAorbWFwLmZhc3RseS5uZXQKK2EucHJvZC5mYXN0bHkubmV0CitnbG9iYWwucHJvZC5mYXN0bHkubmV0CithLnNzbC5mYXN0bHkubmV0CitiLnNzbC5mYXN0bHkubmV0CitnbG9iYWwuc3NsLmZhc3RseS5uZXQKKworLy8gRmVhdGhlcmhlYWQgOiBodHRwczovL2ZlYXRoZXJoZWFkLnh5ei8KKy8vIFN1Ym1pdHRlZCBieSBTaW1vbiBNZW5rZSA8c2ltb25AZmVhdGhlcmhlYWQueHl6PgorZmhhcHAueHl6CisKKy8vIEZlZG9yYSA6IGh0dHBzOi8vZmVkb3JhcHJvamVjdC5vcmcvCisvLyBzdWJtaXR0ZWQgYnkgUGF0cmljayBVaXRlcndpamsgPHB1aXRlcndpamtAZmVkb3JhcHJvamVjdC5vcmc+CitmZWRvcmFpbmZyYWNsb3VkLm9yZworZmVkb3JhcGVvcGxlLm9yZworY2xvdWQuZmVkb3JhcHJvamVjdC5vcmcKKworLy8gRmlsZWdlYXIgSW5jLiA6IGh0dHBzOi8vd3d3LmZpbGVnZWFyLmNvbQorLy8gU3VibWl0dGVkIGJ5IEphc29uIFpodSA8amFzb25Ab3d0d2FyZS5jb20+CitmaWxlZ2Vhci5tZQorCisvLyBGaXJlYmFzZSwgSW5jLgorLy8gU3VibWl0dGVkIGJ5IENocmlzIFJheW5vciA8Y2hyaXNAZmlyZWJhc2UuY29tPgorZmlyZWJhc2VhcHAuY29tCisKKy8vIEZseW5uIDogaHR0cHM6Ly9mbHlubi5pbworLy8gU3VibWl0dGVkIGJ5IEpvbmF0aGFuIFJ1ZGVuYmVyZyA8am9uYXRoYW5AZmx5bm4uaW8+CitmbHlubmh1Yi5jb20KK2ZseW5uaG9zdGluZy5uZXQKKworLy8gRnJlZWJveCA6IGh0dHA6Ly93d3cuZnJlZWJveC5mcgorLy8gU3VibWl0dGVkIGJ5IFJvbWFpbiBGbGllZGVsIDxyZmxpZWRlbEBmcmVlYm94LmZyPgorZnJlZWJveC1vcy5jb20KK2ZyZWVib3hvcy5jb20KK2ZieC1vcy5mcgorZmJ4b3MuZnIKK2ZyZWVib3gtb3MuZnIKK2ZyZWVib3hvcy5mcgorCisvLyBGdXNpb24gSW50cmFuZXQgOiBodHRwczovL3d3dy5mdXNpb24taW50cmFuZXQuY29tCisvLyBTdWJtaXR0ZWQgYnkgTWF0dGhpYXMgQnVydHNjaGVyIDxtYXR0aGlhcy5idXJ0c2NoZXJAZnVzb25pYy5uZXQ+CitteWZ1c2lvbi5jbG91ZAorCisvLyBGdXR1cmV3ZWIgT0cgOiBodHRwOi8vd3d3LmZ1dHVyZXdlYi5hdAorLy8gU3VibWl0dGVkIGJ5IEFuZHJlYXMgU2NobmVkZXJsZS1XYWduZXIgPHNjaG5lZGVybGVAZnV0dXJld2ViLmF0PgorZnV0dXJlaG9zdGluZy5hdAorZnV0dXJlbWFpbGluZy5hdAorKi5leC5vcnRzaW5mby5hdAorKi5rdW5kZW4ub3J0c2luZm8uYXQKKyouc3RhdGljcy5jbG91ZAorCisvLyBHRFMgOiBodHRwczovL3d3dy5nb3YudWsvc2VydmljZS1tYW51YWwvb3BlcmF0aW9ucy9vcGVyYXRpbmctc2VydmljZWdvdnVrLXN1YmRvbWFpbnMKKy8vIFN1Ym1pdHRlZCBieSBEYXZpZCBJbGxzbGV5IDxkYXZpZC5pbGxzbGV5QGRpZ2l0YWwuY2FiaW5ldC1vZmZpY2UuZ292LnVrPgorc2VydmljZS5nb3YudWsKKworLy8gR2l0SHViLCBJbmMuCisvLyBTdWJtaXR0ZWQgYnkgUGF0cmljayBUb29tZXkgPHNlY3VyaXR5QGdpdGh1Yi5jb20+CitnaXRodWIuaW8KK2dpdGh1YnVzZXJjb250ZW50LmNvbQorCisvLyBHaXRMYWIsIEluYy4KKy8vIFN1Ym1pdHRlZCBieSBBbGV4IEhhbnNlbGthIDxhbGV4QGdpdGxhYi5jb20+CitnaXRsYWIuaW8KKworLy8gVUtIb21lT2ZmaWNlIDogaHR0cHM6Ly93d3cuZ292LnVrL2dvdmVybm1lbnQvb3JnYW5pc2F0aW9ucy9ob21lLW9mZmljZQorLy8gU3VibWl0dGVkIGJ5IEpvbiBTaGFua3MgPGpvbi5zaGFua3NAZGlnaXRhbC5ob21lb2ZmaWNlLmdvdi51az4KK2hvbWVvZmZpY2UuZ292LnVrCisKKy8vIEdsb2JlSG9zdGluZywgSW5jLgorLy8gU3VibWl0dGVkIGJ5IFpvbHRhbiBFZ3Jlc2kgPGVncmVzaUBnbG9iZWhvc3RpbmcuY29tPgorcm8uaW0KK3Nob3Aucm8KKworLy8gR29JUCBETlMgU2VydmljZXMgOiBodHRwOi8vd3d3LmdvaXAuZGUKKy8vIFN1Ym1pdHRlZCBieSBDaHJpc3RpYW4gUG91bHRlciA8bWlsY2hzdHJhc3NlQGdvaXAuZGU+Citnb2lwLmRlCisKKy8vIEdvb2dsZSwgSW5jLgorLy8gU3VibWl0dGVkIGJ5IEVkdWFyZG8gVmVsYSA8ZXZuQGdvb2dsZS5jb20+CisqLjBlbW0uY29tCithcHBzcG90LmNvbQorYmxvZ3Nwb3QuYWUKK2Jsb2dzcG90LmFsCitibG9nc3BvdC5hbQorYmxvZ3Nwb3QuYmEKK2Jsb2dzcG90LmJlCitibG9nc3BvdC5iZworYmxvZ3Nwb3QuYmoKK2Jsb2dzcG90LmNhCitibG9nc3BvdC5jZgorYmxvZ3Nwb3QuY2gKK2Jsb2dzcG90LmNsCitibG9nc3BvdC5jby5hdAorYmxvZ3Nwb3QuY28uaWQKK2Jsb2dzcG90LmNvLmlsCitibG9nc3BvdC5jby5rZQorYmxvZ3Nwb3QuY28ubnoKK2Jsb2dzcG90LmNvLnVrCitibG9nc3BvdC5jby56YQorYmxvZ3Nwb3QuY29tCitibG9nc3BvdC5jb20uYXIKK2Jsb2dzcG90LmNvbS5hdQorYmxvZ3Nwb3QuY29tLmJyCitibG9nc3BvdC5jb20uYnkKK2Jsb2dzcG90LmNvbS5jbworYmxvZ3Nwb3QuY29tLmN5CitibG9nc3BvdC5jb20uZWUKK2Jsb2dzcG90LmNvbS5lZworYmxvZ3Nwb3QuY29tLmVzCitibG9nc3BvdC5jb20ubXQKK2Jsb2dzcG90LmNvbS5uZworYmxvZ3Nwb3QuY29tLnRyCitibG9nc3BvdC5jb20udXkKK2Jsb2dzcG90LmN2CitibG9nc3BvdC5jegorYmxvZ3Nwb3QuZGUKK2Jsb2dzcG90LmRrCitibG9nc3BvdC5maQorYmxvZ3Nwb3QuZnIKK2Jsb2dzcG90LmdyCitibG9nc3BvdC5oaworYmxvZ3Nwb3QuaHIKK2Jsb2dzcG90Lmh1CitibG9nc3BvdC5pZQorYmxvZ3Nwb3QuaW4KK2Jsb2dzcG90LmlzCitibG9nc3BvdC5pdAorYmxvZ3Nwb3QuanAKK2Jsb2dzcG90LmtyCitibG9nc3BvdC5saQorYmxvZ3Nwb3QubHQKK2Jsb2dzcG90Lmx1CitibG9nc3BvdC5tZAorYmxvZ3Nwb3QubWsKK2Jsb2dzcG90Lm1yCitibG9nc3BvdC5teAorYmxvZ3Nwb3QubXkKK2Jsb2dzcG90Lm5sCitibG9nc3BvdC5ubworYmxvZ3Nwb3QucGUKK2Jsb2dzcG90LnB0CitibG9nc3BvdC5xYQorYmxvZ3Nwb3QucmUKK2Jsb2dzcG90LnJvCitibG9nc3BvdC5ycworYmxvZ3Nwb3QucnUKK2Jsb2dzcG90LnNlCitibG9nc3BvdC5zZworYmxvZ3Nwb3Quc2kKK2Jsb2dzcG90LnNrCitibG9nc3BvdC5zbgorYmxvZ3Nwb3QudGQKK2Jsb2dzcG90LnR3CitibG9nc3BvdC51ZworYmxvZ3Nwb3Qudm4KK2Nsb3VkZnVuY3Rpb25zLm5ldAorY2xvdWQuZ29vZworY29kZXNwb3QuY29tCitnb29nbGVhcGlzLmNvbQorZ29vZ2xlY29kZS5jb20KK3BhZ2VzcGVlZG1vYmlsaXplci5jb20KK3B1Ymxpc2hwcm94eS5jb20KK3dpdGhnb29nbGUuY29tCit3aXRoeW91dHViZS5jb20KKworLy8gSGFzaGJhbmcgOiBodHRwczovL2hhc2hiYW5nLnNoCitoYXNoYmFuZy5zaAorCisvLyBIYXN1cmEgOiBodHRwczovL2hhc3VyYS5pbworLy8gU3VibWl0dGVkIGJ5IFNoYWhpZGggSyBNdWhhbW1lZCA8c2hhaGlkaEBoYXN1cmEuaW8+CitoYXN1cmEtYXBwLmlvCisKKy8vIEhlcGZvcmdlIDogaHR0cHM6Ly93d3cuaGVwZm9yZ2Uub3JnCisvLyBTdWJtaXR0ZWQgYnkgRGF2aWQgR3JlbGxzY2hlaWQgPGFkbWluQGhlcGZvcmdlLm9yZz4KK2hlcGZvcmdlLm9yZworCisvLyBIZXJva3UgOiBodHRwczovL3d3dy5oZXJva3UuY29tLworLy8gU3VibWl0dGVkIGJ5IFRvbSBNYWhlciA8dG1haGVyQGhlcm9rdS5jb20+CitoZXJva3VhcHAuY29tCitoZXJva3Vzc2wuY29tCisKKy8vIEljaSBsYSBMdW5lIDogaHR0cDovL3d3dy5pY2lsYWx1bmUuY29tLworLy8gU3VibWl0dGVkIGJ5IFNpbW9uIE1vcnZhbiA8c2ltb25AaWNpbGFsdW5lLmNvbT4KK21vb25zY2FsZS5uZXQKKworLy8gaWtpLmZpCisvLyBTdWJtaXR0ZWQgYnkgSGFubnUgQXJvbnNzb24gPGhhYUBpa2kuZmk+Citpa2kuZmkKKworLy8gaW5mby5hdCA6IGh0dHA6Ly93d3cuaW5mby5hdC8KK2Jpei5hdAoraW5mby5hdAorCisvLyBpbmZvLmN4IDogaHR0cDovL2luZm8uY3gKKy8vIFN1Ym1pdHRlZCBieSBKYWNvYiBTbGF0ZXIgPHdob2lzQGlnbG9vLnRvPgoraW5mby5jeAorCisvLyBJbnRlcmxlZ2lzIDogaHR0cDovL3d3dy5pbnRlcmxlZ2lzLmxlZy5icgorLy8gU3VibWl0dGVkIGJ5IEdhYnJpZWwgRmVycmVpcmEgPHJlZ2lzdHJvYnJAaW50ZXJsZWdpcy5sZWcuYnI+CithYy5sZWcuYnIKK2FsLmxlZy5icgorYW0ubGVnLmJyCithcC5sZWcuYnIKK2JhLmxlZy5icgorY2UubGVnLmJyCitkZi5sZWcuYnIKK2VzLmxlZy5icgorZ28ubGVnLmJyCittYS5sZWcuYnIKK21nLmxlZy5icgorbXMubGVnLmJyCittdC5sZWcuYnIKK3BhLmxlZy5icgorcGIubGVnLmJyCitwZS5sZWcuYnIKK3BpLmxlZy5icgorcHIubGVnLmJyCityai5sZWcuYnIKK3JuLmxlZy5icgorcm8ubGVnLmJyCityci5sZWcuYnIKK3JzLmxlZy5icgorc2MubGVnLmJyCitzZS5sZWcuYnIKK3NwLmxlZy5icgordG8ubGVnLmJyCisKKy8vIElQaUZvbnkgU3lzdGVtcywgSW5jLiA6IGh0dHBzOi8vd3d3LmlwaWZvbnkuY29tLworLy8gU3VibWl0dGVkIGJ5IE1hdHRoZXcgSGFyZGVtYW4gPG1oYXJkZW1hbkBpcGlmb255LmNvbT4KK2lwaWZvbnkubmV0CisKKy8vIEpveWVudCA6IGh0dHBzOi8vd3d3LmpveWVudC5jb20vCisvLyBTdWJtaXR0ZWQgYnkgQnJpYW4gQmVubmV0dCA8YnJpYW4uYmVubmV0dEBqb3llbnQuY29tPgorKi50cml0b24uem9uZQorKi5jbnMuam95ZW50LmNvbQorCisvLyBKUy5PUkcgOiBodHRwOi8vZG5zLmpzLm9yZworLy8gU3VibWl0dGVkIGJ5IFN0ZWZhbiBLZWltIDxhZG1pbkBqcy5vcmc+Citqcy5vcmcKKworLy8gS2V5d2ViIEFHIDogaHR0cHM6Ly93d3cua2V5d2ViLmRlCisvLyBTdWJtaXR0ZWQgYnkgTWFydGluIERhbm5laGwgPHBvc3RtYXN0ZXJAa2V5bWFjaGluZS5kZT4KK2tleW1hY2hpbmUuZGUKKworLy8gS25pZ2h0UG9pbnQgU3lzdGVtcywgTExDIDogaHR0cDovL3d3dy5rbmlnaHRwb2ludC5jb20vCisvLyBTdWJtaXR0ZWQgYnkgUm95IEtlZW5lIDxya2VlbmVAa25pZ2h0cG9pbnQuY29tPgora25pZ2h0cG9pbnQuc3lzdGVtcworCisvLyAuS1JEIDogaHR0cDovL25pYy5rcmQvZGF0YS9rcmQvUmVnaXN0cmF0aW9uJTIwUG9saWN5LnBkZgorY28ua3JkCitlZHUua3JkCisKKy8vIExDdWJlIC0gUHJvZmVzc2lvbmFsIGhvc3RpbmcgZS5LLiA6IGh0dHBzOi8vd3d3LmxjdWJlLXdlYmhvc3RpbmcuZGUKKy8vIFN1Ym1pdHRlZCBieSBMYXJzIExhZWhuIDxpbmZvQGxjdWJlLmRlPgorZ2l0LXJlcG9zLmRlCitsY3ViZS1zZXJ2ZXIuZGUKK3N2bi1yZXBvcy5kZQorCisvLyBMaXF1aWROZXQgTHRkIDogaHR0cDovL3d3dy5saXF1aWRuZXRsaW1pdGVkLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBWaWN0b3IgVmVsY2hldiA8YWRtaW5AbGlxdWlkbmV0bGltaXRlZC5jb20+Cit3ZS5icworCisvLyBMdWthbmV0IEx0ZCA6IGh0dHBzOi8vbHVrYW5ldC5jb20KKy8vIFN1Ym1pdHRlZCBieSBBbnRvbiBBdnJhbW92IDxyZWdpc3RlckBsdWthbmV0LmNvbT4KK2JhcnN5LmJnCitiYXJzeW9ubGluZS5jb20KK2JhcnN5LmRlCitiYXJzeS5ldQorYmFyc3kuaW4KK2JhcnN5Lm5ldAorYmFyc3kub25saW5lCitiYXJzeS5zdXBwb3J0CisKKy8vIE1hZ2VudG8gQ29tbWVyY2UKKy8vIFN1Ym1pdHRlZCBieSBEYW1pZW4gVG91cm5vdWQgPGR0b3Vybm91ZEBtYWdlbnRvLmNsb3VkPgorKi5tYWdlbnRvc2l0ZS5jbG91ZAorCisvLyBNYWlsLlJ1IEdyb3VwIDogaHR0cHM6Ly9oYi5jbGRtYWlsLnJ1CisvLyBTdWJtaXR0ZWQgYnkgSWx5YSBaYXJldHNraXkgPHphcmV0c2tpeUBjb3JwLm1haWwucnU+CitoYi5jbGRtYWlsLnJ1CisKKy8vIE1ldGFDZW50cnVtLCBDRVNORVQgei5zLnAuby4gOiBodHRwczovL3d3dy5tZXRhY2VudHJ1bS5jei9lbi8KKy8vIFN1Ym1pdHRlZCBieSBaZGVuxJtrIMWgdXN0ciA8emRlbmVrLnN1c3RyQGNlc25ldC5jej4KK2Nsb3VkLm1ldGFjZW50cnVtLmN6CitjdXN0b20ubWV0YWNlbnRydW0uY3oKKworLy8gTWV0ZW9yIERldmVsb3BtZW50IEdyb3VwIDogaHR0cHM6Ly93d3cubWV0ZW9yLmNvbS9ob3N0aW5nCisvLyBTdWJtaXR0ZWQgYnkgUGllcnJlIENhcnJpZXIgPHBpZXJyZUBtZXRlb3IuY29tPgorbWV0ZW9yYXBwLmNvbQorZXUubWV0ZW9yYXBwLmNvbQorCisvLyBNaWNoYXUgRW50ZXJwcmlzZXMgTGltaXRlZCA6IGh0dHA6Ly93d3cuY28ucGwvCitjby5wbAorCisvLyBNaWNyb3NvZnQgOiBodHRwOi8vbWljcm9zb2Z0LmNvbQorLy8gU3VibWl0dGVkIGJ5IEJhcnJ5IERvcnJhbnMgPGJkb3JyYW5zQG1pY3Jvc29mdC5jb20+CithenVyZXdlYnNpdGVzLm5ldAorYXp1cmUtbW9iaWxlLm5ldAorY2xvdWRhcHAubmV0CisKKy8vIE1vemlsbGEgRm91bmRhdGlvbiA6IGh0dHBzOi8vbW96aWxsYS5vcmcvCisvLyBTdWJtaXR0ZWQgYnkgZ2xvYiA8Z2xvYkBtb3ppbGxhLmNvbT4KK2Jtb2F0dGFjaG1lbnRzLm9yZworCisvLyBNU0stSVggOiBodHRwczovL3d3dy5tc2staXgucnUvCisvLyBTdWJtaXR0ZWQgYnkgS2hhbm5hbm92IFJvbWFuIDxyLmtoYW5uYW5vdkBtc2staXgucnU+CituZXQucnUKK29yZy5ydQorcHAucnUKKworLy8gTmV0bGlmeSA6IGh0dHBzOi8vd3d3Lm5ldGxpZnkuY29tCisvLyBTdWJtaXR0ZWQgYnkgSmVzc2ljYSBQYXJzb25zIDxqZXNzaWNhQG5ldGxpZnkuY29tPgorYml0YmFsbG9vbi5jb20KK25ldGxpZnkuY29tCisKKy8vIE5ldXN0YXIgSW5jLgorLy8gU3VibWl0dGVkIGJ5IFRydW5nIFRyYW4gPFRydW5nLlRyYW5AbmV1c3Rhci5iaXo+Cis0dS5jb20KKworLy8gbmdyb2sgOiBodHRwczovL25ncm9rLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBBbGFuIFNocmV2ZSA8YWxhbkBuZ3Jvay5jb20+CituZ3Jvay5pbworCisvLyBORlNOLCBJbmMuIDogaHR0cHM6Ly93d3cuTmVhcmx5RnJlZVNwZWVjaC5ORVQvCisvLyBTdWJtaXR0ZWQgYnkgSmVmZiBXaGVlbGhvdXNlIDxzdXBwb3J0QG5lYXJseWZyZWVzcGVlY2gubmV0PgorbmZzaG9zdC5jb20KKworLy8gbnN1cGRhdGUuaW5mbyA6IGh0dHBzOi8vd3d3Lm5zdXBkYXRlLmluZm8vCisvLyBTdWJtaXR0ZWQgYnkgVGhvbWFzIFdhbGRtYW5uIDxpbmZvQG5zdXBkYXRlLmluZm8+Cituc3VwZGF0ZS5pbmZvCituZXJkcG9sLm92aAorCisvLyBOby1JUC5jb20gOiBodHRwczovL25vaXAuY29tLworLy8gU3VibWl0dGVkIGJ5IERldmVuIFJlemEgPHB1YmxpY3N1ZmZpeGxpc3RAbm9pcC5jb20+CitibG9nc3l0ZS5jb20KK2JyYXNpbGlhLm1lCitjYWJsZS1tb2RlbS5vcmcKK2Npc2NvZnJlYWsuY29tCitjb2xsZWdlZmFuLm9yZworY291Y2hwb3RhdG9mcmllcy5vcmcKK2RhbW5zZXJ2ZXIuY29tCitkZG5zLm1lCitkaXRjaHlvdXJpcC5jb20KK2Ruc2Zvci5tZQorZG5zaXNraW5reS5jb20KK2R2cmNhbS5pbmZvCitkeW5ucy5jb20KK2VhdGluZy1vcmdhbmljLm5ldAorZmFudGFzeWxlYWd1ZS5jYworZ2Vla2dhbGF4eS5jb20KK2dvbGZmYW4udXMKK2hlYWx0aC1jYXJlcmVmb3JtLmNvbQoraG9tZXNlY3VyaXR5bWFjLmNvbQoraG9tZXNlY3VyaXR5cGMuY29tCitob3B0by5tZQoraWxvdmVjb2xsZWdlLmluZm8KK2xvZ2ludG8ubWUKK21sYmZhbi5vcmcKK21tYWZhbi5iaXoKK215YWN0aXZlZGlyZWN0b3J5LmNvbQorbXlkaXNzZW50Lm5ldAorbXllZmZlY3QubmV0CitteW1lZGlhcGMubmV0CitteXBzeC5uZXQKK215c2VjdXJpdHljYW1lcmEuY29tCitteXNlY3VyaXR5Y2FtZXJhLm5ldAorbXlzZWN1cml0eWNhbWVyYS5vcmcKK25ldC1mcmVha3MuY29tCituZmxmYW4ub3JnCituaGxmYW4ubmV0Cituby1pcC5jYQorbm8taXAuY28udWsKK25vLWlwLm5ldAorbm9pcC51cworb250aGV3aWZpLmNvbQorcGdhZmFuLm5ldAorcG9pbnQydGhpcy5jb20KK3BvaW50dG8udXMKK3ByaXZhdGl6ZWhlYWx0aGluc3VyYW5jZS5uZXQKK3F1aWNrc3l0ZXMuY29tCityZWFkLWJvb2tzLm9yZworc2VjdXJpdHl0YWN0aWNzLmNvbQorc2VydmVleGNoYW5nZS5jb20KK3NlcnZlaHVtb3VyLmNvbQorc2VydmVwMnAuY29tCitzZXJ2ZXNhcmNhc20uY29tCitzdHVmZnRvcmVhZC5jb20KK3VmY2Zhbi5vcmcKK3VudXN1YWxwZXJzb24uY29tCit3b3JraXNib3JpbmcuY29tCiszdXRpbGl0aWVzLmNvbQorYm91bmNlbWUubmV0CitkZG5zLm5ldAorZGRuc2tpbmcuY29tCitnb3RkbnMuY2gKK2hvcHRvLm9yZworbXlmdHAuYml6CitteWZ0cC5vcmcKK215dm5jLmNvbQorbm8taXAuYml6Cituby1pcC5pbmZvCituby1pcC5vcmcKK25vaXAubWUKK3JlZGlyZWN0bWUubmV0CitzZXJ2ZWJlZXIuY29tCitzZXJ2ZWJsb2cubmV0CitzZXJ2ZWNvdW50ZXJzdHJpa2UuY29tCitzZXJ2ZWZ0cC5jb20KK3NlcnZlZ2FtZS5jb20KK3NlcnZlaGFsZmxpZmUuY29tCitzZXJ2ZWh0dHAuY29tCitzZXJ2ZWlyYy5jb20KK3NlcnZlbWluZWNyYWZ0Lm5ldAorc2VydmVtcDMuY29tCitzZXJ2ZXBpY3MuY29tCitzZXJ2ZXF1YWtlLmNvbQorc3l0ZXMubmV0Cit3ZWJob3AubWUKK3phcHRvLm9yZworCisvLyBOb2RlQXJ0IDogaHR0cHM6Ly9ub2RlYXJ0LmlvCisvLyBTdWJtaXR0ZWQgYnkgS29uc3RhbnRpbiBOb3NvdiA8Tm9zb3ZAbm9kZWFydC5pbz4KK3N0YWdlLm5vZGVhcnQuaW8KKworLy8gTm9kdW0gQi5WLiA6IGh0dHBzOi8vbm9kdW0uaW8vCisvLyBTdWJtaXR0ZWQgYnkgV2lldHNlIFdpbmQgPGhlbGxvK3B1YmxpY3N1ZmZpeGxpc3RAbm9kdW0uaW8+Citub2R1bS5jbworbm9kdW0uaW8KKworLy8gTllDLm1uIDogaHR0cDovL3d3dy5pbmZvcm1hdGlvbi5ueWMubW4KKy8vIFN1Ym1pdHRlZCBieSBNYXR0aGV3IEJyb3duIDxtYXR0YnJvd25AbnljLm1uPgorbnljLm1uCisKKy8vIE55bU5vbSA6IGh0dHBzOi8vbnltbm9tLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBEYXZlIE1jQ29ybWFjayA8ZGF2ZS5tY2Nvcm1hY2tAbnltbm9tLmNvbT4KK25vbS5hZQorbm9tLmFpCitub20uYWwKK255bS5ieQorbnltLmJ6Citub20uY2wKK25vbS5nZAorbm9tLmdsCitueW0uZ3IKK25vbS5ndAorbm9tLmhuCitub20uaW0KK255bS5regorbnltLmxhCitub20ubGkKK255bS5saQorbnltLmx0CitueW0ubHUKK255bS5tZQorbm9tLm1rCitueW0ubXgKK25vbS5udQorbnltLm56CitueW0ucGUKK255bS5wdAorbm9tLnB3Citub20ucWEKK25vbS5ycworbm9tLnNpCitueW0uc2sKK255bS5zdQorbnltLnN4CitueW0udHcKK25vbS51Zworbm9tLnV5Citub20udmMKK25vbS52ZworCisvLyBPY3RvcG9kYWwgU29sdXRpb25zLCBMTEMuIDogaHR0cHM6Ly91bHRlcml1cy5pby8KKy8vIFN1Ym1pdHRlZCBieSBBbmRyZXcgU2FtcHNvbiA8YW5kcmV3QHVsdGVyaXVzLmlvPgorY3lhLmdnCisKKy8vIE9uZSBGb2xkIE1lZGlhIDogaHR0cDovL3d3dy5vbmVmb2xkbWVkaWEuY29tLworLy8gU3VibWl0dGVkIGJ5IEVkZGllIEpvbmVzIDxlZGRpZUBvbmVmb2xkbWVkaWEuY29tPgorbmlkLmlvCisKKy8vIE9wZW5DcmFmdCBHbWJIIDogaHR0cDovL29wZW5jcmFmdC5jb20vCisvLyBTdWJtaXR0ZWQgYnkgU3ZlbiBNYXJuYWNoIDxzdmVuQG9wZW5jcmFmdC5jb20+CitvcGVuY3JhZnQuaG9zdGluZworCisvLyBPcGVyYSBTb2Z0d2FyZSwgQS5TLkEuCisvLyBTdWJtaXR0ZWQgYnkgWW5ndmUgUGV0dGVyc2VuIDx5bmd2ZUBvcGVyYS5jb20+CitvcGVyYXVuaXRlLmNvbQorCisvLyBPdXRTeXN0ZW1zCisvLyBTdWJtaXR0ZWQgYnkgRHVhcnRlIFNhbnRvcyA8ZG9tYWluLWFkbWluQG91dHN5c3RlbXNjbG91ZC5jb20+CitvdXRzeXN0ZW1zY2xvdWQuY29tCisKKy8vIE93blByb3ZpZGVyIDogaHR0cDovL3d3dy5vd25wcm92aWRlci5jb20KKy8vIFN1Ym1pdHRlZCBieSBKYW4gTW9lbm5pY2ggPGphbi5tb2VubmljaEBvd25wcm92aWRlci5jb20+Citvd25wcm92aWRlci5jb20KKworLy8gb3kubGMKKy8vIFN1Ym1pdHRlZCBieSBDaGFybHkgQ29zdGUgPGNoYW5nYWNvQGNoYW5nYWNvLm95LmxjPgorb3kubGMKKworLy8gUGFnZWZvZyA6IGh0dHBzOi8vcGFnZWZvZy5jb20vCisvLyBTdWJtaXR0ZWQgYnkgRGVyZWsgTXllcnMgPGRlcmVrQHBhZ2Vmb2cuY29tPgorcGdmb2cuY29tCisKKy8vIFBhZ2Vmcm9udCA6IGh0dHBzOi8vd3d3LnBhZ2Vmcm9udGhxLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBKYXNvbiBLcmlzcyA8amFzb25AcGFnZWZyb250aHEuY29tPgorcGFnZWZyb250YXBwLmNvbQorCisvLyAucGwgZG9tYWlucyAoZ3JhbmRmYXRoZXJlZCkKK2FydC5wbAorZ2xpd2ljZS5wbAora3Jha293LnBsCitwb3puYW4ucGwKK3dyb2MucGwKK3pha29wYW5lLnBsCisKKy8vIFBhbnRoZW9uIFN5c3RlbXMsIEluYy4gOiBodHRwczovL3BhbnRoZW9uLmlvLworLy8gU3VibWl0dGVkIGJ5IEdhcnkgRHlsaW5hIDxnYXJ5QHBhbnRoZW9uLmlvPgorcGFudGhlb25zaXRlLmlvCitnb3RwYW50aGVvbi5jb20KKworLy8gUGVwbGluayB8IFBlcHdhdmUgOiBodHRwOi8vcGVwbGluay5jb20vCisvLyBTdWJtaXR0ZWQgYnkgU3RldmUgTGV1bmcgPHN0ZXZlbGV1bmdAcGVwbGluay5jb20+CitteXBlcC5saW5rCisKKy8vIFBsYW5ldC1Xb3JrIDogaHR0cHM6Ly93d3cucGxhbmV0LXdvcmsuY29tLworLy8gU3VibWl0dGVkIGJ5IEZyw6lkw6lyaWMgVkFOTknDiFJFIDxmLnZhbm5pZXJlQHBsYW5ldC13b3JrLmNvbT4KK29uLXdlYi5mcgorCisvLyBQbGF0Zm9ybS5zaCA6IGh0dHBzOi8vcGxhdGZvcm0uc2gKKy8vIFN1Ym1pdHRlZCBieSBOaWtvbGEgS290dXIgPG5pa29sYUBwbGF0Zm9ybS5zaD4KKyoucGxhdGZvcm0uc2gKKyoucGxhdGZvcm1zaC5zaXRlCisKKy8vIHByZ21yLmNvbSA6IGh0dHBzOi8vcHJnbXIuY29tLworLy8gU3VibWl0dGVkIGJ5IFNhcmFoIE5ld21hbiA8b3duZXJAcHJnbXIuY29tPgoreGVuLnByZ21yLmNvbQorCisvLyBwcml2LmF0IDogaHR0cDovL3d3dy5uaWMucHJpdi5hdC8KKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8bGVuZGxAbmljLmF0PgorcHJpdi5hdAorCisvLyBQcm90b25ldCBHbWJIIDogaHR0cDovL3Byb3RvbmV0LmlvCisvLyBTdWJtaXR0ZWQgYnkgTWFydGluIE1laWVyIDxhZG1pbkBwcm90b25ldC5pbz4KK3Byb3RvbmV0LmlvCisKKy8vIFB1YmxpY2F0aW9uIFByZXNzZSBDb21tdW5pY2F0aW9uIFNBUkwgOiBodHRwczovL3BwY29tLmZyCisvLyBTdWJtaXR0ZWQgYnkgWWFhY292IEFraWJhIFNsYW1hIDxhZG1pbkBjaGlydXJnaWVucy1kZW50aXN0ZXMtZW4tZnJhbmNlLmZyPgorY2hpcnVyZ2llbnMtZGVudGlzdGVzLWVuLWZyYW5jZS5mcgorCisvLyBRQTIKKy8vIFN1Ym1pdHRlZCBieSBEYW5pZWwgRGVudCAoaHR0cHM6Ly93d3cuZGFuaWVsZGVudC5jb20vKQorcWEyLmNvbQorCisvLyBRTkFQIFN5c3RlbSBJbmMgOiBodHRwczovL3d3dy5xbmFwLmNvbQorLy8gU3VibWl0dGVkIGJ5IE5pY2sgQ2hhbmcgPG5pY2tjaGFuZ0BxbmFwLmNvbT4KK2Rldi1teXFuYXBjbG91ZC5jb20KK2FscGhhLW15cW5hcGNsb3VkLmNvbQorbXlxbmFwY2xvdWQuY29tCisKKy8vIFF1aXAgOiBodHRwczovL3F1aXAuY29tCisvLyBTdWJtaXR0ZWQgYnkgUGF0cmljayBMaW5laGFuIDxwbGluZWhhbkBxdWlwLmNvbT4KKyoucXVpcGVsZW1lbnRzLmNvbQorCisvLyBRdXRoZW9yeSBMTEMgOiBodHRwOi8vcXV0aGVvcnkuaW8KKy8vIFN1Ym1pdHRlZCBieSBKb25hcyBTY2h3YXJ0eiA8am9uYXNAcXV0aGVvcnkuaW8+Cit2YXBvci5jbG91ZAordmFwb3JjbG91ZC5pbworCisvLyBSYWNrbWF6ZSBMTEMgOiBodHRwczovL3d3dy5yYWNrbWF6ZS5jb20KKy8vIFN1Ym1pdHRlZCBieSBLaXJpbGwgUGVydHNldiA8a2lrYUByYWNrbWF6ZS5jb20+CityYWNrbWF6ZS5jb20KK3JhY2ttYXplLm5ldAorCisvLyBSZWQgSGF0LCBJbmMuIE9wZW5TaGlmdCA6IGh0dHBzOi8vb3BlbnNoaWZ0LnJlZGhhdC5jb20vCisvLyBTdWJtaXR0ZWQgYnkgVGltIEtyYW1lciA8dGtyYW1lckByaGNsb3VkLmNvbT4KK3JoY2xvdWQuY29tCisKKy8vIFJldGhpbmtEQiA6IGh0dHBzOi8vd3d3LnJldGhpbmtkYi5jb20vCisvLyBTdWJtaXR0ZWQgYnkgQ2hyaXMgS2FzdG9yZmYgPGluZm9AcmV0aGlua2RiLmNvbT4KK2h6Yy5pbworCisvLyBSZXZpdGFsaXNlZCBMaW1pdGVkIDogaHR0cDovL3d3dy5yZXZpdGFsaXNlZC5jby51aworLy8gU3VibWl0dGVkIGJ5IEphY2sgUHJpY2UgPGphY2tAcmV2aXRhbGlzZWQuY28udWs+Cit3ZWxsYmVpbmd6b25lLmV1CitwdHBsdXMuZml0Cit3ZWxsYmVpbmd6b25lLmNvLnVrCisKKy8vIFNhbmRzdG9ybSBEZXZlbG9wbWVudCBHcm91cCwgSW5jLiA6IGh0dHBzOi8vc2FuZGNhdHMuaW8vCisvLyBTdWJtaXR0ZWQgYnkgQXNoZWVzaCBMYXJvaWEgPGFzaGVlc2hAc2FuZHN0b3JtLmlvPgorc2FuZGNhdHMuaW8KKworLy8gU0JFIG5ldHdvcmsgc29sdXRpb25zIEdtYkggOiBodHRwczovL3d3dy5zYmUuZGUvCisvLyBTdWJtaXR0ZWQgYnkgTm9ybWFuIE1laWxpY2sgPG5tQHNiZS5kZT4KK2xvZ29pcC5kZQorbG9nb2lwLmNvbQorCisvLyBTZWN1cmVwb2ludCBHbWJIIDogaHR0cHM6Ly93d3cuc2VjdXJlcG9pbnQuZGUKKy8vIFN1Ym1pdHRlZCBieSBFcmlrIEFuZGVycyA8ZXJpay5hbmRlcnNAc2VjdXJlcG9pbnQuZGU+CitmaXJld2FsbC1nYXRld2F5LmNvbQorZmlyZXdhbGwtZ2F0ZXdheS5kZQorbXktZ2F0ZXdheS5kZQorbXktcm91dGVyLmRlCitzcGRucy5kZQorc3BkbnMuZXUKK2ZpcmV3YWxsLWdhdGV3YXkubmV0CitteS1maXJld2FsbC5vcmcKK215ZmlyZXdhbGwub3JnCitzcGRucy5vcmcKKworLy8gU2Vuc2lvTGFicywgU0FTIDogaHR0cHM6Ly9zZW5zaW9sYWJzLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBGYWJpZW4gUG90ZW5jaWVyIDxmYWJpZW4ucG90ZW5jaWVyQHNlbnNpb2xhYnMuY29tPgorKi5zZW5zaW9zaXRlLmNsb3VkCisKKy8vIFNlcnZpY2UgT25saW5lIExMQyA6IGh0dHA6Ly9kcnMudWEvCisvLyBTdWJtaXR0ZWQgYnkgU2VyaGlpIEJ1bGFraCA8c3VwcG9ydEBkcnMudWE+CitiaXoudWEKK2NvLnVhCitwcC51YQorCisvLyBTaGlmdEVkaXQgOiBodHRwczovL3NoaWZ0ZWRpdC5uZXQvCisvLyBTdWJtaXR0ZWQgYnkgQWRhbSBKaW1lbmV6IDxhZGFtQHNoaWZ0Y3JlYXRlLmNvbT4KK3NoaWZ0ZWRpdC5pbworCisvLyBTaG9wYmxvY2tzIDogaHR0cDovL3d3dy5zaG9wYmxvY2tzLmNvbS8KKy8vIFN1Ym1pdHRlZCBieSBBbGV4IEJvd2VycyA8YWxleEBzaG9wYmxvY2tzLmNvbT4KK215c2hvcGJsb2Nrcy5jb20KKworLy8gU2luYUFwcEVuZ2luZSA6IGh0dHA6Ly9zYWUuc2luYS5jb20uY24vCisvLyBTdWJtaXR0ZWQgYnkgU2luYUFwcEVuZ2luZSA8c2Flc3VwcG9ydEBzaW5hY2xvdWQuY29tPgorMWthcHAuY29tCithcHBjaGl6aS5jb20KK2FwcGxpbnppLmNvbQorc2luYWFwcC5jb20KK3ZpcHNpbmFhcHAuY29tCisKKy8vIFNreWhhdCA6IGh0dHA6Ly93d3cuc2t5aGF0LmlvCisvLyBTdWJtaXR0ZWQgYnkgU2hhbnRlIEFkYW0gPHNoYW50ZUBza3loYXQuaW8+Citib3VudHktZnVsbC5jb20KK2FscGhhLmJvdW50eS1mdWxsLmNvbQorYmV0YS5ib3VudHktZnVsbC5jb20KKworLy8gc3RhdGljbGFuZCA6IGh0dHBzOi8vc3RhdGljLmxhbmQKKy8vIFN1Ym1pdHRlZCBieSBTZXRoIFZpbmNlbnQgPHNldGh2aW5jZW50QGdtYWlsLmNvbT4KK3N0YXRpYy5sYW5kCitkZXYuc3RhdGljLmxhbmQKK3NpdGVzLnN0YXRpYy5sYW5kCisKKy8vIFNvdXJjZUxhaXIgUEMgOiBodHRwczovL3d3dy5zb3VyY2VsYWlyLmNvbQorLy8gU3VibWl0dGVkIGJ5IEFudG9uaXMgS2FsaXBldGlzIDxha2FsaXBldGlzQHNvdXJjZWxhaXIuY29tPgorYXBwcy5sYWlyLmlvCisqLnN0b2xvcy5pbworCisvLyBTcGFjZUtpdCA6IGh0dHBzOi8vd3d3LnNwYWNla2l0LmlvLworLy8gU3VibWl0dGVkIGJ5IFJlemEgQWtoYXZhbiA8c3BhY2VraXQuaW9AZ21haWwuY29tPgorc3BhY2VraXQuaW8KKworLy8gU3RhY2tzcGFjZSA6IGh0dHBzOi8vd3d3LnN0YWNrc3BhY2UuaW8vCisvLyBTdWJtaXR0ZWQgYnkgTGluYSBIZSA8aW5mb0BzdGFja3NwYWNlLmlvPgorc3RhY2tzcGFjZS5zcGFjZQorCisvLyBTdG9yaiBMYWJzIEluYy4gOiBodHRwczovL3N0b3JqLmlvLworLy8gU3VibWl0dGVkIGJ5IFBoaWxpcCBIdXRjaGlucyA8aG9zdG1hc3RlckBzdG9yai5pbz4KK3N0b3JqLmZhcm0KKworLy8gU3ViIDYgTGltaXRlZDogaHR0cDovL3d3dy5zdWI2LmNvbQorLy8gU3VibWl0dGVkIGJ5IERhbiBNaWxsZXIgPGRtQHN1YjYuY29tPgordGVtcC1kbnMuY29tCisKKy8vIFN5bm9sb2d5LCBJbmMuIDogaHR0cHM6Ly93d3cuc3lub2xvZ3kuY29tLworLy8gU3VibWl0dGVkIGJ5IFJvbnkgV2VuZyA8cm9ueXdlbmdAc3lub2xvZ3kuY29tPgorZGlza3N0YXRpb24ubWUKK2RzY2xvdWQuYml6Citkc2Nsb3VkLm1lCitkc2Nsb3VkLm1vYmkKK2RzbXluYXMuY29tCitkc215bmFzLm5ldAorZHNteW5hcy5vcmcKK2ZhbWlseWRzLmNvbQorZmFtaWx5ZHMubmV0CitmYW1pbHlkcy5vcmcKK2kyMzQubWUKK215ZHMubWUKK3N5bm9sb2d5Lm1lCit2cG5wbHVzLnRvCisKKy8vIFRBSUZVTiBTb2Z0d2FyZSBBRyA6IGh0dHA6Ly90YWlmdW4tc29mdHdhcmUuZGUKKy8vIFN1Ym1pdHRlZCBieSBCam9lcm4gSGVua2UgPGRldi1zZXJ2ZXJAdGFpZnVuLXNvZnR3YXJlLmRlPgordGFpZnVuLWRucy5kZQorCisvLyBUQVNLIGdlb2dyYXBoaWNhbCBkb21haW5zICh3d3cudGFzay5nZGEucGwvdXNsdWdpL2RucykKK2dkYS5wbAorZ2RhbnNrLnBsCitnZHluaWEucGwKK21lZC5wbAorc29wb3QucGwKKworLy8gVGhpbmdkdXN0IEFHIDogaHR0cHM6Ly90aGluZ2R1c3QuY29tLworLy8gU3VibWl0dGVkIGJ5IEFkcmlhbiBJbWJvZGVuIDxhZGlAdGhpbmdkdXN0LmNvbT4KK2N1c3QuZGV2LnRoaW5nZHVzdC5pbworY3VzdC5kaXNyZWMudGhpbmdkdXN0LmlvCitjdXN0LnByb2QudGhpbmdkdXN0LmlvCitjdXN0LnRlc3RpbmcudGhpbmdkdXN0LmlvCisKKy8vIFRvd25OZXdzLmNvbSA6IGh0dHA6Ly93d3cudG93bm5ld3MuY29tCisvLyBTdWJtaXR0ZWQgYnkgRHVzdGluIFdhcmQgPGR3YXJkQHRvd25uZXdzLmNvbT4KK2Jsb3hjbXMuY29tCit0b3dubmV3cy1zdGFnaW5nLmNvbQorCisvLyBUcmFmZmljUGxleCBHbWJIIDogaHR0cHM6Ly93d3cudHJhZmZpY3BsZXguZGUvCisvLyBTdWJtaXR0ZWQgYnkgUGhpbGxpcHAgUsO2bGwgPHBoaWxsaXBwLnJvZWxsQHRyYWZmaWNwbGV4LmRlPgorMTJocC5hdAorMml4LmF0Cis0bGltYS5hdAorbGltYS1jaXR5LmF0CisxMmhwLmNoCisyaXguY2gKKzRsaW1hLmNoCitsaW1hLWNpdHkuY2gKK3RyYWZmaWNwbGV4LmNsb3VkCitkZS5jb29sCisxMmhwLmRlCisyaXguZGUKKzRsaW1hLmRlCitsaW1hLWNpdHkuZGUKKzEzMzcucGljdHVyZXMKK2NsYW4ucmlwCitsaW1hLWNpdHkucm9ja3MKK3dlYnNwYWNlLnJvY2tzCitsaW1hLnpvbmUKKworLy8gVHJhbnNJUCA6IGh0dHM6Ly93d3cudHJhbnNpcC5ubAorLy8gU3VibWl0dGVkIGJ5IFJvcnkgQnJldWsgPHJicmV1a0B0cmFuc2lwLm5sPgorKi50cmFuc3VybC5iZQorKi50cmFuc3VybC5ldQorKi50cmFuc3VybC5ubAorCisvLyBUdXhGYW1pbHkgOiBodHRwOi8vdHV4ZmFtaWx5Lm9yZworLy8gU3VibWl0dGVkIGJ5IFR1eEZhbWlseSBhZG1pbmlzdHJhdG9ycyA8YWRtQHN0YWZmLnR1eGZhbWlseS5vcmc+Cit0dXhmYW1pbHkub3JnCisKKy8vIFR3b0ROUyA6IGh0dHBzOi8vd3d3LnR3b2Rucy5kZS8KKy8vIFN1Ym1pdHRlZCBieSBUd29ETlMtU3VwcG9ydCA8c3VwcG9ydEB0d28tZG5zLmRlPgorZGQtZG5zLmRlCitkaXNrc3RhdGlvbi5ldQorZGlza3N0YXRpb24ub3JnCitkcmF5LWRucy5kZQorZHJheWRucy5kZQorZHluLXZwbi5kZQorZHludnBuLmRlCittZWluLXZpZ29yLmRlCitteS12aWdvci5kZQorbXktd2FuLmRlCitzeW5vLWRzLmRlCitzeW5vbG9neS1kaXNrc3RhdGlvbi5kZQorc3lub2xvZ3ktZHMuZGUKKworLy8gVWJlcnNwYWNlIDogaHR0cHM6Ly91YmVyc3BhY2UuZGUKKy8vIFN1Ym1pdHRlZCBieSBNb3JpdHogV2VybmVyIDxtd2VybmVyQGpvbmFzcGFzY2hlLmNvbT4KK3ViZXIuc3BhY2UKKworLy8gVURSIExpbWl0ZWQgOiBodHRwOi8vd3d3LnVkci5oay5jb20KKy8vIFN1Ym1pdHRlZCBieSByZWdpc3RyeSA8aG9zdG1hc3RlckB1ZHIuaGsuY29tPgoraGsuY29tCitoay5vcmcKK2x0ZC5oaworaW5jLmhrCisKKy8vIC5VUworLy8gU3VibWl0dGVkIGJ5IEVkIE1vb3JlIDxFZC5Nb29yZUBsaWIuZGUudXM+CitsaWIuZGUudXMKKworLy8gVmlwcmluZXQgRXVyb3BlIEdtYkggOiBodHRwOi8vd3d3LnZpcHJpbmV0LmNvbQorLy8gU3VibWl0dGVkIGJ5IFNpbW9uIEtpc3NlbCA8aG9zdG1hc3RlckB2aXByaW5ldC5jb20+Cityb3V0ZXIubWFuYWdlbWVudAorCisvLyBXZURlcGxveSBieSBMaWZlcmF5LCBJbmMuIDogaHR0cHM6Ly93d3cud2VkZXBsb3kuY29tCisvLyBTdWJtaXR0ZWQgYnkgSGVucmlxdWUgVmljZW50ZSA8c2VjdXJpdHlAd2VkZXBsb3kuY29tPgord2VkZXBsb3kuaW8KK3dlZGVwbG95Lm1lCisKKy8vIFdlc3Rlcm4gRGlnaXRhbCBUZWNobm9sb2dpZXMsIEluYyA6IGh0dHBzOi8vd3d3LndkYy5jb20KKy8vIFN1Ym1pdHRlZCBieSBKdW5nIEppbiA8anVuZ3Nlb2suamluQHdkYy5jb20+CityZW1vdGV3ZC5jb20KKworLy8gV2lraW1lZGlhIExhYnMgOiBodHRwczovL3dpa2l0ZWNoLndpa2ltZWRpYS5vcmcKKy8vIFN1Ym1pdHRlZCBieSBZdXZpIFBhbmRhIDx5dXZpcGFuZGFAd2lraW1lZGlhLm9yZz4KK3dtZmxhYnMub3JnCisKKy8vIFhTNEFMTCBJbnRlcm5ldCBidiA6IGh0dHBzOi8vd3d3LnhzNGFsbC5ubC8KKy8vIFN1Ym1pdHRlZCBieSBEYW5pZWwgTW9zdGVydG1hbiA8dW5peGJlaGVlcitwdWJsaWNzdWZmaXhAeHM0YWxsLm5ldD4KK2Npc3Ryb24ubmwKK2RlbW9uLm5sCit4czRhbGwuc3BhY2UKKworLy8gWW9sYSA6IGh0dHBzOi8vd3d3LnlvbGEuY29tLworLy8gU3VibWl0dGVkIGJ5IFN0ZWZhbm8gUml2ZXJhIDxzdGVmYW5vQHlvbGEuY29tPgoreW9sYXNpdGUuY29tCisKKy8vIFlvbWJvIDogaHR0cHM6Ly95b21iby5uZXQKKy8vIFN1Ym1pdHRlZCBieSBNaXRjaCBTY2h3ZW5rIDxtaXRjaEB5b21iby5uZXQ+Cit5Ym8uZmFpdGgKK3lvbWJvLm1lCitob21lbGluay5vbmUKK3liby5wYXJ0eQoreWJvLnJldmlldworeWJvLnNjaWVuY2UKK3liby50cmFkZQorCisvLyBaYU5pQyA6IGh0dHA6Ly93d3cuemEubmV0LworLy8gU3VibWl0dGVkIGJ5IHJlZ2lzdHJ5IDxob3N0bWFzdGVyQG5pYy56YS5uZXQ+Cit6YS5uZXQKK3phLm9yZworCisvLyBaZWl0LCBJbmMuIDogaHR0cHM6Ly96ZWl0LmRvbWFpbnMvCisvLyBTdWJtaXR0ZWQgYnkgT2xsaSBWYW5ob2phIDxvbGxpQHplaXQuY28+Citub3cuc2gKKworLy8gPT09RU5EIFBSSVZBVEUgRE9NQUlOUz09PQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9saWIvcHVibGljX3N1ZmZpeC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvbGliL3B1YmxpY19zdWZmaXgucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3OWRkMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvbGliL3B1YmxpY19zdWZmaXgucmIKQEAgLTAsMCArMSwxNzUgQEAKKyMgPSBQdWJsaWMgU3VmZml4CisjCisjIERvbWFpbiBuYW1lIHBhcnNlciBiYXNlZCBvbiB0aGUgUHVibGljIFN1ZmZpeCBMaXN0LgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNyBTaW1vbmUgQ2FybGV0dGkgPHdlcHBvc0B3ZXBwb3MubmV0PgorCityZXF1aXJlX3JlbGF0aXZlICJwdWJsaWNfc3VmZml4L2RvbWFpbiIKK3JlcXVpcmVfcmVsYXRpdmUgInB1YmxpY19zdWZmaXgvdmVyc2lvbiIKK3JlcXVpcmVfcmVsYXRpdmUgInB1YmxpY19zdWZmaXgvZXJyb3JzIgorcmVxdWlyZV9yZWxhdGl2ZSAicHVibGljX3N1ZmZpeC9ydWxlIgorcmVxdWlyZV9yZWxhdGl2ZSAicHVibGljX3N1ZmZpeC9saXN0IgorCisjIFB1YmxpY1N1ZmZpeCBpcyBhIFJ1YnkgZG9tYWluIG5hbWUgcGFyc2VyIGJhc2VkIG9uIHRoZSBQdWJsaWMgU3VmZml4IExpc3QuCisjCisjIFRoZSBbUHVibGljIFN1ZmZpeCBMaXN0XShodHRwczovL3B1YmxpY3N1ZmZpeC5vcmcpIGlzIGEgY3Jvc3MtdmVuZG9yIGluaXRpYXRpdmUKKyMgdG8gcHJvdmlkZSBhbiBhY2N1cmF0ZSBsaXN0IG9mIGRvbWFpbiBuYW1lIHN1ZmZpeGVzLgorIworIyBUaGUgUHVibGljIFN1ZmZpeCBMaXN0IGlzIGFuIGluaXRpYXRpdmUgb2YgdGhlIE1vemlsbGEgUHJvamVjdCwKKyMgYnV0IGlzIG1haW50YWluZWQgYXMgYSBjb21tdW5pdHkgcmVzb3VyY2UuIEl0IGlzIGF2YWlsYWJsZSBmb3IgdXNlIGluIGFueSBzb2Z0d2FyZSwKKyMgYnV0IHdhcyBvcmlnaW5hbGx5IGNyZWF0ZWQgdG8gbWVldCB0aGUgbmVlZHMgb2YgYnJvd3NlciBtYW51ZmFjdHVyZXJzLgorbW9kdWxlIFB1YmxpY1N1ZmZpeAorCisgIERPVCAgID0gIi4iLmZyZWV6ZQorICBCQU5HICA9ICIhIi5mcmVlemUKKyAgU1RBUiAgPSAiKiIuZnJlZXplCisKKyAgIyBQYXJzZXMgK25hbWUrIGFuZCByZXR1cm5zIHRoZSB7UHVibGljU3VmZml4OjpEb21haW59IGluc3RhbmNlLgorICAjCisgICMgQGV4YW1wbGUgUGFyc2UgYSB2YWxpZCBkb21haW4KKyAgIyAgIFB1YmxpY1N1ZmZpeC5wYXJzZSgiZ29vZ2xlLmNvbSIpCisgICMgICAjID0+ICM8UHVibGljU3VmZml4OjpEb21haW46MHgwMDdmZWMyZTUxZTU4OCBAc2xkPSJnb29nbGUiLCBAdGxkPSJjb20iLCBAdHJkPW5pbD4KKyAgIworICAjIEBleGFtcGxlIFBhcnNlIGEgdmFsaWQgc3ViZG9tYWluCisgICMgICBQdWJsaWNTdWZmaXgucGFyc2UoInd3dy5nb29nbGUuY29tIikKKyAgIyAgICMgPT4gIzxQdWJsaWNTdWZmaXg6OkRvbWFpbjoweDAwN2ZlYzI3NmQ0Y2Y4IEBzbGQ9Imdvb2dsZSIsIEB0bGQ9ImNvbSIsIEB0cmQ9Ind3dyI+CisgICMKKyAgIyBAZXhhbXBsZSBQYXJzZSBhIGZ1bGx5IHF1YWxpZmllZCBkb21haW4KKyAgIyAgIFB1YmxpY1N1ZmZpeC5wYXJzZSgiZ29vZ2xlLmNvbS4iKQorICAjICAgIyA9PiAjPFB1YmxpY1N1ZmZpeDo6RG9tYWluOjB4MDA3ZmVjMjU3Y2FmMzggQHNsZD0iZ29vZ2xlIiwgQHRsZD0iY29tIiwgQHRyZD1uaWw+CisgICMKKyAgIyBAZXhhbXBsZSBQYXJzZSBhIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gKHN1YmRvbWFpbikKKyAgIyAgIFB1YmxpY1N1ZmZpeC5wYXJzZSgid3d3Lmdvb2dsZS5jb20uIikKKyAgIyAgICMgPT4gIzxQdWJsaWNTdWZmaXg6OkRvbWFpbjoweDAwN2ZlYzI3YjZiY2E4IEBzbGQ9Imdvb2dsZSIsIEB0bGQ9ImNvbSIsIEB0cmQ9Ind3dyI+CisgICMKKyAgIyBAZXhhbXBsZSBQYXJzZSBhbiBpbnZhbGlkICh1bmxpc3RlZCkgZG9tYWluCisgICMgICBQdWJsaWNTdWZmaXgucGFyc2UoIngueXoiKQorICAjICAgIyA9PiAjPFB1YmxpY1N1ZmZpeDo6RG9tYWluOjB4MDA3ZmVjMmY0OWJlYzAgQHNsZD0ieCIsIEB0bGQ9Inl6IiwgQHRyZD1uaWw+CisgICMKKyAgIyBAZXhhbXBsZSBQYXJzZSBhbiBpbnZhbGlkICh1bmxpc3RlZCkgZG9tYWluIHdpdGggc3RyaWN0IGNoZWNraW5nICh3aXRob3V0IGFwcGx5aW5nIHRoZSBkZWZhdWx0ICogcnVsZSkKKyAgIyAgIFB1YmxpY1N1ZmZpeC5wYXJzZSgieC55eiIsIGRlZmF1bHRfcnVsZTogbmlsKQorICAjICAgIyA9PiBQdWJsaWNTdWZmaXg6OkRvbWFpbkludmFsaWQ6IGB4Lnl6YCBpcyBub3QgYSB2YWxpZCBkb21haW4KKyAgIworICAjIEBleGFtcGxlIFBhcnNlIGFuIFVSTCAobm90IHN1cHBvcnRlZCwgb25seSBkb21haW5zKQorICAjICAgUHVibGljU3VmZml4LnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKQorICAjICAgIyA9PiBQdWJsaWNTdWZmaXg6OkRvbWFpbkludmFsaWQ6IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSBpcyBub3QgZXhwZWN0ZWQgdG8gY29udGFpbiBhIHNjaGVtZQorICAjCisgICMKKyAgIyBAcGFyYW0gIFtTdHJpbmcsICN0b19zXSBuYW1lIFRoZSBkb21haW4gbmFtZSBvciBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgdG8gcGFyc2UuCisgICMgQHBhcmFtICBbUHVibGljU3VmZml4OjpMaXN0XSBsaXN0IFRoZSBydWxlIGxpc3QgdG8gc2VhcmNoLCBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCB7UHVibGljU3VmZml4OjpMaXN0fQorICAjIEBwYXJhbSAgW0Jvb2xlYW5dIGlnbm9yZV9wcml2YXRlCisgICMgQHJldHVybiBbUHVibGljU3VmZml4OjpEb21haW5dCisgICMKKyAgIyBAcmFpc2UgW1B1YmxpY1N1ZmZpeDo6RG9tYWluSW52YWxpZF0KKyAgIyAgIElmIGRvbWFpbiBpcyBub3QgYSB2YWxpZCBkb21haW4uCisgICMgQHJhaXNlIFtQdWJsaWNTdWZmaXg6OkRvbWFpbk5vdEFsbG93ZWRdCisgICMgICBJZiBhIHJ1bGUgZm9yICtkb21haW4rIGlzIGZvdW5kLCBidXQgdGhlIHJ1bGUgZG9lc24ndCBhbGxvdyArZG9tYWluKy4KKyAgZGVmIHNlbGYucGFyc2UobmFtZSwgbGlzdDogTGlzdC5kZWZhdWx0LCBkZWZhdWx0X3J1bGU6IGxpc3QuZGVmYXVsdF9ydWxlLCBpZ25vcmVfcHJpdmF0ZTogZmFsc2UpCisgICAgd2hhdCA9IG5vcm1hbGl6ZShuYW1lKQorICAgIHJhaXNlIHdoYXQgaWYgd2hhdC5pc19hPyhEb21haW5JbnZhbGlkKQorCisgICAgcnVsZSA9IGxpc3QuZmluZCh3aGF0LCBkZWZhdWx0OiBkZWZhdWx0X3J1bGUsIGlnbm9yZV9wcml2YXRlOiBpZ25vcmVfcHJpdmF0ZSkKKworICAgICMgcnVib2NvcDpkaXNhYmxlIFN0eWxlL0lmVW5sZXNzTW9kaWZpZXIKKyAgICBpZiBydWxlLm5pbD8KKyAgICAgIHJhaXNlIERvbWFpbkludmFsaWQsICJgI3t3aGF0fWAgaXMgbm90IGEgdmFsaWQgZG9tYWluIgorICAgIGVuZAorICAgIGlmIHJ1bGUuZGVjb21wb3NlKHdoYXQpLmxhc3QubmlsPworICAgICAgcmFpc2UgRG9tYWluTm90QWxsb3dlZCwgImAje3doYXR9YCBpcyBub3QgYWxsb3dlZCBhY2NvcmRpbmcgdG8gUmVnaXN0cnkgcG9saWN5IgorICAgIGVuZAorICAgICMgcnVib2NvcDplbmFibGUgU3R5bGUvSWZVbmxlc3NNb2RpZmllcgorCisgICAgZGVjb21wb3NlKHdoYXQsIHJ1bGUpCisgIGVuZAorCisgICMgQ2hlY2tzIHdoZXRoZXIgK2RvbWFpbisgaXMgYXNzaWduZWQgYW5kIGFsbG93ZWQsIHdpdGhvdXQgYWN0dWFsbHkgcGFyc2luZyBpdC4KKyAgIworICAjIFRoaXMgbWV0aG9kIGRvZXNuJ3QgY2FyZSB3aGV0aGVyIGRvbWFpbiBpcyBhIGRvbWFpbiBvciBzdWJkb21haW4uCisgICMgVGhlIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBkZWZhdWx0IHtQdWJsaWNTdWZmaXg6Okxpc3R9LgorICAjCisgICMgQGV4YW1wbGUgVmFsaWRhdGUgYSB2YWxpZCBkb21haW4KKyAgIyAgIFB1YmxpY1N1ZmZpeC52YWxpZD8oImV4YW1wbGUuY29tIikKKyAgIyAgICMgPT4gdHJ1ZQorICAjCisgICMgQGV4YW1wbGUgVmFsaWRhdGUgYSB2YWxpZCBzdWJkb21haW4KKyAgIyAgIFB1YmxpY1N1ZmZpeC52YWxpZD8oInd3dy5leGFtcGxlLmNvbSIpCisgICMgICAjID0+IHRydWUKKyAgIworICAjIEBleGFtcGxlIFZhbGlkYXRlIGEgbm90LWxpc3RlZCBkb21haW4KKyAgIyAgIFB1YmxpY1N1ZmZpeC52YWxpZD8oImV4YW1wbGUudGxkbm90bGlzdGVkIikKKyAgIyAgICMgPT4gdHJ1ZQorICAjCisgICMgQGV4YW1wbGUgVmFsaWRhdGUgYSBub3QtbGlzdGVkIGRvbWFpbiB3aXRoIHN0cmljdCBjaGVja2luZyAod2l0aG91dCBhcHBseWluZyB0aGUgZGVmYXVsdCAqIHJ1bGUpCisgICMgICBQdWJsaWNTdWZmaXgudmFsaWQ/KCJleGFtcGxlLnRsZG5vdGxpc3RlZCIpCisgICMgICAjID0+IHRydWUKKyAgIyAgIFB1YmxpY1N1ZmZpeC52YWxpZD8oImV4YW1wbGUudGxkbm90bGlzdGVkIiwgZGVmYXVsdF9ydWxlOiBuaWwpCisgICMgICAjID0+IGZhbHNlCisgICMKKyAgIyBAZXhhbXBsZSBWYWxpZGF0ZSBhIGZ1bGx5IHF1YWxpZmllZCBkb21haW4KKyAgIyAgIFB1YmxpY1N1ZmZpeC52YWxpZD8oImdvb2dsZS5jb20uIikKKyAgIyAgICMgPT4gdHJ1ZQorICAjICAgUHVibGljU3VmZml4LnZhbGlkPygid3d3Lmdvb2dsZS5jb20uIikKKyAgIyAgICMgPT4gdHJ1ZQorICAjCisgICMgQGV4YW1wbGUgQ2hlY2sgYW4gVVJMICh3aGljaCBpcyBub3QgYSB2YWxpZCBkb21haW4pCisgICMgICBQdWJsaWNTdWZmaXgudmFsaWQ/KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tIikKKyAgIyAgICMgPT4gZmFsc2UKKyAgIworICAjCisgICMgQHBhcmFtICBbU3RyaW5nLCAjdG9fc10gbmFtZSBUaGUgZG9tYWluIG5hbWUgb3IgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIHRvIHZhbGlkYXRlLgorICAjIEBwYXJhbSAgW0Jvb2xlYW5dIGlnbm9yZV9wcml2YXRlCisgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgZGVmIHNlbGYudmFsaWQ/KG5hbWUsIGxpc3Q6IExpc3QuZGVmYXVsdCwgZGVmYXVsdF9ydWxlOiBsaXN0LmRlZmF1bHRfcnVsZSwgaWdub3JlX3ByaXZhdGU6IGZhbHNlKQorICAgIHdoYXQgPSBub3JtYWxpemUobmFtZSkKKyAgICByZXR1cm4gZmFsc2UgaWYgd2hhdC5pc19hPyhEb21haW5JbnZhbGlkKQorCisgICAgcnVsZSA9IGxpc3QuZmluZCh3aGF0LCBkZWZhdWx0OiBkZWZhdWx0X3J1bGUsIGlnbm9yZV9wcml2YXRlOiBpZ25vcmVfcHJpdmF0ZSkKKworICAgICFydWxlLm5pbD8gJiYgIXJ1bGUuZGVjb21wb3NlKHdoYXQpLmxhc3QubmlsPworICBlbmQKKworICAjIEF0dGVtcHQgdG8gcGFyc2UgdGhlIG5hbWUgYW5kIHJldHVybnMgdGhlIGRvbWFpbiwgaWYgdmFsaWQuCisgICMKKyAgIyBUaGlzIG1ldGhvZCBkb2Vzbid0IHJhaXNlLiBJbnN0ZWFkLCBpdCByZXR1cm5zIG5pbCBpZiB0aGUgZG9tYWluIGlzIG5vdCB2YWxpZCBmb3Igd2hhdGV2ZXIgcmVhc29uLgorICAjCisgICMgQHBhcmFtICBbU3RyaW5nLCAjdG9fc10gbmFtZSBUaGUgZG9tYWluIG5hbWUgb3IgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIHRvIHBhcnNlLgorICAjIEBwYXJhbSAgW1B1YmxpY1N1ZmZpeDo6TGlzdF0gbGlzdCBUaGUgcnVsZSBsaXN0IHRvIHNlYXJjaCwgZGVmYXVsdHMgdG8gdGhlIGRlZmF1bHQge1B1YmxpY1N1ZmZpeDo6TGlzdH0KKyAgIyBAcGFyYW0gIFtCb29sZWFuXSBpZ25vcmVfcHJpdmF0ZQorICAjIEByZXR1cm4gW1N0cmluZ10KKyAgZGVmIHNlbGYuZG9tYWluKG5hbWUsICoqb3B0aW9ucykKKyAgICBwYXJzZShuYW1lLCAqKm9wdGlvbnMpLmRvbWFpbgorICByZXNjdWUgUHVibGljU3VmZml4OjpFcnJvcgorICAgIG5pbAorICBlbmQKKworCisgICMgcHJpdmF0ZQorCisgIGRlZiBzZWxmLmRlY29tcG9zZShuYW1lLCBydWxlKQorICAgIGxlZnQsIHJpZ2h0ID0gcnVsZS5kZWNvbXBvc2UobmFtZSkKKworICAgIHBhcnRzID0gbGVmdC5zcGxpdChET1QpCisgICAgIyBJZiB3ZSBoYXZlIDAgcGFydHMgbGVmdCwgdGhlcmUgaXMganVzdCBhIHRsZCBhbmQgbm8gZG9tYWluIG9yIHN1YmRvbWFpbgorICAgICMgSWYgd2UgaGF2ZSAxIHBhcnQgIGxlZnQsIHRoZXJlIGlzIGp1c3QgYSB0bGQsIGRvbWFpbiBhbmQgbm90IHN1YmRvbWFpbgorICAgICMgSWYgd2UgaGF2ZSAyIHBhcnRzIGxlZnQsIHRoZSBsYXN0IHBhcnQgaXMgdGhlIGRvbWFpbiwgdGhlIG90aGVyIHBhcnRzIChjb21iaW5lZCkgYXJlIHRoZSBzdWJkb21haW4KKyAgICB0bGQgPSByaWdodAorICAgIHNsZCA9IHBhcnRzLmVtcHR5PyA/IG5pbCA6IHBhcnRzLnBvcAorICAgIHRyZCA9IHBhcnRzLmVtcHR5PyA/IG5pbCA6IHBhcnRzLmpvaW4oRE9UKQorCisgICAgRG9tYWluLm5ldyh0bGQsIHNsZCwgdHJkKQorICBlbmQKKworICAjIFByZXRlbmQgd2Uga25vdyBob3cgdG8gZGVhbCB3aXRoIHVzZXIgaW5wdXQuCisgIGRlZiBzZWxmLm5vcm1hbGl6ZShuYW1lKQorICAgIG5hbWUgPSBuYW1lLnRvX3MuZHVwCisgICAgbmFtZS5zdHJpcCEKKyAgICBuYW1lLmNob21wIShET1QpCisgICAgbmFtZS5kb3duY2FzZSEKKworICAgIHJldHVybiBEb21haW5JbnZhbGlkLm5ldygiTmFtZSBpcyBibGFuayIpIGlmIG5hbWUuZW1wdHk/CisgICAgcmV0dXJuIERvbWFpbkludmFsaWQubmV3KCJOYW1lIHN0YXJ0cyB3aXRoIGEgZG90IikgaWYgbmFtZS5zdGFydF93aXRoPyhET1QpCisgICAgcmV0dXJuIERvbWFpbkludmFsaWQubmV3KCIlcyBpcyBub3QgZXhwZWN0ZWQgdG8gY29udGFpbiBhIHNjaGVtZSIgJSBuYW1lKSBpZiBuYW1lLmluY2x1ZGU/KCI6Ly8iKQorICAgIG5hbWUKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9saWIvcHVibGljX3N1ZmZpeC9kb21haW4ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L2RvbWFpbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRlZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9saWIvcHVibGljX3N1ZmZpeC9kb21haW4ucmIKQEAgLTAsMCArMSwyMzUgQEAKKyMgPSBQdWJsaWMgU3VmZml4CisjCisjIERvbWFpbiBuYW1lIHBhcnNlciBiYXNlZCBvbiB0aGUgUHVibGljIFN1ZmZpeCBMaXN0LgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNyBTaW1vbmUgQ2FybGV0dGkgPHdlcHBvc0B3ZXBwb3MubmV0PgorCittb2R1bGUgUHVibGljU3VmZml4CisKKyAgIyBEb21haW4gcmVwcmVzZW50cyBhIGRvbWFpbiBuYW1lLCBjb21wb3NlZCBieSBhIFRMRCwgU0xEIGFuZCBUUkQuCisgIGNsYXNzIERvbWFpbgorCisgICAgIyBTcGxpdHMgYSBzdHJpbmcgaW50byB0aGUgbGFiZWxzLCB0aGF0IGlzIHRoZSBkb3Qtc2VwYXJhdGVkIHBhcnRzLgorICAgICMKKyAgICAjIFRoZSBpbnB1dCBpcyBub3QgdmFsaWRhdGVkLCBidXQgaXQgaXMgYXNzdW1lZCB0byBiZSBhIHZhbGlkIGRvbWFpbiBuYW1lLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIworICAgICMgICBuYW1lX3RvX2xhYmVscygnZXhhbXBsZS5jb20nKQorICAgICMgICAjID0+IFsnZXhhbXBsZScsICdjb20nXQorICAgICMKKyAgICAjICAgbmFtZV90b19sYWJlbHMoJ2V4YW1wbGUuY28udWsnKQorICAgICMgICAjID0+IFsnZXhhbXBsZScsICdjbycsICd1ayddCisgICAgIworICAgICMgQHBhcmFtICBuYW1lIFtTdHJpbmcsICN0b19zXSBUaGUgZG9tYWluIG5hbWUgdG8gc3BsaXQuCisgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmc+XQorICAgIGRlZiBzZWxmLm5hbWVfdG9fbGFiZWxzKG5hbWUpCisgICAgICBuYW1lLnRvX3Muc3BsaXQoRE9UKQorICAgIGVuZAorCisKKyAgICBhdHRyX3JlYWRlciA6dGxkLCA6c2xkLCA6dHJkCisKKyAgICAjIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcge1B1YmxpY1N1ZmZpeDo6RG9tYWlufSBpbnN0YW5jZS4KKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgaW5pdGlhbGl6ZSh0bGQpCisgICAgIyAgIEluaXRpYWxpemVzIHdpdGggYSArdGxkKy4KKyAgICAjICAgQHBhcmFtIFtTdHJpbmddIHRsZCBUaGUgVExEIChleHRlbnNpb24pCisgICAgIyBAb3ZlcmxvYWQgaW5pdGlhbGl6ZSh0bGQsIHNsZCkKKyAgICAjICAgSW5pdGlhbGl6ZXMgd2l0aCBhICt0bGQrIGFuZCArc2xkKy4KKyAgICAjICAgQHBhcmFtIFtTdHJpbmddIHRsZCBUaGUgVExEIChleHRlbnNpb24pCisgICAgIyAgIEBwYXJhbSBbU3RyaW5nXSBzbGQgVGhlIFRSRCAoZG9tYWluKQorICAgICMgQG92ZXJsb2FkIGluaXRpYWxpemUodGxkLCBzbGQsIHRyZCkKKyAgICAjICAgSW5pdGlhbGl6ZXMgd2l0aCBhICt0bGQrLCArc2xkKyBhbmQgK3RyZCsuCisgICAgIyAgIEBwYXJhbSBbU3RyaW5nXSB0bGQgVGhlIFRMRCAoZXh0ZW5zaW9uKQorICAgICMgICBAcGFyYW0gW1N0cmluZ10gc2xkIFRoZSBTTEQgKGRvbWFpbikKKyAgICAjICAgQHBhcmFtIFtTdHJpbmddIHRsZCBUaGUgVFJEIChzdWJkb21haW4pCisgICAgIworICAgICMgQHlpZWxkIFtzZWxmXSBZaWVsZHMgb24gc2VsZi4KKyAgICAjIEB5aWVsZHBhcmFtIFtQdWJsaWNTdWZmaXg6OkRvbWFpbl0gc2VsZiBUaGUgbmV3bHkgY3JlYXRlcyBpbnN0YW5jZQorICAgICMKKyAgICAjIEBleGFtcGxlIEluaXRpYWxpemUgd2l0aCBhIFRMRAorICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIpCisgICAgIyAgICMgPT4gIzxQdWJsaWNTdWZmaXg6OkRvbWFpbiBAdGxkPSJjb20iPgorICAgICMKKyAgICAjIEBleGFtcGxlIEluaXRpYWxpemUgd2l0aCBhIFRMRCBhbmQgU0xECisgICAgIyAgIFB1YmxpY1N1ZmZpeDo6RG9tYWluLm5ldygiY29tIiwgImV4YW1wbGUiKQorICAgICMgICAjID0+ICM8UHVibGljU3VmZml4OjpEb21haW4gQHRsZD0iY29tIiwgQHRyZD1uaWw+CisgICAgIworICAgICMgQGV4YW1wbGUgSW5pdGlhbGl6ZSB3aXRoIGEgVExELCBTTEQgYW5kIFRSRAorICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIsICJleGFtcGxlIiwgInd3d3ciKQorICAgICMgICAjID0+ICM8UHVibGljU3VmZml4OjpEb21haW4gQHRsZD0iY29tIiwgQHRyZD1uaWwsIEBzbGQ9ImV4YW1wbGUiPgorICAgICMKKyAgICBkZWYgaW5pdGlhbGl6ZSgqYXJncykKKyAgICAgIEB0bGQsIEBzbGQsIEB0cmQgPSBhcmdzCisgICAgICB5aWVsZChzZWxmKSBpZiBibG9ja19naXZlbj8KKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgZGVmIHRvX3MKKyAgICAgIG5hbWUKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBkb21haW4gcGFydHMuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nLCBuaWw+XQorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImdvb2dsZS5jb20iKS50b19hCisgICAgIyAgICMgPT4gW25pbCwgImdvb2dsZSIsICJjb20iXQorICAgICMKKyAgICAjICAgUHVibGljU3VmZml4OjpEb21haW4ubmV3KCJ3d3cuZ29vZ2xlLmNvbSIpLnRvX2EKKyAgICAjICAgIyA9PiBbbmlsLCAiZ29vZ2xlIiwgImNvbSJdCisgICAgIworICAgIGRlZiB0b19hCisgICAgICBbQHRyZCwgQHNsZCwgQHRsZF0KKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgZnVsbCBkb21haW4gbmFtZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgIworICAgICMgQGV4YW1wbGUgR2V0cyB0aGUgZG9tYWluIG5hbWUgb2YgYSBkb21haW4KKyAgICAjICAgUHVibGljU3VmZml4OjpEb21haW4ubmV3KCJjb20iLCAiZ29vZ2xlIikubmFtZQorICAgICMgICAjID0+ICJnb29nbGUuY29tIgorICAgICMKKyAgICAjIEBleGFtcGxlIEdldHMgdGhlIGRvbWFpbiBuYW1lIG9mIGEgc3ViZG9tYWluCisgICAgIyAgIFB1YmxpY1N1ZmZpeDo6RG9tYWluLm5ldygiY29tIiwgImdvb2dsZSIsICJ3d3ciKS5uYW1lCisgICAgIyAgICMgPT4gInd3dy5nb29nbGUuY29tIgorICAgICMKKyAgICBkZWYgbmFtZQorICAgICAgW0B0cmQsIEBzbGQsIEB0bGRdLmNvbXBhY3Quam9pbihET1QpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYSBkb21haW4tbGlrZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAorICAgICMgaWYgdGhlIG9iamVjdCBpcyBhIHsjZG9tYWluP30sIDx0dD5uaWw8L3R0PiBvdGhlcndpc2UuCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIpLmRvbWFpbgorICAgICMgICAjID0+IG5pbAorICAgICMKKyAgICAjICAgUHVibGljU3VmZml4OjpEb21haW4ubmV3KCJjb20iLCAiZ29vZ2xlIikuZG9tYWluCisgICAgIyAgICMgPT4gImdvb2dsZS5jb20iCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3IikuZG9tYWluCisgICAgIyAgICMgPT4gInd3dy5nb29nbGUuY29tIgorICAgICMKKyAgICAjIFRoaXMgbWV0aG9kIGRvZXNuJ3QgdmFsaWRhdGUgdGhlIGlucHV0LiBJdCBoYW5kbGVzIHRoZSBkb21haW4KKyAgICAjIGFzIGEgdmFsaWQgZG9tYWluIG5hbWUgYW5kIHNpbXBseSBhcHBsaWVzIHRoZSBuZWNlc3NhcnkgdHJhbnNmb3JtYXRpb25zLgorICAgICMKKyAgICAjIFRoaXMgbWV0aG9kIHJldHVybnMgYSBGUUQsIG5vdCBqdXN0IHRoZSBkb21haW4gcGFydC4KKyAgICAjIFRvIGdldCB0aGUgZG9tYWluIHBhcnQsIHVzZSA8dHQ+I3NsZDwvdHQ+IChha2Egc2Vjb25kIGxldmVsIGRvbWFpbikuCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3IikuZG9tYWluCisgICAgIyAgICMgPT4gImdvb2dsZS5jb20iCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3Iikuc2xkCisgICAgIyAgICMgPT4gImdvb2dsZSIKKyAgICAjCisgICAgIyBAc2VlICNkb21haW4/CisgICAgIyBAc2VlICNzdWJkb21haW4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgZGVmIGRvbWFpbgorICAgICAgW0BzbGQsIEB0bGRdLmpvaW4oRE9UKSBpZiBkb21haW4/CisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYSBzdWJkb21haW4tbGlrZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAorICAgICMgaWYgdGhlIG9iamVjdCBpcyBhIHsjc3ViZG9tYWluP30sIDx0dD5uaWw8L3R0PiBvdGhlcndpc2UuCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIpLnN1YmRvbWFpbgorICAgICMgICAjID0+IG5pbAorICAgICMKKyAgICAjICAgUHVibGljU3VmZml4OjpEb21haW4ubmV3KCJjb20iLCAiZ29vZ2xlIikuc3ViZG9tYWluCisgICAgIyAgICMgPT4gbmlsCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3Iikuc3ViZG9tYWluCisgICAgIyAgICMgPT4gInd3dy5nb29nbGUuY29tIgorICAgICMKKyAgICAjIFRoaXMgbWV0aG9kIGRvZXNuJ3QgdmFsaWRhdGUgdGhlIGlucHV0LiBJdCBoYW5kbGVzIHRoZSBkb21haW4KKyAgICAjIGFzIGEgdmFsaWQgZG9tYWluIG5hbWUgYW5kIHNpbXBseSBhcHBsaWVzIHRoZSBuZWNlc3NhcnkgdHJhbnNmb3JtYXRpb25zLgorICAgICMKKyAgICAjIFRoaXMgbWV0aG9kIHJldHVybnMgYSBGUUQsIG5vdCBqdXN0IHRoZSBzdWJkb21haW4gcGFydC4KKyAgICAjIFRvIGdldCB0aGUgc3ViZG9tYWluIHBhcnQsIHVzZSA8dHQ+I3RyZDwvdHQ+IChha2EgdGhpcmQgbGV2ZWwgZG9tYWluKS4KKyAgICAjCisgICAgIyAgIFB1YmxpY1N1ZmZpeDo6RG9tYWluLm5ldygiY29tIiwgImdvb2dsZSIsICJ3d3ciKS5zdWJkb21haW4KKyAgICAjICAgIyA9PiAid3d3Lmdvb2dsZS5jb20iCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3IikudHJkCisgICAgIyAgICMgPT4gInd3dyIKKyAgICAjCisgICAgIyBAc2VlICNzdWJkb21haW4/CisgICAgIyBAc2VlICNkb21haW4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgZGVmIHN1YmRvbWFpbgorICAgICAgW0B0cmQsIEBzbGQsIEB0bGRdLmpvaW4oRE9UKSBpZiBzdWJkb21haW4/CisgICAgZW5kCisKKyAgICAjIENoZWNrcyB3aGV0aGVyIDx0dD5zZWxmPC90dD4gbG9va3MgbGlrZSBhIGRvbWFpbi4KKyAgICAjCisgICAgIyBUaGlzIG1ldGhvZCBkb2Vzbid0IGFjdHVhbGx5IHZhbGlkYXRlIHRoZSBkb21haW4uCisgICAgIyBJdCBvbmx5IGNoZWNrcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBjb250YWlucworICAgICMgYSB2YWx1ZSBmb3IgdGhlIHsjdGxkfSBhbmQgeyNzbGR9IGF0dHJpYnV0ZXMuCisgICAgIyBJZiB5b3UgYWxzbyB3YW50IHRvIHZhbGlkYXRlIHRoZSBkb21haW4sCisgICAgIyB1c2UgeyN2YWxpZF9kb21haW4/fSBpbnN0ZWFkLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIpLmRvbWFpbj8KKyAgICAjICAgIyA9PiBmYWxzZQorICAgICMKKyAgICAjICAgUHVibGljU3VmZml4OjpEb21haW4ubmV3KCJjb20iLCAiZ29vZ2xlIikuZG9tYWluPworICAgICMgICAjID0+IHRydWUKKyAgICAjCisgICAgIyAgIFB1YmxpY1N1ZmZpeDo6RG9tYWluLm5ldygiY29tIiwgImdvb2dsZSIsICJ3d3ciKS5kb21haW4/CisgICAgIyAgICMgPT4gdHJ1ZQorICAgICMKKyAgICAjICAgIyBUaGlzIGlzIGFuIGludmFsaWQgZG9tYWluLCBidXQgcmV0dXJucyB0cnVlCisgICAgIyAgICMgYmVjYXVzZSB0aGlzIG1ldGhvZCBkb2Vzbid0IHZhbGlkYXRlIHRoZSBjb250ZW50LgorICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIsIG5pbCkuZG9tYWluPworICAgICMgICAjID0+IHRydWUKKyAgICAjCisgICAgIyBAc2VlICNzdWJkb21haW4/CisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgZG9tYWluPworICAgICAgIShAdGxkLm5pbD8gfHwgQHNsZC5uaWw/KQorICAgIGVuZAorCisgICAgIyBDaGVja3Mgd2hldGhlciA8dHQ+c2VsZjwvdHQ+IGxvb2tzIGxpa2UgYSBzdWJkb21haW4uCisgICAgIworICAgICMgVGhpcyBtZXRob2QgZG9lc24ndCBhY3R1YWxseSB2YWxpZGF0ZSB0aGUgc3ViZG9tYWluLgorICAgICMgSXQgb25seSBjaGVja3Mgd2hldGhlciB0aGUgaW5zdGFuY2UgY29udGFpbnMKKyAgICAjIGEgdmFsdWUgZm9yIHRoZSB7I3RsZH0sIHsjc2xkfSBhbmQgeyN0cmR9IGF0dHJpYnV0ZXMuCisgICAgIyBJZiB5b3UgYWxzbyB3YW50IHRvIHZhbGlkYXRlIHRoZSBkb21haW4sCisgICAgIyB1c2UgeyN2YWxpZF9zdWJkb21haW4/fSBpbnN0ZWFkLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIpLnN1YmRvbWFpbj8KKyAgICAjICAgIyA9PiBmYWxzZQorICAgICMKKyAgICAjICAgUHVibGljU3VmZml4OjpEb21haW4ubmV3KCJjb20iLCAiZ29vZ2xlIikuc3ViZG9tYWluPworICAgICMgICAjID0+IGZhbHNlCisgICAgIworICAgICMgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3Iikuc3ViZG9tYWluPworICAgICMgICAjID0+IHRydWUKKyAgICAjCisgICAgIyAgICMgVGhpcyBpcyBhbiBpbnZhbGlkIGRvbWFpbiwgYnV0IHJldHVybnMgdHJ1ZQorICAgICMgICAjIGJlY2F1c2UgdGhpcyBtZXRob2QgZG9lc24ndCB2YWxpZGF0ZSB0aGUgY29udGVudC4KKyAgICAjICAgUHVibGljU3VmZml4OjpEb21haW4ubmV3KCJjb20iLCAiZXhhbXBsZSIsIG5pbCkuc3ViZG9tYWluPworICAgICMgICAjID0+IHRydWUKKyAgICAjCisgICAgIyBAc2VlICNkb21haW4/CisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgc3ViZG9tYWluPworICAgICAgIShAdGxkLm5pbD8gfHwgQHNsZC5uaWw/IHx8IEB0cmQubmlsPykKKyAgICBlbmQKKworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L2Vycm9ycy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvbGliL3B1YmxpY19zdWZmaXgvZXJyb3JzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzZlNzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L2Vycm9ycy5yYgpAQCAtMCwwICsxLDM5IEBACisjID0gUHVibGljIFN1ZmZpeAorIworIyBEb21haW4gbmFtZSBwYXJzZXIgYmFzZWQgb24gdGhlIFB1YmxpYyBTdWZmaXggTGlzdC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5LTIwMTcgU2ltb25lIENhcmxldHRpIDx3ZXBwb3NAd2VwcG9zLm5ldD4KKworbW9kdWxlIFB1YmxpY1N1ZmZpeAorCisgIGNsYXNzIEVycm9yIDwgU3RhbmRhcmRFcnJvcgorICBlbmQKKworICAjIFJhaXNlZCB3aGVuIHRyeWluZyB0byBwYXJzZSBhbiBpbnZhbGlkIG5hbWUuCisgICMgQSBuYW1lIGlzIGNvbnNpZGVyZWQgaW52YWxpZCB3aGVuIG5vIHJ1bGUgaXMgZm91bmQgaW4gdGhlIGRlZmluaXRpb24gbGlzdC4KKyAgIworICAjIEBleGFtcGxlCisgICMKKyAgIyAgIFB1YmxpY1N1ZmZpeC5wYXJzZSgibmljLnRlc3QiKQorICAjICAgIyA9PiBQdWJsaWNTdWZmaXg6OkRvbWFpbkludmFsaWQKKyAgIworICAjICAgUHVibGljU3VmZml4LnBhcnNlKCJodHRwOi8vd3d3Lm5pYy5pdCIpCisgICMgICAjID0+IFB1YmxpY1N1ZmZpeDo6RG9tYWluSW52YWxpZAorICAjCisgIGNsYXNzIERvbWFpbkludmFsaWQgPCBFcnJvcgorICBlbmQKKworICAjIFJhaXNlZCB3aGVuIHRyeWluZyB0byBwYXJzZSBhIG5hbWUgdGhhdCBtYXRjaGVzIGEgc3VmZml4LgorICAjCisgICMgQGV4YW1wbGUKKyAgIworICAjICAgUHVibGljU3VmZml4LnBhcnNlKCJuaWMuZG8iKQorICAjICAgIyA9PiBQdWJsaWNTdWZmaXg6OkRvbWFpbk5vdEFsbG93ZWQKKyAgIworICAjICAgUHVibGljU3VmZml4LnBhcnNlKCJ3d3cubmljLmRvIikKKyAgIyAgICMgPT4gUHVibGljU3VmZml4OjpEb21haW4KKyAgIworICBjbGFzcyBEb21haW5Ob3RBbGxvd2VkIDwgRG9tYWluSW52YWxpZAorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L2xpc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L2xpc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlNTNhOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvbGliL3B1YmxpY19zdWZmaXgvbGlzdC5yYgpAQCAtMCwwICsxLDI0NSBAQAorIyA9IFB1YmxpYyBTdWZmaXgKKyMKKyMgRG9tYWluIG5hbWUgcGFyc2VyIGJhc2VkIG9uIHRoZSBQdWJsaWMgU3VmZml4IExpc3QuCisjCisjIENvcHlyaWdodCAoYykgMjAwOS0yMDE3IFNpbW9uZSBDYXJsZXR0aSA8d2VwcG9zQHdlcHBvcy5uZXQ+CisKK21vZHVsZSBQdWJsaWNTdWZmaXgKKworICAjIEEge1B1YmxpY1N1ZmZpeDo6TGlzdH0gaXMgYSBjb2xsZWN0aW9uIG9mIG9uZQorICAjIG9yIG1vcmUge1B1YmxpY1N1ZmZpeDo6UnVsZX0uCisgICMKKyAgIyBHaXZlbiBhIHtQdWJsaWNTdWZmaXg6Okxpc3R9LAorICAjIHlvdSBjYW4gYWRkIG9yIHJlbW92ZSB7UHVibGljU3VmZml4OjpSdWxlfSwKKyAgIyBpdGVyYXRlIGFsbCBpdGVtcyBpbiB0aGUgbGlzdCBvciBzZWFyY2ggZm9yIHRoZSBmaXJzdCBydWxlCisgICMgd2hpY2ggbWF0Y2hlcyBhIHNwZWNpZmljIGRvbWFpbiBuYW1lLgorICAjCisgICMgICAjIENyZWF0ZSBhIG5ldyBsaXN0CisgICMgICBsaXN0ID0gIFB1YmxpY1N1ZmZpeDo6TGlzdC5uZXcKKyAgIworICAjICAgIyBQdXNoIHR3byBydWxlcyB0byB0aGUgbGlzdAorICAjICAgbGlzdCA8PCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiaXQiKQorICAjICAgbGlzdCA8PCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiY29tIikKKyAgIworICAjICAgIyBHZXQgdGhlIHNpemUgb2YgdGhlIGxpc3QKKyAgIyAgIGxpc3Quc2l6ZQorICAjICAgIyA9PiAyCisgICMKKyAgIyAgICMgU2VhcmNoIGZvciB0aGUgcnVsZSBtYXRjaGluZyBnaXZlbiBkb21haW4KKyAgIyAgIGxpc3QuZmluZCgiZXhhbXBsZS5jb20iKQorICAjICAgIyA9PiAjPFB1YmxpY1N1ZmZpeDo6UnVsZTo6Tm9ybWFsPgorICAjICAgbGlzdC5maW5kKCJleGFtcGxlLm9yZyIpCisgICMgICAjID0+IG5pbAorICAjCisgICMgWW91IGNhbiBjcmVhdGUgYXMgbWFueSB7UHVibGljU3VmZml4OjpMaXN0fSB5b3Ugd2FudC4KKyAgIyBUaGUge1B1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0fSBydWxlIGxpc3QgaXMgdXNlZAorICAjIHRvIHRva2VuaXplIGFuZCB2YWxpZGF0ZSBhIGRvbWFpbi4KKyAgIworICBjbGFzcyBMaXN0CisKKyAgICBERUZBVUxUX0xJU1RfUEFUSCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uLy4uL2RhdGEvbGlzdC50eHQiLCBfX2Rpcl9fKQorCisgICAgIyBHZXRzIHRoZSBkZWZhdWx0IHJ1bGUgbGlzdC4KKyAgICAjCisgICAgIyBJbml0aWFsaXplcyBhIG5ldyB7UHVibGljU3VmZml4OjpMaXN0fSBwYXJzaW5nIHRoZSBjb250ZW50CisgICAgIyBvZiB7UHVibGljU3VmZml4OjpMaXN0LmRlZmF1bHRfbGlzdF9jb250ZW50fSwgaWYgcmVxdWlyZWQuCisgICAgIworICAgICMgQHJldHVybiBbUHVibGljU3VmZml4OjpMaXN0XQorICAgIGRlZiBzZWxmLmRlZmF1bHQoKipvcHRpb25zKQorICAgICAgQGRlZmF1bHQgfHw9IHBhcnNlKEZpbGUucmVhZChERUZBVUxUX0xJU1RfUEFUSCksIG9wdGlvbnMpCisgICAgZW5kCisKKyAgICAjIFNldHMgdGhlIGRlZmF1bHQgcnVsZSBsaXN0IHRvICt2YWx1ZSsuCisgICAgIworICAgICMgQHBhcmFtIFtQdWJsaWNTdWZmaXg6Okxpc3RdIHZhbHVlCisgICAgIyAgIFRoZSBuZXcgcnVsZSBsaXN0LgorICAgICMKKyAgICAjIEByZXR1cm4gW1B1YmxpY1N1ZmZpeDo6TGlzdF0KKyAgICBkZWYgc2VsZi5kZWZhdWx0PSh2YWx1ZSkKKyAgICAgIEBkZWZhdWx0ID0gdmFsdWUKKyAgICBlbmQKKworICAgICMgUGFyc2UgZ2l2ZW4gK2lucHV0KyB0cmVhdGluZyB0aGUgY29udGVudCBhcyBQdWJsaWMgU3VmZml4IExpc3QuCisgICAgIworICAgICMgU2VlIGh0dHA6Ly9wdWJsaWNzdWZmaXgub3JnL2Zvcm1hdC8gZm9yIG1vcmUgZGV0YWlscyBhYm91dCBpbnB1dCBmb3JtYXQuCisgICAgIworICAgICMgQHBhcmFtICBzdHJpbmcgWyNlYWNoX2xpbmVdIFRoZSBsaXN0IHRvIHBhcnNlLgorICAgICMgQHBhcmFtICBwcml2YXRlX2RvbWFpbnMgW0Jvb2xlYW5dIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBwcml2YXRlIGRvbWFpbnMgc2VjdGlvbi4KKyAgICAjIEByZXR1cm4gW0FycmF5PFB1YmxpY1N1ZmZpeDo6UnVsZTo6Kj5dCisgICAgZGVmIHNlbGYucGFyc2UoaW5wdXQsIHByaXZhdGVfZG9tYWluczogdHJ1ZSkKKyAgICAgIGNvbW1lbnRfdG9rZW4gPSAiLy8iLmZyZWV6ZQorICAgICAgcHJpdmF0ZV90b2tlbiA9ICI9PT1CRUdJTiBQUklWQVRFIERPTUFJTlM9PT0iLmZyZWV6ZQorICAgICAgc2VjdGlvbiA9IG5pbCAjIDEgPT0gSUNBTk4sIDIgPT0gUFJJVkFURQorCisgICAgICBuZXcgZG8gfGxpc3R8CisgICAgICAgIGlucHV0LmVhY2hfbGluZSBkbyB8bGluZXwKKyAgICAgICAgICBsaW5lLnN0cmlwIQorICAgICAgICAgIGNhc2UgIyBydWJvY29wOmRpc2FibGUgU3R5bGUvRW1wdHlDYXNlQ29uZGl0aW9uCisKKyAgICAgICAgICAjIHNraXAgYmxhbmsgbGluZXMKKyAgICAgICAgICB3aGVuIGxpbmUuZW1wdHk/CisgICAgICAgICAgICBuZXh0CisKKyAgICAgICAgICAjIGluY2x1ZGUgcHJpdmF0ZSBkb21haW5zIG9yIHN0b3Agc2Nhbm5lcgorICAgICAgICAgIHdoZW4gbGluZS5pbmNsdWRlPyhwcml2YXRlX3Rva2VuKQorICAgICAgICAgICAgYnJlYWsgaWYgIXByaXZhdGVfZG9tYWlucworICAgICAgICAgICAgc2VjdGlvbiA9IDIKKworICAgICAgICAgICMgc2tpcCBjb21tZW50cworICAgICAgICAgIHdoZW4gbGluZS5zdGFydF93aXRoPyhjb21tZW50X3Rva2VuKQorICAgICAgICAgICAgbmV4dAorCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbGlzdC5hZGQoUnVsZS5mYWN0b3J5KGxpbmUsIHByaXZhdGU6IHNlY3Rpb24gPT0gMikpCisKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworCisgICAgIyBJbml0aWFsaXplcyBhbiBlbXB0eSB7UHVibGljU3VmZml4OjpMaXN0fS4KKyAgICAjCisgICAgIyBAeWllbGQgW3NlbGZdIFlpZWxkcyBvbiBzZWxmLgorICAgICMgQHlpZWxkcGFyYW0gW1B1YmxpY1N1ZmZpeDo6TGlzdF0gc2VsZiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZS4KKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgQHJ1bGVzID0ge30KKyAgICAgIHlpZWxkKHNlbGYpIGlmIGJsb2NrX2dpdmVuPworICAgIGVuZAorCisKKyAgICAjIENoZWNrcyB3aGV0aGVyIHR3byBsaXN0cyBhcmUgZXF1YWwuCisgICAgIworICAgICMgTGlzdCA8dHQ+b25lPC90dD4gaXMgZXF1YWwgdG8gPHR0PnR3bzwvdHQ+LCBpZiA8dHQ+dHdvPC90dD4gaXMgYW4gaW5zdGFuY2Ugb2YKKyAgICAjIHtQdWJsaWNTdWZmaXg6Okxpc3R9IGFuZCBlYWNoICtQdWJsaWNTdWZmaXg6OlJ1bGU6OiorCisgICAgIyBpbiBsaXN0IDx0dD5vbmU8L3R0PiBpcyBhdmFpbGFibGUgaW4gbGlzdCA8dHQ+dHdvPC90dD4sIGluIHRoZSBzYW1lIG9yZGVyLgorICAgICMKKyAgICAjIEBwYXJhbSAgb3RoZXIgW1B1YmxpY1N1ZmZpeDo6TGlzdF0gdGhlIExpc3QgdG8gY29tcGFyZQorICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIG90aGVyLmlzX2E/KExpc3QpCisgICAgICBlcXVhbD8ob3RoZXIpIHx8IEBydWxlcyA9PSBvdGhlci5ydWxlcworICAgIGVuZAorICAgIGFsaWFzIGVxbD8gPT0KKworICAgICMgSXRlcmF0ZXMgZWFjaCBydWxlIGluIHRoZSBsaXN0LgorICAgIGRlZiBlYWNoKCZibG9jaykKKyAgICAgIEVudW1lcmF0b3IubmV3IGRvIHx5fAorICAgICAgICBAcnVsZXMuZWFjaCBkbyB8a2V5LCBub2RlfAorICAgICAgICAgIHkgPDwgZW50cnlfdG9fcnVsZShub2RlLCBrZXkpCisgICAgICAgIGVuZAorICAgICAgZW5kLmVhY2goJmJsb2NrKQorICAgIGVuZAorCisKKyAgICAjIEFkZHMgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgbGlzdCBhbmQgb3B0aW9uYWxseSByZWZyZXNoZXMgdGhlIHJ1bGUgaW5kZXguCisgICAgIworICAgICMgQHBhcmFtICBydWxlIFtQdWJsaWNTdWZmaXg6OlJ1bGU6OipdIHRoZSBydWxlIHRvIGFkZCB0byB0aGUgbGlzdAorICAgICMgQHJldHVybiBbc2VsZl0KKyAgICBkZWYgYWRkKHJ1bGUpCisgICAgICBAcnVsZXNbcnVsZS52YWx1ZV0gPSBydWxlX3RvX2VudHJ5KHJ1bGUpCisgICAgICBzZWxmCisgICAgZW5kCisgICAgYWxpYXMgPDwgYWRkCisKKyAgICAjIEdldHMgdGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgbGlzdC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgIGRlZiBzaXplCisgICAgICBAcnVsZXMuc2l6ZQorICAgIGVuZAorCisgICAgIyBDaGVja3Mgd2hldGhlciB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBlbXB0eT8KKyAgICAgIEBydWxlcy5lbXB0eT8KKyAgICBlbmQKKworICAgICMgUmVtb3ZlcyBhbGwgcnVsZXMuCisgICAgIworICAgICMgQHJldHVybiBbc2VsZl0KKyAgICBkZWYgY2xlYXIKKyAgICAgIEBydWxlcy5jbGVhcgorICAgICAgc2VsZgorICAgIGVuZAorCisgICAgIyBGaW5kcyBhbmQgcmV0dXJucyB0aGUgcnVsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb25nZXN0IHB1YmxpYyBzdWZmaXggZm9yIHRoZSBob3N0bmFtZS4KKyAgICAjCisgICAgIyBAcGFyYW0gIG5hbWUgWyN0b19zXSB0aGUgaG9zdG5hbWUKKyAgICAjIEBwYXJhbSAgZGVmYXVsdCBbUHVibGljU3VmZml4OjpSdWxlOjoqXSB0aGUgZGVmYXVsdCBydWxlIHRvIHJldHVybiBpbiBjYXNlIG5vIHJ1bGUgbWF0Y2hlcworICAgICMgQHJldHVybiBbUHVibGljU3VmZml4OjpSdWxlOjoqXQorICAgIGRlZiBmaW5kKG5hbWUsIGRlZmF1bHQ6IGRlZmF1bHRfcnVsZSwgKipvcHRpb25zKQorICAgICAgcnVsZSA9IHNlbGVjdChuYW1lLCAqKm9wdGlvbnMpLmluamVjdCBkbyB8bCwgcnwKKyAgICAgICAgcmV0dXJuIHIgaWYgci5jbGFzcyA9PSBSdWxlOjpFeGNlcHRpb24KKyAgICAgICAgbC5sZW5ndGggPiByLmxlbmd0aCA/IGwgOiByCisgICAgICBlbmQKKyAgICAgIHJ1bGUgfHwgZGVmYXVsdAorICAgIGVuZAorCisgICAgIyBTZWxlY3RzIGFsbCB0aGUgcnVsZXMgbWF0Y2hpbmcgZ2l2ZW4gaG9zdGFtZS4KKyAgICAjCisgICAgIyBJZiBgaWdub3JlX3ByaXZhdGVgIGlzIHNldCB0byB0cnVlLCB0aGUgYWxnb3JpdGhtIHdpbGwgc2tpcCB0aGUgcnVsZXMgdGhhdCBhcmUgZmxhZ2dlZCBhcworICAgICMgcHJpdmF0ZSBkb21haW4uIE5vdGUgdGhhdCB0aGUgcnVsZXMgd2lsbCBzdGlsbCBiZSBwYXJ0IG9mIHRoZSBsb29wLgorICAgICMgSWYgeW91IGZyZXF1ZW50bHkgbmVlZCB0byBhY2Nlc3MgbGlzdHMgaWdub3JpbmcgdGhlIHByaXZhdGUgZG9tYWlucywKKyAgICAjIHlvdSBzaG91bGQgY3JlYXRlIGEgbGlzdCB0aGF0IGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSBkb21haW5zIHNldHRpbmcgdGhlCisgICAgIyBgcHJpdmF0ZV9kb21haW5zOiBmYWxzZWAgb3B0aW9uIHdoZW4gY2FsbGluZyB7LnBhcnNlfS4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgY3VycmVudGx5IHByaXZhdGUsIGFzIHlvdSBzaG91bGQgbm90IHJlbHkgb24gaXQuIEluc3RlYWQsCisgICAgIyB0aGUgcHVibGljIGludGVyZmFjZSBpcyB7I2ZpbmR9LiBUaGUgY3VycmVudCBpbnRlcm5hbCBhbGdvcml0aG0gYWxsb3dzIHRvIHJldHVybiBhbGwKKyAgICAjIG1hdGNoaW5nIHJ1bGVzLCBidXQgZGlmZmVyZW50IGRhdGEgc3RydWN0dXJlcyBtYXkgbm90IGJlIGFibGUgdG8gZG8gaXQsIGFuZCBpbnN0ZWFkIHdvdWxkCisgICAgIyByZXR1cm4gb25seSB0aGUgbWF0Y2guIEZvciB0aGlzIHJlYXNvbiwgeW91IHNob3VsZCByZWx5IG9uIHsjZmluZH0uCisgICAgIworICAgICMgQHBhcmFtICBuYW1lIFsjdG9fc10gdGhlIGhvc3RuYW1lCisgICAgIyBAcGFyYW0gIGlnbm9yZV9wcml2YXRlIFtCb29sZWFuXQorICAgICMgQHJldHVybiBbQXJyYXk8UHVibGljU3VmZml4OjpSdWxlOjoqPl0KKyAgICBkZWYgc2VsZWN0KG5hbWUsIGlnbm9yZV9wcml2YXRlOiBmYWxzZSkKKyAgICAgIG5hbWUgPSBuYW1lLnRvX3MKKworICAgICAgcGFydHMgPSBuYW1lLnNwbGl0KERPVCkucmV2ZXJzZSEKKyAgICAgIGluZGV4ID0gMAorICAgICAgcXVlcnkgPSBwYXJ0c1tpbmRleF0KKyAgICAgIHJ1bGVzID0gW10KKworICAgICAgbG9vcCBkbworICAgICAgICBtYXRjaCA9IEBydWxlc1txdWVyeV0KKyAgICAgICAgaWYgIW1hdGNoLm5pbD8gJiYgKGlnbm9yZV9wcml2YXRlID09IGZhbHNlIHx8IG1hdGNoLnByaXZhdGUgPT0gZmFsc2UpCisgICAgICAgICAgcnVsZXMgPDwgZW50cnlfdG9fcnVsZShtYXRjaCwgcXVlcnkpCisgICAgICAgIGVuZAorCisgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgYnJlYWsgaWYgaW5kZXggPj0gcGFydHMuc2l6ZQorICAgICAgICBxdWVyeSA9IHBhcnRzW2luZGV4XSArIERPVCArIHF1ZXJ5CisgICAgICBlbmQKKworICAgICAgcnVsZXMKKyAgICBlbmQKKyAgICBwcml2YXRlIDpzZWxlY3QKKworICAgICMgR2V0cyB0aGUgZGVmYXVsdCBydWxlLgorICAgICMKKyAgICAjIEBzZWUgUHVibGljU3VmZml4OjpSdWxlLmRlZmF1bHRfcnVsZQorICAgICMKKyAgICAjIEByZXR1cm4gW1B1YmxpY1N1ZmZpeDo6UnVsZTo6Kl0KKyAgICBkZWYgZGVmYXVsdF9ydWxlCisgICAgICBQdWJsaWNTdWZmaXg6OlJ1bGUuZGVmYXVsdAorICAgIGVuZAorCisKKyAgICBwcm90ZWN0ZWQKKworICAgIGF0dHJfcmVhZGVyIDpydWxlcworCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgZW50cnlfdG9fcnVsZShlbnRyeSwgdmFsdWUpCisgICAgICBlbnRyeS50eXBlLm5ldyh2YWx1ZTogdmFsdWUsIGxlbmd0aDogZW50cnkubGVuZ3RoLCBwcml2YXRlOiBlbnRyeS5wcml2YXRlKQorICAgIGVuZAorCisgICAgZGVmIHJ1bGVfdG9fZW50cnkocnVsZSkKKyAgICAgIFJ1bGU6OkVudHJ5Lm5ldyhydWxlLmNsYXNzLCBydWxlLmxlbmd0aCwgcnVsZS5wcml2YXRlKQorICAgIGVuZAorCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L3J1bGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L3J1bGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkODE2OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvbGliL3B1YmxpY19zdWZmaXgvcnVsZS5yYgpAQCAtMCwwICsxLDM0OCBAQAorIyA9IFB1YmxpYyBTdWZmaXgKKyMKKyMgRG9tYWluIG5hbWUgcGFyc2VyIGJhc2VkIG9uIHRoZSBQdWJsaWMgU3VmZml4IExpc3QuCisjCisjIENvcHlyaWdodCAoYykgMjAwOS0yMDE3IFNpbW9uZSBDYXJsZXR0aSA8d2VwcG9zQHdlcHBvcy5uZXQ+CisKK21vZHVsZSBQdWJsaWNTdWZmaXgKKworICAjIEEgUnVsZSBpcyBhIHNwZWNpYWwgb2JqZWN0IHdoaWNoIGhvbGRzIGEgc2luZ2xlIGRlZmluaXRpb24KKyAgIyBvZiB0aGUgUHVibGljIFN1ZmZpeCBMaXN0LgorICAjCisgICMgVGhlcmUgYXJlIDMgdHlwZXMgb2YgcnVsZXMsIGVhY2ggb25lIHJlcHJlc2VudGVkIGJ5IGEgc3BlY2lmaWMKKyAgIyBzdWJjbGFzcyB3aXRoaW4gdGhlICtQdWJsaWNTdWZmaXg6OlJ1bGUrIG5hbWVzcGFjZS4KKyAgIworICAjIFRvIGNyZWF0ZSBhIG5ldyBSdWxlLCB1c2UgdGhlIHtQdWJsaWNTdWZmaXg6OlJ1bGUjZmFjdG9yeX0gbWV0aG9kLgorICAjCisgICMgICBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiYXIiKQorICAjICAgIyA9PiAjPFB1YmxpY1N1ZmZpeDo6UnVsZTo6Tm9ybWFsPgorICAjCisgIG1vZHVsZSBSdWxlCisKKyAgICAjIEBhcGkgaW50ZXJuYWwKKyAgICBFbnRyeSA9IFN0cnVjdC5uZXcoOnR5cGUsIDpsZW5ndGgsIDpwcml2YXRlKQorCisgICAgIyA9IEFic3RyYWN0IHJ1bGUgY2xhc3MKKyAgICAjCisgICAgIyBUaGlzIHJlcHJlc2VudCB0aGUgYmFzZSBjbGFzcyBmb3IgYSBSdWxlIGRlZmluaXRpb24KKyAgICAjIGluIHRoZSB7UHVibGljIFN1ZmZpeCBMaXN0fVtodHRwczovL3B1YmxpY3N1ZmZpeC5vcmddLgorICAgICMKKyAgICAjIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYW4gQWJzdHJhY3QgY2xhc3MKKyAgICAjIGFuZCB5b3Ugc2hvdWxkbid0IGNyZWF0ZSBhIGRpcmVjdCBpbnN0YW5jZS4gVGhlIG9ubHkgcHVycG9zZQorICAgICMgb2YgdGhpcyBjbGFzcyBpcyB0byBleHBvc2UgYSBjb21tb24gaW50ZXJmYWNlCisgICAgIyBmb3IgYWxsIHRoZSBhdmFpbGFibGUgc3ViY2xhc3Nlcy4KKyAgICAjCisgICAgIyAqIHtQdWJsaWNTdWZmaXg6OlJ1bGU6Ok5vcm1hbH0KKyAgICAjICoge1B1YmxpY1N1ZmZpeDo6UnVsZTo6RXhjZXB0aW9ufQorICAgICMgKiB7UHVibGljU3VmZml4OjpSdWxlOjpXaWxkY2FyZH0KKyAgICAjCisgICAgIyAjIyBQcm9wZXJ0aWVzCisgICAgIworICAgICMgQSBydWxlIGlzIGNvbXBvc2VkIGJ5IDQgcHJvcGVydGllczoKKyAgICAjCisgICAgIyB2YWx1ZSAgIC0gQSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIHJ1bGUgbmFtZS4KKyAgICAjICAgICAgICAgICBUaGUgbm9ybWFsaXphdGlvbiBwcm9jZXNzIGRlcGVuZHMgb24gcnVsZSB0cGUuCisgICAgIworICAgICMgSGVyZSdzIGFuIGV4YW1wbGUKKyAgICAjCisgICAgIyAgIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIqLmdvb2dsZS5jb20iKQorICAgICMgICAjPFB1YmxpY1N1ZmZpeDo6UnVsZTo6V2lsZGNhcmQ6MHgxMDE1YzE0YjAKKyAgICAjICAgICAgIEB2YWx1ZT0iZ29vZ2xlLmNvbSIKKyAgICAjICAgPgorICAgICMKKyAgICAjICMjIFJ1bGUgQ3JlYXRpb24KKyAgICAjCisgICAgIyBUaGUgYmVzdCB3YXkgdG8gY3JlYXRlIGEgbmV3IHJ1bGUgaXMgcGFzc2luZyB0aGUgcnVsZSBuYW1lCisgICAgIyB0byB0aGUgPHR0PlB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5PC90dD4gbWV0aG9kLgorICAgICMKKyAgICAjICAgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImNvbSIpCisgICAgIyAgICMgPT4gUHVibGljU3VmZml4OjpSdWxlOjpOb3JtYWwKKyAgICAjCisgICAgIyAgIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIqLmNvbSIpCisgICAgIyAgICMgPT4gUHVibGljU3VmZml4OjpSdWxlOjpXaWxkY2FyZAorICAgICMKKyAgICAjIFRoaXMgbWV0aG9kIHdpbGwgZGV0ZWN0IHRoZSBydWxlIHR5cGUgYW5kIGNyZWF0ZSBhbiBpbnN0YW5jZQorICAgICMgZnJvbSB0aGUgcHJvcGVyIHJ1bGUgY2xhc3MuCisgICAgIworICAgICMgIyMgUnVsZSBVc2FnZQorICAgICMKKyAgICAjIEEgcnVsZSBkZXNjcmliZXMgdGhlIGNvbXBvc2l0aW9uIG9mIGEgZG9tYWluIG5hbWUgYW5kIGV4cGxhaW5zIGhvdyB0byB0b2tlbml6ZQorICAgICMgdGhlIG5hbWUgaW50byB0bGQsIHNsZCBhbmQgdHJkLgorICAgICMKKyAgICAjIFRvIHVzZSBhIHJ1bGUsIHlvdSBmaXJzdCBuZWVkIHRvIGJlIHN1cmUgdGhlIG5hbWUgeW91IHdhbnQgdG8gdG9rZW5pemUKKyAgICAjIGNhbiBiZSBoYW5kbGVkIGJ5IHRoZSBjdXJyZW50IHJ1bGUuCisgICAgIyBZb3UgY2FuIHVzZSB0aGUgPHR0PiNtYXRjaD88L3R0PiBtZXRob2QuCisgICAgIworICAgICMgICBydWxlID0gUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImNvbSIpCisgICAgIworICAgICMgICBydWxlLm1hdGNoPygiZ29vZ2xlLmNvbSIpCisgICAgIyAgICMgPT4gdHJ1ZQorICAgICMKKyAgICAjICAgcnVsZS5tYXRjaD8oImdvb2dsZS5jb20iKQorICAgICMgICAjID0+IGZhbHNlCisgICAgIworICAgICMgUnVsZSBvcmRlciBpcyBzaWduaWZpY2FudC4gQSBuYW1lIGNhbiBtYXRjaCBtb3JlIHRoYW4gb25lIHJ1bGUuCisgICAgIyBTZWUgdGhlIHtQdWJsaWMgU3VmZml4IERvY3VtZW50YXRpb259W2h0dHA6Ly9wdWJsaWNzdWZmaXgub3JnL2Zvcm1hdC9dCisgICAgIyB0byBsZWFybiBtb3JlIGFib3V0IHJ1bGUgcHJpb3JpdHkuCisgICAgIworICAgICMgV2hlbiB5b3UgaGF2ZSB0aGUgcmlnaHQgcnVsZSwgeW91IGNhbiB1c2UgaXQgdG8gdG9rZW5pemUgdGhlIGRvbWFpbiBuYW1lLgorICAgICMKKyAgICAjICAgcnVsZSA9IFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJjb20iKQorICAgICMKKyAgICAjICAgcnVsZS5kZWNvbXBvc2UoImdvb2dsZS5jb20iKQorICAgICMgICAjID0+IFsiZ29vZ2xlIiwgImNvbSJdCisgICAgIworICAgICMgICBydWxlLmRlY29tcG9zZSgid3d3Lmdvb2dsZS5jb20iKQorICAgICMgICAjID0+IFsid3d3Lmdvb2dsZSIsICJjb20iXQorICAgICMKKyAgICAjIEBhYnN0cmFjdAorICAgICMKKyAgICBjbGFzcyBCYXNlCisKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXSB0aGUgcnVsZSBkZWZpbml0aW9uCisgICAgICBhdHRyX3JlYWRlciA6dmFsdWUKKworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddIHRoZSBsZW5ndGggb2YgdGhlIHJ1bGUKKyAgICAgIGF0dHJfcmVhZGVyIDpsZW5ndGgKKworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXSB0cnVlIGlmIHRoZSBydWxlIGlzIGEgcHJpdmF0ZSBkb21haW4KKyAgICAgIGF0dHJfcmVhZGVyIDpwcml2YXRlCisKKworICAgICAgIyBJbml0aWFsaXplcyBhIG5ldyBydWxlIGZyb20gdGhlIGNvbnRlbnQuCisgICAgICAjCisgICAgICAjIEBwYXJhbSAgY29udGVudCBbU3RyaW5nXSB0aGUgY29udGVudCBvZiB0aGUgcnVsZQorICAgICAgIyBAcGFyYW0gIHByaXZhdGUgW0Jvb2xlYW5dCisgICAgICBkZWYgc2VsZi5idWlsZChjb250ZW50LCBwcml2YXRlOiBmYWxzZSkKKyAgICAgICAgbmV3KHZhbHVlOiBjb250ZW50LCBwcml2YXRlOiBwcml2YXRlKQorICAgICAgZW5kCisKKyAgICAgICMgSW5pdGlhbGl6ZXMgYSBuZXcgcnVsZS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtICB2YWx1ZSBbU3RyaW5nXQorICAgICAgIyBAcGFyYW0gIHByaXZhdGUgW0Jvb2xlYW5dCisgICAgICBkZWYgaW5pdGlhbGl6ZSh2YWx1ZTosIGxlbmd0aDogbmlsLCBwcml2YXRlOiBmYWxzZSkKKyAgICAgICAgQHZhbHVlICAgID0gdmFsdWUudG9fcworICAgICAgICBAbGVuZ3RoICAgPSBsZW5ndGggfHwgQHZhbHVlLmNvdW50KERPVCkgKyAxCisgICAgICAgIEBwcml2YXRlICA9IHByaXZhdGUKKyAgICAgIGVuZAorCisgICAgICAjIENoZWNrcyB3aGV0aGVyIHRoaXMgcnVsZSBpcyBlcXVhbCB0byA8dHQ+b3RoZXI8L3R0Pi4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtICBbUHVibGljU3VmZml4OjpSdWxlOjoqXSBvdGhlciBUaGUgcnVsZSB0byBjb21wYXJlCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICAjICAgUmV0dXJucyB0cnVlIGlmIHRoaXMgcnVsZSBhbmQgb3RoZXIgYXJlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcworICAgICAgIyAgIGFuZCBoYXMgdGhlIHNhbWUgdmFsdWUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgIGRlZiA9PShvdGhlcikKKyAgICAgICAgZXF1YWw/KG90aGVyKSB8fCAoc2VsZi5jbGFzcyA9PSBvdGhlci5jbGFzcyAmJiB2YWx1ZSA9PSBvdGhlci52YWx1ZSkKKyAgICAgIGVuZAorICAgICAgYWxpYXMgZXFsPyA9PQorCisgICAgICAjIENoZWNrcyBpZiB0aGlzIHJ1bGUgbWF0Y2hlcyArbmFtZSsuCisgICAgICAjCisgICAgICAjIEEgZG9tYWluIG5hbWUgaXMgc2FpZCB0byBtYXRjaCBhIHJ1bGUgaWYgYW5kIG9ubHkgaWYKKyAgICAgICMgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICAgICAgIworICAgICAgIyAtIFdoZW4gdGhlIGRvbWFpbiBhbmQgcnVsZSBhcmUgc3BsaXQgaW50byBjb3JyZXNwb25kaW5nIGxhYmVscywKKyAgICAgICMgICB0aGF0IHRoZSBkb21haW4gY29udGFpbnMgYXMgbWFueSBvciBtb3JlIGxhYmVscyB0aGFuIHRoZSBydWxlLgorICAgICAgIyAtIEJlZ2lubmluZyB3aXRoIHRoZSByaWdodC1tb3N0IGxhYmVscyBvZiBib3RoIHRoZSBkb21haW4gYW5kIHRoZSBydWxlLAorICAgICAgIyAgIGFuZCBjb250aW51aW5nIGZvciBhbGwgbGFiZWxzIGluIHRoZSBydWxlLCBvbmUgZmluZHMgdGhhdCBmb3IgZXZlcnkgcGFpciwKKyAgICAgICMgICBlaXRoZXIgdGhleSBhcmUgaWRlbnRpY2FsLCBvciB0aGF0IHRoZSBsYWJlbCBmcm9tIHRoZSBydWxlIGlzICIqIi4KKyAgICAgICMKKyAgICAgICMgQHNlZSBodHRwczovL3B1YmxpY3N1ZmZpeC5vcmcvbGlzdC8KKyAgICAgICMKKyAgICAgICMgQGV4YW1wbGUKKyAgICAgICMgICBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiY29tIikubWF0Y2g/KCJleGFtcGxlLmNvbSIpCisgICAgICAjICAgIyA9PiB0cnVlCisgICAgICAjICAgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImNvbSIpLm1hdGNoPygiZXhhbXBsZS5uZXQiKQorICAgICAgIyAgICMgPT4gZmFsc2UKKyAgICAgICMKKyAgICAgICMgQHBhcmFtICBuYW1lIFtTdHJpbmddIHRoZSBkb21haW4gbmFtZSB0byBjaGVjaworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIG1hdGNoPyhuYW1lKQorICAgICAgICAjIE5vdGU6IGl0IHdvcmtzIGJlY2F1c2Ugb2YgdGhlIGFzc3VtcHRpb24gdGhlcmUgYXJlIG5vCisgICAgICAgICMgcnVsZXMgbGlrZSBmb28uKi5jb20uIElmIHRoZSBhc3N1bXB0aW9uIGlzIGluY29ycmVjdCwKKyAgICAgICAgIyB3ZSBuZWVkIHRvIHByb3Blcmx5IHdhbGsgdGhlIGlucHV0IGFuZCBza2lwIHBhcnRzIGFjY29yZGluZworICAgICAgICAjIHRvIHdpbGRjYXJkIGNvbXBvbmVudC4KKyAgICAgICAgZGlmZiA9IG5hbWUuY2hvbXAodmFsdWUpCisgICAgICAgIGRpZmYuZW1wdHk/IHx8IGRpZmZbLTFdID09IERPVAorICAgICAgZW5kCisKKyAgICAgICMgQGFic3RyYWN0CisgICAgICBkZWYgcGFydHMKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgZW5kCisKKyAgICAgICMgQGFic3RyYWN0CisgICAgICAjIEBwYXJhbSAgW1N0cmluZywgI3RvX3NdIG5hbWUgVGhlIGRvbWFpbiBuYW1lIHRvIGRlY29tcG9zZQorICAgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmcsIG5pbD5dCisgICAgICBkZWYgZGVjb21wb3NlKCopCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgICAjIE5vcm1hbCByZXByZXNlbnRzIGEgc3RhbmRhcmQgcnVsZSAoZS5nLiBjb20pLgorICAgIGNsYXNzIE5vcm1hbCA8IEJhc2UKKworICAgICAgIyBHZXRzIHRoZSBvcmlnaW5hbCBydWxlIGRlZmluaXRpb24uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHJ1bGUgZGVmaW5pdGlvbi4KKyAgICAgIGRlZiBydWxlCisgICAgICAgIHZhbHVlCisgICAgICBlbmQKKworICAgICAgIyBEZWNvbXBvc2VzIHRoZSBkb21haW4gbmFtZSBhY2NvcmRpbmcgdG8gcnVsZSBwcm9wZXJ0aWVzLgorICAgICAgIworICAgICAgIyBAcGFyYW0gIFtTdHJpbmcsICN0b19zXSBuYW1lIFRoZSBkb21haW4gbmFtZSB0byBkZWNvbXBvc2UKKyAgICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nPl0gVGhlIGFycmF5IHdpdGggW3RyZCArIHNsZCwgdGxkXS4KKyAgICAgIGRlZiBkZWNvbXBvc2UoZG9tYWluKQorICAgICAgICBzdWZmaXggPSBwYXJ0cy5qb2luKCdcLicpCisgICAgICAgIG1hdGNoZXMgPSBkb21haW4udG9fcy5tYXRjaCgvXiguKilcLigje3N1ZmZpeH0pJC8pCisgICAgICAgIG1hdGNoZXMgPyBtYXRjaGVzWzEuLjJdIDogW25pbCwgbmlsXQorICAgICAgZW5kCisKKyAgICAgICMgZG90LXNwbGl0IHJ1bGUgdmFsdWUgYW5kIHJldHVybnMgYWxsIHJ1bGUgcGFydHMKKyAgICAgICMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSB2YWx1ZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nPl0KKyAgICAgIGRlZiBwYXJ0cworICAgICAgICBAdmFsdWUuc3BsaXQoRE9UKQorICAgICAgZW5kCisKKyAgICBlbmQKKworICAgICMgV2lsZGNhcmQgcmVwcmVzZW50cyBhIHdpbGRjYXJkIHJ1bGUgKGUuZy4gKi5jby51aykuCisgICAgY2xhc3MgV2lsZGNhcmQgPCBCYXNlCisKKyAgICAgICMgSW5pdGlhbGl6ZXMgYSBuZXcgcnVsZSBmcm9tIHRoZSBjb250ZW50LgorICAgICAgIworICAgICAgIyBAcGFyYW0gIGNvbnRlbnQgW1N0cmluZ10gdGhlIGNvbnRlbnQgb2YgdGhlIHJ1bGUKKyAgICAgICMgQHBhcmFtICBwcml2YXRlIFtCb29sZWFuXQorICAgICAgZGVmIHNlbGYuYnVpbGQoY29udGVudCwgcHJpdmF0ZTogZmFsc2UpCisgICAgICAgIG5ldyh2YWx1ZTogY29udGVudC50b19zWzIuLi0xXSwgcHJpdmF0ZTogcHJpdmF0ZSkKKyAgICAgIGVuZAorCisgICAgICAjIEluaXRpYWxpemVzIGEgbmV3IHJ1bGUuCisgICAgICAjCisgICAgICAjIEBwYXJhbSAgdmFsdWUgW1N0cmluZ10KKyAgICAgICMgQHBhcmFtICBwcml2YXRlIFtCb29sZWFuXQorICAgICAgZGVmIGluaXRpYWxpemUodmFsdWU6LCBsZW5ndGg6IG5pbCwgcHJpdmF0ZTogZmFsc2UpCisgICAgICAgIHN1cGVyKHZhbHVlOiB2YWx1ZSwgbGVuZ3RoOiBsZW5ndGgsIHByaXZhdGU6IHByaXZhdGUpCisgICAgICAgIGxlbmd0aCBvciBAbGVuZ3RoICs9IDEgIyAqIGNvdW50cyBhcyAxCisgICAgICBlbmQKKworICAgICAgIyBHZXRzIHRoZSBvcmlnaW5hbCBydWxlIGRlZmluaXRpb24uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHJ1bGUgZGVmaW5pdGlvbi4KKyAgICAgIGRlZiBydWxlCisgICAgICAgIHZhbHVlID09ICIiID8gU1RBUiA6IFNUQVIgKyBET1QgKyB2YWx1ZQorICAgICAgZW5kCisKKyAgICAgICMgRGVjb21wb3NlcyB0aGUgZG9tYWluIG5hbWUgYWNjb3JkaW5nIHRvIHJ1bGUgcHJvcGVydGllcy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtICBbU3RyaW5nLCAjdG9fc10gbmFtZSBUaGUgZG9tYWluIG5hbWUgdG8gZGVjb21wb3NlCisgICAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZz5dIFRoZSBhcnJheSB3aXRoIFt0cmQgKyBzbGQsIHRsZF0uCisgICAgICBkZWYgZGVjb21wb3NlKGRvbWFpbikKKyAgICAgICAgc3VmZml4ID0gKFsiLio/Il0gKyBwYXJ0cykuam9pbignXC4nKQorICAgICAgICBtYXRjaGVzID0gZG9tYWluLnRvX3MubWF0Y2goL14oLiopXC4oI3tzdWZmaXh9KSQvKQorICAgICAgICBtYXRjaGVzID8gbWF0Y2hlc1sxLi4yXSA6IFtuaWwsIG5pbF0KKyAgICAgIGVuZAorCisgICAgICAjIGRvdC1zcGxpdCBydWxlIHZhbHVlIGFuZCByZXR1cm5zIGFsbCBydWxlIHBhcnRzCisgICAgICAjIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgdmFsdWUuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZz5dCisgICAgICBkZWYgcGFydHMKKyAgICAgICAgQHZhbHVlLnNwbGl0KERPVCkKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgICAjIEV4Y2VwdGlvbiByZXByZXNlbnRzIGFuIGV4Y2VwdGlvbiBydWxlIChlLmcuICFwYXJsaWFtZW50LnVrKS4KKyAgICBjbGFzcyBFeGNlcHRpb24gPCBCYXNlCisKKyAgICAgICMgSW5pdGlhbGl6ZXMgYSBuZXcgcnVsZSBmcm9tIHRoZSBjb250ZW50LgorICAgICAgIworICAgICAgIyBAcGFyYW0gIGNvbnRlbnQgW1N0cmluZ10gdGhlIGNvbnRlbnQgb2YgdGhlIHJ1bGUKKyAgICAgICMgQHBhcmFtICBwcml2YXRlIFtCb29sZWFuXQorICAgICAgZGVmIHNlbGYuYnVpbGQoY29udGVudCwgcHJpdmF0ZTogZmFsc2UpCisgICAgICAgIG5ldyh2YWx1ZTogY29udGVudC50b19zWzEuLi0xXSwgcHJpdmF0ZTogcHJpdmF0ZSkKKyAgICAgIGVuZAorCisgICAgICAjIEdldHMgdGhlIG9yaWdpbmFsIHJ1bGUgZGVmaW5pdGlvbi4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgcnVsZSBkZWZpbml0aW9uLgorICAgICAgZGVmIHJ1bGUKKyAgICAgICAgQkFORyArIHZhbHVlCisgICAgICBlbmQKKworICAgICAgIyBEZWNvbXBvc2VzIHRoZSBkb21haW4gbmFtZSBhY2NvcmRpbmcgdG8gcnVsZSBwcm9wZXJ0aWVzLgorICAgICAgIworICAgICAgIyBAcGFyYW0gIFtTdHJpbmcsICN0b19zXSBuYW1lIFRoZSBkb21haW4gbmFtZSB0byBkZWNvbXBvc2UKKyAgICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nPl0gVGhlIGFycmF5IHdpdGggW3RyZCArIHNsZCwgdGxkXS4KKyAgICAgIGRlZiBkZWNvbXBvc2UoZG9tYWluKQorICAgICAgICBzdWZmaXggPSBwYXJ0cy5qb2luKCdcLicpCisgICAgICAgIG1hdGNoZXMgPSBkb21haW4udG9fcy5tYXRjaCgvXiguKilcLigje3N1ZmZpeH0pJC8pCisgICAgICAgIG1hdGNoZXMgPyBtYXRjaGVzWzEuLjJdIDogW25pbCwgbmlsXQorICAgICAgZW5kCisKKyAgICAgICMgZG90LXNwbGl0IHJ1bGUgdmFsdWUgYW5kIHJldHVybnMgYWxsIHJ1bGUgcGFydHMKKyAgICAgICMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSB2YWx1ZS4KKyAgICAgICMgVGhlIGxlZnRtb3N0IGxhYmVsIGlzIG5vdCBjb25zaWRlcmVkIGEgbGFiZWwuCisgICAgICAjCisgICAgICAjIFNlZSBodHRwOi8vcHVibGljc3VmZml4Lm9yZy9mb3JtYXQvOgorICAgICAgIyBJZiB0aGUgcHJldmFpbGluZyBydWxlIGlzIGEgZXhjZXB0aW9uIHJ1bGUsCisgICAgICAjIG1vZGlmeSBpdCBieSByZW1vdmluZyB0aGUgbGVmdG1vc3QgbGFiZWwuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZz5dCisgICAgICBkZWYgcGFydHMKKyAgICAgICAgQHZhbHVlLnNwbGl0KERPVClbMS4uLTFdCisgICAgICBlbmQKKworICAgIGVuZAorCisKKyAgICAjIFRha2VzIHRoZSArbmFtZSsgb2YgdGhlIHJ1bGUsIGRldGVjdHMgdGhlIHNwZWNpZmljIHJ1bGUgY2xhc3MKKyAgICAjIGFuZCBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MuCisgICAgIyBUaGUgK25hbWUrIGJlY29tZXMgdGhlIHJ1bGUgK3ZhbHVlKy4KKyAgICAjCisgICAgIyBAZXhhbXBsZSBDcmVhdGVzIGEgTm9ybWFsIHJ1bGUKKyAgICAjICAgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImFyIikKKyAgICAjICAgIyA9PiAjPFB1YmxpY1N1ZmZpeDo6UnVsZTo6Tm9ybWFsPgorICAgICMKKyAgICAjIEBleGFtcGxlIENyZWF0ZXMgYSBXaWxkY2FyZCBydWxlCisgICAgIyAgIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIqLmFyIikKKyAgICAjICAgIyA9PiAjPFB1YmxpY1N1ZmZpeDo6UnVsZTo6V2lsZGNhcmQ+CisgICAgIworICAgICMgQGV4YW1wbGUgQ3JlYXRlcyBhbiBFeGNlcHRpb24gcnVsZQorICAgICMgICBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiIWNvbmdyZXNvZGVsYWxlbmd1YTMuYXIiKQorICAgICMgICAjID0+ICM8UHVibGljU3VmZml4OjpSdWxlOjpFeGNlcHRpb24+CisgICAgIworICAgICMgQHBhcmFtICBbU3RyaW5nXSBjb250ZW50IFRoZSBydWxlIGNvbnRlbnQuCisgICAgIyBAcmV0dXJuIFtQdWJsaWNTdWZmaXg6OlJ1bGU6OipdIEEgcnVsZSBpbnN0YW5jZS4KKyAgICBkZWYgc2VsZi5mYWN0b3J5KGNvbnRlbnQsIHByaXZhdGU6IGZhbHNlKQorICAgICAgY2FzZSBjb250ZW50LnRvX3NbMCwgMV0KKyAgICAgIHdoZW4gU1RBUgorICAgICAgICBXaWxkY2FyZAorICAgICAgd2hlbiBCQU5HCisgICAgICAgIEV4Y2VwdGlvbgorICAgICAgZWxzZQorICAgICAgICBOb3JtYWwKKyAgICAgIGVuZC5idWlsZChjb250ZW50LCBwcml2YXRlOiBwcml2YXRlKQorICAgIGVuZAorCisgICAgIyBUaGUgZGVmYXVsdCBydWxlIHRvIHVzZSBpZiBubyBydWxlIG1hdGNoLgorICAgICMKKyAgICAjIFRoZSBkZWZhdWx0IHJ1bGUgaXMgIioiLiBGcm9tIGh0dHBzOi8vcHVibGljc3VmZml4Lm9yZy9saXN0LzoKKyAgICAjCisgICAgIyA+IElmIG5vIHJ1bGVzIG1hdGNoLCB0aGUgcHJldmFpbGluZyBydWxlIGlzICIqIi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtQdWJsaWNTdWZmaXg6OlJ1bGU6OldpbGRjYXJkXSBUaGUgZGVmYXVsdCBydWxlLgorICAgIGRlZiBzZWxmLmRlZmF1bHQKKyAgICAgIGZhY3RvcnkoU1RBUikKKyAgICBlbmQKKworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L3ZlcnNpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL2xpYi9wdWJsaWNfc3VmZml4L3ZlcnNpb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyMmFiMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvbGliL3B1YmxpY19zdWZmaXgvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDEwIEBACisjID0gUHVibGljIFN1ZmZpeAorIworIyBEb21haW4gbmFtZSBwYXJzZXIgYmFzZWQgb24gdGhlIFB1YmxpYyBTdWZmaXggTGlzdC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5LTIwMTcgU2ltb25lIENhcmxldHRpIDx3ZXBwb3NAd2VwcG9zLm5ldD4KKworbW9kdWxlIFB1YmxpY1N1ZmZpeAorICAjIFRoZSBjdXJyZW50IGxpYnJhcnkgdmVyc2lvbi4KKyAgVkVSU0lPTiA9ICIzLjAuMCIuZnJlZXplCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvcHVibGljX3N1ZmZpeC5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC9wdWJsaWNfc3VmZml4LmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiZmNjZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvcHVibGljX3N1ZmZpeC5nZW1zcGVjCkBAIC0wLDAgKzEsMjUgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyRMT0FEX1BBVEgucHVzaCBGaWxlLmV4cGFuZF9wYXRoKCIuLi9saWIiLCBfX0ZJTEVfXykKK3JlcXVpcmUgInB1YmxpY19zdWZmaXgvdmVyc2lvbiIKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lICAgICAgICA9ICJwdWJsaWNfc3VmZml4IgorICBzLnZlcnNpb24gICAgID0gUHVibGljU3VmZml4OjpWRVJTSU9OCisgIHMuYXV0aG9ycyAgICAgPSBbIlNpbW9uZSBDYXJsZXR0aSJdCisgIHMuZW1haWwgICAgICAgPSBbIndlcHBvc0B3ZXBwb3MubmV0Il0KKyAgcy5ob21lcGFnZSAgICA9ICJodHRwczovL3NpbW9uZWNhcmxldHRpLmNvbS9jb2RlL3B1YmxpY3N1ZmZpeC1ydWJ5IgorICBzLnN1bW1hcnkgICAgID0gIkRvbWFpbiBuYW1lIHBhcnNlciBiYXNlZCBvbiB0aGUgUHVibGljIFN1ZmZpeCBMaXN0LiIKKyAgcy5kZXNjcmlwdGlvbiA9ICJQdWJsaWNTdWZmaXggY2FuIHBhcnNlIGFuZCBkZWNvbXBvc2UgYSBkb21haW4gbmFtZSBpbnRvIHRvcCBsZXZlbCBkb21haW4sIGRvbWFpbiBhbmQgc3ViZG9tYWlucy4iCisgIHMubGljZW5zZXMgICAgPSBbIk1JVCJdCisKKyAgcy5yZXF1aXJlZF9ydWJ5X3ZlcnNpb24gPSAiPj0gMi4xIgorCisgIHMucmVxdWlyZV9wYXRocyAgICA9IFsibGliIl0KKyAgcy5maWxlcyAgICAgICAgICAgID0gYGdpdCBscy1maWxlc2Auc3BsaXQoIlxuIikKKyAgcy50ZXN0X2ZpbGVzICAgICAgID0gYGdpdCBscy1maWxlcyAtLSB7dGVzdCxzcGVjLGZlYXR1cmVzfS8qYC5zcGxpdCgiXG4iKQorICBzLmV4dHJhX3Jkb2NfZmlsZXMgPSAldyggTElDRU5TRS50eHQgKQorCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInJha2UiCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgIm1vY2hhIgorICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJ5YXJkIgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvLmVtcHR5IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0Ly5lbXB0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzIyMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0Ly5lbXB0eQpAQCAtMCwwICsxLDIgQEAKKyMgVGhpcyBpcyBhbiBlbXB0eSBmaWxlIEkgdXNlIHRvIGZvcmNlIGEgbm9uLWVtcHR5IGNvbW1pdCB3aGVuIEkgb25seSBuZWVkIHRvIHN0b3JlIG5vdGVzCisuLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9hY2NlcHRhbmNlX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYWNjZXB0YW5jZV90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2Y0MWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYWNjZXB0YW5jZV90ZXN0LnJiCkBAIC0wLDAgKzEsMTI3IEBACityZXF1aXJlICJ0ZXN0X2hlbHBlciIKKworY2xhc3MgQWNjZXB0YW5jZVRlc3QgPCBNaW5pdGVzdDo6VGVzdAorCisgIFZBTElEX0NBU0VTID0gWworICAgICAgWyJleGFtcGxlLmNvbSIsICAgICAgICAgICAgICJleGFtcGxlLmNvbSIsICAgICAgICBbbmlsLCAiZXhhbXBsZSIsICJjb20iXV0sCisgICAgICBbImZvby5leGFtcGxlLmNvbSIsICAgICAgICAgImV4YW1wbGUuY29tIiwgICAgICAgIFsiZm9vIiwgImV4YW1wbGUiLCAiY29tIl1dLAorCisgICAgICBbInZlcnlicml0aXNoLmNvLnVrIiwgICAgICAgInZlcnlicml0aXNoLmNvLnVrIiwgIFtuaWwsICJ2ZXJ5YnJpdGlzaCIsICJjby51ayJdXSwKKyAgICAgIFsiZm9vLnZlcnlicml0aXNoLmNvLnVrIiwgICAidmVyeWJyaXRpc2guY28udWsiLCAgWyJmb28iLCAidmVyeWJyaXRpc2giLCAiY28udWsiXV0sCisKKyAgICAgIFsicGFybGlhbWVudC51ayIsICAgICAgICAgICAicGFybGlhbWVudC51ayIsICAgICAgW25pbCwgInBhcmxpYW1lbnQiLCAidWsiXV0sCisgICAgICBbImZvby5wYXJsaWFtZW50LnVrIiwgICAgICAgInBhcmxpYW1lbnQudWsiLCAgICAgIFsiZm9vIiwgInBhcmxpYW1lbnQiLCAidWsiXV0sCisgIF0uZnJlZXplCisKKyAgZGVmIHRlc3RfdmFsaWQKKyAgICBWQUxJRF9DQVNFUy5lYWNoIGRvIHxpbnB1dCwgZG9tYWluLCByZXN1bHRzfAorICAgICAgcGFyc2VkID0gUHVibGljU3VmZml4LnBhcnNlKGlucHV0KQorICAgICAgdHJkLCBzbGQsIHRsZCA9IHJlc3VsdHMKKyAgICAgIGFzc2VydF9lcXVhbCB0bGQsIHBhcnNlZC50bGQsICJJbnZhbGlkIHRsZCBmb3IgYCN7bmFtZX1gIgorICAgICAgYXNzZXJ0X2VxdWFsIHNsZCwgcGFyc2VkLnNsZCwgIkludmFsaWQgc2xkIGZvciBgI3tuYW1lfWAiCisgICAgICBpZiB0cmQubmlsPworICAgICAgICBhc3NlcnRfbmlsIHBhcnNlZC50cmQsICJJbnZhbGlkIHRyZCBmb3IgYCN7bmFtZX1gIgorICAgICAgZWxzZQorICAgICAgICBhc3NlcnRfZXF1YWwgdHJkLCBwYXJzZWQudHJkLCAiSW52YWxpZCB0cmQgZm9yIGAje25hbWV9YCIKKyAgICAgIGVuZAorCisgICAgICBhc3NlcnRfZXF1YWwgZG9tYWluLCBQdWJsaWNTdWZmaXguZG9tYWluKGlucHV0KQorICAgICAgYXNzZXJ0IFB1YmxpY1N1ZmZpeC52YWxpZD8oaW5wdXQpCisgICAgZW5kCisgIGVuZAorCisKKyAgSU5WQUxJRF9DQVNFUyA9IFsKKyAgICAgIFsibmljLmtlIiwgICAgICAgICAgICAgICAgICBQdWJsaWNTdWZmaXg6OkRvbWFpbk5vdEFsbG93ZWRdLAorICAgICAgW25pbCwgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpY1N1ZmZpeDo6RG9tYWluSW52YWxpZF0sCisgICAgICBbIiIsICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljU3VmZml4OjpEb21haW5JbnZhbGlkXSwKKyAgICAgIFsiICAiLCAgICAgICAgICAgICAgICAgICAgICBQdWJsaWNTdWZmaXg6OkRvbWFpbkludmFsaWRdLAorICBdLmZyZWV6ZQorCisgIGRlZiB0ZXN0X2ludmFsaWQKKyAgICBJTlZBTElEX0NBU0VTLmVhY2ggZG8gfChuYW1lLCBlcnJvcil8CisgICAgICBhc3NlcnRfcmFpc2VzKGVycm9yKSB7IFB1YmxpY1N1ZmZpeC5wYXJzZShuYW1lKSB9CisgICAgICBhc3NlcnQgIVB1YmxpY1N1ZmZpeC52YWxpZD8obmFtZSkKKyAgICBlbmQKKyAgZW5kCisKKworICBSRUpFQ1RFRF9DQVNFUyA9IFsKKyAgICAgIFsid3d3LiAuY29tIiwgICAgICAgICAgIHRydWVdLAorICAgICAgWyJmb28uY28uLnVrIiwgICAgICAgICAgdHJ1ZV0sCisgICAgICBbImdvbyxnbGUuY29tIiwgICAgICAgICB0cnVlXSwKKyAgICAgIFsiLWdvb2dsZS5jb20iLCAgICAgICAgIHRydWVdLAorICAgICAgWyJnb29nbGUtLmNvbSIsICAgICAgICAgdHJ1ZV0sCisKKyAgICAgICMgVGhpcyBjYXNlIHdhcyBjb3ZlcmVkIGluIEdILTE1LgorICAgICAgIyBJIGRlY2lkZWQgdG8gY292ZXIgdGhpcyBjYXNlIGJlY2F1c2UgaXQncyBub3QgZWFzaWx5IHJlcHJvZHVjaWJsZSB3aXRoIFVSSS5wYXJzZQorICAgICAgIyBhbmQgY2FuIGxlYWQgdG8gc2V2ZXJhbCBmYWxzZSBwb3NpdGl2ZXMuCisgICAgICBbImh0dHA6Ly9nb29nbGUuY29tIiwgICBmYWxzZV0sCisgIF0uZnJlZXplCisKKyAgZGVmIHRlc3RfcmVqZWN0ZWQKKyAgICBSRUpFQ1RFRF9DQVNFUy5lYWNoIGRvIHxuYW1lLCBleHBlY3RlZHwKKyAgICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgUHVibGljU3VmZml4LnZhbGlkPyhuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgJXMgdG8gYmUgJXMiICUgW25hbWUuaW5zcGVjdCwgZXhwZWN0ZWQuaW5zcGVjdF0KKyAgICAgIGFzc2VydCAhdmFsaWRfZG9tYWluPyhuYW1lKSwKKyAgICAgICAgICAgICAiI3tuYW1lfSBleHBlY3RlZCB0byBiZSBpbnZhbGlkIgorICAgIGVuZAorICBlbmQKKworCisgIENBU0VfQ0FTRVMgPSBbCisgICAgICBbIld3dy5nb29nbGUuY29tIiwgJXcoIHd3dyBnb29nbGUgY29tICldLAorICAgICAgWyJ3d3cuR29vZ2xlLmNvbSIsICV3KCB3d3cgZ29vZ2xlIGNvbSApXSwKKyAgICAgIFsid3d3Lmdvb2dsZS5Db20iLCAldyggd3d3IGdvb2dsZSBjb20gKV0sCisgIF0uZnJlZXplCisKKyAgZGVmIHRlc3RfaWdub3JlX2Nhc2UKKyAgICBDQVNFX0NBU0VTLmVhY2ggZG8gfG5hbWUsIHJlc3VsdHN8CisgICAgICBkb21haW4gPSBQdWJsaWNTdWZmaXgucGFyc2UobmFtZSkKKyAgICAgIHRyZCwgc2xkLCB0bGQgPSByZXN1bHRzCisgICAgICBhc3NlcnRfZXF1YWwgdGxkLCBkb21haW4udGxkLCAiSW52YWxpZCB0bGQgZm9yIGAje25hbWV9JyIKKyAgICAgIGFzc2VydF9lcXVhbCBzbGQsIGRvbWFpbi5zbGQsICJJbnZhbGlkIHNsZCBmb3IgYCN7bmFtZX0nIgorICAgICAgYXNzZXJ0X2VxdWFsIHRyZCwgZG9tYWluLnRyZCwgIkludmFsaWQgdHJkIGZvciBgI3tuYW1lfSciCisgICAgICBhc3NlcnQgUHVibGljU3VmZml4LnZhbGlkPyhuYW1lKQorICAgIGVuZAorICBlbmQKKworCisgIElOQ0xVREVfUFJJVkFURV9DQVNFUyA9IFsKKyAgICAgIFsiYmxvZ3Nwb3QuY29tIiwgdHJ1ZSwgImJsb2dzcG90LmNvbSJdLAorICAgICAgWyJibG9nc3BvdC5jb20iLCBmYWxzZSwgbmlsXSwKKyAgICAgIFsic3ViZG9tYWluLmJsb2dzcG90LmNvbSIsIHRydWUsICJibG9nc3BvdC5jb20iXSwKKyAgICAgIFsic3ViZG9tYWluLmJsb2dzcG90LmNvbSIsIGZhbHNlLCAic3ViZG9tYWluLmJsb2dzcG90LmNvbSJdLAorICBdLmZyZWV6ZQorCisgIGRlZiB0ZXN0X2lnbm9yZV9wcml2YXRlCisgICAgIyB0ZXN0IGRvbWFpbiBhbmQgcGFyc2UKKyAgICBJTkNMVURFX1BSSVZBVEVfQ0FTRVMuZWFjaCBkbyB8Z2l2ZW4sIGlnbm9yZV9wcml2YXRlLCBleHBlY3RlZHwKKyAgICAgIGlmIGV4cGVjdGVkLm5pbD8KKyAgICAgICAgYXNzZXJ0X25pbCBQdWJsaWNTdWZmaXguZG9tYWluKGdpdmVuLCBpZ25vcmVfcHJpdmF0ZTogaWdub3JlX3ByaXZhdGUpCisgICAgICBlbHNlCisgICAgICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgUHVibGljU3VmZml4LmRvbWFpbihnaXZlbiwgaWdub3JlX3ByaXZhdGU6IGlnbm9yZV9wcml2YXRlKQorICAgICAgZW5kCisgICAgZW5kCisgICAgIyB0ZXN0IHZhbGlkPworICAgIElOQ0xVREVfUFJJVkFURV9DQVNFUy5lYWNoIGRvIHxnaXZlbiwgaWdub3JlX3ByaXZhdGUsIGV4cGVjdGVkfAorICAgICAgYXNzZXJ0X2VxdWFsICFleHBlY3RlZC5uaWw/LCBQdWJsaWNTdWZmaXgudmFsaWQ/KGdpdmVuLCBpZ25vcmVfcHJpdmF0ZTogaWdub3JlX3ByaXZhdGUpCisgICAgZW5kCisgIGVuZAorCisKKyAgZGVmIHZhbGlkX3VyaT8obmFtZSkKKyAgICB1cmkgPSBVUkkucGFyc2UobmFtZSkKKyAgICAhdXJpLmhvc3QubmlsPworICByZXNjdWUKKyAgICBmYWxzZQorICBlbmQKKworICBkZWYgdmFsaWRfZG9tYWluPyhuYW1lKQorICAgIHVyaSA9IFVSSS5wYXJzZShuYW1lKQorICAgICF1cmkuaG9zdC5uaWw/ICYmIHVyaS5zY2hlbWUubmlsPworICByZXNjdWUKKyAgICBmYWxzZQorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYmVuY2htYXJrcy9ibV9maW5kLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L2JlbmNobWFya3MvYm1fZmluZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc0ZjFkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L2JlbmNobWFya3MvYm1fZmluZC5yYgpAQCAtMCwwICsxLDY2IEBACityZXF1aXJlICdiZW5jaG1hcmsnCityZXF1aXJlX3JlbGF0aXZlICIuLi8uLi9saWIvcHVibGljX3N1ZmZpeCIKKworTkFNRV9TSE9SVCAgPSAiZXhhbXBsZS5kZSIKK05BTUVfTUVESVVNID0gInd3dy5zdWJkb21haW4uZXhhbXBsZS5kZSIKK05BTUVfTE9ORyAgID0gIm9uZS50d28udGhyZWUuZm91ci5maXZlLmV4YW1wbGUuZGUiCitOQU1FX1dJTEQgICA9ICJvbmUudHdvLnRocmVlLmZvdXIuZml2ZS5leGFtcGxlLmJkIgorTkFNRV9FWENQICAgPSAib25lLnR3by50aHJlZS5mb3VyLmZpdmUud3d3LmNrIgorCitJQUFBID0gInd3dy5leGFtcGxlLmFjIgorSVpaWiA9ICJ3d3cuZXhhbXBsZS56b25lIgorCitQQUFBID0gIm9uZS50d28udGhyZWUuZm91ci5maXZlLmV4YW1wbGUuYmVlcC5wbCIKK1BaWlogPSAib25lLnR3by50aHJlZS5mb3VyLmZpdmUuZXhhbXBsZS5ub3cuc2giCisKK0pQICAgPSAid3d3Lnlva29zaGliYWhpa2FyaS5jaGliYS5qcCIKK0lUICAgPSAid3d3LmV4YW1wbGUuaXQiCitDT00gID0gInd3dy5leGFtcGxlLmNvbSIKKworVElNRVMgPSAoQVJHVi5maXJzdCB8fCA1MF8wMDApLnRvX2kKKworIyBJbml0aWFsaXplCitQdWJsaWNTdWZmaXhMaXN0ID0gUHVibGljU3VmZml4OjpMaXN0LmRlZmF1bHQKK1B1YmxpY1N1ZmZpeExpc3QuZmluZCgiZXhhbXBsZS5jb20iKQorCitCZW5jaG1hcmsuYm1ibSgyNSkgZG8gfHh8CisgIHgucmVwb3J0KCJOQU1FX1NIT1JUIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChOQU1FX1NIT1JUKSAhPSBuaWwgfQorICBlbmQKKyAgeC5yZXBvcnQoIk5BTUVfTUVESVVNIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChOQU1FX01FRElVTSkgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX0xPTkciKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKE5BTUVfTE9ORykgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX1dJTEQiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKE5BTUVfV0lMRCkgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX0VYQ1AiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKE5BTUVfRVhDUCkgIT0gbmlsIH0KKyAgZW5kCisKKyAgeC5yZXBvcnQoIklBQUEiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKElBQUEpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiSVpaWiIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoSVpaWikgIT0gbmlsIH0KKyAgZW5kCisKKyAgeC5yZXBvcnQoIlBBQUEiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKFBBQUEpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiUFpaWiIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoUFpaWikgIT0gbmlsIH0KKyAgZW5kCisKKyAgeC5yZXBvcnQoIkpQIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChKUCkgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJJVCIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoSVQpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiQ09NIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChDT00pICE9IG5pbCB9CisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYmVuY2htYXJrcy9ibV9maW5kX2FsbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9iZW5jaG1hcmtzL2JtX2ZpbmRfYWxsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiY2ZkNDIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYmVuY2htYXJrcy9ibV9maW5kX2FsbC5yYgpAQCAtMCwwICsxLDEwMiBAQAorcmVxdWlyZSAnYmVuY2htYXJrJworcmVxdWlyZV9yZWxhdGl2ZSAiLi4vLi4vbGliL3B1YmxpY19zdWZmaXgiCisKK05BTUVfU0hPUlQgID0gImV4YW1wbGUuZGUiCitOQU1FX01FRElVTSA9ICJ3d3cuc3ViZG9tYWluLmV4YW1wbGUuZGUiCitOQU1FX0xPTkcgICA9ICJvbmUudHdvLnRocmVlLmZvdXIuZml2ZS5leGFtcGxlLmRlIgorTkFNRV9XSUxEICAgPSAib25lLnR3by50aHJlZS5mb3VyLmZpdmUuZXhhbXBsZS5iZCIKK05BTUVfRVhDUCAgID0gIm9uZS50d28udGhyZWUuZm91ci5maXZlLnd3dy5jayIKKworSUFBQSA9ICJ3d3cuZXhhbXBsZS5hYyIKK0laWlogPSAid3d3LmV4YW1wbGUuem9uZSIKKworUEFBQSA9ICJvbmUudHdvLnRocmVlLmZvdXIuZml2ZS5leGFtcGxlLmJlZXAucGwiCitQWlpaID0gIm9uZS50d28udGhyZWUuZm91ci5maXZlLmV4YW1wbGUubm93LnNoIgorCitKUCAgID0gInd3dy55b2tvc2hpYmFoaWthcmkuY2hpYmEuanAiCitJVCAgID0gInd3dy5leGFtcGxlLml0IgorQ09NICA9ICJ3d3cuZXhhbXBsZS5jb20iCisKK1RJTUVTID0gKEFSR1YuZmlyc3QgfHwgNTBfMDAwKS50b19pCisKKyMgSW5pdGlhbGl6ZQorUHVibGljU3VmZml4TGlzdCA9IFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0CitQdWJsaWNTdWZmaXhMaXN0LmZpbmQoImV4YW1wbGUuY29tIikKKworQmVuY2htYXJrLmJtYm0oMjUpIGRvIHx4fAorICB4LnJlcG9ydCgiTkFNRV9TSE9SVCIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoTkFNRV9TSE9SVCkgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX1NIT1JUIChub3ByaXZhdGUpIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChOQU1FX1NIT1JULCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX01FRElVTSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoTkFNRV9NRURJVU0pICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiTkFNRV9NRURJVU0gKG5vcHJpdmF0ZSkiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKE5BTUVfTUVESVVNLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX0xPTkciKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKE5BTUVfTE9ORykgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX0xPTkcgKG5vcHJpdmF0ZSkiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKE5BTUVfTE9ORywgaWdub3JlX3ByaXZhdGU6IHRydWUpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiTkFNRV9XSUxEIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChOQU1FX1dJTEQpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiTkFNRV9XSUxEIChub3ByaXZhdGUpIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChOQU1FX1dJTEQsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSAhPSBuaWwgfQorICBlbmQKKyAgeC5yZXBvcnQoIk5BTUVfRVhDUCIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoTkFNRV9FWENQKSAhPSBuaWwgfQorICBlbmQKKyAgeC5yZXBvcnQoIk5BTUVfRVhDUCAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoTkFNRV9FWENQLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgIT0gbmlsIH0KKyAgZW5kCisKKyAgeC5yZXBvcnQoIklBQUEiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKElBQUEpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiSUFBQSAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoSUFBQSwgaWdub3JlX3ByaXZhdGU6IHRydWUpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiSVpaWiIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoSVpaWikgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJJWlpaIChub3ByaXZhdGUpIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChJWlpaLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgIT0gbmlsIH0KKyAgZW5kCisKKyAgeC5yZXBvcnQoIlBBQUEiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5maW5kKFBBQUEpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiUEFBQSAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoUEFBQSwgaWdub3JlX3ByaXZhdGU6IHRydWUpICE9IG5pbCB9CisgIGVuZAorICB4LnJlcG9ydCgiUFpaWiIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoUFpaWikgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJQWlpaIChub3ByaXZhdGUpIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChQWlpaLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgIT0gbmlsIH0KKyAgZW5kCisKKyAgeC5yZXBvcnQoIkpQIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChKUCkgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJKUCAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoSlAsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSAhPSBuaWwgfQorICBlbmQKKyAgeC5yZXBvcnQoIklUIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChJVCkgIT0gbmlsIH0KKyAgZW5kCisgIHgucmVwb3J0KCJJVCAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoSVQsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSAhPSBuaWwgfQorICBlbmQKKyAgeC5yZXBvcnQoIkNPTSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoQ09NKSAhPSBuaWwgfQorICBlbmQKKyAgeC5yZXBvcnQoIkNPTSAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoQ09NLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgIT0gbmlsIH0KKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9iZW5jaG1hcmtzL2JtX25hbWVzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L2JlbmNobWFya3MvYm1fbmFtZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiMmJjZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9iZW5jaG1hcmtzL2JtX25hbWVzLnJiCkBAIC0wLDAgKzEsOTEgQEAKK3JlcXVpcmUgJ2JlbmNobWFyay9pcHMnCisKK1NUUklORyA9ICJ3d3cuc3ViZG9tYWluLmV4YW1wbGUuY29tIgorQVJSQVkgID0gJXcoCisgIGNvbQorICBleGFtcGxlLmNvbQorICBzdWJkb21haW4uZXhhbXBsZS5jb20KKyAgd3d3LnN1YmRvbWFpbi5leGFtcGxlLmNvbQorKQorCitkZWYgdG9rZW5pemVyMShzdHJpbmcpCisgIHBhcnRzID0gc3RyaW5nLnNwbGl0KCIuIikucmV2ZXJzZSEKKyAgaW5kZXggPSAwCisgIHF1ZXJ5ID0gcGFydHNbaW5kZXhdCisgIG5hbWVzID0gW10KKworICBsb29wIGRvCisgICAgbmFtZXMgPDwgcXVlcnkKKworICAgIGluZGV4ICs9IDEKKyAgICBicmVhayBpZiBpbmRleCA+PSBwYXJ0cy5zaXplCisgICAgcXVlcnkgPSBwYXJ0c1tpbmRleF0gKyAiLiIgKyBxdWVyeQorICBlbmQKKyAgbmFtZXMKK2VuZAorCitkZWYgdG9rZW5pemVyMihzdHJpbmcpCisgIHBhcnRzID0gc3RyaW5nLnNwbGl0KCIuIikKKyAgaW5kZXggPSBwYXJ0cy5zaXplIC0gMQorICBxdWVyeSA9IHBhcnRzW2luZGV4XQorICBuYW1lcyA9IFtdCisKKyAgbG9vcCBkbworICAgIG5hbWVzIDw8IHF1ZXJ5CisKKyAgICBpbmRleCAtPSAxCisgICAgYnJlYWsgaWYgaW5kZXggPCAwCisgICAgcXVlcnkgPSBwYXJ0c1tpbmRleF0gKyAiLiIgKyBxdWVyeQorICBlbmQKKyAgbmFtZXMKK2VuZAorCitkZWYgdG9rZW5pemVyMyhzdHJpbmcpCisgIGlzeCA9IHN0cmluZy5zaXplCisgIGlkeCA9IHN0cmluZy5zaXplIC0gMQorICBuYW1lcyA9IFtdCisKKyAgbG9vcCBkbworICAgIGlzeCA9IHN0cmluZy5yaW5kZXgoIi4iLCBpc3ggLSAxKSB8fCAtMQorICAgIG5hbWVzIDw8IHN0cmluZ1tpc3ggKyAxLCBpZHggLSBpc3hdCisKKyAgICBicmVhayBpZiBpc3ggPD0gMAorICBlbmQKKyAgbmFtZXMKK2VuZAorCitkZWYgdG9rZW5pemVyNChzdHJpbmcpCisgIGlzeCA9IHN0cmluZy5zaXplCisgIGlkeCA9IHN0cmluZy5zaXplIC0gMQorICBuYW1lcyA9IFtdCisKKyAgbG9vcCBkbworICAgIGlzeCA9IHN0cmluZy5yaW5kZXgoIi4iLCBpc3ggLSAxKSB8fCAtMQorICAgIG5hbWVzIDw8IHN0cmluZ1soaXN4KzEpLi5pZHhdCisKKyAgICBicmVhayBpZiBpc3ggPD0gMAorICBlbmQKKyAgbmFtZXMKK2VuZAorCisoeCA9IHRva2VuaXplcjEoU1RSSU5HKSkgPT0gQVJSQVkgb3IgZmFpbCgidG9rZW5pemVyMSBmYWlsZWQ6ICN7eC5pbnNwZWN0fSIpCisoeCA9IHRva2VuaXplcjIoU1RSSU5HKSkgPT0gQVJSQVkgb3IgZmFpbCgidG9rZW5pemVyMiBmYWlsZWQ6ICN7eC5pbnNwZWN0fSIpCisoeCA9IHRva2VuaXplcjMoU1RSSU5HKSkgPT0gQVJSQVkgb3IgZmFpbCgidG9rZW5pemVyMyBmYWlsZWQ6ICN7eC5pbnNwZWN0fSIpCisoeCA9IHRva2VuaXplcjQoU1RSSU5HKSkgPT0gQVJSQVkgb3IgZmFpbCgidG9rZW5pemVyNCBmYWlsZWQ6ICN7eC5pbnNwZWN0fSIpCisKK0JlbmNobWFyay5pcHMgZG8gfHh8CisgIHgucmVwb3J0KCJ0b2tlbml6ZXIxIikgZG8KKyAgICB0b2tlbml6ZXIxKFNUUklORykuaXNfYT8oQXJyYXkpCisgIGVuZAorICB4LnJlcG9ydCgidG9rZW5pemVyMiIpIGRvCisgICAgdG9rZW5pemVyMihTVFJJTkcpLmlzX2E/KEFycmF5KQorICBlbmQKKyAgeC5yZXBvcnQoInRva2VuaXplcjMiKSBkbworICAgIHRva2VuaXplcjMoU1RSSU5HKS5pc19hPyhBcnJheSkKKyAgZW5kCisgIHgucmVwb3J0KCJ0b2tlbml6ZXI0IikgZG8KKyAgICB0b2tlbml6ZXI0KFNUUklORykuaXNfYT8oQXJyYXkpCisgIGVuZAorCisgIHguY29tcGFyZSEKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L2JlbmNobWFya3MvYm1fc2VsZWN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L2JlbmNobWFya3MvYm1fc2VsZWN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDkwOGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYmVuY2htYXJrcy9ibV9zZWxlY3QucmIKQEAgLTAsMCArMSwyNiBAQAorcmVxdWlyZSAnYmVuY2htYXJrJworcmVxdWlyZV9yZWxhdGl2ZSAiLi4vLi4vbGliL3B1YmxpY19zdWZmaXgiCisKK0pQICAgPSAid3d3Lnlva29zaGliYWhpa2FyaS5jaGliYS5qcCIKKworVElNRVMgPSAoQVJHVi5maXJzdCB8fCA1MF8wMDApLnRvX2kKKworIyBJbml0aWFsaXplCitjbGFzcyBQdWJsaWNTdWZmaXg6Okxpc3QKKyAgcHVibGljIDpzZWxlY3QKK2VuZAorUHVibGljU3VmZml4TGlzdCA9IFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0CitQdWJsaWNTdWZmaXhMaXN0LnNlbGVjdCgiZXhhbXBsZS5qcCIpCitQdWJsaWNTdWZmaXhMaXN0LmZpbmQoImV4YW1wbGUuanAiKQorCitCZW5jaG1hcmsuYm1ibSgyNSkgZG8gfHh8CisgIHgucmVwb3J0KCJKUCBzZWxlY3QiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5zZWxlY3QoSlApIH0KKyAgZW5kCisgIHgucmVwb3J0KCJKUCBmaW5kIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3QuZmluZChKUCkgfQorICBlbmQKKyAgIyB4LnJlcG9ydCgiSlAgKG5vcHJpdmF0ZSkiKSBkbworICAjICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LmZpbmQoSlAsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSAhPSBuaWwgfQorICAjIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYmVuY2htYXJrcy9ibV9zZWxlY3RfaW5jcmVtZW50YWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYmVuY2htYXJrcy9ibV9zZWxlY3RfaW5jcmVtZW50YWwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwMmM4MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9iZW5jaG1hcmtzL2JtX3NlbGVjdF9pbmNyZW1lbnRhbC5yYgpAQCAtMCwwICsxLDI1IEBACityZXF1aXJlICdiZW5jaG1hcmsnCityZXF1aXJlX3JlbGF0aXZlICIuLi8uLi9saWIvcHVibGljX3N1ZmZpeCIKKworSlAgICA9ICJ3d3cueW9rb3NoaWJhaGlrYXJpLmNoaWJhLmpwIgorCitUSU1FUyA9IChBUkdWLmZpcnN0IHx8IDUwXzAwMCkudG9faQorCisjIEluaXRpYWxpemUKK2NsYXNzIFB1YmxpY1N1ZmZpeDo6TGlzdAorICBwdWJsaWMgOnNlbGVjdAorZW5kCitQdWJsaWNTdWZmaXhMaXN0ID0gUHVibGljU3VmZml4OjpMaXN0LmRlZmF1bHQKK1B1YmxpY1N1ZmZpeExpc3Quc2VsZWN0KCJleGFtcGxlLmpwIikKKworQmVuY2htYXJrLmJtYm0oMjUpIGRvIHx4fAorICB4LnJlcG9ydCgic2VsZWN0IGpwIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeExpc3Quc2VsZWN0KCJqcCIpIH0KKyAgZW5kCisgIHgucmVwb3J0KCJzZWxlY3QgZXhhbXBsZS5qcCIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXhMaXN0LnNlbGVjdCgiZXhhbXBsZS5qcCIpIH0KKyAgZW5kCisgIHgucmVwb3J0KCJzZWxlY3Qgd3d3LmV4YW1wbGUuanAiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4TGlzdC5zZWxlY3QoInd3dy5leGFtcGxlLmpwIikgfQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L2JlbmNobWFya3MvYm1fdmFsaWQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvYmVuY2htYXJrcy9ibV92YWxpZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg0NDUxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L2JlbmNobWFya3MvYm1fdmFsaWQucmIKQEAgLTAsMCArMSwxMDEgQEAKK3JlcXVpcmUgJ2JlbmNobWFyaycKK3JlcXVpcmVfcmVsYXRpdmUgIi4uLy4uL2xpYi9wdWJsaWNfc3VmZml4IgorCitOQU1FX1NIT1JUICA9ICJleGFtcGxlLmRlIgorTkFNRV9NRURJVU0gPSAid3d3LnN1YmRvbWFpbi5leGFtcGxlLmRlIgorTkFNRV9MT05HICAgPSAib25lLnR3by50aHJlZS5mb3VyLmZpdmUuZXhhbXBsZS5kZSIKK05BTUVfV0lMRCAgID0gIm9uZS50d28udGhyZWUuZm91ci5maXZlLmV4YW1wbGUuYmQiCitOQU1FX0VYQ1AgICA9ICJvbmUudHdvLnRocmVlLmZvdXIuZml2ZS53d3cuY2siCisKK0lBQUEgPSAid3d3LmV4YW1wbGUuYWMiCitJWlpaID0gInd3dy5leGFtcGxlLnpvbmUiCisKK1BBQUEgPSAib25lLnR3by50aHJlZS5mb3VyLmZpdmUuZXhhbXBsZS5iZWVwLnBsIgorUFpaWiA9ICJvbmUudHdvLnRocmVlLmZvdXIuZml2ZS5leGFtcGxlLm5vdy5zaCIKKworSlAgICA9ICJ3d3cueW9rb3NoaWJhaGlrYXJpLmNoaWJhLmpwIgorSVQgICA9ICJ3d3cuZXhhbXBsZS5pdCIKK0NPTSAgPSAid3d3LmV4YW1wbGUuY29tIgorCitUSU1FUyA9IChBUkdWLmZpcnN0IHx8IDUwXzAwMCkudG9faQorCisjIEluaXRpYWxpemUKK1B1YmxpY1N1ZmZpeC52YWxpZD8oImV4YW1wbGUuY29tIikKKworQmVuY2htYXJrLmJtYm0oMjUpIGRvIHx4fAorICB4LnJlcG9ydCgiTkFNRV9TSE9SVCIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KE5BTUVfU0hPUlQpID09IHRydWUgfQorICBlbmQKKyAgeC5yZXBvcnQoIk5BTUVfU0hPUlQgKG5vcHJpdmF0ZSkiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4LnZhbGlkPyhOQU1FX1NIT1JULCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgPT0gdHJ1ZSB9CisgIGVuZAorICB4LnJlcG9ydCgiTkFNRV9NRURJVU0iKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4LnZhbGlkPyhOQU1FX01FRElVTSkgPT0gdHJ1ZSB9CisgIGVuZAorICB4LnJlcG9ydCgiTkFNRV9NRURJVU0gKG5vcHJpdmF0ZSkiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4LnZhbGlkPyhOQU1FX01FRElVTSwgaWdub3JlX3ByaXZhdGU6IHRydWUpID09IHRydWUgfQorICBlbmQKKyAgeC5yZXBvcnQoIk5BTUVfTE9ORyIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KE5BTUVfTE9ORykgPT0gdHJ1ZSB9CisgIGVuZAorICB4LnJlcG9ydCgiTkFNRV9MT05HIChub3ByaXZhdGUpIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeC52YWxpZD8oTkFNRV9MT05HLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgPT0gdHJ1ZSB9CisgIGVuZAorICB4LnJlcG9ydCgiTkFNRV9XSUxEIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeC52YWxpZD8oTkFNRV9XSUxEKSA9PSB0cnVlIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX1dJTEQgKG5vcHJpdmF0ZSkiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4LnZhbGlkPyhOQU1FX1dJTEQsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSA9PSB0cnVlIH0KKyAgZW5kCisgIHgucmVwb3J0KCJOQU1FX0VYQ1AiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4LnZhbGlkPyhOQU1FX0VYQ1ApID09IHRydWUgfQorICBlbmQKKyAgeC5yZXBvcnQoIk5BTUVfRVhDUCAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KE5BTUVfRVhDUCwgaWdub3JlX3ByaXZhdGU6IHRydWUpID09IHRydWUgfQorICBlbmQKKworICB4LnJlcG9ydCgiSUFBQSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KElBQUEpID09IHRydWUgfQorICBlbmQKKyAgeC5yZXBvcnQoIklBQUEgKG5vcHJpdmF0ZSkiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4LnZhbGlkPyhJQUFBLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgPT0gdHJ1ZSB9CisgIGVuZAorICB4LnJlcG9ydCgiSVpaWiIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KElaWlopID09IHRydWUgfQorICBlbmQKKyAgeC5yZXBvcnQoIklaWlogKG5vcHJpdmF0ZSkiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4LnZhbGlkPyhJWlpaLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgPT0gdHJ1ZSB9CisgIGVuZAorCisgIHgucmVwb3J0KCJQQUFBIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeC52YWxpZD8oUEFBQSkgPT0gdHJ1ZSB9CisgIGVuZAorICB4LnJlcG9ydCgiUEFBQSAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KFBBQUEsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSA9PSB0cnVlIH0KKyAgZW5kCisgIHgucmVwb3J0KCJQWlpaIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeC52YWxpZD8oUFpaWikgPT0gdHJ1ZSB9CisgIGVuZAorICB4LnJlcG9ydCgiUFpaWiAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KFBaWlosIGlnbm9yZV9wcml2YXRlOiB0cnVlKSA9PSB0cnVlIH0KKyAgZW5kCisKKyAgeC5yZXBvcnQoIkpQIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeC52YWxpZD8oSlApID09IHRydWUgfQorICBlbmQKKyAgeC5yZXBvcnQoIkpQIChub3ByaXZhdGUpIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeC52YWxpZD8oSlAsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSA9PSB0cnVlIH0KKyAgZW5kCisgIHgucmVwb3J0KCJJVCIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KElUKSA9PSB0cnVlIH0KKyAgZW5kCisgIHgucmVwb3J0KCJJVCAobm9wcml2YXRlKSIpIGRvCisgICAgVElNRVMudGltZXMgeyBQdWJsaWNTdWZmaXgudmFsaWQ/KElULCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSkgPT0gdHJ1ZSB9CisgIGVuZAorICB4LnJlcG9ydCgiQ09NIikgZG8KKyAgICBUSU1FUy50aW1lcyB7IFB1YmxpY1N1ZmZpeC52YWxpZD8oQ09NKSA9PSB0cnVlIH0KKyAgZW5kCisgIHgucmVwb3J0KCJDT00gKG5vcHJpdmF0ZSkiKSBkbworICAgIFRJTUVTLnRpbWVzIHsgUHVibGljU3VmZml4LnZhbGlkPyhDT00sIGlnbm9yZV9wcml2YXRlOiB0cnVlKSA9PSB0cnVlIH0KKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9wcm9maWxlcnMvZG9tYWluX3Byb2ZpbGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Byb2ZpbGVycy9kb21haW5fcHJvZmlsZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkMTA1MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9wcm9maWxlcnMvZG9tYWluX3Byb2ZpbGVyLnJiCkBAIC0wLDAgKzEsMTIgQEAKKyRMT0FEX1BBVEgudW5zaGlmdCBGaWxlLmV4cGFuZF9wYXRoKCIuLi8uLi9saWIiLCBfX2Rpcl9fKQorCityZXF1aXJlICJtZW1vcnlfcHJvZmlsZXIiCityZXF1aXJlICJwdWJsaWNfc3VmZml4IgorCitQdWJsaWNTdWZmaXg6Okxpc3QuZGVmYXVsdAorCityZXBvcnQgPSBNZW1vcnlQcm9maWxlci5yZXBvcnQgZG8KKyAgUHVibGljU3VmZml4LmRvbWFpbigid3d3LmV4YW1wbGUuY29tIikKK2VuZAorCityZXBvcnQucHJldHR5X3ByaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHJvZmlsZXJzL2ZpbmRfcHJvZmlsZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHJvZmlsZXJzL2ZpbmRfcHJvZmlsZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkMjhlYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9wcm9maWxlcnMvZmluZF9wcm9maWxlci5yYgpAQCAtMCwwICsxLDEyIEBACiskTE9BRF9QQVRILnVuc2hpZnQgRmlsZS5leHBhbmRfcGF0aCgiLi4vLi4vbGliIiwgX19kaXJfXykKKworcmVxdWlyZSAibWVtb3J5X3Byb2ZpbGVyIgorcmVxdWlyZSAicHVibGljX3N1ZmZpeCIKKworUHVibGljU3VmZml4OjpMaXN0LmRlZmF1bHQKKworcmVwb3J0ID0gTWVtb3J5UHJvZmlsZXIucmVwb3J0IGRvCisgIFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0LmZpbmQoInd3dy5leGFtcGxlLmNvbSIpCitlbmQKKworcmVwb3J0LnByZXR0eV9wcmludApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Byb2ZpbGVycy9maW5kX3Byb2ZpbGVyX2pwLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Byb2ZpbGVycy9maW5kX3Byb2ZpbGVyX2pwLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzEzZmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHJvZmlsZXJzL2ZpbmRfcHJvZmlsZXJfanAucmIKQEAgLTAsMCArMSwxMiBAQAorJExPQURfUEFUSC51bnNoaWZ0IEZpbGUuZXhwYW5kX3BhdGgoIi4uLy4uL2xpYiIsIF9fZGlyX18pCisKK3JlcXVpcmUgIm1lbW9yeV9wcm9maWxlciIKK3JlcXVpcmUgInB1YmxpY19zdWZmaXgiCisKK1B1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0CisKK3JlcG9ydCA9IE1lbW9yeVByb2ZpbGVyLnJlcG9ydCBkbworICBQdWJsaWNTdWZmaXg6Okxpc3QuZGVmYXVsdC5maW5kKCJhLmIuaWRlLmt5b3RvLmpwIikKK2VuZAorCityZXBvcnQucHJldHR5X3ByaW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHJvZmlsZXJzL2luaXRpYWxpemF0aW9uX3Byb2ZpbGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Byb2ZpbGVycy9pbml0aWFsaXphdGlvbl9wcm9maWxlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDhiMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Byb2ZpbGVycy9pbml0aWFsaXphdGlvbl9wcm9maWxlci5yYgpAQCAtMCwwICsxLDExIEBACiskTE9BRF9QQVRILnVuc2hpZnQgRmlsZS5leHBhbmRfcGF0aCgiLi4vLi4vbGliIiwgX19kaXJfXykKKworcmVxdWlyZSAibWVtb3J5X3Byb2ZpbGVyIgorcmVxdWlyZSAicHVibGljX3N1ZmZpeCIKKworcmVwb3J0ID0gTWVtb3J5UHJvZmlsZXIucmVwb3J0IGRvCisgIFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0CitlbmQKKworcmVwb3J0LnByZXR0eV9wcmludAorIyByZXBvcnQucHJldHR5X3ByaW50KHRvX2ZpbGU6ICdwcm9maWxlci0lcy0lZC50eHQnICUgW0FSR1ZbMF0sIFRpbWUubm93LnRvX2ldKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Byb2ZpbGVycy9saXN0X3Byb2ZzaXplLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Byb2ZpbGVycy9saXN0X3Byb2ZzaXplLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOThiNGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHJvZmlsZXJzL2xpc3RfcHJvZnNpemUucmIKQEAgLTAsMCArMSwxMSBAQAorJExPQURfUEFUSC51bnNoaWZ0IEZpbGUuZXhwYW5kX3BhdGgoIi4uLy4uL2xpYiIsIF9fZGlyX18pCisKK3JlcXVpcmVfcmVsYXRpdmUgIm9iamVjdF9iaW5zaXplIgorcmVxdWlyZSAicHVibGljX3N1ZmZpeCIKKworbGlzdCA9IFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0CitwdXRzICIje2xpc3Quc2l6ZX0gcnVsZXM6IgorCitwcm9mID0gT2JqZWN0Qmluc2l6ZS5uZXcKK3Byb2YucmVwb3J0KFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0LCBsYWJlbDogIlB1YmxpY1N1ZmZpeDo6TGlzdCBzaXplIikKK3Byb2YucmVwb3J0KFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QHJ1bGVzKSwgbGFiZWw6ICJTaXplIG9mIHJ1bGVzIikKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9wcm9maWxlcnMvb2JqZWN0X2JpbnNpemUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHJvZmlsZXJzL29iamVjdF9iaW5zaXplLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjBiZGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHJvZmlsZXJzL29iamVjdF9iaW5zaXplLnJiCkBAIC0wLDAgKzEsNTcgQEAKK3JlcXVpcmUgJ3RlbXBmaWxlJworCisjIEEgdmVyeSBzaW1wbGUgbWVtb3J5IHByb2ZpbGVzIHRoYXQgY2hlY2tzIHRoZSBmdWxsIHNpemUgb2YgYSB2YXJpYWJsZQorIyBieSBzZXJpYWxpemluZyBpbnRvIGEgYmluYXJ5IGZpbGUuCisjCisjIFllcywgSSBrbm93IHRoaXMgaXMgdmVyeSByb3VnaCwgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBPYmplY3RTcGFjZS5tZW1zaXplX29mCisjIGRvZXNuJ3QgY29vcGVyYXRlLCBhbmQgdGhpcyBpcyBvbmUgb2YgdGhlIHBvc3NpYmxlIHdvcmthcm91bmRzLgorIworIyBGb3IgY2VydGFpbiBjYXNlcywgaXQgd29ya3MgKFRNKS4KK2NsYXNzIE9iamVjdEJpbnNpemUKKworICBkZWYgbWVhc3VyZSh2YXIsIGxhYmVsOiBuaWwpCisgICAgZHVtcCh2YXIsIGxhYmVsOiBsYWJlbCkKKyAgZW5kCisKKyAgZGVmIHJlcG9ydCh2YXIsIGxhYmVsOiBuaWwsIHBhZGRpbmc6IDEwKQorICAgIGZpbGUgPSBtZWFzdXJlKHZhciwgbGFiZWw6IGxhYmVsKQorCisgICAgc2l6ZSA9IGZvcm1hdF9pbnRlZ2VyKGZpbGUuc2l6ZSkKKyAgICBuYW1lID0gbGFiZWwgfHwgRmlsZS5iYXNlbmFtZShmaWxlLnBhdGgpCisgICAgcHJpbnRmKCIlI3twYWRkaW5nfXMgICAlc1xuIiwgc2l6ZSwgbmFtZSkKKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgIGRlZiBkdW1wKHZhciwgKiphcmdzKQorICAgIGZpbGUgPSBUZW1wZmlsZS5uZXcoYXJnc1s6bGFiZWxdLnRvX3MpCisgICAgZmlsZS53cml0ZShNYXJzaGFsLmR1bXAodmFyKSkKKyAgICBmaWxlCisgIGVuc3VyZQorICAgIGZpbGUuY2xvc2UKKyAgZW5kCisKKyAgZGVmIGZvcm1hdF9pbnRlZ2VyKGludCkKKyAgICBpbnQudG9fcy5yZXZlcnNlLmdzdWIoLy4uLig/PS4pLywgJ1wmLCcpLnJldmVyc2UKKyAgZW5kCisKK2VuZAorCitpZiBfX0ZJTEVfXyA9PSAkMAorICBwcm9mID0gT2JqZWN0Qmluc2l6ZS5uZXcKKworICBwcm9mLnJlcG9ydChuaWwsIGxhYmVsOiAibmlsIikKKyAgcHJvZi5yZXBvcnQoZmFsc2UsIGxhYmVsOiAiZmFsc2UiKQorICBwcm9mLnJlcG9ydCh0cnVlLCBsYWJlbDogInRydWUiKQorICBwcm9mLnJlcG9ydCgwLCBsYWJlbDogImludGVnZXIiKQorICBwcm9mLnJlcG9ydCgiIiwgbGFiZWw6ICJlbXB0eSBzdHJpbmciKQorICBwcm9mLnJlcG9ydCh7fSwgbGFiZWw6ICJlbXB0eSBoYXNoIikKKyAgcHJvZi5yZXBvcnQoe30sIGxhYmVsOiAiZW1wdHkgYXJyYXkiKQorCisgIHByb2YucmVwb3J0KHsgZm9vOiAiMSIgfSwgbGFiZWw6ICJoYXNoIDEgaXRlbSAoc3ltYm9sKSIpCisgIHByb2YucmVwb3J0KHsgZm9vOiAiMSIsIGJhcjogMiB9LCBsYWJlbDogImhhc2ggMiBpdGVtcyAoc3ltYm9sKSIpCisgIHByb2YucmVwb3J0KHsgImZvbyIgPT4gIjEiIH0sIGxhYmVsOiAiaGFzaCAxIGl0ZW0gKHN0cmluZykiKQorICBwcm9mLnJlcG9ydCh7ICJmb28iID0+ICIxIiwgImJhciIgPT4gMiB9LCBsYWJlbDogImhhc2ggMiBpdGVtcyAoc3RyaW5nKSIpCisKKyAgcHJvZi5yZXBvcnQoImJpZyBzdHJpbmciICogMjAwLCBsYWJlbDogImJpZyBzdHJpbmcgKiAyMDAiKQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHNsX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvcHNsX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkM2Y5ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC9wc2xfdGVzdC5yYgpAQCAtMCwwICsxLDQ5IEBACityZXF1aXJlICJ0ZXN0X2hlbHBlciIKK3JlcXVpcmUgInB1YmxpY19zdWZmaXgiCisKKyMgVGhpcyB0ZXN0IHJ1bnMgYWdhaW5zdCB0aGUgY3VycmVudCBQU0wgZmlsZSBhbmQgZW5zdXJlcworIyB0aGUgZGVmaW5pdGlvbnMgc2F0aXNmaWVzIHRoZSB0ZXN0IHN1aXRlLgorY2xhc3MgUHNsVGVzdCA8IE1pbml0ZXN0OjpUZXN0CisKKyAgUk9PVCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uLy4uLyIsIF9fRklMRV9fKQorCisgICMgcnVib2NvcDpkaXNhYmxlIFNlY3VyaXR5L0V2YWwKKyAgZGVmIHNlbGYudGVzdHMKKyAgICBGaWxlLnJlYWRsaW5lcyhGaWxlLmpvaW4oUk9PVCwgInRlc3QvdGVzdHMudHh0IikpLm1hcCBkbyB8bGluZXwKKyAgICAgIGxpbmUgPSBsaW5lLnN0cmlwCisgICAgICBuZXh0IGlmIGxpbmUuZW1wdHk/CisgICAgICBuZXh0IGlmIGxpbmUuc3RhcnRfd2l0aD8oIi8vIikKKyAgICAgIGlucHV0LCBvdXRwdXQgPSBsaW5lLnNwbGl0KCIsICIpCisKKyAgICAgICMgaGFuZGxlIHRoZSBjYXNlIG9mIGV2YWwoIm51bGwiKSwgaXQgbXVzdCBiZSBldmFsKCJuaWwiKQorICAgICAgaW5wdXQgID0gIm5pbCIgaWYgaW5wdXQgID09ICJudWxsIgorICAgICAgb3V0cHV0ID0gIm5pbCIgaWYgb3V0cHV0ID09ICJudWxsIgorCisgICAgICBpbnB1dCAgPSBldmFsKGlucHV0KQorICAgICAgb3V0cHV0ID0gZXZhbChvdXRwdXQpCisgICAgICBbaW5wdXQsIG91dHB1dF0KKyAgICBlbmQKKyAgZW5kCisgICMgcnVib2NvcDplbmFibGUKKworCisgIGRlZiB0ZXN0X3ZhbGlkCisgICAgIyBQYXJzZSB0aGUgUFNMIGFuZCBydW4gdGhlIHRlc3RzCisgICAgZGF0YSA9IEZpbGUucmVhZChQdWJsaWNTdWZmaXg6Okxpc3Q6OkRFRkFVTFRfTElTVF9QQVRIKQorICAgIFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0ID0gUHVibGljU3VmZml4OjpMaXN0LnBhcnNlKGRhdGEpCisKKyAgICBmYWlsdXJlcyA9IFtdCisgICAgc2VsZi5jbGFzcy50ZXN0cy5lYWNoIGRvIHxpbnB1dCwgb3V0cHV0fAorICAgICAgIyBQdW55Y29kZSBkb21haW5zIGFyZSBub3Qgc3VwcG9ydGVkIEFUTQorICAgICAgbmV4dCBpZiBpbnB1dCA9fiAveG5cLVwtLworCisgICAgICBkb21haW4gPSBQdWJsaWNTdWZmaXguZG9tYWluKGlucHV0KSByZXNjdWUgbmlsCisgICAgICBmYWlsdXJlcyA8PCBbaW5wdXQsIG91dHB1dCwgZG9tYWluXSBpZiBvdXRwdXQgIT0gZG9tYWluCisgICAgZW5kCisKKyAgICBtZXNzYWdlID0gIlRoZSBmb2xsb3dpbmcgI3tmYWlsdXJlcy5zaXplfSB0ZXN0cyBmYWlsOlxuIgorICAgIGZhaWx1cmVzLmVhY2ggeyB8aSwgbywgZHwgbWVzc2FnZSArPSAiRXhwZWN0ZWQgJXMgdG8gYmUgJXMsIGdvdCAlc1xuIiAlIFtpLmluc3BlY3QsIG8uaW5zcGVjdCwgZC5pbnNwZWN0XSB9CisgICAgYXNzZXJ0X2VxdWFsIDAsIGZhaWx1cmVzLnNpemUsIG1lc3NhZ2UKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Rlc3RfaGVscGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3Rlc3RfaGVscGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2U3YzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdGVzdF9oZWxwZXIucmIKQEAgLTAsMCArMSwxMyBAQAoraWYgRU5WWyJDT1ZFUkFMTCJdCisgIHJlcXVpcmUgImNvdmVyYWxscyIKKyAgQ292ZXJhbGxzLndlYXIhCitlbmQKKworcmVxdWlyZSAibWluaXRlc3QvYXV0b3J1biIKK3JlcXVpcmUgIm1pbml0ZXN0L3JlcG9ydGVycyIKK3JlcXVpcmUgIm1vY2hhL3NldHVwIgorCitNaW5pdGVzdDo6UmVwb3J0ZXJzLnVzZSEgTWluaXRlc3Q6OlJlcG9ydGVyczo6RGVmYXVsdFJlcG9ydGVyLm5ldyhjb2xvcjogdHJ1ZSkKKworJExPQURfUEFUSC51bnNoaWZ0IEZpbGUuZXhwYW5kX3BhdGgoIi4uLy4uL2xpYiIsIF9fRklMRV9fKQorcmVxdWlyZSAicHVibGljX3N1ZmZpeCIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC90ZXN0cy50eHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdGVzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTE1MGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdGVzdHMudHh0CkBAIC0wLDAgKzEsOTggQEAKKy8vIEFueSBjb3B5cmlnaHQgaXMgZGVkaWNhdGVkIHRvIHRoZSBQdWJsaWMgRG9tYWluLgorLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworCisvLyBudWxsIGlucHV0CitudWxsLCBudWxsCisvLyBNaXhlZCBjYXNlCisnQ09NJywgbnVsbAorJ2V4YW1wbGUuQ09NJywgJ2V4YW1wbGUuY29tJworJ1d3Vy5leGFtcGxlLkNPTScsICdleGFtcGxlLmNvbScKKy8vIExlYWRpbmcgZG90CisnLmNvbScsIG51bGwKKycuZXhhbXBsZScsIG51bGwKKycuZXhhbXBsZS5jb20nLCBudWxsCisnLmV4YW1wbGUuZXhhbXBsZScsIG51bGwKKy8vIFVubGlzdGVkIFRMRAorJ2V4YW1wbGUnLCBudWxsCisnZXhhbXBsZS5leGFtcGxlJywgJ2V4YW1wbGUuZXhhbXBsZScKKydiLmV4YW1wbGUuZXhhbXBsZScsICdleGFtcGxlLmV4YW1wbGUnCisnYS5iLmV4YW1wbGUuZXhhbXBsZScsICdleGFtcGxlLmV4YW1wbGUnCisvLyBMaXN0ZWQsIGJ1dCBub24tSW50ZXJuZXQsIFRMRAorLy8nbG9jYWwnLCBudWxsCisvLydleGFtcGxlLmxvY2FsJywgbnVsbAorLy8nYi5leGFtcGxlLmxvY2FsJywgbnVsbAorLy8nYS5iLmV4YW1wbGUubG9jYWwnLCBudWxsCisvLyBUTEQgd2l0aCBvbmx5IDEgcnVsZQorJ2JpeicsIG51bGwKKydkb21haW4uYml6JywgJ2RvbWFpbi5iaXonCisnYi5kb21haW4uYml6JywgJ2RvbWFpbi5iaXonCisnYS5iLmRvbWFpbi5iaXonLCAnZG9tYWluLmJpeicKKy8vIFRMRCB3aXRoIHNvbWUgMi1sZXZlbCBydWxlcworJ2NvbScsIG51bGwKKydleGFtcGxlLmNvbScsICdleGFtcGxlLmNvbScKKydiLmV4YW1wbGUuY29tJywgJ2V4YW1wbGUuY29tJworJ2EuYi5leGFtcGxlLmNvbScsICdleGFtcGxlLmNvbScKKyd1ay5jb20nLCBudWxsCisnZXhhbXBsZS51ay5jb20nLCAnZXhhbXBsZS51ay5jb20nCisnYi5leGFtcGxlLnVrLmNvbScsICdleGFtcGxlLnVrLmNvbScKKydhLmIuZXhhbXBsZS51ay5jb20nLCAnZXhhbXBsZS51ay5jb20nCisndGVzdC5hYycsICd0ZXN0LmFjJworLy8gVExEIHdpdGggb25seSAxICh3aWxkY2FyZCkgcnVsZQorJ21tJywgbnVsbAorJ2MubW0nLCBudWxsCisnYi5jLm1tJywgJ2IuYy5tbScKKydhLmIuYy5tbScsICdiLmMubW0nCisvLyBNb3JlIGNvbXBsZXggVExECisnanAnLCBudWxsCisndGVzdC5qcCcsICd0ZXN0LmpwJworJ3d3dy50ZXN0LmpwJywgJ3Rlc3QuanAnCisnYWMuanAnLCBudWxsCisndGVzdC5hYy5qcCcsICd0ZXN0LmFjLmpwJworJ3d3dy50ZXN0LmFjLmpwJywgJ3Rlc3QuYWMuanAnCisna3lvdG8uanAnLCBudWxsCisndGVzdC5reW90by5qcCcsICd0ZXN0Lmt5b3RvLmpwJworJ2lkZS5reW90by5qcCcsIG51bGwKKydiLmlkZS5reW90by5qcCcsICdiLmlkZS5reW90by5qcCcKKydhLmIuaWRlLmt5b3RvLmpwJywgJ2IuaWRlLmt5b3RvLmpwJworJ2Mua29iZS5qcCcsIG51bGwKKydiLmMua29iZS5qcCcsICdiLmMua29iZS5qcCcKKydhLmIuYy5rb2JlLmpwJywgJ2IuYy5rb2JlLmpwJworJ2NpdHkua29iZS5qcCcsICdjaXR5LmtvYmUuanAnCisnd3d3LmNpdHkua29iZS5qcCcsICdjaXR5LmtvYmUuanAnCisvLyBUTEQgd2l0aCBhIHdpbGRjYXJkIHJ1bGUgYW5kIGV4Y2VwdGlvbnMKKydjaycsIG51bGwKKyd0ZXN0LmNrJywgbnVsbAorJ2IudGVzdC5jaycsICdiLnRlc3QuY2snCisnYS5iLnRlc3QuY2snLCAnYi50ZXN0LmNrJworJ3d3dy5jaycsICd3d3cuY2snCisnd3d3Lnd3dy5jaycsICd3d3cuY2snCisvLyBVUyBLMTIKKyd1cycsIG51bGwKKyd0ZXN0LnVzJywgJ3Rlc3QudXMnCisnd3d3LnRlc3QudXMnLCAndGVzdC51cycKKydhay51cycsIG51bGwKKyd0ZXN0LmFrLnVzJywgJ3Rlc3QuYWsudXMnCisnd3d3LnRlc3QuYWsudXMnLCAndGVzdC5hay51cycKKydrMTIuYWsudXMnLCBudWxsCisndGVzdC5rMTIuYWsudXMnLCAndGVzdC5rMTIuYWsudXMnCisnd3d3LnRlc3QuazEyLmFrLnVzJywgJ3Rlc3QuazEyLmFrLnVzJworLy8gSUROIGxhYmVscworJ+mjn+eLri5jb20uY24nLCAn6aOf54uuLmNvbS5jbicKKyfpo5/ni64u5YWs5Y+4LmNuJywgJ+mjn+eLri7lhazlj7guY24nCisnd3d3Lumjn+eLri7lhazlj7guY24nLCAn6aOf54uuLuWFrOWPuC5jbicKKydzaGlzaGku5YWs5Y+4LmNuJywgJ3NoaXNoaS7lhazlj7guY24nCisn5YWs5Y+4LmNuJywgbnVsbAorJ+mjn+eLri7kuK3lm70nLCAn6aOf54uuLuS4reWbvScKKyd3d3cu6aOf54uuLuS4reWbvScsICfpo5/ni64u5Lit5Zu9JworJ3NoaXNoaS7kuK3lm70nLCAnc2hpc2hpLuS4reWbvScKKyfkuK3lm70nLCBudWxsCisvLyBTYW1lIGFzIGFib3ZlLCBidXQgcHVueWNvZGVkCisneG4tLTg1eDcyMmYuY29tLmNuJywgJ3huLS04NXg3MjJmLmNvbS5jbicKKyd4bi0tODV4NzIyZi54bi0tNTVxeDVkLmNuJywgJ3huLS04NXg3MjJmLnhuLS01NXF4NWQuY24nCisnd3d3LnhuLS04NXg3MjJmLnhuLS01NXF4NWQuY24nLCAneG4tLTg1eDcyMmYueG4tLTU1cXg1ZC5jbicKKydzaGlzaGkueG4tLTU1cXg1ZC5jbicsICdzaGlzaGkueG4tLTU1cXg1ZC5jbicKKyd4bi0tNTVxeDVkLmNuJywgbnVsbAorJ3huLS04NXg3MjJmLnhuLS1maXFzOHMnLCAneG4tLTg1eDcyMmYueG4tLWZpcXM4cycKKyd3d3cueG4tLTg1eDcyMmYueG4tLWZpcXM4cycsICd4bi0tODV4NzIyZi54bi0tZmlxczhzJworJ3NoaXNoaS54bi0tZmlxczhzJywgJ3NoaXNoaS54bi0tZmlxczhzJworJ3huLS1maXFzOHMnLCBudWxsCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdW5pdC9kb21haW5fdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC91bml0L2RvbWFpbl90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWNlMWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdW5pdC9kb21haW5fdGVzdC5yYgpAQCAtMCwwICsxLDEwNCBAQAorcmVxdWlyZSAidGVzdF9oZWxwZXIiCisKK2NsYXNzIFB1YmxpY1N1ZmZpeDo6RG9tYWluVGVzdCA8IE1pbml0ZXN0OjpUZXN0CisKKyAgZGVmIHNldHVwCisgICAgQGtsYXNzID0gUHVibGljU3VmZml4OjpEb21haW4KKyAgZW5kCisKKyAgIyBUb2tlbml6ZXMgZ2l2ZW4gaW5wdXQgaW50byBsYWJlbHMuCisgIGRlZiB0ZXN0X3NlbGZfbmFtZV90b19sYWJlbHMKKyAgICBhc3NlcnRfZXF1YWwgICV3KCBzb21lb25lIHNwYWNlcyBsaXZlIGNvbSApLAorICAgICAgICAgICAgICAgICAgUHVibGljU3VmZml4OjpEb21haW4ubmFtZV90b19sYWJlbHMoInNvbWVvbmUuc3BhY2VzLmxpdmUuY29tIikKKyAgICBhc3NlcnRfZXF1YWwgICV3KCBsZW9udGluYTIzc2FtaWtvIHdpa2kgem9obyBjb20gKSwKKyAgICAgICAgICAgICAgICAgIFB1YmxpY1N1ZmZpeDo6RG9tYWluLm5hbWVfdG9fbGFiZWxzKCJsZW9udGluYTIzc2FtaWtvLndpa2kuem9oby5jb20iKQorICBlbmQKKworICAjIENvbnZlcnRzIGlucHV0IGludG8gU3RyaW5nLgorICBkZWYgdGVzdF9zZWxmX25hbWVfdG9fbGFiZWxzX2NvbnZlcnRzX2lucHV0X3RvX3N0cmluZworICAgIGFzc2VydF9lcXVhbCAgJXcoIHNvbWVvbmUgc3BhY2VzIGxpdmUgY29tICksCisgICAgICAgICAgICAgICAgICBQdWJsaWNTdWZmaXg6OkRvbWFpbi5uYW1lX3RvX2xhYmVscyg6InNvbWVvbmUuc3BhY2VzLmxpdmUuY29tIikKKyAgZW5kCisKKworICBkZWYgdGVzdF9pbml0aWFsaXplX3dpdGhfdGxkCisgICAgZG9tYWluID0gQGtsYXNzLm5ldygiY29tIikKKyAgICBhc3NlcnRfZXF1YWwgImNvbSIsIGRvbWFpbi50bGQKKyAgICBhc3NlcnRfbmlsIGRvbWFpbi5zbGQKKyAgICBhc3NlcnRfbmlsIGRvbWFpbi50cmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5pdGlhbGl6ZV93aXRoX3RsZF9hbmRfc2xkCisgICAgZG9tYWluID0gQGtsYXNzLm5ldygiY29tIiwgImdvb2dsZSIpCisgICAgYXNzZXJ0X2VxdWFsICJjb20iLCBkb21haW4udGxkCisgICAgYXNzZXJ0X2VxdWFsICJnb29nbGUiLCBkb21haW4uc2xkCisgICAgYXNzZXJ0X25pbCBkb21haW4udHJkCisgIGVuZAorCisgIGRlZiB0ZXN0X2luaXRpYWxpemVfd2l0aF90bGRfYW5kX3NsZF9hbmRfdHJkCisgICAgZG9tYWluID0gQGtsYXNzLm5ldygiY29tIiwgImdvb2dsZSIsICJ3d3ciKQorICAgIGFzc2VydF9lcXVhbCAiY29tIiwgZG9tYWluLnRsZAorICAgIGFzc2VydF9lcXVhbCAiZ29vZ2xlIiwgZG9tYWluLnNsZAorICAgIGFzc2VydF9lcXVhbCAid3d3IiwgZG9tYWluLnRyZAorICBlbmQKKworCisgIGRlZiB0ZXN0X3RvX3MKKyAgICBhc3NlcnRfZXF1YWwgImNvbSIsICAgICAgICAgICAgIEBrbGFzcy5uZXcoImNvbSIpLnRvX3MKKyAgICBhc3NlcnRfZXF1YWwgImdvb2dsZS5jb20iLCAgICAgIEBrbGFzcy5uZXcoImNvbSIsICJnb29nbGUiKS50b19zCisgICAgYXNzZXJ0X2VxdWFsICJ3d3cuZ29vZ2xlLmNvbSIsICBAa2xhc3MubmV3KCJjb20iLCAiZ29vZ2xlIiwgInd3dyIpLnRvX3MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdG9fYQorICAgIGFzc2VydF9lcXVhbCBbbmlsLCBuaWwsICJjb20iXSwgICAgICAgICBAa2xhc3MubmV3KCJjb20iKS50b19hCisgICAgYXNzZXJ0X2VxdWFsIFtuaWwsICJnb29nbGUiLCAiY29tIl0sICAgIEBrbGFzcy5uZXcoImNvbSIsICJnb29nbGUiKS50b19hCisgICAgYXNzZXJ0X2VxdWFsIFsid3d3IiwgImdvb2dsZSIsICJjb20iXSwgIEBrbGFzcy5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3IikudG9fYQorICBlbmQKKworCisgIGRlZiB0ZXN0X3RsZAorICAgIGFzc2VydF9lcXVhbCAiY29tIiwgQGtsYXNzLm5ldygiY29tIiwgImdvb2dsZSIsICJ3d3ciKS50bGQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2xkCisgICAgYXNzZXJ0X2VxdWFsICJnb29nbGUiLCBAa2xhc3MubmV3KCJjb20iLCAiZ29vZ2xlIiwgInd3dyIpLnNsZAorICBlbmQKKworICBkZWYgdGVzdF90cmQKKyAgICBhc3NlcnRfZXF1YWwgInd3dyIsIEBrbGFzcy5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3IikudHJkCisgIGVuZAorCisKKyAgZGVmIHRlc3RfbmFtZQorICAgIGFzc2VydF9lcXVhbCAiY29tIiwgICAgICAgICAgICAgQGtsYXNzLm5ldygiY29tIikubmFtZQorICAgIGFzc2VydF9lcXVhbCAiZ29vZ2xlLmNvbSIsICAgICAgQGtsYXNzLm5ldygiY29tIiwgImdvb2dsZSIpLm5hbWUKKyAgICBhc3NlcnRfZXF1YWwgInd3dy5nb29nbGUuY29tIiwgIEBrbGFzcy5uZXcoImNvbSIsICJnb29nbGUiLCAid3d3IikubmFtZQorICBlbmQKKworICBkZWYgdGVzdF9kb21haW4KKyAgICBhc3NlcnRfbmlsIEBrbGFzcy5uZXcoImNvbSIpLmRvbWFpbgorICAgIGFzc2VydF9uaWwgQGtsYXNzLm5ldygidGxkbm90bGlzdGVkIikuZG9tYWluCisgICAgYXNzZXJ0X2VxdWFsICJnb29nbGUuY29tIiwgQGtsYXNzLm5ldygiY29tIiwgImdvb2dsZSIpLmRvbWFpbgorICAgIGFzc2VydF9lcXVhbCAiZ29vZ2xlLnRsZG5vdGxpc3RlZCIsIEBrbGFzcy5uZXcoInRsZG5vdGxpc3RlZCIsICJnb29nbGUiKS5kb21haW4KKyAgICBhc3NlcnRfZXF1YWwgImdvb2dsZS5jb20iLCBAa2xhc3MubmV3KCJjb20iLCAiZ29vZ2xlIiwgInd3dyIpLmRvbWFpbgorICAgIGFzc2VydF9lcXVhbCAiZ29vZ2xlLnRsZG5vdGxpc3RlZCIsIEBrbGFzcy5uZXcoInRsZG5vdGxpc3RlZCIsICJnb29nbGUiLCAid3d3IikuZG9tYWluCisgIGVuZAorCisgIGRlZiB0ZXN0X3N1YmRvbWFpbgorICAgIGFzc2VydF9uaWwgQGtsYXNzLm5ldygiY29tIikuc3ViZG9tYWluCisgICAgYXNzZXJ0X25pbCBAa2xhc3MubmV3KCJ0bGRub3RsaXN0ZWQiKS5zdWJkb21haW4KKyAgICBhc3NlcnRfbmlsIEBrbGFzcy5uZXcoImNvbSIsICJnb29nbGUiKS5zdWJkb21haW4KKyAgICBhc3NlcnRfbmlsIEBrbGFzcy5uZXcoInRsZG5vdGxpc3RlZCIsICJnb29nbGUiKS5zdWJkb21haW4KKyAgICBhc3NlcnRfZXF1YWwgInd3dy5nb29nbGUuY29tIiwgQGtsYXNzLm5ldygiY29tIiwgImdvb2dsZSIsICJ3d3ciKS5zdWJkb21haW4KKyAgICBhc3NlcnRfZXF1YWwgInd3dy5nb29nbGUudGxkbm90bGlzdGVkIiwgQGtsYXNzLm5ldygidGxkbm90bGlzdGVkIiwgImdvb2dsZSIsICJ3d3ciKS5zdWJkb21haW4KKyAgZW5kCisKKworICBkZWYgdGVzdF9kb21haW5fcXVlc3Rpb24KKyAgICBhc3NlcnQgIUBrbGFzcy5uZXcoImNvbSIpLmRvbWFpbj8KKyAgICBhc3NlcnQgIEBrbGFzcy5uZXcoImNvbSIsICJleGFtcGxlIikuZG9tYWluPworICAgIGFzc2VydCAgQGtsYXNzLm5ldygiY29tIiwgImV4YW1wbGUiLCAid3d3IikuZG9tYWluPworICAgIGFzc2VydCAgQGtsYXNzLm5ldygidGxkbm90bGlzdGVkIiwgImV4YW1wbGUiKS5kb21haW4/CisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC91bml0L2Vycm9yc190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3VuaXQvZXJyb3JzX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhYzU5MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC91bml0L2Vycm9yc190ZXN0LnJiCkBAIC0wLDAgKzEsMjMgQEAKK3JlcXVpcmUgInRlc3RfaGVscGVyIgorCitjbGFzcyBFcnJvcnNUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKworICAjIEluaGVyaXRzIGZyb20gU3RhbmRhcmRFcnJvcgorICBkZWYgdGVzdF9lcnJvcl9pbmhlcml0YW5jZQorICAgIGFzc2VydF9raW5kX29mICBTdGFuZGFyZEVycm9yLAorICAgICAgICAgICAgICAgICAgICBQdWJsaWNTdWZmaXg6OkVycm9yLm5ldworICBlbmQKKworICAjIEluaGVyaXRzIGZyb20gUHVibGljU3VmZml4OjpFcnJvcgorICBkZWYgdGVzdF9kb21haW5faW52YWxpZF9pbmhlcml0YW5jZQorICAgIGFzc2VydF9raW5kX29mICBQdWJsaWNTdWZmaXg6OkVycm9yLAorICAgICAgICAgICAgICAgICAgICBQdWJsaWNTdWZmaXg6OkRvbWFpbkludmFsaWQubmV3CisgIGVuZAorCisgICMgSW5oZXJpdHMgZnJvbSBQdWJsaWNTdWZmaXg6OkRvbWFpbkludmFsaWQKKyAgZGVmIHRlc3RfZG9tYWluX25vdF9hbGxvd2VkX2luaGVyaXRhbmNlCisgICAgYXNzZXJ0X2tpbmRfb2YgIFB1YmxpY1N1ZmZpeDo6RG9tYWluSW52YWxpZCwKKyAgICAgICAgICAgICAgICAgICAgUHVibGljU3VmZml4OjpEb21haW5Ob3RBbGxvd2VkLm5ldworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdW5pdC9saXN0X3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdW5pdC9saXN0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0YzVjYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC91bml0L2xpc3RfdGVzdC5yYgpAQCAtMCwwICsxLDIzOSBAQAorcmVxdWlyZSAidGVzdF9oZWxwZXIiCisKK2NsYXNzIFB1YmxpY1N1ZmZpeDo6TGlzdFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorCisgIGRlZiBzZXR1cAorICAgIEBsaXN0ID0gUHVibGljU3VmZml4OjpMaXN0Lm5ldworICBlbmQKKworICBkZWYgdGVhcmRvd24KKyAgICBQdWJsaWNTdWZmaXg6Okxpc3QuZGVmYXVsdCA9IG5pbAorICBlbmQKKworCisgIGRlZiB0ZXN0X2luaXRpYWxpemUKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpMaXN0LCBAbGlzdAorICAgIGFzc2VydF9lcXVhbCAwLCBAbGlzdC5zaXplCisgIGVuZAorCisKKyAgZGVmIHRlc3RfZXF1YWxpdHlfd2l0aF9zZWxmCisgICAgbGlzdCA9IFB1YmxpY1N1ZmZpeDo6TGlzdC5uZXcKKyAgICBhc3NlcnRfZXF1YWwgbGlzdCwgbGlzdAorICBlbmQKKworICBkZWYgdGVzdF9lcXVhbGl0eV93aXRoX2ludGVybmFscworICAgIHJ1bGUgPSBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiY29tIikKKyAgICBhc3NlcnRfZXF1YWwgUHVibGljU3VmZml4OjpMaXN0Lm5ldy5hZGQocnVsZSksIFB1YmxpY1N1ZmZpeDo6TGlzdC5uZXcuYWRkKHJ1bGUpCisgIGVuZAorCisgIGRlZiB0ZXN0X2VhY2hfd2l0aG91dF9ibG9jaworICAgIGxpc3QgPSBQdWJsaWNTdWZmaXg6Okxpc3QucGFyc2UoPDxFT1MpCithbHBoYQorYmV0YQorRU9TCisKKyAgICBhc3NlcnRfa2luZF9vZiBFbnVtZXJhdG9yLCBsaXN0LmVhY2gKKyAgICBhc3NlcnRfZXF1YWwgMiwgbGlzdC5lYWNoLmNvdW50CisgICAgYXNzZXJ0X2VxdWFsIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJhbHBoYSIpLCBsaXN0LmVhY2guZmlyc3QKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWFjaF93aXRoX2Jsb2NrCisgICAgbGlzdCA9IFB1YmxpY1N1ZmZpeDo6TGlzdC5wYXJzZSg8PEVPUykKK2FscGhhCitiZXRhCitFT1MKKworICAgIGVudHJpZXMgPSBbXQorICAgIGxpc3QuZWFjaCB7IHxyfCBlbnRyaWVzIDw8IHIgfQorCisgICAgYXNzZXJ0X2VxdWFsIDIsIGVudHJpZXMuY291bnQKKyAgICBhc3NlcnRfZXF1YWwgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImFscGhhIiksIGVudHJpZXMuZmlyc3QKKyAgZW5kCisKKworICBkZWYgdGVzdF9hZGQKKyAgICBhc3NlcnRfZXF1YWwgQGxpc3QsIEBsaXN0LmFkZChQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiZm9vIikpCisgICAgYXNzZXJ0X2VxdWFsIEBsaXN0LCBAbGlzdCA8PCAgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImJhciIpCisgICAgYXNzZXJ0X2VxdWFsIDIsIEBsaXN0LnNpemUKKyAgZW5kCisKKyAgZGVmIHRlc3RfYWRkX3Nob3VsZF9yZWNyZWF0ZV9pbmRleAorICAgIEBsaXN0ID0gUHVibGljU3VmZml4OjpMaXN0LnBhcnNlKCJjb20iKQorICAgIGFzc2VydF9lcXVhbCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiY29tIiksIEBsaXN0LmZpbmQoImdvb2dsZS5jb20iKQorICAgIGFzc2VydF9lcXVhbCBAbGlzdC5kZWZhdWx0X3J1bGUsIEBsaXN0LmZpbmQoImdvb2dsZS5uZXQiKQorCisgICAgQGxpc3QgPDwgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIm5ldCIpCisgICAgYXNzZXJ0X2VxdWFsIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJjb20iKSwgQGxpc3QuZmluZCgiZ29vZ2xlLmNvbSIpCisgICAgYXNzZXJ0X2VxdWFsIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJuZXQiKSwgQGxpc3QuZmluZCgiZ29vZ2xlLm5ldCIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2VtcHR5PworICAgIGFzc2VydCBAbGlzdC5lbXB0eT8KKyAgICBAbGlzdC5hZGQoUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIiIpKQorICAgIGFzc2VydCAhQGxpc3QuZW1wdHk/CisgIGVuZAorCisgIGRlZiB0ZXN0X3NpemUKKyAgICBhc3NlcnRfZXF1YWwgMCwgQGxpc3Quc2l6ZQorICAgIGFzc2VydF9lcXVhbCBAbGlzdCwgQGxpc3QuYWRkKFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIiKSkKKyAgICBhc3NlcnRfZXF1YWwgMSwgQGxpc3Quc2l6ZQorICBlbmQKKworICBkZWYgdGVzdF9jbGVhcgorICAgIGFzc2VydF9lcXVhbCAwLCBAbGlzdC5zaXplCisgICAgYXNzZXJ0X2VxdWFsIEBsaXN0LCBAbGlzdC5hZGQoUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIiIpKQorICAgIGFzc2VydF9lcXVhbCAxLCBAbGlzdC5zaXplCisgICAgYXNzZXJ0X2VxdWFsIEBsaXN0LCBAbGlzdC5jbGVhcgorICAgIGFzc2VydF9lcXVhbCAwLCBAbGlzdC5zaXplCisgIGVuZAorCisKKyAgZGVmIHRlc3RfZmluZAorICAgIGxpc3QgPSBQdWJsaWNTdWZmaXg6Okxpc3QucGFyc2UoPDxFT1MpCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCisvLyBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisvLyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gPT09QkVHSU4gSUNBTk4gRE9NQUlOUz09PQorCisvLyBjb20KK2NvbQorCisvLyB1aworKi51aworKi5zY2gudWsKKyFibC51aworIWJyaXRpc2gtbGlicmFyeS51aworCisvLyBpbworaW8KKworLy8gPT09RU5EIElDQU5OIERPTUFJTlM9PT0KKy8vID09PUJFR0lOIFBSSVZBVEUgRE9NQUlOUz09PQorCisvLyBHb29nbGUsIEluYy4KK2Jsb2dzcG90LmNvbQorCisvLyA9PT1FTkQgUFJJVkFURSBET01BSU5TPT09CitFT1MKKworICAgICMgbWF0Y2ggSUFOQQorICAgIGFzc2VydF9lcXVhbCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiY29tIiksIGxpc3QuZmluZCgiZXhhbXBsZS5jb20iKQorICAgIGFzc2VydF9lcXVhbCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiY29tIiksIGxpc3QuZmluZCgiZm9vLmV4YW1wbGUuY29tIikKKworICAgICMgbWF0Y2ggd2lsZGNhcmQKKyAgICBhc3NlcnRfZXF1YWwgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIioudWsiKSwgbGlzdC5maW5kKCJleGFtcGxlLnVrIikKKyAgICBhc3NlcnRfZXF1YWwgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIioudWsiKSwgbGlzdC5maW5kKCJleGFtcGxlLmNvLnVrIikKKyAgICBhc3NlcnRfZXF1YWwgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIioudWsiKSwgbGlzdC5maW5kKCJmb28uZXhhbXBsZS5jby51ayIpCisKKyAgICAjIG1hdGNoIGV4Y2VwdGlvbgorICAgIGFzc2VydF9lcXVhbCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiIWJyaXRpc2gtbGlicmFyeS51ayIpLCBsaXN0LmZpbmQoImJyaXRpc2gtbGlicmFyeS51ayIpCisgICAgYXNzZXJ0X2VxdWFsIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIhYnJpdGlzaC1saWJyYXJ5LnVrIiksIGxpc3QuZmluZCgiZm9vLmJyaXRpc2gtbGlicmFyeS51ayIpCisKKyAgICAjIG1hdGNoIGRlZmF1bHQgcnVsZQorICAgIGFzc2VydF9lcXVhbCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiKiIpLCBsaXN0LmZpbmQoInRlc3QiKQorICAgIGFzc2VydF9lcXVhbCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiKiIpLCBsaXN0LmZpbmQoImV4YW1wbGUudGVzdCIpCisgICAgYXNzZXJ0X2VxdWFsIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIqIiksIGxpc3QuZmluZCgiZm9vLmV4YW1wbGUudGVzdCIpCisKKyAgICAjIG1hdGNoIHByaXZhdGUKKyAgICBhc3NlcnRfZXF1YWwgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImJsb2dzcG90LmNvbSIsIHByaXZhdGU6IHRydWUpLCBsaXN0LmZpbmQoImJsb2dzcG90LmNvbSIpCisgICAgYXNzZXJ0X2VxdWFsIFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJibG9nc3BvdC5jb20iLCBwcml2YXRlOiB0cnVlKSwgbGlzdC5maW5kKCJmb28uYmxvZ3Nwb3QuY29tIikKKyAgZW5kCisKKworICBkZWYgdGVzdF9zZWxlY3QKKyAgICBhc3NlcnRfZXF1YWwgMiwgbGlzdC5zZW5kKDpzZWxlY3QsICJicml0aXNoLWxpYnJhcnkudWsiKS5zaXplCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdF9uYW1lX2JsYW5rCisgICAgYXNzZXJ0X2VxdWFsIFtdLCBsaXN0LnNlbmQoOnNlbGVjdCwgbmlsKQorICAgIGFzc2VydF9lcXVhbCBbXSwgbGlzdC5zZW5kKDpzZWxlY3QsICIiKQorICAgIGFzc2VydF9lcXVhbCBbXSwgbGlzdC5zZW5kKDpzZWxlY3QsICIgIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0X2lnbm9yZV9wcml2YXRlCisgICAgbGlzdCA9IFB1YmxpY1N1ZmZpeDo6TGlzdC5uZXcKKyAgICBsaXN0LmFkZCByMSA9IFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJpbyIpCisgICAgbGlzdC5hZGQgcjIgPSBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiZXhhbXBsZS5pbyIsIHByaXZhdGU6IHRydWUpCisKKyAgICBhc3NlcnRfZXF1YWwgbGlzdC5zZW5kKDpzZWxlY3QsICJmb28uaW8iKSwgW3IxXQorICAgIGFzc2VydF9lcXVhbCBsaXN0LnNlbmQoOnNlbGVjdCwgImV4YW1wbGUuaW8iKSwgW3IxLCByMl0KKyAgICBhc3NlcnRfZXF1YWwgbGlzdC5zZW5kKDpzZWxlY3QsICJmb28uZXhhbXBsZS5pbyIpLCBbcjEsIHIyXQorCisgICAgYXNzZXJ0X2VxdWFsIGxpc3Quc2VuZCg6c2VsZWN0LCAiZm9vLmlvIiwgaWdub3JlX3ByaXZhdGU6IGZhbHNlKSwgW3IxXQorICAgIGFzc2VydF9lcXVhbCBsaXN0LnNlbmQoOnNlbGVjdCwgImV4YW1wbGUuaW8iLCBpZ25vcmVfcHJpdmF0ZTogZmFsc2UpLCBbcjEsIHIyXQorICAgIGFzc2VydF9lcXVhbCBsaXN0LnNlbmQoOnNlbGVjdCwgImZvby5leGFtcGxlLmlvIiwgaWdub3JlX3ByaXZhdGU6IGZhbHNlKSwgW3IxLCByMl0KKworICAgIGFzc2VydF9lcXVhbCBsaXN0LnNlbmQoOnNlbGVjdCwgImZvby5pbyIsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSwgW3IxXQorICAgIGFzc2VydF9lcXVhbCBsaXN0LnNlbmQoOnNlbGVjdCwgImV4YW1wbGUuaW8iLCBpZ25vcmVfcHJpdmF0ZTogdHJ1ZSksIFtyMV0KKyAgICBhc3NlcnRfZXF1YWwgbGlzdC5zZW5kKDpzZWxlY3QsICJmb28uZXhhbXBsZS5pbyIsIGlnbm9yZV9wcml2YXRlOiB0cnVlKSwgW3IxXQorICBlbmQKKworCisgIGRlZiB0ZXN0X3NlbGZfZGVmYXVsdF9nZXR0ZXIKKyAgICBQdWJsaWNTdWZmaXg6Okxpc3QuZGVmYXVsdCA9IG5pbAorICAgIGFzc2VydF9uaWwoUHVibGljU3VmZml4OjpMaXN0LmNsYXNzX2V2YWwgeyBAZGVmYXVsdCB9KQorICAgIFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0CisgICAgcmVmdXRlX25pbChQdWJsaWNTdWZmaXg6Okxpc3QuY2xhc3NfZXZhbCB7IEBkZWZhdWx0IH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGZfZGVmYXVsdF9zZXR0ZXIKKyAgICBQdWJsaWNTdWZmaXg6Okxpc3QuZGVmYXVsdAorICAgIHJlZnV0ZV9uaWwoUHVibGljU3VmZml4OjpMaXN0LmNsYXNzX2V2YWwgeyBAZGVmYXVsdCB9KQorICAgIFB1YmxpY1N1ZmZpeDo6TGlzdC5kZWZhdWx0ID0gbmlsCisgICAgYXNzZXJ0X25pbChQdWJsaWNTdWZmaXg6Okxpc3QuY2xhc3NfZXZhbCB7IEBkZWZhdWx0IH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGZfcGFyc2UKKyAgICBsaXN0ID0gUHVibGljU3VmZml4OjpMaXN0LnBhcnNlKDw8RU9TKQorLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpYworLy8gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcworLy8gZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vID09PUJFR0lOIElDQU5OIERPTUFJTlM9PT0KKworLy8gY29tCitjb20KKworLy8gdWsKKyoudWsKKyFicml0aXNoLWxpYnJhcnkudWsKKworLy8gPT09RU5EIElDQU5OIERPTUFJTlM9PT0KKy8vID09PUJFR0lOIFBSSVZBVEUgRE9NQUlOUz09PQorCisvLyBHb29nbGUsIEluYy4KK2Jsb2dzcG90LmNvbQorCisvLyA9PT1FTkQgUFJJVkFURSBET01BSU5TPT09CitFT1MKKworICAgIGFzc2VydF9pbnN0YW5jZV9vZiBQdWJsaWNTdWZmaXg6Okxpc3QsIGxpc3QKKyAgICBhc3NlcnRfZXF1YWwgNCwgbGlzdC5zaXplCisKKyAgICBydWxlcyA9ICV3KCBjb20gKi51ayAhYnJpdGlzaC1saWJyYXJ5LnVrIGJsb2dzcG90LmNvbSApLm1hcCB7IHxuYW1lfCBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeShuYW1lKSB9CisgICAgYXNzZXJ0X2VxdWFsIHJ1bGVzLCBsaXN0LmVhY2gudG9fYQorCisgICAgIyBwcml2YXRlIGRvbWFpbnMKKyAgICBhc3NlcnRfZXF1YWwgZmFsc2UsIGxpc3QuZmluZCgiY29tIikucHJpdmF0ZQorICAgIGFzc2VydF9lcXVhbCB0cnVlLCAgbGlzdC5maW5kKCJibG9nc3BvdC5jb20iKS5wcml2YXRlCisgIGVuZAorCisKKyAgcHJpdmF0ZQorCisgIGRlZiBsaXN0CisgICAgQF9saXN0IHx8PSBQdWJsaWNTdWZmaXg6Okxpc3QucGFyc2UoPDxFT1MpCisvLyBjb20gOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLy5jb20KK2NvbQorCisvLyB1ayA6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvLnVrCisqLnVrCisqLnNjaC51aworIWJsLnVrCishYnJpdGlzaC1saWJyYXJ5LnVrCitFT1MKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3VuaXQvcHVibGljX3N1ZmZpeF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcHVibGljX3N1ZmZpeC0zLjAuMC90ZXN0L3VuaXQvcHVibGljX3N1ZmZpeF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWFlMWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdW5pdC9wdWJsaWNfc3VmZml4X3Rlc3QucmIKQEAgLTAsMCArMSwxODYgQEAKK3JlcXVpcmUgInRlc3RfaGVscGVyIgorCitjbGFzcyBQdWJsaWNTdWZmaXhUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKworICBkZWYgdGVzdF9wcml2YXRlX2RvbWFpbnNfZW5hYmxlZF9ieV9kZWZhdWx0CisgICAgZG9tYWluID0gUHVibGljU3VmZml4LnBhcnNlKCJ3d3cuZXhhbXBsZS5ibG9nc3BvdC5jb20iKQorICAgIGFzc2VydF9lcXVhbCAiYmxvZ3Nwb3QuY29tIiwgZG9tYWluLnRsZAorICBlbmQKKworICBkZWYgdGVzdF9wcml2YXRlX2RvbWFpbnNfZGlzYWJsZQorICAgIGRhdGEgPSBGaWxlLnJlYWQoUHVibGljU3VmZml4OjpMaXN0OjpERUZBVUxUX0xJU1RfUEFUSCkKKyAgICBQdWJsaWNTdWZmaXg6Okxpc3QuZGVmYXVsdCA9IFB1YmxpY1N1ZmZpeDo6TGlzdC5wYXJzZShkYXRhLCBwcml2YXRlX2RvbWFpbnM6IGZhbHNlKQorICAgIGRvbWFpbiA9IFB1YmxpY1N1ZmZpeC5wYXJzZSgid3d3LmV4YW1wbGUuYmxvZ3Nwb3QuY29tIikKKyAgICBhc3NlcnRfZXF1YWwgImNvbSIsIGRvbWFpbi50bGQKKyAgZW5zdXJlCisgICAgUHVibGljU3VmZml4OjpMaXN0LmRlZmF1bHQgPSBuaWwKKyAgZW5kCisKKworICBkZWYgdGVzdF9zZWxmX3BhcnNlX2FfZG9tYWluX3dpdGhfdGxkX2FuZF9zbGQKKyAgICBkb21haW4gPSBQdWJsaWNTdWZmaXgucGFyc2UoImV4YW1wbGUuY29tIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpEb21haW4sIGRvbWFpbgorICAgIGFzc2VydF9lcXVhbCAiY29tIiwgICAgIGRvbWFpbi50bGQKKyAgICBhc3NlcnRfZXF1YWwgImV4YW1wbGUiLCBkb21haW4uc2xkCisgICAgYXNzZXJ0X25pbCAgICAgICAgICAgICAgZG9tYWluLnRyZAorCisgICAgZG9tYWluID0gUHVibGljU3VmZml4LnBhcnNlKCJleGFtcGxlLmNvLnVrIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpEb21haW4sIGRvbWFpbgorICAgIGFzc2VydF9lcXVhbCAiY28udWsiLCAgIGRvbWFpbi50bGQKKyAgICBhc3NlcnRfZXF1YWwgImV4YW1wbGUiLCBkb21haW4uc2xkCisgICAgYXNzZXJ0X25pbCAgICAgICAgICAgICAgZG9tYWluLnRyZAorICBlbmQKKworICBkZWYgdGVzdF9zZWxmX3BhcnNlX2FfZG9tYWluX3dpdGhfdGxkX2FuZF9zbGRfYW5kX3RyZAorICAgIGRvbWFpbiA9IFB1YmxpY1N1ZmZpeC5wYXJzZSgiYWxwaGEuZXhhbXBsZS5jb20iKQorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBQdWJsaWNTdWZmaXg6OkRvbWFpbiwgZG9tYWluCisgICAgYXNzZXJ0X2VxdWFsICJjb20iLCAgICAgZG9tYWluLnRsZAorICAgIGFzc2VydF9lcXVhbCAiZXhhbXBsZSIsIGRvbWFpbi5zbGQKKyAgICBhc3NlcnRfZXF1YWwgImFscGhhIiwgICBkb21haW4udHJkCisKKyAgICBkb21haW4gPSBQdWJsaWNTdWZmaXgucGFyc2UoImFscGhhLmV4YW1wbGUuY28udWsiKQorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBQdWJsaWNTdWZmaXg6OkRvbWFpbiwgZG9tYWluCisgICAgYXNzZXJ0X2VxdWFsICJjby51ayIsICAgZG9tYWluLnRsZAorICAgIGFzc2VydF9lcXVhbCAiZXhhbXBsZSIsIGRvbWFpbi5zbGQKKyAgICBhc3NlcnRfZXF1YWwgImFscGhhIiwgICBkb21haW4udHJkCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGZfcGFyc2VfYV9kb21haW5fd2l0aF90bGRfYW5kX3NsZF9hbmRfNHJkCisgICAgZG9tYWluID0gUHVibGljU3VmZml4LnBhcnNlKCJvbmUudHdvLmV4YW1wbGUuY29tIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpEb21haW4sIGRvbWFpbgorICAgIGFzc2VydF9lcXVhbCAiY29tIiwgICAgIGRvbWFpbi50bGQKKyAgICBhc3NlcnRfZXF1YWwgImV4YW1wbGUiLCBkb21haW4uc2xkCisgICAgYXNzZXJ0X2VxdWFsICJvbmUudHdvIiwgZG9tYWluLnRyZAorCisgICAgZG9tYWluID0gUHVibGljU3VmZml4LnBhcnNlKCJvbmUudHdvLmV4YW1wbGUuY28udWsiKQorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBQdWJsaWNTdWZmaXg6OkRvbWFpbiwgZG9tYWluCisgICAgYXNzZXJ0X2VxdWFsICJjby51ayIsICAgZG9tYWluLnRsZAorICAgIGFzc2VydF9lcXVhbCAiZXhhbXBsZSIsIGRvbWFpbi5zbGQKKyAgICBhc3NlcnRfZXF1YWwgIm9uZS50d28iLCBkb21haW4udHJkCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGZfcGFyc2VfbmFtZV9mcWRuCisgICAgZG9tYWluID0gUHVibGljU3VmZml4LnBhcnNlKCJ3d3cuZXhhbXBsZS5jb20uIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpEb21haW4sIGRvbWFpbgorICAgIGFzc2VydF9lcXVhbCAiY29tIiwgICAgIGRvbWFpbi50bGQKKyAgICBhc3NlcnRfZXF1YWwgImV4YW1wbGUiLCBkb21haW4uc2xkCisgICAgYXNzZXJ0X2VxdWFsICJ3d3ciLCAgICAgZG9tYWluLnRyZAorICBlbmQKKworICBkZWYgdGVzdF9zZWxmX3BhcnNlX3dpdGhfY3VzdG9tX2xpc3QKKyAgICBsaXN0ID0gUHVibGljU3VmZml4OjpMaXN0Lm5ldworICAgIGxpc3QgPDwgUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoInRlc3QiKQorCisgICAgZG9tYWluID0gUHVibGljU3VmZml4LnBhcnNlKCJ3d3cuZXhhbXBsZS50ZXN0IiwgbGlzdDogbGlzdCkKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpEb21haW4sIGRvbWFpbgorICAgIGFzc2VydF9lcXVhbCAidGVzdCIsICAgIGRvbWFpbi50bGQKKyAgICBhc3NlcnRfZXF1YWwgImV4YW1wbGUiLCBkb21haW4uc2xkCisgICAgYXNzZXJ0X2VxdWFsICJ3d3ciLCAgICAgZG9tYWluLnRyZAorICBlbmQKKworICBkZWYgdGVzdF9zZWxmX3BhcnNlX3dpdGhfbm90bGlzdGVkX25hbWUKKyAgICBkb21haW4gPSBQdWJsaWNTdWZmaXgucGFyc2UoImV4YW1wbGUudGxkbm90bGlzdGVkIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpEb21haW4sIGRvbWFpbgorICAgIGFzc2VydF9lcXVhbCAidGxkbm90bGlzdGVkIiwgICAgZG9tYWluLnRsZAorICAgIGFzc2VydF9lcXVhbCAiZXhhbXBsZSIsICAgICAgICAgZG9tYWluLnNsZAorICAgIGFzc2VydF9uaWwgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLnRyZAorICBlbmQKKworICBkZWYgdGVzdF9zZWxmX3BhcnNlX3dpdGhfdW5hbGxvd2VkX2RvbWFpbgorICAgIGVycm9yID0gYXNzZXJ0X3JhaXNlcyhQdWJsaWNTdWZmaXg6OkRvbWFpbk5vdEFsbG93ZWQpIHsgUHVibGljU3VmZml4LnBhcnNlKCJleGFtcGxlLmtlIikgfQorICAgIGFzc2VydF9tYXRjaCgvZXhhbXBsZVwua2UvLCBlcnJvci5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF9zZWxmX3BhcnNlX3dpdGhfdXJpCisgICAgZXJyb3IgPSBhc3NlcnRfcmFpc2VzKFB1YmxpY1N1ZmZpeDo6RG9tYWluSW52YWxpZCkgeyBQdWJsaWNTdWZmaXgucGFyc2UoImh0dHA6Ly9nb29nbGUuY29tIikgfQorICAgIGFzc2VydF9tYXRjaCglcntodHRwOi8vZ29vZ2xlXC5jb219LCBlcnJvci5tZXNzYWdlKQorICBlbmQKKworCisgIGRlZiB0ZXN0X3NlbGZfdmFsaWQKKyAgICBhc3NlcnQgIFB1YmxpY1N1ZmZpeC52YWxpZD8oImdvb2dsZS5jb20iKQorICAgIGFzc2VydCAgUHVibGljU3VmZml4LnZhbGlkPygid3d3Lmdvb2dsZS5jb20iKQorICAgIGFzc2VydCAgUHVibGljU3VmZml4LnZhbGlkPygiZ29vZ2xlLmNvLnVrIikKKyAgICBhc3NlcnQgIFB1YmxpY1N1ZmZpeC52YWxpZD8oInd3dy5nb29nbGUuY28udWsiKQorICBlbmQKKworICBkZWYgdGVzdF9zZWxmX3ZhbGlkX3dpdGhfbm90bGlzdGVkX25hbWUKKyAgICBhc3NlcnQgIFB1YmxpY1N1ZmZpeC52YWxpZD8oImdvb2dsZS50bGRub3RsaXN0ZWQiKQorICAgIGFzc2VydCAgUHVibGljU3VmZml4LnZhbGlkPygid3d3Lmdvb2dsZS50bGRub3RsaXN0ZWQiKQorICBlbmQKKworICAjIGRlZiB0ZXN0X3NlbGZfdmFsaWRfd2l0aF9mdWxseV9xdWFsaWZpZWRfZG9tYWluX25hbWUKKyAgIyAgIGFzc2VydCAgUHVibGljU3VmZml4LnZhbGlkPygiZ29vZ2xlLmNvbS4iKQorICAjICAgYXNzZXJ0ICBQdWJsaWNTdWZmaXgudmFsaWQ/KCJnb29nbGUuY28udWsuIikKKyAgIyAgIGFzc2VydCAhUHVibGljU3VmZml4LnZhbGlkPygiZ29vZ2xlLnRsZG5vdGxpc3RlZC4iKQorICAjIGVuZAorCisKKyAgZGVmIHRlc3Rfc2VsZl9kb21haW4KKyAgICBhc3NlcnRfZXF1YWwgImdvb2dsZS5jb20iLCAgICBQdWJsaWNTdWZmaXguZG9tYWluKCJnb29nbGUuY29tIikKKyAgICBhc3NlcnRfZXF1YWwgImdvb2dsZS5jb20iLCAgICBQdWJsaWNTdWZmaXguZG9tYWluKCJ3d3cuZ29vZ2xlLmNvbSIpCisgICAgYXNzZXJ0X2VxdWFsICJnb29nbGUuY28udWsiLCAgUHVibGljU3VmZml4LmRvbWFpbigiZ29vZ2xlLmNvLnVrIikKKyAgICBhc3NlcnRfZXF1YWwgImdvb2dsZS5jby51ayIsICBQdWJsaWNTdWZmaXguZG9tYWluKCJ3d3cuZ29vZ2xlLmNvLnVrIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZl9kb21haW5fd2l0aF9ub3RsaXN0ZWRfbmFtZQorICAgIGFzc2VydF9lcXVhbCAiZXhhbXBsZS50bGRub3RsaXN0ZWQiLCBQdWJsaWNTdWZmaXguZG9tYWluKCJleGFtcGxlLnRsZG5vdGxpc3RlZCIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGZfZG9tYWluX3dpdGhfdW5hbGxvd2VkX25hbWUKKyAgICBhc3NlcnRfbmlsIFB1YmxpY1N1ZmZpeC5kb21haW4oImV4YW1wbGUua2UiKQorICBlbmQKKworICBkZWYgdGVzdF9zZWxmX2RvbWFpbl93aXRoX2JsYW5rX3NsZAorICAgIGFzc2VydF9uaWwgUHVibGljU3VmZml4LmRvbWFpbigiY29tIikKKyAgICBhc3NlcnRfbmlsIFB1YmxpY1N1ZmZpeC5kb21haW4oIi5jb20iKQorICBlbmQKKworCisgIGRlZiB0ZXN0X3NlbGZfbm9ybWFsaXplCisgICAgWworICAgICAgICBbImNvbSIsICJjb20iXSwKKyAgICAgICAgWyJleGFtcGxlLmNvbSIsICJleGFtcGxlLmNvbSJdLAorICAgICAgICBbInd3dy5leGFtcGxlLmNvbSIsICJ3d3cuZXhhbXBsZS5jb20iXSwKKworICAgICAgICBbImV4YW1wbGUuY29tLiIsICAiZXhhbXBsZS5jb20iXSwgICAgICMgc3RyaXAgRlFETgorICAgICAgICBbIiBleGFtcGxlLmNvbSAiLCAiZXhhbXBsZS5jb20iXSwgICAgICMgc3RyaXAgc3BhY2VzCisgICAgICAgIFsiRXhhbXBsZS5DT00iLCAgICJleGFtcGxlLmNvbSJdLCAgICAgIyBkb3duY2FzZQorICAgIF0uZWFjaCBkbyB8aW5wdXQsIG91dHB1dHwKKyAgICAgIGFzc2VydF9lcXVhbCBvdXRwdXQsIFB1YmxpY1N1ZmZpeC5ub3JtYWxpemUoaW5wdXQpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25vcm1hbGl6ZV9ibGFuaworICAgIFsKKyAgICAgICAgbmlsLAorICAgICAgICAiIiwKKyAgICAgICAgIiAiLAorICAgIF0uZWFjaCBkbyB8aW5wdXQsIF98CisgICAgICBlcnJvciA9IFB1YmxpY1N1ZmZpeC5ub3JtYWxpemUoaW5wdXQpCisgICAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpEb21haW5JbnZhbGlkLCBlcnJvcgorICAgICAgYXNzZXJ0X2VxdWFsICJOYW1lIGlzIGJsYW5rIiwgZXJyb3IubWVzc2FnZQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9ub3JtYWxpemVfc2NoZW1lCisgICAgWworICAgICAgICAiaHR0cHM6Ly9nb29nbGUuY29tIiwKKyAgICBdLmVhY2ggZG8gfGlucHV0LCBffAorICAgICAgZXJyb3IgPSBQdWJsaWNTdWZmaXgubm9ybWFsaXplKGlucHV0KQorICAgICAgYXNzZXJ0X2luc3RhbmNlX29mIFB1YmxpY1N1ZmZpeDo6RG9tYWluSW52YWxpZCwgZXJyb3IKKyAgICAgIGFzc2VydF9tYXRjaCgvc2NoZW1lLywgZXJyb3IubWVzc2FnZSkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9ybWFsaXplX2xlYWRpbmdfZG90CisgICAgWworICAgICAgICAiLmdvb2dsZS5jb20iLAorICAgIF0uZWFjaCBkbyB8aW5wdXQsIF98CisgICAgICBlcnJvciA9IFB1YmxpY1N1ZmZpeC5ub3JtYWxpemUoaW5wdXQpCisgICAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpEb21haW5JbnZhbGlkLCBlcnJvcgorICAgICAgYXNzZXJ0X21hdGNoICJOYW1lIHN0YXJ0cyB3aXRoIGEgZG90IiwgZXJyb3IubWVzc2FnZQorICAgIGVuZAorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdW5pdC9ydWxlX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9wdWJsaWNfc3VmZml4LTMuMC4wL3Rlc3QvdW5pdC9ydWxlX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxYzEzMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3B1YmxpY19zdWZmaXgtMy4wLjAvdGVzdC91bml0L3J1bGVfdGVzdC5yYgpAQCAtMCwwICsxLDIyMCBAQAorcmVxdWlyZSAidGVzdF9oZWxwZXIiCisKK2NsYXNzIFB1YmxpY1N1ZmZpeDo6UnVsZVRlc3QgPCBNaW5pdGVzdDo6VGVzdAorCisgIGRlZiB0ZXN0X2ZhY3Rvcnlfc2hvdWxkX3JldHVybl9ydWxlX25vcm1hbAorICAgIHJ1bGUgPSBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiY29tIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpSdWxlOjpOb3JtYWwsIHJ1bGUKKworICAgIHJ1bGUgPSBQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgidmVyb25hLml0IikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpSdWxlOjpOb3JtYWwsIHJ1bGUKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmFjdG9yeV9zaG91bGRfcmV0dXJuX3J1bGVfZXhjZXB0aW9uCisgICAgcnVsZSA9IFB1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIhYnJpdGlzaC1saWJyYXJ5LnVrIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpSdWxlOjpFeGNlcHRpb24sIHJ1bGUKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmFjdG9yeV9zaG91bGRfcmV0dXJuX3J1bGVfd2lsZGNhcmQKKyAgICBydWxlID0gUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIiouZG8iKQorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBQdWJsaWNTdWZmaXg6OlJ1bGU6OldpbGRjYXJkLCBydWxlCisKKyAgICBydWxlID0gUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIiouc2NoLnVrIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgUHVibGljU3VmZml4OjpSdWxlOjpXaWxkY2FyZCwgcnVsZQorICBlbmQKKworCisgIGRlZiB0ZXN0X2RlZmF1bHRfcmV0dXJuc19kZWZhdWx0X3dpbGRjYXJkCisgICAgZGVmYXVsdCA9IFB1YmxpY1N1ZmZpeDo6UnVsZS5kZWZhdWx0CisgICAgYXNzZXJ0X2VxdWFsIFB1YmxpY1N1ZmZpeDo6UnVsZTo6V2lsZGNhcmQuYnVpbGQoIioiKSwgZGVmYXVsdAorICAgIGFzc2VydF9lcXVhbCAldyggZXhhbXBsZSB0bGRub3RsaXN0ZWQgKSwgZGVmYXVsdC5kZWNvbXBvc2UoImV4YW1wbGUudGxkbm90bGlzdGVkIikKKyAgICBhc3NlcnRfZXF1YWwgJXcoIHd3dy5leGFtcGxlIHRsZG5vdGxpc3RlZCApLCBkZWZhdWx0LmRlY29tcG9zZSgid3d3LmV4YW1wbGUudGxkbm90bGlzdGVkIikKKyAgZW5kCisKK2VuZAorCisKK2NsYXNzIFB1YmxpY1N1ZmZpeDo6UnVsZUJhc2VUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKworICBjbGFzcyA6OlB1YmxpY1N1ZmZpeDo6UnVsZTo6VGVzdCA8IDo6UHVibGljU3VmZml4OjpSdWxlOjpCYXNlCisgIGVuZAorCisgIGRlZiBzZXR1cAorICAgIEBrbGFzcyA9IFB1YmxpY1N1ZmZpeDo6UnVsZTo6QmFzZQorICBlbmQKKworCisgIGRlZiB0ZXN0X2luaXRpYWxpemUKKyAgICBydWxlID0gQGtsYXNzLm5ldyh2YWx1ZTogInZlcm9uYS5pdCIpCisgICAgYXNzZXJ0X2luc3RhbmNlX29mIEBrbGFzcywgIHJ1bGUKKyAgICBhc3NlcnRfZXF1YWwgInZlcm9uYS5pdCIsICAgcnVsZS52YWx1ZQorICBlbmQKKworCisgIGRlZiB0ZXN0X2VxdWFsaXR5X3dpdGhfc2VsZgorICAgIHJ1bGUgPSBQdWJsaWNTdWZmaXg6OlJ1bGU6OkJhc2UubmV3KHZhbHVlOiAiZm9vIikKKyAgICBhc3NlcnRfZXF1YWwgcnVsZSwgcnVsZQorICBlbmQKKworICAjIHJ1Ym9jb3A6ZGlzYWJsZSBTdHlsZS9TaW5nbGVMaW5lTWV0aG9kcworICBkZWYgdGVzdF9lcXVhbGl0eV93aXRoX2ludGVybmFscworICAgIGFzc2VydF9lcXVhbCBAa2xhc3MubmV3KHZhbHVlOiAiZm9vIiksIEBrbGFzcy5uZXcodmFsdWU6ICJmb28iKQorICAgIHJlZnV0ZV9lcXVhbCBAa2xhc3MubmV3KHZhbHVlOiAiZm9vIiksIEBrbGFzcy5uZXcodmFsdWU6ICJiYXIiKQorICAgIHJlZnV0ZV9lcXVhbCBAa2xhc3MubmV3KHZhbHVlOiAiZm9vIiksIFB1YmxpY1N1ZmZpeDo6UnVsZTo6VGVzdC5uZXcodmFsdWU6ICJmb28iKQorICAgIHJlZnV0ZV9lcXVhbCBAa2xhc3MubmV3KHZhbHVlOiAiZm9vIiksIFB1YmxpY1N1ZmZpeDo6UnVsZTo6VGVzdC5uZXcodmFsdWU6ICJiYXIiKQorICAgIHJlZnV0ZV9lcXVhbCBAa2xhc3MubmV3KHZhbHVlOiAiZm9vIiksIENsYXNzLm5ldyB7IGRlZiBuYW1lOyBmb287IGVuZCB9Lm5ldworICBlbmQKKyAgIyBydWJvY29wOmVuYWJsZSBTdHlsZS9TaW5nbGVMaW5lTWV0aG9kcworCisgIGRlZiB0ZXN0X21hdGNoCisgICAgWworICAgICAgICAjIHN0YW5kYXJkIG1hdGNoCisgICAgICAgIFtQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgidWsiKSwgInVrIiwgdHJ1ZV0sCisgICAgICAgIFtQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgidWsiKSwgImV4YW1wbGUudWsiLCB0cnVlXSwKKyAgICAgICAgW1B1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJ1ayIpLCAiZXhhbXBsZS5jby51ayIsIHRydWVdLAorICAgICAgICBbUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImNvLnVrIiksICJleGFtcGxlLmNvLnVrIiwgdHJ1ZV0sCisKKyAgICAgICAgIyBGSVhNRQorICAgICAgICAjIFtQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiKi5jb20iKSwgImNvbSIsIGZhbHNlXSwKKyAgICAgICAgW1B1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIqLmNvbSIpLCAiZXhhbXBsZS5jb20iLCB0cnVlXSwKKyAgICAgICAgW1B1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCIqLmNvbSIpLCAiZm9vLmV4YW1wbGUuY29tIiwgdHJ1ZV0sCisgICAgICAgIFtQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiIWV4YW1wbGUuY29tIiksICJjb20iLCBmYWxzZV0sCisgICAgICAgIFtQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiIWV4YW1wbGUuY29tIiksICJleGFtcGxlLmNvbSIsIHRydWVdLAorICAgICAgICBbUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoIiFleGFtcGxlLmNvbSIpLCAiZm9vLmV4YW1wbGUuY29tIiwgdHJ1ZV0sCisKKyAgICAgICAgIyBUTEQgbWlzbWF0Y2gKKyAgICAgICAgW1B1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJnayIpLCAiZXhhbXBsZS51ayIsIGZhbHNlXSwKKyAgICAgICAgW1B1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJnayIpLCAiZXhhbXBsZS5jby51ayIsIGZhbHNlXSwKKyAgICAgICAgW1B1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJjby51ayIpLCAidWsiLCBmYWxzZV0sCisKKyAgICAgICAgIyBnZW5lcmFsIG1pc21hdGNoCisgICAgICAgIFtQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgidWsuY28iKSwgImV4YW1wbGUuY28udWsiLCBmYWxzZV0sCisgICAgICAgIFtQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiZ28udWsiKSwgImV4YW1wbGUuY28udWsiLCBmYWxzZV0sCisgICAgICAgIFtQdWJsaWNTdWZmaXg6OlJ1bGUuZmFjdG9yeSgiY28udWsiKSwgInVrIiwgZmFsc2VdLAorCisgICAgICAgICMgcGFydGlhbCBtYXRjaGVzL21pc21hdGNoZXMKKyAgICAgICAgW1B1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJjbyIpLCAiZXhhbXBsZS5jby51ayIsIGZhbHNlXSwKKyAgICAgICAgW1B1YmxpY1N1ZmZpeDo6UnVsZS5mYWN0b3J5KCJleGFtcGxlIiksICJleGFtcGxlLnVrIiwgZmFsc2VdLAorICAgICAgICBbUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImxlLml0IiksICJleGFtcGxlLml0IiwgZmFsc2VdLAorICAgICAgICBbUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImxlLml0IiksICJsZS5pdCIsIHRydWVdLAorICAgICAgICBbUHVibGljU3VmZml4OjpSdWxlLmZhY3RvcnkoImxlLml0IiksICJmb28ubGUuaXQiLCB0cnVlXSwKKworICAgIF0uZWFjaCBkbyB8cnVsZSwgaW5wdXQsIGV4cGVjdGVkfAorICAgICAgYXNzZXJ0X2VxdWFsIGV4cGVjdGVkLCBydWxlLm1hdGNoPyhpbnB1dCkKKyAgICBlbmQKKyAgZW5kCisKKworICBkZWYgdGVzdF9wYXJ0cworICAgIGFzc2VydF9yYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvcikgeyBAa2xhc3MubmV3KHZhbHVlOiAiY29tIikucGFydHMgfQorICBlbmQKKworICBkZWYgdGVzdF9kZWNvbXBvc2UKKyAgICBhc3NlcnRfcmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IpIHsgQGtsYXNzLm5ldyh2YWx1ZTogImNvbSIpLmRlY29tcG9zZSgiZ29vZ2xlLmNvbSIpIH0KKyAgZW5kCisKK2VuZAorCisKK2NsYXNzIFB1YmxpY1N1ZmZpeDo6UnVsZU5vcm1hbFRlc3QgPCBNaW5pdGVzdDo6VGVzdAorCisgIGRlZiBzZXR1cAorICAgIEBrbGFzcyA9IFB1YmxpY1N1ZmZpeDo6UnVsZTo6Tm9ybWFsCisgIGVuZAorCisKKyAgZGVmIHRlc3RfYnVpbGQKKyAgICBydWxlID0gQGtsYXNzLmJ1aWxkKCJ2ZXJvbmEuaXQiKQorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBAa2xhc3MsICAgICAgICAgICAgICBydWxlCisgICAgYXNzZXJ0X2VxdWFsICJ2ZXJvbmEuaXQiLCAgICAgICAgICAgICAgIHJ1bGUudmFsdWUKKyAgICBhc3NlcnRfZXF1YWwgInZlcm9uYS5pdCIsICAgICAgICAgICAgICAgcnVsZS5ydWxlCisgIGVuZAorCisKKyAgZGVmIHRlc3RfbGVuZ3RoCisgICAgYXNzZXJ0X2VxdWFsIDEsIEBrbGFzcy5idWlsZCgiY29tIikubGVuZ3RoCisgICAgYXNzZXJ0X2VxdWFsIDIsIEBrbGFzcy5idWlsZCgiY28uY29tIikubGVuZ3RoCisgICAgYXNzZXJ0X2VxdWFsIDMsIEBrbGFzcy5idWlsZCgibXguY28uY29tIikubGVuZ3RoCisgIGVuZAorCisgIGRlZiB0ZXN0X3BhcnRzCisgICAgYXNzZXJ0X2VxdWFsICV3KGNvbSksIEBrbGFzcy5idWlsZCgiY29tIikucGFydHMKKyAgICBhc3NlcnRfZXF1YWwgJXcoY28gY29tKSwgQGtsYXNzLmJ1aWxkKCJjby5jb20iKS5wYXJ0cworICAgIGFzc2VydF9lcXVhbCAldyhteCBjbyBjb20pLCBAa2xhc3MuYnVpbGQoIm14LmNvLmNvbSIpLnBhcnRzCisgIGVuZAorCisgIGRlZiB0ZXN0X2RlY29tcG9zZQorICAgIGFzc2VydF9lcXVhbCBbbmlsLCBuaWxdLCBAa2xhc3MuYnVpbGQoImNvbSIpLmRlY29tcG9zZSgiY29tIikKKyAgICBhc3NlcnRfZXF1YWwgJXcoIGV4YW1wbGUgY29tICksIEBrbGFzcy5idWlsZCgiY29tIikuZGVjb21wb3NlKCJleGFtcGxlLmNvbSIpCisgICAgYXNzZXJ0X2VxdWFsICV3KCBmb28uZXhhbXBsZSBjb20gKSwgQGtsYXNzLmJ1aWxkKCJjb20iKS5kZWNvbXBvc2UoImZvby5leGFtcGxlLmNvbSIpCisgIGVuZAorCitlbmQKKworCitjbGFzcyBQdWJsaWNTdWZmaXg6OlJ1bGVFeGNlcHRpb25UZXN0IDwgTWluaXRlc3Q6OlRlc3QKKworICBkZWYgc2V0dXAKKyAgICBAa2xhc3MgPSBQdWJsaWNTdWZmaXg6OlJ1bGU6OkV4Y2VwdGlvbgorICBlbmQKKworCisgIGRlZiB0ZXN0X2luaXRpYWxpemUKKyAgICBydWxlID0gQGtsYXNzLmJ1aWxkKCIhYnJpdGlzaC1saWJyYXJ5LnVrIikKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YgQGtsYXNzLCBydWxlCisgICAgYXNzZXJ0X2VxdWFsICJicml0aXNoLWxpYnJhcnkudWsiLCBydWxlLnZhbHVlCisgICAgYXNzZXJ0X2VxdWFsICIhYnJpdGlzaC1saWJyYXJ5LnVrIiwgcnVsZS5ydWxlCisgIGVuZAorCisKKyAgZGVmIHRlc3RfbGVuZ3RoCisgICAgYXNzZXJ0X2VxdWFsIDIsIEBrbGFzcy5idWlsZCgiIWJyaXRpc2gtbGlicmFyeS51ayIpLmxlbmd0aAorICAgIGFzc2VydF9lcXVhbCAzLCBAa2xhc3MuYnVpbGQoIiFmb28uYnJpdGlzaC1saWJyYXJ5LnVrIikubGVuZ3RoCisgIGVuZAorCisgIGRlZiB0ZXN0X3BhcnRzCisgICAgYXNzZXJ0X2VxdWFsICV3KCB1ayApLCBAa2xhc3MuYnVpbGQoIiFicml0aXNoLWxpYnJhcnkudWsiKS5wYXJ0cworICAgIGFzc2VydF9lcXVhbCAldyggdG9reW8ganAgKSwgQGtsYXNzLmJ1aWxkKCIhbWV0cm8udG9reW8uanAiKS5wYXJ0cworICBlbmQKKworICBkZWYgdGVzdF9kZWNvbXBvc2UKKyAgICBhc3NlcnRfZXF1YWwgW25pbCwgbmlsXSwgQGtsYXNzLmJ1aWxkKCIhYnJpdGlzaC1saWJyYXJ5LnVrIikuZGVjb21wb3NlKCJ1ayIpCisgICAgYXNzZXJ0X2VxdWFsICV3KCBicml0aXNoLWxpYnJhcnkgdWsgKSwgQGtsYXNzLmJ1aWxkKCIhYnJpdGlzaC1saWJyYXJ5LnVrIikuZGVjb21wb3NlKCJicml0aXNoLWxpYnJhcnkudWsiKQorICAgIGFzc2VydF9lcXVhbCAldyggZm9vLmJyaXRpc2gtbGlicmFyeSB1ayApLCBAa2xhc3MuYnVpbGQoIiFicml0aXNoLWxpYnJhcnkudWsiKS5kZWNvbXBvc2UoImZvby5icml0aXNoLWxpYnJhcnkudWsiKQorICBlbmQKKworZW5kCisKKworY2xhc3MgUHVibGljU3VmZml4OjpSdWxlV2lsZGNhcmRUZXN0IDwgTWluaXRlc3Q6OlRlc3QKKworICBkZWYgc2V0dXAKKyAgICBAa2xhc3MgPSBQdWJsaWNTdWZmaXg6OlJ1bGU6OldpbGRjYXJkCisgIGVuZAorCisKKyAgZGVmIHRlc3RfaW5pdGlhbGl6ZQorICAgIHJ1bGUgPSBAa2xhc3MuYnVpbGQoIiouYWljaGkuanAiKQorICAgIGFzc2VydF9pbnN0YW5jZV9vZiBAa2xhc3MsIHJ1bGUKKyAgICBhc3NlcnRfZXF1YWwgImFpY2hpLmpwIiwgcnVsZS52YWx1ZQorICAgIGFzc2VydF9lcXVhbCAiKi5haWNoaS5qcCIsIHJ1bGUucnVsZQorICBlbmQKKworCisgIGRlZiB0ZXN0X2xlbmd0aAorICAgIGFzc2VydF9lcXVhbCAyLCBAa2xhc3MuYnVpbGQoIioudWsiKS5sZW5ndGgKKyAgICBhc3NlcnRfZXF1YWwgMywgQGtsYXNzLmJ1aWxkKCIqLmNvLnVrIikubGVuZ3RoCisgIGVuZAorCisgIGRlZiB0ZXN0X3BhcnRzCisgICAgYXNzZXJ0X2VxdWFsICV3KCB1ayApLCBAa2xhc3MuYnVpbGQoIioudWsiKS5wYXJ0cworICAgIGFzc2VydF9lcXVhbCAldyggY28gdWsgKSwgQGtsYXNzLmJ1aWxkKCIqLmNvLnVrIikucGFydHMKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVjb21wb3NlCisgICAgYXNzZXJ0X2VxdWFsIFtuaWwsIG5pbF0sIEBrbGFzcy5idWlsZCgiKi5kbyIpLmRlY29tcG9zZSgibmljLmRvIikKKyAgICBhc3NlcnRfZXF1YWwgJXcoIGdvb2dsZSBjby51ayApLCBAa2xhc3MuYnVpbGQoIioudWsiKS5kZWNvbXBvc2UoImdvb2dsZS5jby51ayIpCisgICAgYXNzZXJ0X2VxdWFsICV3KCBmb28uZ29vZ2xlIGNvLnVrICksIEBrbGFzcy5idWlsZCgiKi51ayIpLmRlY29tcG9zZSgiZm9vLmdvb2dsZS5jby51ayIpCisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yLy5naXRpZ25vcmUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTBlOWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTMgQEAKKyouZ2VtCisuRFNfU3RvcmUKKy5UcmFzaGVzCisuYnVuZGxlCisuY29tLmFwcGxlLnRpbWVtYWNoaW5lLnN1cHBvcnRlZAorLmZzZXZlbnRzZAorLmlkZWEKKy5yYngKKy9leHQvYnVpbGQKK0Rlc2t0b3AgREIKK0Rlc2t0b3AgREYKK0dlbWZpbGUubG9jaworcGtnLyoKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL0dlbWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9HZW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZTJhMjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9HZW1maWxlCkBAIC0wLDAgKzEsMyBAQAorc291cmNlICJodHRwczovL3J1YnlnZW1zLm9yZyIKKworZ2Vtc3BlYwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvR3VhcmRmaWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvR3VhcmRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTY2NmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9HdWFyZGZpbGUKQEAgLTAsMCArMSw4IEBACisjIEEgc2FtcGxlIEd1YXJkZmlsZQorIyBNb3JlIGluZm8gYXQgaHR0cDovL2dpdGh1Yi5jb20vZ3VhcmQvZ3VhcmQjcmVhZG1lCisKK2d1YXJkIDpyc3BlYyBkbworICB3YXRjaCglcihec3BlYy8oLiopX3NwZWMucmIpKQorICB3YXRjaCglcihebGliLyguKilcLnJiKSkgICAgICAgIHsgfG18ICJzcGVjLyN7bVsxXX1fc3BlYy5yYiIgfQorICB3YXRjaCgnc3BlYy9zcGVjX2hlbHBlci5yYicpICAgIHsgJ3NwZWMnIH0KK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvTElDRU5TRS50eHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDgzZWNkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvTElDRU5TRS50eHQKQEAgLTAsMCArMSwyMiBAQAorQ29weXJpZ2h0IChjKSAyMDEwLTIwMTQgVGhpYmF1ZCBHdWlsbGF1bWUtR2VudGlsICYgVHJhdmlzIFRpbGxleQorCitNSVQgTGljZW5zZQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9SRUFETUUubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlNmE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL1JFQURNRS5tZApAQCAtMCwwICsxLDI1OSBAQAorWyFbQ29kZSBDbGltYXRlXShodHRwczovL2NvZGVjbGltYXRlLmNvbS9iYWRnZS5wbmcpXShodHRwczovL2NvZGVjbGltYXRlLmNvbS9naXRodWIvdGhpYmF1ZGdnL3JiLWZzZXZlbnQpCitbIVtlbmRvcnNlXShodHRwczovL2FwaS5jb2RlcndhbGwuY29tL3R0aWxsZXkvZW5kb3JzZWNvdW50LnBuZyldKGh0dHBzOi8vY29kZXJ3YWxsLmNvbS90dGlsbGV5KQorCisjIHJiLWZzZXZlbnQKKworVmVyeSBzaW1wbGUgJiB1c2FibGUgTWFjIE9TWCBGU0V2ZW50cyBBUEkKKworKiBSdWJ5Q29jb2Egbm90IHJlcXVpcmVkIQorKiBTaWduYWxzIGFyZSB3b3JraW5nIChyZWFsbHkpCisqIFRlc3RlZCBvbiBNUkkgMi40LjEsIFJCWCAzLjcyLCBKUnVieSAxLjcuMjYgYW5kIDkuMS44LjAKKyogVGVzdGVkIG9uIDEwLjgKKworIyMgSEZTKyBmaWxlbmFtZSBjb3JydXB0aW9uIGJ1ZworCitUaGVyZSBpcyBhIF92ZXJ5XyBsb25nLXN0YW5kaW5nIChzaW5jZSAyMDExKSBPU1ggYnVnIHdoZXJlIHNvbWV0aW1lcyB0aGUgZmlsZW5hbWUgbWV0YWRhdGEgZm9yIEhGUysgZmlsZXN5c3RlbXMgd2lsbCBnZXQgY29ycnVwdGVkLCByZXN1bHRpbmcgaW4gc29tZSBBUElzIHJldHVybmluZyBvbmUgY2FzZSBmb3IgYSBmaWxlLCBhbmQgb3RoZXIgQVBJcyByZXR1cm5pbmcgYW5vdGhlci4gVGhpcyBjb3JydXB0aW9uIGlzIG5vdCBjdXJyZW50bHkgZml4ZWQgYnkgdGhlaXIgdG9vbHMsIHRob3VnaCBBcHBsZSBoYXMgYmVlbiBtYWRlIGF3YXJlIG9mIHRoZSBpc3N1ZSBhbmQgYXJlIHdvcmtpbmcgb24gaXQgKGFzIG9mIG1heSAyMDE1KS4gVGhlIHJlc3VsdCBpcyB0aGF0IHNvbWV0aW1lcywgX2ZvciBubyB2aXNpYmxlIHJlYXNvbiB0byB0aGUgdXNlcl8sIGZzZXZlbnRzIHdvdWxkIHNpbXBseSBub3Qgd29yay4gQXMgb2YgcmItZnNldmVudCAwLjkuNSB0aGlzIGlzc3VlIGlzIHByb3Blcmx5IGRldGVjdGVkIGFuZCBhbiBpbnNhbmVseSBoYWNreSAoYnV0IGVmZmVjdGl2ZSkgd29ya2Fyb3VuZCBpcyB1c2VkIHRoYXQgcmVwbGFjZXMgdGhlIHN5c3RlbSBgcmVhbHBhdGgoKWAgd2l0aCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBrZXJuZWwgcmVwb3J0aW5nICh0aHVzIGZpeGluZyBmc2V2ZW50cykuCisKK1BsZWFzZSBub3RlIHRoYXQgdGhpcyBkb2Vzbid0IHJlcGFpciB0aGUgdW5kZXJseWluZyBpc3N1ZSBvbiBkaXNrLiBPdGhlciBhcHBzIGFuZCBsaWJyYXJpZXMgdXNpbmcgZnNldmVudHMgd2lsbCBjb250aW51ZSB0byBicmVhayB3aXRoIG5vIHdhcm5pbmcuIFRoZXJlIG1heSBiZSBvdGhlciBpc3N1ZXMgdW5yZWxhdGVkIHRvIGZzZXZlbnRzLgorCisjIyBJbnN0YWxsCisKKyAgICBnZW0gaW5zdGFsbCByYi1mc2V2ZW50CisKKyMjIyByZS1jb21waWxhdGlvbgorCityYi1mc2V2ZW50IGNvbWVzIHdpdGggYSBwcmUtY29tcGlsZWQgZnNldmVudFxfd2F0Y2ggYmluYXJ5IHN1cHBvcnRpbmcgeDg2XF82NCBvbiAxMC45IGFuZCBhYm92ZS4gVGhlIGJpbmFyeSBpcyBjb2Rlc2lnbmVkIHdpdGggbXkgKFRyYXZpcyBUaWxsZXkpIERldmVsb3BlciBJRCBhcyBhbiBleHRyYSBwcmVjYXV0aW9uIHdoZW4gZGlzdHJpYnV0aW5nIHByZS1jb21waWxlZCBjb2RlIGFuZCBjb250YWlucyBhbiBlbWJlZGRlZCBwbGlzdCBkZXNjcmliaW5nIGl0cyBidWlsZCBlbnZpcm9ubWVudC4gVGhpcyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgbW9zdCB1c2VycywgYnV0IGlmIHlvdSBuZWVkIHRvIHVzZSByYi1mc2V2ZW50IG9uIDEwLjggb3IgbG93ZXIgdGhlbiByZWNvbXBpbGF0aW9uIGlzIG5lY2Vzc2FyeS4gVGhpcyBjYW4gYmUgZG9uZSBieSBlbnRlcmluZyB0aGUgaW5zdGFsbGVkIGdlbSdzIGV4dCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmc6CisKKyAgICBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9IjEwLjciIHJha2UgcmVwbGFjZV9leGUKKworVGhlIGZvbGxvd2luZyBFTlYgdmFycyBhcmUgcmVjb2duaXplZDoKKworKiBDQworKiBDRkxBR1MKKyogQVJDSEZMQUdTCisqIE1BQ09TWFxfREVQTE9ZTUVOVFxfVEFSR0VUCisqIEZXREVCVUcgKGVuYWJsZXMgZGVidWcgbW9kZSwgcHJpbnRpbmcgYW4gb2JzY2VuZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbAorICBtZXNzYWdlcyB0byBTVERFUlIpCisKKyMjIyBlbWJlZGRlZCBwbGlzdAorCitZb3UgY2FuIHJldHJpZXZlIHRoZSB2YWx1ZXMgaW4gdGhlIGVtYmVkZGVkIHBsaXN0IHZpYSB0aGUgQ0xJOgorCisgICAgZnNldmVudF93YXRjaCAtLXNob3ctcGxpc3QKKworVGhlIG91dHB1dCBpcyBlc3NlbnRpYWxseSBmb3JtYXR0ZWQgYXMgYCIje2tleX06XG4gICN7dmFsdWV9XG4iYCB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoYW4gcGxpc3Qgc3R5bGUgeG1sLiBUaGUgcmVzdWx0IGxvb2tzIGxpa2UgdGhpczoKKworICAgIERUU0RLTmFtZToKKyAgICAgIG1hY29zeDEwLjUKKyAgICBGU0VXQnVpbGRUcmlwbGU6CisgICAgICBpMzg2LWFwcGxlLWRhcndpbjEwLjguMAorICAgIEZTRVdDQzoKKyAgICAgIC91c3IvYmluL2djYy00LjIKKyAgICBEVFNES1BhdGg6CisgICAgICAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNS5zZGsKKyAgICBGU0VXQ0NWZXJzaW9uOgorICAgICAgaTY4Ni1hcHBsZS1kYXJ3aW4xMC1nY2MtNC4yLjEgKEdDQykgNC4yLjEgKEFwcGxlIEluYy4gYnVpbGQgNTY2NikgKGRvdCAzKQorICAgIEZTRVdDRkxBR1M6CisgICAgICAtZmNvbnN0YW50LWNmc3RyaW5ncyAtZm5vLXN0cmljdC1hbGlhc2luZyAtV2FsbCAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC41IC1PMworCitJZiwgZm9yIHNvbWUgcGVydmVyc2UgcmVhc29uLCB5b3UgcHJlZmVyIHRvIGxvb2sgYXQgdGhlIHhtbC4uLiBpdCBjYW4gYmUgcmV0cmlldmVkIHZpYToKKworICAgIG90b29sIC1zIF9fVEVYVCBfX2luZm9fcGxpc3QgLi9iaW4vZnNldmVudF93YXRjaCB8IGdyZXAgXjAgfCB4eGQgLXIgLQorCisjIyMgY29kZXNpZ24KKworWW91IGNhbiB2ZXJpZnkgY29kZSBzaWduaW5nIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIGZzZXZlbnRcX3dhdGNoIHZpYToKKworICAgIGNvZGVzaWduIC1kIC12dnYgLi9iaW4vZnNldmVudF93YXRjaAorCitJZiB5b3UncmUgdXNpbmcgdGhlIHByZS1jb21waWxlZCBiaW5hcnksIHRoZW4gdGhlIG91dHB1dCBzaG91bGQgY29udGFpbiBzb21ldGhpbmcgdG8gdGhlIGVmZmVjdCBvZjoKKworICAgIEF1dGhvcml0eT1EZXZlbG9wZXIgSUQgQXBwbGljYXRpb246IFRyYXZpcyBUaWxsZXkKKyAgICBBdXRob3JpdHk9RGV2ZWxvcGVyIElEIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgQXV0aG9yaXR5PUFwcGxlIFJvb3QgQ0EKKyAgICBUaW1lc3RhbXA9RGVjIDMxLCAyMDEyIDEyOjQ5OjEzIFBNCisKKyMjIFVzYWdlCisKKyMjIyBTaW5ndWxhciBwYXRoCisKK2BgYHJ1YnkKK3JlcXVpcmUgJ3JiLWZzZXZlbnQnCisKK2ZzZXZlbnQgPSBGU0V2ZW50Lm5ldworZnNldmVudC53YXRjaCBEaXIucHdkIGRvIHxkaXJlY3Rvcmllc3wKKyAgcHV0cyAiRGV0ZWN0ZWQgY2hhbmdlIGluc2lkZTogI3tkaXJlY3Rvcmllcy5pbnNwZWN0fSIKK2VuZAorZnNldmVudC5ydW4KK2BgYAorCisjIyMgTXVsdGlwbGUgcGF0aHMKKworYGBgcnVieQorcmVxdWlyZSAncmItZnNldmVudCcKKworcGF0aHMgPSBbJy90bXAvcGF0aC9vbmUnLCAnL3RtcC9wYXRoL3R3bycsIERpci5wd2RdCisKK2ZzZXZlbnQgPSBGU0V2ZW50Lm5ldworZnNldmVudC53YXRjaCBwYXRocyBkbyB8ZGlyZWN0b3JpZXN8CisgIHB1dHMgIkRldGVjdGVkIGNoYW5nZSBpbnNpZGU6ICN7ZGlyZWN0b3JpZXMuaW5zcGVjdH0iCitlbmQKK2ZzZXZlbnQucnVuCitgYGAKKworIyMjIE11bHRpcGxlIHBhdGhzIGFuZCBhZGRpdGlvbmFsIG9wdGlvbnMgYXMgYSBIYXNoCisKK2BgYHJ1YnkKK3JlcXVpcmUgJ3JiLWZzZXZlbnQnCisKK3BhdGhzID0gWycvdG1wL3BhdGgvb25lJywgJy90bXAvcGF0aC90d28nLCBEaXIucHdkXQorb3B0aW9ucyA9IHs6bGF0ZW5jeSA9PiAxLjUsIDpub19kZWZlciA9PiB0cnVlIH0KKworZnNldmVudCA9IEZTRXZlbnQubmV3Citmc2V2ZW50LndhdGNoIHBhdGhzLCBvcHRpb25zIGRvIHxkaXJlY3Rvcmllc3wKKyAgcHV0cyAiRGV0ZWN0ZWQgY2hhbmdlIGluc2lkZTogI3tkaXJlY3Rvcmllcy5pbnNwZWN0fSIKK2VuZAorZnNldmVudC5ydW4KK2BgYAorCisjIyMgTXVsdGlwbGUgcGF0aHMgYW5kIGFkZGl0aW9uYWwgb3B0aW9ucyBhcyBhbiBBcnJheQorCitgYGBydWJ5CityZXF1aXJlICdyYi1mc2V2ZW50JworCitwYXRocyA9IFsnL3RtcC9wYXRoL29uZScsICcvdG1wL3BhdGgvdHdvJywgRGlyLnB3ZF0KK29wdGlvbnMgPSBbJy0tbGF0ZW5jeScsIDEuNSwgJy0tbm8tZGVmZXInXQorCitmc2V2ZW50ID0gRlNFdmVudC5uZXcKK2ZzZXZlbnQud2F0Y2ggcGF0aHMsIG9wdGlvbnMgZG8gfGRpcmVjdG9yaWVzfAorICBwdXRzICJEZXRlY3RlZCBjaGFuZ2UgaW5zaWRlOiAje2RpcmVjdG9yaWVzLmluc3BlY3R9IgorZW5kCitmc2V2ZW50LnJ1bgorYGBgCisKKyMjIyBVc2luZyBfZnVsbF8gZXZlbnQgaW5mb3JtYXRpb24KKworYGBgcnVieQorcmVxdWlyZSAncmItZnNldmVudCcKK2ZzZXZlbnQgPSBGU0V2ZW50Lm5ldworZnNldmVudC53YXRjaCBEaXIucHdkIGRvIHxwYXRocywgZXZlbnRfbWV0YXwKKyAgZXZlbnRfbWV0YS5ldmVudHMuZWFjaCBkbyB8ZXZlbnR8CisgICAgcHV0cyAiZXZlbnQgSUQ6ICN7ZXZlbnQuaWR9IgorICAgIHB1dHMgInBhdGg6ICN7ZXZlbnQucGF0aH0iCisgICAgcHV0cyAiYyBmbGFnczogI3tldmVudC5jZmxhZ3N9IgorICAgIHB1dHMgIm5hbWVkIGZsYWdzOiAje2V2ZW50LmZsYWdzLmpvaW4oJywgJyl9IgorICAgICMgbmFtZWQgZmxhZ3Mgd2lsbCBpbmNsdWRlIHN0cmluZ3Mgc3VjaCBhcyBgSXRlbUlub2RlTWV0YU1vZGAgb3IgYE93bkV2ZW50YAorICBlbmQKK2VuZAorZnNldmVudC5ydW4KK2BgYAorCisjIyBPcHRpb25zCisKK1doZW4gZGVmaW5pbmcgb3B0aW9ucyB1c2luZyBhIGhhc2ggb3IgaGFzaC1saWtlIG9iamVjdCwgaXQgZ2V0cyBjaGVja2VkIGZvciB2YWxpZGl0eSBhbmQgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBmc2V2ZW50XF93YXRjaCBjb21tYW5kbGluZSBhcmd1bWVudHMgYXJyYXkgd2hlbiB0aGUgRlNFdmVudCBjbGFzcyBpcyBpbnN0YW50aWF0ZWQuIFRoaXMgaXMgb2J2aW91c2x5IHRoZSBzYWZlc3QgYW5kIHByZWZlcnJlZCBtZXRob2Qgb2YgcGFzc2luZyBpbiBvcHRpb25zLgorCitZb3UgbWF5LCBob3dldmVyLCBjaG9vc2UgdG8gcGFzcyBpbiBhbiBhcnJheSBvZiBjb21tYW5kbGluZSBhcmd1bWVudHMgYXMgeW91ciBvcHRpb25zIHZhbHVlIGFuZCBpdCB3aWxsIGJlIHBhc3NlZCBvbiwgdW5tb2RpZmllZCwgdG8gdGhlIGZzZXZlbnRcX3dhdGNoIGJpbmFyeSB3aGVuIGNhbGxlZC4KKworU28gZmFyLCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoKKworKiA6bGF0ZW5jeSA9PiAwLjUgIyBpbiBzZWNvbmRzCisqIDpub1xfZGVmZXIgPT4gdHJ1ZQorKiA6d2F0Y2hcX3Jvb3QgPT4gdHJ1ZQorKiA6c2luY2VcX3doZW4gPT4gMTg0NDY3NDQwNzM3MDk1NTE2MTUgIyBhbiBGU0V2ZW50U3RyZWFtRXZlbnRJZAorKiA6ZmlsZVxfZXZlbnRzID0+IHRydWUKKworIyMjIExhdGVuY3kKKworVGhlIDpsYXRlbmN5IHBhcmFtZXRlciBkZXRlcm1pbmVzIGhvdyBsb25nIHRoZSBzZXJ2aWNlIHNob3VsZCB3YWl0IGFmdGVyIHRoZSBmaXJzdCBldmVudCBiZWZvcmUgcGFzc2luZyB0aGF0IGluZm9ybWF0aW9uIGFsb25nIHRvIHRoZSBjbGllbnQuIElmIHlvdXIgbGF0ZW5jeSBpcyBzZXQgdG8gNCBzZWNvbmRzLCBhbmQgMzAwIGNoYW5nZXMgb2NjdXIgaW4gdGhlIGZpcnN0IHRocmVlLCB0aGVuIHRoZSBjYWxsYmFjayB3aWxsIGJlIGZpcmVkIG9ubHkgb25jZS4gSWYgbGF0ZW5jeSBpcyBzZXQgdG8gMC4xIGluIHRoZSBleGFjdCBzYW1lIHNjZW5hcmlvLCB5b3Ugd2lsbCBzZWUgdGhhdCBjYWxsYmFjayBmaXJlIHNvbWV3aGVyZSBjbG9zZXIgdG8gYmV0d2VlbiAyNSBhbmQgMzAgdGltZXMuCisKK1NldHRpbmcgYSBoaWdoZXIgbGF0ZW5jeSB2YWx1ZSBhbGxvd3MgZm9yIG1vcmUgZWZmZWN0aXZlIHRlbXBvcmFsIGNvYWxlc2NpbmcsIHJlc3VsdGluZyBpbiBmZXdlciBjYWxsYmFja3MgYW5kIGdyZWF0ZXIgb3ZlcmFsbCBlZmZpY2llbmN5Li4uIGF0IHRoZSBjb3N0IG9mIGFwcGFyZW50IHJlc3BvbnNpdmVuZXNzLiBTZXR0aW5nIHRoaXMgdG8gYSByZWFzb25hYmx5IGhpZ2ggdmFsdWUgKGFuZCBOT1Qgc2V0dGluZyA6bm9cX2RlZmVyKSBpcyBwYXJ0aWN1bGFybHkgd2VsbCBzdWl0ZWQgZm9yIGJhY2tncm91bmQsIGRhZW1vbiwgb3IgYmF0Y2ggcHJvY2Vzc2luZyBhcHBsaWNhdGlvbnMuCisKK0ltcGxlbWVudGF0aW9uIG5vdGU6IEl0IGFwcGVhcnMgdGhhdCBGU0V2ZW50cyB3aWxsIG9ubHkgY29hbGVzY2UgZXZlbnRzIGZyb20gYSBtYXhpbXVtIG9mIDMyIGRpc3RpbmN0IHN1YnBhdGhzLCBtYWtpbmcgdGhlIGFib3ZlIGNvbXBsZXRlbHkgYWNjdXJhdGUgb25seSB3aGVuIGV2ZW50cyBhcmUgdG8gZmV3ZXIgdGhhbiAzMiBzdWJwYXRocy4gQ3JlYXRpbmcgMzAwIGZpbGVzIGluIG9uZSBkaXJlY3RvcnksIGZvciBleGFtcGxlLCBvciAzMCBmaWxlcyBpbiAxMCBzdWJkaXJlY3RvcmllcywgYnV0IG5vdCAzMDAgZmlsZXMgd2l0aGluIDMwMCBzdWJkaXJlY3Rvcmllcy4gSW4gdGhlIGxhdHRlciBjYXNlLCB5b3UgbWF5IHJlY2VpdmUgMzEgY2FsbGJhY2tzIGluIG9uZSBnbyBhZnRlciB0aGUgbGF0ZW5jeSBwZXJpb2QuIEFzIHRoaXMgYXBwZWFycyB0byBiZSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHRoZSBudW1iZXIgY291bGQgcG90ZW50aWFsbHkgZGlmZmVyIGFjcm9zcyBPUyByZXZpc2lvbnMuIEl0IGlzIGVudGlyZWx5IHBvc3NpYmxlIHRoYXQgdGhpcyBudW1iZXIgaXMgc29tZWhvdyBjb25maWd1cmFibGUsIGJ1dCBJIGhhdmUgbm90IHlldCBkaXNjb3ZlcmVkIGFuIGFjY2VwdGVkIG1ldGhvZCBvZiBkb2luZyBzby4KKworIyMjIE5vRGVmZXIKKworVGhlIDpub1xfZGVmZXIgb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBsYXRlbmN5IHBhcmFtZXRlciBjb21wbGV0ZWx5LiBSYXRoZXIgdGhhbiB3YWl0aW5nIGZvciAkbGF0ZW5jeSBwZXJpb2Qgb2YgdGltZSBiZWZvcmUgc2VuZGluZyBhbG9uZyBldmVudHMgaW4gYW4gYXR0ZW1wdCB0byBjb2FsZXNjZSBhIHBvdGVudGlhbCBkZWx1Z2UgYWhlYWQgb2YgdGltZSwgdGhhdCBmaXJzdCBldmVudCBpcyBzZW50IGFsb25nIHRvIHRoZSBjbGllbnQgaW1tZWRpYXRlbHkgYW5kIGlzIGZvbGxvd2VkIGJ5IGEgJGxhdGVuY3kgcGVyaW9kIG9mIHNpbGVuY2UgYmVmb3JlIHNlbmRpbmcgYWxvbmcgYW55IGFkZGl0aW9uYWwgZXZlbnRzIHRoYXQgb2NjdXJyZWQgd2l0aGluIHRoYXQgcGVyaW9kLgorCitUaGlzIGJlaGF2aW9yIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucyB3aGVyZSB0aGF0IGZlZWxpbmcgb2YgYXBwYXJlbnQgcmVzcG9uc2l2ZW5lc3MgaXMgbW9zdCBpbXBvcnRhbnQsIGJ1dCB5b3Ugc3RpbGwgZG9uJ3Qgd2FudCB0byBnZXQgb3ZlcndoZWxtZWQgYnkgYSBzZXJpZXMgb2YgZXZlbnRzIHRoYXQgb2NjdXIgaW4gcmFwaWQgc3VjY2Vzc2lvbi4KKworIyMjIFdhdGNoUm9vdAorCitUaGUgOndhdGNoXF9yb290IG9wdGlvbiBhbGxvd3MgZm9yIGNhdGNoaW5nIHRoZSBzY2VuYXJpbyB3aGVyZSB5b3Ugc3RhcnQgd2F0Y2hpbmcgIn4vc3JjL2RlbW9cX3Byb2plY3QiIGFuZCBlaXRoZXIgaXQgaXMgbGF0ZXIgcmVuYW1lZCB0byAifi9zcmMvYXdlc29tZVxfc2F1Y2VcXzMwMDAiIG9yIHRoZSBwYXRoIGNoYW5nZXMgaW4gc3VjaCBhIG1hbm5lciB0aGF0IHRoZSBvcmlnaW5hbCBkaXJlY3RvcnkgaXMgbm93IGF0ICJ+L2NsaWVudHMvZm9vL2l0ZXJhdGlvbjQvZGVtb1xfcHJvamVjdCIuCisKK1VuZm9ydHVuYXRlbHksIHdoaWxlIHRoaXMgYmVoYXZpb3IgaXMgc29tZXdoYXQgc3VwcG9ydGVkIGluIHRoZSBmc2V2ZW50XF93YXRjaCBiaW5hcnkgYnVpbHQgYXMgcGFydCBvZiB0aGlzIHByb2plY3QsIHN1cHBvcnQgZm9yIHBhc3NpbmcgYWNyb3NzIGRldGFpbGVkIG1ldGFkYXRhIGlzIG5vdCAoeWV0KS4gQXMgYSByZXN1bHQsIHlvdSB3b3VsZCBub3QgcmVjZWl2ZSB0aGUgYXBwcm9wcmlhdGUgUm9vdENoYW5nZWQgZXZlbnQgYW5kIGJlIGFibGUgdG8gcmVhY3QgYXBwcm9wcmlhdGVseS4gQWxzbywgc2luY2UgdGhlIEMgY29kZSBkb2Vzbid0IG9wZW4gd2F0Y2hlZCBkaXJlY3RvcmllcyBhbmQgcmV0YWluIHRoYXQgZmlsZSBkZXNjcmlwdG9yIGFzIHBhcnQgb2YgcGF0aC1zcGVjaWZpYyBjYWxsYmFjayBtZXRhZGF0YSwgd2UgYXJlIHVuYWJsZSB0byBpc3N1ZSBhbiBGXF9HRVRQQVRIIGZjbnRsKCkgdG8gZGV0ZXJtaW5lIHRoZSBkaXJlY3RvcnkncyBuZXcgcGF0aC4KKworUGxlYXNlIGRvIG5vdCB1c2UgdGhpcyBvcHRpb24gdW50aWwgcHJvcGVyIHN1cHBvcnQgaXMgYWRkZWQgKG9yLCBldmVuIGJldHRlciwgYWRkIGl0IGFuZCBzdWJtaXQgYSBwdWxsIHJlcXVlc3QpLgorCisjIyMgU2luY2VXaGVuCisKK1RoZSBGU0V2ZW50U3RyZWFtRXZlbnRJZCBwYXNzZWQgaW4gdG8gOnNpbmNlXF93aGVuIGlzIHVzZWQgYXMgYSBiYXNlIGZvciByZWFjdGluZyB0byBoaXN0b3JpYyBldmVudHMuIFVuZm9ydHVuYXRlbHksIG5vdCBvbmx5IGlzIHRoZSBtZXRhZGF0YSBmb3IgdHJhbnNpdGlvbmluZyBmcm9tIGhpc3RvcmljIHRvIGxpdmUgZXZlbnRzIG5vdCBjdXJyZW50bHkgcGFzc2VkIGFsb25nLCBidXQgaXQgaXMgaW5jb3JyZWN0bHkgcGFzc2VkIGFzIGEgY2hhbmdlIGV2ZW50IG9uIHRoZSByb290IHBhdGgsIGFuZCBvbmx5IHBlci1ob3N0IGV2ZW50IHN0cmVhbXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuIFdoZW4gdXNpbmcgcGVyLWhvc3QgZXZlbnQgc3RyZWFtcywgdGhlIGV2ZW50IElEcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIG9yIGNvbnRpZ3VvdXMgd2hlbiBzaGFyZWQgdm9sdW1lcyAoZmlyZXdpcmUvVVNCL25ldC9ldGMpIGFyZSB1c2VkIG9uIG11bHRpcGxlIG1hY3MuCisKK1BsZWFzZSBkbyBub3QgdXNlIHRoaXMgb3B0aW9uIHVudGlsIHByb3BlciBzdXBwb3J0IGlzIGFkZGVkLCB1bmxlc3MgaXQncyBhY2NlcHRhYmxlIGZvciB5b3UgdG8gcmVjZWl2ZSB0aGF0IG9uZSBmYWtlIGV2ZW50IHRoYXQncyBoYW5kbGVkIGluY29ycmVjdGx5IHdoZW4gZXZlbnRzIHRyYW5zaXRpb24gZnJvbSBoaXN0b3JpY2FsIHRvIGxpdmUuIEV2ZW4gaW4gdGhhdCBzY2VuYXJpbywgdGhlcmUncyBubyBtZXRhZGF0YSBhdmFpbGFibGUgZm9yIGRldGVybWluaW5nIHRoZSBGU0V2ZW50U3RyZWFtRXZlbnRJZCBvZiB0aGUgbGFzdCByZWNlaXZlZCBldmVudC4KKworV0FSTklORzogcGFzc2luZyBpbiAwIGFzIHRoZSBwYXJhbWV0ZXIgdG8gOnNpbmNlXF93aGVuIHdpbGwgcmV0dXJuIGV2ZW50cyBmb3IgZXZlcnkgZGlyZWN0b3J5IG1vZGlmaWVkIHNpbmNlICJ0aGUgYmVnaW5uaW5nIG9mIHRpbWUiLgorCisjIyMgRmlsZUV2ZW50cyAjIyMKKworUHJlcGFyZSB5b3Vyc2VsZiBmb3IgYW4gb2JzY2VuZSBudW1iZXIgb2YgY2FsbGJhY2tzLiBSZWFsaXN0aWNhbGx5LCBhbiAiQXRvbWljIFNhdmUiIGNvdWxkIGVhc2lseSBmaXJlIG1heWJlIDYgZXZlbnRzIGZvciB0aGUgY29tYmluYXRpb24gb2YgY3JlYXRpbmcgdGhlIG5ldyBmaWxlLCBjaGFuZ2luZyBtZXRhZGF0YS9wZXJtaXNzaW9ucywgd3JpdGluZyBjb250ZW50LCBzd2FwcGluZyBvdXQgdGhlIG9sZCBmaWxlIGZvciB0aGUgbmV3IG1heSBpdHNlbGYgcmVzdWx0IGluIG11bHRpcGxlIGV2ZW50cyBiZWluZyBmaXJlZCwgYW5kIHNvIGZvcnRoLiBCeSB0aGUgdGltZSB5b3UgZ2V0IHRoZSBldmVudCBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlIGJlaW5nIGNyZWF0ZWQgYXMgcGFydCBvZiB0aGUgYXRvbWljIHNhdmUsIGl0IHdpbGwgYWxyZWFkeSBiZSBnb25lIGFuZCBzd2FwcGVkIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUuIFRoaXMgYW5kIGlzc3VlcyBvZiBhIHNpbWlsYXIgbmF0dXJlIGhhdmUgcHJldmVudGVkIG1lIGZyb20gYWRkaW5nIHRoZSBvcHRpb24gdG8gdGhlIHJ1YnkgY29kZSBkZXNwaXRlIHRoZSBmc2V2ZW50XF93YXRjaCBiaW5hcnkgc3VwcG9ydGluZyBmaWxlIGxldmVsIGV2ZW50cyBmb3IgcXVpdGUgc29tZSB0aW1lIG5vdy4gTW91bnRhaW4gTGlvbiBzZWVtcyB0byBiZSBiZXR0ZXIgYXQgY29hbGVzY2luZyBuZWVkbGVzcyBldmVudHMsIGJ1dCB0aGF0IG1pZ2h0IGp1c3QgYmUgbXkgaW1hZ2luYXRpb24uCisKKyMjIERlYnVnZ2luZyBvdXRwdXQKKworSWYgdGhlIGdlbSBpcyByZS1jb21waWxlZCB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBGV0RFQlVHIHNldCwgdGhlbiBmc2V2ZW50XF93YXRjaCB3aWxsIGJlIGJ1aWx0IHdpdGggaXRzIHZhcmlvdXMgREVCVUcgc2VjdGlvbnMgZGVmaW5lZCwgYW5kIHRoZSBvdXRwdXQgdG8gU1RERVJSIGlzIHRydWx5IHZlcmJvc2UgKGFuZCBob3BlZnVsbHkgaGVscGZ1bCBpbiBkZWJ1Z2dpbmcgeW91ciBhcHBsaWNhdGlvbiBhbmQgbm90IGp1c3QgZnNldmVudFxfd2F0Y2ggaXRzZWxmKS4gSWYgZW5vdWdoIHBlb3BsZSBmaW5kIHRoaXMgdG8gYmUgZGlyZWN0bHkgdXNlZnVsIHdoZW4gZGV2ZWxvcGluZyBjb2RlIHRoYXQgbWFrZXMgdXNlIG9mIHJiLWZzZXZlbnQsIHRoZW4gaXQgd291bGRuJ3QgYmUgaGFyZCB0byBjbGVhbiB0aGlzIHVwIGFuZCBtYWtlIGl0IGEgZmVhdHVyZSBlbmFibGVkIGJ5IGEgY29tbWFuZGxpbmUgYXJndW1lbnQgaW5zdGVhZC4gVW50aWwgc29tZWJvZHkgZmlsZXMgYW4gaXNzdWUsIGhvd2V2ZXIsIEkgd2lsbCBhc3N1bWUgb3RoZXJ3aXNlLgorCisgICAgYXBwZW5kX3BhdGggY2FsbGVkIGZvcjogL3RtcC9tb28vY293LworICAgICAgcmVzb2x2ZWQgcGF0aCB0bzogL3ByaXZhdGUvdG1wL21vby9jb3cKKworICAgIGNvbmZpZy5zaW5jZVdoZW4gICAgMTg0NDY3NDQwNzM3MDk1NTE2MTUKKyAgICBjb25maWcubGF0ZW5jeSAgICAgIDAuMzAwMDAwCisgICAgY29uZmlnLmZsYWdzICAgICAgICAwMDAwMDAwMAorICAgIGNvbmZpZy5wYXRocworICAgICAgL3ByaXZhdGUvdG1wL21vby9jb3cKKworICAgIEZTRXZlbnRTdHJlYW1SZWYgQCAweDEwMDEwODU0MDoKKyAgICAgICBhbGxvY2F0b3IgPSAweDdmZmY3MDVhNGVlMAorICAgICAgIGNhbGxiYWNrID0gMHgxMDAwMDE1MWUKKyAgICAgICBjb250ZXh0ID0gezAsIDB4MCwgMHgwLCAweDAsIDB4MH0KKyAgICAgICBudW1QYXRoc1RvV2F0Y2ggPSAxCisgICAgICAgcGF0aHNUb1dhdGNoID0gMHg3ZmZmNzA1YTRlZTAKKyAgICAgICAgICAgIHBhdGhzVG9XYXRjaFswXSA9ICcvcHJpdmF0ZS90bXAvbW9vL2NvdycKKyAgICAgICBsYXRlc3RFdmVudElkID0gLTEKKyAgICAgICBsYXRlbmN5ID0gMzAwMDAwIChtaWNyb3NlY29uZHMpCisgICAgICAgZmxhZ3MgPSAweDAwMDAwMDAwCisgICAgICAgcnVuTG9vcCA9IDB4MAorICAgICAgIHJ1bkxvb3BNb2RlID0gMHgwCisKKyAgICBGU0V2ZW50U3RyZWFtQ2FsbGJhY2sgZmlyZWQhCisgICAgICBudW1FdmVudHM6IDMyCisgICAgICBldmVudCBwYXRoOiAvcHJpdmF0ZS90bXAvbW9vL2Nvdy8xL2EvCisgICAgICBldmVudCBmbGFnczogMDAwMDAwMDAKKyAgICAgIGV2ZW50IElEOiAxMDIzNzY3CisgICAgICBldmVudCBwYXRoOiAvcHJpdmF0ZS90bXAvbW9vL2Nvdy8xL2IvCisgICAgICBldmVudCBmbGFnczogMDAwMDAwMDAKKyAgICAgIGV2ZW50IElEOiAxMDIzNzgyCisgICAgICBldmVudCBwYXRoOiAvcHJpdmF0ZS90bXAvbW9vL2Nvdy8xL2MvCisgICAgICBldmVudCBmbGFnczogMDAwMDAwMDAKKyAgICAgIGV2ZW50IElEOiAxMDIzNzk3CisgICAgICBldmVudCBwYXRoOiAvcHJpdmF0ZS90bXAvbW9vL2Nvdy8xL2QvCisgICAgICBldmVudCBmbGFnczogMDAwMDAwMDAKKyAgICAgIGV2ZW50IElEOiAxMDIzODEyCisgICAgICBbZXRjXQorCisKKyMjIERldmVsb3BtZW50CisKKyogU291cmNlIGhvc3RlZCBhdCBbR2l0SHViXShodHRwOi8vZ2l0aHViLmNvbS90aGliYXVkZ2cvcmItZnNldmVudCkKKyogUmVwb3J0IGlzc3Vlcy9RdWVzdGlvbnMvRmVhdHVyZSByZXF1ZXN0cyBvbiBbR2l0SHViIElzc3Vlc10oaHR0cDovL2dpdGh1Yi5jb20vdGhpYmF1ZGdnL3JiLWZzZXZlbnQvaXNzdWVzKQorCitQdWxsIHJlcXVlc3RzIGFyZSBxdWl0ZSB3ZWxjb21lISBQbGVhc2UgZW5zdXJlIHRoYXQgeW91ciBjb21taXRzIGFyZSBpbiBhIHRvcGljIGJyYW5jaCBmb3IgZWFjaCBpbmRpdmlkdWFsIGNoYW5nZXNldCB0aGF0IGNhbiBiZSByZWFzb25hYmx5IGlzb2xhdGVkLiBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBlbnN1cmUgdGhhdCB5b3VyIGNoYW5nZXMgYXJlIHdlbGwgdGVzdGVkLi4uIHdoZXRoZXIgdGhhdCBtZWFucyBuZXcgdGVzdHMsIG1vZGlmaWVkIHRlc3RzLCBvciBmaXhpbmcgYSBzY2VuYXJpbyB3aGVyZSB0aGUgZXhpc3RpbmcgdGVzdHMgY3VycmVudGx5IGZhaWwuIElmIHlvdSBoYXZlIHJiZW52IGFuZCBydWJ5LWJ1aWxkLCB3ZSBoYXZlIGEgaGVscGVyIHRhc2sgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzdWl0ZSBpbiBhbGwgb2YgdGhlbToKKworICAgIHJha2Ugc3BlYzpwb3J0YWJpbGl0eQorCitUaGUgbGlzdCBvZiB0ZXN0ZWQgdGFyZ2V0cyBpcyBjdXJyZW50bHk6CisKKyAgICAld1syLjQuMSByYngtMy43MiBqcnVieS0xLjcuMjYganJ1YnktOS4xLjguMF0KKworIyMgQXV0aG9ycworCisqIFtUcmF2aXMgVGlsbGV5XShodHRwOi8vZ2l0aHViLmNvbS90dGlsbGV5KQorKiBbVGhpYmF1ZCBHdWlsbGF1bWUtR2VudGlsXShodHRwOi8vZ2l0aHViLmNvbS90aGliYXVkZ2cpCisqIFtBbmRyZXkgVGFyYW50c292XShodHRwczovL2dpdGh1Yi5jb20vYW5kcmV5dml0KQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvUmFrZWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9SYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2EwOGExCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvUmFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorcmVxdWlyZSAnYnVuZGxlcicKK0J1bmRsZXI6OkdlbUhlbHBlci5pbnN0YWxsX3Rhc2tzCisKK3JlcXVpcmUgJ3JzcGVjL2NvcmUvcmFrZV90YXNrJworUlNwZWM6OkNvcmU6OlJha2VUYXNrLm5ldyg6c3BlYykKK3Rhc2sgOmRlZmF1bHQgPT4gOnNwZWMKKworbmFtZXNwYWNlKDpzcGVjKSBkbworICBkZXNjICJSdW4gYWxsIHNwZWNzIG9uIG11bHRpcGxlIHJ1YnkgdmVyc2lvbnMiCisgIHRhc2soOnBvcnRhYmlsaXR5KSBkbworICAgIHZlcnNpb25zID0gJXdbMi40LjEgcmJ4LTMuNzIganJ1YnktMS43LjI2IGpydWJ5LTkuMS44LjBdCisgICAgdmVyc2lvbnMuZWFjaCBkbyB8dmVyc2lvbnwKKyAgICAgICMgc3lzdGVtIDw8LUJBU0gKKyAgICAgICMgICBiYXNoIC1jICdzb3VyY2Ugfi8ucnZtL3NjcmlwdHMvcnZtOworICAgICAgIyAgICAgICAgICAgIHJ2bSAje3ZlcnNpb259OworICAgICAgIyAgICAgICAgICAgIGVjaG8gIi0tLS0tLS0tLSB2ZXJzaW9uICN7dmVyc2lvbn0gLS0tLS0tLS0tLVxuIjsKKyAgICAgICMgICAgICAgICAgICBidW5kbGUgaW5zdGFsbDsKKyAgICAgICMgICAgICAgICAgICByYWtlIHNwZWMnCisgICAgICAjIEJBU0gKKyAgICAgIHN5c3RlbSA8PC1CQVNICisgICAgICAgIGJhc2ggLWMgJ2V4cG9ydCBQQVRIPSIkSE9NRS8ucmJlbnYvYmluOiRQQVRIIjsKKyAgICAgICAgICAgICAgICAgW1sgYHdoaWNoIHJiZW52YCBdXSAmJiBldmFsICIkKHJiZW52IGluaXQgLSkiOworICAgICAgICAgICAgICAgICBbWyAhIC1hICRIT01FLy5yYmVudi92ZXJzaW9ucy8je3ZlcnNpb259IF1dICYmIHJiZW52IGluc3RhbGwgI3t2ZXJzaW9ufTsKKyAgICAgICAgICAgICAgICAgcmJlbnYgc2hlbGwgI3t2ZXJzaW9ufTsKKyAgICAgICAgICAgICAgICAgcmJlbnYgd2hpY2ggYnVuZGxlIDI+IC9kZXYvbnVsbCB8fCBnZW0gaW5zdGFsbCBidW5kbGVyOworICAgICAgICAgICAgICAgICBybSBHZW1maWxlLmxvY2s7CisgICAgICAgICAgICAgICAgIGJ1bmRsZSBpbnN0YWxsOworICAgICAgICAgICAgICAgICByYWtlIHNwZWM7JworICAgICAgQkFTSAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvYmluL2ZzZXZlbnRfd2F0Y2ggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9iaW4vZnNldmVudF93YXRjaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ODkyMDRmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvYmluL2ZzZXZlbnRfd2F0Y2gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L0xJQ0VOU0UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzVlMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L0xJQ0VOU0UKQEAgLTAsMCArMSwyMSBAQAorQ29weXJpZ2h0IChjKSAyMDExLTIwMTMgVHJhdmlzIFRpbGxleQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2V4dC9mc2V2ZW50X3dhdGNoL0ZTRXZlbnRzRml4LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9GU0V2ZW50c0ZpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZTNkMzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9GU0V2ZW50c0ZpeC5jCkBAIC0wLDAgKzEsNjI2IEBACisvKgorICogRlNFdmVudHNGaXgKKyAqCisgKiBSZXNvbHZlcyBhIGxvbmctc3RhbmRpbmcgYnVnIGluIHJlYWxwYXRoKCkgdGhhdCBwcmV2ZW50cyBGU0V2ZW50cyBBUEkgZnJvbQorICogbW9uaXRvcmluZyBjZXJ0YWluIGZvbGRlcnMgb24gYSB3aWRlIHJhbmdlIG9mIE9TIFggcmVsZWFzZWQgKDEwLjYtMTAuMTAgYXQgbGVhc3QpLgorICoKKyAqIFRoZSB1bmRlcmx5aW5nIGlzc3VlIGlzIHRoYXQgZm9yIHNvbWUgZm9sZGVycywgcmVhbHBhdGgoKSBjYWxsIHN0YXJ0cyByZXR1cm5pbmcKKyAqIGEgcGF0aCB3aXRoIGluY29ycmVjdCBjYXNpbmcgKGUuZy4gIi91c2Vycy9zbXQiIGluc3RlYWQgb2YgIi9Vc2Vycy9zbXQiKS4KKyAqIEZTRXZlbnRzIGlzIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYWxscyByZWFscGF0aCgpIG9uIHRoZSBwYXRocyB5b3UgcGFzcyBpbiwgc28KKyAqIGFuIGluY29ycmVjdCB2YWx1ZSByZXR1cm5lZCBieSByZWFscGF0aCgpIHByZXZlbnRzIEZTRXZlbnRzIGZyb20gc2VlaW5nIGFueQorICogY2hhbmdlIGV2ZW50cy4KKyAqCisgKiBTZWUgdGhlIGRpc2N1c3Npb24gYXQgaHR0cHM6Ly9naXRodWIuY29tL3RoaWJhdWRnZy9yYi1mc2V2ZW50L2lzc3Vlcy8xMCBhYm91dAorICogdGhlIGhpc3Rvcnkgb2YgdGhpcyBidWcgYW5kIGhvdyB0aGlzIGxpYnJhcnkgY2FtZSB0byBleGlzdC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgdXNlcyBGYWNlYm9vaydzIGZpc2hob29rIHRvIHJlcGxhY2UgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YKKyAqIHJlYWxwYXRoIGluIHBsYWNlIG9mIHRoZSBzeXN0ZW0gcmVhbHBhdGg7IEZTRXZlbnRzIHdpbGwgdGhlbiBpbnZva2Ugb3VyIGN1c3RvbQorICogaW1wbGVtZW50YXRpb24gKHdoaWNoIGRvZXMgbm90IHNjcmV3IHVwIHRoZSBuYW1lcykgYW5kIHdpbGwgdGh1cyB3b3JrIGNvcnJlY3RseS4KKyAqCisgKiBPdXIgaW1wbGVtZW50YXRpb24gb2YgcmVhbHBhdGggaXMgYmFzZWQgb24gdGhlIG9wZW4tc291cmNlIGltcGxlbWVudGF0aW9uIGZyb20KKyAqIE9TIFggMTAuMTAsIHdpdGggYSBzaW5nbGUgY2hhbmdlIGFwcGxpZWQgKGVuY2xvc2VkIGluICJCRUdJTiBXT1JLQVJPVU5EIEZPUgorICogT1MgWCBCVUciIC4uLiAiRU5EIFdPUktBUk9VTkQgRk9SIE9TIFggQlVHIikuCisgKgorICogSW5jbHVkZSBGU0V2ZW50c0ZpeC57aCxjfSBpbnRvIHlvdXIgcHJvamVjdCBhbmQgY2FsbCBGU0V2ZW50c0ZpeEluc3RhbGwoKS4KKyAqCisgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBpbnN0YWxsIEZTRXZlbnRzRml4IG9uIGRlbWFuZCwgdXNpbmcgRlNFdmVudHNGaXhJc0Jyb2tlbgorICogdG8gY2hlY2sgaWYgdGhlIGZvbGRlciB5b3UncmUgYWJvdXQgdG8gcGFzcyB0byBGU0V2ZW50U3RyZWFtQ3JlYXRlIG5lZWRzIHRoZSBmaXguCisgKiBOb3RlIHRoYXQgdGhlIGZpeCBtdXN0IGJlIGFwcGxpZWQgYmVmb3JlIGNhbGxpbmcgRlNFdmVudFN0cmVhbUNyZWF0ZS4KKyAqCisgKiBGU0V2ZW50c0ZpeElzQnJva2VuIHJlcXVpcmVzIGEgcGF0aCB0aGF0IHVzZXMgdGhlIGNvcnJlY3QgY2FzZSBmb3IgYWxsIGZvbGRlciBuYW1lcywKKyAqIGkuZS4gYSBwYXRoIHByb3ZpZGVkIGJ5IHRoZSBzeXN0ZW0gQVBJcyBvciBjb25zdHJ1Y3RlZCBmcm9tIGZvbGRlciBuYW1lcyBwcm92aWRlZAorICogYnkgdGhlIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBBUElzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBBbmRyZXkgVGFyYW50c292IDxhbmRyZXlAdGFyYW50c292LmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwMyBDb25zdGFudGluIFMuIFN2aW50c29mZiA8a29zdGlrQGljbHViLm5zdS5ydT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKgorICogQmFzZWQgb24gYSByZWFscGF0aCBpbXBsZW1lbnRhdGlvbiBmcm9tIEFwcGxlIGxpYmMgNDk4LjEuNywgdGFrZW4gZnJvbQorICogaHR0cDovL3d3dy5vcGVuc291cmNlLmFwcGxlLmNvbS9zb3VyY2UvTGliYy9MaWJjLTQ5OC4xLjcvc3RkbGliL0ZyZWVCU0QvcmVhbHBhdGguYworICogYW5kIHByb3ZpZGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQ29uc3RhbnRpbiBTLiBTdmludHNvZmYgPGtvc3Rpa0BpY2x1Yi5uc3UucnU+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUgIkZTRXZlbnRzRml4LmgiCisKKyNpbmNsdWRlIDxkaXNwYXRjaC9kaXNwYXRjaC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKworCitjb25zdCBjaGFyICpjb25zdCBGU0V2ZW50c0ZpeFZlcnNpb25TdHJpbmcgPSAiMC4xMS4wIjsKKworCisjcHJhZ21hIG1hcmsgLSBGb3J3YXJkIGRlY2xhcmF0aW9ucworCitzdGF0aWMgY2hhciAqKCpvcmlnX3JlYWxwYXRoKShjb25zdCBjaGFyICpyZXN0cmljdCBmaWxlX25hbWUsIGNoYXIgcmVzb2x2ZWRfbmFtZVtQQVRIX01BWF0pOworc3RhdGljIGNoYXIgKkNGVVJMX3JlYWxwYXRoKGNvbnN0IGNoYXIgKnJlc3RyaWN0IGZpbGVfbmFtZSwgY2hhciByZXNvbHZlZF9uYW1lW1BBVEhfTUFYXSk7CitzdGF0aWMgY2hhciAqRlNFdmVudHNGaXhfcmVhbHBhdGhfd3JhcHBlcihjb25zdCBjaGFyICpyZXN0cmljdCBzcmMsIGNoYXIgKnJlc3RyaWN0IGRzdCk7CisKK3N0YXRpYyB2b2lkIF9GU0V2ZW50c0ZpeEhvb2tJbnN0YWxsKCk7CitzdGF0aWMgdm9pZCBfRlNFdmVudHNGaXhIb29rVW5pbnN0YWxsKCk7CisKKworI3ByYWdtYSBtYXJrIC0gSW50ZXJuYWwgc3RhdGUKKworc3RhdGljIGRpc3BhdGNoX3F1ZXVlX3QgZ19xdWV1ZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQ2NF90IGdfZW5hYmxlX3JlZmNvdW50ID0gMDsKKworc3RhdGljIGJvb2wgZ19pbl9zZWxmX3Rlc3QgPSBmYWxzZTsKK3N0YXRpYyBib29sIGdfaG9va19vcGVyYXRpb25hbCA9IGZhbHNlOworCitzdGF0aWMgdm9pZCheZ19sb2dnaW5nX2Jsb2NrKShGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlIHR5cGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworc3RhdGljIEZTRXZlbnRzRml4RGVidWdPcHRpb25zIGdfZGVidWdfb3B0ID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgKm5hbWU7CisgICAgdm9pZCAqcmVwbGFjZW1lbnQ7CisgICAgdm9pZCAqb3JpZ2luYWw7CisgICAgdWludCBob29rZWRfc3ltYm9sczsKK30gcmViaW5kaW5nX3Q7CisKK3N0YXRpYyByZWJpbmRpbmdfdCBnX3JlYmluZGluZ3NbXSA9IHsKKyAgICB7ICJfcmVhbHBhdGgkREFSV0lOX0VYVFNOIiwgKHZvaWQgKikgJkZTRXZlbnRzRml4X3JlYWxwYXRoX3dyYXBwZXIsICh2b2lkICopICZyZWFscGF0aCwgMCB9Cit9Oworc3RhdGljIGNvbnN0IHVpbnQgZ19yZWJpbmRpbmdzX25lbCA9IHNpemVvZihnX3JlYmluZGluZ3MpIC8gc2l6ZW9mKGdfcmViaW5kaW5nc1swXSk7CisKKworI3ByYWdtYSBtYXJrIC0gTG9nZ2luZworCitzdGF0aWMgdm9pZCBfRlNFdmVudHNGaXhMb2coRlNFdmVudHNGaXhNZXNzYWdlVHlwZSB0eXBlLCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0IGZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworCitzdGF0aWMgdm9pZCBfRlNFdmVudHNGaXhMb2coRlNFdmVudHNGaXhNZXNzYWdlVHlwZSB0eXBlLCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0IGZtdCwgLi4uKSB7CisgICAgaWYgKGdfbG9nZ2luZ19ibG9jaykgeworICAgICAgICBjaGFyICptZXNzYWdlID0gTlVMTDsKKyAgICAgICAgdmFfbGlzdCB2YTsKKyAgICAgICAgdmFfc3RhcnQodmEsIGZtdCk7CisgICAgICAgIHZhc3ByaW50ZigmbWVzc2FnZSwgZm10LCB2YSk7CisgICAgICAgIHZhX2VuZCh2YSk7CisKKyAgICAgICAgaWYgKG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmICghIShnX2RlYnVnX29wdCAmIEZTRXZlbnRzRml4RGVidWdPcHRpb25Mb2dUb1N0ZGVycikpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZTRXZlbnRzRml4OiAlc1xuIiwgbWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ19sb2dnaW5nX2Jsb2NrKSB7CisgICAgICAgICAgICAgICAgZ19sb2dnaW5nX2Jsb2NrKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjcHJhZ21hIG1hcmsgLSBBUEkKKwordm9pZCBfRlNFdmVudHNGaXhJbml0aWFsaXplKCkgeworICAgIHN0YXRpYyBkaXNwYXRjaF9vbmNlX3Qgb25jZVRva2VuOworICAgIGRpc3BhdGNoX29uY2UoJm9uY2VUb2tlbiwgXnsKKyAgICAgICAgZ19xdWV1ZSA9IGRpc3BhdGNoX3F1ZXVlX2NyZWF0ZSgiRlNFdmVudHNGaXgiLCBESVNQQVRDSF9RVUVVRV9TRVJJQUwpOworICAgIH0pOworfQorCit2b2lkIEZTRXZlbnRzRml4Q29uZmlndXJlKEZTRXZlbnRzRml4RGVidWdPcHRpb25zIGRlYnVnT3B0aW9ucywgdm9pZChebG9nZ2luZ0Jsb2NrKShGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlIHNldmVyaXR5LCBjb25zdCBjaGFyICptZXNzYWdlKSkgeworICAgIF9GU0V2ZW50c0ZpeEluaXRpYWxpemUoKTsKKyAgICBsb2dnaW5nQmxvY2sgPSBCbG9ja19jb3B5KGxvZ2dpbmdCbG9jayk7CisgICAgZGlzcGF0Y2hfc3luYyhnX3F1ZXVlLCBeeworICAgICAgICBnX2RlYnVnX29wdCA9IGRlYnVnT3B0aW9uczsKKyAgICAgICAgZ19sb2dnaW5nX2Jsb2NrID0gbG9nZ2luZ0Jsb2NrOworICAgIH0pOworfQorCisvLyBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBwcml2YXRlIHNlcmlhbCBxdWV1ZS4KK3ZvaWQgX0ZTRXZlbnRzRml4U2VsZlRlc3QoKSB7CisgICAgZ19pbl9zZWxmX3Rlc3QgPSB0cnVlOworICAgIGdfaG9va19vcGVyYXRpb25hbCA9IGZhbHNlOworICAgIHN0YXRpYyBjaGFyIHJlc3VsdFsxMDI0XTsKKyAgICByZWFscGF0aCgiL0V0Yy9fXyFGU0V2ZW50c0ZpeFNlbGZUZXN0IV9fIiwgcmVzdWx0KTsKKyAgICBnX2luX3NlbGZfdGVzdCA9IGZhbHNlOworfQorCit2b2lkIEZTRXZlbnRzRml4RW5hYmxlKCkgeworICAgIF9GU0V2ZW50c0ZpeEluaXRpYWxpemUoKTsKKyAgICBkaXNwYXRjaF9zeW5jKGdfcXVldWUsIF57CisgICAgICAgIGlmICgrK2dfZW5hYmxlX3JlZmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIG9yaWdfcmVhbHBhdGggPSBkbHN5bShSVExEX0RFRkFVTFQsICJyZWFscGF0aCIpOworICAgICAgICAgICAgX0ZTRXZlbnRzRml4SG9va0luc3RhbGwoKTsKKyAgICAgICAgICAgIF9GU0V2ZW50c0ZpeFNlbGZUZXN0KCk7CisgICAgICAgICAgICBpZiAoZ19ob29rX29wZXJhdGlvbmFsKSB7CisgICAgICAgICAgICAgICAgX0ZTRXZlbnRzRml4TG9nKEZTRXZlbnRzRml4TWVzc2FnZVR5cGVTdGF0dXNDaGFuZ2UsICJFbmFibGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9GU0V2ZW50c0ZpeExvZyhGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlRmF0YWxFcnJvciwgIkZhaWxlZCB0byBlbmFibGUgKGhvb2sgbm90IGNhbGxlZCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0pOworfQorCit2b2lkIEZTRXZlbnRzRml4RGlzYWJsZSgpIHsKKyAgICBfRlNFdmVudHNGaXhJbml0aWFsaXplKCk7CisgICAgZGlzcGF0Y2hfc3luYyhnX3F1ZXVlLCBeeworICAgICAgICBpZiAoZ19lbmFibGVfcmVmY291bnQgPT0gMCkgeworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoLS1nX2VuYWJsZV9yZWZjb3VudCA9PSAwKSB7CisgICAgICAgICAgICBfRlNFdmVudHNGaXhIb29rVW5pbnN0YWxsKCk7CisgICAgICAgICAgICBfRlNFdmVudHNGaXhTZWxmVGVzdCgpOworICAgICAgICAgICAgaWYgKCFnX2hvb2tfb3BlcmF0aW9uYWwpIHsKKyAgICAgICAgICAgICAgICBfRlNFdmVudHNGaXhMb2coRlNFdmVudHNGaXhNZXNzYWdlVHlwZVN0YXR1c0NoYW5nZSwgIkRpc2FibGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9GU0V2ZW50c0ZpeExvZyhGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlRmF0YWxFcnJvciwgIkZhaWxlZCB0byBkaXNhYmxlIChob29rIHN0aWxsIGNhbGxlZCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0pOworfQorCitib29sIEZTRXZlbnRzRml4SXNPcGVyYXRpb25hbCgpIHsKKyAgICBfRlNFdmVudHNGaXhJbml0aWFsaXplKCk7CisgICAgX19ibG9jayBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIGRpc3BhdGNoX3N5bmMoZ19xdWV1ZSwgXnsKKyAgICAgICAgcmVzdWx0ID0gZ19ob29rX29wZXJhdGlvbmFsOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgX0ZTRXZlbnRzRml4SXNCcm9rZW5fbm9yZXNvbHZlKGNvbnN0IGNoYXIgKnJlc29sdmVkKSB7CisgICAgaWYgKCEhKGdfZGVidWdfb3B0ICYgRlNFdmVudHNGaXhEZWJ1Z09wdGlvblNpbXVsYXRlQnJva2VuKSkgeworICAgICAgICBpZiAoc3Ryc3RyKHJlc29sdmVkLCBGU0V2ZW50c0ZpeFNpbXVsYXRlZEJyb2tlbkZvbGRlck1hcmtlcikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgY2hhciAqcmVyZXNvbHZlZCA9IHJlYWxwYXRoKHJlc29sdmVkLCBOVUxMKTsKKyAgICBpZiAocmVyZXNvbHZlZCkgeworICAgICAgICBib29sIGJyb2tlbiA9ICgwICE9IHN0cmNtcChyZXNvbHZlZCwgcmVyZXNvbHZlZCkpOworICAgICAgICBmcmVlKHJlcmVzb2x2ZWQpOworICAgICAgICByZXR1cm4gYnJva2VuOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworYm9vbCBGU0V2ZW50c0ZpeElzQnJva2VuKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBjaGFyICpyZXNvbHZlZCA9IENGVVJMX3JlYWxwYXRoKHBhdGgsIE5VTEwpOworICAgIGlmICghcmVzb2x2ZWQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgYnJva2VuID0gX0ZTRXZlbnRzRml4SXNCcm9rZW5fbm9yZXNvbHZlKHJlc29sdmVkKTsKKyAgICBmcmVlKHJlc29sdmVkKTsKKyAgICByZXR1cm4gYnJva2VuOworfQorCitjaGFyICpGU0V2ZW50c0ZpeENvcHlSb290QnJva2VuRm9sZGVyUGF0aChjb25zdCBjaGFyICppbnBhdGgpIHsKKyAgICBpZiAoIUZTRXZlbnRzRml4SXNCcm9rZW4oaW5wYXRoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBnZXQgYSBtdXRhYmxlIGNvcHkgb2YgYW4gYWJzb2x1dGUgcGF0aAorICAgIGNoYXIgKnBhdGggPSBDRlVSTF9yZWFscGF0aChpbnBhdGgsIE5VTEwpOworICAgIGlmICghcGF0aCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIgKnNlcCA9IHN0cnJjaHIocGF0aCwgJy8nKTsKKyAgICAgICAgaWYgKChzZXAgPT0gTlVMTCkgfHwgKHNlcCA9PSBwYXRoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKnNlcCA9IDA7CisgICAgICAgIGlmICghX0ZTRXZlbnRzRml4SXNCcm9rZW5fbm9yZXNvbHZlKHBhdGgpKSB7CisgICAgICAgICAgICAqc2VwID0gJy8nOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcGF0aDsKK30KKworc3RhdGljIHZvaWQgX0ZTRXZlbnRzRml4QXR0ZW1wdFJlcGFpcihjb25zdCBjaGFyICpmb2xkZXIpIHsKKyAgICBpbnQgcnYgPSByZW5hbWUoZm9sZGVyLCBmb2xkZXIpOworCisgICAgaWYgKCEhKGdfZGVidWdfb3B0ICYgRlNFdmVudHNGaXhEZWJ1Z09wdGlvblNpbXVsYXRlUmVwYWlyKSkgeworICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBzdHJzdHIoZm9sZGVyLCBGU0V2ZW50c0ZpeFNpbXVsYXRlZEJyb2tlbkZvbGRlck1hcmtlcik7CisgICAgICAgIGlmIChwb3MpIHsKKyAgICAgICAgICAgIGNoYXIgKmZpeGVkID0gc3RyZHVwKGZvbGRlcik7CisgICAgICAgICAgICBmaXhlZFtwb3MgLSBmb2xkZXJdID0gMDsKKyAgICAgICAgICAgIHN0cmNhdChmaXhlZCwgcG9zICsgc3RybGVuKEZTRXZlbnRzRml4U2ltdWxhdGVkQnJva2VuRm9sZGVyTWFya2VyKSk7CisKKyAgICAgICAgICAgIHJ2ID0gcmVuYW1lKGZvbGRlciwgZml4ZWQpOworICAgICAgICAgICAgZnJlZShmaXhlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocnYgIT0gMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRVBFUk0pIHsKKyAgICAgICAgICAgIF9GU0V2ZW50c0ZpeExvZyhGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlUmVzdWx0LCAiUGVybWlzc2lvbiBlcnJvciB3aGVuIHRyeWluZyB0byByZXBhaXIgJyVzJyIsIGZvbGRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfRlNFdmVudHNGaXhMb2coRlNFdmVudHNGaXhNZXNzYWdlVHlwZUV4cGVjdGVkRmFpbHVyZSwgIlVua25vd24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gcmVwYWlyICclcyc6IGVycm5vID0gJWQiLCBmb2xkZXIsIGVycm5vKTsKKyAgICAgICAgfQorICAgIH0KK30KKworRlNFdmVudHNGaXhSZXBhaXJTdGF0dXMgRlNFdmVudHNGaXhSZXBhaXJJZk5lZWRlZChjb25zdCBjaGFyICppbnBhdGgpIHsKKyAgICBjaGFyICpyb290ID0gRlNFdmVudHNGaXhDb3B5Um9vdEJyb2tlbkZvbGRlclBhdGgoaW5wYXRoKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBGU0V2ZW50c0ZpeFJlcGFpclN0YXR1c05vdEJyb2tlbjsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIF9GU0V2ZW50c0ZpeEF0dGVtcHRSZXBhaXIocm9vdCk7CisgICAgICAgIGNoYXIgKm5ld1Jvb3QgPSBGU0V2ZW50c0ZpeENvcHlSb290QnJva2VuRm9sZGVyUGF0aChpbnBhdGgpOworICAgICAgICBpZiAobmV3Um9vdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBfRlNFdmVudHNGaXhMb2coRlNFdmVudHNGaXhNZXNzYWdlVHlwZVJlc3VsdCwgIlJlcGFpcmVkICclcycgaW4gJyVzJyIsIHJvb3QsIGlucGF0aCk7CisgICAgICAgICAgICBmcmVlKHJvb3QpOworICAgICAgICAgICAgcmV0dXJuIEZTRXZlbnRzRml4UmVwYWlyU3RhdHVzUmVwYWlyZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc3RyY21wKHJvb3QsIG5ld1Jvb3QpKSB7CisgICAgICAgICAgICBfRlNFdmVudHNGaXhMb2coRlNFdmVudHNGaXhNZXNzYWdlVHlwZVJlc3VsdCwgIkZhaWxlZCB0byByZXBhaXIgJyVzJyBpbiAnJXMnIiwgcm9vdCwgaW5wYXRoKTsKKyAgICAgICAgICAgIGZyZWUocm9vdCk7CisgICAgICAgICAgICBmcmVlKG5ld1Jvb3QpOworICAgICAgICAgICAgcmV0dXJuIEZTRXZlbnRzRml4UmVwYWlyU3RhdHVzRmFpbGVkOworICAgICAgICB9CisgICAgICAgIF9GU0V2ZW50c0ZpeExvZyhGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlUmVzdWx0LCAiUGFydGlhbCBzdWNjZXNzLCByZXBhaXJlZCAnJXMnIGluICclcyciLCByb290LCBpbnBhdGgpOworICAgICAgICBmcmVlKHJvb3QpOworICAgICAgICByb290ID0gbmV3Um9vdDsKKyAgICB9Cit9CisKKworI3ByYWdtYSBtYXJrIC0gRlNFdmVudHNGaXggcmVhbHBhdGggd3JhcHBlcgorCitzdGF0aWMgY2hhciAqRlNFdmVudHNGaXhfcmVhbHBhdGhfd3JhcHBlcihjb25zdCBjaGFyICogX19yZXN0cmljdCBzcmMsIGNoYXIgKiBfX3Jlc3RyaWN0IGRzdCkgeworICAgIGlmIChnX2luX3NlbGZfdGVzdCkgeworICAgICAgICBpZiAoc3Ryc3RyKHNyYywgIl9fIUZTRXZlbnRzRml4U2VsZlRlc3QhX18iKSkgeworICAgICAgICAgICAgZ19ob29rX29wZXJhdGlvbmFsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENGVVJMX3JlYWxwYXRoIGRvZXNuJ3Qgc3VwcG9ydCBwdXR0aW5nIHdoZXJlIHJlc29sdXRpb24gZmFpbGVkIGludG8gdGhlCisgICAgLy8gZHN0IGJ1ZmZlciwgc28gd2UgY2FsbCB0aGUgb3JpZ2luYWwgcmVhbHBhdGggaGVyZSBmaXJzdCBhbmQgaWYgaXQgZ2V0cyBhCisgICAgLy8gcmVzdWx0LCByZXBsYWNlIHRoYXQgd2l0aCB0aGUgb3V0cHV0IG9mIENGVVJMX3JlYWxwYXRoLiB0aGF0IHdheSBhbGwgdGhlCisgICAgLy8gZmVhdHVyZXMgb2YgdGhlIG9yaWdpbmFsIHJlYWxwYXRoIGFyZSBhdmFpbGFibGUuCisgICAgY2hhciAqcnYgPSBOVUxMOworICAgIGNoYXIgKm9ydiA9IG9yaWdfcmVhbHBhdGgoc3JjLCBkc3QpOworICAgIGlmIChvcnYgIT0gTlVMTCkgeyBydiA9IENGVVJMX3JlYWxwYXRoKHNyYywgZHN0KTsgfQorCisgICAgaWYgKCEhKGdfZGVidWdfb3B0ICYgRlNFdmVudHNGaXhEZWJ1Z09wdGlvbkxvZ0NhbGxzKSkgeworICAgICAgICBjaGFyICpyZXN1bHQgPSBydiA/OiBkc3Q7CisgICAgICAgIF9GU0V2ZW50c0ZpeExvZyhGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlQ2FsbCwgInJlYWxwYXRoKCVzKSA9PiAlc1xuIiwgc3JjLCByZXN1bHQpOworICAgIH0KKworICAgIGlmICghIShnX2RlYnVnX29wdCAmIEZTRXZlbnRzRml4RGVidWdPcHRpb25VcHBlcmNhc2VSZXR1cm4pKSB7CisgICAgICAgIGNoYXIgKnJlc3VsdCA9IHJ2ID86IGRzdDsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgZm9yIChjaGFyICpwY2ggPSByZXN1bHQ7ICpwY2g7ICsrcGNoKSB7CisgICAgICAgICAgICAgICAgKnBjaCA9IChjaGFyKXRvdXBwZXIoKnBjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcnY7Cit9CisKKworI3ByYWdtYSBtYXJrIC0gcmVhbHBhdGgKKworLy8gbmFpdmUgaW1wbGVtZW50YXRpb24gb2YgcmVhbHBhdGggb24gdG9wIG9mIENGVVJMCisvLyBOT1RFOiBkb2Vzbid0IHF1aXRlIHN1cHBvcnQgdGhlIGZ1bGwgcmFuZ2Ugb2YgZXJybm8gcmVzdWx0cyBvbmUgd291bGQKKy8vIGV4cGVjdCBoZXJlLCBpbiBwYXJ0IGJlY2F1c2Ugc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMganVzdCByZXR1cm4gYSBib29sZWFuLAorLy8gYW5kIGluIHBhcnQgYmVjYXVzZSBpJ20gbm90IGRlYWxpbmcgd2l0aCBtZXNzeSBDRkVycm9yUmVmIG9iamVjdHMgYW5kCisvLyBhdHRlbXB0aW5nIHRvIHRyYW5zbGF0ZSB0aG9zZSB0byBzYW5lIGVycm5vIHZhbHVlcy4KKy8vIE5PVEU6IHRoZSBPU1ggcmVhbHBhdGggd2lsbCByZXR1cm4gX3doZXJlXyByZXNvbHV0aW9uIGZhaWxlZCBpbiByZXNvbHZlZF9uYW1lCisvLyBpZiBwYXNzZWQgaW4gYW5kIHJldHVybiBOVUxMLiB3ZSBjYW4ndCBwcm9wZXJseSBzdXBwb3J0IHRoYXQgZXh0ZW5zaW9uIGhlcmUKKy8vIHNpbmNlIHRoZSByZXNvbHV0aW9uIGhhcHBlbnMgZW50aXJlbHkgYmVoaW5kIHRoZSBzY2VuZXMgdG8gdXMgaW4gQ0ZVUkwuCitzdGF0aWMgY2hhciogQ0ZVUkxfcmVhbHBhdGgoY29uc3QgY2hhciAqZmlsZV9uYW1lLCBjaGFyIHJlc29sdmVkX25hbWVbUEFUSF9NQVhdKQoreworICAgIGNoYXIqIHJlc29sdmVkOworICAgIENGVVJMUmVmIHVybDE7CisgICAgQ0ZVUkxSZWYgdXJsMjsKKyAgICBDRlN0cmluZ1JlZiBwYXRoOworCisgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KKworI2lmIF9fREFSV0lOX1VOSVgwMworICAgIGlmICgqZmlsZV9uYW1lID09IDApIHsKKyAgICAgICAgZXJybm8gPSBFTk9FTlQ7CisgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBjcmVhdGUgYSBidWZmZXIgdG8gc3RvcmUgb3VyIHJlc3VsdCBpZiB3ZSB3ZXJlbid0IHBhc3NlZCBvbmUKKyAgICBpZiAoIXJlc29sdmVkX25hbWUpIHsKKyAgICAgICAgaWYgKChyZXNvbHZlZCA9IG1hbGxvYyhQQVRIX01BWCkpID09IE5VTEwpIHJldHVybiAoTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzb2x2ZWQgPSByZXNvbHZlZF9uYW1lOworICAgIH0KKworICAgIHVybDEgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oTlVMTCwgKGNvbnN0IFVJbnQ4KilmaWxlX25hbWUsIChDRkluZGV4KXN0cmxlbihmaWxlX25hbWUpLCBmYWxzZSk7CisgICAgaWYgKHVybDEgPT0gTlVMTCkgeyBnb3RvIGVycm9yX3JldHVybjsgfQorCisgICAgdXJsMiA9IENGVVJMQ29weUFic29sdXRlVVJMKHVybDEpOworICAgIENGUmVsZWFzZSh1cmwxKTsKKyAgICBpZiAodXJsMiA9PSBOVUxMKSB7IGdvdG8gZXJyb3JfcmV0dXJuOyB9CisKKyAgICB1cmwxID0gQ0ZVUkxDcmVhdGVGaWxlUmVmZXJlbmNlVVJMKE5VTEwsIHVybDIsIE5VTEwpOworICAgIENGUmVsZWFzZSh1cmwyKTsKKyAgICBpZiAodXJsMSA9PSBOVUxMKSB7IGdvdG8gZXJyb3JfcmV0dXJuOyB9CisKKyAgICAvLyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgaGFyZCBsaW5rcyB0byB0aGUgb3JpZ2luYWwgcGF0aCwgdGhpcyBtYXkgZW5kIHVwCisgICAgLy8gYmVpbmcgX2NvbXBsZXRlbHlfIGRpZmZlcmVudCBmcm9tIHdoYXQgd2FzIGludGVuZGVkCisgICAgdXJsMiA9IENGVVJMQ3JlYXRlRmlsZVBhdGhVUkwoTlVMTCwgdXJsMSwgTlVMTCk7CisgICAgQ0ZSZWxlYXNlKHVybDEpOworICAgIGlmICh1cmwyID09IE5VTEwpIHsgZ290byBlcnJvcl9yZXR1cm47IH0KKworICAgIHBhdGggPSBDRlVSTENvcHlGaWxlU3lzdGVtUGF0aCh1cmwyLCBrQ0ZVUkxQT1NJWFBhdGhTdHlsZSk7CisgICAgQ0ZSZWxlYXNlKHVybDIpOworICAgIGlmIChwYXRoID09IE5VTEwpIHsgZ290byBlcnJvcl9yZXR1cm47IH0KKworICAgIGJvb2wgc3VjY2VzcyA9IENGU3RyaW5nR2V0Q1N0cmluZyhwYXRoLCByZXNvbHZlZCwgUEFUSF9NQVgsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7CisgICAgQ0ZSZWxlYXNlKHBhdGgpOworICAgIGlmICghc3VjY2VzcykgeyBnb3RvIGVycm9yX3JldHVybjsgfQorCisgICAgcmV0dXJuIHJlc29sdmVkOworCitlcnJvcl9yZXR1cm46CisgICAgaWYgKCFyZXNvbHZlZF9uYW1lKSB7CisgICAgICAgIC8vIHdlIHdlcmVuJ3QgcGFzc2VkIGluIGFuIG91dHB1dCBidWZmZXIgYW5kIGNyZWF0ZWQgb3VyIG93bi4gZnJlZSBpdAorICAgICAgICBpbnQgZSA9IGVycm5vOworICAgICAgICBmcmVlKHJlc29sdmVkKTsKKyAgICAgICAgZXJybm8gPSBlOworICAgIH0KKyAgICByZXR1cm4gKE5VTEwpOworfQorCisKKyNwcmFnbWEgbWFyayAtIGZpc2hob29rCisKKy8vIENvcHlyaWdodCAoYykgMjAxMywgRmFjZWJvb2ssIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAgICogTmVpdGhlciB0aGUgbmFtZSBGYWNlYm9vayBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8KKy8vICAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworLy8gICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorLy8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLy8gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisvLyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisvLyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLy8gREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKy8vIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisvLyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorLy8gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPHN0ZGxpYi5oPgorI2ltcG9ydCA8c3RyaW5nLmg+CisjaW1wb3J0IDxzeXMvdHlwZXMuaD4KKyNpbXBvcnQgPG1hY2gtby9keWxkLmg+CisjaW1wb3J0IDxtYWNoLW8vbG9hZGVyLmg+CisjaW1wb3J0IDxtYWNoLW8vbmxpc3QuaD4KKworI2lmZGVmIF9fTFA2NF9fCit0eXBlZGVmIHN0cnVjdCBtYWNoX2hlYWRlcl82NCBtYWNoX2hlYWRlcl90OwordHlwZWRlZiBzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kXzY0IHNlZ21lbnRfY29tbWFuZF90OwordHlwZWRlZiBzdHJ1Y3Qgc2VjdGlvbl82NCBzZWN0aW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBubGlzdF82NCBubGlzdF90OworI2RlZmluZSBMQ19TRUdNRU5UX0FSQ0hfREVQRU5ERU5UIExDX1NFR01FTlRfNjQKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBtYWNoX2hlYWRlciBtYWNoX2hlYWRlcl90OwordHlwZWRlZiBzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kIHNlZ21lbnRfY29tbWFuZF90OwordHlwZWRlZiBzdHJ1Y3Qgc2VjdGlvbiBzZWN0aW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBubGlzdCBubGlzdF90OworI2RlZmluZSBMQ19TRUdNRU5UX0FSQ0hfREVQRU5ERU5UIExDX1NFR01FTlQKKyNlbmRpZgorCitzdGF0aWMgdm9sYXRpbGUgYm9vbCBnX2hvb2tfaW5zdGFsbGVkID0gZmFsc2U7CisKK3N0YXRpYyB2b2lkIF9GU0V2ZW50c0ZpeEhvb2tVcGRhdGVTZWN0aW9uKHNlY3Rpb25fdCAqc2VjdGlvbiwgaW50cHRyX3Qgc2xpZGUsIG5saXN0X3QgKnN5bXRhYiwgY2hhciAqc3RydGFiLCB1aW50MzJfdCAqaW5kaXJlY3Rfc3ltdGFiKQoreworICAgIHVpbnQzMl90ICppbmRpcmVjdF9zeW1ib2xfaW5kaWNlcyA9IGluZGlyZWN0X3N5bXRhYiArIHNlY3Rpb24tPnJlc2VydmVkMTsKKyAgICB2b2lkICoqaW5kaXJlY3Rfc3ltYm9sX2JpbmRpbmdzID0gKHZvaWQgKiopKCh1aW50cHRyX3Qpc2xpZGUgKyBzZWN0aW9uLT5hZGRyKTsKKyAgICBmb3IgKHVpbnQgaSA9IDA7IGkgPCBzZWN0aW9uLT5zaXplIC8gc2l6ZW9mKHZvaWQgKik7IGkrKykgeworICAgICAgICB1aW50MzJfdCBzeW10YWJfaW5kZXggPSBpbmRpcmVjdF9zeW1ib2xfaW5kaWNlc1tpXTsKKyAgICAgICAgaWYgKHN5bXRhYl9pbmRleCA9PSBJTkRJUkVDVF9TWU1CT0xfQUJTIHx8IHN5bXRhYl9pbmRleCA9PSBJTkRJUkVDVF9TWU1CT0xfTE9DQUwgfHwKKyAgICAgICAgICAgIHN5bXRhYl9pbmRleCA9PSAoSU5ESVJFQ1RfU1lNQk9MX0xPQ0FMICAgfCBJTkRJUkVDVF9TWU1CT0xfQUJTKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3Qgc3RydGFiX29mZnNldCA9IHN5bXRhYltzeW10YWJfaW5kZXhdLm5fdW4ubl9zdHJ4OworICAgICAgICBjaGFyICpzeW1ib2xfbmFtZSA9IHN0cnRhYiArIHN0cnRhYl9vZmZzZXQ7CisgICAgICAgIGZvciAocmViaW5kaW5nX3QgKmN1ciA9IGdfcmViaW5kaW5ncywgKmVuZCA9IGdfcmViaW5kaW5ncyArIGdfcmViaW5kaW5nc19uZWw7IGN1ciA8IGVuZDsgKytjdXIpICB7CisgICAgICAgICAgICBpZiAoc3RyY21wKHN5bWJvbF9uYW1lLCBjdXItPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZ19ob29rX2luc3RhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kaXJlY3Rfc3ltYm9sX2JpbmRpbmdzW2ldICE9IGN1ci0+cmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0X3N5bWJvbF9iaW5kaW5nc1tpXSA9IGN1ci0+cmVwbGFjZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2N1ci0+aG9va2VkX3N5bWJvbHM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ci0+b3JpZ2luYWwgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kaXJlY3Rfc3ltYm9sX2JpbmRpbmdzW2ldID09IGN1ci0+cmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0X3N5bWJvbF9iaW5kaW5nc1tpXSA9IGN1ci0+b3JpZ2luYWw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyLT5ob29rZWRfc3ltYm9scyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWN1ci0+aG9va2VkX3N5bWJvbHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBzeW1ib2xfbG9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHN5bWJvbF9sb29wOjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9GU0V2ZW50c0ZpeEhvb2tVcGRhdGVJbWFnZShjb25zdCBzdHJ1Y3QgbWFjaF9oZWFkZXIgKmhlYWRlciwgaW50cHRyX3Qgc2xpZGUpIHsKKyAgICBEbF9pbmZvIGluZm87CisgICAgaWYgKGRsYWRkcihoZWFkZXIsICZpbmZvKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZWdtZW50X2NvbW1hbmRfdCAqY3VyX3NlZ19jbWQ7CisgICAgc2VnbWVudF9jb21tYW5kX3QgKmxpbmtlZGl0X3NlZ21lbnQgPSBOVUxMOworICAgIHN0cnVjdCBzeW10YWJfY29tbWFuZCogc3ltdGFiX2NtZCA9IE5VTEw7CisgICAgc3RydWN0IGR5c3ltdGFiX2NvbW1hbmQqIGR5c3ltdGFiX2NtZCA9IE5VTEw7CisKKyAgICB1aW50cHRyX3QgY3VyID0gKHVpbnRwdHJfdCloZWFkZXIgKyBzaXplb2YobWFjaF9oZWFkZXJfdCk7CisgICAgZm9yICh1aW50IGkgPSAwOyBpIDwgaGVhZGVyLT5uY21kczsgaSsrLCBjdXIgKz0gY3VyX3NlZ19jbWQtPmNtZHNpemUpIHsKKyAgICAgICAgY3VyX3NlZ19jbWQgPSAoc2VnbWVudF9jb21tYW5kX3QgKiljdXI7CisgICAgICAgIGlmIChjdXJfc2VnX2NtZC0+Y21kID09IExDX1NFR01FTlRfQVJDSF9ERVBFTkRFTlQpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoY3VyX3NlZ19jbWQtPnNlZ25hbWUsIFNFR19MSU5LRURJVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxpbmtlZGl0X3NlZ21lbnQgPSBjdXJfc2VnX2NtZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjdXJfc2VnX2NtZC0+Y21kID09IExDX1NZTVRBQikgeworICAgICAgICAgICAgc3ltdGFiX2NtZCA9IChzdHJ1Y3Qgc3ltdGFiX2NvbW1hbmQqKWN1cl9zZWdfY21kOworICAgICAgICB9IGVsc2UgaWYgKGN1cl9zZWdfY21kLT5jbWQgPT0gTENfRFlTWU1UQUIpIHsKKyAgICAgICAgICAgIGR5c3ltdGFiX2NtZCA9IChzdHJ1Y3QgZHlzeW10YWJfY29tbWFuZCopY3VyX3NlZ19jbWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN5bXRhYl9jbWQgfHwgIWR5c3ltdGFiX2NtZCB8fCAhbGlua2VkaXRfc2VnbWVudCB8fAorICAgICAgICAhZHlzeW10YWJfY21kLT5uaW5kaXJlY3RzeW1zKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGaW5kIGJhc2Ugc3ltYm9sL3N0cmluZyB0YWJsZSBhZGRyZXNzZXMKKyAgICB1aW50cHRyX3QgbGlua2VkaXRfYmFzZSA9ICh1aW50cHRyX3Qpc2xpZGUgKyBsaW5rZWRpdF9zZWdtZW50LT52bWFkZHIgLSBsaW5rZWRpdF9zZWdtZW50LT5maWxlb2ZmOworICAgIG5saXN0X3QgKnN5bXRhYiA9IChubGlzdF90ICopKGxpbmtlZGl0X2Jhc2UgKyBzeW10YWJfY21kLT5zeW1vZmYpOworICAgIGNoYXIgKnN0cnRhYiA9IChjaGFyICopKGxpbmtlZGl0X2Jhc2UgKyBzeW10YWJfY21kLT5zdHJvZmYpOworCisgICAgLy8gR2V0IGluZGlyZWN0IHN5bWJvbCB0YWJsZSAoYXJyYXkgb2YgdWludDMyX3QgaW5kaWNlcyBpbnRvIHN5bWJvbCB0YWJsZSkKKyAgICB1aW50MzJfdCAqaW5kaXJlY3Rfc3ltdGFiID0gKHVpbnQzMl90ICopKGxpbmtlZGl0X2Jhc2UgKyBkeXN5bXRhYl9jbWQtPmluZGlyZWN0c3ltb2ZmKTsKKworICAgIGN1ciA9ICh1aW50cHRyX3QpaGVhZGVyICsgc2l6ZW9mKG1hY2hfaGVhZGVyX3QpOworICAgIGZvciAodWludCBpID0gMDsgaSA8IGhlYWRlci0+bmNtZHM7IGkrKywgY3VyICs9IGN1cl9zZWdfY21kLT5jbWRzaXplKSB7CisgICAgICAgIGN1cl9zZWdfY21kID0gKHNlZ21lbnRfY29tbWFuZF90ICopY3VyOworICAgICAgICBpZiAoY3VyX3NlZ19jbWQtPmNtZCA9PSBMQ19TRUdNRU5UX0FSQ0hfREVQRU5ERU5UKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGN1cl9zZWdfY21kLT5zZWduYW1lLCBTRUdfREFUQSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh1aW50IGogPSAwOyBqIDwgY3VyX3NlZ19jbWQtPm5zZWN0czsgaisrKSB7CisgICAgICAgICAgICAgICAgc2VjdGlvbl90ICpzZWN0ID0KKyAgICAgICAgICAgICAgICAoc2VjdGlvbl90ICopKGN1ciArIHNpemVvZihzZWdtZW50X2NvbW1hbmRfdCkpICsgajsKKyAgICAgICAgICAgICAgICBpZiAoKHNlY3QtPmZsYWdzICYgU0VDVElPTl9UWVBFKSA9PSBTX0xBWllfU1lNQk9MX1BPSU5URVJTKSB7CisgICAgICAgICAgICAgICAgICAgIF9GU0V2ZW50c0ZpeEhvb2tVcGRhdGVTZWN0aW9uKHNlY3QsIHNsaWRlLCBzeW10YWIsIHN0cnRhYiwgaW5kaXJlY3Rfc3ltdGFiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChzZWN0LT5mbGFncyAmIFNFQ1RJT05fVFlQRSkgPT0gU19OT05fTEFaWV9TWU1CT0xfUE9JTlRFUlMpIHsKKyAgICAgICAgICAgICAgICAgICAgX0ZTRXZlbnRzRml4SG9va1VwZGF0ZVNlY3Rpb24oc2VjdCwgc2xpZGUsIHN5bXRhYiwgc3RydGFiLCBpbmRpcmVjdF9zeW10YWIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX0ZTRXZlbnRzRml4SG9va1NhdmVPcmlnaW5hbHMoKSB7CisgICAgZm9yIChyZWJpbmRpbmdfdCAqY3VyID0gZ19yZWJpbmRpbmdzLCAqZW5kID0gZ19yZWJpbmRpbmdzICsgZ19yZWJpbmRpbmdzX25lbDsgY3VyIDwgZW5kOyArK2N1cikgIHsKKyAgICAgICAgdm9pZCAqb3JpZ2luYWwgPSBjdXItPm9yaWdpbmFsID0gZGxzeW0oUlRMRF9ERUZBVUxULCBjdXItPm5hbWUrMSk7CisgICAgICAgIGlmICghb3JpZ2luYWwpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yID0gZGxlcnJvcigpOworICAgICAgICAgICAgX0ZTRXZlbnRzRml4TG9nKEZTRXZlbnRzRml4TWVzc2FnZVR5cGVGYXRhbEVycm9yLCAiQ2Fubm90IGZpbmQgc3ltYm9sICVzLCBkbHN5bSBzYXlzOiAlc1xuIiwgY3VyLT5uYW1lLCBlcnJvcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9GU0V2ZW50c0ZpeEhvb2tVcGRhdGUoKSB7CisgICAgdWludDMyX3QgYyA9IF9keWxkX2ltYWdlX2NvdW50KCk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGM7IGkrKykgeworICAgICAgICBfRlNFdmVudHNGaXhIb29rVXBkYXRlSW1hZ2UoX2R5bGRfZ2V0X2ltYWdlX2hlYWRlcihpKSwgX2R5bGRfZ2V0X2ltYWdlX3ZtYWRkcl9zbGlkZShpKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfRlNFdmVudHNGaXhIb29rSW5zdGFsbCgpIHsKKyAgICBzdGF0aWMgYm9vbCBmaXJzdF9yZWJpbmRpbmdfZG9uZSA9IGZhbHNlOworCisgICAgaWYgKCFnX2hvb2tfaW5zdGFsbGVkKSB7CisgICAgICAgIGdfaG9va19pbnN0YWxsZWQgPSB0cnVlOworCisgICAgICAgIGlmICghZmlyc3RfcmViaW5kaW5nX2RvbmUpIHsKKyAgICAgICAgICAgIGZpcnN0X3JlYmluZGluZ19kb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIF9GU0V2ZW50c0ZpeEhvb2tTYXZlT3JpZ2luYWxzKCk7CisgICAgICAgICAgICBfZHlsZF9yZWdpc3Rlcl9mdW5jX2Zvcl9hZGRfaW1hZ2UoX0ZTRXZlbnRzRml4SG9va1VwZGF0ZUltYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9GU0V2ZW50c0ZpeEhvb2tVcGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX0ZTRXZlbnRzRml4SG9va1VuaW5zdGFsbCgpIHsKKyAgICBpZiAoZ19ob29rX2luc3RhbGxlZCkgeworICAgICAgICBnX2hvb2tfaW5zdGFsbGVkID0gZmFsc2U7CisgICAgICAgIF9GU0V2ZW50c0ZpeEhvb2tVcGRhdGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9GU0V2ZW50c0ZpeC5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvRlNFdmVudHNGaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzBiODgwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvRlNFdmVudHNGaXguaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIEZTRXZlbnRzRml4CisgKgorICogV29ya3MgYXJvdW5kIGEgbG9uZy1zdGFuZGluZyBidWcgaW4gcmVhbHBhdGgoKSB0aGF0IHByZXZlbnRzIEZTRXZlbnRzIEFQSSBmcm9tCisgKiBtb25pdG9yaW5nIGNlcnRhaW4gZm9sZGVycyBvbiBhIHdpZGUgcmFuZ2Ugb2YgT1MgWCByZWxlYXNlcyAoMTAuNi0xMC4xMCBhdCBsZWFzdCkuCisgKgorICogVGhlIHVuZGVybHlpbmcgaXNzdWUgaXMgdGhhdCBmb3Igc29tZSBmb2xkZXJzLCByZWFscGF0aCgpIGNhbGwgc3RhcnRzIHJldHVybmluZworICogYSBwYXRoIHdpdGggaW5jb3JyZWN0IGNhc2luZyAoZS5nLiAiL3VzZXJzL3NtdCIgaW5zdGVhZCBvZiAiL1VzZXJzL3NtdCIpLgorICogRlNFdmVudHMgaXMgY2FzZS1zZW5zaXRpdmUgYW5kIGNhbGxzIHJlYWxwYXRoKCkgb24gdGhlIHBhdGhzIHlvdSBwYXNzIGluLCBzbworICogYW4gaW5jb3JyZWN0IHZhbHVlIHJldHVybmVkIGJ5IHJlYWxwYXRoKCkgcHJldmVudHMgRlNFdmVudHMgZnJvbSBzZWVpbmcgYW55CisgKiBjaGFuZ2UgZXZlbnRzLgorICoKKyAqIFNlZSB0aGUgZGlzY3Vzc2lvbiBhdCBodHRwczovL2dpdGh1Yi5jb20vdGhpYmF1ZGdnL3JiLWZzZXZlbnQvaXNzdWVzLzEwIGFib3V0CisgKiB0aGUgaGlzdG9yeSBvZiB0aGlzIGJ1ZyBhbmQgaG93IHRoaXMgbGlicmFyeSBjYW1lIHRvIGV4aXN0LgorICoKKyAqIFRoaXMgbGlicmFyeSB1c2VzIEZhY2Vib29rJ3MgZmlzaGhvb2sgdG8gcmVwbGFjZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZgorICogcmVhbHBhdGggaW4gcGxhY2Ugb2YgdGhlIHN5c3RlbSByZWFscGF0aDsgRlNFdmVudHMgd2lsbCB0aGVuIGludm9rZSBvdXIgY3VzdG9tCisgKiBpbXBsZW1lbnRhdGlvbiAod2hpY2ggZG9lcyBub3Qgc2NyZXcgdXAgdGhlIG5hbWVzKSBhbmQgd2lsbCB0aHVzIHdvcmsgY29ycmVjdGx5LgorICoKKyAqIE91ciBpbXBsZW1lbnRhdGlvbiBvZiByZWFscGF0aCBpcyBiYXNlZCBvbiB0aGUgb3Blbi1zb3VyY2UgaW1wbGVtZW50YXRpb24gZnJvbQorICogT1MgWCAxMC4xMCwgd2l0aCBhIHNpbmdsZSBjaGFuZ2UgYXBwbGllZCAoZW5jbG9zZWQgaW4gIkJFR0lOIFdPUktBUk9VTkQgRk9SCisgKiBPUyBYIEJVRyIgLi4uICJFTkQgV09SS0FST1VORCBGT1IgT1MgWCBCVUciKS4KKyAqCisgKiBJbmNsdWRlIEZTRXZlbnRzRml4LntoLGN9IGludG8geW91ciBwcm9qZWN0IGFuZCBjYWxsIEZTRXZlbnRzRml4SW5zdGFsbCgpLgorICoKKyAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGluc3RhbGwgRlNFdmVudHNGaXggb24gZGVtYW5kLCB1c2luZyBGU0V2ZW50c0ZpeElzQnJva2VuCisgKiB0byBjaGVjayBpZiB0aGUgZm9sZGVyIHlvdSdyZSBhYm91dCB0byBwYXNzIHRvIEZTRXZlbnRTdHJlYW1DcmVhdGUgbmVlZHMgdGhlIGZpeC4KKyAqIE5vdGUgdGhhdCB0aGUgZml4IG11c3QgYmUgYXBwbGllZCBiZWZvcmUgY2FsbGluZyBGU0V2ZW50U3RyZWFtQ3JlYXRlLgorICoKKyAqIEZTRXZlbnRzRml4SXNCcm9rZW4gcmVxdWlyZXMgYSBwYXRoIHRoYXQgdXNlcyB0aGUgY29ycmVjdCBjYXNlIGZvciBhbGwgZm9sZGVyIG5hbWVzLAorICogaS5lLiBhIHBhdGggcHJvdmlkZWQgYnkgdGhlIHN5c3RlbSBBUElzIG9yIGNvbnN0cnVjdGVkIGZyb20gZm9sZGVyIG5hbWVzIHByb3ZpZGVkCisgKiBieSB0aGUgZGlyZWN0b3J5IGVudW1lcmF0aW9uIEFQSXMuCisgKgorICogU2VlIC5jIGZpbGUgZm9yIGxpY2Vuc2UgJiBjb3B5cmlnaHRzLCBidXQgYmFzaWNhbGx5IHRoaXMgaXMgYXZhaWxhYmxlIHVuZGVyIGEgbWl4CisgKiBvZiBNSVQgYW5kIEJTRCBsaWNlbnNlcy4KKyAqLworCisjaWZuZGVmIF9fRlNFdmVudHNGaXhfXworI2RlZmluZSBfX0ZTRXZlbnRzRml4X18KKworI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+CisKKy8vLyBBIGxpYnJhcnkgdmVyc2lvbiBzdHJpbmcgKGUuZy4gMS4yLjMpIGZvciBkaXNwbGF5aW5nIGFuZCBsb2dnaW5nIHB1cnBvc2VzCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgRlNFdmVudHNGaXhWZXJzaW9uU3RyaW5nOworCisvLy8gU2VlIEZTRXZlbnRzRml4RGVidWdPcHRpb25TaW11bGF0ZUJyb2tlbgorI2RlZmluZSBGU0V2ZW50c0ZpeFNpbXVsYXRlZEJyb2tlbkZvbGRlck1hcmtlciAgIl9fIUZTRXZlbnRzQnJva2VuIV9fIgorCit0eXBlZGVmIENGX09QVElPTlModW5zaWduZWQsIEZTRXZlbnRzRml4RGVidWdPcHRpb25zKSB7CisgICAgLy8vIEFsd2F5cyByZXR1cm4gYW4gdXBwZXJjYXNlIHN0cmluZyBmcm9tIHJlYWxwYXRoCisgICAgRlNFdmVudHNGaXhEZWJ1Z09wdGlvblVwcGVyY2FzZVJldHVybiAgPSAweDAxLAorICAgIAorICAgIC8vLyBMb2cgYWxsIGNhbGxzIHRvIHJlYWxwYXRoIHVzaW5nIHRoZSBsb2dnZXIgY29uZmlndXJlZCB2aWEgRlNFdmVudHNGaXhDb25maWd1cmUKKyAgICBGU0V2ZW50c0ZpeERlYnVnT3B0aW9uTG9nQ2FsbHMgICAgICAgICA9IDB4MDIsCisKKyAgICAvLy8gSW4gYWRkaXRpb24gdG8gdGhlIGxvZ2dpbmcgYmxvY2sgKGlmIGFueSksIGxvZyBldmVyeXRoaW5nIHRvIHN0ZGVycgorICAgIEZTRXZlbnRzRml4RGVidWdPcHRpb25Mb2dUb1N0ZGVyciAgICAgID0gMHgwOCwKKyAgICAKKyAgICAvLy8gUmVwb3J0IHBhdGhzIGNvbnRhaW5pbmcgRlNFdmVudHNGaXhTaW11bGF0ZWRCcm9rZW5Gb2xkZXJNYXJrZXIgYXMgYnJva2VuCisgICAgRlNFdmVudHNGaXhEZWJ1Z09wdGlvblNpbXVsYXRlQnJva2VuICAgPSAweDEwLAorICAgIAorICAgIC8vLyBSZXBhaXIgcGF0aHMgY29udGFpbmluZyBGU0V2ZW50c0ZpeFNpbXVsYXRlZEJyb2tlbkZvbGRlck1hcmtlciBieSByZW5hbWluZyB0aGVtCisgICAgRlNFdmVudHNGaXhEZWJ1Z09wdGlvblNpbXVsYXRlUmVwYWlyICAgPSAweDIwLAorfTsKKwordHlwZWRlZiBDRl9FTlVNKGludCwgRlNFdmVudHNGaXhNZXNzYWdlVHlwZSkgeworICAgIC8vLyBDYWxsIGxvZ2dpbmcgcmVxdWVzdGVkIHZpYSBGU0V2ZW50c0ZpeERlYnVnT3B0aW9uTG9nQ2FsbHMKKyAgICBGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlQ2FsbCwKKyAgICAKKyAgICAvLy8gUmVzdWx0cyBvZiBhY3Rpb25zIGxpa2UgcmVwYWlyLCBhbmQgb3RoZXIgcHJldHR5IHZlcmJvc2UsIGJ1dCBub3RhYmxlLCBzdHVmZi4KKyAgICBGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlUmVzdWx0LAorCisgICAgLy8vIEVuYWJsZWQvZGlzYWJsZWQgc3RhdHVzIGNoYW5nZQorICAgIEZTRXZlbnRzRml4TWVzc2FnZVR5cGVTdGF0dXNDaGFuZ2UsCisKKyAgICAvLy8gRXhwZWN0ZWQgZmFpbHVyZSAodHJlYXQgYXMgYSB3YXJuaW5nKQorICAgIEZTRXZlbnRzRml4TWVzc2FnZVR5cGVFeHBlY3RlZEZhaWx1cmUsCisKKyAgICAvLy8gU2V2ZXJlIGZhaWx1cmUgdGhhdCBtb3N0IGxpa2VseSBtZWFucyB0aGF0IHRoZSBsaWJyYXJ5IHdvbid0IHdvcmsKKyAgICBGU0V2ZW50c0ZpeE1lc3NhZ2VUeXBlRmF0YWxFcnJvcgorfTsKKwordHlwZWRlZiBDRl9FTlVNKGludCwgRlNFdmVudHNGaXhSZXBhaXJTdGF0dXMpIHsKKyAgICBGU0V2ZW50c0ZpeFJlcGFpclN0YXR1c05vdEJyb2tlbiwKKyAgICBGU0V2ZW50c0ZpeFJlcGFpclN0YXR1c1JlcGFpcmVkLAorICAgIEZTRXZlbnRzRml4UmVwYWlyU3RhdHVzRmFpbGVkLAorfTsKKworLy8vIE5vdGUgdGhhdCB0aGUgbG9nZ2luZyBibG9jayBjYW4gYmUgY2FsbGVkIG9uIGFueSBkaXNwYXRjaCBxdWV1ZS4KK3ZvaWQgRlNFdmVudHNGaXhDb25maWd1cmUoRlNFdmVudHNGaXhEZWJ1Z09wdGlvbnMgZGVidWdPcHRpb25zLCB2b2lkKF5sb2dnaW5nQmxvY2spKEZTRXZlbnRzRml4TWVzc2FnZVR5cGUgdHlwZSwgY29uc3QgY2hhciAqbWVzc2FnZSkpOworCit2b2lkIEZTRXZlbnRzRml4RW5hYmxlKCk7Cit2b2lkIEZTRXZlbnRzRml4RGlzYWJsZSgpOworCitib29sIEZTRXZlbnRzRml4SXNPcGVyYXRpb25hbCgpOworCitib29sIEZTRXZlbnRzRml4SXNCcm9rZW4oY29uc3QgY2hhciAqcGF0aCk7CisKKy8vLyBJZiB0aGUgcGF0aCBpcyBicm9rZW4sIHJldHVybnMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHJvb3QgYnJva2VuIGZvbGRlciwKKy8vLyBvdGhlcndpc2UsIHJldHVybnMgTlVMTC4gWW91IG5lZWQgdG8gZnJlZSgpIHRoZSByZXR1cm5lZCBzdHJpbmcuCitjaGFyICpGU0V2ZW50c0ZpeENvcHlSb290QnJva2VuRm9sZGVyUGF0aChjb25zdCBjaGFyICpwYXRoKTsKKworRlNFdmVudHNGaXhSZXBhaXJTdGF0dXMgRlNFdmVudHNGaXhSZXBhaXJJZk5lZWRlZChjb25zdCBjaGFyICpwYXRoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9UU0lDVFN0cmluZy5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvVFNJQ1RTdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTAzM2QwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvVFNJQ1RTdHJpbmcuYwpAQCAtMCwwICsxLDM3MyBAQAorLy8KKy8vICBUU0lDVFN0cmluZy5jCisvLyAgVFNJVFN0cmluZworLy8KKy8vICBDcmVhdGVkIGJ5IFRyYXZpcyBUaWxsZXkgb24gOS8yNy8xMS4KKy8vCisKKyNpbmNsdWRlICJUU0lDVFN0cmluZy5oIgorCisKK2NvbnN0IGNoYXIqIGNvbnN0IFROZXRzdHJpbmdUeXBlcyA9ICIsI14hfn1dWiI7Citjb25zdCBjaGFyKiBjb25zdCBPVE5ldHN0cmluZ1R5cGVzID0gIiwjXiF+e1taIjsKK2NvbnN0IFVJbnQ4IFROZXRzdHJpbmdTZXBhcmF0b3IgPSAnOic7CisKK1RTSVRTdHJpbmdGb3JtYXQgVFNJVFN0cmluZ0RlZmF1bHRGb3JtYXQgPSBrVFNJVFN0cmluZ0Zvcm1hdFROZXRzdHJpbmc7CisKK3N0YXRpYyBjb25zdCBDRlJhbmdlIEJlZ2lubmluZ1JhbmdlID0gezAsMH07CisKK3N0YXRpYyBDRlR5cGVJRCBrQ0ZEYXRhVHlwZUlEICAgICAgID0gLTFVTDsKK3N0YXRpYyBDRlR5cGVJRCBrQ0ZTdHJpbmdUeXBlSUQgICAgID0gLTFVTDsKK3N0YXRpYyBDRlR5cGVJRCBrQ0ZOdW1iZXJUeXBlSUQgICAgID0gLTFVTDsKK3N0YXRpYyBDRlR5cGVJRCBrQ0ZCb29sZWFuVHlwZUlEICAgID0gLTFVTDsKK3N0YXRpYyBDRlR5cGVJRCBrQ0ZOdWxsVHlwZUlEICAgICAgID0gLTFVTDsKK3N0YXRpYyBDRlR5cGVJRCBrQ0ZBcnJheVR5cGVJRCAgICAgID0gLTFVTDsKK3N0YXRpYyBDRlR5cGVJRCBrQ0ZEaWN0aW9uYXJ5VHlwZUlEID0gLTFVTDsKKworCitfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgSW5pdF9UU0lDVFN0cmluZyh2b2lkKQoreworICAgIGtDRkRhdGFUeXBlSUQgICAgICAgID0gQ0ZEYXRhR2V0VHlwZUlEKCk7CisgICAga0NGU3RyaW5nVHlwZUlEICAgICAgPSBDRlN0cmluZ0dldFR5cGVJRCgpOworICAgIGtDRk51bWJlclR5cGVJRCAgICAgID0gQ0ZOdW1iZXJHZXRUeXBlSUQoKTsKKyAgICBrQ0ZCb29sZWFuVHlwZUlEICAgICA9IENGQm9vbGVhbkdldFR5cGVJRCgpOworICAgIGtDRk51bGxUeXBlSUQgICAgICAgID0gQ0ZOdWxsR2V0VHlwZUlEKCk7CisgICAga0NGQXJyYXlUeXBlSUQgICAgICAgPSBDRkFycmF5R2V0VHlwZUlEKCk7CisgICAga0NGRGljdGlvbmFyeVR5cGVJRCAgPSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKTsKK30KKworCit2b2lkIFRTSUNUU3RyaW5nU2V0RGVmYXVsdEZvcm1hdChUU0lUU3RyaW5nRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBpZiAoZm9ybWF0ID09IGtUU0lUU3RyaW5nRm9ybWF0RGVmYXVsdCkgeworICAgICAgICBUU0lUU3RyaW5nRGVmYXVsdEZvcm1hdCA9IGtUU0lUU3RyaW5nRm9ybWF0VE5ldHN0cmluZzsKKyAgICB9IGVsc2UgeworICAgICAgICBUU0lUU3RyaW5nRGVmYXVsdEZvcm1hdCA9IGZvcm1hdDsKKyAgICB9Cit9CisKK1RTSVRTdHJpbmdGb3JtYXQgVFNJQ1RTdHJpbmdHZXREZWZhdWx0Rm9ybWF0KHZvaWQpCit7CisgICAgcmV0dXJuIFRTSVRTdHJpbmdEZWZhdWx0Rm9ybWF0OworfQorCisKK3ZvaWQgVFNJQ1RTdHJpbmdEZXN0cm95KFRTdHJpbmdJUmVwKiByZXApCit7CisgICAgQ0ZSZWxlYXNlKHJlcC0+ZGF0YSk7CisgICAgZnJlZShyZXAtPmxlbmd0aCk7CisgICAgZnJlZShyZXApOworfQorCisKK3N0YXRpYyBpbmxpbmUgVFN0cmluZ0lSZXAqIFRTSUNUU3RyaW5nQ3JlYXRlV2l0aERhdGFPZlR5cGVBbmRGb3JtYXQoQ0ZEYXRhUmVmIGRhdGEsIFRTSVRTdHJpbmdUYWcgdHlwZSwgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpCit7CisgICAgaWYgKGZvcm1hdCA9PSBrVFNJVFN0cmluZ0Zvcm1hdERlZmF1bHQpIHsKKyAgICAgICAgZm9ybWF0ID0gVFNJQ1RTdHJpbmdHZXREZWZhdWx0Rm9ybWF0KCk7CisgICAgfQorCisgICAgVFN0cmluZ0lSZXAqIHJlcCA9IGNhbGxvYygxLCBzaXplb2YoVFN0cmluZ0lSZXApKTsKKyAgICByZXAtPmRhdGEgPSBDRkRhdGFDcmVhdGVDb3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIGRhdGEpOworICAgIHJlcC0+dHlwZSA9IHR5cGU7CisgICAgcmVwLT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgcmVwLT5sZW5ndGggPSBjYWxsb2MoMTAsIHNpemVvZihjaGFyKSk7CisKKyAgICBDRkluZGV4IGxlbiA9IENGRGF0YUdldExlbmd0aChyZXAtPmRhdGEpOworICAgIGlmIChzbnByaW50ZihyZXAtPmxlbmd0aCwgMTAsICIlbHUiLCBsZW4pKSB7CisgICAgICAgIHJldHVybiByZXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVFNJQ1RTdHJpbmdEZXN0cm95KHJlcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBDRkRhdGFSZWYgVFNJQ1RTdHJpbmdDcmVhdGVEYXRhRnJvbUludGVybWVkaWF0ZVJlcHJlc2VudGF0aW9uKFRTdHJpbmdJUmVwKiByZXApCit7CisgICAgQ0ZJbmRleCBsZW4gPSBDRkRhdGFHZXRMZW5ndGgocmVwLT5kYXRhKTsKKyAgICBDRk11dGFibGVEYXRhUmVmIGJ1ZmZlciA9IENGRGF0YUNyZWF0ZU11dGFibGVDb3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIChsZW4gKyAxMiksIHJlcC0+ZGF0YSk7CisgICAgVUludDgqIGJ1ZmZlckJ5dGVzID0gQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIoYnVmZmVyKTsKKworICAgIHNpemVfdCBwcmVmaXhMZW5ndGggPSBzdHJsZW4ocmVwLT5sZW5ndGgpICsgMTsKKyAgICBDRkRhdGFSZXBsYWNlQnl0ZXMoYnVmZmVyLCBCZWdpbm5pbmdSYW5nZSwgKGNvbnN0IFVJbnQ4KilyZXAtPmxlbmd0aCwgKENGSW5kZXgpcHJlZml4TGVuZ3RoKTsKKworICAgIGlmIChyZXAtPmZvcm1hdCA9PSBrVFNJVFN0cmluZ0Zvcm1hdFROZXRzdHJpbmcpIHsKKyAgICAgICAgY29uc3QgVUludDggZnRhZyA9IChVSW50OClUTmV0c3RyaW5nVHlwZXNbcmVwLT50eXBlXTsKKyAgICAgICAgQ0ZEYXRhQXBwZW5kQnl0ZXMoYnVmZmVyLCAmZnRhZywgMSk7CisgICAgICAgIGJ1ZmZlckJ5dGVzWyhwcmVmaXhMZW5ndGggLSAxKV0gPSBUTmV0c3RyaW5nU2VwYXJhdG9yOworICAgIH0gZWxzZSBpZiAocmVwLT5mb3JtYXQgPT0ga1RTSVRTdHJpbmdGb3JtYXRPVE5ldHN0cmluZykgeworICAgICAgICBjb25zdCBVSW50OCBmdGFnID0gKFVJbnQ4KU9UTmV0c3RyaW5nVHlwZXNbcmVwLT50eXBlXTsKKyAgICAgICAgYnVmZmVyQnl0ZXNbKHByZWZpeExlbmd0aCAtIDEpXSA9IGZ0YWc7CisgICAgfQorCisgICAgQ0ZEYXRhUmVmIGRhdGFSZXAgPSBDRkRhdGFDcmVhdGVDb3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIGJ1ZmZlcik7CisgICAgQ0ZSZWxlYXNlKGJ1ZmZlcik7CisKKyAgICByZXR1cm4gZGF0YVJlcDsKK30KKworc3RhdGljIGlubGluZSBDRlN0cmluZ1JlZiBUU0lDVFN0cmluZ0NyZWF0ZVN0cmluZ0Zyb21JbnRlcm1lZGlhdGVSZXByZXNlbnRhdGlvbihUU3RyaW5nSVJlcCogcmVwKQoreworICAgIENGRGF0YVJlZiBkYXRhID0gVFNJQ1RTdHJpbmdDcmVhdGVEYXRhRnJvbUludGVybWVkaWF0ZVJlcHJlc2VudGF0aW9uKHJlcCk7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nID0gQ0ZTdHJpbmdDcmVhdGVGcm9tRXh0ZXJuYWxSZXByZXNlbnRhdGlvbihrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBkYXRhLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworICAgIENGUmVsZWFzZShkYXRhKTsKKyAgICByZXR1cm4gc3RyaW5nOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgVFNJQ1RTdHJpbmdBcHBlbmRPYmplY3RUb011dGFibGVEYXRhV2l0aEZvcm1hdChDRlR5cGVSZWYgb2JqZWN0LCBDRk11dGFibGVEYXRhUmVmIGJ1ZmZlciwgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpCit7CisgICAgaWYgKG9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIG9iamVjdCA9IGtDRk51bGw7CisgICAgfQorCisgICAgQ0ZSZXRhaW4ob2JqZWN0KTsKKworICAgIFRTdHJpbmdJUmVwKiBvYmpSZXAgPSBUU0lDVFN0cmluZ0NyZWF0ZVdpdGhPYmplY3RBbmRGb3JtYXQob2JqZWN0LCBmb3JtYXQpOworICAgIENGRGF0YVJlZiBvYmpEYXRhID0gVFNJQ1RTdHJpbmdDcmVhdGVEYXRhRnJvbUludGVybWVkaWF0ZVJlcHJlc2VudGF0aW9uKG9ialJlcCk7CisgICAgQ0ZEYXRhQXBwZW5kQnl0ZXMoYnVmZmVyLCAoQ0ZEYXRhR2V0Qnl0ZVB0cihvYmpEYXRhKSksIENGRGF0YUdldExlbmd0aChvYmpEYXRhKSk7CisgICAgQ0ZSZWxlYXNlKG9iakRhdGEpOworICAgIFRTSUNUU3RyaW5nRGVzdHJveShvYmpSZXApOworCisgICAgQ0ZSZWxlYXNlKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIEFycmF5QnVmZmVyQXBwZW5kQ2FsbGJhY2soY29uc3Qgdm9pZCogaXRlbSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBUU3RyaW5nQ29sbGVjdGlvbkNhbGxiYWNrQ29udGV4dCogY3ggPSAoVFN0cmluZ0NvbGxlY3Rpb25DYWxsYmFja0NvbnRleHQqKWNvbnRleHQ7CisgICAgQ0ZNdXRhYmxlRGF0YVJlZiBidWZmZXIgPSBjeC0+YnVmZmVyOworICAgIFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0ID0gY3gtPmZvcm1hdDsKKworICAgIFRTSUNUU3RyaW5nQXBwZW5kT2JqZWN0VG9NdXRhYmxlRGF0YVdpdGhGb3JtYXQoaXRlbSwgYnVmZmVyLCBmb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBEaWN0aW9uYXJ5QnVmZmVyQXBwZW5kQ2FsbGJhY2soY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiB2YWx1ZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBUU3RyaW5nQ29sbGVjdGlvbkNhbGxiYWNrQ29udGV4dCogY3ggPSAoVFN0cmluZ0NvbGxlY3Rpb25DYWxsYmFja0NvbnRleHQqKWNvbnRleHQ7CisgICAgQ0ZNdXRhYmxlRGF0YVJlZiBidWZmZXIgPSBjeC0+YnVmZmVyOworICAgIFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0ID0gY3gtPmZvcm1hdDsKKworICAgIFRTSUNUU3RyaW5nQXBwZW5kT2JqZWN0VG9NdXRhYmxlRGF0YVdpdGhGb3JtYXQoa2V5LCBidWZmZXIsIGZvcm1hdCk7CisgICAgVFNJQ1RTdHJpbmdBcHBlbmRPYmplY3RUb011dGFibGVEYXRhV2l0aEZvcm1hdCh2YWx1ZSwgYnVmZmVyLCBmb3JtYXQpOworfQorCisKK0NGRGF0YVJlZiBUU0lDVFN0cmluZ0NyZWF0ZVJlbmRlcmVkRGF0YShUU3RyaW5nSVJlcCogcmVwKQoreworICAgIHJldHVybiBUU0lDVFN0cmluZ0NyZWF0ZURhdGFGcm9tSW50ZXJtZWRpYXRlUmVwcmVzZW50YXRpb24ocmVwKTsKK30KKworQ0ZEYXRhUmVmIFRTSUNUU3RyaW5nQ3JlYXRlUmVuZGVyZWREYXRhRnJvbU9iamVjdFdpdGhGb3JtYXQoQ0ZUeXBlUmVmIG9iamVjdCwgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpCit7CisgICAgaWYgKG9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIG9iamVjdCA9IGtDRk51bGw7CisgICAgfQorCisgICAgQ0ZSZXRhaW4ob2JqZWN0KTsKKworICAgIFRTdHJpbmdJUmVwKiByZXAgPSBUU0lDVFN0cmluZ0NyZWF0ZVdpdGhPYmplY3RBbmRGb3JtYXQob2JqZWN0LCBmb3JtYXQpOworICAgIENGRGF0YVJlZiBkYXRhID0gVFNJQ1RTdHJpbmdDcmVhdGVEYXRhRnJvbUludGVybWVkaWF0ZVJlcHJlc2VudGF0aW9uKHJlcCk7CisKKyAgICBUU0lDVFN0cmluZ0Rlc3Ryb3kocmVwKTsKKyAgICBDRlJlbGVhc2Uob2JqZWN0KTsKKworICAgIHJldHVybiBkYXRhOworfQorCitDRlN0cmluZ1JlZiBUU0lDVFN0cmluZ0NyZWF0ZVJlbmRlcmVkU3RyaW5nKFRTdHJpbmdJUmVwKiByZXApCit7CisgICAgcmV0dXJuIFRTSUNUU3RyaW5nQ3JlYXRlU3RyaW5nRnJvbUludGVybWVkaWF0ZVJlcHJlc2VudGF0aW9uKHJlcCk7Cit9CisKK0NGU3RyaW5nUmVmIFRTSUNUU3RyaW5nQ3JlYXRlUmVuZGVyZWRTdHJpbmdGcm9tT2JqZWN0V2l0aEZvcm1hdChDRlR5cGVSZWYgb2JqZWN0LCBUU0lUU3RyaW5nRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBpZiAob2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgb2JqZWN0ID0ga0NGTnVsbDsKKyAgICB9CisKKyAgICBDRlJldGFpbihvYmplY3QpOworCisgICAgVFN0cmluZ0lSZXAqIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aE9iamVjdEFuZEZvcm1hdChvYmplY3QsIGZvcm1hdCk7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nID0gVFNJQ1RTdHJpbmdDcmVhdGVTdHJpbmdGcm9tSW50ZXJtZWRpYXRlUmVwcmVzZW50YXRpb24ocmVwKTsKKworICAgIFRTSUNUU3RyaW5nRGVzdHJveShyZXApOworICAgIENGUmVsZWFzZShvYmplY3QpOworCisgICAgcmV0dXJuIHN0cmluZzsKK30KKworCitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVXaXRoT2JqZWN0QW5kRm9ybWF0KENGVHlwZVJlZiBvYmplY3QsIFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KQoreworICAgIGlmIChvYmplY3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFNJQ1RTdHJpbmdDcmVhdGVOdWxsV2l0aEZvcm1hdChmb3JtYXQpOworICAgIH0KKyAgICBDRlJldGFpbihvYmplY3QpOworCisgICAgQ0ZUeXBlSUQgY2ZUeXBlID0gQ0ZHZXRUeXBlSUQob2JqZWN0KTsKKyAgICBUU3RyaW5nSVJlcCogcmVwID0gTlVMTDsKKworICAgIGlmIChjZlR5cGUgPT0ga0NGRGF0YVR5cGVJRCkgeworICAgICAgICByZXAgPSBUU0lDVFN0cmluZ0NyZWF0ZVdpdGhEYXRhT2ZUeXBlQW5kRm9ybWF0KG9iamVjdCwga1RTSVRTdHJpbmdUYWdTdHJpbmcsIGZvcm1hdCk7CisgICAgfSBlbHNlIGlmIChjZlR5cGUgPT0ga0NGU3RyaW5nVHlwZUlEKSB7CisgICAgICAgIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aFN0cmluZ0FuZEZvcm1hdChvYmplY3QsIGZvcm1hdCk7CisgICAgfSBlbHNlIGlmIChjZlR5cGUgPT0ga0NGTnVtYmVyVHlwZUlEKSB7CisgICAgICAgIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aE51bWJlckFuZEZvcm1hdChvYmplY3QsIGZvcm1hdCk7CisgICAgfSBlbHNlIGlmIChjZlR5cGUgPT0ga0NGQm9vbGVhblR5cGVJRCkgeworICAgICAgICBpZiAoQ0ZCb29sZWFuR2V0VmFsdWUob2JqZWN0KSkgeworICAgICAgICAgICAgcmVwID0gVFNJQ1RTdHJpbmdDcmVhdGVUcnVlV2l0aEZvcm1hdChmb3JtYXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVwID0gVFNJQ1RTdHJpbmdDcmVhdGVGYWxzZVdpdGhGb3JtYXQoZm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2ZUeXBlID09IGtDRk51bGxUeXBlSUQpIHsKKyAgICAgICAgcmVwID0gVFNJQ1RTdHJpbmdDcmVhdGVOdWxsV2l0aEZvcm1hdChmb3JtYXQpOworICAgIH0gZWxzZSBpZiAoY2ZUeXBlID09IGtDRkFycmF5VHlwZUlEKSB7CisgICAgICAgIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aEFycmF5QW5kRm9ybWF0KG9iamVjdCwgZm9ybWF0KTsKKyAgICB9IGVsc2UgaWYgKGNmVHlwZSA9PSBrQ0ZEaWN0aW9uYXJ5VHlwZUlEKSB7CisgICAgICAgIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aERpY3Rpb25hcnlBbmRGb3JtYXQob2JqZWN0LCBmb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlSW52YWxpZFdpdGhGb3JtYXQoZm9ybWF0KTsKKyAgICB9CisKKyAgICBDRlJlbGVhc2Uob2JqZWN0KTsKKyAgICByZXR1cm4gcmVwOworfQorCitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVXaXRoU3RyaW5nQW5kRm9ybWF0KENGU3RyaW5nUmVmIHN0cmluZywgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpCit7CisgICAgQ0ZSZXRhaW4oc3RyaW5nKTsKKyAgICBDRkRhdGFSZWYgZGF0YSA9IENGU3RyaW5nQ3JlYXRlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbihrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzdHJpbmcsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCwgJz8nKTsKKyAgICBUU3RyaW5nSVJlcCogcmVwID0gVFNJQ1RTdHJpbmdDcmVhdGVXaXRoRGF0YU9mVHlwZUFuZEZvcm1hdChkYXRhLCBrVFNJVFN0cmluZ1RhZ1N0cmluZywgZm9ybWF0KTsKKyAgICBDRlJlbGVhc2UoZGF0YSk7CisgICAgQ0ZSZWxlYXNlKHN0cmluZyk7CisgICAgcmV0dXJuIHJlcDsKK30KKworVFN0cmluZ0lSZXAqIFRTSUNUU3RyaW5nQ3JlYXRlV2l0aE51bWJlckFuZEZvcm1hdChDRk51bWJlclJlZiBudW1iZXIsIFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KQoreworICAgIENGUmV0YWluKG51bWJlcik7CisgICAgVFNJVFN0cmluZ1RhZyB0YWcgPSBrVFNJVFN0cmluZ1RhZ051bWJlcjsKKyAgICBDRkRhdGFSZWYgZGF0YTsKKyAgICBDRk51bWJlclR5cGUgbnVtVHlwZSA9IENGTnVtYmVyR2V0VHlwZShudW1iZXIpOworCisgICAgc3dpdGNoKG51bVR5cGUpIHsKKyAgICAgICAgY2FzZSBrQ0ZOdW1iZXJDaGFyVHlwZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgICAgaWYgKENGTnVtYmVyR2V0VmFsdWUobnVtYmVyLCBrQ0ZOdW1iZXJJbnRUeXBlLCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDAgfHwgdmFsdWUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB0YWcgPSBrVFNJVFN0cmluZ1RhZ0Jvb2w7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGFnID0ga1RTSVRTdHJpbmdUYWdTdHJpbmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrQ0ZOdW1iZXJGbG9hdDMyVHlwZToKKyAgICAgICAgY2FzZSBrQ0ZOdW1iZXJGbG9hdDY0VHlwZToKKyAgICAgICAgY2FzZSBrQ0ZOdW1iZXJGbG9hdFR5cGU6CisgICAgICAgIGNhc2Uga0NGTnVtYmVyRG91YmxlVHlwZToKKyAgICAgICAgeworICAgICAgICAgICAgdGFnID0ga1RTSVRTdHJpbmdUYWdGbG9hdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRhZyA9PSBrVFNJVFN0cmluZ1RhZ0Jvb2wpIHsKKyAgICAgICAgYm9vbCB2YWx1ZTsKKyAgICAgICAgQ0ZOdW1iZXJHZXRWYWx1ZShudW1iZXIsIGtDRk51bWJlckludFR5cGUsICZ2YWx1ZSk7CisgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgZGF0YSA9IENGRGF0YUNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoVUludDgqKSJ0cnVlIiwgNCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIChVSW50OCopImZhbHNlIiwgNSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRhZyA9PSBrVFNJVFN0cmluZ1RhZ0Zsb2F0KSB7CisgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgY2hhciAqcCwgKmU7CisgICAgICAgIGRvdWJsZSB2YWx1ZTsKKworICAgICAgICBDRk51bWJlckdldFZhbHVlKG51bWJlciwgbnVtVHlwZSwgJnZhbHVlKTsKKyAgICAgICAgc3ByaW50ZihidWYsICIlIy4xNWciLCB2YWx1ZSk7CisKKyAgICAgICAgZSA9IGJ1ZiArIHN0cmxlbihidWYpOworICAgICAgICBwID0gZTsKKyAgICAgICAgd2hpbGUgKHBbLTFdPT0nMCcgJiYgKCcwJyA8PSBwWy0yXSAmJiBwWy0yXSA8PSAnOScpKSB7CisgICAgICAgICAgICBwLS07CisgICAgICAgIH0KKyAgICAgICAgbWVtbW92ZShwLCBlLCBzdHJsZW4oZSkrMSk7CisKKyAgICAgICAgZGF0YSA9IENGRGF0YUNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoVUludDgqKWJ1ZiwgKENGSW5kZXgpc3RybGVuKGJ1ZikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgU0ludDY0IHZhbHVlOworICAgICAgICBDRk51bWJlckdldFZhbHVlKG51bWJlciwgbnVtVHlwZSwgJnZhbHVlKTsKKyAgICAgICAgc3ByaW50ZihidWYsICIlbGxpIiwgdmFsdWUpOworICAgICAgICBkYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIChVSW50OCopYnVmLCAoQ0ZJbmRleClzdHJsZW4oYnVmKSk7CisgICAgfQorCisgICAgVFN0cmluZ0lSZXAqIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aERhdGFPZlR5cGVBbmRGb3JtYXQoZGF0YSwgdGFnLCBmb3JtYXQpOworICAgIENGUmVsZWFzZShkYXRhKTsKKyAgICBDRlJlbGVhc2UobnVtYmVyKTsKKyAgICByZXR1cm4gcmVwOworfQorCitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVUcnVlV2l0aEZvcm1hdChUU0lUU3RyaW5nRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBDRkRhdGFSZWYgZGF0YSA9IENGRGF0YUNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoVUludDgqKSJ0cnVlIiwgNCk7CisgICAgVFN0cmluZ0lSZXAqIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aERhdGFPZlR5cGVBbmRGb3JtYXQoZGF0YSwga1RTSVRTdHJpbmdUYWdCb29sLCBmb3JtYXQpOworICAgIENGUmVsZWFzZShkYXRhKTsKKyAgICByZXR1cm4gcmVwOworfQorCitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVGYWxzZVdpdGhGb3JtYXQoVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpCit7CisgICAgQ0ZEYXRhUmVmIGRhdGEgPSBDRkRhdGFDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKFVJbnQ4KikiZmFsc2UiLCA1KTsKKyAgICBUU3RyaW5nSVJlcCogcmVwID0gVFNJQ1RTdHJpbmdDcmVhdGVXaXRoRGF0YU9mVHlwZUFuZEZvcm1hdChkYXRhLCBrVFNJVFN0cmluZ1RhZ0Jvb2wsIGZvcm1hdCk7CisgICAgQ0ZSZWxlYXNlKGRhdGEpOworICAgIHJldHVybiByZXA7Cit9CisKK1RTdHJpbmdJUmVwKiBUU0lDVFN0cmluZ0NyZWF0ZU51bGxXaXRoRm9ybWF0KFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KQoreworICAgIENGRGF0YVJlZiBkYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIE5VTEwsIDApOworICAgIFRTdHJpbmdJUmVwKiByZXAgPSBUU0lDVFN0cmluZ0NyZWF0ZVdpdGhEYXRhT2ZUeXBlQW5kRm9ybWF0KGRhdGEsIGtUU0lUU3RyaW5nVGFnTnVsbCwgZm9ybWF0KTsKKyAgICBDRlJlbGVhc2UoZGF0YSk7CisgICAgcmV0dXJuIHJlcDsKK30KKworVFN0cmluZ0lSZXAqIFRTSUNUU3RyaW5nQ3JlYXRlSW52YWxpZFdpdGhGb3JtYXQoVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpCit7CisgICAgQ0ZEYXRhUmVmIGRhdGEgPSBDRkRhdGFDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgTlVMTCwgMCk7CisgICAgVFN0cmluZ0lSZXAqIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aERhdGFPZlR5cGVBbmRGb3JtYXQoZGF0YSwga1RTSVRTdHJpbmdUYWdJbnZhbGlkLCBmb3JtYXQpOworICAgIENGUmVsZWFzZShkYXRhKTsKKyAgICByZXR1cm4gcmVwOworfQorCitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVXaXRoQXJyYXlBbmRGb3JtYXQoQ0ZBcnJheVJlZiBhcnJheSwgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpCit7CisgICAgQ0ZSZXRhaW4oYXJyYXkpOworCisgICAgQ0ZNdXRhYmxlRGF0YVJlZiBidWZmZXIgPSBDRkRhdGFDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsIDApOworCisgICAgQ0ZSYW5nZSBhbGwgPSBDRlJhbmdlTWFrZSgwLCBDRkFycmF5R2V0Q291bnQoYXJyYXkpKTsKKyAgICBUU3RyaW5nQ29sbGVjdGlvbkNhbGxiYWNrQ29udGV4dCBjeCA9IHtidWZmZXIsIGZvcm1hdH07CisgICAgQ0ZBcnJheUFwcGx5RnVuY3Rpb24oYXJyYXksIGFsbCwgQXJyYXlCdWZmZXJBcHBlbmRDYWxsYmFjaywgJmN4KTsKKworICAgIFRTdHJpbmdJUmVwKiByZXAgPSBUU0lDVFN0cmluZ0NyZWF0ZVdpdGhEYXRhT2ZUeXBlQW5kRm9ybWF0KGJ1ZmZlciwga1RTSVRTdHJpbmdUYWdMaXN0LCBmb3JtYXQpOworICAgIENGUmVsZWFzZShidWZmZXIpOworICAgIENGUmVsZWFzZShhcnJheSk7CisgICAgcmV0dXJuIHJlcDsKK30KKworVFN0cmluZ0lSZXAqIFRTSUNUU3RyaW5nQ3JlYXRlV2l0aERpY3Rpb25hcnlBbmRGb3JtYXQoQ0ZEaWN0aW9uYXJ5UmVmIGRpY3Rpb25hcnksIFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KQoreworICAgIENGUmV0YWluKGRpY3Rpb25hcnkpOworCisgICAgQ0ZNdXRhYmxlRGF0YVJlZiBidWZmZXIgPSBDRkRhdGFDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsIDApOworCisgICAgVFN0cmluZ0NvbGxlY3Rpb25DYWxsYmFja0NvbnRleHQgY3ggPSB7YnVmZmVyLCBmb3JtYXR9OworICAgIENGRGljdGlvbmFyeUFwcGx5RnVuY3Rpb24oZGljdGlvbmFyeSwgRGljdGlvbmFyeUJ1ZmZlckFwcGVuZENhbGxiYWNrLCAmY3gpOworCisgICAgVFN0cmluZ0lSZXAqIHJlcCA9IFRTSUNUU3RyaW5nQ3JlYXRlV2l0aERhdGFPZlR5cGVBbmRGb3JtYXQoYnVmZmVyLCBrVFNJVFN0cmluZ1RhZ0RpY3QsIGZvcm1hdCk7CisgICAgQ0ZSZWxlYXNlKGJ1ZmZlcik7CisgICAgQ0ZSZWxlYXNlKGRpY3Rpb25hcnkpOworICAgIHJldHVybiByZXA7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9UU0lDVFN0cmluZy5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvVFNJQ1RTdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYwODVjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvVFNJQ1RTdHJpbmcuaApAQCAtMCwwICsxLDc0IEBACisvLworLy8gIFRTSUNUU3RyaW5nLmgKKy8vICBUU0lUU3RyaW5nCisvLworLy8gIENyZWF0ZWQgYnkgVHJhdmlzIFRpbGxleSBvbiA5LzI3LzExLgorLy8KKworI2lmbmRlZiBUU0lDVFN0cmluZ19ICisjZGVmaW5lIFRTSUNUU3RyaW5nX0gKKworI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBrVFNJVFN0cmluZ1RhZ1N0cmluZyAgID0gMCwKKyAgICBrVFNJVFN0cmluZ1RhZ051bWJlciAgID0gMSwKKyAgICBrVFNJVFN0cmluZ1RhZ0Zsb2F0ICAgID0gMiwKKyAgICBrVFNJVFN0cmluZ1RhZ0Jvb2wgICAgID0gMywKKyAgICBrVFNJVFN0cmluZ1RhZ051bGwgICAgID0gNCwKKyAgICBrVFNJVFN0cmluZ1RhZ0RpY3QgICAgID0gNSwKKyAgICBrVFNJVFN0cmluZ1RhZ0xpc3QgICAgID0gNiwKKyAgICBrVFNJVFN0cmluZ1RhZ0ludmFsaWQgID0gNywKK30gVFNJVFN0cmluZ1RhZzsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IFROZXRzdHJpbmdUeXBlczsKK2V4dGVybiBjb25zdCBjaGFyKiBjb25zdCBPVE5ldHN0cmluZ1R5cGVzOworZXh0ZXJuIGNvbnN0IFVJbnQ4IFROZXRzdHJpbmdTZXBhcmF0b3I7CisKK3R5cGVkZWYgZW51bSB7CisgICAga1RTSVRTdHJpbmdGb3JtYXREZWZhdWx0ICAgICAgICA9IDAsCisgICAga1RTSVRTdHJpbmdGb3JtYXRPVE5ldHN0cmluZyAgICA9IDEsCisgICAga1RTSVRTdHJpbmdGb3JtYXRUTmV0c3RyaW5nICAgICA9IDIsCit9IFRTSVRTdHJpbmdGb3JtYXQ7CisKK2V4dGVybiBUU0lUU3RyaW5nRm9ybWF0IFRTSVRTdHJpbmdEZWZhdWx0Rm9ybWF0OworCit0eXBlZGVmIHN0cnVjdCBUU0lUU3RyaW5nSW50ZXJtZWRpYXRlIHsKKyAgICBDRkRhdGFSZWYgICAgICAgICAgIGRhdGE7CisgICAgY2hhciogICAgICAgICAgICAgICBsZW5ndGg7CisgICAgVFNJVFN0cmluZ1RhZyAgICAgICB0eXBlOworICAgIFRTSVRTdHJpbmdGb3JtYXQgICAgZm9ybWF0OworfSBUU3RyaW5nSVJlcDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENGTXV0YWJsZURhdGFSZWYgICAgYnVmZmVyOworICAgIFRTSVRTdHJpbmdGb3JtYXQgICAgZm9ybWF0OworfSBUU3RyaW5nQ29sbGVjdGlvbkNhbGxiYWNrQ29udGV4dDsKKworCit2b2lkIEluaXRfVFNJQ1RTdHJpbmcodm9pZCk7CisKK3ZvaWQgVFNJQ1RTdHJpbmdTZXREZWZhdWx0Rm9ybWF0KFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KTsKK1RTSVRTdHJpbmdGb3JtYXQgVFNJQ1RTdHJpbmdHZXREZWZhdWx0Rm9ybWF0KHZvaWQpOworCit2b2lkIFRTSUNUU3RyaW5nRGVzdHJveShUU3RyaW5nSVJlcCogcmVwKTsKKworQ0ZEYXRhUmVmIFRTSUNUU3RyaW5nQ3JlYXRlUmVuZGVyZWREYXRhKFRTdHJpbmdJUmVwKiByZXApOworQ0ZEYXRhUmVmIFRTSUNUU3RyaW5nQ3JlYXRlUmVuZGVyZWREYXRhRnJvbU9iamVjdFdpdGhGb3JtYXQoQ0ZUeXBlUmVmIG9iamVjdCwgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpOworCitDRlN0cmluZ1JlZiBUU0lDVFN0cmluZ0NyZWF0ZVJlbmRlcmVkU3RyaW5nKFRTdHJpbmdJUmVwKiByZXApOworQ0ZTdHJpbmdSZWYgVFNJQ1RTdHJpbmdDcmVhdGVSZW5kZXJlZFN0cmluZ0Zyb21PYmplY3RXaXRoRm9ybWF0KENGVHlwZVJlZiBvYmplY3QsIFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KTsKKworVFN0cmluZ0lSZXAqIFRTSUNUU3RyaW5nQ3JlYXRlV2l0aE9iamVjdEFuZEZvcm1hdChDRlR5cGVSZWYgb2JqZWN0LCBUU0lUU3RyaW5nRm9ybWF0IGZvcm1hdCk7CitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVXaXRoU3RyaW5nQW5kRm9ybWF0KENGU3RyaW5nUmVmIHN0cmluZywgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpOworVFN0cmluZ0lSZXAqIFRTSUNUU3RyaW5nQ3JlYXRlV2l0aE51bWJlckFuZEZvcm1hdChDRk51bWJlclJlZiBudW1iZXIsIFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KTsKK1RTdHJpbmdJUmVwKiBUU0lDVFN0cmluZ0NyZWF0ZVRydWVXaXRoRm9ybWF0KFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KTsKK1RTdHJpbmdJUmVwKiBUU0lDVFN0cmluZ0NyZWF0ZUZhbHNlV2l0aEZvcm1hdChUU0lUU3RyaW5nRm9ybWF0IGZvcm1hdCk7CitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVOdWxsV2l0aEZvcm1hdChUU0lUU3RyaW5nRm9ybWF0IGZvcm1hdCk7CitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVJbnZhbGlkV2l0aEZvcm1hdChUU0lUU3RyaW5nRm9ybWF0IGZvcm1hdCk7CitUU3RyaW5nSVJlcCogVFNJQ1RTdHJpbmdDcmVhdGVXaXRoQXJyYXlBbmRGb3JtYXQoQ0ZBcnJheVJlZiBhcnJheSwgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpOworVFN0cmluZ0lSZXAqIFRTSUNUU3RyaW5nQ3JlYXRlV2l0aERpY3Rpb25hcnlBbmRGb3JtYXQoQ0ZEaWN0aW9uYXJ5UmVmIGRpY3Rpb25hcnksIFRTSVRTdHJpbmdGb3JtYXQgZm9ybWF0KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2V4dC9mc2V2ZW50X3dhdGNoL2NsaS5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzNmRkMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2V4dC9mc2V2ZW50X3dhdGNoL2NsaS5jCkBAIC0wLDAgKzEsMjAxIEBACisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSAiY2xpLmgiCisKK2NvbnN0IGNoYXIqIGNsaV9pbmZvX3B1cnBvc2UgPSAiQSBmbGV4aWJsZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGZvciB0aGUgRlNFdmVudHMgQVBJIjsKK2NvbnN0IGNoYXIqIGNsaV9pbmZvX3VzYWdlID0gIlVzYWdlOiBmc2V2ZW50X3dhdGNoIFtPUFRJT05TXS4uLiBbUEFUSFNdLi4uIjsKK2NvbnN0IGNoYXIqIGNsaV9pbmZvX2hlbHBbXSA9IHsKKyAgIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgICB5b3UncmUgbG9va2luZyBhdCBpdCIsCisgICIgIC1WLCAtLXZlcnNpb24gICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQiLAorICAiICAtcCwgLS1zaG93LXBsaXN0ICAgICAgICAgIGRpc3BsYXkgdGhlIGVtYmVkZGVkIEluZm8ucGxpc3QgdmFsdWVzIiwKKyAgIiAgLXMsIC0tc2luY2Utd2hlbj1FdmVudElEICBmaXJlIGhpc3RvcmljYWwgZXZlbnRzIHNpbmNlIElEIiwKKyAgIiAgLWwsIC0tbGF0ZW5jeT1zZWNvbmRzICAgICBsYXRlbmN5IHBlcmlvZCAoZGVmYXVsdD0nMC41JykiLAorICAiICAtbiwgLS1uby1kZWZlciAgICAgICAgICAgIGVuYWJsZSBuby1kZWZlciBsYXRlbmN5IG1vZGlmaWVyIiwKKyAgIiAgLXIsIC0td2F0Y2gtcm9vdCAgICAgICAgICB3YXRjaCBmb3Igd2hlbiB0aGUgcm9vdCBwYXRoIGhhcyBjaGFuZ2VkIiwKKyAgLy8gIiAgLWksIC0taWdub3JlLXNlbGYgICAgICAgICBpZ25vcmUgY3VycmVudCBwcm9jZXNzIiwKKyAgIiAgLUYsIC0tZmlsZS1ldmVudHMgICAgICAgICBwcm92aWRlIGZpbGUgbGV2ZWwgZXZlbnQgZGF0YSIsCisgICIgIC1mLCAtLWZvcm1hdD1uYW1lICAgICAgICAgb3V0cHV0IGZvcm1hdCAoY2xhc3NpYywgbml3LCBcbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bmV0c3RyaW5nLCBvdG5ldHN0cmluZykiLAorICAwCit9OworCitzdGF0aWMgdm9pZCBkZWZhdWx0X2FyZ3MgKHN0cnVjdCBjbGlfaW5mbyogYXJnc19pbmZvKQoreworICBhcmdzX2luZm8tPnNpbmNlX3doZW5fYXJnICAgICA9IGtGU0V2ZW50U3RyZWFtRXZlbnRJZFNpbmNlTm93OworICBhcmdzX2luZm8tPmxhdGVuY3lfYXJnICAgICAgICA9IDAuNTsKKyAgYXJnc19pbmZvLT5ub19kZWZlcl9mbGFnICAgICAgPSBmYWxzZTsKKyAgYXJnc19pbmZvLT53YXRjaF9yb290X2ZsYWcgICAgPSBmYWxzZTsKKyAgYXJnc19pbmZvLT5pZ25vcmVfc2VsZl9mbGFnICAgPSBmYWxzZTsKKyAgYXJnc19pbmZvLT5maWxlX2V2ZW50c19mbGFnICAgPSBmYWxzZTsKKyAgYXJnc19pbmZvLT5tYXJrX3NlbGZfZmxhZyAgICAgPSBmYWxzZTsKKyAgYXJnc19pbmZvLT5mb3JtYXRfYXJnICAgICAgICAgPSBrRlNFdmVudFdhdGNoT3V0cHV0Rm9ybWF0T1ROZXRzdHJpbmc7Cit9CisKK3N0YXRpYyB2b2lkIGNsaV9wYXJzZXJfcmVsZWFzZSAoc3RydWN0IGNsaV9pbmZvKiBhcmdzX2luZm8pCit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaT0wOyBpIDwgYXJnc19pbmZvLT5pbnB1dHNfbnVtOyArK2kpIHsKKyAgICBmcmVlKGFyZ3NfaW5mby0+aW5wdXRzW2ldKTsKKyAgfQorCisgIGlmIChhcmdzX2luZm8tPmlucHV0c19udW0pIHsKKyAgICBmcmVlKGFyZ3NfaW5mby0+aW5wdXRzKTsKKyAgfQorCisgIGFyZ3NfaW5mby0+aW5wdXRzX251bSA9IDA7Cit9CisKK3ZvaWQgY2xpX3BhcnNlcl9pbml0IChzdHJ1Y3QgY2xpX2luZm8qIGFyZ3NfaW5mbykKK3sKKyAgZGVmYXVsdF9hcmdzKGFyZ3NfaW5mbyk7CisKKyAgYXJnc19pbmZvLT5pbnB1dHMgPSAwOworICBhcmdzX2luZm8tPmlucHV0c19udW0gPSAwOworfQorCit2b2lkIGNsaV9wYXJzZXJfZnJlZSAoc3RydWN0IGNsaV9pbmZvKiBhcmdzX2luZm8pCit7CisgIGNsaV9wYXJzZXJfcmVsZWFzZShhcmdzX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBjbGlfcHJpbnRfaW5mb19kaWN0IChjb25zdCB2b2lkICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisgIENGU3RyaW5nUmVmIGVudHJ5ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoRm9ybWF0KE5VTEwsIE5VTEwsCisgICAgQ0ZTVFIoIiVAOlxuICAlQCIpLCBrZXksIHZhbHVlKTsKKyAgaWYgKGVudHJ5KSB7CisgICAgQ0ZTaG93KGVudHJ5KTsKKyAgICBDRlJlbGVhc2UoZW50cnkpOworICB9Cit9CisKK3ZvaWQgY2xpX3Nob3dfcGxpc3QgKHZvaWQpCit7CisgIENGQnVuZGxlUmVmIG1haW5CdW5kbGUgPSBDRkJ1bmRsZUdldE1haW5CdW5kbGUoKTsKKyAgQ0ZSZXRhaW4obWFpbkJ1bmRsZSk7CisgIENGRGljdGlvbmFyeVJlZiBtYWluQnVuZGxlRGljdCA9IENGQnVuZGxlR2V0SW5mb0RpY3Rpb25hcnkobWFpbkJ1bmRsZSk7CisgIGlmIChtYWluQnVuZGxlRGljdCkgeworICAgIENGUmV0YWluKG1haW5CdW5kbGVEaWN0KTsKKyAgICBwcmludGYoIkVtYmVkZGVkIEluZm8ucGxpc3QgbWV0YWRhdGE6XG5cbiIpOworICAgIENGRGljdGlvbmFyeUFwcGx5RnVuY3Rpb24obWFpbkJ1bmRsZURpY3QsIGNsaV9wcmludF9pbmZvX2RpY3QsIE5VTEwpOworICAgIENGUmVsZWFzZShtYWluQnVuZGxlRGljdCk7CisgIH0KKyAgQ0ZSZWxlYXNlKG1haW5CdW5kbGUpOworICBwcmludGYoIlxuIik7Cit9CisKK3ZvaWQgY2xpX3ByaW50X3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZigiJXMgJXNcblxuIiwgQ0xJX05BTUUsIENMSV9WRVJTSU9OKTsKKyNpZmRlZiBDT01QSUxFRF9BVAorICBwcmludGYoIkNvbXBpbGVkIGF0OiAgICAlc1xuIiwgQ09NUElMRURfQVQpOworI2VuZGlmCisjaWZkZWYgQ09NUElMRVIKKyAgcHJpbnRmKCJDb21waWxlZCB3aXRoOiAgJXNcbiIsIENPTVBJTEVSKTsKKyNlbmRpZgorI2lmZGVmIFRBUkdFVF9DUFUKKyAgcHJpbnRmKCJDb21waWxlZCBmb3I6ICAgJXNcbiIsIFRBUkdFVF9DUFUpOworI2VuZGlmCisgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCBjbGlfcHJpbnRfaGVscCAodm9pZCkKK3sKKyAgY2xpX3ByaW50X3ZlcnNpb24oKTsKKworICBwcmludGYoIlxuJXNcbiIsIGNsaV9pbmZvX3B1cnBvc2UpOworICBwcmludGYoIlxuJXNcbiIsIGNsaV9pbmZvX3VzYWdlKTsKKyAgcHJpbnRmKCJcbiIpOworCisgIGludCBpID0gMDsKKyAgd2hpbGUgKGNsaV9pbmZvX2hlbHBbaV0pIHsKKyAgICBwcmludGYoIiVzXG4iLCBjbGlfaW5mb19oZWxwW2krK10pOworICB9Cit9CisKK2ludCBjbGlfcGFyc2VyIChpbnQgYXJnYywgY29uc3QgY2hhcioqIGFyZ3YsIHN0cnVjdCBjbGlfaW5mbyogYXJnc19pbmZvKQoreworICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0geworICAgIHsgImhlbHAiLCAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ2gnIH0sCisgICAgeyAidmVyc2lvbiIsICAgICAgbm9fYXJndW1lbnQsICAgICAgICBOVUxMLCAnVicgfSwKKyAgICB7ICJzaG93LXBsaXN0IiwgICBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICdwJyB9LAorICAgIHsgInNpbmNlLXdoZW4iLCAgIHJlcXVpcmVkX2FyZ3VtZW50LCAgTlVMTCwgJ3MnIH0sCisgICAgeyAibGF0ZW5jeSIsICAgICAgcmVxdWlyZWRfYXJndW1lbnQsICBOVUxMLCAnbCcgfSwKKyAgICB7ICJuby1kZWZlciIsICAgICBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICduJyB9LAorICAgIHsgIndhdGNoLXJvb3QiLCAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ3InIH0sCisgICAgeyAiaWdub3JlLXNlbGYiLCAgbm9fYXJndW1lbnQsICAgICAgICBOVUxMLCAnaScgfSwKKyAgICB7ICJmaWxlLWV2ZW50cyIsICBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICdGJyB9LAorICAgIHsgIm1hcmstc2VsZiIsICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ20nIH0sCisgICAgeyAiZm9ybWF0IiwgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsICBOVUxMLCAnZicgfSwKKyAgICB7IDAsIDAsIDAsIDAgfQorICB9OworCisgIGNvbnN0IGNoYXIqIHNob3J0b3B0cyA9ICJoVnBzOmw6bnJpRmY6IjsKKworICBpbnQgYyA9IC0xOworCisgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIChjaGFyICogY29uc3QqKWFyZ3YsIHNob3J0b3B0cywgbG9uZ29wdHMsIE5VTEwpKSAhPSAtMSkgeworICAgIHN3aXRjaChjKSB7CisgICAgY2FzZSAncyc6IC8vIHNpbmNlLXdoZW4KKyAgICAgIGFyZ3NfaW5mby0+c2luY2Vfd2hlbl9hcmcgPSBzdHJ0b3VsbChvcHRhcmcsIE5VTEwsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6IC8vIGxhdGVuY3kKKyAgICAgIGFyZ3NfaW5mby0+bGF0ZW5jeV9hcmcgPSBzdHJ0b2Qob3B0YXJnLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ24nOiAvLyBuby1kZWZlcgorICAgICAgYXJnc19pbmZvLT5ub19kZWZlcl9mbGFnID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3InOiAvLyB3YXRjaC1yb290CisgICAgICBhcmdzX2luZm8tPndhdGNoX3Jvb3RfZmxhZyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdpJzogLy8gaWdub3JlLXNlbGYKKyAgICAgIGFyZ3NfaW5mby0+aWdub3JlX3NlbGZfZmxhZyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdGJzogLy8gZmlsZS1ldmVudHMKKyAgICAgIGFyZ3NfaW5mby0+ZmlsZV9ldmVudHNfZmxhZyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogLy8gbWFyay1zZWxmCisgICAgICBhcmdzX2luZm8tPm1hcmtfc2VsZl9mbGFnID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2YnOiAvLyBmb3JtYXQKKyAgICAgIGlmIChzdHJjbXAob3B0YXJnLCAiY2xhc3NpYyIpID09IDApIHsKKyAgICAgICAgYXJnc19pbmZvLT5mb3JtYXRfYXJnID0ga0ZTRXZlbnRXYXRjaE91dHB1dEZvcm1hdENsYXNzaWM7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJuaXciKSA9PSAwKSB7CisgICAgICAgIGFyZ3NfaW5mby0+Zm9ybWF0X2FyZyA9IGtGU0V2ZW50V2F0Y2hPdXRwdXRGb3JtYXROSVc7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJ0bmV0c3RyaW5nIikgPT0gMCkgeworICAgICAgICBhcmdzX2luZm8tPmZvcm1hdF9hcmcgPSBrRlNFdmVudFdhdGNoT3V0cHV0Rm9ybWF0VE5ldHN0cmluZzsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIm90bmV0c3RyaW5nIikgPT0gMCkgeworICAgICAgICBhcmdzX2luZm8tPmZvcm1hdF9hcmcgPSBrRlNFdmVudFdhdGNoT3V0cHV0Rm9ybWF0T1ROZXRzdHJpbmc7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3V0cHV0IGZvcm1hdDogJXNcbiIsIG9wdGFyZyk7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1YnOiAvLyB2ZXJzaW9uCisgICAgICBjbGlfcHJpbnRfdmVyc2lvbigpOworICAgICAgZXhpdChFWElUX1NVQ0NFU1MpOworICAgIGNhc2UgJ3AnOiAvLyBzaG93LXBsaXN0CisgICAgICBjbGlfc2hvd19wbGlzdCgpOworICAgICAgZXhpdChFWElUX1NVQ0NFU1MpOworICAgIGNhc2UgJ2gnOiAvLyBoZWxwCisgICAgY2FzZSAnPyc6IC8vIGludmFsaWQgb3B0aW9uCisgICAgY2FzZSAnOic6IC8vIG1pc3NpbmcgYXJndW1lbnQKKyAgICAgIGNsaV9wcmludF9oZWxwKCk7CisgICAgICBleGl0KChjID09ICdoJykgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfQorCisgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgaW50IGkgPSAwOworICAgIGFyZ3NfaW5mby0+aW5wdXRzX251bSA9ICh1bnNpZ25lZCBpbnQpKGFyZ2MgLSBvcHRpbmQpOworICAgIGFyZ3NfaW5mby0+aW5wdXRzID0KKyAgICAgIChjaGFyKiopKG1hbGxvYyAoKGFyZ3NfaW5mby0+aW5wdXRzX251bSkqc2l6ZW9mKGNoYXIqKSkpOworICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQorICAgICAgaWYgKGFyZ3Zbb3B0aW5kKytdICE9IGFyZ3ZbMF0pIHsKKyAgICAgICAgYXJnc19pbmZvLT5pbnB1dHNbaSsrXSA9IHN0cmR1cChhcmd2W29wdGluZC0xXSk7CisgICAgICB9CisgIH0KKworICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvY2xpLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTY0OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvY2xpLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBDTElfSAorI2RlZmluZSBDTElfSAorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpZm5kZWYgQ0xJX05BTUUKKyNkZWZpbmUgQ0xJX05BTUUgImZzZXZlbnRfd2F0Y2giCisjZW5kaWYgLyogQ0xJX05BTUUgKi8KKworI2lmbmRlZiBQUk9KRUNUX1ZFUlNJT04KKyNlcnJvciAiUFJPSkVDVF9WRVJTSU9OIG5vdCBzZXQiCisjZW5kaWYgLyogUFJPSkVDVF9WRVJTSU9OICovCisKKyNpZm5kZWYgQ0xJX1ZFUlNJT04KKyNkZWZpbmUgQ0xJX1ZFUlNJT04gX3hzdHIoUFJPSkVDVF9WRVJTSU9OKQorI2VuZGlmIC8qIENMSV9WRVJTSU9OICovCisKKworc3RydWN0IGNsaV9pbmZvIHsKKyAgVUludDY0IHNpbmNlX3doZW5fYXJnOworICBkb3VibGUgbGF0ZW5jeV9hcmc7CisgIGJvb2wgbm9fZGVmZXJfZmxhZzsKKyAgYm9vbCB3YXRjaF9yb290X2ZsYWc7CisgIGJvb2wgaWdub3JlX3NlbGZfZmxhZzsKKyAgYm9vbCBmaWxlX2V2ZW50c19mbGFnOworICBib29sIG1hcmtfc2VsZl9mbGFnOworICBlbnVtIEZTRXZlbnRXYXRjaE91dHB1dEZvcm1hdCBmb3JtYXRfYXJnOworCisgIGNoYXIqKiBpbnB1dHM7CisgIHVuc2lnbmVkIGlucHV0c19udW07Cit9OworCitleHRlcm4gY29uc3QgY2hhciogY2xpX2luZm9fcHVycG9zZTsKK2V4dGVybiBjb25zdCBjaGFyKiBjbGlfaW5mb191c2FnZTsKK2V4dGVybiBjb25zdCBjaGFyKiBjbGlfaW5mb19oZWxwW107CisKK3ZvaWQgY2xpX3ByaW50X2hlbHAodm9pZCk7Cit2b2lkIGNsaV9wcmludF92ZXJzaW9uKHZvaWQpOworCitpbnQgY2xpX3BhcnNlciAoaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2LCBzdHJ1Y3QgY2xpX2luZm8qIGFyZ3NfaW5mbyk7Cit2b2lkIGNsaV9wYXJzZXJfaW5pdCAoc3RydWN0IGNsaV9pbmZvKiBhcmdzX2luZm8pOwordm9pZCBjbGlfcGFyc2VyX2ZyZWUgKHN0cnVjdCBjbGlfaW5mbyogYXJnc19pbmZvKTsKKworCisjZW5kaWYgLyogQ0xJX0ggKi8KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2V4dC9mc2V2ZW50X3dhdGNoL2NvbW1vbi5oIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkM2U0ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2V4dC9mc2V2ZW50X3dhdGNoL2NvbW1vbi5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgZnNldmVudF93YXRjaF9jb21tb25faAorI2RlZmluZSBmc2V2ZW50X3dhdGNoX2NvbW1vbl9oCisKKyNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2lmZGVmIF9fT0JKQ19fCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImRlZmluZXMuaCIKKyNpbmNsdWRlICJUU0lDVFN0cmluZy5oIgorCitlbnVtIEZTRXZlbnRXYXRjaE91dHB1dEZvcm1hdCB7CisgIGtGU0V2ZW50V2F0Y2hPdXRwdXRGb3JtYXRDbGFzc2ljLAorICBrRlNFdmVudFdhdGNoT3V0cHV0Rm9ybWF0TklXLAorICBrRlNFdmVudFdhdGNoT3V0cHV0Rm9ybWF0VE5ldHN0cmluZywKKyAga0ZTRXZlbnRXYXRjaE91dHB1dEZvcm1hdE9UTmV0c3RyaW5nCit9OworCisjZW5kaWYgLyogZnNldmVudF93YXRjaF9jb21tb25faCAqLwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvY29tcGF0LmMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjUxYmFmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvY29tcGF0LmMKQEAgLTAsMCArMSw0MSBAQAorI2luY2x1ZGUgImNvbXBhdC5oIgorCisKKyNpZiAoZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEKSAmJiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgX19NQUNfMTBfNikgfHwgXAorICAgIChkZWZpbmVkKF9fSVBIT05FX09TX1ZFUlNJT05fTUFYX0FMTE9XRUQpICYmIF9fSVBIT05FX09TX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCBfX0lQSE9ORV82XzApCitGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ3MgIGtGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ0lnbm9yZVNlbGYgICAgICAgID0gMHgwMDAwMDAwODsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCkgJiYgTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IF9fTUFDXzEwXzcpIHx8IFwKKyAgICAoZGVmaW5lZChfX0lQSE9ORV9PU19WRVJTSU9OX01BWF9BTExPV0VEKSAmJiBfX0lQSE9ORV9PU19WRVJTSU9OX01BWF9BTExPV0VEIDwgX19JUEhPTkVfNl8wKQorRlNFdmVudFN0cmVhbUNyZWF0ZUZsYWdzICBrRlNFdmVudFN0cmVhbUNyZWF0ZUZsYWdGaWxlRXZlbnRzICAgICAgICA9IDB4MDAwMDAwMTA7CitGU0V2ZW50U3RyZWFtRXZlbnRGbGFncyAgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUNyZWF0ZWQgICAgICAgID0gMHgwMDAwMDEwMDsKK0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdzICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtUmVtb3ZlZCAgICAgICAgPSAweDAwMDAwMjAwOworRlNFdmVudFN0cmVhbUV2ZW50RmxhZ3MgICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jbm9kZU1ldGFNb2QgICA9IDB4MDAwMDA0MDA7CitGU0V2ZW50U3RyZWFtRXZlbnRGbGFncyAgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbVJlbmFtZWQgICAgICAgID0gMHgwMDAwMDgwMDsKK0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdzICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtTW9kaWZpZWQgICAgICAgPSAweDAwMDAxMDAwOworRlNFdmVudFN0cmVhbUV2ZW50RmxhZ3MgICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1GaW5kZXJJbmZvTW9kICA9IDB4MDAwMDIwMDA7CitGU0V2ZW50U3RyZWFtRXZlbnRGbGFncyAgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUNoYW5nZU93bmVyICAgID0gMHgwMDAwNDAwMDsKK0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdzICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtWGF0dHJNb2QgICAgICAgPSAweDAwMDA4MDAwOworRlNFdmVudFN0cmVhbUV2ZW50RmxhZ3MgICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jc0ZpbGUgICAgICAgICA9IDB4MDAwMTAwMDA7CitGU0V2ZW50U3RyZWFtRXZlbnRGbGFncyAgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUlzRGlyICAgICAgICAgID0gMHgwMDAyMDAwMDsKK0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdzICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSXNTeW1saW5rICAgICAgPSAweDAwMDQwMDAwOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEKSAmJiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgX19NQUNfMTBfOSkgfHwgXAorICAgIChkZWZpbmVkKF9fSVBIT05FX09TX1ZFUlNJT05fTUFYX0FMTE9XRUQpICYmIF9fSVBIT05FX09TX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCBfX0lQSE9ORV83XzApCitGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ3MgIGtGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ01hcmtTZWxmICAgICAgICAgID0gMHgwMDAwMDAyMDsKK0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdzICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdPd25FdmVudCAgICAgICAgICAgPSAweDAwMDgwMDAwOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEKSAmJiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgX19NQUNfMTBfMTApIHx8IFwKKyAgICAoZGVmaW5lZChfX0lQSE9ORV9PU19WRVJTSU9OX01BWF9BTExPV0VEKSAmJiBfX0lQSE9ORV9PU19WRVJTSU9OX01BWF9BTExPV0VEIDwgX19JUEhPTkVfOV8wKQorRlNFdmVudFN0cmVhbUV2ZW50RmxhZ3MgICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jc0hhcmRsaW5rICAgICA9IDB4MDAxMDAwMDA7CitGU0V2ZW50U3RyZWFtRXZlbnRGbGFncyAgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUlzTGFzdEhhcmRsaW5rID0gMHgwMDIwMDAwMDsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCkgJiYgTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IF9fTUFDXzEwXzEzKSB8fCBcCisgICAgKGRlZmluZWQoX19JUEhPTkVfT1NfVkVSU0lPTl9NQVhfQUxMT1dFRCkgJiYgX19JUEhPTkVfT1NfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IF9fSVBIT05FXzExXzApCitGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ3MgIGtGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ1VzZUV4dGVuZGVkRGF0YSAgID0gMHgwMDAwMDA0MDsKK0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdzICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtQ2xvbmVkICAgICAgICAgPSAweDAwNDAwMDAwOworI2VuZGlmCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9jb21wYXQuaCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2V4dC9mc2V2ZW50X3dhdGNoL2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2I0MTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9jb21wYXQuaApAQCAtMCwwICsxLDEwMCBAQAorLyoqCisgKiBAaGVhZGVyZmlsZSBjb21wYXQuaAorICogRlNFdmVudFN0cmVhbSBmbGFnIGNvbXBhdGliaWxpdHkgc2hpbQorICoKKyAqIEluIG9yZGVyIHRvIGNvbXBpbGUgYSBiaW5hcnkgYWdhaW5zdCBhbiBvbGRlciBTREsgeWV0IHN0aWxsIHN1cHBvcnQgdGhlCisgKiBmZWF0dXJlcyBwcmVzZW50IGluIGxhdGVyIE9TIHJlbGVhc2VzLCB3ZSBuZWVkIHRvIGRlZmluZSBhbnkgbWlzc2luZyBlbnVtCisgKiBjb25zdGFudHMgbm90IHByZXNlbnQgaW4gdGhlIG9sZGVyIFNESy4gVGhpcyBhbGxvd3MgdXMgdG8gc2FmZWx5IGRlZmVyCisgKiBmZWF0dXJlIGRldGVjdGlvbiB0byBydW50aW1lIChhbmQgYXZvaWQgcmVjb21waWxhdGlvbikuCisgKi8KKworCisjaWZuZGVmIGxpc3Rlbl9mc2V2ZW50c19jb21wYXRfaAorI2RlZmluZSBsaXN0ZW5fZnNldmVudHNfY29tcGF0X2gKKworI2lmbmRlZiBfX0NPUkVTRVJWSUNFU19fCisjaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2VuZGlmIC8vIF9fQ09SRVNFUlZJQ0VTX18KKworI2lmbmRlZiBfX0FWQUlMQUJJTElUWV9fCisjaW5jbHVkZSA8QXZhaWxhYmlsaXR5Lmg+CisjZW5kaWYgLy8gX19BVkFJTEFCSUxJVFlfXworCisjaWZuZGVmIF9fTUFDXzEwXzYKKyNkZWZpbmUgX19NQUNfMTBfNiAgICAgICAgICAgIDEwNjAKKyNlbmRpZgorI2lmbmRlZiBfX01BQ18xMF83CisjZGVmaW5lIF9fTUFDXzEwXzcgICAgICAgICAgICAxMDcwCisjZW5kaWYKKyNpZm5kZWYgX19NQUNfMTBfOQorI2RlZmluZSBfX01BQ18xMF85ICAgICAgICAgICAgMTA5MAorI2VuZGlmCisjaWZuZGVmIF9fTUFDXzEwXzEwCisjZGVmaW5lIF9fTUFDXzEwXzEwICAgICAgICAgMTAxMDAwCisjZW5kaWYKKyNpZm5kZWYgX19NQUNfMTBfMTMKKyNkZWZpbmUgX19NQUNfMTBfMTMgICAgICAgICAxMDEzMDAKKyNlbmRpZgorI2lmbmRlZiBfX0lQSE9ORV82XzAKKyNkZWZpbmUgX19JUEhPTkVfNl8wICAgICAgICAgNjAwMDAKKyNlbmRpZgorI2lmbmRlZiBfX0lQSE9ORV83XzAKKyNkZWZpbmUgX19JUEhPTkVfN18wICAgICAgICAgNzAwMDAKKyNlbmRpZgorI2lmbmRlZiBfX0lQSE9ORV85XzAKKyNkZWZpbmUgX19JUEhPTkVfOV8wICAgICAgICAgOTAwMDAKKyNlbmRpZgorI2lmbmRlZiBfX0lQSE9ORV8xMV8wCisjZGVmaW5lIF9fSVBIT05FXzExXzAgICAgICAgMTEwMDAwCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNpZiAoZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEKSAmJiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgX19NQUNfMTBfNikgfHwgXAorICAgIChkZWZpbmVkKF9fSVBIT05FX09TX1ZFUlNJT05fTUFYX0FMTE9XRUQpICYmIF9fSVBIT05FX09TX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCBfX0lQSE9ORV82XzApCitleHRlcm4gRlNFdmVudFN0cmVhbUNyZWF0ZUZsYWdzIGtGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ0lnbm9yZVNlbGY7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQpICYmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCBfX01BQ18xMF83KSB8fCBcCisgICAgKGRlZmluZWQoX19JUEhPTkVfT1NfVkVSU0lPTl9NQVhfQUxMT1dFRCkgJiYgX19JUEhPTkVfT1NfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IF9fSVBIT05FXzZfMCkKK2V4dGVybiBGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ3Mga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnRmlsZUV2ZW50czsKK2V4dGVybiBGU0V2ZW50U3RyZWFtRXZlbnRGbGFncyAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtQ3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtUmVtb3ZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSW5vZGVNZXRhTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1SZW5hbWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Nb2RpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtRmluZGVySW5mb01vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtQ2hhbmdlT3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbVhhdHRyTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jc0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUlzRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jc1N5bWxpbms7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQpICYmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCBfX01BQ18xMF85KSB8fCBcCisgICAgKGRlZmluZWQoX19JUEhPTkVfT1NfVkVSU0lPTl9NQVhfQUxMT1dFRCkgJiYgX19JUEhPTkVfT1NfVkVSU0lPTl9NQVhfQUxMT1dFRCA8IF9fSVBIT05FXzdfMCkKK2V4dGVybiBGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ3Mga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnTWFya1NlbGY7CitleHRlcm4gRlNFdmVudFN0cmVhbUV2ZW50RmxhZ3MgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnT3duRXZlbnQ7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQpICYmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCBfX01BQ18xMF8xMCkgfHwgXAorICAgIChkZWZpbmVkKF9fSVBIT05FX09TX1ZFUlNJT05fTUFYX0FMTE9XRUQpICYmIF9fSVBIT05FX09TX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCBfX0lQSE9ORV85XzApCitleHRlcm4gRlNFdmVudFN0cmVhbUV2ZW50RmxhZ3MgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUlzSGFyZGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUlzTGFzdEhhcmRsaW5rOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEKSAmJiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgX19NQUNfMTBfMTMpIHx8IFwKKyAgICAoZGVmaW5lZChfX0lQSE9ORV9PU19WRVJTSU9OX01BWF9BTExPV0VEKSAmJiBfX0lQSE9ORV9PU19WRVJTSU9OX01BWF9BTExPV0VEIDwgX19JUEhPTkVfMTFfMCkKK2V4dGVybiBGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ3Mga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnVXNlRXh0ZW5kZWREYXRhOworZXh0ZXJuIEZTRXZlbnRTdHJlYW1FdmVudEZsYWdzICBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1DbG9uZWQ7CisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gbGlzdGVuX2ZzZXZlbnRzX2NvbXBhdF9oCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9kZWZpbmVzLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9kZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2ZTg3YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2V4dC9mc2V2ZW50X3dhdGNoL2RlZmluZXMuaApAQCAtMCwwICsxLDQwIEBACisjaWZuZGVmIGZzZXZlbnRfd2F0Y2hfZGVmaW5lc19oCisjZGVmaW5lIGZzZXZlbnRfd2F0Y2hfZGVmaW5lc19oCisKKyNkZWZpbmUgX3N0cihzKSAjcworI2RlZmluZSBfeHN0cihzKSBfc3RyKHMpCisKKyNkZWZpbmUgQ09NUElMRURfQVQgX19EQVRFX18gIiAiIF9fVElNRV9fCisKKyNpZiBkZWZpbmVkIChfX2NsYW5nX18pCisjZGVmaW5lIENPTVBJTEVSICJjbGFuZyAiIF9fY2xhbmdfdmVyc2lvbl9fCisjZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgQ09NUElMRVIgImdjYyAiIF9fVkVSU0lPTl9fCisjZWxzZQorI2RlZmluZSBDT01QSUxFUiAidW5rbm93biIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3BwY19fKQorI2RlZmluZSBUQVJHRVRfQ1BVICJwcGMiCisjZWxpZiBkZWZpbmVkKF9fcHBjNjRfXykKKyNkZWZpbmUgVEFSR0VUX0NQVSAicHBjNjQiCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBUQVJHRVRfQ1BVICJpMzg2IgorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBUQVJHRVRfQ1BVICJ4ODZfNjQiCisjZWxzZQorI2RlZmluZSBUQVJHRVRfQ1BVICJ1bmtub3duIgorI2VuZGlmCisKKyNkZWZpbmUgRkxBR19DSEVDSyhmbGFncywgZmxhZykgKChmbGFncykgJiAoZmxhZykpCisKKyNkZWZpbmUgRlBSSU5URl9GTEFHX0NIRUNLKGZsYWdzLCBmbGFnLCBtc2csIGZkKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEZMQUdfQ0hFQ0soZmxhZ3MsIGZsYWcpKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoZmQsICIlcyIsIG1zZyAiXG4iKTsgfSB9ICAgICAgICAgICAgXAorICB3aGlsZSAoMCkKKworI2RlZmluZSBGTEFHX0NIRUNLX1NUREVSUihmbGFncywgZmxhZywgbXNnKSAgICAgICBcCisgICAgICAgIEZQUklOVEZfRkxBR19DSEVDSyhmbGFncywgZmxhZywgbXNnLCBzdGRlcnIpCisKKyNlbmRpZiAvKiBmc2V2ZW50X3dhdGNoX2RlZmluZXNfaCAqLwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvbWFpbi5jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxODU5NmEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9tYWluLmMKQEAgLTAsMCArMSw1NDggQEAKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJzaWduYWxfaGFuZGxlcnMuaCIKKyNpbmNsdWRlICJjbGkuaCIKKyNpbmNsdWRlICJGU0V2ZW50c0ZpeC5oIgorCisvLyBUT0RPOiBzZXQgb24gZmlyZS4gY2xpLntoLGN9IGhhbmRsZSBib3RoIHBhcnNpbmcgYW5kIGRlZmF1bHRzLCBzbyB0aGVyZSdzCisvLyAgICAgICBubyBuZWVkIHRvIHNldCB0aG9zZSBoZXJlLiBhbHNvLCBpbiBvcmRlciB0byBzY29wZSBtZXRhZGF0YSBieSBwYXRoLAorLy8gICAgICAgZWFjaCBzdHJlYW0gd2lsbCBuZWVkIGl0cyBvd24gY29uZmlndXJhdGlvbi4uLiBzbyB0aGlzIHdvbid0IHdvcmsgYXMKKy8vICAgICAgIGEgZ2xvYmFsIGFueSBtb3JlLiBJbiB0aGUgZW5kIHRoZSBnb2FsIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmb3JtYXQKKy8vICAgICAgIGFibGUgdG8gZGVjbGFyZSBub3QganVzdCB0aGF0IHNvbWV0aGluZyBoYXBwZW5lZCBhbmQgd2hhdCBmbGFncyB3ZXJlCisvLyAgICAgICBhdHRhY2hlZCwgYnV0IHdoYXQgcGF0aCBpdCB3YXMgd2F0Y2hpbmcgdGhhdCBjYXVzZWQgdGhvc2UgZXZlbnRzIChzbworLy8gICAgICAgdGhhdCB0aGUgcGF0aCBpdHNlbGYgY2FuIGJlIHVzZWQgZm9yIHJvdXRpbmcgdGhhdCBpbmZvcm1hdGlvbiB0byB0aGUKKy8vICAgICAgIHJlbGV2YW50IGNhbGxiYWNrKS4KKy8vCisvLyBTdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgbWV0YWRhdGEgcGFyc2VkIGZyb20gdGhlIGNvbW1hbmRsaW5lCitzdGF0aWMgc3RydWN0IHsKKyAgRlNFdmVudFN0cmVhbUV2ZW50SWQgICAgICAgICAgICBzaW5jZVdoZW47CisgIENGVGltZUludGVydmFsICAgICAgICAgICAgICAgICAgbGF0ZW5jeTsKKyAgRlNFdmVudFN0cmVhbUNyZWF0ZUZsYWdzICAgICAgICBmbGFnczsKKyAgQ0ZNdXRhYmxlQXJyYXlSZWYgICAgICAgICAgICAgICBwYXRoczsKKyAgZW51bSBGU0V2ZW50V2F0Y2hPdXRwdXRGb3JtYXQgICBmb3JtYXQ7Cit9IGNvbmZpZyA9IHsKKyAgKFVJbnQ2NCkga0ZTRXZlbnRTdHJlYW1FdmVudElkU2luY2VOb3csCisgIChkb3VibGUpIDAuMywKKyAgKENGT3B0aW9uRmxhZ3MpIGtGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ05vbmUsCisgIE5VTEwsCisgIGtGU0V2ZW50V2F0Y2hPdXRwdXRGb3JtYXRPVE5ldHN0cmluZworfTsKKworLy8gUHJvdG90eXBlcworc3RhdGljIHZvaWQgICAgICAgICBhcHBlbmRfcGF0aChjb25zdCBjaGFyKiBwYXRoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAgcGFyc2VfY2xpX3NldHRpbmdzKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pOworc3RhdGljIHZvaWQgICAgICAgICBjYWxsYmFjayhGU0V2ZW50U3RyZWFtUmVmIHN0cmVhbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2xpZW50Q2FsbEJhY2tJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBldmVudFBhdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU0V2ZW50U3RyZWFtRXZlbnRGbGFncyBldmVudEZsYWdzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTRXZlbnRTdHJlYW1FdmVudElkIGV2ZW50SWRzW10pOworc3RhdGljIGJvb2wgbmVlZHNfZnNldmVudHNfZml4ID0gZmFsc2U7CisKKy8vIFJlc29sdmUgYSBwYXRoIGFuZCBhcHBlbmQgaXQgdG8gdGhlIENMSSBzZXR0aW5ncyBzdHJ1Y3R1cmUKKy8vIFRoZSBGU0V2ZW50cyBBUEkgd2lsbCwgaW50ZXJuYWxseSwgcmVzb2x2ZSBwYXRocyB1c2luZyBhIHNpbWlsYXIgc2NoZW1lLgorLy8gUGVyZm9ybWluZyB0aGlzIGFoZWFkIG9mIHRpbWUgbWFrZXMgdGhpbmdzIGxlc3MgY29uZnVzaW5nLCBJTUhPLgorc3RhdGljIHZvaWQgYXBwZW5kX3BhdGgoY29uc3QgY2hhciogcGF0aCkKK3sKKyNpZmRlZiBERUJVRworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiYXBwZW5kX3BhdGggY2FsbGVkIGZvcjogJXNcbiIsIHBhdGgpOworI2VuZGlmCisKKyNpZiBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSAxMDYwCisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmKHN0ZGVyciwgImNvbXBpbGVkIGFnYWluc3QgMTAuNissIHVzaW5nIENGVVJMQ3JlYXRlRmlsZVJlZmVyZW5jZVVSTFxuIik7CisjZW5kaWYKKworICBDRlVSTFJlZiB1cmwgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oTlVMTCwgKGNvbnN0IFVJbnQ4KilwYXRoLCAoQ0ZJbmRleClzdHJsZW4ocGF0aCksIGZhbHNlKTsKKyAgQ0ZVUkxSZWYgcGxhY2Vob2xkZXIgPSBDRlVSTENvcHlBYnNvbHV0ZVVSTCh1cmwpOworICBDRlJlbGVhc2UodXJsKTsKKworICBDRk11dGFibGVBcnJheVJlZiBpbWFnaW5hcnkgPSBOVUxMOworCisgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdXJsLCBzcGluIHVudGlsIHdlIGdldCB0byBhIHBhcmVudCB0aGF0CisgIC8vIGRvZXMgZXhpc3QsIHNhdmluZyBhbnkgaW1hZ2luYXJ5IGNvbXBvbmVudHMgZm9yIGFwcGVuZGluZyBiYWNrIGxhdGVyCisgIHdoaWxlKCFDRlVSTFJlc291cmNlSXNSZWFjaGFibGUocGxhY2Vob2xkZXIsIE5VTEwpKSB7CisjaWZkZWYgREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgInBhdGggZG9lcyBub3QgZXhpc3RcbiIpOworI2VuZGlmCisKKyAgICBDRlN0cmluZ1JlZiBjaGlsZDsKKworICAgIGlmIChpbWFnaW5hcnkgPT0gTlVMTCkgeworICAgICAgaW1hZ2luYXJ5ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGUoTlVMTCwgMCwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CisgICAgfQorCisgICAgY2hpbGQgPSBDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudChwbGFjZWhvbGRlcik7CisgICAgQ0ZBcnJheUluc2VydFZhbHVlQXRJbmRleChpbWFnaW5hcnksIDAsIGNoaWxkKTsKKyAgICBDRlJlbGVhc2UoY2hpbGQpOworCisgICAgdXJsID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudChOVUxMLCBwbGFjZWhvbGRlcik7CisgICAgQ0ZSZWxlYXNlKHBsYWNlaG9sZGVyKTsKKyAgICBwbGFjZWhvbGRlciA9IHVybDsKKworI2lmZGVmIERFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICJwYXJlbnQ6ICIpOworICAgIENGU2hvdyhwbGFjZWhvbGRlcik7CisjZW5kaWYKKyAgfQorCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJwYXRoIGV4aXN0c1xuIik7CisjZW5kaWYKKworICAvLyByZWFscGF0aCgpIGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCBjYXNlIGZvciBhIHBhdGgsIHNvIHRoaXMKKyAgLy8gaXMgYSBmdW5reSB3b3JrYXJvdW5kIHRoYXQgY29udmVydHMgYSBwYXRoIGludG8gYSAodm9sSWQvaW5vZGVJZCkgcGFpcgorICAvLyBhbmQgYXNrcyB3aGF0IHRoZSBwYXRoIHNob3VsZCBiZSBmb3IgdGhhdC4gc2luY2UgaXQgbG9va3MgYXQgdGhlIGFjdHVhbAorICAvLyBpbm9kZSBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgc2FtZSBjYXNlIHBhc3NlZCBpbiBsaWtlIHJlYWxwYXRoKCkKKyAgLy8gYXBwZWFycyB0byBkbyBmb3IgSEZTKywgaXQgc2hvdWxkIGFsd2F5cyBiZSBjb3JyZWN0LgorICB1cmwgPSBDRlVSTENyZWF0ZUZpbGVSZWZlcmVuY2VVUkwoTlVMTCwgcGxhY2Vob2xkZXIsIE5VTEwpOworICBDRlJlbGVhc2UocGxhY2Vob2xkZXIpOworICBwbGFjZWhvbGRlciA9IENGVVJMQ3JlYXRlRmlsZVBhdGhVUkwoTlVMTCwgdXJsLCBOVUxMKTsKKyAgQ0ZSZWxlYXNlKHVybCk7CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmKHN0ZGVyciwgInBhdGggcmVzb2x2ZWQgdG86ICIpOworICBDRlNob3cocGxhY2Vob2xkZXIpOworI2VuZGlmCisKKyAgLy8gaWYgd2Ugc3RyaXBwZWQgb2ZmIGFueSBpbWFnaW5hcnkgcGF0aCBjb21wb25lbnRzLCBhcHBlbmQgdGhlbSBiYWNrIG9uCisgIGlmIChpbWFnaW5hcnkgIT0gTlVMTCkgeworICAgIENGSW5kZXggY291bnQgPSBDRkFycmF5R2V0Q291bnQoaW1hZ2luYXJ5KTsKKyAgICBmb3IgKENGSW5kZXggaSA9IDA7IGk8Y291bnQ7IGkrKykgeworICAgICAgQ0ZTdHJpbmdSZWYgY29tcG9uZW50ID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleChpbWFnaW5hcnksIGkpOworI2lmZGVmIERFQlVHCisgICAgICBmcHJpbnRmKHN0ZGVyciwgImFwcGVuZGluZyBjb21wb25lbnQ6ICIpOworICAgICAgQ0ZTaG93KGNvbXBvbmVudCk7CisjZW5kaWYKKyAgICAgIHVybCA9IENGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQoTlVMTCwgcGxhY2Vob2xkZXIsIGNvbXBvbmVudCwgZmFsc2UpOworICAgICAgQ0ZSZWxlYXNlKHBsYWNlaG9sZGVyKTsKKyAgICAgIHBsYWNlaG9sZGVyID0gdXJsOworICAgIH0KKyAgICBDRlJlbGVhc2UoaW1hZ2luYXJ5KTsKKyAgfQorCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJyZXN1bHQ6ICIpOworICBDRlNob3cocGxhY2Vob2xkZXIpOworI2VuZGlmCisKKyAgQ0ZTdHJpbmdSZWYgY2ZQYXRoID0gQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgocGxhY2Vob2xkZXIsIGtDRlVSTFBPU0lYUGF0aFN0eWxlKTsKKyAgQ0ZSZWxlYXNlKHBsYWNlaG9sZGVyKTsKKworICBjaGFyIGNQYXRoW1BBVEhfTUFYXTsKKyAgaWYgKENGU3RyaW5nR2V0Q1N0cmluZyhjZlBhdGgsIGNQYXRoLCBQQVRIX01BWCwga0NGU3RyaW5nRW5jb2RpbmdVVEY4KSkgeworICAgIEZTRXZlbnRzRml4UmVwYWlyU3RhdHVzIHN0YXR1cyA9IEZTRXZlbnRzRml4UmVwYWlySWZOZWVkZWQoY1BhdGgpOworICAgIGlmIChzdGF0dXMgPT0gRlNFdmVudHNGaXhSZXBhaXJTdGF0dXNGYWlsZWQpIHsKKyAgICAgIG5lZWRzX2ZzZXZlbnRzX2ZpeCA9IHRydWU7CisgICAgfQorICB9CisKKyAgQ0ZBcnJheUFwcGVuZFZhbHVlKGNvbmZpZy5wYXRocywgY2ZQYXRoKTsKKyAgQ0ZSZWxlYXNlKGNmUGF0aCk7CisKKyNlbHNlCisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmKHN0ZGVyciwgImNvbXBpbGVkIGFnYWluc3QgMTAuNSwgdXNpbmcgcmVhbHBhdGgoKVxuIik7CisjZW5kaWYKKworICBjaGFyIGZ1bGxQYXRoW1BBVEhfTUFYICsgMV07CisKKyAgaWYgKHJlYWxwYXRoKHBhdGgsIGZ1bGxQYXRoKSA9PSBOVUxMKSB7CisjaWZkZWYgREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgcmVhbHBhdGggbm90IGRpcmVjdGx5IHJlc29sdmFibGUgZnJvbSBwYXRoXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKHBhdGhbMF0gIT0gJy8nKSB7CisjaWZkZWYgREVCVUcKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiICBwYXNzZWQgcGF0aCBpcyBub3QgYWJzb2x1dGVcbiIpOworI2VuZGlmCisgICAgICBzaXplX3QgbGVuOworICAgICAgZ2V0Y3dkKGZ1bGxQYXRoLCBzaXplb2YoZnVsbFBhdGgpKTsKKyNpZmRlZiBERUJVRworICAgICAgZnByaW50ZihzdGRlcnIsICIgIHJlc3VsdCBvZiBnZXRjd2Q6ICVzXG4iLCBmdWxsUGF0aCk7CisjZW5kaWYKKyAgICAgIGxlbiA9IHN0cmxlbihmdWxsUGF0aCk7CisgICAgICBmdWxsUGF0aFtsZW5dID0gJy8nOworICAgICAgc3RybGNweSgmZnVsbFBhdGhbbGVuICsgMV0sIHBhdGgsIHNpemVvZihmdWxsUGF0aCkgLSAobGVuICsgMSkpOworICAgIH0gZWxzZSB7CisjaWZkZWYgREVCVUcKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiICBhc3N1bWluZyBwYXRoIGRvZXMgbm90IFlFVCBleGlzdFxuIik7CisjZW5kaWYKKyAgICAgIHN0cmxjcHkoZnVsbFBhdGgsIHBhdGgsIHNpemVvZihmdWxsUGF0aCkpOworICAgIH0KKyAgfQorCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICIgIHJlc29sdmVkIHBhdGggdG86ICVzXG4iLCBmdWxsUGF0aCk7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorCisgIENGU3RyaW5nUmVmIHBhdGhSZWYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworICBDRkFycmF5QXBwZW5kVmFsdWUoY29uZmlnLnBhdGhzLCBwYXRoUmVmKTsKKyAgQ0ZSZWxlYXNlKHBhdGhSZWYpOworCisjZW5kaWYKK30KKworLy8gUGFyc2UgY29tbWFuZGxpbmUgc2V0dGluZ3MKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJzZV9jbGlfc2V0dGluZ3MoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkKK3sKKyAgLy8gcnVudGltZSBvcyB2ZXJzaW9uIGRldGVjdGlvbgorICBTSW50MzIgb3NNYWpvclZlcnNpb24sIG9zTWlub3JWZXJzaW9uOworICBpZiAoIShHZXN0YWx0KGdlc3RhbHRTeXN0ZW1WZXJzaW9uTWFqb3IsICZvc01ham9yVmVyc2lvbikgPT0gbm9FcnIpKSB7CisgICAgb3NNYWpvclZlcnNpb24gPSAwOworICB9CisgIGlmICghKEdlc3RhbHQoZ2VzdGFsdFN5c3RlbVZlcnNpb25NaW5vciwgJm9zTWlub3JWZXJzaW9uKSA9PSBub0VycikpIHsKKyAgICBvc01pbm9yVmVyc2lvbiA9IDA7CisgIH0KKworICBpZiAoKG9zTWFqb3JWZXJzaW9uID09IDEwKSAmIChvc01pbm9yVmVyc2lvbiA8IDUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJUaGUgRlNFdmVudHMgQVBJIGlzIHVuYXZhaWxhYmxlIG9uIHRoaXMgdmVyc2lvbiBvZiBtYWNvcyFcbiIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorCisgIHN0cnVjdCBjbGlfaW5mbyBhcmdzX2luZm87CisgIGNsaV9wYXJzZXJfaW5pdCgmYXJnc19pbmZvKTsKKworICBpZiAoY2xpX3BhcnNlcihhcmdjLCBhcmd2LCAmYXJnc19pbmZvKSAhPSAwKSB7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisKKyAgY29uZmlnLnBhdGhzID0gQ0ZBcnJheUNyZWF0ZU11dGFibGUoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGSW5kZXgpMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CisKKyAgY29uZmlnLnNpbmNlV2hlbiA9IGFyZ3NfaW5mby5zaW5jZV93aGVuX2FyZzsKKyAgY29uZmlnLmxhdGVuY3kgPSBhcmdzX2luZm8ubGF0ZW5jeV9hcmc7CisgIGNvbmZpZy5mb3JtYXQgPSBhcmdzX2luZm8uZm9ybWF0X2FyZzsKKworICBpZiAoYXJnc19pbmZvLm5vX2RlZmVyX2ZsYWcpIHsKKyAgICBjb25maWcuZmxhZ3MgfD0ga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnTm9EZWZlcjsKKyAgfQorICBpZiAoYXJnc19pbmZvLndhdGNoX3Jvb3RfZmxhZykgeworICAgIGNvbmZpZy5mbGFncyB8PSBrRlNFdmVudFN0cmVhbUNyZWF0ZUZsYWdXYXRjaFJvb3Q7CisgIH0KKworICBpZiAoYXJnc19pbmZvLmlnbm9yZV9zZWxmX2ZsYWcpIHsKKyAgICBpZiAoKG9zTWFqb3JWZXJzaW9uID09IDEwKSAmIChvc01pbm9yVmVyc2lvbiA+PSA2KSkgeworICAgICAgY29uZmlnLmZsYWdzIHw9IGtGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ0lnbm9yZVNlbGY7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWFjT1NYIDEwLjYgb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIC0taWdub3JlLXNlbGZcbiIpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfQorCisgIGlmIChhcmdzX2luZm8uZmlsZV9ldmVudHNfZmxhZykgeworICAgIGlmICgob3NNYWpvclZlcnNpb24gPT0gMTApICYgKG9zTWlub3JWZXJzaW9uID49IDcpKSB7CisgICAgICBjb25maWcuZmxhZ3MgfD0ga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnRmlsZUV2ZW50czsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNYWNPU1ggMTAuNyBvciBsYXRlciByZXF1aXJlZCBmb3IgLS1maWxlLWV2ZW50c1xuIik7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICB9CisKKyAgaWYgKGFyZ3NfaW5mby5tYXJrX3NlbGZfZmxhZykgeworICAgIGlmICgob3NNYWpvclZlcnNpb24gPT0gMTApICYgKG9zTWlub3JWZXJzaW9uID49IDkpKSB7CisgICAgICBjb25maWcuZmxhZ3MgfD0ga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnTWFya1NlbGY7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWFjT1NYIDEwLjkgb3IgbGF0ZXIgcmVxdWlyZWQgZm9yIC0tbWFyay1zZWxmXG4iKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0KKworICBpZiAoYXJnc19pbmZvLmlucHV0c19udW0gPT0gMCkgeworICAgIGFwcGVuZF9wYXRoKCIuIik7CisgIH0gZWxzZSB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpIDwgYXJnc19pbmZvLmlucHV0c19udW07ICsraSkgeworICAgICAgYXBwZW5kX3BhdGgoYXJnc19pbmZvLmlucHV0c1tpXSk7CisgICAgfQorICB9CisKKyAgY2xpX3BhcnNlcl9mcmVlKCZhcmdzX2luZm8pOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJjb25maWcuc2luY2VXaGVuICAgICVsbHVcbiIsIGNvbmZpZy5zaW5jZVdoZW4pOworICBmcHJpbnRmKHN0ZGVyciwgImNvbmZpZy5sYXRlbmN5ICAgICAgJWZcbiIsIGNvbmZpZy5sYXRlbmN5KTsKKworLy8gU1RGVSBjbGFuZworI2lmIGRlZmluZWQoX19MUDY0X18pCisgIGZwcmludGYoc3RkZXJyLCAiY29uZmlnLmZsYWdzICAgICAgICAlIy44eFxuIiwgY29uZmlnLmZsYWdzKTsKKyNlbHNlCisgIGZwcmludGYoc3RkZXJyLCAiY29uZmlnLmZsYWdzICAgICAgICAlIy44bHhcbiIsIGNvbmZpZy5mbGFncyk7CisjZW5kaWYKKworICBGTEFHX0NIRUNLX1NUREVSUihjb25maWcuZmxhZ3MsIGtGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ1VzZUNGVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICIgIFVzaW5nIENGIGluc3RlYWQgb2YgQyB0eXBlcyIpOworICBGTEFHX0NIRUNLX1NUREVSUihjb25maWcuZmxhZ3MsIGtGU0V2ZW50U3RyZWFtQ3JlYXRlRmxhZ05vRGVmZXIsCisgICAgICAgICAgICAgICAgICAgICIgIE5vRGVmZXIgbGF0ZW5jeSBtb2RpZmllciBlbmFibGVkIik7CisgIEZMQUdfQ0hFQ0tfU1RERVJSKGNvbmZpZy5mbGFncywga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnV2F0Y2hSb290LAorICAgICAgICAgICAgICAgICAgICAiICBXYXRjaFJvb3Qgbm90aWZpY2F0aW9ucyBlbmFibGVkIik7CisgIEZMQUdfQ0hFQ0tfU1RERVJSKGNvbmZpZy5mbGFncywga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnSWdub3JlU2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIiAgSWdub3JlU2VsZiBlbmFibGVkIik7CisgIEZMQUdfQ0hFQ0tfU1RERVJSKGNvbmZpZy5mbGFncywga0ZTRXZlbnRTdHJlYW1DcmVhdGVGbGFnRmlsZUV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgIiAgRmlsZUV2ZW50cyBlbmFibGVkIik7CisKKyAgZnByaW50ZihzdGRlcnIsICJjb25maWcucGF0aHNcbiIpOworCisgIGxvbmcgbnVtcGF0aHMgPSBDRkFycmF5R2V0Q291bnQoY29uZmlnLnBhdGhzKTsKKworICBmb3IgKGxvbmcgaSA9IDA7IGkgPCBudW1wYXRoczsgaSsrKSB7CisgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKyAgICBDRlN0cmluZ0dldENTdHJpbmcoQ0ZBcnJheUdldFZhbHVlQXRJbmRleChjb25maWcucGF0aHMsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBQQVRIX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgJXNcbiIsIHBhdGgpOworICB9CisKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworI2VuZGlmCit9CisKKy8vIG9yaWdpbmFsIG91dHB1dCBmb3JtYXQgZm9yIHJiLWZzZXZlbnQKK3N0YXRpYyB2b2lkIGNsYXNzaWNfb3V0cHV0X2Zvcm1hdChzaXplX3QgbnVtRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBwYXRocykKK3sKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FdmVudHM7IGkrKykgeworICAgIGZwcmludGYoc3Rkb3V0LCAiJXM6IiwgcGF0aHNbaV0pOworICB9CisgIGZwcmludGYoc3Rkb3V0LCAiXG4iKTsKK30KKworLy8gb3V0cHV0IGZvcm1hdCB1c2VkIGluIHRoZSBZb3NoaW1hc2EgTml3YSBicmFuY2ggb2YgcmItZnNldmVudAorc3RhdGljIHZvaWQgbml3X291dHB1dF9mb3JtYXQoc2l6ZV90IG51bUV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBwYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTRXZlbnRTdHJlYW1FdmVudEZsYWdzIGV2ZW50RmxhZ3NbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTRXZlbnRTdHJlYW1FdmVudElkIGV2ZW50SWRzW10pCit7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRXZlbnRzOyBpKyspIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwgIiVsdTolbGx1OiVzXG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpZXZlbnRGbGFnc1tpXSwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZXZlbnRJZHNbaV0sCisgICAgICAgICAgICBwYXRoc1tpXSk7CisgIH0KKyAgZnByaW50ZihzdGRvdXQsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCB0c3RyaW5nX291dHB1dF9mb3JtYXQoc2l6ZV90IG51bUV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogcGF0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNFdmVudFN0cmVhbUV2ZW50RmxhZ3MgZXZlbnRGbGFnc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTRXZlbnRTdHJlYW1FdmVudElkIGV2ZW50SWRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNJVFN0cmluZ0Zvcm1hdCBmb3JtYXQpCit7CisgIENGTXV0YWJsZUFycmF5UmVmIGV2ZW50cyA9IENGQXJyYXlDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRXZlbnRzOyBpKyspIHsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGV2ZW50ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKworICAgIENGU3RyaW5nUmVmIHBhdGggPSBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgVUludDgqKXBhdGhzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAoQ0ZJbmRleClzdHJsZW4ocGF0aHNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShldmVudCwgQ0ZTVFIoInBhdGgiKSwgcGF0aCk7CisKKyAgICBDRk51bWJlclJlZiBpZGVudCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckxvbmdMb25nVHlwZSwgJmV2ZW50SWRzW2ldKTsKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShldmVudCwgQ0ZTVFIoImlkIiksIGlkZW50KTsKKworICAgIENGTnVtYmVyUmVmIGNmbGFncyA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZldmVudEZsYWdzW2ldKTsKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShldmVudCwgQ0ZTVFIoImNmbGFncyIpLCBjZmxhZ3MpOworCisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgZmxhZ3MgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CisKKyNkZWZpbmUgRkxBR19BRERfTkFNRShmbGFnc251bSwgZmxhZ251bSwgZmxhZ25hbWUsIGZsYWdhcnJheSkgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChGTEFHX0NIRUNLKGZsYWdzbnVtLCBmbGFnbnVtKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENGQXJyYXlBcHBlbmRWYWx1ZShmbGFnYXJyYXksIENGU1RSKGZsYWduYW1lKSk7IH0gfSAgICAgICBcCisgIHdoaWxlKDApCisKKyAgICBGTEFHX0FERF9OQU1FKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnTXVzdFNjYW5TdWJEaXJzLCAgICAgIk11c3RTY2FuU3ViRGlycyIsIGZsYWdzKTsKKyAgICBGTEFHX0FERF9OQU1FKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnVXNlckRyb3BwZWQsICAgICAgICAgIlVzZXJEcm9wcGVkIiwgZmxhZ3MpOworICAgIEZMQUdfQUREX05BTUUoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdLZXJuZWxEcm9wcGVkLCAgICAgICAiS2VybmVsRHJvcHBlZCIsIGZsYWdzKTsKKyAgICBGTEFHX0FERF9OQU1FKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnRXZlbnRJZHNXcmFwcGVkLCAgICAgIkV2ZW50SWRzV3JhcHBlZCIsIGZsYWdzKTsKKyAgICBGTEFHX0FERF9OQU1FKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSGlzdG9yeURvbmUsICAgICAgICAgIkhpc3RvcnlEb25lIiwgZmxhZ3MpOworICAgIEZMQUdfQUREX05BTUUoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdSb290Q2hhbmdlZCwgICAgICAgICAiUm9vdENoYW5nZWQiLCBmbGFncyk7CisgICAgRkxBR19BRERfTkFNRShldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ01vdW50LCAgICAgICAgICAgICAgICJNb3VudCIsIGZsYWdzKTsKKyAgICBGTEFHX0FERF9OQU1FKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnVW5tb3VudCwgICAgICAgICAgICAgIlVubW91bnQiLCBmbGFncyk7CisgICAgRkxBR19BRERfTkFNRShldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1DcmVhdGVkLCAgICAgICAgICJJdGVtQ3JlYXRlZCIsIGZsYWdzKTsKKyAgICBGTEFHX0FERF9OQU1FKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbVJlbW92ZWQsICAgICAgICAgIkl0ZW1SZW1vdmVkIiwgZmxhZ3MpOworICAgIEZMQUdfQUREX05BTUUoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSW5vZGVNZXRhTW9kLCAgICAiSXRlbUlub2RlTWV0YU1vZCIsIGZsYWdzKTsKKyAgICBGTEFHX0FERF9OQU1FKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbVJlbmFtZWQsICAgICAgICAgIkl0ZW1SZW5hbWVkIiwgZmxhZ3MpOworICAgIEZMQUdfQUREX05BTUUoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtTW9kaWZpZWQsICAgICAgICAiSXRlbU1vZGlmaWVkIiwgZmxhZ3MpOworICAgIEZMQUdfQUREX05BTUUoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtRmluZGVySW5mb01vZCwgICAiSXRlbUZpbmRlckluZm9Nb2QiLCBmbGFncyk7CisgICAgRkxBR19BRERfTkFNRShldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1DaGFuZ2VPd25lciwgICAgICJJdGVtQ2hhbmdlT3duZXIiLCBmbGFncyk7CisgICAgRkxBR19BRERfTkFNRShldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1YYXR0ck1vZCwgICAgICAgICJJdGVtWGF0dHJNb2QiLCBmbGFncyk7CisgICAgRkxBR19BRERfTkFNRShldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jc0ZpbGUsICAgICAgICAgICJJdGVtSXNGaWxlIiwgZmxhZ3MpOworICAgIEZMQUdfQUREX05BTUUoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSXNEaXIsICAgICAgICAgICAiSXRlbUlzRGlyIiwgZmxhZ3MpOworICAgIEZMQUdfQUREX05BTUUoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSXNTeW1saW5rLCAgICAgICAiSXRlbUlzU3ltbGluayIsIGZsYWdzKTsKKyAgICBGTEFHX0FERF9OQU1FKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnT3duRXZlbnQsICAgICAgICAgICAgIk93bkV2ZW50IiwgZmxhZ3MpOworICAgIEZMQUdfQUREX05BTUUoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSXNIYXJkbGluaywgICAgICAiSXRlbUlzSGFyZExpbmsiLCBmbGFncyk7CisgICAgRkxBR19BRERfTkFNRShldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jc0xhc3RIYXJkbGluaywgICJJdGVtSXNMYXN0SGFyZExpbmsiLCBmbGFncyk7CisKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShldmVudCwgQ0ZTVFIoImZsYWdzIiksIGZsYWdzKTsKKworCisgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKGV2ZW50cywgZXZlbnQpOworCisgICAgQ0ZSZWxlYXNlKGV2ZW50KTsKKyAgICBDRlJlbGVhc2UocGF0aCk7CisgICAgQ0ZSZWxlYXNlKGlkZW50KTsKKyAgICBDRlJlbGVhc2UoY2ZsYWdzKTsKKyAgICBDRlJlbGVhc2UoZmxhZ3MpOworICB9CisKKyAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBtZXRhID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKyAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUobWV0YSwgQ0ZTVFIoImV2ZW50cyIpLCBldmVudHMpOworCisgIENGTnVtYmVyUmVmIG51bSA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckNGSW5kZXhUeXBlLCAmbnVtRXZlbnRzKTsKKyAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUobWV0YSwgQ0ZTVFIoIm51bUV2ZW50cyIpLCBudW0pOworCisgIENGRGF0YVJlZiBkYXRhID0gVFNJQ1RTdHJpbmdDcmVhdGVSZW5kZXJlZERhdGFGcm9tT2JqZWN0V2l0aEZvcm1hdChtZXRhLCBmb3JtYXQpOworICBmcHJpbnRmKHN0ZG91dCwgIiVzIiwgQ0ZEYXRhR2V0Qnl0ZVB0cihkYXRhKSk7CisKKyAgQ0ZSZWxlYXNlKGV2ZW50cyk7CisgIENGUmVsZWFzZShudW0pOworICBDRlJlbGVhc2UobWV0YSk7CisgIENGUmVsZWFzZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgY2FsbGJhY2soX19hdHRyaWJ1dGVfXygodW51c2VkKSkgRlNFdmVudFN0cmVhbVJlZiBzdHJlYW1SZWYsCisgICAgICAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSB2b2lkKiBjbGllbnRDYWxsQmFja0luZm8sCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogZXZlbnRQYXRocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTRXZlbnRTdHJlYW1FdmVudEZsYWdzIGV2ZW50RmxhZ3NbXSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTRXZlbnRTdHJlYW1FdmVudElkIGV2ZW50SWRzW10pCit7CisgIGNoYXIqKiBwYXRocyA9IGV2ZW50UGF0aHM7CisKKworI2lmZGVmIERFQlVHCisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJGU0V2ZW50U3RyZWFtQ2FsbGJhY2sgZmlyZWQhXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIG51bUV2ZW50czogJWx1XG4iLCBudW1FdmVudHMpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRXZlbnRzOyBpKyspIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIGV2ZW50IElEOiAlbGx1XG4iLCBldmVudElkc1tpXSk7CisKKy8vIFNURlUgY2xhbmcKKyNpZiBkZWZpbmVkKF9fTFA2NF9fKQorICAgIGZwcmludGYoc3RkZXJyLCAiICBldmVudCBmbGFnczogJSMuOHhcbiIsIGV2ZW50RmxhZ3NbaV0pOworI2Vsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgZXZlbnQgZmxhZ3M6ICUjLjhseFxuIiwgZXZlbnRGbGFnc1tpXSk7CisjZW5kaWYKKworICAgIEZMQUdfQ0hFQ0tfU1RERVJSKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnTXVzdFNjYW5TdWJEaXJzLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgUmVjdXJzaXZlIHNjYW5uaW5nIG9mIGRpcmVjdG9yeSByZXF1aXJlZCIpOworICAgIEZMQUdfQ0hFQ0tfU1RERVJSKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnVXNlckRyb3BwZWQsCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBCdWZmZXJpbmcgcHJvYmxlbTogZXZlbnRzIGRyb3BwZWQgdXNlci1zaWRlIik7CisgICAgRkxBR19DSEVDS19TVERFUlIoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdLZXJuZWxEcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgQnVmZmVyaW5nIHByb2JsZW06IGV2ZW50cyBkcm9wcGVkIGtlcm5lbC1zaWRlIik7CisgICAgRkxBR19DSEVDS19TVERFUlIoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdFdmVudElkc1dyYXBwZWQsCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBFdmVudCBJRHMgaGF2ZSB3cmFwcGVkIik7CisgICAgRkxBR19DSEVDS19TVERFUlIoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdIaXN0b3J5RG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIEFsbCBoaXN0b3JpY2FsIGV2ZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkIik7CisgICAgRkxBR19DSEVDS19TVERFUlIoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdSb290Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIFJvb3QgcGF0aCBoYXMgY2hhbmdlZCIpOworICAgIEZMQUdfQ0hFQ0tfU1RERVJSKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnTW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBBIG5ldyB2b2x1bWUgd2FzIG1vdW50ZWQgYXQgdGhpcyBwYXRoIik7CisgICAgRkxBR19DSEVDS19TVERFUlIoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdVbm1vdW50LAorICAgICAgICAgICAgICAgICAgICAgICIgICAgQSB2b2x1bWUgd2FzIHVubW91bnRlZCBmcm9tIHRoaXMgcGF0aCIpOworICAgIEZMQUdfQ0hFQ0tfU1RERVJSKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBJdGVtIGNyZWF0ZWQiKTsKKyAgICBGTEFHX0NIRUNLX1NUREVSUihldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1SZW1vdmVkLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgSXRlbSByZW1vdmVkIik7CisgICAgRkxBR19DSEVDS19TVERFUlIoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSW5vZGVNZXRhTW9kLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgSXRlbSBtZXRhZGF0YSBtb2RpZmllZCIpOworICAgIEZMQUdfQ0hFQ0tfU1RERVJSKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbVJlbmFtZWQsCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBJdGVtIHJlbmFtZWQiKTsKKyAgICBGTEFHX0NIRUNLX1NUREVSUihldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Nb2RpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIEl0ZW0gbW9kaWZpZWQiKTsKKyAgICBGTEFHX0NIRUNLX1NUREVSUihldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1GaW5kZXJJbmZvTW9kLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgSXRlbSBGaW5kZXIgSW5mbyBtb2RpZmllZCIpOworICAgIEZMQUdfQ0hFQ0tfU1RERVJSKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUNoYW5nZU93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgSXRlbSBjaGFuZ2VkIG93bmVyc2hpcCIpOworICAgIEZMQUdfQ0hFQ0tfU1RERVJSKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbVhhdHRyTW9kLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgSXRlbSBleHRlbmRlZCBhdHRyaWJ1dGVzIG1vZGlmaWVkIik7CisgICAgRkxBR19DSEVDS19TVERFUlIoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSXNGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgSXRlbSBpcyBhIGZpbGUiKTsKKyAgICBGTEFHX0NIRUNLX1NUREVSUihldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jc0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIEl0ZW0gaXMgYSBkaXJlY3RvcnkiKTsKKyAgICBGTEFHX0NIRUNLX1NUREVSUihldmVudEZsYWdzW2ldLCBrRlNFdmVudFN0cmVhbUV2ZW50RmxhZ0l0ZW1Jc1N5bWxpbmssCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBJdGVtIGlzIGEgc3ltYm9saWMgbGluayIpOworICAgIEZMQUdfQ0hFQ0tfU1RERVJSKGV2ZW50RmxhZ3NbaV0sIGtGU0V2ZW50U3RyZWFtRXZlbnRGbGFnSXRlbUlzSGFyZGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBJdGVtIGlzIGEgaGFyZCBsaW5rIik7CisgICAgRkxBR19DSEVDS19TVERFUlIoZXZlbnRGbGFnc1tpXSwga0ZTRXZlbnRTdHJlYW1FdmVudEZsYWdJdGVtSXNMYXN0SGFyZGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBJdGVtIGlzIHRoZSBsYXN0IGhhcmQgbGluayIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICBldmVudCBwYXRoOiAlc1xuIiwgcGF0aHNbaV0pOworICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgfQorCisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorCisgIGlmIChjb25maWcuZm9ybWF0ID09IGtGU0V2ZW50V2F0Y2hPdXRwdXRGb3JtYXRDbGFzc2ljKSB7CisgICAgY2xhc3NpY19vdXRwdXRfZm9ybWF0KG51bUV2ZW50cywgcGF0aHMpOworICB9IGVsc2UgaWYgKGNvbmZpZy5mb3JtYXQgPT0ga0ZTRXZlbnRXYXRjaE91dHB1dEZvcm1hdE5JVykgeworICAgIG5pd19vdXRwdXRfZm9ybWF0KG51bUV2ZW50cywgcGF0aHMsIGV2ZW50RmxhZ3MsIGV2ZW50SWRzKTsKKyAgfSBlbHNlIGlmIChjb25maWcuZm9ybWF0ID09IGtGU0V2ZW50V2F0Y2hPdXRwdXRGb3JtYXRUTmV0c3RyaW5nKSB7CisgICAgdHN0cmluZ19vdXRwdXRfZm9ybWF0KG51bUV2ZW50cywgcGF0aHMsIGV2ZW50RmxhZ3MsIGV2ZW50SWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNJVFN0cmluZ0Zvcm1hdFROZXRzdHJpbmcpOworICB9IGVsc2UgaWYgKGNvbmZpZy5mb3JtYXQgPT0ga0ZTRXZlbnRXYXRjaE91dHB1dEZvcm1hdE9UTmV0c3RyaW5nKSB7CisgICAgdHN0cmluZ19vdXRwdXRfZm9ybWF0KG51bUV2ZW50cywgcGF0aHMsIGV2ZW50RmxhZ3MsIGV2ZW50SWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNJVFN0cmluZ0Zvcm1hdE9UTmV0c3RyaW5nKTsKKyAgfQorCisgIGZmbHVzaChzdGRvdXQpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKQoreworICBpbnN0YWxsX3NpZ25hbF9oYW5kbGVycygpOworICBwYXJzZV9jbGlfc2V0dGluZ3MoYXJnYywgYXJndik7CisKKyAgaWYgKG5lZWRzX2ZzZXZlbnRzX2ZpeCkgeworICAgIEZTRXZlbnRzRml4RW5hYmxlKCk7CisgIH0KKworICBGU0V2ZW50U3RyZWFtQ29udGV4dCBjb250ZXh0ID0gezAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OworICBGU0V2ZW50U3RyZWFtUmVmIHN0cmVhbTsKKyAgc3RyZWFtID0gRlNFdmVudFN0cmVhbUNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGU0V2ZW50U3RyZWFtQ2FsbGJhY2spJmNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2luY2VXaGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mbGFncyk7CisKKyNpZmRlZiBERUJVRworICBGU0V2ZW50U3RyZWFtU2hvdyhzdHJlYW0pOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisjZW5kaWYKKworICBpZiAobmVlZHNfZnNldmVudHNfZml4KSB7CisgICAgRlNFdmVudHNGaXhEaXNhYmxlKCk7CisgIH0KKworICBGU0V2ZW50U3RyZWFtU2NoZWR1bGVXaXRoUnVuTG9vcChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGUnVuTG9vcEdldEN1cnJlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKKyAgRlNFdmVudFN0cmVhbVN0YXJ0KHN0cmVhbSk7CisgIENGUnVuTG9vcFJ1bigpOworICBGU0V2ZW50U3RyZWFtRmx1c2hTeW5jKHN0cmVhbSk7CisgIEZTRXZlbnRTdHJlYW1TdG9wKHN0cmVhbSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9zaWduYWxfaGFuZGxlcnMuYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2V4dC9mc2V2ZW50X3dhdGNoL3NpZ25hbF9oYW5kbGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMGRhM2YKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9zaWduYWxfaGFuZGxlcnMuYwpAQCAtMCwwICsxLDY2IEBACisjaW5jbHVkZSAic2lnbmFsX2hhbmRsZXJzLmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworI2RlZmluZSBQUElEX0FMQVJNX0lOVEVSVkFMIDIgLy8gc2VuZCBTSUdBTFJNIGV2ZXJ5IHRoaXMgc2Vjb25kcworCisKK3N0YXRpYyBwaWRfdCBvcmlnX3BwaWQ7CisKKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IF8pIHsKKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19wcGlkKHZvaWQpIHsKKyAgaWYgKGdldHBwaWQoKSAhPSBvcmlnX3BwaWQpIHsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfc3Rkb3V0X29wZW4odm9pZCkgeworICBpZiAoZmNudGwoU1RET1VUX0ZJTEVOTywgRl9HRVRGRCkgPCAwKSB7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2hhbmRsZXIoaW50IF8pIHsKKyAgY2hlY2tfcHBpZCgpOworICBjaGVja19zdGRvdXRfb3BlbigpOworICBhbGFybShQUElEX0FMQVJNX0lOVEVSVkFMKTsKKyAgc2lnbmFsKFNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpOworfQorCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqbXNnKSB7CisgIGZwcmludGYoc3RkZXJyLCAiXG5GQVRBTDogJXNcbiIsIG1zZyk7CisgIGFib3J0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGluc3RhbGxfc2lnbmFsX2hhbmRsZXIoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCkpIHsKKyAgaWYgKHNpZ25hbChzaWcsIGhhbmRsZXIpID09IFNJR19FUlIpIHsKKyAgICBkaWUoIkNvdWxkIG5vdCBpbnN0YWxsIHNpZ25hbCBoYW5kbGVyIik7CisgIH0KK30KKwordm9pZCBpbnN0YWxsX3NpZ25hbF9oYW5kbGVycyh2b2lkKSB7CisgIC8vIGNoZWNrIHBpcGUgaXMgc3RpbGwgY29ubmVjdGVkCisgIGNoZWNrX3N0ZG91dF9vcGVuKCk7CisKKyAgLy8gd2F0Y2ggZ2V0cHBpZCgpIGV2ZXJ5IFBQSURfQUxBUk1fSU5URVJWQUwgc2Vjb25kcyAKKyAgb3JpZ19wcGlkID0gZ2V0cHBpZCgpOworICBpZiAob3JpZ19wcGlkIDw9IDEpIHsKKyAgICBkaWUoInByZW1hdHVyZWx5IHpvbWJpZWQiKTsKKyAgfQorICBpbnN0YWxsX3NpZ25hbF9oYW5kbGVyKFNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpOworICBhbGFybShQUElEX0FMQVJNX0lOVEVSVkFMKTsKKworICAvLyBiZSBzdXJlIHRvIGV4aXQgb24gU0lHSFVQLCBTSUdQSVBFCisgIGluc3RhbGxfc2lnbmFsX2hhbmRsZXIoU0lHSFVQLCAgc2lnbmFsX2hhbmRsZXIpOworICBpbnN0YWxsX3NpZ25hbF9oYW5kbGVyKFNJR1BJUEUsIHNpZ25hbF9oYW5kbGVyKTsKK30KKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvc2lnbmFsX2hhbmRsZXJzLmggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvZnNldmVudF93YXRjaC9zaWduYWxfaGFuZGxlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzE2ODVkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L2ZzZXZlbnRfd2F0Y2gvc2lnbmFsX2hhbmRsZXJzLmgKQEAgLTAsMCArMSwxNiBAQAorLyoqCisgKiBAaGVhZGVyZmlsZSBzaWduYWxfaGFuZGxlcnMuaAorICogU2lnbmFsIGhhbmRsZXJzIHRvIHN0b3AgdGhlIHpvbWJpZSBob3JkZXMKKyAqCisgKiBDYXRjaCBhbmQgaGFuZGxlIHNpZ25hbHMgYmV0dGVyIHNvIHRoYXQgd2UgZGllIGZhc3RlciBsaWtlIGEgZ29vZCBtZWF0IHB1cHBldC4KKyAqLworCisKKyNpZm5kZWYgZnNldmVudF93YXRjaF9zaWduYWxfaGFuZGxlcnNfaAorI2RlZmluZSBmc2V2ZW50X3dhdGNoX3NpZ25hbF9oYW5kbGVyc19oCisKKwordm9pZCBpbnN0YWxsX3NpZ25hbF9oYW5kbGVycyh2b2lkKTsKKworCisjZW5kaWYgLy8gZnNldmVudF93YXRjaF9zaWduYWxfaGFuZGxlcnNfaApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L3Jha2VmaWxlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvZXh0L3Jha2VmaWxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Nzg5YmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9leHQvcmFrZWZpbGUucmIKQEAgLTAsMCArMSwyMjYgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KK3JlcXVpcmUgJ3J1YnlnZW1zJyB1bmxlc3MgZGVmaW5lZD8oR2VtKQorcmVxdWlyZSAncGF0aG5hbWUnCityZXF1aXJlICdkYXRlJworcmVxdWlyZSAndGltZScKK3JlcXVpcmUgJ3Jha2UvY2xlYW4nCisKK3JhaXNlICJ1bmFibGUgdG8gZmluZCB4Y29kZWJ1aWxkIiB1bmxlc3Mgc3lzdGVtKCd3aGljaCcsICd4Y29kZWJ1aWxkJykKKworCitGU0VWRU5UX1dBVENIX0VYRV9WRVJTSU9OID0gJzAuMS41JworCiskdGhpc19kaXIgPSBQYXRobmFtZS5uZXcoX19GSUxFX18pLmRpcm5hbWUuZXhwYW5kX3BhdGgKKyRmaW5hbF9leGUgPSAkdGhpc19kaXIucGFyZW50LmpvaW4oJ2Jpbi9mc2V2ZW50X3dhdGNoJykKKworJHNyY19kaXIgPSAkdGhpc19kaXIuam9pbignZnNldmVudF93YXRjaCcpCiskb2JqX2RpciA9ICR0aGlzX2Rpci5qb2luKCdidWlsZCcpCisKK1NSQyA9IFBhdGhuYW1lLmdsb2IoIiN7JHNyY19kaXJ9LyouYyIpCitPQkogPSBTUkMubWFwIHt8c3wgJG9ial9kaXIuam9pbigiI3tzLmJhc2VuYW1lKCcuYycpfS5vIil9CisKKyRub3cgPSBEYXRlVGltZS5ub3cueG1sc2NoZW1hIHJlc2N1ZSBUaW1lLm5vdy54bWxzY2hlbWEKKworJENDID0gRU5WWydDQyddIHx8IGB3aGljaCBjbGFuZyB8fCB3aGljaCBnY2NgLnN0cmlwCiskQ0ZMQUdTID0gRU5WWydDRkxBR1MnXSB8fCAnLWZjb25zdGFudC1jZnN0cmluZ3MgLWZhc20tYmxvY2tzIC1mc3RyaWN0LWFsaWFzaW5nIC1XYWxsJworJEFSQ0hGTEFHUyA9IEVOVlsnQVJDSEZMQUdTJ10gfHwgJy1hcmNoIHg4Nl82NCcKKyRERUZJTkVTID0gIi1ETlNfQlVJTERfMzJfTElLRV82NCAtRE5TX0JMT0NLX0FTU0VSVElPTlMgLURQUk9KRUNUX1ZFUlNJT049I3tGU0VWRU5UX1dBVENIX0VYRV9WRVJTSU9OfSIKKworJEdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gRU5WWydHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCddIHx8ICdnbnUxMScKKworIyBnZW5lcmljIGRldmVsb3BlciBpZCBuYW1lIHNvIGl0J2xsIG1hdGNoIGNvcnJlY3RseSBmb3IgYW55b25lIHdobyBoYXMgb25seQorIyBvbmUgZGV2ZWxvcGVyIGlkIGluIHRoZWlyIGtleWNoYWluIChub3QgdGhhdCBJIGV4cGVjdCBhbnlvbmUgZWxzZSB0byBib3RoZXIpCiskQ09ERV9TSUdOX0lERU5USVRZID0gJ0RldmVsb3BlciBJRCBBcHBsaWNhdGlvbicKKworJGFyY2ggPSBgdW5hbWUgLW1gLnN0cmlwCiskb3NfcmVsZWFzZSA9IGB1bmFtZSAtcmAuc3RyaXAKKyRCVUlMRF9UUklQTEUgPSAiI3skYXJjaH0tYXBwbGUtZGFyd2luI3skb3NfcmVsZWFzZX0iCisKKyRDQ1ZlcnNpb24gPSBgI3skQ0N9IC0tdmVyc2lvbiB8IGhlYWQgLW4gMWAuc3RyaXAKKworCitDTEVBTi5pbmNsdWRlIE9CSi5tYXAoJjp0b19zKQorQ0xFQU4uaW5jbHVkZSAkb2JqX2Rpci5qb2luKCdJbmZvLnBsaXN0JykudG9fcworQ0xFQU4uaW5jbHVkZSAkb2JqX2Rpci5qb2luKCdmc2V2ZW50X3dhdGNoJykudG9fcworQ0xPQkJFUi5pbmNsdWRlICRmaW5hbF9leGUudG9fcworCisKK3Rhc2sgOnN3X3ZlcnMgZG8KKyAgJG1hY19wcm9kdWN0X3ZlcnNpb24gPSBgc3dfdmVycyAtcHJvZHVjdFZlcnNpb25gLnN0cmlwCisgICRtYWNfYnVpbGRfdmVyc2lvbiA9IGBzd192ZXJzIC1idWlsZFZlcnNpb25gLnN0cmlwCisgICRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSBFTlZbJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddIHx8ICRtYWNfcHJvZHVjdF92ZXJzaW9uLnN1YigvXC5cZCokLywgJycpCisgICRDRkxBR1MgPSAiI3skQ0ZMQUdTfSAtbW1hY29zeC12ZXJzaW9uLW1pbj0jeyRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IgorZW5kCisKK3Rhc2sgOmdldF9zZGtfaW5mbyA9PiA6c3dfdmVycyBkbworICAkU0RLX0lORk8gPSB7fQorICB2ZXJzaW9uX2luZm8gPSBgeGNvZGVidWlsZCAtdmVyc2lvbiAtc2RrIG1hY29zeCN7JE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH1gCisgIHJhaXNlICJpbnZhbGlkIFNESyIgdW5sZXNzICEhJD8uZXhpdHN0YXR1cworICB2ZXJzaW9uX2luZm8uc3RyaXAuZWFjaF9saW5lIGRvIHxsaW5lfAorICAgIG5leHQgaWYgbGluZS5zdHJpcC5lbXB0eT8KKyAgICBuZXh0IHVubGVzcyBsaW5lLmluY2x1ZGU/KCc6JykKKyAgICBtYXRjaCA9IGxpbmUubWF0Y2goLyhbXjpdKik6ICguKikvKQorICAgIG5leHQgdW5sZXNzIG1hdGNoCisgICAgJFNES19JTkZPW21hdGNoWzFdXSA9IG1hdGNoWzJdCisgIGVuZAorZW5kCisKK3Rhc2sgOmRlYnVnID0+IDpzd192ZXJzIGRvCisgICRERUZJTkVTID0gIi1EREVCVUcgI3skREVGSU5FU30iCisgICRDRkxBR1MgPSAiI3skQ0ZMQUdTfSAtTzAgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWciCitlbmQKKwordGFzayA6cmVsZWFzZSA9PiA6c3dfdmVycyBkbworICAkREVGSU5FUyA9ICItRE5ERUJVRyAjeyRERUZJTkVTfSIKKyAgJENGTEFHUyA9ICIjeyRDRkxBR1N9IC1PZmFzdCIKK2VuZAorCitkZXNjICdjb25maWd1cmUgYnVpbGQgdHlwZSBkZXBlbmRpbmcgb24gd2hldGhlciBFTlYgdmFyIEZXREVCVUcgaXMgc2V0JwordGFzayA6c2V0X2J1aWxkX3R5cGUgPT4gOnN3X3ZlcnMgZG8KKyAgaWYgRU5WWydGV0RFQlVHJ10KKyAgICBSYWtlOjpUYXNrWzpkZWJ1Z10uaW52b2tlCisgIGVsc2UKKyAgICBSYWtlOjpUYXNrWzpyZWxlYXNlXS5pbnZva2UKKyAgZW5kCitlbmQKKworZGVzYyAnc2V0IGJ1aWxkIGFyY2ggdG8gcHBjJwordGFzayA6cHBjIGRvCisgICRBUkNIRkxBR1MgPSAnLWFyY2ggcHBjJworZW5kCisKK2Rlc2MgJ3NldCBidWlsZCBhcmNoIHRvIHg4Nl82NCcKK3Rhc2sgOng4Nl82NCBkbworICAkQVJDSEZMQUdTID0gJy1hcmNoIHg4Nl82NCcKK2VuZAorCitkZXNjICdzZXQgYnVpbGQgYXJjaCB0byBpMzg2JwordGFzayA6eDg2IGRvCisgICRBUkNIRkxBR1MgPSAnLWFyY2ggaTM4NicKK2VuZAorCit0YXNrIDpzZXR1cF9lbnYgPT4gWzpzZXRfYnVpbGRfdHlwZSwgOnN3X3ZlcnMsIDpnZXRfc2RrX2luZm9dCisKK2RpcmVjdG9yeSAkb2JqX2Rpci50b19zCitmaWxlICRvYmpfZGlyLnRvX3MgPT4gOnNldHVwX2VudgorCitTUkMuemlwKE9CSikuZWFjaCBkbyB8c291cmNlLCBvYmplY3R8CisgIGZpbGUgb2JqZWN0LnRvX3MgPT4gW3NvdXJjZS50b19zLCAkb2JqX2Rpci50b19zXSBkbworICAgIGNtZCA9IFsKKyAgICAgICRDQywKKyAgICAgICRBUkNIRkxBR1MsCisgICAgICAiLXN0ZD0jeyRHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRH0iLAorICAgICAgJENGTEFHUywKKyAgICAgICRERUZJTkVTLAorICAgICAgIi1JI3skc3JjX2Rpcn0iLAorICAgICAgJy1pc3lzcm9vdCcsCisgICAgICAkU0RLX0lORk9bJ1BhdGgnXSwKKyAgICAgICctYycsIHNvdXJjZSwKKyAgICAgICctbycsIG9iamVjdAorICAgIF0KKyAgICBzaChjbWQubWFwIHt8c3wgcy50b19zfS5qb2luKCcgJykpCisgIGVuZAorZW5kCisKK2ZpbGUgJG9ial9kaXIuam9pbignSW5mby5wbGlzdCcpLnRvX3MgPT4gWyRvYmpfZGlyLnRvX3MsIDpzZXR1cF9lbnZdIGRvCisgIEZpbGUub3Blbigkb2JqX2Rpci5qb2luKCdJbmZvLnBsaXN0JykudG9fcywgJ3crJykgZG8gfGZpbGV8CisgICAgaW5kZW50YXRpb24gPSAnJworICAgIGluZGVudCAgICAgID0gIGxhbWJkYSB7fG51bXwgICAgaW5kZW50YXRpb24gPSAnICcgKiBudW0gICAgICAgICAgICAgICB9CisgICAgYWRkICAgICAgICAgPSAgbGFtYmRhIHt8c3RyfCBmaWxlIDw8ICIje2luZGVudGF0aW9ufSN7c3RyfVxuIiAgIH0KKyAgICBrZXkgICAgICAgICA9ICBsYW1iZGEge3xzdHJ8IGFkZFsiPGtleT4je3N0cn08L2tleT4iXSAgICAgICAgICAgfQorICAgIHN0cmluZyAgICAgID0gIGxhbWJkYSB7fHN0cnwgYWRkWyI8c3RyaW5nPiN7c3RyfTwvc3RyaW5nPiJdICAgICB9CisKKworICAgIGFkZFsnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4nXQorICAgIGFkZFsnPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+J10KKyAgICBhZGRbJzxwbGlzdCB2ZXJzaW9uPSIxLjAiPiddCisKKyAgICBpbmRlbnRbMl0KKyAgICBhZGRbJzxkaWN0PiddCisgICAgaW5kZW50WzRdCisKKyAgICBrZXlbJ0NGQnVuZGxlRXhlY3V0YWJsZSddCisgICAgc3RyaW5nWydmc2V2ZW50X3dhdGNoJ10KKyAgICBrZXlbJ0NGQnVuZGxlSWRlbnRpZmllciddCisgICAgc3RyaW5nWydjb20udGVhc3Bvb25vZmluc2FuaXR5LmZzZXZlbnRfd2F0Y2gnXQorICAgIGtleVsnQ0ZCdW5kbGVOYW1lJ10KKyAgICBzdHJpbmdbJ2ZzZXZlbnRfd2F0Y2gnXQorICAgIGtleVsnQ0ZCdW5kbGVEaXNwbGF5TmFtZSddCisgICAgc3RyaW5nWydGU0V2ZW50IFdhdGNoIENMSSddCisgICAga2V5WydOU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQnXQorICAgIHN0cmluZ1snQ29weXJpZ2h0IChDKSAyMDExLTIwMTcgVHJhdmlzIFRpbGxleSddCisKKyAgICBrZXlbJ0NGQnVuZGxlVmVyc2lvbiddCisgICAgc3RyaW5nWyIje0ZTRVZFTlRfV0FUQ0hfRVhFX1ZFUlNJT059Il0KKyAgICBrZXlbJ0xTTWluaW11bVN5c3RlbVZlcnNpb24nXQorICAgIHN0cmluZ1siI3skTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSJdCisgICAga2V5WydEVFNES0J1aWxkJ10KKyAgICBzdHJpbmdbIiN7JFNES19JTkZPWydQcm9kdWN0QnVpbGRWZXJzaW9uJ119Il0KKyAgICBrZXlbJ0RUU0RLTmFtZSddCisgICAgc3RyaW5nWyJtYWNvc3gjeyRTREtfSU5GT1snU0RLVmVyc2lvbiddfSJdCisgICAga2V5WydEVFNES1BhdGgnXQorICAgIHN0cmluZ1siI3skU0RLX0lORk9bJ1BhdGgnXX0iXQorICAgIGtleVsnQnVpbGRNYWNoaW5lT1NCdWlsZCddCisgICAgc3RyaW5nWyIjeyRtYWNfYnVpbGRfdmVyc2lvbn0iXQorICAgIGtleVsnQnVpbGRNYWNoaW5lT1NWZXJzaW9uJ10KKyAgICBzdHJpbmdbIiN7JG1hY19wcm9kdWN0X3ZlcnNpb259Il0KKyAgICBrZXlbJ0ZTRVdDb21waWxlZEF0J10KKyAgICBzdHJpbmdbIiN7JG5vd30iXQorICAgIGtleVsnRlNFV1ZlcnNpb25JbmZvQnVpbGRlciddCisgICAgc3RyaW5nWyIje2B3aG9hbWlgLnN0cmlwfSJdCisgICAga2V5WydGU0VXQnVpbGRUcmlwbGUnXQorICAgIHN0cmluZ1siI3skQlVJTERfVFJJUExFfSJdCisgICAga2V5WydGU0VXQ0MnXQorICAgIHN0cmluZ1siI3skQ0N9Il0KKyAgICBrZXlbJ0ZTRVdDQ1ZlcnNpb24nXQorICAgIHN0cmluZ1siI3skQ0NWZXJzaW9ufSJdCisgICAga2V5WydGU0VXQ0ZMQUdTJ10KKyAgICBzdHJpbmdbIiN7JENGTEFHU30iXQorCisgICAgaW5kZW50WzJdCisgICAgYWRkWyc8L2RpY3Q+J10KKyAgICBpbmRlbnRbMF0KKworICAgIGFkZFsnPC9wbGlzdD4nXQorICBlbmQKK2VuZAorCitkZXNjICdnZW5lcmF0ZSBhbiBJbmZvLnBsaXN0IHVzZWQgZm9yIGNvZGUgc2lnbmluZyBhcyB3ZWxsIGFzIGVtYmVkZGluZyBidWlsZCBzZXR0aW5ncyBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5JwordGFzayA6cGxpc3QgPT4gJG9ial9kaXIuam9pbignSW5mby5wbGlzdCcpLnRvX3MKKworCitmaWxlICRvYmpfZGlyLmpvaW4oJ2ZzZXZlbnRfd2F0Y2gnKS50b19zID0+IFskb2JqX2Rpci50b19zLCAkb2JqX2Rpci5qb2luKCdJbmZvLnBsaXN0JykudG9fc10gKyBPQkoubWFwKCY6dG9fcykgZG8KKyAgY21kID0gWworICAgICRDQywKKyAgICAkQVJDSEZMQUdTLAorICAgICItc3RkPSN7JEdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEfSIsCisgICAgJENGTEFHUywKKyAgICAkREVGSU5FUywKKyAgICAiLUkjeyRzcmNfZGlyfSIsCisgICAgJy1pc3lzcm9vdCcsCisgICAgJFNES19JTkZPWydQYXRoJ10sCisgICAgJy1mcmFtZXdvcmsgQ29yZUZvdW5kYXRpb24gLWZyYW1ld29yayBDb3JlU2VydmljZXMnLAorICAgICctc2VjdGNyZWF0ZSBfX1RFWFQgX19pbmZvX3BsaXN0JywKKyAgICAkb2JqX2Rpci5qb2luKCdJbmZvLnBsaXN0JykKKyAgXSArIE9CSiArIFsKKyAgICAnLW8nLCAkb2JqX2Rpci5qb2luKCdmc2V2ZW50X3dhdGNoJykKKyAgXQorICBzaChjbWQubWFwIHt8c3wgcy50b19zfS5qb2luKCcgJykpCitlbmQKKworZGVzYyAnY29tcGlsZSBhbmQgbGluayBidWlsZC9mc2V2ZW50X3dhdGNoJwordGFzayA6YnVpbGQgPT4gJG9ial9kaXIuam9pbignZnNldmVudF93YXRjaCcpLnRvX3MKKworZGVzYyAnY29kZXNpZ24gYnVpbGQvZnNldmVudF93YXRjaCBiaW5hcnknCit0YXNrIDpjb2Rlc2lnbiA9PiA6YnVpbGQgZG8KKyAgc2ggImNvZGVzaWduIC1zICcjeyRDT0RFX1NJR05fSURFTlRJVFl9JyAjeyRvYmpfZGlyLmpvaW4oJ2ZzZXZlbnRfd2F0Y2gnKX0iCitlbmQKKworZGlyZWN0b3J5ICR0aGlzX2Rpci5wYXJlbnQuam9pbignYmluJykKKworZGVzYyAncmVwbGFjZSBidW5kbGVkIGZzZXZlbnRfd2F0Y2ggYmluYXJ5IHdpdGggYnVpbGQvZnNldmVudF93YXRjaCcKK3Rhc2sgOnJlcGxhY2VfZXhlID0+IFskdGhpc19kaXIucGFyZW50LmpvaW4oJ2JpbicpLCA6YnVpbGRdIGRvCisgIHNoICJtdiAjeyRvYmpfZGlyLmpvaW4oJ2ZzZXZlbnRfd2F0Y2gnKX0gI3skZmluYWxfZXhlfSIKK2VuZAorCit0YXNrIDpkZWZhdWx0ID0+IFs6cmVwbGFjZV9leGUsIDpjbGVhbl0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2xpYi9vdG5ldHN0cmluZy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWZzZXZlbnQtMC4xMC4yL2xpYi9vdG5ldHN0cmluZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhkZTRjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvbGliL290bmV0c3RyaW5nLnJiCkBAIC0wLDAgKzEsODUgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDExIEtvbnN0YW50aW4gSGFhc2UKKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisjIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisjIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorIyBUSEUgU09GVFdBUkUuCisKKworcmVxdWlyZSAnc3RyaW5naW8nCisKK21vZHVsZSBPVE5ldHN0cmluZworICBjbGFzcyBFcnJvciA8IFN0YW5kYXJkRXJyb3I7IGVuZAorCisgIGNsYXNzIDw8IHNlbGYKKyAgICBkZWYgcGFyc2UoaW8sIGVuY29kaW5nID0gJ2ludGVybmFsJywgZmFsbGJhY2tfZW5jb2RpbmcgPSBuaWwpCisgICAgICBmYWxsYmFja19lbmNvZGluZyA9IGlvLmVuY29kaW5nIGlmIGlvLnJlc3BvbmRfdG8/IDplbmNvZGluZworICAgICAgaW8gPSBTdHJpbmdJTy5uZXcoaW8pIGlmIGlvLnJlc3BvbmRfdG8/IDp0b19zdHIKKyAgICAgIGxlbmd0aCwgYnl0ZSA9ICIiLCBuaWwKKworICAgICAgd2hpbGUgYnl0ZS5uaWw/IHx8IGJ5dGUgPX4gL1xkLworICAgICAgICBsZW5ndGggPDwgYnl0ZSBpZiBieXRlCisgICAgICAgIGJ5dGUgPSBpby5yZWFkKDEpCisgICAgICBlbmQKKworICAgICAgaWYgbGVuZ3RoLnNpemUgPiA5CisgICAgICAgIHJhaXNlIEVycm9yLCAiI3tsZW5ndGh9IGlzIGxvbmdlciB0aGFuIDkgZGlnaXRzIgorICAgICAgZWxzaWYgbGVuZ3RoICF+IC9cZCsvCisgICAgICAgIHJhaXNlIEVycm9yLCAiRXhwZWN0ZWQgJyN7Ynl0ZX0nIHRvIGJlIGEgZGlnaXQiCisgICAgICBlbmQKKyAgICAgIGxlbmd0aCA9IEludGVnZXIobGVuZ3RoKQorCisgICAgICBjYXNlIGJ5dGUKKyAgICAgIHdoZW4gJyMnIHRoZW4gSW50ZWdlciBpby5yZWFkKGxlbmd0aCkKKyAgICAgIHdoZW4gJywnIHRoZW4gd2l0aF9lbmNvZGluZyBpby5yZWFkKGxlbmd0aCksIGVuY29kaW5nLCBmYWxsYmFja19lbmNvZGluZworICAgICAgd2hlbiAnficgdGhlbgorICAgICAgICByYWlzZSBFcnJvciwgIm5pbCBoYXMgbGVuZ3RoIG9mIDAsICN7bGVuZ3RofSBnaXZlbiIgdW5sZXNzIGxlbmd0aCA9PSAwCisgICAgICB3aGVuICchJyB0aGVuIGlvLnJlYWQobGVuZ3RoKSA9PSAndHJ1ZScKKyAgICAgIHdoZW4gJ1snLCAneycKKyAgICAgICAgYXJyYXkgPSBbXQorICAgICAgICBzdGFydCA9IGlvLnBvcworICAgICAgICBhcnJheSA8PCBwYXJzZShpbywgZW5jb2RpbmcsIGZhbGxiYWNrX2VuY29kaW5nKSB3aGlsZSBpby5wb3MgLSBzdGFydCA8IGxlbmd0aAorICAgICAgICByYWlzZSBFcnJvciwgJ05lc3RlZCBlbGVtZW50IGxvbmdlciB0aGFuIGNvbnRhaW5lcicgaWYgaW8ucG9zIC0gc3RhcnQgIT0gbGVuZ3RoCisgICAgICAgIGJ5dGUgPT0gInsiID8gSGFzaFsqYXJyYXldIDogYXJyYXkKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgRXJyb3IsICJVbmtub3duIHR5cGUgJyN7Ynl0ZX0nIgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgZW5jb2RlKG9iaiwgc3RyaW5nX3NlcCA9ICcsJykKKyAgICAgIGNhc2Ugb2JqCisgICAgICB3aGVuIFN0cmluZyAgIHRoZW4gd2l0aF9lbmNvZGluZyAiI3tvYmouYnl0ZXNpemV9I3tzdHJpbmdfc2VwfSN7b2JqfSIsICJiaW5hcnkiCisgICAgICB3aGVuIEludGVnZXIgIHRoZW4gZW5jb2RlKG9iai5pbnNwZWN0LCAnIycpCisgICAgICB3aGVuIE5pbENsYXNzIHRoZW4gIjB+IgorICAgICAgd2hlbiBBcnJheSAgICB0aGVuIGVuY29kZShvYmoubWFwIHsgfGV8IGVuY29kZShlKSB9LmpvaW4sICdbJykKKyAgICAgIHdoZW4gSGFzaCAgICAgdGhlbiBlbmNvZGUob2JqLm1hcCB7IHxhLGJ8IGVuY29kZShhKStlbmNvZGUoYikgfS5qb2luLCAneycpCisgICAgICB3aGVuIEZhbHNlQ2xhc3MsIFRydWVDbGFzcyB0aGVuIGVuY29kZShvYmouaW5zcGVjdCwgJyEnKQorICAgICAgZWxzZSByYWlzZSBFcnJvciwgJ2Nhbm5vdCBlbmNvZGUgJXAnICUgb2JqCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiB3aXRoX2VuY29kaW5nKHN0ciwgZW5jb2RpbmcsIGZhbGxiYWNrID0gbmlsKQorICAgICAgcmV0dXJuIHN0ciB1bmxlc3Mgc3RyLnJlc3BvbmRfdG8/IDplbmNvZGUKKyAgICAgIGVuY29kaW5nID0gRW5jb2RpbmcuZmluZCBlbmNvZGluZyBpZiBlbmNvZGluZy5yZXNwb25kX3RvPyA6dG9fc3RyCisgICAgICBlbmNvZGluZyB8fD0gZmFsbGJhY2sKKyAgICAgIGVuY29kaW5nID8gc3RyLmVuY29kZShlbmNvZGluZykgOiBzdHIKKyAgICByZXNjdWUgRW5jb2RpbmdFcnJvcgorICAgICAgc3RyLmZvcmNlX2VuY29kaW5nKGVuY29kaW5nKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvbGliL3JiLWZzZXZlbnQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9saWIvcmItZnNldmVudC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY2OGEzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvbGliL3JiLWZzZXZlbnQucmIKQEAgLTAsMCArMSwzIEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCityZXF1aXJlICdyYi1mc2V2ZW50L2ZzZXZlbnQnCityZXF1aXJlICdyYi1mc2V2ZW50L3ZlcnNpb24nCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9saWIvcmItZnNldmVudC9mc2V2ZW50LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvbGliL3JiLWZzZXZlbnQvZnNldmVudC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg2MDlkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvbGliL3JiLWZzZXZlbnQvZnNldmVudC5yYgpAQCAtMCwwICsxLDE1NyBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorCityZXF1aXJlICdvdG5ldHN0cmluZycKKworY2xhc3MgRlNFdmVudAorICBjbGFzcyA8PCBzZWxmCisgICAgY2xhc3NfZXZhbCA8PC1FTkQKKyAgICAgIGRlZiByb290X3BhdGgKKyAgICAgICAgIiN7RmlsZS5leHBhbmRfcGF0aChGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uJywgJy4uJykpfSIKKyAgICAgIGVuZAorICAgIEVORAorICAgIGNsYXNzX2V2YWwgPDwtRU5ECisgICAgICBkZWYgd2F0Y2hlcl9wYXRoCisgICAgICAgICIje0ZpbGUuam9pbihGU0V2ZW50LnJvb3RfcGF0aCwgJ2JpbicsICdmc2V2ZW50X3dhdGNoJyl9IgorICAgICAgZW5kCisgICAgRU5ECisgIGVuZAorCisgIGF0dHJfcmVhZGVyIDpwYXRocywgOmNhbGxiYWNrCisKKyAgZGVmIGluaXRpYWxpemUgYXJncyA9IG5pbCwgJmJsb2NrCisgICAgd2F0Y2goYXJncywgJmJsb2NrKSB1bmxlc3MgYXJncy5uaWw/CisgIGVuZAorCisgIGRlZiB3YXRjaCh3YXRjaF9wYXRocywgb3B0aW9ucz1uaWwsICZibG9jaykKKyAgICBAcGF0aHMgICAgICA9IHdhdGNoX3BhdGhzLmtpbmRfb2Y/KEFycmF5KSA/IHdhdGNoX3BhdGhzIDogW3dhdGNoX3BhdGhzXQorICAgIEBjYWxsYmFjayAgID0gYmxvY2sKKworICAgIGlmIG9wdGlvbnMua2luZF9vZj8oSGFzaCkKKyAgICAgIEBvcHRpb25zICA9IHBhcnNlX29wdGlvbnMob3B0aW9ucykKKyAgICBlbHNpZiBvcHRpb25zLmtpbmRfb2Y/KEFycmF5KQorICAgICAgQG9wdGlvbnMgID0gb3B0aW9ucworICAgIGVsc2UKKyAgICAgIEBvcHRpb25zICA9IFtdCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBydW4KKyAgICBAcGlwZSAgICA9IG9wZW5fcGlwZQorICAgIEBydW5uaW5nID0gdHJ1ZQorCisgICAgIyBwbGVhc2Ugbm90ZSB0aGUgdXNlIG9mIElPOjpzZWxlY3QoKSBoZXJlLCBhcyBpdCBpcyB1c2VkIHNwZWNpZmljYWxseSB0bworICAgICMgcHJlc2VydmUgY29ycmVjdCBzaWduYWwgaGFuZGxpbmcgYmVoYXZpb3IgaW4gcnVieSAxLjguCisgICAgd2hpbGUgQHJ1bm5pbmcgJiYgSU86OnNlbGVjdChbQHBpcGVdLCBuaWwsIG5pbCwgbmlsKQorICAgICAgIyBtYW5hZ2luZyB0aGUgSU8gb3Vyc2VsdmVzIGFsbG93cyB1cyB0byBiZSBjYXJlZnVsIGFuZCBuZXZlciBwYXNzIGFuCisgICAgICAjIGluY29tcGxldGUgbWVzc2FnZSB0byBPVE5ldHN0cmluZy5wYXJzZSgpCisgICAgICBtZXNzYWdlID0gIiIKKyAgICAgIGxlbmd0aCA9ICIiCisgICAgICBieXRlID0gbmlsCisKKyAgICAgIHJlYWRpbmdfbGVuZ3RoID0gdHJ1ZQorICAgICAgZm91bmRfbGVuZ3RoID0gZmFsc2UKKworICAgICAgd2hpbGUgcmVhZGluZ19sZW5ndGgKKyAgICAgICAgYnl0ZSA9IEBwaXBlLnJlYWQoMSkKKyAgICAgICAgaWYgIiN7Ynl0ZX0iID1+IC9cZC8KKyAgICAgICAgICBsZW5ndGggPDwgYnl0ZQorICAgICAgICAgIGZvdW5kX2xlbmd0aCA9IHRydWUKKyAgICAgICAgZWxzaWYgZm91bmRfbGVuZ3RoID09IGZhbHNlCisgICAgICAgICAgbmV4dAorICAgICAgICBlbHNlCisgICAgICAgICAgcmVhZGluZ19sZW5ndGggPSBmYWxzZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgbGVuZ3RoID0gSW50ZWdlcihsZW5ndGgsIDEwKQorICAgICAgdHlwZSA9IGJ5dGUKKworICAgICAgbWVzc2FnZSA8PCAiI3tsZW5ndGh9I3t0eXBlfSIKKyAgICAgIG1lc3NhZ2UgPDwgQHBpcGUucmVhZChsZW5ndGgpCisKKyAgICAgIGRlY29kZWQgPSBPVE5ldHN0cmluZy5wYXJzZShtZXNzYWdlKQorICAgICAgbW9kaWZpZWRfcGF0aHMgPSBkZWNvZGVkWyJldmVudHMiXS5tYXAge3xldmVudHwgZXZlbnRbInBhdGgiXX0KKyAgICAgICMgcGFzc2luZyB0aGUgZnVsbCBpbmZvIGFzIGEgc2Vjb25kIGJsb2NrIHBhcmFtIGZlZWxzIGlja3ksIGJ1dCBzdWNoIGlzCisgICAgICAjIHRoZSB0cmFwIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICBjYXNlIGNhbGxiYWNrLmFyaXR5CisgICAgICAgIHdoZW4gMQorICAgICAgICAgIGNhbGxiYWNrLmNhbGwobW9kaWZpZWRfcGF0aHMpCisgICAgICAgIHdoZW4gMgorICAgICAgICAgIGNhbGxiYWNrLmNhbGwobW9kaWZpZWRfcGF0aHMsIGRlY29kZWQpCisgICAgICBlbmQKKyAgICBlbmQKKyAgcmVzY3VlIEludGVycnVwdCwgSU9FcnJvciwgRXJybm86OkVCQURGCisgIGVuc3VyZQorICAgIHN0b3AKKyAgZW5kCisKKyAgZGVmIHN0b3AKKyAgICB1bmxlc3MgQHBpcGUubmlsPworICAgICAgUHJvY2Vzcy5raWxsKCdLSUxMJywgQHBpcGUucGlkKSBpZiBwcm9jZXNzX3J1bm5pbmc/KEBwaXBlLnBpZCkKKyAgICAgIEBwaXBlLmNsb3NlCisgICAgZW5kCisgIHJlc2N1ZSBJT0Vycm9yCisgIGVuc3VyZQorICAgIEBydW5uaW5nID0gZmFsc2UKKyAgZW5kCisKKyAgZGVmIHByb2Nlc3NfcnVubmluZz8ocGlkKQorICAgIGJlZ2luCisgICAgICBQcm9jZXNzLmtpbGwoMCwgcGlkKQorICAgICAgdHJ1ZQorICAgIHJlc2N1ZSBFcnJubzo6RVNSQ0gKKyAgICAgIGZhbHNlCisgICAgZW5kCisgIGVuZAorCisgIGlmIFJVQllfVkVSU0lPTiA8ICcxLjknCisgICAgZGVmIG9wZW5fcGlwZQorICAgICAgSU8ucG9wZW4oIicje3NlbGYuY2xhc3Mud2F0Y2hlcl9wYXRofScgI3tvcHRpb25zX3N0cmluZ30gI3tzaGVsbGVzY2FwZWRfcGF0aHN9IikKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBvcHRpb25zX3N0cmluZworICAgICAgQG9wdGlvbnMuam9pbignICcpCisgICAgZW5kCisKKyAgICBkZWYgc2hlbGxlc2NhcGVkX3BhdGhzCisgICAgICBAcGF0aHMubWFwIHt8cGF0aHwgc2hlbGxlc2NhcGUocGF0aCl9LmpvaW4oJyAnKQorICAgIGVuZAorCisgICAgIyBmb3IgUnVieSAxLjguNiAgc3VwcG9ydAorICAgIGRlZiBzaGVsbGVzY2FwZShzdHIpCisgICAgICAjIEFuIGVtcHR5IGFyZ3VtZW50IHdpbGwgYmUgc2tpcHBlZCwgc28gcmV0dXJuIGVtcHR5IHF1b3Rlcy4KKyAgICAgIHJldHVybiAiJyciIGlmIHN0ci5lbXB0eT8KKworICAgICAgc3RyID0gc3RyLmR1cAorCisgICAgICAjIFByb2Nlc3MgYXMgYSBzaW5nbGUgYnl0ZSBzZXF1ZW5jZSBiZWNhdXNlIG5vdCBhbGwgc2hlbGwKKyAgICAgICMgaW1wbGVtZW50YXRpb25zIGFyZSBtdWx0aWJ5dGUgYXdhcmUuCisgICAgICBzdHIuZ3N1YiEoLyhbXkEtWmEtejAtOV9cLS4sOlwvQFxuXSkvbiwgIlxcXFxcXDEiKQorCisgICAgICAjIEEgTEYgY2Fubm90IGJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaCBiZWNhdXNlIGEgYmFja3NsYXNoICsgTEYKKyAgICAgICMgY29tYm8gaXMgcmVnYXJkZWQgYXMgbGluZSBjb250aW51YXRpb24gYW5kIHNpbXBseSBpZ25vcmVkLgorICAgICAgc3RyLmdzdWIhKC9cbi8sICInXG4nIikKKworICAgICAgcmV0dXJuIHN0cgorICAgIGVuZAorICBlbHNlCisgICAgZGVmIG9wZW5fcGlwZQorICAgICAgSU8ucG9wZW4oW3NlbGYuY2xhc3Mud2F0Y2hlcl9wYXRoXSArIEBvcHRpb25zICsgQHBhdGhzKQorICAgIGVuZAorICBlbmQKKworICBwcml2YXRlCisKKyAgZGVmIHBhcnNlX29wdGlvbnMob3B0aW9ucz17fSkKKyAgICBvcHRzID0gWyctLWZvcm1hdD1vdG5ldHN0cmluZyddCisgICAgb3B0cy5jb25jYXQoWyctLXNpbmNlLXdoZW4nLCBvcHRpb25zWzpzaW5jZV93aGVuXV0pIGlmIG9wdGlvbnNbOnNpbmNlX3doZW5dCisgICAgb3B0cy5jb25jYXQoWyctLWxhdGVuY3knLCBvcHRpb25zWzpsYXRlbmN5XV0pIGlmIG9wdGlvbnNbOmxhdGVuY3ldCisgICAgb3B0cy5wdXNoKCctLW5vLWRlZmVyJykgaWYgb3B0aW9uc1s6bm9fZGVmZXJdCisgICAgb3B0cy5wdXNoKCctLXdhdGNoLXJvb3QnKSBpZiBvcHRpb25zWzp3YXRjaF9yb290XQorICAgIG9wdHMucHVzaCgnLS1maWxlLWV2ZW50cycpIGlmIG9wdGlvbnNbOmZpbGVfZXZlbnRzXQorICAgICMgcnVieSAxLjkncyBJTy5wb3BlbihhcnJheS1vZi1zdHVmZikgc3ludGF4IHJlcXVpcmVzIGFsbCBpdGVtcyB0byBiZSBzdHJpbmdzCisgICAgb3B0cy5tYXAge3xvcHR8ICIje29wdH0ifQorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9saWIvcmItZnNldmVudC92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvbGliL3JiLWZzZXZlbnQvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzMwMGNlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvbGliL3JiLWZzZXZlbnQvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDUgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKworY2xhc3MgRlNFdmVudAorICBWRVJTSU9OID0gJzAuMTAuMicKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvcmItZnNldmVudC5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItZnNldmVudC0wLjEwLjIvcmItZnNldmVudC5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzcwZGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1mc2V2ZW50LTAuMTAuMi9yYi1mc2V2ZW50LmdlbXNwZWMKQEAgLTAsMCArMSwyNyBAQAorIyBjb2Rpbmc6IHV0Zi04CitsaWIgPSBGaWxlLmV4cGFuZF9wYXRoKCcuLi9saWInLCBfX0ZJTEVfXykKKyRMT0FEX1BBVEgudW5zaGlmdChsaWIpIHVubGVzcyAkTE9BRF9QQVRILmluY2x1ZGU/KGxpYikKK3JlcXVpcmUgJ3JiLWZzZXZlbnQvdmVyc2lvbicKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lICAgICAgICA9ICdyYi1mc2V2ZW50JworICBzLnZlcnNpb24gICAgID0gRlNFdmVudDo6VkVSU0lPTgorICBzLmF1dGhvcnMgICAgID0gWydUaGliYXVkIEd1aWxsYXVtZS1HZW50aWwnLCAnVHJhdmlzIFRpbGxleSddCisgIHMuZW1haWwgICAgICAgPSBbJ3RoaWJhdWRAdGhpYmF1ZC5nZycsICd0dGlsbGV5QGdtYWlsLmNvbSddCisgIHMuaG9tZXBhZ2UgICAgPSAnaHR0cDovL3J1YnlnZW1zLm9yZy9nZW1zL3JiLWZzZXZlbnQnCisgIHMuc3VtbWFyeSAgICAgPSAnVmVyeSBzaW1wbGUgJiB1c2FibGUgRlNFdmVudHMgQVBJJworICBzLmRlc2NyaXB0aW9uID0gJ0ZTRXZlbnRzIEFQSSB3aXRoIFNpZ25hbHMgY2F0Y2hpbmcgKHdpdGhvdXQgUnVieUNvY29hKScKKyAgcy5saWNlbnNlICAgICA9ICdNSVQnCisKKyAgcy5tZXRhZGF0YSA9IHsKKyAgICAnc291cmNlX2NvZGVfdXJpJyA9PiAnaHR0cHM6Ly9naXRodWIuY29tL3RoaWJhdWRnZy9yYi1mc2V2ZW50JworICB9CisKKyAgcy5maWxlcyA9IGBnaXQgbHMtZmlsZXMgLXpgLnNwbGl0KCJceDAiKS5yZWplY3QgeyB8ZnwgZi5tYXRjaCglcntec3BlYy99KSB9CisgIHMucmVxdWlyZV9wYXRoID0gJ2xpYicKKworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdidW5kbGVyJywgICAgICd+PiAxLjAnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JzcGVjJywgICAgICAgJ34+IDMuNicKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAnZ3VhcmQtcnNwZWMnLCAnfj4gNC4yJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWtlJywgICAgICAgICd+PiAxMi4wJworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC8uZ2l0aWdub3JlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjg2OGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE5IEBACisqLmdlbQorKi5yYmMKKy5idW5kbGUKKy5jb25maWcKKy55YXJkb2MKK0dlbWZpbGUubG9jaworSW5zdGFsbGVkRmlsZXMKK195YXJkb2MKK2NvdmVyYWdlCitkb2MvCitsaWIvYnVuZGxlci9tYW4KK3BrZworcmRvYworc3BlYy9yZXBvcnRzCit0ZXN0L3RtcAordGVzdC92ZXJzaW9uX3RtcAordG1wCisudGFncyoKKy5yc3BlY19zdGF0dXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC8udHJhdmlzLnltbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGY4NDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC8udHJhdmlzLnltbApAQCAtMCwwICsxLDMwIEBACitsYW5ndWFnZTogcnVieQorc3VkbzogZmFsc2UKK2Rpc3Q6IHRydXN0eQorY2FjaGU6IGJ1bmRsZXIKK3J2bToKKyAgLSAxLjgKKyAgLSAxLjkKKyAgLSAyLjAKKyAgLSAyLjEKKyAgLSAyLjIKKyAgLSAyLjMKKyAgLSAyLjQKKyAgLSBqcnVieS1oZWFkCisgIC0gcnVieS1oZWFkCisgIC0ganJ1YnktOS4xLjguMAorICAtIGpydWJ5LWhlYWQKKyAgLSByYngtMworbWF0cml4OgorICBhbGxvd19mYWlsdXJlczoKKyAgICAtIHJ2bTogcnVieS1oZWFkCisgICAgLSBydm06IGpydWJ5LWhlYWQKKyAgICAtIHJ2bTogcmJ4LTMKKyAgZmFzdF9maW5pc2g6IHRydWUKK3NjcmlwdDoKKyAgIyBVbml0IHRlc3QKKyAgLSBidW5kbGUgZXhlYyByYWtlCisgICMgSW5zdGFsbCB0ZXN0CisgIC0gZ2VtIGJ1aWxkIHJiLWlub3RpZnkuZ2Vtc3BlYworICAtIGdlbSBpbnN0YWxsIHJiLWlub3RpZnktKi5nZW0KKyAgLSBzaCAtYyAiZ2VtIGxpc3QgfCBncmVwIHJiLWlub3RpZnkiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC8ueWFyZG9wdHMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC8ueWFyZG9wdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzNDdjNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwLy55YXJkb3B0cwpAQCAtMCwwICsxLDQgQEAKKy0tcmVhZG1lICAgICAgICAgIFJFQURNRS5tZAorLS1tYXJrdXAgICAgICAgICAgbWFya2Rvd24KKy0tbWFya3VwLXByb3ZpZGVyIG1hcnVrdQorLS1uby1wcml2YXRlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9HZW1maWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTc1ZGYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvR2VtZmlsZQpAQCAtMCwwICsxLDMgQEAKK3NvdXJjZSAnaHR0cHM6Ly9ydWJ5Z2Vtcy5vcmcnCisKK2dlbXNwZWMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM4YWNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTAzIEBACisjIHJiLWlub3RpZnkKKworVGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVyIG92ZXIgdGhlIFtpbm90aWZ5XShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lub3RpZnkpIExpbnV4IGtlcm5lbCBzdWJzeXN0ZW0KK2ZvciBtb25pdG9yaW5nIGNoYW5nZXMgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorSXQgdXNlcyB0aGUgW0ZGSV0oaHR0cDovL3dpa2kuZ2l0aHViLmNvbS9mZmkvZmZpKSBnZW0gdG8gYXZvaWQgaGF2aW5nIHRvIGNvbXBpbGUgYSBDIGV4dGVuc2lvbi4KKworW0FQSSBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBvbiByZG9jLmluZm9dKGh0dHA6Ly9yZG9jLmluZm8vcHJvamVjdHMvbmV4My9yYi1pbm90aWZ5KS4KKworWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3NlY3VyZS50cmF2aXMtY2kub3JnL2d1YXJkL3JiLWlub3RpZnkuc3ZnKV0oaHR0cDovL3RyYXZpcy1jaS5vcmcvZ3VhcmQvcmItaW5vdGlmeSkKK1shW0NvZGUgQ2xpbWF0ZV0oaHR0cHM6Ly9jb2RlY2xpbWF0ZS5jb20vZ2l0aHViL2d1YXJkL3JiLWlub3RpZnkuc3ZnKV0oaHR0cHM6Ly9jb2RlY2xpbWF0ZS5jb20vZ2l0aHViL2d1YXJkL3JiLWlub3RpZnkpCitbIVtDb3ZlcmFnZSBTdGF0dXNdKGh0dHBzOi8vY292ZXJhbGxzLmlvL3JlcG9zL2d1YXJkL3JiLWlub3RpZnkvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vci9ndWFyZC9yYi1pbm90aWZ5KQorCisjIyBCYXNpYyBVc2FnZQorCitUaGUgQVBJIGlzIHNpbWlsYXIgdG8gdGhlIGlub3RpZnkgQyBBUEksIGJ1dCB3aXRoIGEgbW9yZSBSdWJ5aXNoIGZlZWwuCitGaXJzdCwgY3JlYXRlIGEgbm90aWZpZXI6CisKKyAgICBub3RpZmllciA9IElOb3RpZnk6Ok5vdGlmaWVyLm5ldworCitUaGVuLCB0ZWxsIGl0IHRvIHdhdGNoIHRoZSBwYXRocyB5b3UncmUgaW50ZXJlc3RlZCBpbgorZm9yIHRoZSBldmVudHMgeW91IGNhcmUgYWJvdXQ6CisKKyAgICBub3RpZmllci53YXRjaCgicGF0aC90by9mb28udHh0IiwgOm1vZGlmeSkge3B1dHMgImZvby50eHQgd2FzIG1vZGlmaWVkISJ9CisgICAgbm90aWZpZXIud2F0Y2goInBhdGgvdG8vYmFyIiwgOm1vdmVkX3RvLCA6Y3JlYXRlKSBkbyB8ZXZlbnR8CisgICAgICBwdXRzICIje2V2ZW50Lm5hbWV9IGlzIG5vdyBpbiBwYXRoL3RvL2JhciEiCisgICAgZW5kCisKK0lub3RpZnkgY2FuIHdhdGNoIGRpcmVjdG9yaWVzIG9yIGluZGl2aWR1YWwgZmlsZXMuCitJdCBjYW4gcGF5IGF0dGVudGlvbiB0byBhbGwgc29ydHMgb2YgZXZlbnRzOworZm9yIGEgZnVsbCBsaXN0LCBzZWUgW3RoZSBpbm90aWZ5IG1hbiBwYWdlXShodHRwOi8vd3d3LnRpbi5vcmcvYmluL21hbi5jZ2k/c2VjdGlvbj03JnRvcGljPWlub3RpZnkpLgorCitGaW5hbGx5LCB5b3UgZ2V0IGF0IHRoZSBldmVudHMgdGhlbXNlbHZlczoKKworICAgIG5vdGlmaWVyLnJ1bgorCitUaGlzIHdpbGwgbG9vcCBpbmZpbml0ZWx5LCBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Mgd2hlbiB0aGUgZmlsZXMgYXJlIGNoYW5nZWQuCitJZiB5b3UgZG9uJ3Qgd2FudCBpbmZpbml0ZSBsb29waW5nLAoreW91IGNhbiBhbHNvIGJsb2NrIHVudGlsIHRoZXJlIGFyZSBhdmFpbGFibGUgZXZlbnRzLAorcHJvY2VzcyB0aGVtIGFsbCBhdCBvbmNlLAorYW5kIHRoZW4gY29udGludWUgb24geW91ciBtZXJyeSB3YXk6CisKKyAgICBub3RpZmllci5wcm9jZXNzCisKKyMjIEFkdmFuY2VkIFVzYWdlCisKK1NvbWV0aW1lcyBpdCdzIG5lY2Vzc2FyeSB0byBoYXZlIGZpbmVyIGNvbnRyb2wgb3ZlciB0aGUgdW5kZXJseWluZyBJTyBvcGVyYXRpb25zCit0aGFuIGlzIHByb3ZpZGVkIGJ5IHRoZSBzaW1wbGUgY2FsbGJhY2sgQVBJLgorVGhlIHRyaWNrIHRvIHRoaXMgaXMgdGhhdCB0aGUgXHtJTm90aWZ5OjpOb3RpZmllciN0b19pbyBOb3RpZmllciN0b19pb30gbWV0aG9kCityZXR1cm5zIGEgZnVsbHktZnVuY3Rpb25hbCBJTyBvYmplY3QsCit3aXRoIGEgZmlsZSBkZXNjcmlwdG9yIGFuZCBldmVyeXRoaW5nLgorVGhpcyBtZWFucywgZm9yIGV4YW1wbGUsIHRoYXQgaXQgY2FuIGJlIHBhc3NlZCB0byBgSU8jc2VsZWN0YDoKKworICAgICAjIFdhaXQgMTAgc2Vjb25kcyBmb3IgYW4gZXZlbnQgdGhlbiBnaXZlIHVwCisgICAgIGlmIElPLnNlbGVjdChbbm90aWZpZXIudG9faW9dLCBbXSwgW10sIDEwKQorICAgICAgIG5vdGlmaWVyLnByb2Nlc3MKKyAgICAgZW5kCisKK0l0IGNhbiBldmVuIGJlIHVzZWQgd2l0aCBFdmVudE1hY2hpbmU6CisKKyAgICAgcmVxdWlyZSAnZXZlbnRtYWNoaW5lJworCisgICAgIEVNLnJ1biBkbworICAgICAgIEVNLndhdGNoIG5vdGlmaWVyLnRvX2lvIGRvCisgICAgICAgICBub3RpZmllci5wcm9jZXNzCisgICAgICAgZW5kCisgICAgIGVuZAorCitVbmZvcnR1bmF0ZWx5LCB0aGlzIGN1cnJlbnRseSBkb2Vzbid0IHdvcmsgdW5kZXIgSlJ1YnkuCitKUnVieSBjdXJyZW50bHkgZG9lc24ndCB1c2UgbmF0aXZlIGZpbGUgZGVzY3JpcHRvcnMgZm9yIHRoZSBJTyBvYmplY3QsCitzbyB3ZSBjYW4ndCB1c2UgdGhlIG5vdGlmaWVyJ3MgZmlsZSBkZXNjcmlwdG9yIGFzIGEgc3RhbmQtaW4uCisKKyMjIENvbnRyaWJ1dGluZworCisxLiBGb3JrIGl0CisyLiBDcmVhdGUgeW91ciBmZWF0dXJlIGJyYW5jaCAoYGdpdCBjaGVja291dCAtYiBteS1uZXctZmVhdHVyZWApCiszLiBDb21taXQgeW91ciBjaGFuZ2VzIChgZ2l0IGNvbW1pdCAtYW0gJ0FkZCBzb21lIGZlYXR1cmUnYCkKKzQuIFB1c2ggdG8gdGhlIGJyYW5jaCAoYGdpdCBwdXNoIG9yaWdpbiBteS1uZXctZmVhdHVyZWApCis1LiBDcmVhdGUgbmV3IFB1bGwgUmVxdWVzdAorCisjIyBMaWNlbnNlCisKK1JlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KKworQ29weXJpZ2h0LCAyMDA5LCBieSBOYXRoYW4gV2VpemVuYmF1bS4gIAorQ29weXJpZ2h0LCAyMDE3LCBieSBbU2FtdWVsIEcuIEQuIFdpbGxpYW1zXShodHRwOi8vd3d3LmNvZGVvdGFrdS5jb20vc2FtdWVsLXdpbGxpYW1zKS4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9SYWtlZmlsZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL1Jha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjM2EzYjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9SYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACityZXF1aXJlICJidW5kbGVyL2dlbV90YXNrcyIKK3JlcXVpcmUgJ3JzcGVjL2NvcmUvcmFrZV90YXNrJworCitSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3KDpzcGVjKQorCitkZXNjICJSdW4gdGVzdHMiCit0YXNrIDpkZWZhdWx0ID0+IDpzcGVjCisKK3Rhc2sgOmNvbnNvbGUgZG8KKyAgcmVxdWlyZSAncmItaW5vdGlmeScKKyAgcmVxdWlyZSAncHJ5JworICAKKyAgYmluZGluZy5wcnkKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9saWIvcmItaW5vdGlmeS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk3YWVmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkucmIKQEAgLTAsMCArMSwxNSBAQAorcmVxdWlyZSAncmItaW5vdGlmeS92ZXJzaW9uJworcmVxdWlyZSAncmItaW5vdGlmeS9uYXRpdmUnCityZXF1aXJlICdyYi1pbm90aWZ5L25hdGl2ZS9mbGFncycKK3JlcXVpcmUgJ3JiLWlub3RpZnkvbm90aWZpZXInCityZXF1aXJlICdyYi1pbm90aWZ5L3dhdGNoZXInCityZXF1aXJlICdyYi1pbm90aWZ5L2V2ZW50JworcmVxdWlyZSAncmItaW5vdGlmeS9lcnJvcnMnCisKKyMgVGhlIHJvb3QgbW9kdWxlIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBpcyBsYWlkIG91dCBhcyBzbzoKKyMKKyMgKiB7Tm90aWZpZXJ9IC0tIFRoZSBtYWluIGNsYXNzLCB3aGVyZSB0aGUgbm90aWZpY2F0aW9ucyBhcmUgc2V0IHVwCisjICoge1dhdGNoZXJ9IC0tIEEgd2F0Y2hlciBmb3IgYSBzaW5nbGUgZmlsZSBvciBkaXJlY3RvcnkKKyMgKiB7RXZlbnR9IC0tIEFuIGZpbGVzeXN0ZW0gZXZlbnQgbm90aWZpY2F0aW9uCittb2R1bGUgSU5vdGlmeQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9saWIvcmItaW5vdGlmeS9lcnJvcnMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9saWIvcmItaW5vdGlmeS9lcnJvcnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZTcwOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL2xpYi9yYi1pbm90aWZ5L2Vycm9ycy5yYgpAQCAtMCwwICsxLDMgQEAKK21vZHVsZSBJTm90aWZ5CisgIGNsYXNzIFF1ZXVlT3ZlcmZsb3dFcnJvciA8IFJ1bnRpbWVFcnJvcjsgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL2xpYi9yYi1pbm90aWZ5L2V2ZW50LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkvZXZlbnQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MDFhYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL2xpYi9yYi1pbm90aWZ5L2V2ZW50LnJiCkBAIC0wLDAgKzEsMTQ2IEBACittb2R1bGUgSU5vdGlmeQorICAjIEFuIGV2ZW50IGNhdXNlZCBieSBhIGNoYW5nZSBvbiB0aGUgZmlsZXN5c3RlbS4KKyAgIyBFYWNoIHtXYXRjaGVyfSBjYW4gZmlyZSBtYW55IGV2ZW50cywKKyAgIyB3aGljaCBhcmUgcGFzc2VkIHRvIHRoYXQgd2F0Y2hlcidzIGNhbGxiYWNrLgorICBjbGFzcyBFdmVudAorICAgICMgQSBsaXN0IG9mIG90aGVyIGV2ZW50cyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoaXMgb25lLgorICAgICMgQ3VycmVudGx5LCB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZmlsZXMgdGhhdCBhcmUgbW92ZWQgd2l0aGluIHRoZSBzYW1lIGRpcmVjdG9yeToKKyAgICAjIHRoZSBgOm1vdmVkX2Zyb21gIGFuZCB0aGUgYDptb3ZlZF90b2AgZXZlbnRzIHdpbGwgYmUgcmVsYXRlZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxFdmVudD5dCisgICAgYXR0cl9yZWFkZXIgOnJlbGF0ZWQKKworICAgICMgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQgb24uCisgICAgIyBUaGlzIGlzIG9ubHkgc2V0IGZvciBldmVudHMgdGhhdCBvY2N1ciBvbiBmaWxlcyBpbiBkaXJlY3RvcmllczsKKyAgICAjIG90aGVyd2lzZSwgaXQncyBgIiJgLgorICAgICMgU2ltaWxhcmx5LCBpZiB0aGUgZXZlbnQgaXMgYmVpbmcgZmlyZWQgZm9yIHRoZSBkaXJlY3RvcnkgaXRzZWxmCisgICAgIyB0aGUgbmFtZSB3aWxsIGJlIGAiImAKKyAgICAjCisgICAgIyBUaGlzIHBhdGhuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBlbmNsb3NpbmcgZGlyZWN0b3J5LgorICAgICMgRm9yIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSwgdXNlIFx7I2Fic29sdXRlXF9uYW1lfS4KKyAgICAjIE5vdGUgdGhhdCB3aGVuIHRoZSBgOnJlY3Vyc2l2ZWAgZmxhZyBpcyBwYXNzZWQgdG8ge05vdGlmaWVyI3dhdGNofSwKKyAgICAjIGV2ZW50cyBpbiBuZXN0ZWQgc3ViZGlyZWN0b3JpZXMgd2lsbCBzdGlsbCBoYXZlIGEgYCNuYW1lYCBmaWVsZAorICAgICMgcmVsYXRpdmUgdG8gdGhlaXIgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGRpcmVjdG9yeS4KKyAgICAjIEZvciBleGFtcGxlLCBhbiBldmVudCBvbiB0aGUgZmlsZSBgImZvby9iYXIvYmF6ImAKKyAgICAjIHdpbGwgaGF2ZSBuYW1lIGAiYmF6ImAuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfcmVhZGVyIDpuYW1lCisKKyAgICAjIFRoZSB7Tm90aWZpZXJ9IHRoYXQgZmlyZWQgdGhpcyBldmVudC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtOb3RpZmllcl0KKyAgICBhdHRyX3JlYWRlciA6bm90aWZpZXIKKworICAgICMgQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoYXQgdGhpcyBldmVudCBpcyByZWxhdGVkIHRvIHNvbWUgb3RoZXIgZXZlbnQsCisgICAgIyB3aGljaCB3aWxsIGhhdmUgdGhlIHNhbWUgY29va2llLgorICAgICMKKyAgICAjIEN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGZpbGVzIHRoYXQgYXJlIG1vdmVkIHdpdGhpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgICAgIyBCb3RoIHRoZSBgOm1vdmVkX2Zyb21gIGFuZCB0aGUgYDptb3ZlZF90b2AgZXZlbnRzIHdpbGwgaGF2ZSB0aGUgc2FtZSBjb29raWUuCisgICAgIworICAgICMgQHByaXZhdGUKKyAgICAjIEByZXR1cm4gW0ZpeG51bV0KKyAgICBhdHRyX3JlYWRlciA6Y29va2llCisKKyAgICAjIFRoZSB7V2F0Y2hlciNpZCBpZH0gb2YgdGhlIHtXYXRjaGVyfSB0aGF0IGZpcmVkIHRoaXMgZXZlbnQuCisgICAgIworICAgICMgQHByaXZhdGUKKyAgICAjIEByZXR1cm4gW0ZpeG51bV0KKyAgICBhdHRyX3JlYWRlciA6d2F0Y2hlcl9pZAorCisgICAgIyBSZXR1cm5zIHRoZSB7V2F0Y2hlcn0gdGhhdCBmaXJlZCB0aGlzIGV2ZW50LgorICAgICMKKyAgICAjIEByZXR1cm4gW1dhdGNoZXJdCisgICAgZGVmIHdhdGNoZXIKKyAgICAgIEB3YXRjaGVyIHx8PSBAbm90aWZpZXIud2F0Y2hlcnNbQHdhdGNoZXJfaWRdCisgICAgZW5kCisKKyAgICAjIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkIG9uLgorICAgICMKKyAgICAjIFRoaXMgaXMgYWN0dWFsbHkgb25seSBhcyBhYnNvbHV0ZSBhcyB0aGUgcGF0aCBwYXNzZWQgdG8gdGhlIHtXYXRjaGVyfQorICAgICMgdGhhdCBjcmVhdGVkIHRoaXMgZXZlbnQuCisgICAgIyBIb3dldmVyLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgd29ya2luZyBkaXJlY3RvcnksCisgICAgIyBhc3N1bWluZyB0aGF0IGhhc24ndCBjaGFuZ2VkIHNpbmNlIHRoZSB3YXRjaGVyIHN0YXJ0ZWQuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGRlZiBhYnNvbHV0ZV9uYW1lCisgICAgICByZXR1cm4gd2F0Y2hlci5wYXRoIGlmIG5hbWUuZW1wdHk/CisgICAgICByZXR1cm4gRmlsZS5qb2luKHdhdGNoZXIucGF0aCwgbmFtZSkKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgZmxhZ3MgdGhhdCBkZXNjcmliZSB0aGlzIGV2ZW50LgorICAgICMgVGhpcyBpcyBnZW5lcmFsbHkgc2ltaWxhciB0byB0aGUgaW5wdXQgdG8ge05vdGlmaWVyI3dhdGNofSwKKyAgICAjIGV4Y2VwdCB0aGF0IGl0IHdvbid0IGNvbnRhaW4gb3B0aW9ucyBmbGFncyBub3IgYDphbGxfZXZlbnRzYCwKKyAgICAjIGFuZCBpdCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorICAgICMKKyAgICAjIGA6dW5tb3VudGAKKyAgICAjIDogVGhlIGZpbGVzeXN0ZW0gY29udGFpbmluZyB0aGUgd2F0Y2hlZCBmaWxlIG9yIGRpcmVjdG9yeSB3YXMgdW5tb3VudGVkLgorICAgICMKKyAgICAjIGA6aWdub3JlZGAKKyAgICAjIDogVGhlIFx7I3dhdGNoZXIgd2F0Y2hlcn0gd2FzIGNsb3NlZCwgb3IgdGhlIHdhdGNoZWQgZmlsZSBvciBkaXJlY3Rvcnkgd2FzIGRlbGV0ZWQuCisgICAgIworICAgICMgYDppc2RpcmAKKyAgICAjIDogVGhlIHN1YmplY3Qgb2YgdGhpcyBldmVudCBpcyBhIGRpcmVjdG9yeS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxTeW1ib2w+XQorICAgIGRlZiBmbGFncworICAgICAgQGZsYWdzIHx8PSBOYXRpdmU6OkZsYWdzLmZyb21fbWFzayhAbmF0aXZlWzptYXNrXSkKKyAgICBlbmQKKworICAgICMgQ29uc3RydWN0cyBhbiB7RXZlbnR9IG9iamVjdCBmcm9tIGEgc3RyaW5nIG9mIGJpbmFyeSBkYXRhLAorICAgICMgYW5kIGRlc3RydWN0aXZlbHkgbW9kaWZpZXMgdGhlIHN0cmluZyB0byBnZXQgcmlkIG9mIHRoZSBpbml0aWFsIHNlZ21lbnQKKyAgICAjIHVzZWQgdG8gY29uc3RydWN0IHRoZSBFdmVudC4KKyAgICAjCisgICAgIyBAcHJpdmF0ZQorICAgICMgQHBhcmFtIGRhdGEgW1N0cmluZ10gVGhlIHN0cmluZyB0byBiZSBtb2RpZmllZAorICAgICMgQHBhcmFtIG5vdGlmaWVyIFtOb3RpZmllcl0gVGhlIHtOb3RpZmllcn0gdGhhdCBmaXJlZCB0aGUgZXZlbnQKKyAgICAjIEByZXR1cm4gW0V2ZW50LCBuaWxdIFRoZSBldmVudCwgb3IgYG5pbGAgaWYgdGhlIHN0cmluZyBpcyBlbXB0eQorICAgIGRlZiBzZWxmLmNvbnN1bWUoZGF0YSwgbm90aWZpZXIpCisgICAgICByZXR1cm4gbmlsIGlmIGRhdGEuZW1wdHk/CisgICAgICBldiA9IG5ldyhkYXRhLCBub3RpZmllcikKKyAgICAgIGRhdGEucmVwbGFjZSBkYXRhW2V2LnNpemUuLi0xXQorICAgICAgZXYKKyAgICBlbmQKKworICAgICMgQ3JlYXRlcyBhbiBldmVudCBmcm9tIGEgc3RyaW5nIG9mIGJpbmFyeSBkYXRhLgorICAgICMgRGlmZmVycyBmcm9tIHtFdmVudC5jb25zdW1lfSBpbiB0aGF0IGl0IGRvZXNuJ3QgbW9kaWZ5IHRoZSBzdHJpbmcuCisgICAgIworICAgICMgQHByaXZhdGUKKyAgICAjIEBwYXJhbSBkYXRhIFtTdHJpbmddIFRoZSBkYXRhIHN0cmluZworICAgICMgQHBhcmFtIG5vdGlmaWVyIFtOb3RpZmllcl0gVGhlIHtOb3RpZmllcn0gdGhhdCBmaXJlZCB0aGUgZXZlbnQKKyAgICBkZWYgaW5pdGlhbGl6ZShkYXRhLCBub3RpZmllcikKKyAgICAgIHB0ciA9IEZGSTo6TWVtb3J5UG9pbnRlci5mcm9tX3N0cmluZyhkYXRhKQorICAgICAgQG5hdGl2ZSA9IE5hdGl2ZTo6RXZlbnQubmV3KHB0cikKKyAgICAgIEByZWxhdGVkID0gW10KKyAgICAgIEBjb29raWUgPSBAbmF0aXZlWzpjb29raWVdCisgICAgICBAbmFtZSA9IGZpeF9lbmNvZGluZyhkYXRhW0BuYXRpdmUuc2l6ZSwgQG5hdGl2ZVs6bGVuXV0uZ3N1YigvXDArJC8sICcnKSkKKyAgICAgIEBub3RpZmllciA9IG5vdGlmaWVyCisgICAgICBAd2F0Y2hlcl9pZCA9IEBuYXRpdmVbOndkXQorCisgICAgICByYWlzZSBRdWV1ZU92ZXJmbG93RXJyb3IubmV3KCJpbm90aWZ5IGV2ZW50IHF1ZXVlIGhhcyBvdmVyZmxvd2VkLiIpIGlmIEBuYXRpdmVbOm1hc2tdICYgTmF0aXZlOjpGbGFnczo6SU5fUV9PVkVSRkxPVyAhPSAwCisgICAgZW5kCisKKyAgICAjIENhbGxzIHRoZSBjYWxsYmFjayBvZiB0aGUgd2F0Y2hlciB0aGF0IGZpcmVkIHRoaXMgZXZlbnQsCisgICAgIyBwYXNzaW5nIGluIHRoZSBldmVudCBpdHNlbGYuCisgICAgIworICAgICMgQHByaXZhdGUKKyAgICBkZWYgY2FsbGJhY2shCisgICAgICB3YXRjaGVyICYmIHdhdGNoZXIuY2FsbGJhY2shKHNlbGYpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBldmVudCBvYmplY3QgaW4gYnl0ZXMsCisgICAgIyBpbmNsdWRpbmcgdGhlIFx7I25hbWV9IHN0cmluZy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtGaXhudW1dCisgICAgZGVmIHNpemUKKyAgICAgIEBuYXRpdmUuc2l6ZSArIEBuYXRpdmVbOmxlbl0KKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBmaXhfZW5jb2RpbmcobmFtZSkKKyAgICAgIG5hbWUuZm9yY2VfZW5jb2RpbmcoJ2ZpbGVzeXN0ZW0nKSBpZiBuYW1lLnJlc3BvbmRfdG8/KDpmb3JjZV9lbmNvZGluZykKKyAgICAgIG5hbWUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL2xpYi9yYi1pbm90aWZ5L25hdGl2ZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL2xpYi9yYi1pbm90aWZ5L25hdGl2ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUxZjdjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkvbmF0aXZlLnJiCkBAIC0wLDAgKzEsMzYgQEAKK3JlcXVpcmUgJ2ZmaScKKworbW9kdWxlIElOb3RpZnkKKyAgIyBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgbG93LWxldmVsIGZvcmVpZ24tZnVuY3Rpb24gaW50ZXJmYWNlIGNvZGUKKyAgIyBmb3IgZGVhbGluZyB3aXRoIHRoZSBpbm90aWZ5IEMgQVBJcy4KKyAgIyBJdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgYW5kIG5vdCBtZWFudCBmb3IgdXNlcnMgdG8gZGVhbCB3aXRoLgorICAjCisgICMgQHByaXZhdGUKKyAgbW9kdWxlIE5hdGl2ZQorICAgIGV4dGVuZCBGRkk6OkxpYnJhcnkKKyAgICBmZmlfbGliIEZGSTo6TGlicmFyeTo6TElCQworICAgIGJlZ2luCisgICAgICBmZmlfbGliICdpbm90aWZ5JworICAgIHJlc2N1ZSBMb2FkRXJyb3IKKyAgICBlbmQKKworICAgICMgVGhlIEMgc3RydWN0IGRlc2NyaWJpbmcgYW4gaW5vdGlmeSBldmVudC4KKyAgICAjCisgICAgIyBAcHJpdmF0ZQorICAgIGNsYXNzIEV2ZW50IDwgRkZJOjpTdHJ1Y3QKKyAgICAgIGxheW91dCgKKyAgICAgICAgOndkLCA6aW50LAorICAgICAgICA6bWFzaywgOnVpbnQzMiwKKyAgICAgICAgOmNvb2tpZSwgOnVpbnQzMiwKKyAgICAgICAgOmxlbiwgOnVpbnQzMikKKyAgICBlbmQKKworICAgIGF0dGFjaF9mdW5jdGlvbiA6aW5vdGlmeV9pbml0LCBbXSwgOmludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6aW5vdGlmeV9hZGRfd2F0Y2gsIFs6aW50LCA6c3RyaW5nLCA6dWludDMyXSwgOmludAorICAgIGF0dGFjaF9mdW5jdGlvbiA6aW5vdGlmeV9ybV93YXRjaCwgWzppbnQsIDp1aW50MzJdLCA6aW50CisgICAgYXR0YWNoX2Z1bmN0aW9uIDpmcGF0aGNvbmYsIFs6aW50LCA6aW50XSwgOmxvbmcKKworICAgIGF0dGFjaF9mdW5jdGlvbiA6cmVhZCwgWzppbnQsIDpwb2ludGVyLCA6c2l6ZV90XSwgOnNzaXplX3QKKyAgICBhdHRhY2hfZnVuY3Rpb24gOmNsb3NlLCBbOmludF0sIDppbnQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL2xpYi9yYi1pbm90aWZ5L25hdGl2ZS9mbGFncy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL2xpYi9yYi1pbm90aWZ5L25hdGl2ZS9mbGFncy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQwMTMwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkvbmF0aXZlL2ZsYWdzLnJiCkBAIC0wLDAgKzEsOTQgQEAKK21vZHVsZSBJTm90aWZ5CisgIG1vZHVsZSBOYXRpdmUKKyAgICAjIEEgbW9kdWxlIGNvbnRhaW5pbmcgYWxsIHRoZSBpbm90aWZ5IGZsYWdzCisgICAgIyB0byBiZSBwYXNzZWQgdG8ge05vdGlmaWVyI3dhdGNofS4KKyAgICAjCisgICAgIyBAcHJpdmF0ZQorICAgIG1vZHVsZSBGbGFncworICAgICAgIyBGaWxlIHdhcyBhY2Nlc3NlZC4KKyAgICAgIElOX0FDQ0VTUyA9IDB4MDAwMDAwMDEKKyAgICAgICMgTWV0YWRhdGEgY2hhbmdlZC4KKyAgICAgIElOX0FUVFJJQiA9IDB4MDAwMDAwMDQKKyAgICAgICMgV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZC4KKyAgICAgIElOX0NMT1NFX1dSSVRFID0gMHgwMDAwMDAwOAorICAgICAgIyBGaWxlIHdhcyBtb2RpZmllZC4KKyAgICAgIElOX01PRElGWSA9IDB4MDAwMDAwMDIKKyAgICAgICMgVW53cml0dGFibGUgZmlsZSBjbG9zZWQuCisgICAgICBJTl9DTE9TRV9OT1dSSVRFID0gMHgwMDAwMDAxMAorICAgICAgIyBGaWxlIHdhcyBvcGVuZWQuCisgICAgICBJTl9PUEVOID0gMHgwMDAwMDAyMAorICAgICAgIyBGaWxlIHdhcyBtb3ZlZCBmcm9tIFguCisgICAgICBJTl9NT1ZFRF9GUk9NID0gMHgwMDAwMDA0MAorICAgICAgIyBGaWxlIHdhcyBtb3ZlZCB0byBZLgorICAgICAgSU5fTU9WRURfVE8gPSAweDAwMDAwMDgwCisgICAgICAjIFN1YmZpbGUgd2FzIGNyZWF0ZWQuCisgICAgICBJTl9DUkVBVEUgPSAweDAwMDAwMTAwCisgICAgICAjIFN1YmZpbGUgd2FzIGRlbGV0ZWQuCisgICAgICBJTl9ERUxFVEUgPSAweDAwMDAwMjAwCisgICAgICAjIFNlbGYgd2FzIGRlbGV0ZWQuCisgICAgICBJTl9ERUxFVEVfU0VMRiA9IDB4MDAwMDA0MDAKKyAgICAgICMgU2VsZiB3YXMgbW92ZWQuCisgICAgICBJTl9NT1ZFX1NFTEYgPSAweDAwMDAwODAwCisKKyAgICAgICMjIEhlbHBlciBldmVudHMuCisKKyAgICAgICMgQ2xvc2UuCisgICAgICBJTl9DTE9TRSA9IChJTl9DTE9TRV9XUklURSB8IElOX0NMT1NFX05PV1JJVEUpCisgICAgICAjIE1vdmVzLgorICAgICAgSU5fTU9WRSA9IChJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pCisgICAgICAjIEFsbCBldmVudHMgd2hpY2ggYSBwcm9ncmFtIGNhbiB3YWl0IG9uLgorICAgICAgSU5fQUxMX0VWRU5UUyA9IChJTl9BQ0NFU1MgfCBJTl9NT0RJRlkgfCBJTl9BVFRSSUIgfCBJTl9DTE9TRV9XUklURSB8CisgICAgICAgIElOX0NMT1NFX05PV1JJVEUgfCBJTl9PUEVOIHwgSU5fTU9WRURfRlJPTSB8IElOX01PVkVEX1RPIHwgSU5fQ1JFQVRFIHwKKyAgICAgICAgSU5fREVMRVRFIHwgSU5fREVMRVRFX1NFTEYgfCBJTl9NT1ZFX1NFTEYpCisKKworICAgICAgIyMgU3BlY2lhbCBmbGFncy4KKworICAgICAgIyBPbmx5IHdhdGNoIHRoZSBwYXRoIGlmIGl0IGlzIGEgZGlyZWN0b3J5LgorICAgICAgSU5fT05MWURJUiA9IDB4MDEwMDAwMDAKKyAgICAgICMgRG8gbm90IGZvbGxvdyBhIHN5bSBsaW5rLgorICAgICAgSU5fRE9OVF9GT0xMT1cgPSAweDAyMDAwMDAwCisgICAgICAjIEFkZCB0byB0aGUgbWFzayBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIHdhdGNoLgorICAgICAgSU5fTUFTS19BREQgPSAweDIwMDAwMDAwCisgICAgICAjIE9ubHkgc2VuZCBldmVudCBvbmNlLgorICAgICAgSU5fT05FU0hPVCA9IDB4ODAwMDAwMDAKKworCisgICAgICAjIyBFdmVudHMgc2VudCBieSB0aGUga2VybmVsLgorCisgICAgICAjIEJhY2tpbmcgZnMgd2FzIHVubW91bnRlZC4KKyAgICAgIElOX1VOTU9VTlQgPSAweDAwMDAyMDAwCisgICAgICAjIEV2ZW50IHF1ZXVlZCBvdmVyZmxvd2VkLgorICAgICAgSU5fUV9PVkVSRkxPVyA9IDB4MDAwMDQwMDAKKyAgICAgICMgRmlsZSB3YXMgaWdub3JlZC4KKyAgICAgIElOX0lHTk9SRUQgPSAweDAwMDA4MDAwCisgICAgICAjIEV2ZW50IG9jY3VycmVkIGFnYWluc3QgZGlyLgorICAgICAgSU5fSVNESVIgPSAweDQwMDAwMDAwCisKKyAgICAgICMjIGZwYXRoY29uZiBNYWNyb3MKKworICAgICAgIyByZXR1cm5zIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lIGluIHRoZSBkaXJlY3RvcnkgcGF0aCBvciBmZCB0aGF0IHRoZSBwcm9jZXNzIGlzIGFsbG93ZWQgdG8gY3JlYXRlLiAgVGhlIGNvcnJlc3BvbmRpbmcgbWFjcm8gaXMgX1BPU0lYX05BTUVfTUFYLgorICAgICAgUENfTkFNRV9NQVggPSAzCisKKyAgICAgICMgQ29udmVydHMgYSBsaXN0IG9mIGZsYWdzIHRvIHRoZSBiaXRtYXNrIHRoYXQgdGhlIEMgQVBJIGV4cGVjdHMuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBmbGFncyBbQXJyYXk8U3ltYm9sPl0KKyAgICAgICMgQHJldHVybiBbRml4bnVtXQorICAgICAgZGVmIHNlbGYudG9fbWFzayhmbGFncykKKyAgICAgICAgZmxhZ3MubWFwIHt8ZmxhZ3wgY29uc3RfZ2V0KCJJTl8je2ZsYWcudG9fcy51cGNhc2V9Iil9LgorICAgICAgICAgIGluamVjdCgwKSB7fG1hc2ssIGZsYWd8IG1hc2sgfCBmbGFnfQorICAgICAgZW5kCisKKyAgICAgICMgQ29udmVydHMgYSBiaXRtYXNrIGZyb20gdGhlIEMgQVBJIGludG8gYSBsaXN0IG9mIGZsYWdzLgorICAgICAgIworICAgICAgIyBAcGFyYW0gbWFzayBbRml4bnVtXQorICAgICAgIyBAcmV0dXJuIFtBcnJheTxTeW1ib2w+XQorICAgICAgZGVmIHNlbGYuZnJvbV9tYXNrKG1hc2spCisgICAgICAgIGNvbnN0YW50cy5tYXAge3xjfCBjLnRvX3N9LnNlbGVjdCBkbyB8Y3wKKyAgICAgICAgICBuZXh0IGZhbHNlIHVubGVzcyBjID1+IC9eSU5fLworICAgICAgICAgIGNvbnN0X2dldChjKSAmIG1hc2sgIT0gMAorICAgICAgICBlbmQubWFwIHt8Y3wgYy5zdWIoIklOXyIsICIiKS5kb3duY2FzZS50b19zeW19IC0gWzphbGxfZXZlbnRzXQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9saWIvcmItaW5vdGlmeS9ub3RpZmllci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL2xpYi9yYi1pbm90aWZ5L25vdGlmaWVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0M2JjMjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9saWIvcmItaW5vdGlmeS9ub3RpZmllci5yYgpAQCAtMCwwICsxLDMzOSBAQAorbW9kdWxlIElOb3RpZnkKKyAgIyBOb3RpZmllciB3cmFwcyBhIHNpbmdsZSBpbnN0YW5jZSBvZiBpbm90aWZ5LgorICAjIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGluc3RhbmNlLAorICAjIGJ1dCB1c3VhbGx5IHVubmVjZXNzYXJ5LgorICAjCisgICMgQGV4YW1wbGUKKyAgIyAgICMgQ3JlYXRlIHRoZSBub3RpZmllcgorICAjICAgbm90aWZpZXIgPSBJTm90aWZ5OjpOb3RpZmllci5uZXcKKyAgIworICAjICAgIyBSdW4gdGhpcyBjYWxsYmFjayB3aGVuZXZlciB0aGUgZmlsZSBwYXRoL3RvL2Zvby50eHQgaXMgcmVhZAorICAjICAgbm90aWZpZXIud2F0Y2goInBhdGgvdG8vZm9vLnR4dCIsIDphY2Nlc3MpIGRvCisgICMgICAgIHB1dHMgIkZvby50eHQgd2FzIGFjY2Vzc2VkISIKKyAgIyAgIGVuZAorICAjCisgICMgICAjIFdhdGNoIGZvciBhbnkgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGJlaW5nIGRlbGV0ZWQKKyAgIyAgICMgb3IgbW92ZWQgb3V0IG9mIHRoZSBkaXJlY3RvcnkuCisgICMgICBub3RpZmllci53YXRjaCgicGF0aC90by9kaXJlY3RvcnkiLCA6ZGVsZXRlLCA6bW92ZWRfZnJvbSkgZG8gfGV2ZW50fAorICAjICAgICAjIFRoZSAjbmFtZSBmaWVsZCBvZiB0aGUgZXZlbnQgb2JqZWN0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBhZmZlY3RlZCBmaWxlCisgICMgICAgIHB1dHMgIiN7ZXZlbnQubmFtZX0gaXMgbm8gbG9uZ2VyIGluIHRoZSBkaXJlY3RvcnkhIgorICAjICAgZW5kCisgICMKKyAgIyAgICMgTm90aGluZyBoYXBwZW5zIHVudGlsIHlvdSBydW4gdGhlIG5vdGlmaWVyIQorICAjICAgbm90aWZpZXIucnVuCisgIGNsYXNzIE5vdGlmaWVyCisgICAgIyBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgcmVjdXJzaXZlbHkgd2F0Y2hlZC4KKyAgICAjCisgICAgIyAqIEZpbGVzIGluIGAvZGV2L2ZkYCBzb21ldGltZXMgcmVnaXN0ZXIgYXMgZGlyZWN0b3JpZXMsIGJ1dCBhcmUgbm90IGVudW1lcmFibGUuCisgICAgUkVDVVJTSVZFX0JMQUNLTElTVCA9ICV3Wy9kZXYvZmRdCisKKyAgICAjIEEgaGFzaCBmcm9tIHtXYXRjaGVyfSBpZHMgdG8gdGhlIGluc3RhbmNlcyB0aGVtc2VsdmVzLgorICAgICMKKyAgICAjIEBwcml2YXRlCisgICAgIyBAcmV0dXJuIFt7Rml4bnVtID0+IFdhdGNoZXJ9XQorICAgIGF0dHJfcmVhZGVyIDp3YXRjaGVycworCisgICAgIyBUaGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoaXMgbm90aWZpZXIuCisgICAgIyBUaGlzIGlzIGEgdmFsaWQgT1MgZmlsZSBkZXNjcmlwdG9yLCBhbmQgY2FuIGJlIHVzZWQgYXMgc3VjaAorICAgICMgKGV4Y2VwdCB1bmRlciBKUnVieSAtLSBzZWUgXHsjdG9cX2lvfSkuCisgICAgIworICAgICMgQHJldHVybiBbRml4bnVtXQorICAgIGF0dHJfcmVhZGVyIDpmZAorCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIG9yIG5vdCB0aGlzIFJ1YnkgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKKyAgICAjICAgd3JhcHBpbmcgdGhlIG5hdGl2ZSBmaWxlIGRlc2NyaXB0b3IgaW4gYSBSdWJ5IElPIHdyYXBwZXIuCisgICAgZGVmIHNlbGYuc3VwcG9ydHNfcnVieV9pbz8KKyAgICAgIFJVQllfUExBVEZPUk0gIX4gL2phdmEvCisgICAgZW5kCisKKyAgICAjIENyZWF0ZXMgYSBuZXcge05vdGlmaWVyfS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtOb3RpZmllcl0KKyAgICAjIEByYWlzZSBbU3lzdGVtQ2FsbEVycm9yXSBpZiBpbm90aWZ5IGZhaWxlZCB0byBpbml0aWFsaXplIGZvciBzb21lIHJlYXNvbgorICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAZmQgPSBOYXRpdmUuaW5vdGlmeV9pbml0CisgICAgICBAd2F0Y2hlcnMgPSB7fQorICAgICAgcmV0dXJuIHVubGVzcyBAZmQgPCAwCisKKyAgICAgIHJhaXNlIFN5c3RlbUNhbGxFcnJvci5uZXcoCisgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBpbm90aWZ5IiArCisgICAgICAgIGNhc2UgRkZJLmVycm5vCisgICAgICAgIHdoZW4gRXJybm86OkVNRklMRTo6RXJybm87ICI6IHRoZSB1c2VyIGxpbWl0IG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaW5vdGlmeSBpbnN0YW5jZXMgaGFzIGJlZW4gcmVhY2hlZC4iCisgICAgICAgIHdoZW4gRXJybm86OkVORklMRTo6RXJybm87ICI6IHRoZSBzeXN0ZW0gbGltaXQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGhhcyBiZWVuIHJlYWNoZWQuIgorICAgICAgICB3aGVuIEVycm5vOjpFTk9NRU06OkVycm5vOyAiOiBpbnN1ZmZpY2llbnQga2VybmVsIG1lbW9yeSBpcyBhdmFpbGFibGUuIgorICAgICAgICBlbHNlOyAiIgorICAgICAgICBlbmQsCisgICAgICAgIEZGSS5lcnJubykKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhIFJ1YnkgSU8gb2JqZWN0IHdyYXBwaW5nIHRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvci4KKyAgICAjIFNpbmNlIHRoaXMgZmlsZSBkZXNjcmlwdG9yIGlzIGZ1bGx5IGZ1bmN0aW9uYWwgKGV4Y2VwdCB1bmRlciBKUnVieSksCisgICAgIyB0aGlzIElPIG9iamVjdCBjYW4gYmUgdXNlZCBpbiBhbnkgd2F5IGEgUnVieS1jcmVhdGVkIElPIG9iamVjdCBjYW4uCisgICAgIyBUaGlzIGluY2x1ZGVzIHBhc3NpbmcgaXQgdG8gZnVuY3Rpb25zIGxpa2UgYCNzZWxlY3RgLgorICAgICMKKyAgICAjIE5vdGUgdGhhdCB0aGlzIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIElPIG9iamVjdC4KKyAgICAjIENyZWF0aW5nIGxvdHMgb2YgSU8gb2JqZWN0cyBmb3IgdGhlIHNhbWUgZmlsZSBkZXNjcmlwdG9yCisgICAgIyBjYW4gY2F1c2Ugc29tZSBvZGQgcHJvYmxlbXMuCisgICAgIworICAgICMgKipUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgSlJ1YnkqKi4KKyAgICAjIEpSdWJ5IGN1cnJlbnRseSBkb2Vzbid0IHVzZSBuYXRpdmUgZmlsZSBkZXNjcmlwdG9ycyBmb3IgdGhlIElPIG9iamVjdCwKKyAgICAjIHNvIHdlIGNhbid0IHVzZSB0aGlzIGZpbGUgZGVzY3JpcHRvciBhcyBhIHN0YW5kLWluLgorICAgICMKKyAgICAjIEByZXR1cm4gW0lPXSBBbiBJTyBvYmplY3Qgd3JhcHBpbmcgdGhlIGZpbGUgZGVzY3JpcHRvcgorICAgICMgQHJhaXNlIFtOb3RJbXBsZW1lbnRlZEVycm9yXSBpZiB0aGlzIGlzIGJlaW5nIGNhbGxlZCBpbiBKUnVieQorICAgIGRlZiB0b19pbworICAgICAgdW5sZXNzIHNlbGYuY2xhc3Muc3VwcG9ydHNfcnVieV9pbz8KKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvci5uZXcoIklOb3RpZnk6Ok5vdGlmaWVyI3RvX2lvIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgSlJ1YnkiKQorICAgICAgZW5kCisgICAgICBAaW8gfHw9IElPLm5ldyhAZmQpCisgICAgZW5kCisKKyAgICAjIFdhdGNoZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSBmb3IgY2hhbmdlcywKKyAgICAjIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHdoZW4gdGhlcmUgYXJlLgorICAgICMgVGhpcyBpcyBvbmx5IGFjdGl2YXRlZCBvbmNlIFx7I3Byb2Nlc3N9IG9yIFx7I3J1bn0gaXMgY2FsbGVkLgorICAgICMKKyAgICAjICoqTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoaXMgZG9lcyBub3QgcmVjdXJzaXZlbHkgd2F0Y2ggc3ViZGlyZWN0b3JpZXMKKyAgICAjIG9mIHRoZSB3YXRjaGVkIGRpcmVjdG9yeSoqLgorICAgICMgVG8gZG8gc28sIHVzZSB0aGUgYDpyZWN1cnNpdmVgIGZsYWcuCisgICAgIworICAgICMgIyMgRmxhZ3MKKyAgICAjCisgICAgIyBgOmFjY2Vzc2AKKyAgICAjIDogQSBmaWxlIGlzIGFjY2Vzc2VkICh0aGF0IGlzLCByZWFkKS4KKyAgICAjCisgICAgIyBgOmF0dHJpYmAKKyAgICAjIDogQSBmaWxlJ3MgbWV0YWRhdGEgaXMgY2hhbmdlZCAoZS5nLiBwZXJtaXNzaW9ucywgdGltZXN0YW1wcywgZXRjKS4KKyAgICAjCisgICAgIyBgOmNsb3NlX3dyaXRlYAorICAgICMgOiBBIGZpbGUgdGhhdCB3YXMgb3BlbmVkIGZvciB3cml0aW5nIGlzIGNsb3NlZC4KKyAgICAjCisgICAgIyBgOmNsb3NlX25vd3JpdGVgCisgICAgIyA6IEEgZmlsZSB0aGF0IHdhcyBub3Qgb3BlbmVkIGZvciB3cml0aW5nIGlzIGNsb3NlZC4KKyAgICAjCisgICAgIyBgOm1vZGlmeWAKKyAgICAjIDogQSBmaWxlIGlzIG1vZGlmaWVkLgorICAgICMKKyAgICAjIGA6b3BlbmAKKyAgICAjIDogQSBmaWxlIGlzIG9wZW5lZC4KKyAgICAjCisgICAgIyAjIyMgRGlyZWN0b3J5LVNwZWNpZmljIEZsYWdzCisgICAgIworICAgICMgVGhlc2UgZmxhZ3Mgb25seSBhcHBseSB3aGVuIGEgZGlyZWN0b3J5IGlzIGJlaW5nIHdhdGNoZWQuCisgICAgIworICAgICMgYDptb3ZlZF9mcm9tYAorICAgICMgOiBBIGZpbGUgaXMgbW92ZWQgb3V0IG9mIHRoZSB3YXRjaGVkIGRpcmVjdG9yeS4KKyAgICAjCisgICAgIyBgOm1vdmVkX3RvYAorICAgICMgOiBBIGZpbGUgaXMgbW92ZWQgaW50byB0aGUgd2F0Y2hlZCBkaXJlY3RvcnkuCisgICAgIworICAgICMgYDpjcmVhdGVgCisgICAgIyA6IEEgZmlsZSBpcyBjcmVhdGVkIGluIHRoZSB3YXRjaGVkIGRpcmVjdG9yeS4KKyAgICAjCisgICAgIyBgOmRlbGV0ZWAKKyAgICAjIDogQSBmaWxlIGlzIGRlbGV0ZWQgaW4gdGhlIHdhdGNoZWQgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIGA6ZGVsZXRlX3NlbGZgCisgICAgIyA6IFRoZSB3YXRjaGVkIGZpbGUgb3IgZGlyZWN0b3J5IGl0c2VsZiBpcyBkZWxldGVkLgorICAgICMKKyAgICAjIGA6bW92ZV9zZWxmYAorICAgICMgOiBUaGUgd2F0Y2hlZCBmaWxlIG9yIGRpcmVjdG9yeSBpdHNlbGYgaXMgbW92ZWQuCisgICAgIworICAgICMgIyMjIEhlbHBlciBGbGFncworICAgICMKKyAgICAjIFRoZXNlIGZsYWdzIGFyZSBqdXN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZmxhZ3MgYWJvdmUuCisgICAgIworICAgICMgYDpjbG9zZWAKKyAgICAjIDogRWl0aGVyIGA6Y2xvc2Vfd3JpdGVgIG9yIGA6Y2xvc2Vfbm93cml0ZWAgaXMgYWN0aXZhdGVkLgorICAgICMKKyAgICAjIGA6bW92ZWAKKyAgICAjIDogRWl0aGVyIGA6bW92ZWRfZnJvbWAgb3IgYDptb3ZlZF90b2AgaXMgYWN0aXZhdGVkLgorICAgICMKKyAgICAjIGA6YWxsX2V2ZW50c2AKKyAgICAjIDogQW55IGV2ZW50IGFib3ZlIGlzIGFjdGl2YXRlZC4KKyAgICAjCisgICAgIyAjIyMgT3B0aW9ucyBGbGFncworICAgICMKKyAgICAjIFRoZXNlIGZsYWdzIGRvbid0IGFjdHVhbGx5IHNwZWNpZnkgZXZlbnRzLgorICAgICMgSW5zdGVhZCwgdGhleSBzcGVjaWZ5IG9wdGlvbnMgZm9yIHRoZSB3YXRjaGVyLgorICAgICMKKyAgICAjIGA6b25seWRpcmAKKyAgICAjIDogT25seSB3YXRjaCB0aGUgcGF0aCBpZiBpdCdzIGEgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIGA6ZG9udF9mb2xsb3dgCisgICAgIyA6IERvbid0IGZvbGxvdyBzeW1saW5rcy4KKyAgICAjCisgICAgIyBgOm1hc2tfYWRkYAorICAgICMgOiBBZGQgdGhlc2UgZmxhZ3MgdG8gdGhlIHByZS1leGlzdGluZyBmbGFncyBmb3IgdGhpcyBwYXRoLgorICAgICMKKyAgICAjIGA6b25lc2hvdGAKKyAgICAjIDogT25seSBzZW5kIHRoZSBldmVudCBvbmNlLCB0aGVuIHNodXQgZG93biB0aGUgd2F0Y2hlci4KKyAgICAjCisgICAgIyBgOnJlY3Vyc2l2ZWAKKyAgICAjIDogUmVjdXJzaXZlbHkgd2F0Y2ggYW55IHN1YmRpcmVjdG9yaWVzIHRoYXQgYXJlIGNyZWF0ZWQuCisgICAgIyAgIE5vdGUgdGhhdCB0aGlzIGlzIGEgZmVhdHVyZSBvZiByYi1pbm90aWZ5LAorICAgICMgICByYXRoZXIgdGhhbiBvZiBpbm90aWZ5IGl0c2VsZiwgd2hpY2ggY2FuIG9ubHkgd2F0Y2ggb25lIGxldmVsIG9mIGEgZGlyZWN0b3J5LgorICAgICMgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHtFdmVudCNuYW1lfSBmaWVsZAorICAgICMgICB3aWxsIGNvbnRhaW4gb25seSB0aGUgYmFzZW5hbWUgb2YgdGhlIG1vZGlmaWVkIGZpbGUuCisgICAgIyAgIFdoZW4gdXNpbmcgYDpyZWN1cnNpdmVgLCB7RXZlbnQjYWJzb2x1dGVfbmFtZX0gc2hvdWxkIGFsd2F5cyBiZSB1c2VkLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFtTdHJpbmddIFRoZSBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeQorICAgICMgQHBhcmFtIGZsYWdzIFtBcnJheTxTeW1ib2w+XSBXaGljaCBldmVudHMgdG8gd2F0Y2ggZm9yCisgICAgIyBAeWllbGQgW2V2ZW50XSBBIGJsb2NrIHRoYXQgd2lsbCBiZSBjYWxsZWQKKyAgICAjICAgd2hlbmV2ZXIgb25lIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnRzIG9jY3VyCisgICAgIyBAeWllbGRwYXJhbSBldmVudCBbRXZlbnRdIFRoZSBFdmVudCBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbgorICAgICMgICBhYm91dCB0aGUgZXZlbnQgdGhhdCBvY2N1cmVkCisgICAgIyBAcmV0dXJuIFtXYXRjaGVyXSBBIFdhdGNoZXIgc2V0IHVwIHRvIHdhdGNoIHRoaXMgcGF0aCBmb3IgdGhlc2UgZXZlbnRzCisgICAgIyBAcmFpc2UgW1N5c3RlbUNhbGxFcnJvcl0gaWYgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGNhbid0IGJlIHdhdGNoZWQsCisgICAgIyAgIGUuZy4gaWYgdGhlIGZpbGUgaXNuJ3QgZm91bmQsIHJlYWQgYWNjZXNzIGlzIGRlbmllZCwKKyAgICAjICAgb3IgdGhlIGZsYWdzIGRvbid0IGNvbnRhaW4gYW55IGV2ZW50cworICAgIGRlZiB3YXRjaChwYXRoLCAqZmxhZ3MsICZjYWxsYmFjaykKKyAgICAgIHJldHVybiBXYXRjaGVyLm5ldyhzZWxmLCBwYXRoLCAqZmxhZ3MsICZjYWxsYmFjaykgdW5sZXNzIGZsYWdzLmluY2x1ZGU/KDpyZWN1cnNpdmUpCisKKyAgICAgIGRpciA9IERpci5uZXcocGF0aCkKKworICAgICAgZGlyLmVhY2ggZG8gfGJhc2V8CisgICAgICAgIGQgPSBGaWxlLmpvaW4ocGF0aCwgYmFzZSkKKyAgICAgICAgYmluYXJ5X2QgPSBkLnJlc3BvbmRfdG8/KDpmb3JjZV9lbmNvZGluZykgPyBkLmR1cC5mb3JjZV9lbmNvZGluZygnQklOQVJZJykgOiBkCisgICAgICAgIG5leHQgaWYgYmluYXJ5X2QgPX4gL1wvXC5cLj8kLyAjIEN1cnJlbnQgb3IgcGFyZW50IGRpcmVjdG9yeQorICAgICAgICBuZXh0IGlmIFJFQ1VSU0lWRV9CTEFDS0xJU1QuaW5jbHVkZT8oZCkKKyAgICAgICAgbmV4dCBpZiBmbGFncy5pbmNsdWRlPyg6ZG9udF9mb2xsb3cpICYmIEZpbGUuc3ltbGluaz8oZCkKKyAgICAgICAgbmV4dCBpZiAhRmlsZS5kaXJlY3Rvcnk/KGQpCisKKyAgICAgICAgd2F0Y2goZCwgKmZsYWdzLCAmY2FsbGJhY2spCisgICAgICBlbmQKKworICAgICAgZGlyLmNsb3NlCisKKyAgICAgIHJlY19mbGFncyA9IFs6Y3JlYXRlLCA6bW92ZWRfdG9dCisgICAgICByZXR1cm4gd2F0Y2gocGF0aCwgKigoZmxhZ3MgLSBbOnJlY3Vyc2l2ZV0pIHwgcmVjX2ZsYWdzKSkgZG8gfGV2ZW50fAorICAgICAgICBjYWxsYmFjay5jYWxsKGV2ZW50KSBpZiBmbGFncy5pbmNsdWRlPyg6YWxsX2V2ZW50cykgfHwgIShmbGFncyAmIGV2ZW50LmZsYWdzKS5lbXB0eT8KKyAgICAgICAgbmV4dCBpZiAocmVjX2ZsYWdzICYgZXZlbnQuZmxhZ3MpLmVtcHR5PyB8fCAhZXZlbnQuZmxhZ3MuaW5jbHVkZT8oOmlzZGlyKQorICAgICAgICBiZWdpbgorICAgICAgICAgIHdhdGNoKGV2ZW50LmFic29sdXRlX25hbWUsICpmbGFncywgJmNhbGxiYWNrKQorICAgICAgICByZXNjdWUgRXJybm86OkVOT0VOVAorICAgICAgICAgICMgSWYgdGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCBzaW5jZSB0aGUgZ2xvYiB3YXMgcnVuLCB3ZSBkb24ndCB3YW50IHRvIGVycm9yIG91dC4KKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgU3RhcnRzIHRoZSBub3RpZmllciB3YXRjaGluZyBmb3IgZmlsZXN5c3RlbSBldmVudHMuCisgICAgIyBCbG9ja3MgdW50aWwgXHsjc3RvcH0gaXMgY2FsbGVkLgorICAgICMKKyAgICAjIEBzZWUgI3Byb2Nlc3MKKyAgICBkZWYgcnVuCisgICAgICBAc3RvcCA9IGZhbHNlCisgICAgICBwcm9jZXNzIHVudGlsIEBzdG9wCisgICAgZW5kCisKKyAgICAjIFN0b3Agd2F0Y2hpbmcgZm9yIGZpbGVzeXN0ZW0gZXZlbnRzLgorICAgICMgVGhhdCBpcywgaWYgd2UncmUgaW4gYSBceyNydW59IGxvb3AsCisgICAgIyBleGl0IG91dCBhcyBzb29uIGFzIHdlIGZpbmlzaCBoYW5kbGluZyB0aGUgZXZlbnRzLgorICAgIGRlZiBzdG9wCisgICAgICBAc3RvcCA9IHRydWUKKyAgICBlbmQKKworICAgICMgQmxvY2tzIHVudGlsIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBmaWxlc3lzdGVtIGV2ZW50cworICAgICMgdGhhdCB0aGlzIG5vdGlmaWVyIGhhcyB3YXRjaGVycyByZWdpc3RlcmVkIGZvci4KKyAgICAjIE9uY2UgdGhlcmUgYXJlIGV2ZW50cywgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcyBhcmUgY2FsbGVkCisgICAgIyBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgorICAgICMKKyAgICAjIEBzZWUgI3J1bgorICAgIGRlZiBwcm9jZXNzCisgICAgICByZWFkX2V2ZW50cy5lYWNoIGRvIHxldmVudHwKKyAgICAgICAgZXZlbnQuY2FsbGJhY2shCisgICAgICAgIGV2ZW50LmZsYWdzLmluY2x1ZGU/KDppZ25vcmVkKSAmJiBldmVudC5ub3RpZmllci53YXRjaGVycy5kZWxldGUoZXZlbnQud2F0Y2hlcl9pZCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBDbG9zZSB0aGUgbm90aWZpZXIuCisgICAgIworICAgICMgQHJhaXNlIFtTeXN0ZW1DYWxsRXJyb3JdIGlmIGNsb3NpbmcgdGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIGZhaWxzLgorICAgIGRlZiBjbG9zZQorICAgICAgc3RvcAorICAgICAgaWYgTmF0aXZlLmNsb3NlKEBmZCkgPT0gMAorICAgICAgICBAd2F0Y2hlcnMuY2xlYXIKKyAgICAgICAgcmV0dXJuCisgICAgICBlbmQKKworICAgICAgcmFpc2UgU3lzdGVtQ2FsbEVycm9yLm5ldygiRmFpbGVkIHRvIHByb3Blcmx5IGNsb3NlIGlub3RpZnkgc29ja2V0IiArCisgICAgICAgY2FzZSBGRkkuZXJybm8KKyAgICAgICB3aGVuIEVycm5vOjpFQkFERjo6RXJybm87ICI6IGludmFsaWQgb3IgY2xvc2VkIGZpbGUgZGVzY3JpcHRpb3IiCisgICAgICAgd2hlbiBFcnJubzo6RUlPOjpFcnJubzsgIjogYW4gSS9PIGVycm9yIG9jY3VyZWQiCisgICAgICAgZW5kLAorICAgICAgIEZGSS5lcnJubykKKyAgICBlbmQKKworICAgICMgQmxvY2tzIHVudGlsIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBmaWxlc3lzdGVtIGV2ZW50cyB0aGF0IHRoaXMgbm90aWZpZXIKKyAgICAjIGhhcyB3YXRjaGVycyByZWdpc3RlcmVkIGZvci4gT25jZSB0aGVyZSBhcmUgZXZlbnRzLCByZXR1cm5zIHRoZWlyIHtFdmVudH0KKyAgICAjIG9iamVjdHMuCisgICAgIworICAgICMgVGhpcyBjYW4gcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHdhdGNoZXIgd2FzIGNsb3NlZCBlbHNld2hlcmUuCisgICAgIworICAgICMgeyNydW59IG9yIHsjcHJvY2Vzc30gYXJlIHVzdXNhbGx5IHByZWZlcmFibGUgdG8gY2FsbGluZyB0aGlzIGRpcmVjdGx5LgorICAgIGRlZiByZWFkX2V2ZW50cworICAgICAgc2l6ZSA9IE5hdGl2ZTo6RXZlbnQuc2l6ZSArIE5hdGl2ZS5mcGF0aGNvbmYoZmQsIE5hdGl2ZTo6RmxhZ3M6OlBDX05BTUVfTUFYKSArIDEKKyAgICAgIHRyaWVzID0gMQorCisgICAgICBiZWdpbgorICAgICAgICBkYXRhID0gcmVhZHBhcnRpYWwoc2l6ZSkKKyAgICAgIHJlc2N1ZSBTeXN0ZW1DYWxsRXJyb3IgPT4gZXIKKyAgICAgICAgIyBFSU5WQUwgbWVhbnMgdGhhdCB0aGVyZSdzIG1vcmUgZGF0YSB0byBiZSByZWFkCisgICAgICAgICMgdGhhbiB3aWxsIGZpdCBpbiB0aGUgYnVmZmVyIHNpemUKKyAgICAgICAgcmFpc2UgZXIgdW5sZXNzIGVyLmVycm5vID09IEVycm5vOjpFSU5WQUw6OkVycm5vICYmIHRyaWVzIDwgNQorICAgICAgICBzaXplICo9IDIKKyAgICAgICAgdHJpZXMgKz0gMQorICAgICAgICByZXRyeQorICAgICAgZW5kCisgICAgICByZXR1cm4gW10gaWYgZGF0YS5uaWw/CisKKyAgICAgIGV2ZW50cyA9IFtdCisgICAgICBjb29raWVzID0ge30KKyAgICAgIHdoaWxlIGV2ZW50ID0gRXZlbnQuY29uc3VtZShkYXRhLCBzZWxmKQorICAgICAgICBldmVudHMgPDwgZXZlbnQKKyAgICAgICAgbmV4dCBpZiBldmVudC5jb29raWUgPT0gMAorICAgICAgICBjb29raWVzW2V2ZW50LmNvb2tpZV0gfHw9IFtdCisgICAgICAgIGNvb2tpZXNbZXZlbnQuY29va2llXSA8PCBldmVudAorICAgICAgZW5kCisgICAgICBjb29raWVzLmVhY2gge3xjLCBldnN8IGV2cy5lYWNoIHt8ZXZ8IGV2LnJlbGF0ZWQucmVwbGFjZShldnMgLSBbZXZdKS5mcmVlemV9fQorICAgICAgZXZlbnRzCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICAjIFNhbWUgYXMgSU8jcmVhZHBhcnRpYWwsIG9yIGFzIGNsb3NlIGFzIHdlIG5lZWQuCisgICAgZGVmIHJlYWRwYXJ0aWFsKHNpemUpCisgICAgICAjIFVzZSBSdWJ5J3MgcmVhZHBhcnRpYWwgaWYgcG9zc2libGUsIHRvIGF2b2lkIGJsb2NraW5nIG90aGVyIHRocmVhZHMuCisgICAgICBiZWdpbgorICAgICAgICByZXR1cm4gdG9faW8ucmVhZHBhcnRpYWwoc2l6ZSkgaWYgc2VsZi5jbGFzcy5zdXBwb3J0c19ydWJ5X2lvPworICAgICAgcmVzY3VlIEVycm5vOjpFQkFERiwgSU9FcnJvcgorICAgICAgICAjIElmIHRoZSBJTyBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCwgcmVhZGluZyBmcm9tIGl0IHdpbGwgY2F1c2UKKyAgICAgICAgIyBFcnJubzo6RUJBREYuIEluIEpSdWJ5IGl0IGNhbiByYWlzZSBJT0Vycm9yIHdpdGggaW52YWxpZCBvcgorICAgICAgICAjIGNsb3NlZCBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgIHJldHVybiBuaWwKKyAgICAgIHJlc2N1ZSBJT0Vycm9yID0+IGV4CisgICAgICAgIHJldHVybiBuaWwgaWYgZXgubWVzc2FnZSA9fiAvc3RyZWFtIGNsb3NlZC8KKyAgICAgICAgcmFpc2UKKyAgICAgIGVuZAorCisgICAgICB0cmllcyA9IDAKKyAgICAgIGJlZ2luCisgICAgICAgIHRyaWVzICs9IDEKKyAgICAgICAgYnVmZmVyID0gRkZJOjpNZW1vcnlQb2ludGVyLm5ldyg6Y2hhciwgc2l6ZSkKKyAgICAgICAgc2l6ZV9yZWFkID0gTmF0aXZlLnJlYWQoZmQsIGJ1ZmZlciwgc2l6ZSkKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5yZWFkX3N0cmluZyhzaXplX3JlYWQpIGlmIHNpemVfcmVhZCA+PSAwCisgICAgICBlbmQgd2hpbGUgRkZJLmVycm5vID09IEVycm5vOjpFSU5UUjo6RXJybm8gJiYgdHJpZXMgPD0gNQorCisgICAgICByYWlzZSBTeXN0ZW1DYWxsRXJyb3IubmV3KCJFcnJvciByZWFkaW5nIGlub3RpZnkgZXZlbnRzIiArCisgICAgICAgIGNhc2UgRkZJLmVycm5vCisgICAgICAgIHdoZW4gRXJybm86OkVBR0FJTjo6RXJybm87ICI6IG5vIGRhdGEgYXZhaWxhYmxlIGZvciBub24tYmxvY2tpbmcgSS9PIgorICAgICAgICB3aGVuIEVycm5vOjpFQkFERjo6RXJybm87ICI6IGludmFsaWQgb3IgY2xvc2VkIGZpbGUgZGVzY3JpcHRvciIKKyAgICAgICAgd2hlbiBFcnJubzo6RUZBVUxUOjpFcnJubzsgIjogaW52YWxpZCBidWZmZXIiCisgICAgICAgIHdoZW4gRXJybm86OkVJTlZBTDo6RXJybm87ICI6IGludmFsaWQgZmlsZSBkZXNjcmlwdG9yIgorICAgICAgICB3aGVuIEVycm5vOjpFSU86OkVycm5vOyAiOiBJL08gZXJyb3IiCisgICAgICAgIHdoZW4gRXJybm86OkVJU0RJUjo6RXJybm87ICI6IGZpbGUgZGVzY3JpcHRvciBpcyBhIGRpcmVjdG9yeSIKKyAgICAgICAgZWxzZTsgIiIKKyAgICAgICAgZW5kLAorICAgICAgICBGRkkuZXJybm8pCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9saWIvcmItaW5vdGlmeS92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFlYjFjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDI0IEBACisjIENvcHlyaWdodCwgMjAxMiwgYnkgTmF0YWxpZSBXZWl6ZW5iYXVtLgorIyBDb3B5cmlnaHQsIDIwMTcsIGJ5IFNhbXVlbCBHLiBELiBXaWxsaWFtcy4gPGh0dHA6Ly93d3cuY29kZW90YWt1LmNvbT4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisjIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisjIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorIyBUSEUgU09GVFdBUkUuCisKK21vZHVsZSBJTm90aWZ5CisgIFZFUlNJT04gPSAnMC45LjEwJworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9saWIvcmItaW5vdGlmeS93YXRjaGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkvd2F0Y2hlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjA1ZTJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvbGliL3JiLWlub3RpZnkvd2F0Y2hlci5yYgpAQCAtMCwwICsxLDg4IEBACittb2R1bGUgSU5vdGlmeQorICAjIFdhdGNoZXJzIG1vbml0b3IgYSBzaW5nbGUgcGF0aCBmb3IgY2hhbmdlcywKKyAgIyBzcGVjaWZpZWQgYnkge0lOb3RpZnk6Ok5vdGlmaWVyI3dhdGNoIGV2ZW50IGZsYWdzfS4KKyAgIyBBIHdhdGNoZXIgaXMgdXN1YWxseSBjcmVhdGVkIHZpYSBce05vdGlmaWVyI3dhdGNofS4KKyAgIworICAjIE9uZSB7Tm90aWZpZXJ9IG1heSBoYXZlIG1hbnkge1dhdGNoZXJ9cy4KKyAgIyBUaGUgTm90aWZpZXIgYWN0dWFsbHkgdGFrZXMgY2FyZSBvZiB0aGUgY2hlY2tpbmcgZm9yIGV2ZW50cywKKyAgIyB2aWEgXHtOb3RpZmllciNydW4gI3J1bn0gb3IgXHtOb3RpZmllciNwcm9jZXNzICNwcm9jZXNzfS4KKyAgIyBUaGUgbWFpbiBwdXJwb3NlIG9mIGhhdmluZyBXYXRjaGVyIG9iamVjdHMKKyAgIyBpcyB0byBiZSBhYmxlIHRvIGRpc2FibGUgdGhlbSB1c2luZyBceyNjbG9zZX0uCisgIGNsYXNzIFdhdGNoZXIKKyAgICAjIFRoZSB7Tm90aWZpZXJ9IHRoYXQgdGhpcyBXYXRjaGVyIGJlbG9uZ3MgdG8uCisgICAgIworICAgICMgQHJldHVybiBbTm90aWZpZXJdCisgICAgYXR0cl9yZWFkZXIgOm5vdGlmaWVyCisKKyAgICAjIFRoZSBwYXRoIHRoYXQgdGhpcyBXYXRjaGVyIGlzIHdhdGNoaW5nLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX3JlYWRlciA6cGF0aAorCisgICAgIyBUaGUge0lOb3RpZnk6Ok5vdGlmaWVyI3dhdGNoIGZsYWdzfQorICAgICMgc3BlY2lmeWluZyB0aGUgZXZlbnRzIHRoYXQgdGhpcyBXYXRjaGVyIGlzIHdhdGNoaW5nIGZvciwKKyAgICAjIGFuZCBwb3RlbnRpYWxseSBzb21lIG9wdGlvbnMgYXMgd2VsbC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxTeW1ib2w+XQorICAgIGF0dHJfcmVhZGVyIDpmbGFncworCisgICAgIyBUaGUgaWQgZm9yIHRoaXMgV2F0Y2hlci4KKyAgICAjIFVzZWQgdG8gcmV0cmlldmUgdGhpcyBXYXRjaGVyIGZyb20ge05vdGlmaWVyI3dhdGNoZXJzfS4KKyAgICAjCisgICAgIyBAcHJpdmF0ZQorICAgICMgQHJldHVybiBbRml4bnVtXQorICAgIGF0dHJfcmVhZGVyIDppZAorCisgICAgIyBDYWxscyB0aGlzIFdhdGNoZXIncyBjYWxsYmFjayB3aXRoIHRoZSBnaXZlbiB7RXZlbnR9LgorICAgICMKKyAgICAjIEBwcml2YXRlCisgICAgIyBAcGFyYW0gZXZlbnQgW0V2ZW50XQorICAgIGRlZiBjYWxsYmFjayEoZXZlbnQpCisgICAgICBAY2FsbGJhY2tbZXZlbnRdCisgICAgZW5kCisKKyAgICAjIERpc2FibGVzIHRoaXMgV2F0Y2hlciwgc28gdGhhdCBpdCBkb2Vzbid0IGZpcmUgYW55IG1vcmUgZXZlbnRzLgorICAgICMKKyAgICAjIEByYWlzZSBbU3lzdGVtQ2FsbEVycm9yXSBpZiB0aGUgd2F0Y2ggZmFpbHMgdG8gYmUgZGlzYWJsZWQgZm9yIHNvbWUgcmVhc29uCisgICAgZGVmIGNsb3NlCisgICAgICBpZiBOYXRpdmUuaW5vdGlmeV9ybV93YXRjaChAbm90aWZpZXIuZmQsIEBpZCkgPT0gMAorICAgICAgICBAbm90aWZpZXIud2F0Y2hlcnMuZGVsZXRlKEBpZCkKKyAgICAgICAgcmV0dXJuCisgICAgICBlbmQKKworICAgICAgcmFpc2UgU3lzdGVtQ2FsbEVycm9yLm5ldygiRmFpbGVkIHRvIHN0b3Agd2F0Y2hpbmcgI3twYXRoLmluc3BlY3R9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZJLmVycm5vKQorICAgIGVuZAorCisgICAgIyBDcmVhdGVzIGEgbmV3IHtXYXRjaGVyfS4KKyAgICAjCisgICAgIyBAcHJpdmF0ZQorICAgICMgQHNlZSBOb3RpZmllciN3YXRjaAorICAgIGRlZiBpbml0aWFsaXplKG5vdGlmaWVyLCBwYXRoLCAqZmxhZ3MsICZjYWxsYmFjaykKKyAgICAgIEBub3RpZmllciA9IG5vdGlmaWVyCisgICAgICBAY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBwcm9jIHt9CisgICAgICBAcGF0aCA9IHBhdGgKKyAgICAgIEBmbGFncyA9IGZsYWdzLmZyZWV6ZQorICAgICAgQGlkID0gTmF0aXZlLmlub3RpZnlfYWRkX3dhdGNoKEBub3RpZmllci5mZCwgcGF0aC5kdXAsCisgICAgICAgIE5hdGl2ZTo6RmxhZ3MudG9fbWFzayhmbGFncykpCisKKyAgICAgIHVubGVzcyBAaWQgPCAwCisgICAgICAgIEBub3RpZmllci53YXRjaGVyc1tAaWRdID0gc2VsZgorICAgICAgICByZXR1cm4KKyAgICAgIGVuZAorCisgICAgICByYWlzZSBTeXN0ZW1DYWxsRXJyb3IubmV3KAorICAgICAgICAiRmFpbGVkIHRvIHdhdGNoICN7cGF0aC5pbnNwZWN0fSIgKworICAgICAgICBjYXNlIEZGSS5lcnJubworICAgICAgICB3aGVuIEVycm5vOjpFQUNDRVM6OkVycm5vOyAiOiByZWFkIGFjY2VzcyB0byB0aGUgZ2l2ZW4gZmlsZSBpcyBub3QgcGVybWl0dGVkLiIKKyAgICAgICAgd2hlbiBFcnJubzo6RUJBREY6OkVycm5vOyAiOiB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIGlzIG5vdCB2YWxpZC4iCisgICAgICAgIHdoZW4gRXJybm86OkVGQVVMVDo6RXJybm87ICI6IHBhdGggcG9pbnRzIG91dHNpZGUgb2YgdGhlIHByb2Nlc3MncyBhY2Nlc3NpYmxlIGFkZHJlc3Mgc3BhY2UuIgorICAgICAgICB3aGVuIEVycm5vOjpFSU5WQUw6OkVycm5vOyAiOiB0aGUgZ2l2ZW4gZXZlbnQgbWFzayBjb250YWlucyBubyBsZWdhbCBldmVudHM7IG9yIGZkIGlzIG5vdCBhbiBpbm90aWZ5IGZpbGUgZGVzY3JpcHRvci4iCisgICAgICAgIHdoZW4gRXJybm86OkVOT01FTTo6RXJybm87ICI6IGluc3VmZmljaWVudCBrZXJuZWwgbWVtb3J5IHdhcyBhdmFpbGFibGUuIgorICAgICAgICB3aGVuIEVycm5vOjpFTk9TUEM6OkVycm5vOyAiOiBUaGUgdXNlciBsaW1pdCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGlub3RpZnkgd2F0Y2hlcyB3YXMgcmVhY2hlZCBvciB0aGUga2VybmVsIGZhaWxlZCB0byBhbGxvY2F0ZSBhIG5lZWRlZCByZXNvdXJjZS4iCisgICAgICAgIGVsc2U7ICIiCisgICAgICAgIGVuZCwKKyAgICAgICAgRkZJLmVycm5vKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvcmItaW5vdGlmeS5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvcmItaW5vdGlmeS5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmM3NzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9yYi1pbm90aWZ5LmdlbXNwZWMKQEAgLTAsMCArMSwzMCBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorCiskTE9BRF9QQVRILnVuc2hpZnQgRmlsZS5leHBhbmRfcGF0aCgnLi4vbGliJywgX19GSUxFX18pCityZXF1aXJlICdyYi1pbm90aWZ5L3ZlcnNpb24nCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHNwZWN8CisgIHNwZWMubmFtZSAgICAgPSAncmItaW5vdGlmeScKKyAgc3BlYy52ZXJzaW9uICA9IElOb3RpZnk6OlZFUlNJT04KKyAgc3BlYy5wbGF0Zm9ybSA9IEdlbTo6UGxhdGZvcm06OlJVQlkKKworICBzcGVjLnN1bW1hcnkgICAgID0gJ0EgUnVieSB3cmFwcGVyIGZvciBMaW51eCBpbm90aWZ5LCB1c2luZyBGRkknCisgIHNwZWMuYXV0aG9ycyAgICAgPSBbJ05hdGFsaWUgV2VpemVuYmF1bScsICdTYW11ZWwgV2lsbGlhbXMnXQorICBzcGVjLmVtYWlsICAgICAgID0gWyduZXgzNDJAZ21haWwuY29tJywgJ3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56J10KKyAgc3BlYy5ob21lcGFnZSAgICA9ICdodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvcmItaW5vdGlmeScKKyAgc3BlYy5saWNlbnNlcyAgICA9IFsnTUlUJ10KKworICBzcGVjLmZpbGVzICAgICAgICAgPSBgZ2l0IGxzLWZpbGVzYC5zcGxpdCgkLykKKyAgc3BlYy5leGVjdXRhYmxlcyAgID0gc3BlYy5maWxlcy5ncmVwKCVye15iaW4vfSkgeyB8ZnwgRmlsZS5iYXNlbmFtZShmKSB9CisgIHNwZWMudGVzdF9maWxlcyAgICA9IHNwZWMuZmlsZXMuZ3JlcCglcnteKHRlc3R8c3BlY3xmZWF0dXJlcykvfSkKKyAgc3BlYy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiXQorCisgIHNwZWMucmVxdWlyZWRfcnVieV92ZXJzaW9uID0gJz49IDAnCisKKyAgc3BlYy5hZGRfZGVwZW5kZW5jeSAnZmZpJywgJz49IDAuNS4wJywgJzwgMicKKworICBzcGVjLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJyc3BlYyIsICJ+PiAzLjQiCisgIHNwZWMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgImJ1bmRsZXIiLCAifj4gMS4zIgorICAjIHJha2UgMTEueCByZXF1aXJlcyBSdWJ5ID49IDEuOS4zCisgIHNwZWMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInJha2UiLCAiPj0gMTAuNS4wIiwgIjwgMTMiCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL3NwZWMvcmItaW5vdGlmeS9lcnJvcnNfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL3NwZWMvcmItaW5vdGlmeS9lcnJvcnNfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmY1ZTNlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvc3BlYy9yYi1pbm90aWZ5L2Vycm9yc19zcGVjLnJiCkBAIC0wLDAgKzEsOSBAQAorcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlIElOb3RpZnkgZG8KKyAgZGVzY3JpYmUgIlF1ZXVlT3ZlcmZsb3dFcnJvciIgZG8KKyAgICBpdCAiZXhpc3RzIiBkbworICAgICAgZXhwZWN0KElOb3RpZnk6OlF1ZXVlT3ZlcmZsb3dFcnJvcikudG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9zcGVjL3JiLWlub3RpZnlfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JiLWlub3RpZnktMC45LjEwL3NwZWMvcmItaW5vdGlmeV9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2VhMzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9zcGVjL3JiLWlub3RpZnlfc3BlYy5yYgpAQCAtMCwwICsxLDkgQEAKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSBJTm90aWZ5IGRvCisgIGRlc2NyaWJlICJ2ZXJzaW9uIiBkbworICAgIGl0ICJleGlzdHMiIGRvCisgICAgICBleHBlY3QoSU5vdGlmeTo6VkVSU0lPTikudG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yYi1pbm90aWZ5LTAuOS4xMC9zcGVjL3NwZWNfaGVscGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvc3BlYy9zcGVjX2hlbHBlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGNlYjdiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcmItaW5vdGlmeS0wLjkuMTAvc3BlYy9zcGVjX2hlbHBlci5yYgpAQCAtMCwwICsxLDEyIEBACisKK3JlcXVpcmUgImJ1bmRsZXIvc2V0dXAiCityZXF1aXJlICJyYi1pbm90aWZ5IgorCitSU3BlYy5jb25maWd1cmUgZG8gfGNvbmZpZ3wKKwkjIEVuYWJsZSBmbGFncyBsaWtlIC0tb25seS1mYWlsdXJlcyBhbmQgLS1uZXh0LWZhaWx1cmUKKwljb25maWcuZXhhbXBsZV9zdGF0dXNfcGVyc2lzdGVuY2VfZmlsZV9wYXRoID0gIi5yc3BlY19zdGF0dXMiCisKKwljb25maWcuZXhwZWN0X3dpdGggOnJzcGVjIGRvIHxjfAorCQljLnN5bnRheCA9IDpleHBlY3QKKwllbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL0dlbWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThjNGNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL0dlbWZpbGUKQEAgLTAsMCArMSwyMyBAQAorc291cmNlICdodHRwOi8vcnVieWdlbXMub3JnJworCitnZW1zcGVjCisKK2dlbSAnbWluaXRlc3QnLCAnfj4gNC4wJworZ2VtICd3cm9uZycKKworZ2VtICdyYWtlJworCisjIGRvbid0IHRyeSB0byBpbnN0YWxsIHJlZGNhcnBldCB1bmRlciBqcnVieQorZ2VtICdyZWRjYXJwZXQnLCA6cGxhdGZvcm1zID0+IDpydWJ5CisKK2dyb3VwIDpkZXZlbG9wbWVudCBkbworICBnZW0gJ3ByeScKKworICAjIGRvY3MKKyAgZ2VtICd5YXJkJworICBnZW0gJ2dpdGh1Yi1tYXJrdXAnCisKKyAgIyBmb3IgdmlzdWFsIHRlc3RzCisgIGdlbSAnc2luYXRyYScKKyAgZ2VtICdzaG90Z3VuJworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvTElDRU5TRSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDU5MmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvTElDRU5TRQpAQCAtMCwwICsxLDE4NiBAQAorIyBNSVQgbGljZW5zZS4gIFNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAorCitDb3B5cmlnaHQgKGMpIDIwMTIgSmVhbmluZSBBZGtpc3Nvbi4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKKyMgU1BFQ0lBTCBOT1RFOgorTWFueSBvZiB0aGUgbGV4ZXJzIGluIHRoaXMgcHJvamVjdCBhcmUgYWRhcHRhdGlvbnMgb2YgdGhvc2UgaW4gUHlnbWVudHMKKyhweWdtZW50cy5vcmcpLiAgVGhlIGxpY2Vuc2UgZm9yIFB5Z21lbnRzIGlzIGFzIGZvbGxvd3M6CisKKyMgQkVHSU4gcHlnbWVudHMvTElDRU5TRSAjCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDEyIGJ5IHRoZSByZXNwZWN0aXZlIGF1dGhvcnMgKHNlZSBBVVRIT1JTIGZpbGUpLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBFTkQgcHlnbWVudHMvTElDRU5TRSAjCisKK1RoZSBjb250ZW50cyBvZiB0aGUgQVVUSE9SUyBmaWxlIGF0IHRoZSB0aW1lIG9mIHBvcnRpbmcgd2FzOgorCisjIEJFR0lOIHB5Z21lbnRzL0FVVEhPUlMgIworCitQeWdtZW50cyBpcyB3cml0dGVuIGFuZCBtYWludGFpbmVkIGJ5IEdlb3JnIEJyYW5kbCA8Z2VvcmdAcHl0aG9uLm9yZz4uCisKK01ham9yIGRldmVsb3BlcnMgYXJlIFRpbSBIYXRjaCA8dGltQHRpbWhhdGNoLmNvbT4gYW5kIEFybWluIFJvbmFjaGVyCis8YXJtaW4ucm9uYWNoZXJAYWN0aXZlLTQuY29tPi4KKworT3RoZXIgY29udHJpYnV0b3JzLCBsaXN0ZWQgYWxwaGFiZXRpY2FsbHksIGFyZToKKworKiBTYW0gQWFyb24gLS0gSW9rZSBsZXhlcgorKiBLdW1hciBBcHBhaWFoIC0tIERlYmlhbiBjb250cm9sIGxleGVyCisqIEFsaSBBZnNoYXIgLS0gaW1hZ2UgZm9ybWF0dGVyCisqIEFuZHJlYXMgQW1hbm4gLS0gQXBwbGVTY3JpcHQgbGV4ZXIKKyogSmVmZnJleSBBcm5vbGQgLS0gUi9TIGxleGVyLCBCVUdTIGxleGVycworKiBKZXJlbXkgQXNoa2VuYXMgLS0gQ29mZmVlU2NyaXB0IGxleGVyCisqIFN0ZWZhbiBNYXR0aGlhcyBBdXN0IC0tIFNtYWxsdGFsayBsZXhlcgorKiBCZW4gQmFuZ2VydCAtLSBNYWtvIGxleGVycworKiBNYXggQmF0dGNoZXIgLS0gRGFyY3MgcGF0Y2ggbGV4ZXIKKyogUGF1bCBCYXVtZ2FydCwgMjgwIE5vcnRoLCBJbmMuIC0tIE9iamVjdGl2ZS1KIGxleGVyCisqIE1pY2hhZWwgQmF5ZXIgLS0gTXlnaHR5IGxleGVycworKiBKb2huIEJlbmVkaWt0c3NvbiAtLSBGYWN0b3IgbGV4ZXIKKyogQ2hyaXN0b3BoZXIgQmVydGVscyAtLSBGYW5jeSBsZXhlcgorKiBKYXJyZXR0IEJpbGxpbmdzbGV5IC0tIE1pbmlEIGxleGVyCisqIEFkYW0gQmxpbmtpbnNvcCAtLSBIYXNrZWxsLCBSZWRjb2RlIGxleGVycworKiBGcml0cyB2YW4gQm9tbWVsIC0tIGFzc2VtYmxlciBsZXhlcnMKKyogUGllcnJlIEJvdXJkb24gLS0gYnVnZml4ZXMKKyogSGlyYW0gQ2hpcmlubyAtLSBTY2FtbCBhbmQgSmFkZSBsZXhlcnMKKyogTGVhZiBDb3Jjb3JhbiAtLSBNb29uU2NyaXB0IGxleGVyCisqIENocmlzdG9waGVyIENyZXV0emlnIC0tIE11UEFEIGxleGVyCisqIFBldGUgQ3VycnkgLS0gYnVnZml4ZXMKKyogT3dlbiBEdXJuaSAtLSBoYVhlIGxleGVyCisqIE5pY2sgRWZmb3JkIC0tIFB5dGhvbiAzIGxleGVyCisqIFN2ZW4gRWZmdGluZ2UgLS0gWHRlbmQgbGV4ZXIKKyogQXJ0ZW0gRWdvcmtpbmUgLS0gdGVybWluYWwyNTYgZm9ybWF0dGVyCisqIEphbWVzIEguIEZpc2hlciAtLSBQb3N0U2NyaXB0IGxleGVyCisqIENhcmxvcyBHYWxkaW5vIC0tIEVsaXhpciBhbmQgRWxpeGlyIENvbnNvbGUgbGV4ZXJzCisqIE5hdmVlbiBHYXJnIC0tIEF1dG9ob3RrZXkgbGV4ZXIKKyogTGF1cmVudCBHYXV0aWVyIC0tIFIvUyBsZXhlcgorKiBBbGV4IEdheW5vciAtLSBQeVB5IGxvZyBsZXhlcgorKiBCZXJ0cmFuZCBHb2V0em1hbm4gLS0gR3Jvb3Z5IGxleGVyCisqIEtyenlzaWVrIEdvaiAtLSBTY2FsYSBsZXhlcgorKiBNYXR0IEdvb2QgLS0gR2Vuc2hpLCBDaGVldGFoIGxleGVycworKiBQYXRyaWNrIEdvdHRoYXJkdCAtLSBQSFAgbmFtZXNwYWNlcyBzdXBwb3J0CisqIE9saXZpZXIgR3VpYmUgLS0gQXN5bXB0b3RlIGxleGVyCisqIE1hcnRpbiBIYXJyaW1hbiAtLSBTTk9CT0wgbGV4ZXIKKyogTWF0dGhldyBIYXJyaXNvbiAtLSBTVkcgZm9ybWF0dGVyCisqIFN0ZXZlbiBIYXplbCAtLSBUY2wgbGV4ZXIKKyogQXNsYWsgSGVsbGVzw4PCuHkgLS0gR2hlcmtpbiBsZXhlcgorKiBHcmVnIEhlbmRlcnNob3R0IC0tIFJhY2tldCBsZXhlcgorKiBKb3JkaSBHdXRpw4PCqXJyZXogSGVybW9zbyAtLSBPY3RhdmUgbGV4ZXIKKyogRGF2aWQgSGVzcywgRmlzaCBTb2Z0d2FyZSwgSW5jLiAtLSBPYmplY3RpdmUtSiBsZXhlcgorKiBWYXJ1biBIaXJlbWF0aCAtLSBEZWJpYW4gY29udHJvbCBsZXhlcgorKiBEb3VnIEhvZ2FuIC0tIE1zY2dlbiBsZXhlcgorKiBCZW4gSG9sbGlzIC0tIE1hc29uIGxleGVyCisqIFRpbSBIb3dhcmQgLS0gQmxpdHpNYXggbGV4ZXIKKyogSXZhbiBJbm96ZW10c2V2IC0tIEZhbnRvbSBsZXhlcgorKiBCcmlhbiBSLiBKYWNrc29uIC0tIFRlYSBsZXhlcgorKiBEZW5uaXMgS2FhcnNlbWFrZXIgLS0gc291cmNlcy5saXN0IGxleGVyCisqIElnb3IgS2Fsbml0c2t5IC0tIHZoZGwgbGV4ZXIKKyogRXJpYyBLbmliYmUgLS0gTGFzc28gbGV4ZXIKKyogQWRhbSBLb3Byb3dza2kgLS0gT3BhIGxleGVyCisqIEJlbmphbWluIEtvd2Fyc2NoIC0tIE1vZHVsYS0yIGxleGVyCisqIEFsZXhhbmRlciBLcmllZ2lzY2ggLS0gS2NvbmZpZyBhbmQgQXNwZWN0SiBsZXhlcnMKKyogTWFyZWsgS3ViaWNhIC0tIFNjaGVtZSBsZXhlcgorKiBKb2NoZW4gS3VwcGVyc2NobWlkdCAtLSBNYXJrZG93biBwcm9jZXNzb3IKKyogR2VyZCBLdXJ6YmFjaCAtLSBNb2RlbGljYSBsZXhlcgorKiBPbG92IExhc3N1cyAtLSBEYXJ0IGxleGVyCisqIFN5bHZlc3RyZSBMZWRydSAtLSBTY2lsYWIgbGV4ZXIKKyogTWFyayBMZWUgLS0gVmFsYSBsZXhlcgorKiBCZW4gTWFiZXkgLS0gR2hlcmtpbiBsZXhlcgorKiBTaW1vbmUgTWFyZ2FyaXRlbGxpIC0tIEh5YnJpcyBsZXhlcgorKiBLaXJrIE1jRG9uYWxkIC0tIEQgbGV4ZXIKKyogR29yZG9uIE1jR3JlZ29yIC0tIFN5c3RlbVZlcmlsb2cgbGV4ZXIKKyogU3RlcGhlbiBNY0thbWV5IC0tIER1ZWwvSkJTVCBsZXhlcgorKiBCcmlhbiBNY0tlbm5hIC0tIEYjIGxleGVyCisqIEx1a2FzIE1ldXNlciAtLSBCQkNvZGUgZm9ybWF0dGVyLCBMdWEgbGV4ZXIKKyogUGF1bCBNaWxsZXIgLS0gTGl2ZVNjcmlwdCBsZXhlcgorKiBIb25nIE1pbmhlZSAtLSBIVFRQIGxleGVyCisqIE1pY2hhZWwgTWlvciAtLSBBd2sgbGV4ZXIKKyogSm9uIE1vcnRvbiAtLSBSdXN0IGxleGVyCisqIFBhdWxvIE1vdXJhIC0tIExvZ3RhbGsgbGV4ZXIKKyogTWhlciBNb3ZzaXN5YW4gLS0gRFREIGxleGVyCisqIEFuYSBOZWxzb24gLS0gUmFnZWwsIEFOVExSLCBSIGNvbnNvbGUgbGV4ZXJzCisqIE5hbSBULiBOZ3V5ZW4gLS0gTW9ub2thaSBzdHlsZQorKiBKZXNwZXIgTm9laHIgLS0gSFRNTCBmb3JtYXR0ZXIgImFuY2hvcmxpbmVub3MiCisqIE1pa2UgTm9sdGEgLS0gSnVsaWEgbGV4ZXIKKyogSm9uYXMgT2JyaXN0IC0tIEJCQ29kZSBsZXhlcgorKiBEYXZpZCBPbGl2YSAtLSBSZWJvbCBsZXhlcgorKiBKb24gUGFyaXNlIC0tIFByb3RvY29sIGJ1ZmZlcnMgbGV4ZXIKKyogUm9ubnkgUGZhbm5zY2htaWR0IC0tIEJCQ29kZSBsZXhlcgorKiBCZW5qYW1pbiBQZXRlcnNvbiAtLSBUZXN0IHN1aXRlIHJlZmFjdG9yaW5nCisqIERvbWluaWsgUGljaGV0YSAtLSBOaW1yb2QgbGV4ZXIKKyogQ2zDg8KpbWVudCBQcsODwql2b3N0IC0tIFVyYmlTY3JpcHQgbGV4ZXIKKyogS2FzaGlmIFJhc3VsIC0tIENVREEgbGV4ZXIKKyogSnVzdGluIFJlaWR5IC0tIE1YTUwgbGV4ZXIKKyogTm9ybWFuIFJpY2hhcmRzIC0tIEpTT04gbGV4ZXIKKyogTHVib21pciBSaW50ZWwgLS0gR29vZERhdGEgTUFRTCBhbmQgQ0wgbGV4ZXJzCisqIEFuZHJlIFJvYmVyZ2UgLS0gVGFuZ28gc3R5bGUKKyogS29ucmFkIFJ1ZG9scGggLS0gTGFUZVggZm9ybWF0dGVyIGVuaGFuY2VtZW50cworKiBNYXJpbyBSdWdnaWVyIC0tIEV2b3F1ZSBsZXhlcnMKKyogU3RvdSBTYW5kYWxza2kgLS0gTnVtUHksIEZPUlRSQU4sIHRjc2ggYW5kIFhTTFQgbGV4ZXJzCisqIE1hdHRlbyBTYXNzbyAtLSBDb21tb24gTGlzcCBsZXhlcgorKiBKb2UgU2NoYWZlciAtLSBBZGEgbGV4ZXIKKyogS2VuIFNjaHV0dGUgLS0gTWF0bGFiIGxleGVycworKiBUYXNzaWxvIFNjaHdleWVyIC0tIElvLCBNT09Db2RlIGxleGVycworKiBKb2VyZyBTaWVrZXIgLS0gQUJBUCBsZXhlcgorKiBSb2JlcnQgU2ltbW9ucyAtLSBTdGFuZGFyZCBNTCBsZXhlcgorKiBLaXJpbGwgU2ltb25vdiAtLSBZQU1MIGxleGVyCisqIFN0ZXZlIFNwaWdhcmVsbGkgLS0gWFF1ZXJ5IGxleGVyCisqIEplcm9tZSBTdC1Mb3VpcyAtLSBlQyBsZXhlcgorKiBKYW1lcyBTdHJhY2hhbiAtLSBLb3RsaW4gbGV4ZXIKKyogVGliZXJpdXMgVGVuZyAtLSBkZWZhdWx0IHN0eWxlIG92ZXJoYXVsCisqIEplcmVteSBUaHVyZ29vZCAtLSBFcmxhbmcsIFNxdWlkIGNvbmZpZyBsZXhlcnMKKyogRXJpY2sgVHJ5emVsYWFyIC0tIEZlbGl4IGxleGVyCisqIERhbmllbGUgVmFycmF6em8gLS0gUG9zdGdyZVNRTCBsZXhlcnMKKyogQWJlIFZvZWxrZXIgLS0gT3BlbkVkZ2UgQUJMIGxleGVyCisqIFdoaXRuZXkgWW91bmcgLS0gT2JqZWN0aXZlQyBsZXhlcgorKiBNYXR0aGlhcyBWYWxsZW50aW4gLS0gQnJvIGxleGVyCisqIE5hdGhhbiBXZWl6ZW5iYXVtIC0tIEhhbWwgYW5kIFNhc3MgbGV4ZXJzCisqIERpZXRtYXIgV2lua2xlciAtLSBNb2RlbGljYSBsZXhlcgorKiBOaWxzIFdpbnRlciAtLSBTbWFsbHRhbGsgbGV4ZXIKKyogRGF2eSBXeWJpcmFsIC0tIENsb2p1cmUgbGV4ZXIKKyogRGllZ28gWmFtYm9uaSAtLSBDRmVuZ2luZTMgbGV4ZXIKKyogQWxleCBaaW1pbiAtLSBOZW1lcmxlIGxleGVyCisKK01hbnkgdGhhbmtzIGZvciBhbGwgY29udHJpYnV0aW9ucyEKKworIyBFTkQgcHlnbWVudHMvQVVUSE9SUyAjCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvYmluL3JvdWdpZnkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvYmluL3JvdWdpZnkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmVlNGIwYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9iaW4vcm91Z2lmeQpAQCAtMCwwICsxLDE2IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKK3JlcXVpcmUgJ3BhdGhuYW1lJworUk9PVF9ESVIgPSBQYXRobmFtZS5uZXcoX19GSUxFX18pLmRpcm5hbWUucGFyZW50Citsb2FkIFJPT1RfRElSLmpvaW4oJ2xpYi9yb3VnZS5yYicpCitsb2FkIFJPT1RfRElSLmpvaW4oJ2xpYi9yb3VnZS9jbGkucmInKQorCitiZWdpbgorICBSb3VnZTo6Q0xJLnBhcnNlKEFSR1YpLnJ1bgorcmVzY3VlIFJvdWdlOjpDTEk6OkVycm9yID0+IGUKKyAgcHV0cyBlLm1lc3NhZ2UKKyAgZXhpdCBlLnN0YXR1cworcmVzY3VlIEludGVycnVwdAorICAkc3RkZXJyLnB1dHMgIlxucm91Z2U6IGludGVycnVwdGVkIgorICBleGl0IDIKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2ZjczMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UucmIKQEAgLTAsMCArMSw2OCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCisjIHN0ZGxpYgorcmVxdWlyZSAncGF0aG5hbWUnCisKKyMgVGhlIGNvbnRhaW5pbmcgbW9kdWxlIGZvciBSb3VnZQorbW9kdWxlIFJvdWdlCisgIGNsYXNzIDw8IHNlbGYKKyAgICAjIEhpZ2hsaWdodCBzb21lIHRleHQgd2l0aCBhIGdpdmVuIGxleGVyIGFuZCBmb3JtYXR0ZXIuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgUm91Z2UuaGlnaGxpZ2h0KCdAZm9vID0gMScsICdydWJ5JywgJ2h0bWwnKQorICAgICMgICBSb3VnZS5oaWdobGlnaHQoJ3ZhciBmb28gPSAxOycsICdqcycsICd0ZXJtaW5hbDI1NicpCisgICAgIworICAgICMgICAjIHN0cmVhbWluZyAtIGNodW5rcyBiZWNvbWUgYXZhaWxhYmxlIGFzIHRoZXkgYXJlIGxleGVkCisgICAgIyAgIFJvdWdlLmhpZ2hsaWdodChsYXJnZV9zdHJpbmcsICdydWJ5JywgJ2h0bWwnKSBkbyB8Y2h1bmt8CisgICAgIyAgICAgJHN0ZG91dC5wcmludCBjaHVuaworICAgICMgICBlbmQKKyAgICBkZWYgaGlnaGxpZ2h0KHRleHQsIGxleGVyLCBmb3JtYXR0ZXIsICZiKQorICAgICAgbGV4ZXIgPSBMZXhlci5maW5kKGxleGVyKSB1bmxlc3MgbGV4ZXIucmVzcG9uZF90bz8gOmxleAorICAgICAgcmFpc2UgInVua25vd24gbGV4ZXIgI3tsZXhlcn0iIHVubGVzcyBsZXhlcgorCisgICAgICBmb3JtYXR0ZXIgPSBGb3JtYXR0ZXIuZmluZChmb3JtYXR0ZXIpIHVubGVzcyBmb3JtYXR0ZXIucmVzcG9uZF90bz8gOmZvcm1hdAorICAgICAgcmFpc2UgInVua25vd24gZm9ybWF0dGVyICN7Zm9ybWF0dGVyfSIgdW5sZXNzIGZvcm1hdHRlcgorCisgICAgICBmb3JtYXR0ZXIuZm9ybWF0KGxleGVyLmxleCh0ZXh0KSwgJmIpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2xvYWRfZGlyID0gUGF0aG5hbWUubmV3KF9fRklMRV9fKS5kaXJuYW1lCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL3ZlcnNpb24ucmInKQorCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL3V0aWwucmInKQorCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL3RleHRfYW5hbHl6ZXIucmInKQorbG9hZCBsb2FkX2Rpci5qb2luKCdyb3VnZS90b2tlbi5yYicpCisKK2xvYWQgbG9hZF9kaXIuam9pbigncm91Z2UvZ3Vlc3Nlci5yYicpCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL2d1ZXNzZXJzL2dsb2JfbWFwcGluZy5yYicpCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL2d1ZXNzZXJzL21vZGVsaW5lLnJiJykKK2xvYWQgbG9hZF9kaXIuam9pbigncm91Z2UvZ3Vlc3NlcnMvZmlsZW5hbWUucmInKQorbG9hZCBsb2FkX2Rpci5qb2luKCdyb3VnZS9ndWVzc2Vycy9taW1ldHlwZS5yYicpCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL2d1ZXNzZXJzL3NvdXJjZS5yYicpCisKK2xvYWQgbG9hZF9kaXIuam9pbigncm91Z2UvbGV4ZXIucmInKQorbG9hZCBsb2FkX2Rpci5qb2luKCdyb3VnZS9yZWdleF9sZXhlci5yYicpCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL3RlbXBsYXRlX2xleGVyLnJiJykKKworbGV4ZXJzX2RpciA9IGxvYWRfZGlyLmpvaW4oJ3JvdWdlL2xleGVycycpCitEaXIuZ2xvYihsZXhlcnNfZGlyLmpvaW4oJyoucmInKSkuZWFjaCBkbyB8ZnwKKyAgUm91Z2U6OkxleGVycy5sb2FkX2xleGVyKFBhdGhuYW1lLm5ldyhmKS5yZWxhdGl2ZV9wYXRoX2Zyb20obGV4ZXJzX2RpcikudG9fcykKK2VuZAorCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL2Zvcm1hdHRlci5yYicpCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL2Zvcm1hdHRlcnMvaHRtbC5yYicpCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL2Zvcm1hdHRlcnMvdGVybWluYWwyNTYucmInKQorbG9hZCBsb2FkX2Rpci5qb2luKCdyb3VnZS9mb3JtYXR0ZXJzL251bGwucmInKQorCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL3RoZW1lLnJiJykKK2xvYWQgbG9hZF9kaXIuam9pbigncm91Z2UvdGhlbWVzL3RoYW5rZnVsX2V5ZXMucmInKQorbG9hZCBsb2FkX2Rpci5qb2luKCdyb3VnZS90aGVtZXMvY29sb3JmdWwucmInKQorbG9hZCBsb2FkX2Rpci5qb2luKCdyb3VnZS90aGVtZXMvYmFzZTE2LnJiJykKK2xvYWQgbG9hZF9kaXIuam9pbigncm91Z2UvdGhlbWVzL2dpdGh1Yi5yYicpCitsb2FkIGxvYWRfZGlyLmpvaW4oJ3JvdWdlL3RoZW1lcy9tb25va2FpLnJiJykKK2xvYWQgbG9hZF9kaXIuam9pbigncm91Z2UvdGhlbWVzL21vbG9rYWkucmInKQorbG9hZCBsb2FkX2Rpci5qb2luKCdyb3VnZS90aGVtZXMvbW9ub2thaV9zdWJsaW1lLnJiJykKK2xvYWQgbG9hZF9kaXIuam9pbigncm91Z2UvdGhlbWVzL2dydXZib3gucmInKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9jbGkucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2NsaS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDcxNDAwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9jbGkucmIKQEAgLTAsMCArMSwzNjMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworIyBub3QgcmVxdWlyZWQgYnkgdGhlIG1haW4gbGliLgorIyB0byB1c2UgdGhpcyBtb2R1bGUsIHJlcXVpcmUgJ3JvdWdlL2NsaScuCisKK21vZHVsZSBSb3VnZQorICBjbGFzcyBGaWxlUmVhZGVyCisgICAgYXR0cl9yZWFkZXIgOmlucHV0CisgICAgZGVmIGluaXRpYWxpemUoaW5wdXQpCisgICAgICBAaW5wdXQgPSBpbnB1dAorICAgIGVuZAorCisgICAgZGVmIGZpbGUKKyAgICAgIGNhc2UgaW5wdXQKKyAgICAgIHdoZW4gJy0nCisgICAgICAgIElPLm5ldygkc3RkaW4uZmlsZW5vLCAncjp1dGYtOCcpCisgICAgICB3aGVuIFN0cmluZworICAgICAgICBGaWxlLm5ldyhpbnB1dCwgJ3I6dXRmLTgnKQorICAgICAgd2hlbiAtPihpKXsgaS5yZXNwb25kX3RvPyA6cmVhZCB9CisgICAgICAgIGlucHV0CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkCisgICAgICBAcmVhZCB8fD0gYmVnaW4KKyAgICAgICAgZmlsZS5yZWFkCisgICAgICByZXNjdWUgPT4gZQorICAgICAgICAkc3RkZXJyLnB1dHMgInVuYWJsZSB0byBvcGVuICN7aW5wdXR9OiAje2UubWVzc2FnZX0iCisgICAgICAgIGV4aXQgMQorICAgICAgZW5zdXJlCisgICAgICAgIGZpbGUuY2xvc2UKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBDTEkKKyAgICBkZWYgc2VsZi5kb2MKKyAgICAgIHJldHVybiBlbnVtX2Zvcig6ZG9jKSB1bmxlc3MgYmxvY2tfZ2l2ZW4/CisKKyAgICAgIHlpZWxkICV8dXNhZ2U6IHJvdWdpZnkgW2NvbW1hbmRdIFthcmdzLi4uXXwKKyAgICAgIHlpZWxkICV8fAorICAgICAgeWllbGQgJXx3aGVyZSA8Y29tbWFuZD4gaXMgb25lIG9mOnwKKyAgICAgIHlpZWxkICV8CWhpZ2hsaWdodAkje0hpZ2hsaWdodC5kZXNjfXwKKyAgICAgIHlpZWxkICV8CWhlbHAJCSN7SGVscC5kZXNjfXwKKyAgICAgIHlpZWxkICV8CXN0eWxlCQkje1N0eWxlLmRlc2N9fAorICAgICAgeWllbGQgJXwJbGlzdAkJI3tMaXN0LmRlc2N9fAorICAgICAgeWllbGQgJXwJdmVyc2lvbgkJI3tWZXJzaW9uLmRlc2N9fAorICAgICAgeWllbGQgJXx8CisgICAgICB5aWVsZCAlfFNlZSBgcm91Z2lmeSBoZWxwIDxjb21tYW5kPmAgZm9yIG1vcmUgaW5mby58CisgICAgZW5kCisKKyAgICBjbGFzcyBFcnJvciA8IFN0YW5kYXJkRXJyb3IKKyAgICAgIGF0dHJfcmVhZGVyIDptZXNzYWdlLCA6c3RhdHVzCisgICAgICBkZWYgaW5pdGlhbGl6ZShtZXNzYWdlLCBzdGF0dXM9MSkKKyAgICAgICAgQG1lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIEBzdGF0dXMgPSBzdGF0dXMKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHNlbGYucGFyc2UoYXJndj1BUkdWKQorICAgICAgYXJndiA9IG5vcm1hbGl6ZV9zeW50YXgoYXJndikKKworICAgICAgbW9kZSA9IGFyZ3Yuc2hpZnQKKworICAgICAga2xhc3MgPSBjbGFzc19mcm9tX2FyZyhtb2RlKQorICAgICAgcmV0dXJuIGtsYXNzLnBhcnNlKGFyZ3YpIGlmIGtsYXNzCisKKyAgICAgIGNhc2UgbW9kZQorICAgICAgd2hlbiAnLWgnLCAnLS1oZWxwJywgJ2hlbHAnLCAnLWhlbHAnCisgICAgICAgIEhlbHAucGFyc2UoYXJndikKKyAgICAgIGVsc2UKKyAgICAgICAgYXJndi51bnNoaWZ0KG1vZGUpIGlmIG1vZGUKKyAgICAgICAgSGlnaGxpZ2h0LnBhcnNlKGFyZ3YpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBpbml0aWFsaXplKG9wdGlvbnM9e30pCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5lcnJvciEobXNnLCBzdGF0dXM9MSkKKyAgICAgIHJhaXNlIEVycm9yLm5ldyhtc2csIHN0YXR1cykKKyAgICBlbmQKKworICAgIGRlZiBlcnJvciEoKmEpCisgICAgICBzZWxmLmNsYXNzLmVycm9yISgqYSkKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmNsYXNzX2Zyb21fYXJnKGFyZykKKyAgICAgIGNhc2UgYXJnCisgICAgICB3aGVuICd2ZXJzaW9uJywgJy0tdmVyc2lvbicsICctdicKKyAgICAgICAgVmVyc2lvbgorICAgICAgd2hlbiAnaGVscCcKKyAgICAgICAgSGVscAorICAgICAgd2hlbiAnaGlnaGxpZ2h0JywgJ2hpJworICAgICAgICBIaWdobGlnaHQKKyAgICAgIHdoZW4gJ3N0eWxlJworICAgICAgICBTdHlsZQorICAgICAgd2hlbiAnbGlzdCcKKyAgICAgICAgTGlzdAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjbGFzcyBWZXJzaW9uIDwgQ0xJCisgICAgICBkZWYgc2VsZi5kZXNjCisgICAgICAgICJwcmludCB0aGUgcm91Z2UgdmVyc2lvbiBudW1iZXIiCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYucGFyc2UoKik7IG5ldzsgZW5kCisKKyAgICAgIGRlZiBydW4KKyAgICAgICAgcHV0cyBSb3VnZS52ZXJzaW9uCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNsYXNzIEhlbHAgPCBDTEkKKyAgICAgIGRlZiBzZWxmLmRlc2MKKyAgICAgICAgInByaW50IGhlbHAgaW5mbyIKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5kb2MKKyAgICAgICAgcmV0dXJuIGVudW1fZm9yKDpkb2MpIHVubGVzcyBibG9ja19naXZlbj8KKworICAgICAgICB5aWVsZCAlfHVzYWdlOiByb3VnaWZ5IGhlbHAgPGNvbW1hbmQ+fAorICAgICAgICB5aWVsZCAlfHwKKyAgICAgICAgeWllbGQgJXxwcmludCBoZWxwIGluZm8gZm9yIDxjb21tYW5kPi58CisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYucGFyc2UoYXJndikKKyAgICAgICAgb3B0cyA9IHsgOm1vZGUgPT4gQ0xJIH0KKyAgICAgICAgdW50aWwgYXJndi5lbXB0eT8KKyAgICAgICAgICBhcmcgPSBhcmd2LnNoaWZ0CisgICAgICAgICAga2xhc3MgPSBjbGFzc19mcm9tX2FyZyhhcmcpCisgICAgICAgICAgaWYga2xhc3MKKyAgICAgICAgICAgIG9wdHNbOm1vZGVdID0ga2xhc3MKKyAgICAgICAgICAgIG5leHQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIG5ldyhvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbml0aWFsaXplKG9wdHM9e30pCisgICAgICAgIEBtb2RlID0gb3B0c1s6bW9kZV0KKyAgICAgIGVuZAorCisgICAgICBkZWYgcnVuCisgICAgICAgIEBtb2RlLmRvYy5lYWNoKCZtZXRob2QoOnB1dHMpKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjbGFzcyBIaWdobGlnaHQgPCBDTEkKKyAgICAgIGRlZiBzZWxmLmRlc2MKKyAgICAgICAgImhpZ2hsaWdodCBjb2RlIgorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmRvYworICAgICAgICByZXR1cm4gZW51bV9mb3IoOmRvYykgdW5sZXNzIGJsb2NrX2dpdmVuPworCisgICAgICAgIHlpZWxkICVbdXNhZ2U6IHJvdWdpZnkgaGlnaGxpZ2h0IDxmaWxlbmFtZT4gW29wdGlvbnMuLi5dXQorICAgICAgICB5aWVsZCAlWyAgICAgICByb3VnaWZ5IGhpZ2hsaWdodCBbb3B0aW9ucy4uLl1dCisgICAgICAgIHlpZWxkICVbXQorICAgICAgICB5aWVsZCAlWy0taW5wdXQtZmlsZXwtaSA8ZmlsZW5hbWU+ICBzcGVjaWZ5IGEgZmlsZSB0byByZWFkLCBvciAtIHRvIHVzZSBzdGRpbl0KKyAgICAgICAgeWllbGQgJVtdCisgICAgICAgIHlpZWxkICVbLS1sZXhlcnwtbCA8bGV4ZXI+ICAgICAgICAgIHNwZWNpZnkgdGhlIGxleGVyIHRvIHVzZS5dCisgICAgICAgIHlpZWxkICVbICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vdCBwcm92aWRlZCwgcm91Z2lmeSB3aWxsIHRyeSB0byBndWVzc10KKyAgICAgICAgeWllbGQgJVsgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gLS1taW1ldHlwZSwgdGhlIGZpbGVuYW1lLCBhbmQgdGhlXQorICAgICAgICB5aWVsZCAlWyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGNvbnRlbnRzLl0KKyAgICAgICAgeWllbGQgJVtdCisgICAgICAgIHlpZWxkICVbLS1mb3JtYXR0ZXJ8LWYgPG9wdHM+ICAgICAgIHNwZWNpZnkgdGhlIG91dHB1dCBmb3JtYXR0ZXIgdG8gdXNlLl0KKyAgICAgICAgeWllbGQgJVsgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHByb3ZpZGVkLCByb3VnaWZ5IHdpbGwgZGVmYXVsdCB0b10KKyAgICAgICAgeWllbGQgJVsgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWwyNTYuXQorICAgICAgICB5aWVsZCAlW10KKyAgICAgICAgeWllbGQgJVstLW1pbWV0eXBlfC1tIDxtaW1ldHlwZT4gICAgc3BlY2lmeSBhIG1pbWV0eXBlIGZvciBsZXhlciBndWVzc2luZ10KKyAgICAgICAgeWllbGQgJVtdCisgICAgICAgIHlpZWxkICVbLS1sZXhlci1vcHRzfC1MIDxvcHRzPiAgICAgIHNwZWNpZnkgbGV4ZXIgb3B0aW9ucyBpbiBDR0kgZm9ybWF0XQorICAgICAgICB5aWVsZCAlWyAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0MT12YWwxJm9wdDI9dmFsMildCisgICAgICAgIHlpZWxkICVbXQorICAgICAgICB5aWVsZCAlWy0tZm9ybWF0dGVyLW9wdHN8LUYgPG9wdHM+ICBzcGVjaWZ5IGZvcm1hdHRlciBvcHRpb25zIGluIENHSSBmb3JtYXRdCisgICAgICAgIHlpZWxkICVbICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHQxPXZhbDEmb3B0Mj12YWwyKV0KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5wYXJzZShhcmd2KQorICAgICAgICBvcHRzID0geworICAgICAgICAgIDpmb3JtYXR0ZXIgPT4gJ3Rlcm1pbmFsMjU2JywKKyAgICAgICAgICA6aW5wdXRfZmlsZSA9PiAnLScsCisgICAgICAgICAgOmxleGVyX29wdHMgPT4ge30sCisgICAgICAgICAgOmZvcm1hdHRlcl9vcHRzID0+IHt9LAorICAgICAgICB9CisKKyAgICAgICAgdW50aWwgYXJndi5lbXB0eT8KKyAgICAgICAgICBhcmcgPSBhcmd2LnNoaWZ0CisgICAgICAgICAgY2FzZSBhcmcKKyAgICAgICAgICB3aGVuICctLWlucHV0LWZpbGUnLCAnLWknCisgICAgICAgICAgICBvcHRzWzppbnB1dF9maWxlXSA9IGFyZ3Yuc2hpZnQKKyAgICAgICAgICB3aGVuICctLW1pbWV0eXBlJywgJy1tJworICAgICAgICAgICAgb3B0c1s6bWltZXR5cGVdID0gYXJndi5zaGlmdAorICAgICAgICAgIHdoZW4gJy0tbGV4ZXInLCAnLWwnCisgICAgICAgICAgICBvcHRzWzpsZXhlcl0gPSBhcmd2LnNoaWZ0CisgICAgICAgICAgd2hlbiAnLS1mb3JtYXR0ZXInLCAnLWYnCisgICAgICAgICAgICBvcHRzWzpmb3JtYXR0ZXJdID0gYXJndi5zaGlmdAorICAgICAgICAgIHdoZW4gJy0tbGV4ZXItb3B0cycsICctTCcKKyAgICAgICAgICAgIG9wdHNbOmxleGVyX29wdHNdID0gcGFyc2VfY2dpKGFyZ3Yuc2hpZnQpCisgICAgICAgICAgd2hlbiAnLS1mb3JtYXR0ZXItb3B0cycsICctRicKKyAgICAgICAgICAgIG9wdHNbOmZvcm1hdHRlcl9vcHRzXSA9IHBhcnNlX2NnaShhcmd2LnNoaWZ0KQorICAgICAgICAgIHdoZW4gL14tLS8KKyAgICAgICAgICAgIGVycm9yISAidW5rbm93biBvcHRpb24gI3thcmcuaW5zcGVjdH0iCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgb3B0c1s6aW5wdXRfZmlsZV0gPSBhcmcKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgbmV3KG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGlucHV0X3N0cmVhbQorICAgICAgICBAaW5wdXRfc3RyZWFtIHx8PSBGaWxlUmVhZGVyLm5ldyhAaW5wdXRfZmlsZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgaW5wdXQKKyAgICAgICAgQGlucHV0IHx8PSBpbnB1dF9zdHJlYW0ucmVhZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBsZXhlcl9jbGFzcworICAgICAgICBAbGV4ZXJfY2xhc3MgfHw9IExleGVyLmd1ZXNzKAorICAgICAgICAgIDpmaWxlbmFtZSA9PiBAaW5wdXRfZmlsZSwKKyAgICAgICAgICA6bWltZXR5cGUgPT4gQG1pbWV0eXBlLAorICAgICAgICAgIDpzb3VyY2UgPT4gaW5wdXRfc3RyZWFtLAorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIGxleGVyCisgICAgICAgIEBsZXhlciB8fD0gbGV4ZXJfY2xhc3MubmV3KEBsZXhlcl9vcHRzKQorICAgICAgZW5kCisKKyAgICAgIGF0dHJfcmVhZGVyIDppbnB1dF9maWxlLCA6bGV4ZXJfbmFtZSwgOm1pbWV0eXBlLCA6Zm9ybWF0dGVyCisKKyAgICAgIGRlZiBpbml0aWFsaXplKG9wdHM9e30pCisgICAgICAgIEBpbnB1dF9maWxlID0gb3B0c1s6aW5wdXRfZmlsZV0KKworICAgICAgICBpZiBvcHRzWzpsZXhlcl0KKyAgICAgICAgICBAbGV4ZXJfY2xhc3MgPSBMZXhlci5maW5kKG9wdHNbOmxleGVyXSkgXAorICAgICAgICAgICAgb3IgZXJyb3IhICJ1bmtvd24gbGV4ZXIgI3tvcHRzWzpsZXhlcl0uaW5zcGVjdH0iCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAbGV4ZXJfbmFtZSA9IG9wdHNbOmxleGVyXQorICAgICAgICAgIEBtaW1ldHlwZSA9IG9wdHNbOm1pbWV0eXBlXQorICAgICAgICBlbmQKKworICAgICAgICBAbGV4ZXJfb3B0cyA9IG9wdHNbOmxleGVyX29wdHNdCisKKyAgICAgICAgZm9ybWF0dGVyX2NsYXNzID0gRm9ybWF0dGVyLmZpbmQob3B0c1s6Zm9ybWF0dGVyXSkgXAorICAgICAgICAgIG9yIGVycm9yISAidW5rbm93biBmb3JtYXR0ZXIgI3tvcHRzWzpmb3JtYXR0ZXJdfSIKKworICAgICAgICBAZm9ybWF0dGVyID0gZm9ybWF0dGVyX2NsYXNzLm5ldyhvcHRzWzpmb3JtYXR0ZXJfb3B0c10pCisgICAgICBlbmQKKworICAgICAgZGVmIHJ1bgorICAgICAgICBmb3JtYXR0ZXIuZm9ybWF0KGxleGVyLmxleChpbnB1dCksICZtZXRob2QoOnByaW50KSkKKyAgICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgICAgZGVmIHNlbGYucGFyc2VfY2dpKHN0cikKKyAgICAgICAgcGFpcnMgPSBDR0kucGFyc2Uoc3RyKS5tYXAgeyB8aywgdnwgW2sudG9fc3ltLCB2LmZpcnN0XSB9CisgICAgICAgIEhhc2hbcGFpcnNdCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNsYXNzIFN0eWxlIDwgQ0xJCisgICAgICBkZWYgc2VsZi5kZXNjCisgICAgICAgICJwcmludCBDU1Mgc3R5bGVzIgorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmRvYworICAgICAgICByZXR1cm4gZW51bV9mb3IoOmRvYykgdW5sZXNzIGJsb2NrX2dpdmVuPworCisgICAgICAgIHlpZWxkICV8dXNhZ2U6IHJvdWdpZnkgc3R5bGUgWzx0aGVtZS1uYW1lPl0gWzxvcHRpb25zPl18CisgICAgICAgIHlpZWxkICV8fAorICAgICAgICB5aWVsZCAlfFByaW50IENTUyBzdHlsZXMgZm9yIHRoZSBnaXZlbiB0aGVtZS4gIEV4dHJhIG9wdGlvbnMgYXJlfAorICAgICAgICB5aWVsZCAlfHBhc3NlZCB0byB0aGUgdGhlbWUuICBUaGVtZSBkZWZhdWx0cyB0byB0aGFua2Z1bF9leWVzLnwKKyAgICAgICAgeWllbGQgJXx8CisgICAgICAgIHlpZWxkICV8b3B0aW9uczp8CisgICAgICAgIHlpZWxkICV8ICAtLXNjb3BlCShkZWZhdWx0OiAuaGlnaGxpZ2h0KSBhIGNzcyBzZWxlY3RvciB0byBzY29wZSBieXwKKyAgICAgICAgeWllbGQgJXx8CisgICAgICAgIHlpZWxkICV8YXZhaWxhYmxlIHRoZW1lczp8CisgICAgICAgIHlpZWxkICV8ICAje1RoZW1lLnJlZ2lzdHJ5LmtleXMuc29ydC5qb2luKCcsICcpfXwKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5wYXJzZShhcmd2KQorICAgICAgICBvcHRzID0geyA6dGhlbWVfbmFtZSA9PiAndGhhbmtmdWxfZXllcycgfQorCisgICAgICAgIHVudGlsIGFyZ3YuZW1wdHk/CisgICAgICAgICAgYXJnID0gYXJndi5zaGlmdAorICAgICAgICAgIGNhc2UgYXJnCisgICAgICAgICAgd2hlbiAvLS0oXHcrKS8KKyAgICAgICAgICAgIG9wdHNbJDEudHIoJy0nLCAnXycpLnRvX3N5bV0gPSBhcmd2LnNoaWZ0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgb3B0c1s6dGhlbWVfbmFtZV0gPSBhcmcKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgbmV3KG9wdHMpCisgICAgICBlbmQKKworICAgICAgZGVmIGluaXRpYWxpemUob3B0cykKKyAgICAgICAgdGhlbWVfbmFtZSA9IG9wdHMuZGVsZXRlKDp0aGVtZV9uYW1lKQorICAgICAgICB0aGVtZV9jbGFzcyA9IFRoZW1lLmZpbmQodGhlbWVfbmFtZSkgXAorICAgICAgICAgIG9yIGVycm9yISAidW5rbm93biB0aGVtZTogI3t0aGVtZV9uYW1lfSIKKworICAgICAgICBAdGhlbWUgPSB0aGVtZV9jbGFzcy5uZXcob3B0cykKKyAgICAgIGVuZAorCisgICAgICBkZWYgcnVuCisgICAgICAgIEB0aGVtZS5yZW5kZXIoJm1ldGhvZCg6cHV0cykpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNsYXNzIExpc3QgPCBDTEkKKyAgICAgIGRlZiBzZWxmLmRlc2MKKyAgICAgICAgImxpc3QgYXZhaWxhYmxlIGxleGVycyIKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5kb2MKKyAgICAgICAgcmV0dXJuIGVudW1fZm9yKDpkb2MpIHVubGVzcyBibG9ja19naXZlbj8KKworICAgICAgICB5aWVsZCAlfHVzYWdlOiByb3VnZSBsaXN0fAorICAgICAgICB5aWVsZCAlfHwKKyAgICAgICAgeWllbGQgJXxwcmludCBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBsZXhlcnMgd2l0aCB0aGVpciBkZXNjcmlwdGlvbnMufAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnBhcnNlKGFyZ3YpCisgICAgICAgIG5ldworICAgICAgZW5kCisKKyAgICAgIGRlZiBydW4KKyAgICAgICAgcHV0cyAiPT0gQXZhaWxhYmxlIExleGVycyA9PSIKKworICAgICAgICBMZXhlci5hbGwuc29ydF9ieSgmOnRhZykuZWFjaCBkbyB8bGV4ZXJ8CisgICAgICAgICAgZGVzYyA9ICIje2xleGVyLmRlc2N9IgorICAgICAgICAgIGlmIGxleGVyLmFsaWFzZXMuYW55PworICAgICAgICAgICAgZGVzYyA8PCAiIFthbGlhc2VzOiAje2xleGVyLmFsaWFzZXMuam9pbignLCcpfV0iCisgICAgICAgICAgZW5kCisgICAgICAgICAgcHV0cyAiJXM6ICVzIiAlIFtsZXhlci50YWcsIGRlc2NdCisgICAgICAgICAgcHV0cworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgIHByaXZhdGUKKyAgICBkZWYgc2VsZi5ub3JtYWxpemVfc3ludGF4KGFyZ3YpCisgICAgICBvdXQgPSBbXQorICAgICAgYXJndi5lYWNoIGRvIHxhcmd8CisgICAgICAgIGNhc2UgYXJnCisgICAgICAgIHdoZW4gL14oLS1cdyspPSguKikkLworICAgICAgICAgIG91dCA8PCAkMSA8PCAkMgorICAgICAgICB3aGVuIC9eKC1cdykoLispJC8KKyAgICAgICAgICBvdXQgPDwgJDEgPDwgJDIKKyAgICAgICAgZWxzZQorICAgICAgICAgIG91dCA8PCBhcmcKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgb3V0CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2FjdGlvbnNjcmlwdCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYWN0aW9uc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODFlMjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2FjdGlvbnNjcmlwdApAQCAtMCwwICsxLDQgQEAKK2Z1bmN0aW9uIGhlbGxvKG5hbWU6U3RyaW5nKTp2b2lkCit7CisJdHJhY2UoImhlbGxvICIgKyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYXBhY2hlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9hcGFjaGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzZTVmYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYXBhY2hlCkBAIC0wLDAgKzEsMjEgQEAKK0FkZERlZmF1bHRDaGFyc2V0IFVURi04CisKK1Jld3JpdGVFbmdpbmUgT24KKworIyBTZXJ2ZSBnemlwcGVkIHZlcnNpb24gaWYgYXZhaWxhYmxlIGFuZCBhY2NlcHRlZAorQWRkRW5jb2RpbmcgeC1nemlwIC5negorUmV3cml0ZUNvbmQgJXtIVFRQOkFjY2VwdC1FbmNvZGluZ30gZ3ppcAorUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfS5neiAtZgorUmV3cml0ZVJ1bGUgXiguKikkICQxLmd6IFtRU0EsTF0KKzxGaWxlc01hdGNoIFwuY3NzXC5neiQ+CisgIEZvcmNlVHlwZSB0ZXh0L2NzcworICBIZWFkZXIgYXBwZW5kIFZhcnkgQWNjZXB0LUVuY29kaW5nCis8L0ZpbGVzTWF0Y2g+Cis8RmlsZXNNYXRjaCBcLmpzXC5neiQ+CisgIEZvcmNlVHlwZSBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0CisgIEhlYWRlciBhcHBlbmQgVmFyeSBBY2NlcHQtRW5jb2RpbmcKKzwvRmlsZXNNYXRjaD4KKzxGaWxlc01hdGNoIFwuaHRtbFwuZ3okPgorICBGb3JjZVR5cGUgdGV4dC9odG1sCisgIEhlYWRlciBhcHBlbmQgVmFyeSBBY2NlcHQtRW5jb2RpbmcKKzwvRmlsZXNNYXRjaD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYXBpYmx1ZXByaW50IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9hcGlibHVlcHJpbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkYzU3NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYXBpYmx1ZXByaW50CkBAIC0wLDAgKzEsMzMgQEAKK0ZPUk1BVDogMUEKK0hPU1Q6IGh0dHA6Ly9wb2xscy5hcGlibHVlcHJpbnQub3JnLworCisjIFBvbGxzCisKK1BvbGxzIGlzIGEgc2ltcGxlIEFQSSBhbGxvd2luZyBjb25zdW1lcnMgdG8gdmlldyBwb2xscyBhbmQgdm90ZSBpbiB0aGVtLgorCisjIFBvbGxzIEFQSSBSb290IFsvXQorCisjIyBHcm91cCBRdWVzdGlvbgorCitSZXNvdXJjZXMgcmVsYXRlZCB0byBxdWVzdGlvbnMgaW4gdGhlIEFQSS4KKworIyMgUXVlc3Rpb24gWy9xdWVzdGlvbnMve3F1ZXN0aW9uX2lkfV0KKworKyBQYXJhbWV0ZXJzCisgICAgKyBxdWVzdGlvbl9pZDogMSAobnVtYmVyLCByZXF1aXJlZCkgLSBJRCBvZiB0aGUgUXVlc3Rpb24gaW4gZm9ybSBvZiBhbiBpbnRlZ2VyCisKKysgQXR0cmlidXRlcworICAgICsgcXVlc3Rpb246IGBGYXZvdXJpdGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2U/YCAocmVxdWlyZWQpCisgICAgKyBwdWJsaXNoZWRfYXQ6IGAyMDE0LTExLTExVDA4OjQwOjUxLjYyMFpgIC0gQW4gSVNPODYwMSBkYXRlIHdoZW4gdGhlIHF1ZXN0aW9uIHdhcyBwdWJsaXNoZWQKKyAgICArIGNob2ljZXMgKGFycmF5W0Nob2ljZV0sIHJlcXVpcmVkKSAtIEFuIGFycmF5IG9mIENob2ljZSBvYmplY3RzCisgICAgKyB1cmw6IC9xdWVzdGlvbnMvMQorCisjIyMgVmlldyBhIFF1ZXN0aW9ucyBEZXRhaWwgW0dFVF0KKworKyBSZXNwb25zZSAyMDAgKGFwcGxpY2F0aW9uL2pzb24pCisgICAgKyBBdHRyaWJ1dGVzIChRdWVzdGlvbikKKworIyMjIERlbGV0ZSBhIFF1ZXN0aW9uIFtERUxFVEVdCisKKysgUmVsYXRpb246IGRlbGV0ZQorKyBSZXNwb25zZSAyMDQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYXBwbGVzY3JpcHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2FwcGxlc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MjQ5MTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2FwcGxlc2NyaXB0CkBAIC0wLDAgKzEsMiBAQAorLS0gQXBwbGVTY3JpcHQgcGxheWluZyB3aXRoIGlUdW5lcwordGVsbCBhcHBsaWNhdGlvbiAiaVR1bmVzIiB0byBnZXQgY3VycmVudCBzZWxlY3Rpb24KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYmltbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYmltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQ1ZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9iaW1sCkBAIC0wLDAgKzEsMzggQEAKKzwjQCB0ZW1wbGF0ZSBsYW5ndWFnZT0iQyMiICM+Cis8I0AgaW1wb3J0IG5hbWVzcGFjZT0iU3lzdGVtLkRhdGEiICM+Cis8QmltbCB4bWxucz0iaHR0cDovL3NjaGVtYXMudmFyaWdlbmNlLmNvbS9iaW1sLnhzZCI+CisgICAgPENvbm5lY3Rpb25zPgorICAgICAgICA8IS0tIENyZWF0ZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBBZHZlbnR1cmUgV29ya3MgZGF0YWJhc2UgLS0+CisgICAgICAgIDxDb25uZWN0aW9uCisgICAgICAgICAgICBOYW1lPSJBZHZlbnR1cmVXb3JrcyIKKyAgICAgICAgICAgIENvbm5lY3Rpb25TdHJpbmc9IlByb3ZpZGVyPVNRTE5DTEkxMC4xO0RhdGEgU291cmNlPUxvY2FsaG9zdDtQZXJzaXN0IFNlY3VyaXR5IEluZm89RmFsc2U7SW50ZWdyYXRlZCBTZWN1cml0eT1TU1BJO0luaXRpYWwgQ2F0YWxvZz1BZHZlbnR1cmVXb3Jrc0RXIiAKKyAgICAgICAgICAgIC8+CisgICAgPC9Db25uZWN0aW9ucz4KKyAgICA8IS0tIFBhY2thZ2VzIENvbGxlY3Rpb24gLS0+CisgICAgPFBhY2thZ2VzPgorICAgICAgICA8IS0tIEEgUGFja2FnZSAtLT4KKyAgICAgICAgPFBhY2thZ2UKKyAgICAgICAgICAgIE5hbWU9Ik15Rmlyc3RQYWNrYWdlIgorICAgICAgICAgICAgQ29uc3RyYWludE1vZGU9IkxpbmVhciIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDwhLS0gQSBQYWNrYWdlJ3MgVGFza3MgLS0+CisgICAgICAgICAgICA8VGFza3M+CisgICAgICAgICAgICAgICAgPEV4ZWN1dGVTUUwgTmFtZT0iRXhlY3V0ZVN0b3JlZFByb2MiIENvbm5lY3Rpb25OYW1lPSJBZHZlbnR1cmVXb3JrcyI+CisgICAgICAgICAgICAgICAgICAgIDxEaXJlY3RJbnB1dD5FWEVDIHVzcF9TdG9yZWRQcm9jPC9EaXJlY3RJbnB1dD4KKyAgICAgICAgICAgICAgICA8L0V4ZWN1dGVTUUw+CisgICAgICAgICAgICAgICAgPCMgZm9yZWFjaCAodmFyIHRhYmxlIGluIFJvb3ROb2RlLlRhYmxlcykgeyAjPgorICAgICAgICAgICAgICAgICAgICA8RGF0YWZsb3cgTmFtZT0iRHVwbGljYXRlIDwjPXRhYmxlLk5hbWUjPiBEYXRhIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxUcmFuc2Zvcm1hdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPE9sZURiU291cmNlIE5hbWU9IlJldHJpZXZlIERhdGEiIENvbm5lY3Rpb25OYW1lPSJBZHZlbnR1cmVXb3JrcyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEaXJlY3RJbnB1dD5TRUxFQ1QgKiBGUk9NIDwjPXRhYmxlLk5hbWUjPjwvRGlyZWN0SW5wdXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9PbGVEYlNvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8T2xlRGJEZXN0aW5hdGlvbiBOYW1lPSJJbnNlcnQgRGF0YSIgQ29ubmVjdGlvbk5hbWU9IkFkdmVudHVyZVdvcmtzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEV4dGVybmFsVGFibGVPdXRwdXQgVGFibGU9IjwjPXRhYmxlLk5hbWUjPiIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L09sZURiRGVzdGluYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L1RyYW5zZm9ybWF0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPC9EYXRhZmxvdz4KKyAgICAgICAgICAgICAgICA8IyB9ICM+CisgICAgICAgICAgICA8L1Rhc2tzPgorICAgICAgICA8L1BhY2thZ2U+CisgICAgPC9QYWNrYWdlcz4KKzwvQmltbD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDc3MWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jCkBAIC0wLDAgKzEsOCBAQAorI2luY2x1ZGUgInJ1YnkvcnVieS5oIgorCitzdGF0aWMgaW50CitjbG9uZV9tZXRob2RfaShzdF9kYXRhX3Qga2V5LCBzdF9kYXRhX3QgdmFsdWUsIHN0X2RhdGFfdCBkYXRhKQoreworICAgIGNsb25lX21ldGhvZCgoVkFMVUUpZGF0YSwgKElEKWtleSwgKGNvbnN0IHJiX21ldGhvZF9lbnRyeV90ICopdmFsdWUpOworICAgIHJldHVybiBTVF9DT05USU5VRTsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvY2V5bG9uIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jZXlsb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmMTllMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvY2V5bG9uCkBAIC0wLDAgKzEsNyBAQAorc2hhcmVkIGNsYXNzIENleWxvbkNsYXNzPFBhcmFtZXRlcj4oKQorICAgIGdpdmVuIFBhcmFtZXRlciBzYXRpc2ZpZXMgT2JqZWN0IHsKKyAgICAKKyAgICBzaGFyZWQgU3RyaW5nIG5hbWUgPT4gIkNleWxvbkNsYXNzIjsKK30gCisKK3NoYXJlZCB2b2lkIHJ1bigpID0+IENleWxvbkNsYXNzKCk7CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2Nmc2NyaXB0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jZnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDA2NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jZnNjcmlwdApAQCAtMCwwICsxLDE4IEBACitjb21wb25lbnQgYWNjZXNzb3JzPSJ0cnVlIiB7CisKKyAgcHJvcGVydHkgdHlwZT0ic3RyaW5nIiBuYW1lPSJmaXJzdE5hbWUiIGRlZmF1bHQ9IiI7CisgIHByb3BlcnR5IHN0cmluZyB1c2VybmFtZTsKKworICBmdW5jdGlvbiBpbml0KCl7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgYW55IGZ1bmN0aW9uIHN1Ym1pdE9yZGVyKCByZXF1aXJlZCBwcm9kdWN0LCBjb3Vwb249IiIsIGJvb2xlYW4gcmVzdWx0cz10cnVlICl7CisKKyAgICB2YXIgZm9vID0gZnVuY3Rpb24oIHJlcXVpcmVkIHN0cmluZyBiYXosIHg9dHJ1ZSwgeT1mYWxzZSApeworICAgICAgcmV0dXJuICJiYXIhIjsKKyAgICB9OworCisgICAgcmV0dXJuIGZvbzsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvY2xvanVyZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvY2xvanVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWI2ODJlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jbG9qdXJlCkBAIC0wLDAgKzEsNSBAQAorKGRlZm4gbWFrZS1hZGRlciBbeF0KKyAgKGxldCBbeSB4XQorICAgIChmbiBbel0gKCsgeSB6KSkpKQorKGRlZiBhZGQyIChtYWtlLWFkZGVyIDIpKQorKGFkZDIgNCkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvY21ha2UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmNjNTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NtYWtlCkBAIC0wLDAgKzEsNyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4zKQorCitwcm9qZWN0KGZvbyBDKQorCisjIHNvbWUgbm90ZQorYWRkX2V4ZWN1dGFibGUoZm9vIHV0aWxzLmMgImZvby5jIikKK3RhcmdldF9saW5rX2xpYnJhcmllcyhmb28gJHtMSUJSQVJJRVN9KQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jb2ZmZWVzY3JpcHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NvZmZlZXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTYyZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jb2ZmZWVzY3JpcHQKQEAgLTAsMCArMSw1IEBACisjIE9iamVjdHM6CittYXRoID0KKyAgcm9vdDogICBNYXRoLnNxcnQKKyAgc3F1YXJlOiBzcXVhcmUKKyAgY3ViZTogICAoeCkgLT4geCAqIHNxdWFyZSB4CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NvbW1vbl9saXNwIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jb21tb25fbGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQyODYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jb21tb25fbGlzcApAQCAtMCwwICsxIEBACisoZGVmdW4gc3F1YXJlICh4KSAoKiB4IHgpKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jb25mIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODZkNGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NvbmYKQEAgLTAsMCArMSw0IEBACisjIEEgZ2VuZXJpYyBjb25maWd1cmF0aW9uIGZpbGUKK29wdGlvbjEgInZhbDEiCitvcHRpb24yIDIzCitvcHRpb24zICd2YWwzJwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jb3EgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NvcQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDg0NDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9jb3EKQEAgLTAsMCArMSwxMSBAQAorUmVxdWlyZSBJbXBvcnQgQ29xLkxpc3RzLkxpc3QuCisKK1NlY3Rpb24gd2l0aF9ULgorICBDb250ZXh0IHtUIDogVHlwZX0uCisKKyAgRml4cG9pbnQgbGVuZ3RoIChscyA6IGxpc3QgVCkgOiBuYXQgOj0KKyAgICBtYXRjaCBscyB3aXRoCisgICAgfCBuaWwgPT4gMAorICAgIHwgXyA6OiBscyA9PiBTIChsZW5ndGggbHMpCisgICAgZW5kLgorRW5kIHdpdGhfVC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NwcCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGNmMjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NwcApAQCAtMCwwICsxLDggQEAKKyNpbmNsdWRlPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgICAgY291dCA8PCAiSGVsbG8gV29ybGQiIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NzaGFycCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvY3NoYXJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTRhOGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NzaGFycApAQCAtMCwwICsxLDUgQEAKKy8vIHJldmVyc2UgYnl0ZSBvcmRlciAoMTYtYml0KQorcHVibGljIHN0YXRpYyBVSW50MTYgUmV2ZXJzZUJ5dGVzKFVJbnQxNiB2YWx1ZSkKK3sKKyAgcmV0dXJuIChVSW50MTYpKCh2YWx1ZSAmIDB4RkZVKSA8PCA4IHwgKHZhbHVlICYgMHhGRjAwVSkgPj4gOCk7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMWZlNzQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2NzcwpAQCAtMCwwICsxLDQgQEAKK2JvZHkgeworICAgIGZvbnQtc2l6ZTogMTJwdDsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmIHVybCh0ZW1wLnBuZykgdG9wIGxlZnQgbm8tcmVwZWF0OworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDQ5NDUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2QKQEAgLTAsMCArMSwxNiBAQAoraW1wb3J0IHN0ZC5hbGdvcml0aG0sIHN0ZC5jb252LCBzdGQuZnVuY3Rpb25hbCwKKyAgICBzdGQubWF0aCwgc3RkLnJlZ2V4LCBzdGQuc3RkaW87CisKK2FsaWFzIHJvdW5kID0gcGlwZSEodG8hcmVhbCwgc3RkLm1hdGgucm91bmQsIHRvIXN0cmluZyk7CitzdGF0aWMgcmVGbG9hdGluZ1BvaW50ID0gY3RSZWdleCFgWzAtOV0rXC5bMC05XStgOworCit2b2lkIG1haW4oKQoreworICAgIC8vIFJlcGxhY2UgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgcmVhbAorICAgIC8vIG51bWJlciB3aXRoIHRoZSByb3VuZGVkIGVxdWl2YWxlbnQuCisgICAgc3RkaW4KKyAgICAgICAgLmJ5TGluZQorICAgICAgICAubWFwIShsID0+IGwucmVwbGFjZUFsbCEoYyA9PiBjLmhpdC5yb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlRmxvYXRpbmdQb2ludCkpCisgICAgICAgIC5lYWNoIXdyaXRlbG47Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2RhcnQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2RhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MGRhNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvZGFydApAQCAtMCwwICsxLDYgQEAKK3ZvaWQgbWFpbigpIHsKKyAgdmFyIGNvbGxlY3Rpb249WzEsMiwzLDQsNV07CisgIGZvcih2YXIgYSBpbiBjb2xsZWN0aW9uKXsKKyAgICBwcmludChhKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9kaWZmIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNGYzMTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2RpZmYKQEAgLTAsMCArMSw3IEBACistLS0gZmlsZTEJMjAxMi0xMC0xNiAxNTowNzo1OC4wODY4ODY4NzQgKzAxMDAKKysrKyBmaWxlMgkyMDEyLTEwLTE2IDE1OjA4OjA3LjY0Mjg4NzIzNiArMDEwMAorQEAgLTEsMyArMSwzIEBACisgYSBiIGMKKy1kIGUgZgorK0QgRSBGCisgZyBoIGkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvZWlmZmVsIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9laWZmZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwMjVjYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvZWlmZmVsCkBAIC0wLDAgKzEsMzAgQEAKK25vdGUKKyAgZGVzY3JpcHRpb246ICJSZXByZXNlbnRzIGEgcGVyc29uLiIKKworY2xhc3MKKyAgUEVSU09OCisKK2NyZWF0ZQorICBtYWtlLCBtYWtlX3Vua25vd24KKworZmVhdHVyZSB7Tk9ORX0gLS0gQ3JlYXRpb24KKworICBtYWtlIChhX25hbWU6IGxpa2UgbmFtZSkKKyAgICAgIC0tIENyZWF0ZSBhIHBlcnNvbiB3aXRoIGBhX25hbWUnIGFzIGBuYW1lJy4KKyAgICBkbworICAgICAgbmFtZSA6PSBhX25hbWUKKyAgICBlbnN1cmUKKyAgICAgIG5hbWUgPSBhX25hbWUKKyAgICBlbmQKKworICBtYWtlX3Vua25vd24KKyAgICBkbyBlbnN1cmUKKyAgICAgIG5hbWUgPSBWb2lkCisgICAgZW5kCisKK2ZlYXR1cmUgLS0gQWNjZXNzCisKKyAgbmFtZTogZGV0YWNoYWJsZSBTVFJJTkcKKyAgICAgIC0tIEZ1bGwgbmFtZSBvciBWb2lkIGlmIHVua25vd24uCisKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9lbGl4aXIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2VsaXhpcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODFkNjQxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9lbGl4aXIKQEAgLTAsMCArMSBAQAorRW51bS5tYXAoWzEsMiwzXSwgZm4oeCkgLT4geCAqIDIgZW5kKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9lcmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2VyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjkyMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9lcmIKQEAgLTAsMCArMSBAQAorPHRpdGxlPjwlPSBAdGl0bGUgJT48L3RpdGxlPgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9lcmxhbmcgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2VybGFuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQyYjYwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9lcmxhbmcKQEAgLTAsMCArMSw3IEBACislJSUgR2VvbWV0cnkgbW9kdWxlLgorLW1vZHVsZShnZW9tZXRyeSkuCistZXhwb3J0KFthcmVhLzFdKS4KKworJSUgQ29tcHV0ZSByZWN0YW5nbGUgYW5kIGNpcmNsZSBhcmVhLgorYXJlYSh7cmVjdGFuZ2xlLCBXaWR0aCwgSHR9KSAtPiBXaWR0aCAqIEh0OworYXJlYSh7Y2lyY2xlLCBSfSkgICAgICAgICAgICAtPiAzLjE0MTU5ICogUiAqIFIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9mYWN0b3IgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2ZhY3RvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTM4ZGZmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9mYWN0b3IKQEAgLTAsMCArMSw1IEBACitVU0lORzogaW8ga2VybmVsIHNlcXVlbmNlcyA7CisKKzQgaW90YSBbCisgICAgIkhhcHB5IEJpcnRoZGF5ICIgd3JpdGUgMiA9ICJkZWFyIE5BTUUiICJ0byBZb3UiID8gcHJpbnQKK10gZWFjaApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9mb3J0cmFuIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9mb3J0cmFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzUyYzUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2ZvcnRyYW4KQEAgLTAsMCArMSwyMiBAQAorcHJvZ3JhbSBib3R0bGVzCisKKyAgICBpbXBsaWNpdCBub25lCisgICAgaW50ZWdlciA6OiBuYm90dGxlcworCisgICAgZG8gbmJvdHRsZXMgPSA5OSwgMSwgLTEKKyAgICAgICAgY2FsbCBwcmludF9ib3R0bGVzKG5ib3R0bGVzKQorICAgIGVuZCBkbworCitjb250YWlucworCisgICAgc3Vicm91dGluZSBwcmludF9ib3R0bGVzKG4pCisgICAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgICAgaW50ZWdlciwgaW50ZW50KGluKSA6OiBuCisKKyAgICAgICAgd3JpdGUoKiwgIihJMCwgMVgsICdib3R0bGVzIG9mIGJlZXIgb24gdGhlIHdhbGwsJykiKSBuCisgICAgICAgIHdyaXRlKCosICIoSTAsIDFYLCAnYm90dGxlcyBvZiBiZWVyLicpIikgbgorICAgICAgICB3cml0ZSgqLCAiKCdUYWtlIG9uZSBkb3duLCBwYXNzIGl0IGFyb3VuZCwnKSIpCisgICAgICAgIHdyaXRlKCosICIoSTAsIDFYLCAnYm90dGxlcyBvZiBiZWVyIG9uIHRoZSB3YWxsLicsIC8pIikgbiAtIDEKKyAgICBlbmQgc3Vicm91dGluZSBwcmludF9ib3R0bGVzCisKK2VuZCBwcm9ncmFtIGJvdHRsZXMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvZ2hlcmtpbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvZ2hlcmtpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGIxMzljCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9naGVya2luCkBAIC0wLDAgKzEsMTcgQEAKKyMgbGFuZ3VhZ2U6IGVuCitGZWF0dXJlOiBBZGRpdGlvbgorICBJbiBvcmRlciB0byBhdm9pZCBzaWxseSBtaXN0YWtlcworICBBcyBhIG1hdGggaWRpb3QKKyAgSSB3YW50IHRvIGJlIHRvbGQgdGhlIHN1bSBvZiB0d28gbnVtYmVycworCisgIFNjZW5hcmlvIE91dGxpbmU6IEFkZCB0d28gbnVtYmVycworICAgIEdpdmVuIEkgaGF2ZSBlbnRlcmVkIDxpbnB1dF8xPiBpbnRvIHRoZSBjYWxjdWxhdG9yCisgICAgQW5kIEkgaGF2ZSBlbnRlcmVkIDxpbnB1dF8yPiBpbnRvIHRoZSBjYWxjdWxhdG9yCisgICAgV2hlbiBJIHByZXNzIDxidXR0b24+CisgICAgVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZSA8b3V0cHV0PiBvbiB0aGUgc2NyZWVuCisKKyAgRXhhbXBsZXM6CisgICAgfCBpbnB1dF8xIHwgaW5wdXRfMiB8IGJ1dHRvbiB8IG91dHB1dCB8CisgICAgfCAyMCAgICAgIHwgMzAgICAgICB8IGFkZCAgICB8IDUwICAgICB8CisgICAgfCAyICAgICAgIHwgNSAgICAgICB8IGFkZCAgICB8IDcgICAgICB8CisgICAgfCAwICAgICAgIHwgNDAgICAgICB8IGFkZCAgICB8IDQwICAgICB8CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2dsc2wgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2dsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMjg0ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvZ2xzbApAQCAtMCwwICsxLDE0IEBACisjdmVyc2lvbiAzMzAgY29yZQorCit1bmlmb3JtIG1hdDQgd29ybGRNYXRyaXg7CisKK2xheW91dChsb2NhdGlvbiA9IDApIGluIHZlYzIgcG9zaXRpb247CitsYXlvdXQobG9jYXRpb24gPSAxKSBpbiB2ZWM0IGNvbG9yOworCitvdXQgdmVjNCB2ZXJ0ZXhDb2xvcjsKKwordm9pZCBtYWluKCkKK3sKKyAgICB2ZXJ0ZXhDb2xvciA9IGNvbG9yOworICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvZ28gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2dvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OGRkZmYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2dvCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBtYWluCisKK2ltcG9ydCAiZm10IgorCitmdW5jIG1haW4oKSB7CisJZm10LlByaW50bG4oIkhlbGxvLCDkuJbnlYwiKQorfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9ncmFkbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2dyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE5MWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9ncmFkbGUKQEAgLTAsMCArMSwxMCBAQAorYXBwbHkgcGx1Z2luOiAnamF2YScKKworcmVwb3NpdG9yaWVzIHsKKyAgamNlbnRlcigpCit9CisKK2RlcGVuZGVuY2llcyB7CisgIGNvbXBpbGUgJ29yZy5vcGVuamRrLmptaDpqbWgtY29yZToxLjEyJworICBjb21waWxlICdvcmcub3Blbmpkay5qbWg6am1oLWdlbmVyYXRvci1hbm5wcm9jZXNzOjEuMTInCit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2dyb292eSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTczMTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2dyb292eQpAQCAtMCwwICsxLDkgQEAKK2NsYXNzIEdyZWV0IHsKKyAgZGVmIG5hbWUKKyAgR3JlZXQod2hvKSB7IG5hbWUgPSB3aG9bMF0udG9VcHBlckNhc2UoKSArCisgICAgICAgICAgICAgICAgICAgICAgd2hvWzEuLi0xXSB9CisgIGRlZiBzYWx1dGUoKSB7IHByaW50bG4gIkhlbGxvICRuYW1lISIgfQorfQorCitnID0gbmV3IEdyZWV0KCd3b3JsZCcpICAvLyBjcmVhdGUgb2JqZWN0CitnLnNhbHV0ZSgpICAgICAgICAgICAgICAgLy8gb3V0cHV0ICJIZWxsbyBXb3JsZCEiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2hhbWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2hhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjYjY4NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvaGFtbApAQCAtMCwwICsxLDUgQEAKKyVzZWN0aW9uLmNvbnRhaW5lcgorICAlaDE9IHBvc3QudGl0bGUKKyAgJWgyPSBwb3N0LnN1YnRpdGxlCisgIC5jb250ZW50CisgICAgPSBwb3N0LmNvbnRlbnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvaGFuZGxlYmFycyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvaGFuZGxlYmFycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM0YTdlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9oYW5kbGViYXJzCkBAIC0wLDAgKzEsNyBAQAorPGRpdiBjbGFzcz0iZW50cnkiPgorICA8aDE+e3t0aXRsZX19PC9oMT4KKyAge3sjd2l0aCBzdG9yeX19CisgICAgPGRpdiBjbGFzcz0iaW50cm8iPnt7e2ludHJvfX19PC9kaXY+CisgICAgPGRpdiBjbGFzcz0iYm9keSI+e3t7Ym9keX19fTwvZGl2PgorICB7ey93aXRofX0KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9oYXNrZWxsIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9oYXNrZWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NzIxNTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2hhc2tlbGwKQEAgLTAsMCArMSw2IEBACitxdWlja3NvcnQgOjogT3JkIGEgPT4gW2FdIC0+IFthXQorcXVpY2tzb3J0IFtdICAgICA9IFtdCitxdWlja3NvcnQgKHA6eHMpID0gKHF1aWNrc29ydCBsZXNzZXIpICsrIFtwXSArKyAocXVpY2tzb3J0IGdyZWF0ZXIpCisgICAgd2hlcmUKKyAgICAgICAgbGVzc2VyICA9IGZpbHRlciAoPCBwKSB4cworICAgICAgICBncmVhdGVyID0gZmlsdGVyICg+PSBwKSB4cwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9odG1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjlhMzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2h0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+PHRpdGxlPlRpdGxlITwvdGl0bGU+PC9oZWFkPgorICA8Ym9keT4KKyAgICA8cCBpZD0iZm9vIj5IZWxsbywgV29ybGQhPC9wPgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij52YXIgYSA9IDE7PC9zY3JpcHQ+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4jZm9vIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH08L3N0eWxlPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2h0dHAgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2h0dHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiYzc1MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvaHR0cApAQCAtMCwwICsxLDE0IEBACitQT1NUIC9kZW1vL3N1Ym1pdC8gSFRUUC8xLjEKK0hvc3Q6IHJvdWdlLmpuZWVuLm5ldAorQ2FjaGUtQ29udHJvbDogbWF4LWFnZT0wCitPcmlnaW46IGh0dHA6Ly9yb3VnZS5qYXlmZXJkLnVzCitVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF83XzIpCisgICAgQXBwbGVXZWJLaXQvNTM1LjcgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTYuMC45MTIuNjMgU2FmYXJpLzUzNS43CitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24KK0FjY2VwdDogdGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksKi8qO3E9MC44CitSZWZlcmVyOiBodHRwOi8vcHlnbWVudHMub3JnLworQWNjZXB0LUVuY29kaW5nOiBnemlwLGRlZmxhdGUsc2RjaAorQWNjZXB0LUxhbmd1YWdlOiBlbi1VUyxlbjtxPTAuOAorQWNjZXB0LUNoYXJzZXQ6IHdpbmRvd3MtOTQ5LHV0Zi04O3E9MC43LCo7cT0wLjMKKworeyJuYW1lIjoidGVzdCIsImxhbmciOiJ0ZXh0IiwiYm9yaW5nIjp0cnVlfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9pbmkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2luaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjAwYzkxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9pbmkKQEAgLTAsMCArMSw0IEBACis7IGxhc3QgbW9kaWZpZWQgMSBBcHJpbCAyMDAxIGJ5IEpvaG4gRG9lCitbb3duZXJdCituYW1lPUpvaG4gRG9lCitvcmdhbml6YXRpb249QWNtZSBXaWRnZXRzIEluYy4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvaW8gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2lvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjBhMjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2lvCkBAIC0wLDAgKzEsMTEgQEAKK2JvdHRsZSA6PSBtZXRob2QoaSwKKyAgaWYoaT09MCwgcmV0dXJuICJubyBtb3JlIGJvdHRsZXMgb2YgYmVlciIpCisgIGlmKGk9PTEsIHJldHVybiAiMSBib3R0bGUgb2YgYmVlciIpCisgIHJldHVybiBpIGFzU3RyaW5nIC4uICIgYm90dGxlcyBvZiBiZWVyIgorKQorCitmb3IoaSwgOTksIDEsIC0xLAorICB3cml0ZShib3R0bGUoaSksICIgb24gdGhlIHdhbGwsICIsIGJvdHRsZShpKSwgIixcbiIpCisgIHdyaXRlKCJ0YWtlIG9uZSBkb3duLCBwYXNzIGl0IGFyb3VuZCxcbiIpCisgIHdyaXRlKGJvdHRsZShpIC0gMSksICIgb24gdGhlIHdhbGwuXG5cbiIpCispCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2phdmEgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2phdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjYTYxZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvamF2YQpAQCAtMCwwICsxLDUgQEAKK3B1YmxpYyBjbGFzcyBqYXZhIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gV29ybGQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2phdmFzY3JpcHQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2phdmFzY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0YTcwZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvamF2YXNjcmlwdApAQCAtMCwwICsxIEBACiskKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsgYWxlcnQoJ3JlYWR5IScpOyB9KTsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvamluamEgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2ppbmphCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGNmNzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2ppbmphCkBAIC0wLDAgKzEsOSBAQAoreyUgZXh0ZW5kcyAibGF5b3V0Lmh0bWwiICV9CisKK3slIGJsb2NrIGJvZHkgJX0KKyAgPHVsPgorICB7JSBmb3IgdXNlciBpbiB1c2VycyAlfQorICAgIDxsaT48YSBocmVmPSJ7eyB1c2VyLnVybCB9fSI+e3sgdXNlci51c2VybmFtZSB9fTwvYT48L2xpPgorICB7JSBlbmRmb3IgJX0KKyAgPC91bD4KK3slIGVuZGJsb2NrICV9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2pzb24gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2pzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhZDk2NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvanNvbgpAQCAtMCwwICsxIEBACit7ICJvbmUiOiAxLCAidHdvIjogMiwgIm51bGwiOiBudWxsLCAic2ltcGxlIjogdHJ1ZSB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2pzb24tZG9jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9qc29uLWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE1N2ZlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9qc29uLWRvYwpAQCAtMCwwICsxIEBACit7ICJvbmUiOiAxLCAidHdvIjogMiwgIm51bGwiOiBudWxsLCAic2ltcGxlIjogdHJ1ZSB9IC8vIGEgc2ltcGxlIGpzb24gb2JqZWN0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2pzb25uZXQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2pzb25uZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwNDQxZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvanNvbm5ldApAQCAtMCwwICsxLDI4IEBACisvLyBDb21waWxlciB0ZW1wbGF0ZQorbG9jYWwgQ0NvbXBpbGVyID0geworICBjRmxhZ3M6IFtdLAorICBvdXQ6ICJhLm91dCIsCisgIGxvY2FsIGZsYWdzX3N0ciA9IHN0ZC5qb2luKCIgIiwgc2VsZi5jRmxhZ3MpLAorICBsb2NhbCBmaWxlc19zdHIgPSBzdGQuam9pbigiICIsIHNlbGYuZmlsZXMpLAorICBjbWQ6ICIlcyAlcyAlcyAtbyAlcyIgJSBbc2VsZi5jb21waWxlciwgZmxhZ3Nfc3RyLCBmaWxlc19zdHIsIHNlbGYub3V0XSwKK307CisKKy8vIEdDQyBzcGVjaWFsaXphdGlvbgorbG9jYWwgR2NjID0gQ0NvbXBpbGVyIHsgY29tcGlsZXI6ICJnY2MiIH07CisKKy8vIEFub3RoZXIgc3BlY2lhbGl6YXRpb24KK2xvY2FsIENsYW5nID0gQ0NvbXBpbGVyIHsgY29tcGlsZXI6ICJjbGFuZyIgfTsKKworLy8gTWl4aW5zIC0gYXBwZW5kIGZsYWdzCitsb2NhbCBPcHQgPSB7IGNGbGFnczogc3VwZXIuY0ZsYWdzICsgWyItTzMiLCAiLUROREVCVUciXSB9OworbG9jYWwgRGJnID0geyBjRmxhZ3M6IHN1cGVyLmNGbGFncyArIFsiLWciXSB9OworCisvLyBPdXRwdXQ6Cit7CisgIHRhcmdldHM6IFsKKyAgICBHY2MgeyBmaWxlczogWyJhLmMiLCAiYi5jIl0gfSwKKyAgICBDbGFuZyB7IGZpbGVzOiBbInRlc3QuYyJdLCBvdXQ6ICJ0ZXN0IiB9LAorICAgIENsYW5nICsgT3B0IHsgZmlsZXM6IFsidGVzdDIuYyJdLCBvdXQ6ICJ0ZXN0MiIgfSwKKyAgICBHY2MgKyBPcHQgKyBEYmcgeyBmaWxlczogWyJmb28uYyIsICJiYXIuYyJdLCBvdXQ6ICJiYXoiIH0sCisgIF0KK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvanVsaWEgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2p1bGlhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGU5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2p1bGlhCkBAIC0wLDAgKzEsMTEgQEAKK2Z1bmN0aW9uIG1hbmRlbCh6KQorICAgIGMgPSB6CisgICAgbWF4aXRlciA9IDgwCisgICAgZm9yIG4gPSAxOm1heGl0ZXIKKyAgICAgICAgaWYgYWJzKHopID4gMgorICAgICAgICAgICAgcmV0dXJuIG4tMQorICAgICAgICBlbmQKKyAgICAgICAgeiA9IHpeMiArIGMKKyAgICBlbmQKKyAgICByZXR1cm4gbWF4aXRlcgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2tvdGxpbiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mva290bGluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyN2IwZGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2tvdGxpbgpAQCAtMCwwICsxLDMgQEAKK2Z1biBtYWluKGFyZ3M6IEFycmF5PFN0cmluZz4pIHsKKyAgICBwcmludGxuKCJIZWxsbywgd29ybGQhIikKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbGlxdWlkIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9saXF1aWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1NzAyMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbGlxdWlkCkBAIC0wLDAgKzEsMTEgQEAKKzx1bCBpZD0icHJvZHVjdHMiPgorICB7JSBmb3IgcHJvZHVjdCBpbiBwcm9kdWN0cyAlfQorICAgIDxsaT4KKyAgICAgIDxoMj57eyBwcm9kdWN0LnRpdGxlIH19PC9oMj4KKyAgICAgIE9ubHkge3sgcHJvZHVjdC5wcmljZSB8IGZvcm1hdF9hc19tb25leSB9fQorCisgICAgICA8cD57eyBwcm9kdWN0LmRlc2NyaXB0aW9uIHwgcHJldHR5cHJpbnQgfCB0cnVuY2F0ZTogMjAwICB9fTwvcD4KKworICAgIDwvbGk+CisgIHslIGVuZGZvciAlfQorPC91bD4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbGl0ZXJhdGVfY29mZmVlc2NyaXB0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9saXRlcmF0ZV9jb2ZmZWVzY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1ZjI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbGl0ZXJhdGVfY29mZmVlc2NyaXB0CkBAIC0wLDAgKzEsMyBAQAorSW1wb3J0IHRoZSBoZWxwZXJzIHdlIHBsYW4gdG8gdXNlLgorCisgICAge2V4dGVuZCwgbGFzdH0gPSByZXF1aXJlICcuL2hlbHBlcnMnCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2xpdGVyYXRlX2hhc2tlbGwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2xpdGVyYXRlX2hhc2tlbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlNzUzNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbGl0ZXJhdGVfaGFza2VsbApAQCAtMCwwICsxLDcgQEAKK0luIEJpcmQtc3R5bGUgeW91IGhhdmUgdG8gbGVhdmUgYSBibGFuayBiZWZvcmUgdGhlIGNvZGUuCisKKz4gZmFjdCA6OiBJbnRlZ2VyIC0+IEludGVnZXIKKz4gZmFjdCAwID0gMQorPiBmYWN0IG4gPSBuICogZmFjdCAobi0xKQorCitBbmQgeW91IGhhdmUgdG8gbGVhdmUgYSBibGFuayBsaW5lIGFmdGVyIHRoZSBjb2RlIGFzIHdlbGwuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2xsdm0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL2xsdm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1OTZhOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbGx2bQpAQCAtMCwwICsxLDIwIEBACis7IGNvcGllZCBmcm9tIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xhbmdSZWYuaHRtbCNtb2R1bGUtc3RydWN0dXJlCis7IERlY2xhcmUgdGhlIHN0cmluZyBjb25zdGFudCBhcyBhIGdsb2JhbCBjb25zdGFudC4KK0Auc3RyID0gcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzEzIHggaThdIGMiaGVsbG8gd29ybGRcMEFcMDAiCisKKzsgRXh0ZXJuYWwgZGVjbGFyYXRpb24gb2YgdGhlIHB1dHMgZnVuY3Rpb24KK2RlY2xhcmUgaTMyIEBwdXRzKGk4KiBub2NhcHR1cmUpIG5vdW53aW5kCisKKzsgRGVmaW5pdGlvbiBvZiBtYWluIGZ1bmN0aW9uCitkZWZpbmUgaTMyIEBtYWluKCkgeyAgIDsgaTMyKCkqCisgIDsgQ29udmVydCBbMTMgeCBpOF0qIHRvIGk4ICAqLi4uCisgICVjYXN0MjEwID0gZ2V0ZWxlbWVudHB0ciBbMTMgeCBpOF0qIEAuc3RyLCBpNjQgMCwgaTY0IDAKKworICA7IENhbGwgcHV0cyBmdW5jdGlvbiB0byB3cml0ZSBvdXQgdGhlIHN0cmluZyB0byBzdGRvdXQuCisgIGNhbGwgaTMyIEBwdXRzKGk4KiAlY2FzdDIxMCkKKyAgcmV0IGkzMiAwCit9CisKKzsgTmFtZWQgbWV0YWRhdGEKKyExID0gbWV0YWRhdGEgIXtpMzIgNDJ9CishZm9vID0gIXshMSwgbnVsbH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbHVhIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiZWJhZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbHVhCkBAIC0wLDAgKzEsMTIgQEAKKy0tIGRlZmluZXMgYSBmYWN0b3JpYWwgZnVuY3Rpb24KK2Z1bmN0aW9uIGZhY3QgKG4pCisgIGlmIG4gPT0gMCB0aGVuCisgICAgcmV0dXJuIDEKKyAgZWxzZQorICAgIHJldHVybiBuICogZmFjdChuLTEpCisgIGVuZAorZW5kCisgICAgCitwcmludCgiZW50ZXIgYSBudW1iZXI6IikKK2EgPSBpby5yZWFkKCIqbnVtYmVyIikgICAgICAgIC0tIHJlYWQgYSBudW1iZXIKK3ByaW50KGZhY3QoYSkpCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL21ha2UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhYzcxNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbWFrZQpAQCAtMCwwICsxLDYgQEAKKy5QSE9OWTogYWxsCithbGw6ICQoT0JKKQorCiskKE9CSik6ICQoU09VUkNFKQorCUBlY2hvICJjb21waWxpbmcuLi4iCisJJChHQ0MpICQoQ0ZMQUdTKSAkPCA+ICRACmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL21hcmtkb3duIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9tYXJrZG93bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTM2MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9tYXJrZG93bgpAQCAtMCwwICsxLDQgQEAKK01hcmtkb3duIGhhcyBjb29sIFtyZWZlcmVuY2UgbGlua3NdW3JlZiAxXQorYW5kIFtyZWd1bGFyIGxpbmtzIHRvb10oaHR0cDovL2V4YW1wbGUuY29tKQorCitbcmVmIDFdOiBodHRwOi8vZXhhbXBsZS5jb20KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbWF0bGFiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9tYXRsYWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3N2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbWF0bGFiCkBAIC0wLDAgKzEsNiBAQAorQSA9IGNhdCggMywgWzEgMiAzOyA5IDggNzsgNCA2IDVdLCBbMCAzIDI7IDggOCA0OyA1IDMgNV0sIC4uLgorICAgICAgICAgICAgICAgICBbNiA0IDc7IDYgOCA1OyA1IDQgM10pOworJSBUaGUgRUlHIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gZWFjaCBvZiB0aGUgaG9yaXpvbnRhbCAnc2xpY2VzJyBvZiBBLgorZm9yIGkgPSAxOjMKKyAgICBlaWcoc3F1ZWV6ZShBKGksOiw6KSkpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbW9vbnNjcmlwdCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbW9vbnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg1MTFkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9tb29uc2NyaXB0CkBAIC0wLDAgKzEsMTYgQEAKK3V0aWwgPSByZXF1aXJlICJteS5tb2R1bGUiCisKK2FfdGFibGUgPSB7CisgIGZvbzogJ2JhcicKKyAgaW50ZXJwb2xhdGVkOiAiZm9vLSN7b3RoZXIuc3R1ZmYgMiArIDN9IgorICAic3RyaW5nIjogMgorICBkbzogJ2tleXdvcmQnCit9CisKK2NsYXNzIE15Q2xhc3MgZXh0ZW5kcyBTb21lQ2xhc3MKKyAgbmV3OiAoQGluaXQsIGFyZzIgPSAnZGVmYXVsdCcpID0+CisgICAgQGRlcml2ZWQgPSBAaW5pdCArIDIKKyAgICBzdXBlciEKKworICBvdGhlcjogPT4KKyAgICBAZm9vICsgMgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9uYXNtIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjIwZTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL25hc20KQEAgLTAsMCArMSwyNiBAQAorJW1hY3JvIElSUSAyCisgICAgZ2xvYmFsIGlycSUxCisgICAgaXJxJTE6CisgICAgICAgIGNsaQorICAgICAgICBwdXNoIGJ5dGUgMCAgICAgOyBwdXNoIGEgZHVtbXkgZXJyb3IgY29kZQorICAgICAgICBwdXNoIGJ5dGUgJTIgICAgOyBwdXNoIHRoZSBJUlEgbnVtYmVyCisgICAgICAgIGptcCAgaXJxX2NvbW1vbl9zdHViCislZW5kbWFjcm8KKworZXh0ZXJuIGlycV9oYW5kbGVyCisKK2lycV9jb21tb25fc3R1YjoKKyAgICBwdXNoYSAgICAgICAgICAgOyBQdXNoZXMgZWRpLGVzaSxlYnAsZXNwLGVieCxlZHgsZWN4LGVheAorICAgIG1vdiBheCwgZHMgICAgICA7IExvd2VyIDE2LWJpdHMgb2YgZWF4ID0gZHMuCisgICAgcHVzaCBlYXggICAgICAgIDsgc2F2ZSB0aGUgZGF0YSBzZWdtZW50IGRlc2NyaXB0b3IKKyAgICBtb3YgYXgsIDB4MTAgICAgOyBsb2FkIHRoZSBrZXJuZWwgZGF0YSBzZWdtZW50IGRlc2NyaXB0b3IKKyAgICBtb3YgZWR4LCBlYXgKKyAgICBjYWxsIGlycV9oYW5kbGVyCisKKyVhc3NpZ24gaSAwCislcmVwIDgKK0lTUl9OT0VSUkNPREUgaQorJWFzc2lnbiBpIGkrMQorJWVuZHJlcAorCitJU1JfTk9FUlJDT0RFIDkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvbmdpbnggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL25naW54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyODg3NzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL25naW54CkBAIC0wLDAgKzEsNSBAQAorc2VydmVyIHsKKyAgbGlzdGVuICAgICAgICAgIDgwOworICBzZXJ2ZXJfbmFtZSAgICAgZXhhbXBsZS5jb20gKi5leGFtcGxlLmNvbTsKKyAgcmV3cml0ZSBeICAgICAgIGh0dHA6Ly93d3cuZG9tYWluLmNvbSRyZXF1ZXN0X3VyaT8gcGVybWFuZW50OworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9uaW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL25pbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ5OGNkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9uaW0KQEAgLTAsMCArMSwyNyBAQAoraW1wb3J0IG1hdGgsc3RydXRpbHMKKworcHJvYyBmaXhlZFdpZHRoKGlucHV0OiBzdHJpbmcsIG1pbkZpZWxkU2l6ZTogaW50KTpzdHJpbmcgey5pbmxpbmUufSA9CisgICMgTm90ZSB0aGF0IGZpZWxkIHNpemUgaXMgYSBtaW5pbXVtLSB3aWxsIGV4cGFuZCBmaWVsZCBpZiBpbnB1dAorICAjIHN0cmluZyBpcyBsYXJnZXIKKyAgaWYgaW5wdXQuc3RhcnRzV2l0aCgiLSIpOgorICAgIHJldHVybihpbnB1dCAmIHJlcGVhdGNoYXIoY291bnQ9KGFicyhtaW5GaWVsZFNpemUtbGVuKGlucHV0KSkpLGM9JyAnKSkKKyAgZWxzZToKKyAgICByZXR1cm4oIiAiICYgaW5wdXQgJiByZXBlYXRjaGFyKGNvdW50PShhYnMobWluRmllbGRTaXplLWxlbihpbnB1dCkpLTEpLGM9JyAnKSkKKwordGVtcGxhdGUgbWF0aE9uSW50ZXJ2YWwobG93Ym91bmQsaGlnaGJvdW5kOmZsb2F0LGNvdW50czogaW50LHA6cHJvYykgPQorICBibG9jazoKKyAgICB2YXIgc3RlcDogICAgZmxvYXQgPSAoaGlnaGJvdW5kIC0gbG93Ym91bmQpLyhtYXgoY291bnRzLDEpKQorICAgIHZhciBjdXJyZW50OiBmbG9hdCA9IGxvd2JvdW5kCisgICAgd2hpbGUgY3VycmVudCA8IGhpZ2hib3VuZDoKKyAgICAgIGVjaG8oJGZpeGVkV2lkdGgoJGN1cnJlbnQsMjUpICYgIjogIiAmICRmaXhlZFdpZHRoKCRwKGN1cnJlbnQpLDI1KSkKKyAgICAgIGN1cnJlbnQgKz0gc3RlcAorCitlY2hvICJTaW5lIG9mIHRoZXRhIGZyb20gMCB0byAyKlBJIGJ5IFBJLzEyIgorbWF0aE9uSW50ZXJ2YWwoMC4wLDIuMCpQSSwxMixzaW4pCitlY2hvKCJcbiIpCitlY2hvICJDb3NpbmUgb2YgdGhldGEgZnJvbSAwIHRvIDIqUEkgYnkgUEkvMTIiCittYXRoT25JbnRlcnZhbCgwLjAsMi4wKlBJLDEyLGNvcykKKworIyBUaGUgZmlyc3QgZXhhbXBsZSBhYm92ZSBpcyBtdWNoIHRoZSBzYW1lIGFzOgorIyBmb3IgaSBpbiAxLi4xMDA6CisjICAgZWNobygkc2luKCAoZmxvYXQoaSkvMTAwLjApICogMi4wKlBJICkpCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL29iamVjdGl2ZV9jIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9vYmplY3RpdmVfYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDg1NjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9vYmplY3RpdmVfYwpAQCAtMCwwICsxLDE4IEBACitAaW50ZXJmYWNlIFBlcnNvbiA6IE5TT2JqZWN0IHsKKyAgQHB1YmxpYworICBOU1N0cmluZyAqbmFtZTsKKyAgQHByaXZhdGUKKyAgaW50IGFnZTsKK30KKworQHByb3BlcnR5KGNvcHkpIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5KHJlYWRvbmx5KSBpbnQgYWdlOworCistKGlkKWluaXRXaXRoQWdlOihpbnQpYWdlOworQGVuZAorCitOU0FycmF5ICphcnJheUxpdGVyYWwgPSBAW0AiYWJjIiwgQDFdOworTlNEaWN0aW9uYXJ5ICpkaWN0TGl0ZXJhbCA9IEB7CisgIEAiaGVsbG8iOiBAIndvcmxkIiwKKyAgQCJnb29kYnllIjogQCJjcnVlbCB3b3JsZCIKK307CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL29jYW1sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9vY2FtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDljZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9vY2FtbApAQCAtMCwwICsxLDEyIEBACisoKiBCaW5hcnkgdHJlZSB3aXRoIGxlYXZlcyBjYXLCrXJ5aW5nIGFuIGludGVnZXIuICopCit0eXBlIHRyZWUgPSBMZWFmIG9mIGludCB8IE5vZGUgb2YgdHJlZSAqIHRyZWUKKworbGV0IHJlYyBleGlzdHNfbGVhZiB0ZXN0IHRyZWUgPQorICBtYXRjaCB0cmVlIHdpdGgKKyAgfCBMZWFmIHYgLT4gdGVzdCB2CisgIHwgTm9kZSAobGVmdCwgcmlnaHQpIC0+CisgICAgICBleGlzdHNfbGVhZiB0ZXN0IGxlZnQKKyAgICAgIHx8IGV4aXN0c19sZWFmIHRlc3QgcmlnaHQKKworbGV0IGhhc19ldmVuX2xlYWYgdHJlZSA9CisgIGV4aXN0c19sZWFmIChmdW4gbiAtPiBuIG1vZCAyID0gMCkgdHJlZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wYXNjYWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Bhc2NhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmJlNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wYXNjYWwKQEAgLTAsMCArMSwxNCBAQAorcHJvZ3JhbSBGaXp6QnV6eihvdXRwdXQpOwordmFyCisgIGk6IEludGVnZXI7CitiZWdpbgorICBmb3IgaSA6PSAxIHRvIDEwMCBkbworICAgIGlmIGkgbW9kIDE1ID0gMCB0aGVuCisgICAgICBXcml0ZUxuKCdGaXp6QnV6eicpCisgICAgZWxzZSBpZiBpIG1vZCAzID0gMCB0aGVuCisgICAgICBXcml0ZUxuKCdGaXp6JykKKyAgICBlbHNlIGlmIGkgbW9kIDUgPSAwIHRoZW4KKyAgICAgIFdyaXRlTG4oJ0J1enonKQorICAgIGVsc2UKKyAgICAgIFdyaXRlTG4oaSkKK2VuZC4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcGVybCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcGVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY2NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wZXJsCkBAIC0wLDAgKzEsNSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAordXNlIHdhcm5pbmdzOworcHJpbnQgImE6ICI7CitteSAkYSA9ICJmb28iOworcHJpbnQgJGE7CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3BocCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTdmZTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3BocApAQCAtMCwwICsxLDMgQEAKKzw/cGhwCisgIHByaW50KCJIZWxsbyB7JHdvcmxkfSIpOworPz4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcGxhaW50ZXh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wbGFpbnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxODBmNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcGxhaW50ZXh0CkBAIC0wLDAgKzEgQEAKK3BsYWluIHRleHQgOikKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcG93ZXJzaGVsbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcG93ZXJzaGVsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDNhNjkyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wb3dlcnNoZWxsCkBAIC0wLDAgKzEsNDkgQEAKK++7v0Z1bmN0aW9uIEdldC1JUHY0U2NvcGVzCis8IworCS5TWU5PUFNJUworCQlSZWFkIElQdjRTY29wZXMgZnJvbSBhbiBhcnJheSBvZiBzZXJ2ZXJzCisJLlBBUkFNRVRFUiBTZXJ2ZXJzCisJCVNwZWNpZmllcyBhbiBhcnJheSBvZiBzZXJ2ZXJzCisJLkVYQU1QTEUKKwkJR2V0LUlQdjRTY29wZXMKKyAgICAgICAgCisJCVdpbGwgcHJvbXB0IGZvciBhbGwgaW5wdXRzCisjPgoreworICAgIFtDbWRsZXRCaW5kaW5nKCldCisgICAgUGFyYW0oCisgICAgIyAxCisgICAgW3BhcmFtZXRlcigKKyAgICAgICAgTWFuZGF0b3J5PSR0cnVlLAorICAgICAgICBQb3NpdGlvbj0wLAorICAgICAgICBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lPSR0cnVlLAorICAgICAgICBIZWxwTWVzc2FnZT0iU2VydmVyIExpc3QiCisgICAgICAgICldCisgICAgW3N0cmluZ1tdXSRTZXJ2ZXJzLAorICAgICMyCisgICAgW3BhcmFtZXRlcihNYW5kYXRvcnk9JGZhbHNlLFZhbHVlRnJvbVBpcGVsaW5lPSRmYWxzZSldCisgICAgW2Jvb2xdJFVuaXF1ZT0kZmFsc2UKKyAgICApICAjRW5kUGFyYW0KKworICAgIEJlZ2luIHt9CisKKyAgICBQcm9jZXNzIHsKKyAgICAgICAgJGFycmF5Sm9icz1AKCkKKyAgICAgICAgZm9yZWFjaCAoJHNlcnZlciBpbiAkU2VydmVycykgeworICAgICAgICAgICAgJGFycmF5Sm9icys9SW52b2tlLUNvbW1hbmQgLUNvbXB1dGVyTmFtZSAkc2VydmVyIC1zY3JpcHRibG9jayB7R2V0LURoY3BTZXJ2ZXJ2NFNjb3BlfSAgLUFzSm9iCisgICAgICAgIH0KKyAgICAgICAgJGNvbXBsZXRlPSRmYWxzZQorICAgICAgICB3aGlsZSAoLW5vdCAkY29tcGxldGUpIHsKKyAgICAgICAgICAgICRhcnJheUpvYnNJblByb2dyZXNzPSAkYXJyYXlKb2JzIHwgV2hlcmUtT2JqZWN0IHsgJF8uU3RhdGUgLW1hdGNoICdydW5uaW5nJyB9CisgICAgICAgICAgICBpZiAoLW5vdCAkYXJyYXlKb2JzSW5Qcm9ncmVzcykgeyAkY29tcGxldGU9JHRydWUgfQorICAgICAgICB9CisgICAgICAgICRTY29wZXM9JGFycmF5Sm9ic3xSZWNlaXZlLUpvYgorICAgICAgICAkVW5pcXVlU2NvcGVzPSRTY29wZXN8U29ydC1PYmplY3QgLVByb3BlcnR5IFNjb3BlSWQgLVVuaXF1ZQorICAgIH0KKworICAgIEVuZCB7CisgICAgICAgIGlmICgkVW5pcXVlKSB7IHJldHVybiAkVW5pcXVlU2NvcGVzIH0KKyAgICAgICAgZWxzZSB7IHJldHVybiAkU2NvcGVzIH0KKyAgICB9CisKK30gI2VuZCBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wcmFhdCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHJhYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhZjM1YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHJhYXQKQEAgLTAsMCArMSwyNiBAQAorZm9ybSBDb3B5IHNlbGVjdGVkIGZpbGVzLi4uCisgIHdvcmQgUHJlZml4CisgIHdvcmQgU3VmZml4IF9jb3B5CisgIGJvb2xlYW4gS2VlcF9vcmlnaW5hbCAxCitlbmRmb3JtCisKK3RvdGFsX29iamVjdHMgPSBudW1iZXJPZlNlbGVjdGVkKCkKK2ZvciBpIHRvIHRvdGFsX29iamVjdHMKKyAgbXlfb2JqZWN0W2ldID0gc2VsZWN0ZWQoaSkKK2VuZGZvcgorZm9yIGkgdG8gdG90YWxfb2JqZWN0cworICBzZWxlY3RPYmplY3Q6IG15X29iamVjdFtpXQorICBAY29weSgpCisgIG5ld1tpXSA9IHNlbGVjdGVkKCkKK2VuZGZvcgoraWYgdG90YWxfb2JqZWN0cworICBzZWxlY3RPYmplY3Q6IG5ld1sxXQorICBmb3IgaSBmcm9tIDIgdG8gdG90YWxfb2JqZWN0cworICAgIHBsdXNPYmplY3Q6IG5ld1tpXQorICBlbmRmb3IKK2VuZGlmCisKK3Byb2NlZHVyZSBjb3B5ICgpCisgIC5uYW1lJCA9IGV4dHJhY3RXb3JkJChzZWxlY3RlZCQoKSwgIiAiKQorICBDb3B5OiBwcmVmaXgkICsgLm5hbWUkICsgc3VmZml4JAorZW5kcHJvYwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wcm9sb2cgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Byb2xvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMwZTZiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wcm9sb2cKQEAgLTAsMCArMSw5IEBACitkaWZmKHBsdXMoQSxCKSwgWCwgcGx1cyhEQSwgREIpKQorICAgPD0gZGlmZihBLCBYLCBEQSkgYW5kIGRpZmYoQiwgWCwgREIpLgorCitkaWZmKHRpbWVzKEEsQiksIFgsIHBsdXModGltZXMoQSwgREIpLCB0aW1lcyhEQSwgQikpKQorICAgPD0gZGlmZihBLCBYLCBEQSkgYW5kIGRpZmYoQiwgWCwgREIpLgorCitlcXVhbChYLCBYKS4KK2RpZmYoWCwgWCwgMSkuCitkaWZmKFksIFgsIDApIDw9IG5vdCBlcXVhbChZLCBYKS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHJvcGVydGllcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI3MTdkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNyBAQAorIyBZb3UgYXJlIHJlYWRpbmcgdGhlICIucHJvcGVydGllcyIgZW50cnkuCishIFRoZSBleGNsYW1hdGlvbiBtYXJrIGNhbiBhbHNvIG1hcmsgdGV4dCBhcyBjb21tZW50cy4KK3dlYnNpdGUgPSBodHRwXDovL2VuLndpa2lwZWRpYS5vcmcvCitsYW5ndWFnZSA9IEVuZ2xpc2gKK2NvdW50cnkgOiBQb2xhbmQKK2NvbnRpbmVudD1FdXJvcGUKK2tleS53aXRoLmRvdHM9VGhpcyBpcyB0aGUgdmFsdWUgdGhhdCBjb3VsZCBiZSBsb29rZWQgdXAgd2l0aCB0aGUga2V5ICJrZXkud2l0aC5kb3RzIi4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHJvdG9idWYgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Byb3RvYnVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYWI5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Byb3RvYnVmCkBAIC0wLDAgKzEsNSBAQAorbWVzc2FnZSBQZXJzb24geworICByZXF1aXJlZCBzdHJpbmcgbmFtZSA9IDE7CisgIHJlcXVpcmVkIGludDMyIGlkID0gMjsKKyAgb3B0aW9uYWwgc3RyaW5nIGVtYWlsID0gMzsKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHVwcGV0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9wdXBwZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxZDljOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHVwcGV0CkBAIC0wLDAgKzEsNiBAQAorc2VydmljZSB7ICdudHAnOgorICBuYW1lICAgICAgPT4gJHNlcnZpY2VfbmFtZSwKKyAgZW5zdXJlICAgID0+IHJ1bm5pbmcsCisgIGVuYWJsZSAgICA9PiB0cnVlLAorICBzdWJzY3JpYmUgPT4gRmlsZVsnbnRwLmNvbmYnXSwKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHl0aG9uIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9weXRob24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhNWNiMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcHl0aG9uCkBAIC0wLDAgKzEsNiBAQAorZGVmIGZpYihuKTogICAgIyB3cml0ZSBGaWJvbmFjY2kgc2VyaWVzIHVwIHRvIG4KKyAgICAiIiJQcmludCBhIEZpYm9uYWNjaSBzZXJpZXMgdXAgdG8gbi4iIiIKKyAgICBhLCBiID0gMCwgMQorICAgIHdoaWxlIGEgPCBuOgorICAgICAgICBwcmludCBhLAorICAgICAgICBhLCBiID0gYiwgYStiCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3FtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYWNkYTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3FtbApAQCAtMCwwICsxLDkgQEAKK2ltcG9ydCBRdFF1aWNrIDIuMAorSXRlbSB7CisgICAgd2lkdGg6IDIwMAorICAgIGhlaWdodDogMTAwCisgICAgTW91c2VBcmVhIHsKKyAgICAgICAgYW5jaG9ycy5maWxsOiBwYXJlbnQKKyAgICAgICAgb25DbGlja2VkOiBRdC5xdWl0KCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3IgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4MDRiMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcgpAQCAtMCwwICsxLDggQEAKK2RiZW5mb3JkIDwtIGZ1bmN0aW9uKHgpeworICAgIGxvZzEwKDEgKyAxL3gpCit9CisKK3BiZW5mb3JkIDwtIGZ1bmN0aW9uKHEpeworICAgIGN1bXByb2JzIDwtIGN1bXN1bShkYmVuZm9yZCgxOjkpKQorICAgIHJldHVybihjdW1wcm9ic1txXSkKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcmFja2V0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9yYWNrZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5OTgxOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcmFja2V0CkBAIC0wLDAgKzEsMjQgQEAKKyNsYW5nIHJhY2tldAorCis7OyBkcmF3IGEgZ3JhcGggb2YgY29zIGFuZCBkZXJpdl4zKGNvcykKKyhyZXF1aXJlIHBsb3QpCisoZGVmaW5lICgoZGVyaXYgZikgeCkKKyAgKC8gKC0gKGYgeCkgKGYgKC0geCAwLjAwMSkpKSAwLjAwMSkpCisoZGVmaW5lICh0aHJpY2UgZikgKGxhbWJkYSAoeCkgKGYgKGYgKGYgeCkpKSkpCisocGxvdCAobGlzdCAoZnVuY3Rpb24gKCh0aHJpY2UgZGVyaXYpIHNpbikgLTUgNSkKKyAgICAgICAgICAgIChmdW5jdGlvbiBjb3MgLTUgNSAjOmNvbG9yICdibHVlKSkpCisKKzs7IFByaW50IHRoZSBHcmVlayBhbHBoYWJldAorKGZvciAoW2kgKGluLXJhbmdlIDI1KV0pCisgIChkaXNwbGF5bG4KKyAgIChpbnRlZ2VyLT5jaGFyCisgICAgKCsgaSAoY2hhci0+aW50ZWdlciAjXHUzQjEpKSkpKQorCis7OyBBbiBlY2hvIHNlcnZlcgorKGRlZmluZSBsaXN0ZW5lciAodGNwLWxpc3RlbiAxMjM0NSkpCisobGV0IGVjaG8tc2VydmVyICgpCisgIChkZWZpbmUtdmFsdWVzIChpbiBvdXQpICh0Y3AtYWNjZXB0IGxpc3RlbmVyKSkKKyAgKHRocmVhZCAozrsgKCkKKyAgICAgICAgICAgICAoY29weS1wb3J0IGluIG91dCkKKyAgICAgICAgICAgICAoY2xvc2Utb3V0cHV0LXBvcnQgb3V0KSkpCisgIChlY2hvLXNlcnZlcikpCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3J1YnkgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3J1YnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2MDlhMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvcnVieQpAQCAtMCwwICsxLDkgQEAKK2NsYXNzIEdyZWV0ZXIKKyAgZGVmIGluaXRpYWxpemUobmFtZT0iV29ybGQiKQorICAgIEBuYW1lID0gbmFtZQorICBlbmQKKworICBkZWYgc2F5X2hpCisgICAgcHV0cyAiSGkgI3tAbmFtZX0hIgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9ydXN0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9ydXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2IxNjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3J1c3QKQEAgLTAsMCArMSwxMiBAQAordXNlIGNvcmU6Oio7CisKK2ZuIG1haW4oKSB7CisgICAgZm9yIFsiQWxpY2UiLCAiQm9iIiwgIkNhcm9sIl0uZWFjaCB8Jm5hbWV8IHsKKyAgICAgICAgZG8gdGFzazo6c3Bhd24geworICAgICAgICAgICAgbGV0IHYgPSByYW5kOjpSbmcoKS5zaHVmZmxlKFsxLCAyLCAzXSk7CisgICAgICAgICAgICBmb3Igdi5lYWNoIHwmbnVtfCB7CisgICAgICAgICAgICAgICAgaW86OnByaW50KGZtdCEoIiVzIHNheXM6ICclZCdcbiIsIG5hbWUsIG51bSkpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Nhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Nhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3NjhkZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc2FzcwpAQCAtMCwwICsxLDMgQEAKK0Bmb3IgJGkgZnJvbSAxIHRocm91Z2ggMworICAuaXRlbS0jeyRpfQorICAgIHdpZHRoOiAyZW0gKiAkaQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zY2FsYSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc2NhbGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmMTllZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc2NhbGEKQEAgLTAsMCArMSwzIEBACitjbGFzcyBHcmVldGVyKG5hbWU6IFN0cmluZyA9ICJXb3JsZCIpIHsKKyAgZGVmIHNheUhpKCkgeyBwcmludGxuKCJIaSAiICsgbmFtZSArICIhIikgfQorfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zY2hlbWUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NjaGVtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWM0ZGJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zY2hlbWUKQEAgLTAsMCArMSw0IEBACisoZGVmaW5lIFkKKyAgKGxhbWJkYSAobSkKKyAgICAoKGxhbWJkYSAoZikgKG0gKGxhbWJkYSAoYSkgKChmIGYpIGEpKSkpCisgICAgIChsYW1iZGEgKGYpIChtIChsYW1iZGEgKGEpICgoZiBmKSBhKSkpKSkpKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjU5YTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Njc3MKQEAgLTAsMCArMSw1IEBACitAZm9yICRpIGZyb20gMSB0aHJvdWdoIDMgeworICAuaXRlbS0jeyRpfSB7CisgICAgd2lkdGg6IDJlbSAqICRpOworICB9Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NlZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODNjZDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NlZApAQCAtMCwwICsxLDQgQEAKKy9iZWdpbi8sL2VuZC8geworICAvYmVnaW4vbiAjIHNraXAgb3ZlciB0aGUgbGluZSB0aGF0IGhhcyAiYmVnaW4iIG9uIGl0CisgIHMvb2xkL25ldy8KK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc2hlbGwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NoZWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWZlNDgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NoZWxsCkBAIC0wLDAgKzEsMiBAQAorIyBJZiBub3QgcnVubmluZyBpbnRlcmFjdGl2ZWx5LCBkb24ndCBkbyBhbnl0aGluZworW1sgLXogIiRQUzEiIF1dICYmIHJldHVybgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zaGVsbF9zZXNzaW9uIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zaGVsbF9zZXNzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2JhNjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NoZWxsX3Nlc3Npb24KQEAgLTAsMCArMSwxMCBAQAorJCBscyAvYmluL2Jhc2gKKy9iaW4vYmFzaAorJCBzdWRvIHN1IC0KK1tzdWRvXSBwYXNzd29yZCBmb3Igc2lvNDogCisjIGxzIC9iaW4vYmFzaAorL2Jpbi9iYXNoCisjIAorIyBleGl0Citsb2dvdXQKKyQgCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NsaW0gYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NsaW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1YTRlMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc2xpbQpAQCAtMCwwICsxLDE3IEBACitkb2N0eXBlIGh0bWwKK2h0bWwKKyAgYm9keQorICAgIGgxIE1hcmt1cCBleGFtcGxlcyAgIAorICAgICNjb250ZW50CisgICAgICBwIAorICAgICAgfCBTbGltIGNhbiBoYXZlICN7cnVieV9jb2RlfSBpbnRlcnBvbGF0ZWQhCisgICAgICAvW2lmIElFXQorICAgICAgICBqYXZhc2NyaXB0OgorICAgICAgICAgIGFsZXJ0KCdTbGltIHN1cHBvcnRzIGVtYmVkZGVkIGphdmFzY3JpcHQhJykKKworICAgICAgLSB1bmxlc3MgaXRlbXMuZW1wdHk/CisgICAgICAgIHRhYmxlCisgICAgICAgICAgLSBmb3IgaXRlbSBpbiBpdGVtcyBkbworICAgICAgICAgICAgdHIKKyAgICAgICAgICAgICAgdGQubmFtZSA9IGl0ZW0ubmFtZQorICAgICAgICAgICAgICB0ZC5wcmljZSA9IGl0ZW0ucHJpY2UKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc21hbGx0YWxrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zbWFsbHRhbGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5NzE2MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc21hbGx0YWxrCkBAIC0wLDAgKzEsNiBAQAorcXVhZE11bHRpcGx5OiBpMSBhbmQ6IGkyIAorICAgICJUaGlzIG1ldGhvZCBtdWx0aXBsaWVzIHRoZSBnaXZlbiBudW1iZXJzIGJ5IGVhY2ggb3RoZXIKKyAgICBhbmQgdGhlIHJlc3VsdCBieSA0LiIKKyAgICB8IG11bCB8CisgICAgbXVsIDo9IGkxICogaTIuCisgICAgXm11bCAqIDQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc21hcnR5IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zbWFydHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3ZjY2NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc21hcnR5CkBAIC0wLDAgKzEsMTIgQEAKK3tmb28gYmFyPSdzaW5nbGUgcXVvdGVzJyBiYXo9ImRvdWJsZSBxdW90ZXMiIHRlc3QzPSR0ZXN0M30KKworPHVsPgorICB7Zm9yZWFjaCBmcm9tPSRteXZhcmlhYmxlIGl0ZW09ZGF0YX0KKyAgICA8bGk+eyRkYXRhLmZpZWxkfTwvbGk+CisgIHtmb3JlYWNoZWxzZX0KKyAgICA8bGk+Tm8gRGF0YTwvbGk+CisgIHsvZm9yZWFjaH0KKzwvdWw+CisKKzxkaXYgY2xhc3M9IntpZiAkZm9vfWNsYXNzMXtlbHNlfWNsYXNzMnsvaWZ9Ij57JGZvby5iYXIuYmF6fTwvZGl2PgorCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTU3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3NtbApAQCAtMCwwICsxLDQgQEAKK2RhdGF0eXBlIHNoYXBlCisgICA9IENpcmNsZSAgIG9mIGxvYyAqIHJlYWwgICAgICAoKiBjZW50ZXIgYW5kIHJhZGl1cyAqKQorICAgfCBTcXVhcmUgICBvZiBsb2MgKiByZWFsICAgICAgKCogdXBwZXItbGVmdCBjb3JuZXIgYW5kIHNpZGUgbGVuZ3RoOyBheGlzLWFsaWduZWQgKikKKyAgIHwgVHJpYW5nbGUgb2YgbG9jICogbG9jICogbG9jICgqIGNvcm5lcnMgKikKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc3FsIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy9zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhN2ExNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc3FsCkBAIC0wLDAgKzEgQEAKK1NFTEVDVCAqIEZST00gYHVzZXJzYCBXSEVSRSBgdXNlcmAuYGlkYCA9IDEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3Mvc3dpZnQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3N3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTRlZDIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3N3aWZ0CkBAIC0wLDAgKzEsNSBAQAorLy8gU2F5IGhlbGxvIHRvIHBvZXBsZQorZnVuYyBzYXlIZWxsbyhwZXJzb25OYW1lOiBTdHJpbmcpIC0+IFN0cmluZyB7CisgICAgbGV0IGdyZWV0aW5nID0gIkhlbGxvLCAiICsgcGVyc29uTmFtZSArICIhIgorICAgIHJldHVybiBncmVldGluZworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90YXAgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3RhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDliZjVhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90YXAKQEAgLTAsMCArMSw1IEBACitvayAxIC0gSW5wdXQgZmlsZSBvcGVuZWQKK25vdCBvayAyIC0gRmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgdmFsaWQKK29rIDMgLSBSZWFkIHRoZSByZXN0IG9mIHRoZSBmaWxlCitub3Qgb2sgNCAtIFN1bW1hcml6ZWQgY29ycmVjdGx5ICMgVE9ETyBOb3Qgd3JpdHRlbiB5ZXQKKzEuLjQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvdGNsIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiZTg3YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvdGNsCkBAIC0wLDAgKzEgQEAKK3Byb2MgY3Jvc3Nfc3VtIHtzfSB7ZXhwciBbam9pbiBbc3BsaXQgJHMgIiJdICtdfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90ZXggYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3RleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA1MTBmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90ZXgKQEAgLTAsMCArMSBAQAorVG8gd3JpdGUgXExhVGVYXCB5b3Ugd291bGQgdHlwZSBcdmVyYjpcTGFUZVg6LgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90b21sIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzExYzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3RvbWwKQEAgLTAsMCArMSw5IEBACisjIFRoaXMgaXMgYSBUT01MIGRvY3VtZW50LiBCb29tLgorCit0aXRsZSA9ICJUT01MIEV4YW1wbGUiCisKK1tvd25lcl0KK25hbWUgPSAiVG9tIFByZXN0b24tV2VybmVyIgorb3JnYW5pemF0aW9uID0gIkdpdEh1YiIKK2JpbyA9ICJHaXRIdWIgQ29mb3VuZGVyICYgQ0VPXG5MaWtlcyB0YXRlciB0b3RzIGFuZCBiZWVyLiIKK2RvYiA9IDE5NzktMDUtMjdUMDc6MzI6MDBaICMgRmlyc3QgY2xhc3MgZGF0ZXM/IFdoeSBub3Q/CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3R1bGlwIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90dWxpcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI3MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90dWxpcApAQCAtMCwwICsxLDE0IEBACisjIHJlZi50bHAKK0Btb2R1bGUgcmVmCisKK3JlZiB2YWx1ZSA9IEluc3RhbmNlIChzcGF3biBbISBsb29wIHZhbHVlIF0pCisKK2xvb3AgdmFsdWUgPSByZWNlaXZlIFsKKyAgLnNldCBuZXctdmFsdWUgPT4gbG9vcCBuZXctdmFsdWUKKyAgcCwgLmdldCA9PiAoc2VuZCBwIHZhbHVlOyBsb29wIHZhbHVlKQorXQorCitAbW9kdWxlIEluc3RhbmNlIHBpZCBbCisgIHNldCB2YWwgPSAuc2V0IHZhbCA+IHNlbmQgcGlkCisgIGdldCEgPSAuZ2V0ID4gc2VuZC13YWl0IHBpZAorXQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90d2lnIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90d2lnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNWU1NzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3R3aWcKQEAgLTAsMCArMSw5IEBACit7JSBpbmNsdWRlICdoZWFkZXIuaHRtbCcgJX0KKworeyUgZm9yIHVzZXIgaW4gdXNlcnMgJX0KKyAgKiB7eyB1c2VyLm5hbWUgfX0KK3slIGVsc2UgJX0KKyAgTm8gdXNlcnMgaGF2ZSBiZWVuIGZvdW5kLgoreyUgZW5kZm9yICV9CisKK3slIGluY2x1ZGUgJ2Zvb3Rlci5odG1sJyAlfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90eXBlc2NyaXB0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy90eXBlc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNGE3MGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3R5cGVzY3JpcHQKQEAgLTAsMCArMSBAQAorJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7IGFsZXJ0KCdyZWFkeSEnKTsgfSk7CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3ZiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy92YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2UzMjNkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy92YgpAQCAtMCwwICsxLDQgQEAKK1ByaXZhdGUgU3ViIEZvcm1fTG9hZCgpCisgICAgJyBFeGVjdXRlIGEgc2ltcGxlIG1lc3NhZ2UgYm94IHRoYXQgc2F5cyAiSGVsbG8sIFdvcmxkISIKKyAgICBNc2dCb3ggIkhlbGxvLCBXb3JsZCEiCitFbmQgU3ViCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Zlcmlsb2cgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3Zlcmlsb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3NTJjNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvdmVyaWxvZwpAQCAtMCwwICsxLDI3IEBACisvKioKKyAqIFZlcmlsb2cgTGV4ZXIKKyAqLworbW9kdWxlIEZvbygKKyAgaW5wdXQgbG9naWMgQ2xrX0NJLAorICBpbnB1dCBsb2dpYyBSc3RfUkJJLAorICBpbnB1dCBsb2dpYyBBLAorICBpbnB1dCBsb2dpYyBCLAorICBvdXRwdXQgbG9naWMgQworKTsKKyAgbG9naWMgQ19ETiwgQ19EUDsKKworICBhc3NpZ24gQyA9IENfRFA7CisKKyAgYWx3YXlzX2NvbWIgYmVnaW4gOiBwcm9jX25leHRfc3RhdGUKKyAgICBDX0ROID0gQSArIEI7CisgIGVuZAorCisgIC8vIENsb2NrZWQgcHJvY2VzcworICBhbHdheXNfZmYgQChwb3NlZGdlIENsa19DSSwgbmVnZWRnZSBSc3RfUkJJKSBiZWdpbgorICAgIGlmKH5Sc3RfUkJJKSBiZWdpbgorICAgICAgQ19EUCA8PSAxJ2IwOworICAgIGVuZCBlbHNlIGJlZ2luCisgICAgICBDX0RQIDw9IENfRE47CisgICAgZW5kCisgIGVuZAorZW5kbW9kdWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3ZpbWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3ZpbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMzY0YgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MvdmltbApAQCAtMCwwICsxLDE0IEBACitmdW5jdGlvbiEgczpNYWtlKGRpciwgbWFrZSwgZm9ybWF0LCBuYW1lKSBhYm9ydAorICBsZXQgY2QgPSBleGlzdHMoJypoYXNsb2NhbGRpcicpICYmIGhhc2xvY2FsZGlyKCkgPyAnbGNkJyA6ICdjZCcKKyAgbGV0IGN3ZCA9IGdldGN3ZCgpCisgIGxldCBbbXAsIGVmbSwgY2NdID0gWyZsOm1wLCAmbDplZm0sIGdldChiOiwgJ2N1cnJlbnRfY29tcGlsZXInLCAnJyldCisgIHRyeQorICAgIGV4ZWN1dGUgY2QgZm5hbWVlc2NhcGUoZGlyKQorICAgIGxldCBbJmw6bXAsICZsOmVmbSwgYjpjdXJyZW50X2NvbXBpbGVyXSA9IFthOm1ha2UsIGE6Zm9ybWF0LCBhOmNvbXBpbGVyXQorICAgIGV4ZWN1dGUgKGV4aXN0cygnOk1ha2UnKSA9PSAyID8gJ01ha2UnIDogJ21ha2UnKQorICBmaW5hbGx5CisgICAgbGV0IFsmbDptcCwgJmw6ZWZtLCBiOmN1cnJlbnRfY29tcGlsZXJdID0gW21wLCBlZm0sIGNjXQorICAgIGlmIGVtcHR5KGNjKSB8IHVubGV0ISBiOmN1cnJlbnRfY29tcGlsZXIgfCBlbmRpZgorICAgIGV4ZWN1dGUgY2QgZm5hbWVlc2NhcGUoY3dkKQorICBlbmR0cnkKK2VuZGZ1bmN0aW9uCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3htbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MveG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTg0NGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2RlbW9zL3htbApAQCAtMCwwICsxLDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj48L3hzbDp0ZW1wbGF0ZT4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MveWFtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZGVtb3MveWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjYyMmRlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9kZW1vcy95YW1sCkBAIC0wLDAgKzEsNCBAQAorLS0tCitvbmU6IE1hcmsgTWNHd2lyZQordHdvOiBTYW1teSBTb3NhCit0aHJlZTogS2VuIEdyaWZmZXkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZm9ybWF0dGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9mb3JtYXR0ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2YWU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZm9ybWF0dGVyLnJiCkBAIC0wLDAgKzEsNTAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgICMgQSBGb3JtYXR0ZXIgdGFrZXMgYSB0b2tlbiBzdHJlYW0gYW5kIGZvcm1hdHMgaXQgZm9yIGh1bWFuIHZpZXdpbmcuCisgIGNsYXNzIEZvcm1hdHRlcgorICAgICMgQHByaXZhdGUKKyAgICBSRUdJU1RSWSA9IHt9CisKKyAgICAjIFNwZWNpZnkgb3IgZ2V0IHRoZSB1bmlxdWUgdGFnIGZvciB0aGlzIGZvcm1hdHRlci4gIFRoaXMgaXMgdXNlZAorICAgICMgZm9yIHNwZWNpZnlpbmcgYSBmb3JtYXR0ZXIgaW4gYHJvdWdpZnlgLgorICAgIGRlZiBzZWxmLnRhZyh0YWc9bmlsKQorICAgICAgcmV0dXJuIEB0YWcgdW5sZXNzIHRhZworICAgICAgUkVHSVNUUllbdGFnXSA9IHNlbGYKKworICAgICAgQHRhZyA9IHRhZworICAgIGVuZAorCisgICAgIyBGaW5kIGEgZm9ybWF0dGVyIGNsYXNzIGdpdmVuIGEgdW5pcXVlIHRhZy4KKyAgICBkZWYgc2VsZi5maW5kKHRhZykKKyAgICAgIFJFR0lTVFJZW3RhZ10KKyAgICBlbmQKKworICAgICMgRm9ybWF0IGEgdG9rZW4gc3RyZWFtLiAgRGVsZWdhdGVzIHRvIHsjZm9ybWF0fS4KKyAgICBkZWYgc2VsZi5mb3JtYXQodG9rZW5zLCBvcHRzPXt9LCAmYikKKyAgICAgIG5ldyhvcHRzKS5mb3JtYXQodG9rZW5zLCAmYikKKyAgICBlbmQKKworICAgICMgRm9ybWF0IGEgdG9rZW4gc3RyZWFtLgorICAgIGRlZiBmb3JtYXQodG9rZW5zLCAmYikKKyAgICAgIHJldHVybiBzdHJlYW0odG9rZW5zLCAmYikgaWYgYmxvY2tfZ2l2ZW4/CisKKyAgICAgIG91dCA9ICcnCisgICAgICBzdHJlYW0odG9rZW5zKSB7IHxwaWVjZXwgb3V0IDw8IHBpZWNlIH0KKworICAgICAgb3V0CisgICAgZW5kCisKKyAgICAjIEBkZXByZWNhdGVkIFVzZSB7I2Zvcm1hdH0gaW5zdGVhZC4KKyAgICBkZWYgcmVuZGVyKHRva2VucykKKyAgICAgIHdhcm4gJ0Zvcm1hdHRlciNyZW5kZXIgaXMgZGVwcmVjYXRlZCwgdXNlICNmb3JtYXQgaW5zdGVhZC4nCisgICAgICBmb3JtYXQodG9rZW5zKQorICAgIGVuZAorCisgICAgIyBAYWJzdHJhY3QKKyAgICAjIHlpZWxkIHN0cmluZ3MgdGhhdCwgd2hlbiBjb25jYXRlbmF0ZWQsIGZvcm0gdGhlIGZvcm1hdHRlZCBvdXRwdXQKKyAgICBkZWYgc3RyZWFtKHRva2VucywgJmIpCisgICAgICByYWlzZSAnYWJzdHJhY3QnCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2Zvcm1hdHRlcnMvaHRtbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZm9ybWF0dGVycy9odG1sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzhhMmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2Zvcm1hdHRlcnMvaHRtbC5yYgpAQCAtMCwwICsxLDExNyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCisjIHN0ZGxpYgorcmVxdWlyZSAnY2dpJworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIEZvcm1hdHRlcnMKKyAgICAjIFRyYW5zZm9ybXMgYSB0b2tlbiBzdHJlYW0gaW50byBIVE1MIG91dHB1dC4KKyAgICBjbGFzcyBIVE1MIDwgRm9ybWF0dGVyCisgICAgICB0YWcgJ2h0bWwnCisKKyAgICAgICMgQG9wdGlvbiBvcHRzIFtTdHJpbmddIDpjc3NfY2xhc3MgKCdoaWdobGlnaHQnKQorICAgICAgIyBAb3B0aW9uIG9wdHMgW3RydWUvZmFsc2VdIDpsaW5lX251bWJlcnMgKGZhbHNlKQorICAgICAgIyBAb3B0aW9uIG9wdHMgW1JvdWdlOjpDU1NUaGVtZV0gOmlubGluZV90aGVtZSAobmlsKQorICAgICAgIyBAb3B0aW9uIG9wdHMgW3RydWUvZmFsc2VdIDp3cmFwICh0cnVlKQorICAgICAgIworICAgICAgIyBJbml0aWFsaXplIHdpdGggb3B0aW9ucy4KKyAgICAgICMKKyAgICAgICMgSWYgYDppbmxpbmVfdGhlbWVgIGlzIGdpdmVuLCB0aGVuIGluc3RlYWQgb2YgcmVuZGVyaW5nIHRoZQorICAgICAgIyB0b2tlbnMgYXMgPHNwYW4+IHRhZ3Mgd2l0aCBDU1MgY2xhc3NlcywgdGhlIHN0eWxlcyBhY2NvcmRpbmcgdG8KKyAgICAgICMgdGhlIGdpdmVuIHRoZW1lIHdpbGwgYmUgaW5saW5lZCBpbiAic3R5bGUiIGF0dHJpYnV0ZXMuICBUaGlzIGlzCisgICAgICAjIHVzZWZ1bCBmb3IgZm9ybWF0cyBpbiB3aGljaCBzdHlsZXNoZWV0cyBhcmUgbm90IGF2YWlsYWJsZS4KKyAgICAgICMKKyAgICAgICMgQ29udGVudCB3aWxsIGJlIHdyYXBwZWQgaW4gYSB0YWcgKGBkaXZgIGlmIHRhYmxlaXplZCwgYHByZWAgaWYKKyAgICAgICMgbm90KSB3aXRoIHRoZSBnaXZlbiBgOmNzc19jbGFzc2AgdW5sZXNzIGA6d3JhcGAgaXMgc2V0IHRvIGBmYWxzZWAuCisgICAgICBkZWYgaW5pdGlhbGl6ZShvcHRzPXt9KQorICAgICAgICBAY3NzX2NsYXNzID0gb3B0cy5mZXRjaCg6Y3NzX2NsYXNzLCAnaGlnaGxpZ2h0JykKKyAgICAgICAgQGNzc19jbGFzcyA9ICIgY2xhc3M9I3tAY3NzX2NsYXNzLmluc3BlY3R9IiBpZiBAY3NzX2NsYXNzCisKKyAgICAgICAgQGxpbmVfbnVtYmVycyA9IG9wdHMuZmV0Y2goOmxpbmVfbnVtYmVycywgZmFsc2UpCisgICAgICAgIEBzdGFydF9saW5lID0gb3B0cy5mZXRjaCg6c3RhcnRfbGluZSwgMSkKKyAgICAgICAgQGlubGluZV90aGVtZSA9IG9wdHMuZmV0Y2goOmlubGluZV90aGVtZSwgbmlsKQorICAgICAgICBAaW5saW5lX3RoZW1lID0gVGhlbWUuZmluZChAaW5saW5lX3RoZW1lKS5uZXcgaWYgQGlubGluZV90aGVtZS5pc19hPyBTdHJpbmcKKworICAgICAgICBAd3JhcCA9IG9wdHMuZmV0Y2goOndyYXAsIHRydWUpCisgICAgICBlbmQKKworICAgICAgIyBAeWllbGQgdGhlIGh0bWwgb3V0cHV0LgorICAgICAgZGVmIHN0cmVhbSh0b2tlbnMsICZiKQorICAgICAgICBpZiBAbGluZV9udW1iZXJzCisgICAgICAgICAgc3RyZWFtX3RhYmxlaXplZCh0b2tlbnMsICZiKQorICAgICAgICBlbHNlCisgICAgICAgICAgc3RyZWFtX3VudGFibGVpemVkKHRva2VucywgJmIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgICBkZWYgc3RyZWFtX3VudGFibGVpemVkKHRva2VucywgJmIpCisgICAgICAgIHlpZWxkICI8cHJlI0Bjc3NfY2xhc3M+PGNvZGU+IiBpZiBAd3JhcAorICAgICAgICB0b2tlbnMuZWFjaHsgfHRvaywgdmFsfCBzcGFuKHRvaywgdmFsLCAmYikgfQorICAgICAgICB5aWVsZCAiPC9jb2RlPjwvcHJlPlxuIiBpZiBAd3JhcAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdHJlYW1fdGFibGVpemVkKHRva2VucykKKyAgICAgICAgbnVtX2xpbmVzID0gMAorICAgICAgICBsYXN0X3ZhbCA9ICcnCisgICAgICAgIGZvcm1hdHRlZCA9ICcnCisKKyAgICAgICAgdG9rZW5zLmVhY2ggZG8gfHRvaywgdmFsfAorICAgICAgICAgIGxhc3RfdmFsID0gdmFsCisgICAgICAgICAgbnVtX2xpbmVzICs9IHZhbC5zY2FuKC9cbi8pLnNpemUKKyAgICAgICAgICBzcGFuKHRvaywgdmFsKSB7IHxzdHJ8IGZvcm1hdHRlZCA8PCBzdHIgfQorICAgICAgICBlbmQKKworICAgICAgICAjIGFkZCBhbiBleHRyYSBsaW5lIGZvciBub24tbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZ3MKKyAgICAgICAgaWYgbGFzdF92YWxbLTFdICE9ICJcbiIKKyAgICAgICAgICBudW1fbGluZXMgKz0gMQorICAgICAgICAgIHNwYW4oVG9rZW46OlRva2Vuczo6VGV4dDo6V2hpdGVzcGFjZSwgIlxuIikgeyB8c3RyfCBmb3JtYXR0ZWQgPDwgc3RyIH0KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBnZW5lcmF0ZSBhIHN0cmluZyBvZiBuZXdsaW5lLXNlcGFyYXRlZCBsaW5lIG51bWJlcnMgZm9yIHRoZSBndXR0ZXI+CisgICAgICAgIG51bWJlcnMgPSAlPDxwcmUgY2xhc3M9ImxpbmVubyI+I3soQHN0YXJ0X2xpbmUuLm51bV9saW5lcytAc3RhcnRfbGluZS0xKQorICAgICAgICAgIC50b19hLmpvaW4oIlxuIil9PC9wcmU+PgorCisgICAgICAgIHlpZWxkICI8ZGl2I0Bjc3NfY2xhc3M+IiBpZiBAd3JhcAorICAgICAgICB5aWVsZCAnPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogMCI+PHRib2R5Pjx0cj4nCisKKyAgICAgICAgIyB0aGUgImdsIiBjbGFzcyBhcHBsaWVzIHRoZSBzdHlsZSBmb3IgR2VuZXJpYy5MaW5lbm8KKyAgICAgICAgeWllbGQgJzx0ZCBjbGFzcz0iZ3V0dGVyIGdsIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPicKKyAgICAgICAgeWllbGQgbnVtYmVycworICAgICAgICB5aWVsZCAnPC90ZD4nCisKKyAgICAgICAgeWllbGQgJzx0ZCBjbGFzcz0iY29kZSI+JworICAgICAgICB5aWVsZCAnPHByZT4nCisgICAgICAgIHlpZWxkIGZvcm1hdHRlZAorICAgICAgICB5aWVsZCAnPC9wcmU+JworICAgICAgICB5aWVsZCAnPC90ZD4nCisKKyAgICAgICAgeWllbGQgIjwvdHI+PC90Ym9keT48L3RhYmxlPlxuIgorICAgICAgICB5aWVsZCAiPC9kaXY+XG4iIGlmIEB3cmFwCisgICAgICBlbmQKKworICAgICAgVEFCTEVfRk9SX0VTQ0FQRV9IVE1MID0geworICAgICAgICAnJicgPT4gJyZhbXA7JywKKyAgICAgICAgJzwnID0+ICcmbHQ7JywKKyAgICAgICAgJz4nID0+ICcmZ3Q7JywKKyAgICAgIH0KKworICAgICAgZGVmIHNwYW4odG9rLCB2YWwpCisgICAgICAgIHZhbCA9IHZhbC5nc3ViKC9bJjw+XS8sIFRBQkxFX0ZPUl9FU0NBUEVfSFRNTCkKKyAgICAgICAgc2hvcnRuYW1lID0gdG9rLnNob3J0bmFtZSBvciByYWlzZSAidW5rbm93biB0b2tlbjogI3t0b2suaW5zcGVjdH0gZm9yICN7dmFsLmluc3BlY3R9IgorCisgICAgICAgIGlmIHNob3J0bmFtZS5lbXB0eT8KKyAgICAgICAgICB5aWVsZCB2YWwKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmIEBpbmxpbmVfdGhlbWUKKyAgICAgICAgICAgIHJ1bGVzID0gQGlubGluZV90aGVtZS5zdHlsZV9mb3IodG9rKS5yZW5kZXJlZF9ydWxlcworCisgICAgICAgICAgICB5aWVsZCAiPHNwYW4gc3R5bGU9XCIje3J1bGVzLnRvX2Euam9pbignOycpfVwiPiN7dmFsfTwvc3Bhbj4iCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeWllbGQgIjxzcGFuIGNsYXNzPVwiI3tzaG9ydG5hbWV9XCI+I3t2YWx9PC9zcGFuPiIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZm9ybWF0dGVycy9udWxsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9mb3JtYXR0ZXJzL251bGwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmMWJhMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZm9ybWF0dGVycy9udWxsLnJiCkBAIC0wLDAgKzEsMTkgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBGb3JtYXR0ZXJzCisgICAgIyBBIGZvcm1hdHRlciB3aGljaCByZW5kZXJzIG5vdGhpbmcuCisgICAgY2xhc3MgTnVsbCA8IEZvcm1hdHRlcgorICAgICAgdGFnICdudWxsJworCisgICAgICBkZWYgaW5pdGlhbGl6ZSgqKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdHJlYW0odG9rZW5zLCAmYikKKyAgICAgICAgdG9rZW5zLmVhY2ggZG8gfHRvaywgdmFsfAorICAgICAgICAgIHlpZWxkICIje3Rva30gI3t2YWwuaW5zcGVjdH1cbiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZm9ybWF0dGVycy90ZXJtaW5hbDI1Ni5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZm9ybWF0dGVycy90ZXJtaW5hbDI1Ni5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjUxMjBkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9mb3JtYXR0ZXJzL3Rlcm1pbmFsMjU2LnJiCkBAIC0wLDAgKzEsMTc2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgRm9ybWF0dGVycworICAgICMgQSBmb3JtYXR0ZXIgZm9yIDI1Ni1jb2xvciB0ZXJtaW5hbHMKKyAgICBjbGFzcyBUZXJtaW5hbDI1NiA8IEZvcm1hdHRlcgorICAgICAgdGFnICd0ZXJtaW5hbDI1NicKKworICAgICAgIyBAcHJpdmF0ZQorICAgICAgYXR0cl9yZWFkZXIgOnRoZW1lCisKKworICAgICAgIyBAb3B0aW9uIG9wdHMgOnRoZW1lCisgICAgICAjICAgKGRlZmF1bHQgaXMgdGhhbmtmdWxfZXllcykgdGhlIHRoZW1lIHRvIHJlbmRlciB3aXRoLgorICAgICAgZGVmIGluaXRpYWxpemUob3B0cz17fSkKKyAgICAgICAgQHRoZW1lID0gb3B0c1s6dGhlbWVdIHx8ICd0aGFua2Z1bF9leWVzJworICAgICAgICBAdGhlbWUgPSBUaGVtZS5maW5kKEB0aGVtZSkgaWYgQHRoZW1lLmlzX2E/IFN0cmluZworICAgICAgZW5kCisKKyAgICAgIGRlZiBzdHJlYW0odG9rZW5zLCAmYikKKyAgICAgICAgdG9rZW5zLmVhY2ggZG8gfHRvaywgdmFsfAorICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZV9zZXF1ZW5jZSh0b2spCisgICAgICAgICAgeWllbGQgZXNjYXBlLnN0eWxlX3N0cmluZworICAgICAgICAgIHlpZWxkIHZhbC5nc3ViKCJcbiIsICJcbiN7ZXNjYXBlLnN0eWxlX3N0cmluZ30iKQorICAgICAgICAgIHlpZWxkIGVzY2FwZS5yZXNldF9zdHJpbmcKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgY2xhc3MgRXNjYXBlU2VxdWVuY2UKKyAgICAgICAgYXR0cl9yZWFkZXIgOnN0eWxlCisgICAgICAgIGRlZiBpbml0aWFsaXplKHN0eWxlKQorICAgICAgICAgIEBzdHlsZSA9IHN0eWxlCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBzZWxmLnh0ZXJtX2NvbG9ycworICAgICAgICAgIEB4dGVybV9jb2xvcnMgfHw9IFtdLnRhcCBkbyB8b3V0fAorICAgICAgICAgICAgIyBjb2xvcnMgMC4uMTU6IDE2IGJhc2ljIGNvbG9ycworICAgICAgICAgICAgb3V0IDw8IFsweDAwLCAweDAwLCAweDAwXSAjIDAKKyAgICAgICAgICAgIG91dCA8PCBbMHhjZCwgMHgwMCwgMHgwMF0gIyAxCisgICAgICAgICAgICBvdXQgPDwgWzB4MDAsIDB4Y2QsIDB4MDBdICMgMgorICAgICAgICAgICAgb3V0IDw8IFsweGNkLCAweGNkLCAweDAwXSAjIDMKKyAgICAgICAgICAgIG91dCA8PCBbMHgwMCwgMHgwMCwgMHhlZV0gIyA0CisgICAgICAgICAgICBvdXQgPDwgWzB4Y2QsIDB4MDAsIDB4Y2RdICMgNQorICAgICAgICAgICAgb3V0IDw8IFsweDAwLCAweGNkLCAweGNkXSAjIDYKKyAgICAgICAgICAgIG91dCA8PCBbMHhlNSwgMHhlNSwgMHhlNV0gIyA3CisgICAgICAgICAgICBvdXQgPDwgWzB4N2YsIDB4N2YsIDB4N2ZdICMgOAorICAgICAgICAgICAgb3V0IDw8IFsweGZmLCAweDAwLCAweDAwXSAjIDkKKyAgICAgICAgICAgIG91dCA8PCBbMHgwMCwgMHhmZiwgMHgwMF0gIyAxMAorICAgICAgICAgICAgb3V0IDw8IFsweGZmLCAweGZmLCAweDAwXSAjIDExCisgICAgICAgICAgICBvdXQgPDwgWzB4NWMsIDB4NWMsIDB4ZmZdICMgMTIKKyAgICAgICAgICAgIG91dCA8PCBbMHhmZiwgMHgwMCwgMHhmZl0gIyAxMworICAgICAgICAgICAgb3V0IDw8IFsweDAwLCAweGZmLCAweGZmXSAjIDE0CisgICAgICAgICAgICBvdXQgPDwgWzB4ZmYsIDB4ZmYsIDB4ZmZdICMgMTUKKworICAgICAgICAgICAgIyBjb2xvcnMgMTYuLjIzMjogdGhlIDZ4Nng2IGNvbG9yIGN1YmUKKyAgICAgICAgICAgIHZhbHVlcmFuZ2UgPSBbMHgwMCwgMHg1ZiwgMHg4NywgMHhhZiwgMHhkNywgMHhmZl0KKworICAgICAgICAgICAgMjE3LnRpbWVzIGRvIHxpfAorICAgICAgICAgICAgICByID0gdmFsdWVyYW5nZVsoaSAvIDM2KSAlIDZdCisgICAgICAgICAgICAgIGcgPSB2YWx1ZXJhbmdlWyhpIC8gNikgJSA2XQorICAgICAgICAgICAgICBiID0gdmFsdWVyYW5nZVtpICUgNl0KKyAgICAgICAgICAgICAgb3V0IDw8IFtyLCBnLCBiXQorICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgICMgY29sb3JzIDIzMy4uMjUzOiBncmF5c2NhbGUKKyAgICAgICAgICAgIDEudXB0byAyMiBkbyB8aXwKKyAgICAgICAgICAgICAgdiA9IDggKyBpICogMTAKKyAgICAgICAgICAgICAgb3V0IDw8IFt2LCB2LCB2XQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBmZworICAgICAgICAgIHJldHVybiBAZmcgaWYgaW5zdGFuY2VfdmFyaWFibGVfZGVmaW5lZD8gOkBmZworICAgICAgICAgIEBmZyA9IHN0eWxlLmZnICYmIHNlbGYuY2xhc3MuY29sb3JfaW5kZXgoc3R5bGUuZmcpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBiZworICAgICAgICAgIHJldHVybiBAYmcgaWYgaW5zdGFuY2VfdmFyaWFibGVfZGVmaW5lZD8gOkBiZworICAgICAgICAgIEBiZyA9IHN0eWxlLmJnICYmIHNlbGYuY2xhc3MuY29sb3JfaW5kZXgoc3R5bGUuYmcpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBzdHlsZV9zdHJpbmcKKyAgICAgICAgICBAc3R5bGVfc3RyaW5nIHx8PSBiZWdpbgorICAgICAgICAgICAgYXR0cnMgPSBbXQorCisgICAgICAgICAgICBhdHRycyA8PCBbJzM4JywgJzUnLCBmZy50b19zXSBpZiBmZworICAgICAgICAgICAgYXR0cnMgPDwgWyc0OCcsICc1JywgYmcudG9fc10gaWYgYmcKKyAgICAgICAgICAgIGF0dHJzIDw8ICcwMScgaWYgc3R5bGVbOmJvbGRdCisgICAgICAgICAgICBhdHRycyA8PCAnMDQnIGlmIHN0eWxlWzppdGFsaWNdICMgdW5kZXJsaW5lLCBidXQgaGV5LCB3aGF0ZXZzCisgICAgICAgICAgICBlc2NhcGUoYXR0cnMpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiByZXNldF9zdHJpbmcKKyAgICAgICAgICBAcmVzZXRfc3RyaW5nIHx8PSBiZWdpbgorICAgICAgICAgICAgYXR0cnMgPSBbXQorICAgICAgICAgICAgYXR0cnMgPDwgJzM5JyBpZiBmZyAjIGZnIHJlc2V0CisgICAgICAgICAgICBhdHRycyA8PCAnNDknIGlmIGJnICMgYmcgcmVzZXQKKyAgICAgICAgICAgIGF0dHJzIDw8ICcwMCcgaWYgc3R5bGVbOmJvbGRdIHx8IHN0eWxlWzppdGFsaWNdCisKKyAgICAgICAgICAgIGVzY2FwZShhdHRycykKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKyAgICAgICAgZGVmIGVzY2FwZShhdHRycykKKyAgICAgICAgICByZXR1cm4gJycgaWYgYXR0cnMuZW1wdHk/CisgICAgICAgICAgIlxlWyN7YXR0cnMuam9pbignOycpfW0iCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBzZWxmLmNvbG9yX2luZGV4KGNvbG9yKQorICAgICAgICAgIEBjb2xvcl9pbmRleF9jYWNoZSB8fD0ge30KKyAgICAgICAgICBAY29sb3JfaW5kZXhfY2FjaGVbY29sb3JdIHx8PSBjbG9zZXN0X2NvbG9yKCpnZXRfcmdiKGNvbG9yKSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIHNlbGYuZ2V0X3JnYihjb2xvcikKKyAgICAgICAgICBjb2xvciA9ICQxIGlmIGNvbG9yID1+IC8jKFswLTlhLWZdKykvaQorICAgICAgICAgIGhleGVzID0gY2FzZSBjb2xvci5zaXplCisgICAgICAgICAgd2hlbiAzCisgICAgICAgICAgICBjb2xvci5jaGFycy5tYXAgeyB8Y3wgIiN7Y30je2N9IiB9CisgICAgICAgICAgd2hlbiA2CisgICAgICAgICAgICBjb2xvci5zY2FuKC8uLi8pCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgImludmFsaWQgY29sb3I6ICN7Y29sb3J9IgorICAgICAgICAgIGVuZAorCisgICAgICAgICAgaGV4ZXMubWFwIHsgfGh8IGgudG9faSgxNikgfQorICAgICAgICBlbmQKKworICAgICAgICAjIG1heCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBjb2xvcnMsICMwMDAwMDAgdG8gI2ZmZmZmZgorICAgICAgICBNQVhfRElTVEFOQ0UgPSAyNTcgKiAyNTcgKiAzCisKKyAgICAgICAgZGVmIHNlbGYuY2xvc2VzdF9jb2xvcihyLCBnLCBiKQorICAgICAgICAgIEBAY29sb3JzX2NhY2hlIHx8PSB7fQorICAgICAgICAgIGtleSA9IChyIDw8IDE2KSArIChnIDw8IDgpICsgYgorICAgICAgICAgIEBAY29sb3JzX2NhY2hlLmZldGNoKGtleSkgZG8KKyAgICAgICAgICAgIGRpc3RhbmNlID0gTUFYX0RJU1RBTkNFCisKKyAgICAgICAgICAgIG1hdGNoID0gMAorCisgICAgICAgICAgICB4dGVybV9jb2xvcnMuZWFjaF93aXRoX2luZGV4IGRvIHwoY3IsIGNnLCBjYiksIGl8CisgICAgICAgICAgICAgIGQgPSAociAtIGNyKSoqMiArIChnIC0gY2cpKioyICsgKGIgLSBjYikqKjIKKyAgICAgICAgICAgICAgbmV4dCBpZiBkID49IGRpc3RhbmNlCisKKyAgICAgICAgICAgICAgbWF0Y2ggPSBpCisgICAgICAgICAgICAgIGRpc3RhbmNlID0gZAorICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgIG1hdGNoCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAjIHByaXZhdGUKKyAgICAgIGRlZiBlc2NhcGVfc2VxdWVuY2UodG9rZW4pCisgICAgICAgIEBlc2NhcGVfc2VxdWVuY2VzIHx8PSB7fQorICAgICAgICBAZXNjYXBlX3NlcXVlbmNlc1t0b2tlbi5xdWFsbmFtZV0gfHw9CisgICAgICAgICAgRXNjYXBlU2VxdWVuY2UubmV3KGdldF9zdHlsZSh0b2tlbikpCisgICAgICBlbmQKKworICAgICAgZGVmIGdldF9zdHlsZSh0b2tlbikKKyAgICAgICAgcmV0dXJuIHRleHRfc3R5bGUgaWYgdG9rZW4uYW5jZXN0b3JzLmluY2x1ZGU/IFRva2VuOjpUb2tlbnM6OlRleHQKKworICAgICAgICB0aGVtZS5nZXRfb3duX3N0eWxlKHRva2VuKSB8fCB0ZXh0X3N0eWxlCisgICAgICBlbmQKKworICAgICAgZGVmIHRleHRfc3R5bGUKKyAgICAgICAgc3R5bGUgPSB0aGVtZS5nZXRfc3R5bGUoVG9rZW5bJ1RleHQnXSkKKyAgICAgICAgIyBkb24ndCBoaWdobGlnaHQgdGV4dCBiYWNrZ3JvdW5kcworICAgICAgICBzdHlsZS5kZWxldGUgOmJnCisgICAgICAgIHN0eWxlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZ3Vlc3Nlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZ3Vlc3Nlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODU3YTIyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2VyLnJiCkBAIC0wLDAgKzEsNDYgQEAKK21vZHVsZSBSb3VnZQorICBjbGFzcyBHdWVzc2VyCisgICAgZGVmIHNlbGYuZ3Vlc3MoZ3Vlc3NlcnMsIGxleGVycykKKyAgICAgIG9yaWdpbmFsX3NpemUgPSBsZXhlcnMuc2l6ZQorCisgICAgICBndWVzc2Vycy5lYWNoIGRvIHxnfAorICAgICAgICBuZXdfbGV4ZXJzID0gY2FzZSBnCisgICAgICAgIHdoZW4gR3Vlc3NlciB0aGVuIGcuZmlsdGVyKGxleGVycykKKyAgICAgICAgd2hlbiBwcm9jIHsgfHh8IHgucmVzcG9uZF90bz8gOmNhbGwgfSB0aGVuIGcuY2FsbChsZXhlcnMpCisgICAgICAgIGVsc2UgcmFpc2UgImJhZCBndWVzc2VyOiAje2d9IgorICAgICAgICBlbmQKKworICAgICAgICBsZXhlcnMgPSBuZXdfbGV4ZXJzICYmIG5ld19sZXhlcnMuYW55PyA/IG5ld19sZXhlcnMgOiBsZXhlcnMKKyAgICAgIGVuZAorCisgICAgICAjIGlmIHdlIGhhdmVuJ3QgZmlsdGVyZWQgdGhlIGlucHV0IGF0ICphbGwqLAorICAgICAgIyB0aGVuIHdlIGhhdmUgbm8gaWRlYSB3aGF0IGxhbmd1YWdlIGl0IGlzLAorICAgICAgIyBzbyB3ZSBiYWlsIGFuZCByZXR1cm4gW10uCisgICAgICBsZXhlcnMuc2l6ZSA8IG9yaWdpbmFsX3NpemUgPyBsZXhlcnMgOiBbXQorICAgIGVuZAorCisgICAgZGVmIGNvbGxlY3RfYmVzdChsZXhlcnMsIG9wdHM9e30sICZzY29yZXIpCisgICAgICBiZXN0ID0gW10KKyAgICAgIGJlc3Rfc2NvcmUgPSBvcHRzWzp0aHJlc2hvbGRdCisKKyAgICAgIGxleGVycy5lYWNoIGRvIHxsZXhlcnwKKyAgICAgICAgc2NvcmUgPSBzY29yZXIuY2FsbChsZXhlcikKKworICAgICAgICBuZXh0IGlmIHNjb3JlLm5pbD8KKworICAgICAgICBpZiBiZXN0X3Njb3JlLm5pbD8gfHwgc2NvcmUgPiBiZXN0X3Njb3JlCisgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlCisgICAgICAgICAgYmVzdCA9IFtsZXhlcl0KKyAgICAgICAgZWxzaWYgc2NvcmUgPT0gYmVzdF9zY29yZQorICAgICAgICAgIGJlc3QgPDwgbGV4ZXIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgYmVzdAorICAgIGVuZAorCisgICAgZGVmIGZpbHRlcihsZXhlcnMpCisgICAgICByYWlzZSAnYWJzdHJhY3QnCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2d1ZXNzZXJzL2ZpbGVuYW1lLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9maWxlbmFtZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZiYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9maWxlbmFtZS5yYgpAQCAtMCwwICsxLDI1IEBACittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIEd1ZXNzZXJzCisgICAgY2xhc3MgRmlsZW5hbWUgPCBHdWVzc2VyCisgICAgICBhdHRyX3JlYWRlciA6Zm5hbWUKKyAgICAgIGRlZiBpbml0aWFsaXplKGZpbGVuYW1lKQorICAgICAgICBAZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgZW5kCisKKyAgICAgICMgcmV0dXJucyBhIGxpc3Qgb2YgbGV4ZXJzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGZpbGVuYW1lIHdpdGgKKyAgICAgICMgZXF1YWwgc3BlY2lmaWNpdHkgKGkuZS4gbnVtYmVyIG9mIHdpbGRjYXJkcyBpbiB0aGUgcGF0dGVybikuCisgICAgICAjIFRoaXMgaGVscHMgZGlzYW1iaWd1YXRlIGJldHdlZW4sIGUuZy4gdGhlIE5naW54IGxleGVyLCB3aGljaAorICAgICAgIyBtYXRjaGVzIGBuZ2lueC5jb25mYCwgYW5kIHRoZSBDb25mIGxleGVyLCB3aGljaCBtYXRjaGVzIGAqLmNvbmZgLgorICAgICAgIyBJbiB0aGlzIGNhc2UsIG5naW54IHdpbGwgd2luIGJlY2F1c2UgdGhlIHBhdHRlcm4gaGFzIG5vIHdpbGRjYXJkcywKKyAgICAgICMgd2hpbGUgYCouY29uZmAgaGFzIG9uZS4KKyAgICAgIGRlZiBmaWx0ZXIobGV4ZXJzKQorICAgICAgICBtYXBwaW5nID0ge30KKyAgICAgICAgbGV4ZXJzLmVhY2ggZG8gfGxleGVyfAorICAgICAgICAgIG1hcHBpbmdbbGV4ZXIubmFtZV0gPSBsZXhlci5maWxlbmFtZXMgfHwgW10KKyAgICAgICAgZW5kCisKKyAgICAgICAgR2xvYk1hcHBpbmcubmV3KG1hcHBpbmcsIEBmaWxlbmFtZSkuZmlsdGVyKGxleGVycykKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9nbG9iX21hcHBpbmcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2d1ZXNzZXJzL2dsb2JfbWFwcGluZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFmYTVkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9nbG9iX21hcHBpbmcucmIKQEAgLTAsMCArMSw0NiBAQAorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBHdWVzc2VycworICAgICMgVGhpcyBjbGFzcyBhbGxvd3MgZm9yIGN1c3RvbSBiZWhhdmlvcgorICAgICMgd2l0aCBnbG9iIC0+IGxleGVyIG5hbWUgbWFwcGluZ3MKKyAgICBjbGFzcyBHbG9iTWFwcGluZyA8IEd1ZXNzZXIKKyAgICAgIGRlZiBzZWxmLmJ5X3BhaXJzKG1hcHBpbmcsIGZpbGVuYW1lKQorICAgICAgICBnbG9iX21hcCA9IHt9CisgICAgICAgIG1hcHBpbmcuZWFjaCBkbyB8KGdsb2IsIGxleGVyX25hbWUpfAorICAgICAgICAgIGxleGVyID0gTGV4ZXIuZmluZChsZXhlcl9uYW1lKQorCisgICAgICAgICAgIyBpZ25vcmUgdW5rbm93biBsZXhlcnMKKyAgICAgICAgICBuZXh0IHVubGVzcyBsZXhlcgorCisgICAgICAgICAgZ2xvYl9tYXBbbGV4ZXIubmFtZV0gfHw9IFtdCisgICAgICAgICAgZ2xvYl9tYXBbbGV4ZXIubmFtZV0gPDwgZ2xvYgorICAgICAgICBlbmQKKworICAgICAgICBuZXcoZ2xvYl9tYXAsIGZpbGVuYW1lKQorICAgICAgZW5kCisKKyAgICAgIGF0dHJfcmVhZGVyIDpnbG9iX21hcCwgOmZpbGVuYW1lCisgICAgICBkZWYgaW5pdGlhbGl6ZShnbG9iX21hcCwgZmlsZW5hbWUpCisgICAgICAgIEBnbG9iX21hcCA9IGdsb2JfbWFwCisgICAgICAgIEBmaWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICBlbmQKKworICAgICAgZGVmIGZpbHRlcihsZXhlcnMpCisgICAgICAgIGJhc2VuYW1lID0gRmlsZS5iYXNlbmFtZShmaWxlbmFtZSkKKworICAgICAgICBjb2xsZWN0X2Jlc3QobGV4ZXJzKSBkbyB8bGV4ZXJ8CisgICAgICAgICAgc2NvcmUgPSAoQGdsb2JfbWFwW2xleGVyLm5hbWVdIHx8IFtdKS5tYXAgZG8gfHBhdHRlcm58CisgICAgICAgICAgICBpZiB0ZXN0X3BhdHRlcm4ocGF0dGVybiwgYmFzZW5hbWUpCisgICAgICAgICAgICAgICMgc3BlY2lmaWNpdHkgaXMgYmV0dGVyIHRoZSBmZXdlciB3aWxkY2FyZHMgdGhlcmUgYXJlCisgICAgICAgICAgICAgIC1wYXR0ZXJuLnNjYW4oL1sqP1xbXS8pLnNpemUKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZC5jb21wYWN0Lm1pbgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisgICAgICBkZWYgdGVzdF9wYXR0ZXJuKHBhdHRlcm4sIHBhdGgpCisgICAgICAgIEZpbGUuZm5tYXRjaD8ocGF0dGVybiwgcGF0aCwgRmlsZTo6Rk5NX0RPVE1BVENIIHwgRmlsZTo6Rk5NX0NBU0VGT0xEKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2d1ZXNzZXJzL21pbWV0eXBlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9taW1ldHlwZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWVmMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9taW1ldHlwZS5yYgpAQCAtMCwwICsxLDE0IEBACittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIEd1ZXNzZXJzCisgICAgY2xhc3MgTWltZXR5cGUgPCBHdWVzc2VyCisgICAgICBhdHRyX3JlYWRlciA6bWltZXR5cGUKKyAgICAgIGRlZiBpbml0aWFsaXplKG1pbWV0eXBlKQorICAgICAgICBAbWltZXR5cGUgPSBtaW1ldHlwZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBmaWx0ZXIobGV4ZXJzKQorICAgICAgICBsZXhlcnMuc2VsZWN0IHsgfGxleGVyfCBsZXhlci5taW1ldHlwZXMuaW5jbHVkZT8gQG1pbWV0eXBlIH0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9tb2RlbGluZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZ3Vlc3NlcnMvbW9kZWxpbmUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwOGI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvZ3Vlc3NlcnMvbW9kZWxpbmUucmIKQEAgLTAsMCArMSw0MiBAQAorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBHdWVzc2VycworICAgIGNsYXNzIE1vZGVsaW5lIDwgR3Vlc3NlcgorICAgICAgIyBbam5lZW5dIHJlZ2V4ZW4gc3RvbGVuIGZyb20gbGluZ3Vpc3QKKyAgICAgIEVNQUNTX01PREVMSU5FID0gLy1cKi1ccyooPzooPyFtb2RlKVtcdy1dK1xzKjpccyooPzpbXHcrLV0rKVxzKjs/XHMqKSooPzptb2RlXHMqOik/XHMqKFtcdystXSspXHMqKD86O1xzKig/IW1vZGUpW1x3LV0rXHMqOlxzKltcdystXStccyopKjs/XHMqLVwqLS9pCisKKyAgICAgICMgRmlyc3QgZm9ybSB2aW0gbW9kZWxpbmUKKyAgICAgICMgW3RleHRde3doaXRlfXt2aTp8dmltOnxleDp9W3doaXRlXXtvcHRpb25zfQorICAgICAgIyBleDogJ3ZpbTogc3ludGF4PXJ1YnknCisgICAgICBWSU1fTU9ERUxJTkVfMSA9IC8oPzp2aW18dml8ZXgpOlxzKig/OmZ0fGZpbGV0eXBlfHN5bnRheCk9KFx3Kylccz8vaQorCisgICAgICAjIFNlY29uZCBmb3JtIHZpbSBtb2RlbGluZSAoY29tcGF0aWJsZSB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgVmkpCisgICAgICAjIFt0ZXh0XXt3aGl0ZX17dmk6fHZpbTp8VmltOnxleDp9W3doaXRlXXNlW3RdIHtvcHRpb25zfTpbdGV4dF0KKyAgICAgICMgZXg6ICd2aW0gc2V0IHN5bnRheD1ydWJ5OicKKyAgICAgIFZJTV9NT0RFTElORV8yID0gLyg/OnZpbXx2aXxWaW18ZXgpOlxzKnNlKD86dCk/Lipccyg/OmZ0fGZpbGV0eXBlfHN5bnRheCk9KFx3Kylccz8uKjovaQorCisgICAgICBNT0RFTElORVMgPSBbRU1BQ1NfTU9ERUxJTkUsIFZJTV9NT0RFTElORV8xLCBWSU1fTU9ERUxJTkVfMl0KKworICAgICAgZGVmIGluaXRpYWxpemUoc291cmNlLCBvcHRzPXt9KQorICAgICAgICBAc291cmNlID0gc291cmNlCisgICAgICAgIEBsaW5lcyA9IG9wdHNbOmxpbmVzXSB8fCA1CisgICAgICBlbmQKKworICAgICAgZGVmIGZpbHRlcihsZXhlcnMpCisgICAgICAgICMgZG9uJ3QgYm90aGVyIHJlYWRpbmcgdGhlIHN0cmVhbSBpZiB3ZSd2ZSBhbHJlYWR5IGRlY2lkZWQKKyAgICAgICAgcmV0dXJuIGxleGVycyBpZiBsZXhlcnMuc2l6ZSA9PSAxCisKKyAgICAgICAgc291cmNlX3RleHQgPSBAc291cmNlCisgICAgICAgIHNvdXJjZV90ZXh0ID0gc291cmNlX3RleHQucmVhZCBpZiBzb3VyY2VfdGV4dC5yZXNwb25kX3RvPyA6cmVhZAorCisgICAgICAgIGxpbmVzID0gc291cmNlX3RleHQuc3BsaXQoL1xyP1xuLykKKworICAgICAgICBzZWFyY2hfc3BhY2UgPSAobGluZXMuZmlyc3QoQGxpbmVzKSArIGxpbmVzLmxhc3QoQGxpbmVzKSkuam9pbigiXG4iKQorCisgICAgICAgIG1hdGNoZXMgPSBNT0RFTElORVMubWFwIHsgfHJlfCByZS5tYXRjaChzZWFyY2hfc3BhY2UpIH0uY29tcGFjdAorICAgICAgICBtYXRjaF9zZXQgPSBTZXQubmV3KG1hdGNoZXMubWFwIHsgfG18IG1bMV0gfSkKKworICAgICAgICBsZXhlcnMuc2VsZWN0IHsgfGx8IChTZXQubmV3KFtsLnRhZ10gKyBsLmFsaWFzZXMpICYgbWF0Y2hfc2V0KS5hbnk/IH0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9zb3VyY2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2d1ZXNzZXJzL3NvdXJjZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWUzYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9ndWVzc2Vycy9zb3VyY2UucmIKQEAgLTAsMCArMSwzOSBAQAorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBHdWVzc2VycworICAgIGNsYXNzIFNvdXJjZSA8IEd1ZXNzZXIKKyAgICAgIGF0dHJfcmVhZGVyIDpzb3VyY2UKKyAgICAgIGRlZiBpbml0aWFsaXplKHNvdXJjZSkKKyAgICAgICAgQHNvdXJjZSA9IHNvdXJjZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBmaWx0ZXIobGV4ZXJzKQorICAgICAgICAjIGRvbid0IGJvdGhlciByZWFkaW5nIHRoZSBpbnB1dCBpZgorICAgICAgICAjIHdlJ3ZlIGFscmVhZHkgZmlsdGVyZWQgdG8gMQorICAgICAgICByZXR1cm4gbGV4ZXJzIGlmIGxleGVycy5zaXplID09IDEKKworICAgICAgICAjIElmIHdlJ3JlIGZpbHRlcmluZyBhZ2FpbnN0ICphbGwqIGxleGVycywgd2Ugb25seSB1c2UgY29uZmlkZW50IHJldHVybgorICAgICAgICAjIHZhbHVlcyBmcm9tIGFuYWx5emVfdGV4dC4gIEJ1dCBpZiB3ZSd2ZSBmaWx0ZXJlZCBkb3duIGFscmVhZHksIHdlIGNhbiB0cnVzdAorICAgICAgICAjIHRoZSBhbmFseXNpcyBtb3JlLgorICAgICAgICB0aHJlc2hvbGQgPSBsZXhlcnMuc2l6ZSA8IDEwID8gMCA6IDAuNQorCisgICAgICAgIHNvdXJjZV90ZXh0ID0gY2FzZSBAc291cmNlCisgICAgICAgIHdoZW4gU3RyaW5nCisgICAgICAgICAgQHNvdXJjZQorICAgICAgICB3aGVuIC0+KHMpeyBzLnJlc3BvbmRfdG8/IDpyZWFkIH0KKyAgICAgICAgICBAc291cmNlLnJlYWQKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlICdpbnZhbGlkIHNvdXJjZScKKyAgICAgICAgZW5kCisKKyAgICAgICAgTGV4ZXIuYXNzZXJ0X3V0ZjghKHNvdXJjZV90ZXh0KQorCisgICAgICAgIHNvdXJjZV90ZXh0ID0gVGV4dEFuYWx5emVyLm5ldyhzb3VyY2VfdGV4dCkKKworICAgICAgICBjb2xsZWN0X2Jlc3QobGV4ZXJzLCB0aHJlc2hvbGQ6IHRocmVzaG9sZCkgZG8gfGxleGVyfAorICAgICAgICAgIG5leHQgdW5sZXNzIGxleGVyLm1ldGhvZHMoZmFsc2UpLmluY2x1ZGU/IDphbmFseXplX3RleHQKKyAgICAgICAgICBsZXhlci5hbmFseXplX3RleHQoc291cmNlX3RleHQpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjEzYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlci5yYgpAQCAtMCwwICsxLDM3NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCisjIHN0ZGxpYgorcmVxdWlyZSAnc3Ryc2NhbicKK3JlcXVpcmUgJ2NnaScKK3JlcXVpcmUgJ3NldCcKKworbW9kdWxlIFJvdWdlCisgICMgQGFic3RyYWN0CisgICMgQSBsZXhlciB0cmFuc2Zvcm1zIHRleHQgaW50byBhIHN0cmVhbSBvZiBgW3Rva2VuLCBjaHVua11gIHBhaXJzLgorICBjbGFzcyBMZXhlcgorICAgIGluY2x1ZGUgVG9rZW46OlRva2VucworCisgICAgY2xhc3MgPDwgc2VsZgorICAgICAgIyBMZXhlcyBgc3RyZWFtYCB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLiAgVGhlIGxleCBpcyBkZWxlZ2F0ZWQgdG8gYQorICAgICAgIyBuZXcgaW5zdGFuY2UuCisgICAgICAjCisgICAgICAjIEBzZWUgI2xleAorICAgICAgZGVmIGxleChzdHJlYW0sIG9wdHM9e30sICZiKQorICAgICAgICBuZXcob3B0cykubGV4KHN0cmVhbSwgJmIpCisgICAgICBlbmQKKworICAgICAgZGVmIGRlZmF1bHRfb3B0aW9ucyhvPXt9KQorICAgICAgICBAZGVmYXVsdF9vcHRpb25zIHx8PSB7fQorICAgICAgICBAZGVmYXVsdF9vcHRpb25zLm1lcmdlIShvKQorICAgICAgICBAZGVmYXVsdF9vcHRpb25zCisgICAgICBlbmQKKworICAgICAgIyBHaXZlbiBhIHN0cmluZywgcmV0dXJuIHRoZSBjb3JyZWN0IGxleGVyIGNsYXNzLgorICAgICAgZGVmIGZpbmQobmFtZSkKKyAgICAgICAgcmVnaXN0cnlbbmFtZS50b19zXQorICAgICAgZW5kCisKKyAgICAgICMgRmluZCBhIGxleGVyLCB3aXRoIGZhbmN5IHNoaW55IGZlYXR1cmVzLgorICAgICAgIworICAgICAgIyAqIFRoZSBzdHJpbmcgeW91IHBhc3MgY2FuIGluY2x1ZGUgQ0dJLXN0eWxlIG9wdGlvbnMKKyAgICAgICMKKyAgICAgICMgICAgIExleGVyLmZpbmRfZmFuY3koJ2VyYj9wYXJlbnQ9dGV4JykKKyAgICAgICMKKyAgICAgICMgKiBZb3UgY2FuIHBhc3MgdGhlIHNwZWNpYWwgbmFtZSAnZ3Vlc3MnIHNvIHdlIGd1ZXNzIGZvciB5b3UsCisgICAgICAjICAgYW5kIHlvdSBjYW4gcGFzcyBhIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgY29kZSB0byBndWVzcyBieQorICAgICAgIworICAgICAgIyAgICAgTGV4ZXIuZmluZF9mYW5jeSgnZ3Vlc3MnLCAiIyEvYmluL2Jhc2hcbmVjaG8gSGVsbG8sIHdvcmxkIikKKyAgICAgICMKKyAgICAgICMgVGhpcyBpcyB1c2VkIGluIHRoZSBSZWRjYXJwZXQgcGx1Z2luIGFzIHdlbGwgYXMgUm91Z2UncyBvd24KKyAgICAgICMgbWFya2Rvd24gbGV4ZXIgZm9yIGhpZ2hsaWdodGluZyBpbnRlcm5hbCBjb2RlIGJsb2Nrcy4KKyAgICAgICMKKyAgICAgIGRlZiBmaW5kX2ZhbmN5KHN0ciwgY29kZT1uaWwpCisgICAgICAgIG5hbWUsIG9wdHMgPSBzdHIgPyBzdHIuc3BsaXQoJz8nLCAyKSA6IFtuaWwsICcnXQorCisgICAgICAgICMgcGFyc2UgdGhlIG9wdGlvbnMgaGFzaCBmcm9tIGEgY2dpLXN0eWxlIHN0cmluZworICAgICAgICBvcHRzID0gQ0dJLnBhcnNlKG9wdHMgfHwgJycpLm1hcCBkbyB8aywgdmFsc3wKKyAgICAgICAgICBbIGsudG9fc3ltLCB2YWxzLmVtcHR5PyA/IHRydWUgOiB2YWxzWzBdIF0KKyAgICAgICAgZW5kCisKKyAgICAgICAgb3B0cyA9IEhhc2hbb3B0c10KKworICAgICAgICBsZXhlcl9jbGFzcyA9IGNhc2UgbmFtZQorICAgICAgICB3aGVuICdndWVzcycsIG5pbAorICAgICAgICAgIHNlbGYuZ3Vlc3MoOnNvdXJjZSA9PiBjb2RlLCA6bWltZXR5cGUgPT4gb3B0c1s6bWltZXR5cGVdKQorICAgICAgICB3aGVuIFN0cmluZworICAgICAgICAgIHNlbGYuZmluZChuYW1lKQorICAgICAgICBlbmQKKworICAgICAgICBsZXhlcl9jbGFzcyAmJiBsZXhlcl9jbGFzcy5uZXcob3B0cykKKyAgICAgIGVuZAorCisgICAgICAjIFNwZWNpZnkgb3IgZ2V0IHRoaXMgbGV4ZXIncyB0aXRsZS4gTWVhbnQgdG8gYmUgaHVtYW4tcmVhZGFibGUuCisgICAgICBkZWYgdGl0bGUodD1uaWwpCisgICAgICAgIGlmIHQubmlsPworICAgICAgICAgIHQgPSB0YWcuY2FwaXRhbGl6ZQorICAgICAgICBlbmQKKyAgICAgICAgQHRpdGxlIHx8PSB0CisgICAgICBlbmQKKworICAgICAgIyBTcGVjaWZ5IG9yIGdldCB0aGlzIGxleGVyJ3MgZGVzY3JpcHRpb24uCisgICAgICBkZWYgZGVzYyhhcmc9OmFic2VudCkKKyAgICAgICAgaWYgYXJnID09IDphYnNlbnQKKyAgICAgICAgICBAZGVzYworICAgICAgICBlbHNlCisgICAgICAgICAgQGRlc2MgPSBhcmcKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBTcGVjaWZ5IG9yIGdldCB0aGUgcGF0aCBuYW1lIGNvbnRhaW5pbmcgYSBzbWFsbCBkZW1vIGZvcgorICAgICAgIyB0aGlzIGxleGVyIChjYW4gYmUgb3ZlcnJpZGVuIGJ5IHtkZW1vfSkuCisgICAgICBkZWYgZGVtb19maWxlKGFyZz06YWJzZW50KQorICAgICAgICByZXR1cm4gQGRlbW9fZmlsZSA9IFBhdGhuYW1lLm5ldyhhcmcpIHVubGVzcyBhcmcgPT0gOmFic2VudAorCisgICAgICAgIEBkZW1vX2ZpbGUgPSBQYXRobmFtZS5uZXcoX19GSUxFX18pLmRpcm5hbWUuam9pbignZGVtb3MnLCB0YWcpCisgICAgICBlbmQKKworICAgICAgIyBTcGVjaWZ5IG9yIGdldCBhIHNtYWxsIGRlbW8gc3RyaW5nIGZvciB0aGlzIGxleGVyCisgICAgICBkZWYgZGVtbyhhcmc9OmFic2VudCkKKyAgICAgICAgcmV0dXJuIEBkZW1vID0gYXJnIHVubGVzcyBhcmcgPT0gOmFic2VudAorCisgICAgICAgIEBkZW1vID0gRmlsZS5yZWFkKGRlbW9fZmlsZSwgZW5jb2Rpbmc6ICd1dGYtOCcpCisgICAgICBlbmQKKworICAgICAgIyBAcmV0dXJuIGEgbGlzdCBvZiBhbGwgbGV4ZXJzLgorICAgICAgZGVmIGFsbAorICAgICAgICByZWdpc3RyeS52YWx1ZXMudW5pcQorICAgICAgZW5kCisKKyAgICAgICMgR3Vlc3Mgd2hpY2ggbGV4ZXIgdG8gdXNlIGJhc2VkIG9uIGEgaGFzaCBvZiBpbmZvLgorICAgICAgIworICAgICAgIyBUaGlzIGFjY2VwdHMgdGhlIHNhbWUgYXJndW1lbnRzIGFzIExleGVyLmd1ZXNzLCBidXQgd2lsbCBuZXZlciB0aHJvdworICAgICAgIyBhbiBlcnJvci4gIEl0IHdpbGwgcmV0dXJuIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIHBvdGVudGlhbCBsZXhlcnMKKyAgICAgICMgdG8gdXNlLgorICAgICAgZGVmIGd1ZXNzZXMoaW5mbz17fSkKKyAgICAgICAgbWltZXR5cGUsIGZpbGVuYW1lLCBzb3VyY2UgPSBpbmZvLnZhbHVlc19hdCg6bWltZXR5cGUsIDpmaWxlbmFtZSwgOnNvdXJjZSkKKyAgICAgICAgY3VzdG9tX2dsb2JzID0gaW5mb1s6Y3VzdG9tX2dsb2JzXQorCisgICAgICAgIGd1ZXNzZXJzID0gKGluZm9bOmd1ZXNzZXJzXSB8fCBbXSkuZHVwCisKKyAgICAgICAgZ3Vlc3NlcnMgPDwgR3Vlc3NlcnM6Ok1pbWV0eXBlLm5ldyhtaW1ldHlwZSkgaWYgbWltZXR5cGUKKyAgICAgICAgZ3Vlc3NlcnMgPDwgR3Vlc3NlcnM6Okdsb2JNYXBwaW5nLmJ5X3BhaXJzKGN1c3RvbV9nbG9icywgZmlsZW5hbWUpIGlmIGN1c3RvbV9nbG9icyAmJiBmaWxlbmFtZQorICAgICAgICBndWVzc2VycyA8PCBHdWVzc2Vyczo6RmlsZW5hbWUubmV3KGZpbGVuYW1lKSBpZiBmaWxlbmFtZQorICAgICAgICBndWVzc2VycyA8PCBHdWVzc2Vyczo6TW9kZWxpbmUubmV3KHNvdXJjZSkgaWYgc291cmNlCisgICAgICAgIGd1ZXNzZXJzIDw8IEd1ZXNzZXJzOjpTb3VyY2UubmV3KHNvdXJjZSkgaWYgc291cmNlCisKKyAgICAgICAgR3Vlc3Nlci5ndWVzcyhndWVzc2VycywgTGV4ZXIuYWxsKQorICAgICAgZW5kCisKKyAgICAgIGNsYXNzIEFtYmlndW91c0d1ZXNzIDwgU3RhbmRhcmRFcnJvcgorICAgICAgICBhdHRyX3JlYWRlciA6YWx0ZXJuYXRpdmVzCisgICAgICAgIGRlZiBpbml0aWFsaXplKGFsdGVybmF0aXZlcyk7IEBhbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7IGVuZAorCisgICAgICAgIGRlZiBtZXNzYWdlCisgICAgICAgICAgIkFtYmlndW91cyBndWVzczogY2FuJ3QgZGVjaWRlIGJldHdlZW4gI3thbHRlcm5hdGl2ZXMubWFwKCY6dGFnKS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBHdWVzcyB3aGljaCBsZXhlciB0byB1c2UgYmFzZWQgb24gYSBoYXNoIG9mIGluZm8uCisgICAgICAjCisgICAgICAjIEBvcHRpb24gaW5mbyA6bWltZXR5cGUKKyAgICAgICMgICBBIG1pbWV0eXBlIHRvIGd1ZXNzIGJ5CisgICAgICAjIEBvcHRpb24gaW5mbyA6ZmlsZW5hbWUKKyAgICAgICMgICBBIGZpbGVuYW1lIHRvIGd1ZXNzIGJ5CisgICAgICAjIEBvcHRpb24gaW5mbyA6c291cmNlCisgICAgICAjICAgVGhlIHNvdXJjZSBpdHNlbGYsIHdoaWNoLCBpZiBndWVzc2luZyBieSBtaW1ldHlwZSBvciBmaWxlbmFtZQorICAgICAgIyAgIGZhaWxzLCB3aWxsIGJlIHNlYXJjaGVkIGZvciBzaGViYW5ncywgPCFET0NUWVBFIC4uLj4gdGFncywgYW5kCisgICAgICAjICAgb3RoZXIgaGludHMuCisgICAgICAjCisgICAgICAjIEBzZWUgTGV4ZXIuYW5hbHl6ZV90ZXh0CisgICAgICAjIEBzZWUgTGV4ZXIuZ3Vlc3NlcworICAgICAgZGVmIGd1ZXNzKGluZm89e30pCisgICAgICAgIGxleGVycyA9IGd1ZXNzZXMoaW5mbykKKworICAgICAgICByZXR1cm4gTGV4ZXJzOjpQbGFpblRleHQgaWYgbGV4ZXJzLmVtcHR5PworICAgICAgICByZXR1cm4gbGV4ZXJzWzBdIGlmIGxleGVycy5zaXplID09IDEKKworICAgICAgICByYWlzZSBBbWJpZ3VvdXNHdWVzcy5uZXcobGV4ZXJzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBndWVzc19ieV9taW1ldHlwZShtdCkKKyAgICAgICAgZ3Vlc3MgOm1pbWV0eXBlID0+IG10CisgICAgICBlbmQKKworICAgICAgZGVmIGd1ZXNzX2J5X2ZpbGVuYW1lKGZuYW1lKQorICAgICAgICBndWVzcyA6ZmlsZW5hbWUgPT4gZm5hbWUKKyAgICAgIGVuZAorCisgICAgICBkZWYgZ3Vlc3NfYnlfc291cmNlKHNvdXJjZSkKKyAgICAgICAgZ3Vlc3MgOnNvdXJjZSA9PiBzb3VyY2UKKyAgICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgcHJvdGVjdGVkCisgICAgICAjIEBwcml2YXRlCisgICAgICBkZWYgcmVnaXN0ZXIobmFtZSwgbGV4ZXIpCisgICAgICAgIHJlZ2lzdHJ5W25hbWUudG9fc10gPSBsZXhlcgorICAgICAgZW5kCisKKyAgICBwdWJsaWMKKyAgICAgICMgVXNlZCB0byBzcGVjaWZ5IG9yIGdldCB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhpcyBsZXhlciBjbGFzcy4KKyAgICAgICMKKyAgICAgICMgQGV4YW1wbGUKKyAgICAgICMgICBjbGFzcyBNeUxleGVyIDwgTGV4ZXIKKyAgICAgICMgICAgIHRhZyAnZm9vJworICAgICAgIyAgIGVuZAorICAgICAgIworICAgICAgIyAgIE15TGV4ZXIudGFnICMgPT4gJ2ZvbycKKyAgICAgICMKKyAgICAgICMgICBMZXhlci5maW5kKCdmb28nKSAjID0+IE15TGV4ZXIKKyAgICAgIGRlZiB0YWcodD1uaWwpCisgICAgICAgIHJldHVybiBAdGFnIGlmIHQubmlsPworCisgICAgICAgIEB0YWcgPSB0LnRvX3MKKyAgICAgICAgTGV4ZXIucmVnaXN0ZXIoQHRhZywgc2VsZikKKyAgICAgIGVuZAorCisgICAgICAjIFVzZWQgdG8gc3BlY2lmeSBhbHRlcm5hdGUgbmFtZXMgdGhpcyBsZXhlciBjbGFzcyBtYXkgYmUgZm91bmQgYnkuCisgICAgICAjCisgICAgICAjIEBleGFtcGxlCisgICAgICAjICAgY2xhc3MgRXJiIDwgTGV4ZXIKKyAgICAgICMgICAgIHRhZyAnZXJiJworICAgICAgIyAgICAgYWxpYXNlcyAnZXJ1YnknLCAncmh0bWwnCisgICAgICAjICAgZW5kCisgICAgICAjCisgICAgICAjICAgTGV4ZXIuZmluZCgnZXJ1YnknKSAjID0+IEVyYgorICAgICAgZGVmIGFsaWFzZXMoKmFyZ3MpCisgICAgICAgIGFyZ3MubWFwISgmOnRvX3MpCisgICAgICAgIGFyZ3MuZWFjaCB7IHxhcmd8IExleGVyLnJlZ2lzdGVyKGFyZywgc2VsZikgfQorICAgICAgICAoQGFsaWFzZXMgfHw9IFtdKS5jb25jYXQoYXJncykKKyAgICAgIGVuZAorCisgICAgICAjIFNwZWNpZnkgYSBsaXN0IG9mIGZpbGVuYW1lIGdsb2JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxleGVyLgorICAgICAgIworICAgICAgIyBAZXhhbXBsZQorICAgICAgIyAgIGNsYXNzIFJ1YnkgPCBMZXhlcgorICAgICAgIyAgICAgZmlsZW5hbWVzICcqLnJiJywgJyoucnVieScsICdHZW1maWxlJywgJ1Jha2VmaWxlJworICAgICAgIyAgIGVuZAorICAgICAgZGVmIGZpbGVuYW1lcygqZm5hbWVzKQorICAgICAgICAoQGZpbGVuYW1lcyB8fD0gW10pLmNvbmNhdChmbmFtZXMpCisgICAgICBlbmQKKworICAgICAgIyBTcGVjaWZ5IGEgbGlzdCBvZiBtaW1ldHlwZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGV4ZXIuCisgICAgICAjCisgICAgICAjIEBleGFtcGxlCisgICAgICAjICAgY2xhc3MgSHRtbCA8IExleGVyCisgICAgICAjICAgICBtaW1ldHlwZXMgJ3RleHQvaHRtbCcsICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnCisgICAgICAjICAgZW5kCisgICAgICBkZWYgbWltZXR5cGVzKCptdHMpCisgICAgICAgIChAbWltZXR5cGVzIHx8PSBbXSkuY29uY2F0KG10cykKKyAgICAgIGVuZAorCisgICAgICAjIEBwcml2YXRlCisgICAgICBkZWYgYXNzZXJ0X3V0ZjghKHN0cikKKyAgICAgICAgcmV0dXJuIGlmICV3KFVTLUFTQ0lJIFVURi04IEFTQ0lJLThCSVQpLmluY2x1ZGU/IHN0ci5lbmNvZGluZy5uYW1lCisgICAgICAgIHJhaXNlIEVuY29kaW5nRXJyb3IubmV3KAorICAgICAgICAgICJCYWQgZW5jb2Rpbmc6ICN7c3RyLmVuY29kaW5nLm5hbWVzLmpvaW4oJywnKX0uICIgKworICAgICAgICAgICJQbGVhc2UgY29udmVydCB5b3VyIHN0cmluZyB0byBVVEYtOC4iCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgcHJpdmF0ZQorICAgICAgZGVmIHJlZ2lzdHJ5CisgICAgICAgIEByZWdpc3RyeSB8fD0ge30KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyAtKi0gaW5zdGFuY2UgbWV0aG9kcyAtKi0gIworCisgICAgIyBDcmVhdGUgYSBuZXcgbGV4ZXIgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy4gIEluZGl2aWR1YWwgbGV4ZXJzIG1heQorICAgICMgc3BlY2lmeSBleHRyYSBvcHRpb25zLiAgVGhlIG9ubHkgY3VycmVudCBnbG9iYWxseSBhY2NlcHRlZCBvcHRpb24KKyAgICAjIGlzIGA6ZGVidWdgLgorICAgICMKKyAgICAjIEBvcHRpb24gb3B0cyA6ZGVidWcKKyAgICAjICAgUHJpbnRzIGRlYnVnIGluZm9ybWF0aW9uIHRvIHN0ZG91dC4gIFRoZSBwYXJ0aWN1bGFyIGluZm8gZGVwZW5kcworICAgICMgICBvbiB0aGUgbGV4ZXIgaW4gcXVlc3Rpb24uICBJbiByZWdleCBsZXhlcnMsIHRoaXMgd2lsbCBsb2cgdGhlCisgICAgIyAgIHN0YXRlIHN0YWNrIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzdGVwLCBhbG9uZyB3aXRoIGVhY2ggcmVnZXgKKyAgICAjICAgdHJpZWQgYW5kIGVhY2ggc3RyZWFtIGNvbnN1bWVkLiAgVHJ5IGl0LCBpdCdzIHByZXR0eSB1c2VmdWwuCisgICAgZGVmIGluaXRpYWxpemUob3B0cz17fSkKKyAgICAgIG9wdGlvbnMob3B0cykKKworICAgICAgQGRlYnVnID0gb3B0aW9uKDpkZWJ1ZykKKyAgICBlbmQKKworICAgICMgZ2V0IGFuZC9vciBzcGVjaWZ5IHRoZSBvcHRpb25zIGZvciB0aGlzIGxleGVyLgorICAgIGRlZiBvcHRpb25zKG89e30pCisgICAgICAoQG9wdGlvbnMgfHw9IHt9KS5tZXJnZSEobykKKworICAgICAgc2VsZi5jbGFzcy5kZWZhdWx0X29wdGlvbnMubWVyZ2UoQG9wdGlvbnMpCisgICAgZW5kCisKKyAgICAjIGdldCBvciBzcGVjaWZ5IG9uZSBvcHRpb24gZm9yIHRoaXMgbGV4ZXIKKyAgICBkZWYgb3B0aW9uKGssIHY9OmFic2VudCkKKyAgICAgIGlmIHYgPT0gOmFic2VudAorICAgICAgICBvcHRpb25zW2tdCisgICAgICBlbHNlCisgICAgICAgIG9wdGlvbnMoeyBrID0+IHYgfSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBAZGVwcmVjYXRlZAorICAgICMgSW5zdGVhZCBvZiBgZGVidWcgeyAiZm9vIiB9YCwgc2ltcGx5IGBwdXRzICJmb28iIGlmIEBkZWJ1Z2AuCisgICAgIworICAgICMgTGVhdmUgYSBkZWJ1ZyBtZXNzYWdlIGlmIHRoZSBgOmRlYnVnYCBvcHRpb24gaXMgc2V0LiAgVGhlIG1lc3NhZ2UKKyAgICAjIGlzIGdpdmVuIGFzIGEgYmxvY2sgYmVjYXVzZSBzb21lIGRlYnVnIG1lc3NhZ2VzIGNvbnRhaW4gY2FsY3VsYXRlZAorICAgICMgaW5mb3JtYXRpb24gdGhhdCBpcyB1bm5lY2Vzc2FyeSBmb3IgbGV4aW5nIGluIHRoZSByZWFsIHdvcmxkLgorICAgICMKKyAgICAjIENhbGxzIHRvIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBndWFyZGVkIHdpdGggImlmIEBkZWJ1ZyIgZm9yIGJlc3QKKyAgICAjIHBlcmZvcm1hbmNlIHdoZW4gZGVidWdnaW5nIGlzIHR1cm5lZCBvZmYuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgZGVidWcgeyAiaGVsbG8sIHdvcmxkISIgfSBpZiBAZGVidWcKKyAgICBkZWYgZGVidWcKKyAgICAgIHdhcm4gIkxleGVyI2RlYnVnIGlzIGRlcHJlY2F0ZWQuICBTaW1wbHkgcHV0cyBpZiBAZGVidWcgaW5zdGVhZC4iCisgICAgICBwdXRzIHlpZWxkIGlmIEBkZWJ1ZworICAgIGVuZAorCisgICAgIyBAYWJzdHJhY3QKKyAgICAjCisgICAgIyBDYWxsZWQgYWZ0ZXIgZWFjaCBsZXggaXMgZmluaXNoZWQuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgICMgaXMgYSBub29wLgorICAgIGRlZiByZXNldCEKKyAgICBlbmQKKworICAgICMgR2l2ZW4gYSBzdHJpbmcsIHlpZWxkIFt0b2tlbiwgY2h1bmtdIHBhaXJzLiAgSWYgbm8gYmxvY2sgaXMgZ2l2ZW4sCisgICAgIyBhbiBlbnVtZXJhdG9yIGlzIHJldHVybmVkLgorICAgICMKKyAgICAjIEBvcHRpb24gb3B0cyA6Y29udGludWUKKyAgICAjICAgQ29udGludWUgdGhlIGxleCBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSAoaS5lLiBkb24ndCBjYWxsICNyZXNldCEpCisgICAgZGVmIGxleChzdHJpbmcsIG9wdHM9e30sICZiKQorICAgICAgcmV0dXJuIGVudW1fZm9yKDpsZXgsIHN0cmluZywgb3B0cykgdW5sZXNzIGJsb2NrX2dpdmVuPworCisgICAgICBMZXhlci5hc3NlcnRfdXRmOCEoc3RyaW5nKQorCisgICAgICByZXNldCEgdW5sZXNzIG9wdHNbOmNvbnRpbnVlXQorCisgICAgICAjIGNvbnNvbGlkYXRlIGNvbnNlY3V0aXZlIHRva2VucyBvZiB0aGUgc2FtZSB0eXBlCisgICAgICBsYXN0X3Rva2VuID0gbmlsCisgICAgICBsYXN0X3ZhbCA9IG5pbAorICAgICAgc3RyZWFtX3Rva2VucyhzdHJpbmcpIGRvIHx0b2ssIHZhbHwKKyAgICAgICAgbmV4dCBpZiB2YWwuZW1wdHk/CisKKyAgICAgICAgaWYgdG9rID09IGxhc3RfdG9rZW4KKyAgICAgICAgICBsYXN0X3ZhbCA8PCB2YWwKKyAgICAgICAgICBuZXh0CisgICAgICAgIGVuZAorCisgICAgICAgIGIuY2FsbChsYXN0X3Rva2VuLCBsYXN0X3ZhbCkgaWYgbGFzdF90b2tlbgorICAgICAgICBsYXN0X3Rva2VuID0gdG9rCisgICAgICAgIGxhc3RfdmFsID0gdmFsCisgICAgICBlbmQKKworICAgICAgYi5jYWxsKGxhc3RfdG9rZW4sIGxhc3RfdmFsKSBpZiBsYXN0X3Rva2VuCisgICAgZW5kCisKKyAgICAjIGRlbGVnYXRlZCB0byB7TGV4ZXIudGFnfQorICAgIGRlZiB0YWcKKyAgICAgIHNlbGYuY2xhc3MudGFnCisgICAgZW5kCisKKyAgICAjIEBhYnN0cmFjdAorICAgICMKKyAgICAjIFlpZWxkIGBbdG9rZW4sIGNodW5rXWAgcGFpcnMsIGdpdmVuIGEgcHJlcGFyZWQgaW5wdXQgc3RyZWFtLiAgVGhpcworICAgICMgbXVzdCBiZSBpbXBsZW1lbnRlZC4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZ1NjYW5uZXJdIHN0cmVhbQorICAgICMgICB0aGUgc3RyZWFtCisgICAgZGVmIHN0cmVhbV90b2tlbnMoc3RyZWFtLCAmYikKKyAgICAgIHJhaXNlICdhYnN0cmFjdCcKKyAgICBlbmQKKworICAgICMgQGFic3RyYWN0CisgICAgIworICAgICMgUmV0dXJuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIHRoZSBsaWtlbGlob29kIHRoYXQKKyAgICAjIHRoZSB0ZXh0IGdpdmVuIHNob3VsZCBiZSBsZXhlZCB3aXRoIHRoaXMgbGV4ZXIuICBUaGUgZGVmYXVsdAorICAgICMgaW1wbGVtZW50YXRpb24gcmV0dXJucyAwLiAgVmFsdWVzIHVuZGVyIDAuNSB3aWxsIG9ubHkgYmUgdXNlZAorICAgICMgdG8gZGlzYW1iaWd1YXRlIGZpbGVuYW1lIG9yIG1pbWV0eXBlIG1hdGNoZXMuCisgICAgIworICAgICMgQHBhcmFtIFtUZXh0QW5hbHl6ZXJdIHRleHQKKyAgICAjICAgdGhlIHRleHQgdG8gYmUgYW5hbHl6ZWQsIHdpdGggYSBjb3VwbGUgb2YgaGFuZHkgbWV0aG9kcyBvbiBpdCwKKyAgICAjICAgbGlrZSB7VGV4dEFuYWx5emVyI3NoZWJhbmc/fSBhbmQge1RleHRBbmFseXplciNkb2N0eXBlP30KKyAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgIDAKKyAgICBlbmQKKyAgZW5kCisKKyAgbW9kdWxlIExleGVycworICAgIEBfbG9hZGVkX2xleGVycyA9IHt9CisKKyAgICBkZWYgc2VsZi5sb2FkX2xleGVyKHJlbHBhdGgpCisgICAgICByZXR1cm4gaWYgQF9sb2FkZWRfbGV4ZXJzLmtleT8ocmVscGF0aCkKKyAgICAgIEBfbG9hZGVkX2xleGVyc1tyZWxwYXRoXSA9IHRydWUKKworICAgICAgcm9vdCA9IFBhdGhuYW1lLm5ldyhfX0ZJTEVfXykuZGlybmFtZS5qb2luKCdsZXhlcnMnKQorICAgICAgbG9hZCByb290LmpvaW4ocmVscGF0aCkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2FjdGlvbnNjcmlwdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2FjdGlvbnNjcmlwdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ1YWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvYWN0aW9uc2NyaXB0LnJiCkBAIC0wLDAgKzEsMTk1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgQWN0aW9uc2NyaXB0IDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkFjdGlvblNjcmlwdCIKKyAgICAgIGRlc2MgIkFjdGlvblNjcmlwdCIKKworICAgICAgdGFnICdhY3Rpb25zY3JpcHQnCisgICAgICBhbGlhc2VzICdhcycsICdhczMnCisgICAgICBmaWxlbmFtZXMgJyouYXMnCisgICAgICBtaW1ldHlwZXMgJ2FwcGxpY2F0aW9uL3gtYWN0aW9uc2NyaXB0JworCisgICAgICBzdGF0ZSA6Y29tbWVudHNfYW5kX3doaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlICVyKC8vLio/JCksIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBydWxlICVyKC9cKi4qP1wqLyltLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXhwcl9zdGFydCBkbworICAgICAgICBtaXhpbiA6Y29tbWVudHNfYW5kX3doaXRlc3BhY2UKKworICAgICAgICBydWxlICVyKC8pIGRvCisgICAgICAgICAgdG9rZW4gU3RyOjpSZWdleAorICAgICAgICAgIGdvdG8gOnJlZ2V4CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1t7XS8sIFB1bmN0dWF0aW9uLCA6b2JqZWN0CisKKyAgICAgICAgcnVsZSAvLywgVGV4dCwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cmVnZXggZG8KKyAgICAgICAgcnVsZSAlcigvKSBkbworICAgICAgICAgIHRva2VuIFN0cjo6UmVnZXgKKyAgICAgICAgICBnb3RvIDpyZWdleF9lbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAlcihbXi9dXG4pLCBFcnJvciwgOnBvcCEKKworICAgICAgICBydWxlIC9cbi8sIEVycm9yLCA6cG9wIQorICAgICAgICBydWxlIC9cW1xeLywgU3RyOjpFc2NhcGUsIDpyZWdleF9ncm91cAorICAgICAgICBydWxlIC9cWy8sIFN0cjo6RXNjYXBlLCA6cmVnZXhfZ3JvdXAKKyAgICAgICAgcnVsZSAvXFwuLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAlcntbKF1bP11bOj08IV19LCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9be11bXGQsXStbfV0vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9bKCk/XS8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgLy4vLCBTdHI6OlJlZ2V4CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJlZ2V4X2VuZCBkbworICAgICAgICBydWxlIC9bZ2ltXSsvLCBTdHI6OlJlZ2V4LCA6cG9wIQorICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyZWdleF9ncm91cCBkbworICAgICAgICAjIHNwZWNpYWxseSBoaWdobGlnaHQgLyBpbiBhIGdyb3VwIHRvIGluZGljYXRlIHRoYXQgaXQgZG9lc24ndAorICAgICAgICAjIGNsb3NlIHRoZSByZWdleAorICAgICAgICBydWxlIC9cLy8sIFN0cjo6RXNjYXBlCisKKyAgICAgICAgcnVsZSAlcihbXi9dXG4pIGRvCisgICAgICAgICAgdG9rZW4gRXJyb3IKKyAgICAgICAgICBwb3AhIDIKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXF0vLCBTdHI6OkVzY2FwZSwgOnBvcCEKKyAgICAgICAgcnVsZSAvXFwuLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvLi8sIFN0cjo6UmVnZXgKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YmFkX3JlZ2V4IGRvCisgICAgICAgIHJ1bGUgL1teXG5dKy8sIEVycm9yLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIEBrZXl3b3JkcyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBmb3IgaW4gd2hpbGUgZG8gYnJlYWsgcmV0dXJuIGNvbnRpbnVlIHN3aXRjaCBjYXNlIGRlZmF1bHQKKyAgICAgICAgICBpZiBlbHNlIHRocm93IHRyeSBjYXRjaCBmaW5hbGx5IG5ldyBkZWxldGUgdHlwZW9mIGlzCisgICAgICAgICAgdGhpcyB3aXRoCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5kZWNsYXJhdGlvbnMKKyAgICAgICAgQGRlY2xhcmF0aW9ucyB8fD0gU2V0Lm5ldyAldyh2YXIgd2l0aCBmdW5jdGlvbikKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5yZXNlcnZlZAorICAgICAgICBAcmVzZXJ2ZWQgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgZHluYW1pYyBmaW5hbCBpbnRlcm5hbCBuYXRpdmUgcHVibGljIHByb3RlY3RlZCBwcml2YXRlIGNsYXNzIGNvbnN0CisgICAgICAgICAgb3ZlcnJpZGUgc3RhdGljIHBhY2thZ2UgaW50ZXJmYWNlIGV4dGVuZHMgaW1wbGVtZW50cyBuYW1lc3BhY2UKKyAgICAgICAgICBzZXQgZ2V0IGltcG9ydCBpbmNsdWRlIHN1cGVyIGZsYXNoX3Byb3h5IG9iamVjdF9wcm94eSB0cmFjZQorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29uc3RhbnRzCisgICAgICAgIEBjb25zdGFudHMgfHw9IFNldC5uZXcgJXcodHJ1ZSBmYWxzZSBudWxsIE5hTiBJbmZpbml0eSB1bmRlZmluZWQpCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSAldygKKyAgICAgICAgICB2b2lkIEZ1bmN0aW9uIE1hdGggQ2xhc3MKKyAgICAgICAgICBPYmplY3QgUmVnRXhwIGRlY29kZVVSSQorICAgICAgICAgIGRlY29kZVVSSUNvbXBvbmVudCBlbmNvZGVVUkkgZW5jb2RlVVJJQ29tcG9uZW50CisgICAgICAgICAgZXZhbCBpc0Zpbml0ZSBpc05hTiBwYXJzZUZsb2F0IHBhcnNlSW50IHRoaXMKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGlkID0gL1skYS16QS1aX11bYS16QS1aMC05X10qLworCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC9cQVxzKiMhLio/XG4vbSwgQ29tbWVudDo6UHJlcHJvYywgOnN0YXRlbWVudAorICAgICAgICBydWxlIC9cbi8sIFRleHQsIDpzdGF0ZW1lbnQKKyAgICAgICAgcnVsZSAlcigoPzw9XG4pKD89XHN8L3w8IS0tKSksIFRleHQsIDpleHByX3N0YXJ0CisgICAgICAgIG1peGluIDpjb21tZW50c19hbmRfd2hpdGVzcGFjZQorICAgICAgICBydWxlICVyKFwrXCsgfCAtLSB8IH4gfCAmJiB8IFx8XHwgfCBcXCg/PVxuKSB8IDw8IHwgPj4+PyB8ID09PQorICAgICAgICAgICAgICAgfCAhPT0gKXgsCisgICAgICAgICAgT3BlcmF0b3IsIDpleHByX3N0YXJ0CisgICAgICAgIHJ1bGUgJXIoWzotPD4rKiUmfFxeLyE9XT0/KSwgT3BlcmF0b3IsIDpleHByX3N0YXJ0CisgICAgICAgIHJ1bGUgL1soXFssXS8sIFB1bmN0dWF0aW9uLCA6ZXhwcl9zdGFydAorICAgICAgICBydWxlIC87LywgUHVuY3R1YXRpb24sIDpzdGF0ZW1lbnQKKyAgICAgICAgcnVsZSAvWylcXS5dLywgUHVuY3R1YXRpb24KKworICAgICAgICBydWxlIC9bP10vIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDp0ZXJuYXJ5CisgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9be31dLywgUHVuY3R1YXRpb24sIDpzdGF0ZW1lbnQKKworICAgICAgICBydWxlIGlkIGRvIHxtfAorICAgICAgICAgIGlmIHNlbGYuY2xhc3Mua2V5d29yZHMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuZGVjbGFyYXRpb25zLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OkRlY2xhcmF0aW9uCisgICAgICAgICAgICBwdXNoIDpleHByX3N0YXJ0CisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5yZXNlcnZlZC5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpSZXNlcnZlZAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuY29uc3RhbnRzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5idWlsdGlucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6T3RoZXIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXC1bMC05XVswLTldKlwuWzAtOV0rKFtlRV1bMC05XSspP1tmZF0/LywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC8weFswLTlhLWZBLUZdKy8sIE51bTo6SGV4CisgICAgICAgIHJ1bGUgL1wtWzAtOV0rLywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLyIoXFxcXHxcXCJ8W14iXSkqIi8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLycoXFxcXHxcXCd8W14nXSkqJy8sIFN0cjo6U2luZ2xlCisgICAgICBlbmQKKworICAgICAgIyBicmFjZWQgcGFydHMgdGhhdCBhcmVuJ3Qgb2JqZWN0IGxpdGVyYWxzCisgICAgICBzdGF0ZSA6c3RhdGVtZW50IGRvCisgICAgICAgIHJ1bGUgLygje2lkfSkoXHMqKSg6KS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6TGFiZWwsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1t7fV0vLCBQdW5jdHVhdGlvbgorCisgICAgICAgIG1peGluIDpleHByX3N0YXJ0CisgICAgICBlbmQKKworICAgICAgIyBvYmplY3QgbGl0ZXJhbHMKKyAgICAgIHN0YXRlIDpvYmplY3QgZG8KKyAgICAgICAgbWl4aW4gOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgL1t9XS8gZG8KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgIGdvdG8gOnN0YXRlbWVudAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oI3tpZH0pKFxzKikoOikvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OkF0dHJpYnV0ZSwgVGV4dCwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDpleHByX3N0YXJ0CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLzovLCBQdW5jdHVhdGlvbgorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgICMgdGVybmFyeSBleHByZXNzaW9ucywgd2hlcmUgPGlkPjogaXMgbm90IGEgbGFiZWwhCisgICAgICBzdGF0ZSA6dGVybmFyeSBkbworICAgICAgICBydWxlIC86LyBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgZ290byA6ZXhwcl9zdGFydAorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9hcGFjaGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9hcGFjaGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4ZWI5NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2FwYWNoZS5yYgpAQCAtMCwwICsxLDcxIEBACityZXF1aXJlICd5YW1sJworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIEFwYWNoZSA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJBcGFjaGUiCisgICAgICBkZXNjICdjb25maWd1cmF0aW9uIGZpbGVzIGZvciBBcGFjaGUgd2ViIHNlcnZlcicKKyAgICAgIHRhZyAnYXBhY2hlJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtaHR0cGQtY29uZicsICd0ZXh0L3gtYXBhY2hlLWNvbmYnCisgICAgICBmaWxlbmFtZXMgJy5odGFjY2VzcycsICdodHRwZC5jb25mJworCisgICAgICBjbGFzcyA8PCBzZWxmCisgICAgICAgIGF0dHJfcmVhZGVyIDprZXl3b3JkcworICAgICAgZW5kCisgICAgICAjIExvYWQgQXBhY2hlIGtleXdvcmRzIGZyb20gc2VwYXJhdGUgWU1MIGZpbGUKKyAgICAgIEBrZXl3b3JkcyA9IDo6WUFNTC5sb2FkKEZpbGUub3BlbihQYXRobmFtZS5uZXcoX19GSUxFX18pLmRpcm5hbWUuam9pbignYXBhY2hlL2tleXdvcmRzLnltbCcpKSkudGFwIGRvIHxofAorICAgICAgICBoLmVhY2ggZG8gfGssdnwKKyAgICAgICAgICBoW2tdID0gU2V0Lm5ldyB2CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBuYW1lX2Zvcl90b2tlbih0b2tlbiwga3d0eXBlLCB0a3R5cGUpCisgICAgICAgIGlmIHNlbGYuY2xhc3Mua2V5d29yZHNba3d0eXBlXS5pbmNsdWRlPyB0b2tlbgorICAgICAgICAgIHRrdHlwZQorICAgICAgICBlbHNlCisgICAgICAgICAgVGV4dAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6d2hpdGVzcGFjZSBkbworICAgICAgICBydWxlIC9cIy4qLywgQ29tbWVudAorICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSAvKDxcLz8pKFx3KykvIGRvIHxtfAorICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgbmFtZV9mb3JfdG9rZW4obVsyXS5kb3duY2FzZSwgOnNlY3Rpb25zLCBOYW1lOjpMYWJlbCkKKyAgICAgICAgICBwdXNoIDpzZWN0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1x3Ky8gZG8gfG18CisgICAgICAgICAgdG9rZW4gbmFtZV9mb3JfdG9rZW4obVswXS5kb3duY2FzZSwgOmRpcmVjdGl2ZXMsIE5hbWU6OkNsYXNzKQorICAgICAgICAgIHB1c2ggOmRpcmVjdGl2ZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c2VjdGlvbiBkbworICAgICAgICAjIE1hdGNoIHNlY3Rpb24gYXJndW1lbnRzCisgICAgICAgIHJ1bGUgLyhbXj5dKyk/KD4oPzpcclxuP3xcbik/KS8gZG8gfG18CisgICAgICAgICAgZ3JvdXBzIExpdGVyYWw6OlN0cmluZzo6UmVnZXgsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkaXJlY3RpdmUgZG8KKyAgICAgICAgIyBNYXRjaCB2YWx1ZSBsaXRlcmFscyBhbmQgb3RoZXIgZGlyZWN0aXZlIGFyZ3VtZW50cworICAgICAgICBydWxlIC9cclxuP3xcbi8sIFRleHQsIDpwb3AhCisKKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKworICAgICAgICBydWxlIC9cUysvIGRvIHxtfAorICAgICAgICAgIHRva2VuIG5hbWVfZm9yX3Rva2VuKG1bMF0sIDp2YWx1ZXMsIExpdGVyYWw6OlN0cmluZzo6U3ltYm9sKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvYXBhY2hlL2tleXdvcmRzLnltbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2FwYWNoZS9rZXl3b3Jkcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0MTVkOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2FwYWNoZS9rZXl3b3Jkcy55bWwKQEAgLTAsMCArMSw3NjQgQEAKKzpzZWN0aW9uczoKKyAgLSAiZGlyZWN0b3J5IgorICAtICJkaXJlY3RvcnltYXRjaCIKKyAgLSAiZmlsZXMiCisgIC0gImZpbGVzbWF0Y2giCisgIC0gImlmZGVmaW5lIgorICAtICJpZm1vZHVsZSIKKyAgLSAibGltaXQiCisgIC0gImxpbWl0ZXhjZXB0IgorICAtICJsb2NhdGlvbiIKKyAgLSAibG9jYXRpb25tYXRjaCIKKyAgLSAicHJveHkiCisgIC0gInByb3h5bWF0Y2giCisgIC0gInZpcnR1YWxob3N0IgorCis6ZGlyZWN0aXZlczoKKyAgLSAiYWNjZXB0ZmlsdGVyIgorICAtICJhY2NlcHRtdXRleCIKKyAgLSAiYWNjZXB0cGF0aGluZm8iCisgIC0gImFjY2Vzc2NvbmZpZyIKKyAgLSAiYWNjZXNzZmlsZW5hbWUiCisgIC0gImFjdGlvbiIKKyAgLSAiYWRkYWx0IgorICAtICJhZGRhbHRieWVuY29kaW5nIgorICAtICJhZGRhbHRieXR5cGUiCisgIC0gImFkZGNoYXJzZXQiCisgIC0gImFkZGRlZmF1bHRjaGFyc2V0IgorICAtICJhZGRkZXNjcmlwdGlvbiIKKyAgLSAiYWRkZW5jb2RpbmciCisgIC0gImFkZGhhbmRsZXIiCisgIC0gImFkZGljb24iCisgIC0gImFkZGljb25ieWVuY29kaW5nIgorICAtICJhZGRpY29uYnl0eXBlIgorICAtICJhZGRpbnB1dGZpbHRlciIKKyAgLSAiYWRkbGFuZ3VhZ2UiCisgIC0gImFkZG1vZHVsZSIKKyAgLSAiYWRkbW9kdWxlaW5mbyIKKyAgLSAiYWRkb3V0cHV0ZmlsdGVyIgorICAtICJhZGRvdXRwdXRmaWx0ZXJieXR5cGUiCisgIC0gImFkZHR5cGUiCisgIC0gImFnZW50bG9nIgorICAtICJhbGlhcyIKKyAgLSAiYWxpYXNtYXRjaCIKKyAgLSAiYWxsb3ciCisgIC0gImFsbG93Y29ubmVjdCIKKyAgLSAiYWxsb3dlbmNvZGVkc2xhc2hlcyIKKyAgLSAiYWxsb3dtZXRob2RzIgorICAtICJhbGxvd292ZXJyaWRlIgorICAtICJhbGxvd292ZXJyaWRlbGlzdCIKKyAgLSAiYW5vbnltb3VzIgorICAtICJhbm9ueW1vdXNfYXV0aG9yaXRhdGl2ZSIKKyAgLSAiYW5vbnltb3VzX2xvZ2VtYWlsIgorICAtICJhbm9ueW1vdXNfbXVzdGdpdmVlbWFpbCIKKyAgLSAiYW5vbnltb3VzX25vdXNlcmlkIgorICAtICJhbm9ueW1vdXNfdmVyaWZ5ZW1haWwiCisgIC0gImFzc2lnbnVzZXJpZCIKKyAgLSAiYXV0aGF1dGhvcml0YXRpdmUiCisgIC0gImF1dGhkYmF1dGhvcml0YXRpdmUiCisgIC0gImF1dGhkYmdyb3VwZmlsZSIKKyAgLSAiYXV0aGRibWF1dGhvcml0YXRpdmUiCisgIC0gImFzeW5jcmVxdWVzdHdvcmtlcmZhY3RvciIKKyAgLSAiYXV0aGJhc2ljYXV0aG9yaXRhdGl2ZSIKKyAgLSAiYXV0aGJhc2ljZmFrZSIKKyAgLSAiYXV0aGJhc2ljcHJvdmlkZXIiCisgIC0gImF1dGhiYXNpY3VzZWRpZ2VzdGFsZ29yaXRobSIKKyAgLSAiYXV0aGRiZHVzZXJwd3F1ZXJ5IgorICAtICJhdXRoZGJkdXNlcnJlYWxtcXVlcnkiCisgIC0gImF1dGhkYm1ncm91cGZpbGUiCisgIC0gImF1dGhkYm10eXBlIgorICAtICJhdXRoZGJtdXNlcmZpbGUiCisgIC0gImF1dGhkYnVzZXJmaWxlIgorICAtICJhdXRoZGlnZXN0YWxnb3JpdGhtIgorICAtICJhdXRoZGlnZXN0ZG9tYWluIgorICAtICJhdXRoZGlnZXN0ZmlsZSIKKyAgLSAiYXV0aGRpZ2VzdGdyb3VwZmlsZSIKKyAgLSAiYXV0aGRpZ2VzdG5jY2hlY2siCisgIC0gImF1dGhkaWdlc3Rub25jZWZvcm1hdCIKKyAgLSAiYXV0aGRpZ2VzdG5vbmNlbGlmZXRpbWUiCisgIC0gImF1dGhkaWdlc3Rwcm92aWRlciIKKyAgLSAiYXV0aGRpZ2VzdHFvcCIKKyAgLSAiYXV0aGRpZ2VzdHNobWVtc2l6ZSIKKyAgLSAiYXV0aGZvcm1hdXRob3JpdGF0aXZlIgorICAtICJhdXRoZm9ybWJvZHkiCisgIC0gImF1dGhmb3JtZGlzYWJsZW5vc3RvcmUiCisgIC0gImF1dGhmb3JtZmFrZWJhc2ljYXV0aCIKKyAgLSAiYXV0aGZvcm1sb2NhdGlvbiIKKyAgLSAiYXV0aGZvcm1sb2dpbnJlcXVpcmVkbG9jYXRpb24iCisgIC0gImF1dGhmb3JtbG9naW5zdWNjZXNzbG9jYXRpb24iCisgIC0gImF1dGhmb3JtbG9nb3V0bG9jYXRpb24iCisgIC0gImF1dGhmb3JtbWV0aG9kIgorICAtICJhdXRoZm9ybW1pbWV0eXBlIgorICAtICJhdXRoZm9ybXBhc3N3b3JkIgorICAtICJhdXRoZm9ybXByb3ZpZGVyIgorICAtICJhdXRoZm9ybXNpdGVwYXNzcGhyYXNlIgorICAtICJhdXRoZm9ybXNpemUiCisgIC0gImF1dGhmb3JtdXNlcm5hbWUiCisgIC0gImF1dGhncm91cGZpbGUiCisgIC0gImF1dGhsZGFwYXV0aG9yaXRhdGl2ZSIKKyAgLSAiYXV0aGxkYXBhdXRob3JpemVwcmVmaXgiCisgIC0gImF1dGhsZGFwYmluZGF1dGhvcml0YXRpdmUiCisgIC0gImF1dGhsZGFwYmluZGRuIgorICAtICJhdXRobGRhcGJpbmRwYXNzd29yZCIKKyAgLSAiYXV0aGxkYXBjaGFyc2V0Y29uZmlnIgorICAtICJhdXRobGRhcGNvbXBhcmVhc3VzZXIiCisgIC0gImF1dGhsZGFwY29tcGFyZWRub25zZXJ2ZXIiCisgIC0gImF1dGhsZGFwZGVyZWZlcmVuY2VhbGlhc2VzIgorICAtICJhdXRobGRhcGVuYWJsZWQiCisgIC0gImF1dGhsZGFwZnJvbnRwYWdlaGFjayIKKyAgLSAiYXV0aGxkYXBncm91cGF0dHJpYnV0ZSIKKyAgLSAiYXV0aGxkYXBncm91cGF0dHJpYnV0ZWlzZG4iCisgIC0gImF1dGhsZGFwaW5pdGlhbGJpbmRhc3VzZXIiCisgIC0gImF1dGhsZGFwaW5pdGlhbGJpbmRwYXR0ZXJuIgorICAtICJhdXRobGRhcG1heHN1Ymdyb3VwZGVwdGgiCisgIC0gImF1dGhsZGFwcmVtb3RldXNlcmF0dHJpYnV0ZSIKKyAgLSAiYXV0aGxkYXByZW1vdGV1c2VyaXNkbiIKKyAgLSAiYXV0aGxkYXBzZWFyY2hhc3VzZXIiCisgIC0gImF1dGhsZGFwc3ViZ3JvdXBhdHRyaWJ1dGUiCisgIC0gImF1dGhsZGFwc3ViZ3JvdXBjbGFzcyIKKyAgLSAiYXV0aGxkYXB1cmwiCisgIC0gImF1dGhtZXJnaW5nIgorICAtICJhdXRobmFtZSIKKyAgLSAiYXV0aG5jYWNoZWNvbnRleHQiCisgIC0gImF1dGhuY2FjaGVlbmFibGUiCisgIC0gImF1dGhuY2FjaGVwcm92aWRlZm9yIgorICAtICJhdXRobmNhY2hlc29jYWNoZSIKKyAgLSAiYXV0aG5jYWNoZXRpbWVvdXQiCisgIC0gImF1dGhuemZjZ2ljaGVja2F1dGhucHJvdmlkZXIiCisgIC0gImF1dGhuemZjZ2lkZWZpbmVwcm92aWRlciIKKyAgLSAiYXV0aHR5cGUiCisgIC0gImF1dGh1c2VyZmlsZSIKKyAgLSAiYXV0aHpkYmRsb2dpbnRvcmVmZXJlciIKKyAgLSAiYXV0aHpkYmRxdWVyeSIKKyAgLSAiYXV0aHpkYmRyZWRpcmVjdHF1ZXJ5IgorICAtICJhdXRoemRibXR5cGUiCisgIC0gImF1dGh6c2VuZGZvcmJpZGRlbm9uZmFpbHVyZSIKKyAgLSAiYmFsYW5jZXJncm93dGgiCisgIC0gImJhbGFuY2VyaW5oZXJpdCIKKyAgLSAiYmFsYW5jZXJtZW1iZXIiCisgIC0gImJhbGFuY2VycGVyc2lzdCIKKyAgLSAiYmluZGFkZHJlc3MiCisgIC0gImJyb3dzZXJtYXRjaCIKKyAgLSAiYnJvd3Nlcm1hdGNobm9jYXNlIgorICAtICJiczIwMDBhY2NvdW50IgorICAtICJidWZmZXJlZGxvZ3MiCisgIC0gImJ1ZmZlcnNpemUiCisgIC0gImNhY2hlZGVmYXVsdGV4cGlyZSIKKyAgLSAiY2FjaGVkZXRhaWxoZWFkZXIiCisgIC0gImNhY2hlZGlybGVuZ3RoIgorICAtICJjYWNoZWRpcmxldmVscyIKKyAgLSAiY2FjaGVkaXNhYmxlIgorICAtICJjYWNoZWVuYWJsZSIKKyAgLSAiY2FjaGVleHBpcnljaGVjayIKKyAgLSAiY2FjaGVmaWxlIgorICAtICJjYWNoZWZvcmNlY29tcGxldGlvbiIKKyAgLSAiY2FjaGVnY2NsZWFuIgorICAtICJjYWNoZWdjZGFpbHkiCisgIC0gImNhY2hlZ2NpbnRlcnZhbCIKKyAgLSAiY2FjaGVnY21lbXVzYWdlIgorICAtICJjYWNoZWdjdW51c2VkIgorICAtICJjYWNoZWhlYWRlciIKKyAgLSAiY2FjaGVpZ25vcmVjYWNoZWNvbnRyb2wiCisgIC0gImNhY2hlaWdub3JlaGVhZGVycyIKKyAgLSAiY2FjaGVpZ25vcmVub2xhc3Rtb2QiCisgIC0gImNhY2hlaWdub3JlcXVlcnlzdHJpbmciCisgIC0gImNhY2hlaWdub3JldXJsc2Vzc2lvbmlkZW50aWZpZXJzIgorICAtICJjYWNoZWtleWJhc2V1cmwiCisgIC0gImNhY2hlbGFzdG1vZGlmaWVkZmFjdG9yIgorICAtICJjYWNoZWxvY2siCisgIC0gImNhY2hlbG9ja21heGFnZSIKKyAgLSAiY2FjaGVsb2NrcGF0aCIKKyAgLSAiY2FjaGVtYXhleHBpcmUiCisgIC0gImNhY2hlbWF4ZmlsZXNpemUiCisgIC0gImNhY2hlbWluZXhwaXJlIgorICAtICJjYWNoZW1pbmZpbGVzaXplIgorICAtICJjYWNoZW5lZ290aWF0ZWRkb2NzIgorICAtICJjYWNoZXF1aWNraGFuZGxlciIKKyAgLSAiY2FjaGVyZWFkc2l6ZSIKKyAgLSAiY2FjaGVyZWFkdGltZSIKKyAgLSAiY2FjaGVyb290IgorICAtICJjYWNoZXNpemUiCisgIC0gImNhY2hldGltZW1hcmdpbiIKKyAgLSAiY2FjaGVzb2NhY2hlIgorICAtICJjYWNoZXNvY2FjaGVtYXhzaXplIgorICAtICJjYWNoZXNvY2FjaGVtYXh0aW1lIgorICAtICJjYWNoZXNvY2FjaGVtaW50aW1lIgorICAtICJjYWNoZXNvY2FjaGVyZWFkc2l6ZSIKKyAgLSAiY2FjaGVzb2NhY2hlcmVhZHRpbWUiCisgIC0gImNhY2hlc3RhbGVvbmVycm9yIgorICAtICJjYWNoZXN0b3JlZXhwaXJlZCIKKyAgLSAiY2FjaGVzdG9yZW5vc3RvcmUiCisgIC0gImNhY2hlc3RvcmVwcml2YXRlIgorICAtICJjZ2lkc2NyaXB0dGltZW91dCIKKyAgLSAiY2dpbWFwZXh0ZW5zaW9uIgorICAtICJjZ2lwYXNzYXV0aCIKKyAgLSAiY2hhcnNldGRlZmF1bHQiCisgIC0gImNoYXJzZXRvcHRpb25zIgorICAtICJjaGFyc2V0c291cmNlZW5jIgorICAtICJjaGVja2Nhc2Vvbmx5IgorICAtICJjaGVja3NwZWxsaW5nIgorICAtICJjaGlsZHBlcnVzZXJpZCIKKyAgLSAiY2xlYXJtb2R1bGVsaXN0IgorICAtICJjaHJvb3RkaXIiCisgIC0gImNvbnRlbnRkaWdlc3QiCisgIC0gImNvb2tpZWRvbWFpbiIKKyAgLSAiY29va2llZXhwaXJlcyIKKyAgLSAiY29va2llbG9nIgorICAtICJjb29raWVuYW1lIgorICAtICJjb29raWVzdHlsZSIKKyAgLSAiY29va2lldHJhY2tpbmciCisgIC0gImNvcmVkdW1wZGlyZWN0b3J5IgorICAtICJjdXN0b21sb2ciCisgIC0gImRhdiIKKyAgLSAiZGF2ZGVwdGhpbmZpbml0eSIKKyAgLSAiZGF2Z2VuZXJpY2xvY2tkYiIKKyAgLSAiZGF2bG9ja2RiIgorICAtICJkYXZtaW50aW1lb3V0IgorICAtICJkYmRleHB0aW1lIgorICAtICJkYmRpbml0c3FsIgorICAtICJkYmRrZWVwIgorICAtICJkYmRtYXgiCisgIC0gImRiZG1pbiIKKyAgLSAiZGJkcGFyYW1zIgorICAtICJkYmRwZXJzaXN0IgorICAtICJkYmRwcmVwYXJlc3FsIgorICAtICJkYmRyaXZlciIKKyAgLSAiZGVmYXVsdGljb24iCisgIC0gImRlZmF1bHRsYW5ndWFnZSIKKyAgLSAiZGVmYXVsdG1vZGUiCisgIC0gImRlZmF1bHRydW50aW1lZGlyIgorICAtICJkZWZhdWx0dHlwZSIKKyAgLSAiZGVmaW5lIgorICAtICJkZWZsYXRlYnVmZmVyc2l6ZSIKKyAgLSAiZGVmbGF0ZWNvbXByZXNzaW9ubGV2ZWwiCisgIC0gImRlZmxhdGVmaWx0ZXJub3RlIgorICAtICJkZWZsYXRlaW5mbGF0ZWxpbWl0cmVxdWVzdGJvZHkiCisgIC0gImRlZmxhdGVpbmZsYXRlcmF0aW9idXJzdCIKKyAgLSAiZGVmbGF0ZWluZmxhdGVyYXRpb2xpbWl0IgorICAtICJkZWZsYXRlbWVtbGV2ZWwiCisgIC0gImRlZmxhdGV3aW5kb3dzaXplIgorICAtICJkZW55IgorICAtICJkaXJlY3RvcnljaGVja2hhbmRsZXIiCisgIC0gImRpcmVjdG9yeWluZGV4IgorICAtICJkaXJlY3RvcnlpbmRleHJlZGlyZWN0IgorICAtICJkaXJlY3RvcnlzbGFzaCIKKyAgLSAiZG9jdGl0bGUiCisgIC0gImRvY3RyYWlsZXIiCisgIC0gImRvY3VtZW50cm9vdCIKKyAgLSAiZHRyYWNlcHJpdmlsZWdlcyIKKyAgLSAiZHVtcGlvaW5wdXQiCisgIC0gImR1bXBpb291dHB1dCIKKyAgLSAiZW5hYmxlZXhjZXB0aW9uaG9vayIKKyAgLSAiZW5hYmxlbW1hcCIKKyAgLSAiZW5hYmxlc2VuZGZpbGUiCisgIC0gImVycm9yIgorICAtICJlcnJvcmRvY3VtZW50IgorICAtICJlcnJvcmxvZyIKKyAgLSAiZXJyb3Jsb2dmb3JtYXQiCisgIC0gImV4YW1wbGUiCisgIC0gImV4cGlyZXNhY3RpdmUiCisgIC0gImV4cGlyZXNieXR5cGUiCisgIC0gImV4cGlyZXNkZWZhdWx0IgorICAtICJleHRlbmRlZHN0YXR1cyIKKyAgLSAiZXh0ZmlsdGVyZGVmaW5lIgorICAtICJleHRmaWx0ZXJvcHRpb25zIgorICAtICJmYWxsYmFja3Jlc291cmNlIgorICAtICJmYW5jeWluZGV4aW5nIgorICAtICJmaWxlZXRhZyIKKyAgLSAiZmlsdGVyY2hhaW4iCisgIC0gImZpbHRlcmRlY2xhcmUiCisgIC0gImZpbHRlcnByb3RvY29sIgorICAtICJmaWx0ZXJwcm92aWRlciIKKyAgLSAiZmlsdGVydHJhY2UiCisgIC0gImZvcmNlbGFuZ3VhZ2Vwcmlvcml0eSIKKyAgLSAiZm9yY2V0eXBlIgorICAtICJmb3JlbnNpY2xvZyIKKyAgLSAiZ2xvYmFsbG9nIgorICAtICJncHJvZmRpciIKKyAgLSAiZ3JhY2VmdWxzaHV0ZG93bnRpbWVvdXQiCisgIC0gImdyb3VwIgorICAtICJoMmRpcmVjdCIKKyAgLSAiaDJrZWVwYWxpdmV0aW1lb3V0IgorICAtICJoMm1heHNlc3Npb25zdHJlYW1zIgorICAtICJoMm1heHdvcmtlcmlkbGVzZWNvbmRzIgorICAtICJoMm1heHdvcmtlcnMiCisgIC0gImgybWlud29ya2VycyIKKyAgLSAiaDJtb2Rlcm50bHNvbmx5IgorICAtICJoMnB1c2giCisgIC0gImgycHVzaGRpYXJ5c2l6ZSIKKyAgLSAiaDJwdXNocHJpb3JpdHkiCisgIC0gImgyc2VyaWFsaXplaGVhZGVycyIKKyAgLSAiaDJzZXNzaW9uZXh0cmFmaWxlcyIKKyAgLSAiaDJzdHJlYW1tYXhtZW1zaXplIgorICAtICJoMnN0cmVhbXRpbWVvdXQiCisgIC0gImgydGltZW91dCIKKyAgLSAiaDJ0bHNjb29sZG93bnNlY3MiCisgIC0gImgydGxzd2FybXVwc2l6ZSIKKyAgLSAiaDJ1cGdyYWRlIgorICAtICJoMndpbmRvd3NpemUiCisgIC0gImhlYWRlciIKKyAgLSAiaGVhZGVybmFtZSIKKyAgLSAiaGVhZHByZWZpeCIKKyAgLSAiaGVhZHN1ZmZpeCIKKyAgLSAiaGlkZXN5cyIKKyAgLSAiaGlkZXVybCIKKyAgLSAiaGVhcnRiZWF0YWRkcmVzcyIKKyAgLSAiaGVhcnRiZWF0bGlzdGVuIgorICAtICJoZWFydGJlYXRtYXhzZXJ2ZXJzIgorICAtICJoZWFydGJlYXRzdG9yYWdlIgorICAtICJoZWFydGJlYXRzdG9yYWdlIgorICAtICJob3N0bmFtZWxvb2t1cHMiCisgIC0gImh0bWxkaXIiCisgIC0gImh0dHBsb2dmaWxlIgorICAtICJpZGVudGl0eWNoZWNrIgorICAtICJpZGVudGl0eWNoZWNrdGltZW91dCIKKyAgLSAiaW1hcGJhc2UiCisgIC0gImltYXBkZWZhdWx0IgorICAtICJpbWFwbWVudSIKKyAgLSAiaW5jbHVkZSIKKyAgLSAiaW5jbHVkZW9wdGlvbmFsIgorICAtICJpbmRleGhlYWRpbnNlcnQiCisgIC0gImluZGV4aWdub3JlIgorICAtICJpbmRleGlnbm9yZXJlc2V0IgorICAtICJpbmRleG9wdGlvbnMiCisgIC0gImluZGV4b3JkZXJkZWZhdWx0IgorICAtICJpbmRleHN0eWxlc2hlZXQiCisgIC0gImlucHV0c2VkIgorICAtICJpc2FwaWFwcGVuZGxvZ3RvZXJyb3JzIgorICAtICJpc2FwaWFwcGVuZGxvZ3RvcXVlcnkiCisgIC0gImlzYXBpY2FjaGVmaWxlIgorICAtICJpc2FwaWZha2Vhc3luYyIKKyAgLSAiaXNhcGlsb2dub3RzdXBwb3J0ZWQiCisgIC0gImlzYXBpcmVhZGFoZWFkYnVmZmVyIgorICAtICJrZWVwYWxpdmUiCisgIC0gImtlZXBhbGl2ZXRpbWVvdXQiCisgIC0gImtlcHRib2R5c2l6ZSIKKyAgLSAibGFuZ3VhZ2Vwcmlvcml0eSIKKyAgLSAibGFzdHVybHMiCisgIC0gImxkYXBjYWNoZWVudHJpZXMiCisgIC0gImxkYXBjYWNoZXR0bCIKKyAgLSAibGRhcGNvbm5lY3Rpb25wb29sdHRsIgorICAtICJsZGFwY29ubmVjdGlvbnRpbWVvdXQiCisgIC0gImxkYXBsaWJyYXJ5ZGVidWciCisgIC0gImxkYXBvcGNhY2hlZW50cmllcyIKKyAgLSAibGRhcG9wY2FjaGV0dGwiCisgIC0gImxkYXByZWZlcnJhbGhvcGxpbWl0IgorICAtICJsZGFwcmVmZXJyYWxzIgorICAtICJsZGFwcmV0cmllcyIKKyAgLSAibGRhcHJldHJ5ZGVsYXkiCisgIC0gImxkYXBzaGFyZWRjYWNoZWZpbGUiCisgIC0gImxkYXBzaGFyZWRjYWNoZXNpemUiCisgIC0gImxkYXB0aW1lb3V0IgorICAtICJsZGFwdHJ1c3RlZGNhIgorICAtICJsZGFwdHJ1c3RlZGNhdHlwZSIKKyAgLSAibGRhcHRydXN0ZWRjbGllbnRjZXJ0IgorICAtICJsZGFwdHJ1c3RlZGdsb2JhbGNlcnQiCisgIC0gImxkYXB0cnVzdGVkbW9kZSIKKyAgLSAibGRhcHZlcmlmeXNlcnZlcmNlcnQiCisgIC0gImxpbWl0aW50ZXJuYWxyZWN1cnNpb24iCisgIC0gImxpbWl0cmVxdWVzdGJvZHkiCisgIC0gImxpbWl0cmVxdWVzdGZpZWxkcyIKKyAgLSAibGltaXRyZXF1ZXN0ZmllbGRzaXplIgorICAtICJsaW1pdHJlcXVlc3RsaW5lIgorICAtICJsaW1pdHhtbHJlcXVlc3Rib2R5IgorICAtICJsaXN0ZW4iCisgIC0gImxpc3RlbmJhY2tsb2ciCisgIC0gImxpc3RlbmNvcmVzYnVja2V0c3JhdGlvIgorICAtICJsb2FkZmlsZSIKKyAgLSAibG9hZG1vZHVsZSIKKyAgLSAibG9ja2ZpbGUiCisgIC0gImxvZ2Zvcm1hdCIKKyAgLSAibG9naW90cmFja3R0ZmIiCisgIC0gImxvZ2xldmVsIgorICAtICJsb2dtZXNzYWdlIgorICAtICJsdWFhdXRoenByb3ZpZGVyIgorICAtICJsdWFjb2RlY2FjaGUiCisgIC0gImx1YWhvb2thY2Nlc3NjaGVja2VyIgorICAtICJsdWFob29rYXV0aGNoZWNrZXIiCisgIC0gImx1YWhvb2tjaGVja3VzZXJpZCIKKyAgLSAibHVhaG9va2ZpeHVwcyIKKyAgLSAibHVhaG9va2luc2VydGZpbHRlciIKKyAgLSAibHVhaG9va2xvZyIKKyAgLSAibHVhaG9va21hcHRvc3RvcmFnZSIKKyAgLSAibHVhaG9va3RyYW5zbGF0ZW5hbWUiCisgIC0gImx1YWhvb2t0eXBlY2hlY2tlciIKKyAgLSAibHVhaW5oZXJpdCIKKyAgLSAibHVhaW5wdXRmaWx0ZXIiCisgIC0gImx1YW1hcGhhbmRsZXIiCisgIC0gImx1YW91dHB1dGZpbHRlciIKKyAgLSAibHVhcGFja2FnZWNwYXRoIgorICAtICJsdWFwYWNrYWdlcGF0aCIKKyAgLSAibHVhcXVpY2toYW5kbGVyIgorICAtICJsdWFyb290IgorICAtICJsdWFzY29wZSIKKyAgLSAibWF4Y2xpZW50cyIKKyAgLSAibWF4Y29ubmVjdGlvbnNwZXJjaGlsZCIKKyAgLSAibWF4a2VlcGFsaXZlcmVxdWVzdHMiCisgIC0gIm1heG1lbWZyZWUiCisgIC0gIm1heHJlcXVlc3RzcGVyY2hpbGQiCisgIC0gIm1heHJlcXVlc3RzcGVydGhyZWFkIgorICAtICJtYXhyYW5nZW92ZXJsYXBzIgorICAtICJtYXhyYW5nZXJldmVyc2FscyIKKyAgLSAibWF4cmFuZ2VzIgorICAtICJtYXhyZXF1ZXN0d29ya2VycyIKKyAgLSAibWF4c3BhcmVzZXJ2ZXJzIgorICAtICJtYXhzcGFyZXRocmVhZHMiCisgIC0gIm1heHRocmVhZHMiCisgIC0gIm1heHRocmVhZHNwZXJjaGlsZCIKKyAgLSAibWNhY2hlbWF4b2JqZWN0Y291bnQiCisgIC0gIm1jYWNoZW1heG9iamVjdHNpemUiCisgIC0gIm1jYWNoZW1heHN0cmVhbWluZ2J1ZmZlciIKKyAgLSAibWNhY2hlbWlub2JqZWN0c2l6ZSIKKyAgLSAibWNhY2hlcmVtb3ZhbGFsZ29yaXRobSIKKyAgLSAibWNhY2hlc2l6ZSIKKyAgLSAibWVtY2FjaGVjb25udHRsIgorICAtICJtZXJnZXRyYWlsZXJzIgorICAtICJtZXRhZGlyIgorICAtICJtZXRhZmlsZXMiCisgIC0gIm1ldGFzdWZmaXgiCisgIC0gIm1pbWVtYWdpY2ZpbGUiCisgIC0gIm1pbnNwYXJlc2VydmVycyIKKyAgLSAibWluc3BhcmV0aHJlYWRzIgorICAtICJtbWFwZmlsZSIKKyAgLSAibW9kZW1zdGFuZGFyZCIKKyAgLSAibW9kbWltZXVzZXBhdGhpbmZvIgorICAtICJtdWx0aXZpZXdzbWF0Y2giCisgIC0gIm11dGV4IgorICAtICJuYW1ldmlydHVhbGhvc3QiCisgIC0gIm5vY2FjaGUiCisgIC0gIm5vcHJveHkiCisgIC0gIm51bXNlcnZlcnMiCisgIC0gIm53c3NsdHJ1c3RlZGNlcnRzIgorICAtICJud3NzbHVwZ3JhZGVhYmxlIgorICAtICJvcHRpb25zIgorICAtICJvcmRlciIKKyAgLSAib3V0cHV0c2VkIgorICAtICJwYXNzZW52IgorICAtICJwaWRmaWxlIgorICAtICJwb3J0IgorICAtICJwcml2YXRlZGlyIgorICAtICJwcml2aWxlZ2VzbW9kZSIKKyAgLSAicHJvdG9jb2wiCisgIC0gInByb3RvY29sZWNobyIKKyAgLSAicHJvdG9jb2xzIgorICAtICJwcm90b2NvbHNob25vcm9yZGVyIgorICAtICJwcm94eWFkZGhlYWRlcnMiCisgIC0gInByb3h5YmFkaGVhZGVyIgorICAtICJwcm94eWJsb2NrIgorICAtICJwcm94eWRvbWFpbiIKKyAgLSAicHJveHllcnJvcm92ZXJyaWRlIgorICAtICJwcm94eWV4cHJlc3NkYm1maWxlIgorICAtICJwcm94eWV4cHJlc3NkYm10eXBlIgorICAtICJwcm94eWV4cHJlc3NlbmFibGUiCisgIC0gInByb3h5ZnRwZGlyY2hhcnNldCIKKyAgLSAicHJveHlmdHBlc2NhcGV3aWxkY2FyZHMiCisgIC0gInByb3h5ZnRwbGlzdG9ud2lsZGNhcmQiCisgIC0gInByb3h5aHRtbGJ1ZnNpemUiCisgIC0gInByb3h5aHRtbGNoYXJzZXRvdXQiCisgIC0gInByb3h5aHRtbGRvY3R5cGUiCisgIC0gInByb3h5aHRtbGVuYWJsZSIKKyAgLSAicHJveHlodG1sZXZlbnRzIgorICAtICJwcm94eWh0bWxleHRlbmRlZCIKKyAgLSAicHJveHlodG1sZml4dXBzIgorICAtICJwcm94eWh0bWxpbnRlcnAiCisgIC0gInByb3h5aHRtbGxpbmtzIgorICAtICJwcm94eWh0bWxtZXRhIgorICAtICJwcm94eWh0bWxzdHJpcGNvbW1lbnRzIgorICAtICJwcm94eWh0bWx1cmxtYXAiCisgIC0gInByb3h5aW9idWZmZXJzaXplIgorICAtICJwcm94eW1heGZvcndhcmRzIgorICAtICJwcm94eXBhc3MiCisgIC0gInByb3h5cGFzc2luaGVyaXQiCisgIC0gInByb3h5cGFzc2ludGVycG9sYXRlZW52IgorICAtICJwcm94eXBhc3NtYXRjaCIKKyAgLSAicHJveHlwYXNzcmV2ZXJzZSIKKyAgLSAicHJveHlwYXNzcmV2ZXJzZWNvb2tpZWRvbWFpbiIKKyAgLSAicHJveHlwYXNzcmV2ZXJzZWNvb2tpZXBhdGgiCisgIC0gInByb3h5cHJlc2VydmVob3N0IgorICAtICJwcm94eXJlY2VpdmVidWZmZXJzaXplIgorICAtICJwcm94eXJlbW90ZSIKKyAgLSAicHJveHlyZW1vdGVtYXRjaCIKKyAgLSAicHJveHlyZXF1ZXN0cyIKKyAgLSAicHJveHlzY2dpaW50ZXJuYWxyZWRpcmVjdCIKKyAgLSAicHJveHlzY2dpc2VuZGZpbGUiCisgIC0gInByb3h5c2V0IgorICAtICJwcm94eXNvdXJjZWFkZHJlc3MiCisgIC0gInByb3h5c3RhdHVzIgorICAtICJwcm94eXRpbWVvdXQiCisgIC0gInByb3h5dmlhIgorICAtICJxdWFsaWZ5cmVkaXJlY3R1cmwiCisgIC0gInJlYWRtZW5hbWUiCisgIC0gInJlY2VpdmVidWZmZXJzaXplIgorICAtICJyZWRpcmVjdCIKKyAgLSAicmVkaXJlY3RtYXRjaCIKKyAgLSAicmVkaXJlY3RwZXJtYW5lbnQiCisgIC0gInJlZGlyZWN0dGVtcCIKKyAgLSAicmVmZXJlcmlnbm9yZSIKKyAgLSAicmVmZXJlcmxvZyIKKyAgLSAicmVmbGVjdG9yaGVhZGVyIgorICAtICJyZW1vdGVpcGhlYWRlciIKKyAgLSAicmVtb3RlaXBpbnRlcm5hbHByb3h5IgorICAtICJyZW1vdGVpcGludGVybmFscHJveHlsaXN0IgorICAtICJyZW1vdGVpcHByb3hpZXNoZWFkZXIiCisgIC0gInJlbW90ZWlwdHJ1c3RlZHByb3h5IgorICAtICJyZW1vdGVpcHRydXN0ZWRwcm94eWxpc3QiCisgIC0gInJlbW92ZWNoYXJzZXQiCisgIC0gInJlbW92ZWVuY29kaW5nIgorICAtICJyZW1vdmVoYW5kbGVyIgorICAtICJyZW1vdmVpbnB1dGZpbHRlciIKKyAgLSAicmVtb3ZlbGFuZ3VhZ2UiCisgIC0gInJlbW92ZW91dHB1dGZpbHRlciIKKyAgLSAicmVtb3ZldHlwZSIKKyAgLSAicmVxdWVzdGhlYWRlciIKKyAgLSAicmVxdWVzdHJlYWR0aW1lb3V0IgorICAtICJyZXF1aXJlIgorICAtICJyZXNvdXJjZWNvbmZpZyIKKyAgLSAicmV3cml0ZWJhc2UiCisgIC0gInJld3JpdGVjb25kIgorICAtICJyZXdyaXRlZW5naW5lIgorICAtICJyZXdyaXRlbG9jayIKKyAgLSAicmV3cml0ZWxvZyIKKyAgLSAicmV3cml0ZWxvZ2xldmVsIgorICAtICJyZXdyaXRlbWFwIgorICAtICJyZXdyaXRlb3B0aW9ucyIKKyAgLSAicmV3cml0ZXJ1bGUiCisgIC0gInJsaW1pdGNwdSIKKyAgLSAicmxpbWl0bWVtIgorICAtICJybGltaXRucHJvYyIKKyAgLSAic2F0aXNmeSIKKyAgLSAic2NvcmVib2FyZGZpbGUiCisgIC0gInNjcmlwdCIKKyAgLSAic2NyaXB0YWxpYXMiCisgIC0gInNjcmlwdGFsaWFzbWF0Y2giCisgIC0gInNjcmlwdGludGVycHJldGVyc291cmNlIgorICAtICJzY3JpcHRsb2ciCisgIC0gInNjcmlwdGxvZ2J1ZmZlciIKKyAgLSAic2NyaXB0bG9nbGVuZ3RoIgorICAtICJzY3JpcHRzb2NrIgorICAtICJzZWN1cmVsaXN0ZW4iCisgIC0gInNlZXJlcXVlc3R0YWlsIgorICAtICJzZW5kYnVmZmVyc2l6ZSIKKyAgLSAic2VydmVyYWRtaW4iCisgIC0gInNlcnZlcmFsaWFzIgorICAtICJzZXJ2ZXJsaW1pdCIKKyAgLSAic2VydmVybmFtZSIKKyAgLSAic2VydmVycGF0aCIKKyAgLSAic2VydmVycm9vdCIKKyAgLSAic2VydmVyc2lnbmF0dXJlIgorICAtICJzZXJ2ZXJ0b2tlbnMiCisgIC0gInNlcnZlcnR5cGUiCisgIC0gInNlc3Npb24iCisgIC0gInNlc3Npb25jb29raWVuYW1lIgorICAtICJzZXNzaW9uY29va2llbmFtZTIiCisgIC0gInNlc3Npb25jb29raWVyZW1vdmUiCisgIC0gInNlc3Npb25jcnlwdG9jaXBoZXIiCisgIC0gInNlc3Npb25jcnlwdG9kcml2ZXIiCisgIC0gInNlc3Npb25jcnlwdG9wYXNzcGhyYXNlIgorICAtICJzZXNzaW9uY3J5cHRvcGFzc3BocmFzZWZpbGUiCisgIC0gInNlc3Npb25kYmRjb29raWVuYW1lIgorICAtICJzZXNzaW9uZGJkY29va2llbmFtZTIiCisgIC0gInNlc3Npb25kYmRjb29raWVyZW1vdmUiCisgIC0gInNlc3Npb25kYmRkZWxldGVsYWJlbCIKKyAgLSAic2Vzc2lvbmRiZGluc2VydGxhYmVsIgorICAtICJzZXNzaW9uZGJkcGVydXNlciIKKyAgLSAic2Vzc2lvbmRiZHNlbGVjdGxhYmVsIgorICAtICJzZXNzaW9uZGJkdXBkYXRlbGFiZWwiCisgIC0gInNlc3Npb25lbnYiCisgIC0gInNlc3Npb25leGNsdWRlIgorICAtICJzZXNzaW9uaGVhZGVyIgorICAtICJzZXNzaW9uaW5jbHVkZSIKKyAgLSAic2Vzc2lvbm1heGFnZSIKKyAgLSAic2V0ZW52IgorICAtICJzZXRlbnZpZiIKKyAgLSAic2V0ZW52aWZleHByIgorICAtICJzZXRlbnZpZm5vY2FzZSIKKyAgLSAic2V0aGFuZGxlciIKKyAgLSAic2V0aW5wdXRmaWx0ZXIiCisgIC0gInNldG91dHB1dGZpbHRlciIKKyAgLSAic3NpZW5kdGFnIgorICAtICJzc2llcnJvcm1zZyIKKyAgLSAic3NpZXRhZyIKKyAgLSAic3NpbGFzdG1vZGlmaWVkIgorICAtICJzc2lsZWdhY3lleHBycGFyc2VyIgorICAtICJzc2lzdGFydHRhZyIKKyAgLSAic3NpdGltZWZvcm1hdCIKKyAgLSAic3NpdW5kZWZpbmVkZWNobyIKKyAgLSAic3NsY2FjZXJ0aWZpY2F0ZWZpbGUiCisgIC0gInNzbGNhY2VydGlmaWNhdGVwYXRoIgorICAtICJzc2xjYWRucmVxdWVzdGZpbGUiCisgIC0gInNzbGNhZG5yZXF1ZXN0cGF0aCIKKyAgLSAic3NsY2FyZXZvY2F0aW9uY2hlY2siCisgIC0gInNzbGNhcmV2b2NhdGlvbmZpbGUiCisgIC0gInNzbGNhcmV2b2NhdGlvbnBhdGgiCisgIC0gInNzbGNlcnRpZmljYXRlY2hhaW5maWxlIgorICAtICJzc2xjZXJ0aWZpY2F0ZWZpbGUiCisgIC0gInNzbGNlcnRpZmljYXRla2V5ZmlsZSIKKyAgLSAic3NsY2lwaGVyc3VpdGUiCisgIC0gInNzbGNvbXByZXNzaW9uIgorICAtICJzc2xjcnlwdG9kZXZpY2UiCisgIC0gInNzbGVuZ2luZSIKKyAgLSAic3NsZmlwcyIKKyAgLSAic3NsaG9ub3JjaXBoZXJvcmRlciIKKyAgLSAic3NsaW5zZWN1cmVyZW5lZ290aWF0aW9uIgorICAtICJzc2xtdXRleCIKKyAgLSAic3Nsb2NzcGRlZmF1bHRyZXNwb25kZXIiCisgIC0gInNzbG9jc3BlbmFibGUiCisgIC0gInNzbG9jc3BvdmVycmlkZXJlc3BvbmRlciIKKyAgLSAic3Nsb2NzcHByb3h5dXJsIgorICAtICJzc2xvY3NwcmVzcG9uZGVydGltZW91dCIKKyAgLSAic3Nsb2NzcHJlc3BvbnNlbWF4YWdlIgorICAtICJzc2xvY3NwcmVzcG9uc2V0aW1lc2tldyIKKyAgLSAic3Nsb2NzcHVzZXJlcXVlc3Rub25jZSIKKyAgLSAic3Nsb3BlbnNzbGNvbmZjbWQiCisgIC0gInNzbG9wdGlvbnMiCisgIC0gInNzbHBhc3NwaHJhc2VkaWFsb2ciCisgIC0gInNzbHByb3RvY29sIgorICAtICJzc2xwcm94eWNhY2VydGlmaWNhdGVmaWxlIgorICAtICJzc2xwcm94eWNhY2VydGlmaWNhdGVwYXRoIgorICAtICJzc2xwcm94eWNhcmV2b2NhdGlvbmNoZWNrIgorICAtICJzc2xwcm94eWNhcmV2b2NhdGlvbmZpbGUiCisgIC0gInNzbHByb3h5Y2FyZXZvY2F0aW9ucGF0aCIKKyAgLSAic3NscHJveHljaGVja3BlZXJjbiIKKyAgLSAic3NscHJveHljaGVja3BlZXJleHBpcmUiCisgIC0gInNzbHByb3h5Y2hlY2twZWVybmFtZSIKKyAgLSAic3NscHJveHljaXBoZXJzdWl0ZSIKKyAgLSAic3NscHJveHllbmdpbmUiCisgIC0gInNzbHByb3h5bWFjaGluZWNlcnRpZmljYXRlY2hhaW5maWxlIgorICAtICJzc2xwcm94eW1hY2hpbmVjZXJ0aWZpY2F0ZWZpbGUiCisgIC0gInNzbHByb3h5bWFjaGluZWNlcnRpZmljYXRlcGF0aCIKKyAgLSAic3NscHJveHlwcm90b2NvbCIKKyAgLSAic3NscHJveHl2ZXJpZnkiCisgIC0gInNzbHByb3h5dmVyaWZ5ZGVwdGgiCisgIC0gInNzbHJhbmRvbXNlZWQiCisgIC0gInNzbHJlbmVnYnVmZmVyc2l6ZSIKKyAgLSAic3NscmVxdWlyZSIKKyAgLSAic3NscmVxdWlyZXNzbCIKKyAgLSAic3Nsc2Vzc2lvbmNhY2hlIgorICAtICJzc2xzZXNzaW9uY2FjaGV0aW1lb3V0IgorICAtICJzc2xzZXNzaW9udGlja2V0a2V5ZmlsZSIKKyAgLSAic3Nsc2Vzc2lvbnRpY2tldHMiCisgIC0gInNzbHNycHVua25vd251c2Vyc2VlZCIKKyAgLSAic3Nsc3JwdmVyaWZpZXJmaWxlIgorICAtICJzc2xzdGFwbGluZ2NhY2hlIgorICAtICJzc2xzdGFwbGluZ2Vycm9yY2FjaGV0aW1lb3V0IgorICAtICJzc2xzdGFwbGluZ2Zha2V0cnlsYXRlciIKKyAgLSAic3Nsc3RhcGxpbmdmb3JjZXVybCIKKyAgLSAic3Nsc3RhcGxpbmdyZXNwb25kZXJ0aW1lb3V0IgorICAtICJzc2xzdGFwbGluZ3Jlc3BvbnNlbWF4YWdlIgorICAtICJzc2xzdGFwbGluZ3Jlc3BvbnNldGltZXNrZXciCisgIC0gInNzbHN0YXBsaW5ncmV0dXJucmVzcG9uZGVyZXJyb3JzIgorICAtICJzc2xzdGFwbGluZ3N0YW5kYXJkY2FjaGV0aW1lb3V0IgorICAtICJzc2xzdHJpY3Rzbml2aG9zdGNoZWNrIgorICAtICJzc2x1c2VybmFtZSIKKyAgLSAic3NsdXNlc3RhcGxpbmciCisgIC0gInNzbHZlcmlmeWNsaWVudCIKKyAgLSAic3NsdmVyaWZ5ZGVwdGgiCisgIC0gInN0YXJ0c2VydmVycyIKKyAgLSAic3RhcnR0aHJlYWRzIgorICAtICJzdWJzdGl0dXRlIgorICAtICJzdWJzdGl0dXRlaW5oZXJpdGJlZm9yZSIKKyAgLSAic3Vic3RpdHV0ZW1heGxpbmVsZW5ndGgiCisgIC0gInN1ZXhlYyIKKyAgLSAic3VleGVjdXNlcmdyb3VwIgorICAtICJ0aHJlYWRsaW1pdCIKKyAgLSAidGhyZWFkc3BlcmNoaWxkIgorICAtICJ0aHJlYWRzdGFja3NpemUiCisgIC0gInRpbWVvdXQiCisgIC0gInRvcHNpdGVzIgorICAtICJ0b3B1cmxzIgorICAtICJ0cmFjZWVuYWJsZSIKKyAgLSAidHJhbnNmZXJsb2ciCisgIC0gInR5cGVzY29uZmlnIgorICAtICJ1bmRlZmluZSIKKyAgLSAidW5kZWZtYWNybyIKKyAgLSAidW5zZXRlbnYiCisgIC0gInVzZSIKKyAgLSAidXNlY2Fub25pY2FsbmFtZSIKKyAgLSAidXNlY2Fub25pY2FscGh5c2ljYWxwb3J0IgorICAtICJ1c2VyIgorICAtICJ1c2VyZGlyIgorICAtICJ2aG9zdGNnaW1vZGUiCisgIC0gInZob3N0Y2dpcHJpdnMiCisgIC0gInZob3N0Z3JvdXAiCisgIC0gInZob3N0cHJpdnMiCisgIC0gInZob3N0c2VjdXJlIgorICAtICJ2aG9zdHVzZXIiCisgIC0gInZpcnR1YWxkb2N1bWVudHJvb3QiCisgIC0gInZpcnR1YWxkb2N1bWVudHJvb3RpcCIKKyAgLSAidmlydHVhbHNjcmlwdGFsaWFzIgorICAtICJ2aXJ0dWFsc2NyaXB0YWxpYXNpcCIKKyAgLSAid2luMzJkaXNhYmxlYWNjZXB0ZXgiCisgIC0gIndhdGNoZG9naW50ZXJ2YWwiCisgIC0gInhiaXRoYWNrIgorICAtICJ4bWwyZW5jYWxpYXMiCisgIC0gInhtbDJlbmNkZWZhdWx0IgorICAtICJ4bWwyc3RhcnRwYXJzZSIKKworOnZhbHVlczoKKyAgLSAiYWRkIgorICAtICJBbGwiCisgIC0gImFsbG93IgorICAtICJhbnkiCisgIC0gImFwcGVuZCIKKyAgLSAiQXV0aENvbmZpZyIKKyAgLSAiQmFzaWMiCisgIC0gIkNPTk5FQ1QiCisgIC0gIkRFTEVURSIKKyAgLSAiZGVueSIKKyAgLSAiRGlnZXN0IgorICAtICJkb3VibGUiCisgIC0gImRvd25ncmFkZS0xLjAiCisgIC0gImVtYWlsIgorICAtICJlbnYiCisgIC0gImVycm9yIgorICAtICJFeGVjQ0dJIgorICAtICJGYW5jeUluZGV4aW5nIgorICAtICJGaWxlSW5mbyIKKyAgLSAiRm9sbG93U3ltTGlua3MiCisgIC0gImZvcmNlLXJlc3BvbnNlLTEuMCIKKyAgLSAiZm9ybWF0dGVkIgorICAtICJmcm9tIgorICAtICJmdWxsIgorICAtICJGdWxsIgorICAtICJHRVQiCisgIC0gImdvbmUiCisgIC0gImdyb3VwIgorICAtICJJY29uc0FyZUxpbmtzIgorICAtICJJbmNsdWRlcyIKKyAgLSAiSW5jbHVkZXNOT0VYRUMiCisgIC0gIkluZGV4ZXMiCisgIC0gImluZXRkIgorICAtICJpbmhlcml0IgorICAtICJMaW1pdCIKKyAgLSAibWFwIgorICAtICJNaW5pbWFsIgorICAtICJNdWx0aVZpZXdzIgorICAtICJtdXR1YWwtZmFpbHVyZSIKKyAgLSAibm9jb250ZW50IgorICAtICJub2tlZXBhbGl2ZSIKKyAgLSAibm9uZSIKKyAgLSAiTm9uZSIKKyAgLSAib2ZmIgorICAtICJvbiIKKyAgLSAiT3B0aW9ucyIKKyAgLSAiT1BUSU9OUyIKKyAgLSAiT1MiCisgIC0gInBlcm1hbmVudCIKKyAgLSAiUE9TVCIKKyAgLSAiUFVUIgorICAtICJyZWZlcmVyIgorICAtICJTY2FuSFRNTFRpdGxlcyIKKyAgLSAic2Vlb3RoZXIiCisgIC0gInNlbWktZm9ybWF0dGVkIgorICAtICJzZXQiCisgIC0gInN0YW5kYWxvbmUiCisgIC0gIlN1cHByZXNzRGVzY3JpcHRpb24iCisgIC0gIlN1cHByZXNzTGFzdE1vZGlmaWVkIgorICAtICJTdXBwcmVzc1NpemUiCisgIC0gIlN5bUxpbmtzSWZPd25lck1hdGNoIgorICAtICJ0ZW1wb3JhcnkiCisgIC0gInVuZm9ybWF0dGVkIgorICAtICJ1bnNldCIKKyAgLSAiVVJMIgorICAtICJ1c2VyIgorICAtICJ2YWxpZC11c2VyIgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvYXBpYmx1ZXByaW50LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvYXBpYmx1ZXByaW50LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjIyMDQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9hcGlibHVlcHJpbnQucmIKQEAgLTAsMCArMSw1MSBAQAorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBsb2FkX2xleGVyICdtYXJrZG93bi5yYicKKworICAgIGNsYXNzIEFQSUJsdWVwcmludCA8IE1hcmtkb3duCisgICAgICB0aXRsZSAnQVBJIEJsdWVwcmludCcKKyAgICAgIGRlc2MgJ01hcmtkb3duIGJhc2VkIEFQSSBkZXNjcmlwdGlvbiBsYW5ndWFnZS4nCisKKyAgICAgIHRhZyAnYXBpYmx1ZXByaW50JworICAgICAgYWxpYXNlcyAnYXBpYmx1ZXByaW50JywgJ2FwaWInCisgICAgICBmaWxlbmFtZXMgJyouYXBpYicKKyAgICAgIG1pbWV0eXBlcyAndGV4dC92bmQuYXBpYmx1ZXByaW50JworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zdGFydF93aXRoPygnRk9STUFUOiAxQVxuJykKKyAgICAgIGVuZAorCisgICAgICBwcmVwZW5kIDpyb290IGRvCisgICAgICAgICMgTWV0YWRhdGEKKyAgICAgICAgcnVsZSgvKFxTKykoOlxzKikoLiopJC8pIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OlZhcmlhYmxlLCBQdW5jdHVhdGlvbiwgTGl0ZXJhbDo6U3RyaW5nCisgICAgICAgIGVuZAorCisgICAgICAgICMgUmVzb3VyY2UgR3JvdXAKKyAgICAgICAgcnVsZSgvXigjKykoXHMqR3JvdXBccyspKC4qKSQvKSBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgS2V5d29yZCwgR2VuZXJpYzo6SGVhZGluZworICAgICAgICBlbmQKKworICAgICAgICAjIFJlc291cmNlIFwgQWN0aW9uCisgICAgICAgIHJ1bGUoL14oIyspKC4qKShcWy4qXF0pJC8pIGRvCisgICAgICAgICAgZ3JvdXBzIFB1bmN0dWF0aW9uLCBHZW5lcmljOjpIZWFkaW5nLCBMaXRlcmFsOjpTdHJpbmcKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBSZWxhdGlvbgorICAgICAgICBydWxlKC9eKFtcK1wtXCpdKShccypSZWxhdGlvbjopKFxzKi4qKSQvKSBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgS2V5d29yZCwgTGl0ZXJhbDo6U3RyaW5nCisgICAgICAgIGVuZAorCisgICAgICAgICMgTVNPTgorICAgICAgICBydWxlKC9eKFxzK1tcK1wtXCpdXHMqKShBdHRyaWJ1dGVzfFBhcmFtZXRlcnMpKC4qKSQvKSBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgS2V5d29yZCwgTGl0ZXJhbDo6U3RyaW5nCisgICAgICAgIGVuZAorCisgICAgICAgICMgUmVxdWVzdC9SZXNwb25zZQorICAgICAgICBydWxlKC9eKFtcK1wtXCpdXHMqKShSZXF1ZXN0fFJlc3BvbnNlKShccytcZFxkXGQpPyguKikkLykgZG8KKyAgICAgICAgICBncm91cHMgUHVuY3R1YXRpb24sIEtleXdvcmQsIExpdGVyYWw6Ok51bWJlciwgTGl0ZXJhbDo6U3RyaW5nCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9hcHBsZV9zY3JpcHQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9hcHBsZV9zY3JpcHQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1YTIxNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2FwcGxlX3NjcmlwdC5yYgpAQCAtMCwwICsxLDM2NyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBBcHBsZVNjcmlwdCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJBcHBsZVNjcmlwdCIKKyAgICAgIGRlc2MgIlRoZSBBcHBsZVNjcmlwdCBzY3JpcHRpbmcgbGFuZ3VhZ2UgYnkgQXBwbGUgSW5jLiAoaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vYXBwbGVzY3JpcHQvKSIKKworICAgICAgdGFnICdhcHBsZXNjcmlwdCcKKyAgICAgIGFsaWFzZXMgJ2FwcGxlc2NyaXB0JworCisgICAgICBmaWxlbmFtZXMgJyouYXBwbGVzY3JpcHQnLCAnKi5zY3B0JworCisgICAgICBtaW1ldHlwZXMgJ2FwcGxpY2F0aW9uL3gtYXBwbGVzY3JpcHQnCisKKyAgICAgIGRlZiBzZWxmLmxpdGVyYWxzCisgICAgICAgIEBsaXRlcmFscyB8fD0gWydBcHBsZVNjcmlwdCcsICdjdXJyZW50IGFwcGxpY2F0aW9uJywgJ2ZhbHNlJywgJ2xpbmVmZWVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ21pc3NpbmcgdmFsdWUnLCAncGknLCdxdW90ZScsICdyZXN1bHQnLCAncmV0dXJuJywgJ3NwYWNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3RhYicsICd0ZXh0IGl0ZW0gZGVsaW1pdGVycycsICd0cnVlJywgJ3ZlcnNpb24nXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmNsYXNzZXMKKyAgICAgICAgQGNsYXNzZXMgfHw9IFsnYWxpYXMgJywgJ2FwcGxpY2F0aW9uICcsICdib29sZWFuICcsICdjbGFzcyAnLCAnY29uc3RhbnQgJywKKyAgICAgICAgICAgICAgICAgICAgICAnZGF0ZSAnLCAnZmlsZSAnLCAnaW50ZWdlciAnLCAnbGlzdCAnLCAnbnVtYmVyICcsICdQT1NJWCBmaWxlICcsCisgICAgICAgICAgICAgICAgICAgICAgJ3JlYWwgJywgJ3JlY29yZCAnLCAncmVmZXJlbmNlICcsICdSR0IgY29sb3IgJywgJ3NjcmlwdCAnLAorICAgICAgICAgICAgICAgICAgICAgICd0ZXh0ICcsICd1bml0IHR5cGVzJywgJyg/OlVuaWNvZGUgKT90ZXh0JywgJ3N0cmluZyddCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSBbJ2F0dGFjaG1lbnQnLCAnYXR0cmlidXRlIHJ1bicsICdjaGFyYWN0ZXInLCAnZGF5JywgJ21vbnRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmFncmFwaCcsICd3b3JkJywgJ3llYXInXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmhhbmRsZXJfcGFyYW1zCisgICAgICAgIEBoYW5kbGVyX3BhcmFtcyB8fD0gWydhYm91dCcsICdhYm92ZScsICdhZ2FpbnN0JywgJ2FwYXJ0IGZyb20nLCAnYXJvdW5kJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzaWRlIGZyb20nLCAnYXQnLCAnYmVsb3cnLCAnYmVuZWF0aCcsICdiZXNpZGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmV0d2VlbicsICdmb3InLCAnZ2l2ZW4nLCAnaW5zdGVhZCBvZicsICdvbicsICdvbnRvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ291dCBvZicsICdvdmVyJywgJ3NpbmNlJ10KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5jb21tYW5kcworICAgICAgICBAY29tbWFuZHMgfHw9IFsnQVNDSUkgKGNoYXJhY3RlcnxudW1iZXIpJywgJ2FjdGl2YXRlJywgJ2JlZXAnLCAnY2hvb3NlIFVSTCcsCisgICAgICAgICAgICAgICAgJ2Nob29zZSBhcHBsaWNhdGlvbicsICdjaG9vc2UgY29sb3InLCAnY2hvb3NlIGZpbGUoIG5hbWUpPycsCisgICAgICAgICAgICAgICAgJ2Nob29zZSBmb2xkZXInLCAnY2hvb3NlIGZyb20gbGlzdCcsCisgICAgICAgICAgICAgICAgJ2Nob29zZSByZW1vdGUgYXBwbGljYXRpb24nLCAnY2xpcGJvYXJkIGluZm8nLAorICAgICAgICAgICAgICAgICdjbG9zZSggYWNjZXNzKT8nLCAnY29weScsICdjb3VudCcsICdjdXJyZW50IGRhdGUnLCAnZGVsYXknLAorICAgICAgICAgICAgICAgICdkZWxldGUnLCAnZGlzcGxheSAoYWxlcnR8ZGlhbG9nKScsICdkbyBzaGVsbCBzY3JpcHQnLAorICAgICAgICAgICAgICAgICdkdXBsaWNhdGUnLCAnZXhpc3RzJywgJ2dldCBlb2YnLCAnZ2V0IHZvbHVtZSBzZXR0aW5ncycsCisgICAgICAgICAgICAgICAgJ2luZm8gZm9yJywgJ2xhdW5jaCcsICdsaXN0IChkaXNrc3xmb2xkZXIpJywgJ2xvYWQgc2NyaXB0JywKKyAgICAgICAgICAgICAgICAnbG9nJywgJ21ha2UnLCAnbW91bnQgdm9sdW1lJywgJ25ldycsICdvZmZzZXQnLAorICAgICAgICAgICAgICAgICdvcGVuKCAoZm9yIGFjY2Vzc3xsb2NhdGlvbikpPycsICdwYXRoIHRvJywgJ3ByaW50JywgJ3F1aXQnLAorICAgICAgICAgICAgICAgICdyYW5kb20gbnVtYmVyJywgJ3JlYWQnLCAncm91bmQnLCAncnVuKCBzY3JpcHQpPycsCisgICAgICAgICAgICAgICAgJ3NheScsICdzY3JpcHRpbmcgY29tcG9uZW50cycsCisgICAgICAgICAgICAgICAgJ3NldCAoZW9mfHRoZSBjbGlwYm9hcmQgdG98dm9sdW1lKScsICdzdG9yZSBzY3JpcHQnLAorICAgICAgICAgICAgICAgICdzdW1tYXJpemUnLCAnc3lzdGVtIGF0dHJpYnV0ZScsICdzeXN0ZW0gaW5mbycsCisgICAgICAgICAgICAgICAgJ3RoZSBjbGlwYm9hcmQnLCAndGltZSB0byBHTVQnLCAnd3JpdGUnLCAncXVvdGVkIGZvcm0nXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnJlZmVyZW5jZXMKKyAgICAgICAgQHJlZmVyZW5jZXMgfHw9IFsnKGluICk/YmFjayBvZicsICcoaW4gKT9mcm9udCBvZicsICdbMC05XSsoc3R8bmR8cmR8dGgpJywKKyAgICAgICAgICAgICAgICAgICdmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnLCAnZm91cnRoJywgJ2ZpZnRoJywgJ3NpeHRoJywKKyAgICAgICAgICAgICAgICAgICdzZXZlbnRoJywgJ2VpZ2h0aCcsICduaW50aCcsICd0ZW50aCcsICdhZnRlcicsICdiYWNrJywKKyAgICAgICAgICAgICAgICAgICdiZWZvcmUnLCAnYmVoaW5kJywgJ2V2ZXJ5JywgJ2Zyb250JywgJ2luZGV4JywgJ2xhc3QnLAorICAgICAgICAgICAgICAgICAgJ21pZGRsZScsICdzb21lJywgJ3RoYXQnLCAndGhyb3VnaCcsICd0aHJ1JywgJ3doZXJlJywgJ3dob3NlJ10KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5vcGVyYXRvcnMKKyAgICAgICAgQG9wZXJhdG9ycyB8fD0gWyJhbmQiLCAib3IiLCAiaXMgZXF1YWwiLCAiZXF1YWxzIiwgIihpcyApP2VxdWFsIHRvIiwgImlzIG5vdCIsCisgICAgICAgICAgICAgICAgICJpc24ndCIsICJpc24ndCBlcXVhbCggdG8pPyIsICJpcyBub3QgZXF1YWwoIHRvKT8iLAorICAgICAgICAgICAgICAgICAiZG9lc24ndCBlcXVhbCIsICJkb2VzIG5vdCBlcXVhbCIsICIoaXMgKT9ncmVhdGVyIHRoYW4iLAorICAgICAgICAgICAgICAgICAiY29tZXMgYWZ0ZXIiLCAiaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCggdG8pPyIsCisgICAgICAgICAgICAgICAgICJpc24ndCBsZXNzIHRoYW4gb3IgZXF1YWwoIHRvKT8iLCAiKGlzICk/bGVzcyB0aGFuIiwKKyAgICAgICAgICAgICAgICAgImNvbWVzIGJlZm9yZSIsICJpcyBub3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsKCB0byk/IiwKKyAgICAgICAgICAgICAgICAgImlzbid0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCggdG8pPyIsCisgICAgICAgICAgICAgICAgICIoaXMgICk/Z3JlYXRlciB0aGFuIG9yIGVxdWFsKCB0byk/IiwgImlzIG5vdCBsZXNzIHRoYW4iLAorICAgICAgICAgICAgICAgICAiaXNuJ3QgbGVzcyB0aGFuIiwgImRvZXMgbm90IGNvbWUgYmVmb3JlIiwKKyAgICAgICAgICAgICAgICAgImRvZXNuJ3QgY29tZSBiZWZvcmUiLCAiKGlzICk/bGVzcyB0aGFuIG9yIGVxdWFsKCB0byk/IiwKKyAgICAgICAgICAgICAgICAgImlzIG5vdCBncmVhdGVyIHRoYW4iLCAiaXNuJ3QgZ3JlYXRlciB0aGFuIiwKKyAgICAgICAgICAgICAgICAgImRvZXMgbm90IGNvbWUgYWZ0ZXIiLCAiZG9lc24ndCBjb21lIGFmdGVyIiwgInN0YXJ0cz8gd2l0aCIsCisgICAgICAgICAgICAgICAgICJiZWdpbnM/IHdpdGgiLCAiZW5kcz8gd2l0aCIsICJjb250YWlucz8iLCAiZG9lcyBub3QgY29udGFpbiIsCisgICAgICAgICAgICAgICAgICJkb2Vzbid0IGNvbnRhaW4iLCAiaXMgaW4iLCAiaXMgY29udGFpbmVkIGJ5IiwgImlzIG5vdCBpbiIsCisgICAgICAgICAgICAgICAgICJpcyBub3QgY29udGFpbmVkIGJ5IiwgImlzbid0IGNvbnRhaW5lZCBieSIsICJkaXYiLCAibW9kIiwKKyAgICAgICAgICAgICAgICAgIm5vdCIsICIoYSAgKT8ocmVmKCB0byk/fHJlZmVyZW5jZSB0bykiLCAiaXMiLCAiZG9lcyJdCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29udHJvbHMKKyAgICAgICAgQGNvbnRyb2xzIHx8PSBbJ2NvbnNpZGVyaW5nJywgJ2Vsc2UnLCAnZXJyb3InLCAnZXhpdCcsICdmcm9tJywgJ2lmJywKKyAgICAgICAgICAgICAgICdpZ25vcmluZycsICdpbicsICdyZXBlYXQnLCAndGVsbCcsICd0aGVuJywgJ3RpbWVzJywgJ3RvJywKKyAgICAgICAgICAgICAgICd0cnknLCAndW50aWwnLCAndXNpbmcgdGVybXMgZnJvbScsICd3aGlsZScsICd3aGl0aCcsCisgICAgICAgICAgICAgICAnd2l0aCB0aW1lb3V0KCBvZik/JywgJ3dpdGggdHJhbnNhY3Rpb24nLCAnYnknLCAnY29udGludWUnLAorICAgICAgICAgICAgICAgJ2VuZCcsICdpdHM/JywgJ21lJywgJ215JywgJ3JldHVybicsICdvZicgLCAnYXMnXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmRlY2xhcmF0aW9ucworICAgICAgICBAZGVjbGFyYXRpb25zIHx8PSBbJ2dsb2JhbCcsICdsb2NhbCcsICdwcm9wKGVydHkpPycsICdzZXQnLCAnZ2V0J10KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5yZXNlcnZlZAorICAgICAgICBAcmVzZXJ2ZWQgfHw9IFsnYnV0JywgJ3B1dCcsICdyZXR1cm5pbmcnLCAndGhlJ10KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdHVkaW9fY2xhc3NlcworICAgICAgICBAc3R1ZGlvX2NsYXNzZXMgfHw9IFsnYWN0aW9uIGNlbGwnLCAnYWxlcnQgcmVwbHknLCAnYXBwbGljYXRpb24nLCAnYm94JywKKyAgICAgICAgICAgICAgICAgICAgICdicm93c2VyKCBjZWxsKT8nLCAnYnVuZGxlJywgJ2J1dHRvbiggY2VsbCk/JywgJ2NlbGwnLAorICAgICAgICAgICAgICAgICAgICAgJ2NsaXAgdmlldycsICdjb2xvciB3ZWxsJywgJ2NvbG9yLXBhbmVsJywKKyAgICAgICAgICAgICAgICAgICAgICdjb21ibyBib3goIGl0ZW0pPycsICdjb250cm9sJywKKyAgICAgICAgICAgICAgICAgICAgICdkYXRhKCAoY2VsbHxjb2x1bW58aXRlbXxyb3d8c291cmNlKSk/JywgJ2RlZmF1bHQgZW50cnknLAorICAgICAgICAgICAgICAgICAgICAgJ2RpYWxvZyByZXBseScsICdkb2N1bWVudCcsICdkcmFnIGluZm8nLCAnZHJhd2VyJywKKyAgICAgICAgICAgICAgICAgICAgICdldmVudCcsICdmb250KC1wYW5lbCk/JywgJ2Zvcm1hdHRlcicsCisgICAgICAgICAgICAgICAgICAgICAnaW1hZ2UoIChjZWxsfHZpZXcpKT8nLCAnbWF0cml4JywgJ21lbnUoIGl0ZW0pPycsICdpdGVtJywKKyAgICAgICAgICAgICAgICAgICAgICdtb3ZpZSggdmlldyk/JywgJ29wZW4tcGFuZWwnLCAnb3V0bGluZSB2aWV3JywgJ3BhbmVsJywKKyAgICAgICAgICAgICAgICAgICAgICdwYXN0ZWJvYXJkJywgJ3BsdWdpbicsICdwb3B1cCBidXR0b24nLAorICAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzIGluZGljYXRvcicsICdyZXNwb25kZXInLCAnc2F2ZS1wYW5lbCcsCisgICAgICAgICAgICAgICAgICAgICAnc2Nyb2xsIHZpZXcnLCAnc2VjdXJlIHRleHQgZmllbGQoIGNlbGwpPycsICdzbGlkZXInLAorICAgICAgICAgICAgICAgICAgICAgJ3NvdW5kJywgJ3NwbGl0IHZpZXcnLCAnc3RlcHBlcicsICd0YWIgdmlldyggaXRlbSk/JywKKyAgICAgICAgICAgICAgICAgICAgICd0YWJsZSggKGNvbHVtbnxoZWFkZXIgY2VsbHxoZWFkZXIgdmlld3x2aWV3KSknLAorICAgICAgICAgICAgICAgICAgICAgJ3RleHQoIChmaWVsZCggY2VsbCk/fHZpZXcpKT8nLCAndG9vbGJhciggaXRlbSk/JywKKyAgICAgICAgICAgICAgICAgICAgICd1c2VyLWRlZmF1bHRzJywgJ3ZpZXcnLCAnd2luZG93J10KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdHVkaW9fZXZlbnRzCisgICAgICAgIEBzdHVkaW9fZXZlbnRzIHx8PSBbJ2FjY2VwdCBvdXRsaW5lIGRyb3AnLCAnYWNjZXB0IHRhYmxlIGRyb3AnLCAnYWN0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgJ2FjdGl2YXRlZCcsICdhbGVydCBlbmRlZCcsICdhd2FrZSBmcm9tIG5pYicsICdiZWNhbWUga2V5JywKKyAgICAgICAgICAgICAgICAgICAgJ2JlY2FtZSBtYWluJywgJ2JlZ2luIGVkaXRpbmcnLCAnYm91bmRzIGNoYW5nZWQnLAorICAgICAgICAgICAgICAgICAgICAnY2VsbCB2YWx1ZScsICdjZWxsIHZhbHVlIGNoYW5nZWQnLCAnY2hhbmdlIGNlbGwgdmFsdWUnLAorICAgICAgICAgICAgICAgICAgICAnY2hhbmdlIGl0ZW0gdmFsdWUnLCAnY2hhbmdlZCcsICdjaGlsZCBvZiBpdGVtJywKKyAgICAgICAgICAgICAgICAgICAgJ2Nob29zZSBtZW51IGl0ZW0nLCAnY2xpY2tlZCcsICdjbGlja2VkIHRvb2xiYXIgaXRlbScsCisgICAgICAgICAgICAgICAgICAgICdjbG9zZWQnLCAnY29sdW1uIGNsaWNrZWQnLCAnY29sdW1uIG1vdmVkJywKKyAgICAgICAgICAgICAgICAgICAgJ2NvbHVtbiByZXNpemVkJywgJ2NvbmNsdWRlIGRyb3AnLCAnZGF0YSByZXByZXNlbnRhdGlvbicsCisgICAgICAgICAgICAgICAgICAgICdkZW1pbmlhdHVyaXplZCcsICdkaWFsb2cgZW5kZWQnLCAnZG9jdW1lbnQgbmliIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAnZG91YmxlIGNsaWNrZWQnLCAnZHJhZyggKGVudGVyZWR8ZXhpdGVkfHVwZGF0ZWQpKT8nLAorICAgICAgICAgICAgICAgICAgICAnZHJvcCcsICdlbmQgZWRpdGluZycsICdleHBvc2VkJywgJ2lkbGUnLCAnaXRlbSBleHBhbmRhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgJ2l0ZW0gdmFsdWUnLCAnaXRlbSB2YWx1ZSBjaGFuZ2VkJywgJ2l0ZW1zIGNoYW5nZWQnLAorICAgICAgICAgICAgICAgICAgICAna2V5Ym9hcmQgZG93bicsICdrZXlib2FyZCB1cCcsICdsYXVuY2hlZCcsCisgICAgICAgICAgICAgICAgICAgICdsb2FkIGRhdGEgcmVwcmVzZW50YXRpb24nLCAnbWluaWF0dXJpemVkJywgJ21vdXNlIGRvd24nLAorICAgICAgICAgICAgICAgICAgICAnbW91c2UgZHJhZ2dlZCcsICdtb3VzZSBlbnRlcmVkJywgJ21vdXNlIGV4aXRlZCcsCisgICAgICAgICAgICAgICAgICAgICdtb3VzZSBtb3ZlZCcsICdtb3VzZSB1cCcsICdtb3ZlZCcsCisgICAgICAgICAgICAgICAgICAgICdudW1iZXIgb2YgYnJvd3NlciByb3dzJywgJ251bWJlciBvZiBpdGVtcycsCisgICAgICAgICAgICAgICAgICAgICdudW1iZXIgb2Ygcm93cycsICdvcGVuIHVudGl0bGVkJywgJ29wZW5lZCcsICdwYW5lbCBlbmRlZCcsCisgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXJzIHVwZGF0ZWQnLCAncGx1Z2luIGxvYWRlZCcsICdwcmVwYXJlIGRyb3AnLAorICAgICAgICAgICAgICAgICAgICAncHJlcGFyZSBvdXRsaW5lIGRyYWcnLCAncHJlcGFyZSBvdXRsaW5lIGRyb3AnLAorICAgICAgICAgICAgICAgICAgICAncHJlcGFyZSB0YWJsZSBkcmFnJywgJ3ByZXBhcmUgdGFibGUgZHJvcCcsCisgICAgICAgICAgICAgICAgICAgICdyZWFkIGZyb20gZmlsZScsICdyZXNpZ25lZCBhY3RpdmUnLCAncmVzaWduZWQga2V5JywKKyAgICAgICAgICAgICAgICAgICAgJ3Jlc2lnbmVkIG1haW4nLCAncmVzaXplZCggc3ViIHZpZXdzKT8nLAorICAgICAgICAgICAgICAgICAgICAncmlnaHQgbW91c2UgZG93bicsICdyaWdodCBtb3VzZSBkcmFnZ2VkJywKKyAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0IG1vdXNlIHVwJywgJ3Jvd3MgY2hhbmdlZCcsICdzY3JvbGwgd2hlZWwnLAorICAgICAgICAgICAgICAgICAgICAnc2VsZWN0ZWQgdGFiIHZpZXcgaXRlbScsICdzZWxlY3Rpb24gY2hhbmdlZCcsCisgICAgICAgICAgICAgICAgICAgICdzZWxlY3Rpb24gY2hhbmdpbmcnLCAnc2hvdWxkIGJlZ2luIGVkaXRpbmcnLAorICAgICAgICAgICAgICAgICAgICAnc2hvdWxkIGNsb3NlJywgJ3Nob3VsZCBjb2xsYXBzZSBpdGVtJywKKyAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBlbmQgZWRpdGluZycsICdzaG91bGQgZXhwYW5kIGl0ZW0nLAorICAgICAgICAgICAgICAgICAgICAnc2hvdWxkIG9wZW4oIHVudGl0bGVkKT8nLAorICAgICAgICAgICAgICAgICAgICAnc2hvdWxkIHF1aXQoIGFmdGVyIGxhc3Qgd2luZG93IGNsb3NlZCk/JywKKyAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBzZWxlY3QgY29sdW1uJywgJ3Nob3VsZCBzZWxlY3QgaXRlbScsCisgICAgICAgICAgICAgICAgICAgICdzaG91bGQgc2VsZWN0IHJvdycsICdzaG91bGQgc2VsZWN0IHRhYiB2aWV3IGl0ZW0nLAorICAgICAgICAgICAgICAgICAgICAnc2hvdWxkIHNlbGVjdGlvbiBjaGFuZ2UnLCAnc2hvdWxkIHpvb20nLCAnc2hvd24nLAorICAgICAgICAgICAgICAgICAgICAndXBkYXRlIG1lbnUgaXRlbScsICd1cGRhdGUgcGFyYW1ldGVycycsCisgICAgICAgICAgICAgICAgICAgICd1cGRhdGUgdG9vbGJhciBpdGVtJywgJ3dhcyBoaWRkZW4nLCAnd2FzIG1pbmlhdHVyaXplZCcsCisgICAgICAgICAgICAgICAgICAgICd3aWxsIGJlY29tZSBhY3RpdmUnLCAnd2lsbCBjbG9zZScsICd3aWxsIGRpc21pc3MnLAorICAgICAgICAgICAgICAgICAgICAnd2lsbCBkaXNwbGF5IGJyb3dzZXIgY2VsbCcsICd3aWxsIGRpc3BsYXkgY2VsbCcsCisgICAgICAgICAgICAgICAgICAgICd3aWxsIGRpc3BsYXkgaXRlbSBjZWxsJywgJ3dpbGwgZGlzcGxheSBvdXRsaW5lIGNlbGwnLAorICAgICAgICAgICAgICAgICAgICAnd2lsbCBmaW5pc2ggbGF1bmNoaW5nJywgJ3dpbGwgaGlkZScsICd3aWxsIG1pbmlhdHVyaXplJywKKyAgICAgICAgICAgICAgICAgICAgJ3dpbGwgbW92ZScsICd3aWxsIG9wZW4nLCAnd2lsbCBwb3AgdXAnLCAnd2lsbCBxdWl0JywKKyAgICAgICAgICAgICAgICAgICAgJ3dpbGwgcmVzaWduIGFjdGl2ZScsICd3aWxsIHJlc2l6ZSggc3ViIHZpZXdzKT8nLAorICAgICAgICAgICAgICAgICAgICAnd2lsbCBzZWxlY3QgdGFiIHZpZXcgaXRlbScsICd3aWxsIHNob3cnLCAnd2lsbCB6b29tJywKKyAgICAgICAgICAgICAgICAgICAgJ3dyaXRlIHRvIGZpbGUnLCAnem9vbWVkJ10KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdHVkaW9fY29tbWFuZHMKKyAgICAgICAgQHN0dWRpb19jb21tYW5kcyB8fD0gWydhbmltYXRlJywgJ2FwcGVuZCcsICdjYWxsIG1ldGhvZCcsICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICdjbG9zZSBkcmF3ZXInLCAnY2xvc2UgcGFuZWwnLCAnZGlzcGxheScsCisgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXkgYWxlcnQnLCAnZGlzcGxheSBkaWFsb2cnLCAnZGlzcGxheSBwYW5lbCcsICdnbycsCisgICAgICAgICAgICAgICAgICAgICAgJ2hpZGUnLCAnaGlnaGxpZ2h0JywgJ2luY3JlbWVudCcsICdpdGVtIGZvcicsCisgICAgICAgICAgICAgICAgICAgICAgJ2xvYWQgaW1hZ2UnLCAnbG9hZCBtb3ZpZScsICdsb2FkIG5pYicsICdsb2FkIHBhbmVsJywKKyAgICAgICAgICAgICAgICAgICAgICAnbG9hZCBzb3VuZCcsICdsb2NhbGl6ZWQgc3RyaW5nJywgJ2xvY2sgZm9jdXMnLCAnbG9nJywKKyAgICAgICAgICAgICAgICAgICAgICAnb3BlbiBkcmF3ZXInLCAncGF0aCBmb3InLCAncGF1c2UnLCAncGVyZm9ybSBhY3Rpb24nLAorICAgICAgICAgICAgICAgICAgICAgICdwbGF5JywgJ3JlZ2lzdGVyJywgJ3Jlc3VtZScsICdzY3JvbGwnLCAnc2VsZWN0KCBhbGwpPycsCisgICAgICAgICAgICAgICAgICAgICAgJ3Nob3cnLCAnc2l6ZSB0byBmaXQnLCAnc3RhcnQnLCAnc3RlcCBiYWNrJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3RlcCBmb3J3YXJkJywgJ3N0b3AnLCAnc3luY2hyb25pemUnLCAndW5sb2NrIGZvY3VzJywKKyAgICAgICAgICAgICAgICAgICAgICAndXBkYXRlJ10KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdHVkaW9fcHJvcGVydGllcworICAgICAgICBAc3R1ZGlvX3Byb3BlcnRpZXMgfHw9IFsnYWNjZXB0cyBhcnJvdyBrZXknLCAnYWN0aW9uIG1ldGhvZCcsICdhY3RpdmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2FsaWdubWVudCcsICdhbGxvd2VkIGlkZW50aWZpZXJzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdhbGxvd3MgYnJhbmNoIHNlbGVjdGlvbicsICdhbGxvd3MgY29sdW1uIHJlb3JkZXJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2FsbG93cyBjb2x1bW4gcmVzaXppbmcnLCAnYWxsb3dzIGNvbHVtbiBzZWxlY3Rpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2FsbG93cyBjdXN0b21pemF0aW9uJywgJ2FsbG93cyBlZGl0aW5nIHRleHQgYXR0cmlidXRlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnYWxsb3dzIGVtcHR5IHNlbGVjdGlvbicsICdhbGxvd3MgbWl4ZWQgc3RhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2FsbG93cyBtdWx0aXBsZSBzZWxlY3Rpb24nLCAnYWxsb3dzIHJlb3JkZXJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2FsbG93cyB1bmRvJywgJ2FscGhhKCB2YWx1ZSk/JywgJ2FsdGVybmF0ZSBpbWFnZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnYWx0ZXJuYXRlIGluY3JlbWVudCB2YWx1ZScsICdhbHRlcm5hdGUgdGl0bGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2FuaW1hdGlvbiBkZWxheScsICdhc3NvY2lhdGVkIGZpbGUgbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnYXNzb2NpYXRlZCBvYmplY3QnLCAnYXV0byBjb21wbGV0ZXMnLCAnYXV0byBkaXNwbGF5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdhdXRvIGVuYWJsZXMgaXRlbXMnLCAnYXV0byByZXBlYXQnLCAnYXV0byByZXNpemVzKCBvdXRsaW5lIGNvbHVtbik/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdhdXRvIHNhdmUgZXhwYW5kZWQgaXRlbXMnLCAnYXV0byBzYXZlIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dG8gc2F2ZSB0YWJsZSBjb2x1bW5zJywgJ2F1dG8gc2F2ZXMgY29uZmlndXJhdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAnYXV0byBzY3JvbGwnLCAnYXV0byBzaXplcyBhbGwgY29sdW1ucyB0byBmaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dG8gc2l6ZXMgY2VsbHMnLCAnYmFja2dyb3VuZCBjb2xvcicsICdiZXplbCBzdGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnYmV6ZWwgc3R5bGUnLCAnYmV6ZWxlZCcsICdib3JkZXIgcmVjdCcsICdib3JkZXIgdHlwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyZWQnLCAnYm91bmRzKCByb3RhdGlvbik/JywgJ2JveCB0eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdidXR0b24gcmV0dXJuZWQnLCAnYnV0dG9uIHR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbiBjaG9vc2UgZGlyZWN0b3JpZXMnLCAnY2FuIGNob29zZSBmaWxlcycsICdjYW4gZHJhdycsICdjYW4gaGlkZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnY2VsbCggKGJhY2tncm91bmQgY29sb3J8c2l6ZXx0eXBlKSk/JywgJ2NoYXJhY3RlcnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzJywgJ2NsaWNrIGNvdW50JywgJ2NsaWNrZWQoIGRhdGEpPyBjb2x1bW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWNrZWQgZGF0YSBpdGVtJywgJ2NsaWNrZWQoIGRhdGEpPyByb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2Nsb3NlYWJsZScsICdjb2xsYXRpbmcnLCAnY29sb3IoIChtb2RlfHBhbmVsKSknLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbW1hbmQga2V5IGRvd24nLCAnY29uZmlndXJhdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudChzfCAoc2l6ZXx2aWV3KCBtYXJnaW5zKT8pKT8nLCAnY29udGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnY29udGludW91cycsICdjb250cm9sIGtleSBkb3duJywgJ2NvbnRyb2wgc2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnY29udHJvbCB0aW50JywgJ2NvbnRyb2wgdmlldycsCisgICAgICAgICAgICAgICAgICAgICAgICAnY29udHJvbGxlciB2aXNpYmxlJywgJ2Nvb3JkaW5hdGUgc3lzdGVtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdjb3BpZXMoIG9uIHNjcm9sbCk/JywgJ2Nvcm5lciB2aWV3JywgJ2N1cnJlbnQgY2VsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnY3VycmVudCBjb2x1bW4nLCAnY3VycmVudCggZmllbGQpPyAgZWRpdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdjdXJyZW50KCBtZW51KT8gaXRlbScsICdjdXJyZW50IHJvdycsCisgICAgICAgICAgICAgICAgICAgICAgICAnY3VycmVudCB0YWIgdmlldyBpdGVtJywgJ2RhdGEgc291cmNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0IGlkZW50aWZpZXJzJywgJ2RlbHRhICh4fHl8eiknLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2Rlc3RpbmF0aW9uIHdpbmRvdycsICdkaXJlY3RvcnknLCAnZGlzcGxheSBtb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5ZWQgY2VsbCcsICdkb2N1bWVudCggKGVkaXRlZHxyZWN0fHZpZXcpKT8nLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2RvdWJsZSB2YWx1ZScsICdkcmFnZ2VkIGNvbHVtbicsICdkcmFnZ2VkIGRpc3RhbmNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdkcmFnZ2VkIGl0ZW1zJywgJ2RyYXdzKCBjZWxsKT8gYmFja2dyb3VuZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnZHJhd3MgZ3JpZCcsICdkeW5hbWljYWxseSBzY3JvbGxzJywgJ2VjaG9zIGJ1bGxldHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2VkZ2UnLCAnZWRpdGFibGUnLCAnZWRpdGVkKCBkYXRhKT8gY29sdW1uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQgZGF0YSBpdGVtJywgJ2VkaXRlZCggZGF0YSk/IHJvdycsICdlbmFibGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdlbmNsb3Npbmcgc2Nyb2xsIHZpZXcnLCAnZW5kaW5nIHBhZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yIGhhbmRsaW5nJywgJ2V2ZW50IG51bWJlcicsICdldmVudCB0eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdleGNsdWRlZCBmcm9tIHdpbmRvd3MgbWVudScsICdleGVjdXRhYmxlIHBhdGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZGVkJywgJ2ZheCBudW1iZXInLCAnZmllbGQgZWRpdG9yJywgJ2ZpbGUga2luZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBuYW1lJywgJ2ZpbGUgdHlwZScsICdmaXJzdCByZXNwb25kZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpcnN0IHZpc2libGUgY29sdW1uJywgJ2ZsaXBwZWQnLCAnZmxvYXRpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQoIHBhbmVsKT8nLCAnZm9ybWF0dGVyJywgJ2ZyYW1ld29ya3MgcGF0aCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbnRtb3N0JywgJ2dhdmUgdXAnLCAnZ3JpZCBjb2xvcicsICdoYXMgZGF0YSBpdGVtcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIGhvcml6b250YWwgcnVsZXInLCAnaGFzIGhvcml6b250YWwgc2Nyb2xsZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBwYXJlbnQgZGF0YSBpdGVtJywgJ2hhcyByZXNpemUgaW5kaWNhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgc2hhZG93JywgJ2hhcyBzdWIgbWVudScsICdoYXMgdmVydGljYWwgcnVsZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyB2ZXJ0aWNhbCBzY3JvbGxlcicsICdoZWFkZXIgY2VsbCcsICdoZWFkZXIgdmlldycsCisgICAgICAgICAgICAgICAgICAgICAgICAnaGlkZGVuJywgJ2hpZGVzIHdoZW4gZGVhY3RpdmF0ZWQnLCAnaGlnaGxpZ2h0cyBieScsCisgICAgICAgICAgICAgICAgICAgICAgICAnaG9yaXpvbnRhbCBsaW5lIHNjcm9sbCcsICdob3Jpem9udGFsIHBhZ2Ugc2Nyb2xsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdob3Jpem9udGFsIHJ1bGVyIHZpZXcnLCAnaG9yaXpvbnRhbGx5IHJlc2l6YWJsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnaWNvbiBpbWFnZScsICdpZCcsICdpZGVudGlmaWVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdpZ25vcmVzIG11bHRpcGxlIGNsaWNrcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnaW1hZ2UoIChhbGlnbm1lbnR8ZGltcyB3aGVuIGRpc2FibGVkfGZyYW1lIHN0eWxlfHNjYWxpbmcpKT8nLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydHMgZ3JhcGhpY3MnLCAnaW5jcmVtZW50IHZhbHVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdpbmRlbnRhdGlvbiBwZXIgbGV2ZWwnLCAnaW5kZXRlcm1pbmF0ZScsICdpbmRleCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnaW50ZWdlciB2YWx1ZScsICdpbnRlcmNlbGwgc3BhY2luZycsICdpdGVtIGhlaWdodCcsCisgICAgICAgICAgICAgICAgICAgICAgICAna2V5KCAoY29kZXxlcXVpdmFsZW50KCBtb2RpZmllcik/fHdpbmRvdykpPycsCisgICAgICAgICAgICAgICAgICAgICAgICAna25vYiB0aGlja25lc3MnLCAnbGFiZWwnLCAnbGFzdCggdmlzaWJsZSk/IGNvbHVtbicsCisgICAgICAgICAgICAgICAgICAgICAgICAnbGVhZGluZyBvZmZzZXQnLCAnbGVhZicsICdsZXZlbCcsICdsaW5lIHNjcm9sbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnbG9hZGVkJywgJ2xvY2FsaXplZCBzb3J0JywgJ2xvY2F0aW9uJywgJ2xvb3AgbW9kZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnbWFpbiggKGJ1bmRlfG1lbnV8d2luZG93KSk/JywgJ21hcmtlciBmb2xsb3dzIGNlbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ21hdHJpeCBtb2RlJywgJ21heGltdW0oIGNvbnRlbnQpPyBzaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdtYXhpbXVtIHZpc2libGUgY29sdW1ucycsCisgICAgICAgICAgICAgICAgICAgICAgICAnbWVudSggZm9ybSByZXByZXNlbnRhdGlvbik/JywgJ21pbmlhdHVyaXphYmxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdtaW5pYXR1cml6ZWQnLCAnbWluaW1pemVkIGltYWdlJywgJ21pbmltaXplZCB0aXRsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnbWluaW11bSBjb2x1bW4gd2lkdGgnLCAnbWluaW11bSggY29udGVudCk/IHNpemUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ21vZGFsJywgJ21vZGlmaWVkJywgJ21vdXNlIGRvd24gc3RhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ21vdmllKCAoY29udHJvbGxlcnxmaWxlfHJlY3QpKT8nLCAnbXV0ZWQnLCAnbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnbmVlZHMgZGlzcGxheScsICduZXh0IHN0YXRlJywgJ25leHQgdGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyIG9mIHRpY2sgbWFya3MnLCAnb25seSB0aWNrIG1hcmsgdmFsdWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdvcGFxdWUnLCAnb3BlbiBwYW5lbCcsICdvcHRpb24ga2V5IGRvd24nLAorICAgICAgICAgICAgICAgICAgICAgICAgJ291dGxpbmUgdGFibGUgY29sdW1uJywgJ3BhZ2Ugc2Nyb2xsJywgJ3BhZ2VzIGFjcm9zcycsCisgICAgICAgICAgICAgICAgICAgICAgICAncGFnZXMgZG93bicsICdwYWxldHRlIGxhYmVsJywgJ3BhbmUgc3BsaXR0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmVudCBkYXRhIGl0ZW0nLCAncGFyZW50IHdpbmRvdycsICdwYXN0ZWJvYXJkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdwYXRoKCAobmFtZXN8c2VwYXJhdG9yKSk/JywgJ3BsYXlpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXlzIGV2ZXJ5IGZyYW1lJywgJ3BsYXlzIHNlbGVjdGlvbiBvbmx5JywgJ3Bvc2l0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdwcmVmZXJyZWQgZWRnZScsICdwcmVmZXJyZWQgdHlwZScsICdwcmVzc3VyZScsCisgICAgICAgICAgICAgICAgICAgICAgICAncHJldmlvdXMgdGV4dCcsICdwcm9tcHQnLCAncHJvcGVydGllcycsCisgICAgICAgICAgICAgICAgICAgICAgICAncHJvdG90eXBlIGNlbGwnLCAncHVsbHMgZG93bicsICdyYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdyZWxlYXNlZCB3aGVuIGNsb3NlZCcsICdyZXBlYXRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWVzdGVkIHByaW50IHRpbWUnLCAncmVxdWlyZWQgZmlsZSB0eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdyZXNpemFibGUnLCAncmVzaXplZCBjb2x1bW4nLCAncmVzb3VyY2UgcGF0aCcsCisgICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJucyByZWNvcmRzJywgJ3JldXNlcyBjb2x1bW5zJywgJ3JpY2ggdGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAncm9sbCBvdmVyJywgJ3JvdyBoZWlnaHQnLCAncnVsZXJzIHZpc2libGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NhdmUgcGFuZWwnLCAnc2NyaXB0cyBwYXRoJywgJ3Njcm9sbGFibGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGVjdGFibGUoIGlkZW50aWZpZXJzKT8nLCAnc2VsZWN0ZWQgY2VsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2VsZWN0ZWQoIGRhdGEpPyBjb2x1bW5zPycsICdzZWxlY3RlZCBkYXRhIGl0ZW1zPycsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2VsZWN0ZWQoIGRhdGEpPyByb3dzPycsICdzZWxlY3RlZCBpdGVtIGlkZW50aWZpZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGVjdGlvbiBieSByZWN0JywgJ3NlbmQgYWN0aW9uIG9uIGFycm93IGtleScsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2VuZHMgYWN0aW9uIHdoZW4gZG9uZSBlZGl0aW5nJywgJ3NlcGFyYXRlcyBjb2x1bW5zJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3IgaXRlbScsICdzZXF1ZW5jZSBudW1iZXInLCAnc2VydmljZXMgbWVudScsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2hhcmVkIGZyYW1ld29ya3MgcGF0aCcsICdzaGFyZWQgc3VwcG9ydCBwYXRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzaGVldCcsICdzaGlmdCBrZXkgZG93bicsICdzaG93cyBhbHBoYScsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2hvd3Mgc3RhdGUgYnknLCAnc2l6ZSggbW9kZSk/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzbWFydCBpbnNlcnQgZGVsZXRlIGVuYWJsZWQnLCAnc29ydCBjYXNlIHNlbnNpdGl2aXR5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzb3J0IGNvbHVtbicsICdzb3J0IG9yZGVyJywgJ3NvcnQgdHlwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnc29ydGVkKCBkYXRhIHJvd3MpPycsICdzb3VuZCcsICdzb3VyY2UoIG1hc2spPycsCisgICAgICAgICAgICAgICAgICAgICAgICAnc3BlbGwgY2hlY2tpbmcgZW5hYmxlZCcsICdzdGFydGluZyBwYWdlJywgJ3N0YXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcgdmFsdWUnLCAnc3ViIG1lbnUnLCAnc3VwZXIgbWVudScsICdzdXBlciB2aWV3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICd0YWIga2V5IHRyYXZlcnNlcyBjZWxscycsICd0YWIgc3RhdGUnLCAndGFiIHR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYiB2aWV3JywgJ3RhYmxlIHZpZXcnLCAndGFnJywgJ3RhcmdldCggcHJpbnRlcik/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0IGNvbG9yJywgJ3RleHQgY29udGFpbmVyIGluc2VydCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndGV4dCBjb250YWluZXIgb3JpZ2luJywgJ3RleHQgcmV0dXJuZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3RpY2sgbWFyayBwb3NpdGlvbicsICd0aW1lIHN0YW1wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aXRsZShkfCAoY2VsbHxmb250fGhlaWdodHxwb3NpdGlvbnxyZWN0KSk/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICd0b29sIHRpcCcsICd0b29sYmFyJywgJ3RyYWlsaW5nIG9mZnNldCcsICd0cmFuc3BhcmVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndHJlYXQgcGFja2FnZXMgYXMgZGlyZWN0b3JpZXMnLCAndHJ1bmNhdGVkIGxhYmVscycsCisgICAgICAgICAgICAgICAgICAgICAgICAndHlwZXMnLCAndW5tb2RpZmllZCBjaGFyYWN0ZXJzJywgJ3VwZGF0ZSB2aWV3cycsCisgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHNvcnQgaW5kaWNhdG9yJywgJ3VzZXIgZGVmYXVsdHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXMgZGF0YSBzb3VyY2UnLCAndXNlcyBydWxlcicsICd1c2VzIHRocmVhZGVkIGFuaW1hdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAndXNlcyB0aXRsZSBmcm9tIHByZXZpb3VzIGNvbHVtbicsICd2YWx1ZSB3cmFwcycsICd2ZXJzaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ0aWNhbCggKGxpbmUgc2Nyb2xsfHBhZ2Ugc2Nyb2xsfHJ1bGVyIHZpZXcpKT8nLCAndmVydGljYWxseSByZXNpemFibGUnLCAndmlldycsCisgICAgICAgICAgICAgICAgICAgICAgICAndmlzaWJsZSggZG9jdW1lbnQgcmVjdCk/JywgJ3ZvbHVtZScsICd3aWR0aCcsICd3aW5kb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3dpbmRvd3MgbWVudScsICd3cmFwcycsICd6b29tYWJsZScsICd6b29tZWQnXQorICAgICAgZW5kCisKKyAgICAgIG9wZXJhdG9ycyA9ICVyKFxiKCN7c2VsZi5vcGVyYXRvcnMudG9fYS5qb2luKCd8Jyl9KVxiKQorICAgICAgY2xhc3NlcyA9ICVyKFxiKGFzICkoI3tzZWxmLmNsYXNzZXMudG9fYS5qb2luKCd8Jyl9KVxiKQorICAgICAgbGl0ZXJhbHMgPSAlcihcYigje3NlbGYubGl0ZXJhbHMudG9fYS5qb2luKCd8Jyl9KVxiKQorICAgICAgY29tbWFuZHMgPSAlcihcYigje3NlbGYuY29tbWFuZHMudG9fYS5qb2luKCd8Jyl9KVxiKQorICAgICAgY29udHJvbHMgPSAlcihcYigje3NlbGYuY29udHJvbHMudG9fYS5qb2luKCd8Jyl9KVxiKQorICAgICAgZGVjbGFyYXRpb25zID0gJXIoXGIoI3tzZWxmLmRlY2xhcmF0aW9ucy50b19hLmpvaW4oJ3wnKX0pXGIpCisgICAgICByZXNlcnZlZCA9ICVyKFxiKCN7c2VsZi5yZXNlcnZlZC50b19hLmpvaW4oJ3wnKX0pXGIpCisgICAgICBidWlsdGlucyA9ICVyKFxiKCN7c2VsZi5idWlsdGlucy50b19hLmpvaW4oJ3wnKX0pcz9cYikKKyAgICAgIGhhbmRsZXJfcGFyYW1zID0gJXIoXGIoI3tzZWxmLmhhbmRsZXJfcGFyYW1zLnRvX2Euam9pbignfCcpfSlcYikKKyAgICAgIHJlZmVyZW5jZXMgPSAlcihcYigje3NlbGYucmVmZXJlbmNlcy50b19hLmpvaW4oJ3wnKX0pXGIpCisgICAgICBzdHVkaW9fcHJvcGVydGllcyA9ICVyKFxiKCN7c2VsZi5zdHVkaW9fcHJvcGVydGllcy50b19hLmpvaW4oJ3wnKX0pXGIpCisgICAgICBzdHVkaW9fY2xhc3NlcyA9ICVyKFxiKCN7c2VsZi5zdHVkaW9fY2xhc3Nlcy50b19hLmpvaW4oJ3wnKX0pcz9cYikKKyAgICAgIHN0dWRpb19jb21tYW5kcyA9ICVyKFxiKCN7c2VsZi5zdHVkaW9fY29tbWFuZHMudG9fYS5qb2luKCd8Jyl9KVxiKQorICAgICAgaWRlbnRpZmllcnMgPSAlcihcYihbYS16QS1aXVx3KilcYikKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dDo6V2hpdGVzcGFjZQorICAgICAgICBydWxlIC/CrFxuLywgTGl0ZXJhbDo6U3RyaW5nOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvJ3NccysvLCBUZXh0CisgICAgICAgIHJ1bGUgLygtLXwjKS4qPyQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXChcKi8sIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgICBydWxlIC9bXChcKXt9ISwuOl0vLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC8owqspKFtewrtdKykowrspLyBkbyB8bWF0Y2h8CisgICAgICAgICAgdG9rZW4gVGV4dCwgbWF0Y2hbMV0KKyAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluLCBtYXRjaFsyXQorICAgICAgICAgIHRva2VuIFRleHQsIG1hdGNoWzNdCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC9cYigoPzpjb25zaWRlcmluZ3xpZ25vcmluZylccyopKGFwcGxpY2F0aW9uIHJlc3BvbnNlc3xjYXNlfGRpYWNyaXRpY2Fsc3xoeXBoZW5zfG51bWVyaWMgc3RyaW5nc3xwdW5jdHVhdGlvbnx3aGl0ZSBzcGFjZSkvIGRvIHxtYXRjaHwKKyAgICAgICAgICB0b2tlbiBLZXl3b3JkLCBtYXRjaFsxXQorICAgICAgICAgIHRva2VuIE5hbWU6OkJ1aWx0aW4sIG1hdGNoWzJdCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC8oLXxcKnxcK3wmfOKJoHw+PT98PD0/fD184omlfOKJpHxcL3zDt3xcXikvLCBPcGVyYXRvcgorICAgICAgICBydWxlIG9wZXJhdG9ycywgT3BlcmF0b3I6OldvcmQKKyAgICAgICAgcnVsZSAvXihccyooPzpvbnxlbmQpXHMrKSdyJyglcykvIGRvIHxtYXRjaHwKKyAgICAgICAgICB0b2tlbiBLZXl3b3JkLCBtYXRjaFsxXQorICAgICAgICAgIHRva2VuIE5hbWU6OkZ1bmN0aW9uLCBtYXRjaFsyXQorICAgICAgICBlbmQKKyAgICAgICAgcnVsZSAvXihccyopKGlufG9ufHNjcmlwdHx0bykoXHMrKS8gZG8gfG1hdGNofAorICAgICAgICAgIHRva2VuIFRleHQsIG1hdGNoWzFdCisgICAgICAgICAgdG9rZW4gS2V5d29yZCwgbWF0Y2hbMl0KKyAgICAgICAgICB0b2tlbiBUZXh0LCBtYXRjaFszXQorICAgICAgICBlbmQKKyAgICAgICAgcnVsZSBjbGFzc2VzIGRvIHxtYXRjaHwKKyAgICAgICAgICB0b2tlbiBLZXl3b3JkLCBtYXRjaFsxXQorICAgICAgICAgIHRva2VuIE5hbWU6OkNsYXNzLCBtYXRjaFsyXQorICAgICAgICBlbmQKKyAgICAgICAgcnVsZSBjb21tYW5kcywgTmFtZTo6QnVpbHRpbgorICAgICAgICBydWxlIGNvbnRyb2xzLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgZGVjbGFyYXRpb25zLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgcmVzZXJ2ZWQsIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgcnVsZSBidWlsdGlucywgTmFtZTo6QnVpbHRpbgorICAgICAgICBydWxlIGhhbmRsZXJfcGFyYW1zLCBOYW1lOjpCdWlsdGluCisgICAgICAgIHJ1bGUgc3R1ZGlvX3Byb3BlcnRpZXMsIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBydWxlIHN0dWRpb19jbGFzc2VzLCBOYW1lOjpCdWlsdGluCisgICAgICAgIHJ1bGUgc3R1ZGlvX2NvbW1hbmRzLCBOYW1lOjpCdWlsdGluCisgICAgICAgIHJ1bGUgcmVmZXJlbmNlcywgTmFtZTo6QnVpbHRpbgorICAgICAgICBydWxlIC8iKFxcXFx8XFwifFteIl0pKiIvLCBMaXRlcmFsOjpTdHJpbmc6OkRvdWJsZQorICAgICAgICBydWxlIGlkZW50aWZpZXJzLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBydWxlIC9bLStdPyhcZCtcLlxkKnxcZCpcLlxkKykoRVstK11bMC05XSspPy8sIExpdGVyYWw6Ok51bWJlcjo6RmxvYXQKKyAgICAgICAgcnVsZSAvWy0rXT9cZCsvLCBMaXRlcmFsOjpOdW1iZXI6OkludGVnZXIKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvYmltbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2JpbWwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiODNmZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2JpbWwucmIKQEAgLTAsMCArMSw0MSBAQAorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBsb2FkX2xleGVyICd4bWwucmInCisgICAgICAgIAorICAgIGNsYXNzIEJJTUwgPCBYTUwKKyAgICAgIHRpdGxlICJCSU1MIgorICAgICAgZGVzYyAiQklNTCwgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIE1hcmt1cCBMYW5ndWFnZSIKKyAgICAgIHRhZyAnYmltbCcKKyAgICAgIGZpbGVuYW1lcyAnKi5iaW1sJworICAgICAgICAgICAgCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dCA9fiAvPFxzKkJpbWxcYi8KKyAgICAgIGVuZAorICAgICAgICAgICAgCisgICAgICBwcmVwZW5kIDpyb290IGRvCisgICAgICAgIHJ1bGUgJXIoPCNAXHMqKW0sIE5hbWU6OlRhZywgOmRpcmVjdGl2ZV90YWcKKyAgICAgICAgICAgICAgCisgICAgICAgIHJ1bGUgJXIoPCNbPV0/XHMqKW0sIE5hbWU6OlRhZywgOmRpcmVjdGl2ZV9hc19jc2hhcnAKKyAgICAgIGVuZAorICAgICAgICAgICAgCisgICAgICBwcmVwZW5kIDphdHRyIGRvCisgICAgICAgICNUT0RPOiBob3cgdG8gZGVhbCB3aXRoIGVtYmVkZGVkIDwjIHRhZ3MgaW5zaWRlIGEgYXR0cmlidXRlIHN0cmluZworICAgICAgICAjcnVsZSAlcigiPCNbPV0/XHMqKW0sIE5hbWU6OlRhZywgOmRpcmVjdGl2ZV9hc19jc2hhcnAKKyAgICAgIGVuZAorICAgICAgICAgICAgCisgICAgICBzdGF0ZSA6ZGlyZWN0aXZlX2FzX2NzaGFycCBkbworICAgICAgICBydWxlIC9ccyojPlxzKi9tLCBOYW1lOjpUYWcsIDpwb3AhIAorICAgICAgICBydWxlICVyKC4qPyg/PVxzKiM+XHMqKSltIGRvCisgICAgICAgICAgZGVsZWdhdGUgQ1NoYXJwCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICAgICAgICAKKyAgICAgIHN0YXRlIDpkaXJlY3RpdmVfdGFnIGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgL1tcdy46LV0rXHMqPS9tLCBOYW1lOjpBdHRyaWJ1dGUsIDphdHRyCisgICAgICAgIHJ1bGUgL1tcd10rXHMqL20sIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBydWxlICVyKC8/XHMqIz4pLCBOYW1lOjpUYWcsIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2MucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYmNlNzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jLnJiCkBAIC0wLDAgKzEsMjE3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgQyA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRhZyAnYycKKyAgICAgIGZpbGVuYW1lcyAnKi5jJywgJyouaCcsICcqLmlkYycKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LWNoZHInLCAndGV4dC94LWNzcmMnCisKKyAgICAgIHRpdGxlICJDIgorICAgICAgZGVzYyAiVGhlIEMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UiCisKKyAgICAgICMgb3B0aW9uYWwgY29tbWVudCBvciB3aGl0ZXNwYWNlCisgICAgICB3cyA9ICVyKCg/OlxzfC8vLio/XG58L1sqXS4qP1sqXS8pKykKKyAgICAgIGlkID0gL1thLXpBLVpfXVthLXpBLVowLTlfXSovCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIEBrZXl3b3JkcyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBhdXRvIGJyZWFrIGNhc2UgY29uc3QgY29udGludWUgZGVmYXVsdCBkbyBlbHNlIGVudW0gZXh0ZXJuCisgICAgICAgICAgZm9yIGdvdG8gaWYgcmVnaXN0ZXIgcmVzdHJpY3RlZCByZXR1cm4gc2l6ZW9mIHN0YXRpYyBzdHJ1Y3QKKyAgICAgICAgICBzd2l0Y2ggdHlwZWRlZiB1bmlvbiB2b2xhdGlsZSB2aXJ0dWFsIHdoaWxlCisKKyAgICAgICAgICBfQWxpZ25hcyBfQWxpZ25vZiBfQXRvbWljIF9HZW5lcmljIF9JbWFnaW5hcnkKKyAgICAgICAgICBfTm9yZXR1cm4gX1N0YXRpY19hc3NlcnQgX1RocmVhZF9sb2NhbAorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYua2V5d29yZHNfdHlwZQorICAgICAgICBAa2V5d29yZHNfdHlwZSB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBpbnQgbG9uZyBmbG9hdCBzaG9ydCBkb3VibGUgY2hhciB1bnNpZ25lZCBzaWduZWQgdm9pZAorCisgICAgICAgICAgam1wX2J1ZiBGSUxFIERJUiBkaXZfdCBsZGl2X3QgbWJzdGF0ZV90IHNpZ19hdG9taWNfdCBmcG9zX3QKKyAgICAgICAgICBjbG9ja190IHRpbWVfdCB2YV9saXN0IHNpemVfdCBzc2l6ZV90IG9mZl90IHdjaGFyX3QgcHRyZGlmZl90CisgICAgICAgICAgd2N0cmFuc190IHdpbnRfdCB3Y3R5cGVfdAorCisgICAgICAgICAgX0Jvb2wgX0NvbXBsZXggaW50OF90IGludDE2X3QgaW50MzJfdCBpbnQ2NF90CisgICAgICAgICAgdWludDhfdCB1aW50MTZfdCB1aW50MzJfdCB1aW50NjRfdCBpbnRfbGVhc3Q4X3QKKyAgICAgICAgICBpbnRfbGVhc3QxNl90IGludF9sZWFzdDMyX3QgaW50X2xlYXN0NjRfdAorICAgICAgICAgIHVpbnRfbGVhc3Q4X3QgdWludF9sZWFzdDE2X3QgdWludF9sZWFzdDMyX3QKKyAgICAgICAgICB1aW50X2xlYXN0NjRfdCBpbnRfZmFzdDhfdCBpbnRfZmFzdDE2X3QgaW50X2Zhc3QzMl90CisgICAgICAgICAgaW50X2Zhc3Q2NF90IHVpbnRfZmFzdDhfdCB1aW50X2Zhc3QxNl90IHVpbnRfZmFzdDMyX3QKKyAgICAgICAgICB1aW50X2Zhc3Q2NF90IGludHB0cl90IHVpbnRwdHJfdCBpbnRtYXhfdAorICAgICAgICAgIHVpbnRtYXhfdAorCisgICAgICAgICAgY2hhcjE2X3QgY2hhcjMyX3QKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnJlc2VydmVkCisgICAgICAgIEByZXNlcnZlZCB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBfX2FzbSBfX2ludDggX19iYXNlZCBfX2V4Y2VwdCBfX2ludDE2IF9fc3RkY2FsbCBfX2NkZWNsCisgICAgICAgICAgX19mYXN0Y2FsbCBfX2ludDMyIF9fZGVjbHNwZWMgX19maW5hbGx5IF9faW50NjEgX190cnkgX19sZWF2ZQorICAgICAgICAgIGlubGluZSBfaW5saW5lIF9faW5saW5lIG5ha2VkIF9uYWtlZCBfX25ha2VkIHJlc3RyaWN0IF9yZXN0cmljdAorICAgICAgICAgIF9fcmVzdHJpY3QgdGhyZWFkIF90aHJlYWQgX190aHJlYWQgdHlwZW5hbWUgX3R5cGVuYW1lIF9fdHlwZW5hbWUKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgICMgaGlnaCBwcmlvcml0eSBmb3IgZmlsZW5hbWUgbWF0Y2hlcworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KCopCisgICAgICAgIDAuMworICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0gW10KKyAgICAgIGVuZAorCisgICAgICBzdGFydCB7IHB1c2ggOmJvbCB9CisKKyAgICAgIHN0YXRlIDpleHByX2JvbCBkbworICAgICAgICBtaXhpbiA6aW5saW5lX3doaXRlc3BhY2UKKworICAgICAgICBydWxlIC8jaWZcczAvLCBDb21tZW50LCA6aWZfMAorICAgICAgICBydWxlIC8jLywgQ29tbWVudDo6UHJlcHJvYywgOm1hY3JvCisKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICAjIDpleHByX2JvbCBpcyB0aGUgc2FtZSBhcyA6Ym9sIGJ1dCB3aXRob3V0IGxhYmVscywgc2luY2UKKyAgICAgICMgbGFiZWxzIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc3RhdGVtZW50LgorICAgICAgc3RhdGUgOmJvbCBkbworICAgICAgICBydWxlIC8je2lkfTooPyE6KS8sIE5hbWU6OkxhYmVsCisgICAgICAgIG1peGluIDpleHByX2JvbAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbmxpbmVfd2hpdGVzcGFjZSBkbworICAgICAgICBydWxlIC9bIFx0XHJdKy8sIFRleHQKKyAgICAgICAgcnVsZSAvXFxcbi8sIFRleHQgIyBsaW5lIGNvbnRpbnVhdGlvbgorICAgICAgICBydWxlICVyKC8oXFxcbik/WypdLio/WypdKFxcXG4pPy8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOndoaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXG4rL20sIFRleHQsIDpib2wKKyAgICAgICAgcnVsZSAlcigvLyhcXC58LikqP1xuKSwgQ29tbWVudDo6U2luZ2xlLCA6Ym9sCisgICAgICAgIG1peGluIDppbmxpbmVfd2hpdGVzcGFjZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpleHByX3doaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXG4rL20sIFRleHQsIDpleHByX2JvbAorICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdGF0ZW1lbnRzIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgLyh1OHx1fFV8TCk/Ii8sIFN0ciwgOnN0cmluZworICAgICAgICBydWxlICVyKCh1OHx1fFV8TCk/JyhcXC58XFxbMC03XXsxLDN9fFxceFthLWYwLTldezEsMn18W15cXCdcbl0pJylpLCBTdHI6OkNoYXIKKyAgICAgICAgcnVsZSAlcigoXGQrWy5dXGQqfFsuXT9cZCspZVsrLV0/XGQrW2x1XSopaSwgTnVtOjpGbG9hdAorICAgICAgICBydWxlICVyKFxkK2VbKy1dP1xkK1tsdV0qKWksIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvMHhbMC05YS1mXStbbHVdKi9pLCBOdW06OkhleAorICAgICAgICBydWxlIC8wWzAtN10rW2x1XSovaSwgTnVtOjpPY3QKKyAgICAgICAgcnVsZSAvXGQrW2x1XSovaSwgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgJXIoXCovKSwgRXJyb3IKKyAgICAgICAgcnVsZSAlcihbfiElXiYqKz1cfD86PD4vLV0pLCBPcGVyYXRvcgorICAgICAgICBydWxlIC9bKClcW1xdLC5dLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvXGJjYXNlXGIvLCBLZXl3b3JkLCA6Y2FzZQorICAgICAgICBydWxlIC8oPzp0cnVlfGZhbHNlfE5VTEwpXGIvLCBOYW1lOjpCdWlsdGluCisgICAgICAgIHJ1bGUgaWQgZG8gfG18CisgICAgICAgICAgbmFtZSA9IG1bMF0KKworICAgICAgICAgIGlmIHNlbGYuY2xhc3Mua2V5d29yZHMuaW5jbHVkZT8gbmFtZQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3Mua2V5d29yZHNfdHlwZS5pbmNsdWRlPyBuYW1lCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpUeXBlCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5yZXNlcnZlZC5pbmNsdWRlPyBuYW1lCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpSZXNlcnZlZAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuYnVpbHRpbnMuaW5jbHVkZT8gbmFtZQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNhc2UgZG8KKyAgICAgICAgcnVsZSAvOi8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBtaXhpbiA6c3RhdGVtZW50cworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIG1peGluIDpleHByX3doaXRlc3BhY2UKKworICAgICAgICAjIGZ1bmN0aW9ucworICAgICAgICBydWxlICVyKAorICAgICAgICAgIChbXHcqXHNdKz9bXHMqXSkgIyByZXR1cm4gYXJndW1lbnRzCisgICAgICAgICAgKCN7aWR9KSAgICAgICAgICAjIGZ1bmN0aW9uIG5hbWUKKyAgICAgICAgICAoXHMqXChbXjtdKj9cKSkgICMgc2lnbmF0dXJlCisgICAgICAgICAgKCN7d3N9KSh7KSAgICAgICAgICMgb3BlbiBicmFjZQorICAgICAgICApbXggZG8gfG18CisgICAgICAgICAgIyBUT0RPOiBkbyB0aGlzIGJldHRlci4KKyAgICAgICAgICByZWN1cnNlIG1bMV0KKyAgICAgICAgICB0b2tlbiBOYW1lOjpGdW5jdGlvbiwgbVsyXQorICAgICAgICAgIHJlY3Vyc2UgbVszXQorICAgICAgICAgIHJlY3Vyc2UgbVs0XQorICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uLCBtWzVdCisgICAgICAgICAgcHVzaCA6ZnVuY3Rpb24KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAgICAgICAgcnVsZSAlcigKKyAgICAgICAgICAoW1x3KlxzXSs/W1xzKl0pICMgcmV0dXJuIGFyZ3VtZW50cworICAgICAgICAgICgje2lkfSkgICAgICAgICAgIyBmdW5jdGlvbiBuYW1lCisgICAgICAgICAgKFxzKlwoW147XSo/XCkpICAjIHNpZ25hdHVyZQorICAgICAgICAgICgje3dzfSkoOykgICAgICAgIyBzZW1pY29sb24KKyAgICAgICAgKW14IGRvIHxtfAorICAgICAgICAgICMgVE9ETzogZG8gdGhpcyBiZXR0ZXIuCisgICAgICAgICAgcmVjdXJzZSBtWzFdCisgICAgICAgICAgdG9rZW4gTmFtZTo6RnVuY3Rpb24sIG1bMl0KKyAgICAgICAgICByZWN1cnNlIG1bM10KKyAgICAgICAgICByZWN1cnNlIG1bNF0KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVs1XQorICAgICAgICAgIHB1c2ggOnN0YXRlbWVudAorICAgICAgICBlbmQKKworICAgICAgICBydWxlKC8vKSB7IHB1c2ggOnN0YXRlbWVudCB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0YXRlbWVudCBkbworICAgICAgICBydWxlIC87LywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIG1peGluIDpleHByX3doaXRlc3BhY2UKKyAgICAgICAgbWl4aW4gOnN0YXRlbWVudHMKKyAgICAgICAgcnVsZSAvW3t9XS8sIFB1bmN0dWF0aW9uCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZ1bmN0aW9uIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIG1peGluIDpzdGF0ZW1lbnRzCisgICAgICAgIHJ1bGUgLzsvLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC97LywgUHVuY3R1YXRpb24sIDpmdW5jdGlvbgorICAgICAgICBydWxlIC99LywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZyBkbworICAgICAgICBydWxlIC8iLywgU3RyLCA6cG9wIQorICAgICAgICBydWxlIC9cXChbXFxhYmZucnR2IiddfHhbYS1mQS1GMC05XXsyLDR9fFswLTddezEsM30pLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvW15cXCJcbl0rLywgU3RyCisgICAgICAgIHJ1bGUgL1xcXG4vLCBTdHIKKyAgICAgICAgcnVsZSAvXFwvLCBTdHIgIyBzdHJheSBiYWNrc2xhc2gKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bWFjcm8gZG8KKyAgICAgICAgIyBOQjogcG9wISBnb2VzIGJhY2sgdG8gOmJvbAorICAgICAgICBydWxlIC9cbi8sIENvbW1lbnQ6OlByZXByb2MsIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoW14vXG5cXF0rKSwgQ29tbWVudDo6UHJlcHJvYworICAgICAgICBydWxlIC9cXC4vbSwgQ29tbWVudDo6UHJlcHJvYworICAgICAgICBtaXhpbiA6aW5saW5lX3doaXRlc3BhY2UKKyAgICAgICAgcnVsZSAlcigvKSwgQ29tbWVudDo6UHJlcHJvYworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppZl8wIGRvCisgICAgICAgICMgTkI6IG5vIFxiIGhlcmUsIHRvIGNvdmVyICNpZmRlZiBhbmQgI2lmbmRlZgorICAgICAgICBydWxlIC9eXHMqI2lmLywgQ29tbWVudCwgOmlmXzAKKyAgICAgICAgcnVsZSAvXlxzKiNccyplbCg/OnNlfGlmKS8sIENvbW1lbnQsIDpwb3AhCisgICAgICAgIHJ1bGUgL15ccyojXHMqZW5kaWZcYi4qPyg/PCFcXClcbi9tLCBDb21tZW50LCA6cG9wIQorICAgICAgICBydWxlIC8uKj9cbi8sIENvbW1lbnQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY2V5bG9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY2V5bG9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmFjMjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jZXlsb24ucmIKQEAgLTAsMCArMSwxMjMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBDZXlsb24gPCBSZWdleExleGVyCisgICAgICB0YWcgJ2NleWxvbicKKyAgICAgIGZpbGVuYW1lcyAnKi5jZXlsb24nCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1jZXlsb24nCisKKyAgICAgIHRpdGxlICJDZXlsb24iCisgICAgICBkZXNjICdTYXkgbW9yZSwgbW9yZSBjbGVhcmx5LicKKworICAgICAga2V5d29yZHMgPSAldygKKyAgICAgICAgYnJlYWsgY2FzZSBjYXRjaCBjb250aW51ZSBlbHNlIGZpbmFsbHkgZm9yIGluCisgICAgICAgIGlmIHJldHVybiBzd2l0Y2ggdGhpcyB0aHJvdyB0cnkgd2hpbGUgaXMgZXhpc3RzIGR5bmFtaWMKKyAgICAgICAgbm9uZW1wdHkgdGhlbiBvdXRlciBhc3NlcnQgbGV0CisgICAgICApCisgICAgICAKKyAgICAgIGtleXdvcmRzX2RlY2xhcmF0aW9uID0gJXcoCisgICAgICAgIGFic3RyYWN0cyBleHRlbmRzIHNhdGlzZmllcyBzdXBlciBnaXZlbiBvZiBvdXQgYXNzaWduCisgICAgICApCisgICAgICAKKyAgICAgIGtleXdvcmRzX3R5cGUgPSAldygKKyAgICAgICAgZnVuY3Rpb24gdmFsdWUgdm9pZCBuZXcKKyAgICAgICkKKyAgICAgIAorICAgICAga2V5d29yZHNfbmFtZXNwYWNlID0gJXcoCisgICAgICAgIGFzc2VtYmx5IG1vZHVsZSBwYWNrYWdlCisgICAgICApCisgICAgICAKKyAgICAgIGtleXdvcmRzX2NvbnN0YW50ID0gJXcoCisgICAgICAgIHRydWUgZmFsc2UgbnVsbAorICAgICAgKQorCisgICAgICBhbm5vdGF0aW9ucyA9ICV3KAorICAgICAgICBzaGFyZWQgYWJzdHJhY3QgZm9ybWFsIGRlZmF1bHQgYWN0dWFsIHZhcmlhYmxlIGRlcHJlY2F0ZWQgc21hbGwKKyAgICAgICAgbGF0ZSBsaXRlcmFsIGRvYyBieSBzZWUgdGhyb3dzIG9wdGlvbmFsIGxpY2Vuc2UgdGFnZ2VkIGZpbmFsIG5hdGl2ZQorICAgICAgICBhbm5vdGF0aW9uIHNlYWxlZAorICAgICAgKQorCisgICAgICBzdGF0ZSA6d2hpdGVzcGFjZSBkbworICAgICAgICBydWxlICVyKFteXFNcbl0rKSwgVGV4dAorICAgICAgICBydWxlICVyKC8vLio/XG4pLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcigvXCopLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorCisgICAgICAgIHJ1bGUgJXIoKHNoYXJlZHxhYnN0cmFjdHxmb3JtYWx8ZGVmYXVsdHxhY3R1YWx8dmFyaWFibGV8ZGVwcmVjYXRlZHxzbWFsbHwKKyAgICAgICAgICBsYXRlfGxpdGVyYWx8ZG9jfGJ5fHNlZXx0aHJvd3N8b3B0aW9uYWx8bGljZW5zZXx0YWdnZWR8ZmluYWx8bmF0aXZlfAorICAgICAgICAgIGFubm90YXRpb258c2VhbGVkKVxiKSwgTmFtZTo6RGVjb3JhdG9yCisKKyAgICAgICAgcnVsZSAlcigoYnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxlbHNlfGZpbmFsbHl8Zm9yfGlufAorICAgICAgICAgIGlmfHJldHVybnxzd2l0Y2h8dGhpc3x0aHJvd3x0cnl8d2hpbGV8aXN8ZXhpc3RzfGR5bmFtaWN8CisgICAgICAgICAgbm9uZW1wdHl8dGhlbnxvdXRlcnxhc3NlcnR8bGV0KVxiKSwgS2V5d29yZAorCisgICAgICAgIHJ1bGUgJXIoKGFic3RyYWN0c3xleHRlbmRzfHNhdGlzZmllc3xzdXBlcnxnaXZlbnxvZnxvdXR8YXNzaWduKVxiKSwgS2V5d29yZDo6RGVjbGFyYXRpb24KKworICAgICAgICBydWxlICVyKChmdW5jdGlvbnx2YWx1ZXx2b2lkfG5ldylcYiksIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgCisgICAgICAgIHJ1bGUgJXIoKGFzc2VtYmx5fG1vZHVsZXxwYWNrYWdlKShccyspKSBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpOYW1lc3BhY2UsIFRleHQKKyAgICAgICAgICBwdXNoIDppbXBvcnQKKyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBydWxlICVyKCh0cnVlfGZhbHNlfG51bGwpXGIpLCBLZXl3b3JkOjpDb25zdGFudAorICAgICAgICAKKyAgICAgICAgcnVsZSAlcigoY2xhc3N8aW50ZXJmYWNlfG9iamVjdHxhbGlhcykoXHMrKSkgZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6RGVjbGFyYXRpb24sIFRleHQKKyAgICAgICAgICBwdXNoIDpjbGFzcworICAgICAgICBlbmQKKworICAgICAgICBydWxlICVyKChpbXBvcnQpKFxzKykpIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQ6Ok5hbWVzcGFjZSwgVGV4dAorICAgICAgICAgIHB1c2ggOmltcG9ydAorICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgIHJ1bGUgJXIoIihcXFxcfFxcInxbXiJdKSoiKSwgTGl0ZXJhbDo6U3RyaW5nCisgICAgICAgIHJ1bGUgJXIoJ1xcLid8J1teXFxdJ3wnXFxceyNbMC05YS1mQS1GXXs0fVx9JyksIExpdGVyYWw6OlN0cmluZzo6Q2hhcgorICAgICAgICBydWxlICVyKCIuKmBgLipgYC4qIicsIFN0cmluZzo6SW50ZXJwb2wKKyAgICAgICAgcnVsZSAlcihcLikoW2Etel9dXHcqKSkgZG8KKyAgICAgICAgICBncm91cHMgT3BlcmF0b3IsIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBlbmQKKyAgICAgICAgcnVsZSAlcihbYS16QS1aX11cdyo6KSwgTmFtZTo6TGFiZWwKKyAgICAgICAgcnVsZSAlcigoXFxJW2Etel18W0EtWl0pXHcqKSwgTmFtZTo6RGVjb3JhdG9yCisgICAgICAgIHJ1bGUgJXIoW2EtekEtWl9dXHcqKSwgTmFtZQorICAgICAgICBydWxlICVyKFt+XiohJSZcW1xdKCl7fTw+fCs9OjssLi8/LWBdKSwgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAlcihcZHsxLDN9KF9cZHszfSkrXC5cZHsxLDN9KF9cZHszfSkrW2tNR1RQbXVucGZdPyksIExpdGVyYWw6Ok51bWJlcjo6RmxvYXQKKyAgICAgICAgcnVsZSAlcihcZHsxLDN9KF9cZHszfSkrXC5bMC05XSsoW2VFXVsrLV0/WzAtOV0rKT9ba01HVFBtdW5wZl0/KSwKKyAgICAgICAgICBMaXRlcmFsOjpOdW1iZXI6OkZsb2F0CisgICAgICAgIHJ1bGUgJXIoWzAtOV1bMC05XSpcLlxkezEsM30oX1xkezN9KStba01HVFBtdW5wZl0/KSwgTGl0ZXJhbDo6TnVtYmVyOjpGbG9hdAorICAgICAgICBydWxlICVyKFswLTldWzAtOV0qXC5bMC05XSsoW2VFXVsrLV0/WzAtOV0rKT9ba01HVFBtdW5wZl0/KSwKKyAgICAgICAgICBMaXRlcmFsOjpOdW1iZXI6OkZsb2F0CisgICAgICAgIHJ1bGUgJXIoIyhbMC05YS1mQS1GXXs0fSkoX1swLTlhLWZBLUZdezR9KSspLCBMaXRlcmFsOjpOdW1iZXI6OkhleAorICAgICAgICBydWxlICVyKCNbMC05YS1mQS1GXSspLCBMaXRlcmFsOjpOdW1iZXI6OkhleAorICAgICAgICBydWxlICVyKFwkKFswMV17NH0pKF9bMDFdezR9KSspLCBMaXRlcmFsOjpOdW1iZXI6OkJpbgorICAgICAgICBydWxlICVyKFwkWzAxXSspLCBMaXRlcmFsOjpOdW1iZXI6OkJpbgorICAgICAgICBydWxlICVyKFxkezEsM30oX1xkezN9KStba01HVFBdPyksIExpdGVyYWw6Ok51bWJlcjo6SW50ZWdlcgorICAgICAgICBydWxlICVyKFswLTldK1trTUdUUF0/KSwgTGl0ZXJhbDo6TnVtYmVyOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgJXIoXG4pLCBUZXh0CisKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y2xhc3MgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAlcihbQS1aYS16X11cdyopLCBOYW1lOjpDbGFzcywgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW1wb3J0IGRvCisgICAgICAgIHJ1bGUgJXIoW2Etel1bXHcuXSopLCBOYW1lOjpOYW1lc3BhY2UsIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoIihcXFxcfFxcInxbXiJdKSoiKSwgTGl0ZXJhbDo6U3RyaW5nLCA6cG9wIQorICAgICAgZW5kCisgICAgICAKKyAgICAgIHN0YXRlIDpjb21tZW50IGRvCisgICAgICAgIHJ1bGUgJXIoW14qL10pLCBDb21tZW50Lk11bHRpbGluZQorICAgICAgICBydWxlICVyKC9cKiksIENvbW1lbnQ6Ok11bHRpbGluZSwgOnB1c2ghCisgICAgICAgIHJ1bGUgJXIoXCovKSwgQ29tbWVudDo6TXVsdGlsaW5lLCA6cG9wIQorICAgICAgICBydWxlICVyKFsqL10pLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY2ZzY3JpcHQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jZnNjcmlwdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y2NWEwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY2ZzY3JpcHQucmIKQEAgLTAsMCArMSwxNTMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKworICAgIGNsYXNzIENmc2NyaXB0IDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkNGU2NyaXB0IgorICAgICAgZGVzYyAnQ0ZTY3JpcHQsIHRoZSBDRk1MIHNjcmlwdGluZyBsYW5ndWFnZScKKyAgICAgIHRhZyAnY2ZzY3JpcHQnCisgICAgICBhbGlhc2VzICdjZmMnCisgICAgICBmaWxlbmFtZXMgJyouY2ZjJworCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAa2V5d29yZHMgfHw9ICV3KAorICAgICAgICAgIGlmIGVsc2UgdmFyIHhtbCBkZWZhdWx0IGJyZWFrIHN3aXRjaCBkbyB0cnkgY2F0Y2ggdGhyb3cgaW4gY29udGludWUgZm9yIHJldHVybiB3aGlsZSByZXF1aXJlZAorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuZGVjbGFyYXRpb25zCisgICAgICAgIEBkZWNsYXJhdGlvbnMgfHw9ICV3KAorICAgICAgICAgIGNvbXBvbmVudCBwcm9wZXJ0eSBmdW5jdGlvbiByZW1vdGUgcHVibGljIHBhY2thZ2UgcHJpdmF0ZQorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudHlwZXMKKyAgICAgICAgQHR5cGVzIHx8PSAldygKKyAgICAgICAgICBhbnkgYXJyYXkgYmluYXJ5IGJvb2xlYW4gY29tcG9uZW50IGRhdGUgZ3VpZCBudW1lcmljIHF1ZXJ5IHN0cmluZyBzdHJ1Y3QgdXVpZCB2b2lkIHhtbAorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgY29uc3RhbnRzID0gJXcoYXBwbGljYXRpb24gc2Vzc2lvbiBjbGllbnQgY29va2llIHN1cGVyIHRoaXMgdmFyaWFibGVzIGFyZ3VtZW50cyBjZ2kpCisKKworICAgICAgb3BlcmF0b3JzID0gJXcoXCtcKyAtLSAmJiBcfFx8IDw9ID49IDwgPiA9PSAhPSBtb2QgZXEgbHQgZ3QgbHRlIGd0ZSBub3QgaXMgYW5kIG9yIHhvciBlcXYgaW1wIGVxdWFsIGNvbnRhaW5zIFw/ICkKKyAgICAgIGRvdHRlZF9pZCA9IC9bJGEtekEtWl9dW2EtekEtWjAtOV8uXSovCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIG1peGluIDpjb21tZW50c19hbmRfd2hpdGVzcGFjZQorICAgICAgICBydWxlIC8oPzoje29wZXJhdG9ycy5qb2luKCd8Jyl9fGRvZXMgbm90IGNvbnRhaW58Z3JlYXRlciB0aGFuKD86IG9yIGVxdWFsIHRvKT98bGVzcyB0aGFuKD86IG9yIGVxdWFsIHRvKT8pXGIvaSwgT3BlcmF0b3IsIDpleHByX3N0YXJ0CisgICAgICAgIHJ1bGUgJXIoWy08PisqJSZ8XF4vIT1dPT8pLCBPcGVyYXRvciwgOmV4cHJfc3RhcnQKKworICAgICAgICBydWxlIC9bKFxbLF0vLCBQdW5jdHVhdGlvbiwgOmV4cHJfc3RhcnQKKyAgICAgICAgcnVsZSAvOy8sIFB1bmN0dWF0aW9uLCA6c3RhdGVtZW50CisgICAgICAgIHJ1bGUgL1spXF0uXS8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgcnVsZSAvWz9dLyBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6dGVybmFyeQorICAgICAgICAgIHB1c2ggOmV4cHJfc3RhcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvW3t9XS8sIFB1bmN0dWF0aW9uLCA6c3RhdGVtZW50CisKKyAgICAgICAgcnVsZSAvKD86I3tjb25zdGFudHMuam9pbignfCcpfSlcYi8sIE5hbWU6OkNvbnN0YW50CisgICAgICAgIHJ1bGUgLyg/OnRydWV8ZmFsc2V8bnVsbClcYi8sIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgIHJ1bGUgL2ltcG9ydFxiLywgS2V5d29yZDo6TmFtZXNwYWNlLCA6aW1wb3J0CisgICAgICAgIHJ1bGUgLygje2RvdHRlZF9pZH0pKFxzKikoOikoXHMqKS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZSwgVGV4dCwgUHVuY3R1YXRpb24sIFRleHQKKyAgICAgICAgICBwdXNoIDpleHByX3N0YXJ0CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhbQS1aYS16XyRdW1x3Ll0qKShccyopKFwoKS8gZG8gfG18CisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyBtWzFdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkLCBtWzFdCisgICAgICAgICAgICB0b2tlbiBUZXh0LCBtWzJdCisgICAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVszXQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkZ1bmN0aW9uLCBtWzFdCisgICAgICAgICAgICB0b2tlbiBUZXh0LCBtWzJdCisgICAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVszXQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIGRvdHRlZF9pZCBkbyB8bXwKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmRlY2xhcmF0aW9ucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3Mua2V5d29yZHMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MudHlwZXMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6VHlwZQorICAgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWU6Ok90aGVyCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1swLTldWzAtOV0qXC5bMC05XSsoW2VFXVswLTldKyk/W2ZkXT8vLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLzB4WzAtOWEtZkEtRl0rLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvWzAtOV0rLywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLyIoXFxcXHxcXCJ8W14iXSkqIi8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLycoXFxcXHxcXCd8W14nXSkqJy8sIFN0cjo6U2luZ2xlCisKKyAgICAgIGVuZAorCisgICAgICAjIHNhbWUgYXMgamF2YSwgYnJva2VuIG91dAorICAgICAgc3RhdGUgOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAlcigvLy4qPyQpLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcigvXCouKj9cKi8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmV4cHJfc3RhcnQgZG8KKyAgICAgICAgbWl4aW4gOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSAvW3tdLywgUHVuY3R1YXRpb24sIDpvYmplY3QKKworICAgICAgICBydWxlIC8vLCBUZXh0LCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdGF0ZW1lbnQgZG8KKworICAgICAgICBydWxlIC9be31dLywgUHVuY3R1YXRpb24KKworICAgICAgICBtaXhpbiA6ZXhwcl9zdGFydAorICAgICAgZW5kCisKKyAgICAgICMgb2JqZWN0IGxpdGVyYWxzCisgICAgICBzdGF0ZSA6b2JqZWN0IGRvCisgICAgICAgIG1peGluIDpjb21tZW50c19hbmRfd2hpdGVzcGFjZQorICAgICAgICBydWxlIC9bfV0vIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDpleHByX3N0YXJ0CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLygje2RvdHRlZF9pZH0pKFxzKikoOikvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6Ok90aGVyLCBUZXh0LCBQdW5jdHVhdGlvbgorICAgICAgICAgIHB1c2ggOmV4cHJfc3RhcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvOi8sIFB1bmN0dWF0aW9uCisgICAgICAgIG1peGluIDpyb290CisgICAgICBlbmQKKworICAgICAgIyB0ZXJuYXJ5IGV4cHJlc3Npb25zLCB3aGVyZSA8ZG90dGVkX2lkPjogaXMgbm90IGEgbGFiZWwhCisgICAgICBzdGF0ZSA6dGVybmFyeSBkbworICAgICAgICBydWxlIC86LyBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgZ290byA6ZXhwcl9zdGFydAorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbXBvcnQgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgcnVsZSAvW2EtejAtOV8uXStcKj8vaSwgTmFtZTo6TmFtZXNwYWNlLCA6cG9wIQorICAgICAgZW5kCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2Nsb2p1cmUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jbG9qdXJlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OWIxZDQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jbG9qdXJlLnJiCkBAIC0wLDAgKzEsMTEyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgQ2xvanVyZSA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJDbG9qdXJlIgorICAgICAgZGVzYyAiVGhlIENsb2p1cmUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKGNsb2p1cmUub3JnKSIKKworICAgICAgdGFnICdjbG9qdXJlJworICAgICAgYWxpYXNlcyAnY2xqJywgJ2NsanMnCisKKyAgICAgIGZpbGVuYW1lcyAnKi5jbGonLCAnKi5jbGpzJywgJyouY2xqYycKKworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtY2xvanVyZScsICdhcHBsaWNhdGlvbi94LWNsb2p1cmUnCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIEBrZXl3b3JkcyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBmbiBkZWYgZGVmbiBkZWZtYWNybyBkZWZtZXRob2QgZGVmbXVsdGkgZGVmbi0gZGVmc3RydWN0IGlmCisgICAgICAgICAgY29uZCBsZXQgZm9yCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5idWlsdGlucworICAgICAgICBAYnVpbHRpbnMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgLiAuLiAgKiArIC0gLT4gLyA8IDw9ID0gPT0gPiA+PSBhY2Nlc3NvciBhZ2VudCBhZ2VudC1lcnJvcnMKKyAgICAgICAgICBhZ2V0IGFsZW5ndGggYWxsLW5zIGFsdGVyIGFuZCBhcHBlbmQtY2hpbGQgYXBwbHkgYXJyYXktbWFwCisgICAgICAgICAgYXNldCBhc2V0LWJvb2xlYW4gYXNldC1ieXRlIGFzZXQtY2hhciBhc2V0LWRvdWJsZSBhc2V0LWZsb2F0CisgICAgICAgICAgYXNldC1pbnQgYXNldC1sb25nIGFzZXQtc2hvcnQgYXNzZXJ0IGFzc29jIGF3YWl0IGF3YWl0LWZvciBiZWFuCisgICAgICAgICAgYmluZGluZyBiaXQtYW5kIGJpdC1ub3QgYml0LW9yIGJpdC1zaGlmdC1sZWZ0IGJpdC1zaGlmdC1yaWdodAorICAgICAgICAgIGJpdC14b3IgYm9vbGVhbiBicmFuY2g/ICBidXRsYXN0IGJ5dGUgY2FzdCBjaGFyIGNoaWxkcmVuCisgICAgICAgICAgY2xhc3MgY2xlYXItYWdlbnQtZXJyb3JzIGNvbW1lbnQgY29tbXV0ZSBjb21wIGNvbXBhcmF0b3IKKyAgICAgICAgICBjb21wbGVtZW50IGNvbmNhdCBjb25qIGNvbnMgY29uc3RhbnRseSBjb25zdHJ1Y3QtcHJveHkKKyAgICAgICAgICBjb250YWlucz8gY291bnQgY3JlYXRlLW5zIGNyZWF0ZS1zdHJ1Y3QgY3ljbGUgZGVjICBkZXJlZgorICAgICAgICAgIGRpZmZlcmVuY2UgZGlzaiBkaXNzb2MgZGlzdGluY3QgZG9hbGwgZG9jIGRvcnVuIGRvc2VxIGRvc3luYworICAgICAgICAgIGRvdGltZXMgZG90byBkb3VibGUgZG93biBkcm9wIGRyb3Atd2hpbGUgZWRpdCBlbmQ/IGVuc3VyZSBldmFsCisgICAgICAgICAgZXZlcnk/IGZhbHNlPyBmZmlyc3QgZmlsZS1zZXEgZmlsdGVyIGZpbmQgZmluZC1kb2MgZmluZC1ucworICAgICAgICAgIGZpbmQtdmFyIGZpcnN0IGZsb2F0IGZsdXNoIGZuc2VxIGZyZXN0IGdlbnN5bSBnZXQtcHJveHktY2xhc3MKKyAgICAgICAgICBnZXQgaGFzaC1tYXAgaGFzaC1zZXQgaWRlbnRpY2FsPyBpZGVudGl0eSBpZi1sZXQgaW1wb3J0IGluLW5zCisgICAgICAgICAgaW5jIGluZGV4IGluc2VydC1jaGlsZCBpbnNlcnQtbGVmdCBpbnNlcnQtcmlnaHQgaW5zcGVjdC10YWJsZQorICAgICAgICAgIGluc3BlY3QtdHJlZSBpbnN0YW5jZT8gaW50IGludGVybGVhdmUgaW50ZXJzZWN0aW9uIGludG8KKyAgICAgICAgICBpbnRvLWFycmF5IGl0ZXJhdGUgam9pbiBrZXkga2V5cyBrZXl3b3JkIGtleXdvcmQ/IGxhc3QgbGF6eS1jYXQKKyAgICAgICAgICBsYXp5LWNvbnMgbGVmdCBsZWZ0cyBsaW5lLXNlcSBsaXN0KiBsaXN0IGxvYWQgbG9hZC1maWxlIGxvY2tpbmcKKyAgICAgICAgICBsb25nIGxvb3AgbWFjcm9leHBhbmQgbWFjcm9leHBhbmQtMSBtYWtlLWFycmF5IG1ha2Utbm9kZSBtYXAKKyAgICAgICAgICBtYXAtaW52ZXJ0IG1hcD8gbWFwY2F0IG1heCBtYXgta2V5IG1lbWZuIG1lcmdlIG1lcmdlLXdpdGggbWV0YQorICAgICAgICAgIG1pbiBtaW4ta2V5IG5hbWUgbmFtZXNwYWNlIG5lZz8gbmV3IG5ld2xpbmUgbmV4dCBuaWw/IG5vZGUgbm90CisgICAgICAgICAgbm90LWFueT8gbm90LWV2ZXJ5PyBub3Q9IG5zLWltcG9ydHMgbnMtaW50ZXJucyBucy1tYXAgbnMtbmFtZQorICAgICAgICAgIG5zLXB1YmxpY3MgbnMtcmVmZXJzIG5zLXJlc29sdmUgbnMtdW5tYXAgbnRoIG50aHJlc3Qgb3IgcGFyc2UKKyAgICAgICAgICBwYXJ0aWFsIHBhdGggcGVlayBwb3AgcG9zPyBwciBwci1zdHIgcHJpbnQgcHJpbnQtc3RyIHByaW50bG4KKyAgICAgICAgICBwcmludGxuLXN0ciBwcm4gcHJuLXN0ciBwcm9qZWN0IHByb3h5IHByb3h5LW1hcHBpbmdzIHF1b3QKKyAgICAgICAgICByYW5kIHJhbmQtaW50IHJhbmdlIHJlLWZpbmQgcmUtZ3JvdXBzIHJlLW1hdGNoZXIgcmUtbWF0Y2hlcworICAgICAgICAgIHJlLXBhdHRlcm4gcmUtc2VxIHJlYWQgcmVhZC1saW5lIHJlZHVjZSByZWYgcmVmLXNldCByZWZlciByZW0KKyAgICAgICAgICByZW1vdmUgcmVtb3ZlLW1ldGhvZCByZW1vdmUtbnMgcmVuYW1lIHJlbmFtZS1rZXlzIHJlcGVhdCByZXBsYWNlCisgICAgICAgICAgcmVwbGljYXRlIHJlc29sdmUgcmVzdCByZXN1bHRzZXQtc2VxIHJldmVyc2UgcmZpcnN0IHJpZ2h0CisgICAgICAgICAgcmlnaHRzIHJvb3QgcnJlc3QgcnNlcSBzZWNvbmQgc2VsZWN0IHNlbGVjdC1rZXlzIHNlbmQgc2VuZC1vZmYKKyAgICAgICAgICBzZXEgc2VxLXppcCBzZXE/IHNldCBzaG9ydCBzbHVycCBzb21lIHNvcnQgc29ydC1ieSBzb3J0ZWQtbWFwCisgICAgICAgICAgc29ydGVkLW1hcC1ieSBzb3J0ZWQtc2V0IHNwZWNpYWwtc3ltYm9sPyBzcGxpdC1hdCBzcGxpdC13aXRoCisgICAgICAgICAgc3RyIHN0cmluZz8gIHN0cnVjdCBzdHJ1Y3QtbWFwIHN1YnMgc3VidmVjIHN5bWJvbCBzeW1ib2w/CisgICAgICAgICAgc3luYyB0YWtlIHRha2UtbnRoIHRha2Utd2hpbGUgdGVzdCB0aW1lIHRvLWFycmF5IHRvLWFycmF5LTJkCisgICAgICAgICAgdHJlZS1zZXEgdHJ1ZT8gdW5pb24gdXAgdXBkYXRlLXByb3h5IHZhbCB2YWxzIHZhci1nZXQgdmFyLXNldAorICAgICAgICAgIHZhcj8gdmVjdG9yIHZlY3Rvci16aXAgdmVjdG9yPyB3aGVuIHdoZW4tZmlyc3Qgd2hlbi1sZXQKKyAgICAgICAgICB3aGVuLW5vdCB3aXRoLWxvY2FsLXZhcnMgd2l0aC1tZXRhIHdpdGgtb3BlbiB3aXRoLW91dC1zdHIKKyAgICAgICAgICB4bWwtc2VxIHhtbC16aXAgemVybz8gemlwbWFwIHppcHBlcicKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGlkZW50aWZpZXIgPSAlcihbXHchJCUqKyw8PT4/Ly4tXSspCisgICAgICBrZXl3b3JkID0gJXIoW1x3IVwjJCUqKyw8PT4/Ly4tXSspCisKKyAgICAgIGRlZiBuYW1lX3Rva2VuKG5hbWUpCisgICAgICAgIHJldHVybiBLZXl3b3JkIGlmIHNlbGYuY2xhc3Mua2V5d29yZHMuaW5jbHVkZT8obmFtZSkKKyAgICAgICAgcmV0dXJuIE5hbWU6OkJ1aWx0aW4gaWYgc2VsZi5jbGFzcy5idWlsdGlucy5pbmNsdWRlPyhuYW1lKQorICAgICAgICBuaWwKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC87Lio/XG4vLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQ6OldoaXRlc3BhY2UKKworICAgICAgICBydWxlIC8tP1xkK1wuXGQrLywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC8tP1xkKy8sIE51bTo6SW50ZWdlcgorICAgICAgICBydWxlIC8weC0/WzAtOWEtZkEtRl0rLywgTnVtOjpIZXgKKworICAgICAgICBydWxlIC8iKFxcLnxbXiJdKSoiLywgU3RyCisgICAgICAgIHJ1bGUgLycje2tleXdvcmR9LywgU3RyOjpTeW1ib2wKKyAgICAgICAgcnVsZSAvOjo/I3trZXl3b3JkfS8sIE5hbWU6OkNvbnN0YW50CisgICAgICAgIHJ1bGUgL1xcKC58W2Etel0rKS9pLCBTdHI6OkNoYXIKKworCisgICAgICAgIHJ1bGUgL35AfFtgXCcjXn4mXS8sIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvKFwoKShccyopKCN7aWRlbnRpZmllcn0pL20gZG8gfG18CisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24sIG1bMV0KKyAgICAgICAgICB0b2tlbiBUZXh0OjpXaGl0ZXNwYWNlLCBtWzJdCisgICAgICAgICAgdG9rZW4obmFtZV90b2tlbihtWzNdKSB8fCBOYW1lOjpGdW5jdGlvbiwgbVszXSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSBpZGVudGlmaWVyIGRvIHxtfAorICAgICAgICAgIHRva2VuIG5hbWVfdG9rZW4obVswXSkgfHwgTmFtZQorICAgICAgICBlbmQKKworICAgICAgICAjIHZlY3RvcnMKKyAgICAgICAgcnVsZSAvW1xbXF1dLywgUHVuY3R1YXRpb24KKworICAgICAgICAjIG1hcHMKKyAgICAgICAgcnVsZSAvW3t9XS8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgIyBwYXJlbnRoZXNlcworICAgICAgICBydWxlIC9bKCldLywgUHVuY3R1YXRpb24KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY21ha2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jbWFrZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzM0MmUzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY21ha2UucmIKQEAgLTAsMCArMSwyMDYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBDTWFrZSA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICdDTWFrZScKKyAgICAgIGRlc2MgJ1RoZSBjcm9zcy1wbGF0Zm9ybSwgb3Blbi1zb3VyY2UgYnVpbGQgc3lzdGVtJworICAgICAgdGFnICdjbWFrZScKKyAgICAgIGZpbGVuYW1lcyAnQ01ha2VMaXN0cy50eHQnLCAnKi5jbWFrZScKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LWNtYWtlJworCisgICAgICBTUEFDRSA9ICdbIFx0XScKKyAgICAgIEJSQUNLRVRfT1BFTiA9ICdcWz0qXFsnCisKKyAgICAgIFNUQVRFU19NQVAgPSB7CisgICAgICAgIDpyb290ID0+IFRleHQsCisgICAgICAgIDpicmFja2V0X3N0cmluZyA9PiBTdHI6OkRvdWJsZSwKKyAgICAgICAgOnF1b3RlZF9hcmd1bWVudCA9PiBTdHI6OkRvdWJsZSwKKyAgICAgICAgOmJyYWNrZXRfY29tbWVudCA9PiBDb21tZW50OjpNdWx0aWxpbmUsCisgICAgICAgIDp2YXJpYWJsZV9yZWZlcmVuY2UgPT4gTmFtZTo6VmFyaWFibGUsCisgICAgICB9CisKKyAgICAgIEJVSUxUSU5fQ09NTUFORFMgPSBTZXQubmV3ICV3WworICAgICAgICBhZGRfY29tcGlsZV9vcHRpb25zCisgICAgICAgIGFkZF9jdXN0b21fY29tbWFuZAorICAgICAgICBhZGRfY3VzdG9tX3RhcmdldAorICAgICAgICBhZGRfZGVmaW5pdGlvbnMKKyAgICAgICAgYWRkX2RlcGVuZGVuY2llcworICAgICAgICBhZGRfZXhlY3V0YWJsZQorICAgICAgICBhZGRfbGlicmFyeQorICAgICAgICBhZGRfc3ViZGlyZWN0b3J5CisgICAgICAgIGFkZF90ZXN0CisgICAgICAgIGF1eF9zb3VyY2VfZGlyZWN0b3J5CisgICAgICAgIGJyZWFrCisgICAgICAgIGJ1aWxkX2NvbW1hbmQKKyAgICAgICAgYnVpbGRfbmFtZQorICAgICAgICBjbWFrZV9ob3N0X3N5c3RlbV9pbmZvcm1hdGlvbgorICAgICAgICBjbWFrZV9taW5pbXVtX3JlcXVpcmVkCisgICAgICAgIGNtYWtlX3BvbGljeQorICAgICAgICBjb25maWd1cmVfZmlsZQorICAgICAgICBjcmVhdGVfdGVzdF9zb3VyY2VsaXN0CisgICAgICAgIGRlZmluZV9wcm9wZXJ0eQorICAgICAgICBlbHNlCisgICAgICAgIGVsc2VpZgorICAgICAgICBlbmFibGVfbGFuZ3VhZ2UKKyAgICAgICAgZW5hYmxlX3Rlc3RpbmcKKyAgICAgICAgZW5kZm9yZWFjaAorICAgICAgICBlbmRmdW5jdGlvbgorICAgICAgICBlbmRpZgorICAgICAgICBlbmRtYWNybworICAgICAgICBlbmR3aGlsZQorICAgICAgICBleGVjX3Byb2dyYW0KKyAgICAgICAgZXhlY3V0ZV9wcm9jZXNzCisgICAgICAgIGV4cG9ydAorICAgICAgICBleHBvcnRfbGlicmFyeV9kZXBlbmRlbmNpZXMKKyAgICAgICAgZmlsZQorICAgICAgICBmaW5kX2ZpbGUKKyAgICAgICAgZmluZF9saWJyYXJ5CisgICAgICAgIGZpbmRfcGFja2FnZQorICAgICAgICBmaW5kX3BhdGgKKyAgICAgICAgZmluZF9wcm9ncmFtCisgICAgICAgIGZsdGtfd3JhcF91aQorICAgICAgICBmb3JlYWNoCisgICAgICAgIGZ1bmN0aW9uCisgICAgICAgIGdldF9jbWFrZV9wcm9wZXJ0eQorICAgICAgICBnZXRfZGlyZWN0b3J5X3Byb3BlcnR5CisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQKKyAgICAgICAgZ2V0X3Byb3BlcnR5CisgICAgICAgIGdldF9zb3VyY2VfZmlsZV9wcm9wZXJ0eQorICAgICAgICBnZXRfdGFyZ2V0X3Byb3BlcnR5CisgICAgICAgIGdldF90ZXN0X3Byb3BlcnR5CisgICAgICAgIGlmCisgICAgICAgIGluY2x1ZGUKKyAgICAgICAgaW5jbHVkZV9kaXJlY3RvcmllcworICAgICAgICBpbmNsdWRlX2V4dGVybmFsX21zcHJvamVjdAorICAgICAgICBpbmNsdWRlX3JlZ3VsYXJfZXhwcmVzc2lvbgorICAgICAgICBpbnN0YWxsCisgICAgICAgIGluc3RhbGxfZmlsZXMKKyAgICAgICAgaW5zdGFsbF9wcm9ncmFtcworICAgICAgICBpbnN0YWxsX3RhcmdldHMKKyAgICAgICAgbGlua19kaXJlY3RvcmllcworICAgICAgICBsaW5rX2xpYnJhcmllcworICAgICAgICBsaXN0CisgICAgICAgIGxvYWRfY2FjaGUKKyAgICAgICAgbG9hZF9jb21tYW5kCisgICAgICAgIG1hY3JvCisgICAgICAgIG1ha2VfZGlyZWN0b3J5CisgICAgICAgIG1hcmtfYXNfYWR2YW5jZWQKKyAgICAgICAgbWF0aAorICAgICAgICBtZXNzYWdlCisgICAgICAgIG9wdGlvbgorICAgICAgICBvdXRwdXRfcmVxdWlyZWRfZmlsZXMKKyAgICAgICAgcHJvamVjdAorICAgICAgICBxdF93cmFwX2NwcAorICAgICAgICBxdF93cmFwX3VpCisgICAgICAgIHJlbW92ZQorICAgICAgICByZW1vdmVfZGVmaW5pdGlvbnMKKyAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcGFyYXRlX2FyZ3VtZW50cworICAgICAgICBzZXQKKyAgICAgICAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzCisgICAgICAgIHNldF9wcm9wZXJ0eQorICAgICAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzCisgICAgICAgIHNldF90ZXN0c19wcm9wZXJ0aWVzCisgICAgICAgIHNpdGVfbmFtZQorICAgICAgICBzb3VyY2VfZ3JvdXAKKyAgICAgICAgc3RyaW5nCisgICAgICAgIHN1YmRpcl9kZXBlbmRzCisgICAgICAgIHN1YmRpcnMKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMKKyAgICAgICAgdGFyZ2V0X2NvbXBpbGVfb3B0aW9ucworICAgICAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcworICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMKKyAgICAgICAgdHJ5X2NvbXBpbGUKKyAgICAgICAgdHJ5X3J1bgorICAgICAgICB1bnNldAorICAgICAgICB1c2VfbWFuZ2xlZF9tZXNhCisgICAgICAgIHV0aWxpdHlfc291cmNlCisgICAgICAgIHZhcmlhYmxlX3JlcXVpcmVzCisgICAgICAgIHZhcmlhYmxlX3dhdGNoCisgICAgICAgIHdoaWxlCisgICAgICAgIHdyaXRlX2ZpbGUKKyAgICAgIF0KKworICAgICAgc3RhdGUgOmRlZmF1bHQgZG8KKyAgICAgICAgcnVsZSAvXHJcbj98XG4vIGRvCisgICAgICAgICAgdG9rZW4gU1RBVEVTX01BUFtzdGF0ZS5uYW1lLnRvX3N5bV0KKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgLy4vIGRvCisgICAgICAgICAgdG9rZW4gU1RBVEVTX01BUFtzdGF0ZS5uYW1lLnRvX3N5bV0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnZhcmlhYmxlX2ludGVycG9sYXRpb24gZG8KKyAgICAgICAgcnVsZSAvXCRcey8gZG8KKyAgICAgICAgICB0b2tlbiBTdHI6OkludGVycG9sCisgICAgICAgICAgcHVzaCA6dmFyaWFibGVfcmVmZXJlbmNlCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpicmFja2V0X2Nsb3NlIGRvCisgICAgICAgIHJ1bGUgL1xdPSpcXS8gZG8gfG18CisgICAgICAgICAgdG9rZW4gU1RBVEVTX01BUFtzdGF0ZS5uYW1lLnRvX3N5bV0KKyAgICAgICAgICBnb3RvIDpyb290IGlmIG1bMF0ubGVuZ3RoID09IEBicmFja2V0X2xlbgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6dmFyaWFibGVfaW50ZXJwb2xhdGlvbgorCisgICAgICAgIHJ1bGUgLyN7U1BBQ0V9LywgVGV4dAorICAgICAgICBydWxlIC9bKCldLywgUHVuY3R1YXRpb24KKworICAgICAgICBydWxlIC8jI3tCUkFDS0VUX09QRU59LyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgICBAYnJhY2tldF9sZW4gPSBtWzBdLmxlbmd0aCAtIDEgIyBkZWNvdW50ICcjJworICAgICAgICAgIGdvdG8gOmJyYWNrZXRfY29tbWVudAorICAgICAgICBlbmQKKyAgICAgICAgcnVsZSAvI3tCUkFDS0VUX09QRU59LyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBTdHI6OkRvdWJsZQorICAgICAgICAgIEBicmFja2V0X2xlbiA9IG1bMF0ubGVuZ3RoCisgICAgICAgICAgZ290byA6YnJhY2tldF9zdHJpbmcKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvIi8sIFN0cjo6RG91YmxlLCA6cXVvdGVkX2FyZ3VtZW50CisKKyAgICAgICAgcnVsZSAvKFtBLVphLXpfXVtBLVphLXowLTlfXSopKCN7U1BBQ0V9KikoXCgpLyBkbyB8bXwKKyAgICAgICAgICBncm91cHMgQlVJTFRJTl9DT01NQU5EUy5pbmNsdWRlPyhtWzFdKSA/IE5hbWU6OkJ1aWx0aW4gOiBOYW1lOjpGdW5jdGlvbiwgVGV4dCwgUHVuY3R1YXRpb24KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvIy4qLywgQ29tbWVudDo6U2luZ2xlCisKKyAgICAgICAgbWl4aW4gOmRlZmF1bHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YnJhY2tldF9zdHJpbmcgZG8KKyAgICAgICAgbWl4aW4gOmJyYWNrZXRfY2xvc2UKKyAgICAgICAgbWl4aW4gOnZhcmlhYmxlX2ludGVycG9sYXRpb24KKyAgICAgICAgbWl4aW4gOmRlZmF1bHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YnJhY2tldF9jb21tZW50IGRvCisgICAgICAgIG1peGluIDpicmFja2V0X2Nsb3NlCisgICAgICAgIG1peGluIDpkZWZhdWx0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnZhcmlhYmxlX3JlZmVyZW5jZSBkbworICAgICAgICBtaXhpbiA6dmFyaWFibGVfaW50ZXJwb2xhdGlvbgorCisgICAgICAgIHJ1bGUgL30vLCBTdHI6OkludGVycG9sLCA6cG9wIQorCisgICAgICAgIG1peGluIDpkZWZhdWx0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnF1b3RlZF9hcmd1bWVudCBkbworICAgICAgICBtaXhpbiA6dmFyaWFibGVfaW50ZXJwb2xhdGlvbgorCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnJvb3QKKyAgICAgICAgcnVsZSAvXFxbKCkjIiBcXCRAXnRybjtdLywgU3RyOjpFc2NhcGUKKworICAgICAgICBtaXhpbiA6ZGVmYXVsdAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jb2ZmZWVzY3JpcHQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jb2ZmZWVzY3JpcHQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwYWJmNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2NvZmZlZXNjcmlwdC5yYgpAQCAtMCwwICsxLDE3NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIENvZmZlZXNjcmlwdCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRhZyAnY29mZmVlc2NyaXB0JworICAgICAgYWxpYXNlcyAnY29mZmVlJywgJ2NvZmZlZS1zY3JpcHQnCisgICAgICBmaWxlbmFtZXMgJyouY29mZmVlJywgJ0Nha2VmaWxlJworICAgICAgbWltZXR5cGVzICd0ZXh0L2NvZmZlZXNjcmlwdCcKKworICAgICAgdGl0bGUgIkNvZmZlZVNjcmlwdCIKKyAgICAgIGRlc2MgJ1RoZSBDb2ZmZWVzY3JpcHQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKGNvZmZlZXNjcmlwdC5vcmcpJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAnY29mZmVlJworICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIEBrZXl3b3JkcyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBmb3IgaW4gb2Ygd2hpbGUgYnJlYWsgcmV0dXJuIGNvbnRpbnVlIHN3aXRjaCB3aGVuIHRoZW4gaWYgZWxzZQorICAgICAgICAgIHRocm93IHRyeSBjYXRjaCBmaW5hbGx5IG5ldyBkZWxldGUgdHlwZW9mIGluc3RhbmNlb2Ygc3VwZXIKKyAgICAgICAgICBleHRlbmRzIHRoaXMgY2xhc3MgYnkKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmNvbnN0YW50cworICAgICAgICBAY29uc3RhbnRzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIHRydWUgZmFsc2UgeWVzIG5vIG9uIG9mZiBudWxsIE5hTiBJbmZpbml0eSB1bmRlZmluZWQKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBBcnJheSBCb29sZWFuIERhdGUgRXJyb3IgRnVuY3Rpb24gTWF0aCBuZXRzY2FwZSBOdW1iZXIgT2JqZWN0CisgICAgICAgICAgUGFja2FnZXMgUmVnRXhwIFN0cmluZyBzdW4gZGVjb2RlVVJJIGRlY29kZVVSSUNvbXBvbmVudAorICAgICAgICAgIGVuY29kZVVSSSBlbmNvZGVVUklDb21wb25lbnQgZXZhbCBpc0Zpbml0ZSBpc05hTiBwYXJzZUZsb2F0CisgICAgICAgICAgcGFyc2VJbnQgZG9jdW1lbnQgd2luZG93CisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBpZCA9IC9bJGEtekEtWl9dW2EtekEtWjAtOV9dKi8KKworICAgICAgc3RhdGUgOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlIGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgLyMjIy4qPyMjIy9tLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgcnVsZSAvIy4qJC8sIENvbW1lbnQ6OlNpbmdsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptdWx0aWxpbmVfcmVnZXggZG8KKyAgICAgICAgIyB0aGlzIG9yZGVyIGlzIGltcG9ydGFudCwgc28gdGhhdCAjeyBpc24ndCBpbnRlcnByZXRlZAorICAgICAgICAjIGFzIGEgY29tbWVudAorICAgICAgICBtaXhpbiA6aGFzX2ludGVycG9sYXRpb24KKyAgICAgICAgbWl4aW4gOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSAlcigvLy8oW2dpbV0rXGJ8XEIpKSwgU3RyOjpSZWdleCwgOnBvcCEKKyAgICAgICAgcnVsZSAlcigvKSwgU3RyOjpSZWdleAorICAgICAgICBydWxlICVyKFteLyNdKyksIFN0cjo6UmVnZXgKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c2xhc2hfc3RhcnRzX3JlZ2V4IGRvCisgICAgICAgIG1peGluIDpjb21tZW50c19hbmRfd2hpdGVzcGFjZQorICAgICAgICBydWxlICVyKC8vLykgZG8KKyAgICAgICAgICB0b2tlbiBTdHI6OlJlZ2V4CisgICAgICAgICAgZ290byA6bXVsdGlsaW5lX3JlZ2V4CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgJXIoCisgICAgICAgICAgLyhcXC58W15cWy9cXFxuXXxcWyhcXC58W15cXVxcXG5dKSpcXSkrLyAjIGEgcmVnZXgKKyAgICAgICAgICAoW2dpbV0rXGJ8XEIpCisgICAgICAgICl4LCBTdHI6OlJlZ2V4LCA6cG9wIQorCisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSglciheKD89XHN8L3w8IS0tKSkpIHsgcHVzaCA6c2xhc2hfc3RhcnRzX3JlZ2V4IH0KKyAgICAgICAgbWl4aW4gOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgJXIoCisgICAgICAgICAgWytdWytdfC0tfH58JiZ8XGJhbmRcYnxcYm9yXGJ8XGJpc1xifFxiaXNudFxifFxibm90XGJ8Wz9dfDp8PXwKKyAgICAgICAgICBbfF1bfF18XFwoPz1cbil8KDw8fD4+Pj98PT0/fCE9P3xbLTw+KypgJSZ8Xi9dKT0/CisgICAgICAgICl4LCBPcGVyYXRvciwgOnNsYXNoX3N0YXJ0c19yZWdleAorCisgICAgICAgIHJ1bGUgL1stPV0+LywgTmFtZTo6RnVuY3Rpb24KKworICAgICAgICBydWxlIC8oQCkoWyBcdF0qKSgje2lkfSkvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OlZhcmlhYmxlOjpJbnN0YW5jZSwgVGV4dCwgTmFtZTo6QXR0cmlidXRlCisgICAgICAgICAgcHVzaCA6c2xhc2hfc3RhcnRzX3JlZ2V4CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhbLl0pKFsgXHRdKikoI3tpZH0pLyBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgVGV4dCwgTmFtZTo6QXR0cmlidXRlCisgICAgICAgICAgcHVzaCA6c2xhc2hfc3RhcnRzX3JlZ2V4CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyN7aWR9KD89XHMqOikvLCBOYW1lOjpBdHRyaWJ1dGUsIDpzbGFzaF9zdGFydHNfcmVnZXgKKworICAgICAgICBydWxlIC8je2lkfS8gZG8gfG18CisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5jb25zdGFudHMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6Q29uc3RhbnQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLmJ1aWx0aW5zLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpPdGhlcgorICAgICAgICAgIGVuZAorCisgICAgICAgICAgcHVzaCA6c2xhc2hfc3RhcnRzX3JlZ2V4CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1t7KFxbOyxdLywgUHVuY3R1YXRpb24sIDpzbGFzaF9zdGFydHNfcmVnZXgKKyAgICAgICAgcnVsZSAvW30pXF0uXS8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgcnVsZSAvXGQrWy5dXGQrKFtlRV1cZCspP1tmZF0/LywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC8weFswLTlhLWZBLUZdKy8sIE51bTo6SGV4CisgICAgICAgIHJ1bGUgL1xkKy8sIE51bTo6SW50ZWdlcgorICAgICAgICBydWxlIC8iIiIvLCBTdHIsIDp0ZHFzCisgICAgICAgIHJ1bGUgLycnJy8sIFN0ciwgOnRzcXMKKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOmRxcworICAgICAgICBydWxlIC8nLywgU3RyLCA6c3FzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ3MgZG8KKyAgICAgICAgIyBhbGwgY29mZmVlc2NyaXB0IHN0cmluZ3MgYXJlIG11bHRpLWxpbmUKKyAgICAgICAgcnVsZSAvW14jXFwnIl0rL20sIFN0cgorCisgICAgICAgIHJ1bGUgL1xcLi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgLyMvLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZG91YmxlX3N0cmluZ3MgZG8KKyAgICAgICAgcnVsZSAvJy8sIFN0cgorICAgICAgICBtaXhpbiA6aGFzX2ludGVycG9sYXRpb24KKyAgICAgICAgbWl4aW4gOnN0cmluZ3MKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c2luZ2xlX3N0cmluZ3MgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0cgorICAgICAgICBtaXhpbiA6c3RyaW5ncworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbnRlcnBvbGF0aW9uIGRvCisgICAgICAgIHJ1bGUgL30vLCBTdHI6OkludGVycG9sLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpoYXNfaW50ZXJwb2xhdGlvbiBkbworICAgICAgICBydWxlIC9bI11be10vLCBTdHI6OkludGVycG9sLCA6aW50ZXJwb2xhdGlvbgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkcXMgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOnBvcCEKKyAgICAgICAgbWl4aW4gOmRvdWJsZV9zdHJpbmdzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRkcXMgZG8KKyAgICAgICAgcnVsZSAvIiIiLywgU3RyLCA6cG9wIQorICAgICAgICBydWxlIC8iLywgU3RyCisgICAgICAgIG1peGluIDpkb3VibGVfc3RyaW5ncworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzcXMgZG8KKyAgICAgICAgcnVsZSAvJy8sIFN0ciwgOnBvcCEKKyAgICAgICAgbWl4aW4gOnNpbmdsZV9zdHJpbmdzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRzcXMgZG8KKyAgICAgICAgcnVsZSAvJycnLywgU3RyLCA6cG9wIQorICAgICAgICBydWxlIC8nLywgU3RyCisgICAgICAgIG1peGluIDpzaW5nbGVfc3RyaW5ncworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jb21tb25fbGlzcC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2NvbW1vbl9saXNwLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTU1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jb21tb25fbGlzcC5yYgpAQCAtMCwwICsxLDM0NSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIENvbW1vbkxpc3AgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiQ29tbW9uIExpc3AiCisgICAgICBkZXNjICJUaGUgQ29tbW9uIExpc3AgdmFyaWFudCBvZiBMaXNwIChjb21tb24tbGlzcC5uZXQpIgorICAgICAgdGFnICdjb21tb25fbGlzcCcKKyAgICAgIGFsaWFzZXMgJ2NsJywgJ2NvbW1vbi1saXNwJywgJ2VsaXNwJywgJ2VtYWNzLWxpc3AnCisKKyAgICAgIGZpbGVuYW1lcyAnKi5jbCcsICcqLmxpc3AnLCAnKi5lbCcgIyB1c2VkIGZvciBFbGlzcCB0b28KKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LWNvbW1vbi1saXNwJworCisgICAgICAjIDYzOCBmdW5jdGlvbnMKKyAgICAgIEJVSUxUSU5fRlVOQ1RJT05TID0gU2V0Lm5ldyAldygKKyAgICAgICAgPCA8PSA9ID4gPj0gLSAvIC89ICogKyAxLSAxKyBhYm9ydCBhYnMgYWNvbnMgYWNvcyBhY29zaCBhZGQtbWV0aG9kCisgICAgICAgIGFkam9pbiBhZGp1c3RhYmxlLWFycmF5LXAgYWRqdXN0LWFycmF5IGFsbG9jYXRlLWluc3RhbmNlCisgICAgICAgIGFscGhhLWNoYXItcCBhbHBoYW51bWVyaWNwIGFwcGVuZCBhcHBseSBhcHJvcG9zIGFwcm9wb3MtbGlzdAorICAgICAgICBhcmVmIGFyaXRobWV0aWMtZXJyb3Itb3BlcmFuZHMgYXJpdGhtZXRpYy1lcnJvci1vcGVyYXRpb24KKyAgICAgICAgYXJyYXktZGltZW5zaW9uIGFycmF5LWRpbWVuc2lvbnMgYXJyYXktZGlzcGxhY2VtZW50CisgICAgICAgIGFycmF5LWVsZW1lbnQtdHlwZSBhcnJheS1oYXMtZmlsbC1wb2ludGVyLXAgYXJyYXktaW4tYm91bmRzLXAKKyAgICAgICAgYXJyYXlwIGFycmF5LXJhbmsgYXJyYXktcm93LW1ham9yLWluZGV4IGFycmF5LXRvdGFsLXNpemUKKyAgICAgICAgYXNoIGFzaW4gYXNpbmggYXNzb2MgYXNzb2MtaWYgYXNzb2MtaWYtbm90IGF0YW4gYXRhbmggYXRvbQorICAgICAgICBiaXQgYml0LWFuZCBiaXQtYW5kYzEgYml0LWFuZGMyIGJpdC1lcXYgYml0LWlvciBiaXQtbmFuZAorICAgICAgICBiaXQtbm9yIGJpdC1ub3QgYml0LW9yYzEgYml0LW9yYzIgYml0LXZlY3Rvci1wIGJpdC14b3IgYm9vbGUKKyAgICAgICAgYm90aC1jYXNlLXAgYm91bmRwIGJyZWFrIGJyb2FkY2FzdC1zdHJlYW0tc3RyZWFtcyBidXRsYXN0CisgICAgICAgIGJ5dGUgYnl0ZS1wb3NpdGlvbiBieXRlLXNpemUgY2FhYWFyIGNhYWFkciBjYWFhciBjYWFkYXIKKyAgICAgICAgY2FhZGRyIGNhYWRyIGNhYXIgY2FkYWFyIGNhZGFkciBjYWRhciBjYWRkYXIgY2FkZGRyIGNhZGRyCisgICAgICAgIGNhZHIgY2FsbC1uZXh0LW1ldGhvZCBjYXIgY2RhYWFyIGNkYWFkciBjZGFhciBjZGFkYXIgY2RhZGRyCisgICAgICAgIGNkYWRyIGNkYXIgY2RkYWFyIGNkZGFkciBjZGRhciBjZGRkYXIgY2RkZGRyIGNkZGRyIGNkZHIgY2RyCisgICAgICAgIGNlaWxpbmcgY2VsbC1lcnJvci1uYW1lIGNlcnJvciBjaGFuZ2UtY2xhc3MgY2hhciBjaGFyPCBjaGFyPD0KKyAgICAgICAgY2hhcj0gY2hhcj4gY2hhcj49IGNoYXIvPSBjaGFyYWN0ZXIgY2hhcmFjdGVycCBjaGFyLWNvZGUKKyAgICAgICAgY2hhci1kb3duY2FzZSBjaGFyLWVxdWFsIGNoYXItZ3JlYXRlcnAgY2hhci1pbnQgY2hhci1sZXNzcAorICAgICAgICBjaGFyLW5hbWUgY2hhci1ub3QtZXF1YWwgY2hhci1ub3QtZ3JlYXRlcnAgY2hhci1ub3QtbGVzc3AKKyAgICAgICAgY2hhci11cGNhc2UgY2lzIGNsYXNzLW5hbWUgY2xhc3Mtb2YgY2xlYXItaW5wdXQgY2xlYXItb3V0cHV0CisgICAgICAgIGNsb3NlIGNscmhhc2ggY29kZS1jaGFyIGNvZXJjZSBjb21waWxlIGNvbXBpbGVkLWZ1bmN0aW9uLXAKKyAgICAgICAgY29tcGlsZS1maWxlIGNvbXBpbGUtZmlsZS1wYXRobmFtZSBjb21waWxlci1tYWNyby1mdW5jdGlvbgorICAgICAgICBjb21wbGVtZW50IGNvbXBsZXggY29tcGxleHAgY29tcHV0ZS1hcHBsaWNhYmxlLW1ldGhvZHMKKyAgICAgICAgY29tcHV0ZS1yZXN0YXJ0cyBjb25jYXRlbmF0ZSBjb25jYXRlbmF0ZWQtc3RyZWFtLXN0cmVhbXMgY29uanVnYXRlCisgICAgICAgIGNvbnMgY29uc3AgY29uc3RhbnRseSBjb25zdGFudHAgY29udGludWUgY29weS1hbGlzdCBjb3B5LWxpc3QKKyAgICAgICAgY29weS1wcHJpbnQtZGlzcGF0Y2ggY29weS1yZWFkdGFibGUgY29weS1zZXEgY29weS1zdHJ1Y3R1cmUKKyAgICAgICAgY29weS1zeW1ib2wgY29weS10cmVlIGNvcyBjb3NoIGNvdW50IGNvdW50LWlmIGNvdW50LWlmLW5vdAorICAgICAgICBkZWNvZGUtZmxvYXQgZGVjb2RlLXVuaXZlcnNhbC10aW1lIGRlbGV0ZSBkZWxldGUtZHVwbGljYXRlcworICAgICAgICBkZWxldGUtZmlsZSBkZWxldGUtaWYgZGVsZXRlLWlmLW5vdCBkZWxldGUtcGFja2FnZSBkZW5vbWluYXRvcgorICAgICAgICBkZXBvc2l0LWZpZWxkIGRlc2NyaWJlIGRlc2NyaWJlLW9iamVjdCBkaWdpdC1jaGFyIGRpZ2l0LWNoYXItcAorICAgICAgICBkaXJlY3RvcnkgZGlyZWN0b3J5LW5hbWVzdHJpbmcgZGlzYXNzZW1ibGUgZG9jdW1lbnRhdGlvbiBkcGIKKyAgICAgICAgZHJpYmJsZSBlY2hvLXN0cmVhbS1pbnB1dC1zdHJlYW0gZWNoby1zdHJlYW0tb3V0cHV0LXN0cmVhbQorICAgICAgICBlZCBlaWdodGggZWx0IGVuY29kZS11bml2ZXJzYWwtdGltZSBlbmRwIGVub3VnaC1uYW1lc3RyaW5nCisgICAgICAgIGVuc3VyZS1kaXJlY3Rvcmllcy1leGlzdCBlbnN1cmUtZ2VuZXJpYy1mdW5jdGlvbiBlcQorICAgICAgICBlcWwgZXF1YWwgZXF1YWxwIGVycm9yIGV2YWwgZXZlbnAgZXZlcnkgZXhwIGV4cG9ydCBleHB0CisgICAgICAgIGZib3VuZHAgZmNlaWxpbmcgZmRlZmluaXRpb24gZmZsb29yIGZpZnRoIGZpbGUtYXV0aG9yCisgICAgICAgIGZpbGUtZXJyb3ItcGF0aG5hbWUgZmlsZS1sZW5ndGggZmlsZS1uYW1lc3RyaW5nIGZpbGUtcG9zaXRpb24KKyAgICAgICAgZmlsZS1zdHJpbmctbGVuZ3RoIGZpbGUtd3JpdGUtZGF0ZSBmaWxsIGZpbGwtcG9pbnRlciBmaW5kCisgICAgICAgIGZpbmQtYWxsLXN5bWJvbHMgZmluZC1jbGFzcyBmaW5kLWlmIGZpbmQtaWYtbm90IGZpbmQtbWV0aG9kCisgICAgICAgIGZpbmQtcGFja2FnZSBmaW5kLXJlc3RhcnQgZmluZC1zeW1ib2wgZmluaXNoLW91dHB1dCBmaXJzdAorICAgICAgICBmbG9hdCBmbG9hdC1kaWdpdHMgZmxvYXRwIGZsb2F0LXByZWNpc2lvbiBmbG9hdC1yYWRpeAorICAgICAgICBmbG9hdC1zaWduIGZsb29yIGZtYWt1bmJvdW5kIGZvcmNlLW91dHB1dCBmb3JtYXQgZm91cnRoCisgICAgICAgIGZyZXNoLWxpbmUgZnJvdW5kIGZ0cnVuY2F0ZSBmdW5jYWxsIGZ1bmN0aW9uLWtleXdvcmRzCisgICAgICAgIGZ1bmN0aW9uLWxhbWJkYS1leHByZXNzaW9uIGZ1bmN0aW9ucCBnY2QgZ2Vuc3ltIGdlbnRlbXAgZ2V0CisgICAgICAgIGdldC1kZWNvZGVkLXRpbWUgZ2V0LWRpc3BhdGNoLW1hY3JvLWNoYXJhY3RlciBnZXRmIGdldGhhc2gKKyAgICAgICAgZ2V0LWludGVybmFsLXJlYWwtdGltZSBnZXQtaW50ZXJuYWwtcnVuLXRpbWUgZ2V0LW1hY3JvLWNoYXJhY3RlcgorICAgICAgICBnZXQtb3V0cHV0LXN0cmVhbS1zdHJpbmcgZ2V0LXByb3BlcnRpZXMgZ2V0LXNldGYtZXhwYW5zaW9uCisgICAgICAgIGdldC11bml2ZXJzYWwtdGltZSBncmFwaGljLWNoYXItcCBoYXNoLXRhYmxlLWNvdW50IGhhc2gtdGFibGUtcAorICAgICAgICBoYXNoLXRhYmxlLXJlaGFzaC1zaXplIGhhc2gtdGFibGUtcmVoYXNoLXRocmVzaG9sZAorICAgICAgICBoYXNoLXRhYmxlLXNpemUgaGFzaC10YWJsZS10ZXN0IGhvc3QtbmFtZXN0cmluZyBpZGVudGl0eQorICAgICAgICBpbWFncGFydCBpbXBvcnQgaW5pdGlhbGl6ZS1pbnN0YW5jZSBpbnB1dC1zdHJlYW0tcCBpbnNwZWN0CisgICAgICAgIGludGVnZXItZGVjb2RlLWZsb2F0IGludGVnZXItbGVuZ3RoIGludGVnZXJwIGludGVyYWN0aXZlLXN0cmVhbS1wCisgICAgICAgIGludGVybiBpbnRlcnNlY3Rpb24gaW52YWxpZC1tZXRob2QtZXJyb3IgaW52b2tlLWRlYnVnZ2VyCisgICAgICAgIGludm9rZS1yZXN0YXJ0IGludm9rZS1yZXN0YXJ0LWludGVyYWN0aXZlbHkgaXNxcnQga2V5d29yZHAKKyAgICAgICAgbGFzdCBsY20gbGRiIGxkYi10ZXN0IGxkaWZmIGxlbmd0aCBsaXNwLWltcGxlbWVudGF0aW9uLXR5cGUKKyAgICAgICAgbGlzcC1pbXBsZW1lbnRhdGlvbi12ZXJzaW9uIGxpc3QgbGlzdCogbGlzdC1hbGwtcGFja2FnZXMgbGlzdGVuCisgICAgICAgIGxpc3QtbGVuZ3RoIGxpc3RwIGxvYWQgbG9hZC1sb2dpY2FsLXBhdGhuYW1lLXRyYW5zbGF0aW9ucworICAgICAgICBsb2cgbG9nYW5kIGxvZ2FuZGMxIGxvZ2FuZGMyIGxvZ2JpdHAgbG9nY291bnQgbG9nZXF2CisgICAgICAgIGxvZ2ljYWwtcGF0aG5hbWUgbG9naWNhbC1wYXRobmFtZS10cmFuc2xhdGlvbnMgbG9naW9yCisgICAgICAgIGxvZ25hbmQgbG9nbm9yIGxvZ25vdCBsb2dvcmMxIGxvZ29yYzIgbG9ndGVzdCBsb2d4b3IKKyAgICAgICAgbG9uZy1zaXRlLW5hbWUgbG93ZXItY2FzZS1wIG1hY2hpbmUtaW5zdGFuY2UgbWFjaGluZS10eXBlCisgICAgICAgIG1hY2hpbmUtdmVyc2lvbiBtYWNyb2V4cGFuZCBtYWNyb2V4cGFuZC0xIG1hY3JvLWZ1bmN0aW9uCisgICAgICAgIG1ha2UtYXJyYXkgbWFrZS1icm9hZGNhc3Qtc3RyZWFtIG1ha2UtY29uY2F0ZW5hdGVkLXN0cmVhbQorICAgICAgICBtYWtlLWNvbmRpdGlvbiBtYWtlLWRpc3BhdGNoLW1hY3JvLWNoYXJhY3RlciBtYWtlLWVjaG8tc3RyZWFtCisgICAgICAgIG1ha2UtaGFzaC10YWJsZSBtYWtlLWluc3RhbmNlIG1ha2UtaW5zdGFuY2VzLW9ic29sZXRlIG1ha2UtbGlzdAorICAgICAgICBtYWtlLWxvYWQtZm9ybSBtYWtlLWxvYWQtZm9ybS1zYXZpbmctc2xvdHMgbWFrZS1wYWNrYWdlCisgICAgICAgIG1ha2UtcGF0aG5hbWUgbWFrZS1yYW5kb20tc3RhdGUgbWFrZS1zZXF1ZW5jZSBtYWtlLXN0cmluZworICAgICAgICBtYWtlLXN0cmluZy1pbnB1dC1zdHJlYW0gbWFrZS1zdHJpbmctb3V0cHV0LXN0cmVhbSBtYWtlLXN5bWJvbAorICAgICAgICBtYWtlLXN5bm9ueW0tc3RyZWFtIG1ha2UtdHdvLXdheS1zdHJlYW0gbWFrdW5ib3VuZCBtYXAgbWFwYworICAgICAgICBtYXBjYW4gbWFwY2FyIG1hcGNvbiBtYXBoYXNoIG1hcC1pbnRvIG1hcGwgbWFwbGlzdCBtYXNrLWZpZWxkCisgICAgICAgIG1heCBtZW1iZXIgbWVtYmVyLWlmIG1lbWJlci1pZi1ub3QgbWVyZ2UgbWVyZ2UtcGF0aG5hbWVzCisgICAgICAgIG1ldGhvZC1jb21iaW5hdGlvbi1lcnJvciBtZXRob2QtcXVhbGlmaWVycyBtaW4gbWludXNwIG1pc21hdGNoIG1vZAorICAgICAgICBtdWZmbGUtd2FybmluZyBuYW1lLWNoYXIgbmFtZXN0cmluZyBuYnV0bGFzdCBuY29uYyBuZXh0LW1ldGhvZC1wCisgICAgICAgIG5pbnRlcnNlY3Rpb24gbmludGggbm8tYXBwbGljYWJsZS1tZXRob2Qgbm8tbmV4dC1tZXRob2Qgbm90IG5vdGFueQorICAgICAgICBub3RldmVyeSBucmVjb25jIG5yZXZlcnNlIG5zZXQtZGlmZmVyZW5jZSBuc2V0LWV4Y2x1c2l2ZS1vcgorICAgICAgICBuc3RyaW5nLWNhcGl0YWxpemUgbnN0cmluZy1kb3duY2FzZSBuc3RyaW5nLXVwY2FzZSBuc3VibGlzCisgICAgICAgIG5zdWJzdCBuc3Vic3QtaWYgbnN1YnN0LWlmLW5vdCBuc3Vic3RpdHV0ZSBuc3Vic3RpdHV0ZS1pZgorICAgICAgICBuc3Vic3RpdHV0ZS1pZi1ub3QgbnRoIG50aGNkciBudWxsIG51bWJlcnAgbnVtZXJhdG9yIG51bmlvbgorICAgICAgICBvZGRwIG9wZW4gb3Blbi1zdHJlYW0tcCBvdXRwdXQtc3RyZWFtLXAgcGFja2FnZS1lcnJvci1wYWNrYWdlCisgICAgICAgIHBhY2thZ2UtbmFtZSBwYWNrYWdlLW5pY2tuYW1lcyBwYWNrYWdlcCBwYWNrYWdlLXNoYWRvd2luZy1zeW1ib2xzCisgICAgICAgIHBhY2thZ2UtdXNlZC1ieS1saXN0IHBhY2thZ2UtdXNlLWxpc3QgcGFpcmxpcyBwYXJzZS1pbnRlZ2VyCisgICAgICAgIHBhcnNlLW5hbWVzdHJpbmcgcGF0aG5hbWUgcGF0aG5hbWUtZGV2aWNlIHBhdGhuYW1lLWRpcmVjdG9yeQorICAgICAgICBwYXRobmFtZS1ob3N0IHBhdGhuYW1lLW1hdGNoLXAgcGF0aG5hbWUtbmFtZSBwYXRobmFtZXAKKyAgICAgICAgcGF0aG5hbWUtdHlwZSBwYXRobmFtZS12ZXJzaW9uIHBlZWstY2hhciBwaGFzZSBwbHVzcAorICAgICAgICBwb3NpdGlvbiBwb3NpdGlvbi1pZiBwb3NpdGlvbi1pZi1ub3QgcHByaW50IHBwcmludC1kaXNwYXRjaAorICAgICAgICBwcHJpbnQtZmlsbCBwcHJpbnQtaW5kZW50IHBwcmludC1saW5lYXIgcHByaW50LW5ld2xpbmUgcHByaW50LXRhYgorICAgICAgICBwcHJpbnQtdGFidWxhciBwcmluMSBwcmluMS10by1zdHJpbmcgcHJpbmMgcHJpbmMtdG8tc3RyaW5nIHByaW50CisgICAgICAgIHByaW50LW9iamVjdCBwcm9iZS1maWxlIHByb2NsYWltIHByb3ZpZGUgcmFuZG9tIHJhbmRvbS1zdGF0ZS1wCisgICAgICAgIHJhc3NvYyByYXNzb2MtaWYgcmFzc29jLWlmLW5vdCByYXRpb25hbCByYXRpb25hbGl6ZSByYXRpb25hbHAKKyAgICAgICAgcmVhZCByZWFkLWJ5dGUgcmVhZC1jaGFyIHJlYWQtY2hhci1uby1oYW5nIHJlYWQtZGVsaW1pdGVkLWxpc3QKKyAgICAgICAgcmVhZC1mcm9tLXN0cmluZyByZWFkLWxpbmUgcmVhZC1wcmVzZXJ2aW5nLXdoaXRlc3BhY2UKKyAgICAgICAgcmVhZC1zZXF1ZW5jZSByZWFkdGFibGUtY2FzZSByZWFkdGFibGVwIHJlYWxwIHJlYWxwYXJ0CisgICAgICAgIHJlZHVjZSByZWluaXRpYWxpemUtaW5zdGFuY2UgcmVtIHJlbWhhc2ggcmVtb3ZlCisgICAgICAgIHJlbW92ZS1kdXBsaWNhdGVzIHJlbW92ZS1pZiByZW1vdmUtaWYtbm90IHJlbW92ZS1tZXRob2QKKyAgICAgICAgcmVtcHJvcCByZW5hbWUtZmlsZSByZW5hbWUtcGFja2FnZSByZXBsYWNlIHJlcXVpcmUgcmVzdAorICAgICAgICByZXN0YXJ0LW5hbWUgcmV2YXBwZW5kIHJldmVyc2Ugcm9vbSByb3VuZCByb3ctbWFqb3ItYXJlZgorICAgICAgICBycGxhY2EgcnBsYWNkIHNiaXQgc2NhbGUtZmxvYXQgc2NoYXIgc2VhcmNoIHNlY29uZCBzZXQKKyAgICAgICAgc2V0LWRpZmZlcmVuY2Ugc2V0LWRpc3BhdGNoLW1hY3JvLWNoYXJhY3RlciBzZXQtZXhjbHVzaXZlLW9yCisgICAgICAgIHNldC1tYWNyby1jaGFyYWN0ZXIgc2V0LXBwcmludC1kaXNwYXRjaCBzZXQtc3ludGF4LWZyb20tY2hhcgorICAgICAgICBzZXZlbnRoIHNoYWRvdyBzaGFkb3dpbmctaW1wb3J0IHNoYXJlZC1pbml0aWFsaXplCisgICAgICAgIHNob3J0LXNpdGUtbmFtZSBzaWduYWwgc2lnbnVtIHNpbXBsZS1iaXQtdmVjdG9yLXAKKyAgICAgICAgc2ltcGxlLWNvbmRpdGlvbi1mb3JtYXQtYXJndW1lbnRzIHNpbXBsZS1jb25kaXRpb24tZm9ybWF0LWNvbnRyb2wKKyAgICAgICAgc2ltcGxlLXN0cmluZy1wIHNpbXBsZS12ZWN0b3ItcCBzaW4gc2luaCBzaXh0aCBzbGVlcCBzbG90LWJvdW5kcAorICAgICAgICBzbG90LWV4aXN0cy1wIHNsb3QtbWFrdW5ib3VuZCBzbG90LW1pc3Npbmcgc2xvdC11bmJvdW5kIHNsb3QtdmFsdWUKKyAgICAgICAgc29mdHdhcmUtdHlwZSBzb2Z0d2FyZS12ZXJzaW9uIHNvbWUgc29ydCBzcGVjaWFsLW9wZXJhdG9yLXAKKyAgICAgICAgc3FydCBzdGFibGUtc29ydCBzdGFuZGFyZC1jaGFyLXAgc3RvcmUtdmFsdWUgc3RyZWFtLWVsZW1lbnQtdHlwZQorICAgICAgICBzdHJlYW0tZXJyb3Itc3RyZWFtIHN0cmVhbS1leHRlcm5hbC1mb3JtYXQgc3RyZWFtcCBzdHJpbmcgc3RyaW5nPAorICAgICAgICBzdHJpbmc8PSBzdHJpbmc9IHN0cmluZz4gc3RyaW5nPj0gc3RyaW5nLz0gc3RyaW5nLWNhcGl0YWxpemUKKyAgICAgICAgc3RyaW5nLWRvd25jYXNlIHN0cmluZy1lcXVhbCBzdHJpbmctZ3JlYXRlcnAgc3RyaW5nLWxlZnQtdHJpbQorICAgICAgICBzdHJpbmctbGVzc3Agc3RyaW5nLW5vdC1lcXVhbCBzdHJpbmctbm90LWdyZWF0ZXJwIHN0cmluZy1ub3QtbGVzc3AKKyAgICAgICAgc3RyaW5ncCBzdHJpbmctcmlnaHQtdHJpbSBzdHJpbmctdHJpbSBzdHJpbmctdXBjYXNlIHN1YmxpcyBzdWJzZXEKKyAgICAgICAgc3Vic2V0cCBzdWJzdCBzdWJzdC1pZiBzdWJzdC1pZi1ub3Qgc3Vic3RpdHV0ZSBzdWJzdGl0dXRlLWlmCisgICAgICAgIHN1YnN0aXR1dGUtaWYtbm90IHN1YnR5cGVwc3ZyZWYgc3hoYXNoIHN5bWJvbC1mdW5jdGlvbgorICAgICAgICBzeW1ib2wtbmFtZSBzeW1ib2xwIHN5bWJvbC1wYWNrYWdlIHN5bWJvbC1wbGlzdCBzeW1ib2wtdmFsdWUKKyAgICAgICAgc3lub255bS1zdHJlYW0tc3ltYm9sIHN5bnRheDogdGFpbHAgdGFuIHRhbmggdGVudGggdGVycHJpIHRoaXJkCisgICAgICAgIHRyYW5zbGF0ZS1sb2dpY2FsLXBhdGhuYW1lIHRyYW5zbGF0ZS1wYXRobmFtZSB0cmVlLWVxdWFsIHRydWVuYW1lCisgICAgICAgIHRydW5jYXRlIHR3by13YXktc3RyZWFtLWlucHV0LXN0cmVhbSB0d28td2F5LXN0cmVhbS1vdXRwdXQtc3RyZWFtCisgICAgICAgIHR5cGUtZXJyb3ItZGF0dW0gdHlwZS1lcnJvci1leHBlY3RlZC10eXBlIHR5cGUtb2YKKyAgICAgICAgdHlwZXAgdW5ib3VuZC1zbG90LWluc3RhbmNlIHVuZXhwb3J0IHVuaW50ZXJuIHVuaW9uCisgICAgICAgIHVucmVhZC1jaGFyIHVudXNlLXBhY2thZ2UgdXBkYXRlLWluc3RhbmNlLWZvci1kaWZmZXJlbnQtY2xhc3MKKyAgICAgICAgdXBkYXRlLWluc3RhbmNlLWZvci1yZWRlZmluZWQtY2xhc3MgdXBncmFkZWQtYXJyYXktZWxlbWVudC10eXBlCisgICAgICAgIHVwZ3JhZGVkLWNvbXBsZXgtcGFydC10eXBlIHVwcGVyLWNhc2UtcCB1c2UtcGFja2FnZQorICAgICAgICB1c2VyLWhvbWVkaXItcGF0aG5hbWUgdXNlLXZhbHVlIHZhbHVlcyB2YWx1ZXMtbGlzdCB2ZWN0b3IgdmVjdG9ycAorICAgICAgICB2ZWN0b3ItcG9wIHZlY3Rvci1wdXNoIHZlY3Rvci1wdXNoLWV4dGVuZCB3YXJuIHdpbGQtcGF0aG5hbWUtcAorICAgICAgICB3cml0ZSB3cml0ZS1ieXRlIHdyaXRlLWNoYXIgd3JpdGUtbGluZSB3cml0ZS1zZXF1ZW5jZSB3cml0ZS1zdHJpbmcKKyAgICAgICAgd3JpdGUtdG8tc3RyaW5nIHllcy1vci1uby1wIHktb3Itbi1wIHplcm9wCisgICAgICApLmZyZWV6ZQorCisgICAgICBTUEVDSUFMX0ZPUk1TID0gU2V0Lm5ldyAldygKKyAgICAgICAgYmxvY2sgY2F0Y2ggZGVjbGFyZSBldmFsLXdoZW4gZmxldCBmdW5jdGlvbiBnbyBpZiBsYWJlbHMgbGFtYmRhCisgICAgICAgIGxldCBsZXQqIGxvYWQtdGltZS12YWx1ZSBsb2NhbGx5IG1hY3JvbGV0IG11bHRpcGxlLXZhbHVlLWNhbGwKKyAgICAgICAgbXVsdGlwbGUtdmFsdWUtcHJvZzEgcHJvZ24gcHJvZ3YgcXVvdGUgcmV0dXJuLWZyb20gc2V0cQorICAgICAgICBzeW1ib2wtbWFjcm9sZXQgdGFnYm9keSB0aGUgdGhyb3cgdW53aW5kLXByb3RlY3QKKyAgICAgICkKKworICAgICAgTUFDUk9TID0gU2V0Lm5ldyAldygKKyAgICAgICAgYW5kIGFzc2VydCBjYWxsLW1ldGhvZCBjYXNlIGNjYXNlIGNoZWNrLXR5cGUgY29uZCBjdHlwZWNhc2UgZGVjZgorICAgICAgICBkZWNsYWltIGRlZmNsYXNzIGRlZmNvbnN0YW50IGRlZmdlbmVyaWMgZGVmaW5lLWNvbXBpbGVyLW1hY3JvCisgICAgICAgIGRlZmluZS1jb25kaXRpb24gZGVmaW5lLW1ldGhvZC1jb21iaW5hdGlvbiBkZWZpbmUtbW9kaWZ5LW1hY3JvCisgICAgICAgIGRlZmluZS1zZXRmLWV4cGFuZGVyIGRlZmluZS1zeW1ib2wtbWFjcm8gZGVmbWFjcm8gZGVmbWV0aG9kCisgICAgICAgIGRlZnBhY2thZ2UgZGVmcGFyYW1ldGVyIGRlZnNldGYgZGVmc3RydWN0IGRlZnR5cGUgZGVmdW4gZGVmdmFyCisgICAgICAgIGRlc3RydWN0dXJpbmctYmluZCBkbyBkbyogZG8tYWxsLXN5bWJvbHMgZG8tZXh0ZXJuYWwtc3ltYm9scworICAgICAgICBkb2xpc3QgZG8tc3ltYm9scyBkb3RpbWVzIGVjYXNlIGV0eXBlY2FzZSBmb3JtYXR0ZXIKKyAgICAgICAgaGFuZGxlci1iaW5kIGhhbmRsZXItY2FzZSBpZ25vcmUtZXJyb3JzIGluY2YgaW4tcGFja2FnZQorICAgICAgICBsYW1iZGEgbG9vcCBsb29wLWZpbmlzaCBtYWtlLW1ldGhvZCBtdWx0aXBsZS12YWx1ZS1iaW5kCisgICAgICAgIG11bHRpcGxlLXZhbHVlLWxpc3QgbXVsdGlwbGUtdmFsdWUtc2V0cSBudGgtdmFsdWUgb3IgcG9wCisgICAgICAgIHBwcmludC1leGl0LWlmLWxpc3QtZXhoYXVzdGVkIHBwcmludC1sb2dpY2FsLWJsb2NrIHBwcmludC1wb3AKKyAgICAgICAgcHJpbnQtdW5yZWFkYWJsZS1vYmplY3QgcHJvZyBwcm9nKiBwcm9nMSBwcm9nMiBwc2V0ZiBwc2V0cQorICAgICAgICBwdXNoIHB1c2huZXcgcmVtZiByZXN0YXJ0LWJpbmQgcmVzdGFydC1jYXNlIHJldHVybiByb3RhdGVmCisgICAgICAgIHNldGYgc2hpZnRmIHN0ZXAgdGltZSB0cmFjZSB0eXBlY2FzZSB1bmxlc3MgdW50cmFjZSB3aGVuCisgICAgICAgIHdpdGgtYWNjZXNzb3JzIHdpdGgtY29tcGlsYXRpb24tdW5pdCB3aXRoLWNvbmRpdGlvbi1yZXN0YXJ0cworICAgICAgICB3aXRoLWhhc2gtdGFibGUtaXRlcmF0b3Igd2l0aC1pbnB1dC1mcm9tLXN0cmluZyB3aXRoLW9wZW4tZmlsZQorICAgICAgICB3aXRoLW9wZW4tc3RyZWFtIHdpdGgtb3V0cHV0LXRvLXN0cmluZyB3aXRoLXBhY2thZ2UtaXRlcmF0b3IKKyAgICAgICAgd2l0aC1zaW1wbGUtcmVzdGFydCB3aXRoLXNsb3RzIHdpdGgtc3RhbmRhcmQtaW8tc3ludGF4CisgICAgICApCisKKyAgICAgIExBTUJEQV9MSVNUX0tFWVdPUkRTID0gU2V0Lm5ldyAldygKKyAgICAgICAgJmFsbG93LW90aGVyLWtleXMgJmF1eCAmYm9keSAmZW52aXJvbm1lbnQgJmtleSAmb3B0aW9uYWwgJnJlc3QKKyAgICAgICAgJndob2xlCisgICAgICApCisKKyAgICAgIERFQ0xBUkFUSU9OUyA9IFNldC5uZXcgJXcoCisgICAgICAgIGR5bmFtaWMtZXh0ZW50IGlnbm9yZSBvcHRpbWl6ZSBmdHlwZSBpbmxpbmUgc3BlY2lhbCBpZ25vcmFibGUKKyAgICAgICAgbm90aW5saW5lIHR5cGUKKyAgICAgICkKKworICAgICAgQlVJTFRJTl9UWVBFUyA9IFNldC5uZXcgJXcoCisgICAgICAgIGF0b20gYm9vbGVhbiBiYXNlLWNoYXIgYmFzZS1zdHJpbmcgYmlnbnVtIGJpdCBjb21waWxlZC1mdW5jdGlvbgorICAgICAgICBleHRlbmRlZC1jaGFyIGZpeG51bSBrZXl3b3JkIG5pbCBzaWduZWQtYnl0ZSBzaG9ydC1mbG9hdAorICAgICAgICBzaW5nbGUtZmxvYXQgZG91YmxlLWZsb2F0IGxvbmctZmxvYXQgc2ltcGxlLWFycmF5CisgICAgICAgIHNpbXBsZS1iYXNlLXN0cmluZyBzaW1wbGUtYml0LXZlY3RvciBzaW1wbGUtc3RyaW5nIHNpbXBsZS12ZWN0b3IKKyAgICAgICAgc3RhbmRhcmQtY2hhciB1bnNpZ25lZC1ieXRlCisKKyAgICAgICAgYXJpdGhtZXRpYy1lcnJvciBjZWxsLWVycm9yIGNvbmRpdGlvbiBjb250cm9sLWVycm9yCisgICAgICAgIGRpdmlzaW9uLWJ5LXplcm8gZW5kLW9mLWZpbGUgZXJyb3IgZmlsZS1lcnJvcgorICAgICAgICBmbG9hdGluZy1wb2ludC1pbmV4YWN0IGZsb2F0aW5nLXBvaW50LW92ZXJmbG93CisgICAgICAgIGZsb2F0aW5nLXBvaW50LXVuZGVyZmxvdyBmbG9hdGluZy1wb2ludC1pbnZhbGlkLW9wZXJhdGlvbgorICAgICAgICBwYXJzZS1lcnJvciBwYWNrYWdlLWVycm9yIHByaW50LW5vdC1yZWFkYWJsZSBwcm9ncmFtLWVycm9yCisgICAgICAgIHJlYWRlci1lcnJvciBzZXJpb3VzLWNvbmRpdGlvbiBzaW1wbGUtY29uZGl0aW9uIHNpbXBsZS1lcnJvcgorICAgICAgICBzaW1wbGUtdHlwZS1lcnJvciBzaW1wbGUtd2FybmluZyBzdHJlYW0tZXJyb3Igc3RvcmFnZS1jb25kaXRpb24KKyAgICAgICAgc3R5bGUtd2FybmluZyB0eXBlLWVycm9yIHVuYm91bmQtdmFyaWFibGUgdW5ib3VuZC1zbG90CisgICAgICAgIHVuZGVmaW5lZC1mdW5jdGlvbiB3YXJuaW5nCisgICAgICApCisKKyAgICAgIEJVSUxUSU5fQ0xBU1NFUyA9IFNldC5uZXcgJXcoCisgICAgICAgIGFycmF5IGJyb2FkY2FzdC1zdHJlYW0gYml0LXZlY3RvciBidWlsdC1pbi1jbGFzcyBjaGFyYWN0ZXIKKyAgICAgICAgY2xhc3MgY29tcGxleCBjb25jYXRlbmF0ZWQtc3RyZWFtIGNvbnMgZWNoby1zdHJlYW0gZmlsZS1zdHJlYW0KKyAgICAgICAgZmxvYXQgZnVuY3Rpb24gZ2VuZXJpYy1mdW5jdGlvbiBoYXNoLXRhYmxlIGludGVnZXIgbGlzdAorICAgICAgICBsb2dpY2FsLXBhdGhuYW1lIG1ldGhvZC1jb21iaW5hdGlvbiBtZXRob2QgbnVsbCBudW1iZXIgcGFja2FnZQorICAgICAgICBwYXRobmFtZSByYXRpbyByYXRpb25hbCByZWFkdGFibGUgcmVhbCByYW5kb20tc3RhdGUgcmVzdGFydAorICAgICAgICBzZXF1ZW5jZSBzdGFuZGFyZC1jbGFzcyBzdGFuZGFyZC1nZW5lcmljLWZ1bmN0aW9uIHN0YW5kYXJkLW1ldGhvZAorICAgICAgICBzdGFuZGFyZC1vYmplY3Qgc3RyaW5nLXN0cmVhbSBzdHJlYW0gc3RyaW5nIHN0cnVjdHVyZS1jbGFzcworICAgICAgICBzdHJ1Y3R1cmUtb2JqZWN0IHN5bWJvbCBzeW5vbnltLXN0cmVhbSB0IHR3by13YXktc3RyZWFtIHZlY3RvcgorICAgICAgKQorCisgICAgICBub25tYWNybyA9IC9cXC58W2EtekEtWjAtOSEkJSYqKy1cLzw9Pj9AXFtcXV5fe31+XS8KKyAgICAgIGNvbnN0aXR1ZW50ID0gLyN7bm9ubWFjcm99fFsjLjpdLworICAgICAgdGVybWluYXRlZCA9IC8oPz1bICInKClcbiw7YF0pLyAjIHdoaXRlc3BhY2Ugb3IgdGVybWluYXRpbmcgbWFjcm8gY2hhcnMKKyAgICAgIHN5bWJvbCA9IC8oXHxbXlx8XStcfHwje25vbm1hY3JvfSN7Y29uc3RpdHVlbnR9KikvCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgLzsuKiQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvI1x8LywgQ29tbWVudDo6TXVsdGlsaW5lLCA6bXVsdGlsaW5lX2NvbW1lbnQKKworICAgICAgICAjIGVuY29kaW5nIGNvbW1lbnQKKyAgICAgICAgcnVsZSAvI1xkKlkuKiQvLCBDb21tZW50OjpTcGVjaWFsCisgICAgICAgIHJ1bGUgLyIoXFwufFteIlxcXSkqIi8sIFN0cgorCisgICAgICAgIHJ1bGUgL1s6J10je3N5bWJvbH0vLCBTdHI6OlN5bWJvbAorICAgICAgICBydWxlIC9bJ2BdLywgT3BlcmF0b3IKKworICAgICAgICAjIG51bWJlcnMKKyAgICAgICAgcnVsZSAvWy0rXT9cZCtcLj8je3Rlcm1pbmF0ZWR9LywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgJXIoWy0rXT9cZCsvXGQrI3t0ZXJtaW5hdGVkfSksIE51bTo6SW50ZWdlcgorICAgICAgICBydWxlICVyKAorICAgICAgICAgIFstK10/CisgICAgICAgICAgKFxkKlwuXGQrKFtkZWZsc11bLStdP1xkKyk/CisgICAgICAgICAgfFxkKyhcLlxkKik/W2RlZmxzXVstK10/XGQrKQorICAgICAgICAgICN7dGVybWluYXRlZH0KKyAgICAgICAgKXgsIE51bTo6RmxvYXQKKworICAgICAgICAjIHNoYXJwc2lnbiBzdHJpbmdzIGFuZCBjaGFyYWN0ZXJzCisgICAgICAgIHJ1bGUgLyNcXC4je3Rlcm1pbmF0ZWR9LywgU3RyOjpDaGFyCisgICAgICAgIHJ1bGUgLyNcXCN7c3ltYm9sfS8sIFN0cjo6Q2hhcgorCisgICAgICAgIHJ1bGUgLyNcKC8sIE9wZXJhdG9yLCA6cm9vdAorCisgICAgICAgICMgYml0c3RyaW5nCisgICAgICAgIHJ1bGUgLyNcZCpcKlswMV0qLywgT3RoZXIKKworICAgICAgICAjIHVuaW50ZXJuZWQgc3ltYm9sCisgICAgICAgIHJ1bGUgLyM6I3tzeW1ib2x9LywgU3RyOjpTeW1ib2wKKworICAgICAgICAjIHJlYWQtdGltZSBhbmQgbG9hZC10aW1lIGV2YWx1YXRpb24KKyAgICAgICAgcnVsZSAvI1suLF0vLCBPcGVyYXRvcgorCisgICAgICAgICMgZnVuY3Rpb24gc2hvcnRoYW5kCisgICAgICAgIHJ1bGUgLyMnLywgTmFtZTo6RnVuY3Rpb24KKworICAgICAgICAjIGJpbmFyeSByYXRpb25hbAorICAgICAgICBydWxlIC8jYlsrLV0/WzAxXSsoXC9bMDFdKyk/L2ksIE51bQorCisgICAgICAgICMgb2N0YWwgcmF0aW9uYWwKKyAgICAgICAgcnVsZSAvI29bKy1dP1swLTddKyhcL1swLTddKyk/L2ksIE51bTo6T2N0CisKKyAgICAgICAgIyBoZXggcmF0aW9uYWwKKyAgICAgICAgcnVsZSAvI3hbKy1dP1swLTlhLWZdKyhcL1swLTlhLWZdKyk/L2ksIE51bQorCisgICAgICAgICMgY29tcGxleAorICAgICAgICBydWxlIC8oI2MpKFwoKS9pIGRvCisgICAgICAgICAgZ3JvdXBzIE51bSwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDpyb290CisgICAgICAgIGVuZAorCisgICAgICAgICMgYXJyYXlzIGFuZCBzdHJ1Y3R1cmVzCisgICAgICAgIHJ1bGUgLygjKD86XGQrYXxzKSkoXCgpL2kgZG8KKyAgICAgICAgICBncm91cHMgU3RyOjpPdGhlciwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDpyb290CisgICAgICAgIGVuZAorCisgICAgICAgICMgcGF0aAorICAgICAgICBydWxlIC8jcD8iKFxcLnxbXiJdKSoiL2ksIFN0cjo6U3ltYm9sCisKKyAgICAgICAgIyByZWZlcmVuY2UKKyAgICAgICAgcnVsZSAvI1xkK1s9I10vLCBPcGVyYXRvcgorCisgICAgICAgICMgcmVhZC10aW1lIGNvbW1lbnQKKyAgICAgICAgcnVsZSAvIytuaWwje3Rlcm1pbmF0ZWR9XHMqXCgvLCBDb21tZW50LCA6Y29tbWVudGVkX2Zvcm0KKworICAgICAgICAjIHJlYWQtdGltZSBjb25kaXRpb25hbAorICAgICAgICBydWxlIC8jWystXS8sIE9wZXJhdG9yCisKKyAgICAgICAgIyBzcGVjaWFsIG9wZXJhdG9ycyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gcGFyc2VkIGFscmVhZHkKKyAgICAgICAgcnVsZSAvKCxAfCx8XC4pLywgT3BlcmF0b3IKKworICAgICAgICAjIHNwZWNpYWwgY29uc3RhbnRzCisgICAgICAgIHJ1bGUgLyh0fG5pbCkje3Rlcm1pbmF0ZWR9LywgTmFtZTo6Q29uc3RhbnQKKworICAgICAgICAjIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzCisgICAgICAgICMgbm90ZSB0aGF0IHRoZXNlIGdldCBmaWx0ZXJlZCB0aHJvdWdoIGluIHN0cmVhbV90b2tlbnMKKyAgICAgICAgcnVsZSAvXCoje3N5bWJvbH1cKi8sIE5hbWU6OlZhcmlhYmxlOjpHbG9iYWwKKyAgICAgICAgcnVsZSBzeW1ib2wgZG8gfG18CisgICAgICAgICAgc3ltID0gbVswXQorCisgICAgICAgICAgaWYgQlVJTFRJTl9GVU5DVElPTlMuaW5jbHVkZT8gc3ltCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzaWYgU1BFQ0lBTF9GT1JNUy5pbmNsdWRlPyBzeW0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQKKyAgICAgICAgICBlbHNpZiBNQUNST1MuaW5jbHVkZT8gc3ltCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzaWYgTEFNQkRBX0xJU1RfS0VZV09SRFMuaW5jbHVkZT8gc3ltCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgREVDTEFSQVRJT05TLmluY2x1ZGU/IHN5bQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGVsc2lmIEJVSUxUSU5fVFlQRVMuaW5jbHVkZT8gc3ltCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpUeXBlCisgICAgICAgICAgZWxzaWYgQlVJTFRJTl9DTEFTU0VTLmluY2x1ZGU/IHN5bQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6Q2xhc3MKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpWYXJpYWJsZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9cKC8sIFB1bmN0dWF0aW9uLCA6cm9vdAorICAgICAgICBydWxlIC9cKS8sIFB1bmN0dWF0aW9uIGRvCisgICAgICAgICAgaWYgc3RhY2suZW1wdHk/CisgICAgICAgICAgICB0b2tlbiBFcnJvcgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgICBwb3AhCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptdWx0aWxpbmVfY29tbWVudCBkbworICAgICAgICBydWxlIC8jXHwvLCBDb21tZW50OjpNdWx0aWxpbmUsIDptdWx0aWxpbmVfY29tbWVudAorICAgICAgICBydWxlIC9cfCMvLCBDb21tZW50OjpNdWx0aWxpbmUsIDpwb3AhCisgICAgICAgIHJ1bGUgL1teXHwjXSsvLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgcnVsZSAvW1x8I10vLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29tbWVudGVkX2Zvcm0gZG8KKyAgICAgICAgcnVsZSAvXCgvLCBDb21tZW50LCA6Y29tbWVudGVkX2Zvcm0KKyAgICAgICAgcnVsZSAvXCkvLCBDb21tZW50LCA6cG9wIQorICAgICAgICBydWxlIC9bXigpXSsvLCBDb21tZW50CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2NvbmYucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jb25mLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTVjNDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jb25mLnJiCkBAIC0wLDAgKzEsMjQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBDb25mIDwgUmVnZXhMZXhlcgorICAgICAgdGFnICdjb25mJworICAgICAgYWxpYXNlcyAnY29uZmlnJywgJ2NvbmZpZ3VyYXRpb24nCisKKyAgICAgIHRpdGxlICJDb25maWcgRmlsZSIKKyAgICAgIGRlc2MgJ0EgZ2VuZXJpYyBsZXhlciBmb3IgY29uZmlndXJhdGlvbiBmaWxlcycKKyAgICAgIGZpbGVuYW1lcyAnKi5jb25mJywgJyouY29uZmlnJworCisgICAgICAjIHNob3J0IGFuZCBzd2VldAorICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvIy4qP1xuLywgQ29tbWVudAorICAgICAgICBydWxlIC8iLio/Ii8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLycuKj8nLywgU3RyOjpTaW5nbGUKKyAgICAgICAgcnVsZSAvW2Etel1cdyovaSwgTmFtZQorICAgICAgICBydWxlIC9cZCsvLCBOdW0KKyAgICAgICAgcnVsZSAvW15cZFx3IyInXSsvLCBUZXh0CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2NvcS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2NvcS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzY2YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY29xLnJiCkBAIC0wLDAgKzEsMTg3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgQ29xIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkNvcSIKKyAgICAgIGRlc2MgJ0NvcSAoY29xLmlucmlhLmZyKScKKyAgICAgIHRhZyAnY29xJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtY29xJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDAuMyBpZiB0ZXh0LmluY2x1ZGU/ICJSZXF1aXJlIgorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmdhbGxpbmEKKyAgICAgICAgQGdhbGxpbmEgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgYXMgZnVuIGlmIGluIGxldCBtYXRjaCB0aGVuIGVsc2UgcmV0dXJuIGVuZCBUeXBlIFNldCBQcm9wCisgICAgICAgICAgZm9yYWxsCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5jb3EKKyAgICAgICAgQGNvcSB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBEZWZpbml0aW9uIFRoZW9yZW0gTGVtbWEgUmVtYXJrIEV4YW1wbGUgRml4cG9pbnQgQ29GaXhwb2ludAorICAgICAgICAgIFJlY29yZCBJbmR1Y3RpdmUgQ29JbmR1Y3RpdmUgQ29yb2xsYXJ5IEdvYWwgUHJvb2YKKyAgICAgICAgICBMdGFjIFJlcXVpcmUgSW1wb3J0IEV4cG9ydCBNb2R1bGUgU2VjdGlvbiBFbmQgVmFyaWFibGUKKyAgICAgICAgICBDb250ZXh0IFBvbHltb3JwaGljIE1vbm9tb3JwaGljIFVuaXZlcnNlIFVuaXZlcnNlcworICAgICAgICAgIFZhcmlhYmxlcyBDbGFzcyBJbnN0YW5jZSBHbG9iYWwgTG9jYWwgSW5jbHVkZQorICAgICAgICAgIFByaW50aW5nIE5vdGF0aW9uIEluZml4IEFyZ3VtZW50cyBIaW50IFJld3JpdGUgSW1tZWRpYXRlCisgICAgICAgICAgUWVkIERlZmluZWQgT3BhcXVlIFRyYW5zcGFyZW50IEV4aXN0aW5nCisgICAgICAgICAgQ29tcHV0ZSBFdmFsIFByaW50IFNlYXJjaEFib3V0IFNlYXJjaCBBYm91dCBDaGVjaworICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYubHRhYworICAgICAgICBAbHRhYyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBhcHBseSBlYXBwbHkgYXV0byBlYXV0byByZXdyaXRlIHNldG9pZF9yZXdyaXRlCisgICAgICAgICAgd2l0aCBpbiBhcyBhdCBkZXN0cnVjdCBzcGxpdCBpbnZlcnNpb24gaW5qZWN0aW9uCisgICAgICAgICAgaW50cm8gaW50cm9zIHVuZm9sZCBmb2xkIGNidiBjYm4gbGF6eSBzdWJzdAorICAgICAgICAgIGNsZWFyIHN5bW1ldHJ5IHRyYW5zaXRpdml0eSBldHJhbnNpdGl2aXR5IGVyZXdyaXRlCisgICAgICAgICAgZWRlc3RydWN0IGNvbnN0cnVjdG9yIGVjb25zdHJ1Y3RvciBlZXhpc3RzIGV4aXN0cworICAgICAgICAgIGZfZXF1YWwgcmVmaW5lIGluc3RhbnRpYXRlIHJldmVydCBzaW1wbAorICAgICAgICAgIHNwZWNpYWxpemUgZ2VuZXJhbGl6ZSBkZXBlbmRlbnQgcmVkIGluZHVjdGlvbgorICAgICAgICAgIGJldGEgaW90YSB6ZXRhIGRlbHRhIGV4ZmFsc28gYXV0b3Jld3JpdGUgc2V0b2lkX3Jld3JpdGUKKyAgICAgICAgICBjb21wdXRlIHZtX2NvbXB1dGUgbmF0aXZlX2NvbXB1dGUKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnRhY3RpY2FscworICAgICAgICBAdGFjdGljYWxzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIHJlcGVhdCBmaXJzdCB0cnkKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnRlcm1pbmF0b3JzCisgICAgICAgIEB0ZXJtaW5hdG9ycyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBvbWVnYSBzb2x2ZSBjb25ncnVlbmNlIHJlZmxleGl2aXR5IGV4YWN0CisgICAgICAgICAgYXNzdW1wdGlvbiBlYXNzdW1wdGlvbgorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYua2V5b3B0cworICAgICAgICBAa2V5b3B0cyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICA6PSA9PiAtPiAvXFwgXFwvIF8gOyA6PiA6CisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5lbmRfc2VudGVuY2UKKyAgICAgICAgQGVuZF9zZW50ZW5jZSB8fD0gUHVuY3R1YXRpb246OkluZGljYXRvcgorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmNsYXNzaWZ5KHgpCisgICAgICAgIGlmIHNlbGYuY29xLmluY2x1ZGU/IHgKKyAgICAgICAgICByZXR1cm4gS2V5d29yZAorICAgICAgICBlbHNpZiBzZWxmLmdhbGxpbmEuaW5jbHVkZT8geAorICAgICAgICAgIHJldHVybiBLZXl3b3JkOjpSZXNlcnZlZAorICAgICAgICBlbHNpZiBzZWxmLmx0YWMuaW5jbHVkZT8geAorICAgICAgICAgIHJldHVybiBLZXl3b3JkOjpQc2V1ZG8KKyAgICAgICAgZWxzaWYgc2VsZi50ZXJtaW5hdG9ycy5pbmNsdWRlPyB4CisgICAgICAgICAgcmV0dXJuIE5hbWU6OkV4Y2VwdGlvbgorICAgICAgICBlbHNpZiBzZWxmLnRhY3RpY2Fscy5pbmNsdWRlPyB4CisgICAgICAgICAgcmV0dXJuIEtleXdvcmQ6OlBzZXVkbworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIE5hbWU6OkNvbnN0YW50CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIG9wZXJhdG9yID0gJXIoW1xbXF07LHt9XygpISQlJiorLi86PD0+P0BefH4jLV0rKQorICAgICAgaWQgPSAvKD86W2Etel1bXHcnXSopfCg/OltfYS16XVtcdyddKykvaQorICAgICAgZG90X2lkID0gL1wuKCg/OlthLXpdW1x3J10qKXwoPzpbX2Etel1bXHcnXSspKS9pCisgICAgICBkb3Rfc3BhY2UgPSAvXC4oXHMrKS8KKyAgICAgIG1vZHVsZV90eXBlID0gL01vZHVsZShccyspVHlwZShccyspLworICAgICAgc2V0X29wdGlvbnMgPSAvKFNldHxVbnNldCkoXHMrKShVbml2ZXJzZXxQcmludGluZ3xJbXBsaWNpdHxTdHJpY3QpKFxzKykoUG9seW1vcnBoaXNtfEFsbHxOb3RhdGlvbnN8QXJndW1lbnRzfFVuaXZlcnNlc3xJbXBsaWNpdCkoXHMqKVwuL20KKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvWyhdWypdKD8hWyldKS8sIENvbW1lbnQsIDpjb21tZW50CisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgbW9kdWxlX3R5cGUgZG8gfG18CisgICAgICAgICAgdG9rZW4gS2V5d29yZCAsICdNb2R1bGUnCisgICAgICAgICAgdG9rZW4gVGV4dDo6V2hpdGVzcGFjZSAsIG1bMV0KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkICwgJ1R5cGUnCisgICAgICAgICAgdG9rZW4gVGV4dDo6V2hpdGVzcGFjZSAsIG1bMl0KKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgc2V0X29wdGlvbnMgZG8gfG18CisgICAgICAgICAgdG9rZW4gS2V5d29yZCAsIG1bMV0KKyAgICAgICAgICBpID0gMgorICAgICAgICAgIHdoaWxlIG1baV0gIT0gJycKKyAgICAgICAgICAgIHRva2VuIFRleHQ6OldoaXRlc3BhY2UgLCBtW2ldCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkICwgbVtpKzFdCisgICAgICAgICAgICBpICs9IDIKKyAgICAgICAgICBlbmQKKyAgICAgICAgICB0b2tlbiBzZWxmLmNsYXNzLmVuZF9zZW50ZW5jZSAsICcuJworICAgICAgICBlbmQKKyAgICAgICAgcnVsZSBpZCBkbyB8bXwKKyAgICAgICAgICBAbmFtZSA9IG1bMF0KKyAgICAgICAgICBAY29udGludWUgPSBmYWxzZQorICAgICAgICAgIHB1c2ggOmNvbnRpbnVlX2lkCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC9cL1xcLywgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvXFxcLy8sIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgb3BlcmF0b3IgZG8gfG18CisgICAgICAgICAgbWF0Y2ggPSBtWzBdCisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXlvcHRzLmluY2x1ZGU/IG1hdGNoCisgICAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE9wZXJhdG9yCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLy0/XGRbXGRfXSooLltcZF9dKik/KGVbKy1dP1xkW1xkX10qKS9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL1xkW1xkX10qLywgTnVtOjpJbnRlZ2VyCisKKyAgICAgICAgcnVsZSAvJyg/OihcXFtcXCInbnRiciBdKXwoXFxbMC05XXszfSl8KFxceFxoezJ9KSknLywgU3RyOjpDaGFyCisgICAgICAgIHJ1bGUgLycvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnN0cmluZworICAgICAgICBydWxlIC9bfj9dI3tpZH0vLCBOYW1lOjpWYXJpYWJsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tZW50IGRvCisgICAgICAgIHJ1bGUgL1teKCopXSsvLCBDb21tZW50CisgICAgICAgIHJ1bGUoL1soXVsqXS8pIHsgdG9rZW4gQ29tbWVudDsgcHVzaCB9CisgICAgICAgIHJ1bGUgL1sqXVspXS8sIENvbW1lbnQsIDpwb3AhCisgICAgICAgIHJ1bGUgL1soKildLywgQ29tbWVudAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmcgZG8KKyAgICAgICAgcnVsZSAvW15cXCJdKy8sIFN0cjo6RG91YmxlCisgICAgICAgIG1peGluIDplc2NhcGVfc2VxdWVuY2UKKyAgICAgICAgcnVsZSAvXFxcbi8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29udGludWVfaWQgZG8KKyAgICAgICAgIyB0aGUgc3RyZWFtIHN0YXJ0cyB3aXRoIGFuIGlkIChzdG9yZWQgaW4gQG5hbWUpIGFuZCBjb250aW51ZXMgaGVyZQorICAgICAgICBydWxlIGRvdF9pZCBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBOYW1lOjpOYW1lc3BhY2UgLCBAbmFtZQorICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uICwgJy4nCisgICAgICAgICAgQGNvbnRpbnVlID0gdHJ1ZQorICAgICAgICAgIEBuYW1lID0gbVsxXQorICAgICAgICBlbmQKKyAgICAgICAgcnVsZSBkb3Rfc3BhY2UgZG8gfG18CisgICAgICAgICAgaWYgQGNvbnRpbnVlCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpDb25zdGFudCAsIEBuYW1lCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gc2VsZi5jbGFzcy5jbGFzc2lmeShAbmFtZSkgLCBAbmFtZQorICAgICAgICAgIGVuZAorICAgICAgICAgIHRva2VuIHNlbGYuY2xhc3MuZW5kX3NlbnRlbmNlICwgJy4nCisgICAgICAgICAgdG9rZW4gVGV4dDo6V2hpdGVzcGFjZSAsIG1bMV0KKyAgICAgICAgICBAbmFtZSA9IGZhbHNlCisgICAgICAgICAgQGNvbnRpbnVlID0gZmFsc2UKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC8vIGRvCisgICAgICAgICAgaWYgQGNvbnRpbnVlCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpDb25zdGFudCAsIEBuYW1lCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gc2VsZi5jbGFzcy5jbGFzc2lmeShAbmFtZSkgLCBAbmFtZQorICAgICAgICAgIGVuZAorICAgICAgICAgIEBuYW1lID0gZmFsc2UKKyAgICAgICAgICBAY29udGludWUgPSBmYWxzZQorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY3BwLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY3BwLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjcwYzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jcHAucmIKQEAgLTAsMCArMSw3NyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGxvYWRfbGV4ZXIgJ2MucmInCisKKyAgICBjbGFzcyBDcHAgPCBDCisgICAgICB0aXRsZSAiQysrIgorICAgICAgZGVzYyAiVGhlIEMrKyBwcm9ncmFtbWluZyBsYW5ndWFnZSIKKworICAgICAgdGFnICdjcHAnCisgICAgICBhbGlhc2VzICdjKysnCisgICAgICAjIHRoZSBtYW55IHZhcmllZCBmaWxlbmFtZXMgb2YgYysrIHNvdXJjZSBmaWxlcy4uLgorICAgICAgZmlsZW5hbWVzICcqLmNwcCcsICcqLmhwcCcsCisgICAgICAgICAgICAgICAgJyouYysrJywgJyouaCsrJywKKyAgICAgICAgICAgICAgICAnKi5jYycsICAnKi5oaCcsCisgICAgICAgICAgICAgICAgJyouY3h4JywgJyouaHh4JywKKyAgICAgICAgICAgICAgICAnKi5wZGUnLCAnKi5pbm8nCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1jKytoZHInLCAndGV4dC94LWMrK3NyYycKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSBzdXBlciArIFNldC5uZXcoJXcoCisgICAgICAgICAgYXNtIGNhdGNoIGNvbnN0X2Nhc3QgZGVsZXRlIGR5bmFtaWNfY2FzdCBleHBsaWNpdCBleHBvcnQKKyAgICAgICAgICBmcmllbmQgbXV0YWJsZSBuYW1lc3BhY2UgbmV3IG9wZXJhdG9yIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYworICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3QgcmVzdHJpY3Qgc3RhdGljX2Nhc3QgdGVtcGxhdGUgdGhpcyB0aHJvdworICAgICAgICAgIHRocm93cyB0eXBlaWQgdHlwZW5hbWUgdXNpbmcgdmlydHVhbAorCisgICAgICAgICAgYWxpZ25hcyBhbGlnbm9mIGNvbnN0ZXhwciBkZWNsdHlwZSBub2V4Y2VwdCBzdGF0aWNfYXNzZXJ0CisgICAgICAgICAgdGhyZWFkX2xvY2FsIHRyeQorICAgICAgICApKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzX3R5cGUKKyAgICAgICAgQGtleXdvcmRzX3R5cGUgfHw9IHN1cGVyICsgU2V0Lm5ldygldygKKyAgICAgICAgICBib29sCisgICAgICAgICkpCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYucmVzZXJ2ZWQKKyAgICAgICAgQHJlc2VydmVkIHx8PSBzdXBlciArIFNldC5uZXcoJXcoCisgICAgICAgICAgX192aXJ0dWFsX2luaGVyaXRhbmNlIF9fdXVpZG9mIF9fc3VwZXIgX19zaW5nbGVfaW5oZXJpdGFuY2UKKyAgICAgICAgICBfX211bHRpcGxlX2luaGVyaXRhbmNlIF9faW50ZXJmYWNlIF9fZXZlbnQKKyAgICAgICAgKSkKKyAgICAgIGVuZAorCisgICAgICBpZCA9IC9bYS16QS1aX11bYS16QS1aMC05X10qLworCisgICAgICBwcmVwZW5kIDpyb290IGRvCisgICAgICAgICMgT2ZmbG9hZCBDKysgZXh0ZW5zaW9ucywgaHR0cDovL29mZmxvYWQuY29kZXBsYXkuY29tLworICAgICAgICBydWxlIC8oPzpfX29mZmxvYWR8X19ibG9ja2luZ29mZmxvYWR8X19vdXRlcilcYi8sIEtleXdvcmQ6OlBzZXVkbworICAgICAgZW5kCisKKyAgICAgICMgZGlnaXRzIHdpdGggb3B0aW9uYWwgaW5uZXIgcXVvdGVzCisgICAgICAjIHNlZSB3d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTMvbjM3ODEucGRmCisgICAgICBkcSA9IC9cZCgnP1xkKSovCisKKyAgICAgIHByZXBlbmQgOnN0YXRlbWVudHMgZG8KKyAgICAgICAgcnVsZSAvY2xhc3NcYi8sIEtleXdvcmQsIDpjbGFzc25hbWUKKyAgICAgICAgcnVsZSAlcigoI3tkcX1bLl0je2RxfT98Wy5dI3tkcX0pKGVbKy1dPyN7ZHF9W2x1XSopPylpLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgJXIoI3tkcX1lWystXT8je2RxfVtsdV0qKWksIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvMHhcaCgnP1xoKSpbbHVdKi9pLCBOdW06OkhleAorICAgICAgICBydWxlIC8wWzAtN10oJz9bMC03XSkqW2x1XSovaSwgTnVtOjpPY3QKKyAgICAgICAgcnVsZSAvI3tkcX1bbHVdKi9pLCBOdW06OkludGVnZXIKKyAgICAgICAgcnVsZSAvXGJudWxscHRyXGIvLCBOYW1lOjpCdWlsdGluCisgICAgICAgIHJ1bGUgLyg/OnU4fHV8VXxMKT9SIihbYS16QS1aMC05X3t9XFtcXSM8PiU6Oy4/KlwrXC1cL1xeJnx+IT0sIiddeywxNn0pXCguKj9cKVwxIi9tLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y2xhc3NuYW1lIGRvCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OkNsYXNzLCA6cG9wIQorCisgICAgICAgICMgdGVtcGxhdGUgc3BlY2lmaWNhdGlvbgorICAgICAgICBydWxlIC9ccyooPz0+KS9tLCBUZXh0LCA6cG9wIQorICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jc2hhcnAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9jc2hhcnAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlYzA0YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2NzaGFycC5yYgpAQCAtMCwwICsxLDk1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgQ1NoYXJwIDwgUmVnZXhMZXhlcgorICAgICAgdGFnICdjc2hhcnAnCisgICAgICBhbGlhc2VzICdjIycsICdjcycKKyAgICAgIGZpbGVuYW1lcyAnKi5jcycKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LWNzaGFycCcKKworICAgICAgdGl0bGUgIkMjIgorICAgICAgZGVzYyAnYSBtdWx0aS1wYXJhZGlnbSBsYW5ndWFnZSB0YXJnZXRpbmcgLk5FVCcKKworICAgICAgIyBUT0RPOiBzdXBwb3J0IG1vcmUgb2YgdW5pY29kZQorICAgICAgaWQgPSAvQD9bX2Etel1cdyovaQorCisgICAgICAjUmVzZXJ2ZWQgSWRlbnRpZmllcnMKKyAgICAgICNDb250ZXh0dWFsIEtleXdvcmRzCisgICAgICAjTElOUSBRdWVyeSBFeHByZXNzaW9ucworICAgICAga2V5d29yZHMgPSAldygKKyAgICAgICAgYWJzdHJhY3QgYXMgYmFzZSBicmVhayBjYXNlIGNhdGNoIGNoZWNrZWQgY29uc3QgY29udGludWUKKyAgICAgICAgZGVmYXVsdCBkZWxlZ2F0ZSBkbyBlbHNlIGVudW0gZXZlbnQgZXhwbGljaXQgZXh0ZXJuIGZhbHNlCisgICAgICAgIGZpbmFsbHkgZml4ZWQgZm9yIGZvcmVhY2ggZ290byBpZiBpbXBsaWNpdCBpbiBpbnRlcmZhY2UKKyAgICAgICAgaW50ZXJuYWwgaXMgbG9jayBuZXcgbnVsbCBvcGVyYXRvciBvdXQgb3ZlcnJpZGUgcGFyYW1zIHByaXZhdGUKKyAgICAgICAgcHJvdGVjdGVkIHB1YmxpYyByZWFkb25seSByZWYgcmV0dXJuIHNlYWxlZCBzaXplb2Ygc3RhY2thbGxvYworICAgICAgICBzdGF0aWMgc3dpdGNoIHRoaXMgdGhyb3cgdHJ1ZSB0cnkgdHlwZW9mIHVuY2hlY2tlZCB1bnNhZmUKKyAgICAgICAgdmlydHVhbCB2b2lkIHZvbGF0aWxlIHdoaWxlCisgICAgICAgIGFkZCBhbGlhcyBhc3luYyBhd2FpdCBnZXQgZ2xvYmFsIHBhcnRpYWwgcmVtb3ZlIHNldCB2YWx1ZSB3aGVyZQorICAgICAgICB5aWVsZAorICAgICAgICBhc2NlbmRpbmcgYnkgZGVzY2VuZGluZyBlcXVhbHMgZnJvbSBncm91cCBpbiBpbnRvIGpvaW4gbGV0IG9uCisgICAgICAgIG9yZGVyYnkgc2VsZWN0CisgICAgICApCisKKyAgICAgIGtleXdvcmRzX3R5cGUgPSAldygKKyAgICAgICAgYm9vbCBieXRlIGNoYXIgZGVjaW1hbCBkb3VibGUgZHluYW1pYyBmbG9hdCBpbnQgbG9uZyBvYmplY3QKKyAgICAgICAgc2J5dGUgc2hvcnQgc3RyaW5nIHVpbnQgdWxvbmcgdXNob3J0IHZhcgorICAgICAgKQorCisgICAgICBjcHBfa2V5d29yZHMgPSAldygKKyAgICAgICAgaWYgZW5kaWYgZWxzZSBlbGlmIGRlZmluZSB1bmRlZiBsaW5lIGVycm9yIHdhcm5pbmcgcmVnaW9uCisgICAgICAgIGVuZHJlZ2lvbiBwcmFnbWEKKyAgICAgICkKKworICAgICAgc3RhdGUgOndoaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgcnVsZSAlcigvLy4qP1xuKSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgJXIoL1sqXS4qP1sqXS8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKworICAgICAgICBydWxlIC9eXHMqXFsuKj9cXS8sIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICAjIHJ1bGUgL1skXVxzKiIvLCBTdHIsIDpzcGxpY2Vfc3RyaW5nCisgICAgICAgICMgcnVsZSAvWyRdXHMqPCMvLCBTdHIsIDpzcGxpY2VfcmVjc3RyaW5nCisgICAgICAgICMgcnVsZSAvPCMvLCBTdHIsIDpyZWNzdHJpbmcKKworICAgICAgICBydWxlIC8oPFxbKVxzKigje2lkfTopPy8sIEtleXdvcmQKKyAgICAgICAgcnVsZSAvXF0+LywgS2V5d29yZAorCisgICAgICAgIHJ1bGUgL1t+ISVeJiooKSs9fFxbXF17fTo7LC48PlwvPy1dLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvQCIoXFwufC4pKj8iLywgU3RyCisgICAgICAgIHJ1bGUgLyIoXFwufC4pKj9bIlxuXS8sIFN0cgorICAgICAgICBydWxlIC8nKFxcLnwuKScvLCBTdHI6OkNoYXIKKyAgICAgICAgcnVsZSAvMHhbMC05YS1mXStbbHVdPy9pLCBOdW0KKyAgICAgICAgcnVsZSAlcigKKyAgICAgICAgICBbMC05XQorICAgICAgICAgIChbLl1bMC05XSopPyAjIGRlY2ltYWwKKyAgICAgICAgICAoZVsrLV1bMC05XSspPyAjIGV4cG9uZW50CisgICAgICAgICAgW2ZsZHVdPyAjIHR5cGUKKyAgICAgICAgKWl4LCBOdW0KKyAgICAgICAgcnVsZSAvXiNbIFx0XSooI3tjcHBfa2V5d29yZHMuam9pbignfCcpfSlcYi4qP1xuLywKKyAgICAgICAgICBDb21tZW50OjpQcmVwcm9jCisgICAgICAgIHJ1bGUgL1xiKCN7a2V5d29yZHMuam9pbignfCcpfSlcYi8sIEtleXdvcmQKKyAgICAgICAgcnVsZSAvXGIoI3trZXl3b3Jkc190eXBlLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkOjpUeXBlCisgICAgICAgIHJ1bGUgL2NsYXNzfHN0cnVjdC8sIEtleXdvcmQsIDpjbGFzcworICAgICAgICBydWxlIC9uYW1lc3BhY2V8dXNpbmcvLCBLZXl3b3JkLCA6bmFtZXNwYWNlCisgICAgICAgIHJ1bGUgLyN7aWR9KD89XHMqWyhdKS8sIE5hbWU6OkZ1bmN0aW9uCisgICAgICAgIHJ1bGUgaWQsIE5hbWUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y2xhc3MgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSBpZCwgTmFtZTo6Q2xhc3MsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm5hbWVzcGFjZSBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgICBydWxlIC8oPz1bKF0pLywgVGV4dCwgOnBvcCEKKyAgICAgICAgcnVsZSAvKCN7aWR9fFsuXSkrLywgTmFtZTo6TmFtZXNwYWNlLCA6cG9wIQorICAgICAgZW5kCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2Nzcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2Nzcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjg2MDkzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvY3NzLnJiCkBAIC0wLDAgKzEsMjczIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgQ1NTIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkNTUyIKKyAgICAgIGRlc2MgIkNhc2NhZGluZyBTdHlsZSBTaGVldHMsIHVzZWQgdG8gc3R5bGUgd2ViIHBhZ2VzIgorCisgICAgICB0YWcgJ2NzcycKKyAgICAgIGZpbGVuYW1lcyAnKi5jc3MnCisgICAgICBtaW1ldHlwZXMgJ3RleHQvY3NzJworCisgICAgICBpZGVudGlmaWVyID0gL1thLXpBLVowLTlfLV0rLworICAgICAgbnVtYmVyID0gLy0/KD86WzAtOV0rKFwuWzAtOV0rKT98XC5bMC05XSspLworCisgICAgICBkZWYgc2VsZi5hdHRyaWJ1dGVzCisgICAgICAgIEBhdHRyaWJ1dGVzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGFsaWduLWNvbnRlbnQgYWxpZ24taXRlbXMgYWxpZ24tc2VsZiBhbGlnbm1lbnQtYWRqdXN0CisgICAgICAgICAgYWxpZ25tZW50LWJhc2VsaW5lIGFsbCBhbmNob3ItcG9pbnQgYW5pbWF0aW9uCisgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5IGFuaW1hdGlvbi1kaXJlY3Rpb24gYW5pbWF0aW9uLWR1cmF0aW9uCisgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZSBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50IGFuaW1hdGlvbi1uYW1lCisgICAgICAgICAgYW5pbWF0aW9uLXBsYXktc3RhdGUgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiBhcHBlYXJhbmNlCisgICAgICAgICAgYXppbXV0aCBiYWNrZmFjZS12aXNpYmlsaXR5IGJhY2tncm91bmQgYmFja2dyb3VuZC1hdHRhY2htZW50CisgICAgICAgICAgYmFja2dyb3VuZC1jbGlwIGJhY2tncm91bmQtY29sb3IgYmFja2dyb3VuZC1pbWFnZQorICAgICAgICAgIGJhY2tncm91bmQtb3JpZ2luIGJhY2tncm91bmQtcG9zaXRpb24gYmFja2dyb3VuZC1yZXBlYXQKKyAgICAgICAgICBiYWNrZ3JvdW5kLXNpemUgYmFzZWxpbmUtc2hpZnQgYmluZGluZyBibGVlZCBib29rbWFyay1sYWJlbAorICAgICAgICAgIGJvb2ttYXJrLWxldmVsIGJvb2ttYXJrLXN0YXRlIGJvb2ttYXJrLXRhcmdldCBib3JkZXIKKyAgICAgICAgICBib3JkZXItYm90dG9tIGJvcmRlci1ib3R0b20tY29sb3IgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cworICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIGJvcmRlci1ib3R0b20tc3R5bGUKKyAgICAgICAgICBib3JkZXItYm90dG9tLXdpZHRoIGJvcmRlci1jb2xsYXBzZSBib3JkZXItY29sb3IKKyAgICAgICAgICBib3JkZXItaW1hZ2UgYm9yZGVyLWltYWdlLW91dHNldCBib3JkZXItaW1hZ2UtcmVwZWF0CisgICAgICAgICAgYm9yZGVyLWltYWdlLXNsaWNlIGJvcmRlci1pbWFnZS1zb3VyY2UgYm9yZGVyLWltYWdlLXdpZHRoCisgICAgICAgICAgYm9yZGVyLWxlZnQgYm9yZGVyLWxlZnQtY29sb3IgYm9yZGVyLWxlZnQtc3R5bGUKKyAgICAgICAgICBib3JkZXItbGVmdC13aWR0aCBib3JkZXItcmFkaXVzIGJvcmRlci1yaWdodAorICAgICAgICAgIGJvcmRlci1yaWdodC1jb2xvciBib3JkZXItcmlnaHQtc3R5bGUgYm9yZGVyLXJpZ2h0LXdpZHRoCisgICAgICAgICAgYm9yZGVyLXNwYWNpbmcgYm9yZGVyLXN0eWxlIGJvcmRlci10b3AgYm9yZGVyLXRvcC1jb2xvcgorICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXMgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMKKyAgICAgICAgICBib3JkZXItdG9wLXN0eWxlIGJvcmRlci10b3Atd2lkdGggYm9yZGVyLXdpZHRoIGJvdHRvbQorICAgICAgICAgIGJveC1hbGlnbiBib3gtZGVjb3JhdGlvbi1icmVhayBib3gtZGlyZWN0aW9uIGJveC1mbGV4CisgICAgICAgICAgYm94LWZsZXgtZ3JvdXAgYm94LWxpbmVzIGJveC1vcmRpbmFsLWdyb3VwIGJveC1vcmllbnQKKyAgICAgICAgICBib3gtcGFjayBib3gtc2hhZG93IGJveC1zaXppbmcgYnJlYWstYWZ0ZXIgYnJlYWstYmVmb3JlCisgICAgICAgICAgYnJlYWstaW5zaWRlIGNhcHRpb24tc2lkZSBjbGVhciBjbGlwIGNsaXAtcGF0aAorICAgICAgICAgIGNsaXAtcnVsZSBjb2xvciBjb2xvci1wcm9maWxlIGNvbHVtbnMgY29sdW1uLWNvdW50CisgICAgICAgICAgY29sdW1uLWZpbGwgY29sdW1uLWdhcCBjb2x1bW4tcnVsZSBjb2x1bW4tcnVsZS1jb2xvcgorICAgICAgICAgIGNvbHVtbi1ydWxlLXN0eWxlIGNvbHVtbi1ydWxlLXdpZHRoIGNvbHVtbi1zcGFuCisgICAgICAgICAgY29sdW1uLXdpZHRoIGNvbnRlbnQgY291bnRlci1pbmNyZW1lbnQgY291bnRlci1yZXNldAorICAgICAgICAgIGNyb3AgY3VlIGN1ZS1hZnRlciBjdWUtYmVmb3JlIGN1cnNvciBkaXJlY3Rpb24gZGlzcGxheQorICAgICAgICAgIGRvbWluYW50LWJhc2VsaW5lIGRyb3AtaW5pdGlhbC1hZnRlci1hZGp1c3QKKyAgICAgICAgICBkcm9wLWluaXRpYWwtYWZ0ZXItYWxpZ24gZHJvcC1pbml0aWFsLWJlZm9yZS1hZGp1c3QKKyAgICAgICAgICBkcm9wLWluaXRpYWwtYmVmb3JlLWFsaWduIGRyb3AtaW5pdGlhbC1zaXplCisgICAgICAgICAgZHJvcC1pbml0aWFsLXZhbHVlIGVsZXZhdGlvbiBlbXB0eS1jZWxscyBmaWx0ZXIgZml0CisgICAgICAgICAgZml0LXBvc2l0aW9uIGZsZXggZmxleC1iYXNpcyBmbGV4LWRpcmVjdGlvbiBmbGV4LWZsb3cKKyAgICAgICAgICBmbGV4LWdyb3cgZmxleC1zaHJpbmsgZmxleC13cmFwIGZsb2F0IGZsb2F0LW9mZnNldAorICAgICAgICAgIGZvbnQgZm9udC1mYW1pbHkgZm9udC1mZWF0dXJlLXNldHRpbmdzCisgICAgICAgICAgZm9udC1rZXJuaW5nIGZvbnQtbGFuZ3VhZ2Utb3ZlcnJpZGUgZm9udC1zaXplCisgICAgICAgICAgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXN5bnRoZXNpcworICAgICAgICAgIGZvbnQtdmFyaWFudCBmb250LXZhcmlhbnQtYWx0ZXJuYXRlcyBmb250LXZhcmlhbnQtY2FwcworICAgICAgICAgIGZvbnQtdmFyaWFudC1lYXN0LWFzaWFuIGZvbnQtdmFyaWFudC1saWdhdHVyZXMKKyAgICAgICAgICBmb250LXZhcmlhbnQtbnVtZXJpYyBmb250LXZhcmlhbnQtcG9zaXRpb24gZm9udC13ZWlnaHQKKyAgICAgICAgICBncmlkLWNlbGwgZ3JpZC1jb2x1bW4gZ3JpZC1jb2x1bW4tYWxpZ24gZ3JpZC1jb2x1bW4tc2l6aW5nCisgICAgICAgICAgZ3JpZC1jb2x1bW4tc3BhbiBncmlkLWNvbHVtbnMgZ3JpZC1mbG93IGdyaWQtcm93CisgICAgICAgICAgZ3JpZC1yb3ctYWxpZ24gZ3JpZC1yb3ctc2l6aW5nIGdyaWQtcm93LXNwYW4KKyAgICAgICAgICBncmlkLXJvd3MgZ3JpZC10ZW1wbGF0ZSBoYW5naW5nLXB1bmN0dWF0aW9uIGhlaWdodAorICAgICAgICAgIGh5cGhlbmF0ZS1hZnRlciBoeXBoZW5hdGUtYmVmb3JlIGh5cGhlbmF0ZS1jaGFyYWN0ZXIKKyAgICAgICAgICBoeXBoZW5hdGUtbGluZXMgaHlwaGVuYXRlLXJlc291cmNlIGh5cGhlbnMgaWNvbgorICAgICAgICAgIGltYWdlLW9yaWVudGF0aW9uIGltYWdlLXJlbmRlcmluZyBpbWFnZS1yZXNvbHV0aW9uCisgICAgICAgICAgaW1lLW1vZGUgaW5saW5lLWJveC1hbGlnbiBqdXN0aWZ5LWNvbnRlbnQKKyAgICAgICAgICBsZWZ0IGxldHRlci1zcGFjaW5nIGxpbmUtYnJlYWsgbGluZS1oZWlnaHQKKyAgICAgICAgICBsaW5lLXN0YWNraW5nIGxpbmUtc3RhY2tpbmctcnVieSBsaW5lLXN0YWNraW5nLXNoaWZ0CisgICAgICAgICAgbGluZS1zdGFja2luZy1zdHJhdGVneSBsaXN0LXN0eWxlIGxpc3Qtc3R5bGUtaW1hZ2UKKyAgICAgICAgICBsaXN0LXN0eWxlLXBvc2l0aW9uIGxpc3Qtc3R5bGUtdHlwZSBtYXJnaW4KKyAgICAgICAgICBtYXJnaW4tYm90dG9tIG1hcmdpbi1sZWZ0IG1hcmdpbi1yaWdodCBtYXJnaW4tdG9wCisgICAgICAgICAgbWFyayBtYXJrZXItb2Zmc2V0IG1hcmtzIG1hcmstYWZ0ZXIgbWFyay1iZWZvcmUKKyAgICAgICAgICBtYXJxdWVlLWRpcmVjdGlvbiBtYXJxdWVlLWxvb3AgbWFycXVlZS1wbGF5LWNvdW50CisgICAgICAgICAgbWFycXVlZS1zcGVlZCBtYXJxdWVlLXN0eWxlIG1hc2sgbWF4LWhlaWdodCBtYXgtd2lkdGgKKyAgICAgICAgICBtaW4taGVpZ2h0IG1pbi13aWR0aCBtb3ZlLXRvIG5hdi1kb3duCisgICAgICAgICAgbmF2LWluZGV4IG5hdi1sZWZ0IG5hdi1yaWdodCBuYXYtdXAgb2JqZWN0LWZpdAorICAgICAgICAgIG9iamVjdC1wb3NpdGlvbiBvcGFjaXR5IG9yZGVyIG9ycGhhbnMgb3V0bGluZQorICAgICAgICAgIG91dGxpbmUtY29sb3Igb3V0bGluZS1vZmZzZXQgb3V0bGluZS1zdHlsZQorICAgICAgICAgIG91dGxpbmUtd2lkdGggb3ZlcmZsb3cgb3ZlcmZsb3ctc3R5bGUgb3ZlcmZsb3ctd3JhcAorICAgICAgICAgIG92ZXJmbG93LXggb3ZlcmZsb3cteSBwYWRkaW5nIHBhZGRpbmctYm90dG9tCisgICAgICAgICAgcGFkZGluZy1sZWZ0IHBhZGRpbmctcmlnaHQgcGFkZGluZy10b3AKKyAgICAgICAgICBwYWdlIHBhZ2UtYnJlYWstYWZ0ZXIgcGFnZS1icmVhay1iZWZvcmUKKyAgICAgICAgICBwYWdlLWJyZWFrLWluc2lkZSBwYWdlLXBvbGljeSBwYXVzZSBwYXVzZS1hZnRlcgorICAgICAgICAgIHBhdXNlLWJlZm9yZSBwZXJzcGVjdGl2ZSBwZXJzcGVjdGl2ZS1vcmlnaW4KKyAgICAgICAgICBwaG9uZW1lcyBwaXRjaCBwaXRjaC1yYW5nZSBwbGF5LWR1cmluZyBwb2ludGVyLWV2ZW50cworICAgICAgICAgIHBvc2l0aW9uIHByZXNlbnRhdGlvbi1sZXZlbCBwdW5jdHVhdGlvbi10cmltIHF1b3RlcworICAgICAgICAgIHJlbmRlcmluZy1pbnRlbnQgcmVzaXplIHJlc3QgcmVzdC1hZnRlciByZXN0LWJlZm9yZQorICAgICAgICAgIHJpY2huZXNzIHJpZ2h0IHJvdGF0aW9uIHJvdGF0aW9uLXBvaW50IHJ1YnktYWxpZ24KKyAgICAgICAgICBydWJ5LW92ZXJoYW5nIHJ1YnktcG9zaXRpb24gcnVieS1zcGFuIHNpemUgc3BlYWsKKyAgICAgICAgICBzcGVhay1hcyBzcGVhay1oZWFkZXIgc3BlYWstbnVtZXJhbCBzcGVhay1wdW5jdHVhdGlvbgorICAgICAgICAgIHNwZWVjaC1yYXRlIHNyYyBzdHJlc3Mgc3RyaW5nLXNldAorICAgICAgICAgIHRhYi1zaXplIHRhYmxlLWxheW91dCB0YXJnZXQgdGFyZ2V0LW5hbWUKKyAgICAgICAgICB0YXJnZXQtbmV3IHRhcmdldC1wb3NpdGlvbiB0ZXh0LWFsaWduCisgICAgICAgICAgdGV4dC1hbGlnbi1sYXN0IHRleHQtY29tYmluZS1ob3Jpem9udGFsCisgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uIHRleHQtZGVjb3JhdGlvbi1jb2xvcgorICAgICAgICAgIHRleHQtZGVjb3JhdGlvbi1saW5lIHRleHQtZGVjb3JhdGlvbi1za2lwCisgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uLXN0eWxlIHRleHQtZW1waGFzaXMKKyAgICAgICAgICB0ZXh0LWVtcGhhc2lzLWNvbG9yIHRleHQtZW1waGFzaXMtcG9zaXRpb24KKyAgICAgICAgICB0ZXh0LWVtcGhhc2lzLXN0eWxlIHRleHQtaGVpZ2h0IHRleHQtaW5kZW50CisgICAgICAgICAgdGV4dC1qdXN0aWZ5IHRleHQtb3JpZW50YXRpb24gdGV4dC1vdXRsaW5lCisgICAgICAgICAgdGV4dC1vdmVyZmxvdyB0ZXh0LXJlbmRlcmluZyB0ZXh0LXNoYWRvdworICAgICAgICAgIHRleHQtc3BhY2UtY29sbGFwc2UgdGV4dC10cmFuc2Zvcm0KKyAgICAgICAgICB0ZXh0LXVuZGVybGluZS1wb3NpdGlvbiB0ZXh0LXdyYXAgdG9wCisgICAgICAgICAgdHJhbnNmb3JtIHRyYW5zZm9ybS1vcmlnaW4gdHJhbnNmb3JtLXN0eWxlCisgICAgICAgICAgdHJhbnNpdGlvbiB0cmFuc2l0aW9uLWRlbGF5IHRyYW5zaXRpb24tZHVyYXRpb24KKyAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5IHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uCisgICAgICAgICAgdW5pY29kZS1iaWRpIHZlcnRpY2FsLWFsaWduCisgICAgICAgICAgdmlzaWJpbGl0eSB2b2ljZS1iYWxhbmNlIHZvaWNlLWR1cmF0aW9uCisgICAgICAgICAgdm9pY2UtZmFtaWx5IHZvaWNlLXBpdGNoIHZvaWNlLXBpdGNoLXJhbmdlCisgICAgICAgICAgdm9pY2UtcmFuZ2Ugdm9pY2UtcmF0ZSB2b2ljZS1zdHJlc3Mgdm9pY2Utdm9sdW1lCisgICAgICAgICAgdm9sdW1lIHdoaXRlLXNwYWNlIHdpZG93cyB3aWR0aCB3b3JkLWJyZWFrCisgICAgICAgICAgd29yZC1zcGFjaW5nIHdvcmQtd3JhcCB3cml0aW5nLW1vZGUgei1pbmRleAorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGFib3ZlIGFic29sdXRlIGFsd2F5cyBhcm1lbmlhbiBhdXJhbCBhdXRvIGF2b2lkIGxlZnQgYm90dG9tCisgICAgICAgICAgYmFzZWxpbmUgYmVoaW5kIGJlbG93IGJpZGktb3ZlcnJpZGUgYmxpbmsgYmxvY2sgYm9sZCBib2xkZXIKKyAgICAgICAgICBib3RoIGJvdHRvbSBjYXBpdGFsaXplIGNlbnRlciBjZW50ZXItbGVmdCBjZW50ZXItcmlnaHQgY2lyY2xlCisgICAgICAgICAgY2prLWlkZW9ncmFwaGljIGNsb3NlLXF1b3RlIGNvbGxhcHNlIGNvbmRlbnNlZCBjb250aW51b3VzIGNyb3AKKyAgICAgICAgICBjcm9zcyBjcm9zc2hhaXIgY3Vyc2l2ZSBkYXNoZWQgZGVjaW1hbCBkZWNpbWFsLWxlYWRpbmctemVybworICAgICAgICAgIGRlZmF1bHQgZGlnaXRzIGRpc2MgZG90dGVkIGRvdWJsZSBlLXJlc2l6ZSBlbWJlZCBleHBhbmRlZAorICAgICAgICAgIGV4dHJhLWNvbmRlbnNlZCBleHRyYS1leHBhbmRlZCBmYW50YXN5IGZhci1sZWZ0IGZhci1yaWdodCBmYXN0CisgICAgICAgICAgZmFzdGVyIGZpeGVkIGdlb3JnaWFuIGdyb292ZSBoZWJyZXcgaGVscCBoaWRkZW4gaGlkZSBoaWdoIGhpZ2hlcgorICAgICAgICAgIGhpcmFnYW5hIGhpcmFnYW5hLWlyb2hhIGljb24gaW5oZXJpdCBpbmxpbmUgaW5saW5lLXRhYmxlIGluc2V0CisgICAgICAgICAgaW5zaWRlIGludmVydCBpdGFsaWMganVzdGlmeSBrYXRha2FuYSBrYXRha2FuYS1pcm9oYSBsYW5kc2NhcGUKKyAgICAgICAgICBsYXJnZSBsYXJnZXIgbGVmdCBsZWZ0LXNpZGUgbGVmdHdhcmRzIGxldmVsIGxpZ2h0ZXIgbGluZS10aHJvdWdoCisgICAgICAgICAgbGlzdC1pdGVtIGxvdWQgbG93IGxvd2VyIGxvd2VyLWFscGhhIGxvd2VyLWdyZWVrIGxvd2VyLXJvbWFuCisgICAgICAgICAgbG93ZXJjYXNlIGx0ciBtZWRpdW0gbWVzc2FnZS1ib3ggbWlkZGxlIG1peCBtb25vc3BhY2Ugbi1yZXNpemUKKyAgICAgICAgICBuYXJyb3dlciBuZS1yZXNpemUgbm8tY2xvc2UtcXVvdGUgbm8tb3Blbi1xdW90ZSBuby1yZXBlYXQgbm9uZQorICAgICAgICAgIG5vcm1hbCBub3dyYXAgbnctcmVzaXplIG9ibGlxdWUgb25jZSBvcGVuLXF1b3RlIG91dHNldCBvdXRzaWRlCisgICAgICAgICAgb3ZlcmxpbmUgcG9pbnRlciBwb3J0cmFpdCBweCByZWxhdGl2ZSByZXBlYXQgcmVwZWF0LXggcmVwZWF0LXkKKyAgICAgICAgICByZ2IgcmlkZ2UgcmlnaHQgcmlnaHQtc2lkZSByaWdodHdhcmRzIHMtcmVzaXplIHNhbnMtc2VyaWYgc2Nyb2xsCisgICAgICAgICAgc2UtcmVzaXplIHNlbWktY29uZGVuc2VkIHNlbWktZXhwYW5kZWQgc2VwYXJhdGUgc2VyaWYgc2hvdworICAgICAgICAgIHNpbGVudCBzbG93IHNsb3dlciBzbWFsbC1jYXBzIHNtYWxsLWNhcHRpb24gc21hbGxlciBzb2Z0IHNvbGlkCisgICAgICAgICAgc3BlbGwtb3V0IHNxdWFyZSBzdGF0aWMgc3RhdHVzLWJhciBzdXBlciBzdy1yZXNpemUgdGFibGUtY2FwdGlvbgorICAgICAgICAgIHRhYmxlLWNlbGwgdGFibGUtY29sdW1uIHRhYmxlLWNvbHVtbi1ncm91cCB0YWJsZS1mb290ZXItZ3JvdXAKKyAgICAgICAgICB0YWJsZS1oZWFkZXItZ3JvdXAgdGFibGUtcm93IHRhYmxlLXJvdy1ncm91cCB0ZXh0IHRleHQtYm90dG9tCisgICAgICAgICAgdGV4dC10b3AgdGhpY2sgdGhpbiB0b3AgdHJhbnNwYXJlbnQgdWx0cmEtY29uZGVuc2VkCisgICAgICAgICAgdWx0cmEtZXhwYW5kZWQgdW5kZXJsaW5lIHVwcGVyLWFscGhhIHVwcGVyLWxhdGluIHVwcGVyLXJvbWFuCisgICAgICAgICAgdXBwZXJjYXNlIHVybCB2aXNpYmxlIHctcmVzaXplIHdhaXQgd2lkZXIgeC1mYXN0IHgtaGlnaCB4LWxhcmdlCisgICAgICAgICAgeC1sb3VkIHgtbG93IHgtc21hbGwgeC1zb2Z0IHh4LWxhcmdlIHh4LXNtYWxsIHllcworICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29uc3RhbnRzCisgICAgICAgIEBjb25zdGFudHMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgaW5kaWdvIGdvbGQgZmlyZWJyaWNrIGluZGlhbnJlZCB5ZWxsb3cgZGFya29saXZlZ3JlZW4KKyAgICAgICAgICBkYXJrc2VhZ3JlZW4gbWVkaXVtdmlvbGV0cmVkIG1lZGl1bW9yY2hpZCBjaGFydHJldXNlCisgICAgICAgICAgbWVkaXVtc2xhdGVibHVlIGJsYWNrIHNwcmluZ2dyZWVuIGNyaW1zb24gbGlnaHRzYWxtb24gYnJvd24KKyAgICAgICAgICB0dXJxdW9pc2Ugb2xpdmVkcmFiIGN5YW4gc2lsdmVyIHNreWJsdWUgZ3JheSBkYXJrdHVycXVvaXNlCisgICAgICAgICAgZ29sZGVucm9kIGRhcmtncmVlbiBkYXJrdmlvbGV0IGRhcmtncmF5IGxpZ2h0cGluayB0ZWFsCisgICAgICAgICAgZGFya21hZ2VudGEgbGlnaHRnb2xkZW5yb2R5ZWxsb3cgbGF2ZW5kZXIgeWVsbG93Z3JlZW4gdGhpc3RsZQorICAgICAgICAgIHZpb2xldCBuYXZ5IG9yY2hpZCBibHVlIGdob3N0d2hpdGUgaG9uZXlkZXcgY29ybmZsb3dlcmJsdWUKKyAgICAgICAgICBkYXJrYmx1ZSBkYXJra2hha2kgbWVkaXVtcHVycGxlIGNvcm5zaWxrIHJlZCBiaXNxdWUgc2xhdGVncmF5CisgICAgICAgICAgZGFya2N5YW4ga2hha2kgd2hlYXQgZGVlcHNreWJsdWUgZGFya3JlZCBzdGVlbGJsdWUgYWxpY2VibHVlCisgICAgICAgICAgZ2FpbnNib3JvIG1lZGl1bXR1cnF1b2lzZSBmbG9yYWx3aGl0ZSBjb3JhbCBwdXJwbGUgbGlnaHRncmV5CisgICAgICAgICAgbGlnaHRjeWFuIGRhcmtzYWxtb24gYmVpZ2UgYXp1cmUgbGlnaHRzdGVlbGJsdWUgb2xkbGFjZQorICAgICAgICAgIGdyZWVueWVsbG93IHJveWFsYmx1ZSBsaWdodHNlYWdyZWVuIG1pc3R5cm9zZSBzaWVubmEgbGlnaHRjb3JhbAorICAgICAgICAgIG9yYW5nZXJlZCBuYXZham93aGl0ZSBsaW1lIHBhbGVncmVlbiBidXJseXdvb2Qgc2Vhc2hlbGwKKyAgICAgICAgICBtZWRpdW1zcHJpbmdncmVlbiBmdWNoc2lhIHBhcGF5YXdoaXAgYmxhbmNoZWRhbG1vbmQgcGVydQorICAgICAgICAgIGFxdWFtYXJpbmUgd2hpdGUgZGFya3NsYXRlZ3JheSBpdm9yeSBkb2RnZXJibHVlIGxlbW9uY2hpZmZvbgorICAgICAgICAgIGNob2NvbGF0ZSBvcmFuZ2UgZm9yZXN0Z3JlZW4gc2xhdGVibHVlIG9saXZlIG1pbnRjcmVhbQorICAgICAgICAgIGFudGlxdWV3aGl0ZSBkYXJrb3JhbmdlIGNhZGV0Ymx1ZSBtb2NjYXNpbiBsaW1lZ3JlZW4gc2FkZGxlYnJvd24KKyAgICAgICAgICBkYXJrc2xhdGVibHVlIGxpZ2h0c2t5Ymx1ZSBkZWVwcGluayBwbHVtIGFxdWEgZGFya2dvbGRlbnJvZAorICAgICAgICAgIG1hcm9vbiBzYW5keWJyb3duIG1hZ2VudGEgdGFuIHJvc3licm93biBwaW5rIGxpZ2h0Ymx1ZQorICAgICAgICAgIHBhbGV2aW9sZXRyZWQgbWVkaXVtc2VhZ3JlZW4gZGltZ3JheSBwb3dkZXJibHVlIHNlYWdyZWVuIHNub3cKKyAgICAgICAgICBtZWRpdW1ibHVlIG1pZG5pZ2h0Ymx1ZSBwYWxldHVycXVvaXNlIHBhbGVnb2xkZW5yb2Qgd2hpdGVzbW9rZQorICAgICAgICAgIGRhcmtvcmNoaWQgc2FsbW9uIGxpZ2h0c2xhdGVncmF5IGxhd25ncmVlbiBsaWdodGdyZWVuIHRvbWF0bworICAgICAgICAgIGhvdHBpbmsgbGlnaHR5ZWxsb3cgbGF2ZW5kZXJibHVzaCBsaW5lbiBtZWRpdW1hcXVhbWFyaW5lIGdyZWVuCisgICAgICAgICAgYmx1ZXZpb2xldCBwZWFjaHB1ZmYKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgICMgc291cmNlOiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmVuZG9yLWtleXdvcmQtaGlzdG9yeQorICAgICAgZGVmIHNlbGYudmVuZG9yX3ByZWZpeGVzCisgICAgICAgIEB2ZW5kb3JfcHJlZml4ZXMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgLWFoLSAtYXRzYy0gLWhwLSAta2h0bWwtIC1tb3otIC1tcy0gLW8tIC1yaW0tIC1yby0gLXRjLSAtd2FwLQorICAgICAgICAgIC13ZWJraXQtIC14di0gbXNvLSBwcmluY2UtCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6YmFzaWNzCisgICAgICAgIHJ1bGUgL3svLCBQdW5jdHVhdGlvbiwgOnN0YW56YQorICAgICAgICBydWxlIC86WzpdPyN7aWRlbnRpZmllcn0vLCBOYW1lOjpEZWNvcmF0b3IKKyAgICAgICAgcnVsZSAvXC4je2lkZW50aWZpZXJ9LywgTmFtZTo6Q2xhc3MKKyAgICAgICAgcnVsZSAvIyN7aWRlbnRpZmllcn0vLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICBydWxlIC9AI3tpZGVudGlmaWVyfS8sIEtleXdvcmQsIDphdF9ydWxlCisgICAgICAgIHJ1bGUgaWRlbnRpZmllciwgTmFtZTo6VGFnCisgICAgICAgIHJ1bGUgJXIoW35eKiElJlxbXF0oKTw+fCs9QDo7LC4vPy1dKSwgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvIihcXFxcfFxcInxbXiJdKSoiLywgU3RyOjpTaW5nbGUKKyAgICAgICAgcnVsZSAvJyhcXFxcfFxcJ3xbXiddKSonLywgU3RyOjpEb3VibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dmFsdWUgZG8KKyAgICAgICAgbWl4aW4gOmJhc2ljcworICAgICAgICBydWxlIC91cmxcKC4qP1wpLywgU3RyOjpPdGhlcgorICAgICAgICBydWxlIC8jWzAtOWEtZl17MSw2fS9pLCBOdW0gIyBjb2xvcnMKKyAgICAgICAgcnVsZSAvI3tudW1iZXJ9KD86JXwoPzplbXxweHxwdHxwY3xpbnxtbXxjbXxleHxyZW18Y2h8dnd8dmh8dm1pbnx2bWF4fGRwaXxkcGNtfGRwcHh8ZGVnfGdyYWR8cmFkfHR1cm58c3xtc3xIenxrSHopXGIpPy8sIE51bQorICAgICAgICBydWxlIC9bXFtcXSgpOlwvLixdLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvIihcXFxcfFxcInxbXiJdKSoiLywgU3RyOjpTaW5nbGUKKyAgICAgICAgcnVsZSAvJyhcXFxcfFxcJ3xbXiddKSonLywgU3RyOjpEb3VibGUKKyAgICAgICAgcnVsZShpZGVudGlmaWVyKSBkbyB8bXwKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmNvbnN0YW50cy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpDb25zdGFudAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuYnVpbHRpbnMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmF0X3J1bGUgZG8KKyAgICAgICAgcnVsZSAveyg/PVxzKiN7aWRlbnRpZmllcn1ccyo6KS9tLCBQdW5jdHVhdGlvbiwgOmF0X3N0YW56YQorICAgICAgICBydWxlIC97LywgUHVuY3R1YXRpb24sIDphdF9ib2R5CisgICAgICAgIHJ1bGUgLzsvLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgICAgbWl4aW4gOnZhbHVlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmF0X2JvZHkgZG8KKyAgICAgICAgbWl4aW4gOmF0X2NvbnRlbnQKKyAgICAgICAgbWl4aW4gOnJvb3QKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YXRfc3RhbnphIGRvCisgICAgICAgIG1peGluIDphdF9jb250ZW50CisgICAgICAgIG1peGluIDpzdGFuemEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YXRfY29udGVudCBkbworICAgICAgICBydWxlIC99LyBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgcG9wISAyCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpiYXNpY3MgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgcnVsZSAlcigvXCooPzouKj8pXCovKW0sIENvbW1lbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RhbnphIGRvCisgICAgICAgIG1peGluIDpiYXNpY3MKKyAgICAgICAgcnVsZSAvfS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBydWxlIC8oI3tpZGVudGlmaWVyfSkoXHMqKSg6KS9tIGRvIHxtfAorICAgICAgICAgIG5hbWVfdG9rID0gaWYgc2VsZi5jbGFzcy5hdHRyaWJ1dGVzLmluY2x1ZGU/IG1bMV0KKyAgICAgICAgICAgIE5hbWU6OkxhYmVsCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy52ZW5kb3JfcHJlZml4ZXMuYW55PyB7IHxwfCBtWzFdLnN0YXJ0X3dpdGg/KHApIH0KKyAgICAgICAgICAgIE5hbWU6OkxhYmVsCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTmFtZTo6UHJvcGVydHkKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIGdyb3VwcyBuYW1lX3RvaywgVGV4dCwgUHVuY3R1YXRpb24KKworICAgICAgICAgIHB1c2ggOnN0YW56YV92YWx1ZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RhbnphX3ZhbHVlIGRvCisgICAgICAgIHJ1bGUgLzsvLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgICAgcnVsZSgvKD89fSkvKSB7IHBvcCEgfQorICAgICAgICBydWxlIC8haW1wb3J0YW50XGIvLCBDb21tZW50OjpQcmVwcm9jCisgICAgICAgIHJ1bGUgL15ALio/JC8sIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgbWl4aW4gOnZhbHVlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9kLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODVlMWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9kLnJiCkBAIC0wLDAgKzEsMTc2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgRCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRhZyAnZCcKKyAgICAgIGFsaWFzZXMgJ2RsYW5nJworICAgICAgZmlsZW5hbWVzICcqLmQnLCAnKi5kaScKKyAgICAgIG1pbWV0eXBlcyAnYXBwbGljYXRpb24veC1kc3JjJywgJ3RleHQveC1kc3JjJworCisgICAgICB0aXRsZSAiRCIKKyAgICAgIGRlc2MgJ1RoZSBEIHByb2dyYW1taW5nIGxhbmd1YWdlKGRsYW5nLm9yZyknCisKKyAgICAgIGtleXdvcmRzID0gJXcoCisgICAgICAgIGFic3RyYWN0IGFsaWFzIGFsaWduIGFzbSBhc3NlcnQgYXV0byBib2R5CisgICAgICAgIGJyZWFrIGNhc2UgY2FzdCBjYXRjaCBjbGFzcyBjb25zdCBjb250aW51ZQorICAgICAgICBkZWJ1ZyBkZWZhdWx0IGRlbGVnYXRlIGRlbGV0ZSBkZXByZWNhdGVkIGRvIGVsc2UKKyAgICAgICAgZW51bSBleHBvcnQgZXh0ZXJuIGZpbmFsbHkgZmluYWwgZm9yZWFjaF9yZXZlcnNlCisgICAgICAgIGZvcmVhY2ggZm9yIGZ1bmN0aW9uIGdvdG8gaWYgaW1tdXRhYmxlIGltcG9ydAorICAgICAgICBpbnRlcmZhY2UgaW52YXJpYW50IGlub3V0IGluIGlzIGxhenkgbWl4aW4KKyAgICAgICAgbW9kdWxlIG5ldyBub3Rocm93IG91dCBvdmVycmlkZSBwYWNrYWdlIHByYWdtYQorICAgICAgICBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgcHVyZSByZWYgcmV0dXJuIHNjb3BlCisgICAgICAgIHNoYXJlZCBzdGF0aWMgc3RydWN0IHN1cGVyIHN3aXRjaCBzeW5jaHJvbml6ZWQKKyAgICAgICAgdGVtcGxhdGUgdGhpcyB0aHJvdyB0cnkgdHlwZWRlZiB0eXBlaWQgdHlwZW9mCisgICAgICAgIHVuaW9uIHVuaXR0ZXN0IHZlcnNpb24gdm9sYXRpbGUgd2hpbGUgd2l0aAorICAgICAgICBfX2dzaGFyZWQgX190cmFpdHMgX192ZWN0b3IgX19wYXJhbWV0ZXJzCisgICAgICApCisKKyAgICAgIGtleXdvcmRzX3R5cGUgPSAldygKKyAgICAgICAgYm9vbCBieXRlIGNkb3VibGUgY2VudCBjZmxvYXQgY2hhciBjcmVhbAorICAgICAgICBkY2hhciBkb3VibGUgZmxvYXQgaWRvdWJsZSBpZmxvYXQgaW50IGlyZWFsCisgICAgICAgIGxvbmcgcmVhbCBzaG9ydCB1Ynl0ZSB1Y2VudCB1aW50IHVsb25nCisgICAgICAgIHVzaG9ydCB2b2lkIHdjaGFyCisgICAgICApCisKKyAgICAgIGtleXdvcmRzX3BzZXVkbyA9ICV3KAorICAgICAgICBfX0ZJTEVfXyBfX01PRFVMRV9fIF9fTElORV9fIF9fRlVOQ1RJT05fXyBfX1BSRVRUWV9GVU5DVElPTl9fCisgICAgICAgICBfX0RBVEVfXyBfX0VPRl9fIF9fVElNRV9fIF9fVElNRVNUQU1QX18gX19WRU5ET1JfXworICAgICAgICBfX1ZFUlNJT05fXworICAgICAgKQorCisgICAgICBzdGF0ZSA6d2hpdGVzcGFjZSBkbworICAgICAgICBydWxlIC9cbi9tLCBUZXh0CisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgIyBDb21tZW50cworICAgICAgICBydWxlICVyKC8vKC4qPylcbiksIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBydWxlICVyKC8oXFxcbik/WypdKC58XG4pKj9bKl0oXFxcbik/LyksIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgICBydWxlICVyKC9cKyksIENvbW1lbnQ6Ok11bHRpbGluZSwgOm5lc3RlZF9jb21tZW50CisgICAgICAgICMgS2V5d29yZHMKKyAgICAgICAgcnVsZSAvKCN7a2V5d29yZHMuam9pbignfCcpfSlcYi8sIEtleXdvcmQKKyAgICAgICAgcnVsZSAvKCN7a2V5d29yZHNfdHlwZS5qb2luKCd8Jyl9KVxiLywgS2V5d29yZDo6VHlwZQorICAgICAgICBydWxlIC8oZmFsc2V8dHJ1ZXxudWxsKVxiLywgS2V5d29yZDo6Q29uc3RhbnQKKyAgICAgICAgcnVsZSAvKCN7a2V5d29yZHNfcHNldWRvLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkOjpQc2V1ZG8KKyAgICAgICAgcnVsZSAvbWFjcm9cYi8sIEtleXdvcmQ6OlJlc2VydmVkCisgICAgICAgIHJ1bGUgLyhzdHJpbmd8d3N0cmluZ3xkc3RyaW5nfHNpemVfdHxwdHJkaWZmX3QpXGIvLCBOYW1lOjpCdWlsdGluCisgICAgICAgICMgTGl0ZXJhbHMKKyAgICAgICAgIyBIZXhGbG9hdAorICAgICAgICBydWxlIC8wW3hYXShbMC05YS1mQS1GX10qXC5bMC05YS1mQS1GX10rfFswLTlhLWZBLUZfXSspW3BQXVsrXC1dP1swLTlfXStbZkZMXT9baV0/LywgTnVtOjpGbG9hdAorICAgICAgICAjIERlY2ltYWxGbG9hdAorICAgICAgICBydWxlIC9bMC05X10rKFwuWzAtOV9dK1tlRV1bK1wtXT9bMC05X10rfFwuWzAtOV9dKnxbZUVdWytcLV0/WzAtOV9dKylbZkZMXT9baV0/LywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9cLigwfFsxLTldWzAtOV9dKikoW2VFXVsrXC1dP1swLTlfXSspP1tmRkxdP1tpXT8vLCBOdW06OkZsb2F0CisgICAgICAgICMgSW50ZWdlckxpdGVyYWwKKyAgICAgICAgIyBCaW5hcnkKKyAgICAgICAgcnVsZSAvMFtCYl1bMDFfXSsvLCBOdW06OkJpbgorICAgICAgICAjIE9jdGFsCisgICAgICAgICMgVE9ETzogMFswLTddIGlzbid0IHN1cHBvcnRlZCB1c2Ugb2N0YWwhWzAtN10gaW5zdGVhZAorICAgICAgICBydWxlIC8wWzAtN19dKy8sIE51bTo6T2N0CisgICAgICAgICMgSGV4YWRlY2ltYWwKKyAgICAgICAgcnVsZSAvMFt4WF1bMC05YS1mQS1GX10rLywgTnVtOjpIZXgKKyAgICAgICAgIyBEZWNpbWFsCisgICAgICAgIHJ1bGUgLygwfFsxLTldWzAtOV9dKikoW0xVdV18THV8TFV8dUx8VUwpPy8sIE51bTo6SW50ZWdlcgorICAgICAgICAjIENoYXJhY3RlckxpdGVyYWwKKyAgICAgICAgcnVsZSAvJyhcXFsnIj9cXGFiZm5ydHZdfFxceFswLTlhLWZBLUZdezJ9fFxcWzAtN117MSwzfXxcXHVbMC05YS1mQS1GXXs0fXxcXFVbMC05YS1mQS1GXXs4fXxcXCZcdys7fC4pJy8sIFN0cjo6Q2hhcgorICAgICAgICAjIFN0cmluZ0xpdGVyYWwKKyAgICAgICAgIyBXeXNpd3lnU3RyaW5nCisgICAgICAgIHJ1bGUgL3IiW14iXSoiW2N3ZF0/LywgU3RyCisgICAgICAgICMgQWx0ZXJuYXRlIFd5c2l3eWdTdHJpbmcKKyAgICAgICAgcnVsZSAvYFteYF0qYFtjd2RdPy8sIFN0cgorICAgICAgICAjIERvdWJsZVF1b3RlZFN0cmluZworICAgICAgICBydWxlIC8iKFxcXFx8XFwifFteIl0pKiJbY3dkXT8vLCBTdHIKKyAgICAgICAgIyBFc2NhcGVTZXF1ZW5jZQorICAgICAgICBydWxlIC9cXChbJ1wiP1xcYWJmbnJ0dl18eFswLTlhLWZBLUZdezJ9fFswLTddezEsM318dVswLTlhLWZBLUZdezR9fFVbMC05YS1mQS1GXXs4fXwmXHcrOykvLCBTdHIKKyAgICAgICAgIyBIZXhTdHJpbmcKKyAgICAgICAgcnVsZSAveCJbMC05YS1mQS1GX1xzXSoiW2N3ZF0/LywgU3RyCisgICAgICAgICMgRGVsaW1pdGVkU3RyaW5nCisgICAgICAgIHJ1bGUgL3EiXFsvLCBTdHIsIDpkZWxpbWl0ZWRfYnJhY2tldAorICAgICAgICBydWxlIC9xIlwoLywgU3RyLCA6ZGVsaW1pdGVkX3BhcmVudGhlc2lzCisgICAgICAgIHJ1bGUgL3EiPC8sIFN0ciwgOmRlbGltaXRlZF9hbmdsZQorICAgICAgICBydWxlIC9xIlx7LywgU3RyLCA6ZGVsaW1pdGVkX2N1cmx5CisgICAgICAgIHJ1bGUgL3EiKFthLXpBLVpfXVx3Kilcbi4qP1xuXDEiLywgU3RyCisgICAgICAgIHJ1bGUgL3EiKC4pLio/XDEiLywgU3RyCisgICAgICAgICMgVG9rZW5TdHJpbmcKKyAgICAgICAgcnVsZSAvcVx7LywgU3RyLCA6dG9rZW5fc3RyaW5nCisgICAgICAgICMgQXR0cmlidXRlcworICAgICAgICBydWxlIC9AKFthLXpBLVpfXVx3Kik/LywgTmFtZTo6RGVjb3JhdG9yCisgICAgICAgICMgVG9rZW5zCisgICAgICAgIHJ1bGUgJXJgKH49fFxePXwlPXxcKj18PT18IT49fCE8PXwhPD49fCE8PnwhPHwhPnwhPXw+Pj49fD4+Pnw+Pj18Pj58Pj18PD49fDw+fDw8PXw8PHw8PXxcK1wrfFwrPXwtLXwtPXxcfFx8fFx8PXwmJnwmPXxcLlwuXC58XC5cLnwvPSl8Wy8uJnxcLSs8PiEoKVxbXF17fT8sOzokPSolXn5dYCwgUHVuY3R1YXRpb24KKyAgICAgICAgIyBJZGVudGlmaWVyCisgICAgICAgIHJ1bGUgL1thLXpBLVpfXVx3Ki8sIE5hbWUKKyAgICAgICAgIyBMaW5lCisgICAgICAgIHJ1bGUgLyNsaW5lXHMuKlxuLywgQ29tbWVudDo6U3BlY2lhbAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpuZXN0ZWRfY29tbWVudCBkbworICAgICAgICBydWxlICVyKFteKy9dKyksIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgICBydWxlICVyKC9cKyksIENvbW1lbnQ6Ok11bHRpbGluZSwgOnB1c2gKKyAgICAgICAgcnVsZSAlcihcKy8pLCBDb21tZW50OjpNdWx0aWxpbmUsIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoWysvXSksIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp0b2tlbl9zdHJpbmcgZG8KKyAgICAgICAgcnVsZSAvXHsvLCBQdW5jdHVhdGlvbiwgOnRva2VuX3N0cmluZ19uZXN0CisgICAgICAgIHJ1bGUgL1x9LywgU3RyLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp0b2tlbl9zdHJpbmdfbmVzdCBkbworICAgICAgICBydWxlIC9cey8sIFB1bmN0dWF0aW9uLCA6cHVzaAorICAgICAgICBydWxlIC9cfS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkZWxpbWl0ZWRfYnJhY2tldCBkbworICAgICAgICBydWxlIC9bXlxbXF1dKy8sIFN0cgorICAgICAgICBydWxlIC9cWy8sIFN0ciwgOmRlbGltaXRlZF9pbnNpZGVfYnJhY2tldAorICAgICAgICBydWxlIC9cXSIvLCBTdHIsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRlbGltaXRlZF9pbnNpZGVfYnJhY2tldCBkbworICAgICAgICBydWxlIC9bXlxbXF1dKy8sIFN0cgorICAgICAgICBydWxlIC9cWy8sIFN0ciwgOnB1c2gKKyAgICAgICAgcnVsZSAvXF0vLCBTdHIsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRlbGltaXRlZF9wYXJlbnRoZXNpcyBkbworICAgICAgICBydWxlIC9bXigpXSsvLCBTdHIKKyAgICAgICAgcnVsZSAvXCgvLCBTdHIsIDpkZWxpbWl0ZWRfaW5zaWRlX3BhcmVudGhlc2lzCisgICAgICAgIHJ1bGUgL1wpIi8sIFN0ciwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZGVsaW1pdGVkX2luc2lkZV9wYXJlbnRoZXNpcyBkbworICAgICAgICBydWxlIC9bXigpXSsvLCBTdHIKKyAgICAgICAgcnVsZSAvXCgvLCBTdHIsIDpwdXNoCisgICAgICAgIHJ1bGUgL1wpLywgU3RyLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkZWxpbWl0ZWRfYW5nbGUgZG8KKyAgICAgICAgcnVsZSAvW148Pl0rLywgU3RyCisgICAgICAgIHJ1bGUgLzwvLCBTdHIsIDpkZWxpbWl0ZWRfaW5zaWRlX2FuZ2xlCisgICAgICAgIHJ1bGUgLz4iLywgU3RyLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkZWxpbWl0ZWRfaW5zaWRlX2FuZ2xlIGRvCisgICAgICAgIHJ1bGUgL1tePD5dKy8sIFN0cgorICAgICAgICBydWxlIC88LywgU3RyLCA6cHVzaAorICAgICAgICBydWxlIC8+LywgU3RyLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkZWxpbWl0ZWRfY3VybHkgZG8KKyAgICAgICAgcnVsZSAvW157fV0rLywgU3RyCisgICAgICAgIHJ1bGUgL1x7LywgU3RyLCA6ZGVsaW1pdGVkX2luc2lkZV9jdXJseQorICAgICAgICBydWxlIC9cfSIvLCBTdHIsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRlbGltaXRlZF9pbnNpZGVfY3VybHkgZG8KKyAgICAgICAgcnVsZSAvW157fV0rLywgU3RyCisgICAgICAgIHJ1bGUgL1x7LywgU3RyLCA6cHVzaAorICAgICAgICBydWxlIC9cfS8sIFN0ciwgOnBvcCEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZGFydC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2RhcnQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ODRhMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2RhcnQucmIKQEAgLTAsMCArMSwxMDQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBEYXJ0IDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkRhcnQiCisgICAgICBkZXNjICJUaGUgRGFydCBwcm9ncmFtbWluZyBsYW5ndWFnZSAoZGFydGxhbmcuY29tKSIKKworICAgICAgdGFnICdkYXJ0JworICAgICAgZmlsZW5hbWVzICcqLmRhcnQnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1kYXJ0JworCisgICAgICBrZXl3b3JkcyA9ICV3KAorICAgICAgICBhcyBhc3NlcnQgYnJlYWsgY2FzZSBjYXRjaCBjb250aW51ZSBkZWZhdWx0IGRvIGVsc2UgZmluYWxseSBmb3IKKyAgICAgICAgaWYgaW4gaXMgbmV3IHJldGhyb3cgcmV0dXJuIHN1cGVyIHN3aXRjaCB0aGlzIHRocm93IHRyeSB3aGlsZSB3aXRoCisgICAgICApCisKKyAgICAgIGRlY2xhcmF0aW9ucyA9ICV3KAorICAgICAgICBhYnN0cmFjdCBkeW5hbWljIGNvbnN0IGV4dGVybmFsIGV4dGVuZHMgZmFjdG9yeSBmaW5hbCBnZXQgaW1wbGVtZW50cworICAgICAgICBuYXRpdmUgb3BlcmF0b3Igc2V0IHN0YXRpYyB0eXBlZGVmIHZhcgorICAgICAgKQorCisgICAgICB0eXBlcyA9ICV3KGJvb2wgZG91YmxlIER5bmFtaWMgZW51bSBpbnQgbnVtIE9iamVjdCBTZXQgU3RyaW5nIHZvaWQpCisKKyAgICAgIGltcG9ydHMgPSAldyhpbXBvcnQgZXhwb3J0IGxpYnJhcnkgcGFydFxzKm9mIHBhcnQgc291cmNlKQorCisgICAgICBpZCA9IC9bYS16QS1aX11cdyovCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgJXIoXgorICAgICAgICAgIChccyooPzpbYS16QS1aX11bYS16QS1aXGRfLlxbXF1dKlxzKykrPykgIyByZXR1cm4gYXJndW1lbnRzCisgICAgICAgICAgKFthLXpBLVpfXVtcd10qKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QgbmFtZQorICAgICAgICAgIChccyopKFwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2lnbmF0dXJlIHN0YXJ0CisgICAgICAgIClteCBkbyB8bXwKKyAgICAgICAgICAjIFRPRE86IGRvIHRoaXMgYmV0dGVyLCB0aGlzIHNob3VsZG4ndCBuZWVkIGEgZGVsZWdhdGlvbgorICAgICAgICAgIGRlbGVnYXRlIERhcnQsIG1bMV0KKyAgICAgICAgICB0b2tlbiBOYW1lOjpGdW5jdGlvbiwgbVsyXQorICAgICAgICAgIHRva2VuIFRleHQsIG1bM10KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVs0XQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9ccysvLCBUZXh0CisgICAgICAgIHJ1bGUgJXIoLy8uKj8kKSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgJXIoL1wqLio/XCovKW0sIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgICBydWxlIC8iLywgU3RyLCA6ZHFzCisgICAgICAgIHJ1bGUgLycvLCBTdHIsIDpzcXMKKyAgICAgICAgcnVsZSAvciJbXiJdKiIvLCBTdHI6Ok90aGVyCisgICAgICAgIHJ1bGUgL3InW14nXSonLywgU3RyOjpPdGhlcgorICAgICAgICBydWxlIC8jI3tpZH0qL2ksIFN0cjo6U3ltYm9sCisgICAgICAgIHJ1bGUgL0Aje2lkfS8sIE5hbWU6OkRlY29yYXRvcgorICAgICAgICBydWxlIC8oPzoje2tleXdvcmRzLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgLyg/OiN7ZGVjbGFyYXRpb25zLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICBydWxlIC8oPzoje3R5cGVzLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkOjpUeXBlCisgICAgICAgIHJ1bGUgLyg/OnRydWV8ZmFsc2V8bnVsbClcYi8sIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgIHJ1bGUgLyg/OmNsYXNzfGludGVyZmFjZSlcYi8sIEtleXdvcmQ6OkRlY2xhcmF0aW9uLCA6Y2xhc3MKKyAgICAgICAgcnVsZSAvKD86I3tpbXBvcnRzLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkOjpOYW1lc3BhY2UsIDppbXBvcnQKKyAgICAgICAgcnVsZSAvKFwuKSgje2lkfSkvIGRvCisgICAgICAgICAgZ3JvdXBzIE9wZXJhdG9yLCBOYW1lOjpBdHRyaWJ1dGUKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvI3tpZH06LywgTmFtZTo6TGFiZWwKKyAgICAgICAgcnVsZSAvXCQ/I3tpZH0vLCBOYW1lCisgICAgICAgIHJ1bGUgL1t+XiohJSZcW1xdKCl7fTw+XHwrPTo7LC5cLz8tXS8sIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgL1xkKlwuXGQrKFtlRV1cLT9cZCspPy8sIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvMHhbXGRhLWZBLUZdKy8sIE51bTo6SGV4CisgICAgICAgIHJ1bGUgL1xkK0w/LywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjbGFzcyBkbworICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgICBydWxlIGlkLCBOYW1lOjpDbGFzcywgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZHFzIGRvCisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpwb3AhCisgICAgICAgIHJ1bGUgL1teXFxcJCJdKy8sIFN0cgorICAgICAgICBtaXhpbiA6c3RyaW5nCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNxcyBkbworICAgICAgICBydWxlIC8nLywgU3RyLCA6cG9wIQorICAgICAgICBydWxlIC9bXlxcXCQnXSsvLCBTdHIKKyAgICAgICAgbWl4aW4gOnN0cmluZworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbXBvcnQgZG8KKyAgICAgICAgcnVsZSAvOy8sIE9wZXJhdG9yLCA6cG9wIQorICAgICAgICBydWxlIC8oPzpzaG93fGhpZGUpXGIvLCBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmcgZG8KKyAgICAgICAgbWl4aW4gOmludGVycG9sYXRpb24KKyAgICAgICAgcnVsZSAvXFxbbnJ0XCJcJ1xcXS8sIFN0cjo6RXNjYXBlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmludGVycG9sYXRpb24gZG8KKyAgICAgICAgcnVsZSAvXCQje2lkfS8sIFN0cjo6SW50ZXJwb2wKKyAgICAgICAgcnVsZSAvXCRce1teXH1dK1x9LywgU3RyOjpJbnRlcnBvbAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9kaWZmLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZGlmZi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTIzYTcxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZGlmZi5yYgpAQCAtMCwwICsxLDMxIEBACittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIERpZmYgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAnZGlmZicKKyAgICAgIGRlc2MgJ0xleGVzIHVuaWZpZWQgZGlmZnMgb3IgcGF0Y2hlcycKKworICAgICAgdGFnICdkaWZmJworICAgICAgYWxpYXNlcyAncGF0Y2gnLCAndWRpZmYnCisgICAgICBmaWxlbmFtZXMgJyouZGlmZicsICcqLnBhdGNoJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtZGlmZicsICd0ZXh0L3gtcGF0Y2gnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSAgIGlmIHRleHQuc3RhcnRfd2l0aD8oJ0luZGV4OiAnKQorICAgICAgICByZXR1cm4gMSAgIGlmIHRleHQuc3RhcnRfd2l0aD8oJ2RpZmYgJykKKyAgICAgICAgcmV0dXJuIDAuOSBpZiB0ZXh0LnN0YXJ0X3dpdGg/KCctLS0gJykKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlKC9eIC4qJFxuPy8sIFRleHQpCisgICAgICAgIHJ1bGUoL14tLS0kXG4/LywgVGV4dCkKKyAgICAgICAgcnVsZSgvXlwrLiokXG4/LywgR2VuZXJpYzo6SW5zZXJ0ZWQpCisgICAgICAgIHJ1bGUoL14tKy4qJFxuPy8sIEdlbmVyaWM6OkRlbGV0ZWQpCisgICAgICAgIHJ1bGUoL14hLiokXG4/LywgR2VuZXJpYzo6U3Ryb25nKQorICAgICAgICBydWxlKC9eQC4qJFxuPy8sIEdlbmVyaWM6OlN1YmhlYWRpbmcpCisgICAgICAgIHJ1bGUoL14oW0lpXW5kZXh8ZGlmZikuKiRcbj8vLCBHZW5lcmljOjpIZWFkaW5nKQorICAgICAgICBydWxlKC9ePS4qJFxuPy8sIEdlbmVyaWM6OkhlYWRpbmcpCisgICAgICAgIHJ1bGUoLy4qJFxuPy8sIFRleHQpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2VpZmZlbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2VpZmZlbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2FlNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZWlmZmVsLnJiCkBAIC0wLDAgKzEsNjUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBFaWZmZWwgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiRWlmZmVsIgorICAgICAgZGVzYyAiRWlmZmVsIHByb2dyYW1taW5nIGxhbmd1YWdlIgorCisgICAgICB0YWcgJ2VpZmZlbCcKKyAgICAgIGZpbGVuYW1lcyAnKi5lJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtZWlmZmVsJworCisgICAgICBMYW5ndWFnZUtleXdvcmRzID0gJXcoCisgICAgICAgIGFjcm9zcyBhZ2VudCBhbGlhcyBhbGwgYW5kIGF0dGFjaGVkIGFzIGFzc2lnbiBhdHRyaWJ1dGUgY2hlY2sKKyAgICAgICAgY2xhc3MgY29udmVydCBjcmVhdGUgZGVidWcgZGVmZXJyZWQgZGV0YWNoYWJsZSBkbyBlbHNlIGVsc2VpZiBlbmQKKyAgICAgICAgZW5zdXJlIGV4cGFuZGVkIGV4cG9ydCBleHRlcm5hbCBmZWF0dXJlIGZyb20gZnJvemVuIGlmIGltcGxpZXMgIGluaGVyaXQKKyAgICAgICAgaW5zcGVjdCBpbnZhcmlhbnQgbGlrZSBsb2NhbCBsb29wIG5vdCBub3RlIG9ic29sZXRlIG9sZCBvbmNlIG9yCisgICAgICAgIFByZWN1cnNvciByZWRlZmluZSByZW5hbWUgcmVxdWlyZSByZXNjdWUgcmV0cnkgc2VsZWN0IHNlcGFyYXRlCisgICAgICAgIHNvbWUgdGhlbiB1bmRlZmluZSB1bnRpbCB2YXJpYW50IFZvaWQgd2hlbiB4b3IKKyAgICAgICkKKworICAgICAgQm9vbGVhbkNvbnN0YW50cyA9ICV3KFRydWUgRmFsc2UpCisKKyAgICAgIExhbmd1YWdlVmFyaWFibGVzID0gJXcoQ3VycmVudCBSZXN1bHQpCisKKyAgICAgIFNpbXBsZVN0cmluZyA9IC8oPzpbXiIlXGJcZlx2XXwlW0EtREZITE5RUi1WJSciKCk8Pl18JVwvKD86MFt4WF1bXGRhLWZBLUZdKD86XypbXGRhLWZBLUZdKSp8MFtjQ11bMC03XSg/Ol8qWzAtN10pKnwwW2JCXVswMV0oPzpfKlswMV0pKnxcZCg/Ol8qXGQpKilcLykrPy8KKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvIlxbLywgU3RyOjpPdGhlciwgOmFsaWduZWRfdmVyYmF0aW1fc3RyaW5nCisgICAgICAgIHJ1bGUgLyJcey8sIFN0cjo6T3RoZXIsIDpub25fYWxpZ25lZF92ZXJiYXRpbV9zdHJpbmcKKyAgICAgICAgcnVsZSAvIig/OlteJVxiXGZcblxyXHZdfCVbQS1ERkhMTlFSLVYlJyIoKTw+XXwlXC8oPzowW3hYXVtcZGEtZkEtRl0oPzpfKltcZGEtZkEtRl0pKnwwW2NDXVswLTddKD86XypbMC03XSkqfDBbYkJdWzAxXSg/Ol8qWzAxXSkqfFxkKD86XypcZCkqKVwvKSo/Ii8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLy0tLiovLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvJyg/OlteJVxiXGZcblxyXHRcdl18JVtBLURGSExOUVItViUnIigpPD5dfCVcLyg/OjBbeFhdW1xkYS1mQS1GXSg/Ol8qW1xkYS1mQS1GXSkqfDBbY0NdWzAtN10oPzpfKlswLTddKSp8MFtiQl1bMDFdKD86XypbMDFdKSp8XGQoPzpfKlxkKSopXC8pJy8sIFN0cjo6Q2hhcgorCisgICAgICAgIHJ1bGUgLyg/OiN7TGFuZ3VhZ2VLZXl3b3Jkcy5qb2luKCd8Jyl9KVxiLywgS2V5d29yZAorICAgICAgICBydWxlIC8oPzoje0xhbmd1YWdlVmFyaWFibGVzLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkOjpWYXJpYWJsZQorICAgICAgICBydWxlIC8oPzoje0Jvb2xlYW5Db25zdGFudHMuam9pbignfCcpfSlcYi8sIEtleXdvcmQ6OkNvbnN0YW50CisKKyAgICAgICAgcnVsZSAgL1xiMFt4WF1bXGRhLWZBLUZdKD86XypbXGRhLWZBLUZdKSpiLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvXGIwW2NDXVswLTddKD86XypbMC03XSkqXGIvLCBOdW06Ok9jdAorICAgICAgICBydWxlIC9cYjBbYkJdWzAxXSg/Ol8qWzAxXSkqXGIvLCBOdW06OkJpbgorICAgICAgICBydWxlIC9cZCg/Ol8qXGQpKi8sIE51bTo6SW50ZWdlcgorICAgICAgICBydWxlIC8oPzpcZCg/Ol8qXGQpKik/XC4oPzooPzpcZCg/Ol8qXGQpKik/W2VFXVsrLV0/KT9cZCg/Ol8qXGQpKnxcZCg/Ol8qXGQpKlwuPy8sIE51bTo6RmxvYXQKKworICAgICAgICBydWxlIC86PXw8PHw+PnxcKFx8fFx8XCl8LT58XC58W3t9XFtcXTsoKSw6P10vLCBQdW5jdHVhdGlvbjo6SW5kaWNhdG9yCisgICAgICAgIHJ1bGUgL1xcXFx8XHxcLlwuXHx8XC5cLnxcL1t+XC9dP3xbPjxcL109P3xbLSsqXj1+XS8sIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvW0EtWl1bXGRBLVpfXSovLCBOYW1lOjpDbGFzcworICAgICAgICBydWxlIC9bQS1aYS16XVtcZEEtWmEtel9dKi8sIE5hbWUKKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDphbGlnbmVkX3ZlcmJhdGltX3N0cmluZyBkbworICAgICAgICBydWxlIC9dIi8sIFN0cjo6T3RoZXIsIDpwb3AhCisgICAgICAgIHJ1bGUgU2ltcGxlU3RyaW5nLCBTdHI6Ok90aGVyCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm5vbl9hbGlnbmVkX3ZlcmJhdGltX3N0cmluZyBkbworICAgICAgICBydWxlIC99Ii8sIFN0cjo6T3RoZXIsIDpwb3AhCisgICAgICAgIHJ1bGUgU2ltcGxlU3RyaW5nLCBTdHI6Ok90aGVyCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZWxpeGlyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZWxpeGlyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZGMzMDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9lbGl4aXIucmIKQEAgLTAsMCArMSwxMDggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICAjIERpcmVjdCBwb3J0IG9mIHB5Z21lbnRzIExleGVyLgorICAgICMgU2VlOiBodHRwczovL2JpdGJ1Y2tldC5vcmcvYmlya2VuZmVsZC9weWdtZW50cy1tYWluL3NyYy83MzA0ZTQ3NTlhZTY1MzQzZDg5YTUxMzU5Y2E1Mzg5MTI1MTljYzMxL3B5Z21lbnRzL2xleGVycy9mdW5jdGlvbmFsLnB5P2F0PWRlZmF1bHQjY2wtMjM2MgorICAgIGNsYXNzIEVsaXhpciA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJFbGl4aXIiCisgICAgICBkZXNjICJFbGl4aXIgbGFuZ3VhZ2UgKGVsaXhpci1sYW5nLm9yZykiCisKKyAgICAgIHRhZyAnZWxpeGlyJworICAgICAgYWxpYXNlcyAnZWxpeGlyJywgJ2V4cycKKworICAgICAgZmlsZW5hbWVzICcqLmV4JywgJyouZXhzJworCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1lbGl4aXInLCAnYXBwbGljYXRpb24veC1lbGl4aXInCisKKyAgICAgIEJSQUNFUyA9IFsKKyAgICAgICAgWydceycsICdcfScsICdjYiddLAorICAgICAgICBbJ1xbJywgJ1xdJywgJ3NiJ10sCisgICAgICAgIFsnXCgnLCAnXCknLCAncGEnXSwKKyAgICAgICAgWydcPCcsICdcPicsICdsdCddCisgICAgICBdCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgLyMuKiQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcntcYihjYXNlfGNvbmR8ZW5kfGJjfGxjfGlmfHVubGVzc3x0cnl8bG9vcHxyZWNlaXZlfGZufGRlZm1vZHVsZXwKKyAgICAgICAgICAgICBkZWZwP3xkZWZwcm90b2NvbHxkZWZpbXBsfGRlZnJlY29yZHxkZWZtYWNyb3A/fGRlZmRlbGVnYXRlfAorICAgICAgICAgICAgIGRlZmV4Y2VwdGlvbnxleGl0fHJhaXNlfHRocm93fHVubGVzc3xhZnRlcnxyZXNjdWV8Y2F0Y2h8ZWxzZSlcYig/IVs/IV0pfAorICAgICAgICAgICAgICg/PCFcLilcYihkb3xcLVw+KVxifXgsIEtleXdvcmQKKyAgICAgICAgcnVsZSAvXGIoaW1wb3J0fHJlcXVpcmV8dXNlfHJlY3VyfHF1b3RlfHVucXVvdGV8c3VwZXJ8cmVmZXIpXGIoPyFbPyFdKS8sIEtleXdvcmQ6Ok5hbWVzcGFjZQorICAgICAgICBydWxlIC8oPzwhXC4pXGIoYW5kfG5vdHxvcnx3aGVufHhvcnxpbilcYi8sIE9wZXJhdG9yOjpXb3JkCisgICAgICAgIHJ1bGUgJXJ7JT18XCo9fFwqXCo9fFwrPXxcLT18XF49fFx8XHw9fAorICAgICAgICAgICAgIDw9Pnw8KD8hPHw9KXw+KD8hPHw9fD4pfDw9fD49fD09PXw9PXw9fnwhPXwhfnwoPz1bXHNcdF0pXD98CisgICAgICAgICAgICAgKD88PVtcc1x0XSkhK3wmKCYmP3woPyFcZCkpfFx8XHx8XF58XCp8XCt8XC18L3wKKyAgICAgICAgICAgICBcfHxcK1wrfFwtXC18XCpcKnxcL1wvfFw8XC18XDxcPnw8PHw+Pnw9fFwufH5+fn14LCBPcGVyYXRvcgorICAgICAgICBydWxlICVyeyg/PCE6KSg6KShbYS16QS1aX11cdyooWz8hXXw9KD8hWz49XSkpP3xcPFw+fD09PT98Pj0/fDw9P3wKKyAgICAgICAgICAgICA8PT58JiY/fCVcKFwpfCVcW1xdfCVce1x9fFwrXCs/fFwtXC0/fFx8XHw/fFwhfC8vfFslJmAvXHxdfAorICAgICAgICAgICAgIFwqXCo/fD0/fnw8XC0pfChbYS16QS1aX11cdyooWz8hXSk/KSg6KSg/ITopfSwgU3RyOjpTeW1ib2wKKyAgICAgICAgcnVsZSAvOiIvLCBTdHI6OlN5bWJvbCwgOmludGVycG9saW5nX3N5bWJvbAorICAgICAgICBydWxlIC9cYihuaWx8dHJ1ZXxmYWxzZSlcYig/IVs/IV0pfFxiW0EtWl1cdypcYi8sIE5hbWU6OkNvbnN0YW50CisgICAgICAgIHJ1bGUgL1xiKF9fKEZJTEV8TElORXxNT0RVTEV8TUFJTnxGVU5DVElPTilfXylcYig/IVs/IV0pLywgTmFtZTo6QnVpbHRpbjo6UHNldWRvCisgICAgICAgIHJ1bGUgL1thLXpBLVpfIV1bXHdfXSpbIVw/XT8vLCBOYW1lCisgICAgICAgIHJ1bGUgJXJ7Ojp8WyUoKXt9OywvXHw6XFxcW1xdXX0sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL0BbYS16QS1aX11cdyp8JlxkLywgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgcnVsZSAlcntcYigwW3hYXVswLTlBLUZhLWZdK3xcZChfP1xkKSooXC4oPyFbXlxkXHNdKQorICAgICAgICAgICAgIChfP1xkKSopPyhbZUVdWy0rXT9cZChfP1xkKSopP3wwW2JCXVswMV0rKVxifXgsIE51bQorICAgICAgICBydWxlICVye35yXC8uKlwvfSwgU3RyOjpSZWdleAorCisgICAgICAgIG1peGluIDpzdHJpbmdzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ3MgZG8KKyAgICAgICAgcnVsZSAvKCVbQS1CYS16XSk/IiIiKD86LnxcbikqPyIiIi8sIFN0cjo6RG9jCisgICAgICAgIHJ1bGUgLycnJyg/Oi58XG4pKj8nJycvLCBTdHI6OkRvYworICAgICAgICBydWxlIC8iLywgU3RyOjpEb2MsIDpkcXMKKyAgICAgICAgcnVsZSAvJy4qPycvLCBTdHI6OlNpbmdsZQorICAgICAgICBydWxlICVyeyg/PCFcdylcPyhcXCh4XGR7MSwyfXxcaHsxLDJ9KD8hXGgpXGJ8MFswLTddezAsMn0oPyFbMC03XSlcYlteeDBNQ10pfChcXFtNQ10tKStcd3xbXlxzXFxdKX0sIFN0cjo6T3RoZXIKKworICAgICAgICBCUkFDRVMuZWFjaCBkbyB8XywgXywgbmFtZXwKKyAgICAgICAgICBtaXhpbiA6ImJyYWNlc18je25hbWV9IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBCUkFDRVMuZWFjaCBkbyB8bGJyYWNlLCByYnJhY2UsIG5hbWV8CisgICAgICAgIHN0YXRlIDoiYnJhY2VzXyN7bmFtZX0iIGRvCisgICAgICAgICAgcnVsZSAvJVthLXpdI3tsYnJhY2V9LywgU3RyOjpEb3VibGUsIDoiYnJhY2VzXyN7bmFtZX1faW50cCIKKyAgICAgICAgICBydWxlIC8lW0EtWl0je2xicmFjZX0vLCBTdHI6OkRvdWJsZSwgOiJicmFjZXNfI3tuYW1lfV9ub19pbnRwIgorICAgICAgICBlbmQKKworICAgICAgICBzdGF0ZSA6ImJyYWNlc18je25hbWV9X2ludHAiIGRvCisgICAgICAgICAgcnVsZSAvI3tyYnJhY2V9W2Etel0qLywgU3RyOjpEb3VibGUsIDpwb3AhCisgICAgICAgICAgbWl4aW4gOmVuZGRvdWJsZXN0cgorICAgICAgICBlbmQKKworICAgICAgICBzdGF0ZSA6ImJyYWNlc18je25hbWV9X25vX2ludHAiIGRvCisgICAgICAgICAgcnVsZSAvLioje3JicmFjZX1bYS16XSovLCBTdHI6OkRvdWJsZSwgOnBvcCEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRxcyBkbworICAgICAgICBydWxlIC8iLywgU3RyOjpEb3VibGUsIDpwb3AhCisgICAgICAgIG1peGluIDplbmRkb3VibGVzdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW50ZXJwb2xpbmcgZG8KKyAgICAgICAgcnVsZSAvI1x7LywgU3RyOjpJbnRlcnBvbCwgOmludGVycG9saW5nX3N0cmluZworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbnRlcnBvbGluZ19zdHJpbmcgZG8KKyAgICAgICAgcnVsZSAvXH0vLCBTdHI6OkludGVycG9sLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbnRlcnBvbGluZ19zeW1ib2wgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0cjo6U3ltYm9sLCA6cG9wIQorICAgICAgICBtaXhpbiA6aW50ZXJwb2xpbmcKKyAgICAgICAgcnVsZSAvW14jIl0rLywgU3RyOjpTeW1ib2wKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZW5kZG91Ymxlc3RyIGRvCisgICAgICAgIG1peGluIDppbnRlcnBvbGluZworICAgICAgICBydWxlIC9bXiMiXSsvLCBTdHI6OkRvdWJsZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9lcmIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9lcmIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMDI4NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2VyYi5yYgpAQCAtMCwwICsxLDU2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgRVJCIDwgVGVtcGxhdGVMZXhlcgorICAgICAgdGl0bGUgIkVSQiIKKyAgICAgIGRlc2MgIkVtYmVkZGVkIHJ1YnkgdGVtcGxhdGUgZmlsZXMiCisKKyAgICAgIHRhZyAnZXJiJworICAgICAgYWxpYXNlcyAnZXJ1YnknLCAncmh0bWwnCisKKyAgICAgIGZpbGVuYW1lcyAnKi5lcmInLCAnKi5lcnViaXMnLCAnKi5yaHRtbCcsICcqLmVydWJ5JworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDAuNCBpZiB0ZXh0ID1+IC88JS4qJT4vCisgICAgICBlbmQKKworICAgICAgZGVmIGluaXRpYWxpemUob3B0cz17fSkKKyAgICAgICAgQHJ1YnlfbGV4ZXIgPSBSdWJ5Lm5ldyhvcHRzKQorCisgICAgICAgIHN1cGVyKG9wdHMpCisgICAgICBlbmQKKworICAgICAgc3RhcnQgZG8KKyAgICAgICAgcGFyZW50LnJlc2V0IQorICAgICAgICBAcnVieV9sZXhlci5yZXNldCEKKyAgICAgIGVuZAorCisgICAgICBvcGVuICA9IC88JSV8PCU9fDwlI3w8JS18PCUvCisgICAgICBjbG9zZSA9IC8lJT58LSU+fCU+LworCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC88JSMvLCBDb21tZW50LCA6Y29tbWVudAorCisgICAgICAgIHJ1bGUgb3BlbiwgQ29tbWVudDo6UHJlcHJvYywgOnJ1YnkKKworICAgICAgICBydWxlIC8uKz8oPz0je29wZW59KXwuKy9tIGRvCisgICAgICAgICAgZGVsZWdhdGUgcGFyZW50CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tZW50IGRvCisgICAgICAgIHJ1bGUgY2xvc2UsIENvbW1lbnQsIDpwb3AhCisgICAgICAgIHJ1bGUgLy4rKD89I3tjbG9zZX0pfC4rL20sIENvbW1lbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cnVieSBkbworICAgICAgICBydWxlIGNsb3NlLCBDb21tZW50OjpQcmVwcm9jLCA6cG9wIQorCisgICAgICAgIHJ1bGUgLy4rPyg/PSN7Y2xvc2V9KXwuKy9tIGRvCisgICAgICAgICAgZGVsZWdhdGUgQHJ1YnlfbGV4ZXIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2VybGFuZy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2VybGFuZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTA4MjViCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZXJsYW5nLnJiCkBAIC0wLDAgKzEsMTE4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgRXJsYW5nIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkVybGFuZyIKKyAgICAgIGRlc2MgIlRoZSBFcmxhbmcgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKGVybGFuZy5vcmcpIgorICAgICAgdGFnICdlcmxhbmcnCisgICAgICBhbGlhc2VzICdlcmwnCisgICAgICBmaWxlbmFtZXMgJyouZXJsJywgJyouaHJsJworCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1lcmxhbmcnLCAnYXBwbGljYXRpb24veC1lcmxhbmcnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMC4zIGlmIHRleHQgPX4gL14tbW9kdWxlWyhdXHcrWyldWy5dLworICAgICAgZW5kCisKKyAgICAgIGtleXdvcmRzID0gJXcoCisgICAgICAgIGFmdGVyIGJlZ2luIGNhc2UgY2F0Y2ggY29uZCBlbmQgZnVuIGlmCisgICAgICAgIGxldCBvZiBxdWVyeSByZWNlaXZlIHRyeSB3aGVuCisgICAgICApCisKKyAgICAgIGJ1aWx0aW5zID0gJXcoCisgICAgICAgIGFicyBhcHBlbmRfZWxlbWVudCBhcHBseSBhdG9tX3RvX2xpc3QgYmluYXJ5X3RvX2xpc3QKKyAgICAgICAgYml0c3RyaW5nX3RvX2xpc3QgYmluYXJ5X3RvX3Rlcm0gYml0X3NpemUgYnVtcF9yZWR1Y3Rpb25zCisgICAgICAgIGJ5dGVfc2l6ZSBjYW5jZWxfdGltZXIgY2hlY2tfcHJvY2Vzc19jb2RlIGRlbGV0ZV9tb2R1bGUKKyAgICAgICAgZGVtb25pdG9yIGRpc2Nvbm5lY3Rfbm9kZSBkaXNwbGF5IGVsZW1lbnQgZXJhc2UgZXhpdAorICAgICAgICBmbG9hdCBmbG9hdF90b19saXN0IGZ1bl9pbmZvIGZ1bl90b19saXN0CisgICAgICAgIGZ1bmN0aW9uX2V4cG9ydGVkIGdhcmJhZ2VfY29sbGVjdCBnZXQgZ2V0X2tleXMKKyAgICAgICAgZ3JvdXBfbGVhZGVyIGhhc2ggaGQgaW50ZWdlcl90b19saXN0IGlvbGlzdF90b19iaW5hcnkKKyAgICAgICAgaW9saXN0X3NpemUgaXNfYXRvbSBpc19iaW5hcnkgaXNfYml0c3RyaW5nIGlzX2Jvb2xlYW4KKyAgICAgICAgaXNfYnVpbHRpbiBpc19mbG9hdCBpc19mdW5jdGlvbiBpc19pbnRlZ2VyIGlzX2xpc3QKKyAgICAgICAgaXNfbnVtYmVyIGlzX3BpZCBpc19wb3J0IGlzX3Byb2Nlc3NfYWxpdmUgaXNfcmVjb3JkCisgICAgICAgIGlzX3JlZmVyZW5jZSBpc190dXBsZSBsZW5ndGggbGluayBsaXN0X3RvX2F0b20KKyAgICAgICAgbGlzdF90b19iaW5hcnkgbGlzdF90b19iaXRzdHJpbmcgbGlzdF90b19leGlzdGluZ19hdG9tCisgICAgICAgIGxpc3RfdG9fZmxvYXQgbGlzdF90b19pbnRlZ2VyIGxpc3RfdG9fcGlkIGxpc3RfdG9fdHVwbGUKKyAgICAgICAgbG9hZF9tb2R1bGUgbG9jYWx0aW1lX3RvX3VuaXZlcnNhbHRpbWUgbWFrZV90dXBsZSBtZDUKKyAgICAgICAgbWQ1X2ZpbmFsIG1kNV91cGRhdGUgbWVtb3J5IG1vZHVsZV9sb2FkZWQgbW9uaXRvcgorICAgICAgICBtb25pdG9yX25vZGUgbm9kZSBub2RlcyBvcGVuX3BvcnQgcGhhc2ggcGhhc2gyCisgICAgICAgIHBpZF90b19saXN0IHBvcnRfY2xvc2UgcG9ydF9jb21tYW5kIHBvcnRfY29ubmVjdAorICAgICAgICBwb3J0X2NvbnRyb2wgcG9ydF9jYWxsIHBvcnRfaW5mbyBwb3J0X3RvX2xpc3QKKyAgICAgICAgcHJvY2Vzc19kaXNwbGF5IHByb2Nlc3NfZmxhZyBwcm9jZXNzX2luZm8gcHVyZ2VfbW9kdWxlCisgICAgICAgIHB1dCByZWFkX3RpbWVyIHJlZl90b19saXN0IHJlZ2lzdGVyIHJlc3VtZV9wcm9jZXNzCisgICAgICAgIHJvdW5kIHNlbmQgc2VuZF9hZnRlciBzZW5kX25vc3VzcGVuZCBzZXRfY29va2llCisgICAgICAgIHNldGVsZW1lbnQgc2l6ZSBzcGF3biBzcGF3bl9saW5rIHNwYXduX21vbml0b3IKKyAgICAgICAgc3Bhd25fb3B0IHNwbGl0X2JpbmFyeSBzdGFydF90aW1lciBzdGF0aXN0aWNzCisgICAgICAgIHN1c3BlbmRfcHJvY2VzcyBzeXN0ZW1fZmxhZyBzeXN0ZW1faW5mbyBzeXN0ZW1fbW9uaXRvcgorICAgICAgICBzeXN0ZW1fcHJvZmlsZSB0ZXJtX3RvX2JpbmFyeSB0bCB0cmFjZSB0cmFjZV9kZWxpdmVyZWQKKyAgICAgICAgdHJhY2VfaW5mbyB0cmFjZV9wYXR0ZXJuIHRydW5jIHR1cGxlX3NpemUgdHVwbGVfdG9fbGlzdAorICAgICAgICB1bml2ZXJzYWx0aW1lX3RvX2xvY2FsdGltZSB1bmxpbmsgdW5yZWdpc3RlciB3aGVyZWlzCisgICAgICApCisKKyAgICAgIG9wZXJhdG9ycyA9ICVyeyhcK1wrP3wtLT98XCp8L3w8fD58Lz18PTo9fD0vPXw9PHw+PXw9PT98PC18IXxcPyl9CisgICAgICB3b3JkX29wZXJhdG9ycyA9ICV3KAorICAgICAgICBhbmQgYW5kYWxzbyBiYW5kIGJub3QgYm9yIGJzbCBic3IgYnhvcgorICAgICAgICBkaXYgbm90IG9yIG9yZWxzZSByZW0geG9yCisgICAgICApCisKKyAgICAgIGF0b21fcmUgPSAlcnsoPzpbYS16XVthLXpBLVowLTlfXSp8J1teXG4nXSpbXlxcXScpfQorCisgICAgICB2YXJpYWJsZV9yZSA9ICVyeyg/OltBLVpfXVthLXpBLVowLTlfXSopfQorCisgICAgICBlc2NhcGVfcmUgPSAlcnsoPzpcXCg/OltiZGVmbnJzdHZcJyJcXC9dfFswLTddWzAtN10/WzAtN10/fFxeW2EtekEtWl0pKX0KKworICAgICAgbWFjcm9fcmUgPSAlcnsoPzoje3ZhcmlhYmxlX3JlfXwje2F0b21fcmV9KX0KKworICAgICAgYmFzZV9yZSA9ICVyeyg/OlsyLTldfFsxMl1bMC05XXwzWzAtNl0pfQorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlKC9ccysvLCBUZXh0KQorICAgICAgICBydWxlKC8lLipcbi8sIENvbW1lbnQpCisgICAgICAgIHJ1bGUoJXJ7KCN7a2V5d29yZHMuam9pbignfCcpfSlcYn0sIEtleXdvcmQpCisgICAgICAgIHJ1bGUoJXJ7KCN7YnVpbHRpbnMuam9pbignfCcpfSlcYn0sIE5hbWU6OkJ1aWx0aW4pCisgICAgICAgIHJ1bGUoJXJ7KCN7d29yZF9vcGVyYXRvcnMuam9pbignfCcpfSlcYn0sIE9wZXJhdG9yOjpXb3JkKQorICAgICAgICBydWxlKC9eLS8sIFB1bmN0dWF0aW9uLCA6ZGlyZWN0aXZlKQorICAgICAgICBydWxlKG9wZXJhdG9ycywgT3BlcmF0b3IpCisgICAgICAgIHJ1bGUoLyIvLCBTdHIsIDpzdHJpbmcpCisgICAgICAgIHJ1bGUoLzw8LywgTmFtZTo6TGFiZWwpCisgICAgICAgIHJ1bGUoLz4+LywgTmFtZTo6TGFiZWwpCisgICAgICAgIHJ1bGUgJXJ7KCN7YXRvbV9yZX0pKDopfSBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpOYW1lc3BhY2UsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorICAgICAgICBydWxlICVyeyg/Ol58KD88PTopKSgje2F0b21fcmV9KShccyopKFwoKX0gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6RnVuY3Rpb24sIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorICAgICAgICBydWxlKCVye1srLV0/I3tiYXNlX3JlfSNbMC05YS16QS1aXSt9LCBOdW06OkludGVnZXIpCisgICAgICAgIHJ1bGUoL1srLV0/XGQrLywgTnVtOjpJbnRlZ2VyKQorICAgICAgICBydWxlKC9bKy1dP1xkKy5cZCsvLCBOdW06OkZsb2F0KQorICAgICAgICBydWxlKCVye1tcXVxbOl9AXCIue30oKXw7LF19LCBQdW5jdHVhdGlvbikKKyAgICAgICAgcnVsZSh2YXJpYWJsZV9yZSwgTmFtZTo6VmFyaWFibGUpCisgICAgICAgIHJ1bGUoYXRvbV9yZSwgTmFtZSkKKyAgICAgICAgcnVsZSglcntcPyN7bWFjcm9fcmV9fSwgTmFtZTo6Q29uc3RhbnQpCisgICAgICAgIHJ1bGUoJXJ7XCQoPzoje2VzY2FwZV9yZX18XFxbICVdfFteXFxdKX0sIFN0cjo6Q2hhcikKKyAgICAgICAgcnVsZSglcnsjI3thdG9tX3JlfSg6P1wuI3thdG9tX3JlfSk/fSwgTmFtZTo6TGFiZWwpCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZyBkbworICAgICAgICBydWxlKGVzY2FwZV9yZSwgU3RyOjpFc2NhcGUpCisgICAgICAgIHJ1bGUoLyIvLCBTdHIsIDpwb3AhKQorICAgICAgICBydWxlKCVye35bMC05LipdKlt+IytiQmNkZWZnaW5wUHN3V3hYXX0sIFN0cjo6SW50ZXJwb2wpCisgICAgICAgIHJ1bGUoJXJ7W14iXFx+XSt9LCBTdHIpCisgICAgICAgIHJ1bGUoL34vLCBTdHIpCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRpcmVjdGl2ZSBkbworICAgICAgICBydWxlICVyeyhkZWZpbmUpKFxzKikoXCgpKCN7bWFjcm9fcmV9KX0gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6RW50aXR5LCBUZXh0LCBQdW5jdHVhdGlvbiwgTmFtZTo6Q29uc3RhbnQKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorICAgICAgICBydWxlICVyeyhyZWNvcmQpKFxzKikoXCgpKCN7bWFjcm9fcmV9KX0gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6RW50aXR5LCBUZXh0LCBQdW5jdHVhdGlvbiwgTmFtZTo6TGFiZWwKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorICAgICAgICBydWxlKGF0b21fcmUsIE5hbWU6OkVudGl0eSwgOnBvcCEpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2ZhY3Rvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2ZhY3Rvci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGEzY2JmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZmFjdG9yLnJiCkBAIC0wLDAgKzEsMzAyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgRmFjdG9yIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkZhY3RvciIKKyAgICAgIGRlc2MgIkZhY3RvciwgdGhlIHByYWN0aWNhbCBzdGFjayBsYW5ndWFnZSAoZmFjdG9yY29kZS5vcmcpIgorICAgICAgdGFnICdmYWN0b3InCisgICAgICBmaWxlbmFtZXMgJyouZmFjdG9yJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtZmFjdG9yJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAnZmFjdG9yJworICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0ge30udGFwIGRvIHxidWlsdGluc3wKKyAgICAgICAgICBidWlsdGluc1s6a2VybmVsXSA9IFNldC5uZXcgJXcoCisgICAgICAgICAgICBvciAyYmkgMnRyaSB3aGlsZSB3cmFwcGVyIG5pcCA0ZGlwIHdyYXBwZXI/IGJpKgorICAgICAgICAgICAgY2FsbHN0YWNrPmFycmF5IGJvdGg/IGhhc2hjb2RlIGRpZSBkdXBkIGNhbGxzdGFjaworICAgICAgICAgICAgY2FsbHN0YWNrPyAzZHVwIHRyaUAgcGljayBjdXJyeSBidWlsZCA/ZXhlY3V0ZSAzYmkgcHJlcG9zZQorICAgICAgICAgICAgPmJvb2xlYW4gaWYgY2xvbmUgZXE/IHRyaSogPyA9IHN3YXBkIDJvdmVyIDJrZWVwIDNrZWVwIGNsZWFyCisgICAgICAgICAgICAyZHVwIHdoZW4gbm90IHR1cGxlPyBkdXAgMmJpKiAydHJpKiBjYWxsIHRyaS1jdXJyeSBvYmplY3QgYmlACisgICAgICAgICAgICBkbyB1bmxlc3MqIGlmKiBsb29wIGJpLWN1cnJ5KiBkcm9wIHdoZW4qIGFzc2VydD0gcmV0YWluc3RhY2sKKyAgICAgICAgICAgIGFzc2VydD8gLXJvdCBleGVjdXRlIDJiaUAgMnRyaUAgYm9hIHdpdGggZWl0aGVyPyAzZHJvcCBiaQorICAgICAgICAgICAgY3Vycnk/ICBkYXRhc3RhY2sgdW50aWwgM2RpcCBvdmVyIDNjdXJyeSB0cmktY3VycnkqIHRyaS1jdXJyeUAKKyAgICAgICAgICAgIHN3YXAgYW5kIDJuaXAgdGhyb3cgYmktY3VycnkgKGNsb25lKSBoYXNoY29kZSogY29tcG9zZSAyZGlwIGlmCisgICAgICAgICAgICAzdHJpIHVubGVzcyBjb21wb3NlPyB0dXBsZSBrZWVwIDJjdXJyeSBlcXVhbD8gYXNzZXJ0IHRyaSAyZHJvcAorICAgICAgICAgICAgbW9zdCA8d3JhcHBlcj4gYm9vbGVhbj8gaWRlbnRpdHktaGFzaGNvZGUgaWRlbnRpdHktdHVwbGU/CisgICAgICAgICAgICBudWxsIG5ldyBkaXAgYmktY3VycnlAIHJvdCB4b3IgaWRlbnRpdHktdHVwbGUgYm9vbGVhbgorICAgICAgICAgICkKKworICAgICAgICAgIGJ1aWx0aW5zWzphc3NvY3NdID0gU2V0Lm5ldyAldygKKyAgICAgICAgICAgID9hdCBhc3NvYz8gYXNzb2MtY2xvbmUtbGlrZSBhc3NvYz0gZGVsZXRlLWF0KiBhc3NvYy1wYXJ0aXRpb24KKyAgICAgICAgICAgIGV4dHJhY3Qta2V5cyBuZXctYXNzb2MgdmFsdWU/IGFzc29jLXNpemUgbWFwPmFzc29jIHB1c2gtYXQKKyAgICAgICAgICAgIGFzc29jLWxpa2Uga2V5PyBhc3NvYy1pbnRlcnNlY3QgYXNzb2MtcmVmaW5lIHVwZGF0ZQorICAgICAgICAgICAgYXNzb2MtdW5pb24gYXNzb2MtY29tYmluZSBhdCogYXNzb2MtZW1wdHk/IGF0KyBzZXQtYXQKKyAgICAgICAgICAgIGFzc29jLWFsbD8gYXNzb2Mtc3Vic2V0PyAgYXNzb2MtaGFzaGNvZGUgY2hhbmdlLWF0IGFzc29jLWVhY2gKKyAgICAgICAgICAgIGFzc29jLWRpZmYgemlwIHZhbHVlcyB2YWx1ZS1hdCByZW5hbWUtYXQgaW5jLWF0IGVudW0/IGF0IGNhY2hlCisgICAgICAgICAgICBhc3NvYz5tYXAgPGVudW0+IGFzc29jIGFzc29jLW1hcCBlbnVtIHZhbHVlLWF0KiBhc3NvYy1tYXAtYXMKKyAgICAgICAgICAgID5hbGlzdCBhc3NvYy1maWx0ZXItYXMgY2xlYXItYXNzb2MgYXNzb2Mtc3RhY2sgbWF5YmUtc2V0LWF0CisgICAgICAgICAgICBzdWJzdGl0dXRlIGFzc29jLWZpbHRlciAyY2FjaGUgZGVsZXRlLWF0IGFzc29jLWZpbmQga2V5cworICAgICAgICAgICAgYXNzb2MtYW55PyB1bnppcAorICAgICAgICAgICkKKworICAgICAgICAgIGJ1aWx0aW5zWzpjb21iaW5hdG9yc10gPSBTZXQubmV3ICV3KAorICAgICAgICAgICAgY2FzZSBleGVjdXRlLWVmZmVjdCBuby1jb25kIG5vLWNhc2U/IDNjbGVhdmU+cXVvdCAyY2xlYXZlCisgICAgICAgICAgICBjb25kPnF1b3Qgd3JvbmctdmFsdWVzPyBuby1jb25kPyBjbGVhdmU+cXVvdCBuby1jYXNlIGNhc2U+cXVvdAorICAgICAgICAgICAgM2NsZWF2ZSB3cm9uZy12YWx1ZXMgdG8tZml4ZWQtcG9pbnQgYWxpc3Q+cXVvdCBjYXNlLWZpbmQKKyAgICAgICAgICAgIGNvbmQgY2xlYXZlIGNhbGwtZWZmZWN0IDJjbGVhdmU+cXVvdCByZWN1cnNpdmUtaGFzaGNvZGUKKyAgICAgICAgICAgIGxpbmVhci1jYXNlLXF1b3Qgc3ByZWFkIHNwcmVhZD5xdW90CisgICAgICAgICAgKQorCisgICAgICAgICAgYnVpbHRpbnNbOm1hdGhdID0gU2V0Lm5ldyAldygKKyAgICAgICAgICAgIG51bWJlcj0gaWYtemVybyBuZXh0LXBvd2VyLW9mLTIgZWFjaC1pbnRlZ2VyID8xKworICAgICAgICAgICAgZnAtc3BlY2lhbD8gaW1hZ2luYXJ5LXBhcnQgdW5sZXNzLXplcm8gZmxvYXQ+Yml0cyBudW1iZXI/CisgICAgICAgICAgICBmcC1pbmZpbml0eT8gYmlnbnVtPyBmcC1zbmFuPyBkZW5vbWluYXRvciBmcC1iaXR3aXNlPSAqCisgICAgICAgICAgICArIHBvd2VyLW9mLTI/IC0gdT49IC8gPj0gYml0YW5kIGxvZzItZXhwZWN0cy1wb3NpdGl2ZSA8CisgICAgICAgICAgICBsb2cyID4gaW50ZWdlcj8gbnVtYmVyIGJpdHM+ZG91YmxlIDIvIHplcm8/IChmaW5kLWludGVnZXIpCisgICAgICAgICAgICBiaXRzPmZsb2F0IGZsb2F0PyBzaGlmdCByYXRpbz8gZXZlbj8gcmF0aW8gZnAtc2lnbiBiaXRub3QKKyAgICAgICAgICAgID5maXhudW0gY29tcGxleD8gL2kgL2YgYnl0ZS1hcnJheT5iaWdudW0gd2hlbi16ZXJvIHNnbiA+YmlnbnVtCisgICAgICAgICAgICBuZXh0LWZsb2F0IHU8IHU+IG1vZCByZWNpcCByYXRpb25hbCBmaW5kLWxhc3QtaW50ZWdlciA+ZmxvYXQKKyAgICAgICAgICAgIChhbGwtaW50ZWdlcnM/KSAyXiB0aW1lcyBpbnRlZ2VyIGZpeG51bT8gbmVnIGZpeG51bSBzcSBiaWdudW0KKyAgICAgICAgICAgIChlYWNoLWludGVnZXIpIGJpdD8gZnAtcW5hbj8gZmluZC1pbnRlZ2VyIGNvbXBsZXggPGZwLW5hbj4KKyAgICAgICAgICAgIHJlYWwgZG91YmxlPmJpdHMgYml0b3IgcmVtIGZwLW5hbi1wYXlsb2FkIGFsbC1pbnRlZ2Vycz8KKyAgICAgICAgICAgIHJlYWwtcGFydCBsb2cyLWV4cGVjdHMtcG9zaXRpdmU/IHByZXYtZmxvYXQgYWxpZ24gdW5vcmRlcmVkPworICAgICAgICAgICAgZmxvYXQgZnAtbmFuPyBhYnMgYml0eG9yIHU8PSBvZGQ/IDw9IC9tb2QgcmF0aW9uYWw/ID5pbnRlZ2VyCisgICAgICAgICAgICByZWFsPyBudW1lcmF0b3IKKyAgICAgICAgICApCisKKyAgICAgICAgICBidWlsdGluc1s6c2VxdWVuY2VzXSA9IFNldC5uZXcgJXcoCisgICAgICAgICAgICBtZW1iZXItZXE/IGFwcGVuZCBhc3NlcnQtc2VxdWVuY2U9IGZpbmQtbGFzdC1mcm9tCisgICAgICAgICAgICB0cmltLWhlYWQtc2xpY2UgY2xvbmUtbGlrZSAzc2VxdWVuY2UgYXNzZXJ0LXNlcXVlbmNlPyBtYXAtYXMKKyAgICAgICAgICAgIGxhc3QtaW5kZXgtZnJvbSByZXZlcnNlZCBpbmRleC1mcm9tIGN1dCogcGFkLXRhaWwKKyAgICAgICAgICAgIHJlbW92ZS1lcSEgY29uY2F0LWFzIGJ1dC1sYXN0IHNuaXAgdHJpbS10YWlsIG50aHMKKyAgICAgICAgICAgIG50aCAyc2VsZWN0b3Igc2VxdWVuY2Ugc2xpY2U/ICA8c2xpY2U+IHBhcnRpdGlvbgorICAgICAgICAgICAgcmVtb3ZlLW50aCB0YWlsLXNsaWNlIGVtcHR5PyB0YWlsKiBpZi1lbXB0eQorICAgICAgICAgICAgZmluZC1mcm9tIHZpcnR1YWwtc2VxdWVuY2U/IG1lbWJlcj8gc2V0LWxlbmd0aAorICAgICAgICAgICAgZHJvcC1wcmVmaXggdW5jbGlwIHVuY2xpcC1sYXN0LXNsaWNlIGlvdGEgbWFwLXN1bQorICAgICAgICAgICAgYm91bmRzLWVycm9yPyBzZXF1ZW5jZS1oYXNoY29kZS1zdGVwIHNlbGVjdG9yLWZvcgorICAgICAgICAgICAgYWNjdW11bGF0ZS1hcyBtYXAgc3RhcnQgbWlkcG9pbnRAIChhY2N1bXVsYXRlKSByZXN0LXNsaWNlCisgICAgICAgICAgICBwcmVwZW5kIGZvdXJ0aCBzaWZ0IGFjY3VtdWxhdGUhIG5ldy1zZXF1ZW5jZSBmb2xsb3cgbWFwISBsaWtlCisgICAgICAgICAgICBmaXJzdDQgMXNlcXVlbmNlIHJldmVyc2Ugc2xpY2UgdW5sZXNzLWVtcHR5IHBhZGRpbmcgdmlydHVhbEAKKyAgICAgICAgICAgIHJlcGV0aXRpb24/IHNldC1sYXN0IGluZGV4IDRzZXF1ZW5jZSBtYXgtbGVuZ3RoIHNldC1zZWNvbmQKKyAgICAgICAgICAgIGltbXV0YWJsZS1zZXF1ZW5jZSBmaXJzdDIgZmlyc3QzIHJlcGxpY2F0ZS1hcyByZWR1Y2UtaW5kZXgKKyAgICAgICAgICAgIHVuY2xpcC1zbGljZSBzdXByZW11bSBzdWZmaXghIGluc2VydC1udGggdHJpbS10YWlsLXNsaWNlCisgICAgICAgICAgICB0YWlsIDNhcHBlbmQgc2hvcnQgY291bnQgc3VmZml4IGNvbmNhdCBmbGlwIGZpbHRlciBzdW0KKyAgICAgICAgICAgIGltbXV0YWJsZT8gcmV2ZXJzZSEgMnNlcXVlbmNlIG1hcC1pbnRlZ2VycyBkZWxldGUtYWxsIHN0YXJ0KgorICAgICAgICAgICAgaW5kaWNlcyBzbmlwLXNsaWNlIGNoZWNrLXNsaWNlIHNlcXVlbmNlPyAgaGVhZCBtYXAtZmluZAorICAgICAgICAgICAgZmlsdGVyISBhcHBlbmQtYXMgcmVkdWNlIHNlcXVlbmNlPSBoYWx2ZXMgY29sbGFwc2Utc2xpY2UKKyAgICAgICAgICAgIGludGVybGVhdmUgMm1hcCBmaWx0ZXItYXMgYmluYXJ5LXJlZHVjZSBzbGljZS1lcnJvcj8gcHJvZHVjdAorICAgICAgICAgICAgYm91bmRzLWNoZWNrPyBib3VuZHMtY2hlY2sgaGFydmVzdCBpbW11dGFibGUgdmlydHVhbC1leGVtcGxhcgorICAgICAgICAgICAgZmluZCBwcm9kdWNlIHJlbW92ZSBwYWQtaGVhZCBsYXN0IHJlcGxpY2F0ZSBzZXQtZm91cnRoCisgICAgICAgICAgICByZW1vdmUtZXEgc2hvcnRlbiByZXZlcnNlZD8gIG1hcC1maW5kLWxhc3QgM21hcC1hcworICAgICAgICAgICAgMnVuY2xpcC1zbGljZSBzaG9ydGVyPyAzbWFwIGZpbmQtbGFzdCBoZWFkLXNsaWNlIHBvcCogMm1hcC1hcworICAgICAgICAgICAgdGFpbC1zbGljZSogYnV0LWxhc3Qtc2xpY2UgMm1hcC1yZWR1Y2UgaW90YT8gY29sbGVjdG9yLWZvcgorICAgICAgICAgICAgYWNjdW11bGF0ZSBlYWNoIHNlbGVjdG9yIGFwcGVuZCEgbmV3LXJlc2l6YWJsZSBjdXQtc2xpY2UKKyAgICAgICAgICAgIGVhY2gtaW5kZXggaGVhZC1zbGljZSogMnJldmVyc2UtZWFjaCBzZXF1ZW5jZS1oYXNoY29kZQorICAgICAgICAgICAgcG9wIHNldC1udGggP250aCA8ZmxhdC1zbGljZT4gc2Vjb25kIGpvaW4gd2hlbi1lbXB0eQorICAgICAgICAgICAgY29sbGVjdG9yIGltbXV0YWJsZS1zZXF1ZW5jZT8gPHJldmVyc2VkPiBhbGw/IDNhcHBlbmQtYXMKKyAgICAgICAgICAgIHZpcnR1YWwtc2VxdWVuY2Ugc3Vic2VxPyByZW1vdmUtbnRoISBwdXNoLWVpdGhlciBuZXctbGlrZQorICAgICAgICAgICAgbGVuZ3RoIGxhc3QtaW5kZXggcHVzaC1pZiAyYWxsPyBsZW5ndGhlbiBhc3NlcnQtc2VxdWVuY2UKKyAgICAgICAgICAgIGNvcHkgbWFwLXJlZHVjZSBtb3ZlIHRoaXJkIGZpcnN0IDNlYWNoIHRhaWw/IHNldC1maXJzdCBwcmVmaXgKKyAgICAgICAgICAgIGJvdW5kcy1lcnJvciBhbnk/IDxyZXBldGl0aW9uPiB0cmltLXNsaWNlIGV4Y2hhbmdlIHN1cnJvdW5kCisgICAgICAgICAgICAycmVkdWNlIGN1dCBjaGFuZ2UtbnRoIG1pbi1sZW5ndGggc2V0LXRoaXJkIHByb2R1Y2UtYXMKKyAgICAgICAgICAgIHB1c2gtYWxsIGhlYWQ/IGRlbGV0ZS1zbGljZSByZXN0IHN1bS1sZW5ndGhzIDJlYWNoIGhlYWQqCisgICAgICAgICAgICBpbmZpbXVtIHJlbW92ZSEgZ2x1ZSBzbGljZS1lcnJvciBzdWJzZXEgdHJpbSByZXBsYWNlLXNsaWNlCisgICAgICAgICAgICBwdXNoIHJlcGV0aXRpb24gbWFwLWluZGV4IHRyaW0taGVhZCB1bmNsaXAtbGFzdCBtaXNtYXRjaAorICAgICAgICAgICkKKworICAgICAgICAgIGJ1aWx0aW5zWzpuYW1lc3BhY2VzXSA9IFNldC5uZXcgJXcoCisgICAgICAgICAgICBnbG9iYWwgK0AgY2hhbmdlIHNldC1uYW1lc3RhY2sgY2hhbmdlLWdsb2JhbCBpbml0LW5hbWVzcGFjZXMKKyAgICAgICAgICAgIG9uIG9mZiBzZXQtZ2xvYmFsIG5hbWVzcGFjZSBzZXQgd2l0aC1zY29wZSBiaW5kIHdpdGgtdmFyaWFibGUKKyAgICAgICAgICAgIGluYyBkZWMgY291bnRlciBpbml0aWFsaXplIG5hbWVzdGFjayBnZXQgZ2V0LWdsb2JhbCBtYWtlLWFzc29jCisgICAgICAgICAgKQorCisgICAgICAgICAgYnVpbHRpbnNbOmFycmF5c10gPSBTZXQubmV3ICV3KAorICAgICAgICAgICAgPGFycmF5PiAyYXJyYXkgM2FycmF5IHBhaXIgPmFycmF5IDFhcnJheSA0YXJyYXkgcGFpcj8KKyAgICAgICAgICAgIGFycmF5IHJlc2l6ZS1hcnJheSBhcnJheT8KKyAgICAgICAgICApCisKKyAgICAgICAgICBidWlsdGluc1s6aW9dID0gU2V0Lm5ldyAldygKKyAgICAgICAgICAgICtjaGFyYWN0ZXIrIGJhZC1zZWVrLXR5cGU/IHJlYWRsbiBlYWNoLW1vcnNlbAorICAgICAgICAgICAgc3RyZWFtLXNlZWsgcmVhZCBwcmludCB3aXRoLW91dHB1dC1zdHJlYW0gY29udGVudHMKKyAgICAgICAgICAgIHdyaXRlMSBzdHJlYW0td3JpdGUxIHN0cmVhbS1jb3B5IHN0cmVhbS1lbGVtZW50LXR5cGUKKyAgICAgICAgICAgIHdpdGgtaW5wdXQtc3RyZWFtIHN0cmVhbS1wcmludCBzdHJlYW0tcmVhZCBzdHJlYW0tY29udGVudHMKKyAgICAgICAgICAgIHN0cmVhbS10ZWxsIHRlbGwtb3V0cHV0IGJsIHNlZWstb3V0cHV0IGJhZC1zZWVrLXR5cGUgbmwKKyAgICAgICAgICAgIHN0cmVhbS1ubCB3cml0ZSBmbHVzaCBzdHJlYW0tbGluZXMgK2J5dGUrIHN0cmVhbS1mbHVzaAorICAgICAgICAgICAgcmVhZDEgc2Vlay1hYnNvbHV0ZT8gc3RyZWFtLXJlYWQxIGxpbmVzIHN0cmVhbS1yZWFkbG4KKyAgICAgICAgICAgIHN0cmVhbS1yZWFkLXVudGlsIGVhY2gtbGluZSBzZWVrLWVuZCB3aXRoLW91dHB1dC1zdHJlYW0qCisgICAgICAgICAgICBzZWVrLWFic29sdXRlIHdpdGgtc3RyZWFtcyBzZWVrLWlucHV0IHNlZWstcmVsYXRpdmU/CisgICAgICAgICAgICBpbnB1dC1zdHJlYW0gc3RyZWFtLXdyaXRlIHJlYWQtcGFydGlhbCBzZWVrLWVuZD8KKyAgICAgICAgICAgIHNlZWstcmVsYXRpdmUgZXJyb3Itc3RyZWFtIHJlYWQtdW50aWwgd2l0aC1pbnB1dC1zdHJlYW0qCisgICAgICAgICAgICB3aXRoLXN0cmVhbXMqIHRlbGwtaW5wdXQgZWFjaC1ibG9jayBvdXRwdXQtc3RyZWFtCisgICAgICAgICAgICBzdHJlYW0tcmVhZC1wYXJ0aWFsIGVhY2gtc3RyZWFtLWJsb2NrIGVhY2gtc3RyZWFtLWxpbmUKKyAgICAgICAgICApCisKKyAgICAgICAgICBidWlsdGluc1s6c3RyaW5nc10gPSBTZXQubmV3ICV3KAorICAgICAgICAgICAgcmVzaXplLXN0cmluZyA+c3RyaW5nIDxzdHJpbmc+IDFzdHJpbmcgc3RyaW5nIHN0cmluZz8KKyAgICAgICAgICApCisKKyAgICAgICAgICBidWlsdGluc1s6dmVjdG9yc10gPSBTZXQubmV3ICV3KAorICAgICAgICAgICAgd2l0aC1yZXR1cm4gcmVzdGFydHMgcmV0dXJuLWNvbnRpbnVhdGlvbiB3aXRoLWRhdGFzdGFjaworICAgICAgICAgICAgcmVjb3ZlciByZXRocm93LXJlc3RhcnRzIDxyZXN0YXJ0PiBpZmNjIHNldC1jYXRjaHN0YWNrCisgICAgICAgICAgICA+Y29udGludWF0aW9uPCBjbGVhbnVwIGlnbm9yZS1lcnJvcnMgcmVzdGFydD8KKyAgICAgICAgICAgIGNvbXB1dGUtcmVzdGFydHMgYXR0ZW1wdC1hbGwtZXJyb3IgZXJyb3ItdGhyZWFkCisgICAgICAgICAgICBjb250aW51ZSA8Y29udGludWF0aW9uPiBhdHRlbXB0LWFsbC1lcnJvcj8gY29uZGl0aW9uPworICAgICAgICAgICAgPGNvbmRpdGlvbj4gdGhyb3ctcmVzdGFydHMgZXJyb3IgY2F0Y2hzdGFjayBjb250aW51ZS13aXRoCisgICAgICAgICAgICB0aHJlYWQtZXJyb3ItaG9vayBjb250aW51YXRpb24gcmV0aHJvdyBjYWxsY2MxCisgICAgICAgICAgICBlcnJvci1jb250aW51YXRpb24gY2FsbGNjMCBhdHRlbXB0LWFsbCBjb25kaXRpb24KKyAgICAgICAgICAgIGNvbnRpbnVhdGlvbj8gcmVzdGFydCByZXR1cm4KKyAgICAgICAgICApCisKKyAgICAgICAgICBidWlsdGluc1s6Y29udGludWF0aW9uc10gPSBTZXQubmV3ICV3KAorICAgICAgICAgICAgd2l0aC1yZXR1cm4gcmVzdGFydHMgcmV0dXJuLWNvbnRpbnVhdGlvbiB3aXRoLWRhdGFzdGFjaworICAgICAgICAgICAgcmVjb3ZlciByZXRocm93LXJlc3RhcnRzIDxyZXN0YXJ0PiBpZmNjIHNldC1jYXRjaHN0YWNrCisgICAgICAgICAgICA+Y29udGludWF0aW9uPCBjbGVhbnVwIGlnbm9yZS1lcnJvcnMgcmVzdGFydD8KKyAgICAgICAgICAgIGNvbXB1dGUtcmVzdGFydHMgYXR0ZW1wdC1hbGwtZXJyb3IgZXJyb3ItdGhyZWFkCisgICAgICAgICAgICBjb250aW51ZSA8Y29udGludWF0aW9uPiBhdHRlbXB0LWFsbC1lcnJvcj8gY29uZGl0aW9uPworICAgICAgICAgICAgPGNvbmRpdGlvbj4gdGhyb3ctcmVzdGFydHMgZXJyb3IgY2F0Y2hzdGFjayBjb250aW51ZS13aXRoCisgICAgICAgICAgICB0aHJlYWQtZXJyb3ItaG9vayBjb250aW51YXRpb24gcmV0aHJvdyBjYWxsY2MxCisgICAgICAgICAgICBlcnJvci1jb250aW51YXRpb24gY2FsbGNjMCBhdHRlbXB0LWFsbCBjb25kaXRpb24KKyAgICAgICAgICAgIGNvbnRpbnVhdGlvbj8gcmVzdGFydCByZXR1cm4KKyAgICAgICAgICApCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisKKyAgICAgICAgcnVsZSAvKDp8Ojp8TUFDUk86fE1FTU86fEdFTkVSSUM6fEhFTFA6KShccyspKFxTKykvbSBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0LCBOYW1lOjpGdW5jdGlvbgorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oTTp8SE9PSzp8R0VORVJJQyMpKFxzKykoXFMrKShccyspKFxTKykvbSBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0LCBOYW1lOjpDbGFzcywgVGV4dCwgTmFtZTo6RnVuY3Rpb24KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXCgoPz1ccykvLCBOYW1lOjpGdW5jdGlvbiwgOnN0YWNrX2VmZmVjdAorICAgICAgICBydWxlIC87KD89XHMpLywgS2V5d29yZAorCisgICAgICAgIHJ1bGUgLyhVU0lORzopKCg/OlxzfFxcXHMpKykvbSBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpOYW1lc3BhY2UsIFRleHQKKyAgICAgICAgICBwdXNoIDppbXBvcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKElOOnxVU0U6fFVOVVNFOnxRVUFMSUZJRUQ6fFFVQUxJRklFRC1XSVRIOikoXHMrKShcUyspL20gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6TmFtZXNwYWNlLCBUZXh0LCBOYW1lOjpOYW1lc3BhY2UKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKEZST006fEVYQ0xVREU6KShccyspKFxTKykoXHMrKSg9PikvbSBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpOYW1lc3BhY2UsIFRleHQsIE5hbWU6Ok5hbWVzcGFjZSwgVGV4dCwgUHVuY3R1YXRpb24KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKD86QUxJQVN8REVGRVJ8Rk9SR0VUfFBPU1RQT05FKTovLCBLZXl3b3JkOjpOYW1lc3BhY2UKKworICAgICAgICBydWxlIC8oVFVQTEU6KShccyspKFxTKykoXHMrKSg8KShccyspKFxTKykvbSBkbworICAgICAgICAgIGdyb3VwcygKKyAgICAgICAgICAgIEtleXdvcmQsIFRleHQsCisgICAgICAgICAgICBOYW1lOjpDbGFzcywgVGV4dCwKKyAgICAgICAgICAgIFB1bmN0dWF0aW9uLCBUZXh0LAorICAgICAgICAgICAgTmFtZTo6Q2xhc3MKKyAgICAgICAgICApCisgICAgICAgICAgcHVzaCA6c2xvdHMKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKFRVUExFOikoXHMrKShcUyspL20gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dCwgTmFtZTo6Q2xhc3MKKyAgICAgICAgICBwdXNoIDpzbG90cworICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oVU5JT046fElOVEVSU0VDVElPTjopKFxzKykoXFMrKS9tIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIE5hbWU6OkNsYXNzCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhQUkVESUNBVEU6KShccyspKFxTKykoXHMrKSg8KShccyspKFxTKykvbSBkbworICAgICAgICAgIGdyb3VwcygKKyAgICAgICAgICAgIEtleXdvcmQsIFRleHQsCisgICAgICAgICAgICBOYW1lOjpDbGFzcywgVGV4dCwKKyAgICAgICAgICAgIFB1bmN0dWF0aW9uLCBUZXh0LAorICAgICAgICAgICAgTmFtZTo6Q2xhc3MKKyAgICAgICAgICApCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhDOikoXHMrKShcUyspKFxzKykoXFMrKS9tIGRvCisgICAgICAgICAgZ3JvdXBzKAorICAgICAgICAgICAgS2V5d29yZCwgVGV4dCwKKyAgICAgICAgICAgIE5hbWU6OkZ1bmN0aW9uLCBUZXh0LAorICAgICAgICAgICAgTmFtZTo6Q2xhc3MKKyAgICAgICAgICApCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgJXIoCisgICAgICAgICAgKElOU1RBTkNFfFNMT1R8TUlYSU58U0lOR0xFVE9OUz98Q09OU1RBTlR8U1lNQk9MUz98RVJST1J8U1lOVEFYCisgICAgICAgICAgIHxBTElFTnxUWVBFREVGfEZVTkNUSU9OfFNUUlVDVCk6CisgICAgICAgICl4LCBLZXl3b3JkCisKKyAgICAgICAgcnVsZSAvKD86PFBSSVZBVEV8UFJJVkFURT4pLywgS2V5d29yZDo6TmFtZXNwYWNlCisKKyAgICAgICAgcnVsZSAvKE1BSU46KShccyspKFxTKykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQ6Ok5hbWVzcGFjZSwgVGV4dCwgTmFtZTo6RnVuY3Rpb24KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBzdHJpbmdzCisgICAgICAgIHJ1bGUgLyIiIlxzKy4qP1xzKyIiIi8sIFN0cgorICAgICAgICBydWxlIC8iKFxcLnxbXlxcXSkqPyIvLCBTdHIKKyAgICAgICAgcnVsZSAvKENIQVI6KShccyspKFxcW1xcYWJmbnJzdHZdKnxcUykoPz1ccykvLCBTdHI6OkNoYXIKKworICAgICAgICAjIGNvbW1lbnRzCisgICAgICAgIHJ1bGUgLyFccysuKiQvLCBDb21tZW50CisgICAgICAgIHJ1bGUgLyMhXHMrLiokLywgQ29tbWVudAorCisgICAgICAgICMgYm9vbGVhbnMKKyAgICAgICAgcnVsZSAvW3RmXSg/PVxzKS8sIE5hbWU6OkNvbnN0YW50CisKKyAgICAgICAgIyBudW1iZXJzCisgICAgICAgIHJ1bGUgLy0/XGQrXC5cZCsoPz1ccykvLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLy0/XGQrKD89XHMpLywgTnVtOjpJbnRlZ2VyCisKKyAgICAgICAgcnVsZSAvSEVYOlxzK1thLWZBLUZcZF0rKD89XHMpL20sIE51bTo6SGV4CisgICAgICAgIHJ1bGUgL0JJTjpccytbMDFdKyg/PVxzKS8sIE51bTo6QmluCisgICAgICAgIHJ1bGUgL09DVDpccytbMC03XSsoPz1ccykvLCBOdW06Ok9jdAorCisgICAgICAgIHJ1bGUgJXIoWy0rLyo9PD5eXSg/PVxzKSksIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvKD86ZGVwcmVjYXRlZHxmaW5hbHxmb2xkYWJsZXxmbHVzaGFibGV8aW5saW5lfHJlY3Vyc2l2ZSkoPz1ccykvLAorICAgICAgICAgIEtleXdvcmQKKworICAgICAgICBydWxlIC9cUysvIGRvIHxtfAorICAgICAgICAgIG5hbWUgPSBtWzBdCisKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmJ1aWx0aW5zLnZhbHVlcy5hbnk/IHsgfGJ8IGIuaW5jbHVkZT8gbmFtZSB9CisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RhY2tfZWZmZWN0IGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvXCgvLCBOYW1lOjpGdW5jdGlvbiwgOnN0YWNrX2VmZmVjdAorICAgICAgICBydWxlIC9cKS8sIE5hbWU6OkZ1bmN0aW9uLCA6cG9wIQorCisgICAgICAgIHJ1bGUgLy0tLywgTmFtZTo6RnVuY3Rpb24KKyAgICAgICAgcnVsZSAvXFMrLywgTmFtZTo6VmFyaWFibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c2xvdHMgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC87KD89XHMpLywgS2V5d29yZCwgOnBvcCEKKyAgICAgICAgcnVsZSAvXFMrLywgTmFtZTo6VmFyaWFibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW1wb3J0IGRvCisgICAgICAgIHJ1bGUgLzsoPz1ccykvLCBLZXl3b3JkLCA6cG9wIQorICAgICAgICBydWxlIC9ccysvLCBUZXh0CisgICAgICAgIHJ1bGUgL1xTKy8sIE5hbWU6Ok5hbWVzcGFjZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9mb3J0cmFuLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZm9ydHJhbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjA0ZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZm9ydHJhbi5yYgpAQCAtMCwwICsxLDE0MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworIyB2aW06IHNldCB0cz0yIHN3PTIgZXQ6CisKKyMgVE9ETzogSW1wbGVtZW50IGZvcm1hdCBsaXN0IHN1cHBvcnQuCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgRm9ydHJhbiA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJGb3J0cmFuIgorICAgICAgZGVzYyAiRm9ydHJhbiA5NSBQcm9ncmFtbWluZyBMYW5ndWFnZSIKKworICAgICAgdGFnICdmb3J0cmFuJworICAgICAgZmlsZW5hbWVzICcqLmY5MCcsICcqLmY5NScsCisgICAgICAgICAgICAgICAgJyouRjkwJywgJyouRjk1JworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtZm9ydHJhbicKKworICAgICAgbmFtZSA9IC9bQS1aXVtfQS1aMC05XSovaQorICAgICAga2luZF9wYXJhbSA9IC8oXGQrfCN7bmFtZX0pLworICAgICAgZXhwb25lbnQgPSAvW0VEXVsrLV1cZCsvCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgICMgRm9ydHJhbiBhbGxvd3MgdG8gb21pdCB3aGl0ZXNwYWNlIGJldHdlZW4gY2VydGFpbiBrZXl3b3Jkcy4uLgorICAgICAgICBAa2V5d29yZHMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgYWxsb2NhdGFibGUgYWxsb2NhdGUgYXNzaWdubWVudCBiYWNrc3BhY2UgYmxvY2sgYmxvY2tkYXRhIGNhbGwgY2FzZQorICAgICAgICAgIGNsb3NlIGNvbW1vbiBjb250YWlucyBjb250aW51ZSBjeWNsZSBkYXRhIGRlYWxsb2NhdGUgZGVmYXVsdAorICAgICAgICAgIGRpbWVuc2lvbiBkbyBlbGVtZW50YWwgZWxzZSBlbHNlaWYgZWxzZXdoZXJlIGVuZCBlbmRibG9ja2RhdGEgZW5kZG8KKyAgICAgICAgICBlbmRmaWxlIGVuZGZvcmFsbCBlbmRmdW5jdGlvbiBlbmRpZiBlbmRpbnRlcmZhY2UgZW5kbW9kdWxlIGVuZHByb2dyYW0KKyAgICAgICAgICBlbmRzZWxlY3QgZW5kc3Vicm91dGluZSBlbmR0eXBlIGVuZHdoZXJlIGVudHJ5IGVxdWl2YWxlbmNlIGV4aXQKKyAgICAgICAgICBleHRlcm5hbCBmb3JhbGwgZm9ybWF0IGZ1bmN0aW9uIGdvIGdvdG8gaWYgaW1wbGljaXQgaW4gaW5jbHVkZSBpbm91dAorICAgICAgICAgIGlucXVpcmUgaW50ZW50IGludGVyZmFjZSBpbnRyaW5zaWMgbW9kdWxlIG5hbWVsaXN0IG5vbmUgbnVsbGlmeSBvbmx5CisgICAgICAgICAgb3BlbiBvcGVyYXRvciBvcHRpb25hbCBvdXQgcGFyYW1ldGVyIHBvaW50ZXIgcHJpbnQgcHJpdmF0ZSBwcm9jZWR1cmUKKyAgICAgICAgICBwcm9ncmFtIHB1YmxpYyBwdXJlIHJlYWQgcmVjdXJzaXZlIHJlc3VsdCByZXR1cm4gcmV3aW5kIHNhdmUgc2VsZWN0CisgICAgICAgICAgc2VsZWN0Y2FzZSBzZXF1ZW5jZSBzdG9wIHN1YnJvdXRpbmUgdGFyZ2V0IHRoZW4gdG8gdHlwZSB1c2Ugd2hlcmUKKyAgICAgICAgICB3aGlsZSB3cml0ZQorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudHlwZXMKKyAgICAgICAgQHR5cGVzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGNoYXJhY3RlciBjb21wbGV4IGRvdWJsZSBwcmVjaXNpb24gZG91YmxlcHJlY2lzaW9uIGludGVnZXIgbG9naWNhbCByZWFsCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5pbnRyaW5zaWNzCisgICAgICAgIEBpbnRyaW5zaWNzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGFicyBhY2hhciBhY29zIGFkanVzdGwgYWRqdXN0ciBhaW1hZyBhaW50IGFsbCBhbGxvY2F0ZWQgYW5pbnQgYW55CisgICAgICAgICAgYXNpbiBhc3NvY2lhdGVkIGF0YW4gYXRhbjIgYml0X3NpemUgYnRlc3QgY2VpbGluZyBjaGFyIGNtcGx4IGNvbmpnCisgICAgICAgICAgY29zIGNvc2ggY291bnQgY3B1X3RpbWUgY3NoaWZ0IGRhdGVfYW5kX3RpbWUgZGJsZSBkaWdpdHMgZGltCisgICAgICAgICAgZG90X3Byb2R1Y3QgZHByb2QgZW9zaGlmdCBlcHNpbG9uIGV4cCBleHBvbmVudCBmbG9vciBmcmFjdGlvbiBodWdlCisgICAgICAgICAgaWFjaGFyIGlhbmQgaWJjbHIgaWJpdHMgaWJzZXQgaWNoYXIgaWVvciBpbmRleCBpbnQgaW9yIGlzaGlmdCBpc2hpZnRjCisgICAgICAgICAga2luZCBsYm91bmQgbGVuIGxlbl90cmltIGxnZSBsZ3QgbGxlIGxsdCBsb2cgbG9nMTAgbG9naWNhbCBtYXRtdWwgbWF4CisgICAgICAgICAgbWF4ZXhwb25lbnQgbWF4bG9jIG1heHZhbCBtZXJnZSBtaW4gbWluZXhwb25lbnQgbWlubG9jIG1pbnZhbCBtb2QKKyAgICAgICAgICBtb2R1bG8gbXZiaXRzIG5lYXJlc3QgbmludCBub3QgbnVsbCBwYWNrIHByZWNpc2lvbiBwcmVzZW50IHByb2R1Y3QKKyAgICAgICAgICByYWRpeCByYW5kb21fbnVtYmVyIHJhbmRvbV9zZWVkIHJhbmdlIHJlYWwgcmVwZWF0IHJlc2hhcGUgcnJzcGFjaW5nCisgICAgICAgICAgc2NhbGUgc2NhbiBzZWxlY3RlZF9pbnRfa2luZCBzZWxlY3RlZF9yZWFsX2tpbmQgc2V0X2V4cG9uZW50IHNoYXBlCisgICAgICAgICAgc2lnbiBzaW4gc2luaCBzaXplIHNwYWNpbmcgc3ByZWFkIHNxcnQgc3VtIHN5c3RlbV9jbG9jayB0YW4gdGFuaCB0aW55CisgICAgICAgICAgdHJhbnNmZXIgdHJhbnNwb3NlIHRyaW0gdWJvdW5kIHVucGFjayB2ZXJpZnkKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1tcc1xuXSsvLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgLyEuKiQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXiMuKiQvLCBDb21tZW50OjpQcmVwcm9jCisKKyAgICAgICAgcnVsZSAvOjp8WygpXC87LDomXS8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgIyBUT0RPOiBUaGlzIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IGxpbmUgY29udGludWF0aW9uLgorICAgICAgICBydWxlIC9eKFxzKikoWzAtOV0rKVxiL20gZG8gfG18CisgICAgICAgICAgdG9rZW4gVGV4dDo6V2hpdGVzcGFjZSwgbVsxXQorICAgICAgICAgIHRva2VuIE5hbWU6OkxhYmVsLCBtWzJdCisgICAgICAgIGVuZAorCisgICAgICAgICMgRm9ybWF0IHN0YXRlbWVudHMgYXJlIHF1aXRlIGEgc3RyYW5nZSBiZWFzdC4KKyAgICAgICAgIyBCZXR0ZXIgcHJvY2VzcyB0aGVtIGluIHRoZWlyIG93biBzdGF0ZS4KKyAgICAgICAgcnVsZSAvXGIoRk9STUFUKShccyopKFwoKS9taSBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBLZXl3b3JkLCBtWzFdCisgICAgICAgICAgdG9rZW4gVGV4dDo6V2hpdGVzcGFjZSwgbVsyXQorICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uLCBtWzNdCisgICAgICAgICAgcHVzaCA6Zm9ybWF0X3NwZWMKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAlcigKKyAgICAgICAgICBbKy1dPyAjIHNpZ24KKyAgICAgICAgICAoCisgICAgICAgICAgICAoXGQrWy5dXGQqfFsuXVxkKykoI3tleHBvbmVudH0pPworICAgICAgICAgICAgfCBcZCsje2V4cG9uZW50fSAjIGV4cG9uZW50IGlzIG1hbmRhdG9yeQorICAgICAgICAgICkKKyAgICAgICAgICAoXyN7a2luZF9wYXJhbX0pPyAjIGtpbmQgcGFyYW1ldGVyCisgICAgICAgICl4aSwgTnVtOjpGbG9hdAorCisgICAgICAgIHJ1bGUgL1srLV0/XGQrKF8je2tpbmRfcGFyYW19KT8vaSwgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgL0InWzAxXSsnfEIiWzAxXSsiL2ksIE51bTo6QmluCisgICAgICAgIHJ1bGUgL08nWzAtN10rJ3xPIlswLTddKyIvaSwgTnVtOjpPY3QKKyAgICAgICAgcnVsZSAvWidbMC05QS1GXSsnfFoiWzAtOUEtRl0rIi9pLCBOdW06OkhleAorICAgICAgICBydWxlIC8oI3traW5kX3BhcmFtfV8pPycvLCBTdHI6OlNpbmdsZSwgOnN0cmluZ19zaW5nbGUKKyAgICAgICAgcnVsZSAvKCN7a2luZF9wYXJhbX1fKT8iLywgU3RyOjpEb3VibGUsIDpzdHJpbmdfZG91YmxlCisgICAgICAgIHJ1bGUgL1suXShUUlVFfEZBTFNFKVsuXShfI3traW5kX3BhcmFtfSk/L2ksIEtleXdvcmQ6OkNvbnN0YW50CisKKyAgICAgICAgcnVsZSAlcntcKlwqfC8vfD09fC89fDw9fD49fD0+fFstKyovPD49JV19LCBPcGVyYXRvcgorICAgICAgICBydWxlIC9cLig/OkVRfE5FfExUfExFfEdUfEdFfE5PVHxBTkR8T1J8RVFWfE5FUVZ8W0EtWl0rKVwuL2ksIE9wZXJhdG9yOjpXb3JkCisKKyAgICAgICAgcnVsZSAvI3tuYW1lfS9tIGRvIHxtfAorICAgICAgICAgIG1hdGNoID0gbVswXS5kb3duY2FzZQorICAgICAgICAgIGlmIHNlbGYuY2xhc3Mua2V5d29yZHMuaW5jbHVkZT8gbWF0Y2gKKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLnR5cGVzLmluY2x1ZGU/IG1hdGNoCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpUeXBlCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5pbnRyaW5zaWNzLmluY2x1ZGU/IG1hdGNoCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmdfc2luZ2xlIGRvCisgICAgICAgIHJ1bGUgL1teJ10rLywgU3RyOjpTaW5nbGUKKyAgICAgICAgcnVsZSAvJycvLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC8nLywgU3RyOjpTaW5nbGUsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ19kb3VibGUgZG8KKyAgICAgICAgcnVsZSAvW14iXSsvLCBTdHI6OkRvdWJsZQorICAgICAgICBydWxlIC8iIi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Zm9ybWF0X3NwZWMgZG8KKyAgICAgICAgcnVsZSAvJy8sIFN0cjo6U2luZ2xlLCA6c3RyaW5nX3NpbmdsZQorICAgICAgICBydWxlIC8iLywgU3RyOjpEb3VibGUsIDpzdHJpbmdfZG91YmxlCisgICAgICAgIHJ1bGUgL1woLywgUHVuY3R1YXRpb24sIDpmb3JtYXRfc3BlYworICAgICAgICBydWxlIC9cKS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBydWxlIC8sLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvW1xzXG5dKy8sIFRleHQ6OldoaXRlc3BhY2UKKyAgICAgICAgIyBFZGl0IGRlc2NyaXB0b3JzIGNvdWxkIGJlIHNlZW4gYXMgYSBraW5kIG9mICJmb3JtYXQgbGl0ZXJhbCIuCisgICAgICAgIHJ1bGUgL1teXHMnIigpLF0rLywgTGl0ZXJhbAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9naGVya2luLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ2hlcmtpbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWRlZTVlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ2hlcmtpbi5yYgpAQCAtMCwwICsxLDEzNyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIEdoZXJraW4gPCBSZWdleExleGVyCisgICAgICB0YWcgJ2doZXJraW4nCisgICAgICBhbGlhc2VzICdjdWN1bWJlcicsICdiZWhhdCcKKworICAgICAgdGl0bGUgIkdoZXJraW4iCisgICAgICBkZXNjICdBIGJ1c2luZXNzLXJlYWRhYmxlIHNwZWMgRFNMICggZ2l0aHViLmNvbS9jdWN1bWJlci9jdWN1bWJlci93aWtpL0doZXJraW4gKScKKworICAgICAgZmlsZW5hbWVzICcqLmZlYXR1cmUnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1naGVya2luJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAnY3VjdW1iZXInCisgICAgICBlbmQKKworICAgICAgIyBzZWxmLW1vZGlmeWluZyBtZXRob2QgdGhhdCBsb2FkcyB0aGUga2V5d29yZHMgZmlsZQorICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgbG9hZCBQYXRobmFtZS5uZXcoX19GSUxFX18pLmRpcm5hbWUuam9pbignZ2hlcmtpbi9rZXl3b3Jkcy5yYicpCisgICAgICAgIGtleXdvcmRzCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuc3RlcF9yZWdleAorICAgICAgICAjIGluIEdoZXJraW4ncyBjb25maWcsIGtleXdvcmRzIHRoYXQgZW5kIGluIDwgZG9uJ3QKKyAgICAgICAgIyBuZWVkIHdvcmQgYm91bmRhcmllcyBhdCB0aGUgZW5kcyAtIGFsbCBvdGhlcnMgZG8uCisgICAgICAgIEBzdGVwX3JlZ2V4IHx8PSBSZWdleHAubmV3KAorICAgICAgICAgIGtleXdvcmRzWzpzdGVwXS5tYXAgZG8gfHd8CisgICAgICAgICAgICBpZiB3LmVuZF93aXRoPyAnPCcKKyAgICAgICAgICAgICAgUmVnZXhwLmVzY2FwZSh3LmNob3ApCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICIje1JlZ2V4cC5lc2NhcGUodyl9XFxiIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kLmpvaW4oJ3wnKQorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgcmVzdF9vZl9saW5lID0gLy4qPyg/PVsjXG5dKS8KKworICAgICAgc3RhdGUgOmJhc2ljIGRvCisgICAgICAgIHJ1bGUgJXIoIy4qJCksIENvbW1lbnQKKyAgICAgICAgcnVsZSAvWyBcclx0XSsvLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOmJhc2ljCisgICAgICAgIHJ1bGUgJXIoXG4pLCBUZXh0CisgICAgICAgIHJ1bGUgJXIoIiIiLio/IiIiKW0sIFN0cgorICAgICAgICBydWxlICVyKEBbXlxzQF0rKSwgTmFtZTo6VGFnCisgICAgICAgIG1peGluIDpoYXNfdGFibGUKKyAgICAgICAgbWl4aW4gOmhhc19leGFtcGxlcworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpoYXNfc2NlbmFyaW9zIGRvCisgICAgICAgIHJ1bGUgJXIoKC4qPykoOikpIGRvIHxtfAorICAgICAgICAgIHJlc2V0X3N0YWNrCisKKyAgICAgICAgICBrZXl3b3JkID0gbVsxXQorICAgICAgICAgIGtleXdvcmRfdG9rID0gaWYgc2VsZi5jbGFzcy5rZXl3b3Jkc1s6ZWxlbWVudF0uaW5jbHVkZT8ga2V5d29yZAorICAgICAgICAgICAgcHVzaCA6ZGVzY3JpcHRpb247IEtleXdvcmQ6Ok5hbWVzcGFjZQorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3Mua2V5d29yZHNbOmZlYXR1cmVdLmluY2x1ZGU/IGtleXdvcmQKKyAgICAgICAgICAgIHB1c2ggOmZlYXR1cmVfZGVzY3JpcHRpb247IEtleXdvcmQ6OkRlY2xhcmF0aW9uCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5rZXl3b3Jkc1s6ZXhhbXBsZXNdLmluY2x1ZGU/IGtleXdvcmQKKyAgICAgICAgICAgIHB1c2ggOmV4YW1wbGVfZGVzY3JpcHRpb247IE5hbWU6Ok5hbWVzcGFjZQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVycm9yCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBncm91cHMga2V5d29yZF90b2ssIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpoYXNfZXhhbXBsZXMgZG8KKyAgICAgICAgbWl4aW4gOmhhc19zY2VuYXJpb3MKKyAgICAgICAgcnVsZSBHaGVya2luLnN0ZXBfcmVnZXgsIE5hbWU6OkZ1bmN0aW9uIGRvCisgICAgICAgICAgdG9rZW4gTmFtZTo6RnVuY3Rpb24KKyAgICAgICAgICByZXNldF9zdGFjazsgcHVzaCA6c3RlcAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aGFzX3RhYmxlIGRvCisgICAgICAgIHJ1bGUoLyg/PVt8XSkvKSB7IHB1c2ggOnRhYmxlX2hlYWRlciB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRhYmxlX2hlYWRlciBkbworICAgICAgICBydWxlIC9bXnxcc10rLywgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgcnVsZSAvXG4vIGRvCisgICAgICAgICAgdG9rZW4gVGV4dAorICAgICAgICAgIGdvdG8gOnRhYmxlCisgICAgICAgIGVuZAorICAgICAgICBtaXhpbiA6dGFibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dGFibGUgZG8KKyAgICAgICAgbWl4aW4gOmJhc2ljCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnRhYmxlX2JvbAorICAgICAgICBydWxlIC9bfF0vLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC9bXnxcc10rLywgTmFtZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp0YWJsZV9ib2wgZG8KKyAgICAgICAgcnVsZSgvKD89XHMqW15cc3xdKS8pIHsgcmVzZXRfc3RhY2sgfQorICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkZXNjcmlwdGlvbiBkbworICAgICAgICBtaXhpbiA6YmFzaWMKKyAgICAgICAgbWl4aW4gOmhhc19leGFtcGxlcworICAgICAgICBydWxlIC9cbi8sIFRleHQKKyAgICAgICAgcnVsZSByZXN0X29mX2xpbmUsIFRleHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZmVhdHVyZV9kZXNjcmlwdGlvbiBkbworICAgICAgICBtaXhpbiA6YmFzaWMKKyAgICAgICAgbWl4aW4gOmhhc19zY2VuYXJpb3MKKyAgICAgICAgcnVsZSAvXG4vLCBUZXh0CisgICAgICAgIHJ1bGUgcmVzdF9vZl9saW5lLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmV4YW1wbGVfZGVzY3JpcHRpb24gZG8KKyAgICAgICAgbWl4aW4gOmJhc2ljCisgICAgICAgIG1peGluIDpoYXNfdGFibGUKKyAgICAgICAgcnVsZSAvXG4vLCBUZXh0CisgICAgICAgIHJ1bGUgcmVzdF9vZl9saW5lLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0ZXAgZG8KKyAgICAgICAgbWl4aW4gOmJhc2ljCisgICAgICAgIHJ1bGUgLzwuKj8+LywgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgcnVsZSAvIi4qPyIvLCBTdHIKKyAgICAgICAgcnVsZSAvXFMrLywgVGV4dAorICAgICAgICBydWxlIHJlc3Rfb2ZfbGluZSwgVGV4dCwgOnBvcCEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ2hlcmtpbi9rZXl3b3Jkcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2doZXJraW4va2V5d29yZHMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1YWIzNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2doZXJraW4va2V5d29yZHMucmIKQEAgLTAsMCArMSwxNCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBgcmFrZSBidWlsdGluczpnaGVya2luYAorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBkZWYgR2hlcmtpbi5rZXl3b3JkcworICAgICAgQGtleXdvcmRzIHx8PSB7fS50YXAgZG8gfGt8CisgICAgICAgIGtbOmZlYXR1cmVdID0gU2V0Lm5ldyBbIkFiaWxpdHkiLCAiQWhveSBtYXRleSEiLCAiQXJ3ZWRkIiwgIkFzcGVrdCIsICJCZXNpZ2hlaWQgQmVob2VmdGUiLCAiQnVzaW5lc3MgTmVlZCIsICJDYXJhY3RlcmlzdGljYSIsICJDYXJhY3RlcsOtc3RpY2EiLCAiRWdlbnNrYWIiLCAiRWdlbnNrYXAiLCAiRWlnaW5sZWlraSIsICJGZWF0dXJlIiwgIkZpdHVyIiwgIkZvbmN0aW9ubmFsaXTDqSIsICJGb25rc3lvbmFsaXRlIiwgIkZ1bmNpb25hbGlkYWRlIiwgIkZ1bmNpb25hbGl0YXQiLCAiRnVuY3Rpb25hbGl0YXRlIiwgIkZ1bmN0aW9uYWxpdGVpdCIsICJGdW5jxaNpb25hbGl0YXRlIiwgIkZ1bmPIm2lvbmFsaXRhdGUiLCAiRnVuZ3NpIiwgIkZ1bmtjaWEiLCAiRnVua2NpamEiLCAiRnVua2Npb25hbGl0xIF0ZSIsICJGdW5rY2lvbmFsbm9zdCIsICJGdW5rY2phIiwgIkZ1bmtzaWUiLCAiRnVua3Rpb25hbGl0w6R0IiwgIkZ1bmt0aW9uYWxpdMOpaXQiLCAiRnVuemlvbmFsaXTDoCIsICJGxKvEjWEiLCAiSHdhZXQiLCAiSHfDpnQiLCAiSmVsbGVtesWRIiwgIkthcmFrdGVyaXN0aWsiLCAiTGFzdG5vc3QiLCAiTWFrIiwgIk1vZ3Vjbm9zdCIsICJNb2d1xIdub3N0IiwgIk1vem5vc3RpIiwgIk1vxb5ub3N0aSIsICJPSCBIQUkiLCAiT21hZHVzIiwgIk9taW5haXN1dXMiLCAiT3NvYmluYSIsICJQb3RyemViYSBiaXpuZXNvd2EiLCAiUG/FvmFkYXZlayIsICJQb8W+aWFkYXZrYSIsICJQcmV0dHkgbXVjaCIsICJRYXAiLCAiUXUnbWVIICd1dCIsICJTYXZ5YsSXIiwgIlRyYWp0byIsICJUw61uaCBuxINuZyIsICJWZXJtb8OrIiwgIlZsYXN0bm9zxaUiLCAiV8WCYcWbY2l3b8WbxIciLCAiWm5hxI1pbG5vc3QiLCAibGFIIiwgInBlcmJvZ2giLCAicG9RYm9naCBtYWxqYSciLCAiw5Z6ZWxsaWsiLCAizpTPhc69zrHPhM+Mz4TOt8+EzrEiLCAizpvOtc65z4TOv8+Fz4HOs86vzrEiLCAi0JzQvtCz0YPRm9C90L7RgdGCIiwgItCc06nQvNC60LjQvdC70LXQuiIsICLQntGB0L7QsdC40L3QsCIsICLQodCy0L7QudGB0YLQstC+IiwgItCk0YPQvdC60YbQuNC+0L3QsNC7IiwgItCk0YPQvdC60YbQuNC+0L3QsNC70L3QvtGB0YIiLCAi0KTRg9C90LrRhtC40Y8iLCAi0KTRg9C90LrRhtGW0L7QvdCw0LsiLCAi0q7Qt9C10L3Rh9OZ0LvQtdC60LvQtdC70LXQuiIsICLXqteb15XXoNeUIiwgItiu2KfYtdmK2KkiLCAi2K7YtdmI2LXbjNiqIiwgIti12YTYp9it24zYqiIsICLZiNmQ24zamNqv24wiLCAi2qnYp9ix2YjYqNin2LEg2qnbjCDYttix2YjYsdiqIiwgIuCksOClguCkqiDgpLLgpYfgpJYiLCAi4KiW4Ki+4Ki44KmA4KiF4KikIiwgIuCoqOColeCotiDgqKjgqYHgqLngqL7gqLAiLCAi4Kiu4KmB4Ki54Ki+4KiC4Kim4Kiw4Ki+IiwgIuCwl+CxgeCwo+CwruCxgSIsICLgsrngs4bgsprgs43gsprgsrMiLCAi4LiE4Lin4Liy4Lih4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LiX4Liy4LiH4LiY4Li44Lij4LiB4Li04LiIIiwgIuC4hOC4p+C4suC4oeC4quC4suC4oeC4suC4o+C4liIsICLguYLguITguKPguIfguKvguKXguLHguIEiLCAi44OV44Kj44O844OB44OjIiwgIuWKn+iDvSIsICLmqZ/og70iLCAi6riw64qlIl0KKyAgICAgICAga1s6ZWxlbWVudF0gPSBTZXQubmV3IFsiQWJzdHJhY3QgU2NlbmFyaW8iLCAiQWJzdHJha3QgU2NlbmFyaW8iLCAiQWNodGVyZ3JvbmQiLCAiQWVyIiwgIkFndGVyZ3JvbmQiLCAiQWxsIHknYWxsIiwgIkFudGVjZWRlbnRlcyIsICJBbnRlY2VkZW50cyIsICJBdGJ1csOwYXLDoXMiLCAiQXd3dywgbG9vayBtYXRlIiwgIkI0IiwgIkJhY2tncm91bmQiLCAiQmFnZ3J1bmQiLCAiQmFrZ3J1bmQiLCAiQmFrZ3J1bm4iLCAiQmFrZ3J1bm51ciIsICJC4buRaSBj4bqjbmgiLCAiQ2VmbmRpciIsICJDZW5hcmlvIiwgIkNlbmFyaW8gZGUgRnVuZG8iLCAiQ2Vuw6FyaW8iLCAiQ2Vuw6FyaW8gZGUgRnVuZG8iLCAiQ29udGVzdG8iLCAiQ29udGV4dCIsICJDb250ZXh0ZSIsICJDb250ZXh0byIsICJEYXNhciIsICJEZWxpbmVhY2FvIGRvIENlbmFyaW8iLCAiRGVsaW5lYcOnw6NvIGRvIENlbsOhcmlvIiwgIkRpcyBpcyB3aGF0IHdlbnQgZG93biIsICJEeWFncmFtIFNlbmFyeW8iLCAiRHlhZ3JhbSBzZW5hcnlvIiwgIkVzYm96byBkbyBlc2NlbmFyaW8iLCAiRXNjZW5hcmkiLCAiRXNjZW5hcmlvIiwgIkVzcXVlbWEgZGUgbCdlc2NlbmFyaSIsICJFc3F1ZW1hIGRlbCBlc2NlbmFyaW8iLCAiRXNxdWVtYSBkbyBDZW5hcmlvIiwgIkVzcXVlbWEgZG8gQ2Vuw6FyaW8iLCAiRmlyc3Qgb2ZmIiwgIkZvbm8iLCAiRm9yZ2F0w7Nrw7ZueXYiLCAiRm9yZ2F0w7Nrw7ZueXYgdsOhemxhdCIsICJGdW5kbyIsICJHZcOnbWnFnyIsICJHcnVuZGxhZ2UiLCAiSGFubmVyZ3JvbmQiLCAiSGVhdmUgdG8iLCAiSMOhdHTDqXIiLCAiSXN0b3JpayIsICJLZWFkYWFuIiwgIktodW5nIGvhu4tjaCBi4bqjbiIsICJLaHVuZyB0w6xuaCBodeG7kW5nIiwgIktvbmNlcHQiLCAiS29uc2VwIHNrZW5hcmlvIiwgIktvbnRla3N0IiwgIktvbnRla3N0YXMiLCAiS29udGVrc3RzIiwgIktvbnRleHQiLCAiS29udHVybyBkZSBsYSBzY2VuYXJvIiwgIktvbnTDqGtzIiwgIkvhu4tjaCBi4bqjbiIsICJMYXRhciBCZWxha2FuZyIsICJMw71zaW5nIEF0YnVyw7BhcsOhc2FyIiwgIkzDvXNpbmcgRMOmbWEiLCAiTUlTSFVOIiwgIk1JU0hVTiBTUlNMWSIsICJNZW5nZ2FyaXNrYW4gU2VuYXJpbyIsICJOw6HEjXJ0IFNjZW7DoXJhIiwgIk7DocSNcnQgU2NlbsOhcnUiLCAiTsOhxI1ydCBTY8OpbsOhxZllIiwgIk9yaXMgc2NlbmFyaWphIiwgIk9zbm92YSIsICJPc25vdmEgU2NlbsOhcmEiLCAiT3Nub3ZhIHNjw6luw6HFmWUiLCAiT3NudXRlayIsICJPemFkamUiLCAiUGxhbiBTZW5hcnlvIiwgIlBsYW4gZHUgU2PDqW5hcmlvIiwgIlBsYW4gZHUgc2PDqW5hcmlvIiwgIlBsYW4gc2VuYXJ5byIsICJQbGFuZyB2dW0gU3plbmFyaW8iLCAiUG96YWRpZSIsICJQb3phZGluYSIsICJQb3phZMOtIiwgIlByaW1lciIsICJSYWFtc3RzZW5hYXJpdW0iLCAiUmVja29uIGl0J3MgbGlrZSIsICJSZXJlZm9ucyIsICJTY2VuYXJpZSIsICJTY2VuYXJpaiIsICJTY2VuYXJpamF1cyDFoWFibG9uYXMiLCAiU2NlbmFyaWp1cyIsICJTY2VuYXJpbyIsICJTY2VuYXJpbyBBbWxpbmVsbG9sIiwgIlNjZW5hcmlvIE91dGxpbmUiLCAiU2NlbmFyaW8gVGVtcGxhdGUiLCAiU2NlbmFyaW9tYWwiLCAiU2NlbmFyaW9tYWxsIiwgIlNjZW5hcml1IiwgIlNjZW5hcml1c3oiLCAiU2NlbmFybyIsICJTY2Vuw6FyIiwgIlNjZW7EgXJpanMiLCAiU2NlbsSBcmlqcyBwxJNjIHBhcmF1Z2EiLCAiU2NoZW1hIGRlbGxvIHNjZW5hcmlvIiwgIlNjw6luYXJpbyIsICJTY8OpbsOhxZkiLCAiU2VuYXJpbyIsICJTZW5hcnlvIiwgIlNlbmFyeW8gRGVza3JpcHN5b24iLCAiU2VuYXJ5byBkZXNrcmlwc3lvbiIsICJTZW5hcnlvIHRhc2xhxJ/EsSIsICJTaGl2ZXIgbWUgdGltYmVycyIsICJTaXR1YWkiLCAiU2l0dWFzaWUiLCAiU2l0dWFzaWUgVWl0ZWVuc2V0dGluZyIsICJTaXR1xIFjaWphIiwgIlNrZW5hcmlvIiwgIlNrZW5hcmlvIGtvbnNlcCIsICJTa2ljYSIsICJTdHJ1Y3R1cmEgc2NlbmFyaXUiLCAiU3RydWN0dXLEgyBzY2VuYXJpdSIsICJTdHJ1a3R1cmEgc2NlbmFyaWphIiwgIlN0c2VuYWFyaXVtIiwgIlN3YSIsICJTd2EgaHdhZXIgc3dhIiwgIlN3YSBod8OmciBzd2EiLCAiU3phYmxvbiBzY2VuYXJpdXN6YSIsICJTemVuYXJpbyIsICJTemVuYXJpb2dydW5kcmlzcyIsICJUYXBhdXMiLCAiVGFwYXVzYWloaW8iLCAiVGF1c3QiLCAiVGF1c3RhIiwgIlRlbXBsYXRlIEtlYWRhYW4iLCAiVGVtcGxhdGUgU2VuYXJpbyIsICJUZW1wbGF0ZSBTaXR1YWkiLCAiVGhlIHRoaW5nIG9mIGl0IGlzIiwgIlTDrG5oIGh14buRbmciLCAiV2hhcnJpbWVhbiBpcyIsICJZby1oby1obyIsICJaYcWCb8W8ZW5pYSIsICJsdXQiLCAibHV0IGNob3ZuYXRsaCIsICJtbyciLCAiw4ZyIiwgIs6gzrXPgc65zrPPgc6xz4bOriDOo861zr3Osc+Bzq/Ov8+FIiwgIs6jzrXOvc6sz4HOuc6/IiwgIs6lz4DPjM6yzrHOuM+Bzr8iLCAi0JrQtdGA0LXRiCIsICLQmtC+0L3RgtC10LrRgdGCIiwgItCa0L7QvdGG0LXQv9GCIiwgItCe0YHQvdC+0LLQsCIsICLQn9C10YDQtdC00YPQvNC+0LLQsCIsICLQn9C+0LfQsNC00LjQvdCwIiwgItCf0YDQtdC00LjRgdGC0L7RgNC40Y8iLCAi0J/RgNC10LTRi9GB0YLQvtGA0LjRjyIsICLQn9GA0LjQvNC10YAiLCAi0KDQsNC80LrQsCDQvdCwINGB0YbQtdC90LDRgNC40LkiLCAi0KHQutC40YbQsCIsICLQodGC0YDRg9C60YLRg9GA0LAg0YHRhtC10L3QsNGA0LjRjyIsICLQodGC0YDRg9C60YLRg9GA0LAg0YHRhtC10L3QsNGA0LjRmNCwIiwgItCh0YLRgNGD0LrRgtGD0YDQsCDRgdGG0LXQvdCw0YDRltGOIiwgItCh0YbQtdC90LDRgNC40LkiLCAi0KHRhtC10L3QsNGA0LjQuSDRgdGC0YDRg9C60YLRg9GA0LDRgdC4IiwgItCh0YbQtdC90LDRgNC40LnQvdGL0qMg0YLTqdC30LXQu9C10YjQtSIsICLQodGG0LXQvdCw0YDQuNC+IiwgItCh0YbQtdC90LDRgNGW0LkiLCAi0KLQsNGA0LjRhSIsICLXqNen16IiLCAi16rXkdeg15nXqiDXqteo15fXmdepIiwgIteq16jXl9eZ16kiLCAi2KfZhNiu2YTZgdmK2KkiLCAi2KfZhNqv2YjbjCDYs9mG2KfYsduM2YgiLCAi2LLZhduM2YbZhyIsICLYs9mG2KfYsduM2YgiLCAi2LPZitmG2KfYsdmK2YgiLCAi2LPZitmG2KfYsdmK2Ygg2YXYrti32LciLCAi2YXZhti42LEg2YbYp9mF25Ig2qnYpyDYrtin2qnbgSIsICLZhdmG2LjYsdmG2KfZhduBIiwgItm+2LMg2YXZhti42LEiLCAi4KSq4KSw4KS/4KSm4KWD4KS24KWN4KSvIiwgIuCkquCksOCkv+CkpuClg+CktuCljeCkryDgpLDgpYLgpKrgpLDgpYfgpJbgpL4iLCAi4KSq4KWD4KS34KWN4KSg4KSt4KWC4KSu4KS/IiwgIuCoquCon+ColeCopeCoviIsICLgqKrgqJ/gqJXgqKXgqL4g4Kii4Ki+4KiC4Kia4Ki+IiwgIuCoquCon+ColeCopeCoviDgqLDgqYLgqKog4Kiw4KmH4KiW4Ki+IiwgIuCoquCov+Com+Cpi+ColeCpnCIsICLgsJXgsKXgsKjgsIIiLCAi4LCo4LGH4LCq4LCl4LGN4LCv4LCCIiwgIuCwuOCwqOCxjeCwqOCwv+CwteCxh+CwtuCwgiIsICLgspXgsqXgsr7gsrjgsr7gsrDgsr7gsoLgsrYiLCAi4LK14LK/4LK14LKw4LKj4LOGIiwgIuCyueCyv+CyqOCzjeCyqOCzhuCysuCzhiIsICLguKrguKPguLjguJvguYDguKvguJXguLjguIHguLLguKPguJPguYwiLCAi4LmA4Lir4LiV4Li44LiB4Liy4Lij4LiT4LmMIiwgIuC5geC4meC4p+C4hOC4tOC4lCIsICLguYLguITguKPguIfguKrguKPguYnguLLguIfguILguK3guIfguYDguKvguJXguLjguIHguLLguKPguJPguYwiLCAi44K344OK44Oq44KqIiwgIuOCt+ODiuODquOCquOCouOCpuODiOODqeOCpOODsyIsICLjgrfjg4rjg6rjgqrjg4bjg7Pjg5fjg6wiLCAi44K344OK44Oq44Kq44OG44Oz44OX44Os44O844OIIiwgIuODhuODs+ODl+ODrCIsICLliafmnKwiLCAi5Ymn5pys5aSn57qyIiwgIuWKh+acrCIsICLliofmnKzlpKfntrEiLCAi5Zy65pmvIiwgIuWcuuaZr+Wkp+e6siIsICLloLTmma8iLCAi5aC05pmv5aSn57axIiwgIuiDjOaZryIsICLrsLDqsr0iLCAi7Iuc64KY66as7JikIiwgIuyLnOuCmOumrOyYpCDqsJzsmpQiXQorICAgICAgICBrWzpleGFtcGxlc10gPSBTZXQubmV3IFsiQXRidXLDsGFyw6FzaXIiLCAiQmVpc3BpZWxlIiwgIkJlaXNwaWxsZXIiLCAiQ2VuYXJpb3MiLCAiQ2Vuw6FyaW9zIiwgIkNvbnRvIiwgIkNvbnRvaCIsICJDb250b25lIiwgIkRlYWQgbWVuIHRlbGwgbm8gdGFsZXMiLCAiRMOmbWkiLCAiROG7ryBsaeG7h3UiLCAiRVhBTVBMWiIsICJFZ3phbnAiLCAiRWplbXBsb3MiLCAiRWtzZW1wbGVyIiwgIkVremVtcGxvaiIsICJFbmdocmVpZmZ0aWF1IiwgIkVzZW1waSIsICJFeGFtcGxlcyIsICJFeGVtcGVsIiwgIkV4ZW1wbGUiLCAiRXhlbXBsZXMiLCAiRXhlbXBsb3MiLCAiSnVodHVtaWQiLCAiUGFyYXVncyIsICJQYXZ5emTFvmlhaSIsICJQaWVtxJNyaSIsICJQcmltZXJpIiwgIlByaW1qZXJpIiwgIlByenlrxYJhZHkiLCAiUHLDrWtsYWR5IiwgIlDDqWxkw6FrIiwgIlDFmcOta2xhZHkiLCAiU2NlbmFyaWphaSIsICJTY2VuYXJpamkiLCAiU2NlbmFyaW9zIiwgIlNlIHRoZSIsICJTZSDDsGUiLCAiU2Ugw75lIiwgIlRhcGF1a3NldCIsICJWYXJpYW50YWkiLCAiVm9vcmJlZWxkZSIsICJWb29yYmVlbGRlbiIsICJZb3UnbGwgd2FubmEiLCAiZ2hhbnRvSCIsICJsdXRtZXkiLCAiw5ZybmVrbGVyIiwgIs6gzrHPgc6xzrTOtc6vzrPOvM6xz4TOsSIsICLOo861zr3OrM+BzrnOsSIsICLQnNC40YHQsNC70LvQsNGAIiwgItCc0LjRgdC+0LvQu9Cw0YAiLCAi0J/RgNC40LrQu9Cw0LTQuCIsICLQn9GA0LjQvNC10YDQuCIsICLQn9GA0LjQvNC10YDRiyIsICLQodGG0LXQvdCw0YDQuNGY0LgiLCAi0q7RgNC905nQutC705nRgCIsICLXk9eV15LXnteQ15XXqiIsICLYp9mF2KvZhNipIiwgItmF2KvYp9mE24zauiIsICLZhtmF2YjZhtmHINmH2KciLCAi4KSJ4KSm4KS+4KS54KSw4KSjIiwgIuCoieCopuCovuCoueCosOCoqOCovuCogiIsICLgsIngsKbgsL7gsLngsLDgsKPgsLLgsYEiLCAi4LKJ4LKm4LK+4LK54LKw4LKj4LOG4LKX4LKz4LOBIiwgIuC4iuC4uOC4lOC4guC4reC4h+C4leC4seC4p+C4reC4ouC5iOC4suC4hyIsICLguIrguLjguJTguILguK3guIfguYDguKvguJXguLjguIHguLLguKPguJPguYwiLCAi44K144Oz44OX44OrIiwgIuS+iyIsICLkvovlrZAiLCAi7JiIIl0KKyAgICAgICAga1s6c3RlcF0gPSBTZXQubmV3IFsiJ2EiLCAiJ2FjaCIsICInZWoiLCAiKiIsICI3IiwgIkEiLCAiQSB0YWt0aWXFviIsICJBIHRha8OpIiwgIkEgdGllxb4iLCAiQSB6w6Fyb3ZlxYgiLCAiQU4iLCAiQWJlciIsICJBYyIsICJBZG90dCIsICJBayIsICJBa2tvciIsICJBbGUiLCAiQWxlc2hvcmVzIiwgIkFsaSIsICJBbGxvcmEiLCAiQWxvcnMiLCAiQWxzIiwgIkFtYSIsICJBbWVubnlpYmVuIiwgIkFtaWtvciIsICJBbXBhayIsICJBbiIsICJBbmFuZ2luZyIsICJBbmQiLCAiQW5kIHknYWxsIiwgIkFuZ2Vub21tZW4iLCAiQW5yaGVnZWRpZyBhIiwgIkFwYWJpbGEiLCAiQXRlc2EiLCAiQXR1bmNpIiwgIkF0w6hzIiwgIkF2YXN0ISIsICJBeWUiLCAiQlVUIiwgIkJhZ2kiLCAiQmFuanVyIiwgIkJldCIsICJCaeG6v3QiLCAiQmxpbWV5ISIsICJCdWgiLCAiQnV0IiwgIkJ1dCBhdCB0aGUgZW5kIG9mIHRoZSBkYXkgSSByZWNrb24iLCAiQnV0IHknYWxsIiwgIkNhbCIsICJDYW5kIiwgIkNhbmRvIiwgIkNlIiwgIkNobyIsICJDdWFuZG8iLCAiQ8OibmQiLCAiREVOIiwgIkRhSCBnaHUnIGJlamx1JyIsICJEYWRhIiwgIkRhZGFzIiwgIkRhZG8iLCAiRGFkb3MiLCAiRGFuIiwgIkRhbm4iLCAiRGFubyIsICJEYXIiLCAiRGF0IGZpaW5kIiwgIkRhdGEiLCAiRGF0ZSIsICJEYXRlIGZpaW5kIiwgIkRhdGkiLCAiRGF0aSBmaWluZCIsICJEYXRvIiwgIkRhxaNpIGZpaW5kIiwgIkRhyJtpIGZpaW5kIiwgIkRlIiwgIkRlbiB5b3VzZSBnb3R0YSIsICJEZW5nYW4iLCAiRGliZXJpIiwgIkRpeWVsaW0ga2kiLCAiRG8iLCAiRG9uYWRhIiwgIkRvbmF0IiwgIkRvbml0YcS1byIsICJEdW4iLCAiRHVvdGEiLCAiRSIsICJFZWxkYWRlcyIsICJFZiIsICJFbiIsICJFbnRhbyIsICJFbnRvbmNlcyIsICJFbnTDo28iLCAiRW50w7NuIiwgIkVwaSIsICJFdCIsICJFdGFudCBkb25uw6kiLCAiRXRhbnQgZG9ubsOpZSIsICJFdGFudCBkb25uw6llcyIsICJFdGFudCBkb25uw6lzIiwgIkXEn2VyIGtpIiwgIkZha2F0IiwgIkdhbmd3YXkhIiwgIkdkeSIsICJHZWdlYmVuIHNlaSIsICJHZWdlYmVuIHNlaWVuIiwgIkdlZ2V2ZW4iLCAiR2VnZXdlIiwgIkdpdHQiLCAiR2l2ZW4iLCAiR2l2ZW4geSdhbGwiLCAiR2l2ZXQiLCAiR2l2dW4iLCAiSGEiLCAiSSIsICJJIENBTiBIQVoiLCAiSW4iLCAiSXIiLCAiSXQncyBqdXN0IHVuYmVsaWV2YWJsZSIsICJKYSIsICJKZcWbbGkiLCAiSmXFvGVsaSIsICJLYWQiLCAiS2FkYSIsICJLYWRhciIsICJLYWkiLCAiS2FqIiwgIktkecW+IiwgIktlbXVkaWFuIiwgIktldGlrYSIsICJLZcSPIiwgIktoaSIsICJLaWVkeSIsICJLbyIsICJLdWkiLCAiS3VpZCIsICJLdW4iLCAiTGFuIiwgIkxlIiwgIkxlIHNhIGEiLCAiTGV0IGdvIGFuZCBoYXVsIiwgIkxvZ28iLCAiTG9yc3F1JzwiLCAiTG9yc3F1ZSIsICJMw6giLCAiTMOoIHNhIGEiLCAiTWEiLCAiTWFhciIsICJNYWlzIiwgIk1hamQiLCAiTWFqxIVjIiwgIk1ha2EiLCAiTWFuYXdhIiwgIk1hcyIsICJNZW4iLCAiTWVuYXdhIiwgIk11dHRhIiwgIk5hbGlrYSIsICJOYWxpa2FuaW5nIiwgIk5hbmdpbmciLCAiTmF0byIsICJOaMawbmciLCAiTmlpbiIsICJOanVrIiwgIk7DpHIiLCAiTsOlciIsICJPIHphbWFuIiwgIk9jaCIsICJPZyIsICJPbGV0ZXRhYW4iLCAiT25kIiwgIk9uZGEiLCAiT3JheiIsICJQYWsiLCAiUGVybyIsICJQZXLDsiIsICJQb2Rhbm8iLCAiUG9raWHEviIsICJQb2t1ZCIsICJQb3RlbSIsICJQb3RvbSIsICJQcml2emV0byIsICJQcnlkIiwgIlF1YW4iLCAiUXVhbmQiLCAiUXVhbmRvIiwgIlNlIiwgIlNlZCIsICJTaSIsICJTaWlzIiwgIlNpcG96ZSIsICJTaXBvemUgS2UiLCAiU2lwb3plIGtlIiwgIlNvaXQiLCAiU3RlbCIsICJTw6UiLCAiVGFkIiwgIlRhZGEiLCAiVGFrIiwgIlRha3JhdCIsICJUYXBpIiwgIlRlciIsICJUZXRhcGkiLCAiVGhhIiwgIlRoYSB0aGUiLCAiVGhlbiIsICJUaGVuIHknYWxsIiwgIlRodXJoIiwgIlRow6wiLCAiVG9kYSIsICJUb28gcmlnaHQiLCAiVW4iLCAiVW5kIiwgIlZlIiwgIlZlbmRhciIsICJWw6AiLCAiV0VOIiwgIldhbm5lZXIiLCAiV2VubiIsICJXaGVuIiwgIldoZW4geSdhbGwiLCAiV3RlZHkiLCAiV3VuIiwgIlkiLCAiWSdrbm93IiwgIlllYWggbmFoIiwgIlluYSIsICJZb3VzZSBrbm93IGxpa2Ugd2hlbiIsICJZb3VzZSBrbm93IHdoZW4geW91c2UgZ290IiwgIlphIHByZWRwb2tsYWR1IiwgIlphIHDFmWVkcG9rbGFkdSIsICJaYWRhbiIsICJaYWRhbmkiLCAiWmFkYW5vIiwgIlphZGF0ZSIsICJaYWRhdG8iLCAiWmFrxYJhZGFqxIVjIiwgIlphcmFkaSIsICJaYXRhdGkiLCAiYSIsICJhbiIsICJhd2VyIiwgImRhbm4iLCAiZ2h1JyBub2JsdSciLCAibGF0bGgiLCAibcOkIiwgInFhU0RJJyIsICJ1Z2Vob2xsIiwgInZhaiIsICJ3YW5uIiwgIsOJcyIsICLDiXRhbnQgZG9ubsOpIiwgIsOJdGFudCBkb25uw6llIiwgIsOJdGFudCBkb25uw6llcyIsICLDiXRhbnQgZG9ubsOpcyIsICLDkGEiLCAiw5BhIMOwZSIsICLDkHVyaCIsICLDnmEiLCAiw55hIMO+ZSIsICLDnmVnYXIiLCAiw551cmgiLCAiw57DoSIsICLEjGUiLCAixZ5pIiwgIsiYaSIsICLOjM+EzrHOvSIsICLOkc67zrvOrCIsICLOlM61zrTOv868zq3Ovc6/z4UiLCAizprOsc65IiwgIs6kz4zPhM61IiwgItCGIiwgItCQIiwgItCQINGC0LDQutC+0LYiLCAi0JDQs9Cw0YAiLCAi0JDQu9C1IiwgItCQ0LvQuCIsICLQkNC80LzQviIsICLQkdC40YDQvtC6IiwgItCS0LAiLCAi0JLTmSIsICLQlNCw0LTQtdC90L4iLCAi0JTQsNC90L4iLCAi0JTQvtC/0YPRgdGC0LjQvCIsICLQldGB0LvQuCIsICLQl9Cw0LTQsNGC0LUiLCAi0JfQsNC00LDRgtC4IiwgItCX0LDQtNCw0YLQviIsICLQmCIsICLQmiDRgtC+0LzRgyDQttC1IiwgItCa0LDQtCIsICLQmtCw0LTQsCIsICLQmtC+0LPQsNGC0L4iLCAi0JrQvtCz0LTQsCIsICLQmtC+0LvQuCIsICLQm9C10LrQuNC9IiwgItCb05nQutC40L0iLCAi0J3QtdGF0LDQuSIsICLQndC+IiwgItCd05nRgtC40pfTmdC005kiLCAi0J7QvdC00LAiLCAi0J/RgNC40L/Rg9GB0YLQuNC80L4iLCAi0J/RgNC40L/Rg9GB0YLQuNC80L4sINGJ0L4iLCAi0J/Rg9GB0YLRjCIsICLQotCwIiwgItCi0LDQutC20LUiLCAi0KLQviIsICLQotC+0LPQtNCwIiwgItCi0L7QtNGWIiwgItCj0L3QtNCwIiwgItCv0LrRidC+IiwgItK605nQvCIsICLTmNCz05nRgCIsICLTmNC50YLQuNC6IiwgItOY0LzQvNCwIiwgIteQ15HXnCIsICLXkNeWIiwgIteQ15bXmSIsICLXkdeU15nXoNeq158iLCAi15XXktedIiwgIteb15DXqdeoIiwgItii2Ybar9in2YciLCAi2KfYsNin2YsiLCAi2KfZhdinIiwgItin2YjYsSIsICLYp9qv2LEiLCAi2KjYpyDZgdix2LYiLCAi2KjYp9mE2YHYsdi2IiwgItio2YHYsdi2IiwgItiq2KgiLCAi2KvZhSIsICLYrNioIiwgIti52YbYr9mF2KciLCAi2YHYsdi2INqp24zYpyIsICLZhNmD2YYiLCAi2YTbjNqp2YYiLCAi2YXYqtmJIiwgItmH2Ybar9in2YXbjCIsICLZiCIsICLZvtq+2LEiLCAi4KSF4KSX4KSwIiwgIuCklOCksCIsICLgpJXgpKbgpL4iLCAi4KSV4KS/4KSo4KWN4KSk4KWBIiwgIuCkmuClguCkguCkleCkvyIsICLgpJzgpKwiLCAi4KSk4KSl4KS+IiwgIuCkpOCkpuCkviIsICLgpKTgpKwiLCAi4KSq4KSwIiwgIuCkquCksOCkqOCljeCkpOClgSIsICLgpK/gpKbgpL8iLCAi4KiF4Kik4KmHIiwgIuConOCopuCpi+CogiIsICLgqJzgqL/gqLXgqYfgqIIg4KiV4Ki/IiwgIuConOCph+ColeCosCIsICLgqKTgqKYiLCAi4Kiq4KiwIiwgIuCwheCwquCxjeCwquCxgeCwoeCxgSIsICLgsIgg4LCq4LCw4LC/4LC44LGN4LCl4LC/4LCk4LC/4LCy4LGLIiwgIuCwleCwvuCwqOCwvyIsICLgsJrgsYbgsKrgsY3gsKrgsKzgsKHgsL/gsKjgsKbgsL8iLCAi4LCu4LCw4LC/4LCv4LGBIiwgIuCyhuCypuCysOCzhiIsICLgsqjgsoLgsqTgsrAiLCAi4LKo4LK/4LOV4LKh4LK/4LKmIiwgIuCyruCypOCzjeCypOCzgSIsICLgsrjgs43gsqXgsr/gsqTgsr/gsq/gsqjgs43gsqjgs4EiLCAi4LiB4Liz4Lir4LiZ4LiU4LmD4Lir4LmJIiwgIuC4lOC4seC4h+C4meC4seC5ieC4mSIsICLguYDguKHguLfguYjguK0iLCAi4LmB4LiV4LmIIiwgIuC5geC4peC4sCIsICLjgYvjgaQ8IiwgIuOBl+OBi+OBlzwiLCAi44Gf44Gg44GXPCIsICLjgarjgonjgbA8IiwgIuOCguOBlzwiLCAi5Lim5LiUPCIsICLkvYbjgZc8IiwgIuS9huaYrzwiLCAi5YGH5aaCPCIsICLlgYflrpo8IiwgIuWBh+iorTwiLCAi5YGH6K6+PCIsICLliY3mj5A8IiwgIuWQjOaXtjwiLCAi5ZCM5pmCPCIsICLlubbkuJQ8IiwgIuW9kzwiLCAi55W2PCIsICLogIzkuJQ8IiwgIumCo+S5iDwiLCAi6YKj6bq8PCIsICLqt7jrn6zrqbQ8IiwgIuq3uOumrOqzoDwiLCAi64uoPCIsICLrp4zslb08IiwgIuunjOydvDwiLCAi66i87KCAPCIsICLsobDqsbQ8IiwgIu2VmOyngOunjDwiXQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9nbHNsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ2xzbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI3MDZhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ2xzbC5yYgpAQCAtMCwwICsxLDEzNSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGxvYWRfbGV4ZXIgJ2MucmInCisKKyAgICAjIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBHTFNMIGxhbmd1YWdlIGxleGVyIHRvIHRoZSBSb3VnZQorICAgICMgc3ludGF4IGhpZ2hsaWdodGVyLgorICAgICMKKyAgICAjIEF1dGhvcjogU3JpIEhhcnNoYSBDaGlsYWthcGF0aQorICAgIGNsYXNzIEdsc2wgPCBDCisgICAgICB0YWcgJ2dsc2wnCisgICAgICBmaWxlbmFtZXMgJyouZ2xzbCcsICcqLmZyYWcnLCAnKi52ZXJ0JywgJyouZ2VvbScsICcqLmZzJywgJyoudnMnLCAnKi5ncycsICcqLnNoYWRlcicKKyAgICAgIG1pbWV0eXBlcyAneC1zaGFkZXIveC12ZXJ0ZXgnLCAneC1zaGFkZXIveC1mcmFnbWVudCcsICd4LXNoYWRlci94LWdlb21ldHJ5JworCisgICAgICB0aXRsZSAiR0xTTCIKKyAgICAgIGRlc2MgIlRoZSBHTFNMIHNoYWRlciBsYW5ndWFnZSIKKworICAgICAgIyBvcHRpb25hbCBjb21tZW50IG9yIHdoaXRlc3BhY2UKKyAgICAgIHdzID0gJXIoKD86XHN8Ly8uKj9cbnwvWypdLio/WypdLykrKQorICAgICAgaWQgPSAvW2EtekEtWl9dW2EtekEtWjAtOV9dKi8KKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGF0dHJpYnV0ZSBjb25zdCB1bmlmb3JtIHZhcnlpbmcKKyAgICAgICAgICBsYXlvdXQKKyAgICAgICAgICBjZW50cm9pZCBmbGF0IHNtb290aCBub3BlcnNwZWN0aXZlCisgICAgICAgICAgcGF0Y2ggc2FtcGxlCisgICAgICAgICAgYnJlYWsgY29udGludWUgZG8gZm9yIHdoaWxlIHN3aXRjaCBjYXNlIGRlZmF1bHQKKyAgICAgICAgICBpZiBlbHNlCisgICAgICAgICAgc3Vicm91dGluZQorICAgICAgICAgIGluIG91dCBpbm91dAorICAgICAgICAgIGludmFyaWFudAorICAgICAgICAgIGRpc2NhcmQgcmV0dXJuIHN0cnVjdCBwcmVjaXNpb24KKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzX3R5cGUKKyAgICAgICAgQGtleXdvcmRzX3R5cGUgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgZmxvYXQgZG91YmxlIGludCB2b2lkIGJvb2wgdHJ1ZSBmYWxzZQorICAgICAgICAgIGxvd3AgbWVkaXVtcCBoaWdocAorICAgICAgICAgIG1hdDIgbWF0MyBtYXQ0IGRtYXQyIGRtYXQzIGRtYXQ0CisgICAgICAgICAgbWF0MngyIG1hdDJ4MyBtYXQyeDQgZG1hdDJ4MiBkbWF0MngzIGRtYXQyeDQKKyAgICAgICAgICBtYXQzeDIgbWF0M3gzIG1hdDN4NCBkbWF0M3gyIGRtYXQzeDMgZG1hdDN4NAorICAgICAgICAgIG1hdDR4MiBtYXQ0eDMgbWF0NHg0IGRtYXQ0eDIgZG1hdDR4MyBkbWF0NHg0CisgICAgICAgICAgdmVjMiB2ZWMzIHZlYzQgaXZlYzIgaXZlYzMgaXZlYzQgYnZlYzIgYnZlYzMgYnZlYzQgZHZlYzIgZHZlYzMgZHZlYzQKKyAgICAgICAgICB1aW50IHV2ZWMyIHV2ZWMzIHV2ZWM0CisgICAgICAgICAgc2FtcGxlcjFEIHNhbXBsZXIyRCBzYW1wbGVyM0Qgc2FtcGxlckN1YmUKKyAgICAgICAgICBzYW1wbGVyMURTaGFkb3cgc2FtcGxlcjJEU2hhZG93IHNhbXBsZXJDdWJlU2hhZG93CisgICAgICAgICAgc2FtcGxlcjFEQXJyYXkgc2FtcGxlcjJEQXJyYXkKKyAgICAgICAgICBzYW1wbGVyMURBcnJheVNoYWRvdyBzYW1wbGVyMkRBcnJheVNoYWRvdworICAgICAgICAgIGlzYW1wbGVyMUQgaXNhbXBsZXIyRCBpc2FtcGxlcjNEIGlzYW1wbGVyQ3ViZQorICAgICAgICAgIGlzYW1wbGVyMURBcnJheSBpc2FtcGxlcjJEQXJyYXkKKyAgICAgICAgICB1c2FtcGxlcjFEIHVzYW1wbGVyMkQgdXNhbXBsZXIzRCB1c2FtcGxlckN1YmUKKyAgICAgICAgICB1c2FtcGxlcjFEQXJyYXkgdXNhbXBsZXIyREFycmF5CisgICAgICAgICAgc2FtcGxlcjJEUmVjdCBzYW1wbGVyMkRSZWN0U2hhZG93IGlzYW1wbGVyMkRSZWN0IHVzYW1wbGVyMkRSZWN0CisgICAgICAgICAgc2FtcGxlckJ1ZmZlciBpc2FtcGxlckJ1ZmZlciB1c2FtcGxlckJ1ZmZlcgorICAgICAgICAgIHNhbXBsZXIyRE1TIGlzYW1wbGVyMkRNUyB1c2FtcGxlcjJETVMKKyAgICAgICAgICBzYW1wbGVyMkRNU0FycmF5IGlzYW1wbGVyMkRNU0FycmF5IHVzYW1wbGVyMkRNU0FycmF5CisgICAgICAgICAgc2FtcGxlckN1YmVBcnJheSBzYW1wbGVyQ3ViZUFycmF5U2hhZG93IGlzYW1wbGVyQ3ViZUFycmF5IHVzYW1wbGVyQ3ViZUFycmF5CisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5yZXNlcnZlZAorICAgICAgICBAcmVzZXJ2ZWQgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgY29tbW9uIHBhcnRpdGlvbiBhY3RpdmUKKyAgICAgICAgICBhc20KKyAgICAgICAgICBjbGFzcyB1bmlvbiBlbnVtIHR5cGVkZWYgdGVtcGxhdGUgdGhpcyBwYWNrZWQKKyAgICAgICAgICBnb3RvCisgICAgICAgICAgaW5saW5lIG5vaW5saW5lIHZvbGF0aWxlIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIGV4dGVybmFsIGludGVyZmFjZQorICAgICAgICAgIGxvbmcgc2hvcnQgaGFsZiBmaXhlZCB1bnNpZ25lZCBzdXBlcnAKKyAgICAgICAgICBpbnB1dCBvdXRwdXQKKyAgICAgICAgICBodmVjMiBodmVjMyBodmVjNCBmdmVjMiBmdmVjMyBmdmVjNAorICAgICAgICAgIHNhbXBsZXIzRFJlY3QKKyAgICAgICAgICBmaWx0ZXIKKyAgICAgICAgICBpbWFnZTFEIGltYWdlMkQgaW1hZ2UzRCBpbWFnZUN1YmUKKyAgICAgICAgICBpaW1hZ2UxRCBpaW1hZ2UyRCBpaW1hZ2UzRCBpaW1hZ2VDdWJlCisgICAgICAgICAgdWltYWdlMUQgdWltYWdlMkQgdWltYWdlM0QgdWltYWdlQ3ViZQorICAgICAgICAgIGltYWdlMURBcnJheSBpbWFnZTJEQXJyYXkKKyAgICAgICAgICBpaW1hZ2UxREFycmF5IGlpbWFnZTJEQXJyYXkgdWltYWdlMURBcnJheSB1aW1hZ2UyREFycmF5CisgICAgICAgICAgaW1hZ2UxRFNoYWRvdyBpbWFnZTJEU2hhZG93CisgICAgICAgICAgaW1hZ2UxREFycmF5U2hhZG93IGltYWdlMkRBcnJheVNoYWRvdworICAgICAgICAgIGltYWdlQnVmZmVyIGlpbWFnZUJ1ZmZlciB1aW1hZ2VCdWZmZXIKKyAgICAgICAgICBzaXplb2YgY2FzdAorICAgICAgICAgIG5hbWVzcGFjZSB1c2luZworICAgICAgICAgIHJvd19tYWpvcgorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGdsX1ZlcnRleElEIGdsX0luc3RhbmNlSUQgZ2xfUGVyVmVydGV4IGdsX1Bvc2l0aW9uIGdsX1BvaW50U2l6ZSBnbF9DbGlwRGlzdGFuY2UKKyAgICAgICAgICBnbF9QcmltaXRpdmVJREluIGdsX0ludm9jYXRpb25JRCBnbF9QcmltaXRpdmVJRCBnbF9MYXllciBnbF9WaWV3cG9ydEluZGV4CisgICAgICAgICAgZ2xfTWF4UGF0Y2hWZXJ0aWNlcyBnbF9QYXRjaFZlcnRpY2VzSW4gZ2xfVGVzc0xldmVsT3V0ZXIgZ2xfVGVzc0xldmVsSW5uZXIKKyAgICAgICAgICBnbF9UZXNzQ29vcmQgZ2xfRnJhZ0Nvb3JkIGdsX0Zyb250RmFjaW5nIGdsX1BvaW50Q29vcmQgZ2xfU2FtcGxlSUQgZ2xfU2FtcGxlUG9zaXRpb24KKyAgICAgICAgICBnbF9GcmFnQ29sb3IgZ2xfRnJhZ0RhdGEgZ2xfTWF4RHJhd0J1ZmZlcnMgZ2xfRnJhZ0RlcHRoIGdsX1NhbXBsZU1hc2sKKyAgICAgICAgICBnbF9DbGlwVmVydGV4IGdsX0Zyb250Q29sb3IgZ2xfQmFja0NvbG9yIGdsX0Zyb250U2Vjb25kYXJ5Q29sb3IgZ2xfQmFja1NlY29uZGFyeUNvbG9yCisgICAgICAgICAgZ2xfVGV4Q29vcmQgZ2xfRm9nRnJhZ0Nvb3JkIGdsX0NvbG9yIGdsX1NlY29uZGFyeUNvbG9yIGdsX05vcm1hbCBnbF9WZXJ0ZXhJRAorICAgICAgICAgIGdsX011bHRpVGV4Q29yZDAgZ2xfTXVsdGlUZXhDb3JkMSBnbF9NdWx0aVRleENvcmQyIGdsX011bHRpVGV4Q29yZDMKKyAgICAgICAgICBnbF9NdWx0aVRleENvcmQ0IGdsX011bHRpVGV4Q29yZDUgZ2xfTXVsdGlUZXhDb3JkNiBnbF9NdWx0aVRleENvcmQ3CisgICAgICAgICAgZ2xfRm9nQ29vcmQgZ2xfTWF4VmVydGV4QXR0cmlicyBnbF9NYXhWZXJ0ZXhVbmlmb3JtQ29tcG9uZW50cyAKKyAgICAgICAgICBnbF9NYXhWYXJ5aW5nRmxvYXRzIGdsX01heFZhcnlpbmdDb21wb25lbnRzIGdsX01heFZlcnRleE91dHB1dENvbXBvbmVudHMKKyAgICAgICAgICBnbF9NYXhHZW9tZXRyeUlucHV0Q29tcG9uZW50cyBnbF9NYXhHZW9tZXRyeU91dHB1dENvbXBvbmVudHMKKyAgICAgICAgICBnbF9NYXhGcmFnbWVudElucHV0Q29tcG9uZW50cyBnbF9NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cworICAgICAgICAgIGdsX01heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgZ2xfTWF4VGV4dHVyZUltYWdlVW5pdHMKKyAgICAgICAgICBnbF9NYXhGcmFnbWVudFVuaWZvcm1Db21wb25lbnRzIGdsX01heENsaXBEaXN0YW5jZXMKKyAgICAgICAgICBnbF9NYXhHZW9tZXRyeVRleHR1cmVJbWFnZVVuaXRzIGdsX01heEdlb21ldHJ5VW5pZm9ybUNvbXBvbmVudHMKKyAgICAgICAgICBnbF9NYXhHZW9tZXRyeVZhcnlpbmdDb21wb25lbnRzIGdsX01heFRlc3NDb250cm9sSW5wdXRDb21wb25lbnRzCisgICAgICAgICAgZ2xfTWF4VGVzc0NvbnRyb2xPdXRwdXRDb21wb25lbnRzIGdsX01heFRlc3NDb250cm9sVGV4dHVyZUltYWdlVW5pdHMKKyAgICAgICAgICBnbF9NYXhUZXNzQ29udHJvbFVuaWZvcm1Db21wb25lbnRzIGdsX01heFRlc3NDb250cm9sVG90YWxPdXRwdXRDb21wb25lbnRzCisgICAgICAgICAgZ2xfTWF4VGVzc0V2YWx1YXRpb25JbnB1dENvbXBvbmVudHMgZ2xfTWF4VGVzc0V2YWx1YXRpb25PdXRwdXRDb21wb25lbnRzCisgICAgICAgICAgZ2xfTWF4VGVzc0V2YWx1YXRpb25UZXh0dXJlSW1hZ2VVbml0cyBnbF9NYXhUZXNzRXZhbHVhdGlvblVuaWZvcm1Db21wb25lbnRzCisgICAgICAgICAgZ2xfTWF4VGVzc1BhdGNoQ29tcG9uZW50cyBnbF9NYXhUZXNzR2VuTGV2ZWwgZ2xfTWF4Vmlld3BvcnRzCisgICAgICAgICAgZ2xfTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgZ2xfTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyBnbF9NYXhWYXJ5aW5nVmVjdG9ycworICAgICAgICAgIGdsX01heFRleHR1cmVVbml0cyBnbF9NYXhUZXh0dXJlQ29vcmRzIGdsX01heENsaXBQbGFuZXMgZ2xfRGVwdGhSYW5nZQorICAgICAgICAgIGdsX0RlcHRoUmFuZ2VQYXJhbWV0ZXJzIGdsX01vZGVsVmlld01hdHJpeCBnbF9Qcm9qZWN0aW9uTWF0cml4CisgICAgICAgICAgZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCBnbF9UZXh0dXJlTWF0cml4IGdsX05vcm1hbE1hdHJpeAorICAgICAgICAgIGdsX01vZGVsVmlld01hdHJpeEludmVyc2UgZ2xfUHJvamVjdGlvbk1hdHJpeEludmVyc2UgZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeEludmVyc2UKKyAgICAgICAgICBnbF9UZXh0dXJlTWF0cml4SW52ZXJzZSBnbF9Nb2RlbFZpZXdNYXRyaXhUcmFuc3Bvc2UKKyAgICAgICAgICBnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4VHJhbnNwb3NlIGdsX1RleHR1cmVNYXRyaXhUcmFuc3Bvc2UKKyAgICAgICAgICBnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlVHJhbnNwb3NlIGdsX1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlCisgICAgICAgICAgZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeEludmVyc2VUcmFuc3Bvc2UKKyAgICAgICAgICBnbF9UZXh0dXJlTWF0cml4SW52ZXJzZVRyYW5zcG9zZSBnbF9Ob3JtYWxTY2FsZSBnbF9DbGlwUGxhbmUgZ2xfUG9pbnRQYXJhbWV0ZXJzCisgICAgICAgICAgZ2xfUG9pbnQgZ2xfTWF0ZXJpYWxQYXJhbWV0ZXJzIGdsX0Zyb250TWF0ZXJpYWwgZ2xfQmFja01hdGVyaWFsCisgICAgICAgICAgZ2xfTGlnaHRTb3VyY2VQYXJhbWV0ZXJzIGdsX0xpZ2h0U291cmNlIGdsX01heExpZ2h0cyBnbF9MaWdodE1vZGVsUGFyYW1ldGVycworICAgICAgICAgIGdsX0xpZ2h0TW9kZWwgZ2xfTGlnaHRNb2RlbFByb2R1Y3RzIGdsX0Zyb250TGlnaHRNb2RlbFByb2R1Y3QKKyAgICAgICAgICBnbF9CYWNrTGlnaHRNb2RlbFByb2R1Y3QgZ2xfTGlnaHRQcm9kdWN0cyBnbF9Gcm9udExpZ2h0UHJvZHVjdAorICAgICAgICAgIGdsX0JhY2tMaWdodFByb2R1Y3QgZ2xfVGV4dHVyZUVudkNvbG9yIGdsX0V5ZVBsYW5lUyBnbF9FeWVQbGFuZVQgZ2xfRXllUGxhbmVSCisgICAgICAgICAgZ2xfRXllUGxhbmVRIGdsX09iamVjdFBsYW5lUyBnbF9PYmplY3RQbGFuZVQgZ2xfT2JqZWN0UGxhbmVSIGdsX09iamVjdFBsYW5lUQorICAgICAgICAgIGdsX0ZvZ1BhcmFtZXRlcnMgZ2xfRm9nCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ28ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9nby5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDk4NmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ28ucmIKQEAgLTAsMCArMSwxNzggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBHbyA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJHbyIKKyAgICAgIGRlc2MgJ1RoZSBHbyBwcm9ncmFtbWluZyBsYW5ndWFnZSAoaHR0cDovL2dvbGFuZy5vcmcpJworICAgICAgdGFnICdnbycKKyAgICAgIGFsaWFzZXMgJ2dvJywgJ2dvbGFuZycKKyAgICAgIGZpbGVuYW1lcyAnKi5nbycKKworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtZ28nLCAnYXBwbGljYXRpb24veC1nbycKKworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KHRleHQpCisgICAgICAgIHJldHVybiAwCisgICAgICBlbmQKKworICAgICAgIyBDaGFyYWN0ZXJzCisKKyAgICAgIFdISVRFX1NQQUNFICAgICAgICAgICAgPSAvW1xzXHRcclxuXSsvCisKKyAgICAgIE5FV0xJTkUgICAgICAgICAgICAgICAgPSAvXG4vCisgICAgICBVTklDT0RFX0NIQVIgICAgICAgICAgID0gL1teXG5dLworICAgICAgVU5JQ09ERV9MRVRURVIgICAgICAgICA9IC9bWzphbHBoYTpdXS8KKyAgICAgIFVOSUNPREVfRElHSVQgICAgICAgICAgPSAvW1s6ZGlnaXQ6XV0vCisKKyAgICAgICMgTGV0dGVycyBhbmQgZGlnaXRzCisKKyAgICAgIExFVFRFUiAgICAgICAgICAgICAgICAgPSAvI3tVTklDT0RFX0xFVFRFUn18Xy8KKyAgICAgIERFQ0lNQUxfRElHSVQgICAgICAgICAgPSAvWzAtOV0vCisgICAgICBPQ1RBTF9ESUdJVCAgICAgICAgICAgID0gL1swLTddLworICAgICAgSEVYX0RJR0lUICAgICAgICAgICAgICA9IC9bMC05QS1GYS1mXS8KKworICAgICAgIyBDb21tZW50cworCisgICAgICBMSU5FX0NPTU1FTlQgICAgICAgICAgID0gL1wvXC8oPzooPyEje05FV0xJTkV9KS4pKi8KKyAgICAgIEdFTkVSQUxfQ09NTUVOVCAgICAgICAgPSAvXC9cKig/Oig/IVwqXC8pLikqXCpcLy9tCisgICAgICBDT01NRU5UICAgICAgICAgICAgICAgID0gLyN7TElORV9DT01NRU5UfXwje0dFTkVSQUxfQ09NTUVOVH0vCisKKyAgICAgICMgS2V5d29yZHMKKworICAgICAgS0VZV09SRCAgICAgICAgICAgICAgICA9IC9cYig/OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAgICAgfCBkZWZhdWx0ICAgICB8IGZ1bmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludGVyZmFjZSAgIHwgc2VsZWN0ICAgICAgfCBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkZWZlciAgICAgICB8IGdvICAgICAgICAgIHwgbWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3QgICAgICB8IGNoYW4gICAgICAgIHwgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ290byAgICAgICAgfCBwYWNrYWdlICAgICB8IHN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29uc3QgICAgICAgfCBmYWxsdGhyb3VnaCB8IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByYW5nZSAgICAgICB8IHR5cGUgICAgICAgIHwgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvciAgICAgICAgIHwgaW1wb3J0ICAgICAgfCByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcYi94CisKKyAgICAgICMgSWRlbnRpZmllcnMKKworICAgICAgSURFTlRJRklFUiAgICAgICAgICAgICA9IC8gKD8hI3tLRVlXT1JEfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN7TEVUVEVSfSg/OiN7TEVUVEVSfXwje1VOSUNPREVfRElHSVR9KSogL3gKKworICAgICAgIyBPcGVyYXRvcnMgYW5kIGRlbGltaXRlcnMKKworICAgICAgT1BFUkFUT1IgICAgICAgICAgICAgICA9IC8gXCs9ICAgIHwgXCtcKyAgIHwgXCsgICAgIHwgJlxePSAgIHwgJlxeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAmPSAgICAgfCAmJiAgICAgfCAmICAgICAgfCA9PSAgICAgfCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcIT0gICAgfCBcISAgICAgfCAtPSAgICAgfCAtLSAgICAgfCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcfD0gICAgfCBcfFx8ICAgfCBcfCAgICAgfCA8PSAgICAgfCA8LQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPDw9ICAgIHwgPDwgICAgIHwgPCAgICAgIHwgXCo9ICAgIHwgXCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFxePSAgICB8IFxeICAgICB8ID4+PSAgICB8ID4+ICAgICB8ID49CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA+ICAgICAgfCBcLyAgICAgfCBcLz0gICAgfCA6PSAgICAgfCAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAlPSAgICAgfCBcLlwuXC4gfCBcLiAgICAgfCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3gKKworICAgICAgU0VQQVJBVE9SICAgICAgICAgICAgICA9IC8gXCggICAgIHwgXCkgICAgIHwgXFsgICAgIHwgXF0gICAgIHwgXHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFx9ICAgICB8ICwgICAgICB8IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAveAorCisgICAgICAjIEludGVnZXIgbGl0ZXJhbHMKKworICAgICAgREVDSU1BTF9MSVQgICAgICAgICAgICA9IC9bMC05XSN7REVDSU1BTF9ESUdJVH0qLworICAgICAgT0NUQUxfTElUICAgICAgICAgICAgICA9IC8wI3tPQ1RBTF9ESUdJVH0qLworICAgICAgSEVYX0xJVCAgICAgICAgICAgICAgICA9IC8wW3hYXSN7SEVYX0RJR0lUfSsvCisgICAgICBJTlRfTElUICAgICAgICAgICAgICAgID0gLyN7SEVYX0xJVH18I3tERUNJTUFMX0xJVH18I3tPQ1RBTF9MSVR9LworCisgICAgICAjIEZsb2F0aW5nLXBvaW50IGxpdGVyYWxzCisKKyAgICAgIERFQ0lNQUxTICAgICAgICAgICAgICAgPSAvI3tERUNJTUFMX0RJR0lUfSsvCisgICAgICBFWFBPTkVOVCAgICAgICAgICAgICAgID0gL1tlRV1bK1wtXT8je0RFQ0lNQUxTfS8KKyAgICAgIEZMT0FUX0xJVCAgICAgICAgICAgICAgPSAvICN7REVDSU1BTFN9IFwuICN7REVDSU1BTFN9PyAje0VYUE9ORU5UfT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICN7REVDSU1BTFN9ICN7RVhQT05FTlR9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcLiAje0RFQ0lNQUxTfSAje0VYUE9ORU5UfT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAveAorCisgICAgICAjIEltYWdpbmFyeSBsaXRlcmFscworCisgICAgICBJTUFHSU5BUllfTElUICAgICAgICAgID0gLyg/OiN7REVDSU1BTFN9fCN7RkxPQVRfTElUfSlpLworCisgICAgICAjIFJ1bmUgbGl0ZXJhbHMKKworICAgICAgRVNDQVBFRF9DSEFSICAgICAgICAgICA9IC9cXFthYmZucnR2XFwnIl0vCisgICAgICBMSVRUTEVfVV9WQUxVRSAgICAgICAgID0gL1xcdSN7SEVYX0RJR0lUfXs0fS8KKyAgICAgIEJJR19VX1ZBTFVFICAgICAgICAgICAgPSAvXFxVI3tIRVhfRElHSVR9ezh9LworICAgICAgVU5JQ09ERV9WQUxVRSAgICAgICAgICA9IC8gI3tVTklDT0RFX0NIQVJ9IHwgI3tMSVRUTEVfVV9WQUxVRX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICN7QklHX1VfVkFMVUV9ICB8ICN7RVNDQVBFRF9DSEFSfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC94CisgICAgICBPQ1RBTF9CWVRFX1ZBTFVFICAgICAgID0gL1xcI3tPQ1RBTF9ESUdJVH17M30vCisgICAgICBIRVhfQllURV9WQUxVRSAgICAgICAgID0gL1xceCN7SEVYX0RJR0lUfXsyfS8KKyAgICAgIEJZVEVfVkFMVUUgICAgICAgICAgICAgPSAvI3tPQ1RBTF9CWVRFX1ZBTFVFfXwje0hFWF9CWVRFX1ZBTFVFfS8KKyAgICAgIENIQVJfTElUICAgICAgICAgICAgICAgPSAvJyg/OiN7VU5JQ09ERV9WQUxVRX18I3tCWVRFX1ZBTFVFfSknLworICAgICAgRVNDQVBFX1NFUVVFTkNFICAgICAgICA9IC8gI3tFU0NBUEVEX0NIQVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAje0xJVFRMRV9VX1ZBTFVFfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3tCSUdfVV9WQUxVRX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICN7SEVYX0JZVEVfVkFMVUV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3gKKworICAgICAgIyBTdHJpbmcgbGl0ZXJhbHMKKworICAgICAgUkFXX1NUUklOR19MSVQgICAgICAgICA9IC9gKD86I3tVTklDT0RFX0NIQVJ9fCN7TkVXTElORX0pKmAvCisgICAgICBJTlRFUlBSRVRFRF9TVFJJTkdfTElUID0gLyAiKD86ICg/ISIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg/OiAje1VOSUNPREVfVkFMVUV9IHwgI3tCWVRFX1ZBTFVFfSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSoiIC94CisgICAgICBTVFJJTkdfTElUICAgICAgICAgICAgID0gLyN7UkFXX1NUUklOR19MSVR9fCN7SU5URVJQUkVURURfU1RSSU5HX0xJVH0vCisKKyAgICAgICMgUHJlZGVjbGFyZWQgaWRlbnRpZmllcnMKKworICAgICAgUFJFREVDTEFSRURfVFlQRVMgICAgICA9IC9cYig/OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICB8IGJ5dGUgICAgICAgfCBjb21wbGV4NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbXBsZXgxMjggfCBlcnJvciAgICAgIHwgZmxvYXQzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQ2NCAgICB8IGludDggICAgICAgfCBpbnQxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW50MzIgICAgICB8IGludDY0ICAgICAgfCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJ1bmUgICAgICAgfCBzdHJpbmcgICAgIHwgdWludDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQxNiAgICAgfCB1aW50MzIgICAgIHwgdWludDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50cHRyICAgIHwgdWludAorICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgKVxiL3gKKworICAgICAgUFJFREVDTEFSRURfQ09OU1RBTlRTICA9IC9cYig/OnRydWV8ZmFsc2V8aW90YXxuaWwpXGIvCisKKyAgICAgIFBSRURFQ0xBUkVEX0ZVTkNUSU9OUyAgPSAvXGIoPzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCAgfCBjYXAgICAgIHwgY2xvc2UgICB8IGNvbXBsZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvcHkgICAgfCBkZWxldGUgIHwgaW1hZyAgICB8IGxlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWFrZSAgICB8IG5ldyAgICAgfCBwYW5pYyAgIHwgcHJpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHByaW50bG4gfCByZWFsICAgIHwgcmVjb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcYi94CisKKyAgICAgIHN0YXRlIDpzaW1wbGVfdG9rZW5zIGRvCisgICAgICAgIHJ1bGUoQ09NTUVOVCwgICAgICAgICAgICAgICBDb21tZW50KQorICAgICAgICBydWxlKEtFWVdPUkQsICAgICAgICAgICAgICAgS2V5d29yZCkKKyAgICAgICAgcnVsZShQUkVERUNMQVJFRF9UWVBFUywgICAgIEtleXdvcmQ6OlR5cGUpCisgICAgICAgIHJ1bGUoUFJFREVDTEFSRURfRlVOQ1RJT05TLCBOYW1lOjpCdWlsdGluKQorICAgICAgICBydWxlKFBSRURFQ0xBUkVEX0NPTlNUQU5UUywgTmFtZTo6Q29uc3RhbnQpCisgICAgICAgIHJ1bGUoSU1BR0lOQVJZX0xJVCwgICAgICAgICBOdW0pCisgICAgICAgIHJ1bGUoRkxPQVRfTElULCAgICAgICAgICAgICBOdW0pCisgICAgICAgIHJ1bGUoSU5UX0xJVCwgICAgICAgICAgICAgICBOdW0pCisgICAgICAgIHJ1bGUoQ0hBUl9MSVQsICAgICAgICAgICAgICBTdHI6OkNoYXIpCisgICAgICAgIHJ1bGUoT1BFUkFUT1IsICAgICAgICAgICAgICBPcGVyYXRvcikKKyAgICAgICAgcnVsZShTRVBBUkFUT1IsICAgICAgICAgICAgIFB1bmN0dWF0aW9uKQorICAgICAgICBydWxlKElERU5USUZJRVIsICAgICAgICAgICAgTmFtZSkKKyAgICAgICAgcnVsZShXSElURV9TUEFDRSwgICAgICAgICAgIE90aGVyKQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIG1peGluIDpzaW1wbGVfdG9rZW5zCisKKyAgICAgICAgcnVsZSgvYC8sICAgICAgICAgICAgIFN0ciwgOnJhd19zdHJpbmcpCisgICAgICAgIHJ1bGUoLyIvLCAgICAgICAgICAgICBTdHIsIDppbnRlcnByZXRlZF9zdHJpbmcpCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmludGVycHJldGVkX3N0cmluZyBkbworICAgICAgICBydWxlKEVTQ0FQRV9TRVFVRU5DRSwgU3RyOjpFc2NhcGUpCisgICAgICAgIHJ1bGUoL1xcLi8sICAgICAgICAgICBFcnJvcikKKyAgICAgICAgcnVsZSgvIi8sICAgICAgICAgICAgIFN0ciwgOnBvcCEpCisgICAgICAgIHJ1bGUoL1teIlxcXSsvLCAgICAgICBTdHIpCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJhd19zdHJpbmcgZG8KKyAgICAgICAgcnVsZSgvYC8sICAgICAgICAgICAgIFN0ciwgOnBvcCEpCisgICAgICAgIHJ1bGUoL1teYF0rL20sICAgICAgICBTdHIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2dyYWRsZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2dyYWRsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmYxMmNjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ3JhZGxlLnJiCkBAIC0wLDAgKzEsMzcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBsb2FkX2xleGVyICdncm9vdnkucmInCisKKyAgICBjbGFzcyBHcmFkbGUgPCBHcm9vdnkKKyAgICAgIHRpdGxlICJHcmFkbGUiCisgICAgICBkZXNjICJBIHBvd2VyZnVsIGJ1aWxkIHN5c3RlbSBmb3IgdGhlIEpWTSIKKworICAgICAgdGFnICdncmFkbGUnCisgICAgICBmaWxlbmFtZXMgJyouZ3JhZGxlJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtZ3JhZGxlJworCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAa2V5d29yZHMgfHw9IHN1cGVyICsgU2V0Lm5ldygldygKKyAgICAgICAgICBhbGxwcm9qZWN0cyBhcnRpZmFjdHMgYnVpbGRzY3JpcHQgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMKKyAgICAgICAgICByZXBvc2l0b3JpZXMgc291cmNlU2V0cyBzdWJwcm9qZWN0cyBwdWJsaXNoaW5nCisgICAgICAgICkpCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudHlwZXMKKyAgICAgICAgQHR5cGVzIHx8PSBzdXBlciArIFNldC5uZXcoJXcoCisgICAgICAgICAgUHJvamVjdCBUYXNrIEdyYWRsZSBTZXR0aW5ncyBTY3JpcHQgSmF2YVRvb2xDaGFpbiBTb3VyY2VTZXQKKyAgICAgICAgICBTb3VyY2VTZXRPdXRwdXQgSW5jcmVtZW50YWxUYXNrSW5wdXRzIENvbmZpZ3VyYXRpb24KKyAgICAgICAgICBSZXNvbHV0aW9uU3RyYXRlZ3kgQXJ0aWZhY3RSZXNvbHV0aW9uUXVlcnkgQ29tcG9uZW50U2VsZWN0aW9uCisgICAgICAgICAgQ29tcG9uZW50U2VsZWN0aW9uUnVsZXMgQ29udmVudGlvblByb3BlcnR5IEV4dGVuc2lvbkF3YXJlCisgICAgICAgICAgRXh0cmFQcm9wZXJ0aWVzRXh0ZW5zaW9uIFB1Ymxpc2hpbmdFeHRlbnNpb24gSXZ5UHVibGljYXRpb24KKyAgICAgICAgICBJdnlBcnRpZmFjdCBJdnlBcnRpZmFjdFNldCBJdnlNb2R1bGVEZXNjcmlwdG9yU3BlYworICAgICAgICAgIE1hdmVuUHVibGljYXRpb24gTWF2ZW5BcnRpZmFjdCBNYXZlbkFydGlmYWN0U2V0IE1hdmVuUG9tCisgICAgICAgICAgUGx1Z2luRGVwZW5kZW5jaWVzU3BlYyBQbHVnaW5EZXBlbmRlbmN5U3BlYyBSZXNvdXJjZUhhbmRsZXIKKyAgICAgICAgICBUZXh0UmVzb3VyY2VGYWN0b3J5CisgICAgICAgICkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2dyb292eS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2dyb292eS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzBiNjQxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvZ3Jvb3Z5LnJiCkBAIC0wLDAgKzEsMTA4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgR3Jvb3Z5IDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkdyb292eSIKKyAgICAgIGRlc2MgJ1RoZSBHcm9vdnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKGh0dHA6Ly93d3cuZ3Jvb3Z5LWxhbmcub3JnLyknCisgICAgICB0YWcgJ2dyb292eScKKyAgICAgIGZpbGVuYW1lcyAnKi5ncm9vdnknCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1ncm9vdnknCisKKyAgICAgIHdzID0gJXIoKD86XHN8Ly8uKj9cbnwvWypdLio/WypdLykrKQorCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAa2V5d29yZHMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgYXNzZXJ0IGJyZWFrIGNhc2UgY2F0Y2ggY29udGludWUgZGVmYXVsdCBkbyBlbHNlIGZpbmFsbHkgZm9yCisgICAgICAgICAgaWYgZ290byBpbnN0YW5jZW9mIG5ldyByZXR1cm4gc3dpdGNoIHRoaXMgdGhyb3cgdHJ5IHdoaWxlIGluIGFzCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5kZWNsYXJhdGlvbnMKKyAgICAgICAgQGRlY2xhcmF0aW9ucyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBhYnN0cmFjdCBjb25zdCBlbnVtIGV4dGVuZHMgZmluYWwgaW1wbGVtZW50cyBuYXRpdmUgcHJpdmF0ZQorICAgICAgICAgIHByb3RlY3RlZCBwdWJsaWMgc3RhdGljIHN0cmljdGZwIHN1cGVyIHN5bmNocm9uaXplZCB0aHJvd3MKKyAgICAgICAgICB0cmFuc2llbnQgdm9sYXRpbGUKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnR5cGVzCisgICAgICAgIEB0eXBlcyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBkZWYgYm9vbGVhbiBieXRlIGNoYXIgZG91YmxlIGZsb2F0IGludCBsb25nIHNob3J0IHZvaWQKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmNvbnN0YW50cworICAgICAgICBAY29uc3RhbnRzIHx8PSBTZXQubmV3ICV3KHRydWUgZmFsc2UgbnVsbCkKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlICVyKF4KKyAgICAgICAgICAoXHMqKD86XHdbXHdcZC5cW1xdXSpccyspKz8pICMgcmV0dXJuIGFyZ3VtZW50cworICAgICAgICAgIChcd1tcd1xkXSopICMgbWV0aG9kIG5hbWUKKyAgICAgICAgICAoXHMqKSAoXCgpICMgc2lnbmF0dXJlIHN0YXJ0CisgICAgICAgICl4IGRvIHxtfAorICAgICAgICAgIGRlbGVnYXRlIHNlbGYuY2xvbmUsIG1bMV0KKyAgICAgICAgICB0b2tlbiBOYW1lOjpGdW5jdGlvbiwgbVsyXQorICAgICAgICAgIHRva2VuIFRleHQsIG1bM10KKyAgICAgICAgICB0b2tlbiBPcGVyYXRvciwgbVs0XQorICAgICAgICBlbmQKKworICAgICAgICAjIHdoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAvW15cU1xuXSsvLCBUZXh0CisgICAgICAgIHJ1bGUgJXIoLy8uKj8kKSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgJXIoL1sqXS4qP1sqXS8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgL0Bcd1tcd1xkLl0qLywgTmFtZTo6RGVjb3JhdG9yCisgICAgICAgIHJ1bGUgLyhjbGFzc3xpbnRlcmZhY2V8dHJhaXQpXGIvLCAgS2V5d29yZDo6RGVjbGFyYXRpb24sIDpjbGFzcworICAgICAgICBydWxlIC9wYWNrYWdlXGIvLCBLZXl3b3JkOjpOYW1lc3BhY2UsIDppbXBvcnQKKyAgICAgICAgcnVsZSAvaW1wb3J0XGIvLCBLZXl3b3JkOjpOYW1lc3BhY2UsIDppbXBvcnQKKworICAgICAgICAjIFRPRE86IGhpZ2hsaWdodCBiYWNrc2xhc2ggZXNjYXBlcworICAgICAgICBydWxlIC8iIiIuKj8iIiIvbSwgU3RyOjpEb3VibGUKKyAgICAgICAgcnVsZSAvJycnLio/JycnL20sIFN0cjo6U2luZ2xlCisKKyAgICAgICAgcnVsZSAvIihcXC58XFxcbnwuKSo/Ii8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLycoXFwufFxcXG58LikqPycvLCBTdHI6OlNpbmdsZQorICAgICAgICBydWxlICVyKFwkLyhcJC58LikqPy9cJCltLCBTdHIKKyAgICAgICAgcnVsZSAlcigvKFxcLnxcXFxufC4pKj8vKSwgU3RyCisgICAgICAgIHJ1bGUgLydcXC4nfCdbXlxcXSd8J1xcdVswLTlhLWZdezR9Jy8sIFN0cjo6Q2hhcgorICAgICAgICBydWxlIC8oXC4pKFthLXpBLVpfXVthLXpBLVowLTlfXSopLyBkbworICAgICAgICAgIGdyb3VwcyBPcGVyYXRvciwgTmFtZTo6QXR0cmlidXRlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1thLXpBLVpfXVthLXpBLVowLTlfXSo6LywgTmFtZTo6TGFiZWwKKyAgICAgICAgcnVsZSAvW2EtekEtWl9cJF1bYS16QS1aMC05X10qLyBkbyB8bXwKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmtleXdvcmRzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLmRlY2xhcmF0aW9ucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MudHlwZXMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6VHlwZQorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuY29uc3RhbnRzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlICVyKFt+XiohJSZcW1xdKCl7fTw+XHwrPTo7LC4vPy1dKSwgT3BlcmF0b3IKKworICAgICAgICAjIG51bWJlcnMKKyAgICAgICAgcnVsZSAvXGQrXC5cZCsoW2VFXVxkKyk/W2ZkXT8vLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLzB4WzAtOWEtZl0rLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvWzAtOV0rTD8vLCBOdW06OkludGVnZXIKKyAgICAgICAgcnVsZSAvXG4vLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNsYXNzIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvXHdbXHdcZF0qLywgTmFtZTo6Q2xhc3MsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmltcG9ydCBkbworICAgICAgICBydWxlIC9ccysvLCBUZXh0CisgICAgICAgIHJ1bGUgL1tcd1xkLl0rWypdPy8sIE5hbWU6Ok5hbWVzcGFjZSwgOnBvcCEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvaGFtbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2hhbWwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MjE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2hhbWwucmIKQEAgLTAsMCArMSwyMjggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICAjIEEgbGV4ZXIgZm9yIHRoZSBIYW1sIHRlbXBsYXRpbmcgc3lzdGVtIGZvciBSdWJ5LgorICAgICMgQHNlZSBodHRwOi8vaGFtbC5pbmZvCisgICAgY2xhc3MgSGFtbCA8IFJlZ2V4TGV4ZXIKKyAgICAgIGluY2x1ZGUgSW5kZW50YXRpb24KKworICAgICAgdGl0bGUgIkhhbWwiCisgICAgICBkZXNjICJUaGUgSGFtbCB0ZW1wbGF0aW5nIHN5c3RlbSBmb3IgUnVieSAoaGFtbC5pbmZvKSIKKworICAgICAgdGFnICdoYW1sJworICAgICAgYWxpYXNlcyAnSEFNTCcKKworICAgICAgZmlsZW5hbWVzICcqLmhhbWwnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1oYW1sJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDAuMSBpZiB0ZXh0LnN0YXJ0X3dpdGg/ICchISEnCisgICAgICBlbmQKKworICAgICAgIyBAb3B0aW9uIG9wdHMgOmZpbHRlcnMKKyAgICAgICMgICBBIGhhc2ggb2YgZmlsdGVyIG5hbWUgdG8gbGV4ZXIgb2YgaG93IHZhcmlvdXMgZmlsdGVycyBzaG91bGQgYmUKKyAgICAgICMgICBoaWdobGlnaHRlZC4gIEJ5IGRlZmF1bHQsIDpqYXZhc2NyaXB0LCA6Y3NzLCA6cnVieSwgYW5kIDplcmIKKyAgICAgICMgICBhcmUgc3VwcG9ydGVkLgorICAgICAgZGVmIGluaXRpYWxpemUob3B0cz17fSkKKyAgICAgICAgKG9wdHMuZGVsZXRlKDpmaWx0ZXJzKSB8fCB7fSkuZWFjaCBkbyB8bmFtZSwgbGV4ZXJ8CisgICAgICAgICAgdW5sZXNzIGxleGVyLnJlc3BvbmRfdG8/IDpsZXgKKyAgICAgICAgICAgIGxleGVyID0gTGV4ZXIuZmluZChsZXhlcikgb3IgcmFpc2UgInVua25vd24gbGV4ZXI6ICN7bGV4ZXJ9IgorICAgICAgICAgICAgbGV4ZXIgPSBsZXhlci5uZXcob3B0aW9ucykKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIHNlbGYuZmlsdGVyc1tuYW1lLnRvX3NdID0gbGV4ZXIKKyAgICAgICAgZW5kCisKKyAgICAgICAgc3VwZXIob3B0cykKKyAgICAgIGVuZAorCisgICAgICBkZWYgcnVieQorICAgICAgICBAcnVieSB8fD0gUnVieS5uZXcob3B0aW9ucykKKyAgICAgIGVuZAorCisgICAgICBkZWYgaHRtbAorICAgICAgICBAaHRtbCB8fD0gSFRNTC5uZXcob3B0aW9ucykKKyAgICAgIGVuZAorCisgICAgICBkZWYgZmlsdGVycworICAgICAgICBAZmlsdGVycyB8fD0geworICAgICAgICAgICdqYXZhc2NyaXB0JyA9PiBKYXZhc2NyaXB0Lm5ldyhvcHRpb25zKSwKKyAgICAgICAgICAnY3NzJyA9PiBDU1MubmV3KG9wdGlvbnMpLAorICAgICAgICAgICdydWJ5JyA9PiBydWJ5LAorICAgICAgICAgICdlcmInID0+IEVSQi5uZXcob3B0aW9ucyksCisgICAgICAgICAgJ21hcmtkb3duJyA9PiBNYXJrZG93bi5uZXcob3B0aW9ucyksCisgICAgICAgICAgIyBUT0RPCisgICAgICAgICAgIyAnc2FzcycgPT4gU2Fzcy5uZXcob3B0aW9ucyksCisgICAgICAgICAgIyAndGV4dGlsZScgPT4gVGV4dGlsZS5uZXcob3B0aW9ucyksCisgICAgICAgICAgIyAnbWFydWt1JyA9PiBNYXJ1a3UubmV3KG9wdGlvbnMpLAorICAgICAgICB9CisgICAgICBlbmQKKworICAgICAgc3RhcnQgeyBydWJ5LnJlc2V0ITsgaHRtbC5yZXNldCEgfQorCisgICAgICBpZGVudGlmaWVyID0gL1tcdzotXSsvCisgICAgICBydWJ5X3ZhciA9IC9bYS16XVx3Ki8KKworICAgICAgIyBIYW1sIGNhbiBpbmNsdWRlICIgfFxuIiBhbnl3aGVyZSwKKyAgICAgICMgd2hpY2ggaXMgaWdub3JlZCBhbmQgdXNlZCB0byB3cmFwIGxvbmcgbGluZXMuCisgICAgICAjIFRvIGFjY29tb2RhdGUgdGhpcywgdXNlIHRoaXMgY3VzdG9tIGZhdXggZG90IGluc3RlYWQuCisgICAgICBkb3QgPSAvWyBdXHxcbig/PS4qWyBdXHwpfC4vCisKKyAgICAgICMgSW4gY2VydGFpbiBwbGFjZXMsIGEgY29tbWEgYXQgdGhlIGVuZCBvZiB0aGUgbGluZQorICAgICAgIyBhbGxvd3MgbGluZSB3cmFwcGluZyBhcyB3ZWxsLgorICAgICAgY29tbWFfZG90ID0gLyxccypcbnwje2RvdH0vCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKlxuLywgVGV4dAorICAgICAgICBydWxlKC9ccyovKSB7IHxtfCB0b2tlbiBUZXh0OyBpbmRlbnRhdGlvbihtWzBdKSB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNvbnRlbnQgZG8KKyAgICAgICAgbWl4aW4gOmNzcworICAgICAgICBydWxlKC8lI3tpZGVudGlmaWVyfS8pIHsgdG9rZW4gTmFtZTo6VGFnOyBnb3RvIDp0YWcgfQorICAgICAgICBydWxlIC8hISEje2RvdH0qXG4vLCBOYW1lOjpOYW1lc3BhY2UsIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoCisgICAgICAgICAgKC8pIChcWyN7ZG90fSo/XF0pICgje2RvdH0qXG4pCisgICAgICAgICl4IGRvCisgICAgICAgICAgZ3JvdXBzIENvbW1lbnQsIENvbW1lbnQ6OlNwZWNpYWwsIENvbW1lbnQKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgJXIoLyN7ZG90fSpcbikgZG8KKyAgICAgICAgICB0b2tlbiBDb21tZW50CisgICAgICAgICAgcG9wIQorICAgICAgICAgIHN0YXJ0c19ibG9jayA6aHRtbF9jb21tZW50X2Jsb2NrCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLy0jI3tkb3R9KlxuLyBkbworICAgICAgICAgIHRva2VuIENvbW1lbnQKKyAgICAgICAgICBwb3AhCisgICAgICAgICAgc3RhcnRzX2Jsb2NrIDpoYW1sX2NvbW1lbnRfYmxvY2sKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvLS8gZG8KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgIHJlc2V0X3N0YWNrCisgICAgICAgICAgcHVzaCA6cnVieV9saW5lCisgICAgICAgIGVuZAorCisgICAgICAgICMgZmlsdGVycworICAgICAgICBydWxlIC86KCN7ZG90fSopXG4vIGRvIHxtfAorICAgICAgICAgIHRva2VuIE5hbWU6OkRlY29yYXRvcgorICAgICAgICAgIHBvcCEKKyAgICAgICAgICBzdGFydHNfYmxvY2sgOmZpbHRlcl9ibG9jaworCisgICAgICAgICAgZmlsdGVyX25hbWUgPSBtWzFdLnN0cmlwCisKKyAgICAgICAgICBAZmlsdGVyX2xleGVyID0gc2VsZi5maWx0ZXJzW2ZpbHRlcl9uYW1lXQorICAgICAgICAgIEBmaWx0ZXJfbGV4ZXIucmVzZXQhIHVubGVzcyBAZmlsdGVyX2xleGVyLm5pbD8KKworICAgICAgICAgIHB1dHMgIiAgICBoYW1sOiBmaWx0ZXIgI3tmaWx0ZXJfbmFtZS5pbnNwZWN0fSAje0BmaWx0ZXJfbGV4ZXIuaW5zcGVjdH0iIGlmIEBkZWJ1ZworICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6ZXZhbF9vcl9wbGFpbgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjc3MgZG8KKyAgICAgICAgcnVsZSgvXC4je2lkZW50aWZpZXJ9LykgeyB0b2tlbiBOYW1lOjpDbGFzczsgZ290byA6dGFnIH0KKyAgICAgICAgcnVsZSgvIyN7aWRlbnRpZmllcn0vKSB7IHRva2VuIE5hbWU6OkZ1bmN0aW9uOyBnb3RvIDp0YWcgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp0YWcgZG8KKyAgICAgICAgbWl4aW4gOmNzcworICAgICAgICBydWxlKC9ceyN7Y29tbWFfZG90fSo/XH0vKSB7IGRlbGVnYXRlIHJ1YnkgfQorICAgICAgICBydWxlKC9cWyN7ZG90fSo/XF0vKSB7IGRlbGVnYXRlIHJ1YnkgfQorICAgICAgICBydWxlIC9cKC8sIFB1bmN0dWF0aW9uLCA6aHRtbF9hdHRyaWJ1dGVzCisgICAgICAgIHJ1bGUgL1xzKlxuLywgVGV4dCwgOnBvcCEKKworICAgICAgICAjIHdoaXRlc3BhY2UgY2hvbXBlcnMKKyAgICAgICAgcnVsZSAvWzw+XXsxLDJ9KD89WyBcdD1dKS8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgbWl4aW4gOmV2YWxfb3JfcGxhaW4KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cGxhaW4gZG8KKyAgICAgICAgcnVsZSgvKFteI1xuXXwjW157XG5dfChcXFxcKSpcXCNceykrLykgeyBkZWxlZ2F0ZSBodG1sIH0KKyAgICAgICAgbWl4aW4gOmludGVycG9sYXRpb24KKyAgICAgICAgcnVsZSgvXG4vKSB7IHRva2VuIFRleHQ7IHJlc2V0X3N0YWNrIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXZhbF9vcl9wbGFpbiBkbworICAgICAgICBydWxlIC9bJiFdPz09LywgUHVuY3R1YXRpb24sIDpwbGFpbgorICAgICAgICBydWxlIC9bJiFdP1s9IV0vIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICByZXNldF9zdGFjaworICAgICAgICAgIHB1c2ggOnJ1YnlfbGluZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlKC8vKSB7IHB1c2ggOnBsYWluIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cnVieV9saW5lIGRvCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnBvcCEKKyAgICAgICAgcnVsZSgvLFsgXHRdKlxuLykgeyBkZWxlZ2F0ZSBydWJ5IH0KKyAgICAgICAgcnVsZSAvWyBdXHxbIFx0XSpcbi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUoLy4qPyg/PSgsJHwgXHwpP1sgXHRdKiQpLykgeyBkZWxlZ2F0ZSBydWJ5IH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aHRtbF9hdHRyaWJ1dGVzIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvI3tpZGVudGlmaWVyfVxzKj0vLCBOYW1lOjpBdHRyaWJ1dGUsIDpodG1sX2F0dHJpYnV0ZV92YWx1ZQorICAgICAgICBydWxlIGlkZW50aWZpZXIsIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBydWxlIC9cKS8sIFRleHQsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmh0bWxfYXR0cmlidXRlX3ZhbHVlIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSBydWJ5X3ZhciwgTmFtZTo6VmFyaWFibGUsIDpwb3AhCisgICAgICAgIHJ1bGUgL0Aje3J1YnlfdmFyfS8sIE5hbWU6OlZhcmlhYmxlOjpJbnN0YW5jZSwgOnBvcCEKKyAgICAgICAgcnVsZSAvXCQje3J1YnlfdmFyfS8sIE5hbWU6OlZhcmlhYmxlOjpHbG9iYWwsIDpwb3AhCisgICAgICAgIHJ1bGUgLycoXFxcXHxcXCd8W14nXG5dKSonLywgU3RyLCA6cG9wIQorICAgICAgICBydWxlIC8iKFxcXFx8XFwifFteIlxuXSkqIi8sIFN0ciwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aHRtbF9jb21tZW50X2Jsb2NrIGRvCisgICAgICAgIHJ1bGUgLyN7ZG90fSsvLCBDb21tZW50CisgICAgICAgIG1peGluIDppbmRlbnRlZF9ibG9jaworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpoYW1sX2NvbW1lbnRfYmxvY2sgZG8KKyAgICAgICAgcnVsZSAvI3tkb3R9Ky8sIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgbWl4aW4gOmluZGVudGVkX2Jsb2NrCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZpbHRlcl9ibG9jayBkbworICAgICAgICBydWxlIC8oW14jXG5dfCNbXntcbl18KFxcXFwpKlxcI1x7KSsvIGRvCisgICAgICAgICAgaWYgQGZpbHRlcl9sZXhlcgorICAgICAgICAgICAgZGVsZWdhdGUgQGZpbHRlcl9sZXhlcgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkRlY29yYXRvcgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6aW50ZXJwb2xhdGlvbgorICAgICAgICBtaXhpbiA6aW5kZW50ZWRfYmxvY2sKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW50ZXJwb2xhdGlvbiBkbworICAgICAgICBydWxlIC8jW3tdLywgU3RyOjpJbnRlcnBvbCwgOnJ1YnkKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cnVieSBkbworICAgICAgICBydWxlIC9bfV0vLCBTdHI6OkludGVycG9sLCA6cG9wIQorICAgICAgICBtaXhpbiA6cnVieV9pbm5lcgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpydWJ5X2lubmVyIGRvCisgICAgICAgIHJ1bGUoL1t7XS8pIHsgZGVsZWdhdGUgcnVieTsgcHVzaCA6cnVieV9pbm5lciB9CisgICAgICAgIHJ1bGUoL1t9XS8pIHsgZGVsZWdhdGUgcnVieTsgcG9wISB9CisgICAgICAgIHJ1bGUoL1tee31dKy8pIHsgZGVsZWdhdGUgcnVieSB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmluZGVudGVkX2Jsb2NrIGRvCisgICAgICAgIHJ1bGUoL1xuLykgeyB0b2tlbiBUZXh0OyByZXNldF9zdGFjayB9CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2hhbmRsZWJhcnMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9oYW5kbGViYXJzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzg2MTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9oYW5kbGViYXJzLnJiCkBAIC0wLDAgKzEsNzkgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBIYW5kbGViYXJzIDwgVGVtcGxhdGVMZXhlcgorICAgICAgdGl0bGUgIkhhbmRsZWJhcnMiCisgICAgICBkZXNjICd0aGUgSGFuZGxlYmFycyBhbmQgTXVzdGFjaGUgdGVtcGxhdGluZyBsYW5ndWFnZXMnCisgICAgICB0YWcgJ2hhbmRsZWJhcnMnCisgICAgICBhbGlhc2VzICdoYnMnLCAnbXVzdGFjaGUnCisgICAgICBmaWxlbmFtZXMgJyouaGFuZGxlYmFycycsICcqLmhicycsICcqLm11c3RhY2hlJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtaGFuZGxlYmFycycsICd0ZXh0L3gtbXVzdGFjaGUnCisKKyAgICAgIGlkID0gJXIoW1x3JC1dKykKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgIyBlc2NhcGVkIHNsYXNoZXMKKyAgICAgICAgcnVsZSgvXFx7Ky8pIHsgZGVsZWdhdGUgcGFyZW50IH0KKworICAgICAgICAjIGJsb2NrIGNvbW1lbnRzCisgICAgICAgIHJ1bGUgL3t7IS0tLywgQ29tbWVudCwgOmNvbW1lbnQKKyAgICAgICAgcnVsZSAve3shLio/fX0vLCBDb21tZW50CisKKyAgICAgICAgcnVsZSAve3t7Py8gZG8KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgcHVzaCA6c3RhY2hlCisgICAgICAgICAgcHVzaCA6b3Blbl9zeW0KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSgvKC4rPykoPz1cXHx7eykvbSkgeyBkZWxlZ2F0ZSBwYXJlbnQgfQorCisgICAgICAgICMgaWYgd2UgZ2V0IGhlcmUsIHRoZXJlJ3Mgbm8gbW9yZSBtdXN0YWNoZSB0YWdzLCBzbyB3ZSBlYXQKKyAgICAgICAgIyB0aGUgcmVzdCBvZiB0aGUgZG9jCisgICAgICAgIHJ1bGUoLy4rL20pIHsgZGVsZWdhdGUgcGFyZW50IH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29tbWVudCBkbworICAgICAgICBydWxlKC97ey8pIHsgdG9rZW4gQ29tbWVudDsgcHVzaCB9CisgICAgICAgIHJ1bGUoL319LykgeyB0b2tlbiBDb21tZW50OyBwb3AhIH0KKyAgICAgICAgcnVsZSgvW157fV0rL20pIHsgdG9rZW4gQ29tbWVudCB9CisgICAgICAgIHJ1bGUoL1t7fV0vKSB7IHRva2VuIENvbW1lbnQgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdGFjaGUgZG8KKyAgICAgICAgcnVsZSAvfX19Py8sIEtleXdvcmQsIDpwb3AhCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgL1s9XS8sIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgL1tcW1xdXS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL1suXSg/PVt9XHNdKS8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgL1suXVsuXS8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgJXIoWy8uXSksIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgLyIoXFwufC4pKj8iLywgU3RyOjpEb3VibGUKKyAgICAgICAgcnVsZSAvJyhcXC58LikqPycvLCBTdHI6OlNpbmdsZQorICAgICAgICBydWxlIC9cZCsoPz19XHMpLywgTnVtCisgICAgICAgIHJ1bGUgLyh0cnVlfGZhbHNlKSg/PVt9XHNdKS8sIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgIHJ1bGUgL2Vsc2UoPz1bfVxzXSkvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgL3RoaXMoPz1bfVxzXSkvLCBOYW1lOjpCdWlsdGluOjpQc2V1ZG8KKyAgICAgICAgcnVsZSAvQCN7aWR9LywgTmFtZTo6QXR0cmlidXRlCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OlZhcmlhYmxlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm9wZW5fc3ltIGRvCisgICAgICAgIHJ1bGUgJXIoWyMvXSkgZG8KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZ290byA6YmxvY2tfbmFtZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9bPl4mXS8sIEtleXdvcmQKKworICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpibG9ja19uYW1lIGRvCisgICAgICAgIHJ1bGUgL2lmKD89W31cc10pLywgS2V5d29yZAorICAgICAgICBydWxlIGlkLCBOYW1lOjpOYW1lc3BhY2UsIDpwb3AhCisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2hhc2tlbGwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9oYXNrZWxsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTg2NjQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9oYXNrZWxsLnJiCkBAIC0wLDAgKzEsMTgzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgSGFza2VsbCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJIYXNrZWxsIgorICAgICAgZGVzYyAiVGhlIEhhc2tlbGwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKGhhc2tlbGwub3JnKSIKKworICAgICAgdGFnICdoYXNrZWxsJworICAgICAgYWxpYXNlcyAnaHMnCisgICAgICBmaWxlbmFtZXMgJyouaHMnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1oYXNrZWxsJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPygncnVuaGFza2VsbCcpCisgICAgICBlbmQKKworICAgICAgcmVzZXJ2ZWQgPSAldygKKyAgICAgICAgXyBjYXNlIGNsYXNzIGRhdGEgZGVmYXVsdCBkZXJpdmluZyBkbyBlbHNlIGlmIGluCisgICAgICAgIGluZml4W2xyXT8gaW5zdGFuY2UgbGV0IG5ld3R5cGUgb2YgdGhlbiB0eXBlIHdoZXJlCisgICAgICApCisKKyAgICAgIGFzY2lpID0gJXcoCisgICAgICAgIE5VTCBTT0ggW1NFXVRYIEVPVCBFTlEgQUNLIEJFTCBCUyBIVCBMRiBWVCBGRiBDUiBTW09JXSBETEUKKyAgICAgICAgRENbMS00XSBOQUsgU1lOIEVUQiBDQU4gRU0gU1VCIEVTQyBbRkdSVV1TIFNQIERFTAorICAgICAgKQorCisgICAgICBzdGF0ZSA6YmFzaWMgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgcnVsZSAvey0jLywgQ29tbWVudDo6UHJlcHJvYywgOmNvbW1lbnRfcHJlcHJvYworICAgICAgICBydWxlIC97LS8sIENvbW1lbnQ6Ok11bHRpbGluZSwgOmNvbW1lbnQKKyAgICAgICAgcnVsZSAvXi0tXHMrXHwuKj8kLywgQ29tbWVudDo6RG9jCisgICAgICAgICMgdGhpcyBpcyBjb21wbGljYXRlZCBpbiBvcmRlciB0byBzdXBwb3J0IGN1c3RvbSBzeW1ib2xzCisgICAgICAgICMgbGlrZSAtLT4KKyAgICAgICAgcnVsZSAvLS0oPyFbISNcJFwlJiorLlwvPD0+P0BcXlx8X35dKS4qPyQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgIGVuZAorCisgICAgICAjIG5lc3RlZCBjb21tZW50aW5nCisgICAgICBzdGF0ZSA6Y29tbWVudCBkbworICAgICAgICBydWxlIC8tfS8sIENvbW1lbnQ6Ok11bHRpbGluZSwgOnBvcCEKKyAgICAgICAgcnVsZSAvey0vLCBDb21tZW50OjpNdWx0aWxpbmUsIDpjb21tZW50CisgICAgICAgIHJ1bGUgL1teLXt9XSsvLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgcnVsZSAvWy17fV0vLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29tbWVudF9wcmVwcm9jIGRvCisgICAgICAgIHJ1bGUgLy19LywgQ29tbWVudDo6UHJlcHJvYywgOnBvcCEKKyAgICAgICAgcnVsZSAvey0vLCBDb21tZW50OjpQcmVwcm9jLCA6Y29tbWVudAorICAgICAgICBydWxlIC9bXi17fV0rLywgQ29tbWVudDo6UHJlcHJvYworICAgICAgICBydWxlIC9bLXt9XS8sIENvbW1lbnQ6OlByZXByb2MKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6YmFzaWMKKworICAgICAgICBydWxlIC9cYmltcG9ydFxiLywgS2V5d29yZDo6UmVzZXJ2ZWQsIDppbXBvcnQKKyAgICAgICAgcnVsZSAvXGJtb2R1bGVcYi8sIEtleXdvcmQ6OlJlc2VydmVkLCA6bW9kdWxlCisgICAgICAgIHJ1bGUgL1xiZXJyb3JcYi8sIE5hbWU6OkV4Y2VwdGlvbgorICAgICAgICBydWxlIC9cYig/OiN7cmVzZXJ2ZWQuam9pbignfCcpfSlcYi8sIEtleXdvcmQ6OlJlc2VydmVkCisgICAgICAgICMgbm90IHN1cmUgd2h5LCBidXQgXiBkb2Vzbid0IHdvcmsgaGVyZQorICAgICAgICAjIHJ1bGUgL15bX2Etel1bXHcnXSovLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICBydWxlIC9bX2Etel1bXHcnXSovLCBOYW1lCisgICAgICAgIHJ1bGUgL1tBLVpdW1x3J10qLywgS2V5d29yZDo6VHlwZQorCisgICAgICAgICMgbGFtYmRhIG9wZXJhdG9yCisgICAgICAgIHJ1bGUgJXIoXFwoPyFbOiEjXCRcJSYqKy5cXC88PT4/QF5cfH4tXSspKSwgTmFtZTo6RnVuY3Rpb24KKyAgICAgICAgIyBzcGVjaWFsIG9wZXJhdG9ycworICAgICAgICBydWxlICVyKCg8LXw6OnwtPnw9Pnw9KSg/IVs6ISNcJFwlJiorLlxcLzw9Pj9AXlx8fi1dKykpLCBPcGVyYXRvcgorICAgICAgICAjIGNvbnN0cnVjdG9yL3R5cGUgb3BlcmF0b3JzCisgICAgICAgIHJ1bGUgJXIoOls6ISNcJFwlJiorLlxcLzw9Pj9AXlx8fi1dKiksIE9wZXJhdG9yCisgICAgICAgICMgb3RoZXIgb3BlcmF0b3JzCisgICAgICAgIHJ1bGUgJXIoWzohI1wkXCUmKisuXFwvPD0+P0BeXHx+LV0rKSwgT3BlcmF0b3IKKworICAgICAgICBydWxlIC9cZCtlWystXT9cZCsvaSwgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9cZCtcLlxkKyhlWystXT9cZCspPy9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLzBvWzAtN10rL2ksIE51bTo6T2N0CisgICAgICAgIHJ1bGUgLzB4W1xkYS1mXSsvaSwgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvXGQrLywgTnVtOjpJbnRlZ2VyCisKKyAgICAgICAgcnVsZSAvJy8sIFN0cjo6Q2hhciwgOmNoYXJhY3RlcgorICAgICAgICBydWxlIC8iLywgU3RyLCA6c3RyaW5nCisKKyAgICAgICAgcnVsZSAvXFtccypcXS8sIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgcnVsZSAvXChccypcKS8sIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgcnVsZSAvW1xbXF0oKSw7YHt9XS8sIFB1bmN0dWF0aW9uCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmltcG9ydCBkbworICAgICAgICBydWxlIC9ccysvLCBUZXh0CisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpzdHJpbmcKKyAgICAgICAgcnVsZSAvXGJxdWFsaWZpZWRcYi8sIEtleXdvcmQKKyAgICAgICAgIyBpbXBvcnQgWCBhcyBZCisgICAgICAgIHJ1bGUgLyhbQS1aXVtcdy5dKikoXHMrKShhcykoXHMrKShbQS1aXVthLXpBLVowLTlfLl0qKS8gZG8KKyAgICAgICAgICBncm91cHMoCisgICAgICAgICAgICBOYW1lOjpOYW1lc3BhY2UsICMgWAorICAgICAgICAgICAgVGV4dCwgS2V5d29yZCwgIyBhcworICAgICAgICAgICAgVGV4dCwgTmFtZSAjIFkKKyAgICAgICAgICApCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICAjIGltcG9ydCBYIGhpZGluZyAoZnVuY3Rpb25zKQorICAgICAgICBydWxlIC8oW0EtWl1bXHcuXSopKFxzKykoaGlkaW5nKShccyspKFwoKS8gZG8KKyAgICAgICAgICBncm91cHMoCisgICAgICAgICAgICBOYW1lOjpOYW1lc3BhY2UsICMgWAorICAgICAgICAgICAgVGV4dCwgS2V5d29yZCwgIyBoaWRpbmcKKyAgICAgICAgICAgIFRleHQsIFB1bmN0dWF0aW9uICMgKAorICAgICAgICAgICkKKyAgICAgICAgICBnb3RvIDpmdW5jbGlzdAorICAgICAgICBlbmQKKworICAgICAgICAjIGltcG9ydCBYIChmdW5jdGlvbnMpCisgICAgICAgIHJ1bGUgLyhbQS1aXVtcdy5dKikoXHMrKShcKCkvIGRvCisgICAgICAgICAgZ3JvdXBzKAorICAgICAgICAgICAgTmFtZTo6TmFtZXNwYWNlLCAjIFgKKyAgICAgICAgICAgIFRleHQsCisgICAgICAgICAgICBQdW5jdHVhdGlvbiAjICgKKyAgICAgICAgICApCisgICAgICAgICAgZ290byA6ZnVuY2xpc3QKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvW1x3Ll0rLywgTmFtZTo6TmFtZXNwYWNlLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptb2R1bGUgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICAjIG1vZHVsZSBGb28gKGZ1bmN0aW9ucykKKyAgICAgICAgcnVsZSAvKFtBLVpdW1x3Ll0qKShccyspKFwoKS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6TmFtZXNwYWNlLCBUZXh0LCBQdW5jdHVhdGlvbgorICAgICAgICAgIHB1c2ggOmZ1bmNsaXN0CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1xid2hlcmVcYi8sIEtleXdvcmQ6OlJlc2VydmVkLCA6cG9wIQorCisgICAgICAgIHJ1bGUgL1tBLVpdW2EtekEtWjAtOV8uXSovLCBOYW1lOjpOYW1lc3BhY2UsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZ1bmNsaXN0IGRvCisgICAgICAgIG1peGluIDpiYXNpYworICAgICAgICBydWxlIC9bQS1aXVx3Ki8sIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgcnVsZSAvKF9bXHdcJ10rfFthLXpdW1x3XCddKikvLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICBydWxlIC8sLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvWzohI1wkXCUmKisuXFxcLzw9Pj9AXlx8fi1dKy8sIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgL1woLywgUHVuY3R1YXRpb24sIDpmdW5jbGlzdAorICAgICAgICBydWxlIC9cKS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjaGFyYWN0ZXIgZG8KKyAgICAgICAgcnVsZSAvXFwvIGRvCisgICAgICAgICAgdG9rZW4gU3RyOjpFc2NhcGUKKyAgICAgICAgICBwdXNoIDpjaGFyYWN0ZXJfZW5kCisgICAgICAgICAgcHVzaCA6ZXNjYXBlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLy4vIGRvCisgICAgICAgICAgdG9rZW4gU3RyOjpDaGFyCisgICAgICAgICAgZ290byA6Y2hhcmFjdGVyX2VuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y2hhcmFjdGVyX2VuZCBkbworICAgICAgICBydWxlIC8nLywgU3RyOjpDaGFyLCA6cG9wIQorICAgICAgICBydWxlIC8uLywgRXJyb3IsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZyBkbworICAgICAgICBydWxlIC8iLywgU3RyLCA6cG9wIQorICAgICAgICBydWxlIC9cXC8sIFN0cjo6RXNjYXBlLCA6ZXNjYXBlCisgICAgICAgIHJ1bGUgL1teXFwiXSsvLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXNjYXBlIGRvCisgICAgICAgIHJ1bGUgL1thYmZucnR2IicmXFxdLywgU3RyOjpFc2NhcGUsIDpwb3AhCisgICAgICAgIHJ1bGUgL1xeW1xdXFtBLVpAXF5fXS8sIFN0cjo6RXNjYXBlLCA6cG9wIQorICAgICAgICBydWxlIC8je2FzY2lpLmpvaW4oJ3wnKX0vLCBTdHI6OkVzY2FwZSwgOnBvcCEKKyAgICAgICAgcnVsZSAvb1swLTddKy9pLCBTdHI6OkVzY2FwZSwgOnBvcCEKKyAgICAgICAgcnVsZSAveFtcZGEtZl0vaSwgU3RyOjpFc2NhcGUsIDpwb3AhCisgICAgICAgIHJ1bGUgL1xkKy8sIFN0cjo6RXNjYXBlLCA6cG9wIQorICAgICAgICBydWxlIC9ccytcXC8sIFN0cjo6RXNjYXBlLCA6cG9wIQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9odG1sLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvaHRtbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBkYTJmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvaHRtbC5yYgpAQCAtMCwwICsxLDk0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgSFRNTCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJIVE1MIgorICAgICAgZGVzYyAiSFRNTCwgdGhlIG1hcmt1cCBsYW5ndWFnZSBvZiB0aGUgd2ViIgorICAgICAgdGFnICdodG1sJworICAgICAgZmlsZW5hbWVzICcqLmh0bScsICcqLmh0bWwnLCAnKi54aHRtbCcKKyAgICAgIG1pbWV0eXBlcyAndGV4dC9odG1sJywgJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcKKworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KHRleHQpCisgICAgICAgIHJldHVybiAxIGlmIHRleHQuZG9jdHlwZT8oL1xiaHRtbFxiL2kpCisgICAgICAgIHJldHVybiAxIGlmIHRleHQgPX4gLzxccypodG1sXGIvCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvW148Jl0rL20sIFRleHQKKyAgICAgICAgcnVsZSAvJlxTKj87LywgTmFtZTo6RW50aXR5CisgICAgICAgIHJ1bGUgLzwhRE9DVFlQRSAuKj8+L2ltLCBDb21tZW50OjpQcmVwcm9jCisgICAgICAgIHJ1bGUgLzwhXFtDREFUQVxbLio/XF1cXT4vbSwgQ29tbWVudDo6UHJlcHJvYworICAgICAgICBydWxlIC88IS0tLywgQ29tbWVudCwgOmNvbW1lbnQKKyAgICAgICAgcnVsZSAvPFw/Lio/XD8+L20sIENvbW1lbnQ6OlByZXByb2MgIyBwaHA/IHJlYWxseT8KKworICAgICAgICBydWxlIC88XHMqc2NyaXB0XHMqL20gZG8KKyAgICAgICAgICB0b2tlbiBOYW1lOjpUYWcKKyAgICAgICAgICBwdXNoIDpzY3JpcHRfY29udGVudAorICAgICAgICAgIHB1c2ggOnRhZworICAgICAgICBlbmQKKworICAgICAgICBydWxlIC88XHMqc3R5bGVccyovbSBkbworICAgICAgICAgIHRva2VuIE5hbWU6OlRhZworICAgICAgICAgIHB1c2ggOnN0eWxlX2NvbnRlbnQKKyAgICAgICAgICBwdXNoIDp0YWcKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAlcig8XHMqW2EtekEtWjAtOTotXSspLCBOYW1lOjpUYWcsIDp0YWcgIyBvcGVuaW5nIHRhZ3MKKyAgICAgICAgcnVsZSAlcig8XHMqL1xzKlthLXpBLVowLTk6LV0rXHMqPiksIE5hbWU6OlRhZyAjIGNsb3NpbmcgdGFncworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tZW50IGRvCisgICAgICAgIHJ1bGUgL1teLV0rLywgQ29tbWVudAorICAgICAgICBydWxlIC8tLT4vLCBDb21tZW50LCA6cG9wIQorICAgICAgICBydWxlIC8tLywgQ29tbWVudAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp0YWcgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgcnVsZSAvW2EtekEtWjAtOV86LV0rXHMqPS9tLCBOYW1lOjpBdHRyaWJ1dGUsIDphdHRyCisgICAgICAgIHJ1bGUgL1thLXpBLVowLTlfOi1dKy8sIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBydWxlICVyKC8/XHMqPiltLCBOYW1lOjpUYWcsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmF0dHIgZG8KKyAgICAgICAgIyBUT0RPOiBhcmUgYmFja3NsYXNoIGVzY2FwZXMgdmFsaWQgaGVyZT8KKyAgICAgICAgcnVsZSAvIi8gZG8KKyAgICAgICAgICB0b2tlbiBTdHIKKyAgICAgICAgICBnb3RvIDpkcQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8nLyBkbworICAgICAgICAgIHRva2VuIFN0cgorICAgICAgICAgIGdvdG8gOnNxCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1teXHM+XSsvLCBTdHIsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRxIGRvCisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpwb3AhCisgICAgICAgIHJ1bGUgL1teIl0rLywgU3RyCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNxIGRvCisgICAgICAgIHJ1bGUgLycvLCBTdHIsIDpwb3AhCisgICAgICAgIHJ1bGUgL1teJ10rLywgU3RyCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNjcmlwdF9jb250ZW50IGRvCisgICAgICAgIHJ1bGUgJXIoPFxzKi9ccypzY3JpcHRccyo+KW0sIE5hbWU6OlRhZywgOnBvcCEKKyAgICAgICAgcnVsZSAlciguKj8oPz08XHMqL1xzKnNjcmlwdFxzKj4pKW0gZG8KKyAgICAgICAgICBkZWxlZ2F0ZSBKYXZhc2NyaXB0CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHlsZV9jb250ZW50IGRvCisgICAgICAgIHJ1bGUgJXIoPFxzKi9ccypzdHlsZVxzKj4pbSwgTmFtZTo6VGFnLCA6cG9wIQorICAgICAgICBydWxlICVyKC4qKD89PFxzKi9ccypzdHlsZVxzKj4pKW0gZG8KKyAgICAgICAgICBkZWxlZ2F0ZSBDU1MKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2h0dHAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9odHRwLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTEwMjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9odHRwLnJiCkBAIC0wLDAgKzEsODAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBIVFRQIDwgUmVnZXhMZXhlcgorICAgICAgdGFnICdodHRwJworICAgICAgdGl0bGUgIkhUVFAiCisgICAgICBkZXNjICdodHRwIHJlcXVlc3RzIGFuZCByZXNwb25zZXMnCisKKyAgICAgIGRlZiBzZWxmLmh0dHBfbWV0aG9kcworICAgICAgICBAaHR0cF9tZXRob2RzIHx8PSAldyhHRVQgUE9TVCBQVVQgREVMRVRFIEhFQUQgT1BUSU9OUyBUUkFDRSBQQVRDSCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udGVudF9sZXhlcgorICAgICAgICByZXR1cm4gTGV4ZXJzOjpQbGFpblRleHQgdW5sZXNzIEBjb250ZW50X3R5cGUKKworICAgICAgICBAY29udGVudF9sZXhlciB8fD0gTGV4ZXIuZ3Vlc3NfYnlfbWltZXR5cGUoQGNvbnRlbnRfdHlwZSkKKyAgICAgIHJlc2N1ZSBMZXhlcjo6QW1iaWd1b3VzR3Vlc3MKKyAgICAgICAgQGNvbnRlbnRfbGV4ZXIgPSBMZXhlcnM6OlBsYWluVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXJ0IHsgQGNvbnRlbnRfdHlwZSA9ICd0ZXh0L3BsYWluJyB9CisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgICMgcmVxdWVzdAorICAgICAgICBydWxlICVyKAorICAgICAgICAgICgje0hUVFAuaHR0cF9tZXRob2RzLmpvaW4oJ3wnKX0pKFsgXSspICMgbWV0aG9kCisgICAgICAgICAgKFteIF0rKShbIF0rKSAgICAgICAgICAgICAgICAgICAgICMgcGF0aAorICAgICAgICAgIChIVFRQUz8pKC8pKDFbLl1bMDFdKShccj9cbnwkKSAgIyBodHRwIHZlcnNpb24KKyAgICAgICAgKW94IGRvCisgICAgICAgICAgZ3JvdXBzKAorICAgICAgICAgICAgTmFtZTo6RnVuY3Rpb24sIFRleHQsCisgICAgICAgICAgICBOYW1lOjpOYW1lc3BhY2UsIFRleHQsCisgICAgICAgICAgICBLZXl3b3JkLCBPcGVyYXRvciwgTnVtLCBUZXh0CisgICAgICAgICAgKQorCisgICAgICAgICAgcHVzaCA6aGVhZGVycworICAgICAgICBlbmQKKworICAgICAgICAjIHJlc3BvbnNlCisgICAgICAgIHJ1bGUgJXIoCisgICAgICAgICAgKEhUVFBTPykoLykoMVsuXVswMV0pKFsgXSspICMgaHR0cCB2ZXJzaW9uCisgICAgICAgICAgKFxkezN9KShbIF0rKSAgICAgICAgICAgICAgICMgc3RhdHVzCisgICAgICAgICAgKFteXHJcbl0rKShccj9cbnwkKSAgICAgICAjIHN0YXR1cyBtZXNzYWdlCisgICAgICAgICl4IGRvCisgICAgICAgICAgZ3JvdXBzKAorICAgICAgICAgICAgS2V5d29yZCwgT3BlcmF0b3IsIE51bSwgVGV4dCwKKyAgICAgICAgICAgIE51bSwgVGV4dCwKKyAgICAgICAgICAgIE5hbWU6OkV4Y2VwdGlvbiwgVGV4dAorICAgICAgICAgICkKKyAgICAgICAgICBwdXNoIDpoZWFkZXJzCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpoZWFkZXJzIGRvCisgICAgICAgIHJ1bGUgLyhbXlxzOl0rKSggKikoOikoICopKFteXHJcbl0rKShccj9cbnwkKS8gZG8gfG18CisgICAgICAgICAga2V5ID0gbVsxXQorICAgICAgICAgIHZhbHVlID0gbVs1XQorICAgICAgICAgIGlmIGtleS5zdHJpcC5kb3duY2FzZSA9PSAnY29udGVudC10eXBlJworICAgICAgICAgICAgQGNvbnRlbnRfdHlwZSA9IHZhbHVlLnNwbGl0KCc7JylbMF0uZG93bmNhc2UKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIGdyb3VwcyBOYW1lOjpBdHRyaWJ1dGUsIFRleHQsIFB1bmN0dWF0aW9uLCBUZXh0LCBTdHIsIFRleHQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKFteXHJcbl0rKShccj9cbnwkKS8gZG8KKyAgICAgICAgICBncm91cHMgU3RyLCBUZXh0CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1xyP1xuLywgVGV4dCwgOmNvbnRlbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29udGVudCBkbworICAgICAgICBydWxlIC8uKy9tIGRvIHxtfAorICAgICAgICAgIGRlbGVnYXRlKGNvbnRlbnRfbGV4ZXIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9pbmkucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9pbmkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0OWQ2MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2luaS5yYgpAQCAtMCwwICsxLDU3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgSU5JIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIklOSSIKKyAgICAgIGRlc2MgJ3RoZSBJTkkgY29uZmlndXJhdGlvbiBmb3JtYXQnCisgICAgICB0YWcgJ2luaScKKworICAgICAgIyBUT0RPIGFkZCBtb3JlIGhlcmUKKyAgICAgIGZpbGVuYW1lcyAnKi5pbmknLCAnKi5JTkknLCAnKi5naXRjb25maWcnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1pbmknCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMC4xIGlmIHRleHQgPX4gL1xBXFtbXHdcLS5dK1xdXHMqW1x3XC1dKz1cdysvCisgICAgICBlbmQKKworICAgICAgaWRlbnRpZmllciA9IC9bXHdcLS5dKy8KKworICAgICAgc3RhdGUgOmJhc2ljIGRvCisgICAgICAgIHJ1bGUgL1s7I10uKj9cbi8sIENvbW1lbnQKKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC9cXFxuLywgU3RyOjpFc2NhcGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6YmFzaWMKKworICAgICAgICBydWxlIC8oI3tpZGVudGlmaWVyfSkoXHMqKSg9KS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6UHJvcGVydHksIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6dmFsdWUKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXFsuKj9cXS8sIE5hbWU6Ok5hbWVzcGFjZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp2YWx1ZSBkbworICAgICAgICBydWxlIC9cbi8sIFRleHQsIDpwb3AhCisgICAgICAgIG1peGluIDpiYXNpYworICAgICAgICBydWxlIC8iLywgU3RyLCA6ZHEKKyAgICAgICAgcnVsZSAvJy4qPycvLCBTdHIKKyAgICAgICAgbWl4aW4gOmVzY19zdHIKKyAgICAgICAgcnVsZSAvW15cXFxuXSsvLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZHEgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOnBvcCEKKyAgICAgICAgbWl4aW4gOmVzY19zdHIKKyAgICAgICAgcnVsZSAvW15cXCJdKy9tLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXNjX3N0ciBkbworICAgICAgICBydWxlIC9cXC4vbSwgU3RyOjpFc2NhcGUKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvaW8ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9pby5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzE1NGMzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvaW8ucmIKQEAgLTAsMCArMSw2OCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIElPIDwgUmVnZXhMZXhlcgorICAgICAgdGFnICdpbycKKyAgICAgIHRpdGxlICJJbyIKKyAgICAgIGRlc2MgJ1RoZSBJTyBwcm9ncmFtbWluZyBsYW5ndWFnZSAoaHR0cDovL2lvbGFuZ3VhZ2UuY29tKScKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LWlvc3JjJworICAgICAgZmlsZW5hbWVzICcqLmlvJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAnaW8nCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29uc3RhbnRzCisgICAgICAgIEBjb25zdGFudHMgfHw9IFNldC5uZXcgJXcobmlsIGZhbHNlIHRydWUpCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGFyZ3MgY2FsbCBjbG9uZSBkbyBkb0ZpbGUgZG9TdHJpbmcgZWxzZSBlbHNlaWYgZm9yIGlmIGxpc3QKKyAgICAgICAgICBtZXRob2QgcmV0dXJuIHN1cGVyIHRoZW4KKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgJXIoLy8uKj9cbiksIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBydWxlICVyKCMuKj9cbiksIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBydWxlICVyKC8oXFxcbik/WypdLio/WypdKFxcXG4pPy8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgJXIoL1srXSksIENvbW1lbnQ6Ok11bHRpbGluZSwgOm5lc3RlZF9jb21tZW50CisKKyAgICAgICAgcnVsZSAvIihcXFxcfFxcInxbXiJdKSoiLywgU3RyCisKKyAgICAgICAgcnVsZSAlcig6Pzo9KSwgS2V5d29yZAorICAgICAgICBydWxlIC9bKCldLywgUHVuY3R1YXRpb24KKworICAgICAgICBydWxlICVyKFstPTssKis+PCEvfF4uJSZcW1xde31dKSwgT3BlcmF0b3IKKworICAgICAgICBydWxlIC9bQS1aXVx3Ki8sIE5hbWU6OkNsYXNzCisKKyAgICAgICAgcnVsZSAvW2Etel9dXHcqLyBkbyB8bXwKKyAgICAgICAgICBuYW1lID0gbVswXQorCisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5jb25zdGFudHMuaW5jbHVkZT8gbmFtZQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6Q29uc3RhbnQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLmJ1aWx0aW5zLmluY2x1ZGU/IG5hbWUKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgJXIoKFxkK1suXT9cZCp8XGQqWy5dXGQrKShlWystXT9bMC05XSspPylpLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL1xkKy8sIE51bTo6SW50ZWdlcgorCisgICAgICAgIHJ1bGUgL0BAPy8sIEtleXdvcmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bmVzdGVkX2NvbW1lbnQgZG8KKyAgICAgICAgcnVsZSAlcihbXi8rXSspbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgJXIoL1srXSksIENvbW1lbnQ6Ok11bHRpbGluZSwgOm5lc3RlZF9jb21tZW50CisgICAgICAgIHJ1bGUgJXIoWytdLyksIENvbW1lbnQ6Ok11bHRpbGluZSwgOnBvcCEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvamF2YS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2phdmEucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExNDJiMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2phdmEucmIKQEAgLTAsMCArMSw3OSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIEphdmEgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiSmF2YSIKKyAgICAgIGRlc2MgIlRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIChqYXZhLmNvbSkiCisKKyAgICAgIHRhZyAnamF2YScKKyAgICAgIGZpbGVuYW1lcyAnKi5qYXZhJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtamF2YScKKworICAgICAga2V5d29yZHMgPSAldygKKyAgICAgICAgYXNzZXJ0IGJyZWFrIGNhc2UgY2F0Y2ggY29udGludWUgZGVmYXVsdCBkbyBlbHNlIGZpbmFsbHkgZm9yCisgICAgICAgIGlmIGdvdG8gaW5zdGFuY2VvZiBuZXcgcmV0dXJuIHN3aXRjaCB0aGlzIHRocm93IHRyeSB3aGlsZQorICAgICAgKQorCisgICAgICBkZWNsYXJhdGlvbnMgPSAldygKKyAgICAgICAgYWJzdHJhY3QgY29uc3QgZW51bSBleHRlbmRzIGZpbmFsIGltcGxlbWVudHMgbmF0aXZlIHByaXZhdGUgcHJvdGVjdGVkCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaWN0ZnAgc3VwZXIgc3luY2hyb25pemVkIHRocm93cyB0cmFuc2llbnQgdm9sYXRpbGUKKyAgICAgICkKKworICAgICAgdHlwZXMgPSAldyhib29sZWFuIGJ5dGUgY2hhciBkb3VibGUgZmxvYXQgaW50IGxvbmcgc2hvcnQgdm9pZCkKKworICAgICAgaWQgPSAvW2EtekEtWl9dW2EtekEtWjAtOV9dKi8KKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvW15cU1xuXSsvLCBUZXh0CisgICAgICAgIHJ1bGUgJXIoLy8uKj8kKSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgJXIoL1wqLio/XCovKW0sIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgICAjIGtleXdvcmRzOiBnbyBiZWZvcmUgbWV0aG9kIG5hbWVzIHRvIGF2b2lkIGxleGluZyAidGhyb3cgbmV3IFhZWiIKKyAgICAgICAgIyBhcyBhIG1ldGhvZCBzaWduYXR1cmUKKyAgICAgICAgcnVsZSAvKD86I3trZXl3b3Jkcy5qb2luKCd8Jyl9KVxiLywgS2V5d29yZAorCisgICAgICAgIHJ1bGUgJXIoCisgICAgICAgICAgKFxzKig/OlthLXpBLVpfXVthLXpBLVowLTlfLlxbXF08Pl0qXHMrKSs/KSAjIHJldHVybiBhcmd1bWVudHMKKyAgICAgICAgICAoW2EtekEtWl9dW2EtekEtWjAtOV9dKikgICAgICAgICAgICAgICAgICAjIG1ldGhvZCBuYW1lCisgICAgICAgICAgKFxzKikoXCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaWduYXR1cmUgc3RhcnQKKyAgICAgICAgKW14IGRvIHxtfAorICAgICAgICAgICMgVE9ETzogZG8gdGhpcyBiZXR0ZXIsIHRoaXMgc2hvdWxkbid0IG5lZWQgYSBkZWxlZ2F0aW9uCisgICAgICAgICAgZGVsZWdhdGUgSmF2YSwgbVsxXQorICAgICAgICAgIHRva2VuIE5hbWU6OkZ1bmN0aW9uLCBtWzJdCisgICAgICAgICAgdG9rZW4gVGV4dCwgbVszXQorICAgICAgICAgIHRva2VuIE9wZXJhdG9yLCBtWzRdCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL0Aje2lkfS8sIE5hbWU6OkRlY29yYXRvcgorICAgICAgICBydWxlIC8oPzoje2RlY2xhcmF0aW9ucy5qb2luKCd8Jyl9KVxiLywgS2V5d29yZDo6RGVjbGFyYXRpb24KKyAgICAgICAgcnVsZSAvKD86I3t0eXBlcy5qb2luKCd8Jyl9KVxiLywgS2V5d29yZDo6VHlwZQorICAgICAgICBydWxlIC9wYWNrYWdlXGIvLCBLZXl3b3JkOjpOYW1lc3BhY2UKKyAgICAgICAgcnVsZSAvKD86dHJ1ZXxmYWxzZXxudWxsKVxiLywgS2V5d29yZDo6Q29uc3RhbnQKKyAgICAgICAgcnVsZSAvKD86Y2xhc3N8aW50ZXJmYWNlKVxiLywgS2V5d29yZDo6RGVjbGFyYXRpb24sIDpjbGFzcworICAgICAgICBydWxlIC9pbXBvcnRcYi8sIEtleXdvcmQ6Ok5hbWVzcGFjZSwgOmltcG9ydAorICAgICAgICBydWxlIC8iKFxcXFx8XFwifFteIl0pKiIvLCBTdHIKKyAgICAgICAgcnVsZSAvJyg/OlxcLnxbXlxcXXxcXHVbMC05YS1mXXs0fSknLywgU3RyOjpDaGFyCisgICAgICAgIHJ1bGUgLyhcLikoI3tpZH0pLyBkbworICAgICAgICAgIGdyb3VwcyBPcGVyYXRvciwgTmFtZTo6QXR0cmlidXRlCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC8je2lkfTovLCBOYW1lOjpMYWJlbAorICAgICAgICBydWxlIC9cJD8je2lkfS8sIE5hbWUKKyAgICAgICAgcnVsZSAvW35eKiElJlxbXF0oKXt9PD5cfCs9OjssLlwvPy1dLywgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvWzAtOV1bMC05XSpcLlswLTldKyhbZUVdWzAtOV0rKT9bZmRdPy8sIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvMHhbMC05YS1mXSsvLCBOdW06OkhleAorICAgICAgICBydWxlIC9bMC05XStMPy8sIE51bTo6SW50ZWdlcgorICAgICAgICBydWxlIC9cbi8sIFRleHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y2xhc3MgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgcnVsZSBpZCwgTmFtZTo6Q2xhc3MsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmltcG9ydCBkbworICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgICBydWxlIC9bYS16MC05Xy5dK1wqPy9pLCBOYW1lOjpOYW1lc3BhY2UsIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2phdmFzY3JpcHQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9qYXZhc2NyaXB0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2E5NWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9qYXZhc2NyaXB0LnJiCkBAIC0wLDAgKzEsMzEzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgIyBJTVBPUlRBTlQgTk9USUNFOgorICAgICMKKyAgICAjIFBsZWFzZSBkbyBub3QgY29weSB0aGlzIGxleGVyIGFuZCBvcGVuIGEgcHVsbCByZXF1ZXN0CisgICAgIyBmb3IgYSBuZXcgbGFuZ3VhZ2UuIEl0IHdpbGwgbm90IGdldCBtZXJnZWQsIHlvdSB3aWxsCisgICAgIyBiZSB1bmhhcHB5LCBhbmQga2l0dGVucyB3aWxsIGNyeS4KKyAgICAjCisgICAgY2xhc3MgSmF2YXNjcmlwdCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJKYXZhU2NyaXB0IgorICAgICAgZGVzYyAiSmF2YVNjcmlwdCwgdGhlIGJyb3dzZXIgc2NyaXB0aW5nIGxhbmd1YWdlIgorCisgICAgICB0YWcgJ2phdmFzY3JpcHQnCisgICAgICBhbGlhc2VzICdqcycKKyAgICAgIGZpbGVuYW1lcyAnKi5qcycKKyAgICAgIG1pbWV0eXBlcyAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnLAorICAgICAgICAgICAgICAgICd0ZXh0L2phdmFzY3JpcHQnLCAndGV4dC94LWphdmFzY3JpcHQnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnNoZWJhbmc/KCdub2RlJykKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPygnanNjJykKKyAgICAgICAgIyBUT0RPOiByaGlubywgc3BpZGVybW9ua2V5LCBldGMKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29tbWVudHNfYW5kX3doaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC88IS0tLywgQ29tbWVudCAjIHJlYWxseS4uLj8KKyAgICAgICAgcnVsZSAlcigvLy4qPyQpLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcigvXCouKj9cKi8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmV4cHJfc3RhcnQgZG8KKyAgICAgICAgbWl4aW4gOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSAlcigvKSBkbworICAgICAgICAgIHRva2VuIFN0cjo6UmVnZXgKKyAgICAgICAgICBnb3RvIDpyZWdleAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9be10vIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICBnb3RvIDpvYmplY3QKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvLywgVGV4dCwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cmVnZXggZG8KKyAgICAgICAgcnVsZSAlcigvKSBkbworICAgICAgICAgIHRva2VuIFN0cjo6UmVnZXgKKyAgICAgICAgICBnb3RvIDpyZWdleF9lbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAlcihbXi9dXG4pLCBFcnJvciwgOnBvcCEKKworICAgICAgICBydWxlIC9cbi8sIEVycm9yLCA6cG9wIQorICAgICAgICBydWxlIC9cW1xeLywgU3RyOjpFc2NhcGUsIDpyZWdleF9ncm91cAorICAgICAgICBydWxlIC9cWy8sIFN0cjo6RXNjYXBlLCA6cmVnZXhfZ3JvdXAKKyAgICAgICAgcnVsZSAvXFwuLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAlcntbKF1bP11bOj08IV19LCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9be11bXGQsXStbfV0vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9bKCk/XS8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgLy4vLCBTdHI6OlJlZ2V4CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJlZ2V4X2VuZCBkbworICAgICAgICBydWxlIC9bZ2ltXSsvLCBTdHI6OlJlZ2V4LCA6cG9wIQorICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyZWdleF9ncm91cCBkbworICAgICAgICAjIHNwZWNpYWxseSBoaWdobGlnaHQgLyBpbiBhIGdyb3VwIHRvIGluZGljYXRlIHRoYXQgaXQgZG9lc24ndAorICAgICAgICAjIGNsb3NlIHRoZSByZWdleAorICAgICAgICBydWxlIC9cLy8sIFN0cjo6RXNjYXBlCisKKyAgICAgICAgcnVsZSAlcihbXi9dXG4pIGRvCisgICAgICAgICAgdG9rZW4gRXJyb3IKKyAgICAgICAgICBwb3AhIDIKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXF0vLCBTdHI6OkVzY2FwZSwgOnBvcCEKKyAgICAgICAgcnVsZSAvXFwuLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvLi8sIFN0cjo6UmVnZXgKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YmFkX3JlZ2V4IGRvCisgICAgICAgIHJ1bGUgL1teXG5dKy8sIEVycm9yLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIEBrZXl3b3JkcyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBmb3IgaW4gd2hpbGUgZG8gYnJlYWsgcmV0dXJuIGNvbnRpbnVlIHN3aXRjaCBjYXNlIGRlZmF1bHQKKyAgICAgICAgICBpZiBlbHNlIHRocm93IHRyeSBjYXRjaCBmaW5hbGx5IG5ldyBkZWxldGUgdHlwZW9mIGluc3RhbmNlb2YKKyAgICAgICAgICB2b2lkIHRoaXMgeWllbGQKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmRlY2xhcmF0aW9ucworICAgICAgICBAZGVjbGFyYXRpb25zIHx8PSBTZXQubmV3ICV3KHZhciBsZXQgd2l0aCBmdW5jdGlvbikKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5yZXNlcnZlZAorICAgICAgICBAcmVzZXJ2ZWQgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgYWJzdHJhY3QgYm9vbGVhbiBieXRlIGNoYXIgY2xhc3MgY29uc3QgZGVidWdnZXIgZG91YmxlIGVudW0KKyAgICAgICAgICBleHBvcnQgZXh0ZW5kcyBmaW5hbCBmbG9hdCBnb3RvIGltcGxlbWVudHMgaW1wb3J0IGludCBpbnRlcmZhY2UKKyAgICAgICAgICBsb25nIG5hdGl2ZSBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzaG9ydCBzdGF0aWMKKyAgICAgICAgICBzdXBlciBzeW5jaHJvbml6ZWQgdGhyb3dzIHRyYW5zaWVudCB2b2xhdGlsZQorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29uc3RhbnRzCisgICAgICAgIEBjb25zdGFudHMgfHw9IFNldC5uZXcgJXcodHJ1ZSBmYWxzZSBudWxsIE5hTiBJbmZpbml0eSB1bmRlZmluZWQpCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSAldygKKyAgICAgICAgICBBcnJheSBCb29sZWFuIERhdGUgRXJyb3IgRnVuY3Rpb24gTWF0aCBuZXRzY2FwZQorICAgICAgICAgIE51bWJlciBPYmplY3QgUGFja2FnZXMgUmVnRXhwIFN0cmluZyBzdW4gZGVjb2RlVVJJCisgICAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50IGVuY29kZVVSSSBlbmNvZGVVUklDb21wb25lbnQKKyAgICAgICAgICBFcnJvciBldmFsIGlzRmluaXRlIGlzTmFOIHBhcnNlRmxvYXQgcGFyc2VJbnQgZG9jdW1lbnQgdGhpcworICAgICAgICAgIHdpbmRvdworICAgICAgICApCisgICAgICBlbmQKKworICAgICAgaWQgPSAvWyRhLXpBLVpfXVthLXpBLVowLTlfXSovCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xBXHMqIyEuKj9cbi9tLCBDb21tZW50OjpQcmVwcm9jLCA6c3RhdGVtZW50CisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnN0YXRlbWVudAorICAgICAgICBydWxlICVyKCg/PD1cbikoPz1cc3wvfDwhLS0pKSwgVGV4dCwgOmV4cHJfc3RhcnQKKyAgICAgICAgbWl4aW4gOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgJXIoXCtcKyB8IC0tIHwgfiB8ICYmIHwgXHxcfCB8IFxcKD89XG4pIHwgPDwgfCA+Pj4/IHwgPT09CisgICAgICAgICAgICAgICB8ICE9PSApeCwKKyAgICAgICAgICBPcGVyYXRvciwgOmV4cHJfc3RhcnQKKyAgICAgICAgcnVsZSAlcihbLTw+KyolJnxcXi8hPV09PyksIE9wZXJhdG9yLCA6ZXhwcl9zdGFydAorICAgICAgICBydWxlIC9bKFxbLF0vLCBQdW5jdHVhdGlvbiwgOmV4cHJfc3RhcnQKKyAgICAgICAgcnVsZSAvOy8sIFB1bmN0dWF0aW9uLCA6c3RhdGVtZW50CisgICAgICAgIHJ1bGUgL1spXF0uXS8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgcnVsZSAvWz9dLyBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6dGVybmFyeQorICAgICAgICAgIHB1c2ggOmV4cHJfc3RhcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvW3t9XS8sIFB1bmN0dWF0aW9uLCA6c3RhdGVtZW50CisKKyAgICAgICAgcnVsZSBpZCBkbyB8bXwKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmtleXdvcmRzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQKKyAgICAgICAgICAgIHB1c2ggOmV4cHJfc3RhcnQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLmRlY2xhcmF0aW9ucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MucmVzZXJ2ZWQuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6UmVzZXJ2ZWQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLmNvbnN0YW50cy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpDb25zdGFudAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuYnVpbHRpbnMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWU6Ok90aGVyCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1swLTldWzAtOV0qXC5bMC05XSsoW2VFXVswLTldKyk/W2ZkXT8vLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLzB4WzAtOWEtZkEtRl0rLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvWzAtOV0rLywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLyIoXFxcXHxcXCJ8W14iXSkqIi8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLycoXFxcXHxcXCd8W14nXSkqJy8sIFN0cjo6U2luZ2xlCisgICAgICBlbmQKKworICAgICAgIyBicmFjZWQgcGFydHMgdGhhdCBhcmVuJ3Qgb2JqZWN0IGxpdGVyYWxzCisgICAgICBzdGF0ZSA6c3RhdGVtZW50IGRvCisgICAgICAgIHJ1bGUgLygje2lkfSkoXHMqKSg6KS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6TGFiZWwsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1t7fV0vLCBQdW5jdHVhdGlvbgorCisgICAgICAgIG1peGluIDpleHByX3N0YXJ0CisgICAgICBlbmQKKworICAgICAgIyBvYmplY3QgbGl0ZXJhbHMKKyAgICAgIHN0YXRlIDpvYmplY3QgZG8KKyAgICAgICAgbWl4aW4gOmNvbW1lbnRzX2FuZF93aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSAvW3tdLyBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9bfV0vIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICBnb3RvIDpzdGF0ZW1lbnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKCN7aWR9KShccyopKDopLyBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpBdHRyaWJ1dGUsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC86LywgUHVuY3R1YXRpb24KKyAgICAgICAgbWl4aW4gOnJvb3QKKyAgICAgIGVuZAorCisgICAgICAjIHRlcm5hcnkgZXhwcmVzc2lvbnMsIHdoZXJlIDxpZD46IGlzIG5vdCBhIGxhYmVsIQorICAgICAgc3RhdGUgOnRlcm5hcnkgZG8KKyAgICAgICAgcnVsZSAvOi8gZG8KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgIGdvdG8gOmV4cHJfc3RhcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgbWl4aW4gOnJvb3QKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgY2xhc3MgSlNPTiA8IFJlZ2V4TGV4ZXIKKyAgICAgIGRlc2MgIkphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uIChqc29uLm9yZykiCisgICAgICB0YWcgJ2pzb24nCisgICAgICBmaWxlbmFtZXMgJyouanNvbicKKyAgICAgIG1pbWV0eXBlcyAnYXBwbGljYXRpb24vanNvbicsICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24nLAorICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9oYWwranNvbicKKworICAgICAgIyBUT0RPOiBpcyB0aGlzIHRvbyBtdWNoIG9mIGEgcGVyZm9ybWFuY2UgaGl0PyAgSlNPTiBpcyBxdWl0ZSBzaW1wbGUsCisgICAgICAjIHNvIEknZCB0aGluayB0aGlzIHdvdWxkbid0IGJlIHRvbyBiYWQsIGJ1dCBmb3IgbGFyZ2UgZG9jdW1lbnRzIHRoaXMKKyAgICAgICMgY291bGQgbWVhbiBkb2luZyB0d28gZnVsbCBsZXhlcy4KKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMC44IGlmIHRleHQgPX4gL1xBXHMqey9tICYmIHRleHQubGV4ZXNfY2xlYW5seT8oc2VsZikKKyAgICAgIGVuZAorCisgICAgICBzdHJpbmcgPSAvIihcXC58W14iXSkqIi8KKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAvKD86dHJ1ZXxmYWxzZXxudWxsKVxiLywgS2V5d29yZDo6Q29uc3RhbnQKKyAgICAgICAgcnVsZSAvey8sICBQdW5jdHVhdGlvbiwgOm9iamVjdF9rZXlfaW5pdGlhbAorICAgICAgICBydWxlIC9cWy8sIFB1bmN0dWF0aW9uLCA6YXJyYXkKKyAgICAgICAgcnVsZSAvLT8oPzowfFsxLTldXGQqKVwuXGQrKD86ZVsrLV1cZCspPy9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLy0/KD86MHxbMS05XVxkKikoPzplWystXVxkKyk/L2ksIE51bTo6SW50ZWdlcgorICAgICAgICBtaXhpbiA6aGFzX3N0cmluZworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp3aGl0ZXNwYWNlIGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmhhc19zdHJpbmcgZG8KKyAgICAgICAgcnVsZSBzdHJpbmcsIFN0cjo6RG91YmxlCisgICAgICBlbmQKKworICAgICAgIyBpbiBvYmplY3Rfa2V5X2luaXRpYWwgaXQncyBhbGxvd2VkIHRvIGltbWVkaWF0ZWx5IGNsb3NlIHRoZSBvYmplY3QgYWdhaW4KKyAgICAgIHN0YXRlIDpvYmplY3Rfa2V5X2luaXRpYWwgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSBzdHJpbmcgZG8KKyAgICAgICAgICB0b2tlbiBOYW1lOjpUYWcKKyAgICAgICAgICBnb3RvIDpvYmplY3Rfa2V5CisgICAgICAgIGVuZAorICAgICAgICBydWxlIC99LywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICBlbmQKKworICAgICAgIyBpbiBvYmplY3Rfa2V5IGF0IGxlYXN0IG9uZSBtb3JlIG5hbWUvdmFsdWUgcGFpciBpcyByZXF1aXJlZAorICAgICAgc3RhdGUgOm9iamVjdF9rZXkgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSBzdHJpbmcsIE5hbWU6OlRhZworICAgICAgICBydWxlIC86LywgUHVuY3R1YXRpb24sIDpvYmplY3RfdmFsCisgICAgICAgIHJ1bGUgL30vLCBFcnJvciwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6b2JqZWN0X3ZhbCBkbworICAgICAgICBydWxlIC8sLywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIHJ1bGUoL30vKSB7IHRva2VuIFB1bmN0dWF0aW9uOyBwb3AhKDIpIH0KKyAgICAgICAgbWl4aW4gOnJvb3QKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YXJyYXkgZG8KKyAgICAgICAgcnVsZSAvXF0vLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgICAgcnVsZSAvLC8sIFB1bmN0dWF0aW9uCisgICAgICAgIG1peGluIDpyb290CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNsYXNzIEpTT05ET0MgPCBKU09OCisgICAgICBkZXNjICJKYXZhU2NyaXB0IE9iamVjdCBOb3RhdGlvbiB3aXRoIGV4dGVuc3Rpb25zIGZvciBkb2N1bWVudGF0aW9uIgorICAgICAgdGFnICdqc29uLWRvYycKKworICAgICAgcHJlcGVuZCA6cm9vdCBkbworICAgICAgICBtaXhpbiA6Y29tbWVudHMKKyAgICAgICAgcnVsZSAvKFwuXC5cLikvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgIGVuZAorCisgICAgICBwcmVwZW5kIDpvYmplY3Rfa2V5X2luaXRpYWwgZG8KKyAgICAgICAgbWl4aW4gOmNvbW1lbnRzCisgICAgICAgIHJ1bGUgLyhcLlwuXC4pLywgQ29tbWVudDo6U2luZ2xlCisgICAgICBlbmQKKworICAgICAgcHJlcGVuZCA6b2JqZWN0X2tleSBkbworICAgICAgICBtaXhpbiA6Y29tbWVudHMKKyAgICAgICAgcnVsZSAvKFwuXC5cLikvIGRvCisgICAgICAgICAgdG9rZW4gQ29tbWVudDo6U2luZ2xlCisgICAgICAgICAgZ290byA6b2JqZWN0X2tleV9pbml0aWFsCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tZW50cyBkbworICAgICAgICBydWxlICVyKC8vLio/JCksIENvbW1lbnQ6OlNpbmdsZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2ppbmphLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvamluamEucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1OWMyNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2ppbmphLnJiCkBAIC0wLDAgKzEsMTM3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgSmluamEgPCBUZW1wbGF0ZUxleGVyCisgICAgICB0aXRsZSAiSmluamEiCisgICAgICBkZXNjICJEamFuZ28vSmluamEgdGVtcGxhdGUgZW5naW5lIChqaW5qYS5wb2Nvby5vcmcpIgorCisgICAgICB0YWcgJ2ppbmphJworICAgICAgYWxpYXNlcyAnZGphbmdvJworCisgICAgICBtaW1ldHlwZXMgJ2FwcGxpY2F0aW9uL3gtZGphbmdvLXRlbXBsYXRpbmcnLCAnYXBwbGljYXRpb24veC1qaW5qYScsCisgICAgICAgICAgICAgICAgJ3RleHQvaHRtbCtkamFuZ28nLCAndGV4dC9odG1sK2ppbmphJworCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAQGtleXdvcmRzIHx8PSAldyhhcyBjb250ZXh0IGRvIGVsc2UgZXh0ZW5kcyBmcm9tIGlnbm9yZSBtaXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBpbmNsdWRlIHJldmVyc2VkIHJlY3Vyc2l2ZSBzY29wZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2VzY2FwZSBlbmRhdXRvZXNjYXBlIGJsb2NrIGVuZGJsb2NrIGNhbGwgZW5kY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgZW5kZmlsdGVyIGZvciBlbmRmb3IgaWYgZW5kaWYgbWFjcm8gZW5kbWFjcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVuZHNldCB0cmFucyBlbmR0cmFucyB3aXRoIGVuZHdpdGggd2l0aG91dCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi50ZXN0cworICAgICAgICBAQHRlc3RzIHx8PSAldyhjYWxsYWJsZSBkZWZpbmVkIGRpdmlzaWJsZWJ5IGVxdWFsdG8gZXNjYXBlZCBldmVuIGl0ZXJhYmxlCisgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyIG1hcHBpbmcgbm9uZSBudW1iZXIgb2RkIHNhbWVhcyBzZXF1ZW5jZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIHVwcGVyKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnBzZXVkb19rZXl3b3JkcworICAgICAgICBAQHBzZXVkb19rZXl3b3JkcyB8fD0gJXcodHJ1ZSBmYWxzZSBub25lIFRydWUgRmFsc2UgTm9uZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi53b3JkX29wZXJhdG9ycworICAgICAgICBAQHdvcmRfb3BlcmF0b3JzIHx8PSAldyhpcyBpbiBhbmQgb3Igbm90KQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgICMgQ29tbWVudHMKKyAgICAgICAgcnVsZSAveyMvLCBDb21tZW50LCA6Y29tbWVudAorCisgICAgICAgICMgU3RhdGVtZW50cworICAgICAgICBydWxlIC9ce1wlLyBkbworICAgICAgICAgIHRva2VuIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgICBwdXNoIDpzdGF0ZW1lbnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBFeHByZXNzaW9ucworICAgICAgICBydWxlIC9ce1x7LyBkbworICAgICAgICAgIHRva2VuIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgICBwdXNoIDpleHByZXNzaW9uCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUoLyguKz8pKD89XFx8e3t8eyV8eyMpL20pIHsgZGVsZWdhdGUgcGFyZW50IH0KKyAgICAgICAgcnVsZSgvLisvbSkgeyBkZWxlZ2F0ZSBwYXJlbnQgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmaWx0ZXIgZG8KKyAgICAgICAgIyBGaWx0ZXJzIGFyZSBjYWxsZWQgbGlrZSB2YXJpYWJsZXxmb28oYXJnMSwgLi4uKQorICAgICAgICBydWxlIC8oXHwpKFx3KykvIGRvCisgICAgICAgICAgZ3JvdXBzIE9wZXJhdG9yLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZnVuY3Rpb24gZG8KKyAgICAgICAgcnVsZSAvKFx3KykoXCgpLyBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpGdW5jdGlvbiwgUHVuY3R1YXRpb24KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRleHQgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bGl0ZXJhbCBkbworICAgICAgICAjIFN0cmluZ3MKKyAgICAgICAgcnVsZSAvIihcXC58LikqPyIvLCBTdHI6OkRvdWJsZQorICAgICAgICBydWxlIC8nKFxcLnwuKSo/Jy8sIFN0cjo6U2luZ2xlCisKKyAgICAgICAgIyBOdW1iZXJzCisgICAgICAgIHJ1bGUgL1xkKyg/PX1ccykvLCBOdW0KKworICAgICAgICAjIEFyaXRobWV0aWMgb3BlcmF0b3JzICgrLCAtLCAqLCAqKiwgLy8sIC8pCisgICAgICAgICMgVE9ETyA6IGltcGxlbWVudCBtb2R1bG8gKCUpCisgICAgICAgIHJ1bGUgLyhcK3xcLXxcKnxcL1wvP3xcKlwqPykvLCBPcGVyYXRvcgorCisgICAgICAgICMgQ29tcGFyaXNvbnMgb3BlcmF0b3JzICg8PSwgPCwgPj0sID4sID09LCA9PT0sICE9KQorICAgICAgICBydWxlIC8oPD0/fD49P3w9PT0/fCE9KS8sIE9wZXJhdG9yCisKKyAgICAgICAgIyBQdW5jdHVhdGlvbiAodGhlIGNvbW1hLCBbXSwgKCkpCisgICAgICAgIHJ1bGUgLywvLCAgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvXFsvLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC9cXS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL1woLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvXCkvLCBQdW5jdHVhdGlvbgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tZW50IGRvCisgICAgICAgIHJ1bGUoL1teeyNdKy9tKSB7IHRva2VuIENvbW1lbnQgfQorICAgICAgICBydWxlKC8jfS8pIHsgdG9rZW4gQ29tbWVudDsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmV4cHJlc3Npb24gZG8KKyAgICAgICAgcnVsZSAvXHcrXC4/L20sIE5hbWU6OlZhcmlhYmxlCisKKyAgICAgICAgbWl4aW4gOmZpbHRlcgorICAgICAgICBtaXhpbiA6ZnVuY3Rpb24KKyAgICAgICAgbWl4aW4gOmxpdGVyYWwKKyAgICAgICAgbWl4aW4gOnRleHQKKworICAgICAgICBydWxlIC8lfXx9fS8sIENvbW1lbnQ6OlByZXByb2MsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0YXRlbWVudCBkbworICAgICAgICBydWxlIC8oXHcrXC4/KS8gZG8gfG18CisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyhtWzBdKQorICAgICAgICAgICAgZ3JvdXBzIEtleXdvcmQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLnBzZXVkb19rZXl3b3Jkcy5pbmNsdWRlPyhtWzBdKQorICAgICAgICAgICAgZ3JvdXBzIEtleXdvcmQ6OlBzZXVkbworICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3Mud29yZF9vcGVyYXRvcnMuaW5jbHVkZT8obVswXSkKKyAgICAgICAgICAgIGdyb3VwcyBPcGVyYXRvcjo6V29yZAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MudGVzdHMuaW5jbHVkZT8obVswXSkKKyAgICAgICAgICAgIGdyb3VwcyBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3JvdXBzIE5hbWU6OlZhcmlhYmxlCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIG1peGluIDpmaWx0ZXIKKyAgICAgICAgbWl4aW4gOmZ1bmN0aW9uCisgICAgICAgIG1peGluIDpsaXRlcmFsCisgICAgICAgIG1peGluIDp0ZXh0CisKKyAgICAgICAgcnVsZSAvXCVcfS8sIENvbW1lbnQ6OlByZXByb2MsIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2pzb25uZXQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9qc29ubmV0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDJmMTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9qc29ubmV0LnJiCkBAIC0wLDAgKzEsMTUxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgSnNvbm5ldCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICdKc29ubmV0JworICAgICAgZGVzYyAnQW4gZWxlZ2FudCwgZm9ybWFsbHktc3BlY2lmaWVkIGNvbmZpZyBsYW5ndWFnZSBmb3IgSlNPTicKKyAgICAgIHRhZyAnanNvbm5ldCcKKyAgICAgIGZpbGVuYW1lcyAnKi5qc29ubmV0JworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtanNvbm5ldCcKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIHNlbGYgc3VwZXIgbG9jYWwgZm9yIGluIGlmIHRoZW4gZWxzZSBpbXBvcnQgaW1wb3J0c3RyIGVycm9yCisgICAgICAgICAgdGFpbHN0cmljdCBhc3NlcnQKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmRlY2xhcmF0aW9ucworICAgICAgICBAZGVjbGFyYXRpb25zIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGZ1bmN0aW9uCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5jb25zdGFudHMKKyAgICAgICAgQGNvbnN0YW50cyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBudWxsIHRydWUgZmFsc2UKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBhY29zCisgICAgICAgICAgYXNpbgorICAgICAgICAgIGF0YW4KKyAgICAgICAgICBjZWlsCisgICAgICAgICAgY2hhcgorICAgICAgICAgIGNvZGVwb2ludAorICAgICAgICAgIGNvcworICAgICAgICAgIGV4cAorICAgICAgICAgIGV4cG9uZW50CisgICAgICAgICAgZmlsdGVyCisgICAgICAgICAgZmxvb3IKKyAgICAgICAgICBmb3JjZQorICAgICAgICAgIGxlbmd0aAorICAgICAgICAgIGxvZworICAgICAgICAgIG1ha2VBcnJheQorICAgICAgICAgIG1hbnRpc3NhCisgICAgICAgICAgb2JqZWN0RmllbGRzCisgICAgICAgICAgb2JqZWN0SGFzCisgICAgICAgICAgcG93CisgICAgICAgICAgc2luCisgICAgICAgICAgc3FydAorICAgICAgICAgIHRhbgorICAgICAgICAgIHRoaXNGaWxlCisgICAgICAgICAgdHlwZQorICAgICAgICAgIGFicworICAgICAgICAgIGFzc2VydEVxdWFsCisgICAgICAgICAgZXNjYXBlU3RyaW5nQmFzaAorICAgICAgICAgIGVzY2FwZVN0cmluZ0RvbGxhcnMKKyAgICAgICAgICBlc2NhcGVTdHJpbmdKc29uCisgICAgICAgICAgZXNjYXBlU3RyaW5nUHl0aG9uCisgICAgICAgICAgZmlsdGVyTWFwCisgICAgICAgICAgZmxhdHRlbkFycmF5cworICAgICAgICAgIGZvbGRsCisgICAgICAgICAgZm9sZHIKKyAgICAgICAgICBmb3JtYXQKKyAgICAgICAgICBqb2luCisgICAgICAgICAgbGluZXMKKyAgICAgICAgICBtYW5pZmVzdEluaQorICAgICAgICAgIG1hbmlmZXN0UHl0aG9uCisgICAgICAgICAgbWFuaWZlc3RQeXRob25WYXJzCisgICAgICAgICAgbWFwCisgICAgICAgICAgbWF4CisgICAgICAgICAgbWluCisgICAgICAgICAgbW9kCisgICAgICAgICAgcmFuZ2UKKyAgICAgICAgICBzZXQKKyAgICAgICAgICBzZXREaWZmCisgICAgICAgICAgc2V0SW50ZXIKKyAgICAgICAgICBzZXRNZW1iZXIKKyAgICAgICAgICBzZXRVbmlvbgorICAgICAgICAgIHNvcnQKKyAgICAgICAgICBzcGxpdAorICAgICAgICAgIHN0cmluZ0NoYXJzCisgICAgICAgICAgc3Vic3RyCisgICAgICAgICAgdG9TdHJpbmcKKyAgICAgICAgICB1bmlxCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBpZGVudGlmaWVyID0gL1thLXpBLVpfXVthLXpBLVowLTlfXSovCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAlcigvLy4qPyQpLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcigjLio/JCksIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBydWxlICVyKC9cKi4qP1wqLyltLCBDb21tZW50OjpNdWx0aWxpbmUKKworICAgICAgICBydWxlIC8tPyg/OjB8WzEtOV1cZCopXC5cZCsoPzplWystXVxkKyk/L2ksIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvLT8oPzowfFsxLTldXGQqKSg/OmVbKy1dXGQrKT8vaSwgTnVtOjpJbnRlZ2VyCisKKyAgICAgICAgcnVsZSAvW3t9OlwuLDsrXFtcXT0lXChcKV0vLCBQdW5jdHVhdGlvbgorCisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpzdHJpbmdfZG91YmxlCisgICAgICAgIHJ1bGUgLycvLCBTdHIsIDpzdHJpbmdfc2luZ2xlCisgICAgICAgIHJ1bGUgL1x8XHxcfC8sIFN0ciwgOnN0cmluZ19ibG9jaworCisgICAgICAgIHJ1bGUgL1wkLywgS2V5d29yZAorCisgICAgICAgIHJ1bGUgaWRlbnRpZmllciBkbyB8bXwKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmtleXdvcmRzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLmRlY2xhcmF0aW9ucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuY29uc3RhbnRzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5idWlsdGlucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6T3RoZXIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZyBkbworICAgICAgICBydWxlIC9cXChbXFxcL2JmbnJ0XXwodVswLTlhLWZBLUZdezR9KSkvLCBTdHI6OkVzY2FwZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmdfZG91YmxlIGRvCisgICAgICAgIG1peGluIDpzdHJpbmcKKyAgICAgICAgcnVsZSAvXFwiLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOnBvcCEKKyAgICAgICAgcnVsZSAvW15cXCJdKy8sIFN0cgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmdfc2luZ2xlIGRvCisgICAgICAgIG1peGluIDpzdHJpbmcKKyAgICAgICAgcnVsZSAvXFwnLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvJy8sIFN0ciwgOnBvcCEKKyAgICAgICAgcnVsZSAvW15cXCddKy8sIFN0cgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmdfYmxvY2sgZG8KKyAgICAgICAgbWl4aW4gOnN0cmluZworICAgICAgICBydWxlIC9cfFx8XHwvLCBTdHIsIDpwb3AhCisgICAgICAgIHJ1bGUgLy4qLywgU3RyCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2p1bGlhLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvanVsaWEucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNDc1MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2p1bGlhLnJiCkBAIC0wLDAgKzEsMTcyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgSnVsaWEgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiSnVsaWEiCisgICAgICBkZXNjICJUaGUgSnVsaWEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UiCisgICAgICB0YWcgJ2p1bGlhJworICAgICAgYWxpYXNlcyAnamwnCisgICAgICBmaWxlbmFtZXMgJyouamwnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1qdWxpYScsICdhcHBsaWNhdGlvbi94LWp1bGlhJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgMSBpZiB0ZXh0LnNoZWJhbmc/ICdqdWxpYScKKyAgICAgIGVuZAorCisgICAgICBCVUlMVElOUyAgICAgICAgICAgID0gL1xiKD86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhYmxlICAgICAgfCBhc3NlcnQgICAgfCBjb252ZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbG9wZW4gICAgICAgICAgfCBkbHN5bSAgICAgfCBlZGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcHMgICAgICAgICAgICAgfCBlcnJvciAgICAgfCBleGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaW5hbGl6ZXIgICAgICAgfCBoYXNoICAgICAgfCBpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW5mICAgICAgICAgICAgIHwgaW52b2tlICAgIHwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlzYSAgICAgICAgICAgICB8IGlzZXF1YWwgICB8IGxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1ldGhvZF9leGlzdHMgICB8IE5hbiAgICAgICB8IG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbnR1cGxlICAgICAgICAgIHwgcGkgICAgICAgIHwgcHJvbW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvbW90ZV90eXBlICAgIHwgcmVhbG1heCAgIHwgcmVhbG1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2l6ZW9mICAgICAgICAgIHwgc3VidHlwZSAgIHwgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aHJvdyAgICAgICAgICAgfCB0dXBsZSAgICAgfCB0eXBlbWF4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0eXBlbWluICAgICAgICAgfCB0eXBlb2YgICAgfCB1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdob3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApXGIveAorCisgICAgICBLRVlXT1JEUyAgICAgICAgICAgID0gL1xiKD86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB8IHJldHVybiB8IG1vZHVsZSB8IGltcG9ydCB8IGV4cG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWYgICAgICAgfCBlbHNlICAgfCBlbHNlaWYgfCBlbmQgICAgfCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluICAgICAgIHwgd2hpbGUgIHwgdHJ5ICAgIHwgY2F0Y2ggIHwgc3VwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxiL3gKKworICAgICAgVFlQRVMgICAgICAgICAgICAgICA9IC9cYig/OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ICAgICAgICAgfCBVSW50ICAgICAgICAgICB8IEludDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVJbnQ4ICAgICAgIHwgSW50MTYgICAgICAgICAgfCBVSW50MTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludDMyICAgICAgIHwgVUludDMyICAgICAgICAgfCBJbnQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVUludDY0ICAgICAgfCBJbnQxMjggICAgICAgICB8IFVJbnQxMjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZsb2F0MTYgICAgIHwgRmxvYXQzMiAgICAgICAgfCBGbG9hdDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sICAgICAgICB8IEluZiAgICAgICAgICAgIHwgSW5mMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEluZjMyICAgICAgIHwgTmFOICAgICAgICAgICAgfCBOYU4xNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTmFOMzIgICAgICAgfCBCaWdJbnQgICAgICAgICB8IEJpZ0Zsb2F0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaGFyICAgICAgICB8IEFTQ0lJU3RyaW5nICAgIHwgVVRGOFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVVRGMTZTdHJpbmcgfCBVVEYzMlN0cmluZyAgICB8IEFic3RyYWN0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXU3RyaW5nICAgICB8IFN0cmluZyAgICAgICAgIHwgUmVnZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlZ2V4TWF0Y2ggIHwgQ29tcGxleDY0ICAgICAgfCBDb21wbGV4MTI4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBbnkgICAgICAgICB8IE5vdGhpbmcgICAgICAgIHwgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcYi94CisKKyAgICAgIE9QRVJBVE9SUyAgICAgICAgICAgPSAvIFwrICAgICAgfCA9ICAgICAgICB8IC0gICAgIHwgXCogICB8IFwvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFxcICAgIHwgJiAgICAgICAgfCBcfCAgICB8IFwkICAgfCB+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFxeICAgIHwgJSAgICAgICAgfCAhICAgICB8ID4+PiAgfCA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA8PCAgICB8ICYmICAgICAgIHwgXHxcfCAgfCBcKz0gIHwgLT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXCo9ICAgfCBcLz0gICAgICB8IFxcPSAgIHwgw7c9ICAgfCAlPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcXj0gICB8ICY9ICAgICAgIHwgXHw9ICAgfCBcJD0gIHwgPj4+PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA+Pj0gICB8IDw8PSAgICAgIHwgPT0gICAgfCAhPSAgIHwg4omgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDw9ICAgIHwg4omkICAgICAgICB8ID49ICAgIHwg4omlICAgIHwgXC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOjogICAgfCA8OiAgICAgICB8IC0+ICAgIHwgXD8gICB8IFwuXCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXC5cXiAgfCBcLlxcICAgICB8IFwuXC8gIHwgXFwgICB8IDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC94CisKKyAgICAgIFBVTkNUVUFUSU9OICAgICAgICAgPSAvIFsgXFsgXF0geyB9IDogXCggXCkgLCA7IEAgXSAveAorCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dAorICAgICAgICBydWxlIC9bXlxTXG5dKy8sIFRleHQKKyAgICAgICAgcnVsZSAvIz0vLCBDb21tZW50OjpNdWx0aWxpbmUsIDpibG9ja2NvbW1lbnQKKyAgICAgICAgcnVsZSAvIy4qJC8sIENvbW1lbnQKKyAgICAgICAgcnVsZSBPUEVSQVRPUlMsIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgL1xcXG4vLCBUZXh0CisgICAgICAgIHJ1bGUgL1xcLywgVGV4dAorCisKKyAgICAgICAgIyBmdW5jdGlvbnMKKyAgICAgICAgcnVsZSAvKGZ1bmN0aW9uKSgoPzpcc3xcXFxzKSspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICAgIHB1c2ggOmZ1bmNuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgICMgdHlwZXMKKyAgICAgICAgcnVsZSAvKHR5cGV8dHlwZWFsaWFzfGFic3RyYWN0KSgoPzpcc3xcXFxzKSspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBOYW1lOjpDbGFzcworICAgICAgICAgIHB1c2ggOnR5cGVuYW1lCisgICAgICAgIGVuZAorICAgICAgICBydWxlIFRZUEVTLCBLZXl3b3JkOjpUeXBlCisKKyAgICAgICAgIyBrZXl3b3JkcworICAgICAgICBydWxlIC8obG9jYWx8Z2xvYmFsfGNvbnN0KVxiLywgS2V5d29yZDo6RGVjbGFyYXRpb24KKyAgICAgICAgcnVsZSBLRVlXT1JEUywgS2V5d29yZAorCisgICAgICAgIHJ1bGUgQlVJTFRJTlMsIE5hbWU6OkJ1aWx0aW4KKworICAgICAgICAjIGJhY2t0aWNrcworICAgICAgICBydWxlIC9gLio/YC8sIExpdGVyYWw6OlN0cmluZzo6QmFja3RpY2sKKworICAgICAgICAjIGNoYXJzCisgICAgICAgIHJ1bGUgLycoXFwufFxcWzAtN117MSwzfXxcXHhbYS1mQS1GMC05XXsxLDN9fFxcdVthLWZBLUYwLTldezEsNH18XFxVW2EtZkEtRjAtOV17MSw2fXxbXlxcXCdcbl0pJy8sIExpdGVyYWw6OlN0cmluZzo6Q2hhcgorCisgICAgICAgICMgdHJ5IHRvIG1hdGNoIHRyYWlsaW5nIHRyYW5zcG9zZQorICAgICAgICBydWxlIC8oPzw9Wy5cdylcXV0pXCcrLywgT3BlcmF0b3IKKworICAgICAgICAjIHN0cmluZ3MKKyAgICAgICAgcnVsZSAvKD86W0lMXSkiLywgTGl0ZXJhbDo6U3RyaW5nLCA6c3RyaW5nCisgICAgICAgIHJ1bGUgL1tFXT8iLywgTGl0ZXJhbDo6U3RyaW5nLCA6c3RyaW5nCisKKyAgICAgICAgIyBuYW1lcworICAgICAgICBydWxlIC9AW1x3Ll0rLywgTmFtZTo6RGVjb3JhdG9yCisgICAgICAgIHJ1bGUgLyg/OlthLXpBLVpfXHUwMEExLVx1ZmZmZl18W1x1MTAwMC1cdTEwZmZdKSg/OlthLXpBLVpfMC05XHUwMEExLVx1ZmZmZl18W1x1MTAwMC1cdTEwZmZdKSohKi8sIE5hbWUKKworICAgICAgICBydWxlIFBVTkNUVUFUSU9OLCBPdGhlcgorCisgICAgICAgICMgbnVtYmVycworICAgICAgICBydWxlIC8oXGQrKF9cZCspK1wuXGQqfFxkKlwuXGQrKF9cZCspKykoW2VFZl1bKy1dP1swLTldKyk/LywgTGl0ZXJhbDo6TnVtYmVyOjpGbG9hdAorICAgICAgICBydWxlIC8oXGQrXC5cZCp8XGQqXC5cZCspKFtlRWZdWystXT9bMC05XSspPy8sIExpdGVyYWw6Ok51bWJlcjo6RmxvYXQKKyAgICAgICAgcnVsZSAvXGQrKF9cZCspK1tlRWZdWystXT9bMC05XSsvLCBMaXRlcmFsOjpOdW1iZXI6OkZsb2F0CisgICAgICAgIHJ1bGUgL1xkK1tlRWZdWystXT9bMC05XSsvLCBMaXRlcmFsOjpOdW1iZXI6OkZsb2F0CisgICAgICAgIHJ1bGUgLzBiWzAxXSsoX1swMV0rKSsvLCBMaXRlcmFsOjpOdW1iZXI6OkJpbgorICAgICAgICBydWxlIC8wYlswMV0rLywgTGl0ZXJhbDo6TnVtYmVyOjpCaW4KKyAgICAgICAgcnVsZSAvMG9bMC03XSsoX1swLTddKykrLywgTGl0ZXJhbDo6TnVtYmVyOjpPY3QKKyAgICAgICAgcnVsZSAvMG9bMC03XSsvLCBMaXRlcmFsOjpOdW1iZXI6Ok9jdAorICAgICAgICBydWxlIC8weFthLWZBLUYwLTldKyhfW2EtZkEtRjAtOV0rKSsvLCBMaXRlcmFsOjpOdW1iZXI6OkhleAorICAgICAgICBydWxlIC8weFthLWZBLUYwLTldKy8sIExpdGVyYWw6Ok51bWJlcjo6SGV4CisgICAgICAgIHJ1bGUgL1xkKyhfXGQrKSsvLCBMaXRlcmFsOjpOdW1iZXI6OkludGVnZXIKKyAgICAgICAgcnVsZSAvXGQrLywgTGl0ZXJhbDo6TnVtYmVyOjpJbnRlZ2VyCisgICAgICBlbmQKKworCisgICAgICBzdGF0ZSA6ZnVuY25hbWUgZG8KKyAgICAgICAgcnVsZSAvW2EtekEtWl9dXHcqLywgTmFtZTo6RnVuY3Rpb24sIDpwb3AhCisgICAgICAgIHJ1bGUgL1woW15cc1x3e117MSwyfVwpLywgT3BlcmF0b3IsIDpwb3AhCisgICAgICAgIHJ1bGUgL1teXHNcd3tdezEsMn0vLCBPcGVyYXRvciwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dHlwZW5hbWUgZG8KKyAgICAgICAgcnVsZSAvW2EtekEtWl9dXHcqLywgTmFtZTo6Q2xhc3MsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ2VzY2FwZSBkbworICAgICAgICBydWxlIC9cXChbXFxhYmZucnR2IlwnXXxcbnxOXHsuKj9cfXx1W2EtZkEtRjAtOV17NH18VVthLWZBLUYwLTldezh9fHhbYS1mQS1GMC05XXsyfXxbMC03XXsxLDN9KS8sCisgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpFc2NhcGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YmxvY2tjb21tZW50IGRvCisgICAgICAgIHJ1bGUgL1tePSNdLywgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgLyM9LywgQ29tbWVudDo6TXVsdGlsaW5lLCA6YmxvY2tjb21tZW50CisgICAgICAgIHJ1bGUgL1w9Iy8sIENvbW1lbnQ6Ok11bHRpbGluZSwgOnBvcCEKKyAgICAgICAgcnVsZSAvWz0jXS8sIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmcgZG8KKyAgICAgICAgbWl4aW4gOnN0cmluZ2VzY2FwZQorCisgICAgICAgIHJ1bGUgLyIvLCBMaXRlcmFsOjpTdHJpbmcsIDpwb3AhCisgICAgICAgIHJ1bGUgL1xcXFx8XFwifFxcXG4vLCBMaXRlcmFsOjpTdHJpbmc6OkVzY2FwZSAgIyBpbmNsdWRlZCBoZXJlIGZvciByYXcgc3RyaW5ncworICAgICAgICBydWxlIC9cJChcKFx3K1wpKT9bLSMwICtdKihbMC05XSt8WypdKT8oXC4oWzAtOV0rfFsqXSkpPy8sIExpdGVyYWw6OlN0cmluZzo6SW50ZXJwb2wKKyAgICAgICAgcnVsZSAvW15cXCIkXSsvLCBMaXRlcmFsOjpTdHJpbmcKKyAgICAgICAgIyBxdW90ZXMsIGRvbGxhciBzaWducywgYW5kIGJhY2tzbGFzaGVzIG11c3QgYmUgcGFyc2VkIG9uZSBhdCBhIHRpbWUKKyAgICAgICAgcnVsZSAvWyJcXF0vLCBMaXRlcmFsOjpTdHJpbmcKKyAgICAgICAgIyB1bmhhbmRsZWQgc3RyaW5nIGZvcm1hdHRpbmcgc2lnbgorICAgICAgICBydWxlIC9cJC8sIExpdGVyYWw6OlN0cmluZworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9rb3RsaW4ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9rb3RsaW4ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlNDU0MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2tvdGxpbi5yYgpAQCAtMCwwICsxLDg0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgS290bGluIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIktvdGxpbiIKKyAgICAgIGRlc2MgIktvdGxpbiA8aHR0cDovL2tvdGxpbmxhbmcub3JnPiIKKworICAgICAgdGFnICdrb3RsaW4nCisgICAgICBmaWxlbmFtZXMgJyoua3QnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1rb3RsaW4nCisKKyAgICAgIGtleXdvcmRzID0gJXcoCisgICAgICAgIGFic3RyYWN0IGFubm90YXRpb24gYXMgYnJlYWsgYnkgY2F0Y2ggY2xhc3MgY29tcGFuaW9uIGNvbnN0CisgICAgICAgIGNvbnN0cnVjdG9yIGNvbnRpbnVlIGNyb3NzaW5saW5lIGRvIGR5bmFtaWMgZWxzZSBlbnVtCisgICAgICAgIGV4dGVybmFsIGZhbHNlIGZpbmFsIGZpbmFsbHkgZm9yIGZ1biBnZXQgaWYgaW1wb3J0IGluIGluZml4CisgICAgICAgIGlubGluZSBpbm5lciBpbnRlcmZhY2UgaW50ZXJuYWwgaXMgbGF0ZWluaXQgbm9pbmxpbmUgbnVsbAorICAgICAgICBvYmplY3Qgb3BlbiBvcGVyYXRvciBvdXQgb3ZlcnJpZGUgcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZAorICAgICAgICBwdWJsaWMgcmVpZmllZCByZXR1cm4gc2VhbGVkIHNldCBzdXBlciB0YWlscmVjIHRoaXMgdGhyb3cKKyAgICAgICAgdHJ1ZSB0cnkgdHlwZWFsaWFzIHR5cGVvZiB2YWwgdmFyIHZhcmFyZyB3aGVuIHdoZXJlIHdoaWxlCisgICAgICAgIHlpZWxkCisgICAgICApCisKKyAgICAgIG5hbWUgPSAlcidAP1tfXHB7THV9XHB7TGx9XHB7THR9XHB7TG19XHB7Tmx9XVtccHtMdX1ccHtMbH1ccHtMdH1ccHtMbX1ccHtObH1ccHtOZH1ccHtQY31ccHtDZn1ccHtNbn1ccHtNY31dKicKKworICAgICAgaWQgPSAlcicoI3tuYW1lfXxgI3tuYW1lfWApJworCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlICVyJ15ccypcWy4qP1xdJywgTmFtZTo6QXR0cmlidXRlCisgICAgICAgIHJ1bGUgJXInW15cU1xuXSsnLCBUZXh0CisgICAgICAgIHJ1bGUgJXInXFxcbicsIFRleHQgIyBsaW5lIGNvbnRpbnVhdGlvbgorICAgICAgICBydWxlICVyJy8vLio/XG4nLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcicvWypdLio/WypdLydtLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgcnVsZSAlcidcbicsIFRleHQKKyAgICAgICAgcnVsZSAlcic6OnwhIXxcP1s6Ll0nLCBPcGVyYXRvcgorICAgICAgICBydWxlICVyIihcLlwuKSIsIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgJXInW34hJV4mKigpKz18XFtcXTo7LC48Pi8/LV0nLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlICVyJ1t7fV0nLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlICVyJ0AiKCIifFteIl0pKiInbSwgU3RyCisgICAgICAgIHJ1bGUgJXInIiIiLio/IiIiJ20sIFN0cgorICAgICAgICBydWxlICVyJyIoXFxcXHxcXCJ8W14iXG5dKSpbIlxuXSdtLCBTdHIKKyAgICAgICAgcnVsZSAlciInXFwuJ3wnW15cXF0nIiwgU3RyOjpDaGFyCisgICAgICAgIHJ1bGUgJXIiWzAtOV0oXC5bMC05XSspPyhbZUVdWystXVswLTldKyk/W2ZsRkxdP3wwW3hYXVswLTlhLWZBLUZdK1tMbF0/IiwgTnVtCisgICAgICAgIHJ1bGUgJXInKGNsYXNzKShccyspKG9iamVjdCknIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIEtleXdvcmQKKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgJXInKGNsYXNzfGRhdGFccytjbGFzc3xpbnRlcmZhY2V8b2JqZWN0KShccyspJyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpEZWNsYXJhdGlvbiwgVGV4dAorICAgICAgICAgIHB1c2ggOmNsYXNzCisgICAgICAgIGVuZAorICAgICAgICBydWxlICVyJyhwYWNrYWdlfGltcG9ydCkoXHMrKScgZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dAorICAgICAgICAgIHB1c2ggOnBhY2thZ2UKKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgJXInKHZhbHx2YXIpKFxzKyknIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQ6OkRlY2xhcmF0aW9uLCBUZXh0CisgICAgICAgICAgcHVzaCA6cHJvcGVydHkKKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgJXInKGZ1bikoXHMrKScgZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dAorICAgICAgICAgIHB1c2ggOmZ1bmN0aW9uCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC8oPzoje2tleXdvcmRzLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgaWQsIE5hbWUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cGFja2FnZSBkbworICAgICAgICBydWxlIC9cUysvLCBOYW1lOjpOYW1lc3BhY2UsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNsYXNzIGRvCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OkNsYXNzLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpwcm9wZXJ0eSBkbworICAgICAgICBydWxlIGlkLCBOYW1lOjpQcm9wZXJ0eSwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZnVuY3Rpb24gZG8KKyAgICAgICAgcnVsZSBpZCwgTmFtZTo6RnVuY3Rpb24sIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2xpcXVpZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2xpcXVpZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzExODFlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbGlxdWlkLnJiCkBAIC0wLDAgKzEsMjg3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgTGlxdWlkIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIkxpcXVpZCIKKyAgICAgIGRlc2MgJ0xpcXVpZCBpcyBhIHRlbXBsYXRpbmcgZW5naW5lIGZvciBSdWJ5IChsaXF1aWRtYXJrdXAub3JnKScKKyAgICAgIHRhZyAnbGlxdWlkJworICAgICAgZmlsZW5hbWVzICcqLmxpcXVpZCcKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvW15ce10rLywgVGV4dAorCisgICAgICAgIHJ1bGUgLyhceyUpKFxzKikvIGRvCisgICAgICAgICAgZ3JvdXBzIFB1bmN0dWF0aW9uLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICAgICAgcHVzaCA6dGFnX29yX2Jsb2NrCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhce1x7KShccyopLyBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgVGV4dDo6V2hpdGVzcGFjZQorICAgICAgICAgIHB1c2ggOm91dHB1dAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9cey8sIFRleHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dGFnX29yX2Jsb2NrIGRvCisgICAgICAgICMgYnVpbHRpbiBsb2dpYyBibG9ja3MKKyAgICAgICAgcnVsZSAvKGlmfHVubGVzc3xlbHNpZnxjYXNlKSg/PVxzKykvLCBLZXl3b3JkOjpSZXNlcnZlZCwgOmNvbmRpdGlvbgorCisgICAgICAgIHJ1bGUgLyh3aGVuKShccyspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpSZXNlcnZlZCwgVGV4dDo6V2hpdGVzcGFjZQorICAgICAgICAgIHB1c2ggOndoZW4KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKGVsc2UpKFxzKikoJVx9KS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6UmVzZXJ2ZWQsIFRleHQ6OldoaXRlc3BhY2UsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICAjIG90aGVyIGJ1aWx0aW4gYmxvY2tzCisgICAgICAgIHJ1bGUgLyhjYXB0dXJlKShccyspKFteXHMlXSspKFxzKikoJVx9KS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6VGFnLCBUZXh0OjpXaGl0ZXNwYWNlLCBOYW1lOjpBdHRyaWJ1dGUsIFRleHQ6OldoaXRlc3BhY2UsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oY29tbWVudCkoXHMqKSglXH0pLyBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpUYWcsIFRleHQ6OldoaXRlc3BhY2UsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6Y29tbWVudAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8ocmF3KShccyopKCVcfSkvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OlRhZywgVGV4dDo6V2hpdGVzcGFjZSwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDpyYXcKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvYXNzaWduLywgTmFtZTo6VGFnLCA6YXNzaWduCisgICAgICAgIHJ1bGUgL2luY2x1ZGUvLCBOYW1lOjpUYWcsIDppbmNsdWRlCisKKyAgICAgICAgIyBlbmQgb2YgYmxvY2sKKyAgICAgICAgcnVsZSAvKGVuZChjYXNlfHVubGVzc3xpZikpKFxzKikoJVx9KS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6UmVzZXJ2ZWQsIG5pbCwgVGV4dDo6V2hpdGVzcGFjZSwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhlbmQoW15ccyVdKykpKFxzKikoJVx9KS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6VGFnLCBuaWwsIFRleHQ6OldoaXRlc3BhY2UsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICAjIGJ1aWx0aW4gdGFncworICAgICAgICBydWxlIC8oY3ljbGUpKFxzKykoKFteXHM6XSopKDopKT8oXHMqKS8gZG8gfG18CisgICAgICAgICAgdG9rZW4gTmFtZTo6VGFnLCBtWzFdCisgICAgICAgICAgdG9rZW4gVGV4dDo6V2hpdGVzcGFjZSwgbVsyXQorCisgICAgICAgICAgaWYgbVs0XSA9fiAvJ1teJ10qJy8KKyAgICAgICAgICAgIHRva2VuIFN0cjo6U2luZ2xlLCBtWzRdCisgICAgICAgICAgZWxzaWYgbVs0XSA9fiAvIlteIl0qIi8KKyAgICAgICAgICAgIHRva2VuIFN0cjo6RG91YmxlLCBtWzRdCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QXR0cmlidXRlLCBtWzRdCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVs1XQorICAgICAgICAgIHRva2VuIFRleHQ6OldoaXRlc3BhY2UsIG1bNl0KKworICAgICAgICAgIHB1c2ggOnZhcmlhYmxlX3RhZ19tYXJrdXAKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBvdGhlciB0YWdzIG9yIGJsb2NrcworICAgICAgICBydWxlIC8oW15ccyVdKykoXHMqKS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6VGFnLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICAgICAgcHVzaCA6dGFnX21hcmt1cAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6b3V0cHV0IGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIG1peGluIDpnZW5lcmljCisKKyAgICAgICAgcnVsZSAvXH1cfS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBydWxlIC9cfC8sIFB1bmN0dWF0aW9uLCA6ZmlsdGVycworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmaWx0ZXJzIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSAoL1x9XH0vKSB7IHRva2VuIFB1bmN0dWF0aW9uOyByZXNldF9zdGFjayB9CisKKyAgICAgICAgcnVsZSAvKFteXHNcfDpdKykoOj8pKFxzKikvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OkZ1bmN0aW9uLCBQdW5jdHVhdGlvbiwgVGV4dDo6V2hpdGVzcGFjZQorICAgICAgICAgIHB1c2ggOmZpbHRlcl9tYXJrdXAKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZpbHRlcl9tYXJrdXAgZG8KKyAgICAgICAgcnVsZSAvXHwvLCBQdW5jdHVhdGlvbiwgOnBvcCEKKworICAgICAgICBtaXhpbiA6ZW5kX29mX3RhZworICAgICAgICBtaXhpbiA6ZW5kX29mX2Jsb2NrCisgICAgICAgIG1peGluIDpkZWZhdWx0X3BhcmFtX21hcmt1cAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb25kaXRpb24gZG8KKyAgICAgICAgbWl4aW4gOmVuZF9vZl9ibG9jaworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorCisgICAgICAgIHJ1bGUgLyhbPSE+PF09PykvLCBPcGVyYXRvcgorCisgICAgICAgIHJ1bGUgL1xiKCghKXwobm90XGIpKS8gZG8KKyAgICAgICAgICBncm91cHMgbmlsLCBPcGVyYXRvciwgT3BlcmF0b3I6OldvcmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKGNvbnRhaW5zKS8sIE9wZXJhdG9yOjpXb3JkCisKKyAgICAgICAgbWl4aW4gOmdlbmVyaWMKKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6d2hlbiBkbworICAgICAgICBtaXhpbiA6ZW5kX29mX2Jsb2NrCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIG1peGluIDpnZW5lcmljCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm9wZXJhdG9yIGRvCisgICAgICAgIHJ1bGUgLyhccyopKCg9fCF8Pnw8KT0/KShccyopLyBkbworICAgICAgICAgIGdyb3VwcyBUZXh0OjpXaGl0ZXNwYWNlLCBPcGVyYXRvciwgbmlsLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oXHMqKShcYmNvbnRhaW5zXGIpKFxzKikvIGRvCisgICAgICAgICAgZ3JvdXBzIFRleHQ6OldoaXRlc3BhY2UsIE9wZXJhdG9yOjpXb3JkLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZW5kX29mX3RhZyBkbworICAgICAgICBydWxlICgvXH1cfS8pIHsgdG9rZW4gUHVuY3R1YXRpb247IHJlc2V0X3N0YWNrIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZW5kX29mX2Jsb2NrIGRvCisgICAgICAgIHJ1bGUgKC8lXH0vKSB7IHRva2VuIFB1bmN0dWF0aW9uOyByZXNldF9zdGFjayB9CisgICAgICBlbmQKKworICAgICAgIyBzdGF0ZXMgZm9yIHVua25vd24gbWFya3VwCisgICAgICBzdGF0ZSA6cGFyYW1fbWFya3VwIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIG1peGluIDpzdHJpbmcKKworICAgICAgICBydWxlIC8oW15ccz06XSspKFxzKikoPXw6KS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6QXR0cmlidXRlLCBUZXh0OjpXaGl0ZXNwYWNlLCBPcGVyYXRvcgorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oXHtceykoXHMqKShbXlxzXH1dKShccyopKFx9XH0pLyBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgVGV4dDo6V2hpdGVzcGFjZSwgbmlsLCBUZXh0OjpXaGl0ZXNwYWNlLCBQdW5jdHVhdGlvbgorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6bnVtYmVyCisgICAgICAgIG1peGluIDprZXl3b3JkCisKKyAgICAgICAgcnVsZSAvLC8sIFB1bmN0dWF0aW9uCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRlZmF1bHRfcGFyYW1fbWFya3VwIGRvCisgICAgICAgIG1peGluIDpwYXJhbV9tYXJrdXAKKyAgICAgICAgcnVsZSAvLi8sIFRleHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dmFyaWFibGVfcGFyYW1fbWFya3VwIGRvCisgICAgICAgIG1peGluIDpwYXJhbV9tYXJrdXAKKyAgICAgICAgbWl4aW4gOnZhcmlhYmxlCisgICAgICAgIHJ1bGUgLy4vLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRhZ19tYXJrdXAgZG8KKyAgICAgICAgbWl4aW4gOmVuZF9vZl9ibG9jaworICAgICAgICBtaXhpbiA6ZGVmYXVsdF9wYXJhbV9tYXJrdXAKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dmFyaWFibGVfdGFnX21hcmt1cCBkbworICAgICAgICBtaXhpbiA6ZW5kX29mX2Jsb2NrCisgICAgICAgIG1peGluIDp2YXJpYWJsZV9wYXJhbV9tYXJrdXAKKyAgICAgIGVuZAorCisgICAgICAjIHN0YXRlcyBmb3IgZGlmZmVyZW50IHZhbHVlcyB0eXBlcworICAgICAgc3RhdGUgOmtleXdvcmQgZG8KKyAgICAgICAgcnVsZSAvXGIoZmFsc2V8dHJ1ZSlcYi8sIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnZhcmlhYmxlIGRvCisgICAgICAgIHJ1bGUgL1wuKD89XHcpLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvW2EtekEtWl9dXHcqLywgTmFtZTo6VmFyaWFibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5nIGRvCisgICAgICAgIHJ1bGUgLydbXiddKicvLCBTdHI6OlNpbmdsZQorICAgICAgICBydWxlIC8iW14iXSoiLywgU3RyOjpEb3VibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bnVtYmVyIGRvCisgICAgICAgIHJ1bGUgL1xkK1wuXGQrLywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9cZCsvLCBOdW06OkludGVnZXIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YXJyYXlfaW5kZXggZG8KKyAgICAgICAgcnVsZSAvXFsvLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC9cXS8sIFB1bmN0dWF0aW9uCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmdlbmVyaWMgZG8KKyAgICAgICAgbWl4aW4gOmFycmF5X2luZGV4CisgICAgICAgIG1peGluIDprZXl3b3JkCisgICAgICAgIG1peGluIDpzdHJpbmcKKyAgICAgICAgbWl4aW4gOnZhcmlhYmxlCisgICAgICAgIG1peGluIDpudW1iZXIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6d2hpdGVzcGFjZSBkbworICAgICAgICBydWxlIC9bIFx0XSsvLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNvbW1lbnQgZG8KKyAgICAgICAgcnVsZSAvKFx7JSkoXHMqKShlbmRjb21tZW50KShccyopKCVcfSkvIGRvCisgICAgICAgICAgZ3JvdXBzIFB1bmN0dWF0aW9uLCBUZXh0OjpXaGl0ZXNwYWNlLCBOYW1lOjpUYWcsIFRleHQ6OldoaXRlc3BhY2UsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcmVzZXRfc3RhY2sKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvLi8sIENvbW1lbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cmF3IGRvCisgICAgICAgIHJ1bGUgL1teXHtdKy8sIFRleHQKKworICAgICAgICBydWxlIC8oXHslKShccyopKGVuZHJhdykoXHMqKSglXH0pLyBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgVGV4dDo6V2hpdGVzcGFjZSwgTmFtZTo6VGFnLCBUZXh0OjpXaGl0ZXNwYWNlLCBQdW5jdHVhdGlvbgorICAgICAgICAgIHJlc2V0X3N0YWNrCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1x7LywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDphc3NpZ24gZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgbWl4aW4gOmVuZF9vZl9ibG9jaworCisgICAgICAgIHJ1bGUgLyhccyopKD0pKFxzKikvIGRvCisgICAgICAgICAgZ3JvdXBzIFRleHQ6OldoaXRlc3BhY2UsIE9wZXJhdG9yLCBUZXh0OjpXaGl0ZXNwYWNlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1x8LywgUHVuY3R1YXRpb24sIDpmaWx0ZXJzCisKKyAgICAgICAgbWl4aW4gOmdlbmVyaWMKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW5jbHVkZSBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorCisgICAgICAgIHJ1bGUgLyhbXlwuXSspKFwuKShodG1sfGxpcXVpZCkvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OkF0dHJpYnV0ZSwgUHVuY3R1YXRpb24sIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6dmFyaWFibGVfdGFnX21hcmt1cAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9saXRlcmF0ZV9jb2ZmZWVzY3JpcHQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9saXRlcmF0ZV9jb2ZmZWVzY3JpcHQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1NDZjYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2xpdGVyYXRlX2NvZmZlZXNjcmlwdC5yYgpAQCAtMCwwICsxLDMzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgTGl0ZXJhdGVDb2ZmZWVzY3JpcHQgPCBSZWdleExleGVyCisgICAgICB0YWcgJ2xpdGVyYXRlX2NvZmZlZXNjcmlwdCcKKyAgICAgIHRpdGxlICJMaXRlcmF0ZSBDb2ZmZWVTY3JpcHQiCisgICAgICBkZXNjICdMaXRlcmF0ZSBjb2ZmZWVzY3JpcHQnCisgICAgICBhbGlhc2VzICdsaXRjb2ZmZWUnCisgICAgICBmaWxlbmFtZXMgJyoubGl0Y29mZmVlJworCisgICAgICBkZWYgbWFya2Rvd24KKyAgICAgICAgQG1hcmtkb3duIHx8PSBNYXJrZG93bi5uZXcob3B0aW9ucykKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29mZmVlCisgICAgICAgIEBjb2ZmZWUgfHw9IENvZmZlZXNjcmlwdC5uZXcob3B0aW9ucykKKyAgICAgIGVuZAorCisgICAgICBzdGFydCB7IG1hcmtkb3duLnJlc2V0ITsgY29mZmVlLnJlc2V0ISB9CisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL14oICAgIC4qP1xuKSsvbSBkbworICAgICAgICAgIGRlbGVnYXRlIGNvZmZlZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9eKFsgXXswLDN9KFxTLio/fClcbikqL20gZG8KKyAgICAgICAgICBkZWxlZ2F0ZSBtYXJrZG93bgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbGl0ZXJhdGVfaGFza2VsbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2xpdGVyYXRlX2hhc2tlbGwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3MDhhYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2xpdGVyYXRlX2hhc2tlbGwucmIKQEAgLTAsMCArMSwzNiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIExpdGVyYXRlSGFza2VsbCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJMaXRlcmF0ZSBIYXNrZWxsIgorICAgICAgZGVzYyAnTGl0ZXJhdGUgaGFza2VsbCcKKyAgICAgIHRhZyAnbGl0ZXJhdGVfaGFza2VsbCcKKyAgICAgIGFsaWFzZXMgJ2xpdGhhc2tlbGwnLCAnbGhhc2tlbGwnLCAnbGhzJworICAgICAgZmlsZW5hbWVzICcqLmxocycKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LWxpdGVyYXRlLWhhc2tlbGwnCisKKyAgICAgIGRlZiBoYXNrZWxsCisgICAgICAgIEBoYXNrZWxsIHx8PSBIYXNrZWxsLm5ldyhvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgIHN0YXJ0IHsgaGFza2VsbC5yZXNldCEgfQorCisgICAgICAjIFRPRE86IHN1cHBvcnQgVGVYIHZlcnNpb25zIGFzIHdlbGwuCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC9ccyo/XG4oPz0+KS8sIFRleHQsIDpjb2RlCisgICAgICAgIHJ1bGUgLy4qP1xuLywgVGV4dAorICAgICAgICBydWxlIC8uK1x6LywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb2RlIGRvCisgICAgICAgIHJ1bGUgLyg+KSggLio/KFxufFx6KSkvIGRvIHxtfAorICAgICAgICAgIHRva2VuIE5hbWU6OkxhYmVsLCBtWzFdCisgICAgICAgICAgZGVsZWdhdGUgaGFza2VsbCwgbVsyXQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9ccypcbig/PVxzKltePl0pLywgVGV4dCwgOnBvcCEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbGx2bS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2xsdm0ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmOWJhNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2xsdm0ucmIKQEAgLTAsMCArMSw4NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIExMVk0gPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiTExWTSIKKyAgICAgIGRlc2MgJ1RoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlIChodHRwOi8vbGx2bS5vcmcvKScKKyAgICAgIHRhZyAnbGx2bScKKworICAgICAgZmlsZW5hbWVzICcqLmxsJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtbGx2bScKKworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KHRleHQpCisgICAgICAgIHJldHVybiAwLjEgaWYgdGV4dCA9fiAvXEElXHcrXHM9XHMvCisgICAgICBlbmQKKworICAgICAgc3RyaW5nID0gLyJbXiJdKj8iLworICAgICAgaWRlbnRpZmllciA9IC8oWy1hLXpBLVokLl9dWy1hLXpBLVokLl8wLTldKnwje3N0cmluZ30pLworCisgICAgICBzdGF0ZSA6YmFzaWMgZG8KKyAgICAgICAgcnVsZSAvOy4qPyQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorCisgICAgICAgIHJ1bGUgLyN7aWRlbnRpZmllcn1ccyo6LywgTmFtZTo6TGFiZWwKKworICAgICAgICBydWxlIC9AKCN7aWRlbnRpZmllcn18XGQrKS8sIE5hbWU6OlZhcmlhYmxlOjpHbG9iYWwKKyAgICAgICAgcnVsZSAvKCV8ISkje2lkZW50aWZpZXJ9LywgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgcnVsZSAvKCV8ISlcZCsvLCBOYW1lOjpWYXJpYWJsZQorCisgICAgICAgIHJ1bGUgL2M/I3tzdHJpbmd9LywgU3RyCisKKyAgICAgICAgcnVsZSAvMFt4WF1bYS1mQS1GMC05XSsvLCBOdW0KKyAgICAgICAgcnVsZSAvLT9cZCsoPzpbLl1cZCspPyg/OltlRV1bLStdP1xkKyg/OlsuXVxkKyk/KT8vLCBOdW0KKworICAgICAgICBydWxlIC9bPTw+e31cW1xdKCkqLiwhXXx4LywgUHVuY3R1YXRpb24KKyAgICAgIGVuZAorCisgICAgICBidWlsdGluX3R5cGVzID0gJXcoCisgICAgICAgIHZvaWQgZmxvYXQgZG91YmxlIGhhbGYgeDg2X2ZwODAgeDg2bW14IGZwMTI4IHBwY19mcDEyOCBsYWJlbCBtZXRhZGF0YQorICAgICAgKQorCisgICAgICBzdGF0ZSA6dHlwZXMgZG8KKyAgICAgICAgcnVsZSAvaVsxLTldXGQqLywgS2V5d29yZDo6VHlwZQorICAgICAgICBydWxlIC8je2J1aWx0aW5fdHlwZXMuam9pbignfCcpfS8sIEtleXdvcmQ6OlR5cGUKKyAgICAgIGVuZAorCisgICAgICBidWlsdGluX2tleXdvcmRzID0gJXcoCisgICAgICAgIGJlZ2luIGVuZCB0cnVlIGZhbHNlIGRlY2xhcmUgZGVmaW5lIGdsb2JhbCBjb25zdGFudCBwZXJzb25hbGl0eSBwcml2YXRlCisgICAgICAgIGxhbmRpbmdwYWQgbGlua2VyX3ByaXZhdGUgaW50ZXJuYWwgYXZhaWxhYmxlX2V4dGVybmFsbHkgbGlua29uY2Vfb2RyCisgICAgICAgIGxpbmtvbmNlIHdlYWsgd2Vha19vZHIgYXBwZW5kaW5nIGRsbGltcG9ydCBkbGxleHBvcnQgY29tbW9uIGRlZmF1bHQKKyAgICAgICAgaGlkZGVuIHByb3RlY3RlZCBleHRlcm5fd2VhayBleHRlcm5hbCB0aHJlYWRfbG9jYWwgemVyb2luaXRpYWxpemVyCisgICAgICAgIHVuZGVmIG51bGwgdG8gdGFpbCB0YXJnZXQgdHJpcGxlIGRhdGFsYXlvdXQgdm9sYXRpbGUgbnV3IG5zdyBubmFuIG5pbmYKKyAgICAgICAgbnN6IGFyY3AgZmFzdCBleGFjdCBpbmJvdW5kcyBhbGlnbiBhZGRyc3BhY2Ugc2VjdGlvbiBhbGlhcyBtb2R1bGUgYXNtCisgICAgICAgIHNpZGVlZmZlY3QgZ2MgZGJnIGNjYyBmYXN0Y2MgY29sZGNjIHg4Nl9zdGRjYWxsY2MgeDg2X2Zhc3RjYWxsY2MKKyAgICAgICAgYXJtX2FwY3NjYyBhcm1fYWFwY3NjYyBhcm1fYWFwY3NfdmZwY2MgcHR4X2RldmljZSBwdHhfa2VybmVsIGNjCisgICAgICAgIGMgc2lnbmV4dCB6ZXJvZXh0IGlucmVnIHNyZXQgbm91bndpbmQgbm9yZXR1cm4gbm9hbGlhcyBub2NhcHR1cmUgYnl2YWwKKyAgICAgICAgbmVzdCByZWFkbm9uZSByZWFkb25seSBpbmxpbmVoaW50IG5vaW5saW5lIGFsd2F5c2lubGluZSBvcHRzaXplIHNzcAorICAgICAgICBzc3ByZXEgbm9yZWR6b25lIG5vaW1wbGljaXRmbG9hdCBuYWtlZCB0eXBlIG9wYXF1ZSBlcSBuZSBzbHQgc2d0IHNsZQorICAgICAgICBzZ2UgdWx0IHVndCB1bGUgdWdlIG9lcSBvbmUgb2x0IG9ndCBvbGUgb2dlIG9yZCB1bm8gdW5uYW1lZF9hZGRyIHVlcQorICAgICAgICB1bmUgdXd0YWJsZSB4CisgICAgICApCisKKyAgICAgIGJ1aWx0aW5faW5zdHJ1Y3Rpb25zID0gJXcoCisgICAgICAgIGFkZCBmYWRkIHN1YiBmc3ViIG11bCBmbXVsIHVkaXYgc2RpdiBmZGl2IHVyZW0gc3JlbSBmcmVtIHNobCBsc2hyIGFzaHIKKyAgICAgICAgYW5kIG9yIHhvciBpY21wIGZjbXAgcGhpIGNhbGwgY2F0Y2ggdHJ1bmMgemV4dCBzZXh0IGZwdHJ1bmMgZnBleHQKKyAgICAgICAgdWl0b2ZwIHNpdG9mcCBmcHRvdWkgZnB0b3NpIGludHRvcHRyIHB0cnRvaW50IGJpdGNhc3Qgc2VsZWN0IHZhX2FyZyByZXQKKyAgICAgICAgYnIgc3dpdGNoIGludm9rZSB1bndpbmQgdW5yZWFjaGFibGUgbWFsbG9jIGFsbG9jYSBmcmVlIGxvYWQgc3RvcmUKKyAgICAgICAgZ2V0ZWxlbWVudHB0ciBleHRyYWN0ZWxlbWVudCBpbnNlcnRlbGVtZW50IHNodWZmbGV2ZWN0b3IgZ2V0cmVzdWx0CisgICAgICAgIGV4dHJhY3R2YWx1ZSBpbnNlcnR2YWx1ZSBjbGVhbnVwIHJlc3VtZQorICAgICAgKQorCisgICAgICBzdGF0ZSA6a2V5d29yZHMgZG8KKyAgICAgICAgcnVsZSAvI3tidWlsdGluX2luc3RydWN0aW9ucy5qb2luKCd8Jyl9LywgS2V5d29yZAorICAgICAgICBydWxlIC8je2J1aWx0aW5fa2V5d29yZHMuam9pbignfCcpfS8sIEtleXdvcmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6YmFzaWMKKyAgICAgICAgbWl4aW4gOmtleXdvcmRzCisgICAgICAgIG1peGluIDp0eXBlcworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9sdWEucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9sdWEucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhM2RiZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2x1YS5yYgpAQCAtMCwwICsxLDEyMiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIEx1YSA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJMdWEiCisgICAgICBkZXNjICJMdWEgKGh0dHA6Ly93d3cubHVhLm9yZykiCisgICAgICB0YWcgJ2x1YScKKyAgICAgIGZpbGVuYW1lcyAnKi5sdWEnLCAnKi53bHVhJworCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1sdWEnLCAnYXBwbGljYXRpb24veC1sdWEnCisKKyAgICAgIGRlZiBpbml0aWFsaXplKG9wdHM9e30pCisgICAgICAgIEBmdW5jdGlvbl9oaWdobGlnaHRpbmcgPSBvcHRzLmRlbGV0ZSg6ZnVuY3Rpb25faGlnaGxpZ2h0aW5nKSB7IHRydWUgfQorICAgICAgICBAZGlzYWJsZWRfbW9kdWxlcyA9IG9wdHMuZGVsZXRlKDpkaXNhYmxlZF9tb2R1bGVzKSB7IFtdIH0KKyAgICAgICAgc3VwZXIob3B0cykKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAnbHVhJworICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIGxvYWQgUGF0aG5hbWUubmV3KF9fRklMRV9fKS5kaXJuYW1lLmpvaW4oJ2x1YS9idWlsdGlucy5yYicpCisgICAgICAgIHNlbGYuYnVpbHRpbnMKKyAgICAgIGVuZAorCisgICAgICBkZWYgYnVpbHRpbnMKKyAgICAgICAgcmV0dXJuIFtdIHVubGVzcyBAZnVuY3Rpb25faGlnaGxpZ2h0aW5nCisKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSBTZXQubmV3LnRhcCBkbyB8YnVpbHRpbnN8CisgICAgICAgICAgc2VsZi5jbGFzcy5idWlsdGlucy5lYWNoIGRvIHxtb2QsIGZuc3wKKyAgICAgICAgICAgIG5leHQgaWYgQGRpc2FibGVkX21vZHVsZXMuaW5jbHVkZT8gbW9kCisgICAgICAgICAgICBidWlsdGlucy5tZXJnZShmbnMpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgICMgbHVhIGFsbG93cyBhIGZpbGUgdG8gc3RhcnQgd2l0aCBhIHNoZWJhbmcKKyAgICAgICAgcnVsZSAlcigjISguKj8pJCksIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgcnVsZSAvLywgVGV4dCwgOmJhc2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YmFzZSBkbworICAgICAgICBydWxlICVyKC0tXFsoPSopXFsuKj9cXVwxXF0pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgJXIoLS0uKiQpLCBDb21tZW50OjpTaW5nbGUKKworICAgICAgICBydWxlICVyKCg/aSkoXGQqXC5cZCt8XGQrXC5cZCopKGVbKy1dP1xkKyk/JyksIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAlcigoP2kpXGQrZVsrLV0/XGQrKSwgTnVtOjpGbG9hdAorICAgICAgICBydWxlICVyKCg/aSkweFswLTlhLWZdKiksIE51bTo6SGV4CisgICAgICAgIHJ1bGUgJXIoXGQrKSwgTnVtOjpJbnRlZ2VyCisKKyAgICAgICAgcnVsZSAlcihcbiksIFRleHQKKyAgICAgICAgcnVsZSAlcihbXlxTXG5dKSwgVGV4dAorICAgICAgICAjIG11bHRpbGluZSBzdHJpbmdzCisgICAgICAgIHJ1bGUgJXIoXFsoPSopXFsuKj9cXVwxXF0pbSwgU3RyCisKKyAgICAgICAgcnVsZSAlcigoPT18fj18PD18Pj18XC5cLlwufFwuXC58Wz0rXC0qLyVePD4jXSkpLCBPcGVyYXRvcgorICAgICAgICBydWxlICVyKFtcW1xdXHtcfVwoXClcLiw6O10pLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlICVyKChhbmR8b3J8bm90KVxiKSwgT3BlcmF0b3I6OldvcmQKKworICAgICAgICBydWxlICVyKChicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8Zm9yfGlmfGlufHJlcGVhdHxyZXR1cm58dGhlbnx1bnRpbHx3aGlsZSlcYiksIEtleXdvcmQKKyAgICAgICAgcnVsZSAlcigobG9jYWwpXGIpLCBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICBydWxlICVyKCh0cnVlfGZhbHNlfG5pbClcYiksIEtleXdvcmQ6OkNvbnN0YW50CisKKyAgICAgICAgcnVsZSAlcigoZnVuY3Rpb24pXGIpLCBLZXl3b3JkLCA6ZnVuY3Rpb25fbmFtZQorCisgICAgICAgIHJ1bGUgJXIoW0EtWmEtel9dW0EtWmEtejAtOV9dKihcLltBLVphLXpfXVtBLVphLXowLTlfXSopPykgZG8gfG18CisgICAgICAgICAgbmFtZSA9IG1bMF0KKyAgICAgICAgICBpZiBzZWxmLmJ1aWx0aW5zLmluY2x1ZGU/KG5hbWUpCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzaWYgbmFtZSA9fiAvXC4vCisgICAgICAgICAgICBhLCBiID0gbmFtZS5zcGxpdCgnLicsIDIpCisgICAgICAgICAgICB0b2tlbiBOYW1lLCBhCisgICAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgJy4nCisgICAgICAgICAgICB0b2tlbiBOYW1lLCBiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlICVyKCcpLCBTdHI6OlNpbmdsZSwgOmVzY2FwZV9zcXMKKyAgICAgICAgcnVsZSAlcigiKSwgU3RyOjpEb3VibGUsIDplc2NhcGVfZHFzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZ1bmN0aW9uX25hbWUgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlICVyKCg/OihbQS1aYS16X11bQS1aYS16MC05X10qKShcLikpPyhbQS1aYS16X11bQS1aYS16MC05X10qKSkgZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6Q2xhc3MsIFB1bmN0dWF0aW9uLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisgICAgICAgICMgaW5saW5lIGZ1bmN0aW9uCisgICAgICAgIHJ1bGUgJXIoXCgpLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXNjYXBlX3NxcyBkbworICAgICAgICBtaXhpbiA6c3RyaW5nX2VzY2FwZQorICAgICAgICBtaXhpbiA6c3FzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmVzY2FwZV9kcXMgZG8KKyAgICAgICAgbWl4aW4gOnN0cmluZ19lc2NhcGUKKyAgICAgICAgbWl4aW4gOmRxcworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmdfZXNjYXBlIGRvCisgICAgICAgIHJ1bGUgJXIoXFwoW2FiZm5ydHZcXCInXXxcZHsxLDN9KSksIFN0cjo6RXNjYXBlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNxcyBkbworICAgICAgICBydWxlICVyKCcpLCBTdHI6OlNpbmdsZSwgOnBvcCEKKyAgICAgICAgcnVsZSAlcihbXiddKyksIFN0cjo6U2luZ2xlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRxcyBkbworICAgICAgICBydWxlICVyKCIpLCBTdHI6OkRvdWJsZSwgOnBvcCEKKyAgICAgICAgcnVsZSAlcihbXiJdKyksIFN0cjo6RG91YmxlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2x1YS9idWlsdGlucy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL2x1YS9idWlsdGlucy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMxNTUxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbHVhL2J1aWx0aW5zLnJiCkBAIC0wLDAgKzEsMjIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKyMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgYHJha2UgYnVpbHRpbnM6bHVhYAorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBMdWEKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0ge30udGFwIGRvIHxifAorICAgICAgICAgIGJbImJhc2ljIl0gPSBTZXQubmV3ICV3KF9HIF9WRVJTSU9OIGFzc2VydCBjb2xsZWN0Z2FyYmFnZSBkb2ZpbGUgZXJyb3IgZ2V0bWV0YXRhYmxlIGlwYWlycyBsb2FkIGxvYWRmaWxlIG5leHQgcGFpcnMgcGNhbGwgcHJpbnQgcmF3ZXF1YWwgcmF3Z2V0IHJhd2xlbiByYXdzZXQgc2VsZWN0IHNldG1ldGF0YWJsZSB0b251bWJlciB0b3N0cmluZyB0eXBlIHhwY2FsbCBmaWxlOmNsb3NlIGZpbGU6Zmx1c2ggZmlsZTpsaW5lcyBmaWxlOnJlYWQgZmlsZTpzZWVrIGZpbGU6c2V0dmJ1ZiBmaWxlOndyaXRlKQorICAgICAgICAgIGJbIm1vZHVsZXMiXSA9IFNldC5uZXcgJXcocmVxdWlyZSBwYWNrYWdlLmNvbmZpZyBwYWNrYWdlLmNwYXRoIHBhY2thZ2UubG9hZGVkIHBhY2thZ2UubG9hZGxpYiBwYWNrYWdlLnBhdGggcGFja2FnZS5wcmVsb2FkIHBhY2thZ2Uuc2VhcmNoZXJzIHBhY2thZ2Uuc2VhcmNocGF0aCkKKyAgICAgICAgICBiWyJiaXQzMiJdID0gU2V0Lm5ldyAldyhiaXQzMi5hcnNoaWZ0IGJpdDMyLmJhbmQgYml0MzIuYm5vdCBiaXQzMi5ib3IgYml0MzIuYnRlc3QgYml0MzIuYnhvciBiaXQzMi5leHRyYWN0IGJpdDMyLmxyb3RhdGUgYml0MzIubHNoaWZ0IGJpdDMyLnJlcGxhY2UgYml0MzIucnJvdGF0ZSBiaXQzMi5yc2hpZnQpCisgICAgICAgICAgYlsiY29yb3V0aW5lIl0gPSBTZXQubmV3ICV3KGNvcm91dGluZS5jcmVhdGUgY29yb3V0aW5lLnJlc3VtZSBjb3JvdXRpbmUucnVubmluZyBjb3JvdXRpbmUuc3RhdHVzIGNvcm91dGluZS53cmFwIGNvcm91dGluZS55aWVsZCkKKyAgICAgICAgICBiWyJkZWJ1ZyJdID0gU2V0Lm5ldyAldyhkZWJ1Zy5kZWJ1ZyBkZWJ1Zy5nZXR1c2VydmFsdWUgZGVidWcuZ2V0aG9vayBkZWJ1Zy5nZXRpbmZvIGRlYnVnLmdldGxvY2FsIGRlYnVnLmdldG1ldGF0YWJsZSBkZWJ1Zy5nZXRyZWdpc3RyeSBkZWJ1Zy5nZXR1cHZhbHVlIGRlYnVnLnNldHVzZXJ2YWx1ZSBkZWJ1Zy5zZXRob29rIGRlYnVnLnNldGxvY2FsIGRlYnVnLnNldG1ldGF0YWJsZSBkZWJ1Zy5zZXR1cHZhbHVlIGRlYnVnLnRyYWNlYmFjayBkZWJ1Zy51cHZhbHVlaWQgZGVidWcudXB2YWx1ZWpvaW4pCisgICAgICAgICAgYlsiaW8iXSA9IFNldC5uZXcgJXcoaW8uY2xvc2UgaW8uZmx1c2ggaW8uaW5wdXQgaW8ubGluZXMgaW8ub3BlbiBpby5vdXRwdXQgaW8ucG9wZW4gaW8ucmVhZCBpby5zdGRlcnIgaW8uc3RkaW4gaW8uc3Rkb3V0IGlvLnRtcGZpbGUgaW8udHlwZSBpby53cml0ZSkKKyAgICAgICAgICBiWyJtYXRoIl0gPSBTZXQubmV3ICV3KG1hdGguYWJzIG1hdGguYWNvcyBtYXRoLmFzaW4gbWF0aC5hdGFuIG1hdGguYXRhbjIgbWF0aC5jZWlsIG1hdGguY29zIG1hdGguY29zaCBtYXRoLmRlZyBtYXRoLmV4cCBtYXRoLmZsb29yIG1hdGguZm1vZCBtYXRoLmZyZXhwIG1hdGguaHVnZSBtYXRoLmxkZXhwIG1hdGgubG9nIG1hdGgubWF4IG1hdGgubWluIG1hdGgubW9kZiBtYXRoLnBpIG1hdGgucG93IG1hdGgucmFkIG1hdGgucmFuZG9tIG1hdGgucmFuZG9tc2VlZCBtYXRoLnNpbiBtYXRoLnNpbmggbWF0aC5zcXJ0IG1hdGgudGFuIG1hdGgudGFuaCkKKyAgICAgICAgICBiWyJvcyJdID0gU2V0Lm5ldyAldyhvcy5jbG9jayBvcy5kYXRlIG9zLmRpZmZ0aW1lIG9zLmV4ZWN1dGUgb3MuZXhpdCBvcy5nZXRlbnYgb3MucmVtb3ZlIG9zLnJlbmFtZSBvcy5zZXRsb2NhbGUgb3MudGltZSBvcy50bXBuYW1lKQorICAgICAgICAgIGJbInN0cmluZyJdID0gU2V0Lm5ldyAldyhzdHJpbmcuYnl0ZSBzdHJpbmcuY2hhciBzdHJpbmcuZHVtcCBzdHJpbmcuZmluZCBzdHJpbmcuZm9ybWF0IHN0cmluZy5nbWF0Y2ggc3RyaW5nLmdzdWIgc3RyaW5nLmxlbiBzdHJpbmcubG93ZXIgc3RyaW5nLm1hdGNoIHN0cmluZy5yZXAgc3RyaW5nLnJldmVyc2Ugc3RyaW5nLnN1YiBzdHJpbmcudXBwZXIpCisgICAgICAgICAgYlsidGFibGUiXSA9IFNldC5uZXcgJXcodGFibGUuY29uY2F0IHRhYmxlLmluc2VydCB0YWJsZS5wYWNrIHRhYmxlLnJlbW92ZSB0YWJsZS5zb3J0IHRhYmxlLnVucGFjaykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL21ha2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9tYWtlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ODYyZTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9tYWtlLnJiCkBAIC0wLDAgKzEsMTE2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgTWFrZSA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJNYWtlIgorICAgICAgZGVzYyAiTWFrZWZpbGUgc3ludGF4IgorICAgICAgdGFnICdtYWtlJworICAgICAgYWxpYXNlcyAnbWFrZWZpbGUnLCAnbWYnLCAnZ251bWFrZScsICdic2RtYWtlJworICAgICAgZmlsZW5hbWVzICcqLm1ha2UnLCAnTWFrZWZpbGUnLCAnbWFrZWZpbGUnLCAnTWFrZWZpbGUuKicsICdHTlVtYWtlZmlsZScKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LW1ha2VmaWxlJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDAuNiBpZiB0ZXh0ID1+IC9eXC5QSE9OWTovCisgICAgICBlbmQKKworICAgICAgYnNkX3NwZWNpYWwgPSAldygKKyAgICAgICAgaW5jbHVkZSB1bmRlZiBlcnJvciB3YXJuaW5nIGlmIGVsc2UgZWxpZiBlbmRpZiBmb3IgZW5kZm9yCisgICAgICApCisKKyAgICAgIGdudV9zcGVjaWFsID0gJXcoCisgICAgICAgIGlmZXEgaWZuZXEgaWZkZWYgaWZuZGVmIGVsc2UgZW5kaWYgaW5jbHVkZSAtaW5jbHVkZSBkZWZpbmUgZW5kZWYgOgorICAgICAgKQorCisgICAgICBsaW5lID0gLyg/OlxcLnxcXFxufFteXFxcbl0pKi9tCisKKyAgICAgIGRlZiBpbml0aWFsaXplKG9wdHM9e30pCisgICAgICAgIHN1cGVyCisgICAgICAgIEBzaGVsbCA9IFNoZWxsLm5ldyhvcHRzKQorICAgICAgZW5kCisKKyAgICAgIHN0YXJ0IHsgQHNoZWxsLnJlc2V0ISB9CisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKworICAgICAgICBydWxlIC8jLio/XG4vLCBDb21tZW50CisKKyAgICAgICAgcnVsZSAvKGV4cG9ydCkoXHMrKSg/PVthLXpBLVowLTlfXCR7fVx0IC1dK1xuKS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dAorICAgICAgICAgIHB1c2ggOmV4cG9ydAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9leHBvcnRccysvLCBLZXl3b3JkCisKKyAgICAgICAgIyBhc3NpZ25tZW50CisgICAgICAgIHJ1bGUgLyhbYS16QS1aMC05XyR7fS4tXSspKFxzKikoWyE/OitdPz0pL20gZG8gfG18CisgICAgICAgICAgdG9rZW4gTmFtZTo6VmFyaWFibGUsIG1bMV0KKyAgICAgICAgICB0b2tlbiBUZXh0LCBtWzJdCisgICAgICAgICAgdG9rZW4gT3BlcmF0b3IsIG1bM10KKyAgICAgICAgICBwdXNoIDpzaGVsbF9saW5lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyIoXFxcXHxcXC58W14iXFxdKSoiLywgU3RyOjpEb3VibGUKKyAgICAgICAgcnVsZSAvJyhcXFxcfFxcLnxbXidcXF0pKicvLCBTdHI6OlNpbmdsZQorICAgICAgICBydWxlIC8oW15cbjpdKykoOispKFsgXHRdKikvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OkxhYmVsLCBPcGVyYXRvciwgVGV4dAorICAgICAgICAgIHB1c2ggOmJsb2NrX2hlYWRlcgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXhwb3J0IGRvCisgICAgICAgIHJ1bGUgL1tcd1wke30tXS8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnBvcCEKKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpibG9ja19oZWFkZXIgZG8KKyAgICAgICAgcnVsZSAvW14sXFxcbiNdKy8sIE5hbWU6OkZ1bmN0aW9uCisgICAgICAgIHJ1bGUgLywvLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC8jLio/LywgQ29tbWVudAorICAgICAgICBydWxlIC9cXFxuLywgVGV4dAorICAgICAgICBydWxlIC9cXC4vLCBUZXh0CisgICAgICAgIHJ1bGUgL1xuLyBkbworICAgICAgICAgIHRva2VuIFRleHQKKyAgICAgICAgICBnb3RvIDpibG9ja19ib2R5CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpibG9ja19ib2R5IGRvCisgICAgICAgIHJ1bGUgLyhcdFtcdCBdKikoW0AtXT8pLyBkbyB8bXwKKyAgICAgICAgICBncm91cHMgVGV4dCwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDpzaGVsbF9saW5lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUoLy8pIHsgQHNoZWxsLnJlc2V0ITsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNoZWxsIGRvCisgICAgICAgICMgbWFjcm8gaW50ZXJwb2xhdGlvbgorICAgICAgICBydWxlIC9cJFwoXHMqW2Etel9dXHcqXHMqXCkvaSwgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgIyAkKHNoZWxsIC4uLikKKyAgICAgICAgcnVsZSAvKFwkXCgpKFxzKikoc2hlbGwpKFxzKykvbSBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpGdW5jdGlvbiwgVGV4dCwgTmFtZTo6QnVpbHRpbiwgVGV4dAorICAgICAgICAgIHB1c2ggOnNoZWxsX2V4cHIKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSgvXFwuL20pIHsgZGVsZWdhdGUgQHNoZWxsIH0KKyAgICAgICAgc3RvcCA9IC9cJFwofFwofFwpfFxufFxcLworICAgICAgICBydWxlKC8uKz8oPz0je3N0b3B9KS9tKSB7IGRlbGVnYXRlIEBzaGVsbCB9CisgICAgICAgIHJ1bGUoc3RvcCkgeyBkZWxlZ2F0ZSBAc2hlbGwgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzaGVsbF9leHByIGRvCisgICAgICAgIHJ1bGUoL1woLykgeyBkZWxlZ2F0ZSBAc2hlbGw7IHB1c2ggfQorICAgICAgICBydWxlIC9cKS8sIE5hbWU6OlZhcmlhYmxlLCA6cG9wIQorICAgICAgICBtaXhpbiA6c2hlbGwKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c2hlbGxfbGluZSBkbworICAgICAgICBydWxlIC9cbi8sIFRleHQsIDpwb3AhCisgICAgICAgIG1peGluIDpzaGVsbAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9tYXJrZG93bi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL21hcmtkb3duLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NmQyN2IKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9tYXJrZG93bi5yYgpAQCAtMCwwICsxLDE1NSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIE1hcmtkb3duIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIk1hcmtkb3duIgorICAgICAgZGVzYyAiTWFya2Rvd24sIGEgbGlnaHQtd2VpZ2h0IG1hcmt1cCBsYW5ndWFnZSBmb3IgYXV0aG9ycyIKKworICAgICAgdGFnICdtYXJrZG93bicKKyAgICAgIGFsaWFzZXMgJ21kJywgJ21rZCcKKyAgICAgIGZpbGVuYW1lcyAnKi5tYXJrZG93bicsICcqLm1kJywgJyoubWtkJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtbWFya2Rvd24nCisKKyAgICAgIGRlZiBodG1sCisgICAgICAgIEBodG1sIHx8PSBIVE1MLm5ldyhvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgIHN0YXJ0IHsgaHRtbC5yZXNldCEgfQorCisgICAgICBlZG90ID0gL1xcLnxbXlxcXG5dLworCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICAjIFlBTUwgZnJvbnRtYXR0ZXIKKyAgICAgICAgcnVsZSgvXEEoLS0tXHMqXG4uKj9cbj8pXigtLS1ccyokXG4/KS9tKSB7IGRlbGVnYXRlIFlBTUwgfQorCisgICAgICAgIHJ1bGUgL1xcLi8sIFN0cjo6RXNjYXBlCisKKyAgICAgICAgcnVsZSAvXltcUyBdK1xuKD86LS0tKilcbi8sIEdlbmVyaWM6OkhlYWRpbmcKKyAgICAgICAgcnVsZSAvXltcUyBdK1xuKD86PT09Kilcbi8sIEdlbmVyaWM6OlN1YmhlYWRpbmcKKworICAgICAgICBydWxlIC9eIyg/PVteI10pLio/JC8sIEdlbmVyaWM6OkhlYWRpbmcKKyAgICAgICAgcnVsZSAvXiMjKi4qPyQvLCBHZW5lcmljOjpTdWJoZWFkaW5nCisKKyAgICAgICAgIyBUT0RPOiBzeW50YXggaGlnaGxpZ2h0IHRoZSBjb2RlIGJsb2NrLCBnaXRodWIgc3R5bGUKKyAgICAgICAgcnVsZSAvKFxuWyBcdF0qKShgYGB8fn5+KSguKj8pKFxuLio/KShcMikvbSBkbyB8bXwKKyAgICAgICAgICBzdWJsZXhlciA9IExleGVyLmZpbmRfZmFuY3kobVszXS5zdHJpcCwgbVs0XSkKKyAgICAgICAgICBzdWJsZXhlciB8fD0gUGxhaW5UZXh0Lm5ldyg6dG9rZW4gPT4gU3RyOjpCYWNrdGljaykKKyAgICAgICAgICBzdWJsZXhlci5yZXNldCEKKworICAgICAgICAgIHRva2VuIFRleHQsIG1bMV0KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVsyXQorICAgICAgICAgIHRva2VuIE5hbWU6OkxhYmVsLCBtWzNdCisgICAgICAgICAgZGVsZWdhdGUgc3VibGV4ZXIsIG1bNF0KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVs1XQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9cblxuKCggICAgfFx0KS4qP1xufFxuKSsvLCBTdHI6OkJhY2t0aWNrCisKKyAgICAgICAgcnVsZSAvKGArKSN7ZWRvdH0qXDEvLCBTdHI6OkJhY2t0aWNrCisKKyAgICAgICAgIyB2YXJpb3VzIHVzZXMgb2YgKiBhcmUgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZQorCisgICAgICAgICMgbGluZSBicmVha3MKKyAgICAgICAgcnVsZSAvXihccypbKl0pezMsfVxzKiQvLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC9eKFxzKlstXSl7Myx9XHMqJC8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgIyBidWxsZXRlZCBsaXN0cworICAgICAgICBydWxlIC9eXHMqWyorLV0oPz1ccykvLCBQdW5jdHVhdGlvbgorCisgICAgICAgICMgbnVtYmVyZWQgbGlzdHMKKyAgICAgICAgcnVsZSAvXlxzKlxkK1wuLywgUHVuY3R1YXRpb24KKworICAgICAgICAjIGJsb2NrcXVvdGVzCisgICAgICAgIHJ1bGUgL15ccyo+Lio/JC8sIEdlbmVyaWM6OlRyYWNlYmFjaworCisgICAgICAgICMgbGluayByZWZlcmVuY2VzCisgICAgICAgICMgW2Zvb106IGJhciAiYmF6IgorICAgICAgICBydWxlICVyKF4KKyAgICAgICAgICAoXHMqKSAjIGxlYWRpbmcgd2hpdGVzcGFjZQorICAgICAgICAgIChcWykgKCN7ZWRvdH0rPykgKFxdKSAjIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICAoXHMqKSAoOikgIyBjb2xvbgorICAgICAgICApeCBkbworICAgICAgICAgIGdyb3VwcyBUZXh0LCBQdW5jdHVhdGlvbiwgU3RyOjpTeW1ib2wsIFB1bmN0dWF0aW9uLCBUZXh0LCBQdW5jdHVhdGlvbgorCisgICAgICAgICAgcHVzaCA6dGl0bGUKKyAgICAgICAgICBwdXNoIDp1cmwKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBsaW5rcyBhbmQgaW1hZ2VzCisgICAgICAgIHJ1bGUgLyghP1xbKSgje2Vkb3R9Kz8pKFxdKS8gZG8KKyAgICAgICAgICBncm91cHMgUHVuY3R1YXRpb24sIE5hbWU6OlZhcmlhYmxlLCBQdW5jdHVhdGlvbgorICAgICAgICAgIHB1c2ggOmxpbmsKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvWypdWypdI3tlZG90fSo/WypdWypdLywgR2VuZXJpYzo6U3Ryb25nCisgICAgICAgIHJ1bGUgL19fI3tlZG90fSo/X18vLCBHZW5lcmljOjpTdHJvbmcKKworICAgICAgICBydWxlIC9bKl0je2Vkb3R9Kj9bKl0vLCBHZW5lcmljOjpFbXBoCisgICAgICAgIHJ1bGUgL18je2Vkb3R9Kj9fLywgR2VuZXJpYzo6RW1waAorCisgICAgICAgICMgQXV0b21hdGljIGxpbmtzCisgICAgICAgIHJ1bGUgLzwuKj9ALitbLl0uKz4vLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBydWxlICVyWzwoaHR0cHM/fG1haWx0b3xmdHApOi8vI3tlZG90fSo/Pl0sIE5hbWU6OlZhcmlhYmxlCisKKworICAgICAgICBydWxlIC9bXlxcYFxbKlxuJjxdKy8sIFRleHQKKworICAgICAgICAjIGlubGluZSBodG1sCisgICAgICAgIHJ1bGUoLyZcUyo7LykgeyBkZWxlZ2F0ZSBodG1sIH0KKyAgICAgICAgcnVsZSgvPCN7ZWRvdH0qPz4vKSB7IGRlbGVnYXRlIGh0bWwgfQorICAgICAgICBydWxlIC9bJjxdLywgVGV4dAorCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpsaW5rIGRvCisgICAgICAgIHJ1bGUgLyhcWykoI3tlZG90fSo/KShcXSkvIGRvCisgICAgICAgICAgZ3JvdXBzIFB1bmN0dWF0aW9uLCBTdHI6OlN5bWJvbCwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1soXS8gZG8KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgIHB1c2ggOmlubGluZV90aXRsZQorICAgICAgICAgIHB1c2ggOmlubGluZV91cmwKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvWyBcdF0rLywgVGV4dAorCisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnVybCBkbworICAgICAgICBydWxlIC9bIFx0XSsvLCBUZXh0CisKKyAgICAgICAgIyB0aGUgdXJsCisgICAgICAgIHJ1bGUgLyg8KSgje2Vkb3R9Kj8pKD4pLyBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpUYWcsIFN0cjo6T3RoZXIsIE5hbWU6OlRhZworICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXFMrLywgU3RyOjpPdGhlciwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dGl0bGUgZG8KKyAgICAgICAgcnVsZSAvIiN7ZWRvdH0qPyIvLCBOYW1lOjpOYW1lc3BhY2UKKyAgICAgICAgcnVsZSAvJyN7ZWRvdH0qPycvLCBOYW1lOjpOYW1lc3BhY2UKKyAgICAgICAgcnVsZSAvWyhdI3tlZG90fSo/WyldLywgTmFtZTo6TmFtZXNwYWNlCisgICAgICAgIHJ1bGUgL1xzKig/PVsiJygpXSkvLCBUZXh0CisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmlubGluZV90aXRsZSBkbworICAgICAgICBydWxlIC9bKV0vLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgICAgbWl4aW4gOnRpdGxlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmlubGluZV91cmwgZG8KKyAgICAgICAgcnVsZSAvW148XHMpXSsvLCBTdHI6Ok90aGVyLCA6cG9wIQorICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgICBtaXhpbiA6dXJsCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL21hdGxhYi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL21hdGxhYi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRhYmJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbWF0bGFiLnJiCkBAIC0wLDAgKzEsNzUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBNYXRsYWIgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiTUFUTEFCIgorICAgICAgZGVzYyAiTWF0bGFiIgorICAgICAgdGFnICdtYXRsYWInCisgICAgICBhbGlhc2VzICdtJworICAgICAgZmlsZW5hbWVzICcqLm0nCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1tYXRsYWInLCAnYXBwbGljYXRpb24veC1tYXRsYWInCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMC40IGlmIHRleHQubWF0Y2goL15ccyolIC8pICMgJSBjb21tZW50cyBhcmUgYSBkZWFkIGdpdmVhd2F5CisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzID0gU2V0Lm5ldyAldygKKyAgICAgICAgICBicmVhayBjYXNlIGNhdGNoIGNsYXNzZGVmIGNvbnRpbnVlIGVsc2UgZWxzZWlmIGVuZCBmb3IgZnVuY3Rpb24KKyAgICAgICAgICBnbG9iYWwgaWYgb3RoZXJ3aXNlIHBhcmZvciBwZXJzaXN0ZW50IHJldHVybiBzcG1kIHN3aXRjaCB0cnkgd2hpbGUKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIGxvYWQgUGF0aG5hbWUubmV3KF9fRklMRV9fKS5kaXJuYW1lLmpvaW4oJ21hdGxhYi9idWlsdGlucy5yYicpCisgICAgICAgIHNlbGYuYnVpbHRpbnMKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC9ccysvbSwgVGV4dCAjIFdoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAlcihbe10lLio/JVt9XSltLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgcnVsZSAvJS4qJC8sIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBydWxlIC8oWy5dWy5dWy5dKSguKj8pJC8gZG8KKyAgICAgICAgICBncm91cHMoS2V5d29yZCwgQ29tbWVudCkKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXighKSguKj8pKD89JXwkKS8gZG8gfG18CisgICAgICAgICAgdG9rZW4gS2V5d29yZCwgbVsxXQorICAgICAgICAgIGRlbGVnYXRlIFNoZWxsLCBtWzJdCisgICAgICAgIGVuZAorCisKKyAgICAgICAgcnVsZSAvW2EtekEtWl1bX2EtekEtWjAtOV0qL20gZG8gfG18CisgICAgICAgICAgbWF0Y2ggPSBtWzBdCisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyBtYXRjaAorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuYnVpbHRpbnMuaW5jbHVkZT8gbWF0Y2gKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgJXJ7Wygpe307OixcL1xcXF1cW119LCBQdW5jdHVhdGlvbgorCisgICAgICAgIHJ1bGUgL349fD09fDw8fD4+fFstfitcLyolPTw+Jl58LkBdLywgT3BlcmF0b3IKKworCisgICAgICAgIHJ1bGUgLyhcZCtcLlxkKnxcZCpcLlxkKykoZVsrLV0/WzAtOV0rKT8vaSwgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9cZCtlWystXT9bMC05XSsvaSwgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9cZCtMLywgTnVtOjpJbnRlZ2VyOjpMb25nCisgICAgICAgIHJ1bGUgL1xkKy8sIE51bTo6SW50ZWdlcgorCisgICAgICAgIHJ1bGUgLycoPz0oLionKSkvLCBTdHI6OlNpbmdsZSwgOnN0cmluZworICAgICAgICBydWxlIC8nLywgT3BlcmF0b3IKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5nIGRvCisgICAgICAgIHJ1bGUgL1teJ10rLywgU3RyOjpTaW5nbGUKKyAgICAgICAgcnVsZSAvJycvLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC8nLywgU3RyOjpTaW5nbGUsIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL21hdGxhYi9idWlsdGlucy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL21hdGxhYi9idWlsdGlucy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc4OTk4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbWF0bGFiL2J1aWx0aW5zLnJiCkBAIC0wLDAgKzEsMTEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKyMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgYHJha2UgYnVpbHRpbnM6bWF0bGFiYAorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBNYXRsYWIKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0gU2V0Lm5ldyAldyhhbnMgY2xjIGRpYXJ5IGZvcm1hdCBob21lIGlza2V5d29yZCBtb3JlIGFjY3VtYXJyYXkgYmxrZGlhZyBkaWFnIGV5ZSBmYWxzZSBmcmVxc3BhY2UgbGluc3BhY2UgbG9nc3BhY2UgbWVzaGdyaWQgbmRncmlkIG9uZXMgcmFuZCB0cnVlIHplcm9zIGNhdCBob3J6Y2F0IHZlcnRjYXQgY29sb24gZW5kIGluZDJzdWIgc3ViMmluZCBsZW5ndGggbmRpbXMgbnVtZWwgc2l6ZSBoZWlnaHQgd2lkdGggaXNjb2x1bW4gaXNlbXB0eSBpc21hdHJpeCBpc3JvdyBpc3NjYWxhciBpc3ZlY3RvciBibGtkaWFnIGNpcmNzaGlmdCBjdHJhbnNwb3NlIGRpYWcgZmxpcCBmbGlwbHIgZmxpcHVkIGlwZXJtdXRlIHBlcm11dGUgcmVwbWF0IHJlc2hhcGUgcm90OTAgc2hpZnRkaW0gaXNzb3J0ZWQgc29ydCBzb3J0cm93cyBzcXVlZXplIHRyYW5zcG9zZSB2ZWN0b3JpemUgcGx1cyB1cGx1cyBtaW51cyB1bWludXMgdGltZXMgcmRpdmlkZSBsZGl2aWRlIHBvd2VyIG10aW1lcyBtcmRpdmlkZSBtbGRpdmlkZSBtcG93ZXIgY3VtcHJvZCBjdW1zdW0gZGlmZiBwcm9kIHN1bSBjZWlsIGZpeCBmbG9vciBpZGl2aWRlIG1vZCByZW0gcm91bmQgcmVsYXRpb25hbG9wZXJhdG9ycyBlcSBnZSBndCBsZSBsdCBuZSBpc2VxdWFsIGlzZXF1YWxuIGxvZ2ljYWxvcGVyYXRvcnNzaG9ydGNpcmN1aXQgYW5kIG5vdCBvciB4b3IgYWxsIGFueSBmYWxzZSBmaW5kIGlzbG9naWNhbCBsb2dpY2FsIHRydWUgaW50ZXJzZWN0IGlzbWVtYmVyIGlzc29ydGVkIHNldGRpZmYgc2V0eG9yIHVuaW9uIHVuaXF1ZSBqb2luIGlubmVyam9pbiBvdXRlcmpvaW4gYml0YW5kIGJpdGNtcCBiaXRnZXQgYml0b3IgYml0c2V0IGJpdHNoaWZ0IGJpdHhvciBzd2FwYnl0ZXMgc3BlY2lhbGNoYXJhY3RlcnMgY29sb24gZG91YmxlIHNpbmdsZSBpbnQ4IGludDE2IGludDMyIGludDY0IHVpbnQ4IHVpbnQxNiB1aW50MzIgdWludDY0IGNhc3QgdHlwZWNhc3QgaXNpbnRlZ2VyIGlzZmxvYXQgaXNudW1lcmljIGlzcmVhbCBpc2Zpbml0ZSBpc2luZiBpc25hbiBlcHMgZmxpbnRtYXggaW5mIGludG1heCBpbnRtaW4gbmFuIHJlYWxtYXggcmVhbG1pbiBibGFua3MgY2VsbHN0ciBjaGFyIGlzY2VsbHN0ciBpc2NoYXIgc3ByaW50ZiBzdHJjYXQgc3Ryam9pbiBpc2NoYXIgaXNsZXR0ZXIgaXNzcGFjZSBpc3N0cnByb3Agc3NjYW5mIHN0cmZpbmQgc3RycmVwIHN0cnNwbGl0IHN0cnRvayB2YWxpZGF0ZXN0cmluZyBzeW12YXIgcmVnZXhwIHJlZ2V4cGkgcmVnZXhwcmVwIHJlZ2V4cHRyYW5zbGF0ZSBzdHJjbXAgc3RyY21waSBzdHJuY21wIHN0cm5jbXBpIGJsYW5rcyBkZWJsYW5rIHN0cnRyaW0gbG93ZXIgdXBwZXIgc3RyanVzdCBjYXRlZ29yaWNhbCBpc2NhdGVnb3JpY2FsIGNhdGVnb3JpZXMgaXNjYXRlZ29yeSBpc29yZGluYWwgaXNwcm90ZWN0ZWQgYWRkY2F0cyBtZXJnZWNhdHMgcmVtb3ZlY2F0cyByZW5hbWVjYXRzIHJlb3JkZXJjYXRzIHN1bW1hcnkgY291bnRjYXRzIGlzdW5kZWZpbmVkIHRhYmxlIGFycmF5MnRhYmxlIGNlbGwydGFibGUgc3RydWN0MnRhYmxlIHRhYmxlMmFycmF5IHRhYmxlMmNlbGwgdGFibGUyc3RydWN0IHJlYWR0YWJsZSB3cml0ZXRhYmxlIGlzdGFibGUgaGVpZ2h0IHdpZHRoIHN1bW1hcnkgaW50ZXJzZWN0IGlzbWVtYmVyIHNldGRpZmYgc2V0eG9yIHVuaXF1ZSB1bmlvbiBqb2luIGlubmVyam9pbiBvdXRlcmpvaW4gc29ydHJvd3Mgc3RhY2sgdW5zdGFjayBpc21pc3Npbmcgc3RhbmRhcmRpemVtaXNzaW5nIHZhcmZ1biByb3dmdW4gc3RydWN0IGZpZWxkbmFtZXMgZ2V0ZmllbGQgaXNmaWVsZCBpc3N0cnVjdCBvcmRlcmZpZWxkcyBybWZpZWxkIHNldGZpZWxkIGFycmF5ZnVuIHN0cnVjdGZ1biB0YWJsZTJzdHJ1Y3Qgc3RydWN0MnRhYmxlIGNlbGwyc3RydWN0IHN0cnVjdDJjZWxsIGNlbGwgY2VsbDJtYXQgY2VsbDJzdHJ1Y3QgY2VsbDJ0YWJsZSBjZWxsZGlzcCBjZWxsZnVuIGNlbGxwbG90IGNlbGxzdHIgaXNjZWxsIGlzY2VsbHN0ciBtYXQyY2VsbCBudW0yY2VsbCBzdHJqb2luIHN0cnNwbGl0IHN0cnVjdDJjZWxsIHRhYmxlMmNlbGwgZnVuY3Rpb25faGFuZGxlIGZldmFsIGZ1bmMyc3RyIHN0cjJmdW5jIGxvY2FsZnVuY3Rpb25zIGZ1bmN0aW9ucyBhZGRldmVudCBkZWxldmVudCBnZXR0c2FmdGVyYXRldmVudCBnZXR0c2FmdGVyZXZlbnQgZ2V0dHNhdGV2ZW50IGdldHRzYmVmb3JlYXRldmVudCBnZXR0c2JlZm9yZWV2ZW50IGdldHRzYmV0d2VlbmV2ZW50cyBnZXR0c2NvbGxlY3Rpb24gaXNlbXB0eXRzY29sbGVjdGlvbiBsZW5ndGh0c2NvbGxlY3Rpb24gc2V0dHNjb2xsZWN0aW9uIHNpemV0c2NvbGxlY3Rpb24gdHNjb2xsZWN0aW9uIGFkZHNhbXBsZXRvY29sbGVjdGlvbiBhZGR0cyBkZWxzYW1wbGVmcm9tY29sbGVjdGlvbiBnZXRhYnN0aW1ldHNjb2xsZWN0aW9uIGdldHNhbXBsZXVzaW5ndGltZXRzY29sbGVjdGlvbiBnZXR0aW1lc2VyaWVzbmFtZXMgaG9yemNhdHRzY29sbGVjdGlvbiByZW1vdmV0cyByZXNhbXBsZXRzY29sbGVjdGlvbiBzZXRhYnN0aW1ldHNjb2xsZWN0aW9uIHNldHRpbWVzZXJpZXNuYW1lcyB2ZXJ0Y2F0dHNjb2xsZWN0aW9uIGlzIGlzYSBpc2NhdGVnb3JpY2FsIGlzY2VsbCBpc2NlbGxzdHIgaXNjaGFyIGlzZmllbGQgaXNmbG9hdCBpc2hnaGFuZGxlIGlzaW50ZWdlciBpc2phdmEgaXNsb2dpY2FsIGlzbnVtZXJpYyBpc29iamVjdCBpc3JlYWwgaXNzY2FsYXIgaXNzdHIgaXNzdHJ1Y3QgaXN0YWJsZSBpc3ZlY3RvciBjbGFzcyB2YWxpZGF0ZWF0dHJpYnV0ZXMgd2hvcyBjaGFyIGludDJzdHIgbWF0MnN0ciBudW0yc3RyIHN0cjJkb3VibGUgc3RyMm51bSBuYXRpdmUydW5pY29kZSB1bmljb2RlMm5hdGl2ZSBiYXNlMmRlYyBiaW4yZGVjIGRlYzJiYXNlIGRlYzJiaW4gZGVjMmhleCBoZXgyZGVjIGhleDJudW0gbnVtMmhleCB0YWJsZTJhcnJheSB0YWJsZTJjZWxsIHRhYmxlMnN0cnVjdCBhcnJheTJ0YWJsZSBjZWxsMnRhYmxlIHN0cnVjdDJ0YWJsZSBjZWxsMm1hdCBjZWxsMnN0cnVjdCBjZWxsc3RyIG1hdDJjZWxsIG51bTJjZWxsIHN0cnVjdDJjZWxsIGRhdGVudW0gZGF0ZXZlYyBkYXRlc3RyIG5vdyBjbG9jayBkYXRlIGNhbGVuZGFyIGVvbWRheSB3ZWVrZGF5IGFkZHRvZGF0ZSBldGltZSBwbHVzIHVwbHVzIG1pbnVzIHVtaW51cyB0aW1lcyByZGl2aWRlIGxkaXZpZGUgcG93ZXIgbXRpbWVzIG1yZGl2aWRlIG1sZGl2aWRlIG1wb3dlciBjdW1wcm9kIGN1bXN1bSBkaWZmIHByb2Qgc3VtIGNlaWwgZml4IGZsb29yIGlkaXZpZGUgbW9kIHJlbSByb3VuZCBzaW4gc2luZCBhc2luIGFzaW5kIHNpbmggYXNpbmggY29zIGNvc2QgYWNvcyBhY29zZCBjb3NoIGFjb3NoIHRhbiB0YW5kIGF0YW4gYXRhbmQgYXRhbjIgYXRhbjJkIHRhbmggYXRhbmggY3NjIGNzY2QgYWNzYyBhY3NjZCBjc2NoIGFjc2NoIHNlYyBzZWNkIGFzZWMgYXNlY2Qgc2VjaCBhc2VjaCBjb3QgY290ZCBhY290IGFjb3RkIGNvdGggYWNvdGggaHlwb3QgZXhwIGV4cG0xIGxvZyBsb2cxMCBsb2cxcCBsb2cyIG5leHRwb3cyIG50aHJvb3QgcG93MiByZWFsbG9nIHJlYWxwb3cgcmVhbHNxcnQgc3FydCBhYnMgYW5nbGUgY29tcGxleCBjb25qIGNwbHhwYWlyIGkgaW1hZyBpc3JlYWwgaiByZWFsIHNpZ24gdW53cmFwIGZhY3RvciBmYWN0b3JpYWwgZ2NkIGlzcHJpbWUgbGNtIG5jaG9vc2VrIHBlcm1zIHByaW1lcyByYXQgcmF0cyBwb2x5IHBvbHlkZXIgcG9seWVpZyBwb2x5Zml0IHBvbHlpbnQgcG9seXZhbCBwb2x5dmFsbSByZXNpZHVlIHJvb3RzIGFpcnkgYmVzc2VsaCBiZXNzZWxpIGJlc3NlbGogYmVzc2VsayBiZXNzZWx5IGJldGEgYmV0YWluYyBiZXRhaW5jaW52IGJldGFsbiBlbGxpcGogZWxsaXBrZSBlcmYgZXJmYyBlcmZjaW52IGVyZmN4IGVyZmludiBleHBpbnQgZ2FtbWEgZ2FtbWFpbmMgZ2FtbWFpbmNpbnYgZ2FtbWFsbiBsZWdlbmRyZSBwc2kgY2FydDJwb2wgY2FydDJzcGggcG9sMmNhcnQgc3BoMmNhcnQgZXBzIGZsaW50bWF4IGkgaiBpbmYgcGkgbmFuIGlzZmluaXRlIGlzaW5mIGlzbmFuIGNvbXBhbiBnYWxsZXJ5IGhhZGFtYXJkIGhhbmtlbCBoaWxiIGludmhpbGIgbWFnaWMgcGFzY2FsIHJvc3NlciB0b2VwbGl0eiB2YW5kZXIgd2lsa2luc29uIGNyb3NzIGRvdCBrcm9uIHN1cmZub3JtIHRyaWwgdHJpdSB0cmFuc3Bvc2UgY29uZCBjb25kZXN0IGZ1bm0gaW52IGxpbnNvbHZlIGxzY292IGxzcW5vbm5lZyBwaW52IHJjb25kIHN5bHZlc3RlciBtbGRpdmlkZSBtcmRpdmlkZSBjaG9sIGljaG9sIGNob2x1cGRhdGUgaWx1IGx1IHFyIHFyZGVsZXRlIHFyaW5zZXJ0IHFydXBkYXRlIHBsYW5lcm90IGxkbCBjZGYycmRmIHJzZjJjc2YgZ3N2ZCBzdmQgYmFsYW5jZSBjZGYycmRmIGNvbmRlaWcgZWlnIGVpZ3MgZ3N2ZCBoZXNzIG9yZGVpZyBvcmRxeiBvcmRzY2h1ciBwb2x5IHBvbHllaWcgcXogcnNmMmNzZiBzY2h1ciBzcXJ0bSBzczJ0ZiBzdmQgc3ZkcyBiYW5kd2lkdGggY29uZCBjb25kZWlnIGRldCBpc2JhbmRlZCBpc2RpYWcgaXNoZXJtaXRpYW4gaXNzeW1tZXRyaWMgaXN0cmlsIGlzdHJpdSBub3JtIG5vcm1lc3QgbnVsbCBvcnRoIHJhbmsgcmNvbmQgcnJlZiBzdWJzcGFjZSB0cmFjZSBleHBtIGxvZ20gc3FydG0gYnN4ZnVuIGFycmF5ZnVuIGFjY3VtYXJyYXkgbXBvd2VyIGNvcnJjb2VmIGNvdiBtYXggbWVhbiBtZWRpYW4gbWluIG1vZGUgc3RkIHZhciByYW5kIHJhbmRuIHJhbmRpIHJhbmRwZXJtIHJuZyBpbnRlcnAxIHBjaGlwIHNwbGluZSBwcHZhbCBta3BwIHVubWtwcCBwYWRlY29lZiBpbnRlcnBmdCBpbnRlcnAyIGludGVycDMgaW50ZXJwbiBuZGdyaWQgbWVzaGdyaWQgZ3JpZGRhdGEgZ3JpZGRhdGFuIGZtaW5ibmQgZm1pbnNlYXJjaCBmemVybyBsc3Fub25uZWcgb3B0aW1nZXQgb3B0aW1zZXQgb2RlNDUgb2RlMTVzIG9kZTIzIG9kZTExMyBvZGUyM3Qgb2RlMjN0YiBvZGUyM3Mgb2RlMTVpIGRlY2ljIG9kZXh0ZW5kIG9kZWdldCBvZGVzZXQgZGV2YWwgYnZwNGMgYnZwNWMgYnZwaW5pdCBidnB4dGVuZCBidnBnZXQgYnZwc2V0IGRldmFsIGRkZTIzIGRkZXNkIGRkZW5zZCBkZGVnZXQgZGRlc2V0IGRldmFsIHBkZXBlIHBkZXZhbCBpbnRlZ3JhbCBpbnRlZ3JhbDIgaW50ZWdyYWwzIHF1YWRnayBxdWFkMmQgY3VtdHJhcHogdHJhcHogcG9seWludCBkZWwyIGRpZmYgZ3JhZGllbnQgcG9seWRlciBhYnMgYW5nbGUgY3BseHBhaXIgZmZ0IGZmdDIgZmZ0biBmZnRzaGlmdCBmZnR3IGlmZnQgaWZmdDIgaWZmdG4gaWZmdHNoaWZ0IG5leHRwb3cyIHVud3JhcCBjb252IGNvbnYyIGNvbnZuIGRlY29udiBkZXRyZW5kIGZpbHRlciBmaWx0ZXIyIHNwZGlhZ3Mgc3BleWUgc3ByYW5kIHNwcmFuZG4gc3ByYW5kc3ltIHNwYXJzZSBzcGNvbnZlcnQgaXNzcGFyc2Ugbm56IG5vbnplcm9zIG56bWF4IHNwYWxsb2Mgc3BmdW4gc3BvbmVzIHNwcGFybXMgc3B5IGZpbmQgZnVsbCBhbWQgY29sYW1kIGNvbHBlcm0gZG1wZXJtIHJhbmRwZXJtIHN5bWFtZCBzeW1yY20gY29uZGVzdCBlaWdzIGljaG9sIGlsdSBub3JtZXN0IHNwYXVnbWVudCBzcHJhbmsgc3ZkcyBiaWNnIGJpY2dzdGFiIGJpY2dzdGFibCBjZ3MgZ21yZXMgbHNxciBtaW5yZXMgcGNnIHFtciBzeW1tbHEgdGZxbXIgZXRyZWUgZXRyZWVwbG90IGdwbG90IHN5bWJmYWN0IHRyZWVsYXlvdXQgdHJlZXBsb3QgdW5tZXNoIHRldHJhbWVzaCB0cmltZXNoIHRyaXBsb3QgdHJpc3VyZiBkZWxhdW5heSBkZWxhdW5heW4gdGV0cmFtZXNoIHRyaW1lc2ggdHJpcGxvdCB0cmlzdXJmIGRzZWFyY2huIHRzZWFyY2huIGRlbGF1bmF5IGRlbGF1bmF5biBjb252aHVsbCBjb252aHVsbG4gcGF0Y2ggdHJpc3VyZiBwYXRjaCB2b3Jvbm9pIHZvcm9ub2luIHBvbHlhcmVhIGlucG9seWdvbiByZWN0aW50IHBsb3QgcGxvdHl5IHBsb3QzIGxvZ2xvZyBzZW1pbG9neCBzZW1pbG9neSBlcnJvcmJhciBmcGxvdCBlenBsb3QgZXpwbG90MyBsaW5lc3BlYyBjb2xvcnNwZWMgYmFyIGJhcjMgYmFyaCBiYXIzaCBoaXN0IGhpc3RjIHJvc2UgcGFyZXRvIGFyZWEgcGllIHBpZTMgc3RlbSBzdGFpcnMgc3RlbTMgc2NhdHRlciBzY2F0dGVyMyBzcHkgcGxvdG1hdHJpeCBwb2xhciByb3NlIGNvbXBhc3MgZXpwb2xhciBsaW5lc3BlYyBjb2xvcnNwZWMgY29udG91ciBjb250b3VyZiBjb250b3VyYyBjb250b3VyMyBjb250b3Vyc2xpY2UgZXpjb250b3VyIGV6Y29udG91cmYgZmVhdGhlciBxdWl2ZXIgY29tcGFzcyBxdWl2ZXIzIHN0cmVhbXNsaWNlIHN0cmVhbWxpbmUgc3VyZiBzdXJmYyBzdXJmYWNlIHN1cmZsIHN1cmZub3JtIG1lc2ggbWVzaGMgbWVzaHogd2F0ZXJmYWxsIHJpYmJvbiBjb250b3VyMyBwZWFrcyBjeWxpbmRlciBlbGxpcHNvaWQgc3BoZXJlIHBjb2xvciBzdXJmMnBhdGNoIGV6c3VyZiBlenN1cmZjIGV6bWVzaCBlem1lc2hjIGNvbnRvdXJzbGljZSBmbG93IGlzb2NhcHMgaXNvY29sb3JzIGlzb25vcm1hbHMgaXNvc3VyZmFjZSByZWR1Y2VwYXRjaCByZWR1Y2V2b2x1bWUgc2hyaW5rZmFjZXMgc2xpY2Ugc21vb3RoMyBzdWJ2b2x1bWUgdm9sdW1lYm91bmRzIGNvbmVwbG90IGN1cmwgZGl2ZXJnZW5jZSBpbnRlcnBzdHJlYW1zcGVlZCBzdHJlYW0yIHN0cmVhbTMgc3RyZWFtbGluZSBzdHJlYW1wYXJ0aWNsZXMgc3RyZWFtcmliYm9uIHN0cmVhbXNsaWNlIHN0cmVhbXR1YmUgZmlsbCBmaWxsMyBwYXRjaCBzdXJmMnBhdGNoIG1vdmllIG5vYW5pbWF0ZSBkcmF3bm93IHJlZnJlc2hkYXRhIGZyYW1lMmltIGdldGZyYW1lIGltMmZyYW1lIGNvbWV0IGNvbWV0MyB0aXRsZSB4bGFiZWwgeWxhYmVsIHpsYWJlbCBjbGFiZWwgZGF0ZXRpY2sgdGV4bGFiZWwgbGVnZW5kIGNvbG9yYmFyIHhsaW0geWxpbSB6bGltIGJveCBncmlkIGRhc3BlY3QgcGJhc3BlY3QgYXhlcyBheGlzIHN1YnBsb3QgaG9sZCBnY2EgY2xhIGFubm90YXRpb24gdGV4dCBsZWdlbmQgdGl0bGUgeGxhYmVsIHlsYWJlbCB6bGFiZWwgZGF0YWN1cnNvcm1vZGUgZ2lucHV0IGd0ZXh0IGNvbG9ybWFwIGNvbG9ybWFwZWRpdG9yIGNvbG9yYmFyIGJyaWdodGVuIGNvbnRyYXN0IHNoYWRpbmcgZ3JheW1vbiBjYXhpcyBoc3YycmdiIHJnYjJoc3YgcmdicGxvdCBzcGlubWFwIGNvbG9yZGVmIHdoaXRlYmcgaGlkZGVuIHBhbiByZXNldCByb3RhdGUgcm90YXRlM2Qgc2VsZWN0bW92ZXJlc2l6ZSB6b29tIGRhdGFjdXJzb3Jtb2RlIGZpZ3VyZXBhbGV0dGUgcGxvdGJyb3dzZXIgcGxvdGVkaXQgcGxvdHRvb2xzIHByb3BlcnR5ZWRpdG9yIHNob3dwbG90dG9vbCBicnVzaCBkYXRhY3Vyc29ybW9kZSBsaW5rZGF0YSByZWZyZXNoZGF0YSB2aWV3IG1ha2VoZ3Rmb3JtIHZpZXdtdHggY2FtZXJhdG9vbGJhciBjYW1wYW4gY2Ftem9vbSBjYW1kb2xseSBjYW1sb29rYXQgY2Ftb3JiaXQgY2FtcG9zIGNhbXByb2ogY2Ftcm9sbCBjYW10YXJnZXQgY2FtdXAgY2FtdmEgY2FtbGlnaHQgbGlnaHQgbGlnaHRhbmdsZSBsaWdodGluZyBkaWZmdXNlIG1hdGVyaWFsIHNwZWN1bGFyIGFsaW0gYWxwaGEgYWxwaGFtYXAgaW1hZ2UgaW1hZ2VzYyBpbXJlYWQgaW13cml0ZSBpbWZpbmZvIGltZm9ybWF0cyBmcmFtZTJpbSBpbTJmcmFtZSBpbTJqYXZhIGluZDJyZ2IgcmdiMmluZCBpbWFwcHJveCBkaXRoZXIgY21wZXJtdXRlIGNtdW5pcXVlIHByaW50IHByaW50b3B0IHByaW50ZGxnIHByaW50cHJldmlldyBvcmllbnQgc2F2ZWZpZyBvcGVuZmlnIGhnZXhwb3J0IGhnc2F2ZSBoZ2xvYWQgc2F2ZWFzIGdjYSBnY2YgZ2NiZiBnY2JvIGdjbyBhbmNlc3RvciBhbGxjaGlsZCBmaW5kYWxsIGZpbmRmaWdzIGZpbmRvYmogZ29iamVjdHMgaXNoZ2hhbmRsZSBpc2hhbmRsZSBjb3B5b2JqIGRlbGV0ZSBnZXQgc2V0IHByb3BlZGl0IHJvb3RvYmplY3QgZmlndXJlIGF4ZXMgaW1hZ2UgbGlnaHQgbGluZSBwYXRjaCByZWN0YW5nbGUgc3VyZmFjZSB0ZXh0IGFubm90YXRpb24gc2V0IGdldCBoZ2dyb3VwIGhndHJhbnNmb3JtIG1ha2VoZ3Rmb3JtIGZpZ3VyZSBnY2YgY2xvc2UgY2xmIHJlZnJlc2ggbmV3cGxvdCBzaGcgY2xvc2VyZXEgZHJhZ3JlY3QgZHJhd25vdyByYmJveCBvcGVuZ2wgYXhlcyBob2xkIGlzaG9sZCBuZXdwbG90IGxpbmtheGVzIGxpbmtwcm9wIHJlZnJlc2hkYXRhIHdhaXRmb3IgZ2V0IHNldCBpZiBmb3IgcGFyZm9yIHN3aXRjaCB0cnkgd2hpbGUgYnJlYWsgY29udGludWUgZW5kIHBhdXNlIHJldHVybiBlZGl0IGlucHV0IHB1Ymxpc2ggbm90ZWJvb2sgZ3JhYmNvZGUgc25hcG5vdyBmdW5jdGlvbiBuYXJnaW4gbmFyZ291dCB2YXJhcmdpbiB2YXJhcmdvdXQgbmFyZ2luY2hrIG5hcmdvdXRjaGsgdmFsaWRhdGVhdHRyaWJ1dGVzIHZhbGlkYXRlc3RyaW5nIGlucHV0bmFtZSBwZXJzaXN0ZW50IGlzdmFybmFtZSBuYW1lbGVuZ3RobWF4IGFzc2lnbmluIGdsb2JhbCBpc2dsb2JhbCB0cnkgZXJyb3Igd2FybmluZyBsYXN0d2FybiBhc3NlcnQgb25jbGVhbnVwIGRiY2xlYXIgZGJjb250IGRiZG93biBkYnF1aXQgZGJzdGFjayBkYnN0YXR1cyBkYnN0ZXAgZGJzdG9wIGRidHlwZSBkYnVwIGNoZWNrY29kZSBrZXlib2FyZCBtbGludHJwdCBlZGl0IGVjaG8gZXZhbCBldmFsYyBldmFsaW4gZmV2YWwgcnVuIGJ1aWx0aW4gbWZpbGVuYW1lIHBjb2RlIGNsZWFyIGNsZWFydmFycyBkaXNwIG9wZW52YXIgd2hvIHdob3MgbG9hZCBzYXZlIG1hdGZpbGUgaW1wb3J0ZGF0YSB1aWltcG9ydCBjc3ZyZWFkIGNzdndyaXRlIGRsbXJlYWQgZGxtd3JpdGUgdGV4dHNjYW4gcmVhZHRhYmxlIHdyaXRldGFibGUgdHlwZSB4bHNmaW5mbyB4bHNyZWFkIHhsc3dyaXRlIHJlYWR0YWJsZSB3cml0ZXRhYmxlIGZjbG9zZSBmZW9mIGZlcnJvciBmZ2V0bCBmZ2V0cyBmaWxlcmVhZCBmb3BlbiBmcHJpbnRmIGZyZWFkIGZyZXdpbmQgZnNjYW5mIGZzZWVrIGZ0ZWxsIGZ3cml0ZSBpbTJqYXZhIGltZmluZm8gaW1yZWFkIGltd3JpdGUgbmNjcmVhdGUgbmNkaXNwIG5jaW5mbyBuY3JlYWQgbmNyZWFkYXR0IG5jd3JpdGUgbmN3cml0ZWF0dCBuY3dyaXRlc2NoZW1hIG5ldGNkZiBoNWNyZWF0ZSBoNWRpc3AgaDVpbmZvIGg1cmVhZCBoNXJlYWRhdHQgaDV3cml0ZSBoNXdyaXRlYXR0IGhkZmluZm8gaGRmcmVhZCBpbXJlYWQgaW13cml0ZSBoZGZhbiBoZGZoeCBoZGZoIGhkZmhkIGhkZmhlIGhkZm1sIGhkZnB0IGhkZnYgaGRmdmYgaGRmdmggaGRmdnMgaGRmZGYyNCBoZGZkZnI4IGZpdHNkaXNwIGZpdHNpbmZvIGZpdHNyZWFkIGZpdHN3cml0ZSBtdWx0aWJhbmRyZWFkIG11bHRpYmFuZHdyaXRlIGNkZmVwb2NoIGNkZmluZm8gY2RmcmVhZCBjZGZ3cml0ZSB0b2RhdGVudW0gY2RmbGliIGF1ZGlvaW5mbyBhdWRpb3JlYWQgYXVkaW93cml0ZSBtbWZpbGVpbmZvIG1vdmllMmF2aSBhdWRpb2RldmluZm8gYXVkaW9wbGF5ZXIgYXVkaW9yZWNvcmRlciBzb3VuZCBzb3VuZHNjIGJlZXAgbGluMm11IG11MmxpbiB4bWxyZWFkIHhtbHdyaXRlIHhzbHQgbWVtbWFwZmlsZSBkaXIgbHMgcHdkIGZpbGVhdHRyaWIgZXhpc3QgaXNkaXIgdHlwZSB2aXNkaWZmIHdoYXQgd2hpY2ggY2QgY29weWZpbGUgZGVsZXRlIHJlY3ljbGUgbWtkaXIgbW92ZWZpbGUgcm1kaXIgb3BlbiB3aW5vcGVuIGZpbGVwYXJ0cyBmdWxsZmlsZSBmaWxlbWFya2VyIGZpbGVzZXAgdGVtcGRpciB0ZW1wbmFtZSBtYXRsYWJyb290IHRvb2xib3hkaXIgemlwIHVuemlwIGd6aXAgZ3VuemlwIHRhciB1bnRhciBhZGRwYXRoIHJtcGF0aCBwYXRoIHNhdmVwYXRoIHVzZXJwYXRoIGdlbnBhdGggcGF0aHNlcCBwYXRodG9vbCByZXN0b3JlZGVmYXVsdHBhdGggY2xpcGJvYXJkIGNvbXB1dGVyIGRvcyBnZXRlbnYgcGVybCBzZXRlbnYgc3lzdGVtIHVuaXggd2lucXVlcnlyZWcgc2VuZG1haWwgdXJscmVhZCB1cmx3cml0ZSB3ZWIgaW5zdHJjYWxsYmFjayBpbnN0cmZpbmQgaW5zdHJmaW5kYWxsIHJlYWRhc3luYyByZWNvcmQgc2VyaWFsIHNlcmlhbGJyZWFrIHN0b3Bhc3luYyBzdXBwb3J0cGFja2FnZWluc3RhbGxlciByYXNwaV9leGFtcGxlcyB0YXJnZXR1cGRhdGVyIHJhc3BpIHJhc3BpIHdyaXRlbGVkIHNob3dsZWRzIHJhc3BpIGNvbmZpZ3VyZWRpZ2l0YWxwaW4gcmVhZGRpZ2l0YWxwaW4gd3JpdGVkaWdpdGFscGluIHNob3dwaW5zIHJhc3BpIHJhc3BpIHNjYW5pMmNidXMgaTJjZGV2IHJlYWRyZWdpc3RlciB3cml0ZXJlZ2lzdGVyIGVuYWJsZWkyYyBkaXNhYmxlaTJjIHJhc3BpIHNwaWRldiB3cml0ZXJlYWQgZW5hYmxlc3BpIGRpc2FibGVzcGkgcmFzcGkgY2FtZXJhYm9hcmQgcmFzcGkgb3BlbnNoZWxsIGdldGZpbGUgcHV0ZmlsZSBkZWxldGVmaWxlIHdlYmNhbWxpc3Qgd2ViY2FtIHByZXZpZXcgc25hcHNob3QgY2xvc2VwcmV2aWV3IGd1aWRlIGluc3BlY3QgZmlndXJlIGF4ZXMgdWljb250cm9sIHVpdGFibGUgdWlwYW5lbCB1aWJ1dHRvbmdyb3VwIGFjdHhjb250cm9sIHVpbWVudSB1aWNvbnRleHRtZW51IHVpdG9vbGJhciB1aXB1c2h0b29sIHVpdG9nZ2xldG9vbCBkaWFsb2cgZXJyb3JkbGcgaGVscGRsZyBtc2dib3ggcXVlc3RkbGcgdWlnZXRwcmVmIHVpc2V0cHJlZiB3YWl0YmFyIHdhcm5kbGcgZXhwb3J0MndzZGxnIGlucHV0ZGxnIGxpc3RkbGcgdWlzZXRjb2xvciB1aXNldGZvbnQgcHJpbnRkbGcgcHJpbnRwcmV2aWV3IHVpZ2V0ZGlyIHVpZ2V0ZmlsZSB1aW9wZW4gdWlwdXRmaWxlIHVpc2F2ZSBtZW51IGFsaWduIG1vdmVndWkgZ2V0cGl4ZWxwb3NpdGlvbiBzZXRwaXhlbHBvc2l0aW9uIGxpc3Rmb250cyB0ZXh0d3JhcCB1aXN0YWNrIHVpd2FpdCB1aXJlc3VtZSB3YWl0Zm9yIHdhaXRmb3JidXR0b25wcmVzcyBnZXRhcHBkYXRhIHNldGFwcGRhdGEgaXNhcHBkYXRhIHJtYXBwZGF0YSBndWlkYXRhIGd1aWhhbmRsZXMgY2xhc3NkZWYgY2xhc3MgaXNhIGlzZXF1YWwgaXNvYmplY3QgZW51bWVyYXRpb24gZXZlbnRzIG1ldGhvZHMgcHJvcGVydGllcyBjbGFzc2RlZiBpbXBvcnQgcHJvcGVydGllcyBpc3Byb3AgZHluYW1pY3Byb3BzIG1ldGhvZHMgaXNtZXRob2QgaGFuZGxlIGhnc2V0Z2V0IGR5bmFtaWNwcm9wcyBpc2EgZXZlbnRzIGVtcHR5IHN1cGVyY2xhc3NlcyBlbnVtZXJhdGlvbiBzYXZlIGxvYWQgc2F2ZW9iaiBsb2Fkb2JqIGNhdCBob3J6Y2F0IHZlcnRjYXQgZW1wdHkgZGlzcCBkaXNwbGF5IG51bWVsIHNpemUgZW5kIHN1YnNyZWYgc3Vic2FzZ24gc3Vic2luZGV4IHN1YnN0cnVjdCBkaXNwIGRpc3BsYXkgZGV0YWlscyBtZXRhY2xhc3MgbWV4ZXh0IGlubWVtIGxvYWRsaWJyYXJ5IHVubG9hZGxpYnJhcnkgbGliaXNsb2FkZWQgY2FsbGxpYiBsaWJmdW5jdGlvbnMgbGliZnVuY3Rpb25zdmlldyBsaWJzdHJ1Y3QgbGlicG9pbnRlciBqYXZhYXJyYXkgamF2YWNsYXNzcGF0aCBqYXZhYWRkcGF0aCBqYXZhcm1wYXRoIGphdmFjaGsgaXNqYXZhIHVzZWphdmEgamF2YW1ldGhvZCBqYXZhbWV0aG9kZWR0IGphdmFvYmplY3QgamF2YW9iamVjdGVkdCBjZWxsIGNsYXNzIGNsZWFyIGRlcGZ1biBleGlzdCBmaWVsZG5hbWVzIGltMmphdmEgaW1wb3J0IGlubWVtIGluc3BlY3QgaXNhIG1ldGhvZHMgbWV0aG9kc3ZpZXcgd2hpY2ggbmV0IGVuYWJsZW5ldGZyb21uZXR3b3JrZHJpdmUgY2VsbCBiZWdpbmludm9rZSBlbmRpbnZva2UgY29tYmluZSByZW1vdmUgcmVtb3ZlYWxsIGJpdGFuZCBiaXRvciBiaXR4b3IgYml0bm90IGFjdHhzZXJ2ZXIgYWN0eGNvbnRyb2wgYWN0eGNvbnRyb2xsaXN0IGFjdHhjb250cm9sc2VsZWN0IGlzY29tIGFkZHByb3BlcnR5IGRlbGV0ZXByb3BlcnR5IGluc3BlY3QgZmllbGRuYW1lcyBtZXRob2RzIG1ldGhvZHN2aWV3IGludm9rZSBpc2V2ZW50IGV2ZW50bGlzdGVuZXJzIHJlZ2lzdGVyZXZlbnQgdW5yZWdpc3RlcmFsbGV2ZW50cyB1bnJlZ2lzdGVyZXZlbnQgaXNpbnRlcmZhY2UgaW50ZXJmYWNlcyByZWxlYXNlIG1vdmUgY2FsbHNvYXBzZXJ2aWNlIGNyZWF0ZWNsYXNzZnJvbXdzZGwgY3JlYXRlc29hcG1lc3NhZ2UgcGFyc2Vzb2FwcmVzcG9uc2UgdHJ5IGFkZGNhdXNlbWV4Y2VwdGlvbiBnZXRyZXBvcnRtZXhjZXB0aW9uIGxhc3RtZXhjZXB0aW9uIHJldGhyb3dtZXhjZXB0aW9uIHRocm93bWV4Y2VwdGlvbiB0aHJvd2FzY2FsbGVybWV4Y2VwdGlvbiBtZXhjZXB0aW9uIGZ1bmN0aW9udGVzdHMgcnVudGVzdHMgYmVuY2ggY3B1dGltZSBtZW1vcnkgcHJvZmlsZSBwcm9mc2F2ZSB0aWMgdGltZWl0IHRvYyBjbGVhciBpbm1lbSBtZW1vcnkgcGFjayB3aG9zIGNvbW1hbmRoaXN0b3J5IGNvbW1hbmR3aW5kb3cgZmlsZWJyb3dzZXIgd29ya3NwYWNlIGdldHByZWYgc2V0cHJlZiBhZGRwcmVmIHJtcHJlZiBpc3ByZWYgYnVpbGRkb2NzZWFyY2hkYiBtZXggZXhlY3V0ZSBnZXRjaGFyYXJyYXkgcHV0Y2hhcmFycmF5IGdldGZ1bGxtYXRyaXggcHV0ZnVsbG1hdHJpeCBnZXR2YXJpYWJsZSBnZXR3b3Jrc3BhY2VkYXRhIHB1dHdvcmtzcGFjZWRhdGEgbWF4aW1pemVjb21tYW5kd2luZG93IG1pbmltaXplY29tbWFuZHdpbmRvdyBhY3R4Z2V0cnVubmluZ3NlcnZlciBlbmFibGVzZXJ2aWNlIG1leCBkYm1leCBtZXhleHQgaW5tZW0gdmVyIGNvbXB1dGVyIG1leGV4dCBkYm1leCBpbm1lbSBtZXggbWV4ZXh0IGNoZWNraW4gY2hlY2tvdXQgY21vcHRzIGN1c3RvbXZlcmN0cmwgdW5kb2NoZWNrb3V0IHZlcmN0cmwgbWF0bGFid2luZG93cyBtYXRsYWJ1bml4IGV4aXQgcXVpdCBtYXRsYWJyYyBzdGFydHVwIGZpbmlzaCBwcmVmZGlyIHByZWZlcmVuY2VzIGlzbWFjIGlzcGMgaXNzdHVkZW50IGlzdW5peCBqYXZhY2hrIGxpY2Vuc2UgdXNlamF2YSB2ZXIgdmVybGVzc3RoYW4gdmVyc2lvbiBkb2MgaGVscCBkb2NzZWFyY2ggbG9va2ZvciBkZW1vIGVjaG9kZW1vKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9tb29uc2NyaXB0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbW9vbnNjcmlwdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDU3NDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbW9vbnNjcmlwdC5yYgpAQCAtMCwwICsxLDExMCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGxvYWRfbGV4ZXIgJ2x1YS5yYicKKworICAgIGNsYXNzIE1vb25zY3JpcHQgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiTW9vblNjcmlwdCIKKyAgICAgIGRlc2MgIk1vb25zY3JpcHQgKGh0dHA6Ly93d3cubW9vbnNjcmlwdC5vcmcpIgorICAgICAgdGFnICdtb29uc2NyaXB0JworICAgICAgYWxpYXNlcyAnbW9vbicKKyAgICAgIGZpbGVuYW1lcyAnKi5tb29uJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtbW9vbnNjcmlwdCcsICdhcHBsaWNhdGlvbi94LW1vb25zY3JpcHQnCisKKyAgICAgIGRlZiBpbml0aWFsaXplKG9wdHM9e30pCisgICAgICAgIEBmdW5jdGlvbl9oaWdobGlnaHRpbmcgPSBvcHRzLmRlbGV0ZSg6ZnVuY3Rpb25faGlnaGxpZ2h0aW5nKSB7IHRydWUgfQorICAgICAgICBAZGlzYWJsZWRfbW9kdWxlcyA9IG9wdHMuZGVsZXRlKDpkaXNhYmxlZF9tb2R1bGVzKSB7IFtdIH0KKyAgICAgICAgc3VwZXIob3B0cykKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAnbW9vbicKKyAgICAgIGVuZAorCisgICAgICBkZWYgYnVpbHRpbnMKKyAgICAgICAgcmV0dXJuIFtdIHVubGVzcyBAZnVuY3Rpb25faGlnaGxpZ2h0aW5nCisKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSBTZXQubmV3LnRhcCBkbyB8YnVpbHRpbnN8CisgICAgICAgICAgUm91Z2U6OkxleGVyczo6THVhLmJ1aWx0aW5zLmVhY2ggZG8gfG1vZCwgZm5zfAorICAgICAgICAgICAgbmV4dCBpZiBAZGlzYWJsZWRfbW9kdWxlcy5pbmNsdWRlPyBtb2QKKyAgICAgICAgICAgIGJ1aWx0aW5zLm1lcmdlKGZucykKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAlcigjISguKj8pJCksIENvbW1lbnQ6OlByZXByb2MgIyBzaGViYW5nCisgICAgICAgIHJ1bGUgLy8sIFRleHQsIDptYWluCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmJhc2UgZG8KKyAgICAgICAgaWRlbnQgPSAnKD86W1x3X11bXHdcZF9dKiknCisKKyAgICAgICAgcnVsZSAlcigoP2kpKFxkKlwuXGQrfFxkK1wuXGQqKShlWystXT9cZCspPycpLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgJXIoKD9pKVxkK2VbKy1dP1xkKyksIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAlcigoP2kpMHhbMC05YS1mXSopLCBOdW06OkhleAorICAgICAgICBydWxlICVyKFxkKyksIE51bTo6SW50ZWdlcgorICAgICAgICBydWxlICVyKEAje2lkZW50fSopLCBOYW1lOjpWYXJpYWJsZTo6SW5zdGFuY2UKKyAgICAgICAgcnVsZSAlcihbQS1aXVtcd1xkX10qKSwgTmFtZTo6Q2xhc3MKKyAgICAgICAgcnVsZSAlcigiP1teIl0rIjopLCBMaXRlcmFsOjpTdHJpbmc6OlN5bWJvbAorICAgICAgICBydWxlICVyKCN7aWRlbnR9OiksIExpdGVyYWw6OlN0cmluZzo6U3ltYm9sCisgICAgICAgIHJ1bGUgJXIoOiN7aWRlbnR9KSwgTGl0ZXJhbDo6U3RyaW5nOjpTeW1ib2wKKworICAgICAgICBydWxlICVyKFxzKyksIFRleHQ6OldoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAlcigoPT18fj18IT18PD18Pj18XC5cLlwufFwuXC58LT58PT58Wz0rXC0qLyVePD4jIVxcXSkpLCBPcGVyYXRvcgorICAgICAgICBydWxlICVyKFtcW1xdXHtcfVwoXClcLiw6O10pLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlICVyKChhbmR8b3J8bm90KVxiKSwgT3BlcmF0b3I6OldvcmQKKworICAgICAgICBrZXl3b3JkcyA9ICV3eworICAgICAgICAgIGJyZWFrIGNsYXNzIGNvbnRpbnVlIGRvIGVsc2UgZWxzZWlmIGVuZCBleHRlbmRzIGZvciBpZiBpbXBvcnQgaW4KKyAgICAgICAgICByZXBlYXQgcmV0dXJuIHN3aXRjaCBzdXBlciB0aGVuIHVubGVzcyB1bnRpbCB1c2luZyB3aGVuIHdpdGggd2hpbGUKKyAgICAgICAgfQorICAgICAgICBydWxlICVyKCgje2tleXdvcmRzLmpvaW4oJ3wnKX0pXGIpLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgJXIoKGxvY2FsfGV4cG9ydClcYiksIEtleXdvcmQ6OkRlY2xhcmF0aW9uCisgICAgICAgIHJ1bGUgJXIoKHRydWV8ZmFsc2V8bmlsKVxiKSwgS2V5d29yZDo6Q29uc3RhbnQKKworICAgICAgICBydWxlICVyKFtBLVphLXpfXVtBLVphLXowLTlfXSooXC5bQS1aYS16X11bQS1aYS16MC05X10qKT8pIGRvIHxtfAorICAgICAgICAgIG5hbWUgPSBtWzBdCisgICAgICAgICAgaWYgc2VsZi5idWlsdGlucy5pbmNsdWRlPyhuYW1lKQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbgorICAgICAgICAgIGVsc2lmIG5hbWUgPX4gL1wuLworICAgICAgICAgICAgYSwgYiA9IG5hbWUuc3BsaXQoJy4nLCAyKQorICAgICAgICAgICAgdG9rZW4gTmFtZSwgYQorICAgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24sICcuJworICAgICAgICAgICAgdG9rZW4gTmFtZSwgYgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm1haW4gZG8KKyAgICAgICAgcnVsZSAlcigtLS4qJCksIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBydWxlICVyKFxbKD0qKVxbLio/XF1cMVxdKW0sIFN0cjo6SGVyZWRvYworCisgICAgICAgIG1peGluIDpiYXNlCisKKyAgICAgICAgcnVsZSAlcignKSwgU3RyOjpTaW5nbGUsIDpzcXMKKyAgICAgICAgcnVsZSAlcigiKSwgU3RyOjpEb3VibGUsIDpkcXMKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3FzIGRvCisgICAgICAgIHJ1bGUgJXIoJyksIFN0cjo6U2luZ2xlLCA6cG9wIQorICAgICAgICBydWxlICVyKFteJ10rKSwgU3RyOjpTaW5nbGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW50ZXJwb2xhdGlvbiBkbworICAgICAgICBydWxlICVyKFx9KSwgU3RyOjpJbnRlcnBvbCwgOnBvcCEKKyAgICAgICAgbWl4aW4gOmJhc2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZHFzIGRvCisgICAgICAgIHJ1bGUgJXIoI1x7KSwgU3RyOjpJbnRlcnBvbCwgOmludGVycG9sYXRpb24KKyAgICAgICAgcnVsZSAlcigiKSwgU3RyOjpEb3VibGUsIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoI1tee10pLCBTdHI6OkRvdWJsZQorICAgICAgICBydWxlICVyKFteIiNdKyksIFN0cjo6RG91YmxlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL25hc20ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9uYXNtLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YWFmYmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9uYXNtLnJiCkBAIC0wLDAgKzEsMjAzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgTmFzbSA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRhZyAnbmFzbScKKyAgICAgIGZpbGVuYW1lcyAnKi5hc20nCisgICAgICAjbWltZXR5cGVzICd0ZXh0L3gtY2hkcicsICd0ZXh0L3gtY3NyYycKKworICAgICAgdGl0bGUgIk5hc20iCisgICAgICBkZXNjICJOZXR3aWRlIEFzc2VtYmxlciIKKworICAgICAgd3MgPSAlcigoPzpcc3w7Lio/XG4vKSspCisgICAgICBpZCA9IC9bYS16QS1aX11bYS16QS1aMC05X10qLworCisgICAgICAjdG9kbzogcHVsbCBtb3JlIGluc3RydWN0aW9ucyBmcm9tOiBodHRwOi8vd3d3Lm5hc20udXMvZG9jL25hc21kb2NiLmh0bWwKKyAgICAgICNzbyBmYXIsIHdlIGhhdmUgc2VjdGlvbnMgMS4xIGFuZCAxLjIKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgICBhYWEgYWFkIGFhbSBhYXMgYWRjIGFkZCBhbmQgYXJwbCBiYjBfcmVzZXQgYmIxX3Jlc2V0IGJvdW5kIGJzZiBic3IgYnN3YXAgYnQgYnRjIGJ0ciBidHMKKyAgICAgICAgICAgY2FsbCBjYncgY2RxIGNkcWUgY2xjIGNsZCBjbGkgY2x0cyBjbWMgY21wIGNtcHNiIGNtcHNkIGNtcHNxIGNtcHN3IGNtcHhjaGcKKyAgICAgICAgICAgY21weGNoZzE2YiBjbXB4Y2hnNDg2IGNtcHhjaGc4YiBjcHVpZCBjcHVfcmVhZCBjcHVfd3JpdGUgY3FvIGN3ZCBjd2RlIGRhYSBkYXMgZGVjIGRpdgorICAgICAgICAgICBkbWludCBlbW1zIGVudGVyIGVxdSBmMnhtMSBmYWJzIGZhZGQgZmFkZHAgZmJsZCBmYnN0cCBmY2hzIGZjbGV4IGZjbW92YiBmY21vdmJlIGZjbW92ZQorICAgICAgICAgICBmY21vdm5iIGZjbW92bmJlIGZjbW92bmUgZmNtb3ZudSBmY21vdnUgZmNvbSBmY29taSBmY29taXAgZmNvbXAgZmNvbXBwIGZjb3MgZmRlY3N0cAorICAgICAgICAgICBmZGlzaSBmZGl2IGZkaXZwIGZkaXZyIGZkaXZycCBmZW1tcyBmZW5pIGZmcmVlIGZmcmVlcCBmaWFkZCBmaWNvbSBmaWNvbXAgZmlkaXYgZmlkaXZyCisgICAgICAgICAgIGZpbGQgZmltdWwgZmluY3N0cCBmaW5pdCBmaXN0IGZpc3RwIGZpc3R0cCBmaXN1YiBmaXN1YnIgZmxkIGZsZDEgZmxkY3cgZmxkZW52IGZsZGwyZQorICAgICAgICAgICBmbGRsMnQgZmxkbGcyIGZsZGxuMiBmbGRwaSBmbGR6IGZtdWwgZm11bHAgZm5jbGV4IGZuZGlzaSBmbmVuaSBmbmluaXQgZm5vcCBmbnNhdmUgZm5zdGN3CisgICAgICAgICAgIGZuc3RlbnYgZm5zdHN3IGZwYXRhbiBmcHJlbSBmcHJlbTEgZnB0YW4gZnJuZGludCBmcnN0b3IgZnNhdmUgZnNjYWxlIGZzZXRwbSBmc2luIGZzaW5jb3MKKyAgICAgICAgICAgZnNxcnQgZnN0IGZzdGN3IGZzdGVudiBmc3RwIGZzdHN3IGZzdWIgZnN1YnAgZnN1YnIgZnN1YnJwIGZ0c3QgZnVjb20gZnVjb21pIGZ1Y29taXAKKyAgICAgICAgICAgZnVjb21wIGZ1Y29tcHAgZndhaXQgZnhhbSBmeGNoIGZ4dHJhY3QgZnlsMnggZnlsMnhwMSBobHQgaWJ0cyBpY2VicCBpZGl2IGltdWwgaW4gaW5jCisgICAgICAgICAgIGluY2JpbiBpbnNiIGluc2QgaW5zdyBpbnQgaW50MDEgaW50MDMgaW50MSBpbnQzIGludG8gaW52ZCBpbnZscGcgaW52bHBnYSBpbnZwY2lkIGlyZXQKKyAgICAgICAgICAgaXJldGQgaXJldHEgaXJldHcgamN4eiBqZWN4eiBqbXAgam1wZSBqcmN4eiBsYWhmIGxhciBsZHMgbGVhIGxlYXZlIGxlcyBsZmVuY2UgbGZzCisgICAgICAgICAgIGxnZHQgbGdzIGxpZHQgbGxkdCBsbXN3IGxvYWRhbGwgbG9hZGFsbDI4NiBsb2RzYiBsb2RzZCBsb2RzcSBsb2RzdyBsb29wIGxvb3BlIGxvb3BuZQorICAgICAgICAgICBsb29wbnogbG9vcHogbHNsIGxzcyBsdHIgbWZlbmNlIG1vbml0b3IgbW9uaXRvcnggbW92IG1vdmQgbW92cSBtb3ZzYiBtb3ZzZCBtb3ZzcSBtb3ZzdworICAgICAgICAgICBtb3ZzeCBtb3ZzeGQgbW92enggbXVsIG13YWl0IG13YWl0eCBuZWcgbm9wIG5vdCBvciBvdXQgb3V0c2Igb3V0c2Qgb3V0c3cgcGFja3NzZHcKKyAgICAgICAgICAgcGFja3Nzd2IgcGFja3Vzd2IgcGFkZGIgcGFkZGQgcGFkZHNiIHBhZGRzaXcgcGFkZHN3IHBhZGR1c2IgcGFkZHVzdyBwYWRkdyBwYW5kIHBhbmRuCisgICAgICAgICAgIHBhdXNlIHBhdmViIHBhdmd1c2IgcGNtcGVxYiBwY21wZXFkIHBjbXBlcXcgcGNtcGd0YiBwY21wZ3RkIHBjbXBndHcgcGRpc3RpYiBwZjJpZCBwZmFjYworICAgICAgICAgICBwZmFkZCBwZmNtcGVxIHBmY21wZ2UgcGZjbXBndCBwZm1heCBwZm1pbiBwZm11bCBwZnJjcCBwZnJjcGl0MSBwZnJjcGl0MiBwZnJzcWl0MSBwZnJzcXJ0CisgICAgICAgICAgIHBmc3ViIHBmc3ViciBwaTJmZCBwbWFjaHJpdyBwbWFkZHdkIHBtYWd3IHBtdWxocml3IHBtdWxocndhIHBtdWxocndjIHBtdWxodyBwbXVsbHcKKyAgICAgICAgICAgcG12Z2V6YiBwbXZsemIgcG12bnpiIHBtdnpiIHBvcCBwb3BhIHBvcGFkIHBvcGF3IHBvcGYgcG9wZmQgcG9wZnEgcG9wZncgcG9yIHByZWZldGNoCisgICAgICAgICAgIHByZWZldGNodyBwc2xsZCBwc2xscSBwc2xsdyBwc3JhZCBwc3JhdyBwc3JsZCBwc3JscSBwc3JsdyBwc3ViYiBwc3ViZCBwc3Vic2IgcHN1YnNpdworICAgICAgICAgICBwc3Vic3cgcHN1YnVzYiBwc3VidXN3IHBzdWJ3IHB1bnBja2hidyBwdW5wY2toZHEgcHVucGNraHdkIHB1bnBja2xidyBwdW5wY2tsZHEgcHVucGNrbHdkCisgICAgICAgICAgIHB1c2ggcHVzaGEgcHVzaGFkIHB1c2hhdyBwdXNoZiBwdXNoZmQgcHVzaGZxIHB1c2hmdyBweG9yIHJjbCByY3IgcmRtIHJkbXNyIHJkcG1jIHJkc2hyCisgICAgICAgICAgIHJkdHNjIHJkdHNjcCByZXQgcmV0ZiByZXRuIHJvbCByb3IgcnNkYyByc2xkdCByc20gcnN0cyBzYWhmIHNhbCBzYWxjIHNhciBzYmIgc2Nhc2Igc2Nhc2QKKyAgICAgICAgICAgc2Nhc3Egc2Nhc3cgc2ZlbmNlIHNnZHQgc2hsIHNobGQgc2hyIHNocmQgc2lkdCBza2luaXQgc2xkdCBzbWkgc21pbnQgc21pbnRvbGQgc21zdworICAgICAgICAgICBzdGMgc3RkIHN0aSBzdG9zYiBzdG9zZCBzdG9zcSBzdG9zdyBzdHIgc3ViIHN2ZGMgc3ZsZHQgc3Z0cyBzd2FwZ3Mgc3lzY2FsbCBzeXNlbnRlcgorICAgICAgICAgICBzeXNleGl0IHN5c3JldCB0ZXN0IHVkMCB1ZDEgdWQyIHVkMmEgdWQyYiB1bW92IHZlcnIgdmVydyB3YmludmQgd3Jtc3Igd3JzaHIgeGFkZCB4YnRzCisgICAgICAgICAgIHhjaGcgeGxhdCB4bGF0YiB4b3IKKworICAgICAgICAgICBjbW92YSBjbW92YWUgY21vdmIgY21vdmJlIGNtb3ZjIGNtb3ZlIGNtb3ZnIGNtb3ZnZSBjbW92bCBjbW92bGUgY21vdm5hIGNtb3ZuYWUgY21vdm5iIGNtb3ZuYmUgY21vdm5jIGNtb3ZuZSBjbW92bmcgY21vdm5nZSBjbW92bmwgY21vdm5sZSBjbW92bm8gY21vdm5wIGNtb3ZucyBjbW92bnogY21vdm8gY21vdnAgY21vdnBlIGNtb3ZwbyBjbW92cyBjbW92egorCisgICAgICAgICAgIGphIGphZSBqYiBqYmUgamMgamN4eiBqZWN4eiBqZSBqZyBqZ2UgamwgamxlIGpuYSBqbmFlIGpuYiBqbmJlIGpuYyBqbmUgam5nIGpuZ2Ugam5sIGpubGUgam5vIGpucCBqbnMgam56IGpvIGpwIGpwZSBqcG8ganMganoKKworICAgICAgICAgICBzZXRhIHNldGFlIHNldGIgc2V0YmUgc2V0YyBzZXRlIHNldGcgc2V0Z2Ugc2V0bCBzZXRsZSBzZXRuYSBzZXRuYWUgc2V0bmIgc2V0bmJlIHNldG5jIHNldG5lIHNldG5nIHNldG5nZSBzZXRubCBzZXRubGUgc2V0bm8gc2V0bnAgc2V0bnMgc2V0bnogc2V0byBzZXRwIHNldHBlIHNldHBvIHNldHMgc2V0egorCisgICAgICAgICAgIEFBQSBBQUQgQUFNIEFBUyBBREMgQUREIEFORCBBUlBMIEJCMF9SRVNFVCBCQjFfUkVTRVQgQk9VTkQgQlNGIEJTUiBCU1dBUCBCVCBCVEMgQlRSIEJUUworICAgICAgICAgICBDQUxMIENCVyBDRFEgQ0RRRSBDTEMgQ0xEIENMSSBDTFRTIENNQyAgQ01QIENNUFNCIENNUFNEIENNUFNRIENNUFNXIENNUFhDSEcKKyAgICAgICAgICAgQ01QWENIRzE2QiBDTVBYQ0hHNDg2IENNUFhDSEc4QiBDUFVJRCBDUFVfUkVBRCBDUFVfV1JJVEUgQ1FPIENXRCBDV0RFIERBQSBEQVMgREVDIERJVgorICAgICAgICAgICBETUlOVCBFTU1TIEVOVEVSIEVRVSBGMlhNMSBGQUJTIEZBREQgRkFERFAgRkJMRCBGQlNUUCBGQ0hTIEZDTEVYIEZDTU9WQiBGQ01PVkJFIEZDTU9WRQorICAgICAgICAgICBGQ01PVk5CIEZDTU9WTkJFIEZDTU9WTkUgRkNNT1ZOVSBGQ01PVlUgRkNPTSBGQ09NSSBGQ09NSVAgRkNPTVAgRkNPTVBQIEZDT1MgRkRFQ1NUUAorICAgICAgICAgICBGRElTSSBGRElWIEZESVZQIEZESVZSIEZESVZSUCBGRU1NUyBGRU5JIEZGUkVFIEZGUkVFUCBGSUFERCBGSUNPTSBGSUNPTVAgRklESVYgRklESVZSCisgICAgICAgICAgIEZJTEQgRklNVUwgRklOQ1NUUCBGSU5JVCBGSVNUIEZJU1RQIEZJU1RUUCBGSVNVQiBGSVNVQlIgRkxEIEZMRDEgRkxEQ1cgRkxERU5WIEZMREwyRQorICAgICAgICAgICBGTERMMlQgRkxETEcyIEZMRExOMiBGTERQSSBGTERaIEZNVUwgRk1VTFAgRk5DTEVYIEZORElTSSBGTkVOSSBGTklOSVQgRk5PUCBGTlNBVkUgRk5TVENXCisgICAgICAgICAgIEZOU1RFTlYgRk5TVFNXIEZQQVRBTiBGUFJFTSBGUFJFTTEgRlBUQU4gRlJORElOVCBGUlNUT1IgRlNBVkUgRlNDQUxFIEZTRVRQTSBGU0lOIEZTSU5DT1MKKyAgICAgICAgICAgRlNRUlQgRlNUIEZTVENXIEZTVEVOViBGU1RQIEZTVFNXIEZTVUIgRlNVQlAgRlNVQlIgRlNVQlJQIEZUU1QgRlVDT00gRlVDT01JIEZVQ09NSVAKKyAgICAgICAgICAgRlVDT01QIEZVQ09NUFAgRldBSVQgRlhBTSBGWENIIEZYVFJBQ1QgRllMMlggRllMMlhQMSBITFQgSUJUUyBJQ0VCUCBJRElWIElNVUwgSU4gSU5DCisgICAgICAgICAgIElOQ0JJTiBJTlNCIElOU0QgSU5TVyBJTlQgSU5UMDEgSU5UMDMgSU5UMSBJTlQzIElOVE8gSU5WRCBJTlZMUEcgSU5WTFBHQSBJTlZQQ0lEIElSRVQKKyAgICAgICAgICAgSVJFVEQgSVJFVFEgSVJFVFcgSkNYWiBKRUNYWiBKTVAgSk1QRSBKUkNYWiBMQUhGIExBUiBMRFMgTEVBIExFQVZFIExFUyBMRkVOQ0UgTEZTCisgICAgICAgICAgIExHRFQgTEdTIExJRFQgTExEVCBMTVNXIExPQURBTEwgTE9BREFMTDI4NiBMT0RTQiBMT0RTRCBMT0RTUSBMT0RTVyBMT09QIExPT1BFIExPT1BORQorICAgICAgICAgICBMT09QTlogTE9PUFogTFNMIExTUyBMVFIgTUZFTkNFIE1PTklUT1IgTU9OSVRPUlggTU9WIE1PVkQgTU9WUSBNT1ZTQiBNT1ZTRCBNT1ZTUSBNT1ZTVworICAgICAgICAgICBNT1ZTWCBNT1ZTWEQgTU9WWlggTVVMIE1XQUlUIE1XQUlUWCBORUcgTk9QIE5PVCBPUiBPVVQgT1VUU0IgT1VUU0QgT1VUU1cgUEFDS1NTRFcKKyAgICAgICAgICAgUEFDS1NTV0IgUEFDS1VTV0IgUEFEREIgUEFEREQgUEFERFNCIFBBRERTSVcgUEFERFNXIFBBRERVU0IgUEFERFVTVyBQQUREVyBQQU5EIFBBTkROCisgICAgICAgICAgIFBBVVNFIFBBVkVCIFBBVkdVU0IgUENNUEVRQiBQQ01QRVFEIFBDTVBFUVcgUENNUEdUQiBQQ01QR1REIFBDTVBHVFcgUERJU1RJQiBQRjJJRCBQRkFDQworICAgICAgICAgICBQRkFERCBQRkNNUEVRIFBGQ01QR0UgUEZDTVBHVCBQRk1BWCBQRk1JTiBQRk1VTCBQRlJDUCBQRlJDUElUMSBQRlJDUElUMiBQRlJTUUlUMSBQRlJTUVJUCisgICAgICAgICAgIFBGU1VCIFBGU1VCUiBQSTJGRCBQTUFDSFJJVyBQTUFERFdEIFBNQUdXIFBNVUxIUklXIFBNVUxIUldBIFBNVUxIUldDIFBNVUxIVyBQTVVMTFcKKyAgICAgICAgICAgUE1WR0VaQiBQTVZMWkIgUE1WTlpCIFBNVlpCIFBPUCBQT1BBIFBPUEFEIFBPUEFXIFBPUEYgUE9QRkQgUE9QRlEgUE9QRlcgUE9SIFBSRUZFVENICisgICAgICAgICAgIFBSRUZFVENIVyBQU0xMRCBQU0xMUSBQU0xMVyBQU1JBRCBQU1JBVyBQU1JMRCBQU1JMUSBQU1JMVyBQU1VCQiBQU1VCRCBQU1VCU0IgUFNVQlNJVworICAgICAgICAgICBQU1VCU1cgUFNVQlVTQiBQU1VCVVNXIFBTVUJXIFBVTlBDS0hCVyBQVU5QQ0tIRFEgUFVOUENLSFdEIFBVTlBDS0xCVyBQVU5QQ0tMRFEgUFVOUENLTFdECisgICAgICAgICAgIFBVU0ggUFVTSEEgUFVTSEFEIFBVU0hBVyBQVVNIRiBQVVNIRkQgUFVTSEZRIFBVU0hGVyBQWE9SIFJDTCBSQ1IgUkRNIFJETVNSIFJEUE1DIFJEU0hSCisgICAgICAgICAgIFJEVFNDIFJEVFNDUCBSRVQgUkVURiBSRVROIFJPTCBST1IgUlNEQyBSU0xEVCBSU00gUlNUUyBTQUhGIFNBTCBTQUxDIFNBUiBTQkIgU0NBU0IgU0NBU0QKKyAgICAgICAgICAgU0NBU1EgU0NBU1cgIFNGRU5DRSBTR0RUIFNITCBTSExEIFNIUiBTSFJEIFNJRFQgU0tJTklUIFNMRFQgU01JIFNNSU5UIFNNSU5UT0xEIFNNU1cKKyAgICAgICAgICAgU1RDIFNURCBTVEkgU1RPU0IgU1RPU0QgU1RPU1EgU1RPU1cgU1RSIFNVQiBTVkRDIFNWTERUIFNWVFMgU1dBUEdTIFNZU0NBTEwgU1lTRU5URVIKKyAgICAgICAgICAgU1lTRVhJVCBTWVNSRVQgVEVTVCBVRDAgVUQxIFVEMiBVRDJBIFVEMkIgVU1PViBWRVJSIFZFUlcgV0JJTlZEIFdSTVNSIFdSU0hSIFhBREQgWEJUUworICAgICAgICAgICBYQ0hHIFhMQVQgWExBVEIgWE9SCisKKyAgICAgICAgICAgQ01PVkEgQ01PVkFFIENNT1ZCIENNT1ZCRSBDTU9WQyBDTU9WRSBDTU9WRyBDTU9WR0UgQ01PVkwgQ01PVkxFIENNT1ZOQSBDTU9WTkFFIENNT1ZOQiBDTU9WTkJFIENNT1ZOQyBDTU9WTkUgQ01PVk5HIENNT1ZOR0UgQ01PVk5MIENNT1ZOTEUgQ01PVk5PIENNT1ZOUCBDTU9WTlMgQ01PVk5aIENNT1ZPIENNT1ZQIENNT1ZQRSBDTU9WUE8gQ01PVlMgQ01PVloKKworICAgICAgICAgICBKQSBKQUUgSkIgSkJFIEpDIEpDWFogSkVDWFogSkUgSkcgSkdFIEpMIEpMRSBKTkEgSk5BRSBKTkIgSk5CRSBKTkMgSk5FIEpORyBKTkdFIEpOTCBKTkxFIEpOTyBKTlAgSk5TIEpOWiBKTyBKUCBKUEUgSlBPIEpTIEpaCisKKyAgICAgICAgICAgU0VUQSBTRVRBRSBTRVRCIFNFVEJFIFNFVEMgU0VURSBTRVRHIFNFVEdFIFNFVEwgU0VUTEUgU0VUTkEgU0VUTkFFIFNFVE5CIFNFVE5CRSBTRVROQyBTRVRORSBTRVRORyBTRVROR0UgU0VUTkwgU0VUTkxFIFNFVE5PIFNFVE5QIFNFVE5TIFNFVE5aIFNFVE8gU0VUUCBTRVRQRSBTRVRQTyBTRVRTIFNFVFoKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzX3R5cGUKKyAgICAgICAgQGtleXdvcmRzX3R5cGUgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgREIgRFcgREQgRFEgRFQgRE8gRFkgRFogUkVTQiBSRVNXIFJFU0QgUkVTUSBSRVNUIFJFU08gUkVTWSBSRVNaCisgICAgICAgICAgZGIgZHEgZGQgZHEgZHQgZG8gZHkgZHogcmVzYiByZXN3IHJlc2QgcmVzcSByZXN0IHJlc28gcmVzeSByZXN6CisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5yZXNlcnZlZAorICAgICAgICBAcmVzZXJ2ZWQgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgZ2xvYmFsIGV4dGVybiBtYWNybyBlbmRtYWNybyBhc3NpZ24gcmVwIGVuZHJlcCBzZWN0aW9uCisgICAgICAgICAgR0xPQkFMIEVYVEVSTiBNQUNSTyBFTkRNQUNSTyBBU1NJR04gUkVQIEVORFJFUCBTRUNUSU9OCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICAjIGhpZ2ggcHJpb3JpdHkgZm9yIGZpbGVuYW1lIG1hdGNoZXMKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCgqKQorICAgICAgICAwLjMKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5idWlsdGlucworICAgICAgICBAYnVpbHRpbnMgfHw9IFtdCisgICAgICBlbmQKKworICAgICAgc3RhcnQgeyBwdXNoIDpleHByX2JvbCB9CisKKyAgICAgIHN0YXRlIDpleHByX2JvbCBkbworICAgICAgICBtaXhpbiA6aW5saW5lX3doaXRlc3BhY2UKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW5saW5lX3doaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvWyBcdFxyXSsvLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOndoaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXG4rL20sIFRleHQsIDpleHByX2JvbAorICAgICAgICBydWxlICVyKC8vKFxcLnwuKSo/XG4pLCBDb21tZW50OjpTaW5nbGUsIDpleHByX2JvbAorICAgICAgICBtaXhpbiA6aW5saW5lX3doaXRlc3BhY2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXhwcl93aGl0ZXNwYWNlIGRvCisgICAgICAgIHJ1bGUgL1xuKy9tLCBUZXh0LCA6ZXhwcl9ib2wKKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6ZXhwcl93aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgKC8vKSB7IHB1c2ggOnN0YXRlbWVudCB9CisgICAgICAgIHJ1bGUgL14lW2EtekEtWjAtOV0rLywgQ29tbWVudDo6UHJlcHJvYywgOnN0YXRlbWVudAorCisgICAgICAgIHJ1bGUoCisgICAgICAgICAgJXIoJj18WypdPXwvPXxcXD18XF49fFwrPXwtPXw8PD18Pj49fDw8fD4+fDo9fDw9fD49fDw+fFstJiovXFxeKz08Pi5dKSwKKyAgICAgICAgICBPcGVyYXRvcgorICAgICAgICApCisgICAgICAgIHJ1bGUgLzsuKi8sIENvbW1lbnQsIDpzdGF0ZW1lbnQKKyAgICAgICAgcnVsZSAvXlthLXpBLVpdK1thLXpBLVowLTldKjovLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICBydWxlIC87LiovLCBDb21tZW50CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0YXRlbWVudCBkbworICAgICAgICBtaXhpbiA6ZXhwcl93aGl0ZXNwYWNlCisgICAgICAgIG1peGluIDpzdGF0ZW1lbnRzCisgICAgICAgIHJ1bGUgLzsuKi8sIENvbW1lbnQKKyAgICAgICAgcnVsZSAvXiVbYS16QS1aMC05XSsvLCBDb21tZW50OjpQcmVwcm9jCisgICAgICAgIHJ1bGUgL1thLXpBLVpdKyVbMC05XSs6LywgTmFtZTo6RnVuY3Rpb24KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RhdGVtZW50cyBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgICBydWxlIC9MPyIvLCBTdHIsIDpzdHJpbmcKKyAgICAgICAgcnVsZSAvW2EtekEtWl0rJVswLTldKzovLCBOYW1lOjpGdW5jdGlvbiAgI2xhYmVscy9zdWJyb3V0aW5lcy9mdW5jdGlvbnMKKyAgICAgICAgcnVsZSAlcihMPycoXFwufFxcWzAtN117MSwzfXxcXHhbYS1mMC05XXsxLDJ9fFteXFwnXG5dKScpaSwgU3RyOjpDaGFyCisgICAgICAgIHJ1bGUgLzB4WzAtOWEtZl0rW2x1XSovaSwgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvXGQrW2x1XSovaSwgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgJXIoXCovKSwgRXJyb3IKKyAgICAgICAgcnVsZSAlcihbfiYqKz1cfD86PD4vLV0pLCBPcGVyYXRvcgorICAgICAgICBydWxlIC9bKCksLl0vLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC9cW1thLXpBLVowLTldKlxdLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvJVswLTldKy8sIEtleXdvcmQ6OlJlc2VydmVkCisgICAgICAgIHJ1bGUgL1thLXpBLVpdKyVbMC05XSsvLCBOYW1lOjpGdW5jdGlvbiAgI2xhYmVscy9zdWJyb3V0aW5lcy9mdW5jdGlvbnMKKworICAgICAgICAjcnVsZSAvKD88IVwuKSN7aWR9LyBkbyB8bXwKKyAgICAgICAgcnVsZSBpZCBkbyB8bXwKKyAgICAgICAgICBuYW1lID0gbVswXQorCisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyBuYW1lCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5rZXl3b3Jkc190eXBlLmluY2x1ZGU/IG5hbWUKKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLnJlc2VydmVkLmluY2x1ZGU/IG5hbWUKKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OlJlc2VydmVkCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5idWlsdGlucy5pbmNsdWRlPyBuYW1lCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5nIGRvCisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpwb3AhCisgICAgICAgIHJ1bGUgL1xcKFtcXGFiZm5ydHYiJ118eFthLWZBLUYwLTldezIsNH18WzAtN117MSwzfSkvLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9bXlxcIlxuXSsvLCBTdHIKKyAgICAgICAgcnVsZSAvXFxcbi8sIFN0cgorICAgICAgICBydWxlIC9cXC8sIFN0ciAjIHN0cmF5IGJhY2tzbGFzaAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9uZ2lueC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL25naW54LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzYxYTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9uZ2lueC5yYgpAQCAtMCwwICsxLDcxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgTmdpbnggPCBSZWdleExleGVyCisgICAgICB0aXRsZSAibmdpbngiCisgICAgICBkZXNjICdjb25maWd1cmF0aW9uIGZpbGVzIGZvciB0aGUgbmdpbnggd2ViIHNlcnZlciAobmdpbngub3JnKScKKyAgICAgIHRhZyAnbmdpbngnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1uZ2lueC1jb25mJworICAgICAgZmlsZW5hbWVzICduZ2lueC5jb25mJworCisgICAgICBpZCA9IC9bXlxzJDt7fSgpI10rLworCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC8oaW5jbHVkZSkoXHMrKShbXlxzO10rKS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dCwgTmFtZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIGlkLCBLZXl3b3JkLCA6c3RhdGVtZW50CisKKyAgICAgICAgbWl4aW4gOmJhc2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YmxvY2sgZG8KKyAgICAgICAgcnVsZSAvfS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBydWxlIGlkLCBLZXl3b3JkOjpOYW1lc3BhY2UsIDpzdGF0ZW1lbnQKKyAgICAgICAgbWl4aW4gOmJhc2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RhdGVtZW50IGRvCisgICAgICAgIHJ1bGUgL3svIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb247IHBvcCE7IHB1c2ggOmJsb2NrCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLzsvLCBQdW5jdHVhdGlvbiwgOnBvcCEKKworICAgICAgICBtaXhpbiA6YmFzZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpiYXNlIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKworICAgICAgICBydWxlIC8jLio/XG4vLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvKD86b258b2ZmKVxiLywgTmFtZTo6Q29uc3RhbnQKKyAgICAgICAgcnVsZSAvWyRdW1x3LV0rLywgTmFtZTo6VmFyaWFibGUKKworICAgICAgICAjIGhvc3QvcG9ydAorICAgICAgICBydWxlIC8oW2EtejAtOS4tXSspKDopKFswLTldKykvaSBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpGdW5jdGlvbiwgUHVuY3R1YXRpb24sIE51bTo6SW50ZWdlcgorICAgICAgICBlbmQKKworICAgICAgICAjIG1pbWV0eXBlCisgICAgICAgIHJ1bGUgJXIoW2Etei1dKy9bYS16LV0rKWksIE5hbWU6OkNsYXNzCisKKyAgICAgICAgcnVsZSAvWzAtOV0rW2ttZ10/XGIvaSwgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLyh+KShccyopKFteXHN7XSspLyBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgVGV4dCwgU3RyOjpSZWdleAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9bOj1+XS8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgIyBwYXRobmFtZQorICAgICAgICBydWxlICVyKC8je2lkfT8pLCBOYW1lCisKKyAgICAgICAgcnVsZSAvW14jXHM7e30kXFxdKy8sIFN0ciAjIGNhdGNoYWxsCisKKyAgICAgICAgcnVsZSAvWyQ7XS8sIFRleHQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbmltLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvbmltLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDcwZGYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9uaW0ucmIKQEAgLTAsMCArMSwxNTIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBOaW0gPCBSZWdleExleGVyCisgICAgICAjIFRoaXMgaXMgcHJldHR5IG11Y2ggYSAxLTEgcG9ydCBvZiB0aGUgcHlnbWVudHMgTmltcm9kTGV4ZXIgY2xhc3MKKyAgICAgIHRpdGxlICJOaW0iCisgICAgICBkZXNjICJUaGUgTmltIHByb2dyYW1taW5nIGxhbmd1YWdlIChodHRwOi8vbmltLWxhbmcub3JnLykiCisKKyAgICAgIHRhZyAnbmltJworICAgICAgYWxpYXNlcyAnbmltcm9kJworICAgICAgZmlsZW5hbWVzICcqLm5pbScKKworICAgICAgS0VZV09SRFMgPSAldygKKyAgICAgICAgYWRkciBhcyBhc20gYXRvbWljIGJpbmQgYmxvY2sgYnJlYWsgY2FzZSBjYXN0IGNvbnN0IGNvbnRpbnVlCisgICAgICAgIGNvbnZlcnRlciBkZWZlciBkaXNjYXJkIGRpc3RpbmN0IGRvIGVsaWYgZWxzZSBlbmQgZW51bSBleGNlcHQgZXhwb3J0CisgICAgICAgIGZ1bmMgZmluYWxseSBmb3IgZnJvbSBnZW5lcmljIGlmIGltcG9ydCBpbmNsdWRlIGludGVyZmFjZSBpdGVyYXRvciBsZXQKKyAgICAgICAgbWFjcm8gbWV0aG9kIG1peGluIG5pbCBvYmplY3Qgb2Ygb3V0IHByb2MgcHRyIHJhaXNlIHJlZiByZXR1cm4gc3RhdGljCisgICAgICAgIHRlbXBsYXRlIHRyeSB0dXBsZSB0eXBlIHVzaW5nIHZhciB3aGVuIHdoaWxlIHdpdGggd2l0aG91dCB5aWVsZAorICAgICAgKQorCisgICAgICBPUFdPUkRTID0gJXcoCisgICAgICAgIGFuZCBvciBub3QgeG9yIHNobCBzaHIgZGl2IG1vZCBpbiBub3RpbiBpcyBpc25vdAorICAgICAgKQorCisgICAgICBQU0VVRE9LRVlXT1JEUyA9ICV3KAorICAgICAgICBuaWwgdHJ1ZSBmYWxzZQorICAgICAgKQorCisgICAgICBUWVBFUyA9ICV3KAorICAgICAgIGludCBpbnQ4IGludDE2IGludDMyIGludDY0IGZsb2F0IGZsb2F0MzIgZmxvYXQ2NCBib29sIGNoYXIgcmFuZ2UgYXJyYXkKKyAgICAgICBzZXEgc2V0IHN0cmluZworICAgICAgKQorCisgICAgICBOQU1FU1BBQ0UgPSAldygKKyAgICAgICAgZnJvbSBpbXBvcnQgaW5jbHVkZQorICAgICAgKQorCisgICAgICBkZWYgc2VsZi51bmRlcnNjb3JpemUod29yZHMpCisgICAgICAgIHdvcmRzLm1hcCBkbyB8d3wKKyAgICAgICAgICB3LmdzdWIoLy4vKSB7IHx4fCAiI3tSZWdleHAuZXNjYXBlKHgpfV8/IiB9CisgICAgICAgIGVuZC5qb2luKCd8JykKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y2hhcnMgZG8KKyAgICAgICAgcnVsZSgvXFwoW1xcYWJjZWZucnR2bCJcJ118eFthLWZBLUYwLTldezJ9fFswLTldezEsM30pLywgU3RyOjpFc2NhcGUpCisgICAgICAgIHJ1bGUoLycvLCBTdHI6OkNoYXIsIDpwb3AhKQorICAgICAgICBydWxlKC8uLywgU3RyOjpDaGFyKQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmdzIGRvCisgICAgICAgIHJ1bGUoLyg/PCFcJClcJChcZCt8I3xcdyspKy8sIFN0cjo6SW50ZXJwb2wpCisgICAgICAgIHJ1bGUoL1teXFxcJyJcJFxuXSsvLCAgICAgICAgIFN0cikKKyAgICAgICAgcnVsZSgvW1wnIlxcXS8sICAgICAgICAgICAgICAgU3RyKQorICAgICAgICBydWxlKC9cJC8sICAgICAgICAgICAgICAgICAgICBTdHIpCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRxcyBkbworICAgICAgICBydWxlKC9cXChbXFxhYmNlZm5ydHZsIlwnXXxcbnx4W2EtZkEtRjAtOV17Mn18WzAtOV17MSwzfSkvLAorICAgICAgICAgICAgIFN0cjo6RXNjYXBlKQorICAgICAgICBydWxlKC8iLywgU3RyLCA6cG9wISkKKyAgICAgICAgbWl4aW4gOnN0cmluZ3MKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cmRxcyBkbworICAgICAgICBydWxlKC8iKD8hIikvLCBTdHIsIDpwb3AhKQorICAgICAgICBydWxlKC8iLywgICAgICBTdHI6OkVzY2FwZSwgOnBvcCEpCisgICAgICAgIG1peGluIDpzdHJpbmdzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRkcXMgZG8KKyAgICAgICAgcnVsZSgvIiIiKD8hIikvLCBTdHIsIDpwb3AhKQorICAgICAgICBtaXhpbiA6c3RyaW5ncworICAgICAgICBtaXhpbiA6bmwKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZnVuY25hbWUgZG8KKyAgICAgICAgcnVsZSgvKCg/IVtcZF9dKVx3KSgoKD8hXylcdyl8KF8oPyFfKVx3KSkqLywgTmFtZTo6RnVuY3Rpb24sIDpwb3AhKQorICAgICAgICBydWxlKC9gLitgLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lOjpGdW5jdGlvbiwgOnBvcCEpCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm5sIGRvCisgICAgICAgIHJ1bGUoL1xuLywgU3RyKQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmbG9hdG51bWJlciBkbworICAgICAgICBydWxlKC9cLig/IVwuKVswLTlfXSovLCAgICAgICBOdW06OkZsb2F0KQorICAgICAgICBydWxlKC9bZUVdWystXT9bMC05XVswLTlfXSovLCBOdW06OkZsb2F0KQorICAgICAgICBydWxlKC8vLCAgICAgICAgICAgICAgICAgICAgICBUZXh0LCA6cG9wISkKKyAgICAgIGVuZAorCisgICAgICAjIE1ha2luZyBhcG9zdHJvcGhlcyBvcHRpb25hbCwgYXMgb25seSBoZXhhZGVjaW1hbCB3aXRoIHR5cGUgc3VmZml4CisgICAgICAjIHBvc3NpYmx5IGFtYmlndW91cy4KKyAgICAgIHN0YXRlIDpmbG9hdHN1ZmZpeCBkbworICAgICAgICBydWxlKC8nP1tmRl0oMzJ8NjQpLywgICAgICAgICAgTnVtOjpGbG9hdCkKKyAgICAgICAgcnVsZSgvLywgICAgICAgICAgICAgICAgICAgICAgVGV4dCwgOnBvcCEpCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmludHN1ZmZpeCBkbworICAgICAgICBydWxlKC8nP1tpSV0oMzJ8NjQpLywgICAgICAgICAgTnVtOjpJbnRlZ2VyOjpMb25nKQorICAgICAgICBydWxlKC8nP1tpSV0oOHwxNikvLCAgICAgICAgICAgTnVtOjpJbnRlZ2VyKQorICAgICAgICBydWxlKC8nP1t1VV0vLCAgICAgICAgICAgICAgICAgTnVtOjpJbnRlZ2VyKQorICAgICAgICBydWxlKC8vLCAgICAgICAgICAgICAgICAgICAgICBUZXh0LCA6cG9wISkKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlKC8jIy4qJC8sIFN0cjo6RG9jKQorICAgICAgICBydWxlKC8jLiokLywgIENvbW1lbnQpCisgICAgICAgIHJ1bGUoL1wqfD18Pnw8fFwrfC18XC98QHxcJHx+fCZ8JXxcIXxcP3xcfHxcXHxcW3xcXS8sIE9wZXJhdG9yKQorICAgICAgICBydWxlKC9cLlwufFwufCx8XFtcLnxcLlxdfHtcLnxcLn18XChcLnxcLlwpfHt8fXxcKHxcKXw6fFxefGB8Oy8sCisgICAgICAgICAgICAgUHVuY3R1YXRpb24pCisKKyAgICAgICAgIyBTdHJpbmdzCisgICAgICAgIHJ1bGUoLyg/Oltcd10rKSIvLFN0ciwgOnJkcXMpCisgICAgICAgIHJ1bGUoLyIiIi8sICAgICAgIFN0ciwgOnRkcXMpCisgICAgICAgIHJ1bGUoLyIvLCAgICAgICAgIFN0ciwgOmRxcykKKworICAgICAgICAjIENoYXIKKyAgICAgICAgcnVsZSgvJy8sIFN0cjo6Q2hhciwgOmNoYXJzKQorCisgICAgICAgICMgS2V5d29yZHMKKyAgICAgICAgcnVsZSglclsoI3tOaW0udW5kZXJzY29yaXplKE9QV09SRFMpfSlcYl0sIE9wZXJhdG9yOjpXb3JkKQorICAgICAgICBydWxlKC8ocF8/cl8/b18/Y18/XHMpKD8hW1woXFtcXV0pLywgS2V5d29yZCwgOmZ1bmNuYW1lKQorICAgICAgICBydWxlKCVyWygje05pbS51bmRlcnNjb3JpemUoS0VZV09SRFMpfSlcYl0sICBLZXl3b3JkKQorICAgICAgICBydWxlKCVyWygje05pbS51bmRlcnNjb3JpemUoTkFNRVNQQUNFKX0pXGJdLCBLZXl3b3JkOjpOYW1lc3BhY2UpCisgICAgICAgIHJ1bGUoLyh2Xz9hXz9yKVxiLywgS2V5d29yZDo6RGVjbGFyYXRpb24pCisgICAgICAgIHJ1bGUoJXJbKCN7TmltLnVuZGVyc2Nvcml6ZShUWVBFUyl9KVxiXSwgICAgICAgICAgS2V5d29yZDo6VHlwZSkKKyAgICAgICAgcnVsZSglclsoI3tOaW0udW5kZXJzY29yaXplKFBTRVVET0tFWVdPUkRTKX0pXGJdLCBLZXl3b3JkOjpQc2V1ZG8pCisgICAgICAgICMgSWRlbnRpZmllcnMKKyAgICAgICAgcnVsZSgvXGIoKD8hW19cZF0pXHcpKCgoPyFfKVx3KXwoXyg/IV8pXHcpKSovLCBOYW1lKQorCisgICAgICAgICMgTnVtYmVycworICAgICAgICAjIE5vdGU6IEhhdmUgdG8gZG8gdGhpcyB3aXRoIGEgYmxvY2sgdG8gcHVzaCBtdWx0aXBsZSBzdGF0ZXMgZmlyc3QsCisgICAgICAgICMgICAgICAgc2luY2Ugd2UgY2FuJ3QgcGFzcyBhcnJheSBvZiBzdGF0ZXMgbGlrZSB3LyBQeWdtZW50cy4KKyAgICAgICAgcnVsZSgvWzAtOV1bMC05X10qKD89KFtlRS5dfCc/W2ZGXSgzMnw2NCkpKS8pIGRvIHxudW1iZXJ8CisgICAgICAgICBwdXNoIDpmbG9hdHN1ZmZpeAorICAgICAgICAgcHVzaCA6ZmxvYXRudW1iZXIKKyAgICAgICAgIHRva2VuIE51bTo6RmxvYXQKKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUoLzBbeFhdW2EtZkEtRjAtOV1bYS1mQS1GMC05X10qLywgTnVtOjpIZXgsICAgICA6aW50c3VmZml4KQorICAgICAgICBydWxlKC8wW2JCXVswMV1bMDFfXSovLCAgICAgICAgICAgICAgIE51bSwgICAgICAgICAgOmludHN1ZmZpeCkKKyAgICAgICAgcnVsZSgvMG9bMC03XVswLTdfXSovLCAgICAgICAgICAgICAgICBOdW06Ok9jdCwgICAgIDppbnRzdWZmaXgpCisgICAgICAgIHJ1bGUoL1swLTldWzAtOV9dKi8sICAgICAgICAgICAgICAgICAgTnVtOjpJbnRlZ2VyLCA6aW50c3VmZml4KQorCisgICAgICAgICMgV2hpdGVzcGFjZQorICAgICAgICBydWxlKC9ccysvLCBUZXh0KQorICAgICAgICBydWxlKC8uKyQvLCBFcnJvcikKKyAgICAgIGVuZAorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9vYmplY3RpdmVfYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL29iamVjdGl2ZV9jLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYTJhYWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9vYmplY3RpdmVfYy5yYgpAQCAtMCwwICsxLDIwOCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGxvYWRfbGV4ZXIgJ2MucmInCisKKyAgICBjbGFzcyBPYmplY3RpdmVDIDwgQworICAgICAgdGFnICdvYmplY3RpdmVfYycKKyAgICAgIHRpdGxlICJPYmplY3RpdmUtQyIKKyAgICAgIGRlc2MgJ2FuIGV4dGVuc2lvbiBvZiBDIGNvbW1vbmx5IHVzZWQgdG8gd3JpdGUgQXBwbGUgc29mdHdhcmUnCisgICAgICBhbGlhc2VzICdvYmpjJworICAgICAgZmlsZW5hbWVzICcqLm0nLCAnKi5oJworCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1vYmplY3RpdmVfYycsICdhcHBsaWNhdGlvbi94LW9iamVjdGl2ZV9jJworCisgICAgICBkZWYgc2VsZi5hdF9rZXl3b3JkcworICAgICAgICBAYXRfa2V5d29yZHMgfHw9ICV3KAorICAgICAgICAgIHNlbGVjdG9yIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBlbmNvZGUgc3luY2hyb25pemVkIHRyeQorICAgICAgICAgIHRocm93IGNhdGNoIGZpbmFsbHkgZW5kIHByb3BlcnR5IHN5bnRoZXNpemUgZHluYW1pYyBvcHRpb25hbAorICAgICAgICAgIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBpbXBvcnQKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmF0X2J1aWx0aW5zCisgICAgICAgIEBhdF9idWlsdGlucyB8fD0gJXcodHJ1ZSBmYWxzZSBZRVMgTk8pCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSAldyhZRVMgTk8gbmlsKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0ID1+IC9AKGVuZHxpbXBsZW1lbnRhdGlvbnxwcm90b2NvbHxwcm9wZXJ0eSlcYi8KKworICAgICAgICBpZCA9IC9bYS16JF9dW2EtejAtOSRfXSovaQorICAgICAgICByZXR1cm4gMC40IGlmIHRleHQgPX4gJXIoCisgICAgICAgICAgXFsgXHMqICN7aWR9IFxzKworICAgICAgICAgICg/OgorICAgICAgICAgICAgI3tpZH0gXHMqIFxdCisgICAgICAgICAgICB8ICN7aWR9PyA6CisgICAgICAgICAgKQorICAgICAgICApeAorICAgICAgICByZXR1cm4gMC40IGlmIHRleHQuaW5jbHVkZT8gJ0AiJworICAgICAgZW5kCisKKyAgICAgIGlkID0gL1thLXokX11bYS16MC05JF9dKi9pCisKKyAgICAgIHByZXBlbmQgOnN0YXRlbWVudHMgZG8KKyAgICAgICAgcnVsZSAvQCIvLCBTdHIsIDpzdHJpbmcKKyAgICAgICAgcnVsZSAvQCcoXFxbMC03XXsxLDN9fFxceFthLWZBLUYwLTldezEsMn18XFwufFteXFwnXG5dJykvLAorICAgICAgICAgIFN0cjo6Q2hhcgorICAgICAgICBydWxlIC9AKFxkK1suXVxkKnxbLl1cZCt8XGQrKWVbKy1dP1xkK2w/L2ksCisgICAgICAgICAgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9AKFxkK1suXVxkKnxbLl1cZCt8XGQrZilmPy9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL0AweFxoK1tsTF0/LywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvQDBbMC03XStsPy9pLCBOdW06Ok9jdAorICAgICAgICBydWxlIC9AXGQrbD8vLCBOdW06OkludGVnZXIKKyAgICAgICAgcnVsZSAvXGJpblxiLywgS2V5d29yZAorCisgICAgICAgIHJ1bGUgL0AoPzppbnRlcmZhY2V8aW1wbGVtZW50YXRpb24pXGIvIGRvCisgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGdvdG8gOmNsYXNzbmFtZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9AKD86Y2xhc3N8cHJvdG9jb2wpXGIvIGRvCisgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGdvdG8gOmZvcndhcmRfY2xhc3NuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL0AoW1s6YWxudW06XV0rKS8gZG8gfG18CisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5hdF9rZXl3b3Jkcy5pbmNsdWRlPyBtWzFdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5hdF9idWlsdGlucy5pbmNsdWRlPyBtWzFdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gRXJyb3IKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvWz9dLywgUHVuY3R1YXRpb24sIDp0ZXJuYXJ5CisgICAgICAgIHJ1bGUgL1xbLywgIFB1bmN0dWF0aW9uLCA6bWVzc2FnZQorICAgICAgICBydWxlIC9AXFsvLCBQdW5jdHVhdGlvbiwgOmFycmF5X2xpdGVyYWwKKyAgICAgICAgcnVsZSAvQFx7LywgUHVuY3R1YXRpb24sIDpkaWN0aW9uYXJ5X2xpdGVyYWwKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dGVybmFyeSBkbworICAgICAgICBydWxlIC86LywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIG1peGluIDpzdGF0ZW1lbnRzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm1lc3NhZ2Vfc2hhcmVkIGRvCisgICAgICAgIHJ1bGUgL1xdLywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIHJ1bGUgL1x7LywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIHJ1bGUgLzsvLCBFcnJvcgorCisgICAgICAgIG1peGluIDpzdGF0ZW1lbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bWVzc2FnZSBkbworICAgICAgICBydWxlIC8oI3tpZH0pKFxzKikoOikvIGRvCisgICAgICAgICAgZ3JvdXBzKE5hbWU6OkZ1bmN0aW9uLCBUZXh0LCBQdW5jdHVhdGlvbikKKyAgICAgICAgICBnb3RvIDptZXNzYWdlX3dpdGhfYXJncworICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oI3tpZH0pKFxzKikoXF0pLyBkbworICAgICAgICAgIGdyb3VwcyhOYW1lOjpGdW5jdGlvbiwgVGV4dCwgUHVuY3R1YXRpb24pCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6bWVzc2FnZV9zaGFyZWQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bWVzc2FnZV93aXRoX2FyZ3MgZG8KKyAgICAgICAgcnVsZSAvXHsvLCBQdW5jdHVhdGlvbiwgOmZ1bmN0aW9uCisgICAgICAgIHJ1bGUgLygje2lkfSkoXHMqKSg6KS8gZG8KKyAgICAgICAgICBncm91cHMoTmFtZTo6RnVuY3Rpb24sIFRleHQsIFB1bmN0dWF0aW9uKQorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisKKyAgICAgICAgbWl4aW4gOm1lc3NhZ2Vfc2hhcmVkCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmFycmF5X2xpdGVyYWwgZG8KKyAgICAgICAgcnVsZSAvXS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBydWxlIC8sLywgUHVuY3R1YXRpb24KKyAgICAgICAgbWl4aW4gOnN0YXRlbWVudHMKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZGljdGlvbmFyeV9saXRlcmFsIGRvCisgICAgICAgIHJ1bGUgL30vLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgICAgcnVsZSAvLC8sIFB1bmN0dWF0aW9uCisgICAgICAgIG1peGluIDpzdGF0ZW1lbnRzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNsYXNzbmFtZSBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorCisgICAgICAgIHJ1bGUgLygje2lkfSkoXHMqKSg6KShccyopKCN7aWR9KS8gZG8KKyAgICAgICAgICBncm91cHMoTmFtZTo6Q2xhc3MsIFRleHQsCisgICAgICAgICAgICAgICAgIFB1bmN0dWF0aW9uLCBUZXh0LAorICAgICAgICAgICAgICAgICBOYW1lOjpDbGFzcykKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLygje2lkfSkoXHMqKShbKF0pKFxzKikoI3tpZH0pKFxzKikoWyldKS8gZG8KKyAgICAgICAgICBncm91cHMoTmFtZTo6Q2xhc3MsIFRleHQsCisgICAgICAgICAgICAgICAgIFB1bmN0dWF0aW9uLCBUZXh0LAorICAgICAgICAgICAgICAgICBOYW1lOjpMYWJlbCwgVGV4dCwKKyAgICAgICAgICAgICAgICAgUHVuY3R1YXRpb24pCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIGlkLCBOYW1lOjpDbGFzcywgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Zm9yd2FyZF9jbGFzc25hbWUgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKworICAgICAgICBydWxlIC8oI3tpZH0pKFxzKikoLCkoXHMqKS8gZG8KKyAgICAgICAgICBncm91cHMoTmFtZTo6Q2xhc3MsIFRleHQsIFB1bmN0dWF0aW9uLCBUZXh0KQorICAgICAgICAgIHB1c2gKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKCN7aWR9KShccyopKDs/KS8gZG8KKyAgICAgICAgICBncm91cHMoTmFtZTo6Q2xhc3MsIFRleHQsIFB1bmN0dWF0aW9uKQorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgcHJlcGVuZCA6cm9vdCBkbworICAgICAgICBydWxlICVyKAorICAgICAgICAgIChbLStdKShccyopCisgICAgICAgICAgKFsoXS4qP1spXSk/KFxzKikKKyAgICAgICAgICAoPz0je2lkfTo/KQorICAgICAgICApaXggZG8gfG18CisgICAgICAgICAgdG9rZW4gS2V5d29yZCwgbVsxXTsgdG9rZW4gVGV4dCwgbVsyXQorICAgICAgICAgIHJlY3Vyc2UgbVszXTsgdG9rZW4gVGV4dCwgbVs0XQorICAgICAgICAgIHB1c2ggOm1ldGhvZF9kZWZpbml0aW9uCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptZXRob2RfZGVmaW5pdGlvbiBkbworICAgICAgICBydWxlIC8sLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvWy5dWy5dWy5dLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvKFsoXS4qP1spXSkoI3tpZH0pLyBkbyB8bXwKKyAgICAgICAgICByZWN1cnNlIG1bMV07IHRva2VuIE5hbWU6OlZhcmlhYmxlLCBtWzJdCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLygje2lkfSkoXHMqKSg6KS9tIGRvCisgICAgICAgICAgZ3JvdXBzKE5hbWU6OkZ1bmN0aW9uLCBUZXh0LCBQdW5jdHVhdGlvbikKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvOy8sIFB1bmN0dWF0aW9uLCA6cG9wIQorCisgICAgICAgIHJ1bGUgL3svIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICBnb3RvIDpmdW5jdGlvbgorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6aW5saW5lX3doaXRlc3BhY2UKKyAgICAgICAgcnVsZSAlcigvLy4qP1xuKSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvb2NhbWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9vY2FtbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWUyYzRjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvb2NhbWwucmIKQEAgLTAsMCArMSwxMTEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBPQ2FtbCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJPQ2FtbCIKKyAgICAgIGRlc2MgJ09iamVjdGl2ZSBDQU1MIChvY2FtbC5vcmcpJworICAgICAgdGFnICdvY2FtbCcKKyAgICAgIGZpbGVuYW1lcyAnKi5tbCcsICcqLm1saScsICcqLm1sbCcsICcqLm1seScKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LW9jYW1sJworCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAa2V5d29yZHMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgYXMgYXNzZXJ0IGJlZ2luIGNsYXNzIGNvbnN0cmFpbnQgZG8gZG9uZSBkb3dudG8gZWxzZSBlbmQKKyAgICAgICAgICBleGNlcHRpb24gZXh0ZXJuYWwgZmFsc2UgZm9yIGZ1biBmdW5jdGlvbiBmdW5jdG9yIGlmIGluIGluY2x1ZGUKKyAgICAgICAgICBpbmhlcml0IGluaXRpYWxpemVyIGxhenkgbGV0IG1hdGNoIG1ldGhvZCBtb2R1bGUgbXV0YWJsZSBuZXcKKyAgICAgICAgICBvYmplY3Qgb2Ygb3BlbiBwcml2YXRlIHJhaXNlIHJlYyBzaWcgc3RydWN0IHRoZW4gdG8gdHJ1ZSB0cnkKKyAgICAgICAgICB0eXBlIHZhbHVlIHZhbCB2aXJ0dWFsIHdoZW4gd2hpbGUgd2l0aAorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYua2V5b3B0cworICAgICAgICBAa2V5b3B0cyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICAhPSAjICYgJiYgKCApICogXCsgLCAtIC0uIC0+IC4gLi4gOiA6OiA6PSA6PiA7IDs7IDwgPC0gPQorICAgICAgICAgID4gPl0gPn0gPyA/PyBbIFs8IFs+IFt8IF0gXyBgIHsgezwgfCB8XSB9IH4KKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLndvcmRfb3BlcmF0b3JzCisgICAgICAgIEB3b3JkX29wZXJhdG9ycyB8fD0gU2V0Lm5ldyAldyhhbmQgYXNyIGxhbmQgbG9yIGxzbCBseG9yIG1vZCBvcikKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5wcmltaXRpdmVzCisgICAgICAgIEBwcmltaXRpdmVzIHx8PSBTZXQubmV3ICV3KHVuaXQgaW50IGZsb2F0IGJvb2wgc3RyaW5nIGNoYXIgbGlzdCBhcnJheSkKKyAgICAgIGVuZAorCisgICAgICBvcGVyYXRvciA9ICVyKFtcW1xdOyx7fV8oKSEkJSYqKy4vOjw9Pj9AXnx+Iy1dKykKKyAgICAgIGlkID0gL1thLXpdW1x3J10qL2kKKyAgICAgIHVwcGVyX2lkID0gL1tBLVpdW1x3J10qLworCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgICBydWxlIC9mYWxzZXx0cnVlfFsoXVspXXxcW1xdLywgTmFtZTo6QnVpbHRpbjo6UHNldWRvCisgICAgICAgIHJ1bGUgLyN7dXBwZXJfaWR9KD89XHMqWy5dKS8sIE5hbWU6Ok5hbWVzcGFjZSwgOmRvdHRlZAorICAgICAgICBydWxlIHVwcGVyX2lkLCBOYW1lOjpDbGFzcworICAgICAgICBydWxlIC9bKF1bKl0oPyFbKV0pLywgQ29tbWVudCwgOmNvbW1lbnQKKyAgICAgICAgcnVsZSBpZCBkbyB8bXwKKyAgICAgICAgICBtYXRjaCA9IG1bMF0KKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmtleXdvcmRzLmluY2x1ZGU/IG1hdGNoCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy53b3JkX29wZXJhdG9ycy5pbmNsdWRlPyBtYXRjaAorICAgICAgICAgICAgdG9rZW4gT3BlcmF0b3I6OldvcmQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLnByaW1pdGl2ZXMuaW5jbHVkZT8gbWF0Y2gKKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgb3BlcmF0b3IgZG8gfG18CisgICAgICAgICAgbWF0Y2ggPSBtWzBdCisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXlvcHRzLmluY2x1ZGU/IG1hdGNoCisgICAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE9wZXJhdG9yCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLy0/XGRbXGRfXSooLltcZF9dKik/KGVbKy1dP1xkW1xkX10qKS9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLzB4XGhbXGhfXSovaSwgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvMG9bMC03XVswLTdfXSovaSwgTnVtOjpPY3QKKyAgICAgICAgcnVsZSAvMGJbMDFdWzAxX10qL2ksIE51bTo6QmluCisgICAgICAgIHJ1bGUgL1xkW1xkX10qLywgTnVtOjpJbnRlZ2VyCisKKyAgICAgICAgcnVsZSAvJyg/OihcXFtcXCInbnRiciBdKXwoXFxbMC05XXszfSl8KFxceFxoezJ9KSknLywgU3RyOjpDaGFyCisgICAgICAgIHJ1bGUgLydbLl0nLywgU3RyOjpDaGFyCisgICAgICAgIHJ1bGUgLycvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnN0cmluZworICAgICAgICBydWxlIC9bfj9dI3tpZH0vLCBOYW1lOjpWYXJpYWJsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tZW50IGRvCisgICAgICAgIHJ1bGUgL1teKCopXSsvLCBDb21tZW50CisgICAgICAgIHJ1bGUoL1soXVsqXS8pIHsgdG9rZW4gQ29tbWVudDsgcHVzaCB9CisgICAgICAgIHJ1bGUgL1sqXVspXS8sIENvbW1lbnQsIDpwb3AhCisgICAgICAgIHJ1bGUgL1soKildLywgQ29tbWVudAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmcgZG8KKyAgICAgICAgcnVsZSAvW15cXCJdKy8sIFN0cjo6RG91YmxlCisgICAgICAgIG1peGluIDplc2NhcGVfc2VxdWVuY2UKKyAgICAgICAgcnVsZSAvXFxcbi8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXNjYXBlX3NlcXVlbmNlIGRvCisgICAgICAgIHJ1bGUgL1xcW1xcIidudGJyXS8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1xcXGR7M30vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9cXHhcaHsyfS8sIFN0cjo6RXNjYXBlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRvdHRlZCBkbworICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgICBydWxlIC9bLl0vLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC8je3VwcGVyX2lkfSg/PVxzKlsuXSkvLCBOYW1lOjpOYW1lc3BhY2UKKyAgICAgICAgcnVsZSB1cHBlcl9pZCwgTmFtZTo6Q2xhc3MsIDpwb3AhCisgICAgICAgIHJ1bGUgaWQsIE5hbWUsIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Bhc2NhbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Bhc2NhbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGYwNmNkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcGFzY2FsLnJiCkBAIC0wLDAgKzEsNjYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBQYXNjYWwgPCBSZWdleExleGVyCisgICAgICB0YWcgJ3Bhc2NhbCcKKyAgICAgIHRpdGxlICJQYXNjYWwiCisgICAgICBkZXNjICdhIHByb2NlZHVyYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgY29tbW9ubHkgdXNlZCBhcyBhIHRlYWNoaW5nIGxhbmd1YWdlLicKKyAgICAgIGZpbGVuYW1lcyAnKi5wYXMnCisKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LXBhc2NhbCcKKworICAgICAgaWQgPSAvQD9bX2Etel1cdyovaQorCisgICAgICBrZXl3b3JkcyA9ICV3KAorICAgICAgICBhYnNvbHV0ZSBhYnN0cmFjdCBhbGwgYW5kIGFuZF90aGVuIGFycmF5IGFzIGFzbSBhc3NlbWJsZXIgYXR0cmlidXRlCisgICAgICAgIGJlZ2luIGJpbmRhYmxlIGNhc2UgY2xhc3MgY29uc3QgY29uc3RydWN0b3IgZGVsYXkgZGVzdHJ1Y3RvciBkaXYgZG8KKyAgICAgICAgZG93bnRvIGVsc2UgZW5kIGV4Y2VwdCBleGl0IGV4cG9ydCBleHBvcnRzIGV4dGVybmFsIGZhciBmaWxlIGZpbmFsaXphdGlvbgorICAgICAgICBmaW5hbGx5IGZvciBmb3J3YXJkIGZ1bmN0aW9uIGdvdG8gaWYgaW1wbGVtZW50YXRpb24gaW1wb3J0IGluIGluYyBpbmRleAorICAgICAgICBpbmhlcml0ZWQgaW5pdGlhbGl6YXRpb24gaW5saW5lIGludGVyZmFjZSBpbnRlcnJ1cHQgaXMgbGFiZWwgbGlicmFyeQorICAgICAgICBtZXNzYWdlIG1vZCBtb2R1bGUgbmVhciBuaWwgbm90IG9iamVjdCBvZiBvbiBvbmx5IG9wZXJhdG9yIG9yIG9yX2Vsc2UKKyAgICAgICAgb3RoZXJ3aXNlIG91dCBvdmVybG9hZCBvdmVycmlkZSBwYWNrZWQgcGFzY2FsIHBvdyBwcml2YXRlIHByb2NlZHVyZSBwcm9ncmFtCisgICAgICAgIHByb3BlcnR5IHByb3RlY3RlZCBwdWJsaWMgcHVibGlzaGVkIHF1YWxpZmllZCByYWlzZSByZWFkIHJlY29yZCByZWdpc3RlcgorICAgICAgICByZXBlYXQgcmVzaWRlbnQgcmVzb3VyY2VzdHJpbmcgcmVzdHJpY3RlZCBzYWZlY2FsbCBzZWdtZW50IHNldCBzaGwgc2hyCisgICAgICAgIHN0ZGNhbGwgc3RvcmVkIHN0cmluZyB0aGVuIHRocmVhZHZhciB0byB0cnkgdHlwZSB1bml0IHVudGlsIHVzZXMgdmFsdWUgdmFyCisgICAgICAgIHZpZXcgdmlydHVhbCB3aGlsZSB3aXRoIHdyaXRlIHdyaXRlbG4geG9yCisgICAgICApCisKKyAgICAgIGtleXdvcmRzX3R5cGUgPSAldygKKyAgICAgICAgYW5zaWNoYXIgYW5zaXN0cmluZyBib29sIGJvb2xlYW4gYnl0ZSBieXRlYm9vbCBjYXJkaW5hbCBjaGFyIGNvbXAgY3VycmVuY3kKKyAgICAgICAgZG91YmxlIGR3b3JkIGV4dGVuZGVkIGludDY0IGludGVnZXIgaXVua25vd24gbG9uZ2Jvb2wgbG9uZ2ludCBsb25nd29yZCBwYW5zaWNoYXIKKyAgICAgICAgcGFuc2lzdHJpbmcgcGJvb2wgcGJvb2xlYW4gcGJ5dGUgcGJ5dGVhcnJheSBwY2FyZGluYWwgcGNoYXIgcGNvbXAgcGN1cnJlbmN5CisgICAgICAgIHBkYXRlIHBkYXRldGltZSBwZG91YmxlIHBkd29yZCBwZXh0ZW5kZWQgcGhhbmRsZSBwaW50NjQgcGludGVnZXIgcGxvbmdpbnQgcGxvbmd3b3JkCisgICAgICAgIHBvaW50ZXIgcHBvaW50ZXIgcHNob3J0aW50IHBzaG9ydHN0cmluZyBwc2luZ2xlIHBzbWFsbGludCBwc3RyaW5nIHB2YXJpYW50IHB3aWRlY2hhcgorICAgICAgICBwd2lkZXN0cmluZyBwd29yZCBwd29yZGFycmF5IHB3b3JkYm9vbCByZWFsIHJlYWw0OCBzaG9ydGludCBzaG9ydHN0cmluZyBzaW5nbGUKKyAgICAgICAgc21hbGxpbnQgc3RyaW5nIHRjbGFzcyB0ZGF0ZSB0ZGF0ZXRpbWUgdGV4dGZpbGUgdGhhbmRsZSB0b2JqZWN0IHR0aW1lIHZhcmlhbnQKKyAgICAgICAgd2lkZWNoYXIgd2lkZXN0cmluZyB3b3JkIHdvcmRib29sCisgICAgICApCisKKyAgICAgIHN0YXRlIDp3aGl0ZXNwYWNlIGRvCisgICAgICAgICMgU3BhY2VzCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgICMgLy8gQ29tbWVudHMKKyAgICAgICAgcnVsZSAlcigoLy8pLiokXG4/KSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgICMgLS0gQ29tbWVudHMKKyAgICAgICAgcnVsZSAlcigoLS0pLiokXG4/KSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgICMgKCogQ29tbWVudHMgKikKKyAgICAgICAgcnVsZSAlcihcKFwqLio/XCpcKSltLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgIyB7IENvbW1lbnRzIH0KKyAgICAgICAgcnVsZSAlcihcey4qP1x9KW0sIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSAlcnsoKDAoeHxYKVswLTlhLWZBLUZdKil8KChbMC05XStcLj9bMC05XSopfChcLlswLTldKykpKChlfEUpKFwrfC0pP1swLTldKyk/KShMfGx8VUx8dWx8dXxVfEZ8ZnxsbHxMTHx1bGx8VUxMKT99LCBOdW0KKyAgICAgICAgcnVsZSAlcntbfiFAI1wkJVxeJlwqXChcKVwrYFwtPXt9XFtcXTo7PD5cPyxcLlwvXHxcXF19LCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlICVyeycoW14nXXwnJykqJ30sIFN0cgorICAgICAgICBydWxlIC8odHJ1ZXxmYWxzZXxuaWwpXGIvaSwgTmFtZTo6QnVpbHRpbgorICAgICAgICBydWxlIC9cYigje2tleXdvcmRzLmpvaW4oJ3wnKX0pXGIvaSwgS2V5d29yZAorICAgICAgICBydWxlIC9cYigje2tleXdvcmRzX3R5cGUuam9pbignfCcpfSlcYi9pLCBLZXl3b3JkOjpUeXBlCisgICAgICAgIHJ1bGUgaWQsIE5hbWUKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcGVybC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3BlcmwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViMjhmYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3BlcmwucmIKQEAgLTAsMCArMSwxOTcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBQZXJsIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIlBlcmwiCisgICAgICBkZXNjICJUaGUgUGVybCBzY3JpcHRpbmcgbGFuZ3VhZ2UgKHBlcmwub3JnKSIKKworICAgICAgdGFnICdwZXJsJworICAgICAgYWxpYXNlcyAncGwnCisKKyAgICAgIGZpbGVuYW1lcyAnKi5wbCcsICcqLnBtJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtcGVybCcsICdhcHBsaWNhdGlvbi94LXBlcmwnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnNoZWJhbmc/ICdwZXJsJworICAgICAgICByZXR1cm4gMC40IGlmIHRleHQuaW5jbHVkZT8gJ215ICQnCisgICAgICBlbmQKKworICAgICAga2V5d29yZHMgPSAldygKKyAgICAgICAgY2FzZSBjb250aW51ZSBkbyBlbHNlIGVsc2lmIGZvciBmb3JlYWNoIGlmIGxhc3QgbXkgbmV4dCBvdXIKKyAgICAgICAgcmVkbyByZXNldCB0aGVuIHVubGVzcyB1bnRpbCB3aGlsZSB1c2UgcHJpbnQgbmV3IEJFR0lOIENIRUNLCisgICAgICAgIElOSVQgRU5EIHJldHVybgorICAgICAgKQorCisgICAgICBidWlsdGlucyA9ICV3KAorICAgICAgICBhYnMgYWNjZXB0IGFsYXJtIGF0YW4yIGJpbmQgYmlubW9kZSBibGVzcyBjYWxsZXIgY2hkaXIgY2htb2QKKyAgICAgICAgY2hvbXAgY2hvcCBjaG93biBjaHIgY2hyb290IGNsb3NlIGNsb3NlZGlyIGNvbm5lY3QgY29udGludWUgY29zCisgICAgICAgIGNyeXB0IGRibWNsb3NlIGRibW9wZW4gZGVmaW5lZCBkZWxldGUgZGllIGR1bXAgZWFjaCBlbmRncmVudAorICAgICAgICBlbmRob3N0ZW50IGVuZG5ldGVudCBlbmRwcm90b2VudCBlbmRwd2VudCBlbmRzZXJ2ZW50IGVvZiBldmFsCisgICAgICAgIGV4ZWMgZXhpc3RzIGV4aXQgZXhwIGZjbnRsIGZpbGVubyBmbG9jayBmb3JrIGZvcm1hdCBmb3JtbGluZSBnZXRjCisgICAgICAgIGdldGdyZW50IGdldGdyZ2lkIGdldGdybmFtIGdldGhvc3RieWFkZHIgZ2V0aG9zdGJ5bmFtZSBnZXRob3N0ZW50CisgICAgICAgIGdldGxvZ2luIGdldG5ldGJ5YWRkciBnZXRuZXRieW5hbWUgZ2V0bmV0ZW50IGdldHBlZXJuYW1lCisgICAgICAgIGdldHBncnAgZ2V0cHBpZCBnZXRwcmlvcml0eSBnZXRwcm90b2J5bmFtZSBnZXRwcm90b2J5bnVtYmVyCisgICAgICAgIGdldHByb3RvZW50IGdldHB3ZW50IGdldHB3bmFtIGdldHB3dWlkIGdldHNlcnZieW5hbWUgZ2V0c2VydmJ5cG9ydAorICAgICAgICBnZXRzZXJ2ZW50IGdldHNvY2tuYW1lIGdldHNvY2tvcHQgZ2xvYiBnbXRpbWUgZ290byBncmVwIGhleAorICAgICAgICBpbXBvcnQgaW5kZXggaW50IGlvY3RsIGpvaW4ga2V5cyBraWxsIGxhc3QgbGMgbGNmaXJzdCBsZW5ndGgKKyAgICAgICAgbGluayBsaXN0ZW4gbG9jYWwgbG9jYWx0aW1lIGxvZyBsc3RhdCBtYXAgbWtkaXIgbXNnY3RsIG1zZ2dldAorICAgICAgICBtc2dyY3YgbXNnc25kIG15IG5leHQgbm8gb2N0IG9wZW4gb3BlbmRpciBvcmQgb3VyIHBhY2sgcGFja2FnZQorICAgICAgICBwaXBlIHBvcCBwb3MgcHJpbnRmIHByb3RvdHlwZSBwdXNoIHF1b3RlbWV0YSByYW5kIHJlYWQgcmVhZGRpcgorICAgICAgICByZWFkbGluZSByZWFkbGluayByZWFkcGlwZSByZWN2IHJlZG8gcmVmIHJlbmFtZSByZXF1aXJlIHJldmVyc2UKKyAgICAgICAgcmV3aW5kZGlyIHJpbmRleCBybWRpciBzY2FsYXIgc2VlayBzZWVrZGlyIHNlbGVjdCBzZW1jdGwgc2VtZ2V0CisgICAgICAgIHNlbW9wIHNlbmQgc2V0Z3JlbnQgc2V0aG9zdGVudCBzZXRuZXRlbnQgc2V0cGdycCBzZXRwcmlvcml0eQorICAgICAgICBzZXRwcm90b2VudCBzZXRwd2VudCBzZXRzZXJ2ZW50IHNldHNvY2tvcHQgc2hpZnQgc2htY3RsIHNobWdldAorICAgICAgICBzaG1yZWFkIHNobXdyaXRlIHNodXRkb3duIHNpbiBzbGVlcCBzb2NrZXQgc29ja2V0cGFpciBzb3J0IHNwbGljZQorICAgICAgICBzcGxpdCBzcHJpbnRmIHNxcnQgc3JhbmQgc3RhdCBzdHVkeSBzdWJzdHIgc3ltbGluayBzeXNjYWxsIHN5c29wZW4KKyAgICAgICAgc3lzcmVhZCBzeXNzZWVrIHN5c3RlbSBzeXN3cml0ZSB0ZWxsIHRlbGxkaXIgdGllIHRpZWQgdGltZSB0aW1lcworICAgICAgICB0ciB0cnVuY2F0ZSB1YyB1Y2ZpcnN0IHVtYXNrIHVuZGVmIHVubGluayB1bnBhY2sgdW5zaGlmdCB1bnRpZQorICAgICAgICB1dGltZSB2YWx1ZXMgdmVjIHdhaXQgd2FpdHBpZCB3YW50YXJyYXkgd2FybiB3cml0ZQorICAgICAgKQorCisgICAgICByZV90b2sgPSBTdHI6OlJlZ2V4CisKKyAgICAgIHN0YXRlIDpiYWxhbmNlZF9yZWdleCBkbworICAgICAgICBydWxlICVyKC8oXFxcXHxcXC98W14vXSkqL1tlZ2ltb3N4XSopbSwgcmVfdG9rLCA6cG9wIQorICAgICAgICBydWxlICVyKCEoXFxcXHxcXCF8W14hXSkqIVtlZ2ltb3N4XSopbSwgcmVfdG9rLCA6cG9wIQorICAgICAgICBydWxlICVyKFxcKFxcXFx8W15cXF0pKlxcW2VnaW1vc3hdKiltLCByZV90b2ssIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoeyhcXFxcfFxcfXxbXn1dKSp9W2VnaW1vc3hdKiksIHJlX3RvaywgOnBvcCEKKyAgICAgICAgcnVsZSAlcig8KFxcXFx8XFw+fFtePl0pKj5bZWdpbW9zeF0qKSwgcmVfdG9rLCA6cG9wIQorICAgICAgICBydWxlICVyKFxbKFxcXFx8XFxcXXxbXlxdXSkqXF1bZWdpbW9zeF0qKSwgcmVfdG9rLCA6cG9wIQorICAgICAgICBydWxlICVyW1woKFxcXFx8XFxcKXxbXlwpXSkqXClbZWdpbW9zeF0qXSwgcmVfdG9rLCA6cG9wIQorICAgICAgICBydWxlICVyKEAoXFxcXHxcXFxAfFteXEBdKSpAW2VnaW1vc3hdKiksIHJlX3RvaywgOnBvcCEKKyAgICAgICAgcnVsZSAlciglKFxcXFx8XFxcJXxbXlwlXSkqJVtlZ2ltb3N4XSopLCByZV90b2ssIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoXCQoXFxcXHxcXFwkfFteXCRdKSpcJFtlZ2ltb3N4XSopLCByZV90b2ssIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvIy4qPyQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXj1bYS16QS1aMC05XStccysuKj9cbj1jdXQvLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgcnVsZSAvKD86I3trZXl3b3Jkcy5qb2luKCd8Jyl9KVxiLywgS2V5d29yZAorCisgICAgICAgIHJ1bGUgLyhmb3JtYXQpKFxzKykoW2EtekEtWjAtOV9dKykoXHMqKSg9KShccypcbikvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIE5hbWUsIFRleHQsIFB1bmN0dWF0aW9uLCBUZXh0CisKKyAgICAgICAgICBwdXNoIDpmb3JtYXQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKD86ZXF8bHR8Z3R8bGV8Z2V8bmV8bm90fGFuZHxvcnxjbXApXGIvLCBPcGVyYXRvcjo6V29yZAorCisgICAgICAgICMgY29tbW9uIGRlbGltaXRlcnMKKyAgICAgICAgcnVsZSAlcihzLyhcXFxcfFxcL3xbXi9dKSovKFxcXFx8XFwvfFteL10pKi9bZWdpbW9zeF0qKSwgcmVfdG9rCisgICAgICAgIHJ1bGUgJXIocyEoXFxcXHxcXCF8W14hXSkqIShcXFxcfFxcIXxbXiFdKSohW2VnaW1vc3hdKiksIHJlX3RvaworICAgICAgICBydWxlICVyKHNcXChcXFxcfFteXFxdKSpcXChcXFxcfFteXFxdKSpcXFtlZ2ltb3N4XSopLCByZV90b2sKKyAgICAgICAgcnVsZSAlcihzQChcXFxcfFxcQHxbXkBdKSpAKFxcXFx8XFxAfFteQF0pKkBbZWdpbW9zeF0qKSwgcmVfdG9rCisgICAgICAgIHJ1bGUgJXIocyUoXFxcXHxcXCV8W14lXSkqJShcXFxcfFxcJXxbXiVdKSolW2VnaW1vc3hdKiksIHJlX3RvaworCisgICAgICAgICMgYmFsYW5jZWQgZGVsaW1pdGVycworICAgICAgICBydWxlICVyKHN7KFxcXFx8XFx9fFtefV0pKn1ccyopLCByZV90b2ssIDpiYWxhbmNlZF9yZWdleAorICAgICAgICBydWxlICVyKHM8KFxcXFx8XFw+fFtePl0pKj5ccyopLCByZV90b2ssIDpiYWxhbmNlZF9yZWdleAorICAgICAgICBydWxlICVyKHNcWyhcXFxcfFxcXF18W15cXV0pKlxdXHMqKSwgcmVfdG9rLCA6YmFsYW5jZWRfcmVnZXgKKyAgICAgICAgcnVsZSAlcltzXCgoXFxcXHxcXFwpfFteXCldKSpcKVxzKl0sIHJlX3RvaywgOmJhbGFuY2VkX3JlZ2V4CisKKyAgICAgICAgcnVsZSAlcihtPy8oXFxcXHxcXC98W14vXG5dKSovW2djaW1vc3hdKiksIHJlX3RvaworICAgICAgICBydWxlICVyKG0oPz1bLyFcXHs8XFtcKEAlXCRdKSksIHJlX3RvaywgOmJhbGFuY2VkX3JlZ2V4CisgICAgICAgIHJ1bGUgJXIoKCg/PD09fil8KD88PVwoKSlccyovKFxcXFx8XFwvfFteL10pKi9bZ2NpbW9zeF0qKSwKKyAgICAgICAgICByZV90b2ssIDpiYWxhbmNlZF9yZWdleAorCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvKD86I3tidWlsdGlucy5qb2luKCd8Jyl9KVxiLywgTmFtZTo6QnVpbHRpbgorICAgICAgICBydWxlIC8oKF9fKERBVEF8RElFfFdBUk4pX18pfChTVEQoSU58T1VUfEVSUikpKVxiLywKKyAgICAgICAgICBOYW1lOjpCdWlsdGluOjpQc2V1ZG8KKworICAgICAgICBydWxlIC88PChbXCciXT8pKFthLXpBLVpfXVthLXpBLVowLTlfXSopXDE7P1xuLio/XG5cMlxuL20sIFN0cgorCisgICAgICAgIHJ1bGUgL19fRU5EX19cYi8sIENvbW1lbnQ6OlByZXByb2MsIDplbmRfcGFydAorICAgICAgICBydWxlIC9cJFxeW0FERUZISUxNT1BTVFdYXS8sIE5hbWU6OlZhcmlhYmxlOjpHbG9iYWwKKyAgICAgICAgcnVsZSAvXCRbXFwiJ1xbXF0mYCsqLiw7PSV+P0AkITw+KF5cfFwvLV0oPyFcdykvLCBOYW1lOjpWYXJpYWJsZTo6R2xvYmFsCisgICAgICAgIHJ1bGUgL1skQCUjXSsvLCBOYW1lOjpWYXJpYWJsZSwgOnZhcm5hbWUKKworICAgICAgICBydWxlIC8wXz9bMC03XSsoX1swLTddKykqLywgTnVtOjpPY3QKKyAgICAgICAgcnVsZSAvMHhbMC05QS1GYS1mXSsoX1swLTlBLUZhLWZdKykqLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvMGJbMDFdKyhfWzAxXSspKi8sIE51bTo6QmluCisgICAgICAgIHJ1bGUgLyhcZCooX1xkKikqXC5cZCsoX1xkKikqfFxkKyhfXGQqKSpcLlxkKyhfXGQqKSopKGVbKy1dP1xkKyk/L2ksCisgICAgICAgICAgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9cZCsoX1xkKikqZVsrLV0/XGQrKF9cZCopKi9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL1xkKyhfXGQrKSovLCBOdW06OkludGVnZXIKKworICAgICAgICBydWxlIC8nKFxcXFx8XFwnfFteJ10pKicvLCBTdHIKKyAgICAgICAgcnVsZSAvIihcXFxcfFxcInxbXiJdKSoiLywgU3RyCisgICAgICAgIHJ1bGUgL2AoXFxcXHxcXGB8W15gXSkqYC8sIFN0cjo6QmFja3RpY2sKKyAgICAgICAgcnVsZSAvPChbXlxzPl0rKT4vLCByZV90b2sKKyAgICAgICAgcnVsZSAvKHF8cXF8cXd8cXJ8cXgpXHsvLCBTdHI6Ok90aGVyLCA6Y2Jfc3RyaW5nCisgICAgICAgIHJ1bGUgLyhxfHFxfHF3fHFyfHF4KVwoLywgU3RyOjpPdGhlciwgOnJiX3N0cmluZworICAgICAgICBydWxlIC8ocXxxcXxxd3xxcnxxeClcWy8sIFN0cjo6T3RoZXIsIDpzYl9zdHJpbmcKKyAgICAgICAgcnVsZSAvKHF8cXF8cXd8cXJ8cXgpPC8sIFN0cjo6T3RoZXIsIDpsdF9zdHJpbmcKKyAgICAgICAgcnVsZSAvKHF8cXF8cXd8cXJ8cXgpKFteYS16QS1aMC05XSkoLnxcbikqP1wyLywgU3RyOjpPdGhlcgorCisgICAgICAgIHJ1bGUgL3BhY2thZ2VccysvLCBLZXl3b3JkLCA6bW9kdWxlbmFtZQorICAgICAgICBydWxlIC9zdWJccysvLCBLZXl3b3JkLCA6ZnVuY25hbWUKKyAgICAgICAgcnVsZSAvXFtcXXxcKlwqfDo6fDw8fD4+fD49fDw9fDw9Pnw9ezN9fCE9fD1+fCF+fCYmP3xcfFx8fFwuezEsM30vLAorICAgICAgICAgIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgL1stK1wvKiU9PD4mXlx8IVxcfl09Py8sIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgL1soKVxbXF06Oyw8PlwvP3t9XS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUoLyg/PVx3KS8pIHsgcHVzaCA6bmFtZSB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZvcm1hdCBkbworICAgICAgICBydWxlIC9cLlxuLywgU3RyOjpJbnRlcnBvbCwgOnBvcCEKKyAgICAgICAgcnVsZSAvLio/XG4vLCBTdHI6OkludGVycG9sCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm5hbWVfY29tbW9uIGRvCisgICAgICAgIHJ1bGUgL1x3Kzo6LywgTmFtZTo6TmFtZXNwYWNlCisgICAgICAgIHJ1bGUgL1tcdzpdKy8sIE5hbWU6OlZhcmlhYmxlLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp2YXJuYW1lIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvXHsvLCBQdW5jdHVhdGlvbiwgOnBvcCEgIyBoYXNoIHN5bnRheAorICAgICAgICBydWxlIC9cKXwsLywgUHVuY3R1YXRpb24sIDpwb3AhICMgYXJnIHNwZWNpZmllcgorICAgICAgICBtaXhpbiA6bmFtZV9jb21tb24KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bmFtZSBkbworICAgICAgICBtaXhpbiA6bmFtZV9jb21tb24KKyAgICAgICAgcnVsZSAvW0EtWl9dKyg/PVteYS16QS1aMC05X10pLywgTmFtZTo6Q29uc3RhbnQsIDpwb3AhCisgICAgICAgIHJ1bGUoLyg/PVxXKS8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm1vZHVsZW5hbWUgZG8KKyAgICAgICAgcnVsZSAvW2Etel9dXHcqL2ksIE5hbWU6Ok5hbWVzcGFjZSwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZnVuY25hbWUgZG8KKyAgICAgICAgcnVsZSAvW2EtekEtWl9dXHcqWyE/XT8vLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICBydWxlIC9ccysvLCBUZXh0CisKKyAgICAgICAgIyBhcmd1bWVudCBkZWNsYXJhdGlvbgorICAgICAgICBydWxlIC8oXChbJEAlXSpcKSkoXHMqKS8gZG8KKyAgICAgICAgICBncm91cHMgUHVuY3R1YXRpb24sIFRleHQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvLio/ey8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBydWxlIC87LywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICBlbmQKKworICAgICAgW1s6Y2IsICdceycsICdcfSddLAorICAgICAgIFs6cmIsICdcKCcsICdcKSddLAorICAgICAgIFs6c2IsICdcWycsICdcXSddLAorICAgICAgIFs6bHQsICc8JywgICc+J11dLmVhY2ggZG8gfG5hbWUsIG9wZW4sIGNsb3NlfAorICAgICAgICB0b2sgPSBTdHI6Ok90aGVyCisgICAgICAgIHN0YXRlIDoiI3tuYW1lfV9zdHJpbmciIGRvCisgICAgICAgICAgcnVsZSAvXFxbI3tvcGVufSN7Y2xvc2V9XFxdLywgdG9rCisgICAgICAgICAgcnVsZSAvXFwvLCB0b2sKKyAgICAgICAgICBydWxlKC8je29wZW59LykgeyB0b2tlbiB0b2s7IHB1c2ggfQorICAgICAgICAgIHJ1bGUgLyN7Y2xvc2V9LywgdG9rLCA6cG9wIQorICAgICAgICAgIHJ1bGUgL1teI3tvcGVufSN7Y2xvc2V9XFxdKy8sIHRvaworICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZW5kX3BhcnQgZG8KKyAgICAgICAgIyBlYXQgdGhlIHJlc3Qgb2YgdGhlIHN0cmVhbQorICAgICAgICBydWxlIC8uKy9tLCBDb21tZW50OjpQcmVwcm9jLCA6cG9wIQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9waHAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9waHAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0YTA4YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3BocC5yYgpAQCAtMCwwICsxLDE3MyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFBIUCA8IFRlbXBsYXRlTGV4ZXIKKyAgICAgIHRpdGxlICJQSFAiCisgICAgICBkZXNjICJUaGUgUEhQIHNjcmlwdGluZyBsYW5ndWFnZSAocGhwLm5ldCkiCisgICAgICB0YWcgJ3BocCcKKyAgICAgIGFsaWFzZXMgJ3BocCcsICdwaHAzJywgJ3BocDQnLCAncGhwNScKKyAgICAgIGZpbGVuYW1lcyAnKi5waHAnLCAnKi5waHBbMzQ1dF0nLCcqLnBodG1sJywKKyAgICAgICAgICAgICAgICAjIFN1cHBvcnQgRHJ1cGFsIGZpbGUgZXh0ZW5zaW9ucywgc2VlOgorICAgICAgICAgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2dpdGxhYmhxL2dpdGxhYmhxL2lzc3Vlcy84OTAwCisgICAgICAgICAgICAgICAgJyoubW9kdWxlJywgJyouaW5jJywgJyoucHJvZmlsZScsICcqLmluc3RhbGwnLCAnKi50ZXN0JworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtcGhwJworCisgICAgICBkZWZhdWx0X29wdGlvbnMgOnBhcmVudCA9PiAnaHRtbCcKKworICAgICAgZGVmIGluaXRpYWxpemUob3B0cz17fSkKKyAgICAgICAgIyBpZiB0cnV0aHksIHRoZSBsZXhlciBzdGFydHMgaGlnaGxpZ2h0aW5nIHdpdGggcGhwIGNvZGUKKyAgICAgICAgIyAobm8gPD9waHAgcmVxdWlyZWQpCisgICAgICAgIEBzdGFydF9pbmxpbmUgPSBvcHRzLmRlbGV0ZSg6c3RhcnRfaW5saW5lKQorICAgICAgICBAZnVuY25hbWVoaWdobGlnaHRpbmcgPSBvcHRzLmRlbGV0ZSg6ZnVuY25hbWVoaWdobGlnaHRpbmcpIHsgdHJ1ZSB9CisgICAgICAgIEBkaXNhYmxlZG1vZHVsZXMgPSBvcHRzLmRlbGV0ZSg6ZGlzYWJsZWRtb2R1bGVzKSB7IFtdIH0KKworICAgICAgICBzdXBlcihvcHRzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIGxvYWQgUGF0aG5hbWUubmV3KF9fRklMRV9fKS5kaXJuYW1lLmpvaW4oJ3BocC9idWlsdGlucy5yYicpCisgICAgICAgIHNlbGYuYnVpbHRpbnMKKyAgICAgIGVuZAorCisgICAgICBkZWYgYnVpbHRpbnMKKyAgICAgICAgcmV0dXJuIFtdIHVubGVzcyBAZnVuY25hbWVoaWdobGlnaHRpbmcKKworICAgICAgICBAYnVpbHRpbnMgfHw9IFNldC5uZXcudGFwIGRvIHxidWlsdGluc3wKKyAgICAgICAgICBzZWxmLmNsYXNzLmJ1aWx0aW5zLmVhY2ggZG8gfG1vZCwgZm5zfAorICAgICAgICAgICAgbmV4dCBpZiBAZGlzYWJsZWRtb2R1bGVzLmluY2x1ZGU/IG1vZAorICAgICAgICAgICAgYnVpbHRpbnMubWVyZ2UoZm5zKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3RhcnRfaW5saW5lPworICAgICAgICAhIUBzdGFydF9pbmxpbmUKKyAgICAgIGVuZAorCisgICAgICBzdGFydCBkbworICAgICAgICBwdXNoIDpwaHAgaWYgc3RhcnRfaW5saW5lPworICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIEBrZXl3b3JkcyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBhbmQgRV9QQVJTRSBvbGRfZnVuY3Rpb24gRV9FUlJPUiBvciBhcyBFX1dBUk5JTkcgcGFyZW50IGV2YWwKKyAgICAgICAgICBQSFBfT1MgYnJlYWsgZXhpdCBjYXNlIGV4dGVuZHMgUEhQX1ZFUlNJT04gY2Z1bmN0aW9uIEZBTFNFCisgICAgICAgICAgcHJpbnQgZm9yIHJlcXVpcmUgY29udGludWUgZm9yZWFjaCByZXF1aXJlX29uY2UgZGVjbGFyZSByZXR1cm4KKyAgICAgICAgICBkZWZhdWx0IHN0YXRpYyBkbyBzd2l0Y2ggZGllIHN0ZENsYXNzIGVjaG8gZWxzZSBUUlVFIGVsc2VpZgorICAgICAgICAgIHZhciBlbXB0eSBpZiB4b3IgZW5kZGVjbGFyZSBpbmNsdWRlIHZpcnR1YWwgZW5kZm9yIGluY2x1ZGVfb25jZQorICAgICAgICAgIHdoaWxlIGVuZGZvcmVhY2ggZ2xvYmFsIF9fRklMRV9fIGVuZGlmIGxpc3QgX19MSU5FX18gZW5kc3dpdGNoCisgICAgICAgICAgbmV3IF9fc2xlZXAgZW5kd2hpbGUgbm90IGFycmF5IF9fd2FrZXVwIEVfQUxMIE5VTEwgZmluYWwKKyAgICAgICAgICBwaHBfdXNlcl9maWx0ZXIgaW50ZXJmYWNlIGltcGxlbWVudHMgcHVibGljIHByaXZhdGUgcHJvdGVjdGVkCisgICAgICAgICAgYWJzdHJhY3QgY2xvbmUgdHJ5IGNhdGNoIHRocm93IHRoaXMgdXNlIG5hbWVzcGFjZSB5aWVsZAorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KHRleHQpCisgICAgICAgIHJldHVybiAxIGlmIHRleHQuc2hlYmFuZz8oJ3BocCcpCisgICAgICAgIHJldHVybiAwLjMgaWYgLzxcPyg/IXhtbCkvID1+IHRleHQKKyAgICAgICAgMAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgLzxcPyhwaHB8PSk/LywgQ29tbWVudDo6UHJlcHJvYywgOnBocAorICAgICAgICBydWxlKC8uKj8oPz08XD8pfC4qL20pIHsgZGVsZWdhdGUgcGFyZW50IH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cGhwIGRvCisgICAgICAgIHJ1bGUgL1w/Pi8sIENvbW1lbnQ6OlByZXByb2MsIDpwb3AhCisgICAgICAgICMgaGVyZWRvY3MKKyAgICAgICAgcnVsZSAvPDw8KCc/KShbYS16X11cdyopXDFcbi4qP1xuXDI7P1xuL2ltLCBTdHI6OkhlcmVkb2MKKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC8jLio/XG4vLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcigvLy4qP1xuKSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgICMgZW1wdHkgY29tbWVudCwgb3RoZXJ3aXNlIHNlZW4gYXMgdGhlIHN0YXJ0IG9mIGEgZG9jc3RyaW5nCisgICAgICAgIHJ1bGUgJXIoL1wqXCovKSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgJXIoL1wqXCouKj9cKi8pbSwgU3RyOjpEb2MKKyAgICAgICAgcnVsZSAlcigvXCouKj9cKi8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgLygtPnw6OikoXHMqKShbYS16QS1aX11bYS16QS1aMC05X10qKS8gZG8KKyAgICAgICAgICBncm91cHMgT3BlcmF0b3IsIFRleHQsIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9bfiElXiYqKz1cfDouPD5cLz9ALV0rLywgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvW1xbXF17fSgpOyxdKy8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL2NsYXNzXGIvLCBLZXl3b3JkLCA6Y2xhc3NuYW1lCisgICAgICAgICMgYW5vbnltb3VzIGZ1bmN0aW9ucworICAgICAgICBydWxlIC8oZnVuY3Rpb24pKFxzKikoPz1cKCkvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBuYW1lZCBmdW5jdGlvbnMKKyAgICAgICAgcnVsZSAvKGZ1bmN0aW9uKShccyspKCY/KShccyopLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0LCBPcGVyYXRvciwgVGV4dAorICAgICAgICAgIHB1c2ggOmZ1bmNuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhjb25zdCkoXHMrKShbYS16QS1aX11cdyopL2kgZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dCwgTmFtZTo6Q29uc3RhbnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKHRydWV8ZmFsc2V8bnVsbClcYi8sIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgIHJ1bGUgL1wkXHtcJCtbYS16X11cdypcfS9pLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBydWxlIC9cJCtbYS16X11cdyovaSwgTmFtZTo6VmFyaWFibGUKKworICAgICAgICAjIG1heSBiZSBpbnRlcmNlcHRlZCBmb3IgYnVpbHRpbiBoaWdobGlnaHRpbmcKKyAgICAgICAgcnVsZSAvW1xcYS16X11bXFxcd10qL2kgZG8gfG18CisgICAgICAgICAgbmFtZSA9IG1bMF0KKworICAgICAgICAgIGlmIHNlbGYuY2xhc3Mua2V5d29yZHMuaW5jbHVkZT8gbmFtZQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGVsc2lmIHNlbGYuYnVpbHRpbnMuaW5jbHVkZT8gbmFtZQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWU6Ok90aGVyCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhcZCtcLlxkKnxcZCpcLlxkKykoZVsrLV0/XGQrKT8vaSwgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9cZCtlWystXT9cZCsvaSwgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC8wWzAtN10rLywgTnVtOjpPY3QKKyAgICAgICAgcnVsZSAvMHhbYS1mMC05XSsvaSwgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvXGQrLywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLycoW14nXFxdKig/OlxcLlteJ1xcXSopKiknLywgU3RyOjpTaW5nbGUKKyAgICAgICAgcnVsZSAvYChbXmBcXF0qKD86XFwuW15gXFxdKikqKWAvLCBTdHI6OkJhY2t0aWNrCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnN0cmluZworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjbGFzc25hbWUgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC9bYS16X11bXFxcd10qL2ksIE5hbWU6OkNsYXNzLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmdW5jbmFtZSBkbworICAgICAgICBydWxlIC9bYS16X11cdyovaSwgTmFtZTo6RnVuY3Rpb24sIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZyBkbworICAgICAgICBydWxlIC8iLywgU3RyOjpEb3VibGUsIDpwb3AhCisgICAgICAgIHJ1bGUgL1teXFx7JCJdKy8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgL1xcKFtucnRcIiRcXF18WzAtN117MSwzfXx4WzAtOUEtRmEtZl17MSwyfSkvLAorICAgICAgICAgIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1wkW2EtekEtWl9dW2EtekEtWjAtOV9dKihcW1xTK1xdfC0+W2EtekEtWl9dW2EtekEtWjAtOV9dKik/LywgTmFtZTo6VmFyaWFibGUKKworICAgICAgICBydWxlIC9ce1wkXHsvLCBTdHI6OkludGVycG9sLCA6aW50ZXJwX2RvdWJsZQorICAgICAgICBydWxlIC9ceyg/PVwkKS8sIFN0cjo6SW50ZXJwb2wsIDppbnRlcnBfc2luZ2xlCisgICAgICAgIHJ1bGUgLyhceykoXFMrKShcfSkvIGRvCisgICAgICAgICAgZ3JvdXBzIFN0cjo6SW50ZXJwb2wsIE5hbWU6OlZhcmlhYmxlLCBTdHI6OkludGVycG9sCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1ske1xcXSsvLCBTdHI6OkRvdWJsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbnRlcnBfZG91YmxlIGRvCisgICAgICAgIHJ1bGUgL1x9XH0vLCBTdHI6OkludGVycG9sLCA6cG9wIQorICAgICAgICBtaXhpbiA6cGhwCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmludGVycF9zaW5nbGUgZG8KKyAgICAgICAgcnVsZSAvXH0vLCBTdHI6OkludGVycG9sLCA6cG9wIQorICAgICAgICBtaXhpbiA6cGhwCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3BocC9idWlsdGlucy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3BocC9idWlsdGlucy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM5ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcGhwL2J1aWx0aW5zLnJiCkBAIC0wLDAgKzEsMjA0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisjIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGByYWtlIGJ1aWx0aW5zOnBocGAKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgUEhQCisgICAgICBkZWYgc2VsZi5idWlsdGlucworICAgICAgICBAYnVpbHRpbnMgfHw9IHt9LnRhcCBkbyB8YnwKKyAgICAgICAgICBiWyJBcGFjaGUiXSA9IFNldC5uZXcgJXcoYXBhY2hlX2NoaWxkX3Rlcm1pbmF0ZSBhcGFjaGVfY2hpbGRfdGVybWluYXRlIGFwYWNoZV9nZXRfbW9kdWxlcyBhcGFjaGVfZ2V0X3ZlcnNpb24gYXBhY2hlX2dldGVudiBhcGFjaGVfbG9va3VwX3VyaSBhcGFjaGVfbm90ZSBhcGFjaGVfcmVxdWVzdF9oZWFkZXJzIGFwYWNoZV9yZXNldF90aW1lb3V0IGFwYWNoZV9yZXNwb25zZV9oZWFkZXJzIGFwYWNoZV9zZXRlbnYgZ2V0YWxsaGVhZGVycyB2aXJ0dWFsIGFwYWNoZV9jaGlsZF90ZXJtaW5hdGUpCisgICAgICAgICAgYlsiQVBDIl0gPSBTZXQubmV3ICV3KGFwY19hZGQgYXBjX2FkZCBhcGNfYmluX2R1bXAgYXBjX2Jpbl9kdW1wZmlsZSBhcGNfYmluX2xvYWQgYXBjX2Jpbl9sb2FkZmlsZSBhcGNfY2FjaGVfaW5mbyBhcGNfY2FzIGFwY19jbGVhcl9jYWNoZSBhcGNfY29tcGlsZV9maWxlIGFwY19kZWMgYXBjX2RlZmluZV9jb25zdGFudHMgYXBjX2RlbGV0ZV9maWxlIGFwY19kZWxldGUgYXBjX2V4aXN0cyBhcGNfZmV0Y2ggYXBjX2luYyBhcGNfbG9hZF9jb25zdGFudHMgYXBjX3NtYV9pbmZvIGFwY19zdG9yZSBhcGNfYWRkKQorICAgICAgICAgIGJbIkFQRCJdID0gU2V0Lm5ldyAldyhhcGRfYnJlYWtwb2ludCBhcGRfYnJlYWtwb2ludCBhcGRfY2FsbHN0YWNrIGFwZF9jbHVuayBhcGRfY29udGludWUgYXBkX2Nyb2FrIGFwZF9kdW1wX2Z1bmN0aW9uX3RhYmxlIGFwZF9kdW1wX3BlcnNpc3RlbnRfcmVzb3VyY2VzIGFwZF9kdW1wX3JlZ3VsYXJfcmVzb3VyY2VzIGFwZF9lY2hvIGFwZF9nZXRfYWN0aXZlX3N5bWJvbHMgYXBkX3NldF9wcHJvZl90cmFjZSBhcGRfc2V0X3Nlc3Npb25fdHJhY2Vfc29ja2V0IGFwZF9zZXRfc2Vzc2lvbl90cmFjZSBhcGRfc2V0X3Nlc3Npb24gb3ZlcnJpZGVfZnVuY3Rpb24gcmVuYW1lX2Z1bmN0aW9uIGFwZF9icmVha3BvaW50KQorICAgICAgICAgIGJbIkFycmF5Il0gPSBTZXQubmV3ICV3KGFycmF5X2NoYW5nZV9rZXlfY2FzZSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UgYXJyYXlfY2h1bmsgYXJyYXlfY29sdW1uIGFycmF5X2NvbWJpbmUgYXJyYXlfY291bnRfdmFsdWVzIGFycmF5X2RpZmZfYXNzb2MgYXJyYXlfZGlmZl9rZXkgYXJyYXlfZGlmZl91YXNzb2MgYXJyYXlfZGlmZl91a2V5IGFycmF5X2RpZmYgYXJyYXlfZmlsbF9rZXlzIGFycmF5X2ZpbGwgYXJyYXlfZmlsdGVyIGFycmF5X2ZsaXAgYXJyYXlfaW50ZXJzZWN0X2Fzc29jIGFycmF5X2ludGVyc2VjdF9rZXkgYXJyYXlfaW50ZXJzZWN0X3Vhc3NvYyBhcnJheV9pbnRlcnNlY3RfdWtleSBhcnJheV9pbnRlcnNlY3QgYXJyYXlfa2V5X2V4aXN0cyBhcnJheV9rZXlzIGFycmF5X21hcCBhcnJheV9tZXJnZV9yZWN1cnNpdmUgYXJyYXlfbWVyZ2UgYXJyYXlfbXVsdGlzb3J0IGFycmF5X3BhZCBhcnJheV9wb3AgYXJyYXlfcHJvZHVjdCBhcnJheV9wdXNoIGFycmF5X3JhbmQgYXJyYXlfcmVkdWNlIGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlIGFycmF5X3JlcGxhY2UgYXJyYXlfcmV2ZXJzZSBhcnJheV9zZWFyY2ggYXJyYXlfc2hpZnQgYXJyYXlfc2xpY2UgYXJyYXlfc3BsaWNlIGFycmF5X3N1bSBhcnJheV91ZGlmZl9hc3NvYyBhcnJheV91ZGlmZl91YXNzb2MgYXJyYXlfdWRpZmYgYXJyYXlfdWludGVyc2VjdF9hc3NvYyBhcnJheV91aW50ZXJzZWN0X3Vhc3NvYyBhcnJheV91aW50ZXJzZWN0IGFycmF5X3VuaXF1ZSBhcnJheV91bnNoaWZ0IGFycmF5X3ZhbHVlcyBhcnJheV93YWxrX3JlY3Vyc2l2ZSBhcnJheV93YWxrIGFycmF5IGFyc29ydCBhc29ydCBjb21wYWN0IGNvdW50IGN1cnJlbnQgZWFjaCBlbmQgZXh0cmFjdCBpbl9hcnJheSBrZXlfZXhpc3RzIGtleSBrcnNvcnQga3NvcnQgbGlzdCBuYXRjYXNlc29ydCBuYXRzb3J0IG5leHQgcG9zIHByZXYgcmFuZ2UgcmVzZXQgcnNvcnQgc2h1ZmZsZSBzaXplb2Ygc29ydCB1YXNvcnQgdWtzb3J0IHVzb3J0IGFycmF5X2NoYW5nZV9rZXlfY2FzZSkKKyAgICAgICAgICBiWyJCQkNvZGUiXSA9IFNldC5uZXcgJXcoYmJjb2RlX2FkZF9lbGVtZW50IGJiY29kZV9hZGRfZWxlbWVudCBiYmNvZGVfYWRkX3NtaWxleSBiYmNvZGVfY3JlYXRlIGJiY29kZV9kZXN0cm95IGJiY29kZV9wYXJzZSBiYmNvZGVfc2V0X2FyZ19wYXJzZXIgYmJjb2RlX3NldF9mbGFncyBiYmNvZGVfYWRkX2VsZW1lbnQpCisgICAgICAgICAgYlsiQkMgTWF0aCJdID0gU2V0Lm5ldyAldyhiY2FkZCBiY2FkZCBiY2NvbXAgYmNkaXYgYmNtb2QgYmNtdWwgYmNwb3cgYmNwb3dtb2QgYmNzY2FsZSBiY3NxcnQgYmNzdWIgYmNhZGQpCisgICAgICAgICAgYlsiYmNvbXBpbGVyIl0gPSBTZXQubmV3ICV3KGJjb21waWxlcl9sb2FkX2V4ZSBiY29tcGlsZXJfbG9hZF9leGUgYmNvbXBpbGVyX2xvYWQgYmNvbXBpbGVyX3BhcnNlX2NsYXNzIGJjb21waWxlcl9yZWFkIGJjb21waWxlcl93cml0ZV9jbGFzcyBiY29tcGlsZXJfd3JpdGVfY29uc3RhbnQgYmNvbXBpbGVyX3dyaXRlX2V4ZV9mb290ZXIgYmNvbXBpbGVyX3dyaXRlX2ZpbGUgYmNvbXBpbGVyX3dyaXRlX2Zvb3RlciBiY29tcGlsZXJfd3JpdGVfZnVuY3Rpb24gYmNvbXBpbGVyX3dyaXRlX2Z1bmN0aW9uc19mcm9tX2ZpbGUgYmNvbXBpbGVyX3dyaXRlX2hlYWRlciBiY29tcGlsZXJfd3JpdGVfaW5jbHVkZWRfZmlsZW5hbWUgYmNvbXBpbGVyX2xvYWRfZXhlKQorICAgICAgICAgIGJbIkJsZW5jIl0gPSBTZXQubmV3ICV3KGJsZW5jX2VuY3J5cHQgYmxlbmNfZW5jcnlwdCBibGVuY19lbmNyeXB0KQorICAgICAgICAgIGJbIkJ6aXAyIl0gPSBTZXQubmV3ICV3KGJ6Y2xvc2UgYnpjbG9zZSBiemNvbXByZXNzIGJ6ZGVjb21wcmVzcyBiemVycm5vIGJ6ZXJyb3IgYnplcnJzdHIgYnpmbHVzaCBiem9wZW4gYnpyZWFkIGJ6d3JpdGUgYnpjbG9zZSkKKyAgICAgICAgICBiWyJDYWlybyJdID0gU2V0Lm5ldyAldyhjYWlyb19jcmVhdGUgY2Fpcm9fY3JlYXRlIGNhaXJvX2ZvbnRfZmFjZV9nZXRfdHlwZSBjYWlyb19mb250X2ZhY2Vfc3RhdHVzIGNhaXJvX2ZvbnRfb3B0aW9uc19jcmVhdGUgY2Fpcm9fZm9udF9vcHRpb25zX2VxdWFsIGNhaXJvX2ZvbnRfb3B0aW9uc19nZXRfYW50aWFsaWFzIGNhaXJvX2ZvbnRfb3B0aW9uc19nZXRfaGludF9tZXRyaWNzIGNhaXJvX2ZvbnRfb3B0aW9uc19nZXRfaGludF9zdHlsZSBjYWlyb19mb250X29wdGlvbnNfZ2V0X3N1YnBpeGVsX29yZGVyIGNhaXJvX2ZvbnRfb3B0aW9uc19oYXNoIGNhaXJvX2ZvbnRfb3B0aW9uc19tZXJnZSBjYWlyb19mb250X29wdGlvbnNfc2V0X2FudGlhbGlhcyBjYWlyb19mb250X29wdGlvbnNfc2V0X2hpbnRfbWV0cmljcyBjYWlyb19mb250X29wdGlvbnNfc2V0X2hpbnRfc3R5bGUgY2Fpcm9fZm9udF9vcHRpb25zX3NldF9zdWJwaXhlbF9vcmRlciBjYWlyb19mb250X29wdGlvbnNfc3RhdHVzIGNhaXJvX2Zvcm1hdF9zdHJpZGVfZm9yX3dpZHRoIGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zvcl9kYXRhIGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zyb21fcG5nIGNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlIGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2RhdGEgY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfZm9ybWF0IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2hlaWdodCBjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9zdHJpZGUgY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lkdGggY2Fpcm9fbWF0cml4X2NyZWF0ZV9zY2FsZSBjYWlyb19tYXRyaXhfY3JlYXRlX3RyYW5zbGF0ZSBjYWlyb19tYXRyaXhfaW52ZXJ0IGNhaXJvX21hdHJpeF9tdWx0aXBseSBjYWlyb19tYXRyaXhfcm90YXRlIGNhaXJvX21hdHJpeF90cmFuc2Zvcm1fZGlzdGFuY2UgY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9wb2ludCBjYWlyb19tYXRyaXhfdHJhbnNsYXRlIGNhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiIGNhaXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYSBjYWlyb19wYXR0ZXJuX2NyZWF0ZV9mb3Jfc3VyZmFjZSBjYWlyb19wYXR0ZXJuX2NyZWF0ZV9saW5lYXIgY2Fpcm9fcGF0dGVybl9jcmVhdGVfcmFkaWFsIGNhaXJvX3BhdHRlcm5fY3JlYXRlX3JnYiBjYWlyb19wYXR0ZXJuX2NyZWF0ZV9yZ2JhIGNhaXJvX3BhdHRlcm5fZ2V0X2NvbG9yX3N0b3BfY291bnQgY2Fpcm9fcGF0dGVybl9nZXRfY29sb3Jfc3RvcF9yZ2JhIGNhaXJvX3BhdHRlcm5fZ2V0X2V4dGVuZCBjYWlyb19wYXR0ZXJuX2dldF9maWx0ZXIgY2Fpcm9fcGF0dGVybl9nZXRfbGluZWFyX3BvaW50cyBjYWlyb19wYXR0ZXJuX2dldF9tYXRyaXggY2Fpcm9fcGF0dGVybl9nZXRfcmFkaWFsX2NpcmNsZXMgY2Fpcm9fcGF0dGVybl9nZXRfcmdiYSBjYWlyb19wYXR0ZXJuX2dldF9zdXJmYWNlIGNhaXJvX3BhdHRlcm5fZ2V0X3R5cGUgY2Fpcm9fcGF0dGVybl9zZXRfZXh0ZW5kIGNhaXJvX3BhdHRlcm5fc2V0X2ZpbHRlciBjYWlyb19wYXR0ZXJuX3NldF9tYXRyaXggY2Fpcm9fcGF0dGVybl9zdGF0dXMgY2Fpcm9fcGRmX3N1cmZhY2VfY3JlYXRlIGNhaXJvX3BkZl9zdXJmYWNlX3NldF9zaXplIGNhaXJvX3BzX2dldF9sZXZlbHMgY2Fpcm9fcHNfbGV2ZWxfdG9fc3RyaW5nIGNhaXJvX3BzX3N1cmZhY2VfY3JlYXRlIGNhaXJvX3BzX3N1cmZhY2VfZHNjX2JlZ2luX3BhZ2Vfc2V0dXAgY2Fpcm9fcHNfc3VyZmFjZV9kc2NfYmVnaW5fc2V0dXAgY2Fpcm9fcHNfc3VyZmFjZV9kc2NfY29tbWVudCBjYWlyb19wc19zdXJmYWNlX2dldF9lcHMgY2Fpcm9fcHNfc3VyZmFjZV9yZXN0cmljdF90b19sZXZlbCBjYWlyb19wc19zdXJmYWNlX3NldF9lcHMgY2Fpcm9fcHNfc3VyZmFjZV9zZXRfc2l6ZSBjYWlyb19zY2FsZWRfZm9udF9jcmVhdGUgY2Fpcm9fc2NhbGVkX2ZvbnRfZXh0ZW50cyBjYWlyb19zY2FsZWRfZm9udF9nZXRfY3RtIGNhaXJvX3NjYWxlZF9mb250X2dldF9mb250X2ZhY2UgY2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X2ZvbnRfbWF0cml4IGNhaXJvX3NjYWxlZF9mb250X2dldF9mb250X29wdGlvbnMgY2Fpcm9fc2NhbGVkX2ZvbnRfZ2V0X3NjYWxlX21hdHJpeCBjYWlyb19zY2FsZWRfZm9udF9nZXRfdHlwZSBjYWlyb19zY2FsZWRfZm9udF9nbHlwaF9leHRlbnRzIGNhaXJvX3NjYWxlZF9mb250X3N0YXR1cyBjYWlyb19zY2FsZWRfZm9udF90ZXh0X2V4dGVudHMgY2Fpcm9fc3VyZmFjZV9jb3B5X3BhZ2UgY2Fpcm9fc3VyZmFjZV9jcmVhdGVfc2ltaWxhciBjYWlyb19zdXJmYWNlX2ZpbmlzaCBjYWlyb19zdXJmYWNlX2ZsdXNoIGNhaXJvX3N1cmZhY2VfZ2V0X2NvbnRlbnQgY2Fpcm9fc3VyZmFjZV9nZXRfZGV2aWNlX29mZnNldCBjYWlyb19zdXJmYWNlX2dldF9mb250X29wdGlvbnMgY2Fpcm9fc3VyZmFjZV9nZXRfdHlwZSBjYWlyb19zdXJmYWNlX21hcmtfZGlydHlfcmVjdGFuZ2xlIGNhaXJvX3N1cmZhY2VfbWFya19kaXJ0eSBjYWlyb19zdXJmYWNlX3NldF9kZXZpY2Vfb2Zmc2V0IGNhaXJvX3N1cmZhY2Vfc2V0X2ZhbGxiYWNrX3Jlc29sdXRpb24gY2Fpcm9fc3VyZmFjZV9zaG93X3BhZ2UgY2Fpcm9fc3VyZmFjZV9zdGF0dXMgY2Fpcm9fc3VyZmFjZV93cml0ZV90b19wbmcgY2Fpcm9fc3ZnX3N1cmZhY2VfY3JlYXRlIGNhaXJvX3N2Z19zdXJmYWNlX3Jlc3RyaWN0X3RvX3ZlcnNpb24gY2Fpcm9fc3ZnX3ZlcnNpb25fdG9fc3RyaW5nIGNhaXJvX2NyZWF0ZSkKKyAgICAgICAgICBiWyJDYWxlbmRhciJdID0gU2V0Lm5ldyAldyhjYWxfZGF5c19pbl9tb250aCBjYWxfZGF5c19pbl9tb250aCBjYWxfZnJvbV9qZCBjYWxfaW5mbyBjYWxfdG9famQgZWFzdGVyX2RhdGUgZWFzdGVyX2RheXMgRnJlbmNoVG9KRCBHcmVnb3JpYW5Ub0pEIEpERGF5T2ZXZWVrIEpETW9udGhOYW1lIEpEVG9GcmVuY2ggSkRUb0dyZWdvcmlhbiBqZHRvamV3aXNoIEpEVG9KdWxpYW4gamR0b3VuaXggSmV3aXNoVG9KRCBKdWxpYW5Ub0pEIHVuaXh0b2pkIGNhbF9kYXlzX2luX21vbnRoKQorICAgICAgICAgIGJbImNoZGIiXSA9IFNldC5uZXcgJXcoY2hkYl9jcmVhdGUgY2hkYl9jcmVhdGUgY2hkYl9jcmVhdGUpCisgICAgICAgICAgYlsiQ2xhc3NraXQiXSA9IFNldC5uZXcgJXcoY2xhc3NraXRfaW1wb3J0IGNsYXNza2l0X2ltcG9ydCBjbGFzc2tpdF9tZXRob2RfYWRkIGNsYXNza2l0X21ldGhvZF9jb3B5IGNsYXNza2l0X21ldGhvZF9yZWRlZmluZSBjbGFzc2tpdF9tZXRob2RfcmVtb3ZlIGNsYXNza2l0X21ldGhvZF9yZW5hbWUgY2xhc3NraXRfaW1wb3J0KQorICAgICAgICAgIGJbIkNsYXNzZXMvT2JqZWN0Il0gPSBTZXQubmV3ICV3KF9fYXV0b2xvYWQgX19hdXRvbG9hZCBjYWxsX3VzZXJfbWV0aG9kX2FycmF5IGNhbGxfdXNlcl9tZXRob2QgY2xhc3NfYWxpYXMgY2xhc3NfZXhpc3RzIGdldF9jYWxsZWRfY2xhc3MgZ2V0X2NsYXNzX21ldGhvZHMgZ2V0X2NsYXNzX3ZhcnMgZ2V0X2NsYXNzIGdldF9kZWNsYXJlZF9jbGFzc2VzIGdldF9kZWNsYXJlZF9pbnRlcmZhY2VzIGdldF9kZWNsYXJlZF90cmFpdHMgZ2V0X29iamVjdF92YXJzIGdldF9wYXJlbnRfY2xhc3MgaW50ZXJmYWNlX2V4aXN0cyBpc19hIGlzX3N1YmNsYXNzX29mIG1ldGhvZF9leGlzdHMgcHJvcGVydHlfZXhpc3RzIHRyYWl0X2V4aXN0cyBfX2F1dG9sb2FkKQorICAgICAgICAgIGJbIkNPTSJdID0gU2V0Lm5ldyAldyhjb21fYWRkcmVmIGNvbV9hZGRyZWYgY29tX2NyZWF0ZV9ndWlkIGNvbV9ldmVudF9zaW5rIGNvbV9nZXRfYWN0aXZlX29iamVjdCBjb21fZ2V0IGNvbV9pbnZva2UgY29tX2lzZW51bSBjb21fbG9hZF90eXBlbGliIGNvbV9sb2FkIGNvbV9tZXNzYWdlX3B1bXAgY29tX3ByaW50X3R5cGVpbmZvIGNvbV9wcm9wZ2V0IGNvbV9wcm9wcHV0IGNvbV9wcm9wc2V0IGNvbV9yZWxlYXNlIGNvbV9zZXQgdmFyaWFudF9hYnMgdmFyaWFudF9hZGQgdmFyaWFudF9hbmQgdmFyaWFudF9jYXN0IHZhcmlhbnRfY2F0IHZhcmlhbnRfY21wIHZhcmlhbnRfZGF0ZV9mcm9tX3RpbWVzdGFtcCB2YXJpYW50X2RhdGVfdG9fdGltZXN0YW1wIHZhcmlhbnRfZGl2IHZhcmlhbnRfZXF2IHZhcmlhbnRfZml4IHZhcmlhbnRfZ2V0X3R5cGUgdmFyaWFudF9pZGl2IHZhcmlhbnRfaW1wIHZhcmlhbnRfaW50IHZhcmlhbnRfbW9kIHZhcmlhbnRfbXVsIHZhcmlhbnRfbmVnIHZhcmlhbnRfbm90IHZhcmlhbnRfb3IgdmFyaWFudF9wb3cgdmFyaWFudF9yb3VuZCB2YXJpYW50X3NldF90eXBlIHZhcmlhbnRfc2V0IHZhcmlhbnRfc3ViIHZhcmlhbnRfeG9yIGNvbV9hZGRyZWYpCisgICAgICAgICAgYlsiQ3JhY2siXSA9IFNldC5uZXcgJXcoY3JhY2tfY2hlY2sgY3JhY2tfY2hlY2sgY3JhY2tfY2xvc2VkaWN0IGNyYWNrX2dldGxhc3RtZXNzYWdlIGNyYWNrX29wZW5kaWN0IGNyYWNrX2NoZWNrKQorICAgICAgICAgIGJbIkN0eXBlIl0gPSBTZXQubmV3ICV3KGN0eXBlX2FsbnVtIGN0eXBlX2FsbnVtIGN0eXBlX2FscGhhIGN0eXBlX2NudHJsIGN0eXBlX2RpZ2l0IGN0eXBlX2dyYXBoIGN0eXBlX2xvd2VyIGN0eXBlX3ByaW50IGN0eXBlX3B1bmN0IGN0eXBlX3NwYWNlIGN0eXBlX3VwcGVyIGN0eXBlX3hkaWdpdCBjdHlwZV9hbG51bSkKKyAgICAgICAgICBiWyJDVUJSSUQiXSA9IFNldC5uZXcgJXcoY3VicmlkX2JpbmQgY3VicmlkX2JpbmQgY3VicmlkX2Nsb3NlX3ByZXBhcmUgY3VicmlkX2Nsb3NlX3JlcXVlc3QgY3VicmlkX2NvbF9nZXQgY3VicmlkX2NvbF9zaXplIGN1YnJpZF9jb2x1bW5fbmFtZXMgY3VicmlkX2NvbHVtbl90eXBlcyBjdWJyaWRfY29tbWl0IGN1YnJpZF9jb25uZWN0X3dpdGhfdXJsIGN1YnJpZF9jb25uZWN0IGN1YnJpZF9jdXJyZW50X29pZCBjdWJyaWRfZGlzY29ubmVjdCBjdWJyaWRfZHJvcCBjdWJyaWRfZXJyb3JfY29kZV9mYWNpbGl0eSBjdWJyaWRfZXJyb3JfY29kZSBjdWJyaWRfZXJyb3JfbXNnIGN1YnJpZF9leGVjdXRlIGN1YnJpZF9mZXRjaCBjdWJyaWRfZnJlZV9yZXN1bHQgY3VicmlkX2dldF9hdXRvY29tbWl0IGN1YnJpZF9nZXRfY2hhcnNldCBjdWJyaWRfZ2V0X2NsYXNzX25hbWUgY3VicmlkX2dldF9jbGllbnRfaW5mbyBjdWJyaWRfZ2V0X2RiX3BhcmFtZXRlciBjdWJyaWRfZ2V0X3F1ZXJ5X3RpbWVvdXQgY3VicmlkX2dldF9zZXJ2ZXJfaW5mbyBjdWJyaWRfZ2V0IGN1YnJpZF9pbnNlcnRfaWQgY3VicmlkX2lzX2luc3RhbmNlIGN1YnJpZF9sb2JfY2xvc2UgY3VicmlkX2xvYl9leHBvcnQgY3VicmlkX2xvYl9nZXQgY3VicmlkX2xvYl9zZW5kIGN1YnJpZF9sb2Jfc2l6ZSBjdWJyaWRfbG9iMl9iaW5kIGN1YnJpZF9sb2IyX2Nsb3NlIGN1YnJpZF9sb2IyX2V4cG9ydCBjdWJyaWRfbG9iMl9pbXBvcnQgY3VicmlkX2xvYjJfbmV3IGN1YnJpZF9sb2IyX3JlYWQgY3VicmlkX2xvYjJfc2VlazY0IGN1YnJpZF9sb2IyX3NlZWsgY3VicmlkX2xvYjJfc2l6ZTY0IGN1YnJpZF9sb2IyX3NpemUgY3VicmlkX2xvYjJfdGVsbDY0IGN1YnJpZF9sb2IyX3RlbGwgY3VicmlkX2xvYjJfd3JpdGUgY3VicmlkX2xvY2tfcmVhZCBjdWJyaWRfbG9ja193cml0ZSBjdWJyaWRfbW92ZV9jdXJzb3IgY3VicmlkX25leHRfcmVzdWx0IGN1YnJpZF9udW1fY29scyBjdWJyaWRfbnVtX3Jvd3MgY3VicmlkX3Bjb25uZWN0X3dpdGhfdXJsIGN1YnJpZF9wY29ubmVjdCBjdWJyaWRfcHJlcGFyZSBjdWJyaWRfcHV0IGN1YnJpZF9yb2xsYmFjayBjdWJyaWRfc2NoZW1hIGN1YnJpZF9zZXFfZHJvcCBjdWJyaWRfc2VxX2luc2VydCBjdWJyaWRfc2VxX3B1dCBjdWJyaWRfc2V0X2FkZCBjdWJyaWRfc2V0X2F1dG9jb21taXQgY3VicmlkX3NldF9kYl9wYXJhbWV0ZXIgY3VicmlkX3NldF9kcm9wIGN1YnJpZF9zZXRfcXVlcnlfdGltZW91dCBjdWJyaWRfdmVyc2lvbiBjdWJyaWRfYmluZCkKKyAgICAgICAgICBiWyJjVVJMIl0gPSBTZXQubmV3ICV3KGN1cmxfY2xvc2UgY3VybF9jbG9zZSBjdXJsX2NvcHlfaGFuZGxlIGN1cmxfZXJybm8gY3VybF9lcnJvciBjdXJsX2VzY2FwZSBjdXJsX2V4ZWMgY3VybF9maWxlX2NyZWF0ZSBjdXJsX2dldGluZm8gY3VybF9pbml0IGN1cmxfbXVsdGlfYWRkX2hhbmRsZSBjdXJsX211bHRpX2Nsb3NlIGN1cmxfbXVsdGlfZXhlYyBjdXJsX211bHRpX2dldGNvbnRlbnQgY3VybF9tdWx0aV9pbmZvX3JlYWQgY3VybF9tdWx0aV9pbml0IGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSBjdXJsX211bHRpX3NlbGVjdCBjdXJsX211bHRpX3NldG9wdCBjdXJsX211bHRpX3N0cmVycm9yIGN1cmxfcGF1c2UgY3VybF9yZXNldCBjdXJsX3NldG9wdF9hcnJheSBjdXJsX3NldG9wdCBjdXJsX3NoYXJlX2Nsb3NlIGN1cmxfc2hhcmVfaW5pdCBjdXJsX3NoYXJlX3NldG9wdCBjdXJsX3N0cmVycm9yIGN1cmxfdW5lc2NhcGUgY3VybF92ZXJzaW9uIGN1cmxfY2xvc2UpCisgICAgICAgICAgYlsiQ3lydXMiXSA9IFNldC5uZXcgJXcoY3lydXNfYXV0aGVudGljYXRlIGN5cnVzX2F1dGhlbnRpY2F0ZSBjeXJ1c19iaW5kIGN5cnVzX2Nsb3NlIGN5cnVzX2Nvbm5lY3QgY3lydXNfcXVlcnkgY3lydXNfdW5iaW5kIGN5cnVzX2F1dGhlbnRpY2F0ZSkKKyAgICAgICAgICBiWyJEYXRlL1RpbWUiXSA9IFNldC5uZXcgJXcoY2hlY2tkYXRlIGNoZWNrZGF0ZSBkYXRlX2FkZCBkYXRlX2NyZWF0ZV9mcm9tX2Zvcm1hdCBkYXRlX2NyZWF0ZV9pbW11dGFibGVfZnJvbV9mb3JtYXQgZGF0ZV9jcmVhdGVfaW1tdXRhYmxlIGRhdGVfY3JlYXRlIGRhdGVfZGF0ZV9zZXQgZGF0ZV9kZWZhdWx0X3RpbWV6b25lX2dldCBkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0IGRhdGVfZGlmZiBkYXRlX2Zvcm1hdCBkYXRlX2dldF9sYXN0X2Vycm9ycyBkYXRlX2ludGVydmFsX2NyZWF0ZV9mcm9tX2RhdGVfc3RyaW5nIGRhdGVfaW50ZXJ2YWxfZm9ybWF0IGRhdGVfaXNvZGF0ZV9zZXQgZGF0ZV9tb2RpZnkgZGF0ZV9vZmZzZXRfZ2V0IGRhdGVfcGFyc2VfZnJvbV9mb3JtYXQgZGF0ZV9wYXJzZSBkYXRlX3N1YiBkYXRlX3N1bl9pbmZvIGRhdGVfc3VucmlzZSBkYXRlX3N1bnNldCBkYXRlX3RpbWVfc2V0IGRhdGVfdGltZXN0YW1wX2dldCBkYXRlX3RpbWVzdGFtcF9zZXQgZGF0ZV90aW1lem9uZV9nZXQgZGF0ZV90aW1lem9uZV9zZXQgZGF0ZSBnZXRkYXRlIGdldHRpbWVvZmRheSBnbWRhdGUgZ21ta3RpbWUgZ21zdHJmdGltZSBpZGF0ZSBsb2NhbHRpbWUgbWljcm90aW1lIG1rdGltZSBzdHJmdGltZSBzdHJwdGltZSBzdHJ0b3RpbWUgdGltZSB0aW1lem9uZV9hYmJyZXZpYXRpb25zX2xpc3QgdGltZXpvbmVfaWRlbnRpZmllcnNfbGlzdCB0aW1lem9uZV9sb2NhdGlvbl9nZXQgdGltZXpvbmVfbmFtZV9mcm9tX2FiYnIgdGltZXpvbmVfbmFtZV9nZXQgdGltZXpvbmVfb2Zmc2V0X2dldCB0aW1lem9uZV9vcGVuIHRpbWV6b25lX3RyYW5zaXRpb25zX2dldCB0aW1lem9uZV92ZXJzaW9uX2dldCBjaGVja2RhdGUpCisgICAgICAgICAgYlsiREJBIl0gPSBTZXQubmV3ICV3KGRiYV9jbG9zZSBkYmFfY2xvc2UgZGJhX2RlbGV0ZSBkYmFfZXhpc3RzIGRiYV9mZXRjaCBkYmFfZmlyc3RrZXkgZGJhX2hhbmRsZXJzIGRiYV9pbnNlcnQgZGJhX2tleV9zcGxpdCBkYmFfbGlzdCBkYmFfbmV4dGtleSBkYmFfb3BlbiBkYmFfb3B0aW1pemUgZGJhX3BvcGVuIGRiYV9yZXBsYWNlIGRiYV9zeW5jIGRiYV9jbG9zZSkKKyAgICAgICAgICBiWyJkQmFzZSJdID0gU2V0Lm5ldyAldyhkYmFzZV9hZGRfcmVjb3JkIGRiYXNlX2FkZF9yZWNvcmQgZGJhc2VfY2xvc2UgZGJhc2VfY3JlYXRlIGRiYXNlX2RlbGV0ZV9yZWNvcmQgZGJhc2VfZ2V0X2hlYWRlcl9pbmZvIGRiYXNlX2dldF9yZWNvcmRfd2l0aF9uYW1lcyBkYmFzZV9nZXRfcmVjb3JkIGRiYXNlX251bWZpZWxkcyBkYmFzZV9udW1yZWNvcmRzIGRiYXNlX29wZW4gZGJhc2VfcGFjayBkYmFzZV9yZXBsYWNlX3JlY29yZCBkYmFzZV9hZGRfcmVjb3JkKQorICAgICAgICAgIGJbIkRCKysiXSA9IFNldC5uZXcgJXcoZGJwbHVzX2FkZCBkYnBsdXNfYWRkIGRicGx1c19hcWwgZGJwbHVzX2NoZGlyIGRicGx1c19jbG9zZSBkYnBsdXNfY3VyciBkYnBsdXNfZXJyY29kZSBkYnBsdXNfZXJybm8gZGJwbHVzX2ZpbmQgZGJwbHVzX2ZpcnN0IGRicGx1c19mbHVzaCBkYnBsdXNfZnJlZWFsbGxvY2tzIGRicGx1c19mcmVlbG9jayBkYnBsdXNfZnJlZXJsb2NrcyBkYnBsdXNfZ2V0bG9jayBkYnBsdXNfZ2V0dW5pcXVlIGRicGx1c19pbmZvIGRicGx1c19sYXN0IGRicGx1c19sb2NrcmVsIGRicGx1c19uZXh0IGRicGx1c19vcGVuIGRicGx1c19wcmV2IGRicGx1c19yY2hwZXJtIGRicGx1c19yY3JlYXRlIGRicGx1c19yY3J0ZXhhY3QgZGJwbHVzX3JjcnRsaWtlIGRicGx1c19yZXNvbHZlIGRicGx1c19yZXN0b3JlcG9zIGRicGx1c19ya2V5cyBkYnBsdXNfcm9wZW4gZGJwbHVzX3JxdWVyeSBkYnBsdXNfcnJlbmFtZSBkYnBsdXNfcnNlY2luZGV4IGRicGx1c19ydW5saW5rIGRicGx1c19yemFwIGRicGx1c19zYXZlcG9zIGRicGx1c19zZXRpbmRleCBkYnBsdXNfc2V0aW5kZXhieW51bWJlciBkYnBsdXNfc3FsIGRicGx1c190Y2wgZGJwbHVzX3RyZW1vdmUgZGJwbHVzX3VuZG8gZGJwbHVzX3VuZG9wcmVwYXJlIGRicGx1c191bmxvY2tyZWwgZGJwbHVzX3Vuc2VsZWN0IGRicGx1c191cGRhdGUgZGJwbHVzX3hsb2NrcmVsIGRicGx1c194dW5sb2NrcmVsIGRicGx1c19hZGQpCisgICAgICAgICAgYlsiZGJ4Il0gPSBTZXQubmV3ICV3KGRieF9jbG9zZSBkYnhfY2xvc2UgZGJ4X2NvbXBhcmUgZGJ4X2Nvbm5lY3QgZGJ4X2Vycm9yIGRieF9lc2NhcGVfc3RyaW5nIGRieF9mZXRjaF9yb3cgZGJ4X3F1ZXJ5IGRieF9zb3J0IGRieF9jbG9zZSkKKyAgICAgICAgICBiWyJEaXJlY3QgSU8iXSA9IFNldC5uZXcgJXcoZGlvX2Nsb3NlIGRpb19jbG9zZSBkaW9fZmNudGwgZGlvX29wZW4gZGlvX3JlYWQgZGlvX3NlZWsgZGlvX3N0YXQgZGlvX3Rjc2V0YXR0ciBkaW9fdHJ1bmNhdGUgZGlvX3dyaXRlIGRpb19jbG9zZSkKKyAgICAgICAgICBiWyJEaXJlY3RvcnkiXSA9IFNldC5uZXcgJXcoY2hkaXIgY2hkaXIgY2hyb290IGNsb3NlZGlyIGRpciBnZXRjd2Qgb3BlbmRpciByZWFkZGlyIHJld2luZGRpciBzY2FuZGlyIGNoZGlyKQorICAgICAgICAgIGJbIkRPTSJdID0gU2V0Lm5ldyAldyhkb21faW1wb3J0X3NpbXBsZXhtbCBkb21faW1wb3J0X3NpbXBsZXhtbCBkb21faW1wb3J0X3NpbXBsZXhtbCkKKyAgICAgICAgICBiWyIuTkVUIl0gPSBTZXQubmV3ICV3KGRvdG5ldF9sb2FkIGRvdG5ldF9sb2FkIGRvdG5ldF9sb2FkKQorICAgICAgICAgIGJbIkVpbyJdID0gU2V0Lm5ldyAldyhlaW9fYnVzeSBlaW9fYnVzeSBlaW9fY2FuY2VsIGVpb19jaG1vZCBlaW9fY2hvd24gZWlvX2Nsb3NlIGVpb19jdXN0b20gZWlvX2R1cDIgZWlvX2V2ZW50X2xvb3AgZWlvX2ZhbGxvY2F0ZSBlaW9fZmNobW9kIGVpb19mY2hvd24gZWlvX2ZkYXRhc3luYyBlaW9fZnN0YXQgZWlvX2ZzdGF0dmZzIGVpb19mc3luYyBlaW9fZnRydW5jYXRlIGVpb19mdXRpbWUgZWlvX2dldF9ldmVudF9zdHJlYW0gZWlvX2dldF9sYXN0X2Vycm9yIGVpb19ncnBfYWRkIGVpb19ncnBfY2FuY2VsIGVpb19ncnBfbGltaXQgZWlvX2dycCBlaW9faW5pdCBlaW9fbGluayBlaW9fbHN0YXQgZWlvX21rZGlyIGVpb19ta25vZCBlaW9fbm9wIGVpb19ucGVuZGluZyBlaW9fbnJlYWR5IGVpb19ucmVxcyBlaW9fbnRocmVhZHMgZWlvX29wZW4gZWlvX3BvbGwgZWlvX3JlYWQgZWlvX3JlYWRhaGVhZCBlaW9fcmVhZGRpciBlaW9fcmVhZGxpbmsgZWlvX3JlYWxwYXRoIGVpb19yZW5hbWUgZWlvX3JtZGlyIGVpb19zZWVrIGVpb19zZW5kZmlsZSBlaW9fc2V0X21heF9pZGxlIGVpb19zZXRfbWF4X3BhcmFsbGVsIGVpb19zZXRfbWF4X3BvbGxfcmVxcyBlaW9fc2V0X21heF9wb2xsX3RpbWUgZWlvX3NldF9taW5fcGFyYWxsZWwgZWlvX3N0YXQgZWlvX3N0YXR2ZnMgZWlvX3N5bWxpbmsgZWlvX3N5bmNfZmlsZV9yYW5nZSBlaW9fc3luYyBlaW9fc3luY2ZzIGVpb190cnVuY2F0ZSBlaW9fdW5saW5rIGVpb191dGltZSBlaW9fd3JpdGUgZWlvX2J1c3kpCisgICAgICAgICAgYlsiRW5jaGFudCJdID0gU2V0Lm5ldyAldyhlbmNoYW50X2Jyb2tlcl9kZXNjcmliZSBlbmNoYW50X2Jyb2tlcl9kZXNjcmliZSBlbmNoYW50X2Jyb2tlcl9kaWN0X2V4aXN0cyBlbmNoYW50X2Jyb2tlcl9mcmVlX2RpY3QgZW5jaGFudF9icm9rZXJfZnJlZSBlbmNoYW50X2Jyb2tlcl9nZXRfZXJyb3IgZW5jaGFudF9icm9rZXJfaW5pdCBlbmNoYW50X2Jyb2tlcl9saXN0X2RpY3RzIGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfZGljdCBlbmNoYW50X2Jyb2tlcl9yZXF1ZXN0X3B3bF9kaWN0IGVuY2hhbnRfYnJva2VyX3NldF9vcmRlcmluZyBlbmNoYW50X2RpY3RfYWRkX3RvX3BlcnNvbmFsIGVuY2hhbnRfZGljdF9hZGRfdG9fc2Vzc2lvbiBlbmNoYW50X2RpY3RfY2hlY2sgZW5jaGFudF9kaWN0X2Rlc2NyaWJlIGVuY2hhbnRfZGljdF9nZXRfZXJyb3IgZW5jaGFudF9kaWN0X2lzX2luX3Nlc3Npb24gZW5jaGFudF9kaWN0X3F1aWNrX2NoZWNrIGVuY2hhbnRfZGljdF9zdG9yZV9yZXBsYWNlbWVudCBlbmNoYW50X2RpY3Rfc3VnZ2VzdCBlbmNoYW50X2Jyb2tlcl9kZXNjcmliZSkKKyAgICAgICAgICBiWyJFcnJvciBIYW5kbGluZyJdID0gU2V0Lm5ldyAldyhkZWJ1Z19iYWNrdHJhY2UgZGVidWdfYmFja3RyYWNlIGRlYnVnX3ByaW50X2JhY2t0cmFjZSBlcnJvcl9nZXRfbGFzdCBlcnJvcl9sb2cgZXJyb3JfcmVwb3J0aW5nIHJlc3RvcmVfZXJyb3JfaGFuZGxlciByZXN0b3JlX2V4Y2VwdGlvbl9oYW5kbGVyIHNldF9lcnJvcl9oYW5kbGVyIHNldF9leGNlcHRpb25faGFuZGxlciB0cmlnZ2VyX2Vycm9yIHVzZXJfZXJyb3IgZGVidWdfYmFja3RyYWNlKQorICAgICAgICAgIGJbIlByb2dyYW0gZXhlY3V0aW9uIl0gPSBTZXQubmV3ICV3KGVzY2FwZXNoZWxsYXJnIGVzY2FwZXNoZWxsYXJnIGVzY2FwZXNoZWxsY21kIGV4ZWMgcGFzc3RocnUgcHJvY19jbG9zZSBwcm9jX2dldF9zdGF0dXMgcHJvY19uaWNlIHByb2Nfb3BlbiBwcm9jX3Rlcm1pbmF0ZSBzaGVsbF9leGVjIHN5c3RlbSBlc2NhcGVzaGVsbGFyZykKKyAgICAgICAgICBiWyJFeGlmIl0gPSBTZXQubmV3ICV3KGV4aWZfaW1hZ2V0eXBlIGV4aWZfaW1hZ2V0eXBlIGV4aWZfcmVhZF9kYXRhIGV4aWZfdGFnbmFtZSBleGlmX3RodW1ibmFpbCByZWFkX2V4aWZfZGF0YSBleGlmX2ltYWdldHlwZSkKKyAgICAgICAgICBiWyJFeHBlY3QiXSA9IFNldC5uZXcgJXcoZXhwZWN0X2V4cGVjdGwgZXhwZWN0X2V4cGVjdGwgZXhwZWN0X3BvcGVuIGV4cGVjdF9leHBlY3RsKQorICAgICAgICAgIGJbIkZBTSJdID0gU2V0Lm5ldyAldyhmYW1fY2FuY2VsX21vbml0b3IgZmFtX2NhbmNlbF9tb25pdG9yIGZhbV9jbG9zZSBmYW1fbW9uaXRvcl9jb2xsZWN0aW9uIGZhbV9tb25pdG9yX2RpcmVjdG9yeSBmYW1fbW9uaXRvcl9maWxlIGZhbV9uZXh0X2V2ZW50IGZhbV9vcGVuIGZhbV9wZW5kaW5nIGZhbV9yZXN1bWVfbW9uaXRvciBmYW1fc3VzcGVuZF9tb25pdG9yIGZhbV9jYW5jZWxfbW9uaXRvcikKKyAgICAgICAgICBiWyJGYW5uIl0gPSBTZXQubmV3ICV3KGZhbm5fY2FzY2FkZXRyYWluX29uX2RhdGEgZmFubl9jYXNjYWRldHJhaW5fb25fZGF0YSBmYW5uX2Nhc2NhZGV0cmFpbl9vbl9maWxlIGZhbm5fY2xlYXJfc2NhbGluZ19wYXJhbXMgZmFubl9jb3B5IGZhbm5fY3JlYXRlX2Zyb21fZmlsZSBmYW5uX2NyZWF0ZV9zaG9ydGN1dF9hcnJheSBmYW5uX2NyZWF0ZV9zaG9ydGN1dCBmYW5uX2NyZWF0ZV9zcGFyc2VfYXJyYXkgZmFubl9jcmVhdGVfc3BhcnNlIGZhbm5fY3JlYXRlX3N0YW5kYXJkX2FycmF5IGZhbm5fY3JlYXRlX3N0YW5kYXJkIGZhbm5fY3JlYXRlX3RyYWluX2Zyb21fY2FsbGJhY2sgZmFubl9jcmVhdGVfdHJhaW4gZmFubl9kZXNjYWxlX2lucHV0IGZhbm5fZGVzY2FsZV9vdXRwdXQgZmFubl9kZXNjYWxlX3RyYWluIGZhbm5fZGVzdHJveV90cmFpbiBmYW5uX2Rlc3Ryb3kgZmFubl9kdXBsaWNhdGVfdHJhaW5fZGF0YSBmYW5uX2dldF9hY3RpdmF0aW9uX2Z1bmN0aW9uIGZhbm5fZ2V0X2FjdGl2YXRpb25fc3RlZXBuZXNzIGZhbm5fZ2V0X2JpYXNfYXJyYXkgZmFubl9nZXRfYml0X2ZhaWxfbGltaXQgZmFubl9nZXRfYml0X2ZhaWwgZmFubl9nZXRfY2FzY2FkZV9hY3RpdmF0aW9uX2Z1bmN0aW9uc19jb3VudCBmYW5uX2dldF9jYXNjYWRlX2FjdGl2YXRpb25fZnVuY3Rpb25zIGZhbm5fZ2V0X2Nhc2NhZGVfYWN0aXZhdGlvbl9zdGVlcG5lc3Nlc19jb3VudCBmYW5uX2dldF9jYXNjYWRlX2FjdGl2YXRpb25fc3RlZXBuZXNzZXMgZmFubl9nZXRfY2FzY2FkZV9jYW5kaWRhdGVfY2hhbmdlX2ZyYWN0aW9uIGZhbm5fZ2V0X2Nhc2NhZGVfY2FuZGlkYXRlX2xpbWl0IGZhbm5fZ2V0X2Nhc2NhZGVfY2FuZGlkYXRlX3N0YWduYXRpb25fZXBvY2hzIGZhbm5fZ2V0X2Nhc2NhZGVfbWF4X2NhbmRfZXBvY2hzIGZhbm5fZ2V0X2Nhc2NhZGVfbWF4X291dF9lcG9jaHMgZmFubl9nZXRfY2FzY2FkZV9taW5fY2FuZF9lcG9jaHMgZmFubl9nZXRfY2FzY2FkZV9taW5fb3V0X2Vwb2NocyBmYW5uX2dldF9jYXNjYWRlX251bV9jYW5kaWRhdGVfZ3JvdXBzIGZhbm5fZ2V0X2Nhc2NhZGVfbnVtX2NhbmRpZGF0ZXMgZmFubl9nZXRfY2FzY2FkZV9vdXRwdXRfY2hhbmdlX2ZyYWN0aW9uIGZhbm5fZ2V0X2Nhc2NhZGVfb3V0cHV0X3N0YWduYXRpb25fZXBvY2hzIGZhbm5fZ2V0X2Nhc2NhZGVfd2VpZ2h0X211bHRpcGxpZXIgZmFubl9nZXRfY29ubmVjdGlvbl9hcnJheSBmYW5uX2dldF9jb25uZWN0aW9uX3JhdGUgZmFubl9nZXRfZXJybm8gZmFubl9nZXRfZXJyc3RyIGZhbm5fZ2V0X2xheWVyX2FycmF5IGZhbm5fZ2V0X2xlYXJuaW5nX21vbWVudHVtIGZhbm5fZ2V0X2xlYXJuaW5nX3JhdGUgZmFubl9nZXRfTVNFIGZhbm5fZ2V0X25ldHdvcmtfdHlwZSBmYW5uX2dldF9udW1faW5wdXQgZmFubl9nZXRfbnVtX2xheWVycyBmYW5uX2dldF9udW1fb3V0cHV0IGZhbm5fZ2V0X3F1aWNrcHJvcF9kZWNheSBmYW5uX2dldF9xdWlja3Byb3BfbXUgZmFubl9nZXRfcnByb3BfZGVjcmVhc2VfZmFjdG9yIGZhbm5fZ2V0X3Jwcm9wX2RlbHRhX21heCBmYW5uX2dldF9ycHJvcF9kZWx0YV9taW4gZmFubl9nZXRfcnByb3BfZGVsdGFfemVybyBmYW5uX2dldF9ycHJvcF9pbmNyZWFzZV9mYWN0b3IgZmFubl9nZXRfc2FycHJvcF9zdGVwX2Vycm9yX3NoaWZ0IGZhbm5fZ2V0X3NhcnByb3Bfc3RlcF9lcnJvcl90aHJlc2hvbGRfZmFjdG9yIGZhbm5fZ2V0X3NhcnByb3BfdGVtcGVyYXR1cmUgZmFubl9nZXRfc2FycHJvcF93ZWlnaHRfZGVjYXlfc2hpZnQgZmFubl9nZXRfdG90YWxfY29ubmVjdGlvbnMgZmFubl9nZXRfdG90YWxfbmV1cm9ucyBmYW5uX2dldF90cmFpbl9lcnJvcl9mdW5jdGlvbiBmYW5uX2dldF90cmFpbl9zdG9wX2Z1bmN0aW9uIGZhbm5fZ2V0X3RyYWluaW5nX2FsZ29yaXRobSBmYW5uX2luaXRfd2VpZ2h0cyBmYW5uX2xlbmd0aF90cmFpbl9kYXRhIGZhbm5fbWVyZ2VfdHJhaW5fZGF0YSBmYW5uX251bV9pbnB1dF90cmFpbl9kYXRhIGZhbm5fbnVtX291dHB1dF90cmFpbl9kYXRhIGZhbm5fcHJpbnRfZXJyb3IgZmFubl9yYW5kb21pemVfd2VpZ2h0cyBmYW5uX3JlYWRfdHJhaW5fZnJvbV9maWxlIGZhbm5fcmVzZXRfZXJybm8gZmFubl9yZXNldF9lcnJzdHIgZmFubl9yZXNldF9NU0UgZmFubl9ydW4gZmFubl9zYXZlX3RyYWluIGZhbm5fc2F2ZSBmYW5uX3NjYWxlX2lucHV0X3RyYWluX2RhdGEgZmFubl9zY2FsZV9pbnB1dCBmYW5uX3NjYWxlX291dHB1dF90cmFpbl9kYXRhIGZhbm5fc2NhbGVfb3V0cHV0IGZhbm5fc2NhbGVfdHJhaW5fZGF0YSBmYW5uX3NjYWxlX3RyYWluIGZhbm5fc2V0X2FjdGl2YXRpb25fZnVuY3Rpb25faGlkZGVuIGZhbm5fc2V0X2FjdGl2YXRpb25fZnVuY3Rpb25fbGF5ZXIgZmFubl9zZXRfYWN0aXZhdGlvbl9mdW5jdGlvbl9vdXRwdXQgZmFubl9zZXRfYWN0aXZhdGlvbl9mdW5jdGlvbiBmYW5uX3NldF9hY3RpdmF0aW9uX3N0ZWVwbmVzc19oaWRkZW4gZmFubl9zZXRfYWN0aXZhdGlvbl9zdGVlcG5lc3NfbGF5ZXIgZmFubl9zZXRfYWN0aXZhdGlvbl9zdGVlcG5lc3Nfb3V0cHV0IGZhbm5fc2V0X2FjdGl2YXRpb25fc3RlZXBuZXNzIGZhbm5fc2V0X2JpdF9mYWlsX2xpbWl0IGZhbm5fc2V0X2NhbGxiYWNrIGZhbm5fc2V0X2Nhc2NhZGVfYWN0aXZhdGlvbl9mdW5jdGlvbnMgZmFubl9zZXRfY2FzY2FkZV9hY3RpdmF0aW9uX3N0ZWVwbmVzc2VzIGZhbm5fc2V0X2Nhc2NhZGVfY2FuZGlkYXRlX2NoYW5nZV9mcmFjdGlvbiBmYW5uX3NldF9jYXNjYWRlX2NhbmRpZGF0ZV9saW1pdCBmYW5uX3NldF9jYXNjYWRlX2NhbmRpZGF0ZV9zdGFnbmF0aW9uX2Vwb2NocyBmYW5uX3NldF9jYXNjYWRlX21heF9jYW5kX2Vwb2NocyBmYW5uX3NldF9jYXNjYWRlX21heF9vdXRfZXBvY2hzIGZhbm5fc2V0X2Nhc2NhZGVfbWluX2NhbmRfZXBvY2hzIGZhbm5fc2V0X2Nhc2NhZGVfbWluX291dF9lcG9jaHMgZmFubl9zZXRfY2FzY2FkZV9udW1fY2FuZGlkYXRlX2dyb3VwcyBmYW5uX3NldF9jYXNjYWRlX291dHB1dF9jaGFuZ2VfZnJhY3Rpb24gZmFubl9zZXRfY2FzY2FkZV9vdXRwdXRfc3RhZ25hdGlvbl9lcG9jaHMgZmFubl9zZXRfY2FzY2FkZV93ZWlnaHRfbXVsdGlwbGllciBmYW5uX3NldF9lcnJvcl9sb2cgZmFubl9zZXRfaW5wdXRfc2NhbGluZ19wYXJhbXMgZmFubl9zZXRfbGVhcm5pbmdfbW9tZW50dW0gZmFubl9zZXRfbGVhcm5pbmdfcmF0ZSBmYW5uX3NldF9vdXRwdXRfc2NhbGluZ19wYXJhbXMgZmFubl9zZXRfcXVpY2twcm9wX2RlY2F5IGZhbm5fc2V0X3F1aWNrcHJvcF9tdSBmYW5uX3NldF9ycHJvcF9kZWNyZWFzZV9mYWN0b3IgZmFubl9zZXRfcnByb3BfZGVsdGFfbWF4IGZhbm5fc2V0X3Jwcm9wX2RlbHRhX21pbiBmYW5uX3NldF9ycHJvcF9kZWx0YV96ZXJvIGZhbm5fc2V0X3Jwcm9wX2luY3JlYXNlX2ZhY3RvciBmYW5uX3NldF9zYXJwcm9wX3N0ZXBfZXJyb3Jfc2hpZnQgZmFubl9zZXRfc2FycHJvcF9zdGVwX2Vycm9yX3RocmVzaG9sZF9mYWN0b3IgZmFubl9zZXRfc2FycHJvcF90ZW1wZXJhdHVyZSBmYW5uX3NldF9zYXJwcm9wX3dlaWdodF9kZWNheV9zaGlmdCBmYW5uX3NldF9zY2FsaW5nX3BhcmFtcyBmYW5uX3NldF90cmFpbl9lcnJvcl9mdW5jdGlvbiBmYW5uX3NldF90cmFpbl9zdG9wX2Z1bmN0aW9uIGZhbm5fc2V0X3RyYWluaW5nX2FsZ29yaXRobSBmYW5uX3NldF93ZWlnaHRfYXJyYXkgZmFubl9zZXRfd2VpZ2h0IGZhbm5fc2h1ZmZsZV90cmFpbl9kYXRhIGZhbm5fc3Vic2V0X3RyYWluX2RhdGEgZmFubl90ZXN0X2RhdGEgZmFubl90ZXN0IGZhbm5fdHJhaW5fZXBvY2ggZmFubl90cmFpbl9vbl9kYXRhIGZhbm5fdHJhaW5fb25fZmlsZSBmYW5uX3RyYWluIGZhbm5fY2FzY2FkZXRyYWluX29uX2RhdGEpCisgICAgICAgICAgYlsiRnJvbnRCYXNlIl0gPSBTZXQubmV3ICV3KGZic3FsX2FmZmVjdGVkX3Jvd3MgZmJzcWxfYWZmZWN0ZWRfcm93cyBmYnNxbF9hdXRvY29tbWl0IGZic3FsX2Jsb2Jfc2l6ZSBmYnNxbF9jaGFuZ2VfdXNlciBmYnNxbF9jbG9iX3NpemUgZmJzcWxfY2xvc2UgZmJzcWxfY29tbWl0IGZic3FsX2Nvbm5lY3QgZmJzcWxfY3JlYXRlX2Jsb2IgZmJzcWxfY3JlYXRlX2Nsb2IgZmJzcWxfY3JlYXRlX2RiIGZic3FsX2RhdGFfc2VlayBmYnNxbF9kYXRhYmFzZV9wYXNzd29yZCBmYnNxbF9kYXRhYmFzZSBmYnNxbF9kYl9xdWVyeSBmYnNxbF9kYl9zdGF0dXMgZmJzcWxfZHJvcF9kYiBmYnNxbF9lcnJubyBmYnNxbF9lcnJvciBmYnNxbF9mZXRjaF9hcnJheSBmYnNxbF9mZXRjaF9hc3NvYyBmYnNxbF9mZXRjaF9maWVsZCBmYnNxbF9mZXRjaF9sZW5ndGhzIGZic3FsX2ZldGNoX29iamVjdCBmYnNxbF9mZXRjaF9yb3cgZmJzcWxfZmllbGRfZmxhZ3MgZmJzcWxfZmllbGRfbGVuIGZic3FsX2ZpZWxkX25hbWUgZmJzcWxfZmllbGRfc2VlayBmYnNxbF9maWVsZF90YWJsZSBmYnNxbF9maWVsZF90eXBlIGZic3FsX2ZyZWVfcmVzdWx0IGZic3FsX2dldF9hdXRvc3RhcnRfaW5mbyBmYnNxbF9ob3N0bmFtZSBmYnNxbF9pbnNlcnRfaWQgZmJzcWxfbGlzdF9kYnMgZmJzcWxfbGlzdF9maWVsZHMgZmJzcWxfbGlzdF90YWJsZXMgZmJzcWxfbmV4dF9yZXN1bHQgZmJzcWxfbnVtX2ZpZWxkcyBmYnNxbF9udW1fcm93cyBmYnNxbF9wYXNzd29yZCBmYnNxbF9wY29ubmVjdCBmYnNxbF9xdWVyeSBmYnNxbF9yZWFkX2Jsb2IgZmJzcWxfcmVhZF9jbG9iIGZic3FsX3Jlc3VsdCBmYnNxbF9yb2xsYmFjayBmYnNxbF9yb3dzX2ZldGNoZWQgZmJzcWxfc2VsZWN0X2RiIGZic3FsX3NldF9jaGFyYWN0ZXJzZXQgZmJzcWxfc2V0X2xvYl9tb2RlIGZic3FsX3NldF9wYXNzd29yZCBmYnNxbF9zZXRfdHJhbnNhY3Rpb24gZmJzcWxfc3RhcnRfZGIgZmJzcWxfc3RvcF9kYiBmYnNxbF90YWJsZV9uYW1lIGZic3FsX3RhYmxlbmFtZSBmYnNxbF91c2VybmFtZSBmYnNxbF93YXJuaW5ncyBmYnNxbF9hZmZlY3RlZF9yb3dzKQorICAgICAgICAgIGJbIkZERiJdID0gU2V0Lm5ldyAldyhmZGZfYWRkX2RvY19qYXZhc2NyaXB0IGZkZl9hZGRfZG9jX2phdmFzY3JpcHQgZmRmX2FkZF90ZW1wbGF0ZSBmZGZfY2xvc2UgZmRmX2NyZWF0ZSBmZGZfZW51bV92YWx1ZXMgZmRmX2Vycm5vIGZkZl9lcnJvciBmZGZfZ2V0X2FwIGZkZl9nZXRfYXR0YWNobWVudCBmZGZfZ2V0X2VuY29kaW5nIGZkZl9nZXRfZmlsZSBmZGZfZ2V0X2ZsYWdzIGZkZl9nZXRfb3B0IGZkZl9nZXRfc3RhdHVzIGZkZl9nZXRfdmFsdWUgZmRmX2dldF92ZXJzaW9uIGZkZl9oZWFkZXIgZmRmX25leHRfZmllbGRfbmFtZSBmZGZfb3Blbl9zdHJpbmcgZmRmX29wZW4gZmRmX3JlbW92ZV9pdGVtIGZkZl9zYXZlX3N0cmluZyBmZGZfc2F2ZSBmZGZfc2V0X2FwIGZkZl9zZXRfZW5jb2RpbmcgZmRmX3NldF9maWxlIGZkZl9zZXRfZmxhZ3MgZmRmX3NldF9qYXZhc2NyaXB0X2FjdGlvbiBmZGZfc2V0X29uX2ltcG9ydF9qYXZhc2NyaXB0IGZkZl9zZXRfb3B0IGZkZl9zZXRfc3RhdHVzIGZkZl9zZXRfc3VibWl0X2Zvcm1fYWN0aW9uIGZkZl9zZXRfdGFyZ2V0X2ZyYW1lIGZkZl9zZXRfdmFsdWUgZmRmX3NldF92ZXJzaW9uIGZkZl9hZGRfZG9jX2phdmFzY3JpcHQpCisgICAgICAgICAgYlsiRmlsZWluZm8iXSA9IFNldC5uZXcgJXcoZmluZm9fYnVmZmVyIGZpbmZvX2J1ZmZlciBmaW5mb19jbG9zZSBmaW5mb19maWxlIGZpbmZvX29wZW4gZmluZm9fc2V0X2ZsYWdzIG1pbWVfY29udGVudF90eXBlIGZpbmZvX2J1ZmZlcikKKyAgICAgICAgICBiWyJmaWxlUHJvIl0gPSBTZXQubmV3ICV3KGZpbGVwcm9fZmllbGRjb3VudCBmaWxlcHJvX2ZpZWxkY291bnQgZmlsZXByb19maWVsZG5hbWUgZmlsZXByb19maWVsZHR5cGUgZmlsZXByb19maWVsZHdpZHRoIGZpbGVwcm9fcmV0cmlldmUgZmlsZXByb19yb3djb3VudCBmaWxlcHJvIGZpbGVwcm9fZmllbGRjb3VudCkKKyAgICAgICAgICBiWyJGaWxlc3lzdGVtIl0gPSBTZXQubmV3ICV3KGJhc2VuYW1lIGJhc2VuYW1lIGNoZ3JwIGNobW9kIGNob3duIGNsZWFyc3RhdGNhY2hlIGNvcHkgZGVsZXRlIGRpcm5hbWUgZGlza19mcmVlX3NwYWNlIGRpc2tfdG90YWxfc3BhY2UgZGlza2ZyZWVzcGFjZSBmY2xvc2UgZmVvZiBmZmx1c2ggZmdldGMgZmdldGNzdiBmZ2V0cyBmZ2V0c3MgZmlsZV9leGlzdHMgZmlsZV9nZXRfY29udGVudHMgZmlsZV9wdXRfY29udGVudHMgZmlsZSBmaWxlYXRpbWUgZmlsZWN0aW1lIGZpbGVncm91cCBmaWxlaW5vZGUgZmlsZW10aW1lIGZpbGVvd25lciBmaWxlcGVybXMgZmlsZXNpemUgZmlsZXR5cGUgZmxvY2sgZm5tYXRjaCBmb3BlbiBmcGFzc3RocnUgZnB1dGNzdiBmcHV0cyBmcmVhZCBmc2NhbmYgZnNlZWsgZnN0YXQgZnRlbGwgZnRydW5jYXRlIGZ3cml0ZSBnbG9iIGlzX2RpciBpc19leGVjdXRhYmxlIGlzX2ZpbGUgaXNfbGluayBpc19yZWFkYWJsZSBpc191cGxvYWRlZF9maWxlIGlzX3dyaXRhYmxlIGlzX3dyaXRlYWJsZSBsY2hncnAgbGNob3duIGxpbmsgbGlua2luZm8gbHN0YXQgbWtkaXIgbW92ZV91cGxvYWRlZF9maWxlIHBhcnNlX2luaV9maWxlIHBhcnNlX2luaV9zdHJpbmcgcGF0aGluZm8gcGNsb3NlIHBvcGVuIHJlYWRmaWxlIHJlYWRsaW5rIHJlYWxwYXRoX2NhY2hlX2dldCByZWFscGF0aF9jYWNoZV9zaXplIHJlYWxwYXRoIHJlbmFtZSByZXdpbmQgcm1kaXIgc2V0X2ZpbGVfYnVmZmVyIHN0YXQgc3ltbGluayB0ZW1wbmFtIHRtcGZpbGUgdG91Y2ggdW1hc2sgdW5saW5rIGJhc2VuYW1lKQorICAgICAgICAgIGJbIkZpbHRlciJdID0gU2V0Lm5ldyAldyhmaWx0ZXJfaGFzX3ZhciBmaWx0ZXJfaGFzX3ZhciBmaWx0ZXJfaWQgZmlsdGVyX2lucHV0X2FycmF5IGZpbHRlcl9pbnB1dCBmaWx0ZXJfbGlzdCBmaWx0ZXJfdmFyX2FycmF5IGZpbHRlcl92YXIgZmlsdGVyX2hhc192YXIpCisgICAgICAgICAgYlsiRlBNIl0gPSBTZXQubmV3ICV3KGZhc3RjZ2lfZmluaXNoX3JlcXVlc3QgZmFzdGNnaV9maW5pc2hfcmVxdWVzdCBmYXN0Y2dpX2ZpbmlzaF9yZXF1ZXN0KQorICAgICAgICAgIGJbIkZyaUJpRGkiXSA9IFNldC5uZXcgJXcoZnJpYmlkaV9sb2cydmlzIGZyaWJpZGlfbG9nMnZpcyBmcmliaWRpX2xvZzJ2aXMpCisgICAgICAgICAgYlsiRlRQIl0gPSBTZXQubmV3ICV3KGZ0cF9hbGxvYyBmdHBfYWxsb2MgZnRwX2NkdXAgZnRwX2NoZGlyIGZ0cF9jaG1vZCBmdHBfY2xvc2UgZnRwX2Nvbm5lY3QgZnRwX2RlbGV0ZSBmdHBfZXhlYyBmdHBfZmdldCBmdHBfZnB1dCBmdHBfZ2V0X29wdGlvbiBmdHBfZ2V0IGZ0cF9sb2dpbiBmdHBfbWR0bSBmdHBfbWtkaXIgZnRwX25iX2NvbnRpbnVlIGZ0cF9uYl9mZ2V0IGZ0cF9uYl9mcHV0IGZ0cF9uYl9nZXQgZnRwX25iX3B1dCBmdHBfbmxpc3QgZnRwX3Bhc3YgZnRwX3B1dCBmdHBfcHdkIGZ0cF9xdWl0IGZ0cF9yYXcgZnRwX3Jhd2xpc3QgZnRwX3JlbmFtZSBmdHBfcm1kaXIgZnRwX3NldF9vcHRpb24gZnRwX3NpdGUgZnRwX3NpemUgZnRwX3NzbF9jb25uZWN0IGZ0cF9zeXN0eXBlIGZ0cF9hbGxvYykKKyAgICAgICAgICBiWyJGdW5jdGlvbiBoYW5kbGluZyJdID0gU2V0Lm5ldyAldyhjYWxsX3VzZXJfZnVuY19hcnJheSBjYWxsX3VzZXJfZnVuY19hcnJheSBjYWxsX3VzZXJfZnVuYyBjcmVhdGVfZnVuY3Rpb24gZm9yd2FyZF9zdGF0aWNfY2FsbF9hcnJheSBmb3J3YXJkX3N0YXRpY19jYWxsIGZ1bmNfZ2V0X2FyZyBmdW5jX2dldF9hcmdzIGZ1bmNfbnVtX2FyZ3MgZnVuY3Rpb25fZXhpc3RzIGdldF9kZWZpbmVkX2Z1bmN0aW9ucyByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbiByZWdpc3Rlcl90aWNrX2Z1bmN0aW9uIHVucmVnaXN0ZXJfdGlja19mdW5jdGlvbiBjYWxsX3VzZXJfZnVuY19hcnJheSkKKyAgICAgICAgICBiWyJHZW9JUCJdID0gU2V0Lm5ldyAldyhnZW9pcF9hc251bV9ieV9uYW1lIGdlb2lwX2FzbnVtX2J5X25hbWUgZ2VvaXBfY29udGluZW50X2NvZGVfYnlfbmFtZSBnZW9pcF9jb3VudHJ5X2NvZGVfYnlfbmFtZSBnZW9pcF9jb3VudHJ5X2NvZGUzX2J5X25hbWUgZ2VvaXBfY291bnRyeV9uYW1lX2J5X25hbWUgZ2VvaXBfZGF0YWJhc2VfaW5mbyBnZW9pcF9kYl9hdmFpbCBnZW9pcF9kYl9maWxlbmFtZSBnZW9pcF9kYl9nZXRfYWxsX2luZm8gZ2VvaXBfZG9tYWluX2J5X25hbWUgZ2VvaXBfaWRfYnlfbmFtZSBnZW9pcF9pc3BfYnlfbmFtZSBnZW9pcF9uZXRzcGVlZGNlbGxfYnlfbmFtZSBnZW9pcF9vcmdfYnlfbmFtZSBnZW9pcF9yZWNvcmRfYnlfbmFtZSBnZW9pcF9yZWdpb25fYnlfbmFtZSBnZW9pcF9yZWdpb25fbmFtZV9ieV9jb2RlIGdlb2lwX3NldHVwX2N1c3RvbV9kaXJlY3RvcnkgZ2VvaXBfdGltZV96b25lX2J5X2NvdW50cnlfYW5kX3JlZ2lvbiBnZW9pcF9hc251bV9ieV9uYW1lKQorICAgICAgICAgIGJbIkdldHRleHQiXSA9IFNldC5uZXcgJXcoYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgYmluZHRleHRkb21haW4gZGNnZXR0ZXh0IGRjbmdldHRleHQgZGdldHRleHQgZG5nZXR0ZXh0IGdldHRleHQgbmdldHRleHQgdGV4dGRvbWFpbiBiaW5kX3RleHRkb21haW5fY29kZXNldCkKKyAgICAgICAgICBiWyJHTVAiXSA9IFNldC5uZXcgJXcoZ21wX2FicyBnbXBfYWJzIGdtcF9hZGQgZ21wX2FuZCBnbXBfY2xyYml0IGdtcF9jbXAgZ21wX2NvbSBnbXBfZGl2X3EgZ21wX2Rpdl9xciBnbXBfZGl2X3IgZ21wX2RpdiBnbXBfZGl2ZXhhY3QgZ21wX2ZhY3QgZ21wX2djZCBnbXBfZ2NkZXh0IGdtcF9oYW1kaXN0IGdtcF9pbml0IGdtcF9pbnR2YWwgZ21wX2ludmVydCBnbXBfamFjb2JpIGdtcF9sZWdlbmRyZSBnbXBfbW9kIGdtcF9tdWwgZ21wX25lZyBnbXBfbmV4dHByaW1lIGdtcF9vciBnbXBfcGVyZmVjdF9zcXVhcmUgZ21wX3BvcGNvdW50IGdtcF9wb3cgZ21wX3Bvd20gZ21wX3Byb2JfcHJpbWUgZ21wX3JhbmRvbSBnbXBfc2NhbjAgZ21wX3NjYW4xIGdtcF9zZXRiaXQgZ21wX3NpZ24gZ21wX3NxcnQgZ21wX3NxcnRyZW0gZ21wX3N0cnZhbCBnbXBfc3ViIGdtcF90ZXN0Yml0IGdtcF94b3IgZ21wX2FicykKKyAgICAgICAgICBiWyJHbnVQRyJdID0gU2V0Lm5ldyAldyhnbnVwZ19hZGRkZWNyeXB0a2V5IGdudXBnX2FkZGRlY3J5cHRrZXkgZ251cGdfYWRkZW5jcnlwdGtleSBnbnVwZ19hZGRzaWdua2V5IGdudXBnX2NsZWFyZGVjcnlwdGtleXMgZ251cGdfY2xlYXJlbmNyeXB0a2V5cyBnbnVwZ19jbGVhcnNpZ25rZXlzIGdudXBnX2RlY3J5cHQgZ251cGdfZGVjcnlwdHZlcmlmeSBnbnVwZ19lbmNyeXB0IGdudXBnX2VuY3J5cHRzaWduIGdudXBnX2V4cG9ydCBnbnVwZ19nZXRlcnJvciBnbnVwZ19nZXRwcm90b2NvbCBnbnVwZ19pbXBvcnQgZ251cGdfaW5pdCBnbnVwZ19rZXlpbmZvIGdudXBnX3NldGFybW9yIGdudXBnX3NldGVycm9ybW9kZSBnbnVwZ19zZXRzaWdubW9kZSBnbnVwZ19zaWduIGdudXBnX3ZlcmlmeSBnbnVwZ19hZGRkZWNyeXB0a2V5KQorICAgICAgICAgIGJbIkd1cG5wIl0gPSBTZXQubmV3ICV3KGd1cG5wX2NvbnRleHRfZ2V0X2hvc3RfaXAgZ3VwbnBfY29udGV4dF9nZXRfaG9zdF9pcCBndXBucF9jb250ZXh0X2dldF9wb3J0IGd1cG5wX2NvbnRleHRfZ2V0X3N1YnNjcmlwdGlvbl90aW1lb3V0IGd1cG5wX2NvbnRleHRfaG9zdF9wYXRoIGd1cG5wX2NvbnRleHRfbmV3IGd1cG5wX2NvbnRleHRfc2V0X3N1YnNjcmlwdGlvbl90aW1lb3V0IGd1cG5wX2NvbnRleHRfdGltZW91dF9hZGQgZ3VwbnBfY29udGV4dF91bmhvc3RfcGF0aCBndXBucF9jb250cm9sX3BvaW50X2Jyb3dzZV9zdGFydCBndXBucF9jb250cm9sX3BvaW50X2Jyb3dzZV9zdG9wIGd1cG5wX2NvbnRyb2xfcG9pbnRfY2FsbGJhY2tfc2V0IGd1cG5wX2NvbnRyb2xfcG9pbnRfbmV3IGd1cG5wX2RldmljZV9hY3Rpb25fY2FsbGJhY2tfc2V0IGd1cG5wX2RldmljZV9pbmZvX2dldF9zZXJ2aWNlIGd1cG5wX2RldmljZV9pbmZvX2dldCBndXBucF9yb290X2RldmljZV9nZXRfYXZhaWxhYmxlIGd1cG5wX3Jvb3RfZGV2aWNlX2dldF9yZWxhdGl2ZV9sb2NhdGlvbiBndXBucF9yb290X2RldmljZV9uZXcgZ3VwbnBfcm9vdF9kZXZpY2Vfc2V0X2F2YWlsYWJsZSBndXBucF9yb290X2RldmljZV9zdGFydCBndXBucF9yb290X2RldmljZV9zdG9wIGd1cG5wX3NlcnZpY2VfYWN0aW9uX2dldCBndXBucF9zZXJ2aWNlX2FjdGlvbl9yZXR1cm5fZXJyb3IgZ3VwbnBfc2VydmljZV9hY3Rpb25fcmV0dXJuIGd1cG5wX3NlcnZpY2VfYWN0aW9uX3NldCBndXBucF9zZXJ2aWNlX2ZyZWV6ZV9ub3RpZnkgZ3VwbnBfc2VydmljZV9pbmZvX2dldF9pbnRyb3NwZWN0aW9uIGd1cG5wX3NlcnZpY2VfaW5mb19nZXQgZ3VwbnBfc2VydmljZV9pbnRyb3NwZWN0aW9uX2dldF9zdGF0ZV92YXJpYWJsZSBndXBucF9zZXJ2aWNlX25vdGlmeSBndXBucF9zZXJ2aWNlX3Byb3h5X2FjdGlvbl9nZXQgZ3VwbnBfc2VydmljZV9wcm94eV9hY3Rpb25fc2V0IGd1cG5wX3NlcnZpY2VfcHJveHlfYWRkX25vdGlmeSBndXBucF9zZXJ2aWNlX3Byb3h5X2NhbGxiYWNrX3NldCBndXBucF9zZXJ2aWNlX3Byb3h5X2dldF9zdWJzY3JpYmVkIGd1cG5wX3NlcnZpY2VfcHJveHlfcmVtb3ZlX25vdGlmeSBndXBucF9zZXJ2aWNlX3Byb3h5X3NldF9zdWJzY3JpYmVkIGd1cG5wX3NlcnZpY2VfdGhhd19ub3RpZnkgZ3VwbnBfY29udGV4dF9nZXRfaG9zdF9pcCkKKyAgICAgICAgICBiWyJIYXNoIl0gPSBTZXQubmV3ICV3KGhhc2hfYWxnb3MgaGFzaF9hbGdvcyBoYXNoX2NvcHkgaGFzaF9maWxlIGhhc2hfZmluYWwgaGFzaF9obWFjX2ZpbGUgaGFzaF9obWFjIGhhc2hfaW5pdCBoYXNoX3Bia2RmMiBoYXNoX3VwZGF0ZV9maWxlIGhhc2hfdXBkYXRlX3N0cmVhbSBoYXNoX3VwZGF0ZSBoYXNoIGhhc2hfYWxnb3MpCisgICAgICAgICAgYlsiSFRUUCJdID0gU2V0Lm5ldyAldyhodHRwX2NhY2hlX2V0YWcgaHR0cF9jYWNoZV9ldGFnIGh0dHBfY2FjaGVfbGFzdF9tb2RpZmllZCBodHRwX2NodW5rZWRfZGVjb2RlIGh0dHBfZGVmbGF0ZSBodHRwX2luZmxhdGUgaHR0cF9idWlsZF9jb29raWUgaHR0cF9kYXRlIGh0dHBfZ2V0X3JlcXVlc3RfYm9keV9zdHJlYW0gaHR0cF9nZXRfcmVxdWVzdF9ib2R5IGh0dHBfZ2V0X3JlcXVlc3RfaGVhZGVycyBodHRwX21hdGNoX2V0YWcgaHR0cF9tYXRjaF9tb2RpZmllZCBodHRwX21hdGNoX3JlcXVlc3RfaGVhZGVyIGh0dHBfc3VwcG9ydCBodHRwX25lZ290aWF0ZV9jaGFyc2V0IGh0dHBfbmVnb3RpYXRlX2NvbnRlbnRfdHlwZSBodHRwX25lZ290aWF0ZV9sYW5ndWFnZSBvYl9kZWZsYXRlaGFuZGxlciBvYl9ldGFnaGFuZGxlciBvYl9pbmZsYXRlaGFuZGxlciBodHRwX3BhcnNlX2Nvb2tpZSBodHRwX3BhcnNlX2hlYWRlcnMgaHR0cF9wYXJzZV9tZXNzYWdlIGh0dHBfcGFyc2VfcGFyYW1zIGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2NsZWFuIGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2NvdW50IGh0dHBfcGVyc2lzdGVudF9oYW5kbGVzX2lkZW50IGh0dHBfZ2V0IGh0dHBfaGVhZCBodHRwX3Bvc3RfZGF0YSBodHRwX3Bvc3RfZmllbGRzIGh0dHBfcHV0X2RhdGEgaHR0cF9wdXRfZmlsZSBodHRwX3B1dF9zdHJlYW0gaHR0cF9yZXF1ZXN0X2JvZHlfZW5jb2RlIGh0dHBfcmVxdWVzdF9tZXRob2RfZXhpc3RzIGh0dHBfcmVxdWVzdF9tZXRob2RfbmFtZSBodHRwX3JlcXVlc3RfbWV0aG9kX3JlZ2lzdGVyIGh0dHBfcmVxdWVzdF9tZXRob2RfdW5yZWdpc3RlciBodHRwX3JlcXVlc3QgaHR0cF9yZWRpcmVjdCBodHRwX3NlbmRfY29udGVudF9kaXNwb3NpdGlvbiBodHRwX3NlbmRfY29udGVudF90eXBlIGh0dHBfc2VuZF9kYXRhIGh0dHBfc2VuZF9maWxlIGh0dHBfc2VuZF9sYXN0X21vZGlmaWVkIGh0dHBfc2VuZF9zdGF0dXMgaHR0cF9zZW5kX3N0cmVhbSBodHRwX3Rocm90dGxlIGh0dHBfYnVpbGRfc3RyIGh0dHBfYnVpbGRfdXJsIGh0dHBfY2FjaGVfZXRhZykKKyAgICAgICAgICBiWyJIeXBlcndhdmUiXSA9IFNldC5uZXcgJXcoaHdfQXJyYXkyT2JqcmVjIGh3X0FycmF5Mk9ianJlYyBod19jaGFuZ2VvYmplY3QgaHdfQ2hpbGRyZW4gaHdfQ2hpbGRyZW5PYmogaHdfQ2xvc2UgaHdfQ29ubmVjdCBod19jb25uZWN0aW9uX2luZm8gaHdfY3AgaHdfRGVsZXRlb2JqZWN0IGh3X0RvY0J5QW5jaG9yIGh3X0RvY0J5QW5jaG9yT2JqIGh3X0RvY3VtZW50X0F0dHJpYnV0ZXMgaHdfRG9jdW1lbnRfQm9keVRhZyBod19Eb2N1bWVudF9Db250ZW50IGh3X0RvY3VtZW50X1NldENvbnRlbnQgaHdfRG9jdW1lbnRfU2l6ZSBod19kdW1teSBod19FZGl0VGV4dCBod19FcnJvciBod19FcnJvck1zZyBod19GcmVlX0RvY3VtZW50IGh3X0dldEFuY2hvcnMgaHdfR2V0QW5jaG9yc09iaiBod19HZXRBbmRMb2NrIGh3X0dldENoaWxkQ29sbCBod19HZXRDaGlsZENvbGxPYmogaHdfR2V0Q2hpbGREb2NDb2xsIGh3X0dldENoaWxkRG9jQ29sbE9iaiBod19HZXRPYmplY3QgaHdfR2V0T2JqZWN0QnlRdWVyeSBod19HZXRPYmplY3RCeVF1ZXJ5Q29sbCBod19HZXRPYmplY3RCeVF1ZXJ5Q29sbE9iaiBod19HZXRPYmplY3RCeVF1ZXJ5T2JqIGh3X0dldFBhcmVudHMgaHdfR2V0UGFyZW50c09iaiBod19nZXRyZWxsaW5rIGh3X0dldFJlbW90ZSBod19nZXRyZW1vdGVjaGlsZHJlbiBod19HZXRTcmNCeURlc3RPYmogaHdfR2V0VGV4dCBod19nZXR1c2VybmFtZSBod19JZGVudGlmeSBod19JbkNvbGxlY3Rpb25zIGh3X0luZm8gaHdfSW5zQ29sbCBod19JbnNEb2MgaHdfaW5zZXJ0YW5jaG9ycyBod19JbnNlcnREb2N1bWVudCBod19JbnNlcnRPYmplY3QgaHdfbWFwaWQgaHdfTW9kaWZ5b2JqZWN0IGh3X212IGh3X05ld19Eb2N1bWVudCBod19vYmpyZWMyYXJyYXkgaHdfT3V0cHV0X0RvY3VtZW50IGh3X3BDb25uZWN0IGh3X1BpcGVEb2N1bWVudCBod19Sb290IGh3X3NldGxpbmtyb290IGh3X3N0YXQgaHdfVW5sb2NrIGh3X1dobyBod19BcnJheTJPYmpyZWMpCisgICAgICAgICAgYlsiSHlwZXJ3YXZlIEFQSSJdID0gU2V0Lm5ldyAldyhod2FwaV9hdHRyaWJ1dGVfbmV3IGh3YXBpX2NvbnRlbnRfbmV3IGh3YXBpX2hnY3NwIGh3YXBpX29iamVjdF9uZXcpCisgICAgICAgICAgYlsiRmlyZWJpcmQvSW50ZXJCYXNlIl0gPSBTZXQubmV3ICV3KGliYXNlX2FkZF91c2VyIGliYXNlX2FkZF91c2VyIGliYXNlX2FmZmVjdGVkX3Jvd3MgaWJhc2VfYmFja3VwIGliYXNlX2Jsb2JfYWRkIGliYXNlX2Jsb2JfY2FuY2VsIGliYXNlX2Jsb2JfY2xvc2UgaWJhc2VfYmxvYl9jcmVhdGUgaWJhc2VfYmxvYl9lY2hvIGliYXNlX2Jsb2JfZ2V0IGliYXNlX2Jsb2JfaW1wb3J0IGliYXNlX2Jsb2JfaW5mbyBpYmFzZV9ibG9iX29wZW4gaWJhc2VfY2xvc2UgaWJhc2VfY29tbWl0X3JldCBpYmFzZV9jb21taXQgaWJhc2VfY29ubmVjdCBpYmFzZV9kYl9pbmZvIGliYXNlX2RlbGV0ZV91c2VyIGliYXNlX2Ryb3BfZGIgaWJhc2VfZXJyY29kZSBpYmFzZV9lcnJtc2cgaWJhc2VfZXhlY3V0ZSBpYmFzZV9mZXRjaF9hc3NvYyBpYmFzZV9mZXRjaF9vYmplY3QgaWJhc2VfZmV0Y2hfcm93IGliYXNlX2ZpZWxkX2luZm8gaWJhc2VfZnJlZV9ldmVudF9oYW5kbGVyIGliYXNlX2ZyZWVfcXVlcnkgaWJhc2VfZnJlZV9yZXN1bHQgaWJhc2VfZ2VuX2lkIGliYXNlX21haW50YWluX2RiIGliYXNlX21vZGlmeV91c2VyIGliYXNlX25hbWVfcmVzdWx0IGliYXNlX251bV9maWVsZHMgaWJhc2VfbnVtX3BhcmFtcyBpYmFzZV9wYXJhbV9pbmZvIGliYXNlX3Bjb25uZWN0IGliYXNlX3ByZXBhcmUgaWJhc2VfcXVlcnkgaWJhc2VfcmVzdG9yZSBpYmFzZV9yb2xsYmFja19yZXQgaWJhc2Vfcm9sbGJhY2sgaWJhc2Vfc2VydmVyX2luZm8gaWJhc2Vfc2VydmljZV9hdHRhY2ggaWJhc2Vfc2VydmljZV9kZXRhY2ggaWJhc2Vfc2V0X2V2ZW50X2hhbmRsZXIgaWJhc2VfdHJhbnMgaWJhc2Vfd2FpdF9ldmVudCBpYmFzZV9hZGRfdXNlcikKKyAgICAgICAgICBiWyJJQk0gREIyIl0gPSBTZXQubmV3ICV3KGRiMl9hdXRvY29tbWl0IGRiMl9hdXRvY29tbWl0IGRiMl9iaW5kX3BhcmFtIGRiMl9jbGllbnRfaW5mbyBkYjJfY2xvc2UgZGIyX2NvbHVtbl9wcml2aWxlZ2VzIGRiMl9jb2x1bW5zIGRiMl9jb21taXQgZGIyX2Nvbm5fZXJyb3IgZGIyX2Nvbm5fZXJyb3Jtc2cgZGIyX2Nvbm5lY3QgZGIyX2N1cnNvcl90eXBlIGRiMl9lc2NhcGVfc3RyaW5nIGRiMl9leGVjIGRiMl9leGVjdXRlIGRiMl9mZXRjaF9hcnJheSBkYjJfZmV0Y2hfYXNzb2MgZGIyX2ZldGNoX2JvdGggZGIyX2ZldGNoX29iamVjdCBkYjJfZmV0Y2hfcm93IGRiMl9maWVsZF9kaXNwbGF5X3NpemUgZGIyX2ZpZWxkX25hbWUgZGIyX2ZpZWxkX251bSBkYjJfZmllbGRfcHJlY2lzaW9uIGRiMl9maWVsZF9zY2FsZSBkYjJfZmllbGRfdHlwZSBkYjJfZmllbGRfd2lkdGggZGIyX2ZvcmVpZ25fa2V5cyBkYjJfZnJlZV9yZXN1bHQgZGIyX2ZyZWVfc3RtdCBkYjJfZ2V0X29wdGlvbiBkYjJfbGFzdF9pbnNlcnRfaWQgZGIyX2xvYl9yZWFkIGRiMl9uZXh0X3Jlc3VsdCBkYjJfbnVtX2ZpZWxkcyBkYjJfbnVtX3Jvd3MgZGIyX3BjbG9zZSBkYjJfcGNvbm5lY3QgZGIyX3ByZXBhcmUgZGIyX3ByaW1hcnlfa2V5cyBkYjJfcHJvY2VkdXJlX2NvbHVtbnMgZGIyX3Byb2NlZHVyZXMgZGIyX3Jlc3VsdCBkYjJfcm9sbGJhY2sgZGIyX3NlcnZlcl9pbmZvIGRiMl9zZXRfb3B0aW9uIGRiMl9zcGVjaWFsX2NvbHVtbnMgZGIyX3N0YXRpc3RpY3MgZGIyX3N0bXRfZXJyb3IgZGIyX3N0bXRfZXJyb3Jtc2cgZGIyX3RhYmxlX3ByaXZpbGVnZXMgZGIyX3RhYmxlcyBkYjJfYXV0b2NvbW1pdCkKKyAgICAgICAgICBiWyJpY29udiJdID0gU2V0Lm5ldyAldyhpY29udl9nZXRfZW5jb2RpbmcgaWNvbnZfZ2V0X2VuY29kaW5nIGljb252X21pbWVfZGVjb2RlX2hlYWRlcnMgaWNvbnZfbWltZV9kZWNvZGUgaWNvbnZfbWltZV9lbmNvZGUgaWNvbnZfc2V0X2VuY29kaW5nIGljb252X3N0cmxlbiBpY29udl9zdHJwb3MgaWNvbnZfc3RycnBvcyBpY29udl9zdWJzdHIgaWNvbnYgb2JfaWNvbnZfaGFuZGxlciBpY29udl9nZXRfZW5jb2RpbmcpCisgICAgICAgICAgYlsiSUQzIl0gPSBTZXQubmV3ICV3KGlkM19nZXRfZnJhbWVfbG9uZ19uYW1lIGlkM19nZXRfZnJhbWVfbG9uZ19uYW1lIGlkM19nZXRfZnJhbWVfc2hvcnRfbmFtZSBpZDNfZ2V0X2dlbnJlX2lkIGlkM19nZXRfZ2VucmVfbGlzdCBpZDNfZ2V0X2dlbnJlX25hbWUgaWQzX2dldF90YWcgaWQzX2dldF92ZXJzaW9uIGlkM19yZW1vdmVfdGFnIGlkM19zZXRfdGFnIGlkM19nZXRfZnJhbWVfbG9uZ19uYW1lKQorICAgICAgICAgIGJbIkluZm9ybWl4Il0gPSBTZXQubmV3ICV3KGlmeF9hZmZlY3RlZF9yb3dzIGlmeF9hZmZlY3RlZF9yb3dzIGlmeF9ibG9iaW5maWxlX21vZGUgaWZ4X2J5dGVhc3ZhcmNoYXIgaWZ4X2Nsb3NlIGlmeF9jb25uZWN0IGlmeF9jb3B5X2Jsb2IgaWZ4X2NyZWF0ZV9ibG9iIGlmeF9jcmVhdGVfY2hhciBpZnhfZG8gaWZ4X2Vycm9yIGlmeF9lcnJvcm1zZyBpZnhfZmV0Y2hfcm93IGlmeF9maWVsZHByb3BlcnRpZXMgaWZ4X2ZpZWxkdHlwZXMgaWZ4X2ZyZWVfYmxvYiBpZnhfZnJlZV9jaGFyIGlmeF9mcmVlX3Jlc3VsdCBpZnhfZ2V0X2Jsb2IgaWZ4X2dldF9jaGFyIGlmeF9nZXRzcWxjYSBpZnhfaHRtbHRibF9yZXN1bHQgaWZ4X251bGxmb3JtYXQgaWZ4X251bV9maWVsZHMgaWZ4X251bV9yb3dzIGlmeF9wY29ubmVjdCBpZnhfcHJlcGFyZSBpZnhfcXVlcnkgaWZ4X3RleHRhc3ZhcmNoYXIgaWZ4X3VwZGF0ZV9ibG9iIGlmeF91cGRhdGVfY2hhciBpZnh1c19jbG9zZV9zbG9iIGlmeHVzX2NyZWF0ZV9zbG9iIGlmeHVzX2ZyZWVfc2xvYiBpZnh1c19vcGVuX3Nsb2IgaWZ4dXNfcmVhZF9zbG9iIGlmeHVzX3NlZWtfc2xvYiBpZnh1c190ZWxsX3Nsb2IgaWZ4dXNfd3JpdGVfc2xvYiBpZnhfYWZmZWN0ZWRfcm93cykKKyAgICAgICAgICBiWyJJSVMiXSA9IFNldC5uZXcgJXcoaWlzX2FkZF9zZXJ2ZXIgaWlzX2FkZF9zZXJ2ZXIgaWlzX2dldF9kaXJfc2VjdXJpdHkgaWlzX2dldF9zY3JpcHRfbWFwIGlpc19nZXRfc2VydmVyX2J5X2NvbW1lbnQgaWlzX2dldF9zZXJ2ZXJfYnlfcGF0aCBpaXNfZ2V0X3NlcnZlcl9yaWdodHMgaWlzX2dldF9zZXJ2aWNlX3N0YXRlIGlpc19yZW1vdmVfc2VydmVyIGlpc19zZXRfYXBwX3NldHRpbmdzIGlpc19zZXRfZGlyX3NlY3VyaXR5IGlpc19zZXRfc2NyaXB0X21hcCBpaXNfc2V0X3NlcnZlcl9yaWdodHMgaWlzX3N0YXJ0X3NlcnZlciBpaXNfc3RhcnRfc2VydmljZSBpaXNfc3RvcF9zZXJ2ZXIgaWlzX3N0b3Bfc2VydmljZSBpaXNfYWRkX3NlcnZlcikKKyAgICAgICAgICBiWyJHRCBhbmQgSW1hZ2UiXSA9IFNldC5uZXcgJXcoZ2RfaW5mbyBnZF9pbmZvIGdldGltYWdlc2l6ZSBnZXRpbWFnZXNpemVmcm9tc3RyaW5nIGltYWdlX3R5cGVfdG9fZXh0ZW5zaW9uIGltYWdlX3R5cGVfdG9fbWltZV90eXBlIGltYWdlMndibXAgaW1hZ2VhZmZpbmUgaW1hZ2VhZmZpbmVtYXRyaXhjb25jYXQgaW1hZ2VhZmZpbmVtYXRyaXhnZXQgaW1hZ2VhbHBoYWJsZW5kaW5nIGltYWdlYW50aWFsaWFzIGltYWdlYXJjIGltYWdlY2hhciBpbWFnZWNoYXJ1cCBpbWFnZWNvbG9yYWxsb2NhdGUgaW1hZ2Vjb2xvcmFsbG9jYXRlYWxwaGEgaW1hZ2Vjb2xvcmF0IGltYWdlY29sb3JjbG9zZXN0IGltYWdlY29sb3JjbG9zZXN0YWxwaGEgaW1hZ2Vjb2xvcmNsb3Nlc3Rod2IgaW1hZ2Vjb2xvcmRlYWxsb2NhdGUgaW1hZ2Vjb2xvcmV4YWN0IGltYWdlY29sb3JleGFjdGFscGhhIGltYWdlY29sb3JtYXRjaCBpbWFnZWNvbG9ycmVzb2x2ZSBpbWFnZWNvbG9ycmVzb2x2ZWFscGhhIGltYWdlY29sb3JzZXQgaW1hZ2Vjb2xvcnNmb3JpbmRleCBpbWFnZWNvbG9yc3RvdGFsIGltYWdlY29sb3J0cmFuc3BhcmVudCBpbWFnZWNvbnZvbHV0aW9uIGltYWdlY29weSBpbWFnZWNvcHltZXJnZSBpbWFnZWNvcHltZXJnZWdyYXkgaW1hZ2Vjb3B5cmVzYW1wbGVkIGltYWdlY29weXJlc2l6ZWQgaW1hZ2VjcmVhdGUgaW1hZ2VjcmVhdGVmcm9tZ2QyIGltYWdlY3JlYXRlZnJvbWdkMnBhcnQgaW1hZ2VjcmVhdGVmcm9tZ2QgaW1hZ2VjcmVhdGVmcm9tZ2lmIGltYWdlY3JlYXRlZnJvbWpwZWcgaW1hZ2VjcmVhdGVmcm9tcG5nIGltYWdlY3JlYXRlZnJvbXN0cmluZyBpbWFnZWNyZWF0ZWZyb213Ym1wIGltYWdlY3JlYXRlZnJvbXdlYnAgaW1hZ2VjcmVhdGVmcm9teGJtIGltYWdlY3JlYXRlZnJvbXhwbSBpbWFnZWNyZWF0ZXRydWVjb2xvciBpbWFnZWNyb3AgaW1hZ2Vjcm9wYXV0byBpbWFnZWRhc2hlZGxpbmUgaW1hZ2VkZXN0cm95IGltYWdlZWxsaXBzZSBpbWFnZWZpbGwgaW1hZ2VmaWxsZWRhcmMgaW1hZ2VmaWxsZWRlbGxpcHNlIGltYWdlZmlsbGVkcG9seWdvbiBpbWFnZWZpbGxlZHJlY3RhbmdsZSBpbWFnZWZpbGx0b2JvcmRlciBpbWFnZWZpbHRlciBpbWFnZWZsaXAgaW1hZ2Vmb250aGVpZ2h0IGltYWdlZm9udHdpZHRoIGltYWdlZnRiYm94IGltYWdlZnR0ZXh0IGltYWdlZ2FtbWFjb3JyZWN0IGltYWdlZ2QyIGltYWdlZ2QgaW1hZ2VnaWYgaW1hZ2VncmFic2NyZWVuIGltYWdlZ3JhYndpbmRvdyBpbWFnZWludGVybGFjZSBpbWFnZWlzdHJ1ZWNvbG9yIGltYWdlanBlZyBpbWFnZWxheWVyZWZmZWN0IGltYWdlbGluZSBpbWFnZWxvYWRmb250IGltYWdlcGFsZXR0ZWNvcHkgaW1hZ2VwYWxldHRldG90cnVlY29sb3IgaW1hZ2VwbmcgaW1hZ2Vwb2x5Z29uIGltYWdlcHNiYm94IGltYWdlcHNlbmNvZGVmb250IGltYWdlcHNleHRlbmRmb250IGltYWdlcHNmcmVlZm9udCBpbWFnZXBzbG9hZGZvbnQgaW1hZ2Vwc3NsYW50Zm9udCBpbWFnZXBzdGV4dCBpbWFnZXJlY3RhbmdsZSBpbWFnZXJvdGF0ZSBpbWFnZXNhdmVhbHBoYSBpbWFnZXNjYWxlIGltYWdlc2V0YnJ1c2ggaW1hZ2VzZXRpbnRlcnBvbGF0aW9uIGltYWdlc2V0cGl4ZWwgaW1hZ2VzZXRzdHlsZSBpbWFnZXNldHRoaWNrbmVzcyBpbWFnZXNldHRpbGUgaW1hZ2VzdHJpbmcgaW1hZ2VzdHJpbmd1cCBpbWFnZXN4IGltYWdlc3kgaW1hZ2V0cnVlY29sb3J0b3BhbGV0dGUgaW1hZ2V0dGZiYm94IGltYWdldHRmdGV4dCBpbWFnZXR5cGVzIGltYWdld2JtcCBpbWFnZXdlYnAgaW1hZ2V4Ym0gaXB0Y2VtYmVkIGlwdGNwYXJzZSBqcGVnMndibXAgcG5nMndibXAgZ2RfaW5mbykKKyAgICAgICAgICBiWyJJTUFQIl0gPSBTZXQubmV3ICV3KGltYXBfOGJpdCBpbWFwXzhiaXQgaW1hcF9hbGVydHMgaW1hcF9hcHBlbmQgaW1hcF9iYXNlNjQgaW1hcF9iaW5hcnkgaW1hcF9ib2R5IGltYXBfYm9keXN0cnVjdCBpbWFwX2NoZWNrIGltYXBfY2xlYXJmbGFnX2Z1bGwgaW1hcF9jbG9zZSBpbWFwX2NyZWF0ZSBpbWFwX2NyZWF0ZW1haWxib3ggaW1hcF9kZWxldGUgaW1hcF9kZWxldGVtYWlsYm94IGltYXBfZXJyb3JzIGltYXBfZXhwdW5nZSBpbWFwX2ZldGNoX292ZXJ2aWV3IGltYXBfZmV0Y2hib2R5IGltYXBfZmV0Y2hoZWFkZXIgaW1hcF9mZXRjaG1pbWUgaW1hcF9mZXRjaHN0cnVjdHVyZSBpbWFwX2ZldGNodGV4dCBpbWFwX2djIGltYXBfZ2V0X3F1b3RhIGltYXBfZ2V0X3F1b3Rhcm9vdCBpbWFwX2dldGFjbCBpbWFwX2dldG1haWxib3hlcyBpbWFwX2dldHN1YnNjcmliZWQgaW1hcF9oZWFkZXIgaW1hcF9oZWFkZXJpbmZvIGltYXBfaGVhZGVycyBpbWFwX2xhc3RfZXJyb3IgaW1hcF9saXN0IGltYXBfbGlzdG1haWxib3ggaW1hcF9saXN0c2NhbiBpbWFwX2xpc3RzdWJzY3JpYmVkIGltYXBfbHN1YiBpbWFwX21haWxfY29tcG9zZSBpbWFwX21haWxfY29weSBpbWFwX21haWxfbW92ZSBpbWFwX21haWwgaW1hcF9tYWlsYm94bXNnaW5mbyBpbWFwX21pbWVfaGVhZGVyX2RlY29kZSBpbWFwX21zZ25vIGltYXBfbnVtX21zZyBpbWFwX251bV9yZWNlbnQgaW1hcF9vcGVuIGltYXBfcGluZyBpbWFwX3FwcmludCBpbWFwX3JlbmFtZSBpbWFwX3JlbmFtZW1haWxib3ggaW1hcF9yZW9wZW4gaW1hcF9yZmM4MjJfcGFyc2VfYWRybGlzdCBpbWFwX3JmYzgyMl9wYXJzZV9oZWFkZXJzIGltYXBfcmZjODIyX3dyaXRlX2FkZHJlc3MgaW1hcF9zYXZlYm9keSBpbWFwX3NjYW4gaW1hcF9zY2FubWFpbGJveCBpbWFwX3NlYXJjaCBpbWFwX3NldF9xdW90YSBpbWFwX3NldGFjbCBpbWFwX3NldGZsYWdfZnVsbCBpbWFwX3NvcnQgaW1hcF9zdGF0dXMgaW1hcF9zdWJzY3JpYmUgaW1hcF90aHJlYWQgaW1hcF90aW1lb3V0IGltYXBfdWlkIGltYXBfdW5kZWxldGUgaW1hcF91bnN1YnNjcmliZSBpbWFwX3V0ZjdfZGVjb2RlIGltYXBfdXRmN19lbmNvZGUgaW1hcF91dGY4IGltYXBfOGJpdCkKKyAgICAgICAgICBiWyJpbmNsdWVkIl0gPSBTZXQubmV3ICV3KGluY2x1ZWRfZ2V0X2RhdGEgaW5jbHVlZF9nZXRfZGF0YSBpbmNsdWVkX2dldF9kYXRhKQorICAgICAgICAgIGJbIlBIUCBPcHRpb25zL0luZm8iXSA9IFNldC5uZXcgJXcoYXNzZXJ0X29wdGlvbnMgYXNzZXJ0X29wdGlvbnMgYXNzZXJ0IGNsaV9nZXRfcHJvY2Vzc190aXRsZSBjbGlfc2V0X3Byb2Nlc3NfdGl0bGUgZGwgZXh0ZW5zaW9uX2xvYWRlZCBnY19jb2xsZWN0X2N5Y2xlcyBnY19kaXNhYmxlIGdjX2VuYWJsZSBnY19lbmFibGVkIGdldF9jZmdfdmFyIGdldF9jdXJyZW50X3VzZXIgZ2V0X2RlZmluZWRfY29uc3RhbnRzIGdldF9leHRlbnNpb25fZnVuY3MgZ2V0X2luY2x1ZGVfcGF0aCBnZXRfaW5jbHVkZWRfZmlsZXMgZ2V0X2xvYWRlZF9leHRlbnNpb25zIGdldF9tYWdpY19xdW90ZXNfZ3BjIGdldF9tYWdpY19xdW90ZXNfcnVudGltZSBnZXRfcmVxdWlyZWRfZmlsZXMgZ2V0ZW52IGdldGxhc3Rtb2QgZ2V0bXlnaWQgZ2V0bXlpbm9kZSBnZXRteXBpZCBnZXRteXVpZCBnZXRvcHQgZ2V0cnVzYWdlIGluaV9hbHRlciBpbmlfZ2V0X2FsbCBpbmlfZ2V0IGluaV9yZXN0b3JlIGluaV9zZXQgbWFnaWNfcXVvdGVzX3J1bnRpbWUgbWFpbiBtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UgbWVtb3J5X2dldF91c2FnZSBwaHBfaW5pX2xvYWRlZF9maWxlIHBocF9pbmlfc2Nhbm5lZF9maWxlcyBwaHBfbG9nb19ndWlkIHBocF9zYXBpX25hbWUgcGhwX3VuYW1lIHBocGNyZWRpdHMgcGhwaW5mbyBwaHB2ZXJzaW9uIHB1dGVudiByZXN0b3JlX2luY2x1ZGVfcGF0aCBzZXRfaW5jbHVkZV9wYXRoIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSBzZXRfdGltZV9saW1pdCBzeXNfZ2V0X3RlbXBfZGlyIHZlcnNpb25fY29tcGFyZSB6ZW5kX2xvZ29fZ3VpZCB6ZW5kX3RocmVhZF9pZCB6ZW5kX3ZlcnNpb24gYXNzZXJ0X29wdGlvbnMpCisgICAgICAgICAgYlsiSW5ncmVzIl0gPSBTZXQubmV3ICV3KGluZ3Jlc19hdXRvY29tbWl0X3N0YXRlIGluZ3Jlc19hdXRvY29tbWl0X3N0YXRlIGluZ3Jlc19hdXRvY29tbWl0IGluZ3Jlc19jaGFyc2V0IGluZ3Jlc19jbG9zZSBpbmdyZXNfY29tbWl0IGluZ3Jlc19jb25uZWN0IGluZ3Jlc19jdXJzb3IgaW5ncmVzX2Vycm5vIGluZ3Jlc19lcnJvciBpbmdyZXNfZXJyc3Fsc3RhdGUgaW5ncmVzX2VzY2FwZV9zdHJpbmcgaW5ncmVzX2V4ZWN1dGUgaW5ncmVzX2ZldGNoX2FycmF5IGluZ3Jlc19mZXRjaF9hc3NvYyBpbmdyZXNfZmV0Y2hfb2JqZWN0IGluZ3Jlc19mZXRjaF9wcm9jX3JldHVybiBpbmdyZXNfZmV0Y2hfcm93IGluZ3Jlc19maWVsZF9sZW5ndGggaW5ncmVzX2ZpZWxkX25hbWUgaW5ncmVzX2ZpZWxkX251bGxhYmxlIGluZ3Jlc19maWVsZF9wcmVjaXNpb24gaW5ncmVzX2ZpZWxkX3NjYWxlIGluZ3Jlc19maWVsZF90eXBlIGluZ3Jlc19mcmVlX3Jlc3VsdCBpbmdyZXNfbmV4dF9lcnJvciBpbmdyZXNfbnVtX2ZpZWxkcyBpbmdyZXNfbnVtX3Jvd3MgaW5ncmVzX3Bjb25uZWN0IGluZ3Jlc19wcmVwYXJlIGluZ3Jlc19xdWVyeSBpbmdyZXNfcmVzdWx0X3NlZWsgaW5ncmVzX3JvbGxiYWNrIGluZ3Jlc19zZXRfZW52aXJvbm1lbnQgaW5ncmVzX3VuYnVmZmVyZWRfcXVlcnkgaW5ncmVzX2F1dG9jb21taXRfc3RhdGUpCisgICAgICAgICAgYlsiSW5vdGlmeSJdID0gU2V0Lm5ldyAldyhpbm90aWZ5X2FkZF93YXRjaCBpbm90aWZ5X2FkZF93YXRjaCBpbm90aWZ5X2luaXQgaW5vdGlmeV9xdWV1ZV9sZW4gaW5vdGlmeV9yZWFkIGlub3RpZnlfcm1fd2F0Y2ggaW5vdGlmeV9hZGRfd2F0Y2gpCisgICAgICAgICAgYlsiR3JhcGhlbWUiXSA9IFNldC5uZXcgJXcoZ3JhcGhlbWVfZXh0cmFjdCBncmFwaGVtZV9leHRyYWN0IGdyYXBoZW1lX3N0cmlwb3MgZ3JhcGhlbWVfc3RyaXN0ciBncmFwaGVtZV9zdHJsZW4gZ3JhcGhlbWVfc3RycG9zIGdyYXBoZW1lX3N0cnJpcG9zIGdyYXBoZW1lX3N0cnJwb3MgZ3JhcGhlbWVfc3Ryc3RyIGdyYXBoZW1lX3N1YnN0ciBncmFwaGVtZV9leHRyYWN0KQorICAgICAgICAgIGJbImludGwiXSA9IFNldC5uZXcgJXcoaW50bF9lcnJvcl9uYW1lIGludGxfZXJyb3JfbmFtZSBpbnRsX2dldF9lcnJvcl9jb2RlIGludGxfZ2V0X2Vycm9yX21lc3NhZ2UgaW50bF9pc19mYWlsdXJlIGludGxfZXJyb3JfbmFtZSkKKyAgICAgICAgICBiWyJJRE4iXSA9IFNldC5uZXcgJXcoZ3JhcGhlbWVfc3Vic3RyIGlkbl90b19hc2NpaSBpZG5fdG9fYXNjaWkgaWRuX3RvX3VuaWNvZGUgaWRuX3RvX3V0ZjggZ3JhcGhlbWVfc3Vic3RyIGlkbl90b19hc2NpaSkKKyAgICAgICAgICBiWyJKYXZhIl0gPSBTZXQubmV3ICV3KGphdmFfbGFzdF9leGNlcHRpb25fY2xlYXIgamF2YV9sYXN0X2V4Y2VwdGlvbl9jbGVhciBqYXZhX2xhc3RfZXhjZXB0aW9uX2dldCBqYXZhX2xhc3RfZXhjZXB0aW9uX2NsZWFyKQorICAgICAgICAgIGJbIkpTT04iXSA9IFNldC5uZXcgJXcoanNvbl9kZWNvZGUganNvbl9kZWNvZGUganNvbl9lbmNvZGUganNvbl9sYXN0X2Vycm9yX21zZyBqc29uX2xhc3RfZXJyb3IganNvbl9kZWNvZGUpCisgICAgICAgICAgYlsiSnVkeSJdID0gU2V0Lm5ldyAldyhqdWR5X3R5cGUganVkeV90eXBlIGp1ZHlfdmVyc2lvbiBqdWR5X3R5cGUpCisgICAgICAgICAgYlsiS0FETTUiXSA9IFNldC5uZXcgJXcoa2FkbTVfY2hwYXNzX3ByaW5jaXBhbCBrYWRtNV9jaHBhc3NfcHJpbmNpcGFsIGthZG01X2NyZWF0ZV9wcmluY2lwYWwga2FkbTVfZGVsZXRlX3ByaW5jaXBhbCBrYWRtNV9kZXN0cm95IGthZG01X2ZsdXNoIGthZG01X2dldF9wb2xpY2llcyBrYWRtNV9nZXRfcHJpbmNpcGFsIGthZG01X2dldF9wcmluY2lwYWxzIGthZG01X2luaXRfd2l0aF9wYXNzd29yZCBrYWRtNV9tb2RpZnlfcHJpbmNpcGFsIGthZG01X2NocGFzc19wcmluY2lwYWwpCisgICAgICAgICAgYlsiTERBUCJdID0gU2V0Lm5ldyAldyhsZGFwXzg4NTlfdG9fdDYxIGxkYXBfODg1OV90b190NjEgbGRhcF9hZGQgbGRhcF9iaW5kIGxkYXBfY2xvc2UgbGRhcF9jb21wYXJlIGxkYXBfY29ubmVjdCBsZGFwX2NvbnRyb2xfcGFnZWRfcmVzdWx0X3Jlc3BvbnNlIGxkYXBfY29udHJvbF9wYWdlZF9yZXN1bHQgbGRhcF9jb3VudF9lbnRyaWVzIGxkYXBfZGVsZXRlIGxkYXBfZG4ydWZuIGxkYXBfZXJyMnN0ciBsZGFwX2Vycm5vIGxkYXBfZXJyb3IgbGRhcF9leHBsb2RlX2RuIGxkYXBfZmlyc3RfYXR0cmlidXRlIGxkYXBfZmlyc3RfZW50cnkgbGRhcF9maXJzdF9yZWZlcmVuY2UgbGRhcF9mcmVlX3Jlc3VsdCBsZGFwX2dldF9hdHRyaWJ1dGVzIGxkYXBfZ2V0X2RuIGxkYXBfZ2V0X2VudHJpZXMgbGRhcF9nZXRfb3B0aW9uIGxkYXBfZ2V0X3ZhbHVlc19sZW4gbGRhcF9nZXRfdmFsdWVzIGxkYXBfbGlzdCBsZGFwX21vZF9hZGQgbGRhcF9tb2RfZGVsIGxkYXBfbW9kX3JlcGxhY2UgbGRhcF9tb2RpZnkgbGRhcF9uZXh0X2F0dHJpYnV0ZSBsZGFwX25leHRfZW50cnkgbGRhcF9uZXh0X3JlZmVyZW5jZSBsZGFwX3BhcnNlX3JlZmVyZW5jZSBsZGFwX3BhcnNlX3Jlc3VsdCBsZGFwX3JlYWQgbGRhcF9yZW5hbWUgbGRhcF9zYXNsX2JpbmQgbGRhcF9zZWFyY2ggbGRhcF9zZXRfb3B0aW9uIGxkYXBfc2V0X3JlYmluZF9wcm9jIGxkYXBfc29ydCBsZGFwX3N0YXJ0X3RscyBsZGFwX3Q2MV90b184ODU5IGxkYXBfdW5iaW5kIGxkYXBfODg1OV90b190NjEpCisgICAgICAgICAgYlsiTGliZXZlbnQiXSA9IFNldC5uZXcgJXcoZXZlbnRfYWRkIGV2ZW50X2FkZCBldmVudF9iYXNlX2ZyZWUgZXZlbnRfYmFzZV9sb29wIGV2ZW50X2Jhc2VfbG9vcGJyZWFrIGV2ZW50X2Jhc2VfbG9vcGV4aXQgZXZlbnRfYmFzZV9uZXcgZXZlbnRfYmFzZV9wcmlvcml0eV9pbml0IGV2ZW50X2Jhc2VfcmVpbml0IGV2ZW50X2Jhc2Vfc2V0IGV2ZW50X2J1ZmZlcl9iYXNlX3NldCBldmVudF9idWZmZXJfZGlzYWJsZSBldmVudF9idWZmZXJfZW5hYmxlIGV2ZW50X2J1ZmZlcl9mZF9zZXQgZXZlbnRfYnVmZmVyX2ZyZWUgZXZlbnRfYnVmZmVyX25ldyBldmVudF9idWZmZXJfcHJpb3JpdHlfc2V0IGV2ZW50X2J1ZmZlcl9yZWFkIGV2ZW50X2J1ZmZlcl9zZXRfY2FsbGJhY2sgZXZlbnRfYnVmZmVyX3RpbWVvdXRfc2V0IGV2ZW50X2J1ZmZlcl93YXRlcm1hcmtfc2V0IGV2ZW50X2J1ZmZlcl93cml0ZSBldmVudF9kZWwgZXZlbnRfZnJlZSBldmVudF9uZXcgZXZlbnRfcHJpb3JpdHlfc2V0IGV2ZW50X3NldCBldmVudF90aW1lcl9hZGQgZXZlbnRfdGltZXJfZGVsIGV2ZW50X3RpbWVyX25ldyBldmVudF90aW1lcl9zZXQgZXZlbnRfYWRkKQorICAgICAgICAgIGJbImxpYnhtbCJdID0gU2V0Lm5ldyAldyhsaWJ4bWxfY2xlYXJfZXJyb3JzIGxpYnhtbF9jbGVhcl9lcnJvcnMgbGlieG1sX2Rpc2FibGVfZW50aXR5X2xvYWRlciBsaWJ4bWxfZ2V0X2Vycm9ycyBsaWJ4bWxfZ2V0X2xhc3RfZXJyb3IgbGlieG1sX3NldF9leHRlcm5hbF9lbnRpdHlfbG9hZGVyIGxpYnhtbF9zZXRfc3RyZWFtc19jb250ZXh0IGxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzIGxpYnhtbF9jbGVhcl9lcnJvcnMpCisgICAgICAgICAgYlsiTFpGIl0gPSBTZXQubmV3ICV3KGx6Zl9jb21wcmVzcyBsemZfY29tcHJlc3MgbHpmX2RlY29tcHJlc3MgbHpmX29wdGltaXplZF9mb3IgbHpmX2NvbXByZXNzKQorICAgICAgICAgIGJbIk1haWwiXSA9IFNldC5uZXcgJXcoZXptbG1faGFzaCBlem1sbV9oYXNoIG1haWwgZXptbG1faGFzaCkKKyAgICAgICAgICBiWyJNYWlscGFyc2UiXSA9IFNldC5uZXcgJXcobWFpbHBhcnNlX2RldGVybWluZV9iZXN0X3hmZXJfZW5jb2RpbmcgbWFpbHBhcnNlX2RldGVybWluZV9iZXN0X3hmZXJfZW5jb2RpbmcgbWFpbHBhcnNlX21zZ19jcmVhdGUgbWFpbHBhcnNlX21zZ19leHRyYWN0X3BhcnRfZmlsZSBtYWlscGFyc2VfbXNnX2V4dHJhY3RfcGFydCBtYWlscGFyc2VfbXNnX2V4dHJhY3Rfd2hvbGVfcGFydF9maWxlIG1haWxwYXJzZV9tc2dfZnJlZSBtYWlscGFyc2VfbXNnX2dldF9wYXJ0X2RhdGEgbWFpbHBhcnNlX21zZ19nZXRfcGFydCBtYWlscGFyc2VfbXNnX2dldF9zdHJ1Y3R1cmUgbWFpbHBhcnNlX21zZ19wYXJzZV9maWxlIG1haWxwYXJzZV9tc2dfcGFyc2UgbWFpbHBhcnNlX3JmYzgyMl9wYXJzZV9hZGRyZXNzZXMgbWFpbHBhcnNlX3N0cmVhbV9lbmNvZGUgbWFpbHBhcnNlX3V1ZGVjb2RlX2FsbCBtYWlscGFyc2VfZGV0ZXJtaW5lX2Jlc3RfeGZlcl9lbmNvZGluZykKKyAgICAgICAgICBiWyJNYXRoIl0gPSBTZXQubmV3ICV3KGFicyBhYnMgYWNvcyBhY29zaCBhc2luIGFzaW5oIGF0YW4yIGF0YW4gYXRhbmggYmFzZV9jb252ZXJ0IGJpbmRlYyBjZWlsIGNvcyBjb3NoIGRlY2JpbiBkZWNoZXggZGVjb2N0IGRlZzJyYWQgZXhwIGV4cG0xIGZsb29yIGZtb2QgZ2V0cmFuZG1heCBoZXhkZWMgaHlwb3QgaXNfZmluaXRlIGlzX2luZmluaXRlIGlzX25hbiBsY2dfdmFsdWUgbG9nMTAgbG9nMXAgbG9nIG1heCBtaW4gbXRfZ2V0cmFuZG1heCBtdF9yYW5kIG10X3NyYW5kIG9jdGRlYyBwaSBwb3cgcmFkMmRlZyByYW5kIHJvdW5kIHNpbiBzaW5oIHNxcnQgc3JhbmQgdGFuIHRhbmggYWJzKQorICAgICAgICAgIGJbIk1heERCIl0gPSBTZXQubmV3ICV3KG1heGRiX2FmZmVjdGVkX3Jvd3MgbWF4ZGJfYWZmZWN0ZWRfcm93cyBtYXhkYl9hdXRvY29tbWl0IG1heGRiX2JpbmRfcGFyYW0gbWF4ZGJfYmluZF9yZXN1bHQgbWF4ZGJfY2hhbmdlX3VzZXIgbWF4ZGJfY2hhcmFjdGVyX3NldF9uYW1lIG1heGRiX2NsaWVudF9lbmNvZGluZyBtYXhkYl9jbG9zZV9sb25nX2RhdGEgbWF4ZGJfY2xvc2UgbWF4ZGJfY29tbWl0IG1heGRiX2Nvbm5lY3RfZXJybm8gbWF4ZGJfY29ubmVjdF9lcnJvciBtYXhkYl9jb25uZWN0IG1heGRiX2RhdGFfc2VlayBtYXhkYl9kZWJ1ZyBtYXhkYl9kaXNhYmxlX3JlYWRzX2Zyb21fbWFzdGVyIG1heGRiX2Rpc2FibGVfcnBsX3BhcnNlIG1heGRiX2R1bXBfZGVidWdfaW5mbyBtYXhkYl9lbWJlZGRlZF9jb25uZWN0IG1heGRiX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlciBtYXhkYl9lbmFibGVfcnBsX3BhcnNlIG1heGRiX2Vycm5vIG1heGRiX2Vycm9yIG1heGRiX2VzY2FwZV9zdHJpbmcgbWF4ZGJfZXhlY3V0ZSBtYXhkYl9mZXRjaF9hcnJheSBtYXhkYl9mZXRjaF9hc3NvYyBtYXhkYl9mZXRjaF9maWVsZF9kaXJlY3QgbWF4ZGJfZmV0Y2hfZmllbGQgbWF4ZGJfZmV0Y2hfZmllbGRzIG1heGRiX2ZldGNoX2xlbmd0aHMgbWF4ZGJfZmV0Y2hfb2JqZWN0IG1heGRiX2ZldGNoX3JvdyBtYXhkYl9mZXRjaCBtYXhkYl9maWVsZF9jb3VudCBtYXhkYl9maWVsZF9zZWVrIG1heGRiX2ZpZWxkX3RlbGwgbWF4ZGJfZnJlZV9yZXN1bHQgbWF4ZGJfZ2V0X2NsaWVudF9pbmZvIG1heGRiX2dldF9jbGllbnRfdmVyc2lvbiBtYXhkYl9nZXRfaG9zdF9pbmZvIG1heGRiX2dldF9tZXRhZGF0YSBtYXhkYl9nZXRfcHJvdG9faW5mbyBtYXhkYl9nZXRfc2VydmVyX2luZm8gbWF4ZGJfZ2V0X3NlcnZlcl92ZXJzaW9uIG1heGRiX2luZm8gbWF4ZGJfaW5pdCBtYXhkYl9pbnNlcnRfaWQgbWF4ZGJfa2lsbCBtYXhkYl9tYXN0ZXJfcXVlcnkgbWF4ZGJfbW9yZV9yZXN1bHRzIG1heGRiX211bHRpX3F1ZXJ5IG1heGRiX25leHRfcmVzdWx0IG1heGRiX251bV9maWVsZHMgbWF4ZGJfbnVtX3Jvd3MgbWF4ZGJfb3B0aW9ucyBtYXhkYl9wYXJhbV9jb3VudCBtYXhkYl9waW5nIG1heGRiX3ByZXBhcmUgbWF4ZGJfcXVlcnkgbWF4ZGJfcmVhbF9jb25uZWN0IG1heGRiX3JlYWxfZXNjYXBlX3N0cmluZyBtYXhkYl9yZWFsX3F1ZXJ5IG1heGRiX3JlcG9ydCBtYXhkYl9yb2xsYmFjayBtYXhkYl9ycGxfcGFyc2VfZW5hYmxlZCBtYXhkYl9ycGxfcHJvYmUgbWF4ZGJfcnBsX3F1ZXJ5X3R5cGUgbWF4ZGJfc2VsZWN0X2RiIG1heGRiX3NlbmRfbG9uZ19kYXRhIG1heGRiX3NlbmRfcXVlcnkgbWF4ZGJfc2VydmVyX2VuZCBtYXhkYl9zZXJ2ZXJfaW5pdCBtYXhkYl9zZXRfb3B0IG1heGRiX3NxbHN0YXRlIG1heGRiX3NzbF9zZXQgbWF4ZGJfc3RhdCBtYXhkYl9zdG10X2FmZmVjdGVkX3Jvd3MgbWF4ZGJfc3RtdF9iaW5kX3BhcmFtIG1heGRiX3N0bXRfYmluZF9yZXN1bHQgbWF4ZGJfc3RtdF9jbG9zZV9sb25nX2RhdGEgbWF4ZGJfc3RtdF9jbG9zZSBtYXhkYl9zdG10X2RhdGFfc2VlayBtYXhkYl9zdG10X2Vycm5vIG1heGRiX3N0bXRfZXJyb3IgbWF4ZGJfc3RtdF9leGVjdXRlIG1heGRiX3N0bXRfZmV0Y2ggbWF4ZGJfc3RtdF9mcmVlX3Jlc3VsdCBtYXhkYl9zdG10X2luaXQgbWF4ZGJfc3RtdF9udW1fcm93cyBtYXhkYl9zdG10X3BhcmFtX2NvdW50IG1heGRiX3N0bXRfcHJlcGFyZSBtYXhkYl9zdG10X3Jlc2V0IG1heGRiX3N0bXRfcmVzdWx0X21ldGFkYXRhIG1heGRiX3N0bXRfc2VuZF9sb25nX2RhdGEgbWF4ZGJfc3RtdF9zcWxzdGF0ZSBtYXhkYl9zdG10X3N0b3JlX3Jlc3VsdCBtYXhkYl9zdG9yZV9yZXN1bHQgbWF4ZGJfdGhyZWFkX2lkIG1heGRiX3RocmVhZF9zYWZlIG1heGRiX3VzZV9yZXN1bHQgbWF4ZGJfd2FybmluZ19jb3VudCBtYXhkYl9hZmZlY3RlZF9yb3dzKQorICAgICAgICAgIGJbIk11bHRpYnl0ZSBTdHJpbmciXSA9IFNldC5uZXcgJXcobWJfY2hlY2tfZW5jb2RpbmcgbWJfY2hlY2tfZW5jb2RpbmcgbWJfY29udmVydF9jYXNlIG1iX2NvbnZlcnRfZW5jb2RpbmcgbWJfY29udmVydF9rYW5hIG1iX2NvbnZlcnRfdmFyaWFibGVzIG1iX2RlY29kZV9taW1laGVhZGVyIG1iX2RlY29kZV9udW1lcmljZW50aXR5IG1iX2RldGVjdF9lbmNvZGluZyBtYl9kZXRlY3Rfb3JkZXIgbWJfZW5jb2RlX21pbWVoZWFkZXIgbWJfZW5jb2RlX251bWVyaWNlbnRpdHkgbWJfZW5jb2RpbmdfYWxpYXNlcyBtYl9lcmVnX21hdGNoIG1iX2VyZWdfcmVwbGFjZV9jYWxsYmFjayBtYl9lcmVnX3JlcGxhY2UgbWJfZXJlZ19zZWFyY2hfZ2V0cG9zIG1iX2VyZWdfc2VhcmNoX2dldHJlZ3MgbWJfZXJlZ19zZWFyY2hfaW5pdCBtYl9lcmVnX3NlYXJjaF9wb3MgbWJfZXJlZ19zZWFyY2hfcmVncyBtYl9lcmVnX3NlYXJjaF9zZXRwb3MgbWJfZXJlZ19zZWFyY2ggbWJfZXJlZyBtYl9lcmVnaV9yZXBsYWNlIG1iX2VyZWdpIG1iX2dldF9pbmZvIG1iX2h0dHBfaW5wdXQgbWJfaHR0cF9vdXRwdXQgbWJfaW50ZXJuYWxfZW5jb2RpbmcgbWJfbGFuZ3VhZ2UgbWJfbGlzdF9lbmNvZGluZ3MgbWJfb3V0cHV0X2hhbmRsZXIgbWJfcGFyc2Vfc3RyIG1iX3ByZWZlcnJlZF9taW1lX25hbWUgbWJfcmVnZXhfZW5jb2RpbmcgbWJfcmVnZXhfc2V0X29wdGlvbnMgbWJfc2VuZF9tYWlsIG1iX3NwbGl0IG1iX3N0cmN1dCBtYl9zdHJpbXdpZHRoIG1iX3N0cmlwb3MgbWJfc3RyaXN0ciBtYl9zdHJsZW4gbWJfc3RycG9zIG1iX3N0cnJjaHIgbWJfc3RycmljaHIgbWJfc3Rycmlwb3MgbWJfc3RycnBvcyBtYl9zdHJzdHIgbWJfc3RydG9sb3dlciBtYl9zdHJ0b3VwcGVyIG1iX3N0cndpZHRoIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyIG1iX3N1YnN0cl9jb3VudCBtYl9zdWJzdHIgbWJfY2hlY2tfZW5jb2RpbmcpCisgICAgICAgICAgYlsiTWNyeXB0Il0gPSBTZXQubmV3ICV3KG1jcnlwdF9jYmMgbWNyeXB0X2NiYyBtY3J5cHRfY2ZiIG1jcnlwdF9jcmVhdGVfaXYgbWNyeXB0X2RlY3J5cHQgbWNyeXB0X2VjYiBtY3J5cHRfZW5jX2dldF9hbGdvcml0aG1zX25hbWUgbWNyeXB0X2VuY19nZXRfYmxvY2tfc2l6ZSBtY3J5cHRfZW5jX2dldF9pdl9zaXplIG1jcnlwdF9lbmNfZ2V0X2tleV9zaXplIG1jcnlwdF9lbmNfZ2V0X21vZGVzX25hbWUgbWNyeXB0X2VuY19nZXRfc3VwcG9ydGVkX2tleV9zaXplcyBtY3J5cHRfZW5jX2lzX2Jsb2NrX2FsZ29yaXRobV9tb2RlIG1jcnlwdF9lbmNfaXNfYmxvY2tfYWxnb3JpdGhtIG1jcnlwdF9lbmNfaXNfYmxvY2tfbW9kZSBtY3J5cHRfZW5jX3NlbGZfdGVzdCBtY3J5cHRfZW5jcnlwdCBtY3J5cHRfZ2VuZXJpY19kZWluaXQgbWNyeXB0X2dlbmVyaWNfZW5kIG1jcnlwdF9nZW5lcmljX2luaXQgbWNyeXB0X2dlbmVyaWMgbWNyeXB0X2dldF9ibG9ja19zaXplIG1jcnlwdF9nZXRfY2lwaGVyX25hbWUgbWNyeXB0X2dldF9pdl9zaXplIG1jcnlwdF9nZXRfa2V5X3NpemUgbWNyeXB0X2xpc3RfYWxnb3JpdGhtcyBtY3J5cHRfbGlzdF9tb2RlcyBtY3J5cHRfbW9kdWxlX2Nsb3NlIG1jcnlwdF9tb2R1bGVfZ2V0X2FsZ29fYmxvY2tfc2l6ZSBtY3J5cHRfbW9kdWxlX2dldF9hbGdvX2tleV9zaXplIG1jcnlwdF9tb2R1bGVfZ2V0X3N1cHBvcnRlZF9rZXlfc2l6ZXMgbWNyeXB0X21vZHVsZV9pc19ibG9ja19hbGdvcml0aG1fbW9kZSBtY3J5cHRfbW9kdWxlX2lzX2Jsb2NrX2FsZ29yaXRobSBtY3J5cHRfbW9kdWxlX2lzX2Jsb2NrX21vZGUgbWNyeXB0X21vZHVsZV9vcGVuIG1jcnlwdF9tb2R1bGVfc2VsZl90ZXN0IG1jcnlwdF9vZmIgbWRlY3J5cHRfZ2VuZXJpYyBtY3J5cHRfY2JjKQorICAgICAgICAgIGJbIk1DVkUiXSA9IFNldC5uZXcgJXcobV9jaGVja3N0YXR1cyBtX2NoZWNrc3RhdHVzIG1fY29tcGxldGVhdXRob3JpemF0aW9ucyBtX2Nvbm5lY3QgbV9jb25uZWN0aW9uZXJyb3IgbV9kZWxldGV0cmFucyBtX2Rlc3Ryb3ljb25uIG1fZGVzdHJveWVuZ2luZSBtX2dldGNlbGwgbV9nZXRjZWxsYnludW0gbV9nZXRjb21tYWRlbGltaXRlZCBtX2dldGhlYWRlciBtX2luaXRjb25uIG1faW5pdGVuZ2luZSBtX2lzY29tbWFkZWxpbWl0ZWQgbV9tYXhjb25udGltZW91dCBtX21vbml0b3IgbV9udW1jb2x1bW5zIG1fbnVtcm93cyBtX3BhcnNlY29tbWFkZWxpbWl0ZWQgbV9yZXNwb25zZWtleXMgbV9yZXNwb25zZXBhcmFtIG1fcmV0dXJuc3RhdHVzIG1fc2V0YmxvY2tpbmcgbV9zZXRkcm9wZmlsZSBtX3NldGlwIG1fc2V0c3NsX2NhZmlsZSBtX3NldHNzbF9maWxlcyBtX3NldHNzbCBtX3NldHRpbWVvdXQgbV9zc2xjZXJ0X2dlbl9oYXNoIG1fdHJhbnNhY3Rpb25zc2VudCBtX3RyYW5zaW5xdWV1ZSBtX3RyYW5za2V5dmFsIG1fdHJhbnNuZXcgbV90cmFuc3NlbmQgbV91d2FpdCBtX3ZhbGlkYXRlaWRlbnRpZmllciBtX3ZlcmlmeWNvbm5lY3Rpb24gbV92ZXJpZnlzc2xjZXJ0IG1fY2hlY2tzdGF0dXMpCisgICAgICAgICAgYlsiTWVtY2FjaGUiXSA9IFNldC5uZXcgJXcobWVtY2FjaGVfZGVidWcgbWVtY2FjaGVfZGVidWcgbWVtY2FjaGVfZGVidWcpCisgICAgICAgICAgYlsiTWhhc2giXSA9IFNldC5uZXcgJXcobWhhc2hfY291bnQgbWhhc2hfY291bnQgbWhhc2hfZ2V0X2Jsb2NrX3NpemUgbWhhc2hfZ2V0X2hhc2hfbmFtZSBtaGFzaF9rZXlnZW5fczJrIG1oYXNoIG1oYXNoX2NvdW50KQorICAgICAgICAgIGJbIk1pbmciXSA9IFNldC5uZXcgJXcobWluZ19rZXlwcmVzcyBtaW5nX2tleXByZXNzIG1pbmdfc2V0Y3ViaWN0aHJlc2hvbGQgbWluZ19zZXRzY2FsZSBtaW5nX3NldHN3ZmNvbXByZXNzaW9uIG1pbmdfdXNlY29uc3RhbnRzIG1pbmdfdXNlc3dmdmVyc2lvbiBtaW5nX2tleXByZXNzKQorICAgICAgICAgIGJbIk1pc2MuIl0gPSBTZXQubmV3ICV3KGNvbm5lY3Rpb25fYWJvcnRlZCBjb25uZWN0aW9uX2Fib3J0ZWQgY29ubmVjdGlvbl9zdGF0dXMgY29ubmVjdGlvbl90aW1lb3V0IGNvbnN0YW50IGRlZmluZSBkZWZpbmVkIGRpZSBldmFsIGV4aXQgZ2V0X2Jyb3dzZXIgX19oYWx0X2NvbXBpbGVyIGhpZ2hsaWdodF9maWxlIGhpZ2hsaWdodF9zdHJpbmcgaWdub3JlX3VzZXJfYWJvcnQgcGFjayBwaHBfY2hlY2tfc3ludGF4IHBocF9zdHJpcF93aGl0ZXNwYWNlIHNob3dfc291cmNlIHNsZWVwIHN5c19nZXRsb2FkYXZnIHRpbWVfbmFub3NsZWVwIHRpbWVfc2xlZXBfdW50aWwgdW5pcWlkIHVucGFjayB1c2xlZXAgY29ubmVjdGlvbl9hYm9ydGVkKQorICAgICAgICAgIGJbIm1ub0dvU2VhcmNoIl0gPSBTZXQubmV3ICV3KHVkbV9hZGRfc2VhcmNoX2xpbWl0IHVkbV9hZGRfc2VhcmNoX2xpbWl0IHVkbV9hbGxvY19hZ2VudF9hcnJheSB1ZG1fYWxsb2NfYWdlbnQgdWRtX2FwaV92ZXJzaW9uIHVkbV9jYXRfbGlzdCB1ZG1fY2F0X3BhdGggdWRtX2NoZWNrX2NoYXJzZXQgdWRtX2NoZWNrX3N0b3JlZCB1ZG1fY2xlYXJfc2VhcmNoX2xpbWl0cyB1ZG1fY2xvc2Vfc3RvcmVkIHVkbV9jcmMzMiB1ZG1fZXJybm8gdWRtX2Vycm9yIHVkbV9maW5kIHVkbV9mcmVlX2FnZW50IHVkbV9mcmVlX2lzcGVsbF9kYXRhIHVkbV9mcmVlX3JlcyB1ZG1fZ2V0X2RvY19jb3VudCB1ZG1fZ2V0X3Jlc19maWVsZCB1ZG1fZ2V0X3Jlc19wYXJhbSB1ZG1faGFzaDMyIHVkbV9sb2FkX2lzcGVsbF9kYXRhIHVkbV9vcGVuX3N0b3JlZCB1ZG1fc2V0X2FnZW50X3BhcmFtIHVkbV9hZGRfc2VhcmNoX2xpbWl0KQorICAgICAgICAgIGJbIk1vbmdvIl0gPSBTZXQubmV3ICV3KGJzb25fZGVjb2RlIGJzb25fZGVjb2RlIGJzb25fZW5jb2RlIGJzb25fZGVjb2RlKQorICAgICAgICAgIGJbIm1xc2VyaWVzIl0gPSBTZXQubmV3ICV3KG1xc2VyaWVzX2JhY2sgbXFzZXJpZXNfYmFjayBtcXNlcmllc19iZWdpbiBtcXNlcmllc19jbG9zZSBtcXNlcmllc19jbWl0IG1xc2VyaWVzX2Nvbm4gbXFzZXJpZXNfY29ubnggbXFzZXJpZXNfZGlzYyBtcXNlcmllc19nZXQgbXFzZXJpZXNfaW5xIG1xc2VyaWVzX29wZW4gbXFzZXJpZXNfcHV0MSBtcXNlcmllc19wdXQgbXFzZXJpZXNfc2V0IG1xc2VyaWVzX3N0cmVycm9yIG1xc2VyaWVzX2JhY2spCisgICAgICAgICAgYlsiTXNlc3Npb24iXSA9IFNldC5uZXcgJXcobXNlc3Npb25fY29ubmVjdCBtc2Vzc2lvbl9jb25uZWN0IG1zZXNzaW9uX2NvdW50IG1zZXNzaW9uX2NyZWF0ZSBtc2Vzc2lvbl9kZXN0cm95IG1zZXNzaW9uX2Rpc2Nvbm5lY3QgbXNlc3Npb25fZmluZCBtc2Vzc2lvbl9nZXRfYXJyYXkgbXNlc3Npb25fZ2V0X2RhdGEgbXNlc3Npb25fZ2V0IG1zZXNzaW9uX2luYyBtc2Vzc2lvbl9saXN0IG1zZXNzaW9uX2xpc3R2YXIgbXNlc3Npb25fbG9jayBtc2Vzc2lvbl9wbHVnaW4gbXNlc3Npb25fcmFuZHN0ciBtc2Vzc2lvbl9zZXRfYXJyYXkgbXNlc3Npb25fc2V0X2RhdGEgbXNlc3Npb25fc2V0IG1zZXNzaW9uX3RpbWVvdXQgbXNlc3Npb25fdW5pcSBtc2Vzc2lvbl91bmxvY2sgbXNlc3Npb25fY29ubmVjdCkKKyAgICAgICAgICBiWyJtU1FMIl0gPSBTZXQubmV3ICV3KG1zcWxfYWZmZWN0ZWRfcm93cyBtc3FsX2FmZmVjdGVkX3Jvd3MgbXNxbF9jbG9zZSBtc3FsX2Nvbm5lY3QgbXNxbF9jcmVhdGVfZGIgbXNxbF9jcmVhdGVkYiBtc3FsX2RhdGFfc2VlayBtc3FsX2RiX3F1ZXJ5IG1zcWxfZGJuYW1lIG1zcWxfZHJvcF9kYiBtc3FsX2Vycm9yIG1zcWxfZmV0Y2hfYXJyYXkgbXNxbF9mZXRjaF9maWVsZCBtc3FsX2ZldGNoX29iamVjdCBtc3FsX2ZldGNoX3JvdyBtc3FsX2ZpZWxkX2ZsYWdzIG1zcWxfZmllbGRfbGVuIG1zcWxfZmllbGRfbmFtZSBtc3FsX2ZpZWxkX3NlZWsgbXNxbF9maWVsZF90YWJsZSBtc3FsX2ZpZWxkX3R5cGUgbXNxbF9maWVsZGZsYWdzIG1zcWxfZmllbGRsZW4gbXNxbF9maWVsZG5hbWUgbXNxbF9maWVsZHRhYmxlIG1zcWxfZmllbGR0eXBlIG1zcWxfZnJlZV9yZXN1bHQgbXNxbF9saXN0X2RicyBtc3FsX2xpc3RfZmllbGRzIG1zcWxfbGlzdF90YWJsZXMgbXNxbF9udW1fZmllbGRzIG1zcWxfbnVtX3Jvd3MgbXNxbF9udW1maWVsZHMgbXNxbF9udW1yb3dzIG1zcWxfcGNvbm5lY3QgbXNxbF9xdWVyeSBtc3FsX3JlZ2Nhc2UgbXNxbF9yZXN1bHQgbXNxbF9zZWxlY3RfZGIgbXNxbF90YWJsZW5hbWUgbXNxbCBtc3FsX2FmZmVjdGVkX3Jvd3MpCisgICAgICAgICAgYlsiTXNzcWwiXSA9IFNldC5uZXcgJXcobXNzcWxfYmluZCBtc3NxbF9iaW5kIG1zc3FsX2Nsb3NlIG1zc3FsX2Nvbm5lY3QgbXNzcWxfZGF0YV9zZWVrIG1zc3FsX2V4ZWN1dGUgbXNzcWxfZmV0Y2hfYXJyYXkgbXNzcWxfZmV0Y2hfYXNzb2MgbXNzcWxfZmV0Y2hfYmF0Y2ggbXNzcWxfZmV0Y2hfZmllbGQgbXNzcWxfZmV0Y2hfb2JqZWN0IG1zc3FsX2ZldGNoX3JvdyBtc3NxbF9maWVsZF9sZW5ndGggbXNzcWxfZmllbGRfbmFtZSBtc3NxbF9maWVsZF9zZWVrIG1zc3FsX2ZpZWxkX3R5cGUgbXNzcWxfZnJlZV9yZXN1bHQgbXNzcWxfZnJlZV9zdGF0ZW1lbnQgbXNzcWxfZ2V0X2xhc3RfbWVzc2FnZSBtc3NxbF9ndWlkX3N0cmluZyBtc3NxbF9pbml0IG1zc3FsX21pbl9lcnJvcl9zZXZlcml0eSBtc3NxbF9taW5fbWVzc2FnZV9zZXZlcml0eSBtc3NxbF9uZXh0X3Jlc3VsdCBtc3NxbF9udW1fZmllbGRzIG1zc3FsX251bV9yb3dzIG1zc3FsX3Bjb25uZWN0IG1zc3FsX3F1ZXJ5IG1zc3FsX3Jlc3VsdCBtc3NxbF9yb3dzX2FmZmVjdGVkIG1zc3FsX3NlbGVjdF9kYiBtc3NxbF9iaW5kKQorICAgICAgICAgIGJbIk15U1FMIl0gPSBTZXQubmV3ICV3KG15c3FsX2FmZmVjdGVkX3Jvd3MgbXlzcWxfYWZmZWN0ZWRfcm93cyBteXNxbF9jbGllbnRfZW5jb2RpbmcgbXlzcWxfY2xvc2UgbXlzcWxfY29ubmVjdCBteXNxbF9jcmVhdGVfZGIgbXlzcWxfZGF0YV9zZWVrIG15c3FsX2RiX25hbWUgbXlzcWxfZGJfcXVlcnkgbXlzcWxfZHJvcF9kYiBteXNxbF9lcnJubyBteXNxbF9lcnJvciBteXNxbF9lc2NhcGVfc3RyaW5nIG15c3FsX2ZldGNoX2FycmF5IG15c3FsX2ZldGNoX2Fzc29jIG15c3FsX2ZldGNoX2ZpZWxkIG15c3FsX2ZldGNoX2xlbmd0aHMgbXlzcWxfZmV0Y2hfb2JqZWN0IG15c3FsX2ZldGNoX3JvdyBteXNxbF9maWVsZF9mbGFncyBteXNxbF9maWVsZF9sZW4gbXlzcWxfZmllbGRfbmFtZSBteXNxbF9maWVsZF9zZWVrIG15c3FsX2ZpZWxkX3RhYmxlIG15c3FsX2ZpZWxkX3R5cGUgbXlzcWxfZnJlZV9yZXN1bHQgbXlzcWxfZ2V0X2NsaWVudF9pbmZvIG15c3FsX2dldF9ob3N0X2luZm8gbXlzcWxfZ2V0X3Byb3RvX2luZm8gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvIG15c3FsX2luZm8gbXlzcWxfaW5zZXJ0X2lkIG15c3FsX2xpc3RfZGJzIG15c3FsX2xpc3RfZmllbGRzIG15c3FsX2xpc3RfcHJvY2Vzc2VzIG15c3FsX2xpc3RfdGFibGVzIG15c3FsX251bV9maWVsZHMgbXlzcWxfbnVtX3Jvd3MgbXlzcWxfcGNvbm5lY3QgbXlzcWxfcGluZyBteXNxbF9xdWVyeSBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcgbXlzcWxfcmVzdWx0IG15c3FsX3NlbGVjdF9kYiBteXNxbF9zZXRfY2hhcnNldCBteXNxbF9zdGF0IG15c3FsX3RhYmxlbmFtZSBteXNxbF90aHJlYWRfaWQgbXlzcWxfdW5idWZmZXJlZF9xdWVyeSBteXNxbF9hZmZlY3RlZF9yb3dzKQorICAgICAgICAgIGJbIkFsaWFzZXMgYW5kIGRlcHJlY2F0ZWQgTXlzcWxpIl0gPSBTZXQubmV3ICV3KG15c3FsaV9iaW5kX3BhcmFtIG15c3FsaV9iaW5kX3BhcmFtIG15c3FsaV9iaW5kX3Jlc3VsdCBteXNxbGlfY2xpZW50X2VuY29kaW5nIG15c3FsaV9jb25uZWN0IG15c3FsaTo6ZGlzYWJsZV9yZWFkc19mcm9tX21hc3RlciBteXNxbGlfZGlzYWJsZV9ycGxfcGFyc2UgbXlzcWxpX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlciBteXNxbGlfZW5hYmxlX3JwbF9wYXJzZSBteXNxbGlfZXNjYXBlX3N0cmluZyBteXNxbGlfZXhlY3V0ZSBteXNxbGlfZmV0Y2ggbXlzcWxpX2dldF9jYWNoZV9zdGF0cyBteXNxbGlfZ2V0X21ldGFkYXRhIG15c3FsaV9tYXN0ZXJfcXVlcnkgbXlzcWxpX3BhcmFtX2NvdW50IG15c3FsaV9yZXBvcnQgbXlzcWxpX3JwbF9wYXJzZV9lbmFibGVkIG15c3FsaV9ycGxfcHJvYmUgbXlzcWxpX3NlbmRfbG9uZ19kYXRhIG15c3FsaTo6c2V0X29wdCBteXNxbGlfc2xhdmVfcXVlcnkgbXlzcWxpX2JpbmRfcGFyYW0pCisgICAgICAgICAgYlsiTXlzcWxuZF9tZW1jYWNoZSJdID0gU2V0Lm5ldyAldyhteXNxbG5kX21lbWNhY2hlX2dldF9jb25maWcgbXlzcWxuZF9tZW1jYWNoZV9nZXRfY29uZmlnIG15c3FsbmRfbWVtY2FjaGVfc2V0IG15c3FsbmRfbWVtY2FjaGVfZ2V0X2NvbmZpZykKKyAgICAgICAgICBiWyJNeXNxbG5kX21zIl0gPSBTZXQubmV3ICV3KG15c3FsbmRfbXNfZHVtcF9zZXJ2ZXJzIG15c3FsbmRfbXNfZHVtcF9zZXJ2ZXJzIG15c3FsbmRfbXNfZmFicmljX3NlbGVjdF9nbG9iYWwgbXlzcWxuZF9tc19mYWJyaWNfc2VsZWN0X3NoYXJkIG15c3FsbmRfbXNfZ2V0X2xhc3RfZ3RpZCBteXNxbG5kX21zX2dldF9sYXN0X3VzZWRfY29ubmVjdGlvbiBteXNxbG5kX21zX2dldF9zdGF0cyBteXNxbG5kX21zX21hdGNoX3dpbGQgbXlzcWxuZF9tc19xdWVyeV9pc19zZWxlY3QgbXlzcWxuZF9tc19zZXRfcW9zIG15c3FsbmRfbXNfc2V0X3VzZXJfcGlja19zZXJ2ZXIgbXlzcWxuZF9tc194YV9iZWdpbiBteXNxbG5kX21zX3hhX2NvbW1pdCBteXNxbG5kX21zX3hhX2djIG15c3FsbmRfbXNfeGFfcm9sbGJhY2sgbXlzcWxuZF9tc19kdW1wX3NlcnZlcnMpCisgICAgICAgICAgYlsibXlzcWxuZF9xYyJdID0gU2V0Lm5ldyAldyhteXNxbG5kX3FjX2NsZWFyX2NhY2hlIG15c3FsbmRfcWNfY2xlYXJfY2FjaGUgbXlzcWxuZF9xY19nZXRfYXZhaWxhYmxlX2hhbmRsZXJzIG15c3FsbmRfcWNfZ2V0X2NhY2hlX2luZm8gbXlzcWxuZF9xY19nZXRfY29yZV9zdGF0cyBteXNxbG5kX3FjX2dldF9ub3JtYWxpemVkX3F1ZXJ5X3RyYWNlX2xvZyBteXNxbG5kX3FjX2dldF9xdWVyeV90cmFjZV9sb2cgbXlzcWxuZF9xY19zZXRfY2FjaGVfY29uZGl0aW9uIG15c3FsbmRfcWNfc2V0X2lzX3NlbGVjdCBteXNxbG5kX3FjX3NldF9zdG9yYWdlX2hhbmRsZXIgbXlzcWxuZF9xY19zZXRfdXNlcl9oYW5kbGVycyBteXNxbG5kX3FjX2NsZWFyX2NhY2hlKQorICAgICAgICAgIGJbIk15c3FsbmRfdWgiXSA9IFNldC5uZXcgJXcobXlzcWxuZF91aF9jb252ZXJ0X3RvX215c3FsbmQgbXlzcWxuZF91aF9jb252ZXJ0X3RvX215c3FsbmQgbXlzcWxuZF91aF9zZXRfY29ubmVjdGlvbl9wcm94eSBteXNxbG5kX3VoX3NldF9zdGF0ZW1lbnRfcHJveHkgbXlzcWxuZF91aF9jb252ZXJ0X3RvX215c3FsbmQpCisgICAgICAgICAgYlsiTmN1cnNlcyJdID0gU2V0Lm5ldyAldyhuY3Vyc2VzX2FkZGNoIG5jdXJzZXNfYWRkY2ggbmN1cnNlc19hZGRjaG5zdHIgbmN1cnNlc19hZGRjaHN0ciBuY3Vyc2VzX2FkZG5zdHIgbmN1cnNlc19hZGRzdHIgbmN1cnNlc19hc3N1bWVfZGVmYXVsdF9jb2xvcnMgbmN1cnNlc19hdHRyb2ZmIG5jdXJzZXNfYXR0cm9uIG5jdXJzZXNfYXR0cnNldCBuY3Vyc2VzX2JhdWRyYXRlIG5jdXJzZXNfYmVlcCBuY3Vyc2VzX2JrZ2QgbmN1cnNlc19ia2dkc2V0IG5jdXJzZXNfYm9yZGVyIG5jdXJzZXNfYm90dG9tX3BhbmVsIG5jdXJzZXNfY2FuX2NoYW5nZV9jb2xvciBuY3Vyc2VzX2NicmVhayBuY3Vyc2VzX2NsZWFyIG5jdXJzZXNfY2xydG9ib3QgbmN1cnNlc19jbHJ0b2VvbCBuY3Vyc2VzX2NvbG9yX2NvbnRlbnQgbmN1cnNlc19jb2xvcl9zZXQgbmN1cnNlc19jdXJzX3NldCBuY3Vyc2VzX2RlZl9wcm9nX21vZGUgbmN1cnNlc19kZWZfc2hlbGxfbW9kZSBuY3Vyc2VzX2RlZmluZV9rZXkgbmN1cnNlc19kZWxfcGFuZWwgbmN1cnNlc19kZWxheV9vdXRwdXQgbmN1cnNlc19kZWxjaCBuY3Vyc2VzX2RlbGV0ZWxuIG5jdXJzZXNfZGVsd2luIG5jdXJzZXNfZG91cGRhdGUgbmN1cnNlc19lY2hvIG5jdXJzZXNfZWNob2NoYXIgbmN1cnNlc19lbmQgbmN1cnNlc19lcmFzZSBuY3Vyc2VzX2VyYXNlY2hhciBuY3Vyc2VzX2ZpbHRlciBuY3Vyc2VzX2ZsYXNoIG5jdXJzZXNfZmx1c2hpbnAgbmN1cnNlc19nZXRjaCBuY3Vyc2VzX2dldG1heHl4IG5jdXJzZXNfZ2V0bW91c2UgbmN1cnNlc19nZXR5eCBuY3Vyc2VzX2hhbGZkZWxheSBuY3Vyc2VzX2hhc19jb2xvcnMgbmN1cnNlc19oYXNfaWMgbmN1cnNlc19oYXNfaWwgbmN1cnNlc19oYXNfa2V5IG5jdXJzZXNfaGlkZV9wYW5lbCBuY3Vyc2VzX2hsaW5lIG5jdXJzZXNfaW5jaCBuY3Vyc2VzX2luaXRfY29sb3IgbmN1cnNlc19pbml0X3BhaXIgbmN1cnNlc19pbml0IG5jdXJzZXNfaW5zY2ggbmN1cnNlc19pbnNkZWxsbiBuY3Vyc2VzX2luc2VydGxuIG5jdXJzZXNfaW5zc3RyIG5jdXJzZXNfaW5zdHIgbmN1cnNlc19pc2VuZHdpbiBuY3Vyc2VzX2tleW9rIG5jdXJzZXNfa2V5cGFkIG5jdXJzZXNfa2lsbGNoYXIgbmN1cnNlc19sb25nbmFtZSBuY3Vyc2VzX21ldGEgbmN1cnNlc19tb3VzZV90cmFmbyBuY3Vyc2VzX21vdXNlaW50ZXJ2YWwgbmN1cnNlc19tb3VzZW1hc2sgbmN1cnNlc19tb3ZlX3BhbmVsIG5jdXJzZXNfbW92ZSBuY3Vyc2VzX212YWRkY2ggbmN1cnNlc19tdmFkZGNobnN0ciBuY3Vyc2VzX212YWRkY2hzdHIgbmN1cnNlc19tdmFkZG5zdHIgbmN1cnNlc19tdmFkZHN0ciBuY3Vyc2VzX212Y3VyIG5jdXJzZXNfbXZkZWxjaCBuY3Vyc2VzX212Z2V0Y2ggbmN1cnNlc19tdmhsaW5lIG5jdXJzZXNfbXZpbmNoIG5jdXJzZXNfbXZ2bGluZSBuY3Vyc2VzX212d2FkZHN0ciBuY3Vyc2VzX25hcG1zIG5jdXJzZXNfbmV3X3BhbmVsIG5jdXJzZXNfbmV3cGFkIG5jdXJzZXNfbmV3d2luIG5jdXJzZXNfbmwgbmN1cnNlc19ub2NicmVhayBuY3Vyc2VzX25vZWNobyBuY3Vyc2VzX25vbmwgbmN1cnNlc19ub3FpZmx1c2ggbmN1cnNlc19ub3JhdyBuY3Vyc2VzX3BhaXJfY29udGVudCBuY3Vyc2VzX3BhbmVsX2Fib3ZlIG5jdXJzZXNfcGFuZWxfYmVsb3cgbmN1cnNlc19wYW5lbF93aW5kb3cgbmN1cnNlc19wbm91dHJlZnJlc2ggbmN1cnNlc19wcmVmcmVzaCBuY3Vyc2VzX3B1dHAgbmN1cnNlc19xaWZsdXNoIG5jdXJzZXNfcmF3IG5jdXJzZXNfcmVmcmVzaCBuY3Vyc2VzX3JlcGxhY2VfcGFuZWwgbmN1cnNlc19yZXNldF9wcm9nX21vZGUgbmN1cnNlc19yZXNldF9zaGVsbF9tb2RlIG5jdXJzZXNfcmVzZXR0eSBuY3Vyc2VzX3NhdmV0dHkgbmN1cnNlc19zY3JfZHVtcCBuY3Vyc2VzX3Njcl9pbml0IG5jdXJzZXNfc2NyX3Jlc3RvcmUgbmN1cnNlc19zY3Jfc2V0IG5jdXJzZXNfc2NybCBuY3Vyc2VzX3Nob3dfcGFuZWwgbmN1cnNlc19zbGtfYXR0ciBuY3Vyc2VzX3Nsa19hdHRyb2ZmIG5jdXJzZXNfc2xrX2F0dHJvbiBuY3Vyc2VzX3Nsa19hdHRyc2V0IG5jdXJzZXNfc2xrX2NsZWFyIG5jdXJzZXNfc2xrX2NvbG9yIG5jdXJzZXNfc2xrX2luaXQgbmN1cnNlc19zbGtfbm91dHJlZnJlc2ggbmN1cnNlc19zbGtfcmVmcmVzaCBuY3Vyc2VzX3Nsa19yZXN0b3JlIG5jdXJzZXNfc2xrX3NldCBuY3Vyc2VzX3Nsa190b3VjaCBuY3Vyc2VzX3N0YW5kZW5kIG5jdXJzZXNfc3RhbmRvdXQgbmN1cnNlc19zdGFydF9jb2xvciBuY3Vyc2VzX3Rlcm1hdHRycyBuY3Vyc2VzX3Rlcm1uYW1lIG5jdXJzZXNfdGltZW91dCBuY3Vyc2VzX3RvcF9wYW5lbCBuY3Vyc2VzX3R5cGVhaGVhZCBuY3Vyc2VzX3VuZ2V0Y2ggbmN1cnNlc191bmdldG1vdXNlIG5jdXJzZXNfdXBkYXRlX3BhbmVscyBuY3Vyc2VzX3VzZV9kZWZhdWx0X2NvbG9ycyBuY3Vyc2VzX3VzZV9lbnYgbmN1cnNlc191c2VfZXh0ZW5kZWRfbmFtZXMgbmN1cnNlc192aWRhdHRyIG5jdXJzZXNfdmxpbmUgbmN1cnNlc193YWRkY2ggbmN1cnNlc193YWRkc3RyIG5jdXJzZXNfd2F0dHJvZmYgbmN1cnNlc193YXR0cm9uIG5jdXJzZXNfd2F0dHJzZXQgbmN1cnNlc193Ym9yZGVyIG5jdXJzZXNfd2NsZWFyIG5jdXJzZXNfd2NvbG9yX3NldCBuY3Vyc2VzX3dlcmFzZSBuY3Vyc2VzX3dnZXRjaCBuY3Vyc2VzX3dobGluZSBuY3Vyc2VzX3dtb3VzZV90cmFmbyBuY3Vyc2VzX3dtb3ZlIG5jdXJzZXNfd25vdXRyZWZyZXNoIG5jdXJzZXNfd3JlZnJlc2ggbmN1cnNlc193c3RhbmRlbmQgbmN1cnNlc193c3RhbmRvdXQgbmN1cnNlc193dmxpbmUgbmN1cnNlc19hZGRjaCkKKyAgICAgICAgICBiWyJHb3BoZXIiXSA9IFNldC5uZXcgJXcoZ29waGVyX3BhcnNlZGlyIGdvcGhlcl9wYXJzZWRpciBnb3BoZXJfcGFyc2VkaXIpCisgICAgICAgICAgYlsiTmV0d29yayJdID0gU2V0Lm5ldyAldyhjaGVja2Ruc3JyIGNoZWNrZG5zcnIgY2xvc2Vsb2cgZGVmaW5lX3N5c2xvZ192YXJpYWJsZXMgZG5zX2NoZWNrX3JlY29yZCBkbnNfZ2V0X214IGRuc19nZXRfcmVjb3JkIGZzb2Nrb3BlbiBnZXRob3N0YnlhZGRyIGdldGhvc3RieW5hbWUgZ2V0aG9zdGJ5bmFtZWwgZ2V0aG9zdG5hbWUgZ2V0bXhyciBnZXRwcm90b2J5bmFtZSBnZXRwcm90b2J5bnVtYmVyIGdldHNlcnZieW5hbWUgZ2V0c2VydmJ5cG9ydCBoZWFkZXJfcmVnaXN0ZXJfY2FsbGJhY2sgaGVhZGVyX3JlbW92ZSBoZWFkZXIgaGVhZGVyc19saXN0IGhlYWRlcnNfc2VudCBodHRwX3Jlc3BvbnNlX2NvZGUgaW5ldF9udG9wIGluZXRfcHRvbiBpcDJsb25nIGxvbmcyaXAgb3BlbmxvZyBwZnNvY2tvcGVuIHNldGNvb2tpZSBzZXRyYXdjb29raWUgc29ja2V0X2dldF9zdGF0dXMgc29ja2V0X3NldF9ibG9ja2luZyBzb2NrZXRfc2V0X3RpbWVvdXQgc3lzbG9nIGNoZWNrZG5zcnIpCisgICAgICAgICAgYlsiTmV3dCJdID0gU2V0Lm5ldyAldyhuZXd0X2JlbGwgbmV3dF9iZWxsIG5ld3RfYnV0dG9uX2JhciBuZXd0X2J1dHRvbiBuZXd0X2NlbnRlcmVkX3dpbmRvdyBuZXd0X2NoZWNrYm94X2dldF92YWx1ZSBuZXd0X2NoZWNrYm94X3NldF9mbGFncyBuZXd0X2NoZWNrYm94X3NldF92YWx1ZSBuZXd0X2NoZWNrYm94X3RyZWVfYWRkX2l0ZW0gbmV3dF9jaGVja2JveF90cmVlX2ZpbmRfaXRlbSBuZXd0X2NoZWNrYm94X3RyZWVfZ2V0X2N1cnJlbnQgbmV3dF9jaGVja2JveF90cmVlX2dldF9lbnRyeV92YWx1ZSBuZXd0X2NoZWNrYm94X3RyZWVfZ2V0X211bHRpX3NlbGVjdGlvbiBuZXd0X2NoZWNrYm94X3RyZWVfZ2V0X3NlbGVjdGlvbiBuZXd0X2NoZWNrYm94X3RyZWVfbXVsdGkgbmV3dF9jaGVja2JveF90cmVlX3NldF9jdXJyZW50IG5ld3RfY2hlY2tib3hfdHJlZV9zZXRfZW50cnlfdmFsdWUgbmV3dF9jaGVja2JveF90cmVlX3NldF9lbnRyeSBuZXd0X2NoZWNrYm94X3RyZWVfc2V0X3dpZHRoIG5ld3RfY2hlY2tib3hfdHJlZSBuZXd0X2NoZWNrYm94IG5ld3RfY2xlYXJfa2V5X2J1ZmZlciBuZXd0X2NscyBuZXd0X2NvbXBhY3RfYnV0dG9uIG5ld3RfY29tcG9uZW50X2FkZF9jYWxsYmFjayBuZXd0X2NvbXBvbmVudF90YWtlc19mb2N1cyBuZXd0X2NyZWF0ZV9ncmlkIG5ld3RfY3Vyc29yX29mZiBuZXd0X2N1cnNvcl9vbiBuZXd0X2RlbGF5IG5ld3RfZHJhd19mb3JtIG5ld3RfZHJhd19yb290X3RleHQgbmV3dF9lbnRyeV9nZXRfdmFsdWUgbmV3dF9lbnRyeV9zZXRfZmlsdGVyIG5ld3RfZW50cnlfc2V0X2ZsYWdzIG5ld3RfZW50cnlfc2V0IG5ld3RfZW50cnkgbmV3dF9maW5pc2hlZCBuZXd0X2Zvcm1fYWRkX2NvbXBvbmVudCBuZXd0X2Zvcm1fYWRkX2NvbXBvbmVudHMgbmV3dF9mb3JtX2FkZF9ob3Rfa2V5IG5ld3RfZm9ybV9kZXN0cm95IG5ld3RfZm9ybV9nZXRfY3VycmVudCBuZXd0X2Zvcm1fcnVuIG5ld3RfZm9ybV9zZXRfYmFja2dyb3VuZCBuZXd0X2Zvcm1fc2V0X2hlaWdodCBuZXd0X2Zvcm1fc2V0X3NpemUgbmV3dF9mb3JtX3NldF90aW1lciBuZXd0X2Zvcm1fc2V0X3dpZHRoIG5ld3RfZm9ybV93YXRjaF9mZCBuZXd0X2Zvcm0gbmV3dF9nZXRfc2NyZWVuX3NpemUgbmV3dF9ncmlkX2FkZF9jb21wb25lbnRzX3RvX2Zvcm0gbmV3dF9ncmlkX2Jhc2ljX3dpbmRvdyBuZXd0X2dyaWRfZnJlZSBuZXd0X2dyaWRfZ2V0X3NpemUgbmV3dF9ncmlkX2hfY2xvc2Vfc3RhY2tlZCBuZXd0X2dyaWRfaF9zdGFja2VkIG5ld3RfZ3JpZF9wbGFjZSBuZXd0X2dyaWRfc2V0X2ZpZWxkIG5ld3RfZ3JpZF9zaW1wbGVfd2luZG93IG5ld3RfZ3JpZF92X2Nsb3NlX3N0YWNrZWQgbmV3dF9ncmlkX3Zfc3RhY2tlZCBuZXd0X2dyaWRfd3JhcHBlZF93aW5kb3dfYXQgbmV3dF9ncmlkX3dyYXBwZWRfd2luZG93IG5ld3RfaW5pdCBuZXd0X2xhYmVsX3NldF90ZXh0IG5ld3RfbGFiZWwgbmV3dF9saXN0Ym94X2FwcGVuZF9lbnRyeSBuZXd0X2xpc3Rib3hfY2xlYXJfc2VsZWN0aW9uIG5ld3RfbGlzdGJveF9jbGVhciBuZXd0X2xpc3Rib3hfZGVsZXRlX2VudHJ5IG5ld3RfbGlzdGJveF9nZXRfY3VycmVudCBuZXd0X2xpc3Rib3hfZ2V0X3NlbGVjdGlvbiBuZXd0X2xpc3Rib3hfaW5zZXJ0X2VudHJ5IG5ld3RfbGlzdGJveF9pdGVtX2NvdW50IG5ld3RfbGlzdGJveF9zZWxlY3RfaXRlbSBuZXd0X2xpc3Rib3hfc2V0X2N1cnJlbnRfYnlfa2V5IG5ld3RfbGlzdGJveF9zZXRfY3VycmVudCBuZXd0X2xpc3Rib3hfc2V0X2RhdGEgbmV3dF9saXN0Ym94X3NldF9lbnRyeSBuZXd0X2xpc3Rib3hfc2V0X3dpZHRoIG5ld3RfbGlzdGJveCBuZXd0X2xpc3RpdGVtX2dldF9kYXRhIG5ld3RfbGlzdGl0ZW1fc2V0IG5ld3RfbGlzdGl0ZW0gbmV3dF9vcGVuX3dpbmRvdyBuZXd0X3BvcF9oZWxwX2xpbmUgbmV3dF9wb3Bfd2luZG93IG5ld3RfcHVzaF9oZWxwX2xpbmUgbmV3dF9yYWRpb19nZXRfY3VycmVudCBuZXd0X3JhZGlvYnV0dG9uIG5ld3RfcmVkcmF3X2hlbHBfbGluZSBuZXd0X3JlZmxvd190ZXh0IG5ld3RfcmVmcmVzaCBuZXd0X3Jlc2l6ZV9zY3JlZW4gbmV3dF9yZXN1bWUgbmV3dF9ydW5fZm9ybSBuZXd0X3NjYWxlX3NldCBuZXd0X3NjYWxlIG5ld3Rfc2Nyb2xsYmFyX3NldCBuZXd0X3NldF9oZWxwX2NhbGxiYWNrIG5ld3Rfc2V0X3N1c3BlbmRfY2FsbGJhY2sgbmV3dF9zdXNwZW5kIG5ld3RfdGV4dGJveF9nZXRfbnVtX2xpbmVzIG5ld3RfdGV4dGJveF9yZWZsb3dlZCBuZXd0X3RleHRib3hfc2V0X2hlaWdodCBuZXd0X3RleHRib3hfc2V0X3RleHQgbmV3dF90ZXh0Ym94IG5ld3RfdmVydGljYWxfc2Nyb2xsYmFyIG5ld3Rfd2FpdF9mb3Jfa2V5IG5ld3Rfd2luX2Nob2ljZSBuZXd0X3dpbl9lbnRyaWVzIG5ld3Rfd2luX21lbnUgbmV3dF93aW5fbWVzc2FnZSBuZXd0X3dpbl9tZXNzYWdldiBuZXd0X3dpbl90ZXJuYXJ5IG5ld3RfYmVsbCkKKyAgICAgICAgICBiWyJZUC9OSVMiXSA9IFNldC5uZXcgJXcoeXBfYWxsIHlwX2FsbCB5cF9jYXQgeXBfZXJyX3N0cmluZyB5cF9lcnJubyB5cF9maXJzdCB5cF9nZXRfZGVmYXVsdF9kb21haW4geXBfbWFzdGVyIHlwX21hdGNoIHlwX25leHQgeXBfb3JkZXIgeXBfYWxsKQorICAgICAgICAgIGJbIkxvdHVzIE5vdGVzIl0gPSBTZXQubmV3ICV3KG5vdGVzX2JvZHkgbm90ZXNfYm9keSBub3Rlc19jb3B5X2RiIG5vdGVzX2NyZWF0ZV9kYiBub3Rlc19jcmVhdGVfbm90ZSBub3Rlc19kcm9wX2RiIG5vdGVzX2ZpbmRfbm90ZSBub3Rlc19oZWFkZXJfaW5mbyBub3Rlc19saXN0X21zZ3Mgbm90ZXNfbWFya19yZWFkIG5vdGVzX21hcmtfdW5yZWFkIG5vdGVzX25hdl9jcmVhdGUgbm90ZXNfc2VhcmNoIG5vdGVzX3VucmVhZCBub3Rlc192ZXJzaW9uIG5vdGVzX2JvZHkpCisgICAgICAgICAgYlsiTlNBUEkiXSA9IFNldC5uZXcgJXcobnNhcGlfcmVxdWVzdF9oZWFkZXJzIG5zYXBpX3JlcXVlc3RfaGVhZGVycyBuc2FwaV9yZXNwb25zZV9oZWFkZXJzIG5zYXBpX3ZpcnR1YWwgbnNhcGlfcmVxdWVzdF9oZWFkZXJzKQorICAgICAgICAgIGJbIk9BdXRoIl0gPSBTZXQubmV3ICV3KG9hdXRoX2dldF9zYnMgb2F1dGhfZ2V0X3NicyBvYXV0aF91cmxlbmNvZGUgb2F1dGhfZ2V0X3NicykKKyAgICAgICAgICBiWyJPYmplY3QgQWdncmVnYXRpb24iXSA9IFNldC5uZXcgJXcoYWdncmVnYXRlX2luZm8gYWdncmVnYXRlX2luZm8gYWdncmVnYXRlX21ldGhvZHNfYnlfbGlzdCBhZ2dyZWdhdGVfbWV0aG9kc19ieV9yZWdleHAgYWdncmVnYXRlX21ldGhvZHMgYWdncmVnYXRlX3Byb3BlcnRpZXNfYnlfbGlzdCBhZ2dyZWdhdGVfcHJvcGVydGllc19ieV9yZWdleHAgYWdncmVnYXRlX3Byb3BlcnRpZXMgYWdncmVnYXRlIGFnZ3JlZ2F0aW9uX2luZm8gZGVhZ2dyZWdhdGUgYWdncmVnYXRlX2luZm8pCisgICAgICAgICAgYlsiT0NJOCJdID0gU2V0Lm5ldyAldyhvY2lfYmluZF9hcnJheV9ieV9uYW1lIG9jaV9iaW5kX2FycmF5X2J5X25hbWUgb2NpX2JpbmRfYnlfbmFtZSBvY2lfY2FuY2VsIG9jaV9jbGllbnRfdmVyc2lvbiBvY2lfY2xvc2Ugb2NpX2NvbW1pdCBvY2lfY29ubmVjdCBvY2lfZGVmaW5lX2J5X25hbWUgb2NpX2Vycm9yIG9jaV9leGVjdXRlIG9jaV9mZXRjaF9hbGwgb2NpX2ZldGNoX2FycmF5IG9jaV9mZXRjaF9hc3NvYyBvY2lfZmV0Y2hfb2JqZWN0IG9jaV9mZXRjaF9yb3cgb2NpX2ZldGNoIG9jaV9maWVsZF9pc19udWxsIG9jaV9maWVsZF9uYW1lIG9jaV9maWVsZF9wcmVjaXNpb24gb2NpX2ZpZWxkX3NjYWxlIG9jaV9maWVsZF9zaXplIG9jaV9maWVsZF90eXBlX3JhdyBvY2lfZmllbGRfdHlwZSBvY2lfZnJlZV9kZXNjcmlwdG9yIG9jaV9mcmVlX3N0YXRlbWVudCBvY2lfZ2V0X2ltcGxpY2l0X3Jlc3VsdHNldCBvY2lfaW50ZXJuYWxfZGVidWcgb2NpX2xvYl9jb3B5IG9jaV9sb2JfaXNfZXF1YWwgb2NpX25ld19jb2xsZWN0aW9uIG9jaV9uZXdfY29ubmVjdCBvY2lfbmV3X2N1cnNvciBvY2lfbmV3X2Rlc2NyaXB0b3Igb2NpX251bV9maWVsZHMgb2NpX251bV9yb3dzIG9jaV9wYXJzZSBvY2lfcGFzc3dvcmRfY2hhbmdlIG9jaV9wY29ubmVjdCBvY2lfcmVzdWx0IG9jaV9yb2xsYmFjayBvY2lfc2VydmVyX3ZlcnNpb24gb2NpX3NldF9hY3Rpb24gb2NpX3NldF9jbGllbnRfaWRlbnRpZmllciBvY2lfc2V0X2NsaWVudF9pbmZvIG9jaV9zZXRfZWRpdGlvbiBvY2lfc2V0X21vZHVsZV9uYW1lIG9jaV9zZXRfcHJlZmV0Y2ggb2NpX3N0YXRlbWVudF90eXBlIG9jaV9iaW5kX2FycmF5X2J5X25hbWUpCisgICAgICAgICAgYlsiT1BjYWNoZSJdID0gU2V0Lm5ldyAldyhvcGNhY2hlX2NvbXBpbGVfZmlsZSBvcGNhY2hlX2NvbXBpbGVfZmlsZSBvcGNhY2hlX2dldF9jb25maWd1cmF0aW9uIG9wY2FjaGVfZ2V0X3N0YXR1cyBvcGNhY2hlX2ludmFsaWRhdGUgb3BjYWNoZV9yZXNldCBvcGNhY2hlX2NvbXBpbGVfZmlsZSkKKyAgICAgICAgICBiWyJPcGVuQUwiXSA9IFNldC5uZXcgJXcob3BlbmFsX2J1ZmZlcl9jcmVhdGUgb3BlbmFsX2J1ZmZlcl9jcmVhdGUgb3BlbmFsX2J1ZmZlcl9kYXRhIG9wZW5hbF9idWZmZXJfZGVzdHJveSBvcGVuYWxfYnVmZmVyX2dldCBvcGVuYWxfYnVmZmVyX2xvYWR3YXYgb3BlbmFsX2NvbnRleHRfY3JlYXRlIG9wZW5hbF9jb250ZXh0X2N1cnJlbnQgb3BlbmFsX2NvbnRleHRfZGVzdHJveSBvcGVuYWxfY29udGV4dF9wcm9jZXNzIG9wZW5hbF9jb250ZXh0X3N1c3BlbmQgb3BlbmFsX2RldmljZV9jbG9zZSBvcGVuYWxfZGV2aWNlX29wZW4gb3BlbmFsX2xpc3RlbmVyX2dldCBvcGVuYWxfbGlzdGVuZXJfc2V0IG9wZW5hbF9zb3VyY2VfY3JlYXRlIG9wZW5hbF9zb3VyY2VfZGVzdHJveSBvcGVuYWxfc291cmNlX2dldCBvcGVuYWxfc291cmNlX3BhdXNlIG9wZW5hbF9zb3VyY2VfcGxheSBvcGVuYWxfc291cmNlX3Jld2luZCBvcGVuYWxfc291cmNlX3NldCBvcGVuYWxfc291cmNlX3N0b3Agb3BlbmFsX3N0cmVhbSBvcGVuYWxfYnVmZmVyX2NyZWF0ZSkKKyAgICAgICAgICBiWyJPcGVuU1NMIl0gPSBTZXQubmV3ICV3KG9wZW5zc2xfY2lwaGVyX2l2X2xlbmd0aCBvcGVuc3NsX2NpcGhlcl9pdl9sZW5ndGggb3BlbnNzbF9jc3JfZXhwb3J0X3RvX2ZpbGUgb3BlbnNzbF9jc3JfZXhwb3J0IG9wZW5zc2xfY3NyX2dldF9wdWJsaWNfa2V5IG9wZW5zc2xfY3NyX2dldF9zdWJqZWN0IG9wZW5zc2xfY3NyX25ldyBvcGVuc3NsX2Nzcl9zaWduIG9wZW5zc2xfZGVjcnlwdCBvcGVuc3NsX2RoX2NvbXB1dGVfa2V5IG9wZW5zc2xfZGlnZXN0IG9wZW5zc2xfZW5jcnlwdCBvcGVuc3NsX2Vycm9yX3N0cmluZyBvcGVuc3NsX2ZyZWVfa2V5IG9wZW5zc2xfZ2V0X2NpcGhlcl9tZXRob2RzIG9wZW5zc2xfZ2V0X21kX21ldGhvZHMgb3BlbnNzbF9nZXRfcHJpdmF0ZWtleSBvcGVuc3NsX2dldF9wdWJsaWNrZXkgb3BlbnNzbF9vcGVuIG9wZW5zc2xfcGJrZGYyIG9wZW5zc2xfcGtjczEyX2V4cG9ydF90b19maWxlIG9wZW5zc2xfcGtjczEyX2V4cG9ydCBvcGVuc3NsX3BrY3MxMl9yZWFkIG9wZW5zc2xfcGtjczdfZGVjcnlwdCBvcGVuc3NsX3BrY3M3X2VuY3J5cHQgb3BlbnNzbF9wa2NzN19zaWduIG9wZW5zc2xfcGtjczdfdmVyaWZ5IG9wZW5zc2xfcGtleV9leHBvcnRfdG9fZmlsZSBvcGVuc3NsX3BrZXlfZXhwb3J0IG9wZW5zc2xfcGtleV9mcmVlIG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscyBvcGVuc3NsX3BrZXlfZ2V0X3ByaXZhdGUgb3BlbnNzbF9wa2V5X2dldF9wdWJsaWMgb3BlbnNzbF9wa2V5X25ldyBvcGVuc3NsX3ByaXZhdGVfZGVjcnlwdCBvcGVuc3NsX3ByaXZhdGVfZW5jcnlwdCBvcGVuc3NsX3B1YmxpY19kZWNyeXB0IG9wZW5zc2xfcHVibGljX2VuY3J5cHQgb3BlbnNzbF9yYW5kb21fcHNldWRvX2J5dGVzIG9wZW5zc2xfc2VhbCBvcGVuc3NsX3NpZ24gb3BlbnNzbF9zcGtpX2V4cG9ydF9jaGFsbGVuZ2Ugb3BlbnNzbF9zcGtpX2V4cG9ydCBvcGVuc3NsX3Nwa2lfbmV3IG9wZW5zc2xfc3BraV92ZXJpZnkgb3BlbnNzbF92ZXJpZnkgb3BlbnNzbF94NTA5X2NoZWNrX3ByaXZhdGVfa2V5IG9wZW5zc2xfeDUwOV9jaGVja3B1cnBvc2Ugb3BlbnNzbF94NTA5X2V4cG9ydF90b19maWxlIG9wZW5zc2xfeDUwOV9leHBvcnQgb3BlbnNzbF94NTA5X2ZyZWUgb3BlbnNzbF94NTA5X3BhcnNlIG9wZW5zc2xfeDUwOV9yZWFkIG9wZW5zc2xfY2lwaGVyX2l2X2xlbmd0aCkKKyAgICAgICAgICBiWyJPdXRwdXQgQ29udHJvbCJdID0gU2V0Lm5ldyAldyhmbHVzaCBmbHVzaCBvYl9jbGVhbiBvYl9lbmRfY2xlYW4gb2JfZW5kX2ZsdXNoIG9iX2ZsdXNoIG9iX2dldF9jbGVhbiBvYl9nZXRfY29udGVudHMgb2JfZ2V0X2ZsdXNoIG9iX2dldF9sZW5ndGggb2JfZ2V0X2xldmVsIG9iX2dldF9zdGF0dXMgb2JfZ3poYW5kbGVyIG9iX2ltcGxpY2l0X2ZsdXNoIG9iX2xpc3RfaGFuZGxlcnMgb2Jfc3RhcnQgb3V0cHV0X2FkZF9yZXdyaXRlX3ZhciBvdXRwdXRfcmVzZXRfcmV3cml0ZV92YXJzIGZsdXNoKQorICAgICAgICAgIGJbIk92cmltb3MgU1FMIl0gPSBTZXQubmV3ICV3KG92cmltb3NfY2xvc2Ugb3ZyaW1vc19jbG9zZSBvdnJpbW9zX2NvbW1pdCBvdnJpbW9zX2Nvbm5lY3Qgb3ZyaW1vc19jdXJzb3Igb3ZyaW1vc19leGVjIG92cmltb3NfZXhlY3V0ZSBvdnJpbW9zX2ZldGNoX2ludG8gb3ZyaW1vc19mZXRjaF9yb3cgb3ZyaW1vc19maWVsZF9sZW4gb3ZyaW1vc19maWVsZF9uYW1lIG92cmltb3NfZmllbGRfbnVtIG92cmltb3NfZmllbGRfdHlwZSBvdnJpbW9zX2ZyZWVfcmVzdWx0IG92cmltb3NfbG9uZ3JlYWRsZW4gb3ZyaW1vc19udW1fZmllbGRzIG92cmltb3NfbnVtX3Jvd3Mgb3ZyaW1vc19wcmVwYXJlIG92cmltb3NfcmVzdWx0X2FsbCBvdnJpbW9zX3Jlc3VsdCBvdnJpbW9zX3JvbGxiYWNrIG92cmltb3NfY2xvc2UpCisgICAgICAgICAgYlsiUGFyYWRveCJdID0gU2V0Lm5ldyAldyhweF9jbG9zZSBweF9jbG9zZSBweF9jcmVhdGVfZnAgcHhfZGF0ZTJzdHJpbmcgcHhfZGVsZXRlX3JlY29yZCBweF9kZWxldGUgcHhfZ2V0X2ZpZWxkIHB4X2dldF9pbmZvIHB4X2dldF9wYXJhbWV0ZXIgcHhfZ2V0X3JlY29yZCBweF9nZXRfc2NoZW1hIHB4X2dldF92YWx1ZSBweF9pbnNlcnRfcmVjb3JkIHB4X25ldyBweF9udW1maWVsZHMgcHhfbnVtcmVjb3JkcyBweF9vcGVuX2ZwIHB4X3B1dF9yZWNvcmQgcHhfcmV0cmlldmVfcmVjb3JkIHB4X3NldF9ibG9iX2ZpbGUgcHhfc2V0X3BhcmFtZXRlciBweF9zZXRfdGFibGVuYW1lIHB4X3NldF90YXJnZXRlbmNvZGluZyBweF9zZXRfdmFsdWUgcHhfdGltZXN0YW1wMnN0cmluZyBweF91cGRhdGVfcmVjb3JkIHB4X2Nsb3NlKQorICAgICAgICAgIGJbIlBhcnNla2l0Il0gPSBTZXQubmV3ICV3KHBhcnNla2l0X2NvbXBpbGVfZmlsZSBwYXJzZWtpdF9jb21waWxlX2ZpbGUgcGFyc2VraXRfY29tcGlsZV9zdHJpbmcgcGFyc2VraXRfZnVuY19hcmdpbmZvIHBhcnNla2l0X2NvbXBpbGVfZmlsZSkKKyAgICAgICAgICBiWyJQYXNzd29yZCBIYXNoaW5nIl0gPSBTZXQubmV3ICV3KHBhc3N3b3JkX2dldF9pbmZvIHBhc3N3b3JkX2dldF9pbmZvIHBhc3N3b3JkX2hhc2ggcGFzc3dvcmRfbmVlZHNfcmVoYXNoIHBhc3N3b3JkX3ZlcmlmeSBwYXNzd29yZF9nZXRfaW5mbykKKyAgICAgICAgICBiWyJQQ05UTCJdID0gU2V0Lm5ldyAldyhwY250bF9hbGFybSBwY250bF9hbGFybSBwY250bF9lcnJubyBwY250bF9leGVjIHBjbnRsX2ZvcmsgcGNudGxfZ2V0X2xhc3RfZXJyb3IgcGNudGxfZ2V0cHJpb3JpdHkgcGNudGxfc2V0cHJpb3JpdHkgcGNudGxfc2lnbmFsX2Rpc3BhdGNoIHBjbnRsX3NpZ25hbCBwY250bF9zaWdwcm9jbWFzayBwY250bF9zaWd0aW1lZHdhaXQgcGNudGxfc2lnd2FpdGluZm8gcGNudGxfc3RyZXJyb3IgcGNudGxfd2FpdCBwY250bF93YWl0cGlkIHBjbnRsX3dleGl0c3RhdHVzIHBjbnRsX3dpZmV4aXRlZCBwY250bF93aWZzaWduYWxlZCBwY250bF93aWZzdG9wcGVkIHBjbnRsX3dzdG9wc2lnIHBjbnRsX3d0ZXJtc2lnIHBjbnRsX2FsYXJtKQorICAgICAgICAgIGJbIlBDUkUiXSA9IFNldC5uZXcgJXcocHJlZ19maWx0ZXIgcHJlZ19maWx0ZXIgcHJlZ19ncmVwIHByZWdfbGFzdF9lcnJvciBwcmVnX21hdGNoX2FsbCBwcmVnX21hdGNoIHByZWdfcXVvdGUgcHJlZ19yZXBsYWNlX2NhbGxiYWNrIHByZWdfcmVwbGFjZSBwcmVnX3NwbGl0IHByZWdfZmlsdGVyKQorICAgICAgICAgIGJbIlBERiJdID0gU2V0Lm5ldyAldyhQREZfYWN0aXZhdGVfaXRlbSBQREZfYWN0aXZhdGVfaXRlbSBQREZfYWRkX2Fubm90YXRpb24gUERGX2FkZF9ib29rbWFyayBQREZfYWRkX2xhdW5jaGxpbmsgUERGX2FkZF9sb2NhbGxpbmsgUERGX2FkZF9uYW1lZGRlc3QgUERGX2FkZF9ub3RlIFBERl9hZGRfb3V0bGluZSBQREZfYWRkX3BkZmxpbmsgUERGX2FkZF90YWJsZV9jZWxsIFBERl9hZGRfdGV4dGZsb3cgUERGX2FkZF90aHVtYm5haWwgUERGX2FkZF93ZWJsaW5rIFBERl9hcmMgUERGX2FyY24gUERGX2F0dGFjaF9maWxlIFBERl9iZWdpbl9kb2N1bWVudCBQREZfYmVnaW5fZm9udCBQREZfYmVnaW5fZ2x5cGggUERGX2JlZ2luX2l0ZW0gUERGX2JlZ2luX2xheWVyIFBERl9iZWdpbl9wYWdlX2V4dCBQREZfYmVnaW5fcGFnZSBQREZfYmVnaW5fcGF0dGVybiBQREZfYmVnaW5fdGVtcGxhdGVfZXh0IFBERl9iZWdpbl90ZW1wbGF0ZSBQREZfY2lyY2xlIFBERl9jbGlwIFBERl9jbG9zZV9pbWFnZSBQREZfY2xvc2VfcGRpX3BhZ2UgUERGX2Nsb3NlX3BkaSBQREZfY2xvc2UgUERGX2Nsb3NlcGF0aF9maWxsX3N0cm9rZSBQREZfY2xvc2VwYXRoX3N0cm9rZSBQREZfY2xvc2VwYXRoIFBERl9jb25jYXQgUERGX2NvbnRpbnVlX3RleHQgUERGX2NyZWF0ZV8zZHZpZXcgUERGX2NyZWF0ZV9hY3Rpb24gUERGX2NyZWF0ZV9hbm5vdGF0aW9uIFBERl9jcmVhdGVfYm9va21hcmsgUERGX2NyZWF0ZV9maWVsZCBQREZfY3JlYXRlX2ZpZWxkZ3JvdXAgUERGX2NyZWF0ZV9nc3RhdGUgUERGX2NyZWF0ZV9wdmYgUERGX2NyZWF0ZV90ZXh0ZmxvdyBQREZfY3VydmV0byBQREZfZGVmaW5lX2xheWVyIFBERl9kZWxldGVfcHZmIFBERl9kZWxldGVfdGFibGUgUERGX2RlbGV0ZV90ZXh0ZmxvdyBQREZfZGVsZXRlIFBERl9lbmNvZGluZ19zZXRfY2hhciBQREZfZW5kX2RvY3VtZW50IFBERl9lbmRfZm9udCBQREZfZW5kX2dseXBoIFBERl9lbmRfaXRlbSBQREZfZW5kX2xheWVyIFBERl9lbmRfcGFnZV9leHQgUERGX2VuZF9wYWdlIFBERl9lbmRfcGF0dGVybiBQREZfZW5kX3RlbXBsYXRlIFBERl9lbmRwYXRoIFBERl9maWxsX2ltYWdlYmxvY2sgUERGX2ZpbGxfcGRmYmxvY2sgUERGX2ZpbGxfc3Ryb2tlIFBERl9maWxsX3RleHRibG9jayBQREZfZmlsbCBQREZfZmluZGZvbnQgUERGX2ZpdF9pbWFnZSBQREZfZml0X3BkaV9wYWdlIFBERl9maXRfdGFibGUgUERGX2ZpdF90ZXh0ZmxvdyBQREZfZml0X3RleHRsaW5lIFBERl9nZXRfYXBpbmFtZSBQREZfZ2V0X2J1ZmZlciBQREZfZ2V0X2Vycm1zZyBQREZfZ2V0X2Vycm51bSBQREZfZ2V0X2ZvbnQgUERGX2dldF9mb250bmFtZSBQREZfZ2V0X2ZvbnRzaXplIFBERl9nZXRfaW1hZ2VfaGVpZ2h0IFBERl9nZXRfaW1hZ2Vfd2lkdGggUERGX2dldF9tYWpvcnZlcnNpb24gUERGX2dldF9taW5vcnZlcnNpb24gUERGX2dldF9wYXJhbWV0ZXIgUERGX2dldF9wZGlfcGFyYW1ldGVyIFBERl9nZXRfcGRpX3ZhbHVlIFBERl9nZXRfdmFsdWUgUERGX2luZm9fZm9udCBQREZfaW5mb19tYXRjaGJveCBQREZfaW5mb190YWJsZSBQREZfaW5mb190ZXh0ZmxvdyBQREZfaW5mb190ZXh0bGluZSBQREZfaW5pdGdyYXBoaWNzIFBERl9saW5ldG8gUERGX2xvYWRfM2RkYXRhIFBERl9sb2FkX2ZvbnQgUERGX2xvYWRfaWNjcHJvZmlsZSBQREZfbG9hZF9pbWFnZSBQREZfbWFrZXNwb3Rjb2xvciBQREZfbW92ZXRvIFBERl9uZXcgUERGX29wZW5fY2NpdHQgUERGX29wZW5fZmlsZSBQREZfb3Blbl9naWYgUERGX29wZW5faW1hZ2VfZmlsZSBQREZfb3Blbl9pbWFnZSBQREZfb3Blbl9qcGVnIFBERl9vcGVuX21lbW9yeV9pbWFnZSBQREZfb3Blbl9wZGlfZG9jdW1lbnQgUERGX29wZW5fcGRpX3BhZ2UgUERGX29wZW5fcGRpIFBERl9vcGVuX3RpZmYgUERGX3Bjb3NfZ2V0X251bWJlciBQREZfcGNvc19nZXRfc3RyZWFtIFBERl9wY29zX2dldF9zdHJpbmcgUERGX3BsYWNlX2ltYWdlIFBERl9wbGFjZV9wZGlfcGFnZSBQREZfcHJvY2Vzc19wZGkgUERGX3JlY3QgUERGX3Jlc3RvcmUgUERGX3Jlc3VtZV9wYWdlIFBERl9yb3RhdGUgUERGX3NhdmUgUERGX3NjYWxlIFBERl9zZXRfYm9yZGVyX2NvbG9yIFBERl9zZXRfYm9yZGVyX2Rhc2ggUERGX3NldF9ib3JkZXJfc3R5bGUgUERGX3NldF9jaGFyX3NwYWNpbmcgUERGX3NldF9kdXJhdGlvbiBQREZfc2V0X2dzdGF0ZSBQREZfc2V0X2hvcml6X3NjYWxpbmcgUERGX3NldF9pbmZvX2F1dGhvciBQREZfc2V0X2luZm9fY3JlYXRvciBQREZfc2V0X2luZm9fa2V5d29yZHMgUERGX3NldF9pbmZvX3N1YmplY3QgUERGX3NldF9pbmZvX3RpdGxlIFBERl9zZXRfaW5mbyBQREZfc2V0X2xheWVyX2RlcGVuZGVuY3kgUERGX3NldF9sZWFkaW5nIFBERl9zZXRfcGFyYW1ldGVyIFBERl9zZXRfdGV4dF9tYXRyaXggUERGX3NldF90ZXh0X3BvcyBQREZfc2V0X3RleHRfcmVuZGVyaW5nIFBERl9zZXRfdGV4dF9yaXNlIFBERl9zZXRfdmFsdWUgUERGX3NldF93b3JkX3NwYWNpbmcgUERGX3NldGNvbG9yIFBERl9zZXRkYXNoIFBERl9zZXRkYXNocGF0dGVybiBQREZfc2V0ZmxhdCBQREZfc2V0Zm9udCBQREZfc2V0Z3JheV9maWxsIFBERl9zZXRncmF5X3N0cm9rZSBQREZfc2V0Z3JheSBQREZfc2V0bGluZWNhcCBQREZfc2V0bGluZWpvaW4gUERGX3NldGxpbmV3aWR0aCBQREZfc2V0bWF0cml4IFBERl9zZXRtaXRlcmxpbWl0IFBERl9zZXRwb2x5ZGFzaCBQREZfc2V0cmdiY29sb3JfZmlsbCBQREZfc2V0cmdiY29sb3Jfc3Ryb2tlIFBERl9zZXRyZ2Jjb2xvciBQREZfc2hhZGluZ19wYXR0ZXJuIFBERl9zaGFkaW5nIFBERl9zaGZpbGwgUERGX3Nob3dfYm94ZWQgUERGX3Nob3dfeHkgUERGX3Nob3cgUERGX3NrZXcgUERGX3N0cmluZ3dpZHRoIFBERl9zdHJva2UgUERGX3N1c3BlbmRfcGFnZSBQREZfdHJhbnNsYXRlIFBERl91dGYxNl90b191dGY4IFBERl91dGYzMl90b191dGYxNiBQREZfdXRmOF90b191dGYxNiBQREZfYWN0aXZhdGVfaXRlbSkKKyAgICAgICAgICBiWyJQb3N0Z3JlU1FMIl0gPSBTZXQubmV3ICV3KHBnX2FmZmVjdGVkX3Jvd3MgcGdfYWZmZWN0ZWRfcm93cyBwZ19jYW5jZWxfcXVlcnkgcGdfY2xpZW50X2VuY29kaW5nIHBnX2Nsb3NlIHBnX2Nvbm5lY3QgcGdfY29ubmVjdGlvbl9idXN5IHBnX2Nvbm5lY3Rpb25fcmVzZXQgcGdfY29ubmVjdGlvbl9zdGF0dXMgcGdfY29udmVydCBwZ19jb3B5X2Zyb20gcGdfY29weV90byBwZ19kYm5hbWUgcGdfZGVsZXRlIHBnX2VuZF9jb3B5IHBnX2VzY2FwZV9ieXRlYSBwZ19lc2NhcGVfaWRlbnRpZmllciBwZ19lc2NhcGVfbGl0ZXJhbCBwZ19lc2NhcGVfc3RyaW5nIHBnX2V4ZWN1dGUgcGdfZmV0Y2hfYWxsX2NvbHVtbnMgcGdfZmV0Y2hfYWxsIHBnX2ZldGNoX2FycmF5IHBnX2ZldGNoX2Fzc29jIHBnX2ZldGNoX29iamVjdCBwZ19mZXRjaF9yZXN1bHQgcGdfZmV0Y2hfcm93IHBnX2ZpZWxkX2lzX251bGwgcGdfZmllbGRfbmFtZSBwZ19maWVsZF9udW0gcGdfZmllbGRfcHJ0bGVuIHBnX2ZpZWxkX3NpemUgcGdfZmllbGRfdGFibGUgcGdfZmllbGRfdHlwZV9vaWQgcGdfZmllbGRfdHlwZSBwZ19mcmVlX3Jlc3VsdCBwZ19nZXRfbm90aWZ5IHBnX2dldF9waWQgcGdfZ2V0X3Jlc3VsdCBwZ19ob3N0IHBnX2luc2VydCBwZ19sYXN0X2Vycm9yIHBnX2xhc3Rfbm90aWNlIHBnX2xhc3Rfb2lkIHBnX2xvX2Nsb3NlIHBnX2xvX2NyZWF0ZSBwZ19sb19leHBvcnQgcGdfbG9faW1wb3J0IHBnX2xvX29wZW4gcGdfbG9fcmVhZF9hbGwgcGdfbG9fcmVhZCBwZ19sb19zZWVrIHBnX2xvX3RlbGwgcGdfbG9fdHJ1bmNhdGUgcGdfbG9fdW5saW5rIHBnX2xvX3dyaXRlIHBnX21ldGFfZGF0YSBwZ19udW1fZmllbGRzIHBnX251bV9yb3dzIHBnX29wdGlvbnMgcGdfcGFyYW1ldGVyX3N0YXR1cyBwZ19wY29ubmVjdCBwZ19waW5nIHBnX3BvcnQgcGdfcHJlcGFyZSBwZ19wdXRfbGluZSBwZ19xdWVyeV9wYXJhbXMgcGdfcXVlcnkgcGdfcmVzdWx0X2Vycm9yX2ZpZWxkIHBnX3Jlc3VsdF9lcnJvciBwZ19yZXN1bHRfc2VlayBwZ19yZXN1bHRfc3RhdHVzIHBnX3NlbGVjdCBwZ19zZW5kX2V4ZWN1dGUgcGdfc2VuZF9wcmVwYXJlIHBnX3NlbmRfcXVlcnlfcGFyYW1zIHBnX3NlbmRfcXVlcnkgcGdfc2V0X2NsaWVudF9lbmNvZGluZyBwZ19zZXRfZXJyb3JfdmVyYm9zaXR5IHBnX3RyYWNlIHBnX3RyYW5zYWN0aW9uX3N0YXR1cyBwZ190dHkgcGdfdW5lc2NhcGVfYnl0ZWEgcGdfdW50cmFjZSBwZ191cGRhdGUgcGdfdmVyc2lvbiBwZ19hZmZlY3RlZF9yb3dzKQorICAgICAgICAgIGJbIlBPU0lYIl0gPSBTZXQubmV3ICV3KHBvc2l4X2FjY2VzcyBwb3NpeF9hY2Nlc3MgcG9zaXhfY3Rlcm1pZCBwb3NpeF9lcnJubyBwb3NpeF9nZXRfbGFzdF9lcnJvciBwb3NpeF9nZXRjd2QgcG9zaXhfZ2V0ZWdpZCBwb3NpeF9nZXRldWlkIHBvc2l4X2dldGdpZCBwb3NpeF9nZXRncmdpZCBwb3NpeF9nZXRncm5hbSBwb3NpeF9nZXRncm91cHMgcG9zaXhfZ2V0bG9naW4gcG9zaXhfZ2V0cGdpZCBwb3NpeF9nZXRwZ3JwIHBvc2l4X2dldHBpZCBwb3NpeF9nZXRwcGlkIHBvc2l4X2dldHB3bmFtIHBvc2l4X2dldHB3dWlkIHBvc2l4X2dldHJsaW1pdCBwb3NpeF9nZXRzaWQgcG9zaXhfZ2V0dWlkIHBvc2l4X2luaXRncm91cHMgcG9zaXhfaXNhdHR5IHBvc2l4X2tpbGwgcG9zaXhfbWtmaWZvIHBvc2l4X21rbm9kIHBvc2l4X3NldGVnaWQgcG9zaXhfc2V0ZXVpZCBwb3NpeF9zZXRnaWQgcG9zaXhfc2V0cGdpZCBwb3NpeF9zZXRzaWQgcG9zaXhfc2V0dWlkIHBvc2l4X3N0cmVycm9yIHBvc2l4X3RpbWVzIHBvc2l4X3R0eW5hbWUgcG9zaXhfdW5hbWUgcG9zaXhfYWNjZXNzKQorICAgICAgICAgIGJbIlByaW50ZXIiXSA9IFNldC5uZXcgJXcocHJpbnRlcl9hYm9ydCBwcmludGVyX2Fib3J0IHByaW50ZXJfY2xvc2UgcHJpbnRlcl9jcmVhdGVfYnJ1c2ggcHJpbnRlcl9jcmVhdGVfZGMgcHJpbnRlcl9jcmVhdGVfZm9udCBwcmludGVyX2NyZWF0ZV9wZW4gcHJpbnRlcl9kZWxldGVfYnJ1c2ggcHJpbnRlcl9kZWxldGVfZGMgcHJpbnRlcl9kZWxldGVfZm9udCBwcmludGVyX2RlbGV0ZV9wZW4gcHJpbnRlcl9kcmF3X2JtcCBwcmludGVyX2RyYXdfY2hvcmQgcHJpbnRlcl9kcmF3X2VsaXBzZSBwcmludGVyX2RyYXdfbGluZSBwcmludGVyX2RyYXdfcGllIHByaW50ZXJfZHJhd19yZWN0YW5nbGUgcHJpbnRlcl9kcmF3X3JvdW5kcmVjdCBwcmludGVyX2RyYXdfdGV4dCBwcmludGVyX2VuZF9kb2MgcHJpbnRlcl9lbmRfcGFnZSBwcmludGVyX2dldF9vcHRpb24gcHJpbnRlcl9saXN0IHByaW50ZXJfbG9naWNhbF9mb250aGVpZ2h0IHByaW50ZXJfb3BlbiBwcmludGVyX3NlbGVjdF9icnVzaCBwcmludGVyX3NlbGVjdF9mb250IHByaW50ZXJfc2VsZWN0X3BlbiBwcmludGVyX3NldF9vcHRpb24gcHJpbnRlcl9zdGFydF9kb2MgcHJpbnRlcl9zdGFydF9wYWdlIHByaW50ZXJfd3JpdGUgcHJpbnRlcl9hYm9ydCkKKyAgICAgICAgICBiWyJQcm9jdGl0bGUiXSA9IFNldC5uZXcgJXcoc2V0cHJvY3RpdGxlIHNldHByb2N0aXRsZSBzZXR0aHJlYWR0aXRsZSBzZXRwcm9jdGl0bGUpCisgICAgICAgICAgYlsiUFMiXSA9IFNldC5uZXcgJXcocHNfYWRkX2Jvb2ttYXJrIHBzX2FkZF9ib29rbWFyayBwc19hZGRfbGF1bmNobGluayBwc19hZGRfbG9jYWxsaW5rIHBzX2FkZF9ub3RlIHBzX2FkZF9wZGZsaW5rIHBzX2FkZF93ZWJsaW5rIHBzX2FyYyBwc19hcmNuIHBzX2JlZ2luX3BhZ2UgcHNfYmVnaW5fcGF0dGVybiBwc19iZWdpbl90ZW1wbGF0ZSBwc19jaXJjbGUgcHNfY2xpcCBwc19jbG9zZV9pbWFnZSBwc19jbG9zZSBwc19jbG9zZXBhdGhfc3Ryb2tlIHBzX2Nsb3NlcGF0aCBwc19jb250aW51ZV90ZXh0IHBzX2N1cnZldG8gcHNfZGVsZXRlIHBzX2VuZF9wYWdlIHBzX2VuZF9wYXR0ZXJuIHBzX2VuZF90ZW1wbGF0ZSBwc19maWxsX3N0cm9rZSBwc19maWxsIHBzX2ZpbmRmb250IHBzX2dldF9idWZmZXIgcHNfZ2V0X3BhcmFtZXRlciBwc19nZXRfdmFsdWUgcHNfaHlwaGVuYXRlIHBzX2luY2x1ZGVfZmlsZSBwc19saW5ldG8gcHNfbWFrZXNwb3Rjb2xvciBwc19tb3ZldG8gcHNfbmV3IHBzX29wZW5fZmlsZSBwc19vcGVuX2ltYWdlX2ZpbGUgcHNfb3Blbl9pbWFnZSBwc19vcGVuX21lbW9yeV9pbWFnZSBwc19wbGFjZV9pbWFnZSBwc19yZWN0IHBzX3Jlc3RvcmUgcHNfcm90YXRlIHBzX3NhdmUgcHNfc2NhbGUgcHNfc2V0X2JvcmRlcl9jb2xvciBwc19zZXRfYm9yZGVyX2Rhc2ggcHNfc2V0X2JvcmRlcl9zdHlsZSBwc19zZXRfaW5mbyBwc19zZXRfcGFyYW1ldGVyIHBzX3NldF90ZXh0X3BvcyBwc19zZXRfdmFsdWUgcHNfc2V0Y29sb3IgcHNfc2V0ZGFzaCBwc19zZXRmbGF0IHBzX3NldGZvbnQgcHNfc2V0Z3JheSBwc19zZXRsaW5lY2FwIHBzX3NldGxpbmVqb2luIHBzX3NldGxpbmV3aWR0aCBwc19zZXRtaXRlcmxpbWl0IHBzX3NldG92ZXJwcmludG1vZGUgcHNfc2V0cG9seWRhc2ggcHNfc2hhZGluZ19wYXR0ZXJuIHBzX3NoYWRpbmcgcHNfc2hmaWxsIHBzX3Nob3dfYm94ZWQgcHNfc2hvd194eTIgcHNfc2hvd194eSBwc19zaG93MiBwc19zaG93IHBzX3N0cmluZ19nZW9tZXRyeSBwc19zdHJpbmd3aWR0aCBwc19zdHJva2UgcHNfc3ltYm9sX25hbWUgcHNfc3ltYm9sX3dpZHRoIHBzX3N5bWJvbCBwc190cmFuc2xhdGUgcHNfYWRkX2Jvb2ttYXJrKQorICAgICAgICAgIGJbIlBzcGVsbCJdID0gU2V0Lm5ldyAldyhwc3BlbGxfYWRkX3RvX3BlcnNvbmFsIHBzcGVsbF9hZGRfdG9fcGVyc29uYWwgcHNwZWxsX2FkZF90b19zZXNzaW9uIHBzcGVsbF9jaGVjayBwc3BlbGxfY2xlYXJfc2Vzc2lvbiBwc3BlbGxfY29uZmlnX2NyZWF0ZSBwc3BlbGxfY29uZmlnX2RhdGFfZGlyIHBzcGVsbF9jb25maWdfZGljdF9kaXIgcHNwZWxsX2NvbmZpZ19pZ25vcmUgcHNwZWxsX2NvbmZpZ19tb2RlIHBzcGVsbF9jb25maWdfcGVyc29uYWwgcHNwZWxsX2NvbmZpZ19yZXBsIHBzcGVsbF9jb25maWdfcnVudG9nZXRoZXIgcHNwZWxsX2NvbmZpZ19zYXZlX3JlcGwgcHNwZWxsX25ld19jb25maWcgcHNwZWxsX25ld19wZXJzb25hbCBwc3BlbGxfbmV3IHBzcGVsbF9zYXZlX3dvcmRsaXN0IHBzcGVsbF9zdG9yZV9yZXBsYWNlbWVudCBwc3BlbGxfc3VnZ2VzdCBwc3BlbGxfYWRkX3RvX3BlcnNvbmFsKQorICAgICAgICAgIGJbInF0ZG9tIl0gPSBTZXQubmV3ICV3KHFkb21fZXJyb3IgcWRvbV9lcnJvciBxZG9tX3RyZWUgcWRvbV9lcnJvcikKKyAgICAgICAgICBiWyJSYWRpdXMiXSA9IFNldC5uZXcgJXcocmFkaXVzX2FjY3Rfb3BlbiByYWRpdXNfYWNjdF9vcGVuIHJhZGl1c19hZGRfc2VydmVyIHJhZGl1c19hdXRoX29wZW4gcmFkaXVzX2Nsb3NlIHJhZGl1c19jb25maWcgcmFkaXVzX2NyZWF0ZV9yZXF1ZXN0IHJhZGl1c19jdnRfYWRkciByYWRpdXNfY3Z0X2ludCByYWRpdXNfY3Z0X3N0cmluZyByYWRpdXNfZGVtYW5nbGVfbXBwZV9rZXkgcmFkaXVzX2RlbWFuZ2xlIHJhZGl1c19nZXRfYXR0ciByYWRpdXNfZ2V0X3RhZ2dlZF9hdHRyX2RhdGEgcmFkaXVzX2dldF90YWdnZWRfYXR0cl90YWcgcmFkaXVzX2dldF92ZW5kb3JfYXR0ciByYWRpdXNfcHV0X2FkZHIgcmFkaXVzX3B1dF9hdHRyIHJhZGl1c19wdXRfaW50IHJhZGl1c19wdXRfc3RyaW5nIHJhZGl1c19wdXRfdmVuZG9yX2FkZHIgcmFkaXVzX3B1dF92ZW5kb3JfYXR0ciByYWRpdXNfcHV0X3ZlbmRvcl9pbnQgcmFkaXVzX3B1dF92ZW5kb3Jfc3RyaW5nIHJhZGl1c19yZXF1ZXN0X2F1dGhlbnRpY2F0b3IgcmFkaXVzX3NhbHRfZW5jcnlwdF9hdHRyIHJhZGl1c19zZW5kX3JlcXVlc3QgcmFkaXVzX3NlcnZlcl9zZWNyZXQgcmFkaXVzX3N0cmVycm9yIHJhZGl1c19hY2N0X29wZW4pCisgICAgICAgICAgYlsiUmFyIl0gPSBTZXQubmV3ICV3KHJhcl93cmFwcGVyX2NhY2hlX3N0YXRzIHJhcl93cmFwcGVyX2NhY2hlX3N0YXRzIHJhcl93cmFwcGVyX2NhY2hlX3N0YXRzKQorICAgICAgICAgIGJbIlJlYWRsaW5lIl0gPSBTZXQubmV3ICV3KHJlYWRsaW5lX2FkZF9oaXN0b3J5IHJlYWRsaW5lX2FkZF9oaXN0b3J5IHJlYWRsaW5lX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCByZWFkbGluZV9jYWxsYmFja19oYW5kbGVyX3JlbW92ZSByZWFkbGluZV9jYWxsYmFja19yZWFkX2NoYXIgcmVhZGxpbmVfY2xlYXJfaGlzdG9yeSByZWFkbGluZV9jb21wbGV0aW9uX2Z1bmN0aW9uIHJlYWRsaW5lX2luZm8gcmVhZGxpbmVfbGlzdF9oaXN0b3J5IHJlYWRsaW5lX29uX25ld19saW5lIHJlYWRsaW5lX3JlYWRfaGlzdG9yeSByZWFkbGluZV9yZWRpc3BsYXkgcmVhZGxpbmVfd3JpdGVfaGlzdG9yeSByZWFkbGluZSByZWFkbGluZV9hZGRfaGlzdG9yeSkKKyAgICAgICAgICBiWyJSZWNvZGUiXSA9IFNldC5uZXcgJXcocmVjb2RlX2ZpbGUgcmVjb2RlX2ZpbGUgcmVjb2RlX3N0cmluZyByZWNvZGUgcmVjb2RlX2ZpbGUpCisgICAgICAgICAgYlsiUE9TSVggUmVnZXgiXSA9IFNldC5uZXcgJXcoZXJlZ19yZXBsYWNlIGVyZWdfcmVwbGFjZSBlcmVnIGVyZWdpX3JlcGxhY2UgZXJlZ2kgc3BsaXQgc3BsaXRpIHNxbF9yZWdjYXNlIGVyZWdfcmVwbGFjZSkKKyAgICAgICAgICBiWyJSUE0gUmVhZGVyIl0gPSBTZXQubmV3ICV3KHJwbV9jbG9zZSBycG1fY2xvc2UgcnBtX2dldF90YWcgcnBtX2lzX3ZhbGlkIHJwbV9vcGVuIHJwbV92ZXJzaW9uIHJwbV9jbG9zZSkKKyAgICAgICAgICBiWyJSUkQiXSA9IFNldC5uZXcgJXcocnJkX2NyZWF0ZSBycmRfY3JlYXRlIHJyZF9lcnJvciBycmRfZmV0Y2ggcnJkX2ZpcnN0IHJyZF9ncmFwaCBycmRfaW5mbyBycmRfbGFzdCBycmRfbGFzdHVwZGF0ZSBycmRfcmVzdG9yZSBycmRfdHVuZSBycmRfdXBkYXRlIHJyZF92ZXJzaW9uIHJyZF94cG9ydCBycmRjX2Rpc2Nvbm5lY3QgcnJkX2NyZWF0ZSkKKyAgICAgICAgICBiWyJydW5raXQiXSA9IFNldC5uZXcgJXcocnVua2l0X2NsYXNzX2Fkb3B0IHJ1bmtpdF9jbGFzc19lbWFuY2lwYXRlIHJ1bmtpdF9jb25zdGFudF9hZGQgcnVua2l0X2NvbnN0YW50X3JlZGVmaW5lIHJ1bmtpdF9jb25zdGFudF9yZW1vdmUgcnVua2l0X2Z1bmN0aW9uX2FkZCBydW5raXRfZnVuY3Rpb25fY29weSBydW5raXRfZnVuY3Rpb25fcmVkZWZpbmUgcnVua2l0X2Z1bmN0aW9uX3JlbW92ZSBydW5raXRfZnVuY3Rpb25fcmVuYW1lIHJ1bmtpdF9pbXBvcnQgcnVua2l0X2xpbnRfZmlsZSBydW5raXRfbGludCBydW5raXRfbWV0aG9kX2FkZCBydW5raXRfbWV0aG9kX2NvcHkgcnVua2l0X21ldGhvZF9yZWRlZmluZSBydW5raXRfbWV0aG9kX3JlbW92ZSBydW5raXRfbWV0aG9kX3JlbmFtZSBydW5raXRfcmV0dXJuX3ZhbHVlX3VzZWQgcnVua2l0X3NhbmRib3hfb3V0cHV0X2hhbmRsZXIgcnVua2l0X3N1cGVyZ2xvYmFscykKKyAgICAgICAgICBiWyJTQU0iXSA9IFNldC5uZXcgJXcoKQorICAgICAgICAgIGJbIlNDQSJdID0gU2V0Lm5ldyAldygpCisgICAgICAgICAgYlsiU0RPIERBUyBYTUwiXSA9IFNldC5uZXcgJXcoKQorICAgICAgICAgIGJbIlNETyJdID0gU2V0Lm5ldyAldygpCisgICAgICAgICAgYlsiU0RPLURBUy1SZWxhdGlvbmFsIl0gPSBTZXQubmV3ICV3KCkKKyAgICAgICAgICBiWyJTZW1hcGhvcmUiXSA9IFNldC5uZXcgJXcoZnRvayBmdG9rIG1zZ19nZXRfcXVldWUgbXNnX3F1ZXVlX2V4aXN0cyBtc2dfcmVjZWl2ZSBtc2dfcmVtb3ZlX3F1ZXVlIG1zZ19zZW5kIG1zZ19zZXRfcXVldWUgbXNnX3N0YXRfcXVldWUgc2VtX2FjcXVpcmUgc2VtX2dldCBzZW1fcmVsZWFzZSBzZW1fcmVtb3ZlIHNobV9hdHRhY2ggc2htX2RldGFjaCBzaG1fZ2V0X3ZhciBzaG1faGFzX3ZhciBzaG1fcHV0X3ZhciBzaG1fcmVtb3ZlX3ZhciBzaG1fcmVtb3ZlIGZ0b2spCisgICAgICAgICAgYlsiU2Vzc2lvbiBQZ1NRTCJdID0gU2V0Lm5ldyAldyhzZXNzaW9uX3Bnc3FsX2FkZF9lcnJvciBzZXNzaW9uX3Bnc3FsX2FkZF9lcnJvciBzZXNzaW9uX3Bnc3FsX2dldF9lcnJvciBzZXNzaW9uX3Bnc3FsX2dldF9maWVsZCBzZXNzaW9uX3Bnc3FsX3Jlc2V0IHNlc3Npb25fcGdzcWxfc2V0X2ZpZWxkIHNlc3Npb25fcGdzcWxfc3RhdHVzIHNlc3Npb25fcGdzcWxfYWRkX2Vycm9yKQorICAgICAgICAgIGJbIlNlc3Npb24iXSA9IFNldC5uZXcgJXcoc2Vzc2lvbl9jYWNoZV9leHBpcmUgc2Vzc2lvbl9jYWNoZV9leHBpcmUgc2Vzc2lvbl9jYWNoZV9saW1pdGVyIHNlc3Npb25fY29tbWl0IHNlc3Npb25fZGVjb2RlIHNlc3Npb25fZGVzdHJveSBzZXNzaW9uX2VuY29kZSBzZXNzaW9uX2dldF9jb29raWVfcGFyYW1zIHNlc3Npb25faWQgc2Vzc2lvbl9pc19yZWdpc3RlcmVkIHNlc3Npb25fbW9kdWxlX25hbWUgc2Vzc2lvbl9uYW1lIHNlc3Npb25fcmVnZW5lcmF0ZV9pZCBzZXNzaW9uX3JlZ2lzdGVyX3NodXRkb3duIHNlc3Npb25fcmVnaXN0ZXIgc2Vzc2lvbl9zYXZlX3BhdGggc2Vzc2lvbl9zZXRfY29va2llX3BhcmFtcyBzZXNzaW9uX3NldF9zYXZlX2hhbmRsZXIgc2Vzc2lvbl9zdGFydCBzZXNzaW9uX3N0YXR1cyBzZXNzaW9uX3VucmVnaXN0ZXIgc2Vzc2lvbl91bnNldCBzZXNzaW9uX3dyaXRlX2Nsb3NlIHNlc3Npb25fY2FjaGVfZXhwaXJlKQorICAgICAgICAgIGJbIlNoYXJlZCBNZW1vcnkiXSA9IFNldC5uZXcgJXcoc2htb3BfY2xvc2Ugc2htb3BfY2xvc2Ugc2htb3BfZGVsZXRlIHNobW9wX29wZW4gc2htb3BfcmVhZCBzaG1vcF9zaXplIHNobW9wX3dyaXRlIHNobW9wX2Nsb3NlKQorICAgICAgICAgIGJbIlNpbXBsZVhNTCJdID0gU2V0Lm5ldyAldyhzaW1wbGV4bWxfaW1wb3J0X2RvbSBzaW1wbGV4bWxfaW1wb3J0X2RvbSBzaW1wbGV4bWxfbG9hZF9maWxlIHNpbXBsZXhtbF9sb2FkX3N0cmluZyBzaW1wbGV4bWxfaW1wb3J0X2RvbSkKKyAgICAgICAgICBiWyJTTk1QIl0gPSBTZXQubmV3ICV3KHNubXBfZ2V0X3F1aWNrX3ByaW50IHNubXBfZ2V0X3F1aWNrX3ByaW50IHNubXBfZ2V0X3ZhbHVlcmV0cmlldmFsIHNubXBfcmVhZF9taWIgc25tcF9zZXRfZW51bV9wcmludCBzbm1wX3NldF9vaWRfbnVtZXJpY19wcmludCBzbm1wX3NldF9vaWRfb3V0cHV0X2Zvcm1hdCBzbm1wX3NldF9xdWlja19wcmludCBzbm1wX3NldF92YWx1ZXJldHJpZXZhbCBzbm1wMl9nZXQgc25tcDJfZ2V0bmV4dCBzbm1wMl9yZWFsX3dhbGsgc25tcDJfc2V0IHNubXAyX3dhbGsgc25tcDNfZ2V0IHNubXAzX2dldG5leHQgc25tcDNfcmVhbF93YWxrIHNubXAzX3NldCBzbm1wM193YWxrIHNubXBnZXQgc25tcGdldG5leHQgc25tcHJlYWx3YWxrIHNubXBzZXQgc25tcHdhbGsgc25tcHdhbGtvaWQgc25tcF9nZXRfcXVpY2tfcHJpbnQpCisgICAgICAgICAgYlsiU09BUCJdID0gU2V0Lm5ldyAldyhpc19zb2FwX2ZhdWx0IGlzX3NvYXBfZmF1bHQgdXNlX3NvYXBfZXJyb3JfaGFuZGxlciBpc19zb2FwX2ZhdWx0KQorICAgICAgICAgIGJbIlNvY2tldCJdID0gU2V0Lm5ldyAldyhzb2NrZXRfYWNjZXB0IHNvY2tldF9hY2NlcHQgc29ja2V0X2JpbmQgc29ja2V0X2NsZWFyX2Vycm9yIHNvY2tldF9jbG9zZSBzb2NrZXRfY21zZ19zcGFjZSBzb2NrZXRfY29ubmVjdCBzb2NrZXRfY3JlYXRlX2xpc3RlbiBzb2NrZXRfY3JlYXRlX3BhaXIgc29ja2V0X2NyZWF0ZSBzb2NrZXRfZ2V0X29wdGlvbiBzb2NrZXRfZ2V0cGVlcm5hbWUgc29ja2V0X2dldHNvY2tuYW1lIHNvY2tldF9pbXBvcnRfc3RyZWFtIHNvY2tldF9sYXN0X2Vycm9yIHNvY2tldF9saXN0ZW4gc29ja2V0X3JlYWQgc29ja2V0X3JlY3Ygc29ja2V0X3JlY3Zmcm9tIHNvY2tldF9yZWN2bXNnIHNvY2tldF9zZWxlY3Qgc29ja2V0X3NlbmQgc29ja2V0X3NlbmRtc2cgc29ja2V0X3NlbmR0byBzb2NrZXRfc2V0X2Jsb2NrIHNvY2tldF9zZXRfbm9uYmxvY2sgc29ja2V0X3NldF9vcHRpb24gc29ja2V0X3NodXRkb3duIHNvY2tldF9zdHJlcnJvciBzb2NrZXRfd3JpdGUgc29ja2V0X2FjY2VwdCkKKyAgICAgICAgICBiWyJTb2xyIl0gPSBTZXQubmV3ICV3KHNvbHJfZ2V0X3ZlcnNpb24gc29scl9nZXRfdmVyc2lvbiBzb2xyX2dldF92ZXJzaW9uKQorICAgICAgICAgIGJbIlNQTCJdID0gU2V0Lm5ldyAldyhjbGFzc19pbXBsZW1lbnRzIGNsYXNzX2ltcGxlbWVudHMgY2xhc3NfcGFyZW50cyBjbGFzc191c2VzIGl0ZXJhdG9yX2FwcGx5IGl0ZXJhdG9yX2NvdW50IGl0ZXJhdG9yX3RvX2FycmF5IHNwbF9hdXRvbG9hZF9jYWxsIHNwbF9hdXRvbG9hZF9leHRlbnNpb25zIHNwbF9hdXRvbG9hZF9mdW5jdGlvbnMgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyIHNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyIHNwbF9hdXRvbG9hZCBzcGxfY2xhc3NlcyBzcGxfb2JqZWN0X2hhc2ggY2xhc3NfaW1wbGVtZW50cykKKyAgICAgICAgICBiWyJTUFBMVVMiXSA9IFNldC5uZXcgJXcoY2FsY3VsX2htYWMgY2FsY3VsX2htYWMgY2FsY3VsaG1hYyBudGhtYWMgc2lnbmV1cmxwYWllbWVudCBjYWxjdWxfaG1hYykKKyAgICAgICAgICBiWyJTUUxpdGUiXSA9IFNldC5uZXcgJXcoc3FsaXRlX2FycmF5X3F1ZXJ5IHNxbGl0ZV9hcnJheV9xdWVyeSBzcWxpdGVfYnVzeV90aW1lb3V0IHNxbGl0ZV9jaGFuZ2VzIHNxbGl0ZV9jbG9zZSBzcWxpdGVfY29sdW1uIHNxbGl0ZV9jcmVhdGVfYWdncmVnYXRlIHNxbGl0ZV9jcmVhdGVfZnVuY3Rpb24gc3FsaXRlX2N1cnJlbnQgc3FsaXRlX2Vycm9yX3N0cmluZyBzcWxpdGVfZXNjYXBlX3N0cmluZyBzcWxpdGVfZXhlYyBzcWxpdGVfZmFjdG9yeSBzcWxpdGVfZmV0Y2hfYWxsIHNxbGl0ZV9mZXRjaF9hcnJheSBzcWxpdGVfZmV0Y2hfY29sdW1uX3R5cGVzIHNxbGl0ZV9mZXRjaF9vYmplY3Qgc3FsaXRlX2ZldGNoX3NpbmdsZSBzcWxpdGVfZmV0Y2hfc3RyaW5nIHNxbGl0ZV9maWVsZF9uYW1lIHNxbGl0ZV9oYXNfbW9yZSBzcWxpdGVfaGFzX3ByZXYgc3FsaXRlX2tleSBzcWxpdGVfbGFzdF9lcnJvciBzcWxpdGVfbGFzdF9pbnNlcnRfcm93aWQgc3FsaXRlX2xpYmVuY29kaW5nIHNxbGl0ZV9saWJ2ZXJzaW9uIHNxbGl0ZV9uZXh0IHNxbGl0ZV9udW1fZmllbGRzIHNxbGl0ZV9udW1fcm93cyBzcWxpdGVfb3BlbiBzcWxpdGVfcG9wZW4gc3FsaXRlX3ByZXYgc3FsaXRlX3F1ZXJ5IHNxbGl0ZV9yZXdpbmQgc3FsaXRlX3NlZWsgc3FsaXRlX3NpbmdsZV9xdWVyeSBzcWxpdGVfdWRmX2RlY29kZV9iaW5hcnkgc3FsaXRlX3VkZl9lbmNvZGVfYmluYXJ5IHNxbGl0ZV91bmJ1ZmZlcmVkX3F1ZXJ5IHNxbGl0ZV92YWxpZCBzcWxpdGVfYXJyYXlfcXVlcnkpCisgICAgICAgICAgYlsiU1FMU1JWIl0gPSBTZXQubmV3ICV3KHNxbHNydl9iZWdpbl90cmFuc2FjdGlvbiBzcWxzcnZfYmVnaW5fdHJhbnNhY3Rpb24gc3Fsc3J2X2NhbmNlbCBzcWxzcnZfY2xpZW50X2luZm8gc3Fsc3J2X2Nsb3NlIHNxbHNydl9jb21taXQgc3Fsc3J2X2NvbmZpZ3VyZSBzcWxzcnZfY29ubmVjdCBzcWxzcnZfZXJyb3JzIHNxbHNydl9leGVjdXRlIHNxbHNydl9mZXRjaF9hcnJheSBzcWxzcnZfZmV0Y2hfb2JqZWN0IHNxbHNydl9mZXRjaCBzcWxzcnZfZmllbGRfbWV0YWRhdGEgc3Fsc3J2X2ZyZWVfc3RtdCBzcWxzcnZfZ2V0X2NvbmZpZyBzcWxzcnZfZ2V0X2ZpZWxkIHNxbHNydl9oYXNfcm93cyBzcWxzcnZfbmV4dF9yZXN1bHQgc3Fsc3J2X251bV9maWVsZHMgc3Fsc3J2X251bV9yb3dzIHNxbHNydl9wcmVwYXJlIHNxbHNydl9xdWVyeSBzcWxzcnZfcm9sbGJhY2sgc3Fsc3J2X3Jvd3NfYWZmZWN0ZWQgc3Fsc3J2X3NlbmRfc3RyZWFtX2RhdGEgc3Fsc3J2X3NlcnZlcl9pbmZvIHNxbHNydl9iZWdpbl90cmFuc2FjdGlvbikKKyAgICAgICAgICBiWyJzc2RlZXAiXSA9IFNldC5uZXcgJXcoc3NkZWVwX2Z1enp5X2NvbXBhcmUgc3NkZWVwX2Z1enp5X2NvbXBhcmUgc3NkZWVwX2Z1enp5X2hhc2hfZmlsZW5hbWUgc3NkZWVwX2Z1enp5X2hhc2ggc3NkZWVwX2Z1enp5X2NvbXBhcmUpCisgICAgICAgICAgYlsiU1NIMiJdID0gU2V0Lm5ldyAldyhzc2gyX2F1dGhfYWdlbnQgc3NoMl9hdXRoX2FnZW50IHNzaDJfYXV0aF9ob3N0YmFzZWRfZmlsZSBzc2gyX2F1dGhfbm9uZSBzc2gyX2F1dGhfcGFzc3dvcmQgc3NoMl9hdXRoX3B1YmtleV9maWxlIHNzaDJfY29ubmVjdCBzc2gyX2V4ZWMgc3NoMl9mZXRjaF9zdHJlYW0gc3NoMl9maW5nZXJwcmludCBzc2gyX21ldGhvZHNfbmVnb3RpYXRlZCBzc2gyX3B1YmxpY2tleV9hZGQgc3NoMl9wdWJsaWNrZXlfaW5pdCBzc2gyX3B1YmxpY2tleV9saXN0IHNzaDJfcHVibGlja2V5X3JlbW92ZSBzc2gyX3NjcF9yZWN2IHNzaDJfc2NwX3NlbmQgc3NoMl9zZnRwX2NobW9kIHNzaDJfc2Z0cF9sc3RhdCBzc2gyX3NmdHBfbWtkaXIgc3NoMl9zZnRwX3JlYWRsaW5rIHNzaDJfc2Z0cF9yZWFscGF0aCBzc2gyX3NmdHBfcmVuYW1lIHNzaDJfc2Z0cF9ybWRpciBzc2gyX3NmdHBfc3RhdCBzc2gyX3NmdHBfc3ltbGluayBzc2gyX3NmdHBfdW5saW5rIHNzaDJfc2Z0cCBzc2gyX3NoZWxsIHNzaDJfdHVubmVsIHNzaDJfYXV0aF9hZ2VudCkKKyAgICAgICAgICBiWyJTdGF0aXN0aWMiXSA9IFNldC5uZXcgJXcoc3RhdHNfYWJzb2x1dGVfZGV2aWF0aW9uIHN0YXRzX2Fic29sdXRlX2RldmlhdGlvbiBzdGF0c19jZGZfYmV0YSBzdGF0c19jZGZfYmlub21pYWwgc3RhdHNfY2RmX2NhdWNoeSBzdGF0c19jZGZfY2hpc3F1YXJlIHN0YXRzX2NkZl9leHBvbmVudGlhbCBzdGF0c19jZGZfZiBzdGF0c19jZGZfZ2FtbWEgc3RhdHNfY2RmX2xhcGxhY2Ugc3RhdHNfY2RmX2xvZ2lzdGljIHN0YXRzX2NkZl9uZWdhdGl2ZV9iaW5vbWlhbCBzdGF0c19jZGZfbm9uY2VudHJhbF9jaGlzcXVhcmUgc3RhdHNfY2RmX25vbmNlbnRyYWxfZiBzdGF0c19jZGZfcG9pc3NvbiBzdGF0c19jZGZfdCBzdGF0c19jZGZfdW5pZm9ybSBzdGF0c19jZGZfd2VpYnVsbCBzdGF0c19jb3ZhcmlhbmNlIHN0YXRzX2Rlbl91bmlmb3JtIHN0YXRzX2RlbnNfYmV0YSBzdGF0c19kZW5zX2NhdWNoeSBzdGF0c19kZW5zX2NoaXNxdWFyZSBzdGF0c19kZW5zX2V4cG9uZW50aWFsIHN0YXRzX2RlbnNfZiBzdGF0c19kZW5zX2dhbW1hIHN0YXRzX2RlbnNfbGFwbGFjZSBzdGF0c19kZW5zX2xvZ2lzdGljIHN0YXRzX2RlbnNfbmVnYXRpdmVfYmlub21pYWwgc3RhdHNfZGVuc19ub3JtYWwgc3RhdHNfZGVuc19wbWZfYmlub21pYWwgc3RhdHNfZGVuc19wbWZfaHlwZXJnZW9tZXRyaWMgc3RhdHNfZGVuc19wbWZfcG9pc3NvbiBzdGF0c19kZW5zX3Qgc3RhdHNfZGVuc193ZWlidWxsIHN0YXRzX2hhcm1vbmljX21lYW4gc3RhdHNfa3VydG9zaXMgc3RhdHNfcmFuZF9nZW5fYmV0YSBzdGF0c19yYW5kX2dlbl9jaGlzcXVhcmUgc3RhdHNfcmFuZF9nZW5fZXhwb25lbnRpYWwgc3RhdHNfcmFuZF9nZW5fZiBzdGF0c19yYW5kX2dlbl9mdW5pZm9ybSBzdGF0c19yYW5kX2dlbl9nYW1tYSBzdGF0c19yYW5kX2dlbl9pYmlub21pYWxfbmVnYXRpdmUgc3RhdHNfcmFuZF9nZW5faWJpbm9taWFsIHN0YXRzX3JhbmRfZ2VuX2ludCBzdGF0c19yYW5kX2dlbl9pcG9pc3NvbiBzdGF0c19yYW5kX2dlbl9pdW5pZm9ybSBzdGF0c19yYW5kX2dlbl9ub25jZW5yYWxfY2hpc3F1YXJlIHN0YXRzX3JhbmRfZ2VuX25vbmNlbnRyYWxfZiBzdGF0c19yYW5kX2dlbl9ub25jZW50cmFsX3Qgc3RhdHNfcmFuZF9nZW5fbm9ybWFsIHN0YXRzX3JhbmRfZ2VuX3Qgc3RhdHNfcmFuZF9nZXRfc2VlZHMgc3RhdHNfcmFuZF9waHJhc2VfdG9fc2VlZHMgc3RhdHNfcmFuZF9yYW5mIHN0YXRzX3JhbmRfc2V0YWxsIHN0YXRzX3NrZXcgc3RhdHNfc3RhbmRhcmRfZGV2aWF0aW9uIHN0YXRzX3N0YXRfYmlub21pYWxfY29lZiBzdGF0c19zdGF0X2NvcnJlbGF0aW9uIHN0YXRzX3N0YXRfZ2VubmNoIHN0YXRzX3N0YXRfaW5kZXBlbmRlbnRfdCBzdGF0c19zdGF0X2lubmVycHJvZHVjdCBzdGF0c19zdGF0X25vbmNlbnRyYWxfdCBzdGF0c19zdGF0X3BhaXJlZF90IHN0YXRzX3N0YXRfcGVyY2VudGlsZSBzdGF0c19zdGF0X3Bvd2Vyc3VtIHN0YXRzX3ZhcmlhbmNlIHN0YXRzX2Fic29sdXRlX2RldmlhdGlvbikKKyAgICAgICAgICBiWyJTdG9tcCJdID0gU2V0Lm5ldyAldyhzdG9tcF9jb25uZWN0X2Vycm9yIHN0b21wX2Nvbm5lY3RfZXJyb3Igc3RvbXBfdmVyc2lvbiBzdG9tcF9jb25uZWN0X2Vycm9yKQorICAgICAgICAgIGJbIlN0cmVhbSJdID0gU2V0Lm5ldyAldyhzZXRfc29ja2V0X2Jsb2NraW5nIHNldF9zb2NrZXRfYmxvY2tpbmcgc3RyZWFtX2J1Y2tldF9hcHBlbmQgc3RyZWFtX2J1Y2tldF9tYWtlX3dyaXRlYWJsZSBzdHJlYW1fYnVja2V0X25ldyBzdHJlYW1fYnVja2V0X3ByZXBlbmQgc3RyZWFtX2NvbnRleHRfY3JlYXRlIHN0cmVhbV9jb250ZXh0X2dldF9kZWZhdWx0IHN0cmVhbV9jb250ZXh0X2dldF9vcHRpb25zIHN0cmVhbV9jb250ZXh0X2dldF9wYXJhbXMgc3RyZWFtX2NvbnRleHRfc2V0X2RlZmF1bHQgc3RyZWFtX2NvbnRleHRfc2V0X29wdGlvbiBzdHJlYW1fY29udGV4dF9zZXRfcGFyYW1zIHN0cmVhbV9jb3B5X3RvX3N0cmVhbSBzdHJlYW1fZW5jb2Rpbmcgc3RyZWFtX2ZpbHRlcl9hcHBlbmQgc3RyZWFtX2ZpbHRlcl9wcmVwZW5kIHN0cmVhbV9maWx0ZXJfcmVnaXN0ZXIgc3RyZWFtX2ZpbHRlcl9yZW1vdmUgc3RyZWFtX2dldF9jb250ZW50cyBzdHJlYW1fZ2V0X2ZpbHRlcnMgc3RyZWFtX2dldF9saW5lIHN0cmVhbV9nZXRfbWV0YV9kYXRhIHN0cmVhbV9nZXRfdHJhbnNwb3J0cyBzdHJlYW1fZ2V0X3dyYXBwZXJzIHN0cmVhbV9pc19sb2NhbCBzdHJlYW1fbm90aWZpY2F0aW9uX2NhbGxiYWNrIHN0cmVhbV9yZWdpc3Rlcl93cmFwcGVyIHN0cmVhbV9yZXNvbHZlX2luY2x1ZGVfcGF0aCBzdHJlYW1fc2VsZWN0IHN0cmVhbV9zZXRfYmxvY2tpbmcgc3RyZWFtX3NldF9jaHVua19zaXplIHN0cmVhbV9zZXRfcmVhZF9idWZmZXIgc3RyZWFtX3NldF90aW1lb3V0IHN0cmVhbV9zZXRfd3JpdGVfYnVmZmVyIHN0cmVhbV9zb2NrZXRfYWNjZXB0IHN0cmVhbV9zb2NrZXRfY2xpZW50IHN0cmVhbV9zb2NrZXRfZW5hYmxlX2NyeXB0byBzdHJlYW1fc29ja2V0X2dldF9uYW1lIHN0cmVhbV9zb2NrZXRfcGFpciBzdHJlYW1fc29ja2V0X3JlY3Zmcm9tIHN0cmVhbV9zb2NrZXRfc2VuZHRvIHN0cmVhbV9zb2NrZXRfc2VydmVyIHN0cmVhbV9zb2NrZXRfc2h1dGRvd24gc3RyZWFtX3N1cHBvcnRzX2xvY2sgc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIgc3RyZWFtX3dyYXBwZXJfcmVzdG9yZSBzdHJlYW1fd3JhcHBlcl91bnJlZ2lzdGVyIHNldF9zb2NrZXRfYmxvY2tpbmcpCisgICAgICAgICAgYlsiU3RyaW5nIl0gPSBTZXQubmV3ICV3KGFkZGNzbGFzaGVzIGFkZGNzbGFzaGVzIGFkZHNsYXNoZXMgYmluMmhleCBjaG9wIGNociBjaHVua19zcGxpdCBjb252ZXJ0X2N5cl9zdHJpbmcgY29udmVydF91dWRlY29kZSBjb252ZXJ0X3V1ZW5jb2RlIGNvdW50X2NoYXJzIGNyYzMyIGNyeXB0IGVjaG8gZXhwbG9kZSBmcHJpbnRmIGdldF9odG1sX3RyYW5zbGF0aW9uX3RhYmxlIGhlYnJldiBoZWJyZXZjIGhleDJiaW4gaHRtbF9lbnRpdHlfZGVjb2RlIGh0bWxlbnRpdGllcyBodG1sc3BlY2lhbGNoYXJzX2RlY29kZSBodG1sc3BlY2lhbGNoYXJzIGltcGxvZGUgam9pbiBsY2ZpcnN0IGxldmVuc2h0ZWluIGxvY2FsZWNvbnYgbHRyaW0gbWQ1X2ZpbGUgbWQ1IG1ldGFwaG9uZSBtb25leV9mb3JtYXQgbmxfbGFuZ2luZm8gbmwyYnIgbnVtYmVyX2Zvcm1hdCBvcmQgcGFyc2Vfc3RyIHByaW50IHByaW50ZiBxdW90ZWRfcHJpbnRhYmxlX2RlY29kZSBxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSBxdW90ZW1ldGEgcnRyaW0gc2V0bG9jYWxlIHNoYTFfZmlsZSBzaGExIHNpbWlsYXJfdGV4dCBzb3VuZGV4IHNwcmludGYgc3NjYW5mIHN0cl9nZXRjc3Ygc3RyX2lyZXBsYWNlIHN0cl9wYWQgc3RyX3JlcGVhdCBzdHJfcmVwbGFjZSBzdHJfcm90MTMgc3RyX3NodWZmbGUgc3RyX3NwbGl0IHN0cl93b3JkX2NvdW50IHN0cmNhc2VjbXAgc3RyY2hyIHN0cmNtcCBzdHJjb2xsIHN0cmNzcG4gc3RyaXBfdGFncyBzdHJpcGNzbGFzaGVzIHN0cmlwb3Mgc3RyaXBzbGFzaGVzIHN0cmlzdHIgc3RybGVuIHN0cm5hdGNhc2VjbXAgc3RybmF0Y21wIHN0cm5jYXNlY21wIHN0cm5jbXAgc3RycGJyayBzdHJwb3Mgc3RycmNociBzdHJyZXYgc3Rycmlwb3Mgc3RycnBvcyBzdHJzcG4gc3Ryc3RyIHN0cnRvayBzdHJ0b2xvd2VyIHN0cnRvdXBwZXIgc3RydHIgc3Vic3RyX2NvbXBhcmUgc3Vic3RyX2NvdW50IHN1YnN0cl9yZXBsYWNlIHN1YnN0ciB0cmltIHVjZmlyc3QgdWN3b3JkcyB2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHdvcmR3cmFwIGFkZGNzbGFzaGVzKQorICAgICAgICAgIGJbIlNWTiJdID0gU2V0Lm5ldyAldyhzdm5fYWRkIHN2bl9hZGQgc3ZuX2F1dGhfZ2V0X3BhcmFtZXRlciBzdm5fYXV0aF9zZXRfcGFyYW1ldGVyIHN2bl9ibGFtZSBzdm5fY2F0IHN2bl9jaGVja291dCBzdm5fY2xlYW51cCBzdm5fY2xpZW50X3ZlcnNpb24gc3ZuX2NvbW1pdCBzdm5fZGVsZXRlIHN2bl9kaWZmIHN2bl9leHBvcnQgc3ZuX2ZzX2Fib3J0X3R4biBzdm5fZnNfYXBwbHlfdGV4dCBzdm5fZnNfYmVnaW5fdHhuMiBzdm5fZnNfY2hhbmdlX25vZGVfcHJvcCBzdm5fZnNfY2hlY2tfcGF0aCBzdm5fZnNfY29udGVudHNfY2hhbmdlZCBzdm5fZnNfY29weSBzdm5fZnNfZGVsZXRlIHN2bl9mc19kaXJfZW50cmllcyBzdm5fZnNfZmlsZV9jb250ZW50cyBzdm5fZnNfZmlsZV9sZW5ndGggc3ZuX2ZzX2lzX2RpciBzdm5fZnNfaXNfZmlsZSBzdm5fZnNfbWFrZV9kaXIgc3ZuX2ZzX21ha2VfZmlsZSBzdm5fZnNfbm9kZV9jcmVhdGVkX3JldiBzdm5fZnNfbm9kZV9wcm9wIHN2bl9mc19wcm9wc19jaGFuZ2VkIHN2bl9mc19yZXZpc2lvbl9wcm9wIHN2bl9mc19yZXZpc2lvbl9yb290IHN2bl9mc190eG5fcm9vdCBzdm5fZnNfeW91bmdlc3RfcmV2IHN2bl9pbXBvcnQgc3ZuX2xvZyBzdm5fbHMgc3ZuX21rZGlyIHN2bl9yZXBvc19jcmVhdGUgc3ZuX3JlcG9zX2ZzX2JlZ2luX3R4bl9mb3JfY29tbWl0IHN2bl9yZXBvc19mc19jb21taXRfdHhuIHN2bl9yZXBvc19mcyBzdm5fcmVwb3NfaG90Y29weSBzdm5fcmVwb3Nfb3BlbiBzdm5fcmVwb3NfcmVjb3ZlciBzdm5fcmV2ZXJ0IHN2bl9zdGF0dXMgc3ZuX3VwZGF0ZSBzdm5fYWRkKQorICAgICAgICAgIGJbIlNXRiJdID0gU2V0Lm5ldyAldyhzd2ZfYWN0aW9uZ2V0dXJsIHN3Zl9hY3Rpb25nZXR1cmwgc3dmX2FjdGlvbmdvdG9mcmFtZSBzd2ZfYWN0aW9uZ290b2xhYmVsIHN3Zl9hY3Rpb25uZXh0ZnJhbWUgc3dmX2FjdGlvbnBsYXkgc3dmX2FjdGlvbnByZXZmcmFtZSBzd2ZfYWN0aW9uc2V0dGFyZ2V0IHN3Zl9hY3Rpb25zdG9wIHN3Zl9hY3Rpb250b2dnbGVxdWFsaXR5IHN3Zl9hY3Rpb253YWl0Zm9yZnJhbWUgc3dmX2FkZGJ1dHRvbnJlY29yZCBzd2ZfYWRkY29sb3Igc3dmX2Nsb3NlZmlsZSBzd2ZfZGVmaW5lYml0bWFwIHN3Zl9kZWZpbmVmb250IHN3Zl9kZWZpbmVsaW5lIHN3Zl9kZWZpbmVwb2x5IHN3Zl9kZWZpbmVyZWN0IHN3Zl9kZWZpbmV0ZXh0IHN3Zl9lbmRidXR0b24gc3dmX2VuZGRvYWN0aW9uIHN3Zl9lbmRzaGFwZSBzd2ZfZW5kc3ltYm9sIHN3Zl9mb250c2l6ZSBzd2ZfZm9udHNsYW50IHN3Zl9mb250dHJhY2tpbmcgc3dmX2dldGJpdG1hcGluZm8gc3dmX2dldGZvbnRpbmZvIHN3Zl9nZXRmcmFtZSBzd2ZfbGFiZWxmcmFtZSBzd2ZfbG9va2F0IHN3Zl9tb2RpZnlvYmplY3Qgc3dmX211bGNvbG9yIHN3Zl9uZXh0aWQgc3dmX29uY29uZGl0aW9uIHN3Zl9vcGVuZmlsZSBzd2Zfb3J0aG8yIHN3Zl9vcnRobyBzd2ZfcGVyc3BlY3RpdmUgc3dmX3BsYWNlb2JqZWN0IHN3Zl9wb2xhcnZpZXcgc3dmX3BvcG1hdHJpeCBzd2ZfcG9zcm91bmQgc3dmX3B1c2htYXRyaXggc3dmX3JlbW92ZW9iamVjdCBzd2Zfcm90YXRlIHN3Zl9zY2FsZSBzd2Zfc2V0Zm9udCBzd2Zfc2V0ZnJhbWUgc3dmX3NoYXBlYXJjIHN3Zl9zaGFwZWN1cnZldG8zIHN3Zl9zaGFwZWN1cnZldG8gc3dmX3NoYXBlZmlsbGJpdG1hcGNsaXAgc3dmX3NoYXBlZmlsbGJpdG1hcHRpbGUgc3dmX3NoYXBlZmlsbG9mZiBzd2Zfc2hhcGVmaWxsc29saWQgc3dmX3NoYXBlbGluZXNvbGlkIHN3Zl9zaGFwZWxpbmV0byBzd2Zfc2hhcGVtb3ZldG8gc3dmX3Nob3dmcmFtZSBzd2Zfc3RhcnRidXR0b24gc3dmX3N0YXJ0ZG9hY3Rpb24gc3dmX3N0YXJ0c2hhcGUgc3dmX3N0YXJ0c3ltYm9sIHN3Zl90ZXh0d2lkdGggc3dmX3RyYW5zbGF0ZSBzd2Zfdmlld3BvcnQgc3dmX2FjdGlvbmdldHVybCkKKyAgICAgICAgICBiWyJTd2lzaCJdID0gU2V0Lm5ldyAldygpCisgICAgICAgICAgYlsiU3liYXNlIl0gPSBTZXQubmV3ICV3KHN5YmFzZV9hZmZlY3RlZF9yb3dzIHN5YmFzZV9hZmZlY3RlZF9yb3dzIHN5YmFzZV9jbG9zZSBzeWJhc2VfY29ubmVjdCBzeWJhc2VfZGF0YV9zZWVrIHN5YmFzZV9kZWFkbG9ja19yZXRyeV9jb3VudCBzeWJhc2VfZmV0Y2hfYXJyYXkgc3liYXNlX2ZldGNoX2Fzc29jIHN5YmFzZV9mZXRjaF9maWVsZCBzeWJhc2VfZmV0Y2hfb2JqZWN0IHN5YmFzZV9mZXRjaF9yb3cgc3liYXNlX2ZpZWxkX3NlZWsgc3liYXNlX2ZyZWVfcmVzdWx0IHN5YmFzZV9nZXRfbGFzdF9tZXNzYWdlIHN5YmFzZV9taW5fY2xpZW50X3NldmVyaXR5IHN5YmFzZV9taW5fZXJyb3Jfc2V2ZXJpdHkgc3liYXNlX21pbl9tZXNzYWdlX3NldmVyaXR5IHN5YmFzZV9taW5fc2VydmVyX3NldmVyaXR5IHN5YmFzZV9udW1fZmllbGRzIHN5YmFzZV9udW1fcm93cyBzeWJhc2VfcGNvbm5lY3Qgc3liYXNlX3F1ZXJ5IHN5YmFzZV9yZXN1bHQgc3liYXNlX3NlbGVjdF9kYiBzeWJhc2Vfc2V0X21lc3NhZ2VfaGFuZGxlciBzeWJhc2VfdW5idWZmZXJlZF9xdWVyeSBzeWJhc2VfYWZmZWN0ZWRfcm93cykKKyAgICAgICAgICBiWyJUYWludCJdID0gU2V0Lm5ldyAldyhpc190YWludGVkIGlzX3RhaW50ZWQgdGFpbnQgdW50YWludCBpc190YWludGVkKQorICAgICAgICAgIGJbIlRDUCJdID0gU2V0Lm5ldyAldyh0Y3B3cmFwX2NoZWNrIHRjcHdyYXBfY2hlY2sgdGNwd3JhcF9jaGVjaykKKyAgICAgICAgICBiWyJUaWR5Il0gPSBTZXQubmV3ICV3KG9iX3RpZHloYW5kbGVyIG9iX3RpZHloYW5kbGVyIHRpZHlfYWNjZXNzX2NvdW50IHRpZHlfY29uZmlnX2NvdW50IHRpZHlfZXJyb3JfY291bnQgdGlkeV9nZXRfb3V0cHV0IHRpZHlfbG9hZF9jb25maWcgdGlkeV9yZXNldF9jb25maWcgdGlkeV9zYXZlX2NvbmZpZyB0aWR5X3NldF9lbmNvZGluZyB0aWR5X3NldG9wdCB0aWR5X3dhcm5pbmdfY291bnQgb2JfdGlkeWhhbmRsZXIpCisgICAgICAgICAgYlsiVG9rZW5pemVyIl0gPSBTZXQubmV3ICV3KHRva2VuX2dldF9hbGwgdG9rZW5fZ2V0X2FsbCB0b2tlbl9uYW1lIHRva2VuX2dldF9hbGwpCisgICAgICAgICAgYlsiVHJhZGVyIl0gPSBTZXQubmV3ICV3KHRyYWRlcl9hY29zIHRyYWRlcl9hY29zIHRyYWRlcl9hZCB0cmFkZXJfYWRkIHRyYWRlcl9hZG9zYyB0cmFkZXJfYWR4IHRyYWRlcl9hZHhyIHRyYWRlcl9hcG8gdHJhZGVyX2Fyb29uIHRyYWRlcl9hcm9vbm9zYyB0cmFkZXJfYXNpbiB0cmFkZXJfYXRhbiB0cmFkZXJfYXRyIHRyYWRlcl9hdmdwcmljZSB0cmFkZXJfYmJhbmRzIHRyYWRlcl9iZXRhIHRyYWRlcl9ib3AgdHJhZGVyX2NjaSB0cmFkZXJfY2RsMmNyb3dzIHRyYWRlcl9jZGwzYmxhY2tjcm93cyB0cmFkZXJfY2RsM2luc2lkZSB0cmFkZXJfY2RsM2xpbmVzdHJpa2UgdHJhZGVyX2NkbDNvdXRzaWRlIHRyYWRlcl9jZGwzc3RhcnNpbnNvdXRoIHRyYWRlcl9jZGwzd2hpdGVzb2xkaWVycyB0cmFkZXJfY2RsYWJhbmRvbmVkYmFieSB0cmFkZXJfY2RsYWR2YW5jZWJsb2NrIHRyYWRlcl9jZGxiZWx0aG9sZCB0cmFkZXJfY2RsYnJlYWthd2F5IHRyYWRlcl9jZGxjbG9zaW5nbWFydWJvenUgdHJhZGVyX2NkbGNvbmNlYWxiYWJ5c3dhbGwgdHJhZGVyX2NkbGNvdW50ZXJhdHRhY2sgdHJhZGVyX2NkbGRhcmtjbG91ZGNvdmVyIHRyYWRlcl9jZGxkb2ppIHRyYWRlcl9jZGxkb2ppc3RhciB0cmFkZXJfY2RsZHJhZ29uZmx5ZG9qaSB0cmFkZXJfY2RsZW5ndWxmaW5nIHRyYWRlcl9jZGxldmVuaW5nZG9qaXN0YXIgdHJhZGVyX2NkbGV2ZW5pbmdzdGFyIHRyYWRlcl9jZGxnYXBzaWRlc2lkZXdoaXRlIHRyYWRlcl9jZGxncmF2ZXN0b25lZG9qaSB0cmFkZXJfY2RsaGFtbWVyIHRyYWRlcl9jZGxoYW5naW5nbWFuIHRyYWRlcl9jZGxoYXJhbWkgdHJhZGVyX2NkbGhhcmFtaWNyb3NzIHRyYWRlcl9jZGxoaWdod2F2ZSB0cmFkZXJfY2RsaGlra2FrZSB0cmFkZXJfY2RsaGlra2FrZW1vZCB0cmFkZXJfY2RsaG9taW5ncGlnZW9uIHRyYWRlcl9jZGxpZGVudGljYWwzY3Jvd3MgdHJhZGVyX2NkbGlubmVjayB0cmFkZXJfY2RsaW52ZXJ0ZWRoYW1tZXIgdHJhZGVyX2NkbGtpY2tpbmcgdHJhZGVyX2NkbGtpY2tpbmdieWxlbmd0aCB0cmFkZXJfY2RsbGFkZGVyYm90dG9tIHRyYWRlcl9jZGxsb25nbGVnZ2VkZG9qaSB0cmFkZXJfY2RsbG9uZ2xpbmUgdHJhZGVyX2NkbG1hcnVib3p1IHRyYWRlcl9jZGxtYXRjaGluZ2xvdyB0cmFkZXJfY2RsbWF0aG9sZCB0cmFkZXJfY2RsbW9ybmluZ2RvamlzdGFyIHRyYWRlcl9jZGxtb3JuaW5nc3RhciB0cmFkZXJfY2Rsb25uZWNrIHRyYWRlcl9jZGxwaWVyY2luZyB0cmFkZXJfY2Rscmlja3NoYXdtYW4gdHJhZGVyX2NkbHJpc2VmYWxsM21ldGhvZHMgdHJhZGVyX2NkbHNlcGFyYXRpbmdsaW5lcyB0cmFkZXJfY2Rsc2hvb3RpbmdzdGFyIHRyYWRlcl9jZGxzaG9ydGxpbmUgdHJhZGVyX2NkbHNwaW5uaW5ndG9wIHRyYWRlcl9jZGxzdGFsbGVkcGF0dGVybiB0cmFkZXJfY2Rsc3RpY2tzYW5kd2ljaCB0cmFkZXJfY2RsdGFrdXJpIHRyYWRlcl9jZGx0YXN1a2lnYXAgdHJhZGVyX2NkbHRocnVzdGluZyB0cmFkZXJfY2RsdHJpc3RhciB0cmFkZXJfY2RsdW5pcXVlM3JpdmVyIHRyYWRlcl9jZGx1cHNpZGVnYXAyY3Jvd3MgdHJhZGVyX2NkbHhzaWRlZ2FwM21ldGhvZHMgdHJhZGVyX2NlaWwgdHJhZGVyX2NtbyB0cmFkZXJfY29ycmVsIHRyYWRlcl9jb3MgdHJhZGVyX2Nvc2ggdHJhZGVyX2RlbWEgdHJhZGVyX2RpdiB0cmFkZXJfZHggdHJhZGVyX2VtYSB0cmFkZXJfZXJybm8gdHJhZGVyX2V4cCB0cmFkZXJfZmxvb3IgdHJhZGVyX2dldF9jb21wYXQgdHJhZGVyX2dldF91bnN0YWJsZV9wZXJpb2QgdHJhZGVyX2h0X2RjcGVyaW9kIHRyYWRlcl9odF9kY3BoYXNlIHRyYWRlcl9odF9waGFzb3IgdHJhZGVyX2h0X3NpbmUgdHJhZGVyX2h0X3RyZW5kbGluZSB0cmFkZXJfaHRfdHJlbmRtb2RlIHRyYWRlcl9rYW1hIHRyYWRlcl9saW5lYXJyZWdfYW5nbGUgdHJhZGVyX2xpbmVhcnJlZ19pbnRlcmNlcHQgdHJhZGVyX2xpbmVhcnJlZ19zbG9wZSB0cmFkZXJfbGluZWFycmVnIHRyYWRlcl9sbiB0cmFkZXJfbG9nMTAgdHJhZGVyX21hIHRyYWRlcl9tYWNkIHRyYWRlcl9tYWNkZXh0IHRyYWRlcl9tYWNkZml4IHRyYWRlcl9tYW1hIHRyYWRlcl9tYXZwIHRyYWRlcl9tYXggdHJhZGVyX21heGluZGV4IHRyYWRlcl9tZWRwcmljZSB0cmFkZXJfbWZpIHRyYWRlcl9taWRwb2ludCB0cmFkZXJfbWlkcHJpY2UgdHJhZGVyX21pbiB0cmFkZXJfbWluaW5kZXggdHJhZGVyX21pbm1heCB0cmFkZXJfbWlubWF4aW5kZXggdHJhZGVyX21pbnVzX2RpIHRyYWRlcl9taW51c19kbSB0cmFkZXJfbW9tIHRyYWRlcl9tdWx0IHRyYWRlcl9uYXRyIHRyYWRlcl9vYnYgdHJhZGVyX3BsdXNfZGkgdHJhZGVyX3BsdXNfZG0gdHJhZGVyX3BwbyB0cmFkZXJfcm9jIHRyYWRlcl9yb2NwIHRyYWRlcl9yb2NyMTAwIHRyYWRlcl9yb2NyIHRyYWRlcl9yc2kgdHJhZGVyX3NhciB0cmFkZXJfc2FyZXh0IHRyYWRlcl9zZXRfY29tcGF0IHRyYWRlcl9zZXRfdW5zdGFibGVfcGVyaW9kIHRyYWRlcl9zaW4gdHJhZGVyX3NpbmggdHJhZGVyX3NtYSB0cmFkZXJfc3FydCB0cmFkZXJfc3RkZGV2IHRyYWRlcl9zdG9jaCB0cmFkZXJfc3RvY2hmIHRyYWRlcl9zdG9jaHJzaSB0cmFkZXJfc3ViIHRyYWRlcl9zdW0gdHJhZGVyX3QzIHRyYWRlcl90YW4gdHJhZGVyX3RhbmggdHJhZGVyX3RlbWEgdHJhZGVyX3RyYW5nZSB0cmFkZXJfdHJpbWEgdHJhZGVyX3RyaXggdHJhZGVyX3RzZiB0cmFkZXJfdHlwcHJpY2UgdHJhZGVyX3VsdG9zYyB0cmFkZXJfdmFyIHRyYWRlcl93Y2xwcmljZSB0cmFkZXJfd2lsbHIgdHJhZGVyX3dtYSB0cmFkZXJfYWNvcykKKyAgICAgICAgICBiWyJPREJDIl0gPSBTZXQubmV3ICV3KG9kYmNfYXV0b2NvbW1pdCBvZGJjX2F1dG9jb21taXQgb2RiY19iaW5tb2RlIG9kYmNfY2xvc2VfYWxsIG9kYmNfY2xvc2Ugb2RiY19jb2x1bW5wcml2aWxlZ2VzIG9kYmNfY29sdW1ucyBvZGJjX2NvbW1pdCBvZGJjX2Nvbm5lY3Qgb2RiY19jdXJzb3Igb2RiY19kYXRhX3NvdXJjZSBvZGJjX2RvIG9kYmNfZXJyb3Igb2RiY19lcnJvcm1zZyBvZGJjX2V4ZWMgb2RiY19leGVjdXRlIG9kYmNfZmV0Y2hfYXJyYXkgb2RiY19mZXRjaF9pbnRvIG9kYmNfZmV0Y2hfb2JqZWN0IG9kYmNfZmV0Y2hfcm93IG9kYmNfZmllbGRfbGVuIG9kYmNfZmllbGRfbmFtZSBvZGJjX2ZpZWxkX251bSBvZGJjX2ZpZWxkX3ByZWNpc2lvbiBvZGJjX2ZpZWxkX3NjYWxlIG9kYmNfZmllbGRfdHlwZSBvZGJjX2ZvcmVpZ25rZXlzIG9kYmNfZnJlZV9yZXN1bHQgb2RiY19nZXR0eXBlaW5mbyBvZGJjX2xvbmdyZWFkbGVuIG9kYmNfbmV4dF9yZXN1bHQgb2RiY19udW1fZmllbGRzIG9kYmNfbnVtX3Jvd3Mgb2RiY19wY29ubmVjdCBvZGJjX3ByZXBhcmUgb2RiY19wcmltYXJ5a2V5cyBvZGJjX3Byb2NlZHVyZWNvbHVtbnMgb2RiY19wcm9jZWR1cmVzIG9kYmNfcmVzdWx0X2FsbCBvZGJjX3Jlc3VsdCBvZGJjX3JvbGxiYWNrIG9kYmNfc2V0b3B0aW9uIG9kYmNfc3BlY2lhbGNvbHVtbnMgb2RiY19zdGF0aXN0aWNzIG9kYmNfdGFibGVwcml2aWxlZ2VzIG9kYmNfdGFibGVzIG9kYmNfYXV0b2NvbW1pdCkKKyAgICAgICAgICBiWyJVb3B6Il0gPSBTZXQubmV3ICV3KHVvcHpfYmFja3VwIHVvcHpfYmFja3VwIHVvcHpfY29tcG9zZSB1b3B6X2NvcHkgdW9wel9kZWxldGUgdW9wel9leHRlbmQgdW9wel9mbGFncyB1b3B6X2Z1bmN0aW9uIHVvcHpfaW1wbGVtZW50IHVvcHpfb3ZlcmxvYWQgdW9wel9yZWRlZmluZSB1b3B6X3JlbmFtZSB1b3B6X3Jlc3RvcmUgdW9wel91bmRlZmluZSB1b3B6X2JhY2t1cCkKKyAgICAgICAgICBiWyJVUkwiXSA9IFNldC5uZXcgJXcoYmFzZTY0X2RlY29kZSBiYXNlNjRfZGVjb2RlIGJhc2U2NF9lbmNvZGUgZ2V0X2hlYWRlcnMgZ2V0X21ldGFfdGFncyBodHRwX2J1aWxkX3F1ZXJ5IHBhcnNlX3VybCByYXd1cmxkZWNvZGUgcmF3dXJsZW5jb2RlIHVybGRlY29kZSB1cmxlbmNvZGUgYmFzZTY0X2RlY29kZSkKKyAgICAgICAgICBiWyJWYXJpYWJsZSBoYW5kbGluZyJdID0gU2V0Lm5ldyAldyhib29sdmFsIGJvb2x2YWwgZGVidWdfenZhbF9kdW1wIGRvdWJsZXZhbCBlbXB0eSBmbG9hdHZhbCBnZXRfZGVmaW5lZF92YXJzIGdldF9yZXNvdXJjZV90eXBlIGdldHR5cGUgaW1wb3J0X3JlcXVlc3RfdmFyaWFibGVzIGludHZhbCBpc19hcnJheSBpc19ib29sIGlzX2NhbGxhYmxlIGlzX2RvdWJsZSBpc19mbG9hdCBpc19pbnQgaXNfaW50ZWdlciBpc19sb25nIGlzX251bGwgaXNfbnVtZXJpYyBpc19vYmplY3QgaXNfcmVhbCBpc19yZXNvdXJjZSBpc19zY2FsYXIgaXNfc3RyaW5nIGlzc2V0IHByaW50X3Igc2VyaWFsaXplIHNldHR5cGUgc3RydmFsIHVuc2VyaWFsaXplIHVuc2V0IHZhcl9kdW1wIHZhcl9leHBvcnQgYm9vbHZhbCkKKyAgICAgICAgICBiWyJ2cG9wbWFpbCJdID0gU2V0Lm5ldyAldyh2cG9wbWFpbF9hZGRfYWxpYXNfZG9tYWluX2V4IHZwb3BtYWlsX2FkZF9hbGlhc19kb21haW5fZXggdnBvcG1haWxfYWRkX2FsaWFzX2RvbWFpbiB2cG9wbWFpbF9hZGRfZG9tYWluX2V4IHZwb3BtYWlsX2FkZF9kb21haW4gdnBvcG1haWxfYWRkX3VzZXIgdnBvcG1haWxfYWxpYXNfYWRkIHZwb3BtYWlsX2FsaWFzX2RlbF9kb21haW4gdnBvcG1haWxfYWxpYXNfZGVsIHZwb3BtYWlsX2FsaWFzX2dldF9hbGwgdnBvcG1haWxfYWxpYXNfZ2V0IHZwb3BtYWlsX2F1dGhfdXNlciB2cG9wbWFpbF9kZWxfZG9tYWluX2V4IHZwb3BtYWlsX2RlbF9kb21haW4gdnBvcG1haWxfZGVsX3VzZXIgdnBvcG1haWxfZXJyb3IgdnBvcG1haWxfcGFzc3dkIHZwb3BtYWlsX3NldF91c2VyX3F1b3RhIHZwb3BtYWlsX2FkZF9hbGlhc19kb21haW5fZXgpCisgICAgICAgICAgYlsiVzMyYXBpIl0gPSBTZXQubmV3ICV3KHczMmFwaV9kZWZ0eXBlIHczMmFwaV9kZWZ0eXBlIHczMmFwaV9pbml0X2R0eXBlIHczMmFwaV9pbnZva2VfZnVuY3Rpb24gdzMyYXBpX3JlZ2lzdGVyX2Z1bmN0aW9uIHczMmFwaV9zZXRfY2FsbF9tZXRob2QgdzMyYXBpX2RlZnR5cGUpCisgICAgICAgICAgYlsiV0REWCJdID0gU2V0Lm5ldyAldyh3ZGR4X2FkZF92YXJzIHdkZHhfYWRkX3ZhcnMgd2RkeF9kZXNlcmlhbGl6ZSB3ZGR4X3BhY2tldF9lbmQgd2RkeF9wYWNrZXRfc3RhcnQgd2RkeF9zZXJpYWxpemVfdmFsdWUgd2RkeF9zZXJpYWxpemVfdmFycyB3ZGR4X2FkZF92YXJzKQorICAgICAgICAgIGJbIndpbjMycHMiXSA9IFNldC5uZXcgJXcod2luMzJfcHNfbGlzdF9wcm9jcyB3aW4zMl9wc19saXN0X3Byb2NzIHdpbjMyX3BzX3N0YXRfbWVtIHdpbjMyX3BzX3N0YXRfcHJvYyB3aW4zMl9wc19saXN0X3Byb2NzKQorICAgICAgICAgIGJbIndpbjMyc2VydmljZSJdID0gU2V0Lm5ldyAldyh3aW4zMl9jb250aW51ZV9zZXJ2aWNlIHdpbjMyX2NvbnRpbnVlX3NlcnZpY2Ugd2luMzJfY3JlYXRlX3NlcnZpY2Ugd2luMzJfZGVsZXRlX3NlcnZpY2Ugd2luMzJfZ2V0X2xhc3RfY29udHJvbF9tZXNzYWdlIHdpbjMyX3BhdXNlX3NlcnZpY2Ugd2luMzJfcXVlcnlfc2VydmljZV9zdGF0dXMgd2luMzJfc2V0X3NlcnZpY2Vfc3RhdHVzIHdpbjMyX3N0YXJ0X3NlcnZpY2VfY3RybF9kaXNwYXRjaGVyIHdpbjMyX3N0YXJ0X3NlcnZpY2Ugd2luMzJfc3RvcF9zZXJ2aWNlIHdpbjMyX2NvbnRpbnVlX3NlcnZpY2UpCisgICAgICAgICAgYlsiV2luQ2FjaGUiXSA9IFNldC5uZXcgJXcod2luY2FjaGVfZmNhY2hlX2ZpbGVpbmZvIHdpbmNhY2hlX2ZjYWNoZV9maWxlaW5mbyB3aW5jYWNoZV9mY2FjaGVfbWVtaW5mbyB3aW5jYWNoZV9sb2NrIHdpbmNhY2hlX29jYWNoZV9maWxlaW5mbyB3aW5jYWNoZV9vY2FjaGVfbWVtaW5mbyB3aW5jYWNoZV9yZWZyZXNoX2lmX2NoYW5nZWQgd2luY2FjaGVfcnBsaXN0X2ZpbGVpbmZvIHdpbmNhY2hlX3JwbGlzdF9tZW1pbmZvIHdpbmNhY2hlX3NjYWNoZV9pbmZvIHdpbmNhY2hlX3NjYWNoZV9tZW1pbmZvIHdpbmNhY2hlX3VjYWNoZV9hZGQgd2luY2FjaGVfdWNhY2hlX2NhcyB3aW5jYWNoZV91Y2FjaGVfY2xlYXIgd2luY2FjaGVfdWNhY2hlX2RlYyB3aW5jYWNoZV91Y2FjaGVfZGVsZXRlIHdpbmNhY2hlX3VjYWNoZV9leGlzdHMgd2luY2FjaGVfdWNhY2hlX2dldCB3aW5jYWNoZV91Y2FjaGVfaW5jIHdpbmNhY2hlX3VjYWNoZV9pbmZvIHdpbmNhY2hlX3VjYWNoZV9tZW1pbmZvIHdpbmNhY2hlX3VjYWNoZV9zZXQgd2luY2FjaGVfdW5sb2NrIHdpbmNhY2hlX2ZjYWNoZV9maWxlaW5mbykKKyAgICAgICAgICBiWyJ4YXR0ciJdID0gU2V0Lm5ldyAldyh4YXR0cl9nZXQgeGF0dHJfZ2V0IHhhdHRyX2xpc3QgeGF0dHJfcmVtb3ZlIHhhdHRyX3NldCB4YXR0cl9zdXBwb3J0ZWQgeGF0dHJfZ2V0KQorICAgICAgICAgIGJbInhkaWZmIl0gPSBTZXQubmV3ICV3KHhkaWZmX2ZpbGVfYmRpZmZfc2l6ZSB4ZGlmZl9maWxlX2JkaWZmX3NpemUgeGRpZmZfZmlsZV9iZGlmZiB4ZGlmZl9maWxlX2JwYXRjaCB4ZGlmZl9maWxlX2RpZmZfYmluYXJ5IHhkaWZmX2ZpbGVfZGlmZiB4ZGlmZl9maWxlX21lcmdlMyB4ZGlmZl9maWxlX3BhdGNoX2JpbmFyeSB4ZGlmZl9maWxlX3BhdGNoIHhkaWZmX2ZpbGVfcmFiZGlmZiB4ZGlmZl9zdHJpbmdfYmRpZmZfc2l6ZSB4ZGlmZl9zdHJpbmdfYmRpZmYgeGRpZmZfc3RyaW5nX2JwYXRjaCB4ZGlmZl9zdHJpbmdfZGlmZl9iaW5hcnkgeGRpZmZfc3RyaW5nX2RpZmYgeGRpZmZfc3RyaW5nX21lcmdlMyB4ZGlmZl9zdHJpbmdfcGF0Y2hfYmluYXJ5IHhkaWZmX3N0cmluZ19wYXRjaCB4ZGlmZl9zdHJpbmdfcmFiZGlmZiB4ZGlmZl9maWxlX2JkaWZmX3NpemUpCisgICAgICAgICAgYlsiWGhwcm9mIl0gPSBTZXQubmV3ICV3KHhocHJvZl9kaXNhYmxlIHhocHJvZl9kaXNhYmxlIHhocHJvZl9lbmFibGUgeGhwcm9mX3NhbXBsZV9kaXNhYmxlIHhocHJvZl9zYW1wbGVfZW5hYmxlIHhocHJvZl9kaXNhYmxlKQorICAgICAgICAgIGJbIlhNTCBQYXJzZXIiXSA9IFNldC5uZXcgJXcodXRmOF9kZWNvZGUgdXRmOF9kZWNvZGUgdXRmOF9lbmNvZGUgeG1sX2Vycm9yX3N0cmluZyB4bWxfZ2V0X2N1cnJlbnRfYnl0ZV9pbmRleCB4bWxfZ2V0X2N1cnJlbnRfY29sdW1uX251bWJlciB4bWxfZ2V0X2N1cnJlbnRfbGluZV9udW1iZXIgeG1sX2dldF9lcnJvcl9jb2RlIHhtbF9wYXJzZV9pbnRvX3N0cnVjdCB4bWxfcGFyc2UgeG1sX3BhcnNlcl9jcmVhdGVfbnMgeG1sX3BhcnNlcl9jcmVhdGUgeG1sX3BhcnNlcl9mcmVlIHhtbF9wYXJzZXJfZ2V0X29wdGlvbiB4bWxfcGFyc2VyX3NldF9vcHRpb24geG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyIHhtbF9zZXRfZGVmYXVsdF9oYW5kbGVyIHhtbF9zZXRfZWxlbWVudF9oYW5kbGVyIHhtbF9zZXRfZW5kX25hbWVzcGFjZV9kZWNsX2hhbmRsZXIgeG1sX3NldF9leHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXIgeG1sX3NldF9ub3RhdGlvbl9kZWNsX2hhbmRsZXIgeG1sX3NldF9vYmplY3QgeG1sX3NldF9wcm9jZXNzaW5nX2luc3RydWN0aW9uX2hhbmRsZXIgeG1sX3NldF9zdGFydF9uYW1lc3BhY2VfZGVjbF9oYW5kbGVyIHhtbF9zZXRfdW5wYXJzZWRfZW50aXR5X2RlY2xfaGFuZGxlciB1dGY4X2RlY29kZSkKKyAgICAgICAgICBiWyJYTUwtUlBDIl0gPSBTZXQubmV3ICV3KHhtbHJwY19kZWNvZGVfcmVxdWVzdCB4bWxycGNfZGVjb2RlX3JlcXVlc3QgeG1scnBjX2RlY29kZSB4bWxycGNfZW5jb2RlX3JlcXVlc3QgeG1scnBjX2VuY29kZSB4bWxycGNfZ2V0X3R5cGUgeG1scnBjX2lzX2ZhdWx0IHhtbHJwY19wYXJzZV9tZXRob2RfZGVzY3JpcHRpb25zIHhtbHJwY19zZXJ2ZXJfYWRkX2ludHJvc3BlY3Rpb25fZGF0YSB4bWxycGNfc2VydmVyX2NhbGxfbWV0aG9kIHhtbHJwY19zZXJ2ZXJfY3JlYXRlIHhtbHJwY19zZXJ2ZXJfZGVzdHJveSB4bWxycGNfc2VydmVyX3JlZ2lzdGVyX2ludHJvc3BlY3Rpb25fY2FsbGJhY2sgeG1scnBjX3NlcnZlcl9yZWdpc3Rlcl9tZXRob2QgeG1scnBjX3NldF90eXBlIHhtbHJwY19kZWNvZGVfcmVxdWVzdCkKKyAgICAgICAgICBiWyJYTUxXcml0ZXIiXSA9IFNldC5uZXcgJXcoWE1MV3JpdGVyOjplbmRBdHRyaWJ1dGUgWE1MV3JpdGVyOjplbmRBdHRyaWJ1dGUgWE1MV3JpdGVyOjplbmRDRGF0YSBYTUxXcml0ZXI6OmVuZENvbW1lbnQgWE1MV3JpdGVyOjplbmREb2N1bWVudCBYTUxXcml0ZXI6OmVuZERUREF0dGxpc3QgWE1MV3JpdGVyOjplbmREVERFbGVtZW50IFhNTFdyaXRlcjo6ZW5kRFRERW50aXR5IFhNTFdyaXRlcjo6ZW5kRFREIFhNTFdyaXRlcjo6ZW5kRWxlbWVudCBYTUxXcml0ZXI6OmVuZFBJIFhNTFdyaXRlcjo6Zmx1c2ggWE1MV3JpdGVyOjpmdWxsRW5kRWxlbWVudCBYTUxXcml0ZXI6Om9wZW5NZW1vcnkgWE1MV3JpdGVyOjpvcGVuVVJJIFhNTFdyaXRlcjo6b3V0cHV0TWVtb3J5IFhNTFdyaXRlcjo6c2V0SW5kZW50U3RyaW5nIFhNTFdyaXRlcjo6c2V0SW5kZW50IFhNTFdyaXRlcjo6c3RhcnRBdHRyaWJ1dGVOUyBYTUxXcml0ZXI6OnN0YXJ0QXR0cmlidXRlIFhNTFdyaXRlcjo6c3RhcnRDRGF0YSBYTUxXcml0ZXI6OnN0YXJ0Q29tbWVudCBYTUxXcml0ZXI6OnN0YXJ0RG9jdW1lbnQgWE1MV3JpdGVyOjpzdGFydERUREF0dGxpc3QgWE1MV3JpdGVyOjpzdGFydERUREVsZW1lbnQgWE1MV3JpdGVyOjpzdGFydERUREVudGl0eSBYTUxXcml0ZXI6OnN0YXJ0RFREIFhNTFdyaXRlcjo6c3RhcnRFbGVtZW50TlMgWE1MV3JpdGVyOjpzdGFydEVsZW1lbnQgWE1MV3JpdGVyOjpzdGFydFBJIFhNTFdyaXRlcjo6dGV4dCBYTUxXcml0ZXI6OndyaXRlQXR0cmlidXRlTlMgWE1MV3JpdGVyOjp3cml0ZUF0dHJpYnV0ZSBYTUxXcml0ZXI6OndyaXRlQ0RhdGEgWE1MV3JpdGVyOjp3cml0ZUNvbW1lbnQgWE1MV3JpdGVyOjp3cml0ZURUREF0dGxpc3QgWE1MV3JpdGVyOjp3cml0ZURUREVsZW1lbnQgWE1MV3JpdGVyOjp3cml0ZURUREVudGl0eSBYTUxXcml0ZXI6OndyaXRlRFREIFhNTFdyaXRlcjo6d3JpdGVFbGVtZW50TlMgWE1MV3JpdGVyOjp3cml0ZUVsZW1lbnQgWE1MV3JpdGVyOjp3cml0ZVBJIFhNTFdyaXRlcjo6d3JpdGVSYXcgWE1MV3JpdGVyOjplbmRBdHRyaWJ1dGUpCisgICAgICAgICAgYlsiWFNMVCAoUEhQIDQpIl0gPSBTZXQubmV3ICV3KHhzbHRfYmFja2VuZF9pbmZvIHhzbHRfYmFja2VuZF9pbmZvIHhzbHRfYmFja2VuZF9uYW1lIHhzbHRfYmFja2VuZF92ZXJzaW9uIHhzbHRfY3JlYXRlIHhzbHRfZXJybm8geHNsdF9lcnJvciB4c2x0X2ZyZWUgeHNsdF9nZXRvcHQgeHNsdF9wcm9jZXNzIHhzbHRfc2V0X2Jhc2UgeHNsdF9zZXRfZW5jb2RpbmcgeHNsdF9zZXRfZXJyb3JfaGFuZGxlciB4c2x0X3NldF9sb2cgeHNsdF9zZXRfb2JqZWN0IHhzbHRfc2V0X3NheF9oYW5kbGVyIHhzbHRfc2V0X3NheF9oYW5kbGVycyB4c2x0X3NldF9zY2hlbWVfaGFuZGxlciB4c2x0X3NldF9zY2hlbWVfaGFuZGxlcnMgeHNsdF9zZXRvcHQgeHNsdF9iYWNrZW5kX2luZm8pCisgICAgICAgICAgYlsiWWFtbCJdID0gU2V0Lm5ldyAldyh5YW1sX2VtaXRfZmlsZSB5YW1sX2VtaXRfZmlsZSB5YW1sX2VtaXQgeWFtbF9wYXJzZV9maWxlIHlhbWxfcGFyc2VfdXJsIHlhbWxfcGFyc2UgeWFtbF9lbWl0X2ZpbGUpCisgICAgICAgICAgYlsiWUFaIl0gPSBTZXQubmV3ICV3KHlhel9hZGRpbmZvIHlhel9hZGRpbmZvIHlhel9jY2xfY29uZiB5YXpfY2NsX3BhcnNlIHlhel9jbG9zZSB5YXpfY29ubmVjdCB5YXpfZGF0YWJhc2UgeWF6X2VsZW1lbnQgeWF6X2Vycm5vIHlhel9lcnJvciB5YXpfZXNfcmVzdWx0IHlhel9lcyB5YXpfZ2V0X29wdGlvbiB5YXpfaGl0cyB5YXpfaXRlbW9yZGVyIHlhel9wcmVzZW50IHlhel9yYW5nZSB5YXpfcmVjb3JkIHlhel9zY2FuX3Jlc3VsdCB5YXpfc2NhbiB5YXpfc2NoZW1hIHlhel9zZWFyY2ggeWF6X3NldF9vcHRpb24geWF6X3NvcnQgeWF6X3N5bnRheCB5YXpfd2FpdCB5YXpfYWRkaW5mbykKKyAgICAgICAgICBiWyJaaXAiXSA9IFNldC5uZXcgJXcoemlwX2Nsb3NlIHppcF9jbG9zZSB6aXBfZW50cnlfY2xvc2UgemlwX2VudHJ5X2NvbXByZXNzZWRzaXplIHppcF9lbnRyeV9jb21wcmVzc2lvbm1ldGhvZCB6aXBfZW50cnlfZmlsZXNpemUgemlwX2VudHJ5X25hbWUgemlwX2VudHJ5X29wZW4gemlwX2VudHJ5X3JlYWQgemlwX29wZW4gemlwX3JlYWQgemlwX2Nsb3NlKQorICAgICAgICAgIGJbIlpsaWIiXSA9IFNldC5uZXcgJXcoZ3pjbG9zZSBnemNsb3NlIGd6Y29tcHJlc3MgZ3pkZWNvZGUgZ3pkZWZsYXRlIGd6ZW5jb2RlIGd6ZW9mIGd6ZmlsZSBnemdldGMgZ3pnZXRzIGd6Z2V0c3MgZ3ppbmZsYXRlIGd6b3BlbiBnenBhc3N0aHJ1IGd6cHV0cyBnenJlYWQgZ3pyZXdpbmQgZ3pzZWVrIGd6dGVsbCBnenVuY29tcHJlc3MgZ3p3cml0ZSByZWFkZ3pmaWxlIHpsaWJfZGVjb2RlIHpsaWJfZW5jb2RlIHpsaWJfZ2V0X2NvZGluZ190eXBlIGd6Y2xvc2UpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9wbGFpbl90ZXh0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcGxhaW5fdGV4dC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2YyNTdjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcGxhaW5fdGV4dC5yYgpAQCAtMCwwICsxLDI1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgUGxhaW5UZXh0IDwgTGV4ZXIKKyAgICAgIHRpdGxlICJQbGFpbiBUZXh0IgorICAgICAgZGVzYyAiQSBib3JpbmcgbGV4ZXIgdGhhdCBkb2Vzbid0IGhpZ2hsaWdodCBhbnl0aGluZyIKKworICAgICAgdGFnICdwbGFpbnRleHQnCisgICAgICBhbGlhc2VzICd0ZXh0JworICAgICAgZmlsZW5hbWVzICcqLnR4dCcKKyAgICAgIG1pbWV0eXBlcyAndGV4dC9wbGFpbicKKworICAgICAgZGVmYXVsdF9vcHRpb25zIDp0b2tlbiA9PiAnVGV4dCcKKworICAgICAgZGVmIHRva2VuCisgICAgICAgIEB0b2tlbiB8fD0gVG9rZW5bb3B0aW9uIDp0b2tlbl0KKyAgICAgIGVuZAorCisgICAgICBkZWYgc3RyZWFtX3Rva2VucyhzdHJpbmcsICZiKQorICAgICAgICB5aWVsZCBzZWxmLnRva2VuLCBzdHJpbmcKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcG93ZXJzaGVsbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Bvd2Vyc2hlbGwucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDdiYmM4YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Bvd2Vyc2hlbGwucmIKQEAgLTAsMCArMSw5NiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGxvYWRfbGV4ZXIgJ3NoZWxsLnJiJworCisgICAgY2xhc3MgUG93ZXJzaGVsbCA8IFNoZWxsCisgICAgICB0aXRsZSAncG93ZXJzaGVsbCcKKyAgICAgIGRlc2MgJ3Bvd2Vyc2hlbGwnCisgICAgICB0YWcgJ3Bvd2Vyc2hlbGwnCisgICAgICBhbGlhc2VzICdwb3NoJworICAgICAgZmlsZW5hbWVzICcqLnBzMScsICcqLnBzbTEnLCAnKi5wc2QxJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtcG93ZXJzaGVsbCcKKworICAgICAgQVRUUklCVVRFUyA9ICV3KAorICAgICAgICBDbWRsZXRCaW5kaW5nIENvbmZpcm1JbXBhY3QgRGVmYXVsdFBhcmFtZXRlclNldE5hbWUgSGVscFVSSSBTdXBwb3J0c1BhZ2luZworICAgICAgICBTdXBwb3J0c1Nob3VsZFByb2Nlc3MgUG9zaXRpb25hbEJpbmRpbmcKKyAgICAgICkuam9pbignfCcpCisKKyAgICAgIEtFWVdPUkRTID0gJXcoCisgICAgICAgIEJlZ2luIEV4aXQgUHJvY2VzcyBCcmVhayBGaWx0ZXIgUmV0dXJuIENhdGNoIEZpbmFsbHkgU2VxdWVuY2UgQ2xhc3MgRm9yCisgICAgICAgIFN3aXRjaCBDb250aW51ZSBGb3JFYWNoIFRocm93IERhdGEgRnJvbSBUcmFwIERlZmluZSBGdW5jdGlvbiBUcnkgRG8gSWYKKyAgICAgICAgVW50aWwgRHluYW1pY1BhcmFtIEluIFVzaW5nIEVsc2UgSW5saW5lU2NyaXB0IFZhciBFbHNlSWYgUGFyYWxsZWwgV2hpbGUKKyAgICAgICAgRW5kIFBhcmFtIFdvcmtmbG93CisgICAgICApLmpvaW4oJ3wnKQorCisgICAgICBLRVlXT1JEU19UWVBFID0gJXcoCisgICAgICAgIGJvb2wgYnl0ZSBjaGFyIGRlY2ltYWwgZG91YmxlIGZsb2F0IGludCBsb25nIG9iamVjdCBzYnl0ZQorICAgICAgICBzaG9ydCBzdHJpbmcgdWludCB1bG9uZyB1c2hvcnQKKyAgICAgICkuam9pbignfCcpCisKKyAgICAgIE9QRVJBVE9SUyA9ICV3KAorICAgICAgICAtc3BsaXQgLWlzcGxpdCAtY3NwbGl0IC1qb2luIC1pcyAtaXNub3QgLWFzIC1lcSAtaWVxIC1jZXEgLW5lIC1pbmUKKyAgICAgICAgLWNuZSAtZ3QgLWlndCAtY2d0IC1nZSAtaWdlIC1jZ2UgLWx0IC1pbHQgLWNsdCAtbGUgLWlsZSAtY2xlIC1saWtlCisgICAgICAgIC1pbGlrZSAtY2xpa2UgLW5vdGxpa2UgLWlub3RsaWtlIC1jbm90bGlrZSAtbWF0Y2ggLWltYXRjaCAtY21hdGNoCisgICAgICAgIC1ub3RtYXRjaCAtaW5vdG1hdGNoIC1jbm90bWF0Y2ggLWNvbnRhaW5zIC1pY29udGFpbnMgLWNjb250YWlucworICAgICAgICAtbm90Y29udGFpbnMgLWlub3Rjb250YWlucyAtY25vdGNvbnRhaW5zIC1yZXBsYWNlIC1pcmVwbGFjZQorICAgICAgICAtY3JlcGxhY2UgLWJhbmQgLWJvciAtYnhvciAtYW5kIC1vciAteG9yIFwuICYgPSBcKz0gLT0gXCo9IFwvPSAlPQorICAgICAgKS5qb2luKCd8JykKKworICAgICAgQlVJTFRJTlMgPSAldygKKyAgICAgICAgQWRkLUNvbnRlbnQgQWRkLUhpc3RvcnkgQWRkLU1lbWJlciBBZGQtUFNTbmFwaW4gQ2xlYXItQ29udGVudAorICAgICAgICBDbGVhci1JdGVtIENsZWFyLUl0ZW0gUHJvcGVydHkgQ2xlYXItVmFyaWFibGUgQ29tcGFyZS1PYmplY3QKKyAgICAgICAgQ29udmVydEZyb20tU2VjdXJlU3RyaW5nIENvbnZlcnQtUGF0aCBDb252ZXJ0VG8tSHRtbAorICAgICAgICBDb252ZXJ0VG8tU2VjdXJlU3RyaW5nIENvcHktSXRlbSBDb3B5LUl0ZW1Qcm9wZXJ0eSBFeHBvcnQtQWxpYXMKKyAgICAgICAgRXhwb3J0LUNsaXhtbCBFeHBvcnQtQ29uc29sZSBFeHBvcnQtQ3N2IEZvckVhY2gtT2JqZWN0CisgICAgICAgIEZvcm1hdC1DdXN0b20gRm9ybWF0LUxpc3QgRm9ybWF0LVRhYmxlIEZvcm1hdC1XaWRlCisgICAgICAgIEdldC1BY2wgR2V0LUFsaWFzIEdldC1BdXRoZW50aWNvZGVTaWduYXR1cmUgR2V0LUNoaWxkSXRlbQorICAgICAgICBHZXQtQ29tbWFuZCBHZXQtQ29udGVudCBHZXQtQ3JlZGVudGlhbCBHZXQtQ3VsdHVyZSBHZXQtRGF0ZQorICAgICAgICBHZXQtRXZlbnRMb2cgR2V0LUV4ZWN1dGlvblBvbGljeSBHZXQtSGVscCBHZXQtSGlzdG9yeQorICAgICAgICBHZXQtSG9zdCBHZXQtSXRlbSBHZXQtSXRlbVByb3BlcnR5IEdldC1Mb2NhdGlvbiBHZXQtTWVtYmVyCisgICAgICAgIEdldC1QZnhDZXJ0aWZpY2F0ZSBHZXQtUHJvY2VzcyBHZXQtUFNEcml2ZSBHZXQtUFNQcm92aWRlcgorICAgICAgICBHZXQtUFNTbmFwaW4gR2V0LVNlcnZpY2UgR2V0LVRyYWNlU291cmNlIEdldC1VSUN1bHR1cmUKKyAgICAgICAgR2V0LVVuaXF1ZSBHZXQtVmFyaWFibGUgR2V0LVdtaU9iamVjdCBHcm91cC1PYmplY3QKKyAgICAgICAgSW1wb3J0LUFsaWFzIEltcG9ydC1DbGl4bWwgSW1wb3J0LUNzdiBJbnZva2UtRXhwcmVzc2lvbgorICAgICAgICBJbnZva2UtSGlzdG9yeSBJbnZva2UtSXRlbSBKb2luLVBhdGggTWVhc3VyZS1Db21tYW5kCisgICAgICAgIE1lYXN1cmUtT2JqZWN0IE1vdmUtSXRlbSBNb3ZlLUl0ZW1Qcm9wZXJ0eSBOZXctQWxpYXMKKyAgICAgICAgTmV3LUl0ZW0gTmV3LUl0ZW1Qcm9wZXJ0eSBOZXctT2JqZWN0IE5ldy1QU0RyaXZlIE5ldy1TZXJ2aWNlCisgICAgICAgIE5ldy1UaW1lU3BhbiBOZXctVmFyaWFibGUgT3V0LURlZmF1bHQgT3V0LUZpbGUgT3V0LUhvc3QgT3V0LU51bGwKKyAgICAgICAgT3V0LVByaW50ZXIgT3V0LVN0cmluZyBQb3AtTG9jYXRpb24gUHVzaC1Mb2NhdGlvbiBSZWFkLUhvc3QKKyAgICAgICAgUmVtb3ZlLUl0ZW0gUmVtb3ZlLUl0ZW1Qcm9wZXJ0eSBSZW1vdmUtUFNEcml2ZSBSZW1vdmUtUFNTbmFwaW4KKyAgICAgICAgUmVtb3ZlLVZhcmlhYmxlIFJlbmFtZS1JdGVtIFJlbmFtZS1JdGVtUHJvcGVydHkgUmVzb2x2ZS1QYXRoCisgICAgICAgIFJlc3RhcnQtU2VydmljZSBSZXN1bWUtU2VydmljZSBTZWxlY3QtT2JqZWN0IFNlbGVjdC1TdHJpbmcKKyAgICAgICAgU2V0LUFjbCBTZXQtQWxpYXMgU2V0LUF1dGhlbnRpY29kZVNpZ25hdHVyZSBTZXQtQ29udGVudCBTZXQtRGF0ZQorICAgICAgICBTZXQtRXhlY3V0aW9uUG9saWN5IFNldC1JdGVtIFNldC1JdGVtUHJvcGVydHkgU2V0LUxvY2F0aW9uCisgICAgICAgIFNldC1QU0RlYnVnIFNldC1TZXJ2aWNlIFNldC1UcmFjZVNvdXJjZSBTZXQtVmFyaWFibGUgU29ydC1PYmplY3QKKyAgICAgICAgU3BsaXQtUGF0aCBTdGFydC1TZXJ2aWNlIFN0YXJ0LVNsZWVwIFN0YXJ0LVRyYW5zY3JpcHQgU3RvcC1Qcm9jZXNzCisgICAgICAgIFN0b3AtU2VydmljZSBTdG9wLVRyYW5zY3JpcHQgU3VzcGVuZC1TZXJ2aWNlIFRlZS1PYmplY3QgVGVzdC1QYXRoCisgICAgICAgIFRyYWNlLUNvbW1hbmQgVXBkYXRlLUZvcm1hdERhdGEgVXBkYXRlLVR5cGVEYXRhIFdoZXJlLU9iamVjdAorICAgICAgICBXcml0ZS1EZWJ1ZyBXcml0ZS1FcnJvciBXcml0ZS1Ib3N0IFdyaXRlLU91dHB1dCBXcml0ZS1Qcm9ncmVzcworICAgICAgICBXcml0ZS1WZXJib3NlIFdyaXRlLVdhcm5pbmcgYWMgYXNucCBjYXQgY2QgY2hkaXIgY2xjIGNsZWFyIGNsaHkKKyAgICAgICAgY2xpIGNscCBjbHMgY2x2IGNuc24gY29tcGFyZSBjb3B5IGNwIGNwaSBjcHAgY3VybCBjdnBhIGRicCBkZWwKKyAgICAgICAgZGlmZiBkaXIgZG5zbiBlYnAgZWNobyBlcGFsIGVwY3N2IGVwc24gZXJhc2UgZXRzbiBleHNuIGZjIGZsCisgICAgICAgIGZvcmVhY2ggZnQgZncgZ2FsIGdicCBnYyBnY2kgZ2NtIGdjcyBnZHIgZ2h5IGdpIGdqYiBnbCBnbSBnbW8KKyAgICAgICAgZ3AgZ3BzIGdyb3VwIGdzbiBnc25wIGdzdiBndSBndiBnd21pIGggaGlzdG9yeSBpY20gaWV4IGloeSBpaQorICAgICAgICBpcGFsIGlwY3N2IGlwbW8gaXBzbiBpcm0gaXNlIGl3bWkgaXdyIGtpbGwgbHAgbHMgbWFuIG1kIG1lYXN1cmUKKyAgICAgICAgbWkgbW91bnQgbW92ZSBtcCBtdiBuYWwgbmRyIG5pIG5tbyBucHNzYyBuc24gbnYgb2d2IG9oIHBvcGQgcHMKKyAgICAgICAgcHVzaGQgcHdkIHIgcmJwIHJjamIgcmNzbiByZCByZHIgcmVuIHJpIHJqYiBybSBybWRpciBybW8gcm5pIHJucAorICAgICAgICBycCByc24gcnNucCBydWpiIHJ2IHJ2cGEgcndtaSBzYWpiIHNhbCBzYXBzIHNhc3Ygc2JwIHNjIHNlbGVjdAorICAgICAgICBzZXQgc2hjbSBzaSBzbCBzbGVlcCBzbHMgc29ydCBzcCBzcGpiIHNwcHMgc3BzdiBzdGFydCBzdWpiIHN2CisgICAgICAgIHN3bWkgdGVlIHRyY20gdHlwZSB3Z2V0IHdoZXJlIHdqYiB3cml0ZSBcJSBcPworICAgICAgKS5qb2luKCd8JykKKworICAgICAgcHJlcGVuZCA6YmFzaWMgZG8KKyAgICAgICAgcnVsZSAlcig8I1tccyxcU10qPyM+KW0sIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgICBydWxlIC8jLiokLywgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgL1xiKCN7T1BFUkFUT1JTfSlccypcYi9pLCBPcGVyYXRvcgorICAgICAgICBydWxlIC9cYigje0FUVFJJQlVURVN9KVxzKlxiL2ksIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBydWxlIC9cYigje0tFWVdPUkRTfSlccypcYi9pLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgL1xiKCN7S0VZV09SRFNfVFlQRX0pXHMqXGIvaSwgS2V5d29yZDo6VHlwZQorICAgICAgICBydWxlIC9cYmNhc2VcYi8sIEtleXdvcmQsIDpjYXNlCisgICAgICAgIHJ1bGUgL1xiKCN7QlVJTFRJTlN9KVxzKlxiKD8hXC4pL2ksIE5hbWU6OkJ1aWx0aW4KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcHJhYXQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9wcmFhdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkzNDBjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcHJhYXQucmIKQEAgLTAsMCArMSwzNDcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBQcmFhdCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJQcmFhdCIKKyAgICAgIGRlc2MgIlRoZSBQcmFhdCBzY3JpcHRpbmcgbGFuZ3VhZ2UgKHByYWF0Lm9yZykiCisKKyAgICAgIHRhZyAncHJhYXQnCisKKyAgICAgIGZpbGVuYW1lcyAnKi5wcmFhdCcsICcqLnByb2MnLCAnKi5wc2MnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnNoZWJhbmc/ICdwcmFhdCcKKyAgICAgIGVuZAorCisgICAgICBrZXl3b3JkcyA9ICV3KAorICAgICAgICBpZiB0aGVuIGVsc2UgZWxzaWYgZWxpZiBlbmRpZiBmaSBmb3IgZnJvbSB0byBlbmRmb3IgZW5kcHJvYyB3aGlsZQorICAgICAgICBlbmR3aGlsZSByZXBlYXQgdW50aWwgc2VsZWN0IHBsdXMgbWludXMgZGVtbyBhc3NlcnQgc3RvcHdhdGNoCisgICAgICAgIG5vY2hlY2sgbm93YXJuIG5vcHJvZ3Jlc3MgZWRpdG9yIGVuZGVkaXRvciBjbGVhcmluZm8KKyAgICAgICkKKworICAgICAgZnVuY3Rpb25zX3N0cmluZyA9ICV3KAorICAgICAgICBiYWNrc2xhc2hUcmlncmFwaHNUb1VuaWNvZGUgY2hvb3NlRGlyZWN0b3J5IGNob29zZVJlYWRGaWxlCisgICAgICAgIGNob29zZVdyaXRlRmlsZSBkYXRlIGRlbW9LZXkgZG8gZW52aXJvbm1lbnQgZXh0cmFjdExpbmUgZXh0cmFjdFdvcmQKKyAgICAgICAgZml4ZWQgaW5mbyBsZWZ0IG1pZCBwZXJjZW50IHJlYWRGaWxlIHJlcGxhY2UgcmVwbGFjZV9yZWdleCByaWdodAorICAgICAgICBzZWxlY3RlZCBzdHJpbmcgdW5pY29kZVRvQmFja3NsYXNoVHJpZ3JhcGhzCisgICAgICApCisKKyAgICAgIGZ1bmN0aW9uc19udW1lcmljID0gJXcoCisgICAgICAgIGFicyBhcHBlbmRGaWxlIGFwcGVuZEZpbGVMaW5lIGFwcGVuZEluZm8gYXBwZW5kSW5mb0xpbmUgYXJjY29zIGFyY2Nvc2gKKyAgICAgICAgYXJjc2luIGFyY3NpbmggYXJjdGFuIGFyY3RhbjIgYXJjdGFuaCBiYXJrVG9IZXJ0eiBiZWdpblBhdXNlCisgICAgICAgIGJlZ2luU2VuZFByYWF0IGJlc3NlbEkgYmVzc2VsSyBiZXRhIGJldGEyIGJpbm9taWFsUCBiaW5vbWlhbFEgYm9vbGVhbgorICAgICAgICBjZWlsaW5nIGNoaVNxdWFyZVAgY2hpU3F1YXJlUSBjaG9pY2UgY29tbWVudCBjb3MgY29zaCBjcmVhdGVEaXJlY3RvcnkKKyAgICAgICAgZGVsZXRlRmlsZSBkZW1vQ2xpY2tlZCBkZW1vQ2xpY2tlZEluIGRlbW9Db21tYW5kS2V5UHJlc3NlZAorICAgICAgICBkZW1vRXh0cmFDb250cm9sS2V5UHJlc3NlZCBkZW1vSW5wdXQgZGVtb0tleVByZXNzZWQKKyAgICAgICAgZGVtb09wdGlvbktleVByZXNzZWQgZGVtb1NoaWZ0S2V5UHJlc3NlZCBkZW1vU2hvdyBkZW1vV2FpdEZvcklucHV0CisgICAgICAgIGRlbW9XaW5kb3dUaXRsZSBkZW1vWCBkZW1vWSBkaWZmZXJlbmNlTGltZW5zVG9QaG9uIGRvIGVkaXRvciBlbmRQYXVzZQorICAgICAgICBlbmRTZW5kUHJhYXQgZW5kc1dpdGggZXJiIGVyYlRvSGVydHogZXJmIGVyZmMgZXhpdFNjcmlwdCBleHAKKyAgICAgICAgZXh0cmFjdE51bWJlciBmaWxlUmVhZGFibGUgZmlzaGVyUCBmaXNoZXJRIGZsb29yIGdhdXNzUCBnYXVzc1EKKyAgICAgICAgaGVydHpUb0JhcmsgaGVydHpUb0VyYiBoZXJ0elRvTWVsIGhlcnR6VG9TZW1pdG9uZXMgaW1heCBpbWluCisgICAgICAgIGluY29tcGxldGVCZXRhIGluY29tcGxldGVHYW1tYVAgaW5kZXggaW5kZXhfcmVnZXggaW50ZWdlciBpbnZCaW5vbWlhbFAKKyAgICAgICAgaW52Qmlub21pYWxRIGludkNoaVNxdWFyZVEgaW52RmlzaGVyUSBpbnZHYXVzc1EgaW52U2lnbW9pZCBpbnZTdHVkZW50UQorICAgICAgICBsZW5ndGggbG4gbG5CZXRhIGxuR2FtbWEgbG9nMTAgbG9nMiBtYXggbWVsVG9IZXJ0eiBtaW4gbWludXNPYmplY3QKKyAgICAgICAgbmF0dXJhbCBudW1iZXIgbnVtYmVyT2ZDb2x1bW5zIG51bWJlck9mUm93cyBudW1iZXJPZlNlbGVjdGVkCisgICAgICAgIG9iamVjdHNBcmVJZGVudGljYWwgb3B0aW9uIG9wdGlvbk1lbnUgcGF1c2VTY3JpcHQKKyAgICAgICAgcGhvblRvRGlmZmVyZW5jZUxpbWVucyBwbHVzT2JqZWN0IHBvc2l0aXZlIHJhbmRvbUJpbm9taWFsIHJhbmRvbUdhdXNzCisgICAgICAgIHJhbmRvbUludGVnZXIgcmFuZG9tUG9pc3NvbiByYW5kb21Vbmlmb3JtIHJlYWwgcmVhZEZpbGUgcmVtb3ZlT2JqZWN0CisgICAgICAgIHJpbmRleCByaW5kZXhfcmVnZXggcm91bmQgcnVuU2NyaXB0IHJ1blN5c3RlbSBydW5TeXN0ZW1fbm9jaGVjaworICAgICAgICBzZWxlY3RPYmplY3Qgc2VsZWN0ZWQgc2VtaXRvbmVzVG9IZXJ0eiBzZW50ZW5jZSBzZW50ZW5jZXRleHQgc2lnbW9pZAorICAgICAgICBzaW4gc2luYyBzaW5jcGkgc2luaCBzb3VuZFByZXNzdXJlVG9QaG9uIHNxcnQgc3RhcnRzV2l0aCBzdHVkZW50UAorICAgICAgICBzdHVkZW50USB0YW4gdGFuaCB0ZXh0IHZhcmlhYmxlRXhpc3RzIHdvcmQgd3JpdGVGaWxlIHdyaXRlRmlsZUxpbmUKKyAgICAgICAgd3JpdGVJbmZvIHdyaXRlSW5mb0xpbmUKKyAgICAgICkKKworICAgICAgZnVuY3Rpb25zX2FycmF5ID0gJXcoCisgICAgICAgIGxpbmVhciByYW5kb21HYXVzcyByYW5kb21JbnRlZ2VyIHJhbmRvbVVuaWZvcm0gemVybworICAgICAgKQorCisgICAgICBvYmplY3RzID0gJXcoCisgICAgICAgIEFjdGl2YXRpb24gQWZmaW5lVHJhbnNmb3JtIEFtcGxpdHVkZVRpZXIgQXJ0IEFydHdvcmQgQXV0b3NlZ21lbnQKKyAgICAgICAgQmFya0ZpbHRlciBCYXJrU3BlY3Ryb2dyYW0gQ0NBIENhdGVnb3JpZXMgQ2Vwc3Ryb2dyYW0gQ2Vwc3RydW0KKyAgICAgICAgQ2Vwc3RydW1jIENoZWJ5c2hldlNlcmllcyBDbGFzc2lmaWNhdGlvblRhYmxlIENvY2hsZWFncmFtIENvbGxlY3Rpb24KKyAgICAgICAgQ29tcGxleFNwZWN0cm9ncmFtIENvbmZpZ3VyYXRpb24gQ29uZnVzaW9uIENvbnRpbmdlbmN5VGFibGUgQ29ycHVzCisgICAgICAgIENvcnJlbGF0aW9uIENvdmFyaWFuY2UgQ3Jvc3NDb3JyZWxhdGlvblRhYmxlIENyb3NzQ29ycmVsYXRpb25UYWJsZUxpc3QKKyAgICAgICAgQ3Jvc3NDb3JyZWxhdGlvblRhYmxlcyBEVFcgRGF0YU1vZGVsZXIgRGlhZ29uYWxpemVyIERpc2NyaW1pbmFudAorICAgICAgICBEaXNzaW1pbGFyaXR5IERpc3RhbmNlIERpc3RyaWJ1dGlvbnMgRHVyYXRpb25UaWVyIEVFRyBFUlAgRVJQVGllcgorICAgICAgICBFZGl0Q29zdHNUYWJsZSBFZGl0RGlzdGFuY2VUYWJsZSBFaWdlbiBFeGNpdGF0aW9uIEV4Y2l0YXRpb25zCisgICAgICAgIEV4cGVyaW1lbnRNRkMgRkZOZXQgRmVhdHVyZVdlaWdodHMgRmlsZUluTWVtb3J5IEZpbGVzSW5NZW1vcnkgRm9ybWFudAorICAgICAgICBGb3JtYW50RmlsdGVyIEZvcm1hbnRHcmlkIEZvcm1hbnRNb2RlbGVyIEZvcm1hbnRQb2ludCBGb3JtYW50VGllcgorICAgICAgICBHYXVzc2lhbk1peHR1cmUgSE1NIEhNTV9PYnNlcnZhdGlvbiBITU1fT2JzZXJ2YXRpb25TZXF1ZW5jZSBITU1fU3RhdGUKKyAgICAgICAgSE1NX1N0YXRlU2VxdWVuY2UgSE1NT2JzZXJ2YXRpb24gSE1NT2JzZXJ2YXRpb25TZXF1ZW5jZSBITU1TdGF0ZQorICAgICAgICBITU1TdGF0ZVNlcXVlbmNlIEhhcm1vbmljaXR5IElTcGxpbmUgSW5kZXggSW50ZW5zaXR5IEludGVuc2l0eVRpZXIKKyAgICAgICAgSW50ZXJ2YWxUaWVyIEtOTiBLbGF0dEdyaWQgS2xhdHRUYWJsZSBMRkNDIExQQyBMYWJlbCBMZWdlbmRyZVNlcmllcworICAgICAgICBMaW5lYXJSZWdyZXNzaW9uIExvZ2lzdGljUmVncmVzc2lvbiBMb25nU291bmQgTHRhcyBNRkNDIE1TcGxpbmUgTWFuUGFnZXMKKyAgICAgICAgTWFuaXB1bGF0aW9uIE1hdHJpeCBNZWxGaWx0ZXIgTWVsU3BlY3Ryb2dyYW0gTWl4aW5nTWF0cml4IE1vdmllIE5ldHdvcmsKKyAgICAgICAgT1RHcmFtbWFyIE9USGlzdG9yeSBPVE11bHRpIFBDQSBQYWlyRGlzdHJpYnV0aW9uIFBhcmFtQ3VydmUgUGF0dGVybgorICAgICAgICBQZXJtdXRhdGlvbiBQaG90byBQaXRjaCBQaXRjaE1vZGVsZXIgUGl0Y2hUaWVyIFBvaW50UHJvY2VzcyBQb2x5Z29uCisgICAgICAgIFBvbHlub21pYWwgUG93ZXJDZXBzdHJvZ3JhbSBQb3dlckNlcHN0cnVtIFByb2NydXN0ZXMgUmVhbFBvaW50IFJlYWxUaWVyCisgICAgICAgIFJlc3VsdHNNRkMgUm9vdHMgU1BJTkVUIFNTQ1AgU1ZEIFNhbGllbmNlIFNjYWxhclByb2R1Y3QgU2ltaWxhcml0eQorICAgICAgICBTaW1wbGVTdHJpbmcgU29ydGVkU2V0T2ZTdHJpbmcgU291bmQgU3BlYWtlciBTcGVjdHJvZ3JhbSBTcGVjdHJ1bQorICAgICAgICBTcGVjdHJ1bVRpZXIgU3BlZWNoU3ludGhlc2l6ZXIgU3BlbGxpbmdDaGVja2VyIFN0cmluZ3MgU3RyaW5nc0luZGV4CisgICAgICAgIFRhYmxlIFRhYmxlT2ZSZWFsIFRleHRHcmlkIFRleHRJbnRlcnZhbCBUZXh0UG9pbnQgVGV4dFRpZXIgVGllcgorICAgICAgICBUcmFuc2l0aW9uIFZvY2FsVHJhY3QgVm9jYWxUcmFjdFRpZXIgV2VpZ2h0IFdvcmRMaXN0CisgICAgICApCisKKyAgICAgIHZhcmlhYmxlc19udW1lcmljID0gJXcoCisgICAgICAgIGFsbCBhdmVyYWdlIGUgbGVmdCBtYWNpbnRvc2ggbW9ubyBwaSBwcmFhdFZlcnNpb24gcmlnaHQgc3RlcmVvCisgICAgICAgIHVuZGVmaW5lZCB1bml4IHdpbmRvd3MKKyAgICAgICkKKworICAgICAgdmFyaWFibGVzX3N0cmluZyA9ICV3KAorICAgICAgICBwcmFhdFZlcnNpb24gdGFiIHNoZWxsRGlyZWN0b3J5IGhvbWVEaXJlY3RvcnkKKyAgICAgICAgcHJlZmVyZW5jZXNEaXJlY3RvcnkgbmV3bGluZSB0ZW1wb3JhcnlEaXJlY3RvcnkKKyAgICAgICAgZGVmYXVsdERpcmVjdG9yeQorICAgICAgKQorCisgICAgICBvYmplY3RfYXR0cmlidXRlcyA9ICV3KAorICAgICAgICBuY29sIG5yb3cgeG1pbiB5bWluIHhtYXggeW1heCBueCBueSBkeCBkeQorICAgICAgKQorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC8oXHMrKSgjLio/JCkvIGRvCisgICAgICAgICAgZ3JvdXBzIFRleHQsIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9eIy4qPyQvLCAgICAgICAgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgLztbXlxuXSovLCAgICAgICBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXHMrLywgICAgICAgICAgIFRleHQKKyAgICAgICAgcnVsZSAvXGJwcm9jZWR1cmVcYi8sIEtleXdvcmQsICAgICAgICA6cHJvY2VkdXJlX2RlZmluaXRpb24KKyAgICAgICAgcnVsZSAvXGJjYWxsXGIvLCAgICAgIEtleXdvcmQsICAgICAgICA6cHJvY2VkdXJlX2NhbGwKKyAgICAgICAgcnVsZSAvQC8sICAgICAgICAgICAgIE5hbWU6OkZ1bmN0aW9uLCA6cHJvY2VkdXJlX2NhbGwKKworICAgICAgICBtaXhpbiA6ZnVuY3Rpb25fY2FsbAorCisgICAgICAgIHJ1bGUgL1xiKD86c2VsZWN0IGFsbClcYi8sIEtleXdvcmQKKyAgICAgICAgcnVsZSAvXGIoPzoje2tleXdvcmRzLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkCisKKyAgICAgICAgcnVsZSAvKFxiZm9ybVxiKShccyspKFteXG5dKykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIExpdGVyYWw6OlN0cmluZworICAgICAgICAgIHB1c2ggOm9sZF9mb3JtCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhwcmludCg/OmxpbmV8dGFiKT98ZWNob3xleGl0fGFzc2VydGVycm9yfHBhdXNlfHNlbmQoPzpwcmFhdHxzb2NrZXQpfGluY2x1ZGV8ZXhlY3V0ZXxzeXN0ZW0oPzpfbm9jaGVjayk/KShccyspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0CisgICAgICAgICAgcHVzaCA6c3RyaW5nX3VucXVvdGVkCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhnb3RvfGxhYmVsKShccyspKFx3KykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIE5hbWU6OkxhYmVsCisgICAgICAgIGVuZAorCisgICAgICAgIG1peGluIDp2YXJpYWJsZV9uYW1lCisgICAgICAgIG1peGluIDpudW1iZXIKKworICAgICAgICBydWxlIC8iLywgTGl0ZXJhbDo6U3RyaW5nLCA6c3RyaW5nCisKKyAgICAgICAgcnVsZSAvXGIoPzoje29iamVjdHMuam9pbignfCcpfSkoPz1ccytcUytcbikvLCBOYW1lOjpDbGFzcywgOnN0cmluZ191bnF1b3RlZAorCisgICAgICAgIHJ1bGUgL1xiKD89W0EtWl0pLywgVGV4dCwgOmNvbW1hbmQKKyAgICAgICAgcnVsZSAvKFwuezN9fFspKCxcJF0pLywgUHVuY3R1YXRpb24KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29tbWFuZCBkbworICAgICAgICBydWxlIC8oID9bXHcoKS1dKyA/KS8sIEtleXdvcmQKKyAgICAgICAgbWl4aW4gOnN0cmluZ19pbnRlcnBvbGF0ZWQKKworICAgICAgICBydWxlIC9cLnszfS8gZG8KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgcG9wIQorICAgICAgICAgIHB1c2ggOm9sZF9hcmd1bWVudHMKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvOi8gZG8KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgcG9wIQorICAgICAgICAgIHB1c2ggOmNvbW1hX2xpc3QKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvW1xzXG5dLywgICAgVGV4dCwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cHJvY2VkdXJlX2NhbGwgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorCisgICAgICAgIHJ1bGUgLyhbXHcuXSspKDp8XHMqXCgpLyBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpGdW5jdGlvbiwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhbXHcuXSspLyBkbworICAgICAgICAgIHRva2VuIE5hbWU6OkZ1bmN0aW9uCisgICAgICAgICAgcG9wIQorICAgICAgICAgIHB1c2ggOm9sZF9hcmd1bWVudHMKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnByb2NlZHVyZV9kZWZpbml0aW9uIGRvCisgICAgICAgIHJ1bGUgL1xzLywgVGV4dAorCisgICAgICAgIHJ1bGUgLyhbXHcuXSspKFxzKj9bKDpdKS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6RnVuY3Rpb24sIFRleHQKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhbXHcuXSspKFteXG5dKikvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OkZ1bmN0aW9uLCBUZXh0CisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZnVuY3Rpb25fY2FsbCBkbworICAgICAgICBydWxlIC9cYigje2Z1bmN0aW9uc19zdHJpbmcuam9pbignfCcpfSlcJCg/PVxzKls6KF0pLywgTmFtZTo6RnVuY3Rpb24sIDpmdW5jdGlvbgorICAgICAgICBydWxlIC9cYigje2Z1bmN0aW9uc19hcnJheS5qb2luKCd8Jyl9KSMoPz1ccypbOihdKS8sICAgTmFtZTo6RnVuY3Rpb24sIDpmdW5jdGlvbgorICAgICAgICBydWxlIC9cYigje2Z1bmN0aW9uc19udW1lcmljLmpvaW4oJ3wnKX0pKD89XHMqWzooXSkvLCAgTmFtZTo6RnVuY3Rpb24sIDpmdW5jdGlvbgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmdW5jdGlvbiBkbworICAgICAgICBydWxlIC9ccysvLCBUZXh0CisKKyAgICAgICAgcnVsZSAvKD86OnxccypcKCkvIGRvCisgICAgICAgICAgdG9rZW4gVGV4dAorICAgICAgICAgIHBvcCEKKyAgICAgICAgICBwdXNoIDpjb21tYV9saXN0CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tYV9saXN0IGRvCisgICAgICAgIHJ1bGUgLyhccypcblxzKikoXC57M30pLyBkbworICAgICAgICAgIGdyb3VwcyBUZXh0LCBQdW5jdHVhdGlvbgorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9ccypbXF0pXG5dLywgVGV4dCwgOnBvcCEKKworICAgICAgICBydWxlIC9ccysvLCBUZXh0CisgICAgICAgIHJ1bGUgLyIvLCAgIExpdGVyYWw6OlN0cmluZywgOnN0cmluZworICAgICAgICBydWxlIC9cYihpZnx0aGVufGVsc2V8Zml8ZW5kaWYpXGIvLCBLZXl3b3JkCisKKyAgICAgICAgbWl4aW4gOmZ1bmN0aW9uX2NhbGwKKyAgICAgICAgbWl4aW4gOnZhcmlhYmxlX25hbWUKKyAgICAgICAgbWl4aW4gOm9wZXJhdG9yCisgICAgICAgIG1peGluIDpudW1iZXIKKworICAgICAgICBydWxlIC9bKCldLywgVGV4dAorICAgICAgICBydWxlIC8sLywgUHVuY3R1YXRpb24KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6b2xkX2FyZ3VtZW50cyBkbworICAgICAgICBydWxlIC9cbi8sIFRleHQsIDpwb3AhCisKKyAgICAgICAgbWl4aW4gOnZhcmlhYmxlX25hbWUKKyAgICAgICAgbWl4aW4gOm9wZXJhdG9yCisgICAgICAgIG1peGluIDpudW1iZXIKKworICAgICAgICBydWxlIC8iLywgTGl0ZXJhbDo6U3RyaW5nLCA6c3RyaW5nCisgICAgICAgIHJ1bGUgL1teXG5dLywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpudW1iZXIgZG8KKyAgICAgICAgcnVsZSAvXG4vLCBUZXh0LCA6cG9wIQorICAgICAgICBydWxlIC9cYlxkKyhcLlxkKik/KFtlRV1bLStdP1xkKyk/JT8vLCBMaXRlcmFsOjpOdW1iZXIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dmFyaWFibGVfbmFtZSBkbworICAgICAgICBtaXhpbiA6b3BlcmF0b3IKKyAgICAgICAgbWl4aW4gOm51bWJlcgorCisgICAgICAgIHJ1bGUgL1xiKD86I3t2YXJpYWJsZXNfc3RyaW5nLmpvaW4oJ3wnKX0pXCQvLCAgTmFtZTo6QnVpbHRpbgorICAgICAgICBydWxlIC9cYig/OiN7dmFyaWFibGVzX251bWVyaWMuam9pbignfCcpfSkoPyFcJClcYi8sIE5hbWU6OkJ1aWx0aW4KKworICAgICAgICBydWxlIC9cYihPYmplY3R8I3tvYmplY3RzLmpvaW4oJ3wnKX0pXy8gZG8KKyAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgcHVzaCA6b2JqZWN0X3JlZmVyZW5jZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9cLj9bYS16XVthLXpBLVowLTlfLl0qKFwkfCMpPy8sIFRleHQKKyAgICAgICAgcnVsZSAvW1xbXF1dLywgVGV4dCwgOmNvbW1hX2xpc3QKKyAgICAgICAgbWl4aW4gOnN0cmluZ19pbnRlcnBvbGF0ZWQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6b2JqZWN0X3JlZmVyZW5jZSBkbworICAgICAgICBtaXhpbiA6c3RyaW5nX2ludGVycG9sYXRlZAorICAgICAgICBydWxlIC8oW2Etel1bYS16QS1aMC05X10qfFxkKykvLCBOYW1lOjpCdWlsdGluCisKKyAgICAgICAgcnVsZSAvXC4oI3tvYmplY3RfYXR0cmlidXRlcy5qb2luKCd8Jyl9KVxiLywgTmFtZTo6QnVpbHRpbiwgOnBvcCEKKworICAgICAgICBydWxlIC9cJC8sIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgcnVsZSAvXFsvLCBUZXh0LCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpvcGVyYXRvciBkbworICAgICAgICAjIFRoaXMgcnVsZSBpbmNvcnJlY3RseSBtYXRjaGVzID09PSBvciArKysrKywgd2hpY2ggYXJlIG5vdCBvcGVyYXRvcnMKKyAgICAgICAgcnVsZSAvKFsrXC8qPD49IS1dPT98WyYqfF1bJip8XT98XF58PD4pLywgICAgICAgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvKD88IVtcdy5dKShhbmR8b3J8bm90fGRpdnxtb2QpKD8hW1x3Ll0pLywgT3BlcmF0b3I6OldvcmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5nX2ludGVycG9sYXRlZCBkbworICAgICAgICBydWxlIC8nW1wuX2Etel1bXlxbXF0nIjpdKihcWyhbXGQsXSt8Iltcd1xkLF0rIilcXSk/KDpbMC05XSspPycvLCBMaXRlcmFsOjpTdHJpbmc6OkludGVycG9sCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ191bnF1b3RlZCBkbworICAgICAgICBydWxlIC9cblxzKlwuezN9LywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvXG4vLCAgICAgICAgIFRleHQsIDpwb3AhCisgICAgICAgIHJ1bGUgL1xzLywgICAgICAgICBUZXh0CisKKyAgICAgICAgbWl4aW4gOnN0cmluZ19pbnRlcnBvbGF0ZWQKKworICAgICAgICBydWxlIC8nLywgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nCisgICAgICAgIHJ1bGUgL1teJ1xuXSsvLCAgICBMaXRlcmFsOjpTdHJpbmcKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5nIGRvCisgICAgICAgIHJ1bGUgL1xuXHMqXC57M30vLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC8iLywgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nLCAgICAgICAgICAgOnBvcCEKKworICAgICAgICBtaXhpbiA6c3RyaW5nX2ludGVycG9sYXRlZAorCisgICAgICAgIHJ1bGUgLycvLCAgICAgICAgICBMaXRlcmFsOjpTdHJpbmcKKyAgICAgICAgcnVsZSAvW14nIlxuXSsvLCAgIExpdGVyYWw6OlN0cmluZworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpvbGRfZm9ybSBkbworICAgICAgICBydWxlIC8oXHMrKSgjLio/JCkvIGRvCisgICAgICAgICAgZ3JvdXBzIFRleHQsIENvbW1lbnQ6OlNpbmdsZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9ccysvLCBUZXh0CisKKyAgICAgICAgcnVsZSAvKG9wdGlvbm1lbnV8Y2hvaWNlKShbIFx0XStcUys6WyBcdF0rKS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dAorICAgICAgICAgIHB1c2ggOm51bWJlcgorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8ob3B0aW9ufGJ1dHRvbikoWyBcdF0rKS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dAorICAgICAgICAgIHB1c2ggOnN0cmluZ191bnF1b3RlZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oc2VudGVuY2V8dGV4dCkoWyBcdF0rXFMrKS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dAorICAgICAgICAgIHB1c2ggOnN0cmluZ191bnF1b3RlZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8od29yZCkoWyBcdF0rXFMrWyBcdF0qKShcUyspPyhbIFx0XSsuKik/LyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0LCBMaXRlcmFsOjpTdHJpbmcsIFRleHQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKGJvb2xlYW4pKFxzK1xTK1xzKikoMHwxfCI/KD86eWVzfG5vKSI/KS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dCwgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKHJlYWx8bmF0dXJhbHxwb3NpdGl2ZXxpbnRlZ2VyKShbIFx0XStcUytbIFx0XSopKFsrLV0/KS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dCwgT3BlcmF0b3IKKyAgICAgICAgICBwdXNoIDpudW1iZXIKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKGNvbW1lbnQpKFxzKykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQKKyAgICAgICAgICBwdXNoIDpzdHJpbmdfdW5xdW90ZWQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXGJlbmRmb3JtXGIvLCBLZXl3b3JkLCA6cG9wIQorICAgICAgZW5kCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Byb2xvZy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Byb2xvZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmRkNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcHJvbG9nLnJiCkBAIC0wLDAgKzEsNjQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBQcm9sb2cgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiUHJvbG9nIgorICAgICAgZGVzYyAiVGhlIFByb2xvZyBwcm9ncmFtbWluZyBsYW5ndWFnZSAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qcm9sb2cpIgorICAgICAgdGFnICdwcm9sb2cnCisgICAgICBhbGlhc2VzICdwcm9sb2cnCisgICAgICBmaWxlbmFtZXMgJyoucHJvJywgJyouUCcsICcqLnByb2xvZycsICcqLnBsJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtcHJvbG9nJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDAuMSBpZiB0ZXh0ID1+IC9cQVx3KyhcKFx3K1wsXHMqXHcrXCkpKlwuLworICAgICAgICByZXR1cm4gMC4xIGlmIHRleHQuaW5jbHVkZT8gJzotJworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpiYXNpYyBkbworICAgICAgICBydWxlIC9ccysvLCBUZXh0CisgICAgICAgIHJ1bGUgL14jLiovLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXC9cKi8sIENvbW1lbnQ6Ok11bHRpbGluZSwgOm5lc3RlZF9jb21tZW50CisKKyAgICAgICAgcnVsZSAvW1xbXF0oKXt9fC4sOyFdLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvOi18LS0+LywgUHVuY3R1YXRpb24KKworICAgICAgICBydWxlIC8iW14iXSoiLywgU3RyOjpEb3VibGUKKworICAgICAgICBydWxlIC9cZCtcLlxkKy8sIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvXGQrLywgTnVtCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmF0b21zIGRvCisgICAgICAgIHJ1bGUgL1tbOmxvd2VyOl1dKFtfWzp3b3JkOl1bOmRpZ2l0Ol1dKSovLCBTdHI6OlN5bWJvbAorICAgICAgICBydWxlIC8nW14nXSonLywgU3RyOjpTeW1ib2wKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6b3BlcmF0b3JzIGRvCisgICAgICAgIHJ1bGUgLyg8fD58PTx8Pj18PT18PTo9fD18XC98XC9cL3xcKnxcK3wtKSg/PVxzfFthLXpBLVowLTlcW10pLywKKyAgICAgICAgICBPcGVyYXRvcgorICAgICAgICBydWxlIC9pcy8sIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgLyhtb2R8ZGl2fG5vdCkvLCBPcGVyYXRvcgorICAgICAgICBydWxlIC9bIyYqKy0uXC86PD0+P0Befl0rLywgT3BlcmF0b3IKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dmFyaWFibGVzIGRvCisgICAgICAgIHJ1bGUgL1tBLVpdK1x3Ki8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgL19bWzp3b3JkOl1dKi8sIE5hbWU6OlZhcmlhYmxlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOmJhc2ljCisgICAgICAgIG1peGluIDphdG9tcworICAgICAgICBtaXhpbiA6dmFyaWFibGVzCisgICAgICAgIG1peGluIDpvcGVyYXRvcnMKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bmVzdGVkX2NvbW1lbnQgZG8KKyAgICAgICAgcnVsZSAvXC9cKi8sIENvbW1lbnQ6Ok11bHRpbGluZSwgOnB1c2gKKyAgICAgICAgcnVsZSAvXHMqXCpbXipcL10rLywgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgL1wqXC8vLCBDb21tZW50OjpNdWx0aWxpbmUsIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Byb3BlcnRpZXMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9wcm9wZXJ0aWVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YjgyYjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9wcm9wZXJ0aWVzLnJiCkBAIC0wLDAgKzEsNTUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBQcm9wZXJ0aWVzIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIi5wcm9wZXJ0aWVzIgorICAgICAgZGVzYyAnLnByb3BlcnRpZXMgY29uZmlnIGZpbGVzIGZvciBKYXZhJworICAgICAgdGFnICdwcm9wZXJ0aWVzJworCisgICAgICBmaWxlbmFtZXMgJyoucHJvcGVydGllcycKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LWphdmEtcHJvcGVydGllcycKKworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KHRleHQpCisgICAgICAgIHJldHVybiAwLjEgaWYgdGV4dCA9fiAvXEFcW1tcdy5dK1xdXHMqXHcrPVx3Ky8KKyAgICAgIGVuZAorCisgICAgICBpZGVudGlmaWVyID0gL1tcdy5dKy8KKworICAgICAgc3RhdGUgOmJhc2ljIGRvCisgICAgICAgIHJ1bGUgL1shI10uKj9cbi8sIENvbW1lbnQKKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC9cXFxuLywgU3RyOjpFc2NhcGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6YmFzaWMKKworICAgICAgICBydWxlIC8oI3tpZGVudGlmaWVyfSkoXHMqKShbPTpdKS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6UHJvcGVydHksIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6dmFsdWUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnZhbHVlIGRvCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnBvcCEKKyAgICAgICAgbWl4aW4gOmJhc2ljCisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpkcQorICAgICAgICBydWxlIC8nLio/Jy8sIFN0cgorICAgICAgICBtaXhpbiA6ZXNjX3N0cgorICAgICAgICBydWxlIC9bXlxcXG5dKy8sIFN0cgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkcSBkbworICAgICAgICBydWxlIC8iLywgU3RyLCA6cG9wIQorICAgICAgICBtaXhpbiA6ZXNjX3N0cgorICAgICAgICBydWxlIC9bXlxcIl0rL20sIFN0cgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDplc2Nfc3RyIGRvCisgICAgICAgIHJ1bGUgL1xcdVswLTldezR9LywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvXFwuL20sIFN0cjo6RXNjYXBlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Byb3RvYnVmLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcHJvdG9idWYucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhNjcwMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Byb3RvYnVmLnJiCkBAIC0wLDAgKzEsNzAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBQcm90b2J1ZiA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICdQcm90b2J1ZicKKyAgICAgIGRlc2MgJ0dvb2dsZVwncyBsYW5ndWFnZS1uZXV0cmFsLCBwbGF0Zm9ybS1uZXV0cmFsLCBleHRlbnNpYmxlIG1lY2hhbmlzbSBmb3Igc2VyaWFsaXppbmcgc3RydWN0dXJlZCBkYXRhJworICAgICAgdGFnICdwcm90b2J1ZicKKyAgICAgIGFsaWFzZXMgJ3Byb3RvJworICAgICAgZmlsZW5hbWVzICcqLnByb3RvJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtcHJvdG8nCisKKyAgICAgIGt3ID0gL1xiKGN0eXBlfGRlZmF1bHR8ZXh0ZW5zaW9uc3xpbXBvcnR8bWF4fG9uZW9mfG9wdGlvbnxvcHRpb25hbHxwYWNrZWR8cmVwZWF0ZWR8cmVxdWlyZWR8cmV0dXJuc3xycGN8dG8pXGIvCisgICAgICBkYXRhdHlwZSA9IC9cYihib29sfGJ5dGVzfGRvdWJsZXxmaXhlZDMyfGZpeGVkNjR8ZmxvYXR8aW50MzJ8aW50NjR8c2ZpeGVkMzJ8c2ZpeGVkNjR8c2ludDMyfHNpbnQ2NHxzdHJpbmd8dWludDMyfHVpbnQ2NClcYi8KKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvW1xzXSsvLCBUZXh0CisgICAgICAgIHJ1bGUgL1ssO3t9XFtcXSgpXS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL1wvKFxcXG4pP1wvKFxufCgufFxuKSo/W15cXF1cbikvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXC8oXFxcbik/XCooLnxcbikqP1wqKFxcXG4pP1wvLywgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUga3csIEtleXdvcmQKKyAgICAgICAgcnVsZSBkYXRhdHlwZSwgS2V5d29yZDo6VHlwZQorICAgICAgICBydWxlIC90cnVlfGZhbHNlLywgS2V5d29yZDo6Q29uc3RhbnQKKyAgICAgICAgcnVsZSAvKHBhY2thZ2UpKFxzKykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQ6Ok5hbWVzcGFjZSwgVGV4dAorICAgICAgICAgIHB1c2ggOnBhY2thZ2UKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKG1lc3NhZ2V8ZXh0ZW5kKShccyspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpEZWNsYXJhdGlvbiwgVGV4dAorICAgICAgICAgIHB1c2ggOm1lc3NhZ2UKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKGVudW18Z3JvdXB8c2VydmljZSkoXHMrKS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6RGVjbGFyYXRpb24sIFRleHQKKyAgICAgICAgICBwdXNoIDp0eXBlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyIuKj8iLywgU3RyCisgICAgICAgIHJ1bGUgLycuKj8nLywgU3RyCisgICAgICAgIHJ1bGUgLyhcZCtcLlxkKnxcLlxkK3xcZCspW2VFXVsrLV0/XGQrW0xsVXVdKi8sIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvKFxkK1wuXGQqfFwuXGQrfFxkK1tmRl0pW2ZGXT8vLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLyhcLT8oaW5mfG5hbikpXGIvLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLzB4WzAtOWEtZkEtRl0rW0xsVXVdKi8sIE51bTo6SGV4CisgICAgICAgIHJ1bGUgLzBbMC03XStbTGxVdV0qLywgTnVtOjpPY3QKKyAgICAgICAgcnVsZSAvXGQrW0xsVXVdKi8sIE51bTo6SW50ZWdlcgorICAgICAgICBydWxlIC9bKy09XS8sIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgLyhbYS16QS1aX11bXHcuXSopKFsgXHRdKikoPSkvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OkF0dHJpYnV0ZSwgVGV4dCwgT3BlcmF0b3IKKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgL1thLXpBLVpfXVtcdy5dKi8sIE5hbWUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cGFja2FnZSBkbworICAgICAgICBydWxlIC9bYS16QS1aX11cdyovLCBOYW1lOjpOYW1lc3BhY2UsIDpwb3AhCisgICAgICAgIHJ1bGUgKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptZXNzYWdlIGRvCisgICAgICAgIHJ1bGUgL1thLXpBLVpfXVx3Ki8sIE5hbWU6OkNsYXNzLCA6cG9wIQorICAgICAgICBydWxlICgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dHlwZSBkbworICAgICAgICBydWxlIC9bYS16QS1aX11cdyovLCBOYW1lLCA6cG9wIQorICAgICAgICBydWxlICgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcHVwcGV0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcHVwcGV0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzU5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9wdXBwZXQucmIKQEAgLTAsMCArMSwxMjggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBQdXBwZXQgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiUHVwcGV0IgorICAgICAgZGVzYyAnVGhlIFB1cHBldCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgbGFuZ3VhZ2UgKHB1cHBldGxhYnMub3JnKScKKyAgICAgIHRhZyAncHVwcGV0JworICAgICAgYWxpYXNlcyAncHAnCisgICAgICBmaWxlbmFtZXMgJyoucHAnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnNoZWJhbmc/ICdwdXBwZXQtYXBwbHknCisgICAgICAgIHJldHVybiAxIGlmIHRleHQuc2hlYmFuZz8gJ3B1cHBldCcKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAa2V5d29yZHMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgYW5kIGNhc2UgY2xhc3MgZGVmYXVsdCBkZWZpbmUgZWxzZSBlbHNpZiBpZiBpbiBpbXBvcnQgaW5oZXJpdHMKKyAgICAgICAgICBub2RlIHVubGVzcworICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29uc3RhbnRzCisgICAgICAgIEBjb25zdGFudHMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgZmFsc2UgdHJ1ZSB1bmRlZgorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYubWV0YXBhcmFtZXRlcnMKKyAgICAgICAgQG1ldGFwYXJhbWV0ZXJzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGJlZm9yZSByZXF1aXJlIG5vdGlmeSBzdWJzY3JpYmUKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGlkID0gL1thLXpdXHcqLworICAgICAgY2FwX2lkID0gL1tBLVpdXHcqLworICAgICAgcXVhbG5hbWUgPSAvKDo6KT8oI3tpZH06OikqXHcrLworCisgICAgICBzdGF0ZSA6d2hpdGVzcGFjZSBkbworICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgICBydWxlIC8jLio/XG4vLCBDb21tZW50CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKworICAgICAgICBydWxlIC9bJF0je3F1YWxuYW1lfS8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgLygje2lkfSkoPz1ccypbPStdPikvbSBkbyB8bXwKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLm1ldGFwYXJhbWV0ZXJzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OlBzZXVkbworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OlByb3BlcnR5CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLygje3F1YWxuYW1lfSkoPz1ccypbKF0pL20sIE5hbWU6OkZ1bmN0aW9uCisgICAgICAgIHJ1bGUgY2FwX2lkLCBOYW1lOjpDbGFzcworCisgICAgICAgIHJ1bGUgL1srPXx+LV0+fDxbfH4tXS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL1s6fSgpO1xbXF1dLywgUHVuY3R1YXRpb24KKworICAgICAgICAjIEhBQ0sgZm9yIGNhc2Ugc3RhdGVtZW50cyBhbmQgc2VsZWN0b3JzCisgICAgICAgIHJ1bGUgL3svLCBQdW5jdHVhdGlvbiwgOnJlZ2V4X2FsbG93ZWQKKyAgICAgICAgcnVsZSAvLC8sIFB1bmN0dWF0aW9uLCA6cmVnZXhfYWxsb3dlZAorCisgICAgICAgIHJ1bGUgLyhpbnxhbmR8b3IpXGIvLCBPcGVyYXRvcjo6V29yZAorICAgICAgICBydWxlIC9bPSE8Pl09LywgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvWz0hXX4vLCBPcGVyYXRvciwgOnJlZ2V4X2FsbG93ZWQKKyAgICAgICAgcnVsZSAlcihbPD4hKyovLV0pLCBPcGVyYXRvcgorCisgICAgICAgIHJ1bGUgLyhjbGFzc3xpbmNsdWRlKShccyopKCN7cXVhbG5hbWV9KS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dCwgTmFtZTo6Q2xhc3MKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvbm9kZVxiLywgS2V5d29yZCwgOnJlZ2V4X2FsbG93ZWQKKworICAgICAgICBydWxlIC8nKFxcW1xcJ118W14nXSkqJy9tLCBTdHI6OlNpbmdsZQorICAgICAgICBydWxlIC8iLywgU3RyOjpEb3VibGUsIDpkcXVvdGVzCisKKyAgICAgICAgcnVsZSAvXGQrKFsuXVxkKyk/KGVbKy1dXGQrKT8vLCBOdW0KKworICAgICAgICAjIGEgdmFsaWQgcmVnZXguICBUT0RPOiByZWdleGVzIGFyZSBvbmx5IGFsbG93ZWQKKyAgICAgICAgIyBpbiBjZXJ0YWluIHBsYWNlcyBpbiBwdXBwZXQuCisgICAgICAgIHJ1bGUgcXVhbG5hbWUgZG8gfG18CisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5jb25zdGFudHMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6Q29uc3RhbnQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyZWdleF9hbGxvd2VkIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgJXIoLyksIFN0cjo6UmVnZXgsIDpyZWdleAorCisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJlZ2V4IGRvCisgICAgICAgIHJ1bGUgJXIoLyksIFN0cjo6UmVnZXgsIDpwb3AhCisgICAgICAgIHJ1bGUgL1xcLi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1soKXt9XS8sIFN0cjo6SW50ZXJwb2wKKyAgICAgICAgcnVsZSAvXFsvLCBTdHI6OkludGVycG9sLCA6cmVnZXhfY2xhc3MKKyAgICAgICAgcnVsZSAvLi8sIFN0cjo6UmVnZXgKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cmVnZXhfY2xhc3MgZG8KKyAgICAgICAgcnVsZSAvXF0vLCBTdHI6OkludGVycG9sLCA6cG9wIQorICAgICAgICBydWxlIC8oPzwhXFspLSg/PVxdKS8sIFN0cjo6UmVnZXgKKyAgICAgICAgcnVsZSAvLS8sIFN0cjo6SW50ZXJwb2wKKyAgICAgICAgcnVsZSAvXFwuLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvW15cXFxdLV0rLywgU3RyOjpSZWdleAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkcXVvdGVzIGRvCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnBvcCEKKyAgICAgICAgcnVsZSAvW14kXFwiXSsvbSwgU3RyOjpEb3VibGUKKyAgICAgICAgcnVsZSAvXFwuL20sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1skXSN7cXVhbG5hbWV9LywgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgcnVsZSAvWyRdW3tdI3txdWFsbmFtZX1bfV0vLCBOYW1lOjpWYXJpYWJsZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9weXRob24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9weXRob24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3MjE3MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3B5dGhvbi5yYgpAQCAtMCwwICsxLDI1MSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFB5dGhvbiA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJQeXRob24iCisgICAgICBkZXNjICJUaGUgUHl0aG9uIHByb2dyYW1taW5nIGxhbmd1YWdlIChweXRob24ub3JnKSIKKyAgICAgIHRhZyAncHl0aG9uJworICAgICAgYWxpYXNlcyAncHknCisgICAgICBmaWxlbmFtZXMgJyoucHknLCAnKi5weXcnLCAnKi5zYycsICdTQ29uc3RydWN0JywgJ1NDb25zY3JpcHQnLCAnKi50YWMnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1weXRob24nLCAnYXBwbGljYXRpb24veC1weXRob24nCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnNoZWJhbmc/KC9weXRob253PygzfDIoXC5cZCk/KT8vKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIEBrZXl3b3JkcyB8fD0gJXcoCisgICAgICAgICAgYXNzZXJ0IGJyZWFrIGNvbnRpbnVlIGRlbCBlbGlmIGVsc2UgZXhjZXB0IGV4ZWMKKyAgICAgICAgICBmaW5hbGx5IGZvciBnbG9iYWwgaWYgbGFtYmRhIHBhc3MgcHJpbnQgcmFpc2UKKyAgICAgICAgICByZXR1cm4gdHJ5IHdoaWxlIHlpZWxkIGFzIHdpdGgKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0gJXcoCisgICAgICAgICAgX19pbXBvcnRfXyBhYnMgYWxsIGFueSBhcHBseSBiYXNlc3RyaW5nIGJpbiBib29sIGJ1ZmZlcgorICAgICAgICAgIGJ5dGVhcnJheSBieXRlcyBjYWxsYWJsZSBjaHIgY2xhc3NtZXRob2QgY21wIGNvZXJjZSBjb21waWxlCisgICAgICAgICAgY29tcGxleCBkZWxhdHRyIGRpY3QgZGlyIGRpdm1vZCBlbnVtZXJhdGUgZXZhbCBleGVjZmlsZSBleGl0CisgICAgICAgICAgZmlsZSBmaWx0ZXIgZmxvYXQgZnJvemVuc2V0IGdldGF0dHIgZ2xvYmFscyBoYXNhdHRyIGhhc2ggaGV4IGlkCisgICAgICAgICAgaW5wdXQgaW50IGludGVybiBpc2luc3RhbmNlIGlzc3ViY2xhc3MgaXRlciBsZW4gbGlzdCBsb2NhbHMKKyAgICAgICAgICBsb25nIG1hcCBtYXggbWluIG5leHQgb2JqZWN0IG9jdCBvcGVuIG9yZCBwb3cgcHJvcGVydHkgcmFuZ2UKKyAgICAgICAgICByYXdfaW5wdXQgcmVkdWNlIHJlbG9hZCByZXByIHJldmVyc2VkIHJvdW5kIHNldCBzZXRhdHRyIHNsaWNlCisgICAgICAgICAgc29ydGVkIHN0YXRpY21ldGhvZCBzdHIgc3VtIHN1cGVyIHR1cGxlIHR5cGUgdW5pY2hyIHVuaWNvZGUKKyAgICAgICAgICB2YXJzIHhyYW5nZSB6aXAKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zX3BzZXVkbworICAgICAgICBAYnVpbHRpbnNfcHNldWRvIHx8PSAldyhzZWxmIE5vbmUgRWxsaXBzaXMgTm90SW1wbGVtZW50ZWQgRmFsc2UgVHJ1ZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5leGNlcHRpb25zCisgICAgICAgIEBleGNlcHRpb25zIHx8PSAldygKKyAgICAgICAgICBBcml0aG1ldGljRXJyb3IgQXNzZXJ0aW9uRXJyb3IgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICBCYXNlRXhjZXB0aW9uIERlcHJlY2F0aW9uV2FybmluZyBFT0ZFcnJvciBFbnZpcm9ubWVudEVycm9yCisgICAgICAgICAgRXhjZXB0aW9uIEZsb2F0aW5nUG9pbnRFcnJvciBGdXR1cmVXYXJuaW5nIEdlbmVyYXRvckV4aXQgSU9FcnJvcgorICAgICAgICAgIEltcG9ydEVycm9yIEltcG9ydFdhcm5pbmcgSW5kZW50YXRpb25FcnJvciBJbmRleEVycm9yIEtleUVycm9yCisgICAgICAgICAgS2V5Ym9hcmRJbnRlcnJ1cHQgTG9va3VwRXJyb3IgTWVtb3J5RXJyb3IgTmFtZUVycm9yCisgICAgICAgICAgTm90SW1wbGVtZW50ZWQgTm90SW1wbGVtZW50ZWRFcnJvciBPU0Vycm9yIE92ZXJmbG93RXJyb3IKKyAgICAgICAgICBPdmVyZmxvd1dhcm5pbmcgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyBSZWZlcmVuY2VFcnJvcgorICAgICAgICAgIFJ1bnRpbWVFcnJvciBSdW50aW1lV2FybmluZyBTdGFuZGFyZEVycm9yIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICBTeW50YXhFcnJvciBTeW50YXhXYXJuaW5nIFN5c3RlbUVycm9yIFN5c3RlbUV4aXQgVGFiRXJyb3IKKyAgICAgICAgICBUeXBlRXJyb3IgVW5ib3VuZExvY2FsRXJyb3IgVW5pY29kZURlY29kZUVycm9yCisgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yIFVuaWNvZGVFcnJvciBVbmljb2RlVHJhbnNsYXRlRXJyb3IKKyAgICAgICAgICBVbmljb2RlV2FybmluZyBVc2VyV2FybmluZyBWYWx1ZUVycm9yIFZNU0Vycm9yIFdhcm5pbmcKKyAgICAgICAgICBXaW5kb3dzRXJyb3IgWmVyb0RpdmlzaW9uRXJyb3IKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGlkZW50aWZpZXIgPSAgICAgICAgL1thLXpfXVthLXowLTlfXSovaQorICAgICAgZG90dGVkX2lkZW50aWZpZXIgPSAvW2Etel8uXVthLXowLTlfLl0qL2kKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xuKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgL14oOikoXHMqKShbcnVdeywyfSIiIi4qPyIiIikvbWkgZG8KKyAgICAgICAgICBncm91cHMgUHVuY3R1YXRpb24sIFRleHQsIFN0cjo6RG9jCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1teXFNcbl0rLywgVGV4dAorICAgICAgICBydWxlIC8jLiokLywgQ29tbWVudAorICAgICAgICBydWxlIC9bXFtcXXt9OigpLDtdLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvXFxcbi8sIFRleHQKKyAgICAgICAgcnVsZSAvXFwvLCBUZXh0CisKKyAgICAgICAgcnVsZSAvKGlufGlzfGFuZHxvcnxub3QpXGIvLCBPcGVyYXRvcjo6V29yZAorICAgICAgICBydWxlIC8hPXw9PXw8PHw+PnxbLX4rXC8qJT08PiZefC5dLywgT3BlcmF0b3IKKworICAgICAgICBydWxlIC8oZGVmKSgoPzpcc3xcXFxzKSspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0CisgICAgICAgICAgcHVzaCA6ZnVuY25hbWUKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKGNsYXNzKSgoPzpcc3xcXFxzKSspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0CisgICAgICAgICAgcHVzaCA6Y2xhc3NuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyh5aWVsZCkoKD86XHN8XFxccykrKS8gZG8KKyAgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQKKyAgICAgICAgICAgcHVzaCA6cmFpc2UKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKHJhaXNlKSgoPzpcc3xcXFxzKSspLyBkbworICAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dAorICAgICAgICAgICBwdXNoIDpyYWlzZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oZnJvbSkoKD86XHN8XFxccykrKS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6TmFtZXNwYWNlLCBUZXh0CisgICAgICAgICAgcHVzaCA6ZnJvbWltcG9ydAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oaW1wb3J0KSgoPzpcc3xcXFxzKSspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpOYW1lc3BhY2UsIFRleHQKKyAgICAgICAgICBwdXNoIDppbXBvcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBUT0RPOiBub3QgaW4gcHl0aG9uIDMKKyAgICAgICAgcnVsZSAvYC4qP2AvLCBTdHI6OkJhY2t0aWNrCisgICAgICAgIHJ1bGUgLyg/OnJ8dXJ8cnUpIiIiL2ksIFN0ciwgOnRkcXMKKyAgICAgICAgcnVsZSAvKD86cnx1cnxydSknJycvaSwgU3RyLCA6dHNxcworICAgICAgICBydWxlIC8oPzpyfHVyfHJ1KSIvaSwgICBTdHIsIDpkcXMKKyAgICAgICAgcnVsZSAvKD86cnx1cnxydSknL2ksICAgU3RyLCA6c3FzCisgICAgICAgIHJ1bGUgL3U/IiIiL2ksICAgICAgICAgIFN0ciwgOmVzY2FwZV90ZHFzCisgICAgICAgIHJ1bGUgL3U/JycnL2ksICAgICAgICAgIFN0ciwgOmVzY2FwZV90c3FzCisgICAgICAgIHJ1bGUgL3U/Ii9pLCAgICAgICAgICAgIFN0ciwgOmVzY2FwZV9kcXMKKyAgICAgICAgcnVsZSAvdT8nL2ksICAgICAgICAgICAgU3RyLCA6ZXNjYXBlX3NxcworCisgICAgICAgIHJ1bGUgL0Aje2RvdHRlZF9pZGVudGlmaWVyfS9pLCBOYW1lOjpEZWNvcmF0b3IKKworICAgICAgICAjIHVzaW5nIG5lZ2F0aXZlIGxvb2tiZWhpbmQgc28gd2UgZG9uJ3QgbWF0Y2ggcHJvcGVydHkgbmFtZXMKKyAgICAgICAgcnVsZSAvKD88IVwuKSN7aWRlbnRpZmllcn0vIGRvIHxtfAorICAgICAgICAgIGlmIHNlbGYuY2xhc3Mua2V5d29yZHMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuZXhjZXB0aW9ucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5idWlsdGlucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5idWlsdGluc19wc2V1ZG8uaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbjo6UHNldWRvCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIGlkZW50aWZpZXIsIE5hbWUKKworICAgICAgICBydWxlIC8oXGQrXC5cZCp8XGQqXC5cZCspKGVbKy1dP1swLTldKyk/L2ksIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvXGQrZVsrLV0/WzAtOV0rL2ksIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvMFswLTddKy8sIE51bTo6T2N0CisgICAgICAgIHJ1bGUgLzB4W2EtZjAtOV0rL2ksIE51bTo6SGV4CisgICAgICAgIHJ1bGUgL1xkK0wvLCBOdW06OkludGVnZXI6OkxvbmcKKyAgICAgICAgcnVsZSAvXGQrLywgTnVtOjpJbnRlZ2VyCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZ1bmNuYW1lIGRvCisgICAgICAgIHJ1bGUgaWRlbnRpZmllciwgTmFtZTo6RnVuY3Rpb24sIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNsYXNzbmFtZSBkbworICAgICAgICBydWxlIGlkZW50aWZpZXIsIE5hbWU6OkNsYXNzLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyYWlzZSBkbworICAgICAgICBydWxlIC9mcm9tXGIvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgL3JhaXNlXGIvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgL3lpZWxkXGIvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnBvcCEKKyAgICAgICAgcnVsZSAvOy8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp5aWVsZCBkbworICAgICAgICBtaXhpbiA6cmFpc2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW1wb3J0IGRvCisgICAgICAgICMgbm9uLWxpbmUtdGVybWluYXRpbmcgd2hpdGVzcGFjZQorICAgICAgICBydWxlIC8oPzpbIFx0XXxcXFxuKSsvLCBUZXh0CisKKyAgICAgICAgcnVsZSAvYXNcYi8sIEtleXdvcmQ6Ok5hbWVzcGFjZQorICAgICAgICBydWxlIC8sLywgT3BlcmF0b3IKKyAgICAgICAgcnVsZSBkb3R0ZWRfaWRlbnRpZmllciwgTmFtZTo6TmFtZXNwYWNlCisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9ICMgYW55dGhpbmcgZWxzZSAtPiBnbyBiYWNrCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZyb21pbXBvcnQgZG8KKyAgICAgICAgIyBub24tbGluZS10ZXJtaW5hdGluZyB3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgLyg/OlsgXHRdfFxcXG4pKy8sIFRleHQKKworICAgICAgICBydWxlIC9pbXBvcnRcYi8sIEtleXdvcmQ6Ok5hbWVzcGFjZSwgOnBvcCEKKyAgICAgICAgcnVsZSBkb3R0ZWRfaWRlbnRpZmllciwgTmFtZTo6TmFtZXNwYWNlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ3MgZG8KKyAgICAgICAgcnVsZSAvJShcKFthLXowLTlfXStcKSk/Wy0jMCArXSooWzAtOV0rfFsqXSk/KFwuKFswLTldK3xbKl0pKT8vaSwgU3RyOjpJbnRlcnBvbAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmdzX2RvdWJsZSBkbworICAgICAgICBydWxlIC9bXlxcIiVcbl0rLywgU3RyCisgICAgICAgIG1peGluIDpzdHJpbmdzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ3Nfc2luZ2xlIGRvCisgICAgICAgIHJ1bGUgL1teXFwnJVxuXSsvLCBTdHIKKyAgICAgICAgbWl4aW4gOnN0cmluZ3MKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bmwgZG8KKyAgICAgICAgcnVsZSAvXG4vLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXNjYXBlIGRvCisgICAgICAgIHJ1bGUgJXIoXFwKKyAgICAgICAgICAoIFtcXGFiZm5ydHYiJ10KKyAgICAgICAgICB8IFxuCisgICAgICAgICAgfCBOey4qP30KKyAgICAgICAgICB8IHVbYS1mQS1GMC05XXs0fQorICAgICAgICAgIHwgVVthLWZBLUYwLTldezh9CisgICAgICAgICAgfCB4W2EtZkEtRjAtOV17Mn0KKyAgICAgICAgICB8IFswLTddezEsM30KKyAgICAgICAgICApCisgICAgICAgICl4LCBTdHI6OkVzY2FwZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkcXMgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOnBvcCEKKyAgICAgICAgcnVsZSAvXFxcXHxcXCJ8XFxcbi8sIFN0cjo6RXNjYXBlCisgICAgICAgIG1peGluIDpzdHJpbmdzX2RvdWJsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzcXMgZG8KKyAgICAgICAgcnVsZSAvJy8sIFN0ciwgOnBvcCEKKyAgICAgICAgcnVsZSAvXFxcXHxcXCd8XFxcbi8sIFN0cjo6RXNjYXBlCisgICAgICAgIG1peGluIDpzdHJpbmdzX3NpbmdsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp0ZHFzIGRvCisgICAgICAgIHJ1bGUgLyIiIi8sIFN0ciwgOnBvcCEKKyAgICAgICAgcnVsZSAvIi8sIFN0cgorICAgICAgICBtaXhpbiA6c3RyaW5nc19kb3VibGUKKyAgICAgICAgbWl4aW4gOm5sCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRzcXMgZG8KKyAgICAgICAgcnVsZSAvJycnLywgU3RyLCA6cG9wIQorICAgICAgICBydWxlIC8nLywgU3RyCisgICAgICAgIG1peGluIDpzdHJpbmdzX3NpbmdsZQorICAgICAgICBtaXhpbiA6bmwKKyAgICAgIGVuZAorCisgICAgICAldyh0ZHFzIHRzcXMgZHFzIHNxcykuZWFjaCBkbyB8cXR5cGV8CisgICAgICAgIHN0YXRlIDoiZXNjYXBlXyN7cXR5cGV9IiBkbworICAgICAgICAgIG1peGluIDplc2NhcGUKKyAgICAgICAgICBtaXhpbiA6IiN7cXR5cGV9IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9xbWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9xbWwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkYmFjNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3FtbC5yYgpAQCAtMCwwICsxLDczIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgbG9hZF9sZXhlciAnamF2YXNjcmlwdC5yYicKKworICAgIGNsYXNzIFFtbCA8IEphdmFzY3JpcHQKKyAgICAgIHRpdGxlICJRTUwiCisgICAgICBkZXNjICdRTUwsIGEgVUkgbWFya3VwIGxhbmd1YWdlJworICAgICAgdGFnICdxbWwnCisgICAgICBhbGlhc2VzICdxbWwnCisgICAgICBmaWxlbmFtZXMgJyoucW1sJworCisgICAgICBtaW1ldHlwZXMgJ2FwcGxpY2F0aW9uL3gtcW1sJywgJ3RleHQveC1xbWwnCisKKyAgICAgIGlkX3dpdGhfZG90cyA9IC9bJGEtekEtWl9dW2EtekEtWjAtOV8uXSovCisKKyAgICAgIHByZXBlbmQgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvKCN7aWRfd2l0aF9kb3RzfSkoXHMqKSh7KS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6VHlwZSwgVGV4dCwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDp0eXBlX2Jsb2NrCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC8oI3tpZF93aXRoX2RvdHN9KShccyspKG9uKShccyspKCN7aWRfd2l0aF9kb3RzfSkoXHMqKSh7KS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6VHlwZSwgVGV4dCwgS2V5d29yZCwgVGV4dCwgTmFtZTo6TGFiZWwsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6dHlwZV9ibG9jaworICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9be10vLCBQdW5jdHVhdGlvbiwgOnB1c2gKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dHlwZV9ibG9jayBkbworICAgICAgICBydWxlIC8oaWQpKFxzKikoOikoXHMqKSgje2lkX3dpdGhfZG90c30pLyBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpMYWJlbCwgVGV4dCwgUHVuY3R1YXRpb24sIFRleHQsIEtleXdvcmQ6OkRlY2xhcmF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLygje2lkX3dpdGhfZG90c30pKFxzKikoOikvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OkxhYmVsLCBUZXh0LCBQdW5jdHVhdGlvbgorICAgICAgICAgIHB1c2ggOmV4cHJfc3RhcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKHNpZ25hbCkoXHMrKSgje2lkX3dpdGhfZG90c30pLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpEZWNsYXJhdGlvbiwgVGV4dCwgTmFtZTo6TGFiZWwKKyAgICAgICAgICBwdXNoIDpzaWduYWwKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKHByb3BlcnR5KShccyspKCN7aWRfd2l0aF9kb3RzfSkoXHMrKSgje2lkX3dpdGhfZG90c30pKFxzKikoOj8pLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpEZWNsYXJhdGlvbiwgVGV4dCwgS2V5d29yZDo6VHlwZSwgVGV4dCwgTmFtZTo6TGFiZWwsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9bfV0vLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgICAgbWl4aW4gOnJvb3QKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c2lnbmFsIGRvCisgICAgICAgIG1peGluIDpjb21tZW50c19hbmRfd2hpdGVzcGFjZQorICAgICAgICBydWxlIC9cKC8gZG8KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgIGdvdG8gOnNpZ25hbF9hcmdzCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC8vLCBUZXh0LCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzaWduYWxfYXJncyBkbworICAgICAgICBtaXhpbiA6Y29tbWVudHNfYW5kX3doaXRlc3BhY2UKKyAgICAgICAgcnVsZSAvKCN7aWRfd2l0aF9kb3RzfSkoXHMrKSgje2lkX3dpdGhfZG90c30pKFxzKikoLD8pLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpUeXBlLCBUZXh0LCBOYW1lLCBUZXh0LCBQdW5jdHVhdGlvbgorICAgICAgICBlbmQKKyAgICAgICAgcnVsZSAvXCkvICwgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3IucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGU4OTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9yLnJiCkBAIC0wLDAgKzEsODkgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBSIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIlIiCisgICAgICBkZXNjICdUaGUgUiBzdGF0aXN0aWNzIGxhbmd1YWdlIChyLXByb2plY3Qub3JnKScKKyAgICAgIHRhZyAncicKKyAgICAgIGFsaWFzZXMgJ3InLCAnUicsICdzJywgJ1MnCisgICAgICBmaWxlbmFtZXMgJyouUicsICcqLnInLCAnLlJoaXN0b3J5JywgJy5ScHJvZmlsZScKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LXItc291cmNlJywgJ3RleHQveC1yJywgJ3RleHQveC1SJworCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1yJywgJ2FwcGxpY2F0aW9uL3gtcicKKworICAgICAgS0VZV09SRFMgPSAldyhpZiBlbHNlIGZvciB3aGlsZSByZXBlYXQgaW4gbmV4dCBicmVhayBmdW5jdGlvbikKKworICAgICAgS0VZV09SRF9DT05TVEFOVFMgPSAldygKKyAgICAgICAgTlVMTCBJbmYgVFJVRSBGQUxTRSBOYU4gTkEKKyAgICAgICAgTkFfaW50ZWdlcl8gTkFfcmVhbF8gTkFfY29tcGxleF8gTkFfY2hhcmFjdGVyXworICAgICAgKQorCisgICAgICBCVUlMVElOX0NPTlNUQU5UUyA9ICV3KExFVFRFUlMgbGV0dGVycyBtb250aC5hYmIgbW9udGgubmFtZSBwaSBUIEYpCisKKyAgICAgICMgVGhlc2UgYXJlIGFsbCB0aGUgZnVuY3Rpb25zIGluIGBiYXNlYCB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcyBhCisgICAgICAjIGAuUHJpbWl0aXZlYCwgbWludXMgdGhvc2UgZnVuY3Rpb25zIHRoYXQgYXJlIGFsc28ga2V5d29yZHMuCisgICAgICBQUklNSVRJVkVfRlVOQ1RJT05TID0gJXcoCisgICAgICAgIGFicyBhY29zIGFjb3NoIGFsbCBhbnkgYW55TkEgQXJnIGFzLmNhbGwgYXMuY2hhcmFjdGVyCisgICAgICAgIGFzLmNvbXBsZXggYXMuZG91YmxlIGFzLmVudmlyb25tZW50IGFzLmludGVnZXIgYXMubG9naWNhbAorICAgICAgICBhcy5udWxsLmRlZmF1bHQgYXMubnVtZXJpYyBhcy5yYXcgYXNpbiBhc2luaCBhdGFuIGF0YW5oIGF0dHIKKyAgICAgICAgYXR0cmlidXRlcyBiYXNlZW52IGJyb3dzZXIgYyBjYWxsIGNlaWxpbmcgY2xhc3MgQ29uaiBjb3MgY29zaAorICAgICAgICBjb3NwaSBjdW1tYXggY3VtbWluIGN1bXByb2QgY3Vtc3VtIGRpZ2FtbWEgZGltIGRpbW5hbWVzCisgICAgICAgIGVtcHR5ZW52IGV4cCBleHByZXNzaW9uIGZsb29yIGZvcmNlQW5kQ2FsbCBnYW1tYSBnYy50aW1lCisgICAgICAgIGdsb2JhbGVudiBJbSBpbnRlcmFjdGl2ZSBpbnZpc2libGUgaXMuYXJyYXkgaXMuYXRvbWljIGlzLmNhbGwKKyAgICAgICAgaXMuY2hhcmFjdGVyIGlzLmNvbXBsZXggaXMuZG91YmxlIGlzLmVudmlyb25tZW50IGlzLmV4cHJlc3Npb24KKyAgICAgICAgaXMuZmluaXRlIGlzLmZ1bmN0aW9uIGlzLmluZmluaXRlIGlzLmludGVnZXIgaXMubGFuZ3VhZ2UKKyAgICAgICAgaXMubGlzdCBpcy5sb2dpY2FsIGlzLm1hdHJpeCBpcy5uYSBpcy5uYW1lIGlzLm5hbiBpcy5udWxsCisgICAgICAgIGlzLm51bWVyaWMgaXMub2JqZWN0IGlzLnBhaXJsaXN0IGlzLnJhdyBpcy5yZWN1cnNpdmUgaXMuc2luZ2xlCisgICAgICAgIGlzLnN5bWJvbCBsYXp5TG9hZERCZmV0Y2ggbGVuZ3RoIGxnYW1tYSBsaXN0IGxvZyBtYXggbWluCisgICAgICAgIG1pc3NpbmcgTW9kIG5hbWVzIG5hcmdzIG56Y2hhciBvbGRDbGFzcyBvbi5leGl0IHBvcy50by5lbnYKKyAgICAgICAgcHJvYy50aW1lIHByb2QgcXVvdGUgcmFuZ2UgUmUgcmVwIHJldHJhY2VtZW0gcmV0dXJuIHJvdW5kCisgICAgICAgIHNlcV9hbG9uZyBzZXFfbGVuIHNlcS5pbnQgc2lnbiBzaWduaWYgc2luIHNpbmggc2lucGkgc3FydAorICAgICAgICBzdGFuZGFyZEdlbmVyaWMgc3Vic3RpdHV0ZSBzdW0gc3dpdGNoIHRhbiB0YW5oIHRhbnBpIHRyYWNlbWVtCisgICAgICAgIHRyaWdhbW1hIHRydW5jIHVuY2xhc3MgdW50cmFjZW1lbSBVc2VNZXRob2QgeHRmcm0KKyAgICAgICkKKworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KHRleHQpCisgICAgICAgIHJldHVybiAxIGlmIHRleHQuc2hlYmFuZz8gJ1JzY3JpcHQnCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvIycuKj9cbi8sIENvbW1lbnQ6OkRvYworICAgICAgICBydWxlIC8jLio/XG4vLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQ6OldoaXRlc3BhY2UKKworICAgICAgICBydWxlIC9gW15gXSs/YC8sIE5hbWUKKyAgICAgICAgcnVsZSAvJyhcXC58LikqPycvbSwgU3RyOjpTaW5nbGUKKyAgICAgICAgcnVsZSAvIihcXC58LikqPyIvbSwgU3RyOjpEb3VibGUKKworICAgICAgICBydWxlIC8lW14lXSo/JS8sIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvMFt4WF1bYS1mQS1GMC05XSsoW3BQXVswLTldKyk/W0xpXT8vLCBOdW06OkhleAorICAgICAgICBydWxlIC9bKy1dPyhcZCsoWy5dXGQrKT98Wy5dXGQrKShbZUVdWystXT9cZCspP1tMaV0/LywKKyAgICAgICAgICBOdW0KKworICAgICAgICAjIE9ubHkgcmVjb2duaXplIGJ1aWx0LWluIGZ1bmN0aW9ucyB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5IHVzZWQgYXMgYQorICAgICAgICAjIGZ1bmN0aW9uIGNhbGwsIGkuZS4gZm9sbG93ZWQgYnkgYW4gb3BlbmluZyBwYXJlbnRoZXNpcy4KKyAgICAgICAgIyBgTmFtZTo6QnVpbHRpbmAgd291bGQgYmUgbW9yZSBsb2dpY2FsLCBidXQgaXMgdXN1YWxseSBub3QKKyAgICAgICAgIyBoaWdobGlnaHRlZCBzcGVjaWZpY2FsbHk7IHRodXMgdXNlIGBOYW1lOjpGdW5jdGlvbmAuCisgICAgICAgIHJ1bGUgL1xiKD88IS4pKCN7UFJJTUlUSVZFX0ZVTkNUSU9OUy5qb2luKCd8Jyl9KSg/PVwoKS8sIE5hbWU6OkZ1bmN0aW9uCisKKyAgICAgICAgcnVsZSAvW2EtekEtWi5dKFthLXpBLVpfXVtcdy5dKik/LyBkbyB8bXwKKyAgICAgICAgICBpZiBLRVlXT1JEUy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgS0VZV09SRF9DT05TVEFOVFMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6Q29uc3RhbnQKKyAgICAgICAgICBlbHNpZiBCVUlMVElOX0NPTlNUQU5UUy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9bXFtcXXt9KCk7LF0vLCBQdW5jdHVhdGlvbgorCisgICAgICAgIHJ1bGUgJXIoWy08Pj8qK14vIT1+JEA6JSZ8XSksIE9wZXJhdG9yCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3JhY2tldC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3JhY2tldC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDJkMjgzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvcmFja2V0LnJiCkBAIC0wLDAgKzEsNTQyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFJhY2tldCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJSYWNrZXQiCisgICAgICBkZXNjICJSYWNrZXQgaXMgYSBMaXNwIGRlc2NlbmRlZCBmcm9tIFNjaGVtZSAocmFja2V0LWxhbmcub3JnKSIKKworICAgICAgdGFnICdyYWNrZXQnCisgICAgICBmaWxlbmFtZXMgJyoucmt0JywgJyoucmt0ZCcsICcqLnJrdGwnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1yYWNrZXQnLCAnYXBwbGljYXRpb24veC1yYWNrZXQnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICB0ZXh0ID0gdGV4dC5zdHJpcAorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnN0YXJ0X3dpdGg/ICcjbGFuZyByYWNrZXQnCisgICAgICAgIHJldHVybiAwLjYgaWYgdGV4dCA9fiAlcihcQSNsYW5nIFthLXovLV0rJClpCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIC4uLiBhbmQgYmVnaW4gYmVnaW4tZm9yLXN5bnRheCBiZWdpbjAgY2FzZSBjYXNlLWxhbWJkYSBjb25kCisgICAgICAgICAgZGF0dW0tPnN5bnRheC1vYmplY3QgZGVmaW5lIGRlZmluZS1mb3Itc3ludGF4IGRlZmluZS1sb2dnZXIKKyAgICAgICAgICBkZWZpbmUtc3RydWN0IGRlZmluZS1zeW50YXggZGVmaW5lLXN5bnRheC1ydWxlCisgICAgICAgICAgZGVmaW5lLXN5bnRheGVzIGRlZmluZS12YWx1ZXMgZGVmaW5lLXZhbHVlcy1mb3Itc3ludGF4IGRlbGF5CisgICAgICAgICAgZG8gZXhwYW5kLXBhdGggZmx1aWQtbGV0IGZvcmNlIGhhc2gtdGFibGUtY29weQorICAgICAgICAgIGhhc2gtdGFibGUtY291bnQgaGFzaC10YWJsZS1mb3ItZWFjaCBoYXNoLXRhYmxlLWdldAorICAgICAgICAgIGhhc2gtdGFibGUtaXRlcmF0ZS1maXJzdCBoYXNoLXRhYmxlLWl0ZXJhdGUta2V5CisgICAgICAgICAgaGFzaC10YWJsZS1pdGVyYXRlLW5leHQgaGFzaC10YWJsZS1pdGVyYXRlLXZhbHVlCisgICAgICAgICAgaGFzaC10YWJsZS1tYXAgaGFzaC10YWJsZS1wdXQhIGhhc2gtdGFibGUtcmVtb3ZlIQorICAgICAgICAgIGhhc2gtdGFibGU/IGlmIGxhbWJkYSBsZXQgbGV0KiBsZXQqLXZhbHVlcyBsZXQtc3RydWN0CisgICAgICAgICAgbGV0LXN5bnRheCBsZXQtc3ludGF4ZXMgbGV0LXZhbHVlcyBsZXQvY2MgbGV0L2VjIGxldHJlYworICAgICAgICAgIGxldHJlYy1zeW50YXggbGV0cmVjLXN5bnRheGVzIGxldHJlYy1zeW50YXhlcyt2YWx1ZXMKKyAgICAgICAgICBsZXRyZWMtdmFsdWVzIGxpc3QtaW1tdXRhYmxlIG1ha2UtaGFzaC10YWJsZQorICAgICAgICAgIG1ha2UtaW1tdXRhYmxlLWhhc2gtdGFibGUgbWFrZS1uYW1lc3BhY2UgbW9kdWxlIG1vZHVsZSoKKyAgICAgICAgICBtb2R1bGUtaWRlbnRpZmllcj0/IG1vZHVsZS1sYWJlbC1pZGVudGlmaWVyPT8KKyAgICAgICAgICBtb2R1bGUtdGVtcGxhdGUtaWRlbnRpZmllcj0/IG1vZHVsZS10cmFuc2Zvcm1lci1pZGVudGlmaWVyPT8KKyAgICAgICAgICBuYW1lc3BhY2UtdHJhbnNmb3JtZXItcmVxdWlyZSBvciBwYXJhbWV0ZXJpemUgcGFyYW1ldGVyaXplKgorICAgICAgICAgIHBhcmFtZXRlcml6ZS1icmVhayBwcm9taXNlPyBwcm9wOm1ldGhvZC1hcml0eS1lcnJvciBwcm92aWRlCisgICAgICAgICAgcHJvdmlkZS1mb3ItbGFiZWwgcHJvdmlkZS1mb3Itc3ludGF4IHF1YXNpcXVvdGUgcXVhc2lzeW50YXgKKyAgICAgICAgICBxdWFzaXN5bnRheC9sb2MgcXVvdGUgcXVvdGUtc3ludGF4IHF1b3RlLXN5bnRheC9wcnVuZQorICAgICAgICAgIHJlcXVpcmUgcmVxdWlyZS1mb3ItbGFiZWwgcmVxdWlyZS1mb3Itc3ludGF4CisgICAgICAgICAgcmVxdWlyZS1mb3ItdGVtcGxhdGUgc2V0ISBzZXQhLXZhbHVlcyBzeW50YXggc3ludGF4LWNhc2UKKyAgICAgICAgICBzeW50YXgtY2FzZSogc3ludGF4LWlkLXJ1bGVzIHN5bnRheC1vYmplY3QtPmRhdHVtCisgICAgICAgICAgc3ludGF4LXJ1bGVzIHN5bnRheC9sb2MgdGNwLWFiYW5kb24tcG9ydCB0Y3AtYWNjZXB0CisgICAgICAgICAgdGNwLWFjY2VwdC1ldnQgdGNwLWFjY2VwdC1yZWFkeT8gdGNwLWFjY2VwdC9lbmFibGUtYnJlYWsKKyAgICAgICAgICB0Y3AtYWRkcmVzc2VzIHRjcC1jbG9zZSB0Y3AtY29ubmVjdCB0Y3AtY29ubmVjdC9lbmFibGUtYnJlYWsKKyAgICAgICAgICB0Y3AtbGlzdGVuIHRjcC1saXN0ZW5lcj8gdGNwLXBvcnQ/IHRpbWUgdHJhbnNjcmlwdC1vZmYKKyAgICAgICAgICB0cmFuc2NyaXB0LW9uIHVkcC1hZGRyZXNzZXMgdWRwLWJpbmQhIHVkcC1ib3VuZD8gdWRwLWNsb3NlCisgICAgICAgICAgdWRwLWNvbm5lY3QhIHVkcC1jb25uZWN0ZWQ/IHVkcC1tdWx0aWNhc3QtaW50ZXJmYWNlCisgICAgICAgICAgdWRwLW11bHRpY2FzdC1qb2luLWdyb3VwISB1ZHAtbXVsdGljYXN0LWxlYXZlLWdyb3VwIQorICAgICAgICAgIHVkcC1tdWx0aWNhc3QtbG9vcGJhY2s/IHVkcC1tdWx0aWNhc3Qtc2V0LWludGVyZmFjZSEKKyAgICAgICAgICB1ZHAtbXVsdGljYXN0LXNldC1sb29wYmFjayEgdWRwLW11bHRpY2FzdC1zZXQtdHRsIQorICAgICAgICAgIHVkcC1tdWx0aWNhc3QtdHRsIHVkcC1vcGVuLXNvY2tldCB1ZHAtcmVjZWl2ZSEgdWRwLXJlY2VpdmUhKgorICAgICAgICAgIHVkcC1yZWNlaXZlIS1ldnQgdWRwLXJlY2VpdmUhL2VuYWJsZS1icmVhaworICAgICAgICAgIHVkcC1yZWNlaXZlLXJlYWR5LWV2dCB1ZHAtc2VuZCB1ZHAtc2VuZCogdWRwLXNlbmQtZXZ0CisgICAgICAgICAgdWRwLXNlbmQtcmVhZHktZXZ0IHVkcC1zZW5kLXRvIHVkcC1zZW5kLXRvKiB1ZHAtc2VuZC10by1ldnQKKyAgICAgICAgICB1ZHAtc2VuZC10by9lbmFibGUtYnJlYWsgdWRwLXNlbmQvZW5hYmxlLWJyZWFrIHVkcD8gdW5sZXNzCisgICAgICAgICAgdW5xdW90ZSB1bnF1b3RlLXNwbGljaW5nIHVuc3ludGF4IHVuc3ludGF4LXNwbGljaW5nIHdoZW4KKyAgICAgICAgICB3aXRoLWNvbnRpbnVhdGlvbi1tYXJrIHdpdGgtaGFuZGxlcnMgd2l0aC1oYW5kbGVycyoKKyAgICAgICAgICB3aXRoLXN5bnRheCDOuykKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5idWlsdGlucworICAgICAgICBAYnVpbHRpbnMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgKiArIC0gLyA8IDw9ID0gPiA+PQorICAgICAgICAgIGFib3J0LWN1cnJlbnQtY29udGludWF0aW9uIGFicyBhYnNvbHV0ZS1wYXRoPyBhY29zIGFkZDEKKyAgICAgICAgICBhbGFybS1ldnQgYWx3YXlzLWV2dCBhbmRtYXAgYW5nbGUgYXBwZW5kIGFwcGx5CisgICAgICAgICAgYXJpdGhtZXRpYy1zaGlmdCBhcml0eS1hdC1sZWFzdCBhcml0eS1hdC1sZWFzdC12YWx1ZQorICAgICAgICAgIGFyaXR5LWF0LWxlYXN0PyBhc2luIGFzc29jIGFzc3EgYXNzdiBhdGFuIGJhbm5lciBiaXR3aXNlLWFuZAorICAgICAgICAgIGJpdHdpc2UtYml0LWZpZWxkIGJpdHdpc2UtYml0LXNldD8gYml0d2lzZS1pb3IgYml0d2lzZS1ub3QKKyAgICAgICAgICBiaXR3aXNlLXhvciBib29sZWFuPyBib3VuZC1pZGVudGlmaWVyPT8gYm94IGJveC1jYXMhCisgICAgICAgICAgYm94LWltbXV0YWJsZSBib3g/IGJyZWFrLWVuYWJsZWQgYnJlYWstdGhyZWFkIGJ1aWxkLXBhdGgKKyAgICAgICAgICBidWlsZC1wYXRoL2NvbnZlbnRpb24tdHlwZSBieXRlLXByZWdleHAgYnl0ZS1wcmVnZXhwPworICAgICAgICAgIGJ5dGUtcmVhZHk/IGJ5dGUtcmVnZXhwIGJ5dGUtcmVnZXhwPyBieXRlPyBieXRlcworICAgICAgICAgIGJ5dGVzLT5pbW11dGFibGUtYnl0ZXMgYnl0ZXMtPmxpc3QgYnl0ZXMtPnBhdGgKKyAgICAgICAgICBieXRlcy0+cGF0aC1lbGVtZW50IGJ5dGVzLT5zdHJpbmcvbGF0aW4tMQorICAgICAgICAgIGJ5dGVzLT5zdHJpbmcvbG9jYWxlIGJ5dGVzLT5zdHJpbmcvdXRmLTggYnl0ZXMtYXBwZW5kCisgICAgICAgICAgYnl0ZXMtY2xvc2UtY29udmVydGVyIGJ5dGVzLWNvbnZlcnQgYnl0ZXMtY29udmVydC1lbmQKKyAgICAgICAgICBieXRlcy1jb252ZXJ0ZXI/IGJ5dGVzLWNvcHkgYnl0ZXMtY29weSEKKyAgICAgICAgICBieXRlcy1lbnZpcm9ubWVudC12YXJpYWJsZS1uYW1lPyBieXRlcy1maWxsISBieXRlcy1sZW5ndGgKKyAgICAgICAgICBieXRlcy1vcGVuLWNvbnZlcnRlciBieXRlcy1yZWYgYnl0ZXMtc2V0ISBieXRlcy11dGYtOC1pbmRleAorICAgICAgICAgIGJ5dGVzLXV0Zi04LWxlbmd0aCBieXRlcy11dGYtOC1yZWYgYnl0ZXM8PyBieXRlcz0/IGJ5dGVzPj8KKyAgICAgICAgICBieXRlcz8gY2FhYWFyIGNhYWFkciBjYWFhciBjYWFkYXIgY2FhZGRyIGNhYWRyIGNhYXIgY2FkYWFyCisgICAgICAgICAgY2FkYWRyIGNhZGFyIGNhZGRhciBjYWRkZHIgY2FkZHIgY2FkciBjYWxsLWluLW5lc3RlZC10aHJlYWQKKyAgICAgICAgICBjYWxsLXdpdGgtYnJlYWstcGFyYW1ldGVyaXphdGlvbgorICAgICAgICAgIGNhbGwtd2l0aC1jb21wb3NhYmxlLWNvbnRpbnVhdGlvbgorICAgICAgICAgIGNhbGwtd2l0aC1jb250aW51YXRpb24tYmFycmllciBjYWxsLXdpdGgtY29udGludWF0aW9uLXByb21wdAorICAgICAgICAgIGNhbGwtd2l0aC1jdXJyZW50LWNvbnRpbnVhdGlvbgorICAgICAgICAgIGNhbGwtd2l0aC1kZWZhdWx0LXJlYWRpbmctcGFyYW1ldGVyaXphdGlvbgorICAgICAgICAgIGNhbGwtd2l0aC1lc2NhcGUtY29udGludWF0aW9uIGNhbGwtd2l0aC1leGNlcHRpb24taGFuZGxlcgorICAgICAgICAgIGNhbGwtd2l0aC1pbW1lZGlhdGUtY29udGludWF0aW9uLW1hcmsgY2FsbC13aXRoLWlucHV0LWZpbGUKKyAgICAgICAgICBjYWxsLXdpdGgtb3V0cHV0LWZpbGUgY2FsbC13aXRoLXBhcmFtZXRlcml6YXRpb24KKyAgICAgICAgICBjYWxsLXdpdGgtc2VtYXBob3JlIGNhbGwtd2l0aC1zZW1hcGhvcmUvZW5hYmxlLWJyZWFrCisgICAgICAgICAgY2FsbC13aXRoLXZhbHVlcyBjYWxsL2NjIGNhbGwvZWMgY2FyIGNkYWFhciBjZGFhZHIgY2RhYXIKKyAgICAgICAgICBjZGFkYXIgY2RhZGRyIGNkYWRyIGNkYXIgY2RkYWFyIGNkZGFkciBjZGRhciBjZGRkYXIgY2RkZGRyCisgICAgICAgICAgY2RkZHIgY2RkciBjZHIgY2VpbGluZyBjaGFubmVsLWdldCBjaGFubmVsLXB1dAorICAgICAgICAgIGNoYW5uZWwtcHV0LWV2dCBjaGFubmVsLXB1dC1ldnQ/IGNoYW5uZWwtdHJ5LWdldCBjaGFubmVsPworICAgICAgICAgIGNoYXBlcm9uZS1ib3ggY2hhcGVyb25lLWNvbnRpbnVhdGlvbi1tYXJrLWtleSBjaGFwZXJvbmUtZXZ0CisgICAgICAgICAgY2hhcGVyb25lLWhhc2ggY2hhcGVyb25lLW9mPyBjaGFwZXJvbmUtcHJvY2VkdXJlCisgICAgICAgICAgY2hhcGVyb25lLXByb21wdC10YWcgY2hhcGVyb25lLXN0cnVjdCBjaGFwZXJvbmUtc3RydWN0LXR5cGUKKyAgICAgICAgICBjaGFwZXJvbmUtdmVjdG9yIGNoYXBlcm9uZT8gY2hhci0+aW50ZWdlciBjaGFyLWFscGhhYmV0aWM/CisgICAgICAgICAgY2hhci1ibGFuaz8gY2hhci1jaTw9PyBjaGFyLWNpPD8gY2hhci1jaT0/IGNoYXItY2k+PT8KKyAgICAgICAgICBjaGFyLWNpPj8gY2hhci1kb3duY2FzZSBjaGFyLWZvbGRjYXNlIGNoYXItZ2VuZXJhbC1jYXRlZ29yeQorICAgICAgICAgIGNoYXItZ3JhcGhpYz8gY2hhci1pc28tY29udHJvbD8gY2hhci1sb3dlci1jYXNlPworICAgICAgICAgIGNoYXItbnVtZXJpYz8gY2hhci1wdW5jdHVhdGlvbj8gY2hhci1yZWFkeT8gY2hhci1zeW1ib2xpYz8KKyAgICAgICAgICBjaGFyLXRpdGxlLWNhc2U/IGNoYXItdGl0bGVjYXNlIGNoYXItdXBjYXNlIGNoYXItdXBwZXItY2FzZT8KKyAgICAgICAgICBjaGFyLXV0Zi04LWxlbmd0aCBjaGFyLXdoaXRlc3BhY2U/IGNoYXI8PT8gY2hhcjw/IGNoYXI9PworICAgICAgICAgIGNoYXI+PT8gY2hhcj4/IGNoYXI/IGNoZWNrLWR1cGxpY2F0ZS1pZGVudGlmaWVyCisgICAgICAgICAgY2hlY2tlZC1wcm9jZWR1cmUtY2hlY2stYW5kLWV4dHJhY3QgY2hvaWNlLWV2dCBjbGVhbnNlLXBhdGgKKyAgICAgICAgICBjbG9zZS1pbnB1dC1wb3J0IGNsb3NlLW91dHB1dC1wb3J0IGNvbGxlY3QtZ2FyYmFnZQorICAgICAgICAgIGNvbGxlY3Rpb24tZmlsZS1wYXRoIGNvbGxlY3Rpb24tcGF0aCBjb21waWxlCisgICAgICAgICAgY29tcGlsZS1hbGxvdy1zZXQhLXVuZGVmaW5lZAorICAgICAgICAgIGNvbXBpbGUtY29udGV4dC1wcmVzZXJ2YXRpb24tZW5hYmxlZAorICAgICAgICAgIGNvbXBpbGUtZW5mb3JjZS1tb2R1bGUtY29uc3RhbnRzIGNvbXBpbGUtc3ludGF4CisgICAgICAgICAgY29tcGlsZWQtZXhwcmVzc2lvbj8gY29tcGlsZWQtbW9kdWxlLWV4cHJlc3Npb24/CisgICAgICAgICAgY29tcGxldGUtcGF0aD8gY29tcGxleD8gY29ucyBjb250aW51YXRpb24tbWFyay1rZXk/CisgICAgICAgICAgY29udGludWF0aW9uLW1hcmstc2V0LT5jb250ZXh0IGNvbnRpbnVhdGlvbi1tYXJrLXNldC0+bGlzdAorICAgICAgICAgIGNvbnRpbnVhdGlvbi1tYXJrLXNldC0+bGlzdCogY29udGludWF0aW9uLW1hcmstc2V0LWZpcnN0CisgICAgICAgICAgY29udGludWF0aW9uLW1hcmstc2V0PyBjb250aW51YXRpb24tbWFya3MKKyAgICAgICAgICBjb250aW51YXRpb24tcHJvbXB0LWF2YWlsYWJsZT8gY29udGludWF0aW9uLXByb21wdC10YWc/CisgICAgICAgICAgY29udGludWF0aW9uPyBjb3B5LWZpbGUgY29zIGN1cnJlbnQtYnJlYWstcGFyYW1ldGVyaXphdGlvbgorICAgICAgICAgIGN1cnJlbnQtY29kZS1pbnNwZWN0b3IgY3VycmVudC1jb21tYW5kLWxpbmUtYXJndW1lbnRzCisgICAgICAgICAgY3VycmVudC1jb21waWxlIGN1cnJlbnQtY29tcGlsZWQtZmlsZS1yb290cworICAgICAgICAgIGN1cnJlbnQtY29udGludWF0aW9uLW1hcmtzIGN1cnJlbnQtY3VzdG9kaWFuCisgICAgICAgICAgY3VycmVudC1kaXJlY3RvcnkgY3VycmVudC1kaXJlY3RvcnktZm9yLXVzZXIgY3VycmVudC1kcml2ZQorICAgICAgICAgIGN1cnJlbnQtZW52aXJvbm1lbnQtdmFyaWFibGVzIGN1cnJlbnQtZXJyb3ItcG9ydAorICAgICAgICAgIGN1cnJlbnQtZXZhbCBjdXJyZW50LWV2dC1wc2V1ZG8tcmFuZG9tLWdlbmVyYXRvcgorICAgICAgICAgIGN1cnJlbnQtZ2MtbWlsbGlzZWNvbmRzIGN1cnJlbnQtZ2V0LWludGVyYWN0aW9uLWlucHV0LXBvcnQKKyAgICAgICAgICBjdXJyZW50LWluZXhhY3QtbWlsbGlzZWNvbmRzIGN1cnJlbnQtaW5wdXQtcG9ydAorICAgICAgICAgIGN1cnJlbnQtaW5zcGVjdG9yIGN1cnJlbnQtbGlicmFyeS1jb2xsZWN0aW9uLXBhdGhzCisgICAgICAgICAgY3VycmVudC1sb2FkIGN1cnJlbnQtbG9hZC1leHRlbnNpb24KKyAgICAgICAgICBjdXJyZW50LWxvYWQtcmVsYXRpdmUtZGlyZWN0b3J5IGN1cnJlbnQtbG9hZC91c2UtY29tcGlsZWQKKyAgICAgICAgICBjdXJyZW50LWxvY2FsZSBjdXJyZW50LW1lbW9yeS11c2UgY3VycmVudC1taWxsaXNlY29uZHMKKyAgICAgICAgICBjdXJyZW50LW1vZHVsZS1kZWNsYXJlLW5hbWUgY3VycmVudC1tb2R1bGUtZGVjbGFyZS1zb3VyY2UKKyAgICAgICAgICBjdXJyZW50LW1vZHVsZS1uYW1lLXJlc29sdmVyIGN1cnJlbnQtbW9kdWxlLXBhdGgtZm9yLWxvYWQKKyAgICAgICAgICBjdXJyZW50LW5hbWVzcGFjZSBjdXJyZW50LW91dHB1dC1wb3J0CisgICAgICAgICAgY3VycmVudC1wYXJhbWV0ZXJpemF0aW9uCisgICAgICAgICAgY3VycmVudC1wcmVzZXJ2ZWQtdGhyZWFkLWNlbGwtdmFsdWVzIGN1cnJlbnQtcHJpbnQKKyAgICAgICAgICBjdXJyZW50LXByb2Nlc3MtbWlsbGlzZWNvbmRzIGN1cnJlbnQtcHJvbXB0LXJlYWQKKyAgICAgICAgICBjdXJyZW50LXBzZXVkby1yYW5kb20tZ2VuZXJhdG9yIGN1cnJlbnQtcmVhZC1pbnRlcmFjdGlvbgorICAgICAgICAgIGN1cnJlbnQtcmVhZGVyLWd1YXJkIGN1cnJlbnQtcmVhZHRhYmxlIGN1cnJlbnQtc2Vjb25kcworICAgICAgICAgIGN1cnJlbnQtc2VjdXJpdHktZ3VhcmQgY3VycmVudC1zdWJwcm9jZXNzLWN1c3RvZGlhbi1tb2RlCisgICAgICAgICAgY3VycmVudC10aHJlYWQgY3VycmVudC10aHJlYWQtZ3JvdXAKKyAgICAgICAgICBjdXJyZW50LXRocmVhZC1pbml0aWFsLXN0YWNrLXNpemUKKyAgICAgICAgICBjdXJyZW50LXdyaXRlLXJlbGF0aXZlLWRpcmVjdG9yeSBjdXN0b2RpYW4tYm94LXZhbHVlCisgICAgICAgICAgY3VzdG9kaWFuLWJveD8gY3VzdG9kaWFuLWxpbWl0LW1lbW9yeSBjdXN0b2RpYW4tbWFuYWdlZC1saXN0CisgICAgICAgICAgY3VzdG9kaWFuLW1lbW9yeS1hY2NvdW50aW5nLWF2YWlsYWJsZT8KKyAgICAgICAgICBjdXN0b2RpYW4tcmVxdWlyZS1tZW1vcnkgY3VzdG9kaWFuLXNodXRkb3duLWFsbCBjdXN0b2RpYW4/CisgICAgICAgICAgY3VzdG9tLXByaW50LXF1b3RhYmxlLWFjY2Vzc29yIGN1c3RvbS1wcmludC1xdW90YWJsZT8KKyAgICAgICAgICBjdXN0b20td3JpdGUtYWNjZXNzb3IgY3VzdG9tLXdyaXRlPyBkYXRlIGRhdGUqCisgICAgICAgICAgZGF0ZSotbmFub3NlY29uZCBkYXRlKi10aW1lLXpvbmUtbmFtZSBkYXRlKj8gZGF0ZS1kYXkKKyAgICAgICAgICBkYXRlLWRzdD8gZGF0ZS1ob3VyIGRhdGUtbWludXRlIGRhdGUtbW9udGggZGF0ZS1zZWNvbmQKKyAgICAgICAgICBkYXRlLXRpbWUtem9uZS1vZmZzZXQgZGF0ZS13ZWVrLWRheSBkYXRlLXllYXIgZGF0ZS15ZWFyLWRheQorICAgICAgICAgIGRhdGU/IGRhdHVtLWludGVybi1saXRlcmFsIGRlZmF1bHQtY29udGludWF0aW9uLXByb21wdC10YWcKKyAgICAgICAgICBkZWxldGUtZGlyZWN0b3J5IGRlbGV0ZS1maWxlIGRlbm9taW5hdG9yIGRpcmVjdG9yeS1leGlzdHM/CisgICAgICAgICAgZGlyZWN0b3J5LWxpc3QgZGlzcGxheSBkaXNwbGF5bG4gZHVtcC1tZW1vcnktc3RhdHMKKyAgICAgICAgICBkeW5hbWljLXJlcXVpcmUgZHluYW1pYy1yZXF1aXJlLWZvci1zeW50YXggZHluYW1pYy13aW5kCisgICAgICAgICAgZW52aXJvbm1lbnQtdmFyaWFibGVzLWNvcHkgZW52aXJvbm1lbnQtdmFyaWFibGVzLW5hbWVzCisgICAgICAgICAgZW52aXJvbm1lbnQtdmFyaWFibGVzLXJlZiBlbnZpcm9ubWVudC12YXJpYWJsZXMtc2V0IQorICAgICAgICAgIGVudmlyb25tZW50LXZhcmlhYmxlcz8gZW9mIGVvZi1vYmplY3Q/IGVwaGVtZXJvbi12YWx1ZQorICAgICAgICAgIGVwaGVtZXJvbj8gZXByaW50ZiBlcS1oYXNoLWNvZGUgZXE/IGVxdWFsLWhhc2gtY29kZQorICAgICAgICAgIGVxdWFsLXNlY29uZGFyeS1oYXNoLWNvZGUgZXF1YWw/IGVxdWFsPy9yZWN1ciBlcXYtaGFzaC1jb2RlCisgICAgICAgICAgZXF2PyBlcnJvciBlcnJvci1kaXNwbGF5LWhhbmRsZXIgZXJyb3ItZXNjYXBlLWhhbmRsZXIKKyAgICAgICAgICBlcnJvci1wcmludC1jb250ZXh0LWxlbmd0aCBlcnJvci1wcmludC1zb3VyY2UtbG9jYXRpb24KKyAgICAgICAgICBlcnJvci1wcmludC13aWR0aCBlcnJvci12YWx1ZS0+c3RyaW5nLWhhbmRsZXIgZXZhbAorICAgICAgICAgIGV2YWwtaml0LWVuYWJsZWQgZXZhbC1zeW50YXggZXZlbj8gZXZ0PyBleGFjdC0+aW5leGFjdAorICAgICAgICAgIGV4YWN0LWludGVnZXI/IGV4YWN0LW5vbm5lZ2F0aXZlLWludGVnZXI/CisgICAgICAgICAgZXhhY3QtcG9zaXRpdmUtaW50ZWdlcj8gZXhhY3Q/IGV4ZWN1dGFibGUteWllbGQtaGFuZGxlciBleGl0CisgICAgICAgICAgZXhpdC1oYW5kbGVyIGV4biBleG4tY29udGludWF0aW9uLW1hcmtzIGV4bi1tZXNzYWdlCisgICAgICAgICAgZXhuOmJyZWFrIGV4bjpicmVhay1jb250aW51YXRpb24gZXhuOmJyZWFrOmhhbmctdXAKKyAgICAgICAgICBleG46YnJlYWs6aGFuZy11cD8gZXhuOmJyZWFrOnRlcm1pbmF0ZSBleG46YnJlYWs6dGVybWluYXRlPworICAgICAgICAgIGV4bjpicmVhaz8gZXhuOmZhaWwgZXhuOmZhaWw6Y29udHJhY3QKKyAgICAgICAgICBleG46ZmFpbDpjb250cmFjdDphcml0eSBleG46ZmFpbDpjb250cmFjdDphcml0eT8KKyAgICAgICAgICBleG46ZmFpbDpjb250cmFjdDpjb250aW51YXRpb24KKyAgICAgICAgICBleG46ZmFpbDpjb250cmFjdDpjb250aW51YXRpb24/CisgICAgICAgICAgZXhuOmZhaWw6Y29udHJhY3Q6ZGl2aWRlLWJ5LXplcm8KKyAgICAgICAgICBleG46ZmFpbDpjb250cmFjdDpkaXZpZGUtYnktemVybz8KKyAgICAgICAgICBleG46ZmFpbDpjb250cmFjdDpub24tZml4bnVtLXJlc3VsdAorICAgICAgICAgIGV4bjpmYWlsOmNvbnRyYWN0Om5vbi1maXhudW0tcmVzdWx0PworICAgICAgICAgIGV4bjpmYWlsOmNvbnRyYWN0OnZhcmlhYmxlIGV4bjpmYWlsOmNvbnRyYWN0OnZhcmlhYmxlLWlkCisgICAgICAgICAgZXhuOmZhaWw6Y29udHJhY3Q6dmFyaWFibGU/IGV4bjpmYWlsOmNvbnRyYWN0PworICAgICAgICAgIGV4bjpmYWlsOmZpbGVzeXN0ZW0gZXhuOmZhaWw6ZmlsZXN5c3RlbTplcnJubworICAgICAgICAgIGV4bjpmYWlsOmZpbGVzeXN0ZW06ZXJybm8tZXJybm8gZXhuOmZhaWw6ZmlsZXN5c3RlbTplcnJubz8KKyAgICAgICAgICBleG46ZmFpbDpmaWxlc3lzdGVtOmV4aXN0cyBleG46ZmFpbDpmaWxlc3lzdGVtOmV4aXN0cz8KKyAgICAgICAgICBleG46ZmFpbDpmaWxlc3lzdGVtOm1pc3NpbmctbW9kdWxlCisgICAgICAgICAgZXhuOmZhaWw6ZmlsZXN5c3RlbTptaXNzaW5nLW1vZHVsZS1wYXRoCisgICAgICAgICAgZXhuOmZhaWw6ZmlsZXN5c3RlbTptaXNzaW5nLW1vZHVsZT8KKyAgICAgICAgICBleG46ZmFpbDpmaWxlc3lzdGVtOnZlcnNpb24gZXhuOmZhaWw6ZmlsZXN5c3RlbTp2ZXJzaW9uPworICAgICAgICAgIGV4bjpmYWlsOmZpbGVzeXN0ZW0/IGV4bjpmYWlsOm5ldHdvcmsgZXhuOmZhaWw6bmV0d29yazplcnJubworICAgICAgICAgIGV4bjpmYWlsOm5ldHdvcms6ZXJybm8tZXJybm8gZXhuOmZhaWw6bmV0d29yazplcnJubz8KKyAgICAgICAgICBleG46ZmFpbDpuZXR3b3JrPyBleG46ZmFpbDpvdXQtb2YtbWVtb3J5CisgICAgICAgICAgZXhuOmZhaWw6b3V0LW9mLW1lbW9yeT8gZXhuOmZhaWw6cmVhZCBleG46ZmFpbDpyZWFkLXNyY2xvY3MKKyAgICAgICAgICBleG46ZmFpbDpyZWFkOmVvZiBleG46ZmFpbDpyZWFkOmVvZj8gZXhuOmZhaWw6cmVhZDpub24tY2hhcgorICAgICAgICAgIGV4bjpmYWlsOnJlYWQ6bm9uLWNoYXI/IGV4bjpmYWlsOnJlYWQ/IGV4bjpmYWlsOnN5bnRheAorICAgICAgICAgIGV4bjpmYWlsOnN5bnRheC1leHBycyBleG46ZmFpbDpzeW50YXg6bWlzc2luZy1tb2R1bGUKKyAgICAgICAgICBleG46ZmFpbDpzeW50YXg6bWlzc2luZy1tb2R1bGUtcGF0aAorICAgICAgICAgIGV4bjpmYWlsOnN5bnRheDptaXNzaW5nLW1vZHVsZT8gZXhuOmZhaWw6c3ludGF4OnVuYm91bmQKKyAgICAgICAgICBleG46ZmFpbDpzeW50YXg6dW5ib3VuZD8gZXhuOmZhaWw6c3ludGF4PworICAgICAgICAgIGV4bjpmYWlsOnVuc3VwcG9ydGVkIGV4bjpmYWlsOnVuc3VwcG9ydGVkPyBleG46ZmFpbDp1c2VyCisgICAgICAgICAgZXhuOmZhaWw6dXNlcj8gZXhuOmZhaWw/IGV4bjptaXNzaW5nLW1vZHVsZS1hY2Nlc3NvcgorICAgICAgICAgIGV4bjptaXNzaW5nLW1vZHVsZT8gZXhuOnNyY2xvY3MtYWNjZXNzb3IgZXhuOnNyY2xvY3M/IGV4bj8KKyAgICAgICAgICBleHAgZXhwYW5kIGV4cGFuZC1vbmNlIGV4cGFuZC1zeW50YXggZXhwYW5kLXN5bnRheC1vbmNlCisgICAgICAgICAgZXhwYW5kLXN5bnRheC10by10b3AtZm9ybSBleHBhbmQtdG8tdG9wLWZvcm0KKyAgICAgICAgICBleHBhbmQtdXNlci1wYXRoIGV4cGxvZGUtcGF0aCBleHB0IGZpbGUtZXhpc3RzPworICAgICAgICAgIGZpbGUtb3ItZGlyZWN0b3J5LWlkZW50aXR5IGZpbGUtb3ItZGlyZWN0b3J5LW1vZGlmeS1zZWNvbmRzCisgICAgICAgICAgZmlsZS1vci1kaXJlY3RvcnktcGVybWlzc2lvbnMgZmlsZS1wb3NpdGlvbiBmaWxlLXBvc2l0aW9uKgorICAgICAgICAgIGZpbGUtc2l6ZSBmaWxlLXN0cmVhbS1idWZmZXItbW9kZSBmaWxlLXN0cmVhbS1wb3J0PworICAgICAgICAgIGZpbGUtdHJ1bmNhdGUgZmlsZXN5c3RlbS1jaGFuZ2UtZXZ0CisgICAgICAgICAgZmlsZXN5c3RlbS1jaGFuZ2UtZXZ0LWNhbmNlbCBmaWxlc3lzdGVtLWNoYW5nZS1ldnQ/CisgICAgICAgICAgZmlsZXN5c3RlbS1yb290LWxpc3QgZmluZC1leGVjdXRhYmxlLXBhdGgKKyAgICAgICAgICBmaW5kLWxpYnJhcnktY29sbGVjdGlvbi1wYXRocyBmaW5kLXN5c3RlbS1wYXRoIGZpeG51bT8KKyAgICAgICAgICBmbG9hdGluZy1wb2ludC1ieXRlcy0+cmVhbCBmbG9udW0/IGZsb29yIGZsdXNoLW91dHB1dAorICAgICAgICAgIGZvci1lYWNoIGZvcm1hdCBmcHJpbnRmIGZyZWUtaWRlbnRpZmllcj0/IGdjZAorICAgICAgICAgIGdlbmVyYXRlLXRlbXBvcmFyaWVzIGdlbnN5bSBnZXQtb3V0cHV0LWJ5dGVzCisgICAgICAgICAgZ2V0LW91dHB1dC1zdHJpbmcgZ2V0ZW52IGdsb2JhbC1wb3J0LXByaW50LWhhbmRsZXIgZ3VhcmQtZXZ0CisgICAgICAgICAgaGFuZGxlLWV2dCBoYW5kbGUtZXZ0PyBoYXNoIGhhc2gtZXF1YWw/IGhhc2gtZXF2PworICAgICAgICAgIGhhc2gtaGFzLWtleT8gaGFzaC1wbGFjZWhvbGRlcj8gaGFzaC1yZWYhIGhhc2hlcSBoYXNoZXF2CisgICAgICAgICAgaWRlbnRpZmllci1iaW5kaW5nIGlkZW50aWZpZXItYmluZGluZy1zeW1ib2wKKyAgICAgICAgICBpZGVudGlmaWVyLWxhYmVsLWJpbmRpbmcgaWRlbnRpZmllci1wcnVuZS1sZXhpY2FsLWNvbnRleHQKKyAgICAgICAgICBpZGVudGlmaWVyLXBydW5lLXRvLXNvdXJjZS1tb2R1bGUKKyAgICAgICAgICBpZGVudGlmaWVyLXJlbW92ZS1mcm9tLWRlZmluaXRpb24tY29udGV4dAorICAgICAgICAgIGlkZW50aWZpZXItdGVtcGxhdGUtYmluZGluZyBpZGVudGlmaWVyLXRyYW5zZm9ybWVyLWJpbmRpbmcKKyAgICAgICAgICBpZGVudGlmaWVyPyBpbWFnLXBhcnQgaW1tdXRhYmxlPyBpbXBlcnNvbmF0ZS1ib3gKKyAgICAgICAgICBpbXBlcnNvbmF0ZS1jb250aW51YXRpb24tbWFyay1rZXkgaW1wZXJzb25hdGUtaGFzaAorICAgICAgICAgIGltcGVyc29uYXRlLXByb2NlZHVyZSBpbXBlcnNvbmF0ZS1wcm9tcHQtdGFnCisgICAgICAgICAgaW1wZXJzb25hdGUtc3RydWN0IGltcGVyc29uYXRlLXZlY3RvciBpbXBlcnNvbmF0b3ItZXBoZW1lcm9uCisgICAgICAgICAgaW1wZXJzb25hdG9yLW9mPyBpbXBlcnNvbmF0b3ItcHJvcDphcHBsaWNhdGlvbi1tYXJrCisgICAgICAgICAgaW1wZXJzb25hdG9yLXByb3BlcnR5LWFjY2Vzc29yLXByb2NlZHVyZT8KKyAgICAgICAgICBpbXBlcnNvbmF0b3ItcHJvcGVydHk/IGltcGVyc29uYXRvcj8gaW5leGFjdC0+ZXhhY3QKKyAgICAgICAgICBpbmV4YWN0LXJlYWw/IGluZXhhY3Q/IGlucHV0LXBvcnQ/IGluc3BlY3Rvcj8gaW50ZWdlci0+Y2hhcgorICAgICAgICAgIGludGVnZXItPmludGVnZXItYnl0ZXMgaW50ZWdlci1ieXRlcy0+aW50ZWdlciBpbnRlZ2VyLWxlbmd0aAorICAgICAgICAgIGludGVnZXItc3FydCBpbnRlZ2VyLXNxcnQvcmVtYWluZGVyIGludGVnZXI/CisgICAgICAgICAgaW50ZXJuYWwtZGVmaW5pdGlvbi1jb250ZXh0LXNlYWwKKyAgICAgICAgICBpbnRlcm5hbC1kZWZpbml0aW9uLWNvbnRleHQ/IGtleXdvcmQtPnN0cmluZyBrZXl3b3JkPD8KKyAgICAgICAgICBrZXl3b3JkPyBraWxsLXRocmVhZCBsY20gbGVuZ3RoIGxpYmVyYWwtZGVmaW5lLWNvbnRleHQ/CisgICAgICAgICAgbGluay1leGlzdHM/IGxpc3QgbGlzdCogbGlzdC0+Ynl0ZXMgbGlzdC0+c3RyaW5nCisgICAgICAgICAgbGlzdC0+dmVjdG9yIGxpc3QtcmVmIGxpc3QtdGFpbCBsaXN0PyBsb2FkIGxvYWQtZXh0ZW5zaW9uCisgICAgICAgICAgbG9hZC1vbi1kZW1hbmQtZW5hYmxlZCBsb2FkLXJlbGF0aXZlIGxvYWQtcmVsYXRpdmUtZXh0ZW5zaW9uCisgICAgICAgICAgbG9hZC9jZCBsb2FkL3VzZS1jb21waWxlZCBsb2NhbC1leHBhbmQKKyAgICAgICAgICBsb2NhbC1leHBhbmQvY2FwdHVyZS1saWZ0cyBsb2NhbC10cmFuc2Zvcm1lci1leHBhbmQKKyAgICAgICAgICBsb2NhbC10cmFuc2Zvcm1lci1leHBhbmQvY2FwdHVyZS1saWZ0cworICAgICAgICAgIGxvY2FsZS1zdHJpbmctZW5jb2RpbmcgbG9nIGxvZy1tYXgtbGV2ZWwgbWFnbml0dWRlCisgICAgICAgICAgbWFrZS1hcml0eS1hdC1sZWFzdCBtYWtlLWJ5dGVzIG1ha2UtY2hhbm5lbAorICAgICAgICAgIG1ha2UtY29udGludWF0aW9uLW1hcmsta2V5IG1ha2UtY29udGludWF0aW9uLXByb21wdC10YWcKKyAgICAgICAgICBtYWtlLWN1c3RvZGlhbiBtYWtlLWN1c3RvZGlhbi1ib3ggbWFrZS1kYXRlIG1ha2UtZGF0ZSoKKyAgICAgICAgICBtYWtlLWRlcml2ZWQtcGFyYW1ldGVyIG1ha2UtZGlyZWN0b3J5CisgICAgICAgICAgbWFrZS1lbnZpcm9ubWVudC12YXJpYWJsZXMgbWFrZS1lcGhlbWVyb24gbWFrZS1leG4KKyAgICAgICAgICBtYWtlLWV4bjpicmVhayBtYWtlLWV4bjpicmVhazpoYW5nLXVwCisgICAgICAgICAgbWFrZS1leG46YnJlYWs6dGVybWluYXRlIG1ha2UtZXhuOmZhaWwKKyAgICAgICAgICBtYWtlLWV4bjpmYWlsOmNvbnRyYWN0IG1ha2UtZXhuOmZhaWw6Y29udHJhY3Q6YXJpdHkKKyAgICAgICAgICBtYWtlLWV4bjpmYWlsOmNvbnRyYWN0OmNvbnRpbnVhdGlvbgorICAgICAgICAgIG1ha2UtZXhuOmZhaWw6Y29udHJhY3Q6ZGl2aWRlLWJ5LXplcm8KKyAgICAgICAgICBtYWtlLWV4bjpmYWlsOmNvbnRyYWN0Om5vbi1maXhudW0tcmVzdWx0CisgICAgICAgICAgbWFrZS1leG46ZmFpbDpjb250cmFjdDp2YXJpYWJsZSBtYWtlLWV4bjpmYWlsOmZpbGVzeXN0ZW0KKyAgICAgICAgICBtYWtlLWV4bjpmYWlsOmZpbGVzeXN0ZW06ZXJybm8KKyAgICAgICAgICBtYWtlLWV4bjpmYWlsOmZpbGVzeXN0ZW06ZXhpc3RzCisgICAgICAgICAgbWFrZS1leG46ZmFpbDpmaWxlc3lzdGVtOm1pc3NpbmctbW9kdWxlCisgICAgICAgICAgbWFrZS1leG46ZmFpbDpmaWxlc3lzdGVtOnZlcnNpb24gbWFrZS1leG46ZmFpbDpuZXR3b3JrCisgICAgICAgICAgbWFrZS1leG46ZmFpbDpuZXR3b3JrOmVycm5vIG1ha2UtZXhuOmZhaWw6b3V0LW9mLW1lbW9yeQorICAgICAgICAgIG1ha2UtZXhuOmZhaWw6cmVhZCBtYWtlLWV4bjpmYWlsOnJlYWQ6ZW9mCisgICAgICAgICAgbWFrZS1leG46ZmFpbDpyZWFkOm5vbi1jaGFyIG1ha2UtZXhuOmZhaWw6c3ludGF4CisgICAgICAgICAgbWFrZS1leG46ZmFpbDpzeW50YXg6bWlzc2luZy1tb2R1bGUKKyAgICAgICAgICBtYWtlLWV4bjpmYWlsOnN5bnRheDp1bmJvdW5kIG1ha2UtZXhuOmZhaWw6dW5zdXBwb3J0ZWQKKyAgICAgICAgICBtYWtlLWV4bjpmYWlsOnVzZXIgbWFrZS1maWxlLW9yLWRpcmVjdG9yeS1saW5rCisgICAgICAgICAgbWFrZS1oYXNoLXBsYWNlaG9sZGVyIG1ha2UtaGFzaGVxLXBsYWNlaG9sZGVyIG1ha2UtaGFzaGVxdgorICAgICAgICAgIG1ha2UtaGFzaGVxdi1wbGFjZWhvbGRlciBtYWtlLWltbXV0YWJsZS1oYXNoZXF2CisgICAgICAgICAgbWFrZS1pbXBlcnNvbmF0b3ItcHJvcGVydHkgbWFrZS1pbnB1dC1wb3J0IG1ha2UtaW5zcGVjdG9yCisgICAgICAgICAgbWFrZS1rbm93bi1jaGFyLXJhbmdlLWxpc3QgbWFrZS1vdXRwdXQtcG9ydCBtYWtlLXBhcmFtZXRlcgorICAgICAgICAgIG1ha2UtcGhhbnRvbS1ieXRlcyBtYWtlLXBpcGUgbWFrZS1wbGFjZWhvbGRlciBtYWtlLXBvbGFyCisgICAgICAgICAgbWFrZS1wcmVmYWItc3RydWN0IG1ha2UtcHNldWRvLXJhbmRvbS1nZW5lcmF0b3IKKyAgICAgICAgICBtYWtlLXJlYWRlci1ncmFwaCBtYWtlLXJlYWR0YWJsZSBtYWtlLXJlY3Rhbmd1bGFyCisgICAgICAgICAgbWFrZS1yZW5hbWUtdHJhbnNmb3JtZXIgbWFrZS1yZXNvbHZlZC1tb2R1bGUtcGF0aAorICAgICAgICAgIG1ha2Utc2VjdXJpdHktZ3VhcmQgbWFrZS1zZW1hcGhvcmUgbWFrZS1zZXQhLXRyYW5zZm9ybWVyCisgICAgICAgICAgbWFrZS1zaGFyZWQtYnl0ZXMgbWFrZS1zaWJsaW5nLWluc3BlY3RvcgorICAgICAgICAgIG1ha2Utc3BlY2lhbC1jb21tZW50IG1ha2Utc3JjbG9jIG1ha2Utc3RyaW5nCisgICAgICAgICAgbWFrZS1zdHJ1Y3QtZmllbGQtYWNjZXNzb3IgbWFrZS1zdHJ1Y3QtZmllbGQtbXV0YXRvcgorICAgICAgICAgIG1ha2Utc3RydWN0LXR5cGUgbWFrZS1zdHJ1Y3QtdHlwZS1wcm9wZXJ0eQorICAgICAgICAgIG1ha2Utc3ludGF4LWRlbHRhLWludHJvZHVjZXIgbWFrZS1zeW50YXgtaW50cm9kdWNlcgorICAgICAgICAgIG1ha2UtdGhyZWFkLWNlbGwgbWFrZS10aHJlYWQtZ3JvdXAgbWFrZS12ZWN0b3IgbWFrZS13ZWFrLWJveAorICAgICAgICAgIG1ha2Utd2Vhay1oYXNoZXF2IG1ha2Utd2lsbC1leGVjdXRvciBtYXAgbWF4IG1jYXIgbWNkciBtY29ucworICAgICAgICAgIG1lbWJlciBtZW1xIG1lbXYgbWluIG1vZHVsZS0+ZXhwb3J0cyBtb2R1bGUtPmltcG9ydHMKKyAgICAgICAgICBtb2R1bGUtPmxhbmd1YWdlLWluZm8gbW9kdWxlLT5uYW1lc3BhY2UKKyAgICAgICAgICBtb2R1bGUtY29tcGlsZWQtY3Jvc3MtcGhhc2UtcGVyc2lzdGVudD8KKyAgICAgICAgICBtb2R1bGUtY29tcGlsZWQtZXhwb3J0cyBtb2R1bGUtY29tcGlsZWQtaW1wb3J0cworICAgICAgICAgIG1vZHVsZS1jb21waWxlZC1sYW5ndWFnZS1pbmZvIG1vZHVsZS1jb21waWxlZC1uYW1lCisgICAgICAgICAgbW9kdWxlLWNvbXBpbGVkLXN1Ym1vZHVsZXMgbW9kdWxlLWRlY2xhcmVkPworICAgICAgICAgIG1vZHVsZS1wYXRoLWluZGV4LWpvaW4gbW9kdWxlLXBhdGgtaW5kZXgtcmVzb2x2ZQorICAgICAgICAgIG1vZHVsZS1wYXRoLWluZGV4LXNwbGl0IG1vZHVsZS1wYXRoLWluZGV4LXN1Ym1vZHVsZQorICAgICAgICAgIG1vZHVsZS1wYXRoLWluZGV4PyBtb2R1bGUtcGF0aD8gbW9kdWxlLXByZWRlZmluZWQ/CisgICAgICAgICAgbW9kdWxlLXByb3ZpZGUtcHJvdGVjdGVkPyBtb2R1bG8gbXBhaXI/IG5hY2stZ3VhcmQtZXZ0CisgICAgICAgICAgbmFtZXNwYWNlLWF0dGFjaC1tb2R1bGUgbmFtZXNwYWNlLWF0dGFjaC1tb2R1bGUtZGVjbGFyYXRpb24KKyAgICAgICAgICBuYW1lc3BhY2UtYmFzZS1waGFzZSBuYW1lc3BhY2UtbWFwcGVkLXN5bWJvbHMKKyAgICAgICAgICBuYW1lc3BhY2UtbW9kdWxlLWlkZW50aWZpZXIgbmFtZXNwYWNlLW1vZHVsZS1yZWdpc3RyeQorICAgICAgICAgIG5hbWVzcGFjZS1yZXF1aXJlIG5hbWVzcGFjZS1yZXF1aXJlL2NvbnN0YW50CisgICAgICAgICAgbmFtZXNwYWNlLXJlcXVpcmUvY29weSBuYW1lc3BhY2UtcmVxdWlyZS9leHBhbnNpb24tdGltZQorICAgICAgICAgIG5hbWVzcGFjZS1zZXQtdmFyaWFibGUtdmFsdWUhIG5hbWVzcGFjZS1zeW1ib2wtPmlkZW50aWZpZXIKKyAgICAgICAgICBuYW1lc3BhY2Utc3ludGF4LWludHJvZHVjZSBuYW1lc3BhY2UtdW5kZWZpbmUtdmFyaWFibGUhCisgICAgICAgICAgbmFtZXNwYWNlLXVucHJvdGVjdC1tb2R1bGUgbmFtZXNwYWNlLXZhcmlhYmxlLXZhbHVlCisgICAgICAgICAgbmFtZXNwYWNlPyBuZWdhdGl2ZT8gbmV2ZXItZXZ0IG5ld2xpbmUgbm9ybWFsLWNhc2UtcGF0aCBub3QKKyAgICAgICAgICBudWxsIG51bGw/IG51bWJlci0+c3RyaW5nIG51bWJlcj8gbnVtZXJhdG9yIG9iamVjdC1uYW1lIG9kZD8KKyAgICAgICAgICBvcGVuLWlucHV0LWJ5dGVzIG9wZW4taW5wdXQtZmlsZSBvcGVuLWlucHV0LW91dHB1dC1maWxlCisgICAgICAgICAgb3Blbi1pbnB1dC1zdHJpbmcgb3Blbi1vdXRwdXQtYnl0ZXMgb3Blbi1vdXRwdXQtZmlsZQorICAgICAgICAgIG9wZW4tb3V0cHV0LXN0cmluZyBvcm1hcCBvdXRwdXQtcG9ydD8gcGFpcj8KKyAgICAgICAgICBwYXJhbWV0ZXItcHJvY2VkdXJlPT8gcGFyYW1ldGVyPyBwYXJhbWV0ZXJpemF0aW9uPworICAgICAgICAgIHBhdGgtPmJ5dGVzIHBhdGgtPmNvbXBsZXRlLXBhdGggcGF0aC0+ZGlyZWN0b3J5LXBhdGgKKyAgICAgICAgICBwYXRoLT5zdHJpbmcgcGF0aC1hZGQtc3VmZml4IHBhdGgtY29udmVudGlvbi10eXBlCisgICAgICAgICAgcGF0aC1lbGVtZW50LT5ieXRlcyBwYXRoLWVsZW1lbnQtPnN0cmluZworICAgICAgICAgIHBhdGgtZm9yLXNvbWUtc3lzdGVtPyBwYXRoLWxpc3Qtc3RyaW5nLT5wYXRoLWxpc3QKKyAgICAgICAgICBwYXRoLXJlcGxhY2Utc3VmZml4IHBhdGgtc3RyaW5nPyBwYXRoPyBwZWVrLWJ5dGUKKyAgICAgICAgICBwZWVrLWJ5dGUtb3Itc3BlY2lhbCBwZWVrLWJ5dGVzIHBlZWstYnl0ZXMhCisgICAgICAgICAgcGVlay1ieXRlcy1hdmFpbCEgcGVlay1ieXRlcy1hdmFpbCEqCisgICAgICAgICAgcGVlay1ieXRlcy1hdmFpbCEvZW5hYmxlLWJyZWFrIHBlZWstY2hhcgorICAgICAgICAgIHBlZWstY2hhci1vci1zcGVjaWFsIHBlZWstc3RyaW5nIHBlZWstc3RyaW5nISBwaGFudG9tLWJ5dGVzPworICAgICAgICAgIHBpcGUtY29udGVudC1sZW5ndGggcGxhY2Vob2xkZXItZ2V0IHBsYWNlaG9sZGVyLXNldCEKKyAgICAgICAgICBwbGFjZWhvbGRlcj8gcG9sbC1ndWFyZC1ldnQgcG9ydC1jbG9zZWQtZXZ0IHBvcnQtY2xvc2VkPworICAgICAgICAgIHBvcnQtY29tbWl0LXBlZWtlZCBwb3J0LWNvdW50LWxpbmVzIQorICAgICAgICAgIHBvcnQtY291bnQtbGluZXMtZW5hYmxlZCBwb3J0LWNvdW50cy1saW5lcz8KKyAgICAgICAgICBwb3J0LWRpc3BsYXktaGFuZGxlciBwb3J0LWZpbGUtaWRlbnRpdHkgcG9ydC1maWxlLXVubG9jaworICAgICAgICAgIHBvcnQtbmV4dC1sb2NhdGlvbiBwb3J0LXByaW50LWhhbmRsZXIgcG9ydC1wcm9ncmVzcy1ldnQKKyAgICAgICAgICBwb3J0LXByb3ZpZGVzLXByb2dyZXNzLWV2dHM/IHBvcnQtcmVhZC1oYW5kbGVyCisgICAgICAgICAgcG9ydC10cnktZmlsZS1sb2NrPyBwb3J0LXdyaXRlLWhhbmRsZXIgcG9ydC13cml0ZXMtYXRvbWljPworICAgICAgICAgIHBvcnQtd3JpdGVzLXNwZWNpYWw/IHBvcnQ/IHBvc2l0aXZlPyBwcmVmYWIta2V5LT5zdHJ1Y3QtdHlwZQorICAgICAgICAgIHByZWZhYi1rZXk/IHByZWZhYi1zdHJ1Y3Qta2V5IHByZWdleHAgcHJlZ2V4cD8KKyAgICAgICAgICBwcmltaXRpdmUtY2xvc3VyZT8gcHJpbWl0aXZlLXJlc3VsdC1hcml0eSBwcmltaXRpdmU/IHByaW50CisgICAgICAgICAgcHJpbnQtYXMtZXhwcmVzc2lvbiBwcmludC1ib29sZWFuLWxvbmctZm9ybSBwcmludC1ib3gKKyAgICAgICAgICBwcmludC1ncmFwaCBwcmludC1oYXNoLXRhYmxlIHByaW50LW1wYWlyLWN1cmx5LWJyYWNlcworICAgICAgICAgIHByaW50LXBhaXItY3VybHktYnJhY2VzIHByaW50LXJlYWRlci1hYmJyZXZpYXRpb25zCisgICAgICAgICAgcHJpbnQtc3RydWN0IHByaW50LXN5bnRheC13aWR0aCBwcmludC11bnJlYWRhYmxlCisgICAgICAgICAgcHJpbnQtdmVjdG9yLWxlbmd0aCBwcmludGYgcHJvY2VkdXJlLT5tZXRob2QgcHJvY2VkdXJlLWFyaXR5CisgICAgICAgICAgcHJvY2VkdXJlLWFyaXR5LWluY2x1ZGVzPyBwcm9jZWR1cmUtYXJpdHk/CisgICAgICAgICAgcHJvY2VkdXJlLWNsb3N1cmUtY29udGVudHMtZXE/IHByb2NlZHVyZS1leHRyYWN0LXRhcmdldAorICAgICAgICAgIHByb2NlZHVyZS1yZWR1Y2UtYXJpdHkgcHJvY2VkdXJlLXJlbmFtZQorICAgICAgICAgIHByb2NlZHVyZS1zdHJ1Y3QtdHlwZT8gcHJvY2VkdXJlPyBwcm9ncmVzcy1ldnQ/CisgICAgICAgICAgcHJvcDphcml0eS1zdHJpbmcgcHJvcDpjaGVja2VkLXByb2NlZHVyZQorICAgICAgICAgIHByb3A6Y3VzdG9tLXByaW50LXF1b3RhYmxlIHByb3A6Y3VzdG9tLXdyaXRlIHByb3A6ZXF1YWwraGFzaAorICAgICAgICAgIHByb3A6ZXZ0IHByb3A6ZXhuOm1pc3NpbmctbW9kdWxlIHByb3A6ZXhuOnNyY2xvY3MKKyAgICAgICAgICBwcm9wOmltcGVyc29uYXRvci1vZiBwcm9wOmlucHV0LXBvcnQKKyAgICAgICAgICBwcm9wOmxpYmVyYWwtZGVmaW5lLWNvbnRleHQgcHJvcDpvdXRwdXQtcG9ydCBwcm9wOnByb2NlZHVyZQorICAgICAgICAgIHByb3A6cmVuYW1lLXRyYW5zZm9ybWVyIHByb3A6c2V0IS10cmFuc2Zvcm1lcgorICAgICAgICAgIHBzZXVkby1yYW5kb20tZ2VuZXJhdG9yLT52ZWN0b3IKKyAgICAgICAgICBwc2V1ZG8tcmFuZG9tLWdlbmVyYXRvci12ZWN0b3I/IHBzZXVkby1yYW5kb20tZ2VuZXJhdG9yPworICAgICAgICAgIHB1dGVudiBxdW90aWVudCBxdW90aWVudC9yZW1haW5kZXIgcmFpc2UKKyAgICAgICAgICByYWlzZS1hcmd1bWVudC1lcnJvciByYWlzZS1hcmd1bWVudHMtZXJyb3IgcmFpc2UtYXJpdHktZXJyb3IKKyAgICAgICAgICByYWlzZS1taXNtYXRjaC1lcnJvciByYWlzZS1yYW5nZS1lcnJvciByYWlzZS1yZXN1bHQtZXJyb3IKKyAgICAgICAgICByYWlzZS1zeW50YXgtZXJyb3IgcmFpc2UtdHlwZS1lcnJvciByYWlzZS11c2VyLWVycm9yIHJhbmRvbQorICAgICAgICAgIHJhbmRvbS1zZWVkIHJhdGlvbmFsPyByYXRpb25hbGl6ZSByZWFkIHJlYWQtYWNjZXB0LWJhci1xdW90ZQorICAgICAgICAgIHJlYWQtYWNjZXB0LWJveCByZWFkLWFjY2VwdC1jb21waWxlZCByZWFkLWFjY2VwdC1kb3QKKyAgICAgICAgICByZWFkLWFjY2VwdC1ncmFwaCByZWFkLWFjY2VwdC1pbmZpeC1kb3QgcmVhZC1hY2NlcHQtbGFuZworICAgICAgICAgIHJlYWQtYWNjZXB0LXF1YXNpcXVvdGUgcmVhZC1hY2NlcHQtcmVhZGVyIHJlYWQtYnl0ZQorICAgICAgICAgIHJlYWQtYnl0ZS1vci1zcGVjaWFsIHJlYWQtYnl0ZXMgcmVhZC1ieXRlcyEKKyAgICAgICAgICByZWFkLWJ5dGVzLWF2YWlsISByZWFkLWJ5dGVzLWF2YWlsISoKKyAgICAgICAgICByZWFkLWJ5dGVzLWF2YWlsIS9lbmFibGUtYnJlYWsgcmVhZC1ieXRlcy1saW5lCisgICAgICAgICAgcmVhZC1jYXNlLXNlbnNpdGl2ZSByZWFkLWNoYXIgcmVhZC1jaGFyLW9yLXNwZWNpYWwKKyAgICAgICAgICByZWFkLWN1cmx5LWJyYWNlLWFzLXBhcmVuIHJlYWQtZGVjaW1hbC1hcy1pbmV4YWN0CisgICAgICAgICAgcmVhZC1ldmFsLXByaW50LWxvb3AgcmVhZC1sYW5ndWFnZSByZWFkLWxpbmUKKyAgICAgICAgICByZWFkLW9uLWRlbWFuZC1zb3VyY2UgcmVhZC1zcXVhcmUtYnJhY2tldC1hcy1wYXJlbgorICAgICAgICAgIHJlYWQtc3RyaW5nIHJlYWQtc3RyaW5nISByZWFkLXN5bnRheCByZWFkLXN5bnRheC9yZWN1cnNpdmUKKyAgICAgICAgICByZWFkL3JlY3Vyc2l2ZSByZWFkdGFibGUtbWFwcGluZyByZWFkdGFibGU/CisgICAgICAgICAgcmVhbC0+ZG91YmxlLWZsb251bSByZWFsLT5mbG9hdGluZy1wb2ludC1ieXRlcworICAgICAgICAgIHJlYWwtPnNpbmdsZS1mbG9udW0gcmVhbC1wYXJ0IHJlYWw/IHJlZ2V4cCByZWdleHAtbWF0Y2gKKyAgICAgICAgICByZWdleHAtbWF0Y2gtcGVlayByZWdleHAtbWF0Y2gtcGVlay1pbW1lZGlhdGUKKyAgICAgICAgICByZWdleHAtbWF0Y2gtcGVlay1wb3NpdGlvbnMKKyAgICAgICAgICByZWdleHAtbWF0Y2gtcGVlay1wb3NpdGlvbnMtaW1tZWRpYXRlCisgICAgICAgICAgcmVnZXhwLW1hdGNoLXBlZWstcG9zaXRpb25zLWltbWVkaWF0ZS9lbmQKKyAgICAgICAgICByZWdleHAtbWF0Y2gtcGVlay1wb3NpdGlvbnMvZW5kIHJlZ2V4cC1tYXRjaC1wb3NpdGlvbnMKKyAgICAgICAgICByZWdleHAtbWF0Y2gtcG9zaXRpb25zL2VuZCByZWdleHAtbWF0Y2gvZW5kIHJlZ2V4cC1tYXRjaD8KKyAgICAgICAgICByZWdleHAtbWF4LWxvb2tiZWhpbmQgcmVnZXhwLXJlcGxhY2UgcmVnZXhwLXJlcGxhY2UqIHJlZ2V4cD8KKyAgICAgICAgICByZWxhdGl2ZS1wYXRoPyByZW1haW5kZXIgcmVuYW1lLWZpbGUtb3ItZGlyZWN0b3J5CisgICAgICAgICAgcmVuYW1lLXRyYW5zZm9ybWVyLXRhcmdldCByZW5hbWUtdHJhbnNmb3JtZXI/IHJlcm9vdC1wYXRoCisgICAgICAgICAgcmVzb2x2ZS1wYXRoIHJlc29sdmVkLW1vZHVsZS1wYXRoLW5hbWUgcmVzb2x2ZWQtbW9kdWxlLXBhdGg/CisgICAgICAgICAgcmV2ZXJzZSByb3VuZCBzZWNvbmRzLT5kYXRlIHNlY3VyaXR5LWd1YXJkPworICAgICAgICAgIHNlbWFwaG9yZS1wZWVrLWV2dCBzZW1hcGhvcmUtcGVlay1ldnQ/IHNlbWFwaG9yZS1wb3N0CisgICAgICAgICAgc2VtYXBob3JlLXRyeS13YWl0PyBzZW1hcGhvcmUtd2FpdAorICAgICAgICAgIHNlbWFwaG9yZS13YWl0L2VuYWJsZS1icmVhayBzZW1hcGhvcmU/CisgICAgICAgICAgc2V0IS10cmFuc2Zvcm1lci1wcm9jZWR1cmUgc2V0IS10cmFuc2Zvcm1lcj8gc2V0LWJveCEKKyAgICAgICAgICBzZXQtbWNhciEgc2V0LW1jZHIhIHNldC1waGFudG9tLWJ5dGVzIQorICAgICAgICAgIHNldC1wb3J0LW5leHQtbG9jYXRpb24hIHNoYXJlZC1ieXRlcyBzaGVsbC1leGVjdXRlCisgICAgICAgICAgc2ltcGxpZnktcGF0aCBzaW4gc2luZ2xlLWZsb251bT8gc2xlZXAgc3BlY2lhbC1jb21tZW50LXZhbHVlCisgICAgICAgICAgc3BlY2lhbC1jb21tZW50PyBzcGxpdC1wYXRoIHNxcnQgc3JjbG9jIHNyY2xvYy0+c3RyaW5nCisgICAgICAgICAgc3JjbG9jLWNvbHVtbiBzcmNsb2MtbGluZSBzcmNsb2MtcG9zaXRpb24gc3JjbG9jLXNvdXJjZQorICAgICAgICAgIHNyY2xvYy1zcGFuIHNyY2xvYz8gc3RyaW5nIHN0cmluZy0+Ynl0ZXMvbGF0aW4tMQorICAgICAgICAgIHN0cmluZy0+Ynl0ZXMvbG9jYWxlIHN0cmluZy0+Ynl0ZXMvdXRmLTgKKyAgICAgICAgICBzdHJpbmctPmltbXV0YWJsZS1zdHJpbmcgc3RyaW5nLT5rZXl3b3JkIHN0cmluZy0+bGlzdAorICAgICAgICAgIHN0cmluZy0+bnVtYmVyIHN0cmluZy0+cGF0aCBzdHJpbmctPnBhdGgtZWxlbWVudAorICAgICAgICAgIHN0cmluZy0+c3ltYm9sIHN0cmluZy0+dW5pbnRlcm5lZC1zeW1ib2wKKyAgICAgICAgICBzdHJpbmctPnVucmVhZGFibGUtc3ltYm9sIHN0cmluZy1hcHBlbmQgc3RyaW5nLWNpPD0/CisgICAgICAgICAgc3RyaW5nLWNpPD8gc3RyaW5nLWNpPT8gc3RyaW5nLWNpPj0/IHN0cmluZy1jaT4/IHN0cmluZy1jb3B5CisgICAgICAgICAgc3RyaW5nLWNvcHkhIHN0cmluZy1kb3duY2FzZQorICAgICAgICAgIHN0cmluZy1lbnZpcm9ubWVudC12YXJpYWJsZS1uYW1lPyBzdHJpbmctZmlsbCEKKyAgICAgICAgICBzdHJpbmctZm9sZGNhc2Ugc3RyaW5nLWxlbmd0aCBzdHJpbmctbG9jYWxlLWNpPD8KKyAgICAgICAgICBzdHJpbmctbG9jYWxlLWNpPT8gc3RyaW5nLWxvY2FsZS1jaT4/IHN0cmluZy1sb2NhbGUtZG93bmNhc2UKKyAgICAgICAgICBzdHJpbmctbG9jYWxlLXVwY2FzZSBzdHJpbmctbG9jYWxlPD8gc3RyaW5nLWxvY2FsZT0/CisgICAgICAgICAgc3RyaW5nLWxvY2FsZT4/IHN0cmluZy1ub3JtYWxpemUtbmZjIHN0cmluZy1ub3JtYWxpemUtbmZkCisgICAgICAgICAgc3RyaW5nLW5vcm1hbGl6ZS1uZmtjIHN0cmluZy1ub3JtYWxpemUtbmZrZCBzdHJpbmctcmVmCisgICAgICAgICAgc3RyaW5nLXNldCEgc3RyaW5nLXRpdGxlY2FzZSBzdHJpbmctdXBjYXNlCisgICAgICAgICAgc3RyaW5nLXV0Zi04LWxlbmd0aCBzdHJpbmc8PT8gc3RyaW5nPD8gc3RyaW5nPT8gc3RyaW5nPj0/CisgICAgICAgICAgc3RyaW5nPj8gc3RyaW5nPyBzdHJ1Y3QtPnZlY3RvciBzdHJ1Y3QtYWNjZXNzb3ItcHJvY2VkdXJlPworICAgICAgICAgIHN0cnVjdC1jb25zdHJ1Y3Rvci1wcm9jZWR1cmU/IHN0cnVjdC1pbmZvCisgICAgICAgICAgc3RydWN0LW11dGF0b3ItcHJvY2VkdXJlPyBzdHJ1Y3QtcHJlZGljYXRlLXByb2NlZHVyZT8KKyAgICAgICAgICBzdHJ1Y3QtdHlwZS1pbmZvIHN0cnVjdC10eXBlLW1ha2UtY29uc3RydWN0b3IKKyAgICAgICAgICBzdHJ1Y3QtdHlwZS1tYWtlLXByZWRpY2F0ZQorICAgICAgICAgIHN0cnVjdC10eXBlLXByb3BlcnR5LWFjY2Vzc29yLXByb2NlZHVyZT8KKyAgICAgICAgICBzdHJ1Y3QtdHlwZS1wcm9wZXJ0eT8gc3RydWN0LXR5cGU/IHN0cnVjdDphcml0eS1hdC1sZWFzdAorICAgICAgICAgIHN0cnVjdDpkYXRlIHN0cnVjdDpkYXRlKiBzdHJ1Y3Q6ZXhuIHN0cnVjdDpleG46YnJlYWsKKyAgICAgICAgICBzdHJ1Y3Q6ZXhuOmJyZWFrOmhhbmctdXAgc3RydWN0OmV4bjpicmVhazp0ZXJtaW5hdGUKKyAgICAgICAgICBzdHJ1Y3Q6ZXhuOmZhaWwgc3RydWN0OmV4bjpmYWlsOmNvbnRyYWN0CisgICAgICAgICAgc3RydWN0OmV4bjpmYWlsOmNvbnRyYWN0OmFyaXR5CisgICAgICAgICAgc3RydWN0OmV4bjpmYWlsOmNvbnRyYWN0OmNvbnRpbnVhdGlvbgorICAgICAgICAgIHN0cnVjdDpleG46ZmFpbDpjb250cmFjdDpkaXZpZGUtYnktemVybworICAgICAgICAgIHN0cnVjdDpleG46ZmFpbDpjb250cmFjdDpub24tZml4bnVtLXJlc3VsdAorICAgICAgICAgIHN0cnVjdDpleG46ZmFpbDpjb250cmFjdDp2YXJpYWJsZSBzdHJ1Y3Q6ZXhuOmZhaWw6ZmlsZXN5c3RlbQorICAgICAgICAgIHN0cnVjdDpleG46ZmFpbDpmaWxlc3lzdGVtOmVycm5vCisgICAgICAgICAgc3RydWN0OmV4bjpmYWlsOmZpbGVzeXN0ZW06ZXhpc3RzCisgICAgICAgICAgc3RydWN0OmV4bjpmYWlsOmZpbGVzeXN0ZW06bWlzc2luZy1tb2R1bGUKKyAgICAgICAgICBzdHJ1Y3Q6ZXhuOmZhaWw6ZmlsZXN5c3RlbTp2ZXJzaW9uIHN0cnVjdDpleG46ZmFpbDpuZXR3b3JrCisgICAgICAgICAgc3RydWN0OmV4bjpmYWlsOm5ldHdvcms6ZXJybm8gc3RydWN0OmV4bjpmYWlsOm91dC1vZi1tZW1vcnkKKyAgICAgICAgICBzdHJ1Y3Q6ZXhuOmZhaWw6cmVhZCBzdHJ1Y3Q6ZXhuOmZhaWw6cmVhZDplb2YKKyAgICAgICAgICBzdHJ1Y3Q6ZXhuOmZhaWw6cmVhZDpub24tY2hhciBzdHJ1Y3Q6ZXhuOmZhaWw6c3ludGF4CisgICAgICAgICAgc3RydWN0OmV4bjpmYWlsOnN5bnRheDptaXNzaW5nLW1vZHVsZQorICAgICAgICAgIHN0cnVjdDpleG46ZmFpbDpzeW50YXg6dW5ib3VuZCBzdHJ1Y3Q6ZXhuOmZhaWw6dW5zdXBwb3J0ZWQKKyAgICAgICAgICBzdHJ1Y3Q6ZXhuOmZhaWw6dXNlciBzdHJ1Y3Q6c3JjbG9jIHN0cnVjdD8gc3ViMSBzdWJieXRlcworICAgICAgICAgIHN1YnByb2Nlc3Mgc3VicHJvY2Vzcy1ncm91cC1lbmFibGVkIHN1YnByb2Nlc3Mta2lsbAorICAgICAgICAgIHN1YnByb2Nlc3MtcGlkIHN1YnByb2Nlc3Mtc3RhdHVzIHN1YnByb2Nlc3Mtd2FpdCBzdWJwcm9jZXNzPworICAgICAgICAgIHN1YnN0cmluZyBzeW1ib2wtPnN0cmluZyBzeW1ib2wtaW50ZXJuZWQ/IHN5bWJvbC11bnJlYWRhYmxlPworICAgICAgICAgIHN5bWJvbD8gc3luYyBzeW5jL2VuYWJsZS1icmVhayBzeW5jL3RpbWVvdXQKKyAgICAgICAgICBzeW5jL3RpbWVvdXQvZW5hYmxlLWJyZWFrIHN5bnRheC0+bGlzdCBzeW50YXgtYXJtCisgICAgICAgICAgc3ludGF4LWNvbHVtbiBzeW50YXgtZGlzYXJtIHN5bnRheC1lIHN5bnRheC1saW5lCisgICAgICAgICAgc3ludGF4LWxvY2FsLWJpbmQtc3ludGF4ZXMgc3ludGF4LWxvY2FsLWNlcnRpZmllcgorICAgICAgICAgIHN5bnRheC1sb2NhbC1jb250ZXh0IHN5bnRheC1sb2NhbC1leHBhbmQtZXhwcmVzc2lvbgorICAgICAgICAgIHN5bnRheC1sb2NhbC1nZXQtc2hhZG93ZXIgc3ludGF4LWxvY2FsLWludHJvZHVjZQorICAgICAgICAgIHN5bnRheC1sb2NhbC1saWZ0LWNvbnRleHQgc3ludGF4LWxvY2FsLWxpZnQtZXhwcmVzc2lvbgorICAgICAgICAgIHN5bnRheC1sb2NhbC1saWZ0LW1vZHVsZS1lbmQtZGVjbGFyYXRpb24KKyAgICAgICAgICBzeW50YXgtbG9jYWwtbGlmdC1wcm92aWRlIHN5bnRheC1sb2NhbC1saWZ0LXJlcXVpcmUKKyAgICAgICAgICBzeW50YXgtbG9jYWwtbGlmdC12YWx1ZXMtZXhwcmVzc2lvbgorICAgICAgICAgIHN5bnRheC1sb2NhbC1tYWtlLWRlZmluaXRpb24tY29udGV4dAorICAgICAgICAgIHN5bnRheC1sb2NhbC1tYWtlLWRlbHRhLWludHJvZHVjZXIKKyAgICAgICAgICBzeW50YXgtbG9jYWwtbW9kdWxlLWRlZmluZWQtaWRlbnRpZmllcnMKKyAgICAgICAgICBzeW50YXgtbG9jYWwtbW9kdWxlLWV4cG9ydHMKKyAgICAgICAgICBzeW50YXgtbG9jYWwtbW9kdWxlLXJlcXVpcmVkLWlkZW50aWZpZXJzIHN5bnRheC1sb2NhbC1uYW1lCisgICAgICAgICAgc3ludGF4LWxvY2FsLXBoYXNlLWxldmVsIHN5bnRheC1sb2NhbC1zdWJtb2R1bGVzCisgICAgICAgICAgc3ludGF4LWxvY2FsLXRyYW5zZm9ybWluZy1tb2R1bGUtcHJvdmlkZXM/CisgICAgICAgICAgc3ludGF4LWxvY2FsLXZhbHVlIHN5bnRheC1sb2NhbC12YWx1ZS9pbW1lZGlhdGUKKyAgICAgICAgICBzeW50YXgtb3JpZ2luYWw/IHN5bnRheC1wb3NpdGlvbiBzeW50YXgtcHJvcGVydHkKKyAgICAgICAgICBzeW50YXgtcHJvcGVydHktc3ltYm9sLWtleXMgc3ludGF4LXByb3RlY3Qgc3ludGF4LXJlYXJtCisgICAgICAgICAgc3ludGF4LXJlY2VydGlmeSBzeW50YXgtc2hpZnQtcGhhc2UtbGV2ZWwgc3ludGF4LXNvdXJjZQorICAgICAgICAgIHN5bnRheC1zb3VyY2UtbW9kdWxlIHN5bnRheC1zcGFuIHN5bnRheC10YWludAorICAgICAgICAgIHN5bnRheC10YWludGVkPyBzeW50YXgtdHJhY2stb3JpZ2luCisgICAgICAgICAgc3ludGF4LXRyYW5zZm9ybWluZy1tb2R1bGUtZXhwcmVzc2lvbj8gc3ludGF4LXRyYW5zZm9ybWluZz8KKyAgICAgICAgICBzeW50YXg/IHN5c3RlbS1iaWctZW5kaWFuPyBzeXN0ZW0taWRsZS1ldnQKKyAgICAgICAgICBzeXN0ZW0tbGFuZ3VhZ2UrY291bnRyeSBzeXN0ZW0tbGlicmFyeS1zdWJwYXRoCisgICAgICAgICAgc3lzdGVtLXBhdGgtY29udmVudGlvbi10eXBlIHN5c3RlbS10eXBlIHRhbiB0ZXJtaW5hbC1wb3J0PworICAgICAgICAgIHRocmVhZCB0aHJlYWQtY2VsbC1yZWYgdGhyZWFkLWNlbGwtc2V0ISB0aHJlYWQtY2VsbC12YWx1ZXM/CisgICAgICAgICAgdGhyZWFkLWNlbGw/IHRocmVhZC1kZWFkLWV2dCB0aHJlYWQtZGVhZD8gdGhyZWFkLWdyb3VwPworICAgICAgICAgIHRocmVhZC1yZXN1bWUgdGhyZWFkLXJlc3VtZS1ldnQgdGhyZWFkLXJld2luZC1yZWNlaXZlCisgICAgICAgICAgdGhyZWFkLXJ1bm5pbmc/IHRocmVhZC1zdXNwZW5kIHRocmVhZC1zdXNwZW5kLWV2dAorICAgICAgICAgIHRocmVhZC13YWl0IHRocmVhZC9zdXNwZW5kLXRvLWtpbGwgdGhyZWFkPyB0aW1lLWFwcGx5CisgICAgICAgICAgdHJ1bmNhdGUgdW5ib3ggdW5jYXVnaHQtZXhjZXB0aW9uLWhhbmRsZXIKKyAgICAgICAgICB1c2UtY29sbGVjdGlvbi1saW5rLXBhdGhzIHVzZS1jb21waWxlZC1maWxlLXBhdGhzCisgICAgICAgICAgdXNlLXVzZXItc3BlY2lmaWMtc2VhcmNoLXBhdGhzIHZhbHVlcworICAgICAgICAgIHZhcmlhYmxlLXJlZmVyZW5jZS0+ZW1wdHktbmFtZXNwYWNlCisgICAgICAgICAgdmFyaWFibGUtcmVmZXJlbmNlLT5tb2R1bGUtYmFzZS1waGFzZQorICAgICAgICAgIHZhcmlhYmxlLXJlZmVyZW5jZS0+bW9kdWxlLWRlY2xhcmF0aW9uLWluc3BlY3RvcgorICAgICAgICAgIHZhcmlhYmxlLXJlZmVyZW5jZS0+bW9kdWxlLXBhdGgtaW5kZXgKKyAgICAgICAgICB2YXJpYWJsZS1yZWZlcmVuY2UtPm1vZHVsZS1zb3VyY2UKKyAgICAgICAgICB2YXJpYWJsZS1yZWZlcmVuY2UtPm5hbWVzcGFjZSB2YXJpYWJsZS1yZWZlcmVuY2UtPnBoYXNlCisgICAgICAgICAgdmFyaWFibGUtcmVmZXJlbmNlLT5yZXNvbHZlZC1tb2R1bGUtcGF0aAorICAgICAgICAgIHZhcmlhYmxlLXJlZmVyZW5jZS1jb25zdGFudD8gdmFyaWFibGUtcmVmZXJlbmNlPyB2ZWN0b3IKKyAgICAgICAgICB2ZWN0b3ItPmltbXV0YWJsZS12ZWN0b3IgdmVjdG9yLT5saXN0CisgICAgICAgICAgdmVjdG9yLT5wc2V1ZG8tcmFuZG9tLWdlbmVyYXRvcgorICAgICAgICAgIHZlY3Rvci0+cHNldWRvLXJhbmRvbS1nZW5lcmF0b3IhIHZlY3Rvci0+dmFsdWVzIHZlY3Rvci1maWxsIQorICAgICAgICAgIHZlY3Rvci1pbW11dGFibGUgdmVjdG9yLWxlbmd0aCB2ZWN0b3ItcmVmIHZlY3Rvci1zZXQhCisgICAgICAgICAgdmVjdG9yLXNldC1wZXJmb3JtYW5jZS1zdGF0cyEgdmVjdG9yPyB2ZXJzaW9uIHZvaWQgdm9pZD8KKyAgICAgICAgICB3ZWFrLWJveC12YWx1ZSB3ZWFrLWJveD8gd2lsbC1leGVjdXRlIHdpbGwtZXhlY3V0b3I/CisgICAgICAgICAgd2lsbC1yZWdpc3RlciB3aWxsLXRyeS1leGVjdXRlIHdpdGgtaW5wdXQtZnJvbS1maWxlCisgICAgICAgICAgd2l0aC1vdXRwdXQtdG8tZmlsZSB3cmFwLWV2dCB3cml0ZSB3cml0ZS1ieXRlIHdyaXRlLWJ5dGVzCisgICAgICAgICAgd3JpdGUtYnl0ZXMtYXZhaWwgd3JpdGUtYnl0ZXMtYXZhaWwqIHdyaXRlLWJ5dGVzLWF2YWlsLWV2dAorICAgICAgICAgIHdyaXRlLWJ5dGVzLWF2YWlsL2VuYWJsZS1icmVhayB3cml0ZS1jaGFyIHdyaXRlLXNwZWNpYWwKKyAgICAgICAgICB3cml0ZS1zcGVjaWFsLWF2YWlsKiB3cml0ZS1zcGVjaWFsLWV2dCB3cml0ZS1zdHJpbmcgemVybz8KKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgICMgU2luY2UgUmFja2V0IGFsbG93cyBpZGVudGlmaWVycyB0byBjb25zaXN0IG9mIG5lYXJseSBhbnl0aGluZywKKyAgICAgICMgaXQncyBzaW1wbGVyIHRvIGRlc2NyaWJlIHdoYXQgYW4gSUQgaXMgX25vdF8uCisgICAgICBpZCA9IC9bXlxzXChcKVxbXF1ce1x9J2AsLl0rL2kKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgIyBjb21tZW50cworICAgICAgICBydWxlIC87LiokLywgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisKKyAgICAgICAgcnVsZSAvWystXWluZlsuXVtmMF0vLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL1srLV1uYW5bLl0wLywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9bLV1taW5bLl0wLywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9bK11tYXhbLl0wLywgTnVtOjpGbG9hdAorCisgICAgICAgIHJ1bGUgLy0/XGQrXC5cZCsvLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLy0/XGQrLywgTnVtOjpJbnRlZ2VyCisKKyAgICAgICAgcnVsZSAvIzoje2lkfSsvLCBOYW1lOjpUYWcgICMga2V5d29yZAorCisgICAgICAgIHJ1bGUgLyNiWzAxXSsvLCBOdW06OkJpbgorICAgICAgICBydWxlIC8jb1swLTddKy8sIE51bTo6T2N0CisgICAgICAgIHJ1bGUgLyNkWzAtOV0rLywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLyN4WzAtOWEtZl0rL2ksIE51bTo6SGV4CisgICAgICAgIHJ1bGUgLyNbZWldW1xkLl0rLywgTnVtOjpPdGhlcgorCisgICAgICAgIHJ1bGUgLyIoXFxcXHxcXCJ8W14iXSkqIi8sIFN0cgorICAgICAgICBydWxlIC9bJ2BdI3tpZH0vaSwgU3RyOjpTeW1ib2wKKyAgICAgICAgcnVsZSAvI1xcKFsoKVwvJyIuXyFcJCUmID89Ky1dezF9fFthLXowLTldKykvaSwKKyAgICAgICAgICBTdHI6OkNoYXIKKyAgICAgICAgcnVsZSAvI3R8I2YvLCBOYW1lOjpDb25zdGFudAorICAgICAgICBydWxlIC8oPzonfCN8YHwsQHwsfFwuKS8sIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvKFsnI10pKFxzKikoXCgpL20gZG8KKyAgICAgICAgICBncm91cHMgU3RyOjpTeW1ib2wsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgICMgKCkgW10ge30gYXJlIGFsbCBwZXJtaXR0ZWQgYXMgbGlrZSBwYWlycworICAgICAgICBydWxlIC9cKHxcW3xcey8sIFB1bmN0dWF0aW9uLCA6Y29tbWFuZAorICAgICAgICBydWxlIC9cKXxcXXxcfS8sIFB1bmN0dWF0aW9uCisKKyAgICAgICAgcnVsZSBpZCwgTmFtZTo6VmFyaWFibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29tbWFuZCBkbworICAgICAgICBydWxlIGlkLCBOYW1lOjpGdW5jdGlvbiBkbyB8bXwKKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmtleXdvcmRzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLmJ1aWx0aW5zLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpGdW5jdGlvbgorICAgICAgICAgIGVuZAorCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3J1YnkucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9ydWJ5LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZGNhNzUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9ydWJ5LnJiCkBAIC0wLDAgKzEsNDE1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgUnVieSA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJSdWJ5IgorICAgICAgZGVzYyAiVGhlIFJ1YnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKHJ1YnktbGFuZy5vcmcpIgorICAgICAgdGFnICdydWJ5JworICAgICAgYWxpYXNlcyAncmInCisgICAgICBmaWxlbmFtZXMgJyoucmInLCAnKi5ydWJ5JywgJyoucmJ3JywgJyoucmFrZScsICcqLmdlbXNwZWMnLCAnKi5wb2RzcGVjJywKKyAgICAgICAgICAgICAgICAnUmFrZWZpbGUnLCAnR3VhcmRmaWxlJywgJ0dlbWZpbGUnLCAnQ2FwZmlsZScsICdQb2RmaWxlJywKKyAgICAgICAgICAgICAgICAnVmFncmFudGZpbGUnLCAnKi5ydScsICcqLnByYXduJywgJ0JlcmtzZmlsZScKKworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtcnVieScsICdhcHBsaWNhdGlvbi94LXJ1YnknCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnNoZWJhbmc/ICdydWJ5JworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzeW1ib2xzIGRvCisgICAgICAgICMgc3ltYm9scworICAgICAgICBydWxlICVyKAorICAgICAgICAgIDogICMgaW5pdGlhbCA6CisgICAgICAgICAgQHswLDJ9ICMgb3B0aW9uYWwgaXZhciwgZm9yIDpAZm9vIGFuZCA6QEBmb28KKyAgICAgICAgICBbYS16X11cdypbIT9dPyAjIHRoZSBzeW1ib2wKKyAgICAgICAgKXhpLCBTdHI6OlN5bWJvbAorCisgICAgICAgICMgc3BlY2lhbCBzeW1ib2xzCisgICAgICAgIHJ1bGUgJXIoOig/OlwqXCp8Wy0rXUB8Wy9cJSZcfF5gfl18XFtcXT0/fDw8fD4+fDw9Pz58PD0/fD09PT8pKSwKKyAgICAgICAgICBTdHI6OlN5bWJvbAorCisgICAgICAgIHJ1bGUgLzonKFxcXFx8XFwnfFteJ10pKicvLCBTdHI6OlN5bWJvbAorICAgICAgICBydWxlIC86Ii8sIFN0cjo6U3ltYm9sLCA6c2ltcGxlX3N5bQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzaWdpbF9zdHJpbmdzIGRvCisgICAgICAgICMgJS1zaWdpbGVkIHN0cmluZ3MKKyAgICAgICAgIyAlKGFiYyksICVbYWJjXSwgJTxhYmM+LCAlLmFiYy4sICVyLmFiYy4sIGV0YworICAgICAgICBkZWxpbWl0ZXJfbWFwID0geyAneycgPT4gJ30nLCAnWycgPT4gJ10nLCAnKCcgPT4gJyknLCAnPCcgPT4gJz4nIH0KKyAgICAgICAgcnVsZSAvJShbcnFzd1FXeGlJXSk/KFteXHdcc10pLyBkbyB8bXwKKyAgICAgICAgICBvcGVuID0gUmVnZXhwLmVzY2FwZShtWzJdKQorICAgICAgICAgIGNsb3NlID0gUmVnZXhwLmVzY2FwZShkZWxpbWl0ZXJfbWFwW21bMl1dIHx8IG1bMl0pCisgICAgICAgICAgaW50ZXJwID0gL1tyUVd4SV0vID09PSBtWzFdCisgICAgICAgICAgdG9rdHlwZSA9IFN0cjo6T3RoZXIKKworICAgICAgICAgIHB1dHMgIiAgICBvcGVuOiAje29wZW4uaW5zcGVjdH0iIGlmIEBkZWJ1ZworICAgICAgICAgIHB1dHMgIiAgICBjbG9zZTogI3tjbG9zZS5pbnNwZWN0fSIgaWYgQGRlYnVnCisKKyAgICAgICAgICAjIHJlZ2V4ZXMKKyAgICAgICAgICBpZiBtWzFdID09ICdyJworICAgICAgICAgICAgdG9rdHlwZSA9IFN0cjo6UmVnZXgKKyAgICAgICAgICAgIHB1c2ggOnJlZ2V4X2ZsYWdzCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICB0b2tlbiB0b2t0eXBlCisKKyAgICAgICAgICBwdXNoIGRvCisgICAgICAgICAgICBydWxlIC9cXFsjI3tvcGVufSN7Y2xvc2V9XFxdLywgU3RyOjpFc2NhcGUKKyAgICAgICAgICAgICMgbmVzdGluZyBydWxlcyBvbmx5IHdpdGggYXN5bW1ldHJpYyBkZWxpbWl0ZXJzCisgICAgICAgICAgICBpZiBvcGVuICE9IGNsb3NlCisgICAgICAgICAgICAgIHJ1bGUgLyN7b3Blbn0vIGRvCisgICAgICAgICAgICAgICAgdG9rZW4gdG9rdHlwZQorICAgICAgICAgICAgICAgIHB1c2gKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIHJ1bGUgLyN7Y2xvc2V9LywgdG9rdHlwZSwgOnBvcCEKKworICAgICAgICAgICAgaWYgaW50ZXJwCisgICAgICAgICAgICAgIG1peGluIDpzdHJpbmdfaW50cF9lc2NhcGVkCisgICAgICAgICAgICAgIHJ1bGUgLyMvLCB0b2t0eXBlCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJ1bGUgL1tcXCNdLywgdG9rdHlwZQorICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgIHJ1bGUgL1teIyN7b3Blbn0je2Nsb3NlfVxcXSsvbSwgdG9rdHlwZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5ncyBkbworICAgICAgICBtaXhpbiA6c3ltYm9scworICAgICAgICBydWxlIC9cYlthLXpfXVx3Kj86XHMrLywgU3RyOjpTeW1ib2wsIDpleHByX3N0YXJ0CisgICAgICAgIHJ1bGUgLycoXFxcXHxcXCd8W14nXSkqJy8sIFN0cjo6U2luZ2xlCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnNpbXBsZV9zdHJpbmcKKyAgICAgICAgcnVsZSAvKD88IVwuKWAvLCBTdHI6OkJhY2t0aWNrLCA6c2ltcGxlX2JhY2t0aWNrCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJlZ2V4X2ZsYWdzIGRvCisgICAgICAgIHJ1bGUgL1ttaXhvdW5zZV0qLywgU3RyOjpSZWdleCwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICAjIGRvdWJsZS1xdW90ZWQgc3RyaW5nIGFuZCBzeW1ib2wKKyAgICAgIFtbOnN0cmluZywgU3RyOjpEb3VibGUsICciJ10sCisgICAgICAgWzpzeW0sIFN0cjo6U3ltYm9sLCAnIiddLAorICAgICAgIFs6YmFja3RpY2ssIFN0cjo6QmFja3RpY2ssICdgJ11dLmVhY2ggZG8gfG5hbWUsIHRvaywgZmlufAorICAgICAgICBzdGF0ZSA6InNpbXBsZV8je25hbWV9IiBkbworICAgICAgICAgIG1peGluIDpzdHJpbmdfaW50cF9lc2NhcGVkCisgICAgICAgICAgcnVsZSAvW15cXCN7ZmlufSNdKy9tLCB0b2sKKyAgICAgICAgICBydWxlIC9bXFwjXS8sIHRvaworICAgICAgICAgIHJ1bGUgLyN7ZmlufS8sIHRvaywgOnBvcCEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAga2V5d29yZHMgPSAldygKKyAgICAgICAgQkVHSU4gRU5EIGFsaWFzIGJlZ2luIGJyZWFrIGNhc2UgZGVmaW5lZFw/IGRvIGVsc2UgZWxzaWYgZW5kCisgICAgICAgIGVuc3VyZSBmb3IgaWYgaW4gbmV4dCByZWRvIHJlc2N1ZSByYWlzZSByZXRyeSByZXR1cm4gc3VwZXIgdGhlbgorICAgICAgICB1bmRlZiB1bmxlc3MgdW50aWwgd2hlbiB3aGlsZSB5aWVsZAorICAgICAgKQorCisgICAgICBrZXl3b3Jkc19wc2V1ZG8gPSAldygKKyAgICAgICAgaW5pdGlhbGl6ZSBuZXcgbG9vcCBpbmNsdWRlIGV4dGVuZCByYWlzZSBhdHRyX3JlYWRlciBhdHRyX3dyaXRlcgorICAgICAgICBhdHRyX2FjY2Vzc29yIGFsaWFzX21ldGhvZCBhdHRyIGNhdGNoIHRocm93IHByaXZhdGUgbW9kdWxlX2Z1bmN0aW9uCisgICAgICAgIHB1YmxpYyBwcm90ZWN0ZWQgdHJ1ZSBmYWxzZSBuaWwgX19GSUxFX18gX19MSU5FX18KKyAgICAgICkKKworICAgICAgYnVpbHRpbnNfZyA9ICV3KAorICAgICAgICBfX2lkX18gX19zZW5kX18gYWJvcnQgYW5jZXN0b3JzIGF0X2V4aXQgYXV0b2xvYWQgYmluZGluZyBjYWxsY2MKKyAgICAgICAgY2FsbGVyIGNhdGNoIGNob21wIGNob3AgY2xhc3NfZXZhbCBjbGFzc192YXJpYWJsZXMgY2xvbmUKKyAgICAgICAgY29uc3RfZGVmaW5lZFw/IGNvbnN0X2dldCBjb25zdF9taXNzaW5nIGNvbnN0X3NldCBjb25zdGFudHMKKyAgICAgICAgZGlzcGxheSBkdXAgZXZhbCBleGVjIGV4aXQgZXh0ZW5kIGZhaWwgZm9yayBmb3JtYXQgZnJlZXplCisgICAgICAgIGdldGMgZ2V0cyBnbG9iYWxfdmFyaWFibGVzIGdzdWIgaGFzaCBpZCBpbmNsdWRlZF9tb2R1bGVzCisgICAgICAgIGluc3BlY3QgaW5zdGFuY2VfZXZhbCBpbnN0YW5jZV9tZXRob2QgaW5zdGFuY2VfbWV0aG9kcworICAgICAgICBpbnN0YW5jZV92YXJpYWJsZV9nZXQgaW5zdGFuY2VfdmFyaWFibGVfc2V0IGluc3RhbmNlX3ZhcmlhYmxlcworICAgICAgICBsYW1iZGEgbG9hZCBsb2NhbF92YXJpYWJsZXMgbG9vcCBtZXRob2QgbWV0aG9kX21pc3NpbmcKKyAgICAgICAgbWV0aG9kcyBtb2R1bGVfZXZhbCBuYW1lIG9iamVjdF9pZCBvcGVuIHAgcHJpbnQgcHJpbnRmCisgICAgICAgIHByaXZhdGVfY2xhc3NfbWV0aG9kIHByaXZhdGVfaW5zdGFuY2VfbWV0aG9kcyBwcml2YXRlX21ldGhvZHMgcHJvYworICAgICAgICBwcm90ZWN0ZWRfaW5zdGFuY2VfbWV0aG9kcyBwcm90ZWN0ZWRfbWV0aG9kcyBwdWJsaWNfY2xhc3NfbWV0aG9kCisgICAgICAgIHB1YmxpY19pbnN0YW5jZV9tZXRob2RzIHB1YmxpY19tZXRob2RzIHB1dGMgcHV0cyByYWlzZSByYW5kCisgICAgICAgIHJlYWRsaW5lIHJlYWRsaW5lcyByZXF1aXJlIHJlcXVpcmVfcmVsYXRpdmUgc2NhbiBzZWxlY3Qgc2VsZiBzZW5kIHNldF90cmFjZV9mdW5jCisgICAgICAgIHNpbmdsZXRvbl9tZXRob2RzIHNsZWVwIHNwbGl0IHNwcmludGYgc3JhbmQgc3ViIHN5c2NhbGwgc3lzdGVtCisgICAgICAgIHRhaW50IHRlc3QgdGhyb3cgdG9fYSB0b19zIHRyYWNlX3ZhciB0cmFwIHVudGFpbnQgdW50cmFjZV92YXIgd2FybgorICAgICAgKQorCisgICAgICBidWlsdGluc19xID0gJXcoCisgICAgICAgIGF1dG9sb2FkIGJsb2NrX2dpdmVuIGNvbnN0X2RlZmluZWQgZXFsIGVxdWFsIGZyb3plbgorICAgICAgICBpbmNsdWRlIGluc3RhbmNlX29mIGlzX2EgaXRlcmF0b3Iga2luZF9vZiBtZXRob2RfZGVmaW5lZAorICAgICAgICBuaWwgcHJpdmF0ZV9tZXRob2RfZGVmaW5lZCBwcm90ZWN0ZWRfbWV0aG9kX2RlZmluZWQKKyAgICAgICAgcHVibGljX21ldGhvZF9kZWZpbmVkIHJlc3BvbmRfdG8gdGFpbnRlZAorICAgICAgKQorCisgICAgICBidWlsdGluc19iID0gJXcoY2hvbXAgY2hvcCBleGl0IGdzdWIgc3ViKQorCisgICAgICBzdGFydCBkbworICAgICAgICBwdXNoIDpleHByX3N0YXJ0CisgICAgICAgIEBoZXJlZG9jX3F1ZXVlID0gW10KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6d2hpdGVzcGFjZSBkbworICAgICAgICBtaXhpbiA6aW5saW5lX3doaXRlc3BhY2UKKyAgICAgICAgcnVsZSAvXG5ccyovbSwgVGV4dCwgOmV4cHJfc3RhcnQKKyAgICAgICAgcnVsZSAvIy4qJC8sIENvbW1lbnQ6OlNpbmdsZQorCisgICAgICAgIHJ1bGUgJXIoPWJlZ2luXGIuKj9lbmRcYiltLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW5saW5lX3doaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvWyBcdFxyXSsvLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAvX19FTkRfXy8sIENvbW1lbnQ6OlByZXByb2MsIDplbmRfcGFydAorCisgICAgICAgIHJ1bGUgLzBfP1swLTddKyg/Ol9bMC03XSspKi8sIE51bTo6T2N0CisgICAgICAgIHJ1bGUgLzB4WzAtOUEtRmEtZl0rKD86X1swLTlBLUZhLWZdKykqLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvMGJbMDFdKyg/Ol9bMDFdKykqLywgTnVtOjpCaW4KKyAgICAgICAgcnVsZSAvW1xkXSsoPzpfXGQrKSovLCBOdW06OkludGVnZXIKKworICAgICAgICAjIG5hbWVzCisgICAgICAgIHJ1bGUgL0BAW2Etel9dXHcqL2ksIE5hbWU6OlZhcmlhYmxlOjpDbGFzcworICAgICAgICBydWxlIC9AW2Etel9dXHcqL2ksIE5hbWU6OlZhcmlhYmxlOjpJbnN0YW5jZQorICAgICAgICBydWxlIC9cJFx3Ky8sIE5hbWU6OlZhcmlhYmxlOjpHbG9iYWwKKyAgICAgICAgcnVsZSAlcihcJFshQCZgJyt+PS9cXCw7Ljw+XypcJD86Il0pLCBOYW1lOjpWYXJpYWJsZTo6R2xvYmFsCisgICAgICAgIHJ1bGUgL1wkLVswYWRGaUlscHZ3XS8sIE5hbWU6OlZhcmlhYmxlOjpHbG9iYWwKKyAgICAgICAgcnVsZSAvOjovLCBPcGVyYXRvcgorCisgICAgICAgIG1peGluIDpzdHJpbmdzCisKKyAgICAgICAgcnVsZSAvKD86I3trZXl3b3Jkcy5qb2luKCd8Jyl9KVxiLywgS2V5d29yZCwgOmV4cHJfc3RhcnQKKyAgICAgICAgcnVsZSAvKD86I3trZXl3b3Jkc19wc2V1ZG8uam9pbignfCcpfSlcYi8sIEtleXdvcmQ6OlBzZXVkbywgOmV4cHJfc3RhcnQKKworICAgICAgICBydWxlICVyKAorICAgICAgICAgIChtb2R1bGUpCisgICAgICAgICAgKFxzKykKKyAgICAgICAgICAoW2EtekEtWl9dW2EtekEtWjAtOV9dKig6OlthLXpBLVpfXVthLXpBLVowLTlfXSopKikKKyAgICAgICAgKXggZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dCwgTmFtZTo6TmFtZXNwYWNlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhkZWZcYikoXHMqKS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZCwgVGV4dAorICAgICAgICAgIHB1c2ggOmZ1bmNuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhjbGFzc1xiKShccyopLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0CisgICAgICAgICAgcHVzaCA6Y2xhc3NuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyg/OiN7YnVpbHRpbnNfcS5qb2luKCd8Jyl9KVs/XS8sIE5hbWU6OkJ1aWx0aW4sIDpleHByX3N0YXJ0CisgICAgICAgIHJ1bGUgLyg/OiN7YnVpbHRpbnNfYi5qb2luKCd8Jyl9KSEvLCAgTmFtZTo6QnVpbHRpbiwgOmV4cHJfc3RhcnQKKyAgICAgICAgcnVsZSAvKD88IVwuKSg/OiN7YnVpbHRpbnNfZy5qb2luKCd8Jyl9KVxiLywKKyAgICAgICAgICBOYW1lOjpCdWlsdGluLCA6bWV0aG9kX2NhbGwKKworICAgICAgICAjIGNoYXIgb3BlcmF0b3IuICA/eCBldmF1bGF0ZXMgdG8gIngiLCB1bmxlc3MgdGhlcmUncyBhIGRpZ2l0CisgICAgICAgICMgYmVmb3JlaGFuZCBsaWtlIHg+PTA/blt4XToiIgorICAgICAgICBydWxlICVyKAorICAgICAgICAgIFs/XShcXFtNQ10tKSogICAgICMgbW9kaWZpZXJzCisgICAgICAgICAgKFxcKFtcXGFiZWZucnN0dlwjIiddfHhbYS1mQS1GMC05XXsxLDJ9fFswLTddezEsM30pfFxTKQorICAgICAgICAgICg/IVx3KQorICAgICAgICApeCwgU3RyOjpDaGFyCisKKyAgICAgICAgbWl4aW4gOmhhc19oZXJlZG9jcworCisgICAgICAgIHJ1bGUgL1tBLVpdW2EtekEtWjAtOV9dKi8sIE5hbWU6OkNvbnN0YW50LCA6bWV0aG9kX2NhbGwKKyAgICAgICAgcnVsZSAvKFwufDo6KShccyopKFthLXpfXVx3KlshP10/fFsqJSZeYH4rLVwvXFs8Pj1dKS8gZG8KKyAgICAgICAgICBncm91cHMgUHVuY3R1YXRpb24sIFRleHQsIE5hbWU6OkZ1bmN0aW9uCisgICAgICAgICAgcHVzaCA6bWV0aG9kX2NhbGwKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvW2EtekEtWl9dXHcqWz8hXS8sIE5hbWUsIDpleHByX3N0YXJ0CisgICAgICAgIHJ1bGUgL1thLXpBLVpfXVx3Ki8sIE5hbWUsIDptZXRob2RfY2FsbAorICAgICAgICBydWxlIC9cKlwqfDw8P3w+Pj98Pj18PD18PD0+fD1+fD17M318IX58JiY/fFx8XHx8XC57MSwzfS8sCisgICAgICAgICAgT3BlcmF0b3IsIDpleHByX3N0YXJ0CisgICAgICAgIHJ1bGUgL1stK1wvKiU9PD4mIV58fl09Py8sIE9wZXJhdG9yLCA6ZXhwcl9zdGFydAorICAgICAgICBydWxlICVyPFtcWyh7LD86XFw7L10+LCBQdW5jdHVhdGlvbiwgOmV4cHJfc3RhcnQKKyAgICAgICAgcnVsZSAlcjxbXF0pfV0+LCBQdW5jdHVhdGlvbgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpoYXNfaGVyZWRvY3MgZG8KKyAgICAgICAgcnVsZSAvKD88IVx3KSg8PFstfl0/KShbImAnXT8pKFthLXpBLVpfXVx3KikoXDIpLyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBPcGVyYXRvciwgbVsxXQorICAgICAgICAgIHRva2VuIE5hbWU6OkNvbnN0YW50LCAiI3ttWzJdfSN7bVszXX0je21bNF19IgorICAgICAgICAgIEBoZXJlZG9jX3F1ZXVlIDw8IFtbJzw8LScsICc8PH4nXS5pbmNsdWRlPyhtWzFdKSwgbVszXV0KKyAgICAgICAgICBwdXNoIDpoZXJlZG9jX3F1ZXVlIHVubGVzcyBzdGF0ZT8gOmhlcmVkb2NfcXVldWUKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKDw8Wy1+XT8pKFsiJ10pKFwyKS8gZG8gfG18CisgICAgICAgICAgdG9rZW4gT3BlcmF0b3IsIG1bMV0KKyAgICAgICAgICB0b2tlbiBOYW1lOjpDb25zdGFudCwgIiN7bVsyXX0je21bM119I3ttWzRdfSIKKyAgICAgICAgICBAaGVyZWRvY19xdWV1ZSA8PCBbWyc8PC0nLCAnPDx+J10uaW5jbHVkZT8obVsxXSksICcnXQorICAgICAgICAgIHB1c2ggOmhlcmVkb2NfcXVldWUgdW5sZXNzIHN0YXRlPyA6aGVyZWRvY19xdWV1ZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aGVyZWRvY19xdWV1ZSBkbworICAgICAgICBydWxlIC8oPz1cbikvIGRvCisgICAgICAgICAgZ290byA6cmVzb2x2ZV9oZXJlZG9jcworICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyZXNvbHZlX2hlcmVkb2NzIGRvCisgICAgICAgIG1peGluIDpzdHJpbmdfaW50cF9lc2NhcGVkCisKKyAgICAgICAgcnVsZSAvKFxuKShbXiNcXFxuXSopJC8gZG8gfG18CisgICAgICAgICAgdG9sZXJhbnQsIGhlcmVkb2NfbmFtZSA9IEBoZXJlZG9jX3F1ZXVlLmZpcnN0CisgICAgICAgICAgY2hlY2sgPSB0b2xlcmFudCA/IG1bMl0uc3RyaXAgOiBtWzJdLnJzdHJpcAorCisgICAgICAgICAgIyBjaGVjayBpZiB3ZSBmb3VuZCB0aGUgZW5kIG9mIHRoZSBoZXJlZG9jCisgICAgICAgICAgbGluZV90b2sgPSBpZiBjaGVjayA9PSBoZXJlZG9jX25hbWUKKyAgICAgICAgICAgIEBoZXJlZG9jX3F1ZXVlLnNoaWZ0CisgICAgICAgICAgICAjIGlmIHRoZXJlJ3Mgbm8gbW9yZSwgd2UncmUgZG9uZSBsb29raW5nLgorICAgICAgICAgICAgcG9wISBpZiBAaGVyZWRvY19xdWV1ZS5lbXB0eT8KKyAgICAgICAgICAgIE5hbWU6OkNvbnN0YW50CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgU3RyOjpIZXJlZG9jCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBncm91cHMoU3RyOjpIZXJlZG9jLCBsaW5lX3RvaykKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvWyNcXFxuXS8sIFN0cjo6SGVyZWRvYworICAgICAgICBydWxlIC9bXiNcXFxuXSsvLCBTdHI6OkhlcmVkb2MKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZnVuY25hbWUgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC9cKC8sIFB1bmN0dWF0aW9uLCA6ZGVmZXhwcgorICAgICAgICBydWxlICVyKAorICAgICAgICAgICg/OihbYS16QS1aX11bXHdfXSopKFwuKSk/CisgICAgICAgICAgKAorICAgICAgICAgICAgW2EtekEtWl9dW1x3X10qWyE/XT8gfAorICAgICAgICAgICAgXCpcKj8gfCBbLStdQD8gfCBbLyUmXHxeYH5dIHwgXFtcXT0/IHwKKyAgICAgICAgICAgIDw8PyB8ID4+PyB8IDw9Pj8gfCA+PSB8ID09PT8KKyAgICAgICAgICApCisgICAgICAgICl4IGRvIHxtfAorICAgICAgICAgIHB1dHMgIm1hdGNoZXM6ICN7W21bMF0sIG1bMV0sIG1bMl0sIG1bM11dLmluc3BlY3R9IiBpZiBAZGVidWcKKyAgICAgICAgICBncm91cHMgTmFtZTo6Q2xhc3MsIE9wZXJhdG9yLCBOYW1lOjpGdW5jdGlvbgorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y2xhc3NuYW1lIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvXCgvIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICBwdXNoIDpkZWZleHByCisgICAgICAgICAgcHVzaCA6ZXhwcl9zdGFydAorICAgICAgICBlbmQKKworICAgICAgICAjIGNsYXNzIDw8IGV4cHIKKyAgICAgICAgcnVsZSAvPDwvIGRvCisgICAgICAgICAgdG9rZW4gT3BlcmF0b3IKKyAgICAgICAgICBnb3RvIDpleHByX3N0YXJ0CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1tBLVpfXVx3Ki8sIE5hbWU6OkNsYXNzCisKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZGVmZXhwciBkbworICAgICAgICBydWxlIC8oXCkpKFwufDo6KT8vIGRvCisgICAgICAgICAgZ3JvdXBzIFB1bmN0dWF0aW9uLCBPcGVyYXRvcgorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgL1woLyBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6ZGVmZXhwcgorICAgICAgICAgIHB1c2ggOmV4cHJfc3RhcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgbWl4aW4gOnJvb3QKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW5faW50ZXJwIGRvCisgICAgICAgIHJ1bGUgL30vLCBTdHI6OkludGVycG9sLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmdfaW50cCBkbworICAgICAgICBydWxlIC9bI11be10vLCBTdHI6OkludGVycG9sLCA6aW5faW50ZXJwCisgICAgICAgIHJ1bGUgLyMoQEA/fFwkKVthLXpfXVx3Ki9pLCBTdHI6OkludGVycG9sCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ19pbnRwX2VzY2FwZWQgZG8KKyAgICAgICAgbWl4aW4gOnN0cmluZ19pbnRwCisgICAgICAgIHJ1bGUgL1xcKFtcXGFiZWZucnN0diMiJ118eFthLWZBLUYwLTldezEsMn18WzAtN117MSwzfSkvLAorICAgICAgICAgIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1xcLi8sIFN0cjo6RXNjYXBlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm1ldGhvZF9jYWxsIGRvCisgICAgICAgIHJ1bGUgJXIoLykgZG8KKyAgICAgICAgICB0b2tlbiBPcGVyYXRvcgorICAgICAgICAgIGdvdG8gOmV4cHJfc3RhcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSgvLykgeyBnb3RvIDptZXRob2RfY2FsbF9zcGFjZWQgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptZXRob2RfY2FsbF9zcGFjZWQgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKworICAgICAgICBydWxlICVyKFslL109KSBkbworICAgICAgICAgIHRva2VuIE9wZXJhdG9yCisgICAgICAgICAgZ290byA6ZXhwcl9zdGFydAorICAgICAgICBlbmQKKworICAgICAgICBydWxlICVyKCgvKSg/PVxTfFxzKi8pKSBkbworICAgICAgICAgIHRva2VuIFN0cjo6UmVnZXgKKyAgICAgICAgICBnb3RvIDpzbGFzaF9yZWdleAorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6c2lnaWxfc3RyaW5ncworCisgICAgICAgIHJ1bGUoJXIoKD89XHMqLykpKSB7IHBvcCEgfQorCisgICAgICAgIHJ1bGUoL1xzKy8pIHsgdG9rZW4gVGV4dDsgZ290byA6ZXhwcl9zdGFydCB9CisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmV4cHJfc3RhcnQgZG8KKyAgICAgICAgbWl4aW4gOmlubGluZV93aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSAlcigvKSBkbworICAgICAgICAgIHRva2VuIFN0cjo6UmVnZXgKKyAgICAgICAgICBnb3RvIDpzbGFzaF9yZWdleAorICAgICAgICBlbmQKKworICAgICAgICAjIHNwZWNpYWwgY2FzZSBmb3IgdXNpbmcgYSBzaW5nbGUgc3BhY2UuICBSdWJ5IGRlbWFuZHMgdGhhdAorICAgICAgICAjIHRoZXNlIGJlIGluIGEgc2luZ2xlIGxpbmUsIG90aGVyd2lzZSBpdCB3b3VsZCBtYWtlIG5vIHNlbnNlLgorICAgICAgICBydWxlIC8oXHMqKSglW3Jxc3dRV3hpSV0/IFxTKiApLyBkbworICAgICAgICAgIGdyb3VwcyBUZXh0LCBTdHI6Ok90aGVyCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6c2lnaWxfc3RyaW5ncworCisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNsYXNoX3JlZ2V4IGRvCisgICAgICAgIG1peGluIDpzdHJpbmdfaW50cAorICAgICAgICBydWxlICVyKFxcXFwpLCBTdHI6OlJlZ2V4CisgICAgICAgIHJ1bGUgJXIoXFwvKSwgU3RyOjpSZWdleAorICAgICAgICBydWxlICVyKFtcXCNdKSwgU3RyOjpSZWdleAorICAgICAgICBydWxlICVyKFteXFwvI10rKW0sIFN0cjo6UmVnZXgKKyAgICAgICAgcnVsZSAlcigvKSBkbworICAgICAgICAgIHRva2VuIFN0cjo6UmVnZXgKKyAgICAgICAgICBnb3RvIDpyZWdleF9mbGFncworICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZW5kX3BhcnQgZG8KKyAgICAgICAgIyBlYXQgdXAgdGhlIHJlc3Qgb2YgdGhlIHN0cmVhbSBhcyBDb21tZW50OjpQcmVwcm9jCisgICAgICAgIHJ1bGUgLy4rL20sIENvbW1lbnQ6OlByZXByb2MsIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3J1c3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9ydXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZmQyZGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9ydXN0LnJiCkBAIC0wLDAgKzEsMTkwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgUnVzdCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJSdXN0IgorICAgICAgZGVzYyAnVGhlIFJ1c3QgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKHJ1c3QtbGFuZy5vcmcpJworICAgICAgdGFnICdydXN0JworICAgICAgYWxpYXNlcyAncnMnCisgICAgICBmaWxlbmFtZXMgJyoucnMnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1ydXN0JworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAncnVzdGMnCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSAldygKKyAgICAgICAgICBhcyBhc3NlcnQgYnJlYWsgY29uc3QgY29weSBkbyBkcm9wIGVsc2UgZW51bSBleHRlcm4gZmFpbCBmYWxzZQorICAgICAgICAgIGZuIGZvciBpZiBpbXBsIGxldCBsb2cgbG9vcCBtYXRjaCBtb2QgbW92ZSBtdXQgcHJpdiBwdWIgcHVyZQorICAgICAgICAgIHJlZiByZXR1cm4gc2VsZiBzdGF0aWMgc3RydWN0IHRydWUgdHJhaXQgdHlwZSB1bnNhZmUgdXNlIHdoaWxlCisgICAgICAgICAgYm94CisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5idWlsdGlucworICAgICAgICBAYnVpbHRpbnMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgQWRkIEJpdEFuZCBCaXRPciBCaXRYb3IgYm9vbCBjX2NoYXIgY19kb3VibGUgY19mbG9hdCBjaGFyCisgICAgICAgICAgY19pbnQgY2xvY2tfdCBjX2xvbmcgY19sb25nbG9uZyBDb25zIENvbnN0IENvcHkgY19zY2hhciBjX3Nob3J0CisgICAgICAgICAgY191Y2hhciBjX3VpbnQgY191bG9uZyBjX3Vsb25nbG9uZyBjX3VzaG9ydCBjX3ZvaWQgZGV2X3QgRElSCisgICAgICAgICAgZGlyZW50IERpdiBFaXRoZXIgRXEgRXJyIGYzMiBmNjQgRmFpbHVyZSBGSUxFIGZsb2F0IGZwb3NfdAorICAgICAgICAgIGkxNiBpMzIgaTY0IGk4IGlzaXplIEluZGV4IGlub190IGludCBpbnRwdHJfdCBMZWZ0IG1vZGVfdCBNb2R1bG8gTXVsCisgICAgICAgICAgTmVnIE5pbCBOb25lIE51bSBvZmZfdCBPayBPcHRpb24gT3JkIE93bmVkIHBpZF90IFB0ciBwdHJkaWZmX3QKKyAgICAgICAgICBSaWdodCBTZW5kIFNobCBTaHIgc2l6ZV90IFNvbWUgc3NpemVfdCBzdHIgU3ViIFN1Y2Nlc3MgdGltZV90CisgICAgICAgICAgdTE2IHUzMiB1NjQgdTggdXNpemUgdWludCB1aW50cHRyX3QKKyAgICAgICAgICBCb3ggVmVjIFN0cmluZyBHYyBSYyBBcmMKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBtYWNyb19jbG9zZWQ/CisgICAgICAgIEBtYWNyb19kZWxpbXMudmFsdWVzLmFsbD8oJjp6ZXJvPykKKyAgICAgIGVuZAorCisgICAgICBzdGFydCB7CisgICAgICAgIEBtYWNyb19kZWxpbXMgPSB7ICddJyA9PiAwLCAnKScgPT4gMCwgJ30nID0+IDAgfQorICAgICAgfQorCisgICAgICBkZWxpbV9tYXAgPSB7ICdbJyA9PiAnXScsICcoJyA9PiAnKScsICd7JyA9PiAnfScgfQorCisgICAgICBpZCA9IC9bYS16X11cdyovaQorICAgICAgaGV4ID0gL1swLTlhLWZdL2kKKyAgICAgIGVzY2FwZXMgPSAlcigKKyAgICAgICAgXFwgKFtucnQnXFxdIHwgeCN7aGV4fXsyfSB8IHUje2hleH17NH0gfCBVI3toZXh9ezh9KQorICAgICAgKXgKKyAgICAgIHNpemUgPSAvOHwxNnwzMnw2NC8KKworICAgICAgc3RhdGUgOnN0YXJ0X2xpbmUgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC8jXFsvIGRvCisgICAgICAgICAgdG9rZW4gQ29tbWVudDo6UHJlcHJvYzsgcHVzaCA6YXR0cmlidXRlCisgICAgICAgIGVuZAorICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDphdHRyaWJ1dGUgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgbWl4aW4gOmhhc19saXRlcmFscworICAgICAgICBydWxlIC9bKCwpPV0vLCBDb21tZW50OjpQcmVwcm9jCisgICAgICAgIHJ1bGUgL1xdLywgQ29tbWVudDo6UHJlcHJvYywgOnBvcCEKKyAgICAgICAgcnVsZSBpZCwgQ29tbWVudDo6UHJlcHJvYworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp3aGl0ZXNwYWNlIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAlcigvL1teXG5dKiksIENvbW1lbnQKKyAgICAgICAgcnVsZSAlcigvWypdLio/WypdLyltLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC9cbi8sIFRleHQsIDpzdGFydF9saW5lCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgL1xiKD86I3tSdXN0LmtleXdvcmRzLmpvaW4oJ3wnKX0pXGIvLCBLZXl3b3JkCisgICAgICAgIG1peGluIDpoYXNfbGl0ZXJhbHMKKworICAgICAgICBydWxlICVyKFs9LV0+KSwgS2V5d29yZAorICAgICAgICBydWxlICVyKDwtPiksIEtleXdvcmQKKyAgICAgICAgcnVsZSAvWygpXFtcXXt9fCw6O10vLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC9bKiFAfiYrJV48Pj0tXS8sIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvKFsuXVxzKik/I3tpZH0oPz1ccypbKF0pL20sIE5hbWU6OkZ1bmN0aW9uCisgICAgICAgIHJ1bGUgL1suXVxzKiN7aWR9LywgTmFtZTo6UHJvcGVydHkKKyAgICAgICAgcnVsZSAvKCN7aWR9KSg6OikvbSBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpOYW1lc3BhY2UsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgICMgbWFjcm9zCisgICAgICAgIHJ1bGUgL1xibWFjcm9fcnVsZXMhLywgTmFtZTo6RGVjb3JhdG9yLCA6bWFjcm9fcnVsZXMKKyAgICAgICAgcnVsZSAvI3tpZH0hLywgTmFtZTo6RGVjb3JhdG9yLCA6bWFjcm8KKworICAgICAgICBydWxlIC8je2lkfS8gZG8gfG18CisgICAgICAgICAgbmFtZSA9IG1bMF0KKyAgICAgICAgICBpZiBzZWxmLmNsYXNzLmJ1aWx0aW5zLmluY2x1ZGU/IG5hbWUKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptYWNybyBkbworICAgICAgICBtaXhpbiA6aGFzX2xpdGVyYWxzCisKKyAgICAgICAgcnVsZSAvW1xbeyhdLyBkbyB8bXwKKyAgICAgICAgICBAbWFjcm9fZGVsaW1zW2RlbGltX21hcFttWzBdXV0gKz0gMQorICAgICAgICAgIHB1dHMgIiAgICBtYWNyb19kZWxpbXM6ICN7QG1hY3JvX2RlbGltcy5pbnNwZWN0fSIgaWYgQGRlYnVnCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvW1xdfSldLyBkbyB8bXwKKyAgICAgICAgICBAbWFjcm9fZGVsaW1zW21bMF1dIC09IDEKKyAgICAgICAgICBwdXRzICIgICAgbWFjcm9fZGVsaW1zOiAje0BtYWNyb19kZWxpbXMuaW5zcGVjdH0iIGlmIEBkZWJ1ZworICAgICAgICAgIHBvcCEgaWYgbWFjcm9fY2xvc2VkPworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgICMgc2FtZSBhcyB0aGUgcnVsZSBpbiByb290LCBidXQgZG9uJ3QgcHVzaCBhbm90aGVyIG1hY3JvIHN0YXRlCisgICAgICAgIHJ1bGUgLyN7aWR9IS8sIE5hbWU6OkRlY29yYXRvcgorICAgICAgICBtaXhpbiA6cm9vdAorCisgICAgICAgICMgTm8gc3ludGF4IGVycm9ycyBpbiBtYWNyb3MKKyAgICAgICAgcnVsZSAvLi8sIFRleHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bWFjcm9fcnVsZXMgZG8KKyAgICAgICAgcnVsZSAvWyRdI3tpZH0oOiN7aWR9KT8vLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBydWxlIC9bJF0vLCBOYW1lOjpWYXJpYWJsZQorCisgICAgICAgIG1peGluIDptYWNybworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpoYXNfbGl0ZXJhbHMgZG8KKyAgICAgICAgIyBjb25zdGFudHMKKyAgICAgICAgcnVsZSAvXGIoPzp0cnVlfGZhbHNlfG5pbClcYi8sIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgICMgY2hhcmFjdGVycworICAgICAgICBydWxlICVyKAorICAgICAgICAgICcgKD86ICN7ZXNjYXBlc30gfCBbXlxcXSApICcKKyAgICAgICAgKXgsIFN0cjo6Q2hhcgorCisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpzdHJpbmcKKworICAgICAgICAjIG51bWJlcnMKKyAgICAgICAgZG90ID0gL1suXVswLTlfXSsvCisgICAgICAgIGV4cCA9IC9lWy0rXT9bMC05X10rLworICAgICAgICBmbHQgPSAvZjMyfGY2NC8KKworICAgICAgICBydWxlICVyKAorICAgICAgICAgIFswLTldKworICAgICAgICAgICgje2RvdH0gICN7ZXhwfT8gI3tmbHR9PworICAgICAgICAgIHwje2RvdH0/ICN7ZXhwfSAgI3tmbHR9PworICAgICAgICAgIHwje2RvdH0/ICN7ZXhwfT8gI3tmbHR9CisgICAgICAgICAgKQorICAgICAgICApeCwgTnVtOjpGbG9hdAorCisgICAgICAgIHJ1bGUgJXIoCisgICAgICAgICAgKCAwYlsxMF9dKworICAgICAgICAgIHwgMHhbMC05YS1mQS1GLV0rCisgICAgICAgICAgfCBbMC05XSsKKyAgICAgICAgICApICh1I3tzaXplfT98aSN7c2l6ZX0pPworICAgICAgICApeCwgTnVtOjpJbnRlZ2VyCisKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5nIGRvCisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpwb3AhCisgICAgICAgIHJ1bGUgZXNjYXBlcywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvJSUvLCBTdHI6OkludGVycG9sCisgICAgICAgIHJ1bGUgJXIoCisgICAgICAgICAgJQorICAgICAgICAgICggWzAtOV0rIFskXSApPyAgIyBQYXJhbWV0ZXIKKyAgICAgICAgICBbMCMrLV0qICAgICAgICAgICMgRmxhZworICAgICAgICAgICggWzAtOV0rIFskXT8gKT8gIyBXaWR0aAorICAgICAgICAgICggWy5dIFswLTldKyApPyAgIyBQcmVjaXNpb24KKyAgICAgICAgICBbYmNkZmlvc3R1eFg/XSAgICMgVHlwZQorICAgICAgICApeCwgU3RyOjpJbnRlcnBvbAorICAgICAgICBydWxlIC9bXiUiXFxdKy9tLCBTdHIKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2Fzcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Nhc3MucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3NjVmYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Nhc3MucmIKQEAgLTAsMCArMSw3NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGxvYWRfbGV4ZXIgJ3Nhc3MvY29tbW9uLnJiJworCisgICAgY2xhc3MgU2FzcyA8IFNhc3NDb21tb24KKyAgICAgIGluY2x1ZGUgSW5kZW50YXRpb24KKworICAgICAgdGl0bGUgIlNhc3MiCisgICAgICBkZXNjICdUaGUgU2FzcyBzdHlsZXNoZWV0IGxhbmd1YWdlIGxhbmd1YWdlIChzYXNzLWxhbmcuY29tKScKKworICAgICAgdGFnICdzYXNzJworICAgICAgZmlsZW5hbWVzICcqLnNhc3MnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1zYXNzJworCisgICAgICBpZCA9IC9bXHctXSsvCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1sgXHRdKlxuLywgVGV4dAorICAgICAgICBydWxlKC9bIFx0XSovKSB7IHxtfCB0b2tlbiBUZXh0OyBpbmRlbnRhdGlvbihtWzBdKSB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNvbnRlbnQgZG8KKyAgICAgICAgIyBibG9jayBjb21tZW50cworICAgICAgICBydWxlICVyKC8vLio/XG4pIGRvCisgICAgICAgICAgdG9rZW4gQ29tbWVudDo6U2luZ2xlCisgICAgICAgICAgcG9wITsgc3RhcnRzX2Jsb2NrIDpzaW5nbGVfY29tbWVudAorICAgICAgICBlbmQKKworICAgICAgICBydWxlICVyKC9bKl0uKj9cbikgZG8KKyAgICAgICAgICB0b2tlbiBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgICAgICBwb3AhOyBzdGFydHNfYmxvY2sgOm11bHRpX2NvbW1lbnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvQGltcG9ydFxiLywgS2V5d29yZCwgOmltcG9ydAorCisgICAgICAgIG1peGluIDpjb250ZW50X2NvbW1vbgorCisgICAgICAgIHJ1bGUgJXIoPSN7aWR9KSwgTmFtZTo6RnVuY3Rpb24sIDp2YWx1ZQorICAgICAgICBydWxlICVyKFsrXSN7aWR9KSwgTmFtZTo6RGVjb3JhdG9yLCA6dmFsdWUKKworICAgICAgICBydWxlIC86LywgTmFtZTo6QXR0cmlidXRlLCA6b2xkX3N0eWxlX2F0dHIKKworICAgICAgICBydWxlKC8oPz0uKz86KFteYS16XXwkKSkvKSB7IHB1c2ggOmF0dHJpYnV0ZSB9CisKKyAgICAgICAgcnVsZSgvLykgeyBwdXNoIDpzZWxlY3RvciB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNpbmdsZV9jb21tZW50IGRvCisgICAgICAgIHJ1bGUgLy4qP1xuLywgQ29tbWVudDo6U2luZ2xlLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptdWx0aV9jb21tZW50IGRvCisgICAgICAgIHJ1bGUgLy4qP1xuLywgQ29tbWVudDo6TXVsdGlsaW5lLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbXBvcnQgZG8KKyAgICAgICAgcnVsZSAvWyBcdF0rLywgVGV4dAorICAgICAgICBydWxlIC9cUysvLCBTdHIKKyAgICAgICAgcnVsZSAvXG4vLCBUZXh0LCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpvbGRfc3R5bGVfYXR0ciBkbworICAgICAgICBtaXhpbiA6YXR0cl9jb21tb24KKyAgICAgICAgcnVsZSgvLykgeyBwb3AhOyBwdXNoIDp2YWx1ZSB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmVuZF9zZWN0aW9uIGRvCisgICAgICAgIHJ1bGUoL1xuLykgeyB0b2tlbiBUZXh0OyByZXNldF9zdGFjayB9CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Nhc3MvY29tbW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2Fzcy9jb21tb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViYjU0NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Nhc3MvY29tbW9uLnJiCkBAIC0wLDAgKzEsMTgwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgIyBzaGFyZWQgc3RhdGVzIHdpdGggU0NTUworICAgIGNsYXNzIFNhc3NDb21tb24gPCBSZWdleExleGVyCisgICAgICBpZCA9IC9bXHctXSsvCisKKyAgICAgIHN0YXRlIDpjb250ZW50X2NvbW1vbiBkbworICAgICAgICBydWxlIC9AZm9yXGIvLCBLZXl3b3JkLCA6Zm9yCisgICAgICAgIHJ1bGUgL0AoZGVidWd8d2FybnxpZnxlYWNofHdoaWxlfGVsc2V8cmV0dXJufG1lZGlhKS8sIEtleXdvcmQsIDp2YWx1ZQorCisgICAgICAgIHJ1bGUgLyhAbWl4aW4pKFxzKykoI3tpZH0pLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0LCBOYW1lOjpGdW5jdGlvbgorICAgICAgICAgIHB1c2ggOnZhbHVlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhAZnVuY3Rpb24pKFxzKykoI3tpZH0pLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0LCBOYW1lOjpGdW5jdGlvbgorICAgICAgICAgIHB1c2ggOnZhbHVlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL0BleHRlbmRcYi8sIEtleXdvcmQsIDpzZWxlY3RvcgorCisgICAgICAgIHJ1bGUgLyhAaW5jbHVkZSkoXHMrKSgje2lkfSkvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIE5hbWU6OkRlY29yYXRvcgorICAgICAgICAgIHB1c2ggOnZhbHVlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL0Aje2lkfS8sIEtleXdvcmQsIDpzZWxlY3RvcgorCisgICAgICAgICMgJHZhcmlhYmxlOiBhc3NpZ25tZW50CisgICAgICAgIHJ1bGUgLyhbJF0je2lkfSkoWyBcdF0qKSg6KS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6VmFyaWFibGUsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgICAgcHVzaCA6dmFsdWUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnZhbHVlIGRvCisgICAgICAgIG1peGluIDplbmRfc2VjdGlvbgorICAgICAgICBydWxlIC9bIFx0XSsvLCBUZXh0CisgICAgICAgIHJ1bGUgL1skXSN7aWR9LywgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgcnVsZSAvdXJsWyhdLywgU3RyOjpPdGhlciwgOnN0cmluZ191cmwKKyAgICAgICAgcnVsZSAvI3tpZH0oPz1ccypbKF0pLywgTmFtZTo6RnVuY3Rpb24KKyAgICAgICAgcnVsZSAvJSN7aWR9LywgTmFtZTo6RGVjb3JhdG9yCisKKyAgICAgICAgIyBuYW1lZCBsaXRlcmFscworICAgICAgICBydWxlIC8odHJ1ZXxmYWxzZSlcYi8sIE5hbWU6OkJ1aWx0aW46OlBzZXVkbworICAgICAgICBydWxlIC8oYW5kfG9yfG5vdClcYi8sIE9wZXJhdG9yOjpXb3JkCisKKyAgICAgICAgIyBjb2xvcnMgYW5kIG51bWJlcnMKKyAgICAgICAgcnVsZSAvI1thLXowLTldezEsNn0vaSwgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvLT9cZCsoJXxbYS16XSspPy8sIE51bQorICAgICAgICBydWxlIC8tP1xkKlwuXGQrKCV8W2Etel0rKT8vLCBOdW06OkludGVnZXIKKworICAgICAgICBtaXhpbiA6aGFzX3N0cmluZ3MKKyAgICAgICAgbWl4aW4gOmhhc19pbnRlcnAKKworICAgICAgICBydWxlIC9bfl4qISYlPD5cfCs9QDosLlwvPy1dKy8sIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgL1tcW1xdKCldKy8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgJXIoL1sqXSksIENvbW1lbnQ6Ok11bHRpbGluZSwgOmlubGluZV9jb21tZW50CisgICAgICAgIHJ1bGUgJXIoLy9bXlxuXSopLCBDb21tZW50OjpTaW5nbGUKKworICAgICAgICAjIGlkZW50aWZpZXJzCisgICAgICAgIHJ1bGUoaWQpIGRvIHxtfAorICAgICAgICAgIGlmIENTUy5idWlsdGlucy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzaWYgQ1NTLmNvbnN0YW50cy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpDb25zdGFudAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmhhc19pbnRlcnAgZG8KKyAgICAgICAgcnVsZSAvWyNdW3tdLywgU3RyOjpJbnRlcnBvbCwgOmludGVycG9sYXRpb24KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aGFzX3N0cmluZ3MgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0cjo6RG91YmxlLCA6ZHEKKyAgICAgICAgcnVsZSAvJy8sIFN0cjo6U2luZ2xlLCA6c3EKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW50ZXJwb2xhdGlvbiBkbworICAgICAgICBydWxlIC99LywgU3RyOjpJbnRlcnBvbCwgOnBvcCEKKyAgICAgICAgbWl4aW4gOnZhbHVlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNlbGVjdG9yIGRvCisgICAgICAgIG1peGluIDplbmRfc2VjdGlvbgorCisgICAgICAgIG1peGluIDpoYXNfc3RyaW5ncworICAgICAgICBtaXhpbiA6aGFzX2ludGVycAorICAgICAgICBydWxlIC9bIFx0XSsvLCBUZXh0CisgICAgICAgIHJ1bGUgLzovLCBOYW1lOjpEZWNvcmF0b3IsIDpwc2V1ZG9fY2xhc3MKKyAgICAgICAgcnVsZSAvWy5dLywgTmFtZTo6Q2xhc3MsIDpjbGFzcworICAgICAgICBydWxlIC8jLywgTmFtZTo6TmFtZXNwYWNlLCA6aWQKKyAgICAgICAgcnVsZSAvJS8sIE5hbWU6OlZhcmlhYmxlLCA6cGxhY2Vob2xkZXIKKyAgICAgICAgcnVsZSBpZCwgTmFtZTo6VGFnCisgICAgICAgIHJ1bGUgLyYvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgL1t+XiohJlxbXF0oKTw+XHwrPUA6OywuXC8/LV0vLCBPcGVyYXRvcgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkcSBkbworICAgICAgICBydWxlIC8iLywgU3RyOjpEb3VibGUsIDpwb3AhCisgICAgICAgIG1peGluIDpoYXNfaW50ZXJwCisgICAgICAgIHJ1bGUgLyhcXC58Iyg/IVt7XSl8W15cbiIjXSkrLywgU3RyOjpEb3VibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3EgZG8KKyAgICAgICAgcnVsZSAvJy8sIFN0cjo6U2luZ2xlLCA6cG9wIQorICAgICAgICBtaXhpbiA6aGFzX2ludGVycAorICAgICAgICBydWxlIC8oXFwufCMoPyFbe10pfFteXG4nI10pKy8sIFN0cjo6U2luZ2xlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZ191cmwgZG8KKyAgICAgICAgcnVsZSAvWyldLywgU3RyOjpPdGhlciwgOnBvcCEKKyAgICAgICAgcnVsZSAvKFxcLnwjKD8hW3tdKXxbXlxuKSNdKSsvLCBTdHI6Ok90aGVyCisgICAgICAgIG1peGluIDpoYXNfaW50ZXJwCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNlbGVjdG9yX3BpZWNlIGRvCisgICAgICAgIG1peGluIDpoYXNfaW50ZXJwCisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnBzZXVkb19jbGFzcyBkbworICAgICAgICBydWxlIGlkLCBOYW1lOjpEZWNvcmF0b3IKKyAgICAgICAgbWl4aW4gOnNlbGVjdG9yX3BpZWNlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNsYXNzIGRvCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OkNsYXNzCisgICAgICAgIG1peGluIDpzZWxlY3Rvcl9waWVjZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppZCBkbworICAgICAgICBydWxlIGlkLCBOYW1lOjpOYW1lc3BhY2UKKyAgICAgICAgbWl4aW4gOnNlbGVjdG9yX3BpZWNlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnBsYWNlaG9sZGVyIGRvCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIG1peGluIDpzZWxlY3Rvcl9waWVjZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmb3IgZG8KKyAgICAgICAgcnVsZSAvKGZyb218dG98dGhyb3VnaCkvLCBPcGVyYXRvcjo6V29yZAorICAgICAgICBtaXhpbiA6dmFsdWUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YXR0cl9jb21tb24gZG8KKyAgICAgICAgbWl4aW4gOmhhc19pbnRlcnAKKyAgICAgICAgcnVsZSBpZCBkbyB8bXwKKyAgICAgICAgICBpZiBDU1MuYXR0cmlidXRlcy5pbmNsdWRlPyBtWzBdCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpMYWJlbAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YXR0cmlidXRlIGRvCisgICAgICAgIG1peGluIDphdHRyX2NvbW1vbgorCisgICAgICAgIHJ1bGUgLyhbIFx0XSopKDopLyBkbworICAgICAgICAgIGdyb3VwcyBUZXh0LCBQdW5jdHVhdGlvbgorICAgICAgICAgIHB1c2ggOnZhbHVlCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbmxpbmVfY29tbWVudCBkbworICAgICAgICBydWxlIC8oXFwjfCMoPz1bXlxue10pfFwqKD89W15cblwvXSl8W15cbiMqXSkrLywgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIG1peGluIDpoYXNfaW50ZXJwCisgICAgICAgIHJ1bGUgJXIoWypdLyksIENvbW1lbnQ6Ok11bHRpbGluZSwgOnBvcCEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2NhbGEucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zY2FsYS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGJhNDYzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2NhbGEucmIKQEAgLTAsMCArMSwxNDIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFNjYWxhIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIlNjYWxhIgorICAgICAgZGVzYyAiVGhlIFNjYWxhIHByb2dyYW1taW5nIGxhbmd1YWdlIChzY2FsYS1sYW5nLm9yZykiCisgICAgICB0YWcgJ3NjYWxhJworICAgICAgYWxpYXNlcyAnc2NhbGEnCisgICAgICBmaWxlbmFtZXMgJyouc2NhbGEnLCAnKi5zYnQnCisKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LXNjYWxhJywgJ2FwcGxpY2F0aW9uL3gtc2NhbGEnCisKKyAgICAgICMgQXMgZG9jdW1lbnRlZCBpbiB0aGUgRU5CRiBzZWN0aW9uIG9mIHRoZSBzY2FsYSBzcGVjaWZpY2F0aW9uCisgICAgICAjIGh0dHA6Ly93d3cuc2NhbGEtbGFuZy5vcmcvZG9jdS9maWxlcy9TY2FsYVJlZmVyZW5jZS5wZGYKKyAgICAgIHdoaXRlc3BhY2UgPSAvXHB7U3BhY2V9LworICAgICAgbGV0dGVyID0gL1tccHtMfSRfXS8KKyAgICAgIHVwcGVyID0gL1tccHtMdX0kX10vCisgICAgICBkaWdpdHMgPSAvWzAtOV0vCisgICAgICBwYXJlbnMgPSAvWygpe31cW1xdXS8KKyAgICAgIGRlbGltcyA9ICVyKFvigJjigJkiLjssXSkKKworICAgICAgIyBuZWdhdGl2ZSBsb29rYWhlYWQgdG8gZmlsdGVyIG91dCBvdGhlciBjbGFzc2VzCisgICAgICBvcCA9ICVyKAorICAgICAgICAoPyEje3doaXRlc3BhY2V9fCN7bGV0dGVyfXwje2RpZ2l0c318I3twYXJlbnN9fCN7ZGVsaW1zfSkKKyAgICAgICAgW1x1MDAyMC1cdTAwN0ZccHtTbX1ccHtTb31dCisgICAgICApeAorCisgICAgICBpZHJlc3QgPSAlcigje2xldHRlcn0oPzoje2xldHRlcn18I3tkaWdpdHN9KSooPzooPzw9Xykje29wfSspPyl4CisKKyAgICAgIGtleXdvcmRzID0gJXcoCisgICAgICAgIGFic3RyYWN0IGNhc2UgY2F0Y2ggZGVmIGRvIGVsc2UgZXh0ZW5kcyBmaW5hbCBmaW5hbGx5IGZvciBmb3JTb21lCisgICAgICAgIGlmIGltcGxpY2l0IGxhenkgbWF0Y2ggbmV3IG92ZXJyaWRlIHByaXZhdGUgcHJvdGVjdGVkIHJlcXVpcmVzIHJldHVybgorICAgICAgICBzZWFsZWQgc3VwZXIgdGhpcyB0aHJvdyB0cnkgdmFsIHZhciB3aGlsZSB3aXRoIHlpZWxkCisgICAgICApCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgLyhjbGFzc3x0cmFpdHxvYmplY3QpKFxzKykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQKKyAgICAgICAgICBwdXNoIDpjbGFzcworICAgICAgICBlbmQKKyAgICAgICAgcnVsZSAvJyN7aWRyZXN0fVteJ10vLCBTdHI6OlN5bWJvbAorICAgICAgICBydWxlIC9bXlxTXG5dKy8sIFRleHQKKworICAgICAgICBydWxlICVyKC8vLio/XG4pLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcigvXCopLCBDb21tZW50OjpNdWx0aWxpbmUsIDpjb21tZW50CisKKyAgICAgICAgcnVsZSAvQCN7aWRyZXN0fS8sIE5hbWU6OkRlY29yYXRvcgorICAgICAgICBydWxlICVyKAorICAgICAgICAgICgje2tleXdvcmRzLmpvaW4oInwiKX0pXGJ8CisgICAgICAgICAgKDxbJTotXXw9Pnw+OnxbIz1AX1x1MjFEMlx1MjE5MF0pKFxifCg/PVxzKXwkKQorICAgICAgICApeCwgS2V5d29yZAorICAgICAgICBydWxlIC86KD8hI3tvcH0pLywgS2V5d29yZCwgOnR5cGUKKyAgICAgICAgcnVsZSAvI3t1cHBlcn0je2lkcmVzdH1cYi8sIE5hbWU6OkNsYXNzCisgICAgICAgIHJ1bGUgLyh0cnVlfGZhbHNlfG51bGwpXGIvLCBLZXl3b3JkOjpDb25zdGFudAorICAgICAgICBydWxlIC8oaW1wb3J0fHBhY2thZ2UpKFxzKykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQKKyAgICAgICAgICBwdXNoIDppbXBvcnQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKHR5cGUpKFxzKykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQKKyAgICAgICAgICBwdXNoIDp0eXBlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyIiIi4qPyIiIig/ISIpL20sIFN0cgorICAgICAgICBydWxlIC8iKFxcXFx8XFwifFteIl0pKiIvLCBTdHIKKyAgICAgICAgcnVsZSAvJ1xcLid8J1teXFxdJ3wnXFx1WzAtOWEtZkEtRl17NH0nLywgU3RyOjpDaGFyCisKKyAgICAgICAgcnVsZSBpZHJlc3QsIE5hbWUKKyAgICAgICAgcnVsZSAvYFteYF0rYC8sIE5hbWUKKworICAgICAgICBydWxlIC9cWy8sIE9wZXJhdG9yLCA6dHlwZXBhcmFtCisgICAgICAgIHJ1bGUgL1tcKFwpXHtcfTssLiNdLywgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvI3tvcH0rLywgT3BlcmF0b3IKKworICAgICAgICBydWxlIC8oWzAtOV1bMC05XSpcLlswLTldKnxcLlswLTldKykoW2VFXVsrLV0/WzAtOV0rKT9bZkZkRF0/LywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC8oWzAtOV1bMC05XSpbZkZkRF0pLywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC8weFswLTlhLWZBLUZdKy8sIE51bTo6SGV4CisgICAgICAgIHJ1bGUgL1swLTldK0w/LywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjbGFzcyBkbworICAgICAgICBydWxlIC8oI3tpZHJlc3R9fCN7b3B9K3xgW15gXStgKShccyopKFxbKS8gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6Q2xhc3MsIFRleHQsIE9wZXJhdG9yCisgICAgICAgICAgcHVzaCA6dHlwZXBhcmFtCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvey8sIE9wZXJhdG9yLCA6cG9wIQorICAgICAgICBydWxlIC9cKC8sIE9wZXJhdG9yLCA6cG9wIQorICAgICAgICBydWxlICVyKC8vLio/XG4pLCBDb21tZW50OjpTaW5nbGUsIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoI3tpZHJlc3R9fCN7b3B9K3xgW15gXStgKSwgTmFtZTo6Q2xhc3MsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnR5cGUgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC88WyU6XXw+OnxbI19cdTIxRDJdfGZvclNvbWV8dHlwZS8sIEtleXdvcmQKKyAgICAgICAgcnVsZSAvKFssXCk7fV18PT58PSkoXHMqKS8gZG8KKyAgICAgICAgICBncm91cHMgT3BlcmF0b3IsIFRleHQKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC9bXChce10vLCBPcGVyYXRvciwgOnR5cGUKKworICAgICAgICB0eXBlY2h1bmsgPSAvKD86I3tpZHJlc3R9fCN7b3B9K1xgW15gXStgKS8KKyAgICAgICAgcnVsZSAvKCN7dHlwZWNodW5rfSg/OlwuI3t0eXBlY2h1bmt9KSopKFxzKikoXFspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpUeXBlLCBUZXh0LCBPcGVyYXRvcgorICAgICAgICAgIHBvcCEKKyAgICAgICAgICBwdXNoIDp0eXBlcGFyYW0KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKCN7dHlwZWNodW5rfSg/OlwuI3t0eXBlY2h1bmt9KSopKFxzKikkLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpUeXBlLCBUZXh0CisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICBydWxlICVyKC8vLio/XG4pLCBDb21tZW50OjpTaW5nbGUsIDpwb3AhCisgICAgICAgIHJ1bGUgL1wufCN7aWRyZXN0fXwje29wfSt8YFteYF0rYC8sIEtleXdvcmQ6OlR5cGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dHlwZXBhcmFtIGRvCisgICAgICAgIHJ1bGUgL1tccyxdKy8sIFRleHQKKyAgICAgICAgcnVsZSAvPFslOl18PT58Pjp8WyNfXHUyMUQyXXxmb3JTb21lfHR5cGUvLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgLyhbXF1cKVx9XSkvLCBPcGVyYXRvciwgOnBvcCEKKyAgICAgICAgcnVsZSAvW1woXFtce10vLCBPcGVyYXRvciwgOnR5cGVwYXJhbQorICAgICAgICBydWxlIC9cLnwje2lkcmVzdH18I3tvcH0rfGBbXmBdK2AvLCBLZXl3b3JkOjpUeXBlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNvbW1lbnQgZG8KKyAgICAgICAgcnVsZSAlcihbXi9cKl0rKSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgJXIoL1wqKSwgQ29tbWVudDo6TXVsdGlsaW5lLCA6Y29tbWVudAorICAgICAgICBydWxlICVyKFwqLyksIENvbW1lbnQ6Ok11bHRpbGluZSwgOnBvcCEKKyAgICAgICAgcnVsZSAlcihbKi9dKSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmltcG9ydCBkbworICAgICAgICBydWxlICVyKCgje2lkcmVzdH18XC4pKyksIE5hbWU6Ok5hbWVzcGFjZSwgOnBvcCEKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2NoZW1lLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2NoZW1lLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjk4NmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zY2hlbWUucmIKQEAgLTAsMCArMSwxMTIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBTY2hlbWUgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiU2NoZW1lIgorICAgICAgZGVzYyAiVGhlIFNjaGVtZSB2YXJpYW50IG9mIExpc3AiCisKKyAgICAgIHRhZyAnc2NoZW1lJworICAgICAgZmlsZW5hbWVzICcqLnNjbScsICcqLnNzJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtc2NoZW1lJywgJ2FwcGxpY2F0aW9uL3gtc2NoZW1lJworCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAa2V5d29yZHMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgbGFtYmRhIGRlZmluZSBpZiBlbHNlIGNvbmQgYW5kIG9yIGNhc2UgbGV0IGxldCogbGV0cmVjIGJlZ2luCisgICAgICAgICAgZG8gZGVsYXkgc2V0ISA9PiBxdW90ZSBxdWFzaXF1b3RlIHVucXVvdGUgdW5xdW90ZS1zcGxpY2luZworICAgICAgICAgIGRlZmluZS1zeW50YXggbGV0LXN5bnRheCBsZXRyZWMtc3ludGF4IHN5bnRheC1ydWxlcworICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgICogKyAtIC8gPCA8PSA9ID4gPj0gYWJzIGFjb3MgYW5nbGUgYXBwZW5kIGFwcGx5IGFzaW4KKyAgICAgICAgICBhc3NvYyBhc3NxIGFzc3YgYXRhbiBib29sZWFuPyBjYWFhYXIgY2FhYWRyIGNhYWFyIGNhYWRhcgorICAgICAgICAgIGNhYWRkciBjYWFkciBjYWFyIGNhZGFhciBjYWRhZHIgY2FkYXIgY2FkZGFyIGNhZGRkciBjYWRkcgorICAgICAgICAgIGNhZHIgY2FsbC13aXRoLWN1cnJlbnQtY29udGludWF0aW9uIGNhbGwtd2l0aC1pbnB1dC1maWxlCisgICAgICAgICAgY2FsbC13aXRoLW91dHB1dC1maWxlIGNhbGwtd2l0aC12YWx1ZXMgY2FsbC9jYyBjYXIgY2RhYWFyIGNkYWFkcgorICAgICAgICAgIGNkYWFyIGNkYWRhciBjZGFkZHIgY2RhZHIgY2RhciBjZGRhYXIgY2RkYWRyIGNkZGFyIGNkZGRhciBjZGRkZHIKKyAgICAgICAgICBjZGRkciBjZGRyIGNkciBjZWlsaW5nIGNoYXItPmludGVnZXIgY2hhci1hbHBoYWJldGljPyBjaGFyLWNpPD0/CisgICAgICAgICAgY2hhci1jaTw/IGNoYXItY2k9PyBjaGFyLWNpPj0/IGNoYXItY2k+PyBjaGFyLWRvd25jYXNlCisgICAgICAgICAgY2hhci1sb3dlci1jYXNlPyBjaGFyLW51bWVyaWM/IGNoYXItcmVhZHk/IGNoYXItdXBjYXNlCisgICAgICAgICAgY2hhci11cHBlci1jYXNlPyBjaGFyLXdoaXRlc3BhY2U/IGNoYXI8PT8gY2hhcjw/IGNoYXI9PyBjaGFyPj0/CisgICAgICAgICAgY2hhcj4/IGNoYXI/IGNsb3NlLWlucHV0LXBvcnQgY2xvc2Utb3V0cHV0LXBvcnQgY29tcGxleD8gY29ucworICAgICAgICAgIGNvcyBjdXJyZW50LWlucHV0LXBvcnQgY3VycmVudC1vdXRwdXQtcG9ydCBkZW5vbWluYXRvcgorICAgICAgICAgIGRpc3BsYXkgZHluYW1pYy13aW5kIGVvZi1vYmplY3Q/IGVxPyAgZXF1YWw/IGVxdj8gZXZhbAorICAgICAgICAgIGV2ZW4/IGV4YWN0LT5pbmV4YWN0IGV4YWN0PyBleHAgZXhwdCBmbG9vciBmb3ItZWFjaCBmb3JjZSBnY2QKKyAgICAgICAgICBpbWFnLXBhcnQgaW5leGFjdC0+ZXhhY3QgaW5leGFjdD8gaW5wdXQtcG9ydD8gaW50ZWdlci0+Y2hhcgorICAgICAgICAgIGludGVnZXI/IGludGVyYWN0aW9uLWVudmlyb25tZW50IGxjbSBsZW5ndGggbGlzdCBsaXN0LT5zdHJpbmcKKyAgICAgICAgICBsaXN0LT52ZWN0b3IgbGlzdC1yZWYgbGlzdC10YWlsIGxpc3Q/ICBsb2FkIGxvZyBtYWduaXR1ZGUKKyAgICAgICAgICBtYWtlLXBvbGFyIG1ha2UtcmVjdGFuZ3VsYXIgbWFrZS1zdHJpbmcgbWFrZS12ZWN0b3IgbWFwCisgICAgICAgICAgbWF4IG1lbWJlciBtZW1xIG1lbXYgbWluIG1vZHVsbyBuZWdhdGl2ZT8gbmV3bGluZSBub3QKKyAgICAgICAgICBudWxsLWVudmlyb25tZW50IG51bGw/IG51bWJlci0+c3RyaW5nIG51bWJlcj8gbnVtZXJhdG9yIG9kZD8KKyAgICAgICAgICBvcGVuLWlucHV0LWZpbGUgb3Blbi1vdXRwdXQtZmlsZSBvdXRwdXQtcG9ydD8gcGFpcj8gIHBlZWstY2hhcgorICAgICAgICAgIHBvcnQ/IHBvc2l0aXZlPyBwcm9jZWR1cmU/IHF1b3RpZW50IHJhdGlvbmFsPyByYXRpb25hbGl6ZQorICAgICAgICAgIHJlYWQgcmVhZC1jaGFyIHJlYWwtcGFydCByZWFsPyAgcmVtYWluZGVyIHJldmVyc2Ugcm91bmQKKyAgICAgICAgICBzY2hlbWUtcmVwb3J0LWVudmlyb25tZW50IHNldC1jYXIhIHNldC1jZHIhIHNpbiBzcXJ0IHN0cmluZworICAgICAgICAgIHN0cmluZy0+bGlzdCBzdHJpbmctPm51bWJlciBzdHJpbmctPnN5bWJvbCBzdHJpbmctYXBwZW5kCisgICAgICAgICAgc3RyaW5nLWNpPD0/ICBzdHJpbmctY2k8PyBzdHJpbmctY2k9PyBzdHJpbmctY2k+PT8gc3RyaW5nLWNpPj8KKyAgICAgICAgICBzdHJpbmctY29weSBzdHJpbmctZmlsbCEgc3RyaW5nLWxlbmd0aCBzdHJpbmctcmVmCisgICAgICAgICAgc3RyaW5nLXNldCEgc3RyaW5nPD0/IHN0cmluZzw/IHN0cmluZz0/IHN0cmluZz49PworICAgICAgICAgIHN0cmluZz4/IHN0cmluZz8gc3Vic3RyaW5nIHN5bWJvbC0+c3RyaW5nIHN5bWJvbD8KKyAgICAgICAgICB0YW4gdHJhbnNjcmlwdC1vZmYgdHJhbnNjcmlwdC1vbiB0cnVuY2F0ZSB2YWx1ZXMgdmVjdG9yCisgICAgICAgICAgdmVjdG9yLT5saXN0IHZlY3Rvci1maWxsISB2ZWN0b3ItbGVuZ3RoIHZlY3Rvci1yZWYKKyAgICAgICAgICB2ZWN0b3Itc2V0ISB2ZWN0b3I/IHdpdGgtaW5wdXQtZnJvbS1maWxlIHdpdGgtb3V0cHV0LXRvLWZpbGUKKyAgICAgICAgICB3cml0ZSB3cml0ZS1jaGFyIHplcm8/CisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBpZCA9IC9bYS16MC05ISRcJSYqKyxcLzo8PT4/QF5ffnwtXSsvaQorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICAjIGNvbW1lbnRzCisgICAgICAgIHJ1bGUgLzsuKiQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgcnVsZSAvLT9cZCtcLlxkKy8sIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvLT9cZCsvLCBOdW06OkludGVnZXIKKworICAgICAgICAjIFJhY2tldCBpbmZpbml0aXRlcworICAgICAgICBydWxlIC9bKy1daW5mWy5dW2YwXS8sIE51bQorCisgICAgICAgIHJ1bGUgLyNiWzAxXSsvLCBOdW06OkJpbgorICAgICAgICBydWxlIC8jb1swLTddKy8sIE51bTo6T2N0CisgICAgICAgIHJ1bGUgLyNkWzAtOV0rLywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLyN4WzAtOWEtZl0rL2ksIE51bTo6SGV4CisgICAgICAgIHJ1bGUgLyNbZWldW1xkLl0rLywgTnVtOjpPdGhlcgorCisgICAgICAgIHJ1bGUgLyIoXFxcXHxcXCJ8W14iXSkqIi8sIFN0cgorICAgICAgICBydWxlIC8nI3tpZH0vaSwgU3RyOjpTeW1ib2wKKyAgICAgICAgcnVsZSAvI1xcKFsoKVwvJyIuXyFcJCUmID89Ky1dezF9fFthLXowLTldKykvaSwKKyAgICAgICAgICBTdHI6OkNoYXIKKyAgICAgICAgcnVsZSAvI3R8I2YvLCBOYW1lOjpDb25zdGFudAorICAgICAgICBydWxlIC8oPzonfCN8YHwsQHwsfFwuKS8sIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvKFsnI10pKFxzKikoXCgpL20gZG8KKyAgICAgICAgICBncm91cHMgU3RyOjpTeW1ib2wsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1woLywgUHVuY3R1YXRpb24sIDpjb21tYW5kCisgICAgICAgIHJ1bGUgL1wpLywgUHVuY3R1YXRpb24KKworICAgICAgICBydWxlIGlkLCBOYW1lOjpWYXJpYWJsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tYW5kIGRvCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OkZ1bmN0aW9uIGRvIHxtfAorICAgICAgICAgIGlmIHNlbGYuY2xhc3Mua2V5d29yZHMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3MuYnVpbHRpbnMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkZ1bmN0aW9uCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUoLy8pIHsgcG9wISB9CisgICAgICBlbmQKKworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2Nzcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Njc3MucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNzBlMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Njc3MucmIKQEAgLTAsMCArMSwzNCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGxvYWRfbGV4ZXIgJ3Nhc3MvY29tbW9uLnJiJworCisgICAgY2xhc3MgU2NzcyA8IFNhc3NDb21tb24KKyAgICAgIHRpdGxlICJTQ1NTIgorICAgICAgZGVzYyAiU0NTUyBzdHlsZXNoZWV0cyAoc2Fzcy1sYW5nLmNvbSkiCisgICAgICB0YWcgJ3Njc3MnCisgICAgICBmaWxlbmFtZXMgJyouc2NzcycKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LXNjc3MnCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAlcigvLy4qP1xuKSwgQ29tbWVudDo6U2luZ2xlCisgICAgICAgIHJ1bGUgJXIoL1sqXS4qP1sqXS8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgL0BpbXBvcnRcYi8sIEtleXdvcmQsIDp2YWx1ZQorCisgICAgICAgIG1peGluIDpjb250ZW50X2NvbW1vbgorCisgICAgICAgIHJ1bGUoLyg/PVteO3t9XVs7fV0pLykgeyBwdXNoIDphdHRyaWJ1dGUgfQorICAgICAgICBydWxlKC8oPz1bXjt7fTpdKzpbXmEtel0pLykgeyBwdXNoIDphdHRyaWJ1dGUgfQorCisgICAgICAgIHJ1bGUoLy8pIHsgcHVzaCA6c2VsZWN0b3IgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDplbmRfc2VjdGlvbiBkbworICAgICAgICBydWxlIC9cbi8sIFRleHQKKyAgICAgICAgcnVsZSgvWzt7fV0vKSB7IHRva2VuIFB1bmN0dWF0aW9uOyByZXNldF9zdGFjayB9CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NlZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NlZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVlMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2VkLnJiCkBAIC0wLDAgKzEsMTcwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgU2VkIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgInNlZCIKKyAgICAgIGRlc2MgJ3NlZCwgdGhlIHVsdGltYXRlIHN0cmVhbSBlZGl0b3InCisKKyAgICAgIHRhZyAnc2VkJworICAgICAgZmlsZW5hbWVzICcqLnNlZCcKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LXNlZCcKKworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KHRleHQpCisgICAgICAgIHJldHVybiAxIGlmIHRleHQuc2hlYmFuZz8gJ3NlZCcKKyAgICAgIGVuZAorCisgICAgICBjbGFzcyBSZWdleCA8IFJlZ2V4TGV4ZXIKKyAgICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgICBydWxlIC9cXC4vLCBTdHI6OkVzY2FwZQorICAgICAgICAgIHJ1bGUgL1xbLywgUHVuY3R1YXRpb24sIDpicmFja2V0cworICAgICAgICAgIHJ1bGUgL1skXi4qXS8sIE9wZXJhdG9yCisgICAgICAgICAgcnVsZSAvWygpXS8sIFB1bmN0dWF0aW9uCisgICAgICAgICAgcnVsZSAvLi8sIFN0cjo6UmVnZXgKKyAgICAgICAgZW5kCisKKyAgICAgICAgc3RhdGUgOmJyYWNrZXRzIGRvCisgICAgICAgICAgcnVsZSAvXF4/LyBkbworICAgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICAgIGdvdG8gOmJyYWNrZXRzX2ludAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBzdGF0ZSA6YnJhY2tldHNfaW50IGRvCisgICAgICAgICAgIyByYW5nZXMKKyAgICAgICAgICBydWxlIC8uLS4vLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICAgIHJ1bGUgL1xdLywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgICAgcnVsZSAvLi8sIFN0cjo6UmVnZXgKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgY2xhc3MgUmVwbGFjZW1lbnQgPCBSZWdleExleGVyCisgICAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgICAgcnVsZSAvXFwuL20sIFN0cjo6RXNjYXBlCisgICAgICAgICAgcnVsZSAvJi8sIE9wZXJhdG9yCisgICAgICAgICAgcnVsZSAvW15cXCZdKy9tLCBUZXh0CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiByZWdleAorICAgICAgICBAcmVnZXggfHw9IFJlZ2V4Lm5ldyhvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZXBsYWNlbWVudAorICAgICAgICBAcmVwbGFjZW1lbnQgfHw9IFJlcGxhY2VtZW50Lm5ldyhvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgIHN0YXJ0IHsgcmVnZXgucmVzZXQhOyByZXBsYWNlbWVudC5yZXNldCEgfQorCisgICAgICBzdGF0ZSA6d2hpdGVzcGFjZSBkbworICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgICBydWxlKC8jLio/XG4vKSB7IHRva2VuIENvbW1lbnQ7IHJlc2V0X3N0YWNrIH0KKyAgICAgICAgcnVsZSgvXG4vKSB7IHRva2VuIFRleHQ7IHJlc2V0X3N0YWNrIH0KKyAgICAgICAgcnVsZSgvOy8pIHsgdG9rZW4gUHVuY3R1YXRpb247IHJlc2V0X3N0YWNrIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6YWRkcl9yYW5nZQorICAgICAgZW5kCisKKyAgICAgIGVkb3QgPSAvXFwufC4vbQorCisgICAgICBzdGF0ZSA6Y29tbWFuZCBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorCisgICAgICAgICMgc3Vic3QgYW5kIHRyYW5zbGl0ZXJhdGlvbgorICAgICAgICBydWxlIC8ocykoLikoI3tlZG90fSo/KShcMikoI3tlZG90fSo/KShcMikvbSBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBLZXl3b3JkLCBtWzFdCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24sIG1bMl0KKyAgICAgICAgICBkZWxlZ2F0ZSByZWdleCwgbVszXQorICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uLCBtWzRdCisgICAgICAgICAgZGVsZWdhdGUgcmVwbGFjZW1lbnQsIG1bNV0KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVs2XQorCisKKyAgICAgICAgICBnb3RvIDpmbGFncworICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8oeSkoLikoI3tlZG90fSo/KShcMikoI3tlZG90fSo/KShcMikvbSBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBLZXl3b3JkLCBtWzFdCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24sIG1bMl0KKyAgICAgICAgICBkZWxlZ2F0ZSByZXBsYWNlbWVudCwgbVszXQorICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uLCBtWzRdCisgICAgICAgICAgZGVsZWdhdGUgcmVwbGFjZW1lbnQsIG1bNV0KKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVs2XQorCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICAjIGNvbW1hbmRzIHRoYXQgdGFrZSBhIHRleHQgc2VnbWVudCBhcyBhbiBhcmd1bWVudAorICAgICAgICBydWxlIC8oW2FpY10pKFxzKikvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQ7IGdvdG8gOnRleHQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvW3BkXS8sIEtleXdvcmQKKworICAgICAgICAjIGNvbW1hbmRzIHRoYXQgdGFrZSBhIG51bWJlciBhcmd1bWVudAorICAgICAgICBydWxlIC8oW3FRbF0pKFxzKykoXGQrKS9pIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIE51bQorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBuby1hcmd1bWVudCBjb21tYW5kcworICAgICAgICBydWxlIC9bPXt9ZERnR2hIbG5wUHF4XS8sIEtleXdvcmQsIDpwb3AhCisKKyAgICAgICAgIyBjb21tYW5kcyB0aGF0IHRha2UgYSBmaWxlbmFtZSBhcmd1bWVudAorICAgICAgICBydWxlIC8oW3JSd1ddKShccyspKFxTKykvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIE5hbWUKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgICMgY29tbWFuZHMgdGhhdCB0YWtlIGEgbGFiZWwgYXJndW1lbnQKKyAgICAgICAgcnVsZSAvKFs6YnRUXSkoXHMrKShcUyspLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkLCBUZXh0LCBOYW1lOjpMYWJlbAorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmFkZHJfcmFuZ2UgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKworICAgICAgICAjIyMgYWRkcmVzcyByYW5nZXMgIyMjCisgICAgICAgIGFkZHJfdG9rID0gS2V5d29yZDo6TmFtZXNwYWNlCisgICAgICAgIHJ1bGUgL1xkKy8sIGFkZHJfdG9rCisgICAgICAgIHJ1bGUgL1skLH4rIV0vLCBhZGRyX3RvaworCisgICAgICAgIHJ1bGUgJXIoKC8pKFxcLnwuKSo/KC8pKSBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBhZGRyX3RvaywgbVsxXTsgZGVsZWdhdGUgcmVnZXgsIG1bMl07IHRva2VuIGFkZHJfdG9rLCBtWzNdCisgICAgICAgIGVuZAorCisgICAgICAgICMgYWx0ZXJuYXRlIHJlZ2V4IHJhZ2UgZGVsaW1pdGVycworICAgICAgICBydWxlICVyKChcXCkoLikoXFwufC4pKj8oXDIpKSBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBhZGRyX3RvaywgbVsxXSArIG1bMl0KKyAgICAgICAgICBkZWxlZ2F0ZSByZWdleCwgbVszXQorICAgICAgICAgIHRva2VuIGFkZHJfdG9rLCBtWzRdCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUoLy8pIHsgcHVzaCA6Y29tbWFuZCB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRleHQgZG8KKyAgICAgICAgcnVsZSAvW15cXFxuXSsvLCBTdHIKKyAgICAgICAgcnVsZSAvXFxcbi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1xcLywgU3RyCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZmxhZ3MgZG8KKyAgICAgICAgcnVsZSAvW2dwXSsvLCBLZXl3b3JkLCA6cG9wIQorCisgICAgICAgICMgd3JpdGluZyB0byBhIGZpbGUgd2l0aCB0aGUgc3Vic3QgY29tbWFuZC4KKyAgICAgICAgIyB3aG8nZGEgdGh1bmsuLi4/CisgICAgICAgIHJ1bGUgLyhbd1ddKShccyspKFxTKykvIGRvCisgICAgICAgICAgdG9rZW4gS2V5d29yZDsgdG9rZW4gVGV4dDsgdG9rZW4gTmFtZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zaGVsbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NoZWxsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzEzNGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zaGVsbC5yYgpAQCAtMCwwICsxLDE1MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFNoZWxsIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgInNoZWxsIgorICAgICAgZGVzYyAiVmFyaW91cyBzaGVsbCBsYW5ndWFnZXMsIGluY2x1ZGluZyBzaCBhbmQgYmFzaCIKKworICAgICAgdGFnICdzaGVsbCcKKyAgICAgIGFsaWFzZXMgJ2Jhc2gnLCAnenNoJywgJ2tzaCcsICdzaCcKKyAgICAgIGZpbGVuYW1lcyAnKi5zaCcsICcqLmJhc2gnLCAnKi56c2gnLCAnKi5rc2gnLAorICAgICAgICAgICAgICAgICcuYmFzaHJjJywgJy56c2hyYycsICcua3NocmMnLCAnLnByb2ZpbGUnLCAnUEtHQlVJTEQnCisKKyAgICAgIG1pbWV0eXBlcyAnYXBwbGljYXRpb24veC1zaCcsICdhcHBsaWNhdGlvbi94LXNoZWxsc2NyaXB0JworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgdGV4dC5zaGViYW5nPygvKGJhfHp8ayk/c2gvKSA/IDEgOiAwCisgICAgICBlbmQKKworICAgICAgS0VZV09SRFMgPSAldygKKyAgICAgICAgaWYgZmkgZWxzZSB3aGlsZSBkbyBkb25lIGZvciB0aGVuIHJldHVybiBmdW5jdGlvbgorICAgICAgICBzZWxlY3QgY29udGludWUgdW50aWwgZXNhYyBlbGlmIGluCisgICAgICApLmpvaW4oJ3wnKQorCisgICAgICBCVUlMVElOUyA9ICV3KAorICAgICAgICBhbGlhcyBiZyBiaW5kIGJyZWFrIGJ1aWx0aW4gY2FsbGVyIGNkIGNvbW1hbmQgY29tcGdlbgorICAgICAgICBjb21wbGV0ZSBkZWNsYXJlIGRpcnMgZGlzb3duIGVjaG8gZW5hYmxlIGV2YWwgZXhlYyBleGl0CisgICAgICAgIGV4cG9ydCBmYWxzZSBmYyBmZyBnZXRvcHRzIGhhc2ggaGVscCBoaXN0b3J5IGpvYnMga2lsbCBsZXQKKyAgICAgICAgbG9jYWwgbG9nb3V0IHBvcGQgcHJpbnRmIHB1c2hkIHB3ZCByZWFkIHJlYWRvbmx5IHNldCBzaGlmdAorICAgICAgICBzaG9wdCBzb3VyY2Ugc3VzcGVuZCB0ZXN0IHRpbWUgdGltZXMgdHJhcCB0cnVlIHR5cGUgdHlwZXNldAorICAgICAgICB1bGltaXQgdW1hc2sgdW5hbGlhcyB1bnNldCB3YWl0CisgICAgICApLmpvaW4oJ3wnKQorCisgICAgICBzdGF0ZSA6YmFzaWMgZG8KKyAgICAgICAgcnVsZSAvIy4qJC8sIENvbW1lbnQKKworICAgICAgICBydWxlIC9cYigje0tFWVdPUkRTfSlccypcYi8sIEtleXdvcmQKKyAgICAgICAgcnVsZSAvXGJjYXNlXGIvLCBLZXl3b3JkLCA6Y2FzZQorCisgICAgICAgIHJ1bGUgL1xiKCN7QlVJTFRJTlN9KVxzKlxiKD8hXC4pLywgTmFtZTo6QnVpbHRpbgorCisgICAgICAgIHJ1bGUgL15cUypbXCQlPiNdICsvLCBHZW5lcmljOjpQcm9tcHQKKworICAgICAgICBydWxlIC8oXGJcdyspKD0pLyBkbyB8bXwKKyAgICAgICAgICBncm91cHMgTmFtZTo6VmFyaWFibGUsIE9wZXJhdG9yCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1tcW1xde30oKT1dLywgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvJiZ8XHxcfC8sIE9wZXJhdG9yCisgICAgICAgICMgcnVsZSAvXHxcfC8sIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvPDw8LywgT3BlcmF0b3IgIyBoZXJlLXN0cmluZworICAgICAgICBydWxlIC88PC0/XHMqKFwnPylcXD8oXHcrKVwxLyBkbyB8bXwKKyAgICAgICAgICBsc2ggPSBTdHI6OkhlcmVkb2MKKyAgICAgICAgICB0b2tlbiBsc2gKKyAgICAgICAgICBoZXJlZG9jc3RyID0gUmVnZXhwLmVzY2FwZShtWzJdKQorCisgICAgICAgICAgcHVzaCBkbworICAgICAgICAgICAgcnVsZSAvXHMqI3toZXJlZG9jc3RyfVxzKlxuLywgbHNoLCA6cG9wIQorICAgICAgICAgICAgcnVsZSAvLio/XG4vLCBsc2gKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRvdWJsZV9xdW90ZXMgZG8KKyAgICAgICAgIyBOQjogImFiYyQiIGlzIGxpdGVyYWxseSB0aGUgc3RyaW5nIGFiYyQuCisgICAgICAgICMgSGVyZSB3ZSBwcmV2ZW50IDppbnRlcnAgZnJvbSBpbnRlcnByZXRpbmcgJCIgYXMgYSB2YXJpYWJsZS4KKyAgICAgICAgcnVsZSAvKD86XCQjPyk/Ii8sIFN0cjo6RG91YmxlLCA6cG9wIQorICAgICAgICBtaXhpbiA6aW50ZXJwCisgICAgICAgIHJ1bGUgL1teImBcXCRdKy8sIFN0cjo6RG91YmxlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNpbmdsZV9xdW90ZXMgZG8KKyAgICAgICAgcnVsZSAvJy8sIFN0cjo6U2luZ2xlLCA6cG9wIQorICAgICAgICBydWxlIC9bXiddKy8sIFN0cjo6U2luZ2xlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRhdGEgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC9cXC4vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9cJD8iLywgU3RyOjpEb3VibGUsIDpkb3VibGVfcXVvdGVzCisKKyAgICAgICAgIyBzaW5nbGUgcXVvdGVzIGFyZSBtdWNoIGVhc2llciB0aGFuIGRvdWJsZSBxdW90ZXMgLSB3ZSBjYW4KKyAgICAgICAgIyBsaXRlcmFsbHkganVzdCBzY2FuIHVudGlsIHRoZSBuZXh0IHNpbmdsZSBxdW90ZS4KKyAgICAgICAgIyBQT1NJWDogRW5jbG9zaW5nIGNoYXJhY3RlcnMgaW4gc2luZ2xlLXF1b3RlcyAoICcnICkKKyAgICAgICAgIyBzaGFsbCBwcmVzZXJ2ZSB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiBlYWNoIGNoYXJhY3RlciB3aXRoaW4gdGhlCisgICAgICAgICMgc2luZ2xlLXF1b3Rlcy4gQSBzaW5nbGUtcXVvdGUgY2Fubm90IG9jY3VyIHdpdGhpbiBzaW5nbGUtcXVvdGVzLgorICAgICAgICBydWxlIC8kPycvLCBTdHI6OlNpbmdsZSwgOnNpbmdsZV9xdW90ZXMKKworICAgICAgICBydWxlIC9cKi8sIEtleXdvcmQKKworICAgICAgICBydWxlIC87LywgVGV4dAorICAgICAgICBydWxlIC9bXj1cKlxze30oKSQiJ2BcXDxdKy8sIFRleHQKKyAgICAgICAgcnVsZSAvXGQrKD89IHxcWikvLCBOdW0KKyAgICAgICAgcnVsZSAvPC8sIFRleHQKKyAgICAgICAgbWl4aW4gOmludGVycAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjdXJseSBkbworICAgICAgICBydWxlIC99LywgS2V5d29yZCwgOnBvcCEKKyAgICAgICAgcnVsZSAvOi0vLCBLZXl3b3JkCisgICAgICAgIHJ1bGUgL1thLXpBLVowLTlfXSsvLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBydWxlIC9bXn06ImAnJF0rLywgUHVuY3R1YXRpb24KKyAgICAgICAgbWl4aW4gOnJvb3QKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cGFyZW4gZG8KKyAgICAgICAgcnVsZSAvXCkvLCBLZXl3b3JkLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptYXRoIGRvCisgICAgICAgIHJ1bGUgL1wpXCkvLCBLZXl3b3JkLCA6cG9wIQorICAgICAgICBydWxlICVyKFstKyovJV58Jl18XCpcKnxcfFx8KSwgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvXGQrLywgTnVtCisgICAgICAgIG1peGluIDpyb290CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNhc2UgZG8KKyAgICAgICAgcnVsZSAvXGJlc2FjXGIvLCBLZXl3b3JkLCA6cG9wIQorICAgICAgICBydWxlIC9cfC8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL1wpLywgUHVuY3R1YXRpb24sIDpjYXNlX3N0YW56YQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjYXNlX3N0YW56YSBkbworICAgICAgICBydWxlIC87Oy8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpiYWNrdGlja3MgZG8KKyAgICAgICAgcnVsZSAvYC8sIFN0cjo6QmFja3RpY2ssIDpwb3AhCisgICAgICAgIG1peGluIDpyb290CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmludGVycCBkbworICAgICAgICBydWxlIC9cXCQvLCBTdHI6OkVzY2FwZSAjIGxpbmUgY29udGludWF0aW9uCisgICAgICAgIHJ1bGUgL1xcLi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1wkXChcKC8sIEtleXdvcmQsIDptYXRoCisgICAgICAgIHJ1bGUgL1wkXCgvLCBLZXl3b3JkLCA6cGFyZW4KKyAgICAgICAgcnVsZSAvXCR7Iz8vLCBLZXl3b3JkLCA6Y3VybHkKKyAgICAgICAgcnVsZSAvYC8sIFN0cjo6QmFja3RpY2ssIDpiYWNrdGlja3MKKyAgICAgICAgcnVsZSAvXCQjPyhcdyt8LikvLCBOYW1lOjpWYXJpYWJsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIG1peGluIDpiYXNpYworICAgICAgICBtaXhpbiA6ZGF0YQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zaGVsbF9zZXNzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2hlbGxfc2Vzc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQwMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc2hlbGxfc2Vzc2lvbi5yYgpAQCAtMCwwICsxLDI5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgU2hlbGxTZXNzaW9uIDwgUmVnZXhMZXhlcgorICAgICAgdGFnICdzaGVsbF9zZXNzaW9uJworICAgICAgdGl0bGUgIlNoZWxsIFNlc3Npb24iCisgICAgICBkZXNjICdBIGdlbmVyaWMgbGV4ZXIgZm9yIHNoZWxsIHNlc3Npb24gYW5kIGNvbW1hbmQgbGluZScKKyAgICAgIGFsaWFzZXMgJ3Rlcm1pbmFsJywgJ2NvbnNvbGUnCisgICAgICBmaWxlbmFtZXMgJyouY2FwJworCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC9eKFteIFxuXSojICkoW14gXG5dKikoLiooXG58JCkpLyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBOYW1lOjpFbnRpdHksIG1bMV0KKyAgICAgICAgICB0b2tlbiBOYW1lOjpDbGFzcywgbVsyXQorICAgICAgICAgIHRva2VuIEtleXdvcmQ6OlZhcmlhYmxlLCBtWzNdCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC9eKFteIFxuXSpcJCApKFteIFxuXSopKC4qKFxufCQpKS8gZG8gfG18CisgICAgICAgICAgdG9rZW4gVGV4dDo6V2hpdGVzcGFjZSwgbVsxXQorICAgICAgICAgIHRva2VuIE5hbWU6OkNsYXNzLCBtWzJdCisgICAgICAgICAgdG9rZW4gS2V5d29yZDo6VmFyaWFibGUsIG1bM10KKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgL148Li4uPiQvLCBDb21tZW50CisgICAgICAgIHJ1bGUgLy4qXG4vLCBUZXh0CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKyMjIyB0YWcgZnVuY3Rpb24gY2xhc3MgbGFiZWwKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NsaW0ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zbGltLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZWEzOTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zbGltLnJiCkBAIC0wLDAgKzEsMjI4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgIyBBIGxleGVyIGZvciB0aGUgU2xpbSB0ZW1wYWx0ZSBsYW5ndWFnZQorICAgICMgQHNlZSBodHRwOi8vc2xpbS1sYW5nLm9yZworICAgIGNsYXNzIFNsaW0gPCBSZWdleExleGVyCisgICAgICBpbmNsdWRlIEluZGVudGF0aW9uCisKKyAgICAgIHRpdGxlICJTbGltIgorICAgICAgZGVzYyAnVGhlIFNsaW0gdGVtcGxhdGUgbGFuZ3VhZ2UnCisKKyAgICAgIHRhZyAnc2xpbScKKworICAgICAgZmlsZW5hbWVzICcqLnNsaW0nCisKKyAgICAgICMgUnVieSBpZGVudGlmaWVyIGNoYXJhY3RlcnMKKyAgICAgIHJ1YnlfY2hhcnMgPSAvW1x3XCFcP1xAXCRdLworCisgICAgICAjIFNpbmNlIHlvdSBhcmUgYWxsb3dlZCB0byB3cmFwIGxpbmVzIHdpdGggYSBiYWNrc2xhc2gsIGluY2x1ZGUgXFxcbiBpbiBjaGFyYWN0ZXJzCisgICAgICBkb3QgPSAvKFxcXG58LikvCisKKyAgICAgIGRlZiBydWJ5CisgICAgICAgIEBydWJ5IHx8PSBSdWJ5Lm5ldyhvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBodG1sCisgICAgICAgIEBodG1sIHx8PSBIVE1MLm5ldyhvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBmaWx0ZXJzCisgICAgICAgIEBmaWx0ZXJzIHx8PSB7CisgICAgICAgICAgJ3J1YnknID0+IHJ1YnksCisgICAgICAgICAgJ2VyYicgPT4gRVJCLm5ldyhvcHRpb25zKSwKKyAgICAgICAgICAnamF2YXNjcmlwdCcgPT4gSmF2YXNjcmlwdC5uZXcob3B0aW9ucyksCisgICAgICAgICAgJ2NzcycgPT4gQ1NTLm5ldyhvcHRpb25zKSwKKyAgICAgICAgICAnY29mZmVlJyA9PiBDb2ZmZWVzY3JpcHQubmV3KG9wdGlvbnMpLAorICAgICAgICAgICdtYXJrZG93bicgPT4gTWFya2Rvd24ubmV3KG9wdGlvbnMpLAorICAgICAgICAgICdzY3NzJyA9PiBTY3NzLm5ldyhvcHRpb25zKSwKKyAgICAgICAgICAnc2FzcycgPT4gU2Fzcy5uZXcob3B0aW9ucykKKyAgICAgICAgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXJ0IHsgcnVieS5yZXNldCE7IGh0bWwucmVzZXQhIH0KKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvXHMqXG4vLCBUZXh0CisgICAgICAgIHJ1bGUoL1xzKi8pIHsgfG18IHRva2VuIFRleHQ7IGluZGVudGF0aW9uKG1bMF0pIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29udGVudCBkbworICAgICAgICBtaXhpbiA6Y3NzCisKKyAgICAgICAgcnVsZSAvXC8je2RvdH0qLywgQ29tbWVudCwgOmluZGVudGVkX2Jsb2NrCisKKyAgICAgICAgcnVsZSAvKGRvY3R5cGUpKFxzKykoLiopLyBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpOYW1lc3BhY2UsIFRleHQ6OldoaXRlc3BhY2UsIFRleHQKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgICMgZmlsdGVycywgc2hhbWVsZXNzbHkgcmlwcGVkIGZyb20gSEFNTAorICAgICAgICBydWxlIC8oXHcqKTpccypcbi8gZG8gfG18CisgICAgICAgICAgdG9rZW4gTmFtZTo6RGVjb3JhdG9yCisgICAgICAgICAgcG9wIQorICAgICAgICAgIHN0YXJ0c19ibG9jayA6ZmlsdGVyX2Jsb2NrCisKKyAgICAgICAgICBmaWx0ZXJfbmFtZSA9IG1bMV0uc3RyaXAKKworICAgICAgICAgIEBmaWx0ZXJfbGV4ZXIgPSBzZWxmLmZpbHRlcnNbZmlsdGVyX25hbWVdCisgICAgICAgICAgQGZpbHRlcl9sZXhlci5yZXNldCEgdW5sZXNzIEBmaWx0ZXJfbGV4ZXIubmlsPworCisgICAgICAgICAgcHV0cyAiICAgIHNsaW06IGZpbHRlciAje2ZpbHRlcl9uYW1lLmluc3BlY3R9ICN7QGZpbHRlcl9sZXhlci5pbnNwZWN0fSIgaWYgQGRlYnVnCisgICAgICAgIGVuZAorCisgICAgICAgICMgVGV4dAorICAgICAgICBydWxlICVyKFtcfCddKD89XHMpKSBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgcG9wIQorICAgICAgICAgIHN0YXJ0c19ibG9jayA6cGxhaW5fYmxvY2sKKyAgICAgICAgICBnb3RvIDpwbGFpbl9ibG9jaworICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8tfD09fD0vLCBQdW5jdHVhdGlvbiwgOnJ1YnlfbGluZQorCisgICAgICAgICMgRHluYW1pYyB0YWdzCisgICAgICAgIHJ1bGUgLyhcKikoI3tydWJ5X2NoYXJzfStcKC4qP1wpKS8gZG8gfG18CisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24sIG1bMV0KKyAgICAgICAgICBkZWxlZ2F0ZSBydWJ5LCBtWzJdCisgICAgICAgICAgcHVzaCA6dGFnCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhcKikoI3tydWJ5X2NoYXJzfSspLyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVsxXQorICAgICAgICAgIGRlbGVnYXRlIHJ1YnksIG1bMl0KKyAgICAgICAgICBwdXNoIDp0YWcKKyAgICAgICAgZW5kCisKKyAgICAgICAgI3J1bGUgLzxcdysoPz0uKj4pLywgS2V5d29yZDo6Q29uc3RhbnQsIDp0YWcgIyBNYXliZSBkbyB0aGlzLCBsb29rIGFoZWFkIGFuZCBzdHVmZgorICAgICAgICBydWxlICVyKCg8Lz9bXHdcc1w9XCdcIl0rPy8/PikpIGRvIHxtfCAjIERpcnR5IGh0bWwKKyAgICAgICAgICBkZWxlZ2F0ZSBodG1sLCBtWzFdCisgICAgICAgICAgcG9wIQorICAgICAgICBlbmQKKworICAgICAgICAjIE9yZGluYXJ5IHNsaW0gdGFncworICAgICAgICBydWxlIC9cdysvLCBOYW1lOjpUYWcsIDp0YWcKKworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp0YWcgZG8KKyAgICAgICAgbWl4aW4gOmNzcworICAgICAgICBtaXhpbiA6aW5kZW50ZWRfYmxvY2sKKyAgICAgICAgbWl4aW4gOmludGVycG9sYXRpb24KKworICAgICAgICAjIFdoaXRlc3BhY2UgY29udHJvbAorICAgICAgICBydWxlIC9bPD5dLywgUHVuY3R1YXRpb24KKworICAgICAgICAjIFRyaW0gd2hpdGVzcGFjZQorICAgICAgICBydWxlIC9ccys/LywgVGV4dDo6V2hpdGVzcGFjZQorCisgICAgICAgICMgU3BsYXRzLCB0aGVzZSB0d28gbWlnaHQgYmUgbWVyZ2FibGU/CisgICAgICAgIHJ1bGUgLyhcKikoI3tydWJ5X2NoYXJzfSspLyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVsxXQorICAgICAgICAgIGRlbGVnYXRlIHJ1YnksIG1bMl0KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKFwqKShceyN7ZG90fSs/XH0pLyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVsxXQorICAgICAgICAgIGRlbGVnYXRlIHJ1YnksIG1bMl0KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBBdHRyaWJ1dGVzCisgICAgICAgIHJ1bGUgLyhbXHdcLV0rKShccyopKFw9KS8gZG8gfG18CisgICAgICAgICAgdG9rZW4gTmFtZTo6QXR0cmlidXRlLCBtWzFdCisgICAgICAgICAgdG9rZW4gVGV4dDo6V2hpdGVzcGFjZSwgbVsyXQorICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uLCBtWzNdCisgICAgICAgICAgcHVzaCA6aHRtbF9hdHRyCisgICAgICAgIGVuZAorCisgICAgICAgICMgUnVieSB2YWx1ZQorICAgICAgICBydWxlIC8oXD0pKCN7ZG90fSspLyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbiwgbVsxXQorICAgICAgICAgICN0b2tlbiBLZXl3b3JkOjpDb25zdGFudCwgbVsyXQorICAgICAgICAgIGRlbGVnYXRlIHJ1YnksIG1bMl0KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBIVE1MIEVudGl0aWVzCisgICAgICAgIHJ1bGUoLyZcUyo/Oy8sIE5hbWU6OkVudGl0eSkKKworICAgICAgICBydWxlIC8je2RvdH0rPy8sIFRleHQKKworICAgICAgICBydWxlIC9ccypcbi8sIFRleHQ6OldoaXRlc3BhY2UsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNzcyBkbworICAgICAgICBydWxlKC9cLltcdy1dKi8pIHsgdG9rZW4gTmFtZTo6Q2xhc3M7IGdvdG8gOnRhZyB9CisgICAgICAgIHJ1bGUoLyNbYS16QS1aXVtcdzotXSovKSB7IHRva2VuIE5hbWU6OkZ1bmN0aW9uOyBnb3RvIDp0YWcgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpodG1sX2F0dHIgZG8KKyAgICAgICAgIyBTdHJpbmdzLCBkb3VibGUvc2luZ2xlIHF1b3RlZAorICAgICAgICBydWxlKC9ccyooWyciXSkje2RvdH0qP1wxLywgTGl0ZXJhbDo6U3RyaW5nLCA6cG9wISkKKworICAgICAgICAjIFJ1Ynkgc3R1ZmYKKyAgICAgICAgcnVsZSgvKCN7cnVieV9jaGFyc30rXCguKj9cKSkvKSB7IHxtfCBkZWxlZ2F0ZSBydWJ5LCBtWzFdOyBwb3AhIH0KKyAgICAgICAgcnVsZSgvKCN7cnVieV9jaGFyc30rKS8pIHsgfG18IGRlbGVnYXRlIHJ1YnksIG1bMV07IHBvcCEgfQorCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQ6OldoaXRlc3BhY2UKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cnVieV9saW5lIGRvCisgICAgICAgICMgTmVlZCBhdCB0b3AKKyAgICAgICAgbWl4aW4gOmluZGVudGVkX2Jsb2NrCisKKyAgICAgICAgcnVsZSgvLFxzKlxuLykgeyBkZWxlZ2F0ZSBydWJ5IH0KKyAgICAgICAgcnVsZSAvWyBdXHxbIFx0XSpcbi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUoLy4qPyg/PSgsJHwgXHwpP1sgXHRdKiQpLykgeyBkZWxlZ2F0ZSBydWJ5IH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZmlsdGVyX2Jsb2NrIGRvCisgICAgICAgIHJ1bGUgLyhbXiNcbl18I1tee1xuXXwoXFxcXCkqXFwjXHspKy8gZG8KKyAgICAgICAgICBpZiBAZmlsdGVyX2xleGVyCisgICAgICAgICAgICBkZWxlZ2F0ZSBAZmlsdGVyX2xleGVyCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6RGVjb3JhdG9yCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIG1peGluIDppbnRlcnBvbGF0aW9uCisgICAgICAgIG1peGluIDppbmRlbnRlZF9ibG9jaworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpwbGFpbl9ibG9jayBkbworICAgICAgICBtaXhpbiA6aW50ZXJwb2xhdGlvbgorCisgICAgICAgIHJ1bGUgJXIoKDwvP1tcd1xzXD1cJ1wiXSs/Lz8+KSkgZG8gfG18ICMgRGlydHkgaHRtbAorICAgICAgICAgIGRlbGVnYXRlIGh0bWwsIG1bMV0KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBIVE1MIEVudGl0aWVzCisgICAgICAgIHJ1bGUoLyZcUyo/Oy8sIE5hbWU6OkVudGl0eSkKKworICAgICAgICAjcnVsZSAvKFteI1xuXXwjW157XG5dfChcXFxcKSpcXCNceykrLyBkbworICAgICAgICBydWxlIC8je2RvdH0rPy8sIFRleHQKKworICAgICAgICBtaXhpbiA6aW5kZW50ZWRfYmxvY2sKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW50ZXJwb2xhdGlvbiBkbworICAgICAgICBydWxlIC8jW3tdLywgU3RyOjpJbnRlcnBvbCwgOnJ1YnlfaW50ZXJwCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJ1YnlfaW50ZXJwIGRvCisgICAgICAgIHJ1bGUgL1t9XS8sIFN0cjo6SW50ZXJwb2wsIDpwb3AhCisgICAgICAgIG1peGluIDpydWJ5X2ludGVycF9pbm5lcgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpydWJ5X2ludGVycF9pbm5lciBkbworICAgICAgICBydWxlKC9be10vKSB7IGRlbGVnYXRlIHJ1Ynk7IHB1c2ggOnJ1YnlfaW50ZXJwX2lubmVyIH0KKyAgICAgICAgcnVsZSgvW31dLykgeyBkZWxlZ2F0ZSBydWJ5OyBwb3AhIH0KKyAgICAgICAgcnVsZSgvW157fV0rLykgeyBkZWxlZ2F0ZSBydWJ5IH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW5kZW50ZWRfYmxvY2sgZG8KKyAgICAgICAgcnVsZSgvKD88IVxcKVxuLykgeyB0b2tlbiBUZXh0OyByZXNldF9zdGFjayB9CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NtYWxsdGFsay5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NtYWxsdGFsay5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQ0OGMxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc21hbGx0YWxrLnJiCkBAIC0wLDAgKzEsMTE2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgU21hbGx0YWxrIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIlNtYWxsdGFsayIKKyAgICAgIGRlc2MgJ1RoZSBTbWFsbHRhbGsgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UnCisKKyAgICAgIHRhZyAnc21hbGx0YWxrJworICAgICAgYWxpYXNlcyAnc3QnLCAnc3F1ZWFrJworICAgICAgZmlsZW5hbWVzICcqLnN0JworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtc21hbGx0YWxrJworCisgICAgICBvcHMgPSAlcihbLSsqL1xcfjw+PXwmIT8sQCVdKQorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC8oPCkoXHcrOikoLio/KSg+KS8gZG8KKyAgICAgICAgICBncm91cHMgUHVuY3R1YXRpb24sIEtleXdvcmQsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgICMgbWl4aW4gOnNxdWVha19maWxlb3V0CisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlcworICAgICAgICBtaXhpbiA6bWV0aG9kX2RlZmluaXRpb24KKyAgICAgICAgcnVsZSAvKFt8XSkoW1x3XHNdKikoW3xdKS8gZG8KKyAgICAgICAgICBncm91cHMgUHVuY3R1YXRpb24sIE5hbWU6OlZhcmlhYmxlLCBQdW5jdHVhdGlvbgorICAgICAgICBlbmQKKyAgICAgICAgbWl4aW4gOm9iamVjdHMKKyAgICAgICAgcnVsZSAvXF58Oj18Xy8sIE9wZXJhdG9yCisKKyAgICAgICAgcnVsZSAvWyl9XF1dLywgUHVuY3R1YXRpb24sIDphZnRlcl9vYmplY3QKKyAgICAgICAgcnVsZSAvWyh7XFshXS8sIFB1bmN0dWF0aW9uCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm1ldGhvZF9kZWZpbml0aW9uIGRvCisgICAgICAgIHJ1bGUgLyhbYS16XVx3KjopKFxzKikoXHcrKS9pIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OkZ1bmN0aW9uLCBUZXh0LCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9eKFxzKikoXGJbYS16XVx3KlxiKShccyopJC9pIGRvCisgICAgICAgICAgZ3JvdXBzIFRleHQsIE5hbWU6OkZ1bmN0aW9uLCBUZXh0CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgJXIoXihccyopKCN7b3BzfSspKFxzKikoXHcrKShccyopJCkgZG8KKyAgICAgICAgICBncm91cHMgVGV4dCwgTmFtZTo6RnVuY3Rpb24sIFRleHQsIE5hbWU6OlZhcmlhYmxlLCBUZXh0CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpibG9ja192YXJpYWJsZXMgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2VzCisgICAgICAgIHJ1bGUgLyg6KShccyopKFx3KykvIGRvCisgICAgICAgICAgZ3JvdXBzIE9wZXJhdG9yLCBUZXh0LCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9bfF0vLCBQdW5jdHVhdGlvbiwgOnBvcCEKKworICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpsaXRlcmFscyBkbworICAgICAgICBydWxlIC8nKCcnfC4pKj8nL20sIFN0ciwgOmFmdGVyX29iamVjdAorICAgICAgICBydWxlIC9bJF0uLywgU3RyOjpDaGFyLCA6YWZ0ZXJfb2JqZWN0CisgICAgICAgIHJ1bGUgLyNbKF0vLCBTdHI6OlN5bWJvbCwgOnBhcmVudGgKKyAgICAgICAgcnVsZSAvKFxkK3IpPy0/XGQrKFwuXGQrKT8oZS0/XGQrKT8vLAorICAgICAgICAgIE51bSwgOmFmdGVyX29iamVjdAorICAgICAgICBydWxlIC8jKCJbXiJdKiJ8I3tvcHN9K3xbXHc6XSspLywKKyAgICAgICAgICBTdHI6OlN5bWJvbCwgOmFmdGVyX29iamVjdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpwYXJlbnRoIGRvCisgICAgICAgIHJ1bGUgL1spXS8gZG8KKyAgICAgICAgICB0b2tlbiBTdHI6OlN5bWJvbAorICAgICAgICAgIGdvdG8gOmFmdGVyX29iamVjdAorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6aW5uZXJfcGFyZW50aAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbm5lcl9wYXJlbnRoIGRvCisgICAgICAgIHJ1bGUgLyNbKF0vLCBTdHI6OlN5bWJvbCwgOmlubmVyX3BhcmVudGgKKyAgICAgICAgcnVsZSAvWyldLywgU3RyOjpTeW1ib2wsIDpwb3AhCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlcworICAgICAgICBtaXhpbiA6bGl0ZXJhbHMKKyAgICAgICAgcnVsZSAvKCN7b3BzfXxbXHc6XSkrLywgU3RyOjpTeW1ib2wKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6d2hpdGVzcGFjZXMgZG8KKyAgICAgICAgcnVsZSAvISAhJC8sIEtleXdvcmQgIyBzcXVlYWsgY2h1bmsgZGVsaW1pdGVyCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgLyIuKj8iL20sIENvbW1lbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6b2JqZWN0cyBkbworICAgICAgICBydWxlIC9cWy8sIFB1bmN0dWF0aW9uLCA6YmxvY2tfdmFyaWFibGVzCisgICAgICAgIHJ1bGUgLyhzZWxmfHN1cGVyfHRydWV8ZmFsc2V8bmlsfHRoaXNDb250ZXh0KVxiLywKKyAgICAgICAgICBOYW1lOjpCdWlsdGluOjpQc2V1ZG8sIDphZnRlcl9vYmplY3QKKyAgICAgICAgcnVsZSAvW0EtWl1cdyooPyE6KVxiLywgTmFtZTo6Q2xhc3MsIDphZnRlcl9vYmplY3QKKyAgICAgICAgcnVsZSAvW2Etel1cdyooPyE6KVxiLywgTmFtZTo6VmFyaWFibGUsIDphZnRlcl9vYmplY3QKKyAgICAgICAgbWl4aW4gOmxpdGVyYWxzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmFmdGVyX29iamVjdCBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZXMKKyAgICAgICAgcnVsZSAvKGlmVHJ1ZXxpZkZhbHNlfHdoaWxlVHJ1ZXx3aGlsZUZhbHNlfHRpbWVzUmVwZWF0KTovLAorICAgICAgICAgIE5hbWU6OkJ1aWx0aW4sIDpwb3AhCisgICAgICAgIHJ1bGUgL25ldyg/ITopXGIvLCBOYW1lOjpCdWlsdGluCisgICAgICAgIHJ1bGUgLzo9fF8vLCBPcGVyYXRvciwgOnBvcCEKKyAgICAgICAgcnVsZSAvW2Etel0rXHcqOi9pLCBOYW1lOjpGdW5jdGlvbiwgOnBvcCEKKyAgICAgICAgcnVsZSAvW2Etel0rXHcqL2ksIE5hbWU6OkZ1bmN0aW9uCisgICAgICAgIHJ1bGUgLyN7b3BzfSsvLCBOYW1lOjpGdW5jdGlvbiwgOnBvcCEKKyAgICAgICAgcnVsZSAvWy5dLywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIHJ1bGUgLzsvLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zbWFydHkucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zbWFydHkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2OWRjYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NtYXJ0eS5yYgpAQCAtMCwwICsxLDkxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgU21hcnR5IDwgVGVtcGxhdGVMZXhlcgorICAgICAgdGl0bGUgIlNtYXJ0eSIKKyAgICAgIGRlc2MgJ1NtYXJ0eSBUZW1wbGF0ZSBFbmdpbmUnCisgICAgICB0YWcgJ3NtYXJ0eScKKyAgICAgIGFsaWFzZXMgJ3NtYXJ0eScKKyAgICAgIGZpbGVuYW1lcyAnKi50cGwnLCAnKi5zbWFydHknCisgICAgICBtaW1ldHlwZXMgJ2FwcGxpY2F0aW9uL3gtc21hcnR5JywgJ3RleHQveC1zbWFydHknCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICBydiA9IDAuMAorICAgICAgICBydiArPSAwLjE1IGlmIHRleHQgPX4gL1x7aWZccysuKj9cfS4qP1x7XC9pZlx9LworICAgICAgICBydiArPSAwLjE1IGlmIHRleHQgPX4gL1x7aW5jbHVkZVxzK2ZpbGU9Lio/XH0vCisgICAgICAgIHJ2ICs9IDAuMTUgaWYgdGV4dCA9fiAvXHtmb3JlYWNoXHMrLio/XH0uKj9ce1wvZm9yZWFjaFx9LworICAgICAgICBydiArPSAwLjAxIGlmIHRleHQgPX4gL1x7XCQuKj9cfS8KKyAgICAgICAgcmV0dXJuIHJ2CisgICAgICBlbmQKKworCisKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0gJXcoCisgICAgICAgICAgYXBwZW5kIGFzc2lnbiBibG9jayBjYWxsIGNhcHR1cmUgY29uZmlnX2xvYWQgZGVidWcgZXh0ZW5kcworICAgICAgICAgIGZvciBmb3JlYWNoIGZvcmVhY2hlbHNlIGJyZWFrIGNvbnRpbnVlIGZ1bmN0aW9uIGlmIGVsc2VpZgorICAgICAgICAgIGVsc2UgaW5jbHVkZSBpbmNsdWRlX3BocCBpbnNlcnQgbGRlbGltIHJkZWxpbSBsaXRlcmFsIG5vY2FjaGUKKyAgICAgICAgICBwaHAgc2VjdGlvbiBzZWN0aW9uZWxzZSBzZXRmaWx0ZXIgc3RyaXAgd2hpbGUKKyAgICAgICAgICBjb3VudGVyIGN5Y2xlIGV2YWwgZmV0Y2ggaHRtbF9jaGVja2JveGVzIGh0bWxfaW1hZ2UgaHRtbF9vcHRpb25zCisgICAgICAgICAgaHRtbF9yYWRpb3MgaHRtbF9zZWxlY3RfZGF0ZSBodG1sX3NlbGVjdF90aW1lIGh0bWxfdGFibGUKKyAgICAgICAgICBtYWlsdG8gbWF0aCB0ZXh0Zm9ybWF0CisgICAgICAgICAgY2FwaXRhbGl6ZSBjYXQgY291bnRfY2hhcmFjdGVycyBjb3VudF9wYXJhZ3JhcGhzCisgICAgICAgICAgY291bnRfc2VudGVuY2VzIGNvdW50X3dvcmRzIGRhdGVfZm9ybWF0IGRlZmF1bHQgZXNjYXBlCisgICAgICAgICAgZnJvbV9jaGFyc2V0IGluZGVudCBsb3dlciBubDJiciByZWdleF9yZXBsYWNlIHJlcGxhY2Ugc3BhY2lmeQorICAgICAgICAgIHN0cmluZ19mb3JtYXQgc3RyaXAgc3RyaXBfdGFncyB0b19jaGFyc2V0IHRydW5jYXRlIHVuZXNjYXBlCisgICAgICAgICAgdXBwZXIgd29yZHdyYXAKKyAgICAgICAgKQorICAgICAgZW5kCisKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSgvXHtccysvKSB7IGRlbGVnYXRlIHBhcmVudCB9CisKKyAgICAgICAgIyBibG9jayBjb21tZW50cworICAgICAgICBydWxlIC9ce1wqLio/XCpcfS9tLCBDb21tZW50CisKKyAgICAgICAgcnVsZSAvXHtcLz8oPyFbXHMqXSkvIGRvCisgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIHB1c2ggOnNtYXJ0eQorICAgICAgICBlbmQKKworCisgICAgICAgIHJ1bGUoLy4qPyg/PXtbXC9hLXpBLVowLTkkIyoiJ10pfC4qL20pIHsgZGVsZWdhdGUgcGFyZW50IH0KKyAgICAgICAgcnVsZSgvLisvbSkgeyBkZWxlZ2F0ZSBwYXJlbnQgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tZW50IGRvCisgICAgICAgIHJ1bGUoL3tcKi8pIHsgdG9rZW4gQ29tbWVudDsgcHVzaCB9CisgICAgICAgIHJ1bGUoL1wqfS8pIHsgdG9rZW4gQ29tbWVudDsgcG9wISB9CisgICAgICAgIHJ1bGUoL1tee31dKy9tKSB7IHRva2VuIENvbW1lbnQgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzbWFydHkgZG8KKyAgICAgICAgIyBhbGxvdyBuZXN0ZWQgdGFncworICAgICAgICBydWxlIC9ce1wvPyg/IVtccypdKS8gZG8KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgcHVzaCA6c21hcnR5CisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL30vLCBLZXl3b3JkLCA6cG9wIQorICAgICAgICBydWxlIC9ccysvbSwgVGV4dAorICAgICAgICBydWxlICVyKFt+ISVeJiooKSs9fFxbXF06OywuPD4vQD8tXSksIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgLyNbYS16QS1aX11cdyojLywgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgcnVsZSAvXCRbYS16QS1aX11cdyooXC5cdyspKi8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgLyh0cnVlfGZhbHNlfG51bGwpXGIvLCBLZXl3b3JkOjpDb25zdGFudAorCXJ1bGUgL1swLTldKFwuWzAtOV0qKT8oZUVbKy1dWzAtOV0pP1tmbEZMZERdP3wwW3hYXVswLTlhLWZBLUZdK1tMbF0/LywgTnVtCisJcnVsZSAvIihcXC58LikqPyIvLCBTdHI6OkRvdWJsZQorICAgICAgICBydWxlIC8nKFxcLnwuKSo/Jy8sIFN0cjo6U2luZ2xlCisJcnVsZSAvKFthLXpBLVpfXVx3KikvIGRvIHxtfAorCSAgaWYgc2VsZi5jbGFzcy5idWlsdGlucy5pbmNsdWRlPyBtWzBdCisJICAgIHRva2VuIE5hbWU6OkJ1aWx0aW4KKwkgIGVsc2UKKwkgICAgdG9rZW4gTmFtZTo6QXR0cmlidXRlCisJICBlbmQKKwllbmQKKyAgICAgIGVuZAorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zbWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zbWwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5MTU4YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NtbC5yYgpAQCAtMCwwICsxLDM0NyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFNNTCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJTTUwiCisgICAgICBkZXNjICdTdGFuZGFyZCBNTCcKKyAgICAgIHRhZyAnc21sJworICAgICAgYWxpYXNlcyAnbWwnCisgICAgICBmaWxlbmFtZXMgJyouc21sJywgJyouc2lnJywgJyouZnVuJworCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC1zdGFuZGFyZG1sJywgJ2FwcGxpY2F0aW9uL3gtc3RhbmRhcmRtbCcKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGFic3R5cGUgYW5kIGFuZGFsc28gYXMgY2FzZSBkYXRhdHlwZSBkbyBlbHNlIGVuZCBleGNlcHRpb24KKyAgICAgICAgICBmbiBmdW4gaGFuZGxlIGlmIGluIGluZml4IGluZml4ciBsZXQgbG9jYWwgbm9uZml4IG9mIG9wIG9wZW4KKyAgICAgICAgICBvcmVsc2UgcmFpc2UgcmVjIHRoZW4gdHlwZSB2YWwgd2l0aCB3aXRodHlwZSB3aGlsZQorICAgICAgICAgIGVxdHlwZSBmdW5jdG9yIGluY2x1ZGUgc2hhcmluZyBzaWcgc2lnbmF0dXJlIHN0cnVjdCBzdHJ1Y3R1cmUKKyAgICAgICAgICB3aGVyZQorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuc3ltYm9saWNfcmVzZXJ2ZWQKKyAgICAgICAgQHN5bWJvbGljX3Jlc2VydmVkIHx8PSBTZXQubmV3ICV3KDogfCA9ID0+IC0+ICMgOj4pCisgICAgICBlbmQKKworICAgICAgaWQgPSAvW1x3J10rL2kKKyAgICAgIHN5bWJvbCA9ICVyKFshJSYkIy86PD0+P0BcXH5gXnwqKy1dKykKKworICAgICAgZGVmIHNlbGYuYW5hbHl6ZV90ZXh0KHRleHQpCisgICAgICAgIHJldHVybiAwCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOndoaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgcnVsZSAvWyhdWypdLywgQ29tbWVudCwgOmNvbW1lbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZGVsaW1pdGVycyBkbworICAgICAgICBydWxlIC9bKFxbe10vLCBQdW5jdHVhdGlvbiwgOm1haW4KKyAgICAgICAgcnVsZSAvWylcXX1dLywgUHVuY3R1YXRpb24sIDpwb3AhCisKKyAgICAgICAgcnVsZSAvXGIobGV0fGlmfGxvY2FsKVxiKD8hJykvLCBLZXl3b3JkOjpSZXNlcnZlZCBkbworICAgICAgICAgIHB1c2g7IHB1c2gKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvXGIoc3RydWN0fHNpZ3x3aGlsZSlcYig/IScpLyBkbworICAgICAgICAgIHRva2VuIEtleXdvcmQ6OlJlc2VydmVkCisgICAgICAgICAgcHVzaAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9cYihkb3xlbHNlfGVuZHxpbnx0aGVuKVxiKD8hJykvLCBLZXl3b3JkOjpSZXNlcnZlZCwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBkZWYgdG9rZW5fZm9yX2lkX3dpdGhfZG90KGlkKQorICAgICAgICBpZiBzZWxmLmNsYXNzLmtleXdvcmRzLmluY2x1ZGU/IGlkCisgICAgICAgICAgRXJyb3IKKyAgICAgICAgZWxzZQorICAgICAgICAgIE5hbWU6Ok5hbWVzcGFjZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgdG9rZW5fZm9yX2ZpbmFsX2lkKGlkKQorICAgICAgICBpZiBzZWxmLmNsYXNzLmtleXdvcmRzLmluY2x1ZGU/IGlkIG9yIHNlbGYuY2xhc3Muc3ltYm9saWNfcmVzZXJ2ZWQuaW5jbHVkZT8gaWQKKyAgICAgICAgICBFcnJvcgorICAgICAgICBlbHNlCisgICAgICAgICAgTmFtZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgdG9rZW5fZm9yX2lkKGlkKQorICAgICAgICBpZiBzZWxmLmNsYXNzLmtleXdvcmRzLmluY2x1ZGU/IGlkCisgICAgICAgICAgS2V5d29yZDo6UmVzZXJ2ZWQKKyAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5zeW1ib2xpY19yZXNlcnZlZC5pbmNsdWRlPyBpZAorICAgICAgICAgIFB1bmN0dWF0aW9uCisgICAgICAgIGVsc2UKKyAgICAgICAgICBOYW1lCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb3JlIGRvCisgICAgICAgIHJ1bGUgL1soKVxbXF17fSw7X118Wy5dWy5dWy5dLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvIyIvLCBTdHI6OkNoYXIsIDpjaGFyCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnN0cmluZworICAgICAgICBydWxlIC9+PzB4WzAtOWEtZkEtRl0rLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvMHd4WzAtOWEtZkEtRl0rLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvMHdcZCsvLCBOdW06OkludGVnZXIKKyAgICAgICAgcnVsZSAvfj9cZCsoWy5dXGQrKT9bZUVdfj9cZCsvLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL34/XGQrWy5dXGQrLywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9+P1xkKy8sIE51bTo6SW50ZWdlcgorCisgICAgICAgIHJ1bGUgLyNccypbMS05XVswLTldKi8sIE5hbWU6OkxhYmVsCisgICAgICAgIHJ1bGUgLyNccyoje2lkfS8sIE5hbWU6OkxhYmVsCisgICAgICAgIHJ1bGUgLyNccysje3N5bWJvbH0vLCBOYW1lOjpMYWJlbAorCisgICAgICAgIHJ1bGUgL1xiKGRhdGF0eXBlfGFic3R5cGUpXGIoPyEnKS8sIEtleXdvcmQ6OlJlc2VydmVkLCA6ZG5hbWUKKyAgICAgICAgcnVsZSgvKD89XGJleGNlcHRpb25cYig/IScpKS8pIHsgcHVzaCA6ZW5hbWUgfQorICAgICAgICBydWxlIC9cYihmdW5jdG9yfGluY2x1ZGV8b3BlbnxzaWduYXR1cmV8c3RydWN0dXJlKVxiKD8hJykvLAorICAgICAgICAgIEtleXdvcmQ6OlJlc2VydmVkLCA6c25hbWUKKyAgICAgICAgcnVsZSAvXGIodHlwZXxlcXR5cGUpXGIoPyEnKS8sIEtleXdvcmQ6OlJlc2VydmVkLCA6dG5hbWUKKworICAgICAgICBydWxlIC8nI3tpZH0vLCBOYW1lOjpEZWNvcmF0b3IKKyAgICAgICAgcnVsZSAvKCN7aWR9KShbLl0pLyBkbyB8bXwKKyAgICAgICAgICBncm91cHModG9rZW5fZm9yX2lkX3dpdGhfZG90KG1bMV0pLCBQdW5jdHVhdGlvbikKKyAgICAgICAgICBwdXNoIDpkb3R0ZWQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSBpZCBkbyB8bXwKKyAgICAgICAgICB0b2tlbiB0b2tlbl9mb3JfaWQobVswXSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSBzeW1ib2wgZG8gfG18CisgICAgICAgICAgdG9rZW4gdG9rZW5fZm9yX2lkKG1bMF0pCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkb3R0ZWQgZG8KKyAgICAgICAgcnVsZSAvKCN7aWR9KShbLl0pLyBkbyB8bXwKKyAgICAgICAgICBncm91cHModG9rZW5fZm9yX2lkX3dpdGhfZG90KG1bMV0pLCBQdW5jdHVhdGlvbikKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSBpZCBkbyB8bXwKKyAgICAgICAgICB0b2tlbiB0b2tlbl9mb3JfaWQobVswXSkKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgc3ltYm9sIGRvIHxtfAorICAgICAgICAgIHRva2VuIHRva2VuX2Zvcl9pZChtWzBdKQorICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvIyEuKj9cbi8sIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgcnVsZSgvLykgeyBwdXNoIDptYWluIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bWFpbiBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorCisgICAgICAgIHJ1bGUgL1xiKHZhbHxhbmQpXGIoPyEnKS8sIEtleXdvcmQ6OlJlc2VydmVkLCA6dm5hbWUKKyAgICAgICAgcnVsZSAvXGIoZnVuKVxiKD8hJykvIGRvCisgICAgICAgICAgdG9rZW4gS2V5d29yZDo6UmVzZXJ2ZWQKKyAgICAgICAgICBnb3RvIDptYWluX2Z1bgorICAgICAgICAgIHB1c2ggOmZuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgIG1peGluIDpkZWxpbWl0ZXJzCisgICAgICAgIG1peGluIDpjb3JlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm1haW5fZnVuIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgL1xiKGZ1bnxhbmQpXGIoPyEnKS8sIEtleXdvcmQ6OlJlc2VydmVkLCA6Zm5hbWUKKyAgICAgICAgcnVsZSAvXGJ2YWxcYig/IScpLyBkbworICAgICAgICAgIHRva2VuIEtleXdvcmQ6OlJlc2VydmVkCisgICAgICAgICAgZ290byA6bWFpbgorICAgICAgICAgIHB1c2ggOnZuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1t8XS8sIFB1bmN0dWF0aW9uLCA6Zm5hbWUKKyAgICAgICAgcnVsZSAvXGIoY2FzZXxoYW5kbGUpXGIoPyEnKS8gZG8KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpSZXNlcnZlZAorICAgICAgICAgIGdvdG8gOm1haW4KKyAgICAgICAgZW5kCisKKyAgICAgICAgbWl4aW4gOmRlbGltaXRlcnMKKyAgICAgICAgbWl4aW4gOmNvcmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aGFzX2VzY2FwZXMgZG8KKyAgICAgICAgcnVsZSAvXFxbXFwiYWJ0bnZmcl0vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9cXFxeW1x4NDAtXHg1ZV0vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9cXFswLTldezN9LywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvXFx1XGh7NH0vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9cXFxzK1xcLywgU3RyOjpJbnRlcnBvbAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmcgZG8KKyAgICAgICAgcnVsZSAvW14iXFxdKy8sIFN0cjo6RG91YmxlCisgICAgICAgIHJ1bGUgLyIvLCBTdHI6OkRvdWJsZSwgOnBvcCEKKyAgICAgICAgbWl4aW4gOmhhc19lc2NhcGVzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNoYXIgZG8KKyAgICAgICAgcnVsZSAvW14iXFxdKy8sIFN0cjo6Q2hhcgorICAgICAgICBydWxlIC8iLywgU3RyOjpDaGFyLCA6cG9wIQorICAgICAgICBtaXhpbiA6aGFzX2VzY2FwZXMKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YnJlYWtvdXQgZG8KKyAgICAgICAgcnVsZSAvKD89XHcrXGIoI3tTTUwua2V5d29yZHMudG9fYS5qb2luKCd8Jyl9KVxiKD8hJykpLyBkbworICAgICAgICAgIHBvcCEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNuYW1lIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIG1peGluIDpicmVha291dAorICAgICAgICBydWxlIGlkLCBOYW1lOjpOYW1lc3BhY2UKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aGFzX2Fubm90YXRpb25zIGRvCisgICAgICAgIHJ1bGUgLydbXHcnXSovLCBOYW1lOjpEZWNvcmF0b3IKKyAgICAgICAgcnVsZSAvWyhdLywgUHVuY3R1YXRpb24sIDp0eXZhcnNlcQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmbmFtZSBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgICBtaXhpbiA6aGFzX2Fubm90YXRpb25zCisKKyAgICAgICAgcnVsZSBpZCwgTmFtZTo6RnVuY3Rpb24sIDpwb3AhCisgICAgICAgIHJ1bGUgc3ltYm9sLCBOYW1lOjpGdW5jdGlvbiwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dm5hbWUgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgbWl4aW4gOmhhc19hbm5vdGF0aW9ucworCisgICAgICAgIHJ1bGUgLygje2lkfSkoXHMqKSg9KD8hI3tzeW1ib2x9KSkvbSBkbworICAgICAgICAgIGdyb3VwcyBOYW1lOjpWYXJpYWJsZSwgVGV4dCwgUHVuY3R1YXRpb24KKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLygje3N5bWJvbH0pKFxzKikoPSg/ISN7c3ltYm9sfSkpL20gZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6VmFyaWFibGUsIFRleHQsIFB1bmN0dWF0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OlZhcmlhYmxlLCA6cG9wIQorICAgICAgICBydWxlIHN5bWJvbCwgTmFtZTo6VmFyaWFibGUsIDpwb3AhCisKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dG5hbWUgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgbWl4aW4gOmJyZWFrb3V0CisgICAgICAgIG1peGluIDpoYXNfYW5ub3RhdGlvbnMKKworICAgICAgICBydWxlIC8nW1x3J10qLywgTmFtZTo6RGVjb3JhdG9yCisgICAgICAgIHJ1bGUgL1soXS8sIFB1bmN0dWF0aW9uLCA6dHl2YXJzZXEKKworICAgICAgICBydWxlICVyKD0oPyEje3N5bWJvbH0pKSBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgZ290byA6dHlwYmluZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIGlkLCBLZXl3b3JkOjpUeXBlCisgICAgICAgIHJ1bGUgc3ltYm9sLCBLZXl3b3JkOjpUeXBlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnR5cGJpbmQgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKworICAgICAgICBydWxlIC9cYihhbmQpXGIoPyEnKS8gZG8KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpSZXNlcnZlZAorICAgICAgICAgIGdvdG8gOnRuYW1lCisgICAgICAgIGVuZAorCisgICAgICAgIG1peGluIDpicmVha291dAorICAgICAgICBtaXhpbiA6Y29yZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkbmFtZSBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgICBtaXhpbiA6YnJlYWtvdXQKKyAgICAgICAgbWl4aW4gOmhhc19hbm5vdGF0aW9ucworCisgICAgICAgIHJ1bGUgLyg9KShccyopKGRhdGF0eXBlKVxiLyBkbworICAgICAgICAgIGdyb3VwcyBQdW5jdHVhdGlvbiwgVGV4dCwgS2V5d29yZDo6UmVzZXJ2ZWQKKyAgICAgICAgICBwb3AhCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgJXIoPSg/ISN7c3ltYm9sfSkpIGRvCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb24KKyAgICAgICAgICBnb3RvIDpkYXRiaW5kCisgICAgICAgICAgcHVzaCA6ZGF0Y29uCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgaWQsIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgcnVsZSBzeW1ib2wsIEtleXdvcmQ6OlR5cGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZGF0YmluZCBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgICBydWxlIC9cYihhbmQpXGIoPyEnKS8gZG8KKyAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpSZXNlcnZlZDsgZ290byA6ZG5hbWUKKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGUgL1xiKHdpdGh0eXBlKVxiKD8hJykvIGRvCisgICAgICAgICAgdG9rZW4gS2V5d29yZDo6UmVzZXJ2ZWQ7IGdvdG8gOnRuYW1lCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC9cYm9mXGIoPyEnKS8sIEtleXdvcmQ6OlJlc2VydmVkCisgICAgICAgIHJ1bGUgLyhbfF0pKFxzKikoI3tpZH0pLyBkbworICAgICAgICAgIGdyb3VwcyhQdW5jdHVhdGlvbiwgVGV4dCwgTmFtZTo6Q2xhc3MpCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyhbfF0pKFxzKykoI3tzeW1ib2x9KS8gZG8KKyAgICAgICAgICBncm91cHMoUHVuY3R1YXRpb24sIFRleHQsIE5hbWU6OkNsYXNzKQorICAgICAgICBlbmQKKworICAgICAgICBtaXhpbiA6YnJlYWtvdXQKKyAgICAgICAgbWl4aW4gOmNvcmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZW5hbWUgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAvKGV4Y2VwdGlvbnxhbmQpKFxzKykoI3tpZH0pLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpSZXNlcnZlZCwgVGV4dCwgTmFtZTo6Q2xhc3MKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKGV4Y2VwdGlvbnxhbmQpKFxzKikoI3tzeW1ib2x9KS8gZG8KKyAgICAgICAgICBncm91cHMgS2V5d29yZDo6UmVzZXJ2ZWQsIFRleHQsIE5hbWU6OkNsYXNzCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1xiKG9mKVxiKD8hJykvLCBLZXl3b3JkOjpSZXNlcnZlZAorICAgICAgICBtaXhpbiA6YnJlYWtvdXQKKyAgICAgICAgbWl4aW4gOmNvcmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZGF0Y29uIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OkNsYXNzLCA6cG9wIQorICAgICAgICBydWxlIHN5bWJvbCwgTmFtZTo6Q2xhc3MsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnR5dmFyc2VxIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgLydbXHcnXSovLCBOYW1lOjpEZWNvcmF0b3IKKyAgICAgICAgcnVsZSBpZCwgTmFtZQorICAgICAgICBydWxlIC8sLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvWyldLywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIHJ1bGUgc3ltYm9sLCBOYW1lCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNvbW1lbnQgZG8KKyAgICAgICAgcnVsZSAvW14oKildKy8sIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgICBydWxlIC9bKF1bKl0vIGRvCisgICAgICAgICAgdG9rZW4gQ29tbWVudDo6TXVsdGlsaW5lOyBwdXNoCisgICAgICAgIGVuZAorICAgICAgICBydWxlIC9bKl1bKV0vLCBDb21tZW50OjpNdWx0aWxpbmUsIDpwb3AhCisgICAgICAgIHJ1bGUgL1soKildLywgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NxbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3NxbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2VjMWNmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc3FsLnJiCkBAIC0wLDAgKzEsMTQwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgU1FMIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIlNRTCIKKyAgICAgIGRlc2MgIlN0cnVjdHVyZWQgUXVlcnkgTGFuZ3VhZ2UsIGZvciByZWxhdGlvbmFsIGRhdGFiYXNlcyIKKyAgICAgIHRhZyAnc3FsJworICAgICAgZmlsZW5hbWVzICcqLnNxbCcKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LXNxbCcKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIEFCT1JUIEFCUyBBQlNPTFVURSBBQ0NFU1MgQURBIEFERCBBRE1JTiBBRlRFUiBBR0dSRUdBVEUgQUxJQVMKKyAgICAgICAgICBBTEwgQUxMT0NBVEUgQUxURVIgQU5BTFlTRSBBTkFMWVpFIEFORCBBTlkgQVJFIEFTIEFTQyBBU0VOU0lUSVZFCisgICAgICAgICAgQVNTRVJUSU9OIEFTU0lHTk1FTlQgQVNZTU1FVFJJQyBBVCBBVE9NSUMgQVVUSE9SSVpBVElPTgorICAgICAgICAgIEFWRyBCQUNLV0FSRCBCRUZPUkUgQkVHSU4gQkVUV0VFTiBCSVRWQVIgQklUX0xFTkdUSCBCT1RICisgICAgICAgICAgQlJFQURUSCBCWSBDIENBQ0hFIENBTEwgQ0FMTEVEIENBUkRJTkFMSVRZIENBU0NBREUgQ0FTQ0FERUQKKyAgICAgICAgICBDQVNFIENBU1QgQ0FUQUxPRyBDQVRBTE9HX05BTUUgQ0hBSU4gQ0hBUkFDVEVSSVNUSUNTCisgICAgICAgICAgQ0hBUkFDVEVSX0xFTkdUSCBDSEFSQUNURVJfU0VUX0NBVEFMT0cgQ0hBUkFDVEVSX1NFVF9OQU1FCisgICAgICAgICAgQ0hBUkFDVEVSX1NFVF9TQ0hFTUEgQ0hBUl9MRU5HVEggQ0hFQ0sgQ0hFQ0tFRCBDSEVDS1BPSU5UCisgICAgICAgICAgQ0xBU1MgQ0xBU1NfT1JJR0lOIENMT0IgQ0xPU0UgQ0xVU1RFUiBDT0FMU0VDRSBDT0JPTCBDT0xMQVRFCisgICAgICAgICAgQ09MTEFUSU9OIENPTExBVElPTl9DQVRBTE9HIENPTExBVElPTl9OQU1FIENPTExBVElPTl9TQ0hFTUEKKyAgICAgICAgICBDT0xVTU4gQ09MVU1OX05BTUUgQ09NTUFORF9GVU5DVElPTiBDT01NQU5EX0ZVTkNUSU9OX0NPREUKKyAgICAgICAgICBDT01NRU5UIENPTU1JVCBDT01NSVRURUQgQ09NUExFVElPTiBDT05ESVRJT05fTlVNQkVSCisgICAgICAgICAgQ09OTkVDVCBDT05ORUNUSU9OIENPTk5FQ1RJT05fTkFNRSBDT05TVFJBSU5UIENPTlNUUkFJTlRTCisgICAgICAgICAgQ09OU1RSQUlOVF9DQVRBTE9HIENPTlNUUkFJTlRfTkFNRSBDT05TVFJBSU5UX1NDSEVNQQorICAgICAgICAgIENPTlNUUlVDVE9SIENPTlRBSU5TIENPTlRJTlVFIENPTlZFUlNJT04gQ09OVkVSVCBDT1BZCisgICAgICAgICAgQ09SUkVTUE9OVElORyBDT1VOVCBDUkVBVEUgQ1JFQVRFREIgQ1JFQVRFVVNFUiBDUk9TUyBDVUJFCisgICAgICAgICAgQ1VSUkVOVCBDVVJSRU5UX0RBVEUgQ1VSUkVOVF9QQVRIIENVUlJFTlRfUk9MRSBDVVJSRU5UX1RJTUUKKyAgICAgICAgICBDVVJSRU5UX1RJTUVTVEFNUCBDVVJSRU5UX1VTRVIgQ1VSU09SIENVUlNPUl9OQU1FIENZQ0xFIERBVEEKKyAgICAgICAgICBEQVRBQkFTRSBEQVRFVElNRV9JTlRFUlZBTF9DT0RFIERBVEVUSU1FX0lOVEVSVkFMX1BSRUNJU0lPTgorICAgICAgICAgIERBWSBERUFMTE9DQVRFIERFQ0xBUkUgREVGQVVMVCBERUZBVUxUUyBERUZFUlJBQkxFIERFRkVSUkVECisgICAgICAgICAgREVGSU5FRCBERUZJTkVSIERFTEVURSBERUxJTUlURVIgREVMSU1JVEVSUyBERVJFRiBERVNDIERFU0NSSUJFCisgICAgICAgICAgREVTQ1JJUFRPUiBERVNUUk9ZIERFU1RSVUNUT1IgREVURVJNSU5JU1RJQyBESUFHTk9TVElDUworICAgICAgICAgIERJQ1RJT05BUlkgRElTQ09OTkVDVCBESVNQQVRDSCBESVNUSU5DVCBETyBET01BSU4gRFJPUAorICAgICAgICAgIERZTkFNSUMgRFlOQU1JQ19GVU5DVElPTiBEWU5BTUlDX0ZVTkNUSU9OX0NPREUgRUFDSCBFTFNFCisgICAgICAgICAgRU5DT0RJTkcgRU5DUllQVEVEIEVORCBFTkQtRVhFQyBFUVVBTFMgRVNDQVBFIEVWRVJZIEVYQ0VQVAorICAgICAgICAgIEVTQ0VQVElPTiBFWENMVURJTkcgRVhDTFVTSVZFIEVYRUMgRVhFQ1VURSBFWElTVElORyBFWElTVFMKKyAgICAgICAgICBFWFBMQUlOIEVYVEVSTkFMIEVYVFJBQ1QgRkFMU0UgRkVUQ0ggRklOQUwgRklSU1QgRk9SIEZPUkNFCisgICAgICAgICAgRk9SRUlHTiBGT1JUUkFOIEZPUldBUkQgRk9VTkQgRlJFRSBGUkVFWkUgRlJPTSBGVUxMIEZVTkNUSU9OCisgICAgICAgICAgRyBHRU5FUkFMIEdFTkVSQVRFRCBHRVQgR0xPQkFMIEdPIEdPVE8gR1JBTlQgR1JBTlRFRCBHUk9VUAorICAgICAgICAgIEdST1VQSU5HIEhBTkRMRVIgSEFWSU5HIEhJRVJBUkNIWSBIT0xEIEhPU1QgSURFTlRJVFkgSUdOT1JFCisgICAgICAgICAgSUxJS0UgSU1NRURJQVRFIElNTVVUQUJMRSBJTVBMRU1FTlRBVElPTiBJTVBMSUNJVCBJTiBJTkNMVURJTkcKKyAgICAgICAgICBJTkNSRU1FTlQgSU5ERVggSU5ESVRDQVRPUiBJTkZJWCBJTkhFUklUUyBJTklUSUFMSVpFIElOSVRJQUxMWQorICAgICAgICAgIElOTkVSIElOT1VUIElOUFVUIElOU0VOU0lUSVZFIElOU0VSVCBJTlNUQU5USUFCTEUgSU5TVEVBRAorICAgICAgICAgIElOVEVSU0VDVCBJTlRPIElOVk9LRVIgSVMgSVNOVUxMIElTT0xBVElPTiBJVEVSQVRFIEpPSU4gS0VZCisgICAgICAgICAgS0VZX01FTUJFUiBLRVlfVFlQRSBMQU5DT01QSUxFUiBMQU5HVUFHRSBMQVJHRSBMQVNUIExBVEVSQUwKKyAgICAgICAgICBMRUFESU5HIExFRlQgTEVOR1RIIExFU1MgTEVWRUwgTElLRSBMSU1JVCBMSVNURU4gTE9BRCBMT0NBTAorICAgICAgICAgIExPQ0FMVElNRSBMT0NBTFRJTUVTVEFNUCBMT0NBVElPTiBMT0NBVE9SIExPQ0sgTE9XRVIgTUFQIE1BVENICisgICAgICAgICAgTUFYIE1BWFZBTFVFIE1FU1NBR0VfTEVOR1RIIE1FU1NBR0VfT0NURVRfTEVOR1RIIE1FU1NBR0VfVEVYVAorICAgICAgICAgIE1FVEhPRCBNSU4gTUlOVVRFIE1JTlZBTFVFIE1PRCBNT0RFIE1PRElGSUVTIE1PRElGWSBNT05USAorICAgICAgICAgIE1PUkUgTU9WRSBNVU1QUyBOQU1FUyBOQVRJT05BTCBOQVRVUkFMIE5DSEFSIE5DTE9CIE5FVyBORVhUCisgICAgICAgICAgTk8gTk9DUkVBVEVEQiBOT0NSRUFURVVTRVIgTk9ORSBOT1QgTk9USElORyBOT1RJRlkgTk9UTlVMTAorICAgICAgICAgIE5VTEwgTlVMTEFCTEUgTlVMTElGIE9CSkVDVCBPQ1RFVF9MRU5HVEggT0YgT0ZGIE9GRlNFVCBPSURTCisgICAgICAgICAgT0xEIE9OIE9OTFkgT1BFTiBPUEVSQVRJT04gT1BFUkFUT1IgT1BUSU9OIE9QVElPTlMgT1IgT1JERVIKKyAgICAgICAgICBPUkRJTkFMSVRZIE9VVCBPVVRFUiBPVVRQVVQgT1ZFUkxBUFMgT1ZFUkxBWSBPVkVSUklESU5HCisgICAgICAgICAgT1dORVIgUEFEIFBBUkFNRVRFUiBQQVJBTUVURVJTIFBBUkFNRVRFUl9NT0RFIFBBUkFNQVRFUl9OQU1FCisgICAgICAgICAgUEFSQU1BVEVSX09SRElOQUxfUE9TSVRJT04gUEFSQU1FVEVSX1NQRUNJRklDX0NBVEFMT0cKKyAgICAgICAgICBQQVJBTUVURVJfU1BFQ0lGSUNfTkFNRSBQQVJBTUFURVJfU1BFQ0lGSUNfU0NIRU1BIFBBUlRJQUwgUEFTQ0FMCisgICAgICAgICAgUEVOREFOVCBQTEFDSU5HIFBMSSBQT1NJVElPTiBQT1NURklYIFBSRUNJU0lPTiBQUkVGSVggUFJFT1JERVIKKyAgICAgICAgICBQUkVQQVJFIFBSRVNFUlZFIFBSSU1BUlkgUFJJT1IgUFJJVklMRUdFUyBQUk9DRURVUkFMIFBST0NFRFVSRQorICAgICAgICAgIFBVQkxJQyBSRUFEIFJFQURTIFJFQ0hFQ0sgUkVDVVJTSVZFIFJFRiBSRUZFUkVOQ0VTIFJFRkVSRU5DSU5HCisgICAgICAgICAgUkVJTkRFWCBSRUxBVElWRSBSRU5BTUUgUkVQRUFUQUJMRSBSRVBMQUNFIFJFU0VUIFJFU1RBUlQKKyAgICAgICAgICBSRVNUUklDVCBSRVNVTFQgUkVUVVJOIFJFVFVSTkVEX0xFTkdUSCBSRVRVUk5FRF9PQ1RFVF9MRU5HVEgKKyAgICAgICAgICBSRVRVUk5FRF9TUUxTVEFURSBSRVRVUk5TIFJFVk9LRSBSSUdIVCBST0xFIFJPTExCQUNLIFJPTExVUAorICAgICAgICAgIFJPVVRJTkUgUk9VVElORV9DQVRBTE9HIFJPVVRJTkVfTkFNRSBST1VUSU5FX1NDSEVNQSBST1cgUk9XUworICAgICAgICAgIFJPV19DT1VOVCBSVUxFIFNBVkVfUE9JTlQgU0NBTEUgU0NIRU1BIFNDSEVNQV9OQU1FIFNDT1BFIFNDUk9MTAorICAgICAgICAgIFNFQVJDSCBTRUNPTkQgU0VDVVJJVFkgU0VMRUNUIFNFTEYgU0VOU0lUSVZFIFNFUklBTElaQUJMRQorICAgICAgICAgIFNFUlZFUl9OQU1FIFNFU1NJT04gU0VTU0lPTl9VU0VSIFNFVCBTRVRPRiBTRVRTIFNIQVJFIFNIT1cKKyAgICAgICAgICBTSU1JTEFSIFNJTVBMRSBTSVpFIFNPTUUgU09VUkNFIFNQQUNFIFNQRUNJRklDIFNQRUNJRklDVFlQRQorICAgICAgICAgIFNQRUNJRklDX05BTUUgU1FMIFNRTENPREUgU1FMRVJST1IgU1FMRVhDRVBUSU9OIFNRTFNUQVRFCisgICAgICAgICAgU1FMV0FSTklOSUcgU1RBQkxFIFNUQVJUIFNUQVRFIFNUQVRFTUVOVCBTVEFUSUMgU1RBVElTVElDUworICAgICAgICAgIFNURElOIFNURE9VVCBTVE9SQUdFIFNUUklDVCBTVFJVQ1RVUkUgU1RZUEUgU1VCQ0xBU1NfT1JJR0lOCisgICAgICAgICAgU1VCTElTVCBTVUJTVFJJTkcgU1VNIFNZTU1FVFJJQyBTWVNJRCBTWVNURU0gU1lTVEVNX1VTRVIKKyAgICAgICAgICBUQUJMRSBUQUJMRV9OQU1FICBURU1QIFRFTVBMQVRFIFRFTVBPUkFSWSBURVJNSU5BVEUgVEhBTiBUSEVOCisgICAgICAgICAgVElNRVNUQU1QIFRJTUVaT05FX0hPVVIgVElNRVpPTkVfTUlOVVRFIFRPIFRPQVNUIFRSQUlMSU5HCisgICAgICAgICAgVFJBTlNBVElPTiBUUkFOU0FDVElPTlNfQ09NTUlUVEVEIFRSQU5TQUNUSU9OU19ST0xMRURfQkFDSworICAgICAgICAgIFRSQU5TQVRJT05fQUNUSVZFIFRSQU5TRk9STSBUUkFOU0ZPUk1TIFRSQU5TTEFURSBUUkFOU0xBVElPTgorICAgICAgICAgIFRSRUFUIFRSSUdHRVIgVFJJR0dFUl9DQVRBTE9HIFRSSUdHRVJfTkFNRSBUUklHR0VSX1NDSEVNQSBUUklNCisgICAgICAgICAgVFJVRSBUUlVOQ0FURSBUUlVTVEVEIFRZUEUgVU5DT01NSVRURUQgVU5ERVIgVU5FTkNSWVBURUQgVU5JT04KKyAgICAgICAgICBVTklRVUUgVU5LTk9XTiBVTkxJU1RFTiBVTk5BTUVEIFVOTkVTVCBVTlRJTCBVUERBVEUgVVBQRVIKKyAgICAgICAgICBVU0FHRSBVU0VSIFVTRVJfREVGSU5FRF9UWVBFX0NBVEFMT0cgVVNFUl9ERUZJTkVEX1RZUEVfTkFNRQorICAgICAgICAgIFVTRVJfREVGSU5FRF9UWVBFX1NDSEVNQSBVU0lORyBWQUNVVU0gVkFMSUQgVkFMSURBVE9SIFZBTFVFUworICAgICAgICAgIFZBUklBQkxFIFZFUkJPU0UgVkVSU0lPTiBWSUVXIFZPTEFUSUxFIFdIRU4gV0hFTkVWRVIgV0hFUkUKKyAgICAgICAgICBXSVRIIFdJVEhPVVQgV09SSyBXUklURSBZRUFSIFpPTkUKKyAgICAgICAgKQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgLy0tLiovLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlcigvXCopLCBDb21tZW50OjpNdWx0aWxpbmUsIDptdWx0aWxpbmVfY29tbWVudHMKKyAgICAgICAgcnVsZSAvXGQrLywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLycvLCBTdHI6OlNpbmdsZSwgOnNpbmdsZV9zdHJpbmcKKyAgICAgICAgcnVsZSAvIi8sIE5hbWU6OlZhcmlhYmxlLCA6ZG91YmxlX3N0cmluZworICAgICAgICBydWxlIC9gLywgTmFtZTo6VmFyaWFibGUsIDpiYWNrdGljaworCisgICAgICAgIHJ1bGUgL1x3W1x3XGRdKi8gZG8gfG18CisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyBtWzBdLnVwY2FzZQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAlcihbKyovPD49fiFAIyVeJnw/Xi1dKSwgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvWzs6KClcW1xdLC5dLywgUHVuY3R1YXRpb24KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6bXVsdGlsaW5lX2NvbW1lbnRzIGRvCisgICAgICAgIHJ1bGUgJXIoL1sqXSksIENvbW1lbnQ6Ok11bHRpbGluZSwgOm11bHRpbGluZV9jb21tZW50cworICAgICAgICBydWxlICVyKFsqXS8pLCBDb21tZW50OjpNdWx0aWxpbmUsIDpwb3AhCisgICAgICAgIHJ1bGUgJXIoW14vKl0rKSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgJXIoWy8qXSksIENvbW1lbnQ6Ok11bHRpbGluZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpiYWNrdGljayBkbworICAgICAgICBydWxlIC9cXC4vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9gYC8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL2AvLCBOYW1lOjpWYXJpYWJsZSwgOnBvcCEKKyAgICAgICAgcnVsZSAvW15cXGBdKy8sIE5hbWU6OlZhcmlhYmxlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNpbmdsZV9zdHJpbmcgZG8KKyAgICAgICAgcnVsZSAvXFwuLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvJycvLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC8nLywgU3RyOjpTaW5nbGUsIDpwb3AhCisgICAgICAgIHJ1bGUgL1teXFwnXSsvLCBTdHI6OlNpbmdsZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkb3VibGVfc3RyaW5nIGRvCisgICAgICAgIHJ1bGUgL1xcLi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgLyIiLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvIi8sIE5hbWU6OlZhcmlhYmxlLCA6cG9wIQorICAgICAgICBydWxlIC9bXlxcIl0rLywgTmFtZTo6VmFyaWFibGUKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc3dpZnQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy9zd2lmdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmM1Yjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvc3dpZnQucmIKQEAgLTAsMCArMSwxNTkgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBTd2lmdCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRhZyAnc3dpZnQnCisgICAgICBmaWxlbmFtZXMgJyouc3dpZnQnCisKKyAgICAgIHRpdGxlICJTd2lmdCIKKyAgICAgIGRlc2MgJ011bHRpIHBhcmFkaWdtLCBjb21waWxlZCBwcm9ncmFtbWluZyBsYW5ndWFnZSBkZXZlbG9wZWQgYnkgQXBwbGUgZm9yIGlPUyBhbmQgT1MgWCBkZXZlbG9wbWVudC4gKGRldmVsb3Blci5hcHBsZS5jb20vc3dpZnQpJworCisgICAgICBpZF9oZWFkID0gL198KD8hXHB7TWN9KVxwe0FscGhhfXxbXlx1MDAwMC1cdUZGRkZdLworICAgICAgaWRfcmVzdCA9IC9bXHB7QWxudW19X118W15cdTAwMDAtXHVGRkZGXS8KKyAgICAgIGlkID0gLyN7aWRfaGVhZH0je2lkX3Jlc3R9Ki8KKworICAgICAga2V5d29yZHMgPSBTZXQubmV3ICV3KAorICAgICAgICBicmVhayBjYXNlIGNvbnRpbnVlIGRlZmF1bHQgZG8gZWxzZSBmYWxsdGhyb3VnaCBpZiBpbiBmb3IgcmV0dXJuIHN3aXRjaCB3aGVyZSB3aGlsZSB0cnkgY2F0Y2ggdGhyb3cgZ3VhcmQgZGVmZXIgcmVwZWF0CisKKyAgICAgICAgYXMgZHluYW1pY1R5cGUgaXMgbmV3IHN1cGVyIHNlbGYgU2VsZiBUeXBlIF9fQ09MVU1OX18gX19GSUxFX18gX19GVU5DVElPTl9fIF9fTElORV9fCisKKyAgICAgICAgYXNzb2NpYXRpdml0eSBkaWRTZXQgZ2V0IGluZml4IGlub3V0IGxlZnQgbXV0YXRpbmcgbm9uZSBub25tdXRhdGluZyBvcGVyYXRvciBvdmVycmlkZSBwb3N0Zml4IHByZWNlZGVuY2UgcHJlZml4IHJpZ2h0IHNldCB1bm93bmVkIHdlYWsgd2lsbFNldCB0aHJvd3MgcmV0aHJvd3MgYXNzb2NpYXRlZHR5cGUKKyAgICAgICkKKworICAgICAgZGVjbGFyYXRpb25zID0gU2V0Lm5ldyAldygKKyAgICAgICAgY2xhc3MgZGVpbml0IGVudW0gZXh0ZW5zaW9uIGZpbmFsIGZ1bmMgaW1wb3J0IGluaXQgaW50ZXJuYWwgbGF6eSBsZXQgb3B0aW9uYWwgcHJpdmF0ZSBwcm90b2NvbCBwdWJsaWMgcmVxdWlyZWQgc3RhdGljIHN0cnVjdCBzdWJzY3JpcHQgdHlwZWFsaWFzIHZhciBkeW5hbWljIGluZGlyZWN0IGFzc29jaWF0ZWR0eXBlCisgICAgICApCisKKyAgICAgIGNvbnN0YW50cyA9IFNldC5uZXcgJXcoCisgICAgICAgIHRydWUgZmFsc2UgbmlsCisgICAgICApCisKKyAgICAgIHN0YXJ0IHsgcHVzaCA6Ym9sIH0KKworICAgICAgIyBiZWdpbm5pbmcgb2YgbGluZQorICAgICAgc3RhdGUgOmJvbCBkbworICAgICAgICBydWxlIC8jLiovLCBDb21tZW50OjpQcmVwcm9jCisKKyAgICAgICAgbWl4aW4gOmlubGluZV93aGl0ZXNwYWNlCisKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW5saW5lX3doaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXHMrL20sIFRleHQKKyAgICAgICAgbWl4aW4gOmhhc19jb21tZW50cworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp3aGl0ZXNwYWNlIGRvCisgICAgICAgIHJ1bGUgL1xuKy9tLCBUZXh0LCA6Ym9sCisgICAgICAgIHJ1bGUgJXIoXC9cLy4qPyQpLCBDb21tZW50OjpTaW5nbGUsIDpib2wKKyAgICAgICAgbWl4aW4gOmlubGluZV93aGl0ZXNwYWNlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmhhc19jb21tZW50cyBkbworICAgICAgICBydWxlICVyKC9bKl0pLCBDb21tZW50OjpNdWx0aWxpbmUsIDpuZXN0ZWRfY29tbWVudAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpuZXN0ZWRfY29tbWVudCBkbworICAgICAgICBtaXhpbiA6aGFzX2NvbW1lbnRzCisgICAgICAgIHJ1bGUgJXIoWypdLyksIENvbW1lbnQ6Ok11bHRpbGluZSwgOnBvcCEKKyAgICAgICAgcnVsZSAlcihbXiovXSspbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgLy4vLCBDb21tZW50OjpNdWx0aWxpbmUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgICBydWxlIC9cJCgoWzEtOV1cZCopP1xkKS8sIE5hbWU6OlZhcmlhYmxlCisKKyAgICAgICAgcnVsZSAlcntbKClcW1xde306Oyw/XX0sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgJXIoWy0vPSsqJTw+ISZ8Xi5+XSspLCBPcGVyYXRvcgorICAgICAgICBydWxlIC9APyIvLCBTdHIsIDpkcQorICAgICAgICBydWxlIC8nKFxcLnwuKScvLCBTdHI6OkNoYXIKKyAgICAgICAgcnVsZSAvKFxkK1wqfFxkKlwuXGQrKShlWystXT9bMC05XSspPy9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL1xkK2VbKy1dP1swLTldKy9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgLzBfP1swLTddKyg/Ol9bMC03XSspKi8sIE51bTo6T2N0CisgICAgICAgIHJ1bGUgLzB4WzAtOUEtRmEtZl0rKD86X1swLTlBLUZhLWZdKykqLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvMGJbMDFdKyg/Ol9bMDFdKykqLywgTnVtOjpCaW4KKyAgICAgICAgcnVsZSAlcntbXGRdKyg/Ol9cZCspKn0sIE51bTo6SW50ZWdlcgorCisgICAgICAgIHJ1bGUgL0Aje2lkfShcKFteKV0rXCkpPy8sIEtleXdvcmQ6OkRlY2xhcmF0aW9uCisKKyAgICAgICAgcnVsZSAvKHByaXZhdGV8aW50ZXJuYWwpKFwoWyBdKikoXHcrKShbIF0qXCkpLyBkbyB8bXwKKyAgICAgICAgICBpZiBtWzNdID09ICdzZXQnCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpEZWNsYXJhdGlvbiwgS2V5d29yZDo6RGVjbGFyYXRpb24sIEVycm9yLCBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8odW5vd25lZFwoWyBdKikoXHcrKShbIF0qXCkpLyBkbyB8bXwKKyAgICAgICAgICBpZiBtWzJdID09ICdzYWZlJyB8fCBtWzJdID09ICd1bnNhZmUnCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpEZWNsYXJhdGlvbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpEZWNsYXJhdGlvbiwgRXJyb3IsIEtleXdvcmQ6OkRlY2xhcmF0aW9uCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgcnVsZSAvI2F2YWlsYWJsZVwoW14pXStcKS8sIEtleXdvcmQ6OkRlY2xhcmF0aW9uCisgICAgICAgIAorICAgICAgICBydWxlIC8oI3NlbGVjdG9yXCgpKFteKV0rPyg/OlsoXS4qP1spXSk/KShcKSkvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQ6OkRlY2xhcmF0aW9uLCBOYW1lOjpGdW5jdGlvbiwgS2V5d29yZDo6RGVjbGFyYXRpb24KKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvKGxldHx2YXIpXGIoXHMqKSgje2lkfSkvIGRvCisgICAgICAgICAgZ3JvdXBzIEtleXdvcmQsIFRleHQsIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgLyg/IVxiKGlmfHdoaWxlfGZvcnxwcml2YXRlfGludGVybmFsfHVub3duZWR8c3dpdGNofGNhc2UpXGIpXGIje2lkfSg/PShcP3whKT9ccypbKF0pLyBkbyB8bXwKKyAgICAgICAgICBpZiBtWzBdID1+IC9eW1s6dXBwZXI6XV0vCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpUeXBlCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6RnVuY3Rpb24KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBydWxlIC9hc1s/IV0/KD89XHMpLywgS2V5d29yZAorICAgICAgICBydWxlIC90cnlbIV0/KD89XHMpLywgS2V5d29yZAorCisgICAgICAgIHJ1bGUgLygjPyg/IWRlZmF1bHQpKD8hW1s6dXBwZXI6XV0pI3tpZH0pKFxzKikoOikvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OlZhcmlhYmxlLCBUZXh0LCBQdW5jdHVhdGlvbgorICAgICAgICBlbmQKKworICAgICAgICBydWxlIGlkIGRvIHxtfAorICAgICAgICAgIGlmIGtleXdvcmRzLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQKKyAgICAgICAgICBlbHNpZiBkZWNsYXJhdGlvbnMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6RGVjbGFyYXRpb24KKyAgICAgICAgICBlbHNpZiBjb25zdGFudHMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6Q29uc3RhbnQKKyAgICAgICAgICBlbHNpZiBtWzBdID1+IC9eW1s6dXBwZXI6XV0vCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkOjpUeXBlCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9rZW4gTmFtZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZHEgZG8KKyAgICAgICAgcnVsZSAvXFxbXFwwdG5yJyJdLywgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvXFxbKF0vLCBTdHI6OkVzY2FwZSwgOmludGVycAorICAgICAgICBydWxlIC9cXHVce1xoezEsOH1cfS8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1teXFwiXSsvLCBTdHIKKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aW50ZXJwIGRvCisgICAgICAgIHJ1bGUgL1soXS8sIFB1bmN0dWF0aW9uLCA6aW50ZXJwX2lubmVyCisgICAgICAgIHJ1bGUgL1spXS8sIFN0cjo6RXNjYXBlLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbnRlcnBfaW5uZXIgZG8KKyAgICAgICAgcnVsZSAvWyhdLywgUHVuY3R1YXRpb24sIDpwdXNoCisgICAgICAgIHJ1bGUgL1spXS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBtaXhpbiA6cm9vdAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy90YXAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy90YXAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MzRlMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3RhcC5yYgpAQCAtMCwwICsxLDkxIEBACittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFRhcCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICdUQVAnCisgICAgICBkZXNjICdUZXN0IEFueXRoaW5nIFByb3RvY29sJworICAgICAgdGFnICd0YXAnCisgICAgICBhbGlhc2VzICd0YXAnCisgICAgICBmaWxlbmFtZXMgJyoudGFwJworCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC10YXAnLCAnYXBwbGljYXRpb24veC10YXAnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgICMgQSBUQVAgdmVyc2lvbiBtYXkgYmUgc3BlY2lmaWVkLgorICAgICAgICBydWxlIC9eVEFQIHZlcnNpb24gXGQrXG4vLCBOYW1lOjpOYW1lc3BhY2UKKworICAgICAgICAjIFNwZWNpZnkgYSBwbGFuIHdpdGggYSBwbGFuIGxpbmUuCisgICAgICAgIHJ1bGUgL14xXC5cLlxkKy8sIEtleXdvcmQ6OkRlY2xhcmF0aW9uLCA6cGxhbgorCisgICAgICAgICMgQSB0ZXN0IGZhaWx1cmUKKyAgICAgICAgcnVsZSAvXihub3Qgb2spKFteXFNcbl0qKShcZCopLyBkbworICAgICAgICAgIGdyb3VwcyBHZW5lcmljOjpFcnJvciwgVGV4dCwgTGl0ZXJhbDo6TnVtYmVyOjpJbnRlZ2VyCisgICAgICAgICAgcHVzaCA6dGVzdAorICAgICAgICBlbmQKKworICAgICAgICAjIEEgdGVzdCBzdWNjZXNzCisgICAgICAgIHJ1bGUgL14ob2spKFteXFNcbl0qKShcZCopLyBkbworICAgICAgICAgIGdyb3VwcyBLZXl3b3JkOjpSZXNlcnZlZCwgVGV4dCwgTGl0ZXJhbDo6TnVtYmVyOjpJbnRlZ2VyCisgICAgICAgICAgcHVzaCA6dGVzdAorICAgICAgICBlbmQKKworICAgICAgICAjIERpYWdub3N0aWNzIHN0YXJ0IHdpdGggYSBoYXNoLgorICAgICAgICBydWxlIC9eIy4qXG4vLCBDb21tZW50CisKKyAgICAgICAgIyBUQVAncyB2ZXJzaW9uIG9mIGFuIGFib3J0IHN0YXRlbWVudC4KKyAgICAgICAgcnVsZSAvXkJhaWwgb3V0IS4qXG4vLCBHZW5lcmljOjpFcnJvcgorCisgICAgICAgICMgIyBUQVAgaWdub3JlcyBhbnkgdW5yZWNvZ25pemVkIGxpbmVzLgorICAgICAgICBydWxlIC9eLipcbi8sIFRleHQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cGxhbiBkbworICAgICAgICAjIENvbnN1bWUgd2hpdGVzcGFjZSAoYnV0IG5vdCBuZXdsaW5lKS4KKyAgICAgICAgcnVsZSAvW15cU1xuXSsvLCBUZXh0CisKKyAgICAgICAgIyBBIHBsYW4gbWF5IGhhdmUgYSBkaXJlY3RpdmUgd2l0aCBpdC4KKyAgICAgICAgcnVsZSAvIy8sIENvbW1lbnQsIDpkaXJlY3RpdmUKKworICAgICAgICAjIE9yIGl0IGNvdWxkIGp1c3QgZW5kLgorICAgICAgICBydWxlIC9cbi8sIENvbW1lbnQsIDpwb3AhCisKKyAgICAgICAgIyBBbnl0aGluZyBlbHNlIGlzIHdyb25nLgorICAgICAgICBydWxlIC8uKlxuLywgR2VuZXJpYzo6RXJyb3IsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnRlc3QgZG8KKyAgICAgICAgIyBDb25zdW1lIHdoaXRlc3BhY2UgKGJ1dCBub3QgbmV3bGluZSkuCisgICAgICAgIHJ1bGUgL1teXFNcbl0rLywgVGV4dAorCisgICAgICAgICMgQSB0ZXN0IG1heSBoYXZlIGEgZGlyZWN0aXZlIHdpdGggaXQuCisgICAgICAgIHJ1bGUgLyMvLCBDb21tZW50LCA6ZGlyZWN0aXZlCisKKyAgICAgICAgcnVsZSAvXFMrLywgVGV4dAorCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZGlyZWN0aXZlIGRvCisgICAgICAgICMgQ29uc3VtZSB3aGl0ZXNwYWNlIChidXQgbm90IG5ld2xpbmUpLgorICAgICAgICBydWxlIC9bXlxTXG5dKy8sIENvbW1lbnQKKworICAgICAgICAjIEV4dHJhY3QgdG9kbyBpdGVtcy4KKyAgICAgICAgcnVsZSAvKD9pKVxiVE9ET1xiLywgQ29tbWVudDo6UHJlcHJvYworCisgICAgICAgICMgRXh0cmFjdCBza2lwIGl0ZW1zLgorICAgICAgICBydWxlIC8oP2kpXGJTS0lQXFMqLywgQ29tbWVudDo6UHJlcHJvYworCisgICAgICAgIHJ1bGUgL1xTKy8sIENvbW1lbnQKKworICAgICAgICBydWxlIC9cbi8gZG8KKyAgICAgICAgICB0b2tlbiBDb21tZW50CisgICAgICAgICAgcG9wISAyCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCisKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3RjbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3RjbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBhYzZhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdGNsLnJiCkBAIC0wLDAgKzEsMTkyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgVENMIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIlRjbCIKKyAgICAgIGRlc2MgIlRoZSBUb29sIENvbW1hbmQgTGFuZ3VhZ2UgKHRjbC50aykiCisgICAgICB0YWcgJ3RjbCcKKyAgICAgIGZpbGVuYW1lcyAnKi50Y2wnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC10Y2wnLCAndGV4dC94LXNjcmlwdC50Y2wnLCAnYXBwbGljYXRpb24veC10Y2wnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnNoZWJhbmc/ICd0Y2xzaCcKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAnd2lzaCcKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dC5zaGViYW5nPyAnamltc2gnCisgICAgICBlbmQKKworICAgICAgS0VZV09SRFMgPSAldygKKyAgICAgICAgYWZ0ZXIgYXBwbHkgYXJyYXkgYnJlYWsgY2F0Y2ggY29udGludWUgZWxzZWlmIGVsc2UgZXJyb3IKKyAgICAgICAgZXZhbCBleHByIGZvciBmb3JlYWNoIGdsb2JhbCBpZiBuYW1lc3BhY2UgcHJvYyByZW5hbWUgcmV0dXJuCisgICAgICAgIHNldCBzd2l0Y2ggdGhlbiB0cmFjZSB1bnNldCB1cGRhdGUgdXBsZXZlbCB1cHZhciB2YXJpYWJsZQorICAgICAgICB2d2FpdCB3aGlsZQorICAgICAgKQorCisgICAgICBCVUlMVElOUyA9ICV3KAorICAgICAgICBhcHBlbmQgYmdlcnJvciBiaW5hcnkgY2QgY2hhbiBjbG9jayBjbG9zZSBjb25jYXQgZGRlIGRpY3QKKyAgICAgICAgZW5jb2RpbmcgZW9mIGV4ZWMgZXhpdCBmYmxvY2tlZCBmY29uZmlndXJlIGZjb3B5IGZpbGUKKyAgICAgICAgZmlsZWV2ZW50IGZsdXNoIGZvcm1hdCBnZXRzIGdsb2IgaGlzdG9yeSBodHRwIGluY3IgaW5mbyBpbnRlcnAKKyAgICAgICAgam9pbiBsYXBwZW5kIGxhc3NpZ24gbGluZGV4IGxpbnNlcnQgbGlzdCBsbGVuZ3RoIGxvYWQgbG9hZFRrCisgICAgICAgIGxyYW5nZSBscmVwZWF0IGxyZXBsYWNlIGxyZXZlcnNlIGxzZWFyY2ggbHNldCBsc29ydCBtYXRoZnVuYworICAgICAgICBtYXRob3AgbWVtb3J5IG1zZ2NhdCBvcGVuIHBhY2thZ2UgcGlkIHBrZzo6Y3JlYXRlIHBrZ19ta0luZGV4CisgICAgICAgIHBsYXRmb3JtIHBsYXRmb3JtOjpzaGVsbCBwdXRzIHB3ZCByZV9zeW50YXggcmVhZCByZWZjaGFuCisgICAgICAgIHJlZ2V4cCByZWdpc3RyeSByZWdzdWIgc2NhbiBzZWVrIHNvY2tldCBzb3VyY2Ugc3BsaXQgc3RyaW5nCisgICAgICAgIHN1YnN0IHRlbGwgdGltZSB0bSB1bmtub3duIHVubG9hZAorICAgICAgKQorCisgICAgICBPUEVOID0gICV3fCBcKCBcWyBceyAiIHwKKyAgICAgIENMT1NFID0gJXd8IFwpIFxdIFx9IHwKKyAgICAgIEFMTCA9IE9QRU4gKyBDTE9TRQorICAgICAgRU5EX0xJTkUgPSBDTE9TRSArICV3KDsgXG4pCisgICAgICBFTkRfV09SRCA9IEVORF9MSU5FICsgJXcoXHMpCisKKyAgICAgIENIQVJTID0gICAgIGxhbWJkYSB7IHxsaXN0fCBSZWdleHAubmV3ICUvWyN7bGlzdC5qb2lufV0vICB9CisgICAgICBOT1RfQ0hBUlMgPSBsYW1iZGEgeyB8bGlzdHwgUmVnZXhwLm5ldyAlL1teI3tsaXN0LmpvaW59XS8gfQorCisgICAgICBzdGF0ZSA6d29yZCBkbworICAgICAgICBydWxlIC9ce1wqXH0vLCBLZXl3b3JkCisKKyAgICAgICAgbWl4aW4gOmJyYWNlX2Fib3J0CisgICAgICAgIG1peGluIDppbnRlcnAKKyAgICAgICAgcnVsZSAvXHsvLCBQdW5jdHVhdGlvbiwgOmJyYWNlCisgICAgICAgIHJ1bGUgL1woLywgUHVuY3R1YXRpb24sICAgOnBhcmVuCisgICAgICAgIHJ1bGUgLyIvLCAgU3RyOjpEb3VibGUsIDpzdHJpbmcKKyAgICAgICAgcnVsZSAvI3tOT1RfQ0hBUlNbRU5EX1dPUkRdfSs/KD89I3tDSEFSU1tPUEVOK1snXFxcXCddXX0pLywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmdlbl9jb21tYW5kX3N0YXRlKG5hbWU9JycpCisgICAgICAgIHN0YXRlKDoiY29tbWFuZCN7bmFtZX0iKSBkbworICAgICAgICAgIG1peGluIDp3b3JkCisKKyAgICAgICAgICBydWxlIC8jI3tOT1RfQ0hBUlNbRU5EX0xJTkVdfSsvLCBDb21tZW50OjpTaW5nbGUKKworICAgICAgICAgIHJ1bGUgLyg/PSN7Q0hBUlNbRU5EX1dPUkRdfSkvIGRvCisgICAgICAgICAgICBwdXNoIDoicGFyYW1zI3tuYW1lfSIKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIHJ1bGUgLyN7Tk9UX0NIQVJTW0VORF9XT1JEXX0rLyBkbyB8bXwKKyAgICAgICAgICAgIGlmIEtFWVdPUkRTLmluY2x1ZGU/IG1bMF0KKyAgICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgICAgZWxzaWYgQlVJTFRJTlMuaW5jbHVkZT8gbVswXQorICAgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRva2VuIFRleHQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorCisgICAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuZ2VuX2RlbGltaXRlcl9zdGF0ZXMobmFtZSwgY2xvc2UsIG9wdHM9e30pCisgICAgICAgIGdlbl9jb21tYW5kX3N0YXRlKCJfaW5fI3tuYW1lfSIpCisKKyAgICAgICAgc3RhdGUgOiJwYXJhbXNfaW5fI3tuYW1lfSIgZG8KKyAgICAgICAgICBydWxlIGNsb3NlIGRvCisgICAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgICAgcG9wISAyCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICAjIG1pc21hdGNoZWQgZGVsaW1pdGVycy4gIEJyYWNlZCBzdHJpbmdzIHdpdGggbWlzbWF0Y2hlZAorICAgICAgICAgICMgY2xvc2luZyBkZWxpbWl0ZXJzIHNob3VsZCBiZSBva2F5LCBzaW5jZSB0aGlzIGlzIHN0YW5kYXJkCisgICAgICAgICAgIyBwcmFjdGljZSwgbGlrZSB7XV1dXX0KKyAgICAgICAgICBpZiBvcHRzWzpzdHJpY3RdCisgICAgICAgICAgICBydWxlIENIQVJTW0NMT1NFIC0gW2Nsb3NlXV0sIEVycm9yCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcnVsZSBDSEFSU1tDTE9TRSAtIFtjbG9zZV1dLCBUZXh0CisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBtaXhpbiA6cGFyYW1zCisgICAgICAgIGVuZAorCisgICAgICAgIHN0YXRlIG5hbWUgZG8KKyAgICAgICAgICBydWxlIGNsb3NlLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgICAgICBtaXhpbiA6ImNvbW1hbmRfaW5fI3tuYW1lfSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworCisgICAgICAjIHRjbCBpcyBmcmVha2luZyBpbXBvc3NpYmxlLiAgSWYgd2UncmUgaW4gYnJhY2VzIGFuZCB3ZSBlbmNvdW50ZXIKKyAgICAgICMgYSBjbG9zZSBicmFjZSwgd2UgaGF2ZSB0byBkcm9wIGV2ZXJ5dGhpbmcgYW5kIGNsb3NlIHRoZSBicmFjZS4KKyAgICAgICMgVGhpcyBpcyBzbyBzaWxseSB0aGluZ3MgbGlrZSB7YWJjImRlZn0gYW5kIHthYmNdZGVmfSBkb24ndCBiMHJrCisgICAgICAjIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlbS4KKworICAgICAgIyBUT0RPOiBUQ0wgc2VlbXMgdG8gaGF2ZSB0aGlzIGFib3J0aW5nIGJlaGF2aW9yIHF1aXRlIGEgbG90LgorICAgICAgIyBzdWNoIHRoaW5ncyBhcyBbIGFiYyIgXSBhcmUgYSBydW50aW1lIGVycm9yLCBidXQgd2lsbCBzdGlsbAorICAgICAgIyBwYXJzZS4gIEN1cnJlbnRseSBzb21ldGhpbmcgbGlrZSB0aGlzIHdpbGwgbXVjayB1cCB0aGUgbGV4LgorICAgICAgc3RhdGUgOmJyYWNlX2Fib3J0IGRvCisgICAgICAgIHJ1bGUgL30vIGRvCisgICAgICAgICAgaWYgaW5fc3RhdGU/IDpicmFjZQorICAgICAgICAgICAgcG9wISB1bnRpbCBzdGF0ZT8gOmJyYWNlCisgICAgICAgICAgICBwb3AhCisgICAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIEVycm9yCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpwYXJhbXMgZG8KKyAgICAgICAgcnVsZSAvOy8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBydWxlIC9cbi8sIFRleHQsIDpwb3AhCisgICAgICAgIHJ1bGUgL2Vsc2V8ZWxzZWlmfHRoZW4vLCBLZXl3b3JkCisgICAgICAgIG1peGluIDp3b3JkCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgLyN7Tk9UX0NIQVJTW0VORF9XT1JEXX0rLywgVGV4dAorICAgICAgZW5kCisKKyAgICAgIGdlbl9kZWxpbWl0ZXJfc3RhdGVzIDpicmFjZSwgICAvXH0vLCA6c3RyaWN0ID0+IGZhbHNlCisgICAgICBnZW5fZGVsaW1pdGVyX3N0YXRlcyA6cGFyZW4sICAgL1wpLywgOnN0cmljdCA9PiB0cnVlCisgICAgICBnZW5fZGVsaW1pdGVyX3N0YXRlcyA6YnJhY2tldCwgL1xdLywgOnN0cmljdCA9PiB0cnVlCisgICAgICBnZW5fY29tbWFuZF9zdGF0ZQorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBtaXhpbiA6Y29tbWFuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDp3aGl0ZXNwYWNlIGRvCisgICAgICAgICMgbm90IGEgbXVsdGlsaW5lIHJlZ2V4IGJlY2F1c2Ugd2Ugd2FudCB0byBjYXB0dXJlIFxuIHNvbWV0aW1lcworICAgICAgICBydWxlIC9ccysvLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmludGVycCBkbworICAgICAgICBydWxlIC9cWy8sIFB1bmN0dWF0aW9uLCA6YnJhY2tldAorICAgICAgICBydWxlIC9cJFthLXowLTkuOi1dKy8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgL1wkXHsuKj9cfS9tLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBydWxlIC9cJC8sIFRleHQKKworICAgICAgICAjIGVzY2FwZSBzZXF1ZW5jZXMKKyAgICAgICAgcnVsZSAvXFxbMC03XXszfS8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1xceFswLTlhLWZdezJ9L2ksIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1xcdVswLTlhLWZdezR9L2ksIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1xcLi9tLCBTdHI6OkVzY2FwZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmcgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0cjo6RG91YmxlLCA6cG9wIQorICAgICAgICBtaXhpbiA6aW50ZXJwCisgICAgICAgIHJ1bGUgL1teXFxcW1wkInt9XSsvbSwgU3RyOjpEb3VibGUKKworICAgICAgICAjIHN0cmluZ3MgaGF2ZSB0byBrZWVwIGNvdW50IG9mIHRoZWlyIGludGVybmFsIGJyYWNlcywgdG8gc3VwcG9ydAorICAgICAgICAjIGZvciBleGFtcGxlIHsgInsgfSIgfS4KKyAgICAgICAgcnVsZSAvey8gZG8KKyAgICAgICAgICBAYnJhY2VfY291bnQgfHw9IDAKKyAgICAgICAgICBAYnJhY2VfY291bnQgKz0gMQorCisgICAgICAgICAgdG9rZW4gU3RyOjpEb3VibGUKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvfS8gZG8KKyAgICAgICAgICBpZiBpbl9zdGF0ZT8gOmJyYWNlIGFuZCBAYnJhY2VfY291bnQudG9faSA9PSAwCisgICAgICAgICAgICBwb3AhIHVudGlsIHN0YXRlPyA6YnJhY2UKKyAgICAgICAgICAgIHBvcCEKKyAgICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQGJyYWNlX2NvdW50IC09IDEKKyAgICAgICAgICAgIHRva2VuIFN0cjo6RG91YmxlCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy90ZXgucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy90ZXgucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzYTk0MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3RleC5yYgpAQCAtMCwwICsxLDcyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgVGVYIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIlRlWCIKKyAgICAgIGRlc2MgIlRoZSBUZVggdHlwZXNldHRpbmcgc3lzdGVtIgorICAgICAgdGFnICd0ZXgnCisgICAgICBhbGlhc2VzICdUZVgnLCAnTGFUZVgnLCAnbGF0ZXgnCisKKyAgICAgIGZpbGVuYW1lcyAnKi50ZXgnLCAnKi5hdXgnLCAnKi50b2MnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC10ZXgnLCAndGV4dC94LWxhdGV4JworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dCA9fiAvXEFccypcXGRvY3VtZW50Y2xhc3MvCisgICAgICAgIHJldHVybiAxIGlmIHRleHQgPX4gL1xBXHMqXFxpbnB1dC8KKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dCA9fiAvXEFccypcXGRvY3VtZW50c3R5bGUvCisgICAgICAgIHJldHVybiAxIGlmIHRleHQgPX4gL1xBXHMqXFxyZWxheC8KKyAgICAgIGVuZAorCisgICAgICBjb21tYW5kID0gL1xcKFthLXpdK3xccyt8LikvaQorCisgICAgICBzdGF0ZSA6Z2VuZXJhbCBkbworICAgICAgICBydWxlIC8lLiokLywgQ29tbWVudAorICAgICAgICBydWxlIC9be30mX15dLywgUHVuY3R1YXRpb24KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC9cXFxbLywgUHVuY3R1YXRpb24sIDpkaXNwbGF5bWF0aAorICAgICAgICBydWxlIC9cXFwoLywgUHVuY3R1YXRpb24sIDppbmxpbmVtYXRoCisgICAgICAgIHJ1bGUgL1wkXCQvLCBQdW5jdHVhdGlvbiwgOmRpc3BsYXltYXRoCisgICAgICAgIHJ1bGUgL1wkLywgUHVuY3R1YXRpb24sIDppbmxpbmVtYXRoCisgICAgICAgIHJ1bGUgL1xcKGJlZ2lufGVuZClcey4qP1x9LywgTmFtZTo6VGFnCisKKyAgICAgICAgcnVsZSAvKFxcdmVyYilcYihcUykoLio/KShcMikvIGRvIHxtfAorICAgICAgICAgIGdyb3VwcyBOYW1lOjpCdWlsdGluLCBLZXl3b3JkOjpQc2V1ZG8sIFN0cjo6T3RoZXIsIEtleXdvcmQ6OlBzZXVkbworICAgICAgICBlbmQKKworICAgICAgICBydWxlIGNvbW1hbmQsIEtleXdvcmQsIDpjb21tYW5kCisgICAgICAgIG1peGluIDpnZW5lcmFsCisgICAgICAgIHJ1bGUgL1teXFwkJSZfXnt9XSsvLCBUZXh0CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOm1hdGggZG8KKyAgICAgICAgcnVsZSBjb21tYW5kLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBtaXhpbiA6Z2VuZXJhbAorICAgICAgICBydWxlIC9bMC05XSsvLCBOdW0KKyAgICAgICAgcnVsZSAvWy09ISsqXC8oKVxbXF1dLywgT3BlcmF0b3IKKyAgICAgICAgcnVsZSAvW149ISsqXC8oKVxbXF1cXCQlJl9ee30wLTktXSsvLCBOYW1lOjpCdWlsdGluCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmlubGluZW1hdGggZG8KKyAgICAgICAgcnVsZSAvXFxcKS8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBydWxlIC9cJC8sIFB1bmN0dWF0aW9uLCA6cG9wIQorICAgICAgICBtaXhpbiA6bWF0aAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkaXNwbGF5bWF0aCBkbworICAgICAgICBydWxlIC9cXFxdLywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIHJ1bGUgL1wkXCQvLCBQdW5jdHVhdGlvbiwgOnBvcCEKKyAgICAgICAgcnVsZSAvXCQvLCBOYW1lOjpCdWlsdGluCisgICAgICAgIG1peGluIDptYXRoCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmNvbW1hbmQgZG8KKyAgICAgICAgcnVsZSAvXFsuKj9cXS8sIE5hbWU6OkF0dHJpYnV0ZQorICAgICAgICBydWxlIC9cKi8sIEtleXdvcmQKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdG9tbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3RvbWwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0YWRlMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3RvbWwucmIKQEAgLTAsMCArMSw3MSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFRPTUwgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiVE9NTCIKKyAgICAgIGRlc2MgJ3RoZSBUT01MIGNvbmZpZ3VyYXRpb24gZm9ybWF0IChodHRwczovL2dpdGh1Yi5jb20vbW9qb21iby90b21sKScKKyAgICAgIHRhZyAndG9tbCcKKworICAgICAgZmlsZW5hbWVzICcqLnRvbWwnCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC10b21sJworCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDAuMSBpZiB0ZXh0ID1+IC9cQVxbW1x3Ll0rXF1ccypcdytccyo9XHMqKCJcdysiKSsvCisgICAgICBlbmQKKworICAgICAgaWRlbnRpZmllciA9IC9bXHcuXFNdKy8KKworICAgICAgc3RhdGUgOmJhc2ljIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvIy4qPyQvLCBDb21tZW50CisgICAgICAgIHJ1bGUgLyh0cnVlfGZhbHNlKS8sIEtleXdvcmQ6OkNvbnN0YW50CisgICAgICAgIHJ1bGUgLyg/PCE9KVxzKlxbW1x3XGRcU10rXF0vLCBOYW1lOjpOYW1lc3BhY2UKKworICAgICAgICBydWxlIC9cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfTpcZHsyfTpcZHsyfVovLCBMaXRlcmFsOjpEYXRlCisKKyAgICAgICAgcnVsZSAvKFxkK1wuXGQqfFxkKlwuXGQrKShbZUVdWystXT9bMC05XSspP2o/LywgTnVtOjpGbG9hdAorICAgICAgICBydWxlIC9cZCtbZUVdWystXT9bMC05XStqPy8sIE51bTo6RmxvYXQKKyAgICAgICAgcnVsZSAvXC0/XGQrLywgTnVtOjpJbnRlZ2VyCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOmJhc2ljCisKKyAgICAgICAgcnVsZSAvKCN7aWRlbnRpZmllcn0pKFxzKikoPSkvIGRvCisgICAgICAgICAgZ3JvdXBzIE5hbWU6OlByb3BlcnR5LCBUZXh0LCBQdW5jdHVhdGlvbgorICAgICAgICAgIHB1c2ggOnZhbHVlCisgICAgICAgIGVuZAorCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnZhbHVlIGRvCisgICAgICAgIHJ1bGUgL1xuLywgVGV4dCwgOnBvcCEKKyAgICAgICAgbWl4aW4gOmNvbnRlbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y29udGVudCBkbworICAgICAgICBtaXhpbiA6YmFzaWMKKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOmRxCisgICAgICAgIG1peGluIDplc2Nfc3RyCisgICAgICAgIHJ1bGUgL1wsLywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvXFsvLCBQdW5jdHVhdGlvbiwgOmFycmF5CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmRxIGRvCisgICAgICAgIHJ1bGUgLyIvLCBTdHIsIDpwb3AhCisgICAgICAgIG1peGluIDplc2Nfc3RyCisgICAgICAgIHJ1bGUgL1teXFwiXSsvLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZXNjX3N0ciBkbworICAgICAgICBydWxlIC9cXFswdFx0blxuICJcXCByXS8sIFN0cjo6RXNjYXBlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmFycmF5IGRvCisgICAgICAgIG1peGluIDpjb250ZW50CisgICAgICAgIHJ1bGUgL1xdLywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3R1bGlwLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdHVsaXAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzZGQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3R1bGlwLnJiCkBAIC0wLDAgKzEsNzUgQEAKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgVHVsaXAgPCBSZWdleExleGVyCisgICAgICB0YWcgJ3R1bGlwJworICAgICAgYWxpYXNlcyAndGxwJworICAgICAgZmlsZW5hbWVzICcqLnRscCcKKyAgICAgIGRlc2MgJ1RoZSB0dWxpcCBwcm9ncmFtbWluZyBsYW5ndWFnZSBodHRwOi8vZ2l0aHViLmNvbS9qbmVlbi90dWxpcCcKKworICAgICAgaWQgPSAvXHdbXHctXSovCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICByZXR1cm4gMSBpZiB0ZXh0LnNoZWJhbmc/KCd0dWxpcCcpCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvXHMrLywgVGV4dAorICAgICAgICBydWxlIC8jLio/XG4vLCBDb21tZW50CisgICAgICAgIHJ1bGUgLyUje2lkfS8sIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgcnVsZSAvQCN7aWR9LywgS2V5d29yZAorICAgICAgICBydWxlIC9bLl1bLl0/I3tpZH0vLCBOYW1lOjpMYWJlbAorICAgICAgICBydWxlIC8tI3tpZH1bP10/LywgU3RyOjpTeW1ib2wKKyAgICAgICAgcnVsZSAvXGQrLywgTnVtCisgICAgICAgIHJ1bGUgJXIoLyN7aWR9PyksIE5hbWU6OkRlY29yYXRvcgorICAgICAgICBydWxlICVyKCgje2lkfS8pKCN7aWR9KSkgZG8KKyAgICAgICAgICBncm91cHMgTmFtZTo6TmFtZXNwYWNlLCBOYW1lOjpWYXJpYWJsZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC8iey8sIFN0ciwgOnN0cmluZ19pbnRlcnAKKyAgICAgICAgcnVsZSAvJz97LywgU3RyLCA6c3RyaW5nCisgICAgICAgIHJ1bGUgL1snIl1bXlxzKVxdXSsvLCBTdHIKKworICAgICAgICBydWxlIC9bJF0vLCBOYW1lOjpWYXJpYWJsZQorCisgICAgICAgIHJ1bGUgL1stKzo7fiEoKVxbXF09Pz58XyUsXS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL1suXVsuXVsuXS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgaWQsIE5hbWUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5nX2Jhc2UgZG8KKyAgICAgICAgcnVsZSAvey8gZG8KKyAgICAgICAgICB0b2tlbiBTdHI7IHB1c2gKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSAvfS8sIFN0ciwgOnBvcCEKKyAgICAgICAgcnVsZSAvWyRdLywgU3RyCisgICAgICAgIHJ1bGUgL1teJHt9XFxdKy8sIFN0cgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmcgZG8KKyAgICAgICAgbWl4aW4gOnN0cmluZ19iYXNlCisgICAgICAgIHJ1bGUgL1xcLywgU3RyCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmludGVycCBkbworICAgICAgICBydWxlKC9bKF0vKSB7IHRva2VuIFB1bmN0dWF0aW9uOyBwdXNoIH0KKyAgICAgICAgcnVsZSAvWyldLywgUHVuY3R1YXRpb24sIDpwb3AhCisgICAgICAgIG1peGluIDpyb290CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmludGVycF9yb290IGRvCisgICAgICAgIHJ1bGUgL1soXS8sIFN0cjo6SW50ZXJwb2wsIDppbnRlcnAKKyAgICAgICAgcnVsZSAvWyldLywgU3RyOjpJbnRlcnBvbCwgOnBvcCEKKyAgICAgICAgbWl4aW4gOnJvb3QKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6c3RyaW5nX2ludGVycCBkbworICAgICAgICBydWxlIC9cXC4vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9bJF1bKF0vLCBTdHI6OkludGVycG9sLCA6aW50ZXJwX3Jvb3QKKyAgICAgICAgcnVsZSAvWyRdI3tpZH0/LywgTmFtZTo6VmFyaWFibGUKKyAgICAgICAgbWl4aW4gOnN0cmluZ19iYXNlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdHdpZy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3R3aWcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjZjA2OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3R3aWcucmIKQEAgLTAsMCArMSwzNyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGxvYWRfbGV4ZXIgJ2ppbmphLnJiJworCisgICAgY2xhc3MgVHdpZyA8IEppbmphCisgICAgICB0aXRsZSAiVHdpZyIKKyAgICAgIGRlc2MgIlR3aWcgdGVtcGxhdGUgZW5naW5lICh0d2lnLnNlbnNpb2xhYnMub3JnKSIKKworICAgICAgdGFnICJ0d2lnIgorCisgICAgICBtaW1ldHlwZXMgJ2FwcGxpY2F0aW9uL3gtdHdpZycsICd0ZXh0L2h0bWwrdHdpZycKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQEBrZXl3b3JkcyB8fD0gJXcoYXMgZG8gZXh0ZW5kcyBmbHVzaCBmcm9tIGltcG9ydCBpbmNsdWRlIHVzZSBlbHNlIHN0YXJ0cworICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRzIHdpdGggd2l0aG91dCBhdXRvZXNjYXBlIGVuZGF1dG9lc2NhcGUgYmxvY2sgZW5kYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWQgZW5kZW1iZWQgZmlsdGVyIGVuZGZpbHRlciBmb3IgZW5kZm9yIGlmIGVuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvIGVuZG1hY3JvIHNhbmRib3ggZW5kc2FuZGJveCBzZXQgZW5kc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlbGVzcyBlbmRzcGFjZWxlc3MgdmVyYmF0aW0gZW5kdmVyYmF0aW0pCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudGVzdHMKKyAgICAgICAgQEB0ZXN0cyB8fD0gJXcoY29uc3RhbnQgZGVmaW5lZCBkaXZpc2libGVieSBlbXB0eSBldmVuIGl0ZXJhYmxlIG51bGwgb2RkCisgICAgICAgICAgICAgICAgICAgICAgIHNhbWVhcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5wc2V1ZG9fa2V5d29yZHMKKyAgICAgICAgQEBwc2V1ZG9fa2V5d29yZHMgfHw9ICV3KHRydWUgZmFsc2Ugbm9uZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi53b3JkX29wZXJhdG9ycworICAgICAgICBAQHdvcmRfb3BlcmF0b3JzIHx8PSAldyhiLWFuZCBiLW9yIGIteG9yIGlzIGluIGFuZCBvciBub3QpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3R5cGVzY3JpcHQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy90eXBlc2NyaXB0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTE1YzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy90eXBlc2NyaXB0LnJiCkBAIC0wLDAgKzEsNDYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBsb2FkX2xleGVyICdqYXZhc2NyaXB0LnJiJworCisgICAgY2xhc3MgVHlwZXNjcmlwdCA8IEphdmFzY3JpcHQKKyAgICAgIHRpdGxlICJUeXBlU2NyaXB0IgorICAgICAgZGVzYyAiVHlwZVNjcmlwdCwgYSBzdXBlcnNldCBvZiBKYXZhU2NyaXB0IgorCisgICAgICB0YWcgJ3R5cGVzY3JpcHQnCisgICAgICBhbGlhc2VzICd0cycKKyAgICAgIAorICAgICAgZmlsZW5hbWVzICcqLnRzJywgJyouZC50cycKKyAgICAgICAgICAgICAgICAKKyAgICAgIG1pbWV0eXBlcyAndGV4dC90eXBlc2NyaXB0JworCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAa2V5d29yZHMgfHw9IHN1cGVyICsgU2V0Lm5ldygldygKKyAgICAgICAgICBpbXBvcnQgZXhwb3J0IGZyb20gYXMgaXMKKyAgICAgICAgICBuYW1lc3BhY2UgbmV3IHN0YXRpYyBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMKKyAgICAgICAgICBzdXBlciBhc3luYyBhd2FpdCBleHRlbmRzIGltcGxlbWVudHMgcmVhZG9ubHkKKyAgICAgICAgKSkKKyAgICAgIGVuZAorICAgICAgCisgICAgICBkZWYgc2VsZi5kZWNsYXJhdGlvbnMKKyAgICAgICAgQGRlY2xhcmF0aW9ucyB8fD0gc3VwZXIgKyBTZXQubmV3KCV3KAorICAgICAgICAgIGNvbnN0IHR5cGUgY29uc3RydWN0b3IgYWJzdHJhY3QKKyAgICAgICAgKSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5yZXNlcnZlZAorICAgICAgICBAcmVzZXJ2ZWQgfHw9IHN1cGVyICsgU2V0Lm5ldygldygKKyAgICAgICAgICBzdHJpbmcgYW55IG51bWJlciBuYW1lc3BhY2UgbW9kdWxlCisgICAgICAgICAgZGVjbGFyZSBkZWZhdWx0IGludGVyZmFjZSAgICAgICAgIAorICAgICAgICApKQorICAgICAgZW5kCisgICAgICAKKyAgICAgIGRlZiBzZWxmLmJ1aWx0aW5zCisgICAgICAgIEBidWlsdGlucyB8fD0gc3VwZXIgKyAldygKKyAgICAgICAgICBQcm9taXNlIFNldCBNYXAgV2Vha1NldCBXZWFrTWFwIFN5bWJvbAorICAgICAgICApCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3ZiLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdmIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmM2Q1ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3ZiLnJiCkBAIC0wLDAgKzEsMTY0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgVmlzdWFsQmFzaWMgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiVmlzdWFsIEJhc2ljIgorICAgICAgZGVzYyAiVmlzdWFsIEJhc2ljIgorICAgICAgdGFnICd2YicKKyAgICAgIGFsaWFzZXMgJ3Zpc3VhbGJhc2ljJworICAgICAgZmlsZW5hbWVzICcqLnZicycsICcqLnZiJworICAgICAgbWltZXR5cGVzICd0ZXh0L3gtdmlzdWFsYmFzaWMnLCAnYXBwbGljYXRpb24veC12aXN1YWxiYXNpYycKKworICAgICAgZGVmIHNlbGYua2V5d29yZHMKKyAgICAgICAgQGtleXdvcmRzIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIEFkZEhhbmRsZXIgQWxpYXMgQnlSZWYgQnlWYWwgQ0Jvb2wgQ0J5dGUgQ0NoYXIgQ0RhdGUgQ0RibCBDRGVjCisgICAgICAgICAgQ0ludCBDTG5nIENPYmogQ1NCeXRlIENTaG9ydCBDU25nIENTdHIgQ1R5cGUgQ1VJbnQgQ1VMbmcgQ1VTaG9ydAorICAgICAgICAgIENhbGwgQ2FzZSBDYXRjaCBDbGFzcyBDb25zdCBDb250aW51ZSBEZWNsYXJlIERlZmF1bHQgRGVsZWdhdGUKKyAgICAgICAgICBEaW0gRGlyZWN0Q2FzdCBEbyBFYWNoIEVsc2UgRWxzZUlmIEVuZCBFbmRJZiBFbnVtIEVyYXNlIEVycm9yCisgICAgICAgICAgRXZlbnQgRXhpdCBGYWxzZSBGaW5hbGx5IEZvciBGcmllbmQgRnVuY3Rpb24gR2V0IEdsb2JhbCBHb1N1YgorICAgICAgICAgIEdvVG8gSGFuZGxlcyBJZiBJbXBsZW1lbnRzIEltcG9ydHMgSW5oZXJpdHMgSW50ZXJmYWNlIExldAorICAgICAgICAgIExpYiBMb29wIE1lIE1vZHVsZSBNdXN0SW5oZXJpdCBNdXN0T3ZlcnJpZGUgTXlCYXNlIE15Q2xhc3MKKyAgICAgICAgICBOYW1lc3BhY2UgTmFycm93aW5nIE5ldyBOZXh0IE5vdCBOb3RJbmhlcml0YWJsZSBOb3RPdmVycmlkYWJsZQorICAgICAgICAgIE5vdGhpbmcgT2YgT24gT3BlcmF0b3IgT3B0aW9uIE9wdGlvbmFsIE92ZXJsb2FkcyBPdmVycmlkYWJsZQorICAgICAgICAgIE92ZXJyaWRlcyBQYXJhbUFycmF5IFBhcnRpYWwgUHJpdmF0ZSBQcm9wZXJ0eSBQcm90ZWN0ZWQgUHVibGljCisgICAgICAgICAgUmFpc2VFdmVudCBSZURpbSBSZWFkT25seSBSZW1vdmVIYW5kbGVyIFJlc3VtZSBSZXR1cm4gU2VsZWN0IFNldAorICAgICAgICAgIFNoYWRvd3MgU2hhcmVkIFNpbmdsZSBTdGF0aWMgU3RlcCBTdG9wIFN0cnVjdHVyZSBTdWIgU3luY0xvY2sKKyAgICAgICAgICBUaGVuIFRocm93IFRvIFRydWUgVHJ5IFRyeUNhc3QgVXNpbmcgV2VuZCBXaGVuIFdoaWxlIFdpZGVuaW5nCisgICAgICAgICAgV2l0aCBXaXRoRXZlbnRzIFdyaXRlT25seQorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYua2V5d29yZHNfdHlwZQorICAgICAgICBAa2V5d29yZHNfdHlwZSB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBCb29sZWFuIEJ5dGUgQ2hhciBEYXRlIERlY2ltYWwgRG91YmxlIEludGVnZXIgTG9uZyBPYmplY3QKKyAgICAgICAgICBTQnl0ZSBTaG9ydCBTaW5nbGUgU3RyaW5nIFZhcmlhbnQgVUludGVnZXIgVUxvbmcgVVNob3J0CisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5vcGVyYXRvcl93b3JkcworICAgICAgICBAb3BlcmF0b3Jfd29yZHMgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgQWRkcmVzc09mIEFuZCBBbmRBbHNvIEFzIEdldFR5cGUgSW4gSXMgSXNOb3QgTGlrZSBNb2QgT3IgT3JFbHNlCisgICAgICAgICAgVHlwZU9mIFhvcgorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuYnVpbHRpbnMKKyAgICAgICAgQGJ1aWx0aW5zIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIENvbnNvbGUgQ29uc29sZUNvbG9yCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBpZCA9IC9bYS16X11cdyovaQorICAgICAgdXBwZXJfaWQgPSAvW0EtWl1cdyovCisKKyAgICAgIHN0YXRlIDp3aGl0ZXNwYWNlIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvXG4vLCBUZXh0LCA6Ym9sCisgICAgICAgIHJ1bGUgL3JlbVxiLio/JC9pLCBDb21tZW50OjpTaW5nbGUKKyAgICAgICAgcnVsZSAlciglXHsuKj8lXH0pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICAgIHJ1bGUgLycuKiQvLCBDb21tZW50OjpTaW5nbGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Ym9sIGRvCisgICAgICAgIHJ1bGUgL1xzKy8sIFRleHQKKyAgICAgICAgcnVsZSAvPC4qPz4vLCBOYW1lOjpBdHRyaWJ1dGUKKyAgICAgICAgcnVsZSgvLykgeyA6cG9wISB9CisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAlcigKKyAgICAgICAgICAgIFsjXUlmXGIgLio/IFxiVGhlbgorICAgICAgICAgIHwgWyNdRWxzZUlmXGIgLio/IFxiVGhlbgorICAgICAgICAgIHwgWyNdRW5kIFxzKyBJZgorICAgICAgICAgIHwgWyNdQ29uc3QKKyAgICAgICAgICB8IFsjXUV4dGVybmFsU291cmNlIC4qPyBcbgorICAgICAgICAgIHwgWyNdRW5kIFxzKyBFeHRlcm5hbFNvdXJjZQorICAgICAgICAgIHwgWyNdUmVnaW9uIC4qPyBcbgorICAgICAgICAgIHwgWyNdRW5kIFxzKyBSZWdpb24KKyAgICAgICAgICB8IFsjXUV4dGVybmFsQ2hlY2tzdW0KKyAgICAgICAgKXgsIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgcnVsZSAvWy5dLywgUHVuY3R1YXRpb24sIDpkb3R0ZWQKKyAgICAgICAgcnVsZSAvWygpe30hIyw6XS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL09wdGlvblxzKyhTdHJpY3R8RXhwbGljaXR8Q29tcGFyZSlccysoT258T2ZmfEJpbmFyeXxUZXh0KS8sCisgICAgICAgICAgS2V5d29yZDo6RGVjbGFyYXRpb24KKyAgICAgICAgcnVsZSAvRW5kXGIvLCBLZXl3b3JkLCA6ZW5kCisgICAgICAgIHJ1bGUgLyhEaW18Q29uc3QpXGIvLCBLZXl3b3JkLCA6ZGltCisgICAgICAgIHJ1bGUgLyhGdW5jdGlvbnxTdWJ8UHJvcGVydHkpXGIvLCBLZXl3b3JkLCA6ZnVuY25hbWUKKyAgICAgICAgcnVsZSAvKENsYXNzfFN0cnVjdHVyZXxFbnVtKVxiLywgS2V5d29yZCwgOmNsYXNzbmFtZQorICAgICAgICBydWxlIC8oTW9kdWxlfE5hbWVzcGFjZXxJbXBvcnRzKVxiLywgS2V5d29yZCwgOm5hbWVzcGFjZQorCisgICAgICAgIHJ1bGUgdXBwZXJfaWQgZG8gfG18CisgICAgICAgICAgbWF0Y2ggPSBtWzBdCisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyBtYXRjaAorICAgICAgICAgICAgdG9rZW4gS2V5d29yZAorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3Mua2V5d29yZHNfdHlwZS5pbmNsdWRlPyBtYXRjaAorICAgICAgICAgICAgdG9rZW4gS2V5d29yZDo6VHlwZQorICAgICAgICAgIGVsc2lmIHNlbGYuY2xhc3Mub3BlcmF0b3Jfd29yZHMuaW5jbHVkZT8gbWF0Y2gKKyAgICAgICAgICAgIHRva2VuIE9wZXJhdG9yOjpXb3JkCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5idWlsdGlucy5pbmNsdWRlPyBtYXRjaAorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIE5hbWUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZSgKKyAgICAgICAgICAlcigmPXxbKl09fC89fFxcPXxcXj18XCs9fC09fDw8PXw+Pj18PDx8Pj58Oj18PD18Pj18PD58Wy0mKi9cXF4rPTw+Ll0pLAorICAgICAgICAgIE9wZXJhdG9yCisgICAgICAgICkKKworICAgICAgICBydWxlIC8iLywgU3RyLCA6c3RyaW5nCisgICAgICAgIHJ1bGUgLyN7aWR9WyUmQCEjXCRdPy8sIE5hbWUKKyAgICAgICAgcnVsZSAvIy4qPyMvLCBMaXRlcmFsOjpEYXRlCisKKyAgICAgICAgcnVsZSAvKFxkK1wuXGQqfFxkKlwuXGQrKShmWystXT9cZCspPy9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL1xkKyhbU0lMREZSXXxVU3xVSXxVTCk/LywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgLyZIWzAtOWEtZl0rKFtTSUxERlJdfFVTfFVJfFVMKT8vLCBOdW06OkludGVnZXIKKyAgICAgICAgcnVsZSAvJk9bMC03XSsoW1NJTERGUl18VVN8VUl8VUwpPy8sIE51bTo6SW50ZWdlcgorCisgICAgICAgIHJ1bGUgL19cbi8sIEtleXdvcmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZG90dGVkIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgaWQsIE5hbWUsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0cmluZyBkbworICAgICAgICBydWxlIC8iIi8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgLyJDPy8sIFN0ciwgOnBvcCEKKyAgICAgICAgcnVsZSAvW14iXSsvLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZGltIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OlZhcmlhYmxlLCA6cG9wIQorICAgICAgICBydWxlKC8vKSB7IHBvcCEgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmdW5jbmFtZSBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgICBydWxlIGlkLCBOYW1lOjpGdW5jdGlvbiwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Y2xhc3NuYW1lIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgaWQsIE5hbWU6OkNsYXNzLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpuYW1lc3BhY2UgZG8KKyAgICAgICAgbWl4aW4gOndoaXRlc3BhY2UKKyAgICAgICAgcnVsZSAvI3tpZH0oWy5dI3tpZH0pKi8sIE5hbWU6Ok5hbWVzcGFjZSwgOnBvcCEKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZW5kIGRvCisgICAgICAgIG1peGluIDp3aGl0ZXNwYWNlCisgICAgICAgIHJ1bGUgLyhGdW5jdGlvbnxTdWJ8UHJvcGVydHl8Q2xhc3N8U3RydWN0dXJlfEVudW18TW9kdWxlfE5hbWVzcGFjZSlcYi8sCisgICAgICAgICAgS2V5d29yZCwgOnBvcCEKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdmVyaWxvZy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Zlcmlsb2cucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1NmYwMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3Zlcmlsb2cucmIKQEAgLTAsMCArMSwxNjQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBWZXJpbG9nIDwgUmVnZXhMZXhlcgorICAgICAgdGl0bGUgIlZlcmlsb2cgYW5kIFN5c3RlbSBWZXJpbG9nIgorICAgICAgZGVzYyAiVGhlIFN5c3RlbSBWZXJpbG9nIGhhcmR3YXJlIGRlc2NyaXB0aW9uIGxhbmd1YWdlIgorICAgICAgdGFnICd2ZXJpbG9nJworICAgICAgZmlsZW5hbWVzICcqLnYnLCAnKi5zdicsICcqLnN2aCcKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LXZlcmlsb2cnLCAndGV4dC94LXN5c3RlbXZlcmlsb2cnCisKKyAgICAgICMgb3B0aW9uYWwgY29tbWVudCBvciB3aGl0ZXNwYWNlCisgICAgICB3cyA9ICVyKCg/OlxzfC8vLio/XG58L1sqXS4qP1sqXS8pKykKKyAgICAgIGlkID0gL1thLXpBLVpfXVthLXpBLVowLTlfXSovCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIEBrZXl3b3JkcyB8fD0gU2V0Lm5ldyAldygKKyAgICAgICAgICBhbGlhcyBhbHdheXMgYWx3YXlzX2NvbWIgYWx3YXlzX2ZmIGFsd2F5c19sYXRjaCBhc3NlcnQgYXNzZXJ0X3N0cm9iZQorICAgICAgICAgIGFzc2lnbiBhc3N1bWUgYXV0b21hdGljIGF0dHJpYnV0ZSBiZWZvcmUgYmVnaW4gYmluZCBiaW5zIGJpbnNvZiBicmVhaworICAgICAgICAgIGNhc2UgY2FzZXggY2FzZXogY2xvY2tpbmcgY29uZmlnIGNvbnN0cmFpbnQgY29udGV4dCBjb250aW51ZSBjb3ZlcgorICAgICAgICAgIGNvdmVyZ3JvdXAgY292ZXJwb2ludCBjcm9zcyBkZWFzc2lnbiBkZWZwYXJhbSBkZWZhdWx0IGRlc2lnbiBkaXN0IGRvCisgICAgICAgICAgZWxzZSBlbmQgZW5kYXR0cmlidXRlIGVuZGNhc2UgZW5kY2xhc3MgZW5kY2xvY2tpbmcgZW5kY29uZmlnCisgICAgICAgICAgZW5kZnVuY3Rpb24gZW5kZ2VuZXJhdGUgZW5kZ3JvdXAgZW5kaW50ZXJmYWNlIGVuZG1vZHVsZSBlbmRwYWNrYWdlCisgICAgICAgICAgZW5kcHJpbWl0aXZlIGVuZHByb2dyYW0gZW5kcHJvcGVydHkgZW5kc3BlY2lmeSBlbmRzZXF1ZW5jZSBlbmR0YWJsZQorICAgICAgICAgIGVuZHRhc2sgZXhwZWN0IGV4cG9ydCBleHRlbmRzIGV4dGVybiBmaW5hbCBmaXJzdF9tYXRjaCBmb3IgZm9yY2UKKyAgICAgICAgICBmb3JlYWNoIGZvcmsgZm9ya2pvaW4gZm9yZXZlciBmdW5jdGlvbiBnZW5lcmF0ZSBnZW52YXIgaWYgaWZmIGlmbm9uZQorICAgICAgICAgIGlnbm9yZV9iaW5zIGlsbGVnYWxfYmlucyBpbXBvcnQgaW5jZGlyIGluY2x1ZGUgaW5pdGlhbCBpbnNpZGUgaW5zdGFuY2UKKyAgICAgICAgICBpbnRlcmZhY2UgaW50ZXJzZWN0IGpvaW4gam9pbl9hbnkgam9pbl9ub25lIGxpYmxpc3QgbGlicmFyeSBsb2NhbAorICAgICAgICAgIGxvY2FscGFyYW0gIG1hdGNoZXMgbW9kdWxlIG1vZHBvcnQgbmV3IG5vc2hvd2NhbmNlbGxlZCBudWxsIHBhY2thZ2UKKyAgICAgICAgICBwYXJhbWV0ZXIgcHJpbWl0aXZlIHByaW9yaXR5IHByb2dyYW0gcHJvcGVydHkgcHJvdGVjdGVkCisgICAgICAgICAgcHVsc2VzdHlsZV9vbmV2ZW50ICBwdWxzZXN0eWxlX29uZGV0ZWN0IHB1cmUgcmFuZCByYW5kYyByYW5kY2FzZQorICAgICAgICAgIHJhbmRzZXF1ZW5jZSByZWxlYXNlIHJldHVybiBzZXF1ZW5jZSBzaG93Y2FuY2VsbGVkIHNvbHZlIHNwZWNpZnkgc3VwZXIKKyAgICAgICAgICB0YWJsZSB0YXNrIHRoaXMgdGhyb3VnaG91dCB0aW1lcHJlY2lzaW9uIHRpbWV1bml0IHR5cGUgdHlwZWRlZiB1bmlxdWUKKyAgICAgICAgICB1c2Ugd2FpdCB3YWl0X29yZGVyIHdoaWxlIHdpbGRjYXJkIHdpdGggd2l0aGluCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5rZXl3b3Jkc190eXBlCisgICAgICAgIEBrZXl3b3Jkc190eXBlIHx8PSBTZXQubmV3ICV3KAorICAgICAgICAgIGFuZCBiaXQgYnVmIGJ1ZmlmMCBidWZpZjEgYnl0ZSBjZWxsIGNoYW5kbGUgY2xhc3MgY21vcyBjb25zdCBkaXNhYmxlCisgICAgICAgICAgZWRnZSBlbnVtIGV2ZW50IGhpZ2h6MCBoaWdoejEgaW5pdGlhbCBpbm91dCBpbnB1dCBpbnQgaW50ZWdlciBqb2luCisgICAgICAgICAgbG9naWMgbG9uZ2ludCBtYWNyb21vZHVsZSBtZWRpdW0gbmFuZCBuZWdlZGdlIG5tb3Mgbm9yIG5vdAorICAgICAgICAgIG5vdGlmMCBub3RpZjEgb3Igb3V0cHV0IHBhY2tlZCBwYXJhbWV0ZXIgcG1vcyBwb3NlZGdlIHB1bGwwIHB1bGwxCisgICAgICAgICAgcHVsbGRvd24gcHVsbHVwIHJjbW9zIHJlYWwgcmVhbHRpbWUgcmVmIHJlZyByZXBlYXQgcm5tb3MgcnBtb3MgcnRyYW4KKyAgICAgICAgICBydHJhbmlmMCBydHJhbmlmMSBzY2FsYXJlZCBzaG9ydGludCBzaG9ydHJlYWwgc2lnbmVkICBzcGVjcGFyYW0KKyAgICAgICAgICBzdGF0aWMgc3RyaW5nIHN0cmVuZ3RoIHN0cm9uZzAgc3Ryb25nMSBzdHJ1Y3Qgc3VwcGx5MCBzdXBwbHkxIHRhZ2dlZAorICAgICAgICAgIHRpbWUgdHJhbiB0cmFuaWYwIHRyYW5pZjEgdHJpIHRyaTAgdHJpMSB0cmlhbmQgdHJpb3IgdHJpcmVnIHVuaW9uCisgICAgICAgICAgdW5zaWduZWQgdXdpcmUgdmFyIHZlY3RvcmVkIHZpcnR1YWwgdm9pZCB3YWl0IHdhbmQgd2Vha1swMV0gd2lyZSB3b3IKKyAgICAgICAgICB4bm9yIHhvcgorICAgICAgICApCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYua2V5d29yZHNfc3lzdGVtX3Rhc2sKKyAgICAgICAgQGtleXdvcmRfc3lzdGVtX3Rhc2sgfHw9IFNldC5uZXcgJXcoCisgICAgICAgICAgYWNvcyBhY29zaCBhc2luIGFzaW5oIGFzc2VydGZhaWxvZmYgYXNzZXJ0ZmFpbG9uICBhc3NlcnRraWxsCisgICAgICAgICAgYXNzZXJ0bm9udmFjdW91c29uIGFzc2VydG9mZiBhc3NlcnRvbiBhc3NlcnRwYXNzb2ZmIGFzc2VydHBhc3NvbgorICAgICAgICAgIGFzc2VydHZhY3VvdXNvZmYgYXRhbiBhdGFuMiBhdGFuaCBiaXRzIGJpdHN0b3JlYWwgIGJpdHN0b3Nob3J0cmVhbAorICAgICAgICAgIGNhc3QgY2VpbCBjaGFuZ2VkIGNoYW5nZWRfZ2NsayBjaGFuZ2luZ19nY2xrIGNsb2cyIGNvcyBjb3NoIGNvdW50b25lcworICAgICAgICAgIGNvdmVyYWdlX2NvbnRyb2wgY292ZXJhZ2VfZ2V0IGNvdmVyYWdlX2dldF9tYXggY292ZXJhZ2VfbWVyZ2UKKyAgICAgICAgICBjb3ZlcmFnZV9zYXZlIGRpbWVuc2lvbnMgZGlzcGxheSBkaXNwbGF5YiBkaXNwbGF5aCBkaXNwbGF5bworICAgICAgICAgIGRpc3RfY2hpX3NxdWFyZSBkaXN0X2VybGFuZyBkaXN0X2V4cG9uZW50aWFsIGRpc3Rfbm9ybWFsIGRpc3RfcG9pc3NvbgorICAgICAgICAgIGRpc3RfdCBkaXN0X3VuaWZvcm0gZHVtcGFsbCBkdW1wZmlsZSBkdW1wZmx1c2ggZHVtcGxpbWl0IGR1bXBvZmYKKyAgICAgICAgICBkdW1wb24gZHVtcHBvcnRzIGR1bXBwb3J0c2FsbCBkdW1wcG9ydHNmbHVzaCBkdW1wcG9ydHNsaW1pdAorICAgICAgICAgIGR1bXBwb3J0c29mZiBkdW1wcG9ydHNvbiBkdW1wdmFycyBlcnJvciBleGl0IGV4cCBmYWxsaW5nX2djbGsgZmNsb3NlCisgICAgICAgICAgZmRpc3BsYXkgZmRpc3BsYXliIGZkaXNwbGF5aCBmZGlzcGxheW8gZmVsbCBmZWxsX2djbGsgZmVvZiBmZXJyb3IKKyAgICAgICAgICBmZmx1c2ggZmdldGMgZmdldHMgZmluaXNoIGZsb29yIGZtb25pdG9yIGZtb25pdG9yYiBmbW9uaXRvcmggZm1vbml0b3JvCisgICAgICAgICAgZm9wZW4gZnJlYWQgZnNjYW5mIGZzZWVrIGZzdHJvYmUgZnN0cm9iZWIgZnN0cm9iZWggZnN0cm9iZW8gZnRlbGwKKyAgICAgICAgICBmdXR1cmVfZ2NsayBmd3JpdGUgZndyaXRlYiBmd3JpdGVoIGZ3cml0ZW8gZ2V0X2NvdmVyYWdlIGhpZ2ggaHlwb3QKKyAgICAgICAgICBpbmNyZW1lbnQgaW5mbyBpc3VuYm91bmRlZCBpc3Vua25vd24gaXRvciBsZWZ0IGxuIGxvYWRfY292ZXJhZ2VfZGIKKyAgICAgICAgICBsb2cxMCBsb3cgbW9uaXRvciBtb25pdG9yYiBtb25pdG9yaCBtb25pdG9ybyBtb25pdG9yb2ZmIG1vbml0b3JvbgorICAgICAgICAgIG9uZWhvdCBvbmVob3QwIHBhc3QgcGFzdF9nY2xrIHBvdyBwcmludHRpbWVzY2FsZSBxX2FkZCBxX2V4YW0gcV9mdWxsCisgICAgICAgICAgcV9pbml0aWFsaXplIHFfcmVtb3ZlIHJhbmRvbSByZWFkbWVtYiByZWFkbWVtaCByZWFsdGltZSByZWFsdG9iaXRzCisgICAgICAgICAgcmV3aW5kIHJpZ2h0IHJpc2luZ19nY2xrIHJvc2Ugcm9zZV9nY2xrIHJ0b2kgc2FtcGxlZAorICAgICAgICAgIHNldF9jb3ZlcmFnZV9kYl9uYW1lIHNmb3JtYXQgc2Zvcm1hdGYgc2hvcnRyZWFsdG9iaXRzIHNpZ25lZCBzaW4gc2luaAorICAgICAgICAgIHNpemUgc3FydCBzc2NhbmYgc3RhYmxlIHN0YWJsZV9nY2xrIHN0ZWFkeV9nY2xrIHN0aW1lIHN0b3Agc3Ryb2JlCisgICAgICAgICAgc3Ryb2JlYiBzdHJvYmVoIHN0cm9iZW8gc3dyaXRlIHN3cml0ZWIgc3dyaXRlaCBzd3JpdGVvIHN5c3RlbSB0YW4gdGFuaAorICAgICAgICAgIHRpbWUgdGltZWZvcm1hdCB0eXBlbmFtZSB1bmdldGMgdW5wYWNrZWRfZGltZW5zaW9ucyB1bnNpZ25lZCB3YXJuaW5nCisgICAgICAgICAgd3JpdGUgd3JpdGViIHdyaXRlaCB3cml0ZW1lbWIgd3JpdGVtZW1oIHdyaXRlbworICAgICAgICApCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmV4cHJfYm9sIGRvCisgICAgICAgIG1peGluIDppbmxpbmVfd2hpdGVzcGFjZQorICAgICAgICBydWxlIC9gZGVmaW5lLywgQ29tbWVudDo6UHJlcHJvYywgOm1hY3JvCisKKyAgICAgICAgcnVsZSgvLykgeyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICAjIDpleHByX2JvbCBpcyB0aGUgc2FtZSBhcyA6Ym9sIGJ1dCB3aXRob3V0IGxhYmVscywgc2luY2UKKyAgICAgICMgbGFiZWxzIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc3RhdGVtZW50LgorICAgICAgc3RhdGUgOmJvbCBkbworICAgICAgICBydWxlIC8je2lkfTooPyE6KS8sIE5hbWU6OkxhYmVsCisgICAgICAgIG1peGluIDpleHByX2JvbAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDppbmxpbmVfd2hpdGVzcGFjZSBkbworICAgICAgICBydWxlIC9bIFx0XHJdKy8sIFRleHQKKyAgICAgICAgcnVsZSAvXFxcbi8sIFRleHQgIyBsaW5lIGNvbnRpbnVhdGlvbgorICAgICAgICBydWxlICVyKC8oXFxcbik/WypdLio/WypdKFxcXG4pPy8pbSwgQ29tbWVudDo6TXVsdGlsaW5lCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOndoaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXG4rL20sIFRleHQsIDpib2wKKyAgICAgICAgcnVsZSAlcigvLyhcXC58LikqP1xuKSwgQ29tbWVudDo6U2luZ2xlLCA6Ym9sCisgICAgICAgIG1peGluIDppbmxpbmVfd2hpdGVzcGFjZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpleHByX3doaXRlc3BhY2UgZG8KKyAgICAgICAgcnVsZSAvXG4rL20sIFRleHQsIDpleHByX2JvbAorICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpzdHJpbmcgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOnBvcCEKKyAgICAgICAgcnVsZSAvXFwoW1xcYWJmbnJ0diInXXx4W2EtZkEtRjAtOV17Miw0fXxbMC03XXsxLDN9KS8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgL1teXFwiXG5dKy8sIFN0cgorICAgICAgICBydWxlIC9cXFxuLywgU3RyCisgICAgICAgIHJ1bGUgL1xcLywgU3RyICMgc3RyYXkgYmFja3NsYXNoCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnN0YXRlbWVudCBkbworICAgICAgICBtaXhpbiA6d2hpdGVzcGFjZQorICAgICAgICBydWxlIC9MPyIvLCBTdHIsIDpzdHJpbmcKKyAgICAgICAgcnVsZSAvKFxkK1wuXGQqfFxkKlwuXGQrKShlWystXT9bMC05XSspPy9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL1xkK2VbKy1dP1swLTldKy9pLCBOdW06OkZsb2F0CisgICAgICAgIHJ1bGUgL1swLTldKidoWzAtOWEtZkEtRl0rLywgTnVtOjpIZXgKKyAgICAgICAgcnVsZSAvWzAtOV0qJ2I/WzAxeHpdKy8sIE51bTo6QmluCisgICAgICAgIHJ1bGUgL1swLTldKidkWzAtOV0rLywgTnVtOjpJbnRlZ2VyCisgICAgICAgIHJ1bGUgL1xkK1tsdV0qL2ksIE51bTo6SW50ZWdlcgorICAgICAgICBydWxlICVyKFt+ISVeJiorLT1cfD86PD4vQHt9XSksIE9wZXJhdG9yCisgICAgICAgIHJ1bGUgL1soKVxbXF0sLiRcI10vLCBQdW5jdHVhdGlvbgorICAgICAgICBydWxlIC9gKFx3KykvLCBDb21tZW50OjpQcmVwcm9jCisKKyAgICAgICAgcnVsZSBpZCBkbyB8bXwKKyAgICAgICAgICBuYW1lID0gbVswXQorCisgICAgICAgICAgaWYgc2VsZi5jbGFzcy5rZXl3b3Jkcy5pbmNsdWRlPyBuYW1lCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgc2VsZi5jbGFzcy5rZXl3b3Jkc190eXBlLmluY2x1ZGU/IG5hbWUKKyAgICAgICAgICAgIHRva2VuIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgICBlbHNpZiBzZWxmLmNsYXNzLmtleXdvcmRzX3N5c3RlbV90YXNrLmluY2x1ZGU/IG5hbWUKKyAgICAgICAgICAgIHRva2VuIE5hbWU6OkJ1aWx0aW4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b2tlbiBOYW1lCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpyb290IGRvCisgICAgICAgIG1peGluIDpleHByX3doaXRlc3BhY2UKKyAgICAgICAgcnVsZSgvLykgeyBwdXNoIDpzdGF0ZW1lbnQgfQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDptYWNybyBkbworICAgICAgICBydWxlIC9cbi8sIENvbW1lbnQ6OlByZXByb2MsIDpwb3AhCisgICAgICAgIG1peGluIDppbmxpbmVfd2hpdGVzcGFjZQorICAgICAgICBydWxlIC87LywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvXD0vLCBPcGVyYXRvcgorICAgICAgICBydWxlIC8oXHcrKS8sIFRleHQKKyAgICAgIGVuZAorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy92aW1sLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdmltbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDllMmNmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdmltbC5yYgpAQCAtMCwwICsxLDEwMSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFZpbUwgPCBSZWdleExleGVyCisgICAgICB0aXRsZSAiVmltTCIKKyAgICAgIGRlc2MgIlZpbUwsIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZm9yIHRoZSBWaW0gZWRpdG9yICh2aW0ub3JnKSIKKyAgICAgIHRhZyAndmltbCcKKyAgICAgIGFsaWFzZXMgJ3ZpbScsICd2aW1zY3JpcHQnLCAnZXgnCisgICAgICBmaWxlbmFtZXMgJyoudmltJywgJyoudmJhJywgJy52aW1yYycsICcuZXhyYycsICcuZ3ZpbXJjJywKKyAgICAgICAgICAgICAgICAnX3ZpbXJjJywgJ19leHJjJywgJ19ndmltcmMnICMgXyBuYW1lcyBmb3Igd2luZG93cworCisgICAgICBtaW1ldHlwZXMgJ3RleHQveC12aW0nCisKKyAgICAgIGRlZiBzZWxmLmtleXdvcmRzCisgICAgICAgIGxvYWQgUGF0aG5hbWUubmV3KF9fRklMRV9fKS5kaXJuYW1lLmpvaW4oJ3ZpbWwva2V5d29yZHMucmInKQorICAgICAgICBzZWxmLmtleXdvcmRzCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgcnVsZSAvXihccyopKCIuKj8pJC8gZG8KKyAgICAgICAgICBncm91cHMgVGV4dCwgQ29tbWVudAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9eXHMqXFwvLCBTdHI6OkVzY2FwZQorCisgICAgICAgIHJ1bGUgL1sgXHRdKy8sIFRleHQKKworICAgICAgICAjIFRPRE86IHJlZ2V4ZXMgY2FuIGhhdmUgb3RoZXIgZGVsaW1pdGVycworICAgICAgICBydWxlICVyKC8oXFxcXHxcXC98W15cbi9dKSovKSwgU3RyOjpSZWdleAorICAgICAgICBydWxlICVyKCIoXFxcXHxcXCJ8W15cbiJdKSoiKSwgU3RyOjpEb3VibGUKKyAgICAgICAgcnVsZSAlcignKFxcXFx8XFwnfFteXG4nXSkqJyksIFN0cjo6U2luZ2xlCisKKyAgICAgICAgIyBpZiBpdCdzIG5vdCBhIHN0cmluZywgaXQncyBhIGNvbW1lbnQuCisgICAgICAgIHJ1bGUgLyg/PD1ccykiW14tOi4lIz0qXS4qPyQvLCBDb21tZW50CisKKyAgICAgICAgcnVsZSAvLT9cZCsvLCBOdW0KKyAgICAgICAgcnVsZSAvI1swLTlhLWZdezZ9L2ksIE51bTo6SGV4CisgICAgICAgIHJ1bGUgL146LywgUHVuY3R1YXRpb24KKyAgICAgICAgcnVsZSAvWygpOjw+Kz0hXFtcXXt9XHwsfi4tXS8sIFB1bmN0dWF0aW9uCisgICAgICAgIHJ1bGUgL1xiKGxldHxpZnxlbHNlfGVuZGlmfGVsc2VpZnxmdW58ZnVuY3Rpb258ZW5kZnVuY3Rpb24pXGIvLAorICAgICAgICAgIEtleXdvcmQKKworICAgICAgICBydWxlIC9cYihOT05FfGJvbGR8aXRhbGljfHVuZGVybGluZXxkYXJrfGxpZ2h0KVxiLywgTmFtZTo6QnVpbHRpbgorCisgICAgICAgIHJ1bGUgL1thYnNnXTpcdytcYi8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgL1xiXHcrXGIvIGRvIHxtfAorICAgICAgICAgIG5hbWUgPSBtWzBdCisgICAgICAgICAga2V5d29yZHMgPSBzZWxmLmNsYXNzLmtleXdvcmRzCisKKyAgICAgICAgICBpZiBtYXBwaW5nX2NvbnRhaW5zPyhrZXl3b3Jkc1s6Y29tbWFuZF0sIG5hbWUpCisgICAgICAgICAgICB0b2tlbiBLZXl3b3JkCisgICAgICAgICAgZWxzaWYgbWFwcGluZ19jb250YWlucz8oa2V5d29yZHNbOm9wdGlvbl0sIG5hbWUpCisgICAgICAgICAgICB0b2tlbiBOYW1lOjpCdWlsdGluCisgICAgICAgICAgZWxzaWYgbWFwcGluZ19jb250YWlucz8oa2V5d29yZHNbOmF1dG9dLCBuYW1lKQorICAgICAgICAgICAgdG9rZW4gTmFtZTo6QnVpbHRpbgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRva2VuIFRleHQKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBubyBlcnJvcnMgaW4gVmltTCEKKyAgICAgICAgcnVsZSAvLi9tLCBUZXh0CisgICAgICBlbmQKKworICAgICAgZGVmIG1hcHBpbmdfY29udGFpbnM/KG1hcHBpbmcsIHdvcmQpCisgICAgICAgIHNob3J0ZXN0LCBsb25nZXN0ID0gZmluZF9saWtlbHlfbWFwcGluZyhtYXBwaW5nLCB3b3JkKQorCisgICAgICAgIHNob3J0ZXN0IGFuZCB3b3JkLnN0YXJ0X3dpdGg/KHNob3J0ZXN0KSBhbmQKKyAgICAgICAgbG9uZ2VzdCBhbmQgbG9uZ2VzdC5zdGFydF93aXRoPyh3b3JkKQorICAgICAgZW5kCisKKyAgICAgICMgYmluYXJ5IHNlYXJjaCB0aHJvdWdoIHRoZSBtYXBwaW5ncyB0byBmaW5kIHRoZSBvbmUgdGhhdCdzIGxpa2VseQorICAgICAgIyB0byBhY3R1YWxseSB3b3JrLgorICAgICAgZGVmIGZpbmRfbGlrZWx5X21hcHBpbmcobWFwcGluZywgd29yZCkKKyAgICAgICAgbWluID0gMAorICAgICAgICBtYXggPSBtYXBwaW5nLnNpemUKKworICAgICAgICB1bnRpbCBtYXggPT0gbWluCisgICAgICAgICAgbWlkID0gKG1heCArIG1pbikgLyAyCisKKyAgICAgICAgICBjbXAsIF8gPSBtYXBwaW5nW21pZF0KKworICAgICAgICAgIGNhc2Ugd29yZCA8PT4gY21wCisgICAgICAgICAgd2hlbiAxCisgICAgICAgICAgICAjIHRvbyBsb3cKKyAgICAgICAgICAgIG1pbiA9IG1pZCArIDEKKyAgICAgICAgICB3aGVuIC0xCisgICAgICAgICAgICAjIHRvbyBoaWdoCisgICAgICAgICAgICBtYXggPSBtaWQKKyAgICAgICAgICB3aGVuIDAKKyAgICAgICAgICAgICMganVzdCByaWdodCwgYWJvcnQhCisgICAgICAgICAgICByZXR1cm4gbWFwcGluZ1ttaWRdCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIG1hcHBpbmdbbWF4IC0gMV0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMvdmltbC9rZXl3b3Jkcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3ZpbWwva2V5d29yZHMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiYmEwZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3ZpbWwva2V5d29yZHMucmIKQEAgLTAsMCArMSwxMiBAQAorIyBlbmNvZGluZzogdXRmLTgKKyMgRE8gTk9UIEVESVQ6IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGByYWtlIGJ1aWx0aW5zOnZpbWAuCisjIHNlZSB0YXNrcy92aW0ucmFrZSBmb3IgbW9yZSBpbmZvLgorbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBMZXhlcnMKKyAgICBjbGFzcyBWaW1MCisgICAgICBkZWYgc2VsZi5rZXl3b3JkcworICAgICAgICBAa2V5d29yZHMgfHw9IHs6Y29tbWFuZD0+W1siYSIsICJhIl0sIFsiYWIiLCAiYWIiXSwgWyJhYmMiLCAiYWJjbGVhciJdLCBbImFibyIsICJhYm92ZWxlZnQiXSwgWyJhbCIsICJhbGwiXSwgWyJhciIsICJhciJdLCBbImFyIiwgImFyZ3MiXSwgWyJhcmdhIiwgImFyZ2FkZCJdLCBbImFyZ2QiLCAiYXJnZGVsZXRlIl0sIFsiYXJnZG8iLCAiYXJnZG8iXSwgWyJhcmdlIiwgImFyZ2VkaXQiXSwgWyJhcmdnIiwgImFyZ2dsb2JhbCJdLCBbImFyZ2wiLCAiYXJnbG9jYWwiXSwgWyJhcmd1IiwgImFyZ3VtZW50Il0sIFsiYXMiLCAiYXNjaWkiXSwgWyJhdSIsICJhdSJdLCBbImIiLCAiYnVmZmVyIl0sIFsiYk4iLCAiYk5leHQiXSwgWyJiYSIsICJiYWxsIl0sIFsiYmFkIiwgImJhZGQiXSwgWyJiZCIsICJiZGVsZXRlIl0sIFsiYmVsIiwgImJlbG93cmlnaHQiXSwgWyJiZiIsICJiZmlyc3QiXSwgWyJibCIsICJibGFzdCJdLCBbImJtIiwgImJtb2RpZmllZCJdLCBbImJuIiwgImJuZXh0Il0sIFsiYm8iLCAiYm90cmlnaHQiXSwgWyJicCIsICJicHJldmlvdXMiXSwgWyJiciIsICJiciJdLCBbImJyIiwgImJyZXdpbmQiXSwgWyJicmVhIiwgImJyZWFrIl0sIFsiYnJlYWthIiwgImJyZWFrYWRkIl0sIFsiYnJlYWtkIiwgImJyZWFrZGVsIl0sIFsiYnJlYWtsIiwgImJyZWFrbGlzdCJdLCBbImJybyIsICJicm93c2UiXSwgWyJidSIsICJidSJdLCBbImJ1ZiIsICJidWYiXSwgWyJidWZkbyIsICJidWZkbyJdLCBbImJ1ZmZlcnMiLCAiYnVmZmVycyJdLCBbImJ1biIsICJidW5sb2FkIl0sIFsiYnciLCAiYndpcGVvdXQiXSwgWyJjIiwgImMiXSwgWyJjIiwgImNoYW5nZSJdLCBbImNOIiwgImNOIl0sIFsiY04iLCAiY05leHQiXSwgWyJjTmYiLCAiY05mIl0sIFsiY05mIiwgImNOZmlsZSJdLCBbImNhYmMiLCAiY2FiY2xlYXIiXSwgWyJjYWQiLCAiY2FkIl0sIFsiY2FkIiwgImNhZGRleHByIl0sIFsiY2FkZGIiLCAiY2FkZGJ1ZmZlciJdLCBbImNhZGRmIiwgImNhZGRmaWxlIl0sIFsiY2FsIiwgImNhbGwiXSwgWyJjYXQiLCAiY2F0Y2giXSwgWyJjYiIsICJjYnVmZmVyIl0sIFsiY2MiLCAiY2MiXSwgWyJjY2wiLCAiY2Nsb3NlIl0sIFsiY2QiLCAiY2QiXSwgWyJjZSIsICJjZW50ZXIiXSwgWyJjZXgiLCAiY2V4cHIiXSwgWyJjZiIsICJjZmlsZSJdLCBbImNmaXIiLCAiY2ZpcnN0Il0sIFsiY2ciLCAiY2dldGZpbGUiXSwgWyJjZ2V0YiIsICJjZ2V0YnVmZmVyIl0sIFsiY2dldGUiLCAiY2dldGV4cHIiXSwgWyJjaGFuZ2VzIiwgImNoYW5nZXMiXSwgWyJjaGQiLCAiY2hkaXIiXSwgWyJjaGUiLCAiY2hlY2twYXRoIl0sIFsiY2hlY2t0IiwgImNoZWNrdGltZSJdLCBbImNsIiwgImNsIl0sIFsiY2wiLCAiY2xpc3QiXSwgWyJjbGEiLCAiY2xhc3QiXSwgWyJjbG8iLCAiY2xvc2UiXSwgWyJjbWFwYyIsICJjbWFwY2xlYXIiXSwgWyJjbiIsICJjbiJdLCBbImNuIiwgImNuZXh0Il0sIFsiY25ldyIsICJjbmV3ZXIiXSwgWyJjbmYiLCAiY25mIl0sIFsiY25mIiwgImNuZmlsZSJdLCBbImNvIiwgImNvcHkiXSwgWyJjb2wiLCAiY29sZGVyIl0sIFsiY29sbyIsICJjb2xvcnNjaGVtZSJdLCBbImNvbSIsICJjb20iXSwgWyJjb21jIiwgImNvbWNsZWFyIl0sIFsiY29tcCIsICJjb21waWxlciJdLCBbImNvbiIsICJjb24iXSwgWyJjb24iLCAiY29udGludWUiXSwgWyJjb25mIiwgImNvbmZpcm0iXSwgWyJjb3BlIiwgImNvcGVuIl0sIFsiY3AiLCAiY3ByZXZpb3VzIl0sIFsiY3BmIiwgImNwZmlsZSJdLCBbImNxIiwgImNxdWl0Il0sIFsiY3IiLCAiY3Jld2luZCJdLCBbImNzIiwgImNzIl0sIFsiY3Njb3BlIiwgImNzY29wZSJdLCBbImNzdGFnIiwgImNzdGFnIl0sIFsiY3VuYSIsICJjdW5hYmJyZXYiXSwgWyJjdyIsICJjd2luZG93Il0sIFsiZCIsICJkIl0sIFsiZCIsICJkZWxldGUiXSwgWyJkZSIsICJkZSJdLCBbImRlYnVnIiwgImRlYnVnIl0sIFsiZGVidWdnIiwgImRlYnVnZ3JlZWR5Il0sIFsiZGVsIiwgImRlbCJdLCBbImRlbGMiLCAiZGVsY29tbWFuZCJdLCBbImRlbGVsIiwgImRlbGVsIl0sIFsiZGVsZXAiLCAiZGVsZXAiXSwgWyJkZWxldGVsIiwgImRlbGV0ZWwiXSwgWyJkZWxldGVwIiwgImRlbGV0ZXAiXSwgWyJkZWxldGwiLCAiZGVsZXRsIl0sIFsiZGVsZXRwIiwgImRlbGV0cCJdLCBbImRlbGYiLCAiZGVsZiJdLCBbImRlbGYiLCAiZGVsZnVuY3Rpb24iXSwgWyJkZWxsIiwgImRlbGwiXSwgWyJkZWxtIiwgImRlbG1hcmtzIl0sIFsiZGVscCIsICJkZWxwIl0sIFsiZGVwIiwgImRlcCJdLCBbImRpIiwgImRpIl0sIFsiZGkiLCAiZGlzcGxheSJdLCBbImRpZmZnIiwgImRpZmZnZXQiXSwgWyJkaWZmbyIsICJkaWZmb2ZmIl0sIFsiZGlmZnAiLCAiZGlmZnBhdGNoIl0sIFsiZGlmZnB1IiwgImRpZmZwdXQiXSwgWyJkaWZmcyIsICJkaWZmc3BsaXQiXSwgWyJkaWZmdCIsICJkaWZmdGhpcyJdLCBbImRpZmZ1IiwgImRpZmZ1cGRhdGUiXSwgWyJkaWciLCAiZGlnIl0sIFsiZGlnIiwgImRpZ3JhcGhzIl0sIFsiZGlyIiwgImRpciJdLCBbImRqIiwgImRqdW1wIl0sIFsiZGwiLCAiZGwiXSwgWyJkbGkiLCAiZGxpc3QiXSwgWyJkbyIsICJkbyJdLCBbImRvYXUiLCAiZG9hdSJdLCBbImRwIiwgImRwIl0sIFsiZHIiLCAiZHJvcCJdLCBbImRzIiwgImRzZWFyY2giXSwgWyJkc3AiLCAiZHNwbGl0Il0sIFsiZSIsICJlIl0sIFsiZSIsICJlZGl0Il0sIFsiZWEiLCAiZWEiXSwgWyJlYXJsaWVyIiwgImVhcmxpZXIiXSwgWyJlYyIsICJlYyJdLCBbImVjaG9lIiwgImVjaG9lcnIiXSwgWyJlY2hvbSIsICJlY2hvbXNnIl0sIFsiZWNob24iLCAiZWNob24iXSwgWyJlbCIsICJlbHNlIl0sIFsiZWxzZWkiLCAiZWxzZWlmIl0sIFsiZW0iLCAiZW1lbnUiXSwgWyJlbiIsICJlbiJdLCBbImVuIiwgImVuZGlmIl0sIFsiZW5kZiIsICJlbmRmIl0sIFsiZW5kZiIsICJlbmRmdW5jdGlvbiJdLCBbImVuZGZvIiwgImVuZGZvciJdLCBbImVuZGZ1biIsICJlbmRmdW4iXSwgWyJlbmR0IiwgImVuZHRyeSJdLCBbImVuZHciLCAiZW5kd2hpbGUiXSwgWyJlbmUiLCAiZW5ldyJdLCBbImV4IiwgImV4Il0sIFsiZXhpIiwgImV4aXQiXSwgWyJleHUiLCAiZXh1c2FnZSJdLCBbImYiLCAiZiJdLCBbImYiLCAiZmlsZSJdLCBbImZpbGVzIiwgImZpbGVzIl0sIFsiZmlsZXQiLCAiZmlsZXQiXSwgWyJmaWxldHlwZSIsICJmaWxldHlwZSJdLCBbImZpbiIsICJmaW4iXSwgWyJmaW4iLCAiZmluZCJdLCBbImZpbmEiLCAiZmluYWxseSJdLCBbImZpbmkiLCAiZmluaXNoIl0sIFsiZmlyIiwgImZpcnN0Il0sIFsiZml4IiwgImZpeGRlbCJdLCBbImZvIiwgImZvbGQiXSwgWyJmb2xkYyIsICJmb2xkY2xvc2UiXSwgWyJmb2xkZCIsICJmb2xkZG9vcGVuIl0sIFsiZm9sZGRvYyIsICJmb2xkZG9jbG9zZWQiXSwgWyJmb2xkbyIsICJmb2xkb3BlbiJdLCBbImZvciIsICJmb3IiXSwgWyJmdSIsICJmdSJdLCBbImZ1IiwgImZ1bmN0aW9uIl0sIFsiZnVuIiwgImZ1biJdLCBbImciLCAiZyJdLCBbImdvIiwgImdvdG8iXSwgWyJnciIsICJncmVwIl0sIFsiZ3JlcGEiLCAiZ3JlcGFkZCJdLCBbImd1aSIsICJndWkiXSwgWyJndmltIiwgImd2aW0iXSwgWyJoIiwgImgiXSwgWyJoIiwgImhlbHAiXSwgWyJoYSIsICJoYXJkY29weSJdLCBbImhlbHBmIiwgImhlbHBmaW5kIl0sIFsiaGVscGciLCAiaGVscGdyZXAiXSwgWyJoZWxwdCIsICJoZWxwdGFncyJdLCBbImhpIiwgImhpIl0sIFsiaGlkIiwgImhpZGUiXSwgWyJoaXMiLCAiaGlzdG9yeSJdLCBbImkiLCAiaSJdLCBbImlhIiwgImlhIl0sIFsiaWFiYyIsICJpYWJjbGVhciJdLCBbImlmIiwgImlmIl0sIFsiaWoiLCAiaWp1bXAiXSwgWyJpbCIsICJpbGlzdCJdLCBbImltYXBjIiwgImltYXBjbGVhciJdLCBbImluIiwgImluIl0sIFsiaW50cm8iLCAiaW50cm8iXSwgWyJpcyIsICJpc2VhcmNoIl0sIFsiaXNwIiwgImlzcGxpdCJdLCBbIml1bmEiLCAiaXVuYWJicmV2Il0sIFsiaiIsICJqb2luIl0sIFsianUiLCAianVtcHMiXSwgWyJrIiwgImsiXSwgWyJrZWUiLCAia2VlcG1hcmtzIl0sIFsia2VlcGEiLCAia2VlcGEiXSwgWyJrZWVwYWx0IiwgImtlZXBhbHQiXSwgWyJrZWVwaiIsICJrZWVwanVtcHMiXSwgWyJrZWVwcCIsICJrZWVwcGF0dGVybnMiXSwgWyJsIiwgImwiXSwgWyJsIiwgImxpc3QiXSwgWyJsTiIsICJsTiJdLCBbImxOIiwgImxOZXh0Il0sIFsibE5mIiwgImxOZiJdLCBbImxOZiIsICJsTmZpbGUiXSwgWyJsYSIsICJsYSJdLCBbImxhIiwgImxhc3QiXSwgWyJsYWQiLCAibGFkIl0sIFsibGFkIiwgImxhZGRleHByIl0sIFsibGFkZGIiLCAibGFkZGJ1ZmZlciJdLCBbImxhZGRmIiwgImxhZGRmaWxlIl0sIFsibGFuIiwgImxhbiJdLCBbImxhbiIsICJsYW5ndWFnZSJdLCBbImxhdCIsICJsYXQiXSwgWyJsYXRlciIsICJsYXRlciJdLCBbImxiIiwgImxidWZmZXIiXSwgWyJsYyIsICJsY2QiXSwgWyJsY2giLCAibGNoZGlyIl0sIFsibGNsIiwgImxjbG9zZSJdLCBbImxjcyIsICJsY3MiXSwgWyJsY3Njb3BlIiwgImxjc2NvcGUiXSwgWyJsZSIsICJsZWZ0Il0sIFsibGVmdGEiLCAibGVmdGFib3ZlIl0sIFsibGV4IiwgImxleHByIl0sIFsibGYiLCAibGZpbGUiXSwgWyJsZmlyIiwgImxmaXJzdCJdLCBbImxnIiwgImxnZXRmaWxlIl0sIFsibGdldGIiLCAibGdldGJ1ZmZlciJdLCBbImxnZXRlIiwgImxnZXRleHByIl0sIFsibGdyIiwgImxncmVwIl0sIFsibGdyZXBhIiwgImxncmVwYWRkIl0sIFsibGgiLCAibGhlbHBncmVwIl0sIFsibGwiLCAibGwiXSwgWyJsbGEiLCAibGxhc3QiXSwgWyJsbGkiLCAibGxpc3QiXSwgWyJsbWFrIiwgImxtYWtlIl0sIFsibG1hcGMiLCAibG1hcGNsZWFyIl0sIFsibG5lIiwgImxuZSJdLCBbImxuZSIsICJsbmV4dCJdLCBbImxuZXciLCAibG5ld2VyIl0sIFsibG5mIiwgImxuZiJdLCBbImxuZiIsICJsbmZpbGUiXSwgWyJsbyIsICJsbyJdLCBbImxvIiwgImxvYWR2aWV3Il0sIFsibG9hZGsiLCAibG9hZGsiXSwgWyJsb2Fka2V5bWFwIiwgImxvYWRrZXltYXAiXSwgWyJsb2MiLCAibG9ja21hcmtzIl0sIFsibG9ja3YiLCAibG9ja3ZhciJdLCBbImxvbCIsICJsb2xkZXIiXSwgWyJsb3AiLCAibG9wZW4iXSwgWyJscCIsICJscHJldmlvdXMiXSwgWyJscGYiLCAibHBmaWxlIl0sIFsibHIiLCAibHJld2luZCJdLCBbImxzIiwgImxzIl0sIFsibHQiLCAibHRhZyJdLCBbImx1YSIsICJsdWEiXSwgWyJsdWFkbyIsICJsdWFkbyJdLCBbImx1YWZpbGUiLCAibHVhZmlsZSJdLCBbImx2IiwgImx2aW1ncmVwIl0sIFsibHZpbWdyZXBhIiwgImx2aW1ncmVwYWRkIl0sIFsibHciLCAibHdpbmRvdyJdLCBbIm0iLCAibW92ZSJdLCBbIm1hIiwgIm1hIl0sIFsibWEiLCAibWFyayJdLCBbIm1hayIsICJtYWtlIl0sIFsibWFya3MiLCAibWFya3MiXSwgWyJtYXQiLCAibWF0Y2giXSwgWyJtZW51dCIsICJtZW51dCJdLCBbIm1lbnV0IiwgIm1lbnV0cmFuc2xhdGUiXSwgWyJtZXMiLCAibWVzIl0sIFsibWVzc2FnZXMiLCAibWVzc2FnZXMiXSwgWyJtayIsICJtayJdLCBbIm1rIiwgIm1rZXhyYyJdLCBbIm1rcyIsICJta3Nlc3Npb24iXSwgWyJta3NwIiwgIm1rc3BlbGwiXSwgWyJta3YiLCAibWt2Il0sIFsibWt2IiwgIm1rdmltcmMiXSwgWyJta3ZpZSIsICJta3ZpZXciXSwgWyJtbyIsICJtbyJdLCBbIm1vZCIsICJtb2RlIl0sIFsibXoiLCAibXoiXSwgWyJteiIsICJtenNjaGVtZSJdLCBbIm16ZiIsICJtemZpbGUiXSwgWyJuIiwgIm4iXSwgWyJuIiwgIm5leHQiXSwgWyJuYiIsICJuYmtleSJdLCBbIm5iYyIsICJuYmNsb3NlIl0sIFsibmJzIiwgIm5ic3RhcnQiXSwgWyJuZSIsICJuZSJdLCBbIm5ldyIsICJuZXciXSwgWyJubWFwYyIsICJubWFwY2xlYXIiXSwgWyJub2EiLCAibm9hIl0sIFsibm9hdXRvY21kIiwgIm5vYXV0b2NtZCJdLCBbIm5vaCIsICJub2hsc2VhcmNoIl0sIFsibnUiLCAibnVtYmVyIl0sIFsibyIsICJvIl0sIFsibyIsICJvcGVuIl0sIFsib2wiLCAib2xkZmlsZXMiXSwgWyJvbWFwYyIsICJvbWFwY2xlYXIiXSwgWyJvbiIsICJvbmx5Il0sIFsib3B0IiwgIm9wdGlvbnMiXSwgWyJvd25zeW50YXgiLCAib3duc3ludGF4Il0sIFsicCIsICJwIl0sIFsicCIsICJwcmludCJdLCBbInBjIiwgInBjbG9zZSJdLCBbInBlIiwgInBlIl0sIFsicGUiLCAicGVybCJdLCBbInBlZCIsICJwZWRpdCJdLCBbInBlcmxkIiwgInBlcmxkbyJdLCBbInBvIiwgInBvcCJdLCBbInBvcHUiLCAicG9wdSJdLCBbInBvcHUiLCAicG9wdXAiXSwgWyJwcCIsICJwcG9wIl0sIFsicHIiLCAicHIiXSwgWyJwcmUiLCAicHJlc2VydmUiXSwgWyJwcmV2IiwgInByZXZpb3VzIl0sIFsicHJvIiwgInBybyJdLCBbInByb2YiLCAicHJvZmlsZSJdLCBbInByb2ZkIiwgInByb2ZkZWwiXSwgWyJwcm9tcHRmIiwgInByb21wdGZpbmQiXSwgWyJwcm9tcHRyIiwgInByb21wdHJlcGwiXSwgWyJwcyIsICJwc2VhcmNoIl0sIFsicHROIiwgInB0TiJdLCBbInB0TiIsICJwdE5leHQiXSwgWyJwdGEiLCAicHRhZyJdLCBbInB0ZiIsICJwdGZpcnN0Il0sIFsicHRqIiwgInB0anVtcCJdLCBbInB0bCIsICJwdGxhc3QiXSwgWyJwdG4iLCAicHRuIl0sIFsicHRuIiwgInB0bmV4dCJdLCBbInB0cCIsICJwdHByZXZpb3VzIl0sIFsicHRyIiwgInB0cmV3aW5kIl0sIFsicHRzIiwgInB0c2VsZWN0Il0sIFsicHUiLCAicHV0Il0sIFsicHciLCAicHdkIl0sIFsicHkiLCAicHkiXSwgWyJweSIsICJweXRob24iXSwgWyJweTMiLCAicHkzIl0sIFsicHkzIiwgInB5MyJdLCBbInB5M2RvIiwgInB5M2RvIl0sIFsicHlkbyIsICJweWRvIl0sIFsicHlmIiwgInB5ZmlsZSJdLCBbInB5dGhvbjMiLCAicHl0aG9uMyJdLCBbInEiLCAicSJdLCBbInEiLCAicXVpdCJdLCBbInFhIiwgInFhbGwiXSwgWyJxdWl0YSIsICJxdWl0YWxsIl0sIFsiciIsICJyIl0sIFsiciIsICJyZWFkIl0sIFsicmUiLCAicmUiXSwgWyJyZWMiLCAicmVjb3ZlciJdLCBbInJlZCIsICJyZWQiXSwgWyJyZWQiLCAicmVkbyJdLCBbInJlZGkiLCAicmVkaXIiXSwgWyJyZWRyIiwgInJlZHJhdyJdLCBbInJlZHJhd3MiLCAicmVkcmF3c3RhdHVzIl0sIFsicmVnIiwgInJlZ2lzdGVycyJdLCBbInJlcyIsICJyZXNpemUiXSwgWyJyZXQiLCAicmV0YWIiXSwgWyJyZXR1IiwgInJldHVybiJdLCBbInJldyIsICJyZXdpbmQiXSwgWyJyaSIsICJyaWdodCJdLCBbInJpZ2h0YiIsICJyaWdodGJlbG93Il0sIFsicnUiLCAicnUiXSwgWyJydSIsICJydW50aW1lIl0sIFsicnViIiwgInJ1YnkiXSwgWyJydWJ5ZCIsICJydWJ5ZG8iXSwgWyJydWJ5ZiIsICJydWJ5ZmlsZSJdLCBbInJ1bmRvIiwgInJ1bmRvIl0sIFsicnYiLCAicnZpbWluZm8iXSwgWyJzTiIsICJzTmV4dCJdLCBbInNhIiwgInNhcmd1bWVudCJdLCBbInNhbCIsICJzYWxsIl0sIFsic2FuIiwgInNhbmRib3giXSwgWyJzYXYiLCAic2F2ZWFzIl0sIFsic2IiLCAic2J1ZmZlciJdLCBbInNiTiIsICJzYk5leHQiXSwgWyJzYmEiLCAic2JhbGwiXSwgWyJzYmYiLCAic2JmaXJzdCJdLCBbInNibCIsICJzYmxhc3QiXSwgWyJzYm0iLCAic2Jtb2RpZmllZCJdLCBbInNibiIsICJzYm5leHQiXSwgWyJzYnAiLCAic2JwcmV2aW91cyJdLCBbInNiciIsICJzYnJld2luZCJdLCBbInNjcmlwIiwgInNjcmlwIl0sIFsic2NyaXAiLCAic2NyaXB0bmFtZXMiXSwgWyJzY3JpcHRlIiwgInNjcmlwdGVuY29kaW5nIl0sIFsic2NzIiwgInNjcyJdLCBbInNjc2NvcGUiLCAic2NzY29wZSJdLCBbInNlIiwgInNldCJdLCBbInNldGYiLCAic2V0ZmlsZXR5cGUiXSwgWyJzZXRnIiwgInNldGdsb2JhbCJdLCBbInNldGwiLCAic2V0bG9jYWwiXSwgWyJzZiIsICJzZmluZCJdLCBbInNmaXIiLCAic2ZpcnN0Il0sIFsic2giLCAic2hlbGwiXSwgWyJzaSIsICJzaSJdLCBbInNpZyIsICJzaWciXSwgWyJzaWduIiwgInNpZ24iXSwgWyJzaWwiLCAic2lsZW50Il0sIFsic2ltIiwgInNpbWFsdCJdLCBbInNsIiwgInNsIl0sIFsic2wiLCAic2xlZXAiXSwgWyJzbGEiLCAic2xhc3QiXSwgWyJzbSIsICJzbWFnaWMiXSwgWyJzbSIsICJzbWFwIl0sIFsic21lIiwgInNtZSJdLCBbInNtZW51IiwgInNtZW51Il0sIFsic24iLCAic25leHQiXSwgWyJzbmkiLCAic25pZmYiXSwgWyJzbm8iLCAic25vbWFnaWMiXSwgWyJzbm9yZW1lIiwgInNub3JlbWUiXSwgWyJzbm9yZW1lbnUiLCAic25vcmVtZW51Il0sIFsic28iLCAic28iXSwgWyJzbyIsICJzb3VyY2UiXSwgWyJzb3IiLCAic29ydCJdLCBbInNwIiwgInNwbGl0Il0sIFsic3BlIiwgInNwZSJdLCBbInNwZSIsICJzcGVsbGdvb2QiXSwgWyJzcGVsbGQiLCAic3BlbGxkdW1wIl0sIFsic3BlbGxpIiwgInNwZWxsaW5mbyJdLCBbInNwZWxsciIsICJzcGVsbHJlcGFsbCJdLCBbInNwZWxsdSIsICJzcGVsbHVuZG8iXSwgWyJzcGVsbHciLCAic3BlbGx3cm9uZyJdLCBbInNwciIsICJzcHJldmlvdXMiXSwgWyJzcmUiLCAic3Jld2luZCJdLCBbInN0IiwgInN0Il0sIFsic3QiLCAic3RvcCJdLCBbInN0YSIsICJzdGFnIl0sIFsic3RhciIsICJzdGFyIl0sIFsic3RhciIsICJzdGFydGluc2VydCJdLCBbInN0YXJ0IiwgInN0YXJ0Il0sIFsic3RhcnRnIiwgInN0YXJ0Z3JlcGxhY2UiXSwgWyJzdGFydHIiLCAic3RhcnRyZXBsYWNlIl0sIFsic3RqIiwgInN0anVtcCJdLCBbInN0b3BpIiwgInN0b3BpbnNlcnQiXSwgWyJzdHMiLCAic3RzZWxlY3QiXSwgWyJzdW4iLCAic3VuaGlkZSJdLCBbInN1bm1lIiwgInN1bm1lIl0sIFsic3VubWVudSIsICJzdW5tZW51Il0sIFsic3VzIiwgInN1c3BlbmQiXSwgWyJzdiIsICJzdmlldyJdLCBbInN3IiwgInN3YXBuYW1lIl0sIFsic3kiLCAic3kiXSwgWyJzeW4iLCAic3luIl0sIFsic3luYyIsICJzeW5jIl0sIFsic3luY2JpbmQiLCAic3luY2JpbmQiXSwgWyJzeW50aW1lIiwgInN5bnRpbWUiXSwgWyJ0IiwgInQiXSwgWyJ0TiIsICJ0TiJdLCBbInROIiwgInROZXh0Il0sIFsidGEiLCAidGEiXSwgWyJ0YSIsICJ0YWciXSwgWyJ0YWIiLCAidGFiIl0sIFsidGFiTiIsICJ0YWJOIl0sIFsidGFiTiIsICJ0YWJOZXh0Il0sIFsidGFiYyIsICJ0YWJjbG9zZSJdLCBbInRhYmQiLCAidGFiZG8iXSwgWyJ0YWJlIiwgInRhYmVkaXQiXSwgWyJ0YWJmIiwgInRhYmZpbmQiXSwgWyJ0YWJmaXIiLCAidGFiZmlyc3QiXSwgWyJ0YWJsIiwgInRhYmxhc3QiXSwgWyJ0YWJtIiwgInRhYm1vdmUiXSwgWyJ0YWJuIiwgInRhYm5leHQiXSwgWyJ0YWJuZXciLCAidGFibmV3Il0sIFsidGFibyIsICJ0YWJvbmx5Il0sIFsidGFicCIsICJ0YWJwcmV2aW91cyJdLCBbInRhYnIiLCAidGFicmV3aW5kIl0sIFsidGFicyIsICJ0YWJzIl0sIFsidGFncyIsICJ0YWdzIl0sIFsidGMiLCAidGNsIl0sIFsidGNsZCIsICJ0Y2xkbyJdLCBbInRjbGYiLCAidGNsZmlsZSJdLCBbInRlIiwgInRlYXJvZmYiXSwgWyJ0ZiIsICJ0Zmlyc3QiXSwgWyJ0aCIsICJ0aHJvdyJdLCBbInRqIiwgInRqdW1wIl0sIFsidGwiLCAidGxhc3QiXSwgWyJ0bSIsICJ0bSJdLCBbInRtIiwgInRtZW51Il0sIFsidG4iLCAidG4iXSwgWyJ0biIsICJ0bmV4dCJdLCBbInRvIiwgInRvcGxlZnQiXSwgWyJ0cCIsICJ0cHJldmlvdXMiXSwgWyJ0ciIsICJ0ciJdLCBbInRyIiwgInRyZXdpbmQiXSwgWyJ0cnkiLCAidHJ5Il0sIFsidHMiLCAidHNlbGVjdCJdLCBbInR1IiwgInR1Il0sIFsidHUiLCAidHVubWVudSJdLCBbInUiLCAidSJdLCBbInUiLCAidW5kbyJdLCBbInVuIiwgInVuIl0sIFsidW5hIiwgInVuYWJicmV2aWF0ZSJdLCBbInVuZG9qIiwgInVuZG9qb2luIl0sIFsidW5kb2wiLCAidW5kb2xpc3QiXSwgWyJ1bmgiLCAidW5oaWRlIl0sIFsidW5sIiwgInVubCJdLCBbInVubG8iLCAidW5sb2NrdmFyIl0sIFsidW5zIiwgInVuc2lsZW50Il0sIFsidXAiLCAidXBkYXRlIl0sIFsidiIsICJ2Il0sIFsidmUiLCAidmUiXSwgWyJ2ZSIsICJ2ZXJzaW9uIl0sIFsidmVyYiIsICJ2ZXJib3NlIl0sIFsidmVydCIsICJ2ZXJ0aWNhbCJdLCBbInZpIiwgInZpIl0sIFsidmkiLCAidmlzdWFsIl0sIFsidmllIiwgInZpZXciXSwgWyJ2aW0iLCAidmltZ3JlcCJdLCBbInZpbWdyZXBhIiwgInZpbWdyZXBhZGQiXSwgWyJ2aXUiLCAidml1c2FnZSJdLCBbInZtYXBjIiwgInZtYXBjbGVhciJdLCBbInZuZSIsICJ2bmV3Il0sIFsidnMiLCAidnNwbGl0Il0sIFsidyIsICJ3Il0sIFsidyIsICJ3cml0ZSJdLCBbIndOIiwgIndOZXh0Il0sIFsid2EiLCAid2FsbCJdLCBbIndoIiwgIndoaWxlIl0sIFsid2luIiwgIndpbiJdLCBbIndpbiIsICJ3aW5zaXplIl0sIFsid2luYyIsICJ3aW5jbWQiXSwgWyJ3aW5kbyIsICJ3aW5kbyJdLCBbIndpbnAiLCAid2lucG9zIl0sIFsid24iLCAid25leHQiXSwgWyJ3cCIsICJ3cHJldmlvdXMiXSwgWyJ3cSIsICJ3cSJdLCBbIndxYSIsICJ3cWFsbCJdLCBbIndzIiwgIndzdmVyYiJdLCBbInd1bmRvIiwgInd1bmRvIl0sIFsid3YiLCAid3ZpbWluZm8iXSwgWyJ4IiwgIngiXSwgWyJ4IiwgInhpdCJdLCBbInhhIiwgInhhbGwiXSwgWyJ4bWFwYyIsICJ4bWFwY2xlYXIiXSwgWyJ4bWUiLCAieG1lIl0sIFsieG1lbnUiLCAieG1lbnUiXSwgWyJ4bm9yZW1lIiwgInhub3JlbWUiXSwgWyJ4bm9yZW1lbnUiLCAieG5vcmVtZW51Il0sIFsieHVubWUiLCAieHVubWUiXSwgWyJ4dW5tZW51IiwgInh1bm1lbnUiXSwgWyJ4d2luaW5mbyIsICJ4d2luaW5mbyJdLCBbInkiLCAieWFuayJdXSwgOm9wdGlvbj0+W10sIDphdXRvPT5bWyJCdWZBZGQiLCAiQnVmQWRkIl0sIFsiQnVmQ3JlYXRlIiwgIkJ1ZkNyZWF0ZSJdLCBbIkJ1ZkRlbGV0ZSIsICJCdWZEZWxldGUiXSwgWyJCdWZFbnRlciIsICJCdWZFbnRlciJdLCBbIkJ1ZkZpbGVQb3N0IiwgIkJ1ZkZpbGVQb3N0Il0sIFsiQnVmRmlsZVByZSIsICJCdWZGaWxlUHJlIl0sIFsiQnVmSGlkZGVuIiwgIkJ1ZkhpZGRlbiJdLCBbIkJ1ZkxlYXZlIiwgIkJ1ZkxlYXZlIl0sIFsiQnVmTmV3IiwgIkJ1Zk5ldyJdLCBbIkJ1Zk5ld0ZpbGUiLCAiQnVmTmV3RmlsZSJdLCBbIkJ1ZlJlYWQiLCAiQnVmUmVhZCJdLCBbIkJ1ZlJlYWRDbWQiLCAiQnVmUmVhZENtZCJdLCBbIkJ1ZlJlYWRQb3N0IiwgIkJ1ZlJlYWRQb3N0Il0sIFsiQnVmUmVhZFByZSIsICJCdWZSZWFkUHJlIl0sIFsiQnVmVW5sb2FkIiwgIkJ1ZlVubG9hZCJdLCBbIkJ1ZldpbkVudGVyIiwgIkJ1ZldpbkVudGVyIl0sIFsiQnVmV2luTGVhdmUiLCAiQnVmV2luTGVhdmUiXSwgWyJCdWZXaXBlb3V0IiwgIkJ1ZldpcGVvdXQiXSwgWyJCdWZXcml0ZSIsICJCdWZXcml0ZSJdLCBbIkJ1ZldyaXRlQ21kIiwgIkJ1ZldyaXRlQ21kIl0sIFsiQnVmV3JpdGVQb3N0IiwgIkJ1ZldyaXRlUG9zdCJdLCBbIkJ1ZldyaXRlUHJlIiwgIkJ1ZldyaXRlUHJlIl0sIFsiQ21kIiwgIkNtZCJdLCBbIkNtZHdpbkVudGVyIiwgIkNtZHdpbkVudGVyIl0sIFsiQ21kd2luTGVhdmUiLCAiQ21kd2luTGVhdmUiXSwgWyJDb2xvclNjaGVtZSIsICJDb2xvclNjaGVtZSJdLCBbIkNvbXBsZXRlRG9uZSIsICJDb21wbGV0ZURvbmUiXSwgWyJDdXJzb3JIb2xkIiwgIkN1cnNvckhvbGQiXSwgWyJDdXJzb3JIb2xkSSIsICJDdXJzb3JIb2xkSSJdLCBbIkN1cnNvck1vdmVkIiwgIkN1cnNvck1vdmVkIl0sIFsiQ3Vyc29yTW92ZWRJIiwgIkN1cnNvck1vdmVkSSJdLCBbIkVuY29kaW5nQ2hhbmdlZCIsICJFbmNvZGluZ0NoYW5nZWQiXSwgWyJGaWxlQXBwZW5kQ21kIiwgIkZpbGVBcHBlbmRDbWQiXSwgWyJGaWxlQXBwZW5kUG9zdCIsICJGaWxlQXBwZW5kUG9zdCJdLCBbIkZpbGVBcHBlbmRQcmUiLCAiRmlsZUFwcGVuZFByZSJdLCBbIkZpbGVDaGFuZ2VkUk8iLCAiRmlsZUNoYW5nZWRSTyJdLCBbIkZpbGVDaGFuZ2VkU2hlbGwiLCAiRmlsZUNoYW5nZWRTaGVsbCJdLCBbIkZpbGVDaGFuZ2VkU2hlbGxQb3N0IiwgIkZpbGVDaGFuZ2VkU2hlbGxQb3N0Il0sIFsiRmlsZUVuY29kaW5nIiwgIkZpbGVFbmNvZGluZyJdLCBbIkZpbGVSZWFkQ21kIiwgIkZpbGVSZWFkQ21kIl0sIFsiRmlsZVJlYWRQb3N0IiwgIkZpbGVSZWFkUG9zdCJdLCBbIkZpbGVSZWFkUHJlIiwgIkZpbGVSZWFkUHJlIl0sIFsiRmlsZVR5cGUiLCAiRmlsZVR5cGUiXSwgWyJGaWxlV3JpdGVDbWQiLCAiRmlsZVdyaXRlQ21kIl0sIFsiRmlsZVdyaXRlUG9zdCIsICJGaWxlV3JpdGVQb3N0Il0sIFsiRmlsZVdyaXRlUHJlIiwgIkZpbGVXcml0ZVByZSJdLCBbIkZpbHRlclJlYWRQb3N0IiwgIkZpbHRlclJlYWRQb3N0Il0sIFsiRmlsdGVyUmVhZFByZSIsICJGaWx0ZXJSZWFkUHJlIl0sIFsiRmlsdGVyV3JpdGVQb3N0IiwgIkZpbHRlcldyaXRlUG9zdCJdLCBbIkZpbHRlcldyaXRlUHJlIiwgIkZpbHRlcldyaXRlUHJlIl0sIFsiRm9jdXNHYWluZWQiLCAiRm9jdXNHYWluZWQiXSwgWyJGb2N1c0xvc3QiLCAiRm9jdXNMb3N0Il0sIFsiRnVuY1VuZGVmaW5lZCIsICJGdW5jVW5kZWZpbmVkIl0sIFsiR1VJRW50ZXIiLCAiR1VJRW50ZXIiXSwgWyJHVUlGYWlsZWQiLCAiR1VJRmFpbGVkIl0sIFsiSW5zZXJ0Q2hhbmdlIiwgIkluc2VydENoYW5nZSJdLCBbIkluc2VydENoYXJQcmUiLCAiSW5zZXJ0Q2hhclByZSJdLCBbIkluc2VydEVudGVyIiwgIkluc2VydEVudGVyIl0sIFsiSW5zZXJ0TGVhdmUiLCAiSW5zZXJ0TGVhdmUiXSwgWyJNZW51UG9wdXAiLCAiTWVudVBvcHVwIl0sIFsiUXVpY2tGaXhDbWRQb3N0IiwgIlF1aWNrRml4Q21kUG9zdCJdLCBbIlF1aWNrRml4Q21kUHJlIiwgIlF1aWNrRml4Q21kUHJlIl0sIFsiUXVpdFByZSIsICJRdWl0UHJlIl0sIFsiUmVtb3RlUmVwbHkiLCAiUmVtb3RlUmVwbHkiXSwgWyJTZXNzaW9uTG9hZFBvc3QiLCAiU2Vzc2lvbkxvYWRQb3N0Il0sIFsiU2hlbGxDbWRQb3N0IiwgIlNoZWxsQ21kUG9zdCJdLCBbIlNoZWxsRmlsdGVyUG9zdCIsICJTaGVsbEZpbHRlclBvc3QiXSwgWyJTb3VyY2VDbWQiLCAiU291cmNlQ21kIl0sIFsiU291cmNlUHJlIiwgIlNvdXJjZVByZSJdLCBbIlNwZWxsRmlsZU1pc3NpbmciLCAiU3BlbGxGaWxlTWlzc2luZyJdLCBbIlN0ZGluUmVhZFBvc3QiLCAiU3RkaW5SZWFkUG9zdCJdLCBbIlN0ZGluUmVhZFByZSIsICJTdGRpblJlYWRQcmUiXSwgWyJTd2FwRXhpc3RzIiwgIlN3YXBFeGlzdHMiXSwgWyJTeW50YXgiLCAiU3ludGF4Il0sIFsiVGFiRW50ZXIiLCAiVGFiRW50ZXIiXSwgWyJUYWJMZWF2ZSIsICJUYWJMZWF2ZSJdLCBbIlRlcm1DaGFuZ2VkIiwgIlRlcm1DaGFuZ2VkIl0sIFsiVGVybVJlc3BvbnNlIiwgIlRlcm1SZXNwb25zZSJdLCBbIlRleHRDaGFuZ2VkIiwgIlRleHRDaGFuZ2VkIl0sIFsiVGV4dENoYW5nZWRJIiwgIlRleHRDaGFuZ2VkSSJdLCBbIlVzZXIiLCAiVXNlciJdLCBbIlVzZXJHZXR0aW5nQm9yZWQiLCAiVXNlckdldHRpbmdCb3JlZCJdLCBbIlZpbUVudGVyIiwgIlZpbUVudGVyIl0sIFsiVmltTGVhdmUiLCAiVmltTGVhdmUiXSwgWyJWaW1MZWF2ZVByZSIsICJWaW1MZWF2ZVByZSJdLCBbIlZpbVJlc2l6ZWQiLCAiVmltUmVzaXplZCJdLCBbIldpbkVudGVyIiwgIldpbkVudGVyIl0sIFsiV2luTGVhdmUiLCAiV2luTGVhdmUiXSwgWyJldmVudCIsICJldmVudCJdXX0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMveG1sLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9sZXhlcnMveG1sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDIzNzkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy94bWwucmIKQEAgLTAsMCArMSw1OSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIExleGVycworICAgIGNsYXNzIFhNTCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJYTUwiCisgICAgICBkZXNjICVxKDxkZXNjIGZvcj0idGhpcy1sZXhlciI+WE1MPC9kZXNjPikKKyAgICAgIHRhZyAneG1sJworICAgICAgZmlsZW5hbWVzIColdygqLnhtbCAqLnhzbCAqLnJzcyAqLnhzbHQgKi54c2QgKi53c2RsKQorICAgICAgbWltZXR5cGVzIColdygKKyAgICAgICAgdGV4dC94bWwKKyAgICAgICAgYXBwbGljYXRpb24veG1sCisgICAgICAgIGltYWdlL3N2Zyt4bWwKKyAgICAgICAgYXBwbGljYXRpb24vcnNzK3htbAorICAgICAgICBhcHBsaWNhdGlvbi9hdG9tK3htbAorICAgICAgKQorCisgICAgICBkZWYgc2VsZi5hbmFseXplX3RleHQodGV4dCkKKyAgICAgICAgcmV0dXJuIDAuOSBpZiB0ZXh0LmRvY3R5cGU/CisgICAgICAgIHJldHVybiAwLjggaWYgdGV4dCA9fiAvXEE8XD94bWxcYi8KKyAgICAgICAgc3RhcnQgPSB0ZXh0WzAuLjEwMDBdCisgICAgICAgIHJldHVybiAwLjYgaWYgc3RhcnQgPX4gJXIoPHhtbFxiKQorICAgICAgICByZXR1cm4gMC4zIGlmIHN0YXJ0ID1+ICVyKDwuKz8+Lio/PC8uKz8+KW0KKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6cm9vdCBkbworICAgICAgICBydWxlIC9bXjwmXSsvLCBUZXh0CisgICAgICAgIHJ1bGUgLyZcUyo/Oy8sIE5hbWU6OkVudGl0eQorICAgICAgICBydWxlIC88IVxbQ0RBVEFcWy4qP1xdXF1cPi8sIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgcnVsZSAvPCEtLS8sIENvbW1lbnQsIDpjb21tZW50CisgICAgICAgIHJ1bGUgLzxcPy4qP1w/Pi8sIENvbW1lbnQ6OlByZXByb2MKKyAgICAgICAgcnVsZSAvPCFbXj5dKj4vLCBDb21tZW50OjpQcmVwcm9jCisKKyAgICAgICAgIyBvcGVuIHRhZ3MKKyAgICAgICAgcnVsZSAlcig8XHMqW1x3Oi4tXSspbSwgTmFtZTo6VGFnLCA6dGFnCisKKyAgICAgICAgIyBzZWxmLWNsb3NpbmcgdGFncworICAgICAgICBydWxlICVyKDxccyovXHMqW1x3Oi4tXStccyo+KW0sIE5hbWU6OlRhZworICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpjb21tZW50IGRvCisgICAgICAgIHJ1bGUgL1teLV0rL20sIENvbW1lbnQKKyAgICAgICAgcnVsZSAvLS0+LywgQ29tbWVudCwgOnBvcCEKKyAgICAgICAgcnVsZSAvLS8sIENvbW1lbnQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dGFnIGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgL1tcdy46LV0rXHMqPS9tLCBOYW1lOjpBdHRyaWJ1dGUsIDphdHRyCisgICAgICAgIHJ1bGUgJXIoLz9ccyo+KSwgTmFtZTo6VGFnLCA6cG9wIQorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDphdHRyIGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgLyIuKj8ifCcuKj8nfFteXHM+XSsvLCBTdHIsIDpwb3AhCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvbGV4ZXJzL3lhbWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy95YW1sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTRjZjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL2xleGVycy95YW1sLnJiCkBAIC0wLDAgKzEsMzY0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgTGV4ZXJzCisgICAgY2xhc3MgWUFNTCA8IFJlZ2V4TGV4ZXIKKyAgICAgIHRpdGxlICJZQU1MIgorICAgICAgZGVzYyAiWWFtbCBBaW4ndCBNYXJrdXAgTGFuZ3VhZ2UgKHlhbWwub3JnKSIKKyAgICAgIG1pbWV0eXBlcyAndGV4dC94LXlhbWwnCisgICAgICB0YWcgJ3lhbWwnCisgICAgICBhbGlhc2VzICd5bWwnCisKKyAgICAgIGRlZiBzZWxmLmFuYWx5emVfdGV4dCh0ZXh0KQorICAgICAgICAjIGxvb2sgZm9yIHRoZSAlWUFNTCBkaXJlY3RpdmUKKyAgICAgICAgcmV0dXJuIDEgaWYgdGV4dCA9fiAvXEFccyolWUFNTC9tCisgICAgICBlbmQKKworICAgICAgZmlsZW5hbWVzICcqLnlhbWwnLCAnKi55bWwnCisgICAgICAjIE5COiBUYWJzIGFyZSBmb3JiaWRkZW4gaW4gWUFNTCwgd2hpY2ggaXMgd2h5IHlvdSBzZWUgdGhpbmdzCisgICAgICAjIGxpa2UgL1sgXSsvLgorCisgICAgICAjIHJlc2V0IHRoZSBpbmRlbnRhdGlvbiBsZXZlbHMKKyAgICAgIGRlZiByZXNldF9pbmRlbnQKKyAgICAgICAgcHV0cyAiICAgIHlhbWw6IHJlc2V0X2luZGVudCIgaWYgQGRlYnVnCisgICAgICAgIEBpbmRlbnRfc3RhY2sgPSBbMF0KKyAgICAgICAgQG5leHRfaW5kZW50ID0gMAorICAgICAgICBAYmxvY2tfc2NhbGFyX2luZGVudCA9IG5pbAorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbmRlbnQKKyAgICAgICAgcmFpc2UgJ2VtcHR5IGluZGVudCBzdGFjayEnIGlmIEBpbmRlbnRfc3RhY2suZW1wdHk/CisgICAgICAgIEBpbmRlbnRfc3RhY2subGFzdAorICAgICAgZW5kCisKKyAgICAgIGRlZiBkZWRlbnQ/KGxldmVsKQorICAgICAgICBsZXZlbCA8IHNlbGYuaW5kZW50CisgICAgICBlbmQKKworICAgICAgZGVmIGluZGVudD8obGV2ZWwpCisgICAgICAgIGxldmVsID4gc2VsZi5pbmRlbnQKKyAgICAgIGVuZAorCisgICAgICAjIFNhdmUgYSBwb3NzaWJsZSBpbmRlbnRhdGlvbiBsZXZlbAorICAgICAgZGVmIHNhdmVfaW5kZW50KG1hdGNoKQorICAgICAgICBAbmV4dF9pbmRlbnQgPSBtYXRjaC5zaXplCisgICAgICAgIHB1dHMgIiAgICB5YW1sOiBpbmRlbnQ6ICN7c2VsZi5pbmRlbnR9LyNAbmV4dF9pbmRlbnQiIGlmIEBkZWJ1ZworICAgICAgICBwdXRzICIgICAgeWFtbDogcG9wcGluZyBpbmRlbnQgc3RhY2sgLSBiZWZvcmU6ICNAaW5kZW50X3N0YWNrIiBpZiBAZGVidWcKKyAgICAgICAgaWYgZGVkZW50PyhAbmV4dF9pbmRlbnQpCisgICAgICAgICAgQGluZGVudF9zdGFjay5wb3Agd2hpbGUgZGVkZW50PyhAbmV4dF9pbmRlbnQpCisgICAgICAgICAgcHV0cyAiICAgIHlhbWw6IHBvcHBpbmcgaW5kZW50IHN0YWNrIC0gYWZ0ZXI6ICNAaW5kZW50X3N0YWNrIiBpZiBAZGVidWcKKyAgICAgICAgICBwdXRzICIgICAgeWFtbDogaW5kZW50OiAje3NlbGYuaW5kZW50fS8jQG5leHRfaW5kZW50IiBpZiBAZGVidWcKKworICAgICAgICAgICMgZGVkZW50aW5nIHRvIGEgc3RhdGUgbm90IHByZXZpb3VzbHkgaW5kZW50ZWQgdG8gaXMgYW4gZXJyb3IKKyAgICAgICAgICBbbWF0Y2hbMC4uLnNlbGYuaW5kZW50XSwgbWF0Y2hbc2VsZi5pbmRlbnQuLi0xXV0KKyAgICAgICAgZWxzZQorICAgICAgICAgIFttYXRjaCwgJyddCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb250aW51ZV9pbmRlbnQobWF0Y2gpCisgICAgICAgIHB1dHMgIiAgICB5YW1sOiBjb250aW51ZV9pbmRlbnQiIGlmIEBkZWJ1ZworICAgICAgICBAbmV4dF9pbmRlbnQgKz0gbWF0Y2guc2l6ZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZXRfaW5kZW50KG1hdGNoLCBvcHRzPXt9KQorICAgICAgICBpZiBpbmRlbnQgPCBAbmV4dF9pbmRlbnQKKyAgICAgICAgICBAaW5kZW50X3N0YWNrIDw8IEBuZXh0X2luZGVudAorICAgICAgICBlbmQKKworICAgICAgICBAbmV4dF9pbmRlbnQgKz0gbWF0Y2guc2l6ZSB1bmxlc3Mgb3B0c1s6aW1wbGljaXRdCisgICAgICBlbmQKKworICAgICAgcGxhaW5fc2NhbGFyX3N0YXJ0ID0gL1teIFx0XG5cclxmXHY/OixcW1xde30jJiohXHw+JyIlQGBdLworCisgICAgICBzdGFydCB7IHJlc2V0X2luZGVudCB9CisKKyAgICAgIHN0YXRlIDpiYXNpYyBkbworICAgICAgICBydWxlIC8jLiokLywgQ29tbWVudDo6U2luZ2xlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnJvb3QgZG8KKyAgICAgICAgbWl4aW4gOmJhc2ljCisKKyAgICAgICAgcnVsZSAvXG4rLywgVGV4dAorCisgICAgICAgICMgdHJhaWxpbmcgb3IgcHJlLWNvbW1lbnQgd2hpdGVzcGFjZQorICAgICAgICBydWxlIC9bIF0rKD89I3wkKS8sIFRleHQKKworICAgICAgICBydWxlIC9eJVlBTUxcYi8gZG8KKyAgICAgICAgICB0b2tlbiBOYW1lOjpUYWcKKyAgICAgICAgICByZXNldF9pbmRlbnQKKyAgICAgICAgICBwdXNoIDp5YW1sX2RpcmVjdGl2ZQorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9eJVRBR1xiLyBkbworICAgICAgICAgIHRva2VuIE5hbWU6OlRhZworICAgICAgICAgIHJlc2V0X2luZGVudAorICAgICAgICAgIHB1c2ggOnRhZ19kaXJlY3RpdmUKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBkb2Mtc3RhcnQgYW5kIGRvYy1lbmQgaW5kaWNhdG9ycworICAgICAgICBydWxlIC9eKD86LS0tfFwuXC5cLikoPz0gfCQpLyBkbworICAgICAgICAgIHRva2VuIE5hbWU6Ok5hbWVzcGFjZQorICAgICAgICAgIHJlc2V0X2luZGVudAorICAgICAgICAgIHB1c2ggOmJsb2NrX2xpbmUKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBpbmRlbnRhdGlvbiBzcGFjZXMKKyAgICAgICAgcnVsZSAvWyBdKig/IVxzfCQpLyBkbyB8bXwKKyAgICAgICAgICB0ZXh0LCBlcnIgPSBzYXZlX2luZGVudChtWzBdKQorICAgICAgICAgIHRva2VuIFRleHQsIHRleHQKKyAgICAgICAgICB0b2tlbiBFcnJvciwgZXJyCisgICAgICAgICAgcHVzaCA6YmxvY2tfbGluZTsgcHVzaCA6aW5kZW50YXRpb24KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmluZGVudGF0aW9uIGRvCisgICAgICAgIHJ1bGUoL1xzKj9cbi8pIHsgdG9rZW4gVGV4dDsgcG9wISAyIH0KKyAgICAgICAgIyB3aGl0ZXNwYWNlIHByZWNlZGluZyBibG9jayBjb2xsZWN0aW9uIGluZGljYXRvcnMKKyAgICAgICAgcnVsZSAvWyBdKyg/PVstOj9dKD86WyBdfCQpKS8gZG8gfG18CisgICAgICAgICAgdG9rZW4gVGV4dAorICAgICAgICAgIGNvbnRpbnVlX2luZGVudChtWzBdKQorICAgICAgICBlbmQKKworICAgICAgICAjIGJsb2NrIGNvbGxlY3Rpb24gaW5kaWNhdG9ycworICAgICAgICBydWxlKC9bPzotXSg/PVsgXXwkKS8pIHsgfG18IHRva2VuIFB1bmN0dWF0aW9uOjpJbmRpY2F0b3I7IHNldF9pbmRlbnQgbVswXSB9CisKKyAgICAgICAgIyB0aGUgYmVnaW5uaW5nIG9mIGEgYmxvY2sgbGluZQorICAgICAgICBydWxlKC9bIF0qLykgeyB8bXwgdG9rZW4gVGV4dDsgY29udGludWVfaW5kZW50KG1bMF0pOyBwb3AhIH0KKyAgICAgIGVuZAorCisgICAgICAjIGluZGVudGVkIGxpbmUgaW4gdGhlIGJsb2NrIGNvbnRleHQKKyAgICAgIHN0YXRlIDpibG9ja19saW5lIGRvCisgICAgICAgICMgbGluZSBlbmQKKyAgICAgICAgcnVsZSAvWyBdKig/PSN8JCkvLCBUZXh0LCA6cG9wIQorICAgICAgICBydWxlIC9bIF0rLywgVGV4dAorICAgICAgICAjIHRhZ3MsIGFuY2hvcnMsIGFuZCBhbGlhc2VzCisgICAgICAgIG1peGluIDpkZXNjcmlwdG9ycworICAgICAgICAjIGJsb2NrIGNvbGxlY3Rpb25zIGFuZCBzY2FsYXJzCisgICAgICAgIG1peGluIDpibG9ja19ub2RlcworICAgICAgICAjIGZsb3cgY29sbGVjdGlvbnMgYW5kIHF1b2VkIHNjYWxhcnMKKyAgICAgICAgbWl4aW4gOmZsb3dfbm9kZXMKKworICAgICAgICAjIGEgcGxhaW4gc2NhbGFyCisgICAgICAgIHJ1bGUgLyg/PSN7cGxhaW5fc2NhbGFyX3N0YXJ0fXxbPzotXVteIFx0XG5cclxmXHZdKS8gZG8KKyAgICAgICAgICB0b2tlbiBOYW1lOjpWYXJpYWJsZQorICAgICAgICAgIHB1c2ggOnBsYWluX3NjYWxhcl9pbl9ibG9ja19jb250ZXh0CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpkZXNjcmlwdG9ycyBkbworICAgICAgICAjIGEgZnVsbC1mb3JtIHRhZworICAgICAgICBydWxlIC8hPFswLTlBLVphLXo7XC8/OkAmPSskLF8uIX4qJygpXFtcXSUtXSs+LywgS2V5d29yZDo6VHlwZQorCisgICAgICAgICMgYSB0YWcgaW4gdGhlIGZvcm0gJyEnLCAnIXN1ZmZpeCcgb3IgJyFoYW5kbGUhc3VmZml4JworICAgICAgICBydWxlICVyKAorICAgICAgICAgICg/OiFbXHctXSspPyAjIGhhbmRsZQorICAgICAgICAgICEoPzpbXHc7Lz86QCY9KyQsLiF+KlwnKClcW1xdJS1dKikgIyBzdWZmaXgKKyAgICAgICAgKXgsIEtleXdvcmQ6OlR5cGUKKworICAgICAgICAjIGFuIGFuY2hvcgorICAgICAgICBydWxlIC8mW1x3LV0rLywgTmFtZTo6TGFiZWwKKworICAgICAgICAjIGFuIGFsaWFzCisgICAgICAgIHJ1bGUgL1wqW1x3LV0rLywgTmFtZTo6VmFyaWFibGUKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6YmxvY2tfbm9kZXMgZG8KKyAgICAgICAgIyBpbXBsaWNpdCBrZXkKKyAgICAgICAgcnVsZSAvOig/PVxzfCQpLyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBQdW5jdHVhdGlvbjo6SW5kaWNhdG9yCisgICAgICAgICAgc2V0X2luZGVudCBtWzBdLCA6aW1wbGljaXQgPT4gdHJ1ZQorICAgICAgICBlbmQKKworICAgICAgICAjIGxpdGVyYWwgYW5kIGZvbGRlZCBzY2FsYXJzCisgICAgICAgIHJ1bGUgL1tcfD5dLyBkbworICAgICAgICAgIHRva2VuIFB1bmN0dWF0aW9uOjpJbmRpY2F0b3IKKyAgICAgICAgICBwdXNoIDpibG9ja19zY2FsYXJfY29udGVudAorICAgICAgICAgIHB1c2ggOmJsb2NrX3NjYWxhcl9oZWFkZXIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmZsb3dfbm9kZXMgZG8KKyAgICAgICAgcnVsZSAvXFsvLCBQdW5jdHVhdGlvbjo6SW5kaWNhdG9yLCA6Zmxvd19zZXF1ZW5jZQorICAgICAgICBydWxlIC9cey8sIFB1bmN0dWF0aW9uOjpJbmRpY2F0b3IsIDpmbG93X21hcHBpbmcKKyAgICAgICAgcnVsZSAvJy8sIFN0cjo6U2luZ2xlLCA6c2luZ2xlX3F1b3RlZF9zY2FsYXIKKyAgICAgICAgcnVsZSAvIi8sIFN0cjo6RG91YmxlLCA6ZG91YmxlX3F1b3RlZF9zY2FsYXIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6Zmxvd19jb2xsZWN0aW9uIGRvCisgICAgICAgIHJ1bGUgL1xzKy9tLCBUZXh0CisgICAgICAgIG1peGluIDpiYXNpYworICAgICAgICBydWxlIC9bPzosXS8sIFB1bmN0dWF0aW9uOjpJbmRpY2F0b3IKKyAgICAgICAgbWl4aW4gOmRlc2NyaXB0b3JzCisgICAgICAgIG1peGluIDpmbG93X25vZGVzCisKKyAgICAgICAgcnVsZSAvKD89I3twbGFpbl9zY2FsYXJfc3RhcnR9KS8gZG8KKyAgICAgICAgICBwdXNoIDpwbGFpbl9zY2FsYXJfaW5fZmxvd19jb250ZXh0CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmbG93X3NlcXVlbmNlIGRvCisgICAgICAgIHJ1bGUgL1xdLywgUHVuY3R1YXRpb246OkluZGljYXRvciwgOnBvcCEKKyAgICAgICAgbWl4aW4gOmZsb3dfY29sbGVjdGlvbgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpmbG93X21hcHBpbmcgZG8KKyAgICAgICAgcnVsZSAvXH0vLCBQdW5jdHVhdGlvbjo6SW5kaWNhdG9yLCA6cG9wIQorICAgICAgICBtaXhpbiA6Zmxvd19jb2xsZWN0aW9uCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOmJsb2NrX3NjYWxhcl9jb250ZW50IGRvCisgICAgICAgIHJ1bGUgL1xuKy8sIFRleHQKKworICAgICAgICAjIGVtcHR5IGxpbmVzIG5ldmVyIGRlZGVudCwgYnV0IHRoZXkgbWlnaHQgYmUgcGFydCBvZiB0aGUgc2NhbGFyLgorICAgICAgICBydWxlIC9eWyBdKyQvIGRvIHxtfAorICAgICAgICAgIHRleHQgPSBtWzBdCisgICAgICAgICAgaW5kZW50X3NpemUgPSB0ZXh0LnNpemUKKworICAgICAgICAgIGluZGVudF9tYXJrID0gQGJsb2NrX3NjYWxhcl9pbmRlbnQgfHwgaW5kZW50X3NpemUKKworICAgICAgICAgIHRva2VuIFRleHQsIHRleHRbMC4uLmluZGVudF9tYXJrXQorICAgICAgICAgIHRva2VuIE5hbWU6OkNvbnN0YW50LCB0ZXh0W2luZGVudF9tYXJrLi4tMV0KKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBUT0RPOiBeIGRvZXNuJ3QgYWN0dWFsbHkgc2VlbSB0byBhZmZlY3QgdGhlIG1hdGNoIGF0IGFsbC4KKyAgICAgICAgIyBGaW5kIGEgd2F5IHRvIHdvcmsgYXJvdW5kIHRoaXMgbGltaXRhdGlvbi4KKyAgICAgICAgcnVsZSAvXlsgXSovIGRvIHxtfAorICAgICAgICAgIHRva2VuIFRleHQKKworICAgICAgICAgIGluZGVudF9zaXplID0gbVswXS5zaXplCisKKyAgICAgICAgICBkZWRlbnRfbGV2ZWwgPSBAYmxvY2tfc2NhbGFyX2luZGVudCB8fCBzZWxmLmluZGVudAorICAgICAgICAgIEBibG9ja19zY2FsYXJfaW5kZW50IHx8PSBpbmRlbnRfc2l6ZQorCisgICAgICAgICAgaWYgaW5kZW50X3NpemUgPCBkZWRlbnRfbGV2ZWwKKyAgICAgICAgICAgIHBvcCEgMgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBydWxlIC9bXlxuXHJcZlx2XSsvLCBOYW1lOjpDb25zdGFudAorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpibG9ja19zY2FsYXJfaGVhZGVyIGRvCisgICAgICAgICMgb3B0aW9uYWwgaW5kZW50YXRpb24gaW5kaWNhdG9yIGFuZCBjaG9tcGluZyBmbGFnLCBpbiBlaXRoZXIgb3JkZXIKKyAgICAgICAgcnVsZSAlcigKKyAgICAgICAgICAoCisgICAgICAgICAgICAoWzEtOV0pWystXT8gfCBbKy1dPyhbMS05XSk/CisgICAgICAgICAgKSg/PVsgXXwkKQorICAgICAgICApeCBkbyB8bXwKKyAgICAgICAgICBAYmxvY2tfc2NhbGFyX2luZGVudCA9IG5pbAorICAgICAgICAgIGdvdG8gOmlnbm9yZWRfbGluZQorICAgICAgICAgIG5leHQgaWYgbVswXS5lbXB0eT8KKworICAgICAgICAgIGluY3JlbWVudCA9IG1bMV0gfHwgbVsyXQorICAgICAgICAgIGlmIGluY3JlbWVudAorICAgICAgICAgICAgQGJsb2NrX3NjYWxhcl9pbmRlbnQgPSBpbmRlbnQgKyBpbmNyZW1lbnQudG9faQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgdG9rZW4gUHVuY3R1YXRpb246OkluZGljYXRvcgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6aWdub3JlZF9saW5lIGRvCisgICAgICAgIG1peGluIDpiYXNpYworICAgICAgICBydWxlIC9bIF0rLywgVGV4dAorICAgICAgICBydWxlIC9cbi8sIFRleHQsIDpwb3AhCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnF1b3RlZF9zY2FsYXJfd2hpdGVzcGFjZXMgZG8KKyAgICAgICAgIyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQKKyAgICAgICAgcnVsZSAvXlsgXSsvLCBUZXh0CisgICAgICAgIHJ1bGUgL1sgXSskLywgVGV4dAorCisgICAgICAgIHJ1bGUgL1xuKy9tLCBUZXh0CisKKyAgICAgICAgcnVsZSAvWyBdKy8sIE5hbWU6OlZhcmlhYmxlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnNpbmdsZV9xdW90ZWRfc2NhbGFyIGRvCisgICAgICAgIG1peGluIDpxdW90ZWRfc2NhbGFyX3doaXRlc3BhY2VzCisgICAgICAgIHJ1bGUgL1xcJy8sIFN0cjo6RXNjYXBlCisgICAgICAgIHJ1bGUgLycvLCBTdHIsIDpwb3AhCisgICAgICAgIHJ1bGUgL1teXHMnXSsvLCBTdHIKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6ZG91YmxlX3F1b3RlZF9zY2FsYXIgZG8KKyAgICAgICAgcnVsZSAvIi8sIFN0ciwgOnBvcCEKKyAgICAgICAgbWl4aW4gOnF1b3RlZF9zY2FsYXJfd2hpdGVzcGFjZXMKKyAgICAgICAgIyBlc2NhcGVzCisgICAgICAgIHJ1bGUgL1xcWzBhYnRcdG5cbnZmcmUgIlxcTl9MUF0vLCBTdHI6OkVzY2FwZQorICAgICAgICBydWxlIC9cXCg/OnhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NH18VVswLTlBLUZhLWZdezh9KS8sCisgICAgICAgICAgU3RyOjpFc2NhcGUKKyAgICAgICAgcnVsZSAvW14gXHRcblxyXGZcdiJcXF0rLywgU3RyCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnBsYWluX3NjYWxhcl9pbl9ibG9ja19jb250ZXh0X25ld19saW5lIGRvCisgICAgICAgIHJ1bGUgL15bIF0rXG4vLCBUZXh0CisgICAgICAgIHJ1bGUgL1xuKy9tLCBUZXh0CisgICAgICAgIHJ1bGUgL14oPz0tLS18XC5cLlwuKS8gZG8KKyAgICAgICAgICBwb3AhIDMKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBkZWRlbnQgZGV0ZWN0aW9uCisgICAgICAgIHJ1bGUgL15bIF0qLyBkbyB8bXwKKyAgICAgICAgICB0b2tlbiBUZXh0CisgICAgICAgICAgcG9wIQorCisgICAgICAgICAgaW5kZW50X3NpemUgPSBtWzBdLnNpemUKKworICAgICAgICAgICMgZGVkZW50ID0gZW5kIG9mIHNjYWxhcgorICAgICAgICAgIGlmIGluZGVudF9zaXplIDw9IHNlbGYuaW5kZW50CisgICAgICAgICAgICBwb3AhCisgICAgICAgICAgICBzYXZlX2luZGVudChtWzBdKQorICAgICAgICAgICAgcHVzaCA6aW5kZW50YXRpb24KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnBsYWluX3NjYWxhcl9pbl9ibG9ja19jb250ZXh0IGRvCisgICAgICAgICMgdGhlIDogaW5kaWNhdG9yIGVuZHMgYSBzY2FsYXIKKyAgICAgICAgcnVsZSAvWyBdKig/PTpbIFxuXXw6JCkvLCBUZXh0LCA6cG9wIQorICAgICAgICBydWxlIC9bIF0qOi8sIFN0cgorICAgICAgICBydWxlIC9bIF0rKD89IykvLCBUZXh0LCA6cG9wIQorICAgICAgICBydWxlIC9bIF0rJC8sIFRleHQKKyAgICAgICAgIyBjaGVjayBmb3IgbmV3IGRvY3VtZW50cyBvciBkZWRlbnRzIGF0IHRoZSBuZXcgbGluZQorICAgICAgICBydWxlIC9cbisvIGRvCisgICAgICAgICAgdG9rZW4gVGV4dAorICAgICAgICAgIHB1c2ggOnBsYWluX3NjYWxhcl9pbl9ibG9ja19jb250ZXh0X25ld19saW5lCisgICAgICAgIGVuZAorCisgICAgICAgIHJ1bGUgL1sgXSsvLCBTdHIKKyAgICAgICAgIyByZWd1bGFyIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMKKyAgICAgICAgcnVsZSAvW15cczpdKy8sIFN0cgorICAgICAgZW5kCisKKyAgICAgIHN0YXRlIDpwbGFpbl9zY2FsYXJfaW5fZmxvd19jb250ZXh0IGRvCisgICAgICAgIHJ1bGUgL1sgXSooPz1bLDo/XFtcXXt9XSkvLCBUZXh0LCA6cG9wIQorICAgICAgICBydWxlIC9bIF0rKD89IykvLCBUZXh0LCA6cG9wIQorICAgICAgICBydWxlIC9eWyBdKy8sIFRleHQKKyAgICAgICAgcnVsZSAvWyBdKyQvLCBUZXh0CisgICAgICAgIHJ1bGUgL1xuKy8sIFRleHQKKyAgICAgICAgcnVsZSAvWyBdKy8sIE5hbWU6OlZhcmlhYmxlCisgICAgICAgIHJ1bGUgL1teXHMsOj9cW1xde31dKy8sIE5hbWU6OlZhcmlhYmxlCisgICAgICBlbmQKKworICAgICAgc3RhdGUgOnlhbWxfZGlyZWN0aXZlIGRvCisgICAgICAgIHJ1bGUgLyhbIF0rKShcZCtcLlxkKykvIGRvCisgICAgICAgICAgZ3JvdXBzIFRleHQsIE51bQorICAgICAgICAgIGdvdG8gOmlnbm9yZWRfbGluZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBzdGF0ZSA6dGFnX2RpcmVjdGl2ZSBkbworICAgICAgICBydWxlICVyKAorICAgICAgICAgIChbIF0rKSghfCFbXHctXSohKSAjIHByZWZpeAorICAgICAgICAgIChbIF0rKSghfCE/W1x3Oy8/OkAmPSskLC4hfionKClcW1xdJS1dKykgIyB0YWcgaGFuZGxlCisgICAgICAgICl4IGRvCisgICAgICAgICAgZ3JvdXBzIFRleHQsIEtleXdvcmQ6OlR5cGUsIFRleHQsIEtleXdvcmQ6OlR5cGUKKyAgICAgICAgICBnb3RvIDppZ25vcmVkX2xpbmUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvcGx1Z2lucy9yZWRjYXJwZXQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3BsdWdpbnMvcmVkY2FycGV0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzUxMWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3BsdWdpbnMvcmVkY2FycGV0LnJiCkBAIC0wLDAgKzEsMzAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworIyB0aGlzIGZpbGUgaXMgbm90IHJlcXVpcmUnZCBmcm9tIHRoZSByb290LiAgVG8gdXNlIHRoaXMgcGx1Z2luLCBydW46CisjCisjICAgIHJlcXVpcmUgJ3JvdWdlL3BsdWdpbnMvcmVkY2FycGV0JworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIFBsdWdpbnMKKyAgICBtb2R1bGUgUmVkY2FycGV0CisgICAgICBkZWYgYmxvY2tfY29kZShjb2RlLCBsYW5ndWFnZSkKKyAgICAgICAgbGV4ZXIgPSBMZXhlci5maW5kX2ZhbmN5KGxhbmd1YWdlLCBjb2RlKSB8fCBMZXhlcnM6OlBsYWluVGV4dAorCisgICAgICAgICMgWFhYIEhBQ0s6IFJlZGNhcnBldCBzdHJpcHMgaGFyZCB0YWJzIG91dCBvZiBjb2RlIGJsb2NrcywKKyAgICAgICAgIyBzbyB3ZSBhc3N1bWUgeW91J3JlIG5vdCB1c2luZyBsZWFkaW5nIHNwYWNlcyB0aGF0IGFyZW4ndCB0YWJzLAorICAgICAgICAjIGFuZCBqdXN0IHJlcGxhY2UgdGhlbSBoZXJlLgorICAgICAgICBpZiBsZXhlci50YWcgPT0gJ21ha2UnCisgICAgICAgICAgY29kZS5nc3ViISAvXiAgICAvLCAiXHQiCisgICAgICAgIGVuZAorCisgICAgICAgIGZvcm1hdHRlciA9IHJvdWdlX2Zvcm1hdHRlcihsZXhlcikKKyAgICAgICAgZm9ybWF0dGVyLmZvcm1hdChsZXhlci5sZXgoY29kZSkpCisgICAgICBlbmQKKworICAgICAgIyBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgY3VzdG9tIGZvcm1hdHRpbmcgYmVoYXZpb3IKKyAgICAgIGRlZiByb3VnZV9mb3JtYXR0ZXIobGV4ZXIpCisgICAgICAgIEZvcm1hdHRlcnM6OkhUTUwubmV3KDpjc3NfY2xhc3MgPT4gImhpZ2hsaWdodCAje2xleGVyLnRhZ30iKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3JlZ2V4X2xleGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9yZWdleF9sZXhlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDU5NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS9yZWdleF9sZXhlci5yYgpAQCAtMCwwICsxLDQzOSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgIyBAYWJzdHJhY3QKKyAgIyBBIHN0YXRlZnVsIGxleGVyIHRoYXQgdXNlcyBzZXRzIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8KKyAgIyB0b2tlbml6ZSBhIHN0cmluZy4gIE1vc3QgbGV4ZXJzIGFyZSBpbnN0YW5jZXMgb2YgUmVnZXhMZXhlci4KKyAgY2xhc3MgUmVnZXhMZXhlciA8IExleGVyCisgICAgIyBBIHJ1bGUgaXMgYSB0dXBsZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB0ZXN0LCBhbmQgYSBjYWxsYmFjaworICAgICMgdG8gcGVyZm9ybSBpZiB0aGUgdGVzdCBzdWNjZWVkcy4KKyAgICAjCisgICAgIyBAc2VlIFN0YXRlRFNMI3J1bGUKKyAgICBjbGFzcyBSdWxlCisgICAgICBhdHRyX3JlYWRlciA6Y2FsbGJhY2sKKyAgICAgIGF0dHJfcmVhZGVyIDpyZQorICAgICAgYXR0cl9yZWFkZXIgOmJlZ2lubmluZ19vZl9saW5lCisgICAgICBkZWYgaW5pdGlhbGl6ZShyZSwgY2FsbGJhY2spCisgICAgICAgIEByZSA9IHJlCisgICAgICAgIEBjYWxsYmFjayA9IGNhbGxiYWNrCisgICAgICAgIEBiZWdpbm5pbmdfb2ZfbGluZSA9IHJlLnNvdXJjZVswXSA9PSA/XgorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbnNwZWN0CisgICAgICAgICIjPFJ1bGUgI3tAcmUuaW5zcGVjdH0+IgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIGEgU3RhdGUgaXMgYSBuYW1lZCBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdGVzdGVkIGZvciBvcgorICAgICMgbWl4ZWQgaW4uCisgICAgIworICAgICMgQHNlZSBSZWdleExleGVyLnN0YXRlCisgICAgY2xhc3MgU3RhdGUKKyAgICAgIGF0dHJfcmVhZGVyIDpuYW1lLCA6cnVsZXMKKyAgICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHJ1bGVzKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQHJ1bGVzID0gcnVsZXMKKyAgICAgIGVuZAorCisgICAgICBkZWYgaW5zcGVjdAorICAgICAgICAiIzwje3NlbGYuY2xhc3MubmFtZX0gI3tAbmFtZS5pbnNwZWN0fT4iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNsYXNzIFN0YXRlRFNMCisgICAgICBhdHRyX3JlYWRlciA6cnVsZXMKKyAgICAgIGRlZiBpbml0aWFsaXplKG5hbWUsICZkZWZuKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQGRlZm4gPSBkZWZuCisgICAgICAgIEBydWxlcyA9IFtdCisgICAgICBlbmQKKworICAgICAgZGVmIHRvX3N0YXRlKGxleGVyX2NsYXNzKQorICAgICAgICBsb2FkIQorICAgICAgICBydWxlcyA9IEBydWxlcy5tYXAgZG8gfHJ1bGV8CisgICAgICAgICAgcnVsZS5pc19hPyhTdHJpbmcpID8gbGV4ZXJfY2xhc3MuZ2V0X3N0YXRlKHJ1bGUpIDogcnVsZQorICAgICAgICBlbmQKKyAgICAgICAgU3RhdGUubmV3KEBuYW1lLCBydWxlcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgcHJlcGVuZGVkKCZkZWZuKQorICAgICAgICBwYXJlbnRfZGVmbiA9IEBkZWZuCisgICAgICAgIFN0YXRlRFNMLm5ldyhAbmFtZSkgZG8KKyAgICAgICAgICBpbnN0YW5jZV9ldmFsKCZkZWZuKQorICAgICAgICAgIGluc3RhbmNlX2V2YWwoJnBhcmVudF9kZWZuKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgYXBwZW5kZWQoJmRlZm4pCisgICAgICAgIHBhcmVudF9kZWZuID0gQGRlZm4KKyAgICAgICAgU3RhdGVEU0wubmV3KEBuYW1lKSBkbworICAgICAgICAgIGluc3RhbmNlX2V2YWwoJnBhcmVudF9kZWZuKQorICAgICAgICAgIGluc3RhbmNlX2V2YWwoJmRlZm4pCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKyAgICAgICMgRGVmaW5lIGEgbmV3IHJ1bGUgZm9yIHRoaXMgc3RhdGUuCisgICAgICAjCisgICAgICAjIEBvdmVybG9hZCBydWxlKHJlLCB0b2tlbiwgbmV4dF9zdGF0ZT1uaWwpCisgICAgICAjIEBvdmVybG9hZCBydWxlKHJlLCAmY2FsbGJhY2spCisgICAgICAjCisgICAgICAjIEBwYXJhbSBbUmVnZXhwXSByZQorICAgICAgIyAgIGEgcmVndWxhciBleHByZXNzaW9uIGZvciB0aGlzIHJ1bGUgdG8gdGVzdC4KKyAgICAgICMgQHBhcmFtIFtTdHJpbmddIHRvaworICAgICAgIyAgIHRoZSB0b2tlbiB0eXBlIHRvIHlpZWxkIGlmIGByZWAgbWF0Y2hlcy4KKyAgICAgICMgQHBhcmFtIFsjdG9fc10gbmV4dF9zdGF0ZQorICAgICAgIyAgIChvcHRpb25hbCkgYSBzdGF0ZSB0byBwdXNoIG9udG8gdGhlIHN0YWNrIGlmIGByZWAgbWF0Y2hlcy4KKyAgICAgICMgICBJZiBgbmV4dF9zdGF0ZWAgaXMgYDpwb3AhYCwgdGhlIHN0YXRlIHN0YWNrIHdpbGwgYmUgcG9wcGVkCisgICAgICAjICAgaW5zdGVhZC4KKyAgICAgICMgQHBhcmFtIFtQcm9jXSBjYWxsYmFjaworICAgICAgIyAgIGEgYmxvY2sgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbGV4ZXIKKyAgICAgICMgICBpZiBgcmVgIG1hdGNoZXMuICBUaGlzIGJsb2NrIGhhcyBhY2Nlc3MgdG8gYSBudW1iZXIgb2YgbGV4ZXIKKyAgICAgICMgICBtZXRob2RzLCBpbmNsdWRpbmcge1JlZ2V4TGV4ZXIjcHVzaH0sIHtSZWdleExleGVyI3BvcCF9LAorICAgICAgIyAgIHtSZWdleExleGVyI3Rva2VufSwgYW5kIHtSZWdleExleGVyI2RlbGVnYXRlfS4gIFRoZSBmaXJzdAorICAgICAgIyAgIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgbWF0Y2ggZ3JvdXBzLgorICAgICAgZGVmIHJ1bGUocmUsIHRvaz1uaWwsIG5leHRfc3RhdGU9bmlsLCAmY2FsbGJhY2spCisgICAgICAgIGlmIHRvay5uaWw/ICYmIGNhbGxiYWNrLm5pbD8KKyAgICAgICAgICByYWlzZSAicGxlYXNlIHBhc3MgYHJ1bGVgIGEgdG9rZW4gdG8geWllbGQgb3IgYSBjYWxsYmFjayIKKyAgICAgICAgZW5kCisKKyAgICAgICAgY2FsbGJhY2sgfHw9IGNhc2UgbmV4dF9zdGF0ZQorICAgICAgICB3aGVuIDpwb3AhCisgICAgICAgICAgcHJvYyBkbyB8c3RyZWFtfAorICAgICAgICAgICAgcHV0cyAiICAgIHlpZWxkaW5nICN7dG9rLnF1YWxuYW1lfSwgI3tzdHJlYW1bMF0uaW5zcGVjdH0iIGlmIEBkZWJ1ZworICAgICAgICAgICAgQG91dHB1dF9zdHJlYW0uY2FsbCh0b2ssIHN0cmVhbVswXSkKKyAgICAgICAgICAgIHB1dHMgIiAgICBwb3BwaW5nIHN0YWNrOiAjezF9IiBpZiBAZGVidWcKKyAgICAgICAgICAgIEBzdGFjay5wb3Agb3IgcmFpc2UgJ2VtcHR5IHN0YWNrIScKKyAgICAgICAgICBlbmQKKyAgICAgICAgd2hlbiA6cHVzaAorICAgICAgICAgIHByb2MgZG8gfHN0cmVhbXwKKyAgICAgICAgICAgIHB1dHMgIiAgICB5aWVsZGluZyAje3Rvay5xdWFsbmFtZX0sICN7c3RyZWFtWzBdLmluc3BlY3R9IiBpZiBAZGVidWcKKyAgICAgICAgICAgIEBvdXRwdXRfc3RyZWFtLmNhbGwodG9rLCBzdHJlYW1bMF0pCisgICAgICAgICAgICBwdXRzICIgICAgcHVzaGluZyAje0BzdGFjay5sYXN0Lm5hbWV9IiBpZiBAZGVidWcKKyAgICAgICAgICAgIEBzdGFjay5wdXNoKEBzdGFjay5sYXN0KQorICAgICAgICAgIGVuZAorICAgICAgICB3aGVuIFN5bWJvbAorICAgICAgICAgIHByb2MgZG8gfHN0cmVhbXwKKyAgICAgICAgICAgIHB1dHMgIiAgICB5aWVsZGluZyAje3Rvay5xdWFsbmFtZX0sICN7c3RyZWFtWzBdLmluc3BlY3R9IiBpZiBAZGVidWcKKyAgICAgICAgICAgIEBvdXRwdXRfc3RyZWFtLmNhbGwodG9rLCBzdHJlYW1bMF0pCisgICAgICAgICAgICBzdGF0ZSA9IEBzdGF0ZXNbbmV4dF9zdGF0ZV0gfHwgc2VsZi5jbGFzcy5nZXRfc3RhdGUobmV4dF9zdGF0ZSkKKyAgICAgICAgICAgIHB1dHMgIiAgICBwdXNoaW5nICN7c3RhdGUubmFtZX0iIGlmIEBkZWJ1ZworICAgICAgICAgICAgQHN0YWNrLnB1c2goc3RhdGUpCisgICAgICAgICAgZW5kCisgICAgICAgIHdoZW4gbmlsCisgICAgICAgICAgcHJvYyBkbyB8c3RyZWFtfAorICAgICAgICAgICAgcHV0cyAiICAgIHlpZWxkaW5nICN7dG9rLnF1YWxuYW1lfSwgI3tzdHJlYW1bMF0uaW5zcGVjdH0iIGlmIEBkZWJ1ZworICAgICAgICAgICAgQG91dHB1dF9zdHJlYW0uY2FsbCh0b2ssIHN0cmVhbVswXSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlICJpbnZhbGlkIG5leHQgc3RhdGU6ICN7bmV4dF9zdGF0ZS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisKKyAgICAgICAgcnVsZXMgPDwgUnVsZS5uZXcocmUsIGNhbGxiYWNrKQorICAgICAgZW5kCisKKyAgICAgICMgTWl4IGluIHRoZSBydWxlcyBmcm9tIGFub3RoZXIgc3RhdGUgaW50byB0aGlzIHN0YXRlLiAgVGhlIHJ1bGVzCisgICAgICAjIGZyb20gdGhlIG1peGVkLWluIHN0YXRlIHdpbGwgYmUgdHJpZWQgaW4gb3JkZXIgYmVmb3JlIG1vdmluZyBvbgorICAgICAgIyB0byB0aGUgcmVzdCBvZiB0aGUgcnVsZXMgaW4gdGhpcyBzdGF0ZS4KKyAgICAgIGRlZiBtaXhpbihzdGF0ZSkKKyAgICAgICAgcnVsZXMgPDwgc3RhdGUudG9fcworICAgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgICBkZWYgbG9hZCEKKyAgICAgICAgcmV0dXJuIGlmIEBsb2FkZWQKKyAgICAgICAgQGxvYWRlZCA9IHRydWUKKyAgICAgICAgaW5zdGFuY2VfZXZhbCgmQGRlZm4pCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVGhlIHN0YXRlcyBoYXNoIGZvciB0aGlzIGxleGVyLgorICAgICMgQHNlZSBzdGF0ZQorICAgIGRlZiBzZWxmLnN0YXRlcworICAgICAgQHN0YXRlcyB8fD0ge30KKyAgICBlbmQKKworICAgIGRlZiBzZWxmLnN0YXRlX2RlZmluaXRpb25zCisgICAgICBAc3RhdGVfZGVmaW5pdGlvbnMgfHw9IEluaGVyaXRhYmxlSGFzaC5uZXcoc3VwZXJjbGFzcy5zdGF0ZV9kZWZpbml0aW9ucykKKyAgICBlbmQKKyAgICBAc3RhdGVfZGVmaW5pdGlvbnMgPSB7fQorCisgICAgZGVmIHNlbGYucmVwbGFjZV9zdGF0ZShuYW1lLCBuZXdfZGVmbikKKyAgICAgIHN0YXRlc1tuYW1lXSA9IG5pbAorICAgICAgc3RhdGVfZGVmaW5pdGlvbnNbbmFtZV0gPSBuZXdfZGVmbgorICAgIGVuZAorCisgICAgIyBUaGUgcm91dGluZXMgdG8gcnVuIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmcmVzaCBsZXguCisgICAgIyBAc2VlIHN0YXJ0CisgICAgZGVmIHNlbGYuc3RhcnRfcHJvY3MKKyAgICAgIEBzdGFydF9wcm9jcyB8fD0gSW5oZXJpdGFibGVMaXN0Lm5ldyhzdXBlcmNsYXNzLnN0YXJ0X3Byb2NzKQorICAgIGVuZAorICAgIEBzdGFydF9wcm9jcyA9IFtdCisKKyAgICAjIFNwZWNpZnkgYW4gYWN0aW9uIHRvIGJlIHJ1biBldmVyeSBmcmVzaCBsZXguCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgc3RhcnQgeyBwdXRzICJJJ20gbGV4aW5nIGEgbmV3IHN0cmluZyEiIH0KKyAgICBkZWYgc2VsZi5zdGFydCgmYikKKyAgICAgIHN0YXJ0X3Byb2NzIDw8IGIKKyAgICBlbmQKKworICAgICMgRGVmaW5lIGEgbmV3IHN0YXRlIGZvciB0aGlzIGxleGVyIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgIyBUaGUgYmxvY2sgd2lsbCBiZSBldmFsdWF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgYSB7U3RhdGVEU0x9LgorICAgIGRlZiBzZWxmLnN0YXRlKG5hbWUsICZiKQorICAgICAgbmFtZSA9IG5hbWUudG9fcworICAgICAgc3RhdGVfZGVmaW5pdGlvbnNbbmFtZV0gPSBTdGF0ZURTTC5uZXcobmFtZSwgJmIpCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5wcmVwZW5kKG5hbWUsICZiKQorICAgICAgbmFtZSA9IG5hbWUudG9fcworICAgICAgZHNsID0gc3RhdGVfZGVmaW5pdGlvbnNbbmFtZV0gb3IgcmFpc2UgIm5vIHN1Y2ggc3RhdGUgI3tuYW1lLmluc3BlY3R9IgorICAgICAgcmVwbGFjZV9zdGF0ZShuYW1lLCBkc2wucHJlcGVuZGVkKCZiKSkKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmFwcGVuZChuYW1lLCAmYikKKyAgICAgIG5hbWUgPSBuYW1lLnRvX3MKKyAgICAgIGRzbCA9IHN0YXRlX2RlZmluaXRpb25zW25hbWVdIG9yIHJhaXNlICJubyBzdWNoIHN0YXRlICN7bmFtZS5pbnNwZWN0fSIKKyAgICAgIHJlcGxhY2Vfc3RhdGUobmFtZSwgZHNsLmFwcGVuZGVkKCZiKSkKKyAgICBlbmQKKworICAgICMgQHByaXZhdGUKKyAgICBkZWYgc2VsZi5nZXRfc3RhdGUobmFtZSkKKyAgICAgIHJldHVybiBuYW1lIGlmIG5hbWUuaXNfYT8gU3RhdGUKKworICAgICAgc3RhdGVzW25hbWUudG9fc3ltXSB8fD0gYmVnaW4KKyAgICAgICAgZGVmbiA9IHN0YXRlX2RlZmluaXRpb25zW25hbWUudG9fc10gb3IgcmFpc2UgInVua25vd24gc3RhdGU6ICN7bmFtZS5pbnNwZWN0fSIKKyAgICAgICAgZGVmbi50b19zdGF0ZShzZWxmKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEBwcml2YXRlCisgICAgZGVmIGdldF9zdGF0ZShzdGF0ZV9uYW1lKQorICAgICAgc2VsZi5jbGFzcy5nZXRfc3RhdGUoc3RhdGVfbmFtZSkKKyAgICBlbmQKKworICAgICMgVGhlIHN0YXRlIHN0YWNrLiAgVGhpcyBpcyBpbml0aWFsbHkgdGhlIHNpbmdsZSBzdGF0ZSBgWzpyb290XWAuCisgICAgIyBJdCBpcyBhbiBlcnJvciBmb3IgdGhpcyBzdGFjayB0byBiZSBlbXB0eS4KKyAgICAjIEBzZWUgI3N0YXRlCisgICAgZGVmIHN0YWNrCisgICAgICBAc3RhY2sgfHw9IFtnZXRfc3RhdGUoOnJvb3QpXQorICAgIGVuZAorCisgICAgIyBUaGUgY3VycmVudCBzdGF0ZSAtIGkuZS4gb25lIG9uIHRvcCBvZiB0aGUgc3RhdGUgc3RhY2suCisgICAgIworICAgICMgTkI6IGlmIHRoZSBzdGF0ZSBzdGFjayBpcyBlbXB0eSwgdGhpcyB3aWxsIHRocm93IGFuIGVycm9yIHJhdGhlcgorICAgICMgdGhhbiByZXR1cm5pbmcgbmlsLgorICAgIGRlZiBzdGF0ZQorICAgICAgc3RhY2subGFzdCBvciByYWlzZSAnZW1wdHkgc3RhY2shJworICAgIGVuZAorCisgICAgIyByZXNldCB0aGlzIGxleGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLiAgVGhpcyBydW5zIGFsbCBvZiB0aGUKKyAgICAjIHN0YXJ0X3Byb2NzLgorICAgIGRlZiByZXNldCEKKyAgICAgIEBzdGFjayA9IG5pbAorICAgICAgQGN1cnJlbnRfc3RyZWFtID0gbmlsCisKKyAgICAgIHNlbGYuY2xhc3Muc3RhcnRfcHJvY3MuZWFjaCBkbyB8cHJ8CisgICAgICAgIGluc3RhbmNlX2V2YWwoJnByKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRoaXMgaW1wbGVtZW50cyB0aGUgbGV4ZXIgcHJvdG9jb2wsIGJ5IHlpZWxkaW5nIFt0b2tlbiwgdmFsdWVdIHBhaXJzLgorICAgICMKKyAgICAjIFRoZSBwcm9jZXNzIGZvciBsZXhpbmcgd29ya3MgYXMgZm9sbG93cywgdW50aWwgdGhlIHN0cmVhbSBpcyBlbXB0eToKKyAgICAjCisgICAgIyAxLiBXZSBsb29rIGF0IHRoZSBzdGF0ZSBvbiB0b3Agb2YgdGhlIHN0YWNrICh3aGljaCBieSBkZWZhdWx0IGlzCisgICAgIyAgICBgWzpyb290XWApLgorICAgICMgMi4gRWFjaCBydWxlIGluIHRoYXQgc3RhdGUgaXMgdHJpZWQgdW50aWwgb25lIGlzIHN1Y2Nlc3NmdWwuICBJZiBvbmUKKyAgICAjICAgIGlzIGZvdW5kLCB0aGF0IHJ1bGUncyBjYWxsYmFjayBpcyBldmFsdWF0ZWQgLSB3aGljaCBtYXkgeWllbGQKKyAgICAjICAgIHRva2VucyBhbmQgbWFuaXB1bGF0ZSB0aGUgc3RhdGUgc3RhY2suICBPdGhlcndpc2UsIG9uZSBjaGFyYWN0ZXIKKyAgICAjICAgIGlzIGNvbnN1bWVkIHdpdGggYW4gYCdFcnJvcidgIHRva2VuLCBhbmQgd2UgY29udGludWUgYXQgKDEuKQorICAgICMKKyAgICAjIEBzZWUgI3N0ZXAgI3N0ZXAgKHdoZXJlICgyLikgaXMgaW1wbGVtZW50ZWQpCisgICAgZGVmIHN0cmVhbV90b2tlbnMoc3RyLCAmYikKKyAgICAgIHN0cmVhbSA9IFN0cmluZ1NjYW5uZXIubmV3KHN0cikKKworICAgICAgQGN1cnJlbnRfc3RyZWFtID0gc3RyZWFtCisgICAgICBAb3V0cHV0X3N0cmVhbSAgPSBiCisgICAgICBAc3RhdGVzICAgICAgICAgPSBzZWxmLmNsYXNzLnN0YXRlcworICAgICAgQG51bGxfc3RlcHMgICAgID0gMAorCisgICAgICB1bnRpbCBzdHJlYW0uZW9zPworICAgICAgICBpZiBAZGVidWcKKyAgICAgICAgICBwdXRzICJsZXhlcjogI3tzZWxmLmNsYXNzLnRhZ30iCisgICAgICAgICAgcHV0cyAic3RhY2s6ICN7c3RhY2subWFwKCY6bmFtZSkuaW5zcGVjdH0iCisgICAgICAgICAgcHV0cyAic3RyZWFtOiAje3N0cmVhbS5wZWVrKDIwKS5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisKKyAgICAgICAgc3VjY2VzcyA9IHN0ZXAoc3RhdGUsIHN0cmVhbSkKKworICAgICAgICBpZiAhc3VjY2VzcworICAgICAgICAgIHB1dHMgIiAgICBubyBtYXRjaCwgeWllbGRpbmcgRXJyb3IiIGlmIEBkZWJ1ZworICAgICAgICAgIGIuY2FsbChUb2tlbjo6VG9rZW5zOjpFcnJvciwgc3RyZWFtLmdldGNoKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUgbnVtYmVyIG9mIHN1Y2Nlc3NpdmUgc2NhbnMgcGVybWl0dGVkIHdpdGhvdXQgY29uc3VtaW5nCisgICAgIyB0aGUgaW5wdXQgc3RyZWFtLiAgSWYgdGhpcyBpcyBleGNlZWRlZCwgdGhlIG1hdGNoIGZhaWxzLgorICAgIE1BWF9OVUxMX1NDQU5TID0gNQorCisgICAgIyBSdW5zIG9uZSBzdGVwIG9mIHRoZSBsZXguICBSdWxlcyBpbiB0aGUgY3VycmVudCBzdGF0ZSBhcmUgdHJpZWQKKyAgICAjIHVudGlsIG9uZSBtYXRjaGVzLCBhdCB3aGljaCBwb2ludCBpdHMgY2FsbGJhY2sgaXMgY2FsbGVkLgorICAgICMKKyAgICAjIEByZXR1cm4gdHJ1ZSBpZiBhIHJ1bGUgd2FzIHRyaWVkIHN1Y2Nlc3NmdWxseQorICAgICMgQHJldHVybiBmYWxzZSBvdGhlcndpc2UuCisgICAgZGVmIHN0ZXAoc3RhdGUsIHN0cmVhbSkKKyAgICAgIHN0YXRlLnJ1bGVzLmVhY2ggZG8gfHJ1bGV8CisgICAgICAgIGlmIHJ1bGUuaXNfYT8oU3RhdGUpCisgICAgICAgICAgcHV0cyAiICBlbnRlcmluZyBtaXhpbiAje3J1bGUubmFtZX0iIGlmIEBkZWJ1ZworICAgICAgICAgIHJldHVybiB0cnVlIGlmIHN0ZXAocnVsZSwgc3RyZWFtKQorICAgICAgICAgIHB1dHMgIiAgZXhpdGluZyAgbWl4aW4gI3tydWxlLm5hbWV9IiBpZiBAZGVidWcKKyAgICAgICAgZWxzZQorICAgICAgICAgIHB1dHMgIiAgdHJ5aW5nICN7cnVsZS5pbnNwZWN0fSIgaWYgQGRlYnVnCisKKyAgICAgICAgICAjIFhYWCBIQUNLIFhYWAorICAgICAgICAgICMgU3RyaW5nU2Nhbm5lcidzIGltcGxlbWVudGF0aW9uIG9mIF4gaXMgYjBya2VuLgorICAgICAgICAgICMgc2VlIGh0dHA6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzcwOTIKKyAgICAgICAgICAjIFRPRE86IHRoaXMgZG9lc24ndCBjb3ZlciBjYXNlcyBsaWtlIC8oYXxeYikvLCBidXQgaXQncworICAgICAgICAgICMgdGhlIG1vc3QgY29tbW9uLCBmb3Igbm93Li4uCisgICAgICAgICAgbmV4dCBpZiBydWxlLmJlZ2lubmluZ19vZl9saW5lICYmICFzdHJlYW0uYmVnaW5uaW5nX29mX2xpbmU/CisKKyAgICAgICAgICBpZiBzaXplID0gc3RyZWFtLnNraXAocnVsZS5yZSkKKyAgICAgICAgICAgIHB1dHMgIiAgICBnb3QgI3tzdHJlYW1bMF0uaW5zcGVjdH0iIGlmIEBkZWJ1ZworCisgICAgICAgICAgICBpbnN0YW5jZV9leGVjKHN0cmVhbSwgJnJ1bGUuY2FsbGJhY2spCisKKyAgICAgICAgICAgIGlmIHNpemUuemVybz8KKyAgICAgICAgICAgICAgQG51bGxfc3RlcHMgKz0gMQorICAgICAgICAgICAgICBpZiBAbnVsbF9zdGVwcyA+IE1BWF9OVUxMX1NDQU5TCisgICAgICAgICAgICAgICAgcHV0cyAiICAgIHRvbyBtYW55IHNjYW5zIHdpdGhvdXQgY29uc3VtaW5nIHRoZSBzdHJpbmchIiBpZiBAZGVidWcKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIEBudWxsX3N0ZXBzID0gMAorICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGZhbHNlCisgICAgZW5kCisKKyAgICAjIFlpZWxkIGEgdG9rZW4uCisgICAgIworICAgICMgQHBhcmFtIHRvaworICAgICMgICB0aGUgdG9rZW4gdHlwZQorICAgICMgQHBhcmFtIHZhbAorICAgICMgICAob3B0aW9uYWwpIHRoZSBzdHJpbmcgdmFsdWUgdG8geWllbGQuICBJZiBhYnNlbnQsIHRoaXMgZGVmYXVsdHMKKyAgICAjICAgdG8gdGhlIGVudGlyZSBsYXN0IG1hdGNoLgorICAgIGRlZiB0b2tlbih0b2ssIHZhbD1AY3VycmVudF9zdHJlYW1bMF0pCisgICAgICB5aWVsZF90b2tlbih0b2ssIHZhbCkKKyAgICBlbmQKKworICAgICMgQGRlcHJlY2F0ZWQKKyAgICAjCisgICAgIyBZaWVsZCBhIHRva2VuIHdpdGggdGhlIG5leHQgbWF0Y2hlZCBncm91cC4gIFN1YnNlcXVlbnQgY2FsbHMKKyAgICAjIHRvIHRoaXMgbWV0aG9kIHdpbGwgeWllbGQgc3Vic2VxdWVudCBncm91cHMuCisgICAgZGVmIGdyb3VwKHRvaykKKyAgICAgIHJhaXNlICJSZWdleExleGVyI2dyb3VwIGlzIGRlcHJlY2F0ZWQ6IHVzZSAjZ3JvdXBzIGluc3RlYWQiCisgICAgZW5kCisKKyAgICAjIFlpZWxkIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXRjaGVkIGdyb3VwcyBvZiB0aGUgY3VycmVudAorICAgICMgbWF0Y2guCisgICAgZGVmIGdyb3VwcygqdG9rZW5zKQorICAgICAgdG9rZW5zLmVhY2hfd2l0aF9pbmRleCBkbyB8dG9rLCBpfAorICAgICAgICB5aWVsZF90b2tlbih0b2ssIEBjdXJyZW50X3N0cmVhbVtpKzFdKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIERlbGVnYXRlIHRoZSBsZXggdG8gYW5vdGhlciBsZXhlci4gIFRoZSAjbGV4IG1ldGhvZCB3aWxsIGJlIGNhbGxlZAorICAgICMgd2l0aCBgOmNvbnRpbnVlYCBzZXQgdG8gdHJ1ZSwgc28gdGhhdCAjcmVzZXQhIHdpbGwgbm90IGJlIGNhbGxlZC4KKyAgICAjIEluIHRoaXMgd2F5LCBhIHNpbmdsZSBsZXhlciBjYW4gYmUgcmVwZWF0ZWRseSBkZWxlZ2F0ZWQgdG8gd2hpbGUKKyAgICAjIG1haW50YWluaW5nIGl0cyBvd24gaW50ZXJuYWwgc3RhdGUgc3RhY2suCisgICAgIworICAgICMgQHBhcmFtIFsjbGV4XSBsZXhlcgorICAgICMgICBUaGUgbGV4ZXIgb3IgbGV4ZXIgY2xhc3MgdG8gZGVsZWdhdGUgdG8KKyAgICAjIEBwYXJhbSBbU3RyaW5nXSB0ZXh0CisgICAgIyAgIFRoZSB0ZXh0IHRvIGRlbGVnYXRlLiAgVGhpcyBkZWZhdWx0cyB0byB0aGUgbGFzdCBtYXRjaGVkIHN0cmluZy4KKyAgICBkZWYgZGVsZWdhdGUobGV4ZXIsIHRleHQ9bmlsKQorICAgICAgcHV0cyAiICAgIGRlbGVnYXRpbmcgdG8gI3tsZXhlci5pbnNwZWN0fSIgaWYgQGRlYnVnCisgICAgICB0ZXh0IHx8PSBAY3VycmVudF9zdHJlYW1bMF0KKworICAgICAgbGV4ZXIubGV4KHRleHQsIDpjb250aW51ZSA9PiB0cnVlKSBkbyB8dG9rLCB2YWx8CisgICAgICAgIHB1dHMgIiAgICBkZWxlZ2F0ZWQgdG9rZW46ICN7dG9rLmluc3BlY3R9LCAje3ZhbC5pbnNwZWN0fSIgaWYgQGRlYnVnCisgICAgICAgIHlpZWxkX3Rva2VuKHRvaywgdmFsKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVjdXJzZSh0ZXh0PW5pbCkKKyAgICAgIGRlbGVnYXRlKHNlbGYuY2xhc3MsIHRleHQpCisgICAgZW5kCisKKyAgICAjIFB1c2ggYSBzdGF0ZSBvbnRvIHRoZSBzdGFjay4gIElmIG5vIHN0YXRlIG5hbWUgaXMgZ2l2ZW4gYW5kIHlvdSd2ZQorICAgICMgcGFzc2VkIGEgYmxvY2ssIGEgc3RhdGUgd2lsbCBiZSBkeW5hbWljYWxseSBjcmVhdGVkIHVzaW5nIHRoZQorICAgICMge1N0YXRlRFNMfS4KKyAgICBkZWYgcHVzaChzdGF0ZV9uYW1lPW5pbCwgJmIpCisgICAgICBwdXNoX3N0YXRlID0gaWYgc3RhdGVfbmFtZQorICAgICAgICBnZXRfc3RhdGUoc3RhdGVfbmFtZSkKKyAgICAgIGVsc2lmIGJsb2NrX2dpdmVuPworICAgICAgICBTdGF0ZURTTC5uZXcoYi5pbnNwZWN0LCAmYikudG9fc3RhdGUoc2VsZi5jbGFzcykKKyAgICAgIGVsc2UKKyAgICAgICAgIyB1c2UgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYnkgZGVmYXVsdAorICAgICAgICBzZWxmLnN0YXRlCisgICAgICBlbmQKKworICAgICAgcHV0cyAiICAgIHB1c2hpbmcgI3twdXNoX3N0YXRlLm5hbWV9IiBpZiBAZGVidWcKKyAgICAgIHN0YWNrLnB1c2gocHVzaF9zdGF0ZSkKKyAgICBlbmQKKworICAgICMgUG9wIHRoZSBzdGF0ZSBzdGFjay4gIElmIGEgbnVtYmVyIGlzIHBhc3NlZCBpbiwgaXQgd2lsbCBiZSBwb3BwZWQKKyAgICAjIHRoYXQgbnVtYmVyIG9mIHRpbWVzLgorICAgIGRlZiBwb3AhKHRpbWVzPTEpCisgICAgICByYWlzZSAnZW1wdHkgc3RhY2shJyBpZiBzdGFjay5lbXB0eT8KKworICAgICAgcHV0cyAiICAgIHBvcHBpbmcgc3RhY2s6ICN7dGltZXN9IiBpZiBAZGVidWcKKworICAgICAgc3RhY2sucG9wKHRpbWVzKQorCisgICAgICBuaWwKKyAgICBlbmQKKworICAgICMgcmVwbGFjZSB0aGUgaGVhZCBvZiB0aGUgc3RhY2sgd2l0aCB0aGUgZ2l2ZW4gc3RhdGUKKyAgICBkZWYgZ290byhzdGF0ZV9uYW1lKQorICAgICAgcmFpc2UgJ2VtcHR5IHN0YWNrIScgaWYgc3RhY2suZW1wdHk/CisKKyAgICAgIHB1dHMgIiAgICBnb2luZyB0byBzdGF0ZSAje3N0YXRlX25hbWV9ICIgaWYgQGRlYnVnCisgICAgICBzdGFja1stMV0gPSBnZXRfc3RhdGUoc3RhdGVfbmFtZSkKKyAgICBlbmQKKworICAgICMgcmVzZXQgdGhlIHN0YWNrIGJhY2sgdG8gYFs6cm9vdF1gLgorICAgIGRlZiByZXNldF9zdGFjaworICAgICAgcHV0cyAnICAgIHJlc2V0dGluZyBzdGFjaycgaWYgQGRlYnVnCisgICAgICBzdGFjay5jbGVhcgorICAgICAgc3RhY2sucHVzaCBnZXRfc3RhdGUoOnJvb3QpCisgICAgZW5kCisKKyAgICAjIENoZWNrIGlmIGBzdGF0ZV9uYW1lYCBpcyBpbiB0aGUgc3RhdGUgc3RhY2suCisgICAgZGVmIGluX3N0YXRlPyhzdGF0ZV9uYW1lKQorICAgICAgc3RhdGVfbmFtZSA9IHN0YXRlX25hbWUudG9fcworICAgICAgc3RhY2suYW55PyBkbyB8c3RhdGV8CisgICAgICAgIHN0YXRlLm5hbWUgPT0gc3RhdGVfbmFtZS50b19zCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQ2hlY2sgaWYgYHN0YXRlX25hbWVgIGlzIHRoZSBzdGF0ZSBvbiB0b3Agb2YgdGhlIHN0YXRlIHN0YWNrLgorICAgIGRlZiBzdGF0ZT8oc3RhdGVfbmFtZSkKKyAgICAgIHN0YXRlX25hbWUudG9fcyA9PSBzdGF0ZS5uYW1lCisgICAgZW5kCisKKyAgcHJpdmF0ZQorICAgIGRlZiB5aWVsZF90b2tlbih0b2ssIHZhbCkKKyAgICAgIHJldHVybiBpZiB2YWwubmlsPyB8fCB2YWwuZW1wdHk/CisgICAgICBwdXRzICIgICAgeWllbGRpbmcgI3t0b2sucXVhbG5hbWV9LCAje3ZhbC5pbnNwZWN0fSIgaWYgQGRlYnVnCisgICAgICBAb3V0cHV0X3N0cmVhbS55aWVsZCh0b2ssIHZhbCkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGVtcGxhdGVfbGV4ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RlbXBsYXRlX2xleGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjY5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RlbXBsYXRlX2xleGVyLnJiCkBAIC0wLDAgKzEsMjIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgICMgQGFic3RyYWN0CisgICMgQSBUZW1wbGF0ZUxleGVyIGlzIG9uZSB0aGF0IGFjY2VwdHMgYSA6cGFyZW50IG9wdGlvbiwgdG8gc3BlY2lmeQorICAjIHdoaWNoIGxhbmd1YWdlIGlzIGJlaW5nIHRlbXBsYXRlZC4gIFRoZSBsZXhlciBjbGFzcyBjYW4gc3BlY2lmeSBpdHMKKyAgIyBvd24gZGVmYXVsdCBmb3IgdGhlIHBhcmVudCBsZXhlciwgd2hpY2ggaXMgb3RoZXJ3aXNlIGRlZmF1bHRlZCB0bworICAjIEhUTUwuCisgIGNsYXNzIFRlbXBsYXRlTGV4ZXIgPCBSZWdleExleGVyCisgICAgIyB0aGUgcGFyZW50IGxleGVyIC0gdGhlIG9uZSBiZWluZyB0ZW1wbGF0ZWQuCisgICAgZGVmIHBhcmVudAorICAgICAgcmV0dXJuIEBwYXJlbnQgaWYgaW5zdGFuY2VfdmFyaWFibGVfZGVmaW5lZD8gOkBwYXJlbnQKKyAgICAgIEBwYXJlbnQgPSBvcHRpb24oOnBhcmVudCkgfHwgJ2h0bWwnCisgICAgICBpZiBAcGFyZW50LmlzX2E/IDo6U3RyaW5nCisgICAgICAgIGxleGVyX2NsYXNzID0gTGV4ZXIuZmluZChAcGFyZW50KQorICAgICAgICBAcGFyZW50ID0gbGV4ZXJfY2xhc3MubmV3KHNlbGYub3B0aW9ucykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgc3RhcnQgeyBwYXJlbnQucmVzZXQhIH0KKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGV4dF9hbmFseXplci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGV4dF9hbmFseXplci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQzNGQzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90ZXh0X2FuYWx5emVyLnJiCkBAIC0wLDAgKzEsNDggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIGNsYXNzIFRleHRBbmFseXplciA8IFN0cmluZworICAgICMgRmluZCBhIHNoZWJhbmcuICBSZXR1cm5zIG5pbCBpZiBubyBzaGViYW5nIGlzIHByZXNlbnQuCisgICAgZGVmIHNoZWJhbmcKKyAgICAgIHJldHVybiBAc2hlYmFuZyBpZiBpbnN0YW5jZV92YXJpYWJsZV9kZWZpbmVkPyA6QHNoZWJhbmcKKworICAgICAgc2VsZiA9fiAvXEFccyojISguKikkLworICAgICAgQHNoZWJhbmcgPSAkMQorICAgIGVuZAorCisgICAgIyBDaGVjayBpZiB0aGUgZ2l2ZW4gc2hlYmFuZyBpcyBwcmVzZW50LgorICAgICMKKyAgICAjIFRoaXMgbm9ybWFsaXplcyB0aGluZ3Mgc28gdGhhdCBgdGV4dC5zaGViYW5nPygnYmFzaCcpYCB3aWxsIGRldGVjdAorICAgICMgYCMhL2Jhc2hgLCAnIyEvYmluL2Jhc2gnLCAnIyEvdXNyL2Jpbi9lbnYgYmFzaCcsIGFuZCAnIyEvYmluL2Jhc2ggLXgnCisgICAgZGVmIHNoZWJhbmc/KG1hdGNoKQorICAgICAgbWF0Y2ggPSAvXGIje21hdGNofShcc3wkKS8KKyAgICAgIG1hdGNoID09PSBzaGViYW5nCisgICAgZW5kCisKKyAgICAjIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGRvY3R5cGUgdGFnIGlmIHByZXNlbnQsIG5pbCBvdGhlcndpc2UuCisgICAgZGVmIGRvY3R5cGUKKyAgICAgIHJldHVybiBAZG9jdHlwZSBpZiBpbnN0YW5jZV92YXJpYWJsZV9kZWZpbmVkPyA6QGRvY3R5cGUKKworICAgICAgc2VsZiA9fiAlcihcQVxzKgorICAgICAgICAoPzo8XD8uKj9cPz5ccyopPyAjIHBvc3NpYmxlIDw/eG1sLi4uPz4gdGFnCisgICAgICAgIDwhRE9DVFlQRVxzKyguKz8pPgorICAgICAgKXhtCisgICAgICBAZG9jdHlwZSA9ICQxCisgICAgZW5kCisKKyAgICAjIENoZWNrIGlmIHRoZSBkb2N0eXBlIG1hdGNoZXMgYSBnaXZlbiByZWdleHAgb3Igc3RyaW5nCisgICAgZGVmIGRvY3R5cGU/KHR5cGU9Ly8pCisgICAgICB0eXBlID09PSBkb2N0eXBlCisgICAgZW5kCisKKyAgICAjIFJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQgb2YgbGV4aW5nIHdpdGggdGhlIGdpdmVuIGxleGVyIGNvbnRhaW5zIG5vCisgICAgIyBlcnJvciB0b2tlbnMuCisgICAgZGVmIGxleGVzX2NsZWFubHk/KGxleGVyKQorICAgICAgbGV4ZXIubGV4KHNlbGYpIGRvIHwodG9rLCBfKXwKKyAgICAgICAgcmV0dXJuIGZhbHNlIGlmIHRvay5uYW1lID09ICdFcnJvcicKKyAgICAgIGVuZAorCisgICAgICB0cnVlCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQyZGRmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZS5yYgpAQCAtMCwwICsxLDE5NSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgY2xhc3MgVGhlbWUKKyAgICBpbmNsdWRlIFRva2VuOjpUb2tlbnMKKworICAgIGNsYXNzIFN0eWxlIDwgSGFzaAorICAgICAgZGVmIGluaXRpYWxpemUodGhlbWUsIGhzaD17fSkKKyAgICAgICAgc3VwZXIoKQorICAgICAgICBAdGhlbWUgPSB0aGVtZQorICAgICAgICBtZXJnZSEoaHNoKQorICAgICAgZW5kCisKKyAgICAgIFs6ZmcsIDpiZ10uZWFjaCBkbyB8bW9kZXwKKyAgICAgICAgZGVmaW5lX21ldGhvZCBtb2RlIGRvCisgICAgICAgICAgcmV0dXJuIHNlbGZbbW9kZV0gdW5sZXNzIEB0aGVtZQorICAgICAgICAgIEB0aGVtZS5wYWxldHRlKHNlbGZbbW9kZV0pIGlmIHNlbGZbbW9kZV0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcihzZWxlY3RvciwgJmIpCisgICAgICAgIHJldHVybiBlbnVtX2Zvcig6cmVuZGVyLCBzZWxlY3RvcikudG9fYS5qb2luKCJcbiIpIHVubGVzcyBiCisKKyAgICAgICAgcmV0dXJuIGlmIGVtcHR5PworCisgICAgICAgIHlpZWxkICIje3NlbGVjdG9yfSB7IgorICAgICAgICByZW5kZXJlZF9ydWxlcy5lYWNoIGRvIHxydWxlfAorICAgICAgICAgIHlpZWxkICIgICN7cnVsZX07IgorICAgICAgICBlbmQKKyAgICAgICAgeWllbGQgIn0iCisgICAgICBlbmQKKworICAgICAgZGVmIHJlbmRlcmVkX3J1bGVzKCZiKQorICAgICAgICByZXR1cm4gZW51bV9mb3IoOnJlbmRlcmVkX3J1bGVzKSB1bmxlc3MgYgorICAgICAgICB5aWVsZCAiY29sb3I6ICN7Zmd9IiBpZiBmZworICAgICAgICB5aWVsZCAiYmFja2dyb3VuZC1jb2xvcjogI3tiZ30iIGlmIGJnCisgICAgICAgIHlpZWxkICJmb250LXdlaWdodDogYm9sZCIgaWYgc2VsZls6Ym9sZF0KKyAgICAgICAgeWllbGQgImZvbnQtc3R5bGU6IGl0YWxpYyIgaWYgc2VsZls6aXRhbGljXQorICAgICAgICB5aWVsZCAidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUiIGlmIHNlbGZbOnVuZGVybGluZV0KKworICAgICAgICAoc2VsZls6cnVsZXNdIHx8IFtdKS5lYWNoKCZiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc3R5bGVzCisgICAgICBAc3R5bGVzIHx8PSBzZWxmLmNsYXNzLnN0eWxlcy5kdXAKKyAgICBlbmQKKworICAgIEBwYWxldHRlID0ge30KKyAgICBkZWYgc2VsZi5wYWxldHRlKGFyZz17fSkKKyAgICAgIEBwYWxldHRlIHx8PSBJbmhlcml0YWJsZUhhc2gubmV3KHN1cGVyY2xhc3MucGFsZXR0ZSkKKworICAgICAgaWYgYXJnLmlzX2E/IEhhc2gKKyAgICAgICAgQHBhbGV0dGUubWVyZ2UhIGFyZworICAgICAgICBAcGFsZXR0ZQorICAgICAgZWxzZQorICAgICAgICBjYXNlIGFyZworICAgICAgICB3aGVuIC8jWzAtOWEtZl0rL2kKKyAgICAgICAgICBhcmcKKyAgICAgICAgZWxzZQorICAgICAgICAgIEBwYWxldHRlW2FyZ10gb3IgcmFpc2UgIm5vdCBpbiBwYWxldHRlOiAje2FyZy5pbnNwZWN0fSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBwYWxldHRlKCphKSBzZWxmLmNsYXNzLnBhbGV0dGUoKmEpIGVuZAorCisgICAgQHN0eWxlcyA9IHt9CisgICAgZGVmIHNlbGYuc3R5bGVzCisgICAgICBAc3R5bGVzIHx8PSBJbmhlcml0YWJsZUhhc2gubmV3KHN1cGVyY2xhc3Muc3R5bGVzKQorICAgIGVuZAorCisgICAgZGVmIHNlbGYucmVuZGVyKG9wdHM9e30sICZiKQorICAgICAgbmV3KG9wdHMpLnJlbmRlcigmYikKKyAgICBlbmQKKworICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgIGRlZiBzdHlsZSgqdG9rZW5zKQorICAgICAgICBzdHlsZSA9IHRva2Vucy5sYXN0LmlzX2E/KEhhc2gpID8gdG9rZW5zLnBvcCA6IHt9CisKKyAgICAgICAgdG9rZW5zLmVhY2ggZG8gfHRva3wKKyAgICAgICAgICBzdHlsZXNbdG9rXSA9IHN0eWxlCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBnZXRfb3duX3N0eWxlKHRva2VuKQorICAgICAgICB0b2tlbi50b2tlbl9jaGFpbi5yZXZlcnNlX2VhY2ggZG8gfGFuY3wKKyAgICAgICAgICByZXR1cm4gU3R5bGUubmV3KHNlbGYsIHN0eWxlc1thbmNdKSBpZiBzdHlsZXNbYW5jXQorICAgICAgICBlbmQKKworICAgICAgICBuaWwKKyAgICAgIGVuZAorCisgICAgICBkZWYgZ2V0X3N0eWxlKHRva2VuKQorICAgICAgICBnZXRfb3duX3N0eWxlKHRva2VuKSB8fCBiYXNlX3N0eWxlCisgICAgICBlbmQKKworICAgICAgZGVmIGJhc2Vfc3R5bGUKKyAgICAgICAgZ2V0X293bl9zdHlsZShUb2tlbjo6VG9rZW5zOjpUZXh0KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBuYW1lKG49bmlsKQorICAgICAgICByZXR1cm4gQG5hbWUgaWYgbi5uaWw/CisKKyAgICAgICAgQG5hbWUgPSBuLnRvX3MKKyAgICAgICAgVGhlbWUucmVnaXN0cnlbQG5hbWVdID0gc2VsZgorICAgICAgZW5kCisKKyAgICAgIGRlZiBmaW5kKG4pCisgICAgICAgIHJlZ2lzdHJ5W24udG9fc10KKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVnaXN0cnkKKyAgICAgICAgQHJlZ2lzdHJ5IHx8PSB7fQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIG1vZHVsZSBIYXNNb2RlcworICAgIGRlZiBtb2RlKGFyZz06YWJzZW50KQorICAgICAgcmV0dXJuIEBtb2RlIGlmIGFyZyA9PSA6YWJzZW50CisKKyAgICAgIEBtb2RlcyB8fD0ge30KKyAgICAgIEBtb2Rlc1thcmddIHx8PSBnZXRfbW9kZShhcmcpCisgICAgZW5kCisKKyAgICBkZWYgZ2V0X21vZGUobW9kZSkKKyAgICAgIHJldHVybiBzZWxmIGlmIHNlbGYubW9kZSA9PSBtb2RlCisKKyAgICAgIG5ld19uYW1lID0gIiN7c2VsZi5uYW1lfS4je21vZGV9IgorICAgICAgQ2xhc3MubmV3KHNlbGYpIHsgbmFtZShuZXdfbmFtZSk7IG1vZGUhKG1vZGUpIH0KKyAgICBlbmQKKworICAgIGRlZiBtb2RlIShhcmcpCisgICAgICBAbW9kZSA9IGFyZworICAgICAgc2VuZCgibWFrZV8je2FyZ30hIikKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgQ1NTVGhlbWUgPCBUaGVtZQorICAgIGRlZiBpbml0aWFsaXplKG9wdHM9e30pCisgICAgICBAc2NvcGUgPSBvcHRzWzpzY29wZV0gfHwgJy5oaWdobGlnaHQnCisgICAgZW5kCisKKyAgICBkZWYgcmVuZGVyKCZiKQorICAgICAgcmV0dXJuIGVudW1fZm9yKDpyZW5kZXIpLnRvX2Euam9pbigiXG4iKSB1bmxlc3MgYgorCisgICAgICAjIHNoYXJlZCBzdHlsZXMgZm9yIHRhYmxlaXplZCBsaW5lIG51bWJlcnMKKyAgICAgIHlpZWxkICIje0BzY29wZX0gdGFibGUgdGQgeyBwYWRkaW5nOiA1cHg7IH0iCisgICAgICB5aWVsZCAiI3tAc2NvcGV9IHRhYmxlIHByZSB7IG1hcmdpbjogMDsgfSIKKworICAgICAgc3R5bGVzLmVhY2ggZG8gfHRvaywgc3R5bGV8CisgICAgICAgIFN0eWxlLm5ldyhzZWxmLCBzdHlsZSkucmVuZGVyKGNzc19zZWxlY3Rvcih0b2spLCAmYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlbmRlcl9iYXNlKHNlbGVjdG9yLCAmYikKKyAgICAgIHNlbGYuY2xhc3MuYmFzZV9zdHlsZS5yZW5kZXIoc2VsZWN0b3IsICZiKQorICAgIGVuZAorCisgICAgZGVmIHN0eWxlX2Zvcih0b2spCisgICAgICBzZWxmLmNsYXNzLmdldF9zdHlsZSh0b2spCisgICAgZW5kCisKKyAgcHJpdmF0ZQorICAgIGRlZiBjc3Nfc2VsZWN0b3IodG9rZW4pCisgICAgICBpbmZsYXRlX3Rva2VuKHRva2VuKS5tYXAgZG8gfHRva3wKKyAgICAgICAgcmFpc2UgInVua25vd24gdG9rZW46ICN7dG9rLmluc3BlY3R9IiBpZiB0b2suc2hvcnRuYW1lLm5pbD8KKworICAgICAgICBzaW5nbGVfY3NzX3NlbGVjdG9yKHRvaykKKyAgICAgIGVuZC5qb2luKCcsICcpCisgICAgZW5kCisKKyAgICBkZWYgc2luZ2xlX2Nzc19zZWxlY3Rvcih0b2tlbikKKyAgICAgIHJldHVybiBAc2NvcGUgaWYgdG9rZW4gPT0gVGV4dAorCisgICAgICAiI3tAc2NvcGV9IC4je3Rva2VuLnNob3J0bmFtZX0iCisgICAgZW5kCisKKyAgICAjIHlpZWxkIGFsbCBvZiB0aGUgdG9rZW5zIHRoYXQgc2hvdWxkIGJlIHN0eWxlZCB0aGUgc2FtZQorICAgICMgYXMgdGhlIGdpdmVuIHRva2VuLiAgRXNzZW50aWFsbHkgdGhpcyByZWN1cnNpdmVseSBhbGwgb2YKKyAgICAjIHRoZSBzdWJ0b2tlbnMsIGV4Y2VwdCB0aG9zZSB3aGljaCBhcmUgbW9yZSBzcGVjaWZpY2FsbHkKKyAgICAjIHN0eWxlZC4KKyAgICBkZWYgaW5mbGF0ZV90b2tlbih0b2ssICZiKQorICAgICAgcmV0dXJuIGVudW1fZm9yKDppbmZsYXRlX3Rva2VuLCB0b2spIHVubGVzcyBibG9ja19naXZlbj8KKworICAgICAgeWllbGQgdG9rCisgICAgICB0b2suc3ViX3Rva2Vucy5lYWNoIGRvIHwoXywgc3QpfAorICAgICAgICBuZXh0IGlmIHN0eWxlc1tzdF0KKworICAgICAgICBpbmZsYXRlX3Rva2VuKHN0LCAmYikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZXMvYmFzZTE2LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZXMvYmFzZTE2LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZWExYzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9iYXNlMTYucmIKQEAgLTAsMCArMSwxMzAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBUaGVtZXMKKyAgICAjIGRlZmF1bHQgYmFzZTE2IHRoZW1lCisgICAgIyBieSBDaHJpcyBLZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSkKKyAgICBjbGFzcyBCYXNlMTYgPCBDU1NUaGVtZQorICAgICAgbmFtZSAnYmFzZTE2JworCisgICAgICBwYWxldHRlIGJhc2UwMDogIiMxNTE1MTUiCisgICAgICBwYWxldHRlIGJhc2UwMTogIiMyMDIwMjAiCisgICAgICBwYWxldHRlIGJhc2UwMjogIiMzMDMwMzAiCisgICAgICBwYWxldHRlIGJhc2UwMzogIiM1MDUwNTAiCisgICAgICBwYWxldHRlIGJhc2UwNDogIiNiMGIwYjAiCisgICAgICBwYWxldHRlIGJhc2UwNTogIiNkMGQwZDAiCisgICAgICBwYWxldHRlIGJhc2UwNjogIiNlMGUwZTAiCisgICAgICBwYWxldHRlIGJhc2UwNzogIiNmNWY1ZjUiCisgICAgICBwYWxldHRlIGJhc2UwODogIiNhYzQxNDIiCisgICAgICBwYWxldHRlIGJhc2UwOTogIiNkMjg0NDUiCisgICAgICBwYWxldHRlIGJhc2UwQTogIiNmNGJmNzUiCisgICAgICBwYWxldHRlIGJhc2UwQjogIiM5MGE5NTkiCisgICAgICBwYWxldHRlIGJhc2UwQzogIiM3NWI1YWEiCisgICAgICBwYWxldHRlIGJhc2UwRDogIiM2YTlmYjUiCisgICAgICBwYWxldHRlIGJhc2UwRTogIiNhYTc1OWYiCisgICAgICBwYWxldHRlIGJhc2UwRjogIiM4ZjU1MzYiCisKKyAgICAgIGV4dGVuZCBIYXNNb2RlcworCisgICAgICBkZWYgc2VsZi5saWdodCEKKyAgICAgICAgbW9kZSA6ZGFyayAjIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgYSBkYXJrIHZhcmlhbnQKKyAgICAgICAgbW9kZSEgOmxpZ2h0CisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuZGFyayEKKyAgICAgICAgbW9kZSA6bGlnaHQgIyBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIGEgbGlnaHQgdmFyaWFudAorICAgICAgICBtb2RlISA6ZGFyaworICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLm1ha2VfZGFyayEKKyAgICAgICAgc3R5bGUgVGV4dCwgOmZnID0+IDpiYXNlMDUsIDpiZyA9PiA6YmFzZTAwCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYubWFrZV9saWdodCEKKyAgICAgICAgc3R5bGUgVGV4dCwgOmZnID0+IDpiYXNlMDIKKyAgICAgIGVuZAorCisgICAgICBsaWdodCEKKworICAgICAgc3R5bGUgRXJyb3IsIDpmZyA9PiA6YmFzZTAwLCA6YmcgPT4gOmJhc2UwOAorICAgICAgc3R5bGUgQ29tbWVudCwgOmZnID0+IDpiYXNlMDMKKworICAgICAgc3R5bGUgQ29tbWVudDo6UHJlcHJvYywKKyAgICAgICAgICAgIE5hbWU6OlRhZywgOmZnID0+IDpiYXNlMEEKKworICAgICAgc3R5bGUgT3BlcmF0b3IsCisgICAgICAgICAgICBQdW5jdHVhdGlvbiwgOmZnID0+IDpiYXNlMDUKKworICAgICAgc3R5bGUgR2VuZXJpYzo6SW5zZXJ0ZWQsIDpmZyA9PiA6YmFzZTBCCisgICAgICBzdHlsZSBHZW5lcmljOjpEZWxldGVkLCA6ZmcgPT4gOmJhc2UwOAorICAgICAgc3R5bGUgR2VuZXJpYzo6SGVhZGluZywgOmZnID0+IDpiYXNlMEQsIDpiZyA9PiA6YmFzZTAwLCA6Ym9sZCA9PiB0cnVlCisKKyAgICAgIHN0eWxlIEtleXdvcmQsIDpmZyA9PiA6YmFzZTBFCisgICAgICBzdHlsZSBLZXl3b3JkOjpDb25zdGFudCwKKyAgICAgICAgICAgIEtleXdvcmQ6OlR5cGUsIDpmZyA9PiA6YmFzZTA5CisKKyAgICAgIHN0eWxlIEtleXdvcmQ6OkRlY2xhcmF0aW9uLCA6ZmcgPT4gOmJhc2UwOQorCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmcsIDpmZyA9PiA6YmFzZTBCCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OlJlZ2V4LCA6ZmcgPT4gOmJhc2UwQworCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OkludGVycG9sLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpFc2NhcGUsIDpmZyA9PiA6YmFzZTBGCisKKyAgICAgIHN0eWxlIE5hbWU6Ok5hbWVzcGFjZSwKKyAgICAgICAgICAgIE5hbWU6OkNsYXNzLAorICAgICAgICAgICAgTmFtZTo6Q29uc3RhbnQsIDpmZyA9PiA6YmFzZTBBCisKKyAgICAgIHN0eWxlIE5hbWU6OkF0dHJpYnV0ZSwgOmZnID0+IDpiYXNlMEQKKworICAgICAgc3R5bGUgTGl0ZXJhbDo6TnVtYmVyLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpTeW1ib2wsIDpmZyA9PiA6YmFzZTBCCisKKyAgICAgIGNsYXNzIFNvbGFyaXplZCA8IEJhc2UxNgorICAgICAgICBuYW1lICdiYXNlMTYuc29sYXJpemVkJworICAgICAgICBsaWdodCEKKyAgICAgICAgIyBhdXRob3IgIkV0aGFuIFNjaG9vbm92ZXIgKGh0dHA6Ly9ldGhhbnNjaG9vbm92ZXIuY29tL3NvbGFyaXplZCkiCisKKyAgICAgICAgcGFsZXR0ZSBiYXNlMDA6ICIjMDAyYjM2IgorICAgICAgICBwYWxldHRlIGJhc2UwMTogIiMwNzM2NDIiCisgICAgICAgIHBhbGV0dGUgYmFzZTAyOiAiIzU4NmU3NSIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMDM6ICIjNjU3YjgzIgorICAgICAgICBwYWxldHRlIGJhc2UwNDogIiM4Mzk0OTYiCisgICAgICAgIHBhbGV0dGUgYmFzZTA1OiAiIzkzYTFhMSIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMDY6ICIjZWVlOGQ1IgorICAgICAgICBwYWxldHRlIGJhc2UwNzogIiNmZGY2ZTMiCisgICAgICAgIHBhbGV0dGUgYmFzZTA4OiAiI2RjMzIyZiIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMDk6ICIjY2I0YjE2IgorICAgICAgICBwYWxldHRlIGJhc2UwQTogIiNiNTg5MDAiCisgICAgICAgIHBhbGV0dGUgYmFzZTBCOiAiIzg1OTkwMCIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMEM6ICIjMmFhMTk4IgorICAgICAgICBwYWxldHRlIGJhc2UwRDogIiMyNjhiZDIiCisgICAgICAgIHBhbGV0dGUgYmFzZTBFOiAiIzZjNzFjNCIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMEY6ICIjZDMzNjgyIgorICAgICAgZW5kCisKKyAgICAgIGNsYXNzIE1vbm9rYWkgPCBCYXNlMTYKKyAgICAgICAgbmFtZSAnYmFzZTE2Lm1vbm9rYWknCisgICAgICAgIGRhcmshCisKKyAgICAgICAgIyBhdXRob3IgIldpbWVyIEhhemVuYmVyZyAoaHR0cDovL3d3dy5tb25va2FpLm5sKSIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMDA6ICIjMjcyODIyIgorICAgICAgICBwYWxldHRlIGJhc2UwMTogIiMzODM4MzAiCisgICAgICAgIHBhbGV0dGUgYmFzZTAyOiAiIzQ5NDgzZSIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMDM6ICIjNzU3MTVlIgorICAgICAgICBwYWxldHRlIGJhc2UwNDogIiNhNTlmODUiCisgICAgICAgIHBhbGV0dGUgYmFzZTA1OiAiI2Y4ZjhmMiIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMDY6ICIjZjVmNGYxIgorICAgICAgICBwYWxldHRlIGJhc2UwNzogIiNmOWY4ZjUiCisgICAgICAgIHBhbGV0dGUgYmFzZTA4OiAiI2Y5MjY3MiIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMDk6ICIjZmQ5NzFmIgorICAgICAgICBwYWxldHRlIGJhc2UwQTogIiNmNGJmNzUiCisgICAgICAgIHBhbGV0dGUgYmFzZTBCOiAiI2E2ZTIyZSIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMEM6ICIjYTFlZmU0IgorICAgICAgICBwYWxldHRlIGJhc2UwRDogIiM2NmQ5ZWYiCisgICAgICAgIHBhbGV0dGUgYmFzZTBFOiAiI2FlODFmZiIKKyAgICAgICAgcGFsZXR0ZSBiYXNlMEY6ICIjY2M2NjMzIgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9jb2xvcmZ1bC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGhlbWVzL2NvbG9yZnVsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMDhmZTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9jb2xvcmZ1bC5yYgpAQCAtMCwwICsxLDY3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgVGhlbWVzCisgICAgIyBzdG9sZW4gZnJvbSBweWdtZW50cworICAgIGNsYXNzIENvbG9yZnVsIDwgQ1NTVGhlbWUKKyAgICAgIG5hbWUgJ2NvbG9yZnVsJworCisgICAgICBzdHlsZSBUZXh0LCAgICAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiAiI2JiYmJiYiIsIDpiZyA9PiAnIzAwMCcKKworICAgICAgc3R5bGUgQ29tbWVudCwgICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gIiM4ODgiCisgICAgICBzdHlsZSBDb21tZW50OjpQcmVwcm9jLCAgICAgICAgICAgIDpmZyA9PiAiIzU3OSIKKyAgICAgIHN0eWxlIENvbW1lbnQ6OlNwZWNpYWwsICAgICAgICAgICAgOmZnID0+ICIjY2MwMDAwIiwgOmJvbGQgPT4gdHJ1ZQorCisgICAgICBzdHlsZSBLZXl3b3JkLCAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiAiIzA4MCIsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIEtleXdvcmQ6OlBzZXVkbywgICAgICAgICAgICAgOmZnID0+ICIjMDM4IgorICAgICAgc3R5bGUgS2V5d29yZDo6VHlwZSwgICAgICAgICAgICAgICA6ZmcgPT4gIiMzMzkiCisKKyAgICAgIHN0eWxlIE9wZXJhdG9yLCAgICAgICAgICAgICAgICAgICAgOmZnID0+ICIjMzMzIgorICAgICAgc3R5bGUgT3BlcmF0b3I6OldvcmQsICAgICAgICAgICAgICA6ZmcgPT4gIiMwMDAiLCA6Ym9sZCA9PiB0cnVlCisKKyAgICAgIHN0eWxlIE5hbWU6OkJ1aWx0aW4sICAgICAgICAgICAgICAgOmZnID0+ICIjMDA3MDIwIgorICAgICAgc3R5bGUgTmFtZTo6RnVuY3Rpb24sICAgICAgICAgICAgICA6ZmcgPT4gIiMwNkIiLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpDbGFzcywgICAgICAgICAgICAgICAgIDpmZyA9PiAiI0IwNiIsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIE5hbWU6Ok5hbWVzcGFjZSwgICAgICAgICAgICAgOmZnID0+ICIjMGU4NGI1IiwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTmFtZTo6RXhjZXB0aW9uLCAgICAgICAgICAgICA6ZmcgPT4gIiNGMDAiLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpWYXJpYWJsZSwgICAgICAgICAgICAgIDpmZyA9PiAiIzk2MyIKKyAgICAgIHN0eWxlIE5hbWU6OlZhcmlhYmxlOjpJbnN0YW5jZSwgICAgOmZnID0+ICIjMzNCIgorICAgICAgc3R5bGUgTmFtZTo6VmFyaWFibGU6OkNsYXNzLCAgICAgICA6ZmcgPT4gIiMzNjkiCisgICAgICBzdHlsZSBOYW1lOjpWYXJpYWJsZTo6R2xvYmFsLCAgICAgIDpmZyA9PiAiI2Q3MCIsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIE5hbWU6OkNvbnN0YW50LCAgICAgICAgICAgICAgOmZnID0+ICIjMDM2IiwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTmFtZTo6TGFiZWwsICAgICAgICAgICAgICAgICA6ZmcgPT4gIiM5NzAiLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpFbnRpdHksICAgICAgICAgICAgICAgIDpmZyA9PiAiIzgwMCIsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIE5hbWU6OkF0dHJpYnV0ZSwgICAgICAgICAgICAgOmZnID0+ICIjMDBDIgorICAgICAgc3R5bGUgTmFtZTo6VGFnLCAgICAgICAgICAgICAgICAgICA6ZmcgPT4gIiMwNzAiCisgICAgICBzdHlsZSBOYW1lOjpEZWNvcmF0b3IsICAgICAgICAgICAgIDpmZyA9PiAiIzU1NSIsIDpib2xkID0+IHRydWUKKworICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nLCAgICAgICAgICAgICA6YmcgPT4gIiNmZmYwZjAiCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OkNoYXIsICAgICAgIDpmZyA9PiAiIzA0RCIKKyAgICAgIHN0eWxlIExpdGVyYWw6OlN0cmluZzo6RG9jLCAgICAgICAgOmZnID0+ICIjRDQyIgorICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nOjpJbnRlcnBvbCwgICA6YmcgPT4gIiNlZWUiCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OkVzY2FwZSwgICAgIDpmZyA9PiAiIzY2NiIsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIExpdGVyYWw6OlN0cmluZzo6UmVnZXgsICAgICAgOmZnID0+ICIjMDAwIiwgOmJnID0+ICIjZmZmMGZmIgorICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nOjpTeW1ib2wsICAgICA6ZmcgPT4gIiNBNjAiCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6Ok90aGVyLCAgICAgIDpmZyA9PiAiI0QyMCIKKworICAgICAgc3R5bGUgTGl0ZXJhbDo6TnVtYmVyLCAgICAgICAgICAgICA6ZmcgPT4gIiM2MEUiLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBMaXRlcmFsOjpOdW1iZXI6OkludGVnZXIsICAgIDpmZyA9PiAiIzAwRCIsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIExpdGVyYWw6Ok51bWJlcjo6RmxvYXQsICAgICAgOmZnID0+ICIjNjBFIiwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTGl0ZXJhbDo6TnVtYmVyOjpIZXgsICAgICAgICA6ZmcgPT4gIiMwNTgiLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBMaXRlcmFsOjpOdW1iZXI6Ok9jdCwgICAgICAgIDpmZyA9PiAiIzQwRSIsIDpib2xkID0+IHRydWUKKworICAgICAgc3R5bGUgR2VuZXJpYzo6SGVhZGluZywgICAgICAgICAgICA6ZmcgPT4gIiMwMDAwODAiLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBHZW5lcmljOjpTdWJoZWFkaW5nLCAgICAgICAgIDpmZyA9PiAiIzgwMDA4MCIsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIEdlbmVyaWM6OkRlbGV0ZWQsICAgICAgICAgICAgOmZnID0+ICIjQTAwMDAwIgorICAgICAgc3R5bGUgR2VuZXJpYzo6SW5zZXJ0ZWQsICAgICAgICAgICA6ZmcgPT4gIiMwMEEwMDAiCisgICAgICBzdHlsZSBHZW5lcmljOjpFcnJvciwgICAgICAgICAgICAgIDpmZyA9PiAiI0ZGMDAwMCIKKyAgICAgIHN0eWxlIEdlbmVyaWM6OkVtcGgsICAgICAgICAgICAgICAgOml0YWxpYyA9PiB0cnVlCisgICAgICBzdHlsZSBHZW5lcmljOjpTdHJvbmcsICAgICAgICAgICAgIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIEdlbmVyaWM6OlByb21wdCwgICAgICAgICAgICAgOmZnID0+ICIjYzY1ZDA5IiwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgR2VuZXJpYzo6T3V0cHV0LCAgICAgICAgICAgICA6ZmcgPT4gIiM4ODgiCisgICAgICBzdHlsZSBHZW5lcmljOjpUcmFjZWJhY2ssICAgICAgICAgIDpmZyA9PiAiIzA0RCIKKworICAgICAgc3R5bGUgRXJyb3IsICAgICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gIiNGMDAiLCA6YmcgPT4gIiNGQUEiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9naXRodWIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9naXRodWIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4NzVhOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGhlbWVzL2dpdGh1Yi5yYgpAQCAtMCwwICsxLDcxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgVGhlbWVzCisgICAgY2xhc3MgR2l0aHViIDwgQ1NTVGhlbWUKKyAgICAgIG5hbWUgJ2dpdGh1YicKKworICAgICAgc3R5bGUgQ29tbWVudDo6TXVsdGlsaW5lLCAgICAgICAgICAgICAgIDpmZyA9PiAnIzk5OTk4OCcsIDppdGFsaWMgPT4gdHJ1ZQorICAgICAgc3R5bGUgQ29tbWVudDo6UHJlcHJvYywgICAgICAgICAgICAgICAgIDpmZyA9PiAnIzk5OTk5OScsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIENvbW1lbnQ6OlNpbmdsZSwgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyM5OTk5ODgnLCA6aXRhbGljID0+IHRydWUKKyAgICAgIHN0eWxlIENvbW1lbnQ6OlNwZWNpYWwsICAgICAgICAgICAgICAgICA6ZmcgPT4gJyM5OTk5OTknLCA6aXRhbGljID0+IHRydWUsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIENvbW1lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyM5OTk5ODgnLCA6aXRhbGljID0+IHRydWUKKyAgICAgIHN0eWxlIEVycm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyNhNjE3MTcnLCA6YmcgPT4gJyNlM2QyZDInCisgICAgICBzdHlsZSBHZW5lcmljOjpEZWxldGVkLCAgICAgICAgICAgICAgICAgOmZnID0+ICcjMDAwMDAwJywgOmJnID0+ICcjZmZkZGRkJworICAgICAgc3R5bGUgR2VuZXJpYzo6RW1waCwgICAgICAgICAgICAgICAgICAgIDpmZyA9PiAnIzAwMDAwMCcsIDppdGFsaWMgPT4gdHJ1ZQorICAgICAgc3R5bGUgR2VuZXJpYzo6RXJyb3IsICAgICAgICAgICAgICAgICAgIDpmZyA9PiAnI2FhMDAwMCcKKyAgICAgIHN0eWxlIEdlbmVyaWM6OkhlYWRpbmcsICAgICAgICAgICAgICAgICA6ZmcgPT4gJyM5OTk5OTknCisgICAgICBzdHlsZSBHZW5lcmljOjpJbnNlcnRlZCwgICAgICAgICAgICAgICAgOmZnID0+ICcjMDAwMDAwJywgOmJnID0+ICcjZGRmZmRkJworICAgICAgc3R5bGUgR2VuZXJpYzo6T3V0cHV0LCAgICAgICAgICAgICAgICAgIDpmZyA9PiAnIzg4ODg4OCcKKyAgICAgIHN0eWxlIEdlbmVyaWM6OlByb21wdCwgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyM1NTU1NTUnCisgICAgICBzdHlsZSBHZW5lcmljOjpTdHJvbmcsICAgICAgICAgICAgICAgICAgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgR2VuZXJpYzo6U3ViaGVhZGluZywgICAgICAgICAgICAgIDpmZyA9PiAnI2FhYWFhYScKKyAgICAgIHN0eWxlIEdlbmVyaWM6OlRyYWNlYmFjaywgICAgICAgICAgICAgICA6ZmcgPT4gJyNhYTAwMDAnCisgICAgICBzdHlsZSBLZXl3b3JkOjpDb25zdGFudCwgICAgICAgICAgICAgICAgOmZnID0+ICcjMDAwMDAwJywgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgS2V5d29yZDo6RGVjbGFyYXRpb24sICAgICAgICAgICAgIDpmZyA9PiAnIzAwMDAwMCcsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIEtleXdvcmQ6Ok5hbWVzcGFjZSwgICAgICAgICAgICAgICA6ZmcgPT4gJyMwMDAwMDAnLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBLZXl3b3JkOjpQc2V1ZG8sICAgICAgICAgICAgICAgICAgOmZnID0+ICcjMDAwMDAwJywgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgS2V5d29yZDo6UmVzZXJ2ZWQsICAgICAgICAgICAgICAgIDpmZyA9PiAnIzAwMDAwMCcsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIEtleXdvcmQ6OlR5cGUsICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyM0NDU1ODgnLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBLZXl3b3JkLCAgICAgICAgICAgICAgICAgICAgICAgICAgOmZnID0+ICcjMDAwMDAwJywgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTGl0ZXJhbDo6TnVtYmVyOjpGbG9hdCwgICAgICAgICAgIDpmZyA9PiAnIzAwOTk5OScKKyAgICAgIHN0eWxlIExpdGVyYWw6Ok51bWJlcjo6SGV4LCAgICAgICAgICAgICA6ZmcgPT4gJyMwMDk5OTknCisgICAgICBzdHlsZSBMaXRlcmFsOjpOdW1iZXI6OkludGVnZXI6OkxvbmcsICAgOmZnID0+ICcjMDA5OTk5JworICAgICAgc3R5bGUgTGl0ZXJhbDo6TnVtYmVyOjpJbnRlZ2VyLCAgICAgICAgIDpmZyA9PiAnIzAwOTk5OScKKyAgICAgIHN0eWxlIExpdGVyYWw6Ok51bWJlcjo6T2N0LCAgICAgICAgICAgICA6ZmcgPT4gJyMwMDk5OTknCisgICAgICBzdHlsZSBMaXRlcmFsOjpOdW1iZXIsICAgICAgICAgICAgICAgICAgOmZnID0+ICcjMDA5OTk5JworICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nOjpCYWNrdGljaywgICAgICAgIDpmZyA9PiAnI2QxNCcKKyAgICAgIHN0eWxlIExpdGVyYWw6OlN0cmluZzo6Q2hhciwgICAgICAgICAgICA6ZmcgPT4gJyNkMTQnCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OkRvYywgICAgICAgICAgICAgOmZnID0+ICcjZDE0JworICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nOjpEb3VibGUsICAgICAgICAgIDpmZyA9PiAnI2QxNCcKKyAgICAgIHN0eWxlIExpdGVyYWw6OlN0cmluZzo6RXNjYXBlLCAgICAgICAgICA6ZmcgPT4gJyNkMTQnCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OkhlcmVkb2MsICAgICAgICAgOmZnID0+ICcjZDE0JworICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nOjpJbnRlcnBvbCwgICAgICAgIDpmZyA9PiAnI2QxNCcKKyAgICAgIHN0eWxlIExpdGVyYWw6OlN0cmluZzo6T3RoZXIsICAgICAgICAgICA6ZmcgPT4gJyNkMTQnCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OlJlZ2V4LCAgICAgICAgICAgOmZnID0+ICcjMDA5OTI2JworICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nOjpTaW5nbGUsICAgICAgICAgIDpmZyA9PiAnI2QxNCcKKyAgICAgIHN0eWxlIExpdGVyYWw6OlN0cmluZzo6U3ltYm9sLCAgICAgICAgICA6ZmcgPT4gJyM5OTAwNzMnCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmcsICAgICAgICAgICAgICAgICAgOmZnID0+ICcjZDE0JworICAgICAgc3R5bGUgTmFtZTo6QXR0cmlidXRlLCAgICAgICAgICAgICAgICAgIDpmZyA9PiAnIzAwODA4MCcKKyAgICAgIHN0eWxlIE5hbWU6OkJ1aWx0aW46OlBzZXVkbywgICAgICAgICAgICA6ZmcgPT4gJyM5OTk5OTknCisgICAgICBzdHlsZSBOYW1lOjpCdWlsdGluLCAgICAgICAgICAgICAgICAgICAgOmZnID0+ICcjMDA4NkIzJworICAgICAgc3R5bGUgTmFtZTo6Q2xhc3MsICAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiAnIzQ0NTU4OCcsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIE5hbWU6OkNvbnN0YW50LCAgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyMwMDgwODAnCisgICAgICBzdHlsZSBOYW1lOjpEZWNvcmF0b3IsICAgICAgICAgICAgICAgICAgOmZnID0+ICcjM2M1ZDVkJywgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTmFtZTo6RW50aXR5LCAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiAnIzgwMDA4MCcKKyAgICAgIHN0eWxlIE5hbWU6OkV4Y2VwdGlvbiwgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyM5OTAwMDAnLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpGdW5jdGlvbiwgICAgICAgICAgICAgICAgICAgOmZnID0+ICcjOTkwMDAwJywgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTmFtZTo6TGFiZWwsICAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiAnIzk5MDAwMCcsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIE5hbWU6Ok5hbWVzcGFjZSwgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyM1NTU1NTUnCisgICAgICBzdHlsZSBOYW1lOjpUYWcsICAgICAgICAgICAgICAgICAgICAgICAgOmZnID0+ICcjMDAwMDgwJworICAgICAgc3R5bGUgTmFtZTo6VmFyaWFibGU6OkNsYXNzLCAgICAgICAgICAgIDpmZyA9PiAnIzAwODA4MCcKKyAgICAgIHN0eWxlIE5hbWU6OlZhcmlhYmxlOjpHbG9iYWwsICAgICAgICAgICA6ZmcgPT4gJyMwMDgwODAnCisgICAgICBzdHlsZSBOYW1lOjpWYXJpYWJsZTo6SW5zdGFuY2UsICAgICAgICAgOmZnID0+ICcjMDA4MDgwJworICAgICAgc3R5bGUgTmFtZTo6VmFyaWFibGUsICAgICAgICAgICAgICAgICAgIDpmZyA9PiAnIzAwODA4MCcKKyAgICAgIHN0eWxlIE9wZXJhdG9yOjpXb3JkLCAgICAgICAgICAgICAgICAgICA6ZmcgPT4gJyMwMDAwMDAnLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBPcGVyYXRvciwgICAgICAgICAgICAgICAgICAgICAgICAgOmZnID0+ICcjMDAwMDAwJywgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgVGV4dDo6V2hpdGVzcGFjZSwgICAgICAgICAgICAgICAgIDpmZyA9PiAnI2JiYmJiYicKKyAgICAgIHN0eWxlIFRleHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6YmcgPT4gJyNmOGY4ZjgnCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9ncnV2Ym94LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZXMvZ3J1dmJveC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzA4MDNkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZXMvZ3J1dmJveC5yYgpAQCAtMCwwICsxLDE2NyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCisjIFRPRE8gaG93IGFyZSB3ZSBnb2luZyB0byBoYW5kbGUgc29mdC9oYXJkIGNvbnRyYXN0PworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIFRoZW1lcworICAgICMgQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vcmhldHovZ3J1dmJveCwgd2l0aCBoZWxwIGZyb20KKyAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZleWFyd29vZC9ncnV2Ym94LXB5Z21lbnRzCisgICAgY2xhc3MgR3J1dmJveCA8IENTU1RoZW1lCisgICAgICBuYW1lICdncnV2Ym94JworCisgICAgICAjIGdsb2JhbCBHcnV2Ym94IGNvbG91cnMge3t7CisgICAgICBDX2RhcmswX2hhcmQgPSAnIzFkMjAyMScKKyAgICAgIENfZGFyazAgPScjMjgyODI4JworICAgICAgQ19kYXJrMF9zb2Z0ID0gJyMzMjMwMmYnCisgICAgICBDX2RhcmsxID0gJyMzYzM4MzYnCisgICAgICBDX2RhcmsyID0gJyM1MDQ5NDUnCisgICAgICBDX2RhcmszID0gJyM2NjVjNTQnCisgICAgICBDX2Rhcms0ID0gJyM3YzZmNjQnCisgICAgICBDX2Rhcms0XzI1NiA9ICcjN2M2ZjY0JworCisgICAgICBDX2dyYXlfMjQ1ID0gJyM5MjgzNzQnCisgICAgICBDX2dyYXlfMjQ0ID0gJyM5MjgzNzQnCisKKyAgICAgIENfbGlnaHQwX2hhcmQgPSAnI2Y5ZjVkNycKKyAgICAgIENfbGlnaHQwID0gJyNmYmYxYzcnCisgICAgICBDX2xpZ2h0MF9zb2Z0ID0gJyNmMmU1YmMnCisgICAgICBDX2xpZ2h0MSA9ICcjZWJkYmIyJworICAgICAgQ19saWdodDIgPSAnI2Q1YzRhMScKKyAgICAgIENfbGlnaHQzID0gJyNiZGFlOTMnCisgICAgICBDX2xpZ2h0NCA9ICcjYTg5OTg0JworICAgICAgQ19saWdodDRfMjU2ID0gJyNhODk5ODQnCisKKyAgICAgIENfYnJpZ2h0X3JlZCA9ICcjZmI0OTM0JworICAgICAgQ19icmlnaHRfZ3JlZW4gPSAnI2I4YmIyNicKKyAgICAgIENfYnJpZ2h0X3llbGxvdyA9ICcjZmFiZDJmJworICAgICAgQ19icmlnaHRfYmx1ZSA9ICcjODNhNTk4JworICAgICAgQ19icmlnaHRfcHVycGxlID0gJyNkMzg2OWInCisgICAgICBDX2JyaWdodF9hcXVhID0gJyM4ZWMwN2MnCisgICAgICBDX2JyaWdodF9vcmFuZ2UgPSAnI2ZlODAxOScKKworICAgICAgQ19uZXV0cmFsX3JlZCA9ICcjY2MyNDFkJworICAgICAgQ19uZXV0cmFsX2dyZWVuID0gJyM5ODk3MWEnCisgICAgICBDX25ldXRyYWxfeWVsbG93ID0gJyNkNzk5MjEnCisgICAgICBDX25ldXRyYWxfYmx1ZSA9ICcjNDU4NTg4JworICAgICAgQ19uZXV0cmFsX3B1cnBsZSA9ICcjYjE2Mjg2JworICAgICAgQ19uZXV0cmFsX2FxdWEgPSAnIzY4OWQ2YScKKyAgICAgIENfbmV1dHJhbF9vcmFuZ2UgPSAnI2Q2NWQwZScKKworICAgICAgQ19mYWRlZF9yZWQgPSAnIzlkMDAwNicKKyAgICAgIENfZmFkZWRfZ3JlZW4gPSAnIzc5NzQwZScKKyAgICAgIENfZmFkZWRfeWVsbG93ID0gJyNiNTc2MTQnCisgICAgICBDX2ZhZGVkX2JsdWUgPSAnIzA3NjY3OCcKKyAgICAgIENfZmFkZWRfcHVycGxlID0gJyM4ZjNmNzEnCisgICAgICBDX2ZhZGVkX2FxdWEgPSAnIzQyN2I1OCcKKyAgICAgIENfZmFkZWRfb3JhbmdlID0gJyNhZjNhMDMnCisgICAgICAjIH19fQorCisgICAgICBleHRlbmQgSGFzTW9kZXMKKworICAgICAgZGVmIHNlbGYubGlnaHQhCisgICAgICAgIG1vZGUgOmRhcmsgIyBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIGEgZGFyayB2YXJpYW50CisgICAgICAgIG1vZGUhIDpsaWdodAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmRhcmshCisgICAgICAgIG1vZGUgOmxpZ2h0ICMgaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBhIGxpZ2h0IHZhcmlhbnQKKyAgICAgICAgbW9kZSEgOmRhcmsKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5tYWtlX2RhcmshCisgICAgICAgIHBhbGV0dGUgYmcwOiBDX2RhcmswCisgICAgICAgIHBhbGV0dGUgYmcxOiBDX2RhcmsxCisgICAgICAgIHBhbGV0dGUgYmcyOiBDX2RhcmsyCisgICAgICAgIHBhbGV0dGUgYmczOiBDX2RhcmszCisgICAgICAgIHBhbGV0dGUgYmc0OiBDX2Rhcms0CisKKyAgICAgICAgcGFsZXR0ZSBncmF5OiBDX2dyYXlfMjQ1CisKKyAgICAgICAgcGFsZXR0ZSBmZzA6IENfbGlnaHQwCisgICAgICAgIHBhbGV0dGUgZmcxOiBDX2xpZ2h0MQorICAgICAgICBwYWxldHRlIGZnMjogQ19saWdodDIKKyAgICAgICAgcGFsZXR0ZSBmZzM6IENfbGlnaHQzCisgICAgICAgIHBhbGV0dGUgZmc0OiBDX2xpZ2h0NAorCisgICAgICAgIHBhbGV0dGUgZmc0XzI1NjogQ19saWdodDRfMjU2CisKKyAgICAgICAgcGFsZXR0ZSByZWQ6IENfYnJpZ2h0X3JlZAorICAgICAgICBwYWxldHRlIGdyZWVuOiBDX2JyaWdodF9ncmVlbgorICAgICAgICBwYWxldHRlIHllbGxvdzogQ19icmlnaHRfeWVsbG93CisgICAgICAgIHBhbGV0dGUgYmx1ZTogQ19icmlnaHRfYmx1ZQorICAgICAgICBwYWxldHRlIHB1cnBsZTogQ19icmlnaHRfcHVycGxlCisgICAgICAgIHBhbGV0dGUgYXF1YTogQ19icmlnaHRfYXF1YQorICAgICAgICBwYWxldHRlIG9yYW5nZTogQ19icmlnaHRfb3JhbmdlCisKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5tYWtlX2xpZ2h0IQorICAgICAgICBwYWxldHRlIGJnMDogQ19saWdodDAKKyAgICAgICAgcGFsZXR0ZSBiZzE6IENfbGlnaHQxCisgICAgICAgIHBhbGV0dGUgYmcyOiBDX2xpZ2h0MgorICAgICAgICBwYWxldHRlIGJnMzogQ19saWdodDMKKyAgICAgICAgcGFsZXR0ZSBiZzQ6IENfbGlnaHQ0CisKKyAgICAgICAgcGFsZXR0ZSBncmF5OiBDX2dyYXlfMjQ0CisKKyAgICAgICAgcGFsZXR0ZSBmZzA6IENfZGFyazAKKyAgICAgICAgcGFsZXR0ZSBmZzE6IENfZGFyazEKKyAgICAgICAgcGFsZXR0ZSBmZzI6IENfZGFyazIKKyAgICAgICAgcGFsZXR0ZSBmZzM6IENfZGFyazMKKyAgICAgICAgcGFsZXR0ZSBmZzQ6IENfZGFyazQKKworICAgICAgICBwYWxldHRlIGZnNF8yNTY6IENfZGFyazRfMjU2CisKKyAgICAgICAgcGFsZXR0ZSByZWQ6IENfZmFkZWRfcmVkCisgICAgICAgIHBhbGV0dGUgZ3JlZW46IENfZmFkZWRfZ3JlZW4KKyAgICAgICAgcGFsZXR0ZSB5ZWxsb3c6IENfZmFkZWRfeWVsbG93CisgICAgICAgIHBhbGV0dGUgYmx1ZTogQ19mYWRlZF9ibHVlCisgICAgICAgIHBhbGV0dGUgcHVycGxlOiBDX2ZhZGVkX3B1cnBsZQorICAgICAgICBwYWxldHRlIGFxdWE6IENfZmFkZWRfYXF1YQorICAgICAgICBwYWxldHRlIG9yYW5nZTogQ19mYWRlZF9vcmFuZ2UKKyAgICAgIGVuZAorCisgICAgICBkYXJrIQorICAgICAgbW9kZSA6bGlnaHQKKworICAgICAgc3R5bGUgVGV4dCwgOmZnID0+IDpmZzAsIDpiZyA9PiA6YmcwCisgICAgICBzdHlsZSBFcnJvciwgOmZnID0+IDpyZWQsIDpiZyA9PiA6YmcwLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBDb21tZW50LCA6ZmcgPT4gOmdyYXksIDppdGFsaWMgPT4gdHJ1ZQorCisgICAgICBzdHlsZSBDb21tZW50OjpQcmVwcm9jLCA6ZmcgPT4gOmFxdWEKKworICAgICAgc3R5bGUgTmFtZTo6VGFnLCA6ZmcgPT4gOnJlZAorCisgICAgICBzdHlsZSBPcGVyYXRvciwKKyAgICAgICAgICAgIFB1bmN0dWF0aW9uLCA6ZmcgPT4gOmZnMAorCisgICAgICBzdHlsZSBHZW5lcmljOjpJbnNlcnRlZCwgOmZnID0+IDpncmVlbiwgOmJnID0+IDpiZzAKKyAgICAgIHN0eWxlIEdlbmVyaWM6OkRlbGV0ZWQsIDpmZyA9PiA6cmVkLCA6YmcgPT4gOmJnMAorICAgICAgc3R5bGUgR2VuZXJpYzo6SGVhZGluZywgOmZnID0+IDpncmVlbiwgOmJvbGQgPT4gdHJ1ZQorCisgICAgICBzdHlsZSBLZXl3b3JkLCA6ZmcgPT4gOnJlZAorICAgICAgc3R5bGUgS2V5d29yZDo6Q29uc3RhbnQsIDpmZyA9PiA6cHVycGxlCisgICAgICBzdHlsZSBLZXl3b3JkOjpUeXBlLCA6ZmcgPT4gOnllbGxvdworCisgICAgICBzdHlsZSBLZXl3b3JkOjpEZWNsYXJhdGlvbiwgOmZnID0+IDpvcmFuZ2UKKworICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpJbnRlcnBvbCwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6UmVnZXgsIDpmZyA9PiA6Z3JlZW4sIDppdGFsaWMgPT4gdHJ1ZQorCisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OkVzY2FwZSwgOmZnID0+IDpvcmFuZ2UKKworICAgICAgc3R5bGUgTmFtZTo6TmFtZXNwYWNlLAorICAgICAgICAgICAgTmFtZTo6Q2xhc3MsIDpmZyA9PiA6YXF1YQorCisgICAgICBzdHlsZSBOYW1lOjpDb25zdGFudCwgOmZnID0+IDpwdXJwbGUKKworICAgICAgc3R5bGUgTmFtZTo6QXR0cmlidXRlLCA6ZmcgPT4gOmdyZWVuCisKKyAgICAgIHN0eWxlIExpdGVyYWw6Ok51bWJlciwgOmZnID0+IDpwdXJwbGUKKworICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nOjpTeW1ib2wsIDpmZyA9PiA6Ymx1ZQorCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9tb2xva2FpLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZXMvbW9sb2thaS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE0YWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZXMvbW9sb2thaS5yYgpAQCAtMCwwICsxLDgyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBtb2R1bGUgVGhlbWVzCisgICAgY2xhc3MgTW9sb2thaSA8IENTU1RoZW1lCisgICAgICBuYW1lICdtb2xva2FpJworCisgICAgICBwYWxldHRlIDpibGFjayAgICAgICAgICA9PiAnIzFiMWQxZScKKyAgICAgIHBhbGV0dGUgOndoaXRlICAgICAgICAgID0+ICcjZjhmOGYyJworICAgICAgcGFsZXR0ZSA6Ymx1ZSAgICAgICAgICAgPT4gJyM2NmQ5ZWYnCisgICAgICBwYWxldHRlIDpncmVlbiAgICAgICAgICA9PiAnI2E2ZTIyZScKKyAgICAgIHBhbGV0dGUgOmdyZXkgICAgICAgICAgID0+ICcjNDAzZDNkJworICAgICAgcGFsZXR0ZSA6cmVkICAgICAgICAgICAgPT4gJyNmOTI2NzInCisgICAgICBwYWxldHRlIDpsaWdodF9ncmV5ICAgICA9PiAnIzQ2NTQ1NycKKyAgICAgIHBhbGV0dGUgOmRhcmtfYmx1ZSAgICAgID0+ICcjNWU1ZDgzJworICAgICAgcGFsZXR0ZSA6dmlvbGV0ICAgICAgICAgPT4gJyNhZjg3ZmYnCisgICAgICBwYWxldHRlIDp5ZWxsb3cgICAgICAgICA9PiAnI2Q3ZDc4NycKKworICAgICAgc3R5bGUgQ29tbWVudCwKKyAgICAgICAgICAgIENvbW1lbnQ6Ok11bHRpbGluZSwKKyAgICAgICAgICAgIENvbW1lbnQ6OlNpbmdsZSwgICAgICAgICAgICAgICAgICA6ZmcgPT4gOmRhcmtfYmx1ZSwgOml0YWxpYyA9PiB0cnVlCisgICAgICBzdHlsZSBDb21tZW50OjpQcmVwcm9jLCAgICAgICAgICAgICAgICAgOmZnID0+IDpsaWdodF9ncmV5LCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBDb21tZW50OjpTcGVjaWFsLCAgICAgICAgICAgICAgICAgOmZnID0+IDpsaWdodF9ncmV5LCA6aXRhbGljID0+IHRydWUsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIEVycm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gOndoaXRlLCA6YmcgPT4gOmdyZXkKKyAgICAgIHN0eWxlIEdlbmVyaWM6Okluc2VydGVkLCAgICAgICAgICAgICAgICA6ZmcgPT4gOmdyZWVuCisgICAgICBzdHlsZSBHZW5lcmljOjpEZWxldGVkLCAgICAgICAgICAgICAgICAgOmZnID0+IDpyZWQKKyAgICAgIHN0eWxlIEdlbmVyaWM6OkVtcGgsICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gOmJsYWNrLCA6aXRhbGljID0+IHRydWUKKyAgICAgIHN0eWxlIEdlbmVyaWM6OkVycm9yLAorICAgICAgICAgICAgR2VuZXJpYzo6VHJhY2ViYWNrLCAgICAgICAgICAgICAgIDpmZyA9PiA6cmVkCisgICAgICBzdHlsZSBHZW5lcmljOjpIZWFkaW5nLCAgICAgICAgICAgICAgICAgOmZnID0+IDpncmV5CisgICAgICBzdHlsZSBHZW5lcmljOjpPdXRwdXQsICAgICAgICAgICAgICAgICAgOmZnID0+IDpncmV5CisgICAgICBzdHlsZSBHZW5lcmljOjpQcm9tcHQsICAgICAgICAgICAgICAgICAgOmZnID0+IDpibHVlCisgICAgICBzdHlsZSBHZW5lcmljOjpTdHJvbmcsICAgICAgICAgICAgICAgICAgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgR2VuZXJpYzo6U3ViaGVhZGluZywgICAgICAgICAgICAgIDpmZyA9PiA6bGlnaHRfZ3JleQorICAgICAgc3R5bGUgS2V5d29yZCwKKyAgICAgICAgICAgIEtleXdvcmQ6OkNvbnN0YW50LAorICAgICAgICAgICAgS2V5d29yZDo6RGVjbGFyYXRpb24sCisgICAgICAgICAgICBLZXl3b3JkOjpQc2V1ZG8sCisgICAgICAgICAgICBLZXl3b3JkOjpSZXNlcnZlZCwKKyAgICAgICAgICAgIEtleXdvcmQ6OlR5cGUsICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gOmJsdWUsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIEtleXdvcmQ6Ok5hbWVzcGFjZSwKKyAgICAgICAgICAgIE9wZXJhdG9yOjpXb3JkLAorICAgICAgICAgICAgT3BlcmF0b3IsICAgICAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6cmVkLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBMaXRlcmFsOjpOdW1iZXI6OkZsb2F0LAorICAgICAgICAgICAgTGl0ZXJhbDo6TnVtYmVyOjpIZXgsCisgICAgICAgICAgICBMaXRlcmFsOjpOdW1iZXI6OkludGVnZXI6OkxvbmcsCisgICAgICAgICAgICBMaXRlcmFsOjpOdW1iZXI6OkludGVnZXIsCisgICAgICAgICAgICBMaXRlcmFsOjpOdW1iZXI6Ok9jdCwKKyAgICAgICAgICAgIExpdGVyYWw6Ok51bWJlciwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6RXNjYXBlLCAgICAgICAgICA6ZmcgPT4gOnZpb2xldAorICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nOjpCYWNrdGljaywKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6Q2hhciwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6RG9jLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpEb3VibGUsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6OkhlcmVkb2MsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6OkludGVycG9sLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpPdGhlciwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6UmVnZXgsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6OlNpbmdsZSwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6U3ltYm9sLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nLCAgICAgICAgICAgICAgICAgIDpmZyA9PiA6eWVsbG93CisgICAgICBzdHlsZSBOYW1lOjpBdHRyaWJ1dGUsICAgICAgICAgICAgICAgICAgOmZnID0+IDpncmVlbgorICAgICAgc3R5bGUgTmFtZTo6Q2xhc3MsCisgICAgICAgICAgICBOYW1lOjpEZWNvcmF0b3IsCisgICAgICAgICAgICBOYW1lOjpFeGNlcHRpb24sCisgICAgICAgICAgICBOYW1lOjpGdW5jdGlvbiwgICAgICAgICAgICAgICAgICAgOmZnID0+IDpncmVlbiwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTmFtZTo6Q29uc3RhbnQsICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6Ymx1ZQorICAgICAgc3R5bGUgTmFtZTo6QnVpbHRpbjo6UHNldWRvLAorICAgICAgICAgICAgTmFtZTo6QnVpbHRpbiwKKyAgICAgICAgICAgIE5hbWU6OkVudGl0eSwKKyAgICAgICAgICAgIE5hbWU6Ok5hbWVzcGFjZSwKKyAgICAgICAgICAgIE5hbWU6OlZhcmlhYmxlOjpDbGFzcywKKyAgICAgICAgICAgIE5hbWU6OlZhcmlhYmxlOjpHbG9iYWwsCisgICAgICAgICAgICBOYW1lOjpWYXJpYWJsZTo6SW5zdGFuY2UsCisgICAgICAgICAgICBOYW1lOjpWYXJpYWJsZSwKKyAgICAgICAgICAgIFRleHQ6OldoaXRlc3BhY2UsICAgICAgICAgICAgICAgICA6ZmcgPT4gOndoaXRlCisgICAgICBzdHlsZSBOYW1lOjpMYWJlbCwgICAgICAgICAgICAgICAgICAgICAgOmZnID0+IDp3aGl0ZSwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTmFtZTo6VGFnLCAgICAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6cmVkCisgICAgICBzdHlsZSBUZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZnID0+IDp3aGl0ZSwgOmJnID0+IDpibGFjaworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS90aGVtZXMvbW9ub2thaS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGhlbWVzL21vbm9rYWkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3M2Y3ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGhlbWVzL21vbm9rYWkucmIKQEAgLTAsMCArMSw5MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIFRoZW1lcworICAgIGNsYXNzIE1vbm9rYWkgPCBDU1NUaGVtZQorICAgICAgbmFtZSAnbW9ub2thaScKKworICAgICAgcGFsZXR0ZSA6YmxhY2sgICAgICAgICAgPT4gJyMwMDAwMDAnCisgICAgICBwYWxldHRlIDpicmlnaHRfZ3JlZW4gICA9PiAnI2E2ZTIyZScKKyAgICAgIHBhbGV0dGUgOmJyaWdodF9waW5rICAgID0+ICcjZjkyNjcyJworICAgICAgcGFsZXR0ZSA6Y2FybWluZSAgICAgICAgPT4gJyM5NjAwNTAnCisgICAgICBwYWxldHRlIDpkYXJrICAgICAgICAgICA9PiAnIzQ5NDgzZScKKyAgICAgIHBhbGV0dGUgOmRhcmtfZ3JleSAgICAgID0+ICcjODg4ODg4JworICAgICAgcGFsZXR0ZSA6ZGFya19yZWQgICAgICAgPT4gJyNhYTAwMDAnCisgICAgICBwYWxldHRlIDpkaW1ncmV5ICAgICAgICA9PiAnIzc1NzE1ZScKKyAgICAgIHBhbGV0dGUgOmRpbWdyZWVuICAgICAgID0+ICcjMzI0OTMyJworICAgICAgcGFsZXR0ZSA6ZGltcmVkICAgICAgICAgPT4gJyM0OTMxMzEnCisgICAgICBwYWxldHRlIDplbXBlcm9yICAgICAgICA9PiAnIzU1NTU1NScKKyAgICAgIHBhbGV0dGUgOmdyZXkgICAgICAgICAgID0+ICcjOTk5OTk5JworICAgICAgcGFsZXR0ZSA6bGlnaHRfZ3JleSAgICAgPT4gJyNhYWFhYWEnCisgICAgICBwYWxldHRlIDpsaWdodF92aW9sZXQgICA9PiAnI2FlODFmZicKKyAgICAgIHBhbGV0dGUgOnNvZnRfY3lhbiAgICAgID0+ICcjNjZkOWVmJworICAgICAgcGFsZXR0ZSA6c29mdF95ZWxsb3cgICAgPT4gJyNlNmRiNzQnCisgICAgICBwYWxldHRlIDp2ZXJ5X2RhcmsgICAgICA9PiAnIzFlMDAxMCcKKyAgICAgIHBhbGV0dGUgOndoaXRpc2ggICAgICAgID0+ICcjZjhmOGYyJworICAgICAgcGFsZXR0ZSA6b3JhbmdlICAgICAgICAgPT4gJyNmNmFhMTEnCisgICAgICBwYWxldHRlIDp3aGl0ZSAgICAgICAgICA9PiAnI2ZmZmZmZicKKworICAgICAgc3R5bGUgQ29tbWVudCwKKyAgICAgICAgICAgIENvbW1lbnQ6Ok11bHRpbGluZSwKKyAgICAgICAgICAgIENvbW1lbnQ6OlNpbmdsZSwgICAgICAgICAgICAgICAgICA6ZmcgPT4gOmRpbWdyZXksIDppdGFsaWMgPT4gdHJ1ZQorICAgICAgc3R5bGUgQ29tbWVudDo6UHJlcHJvYywgICAgICAgICAgICAgICAgIDpmZyA9PiA6ZGltZ3JleSwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgQ29tbWVudDo6U3BlY2lhbCwgICAgICAgICAgICAgICAgIDpmZyA9PiA6ZGltZ3JleSwgOml0YWxpYyA9PiB0cnVlLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBFcnJvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZnID0+IDpjYXJtaW5lLCA6YmcgPT4gOnZlcnlfZGFyaworICAgICAgc3R5bGUgR2VuZXJpYzo6SW5zZXJ0ZWQsICAgICAgICAgICAgICAgIDpmZyA9PiA6d2hpdGUsIDpiZyA9PiA6ZGltZ3JlZW4KKyAgICAgIHN0eWxlIEdlbmVyaWM6OkRlbGV0ZWQsICAgICAgICAgICAgICAgICA6ZmcgPT4gOndoaXRlLCA6YmcgPT4gOmRpbXJlZAorICAgICAgc3R5bGUgR2VuZXJpYzo6RW1waCwgICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6YmxhY2ssIDppdGFsaWMgPT4gdHJ1ZQorICAgICAgc3R5bGUgR2VuZXJpYzo6RXJyb3IsCisgICAgICAgICAgICBHZW5lcmljOjpUcmFjZWJhY2ssICAgICAgICAgICAgICAgOmZnID0+IDpkYXJrX3JlZAorICAgICAgc3R5bGUgR2VuZXJpYzo6SGVhZGluZywgICAgICAgICAgICAgICAgIDpmZyA9PiA6Z3JleQorICAgICAgc3R5bGUgR2VuZXJpYzo6T3V0cHV0LCAgICAgICAgICAgICAgICAgIDpmZyA9PiA6ZGFya19ncmV5CisgICAgICBzdHlsZSBHZW5lcmljOjpQcm9tcHQsICAgICAgICAgICAgICAgICAgOmZnID0+IDplbXBlcm9yCisgICAgICBzdHlsZSBHZW5lcmljOjpTdHJvbmcsICAgICAgICAgICAgICAgICAgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgR2VuZXJpYzo6U3ViaGVhZGluZywgICAgICAgICAgICAgIDpmZyA9PiA6bGlnaHRfZ3JleQorICAgICAgc3R5bGUgS2V5d29yZCwKKyAgICAgICAgICAgIEtleXdvcmQ6OkNvbnN0YW50LAorICAgICAgICAgICAgS2V5d29yZDo6RGVjbGFyYXRpb24sCisgICAgICAgICAgICBLZXl3b3JkOjpQc2V1ZG8sCisgICAgICAgICAgICBLZXl3b3JkOjpSZXNlcnZlZCwKKyAgICAgICAgICAgIEtleXdvcmQ6OlR5cGUsICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gOnNvZnRfY3lhbiwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgS2V5d29yZDo6TmFtZXNwYWNlLAorICAgICAgICAgICAgT3BlcmF0b3I6OldvcmQsCisgICAgICAgICAgICBPcGVyYXRvciwgICAgICAgICAgICAgICAgICAgICAgICAgOmZnID0+IDpicmlnaHRfcGluaywgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTGl0ZXJhbDo6TnVtYmVyOjpGbG9hdCwKKyAgICAgICAgICAgIExpdGVyYWw6Ok51bWJlcjo6SGV4LAorICAgICAgICAgICAgTGl0ZXJhbDo6TnVtYmVyOjpJbnRlZ2VyOjpMb25nLAorICAgICAgICAgICAgTGl0ZXJhbDo6TnVtYmVyOjpJbnRlZ2VyLAorICAgICAgICAgICAgTGl0ZXJhbDo6TnVtYmVyOjpPY3QsCisgICAgICAgICAgICBMaXRlcmFsOjpOdW1iZXIsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6OkVzY2FwZSwgICAgICAgICAgOmZnID0+IDpsaWdodF92aW9sZXQKKyAgICAgIHN0eWxlIExpdGVyYWw6OlN0cmluZzo6QmFja3RpY2ssCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6OkNoYXIsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6OkRvYywKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6RG91YmxlLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpIZXJlZG9jLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpJbnRlcnBvbCwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6T3RoZXIsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6OlJlZ2V4LAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpTaW5nbGUsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6OlN5bWJvbCwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZywgICAgICAgICAgICAgICAgICA6ZmcgPT4gOnNvZnRfeWVsbG93CisgICAgICBzdHlsZSBOYW1lOjpBdHRyaWJ1dGUsICAgICAgICAgICAgICAgICAgOmZnID0+IDpicmlnaHRfZ3JlZW4KKyAgICAgIHN0eWxlIE5hbWU6OkNsYXNzLAorICAgICAgICAgICAgTmFtZTo6RGVjb3JhdG9yLAorICAgICAgICAgICAgTmFtZTo6RXhjZXB0aW9uLAorICAgICAgICAgICAgTmFtZTo6RnVuY3Rpb24sICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6YnJpZ2h0X2dyZWVuLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpDb25zdGFudCwgICAgICAgICAgICAgICAgICAgOmZnID0+IDpzb2Z0X2N5YW4KKyAgICAgIHN0eWxlIE5hbWU6OkJ1aWx0aW46OlBzZXVkbywKKyAgICAgICAgICAgIE5hbWU6OkJ1aWx0aW4sCisgICAgICAgICAgICBOYW1lOjpFbnRpdHksCisgICAgICAgICAgICBOYW1lOjpOYW1lc3BhY2UsCisgICAgICAgICAgICBOYW1lOjpWYXJpYWJsZTo6Q2xhc3MsCisgICAgICAgICAgICBOYW1lOjpWYXJpYWJsZTo6R2xvYmFsLAorICAgICAgICAgICAgTmFtZTo6VmFyaWFibGU6Okluc3RhbmNlLAorICAgICAgICAgICAgTmFtZTo6VmFyaWFibGUsCisgICAgICAgICAgICBUZXh0OjpXaGl0ZXNwYWNlLCAgICAgICAgICAgICAgICAgOmZnID0+IDp3aGl0aXNoCisgICAgICBzdHlsZSBOYW1lOjpMYWJlbCwgICAgICAgICAgICAgICAgICAgICAgOmZnID0+IDp3aGl0aXNoLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpUYWcsICAgICAgICAgICAgICAgICAgICAgICAgOmZnID0+IDpicmlnaHRfcGluaworICAgICAgc3R5bGUgVGV4dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6d2hpdGlzaCwgOmJnID0+IDpkYXJrCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9tb25va2FpX3N1YmxpbWUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy9tb25va2FpX3N1YmxpbWUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3MDBlNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGhlbWVzL21vbm9rYWlfc3VibGltZS5yYgpAQCAtMCwwICsxLDkwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCittb2R1bGUgUm91Z2UKKyAgbW9kdWxlIFRoZW1lcworICAgIGNsYXNzIE1vbm9rYWlTdWJsaW1lIDwgQ1NTVGhlbWUKKyAgICAgIG5hbWUgJ21vbm9rYWkuc3VibGltZScKKworICAgICAgcGFsZXR0ZSA6YmxhY2sgICAgICAgICAgPT4gJyMwMDAwMDAnCisgICAgICBwYWxldHRlIDpicmlnaHRfZ3JlZW4gICA9PiAnI2E2ZTIyZScKKyAgICAgIHBhbGV0dGUgOmJyaWdodF9waW5rICAgID0+ICcjZjkyNjcyJworICAgICAgcGFsZXR0ZSA6Y2FybWluZSAgICAgICAgPT4gJyM5NjAwNTAnCisgICAgICBwYWxldHRlIDpkYXJrICAgICAgICAgICA9PiAnIzQ5NDgzZScKKyAgICAgIHBhbGV0dGUgOmRhcmtfZ3JleSAgICAgID0+ICcjODg4ODg4JworICAgICAgcGFsZXR0ZSA6ZGFya19yZWQgICAgICAgPT4gJyNhYTAwMDAnCisgICAgICBwYWxldHRlIDpkaW1ncmV5ICAgICAgICA9PiAnIzc1NzE1ZScKKyAgICAgIHBhbGV0dGUgOmVtcGVyb3IgICAgICAgID0+ICcjNTU1NTU1JworICAgICAgcGFsZXR0ZSA6Z3JleSAgICAgICAgICAgPT4gJyM5OTk5OTknCisgICAgICBwYWxldHRlIDpsaWdodF9ncmV5ICAgICA9PiAnI2FhYWFhYScKKyAgICAgIHBhbGV0dGUgOmxpZ2h0X3Zpb2xldCAgID0+ICcjYWU4MWZmJworICAgICAgcGFsZXR0ZSA6c29mdF9jeWFuICAgICAgPT4gJyM2NmQ5ZWYnCisgICAgICBwYWxldHRlIDpzb2Z0X3llbGxvdyAgICA9PiAnI2U2ZGI3NCcKKyAgICAgIHBhbGV0dGUgOnZlcnlfZGFyayAgICAgID0+ICcjMWUwMDEwJworICAgICAgcGFsZXR0ZSA6d2hpdGlzaCAgICAgICAgPT4gJyNmOGY4ZjInCisgICAgICBwYWxldHRlIDpvcmFuZ2UgICAgICAgICA9PiAnI2Y2YWExMScKKyAgICAgIHBhbGV0dGUgOndoaXRlICAgICAgICAgID0+ICcjZmZmZmZmJworCisgICAgICBzdHlsZSBHZW5lcmljOjpIZWFkaW5nLCAgICAgICAgICAgICAgICAgOmZnID0+IDpncmV5CisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OlJlZ2V4LCAgICAgICAgICAgOmZnID0+IDpvcmFuZ2UKKyAgICAgIHN0eWxlIEdlbmVyaWM6Ok91dHB1dCwgICAgICAgICAgICAgICAgICA6ZmcgPT4gOmRhcmtfZ3JleQorICAgICAgc3R5bGUgR2VuZXJpYzo6UHJvbXB0LCAgICAgICAgICAgICAgICAgIDpmZyA9PiA6ZW1wZXJvcgorICAgICAgc3R5bGUgR2VuZXJpYzo6U3Ryb25nLCAgICAgICAgICAgICAgICAgIDpib2xkID0+IGZhbHNlCisgICAgICBzdHlsZSBHZW5lcmljOjpTdWJoZWFkaW5nLCAgICAgICAgICAgICAgOmZnID0+IDpsaWdodF9ncmV5CisgICAgICBzdHlsZSBOYW1lOjpCdWlsdGluLCAgICAgICAgICAgICAgICAgICAgOmZnID0+IDpvcmFuZ2UKKyAgICAgIHN0eWxlIENvbW1lbnQ6Ok11bHRpbGluZSwKKyAgICAgICAgICAgIENvbW1lbnQ6OlByZXByb2MsCisgICAgICAgICAgICBDb21tZW50OjpTaW5nbGUsCisgICAgICAgICAgICBDb21tZW50OjpTcGVjaWFsLAorICAgICAgICAgICAgQ29tbWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6ZGltZ3JleQorICAgICAgc3R5bGUgRXJyb3IsCisgICAgICAgICAgICBHZW5lcmljOjpFcnJvciwKKyAgICAgICAgICAgIEdlbmVyaWM6OlRyYWNlYmFjaywgICAgICAgICAgICAgICA6ZmcgPT4gOmNhcm1pbmUKKyAgICAgIHN0eWxlIEdlbmVyaWM6OkRlbGV0ZWQsCisgICAgICAgICAgICBHZW5lcmljOjpJbnNlcnRlZCwKKyAgICAgICAgICAgIEdlbmVyaWM6OkVtcGgsICAgICAgICAgICAgICAgICAgICA6ZmcgPT4gOmRhcmsKKyAgICAgIHN0eWxlIEtleXdvcmQ6OkNvbnN0YW50LAorICAgICAgICAgICAgS2V5d29yZDo6RGVjbGFyYXRpb24sCisgICAgICAgICAgICBLZXl3b3JkOjpSZXNlcnZlZCwKKyAgICAgICAgICAgIE5hbWU6OkNvbnN0YW50LAorICAgICAgICAgICAgS2V5d29yZDo6VHlwZSwgICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6c29mdF9jeWFuCisgICAgICBzdHlsZSBMaXRlcmFsOjpOdW1iZXI6OkZsb2F0LAorICAgICAgICAgICAgTGl0ZXJhbDo6TnVtYmVyOjpIZXgsCisgICAgICAgICAgICBMaXRlcmFsOjpOdW1iZXI6OkludGVnZXI6OkxvbmcsCisgICAgICAgICAgICBMaXRlcmFsOjpOdW1iZXI6OkludGVnZXIsCisgICAgICAgICAgICBMaXRlcmFsOjpOdW1iZXI6Ok9jdCwKKyAgICAgICAgICAgIExpdGVyYWw6Ok51bWJlciwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6Q2hhciwKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6RXNjYXBlLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpTeW1ib2wsICAgICAgICAgIDpmZyA9PiA6bGlnaHRfdmlvbGV0CisgICAgICBzdHlsZSBMaXRlcmFsOjpTdHJpbmc6OkRvYywKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6RG91YmxlLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpCYWNrdGljaywKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6SGVyZWRvYywKKyAgICAgICAgICAgIExpdGVyYWw6OlN0cmluZzo6SW50ZXJwb2wsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmc6Ok90aGVyLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpTaW5nbGUsCisgICAgICAgICAgICBMaXRlcmFsOjpTdHJpbmcsICAgICAgICAgICAgICAgICAgOmZnID0+IDpzb2Z0X3llbGxvdworICAgICAgc3R5bGUgTmFtZTo6QXR0cmlidXRlLAorICAgICAgICAgICAgTmFtZTo6Q2xhc3MsCisgICAgICAgICAgICBOYW1lOjpEZWNvcmF0b3IsCisgICAgICAgICAgICBOYW1lOjpFeGNlcHRpb24sCisgICAgICAgICAgICBOYW1lOjpGdW5jdGlvbiwgICAgICAgICAgICAgICAgICAgOmZnID0+IDpicmlnaHRfZ3JlZW4KKyAgICAgIHN0eWxlIE5hbWU6OlZhcmlhYmxlOjpDbGFzcywKKyAgICAgICAgICAgIE5hbWU6Ok5hbWVzcGFjZSwKKyAgICAgICAgICAgIE5hbWU6OkxhYmVsLAorICAgICAgICAgICAgTmFtZTo6RW50aXR5LAorICAgICAgICAgICAgTmFtZTo6QnVpbHRpbjo6UHNldWRvLAorICAgICAgICAgICAgTmFtZTo6VmFyaWFibGU6Okdsb2JhbCwKKyAgICAgICAgICAgIE5hbWU6OlZhcmlhYmxlOjpJbnN0YW5jZSwKKyAgICAgICAgICAgIE5hbWU6OlZhcmlhYmxlLAorICAgICAgICAgICAgVGV4dDo6V2hpdGVzcGFjZSwKKyAgICAgICAgICAgIFRleHQsCisgICAgICAgICAgICBOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZnID0+IDp3aGl0ZQorICAgICAgc3R5bGUgT3BlcmF0b3I6OldvcmQsCisgICAgICAgICAgICBOYW1lOjpUYWcsCisgICAgICAgICAgICBLZXl3b3JkLAorICAgICAgICAgICAgS2V5d29yZDo6TmFtZXNwYWNlLAorICAgICAgICAgICAgS2V5d29yZDo6UHNldWRvLAorICAgICAgICAgICAgT3BlcmF0b3IsICAgICAgICAgICAgICAgICAgICAgICAgIDpmZyA9PiA6YnJpZ2h0X3BpbmsKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdGhlbWVzL3RoYW5rZnVsX2V5ZXMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy90aGFua2Z1bF9leWVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDFiMzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3RoZW1lcy90aGFua2Z1bF9leWVzLnJiCkBAIC0wLDAgKzEsNzEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIG1vZHVsZSBUaGVtZXMKKyAgICBjbGFzcyBUaGFua2Z1bEV5ZXMgPCBDU1NUaGVtZQorICAgICAgbmFtZSAndGhhbmtmdWxfZXllcycKKworICAgICAgIyBwYWxsZXR0ZSwgZnJvbSBHVEtTb3VyY2VWaWV3J3MgVGhhbmtmdWxFeWVzCisgICAgICBwYWxldHRlIDpjb29sX2FzX2ljZSAgICA9PiAnIzZjOGI5ZicKKyAgICAgIHBhbGV0dGUgOnNsYXRlX2JsdWUgICAgID0+ICcjNGU1ZDYyJworICAgICAgcGFsZXR0ZSA6ZWdnc2hlbGxfY2xvdWQgPT4gJyNkZWU1ZTcnCisgICAgICBwYWxldHRlIDprcmFzbmEgICAgICAgICA9PiAnIzEyMmIzYicKKyAgICAgIHBhbGV0dGUgOmFsdW1pbnVtMSAgICAgID0+ICcjZmVmZWVjJworICAgICAgcGFsZXR0ZSA6c2NhcmxldHJlZDIgICAgPT4gJyNjYzAwMDAnCisgICAgICBwYWxldHRlIDpidXR0ZXIzICAgICAgICA9PiAnI2M0YTAwMCcKKyAgICAgIHBhbGV0dGUgOmdvX2dldF9pdCAgICAgID0+ICcjYjJmZDZkJworICAgICAgcGFsZXR0ZSA6Y2hpbGx5ICAgICAgICAgPT4gJyNhOGUxZmUnCisgICAgICBwYWxldHRlIDp1bmljb3JuICAgICAgICA9PiAnI2ZhZjZlNCcKKyAgICAgIHBhbGV0dGUgOnNhbmR5ICAgICAgICAgID0+ICcjZjZkZDYyJworICAgICAgcGFsZXR0ZSA6cGlua19tZXJlbmd1ZSAgPT4gJyNmNjk2ZGInCisgICAgICBwYWxldHRlIDpkdW5lICAgICAgICAgICA9PiAnI2ZmZjBhNicKKyAgICAgIHBhbGV0dGUgOmJhY2tsaXQgICAgICAgID0+ICcjNGRmNGZmJworICAgICAgcGFsZXR0ZSA6c2NocmlsbCAgICAgICAgPT4gJyNmZmIwMDAnCisKKyAgICAgIHN0eWxlIFRleHQsIDpmZyA9PiA6dW5pY29ybiwgOmJnID0+IDprcmFzbmEKKyAgICAgIHN0eWxlIEdlbmVyaWM6OkxpbmVubywgOmZnID0+IDplZ2dzaGVsbF9jbG91ZCwgOmJnID0+IDpzbGF0ZV9ibHVlCisKKyAgICAgIHN0eWxlIENvbW1lbnQsIDpmZyA9PiA6Y29vbF9hc19pY2UsIDppdGFsaWMgPT4gdHJ1ZQorICAgICAgc3R5bGUgQ29tbWVudDo6UHJlcHJvYywgOmZnID0+IDpnb19nZXRfaXQsIDpib2xkID0+IHRydWUsIDppdGFsaWMgPT4gdHJ1ZQorICAgICAgc3R5bGUgRXJyb3IsCisgICAgICAgICAgICBHZW5lcmljOjpFcnJvciwgOmZnID0+IDphbHVtaW51bTEsIDpiZyA9PiA6c2NhcmxldHJlZDIKKyAgICAgIHN0eWxlIEtleXdvcmQsIDpmZyA9PiA6c2FuZHksIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIE9wZXJhdG9yLAorICAgICAgICAgICAgUHVuY3R1YXRpb24sIDpmZyA9PiA6YmFja2xpdAorICAgICAgc3R5bGUgR2VuZXJpYzo6RGVsZXRlZCwgOmZnID0+IDpzY2FybGV0cmVkMgorICAgICAgc3R5bGUgR2VuZXJpYzo6SW5zZXJ0ZWQsIDpmZyA9PiA6Z29fZ2V0X2l0CisgICAgICBzdHlsZSBHZW5lcmljOjpFbXBoLCA6aXRhbGljID0+IHRydWUKKyAgICAgIHN0eWxlIEdlbmVyaWM6OlN0cm9uZywgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgR2VuZXJpYzo6VHJhY2ViYWNrLCA6ZmcgPT4gOmVnZ3NoZWxsX2Nsb3VkLCA6YmcgPT4gOnNsYXRlX2JsdWUKKyAgICAgIHN0eWxlIEtleXdvcmQ6OkNvbnN0YW50LCA6ZmcgPT4gOnBpbmtfbWVyZW5ndWUsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIEtleXdvcmQ6Ok5hbWVzcGFjZSwKKyAgICAgICAgICAgIEtleXdvcmQ6OlBzZXVkbywKKyAgICAgICAgICAgIEtleXdvcmQ6OlJlc2VydmVkLAorICAgICAgICAgICAgR2VuZXJpYzo6SGVhZGluZywKKyAgICAgICAgICAgIEdlbmVyaWM6OlN1YmhlYWRpbmcsIDpmZyA9PiA6c2NocmlsbCwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgS2V5d29yZDo6VHlwZSwKKyAgICAgICAgICAgIE5hbWU6OkNvbnN0YW50LAorICAgICAgICAgICAgTmFtZTo6Q2xhc3MsCisgICAgICAgICAgICBOYW1lOjpEZWNvcmF0b3IsCisgICAgICAgICAgICBOYW1lOjpOYW1lc3BhY2UsCisgICAgICAgICAgICBOYW1lOjpCdWlsdGluOjpQc2V1ZG8sCisgICAgICAgICAgICBOYW1lOjpFeGNlcHRpb24sIDpmZyA9PiA6Z29fZ2V0X2l0LCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpMYWJlbCwKKyAgICAgICAgICAgIE5hbWU6OlRhZywgOmZnID0+IDpzY2hyaWxsLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBMaXRlcmFsOjpOdW1iZXIsCisgICAgICAgICAgICBMaXRlcmFsOjpEYXRlLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpTeW1ib2wsIDpmZyA9PiA6cGlua19tZXJlbmd1ZSwgOmJvbGQgPT4gdHJ1ZQorICAgICAgc3R5bGUgTGl0ZXJhbDo6U3RyaW5nLCA6ZmcgPT4gOmR1bmUsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIExpdGVyYWw6OlN0cmluZzo6RXNjYXBlLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpDaGFyLAorICAgICAgICAgICAgTGl0ZXJhbDo6U3RyaW5nOjpJbnRlcnBvbCwgOmZnID0+IDpiYWNrbGl0LCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpCdWlsdGluLCA6Ym9sZCA9PiB0cnVlCisgICAgICBzdHlsZSBOYW1lOjpFbnRpdHksIDpmZyA9PiAnIzk5OTk5OScsIDpib2xkID0+IHRydWUKKyAgICAgIHN0eWxlIFRleHQ6OldoaXRlc3BhY2UsIDpmZyA9PiAnI0JCQkJCQicKKyAgICAgIHN0eWxlIE5hbWU6OkZ1bmN0aW9uLAorICAgICAgICAgICAgTmFtZTo6UHJvcGVydHksCisgICAgICAgICAgICBOYW1lOjpBdHRyaWJ1dGUsIDpmZyA9PiA6Y2hpbGx5CisgICAgICBzdHlsZSBOYW1lOjpWYXJpYWJsZSwgOmZnID0+IDpjaGlsbHksIDpib2xkID0+IHRydWUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdG9rZW4ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3Rva2VuLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDQ0YTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3Rva2VuLnJiCkBAIC0wLDAgKzEsMTgyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLSAjCisKK21vZHVsZSBSb3VnZQorICBjbGFzcyBUb2tlbgorICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgIGF0dHJfcmVhZGVyIDpuYW1lCisgICAgICBhdHRyX3JlYWRlciA6cGFyZW50CisgICAgICBhdHRyX3JlYWRlciA6c2hvcnRuYW1lCisKKyAgICAgIGRlZiBjYWNoZQorICAgICAgICBAY2FjaGUgfHw9IHt9CisgICAgICBlbmQKKworICAgICAgZGVmIHN1Yl90b2tlbnMKKyAgICAgICAgQHN1Yl90b2tlbnMgfHw9IHt9CisgICAgICBlbmQKKworICAgICAgZGVmIFtdKHF1YWxuYW1lKQorICAgICAgICByZXR1cm4gcXVhbG5hbWUgdW5sZXNzIHF1YWxuYW1lLmlzX2E/IDo6U3RyaW5nCisKKyAgICAgICAgVG9rZW4uY2FjaGVbcXVhbG5hbWVdCisgICAgICBlbmQKKworICAgICAgZGVmIGluc3BlY3QKKyAgICAgICAgIjxUb2tlbiAje3F1YWxuYW1lfT4iCisgICAgICBlbmQKKworICAgICAgZGVmIG1hdGNoZXM/KG90aGVyKQorICAgICAgICBvdGhlci50b2tlbl9jaGFpbi5pbmNsdWRlPyBzZWxmCisgICAgICBlbmQKKworICAgICAgZGVmIHRva2VuX2NoYWluCisgICAgICAgIEB0b2tlbl9jaGFpbiB8fD0gYW5jZXN0b3JzLnRha2Vfd2hpbGUgeyB8eHwgeCAhPSBUb2tlbiB9LnJldmVyc2UKKyAgICAgIGVuZAorCisgICAgICBkZWYgcXVhbG5hbWUKKyAgICAgICAgQHF1YWxuYW1lIHx8PSB0b2tlbl9jaGFpbi5tYXAoJjpuYW1lKS5qb2luKCcuJykKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVnaXN0ZXIhCisgICAgICAgIFRva2VuLmNhY2hlW3NlbGYucXVhbG5hbWVdID0gc2VsZgorICAgICAgICBwYXJlbnQuc3ViX3Rva2Vuc1tzZWxmLm5hbWVdID0gc2VsZgorICAgICAgZW5kCisKKyAgICAgIGRlZiBtYWtlX3Rva2VuKG5hbWUsIHNob3J0bmFtZSwgJmIpCisgICAgICAgIHBhcmVudCA9IHNlbGYKKyAgICAgICAgQ2xhc3MubmV3KHBhcmVudCkgZG8KKyAgICAgICAgICBAcGFyZW50ID0gcGFyZW50CisgICAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgICAgQHNob3J0bmFtZSA9IHNob3J0bmFtZQorICAgICAgICAgIHJlZ2lzdGVyIQorICAgICAgICAgIGNsYXNzX2V2YWwoJmIpIGlmIGIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIHRva2VuKG5hbWUsIHNob3J0bmFtZSwgJmIpCisgICAgICAgIHRvayA9IG1ha2VfdG9rZW4obmFtZSwgc2hvcnRuYW1lLCAmYikKKyAgICAgICAgY29uc3Rfc2V0KG5hbWUsIHRvaykKKyAgICAgIGVuZAorCisgICAgICBkZWYgZWFjaF90b2tlbigmYikKKyAgICAgICAgVG9rZW4uY2FjaGUuZWFjaCBkbyB8KF8sIHQpfAorICAgICAgICAgIGIuY2FsbCh0KQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgbW9kdWxlIFRva2VucworICAgICAgZGVmIHNlbGYudG9rZW4obmFtZSwgc2hvcnRuYW1lLCAmYikKKyAgICAgICAgdG9rID0gVG9rZW4ubWFrZV90b2tlbihuYW1lLCBzaG9ydG5hbWUsICZiKQorICAgICAgICBjb25zdF9zZXQobmFtZSwgdG9rKQorICAgICAgZW5kCisKKyAgICAgICMgWFhYIElNUE9SVEFOVCBYWFgKKyAgICAgICMgRm9yIGNvbXBhdGliaWxpdHksIHRoaXMgbGlzdCBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoCisgICAgICAjIHB5Z21lbnRzLnRva2VuLlNUQU5EQVJEX1RZUEVTCisgICAgICAjIHBsZWFzZSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2puZWVuL3JvdWdlL3dpa2kvTGlzdC1vZi10b2tlbnMKKyAgICAgIHRva2VuIDpUZXh0LCAnJyBkbworICAgICAgICB0b2tlbiA6V2hpdGVzcGFjZSwgJ3cnCisgICAgICBlbmQKKworICAgICAgdG9rZW4gOkVycm9yLCAnZXJyJworICAgICAgdG9rZW4gOk90aGVyLCAneCcKKworICAgICAgdG9rZW4gOktleXdvcmQsICdrJyBkbworICAgICAgICB0b2tlbiA6Q29uc3RhbnQsICAgICdrYycKKyAgICAgICAgdG9rZW4gOkRlY2xhcmF0aW9uLCAna2QnCisgICAgICAgIHRva2VuIDpOYW1lc3BhY2UsICAgJ2tuJworICAgICAgICB0b2tlbiA6UHNldWRvLCAgICAgICdrcCcKKyAgICAgICAgdG9rZW4gOlJlc2VydmVkLCAgICAna3InCisgICAgICAgIHRva2VuIDpUeXBlLCAgICAgICAgJ2t0JworICAgICAgICB0b2tlbiA6VmFyaWFibGUsICAgICdrdicKKyAgICAgIGVuZAorCisgICAgICB0b2tlbiA6TmFtZSwgJ24nIGRvCisgICAgICAgIHRva2VuIDpBdHRyaWJ1dGUsICAgICduYScKKyAgICAgICAgdG9rZW4gOkJ1aWx0aW4sICAgICAgJ25iJyBkbworICAgICAgICAgIHRva2VuIDpQc2V1ZG8sICAgICAnYnAnCisgICAgICAgIGVuZAorICAgICAgICB0b2tlbiA6Q2xhc3MsICAgICAgICAnbmMnCisgICAgICAgIHRva2VuIDpDb25zdGFudCwgICAgICdubycKKyAgICAgICAgdG9rZW4gOkRlY29yYXRvciwgICAgJ25kJworICAgICAgICB0b2tlbiA6RW50aXR5LCAgICAgICAnbmknCisgICAgICAgIHRva2VuIDpFeGNlcHRpb24sICAgICduZScKKyAgICAgICAgdG9rZW4gOkZ1bmN0aW9uLCAgICAgJ25mJworICAgICAgICB0b2tlbiA6UHJvcGVydHksICAgICAncHknCisgICAgICAgIHRva2VuIDpMYWJlbCwgICAgICAgICdubCcKKyAgICAgICAgdG9rZW4gOk5hbWVzcGFjZSwgICAgJ25uJworICAgICAgICB0b2tlbiA6T3RoZXIsICAgICAgICAnbngnCisgICAgICAgIHRva2VuIDpUYWcsICAgICAgICAgICdudCcKKyAgICAgICAgdG9rZW4gOlZhcmlhYmxlLCAgICAgJ252JyBkbworICAgICAgICAgIHRva2VuIDpDbGFzcywgICAgICAndmMnCisgICAgICAgICAgdG9rZW4gOkdsb2JhbCwgICAgICd2ZycKKyAgICAgICAgICB0b2tlbiA6SW5zdGFuY2UsICAgJ3ZpJworICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICB0b2tlbiA6TGl0ZXJhbCwgICAgICAnbCcgZG8KKyAgICAgICAgdG9rZW4gOkRhdGUsICAgICAgICdsZCcKKworICAgICAgICB0b2tlbiA6U3RyaW5nLCAgICAgJ3MnIGRvCisgICAgICAgICAgdG9rZW4gOkJhY2t0aWNrLCAnc2InCisgICAgICAgICAgdG9rZW4gOkNoYXIsICAgICAnc2MnCisgICAgICAgICAgdG9rZW4gOkRvYywgICAgICAnc2QnCisgICAgICAgICAgdG9rZW4gOkRvdWJsZSwgICAnczInCisgICAgICAgICAgdG9rZW4gOkVzY2FwZSwgICAnc2UnCisgICAgICAgICAgdG9rZW4gOkhlcmVkb2MsICAnc2gnCisgICAgICAgICAgdG9rZW4gOkludGVycG9sLCAnc2knCisgICAgICAgICAgdG9rZW4gOk90aGVyLCAgICAnc3gnCisgICAgICAgICAgdG9rZW4gOlJlZ2V4LCAgICAnc3InCisgICAgICAgICAgdG9rZW4gOlNpbmdsZSwgICAnczEnCisgICAgICAgICAgdG9rZW4gOlN5bWJvbCwgICAnc3MnCisgICAgICAgIGVuZAorCisgICAgICAgIHRva2VuIDpOdW1iZXIsICAgICAnbScgZG8KKyAgICAgICAgICB0b2tlbiA6RmxvYXQsICAgICdtZicKKyAgICAgICAgICB0b2tlbiA6SGV4LCAgICAgICdtaCcKKyAgICAgICAgICB0b2tlbiA6SW50ZWdlciwgICdtaScgZG8KKyAgICAgICAgICAgIHRva2VuIDpMb25nLCAgICdpbCcKKyAgICAgICAgICBlbmQKKyAgICAgICAgICB0b2tlbiA6T2N0LCAgICAgICdtbycKKyAgICAgICAgICB0b2tlbiA6QmluLCAgICAgICdtYicKKyAgICAgICAgICB0b2tlbiA6T3RoZXIsICAgICdteCcKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgdG9rZW4gOk9wZXJhdG9yLCAnbycgZG8KKyAgICAgICAgdG9rZW4gOldvcmQsICAgJ293JworICAgICAgZW5kCisKKyAgICAgIHRva2VuIDpQdW5jdHVhdGlvbiwgJ3AnIGRvCisgICAgICAgIHRva2VuIDpJbmRpY2F0b3IsICdwaScKKyAgICAgIGVuZAorCisgICAgICB0b2tlbiA6Q29tbWVudCwgICAgICdjJyBkbworICAgICAgICB0b2tlbiA6RG9jLCAgICAgICAnY2QnCisgICAgICAgIHRva2VuIDpNdWx0aWxpbmUsICdjbScKKyAgICAgICAgdG9rZW4gOlByZXByb2MsICAgJ2NwJworICAgICAgICB0b2tlbiA6U2luZ2xlLCAgICAnYzEnCisgICAgICAgIHRva2VuIDpTcGVjaWFsLCAgICdjcycKKyAgICAgIGVuZAorCisgICAgICB0b2tlbiA6R2VuZXJpYywgICAgICAnZycgZG8KKyAgICAgICAgdG9rZW4gOkRlbGV0ZWQsICAgICdnZCcKKyAgICAgICAgdG9rZW4gOkVtcGgsICAgICAgICdnZScKKyAgICAgICAgdG9rZW4gOkVycm9yLCAgICAgICdncicKKyAgICAgICAgdG9rZW4gOkhlYWRpbmcsICAgICdnaCcKKyAgICAgICAgdG9rZW4gOkluc2VydGVkLCAgICdnaScKKyAgICAgICAgdG9rZW4gOk91dHB1dCwgICAgICdnbycKKyAgICAgICAgdG9rZW4gOlByb21wdCwgICAgICdncCcKKyAgICAgICAgdG9rZW4gOlN0cm9uZywgICAgICdncycKKyAgICAgICAgdG9rZW4gOlN1YmhlYWRpbmcsICdndScKKyAgICAgICAgdG9rZW4gOlRyYWNlYmFjaywgICdndCcKKyAgICAgICAgdG9rZW4gOkxpbmVubywgICAgICdnbCcKKyAgICAgIGVuZAorCisgICAgICAjIGNvbnZlbmllbmNlCisgICAgICBOdW0gPSBMaXRlcmFsOjpOdW1iZXIKKyAgICAgIFN0ciA9IExpdGVyYWw6OlN0cmluZworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS91dGlsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS91dGlsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTY4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvbGliL3JvdWdlL3V0aWwucmIKQEAgLTAsMCArMSwxMDEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotICMKKworbW9kdWxlIFJvdWdlCisgIGNsYXNzIEluaGVyaXRhYmxlSGFzaCA8IEhhc2gKKyAgICBkZWYgaW5pdGlhbGl6ZShwYXJlbnQ9bmlsKQorICAgICAgQHBhcmVudCA9IHBhcmVudAorICAgIGVuZAorCisgICAgZGVmIFtdKGspCisgICAgICBfc3VwID0gc3VwZXIKKyAgICAgIHJldHVybiBfc3VwIGlmIG93bl9rZXlzLmluY2x1ZGU/KGspCisKKyAgICAgIF9zdXAgfHwgcGFyZW50W2tdCisgICAgZW5kCisKKyAgICBkZWYgcGFyZW50CisgICAgICBAcGFyZW50IHx8PSB7fQorICAgIGVuZAorCisgICAgZGVmIGluY2x1ZGU/KGspCisgICAgICBzdXBlciBvciBwYXJlbnQuaW5jbHVkZT8oaykKKyAgICBlbmQKKworICAgIGRlZiBlYWNoKCZiKQorICAgICAga2V5cy5lYWNoIGRvIHxrfAorICAgICAgICBiLmNhbGwoaywgc2VsZltrXSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgYWxpYXMgb3duX2tleXMga2V5cworICAgIGRlZiBrZXlzCisgICAgICBrZXlzID0gb3duX2tleXMuY29uY2F0KHBhcmVudC5rZXlzKQorICAgICAga2V5cy51bmlxIQorICAgICAga2V5cworICAgIGVuZAorICBlbmQKKworICBjbGFzcyBJbmhlcml0YWJsZUxpc3QKKyAgICBpbmNsdWRlIEVudW1lcmFibGUKKworICAgIGRlZiBpbml0aWFsaXplKHBhcmVudD1uaWwpCisgICAgICBAcGFyZW50ID0gcGFyZW50CisgICAgZW5kCisKKyAgICBkZWYgcGFyZW50CisgICAgICBAcGFyZW50IHx8PSBbXQorICAgIGVuZAorCisgICAgZGVmIGVhY2goJmIpCisgICAgICByZXR1cm4gZW51bV9mb3IoOmVhY2gpIHVubGVzcyBibG9ja19naXZlbj8KKworICAgICAgcGFyZW50LmVhY2goJmIpCisgICAgICBvd25fZW50cmllcy5lYWNoKCZiKQorICAgIGVuZAorCisgICAgZGVmIG93bl9lbnRyaWVzCisgICAgICBAb3duX2VudHJpZXMgfHw9IFtdCisgICAgZW5kCisKKyAgICBkZWYgcHVzaChvKQorICAgICAgb3duX2VudHJpZXMgPDwgbworICAgIGVuZAorICAgIGFsaWFzIDw8IHB1c2gKKyAgZW5kCisKKyAgIyBzaGFyZWQgbWV0aG9kcyBmb3Igc29tZSBpbmRlbnRhdGlvbi1zZW5zaXRpdmUgbGV4ZXJzCisgIG1vZHVsZSBJbmRlbnRhdGlvbgorICAgIGRlZiByZXNldCEKKyAgICAgIHN1cGVyCisgICAgICBAYmxvY2tfc3RhdGUgPSBAYmxvY2tfaW5kZW50YXRpb24gPSBuaWwKKyAgICBlbmQKKworICAgICMgcHVzaCBhIHN0YXRlIGZvciB0aGUgbmV4dCBpbmRlbnRlZCBibG9jaworICAgIGRlZiBzdGFydHNfYmxvY2soYmxvY2tfc3RhdGUpCisgICAgICBAYmxvY2tfc3RhdGUgPSBibG9ja19zdGF0ZQorICAgICAgQGJsb2NrX2luZGVudGF0aW9uID0gQGxhc3RfaW5kZW50YXRpb24gfHwgJycKKyAgICAgIHB1dHMgIiAgICBzdGFydHNfYmxvY2sgI3tibG9ja19zdGF0ZS5pbnNwZWN0fSIgaWYgQGRlYnVnCisgICAgICBwdXRzICIgICAgYmxvY2tfaW5kZW50YXRpb246ICN7QGJsb2NrX2luZGVudGF0aW9uLmluc3BlY3R9IiBpZiBAZGVidWcKKyAgICBlbmQKKworICAgICMgaGFuZGxlIGEgc2luZ2xlIGluZGVudGVkIGxpbmUKKyAgICBkZWYgaW5kZW50YXRpb24oaW5kZW50X3N0cikKKyAgICAgIHB1dHMgIiAgICBpbmRlbnRhdGlvbiAje2luZGVudF9zdHIuaW5zcGVjdH0iIGlmIEBkZWJ1ZworICAgICAgcHV0cyAiICAgIGJsb2NrX2luZGVudGF0aW9uOiAje0BibG9ja19pbmRlbnRhdGlvbi5pbnNwZWN0fSIgaWYgQGRlYnVnCisgICAgICBAbGFzdF9pbmRlbnRhdGlvbiA9IGluZGVudF9zdHIKKworICAgICAgIyBpZiBpdCdzIGFuIGluZGVudCBhbmQgd2Uga25vdyB3aGVyZSB0byBnbyBuZXh0LAorICAgICAgIyBwdXNoIHRoYXQgc3RhdGUuICBvdGhlcndpc2UsIHB1c2ggY29udGVudCBhbmQKKyAgICAgICMgY2xlYXIgdGhlIGJsb2NrIHN0YXRlLgorICAgICAgaWYgKEBibG9ja19zdGF0ZSAmJgorICAgICAgICAgIGluZGVudF9zdHIuc3RhcnRfd2l0aD8oQGJsb2NrX2luZGVudGF0aW9uKSAmJgorICAgICAgICAgIGluZGVudF9zdHIgIT0gQGJsb2NrX2luZGVudGF0aW9uCisgICAgICApCisgICAgICAgIHB1c2ggQGJsb2NrX3N0YXRlCisgICAgICBlbHNlCisgICAgICAgIEBibG9ja19zdGF0ZSA9IEBibG9ja19pbmRlbnRhdGlvbiA9IG5pbAorICAgICAgICBwdXNoIDpjb250ZW50CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdmVyc2lvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9saWIvcm91Z2UvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWU3OTVkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvcm91Z2UtMS4xMS4xL2xpYi9yb3VnZS92ZXJzaW9uLnJiCkBAIC0wLDAgKzEsNyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0gIworCittb2R1bGUgUm91Z2UKKyAgZGVmIHNlbGYudmVyc2lvbgorICAgICIxLjExLjEiCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvcm91Z2UuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3JvdWdlLTEuMTEuMS9yb3VnZS5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDU2YzAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9yb3VnZS0xLjExLjEvcm91Z2UuZ2Vtc3BlYwpAQCAtMCwwICsxLDE4IEBACityZXF1aXJlICcuL2xpYi9yb3VnZS92ZXJzaW9uJworCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICBzLm5hbWUgPSAicm91Z2UiCisgIHMudmVyc2lvbiA9IFJvdWdlLnZlcnNpb24KKyAgcy5hdXRob3JzID0gWyJKZWFuaW5lIEFka2lzc29uIl0KKyAgcy5lbWFpbCA9IFsiam5lZW5Aam5lZW4ubmV0Il0KKyAgcy5zdW1tYXJ5ID0gIkEgcHVyZS1ydWJ5IGNvbG9yaXplciBiYXNlZCBvbiBweWdtZW50cyIKKyAgcy5kZXNjcmlwdGlvbiA9IDw8LWRlc2Muc3RyaXAuZ3N1YigvXHMrLywgJyAnKQorICAgIFJvdWdlIGFpbXMgdG8gYSBiZSBhIHNpbXBsZSwgZWFzeS10by1leHRlbmQgZHJvcC1pbiByZXBsYWNlbWVudAorICAgIGZvciBweWdtZW50cy4KKyAgZGVzYworICBzLmhvbWVwYWdlID0gImh0dHA6Ly9yb3VnZS5qbmVlbi5uZXQvIgorICBzLnJ1Ynlmb3JnZV9wcm9qZWN0ID0gInJvdWdlIgorICBzLmZpbGVzID0gRGlyWydHZW1maWxlJywgJ0xJQ0VOU0UnLCAncm91Z2UuZ2Vtc3BlYycsICdsaWIvKiovKi5yYicsICdsaWIvKiovKi55bWwnLCAnYmluL3JvdWdpZnknLCAnbGliL3JvdWdlL2RlbW9zLyonXQorICBzLmV4ZWN1dGFibGVzID0gJXcocm91Z2lmeSkKKyAgcy5saWNlbnNlID0gJ01JVCwgMi1jbGF1c2UgQlNEJworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvLmdpdGlnbm9yZSBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDRiMTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitHZW1maWxlLmxvY2sKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC8udHJhdmlzLnltbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFmZGJhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40Ly50cmF2aXMueW1sCkBAIC0wLDAgKzEsNDggQEAKK2xhbmd1YWdlOgorICBydWJ5CisKK2JlZm9yZV9pbnN0YWxsOgorICBnZW0gaW5zdGFsbCBidW5kbGVyCisKK3NjcmlwdDoKKyAgYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCisKK3J2bToKKyAgLSBydWJ5LWhlYWQKKyAgLSAyLjAuMAorICAtIDEuOS4zCisgIC0gMS45LjIKKyAgLSAxLjguNworICAtIHJieC0xOW1vZGUKKyAgLSByYngtMThtb2RlCisgIC0ganJ1YnktaGVhZAorICAtIGpydWJ5LTE5bW9kZQorICAtIGpydWJ5LTE4bW9kZQorICAtIHJlZQorCitlbnY6CisgIC0gWUFNTEVSPXN5Y2sKKyAgLSBZQU1MRVI9cHN5Y2gKKworbWF0cml4OgorICBhbGxvd19mYWlsdXJlczoKKyAgICAtIHJ2bTogcnVieS1oZWFkCisgICAgLSBydm06IHJieC0xOW1vZGUKKyAgICAtIHJ2bTogcmJ4LTE4bW9kZQorICAgIC0gcnZtOiBqcnVieS1oZWFkCisgICAgLSBydm06IHJlZQorCisgIGV4Y2x1ZGU6CisgICAgLSBydm06IDEuOC43CisgICAgICBlbnY6IFlBTUxFUj1wc3ljaAorICAgIC0gcnZtOiBqcnVieS1oZWFkCisgICAgICBlbnY6IFlBTUxFUj1zeWNrCisgICAgLSBydm06IGpydWJ5LTE5bW9kZQorICAgICAgZW52OiBZQU1MRVI9c3ljaworICAgIC0gcnZtOiBqcnVieS0xOG1vZGUKKyAgICAgIGVudjogWUFNTEVSPXN5Y2sKKworYnJhbmNoZXM6CisgIG9ubHk6CisgICAgLSBtYXN0ZXIKKwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L0NIQU5HRVMubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvQ0hBTkdFUy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg3YjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L0NIQU5HRVMubWQKQEAgLTAsMCArMSwxNDkgQEAKKzEuMC4yCistLS0tLQorCistIGFkZGVkIHdhcm5pbmcgd2hlbiB1c2luZyBQc3ljaCArIGFuIG9sZGVyIHZlcnNpb24gb2YgbGlieWFtbAorCisxLjAuMQorLS0tLS0KKworLSBmaXhlZCBoYW5kbGluZyBmb3Igc3RyaW5ncyB0aGF0IGxvb2sgbGlrZSAoaW52YWxpZCkgZGF0ZXMKKworMS4wLjAKKy0tLS0tCisKKy0gdXBkYXRlZCBkYXRlIHBhcnNpbmcgdG8gdXNlIGxvY2FsIHRpbWV6b25lCistICoqbm93IHJlcXVpcmluZyAic2FmZV95YW1sL2xvYWQiIHByb3ZpZGVzIGBTYWZlWUFNTC5sb2FkYCB3aXRob3V0IGNsb2JiZXJpbmcgYFlBTUxgKioKKy0gZml4ZWQgaGFuZGxpbmcgb2YgZW1wdHkgZmlsZXMKKy0gZml4ZWQgc29tZSAoZWRnZSBjYXNlKSBpbnRlZ2VyIHBhcnNpbmcgYnVncworLSBmaXhlZCBzb21lIEpSdWJ5LXNwZWNpZmljIGlzc3VlcworCiswLjkuNworLS0tLS0KKworLSBtYWRlIGhhbmRsaW5nIG9mIGRvY3VtZW50IGZyb250bWF0dGVyIG1vcmUgcm9idXN0CistIGFkZGVkIG1vcmUgZGVzY3JpcHRpdmUgbWVzc2FnZSB0byB0aGUgd2FybmluZyBmb3Igb21pdHRpbmcgdGhlIDpzYWZlIG9wdGlvbgorCiswLjkuNgorLS0tLS0KKworLSBmaXhlZCBoYW5kbGluZyBvZiBmaWxlcyB3aXRoIHRyYWlsaW5nIGNvbnRlbnQgKGFmdGVyIGNsb3NpbmcgYC0tLWApCisKKzAuOS41CistLS0tLQorCistIGZpeGVkIHBlcm1pc3Npb25zIEFHQUlOCisKKzAuOS40CistLS0tLQorCistIGNvcnJlY3RlZCBoYW5kbGluZyBvZiBzeW1ib2xzCisKKzAuOS4zCistLS0tLQorCistIGZpeGVkIHBlcm1pc3Npb25zIDooCisKKzAuOS4yCistLS0tLQorCistIGZpeGVkIGVycm9yIHcvIHBhcnNpbmcgIiEiIHdoZW4gd2hpdGVsaXN0aW5nIHRhZ3MKKy0gZml4ZWQgcGFyc2luZyBvZiB0aGUgbnVtYmVyIDAgKGQnb2ghKQorCiswLjkuMQorLS0tLS0KKworLSBhZGRlZCBZZWNodCBzdXBwb3J0IChKUnVieSkKKy0gbW9yZSBidWcgZml4ZXMKKworMC45LjAKKy0tLS0tCisKKy0gYWRkZWQgYHdoaXRlbGlzdCFgIG1ldGhvZCBmb3IgZWFzaWx5IHdoaXRlbGlzdGluZyB0YWdzCistIGFkZGVkIHN1cHBvcnQgZm9yIGNhbGwtc3BlY2lmaWMgb3B0aW9ucworLSByZW1vdmVkIGRlcHJlY2F0ZWQgbWV0aG9kcworCiswLjguNgorLS0tLS0KKworLSBmaXhlZCBidWcgaW4gZmxvYXQgbWF0Y2hlcgorCiswLjguNQorLS0tLS0KKworLSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMKKy0gbWFkZSBsZXNzIHZlcmJvc2UgYnkgZGVmYXVsdAorLSBidWcgZml4ZXMKKworMC44LjQKKy0tLS0tCisKKy0gZW5oYW5jZW1lbnRzIHRvIHBhcnNpbmcgb2YgaW50ZWdlcnMsIGZsb2F0cywgYW5kIGRhdGVzCistIHVwZGF0ZWQgYnVpbHQtaW4gd2hpdGVsaXN0CistIG1vcmUgYnVnIGZpeGVzCisKKzAuOC4zCistLS0tLQorCistIGZpeGVkIGV4Y2VwdGlvbiBvbiBwYXJzaW5nIGVtcHR5IGRvY3VtZW50CistIGZpeGVkIGhhbmRsaW5nIG9mIG9jdGFsICYgaGV4YWRlY2ltYWwgbnVtYmVycworCiswLjguMgorLS0tLS0KKworLSBidWcgZml4ZXMKKworMC44LjEKKy0tLS0tCisKKy0gYWRkZWQgYDpyYWlzZV9vbl91bmtub3duX3RhZ2Agb3B0aW9uCistIHJlbmFtZWQgYHJlc2V0X2RlZmF1bHRzIWAgdG8gYHJlc3RvcmVfZGVmYXVsdHMhYAorCiswLjgKKy0tLQorCistIGFkZGVkIHRhZyB3aGl0ZWxpc3RpbmcKKy0gbW9yZSBBUEkgY2hhbmdlcworCiswLjcKKy0tLQorCistIHNlcGFyYXRlZCBZQU1MIGVuZ2luZSBzdXBwb3J0IGZyb20gUnVieSB2ZXJzaW9uCistIGFkZGVkIHN1cHBvcnQgZm9yIGJpbmFyeSBzY2FsYXJzCistIG51bWVyb3VzIGJ1ZyBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzCisKKzAuNgorLS0tCisKKy0gc2V2ZXJhbCBBUEkgY2hhbmdlcworLSBhZGRlZCBgU2FmZVlBTUw6Ok9QVElPTlNgIGZvciBzcGVjaWZ5aW5nIGRlZmF1bHQgYmVoYXZpb3IKKworMC41CistLS0KKworQWRkZWQgc3VwcG9ydCBmb3IgZGF0ZXMKKworMC40CistLS0KKworLSBlZmZpY2llbmN5IGltcHJvdmVtZW50cworLSBtYWRlIGBZQU1MLmxvYWRgIHVzZSBgWUFNTC5zYWZlX2xvYWRgIGJ5IGRlZmF1bHQKKy0gbWFkZSBzeW1ib2wgZGVzZXJpYWxpemF0aW9uIG9wdGlvbmFsCisKKzAuMworLS0tCisKK0FkZGVkIFN5Y2sgc3VwcG9ydAorCiswLjIKKy0tLQorCitBZGRlZCBzdXBwb3J0IGZvcjoKKworLSBhbmNob3JzICYgYWxpYXNlcworLSBib29sZWFucworLSBuaWxzCisKKzAuMQorLS0tCisKK0luaXRpYWwgcmVsZWFzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9HZW1maWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L0dlbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkN2UzZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9HZW1maWxlCkBAIC0wLDAgKzEsMTEgQEAKK3NvdXJjZSAiaHR0cHM6Ly9ydWJ5Z2Vtcy5vcmciCisKK2dlbXNwZWMKKworZ3JvdXAgOmRldmVsb3BtZW50IGRvCisgIGdlbSAiaGFzaGllIgorICBnZW0gImhlcmVkb2NfdW5pbmRlbnQiCisgIGdlbSAicmFrZSIKKyAgZ2VtICJyc3BlYyIKKyAgZ2VtICJ0cmF2aXMtbGludCIKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L0xJQ0VOU0UudHh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMjc2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvTElDRU5TRS50eHQKQEAgLTAsMCArMSwyMiBAQAorQ29weXJpZ2h0IChjKSAyMDEzIERhbiBUYW8KKworTUlUIExpY2Vuc2UKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiN2JkYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9SRUFETUUubWQKQEAgLTAsMCArMSwxOTEgQEAKK1NhZmVZQU1MCis9PT09PT09PQorCitbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9kdGFvL3NhZmVfeWFtbC5wbmcpXShodHRwOi8vdHJhdmlzLWNpLm9yZy9kdGFvL3NhZmVfeWFtbCkKK1shW0dlbSBWZXJzaW9uXShodHRwczovL2JhZGdlLmZ1cnkuaW8vcmIvc2FmZV95YW1sLnBuZyldKGh0dHA6Ly9iYWRnZS5mdXJ5LmlvL3JiL3NhZmVfeWFtbCkKKworVGhlICoqU2FmZVlBTUwqKiBnZW0gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgYFlBTUwubG9hZGAgc3VpdGFibGUgZm9yIGFjY2VwdGluZyB1c2VyIGlucHV0IGluIFJ1YnkgYXBwbGljYXRpb25zLiBVbmxpa2UgUnVieSdzIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIG9mIGBZQU1MLmxvYWRgLCBTYWZlWUFNTCdzIHZlcnNpb24gd2lsbCBub3QgZXhwb3NlIGFwcHMgdG8gYXJiaXRyYXJ5IGNvZGUgZXhlY3V0aW9uIGV4cGxvaXRzIChzdWNoIGFzIFt0aGUgb25lcyBkaXNjb3ZlcmVkXShodHRwOi8vd3d3LnJlZGRpdC5jb20vci9uZXRzZWMvY29tbWVudHMvMTY3YzExL3NlcmlvdXNfdnVsbmVyYWJpbGl0eV9pbl9ydWJ5X29uX3JhaWxzX2FsbG93aW5nLykgW2luIFJhaWxzIGluIGVhcmx5IDIwMTNdKGh0dHA6Ly93d3cuaC1vbmxpbmUuY29tL29wZW4vbmV3cy9pdGVtL1JhaWxzLWRldmVsb3BlcnMtY2xvc2UtYW5vdGhlci1leHRyZW1lbHktY3JpdGljYWwtZmxhdy0xNzkzNTExLmh0bWwpKS4KKworKipJZiB5b3UgZW5jb3VudGVyIGFueSBpc3N1ZXMgd2l0aCBTYWZlWUFNTCwgY2hlY2sgb3V0IHRoZSAnQ29tbW9uIElzc3Vlcycgc2VjdGlvbiBiZWxvdy4qKiBJZiB5b3UgZG9uJ3Qgc2VlIGFueXRoaW5nIHRoYXQgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIHlvdSdyZSBleHBlcmllbmNpbmcsIGJ5IGFsbCBtZWFucywgW2NyZWF0ZSBhbiBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2R0YW8vc2FmZV95YW1sL2lzc3Vlcy9uZXcpIQorCitJbnN0YWxsYXRpb24KKy0tLS0tLS0tLS0tLQorCitBZGQgdGhpcyBsaW5lIHRvIHlvdXIgYXBwbGljYXRpb24ncyBHZW1maWxlOgorCitgYGBydWJ5CitnZW0gInNhZmVfeWFtbCIKK2BgYAorCitDb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tCisKK0lmICphbGwgeW91IGRvKiBpcyBhZGQgU2FmZVlBTUwgdG8geW91ciBwcm9qZWN0LCB0aGVuIGBZQU1MLmxvYWRgIHdpbGwgb3BlcmF0ZSBpbiAic2FmZSIgbW9kZSwgd2hpY2ggbWVhbnMgaXQgd29uJ3QgZGVzZXJpYWxpemUgYXJiaXRyYXJ5IG9iamVjdHMuIEhvd2V2ZXIsIGl0IHdpbGwgaXNzdWUgYSB3YXJuaW5nIHRoZSBmaXJzdCB0aW1lIHlvdSBjYWxsIGl0IGJlY2F1c2UgeW91IGhhdmVuJ3QgZXhwbGljaXRseSBzcGVjaWZpZWQgd2hldGhlciB5b3Ugd2FudCBzYWZlIG9yIHVuc2FmZSBiZWhhdmlvciBieSBkZWZhdWx0LiBUbyBzcGVjaWZ5IHRoaXMgYmVoYXZpb3IgKGUuZy4sIGluIGEgUmFpbHMgaW5pdGlhbGl6ZXIpOgorCitgYGBydWJ5CitTYWZlWUFNTDo6T1BUSU9OU1s6ZGVmYXVsdF9tb2RlXSA9IDpzYWZlICMgb3IgOnVuc2FmZQorYGBgCisKK0Fub3RoZXIgaW1wb3J0YW50IG9wdGlvbiB5b3UgbWlnaHQgd2FudCB0byBzcGVjaWZ5IG9uIHN0YXJ0dXAgaXMgd2hldGhlciBvciBub3QgdG8gYWxsb3cgKnN5bWJvbHMqIHRvIGJlIGRlc2VyaWFsaXplZC4gVGhlIGRlZmF1bHQgc2V0dGluZyBpcyBgZmFsc2VgLCBzaW5jZSBzeW1ib2xzIGFyZSBub3QgZ2FyYmFnZSBjb2xsZWN0ZWQgaW4gUnVieSBhbmQgc28gZGVzZXJpYWxpemluZyB0aGVtIGZyb20gWUFNTCBtYXkgcmVuZGVyIHlvdXIgYXBwbGljYXRpb24gdnVsbmVyYWJsZSB0byBhIERPUyAoZGVuaWFsIG9mIHNlcnZpY2UpIGF0dGFjay4gVG8gYWxsb3cgc3ltYm9sIGRlc2VyaWFsaXphdGlvbiBieSBkZWZhdWx0OgorCitgYGBydWJ5CitTYWZlWUFNTDo6T1BUSU9OU1s6ZGVzZXJpYWxpemVfc3ltYm9sc10gPSB0cnVlCitgYGAKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgYW5kIG90aGVyIG9wdGlvbnMsIHNlZSB0aGUgIlVzYWdlIiBzZWN0aW9uIGRvd24gYmVsb3cuCisKK1doYXQgaXMgdGhpcyBnZW0gZm9yLCBleGFjdGx5PworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N1cHBvc2UgeW91ciBhcHBsaWNhdGlvbiB3ZXJlIHRvIHVzZSBhIHBvcHVsYXIgb3BlbiBzb3VyY2UgbGlicmFyeSB3aGljaCBjb250YWluZWQgY29kZSBsaWtlIHRoaXM6CisKK2BgYHJ1YnkKK2NsYXNzIENsYXNzQnVpbGRlcgorICBkZWYgW109KGtleSwgdmFsdWUpCisgICAgQGNsYXNzIHx8PSBDbGFzcy5uZXcKKworICAgIEBjbGFzcy5jbGFzc19ldmFsIDw8LUVPUworICAgICAgZGVmICN7a2V5fQorICAgICAgICAje3ZhbHVlfQorICAgICAgZW5kCisgICAgRU9TCisgIGVuZAorCisgIGRlZiBjcmVhdGUKKyAgICBAY2xhc3MubmV3CisgIGVuZAorZW5kCitgYGAKKworTm93LCBpZiB5b3Ugd2VyZSB0byB1c2UgYFlBTUwubG9hZGAgb24gdXNlciBpbnB1dCBhbnl3aGVyZSBpbiB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgdGhlIFNhZmVZQU1MIGdlbSBpbnN0YWxsZWQsIGFuIGF0dGFja2VyIHdobyBzdXNwZWN0ZWQgeW91IHdlcmUgdXNpbmcgdGhpcyBsaWJyYXJ5IGNvdWxkIHNlbmQgYSByZXF1ZXN0IHdpdGggYSBjYXJlZnVsbHktY3JhZnRlZCBZQU1MIHN0cmluZyB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlICh5ZXMsIGluY2x1ZGluZyBgc3lzdGVtKCJ1bml4IGNvbW1hbmQiKWApIG9uIHlvdXIgc2VydmVycy4KKworVGhpcyBzaW1wbGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHZ1bG5lcmFiaWxpdHk6CisKK2BgYHJ1YnkKK3lhbWwgPSA8PC1FT1lBTUwKKy0tLSAhcnVieS9oYXNoOkNsYXNzQnVpbGRlcgorImZvbzsgZW5kOyBwdXRzICUoSSdtIGluIHlyIHN5c3RlbSEpOyBkZWYgYmFyIjogImJheiIKK0VPWUFNTAorYGBgCisKKyAgICA+IFlBTUwubG9hZCh5YW1sKQorICAgIEknbSBpbiB5ciBzeXN0ZW0hCisgICAgPT4gIzxDbGFzc0J1aWxkZXI6MHgwMDdmZGJiZTJlMjVkOCBAY2xhc3M9IzxDbGFzczoweDAwN2ZkYmJlMmUyNTEwPj4KKworV2l0aCBTYWZlWUFNTCwgdGhlIHNhbWUgYXR0YWNrZXIgd291bGQgYmUgdGh3YXJ0ZWQ6CisKKyAgICA+IHJlcXVpcmUgInNhZmVfeWFtbCIKKyAgICA9PiB0cnVlCisgICAgPiBZQU1MLmxvYWQoeWFtbCwgOnNhZmUgPT4gdHJ1ZSkKKyAgICA9PiB7ImZvbzsgZW5kOyBwdXRzICUoSSdtIGluIHlyIHN5c3RlbSEpOyBkZWYgYmFyIj0+ImJheiJ9CisKK1VzYWdlCistLS0tLQorCitXaGVuIHlvdSByZXF1aXJlIHRoZSBzYWZlX3lhbWwgZ2VtIGluIHlvdXIgcHJvamVjdCwgYFlBTUwubG9hZGAgaXMgcGF0Y2hlZCB0byBhY2NlcHQgb25lIGFkZGl0aW9uYWwgKG9wdGlvbmFsKSBgb3B0aW9uc2AgcGFyYW1ldGVyLiBUaGlzIGNoYW5nZXMgdGhlIG1ldGhvZCBzaWduYXR1cmUgYXMgZm9sbG93czoKKworLSBmb3IgU3ljayBhbmQgUHN5Y2ggcHJpb3IgdG8gUnVieSAxLjkuMzogYFlBTUwubG9hZCh5YW1sLCBvcHRpb25zPXt9KWAKKy0gZm9yIFBzeWNoIGluIDEuOS4zIGFuZCBsYXRlcjogYFlBTUwubG9hZCh5YW1sLCBmaWxlbmFtZT1uaWwsIG9wdGlvbnM9e30pYAorCitUaGUgbW9zdCBpbXBvcnRhbnQgb3B0aW9uIGlzIHRoZSBgOnNhZmVgIG9wdGlvbiAoZGVmYXVsdDogYHRydWVgKSwgd2hpY2ggY29udHJvbHMgd2hldGhlciBvciBub3QgdG8gZGVzZXJpYWxpemUgYXJiaXRyYXJ5IG9iamVjdHMgd2hlbiBwYXJzaW5nIGEgWUFNTCBkb2N1bWVudC4gVGhlIG90aGVyIG9wdGlvbnMsIGFsb25nIHdpdGggZXhwbGFuYXRpb25zLCBhcmUgYXMgZm9sbG93cy4KKworLSBgOmRlc2VyaWFsaXplX3N5bWJvbHNgIChkZWZhdWx0OiBgZmFsc2VgKTogQ29udHJvbHMgd2hldGhlciBvciBub3QgWUFNTCB3aWxsIGRlc2VyaWFsaXplIHN5bWJvbHMuIEl0IGlzIHByb2JhYmx5IGJlc3QgdG8gb25seSBlbmFibGUgdGhpcyBvcHRpb24gd2hlcmUgbmVjZXNzYXJ5LCBlLmcuIHRvIG1ha2UgdHJ1c3RlZCBsaWJyYXJpZXMgd29yay4gU3ltYm9scyByZWNlaXZlIHNwZWNpYWwgdHJlYXRtZW50IGluIFJ1YnkgYW5kIGFyZSBub3QgZ2FyYmFnZSBjb2xsZWN0ZWQsIHdoaWNoIG1lYW5zIGRlc2VyaWFsaXppbmcgdGhlbSBpbmRpc2NyaW1pbmF0ZWx5IG1heSByZW5kZXIgeW91ciBzaXRlIHZ1bG5lcmFibGUgdG8gYSBET1MgYXR0YWNrLgorCistIGA6d2hpdGVsaXN0ZWRfdGFnc2A6IEFjY2VwdHMgYW4gYXJyYXkgb2YgWUFNTCB0YWdzIHRoYXQgZGVzaWduYXRlIHRydXN0ZWQgdHlwZXMsIGUuZy4sIG9uZXMgdGhhdCBjYW4gYmUgZGVzZXJpYWxpemVkIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgYW55IHJlc3VsdGluZyBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIFdoZW4gYW55IG9mIHRoZSBnaXZlbiB0YWdzIGFyZSBlbmNvdW50ZXJlZCBpbiBhIFlBTUwgZG9jdW1lbnQsIHRoZSBhc3NvY2lhdGVkIGRhdGEgd2lsbCBiZSBwYXJzZWQgYnkgdGhlIHVuZGVybHlpbmcgWUFNTCBlbmdpbmUgKFN5Y2sgb3IgUHN5Y2gpIGZvciB0aGUgdmVyc2lvbiBvZiBSdWJ5IHlvdSBhcmUgdXNpbmcuIFNlZSB0aGUgIldoaXRlbGlzdGluZyBUcnVzdGVkIFR5cGVzIiBzZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCistIGA6Y3VzdG9tX2luaXRpYWxpemVyc2A6IFNpbWlsYXIgdG8gdGhlIGA6d2hpdGVsaXN0ZWRfdGFnc2Agb3B0aW9uLCBidXQgYWxsb3dzIHlvdSB0byBwcm92aWRlIHlvdXIgb3duIGluaXRpYWxpemVycyBmb3Igc3BlY2lmaWVkIHRhZ3MgcmF0aGVyIHRoYW4gdXNpbmcgU3ljayBvciBQc3ljay4gQWNjZXB0cyBhIGhhc2ggd2l0aCBzdHJpbmcgdGFncyBmb3Iga2V5cyBhbmQgbGFtYmRhcyBmb3IgdmFsdWVzLgorCistIGA6cmFpc2Vfb25fdW5rbm93bl90YWdgIChkZWZhdWx0OiBgZmFsc2VgKTogUmVwcmVzZW50cyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBsZXZlbCBvZiBwYXJhbm9pYS4gSWYgdGhlIFlBTUwgZW5naW5lIGVuY291bnRlcnMgYW55IHRhZyBvdGhlciB0aGFuIG9uZXMgdGhhdCBhcmUgYXV0b21hdGljYWxseSB0cnVzdGVkIGJ5IFNhZmVZQU1MIG9yIHRoYXQgeW91J3ZlIGV4cGxpY2l0bHkgd2hpdGVsaXN0ZWQsIGl0IHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLiBUaGlzIG1heSBiZSBhIGdvb2QgY2hvaWNlIGlmIHlvdSBleHBlY3QgdG8gYWx3YXlzIGJlIGRlYWxpbmcgd2l0aCBwZXJmZWN0bHkgc2FmZSBZQU1MIGFuZCB3YW50IHlvdXIgYXBwbGljYXRpb24gdG8gZmFpbCBsb3VkbHkgdXBvbiBlbmNvdW50ZXJpbmcgcXVlc3Rpb25hYmxlIGRhdGEuCisKK0FsbCBvZiB0aGUgYWJvdmUgb3B0aW9ucyBjYW4gYmUgc2V0IGF0IHRoZSBnbG9iYWwgbGV2ZWwgdmlhIGBTYWZlWUFNTDo6T1BUSU9OU2AuIFlvdSBjYW4gYWxzbyBzZXQgZWFjaCBvbmUgaW5kaXZpZHVhbGx5IHBlciBjYWxsIHRvIGBZQU1MLmxvYWRgOyBhbiBvcHRpb24gZXhwbGljaXRseSBwYXNzZWQgdG8gYGxvYWRgIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgYW4gb3B0aW9uIHNwZWNpZmllZCBnbG9iYWxseS4KKworV2hhdCBpZiBJIGRvbid0ICp3YW50KiB0byBwYXRjaCBgWUFNTGA/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworW0V4Y2VsbGVudCBxdWVzdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2R0YW8vc2FmZV95YW1sL2lzc3Vlcy80NykhIFlvdSBjYW4gYWxzbyBnZXQgdGhlIG1ldGhvZHMgYFNhZmVZQU1MLmxvYWRgIGFuZCBgU2FmZVlBTUwubG9hZF9maWxlYCB3aXRob3V0IHRvdWNoaW5nIHRoZSBgWUFNTGAgbW9kdWxlIGF0IGFsbCBsaWtlIHRoaXM6CisKK2BgYHJ1YnkKK3JlcXVpcmUgInNhZmVfeWFtbC9sb2FkIiAjIGluc3RlYWQgb2YgcmVxdWlyZSAic2FmZV95YW1sIgorYGBgCisKK1RoaXMgd2F5LCB5b3UgY2FuIHVzZSBgU2FmZVlBTUwubG9hZGAgdG8gcGFyc2UgWUFNTCB0aGF0ICp5b3UqIGRvbid0IHRydXN0LCB3aXRob3V0IGFmZmVjdGluZyB0aGUgcmVzdCBvZiBhbiBhcHBsaWNhdGlvbiAoaWYgeW91J3JlIGRldmVsb3BpbmcgYSBsaWJyYXJ5LCBmb3IgZXhhbXBsZSkuCisKK1N1cHBvcnRlZCBUeXBlcworLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB3YXkgdGhhdCBTYWZlWUFNTCB3b3JrcyBpcyBieSByZXN0cmljdGluZyB0aGUga2luZHMgb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSBkZXNlcmlhbGl6ZWQgdmlhIGBZQU1MLmxvYWRgLiBNb3JlIHNwZWNpZmljYWxseSwgb25seSB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIG9iamVjdHMgY2FuIGJlIGRlc2VyaWFsaXplZCBieSBkZWZhdWx0OgorCistIEhhc2hlcworLSBBcnJheXMKKy0gU3RyaW5ncworLSBOdW1iZXJzCistIERhdGVzCistIFRpbWVzCistIEJvb2xlYW5zCistIE5pbHMKKworQWdhaW4sIGRlc2VyaWFsaXphdGlvbiBvZiBzeW1ib2xzIGNhbiBiZSBlbmFibGVkIGdsb2JhbGx5IGJ5IHNldHRpbmcgYFNhZmVZQU1MOjpPUFRJT05TWzpkZXNlcmlhbGl6ZV9zeW1ib2xzXSA9IHRydWVgLCBvciBpbiBhIHNwZWNpZmljIGNhbGwgdG8gYFlBTUwubG9hZChbc29tZSB5YW1sXSwgOmRlc2VyaWFsaXplX3N5bWJvbHMgPT4gdHJ1ZSlgLgorCitXaGl0ZWxpc3RpbmcgVHJ1c3RlZCBUeXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2FmZVlBTUwgc3VwcG9ydHMgd2hpdGVsaXN0aW5nIGNlcnRhaW4gWUFNTCB0YWdzIGZvciB0cnVzdGVkIHR5cGVzLiBUaGlzIGlzIGhhbmR5IHdoZW4geW91ciBhcHBsaWNhdGlvbiB1c2VzIFlBTUwgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBjZXJ0YWluIHR5cGVzIG5vdCBsaXN0ZWQgYWJvdmUsIHdoaWNoIHlvdSBrbm93IHRvIGJlIGZyZWUgb2YgYW55IGRlc2VyaWFsaXphdGlvbi1yZWxhdGVkIHZ1bG5lcmFiaWxpdGllcy4KKworVGhlIGVhc2llc3Qgd2F5IHRvIHdoaXRlbGlzdCB0eXBlcyBpcyBieSBjYWxsaW5nIGBTYWZlWUFNTC53aGl0ZWxpc3QhYCwgd2hpY2ggY2FuIGFjY2VwdCBhIHZhcmlhYmxlIG51bWJlciBvZiBzYWZlIHR5cGVzLCBlLmcuOgorCitgYGBydWJ5CitTYWZlWUFNTC53aGl0ZWxpc3QhKEZvbywgQmFyKQorYGBgCisKK1lvdSBjYW4gYWxzbyB3aGl0ZWxpc3QgWUFNTCAqdGFncyogdmlhIHRoZSBgOndoaXRlbGlzdGVkX3RhZ3NgIG9wdGlvbjoKKworYGBgcnVieQorIyBVc2luZyBTeWNrCitTYWZlWUFNTDo6T1BUSU9OU1s6d2hpdGVsaXN0ZWRfdGFnc10gPSBbInRhZzpydWJ5LnlhbWwub3JnLDIwMDI6b2JqZWN0Ok9wZW5TdHJ1Y3QiXQorCisjIFVzaW5nIFBzeWNoCitTYWZlWUFNTDo6T1BUSU9OU1s6d2hpdGVsaXN0ZWRfdGFnc10gPSBbIiFydWJ5L29iamVjdDpPcGVuU3RydWN0Il0KK2BgYAorCitBbmQgaW4gY2FzZSB5b3Ugd2VyZSB3b25kZXJpbmc6IG5vLCB0aGlzIGZlYXR1cmUgd2lsbCAqbm90KiBhbGxvdyB3b3VsZC1iZSBhdHRhY2tlcnMgdG8gZW1iZWQgdW50cnVzdGVkIHR5cGVzIHdpdGhpbiB0cnVzdGVkIHR5cGVzOgorCitgYGBydWJ5Cit5YW1sID0gPDwtRU9ZQU1MCistLS0gIXJ1Ynkvb2JqZWN0Ok9wZW5TdHJ1Y3QgCit0YWJsZTogCisgIDpiYWNrZG9vcjogIXJ1YnkvaGFzaDpDbGFzc0J1aWxkZXIgCisgICAgImZvbzsgZW5kOyBwdXRzICUoSSdtIGluIHlyIHN5c3RlbSEpOyBkZWYgYmFyIjogImJheiIKK0VPWUFNTAorYGBgCisKKyAgICA+IFlBTUwuc2FmZV9sb2FkKHlhbWwpCisgICAgPT4gIzxPcGVuU3RydWN0IDpiYWNrZG9vcj17ImZvbzsgZW5kOyBwdXRzICUoSSdtIGluIHlyIHN5c3RlbSEpOyBkZWYgYmFyIj0+ImJheiJ9PgorCitLbm93biBJc3N1ZXMKKy0tLS0tLS0tLS0tLQorCitJZiB5b3UgYWRkIFNhZmVZQU1MIHRvIHlvdXIgcHJvamVjdCBhbmQgc3RhcnQgc2VlaW5nIGFueSBlcnJvcnMgYWJvdXQgbWlzc2luZyBrZXlzLCBvciB5b3Ugbm90aWNlIG15c3RlcmlvdXMgc3RyaW5ncyB0aGF0IGxvb2sgbGlrZSBgIjpmb28iYCAoaS5lLiwgc3RhcnQgd2l0aCBhIGNvbG9uKSwgaXQncyBsaWtlbHkgeW91J3JlIHNlZWluZyBlcnJvcnMgZnJvbSBzeW1ib2xzIGJlaW5nIHNhdmVkIGluIFlBTUwgZm9ybWF0LiBJZiB5b3UgYXJlIGFibGUgdG8gbW9kaWZ5IHRoZSBvZmZlbmRpbmcgY29kZSwgeW91IG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgY2hhbmdpbmcgeW91ciBZQU1MIGNvbnRlbnQgdG8gdXNlIHBsYWluIHZhbmlsbGEgc3RyaW5ncyBpbnN0ZWFkIG9mIHN5bWJvbHMuIElmIG5vdCwgeW91IG1heSBuZWVkIHRvIHNldCB0aGUgYDpkZXNlcmlhbGl6ZV9zeW1ib2xzYCBvcHRpb24gdG8gYHRydWVgLCBlaXRoZXIgaW4gY2FsbHMgdG8gYFlBTUwubG9hZGAgb3ItLS1hcyBhIGxhc3QgcmVzb3J0LS0tZ2xvYmFsbHksIHdpdGggYFNhZmVZQU1MOjpPUFRJT05TWzpkZXNlcmlhbGl6ZV9zeW1ib2xzXWAuCisKK0Fsc28gYmUgYXdhcmUgdGhhdCBzb21lIFJ1YnkgbGlicmFyaWVzLCBwYXJ0aWN1bGFybHkgdGhvc2UgcmVxdWlyaW5nIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiwgbGV2ZXJhZ2UgWUFNTCdzIG9iamVjdCBkZXNlcmlhbGl6YXRpb24gZnVuY3Rpb25hbGl0eSBhbmQgdGhlcmVmb3JlIG1heSBicmVhayBvciBvdGhlcndpc2UgYmUgaW1wYWN0ZWQgYnkgU2FmZVlBTUwuIFRoZSBmb2xsb3dpbmcgbGlzdCBpbmNsdWRlcyBrbm93biBpbnN0YW5jZXMgb2YgU2FmZVlBTUwncyBpbnRlcmFjdGlvbiB3aXRoIG90aGVyIFJ1YnkgZ2VtczoKKworLSBbKipBY3RpdmVSZWNvcmQqKl0oaHR0cHM6Ly9naXRodWIuY29tL3JhaWxzL3JhaWxzL3RyZWUvbWFzdGVyL2FjdGl2ZXJlY29yZCk6IHVzZXMgWUFNTCB0byBjb250cm9sIHNlcmlhbGl6YXRpb24gb2YgbW9kZWwgb2JqZWN0cyB1c2luZyB0aGUgYHNlcmlhbGl6ZWAgY2xhc3MgbWV0aG9kLiBJZiB5b3UgZmluZCB0aGF0IGFjY2Vzc2luZyBzZXJpYWxpemVkIHByb3BlcnRpZXMgb24geW91ciBBY3RpdmVSZWNvcmQgbW9kZWxzIGlzIGNhdXNpbmcgZXJyb3JzLCBjaGFuY2VzIGFyZSB5b3UgbWF5IG5lZWQgdG86CisgIDEuIHNldCB0aGUgYDpkZXNlcmlhbGl6ZV9zeW1ib2xzYCBvcHRpb24gdG8gYHRydWVgLAorICAyLiB3aGl0ZWxpc3Qgc29tZSBvZiB0aGUgdHlwZXMgaW4geW91ciBzZXJpYWxpemVkIGRhdGEgdmlhIGBTYWZlWUFNTC53aGl0ZWxpc3QhYCBvciB0aGUgYDp3aGl0ZWxpc3RlZF90YWdzYCBvcHRpb24sIG9yCisgIDMuIGJvdGgKKy0gWyoqZGVsYXllZF9qb2IqKl0oaHR0cHM6Ly9naXRodWIuY29tL2NvbGxlY3RpdmVpZGVhL2RlbGF5ZWRfam9iKTogVXNlcyBZQU1MIHRvIHNlcmlhbGl6ZSB0aGUgb2JqZWN0cyBvbiB3aGljaCBkZWxheWVkIG1ldGhvZHMgYXJlIGludm9rZWQgKHdpdGggYGRlbGF5YCkuIFRoZSBzYWZlc3Qgc29sdXRpb24gaW4gdGhpcyBjYXNlIGlzIHRvIHVzZSBgU2FmZVlBTUwud2hpdGVsaXN0IWAgdG8gd2hpdGVsaXN0IHRoZSB0eXBlcyB5b3UgbmVlZCB0byBzZXJpYWxpemUuCistIFsqKkd1YXJkKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9ndWFyZCk6IFVzZXMgWUFNTCBhcyBhIHNlcmlhbGl6YXRpb24gZm9ybWF0IGZvciBub3RpZmljYXRpb25zLiBUaGUgZGF0YSBzZXJpYWxpemVkIHVzZXMgc3ltYm9saWMga2V5cywgc28gc2V0dGluZyBgU2FmZVlBTUw6Ok9QVElPTlNbOmRlc2VyaWFsaXplX3N5bWJvbHNdID0gdHJ1ZWAgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IEd1YXJkIHRvIHdvcmsuCistIFsqKnNpZGVraXEqKl0oaHR0cHM6Ly9naXRodWIuY29tL21wZXJoYW0vc2lkZWtpcSk6IFVzZXMgYSBZQU1MIGNvbmZpZ2l1cmF0aW9uIGZpbGUgd2l0aCBzeW1ib2xpYyBrZXlzLCBzbyBzZXR0aW5nIGBTYWZlWUFNTDo6T1BUSU9OU1s6ZGVzZXJpYWxpemVfc3ltYm9sc10gPSB0cnVlYCBzaG91bGQgYWxsb3cgaXQgdG8gd29yay4KKworVGhlIGFib3ZlIGxpc3Qgd2lsbCBncm93IG92ZXIgdGltZSwgYXMgbW9yZSBpc3N1ZXMgYXJlIGRpc2NvdmVyZWQuCisKK1ZlcnNpb25pbmcKKy0tLS0tLS0tLS0KKworU2FmZVlBTUwgd2lsbCBmb2xsb3cgW3NlbWFudGljIHZlcnNpb25pbmddKGh0dHA6Ly9zZW12ZXIub3JnLykgc28gYW55IHVwZGF0ZXMgdG8gdGhlIGZpcnN0IG1ham9yIHZlcnNpb24gd2lsbCBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4gU28gZXhwZWN0IHByaW1hcmlseSBidWcgZml4ZXMgYW5kIGZlYXR1cmUgZW5oYW5jZW1lbnRzIChpZiBhbnl0aGluZyEpIGZyb20gaGVyZSBvbiBvdXQuLi4gdW5sZXNzIGl0IG1ha2VzIHNlbnNlIHRvIGJyZWFrIHRoZSBpbnRlcmZhY2UgYXQgc29tZSBwb2ludCBhbmQgaW50cm9kdWNlIGEgdmVyc2lvbiAyLjAsIHdoaWNoIEkgaG9uZXN0bHkgdGhpbmsgaXMgdW5saWtlbHkuCisKK1JlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tCisKK1NhZmVZQU1MIHJlcXVpcmVzIFJ1YnkgMS44Ljcgb3IgbmV3ZXIgYW5kIHdvcmtzIHdpdGggYm90aCBbU3lja10oaHR0cDovL3d3dy5ydWJ5LWRvYy5vcmcvc3RkbGliLTEuOC43L2xpYmRvYy95YW1sL3Jkb2MvWUFNTC5odG1sKSBhbmQgW1BzeWNoXShodHRwOi8vZ2l0aHViLmNvbS90ZW5kZXJsb3ZlL3BzeWNoKS4KKworSWYgeW91IGFyZSB1c2luZyBhIHZlcnNpb24gb2YgUnVieSB3aGVyZSBQc3ljaCBpcyB0aGUgZGVmYXVsdCBZQU1MIGVuZ2luZSAoZS5nLiwgMS45LjMpIGJ1dCB5b3Ugd2FudCB0byB1c2UgU3ljaywgYmUgc3VyZSB0byBzZXQgYFlBTUw6OkVOR0lORS55YW1sZXIgPSAic3ljayJgICoqYmVmb3JlKiogcmVxdWlyaW5nIHRoZSBzYWZlX3lhbWwgZ2VtLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L1Jha2VmaWxlIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L1Jha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOWRiYzMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvUmFrZWZpbGUKQEAgLTAsMCArMSwyNiBAQAorcmVxdWlyZSAicnNwZWMvY29yZS9yYWtlX3Rhc2siCisKK2Rlc2MgIlJ1biBzcGVjcyIKK3Rhc2sgOnNwZWMgPT4gWydzcGVjOmFwcCcsICdzcGVjOmxpYiddCisKK25hbWVzcGFjZSA6c3BlYyBkbworICBkZXNjICJSdW4gb25seSBzcGVjcyB0YWdnZWQgJ3NvbG8nIgorICBSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3KDpzb2xvKSBkbyB8dHwKKyAgICB0LnZlcmJvc2UgPSBmYWxzZQorICAgIHQucnNwZWNfb3B0cyA9ICV3KC0tY29sb3IgLS10YWcgc29sbykKKyAgZW5kCisKKyAgZGVzYyAiUnVuIG9ubHkgc3BlY3MgdGFnZ2VkIE5PVCB0YWdnZWQgJ2xpYnJhcmllcycgKGZvciBhcHBsaWNhdGlvbnMpIgorICBSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3KDphcHApIGRvIHx0fAorICAgIHQudmVyYm9zZSA9IGZhbHNlCisgICAgRU5WWyJNT05LRVlQQVRDSF9ZQU1MIl0gPSAidHJ1ZSIKKyAgICB0LnJzcGVjX29wdHMgPSAldygtLWNvbG9yIC0tdGFnIH5saWJyYXJpZXMpCisgIGVuZAorCisgIGRlc2MgIlJ1biBvbmx5IHNwZWNzIHRhZ2dlZCAnbGlicmFyaWVzJyIKKyAgUlNwZWM6OkNvcmU6OlJha2VUYXNrLm5ldyg6bGliKSBkbyB8dHwKKyAgICB0LnZlcmJvc2UgPSBmYWxzZQorICAgIEVOVlsiTU9OS0VZUEFUQ0hfWUFNTCJdID0gImZhbHNlIgorICAgIHQucnNwZWNfb3B0cyA9ICV3KC0tY29sb3IgLS10YWcgbGlicmFyaWVzKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2Jpbi9zYWZlX3lhbWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvYmluL3NhZmVfeWFtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNzUxYTcyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2Jpbi9zYWZlX3lhbWwKQEAgLTAsMCArMSw3NSBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorCiskTE9BRF9QQVRIIDw8IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4nLCAnbGliJykKKworcmVxdWlyZSAnb3B0cGFyc2UnCityZXF1aXJlICdzYWZlX3lhbWwvbG9hZCcKKworb3B0aW9ucyA9IHt9CitvcHRpb25fcGFyc2VyID0gT3B0aW9uUGFyc2VyLm5ldyBkbyB8b3B0c3wKKyAgb3B0cy5iYW5uZXIgPSAiVXNhZ2U6IHNhZmVfeWFtbCBbb3B0aW9uc10iCisKKyAgb3B0cy5vbigiLWYiLCAiLS1maWxlPTxwYXRoPiIsICJQYXJzZSB0aGUgZ2l2ZW4gWUFNTCBmaWxlLCBkdW1wIHRoZSByZXN1bHQgdG8gU1RET1VUIikgZG8gfGZpbGV8CisgICAgb3B0aW9uc1s6ZmlsZV0gPSBmaWxlCisgIGVuZAorCisgIG9wdHMub24oIi0tbGlieWFtbC1jaGVjayIsICJDaGVjayBmb3IgbGlieWFtbCB2dWxuZXJhYmlsaXR5IENWRS0yMDE0LTI1MjUgb24geW91ciBzeXN0ZW0iKSBkbworICAgIG9wdGlvbnNbOmxpYnlhbWxfY2hlY2tdID0gdHJ1ZQorICBlbmQKK2VuZAorCitvcHRpb25fcGFyc2VyLnBhcnNlIQorCitkZWYgcmVwb3J0X2xpYnlhbWxfb2sKKyAgcHV0cyAiXGVbMzJtR29vZCBuZXdzISBZb3UgZGVmaW5pdGVseSBoYXZlIGVpdGhlciBhIHBhdGNoZWQgb3IgdXAtdG8tZGF0ZSBsaWJ5YW1sIHZlcnNpb24gOilcZVszOW0iCitlbmQKKworZGVmIGNoZWNrX2Zvcl9vdmVyZmxvd19idWcKKyAgWUFNTC5sb2FkKCItLS0gISN7JyUyMCcgKiAxMDB9IikKKyAgcmVwb3J0X2xpYnlhbWxfb2sKK2VuZAorCitkZWYgcGVyZm9ybV9saWJ5YW1sX2NoZWNrKGZvcmNlPWZhbHNlKQorICB1bmxlc3MgU2FmZVlBTUw6OkxpYnlhbWxDaGVja2VyLmxpYnlhbWxfdmVyc2lvbl9vaz8KKyAgICB3YXJuIDw8LUVPTS5nc3ViKC9eICsvLCAnICAnKQorCisgICAgICBcZVszM21TYWZlWUFNTCBXYXJuaW5nXGVbMzltCisgICAgICBcZVszM20tLS0tLS0tLS0tLS0tLS0tXGVbMzltCisKKyAgICAgIFxlWzMxbVlvdSBtYXkgaGF2ZSBhbiBvdXRkYXRlZCB2ZXJzaW9uIG9mIGxpYnlhbWwgKCN7U2FmZVlBTUw6OkxpYnlhbWxDaGVja2VyOjpMSUJZQU1MX1ZFUlNJT059KSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0uXGVbMzltCisKKyAgICAgIFByaW9yIHRvIDAuMS42LCBsaWJ5YW1sIGlzIHZ1bG5lcmFibGUgdG8gYSBoZWFwIG92ZXJmbG93IGV4cGxvaXQgZnJvbSBtYWxpY2lvdXMgWUFNTCBwYXlsb2Fkcy4KKworICAgICAgRm9yIG1vcmUgaW5mbywgc2VlOgorICAgICAgaHR0cHM6Ly93d3cucnVieS1sYW5nLm9yZy9lbi9uZXdzLzIwMTQvMDMvMjkvaGVhcC1vdmVyZmxvdy1pbi15YW1sLXVyaS1lc2NhcGUtcGFyc2luZy1jdmUtMjAxNC0yNTI1LworICAgIEVPTQorICBlbmQKKworICBwdXRzIDw8LUVPTS5nc3ViKC9eICsvLCAnICAnKQorCisgICAgSGl0IEVudGVyIHRvIGNoZWNrIGlmIHlvdXIgdmVyc2lvbiBvZiBsaWJ5YW1sIGlzIHZ1bG5lcmFibGUuIFRoaXMgd2lsbCBydW4gYSB0ZXN0IFxlWzMxbXdoaWNoIG1heSBjcmFzaFxlWzM5bQorICAgIFxlWzMxbXRoZSBjdXJyZW50IHByb2Nlc3NcZVszOW0uIElmIGl0IGRvZXMsIHlvdXIgc3lzdGVtIGlzIHZ1bG5lcmFibGUgYW5kIHlvdSBzaG91bGQgZG8gc29tZXRoaW5nIGFib3V0IGl0LgorCisgICAgVHlwZSAibm0iIGFuZCBoaXQgRW50ZXIgaWYgeW91IGRvbid0IHdhbnQgdG8gcnVuIHRoZSBjaGVjay4KKworICAgIFNlZSB0aGUgcHJvamVjdCB3aWtpIGZvciBtb3JlIGluZm86CisKKyAgICBodHRwczovL2dpdGh1Yi5jb20vZHRhby9zYWZlX3lhbWwvd2lraS9UaGUtbGlieWFtbC12dWxuZXJhYmlsaXR5CisgIEVPTQorCisgIGlmIFNURElOLnJlYWRsaW5lLmNob21wKCJcbiIpICE9ICdubScKKyAgICBjaGVja19mb3Jfb3ZlcmZsb3dfYnVnCisgIGVuZAorZW5kCisKK2lmIG9wdGlvbnNbOmxpYnlhbWxfY2hlY2tdCisgIHBlcmZvcm1fbGlieWFtbF9jaGVjayhvcHRpb25zWzpmb3JjZV9saWJ5YW1sX2NoZWNrXSkKKworZWxzaWYgb3B0aW9uc1s6ZmlsZV0KKyAgeWFtbCA9IEZpbGUucmVhZChvcHRpb25zWzpmaWxlXSkKKyAgcmVzdWx0ID0gU2FmZVlBTUwubG9hZCh5YW1sKQorICBwdXRzIHJlc3VsdC5pbnNwZWN0CisKK2Vsc2UKKyAgcHV0cyBvcHRpb25fcGFyc2VyLmhlbHAKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2J1bmRsZV9pbnN0YWxsX2FsbF9ydWJ5X3ZlcnNpb25zLnNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2J1bmRsZV9pbnN0YWxsX2FsbF9ydWJ5X3ZlcnNpb25zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwMmQxMjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvYnVuZGxlX2luc3RhbGxfYWxsX3J1YnlfdmVyc2lvbnMuc2gKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL2Jhc2gKKworW1sgLXMgIiRIT01FLy5ydm0vc2NyaXB0cy9ydm0iIF1dICYmIC4gIiRIT01FLy5ydm0vc2NyaXB0cy9ydm0iCisKK2RlY2xhcmUgLWEgdmVyc2lvbnM9KCIxLjguNyIgIjEuOS4yIiAiMS45LjMiICIyLjAuMCIgIjIuMS4wIiAiMi4xLjEiICIyLjEuMiIgInJ1YnktaGVhZCIgImpydWJ5IikKKworZm9yIGkgaW4gIiR7dmVyc2lvbnNbQF19IgorZG8KKyAgcnZtIHVzZSAkaQorICBidW5kbGUgaW5zdGFsbAorZG9uZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE5NTdkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwucmIKQEAgLTAsMCArMSw5NCBAQAorcmVxdWlyZSAic2FmZV95YW1sL2xvYWQiCisKK21vZHVsZSBZQU1MCisgIGRlZiBzZWxmLmxvYWRfd2l0aF9vcHRpb25zKHlhbWwsICpvcmlnaW5hbF9hcmd1bWVudHMpCisgICAgZmlsZW5hbWUsIG9wdGlvbnMgPSBmaWxlbmFtZV9hbmRfb3B0aW9uc19mcm9tX2FyZ3VtZW50cyhvcmlnaW5hbF9hcmd1bWVudHMpCisgICAgc2FmZV9tb2RlID0gc2FmZV9tb2RlX2Zyb21fb3B0aW9ucygibG9hZCIsIG9wdGlvbnMpCisgICAgYXJndW1lbnRzID0gW3lhbWxdCisKKyAgICBpZiBzYWZlX21vZGUgPT0gOnNhZmUKKyAgICAgIGFyZ3VtZW50cyA8PCBmaWxlbmFtZSBpZiBTYWZlWUFNTDo6WUFNTF9FTkdJTkUgPT0gInBzeWNoIgorICAgICAgYXJndW1lbnRzIDw8IG9wdGlvbnNfZm9yX3NhZmVfbG9hZChvcHRpb25zKQorICAgICAgc2FmZV9sb2FkKCphcmd1bWVudHMpCisgICAgZWxzZQorICAgICAgYXJndW1lbnRzIDw8IGZpbGVuYW1lIGlmIFNhZmVZQU1MOjpNVUxUSV9BUkdVTUVOVF9ZQU1MX0xPQUQKKyAgICAgIHVuc2FmZV9sb2FkKCphcmd1bWVudHMpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBzZWxmLmxvYWRfZmlsZV93aXRoX29wdGlvbnMoZmlsZSwgb3B0aW9ucz17fSkKKyAgICBzYWZlX21vZGUgPSBzYWZlX21vZGVfZnJvbV9vcHRpb25zKCJsb2FkX2ZpbGUiLCBvcHRpb25zKQorICAgIGlmIHNhZmVfbW9kZSA9PSA6c2FmZQorICAgICAgc2FmZV9sb2FkX2ZpbGUoZmlsZSwgb3B0aW9uc19mb3Jfc2FmZV9sb2FkKG9wdGlvbnMpKQorICAgIGVsc2UKKyAgICAgIHVuc2FmZV9sb2FkX2ZpbGUoZmlsZSkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHNlbGYuc2FmZV9sb2FkKCphcmdzKQorICAgIFNhZmVZQU1MLmxvYWQoKmFyZ3MpCisgIGVuZAorCisgIGRlZiBzZWxmLnNhZmVfbG9hZF9maWxlKCphcmdzKQorICAgIFNhZmVZQU1MLmxvYWRfZmlsZSgqYXJncykKKyAgZW5kCisKKyAgaWYgU2FmZVlBTUw6Ok1VTFRJX0FSR1VNRU5UX1lBTUxfTE9BRAorICAgIGRlZiBzZWxmLnVuc2FmZV9sb2FkX2ZpbGUoZmlsZW5hbWUpCisgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5kZXJsb3ZlL3BzeWNoL2Jsb2IvdjEuMy4yL2xpYi9wc3ljaC5yYiNMMjk2LTI5OAorICAgICAgRmlsZS5vcGVuKGZpbGVuYW1lLCAncjpib218dXRmLTgnKSB7IHxmfCBzZWxmLnVuc2FmZV9sb2FkKGYsIGZpbGVuYW1lKSB9CisgICAgZW5kCisKKyAgZWxzZQorICAgIGRlZiBzZWxmLnVuc2FmZV9sb2FkX2ZpbGUoZmlsZW5hbWUpCisgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5kZXJsb3ZlL3BzeWNoL2Jsb2IvdjEuMi4yL2xpYi9wc3ljaC5yYiNMMjMxLTIzMworICAgICAgc2VsZi51bnNhZmVfbG9hZCBGaWxlLm9wZW4oZmlsZW5hbWUpCisgICAgZW5kCisgIGVuZAorCisgIGNsYXNzIDw8IHNlbGYKKyAgICBhbGlhc19tZXRob2QgOnVuc2FmZV9sb2FkLCA6bG9hZAorICAgIGFsaWFzX21ldGhvZCA6bG9hZCwgOmxvYWRfd2l0aF9vcHRpb25zCisgICAgYWxpYXNfbWV0aG9kIDpsb2FkX2ZpbGUsIDpsb2FkX2ZpbGVfd2l0aF9vcHRpb25zCisKKyAgICBwcml2YXRlCisgICAgZGVmIGZpbGVuYW1lX2FuZF9vcHRpb25zX2Zyb21fYXJndW1lbnRzKGFyZ3VtZW50cykKKyAgICAgIGlmIGFyZ3VtZW50cy5jb3VudCA9PSAxCisgICAgICAgIGlmIGFyZ3VtZW50cy5maXJzdC5pc19hPyhTdHJpbmcpCisgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5maXJzdCwge30KKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBuaWwsIGFyZ3VtZW50cy5maXJzdCB8fCB7fQorICAgICAgICBlbmQKKworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYXJndW1lbnRzLmZpcnN0LCBhcmd1bWVudHMubGFzdCB8fCB7fQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc2FmZV9tb2RlX2Zyb21fb3B0aW9ucyhtZXRob2QsIG9wdGlvbnM9e30pCisgICAgICBpZiBvcHRpb25zWzpzYWZlXS5uaWw/CisgICAgICAgIHNhZmVfbW9kZSA9IFNhZmVZQU1MOjpPUFRJT05TWzpkZWZhdWx0X21vZGVdIHx8IDpzYWZlCisKKyAgICAgICAgaWYgU2FmZVlBTUw6Ok9QVElPTlNbOmRlZmF1bHRfbW9kZV0ubmlsPyAmJiAhU2FmZVlBTUw6Ok9QVElPTlNbOnN1cHByZXNzX3dhcm5pbmdzXQorCisgICAgICAgICAgS2VybmVsLndhcm4gPDwtRU9XQVJOSU5HLmdzdWIoL15ccysvLCAnJykKKyAgICAgICAgICAgIENhbGxlZCAnI3ttZXRob2R9JyB3aXRob3V0IHRoZSA6c2FmZSBvcHRpb24gLS0gZGVmYXVsdGluZyB0byAje3NhZmVfbW9kZX0gbW9kZS4KKyAgICAgICAgICAgIFlvdSBjYW4gYXZvaWQgdGhpcyB3YXJuaW5nIGluIHRoZSBmdXR1cmUgYnkgc2V0dGluZyB0aGUgU2FmZVlBTUw6Ok9QVElPTlNbOmRlZmF1bHRfbW9kZV0gb3B0aW9uICh0byA6c2FmZSBvciA6dW5zYWZlKS4KKyAgICAgICAgICBFT1dBUk5JTkcKKworICAgICAgICAgIFNhZmVZQU1MOjpPUFRJT05TWzpzdXBwcmVzc193YXJuaW5nc10gPSB0cnVlCisgICAgICAgIGVuZAorCisgICAgICAgIHJldHVybiBzYWZlX21vZGUKKyAgICAgIGVuZAorCisgICAgICBvcHRpb25zWzpzYWZlXSA/IDpzYWZlIDogOnVuc2FmZQorICAgIGVuZAorCisgICAgZGVmIG9wdGlvbnNfZm9yX3NhZmVfbG9hZChiYXNlX29wdGlvbnMpCisgICAgICBvcHRpb25zID0gYmFzZV9vcHRpb25zLmR1cAorICAgICAgb3B0aW9ucy5kZWxldGUoOnNhZmUpCisgICAgICBvcHRpb25zCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9kZWVwLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvZGVlcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVlMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvZGVlcC5yYgpAQCAtMCwwICsxLDM0IEBACittb2R1bGUgU2FmZVlBTUwKKyAgY2xhc3MgRGVlcAorICAgIGRlZiBzZWxmLmZyZWV6ZShvYmplY3QpCisgICAgICBvYmplY3QuZWFjaCBkbyB8KmVudHJ5fAorICAgICAgICB2YWx1ZSA9IGVudHJ5Lmxhc3QKKyAgICAgICAgY2FzZSB2YWx1ZQorICAgICAgICB3aGVuIFN0cmluZywgUmVnZXhwCisgICAgICAgICAgdmFsdWUuZnJlZXplCisgICAgICAgIHdoZW4gRW51bWVyYWJsZQorICAgICAgICAgIERlZXAuZnJlZXplKHZhbHVlKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gb2JqZWN0LmZyZWV6ZQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuY29weShvYmplY3QpCisgICAgICBkdXBsaWNhdGUgPSBvYmplY3QuZHVwIHJlc2N1ZSBvYmplY3QKKworICAgICAgY2FzZSBvYmplY3QKKyAgICAgIHdoZW4gQXJyYXkKKyAgICAgICAgKDAuLi5kdXBsaWNhdGUuY291bnQpLmVhY2ggZG8gfGl8CisgICAgICAgICAgZHVwbGljYXRlW2ldID0gRGVlcC5jb3B5KGR1cGxpY2F0ZVtpXSkKKyAgICAgICAgZW5kCisgICAgICB3aGVuIEhhc2gKKyAgICAgICAgZHVwbGljYXRlLmtleXMuZWFjaCBkbyB8a2V5fAorICAgICAgICAgIGR1cGxpY2F0ZVtrZXldID0gRGVlcC5jb3B5KGR1cGxpY2F0ZVtrZXldKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkdXBsaWNhdGUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL2xpYnlhbWxfY2hlY2tlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL2xpYnlhbWxfY2hlY2tlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWUyNDIzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvbGlieWFtbF9jaGVja2VyLnJiCkBAIC0wLDAgKzEsMzYgQEAKK3JlcXVpcmUgInNldCIKKworbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIExpYnlhbWxDaGVja2VyCisgICAgTElCWUFNTF9WRVJTSU9OID0gUHN5Y2g6OkxJQllBTUxfVkVSU0lPTiByZXNjdWUgbmlsCisKKyAgICAjIERvIHByb3BlciB2ZXJzaW9uIGNvbXBhcmlzb24gKGUuZy4gc28gMC4xLjEwIGlzID49IDAuMS42KQorICAgIFNBRkVfTElCWUFNTF9WRVJTSU9OID0gR2VtOjpWZXJzaW9uLm5ldygiMC4xLjYiKQorCisgICAgS05PV05fUEFUQ0hFRF9MSUJZQU1MX1ZFUlNJT05TID0gU2V0Lm5ldyhbCisgICAgICAjIGh0dHA6Ly9wZW9wbGUuY2Fub25pY2FsLmNvbS9+dWJ1bnR1LXNlY3VyaXR5L2N2ZS8yMDE0L0NWRS0yMDE0LTI1MjUuaHRtbAorICAgICAgIjAuMS40LTJ1YnVudHUwLjEyLjA0LjMiLAorICAgICAgIjAuMS40LTJ1YnVudHUwLjEyLjEwLjMiLAorICAgICAgIjAuMS40LTJ1YnVudHUwLjEzLjEwLjMiLAorICAgICAgIjAuMS40LTN1YnVudHUzIiwKKworICAgICAgIyBodHRwczovL3NlY3VyaXR5LXRyYWNrZXIuZGViaWFuLm9yZy90cmFja2VyL0NWRS0yMDE0LTI1MjUKKyAgICAgICIwLjEuMy0xK2RlYjZ1NCIsCisgICAgICAiMC4xLjQtMitkZWI3dTQiLAorICAgICAgIjAuMS40LTMuMiIKKyAgICBdKS5mcmVlemUKKworICAgIGRlZiBzZWxmLmxpYnlhbWxfdmVyc2lvbl9vaz8KKyAgICAgIHJldHVybiB0cnVlIGlmIFlBTUxfRU5HSU5FICE9ICJwc3ljaCIgfHwgZGVmaW5lZD8oSlJVQllfVkVSU0lPTikKKyAgICAgIHJldHVybiB0cnVlIGlmIEdlbTo6VmVyc2lvbi5uZXcoTElCWUFNTF9WRVJTSU9OIHx8ICIwIikgPj0gU0FGRV9MSUJZQU1MX1ZFUlNJT04KKyAgICAgIHJldHVybiBsaWJ5YW1sX3BhdGNoZWQ/CisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5saWJ5YW1sX3BhdGNoZWQ/CisgICAgICByZXR1cm4gZmFsc2UgaWYgKGB3aGljaCBkcGtnYCByZXNjdWUgJycpLmVtcHR5PworICAgICAgbGlieWFtbF92ZXJzaW9uID0gYGRwa2cgLXMgbGlieWFtbC0wLTJgLm1hdGNoKC9eVmVyc2lvbjogKC4qKSQvKQorICAgICAgcmV0dXJuIGZhbHNlIGlmIGxpYnlhbWxfdmVyc2lvbi5uaWw/CisgICAgICBLTk9XTl9QQVRDSEVEX0xJQllBTUxfVkVSU0lPTlMuaW5jbHVkZT8obGlieWFtbF92ZXJzaW9uWzFdKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvbG9hZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL2xvYWQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhMGY2MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL2xvYWQucmIKQEAgLTAsMCArMSwxODEgQEAKK3JlcXVpcmUgInNldCIKK3JlcXVpcmUgInlhbWwiCisKKyMgVGhpcyBuZWVkcyB0byBiZSBkZWZpbmVkIHVwIGZyb250IGluIGNhc2UgYW55IGludGVybmFsIGNsYXNzZXMgbmVlZCB0byBiYXNlCisjIHRoZWlyIGJlaGF2aW9yIG9mZiBvZiB0aGlzLgorbW9kdWxlIFNhZmVZQU1MCisgIFlBTUxfRU5HSU5FID0gZGVmaW5lZD8oWUFNTDo6RU5HSU5FKSA/IFlBTUw6OkVOR0lORS55YW1sZXIgOiAoZGVmaW5lZD8oUHN5Y2gpICYmIFlBTUwgPT0gUHN5Y2ggPyAicHN5Y2giIDogInN5Y2siKQorZW5kCisKK3JlcXVpcmUgInNhZmVfeWFtbC9saWJ5YW1sX2NoZWNrZXIiCityZXF1aXJlICJzYWZlX3lhbWwvZGVlcCIKK3JlcXVpcmUgInNhZmVfeWFtbC9wYXJzZS9oZXhhZGVjaW1hbCIKK3JlcXVpcmUgInNhZmVfeWFtbC9wYXJzZS9zZXhhZ2VzaW1hbCIKK3JlcXVpcmUgInNhZmVfeWFtbC9wYXJzZS9kYXRlIgorcmVxdWlyZSAic2FmZV95YW1sL3RyYW5zZm9ybS90cmFuc2Zvcm1hdGlvbl9tYXAiCityZXF1aXJlICJzYWZlX3lhbWwvdHJhbnNmb3JtL3RvX2Jvb2xlYW4iCityZXF1aXJlICJzYWZlX3lhbWwvdHJhbnNmb3JtL3RvX2RhdGUiCityZXF1aXJlICJzYWZlX3lhbWwvdHJhbnNmb3JtL3RvX2Zsb2F0IgorcmVxdWlyZSAic2FmZV95YW1sL3RyYW5zZm9ybS90b19pbnRlZ2VyIgorcmVxdWlyZSAic2FmZV95YW1sL3RyYW5zZm9ybS90b19uaWwiCityZXF1aXJlICJzYWZlX3lhbWwvdHJhbnNmb3JtL3RvX3N5bWJvbCIKK3JlcXVpcmUgInNhZmVfeWFtbC90cmFuc2Zvcm0iCityZXF1aXJlICJzYWZlX3lhbWwvcmVzb2x2ZXIiCityZXF1aXJlICJzYWZlX3lhbWwvc3lja19oYWNrIiBpZiBTYWZlWUFNTDo6WUFNTF9FTkdJTkUgPT0gInN5Y2siICYmIGRlZmluZWQ/KEpSVUJZX1ZFUlNJT04pCisKK21vZHVsZSBTYWZlWUFNTAorICBNVUxUSV9BUkdVTUVOVF9ZQU1MX0xPQUQgPSBZQU1MLm1ldGhvZCg6bG9hZCkuYXJpdHkgIT0gMQorCisgIERFRkFVTFRfT1BUSU9OUyA9IERlZXAuZnJlZXplKHsKKyAgICA6ZGVmYXVsdF9tb2RlICAgICAgICAgPT4gbmlsLAorICAgIDpzdXBwcmVzc193YXJuaW5ncyAgICA9PiBmYWxzZSwKKyAgICA6ZGVzZXJpYWxpemVfc3ltYm9scyAgPT4gZmFsc2UsCisgICAgOndoaXRlbGlzdGVkX3RhZ3MgICAgID0+IFtdLAorICAgIDpjdXN0b21faW5pdGlhbGl6ZXJzICA9PiB7fSwKKyAgICA6cmFpc2Vfb25fdW5rbm93bl90YWcgPT4gZmFsc2UKKyAgfSkKKworICBPUFRJT05TID0gRGVlcC5jb3B5KERFRkFVTFRfT1BUSU9OUykKKworICBQUkVERUZJTkVEX1RBR1MgPSB7fQorCisgIGlmIFlBTUxfRU5HSU5FID09ICJzeWNrIgorICAgIFlBTUwudGFnZ2VkX2NsYXNzZXMuZWFjaCBkbyB8dGFnLCBrbGFzc3wKKyAgICAgIFBSRURFRklORURfVEFHU1trbGFzc10gPSB0YWcKKyAgICBlbmQKKworICBlbHNlCisgICAgIyBTcGVjaWFsIHRhZ3MgYXBwZWFyIHRvIGJlIGhhcmQtY29kZWQgaW4gUHN5Y2g6CisgICAgIyBodHRwczovL2dpdGh1Yi5jb20vdGVuZGVybG92ZS9wc3ljaC9ibG9iL3YxLjMuNC9saWIvcHN5Y2gvdmlzaXRvcnMvdG9fcnVieS5yYgorICAgICMgRm9ydHVuYXRlbHksIHRoZXJlIGFyZW4ndCBtYW55IHRoYXQgU2FmZVlBTUwgZG9lc24ndCBhbHJlYWR5IHN1cHBvcnQuCisgICAgUFJFREVGSU5FRF9UQUdTLm1lcmdlISh7CisgICAgICBFeGNlcHRpb24gPT4gIiFydWJ5L2V4Y2VwdGlvbiIsCisgICAgICBSYW5nZSAgICAgPT4gIiFydWJ5L3JhbmdlIiwKKyAgICAgIFJlZ2V4cCAgICA9PiAiIXJ1YnkvcmVnZXhwIiwKKyAgICB9KQorICBlbmQKKworICBEZWVwLmZyZWV6ZShQUkVERUZJTkVEX1RBR1MpCisKKyAgbW9kdWxlX2Z1bmN0aW9uCisKKyAgZGVmIHJlc3RvcmVfZGVmYXVsdHMhCisgICAgT1BUSU9OUy5jbGVhci5tZXJnZSEoRGVlcC5jb3B5KERFRkFVTFRfT1BUSU9OUykpCisgIGVuZAorCisgIGRlZiB0YWdfc2FmZXR5X2NoZWNrISh0YWcsIG9wdGlvbnMpCisgICAgcmV0dXJuIGlmIHRhZy5uaWw/IHx8IHRhZyA9PSAiISIKKyAgICBpZiBvcHRpb25zWzpyYWlzZV9vbl91bmtub3duX3RhZ10gJiYgIW9wdGlvbnNbOndoaXRlbGlzdGVkX3RhZ3NdLmluY2x1ZGU/KHRhZykgJiYgIXRhZ19pc19leHBsaWNpdGx5X3RydXN0ZWQ/KHRhZykKKyAgICAgIHJhaXNlICJVbmtub3duIFlBTUwgdGFnICcje3RhZ30nIgorICAgIGVuZAorICBlbmQKKworICBkZWYgd2hpdGVsaXN0ISgqY2xhc3NlcykKKyAgICBjbGFzc2VzLmVhY2ggZG8gfGtsYXNzfAorICAgICAgd2hpdGVsaXN0X2NsYXNzIShrbGFzcykKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHdoaXRlbGlzdF9jbGFzcyEoa2xhc3MpCisgICAgcmFpc2UgIiN7a2xhc3N9IG5vdCBhIENsYXNzIiB1bmxlc3Mga2xhc3MuaXNfYT8oOjpDbGFzcykKKworICAgIGtsYXNzX25hbWUgPSBrbGFzcy5uYW1lCisgICAgcmFpc2UgIiN7a2xhc3N9IGNhbm5vdCBiZSBhbm9ueW1vdXMiIGlmIGtsYXNzX25hbWUubmlsPyB8fCBrbGFzc19uYW1lLmVtcHR5PworCisgICAgIyBXaGl0ZWxpc3QgYW55IGJ1aWx0LWluIFlBTUwgdGFncyBzdXBwbGllZCBieSBTeWNrIG9yIFBzeWNoLgorICAgIHByZWRlZmluZWRfdGFnID0gUFJFREVGSU5FRF9UQUdTW2tsYXNzXQorICAgIGlmIHByZWRlZmluZWRfdGFnCisgICAgICBPUFRJT05TWzp3aGl0ZWxpc3RlZF90YWdzXSA8PCBwcmVkZWZpbmVkX3RhZworICAgICAgcmV0dXJuCisgICAgZW5kCisKKyAgICAjIEV4Y2VwdGlvbiBpcyBleGNlcHRpb25hbCAoaGFyIGhhcikuCisgICAgdGFnX2NsYXNzICA9IGtsYXNzIDwgRXhjZXB0aW9uID8gImV4Y2VwdGlvbiIgOiAib2JqZWN0IgorCisgICAgdGFnX3ByZWZpeCA9IGNhc2UgWUFNTF9FTkdJTkUKKyAgICAgICAgICAgICAgICAgd2hlbiAicHN5Y2giIHRoZW4gIiFydWJ5LyN7dGFnX2NsYXNzfSIKKyAgICAgICAgICAgICAgICAgd2hlbiAic3ljayIgIHRoZW4gInRhZzpydWJ5LnlhbWwub3JnLDIwMDI6I3t0YWdfY2xhc3N9IgorICAgICAgICAgICAgICAgICBlbHNlIHJhaXNlICJ1bmtub3duIFlBTUxfRU5HSU5FICN7WUFNTF9FTkdJTkV9IgorICAgICAgICAgICAgICAgICBlbmQKKyAgICBPUFRJT05TWzp3aGl0ZWxpc3RlZF90YWdzXSA8PCAiI3t0YWdfcHJlZml4fToje2tsYXNzX25hbWV9IgorICBlbmQKKworICBpZiBZQU1MX0VOR0lORSA9PSAicHN5Y2giCisgICAgZGVmIHRhZ19pc19leHBsaWNpdGx5X3RydXN0ZWQ/KHRhZykKKyAgICAgIGZhbHNlCisgICAgZW5kCisKKyAgZWxzZQorICAgIFRSVVNURURfVEFHUyA9IFNldC5uZXcoWworICAgICAgInRhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSIsCisgICAgICAidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCNubyIsCisgICAgICAidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCN5ZXMiLAorICAgICAgInRhZzp5YW1sLm9yZywyMDAyOmZsb2F0IiwKKyAgICAgICJ0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCNmaXgiLAorICAgICAgInRhZzp5YW1sLm9yZywyMDAyOmludCIsCisgICAgICAidGFnOnlhbWwub3JnLDIwMDI6bWFwIiwKKyAgICAgICJ0YWc6eWFtbC5vcmcsMjAwMjpudWxsIiwKKyAgICAgICJ0YWc6eWFtbC5vcmcsMjAwMjpzZXEiLAorICAgICAgInRhZzp5YW1sLm9yZywyMDAyOnN0ciIsCisgICAgICAidGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wIiwKKyAgICAgICJ0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAjeW1kIgorICAgIF0pLmZyZWV6ZQorCisgICAgZGVmIHRhZ19pc19leHBsaWNpdGx5X3RydXN0ZWQ/KHRhZykKKyAgICAgIFRSVVNURURfVEFHUy5pbmNsdWRlPyh0YWcpCisgICAgZW5kCisgIGVuZAorCisgIGlmIFNhZmVZQU1MOjpZQU1MX0VOR0lORSA9PSAicHN5Y2giCisgICAgcmVxdWlyZSAic2FmZV95YW1sL3BzeWNoX2hhbmRsZXIiCisgICAgcmVxdWlyZSAic2FmZV95YW1sL3BzeWNoX3Jlc29sdmVyIgorICAgIHJlcXVpcmUgInNhZmVfeWFtbC9zYWZlX3RvX3J1YnlfdmlzaXRvciIKKworICAgIGRlZiBzZWxmLmxvYWQoeWFtbCwgZmlsZW5hbWU9bmlsLCBvcHRpb25zPXt9KQorICAgICAgIyBJZiB0aGUgdXNlciBoYXNuJ3Qgd2hpdGVsaXN0ZWQgYW55IHRhZ3MsIHdlIGNhbiBnbyB3aXRoIHRoaXMgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMKKyAgICAgICMgc2lnbmlmaWNhbnRseSBmYXN0ZXIuCisgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zWzp3aGl0ZWxpc3RlZF90YWdzXSB8fCBTYWZlWUFNTDo6T1BUSU9OU1s6d2hpdGVsaXN0ZWRfdGFnc10pLmVtcHR5PworICAgICAgICBzYWZlX2hhbmRsZXIgPSBTYWZlWUFNTDo6UHN5Y2hIYW5kbGVyLm5ldyhvcHRpb25zKSBkbyB8cmVzdWx0fAorICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZW5kCisgICAgICAgIGFyZ3VtZW50c19mb3JfcGFyc2UgPSBbeWFtbF0KKyAgICAgICAgYXJndW1lbnRzX2Zvcl9wYXJzZSA8PCBmaWxlbmFtZSBpZiBTYWZlWUFNTDo6TVVMVElfQVJHVU1FTlRfWUFNTF9MT0FECisgICAgICAgIFBzeWNoOjpQYXJzZXIubmV3KHNhZmVfaGFuZGxlcikucGFyc2UoKmFyZ3VtZW50c19mb3JfcGFyc2UpCisgICAgICAgIHJldHVybiBzYWZlX2hhbmRsZXIucmVzdWx0CisKKyAgICAgIGVsc2UKKyAgICAgICAgc2FmZV9yZXNvbHZlciA9IFNhZmVZQU1MOjpQc3ljaFJlc29sdmVyLm5ldyhvcHRpb25zKQorICAgICAgICB0cmVlID0gU2FmZVlBTUw6Ok1VTFRJX0FSR1VNRU5UX1lBTUxfTE9BRCA/CisgICAgICAgICAgUHN5Y2gucGFyc2UoeWFtbCwgZmlsZW5hbWUpIDoKKyAgICAgICAgICBQc3ljaC5wYXJzZSh5YW1sKQorICAgICAgICByZXR1cm4gc2FmZV9yZXNvbHZlci5yZXNvbHZlX25vZGUodHJlZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHNlbGYubG9hZF9maWxlKGZpbGVuYW1lLCBvcHRpb25zPXt9KQorICAgICAgaWYgU2FmZVlBTUw6Ok1VTFRJX0FSR1VNRU5UX1lBTUxfTE9BRAorICAgICAgICBGaWxlLm9wZW4oZmlsZW5hbWUsICdyOmJvbXx1dGYtOCcpIHsgfGZ8IHNlbGYubG9hZChmLCBmaWxlbmFtZSwgb3B0aW9ucykgfQorCisgICAgICBlbHNlCisgICAgICAgICMgUnVieSBwdWtlcyBvbiAxLjkuMiBpZiB3ZSB0cnkgdG8gb3BlbiBhbiBlbXB0eSBmaWxlIHcvICdyOmJvbXx1dGYtOCc7CisgICAgICAgICMgc28gd2UnbGwgbm90IHNwZWNpZnkgdGhvc2UgZmxhZ3MgaGVyZS4gVGhpcyBtaXJyb3JzIHRoZSBiZWhhdmlvciBmb3IKKyAgICAgICAgIyB1bnNhZmVfbG9hZF9maWxlIHNvIGl0J3MgcHJvYmFibHkgcHJlZmVyYWJsZSBhbnl3YXkuCisgICAgICAgIHNlbGYubG9hZCBGaWxlLm9wZW4oZmlsZW5hbWUpLCBuaWwsIG9wdGlvbnMKKyAgICAgIGVuZAorICAgIGVuZAorCisgIGVsc2UKKyAgICByZXF1aXJlICJzYWZlX3lhbWwvc3lja19yZXNvbHZlciIKKyAgICByZXF1aXJlICJzYWZlX3lhbWwvc3lja19ub2RlX21vbmtleXBhdGNoIgorCisgICAgZGVmIHNlbGYubG9hZCh5YW1sLCBvcHRpb25zPXt9KQorICAgICAgcmVzb2x2ZXIgPSBTYWZlWUFNTDo6U3lja1Jlc29sdmVyLm5ldyhTYWZlWUFNTDo6T1BUSU9OUy5tZXJnZShvcHRpb25zIHx8IHt9KSkKKyAgICAgIHRyZWUgPSBZQU1MLnBhcnNlKHlhbWwpCisgICAgICByZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZV9ub2RlKHRyZWUpCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5sb2FkX2ZpbGUoZmlsZW5hbWUsIG9wdGlvbnM9e30pCisgICAgICBGaWxlLm9wZW4oZmlsZW5hbWUpIHsgfGZ8IHNlbGYubG9hZChmLCBvcHRpb25zKSB9CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9wYXJzZS9kYXRlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcGFyc2UvZGF0ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNjNjJhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcGFyc2UvZGF0ZS5yYgpAQCAtMCwwICsxLDM1IEBACittb2R1bGUgU2FmZVlBTUwKKyAgY2xhc3MgUGFyc2UKKyAgICBjbGFzcyBEYXRlCisgICAgICAjIFRoaXMgb25lJ3MgZWFzeSBlbm91Z2ggOikKKyAgICAgIERBVEVfTUFUQ0hFUiA9IC9cQShcZHs0fSktKFxkezJ9KS0oXGR7Mn0pXFovLmZyZWV6ZQorCisgICAgICAjIFRoaXMgdW5iZWxpZXZhYmxlIGxpdHRsZSBnZW0gaXMgdGFrZW4gYmFzaWNhbGx5IHN0cmFpZ2h0IGZyb20gdGhlIFlBTUwgc3BlYywgYnV0IG1hZGUKKyAgICAgICMgc2xpZ2h0bHkgbW9yZSByZWFkYWJsZSAodG8gbXkgcG9vciBleWVzIGF0IGxlYXN0KSB0byBtZToKKyAgICAgICMgaHR0cDovL3lhbWwub3JnL3R5cGUvdGltZXN0YW1wLmh0bWwKKyAgICAgIFRJTUVfTUFUQ0hFUiA9IC9cQVxkezR9LVxkezEsMn0tXGR7MSwyfSg/OltUdF18XHMrKVxkezEsMn06XGR7Mn06XGR7Mn0oPzpcLlxkKik/XHMqKD86WnxbLStdXGR7MSwyfSg/Ojo/XGR7Mn0pPyk/XFovLmZyZWV6ZQorCisgICAgICBTRUNPTkRTX1BFUl9EQVkgPSA2MCAqIDYwICogMjQKKyAgICAgIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EID0gMTAwMDAwMAorCisgICAgICAjIFNvIHRoaXMgaXMgd2VpcmQuIEluIFJ1YnkgMS44LjcsIHRoZSBEYXRlVGltZSNzZWNfZnJhY3Rpb24gbWV0aG9kIHJldHVybmVkIGZyYWN0aW9uYWwKKyAgICAgICMgc2Vjb25kcyBpbiB1bml0cyBvZiBEQVlTIGZvciBzb21lIHJlYXNvbi4gSW4gMS45LjIsIHRoZXkgY2hhbmdlZCB0aGUgdW5pdHMgLS0gbXVjaCBtb3JlCisgICAgICAjIHJlYXNvbmFibHkgLS0gdG8gc2Vjb25kcy4KKyAgICAgIFNFQ19GUkFDVElPTl9NVUxUSVBMSUVSID0gUlVCWV9WRVJTSU9OID09ICIxLjguNyIgPyAoU0VDT05EU19QRVJfREFZICogTUlDUk9TRUNPTkRTX1BFUl9TRUNPTkQpIDogTUlDUk9TRUNPTkRTX1BFUl9TRUNPTkQKKworICAgICAgIyBUaGUgRGF0ZVRpbWUgY2xhc3MgaGFzIGEgI3RvX3RpbWUgbWV0aG9kIGluIFJ1YnkgMS45KzsKKyAgICAgICMgQmVmb3JlIHRoYXQgd2UnbGwganVzdCBuZWVkIHRvIGNvbnZlcnQgRGF0ZVRpbWUgdG8gVGltZSBvdXJzZWx2ZXMuCisgICAgICBUT19USU1FX0FWQUlMQUJMRSA9IERhdGVUaW1lLmluc3RhbmNlX21ldGhvZHMuaW5jbHVkZT8oOnRvX3RpbWUpCisKKyAgICAgIGRlZiBzZWxmLnZhbHVlKHZhbHVlKQorICAgICAgICBkID0gRGF0ZVRpbWUucGFyc2UodmFsdWUpCisKKyAgICAgICAgcmV0dXJuIGQudG9fdGltZSBpZiBUT19USU1FX0FWQUlMQUJMRQorCisgICAgICAgIHVzZWMgPSBkLnNlY19mcmFjdGlvbiAqIFNFQ19GUkFDVElPTl9NVUxUSVBMSUVSCisgICAgICAgIHRpbWUgPSBUaW1lLnV0YyhkLnllYXIsIGQubW9udGgsIGQuZGF5LCBkLmhvdXIsIGQubWluLCBkLnNlYywgdXNlYykgLSAoZC5vZmZzZXQgKiBTRUNPTkRTX1BFUl9EQVkpCisgICAgICAgIHRpbWUuZ2V0bG9jYWwKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcGFyc2UvaGV4YWRlY2ltYWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9wYXJzZS9oZXhhZGVjaW1hbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGEzNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcGFyc2UvaGV4YWRlY2ltYWwucmIKQEAgLTAsMCArMSwxMiBAQAorbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIFBhcnNlCisgICAgY2xhc3MgSGV4YWRlY2ltYWwKKyAgICAgIE1BVENIRVIgPSAvXEFbLStdPzB4WzAtOWEtZkEtRl9dK1xaLy5mcmVlemUKKworICAgICAgZGVmIHNlbGYudmFsdWUodmFsdWUpCisgICAgICAgICMgVGhpcyBpcyBzYWZlIHRvIGRvIHNpbmNlIHdlIGFscmVhZHkgdmFsaWRhdGVkIHRoZSB2YWx1ZS4KKyAgICAgICAgcmV0dXJuIEludGVnZXIodmFsdWUuZ3N1YigvXy8sICIiKSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcGFyc2Uvc2V4YWdlc2ltYWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9wYXJzZS9zZXhhZ2VzaW1hbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmZmNWJiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcGFyc2Uvc2V4YWdlc2ltYWwucmIKQEAgLTAsMCArMSwyNiBAQAorbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIFBhcnNlCisgICAgY2xhc3MgU2V4YWdlc2ltYWwKKyAgICAgIElOVEVHRVJfTUFUQ0hFUiA9IC9cQVstK10/WzAtOV1bMC05X10qKDpbMC01XT9bMC05XSkrXFovLmZyZWV6ZQorICAgICAgRkxPQVRfTUFUQ0hFUiA9IC9cQVstK10/WzAtOV1bMC05X10qKDpbMC01XT9bMC05XSkrXC5bMC05X10qXFovLmZyZWV6ZQorCisgICAgICBkZWYgc2VsZi52YWx1ZSh2YWx1ZSkKKyAgICAgICAgYmVmb3JlX2RlY2ltYWwsIGFmdGVyX2RlY2ltYWwgPSB2YWx1ZS5zcGxpdCgiLiIpCisKKyAgICAgICAgd2hvbGVfcGFydCA9IDAKKyAgICAgICAgbXVsdGlwbGllciA9IDEKKworICAgICAgICBiZWZvcmVfZGVjaW1hbCA9IGJlZm9yZV9kZWNpbWFsLnNwbGl0KCI6IikKKyAgICAgICAgdW50aWwgYmVmb3JlX2RlY2ltYWwuZW1wdHk/CisgICAgICAgICAgd2hvbGVfcGFydCArPSAoRmxvYXQoYmVmb3JlX2RlY2ltYWwucG9wKSAqIG11bHRpcGxpZXIpCisgICAgICAgICAgbXVsdGlwbGllciAqPSA2MAorICAgICAgICBlbmQKKworICAgICAgICByZXN1bHQgPSB3aG9sZV9wYXJ0CisgICAgICAgIHJlc3VsdCArPSBGbG9hdCgiLiIgKyBhZnRlcl9kZWNpbWFsKSB1bmxlc3MgYWZ0ZXJfZGVjaW1hbC5uaWw/CisgICAgICAgIHJlc3VsdCAqPSAtMSBpZiB2YWx1ZVswXSA9PSAiLSIKKyAgICAgICAgcmVzdWx0CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3BzeWNoX2hhbmRsZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9wc3ljaF9oYW5kbGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDE2YTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9wc3ljaF9oYW5kbGVyLnJiCkBAIC0wLDAgKzEsOTkgQEAKK3JlcXVpcmUgInBzeWNoIgorcmVxdWlyZSAiYmFzZTY0IgorCittb2R1bGUgU2FmZVlBTUwKKyAgY2xhc3MgUHN5Y2hIYW5kbGVyIDwgUHN5Y2g6OkhhbmRsZXIKKyAgICBkZWYgaW5pdGlhbGl6ZShvcHRpb25zLCAmYmxvY2spCisgICAgICBAb3B0aW9ucyAgICAgID0gU2FmZVlBTUw6Ok9QVElPTlMubWVyZ2Uob3B0aW9ucyB8fCB7fSkKKyAgICAgIEBibG9jayAgICAgICAgPSBibG9jaworICAgICAgQGluaXRpYWxpemVycyA9IEBvcHRpb25zWzpjdXN0b21faW5pdGlhbGl6ZXJzXSB8fCB7fQorICAgICAgQGFuY2hvcnMgICAgICA9IHt9CisgICAgICBAc3RhY2sgICAgICAgID0gW10KKyAgICAgIEBjdXJyZW50X2tleSAgPSBuaWwKKyAgICAgIEByZXN1bHQgICAgICAgPSBuaWwKKyAgICAgIEBiZWd1biAgICAgICAgPSBmYWxzZQorICAgIGVuZAorCisgICAgZGVmIHJlc3VsdAorICAgICAgQGJlZ3VuID8gQHJlc3VsdCA6IGZhbHNlCisgICAgZW5kCisKKyAgICBkZWYgYWRkX3RvX2N1cnJlbnRfc3RydWN0dXJlKHZhbHVlLCBhbmNob3I9bmlsLCBxdW90ZWQ9bmlsLCB0YWc9bmlsKQorICAgICAgdmFsdWUgPSBUcmFuc2Zvcm0udG9fcHJvcGVyX3R5cGUodmFsdWUsIHF1b3RlZCwgdGFnLCBAb3B0aW9ucykKKworICAgICAgQGFuY2hvcnNbYW5jaG9yXSA9IHZhbHVlIGlmIGFuY2hvcgorCisgICAgICBpZiAhQGJlZ3VuCisgICAgICAgIEBiZWd1biA9IHRydWUKKyAgICAgICAgQHJlc3VsdCA9IHZhbHVlCisgICAgICAgIEBjdXJyZW50X3N0cnVjdHVyZSA9IEByZXN1bHQKKyAgICAgICAgcmV0dXJuCisgICAgICBlbmQKKworICAgICAgaWYgQGN1cnJlbnRfc3RydWN0dXJlLnJlc3BvbmRfdG8/KDo8PCkKKyAgICAgICAgQGN1cnJlbnRfc3RydWN0dXJlIDw8IHZhbHVlCisKKyAgICAgIGVsc2lmIEBjdXJyZW50X3N0cnVjdHVyZS5yZXNwb25kX3RvPyg6W109KQorICAgICAgICBpZiBAY3VycmVudF9rZXkubmlsPworICAgICAgICAgIEBjdXJyZW50X2tleSA9IHZhbHVlCisKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmIEBjdXJyZW50X2tleSA9PSAiPDwiCisgICAgICAgICAgICBAY3VycmVudF9zdHJ1Y3R1cmUubWVyZ2UhKHZhbHVlKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEBjdXJyZW50X3N0cnVjdHVyZVtAY3VycmVudF9rZXldID0gdmFsdWUKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIEBjdXJyZW50X2tleSA9IG5pbAorICAgICAgICBlbmQKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSAiRG9uJ3Qga25vdyBob3cgdG8gYWRkIHRvIGEgI3tAY3VycmVudF9zdHJ1Y3R1cmUuY2xhc3N9ISIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGVuZF9jdXJyZW50X3N0cnVjdHVyZQorICAgICAgQHN0YWNrLnBvcAorICAgICAgQGN1cnJlbnRfc3RydWN0dXJlID0gQHN0YWNrLmxhc3QKKyAgICBlbmQKKworICAgIGRlZiBzdHJlYW1pbmc/CisgICAgICB0cnVlCisgICAgZW5kCisKKyAgICAjIGV2ZW50IGhhbmRsZXJzCisgICAgZGVmIGFsaWFzKGFuY2hvcikKKyAgICAgIGFkZF90b19jdXJyZW50X3N0cnVjdHVyZShAYW5jaG9yc1thbmNob3JdKQorICAgIGVuZAorCisgICAgZGVmIHNjYWxhcih2YWx1ZSwgYW5jaG9yLCB0YWcsIHBsYWluLCBxdW90ZWQsIHN0eWxlKQorICAgICAgYWRkX3RvX2N1cnJlbnRfc3RydWN0dXJlKHZhbHVlLCBhbmNob3IsIHF1b3RlZCwgdGFnKQorICAgIGVuZAorCisgICAgZGVmIGVuZF9kb2N1bWVudChpbXBsaWNpdCkKKyAgICAgIEBibG9jay5jYWxsKEByZXN1bHQpCisgICAgZW5kCisKKyAgICBkZWYgc3RhcnRfbWFwcGluZyhhbmNob3IsIHRhZywgaW1wbGljaXQsIHN0eWxlKQorICAgICAgbWFwID0gQGluaXRpYWxpemVycy5pbmNsdWRlPyh0YWcpID8gQGluaXRpYWxpemVyc1t0YWddLmNhbGwgOiB7fQorICAgICAgc2VsZi5hZGRfdG9fY3VycmVudF9zdHJ1Y3R1cmUobWFwLCBhbmNob3IpCisgICAgICBAY3VycmVudF9zdHJ1Y3R1cmUgPSBtYXAKKyAgICAgIEBzdGFjay5wdXNoKG1hcCkKKyAgICBlbmQKKworICAgIGRlZiBlbmRfbWFwcGluZworICAgICAgc2VsZi5lbmRfY3VycmVudF9zdHJ1Y3R1cmUoKQorICAgIGVuZAorCisgICAgZGVmIHN0YXJ0X3NlcXVlbmNlKGFuY2hvciwgdGFnLCBpbXBsaWNpdCwgc3R5bGUpCisgICAgICBzZXEgPSBAaW5pdGlhbGl6ZXJzLmluY2x1ZGU/KHRhZykgPyBAaW5pdGlhbGl6ZXJzW3RhZ10uY2FsbCA6IFtdCisgICAgICBzZWxmLmFkZF90b19jdXJyZW50X3N0cnVjdHVyZShzZXEsIGFuY2hvcikKKyAgICAgIEBjdXJyZW50X3N0cnVjdHVyZSA9IHNlcQorICAgICAgQHN0YWNrLnB1c2goc2VxKQorICAgIGVuZAorCisgICAgZGVmIGVuZF9zZXF1ZW5jZQorICAgICAgc2VsZi5lbmRfY3VycmVudF9zdHJ1Y3R1cmUoKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcHN5Y2hfcmVzb2x2ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9wc3ljaF9yZXNvbHZlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE5ODliCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcHN5Y2hfcmVzb2x2ZXIucmIKQEAgLTAsMCArMSw1MiBAQAorbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIFBzeWNoUmVzb2x2ZXIgPCBSZXNvbHZlcgorICAgIE5PREVfVFlQRVMgPSB7CisgICAgICBQc3ljaDo6Tm9kZXM6OkRvY3VtZW50ID0+IDpyb290LAorICAgICAgUHN5Y2g6Ok5vZGVzOjpNYXBwaW5nICA9PiA6bWFwLAorICAgICAgUHN5Y2g6Ok5vZGVzOjpTZXF1ZW5jZSA9PiA6c2VxLAorICAgICAgUHN5Y2g6Ok5vZGVzOjpTY2FsYXIgICA9PiA6c2NhbGFyLAorICAgICAgUHN5Y2g6Ok5vZGVzOjpBbGlhcyAgICA9PiA6YWxpYXMKKyAgICB9LmZyZWV6ZQorCisgICAgZGVmIGluaXRpYWxpemUob3B0aW9ucz17fSkKKyAgICAgIHN1cGVyCisgICAgICBAYWxpYXNlZF9ub2RlcyA9IHt9CisgICAgZW5kCisKKyAgICBkZWYgcmVzb2x2ZV9yb290KHJvb3QpCisgICAgICByZXNvbHZlX3NlcShyb290KS5maXJzdAorICAgIGVuZAorCisgICAgZGVmIHJlc29sdmVfYWxpYXMobm9kZSkKKyAgICAgIHJlc29sdmVfbm9kZShAYWxpYXNlZF9ub2Rlc1tub2RlLmFuY2hvcl0pCisgICAgZW5kCisKKyAgICBkZWYgbmF0aXZlX3Jlc29sdmUobm9kZSkKKyAgICAgIEB2aXNpdG9yIHx8PSBTYWZlWUFNTDo6U2FmZVRvUnVieVZpc2l0b3IubmV3KHNlbGYpCisgICAgICBAdmlzaXRvci5hY2NlcHQobm9kZSkKKyAgICBlbmQKKworICAgIGRlZiBnZXRfbm9kZV90eXBlKG5vZGUpCisgICAgICBOT0RFX1RZUEVTW25vZGUuY2xhc3NdCisgICAgZW5kCisKKyAgICBkZWYgZ2V0X25vZGVfdGFnKG5vZGUpCisgICAgICBub2RlLnRhZworICAgIGVuZAorCisgICAgZGVmIGdldF9ub2RlX3ZhbHVlKG5vZGUpCisgICAgICBAYWxpYXNlZF9ub2Rlc1tub2RlLmFuY2hvcl0gPSBub2RlIGlmIG5vZGUucmVzcG9uZF90bz8oOmFuY2hvcikgJiYgbm9kZS5hbmNob3IKKworICAgICAgY2FzZSBnZXRfbm9kZV90eXBlKG5vZGUpCisgICAgICB3aGVuIDpyb290LCA6bWFwLCA6c2VxCisgICAgICAgIG5vZGUuY2hpbGRyZW4KKyAgICAgIHdoZW4gOnNjYWxhcgorICAgICAgICBub2RlLnZhbHVlCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiB2YWx1ZV9pc19xdW90ZWQ/KG5vZGUpCisgICAgICBub2RlLnF1b3RlZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcmVzb2x2ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9yZXNvbHZlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRlMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvcmVzb2x2ZXIucmIKQEAgLTAsMCArMSw5NCBAQAorbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIFJlc29sdmVyCisgICAgZGVmIGluaXRpYWxpemUob3B0aW9ucykKKyAgICAgIEBvcHRpb25zICAgICAgICAgICAgICA9IFNhZmVZQU1MOjpPUFRJT05TLm1lcmdlKG9wdGlvbnMgfHwge30pCisgICAgICBAd2hpdGVsaXN0ICAgICAgICAgICAgPSBAb3B0aW9uc1s6d2hpdGVsaXN0ZWRfdGFnc10gfHwgW10KKyAgICAgIEBpbml0aWFsaXplcnMgICAgICAgICA9IEBvcHRpb25zWzpjdXN0b21faW5pdGlhbGl6ZXJzXSB8fCB7fQorICAgICAgQHJhaXNlX29uX3Vua25vd25fdGFnID0gQG9wdGlvbnNbOnJhaXNlX29uX3Vua25vd25fdGFnXQorICAgIGVuZAorCisgICAgZGVmIHJlc29sdmVfbm9kZShub2RlKQorICAgICAgcmV0dXJuIG5vZGUgaWYgIW5vZGUKKyAgICAgIHJldHVybiBzZWxmLm5hdGl2ZV9yZXNvbHZlKG5vZGUpIGlmIHRhZ19pc193aGl0ZWxpc3RlZD8oc2VsZi5nZXRfbm9kZV90YWcobm9kZSkpCisKKyAgICAgIGNhc2Ugc2VsZi5nZXRfbm9kZV90eXBlKG5vZGUpCisgICAgICB3aGVuIDpyb290CisgICAgICAgIHJlc29sdmVfcm9vdChub2RlKQorICAgICAgd2hlbiA6bWFwCisgICAgICAgIHJlc29sdmVfbWFwKG5vZGUpCisgICAgICB3aGVuIDpzZXEKKyAgICAgICAgcmVzb2x2ZV9zZXEobm9kZSkKKyAgICAgIHdoZW4gOnNjYWxhcgorICAgICAgICByZXNvbHZlX3NjYWxhcihub2RlKQorICAgICAgd2hlbiA6YWxpYXMKKyAgICAgICAgcmVzb2x2ZV9hbGlhcyhub2RlKQorICAgICAgZWxzZQorICAgICAgICByYWlzZSAiRG9uJ3Qga25vdyBob3cgdG8gcmVzb2x2ZSB0aGlzIG5vZGU6ICN7bm9kZS5pbnNwZWN0fSIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlc29sdmVfbWFwKG5vZGUpCisgICAgICB0YWcgID0gZ2V0X2FuZF9jaGVja19ub2RlX3RhZyhub2RlKQorICAgICAgaGFzaCA9IEBpbml0aWFsaXplcnMuaW5jbHVkZT8odGFnKSA/IEBpbml0aWFsaXplcnNbdGFnXS5jYWxsIDoge30KKyAgICAgIG1hcCAgPSBub3JtYWxpemVfbWFwKHNlbGYuZ2V0X25vZGVfdmFsdWUobm9kZSkpCisKKyAgICAgICMgVGFrZSB0aGUgIjw8IiBrZXkgbm9kZXMgZmlyc3QsIGFzIHRoZXNlIGFyZSBtZWFudCB0byBhcHByb3hpbWF0ZSBhIGZvcm0gb2YgaW5oZXJpdGFuY2UuCisgICAgICBpbmhlcml0b3JzID0gbWFwLnNlbGVjdCB7IHxrZXlfbm9kZSwgdmFsdWVfbm9kZXwgcmVzb2x2ZV9ub2RlKGtleV9ub2RlKSA9PSAiPDwiIH0KKyAgICAgIGluaGVyaXRvcnMuZWFjaCBkbyB8a2V5X25vZGUsIHZhbHVlX25vZGV8CisgICAgICAgIG1lcmdlX2ludG9faGFzaChoYXNoLCByZXNvbHZlX25vZGUodmFsdWVfbm9kZSkpCisgICAgICBlbmQKKworICAgICAgIyBBbGwgdGhhdCdzIGxlZnQgc2hvdWxkIGJlIG5vcm1hbCAobm9uLSI8PCIpIG5vZGVzLgorICAgICAgKG1hcCAtIGluaGVyaXRvcnMpLmVhY2ggZG8gfGtleV9ub2RlLCB2YWx1ZV9ub2RlfAorICAgICAgICBoYXNoW3Jlc29sdmVfbm9kZShrZXlfbm9kZSldID0gcmVzb2x2ZV9ub2RlKHZhbHVlX25vZGUpCisgICAgICBlbmQKKworICAgICAgcmV0dXJuIGhhc2gKKyAgICBlbmQKKworICAgIGRlZiByZXNvbHZlX3NlcShub2RlKQorICAgICAgc2VxID0gc2VsZi5nZXRfbm9kZV92YWx1ZShub2RlKQorCisgICAgICB0YWcgPSBnZXRfYW5kX2NoZWNrX25vZGVfdGFnKG5vZGUpCisgICAgICBhcnIgPSBAaW5pdGlhbGl6ZXJzLmluY2x1ZGU/KHRhZykgPyBAaW5pdGlhbGl6ZXJzW3RhZ10uY2FsbCA6IFtdCisKKyAgICAgIHNlcS5pbmplY3QoYXJyKSB7IHxhcnJheSwgbnwgYXJyYXkgPDwgcmVzb2x2ZV9ub2RlKG4pIH0KKyAgICBlbmQKKworICAgIGRlZiByZXNvbHZlX3NjYWxhcihub2RlKQorICAgICAgVHJhbnNmb3JtLnRvX3Byb3Blcl90eXBlKHNlbGYuZ2V0X25vZGVfdmFsdWUobm9kZSksIHNlbGYudmFsdWVfaXNfcXVvdGVkPyhub2RlKSwgZ2V0X2FuZF9jaGVja19ub2RlX3RhZyhub2RlKSwgQG9wdGlvbnMpCisgICAgZW5kCisKKyAgICBkZWYgZ2V0X2FuZF9jaGVja19ub2RlX3RhZyhub2RlKQorICAgICAgdGFnID0gc2VsZi5nZXRfbm9kZV90YWcobm9kZSkKKyAgICAgIFNhZmVZQU1MLnRhZ19zYWZldHlfY2hlY2shKHRhZywgQG9wdGlvbnMpCisgICAgICB0YWcKKyAgICBlbmQKKworICAgIGRlZiB0YWdfaXNfd2hpdGVsaXN0ZWQ/KHRhZykKKyAgICAgIEB3aGl0ZWxpc3QuaW5jbHVkZT8odGFnKQorICAgIGVuZAorCisgICAgZGVmIG9wdGlvbnMKKyAgICAgIEBvcHRpb25zCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIG5vcm1hbGl6ZV9tYXAobWFwKQorICAgICAgIyBTeWNrIGNyZWF0ZXMgSGFzaGVzIGZyb20gbWFwcy4KKyAgICAgIGlmIG1hcC5pc19hPyhIYXNoKQorICAgICAgICBtYXAuaW5qZWN0KFtdKSB7IHxhcnIsIGtleV9hbmRfdmFsdWV8IGFyciA8PCBrZXlfYW5kX3ZhbHVlIH0KKworICAgICAgIyBQc3ljaCBpcyByZWFsbHkgd2VpcmQ7IGl0IGZsYXR0ZW5zIG91dCBhIEhhc2ggY29tcGxldGVseSBpbnRvOiBba2V5LCB2YWx1ZSwga2V5LCB2YWx1ZSwgLi4uXQorICAgICAgZWxzZQorICAgICAgICBtYXAuZWFjaF9zbGljZSgyKS50b19hCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBtZXJnZV9pbnRvX2hhc2goaGFzaCwgYXJyYXkpCisgICAgICBhcnJheS5lYWNoIGRvIHxrZXksIHZhbHVlfAorICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9zYWZlX3RvX3J1YnlfdmlzaXRvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3NhZmVfdG9fcnVieV92aXNpdG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODA0NDUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9zYWZlX3RvX3J1YnlfdmlzaXRvci5yYgpAQCAtMCwwICsxLDI5IEBACittb2R1bGUgU2FmZVlBTUwKKyAgY2xhc3MgU2FmZVRvUnVieVZpc2l0b3IgPCBQc3ljaDo6VmlzaXRvcnM6OlRvUnVieQorICAgIElOSVRJQUxJWkVfQVJJVFkgPSBzdXBlcmNsYXNzLmluc3RhbmNlX21ldGhvZCg6aW5pdGlhbGl6ZSkuYXJpdHkKKworICAgIGRlZiBpbml0aWFsaXplKHJlc29sdmVyKQorICAgICAgY2FzZSBJTklUSUFMSVpFX0FSSVRZCisgICAgICB3aGVuIDIKKyAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vdGVuZGVybG92ZS9wc3ljaC9ibG9iL3YyLjAuMC9saWIvcHN5Y2gvdmlzaXRvcnMvdG9fcnVieS5yYiNMMTQtTDI4CisgICAgICAgIGxvYWRlciAgPSBQc3ljaDo6Q2xhc3NMb2FkZXIubmV3CisgICAgICAgIHNjYW5uZXIgPSBQc3ljaDo6U2NhbGFyU2Nhbm5lci5uZXcobG9hZGVyKQorICAgICAgICBzdXBlcihzY2FubmVyLCBsb2FkZXIpCisKKyAgICAgIGVsc2UKKyAgICAgICAgc3VwZXIoKQorICAgICAgZW5kCisKKyAgICAgIEByZXNvbHZlciA9IHJlc29sdmVyCisgICAgZW5kCisKKyAgICBkZWYgYWNjZXB0KG5vZGUpCisgICAgICBpZiBub2RlLnRhZworICAgICAgICBTYWZlWUFNTC50YWdfc2FmZXR5X2NoZWNrIShub2RlLnRhZywgQHJlc29sdmVyLm9wdGlvbnMpCisgICAgICAgIHJldHVybiBzdXBlcgorICAgICAgZW5kCisKKyAgICAgIEByZXNvbHZlci5yZXNvbHZlX25vZGUobm9kZSkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3N5Y2tfaGFjay5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3N5Y2tfaGFjay5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE1ZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvc3lja19oYWNrLnJiCkBAIC0wLDAgKzEsMzYgQEAKKyMgSGFjayB0byBKUnVieSAxLjgncyBZQU1MIFBhcnNlciBZZWNodAorIworIyBUaGlzIGZpbGUgaXMgYWx3YXlzIGxvYWRlZCBBRlRFUiBlaXRoZXIgc3ljayBvciBwc3ljaCBhcmUgYWxyZWFkeQorIyBsb2FkZWQuIEl0IHRoZW4gbG9va3MgYXQgd2hhdCBjb25zdGFudHMgYXJlIGF2YWlsYWJsZSBhbmQgY3JlYXRlcworIyBhIGNvbnNpc3RlbnQgdmlldyBvbiBhbGwgcnVieXMuCisjCisjIFRha2VuIGZyb20gcnVieWdlbXMgYW5kIG1vZGlmaWVkLgorIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3J1YnlnZW1zL3J1YnlnZW1zL2Jsb2IvbWFzdGVyL2xpYi9ydWJ5Z2Vtcy9zeWNrX2hhY2sucmIKKworbW9kdWxlIFlBTUwKKyAgIyBJbiBuZXdlciAxLjkuMiwgdGhlcmUgaXMgYSBTeWNrIHRvcGxldmVsIGNvbnN0YW50IGluc3RlYWQgb2YgaXQKKyAgIyBiZWluZyB1bmRlcm5laXRoIFlBTUwuIElmIHNvLCByZWZlcmVuY2UgaXQgYmFjayB1bmRlciBZQU1MIGFzCisgICMgd2VsbC4KKyAgaWYgZGVmaW5lZD8gOjpTeWNrCisgICAgIyBmb3IgdGVzdHMgdGhhdCBjaGFuZ2UgWUFNTDo6RU5HSU5FCisgICAgIyAxLjggZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGNvbnN0X2RlZmluZWQ/CisgICAgcmVtb3ZlX2NvbnN0IDpTeWNrIHJlc2N1ZSBuaWwKKworICAgIFN5Y2sgPSA6OlN5Y2sKKworICAjIEpSdWJ5J3MgIlN5Y2siIGlzIGNhbGxlZCAiWWVjaHQiCisgIGVsc2lmIGRlZmluZWQ/IFlBTUw6OlllY2h0CisgICAgU3ljayA9IFlBTUw6OlllY2h0CisgIGVuZAorZW5kCisKKyMgU29tZXRpbWUgaW4gdGhlIDEuOSBkZXYgY3ljbGUsIHRoZSBTeWNrIGNvbnN0YW50IHdhcyBtb3ZlZCBmcm9tIHVuZGVyIFlBTUwKKyMgdG8gYmUgYSB0b3BsZXZlbCBjb25zdGFudC4gU28gZ2Vtc3BlY3MgY3JlYXRlZCB1bmRlciB0aGVzZSB2ZXJzaW9ucyBvZiBTeWNrCisjIHdpbGwgaGF2ZSByZWZlcmVuY2VzIHRvIFN5Y2s6OkRlZmF1bHRLZXkuCisjCisjIFNvIHdlIG5lZWQgdG8gYmUgc3VyZSB0aGF0IHdlIHJlZmVyZW5jZSBTeWNrIGF0IHRoZSB0b3BsZXZlbCB0b28gc28gdGhhdAorIyB3ZSBjYW4gYWx3YXlzIGxvYWQgdGhlc2Uga2luZCBvZiBnZW1zcGVjcy4KKyMKK2lmICFkZWZpbmVkPyhTeWNrKQorICBTeWNrID0gWUFNTDo6U3ljaworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9zeWNrX25vZGVfbW9ua2V5cGF0Y2gucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9zeWNrX25vZGVfbW9ua2V5cGF0Y2gucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyNjM3NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3N5Y2tfbm9kZV9tb25rZXlwYXRjaC5yYgpAQCAtMCwwICsxLDQzIEBACisjIFRoaXMgaXMsIGFkbWl0dGVkbHksIHByZXR0eSBpbnNhbmUuIEZ1bmRhbWVudGFsbHkgdGhlIGNoYWxsZW5nZSBoZXJlIGlzIHRoaXM6IGlmIHdlIHdhbnQgdG8gYWxsb3cKKyMgd2hpdGVsaXN0aW5nIG9mIHRhZ3MgKHdoaWxlIHN0aWxsIGxldmVyYWdpbmcgU3ljaydzIGludGVybmFsIGZ1bmN0aW9uYWxpdHkpLCB0aGVuIHdlIGhhdmUgdG8KKyMgY2hhbmdlIGhvdyBTeWNrOjpOb2RlI3RyYW5zZm9ybSB3b3Jrcy4gQnV0IHNpbmNlIHdlIChTYWZlWUFNTCkgZG8gbm90IGNvbnRyb2wgaW5zdGFudGlhdGlvbiBvZgorIyBTeWNrOjpOb2RlIG9iamVjdHMsIHdlIGNhbm5vdCwgZm9yIGV4YW1wbGUsIHN1YmNsYXNzIFN5Y2s6Ok5vZGUgYW5kIG92ZXJyaWRlICN0cmFuZm9ybSB0aGUgImVhc3kiCisjIHdheS4gU28gdGhlIG9ubHkgY2hvaWNlIGlzIHRvIG1vbmtleXBhdGNoLCBsaWtlIHRoaXMuIEFuZCB0aGUgb25seSB3YXkgdG8gbWFrZSB0aGlzIHdvcmsKKyMgcmVjdXJzaXZlbHkgd2l0aCBwb3RlbnRpYWxseSBjYWxsLXNwZWNpZmljIG9wdGlvbnMgKHRoYXQgbXkgZmVlYmxlIGJyYWluIGNhbiB0aGluayBvZikgaXMgdG8gc2V0CisjIHBzZXVkby1nbG9iYWwgb3B0aW9ucyBvbiB0aGUgZmlyc3QgY2FsbCBhbmQgdW5zZXQgdGhlbSBvbmNlIHRoZSByZWN1cnNpdmUgc3RhY2sgaGFzIGZ1bGx5IHVud291bmQuCisKK21vbmtleXBhdGNoID0gPDwtRU9SVUJZCisgIGNsYXNzIE5vZGUKKyAgICBAQHNhZmVfdHJhbnNmb3JtX2RlcHRoICAgICA9IDAKKyAgICBAQHNhZmVfdHJhbnNmb3JtX3doaXRlbGlzdCA9IG5pbAorCisgICAgZGVmIHNhZmVfdHJhbnNmb3JtKG9wdGlvbnM9e30pCisgICAgICBiZWdpbgorICAgICAgICBAQHNhZmVfdHJhbnNmb3JtX2RlcHRoICs9IDEKKyAgICAgICAgQEBzYWZlX3RyYW5zZm9ybV93aGl0ZWxpc3QgfHw9IG9wdGlvbnNbOndoaXRlbGlzdGVkX3RhZ3NdCisKKyAgICAgICAgaWYgc2VsZi50eXBlX2lkCisgICAgICAgICAgU2FmZVlBTUwudGFnX3NhZmV0eV9jaGVjayEoc2VsZi50eXBlX2lkLCBvcHRpb25zKQorICAgICAgICAgIHJldHVybiB1bnNhZmVfdHJhbnNmb3JtIGlmIEBAc2FmZV90cmFuc2Zvcm1fd2hpdGVsaXN0LmluY2x1ZGU/KHNlbGYudHlwZV9pZCkKKyAgICAgICAgZW5kCisKKyAgICAgICAgU2FmZVlBTUw6OlN5Y2tSZXNvbHZlci5uZXcucmVzb2x2ZV9ub2RlKHNlbGYpCisKKyAgICAgIGVuc3VyZQorICAgICAgICBAQHNhZmVfdHJhbnNmb3JtX2RlcHRoIC09IDEKKyAgICAgICAgaWYgQEBzYWZlX3RyYW5zZm9ybV9kZXB0aCA9PSAwCisgICAgICAgICAgQEBzYWZlX3RyYW5zZm9ybV93aGl0ZWxpc3QgPSBuaWwKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGFsaWFzX21ldGhvZCA6dW5zYWZlX3RyYW5zZm9ybSwgOnRyYW5zZm9ybQorICAgIGFsaWFzX21ldGhvZCA6dHJhbnNmb3JtLCA6c2FmZV90cmFuc2Zvcm0KKyAgZW5kCitFT1JVQlkKKworaWYgZGVmaW5lZD8oWUFNTDo6U3ljazo6Tm9kZSkKKyAgWUFNTDo6U3ljay5tb2R1bGVfZXZhbCBtb25rZXlwYXRjaAorZWxzZQorICBTeWNrLm1vZHVsZV9ldmFsIG1vbmtleXBhdGNoCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3N5Y2tfcmVzb2x2ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9zeWNrX3Jlc29sdmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDU1YWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC9zeWNrX3Jlc29sdmVyLnJiCkBAIC0wLDAgKzEsMzggQEAKK21vZHVsZSBTYWZlWUFNTAorICBjbGFzcyBTeWNrUmVzb2x2ZXIgPCBSZXNvbHZlcgorICAgIFFVT1RFX1NUWUxFUyA9IFsKKyAgICAgIDpxdW90ZTEsCisgICAgICA6cXVvdGUyCisgICAgXS5mcmVlemUKKworICAgIE5PREVfVFlQRVMgPSB7CisgICAgICBIYXNoICAgPT4gOm1hcCwKKyAgICAgIEFycmF5ICA9PiA6c2VxLAorICAgICAgU3RyaW5nID0+IDpzY2FsYXIKKyAgICB9LmZyZWV6ZQorCisgICAgZGVmIGluaXRpYWxpemUob3B0aW9ucz17fSkKKyAgICAgIHN1cGVyCisgICAgZW5kCisKKyAgICBkZWYgbmF0aXZlX3Jlc29sdmUobm9kZSkKKyAgICAgIG5vZGUudHJhbnNmb3JtKHNlbGYub3B0aW9ucykKKyAgICBlbmQKKworICAgIGRlZiBnZXRfbm9kZV90eXBlKG5vZGUpCisgICAgICBOT0RFX1RZUEVTW25vZGUudmFsdWUuY2xhc3NdCisgICAgZW5kCisKKyAgICBkZWYgZ2V0X25vZGVfdGFnKG5vZGUpCisgICAgICBub2RlLnR5cGVfaWQKKyAgICBlbmQKKworICAgIGRlZiBnZXRfbm9kZV92YWx1ZShub2RlKQorICAgICAgbm9kZS52YWx1ZQorICAgIGVuZAorCisgICAgZGVmIHZhbHVlX2lzX3F1b3RlZD8obm9kZSkKKyAgICAgIFFVT1RFX1NUWUxFUy5pbmNsdWRlPyhub2RlLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QHN0eWxlKSkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3RyYW5zZm9ybS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3RyYW5zZm9ybS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjFkMWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvdHJhbnNmb3JtLnJiCkBAIC0wLDAgKzEsNDEgQEAKK3JlcXVpcmUgJ2Jhc2U2NCcKKworbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIFRyYW5zZm9ybQorICAgIFRSQU5TRk9STUVSUyA9IFsKKyAgICAgIFRyYW5zZm9ybTo6VG9TeW1ib2wubmV3LAorICAgICAgVHJhbnNmb3JtOjpUb0ludGVnZXIubmV3LAorICAgICAgVHJhbnNmb3JtOjpUb0Zsb2F0Lm5ldywKKyAgICAgIFRyYW5zZm9ybTo6VG9OaWwubmV3LAorICAgICAgVHJhbnNmb3JtOjpUb0Jvb2xlYW4ubmV3LAorICAgICAgVHJhbnNmb3JtOjpUb0RhdGUubmV3CisgICAgXQorCisgICAgZGVmIHNlbGYudG9fZ3Vlc3NlZF90eXBlKHZhbHVlLCBxdW90ZWQ9ZmFsc2UsIG9wdGlvbnM9bmlsKQorICAgICAgcmV0dXJuIHZhbHVlIGlmIHF1b3RlZAorCisgICAgICBpZiB2YWx1ZS5pc19hPyhTdHJpbmcpCisgICAgICAgIFRSQU5TRk9STUVSUy5lYWNoIGRvIHx0cmFuc2Zvcm1lcnwKKyAgICAgICAgICBzdWNjZXNzLCB0cmFuc2Zvcm1lZF92YWx1ZSA9IHRyYW5zZm9ybWVyLm1ldGhvZCg6dHJhbnNmb3JtPykuYXJpdHkgPT0gMSA/CisgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0/KHZhbHVlKSA6CisgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0/KHZhbHVlLCBvcHRpb25zKQorCisgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkX3ZhbHVlIGlmIHN1Y2Nlc3MKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgdmFsdWUKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLnRvX3Byb3Blcl90eXBlKHZhbHVlLCBxdW90ZWQ9ZmFsc2UsIHRhZz1uaWwsIG9wdGlvbnM9bmlsKQorICAgICAgY2FzZSB0YWcKKyAgICAgIHdoZW4gInRhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSIsICJ4LXByaXZhdGU6YmluYXJ5IiwgIiFiaW5hcnkiCisgICAgICAgIGRlY29kZWQgPSBCYXNlNjQuZGVjb2RlNjQodmFsdWUpCisgICAgICAgIGRlY29kZWQgPSBkZWNvZGVkLmZvcmNlX2VuY29kaW5nKHZhbHVlLmVuY29kaW5nKSBpZiBkZWNvZGVkLnJlc3BvbmRfdG8/KDpmb3JjZV9lbmNvZGluZykKKyAgICAgICAgZGVjb2RlZAorICAgICAgZWxzZQorICAgICAgICBzZWxmLnRvX2d1ZXNzZWRfdHlwZSh2YWx1ZSwgcXVvdGVkLCBvcHRpb25zKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9fYm9vbGVhbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3RyYW5zZm9ybS90b19ib29sZWFuLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGM4NWUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9fYm9vbGVhbi5yYgpAQCAtMCwwICsxLDIxIEBACittb2R1bGUgU2FmZVlBTUwKKyAgY2xhc3MgVHJhbnNmb3JtCisgICAgY2xhc3MgVG9Cb29sZWFuCisgICAgICBpbmNsdWRlIFRyYW5zZm9ybWF0aW9uTWFwCisKKyAgICAgIHNldF9wcmVkZWZpbmVkX3ZhbHVlcyh7CisgICAgICAgICJ5ZXMiICAgPT4gdHJ1ZSwKKyAgICAgICAgIm9uIiAgICA9PiB0cnVlLAorICAgICAgICAidHJ1ZSIgID0+IHRydWUsCisgICAgICAgICJubyIgICAgPT4gZmFsc2UsCisgICAgICAgICJvZmYiICAgPT4gZmFsc2UsCisgICAgICAgICJmYWxzZSIgPT4gZmFsc2UKKyAgICAgIH0pCisKKyAgICAgIGRlZiB0cmFuc2Zvcm0/KHZhbHVlKQorICAgICAgICByZXR1cm4gZmFsc2UgaWYgdmFsdWUubGVuZ3RoID4gNQorICAgICAgICByZXR1cm4gUFJFREVGSU5FRF9WQUxVRVMuaW5jbHVkZT8odmFsdWUpLCBQUkVERUZJTkVEX1ZBTFVFU1t2YWx1ZV0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvdHJhbnNmb3JtL3RvX2RhdGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9fZGF0ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmZlNTUyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvdHJhbnNmb3JtL3RvX2RhdGUucmIKQEAgLTAsMCArMSwxMyBAQAorbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIFRyYW5zZm9ybQorICAgIGNsYXNzIFRvRGF0ZQorICAgICAgZGVmIHRyYW5zZm9ybT8odmFsdWUpCisgICAgICAgIHJldHVybiB0cnVlLCBEYXRlLnBhcnNlKHZhbHVlKSBpZiBQYXJzZTo6RGF0ZTo6REFURV9NQVRDSEVSLm1hdGNoKHZhbHVlKQorICAgICAgICByZXR1cm4gdHJ1ZSwgUGFyc2U6OkRhdGUudmFsdWUodmFsdWUpIGlmIFBhcnNlOjpEYXRlOjpUSU1FX01BVENIRVIubWF0Y2godmFsdWUpCisgICAgICAgIGZhbHNlCisgICAgICByZXNjdWUgQXJndW1lbnRFcnJvcgorICAgICAgICByZXR1cm4gdHJ1ZSwgdmFsdWUKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvdHJhbnNmb3JtL3RvX2Zsb2F0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvdHJhbnNmb3JtL3RvX2Zsb2F0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTNmNWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9fZmxvYXQucmIKQEAgLTAsMCArMSwzMyBAQAorbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIFRyYW5zZm9ybQorICAgIGNsYXNzIFRvRmxvYXQKKyAgICAgIEluZmluaXR5ID0gMS4wIC8gMC4wCisgICAgICBOYU4gPSAwLjAgLyAwLjAKKworICAgICAgUFJFREVGSU5FRF9WQUxVRVMgPSB7CisgICAgICAgICIuaW5mIiAgPT4gSW5maW5pdHksCisgICAgICAgICIuSW5mIiAgPT4gSW5maW5pdHksCisgICAgICAgICIuSU5GIiAgPT4gSW5maW5pdHksCisgICAgICAgICItLmluZiIgPT4gLUluZmluaXR5LAorICAgICAgICAiLS5JbmYiID0+IC1JbmZpbml0eSwKKyAgICAgICAgIi0uSU5GIiA9PiAtSW5maW5pdHksCisgICAgICAgICIubmFuIiAgPT4gTmFOLAorICAgICAgICAiLk5hTiIgID0+IE5hTiwKKyAgICAgICAgIi5OQU4iICA9PiBOYU4sCisgICAgICB9LmZyZWV6ZQorCisgICAgICBNQVRDSEVSID0gL1xBWy0rXT8oPzpcZFtcZF9dKik/XC5bXGRfXSsoPzpbZUVdWy0rXVtcZF0rKT9cWi8uZnJlZXplCisKKyAgICAgIGRlZiB0cmFuc2Zvcm0/KHZhbHVlKQorICAgICAgICByZXR1cm4gdHJ1ZSwgRmxvYXQodmFsdWUpIGlmIE1BVENIRVIubWF0Y2godmFsdWUpCisgICAgICAgIHRyeV9lZGdlX2Nhc2VzPyh2YWx1ZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgdHJ5X2VkZ2VfY2FzZXM/KHZhbHVlKQorICAgICAgICByZXR1cm4gdHJ1ZSwgUFJFREVGSU5FRF9WQUxVRVNbdmFsdWVdIGlmIFBSRURFRklORURfVkFMVUVTLmluY2x1ZGU/KHZhbHVlKQorICAgICAgICByZXR1cm4gdHJ1ZSwgUGFyc2U6OlNleGFnZXNpbWFsLnZhbHVlKHZhbHVlKSBpZiBQYXJzZTo6U2V4YWdlc2ltYWw6OkZMT0FUX01BVENIRVIubWF0Y2godmFsdWUpCisgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9faW50ZWdlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3RyYW5zZm9ybS90b19pbnRlZ2VyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNWY1NjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9faW50ZWdlci5yYgpAQCAtMCwwICsxLDI2IEBACittb2R1bGUgU2FmZVlBTUwKKyAgY2xhc3MgVHJhbnNmb3JtCisgICAgY2xhc3MgVG9JbnRlZ2VyCisgICAgICBNQVRDSEVSUyA9IERlZXAuZnJlZXplKFsKKyAgICAgICAgL1xBWy0rXT8oMHwoWzEtOV1bMC05XyxdKikpXFovLCAjIGRlY2ltYWwKKyAgICAgICAgL1xBMFswLTddK1xaLywgICAgICAgICAgICAgICAgICAjIG9jdGFsCisgICAgICAgIC9cQTB4WzAtOWEtZl0rXFovaSwgICAgICAgICAgICAgIyBoZXhhZGVjaW1hbAorICAgICAgICAvXEEwYlswMV9dK1xaLyAgICAgICAgICAgICAgICAgICMgYmluYXJ5CisgICAgICBdKQorCisgICAgICBkZWYgdHJhbnNmb3JtPyh2YWx1ZSkKKyAgICAgICAgTUFUQ0hFUlMuZWFjaF93aXRoX2luZGV4IGRvIHxtYXRjaGVyLCBpZHh8CisgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5nc3ViKC9bXyxdLywgIiIpIGlmIGlkeCA9PSAwCisgICAgICAgICAgcmV0dXJuIHRydWUsIEludGVnZXIodmFsdWUpIGlmIG1hdGNoZXIubWF0Y2godmFsdWUpCisgICAgICAgIGVuZAorICAgICAgICB0cnlfZWRnZV9jYXNlcz8odmFsdWUpCisgICAgICBlbmQKKworICAgICAgZGVmIHRyeV9lZGdlX2Nhc2VzPyh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHRydWUsIFBhcnNlOjpIZXhhZGVjaW1hbC52YWx1ZSh2YWx1ZSkgaWYgUGFyc2U6OkhleGFkZWNpbWFsOjpNQVRDSEVSLm1hdGNoKHZhbHVlKQorICAgICAgICByZXR1cm4gdHJ1ZSwgUGFyc2U6OlNleGFnZXNpbWFsLnZhbHVlKHZhbHVlKSBpZiBQYXJzZTo6U2V4YWdlc2ltYWw6OklOVEVHRVJfTUFUQ0hFUi5tYXRjaCh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3RyYW5zZm9ybS90b19uaWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9fbmlsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNjE3NTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9fbmlsLnJiCkBAIC0wLDAgKzEsMTggQEAKK21vZHVsZSBTYWZlWUFNTAorICBjbGFzcyBUcmFuc2Zvcm0KKyAgICBjbGFzcyBUb05pbAorICAgICAgaW5jbHVkZSBUcmFuc2Zvcm1hdGlvbk1hcAorCisgICAgICBzZXRfcHJlZGVmaW5lZF92YWx1ZXMoeworICAgICAgICAiIiAgICAgID0+IG5pbCwKKyAgICAgICAgIn4iICAgICA9PiBuaWwsCisgICAgICAgICJudWxsIiAgPT4gbmlsCisgICAgICB9KQorCisgICAgICBkZWYgdHJhbnNmb3JtPyh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlIGlmIHZhbHVlLmxlbmd0aCA+IDQKKyAgICAgICAgcmV0dXJuIFBSRURFRklORURfVkFMVUVTLmluY2x1ZGU/KHZhbHVlKSwgUFJFREVGSU5FRF9WQUxVRVNbdmFsdWVdCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3RyYW5zZm9ybS90b19zeW1ib2wucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9fc3ltYm9sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTcyYmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC90cmFuc2Zvcm0vdG9fc3ltYm9sLnJiCkBAIC0wLDAgKzEsMTcgQEAKK21vZHVsZSBTYWZlWUFNTAorICBjbGFzcyBUcmFuc2Zvcm0KKyAgICBjbGFzcyBUb1N5bWJvbAorICAgICAgZGVmIHRyYW5zZm9ybT8odmFsdWUsIG9wdGlvbnM9U2FmZVlBTUw6Ok9QVElPTlMpCisgICAgICAgIGlmIG9wdGlvbnNbOmRlc2VyaWFsaXplX3N5bWJvbHNdICYmIHZhbHVlID1+IC9cQTouLworICAgICAgICAgIGlmIHZhbHVlID1+IC9cQTooWyInXSkoLiopXDFcWi8KKyAgICAgICAgICAgIHJldHVybiB0cnVlLCAkMi5zdWIoL146LywgIiIpLnRvX3N5bQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB0cnVlLCB2YWx1ZS5zdWIoL146LywgIiIpLnRvX3N5bQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvdHJhbnNmb3JtL3RyYW5zZm9ybWF0aW9uX21hcC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3RyYW5zZm9ybS90cmFuc2Zvcm1hdGlvbl9tYXAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlNDVlYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9saWIvc2FmZV95YW1sL3RyYW5zZm9ybS90cmFuc2Zvcm1hdGlvbl9tYXAucmIKQEAgLTAsMCArMSw0NyBAQAorbW9kdWxlIFNhZmVZQU1MCisgIGNsYXNzIFRyYW5zZm9ybQorICAgIG1vZHVsZSBUcmFuc2Zvcm1hdGlvbk1hcAorICAgICAgZGVmIHNlbGYuaW5jbHVkZWQoYmFzZSkKKyAgICAgICAgYmFzZS5leHRlbmQoQ2xhc3NNZXRob2RzKQorICAgICAgZW5kCisKKyAgICAgIGNsYXNzIENhc2VBZ25vc3RpY01hcCA8IEhhc2gKKyAgICAgICAgZGVmIGluaXRpYWxpemUoKmFyZ3MpCisgICAgICAgICAgc3VwZXIKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIGluY2x1ZGU/KGtleSkKKyAgICAgICAgICBzdXBlcihrZXkuZG93bmNhc2UpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBbXShrZXkpCisgICAgICAgICAgc3VwZXIoa2V5LmRvd25jYXNlKQorICAgICAgICBlbmQKKworICAgICAgICAjIE9LLCBJIGFjdHVhbGx5IGRvbid0IHRoaW5rIGl0J3MgYWxsIHRoYXQgaW1wb3J0YW50IHRoYXQgdGhpcyBtYXAgYmUKKyAgICAgICAgIyBmcm96ZW4uCisgICAgICAgIGRlZiBmcmVlemUKKyAgICAgICAgICBzZWxmCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIG1vZHVsZSBDbGFzc01ldGhvZHMKKyAgICAgICAgZGVmIHNldF9wcmVkZWZpbmVkX3ZhbHVlcyhwcmVkZWZpbmVkX3ZhbHVlcykKKyAgICAgICAgICBpZiBTYWZlWUFNTDo6WUFNTF9FTkdJTkUgPT0gInN5Y2siCisgICAgICAgICAgICBleHBhbmRlZF9tYXAgPSBwcmVkZWZpbmVkX3ZhbHVlcy5pbmplY3Qoe30pIGRvIHxoYXNoLCAoa2V5LCB2YWx1ZSl8CisgICAgICAgICAgICAgIGhhc2hba2V5XSA9IHZhbHVlCisgICAgICAgICAgICAgIGhhc2hba2V5LmNhcGl0YWxpemVdID0gdmFsdWUKKyAgICAgICAgICAgICAgaGFzaFtrZXkudXBjYXNlXSA9IHZhbHVlCisgICAgICAgICAgICAgIGhhc2gKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4cGFuZGVkX21hcCA9IENhc2VBZ25vc3RpY01hcC5uZXcKKyAgICAgICAgICAgIGV4cGFuZGVkX21hcC5tZXJnZSEocHJlZGVmaW5lZF92YWx1ZXMpCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBzZWxmLmNvbnN0X3NldCg6UFJFREVGSU5FRF9WQUxVRVMsIGV4cGFuZGVkX21hcC5mcmVlemUpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvbGliL3NhZmVfeWFtbC92ZXJzaW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRiMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L2xpYi9zYWZlX3lhbWwvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDMgQEAKK21vZHVsZSBTYWZlWUFNTAorICBWRVJTSU9OID0gIjEuMC40IgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvcnVuX3NwZWNzX2FsbF9ydWJ5X3ZlcnNpb25zLnNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3J1bl9zcGVjc19hbGxfcnVieV92ZXJzaW9ucy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NGExZjRiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3J1bl9zcGVjc19hbGxfcnVieV92ZXJzaW9ucy5zaApAQCAtMCwwICsxLDM4IEBACisjIS9iaW4vYmFzaAorCitbWyAtcyAiJEhPTUUvLnJ2bS9zY3JpcHRzL3J2bSIgXV0gJiYgLiAiJEhPTUUvLnJ2bS9zY3JpcHRzL3J2bSIKKworcnZtIHVzZSAxLjguNworYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCisKK3J2bSB1c2UgMS45LjIKK1lBTUxFUj1zeWNrIGJ1bmRsZSBleGVjIHJha2Ugc3BlYworCitZQU1MRVI9cHN5Y2ggYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCisKK3J2bSB1c2UgMS45LjMKK1lBTUxFUj1zeWNrIGJ1bmRsZSBleGVjIHJha2Ugc3BlYworCitZQU1MRVI9cHN5Y2ggYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCisKK3J2bSB1c2UgMi4wLjAKK2J1bmRsZSBleGVjIHJha2Ugc3BlYworCitydm0gdXNlIDIuMS4wCitidW5kbGUgZXhlYyByYWtlIHNwZWMKKworcnZtIHVzZSAyLjEuMQorYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCisKK3J2bSB1c2UgMi4xLjIKK2J1bmRsZSBleGVjIHJha2Ugc3BlYworCitydm0gdXNlIHJ1YnktaGVhZAorYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCisKK3J2bSB1c2UganJ1YnkKK0pSVUJZX09QVFM9LS0xLjggYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCisKK0pSVUJZX09QVFM9LS0xLjkgYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCisKK0pSVUJZX09QVFM9LS0yLjAgYnVuZGxlIGV4ZWMgcmFrZSBzcGVjCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc2FmZV95YW1sLmdlbXNwZWMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc2FmZV95YW1sLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NDMyYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zYWZlX3lhbWwuZ2Vtc3BlYwpAQCAtMCwwICsxLDE5IEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCityZXF1aXJlIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAibGliIiwgInNhZmVfeWFtbCIsICJ2ZXJzaW9uIikKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8Z2VtfAorICBnZW0ubmFtZSAgICAgICAgICA9ICJzYWZlX3lhbWwiCisgIGdlbS52ZXJzaW9uICAgICAgID0gU2FmZVlBTUw6OlZFUlNJT04KKyAgZ2VtLmF1dGhvcnMgICAgICAgPSAiRGFuIFRhbyIKKyAgZ2VtLmVtYWlsICAgICAgICAgPSAiZGFuaWVsLnRhb0BnbWFpbC5jb20iCisgIGdlbS5kZXNjcmlwdGlvbiAgID0gJXF7UGFyc2UgWUFNTCBzYWZlbHl9CisgIGdlbS5zdW1tYXJ5ICAgICAgID0gJXF7U2FtZVlBTUwgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgWUFNTC5sb2FkIHN1aXRhYmxlIGZvciBhY2NlcHRpbmcgdXNlciBpbnB1dCBpbiBSdWJ5IGFwcGxpY2F0aW9ucy59CisgIGdlbS5ob21lcGFnZSAgICAgID0gImh0dHBzOi8vZ2l0aHViLmNvbS9kdGFvL3NhZmVfeWFtbCIKKyAgZ2VtLmxpY2Vuc2UgICAgICAgPSAiTUlUIgorICBnZW0uZmlsZXMgICAgICAgICA9IGBnaXQgbHMtZmlsZXNgLnNwbGl0KCRcKQorICBnZW0udGVzdF9maWxlcyAgICA9IGdlbS5maWxlcy5ncmVwKCVye15zcGVjL30pCisgIGdlbS5yZXF1aXJlX3BhdGhzID0gWyJsaWIiXQorICBnZW0uZXhlY3V0YWJsZXMgICA9IFsic2FmZV95YW1sIl0KKworICBnZW0ucmVxdWlyZWRfcnVieV92ZXJzaW9uID0gIj49IDEuOC43IgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy9leHBsb2l0LjEuOS4yLnlhbWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy9leHBsb2l0LjEuOS4yLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNzBjYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL2V4cGxvaXQuMS45LjIueWFtbApAQCAtMCwwICsxLDIgQEAKKy0tLSAhcnVieS9vYmplY3Q6RXhwbG9pdGFibGVCYWNrRG9vcgorZm9vOiBiYXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL2V4cGxvaXQuMS45LjMueWFtbCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL2V4cGxvaXQuMS45LjMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjRlMDRiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvZXhwbG9pdC4xLjkuMy55YW1sCkBAIC0wLDAgKzEsMiBAQAorLS0tICFydWJ5L2hhc2g6RXhwbG9pdGFibGVCYWNrRG9vcgorZm9vOiBiYXIKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL2lzc3VlNDgudHh0IGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvaXNzdWU0OC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMWY2OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL2lzc3VlNDgudHh0CkBAIC0wLDAgKzEsMjAgQEAKKy0tLQordGl0bGU6IEJsYWgKK2tleTogdmFsdWUKKy0tLQorCitJJ20gZ29pbmcgdG8gaW5qZWN0IGEgYnVuY2ggb2YgWUFNTC1sb29raW5nIHN0dWZmIGJlbG93IGFuZCBpdCBzaG91bGQgYWxsIGp1c3QgZ2V0IGlnbm9yZWQuCisKK2ZvbzogYmFyCisKKy0gZm9vCistIGJhcgorCis6Zm9vCis0MgorfgorCistLS0KK3RleHQ6IHwKKyAgTG9vaywgSSdtIGFub3RoZXIgWUFNTCBkb2N1bWVudCEKKy0tLQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvaXNzdWU0OS55bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy9pc3N1ZTQ5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvaXNzdWU0OS55bWwKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL2xpYnlhbWxfY2hlY2tlcl9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvbGlieWFtbF9jaGVja2VyX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMjkwYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL2xpYnlhbWxfY2hlY2tlcl9zcGVjLnJiCkBAIC0wLDAgKzEsNjkgQEAKK3JlcXVpcmUgInNwZWNfaGVscGVyIgorCitkZXNjcmliZSBTYWZlWUFNTDo6TGlieWFtbENoZWNrZXIgZG8KKyAgZGVzY3JpYmUgImNoZWNrX2xpYnlhbWxfdmVyc2lvbiIgZG8KKyAgICBSRUFMX1lBTUxfRU5HSU5FID0gU2FmZVlBTUw6OllBTUxfRU5HSU5FCisgICAgUkVBTF9MSUJZQU1MX1ZFUlNJT04gPSBTYWZlWUFNTDo6TGlieWFtbENoZWNrZXI6OkxJQllBTUxfVkVSU0lPTgorCisgICAgbGV0KDpsaWJ5YW1sX3BhdGNoZWQpIHsgZmFsc2UgfQorCisgICAgYmVmb3JlIDplYWNoIGRvCisgICAgICBhbGxvdyhTYWZlWUFNTDo6TGlieWFtbENoZWNrZXIpLnRvIHJlY2VpdmUoOmxpYnlhbWxfcGF0Y2hlZD8pLmFuZF9yZXR1cm4obGlieWFtbF9wYXRjaGVkKQorICAgIGVuZAorCisgICAgYWZ0ZXIgOmVhY2ggZG8KKyAgICAgIHNpbGVuY2Vfd2FybmluZ3MgZG8KKyAgICAgICAgU2FmZVlBTUw6OllBTUxfRU5HSU5FID0gUkVBTF9ZQU1MX0VOR0lORQorICAgICAgICBTYWZlWUFNTDo6TGlieWFtbENoZWNrZXI6OkxJQllBTUxfVkVSU0lPTiA9IFJFQUxfTElCWUFNTF9WRVJTSU9OCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiB0ZXN0X2xpYnlhbWxfdmVyc2lvbl9vayhleHBlY3RlZF9yZXN1bHQsIHlhbWxfZW5naW5lLCBsaWJ5YW1sX3ZlcnNpb249bmlsKQorICAgICAgc2lsZW5jZV93YXJuaW5ncyBkbworICAgICAgICBTYWZlWUFNTC5jb25zdF9zZXQoIllBTUxfRU5HSU5FIiwgeWFtbF9lbmdpbmUpCisgICAgICAgIFNhZmVZQU1MOjpMaWJ5YW1sQ2hlY2tlci5jb25zdF9zZXQoIkxJQllBTUxfVkVSU0lPTiIsIGxpYnlhbWxfdmVyc2lvbikKKyAgICAgICAgZXhwZWN0KFNhZmVZQU1MOjpMaWJ5YW1sQ2hlY2tlci5saWJ5YW1sX3ZlcnNpb25fb2s/KS50byBlcShleHBlY3RlZF9yZXN1bHQpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHVubGVzcyBkZWZpbmVkPyhKUlVCWV9WRVJTSU9OKQorICAgICAgaXQgImlzc3VlcyBubyB3YXJuaW5ncyB3aGVuICdTeWNrJyBpcyB0aGUgWUFNTCBlbmdpbmUiIGRvCisgICAgICAgIHRlc3RfbGlieWFtbF92ZXJzaW9uX29rKHRydWUsICJzeWNrIikKKyAgICAgIGVuZAorCisgICAgICBpdCAiaXNzdWVzIGEgd2FybmluZyBpZiBQc3ljaDo6TElCWUFNTF9WRVJTSU9OIGlzIG5vdCBkZWZpbmVkIiBkbworICAgICAgICB0ZXN0X2xpYnlhbWxfdmVyc2lvbl9vayhmYWxzZSwgInBzeWNoIikKKyAgICAgIGVuZAorCisgICAgICBpdCAiaXNzdWVzIGEgd2FybmluZyBpZiBQc3ljaDo6TElCWUFNTF9WRVJTSU9OIGlzIDwgMC4xLjYiIGRvCisgICAgICAgIHRlc3RfbGlieWFtbF92ZXJzaW9uX29rKGZhbHNlLCAicHN5Y2giLCAiMC4xLjUiKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJpc3N1ZXMgbm8gd2FybmluZyBpZiBQc3ljaDo6TElCWUFNTF9WRVJTSU9OIGlzID09IDAuMS42IiBkbworICAgICAgICB0ZXN0X2xpYnlhbWxfdmVyc2lvbl9vayh0cnVlLCAicHN5Y2giLCAiMC4xLjYiKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJpc3N1ZXMgbm8gd2FybmluZyBpZiBQc3ljaDo6TElCWUFNTF9WRVJTSU9OIGlzID4gMC4xLjYiIGRvCisgICAgICAgIHRlc3RfbGlieWFtbF92ZXJzaW9uX29rKHRydWUsICJwc3ljaCIsICIxLjAuMCIpCisgICAgICBlbmQKKworICAgICAgaXQgImRvZXMgYSBwcm9wZXIgdmVyc2lvbiBjb21wYXJpc29uIChub3QganVzdCBhIHN0cmluZyBjb21wYXJpc29uKSIgZG8KKyAgICAgICAgdGVzdF9saWJ5YW1sX3ZlcnNpb25fb2sodHJ1ZSwgInBzeWNoIiwgIjAuMS4xMCIpCisgICAgICBlbmQKKworICAgICAgY29udGV4dCAid2hlbiB0aGUgc3lzdGVtIGhhcyBhIGtub3duIHBhdGNoZWQgbGlieWFtbCB2ZXJzaW9uIiBkbworICAgICAgICBsZXQoOmxpYnlhbWxfcGF0Y2hlZCkgeyB0cnVlIH0KKworICAgICAgICBpdCAiaXNzdWVzIG5vIHdhcm5pbmcsIGV2ZW4gd2hlbiBQc3ljaDo6TElCWUFNTF9WRVJTSU9OIDwgMC4xLjYiIGRvCisgICAgICAgICAgdGVzdF9saWJ5YW1sX3ZlcnNpb25fb2sodHJ1ZSwgInBzeWNoIiwgIjAuMS40IikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGlmIGRlZmluZWQ/KEpSVUJZX1ZFUlNJT04pCisgICAgICBpdCAiaXNzdWVzIG5vIHdhcm5pbmcsIGFzIEpSdWJ5IGRvZXNuJ3QgdXNlIGxpYnlhbWwiIGRvCisgICAgICAgIHRlc3RfbGlieWFtbF92ZXJzaW9uX29rKHRydWUsICJwc3ljaCIsICIwLjEuNCIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3BzeWNoX3Jlc29sdmVyX3NwZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy9wc3ljaF9yZXNvbHZlcl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTc2YjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy9wc3ljaF9yZXNvbHZlcl9zcGVjLnJiCkBAIC0wLDAgKzEsMTAgQEAKK3JlcXVpcmUgInNwZWNfaGVscGVyIgorCitpZiBTYWZlWUFNTDo6WUFNTF9FTkdJTkUgPT0gInBzeWNoIgorICByZXF1aXJlICJzYWZlX3lhbWwvcHN5Y2hfcmVzb2x2ZXIiCisKKyAgZGVzY3JpYmUgU2FmZVlBTUw6OlBzeWNoUmVzb2x2ZXIgZG8KKyAgICBpbmNsdWRlIFJlc29sdmVyU3BlY3MKKyAgICBsZXQoOnJlc29sdmVyKSB7IFNhZmVZQU1MOjpQc3ljaFJlc29sdmVyLm5ldyB9CisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy9yZXNvbHZlcl9zcGVjcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3Jlc29sdmVyX3NwZWNzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTgxZTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy9yZXNvbHZlcl9zcGVjcy5yYgpAQCAtMCwwICsxLDI3OCBAQAorbW9kdWxlIFJlc29sdmVyU3BlY3MKKyAgZGVmIHNlbGYuaW5jbHVkZWQoYmFzZSkKKyAgICBiYXNlLm1vZHVsZV9ldmFsIGRvCisgICAgICBsZXQoOnJlc29sdmVyKSB7IG5pbCB9CisgICAgICBsZXQoOnJlc3VsdCkgeyBAcmVzdWx0IH0KKworICAgICAgYmVmb3JlIDplYWNoIGRvCisgICAgICAgICMgU2VlIHRoZSBjb21tZW50IGluIHRoZSBmaXJzdCBiZWZvcmUgOmVhY2ggYmxvY2sgaW4gc2FmZV95YW1sX3NwZWMucmIuCisgICAgICAgIHJlcXVpcmUgInNhZmVfeWFtbCIKKyAgICAgIGVuZAorCisgICAgICBkZWYgcGFyc2UoeWFtbCkKKyAgICAgICAgdHJlZSA9IFlBTUwucGFyc2UoeWFtbC51bmluZGVudCkKKyAgICAgICAgQHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmVfbm9kZSh0cmVlKQorICAgICAgZW5kCisKKyAgICAgICMgSXNuJ3QgdGhpcyBob3cgSSBzaG91bGQndmUgYmVlbiBkb2luZyBpdCBhbGwgYWxvbmc/CisgICAgICBkZWYgcGFyc2VfYW5kX3Rlc3QoeWFtbCkKKyAgICAgICAgc2FmZV9yZXN1bHQgPSBwYXJzZSh5YW1sKQorCisgICAgICAgIGV4Y2VwdGlvbl90aHJvd24gPSBuaWwKKworICAgICAgICB1bnNhZmVfcmVzdWx0ID0gYmVnaW4KKyAgICAgICAgICBZQU1MLnVuc2FmZV9sb2FkKHlhbWwpCisgICAgICAgIHJlc2N1ZSBFeGNlcHRpb24gPT4gZQorICAgICAgICAgIGV4Y2VwdGlvbl90aHJvd24gPSBlCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIGV4Y2VwdGlvbl90aHJvd24KKyAgICAgICAgICAjIElmIHRoZSB1bmRlcmx5aW5nIFlBTUwgcGFyc2VyIChlLmcuIFBzeWNoKSB0aHJldyBhbiBleGNlcHRpb24sIEknbQorICAgICAgICAgICMgaG9uZXN0bHkgbm90IHN1cmUgd2hhdCB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaXMuIEZvciBub3cgSSdsbCBqdXN0CisgICAgICAgICAgIyBwcmludCBhIHdhcm5pbmcuIFNob3VsZCBTYWZlWUFNTCBmYWlsIHdoZW4gUHN5Y2ggZmFpbHM/CisgICAgICAgICAgS2VybmVsLndhcm4gIlxuIgorICAgICAgICAgIEtlcm5lbC53YXJuICJEaXNjcmVwYW5jeSBiZXR3ZWVuIFNhZmVZQU1MIGFuZCAje1NhZmVZQU1MOjpZQU1MX0VOR0lORX0gb24gaW5wdXQ6XG4iCisgICAgICAgICAgS2VybmVsLndhcm4gIiN7eWFtbC51bmluZGVudH1cbiIKKyAgICAgICAgICBLZXJuZWwud2FybiAiU2FmZVlBTUwgcmVzdWx0OiIKKyAgICAgICAgICBLZXJuZWwud2FybiAiI3tzYWZlX3Jlc3VsdC5pbnNwZWN0fVxuIgorICAgICAgICAgIEtlcm5lbC53YXJuICIje1NhZmVZQU1MOjpZQU1MX0VOR0lORX0gcmVzdWx0OiIKKyAgICAgICAgICBLZXJuZWwud2FybiAiI3tleGNlcHRpb25fdGhyb3duLmluc3BlY3R9XG4iCisKKyAgICAgICAgZWxzZQorICAgICAgICAgIGV4cGVjdChzYWZlX3Jlc3VsdCkudG8gZXEodW5zYWZlX3Jlc3VsdCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgY29udGV4dCAiYnkgZGVmYXVsdCIgZG8KKyAgICAgICAgaXQgInRyYW5zbGF0ZXMgbWFwcyB0byBoYXNoZXMiIGRvCisgICAgICAgICAgcGFyc2UgPDwtWUFNTAorICAgICAgICAgICAgcG90YXl0bzogcG90YWh0bworICAgICAgICAgICAgdG9tYXl0bzogdG9tYWh0bworICAgICAgICAgIFlBTUwKKworICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsKKyAgICAgICAgICAgICJwb3RheXRvIiA9PiAicG90YWh0byIsCisgICAgICAgICAgICAidG9tYXl0byIgPT4gInRvbWFodG8iCisgICAgICAgICAgfSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgaXQgInRyYW5zbGF0ZXMgc2VxdWVuY2VzIHRvIGFycmF5cyIgZG8KKyAgICAgICAgICBwYXJzZSA8PC1ZQU1MCisgICAgICAgICAgICAtIGZvbworICAgICAgICAgICAgLSBiYXIKKyAgICAgICAgICAgIC0gYmF6CisgICAgICAgICAgWUFNTAorCisgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoWyJmb28iLCAiYmFyIiwgImJheiJdKQorICAgICAgICBlbmQKKworICAgICAgICBpdCAidHJhbnNsYXRlcyBtb3N0IHZhbHVlcyB0byBzdHJpbmdzIiBkbworICAgICAgICAgIHBhcnNlICJzdHJpbmc6IHZhbHVlIgorICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsgInN0cmluZyIgPT4gInZhbHVlIiB9KQorICAgICAgICBlbmQKKworICAgICAgICBpdCAiZG9lcyBub3QgZGVzZXJpYWxpemUgc3ltYm9scyIgZG8KKyAgICAgICAgICBwYXJzZSAiOnN5bWJvbDogdmFsdWUiCisgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoeyAiOnN5bWJvbCIgPT4gInZhbHVlIiB9KQorICAgICAgICBlbmQKKworICAgICAgICBpdCAidHJhbnNsYXRlcyB2YWxpZCBpbnRlZ3JhbCBudW1iZXJzIHRvIGludGVnZXJzIiBkbworICAgICAgICAgIHBhcnNlICJpbnRlZ2VyOiAxIgorICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsgImludGVnZXIiID0+IDEgfSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgaXQgInRyYW5zbGF0ZXMgdmFsaWQgZGVjaW1hbCBudW1iZXJzIHRvIGZsb2F0cyIgZG8KKyAgICAgICAgICBwYXJzZSAiZmxvYXQ6IDMuMTQiCisgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoeyAiZmxvYXQiID0+IDMuMTQgfSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgaXQgInRyYW5zbGF0ZXMgdmFsaWQgZGF0ZXMiIGRvCisgICAgICAgICAgcGFyc2UgImRhdGU6IDIwMTMtMDEtMjQiCisgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoeyAiZGF0ZSIgPT4gRGF0ZS5wYXJzZSgiMjAxMy0wMS0yNCIpIH0pCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJ0cmFuc2xhdGVzIHZhbGlkIHRydWUvZmFsc2UgdmFsdWVzIHRvIGJvb2xlYW5zIiBkbworICAgICAgICAgIHBhcnNlIDw8LVlBTUwKKyAgICAgICAgICAgIC0geWVzCisgICAgICAgICAgICAtIHRydWUKKyAgICAgICAgICAgIC0gbm8KKyAgICAgICAgICAgIC0gZmFsc2UKKyAgICAgICAgICBZQU1MCisKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcShbdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlXSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgaXQgInRyYW5zbGF0ZXMgdmFsaWQgbnVsbHMgdG8gbmlsIiBkbworICAgICAgICAgIHBhcnNlIDw8LVlBTUwKKyAgICAgICAgICAgIC0gCisgICAgICAgICAgICAtIH4KKyAgICAgICAgICAgIC0gbnVsbAorICAgICAgICAgIFlBTUwKKworICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKFtuaWxdICogMykKKyAgICAgICAgZW5kCisKKyAgICAgICAgaXQgIm1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSB1bmRlcmx5aW5nIFlBTUwgZW5naW5lIHcvIHJlc3BlY3QgdG8gY2FwaXRhbGl6YXRpb24gb2YgYm9vbGVhbiB2YWx1ZXMiIGRvCisgICAgICAgICAgcGFyc2VfYW5kX3Rlc3QgPDwtWUFNTAorICAgICAgICAgICAgLSB0cnVlCisgICAgICAgICAgICAtIFRydWUKKyAgICAgICAgICAgIC0gVFJVRQorICAgICAgICAgICAgLSB0UnVlCisgICAgICAgICAgICAtIFRSdWUKKyAgICAgICAgICAgIC0gRmFsc2UKKyAgICAgICAgICAgIC0gRkFMU0UKKyAgICAgICAgICAgIC0gZkFsc2UKKyAgICAgICAgICAgIC0gRkFMc2UKKyAgICAgICAgICBZQU1MCisKKyAgICAgICAgICAjIHVzaW5nIFN5Y2s6IFt0cnVlLCB0cnVlLCB0cnVlLCAidFJ1ZSIsICJUUnVlIiwgZmFsc2UsIGZhbHNlLCAiZkFsc2UiLCAiRkFMc2UiXQorICAgICAgICAgICMgdXNpbmcgUHN5Y2g6IGFsbCBib29sZWFucworICAgICAgICBlbmQKKworICAgICAgICBpdCAibWF0Y2hlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIHVuZGVybHlpbmcgWUFNTCBlbmdpbmUgdy8gcmVzcGVjdCB0byBjYXBpdGFsaXphdGlvbiBvZiBuaWwgdmFsdWVzIiBkbworICAgICAgICAgIHBhcnNlX2FuZF90ZXN0IDw8LVlBTUwKKyAgICAgICAgICAgIC0gTnVsbAorICAgICAgICAgICAgLSBOVUxMCisgICAgICAgICAgICAtIG5VbGwKKyAgICAgICAgICAgIC0gTlVsbAorICAgICAgICAgIFlBTUwKKworICAgICAgICAgICMgdXNpbmcgU3ljazogW25pbCwgbmlsLCAiblVsbCIsICJOVWxsIl0KKyAgICAgICAgICAjIHVzaW5nIFBzeWNoOiBhbGwgbmlscworICAgICAgICBlbmQKKworICAgICAgICBpdCAidHJhbnNsYXRlcyBxdW90ZWQgZW1wdHkgc3RyaW5ncyB0byBzdHJpbmdzIChub3QgbmlsKSIgZG8KKyAgICAgICAgICBwYXJzZSAiZm9vOiAnJyIKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcSh7ICJmb28iID0+ICIiIH0pCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJjb3JyZWN0bHkgcmV2ZXJzZS10cmFuc2xhdGVzIHN0cmluZ3MgZW5jb2RlZCB2aWEgI3RvX3lhbWwiIGRvCisgICAgICAgICAgcGFyc2UgIjUuMTAiLnRvX3lhbWwKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcSgiNS4xMCIpCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJkb2VzIG5vdCBzcGVjaWFsbHkgcGFyc2UgYW55IGRvdWJsZS1xdW90ZWQgc3RyaW5ncyIgZG8KKyAgICAgICAgICBwYXJzZSA8PC1ZQU1MCisgICAgICAgICAgICAtICIxIgorICAgICAgICAgICAgLSAiMy4xNCIKKyAgICAgICAgICAgIC0gInRydWUiCisgICAgICAgICAgICAtICJmYWxzZSIKKyAgICAgICAgICAgIC0gIjIwMTMtMDItMDMiCisgICAgICAgICAgICAtICIyMDEzLTAyLTAzIDE2OjI3OjAwIC0wNjAwIgorICAgICAgICAgIFlBTUwKKworICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKFsiMSIsICIzLjE0IiwgInRydWUiLCAiZmFsc2UiLCAiMjAxMy0wMi0wMyIsICIyMDEzLTAyLTAzIDE2OjI3OjAwIC0wNjAwIl0pCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJkb2VzIG5vdCBzcGVjaWFsbHkgcGFyc2UgYW55IHNpbmdsZS1xdW90ZWQgc3RyaW5ncyIgZG8KKyAgICAgICAgICBwYXJzZSA8PC1ZQU1MCisgICAgICAgICAgICAtICcxJworICAgICAgICAgICAgLSAnMy4xNCcKKyAgICAgICAgICAgIC0gJ3RydWUnCisgICAgICAgICAgICAtICdmYWxzZScKKyAgICAgICAgICAgIC0gJzIwMTMtMDItMDMnCisgICAgICAgICAgICAtICcyMDEzLTAyLTAzIDE2OjI3OjAwIC0wNjAwJworICAgICAgICAgIFlBTUwKKworICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKFsiMSIsICIzLjE0IiwgInRydWUiLCAiZmFsc2UiLCAiMjAxMy0wMi0wMyIsICIyMDEzLTAyLTAzIDE2OjI3OjAwIC0wNjAwIl0pCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJkZWFscyBqdXN0IGZpbmUgd2l0aCBuZXN0ZWQgbWFwcyIgZG8KKyAgICAgICAgICBwYXJzZSA8PC1ZQU1MCisgICAgICAgICAgICBmb286CisgICAgICAgICAgICAgIGJhcjoKKyAgICAgICAgICAgICAgICBtYXJjbzogcG9sbworICAgICAgICAgIFlBTUwKKworICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsgImZvbyIgPT4geyAiYmFyIiA9PiB7ICJtYXJjbyIgPT4gInBvbG8iIH0gfSB9KQorICAgICAgICBlbmQKKworICAgICAgICBpdCAiZGVhbHMganVzdCBmaW5lIHdpdGggbmVzdGVkIHNlcXVlbmNlcyIgZG8KKyAgICAgICAgICBwYXJzZSA8PC1ZQU1MCisgICAgICAgICAgICAtIGZvbworICAgICAgICAgICAgLQorICAgICAgICAgICAgICAtIGJhcjEKKyAgICAgICAgICAgICAgLSBiYXIyCisgICAgICAgICAgICAgIC0KKyAgICAgICAgICAgICAgICAtIGJhejEKKyAgICAgICAgICAgICAgICAtIGJhejIKKyAgICAgICAgICBZQU1MCisKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcShbImZvbyIsIFsiYmFyMSIsICJiYXIyIiwgWyJiYXoxIiwgImJhejIiXV1dKQorICAgICAgICBlbmQKKworICAgICAgICBpdCAiYXBwbGllcyB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbnMgdG8ga2V5cyBhcyB0byB2YWx1ZXMiIGRvCisgICAgICAgICAgcGFyc2UgPDwtWUFNTAorICAgICAgICAgICAgZm9vOiBzdHJpbmcKKyAgICAgICAgICAgIDpiYXI6IHN5bWJvbAorICAgICAgICAgICAgMTogaW50ZWdlcgorICAgICAgICAgICAgMy4xNDogZmxvYXQKKyAgICAgICAgICAgIDIwMTMtMDEtMjQ6IGRhdGUKKyAgICAgICAgICBZQU1MCisKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcSh7CisgICAgICAgICAgICAiZm9vIiAgPT4gInN0cmluZyIsCisgICAgICAgICAgICAiOmJhciIgPT4gInN5bWJvbCIsCisgICAgICAgICAgICAxICAgICAgPT4gImludGVnZXIiLAorICAgICAgICAgICAgMy4xNCAgID0+ICJmbG9hdCIsCisgICAgICAgICAgICBEYXRlLnBhcnNlKCIyMDEzLTAxLTI0IikgPT4gImRhdGUiLAorICAgICAgICAgIH0pCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJhcHBsaWVzIHRoZSBzYW1lIHRyYW5zZm9ybWF0aW9ucyB0byBlbGVtZW50cyBpbiBzZXF1ZW5jZXMgYXMgdG8gYWxsIHZhbHVlcyIgZG8KKyAgICAgICAgICBwYXJzZSA8PC1ZQU1MCisgICAgICAgICAgICAtIGZvbworICAgICAgICAgICAgLSA6YmFyCisgICAgICAgICAgICAtIDEKKyAgICAgICAgICAgIC0gMy4xNAorICAgICAgICAgICAgLSAyMDEzLTAxLTI0CisgICAgICAgICAgWUFNTAorCisgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoWyJmb28iLCAiOmJhciIsIDEsIDMuMTQsIERhdGUucGFyc2UoIjIwMTMtMDEtMjQiKV0pCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGNvbnRleHQgImZvciBSdWJ5IHZlcnNpb24gI3tSVUJZX1ZFUlNJT059IiBkbworICAgICAgICBpdCAidHJhbnNsYXRlcyB2YWxpZCB0aW1lIHZhbHVlcyIgZG8KKyAgICAgICAgICBwYXJzZSAidGltZTogMjAxMy0wMS0yOSAwNTo1ODowMCAtMDgwMCIKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcSh7ICJ0aW1lIiA9PiBUaW1lLnV0YygyMDEzLCAxLCAyOSwgMTMsIDU4LCAwKSB9KQorICAgICAgICBlbmQKKworICAgICAgICBpdCAiYXBwbGllcyB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbiB0byBlbGVtZW50cyBpbiBzZXF1ZW5jZXMiIGRvCisgICAgICAgICAgcGFyc2UgIi0gMjAxMy0wMS0yOSAwNTo1ODowMCAtMDgwMCIKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcShbVGltZS51dGMoMjAxMywgMSwgMjksIDEzLCA1OCwgMCldKQorICAgICAgICBlbmQKKworICAgICAgICBpdCAiYXBwbGllcyB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbiB0byBrZXlzIiBkbworICAgICAgICAgIHBhcnNlICIyMDEzLTAxLTI5IDA1OjU4OjAwIC0wODAwOiB0aW1lIgorICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsgVGltZS51dGMoMjAxMywgMSwgMjksIDEzLCA1OCwgMCkgPT4gInRpbWUiIH0pCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGNvbnRleHQgIndpdGggc3ltYm9sIGRlc2VyaWFsaXphdGlvbiBlbmFibGVkIiBkbworICAgICAgICBiZWZvcmUgOmVhY2ggZG8KKyAgICAgICAgICBTYWZlWUFNTDo6T1BUSU9OU1s6ZGVzZXJpYWxpemVfc3ltYm9sc10gPSB0cnVlCisgICAgICAgIGVuZAorCisgICAgICAgIGFmdGVyIDplYWNoIGRvCisgICAgICAgICAgU2FmZVlBTUwucmVzdG9yZV9kZWZhdWx0cyEKKyAgICAgICAgZW5kCisKKyAgICAgICAgaXQgInRyYW5zbGF0ZXMgdmFsdWVzIHN0YXJ0aW5nIHdpdGggJzonIHRvIHN5bWJvbHMiIGRvCisgICAgICAgICAgcGFyc2UgInN5bWJvbDogOnZhbHVlIgorICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsgInN5bWJvbCIgPT4gOnZhbHVlIH0pCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJhcHBsaWVzIHRoZSBzYW1lIHRyYW5zZm9ybWF0aW9uIHRvIGtleXMiIGRvCisgICAgICAgICAgcGFyc2UgIjpiYXI6IHN5bWJvbCIKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcSh7IDpiYXIgID0+ICJzeW1ib2wiIH0pCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJhcHBsaWVzIHRoZSBzYW1lIHRyYW5zZm9ybWF0aW9uIHRvIGVsZW1lbnRzIGluIHNlcXVlbmNlcyIgZG8KKyAgICAgICAgICBwYXJzZSAiLSA6YmFyIgorICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKFs6YmFyXSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3NhZmVfeWFtbF9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvc2FmZV95YW1sX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3MDFhNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3NhZmVfeWFtbF9zcGVjLnJiCkBAIC0wLDAgKzEsNzMxIEBACityZXF1aXJlICJzcGVjX2hlbHBlciIKKworZGVzY3JpYmUgWUFNTCBkbworICBkZWYgc2FmZV9sb2FkX3JvdW5kX3RyaXAob2JqZWN0LCBvcHRpb25zPXt9KQorICAgIHlhbWwgPSBvYmplY3QudG9feWFtbAorICAgIGlmIFNhZmVZQU1MOjpZQU1MX0VOR0lORSA9PSAicHN5Y2giCisgICAgICBZQU1MLnNhZmVfbG9hZCh5YW1sLCBuaWwsIG9wdGlvbnMpCisgICAgZWxzZQorICAgICAgWUFNTC5zYWZlX2xvYWQoeWFtbCwgb3B0aW9ucykKKyAgICBlbmQKKyAgZW5kCisKKyAgYmVmb3JlIDplYWNoIGRvCisgICAgIyBOZWVkIHRvIHJlcXVpcmUgdGhpcyBoZXJlIChhcyBvcHBvc2VkIHRvIHNvbWV3aGVyZSB1cCBoaWdoZXIgaW4gdGhlIGZpbGUpCisgICAgIyB0byBlbnN1cmUgdGhhdCBzYWZlX3lhbWwgaXNuJ3QgbG9hZGVkIGFuZCB0aGVyZWZvcmUgWUFNTCBpc24ndCBtb25rZXktCisgICAgIyBwYXRjaGVkLCBmb3IgdGVzdHMgdGhhdCByZXF1aXJlIG9ubHkgc2FmZV95YW1sL2xvYWQuCisgICAgcmVxdWlyZSAic2FmZV95YW1sIgorICAgIHJlcXVpcmUgImV4cGxvaXRhYmxlX2JhY2tfZG9vciIKKworICAgIFNhZmVZQU1MLnJlc3RvcmVfZGVmYXVsdHMhCisgIGVuZAorCisgIGFmdGVyIDplYWNoIGRvCisgICAgU2FmZVlBTUwucmVzdG9yZV9kZWZhdWx0cyEKKyAgZW5kCisKKyAgZGVzY3JpYmUgInVuc2FmZV9sb2FkIiBkbworICAgIGlmIFNhZmVZQU1MOjpZQU1MX0VOR0lORSA9PSAicHN5Y2giICYmIFJVQllfVkVSU0lPTiA+PSAiMS45LjMiCisgICAgICBpdCAiYWxsb3dzIGV4cGxvaXRzIHRocm91Z2ggb2JqZWN0cyBkZWZpbmVkIGluIFlBTUwgdy8gIXJ1YnkvaGFzaCB2aWEgY3VzdG9tIDpbXT0gbWV0aG9kcyIgZG8KKyAgICAgICAgYmFja2Rvb3IgPSBZQU1MLnVuc2FmZV9sb2FkKCItLS0gIXJ1YnkvaGFzaDpFeHBsb2l0YWJsZUJhY2tEb29yXG5mb286IGJhclxuIikKKyAgICAgICAgZXhwZWN0KGJhY2tkb29yKS50byBiZV9leHBsb2l0ZWRfdGhyb3VnaF9zZXR0ZXIKKyAgICAgIGVuZAorCisgICAgICBpdCAiYWxsb3dzIGV4cGxvaXRzIHRocm91Z2ggb2JqZWN0cyBkZWZpbmVkIGluIFlBTUwgdy8gIXJ1Ynkvb2JqZWN0IHZpYSB0aGUgOmluaXRfd2l0aCBtZXRob2QiIGRvCisgICAgICAgIGJhY2tkb29yID0gWUFNTC51bnNhZmVfbG9hZCgiLS0tICFydWJ5L29iamVjdDpFeHBsb2l0YWJsZUJhY2tEb29yXG5mb286IGJhclxuIikKKyAgICAgICAgZXhwZWN0KGJhY2tkb29yKS50byBiZV9leHBsb2l0ZWRfdGhyb3VnaF9pbml0X3dpdGgKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgImFsbG93cyBleHBsb2l0cyB0aHJvdWdoIG9iamVjdHMgdy8gc2Vuc2l0aXZlIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGluIFlBTUwgdy8gIXJ1Ynkvb2JqZWN0IiBkbworICAgICAgYmFja2Rvb3IgPSBZQU1MLnVuc2FmZV9sb2FkKCItLS0gIXJ1Ynkvb2JqZWN0OkV4cGxvaXRhYmxlQmFja0Rvb3JcbmZvbzogYmFyXG4iKQorICAgICAgZXhwZWN0KGJhY2tkb29yKS50byBiZV9leHBsb2l0ZWRfdGhyb3VnaF9pdmFycworICAgIGVuZAorCisgICAgY29udGV4dCAid2l0aCBzcGVjaWFsIHdoaXRlbGlzdGVkIHRhZ3MgZGVmaW5lZCIgZG8KKyAgICAgIGJlZm9yZSA6ZWFjaCBkbworICAgICAgICBTYWZlWUFNTDo6d2hpdGVsaXN0IShPcGVuU3RydWN0KQorICAgICAgZW5kCisKKyAgICAgIGl0ICJlZmZlY3RpdmVseSBpZ25vcmVzIHRoZSB3aGl0ZWxpc3QgKHNpbmNlIGV2ZXJ5dGhpbmcgaXMgd2hpdGVsaXN0ZWQpIiBkbworICAgICAgICByZXN1bHQgPSBZQU1MLnVuc2FmZV9sb2FkIDw8LVlBTUwudW5pbmRlbnQKKyAgICAgICAgICAtLS0gIXJ1Ynkvb2JqZWN0Ok9wZW5TdHJ1Y3QgCisgICAgICAgICAgdGFibGU6IAorICAgICAgICAgICAgOmJhY2tkb29yOiAhcnVieS9vYmplY3Q6RXhwbG9pdGFibGVCYWNrRG9vciAKKyAgICAgICAgICAgICAgZm9vOiBiYXIKKyAgICAgICAgWUFNTAorCisgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGJlX2EoT3BlblN0cnVjdCkKKyAgICAgICAgZXhwZWN0KHJlc3VsdC5iYWNrZG9vcikudG8gYmVfZXhwbG9pdGVkX3Rocm91Z2hfaXZhcnMKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAic2FmZV9sb2FkIiBkbworICAgIGl0ICJkb2VzIE5PVCBhbGxvdyBleHBsb2l0cyB0aHJvdWdoIG9iamVjdHMgZGVmaW5lZCBpbiBZQU1MIHcvICFydWJ5L2hhc2giIGRvCisgICAgICBvYmplY3QgPSBZQU1MLnNhZmVfbG9hZCgiLS0tICFydWJ5L2hhc2g6RXhwbG9pdGFibGVCYWNrRG9vclxuZm9vOiBiYXJcbiIpCisgICAgICBleHBlY3Qob2JqZWN0KS5ub3RfdG8gYmVfYShFeHBsb2l0YWJsZUJhY2tEb29yKQorICAgIGVuZAorCisgICAgaXQgImRvZXMgTk9UIGFsbG93IGV4cGxvaXRzIHRocm91Z2ggb2JqZWN0cyBkZWZpbmVkIGluIFlBTUwgdy8gIXJ1Ynkvb2JqZWN0IiBkbworICAgICAgb2JqZWN0ID0gWUFNTC5zYWZlX2xvYWQoIi0tLSAhcnVieS9vYmplY3Q6RXhwbG9pdGFibGVCYWNrRG9vclxuZm9vOiBiYXJcbiIpCisgICAgICBleHBlY3Qob2JqZWN0KS5ub3RfdG8gYmVfYShFeHBsb2l0YWJsZUJhY2tEb29yKQorICAgIGVuZAorCisgICAgY29udGV4dCAiZm9yIFlBTUwgZW5naW5lICN7U2FmZVlBTUw6OllBTUxfRU5HSU5FfSIgZG8KKyAgICAgIGlmIFNhZmVZQU1MOjpZQU1MX0VOR0lORSA9PSAicHN5Y2giCisgICAgICAgIGxldCg6b3B0aW9ucykgeyBuaWwgfQorICAgICAgICBsZXQoOmFyZ3VtZW50cykgeyBbImZvbzogYmFyIiwgbmlsLCBvcHRpb25zXSB9CisKKyAgICAgICAgY29udGV4dCAid2hlbiBubyB0YWdzIGFyZSB3aGl0ZWxpc3RlZCIgZG8KKyAgICAgICAgICBpdCAiY29uc3RydWN0cyBhIFNhZmVZQU1MOjpQc3ljaEhhbmRsZXIgdG8gcmVzb2x2ZSBub2RlcyBhcyB0aGV5J3JlIHBhcnNlZCwgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2UiIGRvCisgICAgICAgICAgICBleHBlY3QoUHN5Y2g6OlBhcnNlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoIGFuX2luc3RhbmNlX29mKFNhZmVZQU1MOjpQc3ljaEhhbmRsZXIpCisgICAgICAgICAgICAjIFRoaXMgd29uJ3Qgd29yayBub3c7IHdlIGp1c3Qgd2FudCB0byBlbnN1cmUgUHN5Y2g6OlBhcnNlciNwYXJzZSB3YXMgaW4gZmFjdCBjYWxsZWQuCisgICAgICAgICAgICBZQU1MLnNhZmVfbG9hZCgqYXJndW1lbnRzKSByZXNjdWUgbmlsCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGNvbnRleHQgIndoZW4gd2hpdGVsaXN0ZWQgdGFncyBhcmUgc3BlY2lmaWVkIiBkbworICAgICAgICAgIGxldCg6b3B0aW9ucykgeworICAgICAgICAgICAgeyA6d2hpdGVsaXN0ZWRfdGFncyA9PiBbImZvbyJdIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpdCAiaW5zdGVhZCB1c2VzIFBzeWNoIHRvIGNvbnN0cnVjdCBhIGZ1bGwgdHJlZSBiZWZvcmUgZXhhbWluaW5nIHRoZSBub2RlcyIgZG8KKyAgICAgICAgICAgIGV4cGVjdChQc3ljaCkudG8gcmVjZWl2ZSg6cGFyc2UpCisgICAgICAgICAgICAjIFRoaXMgd29uJ3Qgd29yayBub3c7IHdlIGp1c3Qgd2FudCB0byBlbnN1cmUgUHN5Y2g6OlBhcnNlciNwYXJzZSB3YXMgaW4gZmFjdCBjYWxsZWQuCisgICAgICAgICAgICBZQU1MLnNhZmVfbG9hZCgqYXJndW1lbnRzKSByZXNjdWUgbmlsCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGlmIFNhZmVZQU1MOjpZQU1MX0VOR0lORSA9PSAic3ljayIKKyAgICAgICAgaXQgInVzZXMgU3ljayBpbnRlcm5hbGx5IHRvIHBhcnNlIFlBTUwiIGRvCisgICAgICAgICAgZXhwZWN0KFlBTUwpLnRvIHJlY2VpdmUoOnBhcnNlKS53aXRoKCJmb286IGJhciIpCisgICAgICAgICAgIyBUaGlzIHdvbid0IHdvcmsgbm93OyB3ZSBqdXN0IHdhbnQgdG8gZW5zdXJlIFlBTUw6OnBhcnNlIHdhcyBpbiBmYWN0IGNhbGxlZC4KKyAgICAgICAgICBZQU1MLnNhZmVfbG9hZCgiZm9vOiBiYXIiKSByZXNjdWUgbmlsCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAibG9hZHMgYSBwbGFpbiBvbCcgWUFNTCBkb2N1bWVudCBqdXN0IGZpbmUiIGRvCisgICAgICByZXN1bHQgPSBZQU1MLnNhZmVfbG9hZCA8PC1ZQU1MLnVuaW5kZW50CisgICAgICAgIGZvbzoKKyAgICAgICAgICBudW1iZXI6IDEKKyAgICAgICAgICBib29sZWFuOiB0cnVlCisgICAgICAgICAgbmlsOiB+CisgICAgICAgICAgc3RyaW5nOiBIZWxsbywgdGhlcmUhCisgICAgICAgICAgc3ltYm9sOiA6YmxhaAorICAgICAgICAgIHNlcXVlbmNlOgorICAgICAgICAgICAgLSBoaQorICAgICAgICAgICAgLSBieWUKKyAgICAgIFlBTUwKKworICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoeworICAgICAgICAiZm9vIiA9PiB7CisgICAgICAgICAgIm51bWJlciIgICA9PiAxLAorICAgICAgICAgICJib29sZWFuIiAgPT4gdHJ1ZSwKKyAgICAgICAgICAibmlsIiAgICAgID0+IG5pbCwKKyAgICAgICAgICAic3RyaW5nIiAgID0+ICJIZWxsbywgdGhlcmUhIiwKKyAgICAgICAgICAic3ltYm9sIiAgID0+ICI6YmxhaCIsCisgICAgICAgICAgInNlcXVlbmNlIiA9PiBbImhpIiwgImJ5ZSJdCisgICAgICAgIH0KKyAgICAgIH0pCisgICAgZW5kCisKKyAgICBpdCAid29ya3MgZm9yIFlBTUwgZG9jdW1lbnRzIHdpdGggYW5jaG9ycyBhbmQgYWxpYXNlcyIgZG8KKyAgICAgIHJlc3VsdCA9IFlBTUwuc2FmZV9sb2FkIDw8LVlBTUwKKyAgICAgICAgLSAmaWQwMDEge30KKyAgICAgICAgLSAqaWQwMDEKKyAgICAgICAgLSAqaWQwMDEKKyAgICAgIFlBTUwKKworICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoW3t9LCB7fSwge31dKQorICAgIGVuZAorCisgICAgaXQgIndvcmtzIGZvciBZQU1MIGRvY3VtZW50cyB3aXRoIGJpbmFyeSB0YWdnZWQga2V5cyIgZG8KKyAgICAgIHJlc3VsdCA9IFlBTUwuc2FmZV9sb2FkIDw8LVlBTUwKKyAgICAgICAgPyAhIWJpbmFyeSA+CisgICAgICAgICAgWm05dgorICAgICAgICA6ICJiYXIiCisgICAgICAgID8gISFiaW5hcnkgPgorICAgICAgICAgIFltRnkKKyAgICAgICAgOiAiYmF6IgorICAgICAgWUFNTAorCisgICAgICBleHBlY3QocmVzdWx0KS50byBlcSh7ImZvbyIgPT4gImJhciIsICJiYXIiID0+ICJiYXoifSkKKyAgICBlbmQKKworICAgIGl0ICJ3b3JrcyBmb3IgWUFNTCBkb2N1bWVudHMgd2l0aCBiaW5hcnkgdGFnZ2VkIHZhbHVlcyIgZG8KKyAgICAgIHJlc3VsdCA9IFlBTUwuc2FmZV9sb2FkIDw8LVlBTUwKKyAgICAgICAgImZvbyI6ICEhYmluYXJ5ID4KKyAgICAgICAgICBZbUZ5CisgICAgICAgICJiYXIiOiAhIWJpbmFyeSA+CisgICAgICAgICAgWW1GNgorICAgICAgWUFNTAorCisgICAgICBleHBlY3QocmVzdWx0KS50byBlcSh7ImZvbyIgPT4gImJhciIsICJiYXIiID0+ICJiYXoifSkKKyAgICBlbmQKKworICAgIGl0ICJ3b3JrcyBmb3IgWUFNTCBkb2N1bWVudHMgd2l0aCBiaW5hcnkgdGFnZ2VkIGFycmF5IHZhbHVlcyIgZG8KKyAgICAgIHJlc3VsdCA9IFlBTUwuc2FmZV9sb2FkIDw8LVlBTUwKKyAgICAgICAgLSAhYmluYXJ5IHwtCisgICAgICAgICAgWm05dgorICAgICAgICAtICFiaW5hcnkgfC0KKyAgICAgICAgICBZbUZ5CisgICAgICBZQU1MCisKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKFsiZm9vIiwgImJhciJdKQorICAgIGVuZAorCisgICAgaXQgIndvcmtzIGZvciBZQU1MIGRvY3VtZW50cyB3aXRoIHNlY3Rpb25zIiBkbworICAgICAgcmVzdWx0ID0gWUFNTC5zYWZlX2xvYWQgPDwtWUFNTAorICAgICAgICBteXNxbDogJm15c3FsCisgICAgICAgICAgYWRhcHRlcjogbXlzcWwKKyAgICAgICAgICBwb29sOiAzMAorICAgICAgICBsb2dpbjogJmxvZ2luCisgICAgICAgICAgdXNlcm5hbWU6IHVzZXIKKyAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQxMjMKKyAgICAgICAgZGV2ZWxvcG1lbnQ6ICZkZXZlbG9wbWVudAorICAgICAgICAgIDw8OiAqbXlzcWwKKyAgICAgICAgICA8PDogKmxvZ2luCisgICAgICAgICAgaG9zdDogbG9jYWxob3N0CisgICAgICBZQU1MCisKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsKKyAgICAgICAgIm15c3FsIiA9PiB7CisgICAgICAgICAgImFkYXB0ZXIiID0+ICJteXNxbCIsCisgICAgICAgICAgInBvb2wiICAgID0+IDMwCisgICAgICAgIH0sCisgICAgICAgICJsb2dpbiIgPT4geworICAgICAgICAgICJ1c2VybmFtZSIgPT4gInVzZXIiLAorICAgICAgICAgICJwYXNzd29yZCIgPT4gInBhc3N3b3JkMTIzIgorICAgICAgICB9LAorICAgICAgICAiZGV2ZWxvcG1lbnQiID0+IHsKKyAgICAgICAgICAiYWRhcHRlciIgID0+ICJteXNxbCIsCisgICAgICAgICAgInBvb2wiICAgICA9PiAzMCwKKyAgICAgICAgICAidXNlcm5hbWUiID0+ICJ1c2VyIiwKKyAgICAgICAgICAicGFzc3dvcmQiID0+ICJwYXNzd29yZDEyMyIsCisgICAgICAgICAgImhvc3QiICAgICA9PiAibG9jYWxob3N0IgorICAgICAgICB9CisgICAgICB9KQorICAgIGVuZAorCisgICAgaXQgImNvcnJlY3RseSBwcmVmZXJzIGV4cGxpY2l0bHkgZGVmaW5lZCB2YWx1ZXMgb3ZlciBkZWZhdWx0IHZhbHVlcyBmcm9tIGluY2x1ZGVkIHNlY3Rpb25zIiBkbworICAgICAgIyBSZXBlYXRpbmcgdGhpcyB0ZXN0IDEwMCB0aW1lcyB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiBydW5uaW5nIGludG8gYW4gaXNzdWUgY2F1c2VkIGJ5CisgICAgICAjIG5vbi1kZXRlcm1pbmlzdGljIGhhc2gga2V5IGVudW1lcmF0aW9uLgorICAgICAgMTAwLnRpbWVzIGRvCisgICAgICAgIHJlc3VsdCA9IFlBTUwuc2FmZV9sb2FkIDw8LVlBTUwKKyAgICAgICAgICBkZWZhdWx0czogJmRlZmF1bHRzCisgICAgICAgICAgICBmb286IGZvbworICAgICAgICAgICAgYmFyOiBiYXIKKyAgICAgICAgICAgIGJhejogYmF6CisgICAgICAgICAgY3VzdG9tOgorICAgICAgICAgICAgPDw6ICpkZWZhdWx0cworICAgICAgICAgICAgYmFyOiBjdXN0b21fYmFyCisgICAgICAgICAgICBiYXo6IGN1c3RvbV9iYXoKKyAgICAgICAgWUFNTAorCisgICAgICAgIGV4cGVjdChyZXN1bHRbImN1c3RvbSJdKS50byBlcSh7CisgICAgICAgICAgImZvbyIgPT4gImZvbyIsCisgICAgICAgICAgImJhciIgPT4gImN1c3RvbV9iYXIiLAorICAgICAgICAgICJiYXoiID0+ICJjdXN0b21fYmF6IgorICAgICAgICB9KQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAid29ya3Mgd2l0aCBtdWx0aS1sZXZlbCBpbmhlcml0YW5jZSIgZG8KKyAgICAgIHJlc3VsdCA9IFlBTUwuc2FmZV9sb2FkIDw8LVlBTUwKKyAgICAgICAgZGVmYXVsdHM6ICZkZWZhdWx0cworICAgICAgICAgIGZvbzogZm9vCisgICAgICAgICAgYmFyOiBiYXIKKyAgICAgICAgICBiYXo6IGJhegorICAgICAgICBjdXN0b206ICZjdXN0b20KKyAgICAgICAgICA8PDogKmRlZmF1bHRzCisgICAgICAgICAgYmFyOiBjdXN0b21fYmFyCisgICAgICAgICAgYmF6OiBjdXN0b21fYmF6CisgICAgICAgIGdyYW5kY3VzdG9tOiAmZ3JhbmRjdXN0b20KKyAgICAgICAgICA8PDogKmN1c3RvbQorICAgICAgWUFNTAorCisgICAgICBleHBlY3QocmVzdWx0KS50byBlcSh7CisgICAgICAgICJkZWZhdWx0cyIgICAgPT4geyAiZm9vIiA9PiAiZm9vIiwgImJhciIgPT4gImJhciIsICJiYXoiID0+ICJiYXoiIH0sCisgICAgICAgICJjdXN0b20iICAgICAgPT4geyAiZm9vIiA9PiAiZm9vIiwgImJhciIgPT4gImN1c3RvbV9iYXIiLCAiYmF6IiA9PiAiY3VzdG9tX2JheiIgfSwKKyAgICAgICAgImdyYW5kY3VzdG9tIiA9PiB7ICJmb28iID0+ICJmb28iLCAiYmFyIiA9PiAiY3VzdG9tX2JhciIsICJiYXoiID0+ICJjdXN0b21fYmF6IiB9CisgICAgICB9KQorICAgIGVuZAorCisgICAgaXQgInJldHVybnMgZmFsc2Ugd2hlbiBwYXJzaW5nIGFuIGVtcHR5IGRvY3VtZW50IiBkbworICAgICAgZXhwZWN0KFsKKyAgICAgICAgWUFNTC5zYWZlX2xvYWQoIiIpLAorICAgICAgICBZQU1MLnNhZmVfbG9hZCgiICAgICAiKSwKKyAgICAgICAgWUFNTC5zYWZlX2xvYWQoIlxuIikKKyAgICAgIF0pLnRvIGVxKFtmYWxzZSwgZmFsc2UsIGZhbHNlXSkKKyAgICBlbmQKKworICAgIGl0ICJyZXR1cm5zIG5pbCB3aGVuIHBhcnNpbmcgYSBzaW5nbGUgdmFsdWUgcmVwcmVzZW50aW5nIG5pbCIgZG8KKyAgICAgIGV4cGVjdChbCisgICAgICAgIFlBTUwuc2FmZV9sb2FkKCJ+IiksCisgICAgICAgIFlBTUwuc2FmZV9sb2FkKCJudWxsIikKKyAgICAgIF0pLnRvIGVxKFtuaWwsIG5pbF0pCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aXRoIGN1c3RvbSBpbml0aWFsaXplcnMgZGVmaW5lZCIgZG8KKyAgICAgIGJlZm9yZSA6ZWFjaCBkbworICAgICAgICBpZiBTYWZlWUFNTDo6WUFNTF9FTkdJTkUgPT0gInBzeWNoIgorICAgICAgICAgIFNhZmVZQU1MOjpPUFRJT05TWzpjdXN0b21faW5pdGlhbGl6ZXJzXSA9IHsKKyAgICAgICAgICAgICIhc2V0IiA9PiBsYW1iZGEgeyBTZXQubmV3IH0sCisgICAgICAgICAgICAiIWhhc2hpZW1hc2giID0+IGxhbWJkYSB7IEhhc2hpZTo6TWFzaC5uZXcgfQorICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIFNhZmVZQU1MOjpPUFRJT05TWzpjdXN0b21faW5pdGlhbGl6ZXJzXSA9IHsKKyAgICAgICAgICAgICJ0YWc6eWFtbC5vcmcsMjAwMjpzZXQiID0+IGxhbWJkYSB7IFNldC5uZXcgfSwKKyAgICAgICAgICAgICJ0YWc6eWFtbC5vcmcsMjAwMjpoYXNoaWVtYXNoIiA9PiBsYW1iZGEgeyBIYXNoaWU6Ok1hc2gubmV3IH0KKyAgICAgICAgICB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGl0ICJ3aWxsIHVzZSBhIGN1c3RvbSBpbml0aWFsaXplciB0byBpbnN0YW50aWF0ZSBhbiBhcnJheS1saWtlIGNsYXNzIHVwb24gZGVzZXJpYWxpemF0aW9uIiBkbworICAgICAgICByZXN1bHQgPSBZQU1MLnNhZmVfbG9hZCA8PC1ZQU1MLnVuaW5kZW50CisgICAgICAgICAgLS0tICFzZXQKKyAgICAgICAgICAtIDEKKyAgICAgICAgICAtIDIKKyAgICAgICAgICAtIDMKKyAgICAgICAgWUFNTAorCisgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGJlX2EoU2V0KQorICAgICAgICBleHBlY3QocmVzdWx0LnRvX2EpLnRvIG1hdGNoX2FycmF5KFsxLCAyLCAzXSkKKyAgICAgIGVuZAorCisgICAgICBpdCAid2lsbCB1c2UgYSBjdXN0b20gaW5pdGlhbGl6ZXIgdG8gaW5zdGFudGlhdGUgYSBoYXNoLWxpa2UgY2xhc3MgdXBvbiBkZXNlcmlhbGl6YXRpb24iIGRvCisgICAgICAgIHJlc3VsdCA9IFlBTUwuc2FmZV9sb2FkIDw8LVlBTUwudW5pbmRlbnQKKyAgICAgICAgICAtLS0gIWhhc2hpZW1hc2gKKyAgICAgICAgICBmb286IGJhcgorICAgICAgICBZQU1MCisKKyAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gYmVfYShIYXNoaWU6Ok1hc2gpCisgICAgICAgIGV4cGVjdChyZXN1bHQudG9faGFzaCkudG8gZXEoeyAiZm9vIiA9PiAiYmFyIiB9KQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aXRoIHNwZWNpYWwgd2hpdGVsaXN0ZWQgdGFncyBkZWZpbmVkIiBkbworICAgICAgYmVmb3JlIDplYWNoIGRvCisgICAgICAgIFNhZmVZQU1MOjp3aGl0ZWxpc3QhKE9wZW5TdHJ1Y3QpCisKKyAgICAgICAgIyBOZWNlc3NhcnkgZm9yIGRlc2VyaWFsaXppbmcgT3BlblN0cnVjdHMgcHJvcGVybHkuCisgICAgICAgIFNhZmVZQU1MOjpPUFRJT05TWzpkZXNlcmlhbGl6ZV9zeW1ib2xzXSA9IHRydWUKKyAgICAgIGVuZAorCisgICAgICBpdCAid2lsbCBhbGxvdyBvYmplY3RzIHRvIGJlIGRlc2VyaWFsaXplZCBmb3Igd2hpdGVsaXN0ZWQgdGFncyIgZG8KKyAgICAgICAgcmVzdWx0ID0gWUFNTC5zYWZlX2xvYWQoIi0tLSAhcnVieS9vYmplY3Q6T3BlblN0cnVjdFxudGFibGU6XG4gIGZvbzogYmFyXG4iKQorICAgICAgICBleHBlY3QocmVzdWx0KS50byBiZV9hKE9wZW5TdHJ1Y3QpCisgICAgICAgIGV4cGVjdChyZXN1bHQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAdGFibGUpKS50byBlcSh7ICJmb28iID0+ICJiYXIiIH0pCisgICAgICBlbmQKKworICAgICAgaXQgIndpbGwgbm90IGRlc2VyaWFsaXplIG9iamVjdHMgd2l0aG91dCB3aGl0ZWxpc3RlZCB0YWdzIiBkbworICAgICAgICByZXN1bHQgPSBZQU1MLnNhZmVfbG9hZCgiLS0tICFydWJ5L2hhc2g6RXhwbG9pdGFibGVCYWNrRG9vclxuZm9vOiBiYXJcbiIpCisgICAgICAgIGV4cGVjdChyZXN1bHQpLm5vdF90byBiZV9hKEV4cGxvaXRhYmxlQmFja0Rvb3IpCisgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsgImZvbyIgPT4gImJhciIgfSkKKyAgICAgIGVuZAorCisgICAgICBpdCAid2lsbCBub3QgYWxsb3cgbm9uLXdoaXRlbGlzdGVkIG9iamVjdHMgdG8gYmUgZW1iZWRkZWQgd2l0aGluIG9iamVjdHMgd2l0aCB3aGl0ZWxpc3RlZCB0YWdzIiBkbworICAgICAgICByZXN1bHQgPSBZQU1MLnNhZmVfbG9hZCA8PC1ZQU1MLnVuaW5kZW50CisgICAgICAgICAgLS0tICFydWJ5L29iamVjdDpPcGVuU3RydWN0IAorICAgICAgICAgIHRhYmxlOiAKKyAgICAgICAgICAgIDpiYWNrZG9vcjogIXJ1Ynkvb2JqZWN0OkV4cGxvaXRhYmxlQmFja0Rvb3IgCisgICAgICAgICAgICAgIGZvbzogYmFyCisgICAgICAgIFlBTUwKKworICAgICAgICBleHBlY3QocmVzdWx0KS50byBiZV9hKE9wZW5TdHJ1Y3QpCisgICAgICAgIGV4cGVjdChyZXN1bHQuYmFja2Rvb3IpLm5vdF90byBiZV9hKEV4cGxvaXRhYmxlQmFja0Rvb3IpCisgICAgICAgIGV4cGVjdChyZXN1bHQuYmFja2Rvb3IpLnRvIGVxKHsgImZvbyIgPT4gImJhciIgfSkKKyAgICAgIGVuZAorCisgICAgICBjb250ZXh0ICJ3aXRoIHRoZSA6cmFpc2Vfb25fdW5rbm93bl90YWcgb3B0aW9uIGVuYWJsZWQiIGRvCisgICAgICAgIGJlZm9yZSA6ZWFjaCBkbworICAgICAgICAgIFNhZmVZQU1MOjpPUFRJT05TWzpyYWlzZV9vbl91bmtub3duX3RhZ10gPSB0cnVlCisgICAgICAgIGVuZAorCisgICAgICAgIGFmdGVyIDplYWNoIGRvCisgICAgICAgICAgU2FmZVlBTUwucmVzdG9yZV9kZWZhdWx0cyEKKyAgICAgICAgZW5kCisKKyAgICAgICAgaXQgInJhaXNlcyBhbiBleGNlcHRpb24gaWYgYSBub24tbmlsLCBub24td2hpdGVsaXN0ZWQgdGFnIGlzIGVuY291bnRlcmVkIiBkbworICAgICAgICAgIGV4cGVjdCB7CisgICAgICAgICAgICBZQU1MLnNhZmVfbG9hZCA8PC1ZQU1MLnVuaW5kZW50CisgICAgICAgICAgICAgIC0tLSAhcnVieS9vYmplY3Q6VW5rbm93bgorICAgICAgICAgICAgICBmb286IGJhcgorICAgICAgICAgICAgWUFNTAorICAgICAgICAgIH0udG8gcmFpc2VfZXJyb3IKKyAgICAgICAgZW5kCisKKyAgICAgICAgaXQgImNoZWNrcyBhbGwgdGFncywgZXZlbiB0aG9zZSB3aXRoaW4gb2JqZWN0cyB3aXRoIHRydXN0ZWQgdGFncyIgZG8KKyAgICAgICAgICBleHBlY3QgeworICAgICAgICAgICAgWUFNTC5zYWZlX2xvYWQgPDwtWUFNTC51bmluZGVudAorICAgICAgICAgICAgICAtLS0gIXJ1Ynkvb2JqZWN0Ok9wZW5TdHJ1Y3QKKyAgICAgICAgICAgICAgdGFibGU6CisgICAgICAgICAgICAgICAgOmJhY2tkb29yOiAhcnVieS9vYmplY3Q6VW5rbm93bgorICAgICAgICAgICAgICAgICAgZm9vOiBiYXIKKyAgICAgICAgICAgIFlBTUwKKyAgICAgICAgICB9LnRvIHJhaXNlX2Vycm9yCisgICAgICAgIGVuZAorCisgICAgICAgIGl0ICJkb2VzIG5vdCByYWlzZSBhbiBleGNlcHRpb24gYXMgbG9uZyBhcyBhbGwgdGFncyBhcmUgd2hpdGVsaXN0ZWQiIGRvCisgICAgICAgICAgcmVzdWx0ID0gWUFNTC5zYWZlX2xvYWQgPDwtWUFNTC51bmluZGVudAorICAgICAgICAgICAgLS0tICFydWJ5L29iamVjdDpPcGVuU3RydWN0CisgICAgICAgICAgICB0YWJsZToKKyAgICAgICAgICAgICAgOmJhY2tkb29yOgorICAgICAgICAgICAgICAgIHN0cmluZzogZm9vCisgICAgICAgICAgICAgICAgaW50ZWdlcjogMQorICAgICAgICAgICAgICAgIGZsb2F0OiAzLjE0CisgICAgICAgICAgICAgICAgc3ltYm9sOiA6YmFyCisgICAgICAgICAgICAgICAgZGF0ZTogMjAxMy0wMi0yMAorICAgICAgICAgICAgICAgIGFycmF5OiBbXQorICAgICAgICAgICAgICAgIGhhc2g6IHt9CisgICAgICAgICAgWUFNTAorCisgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gYmVfYShPcGVuU3RydWN0KQorICAgICAgICAgIGV4cGVjdChyZXN1bHQuYmFja2Rvb3IpLnRvIGVxKHsKKyAgICAgICAgICAgICJzdHJpbmciICA9PiAiZm9vIiwKKyAgICAgICAgICAgICJpbnRlZ2VyIiA9PiAxLAorICAgICAgICAgICAgImZsb2F0IiAgID0+IDMuMTQsCisgICAgICAgICAgICAic3ltYm9sIiAgPT4gOmJhciwKKyAgICAgICAgICAgICJkYXRlIiAgICA9PiBEYXRlLnBhcnNlKCIyMDEzLTAyLTIwIiksCisgICAgICAgICAgICAiYXJyYXkiICAgPT4gW10sCisgICAgICAgICAgICAiaGFzaCIgICAgPT4ge30KKyAgICAgICAgICB9KQorICAgICAgICBlbmQKKworICAgICAgICBpdCAiZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIG9uIHRoZSBub24tc3BlY2lmaWMgJyEnIHRhZyIgZG8KKyAgICAgICAgICByZXN1bHQgPSBuaWwKKyAgICAgICAgICBleHBlY3QgeyByZXN1bHQgPSBZQU1MLnNhZmVfbG9hZCAiLS0tICEgJ2ZvbyciIH0udG9fbm90IHJhaXNlX2Vycm9yCisgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoImZvbyIpCisgICAgICAgIGVuZAorCisgICAgICAgIGNvbnRleHQgIndpdGggd2hpdGVsaXN0ZWQgY3VzdG9tIGNsYXNzIiBkbworICAgICAgICAgIGNsYXNzIFNvbWVDbGFzcworICAgICAgICAgICAgYXR0cl9hY2Nlc3NvciA6Zm9vCisgICAgICAgICAgZW5kCisgICAgICAgICAgbGV0KDppbnN0YW5jZSkgeyBTb21lQ2xhc3MubmV3IH0KKworICAgICAgICAgIGJlZm9yZSBkbworICAgICAgICAgICAgU2FmZVlBTUw6OndoaXRlbGlzdCEoU29tZUNsYXNzKQorICAgICAgICAgICAgaW5zdGFuY2UuZm9vID0gJ3dpdGggdHJhaWxpbmcgd2hpdGVzcGFjZTogJworICAgICAgICAgIGVuZAorCisgICAgICAgICAgaXQgImRvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiB0aGUgbm9uLXNwZWNpZmljICchJyB0YWciIGRvCisgICAgICAgICAgICByZXN1bHQgPSBuaWwKKyAgICAgICAgICAgIGV4cGVjdCB7IHJlc3VsdCA9IFlBTUwuc2FmZV9sb2FkKGluc3RhbmNlLnRvX3lhbWwpIH0udG9fbm90IHJhaXNlX2Vycm9yCisgICAgICAgICAgICBleHBlY3QocmVzdWx0LmZvbykudG8gZXEoJ3dpdGggdHJhaWxpbmcgd2hpdGVzcGFjZTogJykKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNvbnRleHQgIndoZW4gb3B0aW9ucyBhcmUgcGFzc2VkIGRpcmVjbHR5IHRvICNsb2FkIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBkZWZhdWx0cyIgZG8KKyAgICAgIGxldCg6ZGVmYXVsdF9vcHRpb25zKSB7IHt9IH0KKworICAgICAgYmVmb3JlIDplYWNoIGRvCisgICAgICAgIFNhZmVZQU1MOjpPUFRJT05TLm1lcmdlIShkZWZhdWx0X29wdGlvbnMpCisgICAgICBlbmQKKworICAgICAgY29udGV4dCAiKGZvciBleGFtcGxlLCB3aGVuIHN5bWJvbCBkZXNlcmlhbGl6YXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0KSIgZG8KKyAgICAgICAgbGV0KDpkZWZhdWx0X29wdGlvbnMpIHsgeyA6ZGVzZXJpYWxpemVfc3ltYm9scyA9PiB0cnVlIH0gfQorCisgICAgICAgIGl0ICJnb2VzIHdpdGggdGhlIGRlZmF1bHQgb3B0aW9uIHdoZW4gaXQgaXMgbm90IG92ZXJyaWRkZW4iIGRvCisgICAgICAgICAgc2lsZW5jZV93YXJuaW5ncyBkbworICAgICAgICAgICAgZXhwZWN0KFlBTUwubG9hZCgiOmZvbzogYmFyIikpLnRvIGVxKHsgOmZvbyA9PiAiYmFyIiB9KQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBpdCAiYWxsb3dzIHRoZSBkZWZhdWx0IG9wdGlvbiB0byBiZSBvdmVycmlkZGVuIG9uIGEgcGVyLWNhbGwgYmFzaXMiIGRvCisgICAgICAgICAgc2lsZW5jZV93YXJuaW5ncyBkbworICAgICAgICAgICAgZXhwZWN0KFlBTUwubG9hZCgiOmZvbzogYmFyIiwgOmRlc2VyaWFsaXplX3N5bWJvbHMgPT4gZmFsc2UpKS50byBlcSh7ICI6Zm9vIiA9PiAiYmFyIiB9KQorICAgICAgICAgICAgZXhwZWN0KFlBTUwubG9hZCgiOmZvbzogYmFyIiwgOmRlc2VyaWFsaXplX3N5bWJvbHMgPT4gdHJ1ZSkpLnRvIGVxKHsgOmZvbyA9PiAiYmFyIiB9KQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBjb250ZXh0ICIob3IsIGZvciBleGFtcGxlLCB3aGVuIGNlcnRhaW4gdGFncyBhcmUgd2hpdGVsaXN0ZWQpIiBkbworICAgICAgICBsZXQoOmRlZmF1bHRfb3B0aW9ucykgeworICAgICAgICAgIHsKKyAgICAgICAgICAgIDpkZXNlcmlhbGl6ZV9zeW1ib2xzID0+IHRydWUsCisgICAgICAgICAgICA6d2hpdGVsaXN0ZWRfdGFncyA9PiBTYWZlWUFNTDo6WUFNTF9FTkdJTkUgPT0gInBzeWNoIiA/CisgICAgICAgICAgICAgIFsiIXJ1Ynkvb2JqZWN0Ok9wZW5TdHJ1Y3QiXSA6CisgICAgICAgICAgICAgIFsidGFnOnJ1YnkueWFtbC5vcmcsMjAwMjpvYmplY3Q6T3BlblN0cnVjdCJdCisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaXQgImdvZXMgd2l0aCB0aGUgZGVmYXVsdCBvcHRpb24gd2hlbiBpdCBpcyBub3Qgb3ZlcnJpZGRlbiIgZG8KKyAgICAgICAgICByZXN1bHQgPSBzYWZlX2xvYWRfcm91bmRfdHJpcChPcGVuU3RydWN0Lm5ldyg6Zm9vID0+ICJiYXIiKSkKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBiZV9hKE9wZW5TdHJ1Y3QpCisgICAgICAgICAgZXhwZWN0KHJlc3VsdC5mb28pLnRvIGVxKCJiYXIiKQorICAgICAgICBlbmQKKworICAgICAgICBpdCAiYWxsb3dzIHRoZSBkZWZhdWx0IG9wdGlvbiB0byBiZSBvdmVycmlkZGVuIG9uIGEgcGVyLWNhbGwgYmFzaXMiIGRvCisgICAgICAgICAgcmVzdWx0ID0gc2FmZV9sb2FkX3JvdW5kX3RyaXAoT3BlblN0cnVjdC5uZXcoOmZvbyA9PiAiYmFyIiksIDp3aGl0ZWxpc3RlZF90YWdzID0+IFtdKQorICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKHsgInRhYmxlIiA9PiB7IDpmb28gPT4gImJhciIgfSB9KQorCisgICAgICAgICAgcmVzdWx0ID0gc2FmZV9sb2FkX3JvdW5kX3RyaXAoT3BlblN0cnVjdC5uZXcoOmZvbyA9PiAiYmFyIiksIDpkZXNlcmlhbGl6ZV9zeW1ib2xzID0+IGZhbHNlLCA6d2hpdGVsaXN0ZWRfdGFncyA9PiBbXSkKKyAgICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcSh7ICJ0YWJsZSIgPT4geyAiOmZvbyIgPT4gImJhciIgfSB9KQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAidW5zYWZlX2xvYWRfZmlsZSIgZG8KKyAgICBpZiBTYWZlWUFNTDo6WUFNTF9FTkdJTkUgPT0gInBzeWNoIiAmJiBSVUJZX1ZFUlNJT04gPj0gIjEuOS4zIgorICAgICAgaXQgImFsbG93cyBleHBsb2l0cyB0aHJvdWdoIG9iamVjdHMgZGVmaW5lZCBpbiBZQU1MIHcvICFydWJ5L2hhc2ggdmlhIGN1c3RvbSA6W109IG1ldGhvZHMiIGRvCisgICAgICAgIGJhY2tkb29yID0gWUFNTC51bnNhZmVfbG9hZF9maWxlICJzcGVjL2V4cGxvaXQuMS45LjMueWFtbCIKKyAgICAgICAgZXhwZWN0KGJhY2tkb29yKS50byBiZV9leHBsb2l0ZWRfdGhyb3VnaF9zZXR0ZXIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaWYgU2FmZVlBTUw6OllBTUxfRU5HSU5FID09ICJwc3ljaCIgJiYgUlVCWV9WRVJTSU9OID49ICIxLjkuMiIKKyAgICAgIGl0ICJhbGxvd3MgZXhwbG9pdHMgdGhyb3VnaCBvYmplY3RzIGRlZmluZWQgaW4gWUFNTCB3LyAhcnVieS9vYmplY3QgdmlhIHRoZSA6aW5pdF93aXRoIG1ldGhvZCIgZG8KKyAgICAgICAgYmFja2Rvb3IgPSBZQU1MLnVuc2FmZV9sb2FkX2ZpbGUgInNwZWMvZXhwbG9pdC4xLjkuMi55YW1sIgorICAgICAgICBleHBlY3QoYmFja2Rvb3IpLnRvIGJlX2V4cGxvaXRlZF90aHJvdWdoX2luaXRfd2l0aAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAiYWxsb3dzIGV4cGxvaXRzIHRocm91Z2ggb2JqZWN0cyB3LyBzZW5zaXRpdmUgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgaW4gWUFNTCB3LyAhcnVieS9vYmplY3QiIGRvCisgICAgICBiYWNrZG9vciA9IFlBTUwudW5zYWZlX2xvYWRfZmlsZSAic3BlYy9leHBsb2l0LjEuOS4yLnlhbWwiCisgICAgICBleHBlY3QoYmFja2Rvb3IpLnRvIGJlX2V4cGxvaXRlZF90aHJvdWdoX2l2YXJzCisgICAgZW5kCisgIGVuZAorCisgIGRlc2NyaWJlICJzYWZlX2xvYWRfZmlsZSIgZG8KKyAgICBpdCAiZG9lcyBOT1QgYWxsb3cgZXhwbG9pdHMgdGhyb3VnaCBvYmplY3RzIGRlZmluZWQgaW4gWUFNTCB3LyAhcnVieS9oYXNoIiBkbworICAgICAgb2JqZWN0ID0gWUFNTC5zYWZlX2xvYWRfZmlsZSAic3BlYy9leHBsb2l0LjEuOS4zLnlhbWwiCisgICAgICBleHBlY3Qob2JqZWN0KS5ub3RfdG8gYmVfYShFeHBsb2l0YWJsZUJhY2tEb29yKQorICAgIGVuZAorCisgICAgaXQgImRvZXMgTk9UIGFsbG93IGV4cGxvaXRzIHRocm91Z2ggb2JqZWN0cyBkZWZpbmVkIGluIFlBTUwgdy8gIXJ1Ynkvb2JqZWN0IiBkbworICAgICAgb2JqZWN0ID0gWUFNTC5zYWZlX2xvYWRfZmlsZSAic3BlYy9leHBsb2l0LjEuOS4yLnlhbWwiCisgICAgICBleHBlY3Qob2JqZWN0KS5ub3RfdG8gYmVfYShFeHBsb2l0YWJsZUJhY2tEb29yKQorICAgIGVuZAorICAgIAorICAgIGl0ICJyZXR1cm5zIGZhbHNlIHdoZW4gcGFyc2luZyBhbiBlbXB0eSBmaWxlIiBkbworICAgICAgZXhwZWN0KFlBTUwuc2FmZV9sb2FkX2ZpbGUoInNwZWMvaXNzdWU0OS55bWwiKSkudG8gZXEoZmFsc2UpCisgICAgZW5kCisgIGVuZAorCisgIGRlc2NyaWJlICJsb2FkIiBkbworICAgIGxldCg6b3B0aW9ucykgeyB7fSB9CisKKyAgICBsZXQgKDphcmd1bWVudHMpIHsKKyAgICAgIGlmIFNhZmVZQU1MOjpNVUxUSV9BUkdVTUVOVF9ZQU1MX0xPQUQKKyAgICAgICAgWyJmb286IGJhciIsIG5pbCwgb3B0aW9uc10KKyAgICAgIGVsc2UKKyAgICAgICAgWyJmb286IGJhciIsIG9wdGlvbnNdCisgICAgICBlbmQKKyAgICB9CisKKyAgICBjb250ZXh0ICJhcyBsb25nIGFzIGEgOmRlZmF1bHRfbW9kZSBoYXMgYmVlbiBzcGVjaWZpZWQiIGRvCisgICAgICBpdCAiZG9lc24ndCBpc3N1ZSBhIHdhcm5pbmcgZm9yIHNhZmUgbW9kZSwgc2luY2UgYW4gZXhwbGljaXQgbW9kZSBoYXMgYmVlbiBzZXQiIGRvCisgICAgICAgIFNhZmVZQU1MOjpPUFRJT05TWzpkZWZhdWx0X21vZGVdID0gOnNhZmUKKyAgICAgICAgZXhwZWN0KEtlcm5lbCkubm90X3RvIHJlY2VpdmUoOndhcm4pCisgICAgICAgIFlBTUwubG9hZCgqYXJndW1lbnRzKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJkb2Vzbid0IGlzc3VlIGEgd2FybmluZyBmb3IgdW5zYWZlIG1vZGUsIHNpbmNlIGFuIGV4cGxpY2l0IG1vZGUgaGFzIGJlZW4gc2V0IiBkbworICAgICAgICBTYWZlWUFNTDo6T1BUSU9OU1s6ZGVmYXVsdF9tb2RlXSA9IDp1bnNhZmUKKyAgICAgICAgZXhwZWN0KEtlcm5lbCkubm90X3RvIHJlY2VpdmUoOndhcm4pCisgICAgICAgIFlBTUwubG9hZCgqYXJndW1lbnRzKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aGVuIHRoZSA6c2FmZSBvcHRpb25zIGlzIHNwZWNpZmllZCIgZG8KKyAgICAgIGxldCg6c2FmZV9tb2RlKSB7IHRydWUgfQorICAgICAgbGV0KDpvcHRpb25zKSB7IHsgOnNhZmUgPT4gc2FmZV9tb2RlIH0gfQorCisgICAgICBpdCAiZG9lc24ndCBpc3N1ZSBhIHdhcm5pbmciIGRvCisgICAgICAgIGV4cGVjdChLZXJuZWwpLm5vdF90byByZWNlaXZlKDp3YXJuKQorICAgICAgICBZQU1MLmxvYWQoKmFyZ3VtZW50cykKKyAgICAgIGVuZAorCisgICAgICBpdCAiY2FsbHMgI3NhZmVfbG9hZCBpZiB0aGUgOnNhZmUgb3B0aW9uIGlzIHNldCB0byB0cnVlIiBkbworICAgICAgICBleHBlY3QoWUFNTCkudG8gcmVjZWl2ZSg6c2FmZV9sb2FkKQorICAgICAgICBZQU1MLmxvYWQoKmFyZ3VtZW50cykKKyAgICAgIGVuZAorCisgICAgICBjb250ZXh0ICJ3aGVuIHRoZSA6c2FmZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlIiBkbworICAgICAgICBsZXQoOnNhZmVfbW9kZSkgeyBmYWxzZSB9CisKKyAgICAgICAgaXQgImNhbGxzICN1bnNhZmVfbG9hZCBpZiB0aGUgOnNhZmUgb3B0aW9uIGlzIHNldCB0byBmYWxzZSIgZG8KKyAgICAgICAgICBleHBlY3QoWUFNTCkudG8gcmVjZWl2ZSg6dW5zYWZlX2xvYWQpCisgICAgICAgICAgWUFNTC5sb2FkKCphcmd1bWVudHMpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAiaXNzdWVzIGEgd2FybmluZyB3aGVuIHRoZSA6c2FmZSBvcHRpb24gaXMgb21pdHRlZCIgZG8KKyAgICAgIHNpbGVuY2Vfd2FybmluZ3MgZG8KKyAgICAgICAgZXhwZWN0KEtlcm5lbCkudG8gcmVjZWl2ZSg6d2FybikKKyAgICAgICAgWUFNTC5sb2FkKCphcmd1bWVudHMpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJvbmx5IGlzc3VlcyBhIHdhcm5pbmcgb25jZSAodG8gYXZvaWQgc3BhbW1pbmcgYW4gYXBwJ3Mgb3V0cHV0KSIgZG8KKyAgICAgIHNpbGVuY2Vfd2FybmluZ3MgZG8KKyAgICAgICAgZXhwZWN0KEtlcm5lbCkudG8gcmVjZWl2ZSg6d2Fybikub25jZQorICAgICAgICAyLnRpbWVzIHsgWUFNTC5sb2FkKCphcmd1bWVudHMpIH0KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgImRlZmF1bHRzIHRvIHNhZmUgbW9kZSBpZiB0aGUgOnNhZmUgb3B0aW9uIGlzIG9taXR0ZWQiIGRvCisgICAgICBzaWxlbmNlX3dhcm5pbmdzIGRvCisgICAgICAgIGV4cGVjdChZQU1MKS50byByZWNlaXZlKDpzYWZlX2xvYWQpCisgICAgICAgIFlBTUwubG9hZCgqYXJndW1lbnRzKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aXRoIHRoZSBkZWZhdWx0IG1vZGUgc2V0IHRvIDp1bnNhZmUiIGRvCisgICAgICBiZWZvcmUgOmVhY2ggZG8KKyAgICAgICAgU2FmZVlBTUw6Ok9QVElPTlNbOmRlZmF1bHRfbW9kZV0gPSA6dW5zYWZlCisgICAgICBlbmQKKworICAgICAgaXQgImRlZmF1bHRzIHRvIHVuc2FmZSBtb2RlIGlmIHRoZSA6c2FmZSBvcHRpb24gaXMgb21pdHRlZCIgZG8KKyAgICAgICAgc2lsZW5jZV93YXJuaW5ncyBkbworICAgICAgICAgIGV4cGVjdChZQU1MKS50byByZWNlaXZlKDp1bnNhZmVfbG9hZCkKKyAgICAgICAgICBZQU1MLmxvYWQoKmFyZ3VtZW50cykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgaXQgImNhbGxzICNzYWZlX2xvYWQgaWYgdGhlIDpzYWZlIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSIgZG8KKyAgICAgICAgZXhwZWN0KFlBTUwpLnRvIHJlY2VpdmUoOnNhZmVfbG9hZCkKKyAgICAgICAgWUFNTC5sb2FkKCooYXJndW1lbnRzICsgW3sgOnNhZmUgPT4gdHJ1ZSB9XSkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzY3JpYmUgImxvYWRfZmlsZSIgZG8KKyAgICBsZXQoOmZpbGVuYW1lKSB7ICJzcGVjL2V4cGxvaXQuMS45LjIueWFtbCIgfSAjIGRvZXNuJ3QgcmVhbGx5IG1hdHRlcgorCisgICAgaXQgImlzc3VlcyBhIHdhcm5pbmcgaWYgdGhlIDpzYWZlIG9wdGlvbiBpcyBvbWl0dGVkIiBkbworICAgICAgc2lsZW5jZV93YXJuaW5ncyBkbworICAgICAgICBleHBlY3QoS2VybmVsKS50byByZWNlaXZlKDp3YXJuKQorICAgICAgICBZQU1MLmxvYWRfZmlsZShmaWxlbmFtZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgImRvZXNuJ3QgaXNzdWUgYSB3YXJuaW5nIGFzIGxvbmcgYXMgdGhlIDpzYWZlIG9wdGlvbiBpcyBzcGVjaWZpZWQiIGRvCisgICAgICBleHBlY3QoS2VybmVsKS5ub3RfdG8gcmVjZWl2ZSg6d2FybikKKyAgICAgIFlBTUwubG9hZF9maWxlKGZpbGVuYW1lLCA6c2FmZSA9PiB0cnVlKQorICAgIGVuZAorCisgICAgaXQgImRlZmF1bHRzIHRvIHNhZmUgbW9kZSBpZiB0aGUgOnNhZmUgb3B0aW9uIGlzIG9taXR0ZWQiIGRvCisgICAgICBzaWxlbmNlX3dhcm5pbmdzIGRvCisgICAgICAgIGV4cGVjdChZQU1MKS50byByZWNlaXZlKDpzYWZlX2xvYWRfZmlsZSkKKyAgICAgICAgWUFNTC5sb2FkX2ZpbGUoZmlsZW5hbWUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJjYWxscyAjc2FmZV9sb2FkX2ZpbGUgaWYgdGhlIDpzYWZlIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSIgZG8KKyAgICAgIGV4cGVjdChZQU1MKS50byByZWNlaXZlKDpzYWZlX2xvYWRfZmlsZSkKKyAgICAgIFlBTUwubG9hZF9maWxlKGZpbGVuYW1lLCA6c2FmZSA9PiB0cnVlKQorICAgIGVuZAorCisgICAgaXQgImNhbGxzICN1bnNhZmVfbG9hZF9maWxlIGlmIHRoZSA6c2FmZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlIiBkbworICAgICAgZXhwZWN0KFlBTUwpLnRvIHJlY2VpdmUoOnVuc2FmZV9sb2FkX2ZpbGUpCisgICAgICBZQU1MLmxvYWRfZmlsZShmaWxlbmFtZSwgOnNhZmUgPT4gZmFsc2UpCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aXRoIGFyYml0cmFyeSBvYmplY3QgZGVzZXJpYWxpemF0aW9uIGVuYWJsZWQgYnkgZGVmYXVsdCIgZG8KKyAgICAgIGJlZm9yZSA6ZWFjaCBkbworICAgICAgICBTYWZlWUFNTDo6T1BUSU9OU1s6ZGVmYXVsdF9tb2RlXSA9IDp1bnNhZmUKKyAgICAgIGVuZAorCisgICAgICBpdCAiZGVmYXVsdHMgdG8gdW5zYWZlIG1vZGUgaWYgdGhlIDpzYWZlIG9wdGlvbiBpcyBvbWl0dGVkIiBkbworICAgICAgICBzaWxlbmNlX3dhcm5pbmdzIGRvCisgICAgICAgICAgZXhwZWN0KFlBTUwpLnRvIHJlY2VpdmUoOnVuc2FmZV9sb2FkX2ZpbGUpCisgICAgICAgICAgWUFNTC5sb2FkX2ZpbGUoZmlsZW5hbWUpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGl0ICJjYWxscyAjc2FmZV9sb2FkIGlmIHRoZSA6c2FmZSBvcHRpb24gaXMgc2V0IHRvIHRydWUiIGRvCisgICAgICAgIGV4cGVjdChZQU1MKS50byByZWNlaXZlKDpzYWZlX2xvYWRfZmlsZSkKKyAgICAgICAgWUFNTC5sb2FkX2ZpbGUoZmlsZW5hbWUsIDpzYWZlID0+IHRydWUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJoYW5kbGVzIGZpbGVzIHN0YXJ0aW5nIHdpdGggLS0tIChzZWUgaXNzdWUgIzQ4KSIgZG8KKyAgICAgIGV4cGVjdChZQU1MLmxvYWRfZmlsZSgic3BlYy9pc3N1ZTQ4LnR4dCIsIDpzYWZlID0+IHRydWUpKS50byBlcSh7CisgICAgICAgICJ0aXRsZSIgPT4gIkJsYWgiLAorICAgICAgICAia2V5IiAgID0+ICJ2YWx1ZSIKKyAgICAgIH0pCisgICAgZW5kCisKKyAgICBpdCAiaGFuZGxlcyBjb250ZW50IHN0YXJ0aW5nIHdpdGggLS0tIChzZWUgaXNzdWUgIzQ4KSIgZG8KKyAgICAgIHlhbWwgPSBGaWxlLnJlYWQoInNwZWMvaXNzdWU0OC50eHQiKQorICAgICAgZXhwZWN0KFlBTUwubG9hZCh5YW1sLCA6c2FmZSA9PiB0cnVlKSkudG8gZXEoeworICAgICAgICAidGl0bGUiID0+ICJCbGFoIiwKKyAgICAgICAgImtleSIgICA9PiAidmFsdWUiCisgICAgICB9KQorICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSAid2hpdGVsaXN0ISIgZG8KKyAgICBjb250ZXh0ICJub3QgYSBjbGFzcyIgZG8KKyAgICAgIGl0ICJzaG91bGQgcmFpc2UiIGRvCisgICAgICAgIGV4cGVjdCB7IFNhZmVZQU1MOjp3aGl0ZWxpc3QhIDpmb28gfS50byByYWlzZV9lcnJvcigvbm90IGEgQ2xhc3MvKQorICAgICAgICBleHBlY3QoU2FmZVlBTUw6Ok9QVElPTlNbOndoaXRlbGlzdGVkX3RhZ3NdKS50byBiZV9lbXB0eQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJhbm9ueW1vdXMgY2xhc3MiIGRvCisgICAgICBpdCAic2hvdWxkIHJhaXNlIiBkbworICAgICAgICBleHBlY3QgeyBTYWZlWUFNTDo6d2hpdGVsaXN0ISBDbGFzcy5uZXcgfS50byByYWlzZV9lcnJvcigvY2Fubm90IGJlIGFub255bW91cy8pCisgICAgICAgIGV4cGVjdChTYWZlWUFNTDo6T1BUSU9OU1s6d2hpdGVsaXN0ZWRfdGFnc10pLnRvIGJlX2VtcHR5CisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNvbnRleHQgIndpdGggYSBDbGFzcyBhcyBpdHMgYXJndW1lbnQiIGRvCisgICAgICBpdCAic2hvdWxkIGNvbmZpZ3VyZSBjb3JyZWN0bHkiIGRvCisgICAgICAgIGV4cGVjdCB7IFNhZmVZQU1MOjp3aGl0ZWxpc3QhIE9wZW5TdHJ1Y3QgfS50b19ub3QgcmFpc2VfZXJyb3IKKyAgICAgICAgZXhwZWN0KFNhZmVZQU1MOjpPUFRJT05TWzp3aGl0ZWxpc3RlZF90YWdzXS5ncmVwKC9PcGVuU3RydWN0XFovKSkubm90X3RvIGJlX2VtcHR5CisgICAgICBlbmQKKworICAgICAgaXQgInN1Y2Nlc3NmdWxseSBkZXNlcmlhbGl6ZXMgdGhlIHNwZWNpZmllZCBjbGFzcyIgZG8KKyAgICAgICAgU2FmZVlBTUwud2hpdGVsaXN0IShPcGVuU3RydWN0KQorCisgICAgICAgICMgbmVjZXNzYXJ5IGZvciBwcm9wZXJseSBhc3NpZ25pbmcgT3BlblN0cnVjdCBhdHRyaWJ1dGVzCisgICAgICAgIFNhZmVZQU1MOjpPUFRJT05TWzpkZXNlcmlhbGl6ZV9zeW1ib2xzXSA9IHRydWUKKworICAgICAgICByZXN1bHQgPSBzYWZlX2xvYWRfcm91bmRfdHJpcChPcGVuU3RydWN0Lm5ldyg6Zm9vID0+ICJiYXIiKSkKKyAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gYmVfYShPcGVuU3RydWN0KQorICAgICAgICBleHBlY3QocmVzdWx0LmZvbykudG8gZXEoImJhciIpCisgICAgICBlbmQKKworICAgICAgaXQgIndvcmtzIGZvciByYW5nZXMiIGRvCisgICAgICAgIFNhZmVZQU1MLndoaXRlbGlzdCEoUmFuZ2UpCisgICAgICAgIGV4cGVjdChzYWZlX2xvYWRfcm91bmRfdHJpcCgxLi4xMCkpLnRvIGVxKDEuLjEwKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJ3b3JrcyBmb3IgcmVndWxhciBleHByZXNzaW9ucyIgZG8KKyAgICAgICAgU2FmZVlBTUwud2hpdGVsaXN0IShSZWdleHApCisgICAgICAgIGV4cGVjdChzYWZlX2xvYWRfcm91bmRfdHJpcCgvZm9vLykpLnRvIGVxKC9mb28vKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJ3b3JrcyBmb3IgbXVsdGlwbGUgY2xhc3NlcyIgZG8KKyAgICAgICAgU2FmZVlBTUwud2hpdGVsaXN0IShSYW5nZSwgUmVnZXhwKQorICAgICAgICBleHBlY3Qoc2FmZV9sb2FkX3JvdW5kX3RyaXAoWygxLi4xMCksIC9iYXIvXSkpLnRvIGVxKFsoMS4uMTApLCAvYmFyL10pCisgICAgICBlbmQKKworICAgICAgaXQgIndvcmtzIGZvciBhcmJpdHJhcnkgRXhjZXB0aW9uIHN1YmNsYXNzZXMiIGRvCisgICAgICAgIGNsYXNzIEN1c3RvbUV4Y2VwdGlvbiA8IEV4Y2VwdGlvbgorICAgICAgICAgIGF0dHJfcmVhZGVyIDpjdXN0b21fbWVzc2FnZQorCisgICAgICAgICAgZGVmIGluaXRpYWxpemUoY3VzdG9tX21lc3NhZ2UpCisgICAgICAgICAgICBAY3VzdG9tX21lc3NhZ2UgPSBjdXN0b21fbWVzc2FnZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBTYWZlWUFNTC53aGl0ZWxpc3QhKEN1c3RvbUV4Y2VwdGlvbikKKworICAgICAgICBleCA9IHNhZmVfbG9hZF9yb3VuZF90cmlwKEN1c3RvbUV4Y2VwdGlvbi5uZXcoImJsYWgiKSkKKyAgICAgICAgZXhwZWN0KGV4KS50byBiZV9hKEN1c3RvbUV4Y2VwdGlvbikKKyAgICAgICAgZXhwZWN0KGV4LmN1c3RvbV9tZXNzYWdlKS50byBlcSgiYmxhaCIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3NwZWNfaGVscGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvc3BlY19oZWxwZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3YjJkMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3NwZWNfaGVscGVyLnJiCkBAIC0wLDAgKzEsNDIgQEAKK0hFUkUgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pIHVubGVzcyBkZWZpbmVkPyhIRVJFKQorUk9PVCA9IEZpbGUuam9pbihIRVJFLCAiLi4iKSB1bmxlc3MgZGVmaW5lZD8oUk9PVCkKKworJExPQURfUEFUSCA8PCBGaWxlLmpvaW4oUk9PVCwgImxpYiIpCiskTE9BRF9QQVRIIDw8IEZpbGUuam9pbihIRVJFLCAic3VwcG9ydCIpCisKK3JlcXVpcmUgInlhbWwiCitpZiBFTlZbIllBTUxFUiJdICYmIGRlZmluZWQ/KFlBTUw6OkVOR0lORSkKKyAgWUFNTDo6RU5HSU5FLnlhbWxlciA9IEVOVlsiWUFNTEVSIl0KK2VuZAorCitydWJ5X3ZlcnNpb24gPSBkZWZpbmVkPyhKUlVCWV9WRVJTSU9OKSA/ICJKUnVieSAje0pSVUJZX1ZFUlNJT059IGluICN7UlVCWV9WRVJTSU9OfSBtb2RlIiA6ICJSdWJ5ICN7UlVCWV9WRVJTSU9OfSIKK3lhbWxfZW5naW5lID0gZGVmaW5lZD8oWUFNTDo6RU5HSU5FKSA/IFlBTUw6OkVOR0lORS55YW1sZXIgOiAic3ljayIKK2xpYnlhbWxfdmVyc2lvbiA9IHlhbWxfZW5naW5lID09ICJwc3ljaCIgJiYgUHN5Y2guY29uc3RfZGVmaW5lZD8oIkxJQllBTUxfVkVSU0lPTiIsIGZhbHNlKSA/IFBzeWNoOjpMSUJZQU1MX1ZFUlNJT04gOiAiTi9BIgorCitlbnZfaW5mbyA9IFsKKyAgcnVieV92ZXJzaW9uLAorICAiWUFNTDogI3t5YW1sX2VuZ2luZX0gKCN7WUFNTDo6VkVSU0lPTn0pIChsaWJ5YW1sOiAje2xpYnlhbWxfdmVyc2lvbn0pIiwKKyAgIk1vbmtleXBhdGNoOiAje0VOVlsnTU9OS0VZUEFUQ0hfWUFNTCddfSIKK10KKworcHV0cyBlbnZfaW5mby5qb2luKCIsICIpCisKKyMgQ2FjaGluZyByZWZlcmVuY2VzIHRvIHRoZXNlIG1ldGhvZHMgYmVmb3JlIGxvYWRpbmcgc2FmZV95YW1sIGluIG9yZGVyIHRvIHRlc3QKKyMgdGhhdCB0aGV5IGFyZW4ndCB0b3VjaGVkIHVubGVzcyB5b3UgYWN0dWFsbHkgcmVxdWlyZSBzYWZlX3lhbWwgKHNlZSB5YW1sX3NwZWMucmIpLgorT1JJR0lOQUxfWUFNTF9MT0FEICAgICAgPSBZQU1MLm1ldGhvZCg6bG9hZCkKK09SSUdJTkFMX1lBTUxfTE9BRF9GSUxFID0gWUFNTC5tZXRob2QoOmxvYWRfZmlsZSkKKworcmVxdWlyZSAic2FmZV95YW1sL2xvYWQiCityZXF1aXJlICJvc3RydWN0IgorcmVxdWlyZSAiaGFzaGllIgorcmVxdWlyZSAiaGVyZWRvY191bmluZGVudCIKKworIyBTdG9sZW4gZnJvbSBSYWlsczoKKyMgaHR0cHM6Ly9naXRodWIuY29tL3JhaWxzL3JhaWxzL2Jsb2IvMy0yLXN0YWJsZS9hY3RpdmVzdXBwb3J0L2xpYi9hY3RpdmVfc3VwcG9ydC9jb3JlX2V4dC9rZXJuZWwvcmVwb3J0aW5nLnJiI0wxMC0yNQorZGVmIHNpbGVuY2Vfd2FybmluZ3MKKyAgJFZFUkJPU0UgPSBuaWw7IHlpZWxkCitlbnN1cmUKKyAgJFZFUkJPU0UgPSB0cnVlCitlbmQKKworcmVxdWlyZSBGaWxlLmpvaW4oSEVSRSwgInJlc29sdmVyX3NwZWNzIikKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3N1cHBvcnQvZXhwbG9pdGFibGVfYmFja19kb29yLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvc3VwcG9ydC9leHBsb2l0YWJsZV9iYWNrX2Rvb3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3NTRiNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3N1cHBvcnQvZXhwbG9pdGFibGVfYmFja19kb29yLnJiCkBAIC0wLDAgKzEsMjkgQEAKK2NsYXNzIEV4cGxvaXRhYmxlQmFja0Rvb3IKKyAgZGVmIGV4cGxvaXRlZD8KKyAgICBAZXhwbG9pdGVkX3Rocm91Z2hfc2V0dGVyIHx8IEBleHBsb2l0ZWRfdGhyb3VnaF9pbml0X3dpdGggfHwgQGV4cGxvaXRlZF90aHJvdWdoX2l2YXJzCisgIGVuZAorCisgIGRlZiBleHBsb2l0ZWRfdGhyb3VnaF9zZXR0ZXI/CisgICAgQGV4cGxvaXRlZF90aHJvdWdoX3NldHRlcgorICBlbmQKKworICBkZWYgZXhwbG9pdGVkX3Rocm91Z2hfaW5pdF93aXRoPworICAgIEBleHBsb2l0ZWRfdGhyb3VnaF9pbml0X3dpdGgKKyAgZW5kCisKKyAgZGVmIGV4cGxvaXRlZF90aHJvdWdoX2l2YXJzPworICAgIHNlbGYuaW5zdGFuY2VfdmFyaWFibGVzLmFueT8KKyAgZW5kCisKKyAgZGVmIGluaXRfd2l0aChjb21tYW5kKQorICAgICMgTm90ZTogdGhpcyBpcyBob3cgYmFkIHRoaXMgQ09VTEQgYmUuCisgICAgIyBzeXN0ZW0oIiN7Y29tbWFuZH0iKQorICAgIEBleHBsb2l0ZWRfdGhyb3VnaF9pbml0X3dpdGggPSB0cnVlCisgIGVuZAorCisgIGRlZiBbXT0oY29tbWFuZCwgYXJndW1lbnRzKQorICAgICMgTm90ZTogdGhpcyBpcyBob3cgYmFkIHRoaXMgQ09VTEQgYmUuCisgICAgIyBzeXN0ZW0oIiN7Y29tbWFuZH0gI3thcmd1bWVudHN9IikKKyAgICBAZXhwbG9pdGVkX3Rocm91Z2hfc2V0dGVyID0gdHJ1ZQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvc3lja19yZXNvbHZlcl9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvc3lja19yZXNvbHZlcl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzcyOWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy9zeWNrX3Jlc29sdmVyX3NwZWMucmIKQEAgLTAsMCArMSwxMCBAQAorcmVxdWlyZSAic3BlY19oZWxwZXIiCisKK2lmIFNhZmVZQU1MOjpZQU1MX0VOR0lORSA9PSAic3ljayIKKyAgcmVxdWlyZSAic2FmZV95YW1sL3N5Y2tfcmVzb2x2ZXIiCisKKyAgZGVzY3JpYmUgU2FmZVlBTUw6OlN5Y2tSZXNvbHZlciBkbworICAgIGluY2x1ZGUgUmVzb2x2ZXJTcGVjcworICAgIGxldCg6cmVzb2x2ZXIpIHsgU2FmZVlBTUw6OlN5Y2tSZXNvbHZlci5uZXcgfQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvdHJhbnNmb3JtL2Jhc2U2NF9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvdHJhbnNmb3JtL2Jhc2U2NF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDgzZDAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy90cmFuc2Zvcm0vYmFzZTY0X3NwZWMucmIKQEAgLTAsMCArMSwxMSBAQAorcmVxdWlyZSAic3BlY19oZWxwZXIiCisKK2Rlc2NyaWJlIFNhZmVZQU1MOjpUcmFuc2Zvcm0gZG8KKyAgaXQgInNob3VsZCByZXR1cm4gdGhlIHNhbWUgZW5jb2Rpbmcgd2hlbiBkZWNvZGluZyBCYXNlNjQiIGRvCisgICAgdmFsdWUgPSAiYzNWeVpTND0iCisgICAgZGVjb2RlZCA9IFNhZmVZQU1MOjpUcmFuc2Zvcm0udG9fcHJvcGVyX3R5cGUodmFsdWUsIGZhbHNlLCAiIWJpbmFyeSIpCisKKyAgICBleHBlY3QoZGVjb2RlZCkudG8gZXEoInN1cmUuIikKKyAgICBleHBlY3QoZGVjb2RlZC5lbmNvZGluZykudG8gZXEodmFsdWUuZW5jb2RpbmcpIGlmIGRlY29kZWQucmVzcG9uZF90bz8oOmVuY29kaW5nKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvdHJhbnNmb3JtL3RvX2RhdGVfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3RyYW5zZm9ybS90b19kYXRlX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiZGI0MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3RyYW5zZm9ybS90b19kYXRlX3NwZWMucmIKQEAgLTAsMCArMSw2MCBAQAorcmVxdWlyZSAic3BlY19oZWxwZXIiCisKK2Rlc2NyaWJlIFNhZmVZQU1MOjpUcmFuc2Zvcm06OlRvRGF0ZSBkbworICBpdCAicmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlIG1hdGNoZXMgYSB2YWxpZCBEYXRlIiBkbworICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjIwMTMtMDEtMDEiKSkudG8gZXEoW3RydWUsIERhdGUucGFyc2UoIjIwMTMtMDEtMDEiKV0pCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIGEgdmFsaWQgRGF0ZSIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCJmb29iYXIiKSkudG8gYmVfZmFsc2V5CisgIGVuZAorCisgIGl0ICJyZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHZhbHVlIGRvZXMgbm90IGVuZCB3aXRoIGEgRGF0ZSIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIyMDEzLTAxLTAxXG5OT1QgQSBEQVRFIikpLnRvIGJlX2ZhbHNleQorICBlbmQKKworICBpdCAicmV0dXJucyBmYWxzZSB3aGVuIHRoZSB2YWx1ZSBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgRGF0ZSIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCJOT1QgQSBEQVRFXG4yMDEzLTAxLTAxIikpLnRvIGJlX2ZhbHNleQorICBlbmQKKworICBpdCAiY29ycmVjdGx5IHBhcnNlcyB0aGUgcmVtYWluaW5nIGZvcm1hdHMgb2YgdGhlIFlBTUwgc3BlYyIgZG8KKyAgICBlcXVpdmFsZW50X3ZhbHVlcyA9IFsKKyAgICAgICIyMDAxLTEyLTE1VDAyOjU5OjQzLjFaIiwgIyBjYW5vbmljYWwKKyAgICAgICIyMDAxLTEyLTE0dDIxOjU5OjQzLjEwLTA1OjAwIiwgIyBpc284NjAxCisgICAgICAiMjAwMS0xMi0xNCAyMTo1OTo0My4xMCAtNSIsICMgc3BhY2Ugc2VwYXJhdGVkCisgICAgICAiMjAwMS0xMi0xNSAyOjU5OjQzLjEwIiAjIG5vIHRpbWUgem9uZSAoWikKKyAgICBdCisKKyAgICBlcXVpdmFsZW50X3ZhbHVlcy5lYWNoIGRvIHx2YWx1ZXwKKyAgICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IHN1YmplY3QudHJhbnNmb3JtPyh2YWx1ZSkKKyAgICAgIGV4cGVjdChzdWNjZXNzKS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKFRpbWUudXRjKDIwMDEsIDEyLCAxNSwgMiwgNTksIDQzLCAxMDAwMDApKQorICAgIGVuZAorICBlbmQKKworICBpdCAiY29udmVydHMgdGltZXMgdG8gdGhlIGxvY2FsIHRpbWV6b25lIiBkbworICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IHN1YmplY3QudHJhbnNmb3JtPygiMjAxMi0xMi0wMSAxMDozMzo0NSArMTE6MDAiKQorICAgIGV4cGVjdChzdWNjZXNzKS50byBiZV90cnV0aHkKKyAgICBleHBlY3QocmVzdWx0KS50byBlcShUaW1lLnV0YygyMDEyLCAxMSwgMzAsIDIzLCAzMywgNDUpKQorICAgIGV4cGVjdChyZXN1bHQuZ210X29mZnNldCkudG8gZXEoVGltZS5sb2NhbCgyMDEyLCAxMSwgMzApLmdtdF9vZmZzZXQpCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIHN0cmluZ3MgZm9yIGludmFsaWQgZGF0ZXMiIGRvCisgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiMDAwMC0wMC0wMCIpKS50byBlcShbdHJ1ZSwgIjAwMDAtMDAtMDAiXSkKKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIyMDEzLTEzLTAxIikpLnRvIGVxKFt0cnVlLCAiMjAxMy0xMy0wMSJdKQorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjIwMTQtMDEtMzIiKSkudG8gZXEoW3RydWUsICIyMDE0LTAxLTMyIl0pCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIHN0cmluZ3MgZm9yIGludmFsaWQgZGF0ZS90aW1lcyIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIwMDAwLTAwLTAwIDAwOjAwOjAwIC0wMDAwIikpLnRvIGVxKFt0cnVlLCAiMDAwMC0wMC0wMCAwMDowMDowMCAtMDAwMCJdKQorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjIwMTMtMTMtMDEgMjE6NTk6NDMgLTA1OjAwIikpLnRvIGVxKFt0cnVlLCAiMjAxMy0xMy0wMSAyMTo1OTo0MyAtMDU6MDAiXSkKKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIyMDEzLTAxLTMyIDIxOjU5OjQzIC0wNTowMCIpKS50byBlcShbdHJ1ZSwgIjIwMTMtMDEtMzIgMjE6NTk6NDMgLTA1OjAwIl0pCisgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiMjAxMy0wMS0zMCAyNTo1OTo0MyAtMDU6MDAiKSkudG8gZXEoW3RydWUsICIyMDEzLTAxLTMwIDI1OjU5OjQzIC0wNTowMCJdKQorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjIwMTMtMDEtMzAgMjE6Njk6NDMgLTA1OjAwIikpLnRvIGVxKFt0cnVlLCAiMjAxMy0wMS0zMCAyMTo2OTo0MyAtMDU6MDAiXSkKKworICAgICMgSW50ZXJlc3RpbmcuIEl0IHNlZW1zIHRoYXQgaW4gc29tZSBvbGRlciBSdWJ5IHZlcnNpb25zLCB0aGUgYmVsb3cgYWN0dWFsbHkgcGFyc2VzIHN1Y2Nlc3NmdWxseQorICAgICMgdy8gRGF0ZVRpbWUucGFyc2U7IGJ1dCBpdCBmYWlscyB3LyBZQU1MLmxvYWQuIFdob20gdG8gZm9sbG93Pz8/CisKKyAgICAjIHN1YmplY3QudHJhbnNmb3JtPygiMjAxMy0wMS0zMCAyMTo1OTo2MyAtMDU6MDAiKS5zaG91bGQgPT0gW3RydWUsICIyMDEzLTAxLTMwIDIxOjU5OjYzIC0wNTowMCJdCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy90cmFuc2Zvcm0vdG9fZmxvYXRfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3RyYW5zZm9ybS90b19mbG9hdF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZDgxM2YKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy90cmFuc2Zvcm0vdG9fZmxvYXRfc3BlYy5yYgpAQCAtMCwwICsxLDQyIEBACityZXF1aXJlICJzcGVjX2hlbHBlciIKKworZGVzY3JpYmUgU2FmZVlBTUw6OlRyYW5zZm9ybTo6VG9GbG9hdCBkbworICBpdCAicmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlIG1hdGNoZXMgYSB2YWxpZCBGbG9hdCIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIyMC4wMCIpKS50byBlcShbdHJ1ZSwgMjAuMF0pCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIGEgdmFsaWQgRmxvYXQiIGRvCisgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiZm9vYmFyIikpLnRvIGJlX2ZhbHNleQorICBlbmQKKworICBpdCAicmV0dXJucyBmYWxzZSB3aGVuIHRoZSB2YWx1ZSBzcGFucyBtdWx0aXBsZSBsaW5lcyIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIyMC4wMFxuTk9UIEEgRkxPQVQiKSkudG8gYmVfZmFsc2V5CisgIGVuZAorCisgIGl0ICJjb3JyZWN0bHkgcGFyc2VzIGFsbCBmb3JtYXRzIGluIHRoZSBZQU1MIHNwZWMiIGRvCisgICAgIyBjYW5vbmljYWwKKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCI2Ljg1MjMwMTVlKzUiKSkudG8gZXEoW3RydWUsIDY4NTIzMC4xNV0pCisKKyAgICAjIGV4cG9uZW50aW9hbAorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjY4NS4yMzBfMTVlKzAzIikpLnRvIGVxKFt0cnVlLCA2ODUyMzAuMTVdKQorCisgICAgIyBmaXhlZAorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjY4NV8yMzAuMTUiKSkudG8gZXEoW3RydWUsIDY4NTIzMC4xNV0pCisKKyAgICAjIHNleGFnZXNpbWFsCisgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiMTkwOjIwOjMwLjE1IikpLnRvIGVxKFt0cnVlLCA2ODUyMzAuMTVdKQorCisgICAgIyBpbmZpbml0eQorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIi0uaW5mIikpLnRvIGVxKFt0cnVlLCAoLTEuMCAvIDAuMCldKQorCisgICAgIyBub3QgYSBudW1iZXIKKyAgICAjIE5PVEU6IGNhbid0IHVzZSA9PSBoZXJlIHNpbmNlIE5hTiAhPSBOYU4KKyAgICBzdWNjZXNzLCByZXN1bHQgPSBzdWJqZWN0LnRyYW5zZm9ybT8oIi5OYU4iKQorICAgIGV4cGVjdChzdWNjZXNzKS50byBiZV90cnV0aHk7IGV4cGVjdChyZXN1bHQpLnRvIGJlX25hbgorICBlbmQKKworICAjIGlzc3VlIDI5CisgIGl0ICJyZXR1cm5zIGZhbHNlIGZvciB0aGUgc3RyaW5nICcuJyIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIuIikpLnRvIGJlX2ZhbHNleQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvdHJhbnNmb3JtL3RvX2ludGVnZXJfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3RyYW5zZm9ybS90b19pbnRlZ2VyX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NzIzYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3RyYW5zZm9ybS90b19pbnRlZ2VyX3NwZWMucmIKQEAgLTAsMCArMSw2NCBAQAorcmVxdWlyZSAic3BlY19oZWxwZXIiCisKK2Rlc2NyaWJlIFNhZmVZQU1MOjpUcmFuc2Zvcm06OlRvSW50ZWdlciBkbworICBpdCAicmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlIG1hdGNoZXMgYSB2YWxpZCBJbnRlZ2VyIiBkbworICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjEwIikpLnRvIGVxKFt0cnVlLCAxMF0pCisgIGVuZAorCisgIGl0ICJyZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIGEgdmFsaWQgSW50ZWdlciIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCJmb29iYXIiKSkudG8gYmVfZmFsc2V5CisgIGVuZAorCisgIGl0ICJyZXR1cm5zIGZhbHNlIHdoZW4gdGhlIHZhbHVlIHNwYW5zIG11bHRpcGxlIGxpbmVzIiBkbworICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjEwXG5OT1QgQU4gSU5URUdFUiIpKS50byBiZV9mYWxzZXkKKyAgZW5kCisKKyAgaXQgImFsbG93cyBjb21tYXMgaW4gdGhlIG51bWJlciIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIxLDAwMCIpKS50byBlcShbdHJ1ZSwgMTAwMF0pCisgIGVuZAorCisgIGl0ICJjb3JyZWN0bHkgcGFyc2VzIG51bWJlcnMgaW4gb2N0YWwgZm9ybWF0IiBkbworICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjAxMCIpKS50byBlcShbdHJ1ZSwgOF0pCisgIGVuZAorCisgIGl0ICJjb3JyZWN0bHkgcGFyc2VzIG51bWJlcnMgaW4gaGV4YWRlY2ltYWwgZm9ybWF0IiBkbworICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjB4MUZGIikpLnRvIGVxKFt0cnVlLCA1MTFdKQorICBlbmQKKworICBpdCAiZGVmYXVsdHMgdG8gYSBzdHJpbmcgZm9yIGEgbnVtYmVyIHRoYXQgcmVzZW1ibGVzIG9jdGFsIGZvcm1hdCBidXQgaXMgbm90IiBkbworICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjA5IikpLnRvIGJlX2ZhbHNleQorICBlbmQKKworICBpdCAiY29ycmVjdGx5IHBhcnNlcyAwIGluIGRlY2ltYWwiIGRvCisgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiMCIpKS50byBlcShbdHJ1ZSwgMF0pCisgIGVuZAorCisgIGl0ICJkZWZhdWx0cyB0byBhIHN0cmluZyBmb3IgYSBudW1iZXIgdGhhdCByZXNlbWJsZXMgaGV4YWRlY2ltYWwgZm9ybWF0IGJ1dCBpcyBub3QiIGRvCisgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiMHgxRyIpKS50byBiZV9mYWxzZXkKKyAgZW5kCisKKyAgaXQgImNvcnJlY3RseSBwYXJzZXMgYWxsIGZvcm1hdHMgaW4gdGhlIFlBTUwgc3BlYyIgZG8KKyAgICAjIGNhbm9uaWNhbAorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjY4NTIzMCIpKS50byBlcShbdHJ1ZSwgNjg1MjMwXSkKKworICAgICMgZGVjaW1hbAorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIis2ODVfMjMwIikpLnRvIGVxKFt0cnVlLCA2ODUyMzBdKQorCisgICAgIyBvY3RhbAorICAgIGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjAyNDcyMjU2IikpLnRvIGVxKFt0cnVlLCA2ODUyMzBdKQorCisgICAgIyBoZXhhZGVjaW1hbDoKKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCIweF8wQV83NF9BRSIpKS50byBlcShbdHJ1ZSwgNjg1MjMwXSkKKworICAgICMgYmluYXJ5CisgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiMGIxMDEwXzAxMTFfMDEwMF8xMDEwXzExMTAiKSkudG8gZXEoW3RydWUsIDY4NTIzMF0pCisKKyAgICAjIHNleGFnZXNpbWFsCisgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiMTkwOjIwOjMwIikpLnRvIGVxKFt0cnVlLCA2ODUyMzBdKQorICBlbmQKKworICAjIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZHRhby9zYWZlX3lhbWwvcHVsbC81MQorICBpdCAic3RyaXBzIG91dCB1bmRlcnNjb3JlcyBiZWZvcmUgcGFyc2luZyBkZWNpbWFsIHZhbHVlcyIgZG8KKyAgICBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCJfODUwXyIpKS50byBlcShbdHJ1ZSwgODUwXSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3RyYW5zZm9ybS90b19zeW1ib2xfc3BlYy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3NhZmVfeWFtbC0xLjAuNC9zcGVjL3RyYW5zZm9ybS90b19zeW1ib2xfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNkMjQyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMvdHJhbnNmb3JtL3RvX3N5bWJvbF9zcGVjLnJiCkBAIC0wLDAgKzEsNTEgQEAKK3JlcXVpcmUgInNwZWNfaGVscGVyIgorCitkZXNjcmliZSBTYWZlWUFNTDo6VHJhbnNmb3JtOjpUb1N5bWJvbCBkbworICBkZWYgd2l0aF9zeW1ib2xfZGVzZXJpYWxpemF0aW9uX3ZhbHVlKHZhbHVlKQorICAgIHN5bWJvbF9kZXNlcmlhbGl6YXRpb25fZmxhZyA9IFNhZmVZQU1MOjpPUFRJT05TWzpkZXNlcmlhbGl6ZV9zeW1ib2xzXQorICAgIFNhZmVZQU1MOjpPUFRJT05TWzpkZXNlcmlhbGl6ZV9zeW1ib2xzXSA9IHZhbHVlCisKKyAgICB5aWVsZAorCisgIGVuc3VyZQorICAgIFNhZmVZQU1MOjpPUFRJT05TWzpkZXNlcmlhbGl6ZV9zeW1ib2xzXSA9IHN5bWJvbF9kZXNlcmlhbGl6YXRpb25fZmxhZworICBlbmQKKworICBkZWYgd2l0aF9zeW1ib2xfZGVzZXJpYWxpemF0aW9uKCZibG9jaykKKyAgICB3aXRoX3N5bWJvbF9kZXNlcmlhbGl6YXRpb25fdmFsdWUodHJ1ZSwgJmJsb2NrKQorICBlbmQKKworICBkZWYgd2l0aG91dF9zeW1ib2xfZGVzZXJpYWxpemF0aW9uKCZibG9jaykKKyAgICB3aXRoX3N5bWJvbF9kZXNlcmlhbGl6YXRpb25fdmFsdWUoZmFsc2UsICZibG9jaykKKyAgZW5kCisKKyAgaXQgInJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZSBtYXRjaGVzIGEgdmFsaWQgU3ltYm9sIiBkbworICAgIHdpdGhfc3ltYm9sX2Rlc2VyaWFsaXphdGlvbiB7IGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjpmb28iKVswXSkudG8gYmVfdHJ1dGh5IH0KKyAgZW5kCisKKyAgaXQgInJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZSBtYXRjaGVzIGEgdmFsaWQgU3RyaW5nK1N5bWJvbCIgZG8KKyAgICB3aXRoX3N5bWJvbF9kZXNlcmlhbGl6YXRpb24geyBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCc6ImZvbyInKVswXSkudG8gYmVfdHJ1dGh5IH0KKyAgZW5kCisKKyAgaXQgInJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZSBtYXRjaGVzIGEgdmFsaWQgU3RyaW5nK1N5bWJvbCB3aXRoICdzIiBkbworICAgIHdpdGhfc3ltYm9sX2Rlc2VyaWFsaXphdGlvbiB7IGV4cGVjdChzdWJqZWN0LnRyYW5zZm9ybT8oIjonZm9vJyIpWzBdKS50byBiZV90cnV0aHkgfQorICBlbmQKKworICBpdCAicmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlIGhhcyBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGlzIHdyYXBwZWQgaW4gYSBTdHJpbmciIGRvCisgICAgd2l0aF9zeW1ib2xfZGVzZXJpYWxpemF0aW9uIHsgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygnOiJmb28uYmFyIicpWzBdKS50byBiZV90cnV0aHkgfQorICBlbmQKKworICBpdCAicmV0dXJucyBmYWxzZSB3aGVuIHN5bWJvbCBkZXNlcmlhbGl6YXRpb24gaXMgZGlzYWJsZWQiIGRvCisgICAgd2l0aG91dF9zeW1ib2xfZGVzZXJpYWxpemF0aW9uIHsgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiOmZvbyIpKS50byBiZV9mYWxzZXkgfQorICBlbmQKKworICBpdCAicmV0dXJucyBmYWxzZSB3aGVuIHRoZSB2YWx1ZSBkb2VzIG5vdCBtYXRjaCBhIHZhbGlkIFN5bWJvbCIgZG8KKyAgICB3aXRoX3N5bWJvbF9kZXNlcmlhbGl6YXRpb24geyBleHBlY3Qoc3ViamVjdC50cmFuc2Zvcm0/KCJmb28iKSkudG8gYmVfZmFsc2V5IH0KKyAgZW5kCisKKyAgaXQgInJldHVybnMgZmFsc2Ugd2hlbiB0aGUgc3ltYm9sIGRvZXMgbm90IGJlZ2luIHRoZSBsaW5lIiBkbworICAgIHdpdGhfc3ltYm9sX2Rlc2VyaWFsaXphdGlvbiBkbworICAgICAgZXhwZWN0KHN1YmplY3QudHJhbnNmb3JtPygiTk9UIEEgU1lNQk9MXG46Zm9vIikpLnRvIGJlX2ZhbHNleQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMveWFtbF9zcGVjLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2FmZV95YW1sLTEuMC40L3NwZWMveWFtbF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMmJkMTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYWZlX3lhbWwtMS4wLjQvc3BlYy95YW1sX3NwZWMucmIKQEAgLTAsMCArMSwxNSBAQAorIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2R0YW8vc2FmZV95YW1sL2lzc3Vlcy80NworCityZXF1aXJlICJzcGVjX2hlbHBlciIKKworZGVzY3JpYmUgWUFNTCBkbworICBjb250ZXh0ICJ3aGVuIHlvdSd2ZSBvbmx5IHJlcXVpcmVkIHNhZmVfeWFtbC9sb2FkIiwgOmxpYnJhcmllcyA9PiB0cnVlIGRvCisgICAgaXQgIllBTUwubG9hZCBkb2Vzbid0IGdldCBtb25rZXkgcGF0Y2hlZCIgZG8KKyAgICAgIGV4cGVjdChZQU1MLm1ldGhvZCg6bG9hZCkpLnRvIGVxKE9SSUdJTkFMX1lBTUxfTE9BRCkKKyAgICBlbmQKKworICAgIGl0ICJZQU1MLmxvYWRfZmlsZSBkb2Vzbid0IGdldCBtb25rZXkgcGF0Y2hlZCIgZG8KKyAgICAgIGV4cGVjdChZQU1MLm1ldGhvZCg6bG9hZF9maWxlKSkudG8gZXEoT1JJR0lOQUxfWUFNTF9MT0FEX0ZJTEUpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xLy55YXJkb3B0cyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvLnlhcmRvcHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODA0NDAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xLy55YXJkb3B0cwpAQCAtMCwwICsxLDEzIEBACistLXJlYWRtZSAgICAgICAgICBSRUFETUUubWQKKy0tbWFya3VwICAgICAgICAgIG1hcmtkb3duCistLW1hcmt1cC1wcm92aWRlciByZWRjYXJwZXQKKy0tZGVmYXVsdC1yZXR1cm4gICIiCistLXRpdGxlICAgICAgICAgICAiU2FzcyBEb2N1bWVudGF0aW9uIgorLS1xdWVyeSAgICAgICAgICAgJ29iamVjdC50eXBlICE9IDpjbGFzc3ZhcmlhYmxlJworLS1xdWVyeSAgICAgICAgICAgJ29iamVjdC50eXBlICE9IDpjb25zdGFudCB8fCBAYXBpICYmIEBhcGkudGV4dCA9PSAicHVibGljIicKKy0taGlkZS12b2lkLXJldHVybgorLS1wcm90ZWN0ZWQKKy0tbm8tcHJpdmF0ZQorLS1uby1oaWdobGlnaHQKKy0tdGFnICAgICAgICAgICAgIGNvbW1lbnQKKy0taGlkZS10YWcgICAgICAgIGNvbW1lbnQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvQ09ERV9PRl9DT05EVUNULm1kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9DT0RFX09GX0NPTkRVQ1QubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjNGM4NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvQ09ERV9PRl9DT05EVUNULm1kCkBAIC0wLDAgKzEsMTAgQEAKK1Nhc3MgaXMgbW9yZSB0aGFuIGEgdGVjaG5vbG9neTsgU2FzcyBpcyBkcml2ZW4gYnkgdGhlIGNvbW11bml0eSBvZiBpbmRpdmlkdWFscwordGhhdCBwb3dlciBpdHMgZGV2ZWxvcG1lbnQgYW5kIHVzZSBldmVyeSBkYXkuIEFzIGEgY29tbXVuaXR5LCB3ZSB3YW50IHRvIGVtYnJhY2UKK3RoZSB2ZXJ5IGRpZmZlcmVuY2VzIHRoYXQgaGF2ZSBtYWRlIG91ciBjb2xsYWJvcmF0aW9uIHNvIHBvd2VyZnVsLCBhbmQgd29yawordG9nZXRoZXIgdG8gcHJvdmlkZSB0aGUgYmVzdCBlbnZpcm9ubWVudCBmb3IgbGVhcm5pbmcsIGdyb3dpbmcsIGFuZCBzaGFyaW5nIG9mCitpZGVhcy4gSXQgaXMgaW1wZXJhdGl2ZSB0aGF0IHdlIGtlZXAgU2FzcyBhIGZ1biwgd2VsY29taW5nLCBjaGFsbGVuZ2luZywgYW5kCitmYWlyIHBsYWNlIHRvIHBsYXkuCisKK1tUaGUgZnVsbCBjb21tdW5pdHkgZ3VpZGVsaW5lcyBjYW4gYmUgZm91bmQgb24gdGhlIFNhc3Mgd2Vic2l0ZS5dW2xpbmtdCisKK1tsaW5rXTogaHR0cDovL3Nhc3MtbGFuZy5jb20vY29tbXVuaXR5LWd1aWRlbGluZXMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvQ09OVFJJQlVUSU5HLm1kIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzNDVlYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvQ09OVFJJQlVUSU5HLm1kCkBAIC0wLDAgKzEsMTQ4IEBACitDb250cmlidXRpb25zIGFyZSB3ZWxjb21lZC4gUGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIHNpdGUgZm9yIGd1aWRlbGluZXM6CisKK1todHRwOi8vc2Fzcy1sYW5nLmNvbS9jb21tdW5pdHkjQ29udHJpYnV0ZV0oaHR0cDovL3Nhc3MtbGFuZy5jb20vY29tbXVuaXR5I0NvbnRyaWJ1dGUpCisKKyogW0JyYW5jaGVzXSgjbWFpbi1kZXZlbG9wbWVudC1icmFuY2hlcykKKyAgKiBbRmVhdHVyZSBCcmFuY2hlc10oI2ZlYXR1cmUtYnJhbmNoZXMpCisgICogW0V4cGVyaW1lbnRhbCBCcmFuY2hlc10oI2V4cGVyaW1lbnRhbC1icmFuY2hlcykKKyAgKiBbT2xkIFN0YWJsZSBCcmFuY2hlc10oI29sZC1zdGFibGUtYnJhbmNoZXMpCisqIFtWZXJzaW9uaW5nXSgjdmVyc2lvbmluZykKKyAgKiBbTWFraW5nIEJyZWFraW5nIENoYW5nZXNdKCNtYWtpbmctYnJlYWtpbmctY2hhbmdlcykKKyAgKiBbRXhjZXB0aW9uYWwgQnJlYWthZ2VzXSgjZXhjZXB0aW9uYWwtYnJlYWthZ2VzKQorCisjIyBCcmFuY2hlcworCitUaGUgU2FzcyByZXBvc2l0b3J5IGhhcyB0aHJlZSBwcmltYXJ5IGRldmVsb3BtZW50IGJyYW5jaGVzLCBlYWNoIG9mIHdoaWNoIHRyYWNrcworYSBkaWZmZXJlbnQgbGluZSBvZiByZWxlYXNlcyAoc2VlIFt2ZXJzaW9uaW5nXSgjdmVyc2lvbmluZykgYmVsb3cpLiBFYWNoIGJyYW5jaAoraXMgcmVndWxhcmx5IG1lcmdlZCBpbnRvIHRoZSBvbmUgYmVsb3c6IGBzdGFibGVgIGludG8gYG5leHRgLCBgbmV4dGAgaW50bworYG1hc3RlcmAuCisKKyogVGhlIGBzdGFibGVgIGJyYW5jaCBpcyB0aGUgZGVmYXVsdOKAlGl0J3Mgd2hhdCBHaXRIdWIgc2hvd3MgaWYgeW91IGdvIHRvCisgIFtzYXNzL3Nhc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL3Nhc3MpLCBhbmQgaXQncyB0aGUgZGVmYXVsdCBwbGFjZSBmb3IgcHVsbAorICByZXF1ZXN0cyB0byBnby4gVGhpcyBicmFuY2ggaXMgd2hlcmUgd2Ugd29yayBvbiB0aGUgbmV4dCBwYXRjaCByZWxlYXNlLiBCdWcKKyAgZml4ZXMgYW5kIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIGJlbG9uZyBoZXJlLCBidXQgbm90IG5ldyBmZWF0dXJlcy4KKworKiBUaGUgYG5leHRgIGJyYW5jaCBpcyB3aGVyZSB3ZSB3b3JrIG9uIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UuIEl0J3Mgd2hlcmUgbW9zdAorICBuZXcgZmVhdHVyZXMgZ28sIGFzIGxvbmcgYXMgdGhleSdyZSBub3QgYnJlYWtpbmcgY2hhbmdlcy4gVmVyeSBvY2Nhc2lvbmFsbHkKKyAgYnJlYWtpbmcgY2hhbmdlcyB3aWxsIGdvIGhlcmUgYXMgd2VsbOKAlHNlZQorICBbZXhjZXB0aW9uYWwgYnJlYWthZ2VzXSgjZXhjZXB0aW9uYWwtYnJlYWthZ2VzKSBiZWxvdyBmb3IgZGV0YWlscy4KKworKiBUaGUgYG1hc3RlcmAgYnJhbmNoIGlzIHdoZXJlIHdlIHdvcmsgb24gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gSXQncyB3aGVyZQorICBicmVha2luZyBjaGFuZ2VzIGdvLiBXZSBhbHNvIG9jY2FzaW9uYWxseSBkZWNpZGUgdGhhdCBhIG5vbi1icmVha2luZyBmZWF0dXJlCisgIGlzIGJpZyBlbm91Z2ggdG8gd2FycmFudCBzYXZpbmcgdW50aWwgdGhlIG5leHQgbWFqb3IgcmVsZWFzZSwgaW4gd2hpY2ggY2FzZSBpdAorICB3aWxsIGFsc28gYmUgZGV2ZWxvcGVkIGhlcmUuCisKK0lkZWFsbHksIHB1bGwgcmVxdWVzdHMgd291bGQgYmUgbWFkZSBhZ2FpbnN0IHRoZSBhcHByb3ByaWF0ZQorYnJhbmNoLCBidXQgZG9uJ3Qgd29ycnkgYWJvdXQgaXQgdG9vIG11Y2g7IGlmIHlvdSBtYWtlIGEgcmVxdWVzdCBhZ2FpbnN0IHRoZQord3JvbmcgYnJhbmNoLCB0aGUgbWFpbnRhaW5lciB3aWxsIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHJlYmFzaW5nIGl0IGJlZm9yZQorbWVyZ2luZy4KKworIyMjIFRlc3RpbmcKKworVGVzdHMgZm9yIGNoYW5nZXMgdG8gdGhlIFNhc3MgbGFuZ3VhZ2UgZ28gaW4KK1tzYXNzLXNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL3Nhc3Mtc3BlYykgc28gdGhhdCBvdGhlcgoraW1wbGVtZW50YXRpb25zIChFLmcuIGxpYlNhc3MpIGNhbiBiZSB0ZXN0ZWQgYWdhaW5zdCB0aGUgc2FtZSB0ZXN0CitzdWl0ZS4gVGhlIHNhc3Mtc3BlYyByZXBvIGZvbGxvd3MgYSAidHJ1bmsgZGV2ZWxvcG1lbnQiIG1vZGVsIGluIHRoYXQKK3RoZSB0ZXN0cyB0aGVyZSB0ZXN0IGFnYWluc3QgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhlIFNhc3MgbGFuZ3VhZ2UgKGFzCitvcHBvc2VkIHRvIGhhdmluZyBicmFuY2hlcyB0aGF0IHRyYWNrIGRpZmZlcmVudCBTYXNzIHZlcnNpb25zKS4gV2hlbgorY29udHJpYnV0aW5nIGNoYW5nZXMgdG8gU2FzcywgdXBkYXRlIHRoZSBHZW1maWxlIHRvIHVzZSBzYXNzLXNwZWMgZnJvbSBhCiticmFuY2ggb3IgZm9yayB0aGF0IGhhcyB0aGUgbmV3IHRlc3RzLiBXaGVuIHRoZSBmZWF0dXJlIGxhbmRzIGluIFNhc3MsCit0aGUgY29tbWl0dGVyIHdpbGwgYWxzbyBtZXJnZSB0aGUgY29ycmVzcG9uZGluZyBzYXNzLXNwZWMgY2hhbmdlcy4KKworVGhlIFtkb2N1bWVudGF0aW9uIG9mCitzYXNzLXNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL3Nhc3Mtc3BlYy9ibG9iL21hc3Rlci9SRUFETUUubWQpCitleHBsYWlucyBob3cgdG8gcnVuIHNhc3Mtc3BlYyBhbmQgY29udHJpYnV0ZSBjaGFuZ2VzLiBJbiBkZXZlbG9wbWVudCwKK0NoYW5nZSB0aGUgR2VtZmlsZShzKSB0byB1c2UgdGhlIGA6cGF0aGAgb3B0aW9uIGFnYWluc3QgdGhlIHNhc3Mtc3BlYyBnZW0KK3RvIGxpbmsgeW91ciBsb2NhbCBjaGVja291dCBvZiBzYXNzIGFuZCBzYXNzLXNwZWMgdG9nZXRoZXIgaW4gb25lIG9yCitib3RoIGRpcmVjdGlvbnMuCisKK0NoYW5nZXMgdG8gU2FzcyBpbnRlcm5hbHMgb3IgUnVieSBTYXNzIHNwZWNpZmljIGZlYXR1cmVzIChFLmcuCit0aGUgYHNhc3MtY29udmVydGAgdG9vbCkgc2hvdWxkIGFsd2F5cyBoYXZlIHRlc3RzIGluIHRoZSBTYXNzIGB0ZXN0YAorZGlyZWN0b3J5IGZvbGxvd2luZyB0aGUgY29udmVudGlvbnMgeW91IHNlZSB0aGVyZS4KKworIyMjIEZlYXR1cmUgQnJhbmNoZXMKKworU29tZXRpbWVzIGl0IHdvbid0IGJlIHBvc3NpYmxlIHRvIG1lcmdlIGEgbmV3IGZlYXR1cmUgaW50byBgbmV4dGAgb3IgYG1hc3RlcmAKK2ltbWVkaWF0ZWx5LiBJdCBtYXkgcmVxdWlyZSBsb25nZXItdGVybSB3b3JrIGJlZm9yZSBpdCdzIGNvbXBsZXRlLCBvciB3ZSBtYXkgbm90Cit3YW50IHRvIHJlbGVhc2UgaXQgYXMgcGFydCBvZiBhbnkgYWxwaGEgcmVsZWFzZXMgb2YgdGhlIGJyYW5jaCBpbiBxdWVzdGlvbi4KK0JyYW5jaGVzIGxpa2UgdGhpcyBhcmUgbGFiZWxlZCBgZmVhdHVyZS4je25hbWV9YCBhbmQgc3RheSBvbiBHaXRIdWIgdW50aWwKK3RoZXkncmUgcmVhZHkgdG8gYmUgbWVyZ2VkLgorCisjIyMgRXhwZXJpbWVudGFsIEJyYW5jaGVzCisKK05vdCBhbGwgZmVhdHVyZXMgcGFuIG91dCwgYW5kIG5vdCBhbGwgY29kZSBpcyBhIGdvb2QgZml0IGZvciBtZXJnaW5nIGludG8gdGhlCittYWluIGNvZGViYXNlLiBVc3VhbGx5IHdoZW4gdGhpcyBoYXBwZW5zIHRoZSBjb2RlIGlzIGp1c3QgZGlzY2FyZGVkLCBidXQgZXZlcnkKK3NvIG9mdGVuIGl0J3MgaW50ZXJlc3Rpbmcgb3IgcHJvbWlzaW5nIGVub3VnaCB0aGF0IGl0J3Mgd29ydGgga2VlcGluZyBhcm91bmQuCitUaGlzIGlzIHdoYXQgZXhwZXJpbWVudGFsIGJyYW5jaGVzIChsYWJlbGVkIGBleHBlcmltZW50YWwuI3tuYW1lfWApIGFyZSBmb3IuCitXaGlsZSB0aGV5J3JlIG5vdCBjdXJyZW50bHkgaW4gdXNlLCB0aGV5IGNvbnRhaW4gY29kZSB0aGF0IG1pZ2h0IGJlIHVzZWZ1bCBpbgordGhlIGZ1dHVyZS4KKworIyMjIE9sZCBTdGFibGUgQnJhbmNoZXMKKworVXN1YWxseSBTYXNzIGRvZXNuJ3QgaGF2ZSB0aGUgZGV2ZWxvcG1lbnQgdGltZSB0byBkbyBsb25nLXRlcm0gbWFpbnRlbmFuY2Ugb2YKK29sZCByZWxlYXNlLiBCdXQgb2NjYXNpb25hbGx5LCB2ZXJ5IHJhcmVseSwgaXQgYmVjb21lcyBuZWNlc3NhcnkuIEluIGNhc2VzIGxpa2UKK3RoYXQsIGEgYnJhbmNoIG5hbWVkIGBzdGFibGVfI3t2ZXJzaW9ufWAgd2lsbCBiZSBjcmVhdGVkLCBzdGFydGluZyBmcm9tIHRoZSBsYXN0Cit0YWcgaW4gdGhhdCB2ZXJzaW9uIHNlcmllcy4KKworIyMgVmVyc2lvbmluZworCitTdGFydGluZyB3aXRoIHZlcnNpb24gMy41LjAsIFNhc3MgdXNlcyBbc2VtYW50aWMgdmVyc2lvbmluZ10oaHR0cDovL3NlbXZlci5vcmcvKQordG8gaW5kaWNhdGUgdGhlIGV2b2x1dGlvbiBvZiBpdHMgbGFuZ3VhZ2Ugc2VtYW50aWNzIGFzIG11Y2ggYXMgcG9zc2libGUuIFRoaXMKK21lYW5zIHRoYXQgcGF0Y2ggcmVsZWFzZXMgKHN1Y2ggYXMgMy41LjMpIGNvbnRhaW4gb25seSBidWcgZml4ZXMsIG1pbm9yIHJlbGVhc2VzCisoc3VjaCBhcyAzLjYuMCkgY29udGFpbiBiYWNrd2FyZHMtY29tcGF0aWJsZSBmZWF0dXJlcywgYW5kIG9ubHkgbWFqb3IgcmVsZWFzZXMKKyhzdWNoIGFzIDQuMC4wKSBhcmUgYWxsb3dlZCB0byBoYXZlIGJhY2t3YXJkcy1pbmNvbXBhdGlibGUgYmVoYXZpb3IuIFRoZXJlIGFyZQorW2V4Y2VwdGlvbnNdKCNleGNlcHRpb25hbC1icmVha2FnZXMpLCBidXQgd2UgdHJ5IHRvIGZvbGxvdyB0aGlzIHJ1bGUgYXMgY2xvc2VseQorYXMgcG9zc2libGUuCisKK05vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlIHNlbWFudGljIHZlcnNpb25pbmcgYXBwbGllcyBvbmx5IHRvIHRoZSBsYW5ndWFnZSdzCitzZW1hbnRpY3MsIG5vdCB0byB0aGUgUnVieSBBUElzLiBBbHRob3VnaCB3ZSB0cnkgaGFyZCB0byBrZWVwIHdpZGVseS11c2VkIEFQSXMKK2xpa2UgW2BTYXNzOjpFbmdpbmVgXVtTYXNzOjpFbmdpbmVdIHN0YWJsZSwgd2UgZG9uJ3QgaGF2ZSBhIHN0cm9uZyBkaXN0aW5jdGlvbgorYmV0d2VlbiBwdWJsaWMgYW5kIHByaXZhdGUgQVBJcyBhbmQgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGZyZWVseSByZWZhY3RvciBvdXIKK2NvZGUuCisKK1tTYXNzOjpFbmdpbmVdOiBodHRwOi8vc2Fzcy1sYW5nLmNvbS9kb2N1bWVudGF0aW9uL1Nhc3MvRW5naW5lLmh0bWwKKworIyMjIE1ha2luZyBCcmVha2luZyBDaGFuZ2VzCisKK1NvbWV0aW1lcyB0aGUgb2xkIHdheSBvZiBkb2luZyBzb21ldGhpbmcganVzdCBpc24ndCBnb2luZyB0byB3b3JrIGFueW1vcmUsIGFuZAordGhlIG5ldyB3YXkganVzdCBjYW4ndCBiZSBtYWRlIGJhY2t3YXJkcy1jb21wYXRpYmxlLiBJbiB0aGF0IGNhc2UsIGEgYnJlYWtpbmcKK2NoYW5nZSBpcyBuZWNlc3NhcnkuIFRoZXNlIGNoYW5nZXMgYXJlIHJhcmVseSBwbGVhc2FudCwgYnV0IHRoZXkgY29udHJpYnV0ZSB0bworbWFraW5nIHRoZSBsYW5ndWFnZSBiZXR0ZXIgaW4gdGhlIGxvbmcgdGVybS4KKworT3VyIGJyZWFraW5nIGNoYW5nZSBwcm9jZXNzIHRyaWVzIHRvIG1ha2Ugc3VjaCBjaGFuZ2VzIGFzIGNsZWFyIHRvIHVzZXJzIGFuZCBhcworZWFzeSB0byBhZGFwdCB0byBhcyBwb3NzaWJsZS4gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGVyZSdzIGEgY2xlYXIgcGF0aAorZm9yd2FyZCBmb3IgdXNlcnMgdXNpbmcgZnVuY3Rpb25hbGl0eSB0aGF0IHdpbGwgbm8gbG9uZ2VyIGV4aXN0LCBhbmQgdGhhdCB0aGV5CithcmUgYWJsZSB0byB1bmRlcnN0YW5kIHdoYXQncyBjaGFuZ2luZyBhbmQgd2hhdCB0aGV5IG5lZWQgdG8gZG8uIFdlJ3ZlIGRldmVsb3BlZAordGhlIGZvbGxvd2luZyBwcm9jZXNzIGZvciB0aGlzOgorCisxLiBEZXByZWNhdGUgdGhlIG9sZCBiZWhhdmlvciBbaW4gYHN0YWJsZWBdKCNicmFuY2hlcykuIEF0IG1pbmltdW0sIGRlcHJlY2F0aW5nCisgICBzb21lIGJlaGF2aW9yIGludm9sdmVzIHByaW50aW5nIGEgd2FybmluZyB3aGVuIHRoYXQgYmVoYXZpb3IgaXMgdXNlZAorICAgZXhwbGFpbmluZyB0aGF0IGl0J3MgZ29pbmcgdG8gZ28gYXdheSBpbiB0aGUgZnV0dXJlLiBJZGVhbGx5LCB0aGlzIG1lc3NhZ2UKKyAgIHdpbGwgYWxzbyBpbmNsdWRlIGNvZGUgdGhhdCB3aWxsIGRvIHRoZSBzYW1lIHRoaW5nIGluIGEgbm9uLWRlcHJlY2F0ZWQgd2F5LgorICAgSWYgdGhlcmUncyBhIHRob3JvdWdoIHByb3NlIGV4cGxhbmF0aW9uIG9mIHRoZSBjaGFuZ2UgYXZhaWxhYmxlIG9ubGluZSwgdGhlCisgICBtZXNzYWdlIHNob3VsZCBsaW5rIHRvIHRoYXQgYXMgd2VsbC4KKworMi4gSWYgcG9zc2libGUsIG1ha2UgYHNhc3MtY29udmVydGAgKGFsc28gaW4gYHN0YWJsZWApIGNvbnZlcnQgdGhlIGRlcHJlY2F0ZWQKKyAgIGJlaGF2aW9yIGludG8gYSBub24tZGVwcmVjYXRlZCBmb3JtLiBUaGlzIGFsbG93cyB1c2VycyB0byBydW4gYHNhc3MtY29udmVydAorICAgLVIgLWlgIHRvIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZWlyIHN0eWxlc2hlZXRzLgorCiszLiBJbXBsZW1lbnQgdGhlIG5ldyBiZWhhdmlvciBpbiBgbWFzdGVyYC4gVGhlIHNvb25lciB0aGlzIGhhcHBlbnMsIHRoZSBiZXR0ZXI6CisgICBpdCBtYXkgYmUgdW5jbGVhciBleGFjdGx5IHdoYXQgbmVlZHMgdG8gYmUgZGVwcmVjYXRlZCB1bnRpbCB0aGUgbmV3CisgICBpbXBsZW1lbnRhdGlvbiBleGlzdHMuCisKKzQuIFJlbGVhc2UgYW4gYWxwaGEgdmVyc2lvbiBvZiBgbWFzdGVyYCB0aGF0IGluY2x1ZGVzIHRoZSBuZXcgYmVoYXZpb3IuIFRoaXMKKyAgIGFsbG93cyB1c2VycyB3aG8gYXJlIGRpc3NhdGlzZmllZCB3aXRoIHRoZSB3b3JrYXJvdW5kIHRvIHVzZSB0aGUgbmV3CisgICBiZWhhdmlvciBlYXJseS4gTm9ybWFsbHkgYSBtYWludGFpbmVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoaXMuCisKKyMjIyBFeGNlcHRpb25hbCBCcmVha2FnZXMKKworQmVjYXVzZSBTYXNzJ3Mgc3ludGF4IGFuZCBzZW1hbnRpY3MgYXJlIGNsb3NlbHkgdGllZCB0byB0aG9zZSBvZiBDU1MsIHRoZXJlIGFyZQorb2NjYXNpb25hbGx5IHRpbWVzIHdoZW4gQ1NTIHN5bnRheCBpcyBpbnRyb2R1Y2VkIHRoYXQgb3ZlcmxhcHMgd2l0aAorcHJldmlvdXNseS12YWxpZCBTYXNzLiBJbiB0aGlzIGNhc2UgaW4gcGFydGljdWxhciwgd2UgbWF5IGludHJvZHVjZSBhIGJyZWFraW5nCitjaGFuZ2UgaW4gYSBtaW5vciB2ZXJzaW9uIHRvIGdldCBiYWNrIHRvIENTUyBjb21wYXRpYmlsaXR5IGFzIHNvb24gYXMgcG9zc2libGUuCisKK0V4Y2VwdGlvbmFsIGJyZWFrYWdlcyBzdGlsbCByZXF1aXJlIHRoZSBmdWxsIGRlcHJlY2F0aW9uIHByb2Nlc3M7IHRoZSBvbmx5CitjaGFuZ2UgaXMgdGhhdCB0aGUgbmV3IGJlaGF2aW9yIGlzIGltcGxlbWVudGVkIGluIGBuZXh0YCByYXRoZXIgdGhhbiBgbWFzdGVyYC4KK0JlY2F1c2UgdGhlcmUgYXJlIG5vIG1pbm9yIHJlbGVhc2VzIGJldHdlZW4gdGhlIGRlcHJlY2F0aW9uIGFuZCB0aGUgcmVtb3ZhbCBvZgordGhlIG9sZCBiZWhhdmlvciwgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcgc2hvdWxkIGJlIGludHJvZHVjZWQgc29vbiBhcyBpdAorYmVjb21lcyBjbGVhciB0aGF0IGFuIGV4Y2VwdGlvbmFsIGJyZWFrYWdlIGlzIG5lY2Vzc2FyeS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvTUlULUxJQ0VOU0UgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL01JVC1MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTg0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL01JVC1MSUNFTlNFCkBAIC0wLDAgKzEsMjAgQEAKK0NvcHlyaWdodCAoYykgMjAwNi0yMDE2IEhhbXB0b24gQ2F0bGluLCBOYXRhbGllIFdlaXplbmJhdW0sIGFuZCBDaHJpcyBFcHBzdGVpbgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNWUwYjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL1JFQURNRS5tZApAQCAtMCwwICsxLDIyNyBAQAorIyBTYXNzIFshW1RyYXZpcyBCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9zYXNzL3Nhc3Muc3ZnP2JyYW5jaD1uZXh0KV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL3Nhc3Mvc2FzcykgWyFbR2VtIFZlcnNpb25dKGh0dHBzOi8vYmFkZ2UuZnVyeS5pby9yYi9zYXNzLnN2ZyldKGh0dHA6Ly9iYWRnZS5mdXJ5LmlvL3JiL3Nhc3MpIFshW0lubGluZSBkb2NzXShodHRwOi8vaW5jaC1jaS5vcmcvZ2l0aHViL3Nhc3Mvc2Fzcy5zdmcpXShodHRwOi8vaW5jaC1jaS5vcmcvZ2l0aHViL3Nhc3Mvc2FzcykKKworKipTYXNzIG1ha2VzIENTUyBmdW4gYWdhaW4qKi4gU2FzcyBpcyBhbiBleHRlbnNpb24gb2YgQ1NTLAorYWRkaW5nIG5lc3RlZCBydWxlcywgdmFyaWFibGVzLCBtaXhpbnMsIHNlbGVjdG9yIGluaGVyaXRhbmNlLCBhbmQgbW9yZS4KK0l0J3MgdHJhbnNsYXRlZCB0byB3ZWxsLWZvcm1hdHRlZCwgc3RhbmRhcmQgQ1NTCit1c2luZyB0aGUgY29tbWFuZCBsaW5lIHRvb2wgb3IgYSB3ZWItZnJhbWV3b3JrIHBsdWdpbi4KKworU2FzcyBoYXMgdHdvIHN5bnRheGVzLiBUaGUgbmV3IG1haW4gc3ludGF4IChhcyBvZiBTYXNzIDMpCitpcyBrbm93biBhcyAiU0NTUyIgKGZvciAiU2Fzc3kgQ1NTIiksCithbmQgaXMgYSBzdXBlcnNldCBvZiBDU1MncyBzeW50YXguCitUaGlzIG1lYW5zIHRoYXQgZXZlcnkgdmFsaWQgQ1NTIHN0eWxlc2hlZXQgaXMgdmFsaWQgU0NTUyBhcyB3ZWxsLgorU0NTUyBmaWxlcyB1c2UgdGhlIGV4dGVuc2lvbiBgLnNjc3NgLgorCitUaGUgc2Vjb25kLCBvbGRlciBzeW50YXggaXMga25vd24gYXMgdGhlIGluZGVudGVkIHN5bnRheCAob3IganVzdCAiU2FzcyIpLgorSW5zcGlyZWQgYnkgSGFtbCdzIHRlcnNlbmVzcywgaXQncyBpbnRlbmRlZCBmb3IgcGVvcGxlCit3aG8gcHJlZmVyIGNvbmNpc2VuZXNzIG92ZXIgc2ltaWxhcml0eSB0byBDU1MuCitJbnN0ZWFkIG9mIGJyYWNrZXRzIGFuZCBzZW1pY29sb25zLAoraXQgdXNlcyB0aGUgaW5kZW50YXRpb24gb2YgbGluZXMgdG8gc3BlY2lmeSBibG9ja3MuCitBbHRob3VnaCBubyBsb25nZXIgdGhlIHByaW1hcnkgc3ludGF4LAordGhlIGluZGVudGVkIHN5bnRheCB3aWxsIGNvbnRpbnVlIHRvIGJlIHN1cHBvcnRlZC4KK0ZpbGVzIGluIHRoZSBpbmRlbnRlZCBzeW50YXggdXNlIHRoZSBleHRlbnNpb24gYC5zYXNzYC4KKworIyMgVXNpbmcKKworU2FzcyBjYW4gYmUgdXNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKK29yIGFzIHBhcnQgb2YgYSB3ZWIgZnJhbWV3b3JrLgorVGhlIGZpcnN0IHN0ZXAgaXMgdG8gaW5zdGFsbCB0aGUgZ2VtOgorCisgICAgZ2VtIGluc3RhbGwgc2FzcworCitBZnRlciB5b3UgY29udmVydCBzb21lIENTUyB0byBTYXNzLCB5b3UgY2FuIHJ1bgorCisgICAgc2FzcyBzdHlsZS5zY3NzCisKK3RvIGNvbXBpbGUgaXQgYmFjayB0byBDU1MuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBjb21tYW5kcywgY2hlY2sgb3V0CisKKyAgICBzYXNzIC0taGVscAorCitUbyBpbnN0YWxsIFNhc3MgaW4gUmFpbHMgMiwKK2p1c3QgYWRkIGBjb25maWcuZ2VtICJzYXNzImAgdG8gYGNvbmZpZy9lbnZpcm9ubWVudC5yYmAuCitJbiBSYWlscyAzLCBhZGQgYGdlbSAic2FzcyJgIHRvIHlvdXIgR2VtZmlsZSBpbnN0ZWFkLgorYC5zYXNzYCBvciBgLnNjc3NgIGZpbGVzIHNob3VsZCBiZSBwbGFjZWQgaW4gYHB1YmxpYy9zdHlsZXNoZWV0cy9zYXNzYCwKK3doZXJlIHRoZXknbGwgYmUgYXV0b21hdGljYWxseSBjb21waWxlZAordG8gY29ycmVzcG9uZGluZyBDU1MgZmlsZXMgaW4gYHB1YmxpYy9zdHlsZXNoZWV0c2Agd2hlbiBuZWVkZWQKKyh0aGUgU2FzcyB0ZW1wbGF0ZSBkaXJlY3RvcnkgaXMgY3VzdG9taXphYmxlLi4uCitzZWUgW3RoZSBTYXNzIHJlZmVyZW5jZV0oaHR0cDovL3Nhc3MtbGFuZy5jb20vZG9jcy95YXJkb2MvZmlsZS5TQVNTX1JFRkVSRU5DRS5odG1sI3RlbXBsYXRlX2xvY2F0aW9uLW9wdGlvbikgZm9yIGRldGFpbHMpLgorCitTYXNzIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBhbnkgUmFjay1lbmFibGVkIHdlYiBmcmFtZXdvcmsuCitUbyBkbyBzbywganVzdCBhZGQKKworYGBgcnVieQorcmVxdWlyZSAnc2Fzcy9wbHVnaW4vcmFjaycKK3VzZSBTYXNzOjpQbHVnaW46OlJhY2sKK2BgYAorCit0byBgY29uZmlnLnJ1YC4KK1RoZW4gYW55IFNhc3MgZmlsZXMgaW4gYHB1YmxpYy9zdHlsZXNoZWV0cy9zYXNzYAord2lsbCBiZSBjb21waWxlZCBpbnRvIENTUyBmaWxlcyBpbiBgcHVibGljL3N0eWxlc2hlZXRzYCBvbiBldmVyeSByZXF1ZXN0LgorCitUbyB1c2UgU2FzcyBwcm9ncmFtbWF0aWNhbGx5LAorY2hlY2sgb3V0IHRoZSBbWUFSRCBkb2N1bWVudGF0aW9uXShodHRwOi8vc2Fzcy1sYW5nLmNvbS9kb2N1bWVudGF0aW9uL2ZpbGUuU0FTU19SRUZFUkVOQ0UuaHRtbCN1c2luZ19zYXNzKS4KKworIyMgRm9ybWF0dGluZworCitTYXNzIGlzIGFuIGV4dGVuc2lvbiBvZiBDU1MKK3RoYXQgYWRkcyBwb3dlciBhbmQgZWxlZ2FuY2UgdG8gdGhlIGJhc2ljIGxhbmd1YWdlLgorSXQgYWxsb3dzIHlvdSB0byB1c2UgW3ZhcmlhYmxlc11bdmFyc10sIFtuZXN0ZWQgcnVsZXNdW25lc3RlZF0sCitbbWl4aW5zXVttaXhpbnNdLCBbaW5saW5lIGltcG9ydHNdW2ltcG9ydHNdLAorYW5kIG1vcmUsIGFsbCB3aXRoIGEgZnVsbHkgQ1NTLWNvbXBhdGlibGUgc3ludGF4LgorU2FzcyBoZWxwcyBrZWVwIGxhcmdlIHN0eWxlc2hlZXRzIHdlbGwtb3JnYW5pemVkLAorYW5kIGdldCBzbWFsbCBzdHlsZXNoZWV0cyB1cCBhbmQgcnVubmluZyBxdWlja2x5LAorcGFydGljdWxhcmx5IHdpdGggdGhlIGhlbHAgb2YKK1t0aGUgQ29tcGFzcyBzdHlsZSBsaWJyYXJ5XShodHRwOi8vY29tcGFzcy1zdHlsZS5vcmcpLgorCitbdmFyc106ICAgIGh0dHA6Ly9zYXNzLWxhbmcuY29tL2RvY3VtZW50YXRpb24vZmlsZS5TQVNTX1JFRkVSRU5DRS5odG1sI3ZhcmlhYmxlc18KK1tuZXN0ZWRdOiAgaHR0cDovL3Nhc3MtbGFuZy5jb20vZG9jdW1lbnRhdGlvbi9maWxlLlNBU1NfUkVGRVJFTkNFLmh0bWwjbmVzdGVkX3J1bGVzCitbbWl4aW5zXTogIGh0dHA6Ly9zYXNzLWxhbmcuY29tL2RvY3VtZW50YXRpb24vZmlsZS5TQVNTX1JFRkVSRU5DRS5odG1sI21peGlucworW2ltcG9ydHNdOiBodHRwOi8vc2Fzcy1sYW5nLmNvbS9kb2N1bWVudGF0aW9uL2ZpbGUuU0FTU19SRUZFUkVOQ0UuaHRtbCNpbXBvcnQKKworU2FzcyBoYXMgdHdvIHN5bnRheGVzLgorVGhlIG9uZSBwcmVzZW50ZWQgaGVyZSwga25vd24gYXMgIlNDU1MiIChmb3IgIlNhc3N5IENTUyIpLAoraXMgZnVsbHkgQ1NTLWNvbXBhdGlibGUuCitUaGUgb3RoZXIgKG9sZGVyKSBzeW50YXgsIGtub3duIGFzIHRoZSBpbmRlbnRlZCBzeW50YXggb3IganVzdCAiU2FzcyIsCitpcyB3aGl0ZXNwYWNlLXNlbnNpdGl2ZSBhbmQgaW5kZW50YXRpb24tYmFzZWQuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbcmVmZXJlbmNlIGRvY3VtZW50YXRpb25dW3N5bnRheF0uCisKK1tzeW50YXhdOiBodHRwOi8vc2Fzcy1sYW5nLmNvbS9kb2N1bWVudGF0aW9uL2ZpbGUuU0FTU19SRUZFUkVOQ0UuaHRtbCNzeW50YXgKKworVG8gcnVuIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYW5kIHNlZSB0aGUgQ1NTIHRoZXkgcHJvZHVjZSwKK3B1dCB0aGVtIGluIGEgZmlsZSBjYWxsZWQgYHRlc3Quc2Nzc2AgYW5kIHJ1biBgc2FzcyB0ZXN0LnNjc3NgLgorCisjIyMgTmVzdGluZworCitTYXNzIGF2b2lkcyByZXBldGl0aW9uIGJ5IG5lc3Rpbmcgc2VsZWN0b3JzIHdpdGhpbiBvbmUgYW5vdGhlci4KK1RoZSBzYW1lIHRoaW5nIHdvcmtzIGZvciBwcm9wZXJ0aWVzLgorCitgYGBzY3NzCit0YWJsZS5obCB7CisgIG1hcmdpbjogMmVtIDA7CisgIHRkLmxuIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH0KK30KKworbGkgeworICBmb250OiB7CisgICAgZmFtaWx5OiBzZXJpZjsKKyAgICB3ZWlnaHQ6IGJvbGQ7CisgICAgc2l6ZTogMS4yZW07CisgIH0KK30KK2BgYAorCisjIyMgVmFyaWFibGVzCisKK1VzZSB0aGUgc2FtZSBjb2xvciBhbGwgb3ZlciB0aGUgcGxhY2U/CitOZWVkIHRvIGRvIHNvbWUgbWF0aCB3aXRoIGhlaWdodCBhbmQgd2lkdGggYW5kIHRleHQgc2l6ZT8KK1Nhc3Mgc3VwcG9ydHMgdmFyaWFibGVzLCBtYXRoIG9wZXJhdGlvbnMsIGFuZCBtYW55IHVzZWZ1bCBmdW5jdGlvbnMuCisKK2BgYHNjc3MKKyRibHVlOiAjM2JiZmNlOworJG1hcmdpbjogMTZweDsKKworLmNvbnRlbnRfbmF2aWdhdGlvbiB7CisgIGJvcmRlci1jb2xvcjogJGJsdWU7CisgIGNvbG9yOiBkYXJrZW4oJGJsdWUsIDEwJSk7Cit9CisKKy5ib3JkZXIgeworICBwYWRkaW5nOiAkbWFyZ2luIC8gMjsKKyAgbWFyZ2luOiAkbWFyZ2luIC8gMjsKKyAgYm9yZGVyLWNvbG9yOiAkYmx1ZTsKK30KK2BgYAorCisjIyMgTWl4aW5zCisKK0V2ZW4gbW9yZSBwb3dlcmZ1bCB0aGFuIHZhcmlhYmxlcywKK21peGlucyBhbGxvdyB5b3UgdG8gcmUtdXNlIHdob2xlIGNodW5rcyBvZiBDU1MsCitwcm9wZXJ0aWVzIG9yIHNlbGVjdG9ycy4KK1lvdSBjYW4gZXZlbiBnaXZlIHRoZW0gYXJndW1lbnRzLiAKKworYGBgc2NzcworQG1peGluIHRhYmxlLXNjYWZmb2xkaW5nIHsKKyAgdGggeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgfQorICB0ZCwgdGggeyBwYWRkaW5nOiAycHg7IH0KK30KKworQG1peGluIGxlZnQoJGRpc3QpIHsKKyAgZmxvYXQ6IGxlZnQ7CisgIG1hcmdpbi1sZWZ0OiAkZGlzdDsKK30KKworI2RhdGEgeworICBAaW5jbHVkZSBsZWZ0KDEwcHgpOworICBAaW5jbHVkZSB0YWJsZS1zY2FmZm9sZGluZzsKK30KK2BgYAorCitBIGNvbXByZWhlbnNpdmUgbGlzdCBvZiBmZWF0dXJlcyBpcyBhdmFpbGFibGUKK2luIHRoZSBbU2FzcyByZWZlcmVuY2VdKGh0dHA6Ly9zYXNzLWxhbmcuY29tL2RvY3VtZW50YXRpb24vZmlsZS5TQVNTX1JFRkVSRU5DRS5odG1sKS4KKworIyMgRXhlY3V0YWJsZXMKKworVGhlIFNhc3MgZ2VtIGluY2x1ZGVzIHNldmVyYWwgZXhlY3V0YWJsZXMgdGhhdCBhcmUgdXNlZnVsCitmb3IgZGVhbGluZyB3aXRoIFNhc3MgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCisjIyMgYHNhc3NgCisKK1RoZSBgc2Fzc2AgZXhlY3V0YWJsZSB0cmFuc2Zvcm1zIGEgc291cmNlIFNhc3MgZmlsZSBpbnRvIENTUy4KK1NlZSBgc2FzcyAtLWhlbHBgIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFuZCBvcHRpb25zLgorCisjIyMgYHNhc3MtY29udmVydGAKKworVGhlIGBzYXNzLWNvbnZlcnRgIGV4ZWN1dGFibGUgY29udmVydHMgYmV0d2VlbiBDU1MsIFNhc3MsIGFuZCBTQ1NTLgorV2hlbiBjb252ZXJ0aW5nIGZyb20gQ1NTIHRvIFNhc3Mgb3IgU0NTUywKK25lc3RpbmcgaXMgYXBwbGllZCB3aGVyZSBhcHByb3ByaWF0ZS4KK1NlZSBgc2Fzcy1jb252ZXJ0IC0taGVscGAgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYW5kIG9wdGlvbnMuCisKKyMjIyBSdW5uaW5nIGxvY2FsbHkKKworVG8gcnVuIHRoZSBTYXNzIGV4ZWN1dGFibGVzIGZyb20gYSBzb3VyY2UgY2hlY2tvdXQgaW5zdGVhZCBvZiBmcm9tIHJ1YnlnZW1zOgorCitgYGAKKyQgY2Qgc2FzcworJCBidW5kbGUKKyQgYnVuZGxlIGV4ZWMgc2FzcyAuLi4KKyQgYnVuZGxlIGV4ZWMgc2NzcyAuLi4KKyQgYnVuZGxlIGV4ZWMgc2Fzcy1jb252ZXJ0IC4uLgorYGBgCisKKyMjIEF1dGhvcnMKKworU2FzcyB3YXMgZW52aXNpb25lZCBieSBbSGFtcHRvbiBDYXRsaW5dKGh0dHA6Ly93d3cuaGFtcHRvbmNhdGxpbi5jb20pCisoQGhjYXRsaW4pLiBIb3dldmVyLCBIYW1wdG9uIGRvZXNuJ3QgZXZlbiBrbm93IGhpcyB3YXkgYXJvdW5kIHRoZSBjb2RlIGFueW1vcmUKK2FuZCBub3cgb2NjYXNpb25hbGx5IGNvbnN1bHRzIG9uIHRoZSBsYW5ndWFnZSBpc3N1ZXMuIEhhbXB0b24gbGl2ZXMgaW4gU2FuCitGcmFuY2lzY28sIENhbGlmb3JuaWEgYW5kIHdvcmtzIGFzIFZQIG9mIFRlY2hub2xvZ3kKK2F0IFtNb292d2ViXShodHRwOi8vd3d3Lm1vb3Z3ZWIuY29tLykuCisKK1tOYXRhbGllIFdlaXplbmJhdW1dKGh0dHBzOi8vdHdpdHRlci5jb20vbmV4MykgaXMgdGhlIHByaW1hcnkgZGV2ZWxvcGVyIGFuZAorYXJjaGl0ZWN0IG9mIFNhc3MuIEhlciBoYXJkIHdvcmsgaGFzIGtlcHQgdGhlIHByb2plY3QgYWxpdmUgYnkgZW5kbGVzc2x5CithbnN3ZXJpbmcgZm9ydW0gcG9zdHMsIGZpeGluZyBidWdzLCByZWZhY3RvcmluZywgZmluZGluZyBzcGVlZCBpbXByb3ZlbWVudHMsCit3cml0aW5nIGRvY3VtZW50YXRpb24sIGltcGxlbWVudGluZyBuZXcgZmVhdHVyZXMsIGFuZCBkZXNpZ25pbmcgdGhlIGxhbmd1YWdlLgorTmF0YWxpZSBsaXZlcyBpbiBTZWF0dGxlLCBXYXNoaW5ndG9uIGFuZCB3b3JrcyBvbiBbRGFydF0oaHR0cDovL2RhcnRsYW5nLm9yZykKK2FwcGxpY2F0aW9uIGxpYnJhcmllcyBhdCBHb29nbGUuCisKK1tDaHJpcyBFcHBzdGVpbl0oaHR0cDovL3R3aXR0ZXIuY29tL2NocmlzZXBwc3RlaW4pIGlzIGEgY29yZSBjb250cmlidXRvciB0bworU2FzcyBhbmQgdGhlIGNyZWF0b3Igb2YgW0NvbXBhc3NdKGh0dHA6Ly9jb21wYXNzLXN0eWxlLm9yZy8pLCB0aGUgZmlyc3QgU2Fzcy1iYXNlZCBmcmFtZXdvcmssIGFuZAorW0V5ZWdsYXNzXShodHRwOi8vZ2l0aHViLmNvbS9zYXNzLWV5ZWdsYXNzL2V5ZWdsYXNzKSwgYSBub2RlLXNhc3MgcGx1Z2luIGVjb3N5c3RlbSBmb3IgTlBNLiBDaHJpcyBmb2N1c2VzCitvbiBtYWtpbmcgU2FzcyBtb3JlIHBvd2VyZnVsLCBlYXN5IHRvIHVzZSwgYW5kIG9uIHdheXMgdG8gc3BlZWQgaXRzIGFkb3B0aW9uCit0aHJvdWdoIHRoZSB3ZWIgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LiBDaHJpcyBsaXZlcyBpbiBTYW4gSm9zZSwgQ2FsaWZvcm5pYSB3aXRoCitoaXMgd2lmZSBhbmQgdHdvIGNoaWxkcmVuLiBIZSBpcyBhbiBFbmdpbmVlciBmb3IKK1tMaW5rZWRJbi5jb21dKGh0dHA6Ly9saW5rZWRpbi5jb20pLCB3aGVyZSBoaXMgcHJpbWFyeSByZXNwb25zaWJpbGl0eSBpcyB0bworbWFpbnRhaW4gU2FzcyBhbmQgbWFueSBvdGhlciBTYXNzLXJlbGF0ZWQgb3BlbiBzb3VyY2UgcHJvamVjdHMuCisKK0lmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSwgd2UnZCBiZSB0cnVseSBob25vcmVkIGlmIHlvdSdkIG1ha2UgYQordGF4LWRlZHVjdGlibGUgZG9uYXRpb24gdG8gYSBub24tcHJvZml0IG9yZ2FuaXphdGlvbiBhbmQgdGhlbgorW2xldCB1cyBrbm93IG9uIHR3aXR0ZXJdKGh0dHA6Ly90d2l0dGVyLmNvbS9TYXNzQ1NTKSwgc28gdGhhdCB3ZSBjYW4KK3RoYW5rIHlvdS4gSGVyZSdzIGEgZmV3IHRoYXQgd2UgZW5kb3JzZToKKworKiBbVHJhbnMgSnVzdGljZSBGdW5kaW5nIFByb2plY3RdKGh0dHA6Ly93d3cudHJhbnNqdXN0aWNlZnVuZGluZ3Byb2plY3Qub3JnLykKKyogW1VuaXRlZCBNaXRvY2hvbmRyaWFsIERpc2Vhc2UgRm91bmRhdGlvbl0oaHR0cDovL3VtZGYub3JnL2NvbXBhc3MpCisqIFtHaXJsIERldmVsb3AgSXRdKGh0dHBzOi8vd3d3LmdpcmxkZXZlbG9waXQuY29tL2RvbmF0ZSkKKworU2FzcyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL1JFVklTSU9OIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9SRVZJU0lPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc5OGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9SRVZJU0lPTgpAQCAtMCwwICsxIEBACisocmVsZWFzZSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvUmFrZWZpbGUgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL1Jha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGZkOTIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL1Jha2VmaWxlCkBAIC0wLDAgKzEsMzM4IEBACityZXF1aXJlICdydWJ5Z2Vtcy9wYWNrYWdlJworCisjIC0tLS0tIFV0aWxpdHkgRnVuY3Rpb25zIC0tLS0tCisKK2RlZiBzY29wZShwYXRoKQorICBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgcGF0aCkKK2VuZAorCisjIC0tLS0tIERlZmF1bHQ6IFRlc3RpbmcgLS0tLS0tCisKK3Rhc2sgOmRlZmF1bHQgPT4gOnRlc3QKKworcmVxdWlyZSAncmFrZS90ZXN0dGFzaycKKworTElORV9TSVpFID0gODAKK0RFQ09SQVRJT05fQ0hBUiA9ICcjJworCitkZWYgcHJpbnRfaGVhZGVyKHN0cmluZykKKyAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aAorICBwdXRzIERFQ09SQVRJT05fQ0hBUiAqIExJTkVfU0laRQorICBwdXRzIHN0cmluZy5jZW50ZXIobGVuZ3RoICsgMiwgJyAnKS5jZW50ZXIoTElORV9TSVpFLCBERUNPUkFUSU9OX0NIQVIpCisgIHB1dHMgREVDT1JBVElPTl9DSEFSICogTElORV9TSVpFCitlbmQKKworZGVzYyAiUnVuIGFsbCB0ZXN0cyIKK3Rhc2sgOnRlc3QgZG8KKyAgdGVzdF9jYXNlcyA9IFsKKyAgICB7CisgICAgICAnZW52JyAgID0+IHsnTUFUSE4nID0+ICd0cnVlJ30sCisgICAgICAndGFza3MnID0+IFsndGVzdDpydWJ5JywgJ3Rlc3Q6c3BlYycsIDpydWJvY29wXQorICAgIH0sCisgICAgeworICAgICAgJ2VudicgICA9PiB7J01BVEhOJyA9PiAnZmFsc2UnfSwKKyAgICAgICd0YXNrcycgPT4gWyd0ZXN0OnJ1YnknXQorICAgIH0KKyAgXQorCisgIHRlc3RfY2FzZXMuZWFjaCBkbyB8dGVzdF9jYXNlfAorICAgIGVudiA9IHRlc3RfY2FzZVsnZW52J10KKyAgICB0YXNrcyA9IHRlc3RfY2FzZVsndGFza3MnXQorCisgICAgZW52LmVhY2ggZG8gfGtleSwgdmFsdWV8CisgICAgICBFTlZba2V5XSA9IHZhbHVlCisgICAgZW5kCisgICAgdGFza3MuZWFjaCBkbyB8dGFza3wKKyAgICAgIHByaW50X2hlYWRlcigiUnVubmluZyB0YXNrOiAje3Rhc2t9LCBlbnY6ICN7ZW52fSIpCisgICAgICBSYWtlOjpUYXNrW3Rhc2tdLmV4ZWN1dGUKKyAgICBlbmQKKyAgZW5kCitlbmQKKworbmFtZXNwYWNlIDp0ZXN0IGRvCisgIGRlc2MgIlJ1biB0aGUgcnVieSB0ZXN0cyAod2l0aG91dCBzYXNzLXNwZWMpIgorICBSYWtlOjpUZXN0VGFzay5uZXcoInJ1YnkiKSBkbyB8dHwKKyAgICB0LmxpYnMgPDwgJ3Rlc3QnCisgICAgdGVzdF9maWxlcyA9IEZpbGVMaXN0W3Njb3BlKCd0ZXN0LyoqLypfdGVzdC5yYicpXQorICAgIHRlc3RfZmlsZXMuZXhjbHVkZShzY29wZSgndGVzdC9yYWlscy8qJykpCisgICAgdGVzdF9maWxlcy5leGNsdWRlKHNjb3BlKCd0ZXN0L3BsdWdpbnMvKicpKQorICAgIHQudGVzdF9maWxlcyA9IHRlc3RfZmlsZXMKKyAgICB0Lndhcm5pbmcgPSB0cnVlCisgICAgdC52ZXJib3NlID0gdHJ1ZQorICBlbmQKKworICBkZXNjICJSdW4gc2Fzcy1zcGVjIHRlc3RzIGFnYWluc3QgdGhlIGxvY2FsIGNvZGUuIgorICB0YXNrIDpzcGVjIGRvCisgICAgcmVxdWlyZSAieWFtbCIKKyAgICBzYXNzX3NwZWNfb3B0aW9ucyA9IFlBTUwubG9hZF9maWxlKHNjb3BlKCJ0ZXN0L3Nhc3Mtc3BlYy55bWwiKSkKKyAgICBlbmFibGVkID0gc2Fzc19zcGVjX29wdGlvbnMuZGVsZXRlKDplbmFibGVkKQorICAgIHVubGVzcyBlbmFibGVkCisgICAgICBwdXRzICJTYXNzU3BlYyB0ZXN0cyBhcmUgZGlzYWJsZWQuIgorICAgICAgbmV4dAorICAgIGVuZAorICAgIGlmIHJ1YnlfdmVyc2lvbl9hdF9sZWFzdD8oIjEuOS4yIikKKyAgICAgIG9sZF9sb2FkX3BhdGggPSAkOi5kdXAKKyAgICAgIGJlZ2luCisgICAgICAgICQ6LnVuc2hpZnQoRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICJsaWIiKSkKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICByZXF1aXJlICdzYXNzX3NwZWMnCisgICAgICAgIHJlc2N1ZSBMb2FkRXJyb3IKKyAgICAgICAgICBwdXRzICJZb3UgcHJvYmFibHkgZm9yZ290IHRvIHJ1bjogYnVuZGxlIGV4ZWMgcmFrZSIKKyAgICAgICAgICByYWlzZQorICAgICAgICBlbmQKKyAgICAgICAgZGVmYXVsdF9vcHRpb25zID0geworICAgICAgICAgIDpzcGVjX2RpcmVjdG9yeSA9PiBTYXNzU3BlYzo6U1BFQ19ESVIsCisgICAgICAgICAgOmVuZ2luZV9hZGFwdGVyID0+IFNhc3NFbmdpbmVBZGFwdGVyLm5ldywKKyAgICAgICAgICA6Z2VuZXJhdGUgPT4gZmFsc2UsCisgICAgICAgICAgOnRhcCA9PiBmYWxzZSwKKyAgICAgICAgICA6c2tpcCA9PiBmYWxzZSwKKyAgICAgICAgICA6dmVyYm9zZSA9PiBmYWxzZSwKKyAgICAgICAgICA6ZmlsdGVyID0+ICIiLAorICAgICAgICAgIDpsaW1pdCA9PiAtMSwKKyAgICAgICAgICA6dW5leHBlY3RlZF9wYXNzID0+IGZhbHNlLAorICAgICAgICAgIDpudWtlID0+IGZhbHNlLAorICAgICAgICB9CisgICAgICAgIFNhc3NTcGVjOjpSdW5uZXIubmV3KGRlZmF1bHRfb3B0aW9ucy5tZXJnZShzYXNzX3NwZWNfb3B0aW9ucykpLnJ1biB8fCBleGl0KDEpCisgICAgICBlbnN1cmUKKyAgICAgICAgJDoucmVwbGFjZShvbGRfbG9hZF9wYXRoKQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgIlNraXBwaW5nIHNhc3Mtc3BlYyBvbiBydWJ5IHZlcnNpb25zIGxlc3MgdGhhbiAxLjkuMiIKKyAgICBlbmQKKyAgZW5kCitlbmQKKworIyAtLS0tLSBDb2RlIFN0eWxlIEVuZm9yY2VtZW50IC0tLS0tCisKK2RlZiBydWJ5X3ZlcnNpb25fYXRfbGVhc3Q/KHZlcnNpb25fc3RyaW5nKQorICBydWJ5X3ZlcnNpb24gPSBHZW06OlZlcnNpb24ubmV3KFJVQllfVkVSU0lPTi5kdXApCisgIHZlcnNpb24gPSBHZW06OlZlcnNpb24ubmV3KHZlcnNpb25fc3RyaW5nKQorICBydWJ5X3ZlcnNpb24gPj0gdmVyc2lvbgorZW5kCisKK2JlZ2luCisgIHJlcXVpcmUgJ3J1Ym9jb3AvcmFrZV90YXNrJworICBSdWJvQ29wID0gUnVib2NvcCB1bmxlc3MgZGVmaW5lZD8oUnVib0NvcCkKKyAgUnVib0NvcDo6UmFrZVRhc2submV3IGRvIHx0fAorICAgIHQucGF0dGVybnMgPSBGaWxlTGlzdFsibGliLyoqLyoiXQorICBlbmQKK3Jlc2N1ZSBMb2FkRXJyb3IKKyAgdGFzayA6cnVib2NvcCBkbworICAgIHB1dHMgIlJ1Ym9jb3AgaXMgZGlzYWJsZWQuIgorICAgIHB1dHMgIlBhc3NpbmcgdGhpcyBjaGVjayBpcyByZXF1aXJlZCBpbiBvcmRlciBmb3IgeW91ciBwYXRjaCB0byBiZSBhY2NlcHRlZC4iCisgICAgcHV0cyAiSW5zdGFsbCBSdWJvY29wIGFuZCB0aGVuIHJ1biB0aGUgc3R5bGUgY2hlY2sgd2l0aDogcmFrZSBydWJvY29wLiIKKyAgZW5kCitlbmQKKworIyAtLS0tLSBQYWNrYWdpbmcgLS0tLS0KKworIyBEb24ndCB1c2UgUmFrZTo6R2VtUGFja2FnZVRhc3QgYmVjYXVzZSB3ZSB3YW50IHByZXJlcXVpc2l0ZXMgdG8gcnVuCisjIGJlZm9yZSB3ZSBsb2FkIHRoZSBnZW1zcGVjLgorZGVzYyAiQnVpbGQgYWxsIHRoZSBwYWNrYWdlcy4iCit0YXNrIDpwYWNrYWdlID0+IFs6cmV2aXNpb25fZmlsZSwgOmRhdGVfZmlsZSwgOnBlcm1pc3Npb25zXSBkbworICB2ZXJzaW9uID0gZ2V0X3ZlcnNpb24KKyAgRmlsZS5vcGVuKHNjb3BlKCdWRVJTSU9OJyksICd3Jykge3xmfCBmLnB1dHModmVyc2lvbil9CisgIGxvYWQgc2NvcGUoJ3Nhc3MuZ2Vtc3BlYycpCisgIEdlbTo6UGFja2FnZS5idWlsZChTQVNTX0dFTVNQRUMpCisgIHNoICV7Z2l0IGNoZWNrb3V0IFZFUlNJT059CisKKyAgcGtnID0gIiN7U0FTU19HRU1TUEVDLm5hbWV9LSN7U0FTU19HRU1TUEVDLnZlcnNpb259IgorICBta2Rpcl9wICJwa2ciCisgIHZlcmJvc2UodHJ1ZSkge212ICIje3BrZ30uZ2VtIiwgInBrZy8je3BrZ30uZ2VtIn0KKworICBzaCAle3JtIC1mIHBrZy8je3BrZ30udGFyLmd6fQorICB2ZXJib3NlKGZhbHNlKSB7U0FTU19HRU1TUEVDLmZpbGVzLmVhY2gge3xmfCBzaCAle3RhciByZiBwa2cvI3twa2d9LnRhciAje2Z9fX19CisgIHNoICV7Z3ppcCBwa2cvI3twa2d9LnRhcn0KK2VuZAorCit0YXNrIDpwZXJtaXNzaW9ucyBkbworICBzaCAle2NobW9kIC1SIGErcnggYmlufQorICBzaCAle2NobW9kIC1SIGErciAufQorICByZXF1aXJlICdzaGVsbHdvcmRzJworICBEaXIuZ2xvYigndGVzdC8qKi8qX3Rlc3QucmInKSBkbyB8ZmlsZXwKKyAgICBuZXh0IGlmIGZpbGUgPX4gJXJ7XnRlc3QvaGFtbC9zcGVjL30KKyAgICBzaCAle2NobW9kIGErcnggI3tmaWxlfX0KKyAgZW5kCitlbmQKKwordGFzayA6cmV2aXNpb25fZmlsZSBkbworICByZXF1aXJlIHNjb3BlKCdsaWIvc2FzcycpCisKKyAgcmVsZWFzZSA9IFJha2UuYXBwbGljYXRpb24udG9wX2xldmVsX3Rhc2tzLmluY2x1ZGU/KCdyZWxlYXNlJykgfHwgRmlsZS5leGlzdD8oc2NvcGUoJ0VER0VfR0VNX1ZFUlNJT04nKSkKKyAgaWYgU2Fzcy52ZXJzaW9uWzpyZXZdICYmICFyZWxlYXNlCisgICAgRmlsZS5vcGVuKHNjb3BlKCdSRVZJU0lPTicpLCAndycpIHsgfGZ8IGYucHV0cyBTYXNzLnZlcnNpb25bOnJldl0gfQorICBlbHNpZiByZWxlYXNlCisgICAgRmlsZS5vcGVuKHNjb3BlKCdSRVZJU0lPTicpLCAndycpIHsgfGZ8IGYucHV0cyAiKHJlbGVhc2UpIiB9CisgIGVsc2UKKyAgICBGaWxlLm9wZW4oc2NvcGUoJ1JFVklTSU9OJyksICd3JykgeyB8ZnwgZi5wdXRzICIodW5rbm93bikiIH0KKyAgZW5kCitlbmQKKwordGFzayA6ZGF0ZV9maWxlIGRvCisgIEZpbGUub3BlbihzY29wZSgnVkVSU0lPTl9EQVRFJyksICd3JykgZG8gfGZ8CisgICAgZi5wdXRzIFRpbWUubm93LnV0Yy5zdHJmdGltZSgnJWQgJUIgJVkgJVQgJVonKQorICBlbmQKK2VuZAorCisjIFdlIGFsc28gbmVlZCB0byBnZXQgcmlkIG9mIHRoaXMgZmlsZSBhZnRlciBwYWNrYWdpbmcuCithdF9leGl0IGRvCisgIEZpbGUuZGVsZXRlKHNjb3BlKCdSRVZJU0lPTicpKSByZXNjdWUgbmlsCisgIEZpbGUuZGVsZXRlKHNjb3BlKCdWRVJTSU9OX0RBVEUnKSkgcmVzY3VlIG5pbAorZW5kCisKK2Rlc2MgIkluc3RhbGwgU2FzcyBhcyBhIGdlbS4gVXNlIFNVRE89MSB0byBpbnN0YWxsIHdpdGggc3Vkby4iCit0YXNrIDppbnN0YWxsID0+IFs6cGFja2FnZV0gZG8KKyAgZ2VtICA9IFJVQllfUExBVEZPUk0gPX4gL2phdmEvICA/ICdqZ2VtJyA6ICdnZW0nCisgIHNoICV7I3snc3VkbyAnIGlmIEVOVlsiU1VETyJdfSN7Z2VtfSBpbnN0YWxsIC0tbm8tcmkgcGtnL3Nhc3MtI3tnZXRfdmVyc2lvbn19CitlbmQKKworZGVzYyAiUmVsZWFzZSBhIG5ldyBTYXNzIHBhY2thZ2UgdG8gUnVieUdlbXMub3JnLiIKK3Rhc2sgOnJlbGVhc2UgPT4gWzpjaGVja19yZWxlYXNlLCA6cGFja2FnZV0gZG8KKyAgdmVyc2lvbiA9IEZpbGUucmVhZChzY29wZSgiVkVSU0lPTiIpKS5zdHJpcAorICBzaCAle2dlbSBwdXNoIHBrZy9zYXNzLSN7dmVyc2lvbn0uZ2VtfQorZW5kCisKKyMgRW5zdXJlcyB0aGF0IHRoZSBWRVJTSU9OIGZpbGUgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBuZXcgcmVsZWFzZS4KK3Rhc2sgOmNoZWNrX3JlbGVhc2UgZG8KKyAgdmVyc2lvbiA9IEZpbGUucmVhZChzY29wZSgiVkVSU0lPTiIpKS5zdHJpcAorICByYWlzZSAiVGhlcmUgaGF2ZSBiZWVuIGNoYW5nZXMgc2luY2UgY3VycmVudCB2ZXJzaW9uICgje3ZlcnNpb259KSIgaWYgY2hhbmdlZF9zaW5jZT8odmVyc2lvbikKKyAgcmFpc2UgIlZFUlNJT05fTkFNRSBtdXN0IG5vdCBiZSAnQmxlZWRpbmcgRWRnZSciIGlmIEZpbGUucmVhZChzY29wZSgiVkVSU0lPTl9OQU1FIikpID09ICJCbGVlZGluZyBFZGdlIgorZW5kCisKKyMgUmVhZHMgYSBwYXNzd29yZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisjCisjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBwcm9tcHQgdG8gdXNlIHRvIHJlYWQgdGhlIHBhc3N3b3JkCitkZWYgcmVhZF9wYXNzd29yZChwcm9tcHQpCisgIHJlcXVpcmUgJ3JlYWRsaW5lJworICBzeXN0ZW0gInN0dHkgLWVjaG8iCisgIFJlYWRsaW5lLnJlYWRsaW5lKCIje3Byb21wdH06ICIpLnN0cmlwCitlbnN1cmUKKyAgc3lzdGVtICJzdHR5IGVjaG8iCisgIHB1dHMKK2VuZAorCisjIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHJlcG9zaXRvcnksIG9yIHNwZWNpZmljIGZpbGVzLAorIyBoYXMvaGF2ZSBjaGFuZ2VkIHNpbmNlIGEgZ2l2ZW4gcmV2aXNpb24uCisjCisjIEBwYXJhbSByZXYgW1N0cmluZ10gVGhlIHJldmlzaW9uIHRvIGNoZWNrIGFnYWluc3QKKyMgQHBhcmFtIGZpbGVzIFtBcnJheTxTdHJpbmc+XSBUaGUgZmlsZXMgdG8gY2hlY2suCisjICAgSWYgdGhpcyBpcyBlbXB0eSwgY2hlY2tzIHRoZSBlbnRpcmUgcmVwb3NpdG9yeQorZGVmIGNoYW5nZWRfc2luY2U/KHJldiwgKmZpbGVzKQorICBJTy5wb3BlbigiZ2l0IGRpZmYgLS1leGl0LWNvZGUgI3tyZXZ9ICN7ZmlsZXMuam9pbignICcpfSIpIHt9CisgIHJldHVybiAhJD8uc3VjY2Vzcz8KK2VuZAorCisjIEdldCB0aGUgdmVyc2lvbiBzdHJpbmcuIElmIHRoaXMgaXMgYmVpbmcgaW5zdGFsbGVkIGZyb20gR2l0LAorIyB0aGlzIGluY2x1ZGVzIHRoZSBwcm9wZXIgcHJlcmVsZWFzZSB2ZXJzaW9uLgorZGVmIGdldF92ZXJzaW9uCisgIEZpbGUucmVhZChzY29wZSgnVkVSU0lPTicpLnN0cmlwKQorZW5kCisKK3Rhc2sgOndhdGNoX2Zvcl91cGRhdGUgZG8KKyAgc2ggJXtydWJ5IGV4dHJhL3VwZGF0ZV93YXRjaC5yYn0KK2VuZAorCisjIC0tLS0tIERvY3VtZW50YXRpb24gLS0tLS0KKwordGFzayA6cmRvYyBkbworICBwdXRzICc9JyAqIDEwMCwgPDxFTkQsICc9JyAqIDEwMAorU2FzcyB1c2VzIHRoZSBZQVJEIGRvY3VtZW50YXRpb24gc3lzdGVtIChodHRwOi8vZ2l0aHViLmNvbS9sc2VnYWwveWFyZCkuCitJbnN0YWxsIHRoZSB5YXJkIGdlbSBhbmQgdGhlbiBydW4gInJha2UgZG9jIi4KK0VORAorZW5kCisKK2JlZ2luCisgIHJlcXVpcmUgJ3lhcmQnCisKKyAgbmFtZXNwYWNlIDpkb2MgZG8KKyAgICB0YXNrIDpzYXNzIGRvCisgICAgICByZXF1aXJlIHNjb3BlKCdsaWIvc2FzcycpCisgICAgICBEaXJbc2NvcGUoInlhcmQvZGVmYXVsdC8qKi8qLnNhc3MiKV0uZWFjaCBkbyB8c2Fzc3wKKyAgICAgICAgRmlsZS5vcGVuKHNhc3MuZ3N1Yigvc2FzcyQvLCAnY3NzJyksICd3JykgZG8gfGZ8CisgICAgICAgICAgZi53cml0ZShTYXNzOjpFbmdpbmUubmV3KEZpbGUucmVhZChzYXNzKSkucmVuZGVyKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzYyAiTGlzdCBhbGwgdW5kb2N1bWVudGVkIG1ldGhvZHMgYW5kIGNsYXNzZXMuIgorICAgIHRhc2sgOnVuZG9jdW1lbnRlZCBkbworICAgICAgb3B0cyA9IEVOVlsiWUFSRF9PUFRTIl0gfHwgIiIKKyAgICAgIEVOVlsiWUFSRF9PUFRTIl0gPSBvcHRzLmR1cCArIDw8T1BUUworIC0tbGlzdCAtLXRhZyBjb21tZW50IC0taGlkZS10YWcgY29tbWVudCAtLXF1ZXJ5ICIKKyAgb2JqZWN0LmRvY3N0cmluZy5ibGFuaz8gJiYKKyAgIShvYmplY3QudHlwZSA9PSA6bWV0aG9kICYmIG9iamVjdC5pc19hbGlhcz8pIgorT1BUUworICAgICAgUmFrZTo6VGFza1sneWFyZCddLmV4ZWN1dGUKKyAgICBlbmQKKyAgZW5kCisKKyAgWUFSRDo6UmFrZTo6WWFyZG9jVGFzay5uZXcgZG8gfHR8CisgICAgdC5maWxlcyA9IEZpbGVMaXN0Lm5ldyhzY29wZSgnbGliLyoqLyoucmInKSkgZG8gfGxpc3R8CisgICAgICBsaXN0LmV4Y2x1ZGUoJ2xpYi9zYXNzL3BsdWdpbi9tZXJiLnJiJykKKyAgICAgIGxpc3QuZXhjbHVkZSgnbGliL3Nhc3MvcGx1Z2luL3JhaWxzLnJiJykKKyAgICBlbmQudG9fYQorICAgIHQub3B0aW9ucyA8PCAnLS1pbmNyZW1lbnRhbCcgaWYgUmFrZS5hcHBsaWNhdGlvbi50b3BfbGV2ZWxfdGFza3MuaW5jbHVkZT8oJ3JlZG9jJykKKyAgICB0Lm9wdGlvbnMgKz0gRmlsZUxpc3QubmV3KHNjb3BlKCd5YXJkLyoucmInKSkudG9fYS5tYXAge3xmfCBbJy1lJywgZl19LmZsYXR0ZW4KKyAgICBmaWxlcyA9IEZpbGVMaXN0Lm5ldyhzY29wZSgnZG9jLXNyYy8qJykpLnRvX2Euc29ydF9ieSB7fHN8IHMuc2l6ZX0gKyAld1tNSVQtTElDRU5TRSBWRVJTSU9OXQorICAgIHQub3B0aW9ucyA8PCAnLS1maWxlcycgPDwgZmlsZXMuam9pbignLCcpCisgICAgdC5vcHRpb25zIDw8ICctLXRlbXBsYXRlLXBhdGgnIDw8IHNjb3BlKCd5YXJkJykKKyAgICB0Lm9wdGlvbnMgPDwgJy0tdGl0bGUnIDw8IEVOVlsiWUFSRF9USVRMRSJdIGlmIEVOVlsiWUFSRF9USVRMRSJdCisKKyAgICB0LmJlZm9yZSA9IGxhbWJkYSBkbworICAgICAgaWYgRU5WWyJZQVJEX09QVFMiXQorICAgICAgICByZXF1aXJlICdzaGVsbHdvcmRzJworICAgICAgICB0Lm9wdGlvbnMuY29uY2F0KFNoZWxsd29yZHMuc2hlbGx3b3JkcyhFTlZbIllBUkRfT1BUUyJdKSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgUmFrZTo6VGFza1sneWFyZCddLnByZXJlcXVpc2l0ZXMuaW5zZXJ0KDAsICdkb2M6c2FzcycpCisgIFJha2U6OlRhc2tbJ3lhcmQnXS5pbnN0YW5jZV92YXJpYWJsZV9zZXQoJ0Bjb21tZW50JywgbmlsKQorCisgIGRlc2MgIkdlbmVyYXRlIERvY3VtZW50YXRpb24iCisgIHRhc2sgOmRvYyA9PiA6eWFyZAorICB0YXNrIDpyZWRvYyA9PiA6eWFyZAorcmVzY3VlIExvYWRFcnJvcgorICBkZXNjICJHZW5lcmF0ZSBEb2N1bWVudGF0aW9uIgorICB0YXNrIDpkb2MgPT4gOnJkb2MKKyAgdGFzayA6eWFyZCA9PiA6cmRvYworZW5kCisKKyMgLS0tLS0gQ292ZXJhZ2UgLS0tLS0KKworYmVnaW4KKyAgcmVxdWlyZSAncmNvdi9yY292dGFzaycKKworICBSY292OjpSY292VGFzay5uZXcgZG8gfHR8CisgICAgdC50ZXN0X2ZpbGVzID0gRmlsZUxpc3Rbc2NvcGUoJ3Rlc3QvKiovKl90ZXN0LnJiJyldCisgICAgdC5yY292X29wdHMgPDwgJy14JyA8PCAnIl5cLyInCisgICAgaWYgRU5WWydOT05fTkFUSVZFJ10KKyAgICAgIHQucmNvdl9vcHRzIDw8ICItLW5vLXJjb3ZydCIKKyAgICBlbmQKKyAgICB0LnZlcmJvc2UgPSB0cnVlCisgIGVuZAorcmVzY3VlIExvYWRFcnJvcjsgZW5kCisKKyMgLS0tLS0gUHJvZmlsaW5nIC0tLS0tCisKK2JlZ2luCisgIHJlcXVpcmUgJ3J1YnktcHJvZicKKworICBkZXNjIDw8RU5ECitSdW4gYSBwcm9maWxlIG9mIHNhc3MuCisgIFRJTUVTPW4gc2V0cyB0aGUgbnVtYmVyIG9mIHJ1bnMuIERlZmF1bHRzIHRvIDEwMDAuCisgIEZJTEU9c3RyIHNldHMgdGhlIGZpbGUgdG8gcHJvZmlsZS4gRGVmYXVsdHMgdG8gJ2NvbXBsZXgnLgorICBPVVRQVVQ9c3RyIHNldHMgdGhlIHJ1YnktcHJvZiBvdXRwdXQgZm9ybWF0LgorICAgIENhbiBiZSBGbGF0LCBDYWxsSW5mbywgb3IgR3JhcGguIERlZmF1bHRzIHRvIEZsYXQuIERlZmF1bHRzIHRvIEZsYXQuCitFTkQKKyAgdGFzayA6cHJvZmlsZSBkbworICAgIHRpbWVzICA9IChFTlZbJ1RJTUVTJ10gfHwgJzEwMDAnKS50b19pCisgICAgZmlsZSAgID0gRU5WWydGSUxFJ10KKworICAgIHJlcXVpcmUgJ2xpYi9zYXNzJworCisgICAgZmlsZSA9IEZpbGUucmVhZChzY29wZSgidGVzdC9zYXNzL3RlbXBsYXRlcy8je2ZpbGUgfHwgJ2NvbXBsZXgnfS5zYXNzIikpCisgICAgcmVzdWx0ID0gUnVieVByb2YucHJvZmlsZSB7IHRpbWVzLnRpbWVzIHsgU2Fzczo6RW5naW5lLm5ldyhmaWxlKS5yZW5kZXIgfSB9CisKKyAgICBSdWJ5UHJvZi5jb25zdF9nZXQoIiN7KEVOVlsnT1VUUFVUJ10gfHwgJ0ZsYXQnKS5jYXBpdGFsaXplfVByaW50ZXIiKS5uZXcocmVzdWx0KS5wcmludAorICBlbmQKK3Jlc2N1ZSBMb2FkRXJyb3I7IGVuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9WRVJTSU9OIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9WRVJTSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzBjOTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL1ZFUlNJT04KQEAgLTAsMCArMSBAQAorMy41LjEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvVkVSU0lPTl9EQVRFIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9WRVJTSU9OX0RBVEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmYmEzOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvVkVSU0lPTl9EQVRFCkBAIC0wLDAgKzEgQEAKKzEzIEp1bHkgMjAxNyAyMjo1ODoxNSBVVEMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvVkVSU0lPTl9OQU1FIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9WRVJTSU9OX05BTUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1ZTM5NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvVkVSU0lPTl9OQU1FCkBAIC0wLDAgKzEgQEAKK0JsZWVkaW5nIEVkZ2UKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvYmluL3Nhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2Jpbi9zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYyZDZkMGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2Jpbi9zYXNzCkBAIC0wLDAgKzEsMTMgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKyMgVGhlIGNvbW1hbmQgbGluZSBTYXNzIHBhcnNlci4KKworVEhJU19GSUxFID0gRmlsZS5zeW1saW5rPyhfX0ZJTEVfXykgPyBGaWxlLnJlYWRsaW5rKF9fRklMRV9fKSA6IF9fRklMRV9fCitiZWdpbgorICByZXF1aXJlIEZpbGUuZGlybmFtZShUSElTX0ZJTEUpICsgJy8uLi9saWIvc2FzcycKK3Jlc2N1ZSBMb2FkRXJyb3IKKyAgcmVxdWlyZSAnc2FzcycKK2VuZAorcmVxdWlyZSAnc2Fzcy9leGVjJworCitvcHRzID0gU2Fzczo6RXhlYzo6U2Fzc1Njc3MubmV3KEFSR1YsIDpzYXNzKQorb3B0cy5wYXJzZSEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvYmluL3Nhc3MtY29udmVydCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvYmluL3Nhc3MtY29udmVydApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMjc2MjUzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9iaW4vc2Fzcy1jb252ZXJ0CkBAIC0wLDAgKzEsMTIgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKworVEhJU19GSUxFID0gRmlsZS5zeW1saW5rPyhfX0ZJTEVfXykgPyBGaWxlLnJlYWRsaW5rKF9fRklMRV9fKSA6IF9fRklMRV9fCitiZWdpbgorICByZXF1aXJlIEZpbGUuZGlybmFtZShUSElTX0ZJTEUpICsgJy8uLi9saWIvc2FzcycKK3Jlc2N1ZSBMb2FkRXJyb3IKKyAgcmVxdWlyZSAnc2FzcycKK2VuZAorcmVxdWlyZSAnc2Fzcy9leGVjJworCitvcHRzID0gU2Fzczo6RXhlYzo6U2Fzc0NvbnZlcnQubmV3KEFSR1YpCitvcHRzLnBhcnNlIQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9iaW4vc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvYmluL3Njc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2UzYzRhZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvYmluL3Njc3MKQEAgLTAsMCArMSwxMyBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorIyBUaGUgY29tbWFuZCBsaW5lIFNhc3MgcGFyc2VyLgorCitUSElTX0ZJTEUgPSBGaWxlLnN5bWxpbms/KF9fRklMRV9fKSA/IEZpbGUucmVhZGxpbmsoX19GSUxFX18pIDogX19GSUxFX18KK2JlZ2luCisgIHJlcXVpcmUgRmlsZS5kaXJuYW1lKFRISVNfRklMRSkgKyAnLy4uL2xpYi9zYXNzJworcmVzY3VlIExvYWRFcnJvcgorICByZXF1aXJlICdzYXNzJworZW5kCityZXF1aXJlICdzYXNzL2V4ZWMnCisKK29wdHMgPSBTYXNzOjpFeGVjOjpTYXNzU2Nzcy5uZXcoQVJHViwgOnNjc3MpCitvcHRzLnBhcnNlIQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9leHRyYS9zYXNzLXNwZWMtcmVmLnNoIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9leHRyYS9zYXNzLXNwZWMtcmVmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0ODdmN2EKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2V4dHJhL3Nhc3Mtc3BlYy1yZWYuc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL2Jhc2ggLWUKKyMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlCisjIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdAorIyBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC4KKworIyBFY2hvZXMgdGhlIHNhc3Mtc3BlYyBHaXQgcmVmIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgb3V0IGZvciB0aGUgY3VycmVudCBUcmF2aXMKKyMgcnVuLiBJZiB3ZSdyZSBydW5uaW5nIHNwZWNzIGZvciBhIHB1bGwgcmVxdWVzdCB3aGljaCByZWZlcnMgdG8gYSBzYXNzLXNwZWMKKyMgcHVsbCByZXF1ZXN0LCB3ZSdsbCBydW4gYWdhaW5zdCB0aGUgbGF0dGVyIHJhdGhlciB0aGFuIHNhc3Mtc3BlYyBtYXN0ZXIuCisKK2RlZmF1bHQ9bWFzdGVyCisKK2lmIFsgIiRUUkFWSVNfUFVMTF9SRVFVRVNUIiA9PSAiZmFsc2UiIF07IHRoZW4KKyAgPiYyIGVjaG8gIlRSQVZJU19QVUxMX1JFUVVFU1Q6ICRUUkFWSVNfUFVMTF9SRVFVRVNULiIKKyAgPiYyIGVjaG8gIlJlZjogJGRlZmF1bHQuIgorICBlY2hvICIkZGVmYXVsdCIKKyAgZXhpdCAwCitmaQorCis+JjIgZWNobyAiRmV0Y2hpbmcgcHVsbCByZXF1ZXN0ICRUUkFWSVNfUFVMTF9SRVFVRVNULi4uIgorCitKU09OPSQoY3VybCAtTCAtc1MgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zYXNzL3Nhc3MvcHVsbHMvJFRSQVZJU19QVUxMX1JFUVVFU1QpCisKK1JFX1NQRUNfUFI9InNhc3NcL3Nhc3Mtc3BlYygjfFwvcHVsbFwvKShbMC05XSspIgorCitpZiBbWyAkSlNPTiA9fiAkUkVfU1BFQ19QUiBdXTsgdGhlbgorICByZWY9InB1bGwvJHtCQVNIX1JFTUFUQ0hbMl19L2hlYWQiCisgID4mMiBlY2hvICJSZWY6ICRyZWYuIgorICBlY2hvICIkcmVmIgorZWxzZQorICA+JjIgZWNobyAiUmVmOiAkZGVmYXVsdC4iCisgIGVjaG8gIiRkZWZhdWx0IgorZmkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvZXh0cmEvdXBkYXRlX3dhdGNoLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9leHRyYS91cGRhdGVfd2F0Y2gucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5MDY4NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvZXh0cmEvdXBkYXRlX3dhdGNoLnJiCkBAIC0wLDAgKzEsMTMgQEAKK3JlcXVpcmUgJ3J1YnlnZW1zJworcmVxdWlyZSAnc2luYXRyYScKK3JlcXVpcmUgJ2pzb24nCitzZXQgOnBvcnQsIDMxMjQKK3NldCA6ZW52aXJvbm1lbnQsIDpwcm9kdWN0aW9uCitlbmFibGUgOmxvY2sKK0Rpci5jaGRpcihGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi8uLiIpCisKK3Bvc3QgIi8iIGRvCisgIHB1dHMgIlJlY2VpdmVkIHBheWxvYWQhIgorICBwdXRzICJSZXY6ICN7YGdpdCBuYW1lLXJldiBIRUFEYC5zdHJpcH0iCisgIHN5c3RlbSAle3Jha2UgaGFuZGxlX3VwZGF0ZSAtLXRyYWNlIFJFRj0je0pTT04ucGFyc2UocGFyYW1zWyJwYXlsb2FkIl0pWyJyZWYiXS5pbnNwZWN0fX0KK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9pbml0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9pbml0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhM2JjZWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2luaXQucmIKQEAgLTAsMCArMSwxOCBAQAorYmVnaW4KKyAgcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJ2xpYicsICdzYXNzJykgIyBGcm9tIGhlcmUKK3Jlc2N1ZSBMb2FkRXJyb3IKKyAgYmVnaW4KKyAgICByZXF1aXJlICdzYXNzJyAjIEZyb20gZ2VtCisgIHJlc2N1ZSBMb2FkRXJyb3IgPT4gZQorICAgICMgZ2VtczppbnN0YWxsIG1heSBiZSBydW4gdG8gaW5zdGFsbCBIYW1sIHdpdGggdGhlIHNrZWxldG9uIHBsdWdpbgorICAgICMgYnV0IG5vdCB0aGUgZ2VtIGl0c2VsZiBpbnN0YWxsZWQuCisgICAgIyBEb24ndCBkaWUgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKyAgICByYWlzZSBlIHVubGVzcyBkZWZpbmVkPyhSYWtlKSAmJgorICAgICAgKFJha2UuYXBwbGljYXRpb24udG9wX2xldmVsX3Rhc2tzLmluY2x1ZGU/KCdnZW1zJykgfHwKKyAgICAgICAgUmFrZS5hcHBsaWNhdGlvbi50b3BfbGV2ZWxfdGFza3MuaW5jbHVkZT8oJ2dlbXM6aW5zdGFsbCcpKQorICBlbmQKK2VuZAorCisjIExvYWQgU2Fzcy4KKyMgU2FzcyBtYXkgYmUgdW5kZWZpbmVkIGlmIHdlJ3JlIHJ1bm5pbmcgZ2VtczppbnN0YWxsLgorcmVxdWlyZSAnc2Fzcy9wbHVnaW4nIGlmIGRlZmluZWQ/KFNhc3MpCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTY5YmMzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy5yYgpAQCAtMCwwICsxLDEwMiBAQAorZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKQorJExPQURfUEFUSC51bnNoaWZ0IGRpciB1bmxlc3MgJExPQURfUEFUSC5pbmNsdWRlPyhkaXIpCisKK3JlcXVpcmUgJ3Nhc3MvdmVyc2lvbicKKworIyBUaGUgbW9kdWxlIHRoYXQgY29udGFpbnMgZXZlcnl0aGluZyBTYXNzLXJlbGF0ZWQ6CisjCisjICoge1Nhc3M6OkVuZ2luZX0gaXMgdGhlIGNsYXNzIHVzZWQgdG8gcmVuZGVyIFNhc3MvU0NTUyB3aXRoaW4gUnVieSBjb2RlLgorIyAqIHtTYXNzOjpQbHVnaW59IGlzIGludGVyZmFjZXMgd2l0aCB3ZWIgZnJhbWV3b3JrcyAoUmFpbHMgYW5kIE1lcmIgaW4gcGFydGljdWxhcikuCisjICoge1Nhc3M6OlN5bnRheEVycm9yfSBpcyByYWlzZWQgd2hlbiBTYXNzIGVuY291bnRlcnMgYW4gZXJyb3IuCisjICoge1Nhc3M6OkNTU30gaGFuZGxlcyBjb252ZXJzaW9uIG9mIENTUyB0byBTYXNzLgorIworIyBBbHNvIHNlZSB0aGUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQgZnVsbCBTYXNzIHJlZmVyZW5jZX0uCittb2R1bGUgU2FzcworICBjbGFzcyA8PCBzZWxmCisgICAgIyBAcHJpdmF0ZQorICAgIGF0dHJfYWNjZXNzb3IgOnRlc3RzX3J1bm5pbmcKKyAgZW5kCisKKyAgIyBUaGUgZ2xvYmFsIGxvYWQgcGF0aHMgZm9yIFNhc3MgZmlsZXMuIFRoaXMgaXMgbWVhbnQgZm9yIHBsdWdpbnMgYW5kCisgICMgbGlicmFyaWVzIHRvIHJlZ2lzdGVyIHRoZSBwYXRocyB0byB0aGVpciBTYXNzIHN0eWxlc2hlZXRzIHRvIHRoYXQgdGhleSBtYXkKKyAgIyBiZSBgQGltcG9ydGVkYC4gVGhpcyBsb2FkIHBhdGggaXMgdXNlZCBieSBldmVyeSBpbnN0YW5jZSBvZiB7U2Fzczo6RW5naW5lfS4KKyAgIyBUaGV5IGFyZSBsb3dlci1wcmVjZWRlbmNlIHRoYW4gYW55IGxvYWQgcGF0aHMgcGFzc2VkIGluIHZpYSB0aGUKKyAgIyB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNsb2FkX3BhdGhzLW9wdGlvbiBgOmxvYWRfcGF0aHNgIG9wdGlvbn0uCisgICMKKyAgIyBJZiB0aGUgYFNBU1NfUEFUSGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LAorICAjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGBsb2FkX3BhdGhzYCB3aWxsIGJlIGluaXRpYWxpemVkIGJhc2VkIG9uIHRoYXQuCisgICMgVGhlIHZhcmlhYmxlIHNob3VsZCBiZSBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHBhdGggbmFtZXMKKyAgIyAoc2VtaWNvbG9uLXNlcGFyYXRlZCBvbiBXaW5kb3dzKS4KKyAgIworICAjIE5vdGUgdGhhdCBmaWxlcyBvbiB0aGUgZ2xvYmFsIGxvYWQgcGF0aCBhcmUgbmV2ZXIgY29tcGlsZWQgdG8gQ1NTCisgICMgdGhlbXNlbHZlcywgZXZlbiBpZiB0aGV5IGFyZW4ndCBwYXJ0aWFscy4gVGhleSBleGlzdCBvbmx5IHRvIGJlIGltcG9ydGVkLgorICAjCisgICMgQGV4YW1wbGUKKyAgIyAgIFNhc3MubG9hZF9wYXRocyA8PCBGaWxlLmRpcm5hbWUoX19GSUxFX18gKyAnL3Nhc3MnKQorICAjIEByZXR1cm4gW0FycmF5PFN0cmluZywgUGF0aG5hbWUsIFNhc3M6OkltcG9ydGVyczo6QmFzZT5dCisgIGRlZiBzZWxmLmxvYWRfcGF0aHMKKyAgICBAbG9hZF9wYXRocyB8fD0gaWYgRU5WWydTQVNTX1BBVEgnXQorICAgICAgICAgICAgICAgICAgICAgIEVOVlsnU0FTU19QQVRIJ10uc3BsaXQoU2Fzczo6VXRpbC53aW5kb3dzPyA/ICc7JyA6ICc6JykKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIFtdCisgICAgICAgICAgICAgICAgICAgIGVuZAorICBlbmQKKworICAjIENvbXBpbGUgYSBTYXNzIG9yIFNDU1Mgc3RyaW5nIHRvIENTUy4KKyAgIyBEZWZhdWx0cyB0byBTQ1NTLgorICAjCisgICMgQHBhcmFtIGNvbnRlbnRzIFtTdHJpbmddIFRoZSBjb250ZW50cyBvZiB0aGUgU2FzcyBmaWxlLgorICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIEFuIG9wdGlvbnMgaGFzaDsKKyAgIyAgIHNlZSB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNPcHRpb25zIHRoZSBTYXNzIG9wdGlvbnMgZG9jdW1lbnRhdGlvbn0KKyAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGVyZSdzIGFuIGVycm9yIGluIHRoZSBkb2N1bWVudAorICAjIEByYWlzZSBbRW5jb2Rpbmc6OlVuZGVmaW5lZENvbnZlcnNpb25FcnJvcl0gaWYgdGhlIHNvdXJjZSBlbmNvZGluZworICAjICAgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBVVEYtOAorICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgdGhlIGRvY3VtZW50IHVzZXMgYW4gdW5rbm93biBlbmNvZGluZyB3aXRoIGBAY2hhcnNldGAKKyAgZGVmIHNlbGYuY29tcGlsZShjb250ZW50cywgb3B0aW9ucyA9IHt9KQorICAgIG9wdGlvbnNbOnN5bnRheF0gfHw9IDpzY3NzCisgICAgRW5naW5lLm5ldyhjb250ZW50cywgb3B0aW9ucykudG9fY3NzCisgIGVuZAorCisgICMgQ29tcGlsZSBhIGZpbGUgb24gZGlzayB0byBDU1MuCisgICMKKyAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGVyZSdzIGFuIGVycm9yIGluIHRoZSBkb2N1bWVudAorICAjIEByYWlzZSBbRW5jb2Rpbmc6OlVuZGVmaW5lZENvbnZlcnNpb25FcnJvcl0gaWYgdGhlIHNvdXJjZSBlbmNvZGluZworICAjICAgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBVVEYtOAorICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgdGhlIGRvY3VtZW50IHVzZXMgYW4gdW5rbm93biBlbmNvZGluZyB3aXRoIGBAY2hhcnNldGAKKyAgIworICAjIEBvdmVybG9hZCBjb21waWxlX2ZpbGUoZmlsZW5hbWUsIG9wdGlvbnMgPSB7fSkKKyAgIyAgIFJldHVybiB0aGUgY29tcGlsZWQgQ1NTIHJhdGhlciB0aGFuIHdyaXRpbmcgaXQgdG8gYSBmaWxlLgorICAjCisgICMgICBAcGFyYW0gZmlsZW5hbWUgW1N0cmluZ10gVGhlIHBhdGggdG8gdGhlIFNhc3MsIFNDU1MsIG9yIENTUyBmaWxlIG9uIGRpc2suCisgICMgICBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBBbiBvcHRpb25zIGhhc2g7CisgICMgICAgIHNlZSB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNPcHRpb25zIHRoZSBTYXNzIG9wdGlvbnMgZG9jdW1lbnRhdGlvbn0KKyAgIyAgIEByZXR1cm4gW1N0cmluZ10gVGhlIGNvbXBpbGVkIENTUy4KKyAgIworICAjIEBvdmVybG9hZCBjb21waWxlX2ZpbGUoZmlsZW5hbWUsIGNzc19maWxlbmFtZSwgb3B0aW9ucyA9IHt9KQorICAjICAgV3JpdGUgdGhlIGNvbXBpbGVkIENTUyB0byBhIGZpbGUuCisgICMKKyAgIyAgIEBwYXJhbSBmaWxlbmFtZSBbU3RyaW5nXSBUaGUgcGF0aCB0byB0aGUgU2FzcywgU0NTUywgb3IgQ1NTIGZpbGUgb24gZGlzay4KKyAgIyAgIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIEFuIG9wdGlvbnMgaGFzaDsKKyAgIyAgICAgc2VlIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI09wdGlvbnMgdGhlIFNhc3Mgb3B0aW9ucyBkb2N1bWVudGF0aW9ufQorICAjICAgQHBhcmFtIGNzc19maWxlbmFtZSBbU3RyaW5nXSBUaGUgbG9jYXRpb24gdG8gd2hpY2ggdG8gd3JpdGUgdGhlIGNvbXBpbGVkIENTUy4KKyAgZGVmIHNlbGYuY29tcGlsZV9maWxlKGZpbGVuYW1lLCAqYXJncykKKyAgICBvcHRpb25zID0gYXJncy5sYXN0LmlzX2E/KEhhc2gpID8gYXJncy5wb3AgOiB7fQorICAgIGNzc19maWxlbmFtZSA9IGFyZ3Muc2hpZnQKKyAgICByZXN1bHQgPSBTYXNzOjpFbmdpbmUuZm9yX2ZpbGUoZmlsZW5hbWUsIG9wdGlvbnMpLnJlbmRlcgorICAgIGlmIGNzc19maWxlbmFtZQorICAgICAgb3B0aW9uc1s6Y3NzX2ZpbGVuYW1lXSB8fD0gY3NzX2ZpbGVuYW1lCisgICAgICBvcGVuKGNzc19maWxlbmFtZSwgInciKSB7fGNzc19maWxlfCBjc3NfZmlsZS53cml0ZShyZXN1bHQpfQorICAgICAgbmlsCisgICAgZWxzZQorICAgICAgcmVzdWx0CisgICAgZW5kCisgIGVuZAorZW5kCisKK3JlcXVpcmUgJ3Nhc3MvbG9nZ2VyJworcmVxdWlyZSAnc2Fzcy91dGlsJworCityZXF1aXJlICdzYXNzL2VuZ2luZScKK3JlcXVpcmUgJ3Nhc3MvcGx1Z2luJyBpZiBkZWZpbmVkPyhNZXJiOjpQbHVnaW5zKQorcmVxdWlyZSAnc2Fzcy9yYWlsdGllJworcmVxdWlyZSAnc2Fzcy9mZWF0dXJlcycKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY2FjaGVfc3RvcmVzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWNoZV9zdG9yZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyNTliMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY2FjaGVfc3RvcmVzLnJiCkBAIC0wLDAgKzEsMTUgQEAKK3JlcXVpcmUgJ3N0cmluZ2lvJworCittb2R1bGUgU2FzcworICAjIFNhc3MgY2FjaGUgc3RvcmVzIGFyZSBpbiBjaGFyZ2Ugb2Ygc3RvcmluZyBjYWNoZWQgaW5mb3JtYXRpb24sCisgICMgZXNwZWNpYWxseSBwYXJzZSB0cmVlcyBmb3IgU2FzcyBkb2N1bWVudHMuCisgICMKKyAgIyBVc2VyLWNyZWF0ZWQgaW1wb3J0ZXJzIG11c3QgaW5oZXJpdCBmcm9tIHtDYWNoZVN0b3Jlczo6QmFzZX0uCisgIG1vZHVsZSBDYWNoZVN0b3JlcworICBlbmQKK2VuZAorCityZXF1aXJlICdzYXNzL2NhY2hlX3N0b3Jlcy9iYXNlJworcmVxdWlyZSAnc2Fzcy9jYWNoZV9zdG9yZXMvZmlsZXN5c3RlbScKK3JlcXVpcmUgJ3Nhc3MvY2FjaGVfc3RvcmVzL21lbW9yeScKK3JlcXVpcmUgJ3Nhc3MvY2FjaGVfc3RvcmVzL2NoYWluJwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWNoZV9zdG9yZXMvYmFzZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY2FjaGVfc3RvcmVzL2Jhc2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzOTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY2FjaGVfc3RvcmVzL2Jhc2UucmIKQEAgLTAsMCArMSw4OCBAQAorbW9kdWxlIFNhc3MKKyAgbW9kdWxlIENhY2hlU3RvcmVzCisgICAgIyBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBiYWNrZW5kcyBmb3IgdGhlIFNhc3MgY2FjaGUuCisgICAgIyBBbnkga2V5LXZhbHVlIHN0b3JlIGNhbiBhY3QgYXMgc3VjaCBhIGJhY2tlbmQ7CisgICAgIyBpdCBqdXN0IG5lZWRzIHRvIGltcGxlbWVudCB0aGUKKyAgICAjIFx7I19zdG9yZX0gYW5kIFx7I19yZXRyaWV2ZX0gbWV0aG9kcy4KKyAgICAjCisgICAgIyBUbyB1c2UgYSBjYWNoZSBzdG9yZSB3aXRoIFNhc3MsCisgICAgIyB1c2UgdGhlIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI2NhY2hlX3N0b3JlLW9wdGlvbiBgOmNhY2hlX3N0b3JlYCBvcHRpb259LgorICAgICMKKyAgICAjIEBhYnN0cmFjdAorICAgIGNsYXNzIEJhc2UKKyAgICAgICMgU3RvcmUgY2FjaGVkIGNvbnRlbnRzIGZvciBsYXRlciByZXRyaWV2YWwKKyAgICAgICMgTXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgQ2FjaGVTdG9yZSBzdWJjbGFzc2VzCisgICAgICAjCisgICAgICAjIE5vdGU6IGNhY2hlIGNvbnRlbnRzIGNvbnRhaW4gYmluYXJ5IGRhdGEuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBrZXkgW1N0cmluZ10gVGhlIGtleSB0byBzdG9yZSB0aGUgY29udGVudHMgdW5kZXIKKyAgICAgICMgQHBhcmFtIHZlcnNpb24gW1N0cmluZ10gVGhlIGN1cnJlbnQgc2FzcyB2ZXJzaW9uLgorICAgICAgIyAgICAgICAgICAgICAgICBDYWNoZWQgY29udGVudHMgbXVzdCBub3QgYmUgcmV0cmlldmVkIGFjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2Ygc2Fzcy4KKyAgICAgICMgQHBhcmFtIHNoYSBbU3RyaW5nXSBUaGUgc2hhIG9mIHRoZSBzYXNzIHNvdXJjZS4KKyAgICAgICMgICAgICAgICAgICAgICAgQ2FjaGVkIGNvbnRlbnRzIG11c3Qgbm90IGJlIHJldHJpZXZlZCBpZiB0aGUgc2hhIGhhcyBjaGFuZ2VkLgorICAgICAgIyBAcGFyYW0gY29udGVudHMgW1N0cmluZ10gVGhlIGNvbnRlbnRzIHRvIHN0b3JlLgorICAgICAgZGVmIF9zdG9yZShrZXksIHZlcnNpb24sIHNoYSwgY29udGVudHMpCisgICAgICAgIHJhaXNlICIje3NlbGYuY2xhc3N9IG11c3QgaW1wbGVtZW50ICNfc3RvcmUuIgorICAgICAgZW5kCisKKyAgICAgICMgUmV0cmlldmVkIGNhY2hlZCBjb250ZW50cy4KKyAgICAgICMgTXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgc3ViY2xhc3Nlcy4KKyAgICAgICMKKyAgICAgICMgTm90ZTogaWYgdGhlIGtleSBleGlzdHMgYnV0IHRoZSBzaGEgb3IgdmVyc2lvbiBoYXZlIGNoYW5nZWQsCisgICAgICAjIHRoZW4gdGhlIGtleSBtYXkgYmUgZGVsZXRlZCBieSB0aGUgY2FjaGUgc3RvcmUsIGlmIGl0IHdhbnRzIHRvIGRvIHNvLgorICAgICAgIworICAgICAgIyBAcGFyYW0ga2V5IFtTdHJpbmddIFRoZSBrZXkgdG8gcmV0cmlldmUKKyAgICAgICMgQHBhcmFtIHZlcnNpb24gW1N0cmluZ10gVGhlIGN1cnJlbnQgc2FzcyB2ZXJzaW9uLgorICAgICAgIyAgICAgICAgICAgICAgICBDYWNoZWQgY29udGVudHMgbXVzdCBub3QgYmUgcmV0cmlldmVkIGFjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2Ygc2Fzcy4KKyAgICAgICMgQHBhcmFtIHNoYSBbU3RyaW5nXSBUaGUgc2hhIG9mIHRoZSBzYXNzIHNvdXJjZS4KKyAgICAgICMgICAgICAgICAgICAgICAgQ2FjaGVkIGNvbnRlbnRzIG11c3Qgbm90IGJlIHJldHJpZXZlZCBpZiB0aGUgc2hhIGhhcyBjaGFuZ2VkLgorICAgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBjb250ZW50cyB0aGF0IHdlcmUgcHJldmlvdXNseSBzdG9yZWQuCisgICAgICAjIEByZXR1cm4gW05pbENsYXNzXSB3aGVuIHRoZSBjYWNoZSBrZXkgaXMgbm90IGZvdW5kIG9yIHRoZSB2ZXJzaW9uIG9yIHNoYSBoYXZlIGNoYW5nZWQuCisgICAgICBkZWYgX3JldHJpZXZlKGtleSwgdmVyc2lvbiwgc2hhKQorICAgICAgICByYWlzZSAiI3tzZWxmLmNsYXNzfSBtdXN0IGltcGxlbWVudCAjX3JldHJpZXZlLiIKKyAgICAgIGVuZAorCisgICAgICAjIFN0b3JlIGEge1Nhc3M6OlRyZWU6OlJvb3ROb2RlfS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGtleSBbU3RyaW5nXSBUaGUga2V5IHRvIHN0b3JlIGl0IHVuZGVyLgorICAgICAgIyBAcGFyYW0gc2hhIFtTdHJpbmddIFRoZSBjaGVja3N1bSBmb3IgdGhlIGNvbnRlbnRzIHRoYXQgYXJlIGJlaW5nIHN0b3JlZC4KKyAgICAgICMgQHBhcmFtIHJvb3QgW09iamVjdF0gVGhlIHJvb3Qgbm9kZSB0byBjYWNoZS4KKyAgICAgIGRlZiBzdG9yZShrZXksIHNoYSwgcm9vdCkKKyAgICAgICAgX3N0b3JlKGtleSwgU2Fzczo6VkVSU0lPTiwgc2hhLCBNYXJzaGFsLmR1bXAocm9vdCkpCisgICAgICByZXNjdWUgVHlwZUVycm9yLCBMb2FkRXJyb3IgPT4gZQorICAgICAgICBTYXNzOjpVdGlsLnNhc3Nfd2FybiAiV2FybmluZy4gRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgc2F2aW5nIGNhY2hlICN7cGF0aF90byhrZXkpfTogI3tlfSIKKyAgICAgICAgbmlsCisgICAgICBlbmQKKworICAgICAgIyBSZXRyaWV2ZSBhIHtTYXNzOjpUcmVlOjpSb290Tm9kZX0uCisgICAgICAjCisgICAgICAjIEBwYXJhbSBrZXkgW1N0cmluZ10gVGhlIGtleSB0aGUgcm9vdCBlbGVtZW50IHdhcyBzdG9yZWQgdW5kZXIuCisgICAgICAjIEBwYXJhbSBzaGEgW1N0cmluZ10gVGhlIGNoZWNrc3VtIG9mIHRoZSByb290IGVsZW1lbnQncyBjb250ZW50LgorICAgICAgIyBAcmV0dXJuIFtPYmplY3RdIFRoZSBjYWNoZWQgb2JqZWN0LgorICAgICAgZGVmIHJldHJpZXZlKGtleSwgc2hhKQorICAgICAgICBjb250ZW50cyA9IF9yZXRyaWV2ZShrZXksIFNhc3M6OlZFUlNJT04sIHNoYSkKKyAgICAgICAgTWFyc2hhbC5sb2FkKGNvbnRlbnRzKSBpZiBjb250ZW50cworICAgICAgcmVzY3VlIEVPRkVycm9yLCBUeXBlRXJyb3IsIEFyZ3VtZW50RXJyb3IsIExvYWRFcnJvciA9PiBlCisgICAgICAgIFNhc3M6OlV0aWwuc2Fzc193YXJuICJXYXJuaW5nLiBFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSByZWFkaW5nIGNhY2hlICN7cGF0aF90byhrZXkpfTogI3tlfSIKKyAgICAgICAgbmlsCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm4gdGhlIGtleSBmb3IgdGhlIHNhc3MgZmlsZS4KKyAgICAgICMKKyAgICAgICMgVGhlIGAoc2Fzc19kaXJuYW1lLCBzYXNzX2Jhc2VuYW1lKWAgcGFpcgorICAgICAgIyBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIFNhc3MgZG9jdW1lbnQsCisgICAgICAjIGJ1dCBvdGhlcndpc2UgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGVpciBjb250ZW50LgorICAgICAgIworICAgICAgIyBAcGFyYW0gc2Fzc19kaXJuYW1lIFtTdHJpbmddCisgICAgICAjICAgVGhlIGZ1bGx5LWV4cGFuZGVkIGxvY2F0aW9uIG9mIHRoZSBTYXNzIGZpbGUuCisgICAgICAjICAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZGlyZWN0b3J5IG5hbWUgb24gYSBmaWxlc3lzdGVtLgorICAgICAgIyBAcGFyYW0gc2Fzc19iYXNlbmFtZSBbU3RyaW5nXSBUaGUgbmFtZSBvZiB0aGUgU2FzcyBmaWxlIHRoYXQgaXMgYmVpbmcgcmVmZXJlbmNlZC4KKyAgICAgICMgICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiYXNlbmFtZSBvbiBhIGZpbGVzeXN0ZW0uCisgICAgICBkZWYga2V5KHNhc3NfZGlybmFtZSwgc2Fzc19iYXNlbmFtZSkKKyAgICAgICAgZGlyID0gRGlnZXN0OjpTSEExLmhleGRpZ2VzdChzYXNzX2Rpcm5hbWUpCisgICAgICAgIGZpbGVuYW1lID0gIiN7c2Fzc19iYXNlbmFtZX1jIgorICAgICAgICAiI3tkaXJ9LyN7ZmlsZW5hbWV9IgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2NhY2hlX3N0b3Jlcy9jaGFpbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY2FjaGVfc3RvcmVzL2NoYWluLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNGMxMTEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2NhY2hlX3N0b3Jlcy9jaGFpbi5yYgpAQCAtMCwwICsxLDM0IEBACittb2R1bGUgU2FzcworICBtb2R1bGUgQ2FjaGVTdG9yZXMKKyAgICAjIEEgbWV0YS1jYWNoZSB0aGF0IGNoYWlucyBtdWx0aXBsZSBjYWNoZXMgdG9nZXRoZXIuCisgICAgIyBTcGVjaWZpY2FsbHk6CisgICAgIworICAgICMgKiBBbGwgYCNzdG9yZWBzIGFyZSBwYXNzZWQgdG8gYWxsIGNhY2hlcy4KKyAgICAjICogYCNyZXRyaWV2ZWBzIGFyZSBwYXNzZWQgdG8gZWFjaCBjYWNoZSB1bnRpbCBvbmUgaGFzIGEgaGl0LgorICAgICMgKiBXaGVuIG9uZSBjYWNoZSBoYXMgYSBoaXQsIHRoZSB2YWx1ZSBpcyBgI3N0b3JlYGQgaW4gYWxsIGVhcmxpZXIgY2FjaGVzLgorICAgIGNsYXNzIENoYWluIDwgQmFzZQorICAgICAgIyBDcmVhdGUgYSBuZXcgY2FjaGUgY2hhaW5pbmcgdGhlIGdpdmVuIGNhY2hlcy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGNhY2hlcyBbQXJyYXk8U2Fzczo6Q2FjaGVTdG9yZXM6OkJhc2U+XSBUaGUgY2FjaGVzIHRvIGNoYWluLgorICAgICAgZGVmIGluaXRpYWxpemUoKmNhY2hlcykKKyAgICAgICAgQGNhY2hlcyA9IGNhY2hlcworICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBCYXNlI3N0b3JlCisgICAgICBkZWYgc3RvcmUoa2V5LCBzaGEsIG9iaikKKyAgICAgICAgQGNhY2hlcy5lYWNoIHt8Y3wgYy5zdG9yZShrZXksIHNoYSwgb2JqKX0KKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQmFzZSNyZXRyaWV2ZQorICAgICAgZGVmIHJldHJpZXZlKGtleSwgc2hhKQorICAgICAgICBAY2FjaGVzLmVhY2hfd2l0aF9pbmRleCBkbyB8YywgaXwKKyAgICAgICAgICBvYmogPSBjLnJldHJpZXZlKGtleSwgc2hhKQorICAgICAgICAgIG5leHQgdW5sZXNzIG9iagorICAgICAgICAgIEBjYWNoZXNbMC4uLmldLmVhY2gge3xwcmV2fCBwcmV2LnN0b3JlKGtleSwgc2hhLCBvYmopfQorICAgICAgICAgIHJldHVybiBvYmoKKyAgICAgICAgZW5kCisgICAgICAgIG5pbAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2NhY2hlX3N0b3Jlcy9maWxlc3lzdGVtLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWNoZV9zdG9yZXMvZmlsZXN5c3RlbS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDBmNWYxCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWNoZV9zdG9yZXMvZmlsZXN5c3RlbS5yYgpAQCAtMCwwICsxLDYwIEBACityZXF1aXJlICdmaWxldXRpbHMnCisKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBDYWNoZVN0b3JlcworICAgICMgQSBiYWNrZW5kIGZvciB0aGUgU2FzcyBjYWNoZSB1c2luZyB0aGUgZmlsZXN5c3RlbS4KKyAgICBjbGFzcyBGaWxlc3lzdGVtIDwgQmFzZQorICAgICAgIyBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjYWNoZWQgZmlsZXMgd2lsbCBiZSBzdG9yZWQuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgIGF0dHJfYWNjZXNzb3IgOmNhY2hlX2xvY2F0aW9uCisKKyAgICAgICMgQHBhcmFtIGNhY2hlX2xvY2F0aW9uIFtTdHJpbmddIHNlZSBceyNjYWNoZVxfbG9jYXRpb259CisgICAgICBkZWYgaW5pdGlhbGl6ZShjYWNoZV9sb2NhdGlvbikKKyAgICAgICAgQGNhY2hlX2xvY2F0aW9uID0gY2FjaGVfbG9jYXRpb24KKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQmFzZSNcX3JldHJpZXZlCisgICAgICBkZWYgX3JldHJpZXZlKGtleSwgdmVyc2lvbiwgc2hhKQorICAgICAgICByZXR1cm4gdW5sZXNzIEZpbGUucmVhZGFibGU/KHBhdGhfdG8oa2V5KSkKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBGaWxlLm9wZW4ocGF0aF90byhrZXkpLCAicmIiKSBkbyB8ZnwKKyAgICAgICAgICAgIGlmIGYucmVhZGxpbmUoIlxuIikuc3RyaXAgPT0gdmVyc2lvbiAmJiBmLnJlYWRsaW5lKCJcbiIpLnN0cmlwID09IHNoYQorICAgICAgICAgICAgICByZXR1cm4gZi5yZWFkCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBGaWxlLnVubGluayBwYXRoX3RvKGtleSkKKyAgICAgICAgcmVzY3VlIEVycm5vOjpFTk9FTlQKKyAgICAgICAgICAjIEFscmVhZHkgZGVsZXRlZC4gUmFjZSBjb25kaXRpb24/CisgICAgICAgIGVuZAorICAgICAgICBuaWwKKyAgICAgIHJlc2N1ZSBFT0ZFcnJvciwgVHlwZUVycm9yLCBBcmd1bWVudEVycm9yID0+IGUKKyAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gIldhcm5pbmcuIEVycm9yIGVuY291bnRlcmVkIHdoaWxlIHJlYWRpbmcgY2FjaGUgI3twYXRoX3RvKGtleSl9OiAje2V9IgorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBCYXNlI1xfc3RvcmUKKyAgICAgIGRlZiBfc3RvcmUoa2V5LCB2ZXJzaW9uLCBzaGEsIGNvbnRlbnRzKQorICAgICAgICBjb21waWxlZF9maWxlbmFtZSA9IHBhdGhfdG8oa2V5KQorICAgICAgICBGaWxlVXRpbHMubWtkaXJfcChGaWxlLmRpcm5hbWUoY29tcGlsZWRfZmlsZW5hbWUpKQorICAgICAgICBTYXNzOjpVdGlsLmF0b21pY19jcmVhdGVfYW5kX3dyaXRlX2ZpbGUoY29tcGlsZWRfZmlsZW5hbWUpIGRvIHxmfAorICAgICAgICAgIGYucHV0cyh2ZXJzaW9uKQorICAgICAgICAgIGYucHV0cyhzaGEpCisgICAgICAgICAgZi53cml0ZShjb250ZW50cykKKyAgICAgICAgZW5kCisgICAgICByZXNjdWUgRXJybm86OkVBQ0NFUworICAgICAgICAjIHBhc3MKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgICMgUmV0dXJucyB0aGUgcGF0aCB0byBhIGZpbGUgZm9yIHRoZSBnaXZlbiBrZXkuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBrZXkgW1N0cmluZ10KKyAgICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgcGF0aCB0byB0aGUgY2FjaGUgZmlsZS4KKyAgICAgIGRlZiBwYXRoX3RvKGtleSkKKyAgICAgICAga2V5ID0ga2V5LmdzdWIoL1s8PjpcXHw/KiVdLykge3xjfCAiJSUlMDNkIiAlIGMub3JkfQorICAgICAgICBGaWxlLmpvaW4oY2FjaGVfbG9jYXRpb24sIGtleSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWNoZV9zdG9yZXMvbWVtb3J5LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWNoZV9zdG9yZXMvbWVtb3J5LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjY0YmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2NhY2hlX3N0b3Jlcy9tZW1vcnkucmIKQEAgLTAsMCArMSw0NiBAQAorbW9kdWxlIFNhc3MKKyAgbW9kdWxlIENhY2hlU3RvcmVzCisgICAgIyBBIGJhY2tlbmQgZm9yIHRoZSBTYXNzIGNhY2hlIHVzaW5nIGluLXByb2Nlc3MgbWVtb3J5LgorICAgIGNsYXNzIE1lbW9yeSA8IEJhc2UKKyAgICAgICMgU2luY2UgdGhlIHtNZW1vcnl9IHN0b3JlIGlzIHN0b3JlZCBpbiB0aGUgU2FzcyB0cmVlJ3Mgb3B0aW9ucyBoYXNoLAorICAgICAgIyB3aGVuIHRoZSBvcHRpb25zIGdldCBzZXJpYWxpemVkIGFzIHBhcnQgb2Ygc2VyaWFsaXppbmcgdGhlIHRyZWUsCisgICAgICAjIHlvdSBnZXQgY3JhenkgZXhwb25lbnRpYWwgZ3Jvd3RoIGluIHRoZSBzaXplIG9mIHRoZSBjYWNoZWQgb2JqZWN0cworICAgICAgIyB1bmxlc3MgeW91IGRvbid0IGR1bXAgdGhlIGNhY2hlLgorICAgICAgIworICAgICAgIyBAcHJpdmF0ZQorICAgICAgZGVmIF9kdW1wKGRlcHRoKQorICAgICAgICAiIgorICAgICAgZW5kCisKKyAgICAgICMgSWYgd2UgZGVzZXJpYWxpemUgdGhpcyBjbGFzcywganVzdCBtYWtlIGEgbmV3IGVtcHR5IG9uZS4KKyAgICAgICMKKyAgICAgICMgQHByaXZhdGUKKyAgICAgIGRlZiBzZWxmLl9sb2FkKHJlcHIpCisgICAgICAgIE1lbW9yeS5uZXcKKyAgICAgIGVuZAorCisgICAgICAjIENyZWF0ZSBhIG5ldywgZW1wdHkgY2FjaGUgc3RvcmUuCisgICAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgICBAY29udGVudHMgPSB7fQorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBCYXNlI3JldHJpZXZlCisgICAgICBkZWYgcmV0cmlldmUoa2V5LCBzaGEpCisgICAgICAgIHJldHVybiB1bmxlc3MgQGNvbnRlbnRzLmhhc19rZXk/KGtleSkKKyAgICAgICAgcmV0dXJuIHVubGVzcyBAY29udGVudHNba2V5XVs6c2hhXSA9PSBzaGEKKyAgICAgICAgb2JqID0gQGNvbnRlbnRzW2tleV1bOm9ial0KKyAgICAgICAgb2JqLnJlc3BvbmRfdG8/KDpkZWVwX2NvcHkpID8gb2JqLmRlZXBfY29weSA6IG9iai5kdXAKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQmFzZSNzdG9yZQorICAgICAgZGVmIHN0b3JlKGtleSwgc2hhLCBvYmopCisgICAgICAgIEBjb250ZW50c1trZXldID0gezpzaGEgPT4gc2hhLCA6b2JqID0+IG9ian0KKyAgICAgIGVuZAorCisgICAgICAjIERlc3RydWN0aXZlbHkgY2xlYXIgdGhlIGNhY2hlLgorICAgICAgZGVmIHJlc2V0IQorICAgICAgICBAY29udGVudHMgPSB7fQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2NhY2hlX3N0b3Jlcy9udWxsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWNoZV9zdG9yZXMvbnVsbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRmNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWNoZV9zdG9yZXMvbnVsbC5yYgpAQCAtMCwwICsxLDI1IEBACittb2R1bGUgU2FzcworICBtb2R1bGUgQ2FjaGVTdG9yZXMKKyAgICAjIERvZXNuJ3Qgc3RvcmUgYW55dGhpbmcsIGJ1dCByZWNvcmRzIHdoYXQgdGhpbmdzIGl0IHNob3VsZCBoYXZlIHN0b3JlZC4KKyAgICAjIFRoaXMgZG9lc24ndCBjdXJyZW50bHkgaGF2ZSBhbnkgdXNlIGV4Y2VwdCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgorICAgICMKKyAgICAjIEBwcml2YXRlCisgICAgY2xhc3MgTnVsbCA8IEJhc2UKKyAgICAgIGRlZiBpbml0aWFsaXplCisgICAgICAgIEBrZXlzID0ge30KKyAgICAgIGVuZAorCisgICAgICBkZWYgX3JldHJpZXZlKGtleSwgdmVyc2lvbiwgc2hhKQorICAgICAgICBuaWwKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3N0b3JlKGtleSwgdmVyc2lvbiwgc2hhLCBjb250ZW50cykKKyAgICAgICAgQGtleXNba2V5XSA9IHRydWUKKyAgICAgIGVuZAorCisgICAgICBkZWYgd2FzX3NldD8oa2V5KQorICAgICAgICBAa2V5c1trZXldCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY2FsbGJhY2tzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jYWxsYmFja3MucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzYTUwOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY2FsbGJhY2tzLnJiCkBAIC0wLDAgKzEsNjcgQEAKK21vZHVsZSBTYXNzCisgICMgQSBsaWdodHdlaWdodCBpbmZyYXN0cnVjdHVyZSBmb3IgZGVmaW5pbmcgYW5kIHJ1bm5pbmcgY2FsbGJhY2tzLgorICAjIENhbGxiYWNrcyBhcmUgZGVmaW5lZCB1c2luZyBceyNkZWZpbmVcX2NhbGxiYWNrXH0gYXQgdGhlIGNsYXNzIGxldmVsLAorICAjIGFuZCBjYWxsZWQgdXNpbmcgYHJ1bl8je25hbWV9YCBhdCB0aGUgaW5zdGFuY2UgbGV2ZWwuCisgICMKKyAgIyBDbGllbnRzIGNhbiBhZGQgY2FsbGJhY2tzIGJ5IGNhbGxpbmcgdGhlIGdlbmVyYXRlZCBgb25fI3tuYW1lfWAgbWV0aG9kLAorICAjIGFuZCBwYXNzaW5nIGluIGEgYmxvY2sgdGhhdCdzIHJ1biB3aGVuIHRoZSBjYWxsYmFjayBpcyBhY3RpdmF0ZWQuCisgICMKKyAgIyBAZXhhbXBsZSBEZWZpbmUgYSBjYWxsYmFjaworICAjICAgY2xhc3MgTXVuZ2VyCisgICMgICAgIGV4dGVuZCBTYXNzOjpDYWxsYmFja3MKKyAgIyAgICAgZGVmaW5lX2NhbGxiYWNrIDpzdHJpbmdfbXVuZ2VkCisgICMKKyAgIyAgICAgZGVmIG11bmdlKHN0cikKKyAgIyAgICAgICByZXMgPSBzdHIuZ3N1YigvW2Etel0vLCAnXDFcMScpCisgICMgICAgICAgcnVuX3N0cmluZ19tdW5nZWQgc3RyLCByZXMKKyAgIyAgICAgICByZXMKKyAgIyAgICAgZW5kCisgICMgICBlbmQKKyAgIworICAjIEBleGFtcGxlIFVzZSBhIGNhbGxiYWNrCisgICMgICBtID0gTXVuZ2VyLm5ldworICAjICAgbS5vbl9zdHJpbmdfbXVuZ2VkIHt8c3RyLCByZXN8IHB1dHMgIiN7c3RyfSB3YXMgbXVuZ2VkIGludG8gI3tyZXN9ISJ9CisgICMgICBtLm11bmdlICJiYXIiICM9PiBiYXIgd2FzIG11bmdlZCBpbnRvIGJiYWFyciEKKyAgbW9kdWxlIENhbGxiYWNrcworICAgICMgQXV0b21hdGljYWxseSBpbmNsdWRlcyB7SW5zdGFuY2VNZXRob2RzfQorICAgICMgd2hlbiBzb21ldGhpbmcgZXh0ZW5kcyB0aGlzIG1vZHVsZS4KKyAgICAjCisgICAgIyBAcGFyYW0gYmFzZSBbTW9kdWxlXQorICAgIGRlZiBzZWxmLmV4dGVuZGVkKGJhc2UpCisgICAgICBiYXNlLnNlbmQoOmluY2x1ZGUsIEluc3RhbmNlTWV0aG9kcykKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgbW9kdWxlIEluc3RhbmNlTWV0aG9kcworICAgICAgIyBSZW1vdmVzIGFsbCBjYWxsYmFja3MgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoaXMgb2JqZWN0LgorICAgICAgZGVmIGNsZWFyX2NhbGxiYWNrcyEKKyAgICAgICAgQF9zYXNzX2NhbGxiYWNrcyA9IHt9CisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgRGVmaW5lIGEgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAjIFRoaXMgd2lsbCBkZWZpbmUgYW4gYG9uXyN7bmFtZX1gIG1ldGhvZAorICAgICMgdGhhdCByZWdpc3RlcnMgYSBibG9jaywKKyAgICAjIGFuZCBhIGBydW5fI3tuYW1lfWAgbWV0aG9kIHRoYXQgcnVucyB0aGF0IGJsb2NrCisgICAgIyAob3B0aW9uYWxsIHdpdGggc29tZSBhcmd1bWVudHMpLgorICAgICMKKyAgICAjIEBwYXJhbSBuYW1lIFtTeW1ib2xdIFRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjaworICAgICMgQHJldHVybiBbdm9pZF0KKyAgICBkZWYgZGVmaW5lX2NhbGxiYWNrKG5hbWUpCisgICAgICBjbGFzc19ldmFsIDw8UlVCWSwgX19GSUxFX18sIF9fTElORV9fICsgMQorZGVmIG9uXyN7bmFtZX0oJmJsb2NrKQorICBAX3Nhc3NfY2FsbGJhY2tzID0ge30gdW5sZXNzIGRlZmluZWQ/IEBfc2Fzc19jYWxsYmFja3MKKyAgKEBfc2Fzc19jYWxsYmFja3NbI3tuYW1lLmluc3BlY3R9XSB8fD0gW10pIDw8IGJsb2NrCitlbmQKKworZGVmIHJ1bl8je25hbWV9KCphcmdzKQorICByZXR1cm4gdW5sZXNzIGRlZmluZWQ/IEBfc2Fzc19jYWxsYmFja3MKKyAgcmV0dXJuIHVubGVzcyBAX3Nhc3NfY2FsbGJhY2tzWyN7bmFtZS5pbnNwZWN0fV0KKyAgQF9zYXNzX2NhbGxiYWNrc1sje25hbWUuaW5zcGVjdH1dLmVhY2gge3xjfCBjWyphcmdzXX0KK2VuZAorcHJpdmF0ZSA6cnVuXyN7bmFtZX0KK1JVQlkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY3NzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9jc3MucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5MjhiZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvY3NzLnJiCkBAIC0wLDAgKzEsNDA3IEBACityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL3Nhc3MnCityZXF1aXJlICdzYXNzL3RyZWUvbm9kZScKK3JlcXVpcmUgJ3Nhc3Mvc2Nzcy9jc3NfcGFyc2VyJworCittb2R1bGUgU2FzcworICAjIFRoaXMgY2xhc3MgY29udmVydHMgQ1NTIGRvY3VtZW50cyBpbnRvIFNhc3Mgb3IgU0NTUyB0ZW1wbGF0ZXMuCisgICMgSXQgd29ya3MgYnkgcGFyc2luZyB0aGUgQ1NTIGRvY3VtZW50IGludG8gYSB7U2Fzczo6VHJlZX0gc3RydWN0dXJlLAorICAjIGFuZCB0aGVuIGFwcGx5aW5nIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zIHRvIHRoZSBzdHJ1Y3R1cmUKKyAgIyB0byBwcm9kdWNlIG1vcmUgY29uY2lzZSBhbmQgaWRpb21hdGljIFNhc3MvU0NTUy4KKyAgIworICAjIEV4YW1wbGUgdXNhZ2U6CisgICMKKyAgIyAgICAgU2Fzczo6Q1NTLm5ldygicCB7IGNvbG9yOiBibHVlIH0iKS5yZW5kZXIoOnNhc3MpICM9PiAicFxuICBjb2xvcjogYmx1ZSIKKyAgIyAgICAgU2Fzczo6Q1NTLm5ldygicCB7IGNvbG9yOiBibHVlIH0iKS5yZW5kZXIoOnNjc3MpICM9PiAicCB7XG4gIGNvbG9yOiBibHVlOyB9IgorICBjbGFzcyBDU1MKKyAgICAjIEBwYXJhbSB0ZW1wbGF0ZSBbU3RyaW5nXSBUaGUgQ1NTIHN0eWxlc2hlZXQuCisgICAgIyAgIFRoaXMgc3R5bGVzaGVldCBjYW4gYmUgZW5jb2RlZCB1c2luZyBhbnkgZW5jb2RpbmcKKyAgICAjICAgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIFVuaWNvZGUuCisgICAgIyAgIElmIHRoZSBzdHlsZXNoZWV0IGNvbnRhaW5zIGFuIGBAY2hhcnNldGAgZGVjbGFyYXRpb24sCisgICAgIyAgIHRoYXQgb3ZlcnJpZGVzIHRoZSBSdWJ5IGVuY29kaW5nCisgICAgIyAgIChzZWUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjRW5jb2RpbmdzIHRoZSBlbmNvZGluZyBkb2N1bWVudGF0aW9ufSkKKyAgICAjIEBvcHRpb24gb3B0aW9ucyA6b2xkIFtCb29sZWFuXSAoZmFsc2UpCisgICAgIyAgICAgV2hldGhlciBvciBub3QgdG8gb3V0cHV0IG9sZCBwcm9wZXJ0eSBzeW50YXgKKyAgICAjICAgICAoYDpjb2xvciBibHVlYCBhcyBvcHBvc2VkIHRvIGBjb2xvcjogYmx1ZWApLgorICAgICMgICAgIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gZ2VuZXJhdGluZyBTYXNzIGNvZGUsCisgICAgIyAgICAgcmF0aGVyIHRoYW4gU0NTUy4KKyAgICAjIEBvcHRpb24gb3B0aW9ucyA6aW5kZW50IFtTdHJpbmddICgiICAiKQorICAgICMgICAgIFRoZSBzdHJpbmcgdG8gdXNlIGZvciBpbmRlbnRpbmcgZWFjaCBsaW5lLiBEZWZhdWx0cyB0byB0d28gc3BhY2VzLgorICAgIGRlZiBpbml0aWFsaXplKHRlbXBsYXRlLCBvcHRpb25zID0ge30pCisgICAgICBpZiB0ZW1wbGF0ZS5pc19hPyBJTworICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlYWQKKyAgICAgIGVuZAorCisgICAgICBAb3B0aW9ucyA9IG9wdGlvbnMubWVyZ2UoOl9jb252ZXJ0ID0+IHRydWUpCisgICAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgICBAb3B0aW9uc1s6b2xkXSA9IHRydWUgaWYgQG9wdGlvbnNbOmFsdGVybmF0ZV0gPT0gZmFsc2UKKyAgICAgIEB0ZW1wbGF0ZSA9IHRlbXBsYXRlCisgICAgICBAY2hlY2tlZF9lbmNvZGluZyA9IGZhbHNlCisgICAgZW5kCisKKyAgICAjIENvbnZlcnRzIHRoZSBDU1MgdGVtcGxhdGUgaW50byBTYXNzIG9yIFNDU1MgY29kZS4KKyAgICAjCisgICAgIyBAcGFyYW0gZm10IFtTeW1ib2xdIGA6c2Fzc2Agb3IgYDpzY3NzYCwgZGVzaWduYXRpbmcgdGhlIGZvcm1hdCB0byByZXR1cm4uCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSByZXN1bHRpbmcgU2FzcyBvciBTQ1NTIGNvZGUKKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcGFyc2luZyB0aGUgQ1NTIHRlbXBsYXRlCisgICAgZGVmIHJlbmRlcihmbXQgPSA6c2FzcykKKyAgICAgIGNoZWNrX2VuY29kaW5nIQorICAgICAgYnVpbGRfdHJlZS5zZW5kKCJ0b18je2ZtdH0iLCBAb3B0aW9ucykuc3RyaXAgKyAiXG4iCisgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGVycgorICAgICAgZXJyLm1vZGlmeV9iYWNrdHJhY2UoOmZpbGVuYW1lID0+IEBvcHRpb25zWzpmaWxlbmFtZV0gfHwgJyhjc3MpJykKKyAgICAgIHJhaXNlIGVycgorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBvcmlnaW5hbCBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQuCisgICAgIworICAgICMgQHJldHVybiBbRW5jb2RpbmcsIG5pbF0KKyAgICAjIEByYWlzZSBbRW5jb2Rpbmc6OlVuZGVmaW5lZENvbnZlcnNpb25FcnJvcl0gaWYgdGhlIHNvdXJjZSBlbmNvZGluZworICAgICMgICBjYW5ub3QgYmUgY29udmVydGVkIHRvIFVURi04CisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIHRoZSBkb2N1bWVudCB1c2VzIGFuIHVua25vd24gZW5jb2Rpbmcgd2l0aCBgQGNoYXJzZXRgCisgICAgZGVmIHNvdXJjZV9lbmNvZGluZworICAgICAgY2hlY2tfZW5jb2RpbmchCisgICAgICBAb3JpZ2luYWxfZW5jb2RpbmcKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBjaGVja19lbmNvZGluZyEKKyAgICAgIHJldHVybiBpZiBAY2hlY2tlZF9lbmNvZGluZworICAgICAgQGNoZWNrZWRfZW5jb2RpbmcgPSB0cnVlCisgICAgICBAdGVtcGxhdGUsIEBvcmlnaW5hbF9lbmNvZGluZyA9IFNhc3M6OlV0aWwuY2hlY2tfc2Fzc19lbmNvZGluZyhAdGVtcGxhdGUpCisgICAgZW5kCisKKyAgICAjIFBhcnNlcyB0aGUgQ1NTIHRlbXBsYXRlIGFuZCBhcHBsaWVzIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zCisgICAgIworICAgICMgQHJldHVybiBbVHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2VkIHRyZWUKKyAgICBkZWYgYnVpbGRfdHJlZQorICAgICAgcm9vdCA9IFNhc3M6OlNDU1M6OkNzc1BhcnNlci5uZXcoQHRlbXBsYXRlLCBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBuaWwpLnBhcnNlCisgICAgICBwYXJzZV9zZWxlY3RvcnMocm9vdCkKKyAgICAgIGV4cGFuZF9jb21tYXMocm9vdCkKKyAgICAgIG5lc3Rfc2Vxcyhyb290KQorICAgICAgcGFyZW50X3JlZl9ydWxlcyhyb290KQorICAgICAgZmxhdHRlbl9ydWxlcyhyb290KQorICAgICAgYnViYmxlX3N1YmplY3Qocm9vdCkKKyAgICAgIGZvbGRfY29tbWFzKHJvb3QpCisgICAgICBkdW1wX3NlbGVjdG9ycyhyb290KQorICAgICAgcm9vdAorICAgIGVuZAorCisgICAgIyBQYXJzZSBhbGwgdGhlIHNlbGVjdG9ycyBpbiB0aGUgZG9jdW1lbnQgYW5kIGFzc2lnbiB0aGVtIHRvCisgICAgIyB7U2Fzczo6VHJlZTo6UnVsZU5vZGUjcGFyc2VkX3J1bGVzfS4KKyAgICAjCisgICAgIyBAcGFyYW0gcm9vdCBbVHJlZTo6Tm9kZV0gVGhlIHBhcmVudCBub2RlCisgICAgZGVmIHBhcnNlX3NlbGVjdG9ycyhyb290KQorICAgICAgcm9vdC5jaGlsZHJlbi5lYWNoIGRvIHxjaGlsZHwKKyAgICAgICAgbmV4dCBwYXJzZV9zZWxlY3RvcnMoY2hpbGQpIGlmIGNoaWxkLmlzX2E/KFRyZWU6OkRpcmVjdGl2ZU5vZGUpCisgICAgICAgIG5leHQgdW5sZXNzIGNoaWxkLmlzX2E/KFRyZWU6OlJ1bGVOb2RlKQorICAgICAgICBwYXJzZXIgPSBTYXNzOjpTQ1NTOjpDc3NQYXJzZXIubmV3KGNoaWxkLnJ1bGUuZmlyc3QsIGNoaWxkLmZpbGVuYW1lLCBuaWwsIGNoaWxkLmxpbmUpCisgICAgICAgIGNoaWxkLnBhcnNlZF9ydWxlcyA9IHBhcnNlci5wYXJzZV9zZWxlY3RvcgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRyYW5zZm9ybQorICAgICMKKyAgICAjICAgICBmb28sIGJhciwgYmF6CisgICAgIyAgICAgICBjb2xvcjogYmx1ZQorICAgICMKKyAgICAjIGludG8KKyAgICAjCisgICAgIyAgICAgZm9vCisgICAgIyAgICAgICBjb2xvcjogYmx1ZQorICAgICMgICAgIGJhcgorICAgICMgICAgICAgY29sb3I6IGJsdWUKKyAgICAjICAgICBiYXoKKyAgICAjICAgICAgIGNvbG9yOiBibHVlCisgICAgIworICAgICMgQHBhcmFtIHJvb3QgW1RyZWU6Ok5vZGVdIFRoZSBwYXJlbnQgbm9kZQorICAgIGRlZiBleHBhbmRfY29tbWFzKHJvb3QpCisgICAgICByb290LmNoaWxkcmVuLm1hcCEgZG8gfGNoaWxkfAorICAgICAgICAjIGNoaWxkLnBhcnNlZF9ydWxlcy5tZW1iZXJzLnNpemUgPiAxIGlmZiB0aGUgcnVsZSBjb250YWlucyBhIGNvbW1hCisgICAgICAgIHVubGVzcyBjaGlsZC5pc19hPyhUcmVlOjpSdWxlTm9kZSkgJiYgY2hpbGQucGFyc2VkX3J1bGVzLm1lbWJlcnMuc2l6ZSA+IDEKKyAgICAgICAgICBleHBhbmRfY29tbWFzKGNoaWxkKSBpZiBjaGlsZC5pc19hPyhUcmVlOjpEaXJlY3RpdmVOb2RlKQorICAgICAgICAgIG5leHQgY2hpbGQKKyAgICAgICAgZW5kCisgICAgICAgIGNoaWxkLnBhcnNlZF9ydWxlcy5tZW1iZXJzLm1hcCBkbyB8c2VxfAorICAgICAgICAgIG5vZGUgPSBUcmVlOjpSdWxlTm9kZS5uZXcoW10pCisgICAgICAgICAgbm9kZS5wYXJzZWRfcnVsZXMgPSBtYWtlX2NzZXEoc2VxKQorICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbgorICAgICAgICAgIG5vZGUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIHJvb3QuY2hpbGRyZW4uZmxhdHRlbiEKKyAgICBlbmQKKworICAgICMgTWFrZSBydWxlcyB1c2UgbmVzdGluZyBzbyB0aGF0CisgICAgIworICAgICMgICAgIGZvbworICAgICMgICAgICAgY29sb3I6IGdyZWVuCisgICAgIyAgICAgZm9vIGJhcgorICAgICMgICAgICAgY29sb3I6IHJlZAorICAgICMgICAgIGZvbyBiYXoKKyAgICAjICAgICAgIGNvbG9yOiBibHVlCisgICAgIworICAgICMgYmVjb21lcworICAgICMKKyAgICAjICAgICBmb28KKyAgICAjICAgICAgIGNvbG9yOiBncmVlbgorICAgICMgICAgICAgYmFyCisgICAgIyAgICAgICAgIGNvbG9yOiByZWQKKyAgICAjICAgICAgIGJhegorICAgICMgICAgICAgICBjb2xvcjogYmx1ZQorICAgICMKKyAgICAjIEBwYXJhbSByb290IFtUcmVlOjpOb2RlXSBUaGUgcGFyZW50IG5vZGUKKyAgICBkZWYgbmVzdF9zZXFzKHJvb3QpCisgICAgICBjdXJyZW50X3J1bGUgPSBuaWwKKyAgICAgIHJvb3QuY2hpbGRyZW4ubWFwISBkbyB8Y2hpbGR8CisgICAgICAgIHVubGVzcyBjaGlsZC5pc19hPyhUcmVlOjpSdWxlTm9kZSkKKyAgICAgICAgICBuZXN0X3NlcXMoY2hpbGQpIGlmIGNoaWxkLmlzX2E/KFRyZWU6OkRpcmVjdGl2ZU5vZGUpCisgICAgICAgICAgbmV4dCBjaGlsZAorICAgICAgICBlbmQKKworICAgICAgICBzZXEgPSBmaXJzdF9zZXEoY2hpbGQpCisgICAgICAgIHNlcS5tZW1iZXJzLnJlamVjdCEge3xzc2VxfCBzc2VxID09ICJcbiJ9CisgICAgICAgIGZpcnN0LCByZXN0ID0gc2VxLm1lbWJlcnMuZmlyc3QsIHNlcS5tZW1iZXJzWzEuLi0xXQorCisgICAgICAgIGlmIGN1cnJlbnRfcnVsZS5uaWw/IHx8IGZpcnN0X3NzZXEoY3VycmVudF9ydWxlKSAhPSBmaXJzdAorICAgICAgICAgIGN1cnJlbnRfcnVsZSA9IFRyZWU6OlJ1bGVOb2RlLm5ldyhbXSkKKyAgICAgICAgICBjdXJyZW50X3J1bGUucGFyc2VkX3J1bGVzID0gbWFrZV9zZXEoZmlyc3QpCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIHJlc3QuZW1wdHk/CisgICAgICAgICAgY3VycmVudF9ydWxlLmNoaWxkcmVuICs9IGNoaWxkLmNoaWxkcmVuCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjaGlsZC5wYXJzZWRfcnVsZXMgPSBtYWtlX3NlcSgqcmVzdCkKKyAgICAgICAgICBjdXJyZW50X3J1bGUgPDwgY2hpbGQKKyAgICAgICAgZW5kCisKKyAgICAgICAgY3VycmVudF9ydWxlCisgICAgICBlbmQKKyAgICAgIHJvb3QuY2hpbGRyZW4uY29tcGFjdCEKKyAgICAgIHJvb3QuY2hpbGRyZW4udW5pcSEKKworICAgICAgcm9vdC5jaGlsZHJlbi5lYWNoIHt8dnwgbmVzdF9zZXFzKHYpfQorICAgIGVuZAorCisgICAgIyBNYWtlIHJ1bGVzIHVzZSBwYXJlbnQgcmVmcyBzbyB0aGF0CisgICAgIworICAgICMgICAgIGZvbworICAgICMgICAgICAgY29sb3I6IGdyZWVuCisgICAgIyAgICAgZm9vLmJhcgorICAgICMgICAgICAgY29sb3I6IGJsdWUKKyAgICAjCisgICAgIyBiZWNvbWVzCisgICAgIworICAgICMgICAgIGZvbworICAgICMgICAgICAgY29sb3I6IGdyZWVuCisgICAgIyAgICAgICAmLmJhcgorICAgICMgICAgICAgICBjb2xvcjogYmx1ZQorICAgICMKKyAgICAjIEBwYXJhbSByb290IFtUcmVlOjpOb2RlXSBUaGUgcGFyZW50IG5vZGUKKyAgICBkZWYgcGFyZW50X3JlZl9ydWxlcyhyb290KQorICAgICAgY3VycmVudF9ydWxlID0gbmlsCisgICAgICByb290LmNoaWxkcmVuLm1hcCEgZG8gfGNoaWxkfAorICAgICAgICB1bmxlc3MgY2hpbGQuaXNfYT8oVHJlZTo6UnVsZU5vZGUpCisgICAgICAgICAgcGFyZW50X3JlZl9ydWxlcyhjaGlsZCkgaWYgY2hpbGQuaXNfYT8oVHJlZTo6RGlyZWN0aXZlTm9kZSkKKyAgICAgICAgICBuZXh0IGNoaWxkCisgICAgICAgIGVuZAorCisgICAgICAgIHNzZXEgPSBmaXJzdF9zc2VxKGNoaWxkKQorICAgICAgICBuZXh0IGNoaWxkIHVubGVzcyBzc2VxLmlzX2E/KFNhc3M6OlNlbGVjdG9yOjpTaW1wbGVTZXF1ZW5jZSkKKworICAgICAgICBmaXJzdHMsIHJlc3QgPSBbc3NlcS5tZW1iZXJzLmZpcnN0XSwgc3NlcS5tZW1iZXJzWzEuLi0xXQorICAgICAgICBmaXJzdHMucHVzaCByZXN0LnNoaWZ0IGlmIGZpcnN0cy5maXJzdC5pc19hPyhTYXNzOjpTZWxlY3Rvcjo6UGFyZW50KQorCisgICAgICAgIGxhc3Rfc2ltcGxlX3N1YmplY3QgPSByZXN0LmVtcHR5PyAmJiBzc2VxLnN1YmplY3Q/CisgICAgICAgIGlmIGN1cnJlbnRfcnVsZS5uaWw/IHx8IGZpcnN0X3NzZXEoY3VycmVudF9ydWxlKS5tZW1iZXJzICE9IGZpcnN0cyB8fAorICAgICAgICAgICAgISFmaXJzdF9zc2VxKGN1cnJlbnRfcnVsZSkuc3ViamVjdD8gIT0gISFsYXN0X3NpbXBsZV9zdWJqZWN0CisgICAgICAgICAgY3VycmVudF9ydWxlID0gVHJlZTo6UnVsZU5vZGUubmV3KFtdKQorICAgICAgICAgIGN1cnJlbnRfcnVsZS5wYXJzZWRfcnVsZXMgPSBtYWtlX3NzZXEobGFzdF9zaW1wbGVfc3ViamVjdCwgKmZpcnN0cykKKyAgICAgICAgZW5kCisKKyAgICAgICAgaWYgcmVzdC5lbXB0eT8KKyAgICAgICAgICBjdXJyZW50X3J1bGUuY2hpbGRyZW4gKz0gY2hpbGQuY2hpbGRyZW4KKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlc3QudW5zaGlmdCBTYXNzOjpTZWxlY3Rvcjo6UGFyZW50Lm5ldworICAgICAgICAgIGNoaWxkLnBhcnNlZF9ydWxlcyA9IG1ha2Vfc3NlcShzc2VxLnN1YmplY3Q/LCAqcmVzdCkKKyAgICAgICAgICBjdXJyZW50X3J1bGUgPDwgY2hpbGQKKyAgICAgICAgZW5kCisKKyAgICAgICAgY3VycmVudF9ydWxlCisgICAgICBlbmQKKyAgICAgIHJvb3QuY2hpbGRyZW4uY29tcGFjdCEKKyAgICAgIHJvb3QuY2hpbGRyZW4udW5pcSEKKworICAgICAgcm9vdC5jaGlsZHJlbi5lYWNoIHt8dnwgcGFyZW50X3JlZl9ydWxlcyh2KX0KKyAgICBlbmQKKworICAgICMgRmxhdHRlbiBydWxlcyBzbyB0aGF0CisgICAgIworICAgICMgICAgIGZvbworICAgICMgICAgICAgYmFyCisgICAgIyAgICAgICAgIGNvbG9yOiByZWQKKyAgICAjCisgICAgIyBiZWNvbWVzCisgICAgIworICAgICMgICAgIGZvbyBiYXIKKyAgICAjICAgICAgIGNvbG9yOiByZWQKKyAgICAjCisgICAgIyBhbmQKKyAgICAjCisgICAgIyAgICAgZm9vCisgICAgIyAgICAgICAmLmJhcgorICAgICMgICAgICAgICBjb2xvcjogYmx1ZQorICAgICMKKyAgICAjIGJlY29tZXMKKyAgICAjCisgICAgIyAgICAgZm9vLmJhcgorICAgICMgICAgICAgY29sb3I6IGJsdWUKKyAgICAjCisgICAgIyBAcGFyYW0gcm9vdCBbVHJlZTo6Tm9kZV0gVGhlIHBhcmVudCBub2RlCisgICAgZGVmIGZsYXR0ZW5fcnVsZXMocm9vdCkKKyAgICAgIHJvb3QuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICAgIGNhc2UgY2hpbGQKKyAgICAgICAgd2hlbiBUcmVlOjpSdWxlTm9kZQorICAgICAgICAgIGZsYXR0ZW5fcnVsZShjaGlsZCkKKyAgICAgICAgd2hlbiBUcmVlOjpEaXJlY3RpdmVOb2RlCisgICAgICAgICAgZmxhdHRlbl9ydWxlcyhjaGlsZCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgRmxhdHRlbnMgYSBzaW5nbGUgcnVsZS4KKyAgICAjCisgICAgIyBAcGFyYW0gcnVsZSBbVHJlZTo6UnVsZU5vZGVdIFRoZSBjYW5kaWRhdGUgZm9yIGZsYXR0ZW5pbmcKKyAgICAjIEBzZWUgI2ZsYXR0ZW5fcnVsZXMKKyAgICBkZWYgZmxhdHRlbl9ydWxlKHJ1bGUpCisgICAgICB3aGlsZSBydWxlLmNoaWxkcmVuLnNpemUgPT0gMSAmJiBydWxlLmNoaWxkcmVuLmZpcnN0LmlzX2E/KFRyZWU6OlJ1bGVOb2RlKQorICAgICAgICBjaGlsZCA9IHJ1bGUuY2hpbGRyZW4uZmlyc3QKKworICAgICAgICBpZiBmaXJzdF9zaW1wbGVfc2VsKGNoaWxkKS5pc19hPyhTYXNzOjpTZWxlY3Rvcjo6UGFyZW50KQorICAgICAgICAgIHJ1bGUucGFyc2VkX3J1bGVzID0gY2hpbGQucGFyc2VkX3J1bGVzLnJlc29sdmVfcGFyZW50X3JlZnMocnVsZS5wYXJzZWRfcnVsZXMpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBydWxlLnBhcnNlZF9ydWxlcyA9IG1ha2Vfc2VxKCooZmlyc3Rfc2VxKHJ1bGUpLm1lbWJlcnMgKyBmaXJzdF9zZXEoY2hpbGQpLm1lbWJlcnMpKQorICAgICAgICBlbmQKKworICAgICAgICBydWxlLmNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW4KKyAgICAgIGVuZAorCisgICAgICBmbGF0dGVuX3J1bGVzKHJ1bGUpCisgICAgZW5kCisKKyAgICBkZWYgYnViYmxlX3N1YmplY3Qocm9vdCkKKyAgICAgIHJvb3QuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICAgIGJ1YmJsZV9zdWJqZWN0KGNoaWxkKSBpZiBjaGlsZC5pc19hPyhUcmVlOjpSdWxlTm9kZSkgfHwgY2hpbGQuaXNfYT8oVHJlZTo6RGlyZWN0aXZlTm9kZSkKKyAgICAgICAgbmV4dCB1bmxlc3MgY2hpbGQuaXNfYT8oVHJlZTo6UnVsZU5vZGUpICYmICFjaGlsZC5jaGlsZHJlbi5lbXB0eT8KKyAgICAgICAgbmV4dCB1bmxlc3MgY2hpbGQuY2hpbGRyZW4uYWxsPyBkbyB8Y3wKKyAgICAgICAgICBuZXh0IHVubGVzcyBjLmlzX2E/KFRyZWU6OlJ1bGVOb2RlKQorICAgICAgICAgIGZpcnN0X3NpbXBsZV9zZWwoYykuaXNfYT8oU2Fzczo6U2VsZWN0b3I6OlBhcmVudCkgJiYgZmlyc3Rfc3NlcShjKS5zdWJqZWN0PworICAgICAgICBlbmQKKyAgICAgICAgZmlyc3Rfc3NlcShjaGlsZCkuc3ViamVjdCA9IHRydWUKKyAgICAgICAgY2hpbGQuY2hpbGRyZW4uZWFjaCB7fGN8IGZpcnN0X3NzZXEoYykuc3ViamVjdCA9IGZhbHNlfQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRyYW5zZm9ybQorICAgICMKKyAgICAjICAgICBmb28KKyAgICAjICAgICAgIGJhcgorICAgICMgICAgICAgICBjb2xvcjogYmx1ZQorICAgICMgICAgICAgYmF6CisgICAgIyAgICAgICAgIGNvbG9yOiBibHVlCisgICAgIworICAgICMgaW50bworICAgICMKKyAgICAjICAgICBmb28KKyAgICAjICAgICAgIGJhciwgYmF6CisgICAgIyAgICAgICAgIGNvbG9yOiBibHVlCisgICAgIworICAgICMgQHBhcmFtIHJvb3QgW1RyZWU6Ok5vZGVdIFRoZSBwYXJlbnQgbm9kZQorICAgIGRlZiBmb2xkX2NvbW1hcyhyb290KQorICAgICAgcHJldl9ydWxlID0gbmlsCisgICAgICByb290LmNoaWxkcmVuLm1hcCEgZG8gfGNoaWxkfAorICAgICAgICB1bmxlc3MgY2hpbGQuaXNfYT8oVHJlZTo6UnVsZU5vZGUpCisgICAgICAgICAgZm9sZF9jb21tYXMoY2hpbGQpIGlmIGNoaWxkLmlzX2E/KFRyZWU6OkRpcmVjdGl2ZU5vZGUpCisgICAgICAgICAgbmV4dCBjaGlsZAorICAgICAgICBlbmQKKworICAgICAgICBpZiBwcmV2X3J1bGUgJiYgcHJldl9ydWxlLmNoaWxkcmVuLm1hcCB7fGN8IGMudG9fc2Fzc30gPT0gY2hpbGQuY2hpbGRyZW4ubWFwIHt8Y3wgYy50b19zYXNzfQorICAgICAgICAgIHByZXZfcnVsZS5wYXJzZWRfcnVsZXMubWVtYmVycyA8PCBmaXJzdF9zZXEoY2hpbGQpCisgICAgICAgICAgbmV4dCBuaWwKKyAgICAgICAgZW5kCisKKyAgICAgICAgZm9sZF9jb21tYXMoY2hpbGQpCisgICAgICAgIHByZXZfcnVsZSA9IGNoaWxkCisgICAgICAgIGNoaWxkCisgICAgICBlbmQKKyAgICAgIHJvb3QuY2hpbGRyZW4uY29tcGFjdCEKKyAgICBlbmQKKworICAgICMgRHVtcCBhbGwgdGhlIHBhcnNlZCB7U2Fzczo6VHJlZTo6UnVsZU5vZGV9IHNlbGVjdG9ycyB0byBzdHJpbmdzLgorICAgICMKKyAgICAjIEBwYXJhbSByb290IFtUcmVlOjpOb2RlXSBUaGUgcGFyZW50IG5vZGUKKyAgICBkZWYgZHVtcF9zZWxlY3RvcnMocm9vdCkKKyAgICAgIHJvb3QuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICAgIG5leHQgZHVtcF9zZWxlY3RvcnMoY2hpbGQpIGlmIGNoaWxkLmlzX2E/KFRyZWU6OkRpcmVjdGl2ZU5vZGUpCisgICAgICAgIG5leHQgdW5sZXNzIGNoaWxkLmlzX2E/KFRyZWU6OlJ1bGVOb2RlKQorICAgICAgICBjaGlsZC5ydWxlID0gW2NoaWxkLnBhcnNlZF9ydWxlcy50b19zXQorICAgICAgICBkdW1wX3NlbGVjdG9ycyhjaGlsZCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBDcmVhdGUgYSB7U2Fzczo6U2VsZWN0b3I6OkNvbW1hU2VxdWVuY2V9LgorICAgICMKKyAgICAjIEBwYXJhbSBzZXFzIFtBcnJheTxTYXNzOjpTZWxlY3Rvcjo6U2VxdWVuY2U+XQorICAgICMgQHJldHVybiBbU2Fzczo6U2VsZWN0b3I6OkNvbW1hU2VxdWVuY2VdCisgICAgZGVmIG1ha2VfY3NlcSgqc2VxcykKKyAgICAgIFNhc3M6OlNlbGVjdG9yOjpDb21tYVNlcXVlbmNlLm5ldyhzZXFzKQorICAgIGVuZAorCisgICAgIyBDcmVhdGUgYSB7U2Fzczo6U2VsZWN0b3I6OkNvbW1hU2VxdWVuY2V9IGNvbnRhaW5pbmcgb25seSBhIHNpbmdsZQorICAgICMge1Nhc3M6OlNlbGVjdG9yOjpTZXF1ZW5jZX0uCisgICAgIworICAgICMgQHBhcmFtIHNzZXFzIFtBcnJheTxTYXNzOjpTZWxlY3Rvcjo6U2VxdWVuY2UsIFN0cmluZz5dCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTZWxlY3Rvcjo6Q29tbWFTZXF1ZW5jZV0KKyAgICBkZWYgbWFrZV9zZXEoKnNzZXFzKQorICAgICAgbWFrZV9jc2VxKFNhc3M6OlNlbGVjdG9yOjpTZXF1ZW5jZS5uZXcoc3NlcXMpKQorICAgIGVuZAorCisgICAgIyBDcmVhdGUgYSB7U2Fzczo6U2VsZWN0b3I6OkNvbW1hU2VxdWVuY2V9IGNvbnRhaW5pbmcgb25seSBhIHNpbmdsZQorICAgICMge1Nhc3M6OlNlbGVjdG9yOjpTZXF1ZW5jZX0gd2hpY2ggaW4gdHVybiBjb250YWlucyBvbmx5IGEgc2luZ2xlCisgICAgIyB7U2Fzczo6U2VsZWN0b3I6OlNpbXBsZVNlcXVlbmNlfS4KKyAgICAjCisgICAgIyBAcGFyYW0gc3ViamVjdCBbQm9vbGVhbl0gV2hldGhlciB0aGlzIGlzIGEgc3ViamVjdCBzZWxlY3RvcgorICAgICMgQHBhcmFtIHNzZXFzIFtBcnJheTxTYXNzOjpTZWxlY3Rvcjo6U2VxdWVuY2UsIFN0cmluZz5dCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTZWxlY3Rvcjo6Q29tbWFTZXF1ZW5jZV0KKyAgICBkZWYgbWFrZV9zc2VxKHN1YmplY3QsICpzc2VxcykKKyAgICAgIG1ha2Vfc2VxKFNhc3M6OlNlbGVjdG9yOjpTaW1wbGVTZXF1ZW5jZS5uZXcoc3NlcXMsIHN1YmplY3QpKQorICAgIGVuZAorCisgICAgIyBSZXR1cm4gdGhlIGZpcnN0IHtTYXNzOjpTZWxlY3Rvcjo6U2VxdWVuY2V9IGluIGEge1Nhc3M6OlRyZWU6OlJ1bGVOb2RlfS4KKyAgICAjCisgICAgIyBAcGFyYW0gcnVsZSBbU2Fzczo6VHJlZTo6UnVsZU5vZGVdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTZWxlY3Rvcjo6U2VxdWVuY2VdCisgICAgZGVmIGZpcnN0X3NlcShydWxlKQorICAgICAgcnVsZS5wYXJzZWRfcnVsZXMubWVtYmVycy5maXJzdAorICAgIGVuZAorCisgICAgIyBSZXR1cm4gdGhlIGZpcnN0IHtTYXNzOjpTZWxlY3Rvcjo6U2ltcGxlU2VxdWVuY2V9IGluIGEKKyAgICAjIHtTYXNzOjpUcmVlOjpSdWxlTm9kZX0uCisgICAgIworICAgICMgQHBhcmFtIHJ1bGUgW1Nhc3M6OlRyZWU6OlJ1bGVOb2RlXQorICAgICMgQHJldHVybiBbU2Fzczo6U2VsZWN0b3I6OlNpbXBsZVNlcXVlbmNlLCBTdHJpbmddCisgICAgZGVmIGZpcnN0X3NzZXEocnVsZSkKKyAgICAgIGZpcnN0X3NlcShydWxlKS5tZW1iZXJzLmZpcnN0CisgICAgZW5kCisKKyAgICAjIFJldHVybiB0aGUgZmlyc3Qge1Nhc3M6OlNlbGVjdG9yOjpTaW1wbGV9IGluIGEge1Nhc3M6OlRyZWU6OlJ1bGVOb2RlfSwKKyAgICAjIHVubGVzcyB0aGUgcnVsZSBiZWdpbnMgd2l0aCBhIGNvbWJpbmF0b3IuCisgICAgIworICAgICMgQHBhcmFtIHJ1bGUgW1Nhc3M6OlRyZWU6OlJ1bGVOb2RlXQorICAgICMgQHJldHVybiBbU2Fzczo6U2VsZWN0b3I6OlNpbXBsZT9dCisgICAgZGVmIGZpcnN0X3NpbXBsZV9zZWwocnVsZSkKKyAgICAgIHNzZXEgPSBmaXJzdF9zc2VxKHJ1bGUpCisgICAgICByZXR1cm4gdW5sZXNzIHNzZXEuaXNfYT8oU2Fzczo6U2VsZWN0b3I6OlNpbXBsZVNlcXVlbmNlKQorICAgICAgc3NlcS5tZW1iZXJzLmZpcnN0CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2RlcHJlY2F0aW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9kZXByZWNhdGlvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmNjYWNhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9kZXByZWNhdGlvbi5yYgpAQCAtMCwwICsxLDU1IEBACittb2R1bGUgU2FzcworICAjIEEgZGVwcmVjYXRpb24gd2FybmluZyB0aGF0IHNob3VsZCBvbmx5IGJlIHByaW50ZWQgb25jZSBmb3IgYSBnaXZlbiBsaW5lIGluIGEKKyAgIyBnaXZlbiBmaWxlLgorICAjCisgICMgQSBnbG9iYWwgRGVwcmVjYXRpb24gaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIGVhY2ggdHlwZSBvZiBkZXByZWNhdGlvbgorICAjIHdhcm5pbmcsIGFuZCBgd2FybmAgc2hvdWxkIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSB3YXJuaW5nIGlzIG5lZWRlZC4KKyAgY2xhc3MgRGVwcmVjYXRpb24KKyAgICBAQGFsbG93X2RvdWJsZV93YXJuaW5ncyA9IGZhbHNlCisKKyAgICAjIFJ1bnMgYSBibG9jayBpbiB3aGljaCBkb3VibGUgZGVwcmVjYXRpb24gd2FybmluZ3MgZm9yIHRoZSBzYW1lIGxvY2F0aW9uCisgICAgIyBhcmUgYWxsb3dlZC4KKyAgICBkZWYgc2VsZi5hbGxvd19kb3VibGVfd2FybmluZ3MKKyAgICAgIG9sZF9hbGxvd19kb3VibGVfd2FybmluZ3MgPSBAQGFsbG93X2RvdWJsZV93YXJuaW5ncworICAgICAgQEBhbGxvd19kb3VibGVfd2FybmluZ3MgPSB0cnVlCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgQEBhbGxvd19kb3VibGVfd2FybmluZ3MgPSBvbGRfYWxsb3dfZG91YmxlX3dhcm5pbmdzCisgICAgZW5kCisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgIyBBIHNldCBvZiBmaWxlbmFtZSwgbGluZSBwYWlycyBmb3Igd2hpY2ggd2FybmluZ3MgaGF2ZSBiZWVuIGVtaXR0ZWQuCisgICAgICBAc2VlbiA9IFNldC5uZXcKKyAgICBlbmQKKworICAgICMgUHJpbnRzIGBtZXNzYWdlYCBhcyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIGBmaWxlbmFtZWAsCisgICAgIyBgbGluZWAsIGFuZCBvcHRpb25hbGx5IGBjb2x1bW5gLgorICAgICMKKyAgICAjIFRoaXMgZW5zdXJlcyB0aGF0IG9ubHkgb25lIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIGZvciBlYWNoIGxpbmUgb2YgYQorICAgICMgZ2l2ZW4gZmlsZS4KKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgd2FybihmaWxlbmFtZSwgbGluZSwgbWVzc2FnZSkKKyAgICAjICAgQHBhcmFtIGZpbGVuYW1lIFtTdHJpbmcsIG5pbF0KKyAgICAjICAgQHBhcmFtIGxpbmUgW051bWJlcl0KKyAgICAjICAgQHBhcmFtIG1lc3NhZ2UgW1N0cmluZ10KKyAgICAjIEBvdmVybG9hZCB3YXJuKGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpCisgICAgIyAgIEBwYXJhbSBmaWxlbmFtZSBbU3RyaW5nLCBuaWxdCisgICAgIyAgIEBwYXJhbSBsaW5lIFtOdW1iZXJdCisgICAgIyAgIEBwYXJhbSBjb2x1bW4gW051bWJlcl0KKyAgICAjICAgQHBhcmFtIG1lc3NhZ2UgW1N0cmluZ10KKyAgICBkZWYgd2FybihmaWxlbmFtZSwgbGluZSwgY29sdW1uX29yX21lc3NhZ2UsIG1lc3NhZ2UgPSBuaWwpCisgICAgICByZXR1cm4gaWYgIUBAYWxsb3dfZG91YmxlX3dhcm5pbmdzICYmIEBzZWVuLmFkZD8oW2ZpbGVuYW1lLCBsaW5lXSkubmlsPworICAgICAgaWYgbWVzc2FnZQorICAgICAgICBjb2x1bW4gPSBjb2x1bW5fb3JfbWVzc2FnZQorICAgICAgZWxzZQorICAgICAgICBtZXNzYWdlID0gY29sdW1uX29yX21lc3NhZ2UKKyAgICAgIGVuZAorCisgICAgICBsb2NhdGlvbiA9ICJsaW5lICN7bGluZX0iCisgICAgICBsb2NhdGlvbiA8PCAiLCBjb2x1bW4gI3tjb2x1bW59IiBpZiBjb2x1bW4KKyAgICAgIGxvY2F0aW9uIDw8ICIgb2YgI3tmaWxlbmFtZX0iIGlmIGZpbGVuYW1lCisKKyAgICAgIFNhc3M6OlV0aWwuc2Fzc193YXJuKCJERVBSRUNBVElPTiBXQVJOSU5HIG9uICN7bG9jYXRpb259OlxuI3ttZXNzYWdlfSIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2VuZ2luZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZW5naW5lLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNTA0YjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2VuZ2luZS5yYgpAQCAtMCwwICsxLDEyNDQgQEAKK3JlcXVpcmUgJ3NldCcKK3JlcXVpcmUgJ2RpZ2VzdC9zaGExJworcmVxdWlyZSAnc2Fzcy9jYWNoZV9zdG9yZXMnCityZXF1aXJlICdzYXNzL2RlcHJlY2F0aW9uJworcmVxdWlyZSAnc2Fzcy9zb3VyY2UvcG9zaXRpb24nCityZXF1aXJlICdzYXNzL3NvdXJjZS9yYW5nZScKK3JlcXVpcmUgJ3Nhc3Mvc291cmNlL21hcCcKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL3Jvb3Rfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9ydWxlX25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvY29tbWVudF9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL3Byb3Bfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9kaXJlY3RpdmVfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9tZWRpYV9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL3N1cHBvcnRzX25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvY3NzX2ltcG9ydF9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL3ZhcmlhYmxlX25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvbWl4aW5fZGVmX25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvbWl4aW5fbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS90cmFjZV9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL2NvbnRlbnRfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9mdW5jdGlvbl9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL3JldHVybl9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL2V4dGVuZF9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL2lmX25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvd2hpbGVfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9mb3Jfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9lYWNoX25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvZGVidWdfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS93YXJuX25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvaW1wb3J0X25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvY2hhcnNldF9ub2RlJworcmVxdWlyZSAnc2Fzcy90cmVlL2F0X3Jvb3Rfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9rZXlmcmFtZV9ydWxlX25vZGUnCityZXF1aXJlICdzYXNzL3RyZWUvZXJyb3Jfbm9kZScKK3JlcXVpcmUgJ3Nhc3MvdHJlZS92aXNpdG9ycy9iYXNlJworcmVxdWlyZSAnc2Fzcy90cmVlL3Zpc2l0b3JzL3BlcmZvcm0nCityZXF1aXJlICdzYXNzL3RyZWUvdmlzaXRvcnMvY3NzaXplJworcmVxdWlyZSAnc2Fzcy90cmVlL3Zpc2l0b3JzL2V4dGVuZCcKK3JlcXVpcmUgJ3Nhc3MvdHJlZS92aXNpdG9ycy9jb252ZXJ0JworcmVxdWlyZSAnc2Fzcy90cmVlL3Zpc2l0b3JzL3RvX2NzcycKK3JlcXVpcmUgJ3Nhc3MvdHJlZS92aXNpdG9ycy9kZWVwX2NvcHknCityZXF1aXJlICdzYXNzL3RyZWUvdmlzaXRvcnMvc2V0X29wdGlvbnMnCityZXF1aXJlICdzYXNzL3RyZWUvdmlzaXRvcnMvY2hlY2tfbmVzdGluZycKK3JlcXVpcmUgJ3Nhc3Mvc2VsZWN0b3InCityZXF1aXJlICdzYXNzL2Vudmlyb25tZW50JworcmVxdWlyZSAnc2Fzcy9zY3JpcHQnCityZXF1aXJlICdzYXNzL3Njc3MnCityZXF1aXJlICdzYXNzL3N0YWNrJworcmVxdWlyZSAnc2Fzcy9lcnJvcicKK3JlcXVpcmUgJ3Nhc3MvaW1wb3J0ZXJzJworcmVxdWlyZSAnc2Fzcy9zaGFyZWQnCityZXF1aXJlICdzYXNzL21lZGlhJworcmVxdWlyZSAnc2Fzcy9zdXBwb3J0cycKKworbW9kdWxlIFNhc3MKKyAgIyBBIFNhc3MgbWl4aW4gb3IgZnVuY3Rpb24uCisgICMKKyAgIyBgbmFtZWA6IGBTdHJpbmdgCisgICMgOiBUaGUgbmFtZSBvZiB0aGUgbWl4aW4vZnVuY3Rpb24uCisgICMKKyAgIyBgYXJnc2A6IGBBcnJheTwoU2NyaXB0OjpUcmVlOjpOb2RlLCBTY3JpcHQ6OlRyZWU6Ok5vZGUpPmAKKyAgIyA6IFRoZSBhcmd1bWVudHMgZm9yIHRoZSBtaXhpbi9mdW5jdGlvbi4KKyAgIyAgIEVhY2ggZWxlbWVudCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlIG5vZGUgb2YgdGhlIGFyZ3VtZW50CisgICMgICBhbmQgdGhlIHBhcnNlIHRyZWUgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgIworICAjIGBzcGxhdGA6IGBTY3JpcHQ6OlRyZWU6Ok5vZGU/YAorICAjIDogVGhlIHZhcmlhYmxlIG5vZGUgb2YgdGhlIHNwbGF0IGFyZ3VtZW50IGZvciB0aGlzIGNhbGxhYmxlLCBvciBudWxsLgorICAjCisgICMgYGVudmlyb25tZW50YDoge1Nhc3M6OkVudmlyb25tZW50fQorICAjIDogVGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBtaXhpbi9mdW5jdGlvbiB3YXMgZGVmaW5lZC4KKyAgIyAgIFRoaXMgaXMgY2FwdHVyZWQgc28gdGhhdCB0aGUgbWl4aW4vZnVuY3Rpb24gY2FuIGhhdmUgYWNjZXNzCisgICMgICB0byBsb2NhbCB2YXJpYWJsZXMgZGVmaW5lZCBpbiBpdHMgc2NvcGUuCisgICMKKyAgIyBgdHJlZWA6IGBBcnJheTxUcmVlOjpOb2RlPmAKKyAgIyA6IFRoZSBwYXJzZSB0cmVlIGZvciB0aGUgbWl4aW4vZnVuY3Rpb24uCisgICMKKyAgIyBgaGFzX2NvbnRlbnRgOiBgQm9vbGVhbmAKKyAgIyA6IFdoZXRoZXIgdGhlIGNhbGxhYmxlIGFjY2VwdHMgYSBjb250ZW50IGJsb2NrLgorICAjCisgICMgYHR5cGVgOiBgU3RyaW5nYAorICAjIDogVGhlIHVzZXItZnJpZW5kbHkgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGUgY2FsbGFibGUuCisgICMKKyAgIyBgb3JpZ2luYDogYFN5bWJvbGAKKyAgIyA6IEZyb20gd2hlbmNlIGNvbWVzIHRoZSBjYWxsYWJsZTogYDpzdHlsZXNoZWV0YCwgYDpidWlsdGluYCwgYDpjc3NgCisgICMgICBBIGNhbGxhYmxlIHdpdGggYW4gb3JpZ2luIG9mIGA6c3R5bGVzaGVldGAgd2FzIGRlZmluZWQgaW4gdGhlIHN0eWxlc2hlZXQgaXRzZWxmLgorICAjICAgQSBjYWxsYWJsZSB3aXRoIGFuIG9yaWdpbiBvZiBgOmJ1aWx0aW5gIHdhcyBkZWZpbmVkIGluIHJ1YnkuCisgICMgICBBIGNhbGxhYmxlIChmdW5jdGlvbikgd2l0aCBhbiBvcmlnaW4gb2YgYDpjc3NgIHJldHVybnMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYXJndW1lbnRzIHRvIENTUy4KKyAgQ2FsbGFibGUgPSBTdHJ1Y3QubmV3KDpuYW1lLCA6YXJncywgOnNwbGF0LCA6ZW52aXJvbm1lbnQsIDp0cmVlLCA6aGFzX2NvbnRlbnQsIDp0eXBlLCA6b3JpZ2luKQorCisgICMgVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBwYXJzaW5nIGFuZCBjb21waWxhdGlvbiBvZiB0aGUgU2FzcyB0ZW1wbGF0ZS4KKyAgIyBFeGFtcGxlIHVzYWdlOgorICAjCisgICMgICAgIHRlbXBsYXRlID0gRmlsZS5yZWFkKCdzdHlsZXNoZWV0cy9zYXNzeS5zYXNzJykKKyAgIyAgICAgc2Fzc19lbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KHRlbXBsYXRlKQorICAjICAgICBvdXRwdXQgPSBzYXNzX2VuZ2luZS5yZW5kZXIKKyAgIyAgICAgcHV0cyBvdXRwdXQKKyAgY2xhc3MgRW5naW5lCisgICAgQEBvbGRfcHJvcGVydHlfZGVwcmVjYXRpb24gPSBEZXByZWNhdGlvbi5uZXcKKworICAgICMgQSBsaW5lIG9mIFNhc3MgY29kZS4KKyAgICAjCisgICAgIyBgdGV4dGA6IGBTdHJpbmdgCisgICAgIyA6IFRoZSB0ZXh0IGluIHRoZSBsaW5lLCB3aXRob3V0IGFueSB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kLgorICAgICMKKyAgICAjIGB0YWJzYDogYEludGVnZXJgCisgICAgIyA6IFRoZSBsZXZlbCBvZiBpbmRlbnRhdGlvbiBvZiB0aGUgbGluZS4KKyAgICAjCisgICAgIyBgaW5kZXhgOiBgSW50ZWdlcmAKKyAgICAjIDogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudC4KKyAgICAjCisgICAgIyBgb2Zmc2V0YDogYEludGVnZXJgCisgICAgIyA6IFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gb24gdGhlIGxpbmUgdGhhdCB0aGUgdGV4dCBiZWdpbnMuCisgICAgIyAgIFRoaXMgZW5kcyB1cCBiZWluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGxlYWRpbmcgd2hpdGVzcGFjZS4KKyAgICAjCisgICAgIyBgZmlsZW5hbWVgOiBgU3RyaW5nYAorICAgICMgOiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGlzIGxpbmUgYXBwZWFyZWQuCisgICAgIworICAgICMgYGNoaWxkcmVuYDogYEFycmF5PExpbmU+YAorICAgICMgOiBUaGUgbGluZXMgbmVzdGVkIGJlbG93IHRoaXMgb25lLgorICAgICMKKyAgICAjIGBjb21tZW50X3RhYl9zdHJgOiBgU3RyaW5nP2AKKyAgICAjIDogVGhlIHByZWZpeCBpbmRlbnRhdGlvbiBmb3IgdGhpcyBjb21tZW50LCBpZiBpdCBpcyBhIGNvbW1lbnQuCisgICAgY2xhc3MgTGluZSA8IFN0cnVjdC5uZXcoOnRleHQsIDp0YWJzLCA6aW5kZXgsIDpvZmZzZXQsIDpmaWxlbmFtZSwgOmNoaWxkcmVuLCA6Y29tbWVudF90YWJfc3RyKQorICAgICAgZGVmIGNvbW1lbnQ/CisgICAgICAgIHRleHRbMF0gPT0gQ09NTUVOVF9DSEFSICYmICh0ZXh0WzFdID09IFNBU1NfQ09NTUVOVF9DSEFSIHx8IHRleHRbMV0gPT0gQ1NTX0NPTU1FTlRfQ0hBUikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUgY2hhcmFjdGVyIHRoYXQgYmVnaW5zIGEgQ1NTIHByb3BlcnR5LgorICAgIFBST1BFUlRZX0NIQVIgID0gPzoKKworICAgICMgVGhlIGNoYXJhY3RlciB0aGF0IGRlc2lnbmF0ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGNvbW1lbnQsCisgICAgIyBlaXRoZXIgU2FzcyBvciBDU1MuCisgICAgQ09NTUVOVF9DSEFSID0gPy8KKworICAgICMgVGhlIGNoYXJhY3RlciB0aGF0IGZvbGxvd3MgdGhlIGdlbmVyYWwgQ09NTUVOVF9DSEFSIGFuZCBkZXNpZ25hdGVzIGEgU2FzcyBjb21tZW50LAorICAgICMgd2hpY2ggaXMgbm90IG91dHB1dCBhcyBhIENTUyBjb21tZW50LgorICAgIFNBU1NfQ09NTUVOVF9DSEFSID0gPy8KKworICAgICMgVGhlIGNoYXJhY3RlciB0aGF0IGluZGljYXRlcyB0aGF0IGEgY29tbWVudCBhbGxvd3MgaW50ZXJwb2xhdGlvbgorICAgICMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgZXZlbiBpbiBgOmNvbXByZXNzZWRgIG1vZGUuCisgICAgU0FTU19MT1VEX0NPTU1FTlRfQ0hBUiA9ID8hCisKKyAgICAjIFRoZSBjaGFyYWN0ZXIgdGhhdCBmb2xsb3dzIHRoZSBnZW5lcmFsIENPTU1FTlRfQ0hBUiBhbmQgZGVzaWduYXRlcyBhIENTUyBjb21tZW50LAorICAgICMgd2hpY2ggaXMgZW1iZWRkZWQgaW4gdGhlIENTUyBkb2N1bWVudC4KKyAgICBDU1NfQ09NTUVOVF9DSEFSID0gPyoKKworICAgICMgVGhlIGNoYXJhY3RlciB1c2VkIHRvIGRlbm90ZSBhIGNvbXBpbGVyIGRpcmVjdGl2ZS4KKyAgICBESVJFQ1RJVkVfQ0hBUiA9ID9ACisKKyAgICAjIERlc2lnbmF0ZXMgYSBub24tcGFyc2VkIHJ1bGUuCisgICAgRVNDQVBFX0NIQVIgICAgPSA/XFwKKworICAgICMgRGVzaWduYXRlcyBibG9jayBhcyBtaXhpbiBkZWZpbml0aW9uIHJhdGhlciB0aGFuIENTUyBydWxlcyB0byBvdXRwdXQKKyAgICBNSVhJTl9ERUZJTklUSU9OX0NIQVIgPSA/PQorCisgICAgIyBJbmNsdWRlcyBuYW1lZCBtaXhpbiBkZWNsYXJlZCB1c2luZyBNSVhJTl9ERUZJTklUSU9OX0NIQVIKKyAgICBNSVhJTl9JTkNMVURFX0NIQVIgICAgPSA/KworCisgICAgIyBUaGUgcmVnZXggdGhhdCBtYXRjaGVzIGFuZCBleHRyYWN0cyBkYXRhIGZyb20KKyAgICAjIHByb3BlcnRpZXMgb2YgdGhlIGZvcm0gYDpuYW1lIHByb3BgLgorICAgIFBST1BFUlRZX09MRCA9IC9eOihbXlxzPToiXSspXHMqKD86XHMrfCQpKC4qKS8KKworICAgICMgVGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgU2Fzczo6RW5naW5lLgorICAgICMgQGFwaSBwdWJsaWMKKyAgICBERUZBVUxUX09QVElPTlMgPSB7CisgICAgICA6c3R5bGUgPT4gOm5lc3RlZCwKKyAgICAgIDpsb2FkX3BhdGhzID0+IFtdLAorICAgICAgOmNhY2hlID0+IHRydWUsCisgICAgICA6Y2FjaGVfbG9jYXRpb24gPT4gJy4vLnNhc3MtY2FjaGUnLAorICAgICAgOnN5bnRheCA9PiA6c2FzcywKKyAgICAgIDpmaWxlc3lzdGVtX2ltcG9ydGVyID0+IFNhc3M6OkltcG9ydGVyczo6RmlsZXN5c3RlbQorICAgIH0uZnJlZXplCisKKyAgICAjIENvbnZlcnRzIGEgU2FzcyBvcHRpb25zIGhhc2ggaW50byBhIHN0YW5kYXJkIGZvcm0sIGZpbGxpbmcgaW4KKyAgICAjIGRlZmF1bHQgdmFsdWVzIGFuZCByZXNvbHZpbmcgYWxpYXNlcy4KKyAgICAjCisgICAgIyBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBUaGUgb3B0aW9ucyBoYXNoOworICAgICMgICBzZWUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjT3B0aW9ucyB0aGUgU2FzcyBvcHRpb25zIGRvY3VtZW50YXRpb259CisgICAgIyBAcmV0dXJuIFt7U3ltYm9sID0+IE9iamVjdH1dIFRoZSBub3JtYWxpemVkIG9wdGlvbnMgaGFzaC4KKyAgICAjIEBwcml2YXRlCisgICAgZGVmIHNlbGYubm9ybWFsaXplX29wdGlvbnMob3B0aW9ucykKKyAgICAgIG9wdGlvbnMgPSBERUZBVUxUX09QVElPTlMubWVyZ2Uob3B0aW9ucy5yZWplY3Qge3xfaywgdnwgdi5uaWw/fSkKKworICAgICAgIyBJZiB0aGUgYDpmaWxlbmFtZWAgb3B0aW9uIGlzIHBhc3NlZCBpbiB3aXRob3V0IGFuIGltcG9ydGVyLAorICAgICAgIyBhc3N1bWUgaXQncyB1c2luZyB0aGUgZGVmYXVsdCBmaWxlc3lzdGVtIGltcG9ydGVyLgorICAgICAgb3B0aW9uc1s6aW1wb3J0ZXJdIHx8PSBvcHRpb25zWzpmaWxlc3lzdGVtX2ltcG9ydGVyXS5uZXcoIi4iKSBpZiBvcHRpb25zWzpmaWxlbmFtZV0KKworICAgICAgIyBUcmFja3MgdGhlIG9yaWdpbmFsIGZpbGVuYW1lIG9mIHRoZSB0b3AtbGV2ZWwgU2FzcyBmaWxlCisgICAgICBvcHRpb25zWzpvcmlnaW5hbF9maWxlbmFtZV0gfHw9IG9wdGlvbnNbOmZpbGVuYW1lXQorCisgICAgICBvcHRpb25zWzpjYWNoZV9zdG9yZV0gfHw9IFNhc3M6OkNhY2hlU3RvcmVzOjpDaGFpbi5uZXcoCisgICAgICAgIFNhc3M6OkNhY2hlU3RvcmVzOjpNZW1vcnkubmV3LCBTYXNzOjpDYWNoZVN0b3Jlczo6RmlsZXN5c3RlbS5uZXcob3B0aW9uc1s6Y2FjaGVfbG9jYXRpb25dKSkKKyAgICAgICMgU3VwcG9ydCBib3RoLCBiZWNhdXNlIHRoZSBkb2NzIHNhaWQgb25lIGFuZCB0aGUgb3RoZXIgYWN0dWFsbHkgd29ya2VkCisgICAgICAjIGZvciBxdWl0ZSBhIGxvbmcgdGltZS4KKyAgICAgIG9wdGlvbnNbOmxpbmVfY29tbWVudHNdIHx8PSBvcHRpb25zWzpsaW5lX251bWJlcnNdCisKKyAgICAgIG9wdGlvbnNbOmxvYWRfcGF0aHNdID0gKG9wdGlvbnNbOmxvYWRfcGF0aHNdICsgU2Fzcy5sb2FkX3BhdGhzKS5tYXAgZG8gfHB8CisgICAgICAgIG5leHQgcCB1bmxlc3MgcC5pc19hPyhTdHJpbmcpIHx8IChkZWZpbmVkPyhQYXRobmFtZSkgJiYgcC5pc19hPyhQYXRobmFtZSkpCisgICAgICAgIG9wdGlvbnNbOmZpbGVzeXN0ZW1faW1wb3J0ZXJdLm5ldyhwLnRvX3MpCisgICAgICBlbmQKKworICAgICAgIyBSZW1vdmUgYW55IGRlcHJlY2F0ZWQgaW1wb3J0ZXJzIGlmIHRoZSBsb2NhdGlvbiBpcyBpbXBvcnRlZCBleHBsaWNpdGx5CisgICAgICBvcHRpb25zWzpsb2FkX3BhdGhzXS5yZWplY3QhIGRvIHxpbXBvcnRlcnwKKyAgICAgICAgaW1wb3J0ZXIuaXNfYT8oU2Fzczo6SW1wb3J0ZXJzOjpEZXByZWNhdGVkUGF0aCkgJiYKKyAgICAgICAgICBvcHRpb25zWzpsb2FkX3BhdGhzXS5maW5kIGRvIHxvdGhlcl9pbXBvcnRlcnwKKyAgICAgICAgICAgIG90aGVyX2ltcG9ydGVyLmlzX2E/KFNhc3M6OkltcG9ydGVyczo6RmlsZXN5c3RlbSkgJiYKKyAgICAgICAgICAgICAgb3RoZXJfaW1wb3J0ZXIgIT0gaW1wb3J0ZXIgJiYKKyAgICAgICAgICAgICAgb3RoZXJfaW1wb3J0ZXIucm9vdCA9PSBpbXBvcnRlci5yb290CisgICAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgb3B0aW9uc1s6cHJvcGVydHlfc3ludGF4XSB8fD0gb3B0aW9uc1s6YXR0cmlidXRlX3N5bnRheF0KKyAgICAgIGNhc2Ugb3B0aW9uc1s6cHJvcGVydHlfc3ludGF4XQorICAgICAgd2hlbiA6YWx0ZXJuYXRlOyBvcHRpb25zWzpwcm9wZXJ0eV9zeW50YXhdID0gOm5ldworICAgICAgd2hlbiA6bm9ybWFsOyBvcHRpb25zWzpwcm9wZXJ0eV9zeW50YXhdID0gOm9sZAorICAgICAgZW5kCisgICAgICBvcHRpb25zWzpzb3VyY2VtYXBdID0gOmF1dG8gaWYgb3B0aW9uc1s6c291cmNlbWFwXSA9PSB0cnVlCisgICAgICBvcHRpb25zWzpzb3VyY2VtYXBdID0gOm5vbmUgaWYgb3B0aW9uc1s6c291cmNlbWFwXSA9PSBmYWxzZQorCisgICAgICBvcHRpb25zCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIHtTYXNzOjpFbmdpbmV9IGZvciB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAjIFRoaXMgaXMgcHJlZmVyYWJsZSB0byBTYXNzOjpFbmdpbmUubmV3IHdoZW4gcmVhZGluZyBmcm9tIGEgZmlsZQorICAgICMgYmVjYXVzZSBpdCBwcm9wZXJseSBzZXRzIHVwIHRoZSBFbmdpbmUncyBtZXRhZGF0YSwKKyAgICAjIGVuYWJsZXMgcGFyc2UtdHJlZSBjYWNoaW5nLAorICAgICMgYW5kIGluZmVycyB0aGUgc3ludGF4IGZyb20gdGhlIGZpbGVuYW1lLgorICAgICMKKyAgICAjIEBwYXJhbSBmaWxlbmFtZSBbU3RyaW5nXSBUaGUgcGF0aCB0byB0aGUgU2FzcyBvciBTQ1NTIGZpbGUKKyAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIFRoZSBvcHRpb25zIGhhc2g7CisgICAgIyAgIFNlZSB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNPcHRpb25zIHRoZSBTYXNzIG9wdGlvbnMgZG9jdW1lbnRhdGlvbn0uCisgICAgIyBAcmV0dXJuIFtTYXNzOjpFbmdpbmVdIFRoZSBFbmdpbmUgZm9yIHRoZSBnaXZlbiBTYXNzIG9yIFNDU1MgZmlsZS4KKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZXJlJ3MgYW4gZXJyb3IgaW4gdGhlIGRvY3VtZW50LgorICAgIGRlZiBzZWxmLmZvcl9maWxlKGZpbGVuYW1lLCBvcHRpb25zKQorICAgICAgaGFkX3N5bnRheCA9IG9wdGlvbnNbOnN5bnRheF0KKworICAgICAgaWYgaGFkX3N5bnRheAorICAgICAgICAjIFVzZSB3aGF0IHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZAorICAgICAgZWxzaWYgZmlsZW5hbWUgPX4gL1wuc2NzcyQvCisgICAgICAgIG9wdGlvbnMubWVyZ2UhKDpzeW50YXggPT4gOnNjc3MpCisgICAgICBlbHNpZiBmaWxlbmFtZSA9fiAvXC5zYXNzJC8KKyAgICAgICAgb3B0aW9ucy5tZXJnZSEoOnN5bnRheCA9PiA6c2FzcykKKyAgICAgIGVuZAorCisgICAgICBTYXNzOjpFbmdpbmUubmV3KEZpbGUucmVhZChmaWxlbmFtZSksIG9wdGlvbnMubWVyZ2UoOmZpbGVuYW1lID0+IGZpbGVuYW1lKSkKKyAgICBlbmQKKworICAgICMgVGhlIG9wdGlvbnMgZm9yIHRoZSBTYXNzIGVuZ2luZS4KKyAgICAjIFNlZSB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNPcHRpb25zIHRoZSBTYXNzIG9wdGlvbnMgZG9jdW1lbnRhdGlvbn0uCisgICAgIworICAgICMgQHJldHVybiBbe1N5bWJvbCA9PiBPYmplY3R9XQorICAgIGF0dHJfcmVhZGVyIDpvcHRpb25zCisKKyAgICAjIENyZWF0ZXMgYSBuZXcgRW5naW5lLiBOb3RlIHRoYXQgRW5naW5lIHNob3VsZCBvbmx5IGJlIHVzZWQgZGlyZWN0bHkKKyAgICAjIHdoZW4gY29tcGlsaW5nIGluLW1lbW9yeSBTYXNzIGNvZGUuCisgICAgIyBJZiB5b3UncmUgY29tcGlsaW5nIGEgc2luZ2xlIFNhc3MgZmlsZSBmcm9tIHRoZSBmaWxlc3lzdGVtLAorICAgICMgdXNlIFx7U2Fzczo6RW5naW5lLmZvclxfZmlsZX0uCisgICAgIyBJZiB5b3UncmUgY29tcGlsaW5nIG11bHRpcGxlIGZpbGVzIGZyb20gdGhlIGZpbGVzeXN0ZW0sCisgICAgIyB1c2Uge1Nhc3M6OlBsdWdpbn0uCisgICAgIworICAgICMgQHBhcmFtIHRlbXBsYXRlIFtTdHJpbmddIFRoZSBTYXNzIHRlbXBsYXRlLgorICAgICMgICBUaGlzIHRlbXBsYXRlIGNhbiBiZSBlbmNvZGVkIHVzaW5nIGFueSBlbmNvZGluZworICAgICMgICB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZS4KKyAgICAjICAgSWYgdGhlIHRlbXBsYXRlIGNvbnRhaW5zIGFuIGBAY2hhcnNldGAgZGVjbGFyYXRpb24sCisgICAgIyAgIHRoYXQgb3ZlcnJpZGVzIHRoZSBSdWJ5IGVuY29kaW5nCisgICAgIyAgIChzZWUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjRW5jb2RpbmdzIHRoZSBlbmNvZGluZyBkb2N1bWVudGF0aW9ufSkKKyAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIEFuIG9wdGlvbnMgaGFzaC4KKyAgICAjICAgU2VlIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI09wdGlvbnMgdGhlIFNhc3Mgb3B0aW9ucyBkb2N1bWVudGF0aW9ufS4KKyAgICAjIEBzZWUge1Nhc3M6OkVuZ2luZS5mb3JfZmlsZX0KKyAgICAjIEBzZWUge1Nhc3M6OlBsdWdpbn0KKyAgICBkZWYgaW5pdGlhbGl6ZSh0ZW1wbGF0ZSwgb3B0aW9ucyA9IHt9KQorICAgICAgQG9wdGlvbnMgPSBzZWxmLmNsYXNzLm5vcm1hbGl6ZV9vcHRpb25zKG9wdGlvbnMpCisgICAgICBAdGVtcGxhdGUgPSB0ZW1wbGF0ZQorICAgICAgQGNoZWNrZWRfZW5jb2RpbmcgPSBmYWxzZQorICAgICAgQGZpbGVuYW1lID0gbmlsCisgICAgICBAbGluZSA9IG5pbAorICAgIGVuZAorCisgICAgIyBSZW5kZXIgdGhlIHRlbXBsYXRlIHRvIENTUy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBDU1MKKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZXJlJ3MgYW4gZXJyb3IgaW4gdGhlIGRvY3VtZW50CisgICAgIyBAcmFpc2UgW0VuY29kaW5nOjpVbmRlZmluZWRDb252ZXJzaW9uRXJyb3JdIGlmIHRoZSBzb3VyY2UgZW5jb2RpbmcKKyAgICAjICAgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBVVEYtOAorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiB0aGUgZG9jdW1lbnQgdXNlcyBhbiB1bmtub3duIGVuY29kaW5nIHdpdGggYEBjaGFyc2V0YAorICAgIGRlZiByZW5kZXIKKyAgICAgIHJldHVybiBfdG9fdHJlZS5yZW5kZXIgdW5sZXNzIEBvcHRpb25zWzpxdWlldF0KKyAgICAgIFNhc3M6OlV0aWwuc2lsZW5jZV9zYXNzX3dhcm5pbmdzIHtfdG9fdHJlZS5yZW5kZXJ9CisgICAgZW5kCisKKyAgICAjIFJlbmRlciB0aGUgdGVtcGxhdGUgdG8gQ1NTIGFuZCByZXR1cm4gdGhlIHNvdXJjZSBtYXAuCisgICAgIworICAgICMgQHBhcmFtIHNvdXJjZW1hcF91cmkgW1N0cmluZ10gVGhlIHNvdXJjZW1hcCBVUkkgdG8gdXNlIGluIHRoZQorICAgICMgICBgQHNvdXJjZU1hcHBpbmdVUkxgIGNvbW1lbnQuIElmIHRoaXMgaXMgcmVsYXRpdmUsIGl0IHNob3VsZCBiZSByZWxhdGl2ZQorICAgICMgICB0byB0aGUgbG9jYXRpb24gb2YgdGhlIENTUyBmaWxlLgorICAgICMgQHJldHVybiBbKFN0cmluZywgU2Fzczo6U291cmNlOjpNYXApXSBUaGUgcmVuZGVyZWQgQ1NTIGFuZCB0aGUgYXNzb2NpYXRlZAorICAgICMgICBzb3VyY2UgbWFwCisgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGVyZSdzIGFuIGVycm9yIGluIHRoZSBkb2N1bWVudCwgb3IgaWYgdGhlCisgICAgIyAgIHB1YmxpYyBVUkwgZm9yIHRoaXMgZG9jdW1lbnQgY291bGRuJ3QgYmUgZGV0ZXJtaW5lZC4KKyAgICAjIEByYWlzZSBbRW5jb2Rpbmc6OlVuZGVmaW5lZENvbnZlcnNpb25FcnJvcl0gaWYgdGhlIHNvdXJjZSBlbmNvZGluZworICAgICMgICBjYW5ub3QgYmUgY29udmVydGVkIHRvIFVURi04CisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIHRoZSBkb2N1bWVudCB1c2VzIGFuIHVua25vd24gZW5jb2Rpbmcgd2l0aCBgQGNoYXJzZXRgCisgICAgZGVmIHJlbmRlcl93aXRoX3NvdXJjZW1hcChzb3VyY2VtYXBfdXJpKQorICAgICAgcmV0dXJuIF9yZW5kZXJfd2l0aF9zb3VyY2VtYXAoc291cmNlbWFwX3VyaSkgdW5sZXNzIEBvcHRpb25zWzpxdWlldF0KKyAgICAgIFNhc3M6OlV0aWwuc2lsZW5jZV9zYXNzX3dhcm5pbmdzIHtfcmVuZGVyX3dpdGhfc291cmNlbWFwKHNvdXJjZW1hcF91cmkpfQorICAgIGVuZAorCisgICAgYWxpYXNfbWV0aG9kIDp0b19jc3MsIDpyZW5kZXIKKworICAgICMgUGFyc2VzIHRoZSBkb2N1bWVudCBpbnRvIGl0cyBwYXJzZSB0cmVlLiBNZW1vaXplZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpUcmVlOjpOb2RlXSBUaGUgcm9vdCBvZiB0aGUgcGFyc2UgdHJlZS4KKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZXJlJ3MgYW4gZXJyb3IgaW4gdGhlIGRvY3VtZW50CisgICAgZGVmIHRvX3RyZWUKKyAgICAgIEB0cmVlIHx8PSBpZiBAb3B0aW9uc1s6cXVpZXRdCisgICAgICAgICAgICAgICAgICBTYXNzOjpVdGlsLnNpbGVuY2Vfc2Fzc193YXJuaW5ncyB7X3RvX3RyZWV9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgX3RvX3RyZWUKKyAgICAgICAgICAgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgb3JpZ2luYWwgZW5jb2Rpbmcgb2YgdGhlIGRvY3VtZW50LgorICAgICMKKyAgICAjIEByZXR1cm4gW0VuY29kaW5nLCBuaWxdCisgICAgIyBAcmFpc2UgW0VuY29kaW5nOjpVbmRlZmluZWRDb252ZXJzaW9uRXJyb3JdIGlmIHRoZSBzb3VyY2UgZW5jb2RpbmcKKyAgICAjICAgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBVVEYtOAorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiB0aGUgZG9jdW1lbnQgdXNlcyBhbiB1bmtub3duIGVuY29kaW5nIHdpdGggYEBjaGFyc2V0YAorICAgIGRlZiBzb3VyY2VfZW5jb2RpbmcKKyAgICAgIGNoZWNrX2VuY29kaW5nIQorICAgICAgQHNvdXJjZV9lbmNvZGluZworICAgIGVuZAorCisgICAgIyBHZXRzIGEgc2V0IG9mIGFsbCB0aGUgZG9jdW1lbnRzCisgICAgIyB0aGF0IGFyZSAodHJhbnNpdGl2ZSkgZGVwZW5kZW5jaWVzIG9mIHRoaXMgZG9jdW1lbnQsCisgICAgIyBub3QgaW5jbHVkaW5nIHRoZSBkb2N1bWVudCBpdHNlbGYuCisgICAgIworICAgICMgQHJldHVybiBbW1Nhc3M6OkVuZ2luZV1dIFRoZSBkZXBlbmRlbmN5IGRvY3VtZW50cy4KKyAgICBkZWYgZGVwZW5kZW5jaWVzCisgICAgICBfZGVwZW5kZW5jaWVzKFNldC5uZXcsIGVuZ2luZXMgPSBTZXQubmV3KQorICAgICAgU2Fzczo6VXRpbC5hcnJheV9taW51cyhlbmdpbmVzLCBbc2VsZl0pCisgICAgZW5kCisKKyAgICAjIEhlbHBlciBmb3IgXHsjZGVwZW5kZW5jaWVzfS4KKyAgICAjCisgICAgIyBAcHJpdmF0ZQorICAgIGRlZiBfZGVwZW5kZW5jaWVzKHNlZW4sIGVuZ2luZXMpCisgICAgICBrZXkgPSBbQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXV0KKyAgICAgIHJldHVybiBpZiBzZWVuLmluY2x1ZGU/KGtleSkKKyAgICAgIHNlZW4gPDwga2V5CisgICAgICBlbmdpbmVzIDw8IHNlbGYKKyAgICAgIHRvX3RyZWUuZ3JlcChUcmVlOjpJbXBvcnROb2RlKSBkbyB8bnwKKyAgICAgICAgbmV4dCBpZiBuLmNzc19pbXBvcnQ/CisgICAgICAgIG4uaW1wb3J0ZWRfZmlsZS5fZGVwZW5kZW5jaWVzKHNlZW4sIGVuZ2luZXMpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBfcmVuZGVyX3dpdGhfc291cmNlbWFwKHNvdXJjZW1hcF91cmkpCisgICAgICBmaWxlbmFtZSA9IEBvcHRpb25zWzpmaWxlbmFtZV0KKyAgICAgIGltcG9ydGVyID0gQG9wdGlvbnNbOmltcG9ydGVyXQorICAgICAgc291cmNlbWFwX2RpciA9IEBvcHRpb25zWzpzb3VyY2VtYXBfZmlsZW5hbWVdICYmCisgICAgICAgIEZpbGUuZGlybmFtZShGaWxlLmV4cGFuZF9wYXRoKEBvcHRpb25zWzpzb3VyY2VtYXBfZmlsZW5hbWVdKSkKKyAgICAgIGlmIGZpbGVuYW1lLm5pbD8KKyAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KDw8RVJSKQorRXJyb3IgZ2VuZXJhdGluZyBzb3VyY2UgbWFwOiBjb3VsZG4ndCBkZXRlcm1pbmUgcHVibGljIFVSTCBmb3IgdGhlIHNvdXJjZSBzdHlsZXNoZWV0LgorICBObyBmaWxlbmFtZSBpcyBhdmFpbGFibGUgc28gdGhlcmUncyBub3RoaW5nIGZvciB0aGUgc291cmNlIG1hcCB0byBsaW5rIHRvLgorRVJSCisgICAgICBlbHNpZiBpbXBvcnRlci5uaWw/CisgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldyg8PEVSUikKK0Vycm9yIGdlbmVyYXRpbmcgc291cmNlIG1hcDogY291bGRuJ3QgZGV0ZXJtaW5lIHB1YmxpYyBVUkwgZm9yICIje2ZpbGVuYW1lfSIuCisgIFdpdGhvdXQgYSBwdWJsaWMgVVJMLCB0aGVyZSdzIG5vdGhpbmcgZm9yIHRoZSBzb3VyY2UgbWFwIHRvIGxpbmsgdG8uCisgIEFuIGltcG9ydGVyIHdhcyBub3Qgc2V0IGZvciB0aGlzIGZpbGUuCitFUlIKKyAgICAgIGVsc2lmIFNhc3M6OlV0aWwuc2lsZW5jZV93YXJuaW5ncyBkbworICAgICAgICAgICAgICBzb3VyY2VtYXBfZGlyID0gbmlsIGlmIEBvcHRpb25zWzpzb3VyY2VtYXBdID09IDpmaWxlCisgICAgICAgICAgICAgIGltcG9ydGVyLnB1YmxpY191cmwoZmlsZW5hbWUsIHNvdXJjZW1hcF9kaXIpLm5pbD8KKyAgICAgICAgICAgIGVuZAorICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoPDxFUlIpCitFcnJvciBnZW5lcmF0aW5nIHNvdXJjZSBtYXA6IGNvdWxkbid0IGRldGVybWluZSBwdWJsaWMgVVJMIGZvciAiI3tmaWxlbmFtZX0iLgorICBXaXRob3V0IGEgcHVibGljIFVSTCwgdGhlcmUncyBub3RoaW5nIGZvciB0aGUgc291cmNlIG1hcCB0byBsaW5rIHRvLgorICBDdXN0b20gaW1wb3J0ZXJzIHNob3VsZCBkZWZpbmUgdGhlICNwdWJsaWNfdXJsIG1ldGhvZC4KK0VSUgorICAgICAgZW5kCisKKyAgICAgIHJlbmRlcmVkLCBzb3VyY2VtYXAgPSBfdG9fdHJlZS5yZW5kZXJfd2l0aF9zb3VyY2VtYXAKKyAgICAgIGNvbXByZXNzZWQgPSBAb3B0aW9uc1s6c3R5bGVdID09IDpjb21wcmVzc2VkCisgICAgICByZW5kZXJlZCA8PCAiXG4iIGlmIHJlbmRlcmVkWy0xXSAhPSA/XG4KKyAgICAgIHJlbmRlcmVkIDw8ICJcbiIgdW5sZXNzIGNvbXByZXNzZWQKKyAgICAgIHJlbmRlcmVkIDw8ICIvKiMgc291cmNlTWFwcGluZ1VSTD0iCisgICAgICByZW5kZXJlZCA8PCBVUkk6OkRFRkFVTFRfUEFSU0VSLmVzY2FwZShzb3VyY2VtYXBfdXJpKQorICAgICAgcmVuZGVyZWQgPDwgIiAqL1xuIgorICAgICAgcmV0dXJuIHJlbmRlcmVkLCBzb3VyY2VtYXAKKyAgICBlbmQKKworICAgIGRlZiBfdG9fdHJlZQorICAgICAgY2hlY2tfZW5jb2RpbmchCisKKyAgICAgIGlmIChAb3B0aW9uc1s6Y2FjaGVdIHx8IEBvcHRpb25zWzpyZWFkX2NhY2hlXSkgJiYKKyAgICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdICYmIEBvcHRpb25zWzppbXBvcnRlcl0KKyAgICAgICAga2V5ID0gc2Fzc2Nfa2V5CisgICAgICAgIHNoYSA9IERpZ2VzdDo6U0hBMS5oZXhkaWdlc3QoQHRlbXBsYXRlKQorCisgICAgICAgIGlmIChyb290ID0gQG9wdGlvbnNbOmNhY2hlX3N0b3JlXS5yZXRyaWV2ZShrZXksIHNoYSkpCisgICAgICAgICAgcm9vdC5vcHRpb25zID0gQG9wdGlvbnMKKyAgICAgICAgICByZXR1cm4gcm9vdAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBpZiBAb3B0aW9uc1s6c3ludGF4XSA9PSA6c2NzcworICAgICAgICByb290ID0gU2Fzczo6U0NTUzo6UGFyc2VyLm5ldyhAdGVtcGxhdGUsIEBvcHRpb25zWzpmaWxlbmFtZV0sIEBvcHRpb25zWzppbXBvcnRlcl0pLnBhcnNlCisgICAgICBlbHNlCisgICAgICAgIHJvb3QgPSBUcmVlOjpSb290Tm9kZS5uZXcoQHRlbXBsYXRlKQorICAgICAgICBhcHBlbmRfY2hpbGRyZW4ocm9vdCwgdHJlZSh0YWJ1bGF0ZShAdGVtcGxhdGUpKS5maXJzdCwgdHJ1ZSkKKyAgICAgIGVuZAorCisgICAgICByb290Lm9wdGlvbnMgPSBAb3B0aW9ucworICAgICAgaWYgQG9wdGlvbnNbOmNhY2hlXSAmJiBrZXkgJiYgc2hhCisgICAgICAgIGJlZ2luCisgICAgICAgICAgb2xkX29wdGlvbnMgPSByb290Lm9wdGlvbnMKKyAgICAgICAgICByb290Lm9wdGlvbnMgPSB7fQorICAgICAgICAgIEBvcHRpb25zWzpjYWNoZV9zdG9yZV0uc3RvcmUoa2V5LCBzaGEsIHJvb3QpCisgICAgICAgIGVuc3VyZQorICAgICAgICAgIHJvb3Qub3B0aW9ucyA9IG9sZF9vcHRpb25zCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICByb290CisgICAgcmVzY3VlIFN5bnRheEVycm9yID0+IGUKKyAgICAgIGUubW9kaWZ5X2JhY2t0cmFjZSg6ZmlsZW5hbWUgPT4gQG9wdGlvbnNbOmZpbGVuYW1lXSwgOmxpbmUgPT4gQGxpbmUpCisgICAgICBlLnNhc3NfdGVtcGxhdGUgPSBAdGVtcGxhdGUKKyAgICAgIHJhaXNlIGUKKyAgICBlbmQKKworICAgIGRlZiBzYXNzY19rZXkKKyAgICAgIEBvcHRpb25zWzpjYWNoZV9zdG9yZV0ua2V5KCpAb3B0aW9uc1s6aW1wb3J0ZXJdLmtleShAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAb3B0aW9ucykpCisgICAgZW5kCisKKyAgICBkZWYgY2hlY2tfZW5jb2RpbmchCisgICAgICByZXR1cm4gaWYgQGNoZWNrZWRfZW5jb2RpbmcKKyAgICAgIEBjaGVja2VkX2VuY29kaW5nID0gdHJ1ZQorICAgICAgQHRlbXBsYXRlLCBAc291cmNlX2VuY29kaW5nID0gU2Fzczo6VXRpbC5jaGVja19zYXNzX2VuY29kaW5nKEB0ZW1wbGF0ZSkKKyAgICBlbmQKKworICAgIGRlZiB0YWJ1bGF0ZShzdHJpbmcpCisgICAgICB0YWJfc3RyID0gbmlsCisgICAgICBjb21tZW50X3RhYl9zdHIgPSBuaWwKKyAgICAgIGZpcnN0ID0gdHJ1ZQorICAgICAgbGluZXMgPSBbXQorICAgICAgc3RyaW5nLnNjYW4oL15bXlxuXSo/JC8pLmVhY2hfd2l0aF9pbmRleCBkbyB8bGluZSwgaW5kZXh8CisgICAgICAgIGluZGV4ICs9IChAb3B0aW9uc1s6bGluZV0gfHwgMSkKKyAgICAgICAgaWYgbGluZS5zdHJpcC5lbXB0eT8KKyAgICAgICAgICBsaW5lcy5sYXN0LnRleHQgPDwgIlxuIiBpZiBsaW5lcy5sYXN0ICYmIGxpbmVzLmxhc3QuY29tbWVudD8KKyAgICAgICAgICBuZXh0CisgICAgICAgIGVuZAorCisgICAgICAgIGxpbmVfdGFiX3N0ciA9IGxpbmVbL15ccyovXQorICAgICAgICB1bmxlc3MgbGluZV90YWJfc3RyLmVtcHR5PworICAgICAgICAgIGlmIHRhYl9zdHIubmlsPworICAgICAgICAgICAgY29tbWVudF90YWJfc3RyIHx8PSBsaW5lX3RhYl9zdHIKKyAgICAgICAgICAgIG5leHQgaWYgdHJ5X2NvbW1lbnQobGluZSwgbGluZXMubGFzdCwgIiIsIGNvbW1lbnRfdGFiX3N0ciwgaW5kZXgpCisgICAgICAgICAgICBjb21tZW50X3RhYl9zdHIgPSBuaWwKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIHRhYl9zdHIgfHw9IGxpbmVfdGFiX3N0cgorCisgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJJbmRlbnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgaXMgaWxsZWdhbC4iLAorICAgICAgICAgICAgOmxpbmUgPT4gaW5kZXgpIGlmIGZpcnN0CisKKyAgICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkluZGVudGF0aW9uIGNhbid0IHVzZSBib3RoIHRhYnMgYW5kIHNwYWNlcy4iLAorICAgICAgICAgICAgOmxpbmUgPT4gaW5kZXgpIGlmIHRhYl9zdHIuaW5jbHVkZT8oP1xzKSAmJiB0YWJfc3RyLmluY2x1ZGU/KD9cdCkKKyAgICAgICAgZW5kCisgICAgICAgIGZpcnN0ICYmPSAhdGFiX3N0ci5uaWw/CisgICAgICAgIGlmIHRhYl9zdHIubmlsPworICAgICAgICAgIGxpbmVzIDw8IExpbmUubmV3KGxpbmUuc3RyaXAsIDAsIGluZGV4LCAwLCBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBbXSkKKyAgICAgICAgICBuZXh0CisgICAgICAgIGVuZAorCisgICAgICAgIGNvbW1lbnRfdGFiX3N0ciB8fD0gbGluZV90YWJfc3RyCisgICAgICAgIGlmIHRyeV9jb21tZW50KGxpbmUsIGxpbmVzLmxhc3QsIHRhYl9zdHIgKiBsaW5lcy5sYXN0LnRhYnMsIGNvbW1lbnRfdGFiX3N0ciwgaW5kZXgpCisgICAgICAgICAgbmV4dAorICAgICAgICBlbHNlCisgICAgICAgICAgY29tbWVudF90YWJfc3RyID0gbmlsCisgICAgICAgIGVuZAorCisgICAgICAgIGxpbmVfdGFicyA9IGxpbmVfdGFiX3N0ci5zY2FuKHRhYl9zdHIpLnNpemUKKyAgICAgICAgaWYgdGFiX3N0ciAqIGxpbmVfdGFicyAhPSBsaW5lX3RhYl9zdHIKKyAgICAgICAgICBtZXNzYWdlID0gPDxFTkQuc3RyaXAudHIoIlxuIiwgJyAnKQorSW5jb25zaXN0ZW50IGluZGVudGF0aW9uOiAje1Nhc3M6OlNoYXJlZC5odW1hbl9pbmRlbnRhdGlvbiBsaW5lX3RhYl9zdHIsIHRydWV9IHVzZWQgZm9yIGluZGVudGF0aW9uLAorYnV0IHRoZSByZXN0IG9mIHRoZSBkb2N1bWVudCB3YXMgaW5kZW50ZWQgdXNpbmcgI3tTYXNzOjpTaGFyZWQuaHVtYW5faW5kZW50YXRpb24gdGFiX3N0cn0uCitFTkQKKyAgICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcobWVzc2FnZSwgOmxpbmUgPT4gaW5kZXgpCisgICAgICAgIGVuZAorCisgICAgICAgIGxpbmVzIDw8IExpbmUubmV3KGxpbmUuc3RyaXAsIGxpbmVfdGFicywgaW5kZXgsIGxpbmVfdGFiX3N0ci5zaXplLCBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBbXSkKKyAgICAgIGVuZAorICAgICAgbGluZXMKKyAgICBlbmQKKworICAgICMgQGNvbW1lbnQKKyAgICBkZWYgdHJ5X2NvbW1lbnQobGluZSwgbGFzdCwgdGFiX3N0ciwgY29tbWVudF90YWJfc3RyLCBpbmRleCkKKyAgICAgIHJldHVybiB1bmxlc3MgbGFzdCAmJiBsYXN0LmNvbW1lbnQ/CisgICAgICAjIE5lc3RlZCBjb21tZW50IHN0dWZmIG11c3QgYmUgYXQgbGVhc3Qgb25lIHdoaXRlc3BhY2UgY2hhciBkZWVwZXIKKyAgICAgICMgdGhhbiB0aGUgbm9ybWFsIGluZGVudGF0aW9uCisgICAgICByZXR1cm4gdW5sZXNzIGxpbmUgPX4gL14je3RhYl9zdHJ9XHMvCisgICAgICB1bmxlc3MgbGluZSA9fiAvXig/OiN7Y29tbWVudF90YWJfc3RyfSkoLiopJC8KKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KDw8TVNHLnN0cmlwLnRyKCJcbiIsICIgIiksIDpsaW5lID0+IGluZGV4KQorSW5jb25zaXN0ZW50IGluZGVudGF0aW9uOgorcHJldmlvdXMgbGluZSB3YXMgaW5kZW50ZWQgYnkgI3tTYXNzOjpTaGFyZWQuaHVtYW5faW5kZW50YXRpb24gY29tbWVudF90YWJfc3RyfSwKK2J1dCB0aGlzIGxpbmUgd2FzIGluZGVudGVkIGJ5ICN7U2Fzczo6U2hhcmVkLmh1bWFuX2luZGVudGF0aW9uIGxpbmVbL15ccyovXX0uCitNU0cKKyAgICAgIGVuZAorCisgICAgICBsYXN0LmNvbW1lbnRfdGFiX3N0ciB8fD0gY29tbWVudF90YWJfc3RyCisgICAgICBsYXN0LnRleHQgPDwgIlxuIiA8PCBsaW5lCisgICAgICB0cnVlCisgICAgZW5kCisKKyAgICBkZWYgdHJlZShhcnIsIGkgPSAwKQorICAgICAgcmV0dXJuIFtdLCBpIGlmIGFycltpXS5uaWw/CisKKyAgICAgIGJhc2UgPSBhcnJbaV0udGFicworICAgICAgbm9kZXMgPSBbXQorICAgICAgd2hpbGUgKGxpbmUgPSBhcnJbaV0pICYmIGxpbmUudGFicyA+PSBiYXNlCisgICAgICAgIGlmIGxpbmUudGFicyA+IGJhc2UKKyAgICAgICAgICBub2Rlcy5sYXN0LmNoaWxkcmVuLCBpID0gdHJlZShhcnIsIGkpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBub2RlcyA8PCBsaW5lCisgICAgICAgICAgaSArPSAxCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICByZXR1cm4gbm9kZXMsIGkKKyAgICBlbmQKKworICAgIGRlZiBidWlsZF90cmVlKHBhcmVudCwgbGluZSwgcm9vdCA9IGZhbHNlKQorICAgICAgQGxpbmUgPSBsaW5lLmluZGV4CisgICAgICBAb2Zmc2V0ID0gbGluZS5vZmZzZXQKKyAgICAgIG5vZGVfb3Jfbm9kZXMgPSBwYXJzZV9saW5lKHBhcmVudCwgbGluZSwgcm9vdCkKKworICAgICAgQXJyYXkobm9kZV9vcl9ub2RlcykuZWFjaCBkbyB8bm9kZXwKKyAgICAgICAgIyBOb2RlIGlzIGEgc3ltYm9sIGlmIGl0J3Mgbm9uLW91dHB1dHRpbmcsIGxpa2UgYSB2YXJpYWJsZSBhc3NpZ25tZW50CisgICAgICAgIG5leHQgdW5sZXNzIG5vZGUuaXNfYT8gVHJlZTo6Tm9kZQorCisgICAgICAgIG5vZGUubGluZSA9IGxpbmUuaW5kZXgKKyAgICAgICAgbm9kZS5maWxlbmFtZSA9IGxpbmUuZmlsZW5hbWUKKworICAgICAgICBhcHBlbmRfY2hpbGRyZW4obm9kZSwgbGluZS5jaGlsZHJlbiwgZmFsc2UpCisgICAgICBlbmQKKworICAgICAgbm9kZV9vcl9ub2RlcworICAgIGVuZAorCisgICAgZGVmIGFwcGVuZF9jaGlsZHJlbihwYXJlbnQsIGNoaWxkcmVuLCByb290KQorICAgICAgY29udGludWVkX3J1bGUgPSBuaWwKKyAgICAgIGNvbnRpbnVlZF9jb21tZW50ID0gbmlsCisgICAgICBjaGlsZHJlbi5lYWNoIGRvIHxsaW5lfAorICAgICAgICBjaGlsZCA9IGJ1aWxkX3RyZWUocGFyZW50LCBsaW5lLCByb290KQorCisgICAgICAgIGlmIGNoaWxkLmlzX2E/KFRyZWU6OlJ1bGVOb2RlKQorICAgICAgICAgIGlmIGNoaWxkLmNvbnRpbnVlZD8gJiYgY2hpbGQuY2hpbGRyZW4uZW1wdHk/CisgICAgICAgICAgICBpZiBjb250aW51ZWRfcnVsZQorICAgICAgICAgICAgICBjb250aW51ZWRfcnVsZS5hZGRfcnVsZXMgY2hpbGQKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgY29udGludWVkX3J1bGUgPSBjaGlsZAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBuZXh0CisgICAgICAgICAgZWxzaWYgY29udGludWVkX3J1bGUKKyAgICAgICAgICAgIGNvbnRpbnVlZF9ydWxlLmFkZF9ydWxlcyBjaGlsZAorICAgICAgICAgICAgY29udGludWVkX3J1bGUuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbgorICAgICAgICAgICAgY29udGludWVkX3J1bGUsIGNoaWxkID0gbmlsLCBjb250aW51ZWRfcnVsZQorICAgICAgICAgIGVuZAorICAgICAgICBlbHNpZiBjb250aW51ZWRfcnVsZQorICAgICAgICAgIGNvbnRpbnVlZF9ydWxlID0gbmlsCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIGNoaWxkLmlzX2E/KFRyZWU6OkNvbW1lbnROb2RlKSAmJiBjaGlsZC50eXBlID09IDpzaWxlbnQKKyAgICAgICAgICBpZiBjb250aW51ZWRfY29tbWVudCAmJgorICAgICAgICAgICAgICBjaGlsZC5saW5lID09IGNvbnRpbnVlZF9jb21tZW50LmxpbmUgKworICAgICAgICAgICAgICBjb250aW51ZWRfY29tbWVudC5saW5lcyArIDEKKyAgICAgICAgICAgIGNvbnRpbnVlZF9jb21tZW50LnZhbHVlLmxhc3Quc3ViISglcnsgXCovXFp9LCAnJykKKyAgICAgICAgICAgIGNoaWxkLnZhbHVlLmZpcnN0LmdzdWIhKCVye1xBL1wqfSwgJyAqJykKKyAgICAgICAgICAgIGNvbnRpbnVlZF9jb21tZW50LnZhbHVlICs9IFsiXG4iXSArIGNoaWxkLnZhbHVlCisgICAgICAgICAgICBuZXh0CisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBjb250aW51ZWRfY29tbWVudCA9IGNoaWxkCisgICAgICAgIGVuZAorCisgICAgICAgIGNoZWNrX2Zvcl9ub19jaGlsZHJlbihjaGlsZCkKKyAgICAgICAgdmFsaWRhdGVfYW5kX2FwcGVuZF9jaGlsZChwYXJlbnQsIGNoaWxkLCBsaW5lLCByb290KQorICAgICAgZW5kCisKKyAgICAgIHBhcmVudAorICAgIGVuZAorCisgICAgZGVmIHZhbGlkYXRlX2FuZF9hcHBlbmRfY2hpbGQocGFyZW50LCBjaGlsZCwgbGluZSwgcm9vdCkKKyAgICAgIGNhc2UgY2hpbGQKKyAgICAgIHdoZW4gQXJyYXkKKyAgICAgICAgY2hpbGQuZWFjaCB7fGN8IHZhbGlkYXRlX2FuZF9hcHBlbmRfY2hpbGQocGFyZW50LCBjLCBsaW5lLCByb290KX0KKyAgICAgIHdoZW4gVHJlZTo6Tm9kZQorICAgICAgICBwYXJlbnQgPDwgY2hpbGQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNoZWNrX2Zvcl9ub19jaGlsZHJlbihub2RlKQorICAgICAgcmV0dXJuIHVubGVzcyBub2RlLmlzX2E/KFRyZWU6OlJ1bGVOb2RlKSAmJiBub2RlLmNoaWxkcmVuLmVtcHR5PworICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4oPDxXQVJOSU5HLnN0cmlwKQorV0FSTklORyBvbiBsaW5lICN7bm9kZS5saW5lfSN7IiBvZiAje25vZGUuZmlsZW5hbWV9IiBpZiBub2RlLmZpbGVuYW1lfToKK1RoaXMgc2VsZWN0b3IgZG9lc24ndCBoYXZlIGFueSBwcm9wZXJ0aWVzIGFuZCB3aWxsIG5vdCBiZSByZW5kZXJlZC4KK1dBUk5JTkcKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9saW5lKHBhcmVudCwgbGluZSwgcm9vdCkKKyAgICAgIGNhc2UgbGluZS50ZXh0WzBdCisgICAgICB3aGVuIFBST1BFUlRZX0NIQVIKKyAgICAgICAgaWYgbGluZS50ZXh0WzFdID09IFBST1BFUlRZX0NIQVIgfHwKKyAgICAgICAgICAgIChAb3B0aW9uc1s6cHJvcGVydHlfc3ludGF4XSA9PSA6bmV3ICYmCisgICAgICAgICAgICAgbGluZS50ZXh0ID1+IFBST1BFUlRZX09MRCAmJiAkMi5lbXB0eT8pCisgICAgICAgICAgIyBTdXBwb3J0IENTUzMtc3R5bGUgcHNldWRvLWVsZW1lbnRzLAorICAgICAgICAgICMgd2hpY2ggYmVnaW4gd2l0aCA6OiwKKyAgICAgICAgICAjIGFzIHdlbGwgYXMgcHNldWRvLWNsYXNzZXMKKyAgICAgICAgICAjIGlmIHdlJ3JlIHVzaW5nIHRoZSBuZXcgcHJvcGVydHkgc3ludGF4CisgICAgICAgICAgVHJlZTo6UnVsZU5vZGUubmV3KHBhcnNlX2ludGVycChsaW5lLnRleHQpLCBmdWxsX2xpbmVfcmFuZ2UobGluZSkpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBuYW1lX3N0YXJ0X29mZnNldCA9IGxpbmUub2Zmc2V0ICsgMSAjICsxIGZvciB0aGUgbGVhZGluZyAnOicKKyAgICAgICAgICBuYW1lLCB2YWx1ZSA9IGxpbmUudGV4dC5zY2FuKFBST1BFUlRZX09MRClbMF0KKyAgICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkludmFsaWQgcHJvcGVydHk6IFwiI3tsaW5lLnRleHR9XCIuIiwKKyAgICAgICAgICAgIDpsaW5lID0+IEBsaW5lKSBpZiBuYW1lLm5pbD8gfHwgdmFsdWUubmlsPworCisgICAgICAgICAgQEBvbGRfcHJvcGVydHlfZGVwcmVjYXRpb24ud2FybihAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAbGluZSwgPDxXQVJOSU5HKQorT2xkLXN0eWxlIHByb3BlcnRpZXMgbGlrZSAiI3tsaW5lLnRleHR9IiBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBhbiBlcnJvciBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgU2Fzcy4KK1VzZSAiI3tuYW1lfTogI3t2YWx1ZX0iIGluc3RlYWQuCitXQVJOSU5HCisKKyAgICAgICAgICB2YWx1ZV9zdGFydF9vZmZzZXQgPSBuYW1lX2VuZF9vZmZzZXQgPSBuYW1lX3N0YXJ0X29mZnNldCArIG5hbWUubGVuZ3RoCisgICAgICAgICAgdW5sZXNzIHZhbHVlLmVtcHR5PworICAgICAgICAgICAgIyArMSBhbmQgLTEgYm90aCBjb21wZW5zYXRlIGZvciB0aGUgbGVhZGluZyAnOicsIHdoaWNoIGlzIHBhcnQgb2YgbGluZS50ZXh0CisgICAgICAgICAgICB2YWx1ZV9zdGFydF9vZmZzZXQgPSBuYW1lX3N0YXJ0X29mZnNldCArIGxpbmUudGV4dC5pbmRleCh2YWx1ZSwgbmFtZS5sZW5ndGggKyAxKSAtIDEKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIHByb3BlcnR5ID0gcGFyc2VfcHJvcGVydHkobmFtZSwgcGFyc2VfaW50ZXJwKG5hbWUpLCB2YWx1ZSwgOm9sZCwgbGluZSwgdmFsdWVfc3RhcnRfb2Zmc2V0KQorICAgICAgICAgIHByb3BlcnR5Lm5hbWVfc291cmNlX3JhbmdlID0gU2Fzczo6U291cmNlOjpSYW5nZS5uZXcoCisgICAgICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgdG9fcGFyc2VyX29mZnNldChuYW1lX3N0YXJ0X29mZnNldCkpLAorICAgICAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoQGxpbmUsIHRvX3BhcnNlcl9vZmZzZXQobmFtZV9lbmRfb2Zmc2V0KSksCisgICAgICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAb3B0aW9uc1s6aW1wb3J0ZXJdKQorICAgICAgICAgIHByb3BlcnR5CisgICAgICAgIGVuZAorICAgICAgd2hlbiA/JAorICAgICAgICBwYXJzZV92YXJpYWJsZShsaW5lKQorICAgICAgd2hlbiBDT01NRU5UX0NIQVIKKyAgICAgICAgcGFyc2VfY29tbWVudChsaW5lKQorICAgICAgd2hlbiBESVJFQ1RJVkVfQ0hBUgorICAgICAgICBwYXJzZV9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290KQorICAgICAgd2hlbiBFU0NBUEVfQ0hBUgorICAgICAgICBUcmVlOjpSdWxlTm9kZS5uZXcocGFyc2VfaW50ZXJwKGxpbmUudGV4dFsxLi4tMV0pLCBmdWxsX2xpbmVfcmFuZ2UobGluZSkpCisgICAgICB3aGVuIE1JWElOX0RFRklOSVRJT05fQ0hBUgorICAgICAgICBwYXJzZV9taXhpbl9kZWZpbml0aW9uKGxpbmUpCisgICAgICB3aGVuIE1JWElOX0lOQ0xVREVfQ0hBUgorICAgICAgICBpZiBsaW5lLnRleHRbMV0ubmlsPyB8fCBsaW5lLnRleHRbMV0gPT0gP1xzCisgICAgICAgICAgVHJlZTo6UnVsZU5vZGUubmV3KHBhcnNlX2ludGVycChsaW5lLnRleHQpLCBmdWxsX2xpbmVfcmFuZ2UobGluZSkpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBwYXJzZV9taXhpbl9pbmNsdWRlKGxpbmUsIHJvb3QpCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBwYXJzZV9wcm9wZXJ0eV9vcl9ydWxlKGxpbmUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9wcm9wZXJ0eV9vcl9ydWxlKGxpbmUpCisgICAgICBzY2FubmVyID0gU2Fzczo6VXRpbDo6TXVsdGlieXRlU3RyaW5nU2Nhbm5lci5uZXcobGluZS50ZXh0KQorICAgICAgaGFja19jaGFyID0gc2Nhbm5lci5zY2FuKC9bOlwqXC5dfFwjKD8hXHspLykKKyAgICAgIG9mZnNldCA9IGxpbmUub2Zmc2V0CisgICAgICBvZmZzZXQgKz0gaGFja19jaGFyLmxlbmd0aCBpZiBoYWNrX2NoYXIKKyAgICAgIHBhcnNlciA9IFNhc3M6OlNDU1M6OlBhcnNlci5uZXcoc2Nhbm5lciwKKyAgICAgICAgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXSwKKyAgICAgICAgQGxpbmUsIHRvX3BhcnNlcl9vZmZzZXQob2Zmc2V0KSkKKworICAgICAgdW5sZXNzIChyZXMgPSBwYXJzZXIucGFyc2VfaW50ZXJwX2lkZW50KQorICAgICAgICBwYXJzZWQgPSBwYXJzZV9pbnRlcnAobGluZS50ZXh0LCBsaW5lLm9mZnNldCkKKyAgICAgICAgcmV0dXJuIFRyZWU6OlJ1bGVOb2RlLm5ldyhwYXJzZWQsIGZ1bGxfbGluZV9yYW5nZShsaW5lKSkKKyAgICAgIGVuZAorCisgICAgICBpZGVudF9yYW5nZSA9IFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KAorICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgdG9fcGFyc2VyX29mZnNldChsaW5lLm9mZnNldCkpLAorICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgcGFyc2VyLm9mZnNldCksCisgICAgICAgIEBvcHRpb25zWzpmaWxlbmFtZV0sIEBvcHRpb25zWzppbXBvcnRlcl0pCisgICAgICBvZmZzZXQgPSBwYXJzZXIub2Zmc2V0IC0gMQorICAgICAgcmVzLnVuc2hpZnQoaGFja19jaGFyKSBpZiBoYWNrX2NoYXIKKworICAgICAgIyBIYW5kbGUgY29tbWVudHMgYWZ0ZXIgYSBwcm9wZXJ0eSBuYW1lIGJ1dCBiZWZvcmUgdGhlIGNvbG9uLgorICAgICAgaWYgKGNvbW1lbnQgPSBzY2FubmVyLnNjYW4oU2Fzczo6U0NTUzo6Ulg6OkNPTU1FTlQpKQorICAgICAgICByZXMgPDwgY29tbWVudAorICAgICAgICBvZmZzZXQgKz0gY29tbWVudC5sZW5ndGgKKyAgICAgIGVuZAorCisgICAgICBuYW1lID0gbGluZS50ZXh0WzAuLi5zY2FubmVyLnBvc10KKyAgICAgIGNvdWxkX2JlX3Byb3BlcnR5ID0KKyAgICAgICAgaWYgbmFtZS5zdGFydF93aXRoPygnLS0nKQorICAgICAgICAgIChzY2FubmVkID0gc2Nhbm5lci5zY2FuKC9ccyo6LykpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAoc2Nhbm5lZCA9IHNjYW5uZXIuc2NhbigvXHMqOig/OlxzK3wkKS8pKQorICAgICAgICBlbmQKKworICAgICAgaWYgY291bGRfYmVfcHJvcGVydHkgIyB0ZXN0IGZvciBhIHByb3BlcnR5CisgICAgICAgIG9mZnNldCArPSBzY2FubmVkLmxlbmd0aAorICAgICAgICBwcm9wZXJ0eSA9IHBhcnNlX3Byb3BlcnR5KG5hbWUsIHJlcywgc2Nhbm5lci5yZXN0LCA6bmV3LCBsaW5lLCBvZmZzZXQpCisgICAgICAgIHByb3BlcnR5Lm5hbWVfc291cmNlX3JhbmdlID0gaWRlbnRfcmFuZ2UKKyAgICAgICAgcHJvcGVydHkKKyAgICAgIGVsc2UKKyAgICAgICAgcmVzLnBvcCBpZiBjb21tZW50CisKKyAgICAgICAgaWYgKHRyYWlsaW5nID0gKHNjYW5uZXIuc2NhbigvXHMqI3tTYXNzOjpTQ1NTOjpSWDo6Q09NTUVOVH0vKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5lci5zY2FuKC9ccyoje1Nhc3M6OlNDU1M6OlJYOjpTSU5HTEVfTElORV9DT01NRU5UfS8pKSkKKyAgICAgICAgICB0cmFpbGluZy5zdHJpcCEKKyAgICAgICAgZW5kCisgICAgICAgIGludGVycF9wYXJzZWQgPSBwYXJzZV9pbnRlcnAoc2Nhbm5lci5yZXN0KQorICAgICAgICBzZWxlY3Rvcl9yYW5nZSA9IFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KAorICAgICAgICAgIGlkZW50X3JhbmdlLnN0YXJ0X3BvcywKKyAgICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgdG9fcGFyc2VyX29mZnNldChsaW5lLm9mZnNldCkgKyBsaW5lLnRleHQubGVuZ3RoKSwKKyAgICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAb3B0aW9uc1s6aW1wb3J0ZXJdKQorICAgICAgICBydWxlID0gVHJlZTo6UnVsZU5vZGUubmV3KHJlcyArIGludGVycF9wYXJzZWQsIHNlbGVjdG9yX3JhbmdlKQorICAgICAgICBydWxlIDw8IFRyZWU6OkNvbW1lbnROb2RlLm5ldyhbdHJhaWxpbmddLCA6c2lsZW50KSBpZiB0cmFpbGluZworICAgICAgICBydWxlCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQGNvbW1lbnQKKyAgICAjICAgcnVib2NvcDpkaXNhYmxlIFBhcmFtZXRlckxpc3RzCisgICAgZGVmIHBhcnNlX3Byb3BlcnR5KG5hbWUsIHBhcnNlZF9uYW1lLCB2YWx1ZSwgcHJvcCwgbGluZSwgc3RhcnRfb2Zmc2V0KQorICAgICAgIyBydWJvY29wOmVuYWJsZSBQYXJhbWV0ZXJMaXN0cworCisgICAgICBpZiBuYW1lLnN0YXJ0X3dpdGg/KCctLScpCisgICAgICAgIHVubGVzcyBsaW5lLmNoaWxkcmVuLmVtcHR5PworICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSWxsZWdhbCBuZXN0aW5nOiBOb3RoaW5nIG1heSBiZSBuZXN0ZWQgYmVuZWF0aCBjdXN0b20gcHJvcGVydGllcy4iLAorICAgICAgICAgICAgOmxpbmUgPT4gQGxpbmUgKyAxKQorICAgICAgICBlbmQKKworICAgICAgICBwYXJzZXIgPSBTYXNzOjpTQ1NTOjpQYXJzZXIubmV3KHZhbHVlLAorICAgICAgICAgIEBvcHRpb25zWzpmaWxlbmFtZV0sIEBvcHRpb25zWzppbXBvcnRlcl0sCisgICAgICAgICAgQGxpbmUsIHRvX3BhcnNlcl9vZmZzZXQoQG9mZnNldCkpCisgICAgICAgIHBhcnNlZF92YWx1ZSA9IHBhcnNlci5wYXJzZV9kZWNsYXJhdGlvbl92YWx1ZQorICAgICAgICBlbmRfb2Zmc2V0ID0gc3RhcnRfb2Zmc2V0ICsgdmFsdWUubGVuZ3RoCisgICAgICBlbHNpZiB2YWx1ZS5zdHJpcC5lbXB0eT8KKyAgICAgICAgcGFyc2VkX3ZhbHVlID0gW1Nhc3M6OlNjcmlwdDo6VHJlZTo6TGl0ZXJhbC5uZXcoU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygiIikpXQorICAgICAgICBlbmRfb2Zmc2V0ID0gc3RhcnRfb2Zmc2V0CisgICAgICBlbHNlCisgICAgICAgIGV4cHIgPSBwYXJzZV9zY3JpcHQodmFsdWUsIDpvZmZzZXQgPT4gdG9fcGFyc2VyX29mZnNldChzdGFydF9vZmZzZXQpKQorICAgICAgICBlbmRfb2Zmc2V0ID0gZXhwci5zb3VyY2VfcmFuZ2UuZW5kX3Bvcy5vZmZzZXQgLSAxCisgICAgICAgIHBhcnNlZF92YWx1ZSA9IFtleHByXQorICAgICAgZW5kCisgICAgICBub2RlID0gVHJlZTo6UHJvcE5vZGUubmV3KHBhcnNlX2ludGVycChuYW1lKSwgcGFyc2VkX3ZhbHVlLCBwcm9wKQorICAgICAgbm9kZS52YWx1ZV9zb3VyY2VfcmFuZ2UgPSBTYXNzOjpTb3VyY2U6OlJhbmdlLm5ldygKKyAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcobGluZS5pbmRleCwgdG9fcGFyc2VyX29mZnNldChzdGFydF9vZmZzZXQpKSwKKyAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcobGluZS5pbmRleCwgdG9fcGFyc2VyX29mZnNldChlbmRfb2Zmc2V0KSksCisgICAgICAgIEBvcHRpb25zWzpmaWxlbmFtZV0sIEBvcHRpb25zWzppbXBvcnRlcl0pCisgICAgICBpZiAhbm9kZS5jdXN0b21fcHJvcGVydHk/ICYmIHZhbHVlLnN0cmlwLmVtcHR5PyAmJiBsaW5lLmNoaWxkcmVuLmVtcHR5PworICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoCisgICAgICAgICAgIkludmFsaWQgcHJvcGVydHk6IFwiI3tub2RlLmRlY2xhcmF0aW9ufVwiIChubyB2YWx1ZSkuIiArCisgICAgICAgICAgbm9kZS5wc2V1ZG9fY2xhc3Nfc2VsZWN0b3JfbWVzc2FnZSkKKyAgICAgIGVuZAorCisgICAgICBub2RlCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfdmFyaWFibGUobGluZSkKKyAgICAgIG5hbWUsIHZhbHVlLCBmbGFncyA9IGxpbmUudGV4dC5zY2FuKFNjcmlwdDo6TUFUQ0gpWzBdCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIklsbGVnYWwgbmVzdGluZzogTm90aGluZyBtYXkgYmUgbmVzdGVkIGJlbmVhdGggdmFyaWFibGUgZGVjbGFyYXRpb25zLiIsCisgICAgICAgIDpsaW5lID0+IEBsaW5lICsgMSkgdW5sZXNzIGxpbmUuY2hpbGRyZW4uZW1wdHk/CisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkludmFsaWQgdmFyaWFibGU6IFwiI3tsaW5lLnRleHR9XCIuIiwKKyAgICAgICAgOmxpbmUgPT4gQGxpbmUpIHVubGVzcyBuYW1lICYmIHZhbHVlCisgICAgICBmbGFncyA9IGZsYWdzID8gZmxhZ3Muc3BsaXQoL1xzKy8pIDogW10KKyAgICAgIGlmIChpbnZhbGlkX2ZsYWcgPSBmbGFncy5maW5kIHt8ZnwgZiAhPSAnIWRlZmF1bHQnICYmIGYgIT0gJyFnbG9iYWwnfSkKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJJbnZhbGlkIGZsYWcgXCIje2ludmFsaWRfZmxhZ31cIi4iLCA6bGluZSA9PiBAbGluZSkKKyAgICAgIGVuZAorCisgICAgICAjIFRoaXMgd29ya2Fyb3VuZCBpcyBuZWVkZWQgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIHZhcmlhYmxlIHZhbHVlIGlzIHBhcnQgb2YgdGhlIGlkZW50aWZpZXIsCisgICAgICAjIG90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCB0aGUgb2Zmc2V0IGVxdWFsIHRvIHRoZSB2YWx1ZSBpbmRleCBpbnNpZGUgdGhlIG5hbWU6CisgICAgICAjICRyZWRfY29sb3I6IHJlZDsKKyAgICAgIHZhcl9saHNfbGVuZ3RoID0gMSArIG5hbWUubGVuZ3RoICMgMSBzdGFuZHMgZm9yICckJworICAgICAgaW5kZXggPSBsaW5lLnRleHQuaW5kZXgodmFsdWUsIGxpbmUub2Zmc2V0ICsgdmFyX2xoc19sZW5ndGgpIHx8IDAKKyAgICAgIGV4cHIgPSBwYXJzZV9zY3JpcHQodmFsdWUsIDpvZmZzZXQgPT4gdG9fcGFyc2VyX29mZnNldChsaW5lLm9mZnNldCArIGluZGV4KSkKKworICAgICAgVHJlZTo6VmFyaWFibGVOb2RlLm5ldyhuYW1lLCBleHByLCBmbGFncy5pbmNsdWRlPygnIWRlZmF1bHQnKSwgZmxhZ3MuaW5jbHVkZT8oJyFnbG9iYWwnKSkKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9jb21tZW50KGxpbmUpCisgICAgICBpZiBsaW5lLnRleHRbMV0gPT0gQ1NTX0NPTU1FTlRfQ0hBUiB8fCBsaW5lLnRleHRbMV0gPT0gU0FTU19DT01NRU5UX0NIQVIKKyAgICAgICAgc2lsZW50ID0gbGluZS50ZXh0WzFdID09IFNBU1NfQ09NTUVOVF9DSEFSCisgICAgICAgIGxvdWQgPSAhc2lsZW50ICYmIGxpbmUudGV4dFsyXSA9PSBTQVNTX0xPVURfQ09NTUVOVF9DSEFSCisgICAgICAgIGlmIHNpbGVudAorICAgICAgICAgIHZhbHVlID0gW2xpbmUudGV4dF0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlID0gc2VsZi5jbGFzcy5wYXJzZV9pbnRlcnAoCisgICAgICAgICAgICBsaW5lLnRleHQsIGxpbmUuaW5kZXgsIHRvX3BhcnNlcl9vZmZzZXQobGluZS5vZmZzZXQpLCA6ZmlsZW5hbWUgPT4gQGZpbGVuYW1lKQorICAgICAgICBlbmQKKyAgICAgICAgdmFsdWUgPSBTYXNzOjpVdGlsLndpdGhfZXh0cmFjdGVkX3ZhbHVlcyh2YWx1ZSkgZG8gfHN0cnwKKyAgICAgICAgICBzdHIgPSBzdHIuZ3N1YigvXiN7bGluZS5jb21tZW50X3RhYl9zdHJ9L20sICcnKVsyLi4tMV0gIyBnZXQgcmlkIG9mIC8vIG9yIC8qCisgICAgICAgICAgZm9ybWF0X2NvbW1lbnRfdGV4dChzdHIsIHNpbGVudCkKKyAgICAgICAgZW5kCisgICAgICAgIHR5cGUgPSBpZiBzaWxlbnQKKyAgICAgICAgICAgICAgICAgOnNpbGVudAorICAgICAgICAgICAgICAgZWxzaWYgbG91ZAorICAgICAgICAgICAgICAgICA6bG91ZAorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICA6bm9ybWFsCisgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgY29tbWVudCA9IFRyZWU6OkNvbW1lbnROb2RlLm5ldyh2YWx1ZSwgdHlwZSkKKyAgICAgICAgY29tbWVudC5saW5lID0gbGluZS5pbmRleAorICAgICAgICB0ZXh0ID0gbGluZS50ZXh0LnJzdHJpcAorICAgICAgICBpZiB0ZXh0LmluY2x1ZGU/KCJcbiIpCisgICAgICAgICAgZW5kX29mZnNldCA9IHRleHQubGVuZ3RoIC0gdGV4dC5yaW5kZXgoIlxuIikKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVuZF9vZmZzZXQgPSB0b19wYXJzZXJfb2Zmc2V0KGxpbmUub2Zmc2V0ICsgdGV4dC5sZW5ndGgpCisgICAgICAgIGVuZAorICAgICAgICBjb21tZW50LnNvdXJjZV9yYW5nZSA9IFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KAorICAgICAgICAgIFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCB0b19wYXJzZXJfb2Zmc2V0KGxpbmUub2Zmc2V0KSksCisgICAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoQGxpbmUgKyB0ZXh0LmNvdW50KCJcbiIpLCBlbmRfb2Zmc2V0KSwKKyAgICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdKQorICAgICAgICBjb21tZW50CisgICAgICBlbHNlCisgICAgICAgIFRyZWU6OlJ1bGVOb2RlLm5ldyhwYXJzZV9pbnRlcnAobGluZS50ZXh0KSwgZnVsbF9saW5lX3JhbmdlKGxpbmUpKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBESVJFQ1RJVkVTID0gU2V0WzptaXhpbiwgOmluY2x1ZGUsIDpmdW5jdGlvbiwgOnJldHVybiwgOmRlYnVnLCA6d2FybiwgOmZvciwKKyAgICAgIDplYWNoLCA6d2hpbGUsIDppZiwgOmVsc2UsIDpleHRlbmQsIDppbXBvcnQsIDptZWRpYSwgOmNoYXJzZXQsIDpjb250ZW50LAorICAgICAgOmF0X3Jvb3QsIDplcnJvcl0KKworICAgIGRlZiBwYXJzZV9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290KQorICAgICAgZGlyZWN0aXZlLCB3aGl0ZXNwYWNlLCB2YWx1ZSA9IGxpbmUudGV4dFsxLi4tMV0uc3BsaXQoLyhccyspLywgMikKKyAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCBkaXJlY3RpdmU6ICdAJy4iKSB1bmxlc3MgZGlyZWN0aXZlCisgICAgICBvZmZzZXQgPSBkaXJlY3RpdmUuc2l6ZSArIHdoaXRlc3BhY2Uuc2l6ZSArIDEgaWYgd2hpdGVzcGFjZQorCisgICAgICBkaXJlY3RpdmVfbmFtZSA9IGRpcmVjdGl2ZS50cignLScsICdfJykudG9fc3ltCisgICAgICBpZiBESVJFQ1RJVkVTLmluY2x1ZGU/KGRpcmVjdGl2ZV9uYW1lKQorICAgICAgICByZXR1cm4gc2VuZCgicGFyc2VfI3tkaXJlY3RpdmVfbmFtZX1fZGlyZWN0aXZlIiwgcGFyZW50LCBsaW5lLCByb290LCB2YWx1ZSwgb2Zmc2V0KQorICAgICAgZW5kCisKKyAgICAgIHVucHJlZml4ZWRfZGlyZWN0aXZlID0gZGlyZWN0aXZlLmdzdWIoL14tW2EtejAtOV0rLS9pLCAnJykKKyAgICAgIGlmIHVucHJlZml4ZWRfZGlyZWN0aXZlID09ICdzdXBwb3J0cycKKyAgICAgICAgcGFyc2VyID0gU2Fzczo6U0NTUzo6UGFyc2VyLm5ldyh2YWx1ZSwgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQGxpbmUpCisgICAgICAgIHJldHVybiBUcmVlOjpTdXBwb3J0c05vZGUubmV3KGRpcmVjdGl2ZSwgcGFyc2VyLnBhcnNlX3N1cHBvcnRzX2NvbmRpdGlvbikKKyAgICAgIGVuZAorCisgICAgICBUcmVlOjpEaXJlY3RpdmVOb2RlLm5ldygKKyAgICAgICAgdmFsdWUubmlsPyA/IFsiQCN7ZGlyZWN0aXZlfSJdIDogWyJAI3tkaXJlY3RpdmV9ICJdICsgcGFyc2VfaW50ZXJwKHZhbHVlLCBvZmZzZXQpKQorICAgIGVuZAorCisgICAgZGVmIHBhcnNlX3doaWxlX2RpcmVjdGl2ZShwYXJlbnQsIGxpbmUsIHJvb3QsIHZhbHVlLCBvZmZzZXQpCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkludmFsaWQgd2hpbGUgZGlyZWN0aXZlICdAd2hpbGUnOiBleHBlY3RlZCBleHByZXNzaW9uLiIpIHVubGVzcyB2YWx1ZQorICAgICAgVHJlZTo6V2hpbGVOb2RlLm5ldyhwYXJzZV9zY3JpcHQodmFsdWUsIDpvZmZzZXQgPT4gb2Zmc2V0KSkKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9pZl9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290LCB2YWx1ZSwgb2Zmc2V0KQorICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJJbnZhbGlkIGlmIGRpcmVjdGl2ZSAnQGlmJzogZXhwZWN0ZWQgZXhwcmVzc2lvbi4iKSB1bmxlc3MgdmFsdWUKKyAgICAgIFRyZWU6OklmTm9kZS5uZXcocGFyc2Vfc2NyaXB0KHZhbHVlLCA6b2Zmc2V0ID0+IG9mZnNldCkpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfZGVidWdfZGlyZWN0aXZlKHBhcmVudCwgbGluZSwgcm9vdCwgdmFsdWUsIG9mZnNldCkKKyAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCBkZWJ1ZyBkaXJlY3RpdmUgJ0BkZWJ1Zyc6IGV4cGVjdGVkIGV4cHJlc3Npb24uIikgdW5sZXNzIHZhbHVlCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIklsbGVnYWwgbmVzdGluZzogTm90aGluZyBtYXkgYmUgbmVzdGVkIGJlbmVhdGggZGVidWcgZGlyZWN0aXZlcy4iLAorICAgICAgICA6bGluZSA9PiBAbGluZSArIDEpIHVubGVzcyBsaW5lLmNoaWxkcmVuLmVtcHR5PworICAgICAgb2Zmc2V0ID0gbGluZS5vZmZzZXQgKyBsaW5lLnRleHQuaW5kZXgodmFsdWUpLnRvX2kKKyAgICAgIFRyZWU6OkRlYnVnTm9kZS5uZXcocGFyc2Vfc2NyaXB0KHZhbHVlLCA6b2Zmc2V0ID0+IG9mZnNldCkpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfZXJyb3JfZGlyZWN0aXZlKHBhcmVudCwgbGluZSwgcm9vdCwgdmFsdWUsIG9mZnNldCkKKyAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCBlcnJvciBkaXJlY3RpdmUgJ0BlcnJvcic6IGV4cGVjdGVkIGV4cHJlc3Npb24uIikgdW5sZXNzIHZhbHVlCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIklsbGVnYWwgbmVzdGluZzogTm90aGluZyBtYXkgYmUgbmVzdGVkIGJlbmVhdGggZXJyb3IgZGlyZWN0aXZlcy4iLAorICAgICAgICA6bGluZSA9PiBAbGluZSArIDEpIHVubGVzcyBsaW5lLmNoaWxkcmVuLmVtcHR5PworICAgICAgb2Zmc2V0ID0gbGluZS5vZmZzZXQgKyBsaW5lLnRleHQuaW5kZXgodmFsdWUpLnRvX2kKKyAgICAgIFRyZWU6OkVycm9yTm9kZS5uZXcocGFyc2Vfc2NyaXB0KHZhbHVlLCA6b2Zmc2V0ID0+IG9mZnNldCkpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfZXh0ZW5kX2RpcmVjdGl2ZShwYXJlbnQsIGxpbmUsIHJvb3QsIHZhbHVlLCBvZmZzZXQpCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkludmFsaWQgZXh0ZW5kIGRpcmVjdGl2ZSAnQGV4dGVuZCc6IGV4cGVjdGVkIGV4cHJlc3Npb24uIikgdW5sZXNzIHZhbHVlCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIklsbGVnYWwgbmVzdGluZzogTm90aGluZyBtYXkgYmUgbmVzdGVkIGJlbmVhdGggZXh0ZW5kIGRpcmVjdGl2ZXMuIiwKKyAgICAgICAgOmxpbmUgPT4gQGxpbmUgKyAxKSB1bmxlc3MgbGluZS5jaGlsZHJlbi5lbXB0eT8KKyAgICAgIG9wdGlvbmFsID0gISF2YWx1ZS5nc3ViISgvXHMrI3tTYXNzOjpTQ1NTOjpSWDo6T1BUSU9OQUx9JC8sICcnKQorICAgICAgb2Zmc2V0ID0gbGluZS5vZmZzZXQgKyBsaW5lLnRleHQuaW5kZXgodmFsdWUpLnRvX2kKKyAgICAgIGludGVycF9wYXJzZWQgPSBwYXJzZV9pbnRlcnAodmFsdWUsIG9mZnNldCkKKyAgICAgIHNlbGVjdG9yX3JhbmdlID0gU2Fzczo6U291cmNlOjpSYW5nZS5uZXcoCisgICAgICAgIFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCB0b19wYXJzZXJfb2Zmc2V0KG9mZnNldCkpLAorICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgdG9fcGFyc2VyX29mZnNldChsaW5lLm9mZnNldCkgKyBsaW5lLnRleHQubGVuZ3RoKSwKKyAgICAgICAgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXQorICAgICAgKQorICAgICAgVHJlZTo6RXh0ZW5kTm9kZS5uZXcoaW50ZXJwX3BhcnNlZCwgb3B0aW9uYWwsIHNlbGVjdG9yX3JhbmdlKQorICAgIGVuZAorCisgICAgZGVmIHBhcnNlX3dhcm5fZGlyZWN0aXZlKHBhcmVudCwgbGluZSwgcm9vdCwgdmFsdWUsIG9mZnNldCkKKyAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCB3YXJuIGRpcmVjdGl2ZSAnQHdhcm4nOiBleHBlY3RlZCBleHByZXNzaW9uLiIpIHVubGVzcyB2YWx1ZQorICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJJbGxlZ2FsIG5lc3Rpbmc6IE5vdGhpbmcgbWF5IGJlIG5lc3RlZCBiZW5lYXRoIHdhcm4gZGlyZWN0aXZlcy4iLAorICAgICAgICA6bGluZSA9PiBAbGluZSArIDEpIHVubGVzcyBsaW5lLmNoaWxkcmVuLmVtcHR5PworICAgICAgb2Zmc2V0ID0gbGluZS5vZmZzZXQgKyBsaW5lLnRleHQuaW5kZXgodmFsdWUpLnRvX2kKKyAgICAgIFRyZWU6Oldhcm5Ob2RlLm5ldyhwYXJzZV9zY3JpcHQodmFsdWUsIDpvZmZzZXQgPT4gb2Zmc2V0KSkKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9yZXR1cm5fZGlyZWN0aXZlKHBhcmVudCwgbGluZSwgcm9vdCwgdmFsdWUsIG9mZnNldCkKKyAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCBAcmV0dXJuOiBleHBlY3RlZCBleHByZXNzaW9uLiIpIHVubGVzcyB2YWx1ZQorICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJJbGxlZ2FsIG5lc3Rpbmc6IE5vdGhpbmcgbWF5IGJlIG5lc3RlZCBiZW5lYXRoIHJldHVybiBkaXJlY3RpdmVzLiIsCisgICAgICAgIDpsaW5lID0+IEBsaW5lICsgMSkgdW5sZXNzIGxpbmUuY2hpbGRyZW4uZW1wdHk/CisgICAgICBvZmZzZXQgPSBsaW5lLm9mZnNldCArIGxpbmUudGV4dC5pbmRleCh2YWx1ZSkudG9faQorICAgICAgVHJlZTo6UmV0dXJuTm9kZS5uZXcocGFyc2Vfc2NyaXB0KHZhbHVlLCA6b2Zmc2V0ID0+IG9mZnNldCkpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfY2hhcnNldF9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290LCB2YWx1ZSwgb2Zmc2V0KQorICAgICAgbmFtZSA9IHZhbHVlICYmIHZhbHVlWy9cQShbIiddKSguKilcMVxaLywgMl0gIyAiCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkludmFsaWQgY2hhcnNldCBkaXJlY3RpdmUgJ0BjaGFyc2V0JzogZXhwZWN0ZWQgc3RyaW5nLiIpIHVubGVzcyBuYW1lCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIklsbGVnYWwgbmVzdGluZzogTm90aGluZyBtYXkgYmUgbmVzdGVkIGJlbmVhdGggY2hhcnNldCBkaXJlY3RpdmVzLiIsCisgICAgICAgIDpsaW5lID0+IEBsaW5lICsgMSkgdW5sZXNzIGxpbmUuY2hpbGRyZW4uZW1wdHk/CisgICAgICBUcmVlOjpDaGFyc2V0Tm9kZS5uZXcobmFtZSkKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9tZWRpYV9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290LCB2YWx1ZSwgb2Zmc2V0KQorICAgICAgcGFyc2VyID0gU2Fzczo6U0NTUzo6UGFyc2VyLm5ldyh2YWx1ZSwKKyAgICAgICAgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXSwKKyAgICAgICAgQGxpbmUsIHRvX3BhcnNlcl9vZmZzZXQoQG9mZnNldCkpCisgICAgICBvZmZzZXQgPSBsaW5lLm9mZnNldCArIGxpbmUudGV4dC5pbmRleCgnbWVkaWEnKS50b19pIC0gMQorICAgICAgcGFyc2VkX21lZGlhX3F1ZXJ5X2xpc3QgPSBwYXJzZXIucGFyc2VfbWVkaWFfcXVlcnlfbGlzdC50b19hCisgICAgICBub2RlID0gVHJlZTo6TWVkaWFOb2RlLm5ldyhwYXJzZWRfbWVkaWFfcXVlcnlfbGlzdCkKKyAgICAgIG5vZGUuc291cmNlX3JhbmdlID0gU2Fzczo6U291cmNlOjpSYW5nZS5uZXcoCisgICAgICAgIFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCB0b19wYXJzZXJfb2Zmc2V0KG9mZnNldCkpLAorICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgdG9fcGFyc2VyX29mZnNldChsaW5lLm9mZnNldCkgKyBsaW5lLnRleHQubGVuZ3RoKSwKKyAgICAgICAgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXSkKKyAgICAgIG5vZGUKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9hdF9yb290X2RpcmVjdGl2ZShwYXJlbnQsIGxpbmUsIHJvb3QsIHZhbHVlLCBvZmZzZXQpCisgICAgICByZXR1cm4gU2Fzczo6VHJlZTo6QXRSb290Tm9kZS5uZXcgdW5sZXNzIHZhbHVlCisKKyAgICAgIGlmIHZhbHVlLnN0YXJ0X3dpdGg/KCcoJykKKyAgICAgICAgcGFyc2VyID0gU2Fzczo6U0NTUzo6UGFyc2VyLm5ldyh2YWx1ZSwKKyAgICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAb3B0aW9uc1s6aW1wb3J0ZXJdLAorICAgICAgICAgIEBsaW5lLCB0b19wYXJzZXJfb2Zmc2V0KEBvZmZzZXQpKQorICAgICAgICBvZmZzZXQgPSBsaW5lLm9mZnNldCArIGxpbmUudGV4dC5pbmRleCgnYXQtcm9vdCcpLnRvX2kgLSAxCisgICAgICAgIHJldHVybiBUcmVlOjpBdFJvb3ROb2RlLm5ldyhwYXJzZXIucGFyc2VfYXRfcm9vdF9xdWVyeSkKKyAgICAgIGVuZAorCisgICAgICBhdF9yb290X25vZGUgPSBUcmVlOjpBdFJvb3ROb2RlLm5ldworICAgICAgcGFyc2VkID0gcGFyc2VfaW50ZXJwKHZhbHVlLCBvZmZzZXQpCisgICAgICBydWxlX25vZGUgPSBUcmVlOjpSdWxlTm9kZS5uZXcocGFyc2VkLCBmdWxsX2xpbmVfcmFuZ2UobGluZSkpCisKKyAgICAgICMgVGhlIGNhbGxlciBleHBlY3RzIHRvIGF1dG9tYXRpY2FsbHkgYWRkIGNoaWxkcmVuIHRvIHRoZSByZXR1cm5lZCBub2RlCisgICAgICAjIGFuZCB3ZSB3YW50IGl0IHRvIGFkZCBjaGlsZHJlbiB0byB0aGUgcnVsZSBub2RlIGluc3RlYWQsIHNvIHdlCisgICAgICAjIG1hbnVhbGx5IGhhbmRsZSB0aGUgd2lyaW5nIGhlcmUgYW5kIHJldHVybiBuaWwgc28gdGhlIGNhbGxlciBkb2Vzbid0CisgICAgICAjIGR1cGxpY2F0ZSBvdXIgZWZmb3J0cy4KKyAgICAgIGFwcGVuZF9jaGlsZHJlbihydWxlX25vZGUsIGxpbmUuY2hpbGRyZW4sIGZhbHNlKQorICAgICAgYXRfcm9vdF9ub2RlIDw8IHJ1bGVfbm9kZQorICAgICAgcGFyZW50IDw8IGF0X3Jvb3Rfbm9kZQorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfZm9yX2RpcmVjdGl2ZShwYXJlbnQsIGxpbmUsIHJvb3QsIHZhbHVlLCBvZmZzZXQpCisgICAgICB2YXIsIGZyb21fZXhwciwgdG9fbmFtZSwgdG9fZXhwciA9CisgICAgICAgIHZhbHVlLnNjYW4oL14oW15cc10rKVxzK2Zyb21ccysoLispXHMrKHRvfHRocm91Z2gpXHMrKC4rKSQvKS5maXJzdAorCisgICAgICBpZiB2YXIubmlsPyAjIHNjYW4gZmFpbGVkLCB0cnkgdG8gZmlndXJlIG91dCB3aHkgZm9yIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgaWYgdmFsdWUgIX4gL15bXlxzXSsvCisgICAgICAgICAgZXhwZWN0ZWQgPSAidmFyaWFibGUgbmFtZSIKKyAgICAgICAgZWxzaWYgdmFsdWUgIX4gL15bXlxzXStccytmcm9tXHMrLisvCisgICAgICAgICAgZXhwZWN0ZWQgPSAiJ2Zyb20gPGV4cHI+JyIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGV4cGVjdGVkID0gIid0byA8ZXhwcj4nIG9yICd0aHJvdWdoIDxleHByPiciCisgICAgICAgIGVuZAorICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkludmFsaWQgZm9yIGRpcmVjdGl2ZSAnQGZvciAje3ZhbHVlfSc6IGV4cGVjdGVkICN7ZXhwZWN0ZWR9LiIpCisgICAgICBlbmQKKyAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCB2YXJpYWJsZSBcIiN7dmFyfVwiLiIpIHVubGVzcyB2YXIgPX4gU2NyaXB0OjpWQUxJREFURQorCisgICAgICB2YXIgPSB2YXJbMS4uLTFdCisgICAgICBwYXJzZWRfZnJvbSA9IHBhcnNlX3NjcmlwdChmcm9tX2V4cHIsIDpvZmZzZXQgPT4gbGluZS5vZmZzZXQgKyBsaW5lLnRleHQuaW5kZXgoZnJvbV9leHByKSkKKyAgICAgIHBhcnNlZF90byA9IHBhcnNlX3NjcmlwdCh0b19leHByLCA6b2Zmc2V0ID0+IGxpbmUub2Zmc2V0ICsgbGluZS50ZXh0LmluZGV4KHRvX2V4cHIpKQorICAgICAgVHJlZTo6Rm9yTm9kZS5uZXcodmFyLCBwYXJzZWRfZnJvbSwgcGFyc2VkX3RvLCB0b19uYW1lID09ICd0bycpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfZWFjaF9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290LCB2YWx1ZSwgb2Zmc2V0KQorICAgICAgdmFycywgbGlzdF9leHByID0gdmFsdWUuc2NhbigvXihbXlxzXSsoPzpccyosXHMqW15cc10rKSopXHMraW5ccysoLispJC8pLmZpcnN0CisKKyAgICAgIGlmIHZhcnMubmlsPyAjIHNjYW4gZmFpbGVkLCB0cnkgdG8gZmlndXJlIG91dCB3aHkgZm9yIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgaWYgdmFsdWUgIX4gL15bXlxzXSsvCisgICAgICAgICAgZXhwZWN0ZWQgPSAidmFyaWFibGUgbmFtZSIKKyAgICAgICAgZWxzaWYgdmFsdWUgIX4gL15bXlxzXSsoPzpccyosXHMqW15cc10rKSpbXlxzXStccytmcm9tXHMrLisvCisgICAgICAgICAgZXhwZWN0ZWQgPSAiJ2luIDxleHByPiciCisgICAgICAgIGVuZAorICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkludmFsaWQgZWFjaCBkaXJlY3RpdmUgJ0BlYWNoICN7dmFsdWV9JzogZXhwZWN0ZWQgI3tleHBlY3RlZH0uIikKKyAgICAgIGVuZAorCisgICAgICB2YXJzID0gdmFycy5zcGxpdCgnLCcpLm1hcCBkbyB8dmFyfAorICAgICAgICB2YXIuc3RyaXAhCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCB2YXJpYWJsZSBcIiN7dmFyfVwiLiIpIHVubGVzcyB2YXIgPX4gU2NyaXB0OjpWQUxJREFURQorICAgICAgICB2YXJbMS4uLTFdCisgICAgICBlbmQKKworICAgICAgcGFyc2VkX2xpc3QgPSBwYXJzZV9zY3JpcHQobGlzdF9leHByLCA6b2Zmc2V0ID0+IGxpbmUub2Zmc2V0ICsgbGluZS50ZXh0LmluZGV4KGxpc3RfZXhwcikpCisgICAgICBUcmVlOjpFYWNoTm9kZS5uZXcodmFycywgcGFyc2VkX2xpc3QpCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfZWxzZV9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290LCB2YWx1ZSwgb2Zmc2V0KQorICAgICAgcHJldmlvdXMgPSBwYXJlbnQuY2hpbGRyZW4ubGFzdAorICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJAZWxzZSBtdXN0IGNvbWUgYWZ0ZXIgQGlmLiIpIHVubGVzcyBwcmV2aW91cy5pc19hPyhUcmVlOjpJZk5vZGUpCisKKyAgICAgIGlmIHZhbHVlCisgICAgICAgIGlmIHZhbHVlICF+IC9eaWZccysoLispLworICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCBlbHNlIGRpcmVjdGl2ZSAnQGVsc2UgI3t2YWx1ZX0nOiBleHBlY3RlZCAnaWYgPGV4cHI+Jy4iKQorICAgICAgICBlbmQKKyAgICAgICAgZXhwciA9IHBhcnNlX3NjcmlwdCgkMSwgOm9mZnNldCA9PiBsaW5lLm9mZnNldCArIGxpbmUudGV4dC5pbmRleCgkMSkpCisgICAgICBlbmQKKworICAgICAgbm9kZSA9IFRyZWU6OklmTm9kZS5uZXcoZXhwcikKKyAgICAgIGFwcGVuZF9jaGlsZHJlbihub2RlLCBsaW5lLmNoaWxkcmVuLCBmYWxzZSkKKyAgICAgIHByZXZpb3VzLmFkZF9lbHNlIG5vZGUKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHBhcnNlX2ltcG9ydF9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290LCB2YWx1ZSwgb2Zmc2V0KQorICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJJbGxlZ2FsIG5lc3Rpbmc6IE5vdGhpbmcgbWF5IGJlIG5lc3RlZCBiZW5lYXRoIGltcG9ydCBkaXJlY3RpdmVzLiIsCisgICAgICAgIDpsaW5lID0+IEBsaW5lICsgMSkgdW5sZXNzIGxpbmUuY2hpbGRyZW4uZW1wdHk/CisKKyAgICAgIHNjYW5uZXIgPSBTYXNzOjpVdGlsOjpNdWx0aWJ5dGVTdHJpbmdTY2FubmVyLm5ldyh2YWx1ZSkKKyAgICAgIHZhbHVlcyA9IFtdCisKKyAgICAgIGxvb3AgZG8KKyAgICAgICAgdW5sZXNzIChub2RlID0gcGFyc2VfaW1wb3J0X2FyZyhzY2FubmVyLCBvZmZzZXQgKyBzY2FubmVyLnBvcykpCisgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KAorICAgICAgICAgICAgIkludmFsaWQgQGltcG9ydDogZXhwZWN0ZWQgZmlsZSB0byBpbXBvcnQsIHdhcyAje3NjYW5uZXIucmVzdC5pbnNwZWN0fSIsCisgICAgICAgICAgICA6bGluZSA9PiBAbGluZSkKKyAgICAgICAgZW5kCisgICAgICAgIHZhbHVlcyA8PCBub2RlCisgICAgICAgIGJyZWFrIHVubGVzcyBzY2FubmVyLnNjYW4oLyxccyovKQorICAgICAgZW5kCisKKyAgICAgIGlmIHNjYW5uZXIuc2NhbigvOy8pCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCBAaW1wb3J0OiBleHBlY3RlZCBlbmQgb2YgbGluZSwgd2FzIFwiO1wiLiIsCisgICAgICAgICAgOmxpbmUgPT4gQGxpbmUpCisgICAgICBlbmQKKworICAgICAgdmFsdWVzCisgICAgZW5kCisKKyAgICAjIEBjb21tZW50CisgICAgIyAgIHJ1Ym9jb3A6ZGlzYWJsZSBNZXRob2RMZW5ndGgKKyAgICBkZWYgcGFyc2VfaW1wb3J0X2FyZyhzY2FubmVyLCBvZmZzZXQpCisgICAgICByZXR1cm4gaWYgc2Nhbm5lci5lb3M/CisKKyAgICAgIGlmIHNjYW5uZXIubWF0Y2g/KC91cmxcKC9pKQorICAgICAgICBzY3JpcHRfcGFyc2VyID0gU2Fzczo6U2NyaXB0OjpQYXJzZXIubmV3KHNjYW5uZXIsIEBsaW5lLCB0b19wYXJzZXJfb2Zmc2V0KG9mZnNldCksIEBvcHRpb25zKQorICAgICAgICBzdHIgPSBzY3JpcHRfcGFyc2VyLnBhcnNlX3N0cmluZworCisgICAgICAgIGlmIHNjYW5uZXIuZW9zPworICAgICAgICAgIGVuZF9wb3MgPSBzdHIuc291cmNlX3JhbmdlLmVuZF9wb3MKKyAgICAgICAgICBub2RlID0gVHJlZTo6Q3NzSW1wb3J0Tm9kZS5uZXcoc3RyKQorICAgICAgICBlbHNlCisgICAgICAgICAgc3VwcG9ydHNfcGFyc2VyID0gU2Fzczo6U0NTUzo6UGFyc2VyLm5ldyhzY2FubmVyLAorICAgICAgICAgICAgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXSwKKyAgICAgICAgICAgIEBsaW5lLCBzdHIuc291cmNlX3JhbmdlLmVuZF9wb3Mub2Zmc2V0KQorICAgICAgICAgIHN1cHBvcnRzX2NvbmRpdGlvbiA9IHN1cHBvcnRzX3BhcnNlci5wYXJzZV9zdXBwb3J0c19jbGF1c2UKKworICAgICAgICAgIGlmIHNjYW5uZXIuZW9zPworICAgICAgICAgICAgbm9kZSA9IFRyZWU6OkNzc0ltcG9ydE5vZGUubmV3KHN0ciwgW10sIHN1cHBvcnRzX2NvbmRpdGlvbikKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtZWRpYV9wYXJzZXIgPSBTYXNzOjpTQ1NTOjpQYXJzZXIubmV3KHNjYW5uZXIsCisgICAgICAgICAgICAgIEBvcHRpb25zWzpmaWxlbmFtZV0sIEBvcHRpb25zWzppbXBvcnRlcl0sCisgICAgICAgICAgICAgIEBsaW5lLCBzdHIuc291cmNlX3JhbmdlLmVuZF9wb3Mub2Zmc2V0KQorICAgICAgICAgICAgbWVkaWEgPSBtZWRpYV9wYXJzZXIucGFyc2VfbWVkaWFfcXVlcnlfbGlzdAorICAgICAgICAgICAgZW5kX3BvcyA9IFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCBtZWRpYV9wYXJzZXIub2Zmc2V0ICsgMSkKKyAgICAgICAgICAgIG5vZGUgPSBUcmVlOjpDc3NJbXBvcnROb2RlLm5ldyhzdHIsIG1lZGlhLnRvX2EsIHN1cHBvcnRzX2NvbmRpdGlvbikKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgbm9kZS5zb3VyY2VfcmFuZ2UgPSBTYXNzOjpTb3VyY2U6OlJhbmdlLm5ldygKKyAgICAgICAgICBzdHIuc291cmNlX3JhbmdlLnN0YXJ0X3BvcywgZW5kX3BvcywKKyAgICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAb3B0aW9uc1s6aW1wb3J0ZXJdKQorICAgICAgICByZXR1cm4gbm9kZQorICAgICAgZW5kCisKKyAgICAgIHVubGVzcyAocXVvdGVkX3ZhbCA9IHNjYW5uZXIuc2NhbihTYXNzOjpTQ1NTOjpSWDo6U1RSSU5HKSkKKyAgICAgICAgc2Nhbm5lZCA9IHNjYW5uZXIuc2NhbigvW14sO10rLykKKyAgICAgICAgbm9kZSA9IFRyZWU6OkltcG9ydE5vZGUubmV3KHNjYW5uZWQpCisgICAgICAgIHN0YXJ0X3BhcnNlcl9vZmZzZXQgPSB0b19wYXJzZXJfb2Zmc2V0KG9mZnNldCkKKyAgICAgICAgbm9kZS5zb3VyY2VfcmFuZ2UgPSBTYXNzOjpTb3VyY2U6OlJhbmdlLm5ldygKKyAgICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgc3RhcnRfcGFyc2VyX29mZnNldCksCisgICAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoQGxpbmUsIHN0YXJ0X3BhcnNlcl9vZmZzZXQgKyBzY2FubmVkLmxlbmd0aCksCisgICAgICAgICAgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXSkKKyAgICAgICAgcmV0dXJuIG5vZGUKKyAgICAgIGVuZAorCisgICAgICBzdGFydF9vZmZzZXQgPSBvZmZzZXQKKyAgICAgIG9mZnNldCArPSBzY2FubmVyLm1hdGNoZWQubGVuZ3RoCisgICAgICB2YWwgPSBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcudmFsdWUoc2Nhbm5lclsxXSB8fCBzY2FubmVyWzJdKQorICAgICAgc2Nhbm5lZCA9IHNjYW5uZXIuc2NhbigvXHMqLykKKyAgICAgIGlmICFzY2FubmVyLm1hdGNoPygvWyw7XXwkLykKKyAgICAgICAgb2Zmc2V0ICs9IHNjYW5uZWQubGVuZ3RoIGlmIHNjYW5uZWQKKyAgICAgICAgbWVkaWFfcGFyc2VyID0gU2Fzczo6U0NTUzo6UGFyc2VyLm5ldyhzY2FubmVyLAorICAgICAgICAgIEBvcHRpb25zWzpmaWxlbmFtZV0sIEBvcHRpb25zWzppbXBvcnRlcl0sIEBsaW5lLCBvZmZzZXQpCisgICAgICAgIG1lZGlhID0gbWVkaWFfcGFyc2VyLnBhcnNlX21lZGlhX3F1ZXJ5X2xpc3QKKyAgICAgICAgbm9kZSA9IFRyZWU6OkNzc0ltcG9ydE5vZGUubmV3KHF1b3RlZF92YWwsIG1lZGlhLnRvX2EpCisgICAgICAgIG5vZGUuc291cmNlX3JhbmdlID0gU2Fzczo6U291cmNlOjpSYW5nZS5uZXcoCisgICAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoQGxpbmUsIHRvX3BhcnNlcl9vZmZzZXQoc3RhcnRfb2Zmc2V0KSksCisgICAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoQGxpbmUsIG1lZGlhX3BhcnNlci5vZmZzZXQpLAorICAgICAgICAgIEBvcHRpb25zWzpmaWxlbmFtZV0sIEBvcHRpb25zWzppbXBvcnRlcl0pCisgICAgICBlbHNpZiB2YWwgPX4gJXJ7XihodHRwcz86KT8vL30KKyAgICAgICAgbm9kZSA9IFRyZWU6OkNzc0ltcG9ydE5vZGUubmV3KHF1b3RlZF92YWwpCisgICAgICAgIG5vZGUuc291cmNlX3JhbmdlID0gU2Fzczo6U291cmNlOjpSYW5nZS5uZXcoCisgICAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoQGxpbmUsIHRvX3BhcnNlcl9vZmZzZXQoc3RhcnRfb2Zmc2V0KSksCisgICAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoQGxpbmUsIHRvX3BhcnNlcl9vZmZzZXQob2Zmc2V0KSksCisgICAgICAgICAgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXSkKKyAgICAgIGVsc2UKKyAgICAgICAgbm9kZSA9IFRyZWU6OkltcG9ydE5vZGUubmV3KHZhbCkKKyAgICAgICAgbm9kZS5zb3VyY2VfcmFuZ2UgPSBTYXNzOjpTb3VyY2U6OlJhbmdlLm5ldygKKyAgICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgdG9fcGFyc2VyX29mZnNldChzdGFydF9vZmZzZXQpKSwKKyAgICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgdG9fcGFyc2VyX29mZnNldChvZmZzZXQpKSwKKyAgICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAb3B0aW9uc1s6aW1wb3J0ZXJdKQorICAgICAgZW5kCisgICAgICBub2RlCisgICAgZW5kCisgICAgIyBAY29tbWVudAorICAgICMgICBydWJvY29wOmVuYWJsZSBNZXRob2RMZW5ndGgKKworICAgIGRlZiBwYXJzZV9taXhpbl9kaXJlY3RpdmUocGFyZW50LCBsaW5lLCByb290LCB2YWx1ZSwgb2Zmc2V0KQorICAgICAgcGFyc2VfbWl4aW5fZGVmaW5pdGlvbihsaW5lKQorICAgIGVuZAorCisgICAgTUlYSU5fREVGX1JFID0gL14oPzo9fEBtaXhpbilccyooI3tTYXNzOjpTQ1NTOjpSWDo6SURFTlR9KSguKikkLworICAgIGRlZiBwYXJzZV9taXhpbl9kZWZpbml0aW9uKGxpbmUpCisgICAgICBuYW1lLCBhcmdfc3RyaW5nID0gbGluZS50ZXh0LnNjYW4oTUlYSU5fREVGX1JFKS5maXJzdAorICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJJbnZhbGlkIG1peGluIFwiI3tsaW5lLnRleHRbMS4uLTFdfVwiLiIpIGlmIG5hbWUubmlsPworCisgICAgICBvZmZzZXQgPSBsaW5lLm9mZnNldCArIGxpbmUudGV4dC5zaXplIC0gYXJnX3N0cmluZy5zaXplCisgICAgICBhcmdzLCBzcGxhdCA9IFNjcmlwdDo6UGFyc2VyLm5ldyhhcmdfc3RyaW5nLnN0cmlwLCBAbGluZSwgdG9fcGFyc2VyX29mZnNldChvZmZzZXQpLCBAb3B0aW9ucykuCisgICAgICAgIHBhcnNlX21peGluX2RlZmluaXRpb25fYXJnbGlzdAorICAgICAgVHJlZTo6TWl4aW5EZWZOb2RlLm5ldyhuYW1lLCBhcmdzLCBzcGxhdCkKKyAgICBlbmQKKworICAgIENPTlRFTlRfUkUgPSAvXkBjb250ZW50XHMqKC4rKT8kLworICAgIGRlZiBwYXJzZV9jb250ZW50X2RpcmVjdGl2ZShwYXJlbnQsIGxpbmUsIHJvb3QsIHZhbHVlLCBvZmZzZXQpCisgICAgICB0cmFpbGluZyA9IGxpbmUudGV4dC5zY2FuKENPTlRFTlRfUkUpLmZpcnN0LmZpcnN0CisgICAgICB1bmxlc3MgdHJhaWxpbmcubmlsPworICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoCisgICAgICAgICAgIkludmFsaWQgY29udGVudCBkaXJlY3RpdmUuIFRyYWlsaW5nIGNoYXJhY3RlcnMgZm91bmQ6IFwiI3t0cmFpbGluZ31cIi4iKQorICAgICAgZW5kCisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIklsbGVnYWwgbmVzdGluZzogTm90aGluZyBtYXkgYmUgbmVzdGVkIGJlbmVhdGggQGNvbnRlbnQgZGlyZWN0aXZlcy4iLAorICAgICAgICA6bGluZSA9PiBsaW5lLmluZGV4ICsgMSkgdW5sZXNzIGxpbmUuY2hpbGRyZW4uZW1wdHk/CisgICAgICBUcmVlOjpDb250ZW50Tm9kZS5uZXcKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9pbmNsdWRlX2RpcmVjdGl2ZShwYXJlbnQsIGxpbmUsIHJvb3QsIHZhbHVlLCBvZmZzZXQpCisgICAgICBwYXJzZV9taXhpbl9pbmNsdWRlKGxpbmUsIHJvb3QpCisgICAgZW5kCisKKyAgICBNSVhJTl9JTkNMVURFX1JFID0gL14oPzpcK3xAaW5jbHVkZSlccyooI3tTYXNzOjpTQ1NTOjpSWDo6SURFTlR9KSguKikkLworICAgIGRlZiBwYXJzZV9taXhpbl9pbmNsdWRlKGxpbmUsIHJvb3QpCisgICAgICBuYW1lLCBhcmdfc3RyaW5nID0gbGluZS50ZXh0LnNjYW4oTUlYSU5fSU5DTFVERV9SRSkuZmlyc3QKKyAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiSW52YWxpZCBtaXhpbiBpbmNsdWRlIFwiI3tsaW5lLnRleHR9XCIuIikgaWYgbmFtZS5uaWw/CisKKyAgICAgIG9mZnNldCA9IGxpbmUub2Zmc2V0ICsgbGluZS50ZXh0LnNpemUgLSBhcmdfc3RyaW5nLnNpemUKKyAgICAgIGFyZ3MsIGtleXdvcmRzLCBzcGxhdCwga3dhcmdfc3BsYXQgPQorICAgICAgICBTY3JpcHQ6OlBhcnNlci5uZXcoYXJnX3N0cmluZy5zdHJpcCwgQGxpbmUsIHRvX3BhcnNlcl9vZmZzZXQob2Zmc2V0KSwgQG9wdGlvbnMpLgorICAgICAgICAgIHBhcnNlX21peGluX2luY2x1ZGVfYXJnbGlzdAorICAgICAgVHJlZTo6TWl4aW5Ob2RlLm5ldyhuYW1lLCBhcmdzLCBrZXl3b3Jkcywgc3BsYXQsIGt3YXJnX3NwbGF0KQorICAgIGVuZAorCisgICAgRlVOQ1RJT05fUkUgPSAvXkBmdW5jdGlvblxzKigje1Nhc3M6OlNDU1M6OlJYOjpJREVOVH0pKC4qKSQvCisgICAgZGVmIHBhcnNlX2Z1bmN0aW9uX2RpcmVjdGl2ZShwYXJlbnQsIGxpbmUsIHJvb3QsIHZhbHVlLCBvZmZzZXQpCisgICAgICBuYW1lLCBhcmdfc3RyaW5nID0gbGluZS50ZXh0LnNjYW4oRlVOQ1RJT05fUkUpLmZpcnN0CisgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoIkludmFsaWQgZnVuY3Rpb24gZGVmaW5pdGlvbiBcIiN7bGluZS50ZXh0fVwiLiIpIGlmIG5hbWUubmlsPworCisgICAgICBvZmZzZXQgPSBsaW5lLm9mZnNldCArIGxpbmUudGV4dC5zaXplIC0gYXJnX3N0cmluZy5zaXplCisgICAgICBhcmdzLCBzcGxhdCA9IFNjcmlwdDo6UGFyc2VyLm5ldyhhcmdfc3RyaW5nLnN0cmlwLCBAbGluZSwgdG9fcGFyc2VyX29mZnNldChvZmZzZXQpLCBAb3B0aW9ucykuCisgICAgICAgIHBhcnNlX2Z1bmN0aW9uX2RlZmluaXRpb25fYXJnbGlzdAorICAgICAgVHJlZTo6RnVuY3Rpb25Ob2RlLm5ldyhuYW1lLCBhcmdzLCBzcGxhdCkKKyAgICBlbmQKKworICAgIGRlZiBwYXJzZV9zY3JpcHQoc2NyaXB0LCBvcHRpb25zID0ge30pCisgICAgICBsaW5lID0gb3B0aW9uc1s6bGluZV0gfHwgQGxpbmUKKyAgICAgIG9mZnNldCA9IG9wdGlvbnNbOm9mZnNldF0gfHwgQG9mZnNldCArIDEKKyAgICAgIFNjcmlwdC5wYXJzZShzY3JpcHQsIGxpbmUsIG9mZnNldCwgQG9wdGlvbnMpCisgICAgZW5kCisKKyAgICBkZWYgZm9ybWF0X2NvbW1lbnRfdGV4dCh0ZXh0LCBzaWxlbnQpCisgICAgICBjb250ZW50ID0gdGV4dC5zcGxpdCgiXG4iKQorCisgICAgICBpZiBjb250ZW50LmZpcnN0ICYmIGNvbnRlbnQuZmlyc3Quc3RyaXAuZW1wdHk/CisgICAgICAgIHJlbW92ZWRfZmlyc3QgPSB0cnVlCisgICAgICAgIGNvbnRlbnQuc2hpZnQKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gIi8qICovIiBpZiBjb250ZW50LmVtcHR5PworICAgICAgY29udGVudC5sYXN0LmdzdWIhKCVyeyA/XCovICokfSwgJycpCisgICAgICBmaXJzdCA9IGNvbnRlbnQuc2hpZnQgdW5sZXNzIHJlbW92ZWRfZmlyc3QKKyAgICAgIGNvbnRlbnQubWFwISB7fGx8IGwuZ3N1YiEoL15cKiggPykvLCAnXDEnKSB8fCAobC5lbXB0eT8gPyAiIiA6ICIgIikgKyBsfQorICAgICAgY29udGVudC51bnNoaWZ0IGZpcnN0IHVubGVzcyByZW1vdmVkX2ZpcnN0CisgICAgICBpZiBzaWxlbnQKKyAgICAgICAgIi8qIiArIGNvbnRlbnQuam9pbigiXG4gKiIpICsgIiAqLyIKKyAgICAgIGVsc2UKKyAgICAgICAgIyBUaGUgI2dzdWIgZml4ZXMgdGhlIGNhc2Ugb2YgYSB0cmFpbGluZyAqLworICAgICAgICAiLyoiICsgY29udGVudC5qb2luKCJcbiAqIikuZ3N1YigvIFwqXFovLCAnJykgKyAiICovIgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcGFyc2VfaW50ZXJwKHRleHQsIG9mZnNldCA9IDApCisgICAgICBzZWxmLmNsYXNzLnBhcnNlX2ludGVycCh0ZXh0LCBAbGluZSwgb2Zmc2V0LCA6ZmlsZW5hbWUgPT4gQGZpbGVuYW1lKQorICAgIGVuZAorCisgICAgIyBQYXJzZXIgdHJhY2tzIDEtYmFzZWQgbGluZSBhbmQgb2Zmc2V0LCBzbyBvdXIgb2Zmc2V0IHNob3VsZCBiZSBjb252ZXJ0ZWQuCisgICAgZGVmIHRvX3BhcnNlcl9vZmZzZXQob2Zmc2V0KQorICAgICAgb2Zmc2V0ICsgMQorICAgIGVuZAorCisgICAgZGVmIGZ1bGxfbGluZV9yYW5nZShsaW5lKQorICAgICAgU2Fzczo6U291cmNlOjpSYW5nZS5uZXcoCisgICAgICAgIFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCB0b19wYXJzZXJfb2Zmc2V0KGxpbmUub2Zmc2V0KSksCisgICAgICAgIFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCB0b19wYXJzZXJfb2Zmc2V0KGxpbmUub2Zmc2V0KSArIGxpbmUudGV4dC5sZW5ndGgpLAorICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAb3B0aW9uc1s6aW1wb3J0ZXJdKQorICAgIGVuZAorCisgICAgIyBJdCdzIGltcG9ydGFudCB0aGF0IHRoaXMgaGF2ZSBzdHJpbmdzIChhdCBsZWFzdCkKKyAgICAjIGF0IHRoZSBiZWdpbm5pbmcsIHRoZSBlbmQsIGFuZCBiZXR3ZWVuIGVhY2ggU2NyaXB0OjpUcmVlOjpOb2RlLgorICAgICMKKyAgICAjIEBwcml2YXRlCisgICAgZGVmIHNlbGYucGFyc2VfaW50ZXJwKHRleHQsIGxpbmUsIG9mZnNldCwgb3B0aW9ucykKKyAgICAgIHJlcyA9IFtdCisgICAgICByZXN0ID0gU2Fzczo6U2hhcmVkLmhhbmRsZV9pbnRlcnBvbGF0aW9uIHRleHQgZG8gfHNjYW58CisgICAgICAgIGVzY2FwZXMgPSBzY2FuWzJdLnNpemUKKyAgICAgICAgcmVzIDw8IHNjYW4ubWF0Y2hlZFswLi4uLTIgLSBlc2NhcGVzXQorICAgICAgICBpZiBlc2NhcGVzLm9kZD8KKyAgICAgICAgICByZXMgPDwgIlxcIiAqIChlc2NhcGVzIC0gMSkgPDwgJyN7JworICAgICAgICBlbHNlCisgICAgICAgICAgcmVzIDw8ICJcXCIgKiBbMCwgZXNjYXBlcyAtIDFdLm1heAorICAgICAgICAgIGlmIHNjYW5bMV0uaW5jbHVkZT8oIlxuIikKKyAgICAgICAgICAgIGxpbmUgKz0gc2NhblsxXS5jb3VudCgiXG4iKQorICAgICAgICAgICAgb2Zmc2V0ID0gc2Nhbi5tYXRjaGVkX3NpemUgLSBzY2FuWzFdLnJpbmRleCgiXG4iKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9mZnNldCArPSBzY2FuLm1hdGNoZWRfc2l6ZQorICAgICAgICAgIGVuZAorICAgICAgICAgIG5vZGUgPSBTY3JpcHQ6OlBhcnNlci5uZXcoc2NhbiwgbGluZSwgb2Zmc2V0LCBvcHRpb25zKS5wYXJzZV9pbnRlcnBvbGF0ZWQKKyAgICAgICAgICBvZmZzZXQgPSBub2RlLnNvdXJjZV9yYW5nZS5lbmRfcG9zLm9mZnNldAorICAgICAgICAgIHJlcyA8PCBub2RlCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICByZXMgPDwgcmVzdAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9lbnZpcm9ubWVudC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZW52aXJvbm1lbnQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1MDJhOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZW52aXJvbm1lbnQucmIKQEAgLTAsMCArMSwyMzYgQEAKK3JlcXVpcmUgJ3NldCcKKworbW9kdWxlIFNhc3MKKyAgIyBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbGV4aWNhbCBlbnZpcm9ubWVudHMgZm9yIFNhc3NTY3JpcHQuCisgIGNsYXNzIEJhc2VFbnZpcm9ubWVudAorICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgICMgTm90ZTogd2hlbiB1cGRhdGluZyB0aGlzLAorICAgICAgIyB1cGRhdGUgc2Fzcy95YXJkL2luaGVyaXRlZF9oYXNoLnJiIGFzIHdlbGwuCisgICAgICBkZWYgaW5oZXJpdGVkX2hhc2hfYWNjZXNzb3IobmFtZSkKKyAgICAgICAgaW5oZXJpdGVkX2hhc2hfcmVhZGVyKG5hbWUpCisgICAgICAgIGluaGVyaXRlZF9oYXNoX3dyaXRlcihuYW1lKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbmhlcml0ZWRfaGFzaF9yZWFkZXIobmFtZSkKKyAgICAgICAgY2xhc3NfZXZhbCA8PC1SVUJZLCBfX0ZJTEVfXywgX19MSU5FX18gKyAxCisgICAgICAgICAgZGVmICN7bmFtZX0obmFtZSkKKyAgICAgICAgICAgIF8je25hbWV9KG5hbWUudHIoJ18nLCAnLScpKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgZGVmIF8je25hbWV9KG5hbWUpCisgICAgICAgICAgICAoQCN7bmFtZX1zICYmIEAje25hbWV9c1tuYW1lXSkgfHwgQHBhcmVudCAmJiBAcGFyZW50Ll8je25hbWV9KG5hbWUpCisgICAgICAgICAgZW5kCisgICAgICAgICAgcHJvdGVjdGVkIDpfI3tuYW1lfQorCisgICAgICAgICAgZGVmIGlzXyN7bmFtZX1fZ2xvYmFsPyhuYW1lKQorICAgICAgICAgICAgcmV0dXJuICFAcGFyZW50IGlmIEAje25hbWV9cyAmJiBAI3tuYW1lfXMuaGFzX2tleT8obmFtZSkKKyAgICAgICAgICAgIEBwYXJlbnQgJiYgQHBhcmVudC5pc18je25hbWV9X2dsb2JhbD8obmFtZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgUlVCWQorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbmhlcml0ZWRfaGFzaF93cml0ZXIobmFtZSkKKyAgICAgICAgY2xhc3NfZXZhbCA8PC1SVUJZLCBfX0ZJTEVfXywgX19MSU5FX18gKyAxCisgICAgICAgICAgZGVmIHNldF8je25hbWV9KG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUudHIoJ18nLCAnLScpCisgICAgICAgICAgICBAI3tuYW1lfXNbbmFtZV0gPSB2YWx1ZSB1bmxlc3MgdHJ5X3NldF8je25hbWV9KG5hbWUsIHZhbHVlKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgZGVmIHRyeV9zZXRfI3tuYW1lfShuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgIEAje25hbWV9cyB8fD0ge30KKyAgICAgICAgICAgIGlmIEAje25hbWV9cy5pbmNsdWRlPyhuYW1lKQorICAgICAgICAgICAgICBAI3tuYW1lfXNbbmFtZV0gPSB2YWx1ZQorICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICBlbHNpZiBAcGFyZW50ICYmICFAcGFyZW50Lmdsb2JhbD8KKyAgICAgICAgICAgICAgQHBhcmVudC50cnlfc2V0XyN7bmFtZX0obmFtZSwgdmFsdWUpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGZhbHNlCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBwcm90ZWN0ZWQgOnRyeV9zZXRfI3tuYW1lfQorCisgICAgICAgICAgZGVmIHNldF9sb2NhbF8je25hbWV9KG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgQCN7bmFtZX1zIHx8PSB7fQorICAgICAgICAgICAgQCN7bmFtZX1zW25hbWUudHIoJ18nLCAnLScpXSA9IHZhbHVlCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBkZWYgc2V0X2dsb2JhbF8je25hbWV9KG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgZ2xvYmFsX2Vudi5zZXRfI3tuYW1lfShuYW1lLCB2YWx1ZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgUlVCWQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgU2FzcyBFbmdpbmUuCisgICAgYXR0cl9yZWFkZXIgOm9wdGlvbnMKKworICAgIGF0dHJfd3JpdGVyIDpjYWxsZXIKKyAgICBhdHRyX3dyaXRlciA6Y29udGVudAorICAgIGF0dHJfd3JpdGVyIDpzZWxlY3RvcgorCisgICAgIyB2YXJpYWJsZQorICAgICMgU2NyaXB0OjpWYWx1ZQorICAgIGluaGVyaXRlZF9oYXNoX3JlYWRlciA6dmFyCisKKyAgICAjIG1peGluCisgICAgIyBTYXNzOjpDYWxsYWJsZQorICAgIGluaGVyaXRlZF9oYXNoX3JlYWRlciA6bWl4aW4KKworICAgICMgZnVuY3Rpb24KKyAgICAjIFNhc3M6OkNhbGxhYmxlCisgICAgaW5oZXJpdGVkX2hhc2hfcmVhZGVyIDpmdW5jdGlvbgorCisgICAgIyBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBUaGUgb3B0aW9ucyBoYXNoLiBTZWUKKyAgICAjICAge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjT3B0aW9ucyB0aGUgU2FzcyBvcHRpb25zIGRvY3VtZW50YXRpb259LgorICAgICMgQHBhcmFtIHBhcmVudCBbRW52aXJvbm1lbnRdIFNlZSBceyNwYXJlbnR9CisgICAgZGVmIGluaXRpYWxpemUocGFyZW50ID0gbmlsLCBvcHRpb25zID0gbmlsKQorICAgICAgQHBhcmVudCA9IHBhcmVudAorICAgICAgQG9wdGlvbnMgPSBvcHRpb25zIHx8IChwYXJlbnQgJiYgcGFyZW50Lm9wdGlvbnMpIHx8IHt9CisgICAgICBAc3RhY2sgPSBAcGFyZW50Lm5pbD8gPyBTYXNzOjpTdGFjay5uZXcgOiBuaWwKKyAgICAgIEBjYWxsZXIgPSBuaWwKKyAgICAgIEBjb250ZW50ID0gbmlsCisgICAgICBAZmlsZW5hbWUgPSBuaWwKKyAgICAgIEBmdW5jdGlvbnMgPSBuaWwKKyAgICAgIEBtaXhpbnMgPSBuaWwKKyAgICAgIEBzZWxlY3RvciA9IG5pbAorICAgICAgQHZhcnMgPSBuaWwKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgdGhlIGdsb2JhbCBlbnZpcm9ubWVudC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBnbG9iYWw/CisgICAgICBAcGFyZW50Lm5pbD8KKyAgICBlbmQKKworICAgICMgVGhlIGVudmlyb25tZW50IG9mIHRoZSBjYWxsZXIgb2YgdGhpcyBlbnZpcm9ubWVudCdzIG1peGluIG9yIGZ1bmN0aW9uLgorICAgICMgQHJldHVybiB7RW52aXJvbm1lbnQ/fQorICAgIGRlZiBjYWxsZXIKKyAgICAgIEBjYWxsZXIgfHwgKEBwYXJlbnQgJiYgQHBhcmVudC5jYWxsZXIpCisgICAgZW5kCisKKyAgICAjIFRoZSBjb250ZW50IHBhc3NlZCB0byB0aGlzIGVudmlyb25tZW50LiBUaGlzIGlzIG5hdHVyYWxseSBvbmx5IHNldAorICAgICMgZm9yIG1peGluIGJvZHkgZW52aXJvbm1lbnRzIHdpdGggY29udGVudCBwYXNzZWQgaW4uCisgICAgIworICAgICMgQHJldHVybiB7W0FycmF5PFNhc3M6OlRyZWU6Ok5vZGU+LCBFbnZpcm9ubWVudF0/fSBUaGUgY29udGVudCBub2RlcyBhbmQKKyAgICAjICAgdGhlIGxleGljYWwgZW52aXJvbm1lbnQgb2YgdGhlIGNvbnRlbnQgYmxvY2suCisgICAgZGVmIGNvbnRlbnQKKyAgICAgIEBjb250ZW50IHx8IChAcGFyZW50ICYmIEBwYXJlbnQuY29udGVudCkKKyAgICBlbmQKKworICAgICMgVGhlIHNlbGVjdG9yIGZvciB0aGUgY3VycmVudCBDU1MgcnVsZSwgb3IgbmlsIGlmIHRoZXJlIGlzIG5vCisgICAgIyBjdXJyZW50IENTUyBydWxlLgorICAgICMKKyAgICAjIEByZXR1cm4gW1NlbGVjdG9yOjpDb21tYVNlcXVlbmNlP10gVGhlIGN1cnJlbnQgc2VsZWN0b3IsIHdpdGggYW55CisgICAgIyAgIG5lc3RpbmcgZnVsbHkgcmVzb2x2ZWQuCisgICAgZGVmIHNlbGVjdG9yCisgICAgICBAc2VsZWN0b3IgfHwgKEBjYWxsZXIgJiYgQGNhbGxlci5zZWxlY3RvcikgfHwgKEBwYXJlbnQgJiYgQHBhcmVudC5zZWxlY3RvcikKKyAgICBlbmQKKworICAgICMgVGhlIHRvcC1sZXZlbCBFbnZpcm9ubWVudCBvYmplY3QuCisgICAgIworICAgICMgQHJldHVybiBbRW52aXJvbm1lbnRdCisgICAgZGVmIGdsb2JhbF9lbnYKKyAgICAgIEBnbG9iYWxfZW52IHx8PSBnbG9iYWw/ID8gc2VsZiA6IEBwYXJlbnQuZ2xvYmFsX2VudgorICAgIGVuZAorCisgICAgIyBUaGUgaW1wb3J0L21peGluIHN0YWNrLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlN0YWNrXQorICAgIGRlZiBzdGFjaworICAgICAgQHN0YWNrIHx8IGdsb2JhbF9lbnYuc3RhY2sKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBUaGUgbGV4aWNhbCBlbnZpcm9ubWVudCBmb3IgU2Fzc1NjcmlwdC4KKyAgIyBUaGlzIGtlZXBzIHRyYWNrIG9mIHZhcmlhYmxlLCBtaXhpbiwgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICAjCisgICMgQSBuZXcgZW52aXJvbm1lbnQgaXMgY3JlYXRlZCBmb3IgZWFjaCBsZXZlbCBvZiBTYXNzIG5lc3RpbmcuCisgICMgVGhpcyBhbGxvd3MgdmFyaWFibGVzIHRvIGJlIGxleGljYWxseSBzY29wZWQuCisgICMgVGhlIG5ldyBlbnZpcm9ubWVudCByZWZlcnMgdG8gdGhlIGVudmlyb25tZW50IGluIHRoZSB1cHBlciBzY29wZSwKKyAgIyBzbyBpdCBoYXMgYWNjZXNzIHRvIHZhcmlhYmxlcyBkZWZpbmVkIGluIGVuY2xvc2luZyBzY29wZXMsCisgICMgYnV0IG5ldyB2YXJpYWJsZXMgYXJlIGRlZmluZWQgbG9jYWxseS4KKyAgIworICAjIEVudmlyb25tZW50IGFsc28ga2VlcHMgdHJhY2sgb2YgdGhlIHtFbmdpbmV9IG9wdGlvbnMKKyAgIyBzbyB0aGF0IHRoZXkgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHtTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9uc30uCisgIGNsYXNzIEVudmlyb25tZW50IDwgQmFzZUVudmlyb25tZW50CisgICAgIyBUaGUgZW5jbG9zaW5nIGVudmlyb25tZW50LAorICAgICMgb3IgbmlsIGlmIHRoaXMgaXMgdGhlIGdsb2JhbCBlbnZpcm9ubWVudC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtFbnZpcm9ubWVudF0KKyAgICBhdHRyX3JlYWRlciA6cGFyZW50CisKKyAgICAjIHZhcmlhYmxlCisgICAgIyBTY3JpcHQ6OlZhbHVlCisgICAgaW5oZXJpdGVkX2hhc2hfd3JpdGVyIDp2YXIKKworICAgICMgbWl4aW4KKyAgICAjIFNhc3M6OkNhbGxhYmxlCisgICAgaW5oZXJpdGVkX2hhc2hfd3JpdGVyIDptaXhpbgorCisgICAgIyBmdW5jdGlvbgorICAgICMgU2Fzczo6Q2FsbGFibGUKKyAgICBpbmhlcml0ZWRfaGFzaF93cml0ZXIgOmZ1bmN0aW9uCisgIGVuZAorCisgICMgQSByZWFkLW9ubHkgd3JhcHBlciBmb3IgYSBsZXhpY2FsIGVudmlyb25tZW50IGZvciBTYXNzU2NyaXB0LgorICBjbGFzcyBSZWFkT25seUVudmlyb25tZW50IDwgQmFzZUVudmlyb25tZW50CisgICAgZGVmIGluaXRpYWxpemUocGFyZW50ID0gbmlsLCBvcHRpb25zID0gbmlsKQorICAgICAgc3VwZXIKKyAgICAgIEBjb250ZW50X2NhY2hlZCA9IG5pbAorICAgIGVuZAorICAgICMgVGhlIHJlYWQtb25seSBlbnZpcm9ubWVudCBvZiB0aGUgY2FsbGVyIG9mIHRoaXMgZW52aXJvbm1lbnQncyBtaXhpbiBvciBmdW5jdGlvbi4KKyAgICAjCisgICAgIyBAc2VlIEJhc2VFbnZpcm9ubWVudCNjYWxsZXIKKyAgICAjIEByZXR1cm4ge1JlYWRPbmx5RW52aXJvbm1lbnR9CisgICAgZGVmIGNhbGxlcgorICAgICAgcmV0dXJuIEBjYWxsZXIgaWYgQGNhbGxlcgorICAgICAgZW52ID0gc3VwZXIKKyAgICAgIEBjYWxsZXIgfHw9IGVudi5pc19hPyhSZWFkT25seUVudmlyb25tZW50KSA/IGVudiA6IFJlYWRPbmx5RW52aXJvbm1lbnQubmV3KGVudiwgZW52Lm9wdGlvbnMpCisgICAgZW5kCisKKyAgICAjIFRoZSBjb250ZW50IHBhc3NlZCB0byB0aGlzIGVudmlyb25tZW50LiBJZiB0aGUgY29udGVudCdzIGVudmlyb25tZW50IGlzbid0IGFscmVhZHkKKyAgICAjIHJlYWQtb25seSwgaXQncyBtYWRlIHJlYWQtb25seS4KKyAgICAjCisgICAgIyBAc2VlIEJhc2VFbnZpcm9ubWVudCNjb250ZW50CisgICAgIworICAgICMgQHJldHVybiB7W0FycmF5PFNhc3M6OlRyZWU6Ok5vZGU+LCBSZWFkT25seUVudmlyb25tZW50XT99IFRoZSBjb250ZW50IG5vZGVzIGFuZAorICAgICMgICB0aGUgbGV4aWNhbCBlbnZpcm9ubWVudCBvZiB0aGUgY29udGVudCBibG9jay4KKyAgICAjICAgUmV0dXJucyBgbmlsYCB3aGVuIHRoZXJlIGlzIG5vIGNvbnRlbnQgaW4gdGhpcyBlbnZpcm9ubWVudC4KKyAgICBkZWYgY29udGVudAorICAgICAgIyBSZXR1cm4gdGhlIGNhY2hlZCBjb250ZW50IGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIGlmIGFueQorICAgICAgcmV0dXJuIEBjb250ZW50IGlmIEBjb250ZW50X2NhY2hlZAorICAgICAgIyBnZXQgdGhlIGNvbnRlbnQgd2l0aCBhIHJlYWQtd3JpdGUgZW52aXJvbm1lbnQgZnJvbSB0aGUgc3VwZXJjbGFzcworICAgICAgcmVhZF93cml0ZV9jb250ZW50ID0gc3VwZXIKKyAgICAgIGlmIHJlYWRfd3JpdGVfY29udGVudAorICAgICAgICB0cmVlLCBlbnYgPSByZWFkX3dyaXRlX2NvbnRlbnQKKyAgICAgICAgIyBtYWtlIHRoZSBjb250ZW50J3MgZW52aXJvbm1lbnQgcmVhZC1vbmx5CisgICAgICAgIGlmIGVudiAmJiAhZW52LmlzX2E/KFJlYWRPbmx5RW52aXJvbm1lbnQpCisgICAgICAgICAgZW52ID0gUmVhZE9ubHlFbnZpcm9ubWVudC5uZXcoZW52LCBlbnYub3B0aW9ucykKKyAgICAgICAgZW5kCisgICAgICAgIEBjb250ZW50X2NhY2hlZCA9IHRydWUKKyAgICAgICAgQGNvbnRlbnQgPSBbdHJlZSwgZW52XQorICAgICAgZWxzZQorICAgICAgICBAY29udGVudF9jYWNoZWQgPSB0cnVlCisgICAgICAgIEBjb250ZW50ID0gbmlsCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBBbiBlbnZpcm9ubWVudCB0aGF0IGNhbiB3cml0ZSB0byBpbi1zY29wZSBnbG9iYWwgdmFyaWFibGVzLCBidXQgZG9lc24ndAorICAjIGNyZWF0ZSBuZXcgdmFyaWFibGVzIGluIHRoZSBnbG9iYWwgc2NvcGUuIFVzZWZ1bCBmb3IgdG9wLWxldmVsIGNvbnRyb2wKKyAgIyBkaXJlY3RpdmVzLgorICBjbGFzcyBTZW1pR2xvYmFsRW52aXJvbm1lbnQgPCBFbnZpcm9ubWVudAorICAgIGRlZiB0cnlfc2V0X3ZhcihuYW1lLCB2YWx1ZSkKKyAgICAgIEB2YXJzIHx8PSB7fQorICAgICAgaWYgQHZhcnMuaW5jbHVkZT8obmFtZSkKKyAgICAgICAgQHZhcnNbbmFtZV0gPSB2YWx1ZQorICAgICAgICB0cnVlCisgICAgICBlbHNpZiBAcGFyZW50CisgICAgICAgIEBwYXJlbnQudHJ5X3NldF92YXIobmFtZSwgdmFsdWUpCisgICAgICBlbHNlCisgICAgICAgIGZhbHNlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZXJyb3IucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2Vycm9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTc0NjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2Vycm9yLnJiCkBAIC0wLDAgKzEsMTk4IEBACittb2R1bGUgU2FzcworICAjIEFuIGV4Y2VwdGlvbiBjbGFzcyB0aGF0IGtlZXBzIHRyYWNrIG9mCisgICMgdGhlIGxpbmUgb2YgdGhlIFNhc3MgdGVtcGxhdGUgaXQgd2FzIHJhaXNlZCBvbgorICAjIGFuZCB0aGUgU2FzcyBmaWxlIHRoYXQgd2FzIGJlaW5nIHBhcnNlZCAoaWYgYXBwbGljYWJsZSkuCisgICMKKyAgIyBBbGwgU2FzcyBlcnJvcnMgYXJlIHJhaXNlZCBhcyB7U2Fzczo6U3ludGF4RXJyb3J9cy4KKyAgIworICAjIFdoZW4gZGVhbGluZyB3aXRoIFN5bnRheEVycm9ycywKKyAgIyBpdCdzIGltcG9ydGFudCB0byBwcm92aWRlIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KKyAgIyBUaGlzIHdpbGwgYmUgdXNlZCBpbiB2YXJpb3VzIGVycm9yIHJlcG9ydHMgdG8gdXNlcnMsIGluY2x1ZGluZyBiYWNrdHJhY2VzOworICAjIHNlZSBceyNzYXNzXF9iYWNrdHJhY2V9IGZvciBkZXRhaWxzLgorICAjCisgICMgU29tZSBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIHVzdWFsbHkgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgY29uc3RydWN0b3IuCisgICMgTmV3IGJhY2t0cmFjZSBlbnRyaWVzIGNhbiBiZSBhZGRlZCB3aXRoIFx7I2FkZFxfYmFja3RyYWNlfSwKKyAgIyB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGJldHdlZW4gZmlsZXMgKGUuZy4gd2l0aCBgQGltcG9ydGApLgorICAjCisgICMgT2Z0ZW4sIGEgY2h1bmsgb2YgY29kZSB3aWxsIGFsbCBoYXZlIHNpbWlsYXIgYmFja3RyYWNlIGluZm9ybWF0aW9uIC0KKyAgIyB0aGUgc2FtZSBmaWxlbmFtZSBvciBldmVuIGxpbmUuCisgICMgSXQgbWF5IGFsc28gYmUgdXNlZnVsIHRvIGhhdmUgYSBkZWZhdWx0IGxpbmUgbnVtYmVyIHNldC4KKyAgIyBJbiB0aG9zZSBzaXR1YXRpb25zLCB0aGUgZGVmYXVsdCB2YWx1ZXMgY2FuIGJlIHVzZWQKKyAgIyBieSBvbWl0dGluZyB0aGUgaW5mb3JtYXRpb24gb24gdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiwKKyAgIyBhbmQgdGhlbiBjYWxsaW5nIFx7I21vZGlmeVxfYmFja3RyYWNlfSBpbiBhIHdyYXBwZXIgYHJlc2N1ZWAuCisgICMgV2hlbiBkb2luZyB0aGlzLCBiZSBzdXJlIHRoYXQgYWxsIGV4Y2VwdGlvbnMgdWx0aW1hdGVseSBlbmQgdXAKKyAgIyB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmaWxsZWQgaW4uCisgIGNsYXNzIFN5bnRheEVycm9yIDwgU3RhbmRhcmRFcnJvcgorICAgICMgVGhlIGJhY2t0cmFjZSBvZiB0aGUgZXJyb3Igd2l0aGluIFNhc3MgZmlsZXMuCisgICAgIyBUaGlzIGlzIGFuIGFycmF5IG9mIGhhc2hlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSBlbnRyeS4KKyAgICAjIFRoZSBoYXNoZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGtleXM6CisgICAgIworICAgICMgYDpmaWxlbmFtZWAKKyAgICAjIDogVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLAorICAgICMgICBvciBgbmlsYCBpZiBubyBmaWxlbmFtZSBpcyBhdmFpbGFibGUuCisgICAgIworICAgICMgYDptaXhpbmAKKyAgICAjIDogVGhlIG5hbWUgb2YgdGhlIG1peGluIGluIHdoaWNoIHRoZSBleGNlcHRpb24gd2FzIHJhaXNlZCwKKyAgICAjICAgb3IgYG5pbGAgaWYgaXQgd2Fzbid0IHJhaXNlZCBpbiBhIG1peGluLgorICAgICMKKyAgICAjIGA6bGluZWAKKyAgICAjIDogVGhlIGxpbmUgb2YgdGhlIGZpbGUgb24gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLiBOZXZlciBuaWwuCisgICAgIworICAgICMgVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGluY2x1ZGVkIGluIHN0YW5kYXJkIGJhY2t0cmFjZSBmb3JtYXQKKyAgICAjIGluIHRoZSBvdXRwdXQgb2YgXHsjYmFja3RyYWNlfS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcmF5PHtTeW1ib2wgPT4gT2JqZWN0Pn1dCisgICAgYXR0cl9hY2Nlc3NvciA6c2Fzc19iYWNrdHJhY2UKKworICAgICMgVGhlIHRleHQgb2YgdGhlIHRlbXBsYXRlIHdoZXJlIHRoaXMgZXJyb3Igd2FzIHJhaXNlZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgYXR0cl9hY2Nlc3NvciA6c2Fzc190ZW1wbGF0ZQorCisgICAgIyBAcGFyYW0gbXNnIFtTdHJpbmddIFRoZSBlcnJvciBtZXNzYWdlCisgICAgIyBAcGFyYW0gYXR0cnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gVGhlIGluZm9ybWF0aW9uIGluIHRoZSBiYWNrdHJhY2UgZW50cnkuCisgICAgIyAgIFNlZSBceyNzYXNzXF9iYWNrdHJhY2V9CisgICAgZGVmIGluaXRpYWxpemUobXNnLCBhdHRycyA9IHt9KQorICAgICAgQG1lc3NhZ2UgPSBtc2cKKyAgICAgIEBzYXNzX2JhY2t0cmFjZSA9IFtdCisgICAgICBhZGRfYmFja3RyYWNlKGF0dHJzKQorICAgIGVuZAorCisgICAgIyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZXhjZXB0aW9uIHdhcyByYWlzZWQuCisgICAgIyBUaGlzIGNvdWxkIGJlIGBuaWxgIGlmIG5vIGZpbGVuYW1lIGlzIGF2YWlsYWJsZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmcsIG5pbF0KKyAgICBkZWYgc2Fzc19maWxlbmFtZQorICAgICAgc2Fzc19iYWNrdHJhY2UuZmlyc3RbOmZpbGVuYW1lXQorICAgIGVuZAorCisgICAgIyBUaGUgbmFtZSBvZiB0aGUgbWl4aW4gaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgorICAgICMgVGhpcyBjb3VsZCBiZSBgbmlsYCBpZiB0aGUgZXJyb3Igb2NjdXJyZWQgb3V0c2lkZSBhIG1peGluLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBkZWYgc2Fzc19taXhpbgorICAgICAgc2Fzc19iYWNrdHJhY2UuZmlyc3RbOm1peGluXQorICAgIGVuZAorCisgICAgIyBUaGUgbGluZSBvZiB0aGUgU2FzcyB0ZW1wbGF0ZSBvbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgIworICAgICMgQHJldHVybiBbSW50ZWdlcl0KKyAgICBkZWYgc2Fzc19saW5lCisgICAgICBzYXNzX2JhY2t0cmFjZS5maXJzdFs6bGluZV0KKyAgICBlbmQKKworICAgICMgQWRkcyBhbiBlbnRyeSB0byB0aGUgZXhjZXB0aW9uJ3MgU2FzcyBiYWNrdHJhY2UuCisgICAgIworICAgICMgQHBhcmFtIGF0dHJzIFt7U3ltYm9sID0+IE9iamVjdH1dIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgYmFja3RyYWNlIGVudHJ5LgorICAgICMgICBTZWUgXHsjc2Fzc1xfYmFja3RyYWNlfQorICAgIGRlZiBhZGRfYmFja3RyYWNlKGF0dHJzKQorICAgICAgc2Fzc19iYWNrdHJhY2UgPDwgYXR0cnMucmVqZWN0IHt8X2ssIHZ8IHYubmlsP30KKyAgICBlbmQKKworICAgICMgTW9kaWZ5IHRoZSB0b3AgU2FzcyBiYWNrdHJhY2UgZW50cmllcworICAgICMgKHRoYXQgaXMsIHRoZSBtb3N0IGRlZXBseSBuZXN0ZWQgb25lcykKKyAgICAjIHRvIGhhdmUgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCisgICAgIworICAgICMgU3BlY2lmaWNhbGx5LCB0aGlzIGdvZXMgdGhyb3VnaCB0aGUgYmFja3RyYWNlIGVudHJpZXMKKyAgICAjIGZyb20gbW9zdCBkZWVwbHkgbmVzdGVkIHRvIGxlYXN0LAorICAgICMgc2V0dGluZyB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBmb3IgZWFjaCBlbnRyeS4KKyAgICAjIElmIGFuIGVudHJ5IGFscmVhZHkgaGFzIG9uZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBzZXQsCisgICAgIyB0aGUgcHJlLWV4aXN0aW5nIGF0dHJpYnV0ZSB0YWtlcyBwcmVjZWRlbmNlCisgICAgIyBhbmQgaXMgbm90IHVzZWQgZm9yIGxlc3MgZGVlcGx5LW5lc3RlZCBlbnRyaWVzCisgICAgIyAoZXZlbiBpZiB0aGV5IGRvbid0IGhhdmUgdGhhdCBhdHRyaWJ1dGUgc2V0KS4KKyAgICAjCisgICAgIyBAcGFyYW0gYXR0cnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gVGhlIGluZm9ybWF0aW9uIHRvIGFkZCB0byB0aGUgYmFja3RyYWNlIGVudHJ5LgorICAgICMgICBTZWUgXHsjc2Fzc1xfYmFja3RyYWNlfQorICAgIGRlZiBtb2RpZnlfYmFja3RyYWNlKGF0dHJzKQorICAgICAgYXR0cnMgPSBhdHRycy5yZWplY3Qge3xfaywgdnwgdi5uaWw/fQorICAgICAgIyBNb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBiYWNrdHJhY2UKKyAgICAgICgwLi4uc2Fzc19iYWNrdHJhY2Uuc2l6ZSkudG9fYS5yZXZlcnNlX2VhY2ggZG8gfGl8CisgICAgICAgIGVudHJ5ID0gc2Fzc19iYWNrdHJhY2VbaV0KKyAgICAgICAgc2Fzc19iYWNrdHJhY2VbaV0gPSBhdHRycy5tZXJnZShlbnRyeSkKKyAgICAgICAgYXR0cnMucmVqZWN0ISB7fGssIF92fCBlbnRyeS5pbmNsdWRlPyhrKX0KKyAgICAgICAgYnJlYWsgaWYgYXR0cnMuZW1wdHk/CisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgZXJyb3IgbWVzc2FnZQorICAgIGRlZiB0b19zCisgICAgICBAbWVzc2FnZQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBleGNlcHRpb24gYmFja3RyYWNlLAorICAgICMgaW5jbHVkaW5nIHRoZSBTYXNzIGJhY2t0cmFjZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmc+XQorICAgIGRlZiBiYWNrdHJhY2UKKyAgICAgIHJldHVybiBuaWwgaWYgc3VwZXIubmlsPworICAgICAgcmV0dXJuIHN1cGVyIGlmIHNhc3NfYmFja3RyYWNlLmFsbD8ge3xofCBoLmVtcHR5P30KKyAgICAgIHNhc3NfYmFja3RyYWNlLm1hcCBkbyB8aHwKKyAgICAgICAgIiN7aFs6ZmlsZW5hbWVdIHx8ICcoc2FzcyknfToje2hbOmxpbmVdfSIgKworICAgICAgICAgIChoWzptaXhpbl0gPyAiOmluIGAje2hbOm1peGluXX0nIiA6ICIiKQorICAgICAgZW5kICsgc3VwZXIKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgU2FzcyBiYWNrdHJhY2UuCisgICAgIworICAgICMgQHBhcmFtIGRlZmF1bHRfZmlsZW5hbWUgW1N0cmluZ10gVGhlIGZpbGVuYW1lIHRvIHVzZSBmb3IgdW5rbm93biBmaWxlcworICAgICMgQHNlZSAjc2Fzc19iYWNrdHJhY2UKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBkZWYgc2Fzc19iYWNrdHJhY2Vfc3RyKGRlZmF1bHRfZmlsZW5hbWUgPSAiYW4gdW5rbm93biBmaWxlIikKKyAgICAgIGxpbmVzID0gbWVzc2FnZS5zcGxpdCgiXG4iKQorICAgICAgbXNnID0gbGluZXNbMF0gKyBsaW5lc1sxLi4tMV0uCisgICAgICAgIG1hcCB7fGx8ICJcbiIgKyAoIiAiICogIkVycm9yOiAiLnNpemUpICsgbH0uam9pbgorICAgICAgIkVycm9yOiAje21zZ30iICsKKyAgICAgICAgc2Fzc19iYWNrdHJhY2UuZWFjaF93aXRoX2luZGV4Lm1hcCBkbyB8ZW50cnksIGl8CisgICAgICAgICAgIlxuICAgICAgICAje2kgPT0gMCA/ICdvbicgOiAnZnJvbSd9IGxpbmUgI3tlbnRyeVs6bGluZV19IiArCisgICAgICAgICAgICAiIG9mICN7ZW50cnlbOmZpbGVuYW1lXSB8fCBkZWZhdWx0X2ZpbGVuYW1lfSIgKworICAgICAgICAgICAgKGVudHJ5WzptaXhpbl0gPyAiLCBpbiBgI3tlbnRyeVs6bWl4aW5dfSciIDogIiIpCisgICAgICAgIGVuZC5qb2luCisgICAgZW5kCisKKyAgICBjbGFzcyA8PCBzZWxmCisgICAgICAjIFJldHVybnMgYW4gZXJyb3IgcmVwb3J0IGZvciBhbiBleGNlcHRpb24gaW4gQ1NTIGZvcm1hdC4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGUgW0V4Y2VwdGlvbl0KKyAgICAgICMgQHBhcmFtIGxpbmVfb2Zmc2V0IFtJbnRlZ2VyXSBUaGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBTYXNzIHRlbXBsYXRlLgorICAgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBlcnJvciByZXBvcnQKKyAgICAgICMgQHJhaXNlIFtFeGNlcHRpb25dIGBlYCwgaWYgdGhlCisgICAgICAjICAge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjZnVsbF9leGNlcHRpb24tb3B0aW9uIGA6ZnVsbF9leGNlcHRpb25gfSBvcHRpb24KKyAgICAgICMgICBpcyBzZXQgdG8gZmFsc2UuCisgICAgICBkZWYgZXhjZXB0aW9uX3RvX2NzcyhlLCBsaW5lX29mZnNldCA9IDEpCisgICAgICAgIGhlYWRlciA9IGhlYWRlcl9zdHJpbmcoZSwgbGluZV9vZmZzZXQpCisKKyAgICAgICAgPDxFTkQKKy8qCisje2hlYWRlci5nc3ViKCcqLycsICcqXFwvJyl9CisKK0JhY2t0cmFjZTpcbiN7ZS5iYWNrdHJhY2Uuam9pbigiXG4iKS5nc3ViKCcqLycsICcqXFwvJyl9CisqLworYm9keTpiZWZvcmUgeworICB3aGl0ZS1zcGFjZTogcHJlOworICBmb250LWZhbWlseTogbW9ub3NwYWNlOworICBjb250ZW50OiAiI3toZWFkZXIuZ3N1YignIicsICdcIicpLmdzdWIoIlxuIiwgJ1xcQSAnKX0iOyB9CitFTkQKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBoZWFkZXJfc3RyaW5nKGUsIGxpbmVfb2Zmc2V0KQorICAgICAgICB1bmxlc3MgZS5pc19hPyhTYXNzOjpTeW50YXhFcnJvcikgJiYgZS5zYXNzX2xpbmUgJiYgZS5zYXNzX3RlbXBsYXRlCisgICAgICAgICAgcmV0dXJuICIje2UuY2xhc3N9OiAje2UubWVzc2FnZX0iCisgICAgICAgIGVuZAorCisgICAgICAgIGxpbmVfbnVtID0gZS5zYXNzX2xpbmUgKyAxIC0gbGluZV9vZmZzZXQKKyAgICAgICAgbWluID0gW2xpbmVfbnVtIC0gNiwgMF0ubWF4CisgICAgICAgIHNlY3Rpb24gPSBlLnNhc3NfdGVtcGxhdGUucnN0cmlwLnNwbGl0KCJcbiIpW21pbi4uLmxpbmVfbnVtICsgNV0KKyAgICAgICAgcmV0dXJuIGUuc2Fzc19iYWNrdHJhY2Vfc3RyIGlmIHNlY3Rpb24ubmlsPyB8fCBzZWN0aW9uLmVtcHR5PworCisgICAgICAgIGUuc2Fzc19iYWNrdHJhY2Vfc3RyICsgIlxuXG4iICsgc2VjdGlvbi5lYWNoX3dpdGhfaW5kZXguCisgICAgICAgICAgbWFwIHt8bGluZSwgaXwgIiN7bGluZV9vZmZzZXQgKyBtaW4gKyBpfTogI3tsaW5lfSJ9LmpvaW4oIlxuIikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICAjIFRoZSBjbGFzcyBmb3IgU2FzcyBlcnJvcnMgdGhhdCBhcmUgcmFpc2VkIGR1ZSB0byBpbnZhbGlkIHVuaXQgY29udmVyc2lvbnMKKyAgIyBpbiBTYXNzU2NyaXB0LgorICBjbGFzcyBVbml0Q29udmVyc2lvbkVycm9yIDwgU3ludGF4RXJyb3I7IGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2V4ZWMucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2V4ZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkZDMyNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZXhlYy5yYgpAQCAtMCwwICsxLDkgQEAKK21vZHVsZSBTYXNzCisgICMgVGhpcyBtb2R1bGUgaGFuZGxlcyB0aGUgU2FzcyBleGVjdXRhYmxlcyAoYHNhc3NgIGFuZCBgc2Fzcy1jb252ZXJ0YCkuCisgIG1vZHVsZSBFeGVjCisgIGVuZAorZW5kCisKK3JlcXVpcmUgJ3Nhc3MvZXhlYy9iYXNlJworcmVxdWlyZSAnc2Fzcy9leGVjL3Nhc3Nfc2NzcycKK3JlcXVpcmUgJ3Nhc3MvZXhlYy9zYXNzX2NvbnZlcnQnCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2V4ZWMvYmFzZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZXhlYy9iYXNlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzI2MjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2V4ZWMvYmFzZS5yYgpAQCAtMCwwICsxLDE5MCBAQAorcmVxdWlyZSAnb3B0cGFyc2UnCisKK21vZHVsZSBTYXNzOjpFeGVjCisgICMgVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIFNhc3MgZXhlY3V0YWJsZXMuCisgIGNsYXNzIEJhc2UKKyAgICAjIEBwYXJhbSBhcmdzIFtBcnJheTxTdHJpbmc+XSBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cworICAgIGRlZiBpbml0aWFsaXplKGFyZ3MpCisgICAgICBAYXJncyA9IGFyZ3MKKyAgICAgIEBvcHRpb25zID0ge30KKyAgICBlbmQKKworICAgICMgUGFyc2VzIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBydW5zIHRoZSBleGVjdXRhYmxlLgorICAgICMgQ2FsbHMgYEtlcm5lbCNleGl0YCBhdCB0aGUgZW5kLCBzbyBpdCBuZXZlciByZXR1cm5zLgorICAgICMKKyAgICAjIEBzZWUgI3BhcnNlCisgICAgZGVmIHBhcnNlIQorICAgICAgIyBydWJvY29wOmRpc2FibGUgUmVzY3VlRXhjZXB0aW9uCisgICAgICBiZWdpbgorICAgICAgICBwYXJzZQorICAgICAgcmVzY3VlIEV4Y2VwdGlvbiA9PiBlCisgICAgICAgICMgRXhpdCBjb2RlIDY1IGluZGljYXRlcyBpbnZhbGlkIGRhdGEgcGVyCisgICAgICAgICMgaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvbWFuLmNnaT9xdWVyeT1zeXNleGl0cy4gU2V0dGluZyBpdCB2aWEKKyAgICAgICAgIyBhdF9leGl0IGlzIGEgYml0IG9mIGEgaGFjaywgYnV0IGl0IGFsbG93cyB1cyB0byByZXRocm93IHdoZW4gLS10cmFjZQorICAgICAgICAjIGlzIGFjdGl2ZSBhbmQgZ2V0IGJvdGggdGhlIGJ1aWx0LWluIGV4Y2VwdGlvbiBmb3JtYXR0aW5nIGFuZCB0aGUKKyAgICAgICAgIyBjb3JyZWN0IGV4aXQgY29kZS4KKyAgICAgICAgYXRfZXhpdCB7ZXhpdCBTYXNzOjpVdGlsLndpbmRvd3M/ID8gMTMgOiA2NX0gaWYgZS5pc19hPyhTYXNzOjpTeW50YXhFcnJvcikKKworICAgICAgICByYWlzZSBlIGlmIEBvcHRpb25zWzp0cmFjZV0gfHwgZS5pc19hPyhTeXN0ZW1FeGl0KQorCisgICAgICAgIGlmIGUuaXNfYT8oU2Fzczo6U3ludGF4RXJyb3IpCisgICAgICAgICAgJHN0ZGVyci5wdXRzIGUuc2Fzc19iYWNrdHJhY2Vfc3RyKCJzdGFuZGFyZCBpbnB1dCIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAkc3RkZXJyLnByaW50ICIje2UuY2xhc3N9OiAiIHVubGVzcyBlLmNsYXNzID09IFJ1bnRpbWVFcnJvcgorICAgICAgICAgICRzdGRlcnIucHV0cyBlLm1lc3NhZ2UudG9fcworICAgICAgICBlbmQKKyAgICAgICAgJHN0ZGVyci5wdXRzICIgIFVzZSAtLXRyYWNlIGZvciBiYWNrdHJhY2UuIgorCisgICAgICAgIGV4aXQgMQorICAgICAgZW5kCisgICAgICBleGl0IDAKKyAgICAgICMgcnVib2NvcDplbmFibGUgUmVzY3VlRXhjZXB0aW9uCisgICAgZW5kCisKKyAgICAjIFBhcnNlcyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgcnVucyB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoaXMgZG9lcyBub3QgaGFuZGxlIGV4Y2VwdGlvbnMgb3IgZXhpdCB0aGUgcHJvZ3JhbS4KKyAgICAjCisgICAgIyBAc2VlICNwYXJzZSEKKyAgICBkZWYgcGFyc2UKKyAgICAgIEBvcHRzID0gT3B0aW9uUGFyc2VyLm5ldygmbWV0aG9kKDpzZXRfb3B0cykpCisgICAgICBAb3B0cy5wYXJzZSEoQGFyZ3MpCisKKyAgICAgIHByb2Nlc3NfcmVzdWx0CisKKyAgICAgIEBvcHRpb25zCisgICAgZW5kCisKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gQSBkZXNjcmlwdGlvbiBvZiB0aGUgZXhlY3V0YWJsZQorICAgIGRlZiB0b19zCisgICAgICBAb3B0cy50b19zCisgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKworICAgICMgRmluZHMgdGhlIGxpbmUgb2YgdGhlIHNvdXJjZSB0ZW1wbGF0ZQorICAgICMgb24gd2hpY2ggYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQuCisgICAgIworICAgICMgQHBhcmFtIGV4Y2VwdGlvbiBbRXhjZXB0aW9uXSBUaGUgZXhjZXB0aW9uCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBsaW5lIG51bWJlcgorICAgIGRlZiBnZXRfbGluZShleGNlcHRpb24pCisgICAgICAjIFN5bnRheEVycm9ycyBoYXZlIHdlaXJkIGxpbmUgcmVwb3J0aW5nCisgICAgICAjIHdoZW4gdGhlcmUncyB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICBpZiBleGNlcHRpb24uaXNfYT8oOjpTeW50YXhFcnJvcikKKyAgICAgICAgcmV0dXJuIChleGNlcHRpb24ubWVzc2FnZS5zY2FuKC86KFxkKykvKS5maXJzdCB8fCBbIj8/Il0pLmZpcnN0CisgICAgICBlbmQKKyAgICAgIChleGNlcHRpb24uYmFja3RyYWNlWzBdLnNjYW4oLzooXGQrKS8pLmZpcnN0IHx8IFsiPz8iXSkuZmlyc3QKKyAgICBlbmQKKworICAgICMgVGVsbHMgb3B0cGFyc2UgaG93IHRvIHBhcnNlIHRoZSBhcmd1bWVudHMKKyAgICAjIGF2YWlsYWJsZSBmb3IgYWxsIGV4ZWN1dGFibGVzLgorICAgICMKKyAgICAjIFRoaXMgaXMgbWVhbnQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzCisgICAgIyBzbyB0aGV5IGNhbiBhZGQgdGhlaXIgb3duIG9wdGlvbnMuCisgICAgIworICAgICMgQHBhcmFtIG9wdHMgW09wdGlvblBhcnNlcl0KKyAgICBkZWYgc2V0X29wdHMob3B0cykKKyAgICAgIFNhc3M6OlV0aWwuYWJzdHJhY3QodGhpcykKKyAgICBlbmQKKworICAgICMgU2V0IGFuIG9wdGlvbiBmb3Igc3BlY2lmeWluZyBgRW5jb2RpbmcuZGVmYXVsdF9leHRlcm5hbGAuCisgICAgIworICAgICMgQHBhcmFtIG9wdHMgW09wdGlvblBhcnNlcl0KKyAgICBkZWYgZW5jb2Rpbmdfb3B0aW9uKG9wdHMpCisgICAgICBlbmNvZGluZ19kZXNjID0gJ1NwZWNpZnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGlucHV0IGZpbGVzLicKKyAgICAgIG9wdHMub24oJy1FJywgJy0tZGVmYXVsdC1lbmNvZGluZyBFTkNPRElORycsIGVuY29kaW5nX2Rlc2MpIGRvIHxlbmNvZGluZ3wKKyAgICAgICAgRW5jb2RpbmcuZGVmYXVsdF9leHRlcm5hbCA9IGVuY29kaW5nCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUHJvY2Vzc2VzIHRoZSBvcHRpb25zIHNldCBieSB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gSW4gcGFydGljdWxhciwKKyAgICAjIHNldHMgYEBvcHRpb25zWzppbnB1dF1gIGFuZCBgQG9wdGlvbnNbOm91dHB1dF1gIHRvIGFwcHJvcHJpYXRlIElPIHN0cmVhbXMuCisgICAgIworICAgICMgVGhpcyBpcyBtZWFudCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKKyAgICAjIHNvIHRoZXkgY2FuIHJ1biB0aGVpciByZXNwZWN0aXZlIHByb2dyYW1zLgorICAgIGRlZiBwcm9jZXNzX3Jlc3VsdAorICAgICAgaW5wdXQsIG91dHB1dCA9IEBvcHRpb25zWzppbnB1dF0sIEBvcHRpb25zWzpvdXRwdXRdCisgICAgICBhcmdzID0gQGFyZ3MuZHVwCisgICAgICBpbnB1dCB8fD0KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBmaWxlbmFtZSA9IGFyZ3Muc2hpZnQKKyAgICAgICAgICBAb3B0aW9uc1s6ZmlsZW5hbWVdID0gZmlsZW5hbWUKKyAgICAgICAgICBvcGVuX2ZpbGUoZmlsZW5hbWUpIHx8ICRzdGRpbgorICAgICAgICBlbmQKKyAgICAgIEBvcHRpb25zWzpvdXRwdXRfZmlsZW5hbWVdID0gYXJncy5zaGlmdAorICAgICAgb3V0cHV0IHx8PSBAb3B0aW9uc1s6b3V0cHV0X2ZpbGVuYW1lXSB8fCAkc3Rkb3V0CisgICAgICBAb3B0aW9uc1s6aW5wdXRdLCBAb3B0aW9uc1s6b3V0cHV0XSA9IGlucHV0LCBvdXRwdXQKKyAgICBlbmQKKworICAgIENPTE9SUyA9IHs6cmVkID0+IDMxLCA6Z3JlZW4gPT4gMzIsIDp5ZWxsb3cgPT4gMzN9CisKKyAgICAjIFByaW50cyBhIHN0YXR1cyBtZXNzYWdlIGFib3V0IHBlcmZvcm1pbmcgdGhlIGdpdmVuIGFjdGlvbiwKKyAgICAjIGNvbG9yZWQgdXNpbmcgdGhlIGdpdmVuIGNvbG9yICh2aWEgdGVybWluYWwgZXNjYXBlcykgaWYgcG9zc2libGUuCisgICAgIworICAgICMgQHBhcmFtIG5hbWUgWyN0b19zXSBBIHNob3J0IG5hbWUgZm9yIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkLgorICAgICMgICBTaG91bGRuJ3QgYmUgbG9uZ2VyIHRoYW4gMTEgY2hhcmFjdGVycy4KKyAgICAjIEBwYXJhbSBjb2xvciBbU3ltYm9sXSBUaGUgbmFtZSBvZiB0aGUgY29sb3IgdG8gdXNlIGZvciB0aGlzIGFjdGlvbi4KKyAgICAjICAgQ2FuIGJlIGA6cmVkYCwgYDpncmVlbmAsIG9yIGA6eWVsbG93YC4KKyAgICBkZWYgcHV0c19hY3Rpb24obmFtZSwgY29sb3IsIGFyZykKKyAgICAgIHJldHVybiBpZiBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOnF1aWV0XQorICAgICAgcHJpbnRmIGNvbG9yKGNvbG9yLCAiJTExcyAlc1xuIiksIG5hbWUsIGFyZworICAgICAgU1RET1VULmZsdXNoCisgICAgZW5kCisKKyAgICAjIFNhbWUgYXMgYEtlcm5lbC5wdXRzYCwgYnV0IGRvZXNuJ3QgcHJpbnQgYW55dGhpbmcgaWYgdGhlIGAtLXF1aWV0YCBvcHRpb24gaXMgc2V0LgorICAgICMKKyAgICAjIEBwYXJhbSBhcmdzIFtBcnJheV0gUGFzc2VkIG9uIHRvIGBLZXJuZWwucHV0c2AKKyAgICBkZWYgcHV0cygqYXJncykKKyAgICAgIHJldHVybiBpZiBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOnF1aWV0XQorICAgICAgS2VybmVsLnB1dHMoKmFyZ3MpCisgICAgZW5kCisKKyAgICAjIFdyYXBzIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGVybWluYWwgZXNjYXBlcworICAgICMgY2F1c2luZyBpdCB0byBoYXZlIHRoZSBnaXZlbiBjb2xvci4KKyAgICAjIElmIHRlcm1pbmFsIGVzY2FwZXMgYXJlbid0IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLAorICAgICMganVzdCByZXR1cm5zIHRoZSBzdHJpbmcgaW5zdGVhZC4KKyAgICAjCisgICAgIyBAcGFyYW0gY29sb3IgW1N5bWJvbF0gVGhlIG5hbWUgb2YgdGhlIGNvbG9yIHRvIHVzZS4KKyAgICAjICAgQ2FuIGJlIGA6cmVkYCwgYDpncmVlbmAsIG9yIGA6eWVsbG93YC4KKyAgICAjIEBwYXJhbSBzdHIgW1N0cmluZ10gVGhlIHN0cmluZyB0byB3cmFwIGluIHRoZSBnaXZlbiBjb2xvci4KKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHdyYXBwZWQgc3RyaW5nLgorICAgIGRlZiBjb2xvcihjb2xvciwgc3RyKQorICAgICAgcmFpc2UgIltCVUddIFVucmVjb2duaXplZCBjb2xvciAje2NvbG9yfSIgdW5sZXNzIENPTE9SU1tjb2xvcl0KKworICAgICAgIyBBbG1vc3QgYW55IHJlYWwgVW5peCB0ZXJtaW5hbCB3aWxsIHN1cHBvcnQgY29sb3IsCisgICAgICAjIHNvIHdlIGp1c3QgZmlsdGVyIGZvciBXaW5kb3dzIHRlcm1zICh3aGljaCBkb24ndCBzZXQgVEVSTSkKKyAgICAgICMgYW5kIG5vdC1yZWFsIHRlcm1pbmFscywgd2hpY2ggYXJlbid0IHR0eXMuCisgICAgICByZXR1cm4gc3RyIGlmIEVOVlsiVEVSTSJdLm5pbD8gfHwgRU5WWyJURVJNIl0uZW1wdHk/IHx8ICFTVERPVVQudHR5PworICAgICAgIlxlWyN7Q09MT1JTW2NvbG9yXX1tI3tzdHJ9XGVbMG0iCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfb3V0cHV0KHRleHQsIGRlc3RpbmF0aW9uKQorICAgICAgaWYgZGVzdGluYXRpb24uaXNfYT8oU3RyaW5nKQorICAgICAgICBvcGVuX2ZpbGUoZGVzdGluYXRpb24sICd3Jykge3xmaWxlfCBmaWxlLndyaXRlKHRleHQpfQorICAgICAgZWxzZQorICAgICAgICBkZXN0aW5hdGlvbi53cml0ZSh0ZXh0KQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgb3Blbl9maWxlKGZpbGVuYW1lLCBmbGFnID0gJ3InKQorICAgICAgcmV0dXJuIGlmIGZpbGVuYW1lLm5pbD8KKyAgICAgIGZsYWcgPSAnd2InIGlmIEBvcHRpb25zWzp1bml4X25ld2xpbmVzXSAmJiBmbGFnID09ICd3JworICAgICAgZmlsZSA9IEZpbGUub3BlbihmaWxlbmFtZSwgZmxhZykKKyAgICAgIHJldHVybiBmaWxlIHVubGVzcyBibG9ja19naXZlbj8KKyAgICAgIHlpZWxkIGZpbGUKKyAgICAgIGZpbGUuY2xvc2UKKyAgICBlbmQKKworICAgIGRlZiBoYW5kbGVfbG9hZF9lcnJvcihlcnIpCisgICAgICBkZXAgPSBlcnIubWVzc2FnZVsvXm5vIHN1Y2ggZmlsZSB0byBsb2FkIC0tICguKikvLCAxXQorICAgICAgcmFpc2UgZXJyIGlmIEBvcHRpb25zWzp0cmFjZV0gfHwgZGVwLm5pbD8gfHwgZGVwLmVtcHR5PworICAgICAgJHN0ZGVyci5wdXRzIDw8TUVTU0FHRQorUmVxdWlyZWQgZGVwZW5kZW5jeSAje2RlcH0gbm90IGZvdW5kIQorICAgIFJ1biAiZ2VtIGluc3RhbGwgI3tkZXB9IiB0byBnZXQgaXQuCisgIFVzZSAtLXRyYWNlIGZvciBiYWNrdHJhY2UuCitNRVNTQUdFCisgICAgICBleGl0IDEKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZXhlYy9zYXNzX2NvbnZlcnQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2V4ZWMvc2Fzc19jb252ZXJ0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjg5NzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2V4ZWMvc2Fzc19jb252ZXJ0LnJiCkBAIC0wLDAgKzEsMjgzIEBACityZXF1aXJlICdvcHRwYXJzZScKK3JlcXVpcmUgJ2ZpbGV1dGlscycKKworbW9kdWxlIFNhc3M6OkV4ZWMKKyAgIyBUaGUgYHNhc3MtY29udmVydGAgZXhlY3V0YWJsZS4KKyAgY2xhc3MgU2Fzc0NvbnZlcnQgPCBCYXNlCisgICAgIyBAcGFyYW0gYXJncyBbQXJyYXk8U3RyaW5nPl0gVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKKyAgICBkZWYgaW5pdGlhbGl6ZShhcmdzKQorICAgICAgc3VwZXIKKyAgICAgIHJlcXVpcmUgJ3Nhc3MnCisgICAgICBAb3B0aW9uc1s6Zm9yX3RyZWVdID0ge30KKyAgICAgIEBvcHRpb25zWzpmb3JfZW5naW5lXSA9IHs6Y2FjaGUgPT4gZmFsc2UsIDpyZWFkX2NhY2hlID0+IHRydWV9CisgICAgZW5kCisKKyAgICAjIFRlbGxzIG9wdHBhcnNlIGhvdyB0byBwYXJzZSB0aGUgYXJndW1lbnRzLgorICAgICMKKyAgICAjIEBwYXJhbSBvcHRzIFtPcHRpb25QYXJzZXJdCisgICAgZGVmIHNldF9vcHRzKG9wdHMpCisgICAgICBvcHRzLmJhbm5lciA9IDw8RU5ECitVc2FnZTogc2Fzcy1jb252ZXJ0IFtvcHRpb25zXSBbSU5QVVRdIFtPVVRQVVRdCisKK0Rlc2NyaXB0aW9uOgorICBDb252ZXJ0cyBiZXR3ZWVuIENTUywgaW5kZW50ZWQgc3ludGF4LCBhbmQgU0NTUyBmaWxlcy4gRm9yIGV4YW1wbGUsCisgIHRoaXMgY2FuIGNvbnZlcnQgZnJvbSB0aGUgaW5kZW50ZWQgc3ludGF4IHRvIFNDU1MsIG9yIGZyb20gQ1NTIHRvCisgIFNDU1MgKGFkZGluZyBhcHByb3ByaWF0ZSBuZXN0aW5nKS4KK0VORAorCisgICAgICBjb21tb25fb3B0aW9ucyhvcHRzKQorICAgICAgc3R5bGUob3B0cykKKyAgICAgIGlucHV0X2FuZF9vdXRwdXQob3B0cykKKyAgICAgIG1pc2NlbGxhbmVvdXMob3B0cykKKyAgICBlbmQKKworICAgICMgUHJvY2Vzc2VzIHRoZSBvcHRpb25zIHNldCBieSB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cywKKyAgICAjIGFuZCBydW5zIHRoZSBDU1MgY29tcGlsZXIgYXBwcm9wcmlhdGVseS4KKyAgICBkZWYgcHJvY2Vzc19yZXN1bHQKKyAgICAgIHJlcXVpcmUgJ3Nhc3MnCisKKyAgICAgIGlmIEBvcHRpb25zWzpyZWN1cnNpdmVdCisgICAgICAgIHByb2Nlc3NfZGlyZWN0b3J5CisgICAgICAgIHJldHVybgorICAgICAgZW5kCisKKyAgICAgIHN1cGVyCisgICAgICBpbnB1dCA9IEBvcHRpb25zWzppbnB1dF0KKyAgICAgIGlmIEZpbGUuZGlyZWN0b3J5PyhpbnB1dCkKKyAgICAgICAgcmFpc2UgIkVycm9yOiAnI3tpbnB1dC5wYXRofScgaXMgYSBkaXJlY3RvcnkgKGRpZCB5b3UgbWVhbiB0byB1c2UgLS1yZWN1cnNpdmU/KSIKKyAgICAgIGVuZAorICAgICAgb3V0cHV0ID0gQG9wdGlvbnNbOm91dHB1dF0KKyAgICAgIG91dHB1dCA9IGlucHV0IGlmIEBvcHRpb25zWzppbl9wbGFjZV0KKyAgICAgIHByb2Nlc3NfZmlsZShpbnB1dCwgb3V0cHV0KQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIGNvbW1vbl9vcHRpb25zKG9wdHMpCisgICAgICBvcHRzLnNlcGFyYXRvciAnJworICAgICAgb3B0cy5zZXBhcmF0b3IgJ0NvbW1vbiBPcHRpb25zOicKKworICAgICAgb3B0cy5vbignLUYnLCAnLS1mcm9tIEZPUk1BVCcsCisgICAgICAgICdUaGUgZm9ybWF0IHRvIGNvbnZlcnQgZnJvbS4gQ2FuIGJlIGNzcywgc2Nzcywgc2Fzcy4nLAorICAgICAgICAnQnkgZGVmYXVsdCwgdGhpcyBpcyBpbmZlcnJlZCBmcm9tIHRoZSBpbnB1dCBmaWxlbmFtZS4nLAorICAgICAgICAnSWYgdGhlcmUgaXMgbm9uZSwgZGVmYXVsdHMgdG8gY3NzLicpIGRvIHxuYW1lfAorICAgICAgICBAb3B0aW9uc1s6ZnJvbV0gPSBuYW1lLmRvd25jYXNlLnRvX3N5bQorICAgICAgICByYWlzZSAic2Fzcy1jb252ZXJ0IG5vIGxvbmdlciBzdXBwb3J0cyBMZXNzQ1NTLiIgaWYgQG9wdGlvbnNbOmZyb21dID09IDpsZXNzCisgICAgICAgIHVubGVzcyBbOmNzcywgOnNjc3MsIDpzYXNzXS5pbmNsdWRlPyhAb3B0aW9uc1s6ZnJvbV0pCisgICAgICAgICAgcmFpc2UgIlVua25vd24gZm9ybWF0IGZvciBzYXNzLWNvbnZlcnQgLS1mcm9tOiAje25hbWV9IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCctVCcsICctLXRvIEZPUk1BVCcsCisgICAgICAgICdUaGUgZm9ybWF0IHRvIGNvbnZlcnQgdG8uIENhbiBiZSBzY3NzIG9yIHNhc3MuJywKKyAgICAgICAgJ0J5IGRlZmF1bHQsIHRoaXMgaXMgaW5mZXJyZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGVuYW1lLicsCisgICAgICAgICdJZiB0aGVyZSBpcyBub25lLCBkZWZhdWx0cyB0byBzYXNzLicpIGRvIHxuYW1lfAorICAgICAgICBAb3B0aW9uc1s6dG9dID0gbmFtZS5kb3duY2FzZS50b19zeW0KKyAgICAgICAgdW5sZXNzIFs6c2NzcywgOnNhc3NdLmluY2x1ZGU/KEBvcHRpb25zWzp0b10pCisgICAgICAgICAgcmFpc2UgIlVua25vd24gZm9ybWF0IGZvciBzYXNzLWNvbnZlcnQgLS10bzogI3tuYW1lfSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgb3B0cy5vbignLWknLCAnLS1pbi1wbGFjZScsCisgICAgICAgICdDb252ZXJ0IGEgZmlsZSB0byBpdHMgb3duIHN5bnRheC4nLAorICAgICAgICAnVGhpcyBjYW4gYmUgdXNlZCB0byB1cGRhdGUgc29tZSBkZXByZWNhdGVkIHN5bnRheC4nKSBkbworICAgICAgICBAb3B0aW9uc1s6aW5fcGxhY2VdID0gdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy1SJywgJy0tcmVjdXJzaXZlJywKKyAgICAgICAgICAnQ29udmVydCBhbGwgdGhlIGZpbGVzIGluIGEgZGlyZWN0b3J5LiBSZXF1aXJlcyAtLWZyb20gYW5kIC0tdG8uJykgZG8KKyAgICAgICAgQG9wdGlvbnNbOnJlY3Vyc2l2ZV0gPSB0cnVlCisgICAgICBlbmQKKworICAgICAgb3B0cy5vbigiLT8iLCAiLWgiLCAiLS1oZWxwIiwgIlNob3cgdGhpcyBoZWxwIG1lc3NhZ2UuIikgZG8KKyAgICAgICAgcHV0cyBvcHRzCisgICAgICAgIGV4aXQKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCItdiIsICItLXZlcnNpb24iLCAiUHJpbnQgdGhlIFNhc3MgdmVyc2lvbi4iKSBkbworICAgICAgICBwdXRzKCJTYXNzICN7U2Fzcy52ZXJzaW9uWzpzdHJpbmddfSIpCisgICAgICAgIGV4aXQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHN0eWxlKG9wdHMpCisgICAgICBvcHRzLnNlcGFyYXRvciAnJworICAgICAgb3B0cy5zZXBhcmF0b3IgJ1N0eWxlOicKKworICAgICAgb3B0cy5vbignLS1kYXNoZXJpemUnLCAnQ29udmVydCB1bmRlcnNjb3JlcyB0byBkYXNoZXMuJykgZG8KKyAgICAgICAgQG9wdGlvbnNbOmZvcl90cmVlXVs6ZGFzaGVyaXplXSA9IHRydWUKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKAorICAgICAgICAnLS1pbmRlbnQgTlVNJywKKyAgICAgICAgJ0hvdyBtYW55IHNwYWNlcyB0byB1c2UgZm9yIGVhY2ggbGV2ZWwgb2YgaW5kZW50YXRpb24uIERlZmF1bHRzIHRvIDIuJywKKyAgICAgICAgJyJ0IiBtZWFucyB1c2UgaGFyZCB0YWJzLicKKyAgICAgICkgZG8gfGluZGVudHwKKyAgICAgICAgaWYgaW5kZW50ID09ICd0JworICAgICAgICAgIEBvcHRpb25zWzpmb3JfdHJlZV1bOmluZGVudF0gPSAiXHQiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAb3B0aW9uc1s6Zm9yX3RyZWVdWzppbmRlbnRdID0gIiAiICogaW5kZW50LnRvX2kKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgb3B0cy5vbignLS1vbGQnLCAnT3V0cHV0IHRoZSBvbGQtc3R5bGUgIjpwcm9wIHZhbCIgcHJvcGVydHkgc3ludGF4LicsCisgICAgICAgICAgICAgICAgICAgICAgICdPbmx5IG1lYW5pbmdmdWwgd2hlbiBnZW5lcmF0aW5nIFNhc3MuJykgZG8KKyAgICAgICAgQG9wdGlvbnNbOmZvcl90cmVlXVs6b2xkXSA9IHRydWUKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGlucHV0X2FuZF9vdXRwdXQob3B0cykKKyAgICAgIG9wdHMuc2VwYXJhdG9yICcnCisgICAgICBvcHRzLnNlcGFyYXRvciAnSW5wdXQgYW5kIE91dHB1dDonCisKKyAgICAgIG9wdHMub24oJy1zJywgJy0tc3RkaW4nLCA6Tk9ORSwKKyAgICAgICAgICAgICAgJ1JlYWQgaW5wdXQgZnJvbSBzdGFuZGFyZCBpbnB1dCBpbnN0ZWFkIG9mIGFuIGlucHV0IGZpbGUuJywKKyAgICAgICAgICAgICAgJ1RoaXMgaXMgdGhlIGRlZmF1bHQgaWYgbm8gaW5wdXQgZmlsZSBpcyBzcGVjaWZpZWQuIFJlcXVpcmVzIC0tZnJvbS4nKSBkbworICAgICAgICBAb3B0aW9uc1s6aW5wdXRdID0gJHN0ZGluCisgICAgICBlbmQKKworICAgICAgZW5jb2Rpbmdfb3B0aW9uKG9wdHMpCisKKyAgICAgIG9wdHMub24oJy0tdW5peC1uZXdsaW5lcycsICdVc2UgVW5peC1zdHlsZSBuZXdsaW5lcyBpbiB3cml0dGVuIGZpbGVzLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0Fsd2F5cyB0cnVlIG9uIFVuaXguJyB1bmxlc3MgU2Fzczo6VXRpbC53aW5kb3dzPykpIGRvCisgICAgICAgIEBvcHRpb25zWzp1bml4X25ld2xpbmVzXSA9IHRydWUgaWYgU2Fzczo6VXRpbC53aW5kb3dzPworICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgbWlzY2VsbGFuZW91cyhvcHRzKQorICAgICAgb3B0cy5zZXBhcmF0b3IgJycKKyAgICAgIG9wdHMuc2VwYXJhdG9yICdNaXNjZWxsYW5lb3VzOicKKworICAgICAgICBvcHRzLm9uKCctLWNhY2hlLWxvY2F0aW9uIFBBVEgnLAorICAgICAgICAgICAgICAgICdUaGUgcGF0aCB0byBzYXZlIHBhcnNlZCBTYXNzIGZpbGVzLiBEZWZhdWx0cyB0byAuc2Fzcy1jYWNoZS4nKSBkbyB8bG9jfAorICAgICAgICAgIEBvcHRpb25zWzpmb3JfZW5naW5lXVs6Y2FjaGVfbG9jYXRpb25dID0gbG9jCisgICAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCctQycsICctLW5vLWNhY2hlJywgIkRvbid0IGNhY2hlIHRvIHNhc3NjIGZpbGVzLiIpIGRvCisgICAgICAgIEBvcHRpb25zWzpmb3JfZW5naW5lXVs6cmVhZF9jYWNoZV0gPSBmYWxzZQorICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy1xJywgJy0tcXVpZXQnLCAnU2lsZW5jZSB3YXJuaW5ncyBhbmQgc3RhdHVzIG1lc3NhZ2VzIGR1cmluZyBjb252ZXJzaW9uLicpIGRvIHxib29sfAorICAgICAgICBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOnF1aWV0XSA9IGJvb2wKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCctLXRyYWNlJywgOk5PTkUsICdTaG93IGEgZnVsbCBSdWJ5IHN0YWNrIHRyYWNlIG9uIGVycm9yJykgZG8KKyAgICAgICAgQG9wdGlvbnNbOnRyYWNlXSA9IHRydWUKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHByb2Nlc3NfZGlyZWN0b3J5CisgICAgICBAb3B0aW9uc1s6aW5wdXRdID0gQGFyZ3Muc2hpZnQKKyAgICAgIHVubGVzcyBAb3B0aW9uc1s6aW5wdXRdCisgICAgICAgIHJhaXNlICJFcnJvcjogZGlyZWN0b3J5IHJlcXVpcmVkIHdoZW4gdXNpbmcgLS1yZWN1cnNpdmUuIgorICAgICAgZW5kCisKKyAgICAgIG91dHB1dCA9IEBvcHRpb25zWzpvdXRwdXRdID0gQGFyZ3Muc2hpZnQKKyAgICAgIHJhaXNlICJFcnJvcjogLS1mcm9tIHJlcXVpcmVkIHdoZW4gdXNpbmcgLS1yZWN1cnNpdmUuIiB1bmxlc3MgQG9wdGlvbnNbOmZyb21dCisgICAgICByYWlzZSAiRXJyb3I6IC0tdG8gcmVxdWlyZWQgd2hlbiB1c2luZyAtLXJlY3Vyc2l2ZS4iIHVubGVzcyBAb3B0aW9uc1s6dG9dCisgICAgICB1bmxlc3MgRmlsZS5kaXJlY3Rvcnk/KEBvcHRpb25zWzppbnB1dF0pCisgICAgICAgIHJhaXNlICJFcnJvcjogJyN7QG9wdGlvbnNbOmlucHV0XX0nIGlzIG5vdCBhIGRpcmVjdG9yeSIKKyAgICAgIGVuZAorICAgICAgaWYgQG9wdGlvbnNbOm91dHB1dF0gJiYgRmlsZS5leGlzdD8oQG9wdGlvbnNbOm91dHB1dF0pICYmCisgICAgICAgICFGaWxlLmRpcmVjdG9yeT8oQG9wdGlvbnNbOm91dHB1dF0pCisgICAgICAgIHJhaXNlICJFcnJvcjogJyN7QG9wdGlvbnNbOm91dHB1dF19JyBpcyBub3QgYSBkaXJlY3RvcnkiCisgICAgICBlbmQKKyAgICAgIEBvcHRpb25zWzpvdXRwdXRdIHx8PSBAb3B0aW9uc1s6aW5wdXRdCisKKyAgICAgIGlmIEBvcHRpb25zWzp0b10gPT0gQG9wdGlvbnNbOmZyb21dICYmICFAb3B0aW9uc1s6aW5fcGxhY2VdCisgICAgICAgIGZtdCA9IEBvcHRpb25zWzpmcm9tXQorICAgICAgICByYWlzZSAiRXJyb3I6IGNvbnZlcnRpbmcgZnJvbSAje2ZtdH0gdG8gI3tmbXR9IHdpdGhvdXQgLS1pbi1wbGFjZSIKKyAgICAgIGVuZAorCisgICAgICBleHQgPSBAb3B0aW9uc1s6ZnJvbV0KKyAgICAgIFNhc3M6OlV0aWwuZ2xvYigiI3tAb3B0aW9uc1s6aW5wdXRdfS8qKi8qLiN7ZXh0fSIpIGRvIHxmfAorICAgICAgICBvdXRwdXQgPQorICAgICAgICAgIGlmIEBvcHRpb25zWzppbl9wbGFjZV0KKyAgICAgICAgICAgIGYKKyAgICAgICAgICBlbHNpZiBAb3B0aW9uc1s6b3V0cHV0XQorICAgICAgICAgICAgb3V0cHV0X25hbWUgPSBmLmdzdWIoL1wuKGN8c2F8c2N8bGUpc3MkLywgIi4je0BvcHRpb25zWzp0b119IikKKyAgICAgICAgICAgIG91dHB1dF9uYW1lWzAuLi5Ab3B0aW9uc1s6aW5wdXRdLnNpemVdID0gQG9wdGlvbnNbOm91dHB1dF0KKyAgICAgICAgICAgIG91dHB1dF9uYW1lCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZi5nc3ViKC9cLihjfHNhfHNjfGxlKXNzJC8sICIuI3tAb3B0aW9uc1s6dG9dfSIpCisgICAgICAgICAgZW5kCisKKyAgICAgICAgdW5sZXNzIEZpbGUuZGlyZWN0b3J5PyhGaWxlLmRpcm5hbWUob3V0cHV0KSkKKyAgICAgICAgICBwdXRzX2FjdGlvbiA6ZGlyZWN0b3J5LCA6Z3JlZW4sIEZpbGUuZGlybmFtZShvdXRwdXQpCisgICAgICAgICAgRmlsZVV0aWxzLm1rZGlyX3AoRmlsZS5kaXJuYW1lKG91dHB1dCkpCisgICAgICAgIGVuZAorICAgICAgICBwdXRzX2FjdGlvbiA6Y29udmVydCwgOmdyZWVuLCBmCisgICAgICAgIGlmIEZpbGUuZXhpc3Q/KG91dHB1dCkKKyAgICAgICAgICBwdXRzX2FjdGlvbiA6b3ZlcndyaXRlLCA6eWVsbG93LCBvdXRwdXQKKyAgICAgICAgZWxzZQorICAgICAgICAgIHB1dHNfYWN0aW9uIDpjcmVhdGUsIDpncmVlbiwgb3V0cHV0CisgICAgICAgIGVuZAorCisgICAgICAgIHByb2Nlc3NfZmlsZShmLCBvdXRwdXQpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBwcm9jZXNzX2ZpbGUoaW5wdXQsIG91dHB1dCkKKyAgICAgIGlucHV0X3BhdGgsIG91dHB1dF9wYXRoID0gcGF0aF9mb3IoaW5wdXQpLCBwYXRoX2ZvcihvdXRwdXQpCisgICAgICBpZiBpbnB1dF9wYXRoCisgICAgICAgIEBvcHRpb25zWzpmcm9tXSB8fD0KKyAgICAgICAgICBjYXNlIGlucHV0X3BhdGgKKyAgICAgICAgICB3aGVuIC9cLnNjc3MkLzsgOnNjc3MKKyAgICAgICAgICB3aGVuIC9cLnNhc3MkLzsgOnNhc3MKKyAgICAgICAgICB3aGVuIC9cLmxlc3MkLzsgcmFpc2UgInNhc3MtY29udmVydCBubyBsb25nZXIgc3VwcG9ydHMgTGVzc0NTUy4iCisgICAgICAgICAgd2hlbiAvXC5jc3MkLzsgOmNzcworICAgICAgICAgIGVuZAorICAgICAgZWxzaWYgQG9wdGlvbnNbOmluX3BsYWNlXQorICAgICAgICByYWlzZSAiRXJyb3I6IHRoZSAtLWluLXBsYWNlIG9wdGlvbiByZXF1aXJlcyBhIGZpbGVuYW1lLiIKKyAgICAgIGVuZAorCisgICAgICBpZiBvdXRwdXRfcGF0aAorICAgICAgICBAb3B0aW9uc1s6dG9dIHx8PQorICAgICAgICAgIGNhc2Ugb3V0cHV0X3BhdGgKKyAgICAgICAgICB3aGVuIC9cLnNjc3MkLzsgOnNjc3MKKyAgICAgICAgICB3aGVuIC9cLnNhc3MkLzsgOnNhc3MKKyAgICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBAb3B0aW9uc1s6ZnJvbV0gfHw9IDpjc3MKKyAgICAgIEBvcHRpb25zWzp0b10gfHw9IDpzYXNzCisgICAgICBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOnN5bnRheF0gPSBAb3B0aW9uc1s6ZnJvbV0KKworICAgICAgb3V0ID0KKyAgICAgICAgU2Fzczo6VXRpbC5zaWxlbmNlX3Nhc3Nfd2FybmluZ3MgZG8KKyAgICAgICAgICBpZiBAb3B0aW9uc1s6ZnJvbV0gPT0gOmNzcworICAgICAgICAgICAgcmVxdWlyZSAnc2Fzcy9jc3MnCisgICAgICAgICAgICBTYXNzOjpDU1MubmV3KHJlYWQoaW5wdXQpLCBAb3B0aW9uc1s6Zm9yX3RyZWVdKS5yZW5kZXIoQG9wdGlvbnNbOnRvXSkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiBpbnB1dF9wYXRoCisgICAgICAgICAgICAgIFNhc3M6OkVuZ2luZS5mb3JfZmlsZShpbnB1dF9wYXRoLCBAb3B0aW9uc1s6Zm9yX2VuZ2luZV0pCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIFNhc3M6OkVuZ2luZS5uZXcocmVhZChpbnB1dCksIEBvcHRpb25zWzpmb3JfZW5naW5lXSkKKyAgICAgICAgICAgIGVuZC50b190cmVlLnNlbmQoInRvXyN7QG9wdGlvbnNbOnRvXX0iLCBAb3B0aW9uc1s6Zm9yX3RyZWVdKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgb3V0cHV0ID0gaW5wdXRfcGF0aCBpZiBAb3B0aW9uc1s6aW5fcGxhY2VdCisgICAgICB3cml0ZV9vdXRwdXQob3V0LCBvdXRwdXQpCisgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICAgIHJhaXNlIGUgaWYgQG9wdGlvbnNbOnRyYWNlXQorICAgICAgZmlsZSA9ICIgb2YgI3tlLnNhc3NfZmlsZW5hbWV9IiBpZiBlLnNhc3NfZmlsZW5hbWUKKyAgICAgIHJhaXNlICJFcnJvciBvbiBsaW5lICN7ZS5zYXNzX2xpbmV9I3tmaWxlfTogI3tlLm1lc3NhZ2V9XG4gIFVzZSAtLXRyYWNlIGZvciBiYWNrdHJhY2UiCisgICAgcmVzY3VlIExvYWRFcnJvciA9PiBlcnIKKyAgICAgIGhhbmRsZV9sb2FkX2Vycm9yKGVycikKKyAgICBlbmQKKworICAgIGRlZiBwYXRoX2ZvcihmaWxlKQorICAgICAgcmV0dXJuIGZpbGUucGF0aCBpZiBmaWxlLmlzX2E/KEZpbGUpCisgICAgICByZXR1cm4gZmlsZSBpZiBmaWxlLmlzX2E/KFN0cmluZykKKyAgICBlbmQKKworICAgIGRlZiByZWFkKGZpbGUpCisgICAgICBpZiBmaWxlLnJlc3BvbmRfdG8/KDpyZWFkKQorICAgICAgICBmaWxlLnJlYWQKKyAgICAgIGVsc2UKKyAgICAgICAgb3BlbihmaWxlLCAncmInKSB7fGZ8IGYucmVhZH0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9leGVjL3Nhc3Nfc2Nzcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZXhlYy9zYXNzX3Njc3MucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwYmIxMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvZXhlYy9zYXNzX3Njc3MucmIKQEAgLTAsMCArMSw0NDAgQEAKK21vZHVsZSBTYXNzOjpFeGVjCisgICMgVGhlIGBzYXNzYCBhbmQgYHNjc3NgIGV4ZWN1dGFibGVzLgorICBjbGFzcyBTYXNzU2NzcyA8IEJhc2UKKyAgICBhdHRyX3JlYWRlciA6ZGVmYXVsdF9zeW50YXgKKworICAgICMgQHBhcmFtIGFyZ3MgW0FycmF5PFN0cmluZz5dIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzCisgICAgZGVmIGluaXRpYWxpemUoYXJncywgZGVmYXVsdF9zeW50YXgpCisgICAgICBzdXBlcihhcmdzKQorICAgICAgQG9wdGlvbnNbOnNvdXJjZW1hcF0gPSA6YXV0bworICAgICAgQG9wdGlvbnNbOmZvcl9lbmdpbmVdID0geworICAgICAgICA6bG9hZF9wYXRocyA9PiBkZWZhdWx0X3Nhc3NfcGF0aAorICAgICAgfQorICAgICAgQGRlZmF1bHRfc3ludGF4ID0gZGVmYXVsdF9zeW50YXgKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgIyBUZWxscyBvcHRwYXJzZSBob3cgdG8gcGFyc2UgdGhlIGFyZ3VtZW50cy4KKyAgICAjCisgICAgIyBAcGFyYW0gb3B0cyBbT3B0aW9uUGFyc2VyXQorICAgIGRlZiBzZXRfb3B0cyhvcHRzKQorICAgICAgb3B0cy5iYW5uZXIgPSA8PEVORAorVXNhZ2U6ICN7ZGVmYXVsdF9zeW50YXh9IFtvcHRpb25zXSBbSU5QVVRdIFtPVVRQVVRdCisKK0Rlc2NyaXB0aW9uOgorICBDb252ZXJ0cyBTQ1NTIG9yIFNhc3MgZmlsZXMgdG8gQ1NTLgorRU5ECisKKyAgICAgIGNvbW1vbl9vcHRpb25zKG9wdHMpCisgICAgICB3YXRjaGluZ19hbmRfdXBkYXRpbmcob3B0cykKKyAgICAgIGlucHV0X2FuZF9vdXRwdXQob3B0cykKKyAgICAgIG1pc2NlbGxhbmVvdXMob3B0cykKKyAgICBlbmQKKworICAgICMgUHJvY2Vzc2VzIHRoZSBvcHRpb25zIHNldCBieSB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cywKKyAgICAjIGFuZCBydW5zIHRoZSBTYXNzIGNvbXBpbGVyIGFwcHJvcHJpYXRlbHkuCisgICAgZGVmIHByb2Nlc3NfcmVzdWx0CisgICAgICByZXF1aXJlICdzYXNzJworCisgICAgICBpZiAhQG9wdGlvbnNbOnVwZGF0ZV0gJiYgIUBvcHRpb25zWzp3YXRjaF0gJiYKKyAgICAgICAgICBAYXJncy5maXJzdCAmJiBjb2xvbl9wYXRoPyhAYXJncy5maXJzdCkKKyAgICAgICAgaWYgQGFyZ3Muc2l6ZSA9PSAxCisgICAgICAgICAgQGFyZ3MgPSBzcGxpdF9jb2xvbl9wYXRoKEBhcmdzLmZpcnN0KQorICAgICAgICBlbHNlCisgICAgICAgICAgQGZha2VfdXBkYXRlID0gdHJ1ZQorICAgICAgICAgIEBvcHRpb25zWzp1cGRhdGVdID0gdHJ1ZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgbG9hZF9jb21wYXNzIGlmIEBvcHRpb25zWzpjb21wYXNzXQorICAgICAgcmV0dXJuIGludGVyYWN0aXZlIGlmIEBvcHRpb25zWzppbnRlcmFjdGl2ZV0KKyAgICAgIHJldHVybiB3YXRjaF9vcl91cGRhdGUgaWYgQG9wdGlvbnNbOndhdGNoXSB8fCBAb3B0aW9uc1s6dXBkYXRlXQorICAgICAgc3VwZXIKKworICAgICAgaWYgQG9wdGlvbnNbOnNvdXJjZW1hcF0gIT0gOm5vbmUgJiYgQG9wdGlvbnNbOm91dHB1dF9maWxlbmFtZV0KKyAgICAgICAgQG9wdGlvbnNbOnNvdXJjZW1hcF9maWxlbmFtZV0gPSBTYXNzOjpVdGlsLnNvdXJjZW1hcF9uYW1lKEBvcHRpb25zWzpvdXRwdXRfZmlsZW5hbWVdKQorICAgICAgZW5kCisKKyAgICAgIEBvcHRpb25zWzpmb3JfZW5naW5lXVs6ZmlsZW5hbWVdID0gQG9wdGlvbnNbOmZpbGVuYW1lXQorICAgICAgQG9wdGlvbnNbOmZvcl9lbmdpbmVdWzpjc3NfZmlsZW5hbWVdID0gQG9wdGlvbnNbOm91dHB1dF0gaWYgQG9wdGlvbnNbOm91dHB1dF0uaXNfYT8oU3RyaW5nKQorICAgICAgQG9wdGlvbnNbOmZvcl9lbmdpbmVdWzpzb3VyY2VtYXBfZmlsZW5hbWVdID0gQG9wdGlvbnNbOnNvdXJjZW1hcF9maWxlbmFtZV0KKyAgICAgIEBvcHRpb25zWzpmb3JfZW5naW5lXVs6c291cmNlbWFwXSA9IEBvcHRpb25zWzpzb3VyY2VtYXBdCisKKyAgICAgIHJ1bgorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIGNvbW1vbl9vcHRpb25zKG9wdHMpCisgICAgICBvcHRzLnNlcGFyYXRvciAnJworICAgICAgb3B0cy5zZXBhcmF0b3IgJ0NvbW1vbiBPcHRpb25zOicKKworICAgICAgb3B0cy5vbignLUknLCAnLS1sb2FkLXBhdGggUEFUSCcsICdTcGVjaWZ5IGEgU2FzcyBpbXBvcnQgcGF0aC4nKSBkbyB8cGF0aHwKKyAgICAgICAgKEBvcHRpb25zWzpmb3JfZW5naW5lXVs6bG9hZF9wYXRoc10gfHw9IFtdKSA8PCBwYXRoCisgICAgICBlbmQKKworICAgICAgb3B0cy5vbignLXInLCAnLS1yZXF1aXJlIExJQicsICdSZXF1aXJlIGEgUnVieSBsaWJyYXJ5IGJlZm9yZSBydW5uaW5nIFNhc3MuJykgZG8gfGxpYnwKKyAgICAgICAgcmVxdWlyZSBsaWIKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCctLWNvbXBhc3MnLCAnTWFrZSBDb21wYXNzIGltcG9ydHMgYXZhaWxhYmxlIGFuZCBsb2FkIHByb2plY3QgY29uZmlndXJhdGlvbi4nKSBkbworICAgICAgICBAb3B0aW9uc1s6Y29tcGFzc10gPSB0cnVlCisgICAgICBlbmQKKworICAgICAgb3B0cy5vbignLXQnLCAnLS1zdHlsZSBOQU1FJywgJ091dHB1dCBzdHlsZS4gQ2FuIGJlIG5lc3RlZCAoZGVmYXVsdCksIGNvbXBhY3QsICcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXByZXNzZWQsIG9yIGV4cGFuZGVkLicpIGRvIHxuYW1lfAorICAgICAgICBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOnN0eWxlXSA9IG5hbWUudG9fc3ltCisgICAgICBlbmQKKworICAgICAgb3B0cy5vbigiLT8iLCAiLWgiLCAiLS1oZWxwIiwgIlNob3cgdGhpcyBoZWxwIG1lc3NhZ2UuIikgZG8KKyAgICAgICAgcHV0cyBvcHRzCisgICAgICAgIGV4aXQKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCItdiIsICItLXZlcnNpb24iLCAiUHJpbnQgdGhlIFNhc3MgdmVyc2lvbi4iKSBkbworICAgICAgICBwdXRzKCJTYXNzICN7U2Fzcy52ZXJzaW9uWzpzdHJpbmddfSIpCisgICAgICAgIGV4aXQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHdhdGNoaW5nX2FuZF91cGRhdGluZyhvcHRzKQorICAgICAgb3B0cy5zZXBhcmF0b3IgJycKKyAgICAgIG9wdHMuc2VwYXJhdG9yICdXYXRjaGluZyBhbmQgVXBkYXRpbmc6JworCisgICAgICBvcHRzLm9uKCctLXdhdGNoJywgJ1dhdGNoIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGZvciBjaGFuZ2VzLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBsb2NhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIENTUyBjYW4gYmUgc2V0IHVzaW5nIGEgY29sb246JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAje0BkZWZhdWx0X3N5bnRheH0gLS13YXRjaCBpbnB1dC4je0BkZWZhdWx0X3N5bnRheH06b3V0cHV0LmNzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgI3tAZGVmYXVsdF9zeW50YXh9IC0td2F0Y2ggaW5wdXQtZGlyOm91dHB1dC1kaXIiKSBkbworICAgICAgICBAb3B0aW9uc1s6d2F0Y2hdID0gdHJ1ZQorICAgICAgZW5kCisKKyAgICAgICMgUG9sbGluZyBpcyB1c2VkIGJ5IGRlZmF1bHQgb24gV2luZG93cy4KKyAgICAgIHVubGVzcyBTYXNzOjpVdGlsLndpbmRvd3M/CisgICAgICAgIG9wdHMub24oJy0tcG9sbCcsICdDaGVjayBmb3IgZmlsZSBjaGFuZ2VzIG1hbnVhbGx5LCByYXRoZXIgdGhhbiByZWx5aW5nIG9uIHRoZSBPUy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnT25seSBtZWFuaW5nZnVsIGZvciAtLXdhdGNoLicpIGRvCisgICAgICAgICAgQG9wdGlvbnNbOnBvbGxdID0gdHJ1ZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCctLXVwZGF0ZScsICdDb21waWxlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRvIENTUy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnTG9jYXRpb25zIGFyZSBzZXQgbGlrZSAtLXdhdGNoLicpIGRvCisgICAgICAgIEBvcHRpb25zWzp1cGRhdGVdID0gdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy1mJywgJy0tZm9yY2UnLCAnUmVjb21waWxlIGV2ZXJ5IFNhc3MgZmlsZSwgZXZlbiBpZiB0aGUgQ1NTIGZpbGUgaXMgbmV3ZXIuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT25seSBtZWFuaW5nZnVsIGZvciAtLXVwZGF0ZS4nKSBkbworICAgICAgICBAb3B0aW9uc1s6Zm9yY2VdID0gdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy0tc3RvcC1vbi1lcnJvcicsICdJZiBhIGZpbGUgZmFpbHMgdG8gY29tcGlsZSwgZXhpdCBpbW1lZGlhdGVseS4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09ubHkgbWVhbmluZ2Z1bCBmb3IgLS13YXRjaCBhbmQgLS11cGRhdGUuJykgZG8KKyAgICAgICAgQG9wdGlvbnNbOnN0b3Bfb25fZXJyb3JdID0gdHJ1ZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgaW5wdXRfYW5kX291dHB1dChvcHRzKQorICAgICAgb3B0cy5zZXBhcmF0b3IgJycKKyAgICAgIG9wdHMuc2VwYXJhdG9yICdJbnB1dCBhbmQgT3V0cHV0OicKKworICAgICAgaWYgQGRlZmF1bHRfc3ludGF4ID09IDpzYXNzCisgICAgICAgIG9wdHMub24oJy0tc2NzcycsCisgICAgICAgICAgICAgICAgJ1VzZSB0aGUgQ1NTLXN1cGVyc2V0IFNDU1Mgc3ludGF4LicpIGRvCisgICAgICAgICAgQG9wdGlvbnNbOmZvcl9lbmdpbmVdWzpzeW50YXhdID0gOnNjc3MKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIG9wdHMub24oJy0tc2FzcycsCisgICAgICAgICAgICAgICAgJ1VzZSB0aGUgaW5kZW50ZWQgU2FzcyBzeW50YXguJykgZG8KKyAgICAgICAgICBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOnN5bnRheF0gPSA6c2FzcworICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFRoaXMgaXMgb3B0aW9uYWwgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggU2FzcyAzLjMsIHdoaWNoIGRpZG4ndAorICAgICAgIyBlbmFibGUgc291cmNlbWFwcyBieSBkZWZhdWx0IGFuZCBpbnN0ZWFkIHVzZWQgIi0tc291cmNlbWFwIiB0byBkbyBzby4KKyAgICAgIG9wdHMub24oOk9QVElPTkFMLCAnLS1zb3VyY2VtYXA9VFlQRScsCisgICAgICAgICAgJ0hvdyB0byBsaW5rIGdlbmVyYXRlZCBvdXRwdXQgdG8gdGhlIHNvdXJjZSBmaWxlcy4nLAorICAgICAgICAgICcgIGF1dG8gKGRlZmF1bHQpOiByZWxhdGl2ZSBwYXRocyB3aGVyZSBwb3NzaWJsZSwgZmlsZSBVUklzIGVsc2V3aGVyZScsCisgICAgICAgICAgJyAgZmlsZTogYWx3YXlzIGFic29sdXRlIGZpbGUgVVJJcycsCisgICAgICAgICAgJyAgaW5saW5lOiBpbmNsdWRlIHRoZSBzb3VyY2UgdGV4dCBpbiB0aGUgc291cmNlbWFwJywKKyAgICAgICAgICAnICBub25lOiBubyBzb3VyY2VtYXBzJykgZG8gfHR5cGV8CisgICAgICAgIGlmIHR5cGUgJiYgISV3KGF1dG8gZmlsZSBpbmxpbmUgbm9uZSkuaW5jbHVkZT8odHlwZSkKKyAgICAgICAgICAkc3RkZXJyLnB1dHMgIlVua25vd24gc291cmNlbWFwIHR5cGUgI3t0eXBlfS5cblxuIgorICAgICAgICAgICRzdGRlcnIucHV0cyBvcHRzCisgICAgICAgICAgZXhpdAorICAgICAgICBlbHNpZiB0eXBlLm5pbD8KKyAgICAgICAgICBTYXNzOjpVdGlsLnNhc3Nfd2FybiA8PE1FU1NBR0UucnN0cmlwCitERVBSRUNBVElPTiBXQVJOSU5HOiBQYXNzaW5nIC0tc291cmNlbWFwIHdpdGhvdXQgYSB2YWx1ZSBpcyBkZXByZWNhdGVkLgorU291cmNlbWFwcyBhcmUgbm93IGdlbmVyYXRlZCBieSBkZWZhdWx0LCBzbyB0aGlzIGZsYWcgaGFzIG5vIGVmZmVjdC4KK01FU1NBR0UKKyAgICAgICAgZW5kCisKKyAgICAgICAgQG9wdGlvbnNbOnNvdXJjZW1hcF0gPSAodHlwZSB8fCA6YXV0bykudG9fc3ltCisgICAgICBlbmQKKworICAgICAgb3B0cy5vbignLXMnLCAnLS1zdGRpbicsIDpOT05FLAorICAgICAgICAgICAgICAnUmVhZCBpbnB1dCBmcm9tIHN0YW5kYXJkIGlucHV0IGluc3RlYWQgb2YgYW4gaW5wdXQgZmlsZS4nLAorICAgICAgICAgICAgICAnVGhpcyBpcyB0aGUgZGVmYXVsdCBpZiBubyBpbnB1dCBmaWxlIGlzIHNwZWNpZmllZC4nKSBkbworICAgICAgICBAb3B0aW9uc1s6aW5wdXRdID0gJHN0ZGluCisgICAgICBlbmQKKworICAgICAgZW5jb2Rpbmdfb3B0aW9uKG9wdHMpCisKKyAgICAgIG9wdHMub24oJy0tdW5peC1uZXdsaW5lcycsICdVc2UgVW5peC1zdHlsZSBuZXdsaW5lcyBpbiB3cml0dGVuIGZpbGVzLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0Fsd2F5cyB0cnVlIG9uIFVuaXguJyB1bmxlc3MgU2Fzczo6VXRpbC53aW5kb3dzPykpIGRvCisgICAgICAgIEBvcHRpb25zWzp1bml4X25ld2xpbmVzXSA9IHRydWUgaWYgU2Fzczo6VXRpbC53aW5kb3dzPworICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy1nJywgJy0tZGVidWctaW5mbycsCisgICAgICAgICAgICAgICdFbWl0IG91dHB1dCB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBGaXJlU2FzcyBGaXJlYnVnIHBsdWdpbi4nKSBkbworICAgICAgICBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOmRlYnVnX2luZm9dID0gdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy1sJywgJy0tbGluZS1udW1iZXJzJywgJy0tbGluZS1jb21tZW50cycsCisgICAgICAgICAgICAgICdFbWl0IGNvbW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQgQ1NTIGluZGljYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGxpbmUuJykgZG8KKyAgICAgICAgQG9wdGlvbnNbOmZvcl9lbmdpbmVdWzpsaW5lX251bWJlcnNdID0gdHJ1ZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgbWlzY2VsbGFuZW91cyhvcHRzKQorICAgICAgb3B0cy5zZXBhcmF0b3IgJycKKyAgICAgIG9wdHMuc2VwYXJhdG9yICdNaXNjZWxsYW5lb3VzOicKKworICAgICAgb3B0cy5vbignLWknLCAnLS1pbnRlcmFjdGl2ZScsCisgICAgICAgICAgICAgICdSdW4gYW4gaW50ZXJhY3RpdmUgU2Fzc1NjcmlwdCBzaGVsbC4nKSBkbworICAgICAgICBAb3B0aW9uc1s6aW50ZXJhY3RpdmVdID0gdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy1jJywgJy0tY2hlY2snLCAiSnVzdCBjaGVjayBzeW50YXgsIGRvbid0IGV2YWx1YXRlLiIpIGRvCisgICAgICAgIHJlcXVpcmUgJ3N0cmluZ2lvJworICAgICAgICBAb3B0aW9uc1s6Y2hlY2tfc3ludGF4XSA9IHRydWUKKyAgICAgICAgQG9wdGlvbnNbOm91dHB1dF0gPSBTdHJpbmdJTy5uZXcKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCctLXByZWNpc2lvbiBOVU1CRVJfT0ZfRElHSVRTJywgSW50ZWdlciwKKyAgICAgICAgICAgICAgIkhvdyBtYW55IGRpZ2l0cyBvZiBwcmVjaXNpb24gdG8gdXNlIHdoZW4gb3V0cHV0dGluZyBkZWNpbWFsIG51bWJlcnMuIiwKKyAgICAgICAgICAgICAgIkRlZmF1bHRzIHRvICN7U2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLnByZWNpc2lvbn0uIikgZG8gfHByZWNpc2lvbnwKKyAgICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLnByZWNpc2lvbiA9IHByZWNpc2lvbgorICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy0tY2FjaGUtbG9jYXRpb24gUEFUSCcsCisgICAgICAgICAgICAgICdUaGUgcGF0aCB0byBzYXZlIHBhcnNlZCBTYXNzIGZpbGVzLiBEZWZhdWx0cyB0byAuc2Fzcy1jYWNoZS4nKSBkbyB8bG9jfAorICAgICAgICBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOmNhY2hlX2xvY2F0aW9uXSA9IGxvYworICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy1DJywgJy0tbm8tY2FjaGUnLCAiRG9uJ3QgY2FjaGUgcGFyc2VkIFNhc3MgZmlsZXMuIikgZG8KKyAgICAgICAgQG9wdGlvbnNbOmZvcl9lbmdpbmVdWzpjYWNoZV0gPSBmYWxzZQorICAgICAgZW5kCisKKyAgICAgIG9wdHMub24oJy0tdHJhY2UnLCA6Tk9ORSwgJ1Nob3cgYSBmdWxsIFJ1Ynkgc3RhY2sgdHJhY2Ugb24gZXJyb3IuJykgZG8KKyAgICAgICAgQG9wdGlvbnNbOnRyYWNlXSA9IHRydWUKKyAgICAgIGVuZAorCisgICAgICBvcHRzLm9uKCctcScsICctLXF1aWV0JywgJ1NpbGVuY2Ugd2FybmluZ3MgYW5kIHN0YXR1cyBtZXNzYWdlcyBkdXJpbmcgY29tcGlsYXRpb24uJykgZG8KKyAgICAgICAgQG9wdGlvbnNbOmZvcl9lbmdpbmVdWzpxdWlldF0gPSB0cnVlCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBsb2FkX2NvbXBhc3MKKyAgICAgIGJlZ2luCisgICAgICAgIHJlcXVpcmUgJ2NvbXBhc3MnCisgICAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICAgIHJlcXVpcmUgJ3J1YnlnZW1zJworICAgICAgICBiZWdpbgorICAgICAgICAgIHJlcXVpcmUgJ2NvbXBhc3MnCisgICAgICAgIHJlc2N1ZSBMb2FkRXJyb3IKKyAgICAgICAgICBwdXRzICJFUlJPUjogQ2Fubm90IGxvYWQgY29tcGFzcy4iCisgICAgICAgICAgZXhpdCAxCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBDb21wYXNzLmFkZF9wcm9qZWN0X2NvbmZpZ3VyYXRpb24KKyAgICAgIENvbXBhc3MuY29uZmlndXJhdGlvbi5wcm9qZWN0X3BhdGggfHw9IERpci5wd2QKKyAgICAgIEBvcHRpb25zWzpmb3JfZW5naW5lXVs6bG9hZF9wYXRoc10gfHw9IFtdCisgICAgICBAb3B0aW9uc1s6Zm9yX2VuZ2luZV1bOmxvYWRfcGF0aHNdICs9IENvbXBhc3MuY29uZmlndXJhdGlvbi5zYXNzX2xvYWRfcGF0aHMKKyAgICBlbmQKKworICAgIGRlZiBpbnRlcmFjdGl2ZQorICAgICAgcmVxdWlyZSAnc2Fzcy9yZXBsJworICAgICAgU2Fzczo6UmVwbC5uZXcoQG9wdGlvbnMpLnJ1bgorICAgIGVuZAorCisgICAgIyBAY29tbWVudAorICAgICMgICBydWJvY29wOmRpc2FibGUgTWV0aG9kTGVuZ3RoCisgICAgZGVmIHdhdGNoX29yX3VwZGF0ZQorICAgICAgcmVxdWlyZSAnc2Fzcy9wbHVnaW4nCisgICAgICBTYXNzOjpQbHVnaW4ub3B0aW9ucy5tZXJnZSEgQG9wdGlvbnNbOmZvcl9lbmdpbmVdCisgICAgICBTYXNzOjpQbHVnaW4ub3B0aW9uc1s6dW5peF9uZXdsaW5lc10gPSBAb3B0aW9uc1s6dW5peF9uZXdsaW5lc10KKyAgICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zWzpwb2xsXSA9IEBvcHRpb25zWzpwb2xsXQorICAgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOnNvdXJjZW1hcF0gPSBAb3B0aW9uc1s6c291cmNlbWFwXQorCisgICAgICBpZiBAb3B0aW9uc1s6Zm9yY2VdCisgICAgICAgIHJhaXNlICJUaGUgLS1mb3JjZSBmbGFnIG1heSBvbmx5IGJlIHVzZWQgd2l0aCAtLXVwZGF0ZS4iIHVubGVzcyBAb3B0aW9uc1s6dXBkYXRlXQorICAgICAgICBTYXNzOjpQbHVnaW4ub3B0aW9uc1s6YWx3YXlzX3VwZGF0ZV0gPSB0cnVlCisgICAgICBlbmQKKworICAgICAgcmFpc2UgPDxNU0cgaWYgQGFyZ3MuZW1wdHk/CitXaGF0IGZpbGVzIHNob3VsZCBJIHdhdGNoPyBEaWQgeW91IG1lYW4gc29tZXRoaW5nIGxpa2U6CisgICAgI3tAZGVmYXVsdF9zeW50YXh9IC0td2F0Y2ggaW5wdXQuI3tAZGVmYXVsdF9zeW50YXh9Om91dHB1dC5jc3MKKyAgICAje0BkZWZhdWx0X3N5bnRheH0gLS13YXRjaCBpbnB1dC1kaXI6b3V0cHV0LWRpcgorTVNHCisKKyAgICAgIGlmICFjb2xvbl9wYXRoPyhAYXJnc1swXSkgJiYgcHJvYmFibHlfZGVzdF9kaXI/KEBhcmdzWzFdKQorICAgICAgICBmbGFnID0gQG9wdGlvbnNbOnVwZGF0ZV0gPyAiLS11cGRhdGUiIDogIi0td2F0Y2giCisgICAgICAgIGVyciA9CisgICAgICAgICAgaWYgIUZpbGUuZXhpc3Q/KEBhcmdzWzFdKQorICAgICAgICAgICAgImRvZXNuJ3QgZXhpc3QiCisgICAgICAgICAgZWxzaWYgQGFyZ3NbMV0gPX4gL1wuY3NzJC8KKyAgICAgICAgICAgICJpcyBhIENTUyBmaWxlIgorICAgICAgICAgIGVuZAorICAgICAgICByYWlzZSA8PE1TRyBpZiBlcnIKK0ZpbGUgI3tAYXJnc1sxXX0gI3tlcnJ9LgorICAgIERpZCB5b3UgbWVhbjogI3tAZGVmYXVsdF9zeW50YXh9ICN7ZmxhZ30gI3tAYXJnc1swXX06I3tAYXJnc1sxXX0KK01TRworICAgICAgZW5kCisKKyAgICAgIGRpcnMsIGZpbGVzID0gQGFyZ3MubWFwIHt8bmFtZXwgc3BsaXRfY29sb25fcGF0aChuYW1lKX0uCisgICAgICAgIHBhcnRpdGlvbiB7fGksIF98IEZpbGUuZGlyZWN0b3J5PyBpfQorCisgICAgICBpZiBAZmFrZV91cGRhdGUgJiYgIWRpcnMuZW1wdHk/CisgICAgICAgICMgSXNzdWUgMTYwMi4KKyAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gPDxXQVJOSU5HLnN0cmlwCitERVBSRUNBVElPTiBXQVJOSU5HOiBDb21waWxpbmcgZGlyZWN0b3JpZXMgd2l0aG91dCAtLXVwZGF0ZSBvciAtLXdhdGNoIGlzCitkZXByZWNhdGVkIGFuZCB3b24ndCB3b3JrIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLiBJbnN0ZWFkIHVzZToKKyAgI3tAZGVmYXVsdF9zeW50YXh9IC0tdXBkYXRlICN7QGFyZ3N9CitXQVJOSU5HCisgICAgICBlbmQKKworICAgICAgZmlsZXMubWFwISBkbyB8ZnJvbSwgdG98CisgICAgICAgIHRvIHx8PSBmcm9tLmdzdWIoL1wuW14uXSo/JC8sICcuY3NzJykKKyAgICAgICAgc291cmNlbWFwID0gU2Fzczo6VXRpbC5zb3VyY2VtYXBfbmFtZSh0bykgaWYgQG9wdGlvbnNbOnNvdXJjZW1hcF0KKyAgICAgICAgW2Zyb20sIHRvLCBzb3VyY2VtYXBdCisgICAgICBlbmQKKyAgICAgIGRpcnMubWFwISB7fGZyb20sIHRvfCBbZnJvbSwgdG8gfHwgZnJvbV19CisgICAgICBTYXNzOjpQbHVnaW4ub3B0aW9uc1s6dGVtcGxhdGVfbG9jYXRpb25dID0gZGlycworCisgICAgICBTYXNzOjpQbHVnaW4ub25fdXBkYXRlZF9zdHlsZXNoZWV0IGRvIHxfLCBjc3MsIHNvdXJjZW1hcHwKKyAgICAgICAgW2Nzcywgc291cmNlbWFwXS5lYWNoIGRvIHxmaWxlfAorICAgICAgICAgIG5leHQgdW5sZXNzIGZpbGUKKyAgICAgICAgICBwdXRzX2FjdGlvbiA6d3JpdGUsIDpncmVlbiwgZmlsZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBoYWRfZXJyb3IgPSBmYWxzZQorICAgICAgU2Fzczo6UGx1Z2luLm9uX2NyZWF0aW5nX2RpcmVjdG9yeSB7fGRpcm5hbWV8IHB1dHNfYWN0aW9uIDpkaXJlY3RvcnksIDpncmVlbiwgZGlybmFtZX0KKyAgICAgIFNhc3M6OlBsdWdpbi5vbl9kZWxldGluZ19jc3Mge3xmaWxlbmFtZXwgcHV0c19hY3Rpb24gOmRlbGV0ZSwgOnllbGxvdywgZmlsZW5hbWV9CisgICAgICBTYXNzOjpQbHVnaW4ub25fZGVsZXRpbmdfc291cmNlbWFwIHt8ZmlsZW5hbWV8IHB1dHNfYWN0aW9uIDpkZWxldGUsIDp5ZWxsb3csIGZpbGVuYW1lfQorICAgICAgU2Fzczo6UGx1Z2luLm9uX2NvbXBpbGF0aW9uX2Vycm9yIGRvIHxlcnJvciwgXywgX3wKKyAgICAgICAgaWYgZXJyb3IuaXNfYT8oU3lzdGVtQ2FsbEVycm9yKSAmJiAhQG9wdGlvbnNbOnN0b3Bfb25fZXJyb3JdCisgICAgICAgICAgaGFkX2Vycm9yID0gdHJ1ZQorICAgICAgICAgIHB1dHNfYWN0aW9uIDplcnJvciwgOnJlZCwgZXJyb3IubWVzc2FnZQorICAgICAgICAgIFNURE9VVC5mbHVzaAorICAgICAgICAgIG5leHQKKyAgICAgICAgZW5kCisKKyAgICAgICAgcmFpc2UgZXJyb3IgdW5sZXNzIGVycm9yLmlzX2E/KFNhc3M6OlN5bnRheEVycm9yKSAmJiAhQG9wdGlvbnNbOnN0b3Bfb25fZXJyb3JdCisgICAgICAgIGhhZF9lcnJvciA9IHRydWUKKyAgICAgICAgcHV0c19hY3Rpb24gOmVycm9yLCA6cmVkLAorICAgICAgICAgICIje2Vycm9yLnNhc3NfZmlsZW5hbWV9IChMaW5lICN7ZXJyb3Iuc2Fzc19saW5lfTogI3tlcnJvci5tZXNzYWdlfSkiCisgICAgICAgIFNURE9VVC5mbHVzaAorICAgICAgZW5kCisKKyAgICAgIGlmIEBvcHRpb25zWzp1cGRhdGVdCisgICAgICAgIFNhc3M6OlBsdWdpbi51cGRhdGVfc3R5bGVzaGVldHMoZmlsZXMpCisgICAgICAgIGV4aXQgMSBpZiBoYWRfZXJyb3IKKyAgICAgICAgcmV0dXJuCisgICAgICBlbmQKKworICAgICAgcHV0cyAiPj4+IFNhc3MgaXMgd2F0Y2hpbmcgZm9yIGNoYW5nZXMuIFByZXNzIEN0cmwtQyB0byBzdG9wLiIKKworICAgICAgU2Fzczo6UGx1Z2luLm9uX3RlbXBsYXRlX21vZGlmaWVkIGRvIHx0ZW1wbGF0ZXwKKyAgICAgICAgcHV0cyAiPj4+IENoYW5nZSBkZXRlY3RlZCB0bzogI3t0ZW1wbGF0ZX0iCisgICAgICAgIFNURE9VVC5mbHVzaAorICAgICAgZW5kCisgICAgICBTYXNzOjpQbHVnaW4ub25fdGVtcGxhdGVfY3JlYXRlZCBkbyB8dGVtcGxhdGV8CisgICAgICAgIHB1dHMgIj4+PiBOZXcgdGVtcGxhdGUgZGV0ZWN0ZWQ6ICN7dGVtcGxhdGV9IgorICAgICAgICBTVERPVVQuZmx1c2gKKyAgICAgIGVuZAorICAgICAgU2Fzczo6UGx1Z2luLm9uX3RlbXBsYXRlX2RlbGV0ZWQgZG8gfHRlbXBsYXRlfAorICAgICAgICBwdXRzICI+Pj4gRGVsZXRlZCB0ZW1wbGF0ZSBkZXRlY3RlZDogI3t0ZW1wbGF0ZX0iCisgICAgICAgIFNURE9VVC5mbHVzaAorICAgICAgZW5kCisKKyAgICAgIFNhc3M6OlBsdWdpbi53YXRjaChmaWxlcykKKyAgICBlbmQKKyAgICAjIEBjb21tZW50CisgICAgIyAgIHJ1Ym9jb3A6ZW5hYmxlIE1ldGhvZExlbmd0aAorCisgICAgZGVmIHJ1bgorICAgICAgaW5wdXQgPSBAb3B0aW9uc1s6aW5wdXRdCisgICAgICBvdXRwdXQgPSBAb3B0aW9uc1s6b3V0cHV0XQorCisgICAgICBpZiBpbnB1dCA9PSAkc3RkaW4KKyAgICAgICAgIyBTZWUgaXNzdWUgMTc0NQorICAgICAgICAoQG9wdGlvbnNbOmZvcl9lbmdpbmVdWzpsb2FkX3BhdGhzXSB8fD0gW10pIDw8IDo6U2Fzczo6SW1wb3J0ZXJzOjpEZXByZWNhdGVkUGF0aC5uZXcoIi4iKQorICAgICAgZW5kCisKKyAgICAgIEBvcHRpb25zWzpmb3JfZW5naW5lXVs6c3ludGF4XSB8fD0gOnNjc3MgaWYgaW5wdXQuaXNfYT8oRmlsZSkgJiYgaW5wdXQucGF0aCA9fiAvXC5zY3NzJC8KKyAgICAgIEBvcHRpb25zWzpmb3JfZW5naW5lXVs6c3ludGF4XSB8fD0gQGRlZmF1bHRfc3ludGF4CisgICAgICBlbmdpbmUgPQorICAgICAgICBpZiBpbnB1dC5pc19hPyhGaWxlKSAmJiAhQG9wdGlvbnNbOmNoZWNrX3N5bnRheF0KKyAgICAgICAgICBTYXNzOjpFbmdpbmUuZm9yX2ZpbGUoaW5wdXQucGF0aCwgQG9wdGlvbnNbOmZvcl9lbmdpbmVdKQorICAgICAgICBlbHNlCisgICAgICAgICAgIyBXZSBkb24ndCBuZWVkIHRvIGRvIGFueSBzcGVjaWFsIGhhbmRsaW5nIG9mIEBvcHRpb25zWzpjaGVja19zeW50YXhdIGhlcmUsCisgICAgICAgICAgIyBiZWNhdXNlIHRoZSBTYXNzIHN5bnRheCBjaGVja2luZyBoYXBwZW5zIGFsb25nc2lkZSBldmFsdWF0aW9uCisgICAgICAgICAgIyBhbmQgZXZhbHVhdGlvbiBkb2Vzbid0IGFjdHVhbGx5IGV2YWx1YXRlIGFueSBjb2RlIGFueXdheS4KKyAgICAgICAgICBTYXNzOjpFbmdpbmUubmV3KGlucHV0LnJlYWQsIEBvcHRpb25zWzpmb3JfZW5naW5lXSkKKyAgICAgICAgZW5kCisKKyAgICAgIGlucHV0LmNsb3NlIGlmIGlucHV0LmlzX2E/KEZpbGUpCisKKyAgICAgIGlmIEBvcHRpb25zWzpzb3VyY2VtYXBdICE9IDpub25lICYmIEBvcHRpb25zWzpzb3VyY2VtYXBfZmlsZW5hbWVdCisgICAgICAgIHJlbGF0aXZlX3NvdXJjZW1hcF9wYXRoID0gU2Fzczo6VXRpbC5yZWxhdGl2ZV9wYXRoX2Zyb20oCisgICAgICAgICAgQG9wdGlvbnNbOnNvdXJjZW1hcF9maWxlbmFtZV0sIFNhc3M6OlV0aWwucGF0aG5hbWUoQG9wdGlvbnNbOm91dHB1dF9maWxlbmFtZV0pLmRpcm5hbWUpCisgICAgICAgIHJlbmRlcmVkLCBtYXBwaW5nID0gZW5naW5lLnJlbmRlcl93aXRoX3NvdXJjZW1hcChyZWxhdGl2ZV9zb3VyY2VtYXBfcGF0aC50b19zKQorICAgICAgICB3cml0ZV9vdXRwdXQocmVuZGVyZWQsIG91dHB1dCkKKyAgICAgICAgd3JpdGVfb3V0cHV0KAorICAgICAgICAgIG1hcHBpbmcudG9fanNvbigKKyAgICAgICAgICAgIDp0eXBlID0+IEBvcHRpb25zWzpzb3VyY2VtYXBdLAorICAgICAgICAgICAgOmNzc19wYXRoID0+IEBvcHRpb25zWzpvdXRwdXRfZmlsZW5hbWVdLAorICAgICAgICAgICAgOnNvdXJjZW1hcF9wYXRoID0+IEBvcHRpb25zWzpzb3VyY2VtYXBfZmlsZW5hbWVdKSArICJcbiIsCisgICAgICAgICAgQG9wdGlvbnNbOnNvdXJjZW1hcF9maWxlbmFtZV0pCisgICAgICBlbHNlCisgICAgICAgIHdyaXRlX291dHB1dChlbmdpbmUucmVuZGVyLCBvdXRwdXQpCisgICAgICBlbmQKKyAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgICAgd3JpdGVfb3V0cHV0KFNhc3M6OlN5bnRheEVycm9yLmV4Y2VwdGlvbl90b19jc3MoZSksIG91dHB1dCkgaWYgb3V0cHV0LmlzX2E/KFN0cmluZykKKyAgICAgIHJhaXNlIGUKKyAgICBlbnN1cmUKKyAgICAgIG91dHB1dC5jbG9zZSBpZiBvdXRwdXQuaXNfYT8gRmlsZQorICAgIGVuZAorCisgICAgZGVmIGNvbG9uX3BhdGg/KHBhdGgpCisgICAgICAhc3BsaXRfY29sb25fcGF0aChwYXRoKVsxXS5uaWw/CisgICAgZW5kCisKKyAgICBkZWYgc3BsaXRfY29sb25fcGF0aChwYXRoKQorICAgICAgb25lLCB0d28gPSBwYXRoLnNwbGl0KCc6JywgMikKKyAgICAgIGlmIG9uZSAmJiB0d28gJiYgU2Fzczo6VXRpbC53aW5kb3dzPyAmJgorICAgICAgICAgIG9uZSA9fiAvXEFbQS1aYS16XVxaLyAmJiB0d28gPX4gJXJ7XEFbL1xcXX0KKyAgICAgICAgIyBJZiB3ZSdyZSBvbiBXaW5kb3dzIGFuZCB3ZSB3ZXJlIHBhc3NlZCBhIGRyaXZlIGxldHRlciBwYXRoLAorICAgICAgICAjIGRvbid0IHNwbGl0IG9uIHRoYXQgY29sb24uCisgICAgICAgIG9uZTIsIHR3byA9IHR3by5zcGxpdCgnOicsIDIpCisgICAgICAgIG9uZSA9IG9uZSArICc6JyArIG9uZTIKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIG9uZSwgdHdvCisgICAgZW5kCisKKyAgICAjIFdoZXRoZXIgcGF0aCBpcyBsaWtlbHkgdG8gYmUgbWVhbnQgYXMgdGhlIGRlc3RpbmF0aW9uCisgICAgIyBpbiBhIHNvdXJjZTpkZXN0IHBhaXIuCisgICAgZGVmIHByb2JhYmx5X2Rlc3RfZGlyPyhwYXRoKQorICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyBwYXRoCisgICAgICByZXR1cm4gZmFsc2UgaWYgY29sb25fcGF0aD8ocGF0aCkKKyAgICAgIFNhc3M6OlV0aWwuZ2xvYihGaWxlLmpvaW4ocGF0aCwgIiouc1tjYV1zcyIpKS5lbXB0eT8KKyAgICBlbmQKKworICAgIGRlZiBkZWZhdWx0X3Nhc3NfcGF0aAorICAgICAgcmV0dXJuIHVubGVzcyBFTlZbJ1NBU1NfUEFUSCddCisgICAgICAjIFRoZSBzZWxlY3QgaGVyZSBwcmV2ZW50cyBlcnJvcnMgd2hlbiB0aGUgZW52aXJvbm1lbnQncworICAgICAgIyBsb2FkIHBhdGhzIHNwZWNpZmllZCBkbyBub3QgZXhpc3QuCisgICAgICBFTlZbJ1NBU1NfUEFUSCddLnNwbGl0KEZpbGU6OlBBVEhfU0VQQVJBVE9SKS5zZWxlY3Qge3xkfCBGaWxlLmRpcmVjdG9yeT8oZCl9CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2ZlYXR1cmVzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9mZWF0dXJlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQzMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9mZWF0dXJlcy5yYgpAQCAtMCwwICsxLDQ4IEBACityZXF1aXJlICdzZXQnCittb2R1bGUgU2FzcworICAjIFByb3ZpZGVzIGBTYXNzLmhhc19mZWF0dXJlP2Agd2hpY2ggYWxsb3dzIGZvciBzaW1wbGUgZmVhdHVyZSBkZXRlY3Rpb24KKyAgIyBieSBwcm92aWRpbmcgYSBmZWF0dXJlIG5hbWUuCisgIG1vZHVsZSBGZWF0dXJlcworICAgICMgVGhpcyBpcyB0aGUgc2V0IG9mIGZlYXR1cmVzIHRoYXQgY2FuIGJlIGRldGVjdGVkLgorICAgICMKKyAgICAjIFdoZW4gdGhpcyBpcyB1cGRhdGVkLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBgZmVhdHVyZS1leGlzdHMoKWAgc2hvdWxkIGJlCisgICAgIyB1cGRhdGVkIGFzIHdlbGwuCisgICAgS05PV05fRkVBVFVSRVMgPSBTZXRbKiV3KAorICAgICAgZ2xvYmFsLXZhcmlhYmxlLXNoYWRvd2luZworICAgICAgZXh0ZW5kLXNlbGVjdG9yLXBzZXVkb2NsYXNzCisgICAgICB1bml0cy1sZXZlbC0zCisgICAgICBhdC1lcnJvcgorICAgICAgY3VzdG9tLXByb3BlcnR5CisgICAgKV0KKworICAgICMgQ2hlY2sgaWYgYSBmZWF0dXJlIGV4aXN0cyBieSBuYW1lLiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50CisgICAgIyB0aGUgU2FzcyBmdW5jdGlvbiBgZmVhdHVyZS1leGlzdHMoJGZlYXR1cmUpYAorICAgICMKKyAgICAjIEBwYXJhbSBmZWF0dXJlX25hbWUgW1N0cmluZ10gVGhlIGNhc2Ugc2Vuc2l0aXZlIG5hbWUgb2YgdGhlIGZlYXR1cmUgdG8KKyAgICAjICAgY2hlY2sgaWYgaXQgZXhpc3RzIGluIHRoaXMgdmVyc2lvbiBvZiBTYXNzLgorICAgICMgQHJldHVybiBbQm9vbGVhbl0gd2hldGhlciB0aGUgZmVhdHVyZSBvZiB0aGF0IG5hbWUgZXhpc3RzLgorICAgIGRlZiBoYXNfZmVhdHVyZT8oZmVhdHVyZV9uYW1lKQorICAgICAgS05PV05fRkVBVFVSRVMuaW5jbHVkZT8oZmVhdHVyZV9uYW1lKQorICAgIGVuZAorCisgICAgIyBBZGQgYSBmZWF0dXJlIHRvIFNhc3MuIFBsdWdpbnMgY2FuIHVzZSB0aGlzIHRvIGVhc2lseSBleHBvc2UgdGhlaXIKKyAgICAjIGF2YWlsYWJpbGl0eSB0byBlbmQgdXNlcnMuIFBsdWdpbnMgbXVzdCBwcmVmaXggdGhlaXIgZmVhdHVyZQorICAgICMgbmFtZXMgd2l0aCBhIGRhc2ggdG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIG9mZmljaWFsIGZlYXR1cmVzLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIFNhc3MuYWRkX2ZlYXR1cmUoIi1pbXBvcnQtZ2xvYmJpbmciKQorICAgICMgICBTYXNzLmFkZF9mZWF0dXJlKCItbWF0aC1jb3MiKQorICAgICMKKyAgICAjCisgICAgIyBAcGFyYW0gZmVhdHVyZV9uYW1lIFtTdHJpbmddIFRoZSBjYXNlIHNlbnNpdGl2ZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvCisgICAgIyAgIHRvIGFkZCB0byBTYXNzLiBNdXN0IGJlZ2luIHdpdGggYSBkYXNoLgorICAgIGRlZiBhZGRfZmVhdHVyZShmZWF0dXJlX25hbWUpCisgICAgICB1bmxlc3MgZmVhdHVyZV9uYW1lWzBdID09ID8tCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJQbHVnaW4gZmVhdHVyZSBuYW1lcyBtdXN0IGJlZ2luIHdpdGggYSBkYXNoIikKKyAgICAgIGVuZAorICAgICAgS05PV05fRkVBVFVSRVMgPDwgZmVhdHVyZV9uYW1lCisgICAgZW5kCisgIGVuZAorCisgIGV4dGVuZCBGZWF0dXJlcworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2ltcG9ydGVycy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvaW1wb3J0ZXJzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzhiMjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2ltcG9ydGVycy5yYgpAQCAtMCwwICsxLDIzIEBACittb2R1bGUgU2FzcworICAjIFNhc3MgaW1wb3J0ZXJzIGFyZSBpbiBjaGFyZ2Ugb2YgdGFraW5nIHBhdGhzIHBhc3NlZCB0byBgQGltcG9ydGAKKyAgIyBhbmQgZmluZGluZyB0aGUgYXBwcm9wcmlhdGUgU2FzcyBjb2RlIGZvciB0aG9zZSBwYXRocy4KKyAgIyBCeSBkZWZhdWx0LCB0aGlzIGNvZGUgaXMgYWx3YXlzIGxvYWRlZCBmcm9tIHRoZSBmaWxlc3lzdGVtLAorICAjIGJ1dCBpbXBvcnRlcnMgY291bGQgYmUgYWRkZWQgdG8gbG9hZCBmcm9tIGEgZGF0YWJhc2Ugb3Igb3ZlciBIVFRQLgorICAjCisgICMgRWFjaCBpbXBvcnRlciBpcyBpbiBjaGFyZ2Ugb2YgYSBzaW5nbGUgbG9hZCBwYXRoCisgICMgKG9yIHdoYXRldmVyIHRoZSBjb3JyZXNwb25kaW5nIG5vdGlvbiBpcyBmb3IgdGhlIGJhY2tlbmQpLgorICAjIEltcG9ydGVycyBjYW4gYmUgcGxhY2VkIGluIHRoZSB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNsb2FkX3BhdGhzLW9wdGlvbiBgOmxvYWRfcGF0aHNgIGFycmF5fQorICAjIGFsb25nc2lkZSBub3JtYWwgZmlsZXN5c3RlbSBwYXRocy4KKyAgIworICAjIFdoZW4gcmVzb2x2aW5nIGFuIGBAaW1wb3J0YCwgU2FzcyB3aWxsIGdvIHRocm91Z2ggdGhlIGxvYWQgcGF0aHMKKyAgIyBsb29raW5nIGZvciBhbiBpbXBvcnRlciB0aGF0IHN1Y2Nlc3NmdWxseSBpbXBvcnRzIHRoZSBwYXRoLgorICAjIE9uY2Ugb25lIGlzIGZvdW5kLCB0aGUgaW1wb3J0ZWQgZmlsZSBpcyB1c2VkLgorICAjCisgICMgVXNlci1jcmVhdGVkIGltcG9ydGVycyBtdXN0IGluaGVyaXQgZnJvbSB7SW1wb3J0ZXJzOjpCYXNlfS4KKyAgbW9kdWxlIEltcG9ydGVycworICBlbmQKK2VuZAorCityZXF1aXJlICdzYXNzL2ltcG9ydGVycy9iYXNlJworcmVxdWlyZSAnc2Fzcy9pbXBvcnRlcnMvZmlsZXN5c3RlbScKK3JlcXVpcmUgJ3Nhc3MvaW1wb3J0ZXJzL2RlcHJlY2F0ZWRfcGF0aCcKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvaW1wb3J0ZXJzL2Jhc2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2ltcG9ydGVycy9iYXNlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzRkMzQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2ltcG9ydGVycy9iYXNlLnJiCkBAIC0wLDAgKzEsMTgyIEBACittb2R1bGUgU2FzcworICBtb2R1bGUgSW1wb3J0ZXJzCisgICAgIyBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgU2FzcyBpbXBvcnRlcnMuCisgICAgIyBBbGwgaW1wb3J0ZXJzIHNob3VsZCBpbmhlcml0IGZyb20gdGhpcy4KKyAgICAjCisgICAgIyBBdCB0aGUgbW9zdCBiYXNpYyBsZXZlbCwgYW4gaW1wb3J0ZXIgaXMgZ2l2ZW4gYSBzdHJpbmcKKyAgICAjIGFuZCBtdXN0IHJldHVybiBhIHtTYXNzOjpFbmdpbmV9IGNvbnRhaW5pbmcgc29tZSBTYXNzIGNvZGUuCisgICAgIyBUaGlzIHN0cmluZyBjYW4gYmUgaW50ZXJwcmV0ZWQgaG93ZXZlciB0aGUgaW1wb3J0ZXIgd2FudHM7CisgICAgIyBob3dldmVyLCBzdWJjbGFzc2VzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGUgVVJJIGZvcm1hdAorICAgICMgZm9yIHBhdGhuYW1lcy4KKyAgICAjCisgICAgIyBJbXBvcnRlcnMgdGhhdCBoYXZlIHNvbWUgbm90aW9uIG9mICJyZWxhdGl2ZSBpbXBvcnRzIgorICAgICMgc2hvdWxkIHRha2UgYSBzaW5nbGUgbG9hZCBwYXRoIGluIHRoZWlyIGNvbnN0cnVjdG9yLAorICAgICMgYW5kIGludGVycHJldCBwYXRocyBhcyByZWxhdGl2ZSB0byB0aGF0LgorICAgICMgVGhleSBzaG91bGQgYWxzbyBpbXBsZW1lbnQgdGhlIFx7I2ZpbmRcX3JlbGF0aXZlfSBtZXRob2QuCisgICAgIworICAgICMgSW1wb3J0ZXJzIHNob3VsZCBiZSBzZXJpYWxpemFibGUgdmlhIGBNYXJzaGFsLmR1bXBgLgorICAgICMKKyAgICAjIEBhYnN0cmFjdAorICAgIGNsYXNzIEJhc2UKKyAgICAgICMgRmluZCBhIFNhc3MgZmlsZSByZWxhdGl2ZSB0byBhbm90aGVyIGZpbGUuCisgICAgICAjIEltcG9ydGVycyB3aXRob3V0IGEgbm90aW9uIG9mICJyZWxhdGl2ZSBwYXRocyIKKyAgICAgICMgc2hvdWxkIGp1c3QgcmV0dXJuIG5pbCBoZXJlLgorICAgICAgIworICAgICAgIyBJZiB0aGUgaW1wb3J0ZXIgZG9lcyBoYXZlIGEgbm90aW9uIG9mICJyZWxhdGl2ZSBwYXRocyIsCisgICAgICAjIGl0IHNob3VsZCBpZ25vcmUgaXRzIGxvYWQgcGF0aCBkdXJpbmcgdGhpcyBtZXRob2QuCisgICAgICAjCisgICAgICAjIFNlZSBceyNmaW5kfSBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uIG9uIGhvdyB0aGlzIG1ldGhvZCBzaG91bGQgYmVoYXZlLgorICAgICAgIworICAgICAgIyBUaGUgYDpmaWxlbmFtZWAgb3B0aW9uIHBhc3NlZCB0byB0aGUgcmV0dXJuZWQge1Nhc3M6OkVuZ2luZX0KKyAgICAgICMgc2hvdWxkIGJlIG9mIGEgZm9ybWF0IHRoYXQgY291bGQgYmUgcGFzc2VkIHRvIFx7I2ZpbmR9LgorICAgICAgIworICAgICAgIyBAcGFyYW0gdXJpIFtTdHJpbmddIFRoZSBVUkkgdG8gaW1wb3J0LiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSByZWxhdGl2ZSwKKyAgICAgICMgICBidXQgdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgcmV0dXJuIHRydWUgaWYgaXQgaXMuCisgICAgICAjIEBwYXJhbSBiYXNlIFtTdHJpbmddIFRoZSBiYXNlIGZpbGVuYW1lLiBJZiBgdXJpYCBpcyByZWxhdGl2ZSwKKyAgICAgICMgICBpdCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gYGJhc2VgLgorICAgICAgIyAgIGBiYXNlYCBpcyBndWFyYW50ZWVkIHRvIGJlIGluIGEgZm9ybWF0IGltcG9ydGFibGUgYnkgdGhpcyBpbXBvcnRlci4KKyAgICAgICMgQHBhcmFtIG9wdGlvbnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gT3B0aW9ucyBmb3IgdGhlIFNhc3MgZmlsZQorICAgICAgIyAgIGNvbnRhaW5pbmcgdGhlIGBAaW1wb3J0YCB0aGF0J3MgY3VycmVudGx5IGJlaW5nIHJlc29sdmVkLgorICAgICAgIyBAcmV0dXJuIFtTYXNzOjpFbmdpbmUsIG5pbF0gQW4gRW5naW5lIGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGZpbGUsCisgICAgICAjICAgb3IgbmlsIGlmIGl0IGNvdWxkbid0IGJlIGZvdW5kIG9yIHdhcyBpbiB0aGUgd3JvbmcgZm9ybWF0LgorICAgICAgZGVmIGZpbmRfcmVsYXRpdmUodXJpLCBiYXNlLCBvcHRpb25zKQorICAgICAgICBTYXNzOjpVdGlsLmFic3RyYWN0KHNlbGYpCisgICAgICBlbmQKKworICAgICAgIyBGaW5kIGEgU2FzcyBmaWxlLCBpZiBpdCBleGlzdHMuCisgICAgICAjCisgICAgICAjIFRoaXMgaXMgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgb2YgdGhlIEltcG9ydGVyLgorICAgICAgIyBJdCBjb3JyZXNwb25kcyBkaXJlY3RseSB0byBhbiBgQGltcG9ydGAgc3RhdGVtZW50IGluIFNhc3MuCisgICAgICAjIEl0IHNob3VsZCBkbyB0aHJlZSBiYXNpYyB0aGluZ3M6CisgICAgICAjCisgICAgICAjICogRGV0ZXJtaW5lIGlmIHRoZSBVUkkgaXMgaW4gdGhpcyBpbXBvcnRlcidzIGZvcm1hdC4KKyAgICAgICMgICBJZiBub3QsIHJldHVybiBuaWwuCisgICAgICAjICogRGV0ZXJtaW5lIGlmIHRoZSBmaWxlIGluZGljYXRlZCBieSB0aGUgVVJJIGFjdHVhbGx5IGV4aXN0cyBhbmQgaXMgcmVhZGFibGUuCisgICAgICAjICAgSWYgbm90LCByZXR1cm4gbmlsLgorICAgICAgIyAqIFJlYWQgdGhlIGZpbGUgYW5kIHBsYWNlIHRoZSBjb250ZW50cyBpbiBhIHtTYXNzOjpFbmdpbmV9LgorICAgICAgIyAgIFJldHVybiB0aGF0IGVuZ2luZS4KKyAgICAgICMKKyAgICAgICMgSWYgdGhpcyBpbXBvcnRlcidzIGZvcm1hdCBhbGxvd3MgZm9yIGZpbGUgZXh0ZW5zaW9ucywKKyAgICAgICMgaXQgc2hvdWxkIHRyZWF0IHRoZW0gdGhlIHNhbWUgd2F5IGFzIHRoZSBkZWZhdWx0IHtGaWxlc3lzdGVtfSBpbXBvcnRlci4KKyAgICAgICMgSWYgdGhlIFVSSSBleHBsaWNpdGx5IGhhcyBhIGAuc2Fzc2Agb3IgYC5zY3NzYCBmaWxlbmFtZSwKKyAgICAgICMgdGhlIGltcG9ydGVyIHNob3VsZCBsb29rIGZvciB0aGF0IGV4YWN0IGZpbGUKKyAgICAgICMgYW5kIGltcG9ydCBpdCBhcyB0aGUgc3ludGF4IGluZGljYXRlZC4KKyAgICAgICMgSWYgaXQgZG9lc24ndCBleGlzdCwgdGhlIGltcG9ydGVyIHNob3VsZCByZXR1cm4gbmlsLgorICAgICAgIworICAgICAgIyBJZiB0aGUgVVJJIGRvZXNuJ3QgaGF2ZSBlaXRoZXIgb2YgdGhlc2UgZXh0ZW5zaW9ucywKKyAgICAgICMgdGhlIGltcG9ydGVyIHNob3VsZCBsb29rIGZvciBmaWxlcyB3aXRoIHRoZSBleHRlbnNpb25zLgorICAgICAgIyBJZiBubyBzdWNoIGZpbGVzIGV4aXN0LCBpdCBzaG91bGQgcmV0dXJuIG5pbC4KKyAgICAgICMKKyAgICAgICMgVGhlIHtTYXNzOjpFbmdpbmV9IHRvIGJlIHJldHVybmVkIHNob3VsZCBiZSBwYXNzZWQgYG9wdGlvbnNgLAorICAgICAgIyB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMuIGA6c3ludGF4YCBzaG91bGQgYmUgc2V0IGFwcHJvcHJpYXRlbHksCisgICAgICAjIGA6ZmlsZW5hbWVgIHNob3VsZCBiZSBzZXQgdG8gYHVyaWAsCisgICAgICAjIGFuZCBgOmltcG9ydGVyYCBzaG91bGQgYmUgc2V0IHRvIHRoaXMgaW1wb3J0ZXIuCisgICAgICAjCisgICAgICAjIEBwYXJhbSB1cmkgW1N0cmluZ10gVGhlIFVSSSB0byBpbXBvcnQuCisgICAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIE9wdGlvbnMgZm9yIHRoZSBTYXNzIGZpbGUKKyAgICAgICMgICBjb250YWluaW5nIHRoZSBgQGltcG9ydGAgdGhhdCdzIGN1cnJlbnRseSBiZWluZyByZXNvbHZlZC4KKyAgICAgICMgICBUaGlzIGlzIHNhZmUgZm9yIHN1YmNsYXNzZXMgdG8gbW9kaWZ5IGRlc3RydWN0aXZlbHkuCisgICAgICAjICAgQ2FsbGVycyBzaG91bGQgb25seSBwYXNzIGluIGEgdmFsdWUgdGhleSBkb24ndCBtaW5kIGJlaW5nIGRlc3RydWN0aXZlbHkgbW9kaWZpZWQuCisgICAgICAjIEByZXR1cm4gW1Nhc3M6OkVuZ2luZSwgbmlsXSBBbiBFbmdpbmUgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQgZmlsZSwKKyAgICAgICMgICBvciBuaWwgaWYgaXQgY291bGRuJ3QgYmUgZm91bmQgb3Igd2FzIGluIHRoZSB3cm9uZyBmb3JtYXQuCisgICAgICBkZWYgZmluZCh1cmksIG9wdGlvbnMpCisgICAgICAgIFNhc3M6OlV0aWwuYWJzdHJhY3Qoc2VsZikKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgdGhlIHRpbWUgdGhlIGdpdmVuIFNhc3MgZmlsZSB3YXMgbGFzdCBtb2RpZmllZC4KKyAgICAgICMKKyAgICAgICMgSWYgdGhlIGdpdmVuIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCBvciB0aGUgdGltZSBjYW4ndCBiZSBhY2Nlc3NlZAorICAgICAgIyBmb3Igc29tZSBvdGhlciByZWFzb24sIHRoaXMgc2hvdWxkIHJldHVybiBuaWwuCisgICAgICAjCisgICAgICAjIEBwYXJhbSB1cmkgW1N0cmluZ10gVGhlIFVSSSBvZiB0aGUgZmlsZSB0byBjaGVjay4KKyAgICAgICMgICBDb21lcyBmcm9tIGEgYDpmaWxlbmFtZWAgb3B0aW9uIHNldCBvbiBhbiBlbmdpbmUgcmV0dXJuZWQgYnkgdGhpcyBpbXBvcnRlci4KKyAgICAgICMgQHBhcmFtIG9wdGlvbnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gT3B0aW9ucyBmb3IgdGhlIFNhc3MgZmlsZQorICAgICAgIyAgIGNvbnRhaW5pbmcgdGhlIGBAaW1wb3J0YCBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZC4KKyAgICAgICMgQHJldHVybiBbVGltZSwgbmlsXQorICAgICAgZGVmIG10aW1lKHVyaSwgb3B0aW9ucykKKyAgICAgICAgU2Fzczo6VXRpbC5hYnN0cmFjdChzZWxmKQorICAgICAgZW5kCisKKyAgICAgICMgR2V0IHRoZSBjYWNoZSBrZXkgcGFpciBmb3IgdGhlIGdpdmVuIFNhc3MgVVJJLgorICAgICAgIyBUaGUgVVJJIG5lZWQgbm90IGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5LgorICAgICAgIworICAgICAgIyBUaGUgb25seSBzdHJpY3QgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgcmV0dXJuZWQgcGFpciBvZiBzdHJpbmdzCisgICAgICAjIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBVUkkuCisgICAgICAjIEhvd2V2ZXIsIHRoZSBmaXJzdCBjb21wb25lbnQgZ2VuZXJhbGx5IGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gdGhlIGRpcmVjdG9yeSwKKyAgICAgICMgYW5kIHRoZSBzZWNvbmQgdG8gdGhlIGJhc2VuYW1lLCBvZiB0aGUgVVJJLgorICAgICAgIworICAgICAgIyBOb3RlIHRoYXQga2V5cyBtdXN0IGJlIHVuaXF1ZSAqYWNyb3NzIGltcG9ydGVycyouCisgICAgICAjIFRodXMgaXQncyBwcm9iYWJseSBhIGdvb2QgaWRlYSB0byBpbmNsdWRlIHRoZSBpbXBvcnRlciBuYW1lCisgICAgICAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGNvbXBvbmVudC4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHVyaSBbU3RyaW5nXSBBIFVSSSBrbm93biB0byBiZSB2YWxpZCBmb3IgdGhpcyBpbXBvcnRlci4KKyAgICAgICMgQHBhcmFtIG9wdGlvbnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gT3B0aW9ucyBmb3IgdGhlIFNhc3MgZmlsZQorICAgICAgIyAgIGNvbnRhaW5pbmcgdGhlIGBAaW1wb3J0YCBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZC4KKyAgICAgICMgQHJldHVybiBbKFN0cmluZywgU3RyaW5nKV0gVGhlIGtleSBwYWlyIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMKKyAgICAgICMgICB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gVVJJLgorICAgICAgZGVmIGtleSh1cmksIG9wdGlvbnMpCisgICAgICAgIFNhc3M6OlV0aWwuYWJzdHJhY3Qoc2VsZikKKyAgICAgIGVuZAorCisgICAgICAjIEdldCB0aGUgcHVibGljbHktdmlzaWJsZSBVUkwgZm9yIGFuIGltcG9ydGVkIGZpbGUuIFRoaXMgVVJMIGlzIHVzZWQgYnkKKyAgICAgICMgc291cmNlIG1hcHMgdG8gbGluayB0byB0aGUgc291cmNlIHN0eWxlc2hlZXQuIFRoaXMgbWF5IHJldHVybiBgbmlsYCB0bworICAgICAgIyBpbmRpY2F0ZSB0aGF0IG5vIHB1YmxpYyBVUkwgaXMgYXZhaWxhYmxlOyBob3dldmVyLCB0aGlzIHdpbGwgY2F1c2UKKyAgICAgICMgc291cmNlbWFwIGdlbmVyYXRpb24gdG8gZmFpbCBpZiBhbnkgQ1NTIGlzIGdlbmVyYXRlZCBmcm9tIGZpbGVzIGltcG9ydGVkCisgICAgICAjIGZyb20gdGhpcyBpbXBvcnRlci4KKyAgICAgICMKKyAgICAgICMgSWYgYW4gYWJzb2x1dGUgImZpbGU6IiBVUkkgY2FuIGJlIHByb2R1Y2VkIGZvciBhbiBpbXBvcnRlZCBmaWxlLCB0aGF0CisgICAgICAjIHNob3VsZCBiZSBwcmVmZXJyZWQgdG8gcmV0dXJuaW5nIGBuaWxgLiBIb3dldmVyLCBhIFVSTCByZWxhdGl2ZSB0bworICAgICAgIyBgc291cmNlbWFwX2RpcmVjdG9yeWAgc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyIGFuIGFic29sdXRlICJmaWxlOiIgVVJJLgorICAgICAgIworICAgICAgIyBAcGFyYW0gdXJpIFtTdHJpbmddIEEgVVJJIGtub3duIHRvIGJlIHZhbGlkIGZvciB0aGlzIGltcG9ydGVyLgorICAgICAgIyBAcGFyYW0gc291cmNlbWFwX2RpcmVjdG9yeSBbU3RyaW5nLCBOaWxDbGFzc10gVGhlIGFic29sdXRlIHBhdGggdG8gYQorICAgICAgIyAgIGRpcmVjdG9yeSBvbiBkaXNrIHdoZXJlIHRoZSBzb3VyY2VtYXAgd2lsbCBiZSBzYXZlZC4gSWYgdXJpIHJlZmVycyB0bworICAgICAgIyAgIGEgZmlsZSBvbiBkaXNrIHRoYXQncyBhY2Nlc3NpYmxlIHJlbGF0aXZlIHRvIHNvdXJjZW1hcF9kaXJlY3RvcnksIHRoaXMKKyAgICAgICMgICBtYXkgcmV0dXJuIGEgcmVsYXRpdmUgVVJMLiBUaGlzIG1heSBiZSBgbmlsYCBpZiB0aGUgc291cmNlbWFwJ3MKKyAgICAgICMgICBldmVudHVhbCBsb2NhdGlvbiBpcyB1bmtub3duLgorICAgICAgIyBAcmV0dXJuIFtTdHJpbmc/XSBUaGUgcHVibGljbHktdmlzaWJsZSBVUkwgZm9yIHRoaXMgZmlsZSwgb3IgYG5pbGAKKyAgICAgICMgICBpbmRpY2F0aW5nIHRoYXQgbm8gcHVibGljbHktdmlzaWJsZSBVUkwgZXhpc3RzLiBUaGlzIHNob3VsZCBiZQorICAgICAgIyAgIGFwcHJvcHJpYXRlbHkgVVJMLWVzY2FwZWQuCisgICAgICBkZWYgcHVibGljX3VybCh1cmksIHNvdXJjZW1hcF9kaXJlY3RvcnkpCisgICAgICAgIHJldHVybiBpZiBAcHVibGljX3VybF93YXJuaW5nX2lzc3VlZAorICAgICAgICBAcHVibGljX3VybF93YXJuaW5nX2lzc3VlZCA9IHRydWUKKyAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gPDxXQVJOSU5HCitXQVJOSU5HOiAje3NlbGYuY2xhc3MubmFtZX0gc2hvdWxkIGRlZmluZSB0aGUgI3B1YmxpY191cmwgbWV0aG9kLgorV0FSTklORworICAgICAgICBuaWwKKyAgICAgIGVuZAorCisgICAgICAjIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbXBvcnRlci4KKyAgICAgICMgU2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgICMKKyAgICAgICMgVGhpcyBpcyB1c2VkIHRvIGhlbHAgZGVidWdnaW5nLAorICAgICAgIyBhbmQgc2hvdWxkIHVzdWFsbHkganVzdCBzaG93IHRoZSBsb2FkIHBhdGggZW5jYXBzdWxhdGVkIGJ5IHRoaXMgaW1wb3J0ZXIuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgIGRlZiB0b19zCisgICAgICAgIFNhc3M6OlV0aWwuYWJzdHJhY3Qoc2VsZikKKyAgICAgIGVuZAorCisgICAgICAjIElmIHRoZSBpbXBvcnRlciBpcyBiYXNlZCBvbiBmaWxlcyBvbiB0aGUgbG9jYWwgZmlsZXN5c3RlbQorICAgICAgIyB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGZvbGRlcnMgd2hpY2ggc2hvdWxkIGJlIHdhdGNoZWQKKyAgICAgICMgZm9yIGNoYW5nZXMuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZz5dIExpc3Qgb2YgYWJzb2x1dGUgcGF0aHMgb2YgZGlyZWN0b3JpZXMgdG8gd2F0Y2gKKyAgICAgIGRlZiBkaXJlY3Rvcmllc190b193YXRjaAorICAgICAgICBbXQorICAgICAgZW5kCisKKyAgICAgICMgSWYgdGhpcyBpbXBvcnRlciBpcyBiYXNlZCBvbiBmaWxlcyBvbiB0aGUgbG9jYWwgZmlsZXN5c3RlbSBUaGlzIG1ldGhvZAorICAgICAgIyBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUsIHdoZW4gY2hhbmdlZCwgc2hvdWxkIHRyaWdnZXIgYQorICAgICAgIyByZWNvbXBpbGUuCisgICAgICAjCisgICAgICAjIEl0IGlzIGFjY2VwdGFibGUgZm9yIG5vbi1zYXNzIGZpbGVzIHRvIGJlIHdhdGNoZWQgYW5kIHRyaWdnZXIgYSByZWNvbXBpbGUuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBmaWxlbmFtZSBbU3RyaW5nXSBUaGUgYWJzb2x1dGUgZmlsZW5hbWUgZm9yIGEgZmlsZSB0aGF0IGhhcyBjaGFuZ2VkLgorICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGVuIHRoZSBmaWxlIGNoYW5nZWQgc2hvdWxkIGNhdXNlIGEgcmVjb21waWxlLgorICAgICAgZGVmIHdhdGNoZWRfZmlsZT8oZmlsZW5hbWUpCisgICAgICAgIGZhbHNlCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvaW1wb3J0ZXJzL2RlcHJlY2F0ZWRfcGF0aC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvaW1wb3J0ZXJzL2RlcHJlY2F0ZWRfcGF0aC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODE3YzlkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9pbXBvcnRlcnMvZGVwcmVjYXRlZF9wYXRoLnJiCkBAIC0wLDAgKzEsNTEgQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBJbXBvcnRlcnMKKyAgICAjIFRoaXMgaW1wb3J0ZXIgZW1pdHMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHRoZSBmaXJzdCB0aW1lIGl0IGlzIHVzZWQgdG8KKyAgICAjIGltcG9ydCBhIGZpbGUuIEl0IGlzIHVzZWQgdG8gZGVwcmVjYXRlIHRoZSBjdXJyZW50IHdvcmtpbmcKKyAgICAjIGRpcmVjdG9yeSBmcm9tIHRoZSBsaXN0IG9mIGF1dG9tYXRpYyBzYXNzIGxvYWQgcGF0aHMuCisgICAgY2xhc3MgRGVwcmVjYXRlZFBhdGggPCBGaWxlc3lzdGVtCisgICAgICAjIEBwYXJhbSByb290IFtTdHJpbmddIFRoZSBhYnNvbHV0ZSwgZXhwYW5kZWQgcGF0aCB0byB0aGUgZm9sZGVyIHRoYXQgaXMgZGVwcmVjYXRlZC4KKyAgICAgIGRlZiBpbml0aWFsaXplKHJvb3QpCisgICAgICAgIEBzcGVjaWZpZWRfcm9vdCA9IHJvb3QKKyAgICAgICAgQHdhcm5pbmdfZ2l2ZW4gPSBmYWxzZQorICAgICAgICBzdXBlcgorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBTYXNzOjpJbXBvcnRlcnM6OkJhc2UjZmluZAorICAgICAgZGVmIGZpbmQoKmFyZ3MpCisgICAgICAgIGZvdW5kID0gc3VwZXIKKyAgICAgICAgaWYgZm91bmQgJiYgIUB3YXJuaW5nX2dpdmVuCisgICAgICAgICAgQHdhcm5pbmdfZ2l2ZW4gPSB0cnVlCisgICAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gZGVwcmVjYXRpb25fd2FybmluZworICAgICAgICBlbmQKKyAgICAgICAgZm91bmQKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQmFzZSNkaXJlY3Rvcmllc190b193YXRjaAorICAgICAgZGVmIGRpcmVjdG9yaWVzX3RvX3dhdGNoCisgICAgICAgICMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2FzIG5vdCB3YXRjaGVkIGluIFNhc3MgMy4yLAorICAgICAgICAjIHNvIHdlIGNvbnRpbnVlIG5vdCB0byB3YXRjaCBpdCB3aGlsZSBpdCdzIGRlcHJlY2F0ZWQuCisgICAgICAgIFtdCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIFNhc3M6OkltcG9ydGVyczo6QmFzZSN0b19zCisgICAgICBkZWYgdG9fcworICAgICAgICAiI3tAcm9vdH0gKERFUFJFQ0FURUQpIgorICAgICAgZW5kCisKKyAgICAgIHByb3RlY3RlZAorCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcgdGhhdCB3aWxsIGJlIHByaW50ZWQgdGhlIGZpcnN0CisgICAgICAjICAgdGltZSBhbiBpbXBvcnQgb2NjdXJzLgorICAgICAgZGVmIGRlcHJlY2F0aW9uX3dhcm5pbmcKKyAgICAgICAgcGF0aCA9IEBzcGVjaWZpZWRfcm9vdCA9PSAiLiIgPyAidGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiIDogQHNwZWNpZmllZF9yb290CisgICAgICAgIDw8V0FSTklORworREVQUkVDQVRJT04gV0FSTklORzogSW1wb3J0aW5nIGZyb20gI3twYXRofSB3aWxsIG5vdCBiZQorYXV0b21hdGljIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLiAgVG8gYXZvaWQgZnV0dXJlIGVycm9ycywgeW91IGNhbiBhZGQgaXQKK3RvIHlvdXIgZW52aXJvbm1lbnQgZXhwbGljaXRseSBieSBzZXR0aW5nIGBTQVNTX1BBVEg9I3tAc3BlY2lmaWVkX3Jvb3R9YCwgYnkgdXNpbmcgdGhlIC1JIGNvbW1hbmQKK2xpbmUgb3B0aW9uLCBvciBieSBjaGFuZ2luZyB5b3VyIFNhc3MgY29uZmlndXJhdGlvbiBvcHRpb25zLgorV0FSTklORworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2ltcG9ydGVycy9maWxlc3lzdGVtLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9pbXBvcnRlcnMvZmlsZXN5c3RlbS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTRkYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9pbXBvcnRlcnMvZmlsZXN5c3RlbS5yYgpAQCAtMCwwICsxLDIxOSBAQAorcmVxdWlyZSAnc2V0JworCittb2R1bGUgU2FzcworICBtb2R1bGUgSW1wb3J0ZXJzCisgICAgIyBUaGUgZGVmYXVsdCBpbXBvcnRlciwgdXNlZCBmb3IgYW55IHN0cmluZ3MgZm91bmQgaW4gdGhlIGxvYWQgcGF0aC4KKyAgICAjIFNpbXBseSBsb2FkcyBTYXNzIGZpbGVzIGZyb20gdGhlIGZpbGVzeXN0ZW0gdXNpbmcgdGhlIGRlZmF1bHQgbG9naWMuCisgICAgY2xhc3MgRmlsZXN5c3RlbSA8IEJhc2UKKyAgICAgIGF0dHJfYWNjZXNzb3IgOnJvb3QKKworICAgICAgIyBDcmVhdGVzIGEgbmV3IGZpbGVzeXN0ZW0gaW1wb3J0ZXIgdGhhdCBpbXBvcnRzIGZpbGVzIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gcGF0aC4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHJvb3QgW1N0cmluZ10gVGhlIHJvb3QgcGF0aC4KKyAgICAgICMgICBUaGlzIGltcG9ydGVyIHdpbGwgaW1wb3J0IGZpbGVzIHJlbGF0aXZlIHRvIHRoaXMgcGF0aC4KKyAgICAgIGRlZiBpbml0aWFsaXplKHJvb3QpCisgICAgICAgIEByb290ID0gRmlsZS5leHBhbmRfcGF0aChyb290KQorICAgICAgICBAcmVhbF9yb290ID0gU2Fzczo6VXRpbC5yZWFscGF0aChAcm9vdCkudG9fcworICAgICAgICBAc2FtZV9uYW1lX3dhcm5pbmdzID0gU2V0Lm5ldworICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBCYXNlI2ZpbmRfcmVsYXRpdmUKKyAgICAgIGRlZiBmaW5kX3JlbGF0aXZlKG5hbWUsIGJhc2UsIG9wdGlvbnMpCisgICAgICAgIF9maW5kKEZpbGUuZGlybmFtZShiYXNlKSwgbmFtZSwgb3B0aW9ucykKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQmFzZSNmaW5kCisgICAgICBkZWYgZmluZChuYW1lLCBvcHRpb25zKQorICAgICAgICBfZmluZChAcm9vdCwgbmFtZSwgb3B0aW9ucykKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQmFzZSNtdGltZQorICAgICAgZGVmIG10aW1lKG5hbWUsIG9wdGlvbnMpCisgICAgICAgIGZpbGUsIF8gPSBTYXNzOjpVdGlsLmRlc3RydWN0dXJlKGZpbmRfcmVhbF9maWxlKEByb290LCBuYW1lLCBvcHRpb25zKSkKKyAgICAgICAgRmlsZS5tdGltZShmaWxlKSBpZiBmaWxlCisgICAgICByZXNjdWUgRXJybm86OkVOT0VOVAorICAgICAgICBuaWwKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQmFzZSNrZXkKKyAgICAgIGRlZiBrZXkobmFtZSwgb3B0aW9ucykKKyAgICAgICAgW3NlbGYuY2xhc3MubmFtZSArICI6IiArIEZpbGUuZGlybmFtZShGaWxlLmV4cGFuZF9wYXRoKG5hbWUpKSwKKyAgICAgICAgIEZpbGUuYmFzZW5hbWUobmFtZSldCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIEJhc2UjdG9fcworICAgICAgZGVmIHRvX3MKKyAgICAgICAgQHJvb3QKKyAgICAgIGVuZAorCisgICAgICBkZWYgaGFzaAorICAgICAgICBAcm9vdC5oYXNoCisgICAgICBlbmQKKworICAgICAgZGVmIGVxbD8ob3RoZXIpCisgICAgICAgICFvdGhlci5uaWw/ICYmIG90aGVyLnJlc3BvbmRfdG8/KDpyb290KSAmJiByb290LmVxbD8ob3RoZXIucm9vdCkKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQmFzZSNkaXJlY3Rvcmllc190b193YXRjaAorICAgICAgZGVmIGRpcmVjdG9yaWVzX3RvX3dhdGNoCisgICAgICAgIFtyb290XQorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBCYXNlI3dhdGNoZWRfZmlsZT8KKyAgICAgIGRlZiB3YXRjaGVkX2ZpbGU/KGZpbGVuYW1lKQorICAgICAgICAjIENoZWNrIGFnYWluc3QgdGhlIHJvb3Qgd2l0aCBzeW1saW5rcyByZXNvbHZlZCwgc2luY2UgTGlzdGVuCisgICAgICAgICMgcmV0dXJucyBmdWxseS1yZXNvbHZlZCBwYXRocy4KKyAgICAgICAgZmlsZW5hbWUgPX4gL1wuc1thY11zcyQvICYmIGZpbGVuYW1lLnN0YXJ0X3dpdGg/KEByZWFsX3Jvb3QgKyBGaWxlOjpTRVBBUkFUT1IpCisgICAgICBlbmQKKworICAgICAgZGVmIHB1YmxpY191cmwobmFtZSwgc291cmNlbWFwX2RpcmVjdG9yeSkKKyAgICAgICAgZmlsZV9wYXRobmFtZSA9IFNhc3M6OlV0aWwuY2xlYW5wYXRoKEZpbGUuYWJzb2x1dGVfcGF0aChuYW1lLCBAcm9vdCkpCisgICAgICAgIHJldHVybiBTYXNzOjpVdGlsLmZpbGVfdXJpX2Zyb21fcGF0aChmaWxlX3BhdGhuYW1lKSBpZiBzb3VyY2VtYXBfZGlyZWN0b3J5Lm5pbD8KKworICAgICAgICBzb3VyY2VtYXBfcGF0aG5hbWUgPSBTYXNzOjpVdGlsLmNsZWFucGF0aChzb3VyY2VtYXBfZGlyZWN0b3J5KQorICAgICAgICBiZWdpbgorICAgICAgICAgIFNhc3M6OlV0aWwuZmlsZV91cmlfZnJvbV9wYXRoKAorICAgICAgICAgICAgU2Fzczo6VXRpbC5yZWxhdGl2ZV9wYXRoX2Zyb20oZmlsZV9wYXRobmFtZSwgc291cmNlbWFwX3BhdGhuYW1lKSkKKyAgICAgICAgcmVzY3VlIEFyZ3VtZW50RXJyb3IgIyB3aGVuIGEgcmVsYXRpdmUgcGF0aCBjYW5ub3QgYmUgY29uc3RydWN0ZWQKKyAgICAgICAgICBTYXNzOjpVdGlsLmZpbGVfdXJpX2Zyb21fcGF0aChmaWxlX3BhdGhuYW1lKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBwcm90ZWN0ZWQKKworICAgICAgIyBJZiBhIGZ1bGwgdXJpIGlzIHBhc3NlZCwgdGhpcyByZW1vdmVzIHRoZSByb290IGZyb20gaXQKKyAgICAgICMgb3RoZXJ3aXNlIHJldHVybnMgdGhlIG5hbWUgdW5jaGFuZ2VkCisgICAgICBkZWYgcmVtb3ZlX3Jvb3QobmFtZSkKKyAgICAgICAgaWYgbmFtZS5pbmRleChAcm9vdCArICIvIikgPT0gMAorICAgICAgICAgIG5hbWVbKEByb290Lmxlbmd0aCArIDEpLi4tMV0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG5hbWUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBBIGhhc2ggZnJvbSBmaWxlIGV4dGVuc2lvbnMgdG8gdGhlIHN5bnRheGVzIGZvciB0aG9zZSBleHRlbnNpb25zLgorICAgICAgIyBUaGUgc3ludGF4ZXMgbXVzdCBiZSBgOnNhc3NgIG9yIGA6c2Nzc2AuCisgICAgICAjCisgICAgICAjIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0aGF0IHdhbnQgbm9ybWFsIGZpbGVzeXN0ZW0gaW1wb3J0aW5nCisgICAgICAjIHdpdGggdW51c3VhbCBleHRlbnNpb25zLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFt7U3RyaW5nID0+IFN5bWJvbH1dCisgICAgICBkZWYgZXh0ZW5zaW9ucworICAgICAgICB7J3Nhc3MnID0+IDpzYXNzLCAnc2NzcycgPT4gOnNjc3N9CisgICAgICBlbmQKKworICAgICAgIyBHaXZlbiBhbiBgQGltcG9ydGBlZCBwYXRoLCByZXR1cm5zIGFuIGFycmF5IG9mIHBvc3NpYmxlCisgICAgICAjIG9uLWRpc2sgZmlsZW5hbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHN5bnRheGVzIGZvciB0aGF0IHBhdGguCisgICAgICAjCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBmaWxlbmFtZS4KKyAgICAgICMgQHJldHVybiBbQXJyYXkoU3RyaW5nLCBTeW1ib2wpXSBBbiBhcnJheSBvZiBwYWlycy4KKyAgICAgICMgICBUaGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHBhaXIgaXMgYSBmaWxlbmFtZSB0byBsb29rIGZvcjsKKyAgICAgICMgICB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIHN5bnRheCB0aGF0IGZpbGUgd291bGQgYmUgaW4gKGA6c2Fzc2Agb3IgYDpzY3NzYCkuCisgICAgICBkZWYgcG9zc2libGVfZmlsZXMobmFtZSkKKyAgICAgICAgbmFtZSA9IGVzY2FwZV9nbG9iX2NoYXJhY3RlcnMobmFtZSkKKyAgICAgICAgZGlybmFtZSwgYmFzZW5hbWUsIGV4dG5hbWUgPSBzcGxpdChuYW1lKQorICAgICAgICBzb3J0ZWRfZXh0cyA9IGV4dGVuc2lvbnMuc29ydAorICAgICAgICBzeW50YXggPSBleHRlbnNpb25zW2V4dG5hbWVdCisKKyAgICAgICAgaWYgc3ludGF4CisgICAgICAgICAgcmV0ID0gW1siI3tkaXJuYW1lfS97Xyx9I3tiYXNlbmFtZX0uI3tleHRlbnNpb25zLmludmVydFtzeW50YXhdfSIsIHN5bnRheF1dCisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXQgPSBzb3J0ZWRfZXh0cy5tYXAge3xleHQsIHN5bnwgWyIje2Rpcm5hbWV9L3tfLH0je2Jhc2VuYW1lfS4je2V4dH0iLCBzeW5dfQorICAgICAgICBlbmQKKworICAgICAgICAjIEpSdWJ5IGNob2tlcyB3aGVuIHRyeWluZyB0byBpbXBvcnQgZmlsZXMgZnJvbSBKQVJzIHdoZW4gdGhlIHBhdGggc3RhcnRzIHdpdGggJy4vJy4KKyAgICAgICAgcmV0Lm1hcCB7fGYsIHN8IFtmLnN1YiglcnteXC4vfSwgJycpLCBzXX0KKyAgICAgIGVuZAorCisgICAgICBkZWYgZXNjYXBlX2dsb2JfY2hhcmFjdGVycyhuYW1lKQorICAgICAgICBuYW1lLmdzdWIoL1tcKlxbXF1ce1x9XD9dLykgZG8gfGNoYXJ8CisgICAgICAgICAgIlxcI3tjaGFyfSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgUkVEVU5EQU5UX0RJUkVDVE9SWSA9IC8je1JlZ2V4cC5lc2NhcGUoRmlsZTo6U0VQQVJBVE9SKX1cLiN7UmVnZXhwLmVzY2FwZShGaWxlOjpTRVBBUkFUT1IpfS8KKyAgICAgICMgR2l2ZW4gYSBiYXNlIGRpcmVjdG9yeSBhbmQgYW4gYEBpbXBvcnRgZWQgbmFtZSwKKyAgICAgICMgZmluZHMgYW4gZXhpc3RlbnQgZmlsZSB0aGF0IG1hdGNoZXMgdGhlIG5hbWUuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBkaXIgW1N0cmluZ10gVGhlIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB3aGljaCB0byBzZWFyY2guCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBmaWxlbmFtZSB0byBzZWFyY2ggZm9yLgorICAgICAgIyBAcmV0dXJuIFsoU3RyaW5nLCBTeW1ib2wpXSBBIGZpbGVuYW1lLXN5bnRheCBwYWlyLgorICAgICAgZGVmIGZpbmRfcmVhbF9maWxlKGRpciwgbmFtZSwgb3B0aW9ucykKKyAgICAgICAgIyBPbiB3aW5kb3dzICdkaXInIG9yICduYW1lJyBjYW4gYmUgaW4gbmF0aXZlIEZpbGU6OkFMVF9TRVBBUkFUT1IgZm9ybS4KKyAgICAgICAgZGlyID0gZGlyLmdzdWIoRmlsZTo6QUxUX1NFUEFSQVRPUiwgRmlsZTo6U0VQQVJBVE9SKSB1bmxlc3MgRmlsZTo6QUxUX1NFUEFSQVRPUi5uaWw/CisgICAgICAgIG5hbWUgPSBuYW1lLmdzdWIoRmlsZTo6QUxUX1NFUEFSQVRPUiwgRmlsZTo6U0VQQVJBVE9SKSB1bmxlc3MgRmlsZTo6QUxUX1NFUEFSQVRPUi5uaWw/CisKKyAgICAgICAgZm91bmQgPSBwb3NzaWJsZV9maWxlcyhyZW1vdmVfcm9vdChuYW1lKSkubWFwIGRvIHxmLCBzfAorICAgICAgICAgIHBhdGggPSBpZiBkaXIgPT0gIi4iIHx8IFNhc3M6OlV0aWwucGF0aG5hbWUoZikuYWJzb2x1dGU/CisgICAgICAgICAgICAgICAgICAgZgorICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIiN7ZXNjYXBlX2dsb2JfY2hhcmFjdGVycyhkaXIpfS8je2Z9IgorICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICBEaXJbcGF0aF0ubWFwIGRvIHxmdWxsX3BhdGh8CisgICAgICAgICAgICBmdWxsX3BhdGguZ3N1YiEoUkVEVU5EQU5UX0RJUkVDVE9SWSwgRmlsZTo6U0VQQVJBVE9SKQorICAgICAgICAgICAgW1Nhc3M6OlV0aWwuY2xlYW5wYXRoKGZ1bGxfcGF0aCkudG9fcywgc10KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kLmZsYXR0ZW4oMSkKKyAgICAgICAgcmV0dXJuIGlmIGZvdW5kLmVtcHR5PworCisgICAgICAgIGlmIGZvdW5kLnNpemUgPiAxICYmICFAc2FtZV9uYW1lX3dhcm5pbmdzLmluY2x1ZGU/KGZvdW5kLmZpcnN0LmZpcnN0KQorICAgICAgICAgIGZvdW5kLmVhY2gge3woZiwgXyl8IEBzYW1lX25hbWVfd2FybmluZ3MgPDwgZn0KKyAgICAgICAgICByZWxhdGl2ZV90byA9IFNhc3M6OlV0aWwucGF0aG5hbWUoZGlyKQorICAgICAgICAgIGlmIG9wdGlvbnNbOl9mcm9tX2ltcG9ydF9ub2RlXQorICAgICAgICAgICAgIyBJZiBfbGluZSBleGlzdHMsIHdlJ3JlIGhlcmUgZHVlIHRvIGFuIGFjdHVhbCBpbXBvcnQgaW4gYW4KKyAgICAgICAgICAgICMgaW1wb3J0X25vZGUgYW5kIHdlIHdhbnQgdG8gcHJpbnQgYSB3YXJuaW5nIGZvciBhIHVzZXIgd3JpdGluZyBhbgorICAgICAgICAgICAgIyBhbWJpZ3VvdXMgaW1wb3J0LgorICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGZvdW5kLm1hcCBkbyB8KGYsIF8pfAorICAgICAgICAgICAgICAiICAiICsgU2Fzczo6VXRpbC5wYXRobmFtZShmKS5yZWxhdGl2ZV9wYXRoX2Zyb20ocmVsYXRpdmVfdG8pLnRvX3MKKyAgICAgICAgICAgIGVuZC5qb2luKCJcbiIpCisgICAgICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoPDxNRVNTQUdFKQorSXQncyBub3QgY2xlYXIgd2hpY2ggZmlsZSB0byBpbXBvcnQgZm9yICdAaW1wb3J0ICIje25hbWV9IicuCitDYW5kaWRhdGVzOgorI3tjYW5kaWRhdGVzfQorUGxlYXNlIGRlbGV0ZSBvciByZW5hbWUgYWxsIGJ1dCBvbmUgb2YgdGhlc2UgZmlsZXMuCitNRVNTQUdFCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBPdGhlcndpc2UsIHdlJ3JlIGhlcmUgdmlhIFN0YWxlbmVzc0NoZWNrZXIsIGFuZCB3ZSB3YW50IHRvIHByaW50IGEKKyAgICAgICAgICAgICMgd2FybmluZyBmb3IgYSB1c2VyIHJ1bm5pbmcgYHNhc3MgLS13YXRjaGAgd2l0aCB0d28gYW1iaWd1b3VzIGZpbGVzLgorICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGZvdW5kLm1hcCB7fChmLCBfKXwgIiAgICAiICsgRmlsZS5iYXNlbmFtZShmKX0uam9pbigiXG4iKQorICAgICAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gPDxXQVJOSU5HCitXQVJOSU5HOiBJbiAje0ZpbGUuZGlybmFtZShuYW1lKX06CisgIFRoZXJlIGFyZSBtdWx0aXBsZSBmaWxlcyB0aGF0IG1hdGNoIHRoZSBuYW1lICIje0ZpbGUuYmFzZW5hbWUobmFtZSl9IjoKKyN7Y2FuZGlkYXRlc30KK1dBUk5JTkcKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIGZvdW5kLmZpcnN0CisgICAgICBlbmQKKworICAgICAgIyBTcGxpdHMgYSBmaWxlbmFtZSBpbnRvIHRocmVlIHBhcnRzLCBhIGRpcmVjdG9yeSBwYXJ0LCBhIGJhc2VuYW1lLCBhbmQgYW4gZXh0ZW5zaW9uCisgICAgICAjIE9ubHkgdGhlIGtub3duIGV4dGVuc2lvbnMgcmV0dXJuZWQgZnJvbSB0aGUgZXh0ZW5zaW9ucyBtZXRob2Qgd2lsbCBiZSByZWNvZ25pemVkIGFzIHN1Y2guCisgICAgICBkZWYgc3BsaXQobmFtZSkKKyAgICAgICAgZXh0ZW5zaW9uID0gbmlsCisgICAgICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gRmlsZS5kaXJuYW1lKG5hbWUpLCBGaWxlLmJhc2VuYW1lKG5hbWUpCisgICAgICAgIGlmIGJhc2VuYW1lID1+IC9eKC4qKVwuKCN7ZXh0ZW5zaW9ucy5rZXlzLm1hcCB7fGV8IFJlZ2V4cC5lc2NhcGUoZSl9LmpvaW4oJ3wnKX0pJC8KKyAgICAgICAgICBiYXNlbmFtZSA9ICQxCisgICAgICAgICAgZXh0ZW5zaW9uID0gJDIKKyAgICAgICAgZW5kCisgICAgICAgIFtkaXJuYW1lLCBiYXNlbmFtZSwgZXh0ZW5zaW9uXQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgZGVmIF9maW5kKGRpciwgbmFtZSwgb3B0aW9ucykKKyAgICAgICAgZnVsbF9maWxlbmFtZSwgc3ludGF4ID0gU2Fzczo6VXRpbC5kZXN0cnVjdHVyZShmaW5kX3JlYWxfZmlsZShkaXIsIG5hbWUsIG9wdGlvbnMpKQorICAgICAgICByZXR1cm4gdW5sZXNzIGZ1bGxfZmlsZW5hbWUgJiYgRmlsZS5yZWFkYWJsZT8oZnVsbF9maWxlbmFtZSkKKworICAgICAgICAjIFRPRE86IHRoaXMgcHJlc2VydmVzIGhpc3RvcmljYWwgYmVoYXZpb3IsIGJ1dCBpdCdzIHBvc3NpYmxlCisgICAgICAgICMgOmZpbGVuYW1lIHNob3VsZCBiZSBlaXRoZXIgbm9ybWFsaXplZCB0byB0aGUgbmF0aXZlIGZvcm1hdAorICAgICAgICAjIG9yIGNvbnNpc3RlbnRseSBVUkktZm9ybWF0LgorICAgICAgICBmdWxsX2ZpbGVuYW1lID0gZnVsbF9maWxlbmFtZS50cigiXFwiLCAiLyIpIGlmIFNhc3M6OlV0aWwud2luZG93cz8KKworICAgICAgICBvcHRpb25zWzpzeW50YXhdID0gc3ludGF4CisgICAgICAgIG9wdGlvbnNbOmZpbGVuYW1lXSA9IGZ1bGxfZmlsZW5hbWUKKyAgICAgICAgb3B0aW9uc1s6aW1wb3J0ZXJdID0gc2VsZgorICAgICAgICBTYXNzOjpFbmdpbmUubmV3KEZpbGUucmVhZChmdWxsX2ZpbGVuYW1lKSwgb3B0aW9ucykKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9sb2dnZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2xvZ2dlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjBmZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9sb2dnZXIucmIKQEAgLTAsMCArMSwxNyBAQAorbW9kdWxlIFNhc3M6OkxvZ2dlcjsgZW5kCisKK3JlcXVpcmUgInNhc3MvbG9nZ2VyL2xvZ19sZXZlbCIKK3JlcXVpcmUgInNhc3MvbG9nZ2VyL2Jhc2UiCityZXF1aXJlICJzYXNzL2xvZ2dlci9kZWxheWVkIgorCittb2R1bGUgU2FzcworICBjbGFzcyA8PCBzZWxmCisgICAgZGVmIGxvZ2dlcj0obCkKKyAgICAgIFRocmVhZC5jdXJyZW50WzpzYXNzX2xvZ2dlcl0gPSBsCisgICAgZW5kCisKKyAgICBkZWYgbG9nZ2VyCisgICAgICBUaHJlYWQuY3VycmVudFs6c2Fzc19sb2dnZXJdIHx8PSBTYXNzOjpMb2dnZXI6OkJhc2UubmV3CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2xvZ2dlci9iYXNlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9sb2dnZXIvYmFzZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzYyMjRjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9sb2dnZXIvYmFzZS5yYgpAQCAtMCwwICsxLDM2IEBACityZXF1aXJlICdzYXNzL2xvZ2dlci9sb2dfbGV2ZWwnCisKK2NsYXNzIFNhc3M6OkxvZ2dlcjo6QmFzZQorICBpbmNsdWRlIFNhc3M6OkxvZ2dlcjo6TG9nTGV2ZWwKKworICBhdHRyX2FjY2Vzc29yIDpsb2dfbGV2ZWwKKyAgYXR0cl9hY2Nlc3NvciA6ZGlzYWJsZWQKKyAgYXR0cl9hY2Nlc3NvciA6aW8KKworICBsb2dfbGV2ZWwgOnRyYWNlCisgIGxvZ19sZXZlbCA6ZGVidWcKKyAgbG9nX2xldmVsIDppbmZvCisgIGxvZ19sZXZlbCA6d2FybgorICBsb2dfbGV2ZWwgOmVycm9yCisKKyAgZGVmIGluaXRpYWxpemUobG9nX2xldmVsID0gOmRlYnVnLCBpbyA9IG5pbCkKKyAgICBzZWxmLmxvZ19sZXZlbCA9IGxvZ19sZXZlbAorICAgIHNlbGYuaW8gPSBpbworICBlbmQKKworICBkZWYgbG9nZ2luZ19sZXZlbD8obGV2ZWwpCisgICAgIWRpc2FibGVkICYmIHNlbGYuY2xhc3MubG9nX2xldmVsPyhsZXZlbCwgbG9nX2xldmVsKQorICBlbmQKKworICBkZWYgbG9nKGxldmVsLCBtZXNzYWdlKQorICAgIF9sb2cobGV2ZWwsIG1lc3NhZ2UpIGlmIGxvZ2dpbmdfbGV2ZWw/KGxldmVsKQorICBlbmQKKworICBkZWYgX2xvZyhsZXZlbCwgbWVzc2FnZSkKKyAgICBpZiBpbworICAgICAgaW8ucHV0cyhtZXNzYWdlKQorICAgIGVsc2UKKyAgICAgIEtlcm5lbC53YXJuKG1lc3NhZ2UpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2xvZ2dlci9kZWxheWVkLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9sb2dnZXIvZGVsYXllZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTNkODk2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9sb2dnZXIvZGVsYXllZC5yYgpAQCAtMCwwICsxLDUwIEBACityZXF1aXJlICdzYXNzL2xvZ2dlci9sb2dfbGV2ZWwnCisKKyMgQSBsb2dnZXIgdGhhdCBkZWxheXMgbWVzc2FnZXMgdW50aWwgdGhleSdyZSBleHBsaWNpdGx5IGZsdXNoZWQgdG8gYW4gaW5uZXIKKyMgbG9nZ2VyLgorIworIyBUaGlzIGNhbiBiZSBpbnN0YWxsZWQgYXJvdW5kIHRoZSBjdXJyZW50IGxvZ2dlciBieSBjYWxsaW5nIFx7I2luc3RhbGwhfSwgYW5kCisjIHRoZSBvcmlnaW5hbCBsb2dnZXIgY2FuIGJlIHJlcGxhY2VkIGJ5IGNhbGxpbmcgXHsjdW5pbnN0YWxsIX0uIFRoZSBsb2cKKyMgbWVzc2FnZXMgY2FuIGJlIGZsdXNoZWQgYnkgY2FsbGluZyBceyNmbHVzaH0uCitjbGFzcyBTYXNzOjpMb2dnZXI6OkRlbGF5ZWQgPCBTYXNzOjpMb2dnZXI6OkJhc2UKKyAgIyBJbnN0YWxscyBhIG5ldyBkZWxheWVkIGxvZ2dlciBhcyB0aGUgY3VycmVudCBTYXNzIGxvZ2dlciwgd3JhcHBpbmcgdGhlCisgICMgb3JpZ2luYWwgbG9nZ2VyLgorICAjCisgICMgVGhpcyBjYW4gYmUgdW5kb25lIGJ5IGNhbGxpbmcgXHsjdW5pbnN0YWxsIX0uCisgICMKKyAgIyBAcmV0dXJuIFtTYXNzOjpMb2dnZXI6OkRlbGF5ZWRdIFRoZSBuZXdseS1jcmVhdGVkIGxvZ2dlci4KKyAgZGVmIHNlbGYuaW5zdGFsbCEKKyAgICBsb2dnZXIgPSBTYXNzOjpMb2dnZXI6OkRlbGF5ZWQubmV3KFNhc3MubG9nZ2VyKQorICAgIFNhc3MubG9nZ2VyID0gbG9nZ2VyCisgICAgbG9nZ2VyCisgIGVuZAorCisgICMgQ3JlYXRlcyBhIGRlbGF5ZWQgbG9nZ2VyIHdyYXBwaW5nIGBpbm5lcmAuCisgICMKKyAgIyBAcGFyYW0gaW5uZXIgW1Nhc3M6OkxvZ2dlcjo6QmFzZV0gVGhlIHdyYXBwZWQgbG9nZ2VyLgorICBkZWYgaW5pdGlhbGl6ZShpbm5lcikKKyAgICBzZWxmLmxvZ19sZXZlbCA9IGlubmVyLmxvZ19sZXZlbAorICAgIEBpbm5lciA9IGlubmVyCisgICAgQG1lc3NhZ2VzID0gW10KKyAgZW5kCisKKyAgIyBGbHVzaGVzIGFsbCBxdWV1ZWQgbG9ncyB0byB0aGUgd3JhcHBlZCBsb2dnZXIuCisgIGRlZiBmbHVzaAorICAgIEBtZXNzYWdlcy5lYWNoIHt8KGwsIG0pfCBAaW5uZXIubG9nKGwsIG0pfQorICBlbmQKKworICAjIFVuaW5zdGFsbHMgdGhpcyBsb2dnZXIgZnJvbSBce1Nhc3MubG9nZ2VyXH0uIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmCisgICMgdGhlIGxvZ2dlciB3YXMgaW5zdGFsbGVkIHVzaW5nIFx7I2luc3RhbGwhfQorICBkZWYgdW5pbnN0YWxsIQorICAgIGlmIFNhc3MubG9nZ2VyICE9IHNlbGYKKyAgICAgIHRocm93IEV4Y2VwdGlvbi5uZXcoIkNhbid0IHVuaW5zdGFsbCBhIGxvZ2dlciB0aGF0J3Mgbm90IGN1cnJlbnRseSBpbnN0YWxsZWQuIikKKyAgICBlbmQKKworICAgIEBpbm5lci5sb2dfbGV2ZWwgPSBsb2dfbGV2ZWwKKyAgICBTYXNzLmxvZ2dlciA9IEBpbm5lcgorICBlbmQKKworICBkZWYgX2xvZyhsZXZlbCwgbWVzc2FnZSkKKyAgICBAbWVzc2FnZXMgPDwgW2xldmVsLCBtZXNzYWdlXQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9sb2dnZXIvbG9nX2xldmVsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9sb2dnZXIvbG9nX2xldmVsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTdjZWMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL2xvZ2dlci9sb2dfbGV2ZWwucmIKQEAgLTAsMCArMSw0NSBAQAorbW9kdWxlIFNhc3MKKyAgbW9kdWxlIExvZ2dlcgorICAgIG1vZHVsZSBMb2dMZXZlbAorICAgICAgZGVmIHNlbGYuaW5jbHVkZWQoYmFzZSkKKyAgICAgICAgYmFzZS5leHRlbmQoQ2xhc3NNZXRob2RzKQorICAgICAgZW5kCisKKyAgICAgIG1vZHVsZSBDbGFzc01ldGhvZHMKKyAgICAgICAgZGVmIGluaGVyaXRlZChzdWJjbGFzcykKKyAgICAgICAgICBzdWJjbGFzcy5sb2dfbGV2ZWxzID0gc3ViY2xhc3Muc3VwZXJjbGFzcy5sb2dfbGV2ZWxzLmR1cAorICAgICAgICBlbmQKKworICAgICAgICBhdHRyX3dyaXRlciA6bG9nX2xldmVscworCisgICAgICAgIGRlZiBsb2dfbGV2ZWxzCisgICAgICAgICAgQGxvZ19sZXZlbHMgfHw9IHt9CisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBsb2dfbGV2ZWw/KGxldmVsLCBtaW5fbGV2ZWwpCisgICAgICAgICAgbG9nX2xldmVsc1tsZXZlbF0gPj0gbG9nX2xldmVsc1ttaW5fbGV2ZWxdCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBsb2dfbGV2ZWwobmFtZSwgb3B0aW9ucyA9IHt9KQorICAgICAgICAgIGlmIG9wdGlvbnNbOnByZXBlbmRdCisgICAgICAgICAgICBsZXZlbCA9IGxvZ19sZXZlbHMudmFsdWVzLm1pbgorICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbC5uaWw/ID8gMCA6IGxldmVsIC0gMQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxldmVsID0gbG9nX2xldmVscy52YWx1ZXMubWF4CisgICAgICAgICAgICBsZXZlbCA9IGxldmVsLm5pbD8gPyAwIDogbGV2ZWwgKyAxCisgICAgICAgICAgZW5kCisgICAgICAgICAgbG9nX2xldmVscy51cGRhdGUobmFtZSA9PiBsZXZlbCkKKyAgICAgICAgICBkZWZpbmVfbG9nZ2VyKG5hbWUpCisgICAgICAgIGVuZAorCisgICAgICAgIGRlZiBkZWZpbmVfbG9nZ2VyKG5hbWUsIG9wdGlvbnMgPSB7fSkKKyAgICAgICAgICBjbGFzc19ldmFsIDw8LVJVQlksIF9fRklMRV9fLCBfX0xJTkVfXyArIDEKKyAgICAgICAgICAgIGRlZiAje25hbWV9KG1lc3NhZ2UpCisgICAgICAgICAgICAgICN7b3B0aW9ucy5mZXRjaCg6dG8sIDpsb2cpfSgje25hbWUuaW5zcGVjdH0sIG1lc3NhZ2UpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBSVUJZCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL21lZGlhLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9tZWRpYS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ1NDJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9tZWRpYS5yYgpAQCAtMCwwICsxLDIxMCBAQAorIyBBIG5hbWVzcGFjZSBmb3IgdGhlIGBAbWVkaWFgIHF1ZXJ5IHBhcnNlIHRyZWUuCittb2R1bGUgU2Fzczo6TWVkaWEKKyAgIyBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHF1ZXJpZXMuCisgICMKKyAgIyAgICAgbWVkaWFfcXVlcnkgWyAnLCcgUyogbWVkaWFfcXVlcnkgXSoKKyAgY2xhc3MgUXVlcnlMaXN0CisgICAgIyBUaGUgcXVlcmllcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFF1ZXJ5Pl0KKyAgICBhdHRyX2FjY2Vzc29yIDpxdWVyaWVzCisKKyAgICAjIEBwYXJhbSBxdWVyaWVzIFtBcnJheTxRdWVyeT5dIFNlZSBceyNxdWVyaWVzfQorICAgIGRlZiBpbml0aWFsaXplKHF1ZXJpZXMpCisgICAgICBAcXVlcmllcyA9IHF1ZXJpZXMKKyAgICBlbmQKKworICAgICMgTWVyZ2VzIHRoaXMgcXVlcnkgbGlzdCB3aXRoIGFub3RoZXIuIFRoZSByZXR1cm5lZCBxdWVyeSBsaXN0CisgICAgIyBxdWVyaWVzIGZvciB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHR3byBpbnB1dHMuCisgICAgIworICAgICMgQm90aCBxdWVyeSBsaXN0cyBzaG91bGQgYmUgcmVzb2x2ZWQuCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtRdWVyeUxpc3RdCisgICAgIyBAcmV0dXJuIFtRdWVyeUxpc3Q/XSBUaGUgbWVyZ2VkIGxpc3QsIG9yIG5pbCBpZiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uCisgICAgZGVmIG1lcmdlKG90aGVyKQorICAgICAgbmV3X3F1ZXJpZXMgPSBxdWVyaWVzLm1hcCB7fHExfCBvdGhlci5xdWVyaWVzLm1hcCB7fHEyfCBxMS5tZXJnZShxMil9fS5mbGF0dGVuLmNvbXBhY3QKKyAgICAgIHJldHVybiBpZiBuZXdfcXVlcmllcy5lbXB0eT8KKyAgICAgIFF1ZXJ5TGlzdC5uZXcobmV3X3F1ZXJpZXMpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIENTUyBmb3IgdGhlIG1lZGlhIHF1ZXJ5IGxpc3QuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGRlZiB0b19jc3MKKyAgICAgIHF1ZXJpZXMubWFwIHt8cXwgcS50b19jc3N9LmpvaW4oJywgJykKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgU2Fzcy9TQ1NTIGNvZGUgZm9yIHRoZSBtZWRpYSBxdWVyeSBsaXN0LgorICAgICMKKyAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIEFuIG9wdGlvbnMgaGFzaCAoc2VlIHtTYXNzOjpDU1MjaW5pdGlhbGl6ZX0pLgorICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGRlZiB0b19zcmMob3B0aW9ucykKKyAgICAgIHF1ZXJpZXMubWFwIHt8cXwgcS50b19zcmMob3B0aW9ucyl9LmpvaW4oJywgJykKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWVyeSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzIGFuZAorICAgICMgcG90ZW50aWFsbHkge1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZX1zIChpZiB0aGVyZSdzIGludGVycG9sYXRpb24gaW4gaXQpLgorICAgICMgV2hlbiB0aGUgaW50ZXJwb2xhdGlvbiBpcyByZXNvbHZlZCBhbmQgdGhlIHN0cmluZ3MgYXJlIGpvaW5lZCB0b2dldGhlciwKKyAgICAjIHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcXVlcnkuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGU+XQorICAgIGRlZiB0b19hCisgICAgICBTYXNzOjpVdGlsLmludGVyc3BlcnNlKHF1ZXJpZXMubWFwIHt8cXwgcS50b19hfSwgJywgJykuZmxhdHRlbgorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoaXMgcXVlcnkgbGlzdCBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtRdWVyeUxpc3RdCisgICAgZGVmIGRlZXBfY29weQorICAgICAgUXVlcnlMaXN0Lm5ldyhxdWVyaWVzLm1hcCB7fHF8IHEuZGVlcF9jb3B5fSkKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBBIHNpbmdsZSBtZWRpYSBxdWVyeS4KKyAgIworICAjICAgICBbIFtPTkxZIHwgTk9UXT8gUyogbWVkaWFfdHlwZSBTKiB8IGV4cHJlc3Npb24gXSBbIEFORCBTKiBleHByZXNzaW9uIF0qCisgIGNsYXNzIFF1ZXJ5CisgICAgIyBUaGUgbW9kaWZpZXIgZm9yIHRoZSBxdWVyeS4KKyAgICAjCisgICAgIyBXaGVuIHBhcnNlZCBhcyBTYXNzIGNvZGUsIHRoaXMgY29udGFpbnMgc3RyaW5ncyBhbmQgU2Fzc1NjcmlwdCBub2Rlcy4gV2hlbgorICAgICMgcGFyc2VkIGFzIENTUywgaXQgY29udGFpbnMgYSBzaW5nbGUgc3RyaW5nIChhY2Nlc3NpYmxlIHZpYQorICAgICMgXHsjcmVzb2x2ZWRfbW9kaWZpZXJ9KS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT5dCisgICAgYXR0cl9hY2Nlc3NvciA6bW9kaWZpZXIKKworICAgICMgVGhlIHR5cGUgb2YgdGhlIHF1ZXJ5IChlLmcuIGAic2NyZWVuImAgb3IgYCJwcmludCJgKS4KKyAgICAjCisgICAgIyBXaGVuIHBhcnNlZCBhcyBTYXNzIGNvZGUsIHRoaXMgY29udGFpbnMgc3RyaW5ncyBhbmQgU2Fzc1NjcmlwdCBub2Rlcy4gV2hlbgorICAgICMgcGFyc2VkIGFzIENTUywgaXQgY29udGFpbnMgYSBzaW5nbGUgc3RyaW5nIChhY2Nlc3NpYmxlIHZpYQorICAgICMgXHsjcmVzb2x2ZWRfdHlwZX0pLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICBhdHRyX2FjY2Vzc29yIDp0eXBlCisKKyAgICAjIFRoZSB0cmFpbGluZyBleHByZXNzaW9ucyBpbiB0aGUgcXVlcnkuCisgICAgIworICAgICMgV2hlbiBwYXJzZWQgYXMgU2FzcyBjb2RlLCBlYWNoIGV4cHJlc3Npb24gY29udGFpbnMgc3RyaW5ncyBhbmQgU2Fzc1NjcmlwdAorICAgICMgbm9kZXMuIFdoZW4gcGFyc2VkIGFzIENTUywgZWFjaCBvbmUgY29udGFpbnMgYSBzaW5nbGUgc3RyaW5nLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PEFycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPj5dCisgICAgYXR0cl9hY2Nlc3NvciA6ZXhwcmVzc2lvbnMKKworICAgICMgQHBhcmFtIG1vZGlmaWVyIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT5dIFNlZSBceyNtb2RpZmllcn0KKyAgICAjIEBwYXJhbSB0eXBlIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT5dIFNlZSBceyN0eXBlfQorICAgICMgQHBhcmFtIGV4cHJlc3Npb25zIFtBcnJheTxBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT4+XSBTZWUgXHsjZXhwcmVzc2lvbnN9CisgICAgZGVmIGluaXRpYWxpemUobW9kaWZpZXIsIHR5cGUsIGV4cHJlc3Npb25zKQorICAgICAgQG1vZGlmaWVyID0gbW9kaWZpZXIKKyAgICAgIEB0eXBlID0gdHlwZQorICAgICAgQGV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnMKKyAgICBlbmQKKworICAgICMgU2VlIFx7I21vZGlmaWVyfS4KKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBkZWYgcmVzb2x2ZWRfbW9kaWZpZXIKKyAgICAgICMgbW9kaWZpZXIgc2hvdWxkIGNvbnRhaW4gb25seSBhIHNpbmdsZSBzdHJpbmcKKyAgICAgIG1vZGlmaWVyLmZpcnN0IHx8ICcnCisgICAgZW5kCisKKyAgICAjIFNlZSBceyN0eXBlfS4KKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBkZWYgcmVzb2x2ZWRfdHlwZQorICAgICAgIyB0eXBlIHNob3VsZCBjb250YWluIG9ubHkgYSBzaW5nbGUgc3RyaW5nCisgICAgICB0eXBlLmZpcnN0IHx8ICcnCisgICAgZW5kCisKKyAgICAjIE1lcmdlcyB0aGlzIHF1ZXJ5IHdpdGggYW5vdGhlci4gVGhlIHJldHVybmVkIHF1ZXJ5IHF1ZXJpZXMgZm9yCisgICAgIyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHR3byBpbnB1dHMuCisgICAgIworICAgICMgQm90aCBxdWVyaWVzIHNob3VsZCBiZSByZXNvbHZlZC4KKyAgICAjCisgICAgIyBAcGFyYW0gb3RoZXIgW1F1ZXJ5XQorICAgICMgQHJldHVybiBbUXVlcnk/XSBUaGUgbWVyZ2VkIHF1ZXJ5LCBvciBuaWwgaWYgdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLgorICAgIGRlZiBtZXJnZShvdGhlcikKKyAgICAgIG0xLCB0MSA9IHJlc29sdmVkX21vZGlmaWVyLmRvd25jYXNlLCByZXNvbHZlZF90eXBlLmRvd25jYXNlCisgICAgICBtMiwgdDIgPSBvdGhlci5yZXNvbHZlZF9tb2RpZmllci5kb3duY2FzZSwgb3RoZXIucmVzb2x2ZWRfdHlwZS5kb3duY2FzZQorICAgICAgdDEgPSB0MiBpZiB0MS5lbXB0eT8KKyAgICAgIHQyID0gdDEgaWYgdDIuZW1wdHk/CisgICAgICBpZiAobTEgPT0gJ25vdCcpIF4gKG0yID09ICdub3QnKQorICAgICAgICByZXR1cm4gaWYgdDEgPT0gdDIKKyAgICAgICAgdHlwZSA9IG0xID09ICdub3QnID8gdDIgOiB0MQorICAgICAgICBtb2QgPSBtMSA9PSAnbm90JyA/IG0yIDogbTEKKyAgICAgIGVsc2lmIG0xID09ICdub3QnICYmIG0yID09ICdub3QnCisgICAgICAgICMgQ1NTIGhhcyBubyB3YXkgb2YgcmVwcmVzZW50aW5nICJuZWl0aGVyIHNjcmVlbiBub3IgcHJpbnQiCisgICAgICAgIHJldHVybiB1bmxlc3MgdDEgPT0gdDIKKyAgICAgICAgdHlwZSA9IHQxCisgICAgICAgIG1vZCA9ICdub3QnCisgICAgICBlbHNpZiB0MSAhPSB0MgorICAgICAgICByZXR1cm4KKyAgICAgIGVsc2UgIyB0MSA9PSB0MiwgbmVpdGhlciBtMSBub3IgbTIgYXJlICJub3QiCisgICAgICAgIHR5cGUgPSB0MQorICAgICAgICBtb2QgPSBtMS5lbXB0eT8gPyBtMiA6IG0xCisgICAgICBlbmQKKyAgICAgIFF1ZXJ5Lm5ldyhbbW9kXSwgW3R5cGVdLCBvdGhlci5leHByZXNzaW9ucyArIGV4cHJlc3Npb25zKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBDU1MgZm9yIHRoZSBtZWRpYSBxdWVyeS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgZGVmIHRvX2NzcworICAgICAgY3NzID0gJycKKyAgICAgIGNzcyA8PCByZXNvbHZlZF9tb2RpZmllcgorICAgICAgY3NzIDw8ICcgJyB1bmxlc3MgcmVzb2x2ZWRfbW9kaWZpZXIuZW1wdHk/CisgICAgICBjc3MgPDwgcmVzb2x2ZWRfdHlwZQorICAgICAgY3NzIDw8ICcgYW5kICcgdW5sZXNzIHJlc29sdmVkX3R5cGUuZW1wdHk/IHx8IGV4cHJlc3Npb25zLmVtcHR5PworICAgICAgY3NzIDw8IGV4cHJlc3Npb25zLm1hcCBkbyB8ZXwKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSBzY3JpcHQgbm9kZXMgaW4gRXhwcmVzc2lvbnMgZXZlbiB3aGVuCisgICAgICAgICMgd2UncmUgY29udmVydGluZyB0byBDU1MgaW4gdGhlIGNhc2Ugd2hlcmUgd2UgcGFyc2VkIHRoZSBkb2N1bWVudCBhcworICAgICAgICAjIENTUyBvcmlnaW5hbGx5IChhcyBpbiBjc3NfdGVzdC5yYikuCisgICAgICAgIGUubWFwIHt8Y3wgYy5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUpID8gYy50b19zYXNzIDogYy50b19zfS5qb2luCisgICAgICBlbmQuam9pbignIGFuZCAnKQorICAgICAgY3NzCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIFNhc3MvU0NTUyBjb2RlIGZvciB0aGUgbWVkaWEgcXVlcnkuCisgICAgIworICAgICMgQHBhcmFtIG9wdGlvbnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gQW4gb3B0aW9ucyBoYXNoIChzZWUge1Nhc3M6OkNTUyNpbml0aWFsaXplfSkuCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgZGVmIHRvX3NyYyhvcHRpb25zKQorICAgICAgc3JjID0gJycKKyAgICAgIHNyYyA8PCBTYXNzOjpNZWRpYS5faW50ZXJwX3RvX3NyYyhtb2RpZmllciwgb3B0aW9ucykKKyAgICAgIHNyYyA8PCAnICcgdW5sZXNzIG1vZGlmaWVyLmVtcHR5PworICAgICAgc3JjIDw8IFNhc3M6Ok1lZGlhLl9pbnRlcnBfdG9fc3JjKHR5cGUsIG9wdGlvbnMpCisgICAgICBzcmMgPDwgJyBhbmQgJyB1bmxlc3MgdHlwZS5lbXB0eT8gfHwgZXhwcmVzc2lvbnMuZW1wdHk/CisgICAgICBzcmMgPDwgZXhwcmVzc2lvbnMubWFwIGRvIHxlfAorICAgICAgICBTYXNzOjpNZWRpYS5faW50ZXJwX3RvX3NyYyhlLCBvcHRpb25zKQorICAgICAgZW5kLmpvaW4oJyBhbmQgJykKKyAgICAgIHNyYworICAgIGVuZAorCisgICAgIyBAc2VlIFx7TWVkaWFRdWVyeSN0b1xfYX0KKyAgICBkZWYgdG9fYQorICAgICAgcmVzID0gW10KKyAgICAgIHJlcyArPSBtb2RpZmllcgorICAgICAgcmVzIDw8ICcgJyB1bmxlc3MgbW9kaWZpZXIuZW1wdHk/CisgICAgICByZXMgKz0gdHlwZQorICAgICAgcmVzIDw8ICcgYW5kICcgdW5sZXNzIHR5cGUuZW1wdHk/IHx8IGV4cHJlc3Npb25zLmVtcHR5PworICAgICAgcmVzICs9IFNhc3M6OlV0aWwuaW50ZXJzcGVyc2UoZXhwcmVzc2lvbnMsICcgYW5kICcpLmZsYXR0ZW4KKyAgICAgIHJlcworICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoaXMgcXVlcnkgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCisgICAgIworICAgICMgQHJldHVybiBbUXVlcnldCisgICAgZGVmIGRlZXBfY29weQorICAgICAgUXVlcnkubmV3KAorICAgICAgICBtb2RpZmllci5tYXAge3xjfCBjLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSkgPyBjLmRlZXBfY29weSA6IGN9LAorICAgICAgICB0eXBlLm1hcCB7fGN8IGMuaXNfYT8oU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlKSA/IGMuZGVlcF9jb3B5IDogY30sCisgICAgICAgIGV4cHJlc3Npb25zLm1hcCB7fGV8IGUubWFwIHt8Y3wgYy5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUpID8gYy5kZWVwX2NvcHkgOiBjfX0pCisgICAgZW5kCisgIGVuZAorCisgICMgQ29udmVydHMgYW4gaW50ZXJwb2xhdGlvbiBhcnJheSB0byBzb3VyY2UuCisgICMKKyAgIyBAcGFyYW0gaW50ZXJwIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT5dIFRoZSBpbnRlcnBvbGF0aW9uIGFycmF5IHRvIGNvbnZlcnQuCisgICMgQHBhcmFtIG9wdGlvbnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gQW4gb3B0aW9ucyBoYXNoIChzZWUge1Nhc3M6OkNTUyNpbml0aWFsaXplfSkuCisgICMgQHJldHVybiBbU3RyaW5nXQorICBkZWYgc2VsZi5faW50ZXJwX3RvX3NyYyhpbnRlcnAsIG9wdGlvbnMpCisgICAgaW50ZXJwLm1hcCB7fHJ8IHIuaXNfYT8oU3RyaW5nKSA/IHIgOiByLnRvX3Nhc3Mob3B0aW9ucyl9LmpvaW4KKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvcGx1Z2luLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9wbHVnaW4ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1OGE5NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvcGx1Z2luLnJiCkBAIC0wLDAgKzEsMTM0IEBACityZXF1aXJlICdmaWxldXRpbHMnCisKK3JlcXVpcmUgJ3Nhc3MnCityZXF1aXJlICdzYXNzL3BsdWdpbi9jb21waWxlcicKKworbW9kdWxlIFNhc3MKKyAgIyBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNpbmdsZSBpbnRlcmZhY2UgdG8gdGhlIGNvbXBpbGF0aW9uIG9mIFNhc3MvU0NTUyBmaWxlcworICAjIGZvciBhbiBhcHBsaWNhdGlvbi4gSXQgcHJvdmlkZXMgZ2xvYmFsIG9wdGlvbnMgYW5kIGNoZWNrcyB3aGV0aGVyIENTUyBmaWxlcworICAjIG5lZWQgdG8gYmUgdXBkYXRlZC4KKyAgIworICAjIFRoaXMgbW9kdWxlIGlzIHVzZWQgYXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIHdpdGggU2FzcworICAjIHdoZW4gaXQncyB1c2VkIGFzIGEgcGx1Z2luIGZvciB2YXJpb3VzIGZyYW1ld29ya3MuCisgICMgQWxsIFJhY2stZW5hYmxlZCBmcmFtZXdvcmtzIGFyZSBzdXBwb3J0ZWQgb3V0IG9mIHRoZSBib3guCisgICMgVGhlIHBsdWdpbiBpcworICAjIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI1JhY2tfUmFpbHNfTWVyYl9QbHVnaW4gYXV0b21hdGljYWxseSBhY3RpdmF0ZWQgZm9yIFJhaWxzIGFuZCBNZXJifS4KKyAgIyBPdGhlciBmcmFtZXdvcmtzIG11c3QgZW5hYmxlIGl0IGV4cGxpY2l0bHk7IHNlZSB7U2Fzczo6UGx1Z2luOjpSYWNrfS4KKyAgIworICAjIFRoaXMgbW9kdWxlIGhhcyBhIGxhcmdlIHNldCBvZiBjYWxsYmFja3MgYXZhaWxhYmxlCisgICMgdG8gYWxsb3cgdXNlcnMgdG8gcnVuIGNvZGUgKHN1Y2ggYXMgbG9nZ2luZykgd2hlbiBjZXJ0YWluIHRoaW5ncyBoYXBwZW4uCisgICMgQWxsIGNhbGxiYWNrIG1ldGhvZHMgYXJlIG9mIHRoZSBmb3JtIGBvbl8je25hbWV9YCwKKyAgIyBhbmQgdGhleSBhbGwgdGFrZSBhIGJsb2NrIHRoYXQncyBjYWxsZWQgd2hlbiB0aGUgZ2l2ZW4gYWN0aW9uIG9jY3Vycy4KKyAgIworICAjIE5vdGUgdGhhdCB0aGlzIGNsYXNzIHByb3hpZXMgYWxtb3N0IGFsbCBtZXRob2RzIHRvIGl0cyB7U2Fzczo6UGx1Z2luOjpDb21waWxlcn0gaW5zdGFuY2UuCisgICMgU2VlIFx7I2NvbXBpbGVyfS4KKyAgIworICAjIEBleGFtcGxlIFVzaW5nIGEgY2FsbGJhY2sKKyAgIyAgIFNhc3M6OlBsdWdpbi5vbl91cGRhdGluZ19zdHlsZXNoZWV0IGRvIHx0ZW1wbGF0ZSwgY3NzfAorICAjICAgICBwdXRzICJDb21waWxpbmcgI3t0ZW1wbGF0ZX0gdG8gI3tjc3N9IgorICAjICAgZW5kCisgICMgICBTYXNzOjpQbHVnaW4udXBkYXRlX3N0eWxlc2hlZXRzCisgICMgICAgICM9PiBDb21waWxpbmcgYXBwL3Nhc3Mvc2NyZWVuLnNjc3MgdG8gcHVibGljL3N0eWxlc2hlZXRzL3NjcmVlbi5jc3MKKyAgIyAgICAgIz0+IENvbXBpbGluZyBhcHAvc2Fzcy9wcmludC5zY3NzIHRvIHB1YmxpYy9zdHlsZXNoZWV0cy9wcmludC5jc3MKKyAgIyAgICAgIz0+IENvbXBpbGluZyBhcHAvc2Fzcy9pZS5zY3NzIHRvIHB1YmxpYy9zdHlsZXNoZWV0cy9pZS5jc3MKKyAgIyBAc2VlIFNhc3M6OlBsdWdpbjo6Q29tcGlsZXIKKyAgbW9kdWxlIFBsdWdpbgorICAgIGV4dGVuZCBzZWxmCisKKyAgICBAY2hlY2tlZF9mb3JfdXBkYXRlcyA9IGZhbHNlCisKKyAgICAjIFdoZXRoZXIgb3Igbm90IFNhc3MgaGFzICoqZXZlcioqIGNoZWNrZWQgaWYgdGhlIHN0eWxlc2hlZXRzIG5lZWQgdG8gYmUgdXBkYXRlZAorICAgICMgKGluIHRoaXMgUnVieSBpbnN0YW5jZSkuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBhdHRyX2FjY2Vzc29yIDpjaGVja2VkX2Zvcl91cGRhdGVzCisKKyAgICAjIFNhbWUgYXMgXHsjdXBkYXRlXF9zdHlsZXNoZWV0c30sIGJ1dCByZXNwZWN0cyBceyNjaGVja2VkXF9mb3JcX3VwZGF0ZXN9CisgICAgIyBhbmQgdGhlIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI2Fsd2F5c191cGRhdGUtb3B0aW9uIGA6YWx3YXlzX3VwZGF0ZWB9CisgICAgIyBhbmQge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjYWx3YXlzX2NoZWNrLW9wdGlvbiBgOmFsd2F5c19jaGVja2B9IG9wdGlvbnMuCisgICAgIworICAgICMgQHNlZSAjdXBkYXRlX3N0eWxlc2hlZXRzCisgICAgZGVmIGNoZWNrX2Zvcl91cGRhdGVzCisgICAgICByZXR1cm4gdW5sZXNzICFTYXNzOjpQbHVnaW4uY2hlY2tlZF9mb3JfdXBkYXRlcyB8fAorICAgICAgICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zWzphbHdheXNfdXBkYXRlXSB8fCBTYXNzOjpQbHVnaW4ub3B0aW9uc1s6YWx3YXlzX2NoZWNrXQorICAgICAgdXBkYXRlX3N0eWxlc2hlZXRzCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIHNpbmdsZXRvbiBjb21waWxlciBpbnN0YW5jZS4KKyAgICAjIFRoaXMgY29tcGlsZXIgaGFzIGJlZW4gcHJlLWNvbmZpZ3VyZWQgYWNjb3JkaW5nCisgICAgIyB0byB0aGUgcGx1Z2luIGNvbmZpZ3VyYXRpb24uCisgICAgIworICAgICMgQHJldHVybiBbU2Fzczo6UGx1Z2luOjpDb21waWxlcl0KKyAgICBkZWYgY29tcGlsZXIKKyAgICAgIEBjb21waWxlciB8fD0gQ29tcGlsZXIubmV3CisgICAgZW5kCisKKyAgICAjIFVwZGF0ZXMgb3V0LW9mLWRhdGUgc3R5bGVzaGVldHMuCisgICAgIworICAgICMgQ2hlY2tzIGVhY2ggU2Fzcy9TQ1NTIGZpbGUgaW4KKyAgICAjIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI3RlbXBsYXRlX2xvY2F0aW9uLW9wdGlvbiBgOnRlbXBsYXRlX2xvY2F0aW9uYH0KKyAgICAjIHRvIHNlZSBpZiBpdCdzIGJlZW4gbW9kaWZpZWQgbW9yZSByZWNlbnRseSB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIENTUyBmaWxlCisgICAgIyBpbiB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNjc3NfbG9jYXRpb24tb3B0aW9uIGA6Y3NzX2xvY2F0aW9uYH0uCisgICAgIyBJZiBpdCBoYXMsIGl0IHVwZGF0ZXMgdGhlIENTUyBmaWxlLgorICAgICMKKyAgICAjIEBwYXJhbSBpbmRpdmlkdWFsX2ZpbGVzIFtBcnJheTwoU3RyaW5nLCBTdHJpbmcpPl0KKyAgICAjICAgQSBsaXN0IG9mIGZpbGVzIHRvIGNoZWNrIGZvciB1cGRhdGVzCisgICAgIyAgICoqaW4gYWRkaXRpb24gdG8gdGhvc2Ugc3BlY2lmaWVkIGJ5IHRoZQorICAgICMgICB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCN0ZW1wbGF0ZV9sb2NhdGlvbi1vcHRpb24gYDp0ZW1wbGF0ZV9sb2NhdGlvbmAgb3B0aW9ufS4qKgorICAgICMgICBUaGUgZmlyc3Qgc3RyaW5nIGluIGVhY2ggcGFpciBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIFNhc3MvU0NTUyBmaWxlLAorICAgICMgICB0aGUgc2Vjb25kIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgQ1NTIGZpbGUgdGhhdCBpdCBzaG91bGQgYmUgY29tcGlsZWQgdG8uCisgICAgZGVmIHVwZGF0ZV9zdHlsZXNoZWV0cyhpbmRpdmlkdWFsX2ZpbGVzID0gW10pCisgICAgICByZXR1cm4gaWYgb3B0aW9uc1s6bmV2ZXJfdXBkYXRlXQorICAgICAgY29tcGlsZXIudXBkYXRlX3N0eWxlc2hlZXRzKGluZGl2aWR1YWxfZmlsZXMpCisgICAgZW5kCisKKyAgICAjIFVwZGF0ZXMgYWxsIHN0eWxlc2hlZXRzLCBldmVuIHRob3NlIHRoYXQgYXJlbid0IG91dC1vZi1kYXRlLgorICAgICMgSWdub3JlcyB0aGUgY2FjaGUuCisgICAgIworICAgICMgQHBhcmFtIGluZGl2aWR1YWxfZmlsZXMgW0FycmF5PChTdHJpbmcsIFN0cmluZyk+XQorICAgICMgICBBIGxpc3Qgb2YgZmlsZXMgdG8gY2hlY2sgZm9yIHVwZGF0ZXMKKyAgICAjICAgKippbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlCisgICAgIyAgIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI3RlbXBsYXRlX2xvY2F0aW9uLW9wdGlvbiBgOnRlbXBsYXRlX2xvY2F0aW9uYCBvcHRpb259LioqCisgICAgIyAgIFRoZSBmaXJzdCBzdHJpbmcgaW4gZWFjaCBwYWlyIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgU2Fzcy9TQ1NTIGZpbGUsCisgICAgIyAgIHRoZSBzZWNvbmQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBDU1MgZmlsZSB0aGF0IGl0IHNob3VsZCBiZSBjb21waWxlZCB0by4KKyAgICAjIEBzZWUgI3VwZGF0ZV9zdHlsZXNoZWV0cworICAgIGRlZiBmb3JjZV91cGRhdGVfc3R5bGVzaGVldHMoaW5kaXZpZHVhbF9maWxlcyA9IFtdKQorICAgICAgQ29tcGlsZXIubmV3KAorICAgICAgICBvcHRpb25zLmR1cC5tZXJnZSgKKyAgICAgICAgICA6bmV2ZXJfdXBkYXRlID0+IGZhbHNlLAorICAgICAgICAgIDphbHdheXNfdXBkYXRlID0+IHRydWUsCisgICAgICAgICAgOmNhY2hlID0+IGZhbHNlKSkudXBkYXRlX3N0eWxlc2hlZXRzKGluZGl2aWR1YWxfZmlsZXMpCisgICAgZW5kCisKKyAgICAjIEFsbCBvdGhlciBtZXRob2QgaW52b2NhdGlvbnMgYXJlIHByb3hpZWQgdG8gdGhlIFx7I2NvbXBpbGVyfS4KKyAgICAjCisgICAgIyBAc2VlICNjb21waWxlcgorICAgICMgQHNlZSBTYXNzOjpQbHVnaW46OkNvbXBpbGVyCisgICAgZGVmIG1ldGhvZF9taXNzaW5nKG1ldGhvZCwgKmFyZ3MsICZibG9jaykKKyAgICAgIGlmIGNvbXBpbGVyLnJlc3BvbmRfdG8/KG1ldGhvZCkKKyAgICAgICAgY29tcGlsZXIuc2VuZChtZXRob2QsICphcmdzLCAmYmxvY2spCisgICAgICBlbHNlCisgICAgICAgIHN1cGVyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgRm9yIHBhcml0eSB3aXRoIG1ldGhvZF9taXNzaW5nCisgICAgZGVmIHJlc3BvbmRfdG8/KG1ldGhvZCkKKyAgICAgIHN1cGVyIHx8IGNvbXBpbGVyLnJlc3BvbmRfdG8/KG1ldGhvZCkKKyAgICBlbmQKKworICAgICMgVGhlcmUncyBhIHNtYWxsIHNwZWVkdXAgYnkgbm90IHVzaW5nIG1ldGhvZCBtaXNzaW5nIGZvciBmcmVxdWVudGx5IGRlbGVnYXRlZCBtZXRob2RzLgorICAgIGRlZiBvcHRpb25zCisgICAgICBjb21waWxlci5vcHRpb25zCisgICAgZW5kCisgIGVuZAorZW5kCisKK2lmIGRlZmluZWQ/KEFjdGlvbkNvbnRyb2xsZXIpCisgICMgT24gUmFpbHMgMysgdGhlIHJhaWxzIHBsdWdpbiBpcyBsb2FkZWQgYXQgdGhlIHJpZ2h0IHRpbWUgaW4gcmFpbHRpZS5yYgorICByZXF1aXJlICdzYXNzL3BsdWdpbi9yYWlscycgdW5sZXNzIFNhc3M6OlV0aWwuYXBfZ2VxXzM/CitlbHNpZiBkZWZpbmVkPyhNZXJiOjpQbHVnaW5zKQorICByZXF1aXJlICdzYXNzL3BsdWdpbi9tZXJiJworZWxzZQorICByZXF1aXJlICdzYXNzL3BsdWdpbi9nZW5lcmljJworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9jb21waWxlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvcGx1Z2luL2NvbXBpbGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYWU2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9jb21waWxlci5yYgpAQCAtMCwwICsxLDU1MiBAQAorcmVxdWlyZSAnZmlsZXV0aWxzJworCityZXF1aXJlICdzYXNzJworIyBYWFggQ0U6IGlzIHRoaXMgc3RpbGwgbmVjZXNzYXJ5IG5vdyB0aGF0IHdlIGhhdmUgdGhlIGNvbXBpbGVyIGNsYXNzPworcmVxdWlyZSAnc2Fzcy9jYWxsYmFja3MnCityZXF1aXJlICdzYXNzL3BsdWdpbi9jb25maWd1cmF0aW9uJworcmVxdWlyZSAnc2Fzcy9wbHVnaW4vc3RhbGVuZXNzX2NoZWNrZXInCisKK21vZHVsZSBTYXNzOjpQbHVnaW4KKyAgIyBUaGUgQ29tcGlsZXIgY2xhc3MgaGFuZGxlcyBjb21waWxhdGlvbiBvZiBtdWx0aXBsZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMsCisgICMgaW5jbHVkaW5nIGNoZWNraW5nIHdoaWNoIENTUyBmaWxlcyBhcmUgb3V0LW9mLWRhdGUgYW5kIG5lZWQgdG8gYmUgdXBkYXRlZAorICAjIGFuZCBjYWxsaW5nIFNhc3MgdG8gcGVyZm9ybSB0aGUgY29tcGlsYXRpb24gb24gdGhvc2UgZmlsZXMuCisgICMKKyAgIyB7U2Fzczo6UGx1Z2lufSB1c2VzIHRoaXMgY2xhc3MgdG8gdXBkYXRlIHN0eWxlc2hlZXRzIGZvciBhIHNpbmdsZSBhcHBsaWNhdGlvbi4KKyAgIyBVbmxpa2Uge1Nhc3M6OlBsdWdpbn0sIHRob3VnaCwgdGhlIENvbXBpbGVyIGNsYXNzIGhhcyBubyBnbG9iYWwgc3RhdGUsCisgICMgYW5kIHNvIG11bHRpcGxlIGluc3RhbmNlcyBtYXkgYmUgY3JlYXRlZCBhbmQgdXNlZCBpbmRlcGVuZGVudGx5LgorICAjCisgICMgSWYgeW91IG5lZWQgdG8gY29tcGlsZSBhIFNhc3Mgc3RyaW5nIGludG8gQ1NTLAorICAjIHBsZWFzZSBzZWUgdGhlIHtTYXNzOjpFbmdpbmV9IGNsYXNzLgorICAjCisgICMgVW5saWtlIHtTYXNzOjpQbHVnaW59LCB0aGlzIGNsYXNzIGRvZXNuJ3Qga2VlcCB0cmFjayBvZgorICAjIHdoZXRoZXIgb3IgaG93IG1hbnkgdGltZXMgYSBzdHlsZXNoZWV0IHNob3VsZCBiZSB1cGRhdGVkLgorICAjIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBgU2Fzczo6UGx1Z2luYCBvcHRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBDb21waWxlcjoKKyAgIworICAjICogYDpuZXZlcl91cGRhdGVgCisgICMgKiBgOmFsd2F5c19jaGVja2AKKyAgY2xhc3MgQ29tcGlsZXIKKyAgICBpbmNsdWRlIENvbmZpZ3VyYXRpb24KKyAgICBleHRlbmQgU2Fzczo6Q2FsbGJhY2tzCisKKyAgICAjIENyZWF0ZXMgYSBuZXcgY29tcGlsZXIuCisgICAgIworICAgICMgQHBhcmFtIG9wdHMgW3tTeW1ib2wgPT4gT2JqZWN0fV0KKyAgICAjICAgU2VlIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI09wdGlvbnMgdGhlIFNhc3Mgb3B0aW9ucyBkb2N1bWVudGF0aW9ufS4KKyAgICBkZWYgaW5pdGlhbGl6ZShvcHRzID0ge30pCisgICAgICBAd2F0Y2hlZF9maWxlcyA9IFNldC5uZXcKKyAgICAgIG9wdGlvbnMubWVyZ2UhKG9wdHMpCisgICAgZW5kCisKKyAgICAjIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgcnVuIGJlZm9yZSBzdHlsZXNoZWV0cyBhcmUgbWFzcy11cGRhdGVkLgorICAgICMgVGhpcyBpcyBydW4gd2hlbmV2ZXIgXHsjdXBkYXRlXF9zdHlsZXNoZWV0c30gaXMgY2FsbGVkLAorICAgICMgdW5sZXNzIHRoZSBce2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjbmV2ZXJfdXBkYXRlLW9wdGlvbiBgOm5ldmVyX3VwZGF0ZWAgb3B0aW9ufQorICAgICMgaXMgZW5hYmxlZC4KKyAgICAjCisgICAgIyBAeWllbGQgW2ZpbGVzXQorICAgICMgQHlpZWxkcGFyYW0gZmlsZXMgWzwoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyk+XQorICAgICMgICBJbmRpdmlkdWFsIGZpbGVzIHRvIGJlIHVwZGF0ZWQuIEZpbGVzIGluIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBhcmUgaW5jbHVkZWQgaW4gdGhpcyBsaXN0LgorICAgICMgICBUaGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHBhaXIgaXMgdGhlIHNvdXJjZSBmaWxlLAorICAgICMgICB0aGUgc2Vjb25kIGlzIHRoZSB0YXJnZXQgQ1NTIGZpbGUsCisgICAgIyAgIHRoZSB0aGlyZCBpcyB0aGUgdGFyZ2V0IHNvdXJjZW1hcCBmaWxlLgorICAgIGRlZmluZV9jYWxsYmFjayA6dXBkYXRpbmdfc3R5bGVzaGVldHMKKworICAgICMgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBydW4gYWZ0ZXIgc3R5bGVzaGVldHMgYXJlIG1hc3MtdXBkYXRlZC4KKyAgICAjIFRoaXMgaXMgcnVuIHdoZW5ldmVyIFx7I3VwZGF0ZVxfc3R5bGVzaGVldHN9IGlzIGNhbGxlZCwKKyAgICAjIHVubGVzcyB0aGUgXHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI25ldmVyX3VwZGF0ZS1vcHRpb24gYDpuZXZlcl91cGRhdGVgIG9wdGlvbn0KKyAgICAjIGlzIGVuYWJsZWQuCisgICAgIworICAgICMgQHlpZWxkIFt1cGRhdGVkX2ZpbGVzXQorICAgICMgQHlpZWxkcGFyYW0gdXBkYXRlZF9maWxlcyBbPChTdHJpbmcsIFN0cmluZyk+XQorICAgICMgICBJbmRpdmlkdWFsIGZpbGVzIHRoYXQgd2VyZSB1cGRhdGVkLgorICAgICMgICBUaGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHBhaXIgaXMgdGhlIHNvdXJjZSBmaWxlLCB0aGUgc2Vjb25kIGlzIHRoZSB0YXJnZXQgQ1NTIGZpbGUuCisgICAgZGVmaW5lX2NhbGxiYWNrIDp1cGRhdGVkX3N0eWxlc2hlZXRzCisKKyAgICAjIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgcnVuIGFmdGVyIGEgc2luZ2xlIHN0eWxlc2hlZXQgaXMgdXBkYXRlZC4KKyAgICAjIFRoZSBjYWxsYmFjayBpcyBvbmx5IHJ1biBpZiB0aGUgc3R5bGVzaGVldCBpcyByZWFsbHkgdXBkYXRlZDsKKyAgICAjIGlmIHRoZSBDU1MgZmlsZSBpcyBmcmVzaCwgdGhpcyB3b24ndCBiZSBydW4uCisgICAgIworICAgICMgRXZlbiBpZiB0aGUgXHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI2Z1bGxfZXhjZXB0aW9uLW9wdGlvbiBgOmZ1bGxfZXhjZXB0aW9uYCBvcHRpb259CisgICAgIyBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdvbid0IGJlIHJ1bgorICAgICMgd2hlbiBhbiBleGNlcHRpb24gQ1NTIGZpbGUgaXMgYmVpbmcgd3JpdHRlbi4KKyAgICAjIFRvIHJ1biBhbiBhY3Rpb24gZm9yIHRob3NlIGZpbGVzLCB1c2UgXHsjb25cX2NvbXBpbGF0aW9uXF9lcnJvcn0uCisgICAgIworICAgICMgQHlpZWxkIFt0ZW1wbGF0ZSwgY3NzLCBzb3VyY2VtYXBdCisgICAgIyBAeWllbGRwYXJhbSB0ZW1wbGF0ZSBbU3RyaW5nXQorICAgICMgICBUaGUgbG9jYXRpb24gb2YgdGhlIFNhc3MvU0NTUyBmaWxlIGJlaW5nIHVwZGF0ZWQuCisgICAgIyBAeWllbGRwYXJhbSBjc3MgW1N0cmluZ10KKyAgICAjICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBDU1MgZmlsZSBiZWluZyBnZW5lcmF0ZWQuCisgICAgIyBAeWllbGRwYXJhbSBzb3VyY2VtYXAgW1N0cmluZ10KKyAgICAjICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBzb3VyY2VtYXAgYmVpbmcgZ2VuZXJhdGVkLCBpZiBhbnkuCisgICAgZGVmaW5lX2NhbGxiYWNrIDp1cGRhdGVkX3N0eWxlc2hlZXQKKworICAgICMgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBydW4gd2hlbiBjb21waWxhdGlvbiBzdGFydHMuCisgICAgIworICAgICMgSW4gY29tYmluYXRpb24gd2l0aCBvbl91cGRhdGVkX3N0eWxlc2hlZXQsIHRoaXMgY291bGQgYmUgdXNlZAorICAgICMgdG8gY29sbGVjdCBjb21waWxhdGlvbiBzdGF0aXN0aWNzIGxpa2UgdGltaW5nIG9yIHRvIHRha2UgYQorICAgICMgZGlmZiBvZiB0aGUgY2hhbmdlcyB0byB0aGUgb3V0cHV0IGZpbGUuCisgICAgIworICAgICMgQHlpZWxkIFt0ZW1wbGF0ZSwgY3NzLCBzb3VyY2VtYXBdCisgICAgIyBAeWllbGRwYXJhbSB0ZW1wbGF0ZSBbU3RyaW5nXQorICAgICMgICBUaGUgbG9jYXRpb24gb2YgdGhlIFNhc3MvU0NTUyBmaWxlIGJlaW5nIHVwZGF0ZWQuCisgICAgIyBAeWllbGRwYXJhbSBjc3MgW1N0cmluZ10KKyAgICAjICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBDU1MgZmlsZSBiZWluZyBnZW5lcmF0ZWQuCisgICAgIyBAeWllbGRwYXJhbSBzb3VyY2VtYXAgW1N0cmluZ10KKyAgICAjICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBzb3VyY2VtYXAgYmVpbmcgZ2VuZXJhdGVkLCBpZiBhbnkuCisgICAgZGVmaW5lX2NhbGxiYWNrIDpjb21waWxhdGlvbl9zdGFydGluZworCisgICAgIyBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIHJ1biB3aGVuIFNhc3MgZGVjaWRlcyBub3QgdG8gdXBkYXRlIGEgc3R5bGVzaGVldC4KKyAgICAjIEluIHBhcnRpY3VsYXIsIHRoZSBjYWxsYmFjayBpcyBydW4gd2hlbiBTYXNzIGZpbmRzIHRoYXQKKyAgICAjIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBub25lIG9mIGl0cyBkZXBlbmRlbmNpZXMKKyAgICAjIGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjb21waWxhdGlvbi4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgdGhpcyBpcyAqKm5vdCoqIHJ1biB3aGVuIHRoZQorICAgICMgXHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI25ldmVyLXVwZGF0ZV9vcHRpb24gYDpuZXZlcl91cGRhdGVgIG9wdGlvbn0gaXMgc2V0LAorICAgICMgbm9yIHdoZW4gU2FzcyBkZWNpZGVzIG5vdCB0byBjb21waWxlIGEgcGFydGlhbC4KKyAgICAjCisgICAgIyBAeWllbGQgW3RlbXBsYXRlLCBjc3NdCisgICAgIyBAeWllbGRwYXJhbSB0ZW1wbGF0ZSBbU3RyaW5nXQorICAgICMgICBUaGUgbG9jYXRpb24gb2YgdGhlIFNhc3MvU0NTUyBmaWxlIG5vdCBiZWluZyB1cGRhdGVkLgorICAgICMgQHlpZWxkcGFyYW0gY3NzIFtTdHJpbmddCisgICAgIyAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgQ1NTIGZpbGUgbm90IGJlaW5nIGdlbmVyYXRlZC4KKyAgICBkZWZpbmVfY2FsbGJhY2sgOm5vdF91cGRhdGluZ19zdHlsZXNoZWV0CisKKyAgICAjIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgcnVuIHdoZW4gdGhlcmUncyBhbiBlcnJvcgorICAgICMgY29tcGlsaW5nIGEgU2FzcyBmaWxlLgorICAgICMgVGhpcyBjb3VsZCBpbmNsdWRlIG5vdCBvbmx5IGVycm9ycyBpbiB0aGUgU2FzcyBkb2N1bWVudCwKKyAgICAjIGJ1dCBhbHNvIGVycm9ycyBhY2Nlc3NpbmcgdGhlIGZpbGUgYXQgYWxsLgorICAgICMKKyAgICAjIEB5aWVsZCBbZXJyb3IsIHRlbXBsYXRlLCBjc3NdCisgICAgIyBAeWllbGRwYXJhbSBlcnJvciBbRXhjZXB0aW9uXSBUaGUgZXhjZXB0aW9uIHRoYXQgd2FzIHJhaXNlZC4KKyAgICAjIEB5aWVsZHBhcmFtIHRlbXBsYXRlIFtTdHJpbmddCisgICAgIyAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgU2Fzcy9TQ1NTIGZpbGUgYmVpbmcgdXBkYXRlZC4KKyAgICAjIEB5aWVsZHBhcmFtIGNzcyBbU3RyaW5nXQorICAgICMgICBUaGUgbG9jYXRpb24gb2YgdGhlIENTUyBmaWxlIGJlaW5nIGdlbmVyYXRlZC4KKyAgICBkZWZpbmVfY2FsbGJhY2sgOmNvbXBpbGF0aW9uX2Vycm9yCisKKyAgICAjIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgcnVuIHdoZW4gU2FzcyBjcmVhdGVzIGEgZGlyZWN0b3J5CisgICAgIyBpbnRvIHdoaWNoIHRvIHB1dCBDU1MgZmlsZXMuCisgICAgIworICAgICMgTm90ZSB0aGF0IGV2ZW4gaWYgbXVsdGlwbGUgbGV2ZWxzIG9mIGRpcmVjdG9yaWVzIG5lZWQgdG8gYmUgY3JlYXRlZCwKKyAgICAjIHRoZSBjYWxsYmFjayBtYXkgb25seSBiZSBydW4gb25jZS4KKyAgICAjIEZvciBleGFtcGxlLCBpZiAiZm9vLyIgZXhpc3RzIGFuZCAiZm9vL2Jhci9iYXovIiBuZWVkcyB0byBiZSBjcmVhdGVkLAorICAgICMgdGhpcyBtYXkgb25seSBiZSBydW4gZm9yICJmb28vYmFyL2Jhei8iLgorICAgICMgVGhpcyBpcyBub3QgYSBndWFyYW50ZWUsIGhvd2V2ZXI7CisgICAgIyBpdCBtYXkgYWxzbyBiZSBydW4gZm9yICJmb28vYmFyLyIuCisgICAgIworICAgICMgQHlpZWxkIFtkaXJuYW1lXQorICAgICMgQHlpZWxkcGFyYW0gZGlybmFtZSBbU3RyaW5nXQorICAgICMgICBUaGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHdhcyBjcmVhdGVkLgorICAgIGRlZmluZV9jYWxsYmFjayA6Y3JlYXRpbmdfZGlyZWN0b3J5CisKKyAgICAjIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgcnVuIHdoZW4gU2FzcyBkZXRlY3RzCisgICAgIyB0aGF0IGEgdGVtcGxhdGUgaGFzIGJlZW4gbW9kaWZpZWQuCisgICAgIyBUaGlzIGlzIG9ubHkgcnVuIHdoZW4gdXNpbmcgXHsjd2F0Y2h9LgorICAgICMKKyAgICAjIEB5aWVsZCBbdGVtcGxhdGVdCisgICAgIyBAeWllbGRwYXJhbSB0ZW1wbGF0ZSBbU3RyaW5nXQorICAgICMgICBUaGUgbG9jYXRpb24gb2YgdGhlIHRlbXBsYXRlIHRoYXQgd2FzIG1vZGlmaWVkLgorICAgIGRlZmluZV9jYWxsYmFjayA6dGVtcGxhdGVfbW9kaWZpZWQKKworICAgICMgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBydW4gd2hlbiBTYXNzIGRldGVjdHMKKyAgICAjIHRoYXQgYSBuZXcgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAjIFRoaXMgaXMgb25seSBydW4gd2hlbiB1c2luZyBceyN3YXRjaH0uCisgICAgIworICAgICMgQHlpZWxkIFt0ZW1wbGF0ZV0KKyAgICAjIEB5aWVsZHBhcmFtIHRlbXBsYXRlIFtTdHJpbmddCisgICAgIyAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgdGVtcGxhdGUgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICBkZWZpbmVfY2FsbGJhY2sgOnRlbXBsYXRlX2NyZWF0ZWQKKworICAgICMgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBydW4gd2hlbiBTYXNzIGRldGVjdHMKKyAgICAjIHRoYXQgYSB0ZW1wbGF0ZSBoYXMgYmVlbiBkZWxldGVkLgorICAgICMgVGhpcyBpcyBvbmx5IHJ1biB3aGVuIHVzaW5nIFx7I3dhdGNofS4KKyAgICAjCisgICAgIyBAeWllbGQgW3RlbXBsYXRlXQorICAgICMgQHlpZWxkcGFyYW0gdGVtcGxhdGUgW1N0cmluZ10KKyAgICAjICAgVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wbGF0ZSB0aGF0IHdhcyBkZWxldGVkLgorICAgIGRlZmluZV9jYWxsYmFjayA6dGVtcGxhdGVfZGVsZXRlZAorCisgICAgIyBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIHJ1biB3aGVuIFNhc3MgZGVsZXRlcyBhIENTUyBmaWxlLgorICAgICMgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgU2Fzcy9TQ1NTIGZpbGUgaGFzIGJlZW4gZGVsZXRlZAorICAgICMgYW5kIHdoZW4gdGhlIGNvbXBpbGVyIGNsZWFucyB0aGUgb3V0cHV0IGZpbGVzLgorICAgICMKKyAgICAjIEB5aWVsZCBbZmlsZW5hbWVdCisgICAgIyBAeWllbGRwYXJhbSBmaWxlbmFtZSBbU3RyaW5nXQorICAgICMgICBUaGUgbG9jYXRpb24gb2YgdGhlIENTUyBmaWxlIHRoYXQgd2FzIGRlbGV0ZWQuCisgICAgZGVmaW5lX2NhbGxiYWNrIDpkZWxldGluZ19jc3MKKworICAgICMgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBydW4gd2hlbiBTYXNzIGRlbGV0ZXMgYSBzb3VyY2VtYXAgZmlsZS4KKyAgICAjIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIFNhc3MvU0NTUyBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQKKyAgICAjIGFuZCB3aGVuIHRoZSBjb21waWxlciBjbGVhbnMgdGhlIG91dHB1dCBmaWxlcy4KKyAgICAjCisgICAgIyBAeWllbGQgW2ZpbGVuYW1lXQorICAgICMgQHlpZWxkcGFyYW0gZmlsZW5hbWUgW1N0cmluZ10KKyAgICAjICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBzb3VyY2VtYXAgZmlsZSB0aGF0IHdhcyBkZWxldGVkLgorICAgIGRlZmluZV9jYWxsYmFjayA6ZGVsZXRpbmdfc291cmNlbWFwCisKKyAgICAjIFVwZGF0ZXMgb3V0LW9mLWRhdGUgc3R5bGVzaGVldHMuCisgICAgIworICAgICMgQ2hlY2tzIGVhY2ggU2Fzcy9TQ1NTIGZpbGUgaW4KKyAgICAjIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI3RlbXBsYXRlX2xvY2F0aW9uLW9wdGlvbiBgOnRlbXBsYXRlX2xvY2F0aW9uYH0KKyAgICAjIHRvIHNlZSBpZiBpdCdzIGJlZW4gbW9kaWZpZWQgbW9yZSByZWNlbnRseSB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIENTUyBmaWxlCisgICAgIyBpbiB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNjc3NfbG9jYXRpb24tb3B0aW9uIGA6Y3NzX2xvY2F0aW9uYH0uCisgICAgIyBJZiBpdCBoYXMsIGl0IHVwZGF0ZXMgdGhlIENTUyBmaWxlLgorICAgICMKKyAgICAjIEBwYXJhbSBpbmRpdmlkdWFsX2ZpbGVzIFtBcnJheTwoU3RyaW5nLCBTdHJpbmdbLCBTdHJpbmddKT5dCisgICAgIyAgIEEgbGlzdCBvZiBmaWxlcyB0byBjaGVjayBmb3IgdXBkYXRlcworICAgICMgICAqKmluIGFkZGl0aW9uIHRvIHRob3NlIHNwZWNpZmllZCBieSB0aGUKKyAgICAjICAge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjdGVtcGxhdGVfbG9jYXRpb24tb3B0aW9uIGA6dGVtcGxhdGVfbG9jYXRpb25gIG9wdGlvbn0uKioKKyAgICAjICAgVGhlIGZpcnN0IHN0cmluZyBpbiBlYWNoIHBhaXIgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBTYXNzL1NDU1MgZmlsZSwKKyAgICAjICAgdGhlIHNlY29uZCBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIENTUyBmaWxlIHRoYXQgaXQgc2hvdWxkIGJlIGNvbXBpbGVkIHRvLgorICAgICMgICBUaGUgdGhpcmQgc3RyaW5nLCBpZiBwcm92aWRlZCwgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBTb3VyY2VtYXAgZmlsZS4KKyAgICBkZWYgdXBkYXRlX3N0eWxlc2hlZXRzKGluZGl2aWR1YWxfZmlsZXMgPSBbXSkKKyAgICAgIFNhc3M6OlBsdWdpbi5jaGVja2VkX2Zvcl91cGRhdGVzID0gdHJ1ZQorICAgICAgc3RhbGVuZXNzX2NoZWNrZXIgPSBTdGFsZW5lc3NDaGVja2VyLm5ldyhlbmdpbmVfb3B0aW9ucykKKworICAgICAgZmlsZXMgPSBmaWxlX2xpc3QoaW5kaXZpZHVhbF9maWxlcykKKyAgICAgIHJ1bl91cGRhdGluZ19zdHlsZXNoZWV0cyhmaWxlcykKKworICAgICAgdXBkYXRlZF9zdHlsZXNoZWV0cyA9IFtdCisgICAgICBmaWxlcy5lYWNoIGRvIHxmaWxlLCBjc3MsIHNvdXJjZW1hcHwKKyAgICAgICAgIyBUT0RPOiBEb2VzIHN0YWxlbmVzc19jaGVja2VyIG5lZWQgdG8gY2hlY2sgdGhlIHNvdXJjZW1hcCBmaWxlIGFzIHdlbGw/CisgICAgICAgIGlmIG9wdGlvbnNbOmFsd2F5c191cGRhdGVdIHx8IHN0YWxlbmVzc19jaGVja2VyLnN0eWxlc2hlZXRfbmVlZHNfdXBkYXRlPyhjc3MsIGZpbGUpCisgICAgICAgICAgIyBYWFggRm9yIGNvbnNpc3RlbmN5LCB0aGlzIHNob3VsZCByZXR1cm4gdGhlIHNvdXJjZW1hcCB0b28sIGJ1dCBpdCB3b3VsZAorICAgICAgICAgICMgWFhYIGJlIGFuIEFQSSBjaGFuZ2UuCisgICAgICAgICAgdXBkYXRlZF9zdHlsZXNoZWV0cyA8PCBbZmlsZSwgY3NzXQorICAgICAgICAgIHVwZGF0ZV9zdHlsZXNoZWV0KGZpbGUsIGNzcywgc291cmNlbWFwKQorICAgICAgICBlbHNlCisgICAgICAgICAgcnVuX25vdF91cGRhdGluZ19zdHlsZXNoZWV0KGZpbGUsIGNzcywgc291cmNlbWFwKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgcnVuX3VwZGF0ZWRfc3R5bGVzaGVldHModXBkYXRlZF9zdHlsZXNoZWV0cykKKyAgICBlbmQKKworICAgICMgQ29uc3RydWN0IGEgbGlzdCBvZiBmaWxlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgY29tcGlsZWQKKyAgICAjIGZyb20gdGhlIHByb3ZpZGVkIGluZGl2aWR1YWxfZmlsZXMgYW5kIHRoZSB0ZW1wbGF0ZV9sb2NhdGlvbnMuCisgICAgIworICAgICMgTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgY2FjaGUgdGhlIHJlc3VsdHMgYXMgdGhleSBjYW4gY2hhbmdlCisgICAgIyBhY3Jvc3MgaW52b2NhdGlvbnMgd2hlbiBzYXNzIGZpbGVzIGFyZSBhZGRlZCBvciByZW1vdmVkLgorICAgICMKKyAgICAjIEBwYXJhbSBpbmRpdmlkdWFsX2ZpbGVzIFtBcnJheTwoU3RyaW5nLCBTdHJpbmdbLCBTdHJpbmddKT5dCisgICAgIyAgIEEgbGlzdCBvZiBmaWxlcyB0byBjaGVjayBmb3IgdXBkYXRlcworICAgICMgICAqKmluIGFkZGl0aW9uIHRvIHRob3NlIHNwZWNpZmllZCBieSB0aGUKKyAgICAjICAge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjdGVtcGxhdGVfbG9jYXRpb24tb3B0aW9uIGA6dGVtcGxhdGVfbG9jYXRpb25gIG9wdGlvbn0uKioKKyAgICAjICAgVGhlIGZpcnN0IHN0cmluZyBpbiBlYWNoIHBhaXIgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBTYXNzL1NDU1MgZmlsZSwKKyAgICAjICAgdGhlIHNlY29uZCBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIENTUyBmaWxlIHRoYXQgaXQgc2hvdWxkIGJlIGNvbXBpbGVkIHRvLgorICAgICMgICBUaGUgdGhpcmQgc3RyaW5nLCBpZiBwcm92aWRlZCwgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBTb3VyY2VtYXAgZmlsZS4KKyAgICAjIEByZXR1cm4gW0FycmF5PChTdHJpbmcsIFN0cmluZywgU3RyaW5nKT5dCisgICAgIyAgIEEgbGlzdCBvZiBbc2Fzc19maWxlLCBjc3NfZmlsZSwgc291cmNlbWFwX2ZpbGVdIHR1cGxlcyBzaW1pbGFyCisgICAgIyAgIHRvIHdoYXQgd2FzIHBhc3NlZCBpbiwgYnV0IGV4cGFuZGVkIHRvIGluY2x1ZGUgdGhlIGN1cnJlbnQgc3RhdGUKKyAgICAjICAgb2YgdGhlIGRpcmVjdG9yaWVzIGJlaW5nIHVwZGF0ZWQuCisgICAgZGVmIGZpbGVfbGlzdChpbmRpdmlkdWFsX2ZpbGVzID0gW10pCisgICAgICBmaWxlcyA9IGluZGl2aWR1YWxfZmlsZXMubWFwIGRvIHx0dXBsZXwKKyAgICAgICAgaWYgZW5naW5lX29wdGlvbnNbOnNvdXJjZW1hcF0gPT0gOm5vbmUKKyAgICAgICAgICB0dXBsZVswLi4xXQorICAgICAgICBlbHNpZiB0dXBsZS5zaXplIDwgMworICAgICAgICAgIFt0dXBsZVswXSwgdHVwbGVbMV0sIFNhc3M6OlV0aWwuc291cmNlbWFwX25hbWUodHVwbGVbMV0pXQorICAgICAgICBlbHNlCisgICAgICAgICAgdHVwbGUuZHVwCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHRlbXBsYXRlX2xvY2F0aW9uX2FycmF5LmVhY2ggZG8gfHRlbXBsYXRlX2xvY2F0aW9uLCBjc3NfbG9jYXRpb258CisgICAgICAgIFNhc3M6OlV0aWwuZ2xvYihGaWxlLmpvaW4odGVtcGxhdGVfbG9jYXRpb24sICIqKiIsICJbXl9dKi5zW2NhXXNzIikpLnNvcnQuZWFjaCBkbyB8ZmlsZXwKKyAgICAgICAgICAjIEdldCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZQorICAgICAgICAgIG5hbWUgPSBTYXNzOjpVdGlsLnJlbGF0aXZlX3BhdGhfZnJvbShmaWxlLCB0ZW1wbGF0ZV9sb2NhdGlvbikudG9fcworICAgICAgICAgIGNzcyA9IGNzc19maWxlbmFtZShuYW1lLCBjc3NfbG9jYXRpb24pCisgICAgICAgICAgc291cmNlbWFwID0gU2Fzczo6VXRpbC5zb3VyY2VtYXBfbmFtZShjc3MpIHVubGVzcyBlbmdpbmVfb3B0aW9uc1s6c291cmNlbWFwXSA9PSA6bm9uZQorICAgICAgICAgIGZpbGVzIDw8IFtmaWxlLCBjc3MsIHNvdXJjZW1hcF0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGZpbGVzCisgICAgZW5kCisKKyAgICAjIFdhdGNoZXMgdGhlIHRlbXBsYXRlIGRpcmVjdG9yeSAob3IgZGlyZWN0b3JpZXMpCisgICAgIyBhbmQgdXBkYXRlcyB0aGUgQ1NTIGZpbGVzIHdoZW5ldmVyIHRoZSByZWxhdGVkIFNhc3MvU0NTUyBmaWxlcyBjaGFuZ2UuCisgICAgIyBgd2F0Y2hgIG5ldmVyIHJldHVybnMuCisgICAgIworICAgICMgV2hlbmV2ZXIgYSBjaGFuZ2UgaXMgZGV0ZWN0ZWQgdG8gYSBTYXNzL1NDU1MgZmlsZSBpbgorICAgICMge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjdGVtcGxhdGVfbG9jYXRpb24tb3B0aW9uIGA6dGVtcGxhdGVfbG9jYXRpb25gfSwKKyAgICAjIHRoZSBjb3JyZXNwb25kaW5nIENTUyBmaWxlIGluIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI2Nzc19sb2NhdGlvbi1vcHRpb24gYDpjc3NfbG9jYXRpb25gfQorICAgICMgd2lsbCBiZSByZWNvbXBpbGVkLgorICAgICMgVGhlIENTUyBmaWxlcyBvZiBhbnkgU2Fzcy9TQ1NTIGZpbGVzIHRoYXQgaW1wb3J0IHRoZSBjaGFuZ2VkIGZpbGUgd2lsbCBhbHNvIGJlIHJlY29tcGlsZWQuCisgICAgIworICAgICMgQmVmb3JlIHRoZSB3YXRjaGluZyBzdGFydHMgaW4gZWFybmVzdCwgYHdhdGNoYCBjYWxscyBceyN1cGRhdGVcX3N0eWxlc2hlZXRzfS4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgYHdhdGNoYCB1c2VzIHRoZSBbTGlzdGVuXShodHRwOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4pIGxpYnJhcnkKKyAgICAjIHRvIG1vbml0b3IgdGhlIGZpbGVzeXN0ZW0gZm9yIGNoYW5nZXMuCisgICAgIyBMaXN0ZW4gaXNuJ3QgbG9hZGVkIHVudGlsIGB3YXRjaGAgaXMgcnVuLgorICAgICMgVGhlIHZlcnNpb24gb2YgTGlzdGVuIGRpc3RyaWJ1dGVkIHdpdGggU2FzcyBpcyBsb2FkZWQgYnkgZGVmYXVsdCwKKyAgICAjIGJ1dCBpZiBhbm90aGVyIHZlcnNpb24gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgdGhhdCB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAjCisgICAgIyBAcGFyYW0gaW5kaXZpZHVhbF9maWxlcyBbQXJyYXk8KFN0cmluZywgU3RyaW5nWywgU3RyaW5nXSk+XQorICAgICMgICBBIGxpc3Qgb2YgZmlsZXMgdG8gY2hlY2sgZm9yIHVwZGF0ZXMKKyAgICAjICAgKippbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlCisgICAgIyAgIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI3RlbXBsYXRlX2xvY2F0aW9uLW9wdGlvbiBgOnRlbXBsYXRlX2xvY2F0aW9uYCBvcHRpb259LioqCisgICAgIyAgIFRoZSBmaXJzdCBzdHJpbmcgaW4gZWFjaCBwYWlyIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgU2Fzcy9TQ1NTIGZpbGUsCisgICAgIyAgIHRoZSBzZWNvbmQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBDU1MgZmlsZSB0aGF0IGl0IHNob3VsZCBiZSBjb21waWxlZCB0by4KKyAgICAjICAgVGhlIHRoaXJkIHN0cmluZywgaWYgcHJvdmlkZWQsIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgU291cmNlbWFwIGZpbGUuCisgICAgIyBAcGFyYW0gb3B0aW9ucyBbSGFzaF0gVGhlIG9wdGlvbnMgdGhhdCBjb250cm9sIGhvdyB3YXRjaGluZyB3b3Jrcy4KKyAgICAjIEBvcHRpb24gb3B0aW9ucyBbQm9vbGVhbl0gOnNraXBfaW5pdGlhbF91cGRhdGUKKyAgICAjICAgRG9uJ3QgZG8gYW4gaW5pdGlhbCB1cGRhdGUgd2hlbiBzdGFydGluZyB0aGUgd2F0Y2hlciB3aGVuIHRydWUKKyAgICBkZWYgd2F0Y2goaW5kaXZpZHVhbF9maWxlcyA9IFtdLCBvcHRpb25zID0ge30pCisgICAgICBAaW5mZXJyZWRfZGlyZWN0b3JpZXMgPSBbXQorICAgICAgb3B0aW9ucywgaW5kaXZpZHVhbF9maWxlcyA9IGluZGl2aWR1YWxfZmlsZXMsIFtdIGlmIGluZGl2aWR1YWxfZmlsZXMuaXNfYT8oSGFzaCkKKyAgICAgIHVwZGF0ZV9zdHlsZXNoZWV0cyhpbmRpdmlkdWFsX2ZpbGVzKSB1bmxlc3Mgb3B0aW9uc1s6c2tpcF9pbml0aWFsX3VwZGF0ZV0KKworICAgICAgZGlyZWN0b3JpZXMgPSB3YXRjaGVkX3BhdGhzCisgICAgICBpbmRpdmlkdWFsX2ZpbGVzLmVhY2ggZG8gfChzb3VyY2UsIF8sIF8pfAorICAgICAgICBzb3VyY2UgPSBGaWxlLmV4cGFuZF9wYXRoKHNvdXJjZSkKKyAgICAgICAgQHdhdGNoZWRfZmlsZXMgPDwgU2Fzczo6VXRpbC5yZWFscGF0aChzb3VyY2UpLnRvX3MKKyAgICAgICAgQGluZmVycmVkX2RpcmVjdG9yaWVzIDw8IEZpbGUuZGlybmFtZShzb3VyY2UpCisgICAgICBlbmQKKworICAgICAgZGlyZWN0b3JpZXMgKz0gQGluZmVycmVkX2RpcmVjdG9yaWVzCisgICAgICBkaXJlY3RvcmllcyA9IHJlbW92ZV9yZWR1bmRhbnRfZGlyZWN0b3JpZXMoZGlyZWN0b3JpZXMpCisKKyAgICAgICMgVE9ETzogS2VlcCBiZXR0ZXIgdHJhY2sgb2Ygd2hhdCBkZXBlbmRzIG9uIHdoYXQKKyAgICAgICMgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gYSBnbG9iYWwgdXBkYXRlIGV2ZXJ5IHRpbWUgYW55dGhpbmcgY2hhbmdlcy4KKyAgICAgICMgWFhYIFRoZSA6YWRkaXRpb25hbF93YXRjaF9wYXRocyBvcHRpb24gZXhpc3RzIGZvciBDb21wYXNzIHRvIHVzZSB1bnRpbAorICAgICAgIyBhIGRlcHJlY2F0ZWQgZmVhdHVyZSBpcyByZW1vdmVkLiBJdCBtYXkgYmUgcmVtb3ZlZCB3aXRob3V0IHdhcm5pbmcuCisgICAgICBkaXJlY3RvcmllcyArPSBBcnJheShvcHRpb25zWzphZGRpdGlvbmFsX3dhdGNoX3BhdGhzXSkKKworICAgICAgb3B0aW9ucyA9IHsKKyAgICAgICAgOnJlbGF0aXZlX3BhdGhzID0+IGZhbHNlLAorICAgICAgICAjIFRoZSBuYXRpdmUgd2luZG93cyBsaXN0ZW5lciBpcyBtdWNoIHNsb3dlciB0aGFuIHRoZSBwb2xsaW5nIG9wdGlvbiwgYWNjb3JkaW5nIHRvCisgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL25leDMvc2Fzcy9jb21taXQvYTMwMzE4NTZiMjJiYzgzNGE1NDE3ZGVkZWNiMDM4YjdiZTliOWUzZQorICAgICAgICA6Zm9yY2VfcG9sbGluZyA9PiBAb3B0aW9uc1s6cG9sbF0gfHwgU2Fzczo6VXRpbC53aW5kb3dzPworICAgICAgfQorCisgICAgICBsaXN0ZW5lciA9IGNyZWF0ZV9saXN0ZW5lcigqZGlyZWN0b3JpZXMsIG9wdGlvbnMpIGRvIHxtb2RpZmllZCwgYWRkZWQsIHJlbW92ZWR8CisgICAgICAgIG9uX2ZpbGVfY2hhbmdlZChpbmRpdmlkdWFsX2ZpbGVzLCBtb2RpZmllZCwgYWRkZWQsIHJlbW92ZWQpCisgICAgICAgIHlpZWxkKG1vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZCkgaWYgYmxvY2tfZ2l2ZW4/CisgICAgICBlbmQKKworICAgICAgYmVnaW4KKyAgICAgICAgbGlzdGVuZXIuc3RhcnQKKyAgICAgICAgc2xlZXAKKyAgICAgIHJlc2N1ZSBJbnRlcnJ1cHQKKyAgICAgICAgIyBTcXVlbGNoIEludGVycnVwdCBmb3IgY2xlYW4gZXhpdCBmcm9tIExpc3Rlbjo6TGlzdGVuZXIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBOb24tZGVzdHJ1Y3RpdmVseSBtb2RpZmllcyBceyNvcHRpb25zfSBzbyB0aGF0IGRlZmF1bHQgdmFsdWVzIGFyZSBwcm9wZXJseSBzZXQsCisgICAgIyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICMKKyAgICAjIEBwYXJhbSBhZGRpdGlvbmFsX29wdGlvbnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gQW4gb3B0aW9ucyBoYXNoIHdpdGggd2hpY2ggdG8gbWVyZ2UgXHsjb3B0aW9uc30KKyAgICAjIEByZXR1cm4gW3tTeW1ib2wgPT4gT2JqZWN0fV0gVGhlIG1vZGlmaWVkIG9wdGlvbnMgaGFzaAorICAgIGRlZiBlbmdpbmVfb3B0aW9ucyhhZGRpdGlvbmFsX29wdGlvbnMgPSB7fSkKKyAgICAgIG9wdHMgPSBvcHRpb25zLm1lcmdlKGFkZGl0aW9uYWxfb3B0aW9ucykKKyAgICAgIG9wdHNbOmxvYWRfcGF0aHNdID0gbG9hZF9wYXRocyhvcHRzKQorICAgICAgb3B0aW9uc1s6c291cmNlbWFwXSA9IDphdXRvIGlmIG9wdGlvbnNbOnNvdXJjZW1hcF0gPT0gdHJ1ZQorICAgICAgb3B0aW9uc1s6c291cmNlbWFwXSA9IDpub25lIGlmIG9wdGlvbnNbOnNvdXJjZW1hcF0gPT0gZmFsc2UKKyAgICAgIG9wdHMKKyAgICBlbmQKKworICAgICMgQ29tcGFzcyBleHBlY3RzIHRoaXMgdG8gZXhpc3QKKyAgICBkZWYgc3R5bGVzaGVldF9uZWVkc191cGRhdGU/KGNzc19maWxlLCB0ZW1wbGF0ZV9maWxlKQorICAgICAgU3RhbGVuZXNzQ2hlY2tlci5zdHlsZXNoZWV0X25lZWRzX3VwZGF0ZT8oY3NzX2ZpbGUsIHRlbXBsYXRlX2ZpbGUpCisgICAgZW5kCisKKyAgICAjIFJlbW92ZSBhbGwgb3V0cHV0IGZpbGVzIHRoYXQgd291bGQgYmUgY3JlYXRlZCBieSBjYWxsaW5nIHVwZGF0ZV9zdHlsZXNoZWV0cywgaWYgdGhleSBleGlzdC4KKyAgICAjCisgICAgIyBUaGlzIG1ldGhvZCBydW5zIHRoZSBkZWxldGluZ19jc3MgYW5kIGRlbGV0aW5nX3NvdXJjZW1hcCBjYWxsYmFja3MgZm9yCisgICAgIyB0aGUgZmlsZXMgdGhhdCBhcmUgZGVsZXRlZC4KKyAgICAjCisgICAgIyBAcGFyYW0gaW5kaXZpZHVhbF9maWxlcyBbQXJyYXk8KFN0cmluZywgU3RyaW5nWywgU3RyaW5nXSk+XQorICAgICMgICBBIGxpc3Qgb2YgZmlsZXMgdG8gY2hlY2sgZm9yIHVwZGF0ZXMKKyAgICAjICAgKippbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlCisgICAgIyAgIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI3RlbXBsYXRlX2xvY2F0aW9uLW9wdGlvbiBgOnRlbXBsYXRlX2xvY2F0aW9uYCBvcHRpb259LioqCisgICAgIyAgIFRoZSBmaXJzdCBzdHJpbmcgaW4gZWFjaCBwYWlyIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgU2Fzcy9TQ1NTIGZpbGUsCisgICAgIyAgIHRoZSBzZWNvbmQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBDU1MgZmlsZSB0aGF0IGl0IHNob3VsZCBiZSBjb21waWxlZCB0by4KKyAgICAjICAgVGhlIHRoaXJkIHN0cmluZywgaWYgcHJvdmlkZWQsIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgU291cmNlbWFwIGZpbGUuCisgICAgZGVmIGNsZWFuKGluZGl2aWR1YWxfZmlsZXMgPSBbXSkKKyAgICAgIGZpbGVfbGlzdChpbmRpdmlkdWFsX2ZpbGVzKS5lYWNoIGRvIHwoXywgY3NzX2ZpbGUsIHNvdXJjZW1hcF9maWxlKXwKKyAgICAgICAgaWYgRmlsZS5leGlzdD8oY3NzX2ZpbGUpCisgICAgICAgICAgcnVuX2RlbGV0aW5nX2NzcyBjc3NfZmlsZQorICAgICAgICAgIEZpbGUuZGVsZXRlKGNzc19maWxlKQorICAgICAgICBlbmQKKyAgICAgICAgaWYgc291cmNlbWFwX2ZpbGUgJiYgRmlsZS5leGlzdD8oc291cmNlbWFwX2ZpbGUpCisgICAgICAgICAgcnVuX2RlbGV0aW5nX3NvdXJjZW1hcCBzb3VyY2VtYXBfZmlsZQorICAgICAgICAgIEZpbGUuZGVsZXRlKHNvdXJjZW1hcF9maWxlKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICAjIFRoaXMgaXMgbW9ja2VkIG91dCBpbiBjb21waWxlcl90ZXN0LnJiLgorICAgIGRlZiBjcmVhdGVfbGlzdGVuZXIoKmFyZ3MsICZibG9jaykKKyAgICAgIHJlcXVpcmUgJ3Nhc3MtbGlzdGVuJworICAgICAgU2Fzc0xpc3Rlbi50bygqYXJncywgJmJsb2NrKQorICAgIGVuZAorCisgICAgZGVmIHJlbW92ZV9yZWR1bmRhbnRfZGlyZWN0b3JpZXMoZGlyZWN0b3JpZXMpCisgICAgICBkZWR1cHBlZCA9IFtdCisgICAgICBkaXJlY3Rvcmllcy5lYWNoIGRvIHxuZXdfZGlyZWN0b3J5fAorICAgICAgICAjIG5vIG5lZWQgdG8gYWRkIGEgZGlyZWN0b3J5IHRoYXQgaXMgYWxyZWFkeSB3YXRjaGVkLgorICAgICAgICBuZXh0IGlmIGRlZHVwcGVkLmFueT8gZG8gfGV4aXN0aW5nX2RpcmVjdG9yeXwKKyAgICAgICAgICBjaGlsZF9vZl9kaXJlY3Rvcnk/KGV4aXN0aW5nX2RpcmVjdG9yeSwgbmV3X2RpcmVjdG9yeSkKKyAgICAgICAgZW5kCisgICAgICAgICMgZ2V0IHJpZCBvZiBhbnkgc3ViIGRpcmVjdG9yaWVzIG9mIHRoaXMgbmV3IGRpcmVjdG9yeQorICAgICAgICBkZWR1cHBlZC5yZWplY3QhIGRvIHxleGlzdGluZ19kaXJlY3Rvcnl8CisgICAgICAgICAgY2hpbGRfb2ZfZGlyZWN0b3J5PyhuZXdfZGlyZWN0b3J5LCBleGlzdGluZ19kaXJlY3RvcnkpCisgICAgICAgIGVuZAorICAgICAgICBkZWR1cHBlZCA8PCBuZXdfZGlyZWN0b3J5CisgICAgICBlbmQKKyAgICAgIGRlZHVwcGVkCisgICAgZW5kCisKKyAgICBkZWYgb25fZmlsZV9jaGFuZ2VkKGluZGl2aWR1YWxfZmlsZXMsIG1vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZCkKKyAgICAgIHJlY29tcGlsZV9yZXF1aXJlZCA9IGZhbHNlCisKKyAgICAgIG1vZGlmaWVkLnVuaXEuZWFjaCBkbyB8ZnwKKyAgICAgICAgbmV4dCB1bmxlc3Mgd2F0Y2hlZF9maWxlPyhmKQorICAgICAgICByZWNvbXBpbGVfcmVxdWlyZWQgPSB0cnVlCisgICAgICAgIHJ1bl90ZW1wbGF0ZV9tb2RpZmllZChyZWxhdGl2ZV90b19wd2QoZikpCisgICAgICBlbmQKKworICAgICAgYWRkZWQudW5pcS5lYWNoIGRvIHxmfAorICAgICAgICBuZXh0IHVubGVzcyB3YXRjaGVkX2ZpbGU/KGYpCisgICAgICAgIHJlY29tcGlsZV9yZXF1aXJlZCA9IHRydWUKKyAgICAgICAgcnVuX3RlbXBsYXRlX2NyZWF0ZWQocmVsYXRpdmVfdG9fcHdkKGYpKQorICAgICAgZW5kCisKKyAgICAgIHJlbW92ZWQudW5pcS5lYWNoIGRvIHxmfAorICAgICAgICBuZXh0IHVubGVzcyB3YXRjaGVkX2ZpbGU/KGYpCisgICAgICAgIHJ1bl90ZW1wbGF0ZV9kZWxldGVkKHJlbGF0aXZlX3RvX3B3ZChmKSkKKyAgICAgICAgaWYgKGZpbGVzID0gaW5kaXZpZHVhbF9maWxlcy5maW5kIHt8KHNvdXJjZSwgXywgXyl8IEZpbGUuZXhwYW5kX3BhdGgoc291cmNlKSA9PSBmfSkKKyAgICAgICAgICByZWNvbXBpbGVfcmVxdWlyZWQgPSB0cnVlCisgICAgICAgICAgIyBUaGlzIHdhcyBhIGZpbGUgd2Ugd2VyZSB3YXRjaGluZyBleHBsaWNpdGx5IGFuZCBjb21waWxpbmcgdG8gYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLgorICAgICAgICAgICMgRGVsZXRlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUuCisgICAgICAgICAgdHJ5X2RlbGV0ZV9jc3MgZmlsZXNbMV0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG5leHQgdW5sZXNzIHdhdGNoZWRfZmlsZT8oZikKKyAgICAgICAgICByZWNvbXBpbGVfcmVxdWlyZWQgPSB0cnVlCisgICAgICAgICAgIyBMb29rIGZvciB0aGUgc2FzcyBkaXJlY3RvcnkgdGhhdCBjb250YWluZWQgdGhlIHNhc3MgZmlsZQorICAgICAgICAgICMgQW5kIHRyeSB0byByZW1vdmUgdGhlIGNzcyBmaWxlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXQKKyAgICAgICAgICB0ZW1wbGF0ZV9sb2NhdGlvbl9hcnJheS5lYWNoIGRvIHwoc2Fzc19kaXIsIGNzc19kaXIpfAorICAgICAgICAgICAgc2Fzc19kaXIgPSBGaWxlLmV4cGFuZF9wYXRoKHNhc3NfZGlyKQorICAgICAgICAgICAgbmV4dCB1bmxlc3MgY2hpbGRfb2ZfZGlyZWN0b3J5PyhzYXNzX2RpciwgZikKKyAgICAgICAgICAgIHJlbWFpbmRlciA9IGZbKHNhc3NfZGlyLnNpemUgKyAxKS4uLTFdCisgICAgICAgICAgICB0cnlfZGVsZXRlX2Nzcyhjc3NfZmlsZW5hbWUocmVtYWluZGVyLCBjc3NfZGlyKSkKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHJldHVybiB1bmxlc3MgcmVjb21waWxlX3JlcXVpcmVkCisKKyAgICAgICMgSW4gY2FzZSBhIGZpbGUgd2UncmUgd2F0Y2hpbmcgaXMgcmVtb3ZlZCBhbmQgdGhlbiByZWNyZWF0ZWQgd2UKKyAgICAgICMgcHJ1bmUgb3V0IHRoZSBub24tZXhpc3RhbnQgZmlsZXMgaGVyZS4KKyAgICAgIHdhdGNoZWRfZmlsZXNfcmVtYWluaW5nID0gaW5kaXZpZHVhbF9maWxlcy5zZWxlY3Qge3woc291cmNlLCBfLCBfKXwgRmlsZS5leGlzdD8oc291cmNlKX0KKyAgICAgIHVwZGF0ZV9zdHlsZXNoZWV0cyh3YXRjaGVkX2ZpbGVzX3JlbWFpbmluZykKKyAgICBlbmQKKworICAgIGRlZiB1cGRhdGVfc3R5bGVzaGVldChmaWxlbmFtZSwgY3NzLCBzb3VyY2VtYXApCisgICAgICBkaXIgPSBGaWxlLmRpcm5hbWUoY3NzKQorICAgICAgdW5sZXNzIEZpbGUuZXhpc3Q/KGRpcikKKyAgICAgICAgcnVuX2NyZWF0aW5nX2RpcmVjdG9yeSBkaXIKKyAgICAgICAgRmlsZVV0aWxzLm1rZGlyX3AgZGlyCisgICAgICBlbmQKKworICAgICAgYmVnaW4KKyAgICAgICAgRmlsZS5yZWFkKGZpbGVuYW1lKSB1bmxlc3MgRmlsZS5yZWFkYWJsZT8oZmlsZW5hbWUpICMgdHJpZ2dlcnMgYW4gZXJyb3IgZm9yIGhhbmRsaW5nCisgICAgICAgIGVuZ2luZV9vcHRzID0gZW5naW5lX29wdGlvbnMoOmNzc19maWxlbmFtZSA9PiBjc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZpbGVuYW1lID0+IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzb3VyY2VtYXBfZmlsZW5hbWUgPT4gc291cmNlbWFwKQorICAgICAgICBtYXBwaW5nID0gbmlsCisgICAgICAgIHJ1bl9jb21waWxhdGlvbl9zdGFydGluZyhmaWxlbmFtZSwgY3NzLCBzb3VyY2VtYXApCisgICAgICAgIGVuZ2luZSA9IFNhc3M6OkVuZ2luZS5mb3JfZmlsZShmaWxlbmFtZSwgZW5naW5lX29wdHMpCisgICAgICAgIGlmIHNvdXJjZW1hcAorICAgICAgICAgIHJlbmRlcmVkLCBtYXBwaW5nID0gZW5naW5lLnJlbmRlcl93aXRoX3NvdXJjZW1hcChGaWxlLmJhc2VuYW1lKHNvdXJjZW1hcCkpCisgICAgICAgIGVsc2UKKyAgICAgICAgICByZW5kZXJlZCA9IGVuZ2luZS5yZW5kZXIKKyAgICAgICAgZW5kCisgICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlCisgICAgICAgIGNvbXBpbGF0aW9uX2Vycm9yX29jY3VycmVkID0gdHJ1ZQorICAgICAgICBydW5fY29tcGlsYXRpb25fZXJyb3IgZSwgZmlsZW5hbWUsIGNzcywgc291cmNlbWFwCisgICAgICAgIHJhaXNlIGUgdW5sZXNzIG9wdGlvbnNbOmZ1bGxfZXhjZXB0aW9uXQorICAgICAgICByZW5kZXJlZCA9IFNhc3M6OlN5bnRheEVycm9yLmV4Y2VwdGlvbl90b19jc3MoZSwgb3B0aW9uc1s6bGluZV0gfHwgMSkKKyAgICAgIGVuZAorCisgICAgICB3cml0ZV9maWxlKGNzcywgcmVuZGVyZWQpCisgICAgICBpZiBtYXBwaW5nCisgICAgICAgIHdyaXRlX2ZpbGUoCisgICAgICAgICAgc291cmNlbWFwLAorICAgICAgICAgIG1hcHBpbmcudG9fanNvbigKKyAgICAgICAgICAgIDpjc3NfcGF0aCA9PiBjc3MsIDpzb3VyY2VtYXBfcGF0aCA9PiBzb3VyY2VtYXAsIDp0eXBlID0+IG9wdGlvbnNbOnNvdXJjZW1hcF0pKQorICAgICAgZW5kCisgICAgICBydW5fdXBkYXRlZF9zdHlsZXNoZWV0KGZpbGVuYW1lLCBjc3MsIHNvdXJjZW1hcCkgdW5sZXNzIGNvbXBpbGF0aW9uX2Vycm9yX29jY3VycmVkCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmlsZShmaWxlTmFtZSwgY29udGVudCkKKyAgICAgIGZsYWcgPSAndycKKyAgICAgIGZsYWcgPSAnd2InIGlmIFNhc3M6OlV0aWwud2luZG93cz8gJiYgb3B0aW9uc1s6dW5peF9uZXdsaW5lc10KKyAgICAgIEZpbGUub3BlbihmaWxlTmFtZSwgZmxhZykgZG8gfGZpbGV8CisgICAgICAgIGZpbGUuc2V0X2VuY29kaW5nKGNvbnRlbnQuZW5jb2RpbmcpCisgICAgICAgIGZpbGUucHJpbnQoY29udGVudCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHRyeV9kZWxldGVfY3NzKGNzcykKKyAgICAgIGlmIEZpbGUuZXhpc3Q/KGNzcykKKyAgICAgICAgcnVuX2RlbGV0aW5nX2NzcyBjc3MKKyAgICAgICAgRmlsZS5kZWxldGUgY3NzCisgICAgICBlbmQKKyAgICAgIG1hcCA9IFNhc3M6OlV0aWwuc291cmNlbWFwX25hbWUoY3NzKQorCisgICAgICByZXR1cm4gdW5sZXNzIEZpbGUuZXhpc3Q/KG1hcCkKKworICAgICAgcnVuX2RlbGV0aW5nX3NvdXJjZW1hcCBtYXAKKyAgICAgIEZpbGUuZGVsZXRlIG1hcAorICAgIGVuZAorCisgICAgZGVmIHdhdGNoZWRfZmlsZT8oZmlsZSkKKyAgICAgIEB3YXRjaGVkX2ZpbGVzLmluY2x1ZGU/KGZpbGUpIHx8CisgICAgICAgIG5vcm1hbGl6ZWRfbG9hZF9wYXRocy5hbnk/IHt8bHB8IGxwLndhdGNoZWRfZmlsZT8oZmlsZSl9IHx8CisgICAgICAgIEBpbmZlcnJlZF9kaXJlY3Rvcmllcy5hbnk/IHt8ZHwgc2Fzc19maWxlX2luX2RpcmVjdG9yeT8oZCwgZmlsZSl9CisgICAgZW5kCisKKyAgICBkZWYgc2Fzc19maWxlX2luX2RpcmVjdG9yeT8oZGlyZWN0b3J5LCBmaWxlbmFtZSkKKyAgICAgIGZpbGVuYW1lID1+IC9cLnNbYWNdc3MkLyAmJiBmaWxlbmFtZS5zdGFydF93aXRoPyhkaXJlY3RvcnkgKyBGaWxlOjpTRVBBUkFUT1IpCisgICAgZW5kCisKKyAgICBkZWYgd2F0Y2hlZF9wYXRocworICAgICAgQHdhdGNoZWRfcGF0aHMgfHw9IG5vcm1hbGl6ZWRfbG9hZF9wYXRocy5tYXAge3xscHwgbHAuZGlyZWN0b3JpZXNfdG9fd2F0Y2h9LmNvbXBhY3QuZmxhdHRlbgorICAgIGVuZAorCisgICAgZGVmIG5vcm1hbGl6ZWRfbG9hZF9wYXRocworICAgICAgQG5vcm1hbGl6ZWRfbG9hZF9wYXRocyB8fD0KKyAgICAgICAgU2Fzczo6RW5naW5lLm5vcm1hbGl6ZV9vcHRpb25zKDpsb2FkX3BhdGhzID0+IGxvYWRfcGF0aHMpWzpsb2FkX3BhdGhzXQorICAgIGVuZAorCisgICAgZGVmIGxvYWRfcGF0aHMob3B0cyA9IG9wdGlvbnMpCisgICAgICAob3B0c1s6bG9hZF9wYXRoc10gfHwgW10pICsgdGVtcGxhdGVfbG9jYXRpb25zCisgICAgZW5kCisKKyAgICBkZWYgdGVtcGxhdGVfbG9jYXRpb25zCisgICAgICB0ZW1wbGF0ZV9sb2NhdGlvbl9hcnJheS50b19hLm1hcCB7fGx8IGwuZmlyc3R9CisgICAgZW5kCisKKyAgICBkZWYgY3NzX2xvY2F0aW9ucworICAgICAgdGVtcGxhdGVfbG9jYXRpb25fYXJyYXkudG9fYS5tYXAge3xsfCBsLmxhc3R9CisgICAgZW5kCisKKyAgICBkZWYgY3NzX2ZpbGVuYW1lKG5hbWUsIHBhdGgpCisgICAgICAiI3twYXRofSN7RmlsZTo6U0VQQVJBVE9SIHVubGVzcyBwYXRoLmVuZF93aXRoPyhGaWxlOjpTRVBBUkFUT1IpfSN7bmFtZX0iLgorICAgICAgICBnc3ViKC9cLnNbYWNdc3MkLywgJy5jc3MnKQorICAgIGVuZAorCisgICAgZGVmIHJlbGF0aXZlX3RvX3B3ZChmKQorICAgICAgU2Fzczo6VXRpbC5yZWxhdGl2ZV9wYXRoX2Zyb20oZiwgRGlyLnB3ZCkudG9fcworICAgIHJlc2N1ZSBBcmd1bWVudEVycm9yICMgd2hlbiBhIHJlbGF0aXZlIHBhdGggY2Fubm90IGJlIGNvbXB1dGVkCisgICAgICBmCisgICAgZW5kCisKKyAgICBkZWYgY2hpbGRfb2ZfZGlyZWN0b3J5PyhwYXJlbnQsIGNoaWxkKQorICAgICAgcGFyZW50X2RpciA9IHBhcmVudC5lbmRfd2l0aD8oRmlsZTo6U0VQQVJBVE9SKSA/IHBhcmVudCA6IChwYXJlbnQgKyBGaWxlOjpTRVBBUkFUT1IpCisgICAgICBjaGlsZC5zdGFydF93aXRoPyhwYXJlbnRfZGlyKSB8fCBwYXJlbnQgPT0gY2hpbGQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvcGx1Z2luL2NvbmZpZ3VyYXRpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9jb25maWd1cmF0aW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYThhYTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9jb25maWd1cmF0aW9uLnJiCkBAIC0wLDAgKzEsMTM0IEBACittb2R1bGUgU2FzcworICBtb2R1bGUgUGx1Z2luCisgICAgIyBXZSBrZWVwIGNvbmZpZ3VyYXRpb24gaW4gaXRzIG93biBzZWxmLWNvbnRhaW5lZCBmaWxlIHNvIHRoYXQgd2UgY2FuIGxvYWQKKyAgICAjIGl0IGluZGVwZW5kZW50bHkgaW4gUmFpbHMgMywgd2hlcmUgdGhlIGZ1bGwgcGx1Z2luIHN0dWZmIGlzIGxhenktbG9hZGVkLgorICAgICMKKyAgICAjIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRocmVhZC1zYWZlLiBGb3IgZ3VhcmFudGVlZCB0aHJlYWQKKyAgICAjIHNhZmV0eSwgdXNlIGEgc2VwYXJhdGUge1Nhc3M6OlBsdWdpbn0gZm9yIGVhY2ggdGhyZWFkLgorICAgIG1vZHVsZSBDb25maWd1cmF0aW9uCisgICAgICAjIFJldHVybnMgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgYSB7U2Fzczo6UGx1Z2luOjpDb21waWxlcn0uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW3tTeW1ib2wgPT4gT2JqZWN0fV0KKyAgICAgIGRlZiBkZWZhdWx0X29wdGlvbnMKKyAgICAgICAgQGRlZmF1bHRfb3B0aW9ucyB8fD0geworICAgICAgICAgIDpjc3NfbG9jYXRpb24gICAgICAgPT4gJy4vcHVibGljL3N0eWxlc2hlZXRzJywKKyAgICAgICAgICA6YWx3YXlzX3VwZGF0ZSAgICAgID0+IGZhbHNlLAorICAgICAgICAgIDphbHdheXNfY2hlY2sgICAgICAgPT4gdHJ1ZSwKKyAgICAgICAgICA6ZnVsbF9leGNlcHRpb24gICAgID0+IHRydWUsCisgICAgICAgICAgOmNhY2hlX2xvY2F0aW9uICAgICA9PiAiLnNhc3MtY2FjaGUiCisgICAgICAgIH0uZnJlZXplCisgICAgICBlbmQKKworICAgICAgIyBSZXNldHMgdGhlIG9wdGlvbnMgYW5kCisgICAgICAjIHtTYXNzOjpDYWxsYmFja3M6Okluc3RhbmNlTWV0aG9kcyNjbGVhcl9jYWxsYmFja3MhIGNsZWFycyBhbGwgY2FsbGJhY2tzfS4KKyAgICAgIGRlZiByZXNldCEKKyAgICAgICAgQG9wdGlvbnMgPSBuaWwKKyAgICAgICAgY2xlYXJfY2FsbGJhY2tzIQorICAgICAgZW5kCisKKyAgICAgICMgQW4gb3B0aW9ucyBoYXNoLiBTZWUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjT3B0aW9ucyB0aGUgU2FzcyBvcHRpb25zCisgICAgICAjIGRvY3VtZW50YXRpb259LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFt7U3ltYm9sID0+IE9iamVjdH1dCisgICAgICBkZWYgb3B0aW9ucworICAgICAgICBAb3B0aW9ucyB8fD0gZGVmYXVsdF9vcHRpb25zLmR1cAorICAgICAgZW5kCisKKyAgICAgICMgQWRkcyBhIG5ldyB0ZW1wbGF0ZS1sb2NhdGlvbi9jc3MtbG9jYXRpb24gbWFwcGluZy4KKyAgICAgICMgVGhpcyBtZWFucyB0aGF0IFNhc3MvU0NTUyBmaWxlcyBpbiBgdGVtcGxhdGVfbG9jYXRpb25gCisgICAgICAjIHdpbGwgYmUgY29tcGlsZWQgdG8gQ1NTIGZpbGVzIGluIGBjc3NfbG9jYXRpb25gLgorICAgICAgIworICAgICAgIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIG1hbnVhbGx5IG1hbmlwdWxhdGluZyB0aGUKKyAgICAgICMge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjdGVtcGxhdGVfbG9jYXRpb24tb3B0aW9uIGA6dGVtcGxhdGVfbG9jYXRpb25gIG9wdGlvbn0KKyAgICAgICMgc2luY2UgdGhlIG9wdGlvbiBjYW4gYmUgaW4gbXVsdGlwbGUgZm9ybWF0cy4KKyAgICAgICMKKyAgICAgICMgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgY2hhbmdlIGBvcHRpb25zWzp0ZW1wbGF0ZV9sb2NhdGlvbl1gCisgICAgICAjIHRvIGJlIGluIHRoZSBBcnJheSBmb3JtYXQuCisgICAgICAjIFRoaXMgbWVhbnMgdGhhdCBldmVuIGlmIGBvcHRpb25zWzp0ZW1wbGF0ZV9sb2NhdGlvbl1gCisgICAgICAjIGhhZCBwcmV2aW91c2x5IGJlZW4gYSBIYXNoIG9yIGEgU3RyaW5nLAorICAgICAgIyBpdCB3aWxsIG5vdyBiZSBhbiBBcnJheS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHRlbXBsYXRlX2xvY2F0aW9uIFtTdHJpbmddIFRoZSBsb2NhdGlvbiB3aGVyZSBTYXNzL1NDU1MgZmlsZXMgd2lsbCBiZS4KKyAgICAgICMgQHBhcmFtIGNzc19sb2NhdGlvbiBbU3RyaW5nXSBUaGUgbG9jYXRpb24gd2hlcmUgY29tcGlsZWQgQ1NTIGZpbGVzIHdpbGwgZ28uCisgICAgICBkZWYgYWRkX3RlbXBsYXRlX2xvY2F0aW9uKHRlbXBsYXRlX2xvY2F0aW9uLCBjc3NfbG9jYXRpb24gPSBvcHRpb25zWzpjc3NfbG9jYXRpb25dKQorICAgICAgICBub3JtYWxpemVfdGVtcGxhdGVfbG9jYXRpb24hCisgICAgICAgIHRlbXBsYXRlX2xvY2F0aW9uX2FycmF5IDw8IFt0ZW1wbGF0ZV9sb2NhdGlvbiwgY3NzX2xvY2F0aW9uXQorICAgICAgZW5kCisKKyAgICAgICMgUmVtb3ZlcyBhIHRlbXBsYXRlLWxvY2F0aW9uL2Nzcy1sb2NhdGlvbiBtYXBwaW5nLgorICAgICAgIyBUaGlzIG1lYW5zIHRoYXQgU2Fzcy9TQ1NTIGZpbGVzIGluIGB0ZW1wbGF0ZV9sb2NhdGlvbmAKKyAgICAgICMgd2lsbCBubyBsb25nZXIgYmUgY29tcGlsZWQgdG8gQ1NTIGZpbGVzIGluIGBjc3NfbG9jYXRpb25gLgorICAgICAgIworICAgICAgIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIG1hbnVhbGx5IG1hbmlwdWxhdGluZyB0aGUKKyAgICAgICMge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjdGVtcGxhdGVfbG9jYXRpb24tb3B0aW9uIGA6dGVtcGxhdGVfbG9jYXRpb25gIG9wdGlvbn0KKyAgICAgICMgc2luY2UgdGhlIG9wdGlvbiBjYW4gYmUgaW4gbXVsdGlwbGUgZm9ybWF0cy4KKyAgICAgICMKKyAgICAgICMgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgY2hhbmdlIGBvcHRpb25zWzp0ZW1wbGF0ZV9sb2NhdGlvbl1gCisgICAgICAjIHRvIGJlIGluIHRoZSBBcnJheSBmb3JtYXQuCisgICAgICAjIFRoaXMgbWVhbnMgdGhhdCBldmVuIGlmIGBvcHRpb25zWzp0ZW1wbGF0ZV9sb2NhdGlvbl1gCisgICAgICAjIGhhZCBwcmV2aW91c2x5IGJlZW4gYSBIYXNoIG9yIGEgU3RyaW5nLAorICAgICAgIyBpdCB3aWxsIG5vdyBiZSBhbiBBcnJheS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHRlbXBsYXRlX2xvY2F0aW9uIFtTdHJpbmddCisgICAgICAjICAgVGhlIGxvY2F0aW9uIHdoZXJlIFNhc3MvU0NTUyBmaWxlcyB3ZXJlLAorICAgICAgIyAgIHdoaWNoIGlzIG5vdyBnb2luZyB0byBiZSBpZ25vcmVkLgorICAgICAgIyBAcGFyYW0gY3NzX2xvY2F0aW9uIFtTdHJpbmddCisgICAgICAjICAgVGhlIGxvY2F0aW9uIHdoZXJlIGNvbXBpbGVkIENTUyBmaWxlcyB3ZW50LCBidXQgd2lsbCBubyBsb25nZXIgZ28uCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICAjICAgTm9uLWBuaWxgIGlmIHRoZSBnaXZlbiBtYXBwaW5nIGFscmVhZHkgZXhpc3RlZCBhbmQgd2FzIHJlbW92ZWQsCisgICAgICAjICAgb3IgYG5pbGAgaWYgbm90aGluZyB3YXMgY2hhbmdlZC4KKyAgICAgIGRlZiByZW1vdmVfdGVtcGxhdGVfbG9jYXRpb24odGVtcGxhdGVfbG9jYXRpb24sIGNzc19sb2NhdGlvbiA9IG9wdGlvbnNbOmNzc19sb2NhdGlvbl0pCisgICAgICAgIG5vcm1hbGl6ZV90ZW1wbGF0ZV9sb2NhdGlvbiEKKyAgICAgICAgdGVtcGxhdGVfbG9jYXRpb25fYXJyYXkuZGVsZXRlKFt0ZW1wbGF0ZV9sb2NhdGlvbiwgY3NzX2xvY2F0aW9uXSkKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgdGhlIHRlbXBsYXRlIGxvY2F0aW9ucyBjb25maWd1cmVkIGZvciBTYXNzCisgICAgICAjIGFzIGFuIGFycmF5IG9mIGBbdGVtcGxhdGVfbG9jYXRpb24sIGNzc19sb2NhdGlvbl1gIHBhaXJzLgorICAgICAgIyBTZWUgdGhlIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI3RlbXBsYXRlX2xvY2F0aW9uLW9wdGlvbiBgOnRlbXBsYXRlX2xvY2F0aW9uYCBvcHRpb259CisgICAgICAjIGZvciBkZXRhaWxzLgorICAgICAgIworICAgICAgIyBNb2RpZmljYXRpb25zIHRvIHRoZSByZXR1cm5lZCBhcnJheSBtYXkgbm90IGJlIHBlcnNpc3RlbnQuICBVc2UgeyNhZGRfdGVtcGxhdGVfbG9jYXRpb259CisgICAgICAjIGFuZCB7I3JlbW92ZV90ZW1wbGF0ZV9sb2NhdGlvbn0gaW5zdGVhZC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQXJyYXk8KFN0cmluZywgU3RyaW5nKT5dCisgICAgICAjICAgQW4gYXJyYXkgb2YgYFt0ZW1wbGF0ZV9sb2NhdGlvbiwgY3NzX2xvY2F0aW9uXWAgcGFpcnMuCisgICAgICBkZWYgdGVtcGxhdGVfbG9jYXRpb25fYXJyYXkKKyAgICAgICAgY29udmVydF90ZW1wbGF0ZV9sb2NhdGlvbihvcHRpb25zWzp0ZW1wbGF0ZV9sb2NhdGlvbl0sIG9wdGlvbnNbOmNzc19sb2NhdGlvbl0pCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICAjIFJldHVybnMgdGhlIGdpdmVuIHRlbXBsYXRlIGxvY2F0aW9uLCBhcyBhbiBhcnJheS4gSWYgaXQncyBhbHJlYWR5IGFuIGFycmF5LAorICAgICAgIyBpdCBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLgorICAgICAgIworICAgICAgIyBAcGFyYW0gdGVtcGxhdGVfbG9jYXRpb24gW1N0cmluZywgQXJyYXk8KFN0cmluZywgU3RyaW5nKT5dCisgICAgICAjICAgQSBzaW5nbGUgdGVtcGxhdGUgbG9jYXRpb24sIG9yIGEgcHJlLW5vcm1hbGl6ZWQgYXJyYXkgb2YgdGVtcGxhdGUKKyAgICAgICMgICBsb2NhdGlvbnMgYW5kIENTUyBsb2NhdGlvbnMuCisgICAgICAjIEBwYXJhbSBjc3NfbG9jYXRpb24gW1N0cmluZz9dCisgICAgICAjICAgVGhlIGxvY2F0aW9uIGZvciBjb21waWxlZCBDU1MgZmlsZXMuCisgICAgICAjIEByZXR1cm4gW0FycmF5PChTdHJpbmcsIFN0cmluZyk+XQorICAgICAgIyAgIEFuIGFycmF5IG9mIGBbdGVtcGxhdGVfbG9jYXRpb24sIGNzc19sb2NhdGlvbl1gIHBhaXJzLgorICAgICAgZGVmIGNvbnZlcnRfdGVtcGxhdGVfbG9jYXRpb24odGVtcGxhdGVfbG9jYXRpb24sIGNzc19sb2NhdGlvbikKKyAgICAgICAgcmV0dXJuIHRlbXBsYXRlX2xvY2F0aW9uIGlmIHRlbXBsYXRlX2xvY2F0aW9uLmlzX2E/KEFycmF5KQorCisgICAgICAgIGNhc2UgdGVtcGxhdGVfbG9jYXRpb24KKyAgICAgICAgd2hlbiBuaWwKKyAgICAgICAgICBpZiBjc3NfbG9jYXRpb24KKyAgICAgICAgICAgIFtbRmlsZS5qb2luKGNzc19sb2NhdGlvbiwgJ3Nhc3MnKSwgY3NzX2xvY2F0aW9uXV0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBbXQorICAgICAgICAgIGVuZAorICAgICAgICB3aGVuIFN0cmluZworICAgICAgICAgIFtbdGVtcGxhdGVfbG9jYXRpb24sIGNzc19sb2NhdGlvbl1dCisgICAgICAgIGVsc2UKKyAgICAgICAgICB0ZW1wbGF0ZV9sb2NhdGlvbi50b19hCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBub3JtYWxpemVfdGVtcGxhdGVfbG9jYXRpb24hCisgICAgICAgIG9wdGlvbnNbOnRlbXBsYXRlX2xvY2F0aW9uXSA9IGNvbnZlcnRfdGVtcGxhdGVfbG9jYXRpb24oCisgICAgICAgICAgb3B0aW9uc1s6dGVtcGxhdGVfbG9jYXRpb25dLCBvcHRpb25zWzpjc3NfbG9jYXRpb25dKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9nZW5lcmljLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9wbHVnaW4vZ2VuZXJpYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgyZDJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9wbHVnaW4vZ2VuZXJpYy5yYgpAQCAtMCwwICsxLDE1IEBACisjIFRoZSByZWFzb24gc29tZSBvcHRpb25zIGFyZSBkZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGluIHNhc3MvcGx1Z2luL2NvbmZpZ3VyYXRpb24ucmIKKyMgaXMgdGhhdCBvdGhlcndpc2UgdGhleSdkIGNsb2JiZXIgdGhlIFJhaWxzLXNwZWNpZmljIG9wdGlvbnMuCisjIFNpbmNlIFJhaWxzJyBvcHRpb25zIGFyZSBsYXp5LWxvYWRlZCBpbiBSYWlscyAzLAorIyB0aGV5J3JlIHJldmVyc2UtbWVyZ2VkIHdpdGggdGhlIGRlZmF1bHQgb3B0aW9ucworIyBzbyB0aGF0IHVzZXIgY29uZmlndXJhdGlvbiBpcyBwcmVzZXJ2ZWQuCisjIFRoaXMgbWVhbnMgdGhhdCBkZWZhdWx0cyB0aGF0IGRpZmZlciBmcm9tIFJhaWxzJworIyBtdXN0IGJlIGRlY2xhcmVkIGhlcmUuCisKK3VubGVzcyBkZWZpbmVkPyhTYXNzOjpHRU5FUklDX0xPQURFRCkKKyAgU2Fzczo6R0VORVJJQ19MT0FERUQgPSB0cnVlCisKKyAgU2Fzczo6UGx1Z2luLm9wdGlvbnMubWVyZ2UhKDpjc3NfbG9jYXRpb24gICA9PiAnLi9wdWJsaWMvc3R5bGVzaGVldHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmFsd2F5c191cGRhdGUgID0+IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmFsd2F5c19jaGVjayAgID0+IHRydWUpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvcGx1Z2luL21lcmIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9tZXJiLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjY2YjEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9tZXJiLnJiCkBAIC0wLDAgKzEsNDggQEAKK3VubGVzcyBkZWZpbmVkPyhTYXNzOjpNRVJCX0xPQURFRCkKKyAgU2Fzczo6TUVSQl9MT0FERUQgPSB0cnVlCisKKyAgbW9kdWxlIFNhc3M6OlBsdWdpbjo6Q29uZmlndXJhdGlvbgorICAgICMgRGlmZmVyZW50IGRlZmF1bHQgb3B0aW9ucyBpbiBhIG0gZW52aXJvbm1lbnQuCisgICAgZGVmIGRlZmF1bHRfb3B0aW9ucworICAgICAgQGRlZmF1bHRfb3B0aW9ucyB8fD0gYmVnaW4KKyAgICAgICAgdmVyc2lvbiA9IE1lcmI6OlZFUlNJT04uc3BsaXQoJy4nKS5tYXAge3xufCBuLnRvX2l9CisgICAgICAgIGlmIHZlcnNpb25bMF0gPD0gMCAmJiB2ZXJzaW9uWzFdIDwgNQorICAgICAgICAgIHJvb3QgPSBNRVJCX1JPT1QKKyAgICAgICAgICBlbnYgID0gTUVSQl9FTlYKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJvb3QgPSBNZXJiLnJvb3QudG9fcworICAgICAgICAgIGVudiAgPSBNZXJiLmVudmlyb25tZW50CisgICAgICAgIGVuZAorCisgICAgICAgIHsKKyAgICAgICAgICA6YWx3YXlzX3VwZGF0ZSAgICAgPT4gZmFsc2UsCisgICAgICAgICAgOnRlbXBsYXRlX2xvY2F0aW9uID0+IHJvb3QgKyAnL3B1YmxpYy9zdHlsZXNoZWV0cy9zYXNzJywKKyAgICAgICAgICA6Y3NzX2xvY2F0aW9uICAgICAgPT4gcm9vdCArICcvcHVibGljL3N0eWxlc2hlZXRzJywKKyAgICAgICAgICA6Y2FjaGVfbG9jYXRpb24gICAgPT4gcm9vdCArICcvdG1wL3Nhc3MtY2FjaGUnLAorICAgICAgICAgIDphbHdheXNfY2hlY2sgICAgICA9PiBlbnYgIT0gInByb2R1Y3Rpb24iLAorICAgICAgICAgIDpxdWlldCAgICAgICAgICAgICA9PiBlbnYgIT0gInByb2R1Y3Rpb24iLAorICAgICAgICAgIDpmdWxsX2V4Y2VwdGlvbiAgICA9PiBlbnYgIT0gInByb2R1Y3Rpb24iCisgICAgICAgIH0uZnJlZXplCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgY29uZmlnID0gTWVyYjo6UGx1Z2lucy5jb25maWdbOnNhc3NdIHx8IE1lcmI6OlBsdWdpbnMuY29uZmlnWyJzYXNzIl0gfHwge30KKworICBpZiBkZWZpbmVkPyBjb25maWcuc3ltYm9saXplX2tleXMhCisgICAgY29uZmlnLnN5bWJvbGl6ZV9rZXlzIQorICBlbmQKKworICBTYXNzOjpQbHVnaW4ub3B0aW9ucy5tZXJnZSEoY29uZmlnKQorCisgIHJlcXVpcmUgJ3Nhc3MvcGx1Z2luL3JhY2snCisgIGNsYXNzIFNhc3M6OlBsdWdpbjo6TWVyYkJvb3RMb2FkZXIgPCBNZXJiOjpCb290TG9hZGVyCisgICAgYWZ0ZXIgTWVyYjo6Qm9vdExvYWRlcjo6UmFja1VwQXBwbGljYXRpb24KKworICAgIGRlZiBzZWxmLnJ1bgorICAgICAgIyBBcHBhcmVudGx5IHRoZXJlJ3Mgbm8gYmV0dGVyIHdheSB0aGFuIHRoaXMgdG8gYWRkIFNhc3MKKyAgICAgICMgdG8gTWVyYidzIFJhY2sgc3RhY2suCisgICAgICBNZXJiOjpDb25maWdbOmFwcF0gPSBTYXNzOjpQbHVnaW46OlJhY2submV3KE1lcmI6OkNvbmZpZ1s6YXBwXSkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvcGx1Z2luL3JhY2sucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9yYWNrLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDdhZWEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9yYWNrLnJiCkBAIC0wLDAgKzEsNjAgQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBQbHVnaW4KKyAgICAjIFJhY2sgbWlkZGxld2FyZSBmb3IgY29tcGlsaW5nIFNhc3MgY29kZS4KKyAgICAjCisgICAgIyAjIyBBY3RpdmF0ZQorICAgICMKKyAgICAjICAgICByZXF1aXJlICdzYXNzL3BsdWdpbi9yYWNrJworICAgICMgICAgIHVzZSBTYXNzOjpQbHVnaW46OlJhY2sKKyAgICAjCisgICAgIyAjIyBDdXN0b21pemUKKyAgICAjCisgICAgIyAgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnMubWVyZ2UhKAorICAgICMgICAgICAgOmNhY2hlX2xvY2F0aW9uID0+ICcuL3RtcC9zYXNzLWNhY2hlJywKKyAgICAjICAgICAgIDpuZXZlcl91cGRhdGUgPT4gZW52aXJvbm1lbnQgIT0gOnByb2R1Y3Rpb24sCisgICAgIyAgICAgICA6ZnVsbF9leGNlcHRpb24gPT4gZW52aXJvbm1lbnQgIT0gOnByb2R1Y3Rpb24pCisgICAgIworICAgICMge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjT3B0aW9ucyBTZWUgdGhlIFJlZmVyZW5jZSBmb3IgbW9yZSBvcHRpb25zfS4KKyAgICAjCisgICAgIyAjIyBVc2UKKyAgICAjCisgICAgIyBQdXQgeW91ciBTYXNzIGZpbGVzIGluIGBwdWJsaWMvc3R5bGVzaGVldHMvc2Fzc2AuCisgICAgIyBZb3VyIENTUyB3aWxsIGJlIGdlbmVyYXRlZCBpbiBgcHVibGljL3N0eWxlc2hlZXRzYCwKKyAgICAjIGFuZCByZWdlbmVyYXRlZCBldmVyeSByZXF1ZXN0IGlmIG5lY2Vzc2FyeS4KKyAgICAjIFRoZSBsb2NhdGlvbnMgYW5kIGZyZXF1ZW5jeSB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNPcHRpb25zIGNhbiBiZSBjdXN0b21pemVkfS4KKyAgICAjIFRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisgICAgY2xhc3MgUmFjaworICAgICAgIyBUaGUgZGVsYXksIGluIHNlY29uZHMsIGJldHdlZW4gdXBkYXRlIGNoZWNrcy4KKyAgICAgICMgVXNlZnVsIHdoZW4gbWFueSByZXNvdXJjZXMgYXJlIHJlcXVlc3RlZCBmb3IgYSBzaW5nbGUgcGFnZS4KKyAgICAgICMgYG5pbGAgbWVhbnMgbm8gZGVsYXkgYXQgYWxsLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtGbG9hdF0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOmR3ZWxsCisKKyAgICAgICMgSW5pdGlhbGl6ZSB0aGUgbWlkZGxld2FyZS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGFwcCBbI2NhbGxdIFRoZSBSYWNrIGFwcGxpY2F0aW9uCisgICAgICAjIEBwYXJhbSBkd2VsbCBbRmxvYXRdIFNlZSBceyNkd2VsbH0KKyAgICAgIGRlZiBpbml0aWFsaXplKGFwcCwgZHdlbGwgPSAxLjApCisgICAgICAgIEBhcHAgPSBhcHAKKyAgICAgICAgQGR3ZWxsID0gZHdlbGwKKyAgICAgICAgQGNoZWNrX2FmdGVyID0gVGltZS5ub3cudG9fZgorICAgICAgZW5kCisKKyAgICAgICMgUHJvY2VzcyBhIHJlcXVlc3QsIGNoZWNraW5nIHRoZSBTYXNzIHN0eWxlc2hlZXRzIGZvciBjaGFuZ2VzCisgICAgICAjIGFuZCB1cGRhdGluZyB0aGVtIGlmIG5lY2Vzc2FyeS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGVudiBUaGUgUmFjayByZXF1ZXN0IGVudmlyb25tZW50CisgICAgICAjIEByZXR1cm4gWygjdG9faSwge1N0cmluZyA9PiBTdHJpbmd9LCBPYmplY3QpXSBUaGUgUmFjayByZXNwb25zZQorICAgICAgZGVmIGNhbGwoZW52KQorICAgICAgICBpZiBAZHdlbGwubmlsPyB8fCBUaW1lLm5vdy50b19mID4gQGNoZWNrX2FmdGVyCisgICAgICAgICAgU2Fzczo6UGx1Z2luLmNoZWNrX2Zvcl91cGRhdGVzCisgICAgICAgICAgQGNoZWNrX2FmdGVyID0gVGltZS5ub3cudG9fZiArIEBkd2VsbCBpZiBAZHdlbGwKKyAgICAgICAgZW5kCisgICAgICAgIEBhcHAuY2FsbChlbnYpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKKworcmVxdWlyZSAnc2Fzcy9wbHVnaW4nCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9yYWlscy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvcGx1Z2luL3JhaWxzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTY3N2YKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9yYWlscy5yYgpAQCAtMCwwICsxLDQ3IEBACit1bmxlc3MgZGVmaW5lZD8oU2Fzczo6UkFJTFNfTE9BREVEKQorICBTYXNzOjpSQUlMU19MT0FERUQgPSB0cnVlCisKKyAgbW9kdWxlIFNhc3M6OlBsdWdpbjo6Q29uZmlndXJhdGlvbgorICAgICMgRGlmZmVyZW50IGRlZmF1bHQgb3B0aW9ucyBpbiBhIHJhaWxzIGVudmlyb25tZW50LgorICAgIGRlZiBkZWZhdWx0X29wdGlvbnMKKyAgICAgIHJldHVybiBAZGVmYXVsdF9vcHRpb25zIGlmIEBkZWZhdWx0X29wdGlvbnMKKyAgICAgIG9wdHMgPSB7CisgICAgICAgIDpxdWlldCAgICAgICAgICAgICA9PiBTYXNzOjpVdGlsLnJhaWxzX2VudiAhPSAicHJvZHVjdGlvbiIsCisgICAgICAgIDpmdWxsX2V4Y2VwdGlvbiAgICA9PiBTYXNzOjpVdGlsLnJhaWxzX2VudiAhPSAicHJvZHVjdGlvbiIsCisgICAgICAgIDpjYWNoZV9sb2NhdGlvbiAgICA9PiBTYXNzOjpVdGlsLnJhaWxzX3Jvb3QgKyAnL3RtcC9zYXNzLWNhY2hlJworICAgICAgfQorCisgICAgICBvcHRzLm1lcmdlISgKKyAgICAgICAgOmFsd2F5c191cGRhdGUgICAgID0+IGZhbHNlLAorICAgICAgICA6dGVtcGxhdGVfbG9jYXRpb24gPT4gU2Fzczo6VXRpbC5yYWlsc19yb290ICsgJy9wdWJsaWMvc3R5bGVzaGVldHMvc2FzcycsCisgICAgICAgIDpjc3NfbG9jYXRpb24gICAgICA9PiBTYXNzOjpVdGlsLnJhaWxzX3Jvb3QgKyAnL3B1YmxpYy9zdHlsZXNoZWV0cycsCisgICAgICAgIDphbHdheXNfY2hlY2sgICAgICA9PiBTYXNzOjpVdGlsLnJhaWxzX2VudiA9PSAiZGV2ZWxvcG1lbnQiKQorCisgICAgICBAZGVmYXVsdF9vcHRpb25zID0gb3B0cy5mcmVlemUKKyAgICBlbmQKKyAgZW5kCisKKyAgU2Fzczo6UGx1Z2luLm9wdGlvbnMucmV2ZXJzZV9tZXJnZSEoU2Fzczo6UGx1Z2luLmRlZmF1bHRfb3B0aW9ucykKKworICAjIFJhaWxzIDMuMSBsb2FkcyBhbmQgaGFuZGxlcyBTYXNzIGFsbCBvbiBpdHMgb3duCisgIGlmIGRlZmluZWQ/KEFjdGlvbkNvbnRyb2xsZXI6Ok1ldGFsKQorICAgICMgMy4xID4gUmFpbHMgPj0gMy4wCisgICAgcmVxdWlyZSAnc2Fzcy9wbHVnaW4vcmFjaycKKyAgICBSYWlscy5jb25maWd1cmF0aW9uLm1pZGRsZXdhcmUudXNlKFNhc3M6OlBsdWdpbjo6UmFjaykKKyAgZWxzaWYgZGVmaW5lZD8oQWN0aW9uQ29udHJvbGxlcjo6RGlzcGF0Y2hlcikgJiYKKyAgICAgIGRlZmluZWQ/KEFjdGlvbkNvbnRyb2xsZXI6OkRpc3BhdGNoZXIubWlkZGxld2FyZSkKKyAgICAjIFJhaWxzID49IDIuMworICAgIHJlcXVpcmUgJ3Nhc3MvcGx1Z2luL3JhY2snCisgICAgQWN0aW9uQ29udHJvbGxlcjo6RGlzcGF0Y2hlci5taWRkbGV3YXJlLnVzZShTYXNzOjpQbHVnaW46OlJhY2spCisgIGVsc2UKKyAgICBtb2R1bGUgQWN0aW9uQ29udHJvbGxlcgorICAgICAgY2xhc3MgQmFzZQorICAgICAgICBhbGlhc19tZXRob2QgOnNhc3Nfb2xkX3Byb2Nlc3MsIDpwcm9jZXNzCisgICAgICAgIGRlZiBwcm9jZXNzKCphcmdzKQorICAgICAgICAgIFNhc3M6OlBsdWdpbi5jaGVja19mb3JfdXBkYXRlcworICAgICAgICAgIHNhc3Nfb2xkX3Byb2Nlc3MoKmFyZ3MpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9zdGFsZW5lc3NfY2hlY2tlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvcGx1Z2luL3N0YWxlbmVzc19jaGVja2VyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2MwMDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3BsdWdpbi9zdGFsZW5lc3NfY2hlY2tlci5yYgpAQCAtMCwwICsxLDE5OSBAQAorcmVxdWlyZSAndGhyZWFkJworCittb2R1bGUgU2FzcworICBtb2R1bGUgUGx1Z2luCisgICAgIyBUaGUgY2xhc3MgaGFuZGxlcyBgLnNbY2Fdc3NgIGZpbGUgc3RhbGVuZXNzIGNoZWNrcyB2aWEgdGhlaXIgbXRpbWUgdGltZXN0YW1wcy4KKyAgICAjCisgICAgIyBUbyBzcGVlZCB0aGluZ3MgdXAgdHdvIGxldmVsIG9mIGNhY2hlcyBhcmUgZW1wbG95ZWQ6CisgICAgIworICAgICMgKiBBIGNsYXNzLWxldmVsIGRlcGVuZGVuY3kgY2FjaGUgd2hpY2ggc3RvcmVzIEBpbXBvcnQgcGF0aHMgZm9yIGVhY2ggZmlsZS4KKyAgICAjICAgVGhpcyBpcyBhIGxvbmctbGl2ZWQgY2FjaGUgdGhhdCBpcyByZXVzZWQgYnkgZXZlcnkgU3RhbGVuZXNzQ2hlY2tlciBpbnN0YW5jZS4KKyAgICAjICogVGhyZWUgc2hvcnQtbGl2ZWQgaW5zdGFuY2UtbGV2ZWwgY2FjaGVzLCBvbmUgZm9yIGZpbGUgbXRpbWVzLAorICAgICMgICBvbmUgZm9yIHdoZXRoZXIgYSBmaWxlIGlzIHN0YWxlIGR1cmluZyB0aGlzIHBhcnRpY3VsYXIgcnVuLgorICAgICMgICBhbmQgb25lIGZvciB0aGUgcGFyc2UgdHJlZSBmb3IgYSBmaWxlLgorICAgICMgICBUaGVzZSBhcmUgb25seSB1c2VkIGJ5IGEgc2luZ2xlIFN0YWxlbmVzc0NoZWNrZXIgaW5zdGFuY2UuCisgICAgIworICAgICMgVXNhZ2U6CisgICAgIworICAgICMgKiBGb3IgYSBvbmUtb2ZmIHN0YWxlbmVzcyBjaGVjayBvZiBhIHNpbmdsZSBgLnNbY2Fdc3NgIGZpbGUsCisgICAgIyAgIHRoZSBjbGFzcy1sZXZlbCB7c3R5bGVzaGVldF9uZWVkc191cGRhdGU/fSBtZXRob2QKKyAgICAjICAgc2hvdWxkIGJlIHVzZWQuCisgICAgIyAqIEZvciBhIHNlcmllcyBvZiBzdGFsZW5lc3MgY2hlY2tzIChlLmcuIGNoZWNraW5nIGFsbCBmaWxlcyBmb3Igc3RhbGVuZXNzKQorICAgICMgICBhIFN0YWxlbmVzc0NoZWNrZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQsCisgICAgIyAgIGFuZCB0aGUgaW5zdGFuY2UtbGV2ZWwgXHsjc3R5bGVzaGVldFxfbmVlZHNcX3VwZGF0ZT99IG1ldGhvZCBzaG91bGQgYmUgdXNlZC4KKyAgICAjICAgdGhlIGNhY2hlcyBzaG91bGQgbWFrZSB0aGUgd2hvbGUgcHJvY2VzcyBzaWduaWZpY2FudGx5IGZhc3Rlci4KKyAgICAjICAgKldBUk5JTkcqOiBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHJldGFpbiB0aGUgaW5zdGFuY2UgZm9yIHRvbyBsb25nLAorICAgICMgICBhcyBpdHMgaW5zdGFuY2UtbGV2ZWwgY2FjaGVzIGFyZSBuZXZlciBleHBsaWNpdGx5IGV4cGlyZWQuCisgICAgY2xhc3MgU3RhbGVuZXNzQ2hlY2tlcgorICAgICAgQGRlcGVuZGVuY2llc19jYWNoZSA9IHt9CisgICAgICBAZGVwZW5kZW5jeV9jYWNoZV9tdXRleCA9IE11dGV4Lm5ldworCisgICAgICBjbGFzcyA8PCBzZWxmCisgICAgICAgICMgVE9ETzogYXR0YWNoIHRoaXMgdG8gYSBjb21waWxlciBpbnN0YW5jZS4KKyAgICAgICAgIyBAcHJpdmF0ZQorICAgICAgICBhdHRyX2FjY2Vzc29yIDpkZXBlbmRlbmNpZXNfY2FjaGUKKyAgICAgICAgYXR0cl9yZWFkZXIgOmRlcGVuZGVuY3lfY2FjaGVfbXV0ZXgKKyAgICAgIGVuZAorCisgICAgICAjIENyZWF0ZXMgYSBuZXcgU3RhbGVuZXNzQ2hlY2tlcgorICAgICAgIyBmb3IgY2hlY2tpbmcgdGhlIHN0YWxlbmVzcyBvZiBzZXZlcmFsIHN0eWxlc2hlZXRzIGF0IG9uY2UuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dCisgICAgICAjICAgU2VlIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI09wdGlvbnMgdGhlIFNhc3Mgb3B0aW9ucyBkb2N1bWVudGF0aW9ufS4KKyAgICAgIGRlZiBpbml0aWFsaXplKG9wdGlvbnMpCisgICAgICAgICMgVVJJcyB0aGF0IGFyZSBiZWluZyBhY3RpdmVseSBjaGVja2VkIGZvciBzdGFsZW5lc3MuIFByb3RlY3RzIGFnYWluc3QKKyAgICAgICAgIyBpbXBvcnQgbG9vcHMuCisgICAgICAgIEBhY3RpdmVseV9jaGVja2luZyA9IFNldC5uZXcKKworICAgICAgICAjIEVudHJpZXMgaW4gdGhlIGZvbGxvd2luZyBpbnN0YW5jZS1sZXZlbCBjYWNoZXMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZXhwaXJlZC4KKyAgICAgICAgIyBJbnN0ZWFkIHRoZXkgYXJlIHN1cHBvc2VkIHRvIGF1dG9tYXRpY2FsbHkgZ28gb3V0IG9mIHNjb3BlIHdoZW4gYSBzZXJpZXMgb2Ygc3RhbGVuZXNzCisgICAgICAgICMgY2hlY2tzICh0aGlzIGluc3RhbmNlIG9mIFN0YWxlbmVzc0NoZWNrZXIgd2FzIGNyZWF0ZWQgZm9yKSBpcyBmaW5pc2hlZC4KKyAgICAgICAgQG10aW1lcywgQGRlcGVuZGVuY2llc19zdGFsZSwgQHBhcnNlX3RyZWVzID0ge30sIHt9LCB7fQorICAgICAgICBAb3B0aW9ucyA9IFNhc3M6OkVuZ2luZS5ub3JtYWxpemVfb3B0aW9ucyhvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIENTUyBmaWxlIGlzIG91dCBvZiBkYXRlCisgICAgICAjIGFuZCBuZWVkcyB0byBiZSByZWdlbmVyYXRlZC4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGNzc19maWxlIFtTdHJpbmddIFRoZSBsb2NhdGlvbiBvZiB0aGUgQ1NTIGZpbGUgdG8gY2hlY2suCisgICAgICAjIEBwYXJhbSB0ZW1wbGF0ZV9maWxlIFtTdHJpbmddIFRoZSBsb2NhdGlvbiBvZiB0aGUgU2FzcyBvciBTQ1NTIHRlbXBsYXRlCisgICAgICAjICAgdGhhdCBpcyBjb21waWxlZCB0byBgY3NzX2ZpbGVgLgorICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIHRoZSBzdHlsZXNoZWV0IG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgICAgICBkZWYgc3R5bGVzaGVldF9uZWVkc191cGRhdGU/KGNzc19maWxlLCB0ZW1wbGF0ZV9maWxlLCBpbXBvcnRlciA9IG5pbCkKKyAgICAgICAgdGVtcGxhdGVfZmlsZSA9IEZpbGUuZXhwYW5kX3BhdGgodGVtcGxhdGVfZmlsZSkKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBjc3NfbXRpbWUgPSBGaWxlLm10aW1lKGNzc19maWxlKQorICAgICAgICByZXNjdWUgRXJybm86OkVOT0VOVAorICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgIGVuZAorICAgICAgICBzdHlsZXNoZWV0X21vZGlmaWVkX3NpbmNlPyh0ZW1wbGF0ZV9maWxlLCBjc3NfbXRpbWUsIGltcG9ydGVyKQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyB3aGV0aGVyIGEgU2FzcyBvciBTQ1NTIHN0eWxlc2hlZXQgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgYSBnaXZlbiB0aW1lLgorICAgICAgIworICAgICAgIyBAcGFyYW0gdGVtcGxhdGVfZmlsZSBbU3RyaW5nXSBUaGUgbG9jYXRpb24gb2YgdGhlIFNhc3Mgb3IgU0NTUyB0ZW1wbGF0ZS4KKyAgICAgICMgQHBhcmFtIG10aW1lIFtUaW1lXSBUaGUgbW9kaWZpY2F0aW9uIHRpbWUgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAgICMgQHBhcmFtIGltcG9ydGVyIFtTYXNzOjpJbXBvcnRlcnM6OkJhc2VdIFRoZSBpbXBvcnRlciB1c2VkIHRvIGxvY2F0ZSB0aGUgc3R5bGVzaGVldC4KKyAgICAgICMgICBEZWZhdWx0cyB0byB0aGUgZmlsZXN5c3RlbSBpbXBvcnRlci4KKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciB0aGUgc3R5bGVzaGVldCBoYXMgYmVlbiBtb2RpZmllZC4KKyAgICAgIGRlZiBzdHlsZXNoZWV0X21vZGlmaWVkX3NpbmNlPyh0ZW1wbGF0ZV9maWxlLCBtdGltZSwgaW1wb3J0ZXIgPSBuaWwpCisgICAgICAgIGltcG9ydGVyIHx8PSBAb3B0aW9uc1s6ZmlsZXN5c3RlbV9pbXBvcnRlcl0ubmV3KCIuIikKKyAgICAgICAgZGVwZW5kZW5jeV91cGRhdGVkPyhtdGltZSkuY2FsbCh0ZW1wbGF0ZV9maWxlLCBpbXBvcnRlcikKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgd2hldGhlciBvciBub3QgYSBnaXZlbiBDU1MgZmlsZSBpcyBvdXQgb2YgZGF0ZQorICAgICAgIyBhbmQgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWQuCisgICAgICAjCisgICAgICAjIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCB0aGUgaW5zdGFuY2UtbGV2ZWwgXHsjc3R5bGVzaGVldFxfbmVlZHNcX3VwZGF0ZT99CisgICAgICAjIGlzIHRoYXQgdGhlIGluc3RhbmNlIG1ldGhvZCBwcmVzZXJ2ZXMgbXRpbWUgYW5kIHN0YWxlLWRlcGVuZGVuY3kgY2FjaGVzLAorICAgICAgIyBzbyBpdCdzIGJldHRlciB0byB1c2Ugd2hlbiBjaGVja2luZyBtdWx0aXBsZSBzdHlsZXNoZWV0cyBhdCBvbmNlLgorICAgICAgIworICAgICAgIyBAcGFyYW0gY3NzX2ZpbGUgW1N0cmluZ10gVGhlIGxvY2F0aW9uIG9mIHRoZSBDU1MgZmlsZSB0byBjaGVjay4KKyAgICAgICMgQHBhcmFtIHRlbXBsYXRlX2ZpbGUgW1N0cmluZ10gVGhlIGxvY2F0aW9uIG9mIHRoZSBTYXNzIG9yIFNDU1MgdGVtcGxhdGUKKyAgICAgICMgICB0aGF0IGlzIGNvbXBpbGVkIHRvIGBjc3NfZmlsZWAuCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgdGhlIHN0eWxlc2hlZXQgbmVlZHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgIGRlZiBzZWxmLnN0eWxlc2hlZXRfbmVlZHNfdXBkYXRlPyhjc3NfZmlsZSwgdGVtcGxhdGVfZmlsZSwgaW1wb3J0ZXIgPSBuaWwpCisgICAgICAgIG5ldyhQbHVnaW4uZW5naW5lX29wdGlvbnMpLnN0eWxlc2hlZXRfbmVlZHNfdXBkYXRlPyhjc3NfZmlsZSwgdGVtcGxhdGVfZmlsZSwgaW1wb3J0ZXIpCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHdoZXRoZXIgYSBTYXNzIG9yIFNDU1Mgc3R5bGVzaGVldCBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSBhIGdpdmVuIHRpbWUuCisgICAgICAjCisgICAgICAjIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCB0aGUgaW5zdGFuY2UtbGV2ZWwgXHsjc3R5bGVzaGVldFxfbW9kaWZpZWRcX3NpbmNlP30KKyAgICAgICMgaXMgdGhhdCB0aGUgaW5zdGFuY2UgbWV0aG9kIHByZXNlcnZlcyBtdGltZSBhbmQgc3RhbGUtZGVwZW5kZW5jeSBjYWNoZXMsCisgICAgICAjIHNvIGl0J3MgYmV0dGVyIHRvIHVzZSB3aGVuIGNoZWNraW5nIG11bHRpcGxlIHN0eWxlc2hlZXRzIGF0IG9uY2UuCisgICAgICAjCisgICAgICAjIEBwYXJhbSB0ZW1wbGF0ZV9maWxlIFtTdHJpbmddIFRoZSBsb2NhdGlvbiBvZiB0aGUgU2FzcyBvciBTQ1NTIHRlbXBsYXRlLgorICAgICAgIyBAcGFyYW0gbXRpbWUgW1RpbWVdIFRoZSBtb2RpZmljYXRpb24gdGltZSB0byBjaGVjayBhZ2FpbnN0LgorICAgICAgIyBAcGFyYW0gaW1wb3J0ZXIgW1Nhc3M6OkltcG9ydGVyczo6QmFzZV0gVGhlIGltcG9ydGVyIHVzZWQgdG8gbG9jYXRlIHRoZSBzdHlsZXNoZWV0LgorICAgICAgIyAgIERlZmF1bHRzIHRvIHRoZSBmaWxlc3lzdGVtIGltcG9ydGVyLgorICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIHRoZSBzdHlsZXNoZWV0IGhhcyBiZWVuIG1vZGlmaWVkLgorICAgICAgZGVmIHNlbGYuc3R5bGVzaGVldF9tb2RpZmllZF9zaW5jZT8odGVtcGxhdGVfZmlsZSwgbXRpbWUsIGltcG9ydGVyID0gbmlsKQorICAgICAgICBuZXcoUGx1Z2luLmVuZ2luZV9vcHRpb25zKS5zdHlsZXNoZWV0X21vZGlmaWVkX3NpbmNlPyh0ZW1wbGF0ZV9maWxlLCBtdGltZSwgaW1wb3J0ZXIpCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBkZWYgZGVwZW5kZW5jaWVzX3N0YWxlPyh1cmksIGltcG9ydGVyLCBjc3NfbXRpbWUpCisgICAgICAgIHRpbWVzdGFtcHMgPSBAZGVwZW5kZW5jaWVzX3N0YWxlW1t1cmksIGltcG9ydGVyXV0gfHw9IHt9CisgICAgICAgIHRpbWVzdGFtcHMuZWFjaF9wYWlyIGRvIHxjaGVja2VkX2Nzc19tdGltZSwgaXNfc3RhbGV8CisgICAgICAgICAgaWYgY2hlY2tlZF9jc3NfbXRpbWUgPD0gY3NzX210aW1lICYmICFpc19zdGFsZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgICAgZWxzaWYgY2hlY2tlZF9jc3NfbXRpbWUgPiBjc3NfbXRpbWUgJiYgaXNfc3RhbGUKKyAgICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICB0aW1lc3RhbXBzW2Nzc19tdGltZV0gPSBkZXBlbmRlbmNpZXModXJpLCBpbXBvcnRlcikuYW55PygmZGVwZW5kZW5jeV91cGRhdGVkPyhjc3NfbXRpbWUpKQorICAgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yCisgICAgICAgICMgSWYgdGhlcmUncyBhbiBlcnJvciBmaW5kaW5nIGRlcGVuZGVuY2llcywgZGVmYXVsdCB0byByZWNvbXBpbGluZy4KKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBtdGltZSh1cmksIGltcG9ydGVyKQorICAgICAgICBAbXRpbWVzW1t1cmksIGltcG9ydGVyXV0gfHw9CisgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgIG10aW1lID0gaW1wb3J0ZXIubXRpbWUodXJpLCBAb3B0aW9ucykKKyAgICAgICAgICAgIGlmIG10aW1lLm5pbD8KKyAgICAgICAgICAgICAgd2l0aF9kZXBlbmRlbmN5X2NhY2hlIHt8Y2FjaGV8IGNhY2hlLmRlbGV0ZShbdXJpLCBpbXBvcnRlcl0pfQorICAgICAgICAgICAgICBuaWwKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbXRpbWUKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBkZXBlbmRlbmNpZXModXJpLCBpbXBvcnRlcikKKyAgICAgICAgc3RvcmVkX210aW1lLCBkZXBlbmRlbmNpZXMgPQorICAgICAgICAgIHdpdGhfZGVwZW5kZW5jeV9jYWNoZSB7fGNhY2hlfCBTYXNzOjpVdGlsLmRlc3RydWN0dXJlKGNhY2hlW1t1cmksIGltcG9ydGVyXV0pfQorCisgICAgICAgIGlmICFzdG9yZWRfbXRpbWUgfHwgc3RvcmVkX210aW1lIDwgbXRpbWUodXJpLCBpbXBvcnRlcikKKyAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBjb21wdXRlX2RlcGVuZGVuY2llcyh1cmksIGltcG9ydGVyKQorICAgICAgICAgIHdpdGhfZGVwZW5kZW5jeV9jYWNoZSBkbyB8Y2FjaGV8CisgICAgICAgICAgICBjYWNoZVtbdXJpLCBpbXBvcnRlcl1dID0gW210aW1lKHVyaSwgaW1wb3J0ZXIpLCBkZXBlbmRlbmNpZXNdCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGRlcGVuZGVuY2llcworICAgICAgZW5kCisKKyAgICAgIGRlZiBkZXBlbmRlbmN5X3VwZGF0ZWQ/KGNzc19tdGltZSkKKyAgICAgICAgcHJvYyBkbyB8dXJpLCBpbXBvcnRlcnwKKyAgICAgICAgICBuZXh0IHRydWUgaWYgQGFjdGl2ZWx5X2NoZWNraW5nLmluY2x1ZGU/KHVyaSkKKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgQGFjdGl2ZWx5X2NoZWNraW5nIDw8IHVyaQorICAgICAgICAgICAgc2Fzc19tdGltZSA9IG10aW1lKHVyaSwgaW1wb3J0ZXIpCisgICAgICAgICAgICAhc2Fzc19tdGltZSB8fAorICAgICAgICAgICAgICBzYXNzX210aW1lID4gY3NzX210aW1lIHx8CisgICAgICAgICAgICAgIGRlcGVuZGVuY2llc19zdGFsZT8odXJpLCBpbXBvcnRlciwgY3NzX210aW1lKQorICAgICAgICAgIGVuc3VyZQorICAgICAgICAgICAgQGFjdGl2ZWx5X2NoZWNraW5nLmRlbGV0ZSB1cmkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbXB1dGVfZGVwZW5kZW5jaWVzKHVyaSwgaW1wb3J0ZXIpCisgICAgICAgIHRyZWUodXJpLCBpbXBvcnRlcikuZ3JlcChUcmVlOjpJbXBvcnROb2RlKSBkbyB8bnwKKyAgICAgICAgICBuZXh0IGlmIG4uY3NzX2ltcG9ydD8KKyAgICAgICAgICBmaWxlID0gbi5pbXBvcnRlZF9maWxlCisgICAgICAgICAga2V5ID0gW2ZpbGUub3B0aW9uc1s6ZmlsZW5hbWVdLCBmaWxlLm9wdGlvbnNbOmltcG9ydGVyXV0KKyAgICAgICAgICBAcGFyc2VfdHJlZXNba2V5XSA9IGZpbGUudG9fdHJlZQorICAgICAgICAgIGtleQorICAgICAgICBlbmQuY29tcGFjdAorICAgICAgZW5kCisKKyAgICAgIGRlZiB0cmVlKHVyaSwgaW1wb3J0ZXIpCisgICAgICAgIEBwYXJzZV90cmVlc1tbdXJpLCBpbXBvcnRlcl1dIHx8PSBpbXBvcnRlci5maW5kKHVyaSwgQG9wdGlvbnMpLnRvX3RyZWUKKyAgICAgIGVuZAorCisgICAgICAjIEdldCBhY2Nlc3MgdG8gdGhlIGdsb2JhbCBkZXBlbmRlbmN5IGNhY2hlIGluIGEgdGhyZWFkc2FmZSBtYW5uZXIuCisgICAgICAjIEluc2lkZSB0aGUgYmxvY2ssIG5vIG90aGVyIHRocmVhZCBjYW4gYWNjZXNzIHRoZSBkZXBlbmRlbmN5IGNhY2hlLgorICAgICAgIworICAgICAgIyBAeWllbGRwYXJhbSBjYWNoZSBbSGFzaF0gVGhlIGhhc2ggdGhhdCBpcyB0aGUgZ2xvYmFsIGRlcGVuZGVuY3kgY2FjaGUKKyAgICAgICMgQHJldHVybiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGJsb2NrIHRvIHdoaWNoIHRoaXMgbWV0aG9kIHlpZWxkcworICAgICAgZGVmIHdpdGhfZGVwZW5kZW5jeV9jYWNoZQorICAgICAgICBTdGFsZW5lc3NDaGVja2VyLmRlcGVuZGVuY3lfY2FjaGVfbXV0ZXguc3luY2hyb25pemUgZG8KKyAgICAgICAgICB5aWVsZCBTdGFsZW5lc3NDaGVja2VyLmRlcGVuZGVuY2llc19jYWNoZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9yYWlsdGllLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9yYWlsdGllLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMWYwM2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3JhaWx0aWUucmIKQEAgLTAsMCArMSwxMCBAQAorIyBSYWlscyAzLjAuMC5iZXRhLjIrLCA8IDMuMQoraWYgZGVmaW5lZD8oQWN0aXZlU3VwcG9ydCkgJiYgQWN0aXZlU3VwcG9ydC5wdWJsaWNfbWV0aG9kcy5pbmNsdWRlPyg6b25fbG9hZCkgJiYKKyAgICAhU2Fzczo6VXRpbC5hcF9nZXE/KCczLjEuMC5iZXRhJykKKyAgcmVxdWlyZSAnc2Fzcy9wbHVnaW4vY29uZmlndXJhdGlvbicKKyAgQWN0aXZlU3VwcG9ydC5vbl9sb2FkKDpiZWZvcmVfY29uZmlndXJhdGlvbikgZG8KKyAgICByZXF1aXJlICdzYXNzJworICAgIHJlcXVpcmUgJ3Nhc3MvcGx1Z2luJworICAgIHJlcXVpcmUgJ3Nhc3MvcGx1Z2luL3JhaWxzJworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9yZXBsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9yZXBsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjllNmMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3JlcGwucmIKQEAgLTAsMCArMSw1NyBAQAorcmVxdWlyZSAncmVhZGxpbmUnCisKK21vZHVsZSBTYXNzCisgICMgUnVucyBhIFNhc3NTY3JpcHQgcmVhZC1ldmFsLXByaW50IGxvb3AuCisgICMgSXQgcHJlc2VudHMgYSBwcm9tcHQgb24gdGhlIHRlcm1pbmFsLAorICAjIHJlYWRzIGluIFNhc3NTY3JpcHQgZXhwcmVzc2lvbnMsCisgICMgZXZhbHVhdGVzIHRoZW0sCisgICMgYW5kIHByaW50cyB0aGUgcmVzdWx0LgorICBjbGFzcyBSZXBsCisgICAgIyBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBBbiBvcHRpb25zIGhhc2guCisgICAgZGVmIGluaXRpYWxpemUob3B0aW9ucyA9IHt9KQorICAgICAgQG9wdGlvbnMgPSBvcHRpb25zCisgICAgZW5kCisKKyAgICAjIFN0YXJ0cyB0aGUgcmVhZC1ldmFsLXByaW50IGxvb3AuCisgICAgZGVmIHJ1bgorICAgICAgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudC5uZXcKKyAgICAgIEBsaW5lID0gMAorICAgICAgbG9vcCBkbworICAgICAgICBAbGluZSArPSAxCisgICAgICAgIHVubGVzcyAodGV4dCA9IFJlYWRsaW5lLnJlYWRsaW5lKCc+PiAnKSkKKyAgICAgICAgICBwdXRzCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVuZAorCisgICAgICAgIFJlYWRsaW5lOjpISVNUT1JZIDw8IHRleHQKKyAgICAgICAgcGFyc2VfaW5wdXQoZW52aXJvbm1lbnQsIHRleHQpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBwYXJzZV9pbnB1dChlbnZpcm9ubWVudCwgdGV4dCkKKyAgICAgIGNhc2UgdGV4dAorICAgICAgd2hlbiBTY3JpcHQ6Ok1BVENICisgICAgICAgIG5hbWUgPSAkMQorICAgICAgICBndWFyZGVkID0gISEkMworICAgICAgICB2YWwgPSBTY3JpcHQ6OlBhcnNlci5wYXJzZSgkMiwgQGxpbmUsIHRleHQuc2l6ZSAtICgkMyB8fCAnJykuc2l6ZSAtICQyLnNpemUpCisKKyAgICAgICAgdW5sZXNzIGd1YXJkZWQgJiYgZW52aXJvbm1lbnQudmFyKG5hbWUpCisgICAgICAgICAgZW52aXJvbm1lbnQuc2V0X3ZhcihuYW1lLCB2YWwucGVyZm9ybShlbnZpcm9ubWVudCkpCisgICAgICAgIGVuZAorCisgICAgICAgIHAgZW52aXJvbm1lbnQudmFyKG5hbWUpCisgICAgICBlbHNlCisgICAgICAgIHAgU2NyaXB0OjpQYXJzZXIucGFyc2UodGV4dCwgQGxpbmUsIDApLnBlcmZvcm0oZW52aXJvbm1lbnQpCisgICAgICBlbmQKKyAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgICAgcHV0cyAiU3ludGF4RXJyb3I6ICN7ZS5tZXNzYWdlfSIKKyAgICAgIGlmIEBvcHRpb25zWzp0cmFjZV0KKyAgICAgICAgZS5iYWNrdHJhY2UuZWFjaCBkbyB8bGluZXwKKyAgICAgICAgICBwdXRzICJcdGZyb20gI3tsaW5lfSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvcm9vdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvcm9vdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWUxOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9yb290LnJiCkBAIC0wLDAgKzEsNyBAQAorbW9kdWxlIFNhc3MKKyAgIyBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIFNhc3Mgc291cmNlIHRyZWUuCisgICMgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgcGFja2FnZSBtYW5hZ2VyCisgICMgaWYgdGhlIGxpYiBkaXJlY3RvcnkgaXMgc2VwYXJhdGVkIGZyb20gdGhlIG1haW4gc291cmNlIHRyZWUuCisgICMgQGFwaSBwdWJsaWMKKyAgUk9PVF9ESVIgPSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuam9pbihfX0ZJTEVfXywgIi4uLy4uLy4uIikpCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1MmYwNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0LnJiCkBAIC0wLDAgKzEsNjYgQEAKK3JlcXVpcmUgJ3Nhc3Mvc2Nzcy9yeCcKKworbW9kdWxlIFNhc3MKKyAgIyBTYXNzU2NyaXB0IGlzIGNvZGUgdGhhdCdzIGVtYmVkZGVkIGluIFNhc3MgZG9jdW1lbnRzCisgICMgdG8gYWxsb3cgZm9yIHByb3BlcnR5IHZhbHVlcyB0byBiZSBjb21wdXRlZCBmcm9tIHZhcmlhYmxlcy4KKyAgIworICAjIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvZGUgdGhhdCBoYW5kbGVzIHRoZSBwYXJzaW5nIGFuZCBldmFsdWF0aW9uIG9mIFNhc3NTY3JpcHQuCisgIG1vZHVsZSBTY3JpcHQKKyAgICAjIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBwYXJzZSB2YXJpYWJsZXMuCisgICAgTUFUQ0ggPSAvXlwkKCN7U2Fzczo6U0NTUzo6Ulg6OklERU5UfSlccyo6XHMqKC4rPykKKyAgICAgICghI3tTYXNzOjpTQ1NTOjpSWDo6SURFTlR9KD86XHMrISN7U2Fzczo6U0NTUzo6Ulg6OklERU5UfSkqKT8kL3gKKworICAgICMgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHZhbGlkYXRlIHZhcmlhYmxlcyB3aXRob3V0IG1hdGNoaW5nLgorICAgIFZBTElEQVRFID0gL15cJCN7U2Fzczo6U0NTUzo6Ulg6OklERU5UfSQvCisKKyAgICAjIFBhcnNlcyBhIHN0cmluZyBvZiBTYXNzU2NyaXB0CisgICAgIworICAgICMgQHBhcmFtIHZhbHVlIFtTdHJpbmddIFRoZSBTYXNzU2NyaXB0CisgICAgIyBAcGFyYW0gbGluZSBbSW50ZWdlcl0gVGhlIG51bWJlciBvZiB0aGUgbGluZSBvbiB3aGljaCB0aGUgU2Fzc1NjcmlwdCBhcHBlYXJlZC4KKyAgICAjICAgVXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nCisgICAgIyBAcGFyYW0gb2Zmc2V0IFtJbnRlZ2VyXSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gb24gYGxpbmVgIHRoYXQgdGhlIFNhc3NTY3JpcHQgc3RhcnRlZC4KKyAgICAjICAgVXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nCisgICAgIyBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBBbiBvcHRpb25zIGhhc2g7CisgICAgIyAgIHNlZSB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNPcHRpb25zIHRoZSBTYXNzIG9wdGlvbnMgZG9jdW1lbnRhdGlvbn0KKyAgICAjIEByZXR1cm4gW1NjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2UgdHJlZQorICAgIGRlZiBzZWxmLnBhcnNlKHZhbHVlLCBsaW5lLCBvZmZzZXQsIG9wdGlvbnMgPSB7fSkKKyAgICAgIFBhcnNlci5wYXJzZSh2YWx1ZSwgbGluZSwgb2Zmc2V0LCBvcHRpb25zKQorICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgICBlLm1lc3NhZ2UgPDwgIjogI3t2YWx1ZS5pbnNwZWN0fS4iIGlmIGUubWVzc2FnZSA9PSAiU2Fzc1NjcmlwdCBlcnJvciIKKyAgICAgIGUubW9kaWZ5X2JhY2t0cmFjZSg6bGluZSA9PiBsaW5lLCA6ZmlsZW5hbWUgPT4gb3B0aW9uc1s6ZmlsZW5hbWVdKQorICAgICAgcmFpc2UgZQorICAgIGVuZAorCisgICAgcmVxdWlyZSAnc2Fzcy9zY3JpcHQvZnVuY3Rpb25zJworICAgIHJlcXVpcmUgJ3Nhc3Mvc2NyaXB0L3BhcnNlcicKKyAgICByZXF1aXJlICdzYXNzL3NjcmlwdC90cmVlJworICAgIHJlcXVpcmUgJ3Nhc3Mvc2NyaXB0L3ZhbHVlJworCisgICAgIyBAcHJpdmF0ZQorICAgIENPTlNUX1JFTkFNRVMgPSB7CisgICAgICA6TGl0ZXJhbCA9PiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlLAorICAgICAgOkFyZ0xpc3QgPT4gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QXJnTGlzdCwKKyAgICAgIDpCb29sID0+IFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2wsCisgICAgICA6Q29sb3IgPT4gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IsCisgICAgICA6TGlzdCA9PiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0LAorICAgICAgOk51bGwgPT4gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVsbCwKKyAgICAgIDpOdW1iZXIgPT4gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLAorICAgICAgOlN0cmluZyA9PiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcsCisgICAgICA6Tm9kZSA9PiBTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUsCisgICAgICA6RnVuY2FsbCA9PiBTYXNzOjpTY3JpcHQ6OlRyZWU6OkZ1bmNhbGwsCisgICAgICA6SW50ZXJwb2xhdGlvbiA9PiBTYXNzOjpTY3JpcHQ6OlRyZWU6OkludGVycG9sYXRpb24sCisgICAgICA6T3BlcmF0aW9uID0+IFNhc3M6OlNjcmlwdDo6VHJlZTo6T3BlcmF0aW9uLAorICAgICAgOlN0cmluZ0ludGVycG9sYXRpb24gPT4gU2Fzczo6U2NyaXB0OjpUcmVlOjpTdHJpbmdJbnRlcnBvbGF0aW9uLAorICAgICAgOlVuYXJ5T3BlcmF0aW9uID0+IFNhc3M6OlNjcmlwdDo6VHJlZTo6VW5hcnlPcGVyYXRpb24sCisgICAgICA6VmFyaWFibGUgPT4gU2Fzczo6U2NyaXB0OjpUcmVlOjpWYXJpYWJsZSwKKyAgICB9CisKKyAgICAjIEBwcml2YXRlCisgICAgZGVmIHNlbGYuY29uc3RfbWlzc2luZyhuYW1lKQorICAgICAga2xhc3MgPSBDT05TVF9SRU5BTUVTW25hbWVdCisgICAgICBzdXBlciB1bmxlc3Mga2xhc3MKKyAgICAgIENPTlNUX1JFTkFNRVMuZWFjaCB7fG4sIGt8IGNvbnN0X3NldChuLCBrKX0KKyAgICAgIGtsYXNzCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC9jc3NfbGV4ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC9jc3NfbGV4ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2MmE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L2Nzc19sZXhlci5yYgpAQCAtMCwwICsxLDMzIEBACittb2R1bGUgU2FzcworICBtb2R1bGUgU2NyaXB0CisgICAgIyBUaGlzIGlzIGEgc3ViY2xhc3Mgb2Yge0xleGVyfSBmb3IgdXNlIGluIHBhcnNpbmcgcGxhaW4gQ1NTIHByb3BlcnRpZXMuCisgICAgIworICAgICMgQHNlZSBTYXNzOjpTQ1NTOjpDc3NQYXJzZXIKKyAgICBjbGFzcyBDc3NMZXhlciA8IExleGVyCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiB0b2tlbgorICAgICAgICBpbXBvcnRhbnQgfHwgc3VwZXIKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3RyaW5nKHJlLCAqYXJncykKKyAgICAgICAgaWYgcmUgPT0gOnVyaQorICAgICAgICAgIHVyaSA9IHNjYW4oVVJJKQorICAgICAgICAgIHJldHVybiB1bmxlc3MgdXJpCisgICAgICAgICAgcmV0dXJuIFs6c3RyaW5nLCBTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KHVyaSldCisgICAgICAgIGVuZAorCisgICAgICAgIHJldHVybiB1bmxlc3Mgc2NhbihTVFJJTkcpCisgICAgICAgIHN0cmluZ192YWx1ZSA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy52YWx1ZShAc2Nhbm5lclsxXSB8fCBAc2Nhbm5lclsyXSkKKyAgICAgICAgdmFsdWUgPSBTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KHN0cmluZ192YWx1ZSwgOnN0cmluZykKKyAgICAgICAgWzpzdHJpbmcsIHZhbHVlXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbXBvcnRhbnQKKyAgICAgICAgcyA9IHNjYW4oSU1QT1JUQU5UKQorICAgICAgICByZXR1cm4gdW5sZXNzIHMKKyAgICAgICAgWzpyYXcsIHNdCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L2Nzc19wYXJzZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC9jc3NfcGFyc2VyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5M2NkYjQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC9jc3NfcGFyc2VyLnJiCkBAIC0wLDAgKzEsMzMgQEAKK3JlcXVpcmUgJ3Nhc3Mvc2NyaXB0JworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvY3NzX2xleGVyJworCittb2R1bGUgU2FzcworICBtb2R1bGUgU2NyaXB0CisgICAgIyBUaGlzIGlzIGEgc3ViY2xhc3Mgb2Yge1BhcnNlcn0gZm9yIHVzZSBpbiBwYXJzaW5nIHBsYWluIENTUyBwcm9wZXJ0aWVzLgorICAgICMKKyAgICAjIEBzZWUgU2Fzczo6U0NTUzo6Q3NzUGFyc2VyCisgICAgY2xhc3MgQ3NzUGFyc2VyIDwgUGFyc2VyCisgICAgICBwcml2YXRlCisKKyAgICAgICMgQHByaXZhdGUKKyAgICAgIGRlZiBsZXhlcl9jbGFzczsgQ3NzTGV4ZXI7IGVuZAorCisgICAgICAjIFdlIG5lZWQgYSBwcm9kdWN0aW9uIHRoYXQgb25seSBkb2VzIC8sCisgICAgICAjIHNpbmNlICogYW5kICUgYXJlbid0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTCisgICAgICBwcm9kdWN0aW9uIDpkaXYsIDp1bmFyeV9wbHVzLCA6ZGl2CisKKyAgICAgIGRlZiBzdHJpbmcKKyAgICAgICAgdG9rID0gdHJ5X3Rvayg6c3RyaW5nKQorICAgICAgICByZXR1cm4gbnVtYmVyIHVubGVzcyB0b2sKKyAgICAgICAgcmV0dXJuIGlmIEBsZXhlci5wZWVrICYmIEBsZXhlci5wZWVrLnR5cGUgPT0gOmJlZ2luX2ludGVycG9sYXRpb24KKyAgICAgICAgbGl0ZXJhbF9ub2RlKHRvay52YWx1ZSwgdG9rLnNvdXJjZV9yYW5nZSkKKyAgICAgIGVuZAorCisgICAgICAjIFNob3J0LWNpcmN1aXQgYWxsIHRoZSBTYXNzU2NyaXB0LW9ubHkgcHJvZHVjdGlvbnMKKyAgICAgIGFsaWFzX21ldGhvZCA6aW50ZXJwb2xhdGlvbiwgOnNwYWNlCisgICAgICBhbGlhc19tZXRob2QgOm9yX2V4cHIsIDpkaXYKKyAgICAgIGFsaWFzX21ldGhvZCA6dW5hcnlfZGl2LCA6aWRlbnQKKyAgICAgIGFsaWFzX21ldGhvZCA6cGFyZW4sIDpzdHJpbmcKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L2Z1bmN0aW9ucy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L2Z1bmN0aW9ucy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzIzNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvZnVuY3Rpb25zLnJiCkBAIC0wLDAgKzEsMjg4NSBAQAorcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdmFsdWUvaGVscGVycycKKworbW9kdWxlIFNhc3M6OlNjcmlwdAorICAjIEBjb21tZW50CisgICMgICBZQVJEIGNhbid0IGhhbmRsZSBzb21lIG11bHRpbGluZSB0YWdzLCBhbmQgd2UgbmVlZCByZWFsbHkgbG9uZyB0YWdzIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisgICMgICBydWJvY29wOmRpc2FibGUgTGluZUxlbmd0aAorICAjIE1ldGhvZHMgaW4gdGhpcyBtb2R1bGUgYXJlIGFjY2Vzc2libGUgZnJvbSB0aGUgU2Fzc1NjcmlwdCBjb250ZXh0LgorICAjIEZvciBleGFtcGxlLCB5b3UgY2FuIHdyaXRlCisgICMKKyAgIyAgICAgJGNvbG9yOiBoc2woMTIwZGVnLCAxMDAlLCA1MCUpCisgICMKKyAgIyBhbmQgaXQgd2lsbCBjYWxsIHtGdW5jdGlvbnMjaHNsfS4KKyAgIworICAjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBwcm92aWRlZDoKKyAgIworICAjICpOb3RlOiBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4qCisgICMKKyAgIyAjIyBSR0IgRnVuY3Rpb25zCisgICMKKyAgIyBceyNyZ2IgcmdiKCRyZWQsICRncmVlbiwgJGJsdWUpfQorICAjIDogQ3JlYXRlcyBhIHtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvciBDb2xvcn0gZnJvbSByZWQsIGdyZWVuLCBhbmQgYmx1ZQorICAjICAgdmFsdWVzLgorICAjCisgICMgXHsjcmdiYSByZ2JhKCRyZWQsICRncmVlbiwgJGJsdWUsICRhbHBoYSl9CisgICMgOiBDcmVhdGVzIGEge1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yIENvbG9yfSBmcm9tIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZAorICAjICAgYWxwaGEgdmFsdWVzLgorICAjCisgICMgXHsjcmVkIHJlZCgkY29sb3IpfQorICAjIDogR2V0cyB0aGUgcmVkIGNvbXBvbmVudCBvZiBhIGNvbG9yLgorICAjCisgICMgXHsjZ3JlZW4gZ3JlZW4oJGNvbG9yKX0KKyAgIyA6IEdldHMgdGhlIGdyZWVuIGNvbXBvbmVudCBvZiBhIGNvbG9yLgorICAjCisgICMgXHsjYmx1ZSBibHVlKCRjb2xvcil9CisgICMgOiBHZXRzIHRoZSBibHVlIGNvbXBvbmVudCBvZiBhIGNvbG9yLgorICAjCisgICMgXHsjbWl4IG1peCgkY29sb3IxLCAkY29sb3IyLCBcWyR3ZWlnaHRcXSl9CisgICMgOiBNaXhlcyB0d28gY29sb3JzIHRvZ2V0aGVyLgorICAjCisgICMgIyMgSFNMIEZ1bmN0aW9ucworICAjCisgICMgXHsjaHNsIGhzbCgkaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcyl9CisgICMgOiBDcmVhdGVzIGEge1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yIENvbG9yfSBmcm9tIGh1ZSwgc2F0dXJhdGlvbiwgYW5kCisgICMgICBsaWdodG5lc3MgdmFsdWVzLgorICAjCisgICMgXHsjaHNsYSBoc2xhKCRodWUsICRzYXR1cmF0aW9uLCAkbGlnaHRuZXNzLCAkYWxwaGEpfQorICAjIDogQ3JlYXRlcyBhIHtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvciBDb2xvcn0gZnJvbSBodWUsIHNhdHVyYXRpb24sCisgICMgICBsaWdodG5lc3MsIGFuZCBhbHBoYSB2YWx1ZXMuCisgICMKKyAgIyBceyNodWUgaHVlKCRjb2xvcil9CisgICMgOiBHZXRzIHRoZSBodWUgY29tcG9uZW50IG9mIGEgY29sb3IuCisgICMKKyAgIyBceyNzYXR1cmF0aW9uIHNhdHVyYXRpb24oJGNvbG9yKX0KKyAgIyA6IEdldHMgdGhlIHNhdHVyYXRpb24gY29tcG9uZW50IG9mIGEgY29sb3IuCisgICMKKyAgIyBceyNsaWdodG5lc3MgbGlnaHRuZXNzKCRjb2xvcil9CisgICMgOiBHZXRzIHRoZSBsaWdodG5lc3MgY29tcG9uZW50IG9mIGEgY29sb3IuCisgICMKKyAgIyBceyNhZGp1c3RfaHVlIGFkanVzdC1odWUoJGNvbG9yLCAkZGVncmVlcyl9CisgICMgOiBDaGFuZ2VzIHRoZSBodWUgb2YgYSBjb2xvci4KKyAgIworICAjIFx7I2xpZ2h0ZW4gbGlnaHRlbigkY29sb3IsICRhbW91bnQpfQorICAjIDogTWFrZXMgYSBjb2xvciBsaWdodGVyLgorICAjCisgICMgXHsjZGFya2VuIGRhcmtlbigkY29sb3IsICRhbW91bnQpfQorICAjIDogTWFrZXMgYSBjb2xvciBkYXJrZXIuCisgICMKKyAgIyBceyNzYXR1cmF0ZSBzYXR1cmF0ZSgkY29sb3IsICRhbW91bnQpfQorICAjIDogTWFrZXMgYSBjb2xvciBtb3JlIHNhdHVyYXRlZC4KKyAgIworICAjIFx7I2Rlc2F0dXJhdGUgZGVzYXR1cmF0ZSgkY29sb3IsICRhbW91bnQpfQorICAjIDogTWFrZXMgYSBjb2xvciBsZXNzIHNhdHVyYXRlZC4KKyAgIworICAjIFx7I2dyYXlzY2FsZSBncmF5c2NhbGUoJGNvbG9yKX0KKyAgIyA6IENvbnZlcnRzIGEgY29sb3IgdG8gZ3JheXNjYWxlLgorICAjCisgICMgXHsjY29tcGxlbWVudCBjb21wbGVtZW50KCRjb2xvcil9CisgICMgOiBSZXR1cm5zIHRoZSBjb21wbGVtZW50IG9mIGEgY29sb3IuCisgICMKKyAgIyBceyNpbnZlcnQgaW52ZXJ0KCRjb2xvciwgXFskd2VpZ2h0XF0pfQorICAjIDogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiBhIGNvbG9yLgorICAjCisgICMgIyMgT3BhY2l0eSBGdW5jdGlvbnMKKyAgIworICAjIFx7I2FscGhhIGFscGhhKCRjb2xvcil9IC8gXHsjb3BhY2l0eSBvcGFjaXR5KCRjb2xvcil9CisgICMgOiBHZXRzIHRoZSBhbHBoYSBjb21wb25lbnQgKG9wYWNpdHkpIG9mIGEgY29sb3IuCisgICMKKyAgIyBceyNyZ2JhIHJnYmEoJGNvbG9yLCAkYWxwaGEpfQorICAjIDogQ2hhbmdlcyB0aGUgYWxwaGEgY29tcG9uZW50IGZvciBhIGNvbG9yLgorICAjCisgICMgXHsjb3BhY2lmeSBvcGFjaWZ5KCRjb2xvciwgJGFtb3VudCl9IC8gXHsjZmFkZV9pbiBmYWRlLWluKCRjb2xvciwgJGFtb3VudCl9CisgICMgOiBNYWtlcyBhIGNvbG9yIG1vcmUgb3BhcXVlLgorICAjCisgICMgXHsjdHJhbnNwYXJlbnRpemUgdHJhbnNwYXJlbnRpemUoJGNvbG9yLCAkYW1vdW50KX0gLyBceyNmYWRlX291dCBmYWRlLW91dCgkY29sb3IsICRhbW91bnQpfQorICAjIDogTWFrZXMgYSBjb2xvciBtb3JlIHRyYW5zcGFyZW50LgorICAjCisgICMgIyMgT3RoZXIgQ29sb3IgRnVuY3Rpb25zCisgICMKKyAgIyBceyNhZGp1c3RfY29sb3IgYWRqdXN0LWNvbG9yKCRjb2xvciwgXFskcmVkXF0sIFxbJGdyZWVuXF0sIFxbJGJsdWVcXSwgXFskaHVlXF0sIFxbJHNhdHVyYXRpb25cXSwgXFskbGlnaHRuZXNzXF0sIFxbJGFscGhhXF0pfQorICAjIDogSW5jcmVhc2VzIG9yIGRlY3JlYXNlcyBvbmUgb3IgbW9yZSBjb21wb25lbnRzIG9mIGEgY29sb3IuCisgICMKKyAgIyBceyNzY2FsZV9jb2xvciBzY2FsZS1jb2xvcigkY29sb3IsIFxbJHJlZFxdLCBcWyRncmVlblxdLCBcWyRibHVlXF0sIFxbJHNhdHVyYXRpb25cXSwgXFskbGlnaHRuZXNzXF0sIFxbJGFscGhhXF0pfQorICAjIDogRmx1aWRseSBzY2FsZXMgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvZiBhIGNvbG9yLgorICAjCisgICMgXHsjY2hhbmdlX2NvbG9yIGNoYW5nZS1jb2xvcigkY29sb3IsIFxbJHJlZFxdLCBcWyRncmVlblxdLCBcWyRibHVlXF0sIFxbJGh1ZVxdLCBcWyRzYXR1cmF0aW9uXF0sIFxbJGxpZ2h0bmVzc1xdLCBcWyRhbHBoYVxdKX0KKyAgIyA6IENoYW5nZXMgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvZiBhIGNvbG9yLgorICAjCisgICMgXHsjaWVfaGV4X3N0ciBpZS1oZXgtc3RyKCRjb2xvcil9CisgICMgOiBDb252ZXJ0cyBhIGNvbG9yIGludG8gdGhlIGZvcm1hdCB1bmRlcnN0b29kIGJ5IElFIGZpbHRlcnMuCisgICMKKyAgIyAjIyBTdHJpbmcgRnVuY3Rpb25zCisgICMKKyAgIyBceyN1bnF1b3RlIHVucXVvdGUoJHN0cmluZyl9CisgICMgOiBSZW1vdmVzIHF1b3RlcyBmcm9tIGEgc3RyaW5nLgorICAjCisgICMgXHsjcXVvdGUgcXVvdGUoJHN0cmluZyl9CisgICMgOiBBZGRzIHF1b3RlcyB0byBhIHN0cmluZy4KKyAgIworICAjIFx7I3N0cl9sZW5ndGggc3RyLWxlbmd0aCgkc3RyaW5nKX0KKyAgIyA6IFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nLgorICAjCisgICMgXHsjc3RyX2luc2VydCBzdHItaW5zZXJ0KCRzdHJpbmcsICRpbnNlcnQsICRpbmRleCl9CisgICMgOiBJbnNlcnRzIGAkaW5zZXJ0YCBpbnRvIGAkc3RyaW5nYCBhdCBgJGluZGV4YC4KKyAgIworICAjIFx7I3N0cl9pbmRleCBzdHItaW5kZXgoJHN0cmluZywgJHN1YnN0cmluZyl9CisgICMgOiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgJHN1YnN0cmluZ2AgaW4gYCRzdHJpbmdgLgorICAjCisgICMgXHsjc3RyX3NsaWNlIHN0ci1zbGljZSgkc3RyaW5nLCAkc3RhcnQtYXQsIFskZW5kLWF0XSl9CisgICMgOiBFeHRyYWN0cyBhIHN1YnN0cmluZyBmcm9tIGAkc3RyaW5nYC4KKyAgIworICAjIFx7I3RvX3VwcGVyX2Nhc2UgdG8tdXBwZXItY2FzZSgkc3RyaW5nKX0KKyAgIyA6IENvbnZlcnRzIGEgc3RyaW5nIHRvIHVwcGVyIGNhc2UuCisgICMKKyAgIyBceyN0b19sb3dlcl9jYXNlIHRvLWxvd2VyLWNhc2UoJHN0cmluZyl9CisgICMgOiBDb252ZXJ0cyBhIHN0cmluZyB0byBsb3dlciBjYXNlLgorICAjCisgICMgIyMgTnVtYmVyIEZ1bmN0aW9ucworICAjCisgICMgXHsjcGVyY2VudGFnZSBwZXJjZW50YWdlKCRudW1iZXIpfQorICAjIDogQ29udmVydHMgYSB1bml0bGVzcyBudW1iZXIgdG8gYSBwZXJjZW50YWdlLgorICAjCisgICMgXHsjcm91bmQgcm91bmQoJG51bWJlcil9CisgICMgOiBSb3VuZHMgYSBudW1iZXIgdG8gdGhlIG5lYXJlc3Qgd2hvbGUgbnVtYmVyLgorICAjCisgICMgXHsjY2VpbCBjZWlsKCRudW1iZXIpfQorICAjIDogUm91bmRzIGEgbnVtYmVyIHVwIHRvIHRoZSBuZXh0IHdob2xlIG51bWJlci4KKyAgIworICAjIFx7I2Zsb29yIGZsb29yKCRudW1iZXIpfQorICAjIDogUm91bmRzIGEgbnVtYmVyIGRvd24gdG8gdGhlIHByZXZpb3VzIHdob2xlIG51bWJlci4KKyAgIworICAjIFx7I2FicyBhYnMoJG51bWJlcil9CisgICMgOiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIG51bWJlci4KKyAgIworICAjIFx7I21pbiBtaW4oJG51bWJlcnMuLi4pXH0KKyAgIyA6IEZpbmRzIHRoZSBtaW5pbXVtIG9mIHNldmVyYWwgbnVtYmVycy4KKyAgIworICAjIFx7I21heCBtYXgoJG51bWJlcnMuLi4pXH0KKyAgIyA6IEZpbmRzIHRoZSBtYXhpbXVtIG9mIHNldmVyYWwgbnVtYmVycy4KKyAgIworICAjIFx7I3JhbmRvbSByYW5kb20oWyRsaW1pdF0pXH0KKyAgIyA6IFJldHVybnMgYSByYW5kb20gbnVtYmVyLgorICAjCisgICMgIyMgTGlzdCBGdW5jdGlvbnMgeyNsaXN0LWZ1bmN0aW9uc30KKyAgIworICAjIExpc3RzIGluIFNhc3MgYXJlIGltbXV0YWJsZTsgYWxsIGxpc3QgZnVuY3Rpb25zIHJldHVybiBhIG5ldyBsaXN0IHJhdGhlcgorICAjIHRoYW4gdXBkYXRpbmcgdGhlIGV4aXN0aW5nIGxpc3QgaW4tcGxhY2UuCisgICMKKyAgIyBBbGwgbGlzdCBmdW5jdGlvbnMgd29yayBmb3IgbWFwcyBhcyB3ZWxsLCB0cmVhdGluZyB0aGVtIGFzIGxpc3RzIG9mIHBhaXJzLgorICAjCisgICMgXHsjbGVuZ3RoIGxlbmd0aCgkbGlzdCl9CisgICMgOiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgYSBsaXN0LgorICAjCisgICMgXHsjbnRoIG50aCgkbGlzdCwgJG4pfQorICAjIDogUmV0dXJucyBhIHNwZWNpZmljIGl0ZW0gaW4gYSBsaXN0LgorICAjCisgICMgXHsjc2V0LW50aCBzZXQtbnRoKCRsaXN0LCAkbiwgJHZhbHVlKX0KKyAgIyA6IFJlcGxhY2VzIHRoZSBudGggaXRlbSBpbiBhIGxpc3QuCisgICMKKyAgIyBceyNqb2luIGpvaW4oJGxpc3QxLCAkbGlzdDIsIFxbJHNlcGFyYXRvciwgJGJyYWNrZXRlZFxdKX0KKyAgIyA6IEpvaW5zIHRvZ2V0aGVyIHR3byBsaXN0cyBpbnRvIG9uZS4KKyAgIworICAjIFx7I2FwcGVuZCBhcHBlbmQoJGxpc3QxLCAkdmFsLCBcWyRzZXBhcmF0b3JcXSl9CisgICMgOiBBcHBlbmRzIGEgc2luZ2xlIHZhbHVlIG9udG8gdGhlIGVuZCBvZiBhIGxpc3QuCisgICMKKyAgIyBceyN6aXAgemlwKCRsaXN0cy4uLil9CisgICMgOiBDb21iaW5lcyBzZXZlcmFsIGxpc3RzIGludG8gYSBzaW5nbGUgbXVsdGlkaW1lbnNpb25hbCBsaXN0LgorICAjCisgICMgXHsjaW5kZXggaW5kZXgoJGxpc3QsICR2YWx1ZSl9CisgICMgOiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiBhIHZhbHVlIHdpdGhpbiBhIGxpc3QuCisgICMKKyAgIyBceyNsaXN0X3NlcGFyYXRvciBsaXN0LXNlcGFyYXRvcigkbGlzdCl9CisgICMgOiBSZXR1cm5zIHRoZSBzZXBhcmF0b3Igb2YgYSBsaXN0LgorICAjCisgICMgXHsjaXNfYnJhY2tldGVkIGlzLWJyYWNrZXRlZCgkbGlzdCl9CisgICMgOiBSZXR1cm5zIHdoZXRoZXIgYSBsaXN0IGhhcyBzcXVhcmUgYnJhY2tldHMuCisgICMKKyAgIyAjIyBNYXAgRnVuY3Rpb25zIHsjbWFwLWZ1bmN0aW9uc30KKyAgIworICAjIE1hcHMgaW4gU2FzcyBhcmUgaW1tdXRhYmxlOyBhbGwgbWFwIGZ1bmN0aW9ucyByZXR1cm4gYSBuZXcgbWFwIHJhdGhlciB0aGFuCisgICMgdXBkYXRpbmcgdGhlIGV4aXN0aW5nIG1hcCBpbi1wbGFjZS4KKyAgIworICAjIFx7I21hcF9nZXQgbWFwLWdldCgkbWFwLCAka2V5KX0KKyAgIyA6IFJldHVybnMgdGhlIHZhbHVlIGluIGEgbWFwIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleS4KKyAgIworICAjIFx7I21hcF9tZXJnZSBtYXAtbWVyZ2UoJG1hcDEsICRtYXAyKX0KKyAgIyA6IE1lcmdlcyB0d28gbWFwcyB0b2dldGhlciBpbnRvIGEgbmV3IG1hcC4KKyAgIworICAjIFx7I21hcF9yZW1vdmUgbWFwLXJlbW92ZSgkbWFwLCAka2V5cy4uLil9CisgICMgOiBSZXR1cm5zIGEgbmV3IG1hcCB3aXRoIGtleXMgcmVtb3ZlZC4KKyAgIworICAjIFx7I21hcF9rZXlzIG1hcC1rZXlzKCRtYXApfQorICAjIDogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGtleXMgaW4gYSBtYXAuCisgICMKKyAgIyBceyNtYXBfdmFsdWVzIG1hcC12YWx1ZXMoJG1hcCl9CisgICMgOiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdmFsdWVzIGluIGEgbWFwLgorICAjCisgICMgXHsjbWFwX2hhc19rZXkgbWFwLWhhcy1rZXkoJG1hcCwgJGtleSl9CisgICMgOiBSZXR1cm5zIHdoZXRoZXIgYSBtYXAgaGFzIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LgorICAjCisgICMgXHsja2V5d29yZHMga2V5d29yZHMoJGFyZ3MpfQorICAjIDogUmV0dXJucyB0aGUga2V5d29yZHMgcGFzc2VkIHRvIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB2YXJpYWJsZSBhcmd1bWVudHMuCisgICMKKyAgIyAjIyBTZWxlY3RvciBGdW5jdGlvbnMKKyAgIworICAjIFNlbGVjdG9yIGZ1bmN0aW9ucyBhcmUgdmVyeSBsaWJlcmFsIGluIHRoZSBmb3JtYXRzIHRoZXkgc3VwcG9ydAorICAjIGZvciBzZWxlY3RvciBhcmd1bWVudHMuIFRoZXkgY2FuIHRha2UgYSBwbGFpbiBzdHJpbmcsIGEgbGlzdCBvZgorICAjIGxpc3RzIGFzIHJldHVybmVkIGJ5IGAmYCBvciBhbnl0aGluZyBpbiBiZXR3ZWVuOgorICAjCisgICMgKiBBIHBsYWluIHN0cmluZywgc3VjaCBhcyBgIi5mb28gLmJhciwgLmJheiAuYmFuZyJgLgorICAjICogQSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBzdHJpbmdzIHN1Y2ggYXMgYCgiLmZvbyIgIi5iYXIiKWAuCisgICMgKiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHN0cmluZ3Mgc3VjaCBhcyBgKCIuZm9vIC5iYXIiLCAiLmJheiAuYmFuZyIpYC4KKyAgIyAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIGxpc3RzIG9mIHN0cmluZ3Mgc3VjaAorICAjICAgYXMgYCgoIi5mb28iICIuYmFyIiksICgiLmJheiIgIi5iYW5nIikpYC4KKyAgIworICAjIEluIGdlbmVyYWwsIHNlbGVjdG9yIGZ1bmN0aW9ucyBhbGxvdyBwbGFjZWhvbGRlciBzZWxlY3RvcnMKKyAgIyAoYCVmb29gKSBidXQgZGlzYWxsb3cgcGFyZW50LXJlZmVyZW5jZSBzZWxlY3RvcnMgKGAmYCkuCisgICMKKyAgIyBceyNzZWxlY3Rvcl9uZXN0IHNlbGVjdG9yLW5lc3QoJHNlbGVjdG9ycy4uLil9CisgICMgOiBOZXN0cyBzZWxlY3RvciBiZW5lYXRoIG9uZSBhbm90aGVyIGxpa2UgdGhleSB3b3VsZCBiZSBuZXN0ZWQgaW4gdGhlCisgICMgICBzdHlsZXNoZWV0LgorICAjCisgICMgXHsjc2VsZWN0b3JfYXBwZW5kIHNlbGVjdG9yLWFwcGVuZCgkc2VsZWN0b3JzLi4uKX0KKyAgIyA6IEFwcGVuZHMgc2VsZWN0b3JzIHRvIG9uZSBhbm90aGVyIHdpdGhvdXQgc3BhY2VzIGluIGJldHdlZW4uCisgICMKKyAgIyBceyNzZWxlY3Rvcl9leHRlbmQgc2VsZWN0b3ItZXh0ZW5kKCRzZWxlY3RvciwgJGV4dGVuZGVlLCAkZXh0ZW5kZXIpfQorICAjIDogRXh0ZW5kcyBgJGV4dGVuZGVlYCB3aXRoIGAkZXh0ZW5kZXJgIHdpdGhpbiBgJHNlbGVjdG9yYC4KKyAgIworICAjIFx7I3NlbGVjdG9yX3JlcGxhY2Ugc2VsZWN0b3ItcmVwbGFjZSgkc2VsZWN0b3IsICRvcmlnaW5hbCwgJHJlcGxhY2VtZW50KX0KKyAgIyA6IFJlcGxhY2VzIGAkb3JpZ2luYWxgIHdpdGggYCRyZXBsYWNlbWVudGAgd2l0aGluIGAkc2VsZWN0b3JgLgorICAjCisgICMgXHsjc2VsZWN0b3JfdW5pZnkgc2VsZWN0b3ItdW5pZnkoJHNlbGVjdG9yMSwgJHNlbGVjdG9yMil9CisgICMgOiBVbmlmaWVzIHR3byBzZWxlY3RvcnMgdG8gcHJvZHVjZSBhIHNlbGVjdG9yIHRoYXQgbWF0Y2hlcworICAjICAgZWxlbWVudHMgbWF0Y2hlZCBieSBib3RoLgorICAjCisgICMgXHsjaXNfc3VwZXJzZWxlY3RvciBpcy1zdXBlcnNlbGVjdG9yKCRzdXBlciwgJHN1Yil9CisgICMgOiBSZXR1cm5zIHdoZXRoZXIgYCRzdXBlcmAgbWF0Y2hlcyBhbGwgdGhlIGVsZW1lbnRzIGAkc3ViYCBkb2VzLCBhbmQKKyAgIyAgIHBvc3NpYmx5IG1vcmUuCisgICMKKyAgIyBceyNzaW1wbGVfc2VsZWN0b3JzIHNpbXBsZS1zZWxlY3RvcnMoJHNlbGVjdG9yKX0KKyAgIyA6IFJldHVybnMgdGhlIHNpbXBsZSBzZWxlY3RvcnMgdGhhdCBjb21wcmlzZSBhIGNvbXBvdW5kIHNlbGVjdG9yLgorICAjCisgICMgXHsjc2VsZWN0b3JfcGFyc2Ugc2VsZWN0b3ItcGFyc2UoJHNlbGVjdG9yKX0KKyAgIyA6IFBhcnNlcyBhIHNlbGVjdG9yIGludG8gdGhlIGZvcm1hdCByZXR1cm5lZCBieSBgJmAuCisgICMKKyAgIyAjIyBJbnRyb3NwZWN0aW9uIEZ1bmN0aW9ucworICAjCisgICMgXHsjZmVhdHVyZV9leGlzdHMgZmVhdHVyZS1leGlzdHMoJGZlYXR1cmUpfQorICAjIDogUmV0dXJucyB3aGV0aGVyIGEgZmVhdHVyZSBleGlzdHMgaW4gdGhlIGN1cnJlbnQgU2FzcyBydW50aW1lLgorICAjCisgICMgXHsjdmFyaWFibGVfZXhpc3RzIHZhcmlhYmxlLWV4aXN0cygkbmFtZSl9CisgICMgOiBSZXR1cm5zIHdoZXRoZXIgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBpbiB0aGUgY3VycmVudCBzY29wZS4KKyAgIworICAjIFx7I2dsb2JhbF92YXJpYWJsZV9leGlzdHMgZ2xvYmFsLXZhcmlhYmxlLWV4aXN0cygkbmFtZSl9CisgICMgOiBSZXR1cm5zIHdoZXRoZXIgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBpbiB0aGUgZ2xvYmFsIHNjb3BlLgorICAjCisgICMgXHsjZnVuY3Rpb25fZXhpc3RzIGZ1bmN0aW9uLWV4aXN0cygkbmFtZSl9CisgICMgOiBSZXR1cm5zIHdoZXRoZXIgYSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cy4KKyAgIworICAjIFx7I21peGluX2V4aXN0cyBtaXhpbi1leGlzdHMoJG5hbWUpfQorICAjIDogUmV0dXJucyB3aGV0aGVyIGEgbWl4aW4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMuCisgICMKKyAgIyBceyNjb250ZW50X2V4aXN0cyBjb250ZW50LWV4aXN0cygpfQorICAjIDogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IG1peGluIHdhcyBwYXNzZWQgYSBjb250ZW50IGJsb2NrLgorICAjCisgICMgXHsjaW5zcGVjdCBpbnNwZWN0KCR2YWx1ZSl9CisgICMgOiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2YWx1ZSBhcyBpdCB3b3VsZCBiZSByZXByZXNlbnRlZCBpbiBTYXNzLgorICAjCisgICMgXHsjdHlwZV9vZiB0eXBlLW9mKCR2YWx1ZSl9CisgICMgOiBSZXR1cm5zIHRoZSB0eXBlIG9mIGEgdmFsdWUuCisgICMKKyAgIyBceyN1bml0IHVuaXQoJG51bWJlcil9CisgICMgOiBSZXR1cm5zIHRoZSB1bml0KHMpIGFzc29jaWF0ZWQgd2l0aCBhIG51bWJlci4KKyAgIworICAjIFx7I3VuaXRsZXNzIHVuaXRsZXNzKCRudW1iZXIpfQorICAjIDogUmV0dXJucyB3aGV0aGVyIGEgbnVtYmVyIGhhcyB1bml0cy4KKyAgIworICAjIFx7I2NvbXBhcmFibGUgY29tcGFyYWJsZSgkbnVtYmVyMSwgJG51bWJlcjIpfQorICAjIDogUmV0dXJucyB3aGV0aGVyIHR3byBudW1iZXJzIGNhbiBiZSBhZGRlZCwgc3VidHJhY3RlZCwgb3IgY29tcGFyZWQuCisgICMKKyAgIyBceyNjYWxsIGNhbGwoJGZ1bmN0aW9uLCAkYXJncy4uLil9CisgICMgOiBEeW5hbWljYWxseSBjYWxscyBhIFNhc3MgZnVuY3Rpb24gcmVmZXJlbmNlIHJldHVybmVkIGJ5IGBnZXQtZnVuY3Rpb25gLgorICAjCisgICMgXHsjZ2V0X2Z1bmN0aW9uIGdldC1mdW5jdGlvbigkbmFtZSwgJGNzczogZmFsc2UpfQorICAjIDogTG9va3MgdXAgYSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUKKyAgIyAgIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0LgorICAjCisgICMgIyMgTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMKKyAgIworICAjIFx7I2lmIGlmKCRjb25kaXRpb24sICRpZi10cnVlLCAkaWYtZmFsc2UpfQorICAjIDogUmV0dXJucyBvbmUgb2YgdHdvIHZhbHVlcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGAkY29uZGl0aW9uYCBpcworICAjICAgdHJ1ZS4KKyAgIworICAjIFx7I3VuaXF1ZV9pZCB1bmlxdWUtaWQoKX0KKyAgIyA6IFJldHVybnMgYSB1bmlxdWUgQ1NTIGlkZW50aWZpZXIuCisgICMKKyAgIyAjIyBBZGRpbmcgQ3VzdG9tIEZ1bmN0aW9ucworICAjCisgICMgTmV3IFNhc3MgZnVuY3Rpb25zIGNhbiBiZSBhZGRlZCBieSBhZGRpbmcgUnVieSBtZXRob2RzIHRvIHRoaXMgbW9kdWxlLgorICAjIEZvciBleGFtcGxlOgorICAjCisgICMgICAgIG1vZHVsZSBTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9ucworICAjICAgICAgIGRlZiByZXZlcnNlKHN0cmluZykKKyAgIyAgICAgICAgIGFzc2VydF90eXBlIHN0cmluZywgOlN0cmluZworICAjICAgICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldyhzdHJpbmcudmFsdWUucmV2ZXJzZSkKKyAgIyAgICAgICBlbmQKKyAgIyAgICAgICBkZWNsYXJlIDpyZXZlcnNlLCBbOnN0cmluZ10KKyAgIyAgICAgZW5kCisgICMKKyAgIyBDYWxsaW5nIHtkZWNsYXJlfSB0ZWxscyBTYXNzIHRoZSBhcmd1bWVudCBuYW1lcyBmb3IgeW91ciBmdW5jdGlvbi4KKyAgIyBJZiBvbWl0dGVkLCB0aGUgZnVuY3Rpb24gd2lsbCBzdGlsbCB3b3JrLCBidXQgd2lsbCBub3QgYmUgYWJsZSB0byBhY2NlcHQga2V5d29yZCBhcmd1bWVudHMuCisgICMge2RlY2xhcmV9IGNhbiBhbHNvIGFsbG93IHlvdXIgZnVuY3Rpb24gdG8gdGFrZSBhcmJpdHJhcnkga2V5d29yZCBhcmd1bWVudHMuCisgICMKKyAgIyBUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHRvIGtlZXAgaW4gbWluZCB3aGVuIG1vZGlmeWluZyB0aGlzIG1vZHVsZS4KKyAgIyBGaXJzdCBvZiBhbGwsIHRoZSBhcmd1bWVudHMgcGFzc2VkIGFyZSB7VmFsdWV9IG9iamVjdHMuCisgICMgVmFsdWUgb2JqZWN0cyBhcmUgYWxzbyBleHBlY3RlZCB0byBiZSByZXR1cm5lZC4KKyAgIyBUaGlzIG1lYW5zIHRoYXQgUnVieSB2YWx1ZXMgbXVzdCBiZSB1bndyYXBwZWQgYW5kIHdyYXBwZWQuCisgICMKKyAgIyBNb3N0IFZhbHVlIG9iamVjdHMgc3VwcG9ydCB0aGUge1ZhbHVlOjpCYXNlI3ZhbHVlIHZhbHVlfSBhY2Nlc3NvciBmb3IgZ2V0dGluZworICAjIHRoZWlyIFJ1YnkgdmFsdWVzLiBDb2xvciBvYmplY3RzLCB0aG91Z2gsIG11c3QgYmUgYWNjZXNzZWQgdXNpbmcKKyAgIyB7U2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IjcmdiIHJnYn0sIHtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvciNyZWQgcmVkfSwKKyAgIyB7U2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IjYmx1ZSBncmVlbn0sIG9yIHtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvciNibHVlCisgICMgYmx1ZX0uCisgICMKKyAgIyBTZWNvbmQsIG1ha2luZyBSdWJ5IGZ1bmN0aW9ucyBhY2Nlc3NpYmxlIGZyb20gU2FzcyBpbnRyb2R1Y2VzIHRoZSB0ZW1wdGF0aW9uCisgICMgdG8gZG8gdGhpbmdzIGxpa2UgZGF0YWJhc2UgYWNjZXNzIHdpdGhpbiBzdHlsZXNoZWV0cy4KKyAgIyBUaGlzIGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhOworICAjIHNpbmNlIFNhc3MgZmlsZXMgYXJlIGJ5IGRlZmF1bHQgb25seSBjb21waWxlZCBvbmNlLAorICAjIGR5bmFtaWMgY29kZSBpcyBub3QgYSBncmVhdCBmaXQuCisgICMKKyAgIyBJZiB5b3UgcmVhbGx5LCByZWFsbHkgbmVlZCB0byBjb21waWxlIFNhc3Mgb24gZWFjaCByZXF1ZXN0LAorICAjIGZpcnN0IG1ha2Ugc3VyZSB5b3UgaGF2ZSBhZGVxdWF0ZSBjYWNoaW5nIHNldCB1cC4KKyAgIyBUaGVuIHlvdSBjYW4gdXNlIHtTYXNzOjpFbmdpbmV9IHRvIHJlbmRlciB0aGUgY29kZSwKKyAgIyB1c2luZyB0aGUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjY3VzdG9tLW9wdGlvbiBgb3B0aW9uc2AgcGFyYW1ldGVyfQorICAjIHRvIHBhc3MgaW4gZGF0YSB0aGF0IHtFdmFsdWF0aW9uQ29udGV4dCNvcHRpb25zIGNhbiBiZSBhY2Nlc3NlZH0KKyAgIyBmcm9tIHlvdXIgU2FzcyBmdW5jdGlvbnMuCisgICMKKyAgIyBXaXRoaW4gb25lIG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUsCisgICMgbWV0aG9kcyBvZiB7RXZhbHVhdGlvbkNvbnRleHR9IGNhbiBiZSB1c2VkLgorICAjCisgICMgIyMjIENhdmVhdHMKKyAgIworICAjIFdoZW4gY3JlYXRpbmcgbmV3IHtWYWx1ZX0gb2JqZWN0cyB3aXRoaW4gZnVuY3Rpb25zLCBiZSBhd2FyZSB0aGF0IGl0J3Mgbm90CisgICMgc2FmZSB0byBjYWxsIHtWYWx1ZTo6QmFzZSN0b19zICN0b19zfSAob3Igb3RoZXIgbWV0aG9kcyB0aGF0IHVzZSB0aGUgc3RyaW5nCisgICMgcmVwcmVzZW50YXRpb24pIG9uIHRob3NlIG9iamVjdHMgd2l0aG91dCBmaXJzdCBzZXR0aW5nIHtUcmVlOjpOb2RlI29wdGlvbnM9CisgICMgdGhlICNvcHRpb25zIGF0dHJpYnV0ZX0uCisgICMKKyAgIyBAY29tbWVudAorICAjICAgcnVib2NvcDplbmFibGUgTGluZUxlbmd0aAorICAjICAgcnVib2NvcDpkaXNhYmxlIE1vZHVsZUxlbmd0aAorICBtb2R1bGUgRnVuY3Rpb25zCisgICAgQHNpZ25hdHVyZXMgPSB7fQorCisgICAgIyBBIGNsYXNzIHJlcHJlc2VudGluZyBhIFNhc3MgZnVuY3Rpb24gc2lnbmF0dXJlLgorICAgICMKKyAgICAjIEBhdHRyIGFyZ3MgW0FycmF5PFN0cmluZz5dIFRoZSBuYW1lcyBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi4KKyAgICAjIEBhdHRyIGRlbGF5ZWRfYXJncyBbQXJyYXk8U3RyaW5nPl0gVGhlIG5hbWVzIG9mIHRoZSBhcmd1bWVudHMgd2hvc2UgZXZhbHVhdGlvbiBzaG91bGQgYmUKKyAgICAjICAgZGVsYXllZC4KKyAgICAjIEBhdHRyIHZhcl9hcmdzIFtCb29sZWFuXSBXaGV0aGVyIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgIyBAYXR0ciB2YXJfa3dhcmdzIFtCb29sZWFuXSBXaGV0aGVyIHRoZSBmdW5jdGlvbiB0YWtlcyBhbiBhcmJpdHJhcnkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLgorICAgIFNpZ25hdHVyZSA9IFN0cnVjdC5uZXcoOmFyZ3MsIDpkZWxheWVkX2FyZ3MsIDp2YXJfYXJncywgOnZhcl9rd2FyZ3MsIDpkZXByZWNhdGVkKQorCisgICAgIyBEZWNsYXJlIGEgU2FzcyBzaWduYXR1cmUgZm9yIGEgUnVieS1kZWZpbmVkIGZ1bmN0aW9uLgorICAgICMgVGhpcyBpbmNsdWRlcyB0aGUgbmFtZXMgb2YgdGhlIGFyZ3VtZW50cywKKyAgICAjIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywKKyAgICAjIGFuZCB3aGV0aGVyIHRoZSBmdW5jdGlvbiB0YWtlcyBhbiBhcmJpdHJhcnkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLgorICAgICMKKyAgICAjIEl0J3Mgbm90IG5lY2Vzc2FyeSB0byBkZWNsYXJlIGEgc2lnbmF0dXJlIGZvciBhIGZ1bmN0aW9uLgorICAgICMgSG93ZXZlciwgd2l0aG91dCBhIHNpZ25hdHVyZSBpdCB3b24ndCBzdXBwb3J0IGtleXdvcmQgYXJndW1lbnRzLgorICAgICMKKyAgICAjIEEgc2luZ2xlIGZ1bmN0aW9uIGNhbiBoYXZlIG11bHRpcGxlIHNpZ25hdHVyZXMgZGVjbGFyZWQKKyAgICAjIGFzIGxvbmcgYXMgZWFjaCBvbmUgdGFrZXMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAjIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBkZWNsYXJlIG11bHRpcGxlIHNpZ25hdHVyZXMKKyAgICAjIHRoYXQgYWxsIHRha2UgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cywKKyAgICAjIGJ1dCBub25lIG9mIHRoZW0gYnV0IHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQKKyAgICAjIHVubGVzcyB0aGUgdXNlciB1c2VzIGtleXdvcmQgYXJndW1lbnRzLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGRlY2xhcmUgOnJnYmEsIFs6aGV4LCA6YWxwaGFdCisgICAgIyAgIGRlY2xhcmUgOnJnYmEsIFs6cmVkLCA6Z3JlZW4sIDpibHVlLCA6YWxwaGFdCisgICAgIyAgIGRlY2xhcmUgOmFjY2VwdHNfYW55dGhpbmcsIFtdLCA6dmFyX2FyZ3MgPT4gdHJ1ZSwgOnZhcl9rd2FyZ3MgPT4gdHJ1ZQorICAgICMgICBkZWNsYXJlIDpzb21lX2Z1bmMsIFs6Zm9vLCA6YmFyLCA6YmF6XSwgOnZhcl9rd2FyZ3MgPT4gdHJ1ZQorICAgICMKKyAgICAjIEBwYXJhbSBtZXRob2RfbmFtZSBbU3ltYm9sXSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICAgIyAgIHdob3NlIHNpZ25hdHVyZSBpcyBiZWluZyBkZWNsYXJlZC4KKyAgICAjIEBwYXJhbSBhcmdzIFtBcnJheTxTeW1ib2w+XSBUaGUgbmFtZXMgb2YgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZS4KKyAgICAjIEBvcHRpb24gb3B0aW9ucyA6dmFyX2FyZ3MgW0Jvb2xlYW5dIChmYWxzZSkKKyAgICAjICAgV2hldGhlciB0aGUgZnVuY3Rpb24gYWNjZXB0cyBhIHZhcmlhYmxlIG51bWJlciBvZiAodW5uYW1lZCkgYXJndW1lbnRzCisgICAgIyAgIGluIGFkZGl0aW9uIHRvIHRoZSBuYW1lZCBhcmd1bWVudHMuCisgICAgIyBAb3B0aW9uIG9wdGlvbnMgOnZhcl9rd2FyZ3MgW0Jvb2xlYW5dIChmYWxzZSkKKyAgICAjICAgV2hldGhlciB0aGUgZnVuY3Rpb24gYWNjZXB0cyBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cworICAgICMgICBpbiBhZGRpdGlvbiB0byB0aG9zZSBpbiBgOmFyZ3NgLgorICAgICMgICBJZiB0aGlzIGlzIHRydWUsIHRoZSBSdWJ5IGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGEgaGFzaCBmcm9tIHN0cmluZ3MKKyAgICAjICAgdG8ge1ZhbHVlfXMgYXMgdGhlIGxhc3QgYXJndW1lbnQuCisgICAgIyAgIEluIGFkZGl0aW9uLCBpZiB0aGlzIGlzIHRydWUgYW5kIGA6dmFyX2FyZ3NgIGlzIG5vdCwKKyAgICAjICAgU2FzcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBsYXN0IGFyZ3VtZW50IHBhc3NlZCBpcyBhIGhhc2guCisgICAgZGVmIHNlbGYuZGVjbGFyZShtZXRob2RfbmFtZSwgYXJncywgb3B0aW9ucyA9IHt9KQorICAgICAgZGVsYXllZF9hcmdzID0gW10KKyAgICAgIGFyZ3MgPSBhcmdzLm1hcCBkbyB8YXwKKyAgICAgICAgYSA9IGEudG9fcworICAgICAgICBpZiBhWzBdID09ID8mCisgICAgICAgICAgYSA9IGFbMS4uLTFdCisgICAgICAgICAgZGVsYXllZF9hcmdzIDw8IGEKKyAgICAgICAgZW5kCisgICAgICAgIGEKKyAgICAgIGVuZAorICAgICAgIyBXZSBkb24ndCBleHBvc2UgdGhpcyBmdW5jdGlvbmFsaXR5IGV4Y2VwdCB0byBjZXJ0YWluIGJ1aWx0aW4gbWV0aG9kcy4KKyAgICAgIGlmIGRlbGF5ZWRfYXJncy5hbnk/ICYmIG1ldGhvZF9uYW1lICE9IDppZgorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiRGVsYXllZCBhcmd1bWVudHMgYXJlIG5vdCBhbGxvd2VkIGZvciBtZXRob2QgI3ttZXRob2RfbmFtZX0iKQorICAgICAgZW5kCisgICAgICBAc2lnbmF0dXJlc1ttZXRob2RfbmFtZV0gfHw9IFtdCisgICAgICBAc2lnbmF0dXJlc1ttZXRob2RfbmFtZV0gPDwgU2lnbmF0dXJlLm5ldygKKyAgICAgICAgYXJncywKKyAgICAgICAgZGVsYXllZF9hcmdzLAorICAgICAgICBvcHRpb25zWzp2YXJfYXJnc10sCisgICAgICAgIG9wdGlvbnNbOnZhcl9rd2FyZ3NdLAorICAgICAgICBvcHRpb25zWzpkZXByZWNhdGVkXSAmJiBvcHRpb25zWzpkZXByZWNhdGVkXS5tYXAge3xhfCBhLnRvX3N9KQorICAgIGVuZAorCisgICAgIyBEZXRlcm1pbmUgdGhlIGNvcnJlY3Qgc2lnbmF0dXJlIGZvciB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworICAgICMgcGFzc2VkIGluIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICAgICMgSWYgbm8gc2lnbmF0dXJlcyBtYXRjaCwgdGhlIGZpcnN0IHNpZ25hdHVyZSBpcyByZXR1cm5lZCBmb3IgZXJyb3IgbWVzc2FnaW5nLgorICAgICMKKyAgICAjIEBwYXJhbSBtZXRob2RfbmFtZSBbU3ltYm9sXSBUaGUgbmFtZSBvZiB0aGUgUnVieSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCisgICAgIyBAcGFyYW0gYXJnX2FyaXR5IFtJbnRlZ2VyXSBUaGUgbnVtYmVyIG9mIHVubmFtZWQgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiB3YXMgcGFzc2VkLgorICAgICMgQHBhcmFtIGt3YXJnX2FyaXR5IFtJbnRlZ2VyXSBUaGUgbnVtYmVyIG9mIGtleXdvcmQgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiB3YXMgcGFzc2VkLgorICAgICMKKyAgICAjIEByZXR1cm4gW3tTeW1ib2wgPT4gT2JqZWN0fSwgbmlsXQorICAgICMgICBUaGUgc2lnbmF0dXJlIG9wdGlvbnMgZm9yIHRoZSBtYXRjaGluZyBzaWduYXR1cmUsCisgICAgIyAgIG9yIG5pbCBpZiBubyBzaWduYXR1cmVzIGFyZSBkZWNsYXJlZCBmb3IgdGhpcyBmdW5jdGlvbi4gU2VlIHtkZWNsYXJlfS4KKyAgICBkZWYgc2VsZi5zaWduYXR1cmUobWV0aG9kX25hbWUsIGFyZ19hcml0eSwga3dhcmdfYXJpdHkpCisgICAgICByZXR1cm4gdW5sZXNzIEBzaWduYXR1cmVzW21ldGhvZF9uYW1lXQorICAgICAgQHNpZ25hdHVyZXNbbWV0aG9kX25hbWVdLmVhY2ggZG8gfHNpZ25hdHVyZXwKKyAgICAgICAgc2lnX2FyaXR5ID0gc2lnbmF0dXJlLmFyZ3Muc2l6ZQorICAgICAgICByZXR1cm4gc2lnbmF0dXJlIGlmIHNpZ19hcml0eSA9PSBhcmdfYXJpdHkgKyBrd2FyZ19hcml0eQorICAgICAgICBuZXh0IHVubGVzcyBzaWdfYXJpdHkgPCBhcmdfYXJpdHkgKyBrd2FyZ19hcml0eQorCisgICAgICAgICMgV2UgaGF2ZSBlbm91Z2ggYXJncy4KKyAgICAgICAgIyBOb3cgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGFyZ3MgYXJlIHZhcmFyZ3MKKyAgICAgICAgIyBhbmQgaWYgdGhlIHNpZ25hdHVyZSBhbGxvd3MgdGhlbS4KKyAgICAgICAgdF9hcmdfYXJpdHksIHRfa3dhcmdfYXJpdHkgPSBhcmdfYXJpdHksIGt3YXJnX2FyaXR5CisgICAgICAgIGlmIHNpZ19hcml0eSA+IHRfYXJnX2FyaXR5CisgICAgICAgICAgIyB3ZSB0cmFuc2ZlciBzb21lIGt3YXJncyBhcml0eSB0byBhcmdzIGFyaXR5CisgICAgICAgICAgIyBpZiBpdCBkb2VzIG5vdCBoYXZlIGVub3VnaCBhcmdzIC0tIGFzc3VtaW5nIHRoZSBuYW1lcyB3aWxsIHdvcmsgb3V0LgorICAgICAgICAgIHRfa3dhcmdfYXJpdHkgLT0gKHNpZ19hcml0eSAtIHRfYXJnX2FyaXR5KQorICAgICAgICAgIHRfYXJnX2FyaXR5ID0gc2lnX2FyaXR5CisgICAgICAgIGVuZAorCisgICAgICAgIGlmICh0X2FyZ19hcml0eSA9PSBzaWdfYXJpdHkgfHwgdF9hcmdfYXJpdHkgPiBzaWdfYXJpdHkgJiYgc2lnbmF0dXJlLnZhcl9hcmdzKSAmJgorICAgICAgICAgICAodF9rd2FyZ19hcml0eSA9PSAwIHx8IHRfa3dhcmdfYXJpdHkgPiAwICYmIHNpZ25hdHVyZS52YXJfa3dhcmdzKQorICAgICAgICAgIHJldHVybiBzaWduYXR1cmUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIEBzaWduYXR1cmVzW21ldGhvZF9uYW1lXS5maXJzdAorICAgIGVuZAorCisgICAgIyBTZXRzIHRoZSByYW5kb20gc2VlZCB1c2VkIGJ5IFNhc3MncyBpbnRlcm5hbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAjCisgICAgIyBUaGlzIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSBjb25zaXN0ZW50IHJhbmRvbSBudW1iZXIgc2VxdWVuY2VzIHdoaWNoCisgICAgIyBhbGxvd3MgZm9yIGNvbnNpc3RlbnQgcmVzdWx0cyB3aGVuIHRlc3RpbmcsIGV0Yy4KKyAgICAjCisgICAgIyBAcGFyYW0gc2VlZCBbSW50ZWdlcl0KKyAgICAjIEByZXR1cm4gW0ludGVnZXJdIFRoZSBzYW1lIHNlZWQuCisgICAgZGVmIHNlbGYucmFuZG9tX3NlZWQ9KHNlZWQpCisgICAgICBAcmFuZG9tX251bWJlcl9nZW5lcmF0b3IgPSBSYW5kb20ubmV3KHNlZWQpCisgICAgZW5kCisKKyAgICAjIEdldCBTYXNzJ3MgaW50ZXJuYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgIworICAgICMgQHJldHVybiBbUmFuZG9tXQorICAgIGRlZiBzZWxmLnJhbmRvbV9udW1iZXJfZ2VuZXJhdG9yCisgICAgICBAcmFuZG9tX251bWJlcl9nZW5lcmF0b3IgfHw9IFJhbmRvbS5uZXcKKyAgICBlbmQKKworICAgICMgVGhlIGNvbnRleHQgaW4gd2hpY2ggbWV0aG9kcyBpbiB7U2NyaXB0OjpGdW5jdGlvbnN9IGFyZSBldmFsdWF0ZWQuCisgICAgIyBUaGF0IG1lYW5zIHRoYXQgYWxsIGluc3RhbmNlIG1ldGhvZHMgb2Yge0V2YWx1YXRpb25Db250ZXh0fQorICAgICMgYXJlIGF2YWlsYWJsZSB0byB1c2UgaW4gZnVuY3Rpb25zLgorICAgIGNsYXNzIEV2YWx1YXRpb25Db250ZXh0CisgICAgICBpbmNsdWRlIEZ1bmN0aW9ucworICAgICAgaW5jbHVkZSBWYWx1ZTo6SGVscGVycworCisgICAgICAjIFRoZSBodW1hbi1yZWFkYWJsZSBuYW1lcyBmb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2VdLiBUaGUgZGVmYXVsdCBpcworICAgICAgIyBqdXN0IHRoZSBkb3duY2FzZWQgbmFtZSBvZiB0aGUgdHlwZS4KKyAgICAgIFRZUEVfTkFNRVMgPSB7OkFyZ0xpc3QgPT4gJ3ZhcmlhYmxlIGFyZ3VtZW50IGxpc3QnfQorCisgICAgICAjIFRoZSBlbnZpcm9ubWVudCBmb3IgdGhpcyBmdW5jdGlvbi4gVGhpcyBlbnZpcm9ubWVudCdzCisgICAgICAjIHtFbnZpcm9ubWVudCNwYXJlbnR9IGlzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQsIGFuZCBpdHMKKyAgICAgICMge0Vudmlyb25tZW50I2NhbGxlcn0gaXMgYSByZWFkLW9ubHkgdmlldyBvZiB0aGUgbG9jYWwgZW52aXJvbm1lbnQgb2YgdGhlCisgICAgICAjIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtFbnZpcm9ubWVudF0KKyAgICAgIGF0dHJfcmVhZGVyIDplbnZpcm9ubWVudAorCisgICAgICAjIFRoZSBvcHRpb25zIGhhc2ggZm9yIHRoZSB7U2Fzczo6RW5naW5lfSB0aGF0IGlzIHByb2Nlc3NpbmcgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbe1N5bWJvbCA9PiBPYmplY3R9XQorICAgICAgYXR0cl9yZWFkZXIgOm9wdGlvbnMKKworICAgICAgIyBAcGFyYW0gZW52aXJvbm1lbnQgW0Vudmlyb25tZW50XSBTZWUgXHsjZW52aXJvbm1lbnR9CisgICAgICBkZWYgaW5pdGlhbGl6ZShlbnZpcm9ubWVudCkKKyAgICAgICAgQGVudmlyb25tZW50ID0gZW52aXJvbm1lbnQKKyAgICAgICAgQG9wdGlvbnMgPSBlbnZpcm9ubWVudC5vcHRpb25zCisgICAgICBlbmQKKworICAgICAgIyBBc3NlcnRzIHRoYXQgdGhlIHR5cGUgb2YgYSBnaXZlbiBTYXNzU2NyaXB0IHZhbHVlCisgICAgICAjIGlzIHRoZSBleHBlY3RlZCB0eXBlIChkZXNpZ25hdGVkIGJ5IGEgc3ltYm9sKS4KKyAgICAgICMKKyAgICAgICMgVmFsaWQgdHlwZXMgYXJlIGA6Qm9vbGAsIGA6Q29sb3JgLCBgOk51bWJlcmAsIGFuZCBgOlN0cmluZ2AuCisgICAgICAjIE5vdGUgdGhhdCBgOlN0cmluZ2Agd2lsbCBtYXRjaCBib3RoIGRvdWJsZS1xdW90ZWQgc3RyaW5ncworICAgICAgIyBhbmQgdW5xdW90ZWQgaWRlbnRpZmllcnMuCisgICAgICAjCisgICAgICAjIEBleGFtcGxlCisgICAgICAjICAgYXNzZXJ0X3R5cGUgdmFsdWUsIDpTdHJpbmcKKyAgICAgICMgICBhc3NlcnRfdHlwZSB2YWx1ZSwgOk51bWJlcgorICAgICAgIyBAcGFyYW0gdmFsdWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2VdIEEgU2Fzc1NjcmlwdCB2YWx1ZQorICAgICAgIyBAcGFyYW0gdHlwZSBbU3ltYm9sLCBBcnJheTxTeW1ib2w+XSBUaGUgbmFtZShzKSBvZiB0aGUgdHlwZSB0aGUgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUKKyAgICAgICMgQHBhcmFtIG5hbWUgW1N0cmluZywgU3ltYm9sLCBuaWxdIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiB2YWx1ZSBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KKyAgICAgIGRlZiBhc3NlcnRfdHlwZSh2YWx1ZSwgdHlwZSwgbmFtZSA9IG5pbCkKKyAgICAgICAgdmFsaWRfdHlwZXMgPSBBcnJheSh0eXBlKQorICAgICAgICBmb3VuZF90eXBlID0gdmFsaWRfdHlwZXMuZmluZCBkbyB8dHwKKyAgICAgICAgICB2YWx1ZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlLmNvbnN0X2dldCh0KSkgfHwKKyAgICAgICAgICAgIHQgPT0gOk1hcCAmJiB2YWx1ZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0KSAmJiB2YWx1ZS52YWx1ZS5lbXB0eT8KKyAgICAgICAgZW5kCisKKyAgICAgICAgaWYgZm91bmRfdHlwZQorICAgICAgICAgIHZhbHVlLmNoZWNrX2RlcHJlY2F0ZWRfaW50ZXJwIGlmIGZvdW5kX3R5cGUgPT0gOlN0cmluZworICAgICAgICAgIHJldHVybgorICAgICAgICBlbmQKKworICAgICAgICBlcnIgPSBpZiB2YWxpZF90eXBlcy5zaXplID09IDEKKyAgICAgICAgICAgICAgICAiI3t2YWx1ZS5pbnNwZWN0fSBpcyBub3QgYSAje1RZUEVfTkFNRVNbdHlwZV0gfHwgdHlwZS50b19zLmRvd25jYXNlfSIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHR5cGVfbmFtZXMgPSB2YWxpZF90eXBlcy5tYXAge3x0fCBUWVBFX05BTUVTW3RdIHx8IHQudG9fcy5kb3duY2FzZX0KKyAgICAgICAgICAgICAgICAiI3t2YWx1ZS5pbnNwZWN0fSBpcyBub3QgYW55IG9mICN7dHlwZV9uYW1lcy5qb2luKCcsICcpfSIKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgIGVyciA9ICIkI3tuYW1lLnRvX3MudHIoJ18nLCAnLScpfTogIiArIGVyciBpZiBuYW1lCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KGVycikKKyAgICAgIGVuZAorCisgICAgICAjIEFzc2VydHMgdGhhdCB0aGUgdW5pdCBvZiB0aGUgbnVtYmVyIGlzIGFzIGV4cGVjdGVkLgorICAgICAgIworICAgICAgIyBAZXhhbXBsZQorICAgICAgIyAgIGFzc2VydF91bml0IG51bWJlciwgInB4IgorICAgICAgIyAgIGFzc2VydF91bml0IG51bWJlciwgbmlsCisgICAgICAjIEBwYXJhbSBudW1iZXIgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIG51bWJlciB0byBiZSB2YWxpZGF0ZWQuCisgICAgICAjIEBwYXJhbSB1bml0IFs6OlN0cmluZ10KKyAgICAgICMgICBUaGUgdW5pdCB0aGF0IHRoZSBudW1iZXIgbXVzdCBoYXZlLgorICAgICAgIyAgIElmIG5pbCwgdGhlIG51bWJlciBtdXN0IGJlIHVuaXRsZXNzLgorICAgICAgIyBAcGFyYW0gbmFtZSBbOjpTdHJpbmddIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIG51bWJlciBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdW5pdCBvciBpcyBub3QgYSBudW1iZXIuCisgICAgICBkZWYgYXNzZXJ0X3VuaXQobnVtYmVyLCB1bml0LCBuYW1lID0gbmlsKQorICAgICAgICBhc3NlcnRfdHlwZSBudW1iZXIsIDpOdW1iZXIsIG5hbWUKKyAgICAgICAgcmV0dXJuIGlmIG51bWJlci5pc191bml0Pyh1bml0KQorICAgICAgICBleHBlY3RhdGlvbiA9IHVuaXQgPyAiaGF2ZSBhIHVuaXQgb2YgI3t1bml0fSIgOiAiYmUgdW5pdGxlc3MiCisgICAgICAgIGlmIG5hbWUKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiRXhwZWN0ZWQgJCN7bmFtZX0gdG8gI3tleHBlY3RhdGlvbn0gYnV0IGdvdCAje251bWJlcn0iKQorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIkV4cGVjdGVkICN7bnVtYmVyfSB0byAje2V4cGVjdGF0aW9ufSIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgQXNzZXJ0cyB0aGF0IHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgorICAgICAgIworICAgICAgIyBAZXhhbXBsZQorICAgICAgIyAgIGFzc2VydF9pbnRlZ2VyIDJweAorICAgICAgIyAgIGFzc2VydF9pbnRlZ2VyIDIuNXB4CisgICAgICAjICAgICA9PiBTeW50YXhFcnJvcjogIkV4cGVjdGVkIDIuNXB4IHRvIGJlIGFuIGludGVnZXIiCisgICAgICAjICAgYXNzZXJ0X2ludGVnZXIgMi41cHgsICJ3aWR0aCIKKyAgICAgICMgICAgID0+IFN5bnRheEVycm9yOiAiRXhwZWN0ZWQgd2lkdGggdG8gYmUgYW4gaW50ZWdlciBidXQgZ290IDIuNXB4IgorICAgICAgIyBAcGFyYW0gbnVtYmVyIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXSBUaGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkLgorICAgICAgIyBAcGFyYW0gbmFtZSBbOjpTdHJpbmddIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgYmVpbmcgdmFsaWRhdGVkLgorICAgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIG51bWJlciBpcyBub3QgYW4gaW50ZWdlciBvciBpcyBub3QgYSBudW1iZXIuCisgICAgICBkZWYgYXNzZXJ0X2ludGVnZXIobnVtYmVyLCBuYW1lID0gbmlsKQorICAgICAgICBhc3NlcnRfdHlwZSBudW1iZXIsIDpOdW1iZXIsIG5hbWUKKyAgICAgICAgcmV0dXJuIGlmIG51bWJlci5pbnQ/CisgICAgICAgIGlmIG5hbWUKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiRXhwZWN0ZWQgJCN7bmFtZX0gdG8gYmUgYW4gaW50ZWdlciBidXQgZ290ICN7bnVtYmVyfSIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiRXhwZWN0ZWQgI3tudW1iZXJ9IHRvIGJlIGFuIGludGVnZXIiKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFBlcmZvcm1zIGEgbm9kZSB0aGF0IGhhcyBiZWVuIGRlbGF5ZWQgZm9yIGV4ZWN1dGlvbi4KKyAgICAgICMKKyAgICAgICMgQHByaXZhdGUKKyAgICAgICMgQHBhcmFtIG5vZGUgW1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSwKKyAgICAgICMgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXSBXaGVuIHRoaXMgaXMgYSB0cmVlIG5vZGUsIGl0J3MKKyAgICAgICMgICBwZXJmb3JtZWQgaW4gdGhlIGNhbGxlcidzIGVudmlyb25tZW50LiBXaGVuIGl0J3MgYSB2YWx1ZQorICAgICAgIyAgICh3aGljaCBjYW4gaGFwcGVuIHdoZW4gdGhlIHZhbHVlIGhhZCB0byBiZSBwZXJmb3JtZWQgYWxyZWFkeQorICAgICAgIyAgIC0tIGxpa2UgZm9yIGEgc3BsYXQpLCBpdCdzIHJldHVybmVkIGFzLWlzLgorICAgICAgIyBAcGFyYW0gZW52IFtTYXNzOjpFbnZpcm9ubWVudF0gVGhlIGVudmlyb25tZW50IHdpdGhpbiB3aGljaCB0byBwZXJmb3JtIHRoZSBub2RlLgorICAgICAgIyAgIERlZmF1bHRzIHRvIHRoZSAocmVhZC1vbmx5KSBlbnZpcm9ubWVudCBvZiB0aGUgY2FsbGVyLgorICAgICAgZGVmIHBlcmZvcm0obm9kZSwgZW52ID0gZW52aXJvbm1lbnQuY2FsbGVyKQorICAgICAgICBpZiBub2RlLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2UpCisgICAgICAgICAgbm9kZQorICAgICAgICBlbHNlCisgICAgICAgICAgbm9kZS5wZXJmb3JtKGVudikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgICMgUmV0dXJucyB3aGV0aGVyIHVzZXIgZnVuY3Rpb24gd2l0aCBhIGdpdmVuIG5hbWUgZXhpc3RzLgorICAgICAgIworICAgICAgIyBAcGFyYW0gZnVuY3Rpb25fbmFtZSBbU3RyaW5nXQorICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgYWxpYXNfbWV0aG9kIDpjYWxsYWJsZT8sIDpwdWJsaWNfbWV0aG9kX2RlZmluZWQ/CisKKyAgICAgIHByaXZhdGUKKworICAgICAgZGVmIGluY2x1ZGUoKmFyZ3MpCisgICAgICAgIHIgPSBzdXBlcgorICAgICAgICAjIFdlIGhhdmUgdG8gcmUtaW5jbHVkZSBvdXJzZWx2ZXMgaW50byBFdmFsdWF0aW9uQ29udGV4dCB0byB3b3JrIGFyb3VuZAorICAgICAgICAjIGFuIGlja3kgUnVieSByZXN0cmljdGlvbi4KKyAgICAgICAgRXZhbHVhdGlvbkNvbnRleHQuc2VuZCA6aW5jbHVkZSwgc2VsZgorICAgICAgICByCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQ3JlYXRlcyBhIHtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvciBDb2xvcn0gb2JqZWN0IGZyb20gcmVkLCBncmVlbiwgYW5kCisgICAgIyBibHVlIHZhbHVlcy4KKyAgICAjCisgICAgIyBAc2VlICNyZ2JhCisgICAgIyBAb3ZlcmxvYWQgcmdiKCRyZWQsICRncmVlbiwgJGJsdWUpCisgICAgIyAgIEBwYXJhbSAkcmVkIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBhbW91bnQgb2YgcmVkIGluIHRoZSBjb2xvci4KKyAgICAjICAgICBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1IGluY2x1c2l2ZSwgb3IgYmV0d2VlbiBgMCVgIGFuZCBgMTAwJWAKKyAgICAjICAgICBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRncmVlbiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgYW1vdW50IG9mIGdyZWVuIGluIHRoZQorICAgICMgICAgIGNvbG9yLiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1IGluY2x1c2l2ZSwgb3IgYmV0d2VlbiBgMCVgIGFuZCBgMTAwJWAKKyAgICAjICAgICBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRibHVlIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBhbW91bnQgb2YgYmx1ZSBpbiB0aGUKKyAgICAjICAgICBjb2xvci4gTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSBpbmNsdXNpdmUsIG9yIGJldHdlZW4gYDAlYCBhbmQgYDEwMCVgCisgICAgIyAgICAgaW5jbHVzaXZlCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYW55IHBhcmFtZXRlciBpcyB0aGUgd3JvbmcgdHlwZSBvciBvdXQgb2YgYm91bmRzCisgICAgZGVmIHJnYihyZWQsIGdyZWVuLCBibHVlKQorICAgICAgaWYgc3BlY2lhbF9udW1iZXI/KHJlZCkgfHwgc3BlY2lhbF9udW1iZXI/KGdyZWVuKSB8fCBzcGVjaWFsX251bWJlcj8oYmx1ZSkKKyAgICAgICAgcmV0dXJuIHVucXVvdGVkX3N0cmluZygicmdiKCN7cmVkfSwgI3tncmVlbn0sICN7Ymx1ZX0pIikKKyAgICAgIGVuZAorICAgICAgYXNzZXJ0X3R5cGUgcmVkLCA6TnVtYmVyLCA6cmVkCisgICAgICBhc3NlcnRfdHlwZSBncmVlbiwgOk51bWJlciwgOmdyZWVuCisgICAgICBhc3NlcnRfdHlwZSBibHVlLCA6TnVtYmVyLCA6Ymx1ZQorCisgICAgICBjb2xvcl9hdHRycyA9IFtyZWQsIGdyZWVuLCBibHVlXS5tYXAgZG8gfGN8CisgICAgICAgIGlmIGMuaXNfdW5pdD8oIiUiKQorICAgICAgICAgIGMudmFsdWUgKiAyNTUgLyAxMDAuMAorICAgICAgICBlbHNpZiBjLnVuaXRsZXNzPworICAgICAgICAgIGMudmFsdWUKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJFeHBlY3RlZCAje2N9IHRvIGJlIHVuaXRsZXNzIG9yIGhhdmUgYSB1bml0IG9mICUgYnV0IGdvdCAje2N9IikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBEb24ndCBzdG9yZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBmdW5jdGlvbi1jcmVhdGVkIGNvbG9ycywgYm90aAorICAgICAgIyBiZWNhdXNlIGl0J3Mgbm90IHZlcnkgdXNlZnVsIGFuZCBiZWNhdXNlIHNvbWUgZnVuY3Rpb25zIGFyZW4ndCBzdXBwb3J0ZWQKKyAgICAgICMgb24gb2xkZXIgYnJvd3NlcnMuCisgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvci5uZXcoY29sb3JfYXR0cnMpCisgICAgZW5kCisgICAgZGVjbGFyZSA6cmdiLCBbOnJlZCwgOmdyZWVuLCA6Ymx1ZV0KKworICAgICMgQ3JlYXRlcyBhIHtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvciBDb2xvcn0gZnJvbSByZWQsIGdyZWVuLCBibHVlLCBhbmQKKyAgICAjIGFscGhhIHZhbHVlcy4KKyAgICAjIEBzZWUgI3JnYgorICAgICMKKyAgICAjIEBvdmVybG9hZCByZ2JhKCRyZWQsICRncmVlbiwgJGJsdWUsICRhbHBoYSkKKyAgICAjICAgQHBhcmFtICRyZWQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFtb3VudCBvZiByZWQgaW4gdGhlCisgICAgIyAgICAgY29sb3IuIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUgaW5jbHVzaXZlIG9yIDAlIGFuZCAxMDAlIGluY2x1c2l2ZQorICAgICMgICBAcGFyYW0gJGdyZWVuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBhbW91bnQgb2YgZ3JlZW4gaW4gdGhlCisgICAgIyAgICAgY29sb3IuIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUgaW5jbHVzaXZlIG9yIDAlIGFuZCAxMDAlIGluY2x1c2l2ZQorICAgICMgICBAcGFyYW0gJGJsdWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFtb3VudCBvZiBibHVlIGluIHRoZQorICAgICMgICAgIGNvbG9yLiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1IGluY2x1c2l2ZSBvciAwJSBhbmQgMTAwJSBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRhbHBoYSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgb3BhY2l0eSBvZiB0aGUgY29sb3IuCisgICAgIyAgICAgTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlCisgICAgIyAgIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgICBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGFueSBwYXJhbWV0ZXIgaXMgdGhlIHdyb25nIHR5cGUgb3Igb3V0IG9mCisgICAgIyAgICAgYm91bmRzCisgICAgIworICAgICMgQG92ZXJsb2FkIHJnYmEoJGNvbG9yLCAkYWxwaGEpCisgICAgIyAgIFNldHMgdGhlIG9wYWNpdHkgb2YgYW4gZXhpc3RpbmcgY29sb3IuCisgICAgIworICAgICMgICBAZXhhbXBsZQorICAgICMgICAgIHJnYmEoIzEwMjAzMCwgMC41KSA9PiByZ2JhKDE2LCAzMiwgNDgsIDAuNSkKKyAgICAjICAgICByZ2JhKGJsdWUsIDAuMikgICAgPT4gcmdiYSgwLCAwLCAyNTUsIDAuMikKKyAgICAjCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXSBUaGUgY29sb3Igd2hvc2Ugb3BhY2l0eSB3aWxsCisgICAgIyAgICAgYmUgY2hhbmdlZC4KKyAgICAjICAgQHBhcmFtICRhbHBoYSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgbmV3IG9wYWNpdHkgb2YgdGhlCisgICAgIyAgICAgY29sb3IuIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIGluY2x1c2l2ZQorICAgICMgICBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjICAgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJGFscGhhYCBpcyBvdXQgb2YgYm91bmRzIG9yIGVpdGhlciBwYXJhbWV0ZXIKKyAgICAjICAgICBpcyB0aGUgd3JvbmcgdHlwZQorICAgIGRlZiByZ2JhKCphcmdzKQorICAgICAgY2FzZSBhcmdzLnNpemUKKyAgICAgIHdoZW4gMgorICAgICAgICBjb2xvciwgYWxwaGEgPSBhcmdzCisKKyAgICAgICAgYXNzZXJ0X3R5cGUgY29sb3IsIDpDb2xvciwgOmNvbG9yCisgICAgICAgIGlmIHNwZWNpYWxfbnVtYmVyPyhhbHBoYSkKKyAgICAgICAgICB1bnF1b3RlZF9zdHJpbmcoInJnYmEoI3tjb2xvci5yZWR9LCAje2NvbG9yLmdyZWVufSwgI3tjb2xvci5ibHVlfSwgI3thbHBoYX0pIikKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFzc2VydF90eXBlIGFscGhhLCA6TnVtYmVyLCA6YWxwaGEKKyAgICAgICAgICBjaGVja19hbHBoYV91bml0IGFscGhhLCAncmdiYScKKyAgICAgICAgICBjb2xvci53aXRoKDphbHBoYSA9PiBhbHBoYS52YWx1ZSkKKyAgICAgICAgZW5kCisgICAgICB3aGVuIDQKKyAgICAgICAgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEgPSBhcmdzCisgICAgICAgIGlmIHNwZWNpYWxfbnVtYmVyPyhyZWQpIHx8IHNwZWNpYWxfbnVtYmVyPyhncmVlbikgfHwKKyAgICAgICAgICAgc3BlY2lhbF9udW1iZXI/KGJsdWUpIHx8IHNwZWNpYWxfbnVtYmVyPyhhbHBoYSkKKyAgICAgICAgICB1bnF1b3RlZF9zdHJpbmcoInJnYmEoI3tyZWR9LCAje2dyZWVufSwgI3tibHVlfSwgI3thbHBoYX0pIikKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJnYmEocmdiKHJlZCwgZ3JlZW4sIGJsdWUpLCBhbHBoYSkKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgje2FyZ3Muc2l6ZX0gZm9yIDQpIikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGRlY2xhcmUgOnJnYmEsIFs6cmVkLCA6Z3JlZW4sIDpibHVlLCA6YWxwaGFdCisgICAgZGVjbGFyZSA6cmdiYSwgWzpjb2xvciwgOmFscGhhXQorCisgICAgIyBDcmVhdGVzIGEge1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yIENvbG9yfSBmcm9tIGh1ZSwgc2F0dXJhdGlvbiwgYW5kCisgICAgIyBsaWdodG5lc3MgdmFsdWVzLiBVc2VzIHRoZSBhbGdvcml0aG0gZnJvbSB0aGUgW0NTUzMgc3BlY11bXS4KKyAgICAjCisgICAgIyBbQ1NTMyBzcGVjXTogaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci8jaHNsLWNvbG9yCisgICAgIworICAgICMgQHNlZSAjaHNsYQorICAgICMgQG92ZXJsb2FkIGhzbCgkaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcykKKyAgICAjICAgQHBhcmFtICRodWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGh1ZSBvZiB0aGUgY29sb3IuIFNob3VsZCBiZQorICAgICMgICAgIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXMsIGluY2x1c2l2ZQorICAgICMgICBAcGFyYW0gJHNhdHVyYXRpb24gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIHNhdHVyYXRpb24gb2YgdGhlCisgICAgIyAgICAgY29sb3IuIE11c3QgYmUgYmV0d2VlbiBgMCVgIGFuZCBgMTAwJWAsIGluY2x1c2l2ZQorICAgICMgICBAcGFyYW0gJGxpZ2h0bmVzcyBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgbGlnaHRuZXNzIG9mIHRoZQorICAgICMgICAgIGNvbG9yLiBNdXN0IGJlIGJldHdlZW4gYDAlYCBhbmQgYDEwMCVgLCBpbmNsdXNpdmUKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJHNhdHVyYXRpb25gIG9yIGAkbGlnaHRuZXNzYCBhcmUgb3V0IG9mIGJvdW5kcworICAgICMgICBvciBhbnkgcGFyYW1ldGVyIGlzIHRoZSB3cm9uZyB0eXBlCisgICAgZGVmIGhzbChodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcykKKyAgICAgIGlmIHNwZWNpYWxfbnVtYmVyPyhodWUpIHx8IHNwZWNpYWxfbnVtYmVyPyhzYXR1cmF0aW9uKSB8fCBzcGVjaWFsX251bWJlcj8obGlnaHRuZXNzKQorICAgICAgICB1bnF1b3RlZF9zdHJpbmcoImhzbCgje2h1ZX0sICN7c2F0dXJhdGlvbn0sICN7bGlnaHRuZXNzfSkiKQorICAgICAgZWxzZQorICAgICAgICBoc2xhKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCBudW1iZXIoMSkpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpoc2wsIFs6aHVlLCA6c2F0dXJhdGlvbiwgOmxpZ2h0bmVzc10KKworICAgICMgQ3JlYXRlcyBhIHtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvciBDb2xvcn0gZnJvbSBodWUsCisgICAgIyBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIGFuZCBhbHBoYSB2YWx1ZXMuIFVzZXMgdGhlIGFsZ29yaXRobSBmcm9tCisgICAgIyB0aGUgW0NTUzMgc3BlY11bXS4KKyAgICAjCisgICAgIyBbQ1NTMyBzcGVjXTogaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci8jaHNsLWNvbG9yCisgICAgIworICAgICMgQHNlZSAjaHNsCisgICAgIyBAb3ZlcmxvYWQgaHNsYSgkaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcywgJGFscGhhKQorICAgICMgICBAcGFyYW0gJGh1ZSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgaHVlIG9mIHRoZSBjb2xvci4gU2hvdWxkIGJlCisgICAgIyAgICAgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlcywgaW5jbHVzaXZlCisgICAgIyAgIEBwYXJhbSAkc2F0dXJhdGlvbiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgc2F0dXJhdGlvbiBvZiB0aGUKKyAgICAjICAgICBjb2xvci4gTXVzdCBiZSBiZXR3ZWVuIGAwJWAgYW5kIGAxMDAlYCwgaW5jbHVzaXZlCisgICAgIyAgIEBwYXJhbSAkbGlnaHRuZXNzIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBsaWdodG5lc3Mgb2YgdGhlCisgICAgIyAgICAgY29sb3IuIE11c3QgYmUgYmV0d2VlbiBgMCVgIGFuZCBgMTAwJWAsIGluY2x1c2l2ZQorICAgICMgICBAcGFyYW0gJGFscGhhIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBvcGFjaXR5IG9mIHRoZSBjb2xvci4gTXVzdAorICAgICMgICAgIGJlIGJldHdlZW4gMCBhbmQgMSwgaW5jbHVzaXZlCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRzYXR1cmF0aW9uYCwgYCRsaWdodG5lc3NgLCBvciBgJGFscGhhYCBhcmUgb3V0CisgICAgIyAgIG9mIGJvdW5kcyBvciBhbnkgcGFyYW1ldGVyIGlzIHRoZSB3cm9uZyB0eXBlCisgICAgZGVmIGhzbGEoaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIGFscGhhKQorICAgICAgaWYgc3BlY2lhbF9udW1iZXI/KGh1ZSkgfHwgc3BlY2lhbF9udW1iZXI/KHNhdHVyYXRpb24pIHx8CisgICAgICAgICBzcGVjaWFsX251bWJlcj8obGlnaHRuZXNzKSB8fCBzcGVjaWFsX251bWJlcj8oYWxwaGEpCisgICAgICAgIHJldHVybiB1bnF1b3RlZF9zdHJpbmcoImhzbGEoI3todWV9LCAje3NhdHVyYXRpb259LCAje2xpZ2h0bmVzc30sICN7YWxwaGF9KSIpCisgICAgICBlbmQKKyAgICAgIGFzc2VydF90eXBlIGh1ZSwgOk51bWJlciwgOmh1ZQorICAgICAgYXNzZXJ0X3R5cGUgc2F0dXJhdGlvbiwgOk51bWJlciwgOnNhdHVyYXRpb24KKyAgICAgIGFzc2VydF90eXBlIGxpZ2h0bmVzcywgOk51bWJlciwgOmxpZ2h0bmVzcworICAgICAgYXNzZXJ0X3R5cGUgYWxwaGEsIDpOdW1iZXIsIDphbHBoYQorICAgICAgY2hlY2tfYWxwaGFfdW5pdCBhbHBoYSwgJ2hzbGEnCisKKyAgICAgIGggPSBodWUudmFsdWUKKyAgICAgIHMgPSBzYXR1cmF0aW9uLnZhbHVlCisgICAgICBsID0gbGlnaHRuZXNzLnZhbHVlCisKKyAgICAgICMgRG9uJ3Qgc3RvcmUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgZnVuY3Rpb24tY3JlYXRlZCBjb2xvcnMsIGJvdGgKKyAgICAgICMgYmVjYXVzZSBpdCdzIG5vdCB2ZXJ5IHVzZWZ1bCBhbmQgYmVjYXVzZSBzb21lIGZ1bmN0aW9ucyBhcmVuJ3Qgc3VwcG9ydGVkCisgICAgICAjIG9uIG9sZGVyIGJyb3dzZXJzLgorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IubmV3KAorICAgICAgICA6aHVlID0+IGgsIDpzYXR1cmF0aW9uID0+IHMsIDpsaWdodG5lc3MgPT4gbCwgOmFscGhhID0+IGFscGhhLnZhbHVlKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmhzbGEsIFs6aHVlLCA6c2F0dXJhdGlvbiwgOmxpZ2h0bmVzcywgOmFscGhhXQorCisgICAgIyBHZXRzIHRoZSByZWQgY29tcG9uZW50IG9mIGEgY29sb3IuIENhbGN1bGF0ZWQgZnJvbSBIU0wgd2hlcmUgbmVjZXNzYXJ5IHZpYQorICAgICMgW3RoaXMgYWxnb3JpdGhtXVtoc2wtdG8tcmdiXS4KKyAgICAjCisgICAgIyBbaHNsLXRvLXJnYl06IGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvI2hzbC1jb2xvcgorICAgICMKKyAgICAjIEBvdmVybG9hZCByZWQoJGNvbG9yKQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIHJlZCBjb21wb25lbnQsIGJldHdlZW4gMCBhbmQgMjU1CisgICAgIyAgIGluY2x1c2l2ZQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJGNvbG9yYCBpc24ndCBhIGNvbG9yCisgICAgZGVmIHJlZChjb2xvcikKKyAgICAgIGFzc2VydF90eXBlIGNvbG9yLCA6Q29sb3IsIDpjb2xvcgorICAgICAgbnVtYmVyKGNvbG9yLnJlZCkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpyZWQsIFs6Y29sb3JdCisKKyAgICAjIEdldHMgdGhlIGdyZWVuIGNvbXBvbmVudCBvZiBhIGNvbG9yLiBDYWxjdWxhdGVkIGZyb20gSFNMIHdoZXJlIG5lY2Vzc2FyeQorICAgICMgdmlhIFt0aGlzIGFsZ29yaXRobV1baHNsLXRvLXJnYl0uCisgICAgIworICAgICMgW2hzbC10by1yZ2JdOiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNoc2wtY29sb3IKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgZ3JlZW4oJGNvbG9yKQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGdyZWVuIGNvbXBvbmVudCwgYmV0d2VlbiAwIGFuZAorICAgICMgICAyNTUgaW5jbHVzaXZlCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkY29sb3JgIGlzbid0IGEgY29sb3IKKyAgICBkZWYgZ3JlZW4oY29sb3IpCisgICAgICBhc3NlcnRfdHlwZSBjb2xvciwgOkNvbG9yLCA6Y29sb3IKKyAgICAgIG51bWJlcihjb2xvci5ncmVlbikKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpncmVlbiwgWzpjb2xvcl0KKworICAgICMgR2V0cyB0aGUgYmx1ZSBjb21wb25lbnQgb2YgYSBjb2xvci4gQ2FsY3VsYXRlZCBmcm9tIEhTTCB3aGVyZSBuZWNlc3NhcnkKKyAgICAjIHZpYSBbdGhpcyBhbGdvcml0aG1dW2hzbC10by1yZ2JdLgorICAgICMKKyAgICAjIFtoc2wtdG8tcmdiXTogaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci8jaHNsLWNvbG9yCisgICAgIworICAgICMgQG92ZXJsb2FkIGJsdWUoJGNvbG9yKQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGJsdWUgY29tcG9uZW50LCBiZXR3ZWVuIDAgYW5kCisgICAgIyAgIDI1NSBpbmNsdXNpdmUKKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRjb2xvcmAgaXNuJ3QgYSBjb2xvcgorICAgIGRlZiBibHVlKGNvbG9yKQorICAgICAgYXNzZXJ0X3R5cGUgY29sb3IsIDpDb2xvciwgOmNvbG9yCisgICAgICBudW1iZXIoY29sb3IuYmx1ZSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpibHVlLCBbOmNvbG9yXQorCisgICAgIyBSZXR1cm5zIHRoZSBodWUgY29tcG9uZW50IG9mIGEgY29sb3IuIFNlZSBbdGhlIENTUzMgSFNMCisgICAgIyBzcGVjaWZpY2F0aW9uXVtoc2xdLiBDYWxjdWxhdGVkIGZyb20gUkdCIHdoZXJlIG5lY2Vzc2FyeSB2aWEgW3RoaXMKKyAgICAjIGFsZ29yaXRobV1bcmdiLXRvLWhzbF0uCisgICAgIworICAgICMgW2hzbF06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSFNMX2FuZF9IU1YjQ29udmVyc2lvbl9mcm9tX1JHQl90b19IU0xfb3JfSFNWCisgICAgIyBbcmdiLXRvLWhzbF06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSFNMX2FuZF9IU1YjQ29udmVyc2lvbl9mcm9tX1JHQl90b19IU0xfb3JfSFNWCisgICAgIworICAgICMgQG92ZXJsb2FkIGh1ZSgkY29sb3IpCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgaHVlIGNvbXBvbmVudCwgYmV0d2VlbiAwZGVnIGFuZAorICAgICMgICAzNjBkZWcKKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRjb2xvcmAgaXNuJ3QgYSBjb2xvcgorICAgIGRlZiBodWUoY29sb3IpCisgICAgICBhc3NlcnRfdHlwZSBjb2xvciwgOkNvbG9yLCA6Y29sb3IKKyAgICAgIG51bWJlcihjb2xvci5odWUsICJkZWciKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmh1ZSwgWzpjb2xvcl0KKworICAgICMgUmV0dXJucyB0aGUgc2F0dXJhdGlvbiBjb21wb25lbnQgb2YgYSBjb2xvci4gU2VlIFt0aGUgQ1NTMyBIU0wKKyAgICAjIHNwZWNpZmljYXRpb25dW2hzbF0uIENhbGN1bGF0ZWQgZnJvbSBSR0Igd2hlcmUgbmVjZXNzYXJ5IHZpYSBbdGhpcworICAgICMgYWxnb3JpdGhtXVtyZ2ItdG8taHNsXS4KKyAgICAjCisgICAgIyBbaHNsXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IU0xfYW5kX0hTViNDb252ZXJzaW9uX2Zyb21fUkdCX3RvX0hTTF9vcl9IU1YKKyAgICAjIFtyZ2ItdG8taHNsXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IU0xfYW5kX0hTViNDb252ZXJzaW9uX2Zyb21fUkdCX3RvX0hTTF9vcl9IU1YKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgc2F0dXJhdGlvbigkY29sb3IpCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgc2F0dXJhdGlvbiBjb21wb25lbnQsIGJldHdlZW4gMCUKKyAgICAjICAgYW5kIDEwMCUKKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRjb2xvcmAgaXNuJ3QgYSBjb2xvcgorICAgIGRlZiBzYXR1cmF0aW9uKGNvbG9yKQorICAgICAgYXNzZXJ0X3R5cGUgY29sb3IsIDpDb2xvciwgOmNvbG9yCisgICAgICBudW1iZXIoY29sb3Iuc2F0dXJhdGlvbiwgIiUiKQorICAgIGVuZAorICAgIGRlY2xhcmUgOnNhdHVyYXRpb24sIFs6Y29sb3JdCisKKyAgICAjIFJldHVybnMgdGhlIGxpZ2h0bmVzcyBjb21wb25lbnQgb2YgYSBjb2xvci4gU2VlIFt0aGUgQ1NTMyBIU0wKKyAgICAjIHNwZWNpZmljYXRpb25dW2hzbF0uIENhbGN1bGF0ZWQgZnJvbSBSR0Igd2hlcmUgbmVjZXNzYXJ5IHZpYSBbdGhpcworICAgICMgYWxnb3JpdGhtXVtyZ2ItdG8taHNsXS4KKyAgICAjCisgICAgIyBbaHNsXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IU0xfYW5kX0hTViNDb252ZXJzaW9uX2Zyb21fUkdCX3RvX0hTTF9vcl9IU1YKKyAgICAjIFtyZ2ItdG8taHNsXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IU0xfYW5kX0hTViNDb252ZXJzaW9uX2Zyb21fUkdCX3RvX0hTTF9vcl9IU1YKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgbGlnaHRuZXNzKCRjb2xvcikKKyAgICAjICAgQHBhcmFtICRjb2xvciBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBsaWdodG5lc3MgY29tcG9uZW50LCBiZXR3ZWVuIDAlCisgICAgIyAgIGFuZCAxMDAlCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkY29sb3JgIGlzbid0IGEgY29sb3IKKyAgICBkZWYgbGlnaHRuZXNzKGNvbG9yKQorICAgICAgYXNzZXJ0X3R5cGUgY29sb3IsIDpDb2xvciwgOmNvbG9yCisgICAgICBudW1iZXIoY29sb3IubGlnaHRuZXNzLCAiJSIpCisgICAgZW5kCisgICAgZGVjbGFyZSA6bGlnaHRuZXNzLCBbOmNvbG9yXQorCisgICAgIyBSZXR1cm5zIHRoZSBhbHBoYSBjb21wb25lbnQgKG9wYWNpdHkpIG9mIGEgY29sb3IuIFRoaXMgaXMgMSB1bmxlc3MKKyAgICAjIG90aGVyd2lzZSBzcGVjaWZpZWQuCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiBhbHNvIHN1cHBvcnRzIHRoZSBwcm9wcmlldGFyeSBNaWNyb3NvZnQgYGFscGhhKG9wYWNpdHk9MjApYAorICAgICMgc3ludGF4IGFzIGEgc3BlY2lhbCBjYXNlLgorICAgICMKKyAgICAjIEBvdmVybG9hZCBhbHBoYSgkY29sb3IpCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgYWxwaGEgY29tcG9uZW50LCBiZXR3ZWVuIDAgYW5kIDEKKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRjb2xvcmAgaXNuJ3QgYSBjb2xvcgorICAgIGRlZiBhbHBoYSgqYXJncykKKyAgICAgIGlmIGFyZ3MuYWxsPyBkbyB8YXwKKyAgICAgICAgICAgYS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpICYmIGEudHlwZSA9PSA6aWRlbnRpZmllciAmJgorICAgICAgICAgICAgIGEudmFsdWUgPX4gL15bYS16QS1aXStccyo9LworICAgICAgICAgZW5kCisgICAgICAgICMgU3VwcG9ydCB0aGUgcHJvcHJpZXRhcnkgTVMgYWxwaGEoKSBmdW5jdGlvbgorICAgICAgICByZXR1cm4gaWRlbnRpZmllcigiYWxwaGEoI3thcmdzLm1hcCB7fGF8IGEudG9fc30uam9pbignLCAnKX0pIikKKyAgICAgIGVuZAorCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAoI3thcmdzLnNpemV9IGZvciAxKSIpIGlmIGFyZ3Muc2l6ZSAhPSAxCisKKyAgICAgIGFzc2VydF90eXBlIGFyZ3MuZmlyc3QsIDpDb2xvciwgOmNvbG9yCisgICAgICBudW1iZXIoYXJncy5maXJzdC5hbHBoYSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDphbHBoYSwgWzpjb2xvcl0KKworICAgICMgUmV0dXJucyB0aGUgYWxwaGEgY29tcG9uZW50IChvcGFjaXR5KSBvZiBhIGNvbG9yLiBUaGlzIGlzIDEgdW5sZXNzCisgICAgIyBvdGhlcndpc2Ugc3BlY2lmaWVkLgorICAgICMKKyAgICAjIEBvdmVybG9hZCBvcGFjaXR5KCRjb2xvcikKKyAgICAjICAgQHBhcmFtICRjb2xvciBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBhbHBoYSBjb21wb25lbnQsIGJldHdlZW4gMCBhbmQgMQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJGNvbG9yYCBpc24ndCBhIGNvbG9yCisgICAgZGVmIG9wYWNpdHkoY29sb3IpCisgICAgICBpZiBjb2xvci5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIpCisgICAgICAgIHJldHVybiBpZGVudGlmaWVyKCJvcGFjaXR5KCN7Y29sb3J9KSIpCisgICAgICBlbmQKKyAgICAgIGFzc2VydF90eXBlIGNvbG9yLCA6Q29sb3IsIDpjb2xvcgorICAgICAgbnVtYmVyKGNvbG9yLmFscGhhKQorICAgIGVuZAorICAgIGRlY2xhcmUgOm9wYWNpdHksIFs6Y29sb3JdCisKKyAgICAjIE1ha2VzIGEgY29sb3IgbW9yZSBvcGFxdWUuIFRha2VzIGEgY29sb3IgYW5kIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSwgYW5kCisgICAgIyByZXR1cm5zIGEgY29sb3Igd2l0aCB0aGUgb3BhY2l0eSBpbmNyZWFzZWQgYnkgdGhhdCBhbW91bnQuCisgICAgIworICAgICMgQHNlZSAjdHJhbnNwYXJlbnRpemUKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIG9wYWNpZnkocmdiYSgwLCAwLCAwLCAwLjUpLCAwLjEpID0+IHJnYmEoMCwgMCwgMCwgMC42KQorICAgICMgICBvcGFjaWZ5KHJnYmEoMCwgMCwgMTcsIDAuOCksIDAuMikgPT4gIzAwMQorICAgICMgQG92ZXJsb2FkIG9wYWNpZnkoJGNvbG9yLCAkYW1vdW50KQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjICAgQHBhcmFtICRhbW91bnQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFtb3VudCB0byBpbmNyZWFzZSB0aGUKKyAgICAjICAgICBvcGFjaXR5IGJ5LCBiZXR3ZWVuIDAgYW5kIDEKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJGFtb3VudGAgaXMgb3V0IG9mIGJvdW5kcywgb3IgZWl0aGVyIHBhcmFtZXRlcgorICAgICMgICBpcyB0aGUgd3JvbmcgdHlwZQorICAgIGRlZiBvcGFjaWZ5KGNvbG9yLCBhbW91bnQpCisgICAgICBfYWRqdXN0KGNvbG9yLCBhbW91bnQsIDphbHBoYSwgMC4uMSwgOispCisgICAgZW5kCisgICAgZGVjbGFyZSA6b3BhY2lmeSwgWzpjb2xvciwgOmFtb3VudF0KKworICAgIGFsaWFzX21ldGhvZCA6ZmFkZV9pbiwgOm9wYWNpZnkKKyAgICBkZWNsYXJlIDpmYWRlX2luLCBbOmNvbG9yLCA6YW1vdW50XQorCisgICAgIyBNYWtlcyBhIGNvbG9yIG1vcmUgdHJhbnNwYXJlbnQuIFRha2VzIGEgY29sb3IgYW5kIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQKKyAgICAjIDEsIGFuZCByZXR1cm5zIGEgY29sb3Igd2l0aCB0aGUgb3BhY2l0eSBkZWNyZWFzZWQgYnkgdGhhdCBhbW91bnQuCisgICAgIworICAgICMgQHNlZSAjb3BhY2lmeQorICAgICMgQGV4YW1wbGUKKyAgICAjICAgdHJhbnNwYXJlbnRpemUocmdiYSgwLCAwLCAwLCAwLjUpLCAwLjEpID0+IHJnYmEoMCwgMCwgMCwgMC40KQorICAgICMgICB0cmFuc3BhcmVudGl6ZShyZ2JhKDAsIDAsIDAsIDAuOCksIDAuMikgPT4gcmdiYSgwLCAwLCAwLCAwLjYpCisgICAgIyBAb3ZlcmxvYWQgdHJhbnNwYXJlbnRpemUoJGNvbG9yLCAkYW1vdW50KQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjICAgQHBhcmFtICRhbW91bnQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFtb3VudCB0byBkZWNyZWFzZSB0aGUKKyAgICAjICAgICBvcGFjaXR5IGJ5LCBiZXR3ZWVuIDAgYW5kIDEKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJGFtb3VudGAgaXMgb3V0IG9mIGJvdW5kcywgb3IgZWl0aGVyIHBhcmFtZXRlcgorICAgICMgICBpcyB0aGUgd3JvbmcgdHlwZQorICAgIGRlZiB0cmFuc3BhcmVudGl6ZShjb2xvciwgYW1vdW50KQorICAgICAgX2FkanVzdChjb2xvciwgYW1vdW50LCA6YWxwaGEsIDAuLjEsIDotKQorICAgIGVuZAorICAgIGRlY2xhcmUgOnRyYW5zcGFyZW50aXplLCBbOmNvbG9yLCA6YW1vdW50XQorCisgICAgYWxpYXNfbWV0aG9kIDpmYWRlX291dCwgOnRyYW5zcGFyZW50aXplCisgICAgZGVjbGFyZSA6ZmFkZV9vdXQsIFs6Y29sb3IsIDphbW91bnRdCisKKyAgICAjIE1ha2VzIGEgY29sb3IgbGlnaHRlci4gVGFrZXMgYSBjb2xvciBhbmQgYSBudW1iZXIgYmV0d2VlbiBgMCVgIGFuZCBgMTAwJWAsCisgICAgIyBhbmQgcmV0dXJucyBhIGNvbG9yIHdpdGggdGhlIGxpZ2h0bmVzcyBpbmNyZWFzZWQgYnkgdGhhdCBhbW91bnQuCisgICAgIworICAgICMgQHNlZSAjZGFya2VuCisgICAgIyBAZXhhbXBsZQorICAgICMgICBsaWdodGVuKGhzbCgwLCAwJSwgMCUpLCAzMCUpID0+IGhzbCgwLCAwLCAzMCkKKyAgICAjICAgbGlnaHRlbigjODAwLCAyMCUpID0+ICNlMDAKKyAgICAjIEBvdmVybG9hZCBsaWdodGVuKCRjb2xvciwgJGFtb3VudCkKKyAgICAjICAgQHBhcmFtICRjb2xvciBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyAgIEBwYXJhbSAkYW1vdW50IFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBhbW91bnQgdG8gaW5jcmVhc2UgdGhlCisgICAgIyAgICAgbGlnaHRuZXNzIGJ5LCBiZXR3ZWVuIGAwJWAgYW5kIGAxMDAlYAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkYW1vdW50YCBpcyBvdXQgb2YgYm91bmRzLCBvciBlaXRoZXIgcGFyYW1ldGVyCisgICAgIyAgIGlzIHRoZSB3cm9uZyB0eXBlCisgICAgZGVmIGxpZ2h0ZW4oY29sb3IsIGFtb3VudCkKKyAgICAgIF9hZGp1c3QoY29sb3IsIGFtb3VudCwgOmxpZ2h0bmVzcywgMC4uMTAwLCA6KywgIiUiKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmxpZ2h0ZW4sIFs6Y29sb3IsIDphbW91bnRdCisKKyAgICAjIE1ha2VzIGEgY29sb3IgZGFya2VyLiBUYWtlcyBhIGNvbG9yIGFuZCBhIG51bWJlciBiZXR3ZWVuIDAlIGFuZCAxMDAlLCBhbmQKKyAgICAjIHJldHVybnMgYSBjb2xvciB3aXRoIHRoZSBsaWdodG5lc3MgZGVjcmVhc2VkIGJ5IHRoYXQgYW1vdW50LgorICAgICMKKyAgICAjIEBzZWUgI2xpZ2h0ZW4KKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGRhcmtlbihoc2woMjUsIDEwMCUsIDgwJSksIDMwJSkgPT4gaHNsKDI1LCAxMDAlLCA1MCUpCisgICAgIyAgIGRhcmtlbigjODAwLCAyMCUpID0+ICMyMDAKKyAgICAjIEBvdmVybG9hZCBkYXJrZW4oJGNvbG9yLCAkYW1vdW50KQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjICAgQHBhcmFtICRhbW91bnQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFtb3VudCB0byBkZWNyZWFzZSB0aGUKKyAgICAjICAgICBsaWdodG5lc3MgYnksIGJldHdlZW4gYDAlYCBhbmQgYDEwMCVgCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRhbW91bnRgIGlzIG91dCBvZiBib3VuZHMsIG9yIGVpdGhlciBwYXJhbWV0ZXIKKyAgICAjICAgaXMgdGhlIHdyb25nIHR5cGUKKyAgICBkZWYgZGFya2VuKGNvbG9yLCBhbW91bnQpCisgICAgICBfYWRqdXN0KGNvbG9yLCBhbW91bnQsIDpsaWdodG5lc3MsIDAuLjEwMCwgOi0sICIlIikKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpkYXJrZW4sIFs6Y29sb3IsIDphbW91bnRdCisKKyAgICAjIE1ha2VzIGEgY29sb3IgbW9yZSBzYXR1cmF0ZWQuIFRha2VzIGEgY29sb3IgYW5kIGEgbnVtYmVyIGJldHdlZW4gMCUgYW5kCisgICAgIyAxMDAlLCBhbmQgcmV0dXJucyBhIGNvbG9yIHdpdGggdGhlIHNhdHVyYXRpb24gaW5jcmVhc2VkIGJ5IHRoYXQgYW1vdW50LgorICAgICMKKyAgICAjIEBzZWUgI2Rlc2F0dXJhdGUKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHNhdHVyYXRlKGhzbCgxMjAsIDMwJSwgOTAlKSwgMjAlKSA9PiBoc2woMTIwLCA1MCUsIDkwJSkKKyAgICAjICAgc2F0dXJhdGUoIzg1NSwgMjAlKSA9PiAjOWUzZjNmCisgICAgIyBAb3ZlcmxvYWQgc2F0dXJhdGUoJGNvbG9yLCAkYW1vdW50KQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjICAgQHBhcmFtICRhbW91bnQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFtb3VudCB0byBpbmNyZWFzZSB0aGUKKyAgICAjICAgICBzYXR1cmF0aW9uIGJ5LCBiZXR3ZWVuIGAwJWAgYW5kIGAxMDAlYAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkYW1vdW50YCBpcyBvdXQgb2YgYm91bmRzLCBvciBlaXRoZXIgcGFyYW1ldGVyCisgICAgIyAgIGlzIHRoZSB3cm9uZyB0eXBlCisgICAgZGVmIHNhdHVyYXRlKGNvbG9yLCBhbW91bnQgPSBuaWwpCisgICAgICAjIFN1cHBvcnQgdGhlIGZpbHRlciBlZmZlY3RzIGRlZmluaXRpb24gb2Ygc2F0dXJhdGUuCisgICAgICAjIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvRlhURi9yYXctZmlsZS90aXAvZmlsdGVycy9pbmRleC5odG1sCisgICAgICByZXR1cm4gaWRlbnRpZmllcigic2F0dXJhdGUoI3tjb2xvcn0pIikgaWYgYW1vdW50Lm5pbD8KKyAgICAgIF9hZGp1c3QoY29sb3IsIGFtb3VudCwgOnNhdHVyYXRpb24sIDAuLjEwMCwgOissICIlIikKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpzYXR1cmF0ZSwgWzpjb2xvciwgOmFtb3VudF0KKyAgICBkZWNsYXJlIDpzYXR1cmF0ZSwgWzphbW91bnRdCisKKyAgICAjIE1ha2VzIGEgY29sb3IgbGVzcyBzYXR1cmF0ZWQuIFRha2VzIGEgY29sb3IgYW5kIGEgbnVtYmVyIGJldHdlZW4gMCUgYW5kCisgICAgIyAxMDAlLCBhbmQgcmV0dXJucyBhIGNvbG9yIHdpdGggdGhlIHNhdHVyYXRpb24gZGVjcmVhc2VkIGJ5IHRoYXQgdmFsdWUuCisgICAgIworICAgICMgQHNlZSAjc2F0dXJhdGUKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGRlc2F0dXJhdGUoaHNsKDEyMCwgMzAlLCA5MCUpLCAyMCUpID0+IGhzbCgxMjAsIDEwJSwgOTAlKQorICAgICMgICBkZXNhdHVyYXRlKCM4NTUsIDIwJSkgPT4gIzcyNmI2YgorICAgICMgQG92ZXJsb2FkIGRlc2F0dXJhdGUoJGNvbG9yLCAkYW1vdW50KQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjICAgQHBhcmFtICRhbW91bnQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFtb3VudCB0byBkZWNyZWFzZSB0aGUKKyAgICAjICAgICBzYXR1cmF0aW9uIGJ5LCBiZXR3ZWVuIGAwJWAgYW5kIGAxMDAlYAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkYW1vdW50YCBpcyBvdXQgb2YgYm91bmRzLCBvciBlaXRoZXIgcGFyYW1ldGVyCisgICAgIyAgIGlzIHRoZSB3cm9uZyB0eXBlCisgICAgZGVmIGRlc2F0dXJhdGUoY29sb3IsIGFtb3VudCkKKyAgICAgIF9hZGp1c3QoY29sb3IsIGFtb3VudCwgOnNhdHVyYXRpb24sIDAuLjEwMCwgOi0sICIlIikKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpkZXNhdHVyYXRlLCBbOmNvbG9yLCA6YW1vdW50XQorCisgICAgIyBDaGFuZ2VzIHRoZSBodWUgb2YgYSBjb2xvci4gVGFrZXMgYSBjb2xvciBhbmQgYSBudW1iZXIgb2YgZGVncmVlcyAodXN1YWxseQorICAgICMgYmV0d2VlbiBgLTM2MGRlZ2AgYW5kIGAzNjBkZWdgKSwgYW5kIHJldHVybnMgYSBjb2xvciB3aXRoIHRoZSBodWUgcm90YXRlZAorICAgICMgYWxvbmcgdGhlIGNvbG9yIHdoZWVsIGJ5IHRoYXQgYW1vdW50LgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGFkanVzdC1odWUoaHNsKDEyMCwgMzAlLCA5MCUpLCA2MGRlZykgPT4gaHNsKDE4MCwgMzAlLCA5MCUpCisgICAgIyAgIGFkanVzdC1odWUoaHNsKDEyMCwgMzAlLCA5MCUpLCAtNjBkZWcpID0+IGhzbCg2MCwgMzAlLCA5MCUpCisgICAgIyAgIGFkanVzdC1odWUoIzgxMSwgNDVkZWcpID0+ICM4ODZhMTEKKyAgICAjIEBvdmVybG9hZCBhZGp1c3RfaHVlKCRjb2xvciwgJGRlZ3JlZXMpCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgICBAcGFyYW0gJGRlZ3JlZXMgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIG51bWJlciBvZiBkZWdyZWVzIHRvCisgICAgIyAgICAgcm90YXRlIHRoZSBodWUKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBlaXRoZXIgcGFyYW1ldGVyIGlzIHRoZSB3cm9uZyB0eXBlCisgICAgZGVmIGFkanVzdF9odWUoY29sb3IsIGRlZ3JlZXMpCisgICAgICBhc3NlcnRfdHlwZSBjb2xvciwgOkNvbG9yLCA6Y29sb3IKKyAgICAgIGFzc2VydF90eXBlIGRlZ3JlZXMsIDpOdW1iZXIsIDpkZWdyZWVzCisgICAgICBjb2xvci53aXRoKDpodWUgPT4gY29sb3IuaHVlICsgZGVncmVlcy52YWx1ZSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDphZGp1c3RfaHVlLCBbOmNvbG9yLCA6ZGVncmVlc10KKworICAgICMgQ29udmVydHMgYSBjb2xvciBpbnRvIHRoZSBmb3JtYXQgdW5kZXJzdG9vZCBieSBJRSBmaWx0ZXJzLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGllLWhleC1zdHIoI2FiYykgPT4gI0ZGQUFCQkNDCisgICAgIyAgIGllLWhleC1zdHIoIzMzMjJCQikgPT4gI0ZGMzMyMkJCCisgICAgIyAgIGllLWhleC1zdHIocmdiYSgwLCAyNTUsIDAsIDAuNSkpID0+ICM4MDAwRkYwMAorICAgICMgQG92ZXJsb2FkIGllX2hleF9zdHIoJGNvbG9yKQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10gVGhlIElFLWZvcm1hdHRlZCBzdHJpbmcKKyAgICAjICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbG9yCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkY29sb3JgIGlzbid0IGEgY29sb3IKKyAgICBkZWYgaWVfaGV4X3N0cihjb2xvcikKKyAgICAgIGFzc2VydF90eXBlIGNvbG9yLCA6Q29sb3IsIDpjb2xvcgorICAgICAgYWxwaGEgPSBTYXNzOjpVdGlsLnJvdW5kKGNvbG9yLmFscGhhICogMjU1KS50b19zKDE2KS5yanVzdCgyLCAnMCcpCisgICAgICBpZGVudGlmaWVyKCIjI3thbHBoYX0je2NvbG9yLnNlbmQoOmhleF9zdHIpWzEuLi0xXX0iLnVwY2FzZSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDppZV9oZXhfc3RyLCBbOmNvbG9yXQorCisgICAgIyBJbmNyZWFzZXMgb3IgZGVjcmVhc2VzIG9uZSBvciBtb3JlIHByb3BlcnRpZXMgb2YgYSBjb2xvci4gVGhpcyBjYW4gY2hhbmdlCisgICAgIyB0aGUgcmVkLCBncmVlbiwgYmx1ZSwgaHVlLCBzYXR1cmF0aW9uLCB2YWx1ZSwgYW5kIGFscGhhIHByb3BlcnRpZXMuIFRoZQorICAgICMgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGFzIGtleXdvcmQgYXJndW1lbnRzLCBhbmQgYXJlIGFkZGVkIHRvIG9yCisgICAgIyBzdWJ0cmFjdGVkIGZyb20gdGhlIGNvbG9yJ3MgY3VycmVudCB2YWx1ZSBmb3IgdGhhdCBwcm9wZXJ0eS4KKyAgICAjCisgICAgIyBBbGwgcHJvcGVydGllcyBhcmUgb3B0aW9uYWwuIFlvdSBjYW4ndCBzcGVjaWZ5IGJvdGggUkdCIHByb3BlcnRpZXMKKyAgICAjIChgJHJlZGAsIGAkZ3JlZW5gLCBgJGJsdWVgKSBhbmQgSFNMIHByb3BlcnRpZXMgKGAkaHVlYCwgYCRzYXR1cmF0aW9uYCwKKyAgICAjIGAkdmFsdWVgKSBhdCB0aGUgc2FtZSB0aW1lLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGFkanVzdC1jb2xvcigjMTAyMDMwLCAkYmx1ZTogNSkgPT4gIzEwMjAzNQorICAgICMgICBhZGp1c3QtY29sb3IoIzEwMjAzMCwgJHJlZDogLTUsICRibHVlOiA1KSA9PiAjMGIyMDM1CisgICAgIyAgIGFkanVzdC1jb2xvcihoc2woMjUsIDEwMCUsIDgwJSksICRsaWdodG5lc3M6IC0zMCUsICRhbHBoYTogLTAuNCkgPT4gaHNsYSgyNSwgMTAwJSwgNTAlLCAwLjYpCisgICAgIyBAb3ZlcmxvYWQgYWRqdXN0X2NvbG9yKCRjb2xvciwgWyRyZWRdLCBbJGdyZWVuXSwgWyRibHVlXSwgWyRodWVdLCBbJHNhdHVyYXRpb25dLCBbJGxpZ2h0bmVzc10sIFskYWxwaGFdKQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjICAgQHBhcmFtICRyZWQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFkanVzdG1lbnQgdG8gbWFrZSBvbiB0aGUKKyAgICAjICAgICByZWQgY29tcG9uZW50LCBiZXR3ZWVuIC0yNTUgYW5kIDI1NSBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRncmVlbiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgYWRqdXN0bWVudCB0byBtYWtlIG9uIHRoZQorICAgICMgICAgIGdyZWVuIGNvbXBvbmVudCwgYmV0d2VlbiAtMjU1IGFuZCAyNTUgaW5jbHVzaXZlCisgICAgIyAgIEBwYXJhbSAkYmx1ZSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgYWRqdXN0bWVudCB0byBtYWtlIG9uIHRoZQorICAgICMgICAgIGJsdWUgY29tcG9uZW50LCBiZXR3ZWVuIC0yNTUgYW5kIDI1NSBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRodWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFkanVzdG1lbnQgdG8gbWFrZSBvbiB0aGUKKyAgICAjICAgICBodWUgY29tcG9uZW50LCBpbiBkZWdyZWVzCisgICAgIyAgIEBwYXJhbSAkc2F0dXJhdGlvbiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgYWRqdXN0bWVudCB0byBtYWtlIG9uCisgICAgIyAgICAgdGhlIHNhdHVyYXRpb24gY29tcG9uZW50LCBiZXR3ZWVuIGAtMTAwJWAgYW5kIGAxMDAlYCBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRsaWdodG5lc3MgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGFkanVzdG1lbnQgdG8gbWFrZSBvbgorICAgICMgICAgIHRoZSBsaWdodG5lc3MgY29tcG9uZW50LCBiZXR3ZWVuIGAtMTAwJWAgYW5kIGAxMDAlYCBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRhbHBoYSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgYWRqdXN0bWVudCB0byBtYWtlIG9uIHRoZQorICAgICMgICAgIGFscGhhIGNvbXBvbmVudCwgYmV0d2VlbiAtMSBhbmQgMSBpbmNsdXNpdmUKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBhbnkgcGFyYW1ldGVyIGlzIHRoZSB3cm9uZyB0eXBlIG9yIG91dC1vZgorICAgICMgICBib3VuZHMsIG9yIGlmIFJHQiBwcm9wZXJ0aWVzIGFuZCBIU0wgcHJvcGVydGllcyBhcmUgYWRqdXN0ZWQgYXQgdGhlCisgICAgIyAgIHNhbWUgdGltZQorICAgIGRlZiBhZGp1c3RfY29sb3IoY29sb3IsIGt3YXJncykKKyAgICAgIGFzc2VydF90eXBlIGNvbG9yLCA6Q29sb3IsIDpjb2xvcgorICAgICAgd2l0aCA9IFNhc3M6OlV0aWwubWFwX2hhc2goCisgICAgICAgICJyZWQiID0+IFstMjU1Li4yNTUsICIiXSwKKyAgICAgICAgImdyZWVuIiA9PiBbLTI1NS4uMjU1LCAiIl0sCisgICAgICAgICJibHVlIiA9PiBbLTI1NS4uMjU1LCAiIl0sCisgICAgICAgICJodWUiID0+IG5pbCwKKyAgICAgICAgInNhdHVyYXRpb24iID0+IFstMTAwLi4xMDAsICIlIl0sCisgICAgICAgICJsaWdodG5lc3MiID0+IFstMTAwLi4xMDAsICIlIl0sCisgICAgICAgICJhbHBoYSIgPT4gWy0xLi4xLCAiIl0KKyAgICAgICkgZG8gfG5hbWUsIChyYW5nZSwgdW5pdHMpfAorICAgICAgICB2YWwgPSBrd2FyZ3MuZGVsZXRlKG5hbWUpCisgICAgICAgIG5leHQgdW5sZXNzIHZhbAorICAgICAgICBhc3NlcnRfdHlwZSB2YWwsIDpOdW1iZXIsIG5hbWUKKyAgICAgICAgU2Fzczo6VXRpbC5jaGVja19yYW5nZSgiJCN7bmFtZX06IEFtb3VudCIsIHJhbmdlLCB2YWwsIHVuaXRzKSBpZiByYW5nZQorICAgICAgICBhZGp1c3RlZCA9IGNvbG9yLnNlbmQobmFtZSkgKyB2YWwudmFsdWUKKyAgICAgICAgYWRqdXN0ZWQgPSBbMCwgU2Fzczo6VXRpbC5yZXN0cmljdChhZGp1c3RlZCwgcmFuZ2UpXS5tYXggaWYgcmFuZ2UKKyAgICAgICAgW25hbWUudG9fc3ltLCBhZGp1c3RlZF0KKyAgICAgIGVuZAorCisgICAgICB1bmxlc3Mga3dhcmdzLmVtcHR5PworICAgICAgICBuYW1lLCB2YWwgPSBrd2FyZ3MudG9fYS5maXJzdAorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiVW5rbm93biBhcmd1bWVudCAkI3tuYW1lfSAoI3t2YWx9KSIpCisgICAgICBlbmQKKworICAgICAgY29sb3Iud2l0aCh3aXRoKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmFkanVzdF9jb2xvciwgWzpjb2xvcl0sIDp2YXJfa3dhcmdzID0+IHRydWUKKworICAgICMgRmx1aWRseSBzY2FsZXMgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvZiBhIGNvbG9yLiBVbmxpa2UKKyAgICAjIFx7I2FkanVzdF9jb2xvciBhZGp1c3QtY29sb3J9LCB3aGljaCBjaGFuZ2VzIGEgY29sb3IncyBwcm9wZXJ0aWVzIGJ5IGZpeGVkCisgICAgIyBhbW91bnRzLCBceyNzY2FsZV9jb2xvciBzY2FsZS1jb2xvcn0gZmx1aWRseSBjaGFuZ2VzIHRoZW0gYmFzZWQgb24gaG93CisgICAgIyBoaWdoIG9yIGxvdyB0aGV5IGFscmVhZHkgYXJlLiBUaGF0IG1lYW5zIHRoYXQgbGlnaHRlbmluZyBhbiBhbHJlYWR5LWxpZ2h0CisgICAgIyBjb2xvciB3aXRoIFx7I3NjYWxlX2NvbG9yIHNjYWxlLWNvbG9yfSB3b24ndCBjaGFuZ2UgdGhlIGxpZ2h0bmVzcyBtdWNoLAorICAgICMgYnV0IGxpZ2h0ZW5pbmcgYSBkYXJrIGNvbG9yIGJ5IHRoZSBzYW1lIGFtb3VudCB3aWxsIGNoYW5nZSBpdCBtb3JlCisgICAgIyBkcmFtYXRpY2FsbHkuIFRoaXMgaGFzIHRoZSBiZW5lZml0IG9mIG1ha2luZyBgc2NhbGUtY29sb3IoJGNvbG9yLCAuLi4pYAorICAgICMgaGF2ZSBhIHNpbWlsYXIgZWZmZWN0IHJlZ2FyZGxlc3Mgb2Ygd2hhdCBgJGNvbG9yYCBpcy4KKyAgICAjCisgICAgIyBGb3IgZXhhbXBsZSwgdGhlIGxpZ2h0bmVzcyBvZiBhIGNvbG9yIGNhbiBiZSBhbnl3aGVyZSBiZXR3ZWVuIGAwJWAgYW5kCisgICAgIyBgMTAwJWAuIElmIGBzY2FsZS1jb2xvcigkY29sb3IsICRsaWdodG5lc3M6IDQwJSlgIGlzIGNhbGxlZCwgdGhlIHJlc3VsdGluZworICAgICMgY29sb3IncyBsaWdodG5lc3Mgd2lsbCBiZSA0MCUgb2YgdGhlIHdheSBiZXR3ZWVuIGl0cyBvcmlnaW5hbCBsaWdodG5lc3MKKyAgICAjIGFuZCAxMDAuIElmIGBzY2FsZS1jb2xvcigkY29sb3IsICRsaWdodG5lc3M6IC00MCUpYCBpcyBjYWxsZWQgaW5zdGVhZCwgdGhlCisgICAgIyBsaWdodG5lc3Mgd2lsbCBiZSA0MCUgb2YgdGhlIHdheSBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBhbmQgMC4KKyAgICAjCisgICAgIyBUaGlzIGNhbiBjaGFuZ2UgdGhlIHJlZCwgZ3JlZW4sIGJsdWUsIHNhdHVyYXRpb24sIHZhbHVlLCBhbmQgYWxwaGEKKyAgICAjIHByb3BlcnRpZXMuIFRoZSBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgYXMga2V5d29yZCBhcmd1bWVudHMuIEFsbAorICAgICMgYXJndW1lbnRzIHNob3VsZCBiZSBwZXJjZW50YWdlcyBiZXR3ZWVuIGAwJWAgYW5kIGAxMDAlYC4KKyAgICAjCisgICAgIyBBbGwgcHJvcGVydGllcyBhcmUgb3B0aW9uYWwuIFlvdSBjYW4ndCBzcGVjaWZ5IGJvdGggUkdCIHByb3BlcnRpZXMKKyAgICAjIChgJHJlZGAsIGAkZ3JlZW5gLCBgJGJsdWVgKSBhbmQgSFNMIHByb3BlcnRpZXMgKGAkc2F0dXJhdGlvbmAsIGAkdmFsdWVgKQorICAgICMgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBzY2FsZS1jb2xvcihoc2woMTIwLCA3MCUsIDgwJSksICRsaWdodG5lc3M6IDUwJSkgPT4gaHNsKDEyMCwgNzAlLCA5MCUpCisgICAgIyAgIHNjYWxlLWNvbG9yKHJnYigyMDAsIDE1MCUsIDE3MCUpLCAkZ3JlZW46IC00MCUsICRibHVlOiA3MCUpID0+IHJnYigyMDAsIDkwLCAyMjkpCisgICAgIyAgIHNjYWxlLWNvbG9yKGhzbCgyMDAsIDcwJSwgODAlKSwgJHNhdHVyYXRpb246IC05MCUsICRhbHBoYTogLTMwJSkgPT4gaHNsYSgyMDAsIDclLCA4MCUsIDAuNykKKyAgICAjIEBvdmVybG9hZCBzY2FsZV9jb2xvcigkY29sb3IsIFskcmVkXSwgWyRncmVlbl0sIFskYmx1ZV0sIFskc2F0dXJhdGlvbl0sIFskbGlnaHRuZXNzXSwgWyRhbHBoYV0pCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgICBAcGFyYW0gJHJlZCBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgICBAcGFyYW0gJGdyZWVuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdCisgICAgIyAgIEBwYXJhbSAkYmx1ZSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgICBAcGFyYW0gJHNhdHVyYXRpb24gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0KKyAgICAjICAgQHBhcmFtICRsaWdodG5lc3MgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0KKyAgICAjICAgQHBhcmFtICRhbHBoYSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGFueSBwYXJhbWV0ZXIgaXMgdGhlIHdyb25nIHR5cGUgb3Igb3V0LW9mCisgICAgIyAgIGJvdW5kcywgb3IgaWYgUkdCIHByb3BlcnRpZXMgYW5kIEhTTCBwcm9wZXJ0aWVzIGFyZSBhZGp1c3RlZCBhdCB0aGUKKyAgICAjICAgc2FtZSB0aW1lCisgICAgZGVmIHNjYWxlX2NvbG9yKGNvbG9yLCBrd2FyZ3MpCisgICAgICBhc3NlcnRfdHlwZSBjb2xvciwgOkNvbG9yLCA6Y29sb3IKKyAgICAgIHdpdGggPSBTYXNzOjpVdGlsLm1hcF9oYXNoKAorICAgICAgICAicmVkIiA9PiAyNTUsCisgICAgICAgICJncmVlbiIgPT4gMjU1LAorICAgICAgICAiYmx1ZSIgPT4gMjU1LAorICAgICAgICAic2F0dXJhdGlvbiIgPT4gMTAwLAorICAgICAgICAibGlnaHRuZXNzIiA9PiAxMDAsCisgICAgICAgICJhbHBoYSIgPT4gMQorICAgICAgKSBkbyB8bmFtZSwgbWF4fAorICAgICAgICB2YWwgPSBrd2FyZ3MuZGVsZXRlKG5hbWUpCisgICAgICAgIG5leHQgdW5sZXNzIHZhbAorICAgICAgICBhc3NlcnRfdHlwZSB2YWwsIDpOdW1iZXIsIG5hbWUKKyAgICAgICAgYXNzZXJ0X3VuaXQgdmFsLCAnJScsIG5hbWUKKyAgICAgICAgU2Fzczo6VXRpbC5jaGVja19yYW5nZSgiJCN7bmFtZX06IEFtb3VudCIsIC0xMDAuLjEwMCwgdmFsLCAnJScpCisKKyAgICAgICAgY3VycmVudCA9IGNvbG9yLnNlbmQobmFtZSkKKyAgICAgICAgc2NhbGUgPSB2YWwudmFsdWUgLyAxMDAuMAorICAgICAgICBkaWZmID0gc2NhbGUgPiAwID8gbWF4IC0gY3VycmVudCA6IGN1cnJlbnQKKyAgICAgICAgW25hbWUudG9fc3ltLCBjdXJyZW50ICsgZGlmZiAqIHNjYWxlXQorICAgICAgZW5kCisKKyAgICAgIHVubGVzcyBrd2FyZ3MuZW1wdHk/CisgICAgICAgIG5hbWUsIHZhbCA9IGt3YXJncy50b19hLmZpcnN0CisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJVbmtub3duIGFyZ3VtZW50ICQje25hbWV9ICgje3ZhbH0pIikKKyAgICAgIGVuZAorCisgICAgICBjb2xvci53aXRoKHdpdGgpCisgICAgZW5kCisgICAgZGVjbGFyZSA6c2NhbGVfY29sb3IsIFs6Y29sb3JdLCA6dmFyX2t3YXJncyA9PiB0cnVlCisKKyAgICAjIENoYW5nZXMgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvZiBhIGNvbG9yLiBUaGlzIGNhbiBjaGFuZ2UgdGhlIHJlZCwgZ3JlZW4sCisgICAgIyBibHVlLCBodWUsIHNhdHVyYXRpb24sIHZhbHVlLCBhbmQgYWxwaGEgcHJvcGVydGllcy4gVGhlIHByb3BlcnRpZXMgYXJlCisgICAgIyBzcGVjaWZpZWQgYXMga2V5d29yZCBhcmd1bWVudHMsIGFuZCByZXBsYWNlIHRoZSBjb2xvcidzIGN1cnJlbnQgdmFsdWUgZm9yCisgICAgIyB0aGF0IHByb3BlcnR5LgorICAgICMKKyAgICAjIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbC4gWW91IGNhbid0IHNwZWNpZnkgYm90aCBSR0IgcHJvcGVydGllcworICAgICMgKGAkcmVkYCwgYCRncmVlbmAsIGAkYmx1ZWApIGFuZCBIU0wgcHJvcGVydGllcyAoYCRodWVgLCBgJHNhdHVyYXRpb25gLAorICAgICMgYCR2YWx1ZWApIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgY2hhbmdlLWNvbG9yKCMxMDIwMzAsICRibHVlOiA1KSA9PiAjMTAyMDA1CisgICAgIyAgIGNoYW5nZS1jb2xvcigjMTAyMDMwLCAkcmVkOiAxMjAsICRibHVlOiA1KSA9PiAjNzgyMDA1CisgICAgIyAgIGNoYW5nZS1jb2xvcihoc2woMjUsIDEwMCUsIDgwJSksICRsaWdodG5lc3M6IDQwJSwgJGFscGhhOiAwLjgpID0+IGhzbGEoMjUsIDEwMCUsIDQwJSwgMC44KQorICAgICMgQG92ZXJsb2FkIGNoYW5nZV9jb2xvcigkY29sb3IsIFskcmVkXSwgWyRncmVlbl0sIFskYmx1ZV0sIFskaHVlXSwgWyRzYXR1cmF0aW9uXSwgWyRsaWdodG5lc3NdLCBbJGFscGhhXSkKKyAgICAjICAgQHBhcmFtICRjb2xvciBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyAgIEBwYXJhbSAkcmVkIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBuZXcgcmVkIGNvbXBvbmVudCBmb3IgdGhlCisgICAgIyAgICAgY29sb3IsIHdpdGhpbiAwIGFuZCAyNTUgaW5jbHVzaXZlCisgICAgIyAgIEBwYXJhbSAkZ3JlZW4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIG5ldyBncmVlbiBjb21wb25lbnQgZm9yCisgICAgIyAgICAgdGhlIGNvbG9yLCB3aXRoaW4gMCBhbmQgMjU1IGluY2x1c2l2ZQorICAgICMgICBAcGFyYW0gJGJsdWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIG5ldyBibHVlIGNvbXBvbmVudCBmb3IgdGhlCisgICAgIyAgICAgY29sb3IsIHdpdGhpbiAwIGFuZCAyNTUgaW5jbHVzaXZlCisgICAgIyAgIEBwYXJhbSAkaHVlIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBuZXcgaHVlIGNvbXBvbmVudCBmb3IgdGhlCisgICAgIyAgICAgY29sb3IsIGluIGRlZ3JlZXMKKyAgICAjICAgQHBhcmFtICRzYXR1cmF0aW9uIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBuZXcgc2F0dXJhdGlvbgorICAgICMgICAgIGNvbXBvbmVudCBmb3IgdGhlIGNvbG9yLCBiZXR3ZWVuIGAwJWAgYW5kIGAxMDAlYCBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRsaWdodG5lc3MgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIG5ldyBsaWdodG5lc3MKKyAgICAjICAgICBjb21wb25lbnQgZm9yIHRoZSBjb2xvciwgd2l0aGluIGAwJWAgYW5kIGAxMDAlYCBpbmNsdXNpdmUKKyAgICAjICAgQHBhcmFtICRhbHBoYSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgbmV3IGFscGhhIGNvbXBvbmVudCBmb3IKKyAgICAjICAgICB0aGUgY29sb3IsIHdpdGhpbiAwIGFuZCAxIGluY2x1c2l2ZQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGFueSBwYXJhbWV0ZXIgaXMgdGhlIHdyb25nIHR5cGUgb3Igb3V0LW9mCisgICAgIyAgIGJvdW5kcywgb3IgaWYgUkdCIHByb3BlcnRpZXMgYW5kIEhTTCBwcm9wZXJ0aWVzIGFyZSBhZGp1c3RlZCBhdCB0aGUKKyAgICAjICAgc2FtZSB0aW1lCisgICAgZGVmIGNoYW5nZV9jb2xvcihjb2xvciwga3dhcmdzKQorICAgICAgYXNzZXJ0X3R5cGUgY29sb3IsIDpDb2xvciwgOmNvbG9yCisgICAgICB3aXRoID0gU2Fzczo6VXRpbC5tYXBfaGFzaCgKKyAgICAgICAgJ3JlZCcgPT4gWydSZWQgdmFsdWUnLCAwLi4yNTVdLAorICAgICAgICAnZ3JlZW4nID0+IFsnR3JlZW4gdmFsdWUnLCAwLi4yNTVdLAorICAgICAgICAnYmx1ZScgPT4gWydCbHVlIHZhbHVlJywgMC4uMjU1XSwKKyAgICAgICAgJ2h1ZScgPT4gW10sCisgICAgICAgICdzYXR1cmF0aW9uJyA9PiBbJ1NhdHVyYXRpb24nLCAwLi4xMDAsICclJ10sCisgICAgICAgICdsaWdodG5lc3MnID0+IFsnTGlnaHRuZXNzJywgMC4uMTAwLCAnJSddLAorICAgICAgICAnYWxwaGEnID0+IFsnQWxwaGEgY2hhbm5lbCcsIDAuLjFdCisgICAgICApIGRvIHxuYW1lLCAoZGVzYywgcmFuZ2UsIHVuaXQpfAorICAgICAgICB2YWwgPSBrd2FyZ3MuZGVsZXRlKG5hbWUpCisgICAgICAgIG5leHQgdW5sZXNzIHZhbAorICAgICAgICBhc3NlcnRfdHlwZSB2YWwsIDpOdW1iZXIsIG5hbWUKKworICAgICAgICBpZiByYW5nZQorICAgICAgICAgIHZhbCA9IFNhc3M6OlV0aWwuY2hlY2tfcmFuZ2UoZGVzYywgcmFuZ2UsIHZhbCwgdW5pdCkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbCA9IHZhbC52YWx1ZQorICAgICAgICBlbmQKKworICAgICAgICBbbmFtZS50b19zeW0sIHZhbF0KKyAgICAgIGVuZAorCisgICAgICB1bmxlc3Mga3dhcmdzLmVtcHR5PworICAgICAgICBuYW1lLCB2YWwgPSBrd2FyZ3MudG9fYS5maXJzdAorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiVW5rbm93biBhcmd1bWVudCAkI3tuYW1lfSAoI3t2YWx9KSIpCisgICAgICBlbmQKKworICAgICAgY29sb3Iud2l0aCh3aXRoKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmNoYW5nZV9jb2xvciwgWzpjb2xvcl0sIDp2YXJfa3dhcmdzID0+IHRydWUKKworICAgICMgTWl4ZXMgdHdvIGNvbG9ycyB0b2dldGhlci4gU3BlY2lmaWNhbGx5LCB0YWtlcyB0aGUgYXZlcmFnZSBvZiBlYWNoIG9mIHRoZQorICAgICMgUkdCIGNvbXBvbmVudHMsIG9wdGlvbmFsbHkgd2VpZ2h0ZWQgYnkgdGhlIGdpdmVuIHBlcmNlbnRhZ2UuIFRoZSBvcGFjaXR5CisgICAgIyBvZiB0aGUgY29sb3JzIGlzIGFsc28gY29uc2lkZXJlZCB3aGVuIHdlaWdodGluZyB0aGUgY29tcG9uZW50cy4KKyAgICAjCisgICAgIyBUaGUgd2VpZ2h0IHNwZWNpZmllcyB0aGUgYW1vdW50IG9mIHRoZSBmaXJzdCBjb2xvciB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZAorICAgICMgaW4gdGhlIHJldHVybmVkIGNvbG9yLiBUaGUgZGVmYXVsdCwgYDUwJWAsIG1lYW5zIHRoYXQgaGFsZiB0aGUgZmlyc3QgY29sb3IKKyAgICAjIGFuZCBoYWxmIHRoZSBzZWNvbmQgY29sb3Igc2hvdWxkIGJlIHVzZWQuIGAyNSVgIG1lYW5zIHRoYXQgYSBxdWFydGVyIG9mCisgICAgIyB0aGUgZmlyc3QgY29sb3IgYW5kIHRocmVlIHF1YXJ0ZXJzIG9mIHRoZSBzZWNvbmQgY29sb3Igc2hvdWxkIGJlIHVzZWQuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbWl4KCNmMDAsICMwMGYpID0+ICM3ZjAwN2YKKyAgICAjICAgbWl4KCNmMDAsICMwMGYsIDI1JSkgPT4gIzNmMDBiZgorICAgICMgICBtaXgocmdiYSgyNTUsIDAsIDAsIDAuNSksICMwMGYpID0+IHJnYmEoNjMsIDAsIDE5MSwgMC43NSkKKyAgICAjIEBvdmVybG9hZCBtaXgoJGNvbG9yMSwgJGNvbG9yMiwgJHdlaWdodDogNTAlKQorICAgICMgICBAcGFyYW0gJGNvbG9yMSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyAgIEBwYXJhbSAkY29sb3IyIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjICAgQHBhcmFtICR3ZWlnaHQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIHJlbGF0aXZlIHdlaWdodCBvZiBlYWNoCisgICAgIyAgICAgY29sb3IuIENsb3NlciB0byBgMTAwJWAgZ2l2ZXMgbW9yZSB3ZWlnaHQgdG8gYCRjb2xvcjFgLCBjbG9zZXIgdG8gYDAlYAorICAgICMgICAgIGdpdmVzIG1vcmUgd2VpZ2h0IHRvIGAkY29sb3IyYAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkd2VpZ2h0YCBpcyBvdXQgb2YgYm91bmRzIG9yIGFueSBwYXJhbWV0ZXIgaXMKKyAgICAjICAgdGhlIHdyb25nIHR5cGUKKyAgICBkZWYgbWl4KGNvbG9yMSwgY29sb3IyLCB3ZWlnaHQgPSBudW1iZXIoNTApKQorICAgICAgYXNzZXJ0X3R5cGUgY29sb3IxLCA6Q29sb3IsIDpjb2xvcjEKKyAgICAgIGFzc2VydF90eXBlIGNvbG9yMiwgOkNvbG9yLCA6Y29sb3IyCisgICAgICBhc3NlcnRfdHlwZSB3ZWlnaHQsIDpOdW1iZXIsIDp3ZWlnaHQKKworICAgICAgU2Fzczo6VXRpbC5jaGVja19yYW5nZSgiV2VpZ2h0IiwgMC4uMTAwLCB3ZWlnaHQsICclJykKKworICAgICAgIyBUaGlzIGFsZ29yaXRobSBmYWN0b3JzIGluIGJvdGggdGhlIHVzZXItcHJvdmlkZWQgd2VpZ2h0ICh3KSBhbmQgdGhlCisgICAgICAjIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWxwaGEgdmFsdWVzIG9mIHRoZSB0d28gY29sb3JzIChhKSB0byBkZWNpZGUgaG93CisgICAgICAjIHRvIHBlcmZvcm0gdGhlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIHR3byBSR0IgdmFsdWVzLgorICAgICAgIworICAgICAgIyBJdCB3b3JrcyBieSBmaXJzdCBub3JtYWxpemluZyBib3RoIHBhcmFtZXRlcnMgdG8gYmUgd2l0aGluIFstMSwgMV0sCisgICAgICAjIHdoZXJlIDEgaW5kaWNhdGVzICJvbmx5IHVzZSBjb2xvcjEiLCAtMSBpbmRpY2F0ZXMgIm9ubHkgdXNlIGNvbG9yMiIsIGFuZAorICAgICAgIyBhbGwgdmFsdWVzIGluIGJldHdlZW4gaW5kaWNhdGVkIGEgcHJvcG9ydGlvbmF0ZWx5IHdlaWdodGVkIGF2ZXJhZ2UuCisgICAgICAjCisgICAgICAjIE9uY2Ugd2UgaGF2ZSB0aGUgbm9ybWFsaXplZCB2YXJpYWJsZXMgdyBhbmQgYSwgd2UgYXBwbHkgdGhlIGZvcm11bGEKKyAgICAgICMgKHcgKyBhKS8oMSArIHcqYSkgdG8gZ2V0IHRoZSBjb21iaW5lZCB3ZWlnaHQgKGluIFstMSwgMV0pIG9mIGNvbG9yMS4KKyAgICAgICMgVGhpcyBmb3JtdWxhIGhhcyB0d28gZXNwZWNpYWxseSBuaWNlIHByb3BlcnRpZXM6CisgICAgICAjCisgICAgICAjICAgKiBXaGVuIGVpdGhlciB3IG9yIGEgYXJlIC0xIG9yIDEsIHRoZSBjb21iaW5lZCB3ZWlnaHQgaXMgYWxzbyB0aGF0IG51bWJlcgorICAgICAgIyAgICAgKGNhc2VzIHdoZXJlIHcgKiBhID09IC0xIGFyZSB1bmRlZmluZWQsIGFuZCBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlKS4KKyAgICAgICMKKyAgICAgICMgICAqIFdoZW4gYSBpcyAwLCB0aGUgY29tYmluZWQgd2VpZ2h0IGlzIHcsIGFuZCB2aWNlIHZlcnNhLgorICAgICAgIworICAgICAgIyBGaW5hbGx5LCB0aGUgd2VpZ2h0IG9mIGNvbG9yMSBpcyByZW5vcm1hbGl6ZWQgdG8gYmUgd2l0aGluIFswLCAxXQorICAgICAgIyBhbmQgdGhlIHdlaWdodCBvZiBjb2xvcjIgaXMgZ2l2ZW4gYnkgMSBtaW51cyB0aGUgd2VpZ2h0IG9mIGNvbG9yMS4KKyAgICAgIHAgPSAod2VpZ2h0LnZhbHVlIC8gMTAwLjApLnRvX2YKKyAgICAgIHcgPSBwICogMiAtIDEKKyAgICAgIGEgPSBjb2xvcjEuYWxwaGEgLSBjb2xvcjIuYWxwaGEKKworICAgICAgdzEgPSAoKHcgKiBhID09IC0xID8gdyA6ICh3ICsgYSkgLyAoMSArIHcgKiBhKSkgKyAxKSAvIDIuMAorICAgICAgdzIgPSAxIC0gdzEKKworICAgICAgcmdiYSA9IGNvbG9yMS5yZ2IuemlwKGNvbG9yMi5yZ2IpLm1hcCB7fHYxLCB2MnwgdjEgKiB3MSArIHYyICogdzJ9CisgICAgICByZ2JhIDw8IGNvbG9yMS5hbHBoYSAqIHAgKyBjb2xvcjIuYWxwaGEgKiAoMSAtIHApCisgICAgICByZ2JfY29sb3IoKnJnYmEpCisgICAgZW5kCisgICAgZGVjbGFyZSA6bWl4LCBbOmNvbG9yMSwgOmNvbG9yMl0KKyAgICBkZWNsYXJlIDptaXgsIFs6Y29sb3IxLCA6Y29sb3IyLCA6d2VpZ2h0XQorCisgICAgIyBDb252ZXJ0cyBhIGNvbG9yIHRvIGdyYXlzY2FsZS4gVGhpcyBpcyBpZGVudGljYWwgdG8gYGRlc2F0dXJhdGUoY29sb3IsCisgICAgIyAxMDAlKWAuCisgICAgIworICAgICMgQHNlZSAjZGVzYXR1cmF0ZQorICAgICMgQG92ZXJsb2FkIGdyYXlzY2FsZSgkY29sb3IpCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkY29sb3JgIGlzbid0IGEgY29sb3IKKyAgICBkZWYgZ3JheXNjYWxlKGNvbG9yKQorICAgICAgaWYgY29sb3IuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKQorICAgICAgICByZXR1cm4gaWRlbnRpZmllcigiZ3JheXNjYWxlKCN7Y29sb3J9KSIpCisgICAgICBlbmQKKyAgICAgIGRlc2F0dXJhdGUgY29sb3IsIG51bWJlcigxMDApCisgICAgZW5kCisgICAgZGVjbGFyZSA6Z3JheXNjYWxlLCBbOmNvbG9yXQorCisgICAgIyBSZXR1cm5zIHRoZSBjb21wbGVtZW50IG9mIGEgY29sb3IuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGBhZGp1c3QtaHVlKGNvbG9yLAorICAgICMgMTgwZGVnKWAuCisgICAgIworICAgICMgQHNlZSAjYWRqdXN0X2h1ZSAjYWRqdXN0LWh1ZQorICAgICMgQG92ZXJsb2FkIGNvbXBsZW1lbnQoJGNvbG9yKQorICAgICMgICBAcGFyYW0gJGNvbG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcl0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJGNvbG9yYCBpc24ndCBhIGNvbG9yCisgICAgZGVmIGNvbXBsZW1lbnQoY29sb3IpCisgICAgICBhZGp1c3RfaHVlIGNvbG9yLCBudW1iZXIoMTgwKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmNvbXBsZW1lbnQsIFs6Y29sb3JdCisKKyAgICAjIFJldHVybnMgdGhlIGludmVyc2UgKG5lZ2F0aXZlKSBvZiBhIGNvbG9yLiBUaGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgdmFsdWVzCisgICAgIyBhcmUgaW52ZXJ0ZWQsIHdoaWxlIHRoZSBvcGFjaXR5IGlzIGxlZnQgYWxvbmUuCisgICAgIworICAgICMgQG92ZXJsb2FkIGludmVydCgkY29sb3IpCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgQG92ZXJsb2FkIGludmVydCgkY29sb3IsICR3ZWlnaHQ6IDEwMCUpCisgICAgIyAgIEBwYXJhbSAkY29sb3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXQorICAgICMgICBAcGFyYW0gJHdlaWdodCBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgcmVsYXRpdmUgd2VpZ2h0IG9mIHRoZQorICAgICMgICAgIGNvbG9yIGNvbG9yJ3MgaW52ZXJzZQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkY29sb3JgIGlzbid0IGEgY29sb3Igb3IgYCR3ZWlnaHRgCisgICAgIyAgIGlzbid0IGEgcGVyY2VudGFnZSBiZXR3ZWVuIDAlIGFuZCAxMDAlCisgICAgZGVmIGludmVydChjb2xvciwgd2VpZ2h0ID0gbnVtYmVyKDEwMCkpCisgICAgICBpZiBjb2xvci5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIpCisgICAgICAgIHJldHVybiBpZGVudGlmaWVyKCJpbnZlcnQoI3tjb2xvcn0pIikKKyAgICAgIGVuZAorCisgICAgICBhc3NlcnRfdHlwZSBjb2xvciwgOkNvbG9yLCA6Y29sb3IKKyAgICAgIGludiA9IGNvbG9yLndpdGgoCisgICAgICAgIDpyZWQgPT4gKDI1NSAtIGNvbG9yLnJlZCksCisgICAgICAgIDpncmVlbiA9PiAoMjU1IC0gY29sb3IuZ3JlZW4pLAorICAgICAgICA6Ymx1ZSA9PiAoMjU1IC0gY29sb3IuYmx1ZSkpCisKKyAgICAgIG1peChpbnYsIGNvbG9yLCB3ZWlnaHQpCisgICAgZW5kCisgICAgZGVjbGFyZSA6aW52ZXJ0LCBbOmNvbG9yXQorICAgIGRlY2xhcmUgOmludmVydCwgWzpjb2xvciwgOndlaWdodF0KKworICAgICMgUmVtb3ZlcyBxdW90ZXMgZnJvbSBhIHN0cmluZy4gSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHVucXVvdGVkLCB0aGlzIHdpbGwKKyAgICAjIHJldHVybiBpdCB1bm1vZGlmaWVkLgorICAgICMKKyAgICAjIEBzZWUgI3F1b3RlCisgICAgIyBAZXhhbXBsZQorICAgICMgICB1bnF1b3RlKCJmb28iKSA9PiBmb28KKyAgICAjICAgdW5xdW90ZShmb28pID0+IGZvbworICAgICMgQG92ZXJsb2FkIHVucXVvdGUoJHN0cmluZykKKyAgICAjICAgQHBhcmFtICRzdHJpbmcgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRzdHJpbmdgIGlzbid0IGEgc3RyaW5nCisgICAgZGVmIHVucXVvdGUoc3RyaW5nKQorICAgICAgdW5sZXNzIHN0cmluZy5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpCisgICAgICAgICMgRG9uJ3Qgd2FybiBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgc291cmNlIGxpbmUuCisgICAgICAgICMgcnVib2NvcDpkaXNhYmxlIEdsb2JhbFZhcnMKKyAgICAgICAgJF9zYXNzX3dhcm5lZF9mb3JfdW5xdW90ZSB8fD0gU2V0Lm5ldworICAgICAgICBmcmFtZSA9IGVudmlyb25tZW50LnN0YWNrLmZyYW1lcy5sYXN0CisgICAgICAgIGtleSA9IFtmcmFtZS5maWxlbmFtZSwgZnJhbWUubGluZV0gaWYgZnJhbWUKKyAgICAgICAgcmV0dXJuIHN0cmluZyBpZiBmcmFtZSAmJiAkX3Nhc3Nfd2FybmVkX2Zvcl91bnF1b3RlLmluY2x1ZGU/KGtleSkKKyAgICAgICAgJF9zYXNzX3dhcm5lZF9mb3JfdW5xdW90ZSA8PCBrZXkgaWYgZnJhbWUKKyAgICAgICAgIyBydWJvY29wOmVuYWJsZSBHbG9iYWxWYXJzCisKKyAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4oPDxNRVNTQUdFLnN0cmlwKQorREVQUkVDQVRJT04gV0FSTklORzogUGFzc2luZyAje3N0cmluZy50b19zYXNzfSwgYSBub24tc3RyaW5nIHZhbHVlLCB0byB1bnF1b3RlKCkKK3dpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuCisje2Vudmlyb25tZW50LnN0YWNrLnRvX3MuZ3N1YigvXi8sICcgJyAqIDgpfQorTUVTU0FHRQorICAgICAgICByZXR1cm4gc3RyaW5nCisgICAgICBlbmQKKworICAgICAgc3RyaW5nLmNoZWNrX2RlcHJlY2F0ZWRfaW50ZXJwCisgICAgICByZXR1cm4gc3RyaW5nIGlmIHN0cmluZy50eXBlID09IDppZGVudGlmaWVyCisgICAgICBpZGVudGlmaWVyKHN0cmluZy52YWx1ZSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDp1bnF1b3RlLCBbOnN0cmluZ10KKworICAgICMgQWRkIHF1b3RlcyB0byBhIHN0cmluZyBpZiB0aGUgc3RyaW5nIGlzbid0IHF1b3RlZCwKKyAgICAjIG9yIHJldHVybnMgdGhlIHNhbWUgc3RyaW5nIGlmIGl0IGlzLgorICAgICMKKyAgICAjIEBzZWUgI3VucXVvdGUKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHF1b3RlKCJmb28iKSA9PiAiZm9vIgorICAgICMgICBxdW90ZShmb28pID0+ICJmb28iCisgICAgIyBAb3ZlcmxvYWQgcXVvdGUoJHN0cmluZykKKyAgICAjICAgQHBhcmFtICRzdHJpbmcgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRzdHJpbmdgIGlzbid0IGEgc3RyaW5nCisgICAgZGVmIHF1b3RlKHN0cmluZykKKyAgICAgIGFzc2VydF90eXBlIHN0cmluZywgOlN0cmluZywgOnN0cmluZworICAgICAgaWYgc3RyaW5nLnR5cGUgIT0gOnN0cmluZworICAgICAgICBxdW90ZWRfc3RyaW5nKHN0cmluZy52YWx1ZSkKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyaW5nCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpxdW90ZSwgWzpzdHJpbmddCisKKyAgICAjIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHN0ci1sZW5ndGgoImZvbyIpID0+IDMKKyAgICAjIEBvdmVybG9hZCBzdHJfbGVuZ3RoKCRzdHJpbmcpCisgICAgIyAgIEBwYXJhbSAkc3RyaW5nIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkc3RyaW5nYCBpc24ndCBhIHN0cmluZworICAgIGRlZiBzdHJfbGVuZ3RoKHN0cmluZykKKyAgICAgIGFzc2VydF90eXBlIHN0cmluZywgOlN0cmluZywgOnN0cmluZworICAgICAgbnVtYmVyKHN0cmluZy52YWx1ZS5zaXplKQorICAgIGVuZAorICAgIGRlY2xhcmUgOnN0cl9sZW5ndGgsIFs6c3RyaW5nXQorCisgICAgIyBJbnNlcnRzIGAkaW5zZXJ0YCBpbnRvIGAkc3RyaW5nYCBhdCBgJGluZGV4YC4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgdW5saWtlIHNvbWUgbGFuZ3VhZ2VzLCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIGEgU2FzcyBzdHJpbmcgaXMKKyAgICAjIG51bWJlciAxLCB0aGUgc2Vjb25kIG51bWJlciAyLCBhbmQgc28gZm9ydGguCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgc3RyLWluc2VydCgiYWJjZCIsICJYIiwgMSkgPT4gIlhhYmNkIgorICAgICMgICBzdHItaW5zZXJ0KCJhYmNkIiwgIlgiLCA0KSA9PiAiYWJjWGQiCisgICAgIyAgIHN0ci1pbnNlcnQoImFiY2QiLCAiWCIsIDUpID0+ICJhYmNkWCIKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgc3RyX2luc2VydCgkc3RyaW5nLCAkaW5zZXJ0LCAkaW5kZXgpCisgICAgIyAgIEBwYXJhbSAkc3RyaW5nIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddCisgICAgIyAgIEBwYXJhbSAkaW5zZXJ0IFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddCisgICAgIyAgIEBwYXJhbSAkaW5kZXggW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIHBvc2l0aW9uIGF0IHdoaWNoCisgICAgIyAgICAgYCRpbnNlcnRgIHdpbGwgYmUgaW5zZXJ0ZWQuIE5lZ2F0aXZlIGluZGljZXMgY291bnQgZnJvbSB0aGUgZW5kIG9mCisgICAgIyAgICAgYCRzdHJpbmdgLiBBbiBpbmRleCB0aGF0J3Mgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBzdHJpbmcgd2lsbCBpbnNlcnQKKyAgICAjICAgICBgJGluc2VydGAgYXQgdGhlIGZyb250IG9yIGJhY2sgb2YgdGhlIHN0cmluZworICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXSBUaGUgcmVzdWx0IHN0cmluZy4gVGhpcyB3aWxsIGJlCisgICAgIyAgIHF1b3RlZCBpZiBhbmQgb25seSBpZiBgJHN0cmluZ2Agd2FzIHF1b3RlZAorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBhbnkgcGFyYW1ldGVyIGlzIHRoZSB3cm9uZyB0eXBlCisgICAgZGVmIHN0cl9pbnNlcnQob3JpZ2luYWwsIGluc2VydCwgaW5kZXgpCisgICAgICBhc3NlcnRfdHlwZSBvcmlnaW5hbCwgOlN0cmluZywgOnN0cmluZworICAgICAgYXNzZXJ0X3R5cGUgaW5zZXJ0LCA6U3RyaW5nLCA6aW5zZXJ0CisgICAgICBhc3NlcnRfaW50ZWdlciBpbmRleCwgOmluZGV4CisgICAgICBhc3NlcnRfdW5pdCBpbmRleCwgbmlsLCA6aW5kZXgKKyAgICAgIGluc2VydGlvbl9wb2ludCA9IGlmIGluZGV4LnRvX2kgPiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRleC50b19pIC0gMSwgb3JpZ2luYWwudmFsdWUuc2l6ZV0ubWluCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRleC50b19pLCAtb3JpZ2luYWwudmFsdWUuc2l6ZSAtIDFdLm1heAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICByZXN1bHQgPSBvcmlnaW5hbC52YWx1ZS5kdXAuaW5zZXJ0KGluc2VydGlvbl9wb2ludCwgaW5zZXJ0LnZhbHVlKQorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldyhyZXN1bHQsIG9yaWdpbmFsLnR5cGUpCisgICAgZW5kCisgICAgZGVjbGFyZSA6c3RyX2luc2VydCwgWzpzdHJpbmcsIDppbnNlcnQsIDppbmRleF0KKworICAgICMgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYCRzdWJzdHJpbmdgIGluIGAkc3RyaW5nYC4gSWYKKyAgICAjIHRoZXJlIGlzIG5vIHN1Y2ggb2NjdXJyZW5jZSwgcmV0dXJucyBgbnVsbGAuCisgICAgIworICAgICMgTm90ZSB0aGF0IHVubGlrZSBzb21lIGxhbmd1YWdlcywgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBhIFNhc3Mgc3RyaW5nIGlzCisgICAgIyBudW1iZXIgMSwgdGhlIHNlY29uZCBudW1iZXIgMiwgYW5kIHNvIGZvcnRoLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHN0ci1pbmRleChhYmNkLCBhKSAgPT4gMQorICAgICMgICBzdHItaW5kZXgoYWJjZCwgYWIpID0+IDEKKyAgICAjICAgc3RyLWluZGV4KGFiY2QsIFgpICA9PiBudWxsCisgICAgIyAgIHN0ci1pbmRleChhYmNkLCBjKSAgPT4gMworICAgICMKKyAgICAjIEBvdmVybG9hZCBzdHJfaW5kZXgoJHN0cmluZywgJHN1YnN0cmluZykKKyAgICAjICAgQHBhcmFtICRzdHJpbmcgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICAjICAgQHBhcmFtICRzdWJzdHJpbmcgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlciwgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVsbF0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYW55IHBhcmFtZXRlciBpcyB0aGUgd3JvbmcgdHlwZQorICAgIGRlZiBzdHJfaW5kZXgoc3RyaW5nLCBzdWJzdHJpbmcpCisgICAgICBhc3NlcnRfdHlwZSBzdHJpbmcsIDpTdHJpbmcsIDpzdHJpbmcKKyAgICAgIGFzc2VydF90eXBlIHN1YnN0cmluZywgOlN0cmluZywgOnN1YnN0cmluZworICAgICAgaW5kZXggPSBzdHJpbmcudmFsdWUuaW5kZXgoc3Vic3RyaW5nLnZhbHVlKQorICAgICAgaW5kZXggPyBudW1iZXIoaW5kZXggKyAxKSA6IG51bGwKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpzdHJfaW5kZXgsIFs6c3RyaW5nLCA6c3Vic3RyaW5nXQorCisgICAgIyBFeHRyYWN0cyBhIHN1YnN0cmluZyBmcm9tIGAkc3RyaW5nYC4gVGhlIHN1YnN0cmluZyB3aWxsIGJlZ2luIGF0IGluZGV4CisgICAgIyBgJHN0YXJ0LWF0YCBhbmQgZW5kcyBhdCBpbmRleCBgJGVuZC1hdGAuCisgICAgIworICAgICMgTm90ZSB0aGF0IHVubGlrZSBzb21lIGxhbmd1YWdlcywgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBhIFNhc3Mgc3RyaW5nIGlzCisgICAgIyBudW1iZXIgMSwgdGhlIHNlY29uZCBudW1iZXIgMiwgYW5kIHNvIGZvcnRoLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgc3RyLXNsaWNlKCJhYmNkIiwgMiwgMykgICA9PiAiYmMiCisgICAgIyAgc3RyLXNsaWNlKCJhYmNkIiwgMikgICAgICA9PiAiYmNkIgorICAgICMgIHN0ci1zbGljZSgiYWJjZCIsIC0zLCAtMikgPT4gImJjIgorICAgICMgIHN0ci1zbGljZSgiYWJjZCIsIDIsIC0yKSAgPT4gImJjIgorICAgICMKKyAgICAjIEBvdmVybG9hZCBzdHJfc2xpY2UoJHN0cmluZywgJHN0YXJ0LWF0LCAkZW5kLWF0OiAtMSkKKyAgICAjICAgQHBhcmFtICRzdGFydC1hdCBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgaW5kZXggb2YgdGhlIGZpcnN0CisgICAgIyAgICAgY2hhcmFjdGVyIG9mIHRoZSBzdWJzdHJpbmcuIElmIHRoaXMgaXMgbmVnYXRpdmUsIGl0IGNvdW50cyBmcm9tIHRoZSBlbmQKKyAgICAjICAgICBvZiBgJHN0cmluZ2AKKyAgICAjICAgQHBhcmFtICRlbmQtYXQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGluZGV4IG9mIHRoZSBsYXN0CisgICAgIyAgICAgY2hhcmFjdGVyIG9mIHRoZSBzdWJzdHJpbmcuIElmIHRoaXMgaXMgbmVnYXRpdmUsIGl0IGNvdW50cyBmcm9tIHRoZSBlbmQKKyAgICAjICAgICBvZiBgJHN0cmluZ2AuIERlZmF1bHRzIHRvIC0xCisgICAgIyAgIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10gVGhlIHN1YnN0cmluZy4gVGhpcyB3aWxsIGJlIHF1b3RlZAorICAgICMgICAgIGlmIGFuZCBvbmx5IGlmIGAkc3RyaW5nYCB3YXMgcXVvdGVkCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGFueSBwYXJhbWV0ZXIgaXMgdGhlIHdyb25nIHR5cGUKKyAgICBkZWYgc3RyX3NsaWNlKHN0cmluZywgc3RhcnRfYXQsIGVuZF9hdCA9IG5pbCkKKyAgICAgIGFzc2VydF90eXBlIHN0cmluZywgOlN0cmluZywgOnN0cmluZworICAgICAgYXNzZXJ0X3VuaXQgc3RhcnRfYXQsIG5pbCwgInN0YXJ0LWF0IgorCisgICAgICBlbmRfYXQgPSBudW1iZXIoLTEpIGlmIGVuZF9hdC5uaWw/CisgICAgICBhc3NlcnRfdW5pdCBlbmRfYXQsIG5pbCwgImVuZC1hdCIKKworICAgICAgcmV0dXJuIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIiIsIHN0cmluZy50eXBlKSBpZiBlbmRfYXQudmFsdWUgPT0gMAorICAgICAgcyA9IHN0YXJ0X2F0LnZhbHVlID4gMCA/IHN0YXJ0X2F0LnZhbHVlIC0gMSA6IHN0YXJ0X2F0LnZhbHVlCisgICAgICBlID0gZW5kX2F0LnZhbHVlID4gMCA/IGVuZF9hdC52YWx1ZSAtIDEgOiBlbmRfYXQudmFsdWUKKyAgICAgIHMgPSBzdHJpbmcudmFsdWUubGVuZ3RoICsgcyBpZiBzIDwgMAorICAgICAgcyA9IDAgaWYgcyA8IDAKKyAgICAgIGUgPSBzdHJpbmcudmFsdWUubGVuZ3RoICsgZSBpZiBlIDwgMAorICAgICAgcmV0dXJuIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIiIsIHN0cmluZy50eXBlKSBpZiBlIDwgMAorICAgICAgZXh0cmFjdGVkID0gc3RyaW5nLnZhbHVlLnNsaWNlKHMuLmUpCisgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KGV4dHJhY3RlZCB8fCAiIiwgc3RyaW5nLnR5cGUpCisgICAgZW5kCisgICAgZGVjbGFyZSA6c3RyX3NsaWNlLCBbOnN0cmluZywgOnN0YXJ0X2F0XQorICAgIGRlY2xhcmUgOnN0cl9zbGljZSwgWzpzdHJpbmcsIDpzdGFydF9hdCwgOmVuZF9hdF0KKworICAgICMgQ29udmVydHMgYSBzdHJpbmcgdG8gdXBwZXIgY2FzZS4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICB0by11cHBlci1jYXNlKGFiY2QpID0+IEFCQ0QKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgdG9fdXBwZXJfY2FzZSgkc3RyaW5nKQorICAgICMgICBAcGFyYW0gJHN0cmluZyBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJHN0cmluZ2AgaXNuJ3QgYSBzdHJpbmcKKyAgICBkZWYgdG9fdXBwZXJfY2FzZShzdHJpbmcpCisgICAgICBhc3NlcnRfdHlwZSBzdHJpbmcsIDpTdHJpbmcsIDpzdHJpbmcKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoU2Fzczo6VXRpbC51cGNhc2Uoc3RyaW5nLnZhbHVlKSwgc3RyaW5nLnR5cGUpCisgICAgZW5kCisgICAgZGVjbGFyZSA6dG9fdXBwZXJfY2FzZSwgWzpzdHJpbmddCisKKyAgICAjIENvbnZlcnQgYSBzdHJpbmcgdG8gbG93ZXIgY2FzZSwKKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICB0by1sb3dlci1jYXNlKEFCQ0QpID0+IGFiY2QKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgdG9fbG93ZXJfY2FzZSgkc3RyaW5nKQorICAgICMgICBAcGFyYW0gJHN0cmluZyBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJHN0cmluZ2AgaXNuJ3QgYSBzdHJpbmcKKyAgICBkZWYgdG9fbG93ZXJfY2FzZShzdHJpbmcpCisgICAgICBhc3NlcnRfdHlwZSBzdHJpbmcsIDpTdHJpbmcsIDpzdHJpbmcKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoU2Fzczo6VXRpbC5kb3duY2FzZShzdHJpbmcudmFsdWUpLCBzdHJpbmcudHlwZSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDp0b19sb3dlcl9jYXNlLCBbOnN0cmluZ10KKworICAgICMgUmV0dXJucyB0aGUgdHlwZSBvZiBhIHZhbHVlLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHR5cGUtb2YoMTAwcHgpICA9PiBudW1iZXIKKyAgICAjICAgdHlwZS1vZihhc2RmKSAgID0+IHN0cmluZworICAgICMgICB0eXBlLW9mKCJhc2RmIikgPT4gc3RyaW5nCisgICAgIyAgIHR5cGUtb2YodHJ1ZSkgICA9PiBib29sCisgICAgIyAgIHR5cGUtb2YoI2ZmZikgICA9PiBjb2xvcgorICAgICMgICB0eXBlLW9mKGJsdWUpICAgPT4gY29sb3IKKyAgICAjICAgdHlwZS1vZihudWxsKSAgID0+IG51bGwKKyAgICAjICAgdHlwZS1vZihhIGIgYykgID0+IGxpc3QKKyAgICAjICAgdHlwZS1vZigoYTogMSwgYjogMikpID0+IG1hcAorICAgICMgICB0eXBlLW9mKGdldC1mdW5jdGlvbigiZm9vIikpID0+IGZ1bmN0aW9uCisgICAgIworICAgICMgQG92ZXJsb2FkIHR5cGVfb2YoJHZhbHVlKQorICAgICMgICBAcGFyYW0gJHZhbHVlIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXSBUaGUgdmFsdWUgdG8gaW5zcGVjdAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXSBUaGUgdW5xdW90ZWQgc3RyaW5nIG5hbWUgb2YgdGhlCisgICAgIyAgIHZhbHVlJ3MgdHlwZQorICAgIGRlZiB0eXBlX29mKHZhbHVlKQorICAgICAgdmFsdWUuY2hlY2tfZGVwcmVjYXRlZF9pbnRlcnAgaWYgdmFsdWUuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nKQorICAgICAgaWRlbnRpZmllcih2YWx1ZS5jbGFzcy5uYW1lLmdzdWIoL1Nhc3M6OlNjcmlwdDo6VmFsdWU6Oi8sICcnKS5kb3duY2FzZSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDp0eXBlX29mLCBbOnZhbHVlXQorCisgICAgIyBSZXR1cm5zIHdoZXRoZXIgYSBmZWF0dXJlIGV4aXN0cyBpbiB0aGUgY3VycmVudCBTYXNzIHJ1bnRpbWUuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICAgICMKKyAgICAjICogYGdsb2JhbC12YXJpYWJsZS1zaGFkb3dpbmdgIGluZGljYXRlcyB0aGF0IGEgbG9jYWwgdmFyaWFibGUgd2lsbCBzaGFkb3cKKyAgICAjICAgYSBnbG9iYWwgdmFyaWFibGUgdW5sZXNzIGAhZ2xvYmFsYCBpcyB1c2VkLgorICAgICMKKyAgICAjICogYGV4dGVuZC1zZWxlY3Rvci1wc2V1ZG9jbGFzc2AgaW5kaWNhdGVzIHRoYXQgYEBleHRlbmRgIHdpbGwgcmVhY2ggaW50bworICAgICMgICBzZWxlY3RvciBwc2V1ZG9jbGFzc2VzIGxpa2UgYDpub3RgLgorICAgICMKKyAgICAjICogYHVuaXRzLWxldmVsLTNgIGluZGljYXRlcyBmdWxsIHN1cHBvcnQgZm9yIHVuaXQgYXJpdGhtZXRpYyB1c2luZyB1bml0cworICAgICMgICBkZWZpbmVkIGluIHRoZSBbVmFsdWVzIGFuZCBVbml0cyBMZXZlbCAzXVtdIHNwZWMuCisgICAgIworICAgICMgW1ZhbHVlcyBhbmQgVW5pdHMgTGV2ZWwgM106IGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtdmFsdWVzLworICAgICMKKyAgICAjICogYGF0LWVycm9yYCBpbmRpY2F0ZXMgdGhhdCB0aGUgU2FzcyBgQGVycm9yYCBkaXJlY3RpdmUgaXMgc3VwcG9ydGVkLgorICAgICMKKyAgICAjICogYGN1c3RvbS1wcm9wZXJ0eWAgaW5kaWNhdGVzIHRoYXQgdGhlIFtDdXN0b20gUHJvcGVydGllcyBMZXZlbCAxXVtdIHNwZWMKKyAgICAjICAgaXMgc3VwcG9ydGVkLiBUaGlzIG1lYW5zIHRoYXQgY3VzdG9tIHByb3BlcnRpZXMgYXJlIHBhcnNlZCBzdGF0aWNhbGx5LAorICAgICMgICB3aXRoIG9ubHkgaW50ZXJwb2xhdGlvbiB0cmVhdGVkIGFzIFNhc3NTY3JpcHQuCisgICAgIworICAgICMgW0N1c3RvbSBQcm9wZXJ0aWVzIExldmVsIDFdOiBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXZhcmlhYmxlcy0xLworICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGZlYXR1cmUtZXhpc3RzKHNvbWUtZmVhdHVyZS10aGF0LWV4aXN0cykgPT4gdHJ1ZQorICAgICMgICBmZWF0dXJlLWV4aXN0cyh3aGF0LWlzLXRoaXMtaS1kb250LWtub3cpID0+IGZhbHNlCisgICAgIworICAgICMgQG92ZXJsb2FkIGZlYXR1cmVfZXhpc3RzKCRmZWF0dXJlKQorICAgICMgICBAcGFyYW0gJGZlYXR1cmUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10gVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2xdIFdoZXRoZXIgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiBvZiBTYXNzCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkZmVhdHVyZWAgaXNuJ3QgYSBzdHJpbmcKKyAgICBkZWYgZmVhdHVyZV9leGlzdHMoZmVhdHVyZSkKKyAgICAgIGFzc2VydF90eXBlIGZlYXR1cmUsIDpTdHJpbmcsIDpmZWF0dXJlCisgICAgICBib29sKFNhc3MuaGFzX2ZlYXR1cmU/KGZlYXR1cmUudmFsdWUpKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmZlYXR1cmVfZXhpc3RzLCBbOmZlYXR1cmVdCisKKyAgICAjIFJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiBmb3IgbGF0ZXIgaW52b2NhdGlvbiB3aXRoIHRoZSBgY2FsbCgpYCBmdW5jdGlvbi4KKyAgICAjCisgICAgIyBJZiBgJGNzc2AgaXMgYGZhbHNlYCwgdGhlIGZ1bmN0aW9uIHJlZmVyZW5jZSBtYXkgcmVmZXIgdG8gYSBmdW5jdGlvbgorICAgICMgZGVmaW5lZCBpbiB5b3VyIHN0eWxlc2hlZXQgb3IgYnVpbHQtaW4gdG8gdGhlIGhvc3QgZW52aXJvbm1lbnQuIElmIGl0J3MKKyAgICAjIGB0cnVlYCBpdCB3aWxsIHJlZmVyIHRvIGEgcGxhaW4tQ1NTIGZ1bmN0aW9uLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGdldC1mdW5jdGlvbigicmdiIikKKyAgICAjCisgICAgIyAgIEBmdW5jdGlvbiBteWZ1bmMgeyBAcmV0dXJuICJzb21ldGhpbmciOyB9CisgICAgIyAgIGdldC1mdW5jdGlvbigibXlmdW5jIikKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgZ2V0X2Z1bmN0aW9uKCRuYW1lLCAkY3NzOiBmYWxzZSkKKyAgICAjICAgQHBhcmFtIG5hbWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10gVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIHJlZmVyZW5jZWQuCisgICAgIyAgIEBwYXJhbSBjc3MgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2xdIFdoZXRoZXIgdG8gZ2V0IGEgcGxhaW4gQ1NTIGZ1bmN0aW9uLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkZ1bmN0aW9uXSBBIGZ1bmN0aW9uIHJlZmVyZW5jZS4KKyAgICBkZWYgZ2V0X2Z1bmN0aW9uKG5hbWUsIGt3YXJncyA9IHt9KQorICAgICAgYXNzZXJ0X3R5cGUgbmFtZSwgOlN0cmluZywgOm5hbWUKKworICAgICAgY3NzID0gaWYga3dhcmdzLmhhc19rZXk/KCJjc3MiKQorICAgICAgICAgICAgICB2ID0ga3dhcmdzLmRlbGV0ZSgiY3NzIikKKyAgICAgICAgICAgICAgYXNzZXJ0X3R5cGUgdiwgOkJvb2wsIDpjc3MKKyAgICAgICAgICAgICAgdi52YWx1ZQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmYWxzZQorICAgICAgICAgICAgZW5kCisKKyAgICAgIGlmIGt3YXJncy5hbnk/CisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJJbGxlZ2FsIGtleXdvcmQgYXJndW1lbnQgJyN7a3dhcmdzLmtleXMuZmlyc3R9JyIpCisgICAgICBlbmQKKworICAgICAgaWYgY3NzCisgICAgICAgIHJldHVybiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpGdW5jdGlvbi5uZXcoCisgICAgICAgICAgU2Fzczo6Q2FsbGFibGUubmV3KG5hbWUudmFsdWUsIG5pbCwgbmlsLCBuaWwsIG5pbCwgbmlsLCAiZnVuY3Rpb24iLCA6Y3NzKSkKKyAgICAgIGVuZAorCisgICAgICBjYWxsYWJsZSA9IGVudmlyb25tZW50LmNhbGxlci5mdW5jdGlvbihuYW1lLnZhbHVlKSB8fAorICAgICAgICAoU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnMuY2FsbGFibGU/KG5hbWUudmFsdWUudHIoIi0iLCAiXyIpKSAmJgorICAgICAgICAgU2Fzczo6Q2FsbGFibGUubmV3KG5hbWUudmFsdWUsIG5pbCwgbmlsLCBuaWwsIG5pbCwgbmlsLCAiZnVuY3Rpb24iLCA6YnVpbHRpbikpCisKKyAgICAgIGlmIGNhbGxhYmxlCisgICAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkZ1bmN0aW9uLm5ldyhjYWxsYWJsZSkKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCJGdW5jdGlvbiBub3QgZm91bmQ6ICN7bmFtZX0iKQorICAgICAgZW5kCisgICAgZW5kCisgICAgZGVjbGFyZSA6Z2V0X2Z1bmN0aW9uLCBbOm5hbWVdLCA6dmFyX2t3YXJncyA9PiB0cnVlCisKKyAgICAjIFJldHVybnMgdGhlIHVuaXQocykgYXNzb2NpYXRlZCB3aXRoIGEgbnVtYmVyLiBDb21wbGV4IHVuaXRzIGFyZSBzb3J0ZWQgaW4KKyAgICAjIGFscGhhYmV0aWNhbCBvcmRlciBieSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHVuaXQoMTAwKSA9PiAiIgorICAgICMgICB1bml0KDEwMHB4KSA9PiAicHgiCisgICAgIyAgIHVuaXQoM2VtKSA9PiAiZW0iCisgICAgIyAgIHVuaXQoMTBweCAqIDVlbSkgPT4gImVtKnB4IgorICAgICMgICB1bml0KDEwcHggKiA1ZW0gLyAzMGNtIC8gMXJlbSkgPT4gImVtKnB4L2NtKnJlbSIKKyAgICAjIEBvdmVybG9hZCB1bml0KCRudW1iZXIpCisgICAgIyAgIEBwYXJhbSAkbnVtYmVyIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddIFRoZSB1bml0KHMpIG9mIHRoZSBudW1iZXIsIGFzIGEKKyAgICAjICAgcXVvdGVkIHN0cmluZworICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJG51bWJlcmAgaXNuJ3QgYSBudW1iZXIKKyAgICBkZWYgdW5pdChudW1iZXIpCisgICAgICBhc3NlcnRfdHlwZSBudW1iZXIsIDpOdW1iZXIsIDpudW1iZXIKKyAgICAgIHF1b3RlZF9zdHJpbmcobnVtYmVyLnVuaXRfc3RyKQorICAgIGVuZAorICAgIGRlY2xhcmUgOnVuaXQsIFs6bnVtYmVyXQorCisgICAgIyBSZXR1cm5zIHdoZXRoZXIgYSBudW1iZXIgaGFzIHVuaXRzLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHVuaXRsZXNzKDEwMCkgPT4gdHJ1ZQorICAgICMgICB1bml0bGVzcygxMDBweCkgPT4gZmFsc2UKKyAgICAjIEBvdmVybG9hZCB1bml0bGVzcygkbnVtYmVyKQorICAgICMgICBAcGFyYW0gJG51bWJlciBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbF0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRudW1iZXJgIGlzbid0IGEgbnVtYmVyCisgICAgZGVmIHVuaXRsZXNzKG51bWJlcikKKyAgICAgIGFzc2VydF90eXBlIG51bWJlciwgOk51bWJlciwgOm51bWJlcgorICAgICAgYm9vbChudW1iZXIudW5pdGxlc3M/KQorICAgIGVuZAorICAgIGRlY2xhcmUgOnVuaXRsZXNzLCBbOm51bWJlcl0KKworICAgICMgUmV0dXJucyB3aGV0aGVyIHR3byBudW1iZXJzIGNhbiBhZGRlZCwgc3VidHJhY3RlZCwgb3IgY29tcGFyZWQuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgY29tcGFyYWJsZSgycHgsIDFweCkgPT4gdHJ1ZQorICAgICMgICBjb21wYXJhYmxlKDEwMHB4LCAzZW0pID0+IGZhbHNlCisgICAgIyAgIGNvbXBhcmFibGUoMTBjbSwgM21tKSA9PiB0cnVlCisgICAgIyBAb3ZlcmxvYWQgY29tcGFyYWJsZSgkbnVtYmVyMSwgJG51bWJlcjIpCisgICAgIyAgIEBwYXJhbSAkbnVtYmVyMSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgICBAcGFyYW0gJG51bWJlcjIgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2xdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGVpdGhlciBwYXJhbWV0ZXIgaXMgdGhlIHdyb25nIHR5cGUKKyAgICBkZWYgY29tcGFyYWJsZShudW1iZXIxLCBudW1iZXIyKQorICAgICAgYXNzZXJ0X3R5cGUgbnVtYmVyMSwgOk51bWJlciwgOm51bWJlcjEKKyAgICAgIGFzc2VydF90eXBlIG51bWJlcjIsIDpOdW1iZXIsIDpudW1iZXIyCisgICAgICBib29sKG51bWJlcjEuY29tcGFyYWJsZV90bz8obnVtYmVyMikpCisgICAgZW5kCisgICAgZGVjbGFyZSA6Y29tcGFyYWJsZSwgWzpudW1iZXIxLCA6bnVtYmVyMl0KKworICAgICMgQ29udmVydHMgYSB1bml0bGVzcyBudW1iZXIgdG8gYSBwZXJjZW50YWdlLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHBlcmNlbnRhZ2UoMC4yKSA9PiAyMCUKKyAgICAjICAgcGVyY2VudGFnZSgxMDBweCAvIDUwcHgpID0+IDIwMCUKKyAgICAjIEBvdmVybG9hZCBwZXJjZW50YWdlKCRudW1iZXIpCisgICAgIyAgIEBwYXJhbSAkbnVtYmVyIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkbnVtYmVyYCBpc24ndCBhIHVuaXRsZXNzIG51bWJlcgorICAgIGRlZiBwZXJjZW50YWdlKG51bWJlcikKKyAgICAgIHVubGVzcyBudW1iZXIuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKSAmJiBudW1iZXIudW5pdGxlc3M/CisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCIkbnVtYmVyOiAje251bWJlci5pbnNwZWN0fSBpcyBub3QgYSB1bml0bGVzcyBudW1iZXIiKQorICAgICAgZW5kCisgICAgICBudW1iZXIobnVtYmVyLnZhbHVlICogMTAwLCAnJScpCisgICAgZW5kCisgICAgZGVjbGFyZSA6cGVyY2VudGFnZSwgWzpudW1iZXJdCisKKyAgICAjIFJvdW5kcyBhIG51bWJlciB0byB0aGUgbmVhcmVzdCB3aG9sZSBudW1iZXIuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgcm91bmQoMTAuNHB4KSA9PiAxMHB4CisgICAgIyAgIHJvdW5kKDEwLjZweCkgPT4gMTFweAorICAgICMgQG92ZXJsb2FkIHJvdW5kKCRudW1iZXIpCisgICAgIyAgIEBwYXJhbSAkbnVtYmVyIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkbnVtYmVyYCBpc24ndCBhIG51bWJlcgorICAgIGRlZiByb3VuZChudW1iZXIpCisgICAgICBudW1lcmljX3RyYW5zZm9ybWF0aW9uKG51bWJlcikge3xufCBTYXNzOjpVdGlsLnJvdW5kKG4pfQorICAgIGVuZAorICAgIGRlY2xhcmUgOnJvdW5kLCBbOm51bWJlcl0KKworICAgICMgUm91bmRzIGEgbnVtYmVyIHVwIHRvIHRoZSBuZXh0IHdob2xlIG51bWJlci4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBjZWlsKDEwLjRweCkgPT4gMTFweAorICAgICMgICBjZWlsKDEwLjZweCkgPT4gMTFweAorICAgICMgQG92ZXJsb2FkIGNlaWwoJG51bWJlcikKKyAgICAjICAgQHBhcmFtICRudW1iZXIgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRudW1iZXJgIGlzbid0IGEgbnVtYmVyCisgICAgZGVmIGNlaWwobnVtYmVyKQorICAgICAgbnVtZXJpY190cmFuc2Zvcm1hdGlvbihudW1iZXIpIHt8bnwgbi5jZWlsfQorICAgIGVuZAorICAgIGRlY2xhcmUgOmNlaWwsIFs6bnVtYmVyXQorCisgICAgIyBSb3VuZHMgYSBudW1iZXIgZG93biB0byB0aGUgcHJldmlvdXMgd2hvbGUgbnVtYmVyLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGZsb29yKDEwLjRweCkgPT4gMTBweAorICAgICMgICBmbG9vcigxMC42cHgpID0+IDEwcHgKKyAgICAjIEBvdmVybG9hZCBmbG9vcigkbnVtYmVyKQorICAgICMgICBAcGFyYW0gJG51bWJlciBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJG51bWJlcmAgaXNuJ3QgYSBudW1iZXIKKyAgICBkZWYgZmxvb3IobnVtYmVyKQorICAgICAgbnVtZXJpY190cmFuc2Zvcm1hdGlvbihudW1iZXIpIHt8bnwgbi5mbG9vcn0KKyAgICBlbmQKKyAgICBkZWNsYXJlIDpmbG9vciwgWzpudW1iZXJdCisKKyAgICAjIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIGEgbnVtYmVyLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGFicygxMHB4KSA9PiAxMHB4CisgICAgIyAgIGFicygtMTBweCkgPT4gMTBweAorICAgICMgQG92ZXJsb2FkIGFicygkbnVtYmVyKQorICAgICMgICBAcGFyYW0gJG51bWJlciBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJG51bWJlcmAgaXNuJ3QgYSBudW1iZXIKKyAgICBkZWYgYWJzKG51bWJlcikKKyAgICAgIG51bWVyaWNfdHJhbnNmb3JtYXRpb24obnVtYmVyKSB7fG58IG4uYWJzfQorICAgIGVuZAorICAgIGRlY2xhcmUgOmFicywgWzpudW1iZXJdCisKKyAgICAjIEZpbmRzIHRoZSBtaW5pbXVtIG9mIHNldmVyYWwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbiB0YWtlcyBhbnkgbnVtYmVyIG9mCisgICAgIyBhcmd1bWVudHMuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbWluKDFweCwgNHB4KSA9PiAxcHgKKyAgICAjICAgbWluKDVlbSwgM2VtLCA0ZW0pID0+IDNlbQorICAgICMgQG92ZXJsb2FkIG1pbigkbnVtYmVycy4uLikKKyAgICAjICAgQHBhcmFtICRudW1iZXJzIFtbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXV0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYW55IGFyZ3VtZW50IGlzbid0IGEgbnVtYmVyLCBvciBpZiBub3QgYWxsIG9mCisgICAgIyAgIHRoZSBhcmd1bWVudHMgaGF2ZSBjb21wYXJhYmxlIHVuaXRzCisgICAgZGVmIG1pbigqbnVtYmVycykKKyAgICAgIG51bWJlcnMuZWFjaCB7fG58IGFzc2VydF90eXBlIG4sIDpOdW1iZXJ9CisgICAgICBudW1iZXJzLmluamVjdCB7fG1pbiwgbnVtfCBtaW4ubHQobnVtKS50b19ib29sID8gbWluIDogbnVtfQorICAgIGVuZAorICAgIGRlY2xhcmUgOm1pbiwgW10sIDp2YXJfYXJncyA9PiA6dHJ1ZQorCisgICAgIyBGaW5kcyB0aGUgbWF4aW11bSBvZiBzZXZlcmFsIG51bWJlcnMuIFRoaXMgZnVuY3Rpb24gdGFrZXMgYW55IG51bWJlciBvZgorICAgICMgYXJndW1lbnRzLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIG1heCgxcHgsIDRweCkgPT4gNHB4CisgICAgIyAgIG1heCg1ZW0sIDNlbSwgNGVtKSA9PiA1ZW0KKyAgICAjIEBvdmVybG9hZCBtYXgoJG51bWJlcnMuLi4pCisgICAgIyAgIEBwYXJhbSAkbnVtYmVycyBbW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl1dCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGFueSBhcmd1bWVudCBpc24ndCBhIG51bWJlciwgb3IgaWYgbm90IGFsbCBvZgorICAgICMgICB0aGUgYXJndW1lbnRzIGhhdmUgY29tcGFyYWJsZSB1bml0cworICAgIGRlZiBtYXgoKnZhbHVlcykKKyAgICAgIHZhbHVlcy5lYWNoIHt8dnwgYXNzZXJ0X3R5cGUgdiwgOk51bWJlcn0KKyAgICAgIHZhbHVlcy5pbmplY3Qge3xtYXgsIHZhbHwgbWF4Lmd0KHZhbCkudG9fYm9vbCA/IG1heCA6IHZhbH0KKyAgICBlbmQKKyAgICBkZWNsYXJlIDptYXgsIFtdLCA6dmFyX2FyZ3MgPT4gOnRydWUKKworICAgICMgUmV0dXJuIHRoZSBsZW5ndGggb2YgYSBsaXN0LgorICAgICMKKyAgICAjIFRoaXMgY2FuIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhaXJzIGluIGEgbWFwIGFzIHdlbGwuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbGVuZ3RoKDEwcHgpID0+IDEKKyAgICAjICAgbGVuZ3RoKDEwcHggMjBweCAzMHB4KSA9PiAzCisgICAgIyAgIGxlbmd0aCgod2lkdGg6IDEwcHgsIGhlaWdodDogMjBweCkpID0+IDIKKyAgICAjIEBvdmVybG9hZCBsZW5ndGgoJGxpc3QpCisgICAgIyAgIEBwYXJhbSAkbGlzdCBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0KKyAgICBkZWYgbGVuZ3RoKGxpc3QpCisgICAgICBudW1iZXIobGlzdC50b19hLnNpemUpCisgICAgZW5kCisgICAgZGVjbGFyZSA6bGVuZ3RoLCBbOmxpc3RdCisKKyAgICAjIFJldHVybiBhIG5ldyBsaXN0LCBiYXNlZCBvbiB0aGUgbGlzdCBwcm92aWRlZCwgYnV0IHdpdGggdGhlIG50aAorICAgICMgZWxlbWVudCBjaGFuZ2VkIHRvIHRoZSB2YWx1ZSBnaXZlbi4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgdW5saWtlIHNvbWUgbGFuZ3VhZ2VzLCB0aGUgZmlyc3QgaXRlbSBpbiBhIFNhc3MgbGlzdCBpcyBudW1iZXIKKyAgICAjIDEsIHRoZSBzZWNvbmQgbnVtYmVyIDIsIGFuZCBzbyBmb3J0aC4KKyAgICAjCisgICAgIyBOZWdhdGl2ZSBpbmRleCB2YWx1ZXMgYWRkcmVzcyBlbGVtZW50cyBpbiByZXZlcnNlIG9yZGVyLCBzdGFydGluZyB3aXRoIHRoZSBsYXN0IGVsZW1lbnQKKyAgICAjIGluIHRoZSBsaXN0LgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHNldC1udGgoJGxpc3Q6IDEwcHggMjBweCAzMHB4LCAkbjogMiwgJHZhbHVlOiAtMjBweCkgPT4gMTBweCAtMjBweCAzMHB4CisgICAgIyBAb3ZlcmxvYWQgc2V0LW50aCgkbGlzdCwgJG4sICR2YWx1ZSkKKyAgICAjICAgQHBhcmFtICRsaXN0IFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXSBUaGUgbGlzdCB0aGF0IHdpbGwgYmUgY29waWVkLCBoYXZpbmcgdGhlIGVsZW1lbnQKKyAgICAjICAgICBhdCBpbmRleCBgJG5gIGNoYW5nZWQuCisgICAgIyAgIEBwYXJhbSAkbiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gc2V0LgorICAgICMgICAgIE5lZ2F0aXZlIGluZGljZXMgY291bnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICMgICBAcGFyYW0gJHZhbHVlIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXSBUaGUgbmV3IHZhbHVlIGF0IGluZGV4IGAkbmAuCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJG5gIGlzbid0IGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCB0aGUgbGVuZ3RoCisgICAgIyAgIG9mIGAkbGlzdGAKKyAgICBkZWYgc2V0X250aChsaXN0LCBuLCB2YWx1ZSkKKyAgICAgIGFzc2VydF90eXBlIG4sIDpOdW1iZXIsIDpuCisgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0LmFzc2VydF92YWxpZF9pbmRleChsaXN0LCBuKQorICAgICAgaW5kZXggPSBuLnRvX2kgPiAwID8gbi50b19pIC0gMSA6IG4udG9faQorICAgICAgbmV3X2xpc3QgPSBsaXN0LnRvX2EuZHVwCisgICAgICBuZXdfbGlzdFtpbmRleF0gPSB2YWx1ZQorICAgICAgbGlzdC53aXRoX2NvbnRlbnRzKG5ld19saXN0KQorICAgIGVuZAorICAgIGRlY2xhcmUgOnNldF9udGgsIFs6bGlzdCwgOm4sIDp2YWx1ZV0KKworICAgICMgR2V0cyB0aGUgbnRoIGl0ZW0gaW4gYSBsaXN0LgorICAgICMKKyAgICAjIE5vdGUgdGhhdCB1bmxpa2Ugc29tZSBsYW5ndWFnZXMsIHRoZSBmaXJzdCBpdGVtIGluIGEgU2FzcyBsaXN0IGlzIG51bWJlcgorICAgICMgMSwgdGhlIHNlY29uZCBudW1iZXIgMiwgYW5kIHNvIGZvcnRoLgorICAgICMKKyAgICAjIFRoaXMgY2FuIHJldHVybiB0aGUgbnRoIHBhaXIgaW4gYSBtYXAgYXMgd2VsbC4KKyAgICAjCisgICAgIyBOZWdhdGl2ZSBpbmRleCB2YWx1ZXMgYWRkcmVzcyBlbGVtZW50cyBpbiByZXZlcnNlIG9yZGVyLCBzdGFydGluZyB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgaW4KKyAgICAjIHRoZSBsaXN0LgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIG50aCgxMHB4IDIwcHggMzBweCwgMSkgPT4gMTBweAorICAgICMgICBudGgoKEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYpLCAzKSA9PiBzYW5zLXNlcmlmCisgICAgIyAgIG50aCgod2lkdGg6IDEwcHgsIGxlbmd0aDogMjBweCksIDIpID0+IGxlbmd0aCwgMjBweAorICAgICMgQG92ZXJsb2FkIG50aCgkbGlzdCwgJG4pCisgICAgIyAgIEBwYXJhbSAkbGlzdCBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICAjICAgQHBhcmFtICRuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXJdIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBnZXQuCisgICAgIyAgICAgTmVnYXRpdmUgaW5kaWNlcyBjb3VudCBmcm9tIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJG5gIGlzbid0IGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCB0aGUgbGVuZ3RoCisgICAgIyAgIG9mIGAkbGlzdGAKKyAgICBkZWYgbnRoKGxpc3QsIG4pCisgICAgICBhc3NlcnRfdHlwZSBuLCA6TnVtYmVyLCA6bgorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdC5hc3NlcnRfdmFsaWRfaW5kZXgobGlzdCwgbikKKworICAgICAgaW5kZXggPSBuLnRvX2kgPiAwID8gbi50b19pIC0gMSA6IG4udG9faQorICAgICAgbGlzdC50b19hW2luZGV4XQorICAgIGVuZAorICAgIGRlY2xhcmUgOm50aCwgWzpsaXN0LCA6bl0KKworICAgICMgSm9pbnMgdG9nZXRoZXIgdHdvIGxpc3RzIGludG8gb25lLgorICAgICMKKyAgICAjIFVubGVzcyBgJHNlcGFyYXRvcmAgaXMgcGFzc2VkLCBpZiBvbmUgbGlzdCBpcyBjb21tYS1zZXBhcmF0ZWQgYW5kIG9uZSBpcworICAgICMgc3BhY2Utc2VwYXJhdGVkLCB0aGUgZmlyc3QgcGFyYW1ldGVyJ3Mgc2VwYXJhdG9yIGlzIHVzZWQgZm9yIHRoZSByZXN1bHRpbmcKKyAgICAjIGxpc3QuIElmIGJvdGggbGlzdHMgaGF2ZSBmZXdlciB0aGFuIHR3byBpdGVtcywgc3BhY2VzIGFyZSB1c2VkIGZvciB0aGUKKyAgICAjIHJlc3VsdGluZyBsaXN0LgorICAgICMKKyAgICAjIFVubGVzcyBgJGJyYWNrZXRlZGAgaXMgcGFzc2VkLCB0aGUgcmVzdWx0aW5nIGxpc3QgaXMgYnJhY2tldGVkIGlmIHRoZQorICAgICMgZmlyc3QgcGFyYW1ldGVyIGlzLgorICAgICMKKyAgICAjIExpa2UgYWxsIGxpc3QgZnVuY3Rpb25zLCBgam9pbigpYCByZXR1cm5zIGEgbmV3IGxpc3QgcmF0aGVyIHRoYW4gbW9kaWZ5aW5nCisgICAgIyBpdHMgYXJndW1lbnRzIGluIHBsYWNlLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGpvaW4oMTBweCAyMHB4LCAzMHB4IDQwcHgpID0+IDEwcHggMjBweCAzMHB4IDQwcHgKKyAgICAjICAgam9pbigoYmx1ZSwgcmVkKSwgKCNhYmMsICNkZWYpKSA9PiBibHVlLCByZWQsICNhYmMsICNkZWYKKyAgICAjICAgam9pbigxMHB4LCAyMHB4KSA9PiAxMHB4IDIwcHgKKyAgICAjICAgam9pbigxMHB4LCAyMHB4LCBjb21tYSkgPT4gMTBweCwgMjBweAorICAgICMgICBqb2luKChibHVlLCByZWQpLCAoI2FiYywgI2RlZiksIHNwYWNlKSA9PiBibHVlIHJlZCAjYWJjICNkZWYKKyAgICAjICAgam9pbihbMTBweF0sIDIwcHgpID0+IFsxMHB4IDIwcHhdCisgICAgIyBAb3ZlcmxvYWQgam9pbigkbGlzdDEsICRsaXN0MiwgJHNlcGFyYXRvcjogYXV0bywgJGJyYWNrZXRlZDogYXV0bykKKyAgICAjICAgQHBhcmFtICRsaXN0MSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICAjICAgQHBhcmFtICRsaXN0MiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICAjICAgQHBhcmFtICRzZXBhcmF0b3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10gVGhlIGxpc3Qgc2VwYXJhdG9yIHRvIHVzZS4KKyAgICAjICAgICBJZiB0aGlzIGlzIGBjb21tYWAgb3IgYHNwYWNlYCwgdGhhdCBzZXBhcmF0b3Igd2lsbCBiZSB1c2VkLiBJZiB0aGlzIGlzCisgICAgIyAgICAgYGF1dG9gICh0aGUgZGVmYXVsdCksIHRoZSBzZXBhcmF0b3IgaXMgZGV0ZXJtaW5lZCBhcyBleHBsYWluZWQgYWJvdmUuCisgICAgIyAgIEBwYXJhbSAkYnJhY2tldGVkIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXSBXaGV0aGVyIHRoZSByZXN1bHRpbmcgbGlzdAorICAgICMgICAgIHdpbGwgYmUgYnJhY2tldGVkLiBJZiB0aGlzIGlzIGBhdXRvYCAodGhlIGRlZmF1bHQpLCB0aGUgc2VwYXJhdG9yIGlzCisgICAgIyAgICAgZGV0ZXJtaW5lZCBhcyBleHBsYWluZWQgYWJvdmUuCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgQGNvbW1lbnQKKyAgICAjICAgcnVib2NvcDpkaXNhYmxlIFBhcmFtZXRlckxpc3RzCisgICAgZGVmIGpvaW4obGlzdDEsIGxpc3QyLAorICAgICAgICAgICAgIHNlcGFyYXRvciA9IGlkZW50aWZpZXIoImF1dG8iKSwgYnJhY2tldGVkID0gaWRlbnRpZmllcigiYXV0byIpLAorICAgICAgICAgICAgIGt3YXJncyA9IG5pbCwgKnJlc3QpCisgICAgICAjIHJ1Ym9jb3A6ZW5hYmxlIFBhcmFtZXRlckxpc3RzCisgICAgICBpZiBzZXBhcmF0b3IuaXNfYT8oSGFzaCkKKyAgICAgICAga3dhcmdzID0gc2VwYXJhdG9yCisgICAgICAgIHNlcGFyYXRvciA9IGlkZW50aWZpZXIoImF1dG8iKQorICAgICAgZWxzaWYgYnJhY2tldGVkLmlzX2E/KEhhc2gpCisgICAgICAgIGt3YXJncyA9IGJyYWNrZXRlZAorICAgICAgICBicmFja2V0ZWQgPSBpZGVudGlmaWVyKCJhdXRvIikKKyAgICAgIGVsc2lmIHJlc3QubGFzdC5pc19hPyhIYXNoKQorICAgICAgICByZXN0LnVuc2hpZnQga3dhcmdzCisgICAgICAgIGt3YXJncyA9IHJlc3QucG9wCisgICAgICBlbmQKKworICAgICAgdW5sZXNzIHJlc3QuZW1wdHk/CisgICAgICAgICMgQWRkIDQgdG8gcmVzdC5sZW5ndGggYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGNvdW50IHRoZSBrd2FyZ3MgaGFzaCwKKyAgICAgICAgIyB3aGljaCBpcyBhbHdheXMgcGFzc2VkLgorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAoI3tyZXN0Lmxlbmd0aCArIDR9IGZvciAyLi40KSIpCisgICAgICBlbmQKKworICAgICAgaWYga3dhcmdzCisgICAgICAgIHNlcGFyYXRvciA9IGt3YXJncy5kZWxldGUoInNlcGFyYXRvciIpIHx8IHNlcGFyYXRvcgorICAgICAgICBicmFja2V0ZWQgPSBrd2FyZ3MuZGVsZXRlKCJicmFja2V0ZWQiKSB8fCBicmFja2V0ZWQKKworICAgICAgICB1bmxlc3Mga3dhcmdzLmVtcHR5PworICAgICAgICAgIG5hbWUsIHZhbCA9IGt3YXJncy50b19hLmZpcnN0CisgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIlVua25vd24gYXJndW1lbnQgJCN7bmFtZX0gKCN7dmFsfSkiKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBhc3NlcnRfdHlwZSBzZXBhcmF0b3IsIDpTdHJpbmcsIDpzZXBhcmF0b3IKKyAgICAgIHVubGVzcyAldyhhdXRvIHNwYWNlIGNvbW1hKS5pbmNsdWRlPyhzZXBhcmF0b3IudmFsdWUpCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJTZXBhcmF0b3IgbmFtZSBtdXN0IGJlIHNwYWNlLCBjb21tYSwgb3IgYXV0byIpCisgICAgICBlbmQKKworICAgICAgbGlzdChsaXN0MS50b19hICsgbGlzdDIudG9fYSwKKyAgICAgICAgc2VwYXJhdG9yOgorICAgICAgICAgIGlmIHNlcGFyYXRvci52YWx1ZSA9PSAnYXV0bycKKyAgICAgICAgICAgIGxpc3QxLnNlcGFyYXRvciB8fCBsaXN0Mi5zZXBhcmF0b3IgfHwgOnNwYWNlCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VwYXJhdG9yLnZhbHVlLnRvX3N5bQorICAgICAgICAgIGVuZCwKKyAgICAgICAgYnJhY2tldGVkOgorICAgICAgICAgIGlmIGJyYWNrZXRlZC5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpICYmIGJyYWNrZXRlZC52YWx1ZSA9PSAnYXV0bycKKyAgICAgICAgICAgIGxpc3QxLmJyYWNrZXRlZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyYWNrZXRlZC50b19ib29sCisgICAgICAgICAgZW5kKQorICAgIGVuZAorICAgICMgV2UgZG9uJ3QgYWN0dWFsbHkgdGFrZSB2YXJpYWJsZSBhcmd1bWVudHMgb3Iga2V5d29yZCBhcmd1bWVudHMsIGJ1dCB0aGlzCisgICAgIyBpcyB0aGUgYmVzdCB3YXkgdG8gdGFrZSBlaXRoZXIgYCRzZXBhcmF0b3JgIG9yIGAkYnJhY2tldGVkYCBhcyBrZXl3b3JkcworICAgICMgd2l0aG91dCBjb21wbGFpbmluZyBhYm91dCB0aGUgb3RoZXIgbWlzc2luZy4KKyAgICBkZWNsYXJlIDpqb2luLCBbOmxpc3QxLCA6bGlzdDJdLCA6dmFyX2FyZ3MgPT4gdHJ1ZSwgOnZhcl9rd2FyZ3MgPT4gdHJ1ZQorCisgICAgIyBBcHBlbmRzIGEgc2luZ2xlIHZhbHVlIG9udG8gdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgIworICAgICMgVW5sZXNzIHRoZSBgJHNlcGFyYXRvcmAgYXJndW1lbnQgaXMgcGFzc2VkLCBpZiB0aGUgbGlzdCBoYWQgb25seSBvbmUgaXRlbSwKKyAgICAjIHRoZSByZXN1bHRpbmcgbGlzdCB3aWxsIGJlIHNwYWNlLXNlcGFyYXRlZC4KKyAgICAjCisgICAgIyBMaWtlIGFsbCBsaXN0IGZ1bmN0aW9ucywgYGFwcGVuZCgpYCByZXR1cm5zIGEgbmV3IGxpc3QgcmF0aGVyIHRoYW4KKyAgICAjIG1vZGlmeWluZyBpdHMgYXJndW1lbnQgaW4gcGxhY2UuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgYXBwZW5kKDEwcHggMjBweCwgMzBweCkgPT4gMTBweCAyMHB4IDMwcHgKKyAgICAjICAgYXBwZW5kKChibHVlLCByZWQpLCBncmVlbikgPT4gYmx1ZSwgcmVkLCBncmVlbgorICAgICMgICBhcHBlbmQoMTBweCAyMHB4LCAzMHB4IDQwcHgpID0+IDEwcHggMjBweCAoMzBweCA0MHB4KQorICAgICMgICBhcHBlbmQoMTBweCwgMjBweCwgY29tbWEpID0+IDEwcHgsIDIwcHgKKyAgICAjICAgYXBwZW5kKChibHVlLCByZWQpLCBncmVlbiwgc3BhY2UpID0+IGJsdWUgcmVkIGdyZWVuCisgICAgIyBAb3ZlcmxvYWQgYXBwZW5kKCRsaXN0LCAkdmFsLCAkc2VwYXJhdG9yOiBhdXRvKQorICAgICMgICBAcGFyYW0gJGxpc3QgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2VdCisgICAgIyAgIEBwYXJhbSAkdmFsIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXQorICAgICMgICBAcGFyYW0gJHNlcGFyYXRvciBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXSBUaGUgbGlzdCBzZXBhcmF0b3IgdG8gdXNlLgorICAgICMgICAgIElmIHRoaXMgaXMgYGNvbW1hYCBvciBgc3BhY2VgLCB0aGF0IHNlcGFyYXRvciB3aWxsIGJlIHVzZWQuIElmIHRoaXMgaXMKKyAgICAjICAgICBgYXV0b2AgKHRoZSBkZWZhdWx0KSwgdGhlIHNlcGFyYXRvciBpcyBkZXRlcm1pbmVkIGFzIGV4cGxhaW5lZCBhYm92ZS4KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdCisgICAgZGVmIGFwcGVuZChsaXN0LCB2YWwsIHNlcGFyYXRvciA9IGlkZW50aWZpZXIoImF1dG8iKSkKKyAgICAgIGFzc2VydF90eXBlIHNlcGFyYXRvciwgOlN0cmluZywgOnNlcGFyYXRvcgorICAgICAgdW5sZXNzICV3KGF1dG8gc3BhY2UgY29tbWEpLmluY2x1ZGU/KHNlcGFyYXRvci52YWx1ZSkKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIlNlcGFyYXRvciBuYW1lIG11c3QgYmUgc3BhY2UsIGNvbW1hLCBvciBhdXRvIikKKyAgICAgIGVuZAorICAgICAgbGlzdC53aXRoX2NvbnRlbnRzKGxpc3QudG9fYSArIFt2YWxdLAorICAgICAgICBzZXBhcmF0b3I6CisgICAgICAgICAgaWYgc2VwYXJhdG9yLnZhbHVlID09ICdhdXRvJworICAgICAgICAgICAgbGlzdC5zZXBhcmF0b3IgfHwgOnNwYWNlCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VwYXJhdG9yLnZhbHVlLnRvX3N5bQorICAgICAgICAgIGVuZCkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDphcHBlbmQsIFs6bGlzdCwgOnZhbF0KKyAgICBkZWNsYXJlIDphcHBlbmQsIFs6bGlzdCwgOnZhbCwgOnNlcGFyYXRvcl0KKworICAgICMgQ29tYmluZXMgc2V2ZXJhbCBsaXN0cyBpbnRvIGEgc2luZ2xlIG11bHRpZGltZW5zaW9uYWwgbGlzdC4gVGhlIG50aCB2YWx1ZQorICAgICMgb2YgdGhlIHJlc3VsdGluZyBsaXN0IGlzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHNvdXJjZSBsaXN0cycgbnRoCisgICAgIyB2YWx1ZXMuCisgICAgIworICAgICMgVGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIGxpc3QgaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAgICAjIHNob3J0ZXN0IGxpc3QuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgemlwKDFweCAxcHggM3B4LCBzb2xpZCBkYXNoZWQgc29saWQsIHJlZCBncmVlbiBibHVlKQorICAgICMgICA9PiAxcHggc29saWQgcmVkLCAxcHggZGFzaGVkIGdyZWVuLCAzcHggc29saWQgYmx1ZQorICAgICMgQG92ZXJsb2FkIHppcCgkbGlzdHMuLi4pCisgICAgIyAgIEBwYXJhbSAkbGlzdHMgW1tTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXV0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdCisgICAgZGVmIHppcCgqbGlzdHMpCisgICAgICBsZW5ndGggPSBuaWwKKyAgICAgIHZhbHVlcyA9IFtdCisgICAgICBsaXN0cy5lYWNoIGRvIHxsaXN0fAorICAgICAgICBhcnJheSA9IGxpc3QudG9fYQorICAgICAgICB2YWx1ZXMgPDwgYXJyYXkuZHVwCisgICAgICAgIGxlbmd0aCA9IGxlbmd0aC5uaWw/ID8gYXJyYXkubGVuZ3RoIDogW2xlbmd0aCwgYXJyYXkubGVuZ3RoXS5taW4KKyAgICAgIGVuZAorICAgICAgdmFsdWVzLmVhY2ggZG8gfHZhbHVlfAorICAgICAgICB2YWx1ZS5zbGljZSEobGVuZ3RoKQorICAgICAgZW5kCisgICAgICBuZXdfbGlzdF92YWx1ZSA9IHZhbHVlcy5maXJzdC56aXAoKnZhbHVlc1sxLi4tMV0pCisgICAgICBsaXN0KG5ld19saXN0X3ZhbHVlLm1hcCB7fGxpc3R8IGxpc3QobGlzdCwgOnNwYWNlKX0sIDpjb21tYSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDp6aXAsIFtdLCA6dmFyX2FyZ3MgPT4gdHJ1ZQorCisgICAgIyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiBhIHZhbHVlIHdpdGhpbiBhIGxpc3QuIElmIHRoZSB2YWx1ZSBpc24ndCBmb3VuZCwKKyAgICAjIHJldHVybnMgYG51bGxgIGluc3RlYWQuCisgICAgIworICAgICMgTm90ZSB0aGF0IHVubGlrZSBzb21lIGxhbmd1YWdlcywgdGhlIGZpcnN0IGl0ZW0gaW4gYSBTYXNzIGxpc3QgaXMgbnVtYmVyCisgICAgIyAxLCB0aGUgc2Vjb25kIG51bWJlciAyLCBhbmQgc28gZm9ydGguCisgICAgIworICAgICMgVGhpcyBjYW4gcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBhIHBhaXIgaW4gYSBtYXAgYXMgd2VsbC4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBpbmRleCgxcHggc29saWQgcmVkLCBzb2xpZCkgPT4gMgorICAgICMgICBpbmRleCgxcHggc29saWQgcmVkLCBkYXNoZWQpID0+IG51bGwKKyAgICAjICAgaW5kZXgoKHdpZHRoOiAxMHB4LCBoZWlnaHQ6IDIwcHgpLCAoaGVpZ2h0IDIwcHgpKSA9PiAyCisgICAgIyBAb3ZlcmxvYWQgaW5kZXgoJGxpc3QsICR2YWx1ZSkKKyAgICAjICAgQHBhcmFtICRsaXN0IFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXQorICAgICMgICBAcGFyYW0gJHZhbHVlIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdWxsXSBUaGUKKyAgICAjICAgMS1iYXNlZCBpbmRleCBvZiBgJHZhbHVlYCBpbiBgJGxpc3RgLCBvciBgbnVsbGAKKyAgICBkZWYgaW5kZXgobGlzdCwgdmFsdWUpCisgICAgICBpbmRleCA9IGxpc3QudG9fYS5pbmRleCB7fGV8IGUuZXEodmFsdWUpLnRvX2Jvb2x9CisgICAgICBpbmRleCA/IG51bWJlcihpbmRleCArIDEpIDogbnVsbAorICAgIGVuZAorICAgIGRlY2xhcmUgOmluZGV4LCBbOmxpc3QsIDp2YWx1ZV0KKworICAgICMgUmV0dXJucyB0aGUgc2VwYXJhdG9yIG9mIGEgbGlzdC4gSWYgdGhlIGxpc3QgZG9lc24ndCBoYXZlIGEgc2VwYXJhdG9yIGR1ZQorICAgICMgdG8gaGF2aW5nIGZld2VyIHRoYW4gdHdvIGVsZW1lbnRzLCByZXR1cm5zIGBzcGFjZWAuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbGlzdC1zZXBhcmF0b3IoMXB4IDJweCAzcHgpID0+IHNwYWNlCisgICAgIyAgIGxpc3Qtc2VwYXJhdG9yKDFweCwgMnB4LCAzcHgpID0+IGNvbW1hCisgICAgIyAgIGxpc3Qtc2VwYXJhdG9yKCdmb28nKSA9PiBzcGFjZQorICAgICMgQG92ZXJsb2FkIGxpc3Rfc2VwYXJhdG9yKCRsaXN0KQorICAgICMgICBAcGFyYW0gJGxpc3QgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2VdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddIGBjb21tYWAgb3IgYHNwYWNlYAorICAgIGRlZiBsaXN0X3NlcGFyYXRvcihsaXN0KQorICAgICAgaWRlbnRpZmllcigobGlzdC5zZXBhcmF0b3IgfHwgOnNwYWNlKS50b19zKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmxpc3Rfc2VwYXJhdG9yLCBbOmxpc3RdCisKKyAgICAjIFJldHVybnMgd2hldGhlciBhIGxpc3QgdXNlcyBzcXVhcmUgYnJhY2tldHMuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgaXMtYnJhY2tldGVkKDFweCAycHggM3B4KSA9PiBmYWxzZQorICAgICMgICBpcy1icmFja2V0ZWQoWzFweCwgMnB4LCAzcHhdKSA9PiB0cnVlCisgICAgIyBAb3ZlcmxvYWQgaXNfYnJhY2tldGVkKCRsaXN0KQorICAgICMgICBAcGFyYW0gJGxpc3QgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2VdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sXQorICAgIGRlZiBpc19icmFja2V0ZWQobGlzdCkKKyAgICAgIGJvb2wobGlzdC5icmFja2V0ZWQpCisgICAgZW5kCisgICAgZGVjbGFyZSA6aXNfYnJhY2tldGVkLCBbOmxpc3RdCisKKyAgICAjIFJldHVybnMgdGhlIHZhbHVlIGluIGEgbWFwIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LiBJZiB0aGUgbWFwCisgICAgIyBkb2Vzbid0IGhhdmUgc3VjaCBhIGtleSwgcmV0dXJucyBgbnVsbGAuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbWFwLWdldCgoImZvbyI6IDEsICJiYXIiOiAyKSwgImZvbyIpID0+IDEKKyAgICAjICAgbWFwLWdldCgoImZvbyI6IDEsICJiYXIiOiAyKSwgImJhciIpID0+IDIKKyAgICAjICAgbWFwLWdldCgoImZvbyI6IDEsICJiYXIiOiAyKSwgImJheiIpID0+IG51bGwKKyAgICAjIEBvdmVybG9hZCBtYXBfZ2V0KCRtYXAsICRrZXkpCisgICAgIyAgIEBwYXJhbSAkbWFwIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpNYXBdCisgICAgIyAgIEBwYXJhbSAka2V5IFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0gVGhlIHZhbHVlIGluZGV4ZWQgYnkgYCRrZXlgLCBvciBgbnVsbGAKKyAgICAjICAgaWYgdGhlIG1hcCBkb2Vzbid0IGNvbnRhaW4gdGhlIGdpdmVuIGtleQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJG1hcGAgaXMgbm90IGEgbWFwCisgICAgZGVmIG1hcF9nZXQobWFwLCBrZXkpCisgICAgICBhc3NlcnRfdHlwZSBtYXAsIDpNYXAsIDptYXAKKyAgICAgIG1hcC50b19oW2tleV0gfHwgbnVsbAorICAgIGVuZAorICAgIGRlY2xhcmUgOm1hcF9nZXQsIFs6bWFwLCA6a2V5XQorCisgICAgIyBNZXJnZXMgdHdvIG1hcHMgdG9nZXRoZXIgaW50byBhIG5ldyBtYXAuIEtleXMgaW4gYCRtYXAyYCB3aWxsIHRha2UKKyAgICAjIHByZWNlZGVuY2Ugb3ZlciBrZXlzIGluIGAkbWFwMWAuCisgICAgIworICAgICMgVGhpcyBpcyB0aGUgYmVzdCB3YXkgdG8gYWRkIG5ldyB2YWx1ZXMgdG8gYSBtYXAuCisgICAgIworICAgICMgQWxsIGtleXMgaW4gdGhlIHJldHVybmVkIG1hcCB0aGF0IGFsc28gYXBwZWFyIGluIGAkbWFwMWAgd2lsbCBoYXZlIHRoZQorICAgICMgc2FtZSBvcmRlciBhcyBpbiBgJG1hcDFgLiBOZXcga2V5cyBmcm9tIGAkbWFwMmAgd2lsbCBiZSBwbGFjZWQgYXQgdGhlIGVuZAorICAgICMgb2YgdGhlIG1hcC4KKyAgICAjCisgICAgIyBMaWtlIGFsbCBtYXAgZnVuY3Rpb25zLCBgbWFwLW1lcmdlKClgIHJldHVybnMgYSBuZXcgbWFwIHJhdGhlciB0aGFuCisgICAgIyBtb2RpZnlpbmcgaXRzIGFyZ3VtZW50cyBpbiBwbGFjZS4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBtYXAtbWVyZ2UoKCJmb28iOiAxKSwgKCJiYXIiOiAyKSkgPT4gKCJmb28iOiAxLCAiYmFyIjogMikKKyAgICAjICAgbWFwLW1lcmdlKCgiZm9vIjogMSwgImJhciI6IDIpLCAoImJhciI6IDMpKSA9PiAoImZvbyI6IDEsICJiYXIiOiAzKQorICAgICMgQG92ZXJsb2FkIG1hcF9tZXJnZSgkbWFwMSwgJG1hcDIpCisgICAgIyAgIEBwYXJhbSAkbWFwMSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TWFwXQorICAgICMgICBAcGFyYW0gJG1hcDIgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok1hcF0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok1hcF0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgZWl0aGVyIHBhcmFtZXRlciBpcyBub3QgYSBtYXAKKyAgICBkZWYgbWFwX21lcmdlKG1hcDEsIG1hcDIpCisgICAgICBhc3NlcnRfdHlwZSBtYXAxLCA6TWFwLCA6bWFwMQorICAgICAgYXNzZXJ0X3R5cGUgbWFwMiwgOk1hcCwgOm1hcDIKKyAgICAgIG1hcChtYXAxLnRvX2gubWVyZ2UobWFwMi50b19oKSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDptYXBfbWVyZ2UsIFs6bWFwMSwgOm1hcDJdCisKKyAgICAjIFJldHVybnMgYSBuZXcgbWFwIHdpdGgga2V5cyByZW1vdmVkLgorICAgICMKKyAgICAjIExpa2UgYWxsIG1hcCBmdW5jdGlvbnMsIGBtYXAtbWVyZ2UoKWAgcmV0dXJucyBhIG5ldyBtYXAgcmF0aGVyIHRoYW4KKyAgICAjIG1vZGlmeWluZyBpdHMgYXJndW1lbnRzIGluIHBsYWNlLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIG1hcC1yZW1vdmUoKCJmb28iOiAxLCAiYmFyIjogMiksICJiYXIiKSA9PiAoImZvbyI6IDEpCisgICAgIyAgIG1hcC1yZW1vdmUoKCJmb28iOiAxLCAiYmFyIjogMiwgImJheiI6IDMpLCAiYmFyIiwgImJheiIpID0+ICgiZm9vIjogMSkKKyAgICAjICAgbWFwLXJlbW92ZSgoImZvbyI6IDEsICJiYXIiOiAyKSwgImJheiIpID0+ICgiZm9vIjogMSwgImJhciI6IDIpCisgICAgIyBAb3ZlcmxvYWQgbWFwX3JlbW92ZSgkbWFwLCAka2V5cy4uLikKKyAgICAjICAgQHBhcmFtICRtYXAgIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpNYXBdCisgICAgIyAgIEBwYXJhbSAka2V5cyBbW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2VdXQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TWFwXQorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBgJG1hcGAgaXMgbm90IGEgbWFwCisgICAgZGVmIG1hcF9yZW1vdmUobWFwLCAqa2V5cykKKyAgICAgIGFzc2VydF90eXBlIG1hcCwgOk1hcCwgOm1hcAorICAgICAgaGFzaCA9IG1hcC50b19oLmR1cAorICAgICAgaGFzaC5kZWxldGVfaWYge3xrZXksIF98IGtleXMuaW5jbHVkZT8oa2V5KX0KKyAgICAgIG1hcChoYXNoKQorICAgIGVuZAorICAgIGRlY2xhcmUgOm1hcF9yZW1vdmUsIFs6bWFwLCA6a2V5XSwgOnZhcl9hcmdzID0+IHRydWUKKworICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGtleXMgaW4gYSBtYXAuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbWFwLWtleXMoKCJmb28iOiAxLCAiYmFyIjogMikpID0+ICJmb28iLCAiYmFyIgorICAgICMgQG92ZXJsb2FkIG1hcF9rZXlzKCRtYXApCisgICAgIyAgIEBwYXJhbSAkbWFwIFtNYXBdCisgICAgIyBAcmV0dXJuIFtMaXN0XSB0aGUgbGlzdCBvZiBrZXlzLCBjb21tYS1zZXBhcmF0ZWQKKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRtYXBgIGlzIG5vdCBhIG1hcAorICAgIGRlZiBtYXBfa2V5cyhtYXApCisgICAgICBhc3NlcnRfdHlwZSBtYXAsIDpNYXAsIDptYXAKKyAgICAgIGxpc3QobWFwLnRvX2gua2V5cywgOmNvbW1hKQorICAgIGVuZAorICAgIGRlY2xhcmUgOm1hcF9rZXlzLCBbOm1hcF0KKworICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHZhbHVlcyBpbiBhIG1hcC4gVGhpcyBsaXN0IG1heSBpbmNsdWRlIGR1cGxpY2F0ZQorICAgICMgdmFsdWVzLCBpZiBtdWx0aXBsZSBrZXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbWFwLXZhbHVlcygoImZvbyI6IDEsICJiYXIiOiAyKSkgPT4gMSwgMgorICAgICMgICBtYXAtdmFsdWVzKCgiZm9vIjogMSwgImJhciI6IDIsICJiYXoiOiAxKSkgPT4gMSwgMiwgMQorICAgICMgQG92ZXJsb2FkIG1hcF92YWx1ZXMoJG1hcCkKKyAgICAjICAgQHBhcmFtICRtYXAgW01hcF0KKyAgICAjIEByZXR1cm4gW0xpc3RdIHRoZSBsaXN0IG9mIHZhbHVlcywgY29tbWEtc2VwYXJhdGVkCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkbWFwYCBpcyBub3QgYSBtYXAKKyAgICBkZWYgbWFwX3ZhbHVlcyhtYXApCisgICAgICBhc3NlcnRfdHlwZSBtYXAsIDpNYXAsIDptYXAKKyAgICAgIGxpc3QobWFwLnRvX2gudmFsdWVzLCA6Y29tbWEpCisgICAgZW5kCisgICAgZGVjbGFyZSA6bWFwX3ZhbHVlcywgWzptYXBdCisKKyAgICAjIFJldHVybnMgd2hldGhlciBhIG1hcCBoYXMgYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBrZXkuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbWFwLWhhcy1rZXkoKCJmb28iOiAxLCAiYmFyIjogMiksICJmb28iKSA9PiB0cnVlCisgICAgIyAgIG1hcC1oYXMta2V5KCgiZm9vIjogMSwgImJhciI6IDIpLCAiYmF6IikgPT4gZmFsc2UKKyAgICAjIEBvdmVybG9hZCBtYXBfaGFzX2tleSgkbWFwLCAka2V5KQorICAgICMgICBAcGFyYW0gJG1hcCBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TWFwXQorICAgICMgICBAcGFyYW0gJGtleSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2xdCisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGAkbWFwYCBpcyBub3QgYSBtYXAKKyAgICBkZWYgbWFwX2hhc19rZXkobWFwLCBrZXkpCisgICAgICBhc3NlcnRfdHlwZSBtYXAsIDpNYXAsIDptYXAKKyAgICAgIGJvb2wobWFwLnRvX2guaGFzX2tleT8oa2V5KSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDptYXBfaGFzX2tleSwgWzptYXAsIDprZXldCisKKyAgICAjIFJldHVybnMgdGhlIG1hcCBvZiBuYW1lZCBhcmd1bWVudHMgcGFzc2VkIHRvIGEgZnVuY3Rpb24gb3IgbWl4aW4gdGhhdAorICAgICMgdGFrZXMgYSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LiBUaGUgYXJndW1lbnQgbmFtZXMgYXJlIHN0cmluZ3MsIGFuZCB0aGV5CisgICAgIyBkbyBub3QgY29udGFpbiB0aGUgbGVhZGluZyBgJGAuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgQG1peGluIGZvbygkYXJncy4uLikgeworICAgICMgICAgIEBkZWJ1ZyBrZXl3b3JkcygkYXJncyk7IC8vPT4gKGFyZzE6IHZhbCwgYXJnMjogdmFsKQorICAgICMgICB9CisgICAgIworICAgICMgICBAaW5jbHVkZSBmb28oJGFyZzE6IHZhbCwgJGFyZzI6IHZhbCk7CisgICAgIyBAb3ZlcmxvYWQga2V5d29yZHMoJGFyZ3MpCisgICAgIyAgIEBwYXJhbSAkYXJncyBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QXJnTGlzdF0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok1hcF0KKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgYCRhcmdzYCBpc24ndCBhIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QKKyAgICBkZWYga2V5d29yZHMoYXJncykKKyAgICAgIGFzc2VydF90eXBlIGFyZ3MsIDpBcmdMaXN0LCA6YXJncworICAgICAgbWFwKFNhc3M6OlV0aWwubWFwX2tleXMoYXJncy5rZXl3b3Jkcy5hc19zdG9yZWQpIHt8a3wgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldyhrKX0pCisgICAgZW5kCisgICAgZGVjbGFyZSA6a2V5d29yZHMsIFs6YXJnc10KKworICAgICMgUmV0dXJucyBvbmUgb2YgdHdvIHZhbHVlcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGAkY29uZGl0aW9uYCBpcworICAgICMgdHJ1ZS4gSnVzdCBsaWtlIGluIGBAaWZgLCBhbGwgdmFsdWVzIG90aGVyIHRoYW4gYGZhbHNlYCBhbmQgYG51bGxgIGFyZQorICAgICMgY29uc2lkZXJlZCB0byBiZSB0cnVlLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGlmKHRydWUsIDFweCwgMnB4KSA9PiAxcHgKKyAgICAjICAgaWYoZmFsc2UsIDFweCwgMnB4KSA9PiAycHgKKyAgICAjIEBvdmVybG9hZCBpZigkY29uZGl0aW9uLCAkaWYtdHJ1ZSwgJGlmLWZhbHNlKQorICAgICMgICBAcGFyYW0gJGNvbmRpdGlvbiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0gV2hldGhlciB0aGUgYCRpZi10cnVlYCBvcgorICAgICMgICAgIGAkaWYtZmFsc2VgIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAjICAgQHBhcmFtICRpZi10cnVlIFtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGVdCisgICAgIyAgIEBwYXJhbSAkaWYtZmFsc2UgW1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZV0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2VdIGAkaWYtdHJ1ZWAgb3IgYCRpZi1mYWxzZWAKKyAgICBkZWYgaWYoY29uZGl0aW9uLCBpZl90cnVlLCBpZl9mYWxzZSkKKyAgICAgIGlmIGNvbmRpdGlvbi50b19ib29sCisgICAgICAgIHBlcmZvcm0oaWZfdHJ1ZSkKKyAgICAgIGVsc2UKKyAgICAgICAgcGVyZm9ybShpZl9mYWxzZSkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGRlY2xhcmUgOmlmLCBbOmNvbmRpdGlvbiwgOiImaWZfdHJ1ZSIsIDoiJmlmX2ZhbHNlIl0KKworICAgICMgUmV0dXJucyBhIHVuaXF1ZSBDU1MgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgaXMgcmV0dXJuZWQgYXMgYW4gdW5xdW90ZWQKKyAgICAjIHN0cmluZy4gVGhlIGlkZW50aWZpZXIgcmV0dXJuZWQgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSB3aXRoaW4gdGhlCisgICAgIyBzY29wZSBvZiBhIHNpbmdsZSBTYXNzIHJ1bi4KKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgdW5pcXVlX2lkKCkKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICBkZWYgdW5pcXVlX2lkCisgICAgICBnZW5lcmF0b3IgPSBTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9ucy5yYW5kb21fbnVtYmVyX2dlbmVyYXRvcgorICAgICAgVGhyZWFkLmN1cnJlbnRbOnNhc3NfbGFzdF91bmlxdWVfaWRdIHx8PSBnZW5lcmF0b3IucmFuZCgzNioqOCkKKyAgICAgICMgYXZvaWQgdGhlIHRlbXB0YXRpb24gb2YgdHJ5aW5nIHRvIGd1ZXNzIHRoZSBuZXh0IHVuaXF1ZSB2YWx1ZS4KKyAgICAgIHZhbHVlID0gKFRocmVhZC5jdXJyZW50WzpzYXNzX2xhc3RfdW5pcXVlX2lkXSArPSAoZ2VuZXJhdG9yLnJhbmQoMTApICsgMSkpCisgICAgICAjIHRoZSB1IG1ha2VzIHRoaXMgYSBsZWdhbCBpZGVudGlmaWVyIGlmIGl0IHdvdWxkIG90aGVyd2lzZSBzdGFydCB3aXRoIGEgbnVtYmVyLgorICAgICAgaWRlbnRpZmllcigidSIgKyB2YWx1ZS50b19zKDM2KS5yanVzdCg4LCAnMCcpKQorICAgIGVuZAorICAgIGRlY2xhcmUgOnVuaXF1ZV9pZCwgW10KKworICAgICMgRHluYW1pY2FsbHkgY2FsbHMgYSBmdW5jdGlvbi4gVGhpcyBjYW4gY2FsbCB1c2VyLWRlZmluZWQKKyAgICAjIGZ1bmN0aW9ucywgYnVpbHQtaW4gZnVuY3Rpb25zLCBvciBwbGFpbiBDU1MgZnVuY3Rpb25zLiBJdCB3aWxsCisgICAgIyBwYXNzIGFsb25nIGFsbCBhcmd1bWVudHMsIGluY2x1ZGluZyBrZXl3b3JkIGFyZ3VtZW50cywgdG8gdGhlCisgICAgIyBjYWxsZWQgZnVuY3Rpb24uCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgY2FsbChyZ2IsIDEwLCAxMDAsIDI1NSkgPT4gIzBhNjRmZgorICAgICMgICBjYWxsKHNjYWxlLWNvbG9yLCAjMGE2NGZmLCAkbGlnaHRuZXNzOiAtMTAlKSA9PiAjMDA1OGVmCisgICAgIworICAgICMgICAkZm46IG50aDsKKyAgICAjICAgY2FsbCgkZm4sIChhIGIgYyksIDIpID0+IGIKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgY2FsbCgkZnVuY3Rpb24sICRhcmdzLi4uKQorICAgICMgICBAcGFyYW0gJGZ1bmN0aW9uIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpGdW5jdGlvbl0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwuCisgICAgZGVmIGNhbGwobmFtZSwgKmFyZ3MpCisgICAgICB1bmxlc3MgbmFtZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpIHx8CisgICAgICAgICAgICAgbmFtZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpGdW5jdGlvbikKKyAgICAgICAgYXNzZXJ0X3R5cGUgbmFtZSwgOkZ1bmN0aW9uLCA6ZnVuY3Rpb24KKyAgICAgIGVuZAorICAgICAgaWYgbmFtZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpCisgICAgICAgIG5hbWUgPSBpZiBmdW5jdGlvbl9leGlzdHMobmFtZSkudG9fYm9vbAorICAgICAgICAgICAgICAgICBnZXRfZnVuY3Rpb24obmFtZSkKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgZ2V0X2Z1bmN0aW9uKG5hbWUsICJjc3MiID0+IGJvb2wodHJ1ZSkpCisgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4oPDxXQVJOSU5HKQorREVQUkVDQVRJT04gV0FSTklORzogUGFzc2luZyBhIHN0cmluZyB0byBjYWxsKCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBpbGxlZ2FsCitpbiBTYXNzIDQuMC4gVXNlIGNhbGwoI3tuYW1lLnRvX3Nhc3N9KSBpbnN0ZWFkLgorV0FSTklORworICAgICAgZW5kCisgICAgICBrd2FyZ3MgPSBhcmdzLmxhc3QuaXNfYT8oSGFzaCkgPyBhcmdzLnBvcCA6IHt9CisgICAgICBmdW5jYWxsID0gU2Fzczo6U2NyaXB0OjpUcmVlOjpGdW5jYWxsLm5ldygKKyAgICAgICAgbmFtZS52YWx1ZSwKKyAgICAgICAgYXJncy5tYXAge3xhfCBTYXNzOjpTY3JpcHQ6OlRyZWU6OkxpdGVyYWwubmV3KGEpfSwKKyAgICAgICAgU2Fzczo6VXRpbC5tYXBfdmFscyhrd2FyZ3MpIHt8dnwgU2Fzczo6U2NyaXB0OjpUcmVlOjpMaXRlcmFsLm5ldyh2KX0sCisgICAgICAgIG5pbCwKKyAgICAgICAgbmlsKQorICAgICAgZnVuY2FsbC5saW5lID0gZW52aXJvbm1lbnQuc3RhY2suZnJhbWVzLmxhc3QubGluZQorICAgICAgZnVuY2FsbC5maWxlbmFtZSA9IGVudmlyb25tZW50LnN0YWNrLmZyYW1lcy5sYXN0LmZpbGVuYW1lCisgICAgICBmdW5jYWxsLm9wdGlvbnMgPSBvcHRpb25zCisgICAgICBwZXJmb3JtKGZ1bmNhbGwpCisgICAgZW5kCisgICAgZGVjbGFyZSA6Y2FsbCwgWzpuYW1lXSwgOnZhcl9hcmdzID0+IHRydWUsIDp2YXJfa3dhcmdzID0+IHRydWUKKworICAgICMgVGhpcyBmdW5jdGlvbiBvbmx5IGV4aXN0cyBhcyBhIHdvcmthcm91bmQgZm9yIElFNydzIFtgY29udGVudDoKKyAgICAjIGNvdW50ZXJgIGJ1Z10oaHR0cDovL2plcy5zdC8yMDEzL2llN3MtY3NzLWJyZWFraW5nLWNvbnRlbnQtY291bnRlci1idWcvKS4KKyAgICAjIEl0IHdvcmtzIGlkZW50aWNhbGx5IHRvIGFueSBvdGhlciBwbGFpbi1DU1MgZnVuY3Rpb24sIGV4Y2VwdCBpdAorICAgICMgYXZvaWRzIGFkZGluZyBzcGFjZXMgYmV0d2VlbiB0aGUgYXJndW1lbnQgY29tbWFzLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGNvdW50ZXIoaXRlbSwgIi4iKSA9PiBjb3VudGVyKGl0ZW0sIi4iKQorICAgICMgQG92ZXJsb2FkIGNvdW50ZXIoJGFyZ3MuLi4pCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddCisgICAgZGVmIGNvdW50ZXIoKmFyZ3MpCisgICAgICBpZGVudGlmaWVyKCJjb3VudGVyKCN7YXJncy5tYXAge3xhfCBhLnRvX3Mob3B0aW9ucyl9LmpvaW4oJywnKX0pIikKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpjb3VudGVyLCBbXSwgOnZhcl9hcmdzID0+IHRydWUKKworICAgICMgVGhpcyBmdW5jdGlvbiBvbmx5IGV4aXN0cyBhcyBhIHdvcmthcm91bmQgZm9yIElFNydzIFtgY29udGVudDoKKyAgICAjIGNvdW50ZXJgIGJ1Z10oaHR0cDovL2plcy5zdC8yMDEzL2llN3MtY3NzLWJyZWFraW5nLWNvbnRlbnQtY291bnRlci1idWcvKS4KKyAgICAjIEl0IHdvcmtzIGlkZW50aWNhbGx5IHRvIGFueSBvdGhlciBwbGFpbi1DU1MgZnVuY3Rpb24sIGV4Y2VwdCBpdAorICAgICMgYXZvaWRzIGFkZGluZyBzcGFjZXMgYmV0d2VlbiB0aGUgYXJndW1lbnQgY29tbWFzLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIGNvdW50ZXJzKGl0ZW0sICIuIikgPT4gY291bnRlcnMoaXRlbSwiLiIpCisgICAgIyBAb3ZlcmxvYWQgY291bnRlcnMoJGFyZ3MuLi4pCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddCisgICAgZGVmIGNvdW50ZXJzKCphcmdzKQorICAgICAgaWRlbnRpZmllcigiY291bnRlcnMoI3thcmdzLm1hcCB7fGF8IGEudG9fcyhvcHRpb25zKX0uam9pbignLCcpfSkiKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmNvdW50ZXJzLCBbXSwgOnZhcl9hcmdzID0+IHRydWUKKworICAgICMgQ2hlY2sgd2hldGhlciBhIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzIGluIHRoZSBjdXJyZW50CisgICAgIyBzY29wZSBvciBpbiB0aGUgZ2xvYmFsIHNjb3BlLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgICRhLWZhbHNlLXZhbHVlOiBmYWxzZTsKKyAgICAjICAgdmFyaWFibGUtZXhpc3RzKGEtZmFsc2UtdmFsdWUpID0+IHRydWUKKyAgICAjICAgdmFyaWFibGUtZXhpc3RzKGEtbnVsbC12YWx1ZSkgPT4gdHJ1ZQorICAgICMKKyAgICAjICAgdmFyaWFibGUtZXhpc3RzKG5vbmV4aXN0ZW50KSA9PiBmYWxzZQorICAgICMKKyAgICAjIEBvdmVybG9hZCB2YXJpYWJsZV9leGlzdHMoJG5hbWUpCisgICAgIyAgIEBwYXJhbSAkbmFtZSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8KKyAgICAjICAgICBjaGVjay4gVGhlIG5hbWUgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBgJGAuCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sXSBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWZpbmVkIGluCisgICAgIyAgIHRoZSBjdXJyZW50IHNjb3BlLgorICAgIGRlZiB2YXJpYWJsZV9leGlzdHMobmFtZSkKKyAgICAgIGFzc2VydF90eXBlIG5hbWUsIDpTdHJpbmcsIDpuYW1lCisgICAgICBib29sKGVudmlyb25tZW50LmNhbGxlci52YXIobmFtZS52YWx1ZSkpCisgICAgZW5kCisgICAgZGVjbGFyZSA6dmFyaWFibGVfZXhpc3RzLCBbOm5hbWVdCisKKyAgICAjIENoZWNrIHdoZXRoZXIgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBpbiB0aGUgZ2xvYmFsCisgICAgIyBzY29wZSAoYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgZmlsZSkuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgJGEtZmFsc2UtdmFsdWU6IGZhbHNlOworICAgICMgICBnbG9iYWwtdmFyaWFibGUtZXhpc3RzKGEtZmFsc2UtdmFsdWUpID0+IHRydWUKKyAgICAjICAgZ2xvYmFsLXZhcmlhYmxlLWV4aXN0cyhhLW51bGwtdmFsdWUpID0+IHRydWUKKyAgICAjCisgICAgIyAgIC5mb28geworICAgICMgICAgICRzb21lLXZhcjogZmFsc2U7CisgICAgIyAgICAgQGlmIGdsb2JhbC12YXJpYWJsZS1leGlzdHMoc29tZS12YXIpIHsgLyogZmFsc2UsIGRvZXNuJ3QgcnVuICovIH0KKyAgICAjICAgfQorICAgICMKKyAgICAjIEBvdmVybG9hZCBnbG9iYWxfdmFyaWFibGVfZXhpc3RzKCRuYW1lKQorICAgICMgICBAcGFyYW0gJG5hbWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvCisgICAgIyAgICAgY2hlY2suIFRoZSBuYW1lIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgYCRgLgorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbF0gV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVmaW5lZCBpbgorICAgICMgICB0aGUgZ2xvYmFsIHNjb3BlLgorICAgIGRlZiBnbG9iYWxfdmFyaWFibGVfZXhpc3RzKG5hbWUpCisgICAgICBhc3NlcnRfdHlwZSBuYW1lLCA6U3RyaW5nLCA6bmFtZQorICAgICAgYm9vbChlbnZpcm9ubWVudC5nbG9iYWxfZW52LnZhcihuYW1lLnZhbHVlKSkKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpnbG9iYWxfdmFyaWFibGVfZXhpc3RzLCBbOm5hbWVdCisKKyAgICAjIENoZWNrIHdoZXRoZXIgYSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cy4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBmdW5jdGlvbi1leGlzdHMobGlnaHRlbikgPT4gdHJ1ZQorICAgICMKKyAgICAjICAgQGZ1bmN0aW9uIG15ZnVuYyB7IEByZXR1cm4gInNvbWV0aGluZyI7IH0KKyAgICAjICAgZnVuY3Rpb24tZXhpc3RzKG15ZnVuYykgPT4gdHJ1ZQorICAgICMKKyAgICAjIEBvdmVybG9hZCBmdW5jdGlvbl9leGlzdHMoJG5hbWUpCisgICAgIyAgIEBwYXJhbSBuYW1lIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0bworICAgICMgICAgIGNoZWNrIG9yIGEgZnVuY3Rpb24gcmVmZXJlbmNlLgorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbF0gV2hldGhlciB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZC4KKyAgICBkZWYgZnVuY3Rpb25fZXhpc3RzKG5hbWUpCisgICAgICBhc3NlcnRfdHlwZSBuYW1lLCA6U3RyaW5nLCA6bmFtZQorICAgICAgZXhpc3RzID0gU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnMuY2FsbGFibGU/KG5hbWUudmFsdWUudHIoIi0iLCAiXyIpKQorICAgICAgZXhpc3RzIHx8PSBlbnZpcm9ubWVudC5jYWxsZXIuZnVuY3Rpb24obmFtZS52YWx1ZSkKKyAgICAgIGJvb2woZXhpc3RzKQorICAgIGVuZAorICAgIGRlY2xhcmUgOmZ1bmN0aW9uX2V4aXN0cywgWzpuYW1lXQorCisgICAgIyBDaGVjayB3aGV0aGVyIGEgbWl4aW4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgbWl4aW4tZXhpc3RzKG5vbmV4aXN0ZW50KSA9PiBmYWxzZQorICAgICMKKyAgICAjICAgQG1peGluIHJlZC10ZXh0IHsgY29sb3I6IHJlZDsgfQorICAgICMgICBtaXhpbi1leGlzdHMocmVkLXRleHQpID0+IHRydWUKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgbWl4aW5fZXhpc3RzKCRuYW1lKQorICAgICMgICBAcGFyYW0gbmFtZSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXSBUaGUgbmFtZSBvZiB0aGUgbWl4aW4gdG8KKyAgICAjICAgICBjaGVjay4KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2xdIFdoZXRoZXIgdGhlIG1peGluIGlzIGRlZmluZWQuCisgICAgZGVmIG1peGluX2V4aXN0cyhuYW1lKQorICAgICAgYXNzZXJ0X3R5cGUgbmFtZSwgOlN0cmluZywgOm5hbWUKKyAgICAgIGJvb2woZW52aXJvbm1lbnQubWl4aW4obmFtZS52YWx1ZSkpCisgICAgZW5kCisgICAgZGVjbGFyZSA6bWl4aW5fZXhpc3RzLCBbOm5hbWVdCisKKyAgICAjIENoZWNrIHdoZXRoZXIgYSBtaXhpbiB3YXMgcGFzc2VkIGEgY29udGVudCBibG9jay4KKyAgICAjCisgICAgIyBVbmxlc3MgYGNvbnRlbnQtZXhpc3RzKClgIGlzIGNhbGxlZCBkaXJlY3RseSBmcm9tIGEgbWl4aW4sIGFuIGVycm9yIHdpbGwgYmUgcmFpc2VkLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIEBtaXhpbiBuZWVkcy1jb250ZW50IHsKKyAgICAjICAgICBAaWYgbm90IGNvbnRlbnQtZXhpc3RzKCkgeworICAgICMgICAgICAgQGVycm9yICJZb3UgbXVzdCBwYXNzIGEgY29udGVudCBibG9jayEiCisgICAgIyAgICAgfQorICAgICMgICAgIEBjb250ZW50OworICAgICMgICB9CisgICAgIworICAgICMgQG92ZXJsb2FkIGNvbnRlbnRfZXhpc3RzKCkKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2xdIFdoZXRoZXIgYSBjb250ZW50IGJsb2NrIHdhcyBwYXNzZWQgdG8gdGhlIG1peGluLgorICAgIGRlZiBjb250ZW50X2V4aXN0cworICAgICAgIyBmcmFtZXMubGFzdCBpcyB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgZnVuY3Rpb24sCisgICAgICAjIHNvIHdlIHVzZSBmcmFtZXNbLTJdIHRvIGdldCB0aGUgZnJhbWUgYmVmb3JlIHRoYXQuCisgICAgICBtaXhpbl9mcmFtZSA9IGVudmlyb25tZW50LnN0YWNrLmZyYW1lc1stMl0KKyAgICAgIHVubGVzcyBtaXhpbl9mcmFtZSAmJiBtaXhpbl9mcmFtZS50eXBlID09IDptaXhpbgorICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIkNhbm5vdCBjYWxsIGNvbnRlbnQtZXhpc3RzKCkgZXhjZXB0IHdpdGhpbiBhIG1peGluLiIpCisgICAgICBlbmQKKyAgICAgIGJvb2woIWVudmlyb25tZW50LmNhbGxlci5jb250ZW50Lm5pbD8pCisgICAgZW5kCisgICAgZGVjbGFyZSA6Y29udGVudF9leGlzdHMsIFtdCisKKyAgICAjIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZSBhcyBpdHMgU2FzcyByZXByZXNlbnRhdGlvbi4KKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgaW5zcGVjdCgkdmFsdWUpCisgICAgIyAgIEBwYXJhbSAkdmFsdWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2VdIFRoZSB2YWx1ZSB0byBpbnNwZWN0LgorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXSBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBhcworICAgICMgICBpdCB3b3VsZCBiZSB3cml0dGVuIGluIFNhc3MuCisgICAgZGVmIGluc3BlY3QodmFsdWUpCisgICAgICB2YWx1ZS5jaGVja19kZXByZWNhdGVkX2ludGVycCBpZiB2YWx1ZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpCisgICAgICB1bnF1b3RlZF9zdHJpbmcodmFsdWUudG9fc2FzcykKKyAgICBlbmQKKyAgICBkZWNsYXJlIDppbnNwZWN0LCBbOnZhbHVlXQorCisgICAgIyBAb3ZlcmxvYWQgcmFuZG9tKCkKKyAgICAjICAgUmV0dXJuIGEgZGVjaW1hbCBiZXR3ZWVuIDAgYW5kIDEsIGluY2x1c2l2ZSBvZiAwIGJ1dCBub3QgMS4KKyAgICAjICAgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBBIGRlY2ltYWwgdmFsdWUuCisgICAgIyBAb3ZlcmxvYWQgcmFuZG9tKCRsaW1pdCkKKyAgICAjICAgUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCBgJGxpbWl0YCwgaW5jbHVzaXZlIG9mIGJvdGggMSBhbmQgYCRsaW1pdGAuCisgICAgIyAgIEBwYXJhbSAkbGltaXQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIG1heGltdW0gb2YgdGhlIHJhbmRvbSBpbnRlZ2VyIHRvIGJlCisgICAgIyAgICAgcmV0dXJuZWQsIGEgcG9zaXRpdmUgaW50ZWdlci4KKyAgICAjICAgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyXSBBbiBpbnRlZ2VyLgorICAgICMgICBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIHRoZSBgJGxpbWl0YCBpcyBub3QgMSBvciBncmVhdGVyCisgICAgZGVmIHJhbmRvbShsaW1pdCA9IG5pbCkKKyAgICAgIGdlbmVyYXRvciA9IFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zLnJhbmRvbV9udW1iZXJfZ2VuZXJhdG9yCisgICAgICBpZiBsaW1pdAorICAgICAgICBhc3NlcnRfaW50ZWdlciBsaW1pdCwgImxpbWl0IgorICAgICAgICBpZiBsaW1pdC50b19pIDwgMQorICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCIkbGltaXQgI3tsaW1pdH0gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpCisgICAgICAgIGVuZAorICAgICAgICBudW1iZXIoMSArIGdlbmVyYXRvci5yYW5kKGxpbWl0LnRvX2kpKQorICAgICAgZWxzZQorICAgICAgICBudW1iZXIoZ2VuZXJhdG9yLnJhbmQpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBkZWNsYXJlIDpyYW5kb20sIFtdCisgICAgZGVjbGFyZSA6cmFuZG9tLCBbOmxpbWl0XQorCisgICAgIyBQYXJzZXMgYSB1c2VyLXByb3ZpZGVkIHNlbGVjdG9yIGludG8gYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MKKyAgICAjIGFzIHJldHVybmVkIGJ5IGAmYC4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBzZWxlY3Rvci1wYXJzZSgiLmZvbyAuYmFyLCAuYmF6IC5iYW5nIikgPT4gKCcuZm9vJyAnLmJhcicsICcuYmF6JyAnLmJhbmcnKQorICAgICMKKyAgICAjIEBvdmVybG9hZCBzZWxlY3Rvcl9wYXJzZSgkc2VsZWN0b3IpCisgICAgIyAgIEBwYXJhbSAkc2VsZWN0b3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZywgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdF0KKyAgICAjICAgICBUaGUgc2VsZWN0b3IgdG8gcGFyc2UuIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZywgYSBsaXN0IG9mCisgICAgIyAgICAgc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgYXMgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgICBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgICAgIEEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBgJHNlbGVjdG9yYC4gVGhpcyBpcworICAgICMgICAgIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBhIHNlbGVjdG9yIHJldHVybmVkIGJ5IGAmYC4KKyAgICBkZWYgc2VsZWN0b3JfcGFyc2Uoc2VsZWN0b3IpCisgICAgICBwYXJzZV9zZWxlY3RvcihzZWxlY3RvciwgOnNlbGVjdG9yKS50b19zYXNzX3NjcmlwdAorICAgIGVuZAorICAgIGRlY2xhcmUgOnNlbGVjdG9yX3BhcnNlLCBbOnNlbGVjdG9yXQorCisgICAgIyBSZXR1cm4gYSBuZXcgc2VsZWN0b3Igd2l0aCBhbGwgc2VsZWN0b3JzIGluIGAkc2VsZWN0b3JzYCBuZXN0ZWQgYmVuZWF0aAorICAgICMgb25lIGFub3RoZXIgYXMgdGhvdWdoIHRoZXkgaGFkIGJlZW4gbmVzdGVkIGluIHRoZSBzdHlsZXNoZWV0IGFzCisgICAgIyBgJHNlbGVjdG9yMSB7ICRzZWxlY3RvcjIgeyAuLi4gfSB9YC4KKyAgICAjCisgICAgIyBVbmxpa2UgbW9zdCBzZWxlY3RvciBmdW5jdGlvbnMsIGBzZWxlY3Rvci1uZXN0YCBhbGxvd3MgdGhlCisgICAgIyBwYXJlbnQgc2VsZWN0b3IgYCZgIHRvIGJlIHVzZWQgaW4gYW55IHNlbGVjdG9yIGJ1dCB0aGUgZmlyc3QuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgc2VsZWN0b3ItbmVzdCgiLmZvbyIsICIuYmFyIiwgIi5iYXoiKSA9PiAuZm9vIC5iYXIgLmJhegorICAgICMgICBzZWxlY3Rvci1uZXN0KCIuYSAuZm9vIiwgIi5iIC5iYXIiKSA9PiAuYSAuZm9vIC5iIC5iYXIKKyAgICAjICAgc2VsZWN0b3ItbmVzdCgiLmZvbyIsICImLmJhciIpID0+IC5mb28uYmFyCisgICAgIworICAgICMgQG92ZXJsb2FkIHNlbGVjdG9yX25lc3QoJHNlbGVjdG9ycy4uLikKKyAgICAjICAgQHBhcmFtICRzZWxlY3RvcnMgW1tTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdXQorICAgICMgICAgIFRoZSBzZWxlY3RvcnMgdG8gbmVzdC4gQXQgbGVhc3Qgb25lIHNlbGVjdG9yIG11c3QgYmUgcGFzc2VkLiBFYWNoIG9mCisgICAgIyAgICAgdGhlc2UgY2FuIGJlIGVpdGhlciBhIHN0cmluZywgYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZgorICAgICMgICAgIHN0cmluZ3MgYXMgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgICBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgICAgIEEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIG5lc3RpbmcKKyAgICAjICAgICBgJHNlbGVjdG9yc2AuIFRoaXMgaXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIGEgc2VsZWN0b3IgcmV0dXJuZWQgYnkKKyAgICAjICAgICBgJmAuCisgICAgZGVmIHNlbGVjdG9yX25lc3QoKnNlbGVjdG9ycykKKyAgICAgIGlmIHNlbGVjdG9ycy5lbXB0eT8KKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIiRzZWxlY3RvcnM6IEF0IGxlYXN0IG9uZSBzZWxlY3RvciBtdXN0IGJlIHBhc3NlZCIpCisgICAgICBlbmQKKworICAgICAgcGFyc2VkID0gW3BhcnNlX3NlbGVjdG9yKHNlbGVjdG9ycy5maXJzdCwgOnNlbGVjdG9ycyldCisgICAgICBwYXJzZWQgKz0gc2VsZWN0b3JzWzEuLi0xXS5tYXAge3xzZWx8IHBhcnNlX3NlbGVjdG9yKHNlbCwgOnNlbGVjdG9ycywgdHJ1ZSl9CisgICAgICBwYXJzZWQuaW5qZWN0IHt8cmVzdWx0LCBjaGlsZHwgY2hpbGQucmVzb2x2ZV9wYXJlbnRfcmVmcyhyZXN1bHQpfS50b19zYXNzX3NjcmlwdAorICAgIGVuZAorICAgIGRlY2xhcmUgOnNlbGVjdG9yX25lc3QsIFtdLCA6dmFyX2FyZ3MgPT4gdHJ1ZQorCisgICAgIyBSZXR1cm4gYSBuZXcgc2VsZWN0b3Igd2l0aCBhbGwgc2VsZWN0b3JzIGluIGAkc2VsZWN0b3JzYCBhcHBlbmRlZCBvbmUKKyAgICAjIGFub3RoZXIgYXMgdGhvdWdoIHRoZXkgaGFkIGJlZW4gbmVzdGVkIGluIHRoZSBzdHlsZXNoZWV0IGFzIGAkc2VsZWN0b3IxIHsKKyAgICAjICYkc2VsZWN0b3IyIHsgLi4uIH0gfWAuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgc2VsZWN0b3ItYXBwZW5kKCIuZm9vIiwgIi5iYXIiLCAiLmJheiIpID0+IC5mb28uYmFyLmJhegorICAgICMgICBzZWxlY3Rvci1hcHBlbmQoIi5hIC5mb28iLCAiLmIgLmJhciIpID0+ICJhIC5mb28uYiAuYmFyIgorICAgICMgICBzZWxlY3Rvci1hcHBlbmQoIi5mb28iLCAiLXN1ZmZpeCIpID0+ICIuZm9vLXN1ZmZpeCIKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgc2VsZWN0b3JfYXBwZW5kKCRzZWxlY3RvcnMuLi4pCisgICAgIyAgIEBwYXJhbSAkc2VsZWN0b3JzIFtbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XV0KKyAgICAjICAgICBUaGUgc2VsZWN0b3JzIHRvIGFwcGVuZC4gQXQgbGVhc3Qgb25lIHNlbGVjdG9yIG11c3QgYmUgcGFzc2VkLiBFYWNoIG9mCisgICAgIyAgICAgdGhlc2UgY2FuIGJlIGVpdGhlciBhIHN0cmluZywgYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZgorICAgICMgICAgIHN0cmluZ3MgYXMgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgICBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgICAgIEEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGFwcGVuZGluZworICAgICMgICAgIGAkc2VsZWN0b3JzYC4gVGhpcyBpcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgYSBzZWxlY3RvciByZXR1cm5lZCBieQorICAgICMgICAgIGAmYC4KKyAgICAjICAgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBhIHNlbGVjdG9yIGNvdWxkIG5vdCBiZSBhcHBlbmRlZC4KKyAgICBkZWYgc2VsZWN0b3JfYXBwZW5kKCpzZWxlY3RvcnMpCisgICAgICBpZiBzZWxlY3RvcnMuZW1wdHk/CisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCIkc2VsZWN0b3JzOiBBdCBsZWFzdCBvbmUgc2VsZWN0b3IgbXVzdCBiZSBwYXNzZWQiKQorICAgICAgZW5kCisKKyAgICAgIHNlbGVjdG9ycy5tYXAge3xzZWx8IHBhcnNlX3NlbGVjdG9yKHNlbCwgOnNlbGVjdG9ycyl9LmluamVjdCBkbyB8cGFyZW50LCBjaGlsZHwKKyAgICAgICAgY2hpbGQubWVtYmVycy5lYWNoIGRvIHxzZXF8CisgICAgICAgICAgc3NlcSA9IHNlcS5tZW1iZXJzLmZpcnN0CisgICAgICAgICAgdW5sZXNzIHNzZXEuaXNfYT8oU2Fzczo6U2VsZWN0b3I6OlNpbXBsZVNlcXVlbmNlKQorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIkNhbid0IGFwcGVuZCBcIiN7c2VxfVwiIHRvIFwiI3twYXJlbnR9XCIiKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgYmFzZSA9IHNzZXEuYmFzZQorICAgICAgICAgIGNhc2UgYmFzZQorICAgICAgICAgIHdoZW4gU2Fzczo6U2VsZWN0b3I6OlVuaXZlcnNhbAorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIkNhbid0IGFwcGVuZCBcIiN7c2VxfVwiIHRvIFwiI3twYXJlbnR9XCIiKQorICAgICAgICAgIHdoZW4gU2Fzczo6U2VsZWN0b3I6OkVsZW1lbnQKKyAgICAgICAgICAgIHVubGVzcyBiYXNlLm5hbWVzcGFjZS5uaWw/CisgICAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJDYW4ndCBhcHBlbmQgXCIje3NlcX1cIiB0byBcIiN7cGFyZW50fVwiIikKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgc3NlcS5tZW1iZXJzWzBdID0gU2Fzczo6U2VsZWN0b3I6OlBhcmVudC5uZXcoYmFzZS5uYW1lKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNzZXEubWVtYmVycy51bnNoaWZ0IFNhc3M6OlNlbGVjdG9yOjpQYXJlbnQubmV3CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBjaGlsZC5yZXNvbHZlX3BhcmVudF9yZWZzKHBhcmVudCkKKyAgICAgIGVuZC50b19zYXNzX3NjcmlwdAorICAgIGVuZAorICAgIGRlY2xhcmUgOnNlbGVjdG9yX2FwcGVuZCwgW10sIDp2YXJfYXJncyA9PiB0cnVlCisKKyAgICAjIFJldHVybnMgYSBuZXcgdmVyc2lvbiBvZiBgJHNlbGVjdG9yYCB3aXRoIGAkZXh0ZW5kZWVgIGV4dGVuZGVkCisgICAgIyB3aXRoIGAkZXh0ZW5kZXJgLiBUaGlzIHdvcmtzIGp1c3QgbGlrZSB0aGUgcmVzdWx0IG9mCisgICAgIworICAgICMgICAgICRzZWxlY3RvciB7IC4uLiB9CisgICAgIyAgICAgJGV4dGVuZGVyIHsgQGV4dGVuZCAkZXh0ZW5kZWUgfQorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHNlbGVjdG9yLWV4dGVuZCgiLmEgLmIiLCAiLmIiLCAiLmZvbyAuYmFyIikgPT4gLmEgLmIsIC5hIC5mb28gLmJhciwgLmZvbyAuYSAuYmFyCisgICAgIworICAgICMgQG92ZXJsb2FkIHNlbGVjdG9yX2V4dGVuZCgkc2VsZWN0b3IsICRleHRlbmRlZSwgJGV4dGVuZGVyKQorICAgICMgICBAcGFyYW0gJHNlbGVjdG9yIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdCisgICAgIyAgICAgVGhlIHNlbGVjdG9yIHdpdGhpbiB3aGljaCBgJGV4dGVuZGVlYCBpcyBleHRlbmRlZCB3aXRoCisgICAgIyAgICAgYCRleHRlbmRlcmAuIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZywgYSBsaXN0IG9mIHN0cmluZ3MsCisgICAgIyAgICAgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgYXMgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgICBAcGFyYW0gJGV4dGVuZGVlIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdCisgICAgIyAgICAgVGhlIHNlbGVjdG9yIGJlaW5nIGV4dGVuZGVkLiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcsIGEKKyAgICAjICAgICBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIGFzIHJldHVybmVkCisgICAgIyAgICAgYnkgYCZgLgorICAgICMgICBAcGFyYW0gJGV4dGVuZGVyIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdCisgICAgIyAgICAgVGhlIHNlbGVjdG9yIGJlaW5nIGluamVjdGVkIGludG8gYCRzZWxlY3RvcmAuIFRoaXMgY2FuIGJlCisgICAgIyAgICAgZWl0aGVyIGEgc3RyaW5nLCBhIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mCisgICAgIyAgICAgc3RyaW5ncyBhcyByZXR1cm5lZCBieSBgJmAuCisgICAgIyAgIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdCisgICAgIyAgICAgQSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgdGhlCisgICAgIyAgICAgZXh0ZW5zaW9uLiBUaGlzIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBhIHNlbGVjdG9yIHJldHVybmVkCisgICAgIyAgICAgYnkgYCZgLgorICAgICMgICBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIHRoZSBleHRlbnNpb24gZmFpbHMKKyAgICBkZWYgc2VsZWN0b3JfZXh0ZW5kKHNlbGVjdG9yLCBleHRlbmRlZSwgZXh0ZW5kZXIpCisgICAgICBzZWxlY3RvciA9IHBhcnNlX3NlbGVjdG9yKHNlbGVjdG9yLCA6c2VsZWN0b3IpCisgICAgICBleHRlbmRlZSA9IHBhcnNlX3NlbGVjdG9yKGV4dGVuZGVlLCA6ZXh0ZW5kZWUpCisgICAgICBleHRlbmRlciA9IHBhcnNlX3NlbGVjdG9yKGV4dGVuZGVyLCA6ZXh0ZW5kZXIpCisKKyAgICAgIGV4dGVuZHMgPSBTYXNzOjpVdGlsOjpTdWJzZXRNYXAubmV3CisgICAgICBiZWdpbgorICAgICAgICBleHRlbmRlci5wb3B1bGF0ZV9leHRlbmRzKGV4dGVuZHMsIGV4dGVuZGVlLCBuaWwsIFtdLCB0cnVlKQorICAgICAgICBzZWxlY3Rvci5kb19leHRlbmQoZXh0ZW5kcykudG9fc2Fzc19zY3JpcHQKKyAgICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KGUudG9fcykKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGRlY2xhcmUgOnNlbGVjdG9yX2V4dGVuZCwgWzpzZWxlY3RvciwgOmV4dGVuZGVlLCA6ZXh0ZW5kZXJdCisKKyAgICAjIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgYCRvcmlnaW5hbGAgd2l0aCBgJHJlcGxhY2VtZW50YCBpbiBgJHNlbGVjdG9yYAorICAgICMKKyAgICAjIFRoaXMgd29ya3MgYnkgdXNpbmcgYEBleHRlbmRgIGFuZCB0aHJvd2luZyBhd2F5IHRoZSBvcmlnaW5hbAorICAgICMgc2VsZWN0b3IuIFRoaXMgbWVhbnMgdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBkbyB2ZXJ5IGFkdmFuY2VkCisgICAgIyByZXBsYWNlbWVudHM7IHNlZSB0aGUgZXhhbXBsZXMgYmVsb3cuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgc2VsZWN0b3ItcmVwbGFjZSgiLmZvbyAuYmFyIiwgIi5iYXIiLCAiLmJheiIpID0+ICIuZm9vIC5iYXoiCisgICAgIyAgIHNlbGVjdG9yLXJlcGxhY2UoIi5mb28uYmFyLmJheiIsICIuZm9vLmJheiIsICIucXV4IikgPT4gIi5iYXIucXV4IgorICAgICMKKyAgICAjIEBvdmVybG9hZCBzZWxlY3Rvcl9yZXBsYWNlKCRzZWxlY3RvciwgJG9yaWdpbmFsLCAkcmVwbGFjZW1lbnQpCisgICAgIyAgIEBwYXJhbSAkc2VsZWN0b3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZywgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdF0KKyAgICAjICAgICBUaGUgc2VsZWN0b3Igd2l0aGluIHdoaWNoIGAkb3JpZ2luYWxgIGlzIHJlcGxhY2VkIHdpdGgKKyAgICAjICAgICBgJHJlcGxhY2VtZW50YC4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nLCBhIGxpc3Qgb2YKKyAgICAjICAgICBzdHJpbmdzLCBvciBhIGxpc3Qgb2YgbGlzdHMgb2Ygc3RyaW5ncyBhcyByZXR1cm5lZCBieSBgJmAuCisgICAgIyAgIEBwYXJhbSAkb3JpZ2luYWwgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZywgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdF0KKyAgICAjICAgICBUaGUgc2VsZWN0b3IgYmVpbmcgcmVwbGFjZWQuIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZywgYQorICAgICMgICAgIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgYXMgcmV0dXJuZWQKKyAgICAjICAgICBieSBgJmAuCisgICAgIyAgIEBwYXJhbSAkcmVwbGFjZW1lbnQgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZywgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdF0KKyAgICAjICAgICBUaGUgc2VsZWN0b3IgdGhhdCBgJG9yaWdpbmFsYCBpcyBiZWluZyByZXBsYWNlZCB3aXRoLiBUaGlzCisgICAgIyAgICAgY2FuIGJlIGVpdGhlciBhIHN0cmluZywgYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZgorICAgICMgICAgIGxpc3RzIG9mIHN0cmluZ3MgYXMgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgICBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgICAgIEEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIHRoZQorICAgICMgICAgIGV4dGVuc2lvbi4gVGhpcyBpcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgYSBzZWxlY3RvciByZXR1cm5lZAorICAgICMgICAgIGJ5IGAmYC4KKyAgICAjICAgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiB0aGUgcmVwbGFjZW1lbnQgZmFpbHMKKyAgICBkZWYgc2VsZWN0b3JfcmVwbGFjZShzZWxlY3Rvciwgb3JpZ2luYWwsIHJlcGxhY2VtZW50KQorICAgICAgc2VsZWN0b3IgPSBwYXJzZV9zZWxlY3RvcihzZWxlY3RvciwgOnNlbGVjdG9yKQorICAgICAgb3JpZ2luYWwgPSBwYXJzZV9zZWxlY3RvcihvcmlnaW5hbCwgOm9yaWdpbmFsKQorICAgICAgcmVwbGFjZW1lbnQgPSBwYXJzZV9zZWxlY3RvcihyZXBsYWNlbWVudCwgOnJlcGxhY2VtZW50KQorCisgICAgICBleHRlbmRzID0gU2Fzczo6VXRpbDo6U3Vic2V0TWFwLm5ldworICAgICAgYmVnaW4KKyAgICAgICAgcmVwbGFjZW1lbnQucG9wdWxhdGVfZXh0ZW5kcyhleHRlbmRzLCBvcmlnaW5hbCwgbmlsLCBbXSwgdHJ1ZSkKKyAgICAgICAgc2VsZWN0b3IuZG9fZXh0ZW5kKGV4dGVuZHMsIFtdLCB0cnVlKS50b19zYXNzX3NjcmlwdAorICAgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoZS50b19zKQorICAgICAgZW5kCisgICAgZW5kCisgICAgZGVjbGFyZSA6c2VsZWN0b3JfcmVwbGFjZSwgWzpzZWxlY3RvciwgOm9yaWdpbmFsLCA6cmVwbGFjZW1lbnRdCisKKyAgICAjIFVuaWZpZXMgdHdvIHNlbGVjdG9ycyBpbnRvIGEgc2luZ2xlIHNlbGVjdG9yIHRoYXQgbWF0Y2hlcyBvbmx5CisgICAgIyBlbGVtZW50cyBtYXRjaGVkIGJ5IGJvdGggaW5wdXQgc2VsZWN0b3JzLiBSZXR1cm5zIGBudWxsYCBpZgorICAgICMgdGhlcmUgaXMgbm8gc3VjaCBzZWxlY3Rvci4KKyAgICAjCisgICAgIyBMaWtlIHRoZSBzZWxlY3RvciB1bmlmaWNhdGlvbiBkb25lIGZvciBgQGV4dGVuZGAsIHRoaXMgZG9lc24ndAorICAgICMgZ3VhcmFudGVlIHRoYXQgdGhlIG91dHB1dCBzZWxlY3RvciB3aWxsIG1hdGNoICphbGwqIGVsZW1lbnRzCisgICAgIyBtYXRjaGVkIGJ5IGJvdGggaW5wdXQgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgaWYgYC5hIC5iYCBpcworICAgICMgdW5pZmllZCB3aXRoIGAueCAueWAsIGAuYSAueCAuYi55LCAueCAuYSAuYi55YCB3aWxsIGJlIHJldHVybmVkLAorICAgICMgYnV0IGAuYS54IC5iLnlgIHdpbGwgbm90LiBUaGlzIGF2b2lkcyBleHBvbmVudGlhbCBvdXRwdXQgc2l6ZQorICAgICMgd2hpbGUgbWF0Y2hpbmcgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGxpa2VseSB0byBleGlzdCBpbgorICAgICMgcHJhY3RpY2UuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgc2VsZWN0b3ItdW5pZnkoIi5hIiwgIi5iIikgPT4gLmEuYgorICAgICMgICBzZWxlY3Rvci11bmlmeSgiLmEgLmIiLCAiLnggLnkiKSA9PiAuYSAueCAuYi55LCAueCAuYSAuYi55CisgICAgIyAgIHNlbGVjdG9yLXVuaWZ5KCIuYS5iIiwgIi5iLmMiKSA9PiAuYS5iLmMKKyAgICAjICAgc2VsZWN0b3ItdW5pZnkoIiNhIiwgIiNiIikgPT4gbnVsbAorICAgICMKKyAgICAjIEBvdmVybG9hZCBzZWxlY3Rvcl91bmlmeSgkc2VsZWN0b3IxLCAkc2VsZWN0b3IyKQorICAgICMgICBAcGFyYW0gJHNlbGVjdG9yMSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgICAgIFRoZSBmaXJzdCBzZWxlY3RvciB0byBiZSB1bmlmaWVkLiBUaGlzIGNhbiBiZSBlaXRoZXIgYQorICAgICMgICAgIHN0cmluZywgYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIGFzCisgICAgIyAgICAgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgICBAcGFyYW0gJHNlbGVjdG9yMiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgICAgIFRoZSBzZWNvbmQgc2VsZWN0b3IgdG8gYmUgdW5pZmllZC4gVGhpcyBjYW4gYmUgZWl0aGVyIGEKKyAgICAjICAgICBzdHJpbmcsIGEgbGlzdCBvZiBzdHJpbmdzLCBvciBhIGxpc3Qgb2YgbGlzdHMgb2Ygc3RyaW5ncyBhcworICAgICMgICAgIHJldHVybmVkIGJ5IGAmYC4KKyAgICAjICAgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdCwgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVsbF0KKyAgICAjICAgICBBIGxpc3Qgb2YgbGlzdHMgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAjICAgICB1bmlmaWNhdGlvbiwgb3IgbnVsbCBpZiBubyB1bmlmaWNhdGlvbiBleGlzdHMuIFRoaXMgaXMgaW4KKyAgICAjICAgICB0aGUgc2FtZSBmb3JtYXQgYXMgYSBzZWxlY3RvciByZXR1cm5lZCBieSBgJmAuCisgICAgZGVmIHNlbGVjdG9yX3VuaWZ5KHNlbGVjdG9yMSwgc2VsZWN0b3IyKQorICAgICAgc2VsZWN0b3IxID0gcGFyc2Vfc2VsZWN0b3Ioc2VsZWN0b3IxLCA6c2VsZWN0b3IxKQorICAgICAgc2VsZWN0b3IyID0gcGFyc2Vfc2VsZWN0b3Ioc2VsZWN0b3IyLCA6c2VsZWN0b3IyKQorICAgICAgcmV0dXJuIG51bGwgdW5sZXNzICh1bmlmaWVkID0gc2VsZWN0b3IxLnVuaWZ5KHNlbGVjdG9yMikpCisgICAgICB1bmlmaWVkLnRvX3Nhc3Nfc2NyaXB0CisgICAgZW5kCisgICAgZGVjbGFyZSA6c2VsZWN0b3JfdW5pZnksIFs6c2VsZWN0b3IxLCA6c2VsZWN0b3IyXQorCisgICAgIyBSZXR1cm5zIHRoZSBbc2ltcGxlCisgICAgIyBzZWxlY3RvcnNdKGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL3NlbGVjdG9yczQvI3NpbXBsZSkgdGhhdAorICAgICMgY29tcHJpc2UgdGhlIGNvbXBvdW5kIHNlbGVjdG9yIGAkc2VsZWN0b3JgLgorICAgICMKKyAgICAjIE5vdGUgdGhhdCBgJHNlbGVjdG9yYCAqKm11c3QgYmUqKiBhIFtjb21wb3VuZAorICAgICMgc2VsZWN0b3JdKGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL3NlbGVjdG9yczQvI2NvbXBvdW5kKS4gVGhhdAorICAgICMgbWVhbnMgaXQgY2Fubm90IGNvbnRhaW4gY29tbWFzIG9yIHNwYWNlcy4gSXQgYWxzbyBtZWFucyB0aGF0CisgICAgIyB1bmxpa2Ugb3RoZXIgc2VsZWN0b3IgZnVuY3Rpb25zLCB0aGlzIHRha2VzIG9ubHkgc3RyaW5ncywgbm90CisgICAgIyBsaXN0cy4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBzaW1wbGUtc2VsZWN0b3JzKCIuZm9vLmJhciIpID0+ICIuZm9vIiwgIi5iYXIiCisgICAgIyAgIHNpbXBsZS1zZWxlY3RvcnMoIi5mb28uYmFyLmJheiIpID0+ICIuZm9vIiwgIi5iYXIiLCAiLmJheiIKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgc2ltcGxlX3NlbGVjdG9ycygkc2VsZWN0b3IpCisgICAgIyAgIEBwYXJhbSAkc2VsZWN0b3IgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICAjICAgICBUaGUgY29tcG91bmQgc2VsZWN0b3Igd2hvc2Ugc2ltcGxlIHNlbGVjdG9ycyB3aWxsIGJlIGV4dHJhY3RlZC4KKyAgICAjICAgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdF0KKyAgICAjICAgICBBIGxpc3Qgb2Ygc2ltcGxlIHNlbGVjdG9ycyBpbiB0aGUgY29tcG91bmQgc2VsZWN0b3IuCisgICAgZGVmIHNpbXBsZV9zZWxlY3RvcnMoc2VsZWN0b3IpCisgICAgICBzZWxlY3RvciA9IHBhcnNlX2NvbXBvdW5kX3NlbGVjdG9yKHNlbGVjdG9yLCA6c2VsZWN0b3IpCisgICAgICBsaXN0KHNlbGVjdG9yLm1lbWJlcnMubWFwIHt8c2ltcGxlfCB1bnF1b3RlZF9zdHJpbmcoc2ltcGxlLnRvX3MpfSwgOmNvbW1hKQorICAgIGVuZAorICAgIGRlY2xhcmUgOnNpbXBsZV9zZWxlY3RvcnMsIFs6c2VsZWN0b3JdCisKKyAgICAjIFJldHVybnMgd2hldGhlciBgJHN1cGVyYCBpcyBhIHN1cGVyc2VsZWN0b3Igb2YgYCRzdWJgLiBUaGlzIG1lYW5zIHRoYXQKKyAgICAjIGAkc3VwZXJgIG1hdGNoZXMgYWxsIHRoZSBlbGVtZW50cyB0aGF0IGAkc3ViYCBtYXRjaGVzLCBhcyB3ZWxsIGFzIHBvc3NpYmx5CisgICAgIyBhZGRpdGlvbmFsIGVsZW1lbnRzLiBJbiBnZW5lcmFsLCBzaW1wbGVyIHNlbGVjdG9ycyB0ZW5kIHRvIGJlCisgICAgIyBzdXBlcnNlbGVjdG9ycyBvZiBtb3JlIGNvbXBsZXggb25lZC4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBpcy1zdXBlcnNlbGVjdG9yKCIuZm9vIiwgIi5mb28uYmFyIikgPT4gdHJ1ZQorICAgICMgICBpcy1zdXBlcnNlbGVjdG9yKCIuZm9vLmJhciIsICIuZm9vIikgPT4gZmFsc2UKKyAgICAjICAgaXMtc3VwZXJzZWxlY3RvcigiLmJhciIsICIuZm9vIC5iYXIiKSA9PiB0cnVlCisgICAgIyAgIGlzLXN1cGVyc2VsZWN0b3IoIi5mb28gLmJhciIsICIuYmFyIikgPT4gZmFsc2UKKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgaXNfc3VwZXJzZWxlY3Rvcigkc3VwZXIsICRzdWIpCisgICAgIyAgIEBwYXJhbSAkc3VwZXIgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZywgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdF0KKyAgICAjICAgICBUaGUgcG90ZW50aWFsIHN1cGVyc2VsZWN0b3IuIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZywgYSBsaXN0IG9mCisgICAgIyAgICAgc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgYXMgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgICBAcGFyYW0gJHN1YiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgICMgICAgIFRoZSBwb3RlbnRpYWwgc3Vic2VsZWN0b3IuIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZywgYSBsaXN0IG9mCisgICAgIyAgICAgc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgYXMgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgICBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sXQorICAgICMgICAgIFdoZXRoZXIgYCRzZWxlY3RvcjFgIGlzIGEgc3VwZXJzZWxlY3RvciBvZiBgJHNlbGVjdG9yMmAuCisgICAgZGVmIGlzX3N1cGVyc2VsZWN0b3Ioc3VwLCBzdWIpCisgICAgICBzdXAgPSBwYXJzZV9zZWxlY3RvcihzdXAsIDpzdXBlcikKKyAgICAgIHN1YiA9IHBhcnNlX3NlbGVjdG9yKHN1YiwgOnN1YikKKyAgICAgIGJvb2woc3VwLnN1cGVyc2VsZWN0b3I/KHN1YikpCisgICAgZW5kCisgICAgZGVjbGFyZSA6aXNfc3VwZXJzZWxlY3RvciwgWzpzdXBlciwgOnN1Yl0KKworICAgIHByaXZhdGUKKworICAgICMgVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgcGF0dGVybiBvZiB0cmFuc2Zvcm1pbmcgYSBudW1lcmljIHZhbHVlIGludG8KKyAgICAjIGFub3RoZXIgbnVtZXJpYyB2YWx1ZSB3aXRoIHRoZSBzYW1lIHVuaXRzLgorICAgICMgSXQgeWllbGRzIGEgbnVtYmVyIHRvIGEgYmxvY2sgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uIGFuZCByZXR1cm4gYSBudW1iZXIKKyAgICBkZWYgbnVtZXJpY190cmFuc2Zvcm1hdGlvbih2YWx1ZSkKKyAgICAgIGFzc2VydF90eXBlIHZhbHVlLCA6TnVtYmVyLCA6dmFsdWUKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5uZXcoCisgICAgICAgIHlpZWxkKHZhbHVlLnZhbHVlKSwgdmFsdWUubnVtZXJhdG9yX3VuaXRzLCB2YWx1ZS5kZW5vbWluYXRvcl91bml0cykKKyAgICBlbmQKKworICAgICMgQGNvbW1lbnQKKyAgICAjICAgcnVib2NvcDpkaXNhYmxlIFBhcmFtZXRlckxpc3RzCisgICAgZGVmIF9hZGp1c3QoY29sb3IsIGFtb3VudCwgYXR0ciwgcmFuZ2UsIG9wLCB1bml0cyA9ICIiKQorICAgICAgIyBydWJvY29wOmVuYWJsZSBQYXJhbWV0ZXJMaXN0cworICAgICAgYXNzZXJ0X3R5cGUgY29sb3IsIDpDb2xvciwgOmNvbG9yCisgICAgICBhc3NlcnRfdHlwZSBhbW91bnQsIDpOdW1iZXIsIDphbW91bnQKKyAgICAgIFNhc3M6OlV0aWwuY2hlY2tfcmFuZ2UoJ0Ftb3VudCcsIHJhbmdlLCBhbW91bnQsIHVuaXRzKQorCisgICAgICBjb2xvci53aXRoKGF0dHIgPT4gY29sb3Iuc2VuZChhdHRyKS5zZW5kKG9wLCBhbW91bnQudmFsdWUpKQorICAgIGVuZAorCisgICAgZGVmIGNoZWNrX2FscGhhX3VuaXQoYWxwaGEsIGZ1bmN0aW9uKQorICAgICAgcmV0dXJuIGlmIGFscGhhLnVuaXRsZXNzPworCisgICAgICBpZiBhbHBoYS5pc191bml0PygiJSIpCisgICAgICAgIFNhc3M6OlV0aWwuc2Fzc193YXJuKDw8V0FSTklORykKK0RFUFJFQ0FUSU9OIFdBUk5JTkc6IFBhc3NpbmcgYSBwZXJjZW50YWdlIGFzIHRoZSBhbHBoYSB2YWx1ZSB0byAje2Z1bmN0aW9ufSgpIHdpbGwgYmUKK2ludGVycHJldGVkIGRpZmZlcmVudGx5IGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLiBGb3Igbm93LCB1c2UgI3thbHBoYS52YWx1ZX0gaW5zdGVhZC4KK1dBUk5JTkcKKyAgICAgIGVsc2UKKyAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4oPDxXQVJOSU5HKQorREVQUkVDQVRJT04gV0FSTklORzogUGFzc2luZyBhIG51bWJlciB3aXRoIHVuaXRzIGFzIHRoZSBhbHBoYSB2YWx1ZSB0byAje2Z1bmN0aW9ufSgpIGlzCitkZXByZWNhdGVkIGFuZCB3aWxsIGJlIGFuIGVycm9yIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLiBVc2UgI3thbHBoYS52YWx1ZX0gaW5zdGVhZC4KK1dBUk5JTkcKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvbGV4ZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC9sZXhlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDljYzYyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvbGV4ZXIucmIKQEAgLTAsMCArMSw0NzUgQEAKK3JlcXVpcmUgJ3Nhc3Mvc2Nzcy9yeCcKKworbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFNjcmlwdAorICAgICMgVGhlIGxleGljYWwgYW5hbHl6ZXIgZm9yIFNhc3NTY3JpcHQuCisgICAgIyBJdCB0YWtlcyBhIHJhdyBzdHJpbmcgYW5kIGNvbnZlcnRzIGl0IHRvIGluZGl2aWR1YWwgdG9rZW5zCisgICAgIyB0aGF0IGFyZSBlYXNpZXIgdG8gcGFyc2UuCisgICAgY2xhc3MgTGV4ZXIKKyAgICAgIGluY2x1ZGUgU2Fzczo6U0NTUzo6UlgKKworICAgICAgIyBBIHN0cnVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGFuIGluZGl2aWR1YWwgdG9rZW4uCisgICAgICAjCisgICAgICAjIGB0eXBlYDogXFtgU3ltYm9sYFxdCisgICAgICAjIDogVGhlIHR5cGUgb2YgdG9rZW4uCisgICAgICAjCisgICAgICAjIGB2YWx1ZWA6IFxbYE9iamVjdGBcXQorICAgICAgIyA6IFRoZSBSdWJ5IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdG9rZW4uCisgICAgICAjCisgICAgICAjIGBzb3VyY2VfcmFuZ2VgOiBcW2BTYXNzOjpTb3VyY2U6OlJhbmdlYFxdCisgICAgICAjIDogVGhlIHJhbmdlIGluIHRoZSBzb3VyY2UgZmlsZSBpbiB3aGljaCB0aGUgdG9rZW4gYXBwZWFyZWQuCisgICAgICAjCisgICAgICAjIGBwb3NgOiBcW2BJbnRlZ2VyYFxdCisgICAgICAjIDogVGhlIHNjYW5uZXIgcG9zaXRpb24gYXQgd2hpY2ggdGhlIFNhc3NTY3JpcHQgdG9rZW4gYXBwZWFyZWQuCisgICAgICBUb2tlbiA9IFN0cnVjdC5uZXcoOnR5cGUsIDp2YWx1ZSwgOnNvdXJjZV9yYW5nZSwgOnBvcykKKworICAgICAgIyBUaGUgbGluZSBudW1iZXIgb2YgdGhlIGxleGVyJ3MgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbSW50ZWdlcl0KKyAgICAgIGRlZiBsaW5lCisgICAgICAgIHJldHVybiBAbGluZSB1bmxlc3MgQHRvaworICAgICAgICBAdG9rLnNvdXJjZV9yYW5nZS5zdGFydF9wb3MubGluZQorICAgICAgZW5kCisKKyAgICAgICMgVGhlIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBjdXJyZW50IGxpbmUKKyAgICAgICMgb2YgdGhlIGxleGVyJ3MgY3VycmVudCBwb3NpdGlvbiAoMS1iYXNlZCkuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0ludGVnZXJdCisgICAgICBkZWYgb2Zmc2V0CisgICAgICAgIHJldHVybiBAb2Zmc2V0IHVubGVzcyBAdG9rCisgICAgICAgIEB0b2suc291cmNlX3JhbmdlLnN0YXJ0X3Bvcy5vZmZzZXQKKyAgICAgIGVuZAorCisgICAgICAjIEEgaGFzaCBmcm9tIG9wZXJhdG9yIHN0cmluZ3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdG9rZW4gdHlwZXMuCisgICAgICBPUEVSQVRPUlMgPSB7CisgICAgICAgICcrJyA9PiA6cGx1cywKKyAgICAgICAgJy0nID0+IDptaW51cywKKyAgICAgICAgJyonID0+IDp0aW1lcywKKyAgICAgICAgJy8nID0+IDpkaXYsCisgICAgICAgICclJyA9PiA6bW9kLAorICAgICAgICAnPScgPT4gOnNpbmdsZV9lcSwKKyAgICAgICAgJzonID0+IDpjb2xvbiwKKyAgICAgICAgJygnID0+IDpscGFyZW4sCisgICAgICAgICcpJyA9PiA6cnBhcmVuLAorICAgICAgICAnWycgPT4gOmxzcXVhcmUsCisgICAgICAgICddJyA9PiA6cnNxdWFyZSwKKyAgICAgICAgJywnID0+IDpjb21tYSwKKyAgICAgICAgJ2FuZCcgPT4gOmFuZCwKKyAgICAgICAgJ29yJyA9PiA6b3IsCisgICAgICAgICdub3QnID0+IDpub3QsCisgICAgICAgICc9PScgPT4gOmVxLAorICAgICAgICAnIT0nID0+IDpuZXEsCisgICAgICAgICc+PScgPT4gOmd0ZSwKKyAgICAgICAgJzw9JyA9PiA6bHRlLAorICAgICAgICAnPicgPT4gOmd0LAorICAgICAgICAnPCcgPT4gOmx0LAorICAgICAgICAnI3snID0+IDpiZWdpbl9pbnRlcnBvbGF0aW9uLAorICAgICAgICAnfScgPT4gOmVuZF9pbnRlcnBvbGF0aW9uLAorICAgICAgICAnOycgPT4gOnNlbWljb2xvbiwKKyAgICAgICAgJ3snID0+IDpsY3VybHksCisgICAgICAgICcuLi4nID0+IDpzcGxhdCwKKyAgICAgIH0KKworICAgICAgT1BFUkFUT1JTX1JFVkVSU0UgPSBTYXNzOjpVdGlsLm1hcF9oYXNoKE9QRVJBVE9SUykge3xrLCB2fCBbdiwga119CisKKyAgICAgIFRPS0VOX05BTUVTID0gU2Fzczo6VXRpbC5tYXBfaGFzaChPUEVSQVRPUlNfUkVWRVJTRSkge3xrLCB2fCBbaywgdi5pbnNwZWN0XX0ubWVyZ2UoCisgICAgICAgIDpjb25zdCA9PiAidmFyaWFibGUgKGUuZy4gJGZvbykiLAorICAgICAgICA6aWRlbnQgPT4gImlkZW50aWZpZXIgKGUuZy4gbWlkZGxlKSIpCisKKyAgICAgICMgQSBsaXN0IG9mIG9wZXJhdG9yIHN0cmluZ3Mgb3JkZXJlZCB3aXRoIGxvbmdlciBuYW1lcyBmaXJzdAorICAgICAgIyBzbyB0aGF0IGA+YCBhbmQgYDxgIGRvbid0IGNsb2JiZXIgYD49YCBhbmQgYDw9YC4KKyAgICAgIE9QX05BTUVTID0gT1BFUkFUT1JTLmtleXMuc29ydF9ieSB7fG98IC1vLnNpemV9CisKKyAgICAgICMgQSBzdWItbGlzdCBvZiB7T1BfTkFNRVN9IHRoYXQgb25seSBpbmNsdWRlcyBvcGVyYXRvcnMKKyAgICAgICMgd2l0aCBpZGVudGlmaWVyIG5hbWVzLgorICAgICAgSURFTlRfT1BfTkFNRVMgPSBPUF9OQU1FUy5zZWxlY3Qge3xrLCBfdnwgayA9fiAvXlx3Ky99CisKKyAgICAgIFBBUlNFQUJMRV9OVU1CRVIgPSAvKD86KFxkKlwuXGQrKXwoXGQrKSkoPzpbZUVdKFsrLV0/XGQrKSk/KCN7VU5JVH0pPy8KKworICAgICAgIyBBIGhhc2ggb2YgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IGFyZSB1c2VkIGZvciB0b2tlbml6aW5nLgorICAgICAgUkVHVUxBUl9FWFBSRVNTSU9OUyA9IHsKKyAgICAgICAgOndoaXRlc3BhY2UgPT4gL1xzKy8sCisgICAgICAgIDpjb21tZW50ID0+IENPTU1FTlQsCisgICAgICAgIDpzaW5nbGVfbGluZV9jb21tZW50ID0+IFNJTkdMRV9MSU5FX0NPTU1FTlQsCisgICAgICAgIDp2YXJpYWJsZSA9PiAvKFwkKSgje0lERU5UfSkvLAorICAgICAgICA6aWRlbnQgPT4gLygje0lERU5UfSkoXCgpPy8sCisgICAgICAgIDpudW1iZXIgPT4gUEFSU0VBQkxFX05VTUJFUiwKKyAgICAgICAgOnVuYXJ5X21pbnVzX251bWJlciA9PiAvLSN7UEFSU0VBQkxFX05VTUJFUn0vLAorICAgICAgICA6Y29sb3IgPT4gSEVYQ09MT1IsCisgICAgICAgIDppZCA9PiAvIyN7SURFTlR9LywKKyAgICAgICAgOnNlbGVjdG9yID0+IC8mLywKKyAgICAgICAgOmlkZW50X29wID0+IC8oI3tSZWdleHAudW5pb24oKklERU5UX09QX05BTUVTLm1hcCBkbyB8c3wKKyAgICAgICAgICBSZWdleHAubmV3KFJlZ2V4cC5lc2NhcGUocykgKyAiKD8hI3tOTUNIQVJ9fFxaKSIpCisgICAgICAgIGVuZCl9KS8sCisgICAgICAgIDpvcCA9PiAvKCN7UmVnZXhwLnVuaW9uKCpPUF9OQU1FUyl9KS8sCisgICAgICB9CisKKyAgICAgIGNsYXNzIDw8IHNlbGYKKyAgICAgICAgcHJpdmF0ZQorCisgICAgICAgIGRlZiBzdHJpbmdfcmUob3BlbiwgY2xvc2UpCisgICAgICAgICAgLyN7b3Blbn0oKD86XFwufFwjKD8hXHspfFteI3tjbG9zZX1cXCNdKSopKCN7Y2xvc2V9fCNceykvbQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEEgaGFzaCBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQgYXJlIHVzZWQgZm9yIHRva2VuaXppbmcgc3RyaW5ncy4KKyAgICAgICMKKyAgICAgICMgVGhlIGtleSBpcyBhIGBbU3ltYm9sLCBCb29sZWFuXWAgcGFpci4KKyAgICAgICMgVGhlIHN5bWJvbCByZXByZXNlbnRzIHdoaWNoIHN0eWxlIG9mIHF1b3RhdGlvbiB0byB1c2UsCisgICAgICAjIHdoaWxlIHRoZSBib29sZWFuIHJlcHJlc2VudHMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZworICAgICAgIyBpcyBmb2xsb3dpbmcgYW4gaW50ZXJwb2xhdGVkIHNlZ21lbnQuCisgICAgICBTVFJJTkdfUkVHVUxBUl9FWFBSRVNTSU9OUyA9IHsKKyAgICAgICAgOmRvdWJsZSA9PiB7CisgICAgICAgICAgZmFsc2UgPT4gc3RyaW5nX3JlKCciJywgJyInKSwKKyAgICAgICAgICB0cnVlID0+IHN0cmluZ19yZSgnJywgJyInKQorICAgICAgICB9LAorICAgICAgICA6c2luZ2xlID0+IHsKKyAgICAgICAgICBmYWxzZSA9PiBzdHJpbmdfcmUoIiciLCAiJyIpLAorICAgICAgICAgIHRydWUgPT4gc3RyaW5nX3JlKCcnLCAiJyIpCisgICAgICAgIH0sCisgICAgICAgIDp1cmkgPT4geworICAgICAgICAgIGZhbHNlID0+IC91cmxcKCN7V30oI3tVUkxDSEFSfSo/KSgje1d9XCl8I1x7KS8sCisgICAgICAgICAgdHJ1ZSA9PiAvKCN7VVJMQ0hBUn0qPykoI3tXfVwpfCNceykvCisgICAgICAgIH0sCisgICAgICAgICMgRGVmaW5lZCBpbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9DU1MvQC1tb3otZG9jdW1lbnQgYXMgYQorICAgICAgICAjIG5vbi1zdGFuZGFyZCB2ZXJzaW9uIG9mIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29uZGl0aW9uYWwvCisgICAgICAgIDp1cmxfcHJlZml4ID0+IHsKKyAgICAgICAgICBmYWxzZSA9PiAvdXJsLXByZWZpeFwoI3tXfSgje1VSTENIQVJ9Kj8pKCN7V31cKXwjXHspLywKKyAgICAgICAgICB0cnVlID0+IC8oI3tVUkxDSEFSfSo/KSgje1d9XCl8I1x7KS8KKyAgICAgICAgfSwKKyAgICAgICAgOmRvbWFpbiA9PiB7CisgICAgICAgICAgZmFsc2UgPT4gL2RvbWFpblwoI3tXfSgje1VSTENIQVJ9Kj8pKCN7V31cKXwjXHspLywKKyAgICAgICAgICB0cnVlID0+IC8oI3tVUkxDSEFSfSo/KSgje1d9XCl8I1x7KS8KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAjIEBwYXJhbSBzdHIgW1N0cmluZywgU3RyaW5nU2Nhbm5lcl0gVGhlIHNvdXJjZSB0ZXh0IHRvIGxleAorICAgICAgIyBAcGFyYW0gbGluZSBbSW50ZWdlcl0gVGhlIDEtYmFzZWQgbGluZSBvbiB3aGljaCB0aGUgU2Fzc1NjcmlwdCBhcHBlYXJzLgorICAgICAgIyAgIFVzZWQgZm9yIGVycm9yIHJlcG9ydGluZyBhbmQgc291cmNlbWFwIGJ1aWxkaW5nCisgICAgICAjIEBwYXJhbSBvZmZzZXQgW0ludGVnZXJdIFRoZSAxLWJhc2VkIGNoYXJhY3RlciAobm90IGJ5dGUpIG9mZnNldCBpbiB0aGUgbGluZSBpbiB0aGUgc291cmNlLgorICAgICAgIyAgIFVzZWQgZm9yIGVycm9yIHJlcG9ydGluZyBhbmQgc291cmNlbWFwIGJ1aWxkaW5nCisgICAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIEFuIG9wdGlvbnMgaGFzaDsKKyAgICAgICMgICBzZWUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjT3B0aW9ucyB0aGUgU2FzcyBvcHRpb25zIGRvY3VtZW50YXRpb259CisgICAgICBkZWYgaW5pdGlhbGl6ZShzdHIsIGxpbmUsIG9mZnNldCwgb3B0aW9ucykKKyAgICAgICAgQHNjYW5uZXIgPSBzdHIuaXNfYT8oU3RyaW5nU2Nhbm5lcikgPyBzdHIgOiBTYXNzOjpVdGlsOjpNdWx0aWJ5dGVTdHJpbmdTY2FubmVyLm5ldyhzdHIpCisgICAgICAgIEBsaW5lID0gbGluZQorICAgICAgICBAb2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgIEBvcHRpb25zID0gb3B0aW9ucworICAgICAgICBAaW50ZXJwb2xhdGlvbl9zdGFjayA9IFtdCisgICAgICAgIEBwcmV2ID0gbmlsCisgICAgICAgIEB0b2sgPSBuaWwKKyAgICAgICAgQG5leHRfdG9rID0gbmlsCisgICAgICBlbmQKKworICAgICAgIyBNb3ZlcyB0aGUgbGV4ZXIgZm9yd2FyZCBvbmUgdG9rZW4uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1Rva2VuXSBUaGUgdG9rZW4gdGhhdCB3YXMgbW92ZWQgcGFzdAorICAgICAgZGVmIG5leHQKKyAgICAgICAgQHRvayB8fD0gcmVhZF90b2tlbgorICAgICAgICBAdG9rLCB0b2sgPSBuaWwsIEB0b2sKKyAgICAgICAgQHByZXYgPSB0b2sKKyAgICAgICAgdG9rCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZXJlJ3Mgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIG5leHQgdG9rZW4uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBkZWYgd2hpdGVzcGFjZT8odG9rID0gQHRvaykKKyAgICAgICAgaWYgdG9rCisgICAgICAgICAgQHNjYW5uZXIuc3RyaW5nWzAuLi50b2sucG9zXSA9fiAvXHNcWi8KKyAgICAgICAgZWxzZQorICAgICAgICAgIEBzY2FubmVyLnN0cmluZ1tAc2Nhbm5lci5wb3MsIDFdID1+IC9eXHMvIHx8CisgICAgICAgICAgICBAc2Nhbm5lci5zdHJpbmdbQHNjYW5uZXIucG9zIC0gMSwgMV0gPX4gL1xzXFovCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyB0aGUgZ2l2ZW4gY2hhcmFjdGVyLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBkZWYgY2hhcihwb3MgPSBAc2Nhbm5lci5wb3MpCisgICAgICAgIEBzY2FubmVyLnN0cmluZ1twb3MsIDFdCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIHdpdGhvdXQgbW92aW5nIHRoZSBsZXhlciBmb3J3YXJkLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtUb2tlbl0gVGhlIG5leHQgdG9rZW4KKyAgICAgIGRlZiBwZWVrCisgICAgICAgIEB0b2sgfHw9IHJlYWRfdG9rZW4KKyAgICAgIGVuZAorCisgICAgICAjIFJld2luZHMgdGhlIHVuZGVybHlpbmcgU3RyaW5nU2Nhbm5lcgorICAgICAgIyB0byBiZWZvcmUgdGhlIHRva2VuIHJldHVybmVkIGJ5IFx7I3BlZWt9LgorICAgICAgZGVmIHVucGVlayEKKyAgICAgICAgcmV0dXJuIHVubGVzcyBAdG9rCisgICAgICAgIEBzY2FubmVyLnBvcyA9IEB0b2sucG9zCisgICAgICAgIEBsaW5lID0gQHRvay5zb3VyY2VfcmFuZ2Uuc3RhcnRfcG9zLmxpbmUKKyAgICAgICAgQG9mZnNldCA9IEB0b2suc291cmNlX3JhbmdlLnN0YXJ0X3Bvcy5vZmZzZXQKKyAgICAgIGVuZAorCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgb3Igbm90IHRoZXJlJ3MgbW9yZSBzb3VyY2UgdGV4dCB0byBsZXguCisgICAgICBkZWYgZG9uZT8KKyAgICAgICAgcmV0dXJuIGlmIEBuZXh0X3RvaworICAgICAgICB3aGl0ZXNwYWNlIHVubGVzcyBhZnRlcl9pbnRlcnBvbGF0aW9uPyAmJiAhQGludGVycG9sYXRpb25fc3RhY2suZW1wdHk/CisgICAgICAgIEBzY2FubmVyLmVvcz8gJiYgQHRvay5uaWw/CisgICAgICBlbmQKKworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIG9yIG5vdCB0aGUgbGFzdCB0b2tlbiBsZXhlZCB3YXMgYDplbmRfaW50ZXJwb2xhdGlvbmAuCisgICAgICBkZWYgYWZ0ZXJfaW50ZXJwb2xhdGlvbj8KKyAgICAgICAgQHByZXYgJiYgQHByZXYudHlwZSA9PSA6ZW5kX2ludGVycG9sYXRpb24KKyAgICAgIGVuZAorCisgICAgICAjIFJhaXNlIGFuIGVycm9yIHRvIHRoZSBlZmZlY3QgdGhhdCBgbmFtZWAgd2FzIGV4cGVjdGVkIGluIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICMgYW5kIHdhc24ndCBmb3VuZC4KKyAgICAgICMKKyAgICAgICMgVGhpcyBjYWxscyBceyN1bnBlZWshfSB0byByZXdpbmQgdGhlIHNjYW5uZXIgdG8gaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgICAgICMgdGhlIGxhc3QgcmV0dXJuZWQgdG9rZW4uCisgICAgICAjCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCB3YXMgZXhwZWN0ZWQgYnV0IG5vdCBmb3VuZAorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXQorICAgICAgZGVmIGV4cGVjdGVkIShuYW1lKQorICAgICAgICB1bnBlZWshCisgICAgICAgIFNhc3M6OlNDU1M6OlBhcnNlci5leHBlY3RlZChAc2Nhbm5lciwgbmFtZSwgQGxpbmUpCisgICAgICBlbmQKKworICAgICAgIyBSZWNvcmRzIGFsbCBub24tY29tbWVudCB0ZXh0IHRoZSBsZXhlciBjb25zdW1lcyB3aXRoaW4gdGhlIGJsb2NrCisgICAgICAjIGFuZCByZXR1cm5zIGl0IGFzIGEgc3RyaW5nLgorICAgICAgIworICAgICAgIyBAeWllbGQgQSBibG9jayBpbiB3aGljaCB0ZXh0IGlzIHJlY29yZGVkCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgIGRlZiBzdHIKKyAgICAgICAgb2xkX3BvcyA9IEB0b2sgPyBAdG9rLnBvcyA6IEBzY2FubmVyLnBvcworICAgICAgICB5aWVsZAorICAgICAgICBuZXdfcG9zID0gQHRvayA/IEB0b2sucG9zIDogQHNjYW5uZXIucG9zCisgICAgICAgIEBzY2FubmVyLnN0cmluZ1tvbGRfcG9zLi4ubmV3X3Bvc10KKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiByZWFkX3Rva2VuCisgICAgICAgIGlmICh0b2sgPSBAbmV4dF90b2spCisgICAgICAgICAgQG5leHRfdG9rID0gbmlsCisgICAgICAgICAgcmV0dXJuIHRvaworICAgICAgICBlbmQKKworICAgICAgICByZXR1cm4gaWYgZG9uZT8KKyAgICAgICAgc3RhcnRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgIHZhbHVlID0gdG9rZW4KKyAgICAgICAgcmV0dXJuIHVubGVzcyB2YWx1ZQorICAgICAgICB0eXBlLCB2YWwgPSB2YWx1ZQorICAgICAgICBUb2tlbi5uZXcodHlwZSwgdmFsLCByYW5nZShzdGFydF9wb3MpLCBAc2Nhbm5lci5wb3MgLSBAc2Nhbm5lci5tYXRjaGVkX3NpemUpCisgICAgICBlbmQKKworICAgICAgZGVmIHdoaXRlc3BhY2UKKyAgICAgICAgbmlsIHdoaWxlIHNjYW4oUkVHVUxBUl9FWFBSRVNTSU9OU1s6d2hpdGVzcGFjZV0pIHx8CisgICAgICAgICAgc2NhbihSRUdVTEFSX0VYUFJFU1NJT05TWzpjb21tZW50XSkgfHwKKyAgICAgICAgICBzY2FuKFJFR1VMQVJfRVhQUkVTU0lPTlNbOnNpbmdsZV9saW5lX2NvbW1lbnRdKQorICAgICAgZW5kCisKKyAgICAgIGRlZiB0b2tlbgorICAgICAgICBpZiBhZnRlcl9pbnRlcnBvbGF0aW9uPyAmJiAoaW50ZXJwID0gQGludGVycG9sYXRpb25fc3RhY2sucG9wKQorICAgICAgICAgIGludGVycF90eXBlLCBpbnRlcnBfdmFsdWUgPSBpbnRlcnAKKyAgICAgICAgICBpZiBpbnRlcnBfdHlwZSA9PSA6c3BlY2lhbF9mdW4KKyAgICAgICAgICAgIHJldHVybiBzcGVjaWFsX2Z1bl9ib2R5KGludGVycF92YWx1ZSkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiW0JVR106IFVua25vd24gaW50ZXJwX3R5cGUgI3tpbnRlcnBfdHlwZX0iIHVubGVzcyBpbnRlcnBfdHlwZSA9PSA6c3RyaW5nCisgICAgICAgICAgICByZXR1cm4gc3RyaW5nKGludGVycF92YWx1ZSwgdHJ1ZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisKKyAgICAgICAgdmFyaWFibGUgfHwgc3RyaW5nKDpkb3VibGUsIGZhbHNlKSB8fCBzdHJpbmcoOnNpbmdsZSwgZmFsc2UpIHx8IG51bWJlciB8fCBpZCB8fCBjb2xvciB8fAorICAgICAgICAgIHNlbGVjdG9yIHx8IHN0cmluZyg6dXJpLCBmYWxzZSkgfHwgcmF3KFVOSUNPREVSQU5HRSkgfHwgc3BlY2lhbF9mdW4gfHwgc3BlY2lhbF92YWwgfHwKKyAgICAgICAgICBpZGVudF9vcCB8fCBpZGVudCB8fCBvcAorICAgICAgZW5kCisKKyAgICAgIGRlZiB2YXJpYWJsZQorICAgICAgICBfdmFyaWFibGUoUkVHVUxBUl9FWFBSRVNTSU9OU1s6dmFyaWFibGVdKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfdmFyaWFibGUocngpCisgICAgICAgIHJldHVybiB1bmxlc3Mgc2NhbihyeCkKKworICAgICAgICBbOmNvbnN0LCBAc2Nhbm5lclsyXV0KKyAgICAgIGVuZAorCisgICAgICBkZWYgaWRlbnQKKyAgICAgICAgcmV0dXJuIHVubGVzcyBzY2FuKFJFR1VMQVJfRVhQUkVTU0lPTlNbOmlkZW50XSkKKyAgICAgICAgW0BzY2FubmVyWzJdID8gOmZ1bmNhbGwgOiA6aWRlbnQsIEBzY2FubmVyWzFdXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdHJpbmcocmUsIG9wZW4pCisgICAgICAgIGxpbmUsIG9mZnNldCA9IEBsaW5lLCBAb2Zmc2V0CisgICAgICAgIHJldHVybiB1bmxlc3Mgc2NhbihTVFJJTkdfUkVHVUxBUl9FWFBSRVNTSU9OU1tyZV1bb3Blbl0pCisgICAgICAgIGlmIEBzY2FubmVyWzBdID1+IC8oW15cXF18Xilcbi8KKyAgICAgICAgICBmaWxlbmFtZSA9IEBvcHRpb25zWzpmaWxlbmFtZV0KKyAgICAgICAgICBTYXNzOjpVdGlsLnNhc3Nfd2FybiA8PE1FU1NBR0UKK0RFUFJFQ0FUSU9OIFdBUk5JTkcgb24gbGluZSAje2xpbmV9LCBjb2x1bW4gI3tvZmZzZXR9I3siIG9mICN7ZmlsZW5hbWV9IiBpZiBmaWxlbmFtZX06CitVbmVzY2FwZWQgbXVsdGlsaW5lIHN0cmluZ3MgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNhc3MuCitUbyBpbmNsdWRlIGEgbmV3bGluZSBpbiBhIHN0cmluZywgdXNlICJcXGEiIG9yICJcXGEgIiBhcyBpbiBDU1MuCitNRVNTQUdFCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIEBzY2FubmVyWzJdID09ICcjeycgIyAnCisgICAgICAgICAgQGludGVycG9sYXRpb25fc3RhY2sgPDwgWzpzdHJpbmcsIHJlXQorICAgICAgICAgIHN0YXJ0X3BvcyA9IFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCBAb2Zmc2V0IC0gMikKKyAgICAgICAgICBAbmV4dF90b2sgPSBUb2tlbi5uZXcoOnN0cmluZ19pbnRlcnBvbGF0aW9uLCByYW5nZShzdGFydF9wb3MpLCBAc2Nhbm5lci5wb3MgLSAyKQorICAgICAgICBlbmQKKyAgICAgICAgc3RyID0KKyAgICAgICAgICBpZiByZSA9PSA6dXJpCisgICAgICAgICAgICB1cmwgPSAiI3sndXJsKCcgdW5sZXNzIG9wZW59I3tAc2Nhbm5lclsxXX0jeycpJyB1bmxlc3MgQHNjYW5uZXJbMl0gPT0gJyN7J30iCisgICAgICAgICAgICBTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KHVybCkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy52YWx1ZShAc2Nhbm5lclsxXSksIDpzdHJpbmcpCisgICAgICAgICAgZW5kCisgICAgICAgIFs6c3RyaW5nLCBzdHJdCisgICAgICBlbmQKKworICAgICAgZGVmIG51bWJlcgorICAgICAgICAjIEhhbmRsaW5nIHVuYXJ5IG1pbnVzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgd2hpdGVzcGFjZSBpcyBhbgorICAgICAgICAjIG9wZXJhdG9yIGluIFNhc3NTY3JpcHQuIFdlIHdhbnQgIjEtMiIgdG8gYmUgcGFyc2VkIGFzICIxIC0gMiIsIGJ1dCB3ZQorICAgICAgICAjIHdhbnQgIjEgLTIiIHRvIGJlIHBhcnNlZCBhcyAiMSAoLTIpIi4gVG8gYWNjb21wbGlzaCB0aGlzLCB3ZSBvbmx5CisgICAgICAgICMgcGFyc2UgYSB1bmFyeSBtaW51cyBhcyBwYXJ0IG9mIGEgbnVtYmVyIGxpdGVyYWwgaWYgdGhlcmUncyB3aGl0ZXNwYWNlCisgICAgICAgICMgYmVmb3JlIGFuZCBub3QgYWZ0ZXIgaXQuIENhc2VzIGxpa2UgIigtMikiIGFyZSBoYW5kbGVkIGJ5IHRoZSB1bmFyeQorICAgICAgICAjIG1pbnVzIGxvZ2ljIGluIHRoZSBwYXJzZXIgaW5zdGVhZC4KKyAgICAgICAgaWYgQHNjYW5uZXIucGVlaygxKSA9PSAnLScKKyAgICAgICAgICByZXR1cm4gaWYgQHNjYW5uZXIucG9zID09IDAKKyAgICAgICAgICB1bmFyeV9taW51c19hbGxvd2VkID0KKyAgICAgICAgICAgIGNhc2UgQHNjYW5uZXIuc3RyaW5nW0BzY2FubmVyLnBvcyAtIDEsIDFdCisgICAgICAgICAgICB3aGVuIC9ccy87IHRydWUKKyAgICAgICAgICAgIHdoZW4gJy8nOyBAc2Nhbm5lci5wb3MgIT0gMSAmJiBAc2Nhbm5lci5zdHJpbmdbQHNjYW5uZXIucG9zIC0gMiwgMV0gPT0gJyonCisgICAgICAgICAgICBlbHNlOyBmYWxzZQorICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICByZXR1cm4gdW5sZXNzIHVuYXJ5X21pbnVzX2FsbG93ZWQKKyAgICAgICAgICByZXR1cm4gdW5sZXNzIHNjYW4oUkVHVUxBUl9FWFBSRVNTSU9OU1s6dW5hcnlfbWludXNfbnVtYmVyXSkKKyAgICAgICAgICBtaW51cyA9IHRydWUKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiB1bmxlc3Mgc2NhbihSRUdVTEFSX0VYUFJFU1NJT05TWzpudW1iZXJdKQorICAgICAgICAgIG1pbnVzID0gZmFsc2UKKyAgICAgICAgZW5kCisKKyAgICAgICAgdmFsdWUgPSAoQHNjYW5uZXJbMV0gPyBAc2Nhbm5lclsxXS50b19mIDogQHNjYW5uZXJbMl0udG9faSkgKiAobWludXMgPyAtMSA6IDEpCisgICAgICAgIHZhbHVlICo9IDEwKipAc2Nhbm5lclszXS50b19pIGlmIEBzY2FubmVyWzNdCisgICAgICAgIHNjcmlwdF9udW1iZXIgPSBTY3JpcHQ6OlZhbHVlOjpOdW1iZXIubmV3KHZhbHVlLCBBcnJheShAc2Nhbm5lcls0XSkpCisgICAgICAgIFs6bnVtYmVyLCBzY3JpcHRfbnVtYmVyXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBpZAorICAgICAgICAjIENvbG9ycyBhbmQgaWRzIGFyZSB0b3VnaCB0byB0ZWxsIGFwYXJ0LCBiZWNhdXNlIHRoZXkgb3ZlcmxhcCBidXQKKyAgICAgICAgIyBuZWl0aGVyIGlzIGEgc3VwZXJzZXQgb2YgdGhlIG90aGVyLiAiI3h5eiIgaXMgYW4gaWQgYnV0IG5vdCBhIGNvbG9yLAorICAgICAgICAjICIjMDAwIiBpcyBhIGNvbG9yIGJ1dCBub3QgYW4gaWQsICIjYWJjIiBpcyBib3RoLCBhbmQgIiMwIiBpcyBuZWl0aGVyLgorICAgICAgICAjIFdlIG5lZWQgdG8gaGFuZGxlIGFsbCB0aGVzZSBjYXNlcyBjb3JyZWN0bHkuCisgICAgICAgICMKKyAgICAgICAgIyBUbyBkbyBzbywgd2UgZmlyc3QgdHJ5IHRvIHBhcnNlIHNvbWV0aGluZyBhcyBhbiBpZC4gSWYgdGhpcyB3b3JrcyBhbmQKKyAgICAgICAgIyB0aGUgaWQgaXMgYWxzbyBhIHZhbGlkIGNvbG9yLCB3ZSByZXR1cm4gdGhlIGNvbG9yLiBPdGhlcndpc2UsIHdlCisgICAgICAgICMgcmV0dXJuIHRoZSBpZC4gSWYgaXQgZGlkbid0IHBhcnNlIGFzIGFuIGlkLCB3ZSB0aGVuIHRyeSB0byBwYXJzZSBpdCBhcworICAgICAgICAjIGEgY29sb3IuIElmICp0aGlzKiB3b3Jrcywgd2UgcmV0dXJuIHRoZSBjb2xvciwgYW5kIGlmIGl0IGRvZXNuJ3Qgd2UKKyAgICAgICAgIyBnaXZlIHVwIGFuZCB0aHJvdyBhbiBlcnJvci4KKyAgICAgICAgIworICAgICAgICAjIElEcyBpbiBwcm9wZXJ0aWVzIGFyZSB1c2VkIGluIHRoZSBCYXNpYyBVc2VyIEludGVyZmFjZSBNb2R1bGUKKyAgICAgICAgIyAoaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy11aS8pLgorICAgICAgICByZXR1cm4gdW5sZXNzIHNjYW4oUkVHVUxBUl9FWFBSRVNTSU9OU1s6aWRdKQorICAgICAgICBpZiBAc2Nhbm5lclswXSA9fiAvXlwjWzAtOWEtZkEtRl0rJC8KKyAgICAgICAgICBpZiBAc2Nhbm5lclswXS5sZW5ndGggPT0gNCB8fCBAc2Nhbm5lclswXS5sZW5ndGggPT0gNworICAgICAgICAgICAgcmV0dXJuIFs6Y29sb3IsIFNjcmlwdDo6VmFsdWU6OkNvbG9yLmZyb21faGV4KEBzY2FubmVyWzBdKV0KKyAgICAgICAgICBlbHNpZiBAc2Nhbm5lclswXS5sZW5ndGggPT0gNSB8fCBAc2Nhbm5lclswXS5sZW5ndGggPT0gOQorICAgICAgICAgICAgZmlsZW5hbWUgPSBAb3B0aW9uc1s6ZmlsZW5hbWVdCisgICAgICAgICAgICBTYXNzOjpVdGlsLnNhc3Nfd2FybiA8PE1FU1NBR0UKK0RFUFJFQ0FUSU9OIFdBUk5JTkcgb24gbGluZSAje2xpbmV9LCBjb2x1bW4gI3tvZmZzZXR9I3siIG9mICN7ZmlsZW5hbWV9IiBpZiBmaWxlbmFtZX06CitUaGUgdmFsdWUgIiN7QHNjYW5uZXJbMF19IiBpcyBjdXJyZW50bHkgcGFyc2VkIGFzIGEgc3RyaW5nLCBidXQgaXQgd2lsbCBiZSBwYXJzZWQgYXMgYSBjb2xvciBpbgorZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuIFVzZSAidW5xdW90ZSgnI3tAc2Nhbm5lclswXX0nKSIgdG8gY29udGludWUgcGFyc2luZyBpdCBhcyBhIHN0cmluZy4KK01FU1NBR0UKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIFs6aWRlbnQsIEBzY2FubmVyWzBdXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjb2xvcgorICAgICAgICByZXR1cm4gdW5sZXNzIEBzY2FubmVyLm1hdGNoPyhSRUdVTEFSX0VYUFJFU1NJT05TWzpjb2xvcl0pCisgICAgICAgIHJldHVybiB1bmxlc3MgQHNjYW5uZXJbMF0ubGVuZ3RoID09IDQgfHwgQHNjYW5uZXJbMF0ubGVuZ3RoID09IDcKKyAgICAgICAgc2NyaXB0X2NvbG9yID0gU2NyaXB0OjpWYWx1ZTo6Q29sb3IuZnJvbV9oZXgoc2NhbihSRUdVTEFSX0VYUFJFU1NJT05TWzpjb2xvcl0pKQorICAgICAgICBbOmNvbG9yLCBzY3JpcHRfY29sb3JdCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGVjdG9yCisgICAgICAgIHN0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICByZXR1cm4gdW5sZXNzIHNjYW4oUkVHVUxBUl9FWFBSRVNTSU9OU1s6c2VsZWN0b3JdKQorICAgICAgICBzY3JpcHRfc2VsZWN0b3IgPSBTY3JpcHQ6OlRyZWU6OlNlbGVjdG9yLm5ldworICAgICAgICBzY3JpcHRfc2VsZWN0b3Iuc291cmNlX3JhbmdlID0gcmFuZ2Uoc3RhcnRfcG9zKQorICAgICAgICBbOnNlbGVjdG9yLCBzY3JpcHRfc2VsZWN0b3JdCisgICAgICBlbmQKKworICAgICAgZGVmIHNwZWNpYWxfZnVuCisgICAgICAgIHByZWZpeCA9IHNjYW4oLygoLVtcdy1dKy0pPyhjYWxjfGVsZW1lbnQpfGV4cHJlc3Npb258cHJvZ2lkOlthLXpcLl0qKVwoL2kpCisgICAgICAgIHJldHVybiB1bmxlc3MgcHJlZml4CisgICAgICAgIHNwZWNpYWxfZnVuX2JvZHkoMSwgcHJlZml4KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzcGVjaWFsX2Z1bl9ib2R5KHBhcmVucywgcHJlZml4ID0gbmlsKQorICAgICAgICBzdHIgPSBwcmVmaXggfHwgJycKKyAgICAgICAgd2hpbGUgKHNjYW5uZWQgPSBzY2FuKC8uKj8oWygpXXxcI1x7KS9tKSkKKyAgICAgICAgICBzdHIgPDwgc2Nhbm5lZAorICAgICAgICAgIGlmIHNjYW5uZWRbLTFdID09ID8oCisgICAgICAgICAgICBwYXJlbnMgKz0gMQorICAgICAgICAgICAgbmV4dAorICAgICAgICAgIGVsc2lmIHNjYW5uZWRbLTFdID09ID8pCisgICAgICAgICAgICBwYXJlbnMgLT0gMQorICAgICAgICAgICAgbmV4dCB1bmxlc3MgcGFyZW5zID09IDAKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSAiW0JVR10gVW5yZWFjaGFibGUiIHVubGVzcyBAc2Nhbm5lclsxXSA9PSAnI3snICMgJworICAgICAgICAgICAgc3RyLnNsaWNlISgtMi4uLTEpCisgICAgICAgICAgICBAaW50ZXJwb2xhdGlvbl9zdGFjayA8PCBbOnNwZWNpYWxfZnVuLCBwYXJlbnNdCisgICAgICAgICAgICBzdGFydF9wb3MgPSBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhAbGluZSwgQG9mZnNldCAtIDIpCisgICAgICAgICAgICBAbmV4dF90b2sgPSBUb2tlbi5uZXcoOnN0cmluZ19pbnRlcnBvbGF0aW9uLCByYW5nZShzdGFydF9wb3MpLCBAc2Nhbm5lci5wb3MgLSAyKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgcmV0dXJuIFs6c3BlY2lhbF9mdW4sIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoc3RyKV0KKyAgICAgICAgZW5kCisKKyAgICAgICAgc2NhbigvLiovKQorICAgICAgICBleHBlY3RlZCEoJyIpIicpCisgICAgICBlbmQKKworICAgICAgZGVmIHNwZWNpYWxfdmFsCisgICAgICAgIHJldHVybiB1bmxlc3Mgc2NhbigvISN7V31pbXBvcnRhbnQvaSkKKyAgICAgICAgWzpzdHJpbmcsIFNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIiFpbXBvcnRhbnQiKV0KKyAgICAgIGVuZAorCisgICAgICBkZWYgaWRlbnRfb3AKKyAgICAgICAgb3AgPSBzY2FuKFJFR1VMQVJfRVhQUkVTU0lPTlNbOmlkZW50X29wXSkKKyAgICAgICAgcmV0dXJuIHVubGVzcyBvcAorICAgICAgICBbT1BFUkFUT1JTW29wXV0KKyAgICAgIGVuZAorCisgICAgICBkZWYgb3AKKyAgICAgICAgb3AgPSBzY2FuKFJFR1VMQVJfRVhQUkVTU0lPTlNbOm9wXSkKKyAgICAgICAgcmV0dXJuIHVubGVzcyBvcAorICAgICAgICBuYW1lID0gT1BFUkFUT1JTW29wXQorICAgICAgICBAaW50ZXJwb2xhdGlvbl9zdGFjayA8PCBuaWwgaWYgbmFtZSA9PSA6YmVnaW5faW50ZXJwb2xhdGlvbgorICAgICAgICBbbmFtZV0KKyAgICAgIGVuZAorCisgICAgICBkZWYgcmF3KHJ4KQorICAgICAgICB2YWwgPSBzY2FuKHJ4KQorICAgICAgICByZXR1cm4gdW5sZXNzIHZhbAorICAgICAgICBbOnJhdywgdmFsXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzY2FuKHJlKQorICAgICAgICBzdHIgPSBAc2Nhbm5lci5zY2FuKHJlKQorICAgICAgICByZXR1cm4gdW5sZXNzIHN0cgorICAgICAgICBjID0gc3RyLmNvdW50KCJcbiIpCisgICAgICAgIEBsaW5lICs9IGMKKyAgICAgICAgQG9mZnNldCA9IChjID09IDAgPyBAb2Zmc2V0ICsgc3RyLnNpemUgOiBzdHIuc2l6ZSAtIHN0ci5yaW5kZXgoIlxuIikpCisgICAgICAgIHN0cgorICAgICAgZW5kCisKKyAgICAgIGRlZiByYW5nZShzdGFydF9wb3MsIGVuZF9wb3MgPSBzb3VyY2VfcG9zaXRpb24pCisgICAgICAgIFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KHN0YXJ0X3BvcywgZW5kX3BvcywgQG9wdGlvbnNbOmZpbGVuYW1lXSwgQG9wdGlvbnNbOmltcG9ydGVyXSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc291cmNlX3Bvc2l0aW9uCisgICAgICAgIFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCBAb2Zmc2V0KQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC9wYXJzZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC9wYXJzZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjMzgzZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3BhcnNlci5yYgpAQCAtMCwwICsxLDgzNCBAQAorcmVxdWlyZSAnc2Fzcy9zY3JpcHQvbGV4ZXInCisKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBTY3JpcHQKKyAgICAjIFRoZSBwYXJzZXIgZm9yIFNhc3NTY3JpcHQuCisgICAgIyBJdCBwYXJzZXMgYSBzdHJpbmcgb2YgY29kZSBpbnRvIGEgdHJlZSBvZiB7U2NyaXB0OjpUcmVlOjpOb2RlfXMuCisgICAgY2xhc3MgUGFyc2VyCisgICAgICAjIFRoZSBsaW5lIG51bWJlciBvZiB0aGUgcGFyc2VyJ3MgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbSW50ZWdlcl0KKyAgICAgIGRlZiBsaW5lCisgICAgICAgIEBsZXhlci5saW5lCisgICAgICBlbmQKKworICAgICAgIyBUaGUgY29sdW1uIG51bWJlciBvZiB0aGUgcGFyc2VyJ3MgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbSW50ZWdlcl0KKyAgICAgIGRlZiBvZmZzZXQKKyAgICAgICAgQGxleGVyLm9mZnNldAorICAgICAgZW5kCisKKyAgICAgICMgQHBhcmFtIHN0ciBbU3RyaW5nLCBTdHJpbmdTY2FubmVyXSBUaGUgc291cmNlIHRleHQgdG8gcGFyc2UKKyAgICAgICMgQHBhcmFtIGxpbmUgW0ludGVnZXJdIFRoZSBsaW5lIG9uIHdoaWNoIHRoZSBTYXNzU2NyaXB0IGFwcGVhcnMuCisgICAgICAjICAgVXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nIGFuZCBzb3VyY2VtYXAgYnVpbGRpbmcKKyAgICAgICMgQHBhcmFtIG9mZnNldCBbSW50ZWdlcl0gVGhlIGNoYXJhY3RlciAobm90IGJ5dGUpIG9mZnNldCB3aGVyZSB0aGUgc2NyaXB0IHN0YXJ0cyBpbiB0aGUgbGluZS4KKyAgICAgICMgICBVc2VkIGZvciBlcnJvciByZXBvcnRpbmcgYW5kIHNvdXJjZW1hcCBidWlsZGluZworICAgICAgIyBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBBbiBvcHRpb25zIGhhc2g7IHNlZQorICAgICAgIyAgIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI09wdGlvbnMgdGhlIFNhc3Mgb3B0aW9ucyBkb2N1bWVudGF0aW9ufS4KKyAgICAgICMgICBUaGlzIHN1cHBvcnRzIGFuIGFkZGl0aW9uYWwgYDphbGxvd19leHRyYV90ZXh0YCBvcHRpb24gdGhhdCBjb250cm9scworICAgICAgIyAgIHdoZXRoZXIgdGhlIHBhcnNlciB0aHJvd3MgYW4gZXJyb3Igd2hlbiBleHRyYSB0ZXh0IGlzIGVuY291bnRlcmVkCisgICAgICAjICAgYWZ0ZXIgdGhlIHBhcnNlZCBjb25zdHJ1Y3QuCisgICAgICBkZWYgaW5pdGlhbGl6ZShzdHIsIGxpbmUsIG9mZnNldCwgb3B0aW9ucyA9IHt9KQorICAgICAgICBAb3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgQGFsbG93X2V4dHJhX3RleHQgPSBvcHRpb25zLmRlbGV0ZSg6YWxsb3dfZXh0cmFfdGV4dCkKKyAgICAgICAgQGxleGVyID0gbGV4ZXJfY2xhc3MubmV3KHN0ciwgbGluZSwgb2Zmc2V0LCBvcHRpb25zKQorICAgICAgICBAc3RvcF9hdCA9IG5pbAorICAgICAgZW5kCisKKyAgICAgICMgUGFyc2VzIGEgU2Fzc1NjcmlwdCBleHByZXNzaW9uIHdpdGhpbiBhbiBpbnRlcnBvbGF0ZWQgc2VnbWVudCAoYCN7fWApLgorICAgICAgIyBUaGlzIG1lYW5zIHRoYXQgaXQgc3RvcHMgd2hlbiBpdCBjb21lcyBhY3Jvc3MgYW4gdW5tYXRjaGVkIGB9YCwKKyAgICAgICMgd2hpY2ggc2lnbmFscyB0aGUgZW5kIG9mIGFuIGludGVycG9sYXRlZCBzZWdtZW50LAorICAgICAgIyBpdCByZXR1cm5zIHJhdGhlciB0aGFuIHRocm93aW5nIGFuIGVycm9yLgorICAgICAgIworICAgICAgIyBAcGFyYW0gd2Fybl9mb3JfY29sb3IgW0Jvb2xlYW5dIFdoZXRoZXIgcmF3IGNvbG9yIHZhbHVlcyBwYXNzZWQgdG8KKyAgICAgICMgICBpbnRlcm9wbGF0aW9uIHNob3VsZCBjYXVzZSBhIHdhcm5pbmcuCisgICAgICAjIEByZXR1cm4gW1NjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2UgdHJlZQorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGUgZXhwcmVzc2lvbiBpc24ndCB2YWxpZCBTYXNzU2NyaXB0CisgICAgICBkZWYgcGFyc2VfaW50ZXJwb2xhdGVkKHdhcm5fZm9yX2NvbG9yID0gZmFsc2UpCisgICAgICAgICMgU3RhcnQgdHdvIGNoYXJhY3RlcnMgYmFjayB0byBjb21wZW5zYXRlIGZvciAjeworICAgICAgICBzdGFydF9wb3MgPSBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhsaW5lLCBvZmZzZXQgLSAyKQorICAgICAgICBleHByID0gYXNzZXJ0X2V4cHIgOmV4cHIKKyAgICAgICAgYXNzZXJ0X3RvayA6ZW5kX2ludGVycG9sYXRpb24KKyAgICAgICAgZXhwciA9IFNhc3M6OlNjcmlwdDo6VHJlZTo6SW50ZXJwb2xhdGlvbi5uZXcoCisgICAgICAgICAgbmlsLCBleHByLCBuaWwsIGZhbHNlLCBmYWxzZSwgOndhcm5fZm9yX2NvbG9yID0+IHdhcm5fZm9yX2NvbG9yKQorICAgICAgICBjaGVja19mb3JfaW50ZXJwb2xhdGlvbiBleHByCisgICAgICAgIGV4cHIub3B0aW9ucyA9IEBvcHRpb25zCisgICAgICAgIG5vZGUoZXhwciwgc3RhcnRfcG9zKQorICAgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICAgICAgZS5tb2RpZnlfYmFja3RyYWNlIDpsaW5lID0+IEBsZXhlci5saW5lLCA6ZmlsZW5hbWUgPT4gQG9wdGlvbnNbOmZpbGVuYW1lXQorICAgICAgICByYWlzZSBlCisgICAgICBlbmQKKworICAgICAgIyBQYXJzZXMgYSBTYXNzU2NyaXB0IGV4cHJlc3Npb24uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1NjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2UgdHJlZQorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGUgZXhwcmVzc2lvbiBpc24ndCB2YWxpZCBTYXNzU2NyaXB0CisgICAgICBkZWYgcGFyc2UKKyAgICAgICAgZXhwciA9IGFzc2VydF9leHByIDpleHByCisgICAgICAgIGFzc2VydF9kb25lCisgICAgICAgIGV4cHIub3B0aW9ucyA9IEBvcHRpb25zCisgICAgICAgIGNoZWNrX2Zvcl9pbnRlcnBvbGF0aW9uIGV4cHIKKyAgICAgICAgZXhwcgorICAgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICAgICAgZS5tb2RpZnlfYmFja3RyYWNlIDpsaW5lID0+IEBsZXhlci5saW5lLCA6ZmlsZW5hbWUgPT4gQG9wdGlvbnNbOmZpbGVuYW1lXQorICAgICAgICByYWlzZSBlCisgICAgICBlbmQKKworICAgICAgIyBQYXJzZXMgYSBTYXNzU2NyaXB0IGV4cHJlc3Npb24sCisgICAgICAjIGVuZGluZyBpdCB3aGVuIGl0IGVuY291bnRlcnMgb25lIG9mIHRoZSBnaXZlbiBpZGVudGlmaWVyIHRva2Vucy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHRva2VucyBbI2luY2x1ZGU/KFN0cmluZyldIEEgc2V0IG9mIHN0cmluZ3MgdGhhdCBkZWxpbWl0IHRoZSBleHByZXNzaW9uLgorICAgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlRyZWU6Ok5vZGVdIFRoZSByb290IG5vZGUgb2YgdGhlIHBhcnNlIHRyZWUKKyAgICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgdGhlIGV4cHJlc3Npb24gaXNuJ3QgdmFsaWQgU2Fzc1NjcmlwdAorICAgICAgZGVmIHBhcnNlX3VudGlsKHRva2VucykKKyAgICAgICAgQHN0b3BfYXQgPSB0b2tlbnMKKyAgICAgICAgZXhwciA9IGFzc2VydF9leHByIDpleHByCisgICAgICAgIGFzc2VydF9kb25lCisgICAgICAgIGV4cHIub3B0aW9ucyA9IEBvcHRpb25zCisgICAgICAgIGNoZWNrX2Zvcl9pbnRlcnBvbGF0aW9uIGV4cHIKKyAgICAgICAgZXhwcgorICAgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICAgICAgZS5tb2RpZnlfYmFja3RyYWNlIDpsaW5lID0+IEBsZXhlci5saW5lLCA6ZmlsZW5hbWUgPT4gQG9wdGlvbnNbOmZpbGVuYW1lXQorICAgICAgICByYWlzZSBlCisgICAgICBlbmQKKworICAgICAgIyBQYXJzZXMgdGhlIGFyZ3VtZW50IGxpc3QgZm9yIGEgbWl4aW4gaW5jbHVkZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbKEFycmF5PFNjcmlwdDo6VHJlZTo6Tm9kZT4sCisgICAgICAjICAgICAgICAgIHtTdHJpbmcgPT4gU2NyaXB0OjpUcmVlOjpOb2RlfSwKKyAgICAgICMgICAgICAgICAgU2NyaXB0OjpUcmVlOjpOb2RlLAorICAgICAgIyAgICAgICAgICBTY3JpcHQ6OlRyZWU6Ok5vZGUpXQorICAgICAgIyAgIFRoZSByb290IG5vZGVzIG9mIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cywga2V5d29yZCBhcmd1bWVudHMsIGFuZAorICAgICAgIyAgIHNwbGF0IGFyZ3VtZW50KHMpLiBLZXl3b3JkIGFyZ3VtZW50cyBhcmUgaW4gYSBoYXNoIGZyb20gbmFtZXMgdG8gdmFsdWVzLgorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGUgYXJndW1lbnQgbGlzdCBpc24ndCB2YWxpZCBTYXNzU2NyaXB0CisgICAgICBkZWYgcGFyc2VfbWl4aW5faW5jbHVkZV9hcmdsaXN0CisgICAgICAgIGFyZ3MsIGtleXdvcmRzID0gW10sIHt9CisgICAgICAgIGlmIHRyeV90b2soOmxwYXJlbikKKyAgICAgICAgICBhcmdzLCBrZXl3b3Jkcywgc3BsYXQsIGt3YXJnX3NwbGF0ID0gbWl4aW5fYXJnbGlzdAorICAgICAgICAgIGFzc2VydF90b2soOnJwYXJlbikKKyAgICAgICAgZW5kCisgICAgICAgIGFzc2VydF9kb25lCisKKyAgICAgICAgYXJncy5lYWNoIGRvIHxhfAorICAgICAgICAgIGNoZWNrX2Zvcl9pbnRlcnBvbGF0aW9uIGEKKyAgICAgICAgICBhLm9wdGlvbnMgPSBAb3B0aW9ucworICAgICAgICBlbmQKKworICAgICAgICBrZXl3b3Jkcy5lYWNoIGRvIHxfLCB2fAorICAgICAgICAgIGNoZWNrX2Zvcl9pbnRlcnBvbGF0aW9uIHYKKyAgICAgICAgICB2Lm9wdGlvbnMgPSBAb3B0aW9ucworICAgICAgICBlbmQKKworICAgICAgICBpZiBzcGxhdAorICAgICAgICAgIGNoZWNrX2Zvcl9pbnRlcnBvbGF0aW9uIHNwbGF0CisgICAgICAgICAgc3BsYXQub3B0aW9ucyA9IEBvcHRpb25zCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIGt3YXJnX3NwbGF0CisgICAgICAgICAgY2hlY2tfZm9yX2ludGVycG9sYXRpb24ga3dhcmdfc3BsYXQKKyAgICAgICAgICBrd2FyZ19zcGxhdC5vcHRpb25zID0gQG9wdGlvbnMKKyAgICAgICAgZW5kCisKKyAgICAgICAgcmV0dXJuIGFyZ3MsIGtleXdvcmRzLCBzcGxhdCwga3dhcmdfc3BsYXQKKyAgICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgICAgIGUubW9kaWZ5X2JhY2t0cmFjZSA6bGluZSA9PiBAbGV4ZXIubGluZSwgOmZpbGVuYW1lID0+IEBvcHRpb25zWzpmaWxlbmFtZV0KKyAgICAgICAgcmFpc2UgZQorICAgICAgZW5kCisKKyAgICAgICMgUGFyc2VzIHRoZSBhcmd1bWVudCBsaXN0IGZvciBhIG1peGluIGRlZmluaXRpb24uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gWyhBcnJheTxTY3JpcHQ6OlRyZWU6Ok5vZGU+LCBTY3JpcHQ6OlRyZWU6Ok5vZGUpXQorICAgICAgIyAgIFRoZSByb290IG5vZGVzIG9mIHRoZSBhcmd1bWVudHMsIGFuZCB0aGUgc3BsYXQgYXJndW1lbnQuCisgICAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZSBhcmd1bWVudCBsaXN0IGlzbid0IHZhbGlkIFNhc3NTY3JpcHQKKyAgICAgIGRlZiBwYXJzZV9taXhpbl9kZWZpbml0aW9uX2FyZ2xpc3QKKyAgICAgICAgYXJncywgc3BsYXQgPSBkZWZuX2FyZ2xpc3QhKGZhbHNlKQorICAgICAgICBhc3NlcnRfZG9uZQorCisgICAgICAgIGFyZ3MuZWFjaCBkbyB8aywgdnwKKyAgICAgICAgICBjaGVja19mb3JfaW50ZXJwb2xhdGlvbiBrCisgICAgICAgICAgay5vcHRpb25zID0gQG9wdGlvbnMKKworICAgICAgICAgIGlmIHYKKyAgICAgICAgICAgIGNoZWNrX2Zvcl9pbnRlcnBvbGF0aW9uIHYKKyAgICAgICAgICAgIHYub3B0aW9ucyA9IEBvcHRpb25zCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIHNwbGF0CisgICAgICAgICAgY2hlY2tfZm9yX2ludGVycG9sYXRpb24gc3BsYXQKKyAgICAgICAgICBzcGxhdC5vcHRpb25zID0gQG9wdGlvbnMKKyAgICAgICAgZW5kCisKKyAgICAgICAgcmV0dXJuIGFyZ3MsIHNwbGF0CisgICAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgICAgICBlLm1vZGlmeV9iYWNrdHJhY2UgOmxpbmUgPT4gQGxleGVyLmxpbmUsIDpmaWxlbmFtZSA9PiBAb3B0aW9uc1s6ZmlsZW5hbWVdCisgICAgICAgIHJhaXNlIGUKKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlcyB0aGUgYXJndW1lbnQgbGlzdCBmb3IgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFsoQXJyYXk8U2NyaXB0OjpUcmVlOjpOb2RlPiwgU2NyaXB0OjpUcmVlOjpOb2RlKV0KKyAgICAgICMgICBUaGUgcm9vdCBub2RlcyBvZiB0aGUgYXJndW1lbnRzLCBhbmQgdGhlIHNwbGF0IGFyZ3VtZW50LgorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGUgYXJndW1lbnQgbGlzdCBpc24ndCB2YWxpZCBTYXNzU2NyaXB0CisgICAgICBkZWYgcGFyc2VfZnVuY3Rpb25fZGVmaW5pdGlvbl9hcmdsaXN0CisgICAgICAgIGFyZ3MsIHNwbGF0ID0gZGVmbl9hcmdsaXN0ISh0cnVlKQorICAgICAgICBhc3NlcnRfZG9uZQorCisgICAgICAgIGFyZ3MuZWFjaCBkbyB8aywgdnwKKyAgICAgICAgICBjaGVja19mb3JfaW50ZXJwb2xhdGlvbiBrCisgICAgICAgICAgay5vcHRpb25zID0gQG9wdGlvbnMKKworICAgICAgICAgIGlmIHYKKyAgICAgICAgICAgIGNoZWNrX2Zvcl9pbnRlcnBvbGF0aW9uIHYKKyAgICAgICAgICAgIHYub3B0aW9ucyA9IEBvcHRpb25zCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIHNwbGF0CisgICAgICAgICAgY2hlY2tfZm9yX2ludGVycG9sYXRpb24gc3BsYXQKKyAgICAgICAgICBzcGxhdC5vcHRpb25zID0gQG9wdGlvbnMKKyAgICAgICAgZW5kCisKKyAgICAgICAgcmV0dXJuIGFyZ3MsIHNwbGF0CisgICAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgICAgICBlLm1vZGlmeV9iYWNrdHJhY2UgOmxpbmUgPT4gQGxleGVyLmxpbmUsIDpmaWxlbmFtZSA9PiBAb3B0aW9uc1s6ZmlsZW5hbWVdCisgICAgICAgIHJhaXNlIGUKKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlIGEgc2luZ2xlIHN0cmluZyB2YWx1ZSwgcG9zc2libHkgY29udGFpbmluZyBpbnRlcnBvbGF0aW9uLgorICAgICAgIyBEb2Vzbid0IGFzc2VydCB0aGF0IHRoZSBzY2FubmVyIGlzIGZpbmlzaGVkIGFmdGVyIHBhcnNpbmcuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1NjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2UgdHJlZS4KKyAgICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgdGhlIHN0cmluZyBpc24ndCB2YWxpZCBTYXNzU2NyaXB0CisgICAgICBkZWYgcGFyc2Vfc3RyaW5nCisgICAgICAgIHVubGVzcyAocGVlayA9IEBsZXhlci5wZWVrKSAmJgorICAgICAgICAgICAgKHBlZWsudHlwZSA9PSA6c3RyaW5nIHx8CisgICAgICAgICAgICAocGVlay50eXBlID09IDpmdW5jYWxsICYmIHBlZWsudmFsdWUuZG93bmNhc2UgPT0gJ3VybCcpKQorICAgICAgICAgIGxleGVyLmV4cGVjdGVkISgic3RyaW5nIikKKyAgICAgICAgZW5kCisKKyAgICAgICAgZXhwciA9IGFzc2VydF9leHByIDpmdW5jYWxsCisgICAgICAgIGNoZWNrX2Zvcl9pbnRlcnBvbGF0aW9uIGV4cHIKKyAgICAgICAgZXhwci5vcHRpb25zID0gQG9wdGlvbnMKKyAgICAgICAgQGxleGVyLnVucGVlayEKKyAgICAgICAgZXhwcgorICAgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICAgICAgZS5tb2RpZnlfYmFja3RyYWNlIDpsaW5lID0+IEBsZXhlci5saW5lLCA6ZmlsZW5hbWUgPT4gQG9wdGlvbnNbOmZpbGVuYW1lXQorICAgICAgICByYWlzZSBlCisgICAgICBlbmQKKworICAgICAgIyBQYXJzZXMgYSBTYXNzU2NyaXB0IGV4cHJlc3Npb24uCisgICAgICAjCisgICAgICAjIEBvdmVybG9hZCBwYXJzZShzdHIsIGxpbmUsIG9mZnNldCwgZmlsZW5hbWUgPSBuaWwpCisgICAgICAjIEByZXR1cm4gW1NjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2UgdHJlZQorICAgICAgIyBAc2VlIFBhcnNlciNpbml0aWFsaXplCisgICAgICAjIEBzZWUgUGFyc2VyI3BhcnNlCisgICAgICBkZWYgc2VsZi5wYXJzZSgqYXJncykKKyAgICAgICAgbmV3KCphcmdzKS5wYXJzZQorICAgICAgZW5kCisKKyAgICAgIFBSRUNFREVOQ0UgPSBbCisgICAgICAgIDpjb21tYSwgOnNpbmdsZV9lcSwgOnNwYWNlLCA6b3IsIDphbmQsCisgICAgICAgIFs6ZXEsIDpuZXFdLAorICAgICAgICBbOmd0LCA6Z3RlLCA6bHQsIDpsdGVdLAorICAgICAgICBbOnBsdXMsIDptaW51c10sCisgICAgICAgIFs6dGltZXMsIDpkaXYsIDptb2RdLAorICAgICAgXQorCisgICAgICBBU1NPQ0lBVElWRSA9IFs6cGx1cywgOnRpbWVzXQorCisgICAgICBjbGFzcyA8PCBzZWxmCisgICAgICAgICMgUmV0dXJucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgcHJlY2VkZW5jZQorICAgICAgICAjIG9mIHRoZSBnaXZlbiBvcGVyYXRvci4KKyAgICAgICAgIyBBIGxvd2VyIGludGVnZXIgaW5kaWNhdGVzIGEgbG9vc2VyIGJpbmRpbmcuCisgICAgICAgICMKKyAgICAgICAgIyBAcHJpdmF0ZQorICAgICAgICBkZWYgcHJlY2VkZW5jZV9vZihvcCkKKyAgICAgICAgICBQUkVDRURFTkNFLmVhY2hfd2l0aF9pbmRleCBkbyB8ZSwgaXwKKyAgICAgICAgICAgIHJldHVybiBpIGlmIEFycmF5KGUpLmluY2x1ZGU/KG9wKQorICAgICAgICAgIGVuZAorICAgICAgICAgIHJhaXNlICJbQlVHXSBVbmtub3duIG9wZXJhdG9yICN7b3AuaW5zcGVjdH0iCisgICAgICAgIGVuZAorCisgICAgICAgICMgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gb3BlcmF0aW9uIGlzIGFzc29jaWF0aXZlLgorICAgICAgICAjCisgICAgICAgICMgQHByaXZhdGUKKyAgICAgICAgZGVmIGFzc29jaWF0aXZlPyhvcCkKKyAgICAgICAgICBBU1NPQ0lBVElWRS5pbmNsdWRlPyhvcCkKKyAgICAgICAgZW5kCisKKyAgICAgICAgcHJpdmF0ZQorCisgICAgICAgICMgRGVmaW5lcyBhIHNpbXBsZSBsZWZ0LWFzc29jaWF0aXZlIHByb2R1Y3Rpb24uCisgICAgICAgICMgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdGlvbiwKKyAgICAgICAgIyBzdWIgaXMgdGhlIG5hbWUgb2YgdGhlIHByb2R1Y3Rpb24gYmVuZWF0aCBpdCwKKyAgICAgICAgIyBhbmQgb3BzIGlzIGEgbGlzdCBvZiBvcGVyYXRvcnMgZm9yIHRoaXMgcHJlY2VkZW5jZSBsZXZlbAorICAgICAgICBkZWYgcHJvZHVjdGlvbihuYW1lLCBzdWIsICpvcHMpCisgICAgICAgICAgY2xhc3NfZXZhbCA8PFJVQlksIF9fRklMRV9fLCBfX0xJTkVfXyArIDEKKyAgICAgICAgICAgIGRlZiAje25hbWV9CisgICAgICAgICAgICAgIGludGVycCA9IHRyeV9vcHNfYWZ0ZXJfaW50ZXJwKCN7b3BzLmluc3BlY3R9LCAje25hbWUuaW5zcGVjdH0pCisgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAgaWYgaW50ZXJwCisgICAgICAgICAgICAgIHJldHVybiB1bmxlc3MgZSA9ICN7c3VifQorICAgICAgICAgICAgICB3aGlsZSB0b2sgPSB0cnlfdG9rcygje29wcy5tYXAge3xvfCBvLmluc3BlY3R9LmpvaW4oJywgJyl9KQorICAgICAgICAgICAgICAgIGlmIGludGVycCA9IHRyeV9vcF9iZWZvcmVfaW50ZXJwKHRvaywgZSkKKyAgICAgICAgICAgICAgICAgIG90aGVyX2ludGVycCA9IHRyeV9vcHNfYWZ0ZXJfaW50ZXJwKCN7b3BzLmluc3BlY3R9LCAje25hbWUuaW5zcGVjdH0sIGludGVycCkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAgdW5sZXNzIG90aGVyX2ludGVycAorICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyX2ludGVycAorICAgICAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICAgICAgZSA9IG5vZGUoVHJlZTo6T3BlcmF0aW9uLm5ldyhlLCBhc3NlcnRfZXhwcigje3N1Yi5pbnNwZWN0fSksIHRvay50eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLnNvdXJjZV9yYW5nZS5zdGFydF9wb3MpCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBlCisgICAgICAgICAgICBlbmQKK1JVQlkKKyAgICAgICAgZW5kCisKKyAgICAgICAgZGVmIHVuYXJ5KG9wLCBzdWIpCisgICAgICAgICAgY2xhc3NfZXZhbCA8PFJVQlksIF9fRklMRV9fLCBfX0xJTkVfXyArIDEKKyAgICAgICAgICAgIGRlZiB1bmFyeV8je29wfQorICAgICAgICAgICAgICByZXR1cm4gI3tzdWJ9IHVubGVzcyB0b2sgPSB0cnlfdG9rKDoje29wfSkKKyAgICAgICAgICAgICAgaW50ZXJwID0gdHJ5X29wX2JlZm9yZV9pbnRlcnAodG9rKQorICAgICAgICAgICAgICByZXR1cm4gaW50ZXJwIGlmIGludGVycAorICAgICAgICAgICAgICBzdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgICAgICAgbm9kZShUcmVlOjpVbmFyeU9wZXJhdGlvbi5uZXcoYXNzZXJ0X2V4cHIoOnVuYXJ5XyN7b3B9KSwgOiN7b3B9KSwgc3RhcnRfcG9zKQorICAgICAgICAgICAgZW5kCitSVUJZCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgZGVmIHNvdXJjZV9wb3NpdGlvbgorICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldyhsaW5lLCBvZmZzZXQpCisgICAgICBlbmQKKworICAgICAgZGVmIHJhbmdlKHN0YXJ0X3BvcywgZW5kX3BvcyA9IHNvdXJjZV9wb3NpdGlvbikKKyAgICAgICAgU2Fzczo6U291cmNlOjpSYW5nZS5uZXcoc3RhcnRfcG9zLCBlbmRfcG9zLCBAb3B0aW9uc1s6ZmlsZW5hbWVdLCBAb3B0aW9uc1s6aW1wb3J0ZXJdKQorICAgICAgZW5kCisKKyAgICAgICMgQHByaXZhdGUKKyAgICAgIGRlZiBsZXhlcl9jbGFzczsgTGV4ZXI7IGVuZAorCisgICAgICBkZWYgbWFwCisgICAgICAgIHN0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICBlID0gaW50ZXJwb2xhdGlvbgorICAgICAgICByZXR1cm4gdW5sZXNzIGUKKyAgICAgICAgcmV0dXJuIGxpc3QgZSwgc3RhcnRfcG9zIHVubGVzcyBAbGV4ZXIucGVlayAmJiBAbGV4ZXIucGVlay50eXBlID09IDpjb2xvbgorCisgICAgICAgIHBhaXIgPSBtYXBfcGFpcihlKQorICAgICAgICBtYXAgPSBub2RlKFNhc3M6OlNjcmlwdDo6VHJlZTo6TWFwTGl0ZXJhbC5uZXcoW3BhaXJdKSwgc3RhcnRfcG9zKQorICAgICAgICB3aGlsZSB0cnlfdG9rKDpjb21tYSkKKyAgICAgICAgICBwYWlyID0gbWFwX3BhaXIKKyAgICAgICAgICByZXR1cm4gbWFwIHVubGVzcyBwYWlyCisgICAgICAgICAgbWFwLnBhaXJzIDw8IHBhaXIKKyAgICAgICAgZW5kCisgICAgICAgIG1hcAorICAgICAgZW5kCisKKyAgICAgIGRlZiBtYXBfcGFpcihrZXkgPSBuaWwpCisgICAgICAgIHJldHVybiB1bmxlc3Mga2V5IHx8PSBpbnRlcnBvbGF0aW9uCisgICAgICAgIGFzc2VydF90b2sgOmNvbG9uCisgICAgICAgIHJldHVybiBrZXksIGFzc2VydF9leHByKDppbnRlcnBvbGF0aW9uKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBleHByCisgICAgICAgIHN0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICBlID0gaW50ZXJwb2xhdGlvbgorICAgICAgICByZXR1cm4gdW5sZXNzIGUKKyAgICAgICAgbGlzdCBlLCBzdGFydF9wb3MKKyAgICAgIGVuZAorCisgICAgICBkZWYgbGlzdChmaXJzdCwgc3RhcnRfcG9zKQorICAgICAgICByZXR1cm4gZmlyc3QgdW5sZXNzIEBsZXhlci5wZWVrICYmIEBsZXhlci5wZWVrLnR5cGUgPT0gOmNvbW1hCisKKyAgICAgICAgbGlzdCA9IG5vZGUoU2Fzczo6U2NyaXB0OjpUcmVlOjpMaXN0TGl0ZXJhbC5uZXcoW2ZpcnN0XSwgc2VwYXJhdG9yOiA6Y29tbWEpLCBzdGFydF9wb3MpCisgICAgICAgIHdoaWxlICh0b2sgPSB0cnlfdG9rKDpjb21tYSkpCisgICAgICAgICAgZWxlbWVudF9iZWZvcmVfaW50ZXJwID0gbGlzdC5lbGVtZW50cy5sZW5ndGggPT0gMSA/IGxpc3QuZWxlbWVudHMuZmlyc3QgOiBsaXN0CisgICAgICAgICAgaWYgKGludGVycCA9IHRyeV9vcF9iZWZvcmVfaW50ZXJwKHRvaywgZWxlbWVudF9iZWZvcmVfaW50ZXJwKSkKKyAgICAgICAgICAgIG90aGVyX2ludGVycCA9IHRyeV9vcHNfYWZ0ZXJfaW50ZXJwKFs6Y29tbWFdLCA6ZXhwciwgaW50ZXJwKQorICAgICAgICAgICAgcmV0dXJuIGludGVycCB1bmxlc3Mgb3RoZXJfaW50ZXJwCisgICAgICAgICAgICByZXR1cm4gb3RoZXJfaW50ZXJwCisgICAgICAgICAgZW5kCisgICAgICAgICAgcmV0dXJuIGxpc3QgdW5sZXNzIChlID0gaW50ZXJwb2xhdGlvbikKKyAgICAgICAgICBsaXN0LmVsZW1lbnRzIDw8IGUKKyAgICAgICAgICBsaXN0LnNvdXJjZV9yYW5nZS5lbmRfcG9zID0gbGlzdC5lbGVtZW50cy5sYXN0LnNvdXJjZV9yYW5nZS5lbmRfcG9zCisgICAgICAgIGVuZAorICAgICAgICBsaXN0CisgICAgICBlbmQKKworICAgICAgcHJvZHVjdGlvbiA6ZXF1YWxzLCA6aW50ZXJwb2xhdGlvbiwgOnNpbmdsZV9lcQorCisgICAgICBkZWYgdHJ5X29wX2JlZm9yZV9pbnRlcnAob3AsIHByZXYgPSBuaWwsIGFmdGVyX2ludGVycCA9IGZhbHNlKQorICAgICAgICByZXR1cm4gdW5sZXNzIEBsZXhlci5wZWVrICYmIEBsZXhlci5wZWVrLnR5cGUgPT0gOmJlZ2luX2ludGVycG9sYXRpb24KKyAgICAgICAgdW5hcnkgPSAhcHJldiAmJiAhYWZ0ZXJfaW50ZXJwCisgICAgICAgIHdiID0gQGxleGVyLndoaXRlc3BhY2U/KG9wKQorICAgICAgICBzdHIgPSBsaXRlcmFsX25vZGUoU2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldyhMZXhlcjo6T1BFUkFUT1JTX1JFVkVSU0Vbb3AudHlwZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Auc291cmNlX3JhbmdlKQorCisgICAgICAgIGRlcHJlY2F0aW9uID0KKyAgICAgICAgICBjYXNlIG9wLnR5cGUKKyAgICAgICAgICB3aGVuIDpjb21tYTsgOnBvdGVudGlhbAorICAgICAgICAgIHdoZW4gOmRpdiwgOnNpbmdsZV9lcTsgOm5vbmUKKyAgICAgICAgICB3aGVuIDpwbHVzOyB1bmFyeSA/IDpub25lIDogOmltbWVkaWF0ZQorICAgICAgICAgIHdoZW4gOm1pbnVzOyBAbGV4ZXIud2hpdGVzcGFjZT8oQGxleGVyLnBlZWspID8gOmltbWVkaWF0ZSA6IDpub25lCisgICAgICAgICAgZWxzZTsgOmltbWVkaWF0ZQorICAgICAgICAgIGVuZAorCisgICAgICAgIGludGVycCA9IG5vZGUoCisgICAgICAgICAgU2NyaXB0OjpUcmVlOjpJbnRlcnBvbGF0aW9uLm5ldygKKyAgICAgICAgICAgIHByZXYsIHN0ciwgbmlsLCB3YiwgZmFsc2UsIDpvcmlnaW5hbGx5X3RleHQgPT4gdHJ1ZSwgOmRlcHJlY2F0aW9uID0+IGRlcHJlY2F0aW9uKSwKKyAgICAgICAgICAocHJldiB8fCBzdHIpLnNvdXJjZV9yYW5nZS5zdGFydF9wb3MpCisgICAgICAgIGludGVycG9sYXRpb24oZmlyc3Q6IGludGVycCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgdHJ5X29wc19hZnRlcl9pbnRlcnAob3BzLCBuYW1lLCBwcmV2ID0gbmlsKQorICAgICAgICByZXR1cm4gdW5sZXNzIEBsZXhlci5hZnRlcl9pbnRlcnBvbGF0aW9uPworICAgICAgICBvcCA9IHRyeV90b2tzKCpvcHMpCisgICAgICAgIHJldHVybiB1bmxlc3Mgb3AKKyAgICAgICAgaW50ZXJwID0gdHJ5X29wX2JlZm9yZV9pbnRlcnAob3AsIHByZXYsIDphZnRlcl9pbnRlcnApCisgICAgICAgIHJldHVybiBpbnRlcnAgaWYgaW50ZXJwCisKKyAgICAgICAgd2EgPSBAbGV4ZXIud2hpdGVzcGFjZT8KKyAgICAgICAgc3RyID0gbGl0ZXJhbF9ub2RlKFNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoTGV4ZXI6Ok9QRVJBVE9SU19SRVZFUlNFW29wLnR5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLnNvdXJjZV9yYW5nZSkKKyAgICAgICAgc3RyLmxpbmUgPSBAbGV4ZXIubGluZQorCisgICAgICAgIGRlcHJlY2F0aW9uID0KKyAgICAgICAgICBjYXNlIG9wLnR5cGUKKyAgICAgICAgICB3aGVuIDpjb21tYTsgOnBvdGVudGlhbAorICAgICAgICAgIHdoZW4gOmRpdiwgOnNpbmdsZV9lcTsgOm5vbmUKKyAgICAgICAgICB3aGVuIDptaW51czsgQGxleGVyLndoaXRlc3BhY2U/KG9wKSA/IDppbW1lZGlhdGUgOiA6bm9uZQorICAgICAgICAgIGVsc2U7IDppbW1lZGlhdGUKKyAgICAgICAgICBlbmQKKyAgICAgICAgaW50ZXJwID0gbm9kZSgKKyAgICAgICAgICBTY3JpcHQ6OlRyZWU6OkludGVycG9sYXRpb24ubmV3KAorICAgICAgICAgICAgcHJldiwgc3RyLCBhc3NlcnRfZXhwcihuYW1lKSwgZmFsc2UsIHdhLAorICAgICAgICAgICAgOm9yaWdpbmFsbHlfdGV4dCA9PiB0cnVlLCA6ZGVwcmVjYXRpb24gPT4gZGVwcmVjYXRpb24pLAorICAgICAgICAgIChwcmV2IHx8IHN0cikuc291cmNlX3JhbmdlLnN0YXJ0X3BvcykKKyAgICAgICAgaW50ZXJwCisgICAgICBlbmQKKworICAgICAgZGVmIGludGVycG9sYXRpb24oZmlyc3Q6IG5pbCwgaW5uZXI6IDpzcGFjZSkKKyAgICAgICAgZSA9IGZpcnN0IHx8IHNlbmQoaW5uZXIpCisgICAgICAgIHdoaWxlIChpbnRlcnAgPSB0cnlfdG9rKDpiZWdpbl9pbnRlcnBvbGF0aW9uKSkKKyAgICAgICAgICB3YiA9IEBsZXhlci53aGl0ZXNwYWNlPyhpbnRlcnApCisgICAgICAgICAgY2hhcl9iZWZvcmUgPSBAbGV4ZXIuY2hhcihpbnRlcnAucG9zIC0gMSkKKyAgICAgICAgICBtaWQgPSBhc3NlcnRfZXhwciA6ZXhwcgorICAgICAgICAgIGFzc2VydF90b2sgOmVuZF9pbnRlcnBvbGF0aW9uCisgICAgICAgICAgd2EgPSBAbGV4ZXIud2hpdGVzcGFjZT8KKyAgICAgICAgICBjaGFyX2FmdGVyID0gQGxleGVyLmNoYXIKKworICAgICAgICAgIGFmdGVyID0gc2VuZChpbm5lcikKKyAgICAgICAgICBiZWZvcmVfZGVwcmVjYXRpb24gPSBlLmlzX2E/KFNjcmlwdDo6VHJlZTo6SW50ZXJwb2xhdGlvbikgPyBlLmRlcHJlY2F0aW9uIDogOm5vbmUKKyAgICAgICAgICBhZnRlcl9kZXByZWNhdGlvbiA9IGFmdGVyLmlzX2E/KFNjcmlwdDo6VHJlZTo6SW50ZXJwb2xhdGlvbikgPyBhZnRlci5kZXByZWNhdGlvbiA6IDpub25lCisKKyAgICAgICAgICBkZXByZWNhdGlvbiA9CisgICAgICAgICAgICBpZiBiZWZvcmVfZGVwcmVjYXRpb24gPT0gOmltbWVkaWF0ZSB8fCBhZnRlcl9kZXByZWNhdGlvbiA9PSA6aW1tZWRpYXRlIHx8CisgICAgICAgICAgICAgICAjIFdhcm4gZm9yICN7Zm9vfSR2YXIgYW5kICN7Zm9vfSgxKSBidXQgbm90ICN7JGZvb30xLgorICAgICAgICAgICAgICAgKGFmdGVyICYmICF3YSAmJiBjaGFyX2FmdGVyID1+IC9bJChdLykgfHwKKyAgICAgICAgICAgICAgICMgV2FybiBmb3IgJHZhciN7Zm9vfSBhbmQgKGEpI3tmb299IGJ1dCBub3QgYSN7Zm9vfS4KKyAgICAgICAgICAgICAgIChlICYmICF3YiAmJiBpc191bnNhZmVfYmVmb3JlPyhlLCBjaGFyX2JlZm9yZSkpCisgICAgICAgICAgICAgIDppbW1lZGlhdGUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgOnBvdGVudGlhbAorICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICBlID0gbm9kZSgKKyAgICAgICAgICAgIFNjcmlwdDo6VHJlZTo6SW50ZXJwb2xhdGlvbi5uZXcoZSwgbWlkLCBhZnRlciwgd2IsIHdhLCA6ZGVwcmVjYXRpb24gPT4gZGVwcmVjYXRpb24pLAorICAgICAgICAgICAgKGUgfHwgaW50ZXJwKS5zb3VyY2VfcmFuZ2Uuc3RhcnRfcG9zKQorICAgICAgICBlbmQKKyAgICAgICAgZQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyB3aGV0aGVyIGBleHByYCBpcyB1bnNhZmUgdG8gaW5jbHVkZSBiZWZvcmUgYW4gaW50ZXJwb2xhdGlvbi4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGV4cHIgW05vZGVdIFRoZSBleHByZXNzaW9uIHRvIGNoZWNrLgorICAgICAgIyBAcGFyYW0gY2hhcl9iZWZvcmUgW1N0cmluZ10gVGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlCisgICAgICAjICAgaW50ZXJwb2xhdGlvbiBiZWluZyBjaGVja2VkIChhbmQgcHJlc3VtYWJseSB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YKKyAgICAgICMgICBgZXhwcmApLgorICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIGlzX3Vuc2FmZV9iZWZvcmU/KGV4cHIsIGNoYXJfYmVmb3JlKQorICAgICAgICByZXR1cm4gY2hhcl9iZWZvcmUgPT0gJyknIGlmIGlzX3NhZmVfdmFsdWU/KGV4cHIpCisKKyAgICAgICAgIyBPdGhlcndpc2UsIGl0J3Mgb25seSBzYWZlIGlmIGl0IHdhcyBhbm90aGVyIGludGVycG9sYXRpb24uCisgICAgICAgICFleHByLmlzX2E/KFNjcmlwdDo6VHJlZTo6SW50ZXJwb2xhdGlvbikKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgd2hldGhlciBgZXhwcmAgaXMgc2FmZSBhcyB0aGUgdmFsdWUgaW1tZWRpYXRlbHkgYmVmb3JlIGFuCisgICAgICAjIGludGVycG9sYXRpb24uCisgICAgICAjCisgICAgICAjIEl0J3Mgc2FmZSBhcyBsb25nIGFzIHRoZSBwcmV2aW91cyBleHByZXNzaW9uIGlzIGFuIGlkZW50aWZpZXIgb3IgbnVtYmVyLAorICAgICAgIyBvciBhIGxpc3Qgd2hvc2UgbGFzdCBlbGVtZW50IGlzIGFsc28gc2FmZS4KKyAgICAgIGRlZiBpc19zYWZlX3ZhbHVlPyhleHByKQorICAgICAgICByZXR1cm4gaXNfc2FmZV92YWx1ZT8oZXhwci5lbGVtZW50cy5sYXN0KSBpZiBleHByLmlzX2E/KFNjcmlwdDo6VHJlZTo6TGlzdExpdGVyYWwpCisgICAgICAgIHJldHVybiBmYWxzZSB1bmxlc3MgZXhwci5pc19hPyhTY3JpcHQ6OlRyZWU6OkxpdGVyYWwpCisgICAgICAgIGV4cHIudmFsdWUuaXNfYT8oU2NyaXB0OjpWYWx1ZTo6TnVtYmVyKSB8fAorICAgICAgICAgIChleHByLnZhbHVlLmlzX2E/KFNjcmlwdDo6VmFsdWU6OlN0cmluZykgJiYgZXhwci52YWx1ZS50eXBlID09IDppZGVudGlmaWVyKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzcGFjZQorICAgICAgICBzdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgZSA9IG9yX2V4cHIKKyAgICAgICAgcmV0dXJuIHVubGVzcyBlCisgICAgICAgIGFyciA9IFtlXQorICAgICAgICB3aGlsZSAoZSA9IG9yX2V4cHIpCisgICAgICAgICAgYXJyIDw8IGUKKyAgICAgICAgZW5kCisgICAgICAgIGlmIGFyci5zaXplID09IDEKKyAgICAgICAgICBhcnIuZmlyc3QKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5vZGUoU2Fzczo6U2NyaXB0OjpUcmVlOjpMaXN0TGl0ZXJhbC5uZXcoYXJyLCBzZXBhcmF0b3I6IDpzcGFjZSksIHN0YXJ0X3BvcykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgcHJvZHVjdGlvbiA6b3JfZXhwciwgOmFuZF9leHByLCA6b3IKKyAgICAgIHByb2R1Y3Rpb24gOmFuZF9leHByLCA6ZXFfb3JfbmVxLCA6YW5kCisgICAgICBwcm9kdWN0aW9uIDplcV9vcl9uZXEsIDpyZWxhdGlvbmFsLCA6ZXEsIDpuZXEKKyAgICAgIHByb2R1Y3Rpb24gOnJlbGF0aW9uYWwsIDpwbHVzX29yX21pbnVzLCA6Z3QsIDpndGUsIDpsdCwgOmx0ZQorICAgICAgcHJvZHVjdGlvbiA6cGx1c19vcl9taW51cywgOnRpbWVzX2Rpdl9vcl9tb2QsIDpwbHVzLCA6bWludXMKKyAgICAgIHByb2R1Y3Rpb24gOnRpbWVzX2Rpdl9vcl9tb2QsIDp1bmFyeV9wbHVzLCA6dGltZXMsIDpkaXYsIDptb2QKKworICAgICAgdW5hcnkgOnBsdXMsIDp1bmFyeV9taW51cworICAgICAgdW5hcnkgOm1pbnVzLCA6dW5hcnlfZGl2CisgICAgICB1bmFyeSA6ZGl2LCA6dW5hcnlfbm90ICMgRm9yIHN0cmluZ3MsIHNvIC9mb28vYmFyIHdvcmtzCisgICAgICB1bmFyeSA6bm90LCA6aWRlbnQKKworICAgICAgZGVmIGlkZW50CisgICAgICAgIHJldHVybiBmdW5jYWxsIHVubGVzcyBAbGV4ZXIucGVlayAmJiBAbGV4ZXIucGVlay50eXBlID09IDppZGVudAorICAgICAgICByZXR1cm4gaWYgQHN0b3BfYXQgJiYgQHN0b3BfYXQuaW5jbHVkZT8oQGxleGVyLnBlZWsudmFsdWUpCisKKyAgICAgICAgbmFtZSA9IEBsZXhlci5uZXh0CisgICAgICAgIGlmIChjb2xvciA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yOjpDT0xPUl9OQU1FU1tuYW1lLnZhbHVlLmRvd25jYXNlXSkKKyAgICAgICAgICBsaXRlcmFsX25vZGUoU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IubmV3KGNvbG9yLCBuYW1lLnZhbHVlKSwgbmFtZS5zb3VyY2VfcmFuZ2UpCisgICAgICAgIGVsc2lmIG5hbWUudmFsdWUgPT0gInRydWUiCisgICAgICAgICAgbGl0ZXJhbF9ub2RlKFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2wubmV3KHRydWUpLCBuYW1lLnNvdXJjZV9yYW5nZSkKKyAgICAgICAgZWxzaWYgbmFtZS52YWx1ZSA9PSAiZmFsc2UiCisgICAgICAgICAgbGl0ZXJhbF9ub2RlKFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2wubmV3KGZhbHNlKSwgbmFtZS5zb3VyY2VfcmFuZ2UpCisgICAgICAgIGVsc2lmIG5hbWUudmFsdWUgPT0gIm51bGwiCisgICAgICAgICAgbGl0ZXJhbF9ub2RlKFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bGwubmV3LCBuYW1lLnNvdXJjZV9yYW5nZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxpdGVyYWxfbm9kZShTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KG5hbWUudmFsdWUsIDppZGVudGlmaWVyKSwgbmFtZS5zb3VyY2VfcmFuZ2UpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBmdW5jYWxsCisgICAgICAgIHRvayA9IHRyeV90b2soOmZ1bmNhbGwpCisgICAgICAgIHJldHVybiByYXcgdW5sZXNzIHRvaworICAgICAgICBhcmdzLCBrZXl3b3Jkcywgc3BsYXQsIGt3YXJnX3NwbGF0ID0gZm5fYXJnbGlzdAorICAgICAgICBhc3NlcnRfdG9rKDpycGFyZW4pCisgICAgICAgIG5vZGUoU2NyaXB0OjpUcmVlOjpGdW5jYWxsLm5ldyh0b2sudmFsdWUsIGFyZ3MsIGtleXdvcmRzLCBzcGxhdCwga3dhcmdfc3BsYXQpLAorICAgICAgICAgIHRvay5zb3VyY2VfcmFuZ2Uuc3RhcnRfcG9zLCBzb3VyY2VfcG9zaXRpb24pCisgICAgICBlbmQKKworICAgICAgZGVmIGRlZm5fYXJnbGlzdCEobXVzdF9oYXZlX3BhcmVucykKKyAgICAgICAgaWYgbXVzdF9oYXZlX3BhcmVucworICAgICAgICAgIGFzc2VydF90b2soOmxwYXJlbikKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBbXSwgbmlsIHVubGVzcyB0cnlfdG9rKDpscGFyZW4pCisgICAgICAgIGVuZAorCisgICAgICAgIHJlcyA9IFtdCisgICAgICAgIHNwbGF0ID0gbmlsCisgICAgICAgIG11c3RfaGF2ZV9kZWZhdWx0ID0gZmFsc2UKKyAgICAgICAgbG9vcCBkbworICAgICAgICAgIGJyZWFrIGlmIHBlZWtfdG9rKDpycGFyZW4pCisgICAgICAgICAgYyA9IGFzc2VydF90b2soOmNvbnN0KQorICAgICAgICAgIHZhciA9IG5vZGUoU2NyaXB0OjpUcmVlOjpWYXJpYWJsZS5uZXcoYy52YWx1ZSksIGMuc291cmNlX3JhbmdlKQorICAgICAgICAgIGlmIHRyeV90b2soOmNvbG9uKQorICAgICAgICAgICAgdmFsID0gYXNzZXJ0X2V4cHIoOnNwYWNlKQorICAgICAgICAgICAgbXVzdF9oYXZlX2RlZmF1bHQgPSB0cnVlCisgICAgICAgICAgZWxzaWYgdHJ5X3Rvayg6c3BsYXQpCisgICAgICAgICAgICBzcGxhdCA9IHZhcgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBlbHNpZiBtdXN0X2hhdmVfZGVmYXVsdAorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KAorICAgICAgICAgICAgICAiUmVxdWlyZWQgYXJndW1lbnQgI3t2YXIuaW5zcGVjdH0gbXVzdCBjb21lIGJlZm9yZSBhbnkgb3B0aW9uYWwgYXJndW1lbnRzLiIpCisgICAgICAgICAgZW5kCisgICAgICAgICAgcmVzIDw8IFt2YXIsIHZhbF0KKyAgICAgICAgICBicmVhayB1bmxlc3MgdHJ5X3Rvayg6Y29tbWEpCisgICAgICAgIGVuZAorICAgICAgICBhc3NlcnRfdG9rKDpycGFyZW4pCisgICAgICAgIHJldHVybiByZXMsIHNwbGF0CisgICAgICBlbmQKKworICAgICAgZGVmIGZuX2FyZ2xpc3QKKyAgICAgICAgYXJnbGlzdCg6ZXF1YWxzLCAiZnVuY3Rpb24gYXJndW1lbnQiKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBtaXhpbl9hcmdsaXN0CisgICAgICAgIGFyZ2xpc3QoOmludGVycG9sYXRpb24sICJtaXhpbiBhcmd1bWVudCIpCisgICAgICBlbmQKKworICAgICAgZGVmIGFyZ2xpc3Qoc3ViZXhwciwgZGVzY3JpcHRpb24pCisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBrZXl3b3JkcyA9IFNhc3M6OlV0aWw6Ok5vcm1hbGl6ZWRNYXAubmV3CisgICAgICAgIHNwbGF0ID0gbmlsCisgICAgICAgIHdoaWxlIChlID0gc2VuZChzdWJleHByKSkKKyAgICAgICAgICBpZiBAbGV4ZXIucGVlayAmJiBAbGV4ZXIucGVlay50eXBlID09IDpjb2xvbgorICAgICAgICAgICAgbmFtZSA9IGUKKyAgICAgICAgICAgIEBsZXhlci5leHBlY3RlZCEoImNvbW1hIikgdW5sZXNzIG5hbWUuaXNfYT8oVHJlZTo6VmFyaWFibGUpCisgICAgICAgICAgICBhc3NlcnRfdG9rKDpjb2xvbikKKyAgICAgICAgICAgIHZhbHVlID0gYXNzZXJ0X2V4cHIoc3ViZXhwciwgZGVzY3JpcHRpb24pCisKKyAgICAgICAgICAgIGlmIGtleXdvcmRzW25hbWUubmFtZV0KKyAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJLZXl3b3JkIGFyZ3VtZW50IFwiI3tuYW1lLnRvX3Nhc3N9XCIgcGFzc2VkIG1vcmUgdGhhbiBvbmNlIikKKyAgICAgICAgICAgIGVuZAorCisgICAgICAgICAgICBrZXl3b3Jkc1tuYW1lLm5hbWVdID0gdmFsdWUKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiB0cnlfdG9rKDpzcGxhdCkKKyAgICAgICAgICAgICAgcmV0dXJuIGFyZ3MsIGtleXdvcmRzLCBzcGxhdCwgZSBpZiBzcGxhdAorICAgICAgICAgICAgICBzcGxhdCwgZSA9IGUsIG5pbAorICAgICAgICAgICAgZWxzaWYgc3BsYXQKKyAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KCJPbmx5IGtleXdvcmQgYXJndW1lbnRzIG1heSBmb2xsb3cgdmFyaWFibGUgYXJndW1lbnRzICguLi4pLiIpCisgICAgICAgICAgICBlbHNpZiAha2V5d29yZHMuZW1wdHk/CisgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLm5ldygiUG9zaXRpb25hbCBhcmd1bWVudHMgbXVzdCBjb21lIGJlZm9yZSBrZXl3b3JkIGFyZ3VtZW50cy4iKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBhcmdzIDw8IGUgaWYgZQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgcmV0dXJuIGFyZ3MsIGtleXdvcmRzLCBzcGxhdCB1bmxlc3MgdHJ5X3Rvayg6Y29tbWEpCisgICAgICAgIGVuZAorICAgICAgICByZXR1cm4gYXJncywga2V5d29yZHMKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmF3CisgICAgICAgIHRvayA9IHRyeV90b2soOnJhdykKKyAgICAgICAgcmV0dXJuIHNwZWNpYWxfZnVuIHVubGVzcyB0b2sKKyAgICAgICAgbGl0ZXJhbF9ub2RlKFNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcodG9rLnZhbHVlKSwgdG9rLnNvdXJjZV9yYW5nZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3BlY2lhbF9mdW4KKyAgICAgICAgZmlyc3QgPSB0cnlfdG9rKDpzcGVjaWFsX2Z1bikKKyAgICAgICAgcmV0dXJuIHNxdWFyZV9saXN0IHVubGVzcyBmaXJzdAorICAgICAgICBzdHIgPSBsaXRlcmFsX25vZGUoZmlyc3QudmFsdWUsIGZpcnN0LnNvdXJjZV9yYW5nZSkKKyAgICAgICAgcmV0dXJuIHN0ciB1bmxlc3MgdHJ5X3Rvayg6c3RyaW5nX2ludGVycG9sYXRpb24pCisgICAgICAgIG1pZCA9IGFzc2VydF9leHByIDpleHByCisgICAgICAgIGFzc2VydF90b2sgOmVuZF9pbnRlcnBvbGF0aW9uCisgICAgICAgIGxhc3QgPSBhc3NlcnRfZXhwcig6c3BlY2lhbF9mdW4pCisgICAgICAgIG5vZGUoCisgICAgICAgICAgVHJlZTo6SW50ZXJwb2xhdGlvbi5uZXcoc3RyLCBtaWQsIGxhc3QsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgZmlyc3Quc291cmNlX3JhbmdlLnN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3F1YXJlX2xpc3QKKyAgICAgICAgc3RhcnRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgIHJldHVybiBwYXJlbiB1bmxlc3MgdHJ5X3Rvayg6bHNxdWFyZSkKKworICAgICAgICBzcGFjZV9zdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgZSA9IGludGVycG9sYXRpb24oaW5uZXI6IDpvcl9leHByKQorICAgICAgICBzZXBhcmF0b3IgPSBuaWwKKyAgICAgICAgaWYgZQorICAgICAgICAgIGVsZW1lbnRzID0gW2VdCisgICAgICAgICAgd2hpbGUgKGUgPSBpbnRlcnBvbGF0aW9uKGlubmVyOiA6b3JfZXhwcikpCisgICAgICAgICAgICBlbGVtZW50cyA8PCBlCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICAjIElmIHRoZXJlJ3MgYSBjb21tYSBhZnRlciBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0LCBpdCdzIGFjdHVhbGx5IGEKKyAgICAgICAgICAjIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG5lc3RlZCBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LgorICAgICAgICAgIGlmIHRyeV90b2soOmNvbW1hKQorICAgICAgICAgICAgZSA9IGlmIGVsZW1lbnRzLmxlbmd0aCA9PSAxCisgICAgICAgICAgICAgICAgICBlbGVtZW50cy5maXJzdAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG5vZGUoCisgICAgICAgICAgICAgICAgICAgIFNhc3M6OlNjcmlwdDo6VHJlZTo6TGlzdExpdGVyYWwubmV3KGVsZW1lbnRzLCBzZXBhcmF0b3I6IDpzcGFjZSksCisgICAgICAgICAgICAgICAgICAgIHNwYWNlX3N0YXJ0X3BvcykKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVsZW1lbnRzID0gW2VdCisKKyAgICAgICAgICAgIHdoaWxlIChlID0gc3BhY2UpCisgICAgICAgICAgICAgIGVsZW1lbnRzIDw8IGUKKyAgICAgICAgICAgICAgYnJlYWsgdW5sZXNzIHRyeV90b2soOmNvbW1hKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBzZXBhcmF0b3IgPSA6Y29tbWEKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXBhcmF0b3IgPSA6c3BhY2UgaWYgZWxlbWVudHMubGVuZ3RoID4gMQorICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgZWxlbWVudHMgPSBbXQorICAgICAgICBlbmQKKworICAgICAgICBhc3NlcnRfdG9rKDpyc3F1YXJlKQorICAgICAgICBlbmRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisKKyAgICAgICAgbm9kZShTYXNzOjpTY3JpcHQ6OlRyZWU6Okxpc3RMaXRlcmFsLm5ldyhlbGVtZW50cywgc2VwYXJhdG9yOiBzZXBhcmF0b3IsIGJyYWNrZXRlZDogdHJ1ZSksCisgICAgICAgICAgICAgc3RhcnRfcG9zLCBlbmRfcG9zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBwYXJlbgorICAgICAgICByZXR1cm4gdmFyaWFibGUgdW5sZXNzIHRyeV90b2soOmxwYXJlbikKKyAgICAgICAgc3RhcnRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgIGUgPSBtYXAKKyAgICAgICAgZS5mb3JjZV9kaXZpc2lvbiEgaWYgZQorICAgICAgICBlbmRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgIGFzc2VydF90b2soOnJwYXJlbikKKyAgICAgICAgZSB8fCBub2RlKFNhc3M6OlNjcmlwdDo6VHJlZTo6TGlzdExpdGVyYWwubmV3KFtdKSwgc3RhcnRfcG9zLCBlbmRfcG9zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiB2YXJpYWJsZQorICAgICAgICBzdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgYyA9IHRyeV90b2soOmNvbnN0KQorICAgICAgICByZXR1cm4gc3RyaW5nIHVubGVzcyBjCisgICAgICAgIG5vZGUoVHJlZTo6VmFyaWFibGUubmV3KCpjLnZhbHVlKSwgc3RhcnRfcG9zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdHJpbmcKKyAgICAgICAgZmlyc3QgPSB0cnlfdG9rKDpzdHJpbmcpCisgICAgICAgIHJldHVybiBudW1iZXIgdW5sZXNzIGZpcnN0CisgICAgICAgIHN0ciA9IGxpdGVyYWxfbm9kZShmaXJzdC52YWx1ZSwgZmlyc3Quc291cmNlX3JhbmdlKQorICAgICAgICByZXR1cm4gc3RyIHVubGVzcyB0cnlfdG9rKDpzdHJpbmdfaW50ZXJwb2xhdGlvbikKKyAgICAgICAgbWlkID0gYXNzZXJ0X2V4cHIgOmV4cHIKKyAgICAgICAgYXNzZXJ0X3RvayA6ZW5kX2ludGVycG9sYXRpb24KKyAgICAgICAgbGFzdCA9IGFzc2VydF9leHByKDpzdHJpbmcpCisgICAgICAgIG5vZGUoVHJlZTo6U3RyaW5nSW50ZXJwb2xhdGlvbi5uZXcoc3RyLCBtaWQsIGxhc3QpLCBmaXJzdC5zb3VyY2VfcmFuZ2Uuc3RhcnRfcG9zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBudW1iZXIKKyAgICAgICAgdG9rID0gdHJ5X3Rvayg6bnVtYmVyKQorICAgICAgICByZXR1cm4gc2VsZWN0b3IgdW5sZXNzIHRvaworICAgICAgICBudW0gPSB0b2sudmFsdWUKKyAgICAgICAgbnVtLm9wdGlvbnMgPSBAb3B0aW9ucworICAgICAgICBudW0ub3JpZ2luYWwgPSBudW0udG9fcworICAgICAgICBsaXRlcmFsX25vZGUobnVtLCB0b2suc291cmNlX3JhbmdlLnN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZWN0b3IKKyAgICAgICAgdG9rID0gdHJ5X3Rvayg6c2VsZWN0b3IpCisgICAgICAgIHJldHVybiBsaXRlcmFsIHVubGVzcyB0b2sKKyAgICAgICAgbm9kZSh0b2sudmFsdWUsIHRvay5zb3VyY2VfcmFuZ2Uuc3RhcnRfcG9zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBsaXRlcmFsCisgICAgICAgIHQgPSB0cnlfdG9rKDpjb2xvcikKKyAgICAgICAgcmV0dXJuIGxpdGVyYWxfbm9kZSh0LnZhbHVlLCB0LnNvdXJjZV9yYW5nZSkgaWYgdAorICAgICAgZW5kCisKKyAgICAgICMgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaGF2ZSB1bmlmaWVkICNhc3NlcnQgYW5kICN0cnkgbWV0aG9kcywKKyAgICAgICMgYnV0IGRldGVjdGluZyB0aGUgbWV0aG9kL3Rva2VuIGRpZmZlcmVuY2UgdHVybnMgb3V0IHRvIGJlIHF1aXRlIGV4cGVuc2l2ZS4KKworICAgICAgRVhQUl9OQU1FUyA9IHsKKyAgICAgICAgOnN0cmluZyA9PiAic3RyaW5nIiwKKyAgICAgICAgOmRlZmF1bHQgPT4gImV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSIsCisgICAgICAgIDptaXhpbl9hcmdsaXN0ID0+ICJtaXhpbiBhcmd1bWVudCIsCisgICAgICAgIDpmbl9hcmdsaXN0ID0+ICJmdW5jdGlvbiBhcmd1bWVudCIsCisgICAgICAgIDpzcGxhdCA9PiAiLi4uIiwKKyAgICAgICAgOnNwZWNpYWxfZnVuID0+ICciKSInLAorICAgICAgfQorCisgICAgICBkZWYgYXNzZXJ0X2V4cHIobmFtZSwgZXhwZWN0ZWQgPSBuaWwpCisgICAgICAgIGUgPSBzZW5kKG5hbWUpCisgICAgICAgIHJldHVybiBlIGlmIGUKKyAgICAgICAgQGxleGVyLmV4cGVjdGVkIShleHBlY3RlZCB8fCBFWFBSX05BTUVTW25hbWVdIHx8IEVYUFJfTkFNRVNbOmRlZmF1bHRdKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBhc3NlcnRfdG9rKG5hbWUpCisgICAgICAgICMgQXZvaWRzIGFuIGFycmF5IGFsbG9jYXRpb24gY2F1c2VkIGJ5IGFyZ3VtZW50IGdsb2JiaW5nIGluIGFzc2VydF90b2tzLgorICAgICAgICB0ID0gdHJ5X3RvayhuYW1lKQorICAgICAgICByZXR1cm4gdCBpZiB0CisgICAgICAgIEBsZXhlci5leHBlY3RlZCEoTGV4ZXI6OlRPS0VOX05BTUVTW25hbWVdIHx8IG5hbWUudG9fcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgYXNzZXJ0X3Rva3MoKm5hbWVzKQorICAgICAgICB0ID0gdHJ5X3Rva3MoKm5hbWVzKQorICAgICAgICByZXR1cm4gdCBpZiB0CisgICAgICAgIEBsZXhlci5leHBlY3RlZCEobmFtZXMubWFwIHt8dG9rfCBMZXhlcjo6VE9LRU5fTkFNRVNbdG9rXSB8fCB0b2t9LmpvaW4oIiBvciAiKSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgcGVla190b2sobmFtZSkKKyAgICAgICAgIyBBdm9pZHMgYW4gYXJyYXkgYWxsb2NhdGlvbiBjYXVzZWQgYnkgYXJndW1lbnQgZ2xvYmJpbmcgaW4gdGhlIHRyeV90b2tzIG1ldGhvZC4KKyAgICAgICAgcGVla2VkID0gQGxleGVyLnBlZWsKKyAgICAgICAgcGVla2VkICYmIG5hbWUgPT0gcGVla2VkLnR5cGUKKyAgICAgIGVuZAorCisgICAgICBkZWYgdHJ5X3RvayhuYW1lKQorICAgICAgICBwZWVrX3RvayhuYW1lKSAmJiBAbGV4ZXIubmV4dAorICAgICAgZW5kCisKKyAgICAgIGRlZiB0cnlfdG9rcygqbmFtZXMpCisgICAgICAgIHBlZWtlZCA9IEBsZXhlci5wZWVrCisgICAgICAgIHBlZWtlZCAmJiBuYW1lcy5pbmNsdWRlPyhwZWVrZWQudHlwZSkgJiYgQGxleGVyLm5leHQKKyAgICAgIGVuZAorCisgICAgICBkZWYgYXNzZXJ0X2RvbmUKKyAgICAgICAgaWYgQGFsbG93X2V4dHJhX3RleHQKKyAgICAgICAgICAjIElmIGV4dHJhIHRleHQgaXMgYWxsb3dlZCwganVzdCByZXdpbmQgdGhlIGxleGVyIHNvIHRoYXQgdGhlCisgICAgICAgICAgIyBTdHJpbmdTY2FubmVyIGlzIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHBhcnNlZCB0ZXh0LgorICAgICAgICAgIEBsZXhlci51bnBlZWshCisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gaWYgQGxleGVyLmRvbmU/CisgICAgICAgICAgQGxleGVyLmV4cGVjdGVkIShFWFBSX05BTUVTWzpkZWZhdWx0XSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBAb3ZlcmxvYWQgbm9kZSh2YWx1ZSwgc291cmNlX3JhbmdlKQorICAgICAgIyAgIEBwYXJhbSB2YWx1ZSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICAgICMgICBAcGFyYW0gc291cmNlX3JhbmdlIFtTYXNzOjpTb3VyY2U6OlJhbmdlXQorICAgICAgIyBAb3ZlcmxvYWQgbm9kZSh2YWx1ZSwgc3RhcnRfcG9zLCBlbmRfcG9zID0gc291cmNlX3Bvc2l0aW9uKQorICAgICAgIyAgIEBwYXJhbSB2YWx1ZSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICAgICMgICBAcGFyYW0gc3RhcnRfcG9zIFtTYXNzOjpTb3VyY2U6OlBvc2l0aW9uXQorICAgICAgIyAgIEBwYXJhbSBlbmRfcG9zIFtTYXNzOjpTb3VyY2U6OlBvc2l0aW9uXQorICAgICAgZGVmIGxpdGVyYWxfbm9kZSh2YWx1ZSwgc291cmNlX3JhbmdlX29yX3N0YXJ0X3BvcywgZW5kX3BvcyA9IHNvdXJjZV9wb3NpdGlvbikKKyAgICAgICAgbm9kZShTYXNzOjpTY3JpcHQ6OlRyZWU6OkxpdGVyYWwubmV3KHZhbHVlKSwgc291cmNlX3JhbmdlX29yX3N0YXJ0X3BvcywgZW5kX3BvcykKKyAgICAgIGVuZAorCisgICAgICAjIEBvdmVybG9hZCBub2RlKG5vZGUsIHNvdXJjZV9yYW5nZSkKKyAgICAgICMgICBAcGFyYW0gbm9kZSBbU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlXQorICAgICAgIyAgIEBwYXJhbSBzb3VyY2VfcmFuZ2UgW1Nhc3M6OlNvdXJjZTo6UmFuZ2VdCisgICAgICAjIEBvdmVybG9hZCBub2RlKG5vZGUsIHN0YXJ0X3BvcywgZW5kX3BvcyA9IHNvdXJjZV9wb3NpdGlvbikKKyAgICAgICMgICBAcGFyYW0gbm9kZSBbU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlXQorICAgICAgIyAgIEBwYXJhbSBzdGFydF9wb3MgW1Nhc3M6OlNvdXJjZTo6UG9zaXRpb25dCisgICAgICAjICAgQHBhcmFtIGVuZF9wb3MgW1Nhc3M6OlNvdXJjZTo6UG9zaXRpb25dCisgICAgICBkZWYgbm9kZShub2RlLCBzb3VyY2VfcmFuZ2Vfb3Jfc3RhcnRfcG9zLCBlbmRfcG9zID0gc291cmNlX3Bvc2l0aW9uKQorICAgICAgICBzb3VyY2VfcmFuZ2UgPQorICAgICAgICAgIGlmIHNvdXJjZV9yYW5nZV9vcl9zdGFydF9wb3MuaXNfYT8oU2Fzczo6U291cmNlOjpSYW5nZSkKKyAgICAgICAgICAgIHNvdXJjZV9yYW5nZV9vcl9zdGFydF9wb3MKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByYW5nZShzb3VyY2VfcmFuZ2Vfb3Jfc3RhcnRfcG9zLCBlbmRfcG9zKQorICAgICAgICAgIGVuZAorCisgICAgICAgIG5vZGUubGluZSA9IHNvdXJjZV9yYW5nZS5zdGFydF9wb3MubGluZQorICAgICAgICBub2RlLnNvdXJjZV9yYW5nZSA9IHNvdXJjZV9yYW5nZQorICAgICAgICBub2RlLmZpbGVuYW1lID0gQG9wdGlvbnNbOmZpbGVuYW1lXQorICAgICAgICBub2RlCisgICAgICBlbmQKKworICAgICAgIyBDaGVja3MgYSBzY3JpcHQgbm9kZSBmb3IgYW55IGltbWVkaWF0ZWx5LWRlcHJlY2F0ZWQgaW50ZXJwb2xhdGlvbnMsIGFuZAorICAgICAgIyBlbWl0cyB3YXJuaW5ncyBmb3IgdGhlbS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIG5vZGUgW1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZV0KKyAgICAgIGRlZiBjaGVja19mb3JfaW50ZXJwb2xhdGlvbihub2RlKQorICAgICAgICBub2RlcyA9IFtub2RlXQorICAgICAgICB1bnRpbCBub2Rlcy5lbXB0eT8KKyAgICAgICAgICBub2RlID0gbm9kZXMucG9wCisgICAgICAgICAgdW5sZXNzIG5vZGUuaXNfYT8oU2Fzczo6U2NyaXB0OjpUcmVlOjpJbnRlcnBvbGF0aW9uKSAmJgorICAgICAgICAgICAgICAgICBub2RlLmRlcHJlY2F0aW9uID09IDppbW1lZGlhdGUKKyAgICAgICAgICAgIG5vZGVzLmNvbmNhdCBub2RlLmNoaWxkcmVuCisgICAgICAgICAgICBuZXh0CisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBpbnRlcnBvbGF0aW9uX2RlcHJlY2F0aW9uKG5vZGUpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgRW1pdHMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciBhbiBpbnRlcnBvbGF0aW9uIG5vZGUuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBub2RlIFtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGVdCisgICAgICBkZWYgaW50ZXJwb2xhdGlvbl9kZXByZWNhdGlvbihpbnRlcnBvbGF0aW9uKQorICAgICAgICByZXR1cm4gaWYgQG9wdGlvbnNbOl9jb252ZXJ0XQorICAgICAgICBsb2NhdGlvbiA9ICJvbiBsaW5lICN7aW50ZXJwb2xhdGlvbi5saW5lfSIKKyAgICAgICAgbG9jYXRpb24gPDwgIiBvZiAje2ludGVycG9sYXRpb24uZmlsZW5hbWV9IiBpZiBpbnRlcnBvbGF0aW9uLmZpbGVuYW1lCisgICAgICAgIFNhc3M6OlV0aWwuc2Fzc193YXJuIDw8V0FSTklORworREVQUkVDQVRJT04gV0FSTklORyAje2xvY2F0aW9ufToKK1wje30gaW50ZXJwb2xhdGlvbiBuZWFyIG9wZXJhdG9ycyB3aWxsIGJlIHNpbXBsaWZpZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTYXNzLgorVG8gcHJlc2VydmUgdGhlIGN1cnJlbnQgYmVoYXZpb3IsIHVzZSBxdW90ZXM6CisKKyAgI3tpbnRlcnBvbGF0aW9uLnRvX3F1b3RlZF9lcXVpdmFsZW50LnRvX3Nhc3N9CisKK1lvdSBjYW4gdXNlIHRoZSBzYXNzLWNvbnZlcnQgY29tbWFuZCB0byBhdXRvbWF0aWNhbGx5IGZpeCBtb3N0IGNhc2VzLgorV0FSTklORworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ0Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS5yYgpAQCAtMCwwICsxLDE2IEBACisjIFRoZSBtb2R1bGUgY29udGFpbmluZyBub2RlcyBpbiB0aGUgU2Fzc1NjcmlwdCBwYXJzZSB0cmVlLiBUaGVzZSBub2RlcyBhcmUKKyMgYWxsIHN1YmNsYXNzZXMgb2Yge1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZX0uCittb2R1bGUgU2Fzczo6U2NyaXB0OjpUcmVlCitlbmQKKworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdHJlZS9ub2RlJworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdHJlZS92YXJpYWJsZScKK3JlcXVpcmUgJ3Nhc3Mvc2NyaXB0L3RyZWUvZnVuY2FsbCcKK3JlcXVpcmUgJ3Nhc3Mvc2NyaXB0L3RyZWUvb3BlcmF0aW9uJworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdHJlZS91bmFyeV9vcGVyYXRpb24nCityZXF1aXJlICdzYXNzL3NjcmlwdC90cmVlL2ludGVycG9sYXRpb24nCityZXF1aXJlICdzYXNzL3NjcmlwdC90cmVlL3N0cmluZ19pbnRlcnBvbGF0aW9uJworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdHJlZS9saXRlcmFsJworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdHJlZS9saXN0X2xpdGVyYWwnCityZXF1aXJlICdzYXNzL3NjcmlwdC90cmVlL21hcF9saXRlcmFsJworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdHJlZS9zZWxlY3RvcicKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3RyZWUvZnVuY2FsbC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3RyZWUvZnVuY2FsbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQwMWVjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS9mdW5jYWxsLnJiCkBAIC0wLDAgKzEsMzE4IEBACityZXF1aXJlICdzYXNzL3NjcmlwdC9mdW5jdGlvbnMnCityZXF1aXJlICdzYXNzL3V0aWwnCisKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlRyZWUKKyAgIyBBIFNhc3NTY3JpcHQgcGFyc2Ugbm9kZSByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiBjYWxsLgorICAjCisgICMgQSBmdW5jdGlvbiBjYWxsIGVpdGhlciBjYWxscyBvbmUgb2YgdGhlIGZ1bmN0aW9ucyBpbgorICAjIHtTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9uc30sIG9yIGlmIG5vIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzIGl0CisgICMgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZnVuY3Rpb24gY2FsbC4KKyAgY2xhc3MgRnVuY2FsbCA8IE5vZGUKKyAgICAjIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgYXR0cl9yZWFkZXIgOm5hbWUKKworICAgICMgVGhlIGNhbGxhYmxlIHRvIGJlIGludm9rZWQKKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpDYWxsYWJsZV0gb3IgbmlsIGlmIG5vIGNhbGxhYmxlIGlzIHByb3ZpZGVkLgorICAgIGF0dHJfcmVhZGVyIDpjYWxsYWJsZQorCisgICAgIyBUaGUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxOb2RlPl0KKyAgICBhdHRyX3JlYWRlciA6YXJncworCisgICAgIyBUaGUga2V5d29yZCBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlV0aWw6Ok5vcm1hbGl6ZWRNYXA8Tm9kZT5dCisgICAgYXR0cl9yZWFkZXIgOmtleXdvcmRzCisKKyAgICAjIFRoZSBmaXJzdCBzcGxhdCBhcmd1bWVudCBmb3IgdGhpcyBmdW5jdGlvbiwgaWYgb25lIGV4aXN0cy4KKyAgICAjCisgICAgIyBUaGlzIGNvdWxkIGJlIGEgbGlzdCBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cywgYSBtYXAgb2Yga2V5d29yZAorICAgICMgYXJndW1lbnRzLCBvciBhbiBhcmdsaXN0IGNvbnRhaW5pbmcgYm90aC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtOb2RlP10KKyAgICBhdHRyX2FjY2Vzc29yIDpzcGxhdAorCisgICAgIyBUaGUgc2Vjb25kIHNwbGF0IGFyZ3VtZW50IGZvciB0aGlzIGZ1bmN0aW9uLCBpZiBvbmUgZXhpc3RzLgorICAgICMKKyAgICAjIElmIHRoaXMgZXhpc3RzLCBpdCdzIGFsd2F5cyBhIG1hcCBvZiBrZXl3b3JkIGFyZ3VtZW50cywgYW5kCisgICAgIyBceyNzcGxhdH0gaXMgYWx3YXlzIGVpdGhlciBhIGxpc3Qgb3IgYW4gYXJnbGlzdC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtOb2RlP10KKyAgICBhdHRyX2FjY2Vzc29yIDprd2FyZ19zcGxhdAorCisgICAgIyBAcGFyYW0gbmFtZV9vcl9jYWxsYWJsZSBbU3RyaW5nLCBTYXNzOjpDYWxsYWJsZV0gU2VlIFx7I25hbWV9CisgICAgIyBAcGFyYW0gYXJncyBbQXJyYXk8Tm9kZT5dIFNlZSBceyNhcmdzfQorICAgICMgQHBhcmFtIGtleXdvcmRzIFtTYXNzOjpVdGlsOjpOb3JtYWxpemVkTWFwPE5vZGU+XSBTZWUgXHsja2V5d29yZHN9CisgICAgIyBAcGFyYW0gc3BsYXQgW05vZGVdIFNlZSBceyNzcGxhdH0KKyAgICAjIEBwYXJhbSBrd2FyZ19zcGxhdCBbTm9kZV0gU2VlIFx7I2t3YXJnX3NwbGF0fQorICAgIGRlZiBpbml0aWFsaXplKG5hbWVfb3JfY2FsbGFibGUsIGFyZ3MsIGtleXdvcmRzLCBzcGxhdCwga3dhcmdfc3BsYXQpCisgICAgICBpZiBuYW1lX29yX2NhbGxhYmxlLmlzX2E/KFNhc3M6OkNhbGxhYmxlKQorICAgICAgICBAY2FsbGFibGUgPSBuYW1lX29yX2NhbGxhYmxlCisgICAgICAgIEBuYW1lID0gbmFtZV9vcl9jYWxsYWJsZS5uYW1lCisgICAgICBlbHNlCisgICAgICAgIEBjYWxsYWJsZSA9IG5pbAorICAgICAgICBAbmFtZSA9IG5hbWVfb3JfY2FsbGFibGUKKyAgICAgIGVuZAorICAgICAgQGFyZ3MgPSBhcmdzCisgICAgICBAa2V5d29yZHMgPSBrZXl3b3JkcworICAgICAgQHNwbGF0ID0gc3BsYXQKKyAgICAgIEBrd2FyZ19zcGxhdCA9IGt3YXJnX3NwbGF0CisgICAgICBzdXBlcigpCisgICAgZW5kCisKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICBkZWYgaW5zcGVjdAorICAgICAgYXJncyA9IEBhcmdzLm1hcCB7fGF8IGEuaW5zcGVjdH0uam9pbignLCAnKQorICAgICAga2V5d29yZHMgPSBAa2V5d29yZHMuYXNfc3RvcmVkLnRvX2EubWFwIHt8aywgdnwgIiQje2t9OiAje3YuaW5zcGVjdH0ifS5qb2luKCcsICcpCisgICAgICAjIHJ1Ym9jb3A6ZGlzYWJsZSBSZWR1bmRhbnRTZWxmCisgICAgICBpZiBzZWxmLnNwbGF0CisgICAgICAgIHNwbGF0ID0gYXJncy5lbXB0eT8gJiYga2V5d29yZHMuZW1wdHk/ID8gIiIgOiAiLCAiCisgICAgICAgIHNwbGF0ID0gIiN7c3BsYXR9I3tzZWxmLnNwbGF0Lmluc3BlY3R9Li4uIgorICAgICAgICBzcGxhdCA9ICIje3NwbGF0fSwgI3trd2FyZ19zcGxhdC5pbnNwZWN0fS4uLiIgaWYga3dhcmdfc3BsYXQKKyAgICAgIGVuZAorICAgICAgIyBydWJvY29wOmVuYWJsZSBSZWR1bmRhbnRTZWxmCisgICAgICAiI3tuYW1lfSgje2FyZ3N9I3snLCAnIHVubGVzcyBhcmdzLmVtcHR5PyB8fCBrZXl3b3Jkcy5lbXB0eT99I3trZXl3b3Jkc30je3NwbGF0fSkiCisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSN0b19zYXNzCisgICAgZGVmIHRvX3Nhc3Mob3B0cyA9IHt9KQorICAgICAgYXJnX3RvX3Nhc3MgPSBsYW1iZGEgZG8gfGFyZ3wKKyAgICAgICAgc2FzcyA9IGFyZy50b19zYXNzKG9wdHMpCisgICAgICAgIHNhc3MgPSAiKCN7c2Fzc30pIiBpZiBhcmcuaXNfYT8oU2Fzczo6U2NyaXB0OjpUcmVlOjpMaXN0TGl0ZXJhbCkgJiYgYXJnLnNlcGFyYXRvciA9PSA6Y29tbWEKKyAgICAgICAgc2FzcworICAgICAgZW5kCisKKyAgICAgIGFyZ3MgPSBAYXJncy5tYXAoJmFyZ190b19zYXNzKQorICAgICAga2V5d29yZHMgPSBAa2V5d29yZHMuYXNfc3RvcmVkLnRvX2EubWFwIHt8aywgdnwgIiQje2Rhc2hlcml6ZShrLCBvcHRzKX06ICN7YXJnX3RvX3Nhc3Nbdl19In0KKworICAgICAgIyBydWJvY29wOmRpc2FibGUgUmVkdW5kYW50U2VsZgorICAgICAgaWYgc2VsZi5zcGxhdAorICAgICAgICBzcGxhdCA9ICIje2FyZ190b19zYXNzW3NlbGYuc3BsYXRdfS4uLiIKKyAgICAgICAga3dhcmdfc3BsYXQgPSAiI3thcmdfdG9fc2Fzc1tzZWxmLmt3YXJnX3NwbGF0XX0uLi4iIGlmIHNlbGYua3dhcmdfc3BsYXQKKyAgICAgIGVuZAorICAgICAgIyBydWJvY29wOmVuYWJsZSBSZWR1bmRhbnRTZWxmCisKKyAgICAgIGFyZ2xpc3QgPSBbYXJncywgc3BsYXQsIGtleXdvcmRzLCBrd2FyZ19zcGxhdF0uZmxhdHRlbi5jb21wYWN0LmpvaW4oJywgJykKKyAgICAgICIje2Rhc2hlcml6ZShuYW1lLCBvcHRzKX0oI3thcmdsaXN0fSkiCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXk8Tm9kZT5dCisgICAgIyBAc2VlIE5vZGUjY2hpbGRyZW4KKyAgICBkZWYgY2hpbGRyZW4KKyAgICAgIHJlcyA9IEBhcmdzICsgQGtleXdvcmRzLnZhbHVlcworICAgICAgcmVzIDw8IEBzcGxhdCBpZiBAc3BsYXQKKyAgICAgIHJlcyA8PCBAa3dhcmdfc3BsYXQgaWYgQGt3YXJnX3NwbGF0CisgICAgICByZXMKKyAgICBlbmQKKworICAgICMgQHNlZSBOb2RlI2RlZXBfY29weQorICAgIGRlZiBkZWVwX2NvcHkKKyAgICAgIG5vZGUgPSBkdXAKKyAgICAgIG5vZGUuaW5zdGFuY2VfdmFyaWFibGVfc2V0KCdAYXJncycsIGFyZ3MubWFwIHt8YXwgYS5kZWVwX2NvcHl9KQorICAgICAgY29waWVkX2tleXdvcmRzID0gU2Fzczo6VXRpbDo6Tm9ybWFsaXplZE1hcC5uZXcKKyAgICAgIEBrZXl3b3Jkcy5hc19zdG9yZWQuZWFjaCB7fGssIHZ8IGNvcGllZF9rZXl3b3Jkc1trXSA9IHYuZGVlcF9jb3B5fQorICAgICAgbm9kZS5pbnN0YW5jZV92YXJpYWJsZV9zZXQoJ0BrZXl3b3JkcycsIGNvcGllZF9rZXl3b3JkcykKKyAgICAgIG5vZGUKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgIyBFdmFsdWF0ZXMgdGhlIGZ1bmN0aW9uIGNhbGwuCisgICAgIworICAgICMgQHBhcmFtIGVudmlyb25tZW50IFtTYXNzOjpFbnZpcm9ubWVudF0gVGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBTYXNzU2NyaXB0CisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlXSBUaGUgU2Fzc1NjcmlwdCBvYmplY3QgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZSBmdW5jdGlvbiBjYWxsIHJhaXNlcyBhbiBBcmd1bWVudEVycm9yCisgICAgZGVmIF9wZXJmb3JtKGVudmlyb25tZW50KQorICAgICAgYXJncyA9IEBhcmdzLmVhY2hfd2l0aF9pbmRleC4KKyAgICAgICAgbWFwIHt8YSwgaXwgcGVyZm9ybV9hcmcoYSwgZW52aXJvbm1lbnQsIHNpZ25hdHVyZSAmJiBzaWduYXR1cmUuYXJnc1tpXSl9CisgICAgICBrZXl3b3JkcyA9IFNhc3M6OlV0aWwubWFwX2hhc2goQGtleXdvcmRzKSBkbyB8aywgdnwKKyAgICAgICAgW2ssIHBlcmZvcm1fYXJnKHYsIGVudmlyb25tZW50LCBrLnRyKCctJywgJ18nKSldCisgICAgICBlbmQKKyAgICAgIHNwbGF0ID0gU2Fzczo6VHJlZTo6VmlzaXRvcnM6OlBlcmZvcm0ucGVyZm9ybV9zcGxhdCgKKyAgICAgICAgQHNwbGF0LCBrZXl3b3JkcywgQGt3YXJnX3NwbGF0LCBlbnZpcm9ubWVudCkKKworICAgICAgZm4gPSBAY2FsbGFibGUgfHwgZW52aXJvbm1lbnQuZnVuY3Rpb24oQG5hbWUpCisKKyAgICAgIGlmIGZuICYmIGZuLm9yaWdpbiA9PSA6c3R5bGVzaGVldAorICAgICAgICBlbnZpcm9ubWVudC5zdGFjay53aXRoX2Z1bmN0aW9uKGZpbGVuYW1lLCBsaW5lLCBuYW1lKSBkbworICAgICAgICAgIHJldHVybiB3aXRob3V0X29yaWdpbmFsKHBlcmZvcm1fc2Fzc19mbihmbiwgYXJncywgc3BsYXQsIGVudmlyb25tZW50KSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgYXJncyA9IGNvbnN0cnVjdF9ydWJ5X2FyZ3MocnVieV9uYW1lLCBhcmdzLCBzcGxhdCwgZW52aXJvbm1lbnQpCisKKyAgICAgIGlmIFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zLmNhbGxhYmxlPyhydWJ5X25hbWUpICYmICghZm4gfHwgZm4ub3JpZ2luID09IDpidWlsdGluKQorICAgICAgICBsb2NhbF9lbnZpcm9ubWVudCA9IFNhc3M6OkVudmlyb25tZW50Lm5ldyhlbnZpcm9ubWVudC5nbG9iYWxfZW52LCBlbnZpcm9ubWVudC5vcHRpb25zKQorICAgICAgICBsb2NhbF9lbnZpcm9ubWVudC5jYWxsZXIgPSBTYXNzOjpSZWFkT25seUVudmlyb25tZW50Lm5ldyhlbnZpcm9ubWVudCwgZW52aXJvbm1lbnQub3B0aW9ucykKKyAgICAgICAgcmVzdWx0ID0gbG9jYWxfZW52aXJvbm1lbnQuc3RhY2sud2l0aF9mdW5jdGlvbihmaWxlbmFtZSwgbGluZSwgbmFtZSkgZG8KKyAgICAgICAgICBvcHRzKFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zOjpFdmFsdWF0aW9uQ29udGV4dC5uZXcoCisgICAgICAgICAgICBsb2NhbF9lbnZpcm9ubWVudCkuc2VuZChydWJ5X25hbWUsICphcmdzKSkKKyAgICAgICAgZW5kCisgICAgICAgIHdpdGhvdXRfb3JpZ2luYWwocmVzdWx0KQorICAgICAgZWxzZQorICAgICAgICBvcHRzKHRvX2xpdGVyYWwoYXJncykpCisgICAgICBlbmQKKyAgICByZXNjdWUgQXJndW1lbnRFcnJvciA9PiBlCisgICAgICByZWZvcm1hdF9hcmd1bWVudF9lcnJvcihlKQorICAgIGVuZAorCisgICAgIyBDb21wYXNzIGhpc3RvcmljYWxseSBvdmVycm9kZSB0aGlzIGJlZm9yZSBpdCBjaGFuZ2VkIG5hbWUgdG8ge0Z1bmNhbGwjdG9fdmFsdWV9LgorICAgICMgV2Ugc2hvdWxkIGdldCByaWQgb2YgaXQgaW4gdGhlIGZ1dHVyZS4KKyAgICBkZWYgdG9fbGl0ZXJhbChhcmdzKQorICAgICAgdG9fdmFsdWUoYXJncykKKyAgICBlbmQKKworICAgICMgVGhpcyBtZXRob2QgaXMgZmFjdG9yZWQgb3V0IGZyb20gYF9wZXJmb3JtYCBzbyB0aGF0IGNvbXBhc3MgY2FuIG92ZXJyaWRlCisgICAgIyBpdCB3aXRoIGEgY3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgcmVxdWlyZSB2ZW5kb3IgcHJlZml4ZXMKKyAgICAjIGluIHRoZSBnZW5lcmF0ZWQgY3NzLgorICAgIGRlZiB0b192YWx1ZShhcmdzKQorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygiI3tuYW1lfSgje2FyZ3Muam9pbignLCAnKX0pIikKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBydWJ5X25hbWUKKyAgICAgIEBydWJ5X25hbWUgfHw9IEBuYW1lLnRyKCctJywgJ18nKQorICAgIGVuZAorCisgICAgZGVmIHBlcmZvcm1fYXJnKGFyZ3VtZW50LCBlbnZpcm9ubWVudCwgbmFtZSkKKyAgICAgIHJldHVybiBhcmd1bWVudCBpZiBzaWduYXR1cmUgJiYgc2lnbmF0dXJlLmRlbGF5ZWRfYXJncy5pbmNsdWRlPyhuYW1lKQorICAgICAgYXJndW1lbnQucGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICBlbmQKKworICAgIGRlZiBzaWduYXR1cmUKKyAgICAgIEBzaWduYXR1cmUgfHw9IFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zLnNpZ25hdHVyZShuYW1lLnRvX3N5bSwgQGFyZ3Muc2l6ZSwgQGtleXdvcmRzLnNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd2l0aG91dF9vcmlnaW5hbCh2YWx1ZSkKKyAgICAgIHJldHVybiB2YWx1ZSB1bmxlc3MgdmFsdWUuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKQorICAgICAgdmFsdWUgPSB2YWx1ZS5kdXAKKyAgICAgIHZhbHVlLm9yaWdpbmFsID0gbmlsCisgICAgICB2YWx1ZQorICAgIGVuZAorCisgICAgZGVmIGNvbnN0cnVjdF9ydWJ5X2FyZ3MobmFtZSwgYXJncywgc3BsYXQsIGVudmlyb25tZW50KQorICAgICAgYXJncyArPSBzcGxhdC50b19hIGlmIHNwbGF0CisKKyAgICAgICMgQWxsIGtleXdvcmRzIGFyZSBjb250YWluZWQgaW4gc3BsYXQua2V5d29yZHMgZm9yIGNvbnNpc3RlbmN5LAorICAgICAgIyBldmVuIGlmIHRoZXJlIHdlcmUgbm8gc3BsYXRzIHBhc3NlZCBpbi4KKyAgICAgIG9sZF9rZXl3b3Jkc19hY2Nlc3NlZCA9IHNwbGF0LmtleXdvcmRzX2FjY2Vzc2VkCisgICAgICBrZXl3b3JkcyA9IHNwbGF0LmtleXdvcmRzCisgICAgICBzcGxhdC5rZXl3b3Jkc19hY2Nlc3NlZCA9IG9sZF9rZXl3b3Jkc19hY2Nlc3NlZAorCisgICAgICB1bmxlc3MgKHNpZ25hdHVyZSA9IFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zLnNpZ25hdHVyZShuYW1lLnRvX3N5bSwgYXJncy5zaXplLCBrZXl3b3Jkcy5zaXplKSkKKyAgICAgICAgcmV0dXJuIGFyZ3MgaWYga2V5d29yZHMuZW1wdHk/CisgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiRnVuY3Rpb24gI3tuYW1lfSBkb2Vzbid0IHN1cHBvcnQga2V5d29yZCBhcmd1bWVudHMiKQorICAgICAgZW5kCisKKyAgICAgICMgSWYgdGhlIHVzZXIgcGFzc2VzIG1vcmUgbm9uLWtleXdvcmQgYXJncyB0aGFuIHRoZSBmdW5jdGlvbiBleHBlY3RzLAorICAgICAgIyBidXQgaXQgZG9lcyBleHBlY3Qga2V5d29yZCBhcmdzLCBSdWJ5J3MgYXJnIGhhbmRsaW5nIHdvbid0IHJhaXNlIGFuIGVycm9yLgorICAgICAgIyBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIG1ha2UgZnVuY3Rpb25zIHRoaW5rIGFib3V0IHRoaXMsCisgICAgICAjIHdlJ2xsIGhhbmRsZSBpdCBmb3IgdGhlbSBoZXJlLgorICAgICAgaWYgc2lnbmF0dXJlLnZhcl9rd2FyZ3MgJiYgIXNpZ25hdHVyZS52YXJfYXJncyAmJiBhcmdzLnNpemUgPiBzaWduYXR1cmUuYXJncy5zaXplCisgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygKKyAgICAgICAgICAiI3thcmdzW3NpZ25hdHVyZS5hcmdzLnNpemVdLmluc3BlY3R9IGlzIG5vdCBhIGtleXdvcmQgYXJndW1lbnQgZm9yIGAje25hbWV9JyIpCisgICAgICBlbHNpZiBrZXl3b3Jkcy5lbXB0eT8KKyAgICAgICAgYXJncyA8PCB7fSBpZiBzaWduYXR1cmUudmFyX2t3YXJncworICAgICAgICByZXR1cm4gYXJncworICAgICAgZW5kCisKKyAgICAgIGFyZ25hbWVzID0gc2lnbmF0dXJlLmFyZ3NbYXJncy5zaXplLi4tMV0gfHwgW10KKyAgICAgIGRlcHJlY2F0ZWRfYXJnbmFtZXMgPSAoc2lnbmF0dXJlLmRlcHJlY2F0ZWQgJiYgc2lnbmF0dXJlLmRlcHJlY2F0ZWRbYXJncy5zaXplLi4tMV0pIHx8IFtdCisgICAgICBhcmdzICs9IGFyZ25hbWVzLnppcChkZXByZWNhdGVkX2FyZ25hbWVzKS5tYXAgZG8gfChhcmduYW1lLCBkZXByZWNhdGVkX2FyZ25hbWUpfAorICAgICAgICBpZiBrZXl3b3Jkcy5oYXNfa2V5PyhhcmduYW1lKQorICAgICAgICAgIGtleXdvcmRzLmRlbGV0ZShhcmduYW1lKQorICAgICAgICBlbHNpZiBkZXByZWNhdGVkX2FyZ25hbWUgJiYga2V5d29yZHMuaGFzX2tleT8oZGVwcmVjYXRlZF9hcmduYW1lKQorICAgICAgICAgIGRlcHJlY2F0ZWRfYXJnbmFtZSA9IGtleXdvcmRzLmRlbm9ybWFsaXplKGRlcHJlY2F0ZWRfYXJnbmFtZSkKKyAgICAgICAgICBTYXNzOjpVdGlsLnNhc3Nfd2FybigiREVQUkVDQVRJT04gV0FSTklORzogVGhlIGAkI3tkZXByZWNhdGVkX2FyZ25hbWV9JyBhcmd1bWVudCBmb3IgIiArCisgICAgICAgICAgICAiYCN7QG5hbWV9KCknIGhhcyBiZWVuIHJlbmFtZWQgdG8gYCQje2FyZ25hbWV9Jy4iKQorICAgICAgICAgIGtleXdvcmRzLmRlbGV0ZShkZXByZWNhdGVkX2FyZ25hbWUpCisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIkZ1bmN0aW9uICN7bmFtZX0gcmVxdWlyZXMgYW4gYXJndW1lbnQgbmFtZWQgJCN7YXJnbmFtZX0iKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBpZiBrZXl3b3Jkcy5zaXplID4gMAorICAgICAgICBpZiBzaWduYXR1cmUudmFyX2t3YXJncworICAgICAgICAgICMgRG9uJ3QgcGFzcyBhIE5vcm1hbGl6ZWRNYXAgdG8gYSBSdWJ5IGZ1bmN0aW9uLgorICAgICAgICAgIGFyZ3MgPDwga2V5d29yZHMudG9faGFzaAorICAgICAgICBlbHNlCisgICAgICAgICAgYXJnbmFtZSA9IGtleXdvcmRzLmtleXMuc29ydC5maXJzdAorICAgICAgICAgIGlmIHNpZ25hdHVyZS5hcmdzLmluY2x1ZGU/KGFyZ25hbWUpCisgICAgICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoCisgICAgICAgICAgICAgICJGdW5jdGlvbiAje25hbWV9IHdhcyBwYXNzZWQgYXJndW1lbnQgJCN7YXJnbmFtZX0gYm90aCBieSBwb3NpdGlvbiBhbmQgYnkgbmFtZSIpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KAorICAgICAgICAgICAgICAiRnVuY3Rpb24gI3tuYW1lfSBkb2Vzbid0IGhhdmUgYW4gYXJndW1lbnQgbmFtZWQgJCN7YXJnbmFtZX0iKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBhcmdzCisgICAgZW5kCisKKyAgICBkZWYgcGVyZm9ybV9zYXNzX2ZuKGZ1bmN0aW9uLCBhcmdzLCBzcGxhdCwgZW52aXJvbm1lbnQpCisgICAgICBTYXNzOjpUcmVlOjpWaXNpdG9yczo6UGVyZm9ybS5wZXJmb3JtX2FyZ3VtZW50cyhmdW5jdGlvbiwgYXJncywgc3BsYXQsIGVudmlyb25tZW50KSBkbyB8ZW52fAorICAgICAgICBlbnYuY2FsbGVyID0gU2Fzczo6RW52aXJvbm1lbnQubmV3KGVudmlyb25tZW50KQorCisgICAgICAgIHZhbCA9IGNhdGNoIDpfc2Fzc19yZXR1cm4gZG8KKyAgICAgICAgICBmdW5jdGlvbi50cmVlLmVhY2gge3xjfCBTYXNzOjpUcmVlOjpWaXNpdG9yczo6UGVyZm9ybS52aXNpdChjLCBlbnYpfQorICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiRnVuY3Rpb24gI3tAbmFtZX0gZmluaXNoZWQgd2l0aG91dCBAcmV0dXJuIikKKyAgICAgICAgZW5kCisgICAgICAgIHZhbAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVmb3JtYXRfYXJndW1lbnRfZXJyb3IoZSkKKyAgICAgIG1lc3NhZ2UgPSBlLm1lc3NhZ2UKKworICAgICAgIyBJZiB0aGlzIGlzIGEgbGVnaXRpbWF0ZSBSdWJ5LXJhaXNlZCBhcmd1bWVudCBlcnJvciwgcmUtcmFpc2UgaXQuCisgICAgICAjIE90aGVyd2lzZSwgaXQncyBhbiBlcnJvciBpbiB0aGUgdXNlcidzIHN0eWxlc2hlZXQsIHNvIHdyYXAgaXQuCisgICAgICBpZiBTYXNzOjpVdGlsLnJieD8KKyAgICAgICAgIyBSdWJpbml1cyBoYXMgYSBkaWZmZXJlbnQgZXJyb3IgcmVwb3J0IHN0cmluZyB0aGFuIHZhbmlsbGEgUnVieS4gSXQKKyAgICAgICAgIyBhbHNvIGRvZXNuJ3QgcHV0IHRoZSBhY3R1YWwgbWV0aG9kIGZvciB3aGljaCB0aGUgYXJndW1lbnQgZXJyb3Igd2FzCisgICAgICAgICMgdGhyb3duIGluIHRoZSBiYWNrdHJhY2UsIG5vciBkb2VzIGl0IGluY2x1ZGUgYHNlbmRgLCBzbyB3ZSBsb29rIGZvcgorICAgICAgICAjIGBfcGVyZm9ybWAuCisgICAgICAgIGlmIGUubWVzc2FnZSA9fiAvXm1ldGhvZCAnKFteJ10rKSc6IGdpdmVuIChcZCspLCBleHBlY3RlZCAoXGQrKS8KKyAgICAgICAgICBlcnJvcl9uYW1lLCBnaXZlbiwgZXhwZWN0ZWQgPSAkMSwgJDIsICQzCisgICAgICAgICAgcmFpc2UgZSBpZiBlcnJvcl9uYW1lICE9IHJ1YnlfbmFtZSB8fCBlLmJhY2t0cmFjZVswXSAhfiAvOmluIGBfcGVyZm9ybSckLworICAgICAgICAgIG1lc3NhZ2UgPSAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAoI3tnaXZlbn0gZm9yICN7ZXhwZWN0ZWR9KSIKKyAgICAgICAgZW5kCisgICAgICBlbHNpZiBTYXNzOjpVdGlsLmpydWJ5PworICAgICAgICBzaG91bGRfbWF5YmVfcmFpc2UgPQorICAgICAgICAgIGUubWVzc2FnZSA9fiAvXndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgY2FsbGluZyBgW15gXStgIFwoKFxkKykgZm9yIChcZCspXCkvCisgICAgICAgIGdpdmVuLCBleHBlY3RlZCA9ICQxLCAkMgorCisgICAgICAgIGlmIHNob3VsZF9tYXliZV9yYWlzZQorICAgICAgICAgICMgSlJ1YnkgMS43IGluY2x1ZGVzIF9fc2VuZF9fIGJlZm9yZSBzZW5kIGFuZCBfcGVyZm9ybS4KKyAgICAgICAgICB0cmFjZSA9IGUuYmFja3RyYWNlLmR1cAorICAgICAgICAgIHJhaXNlIGUgaWYgdHJhY2Uuc2hpZnQgIX4gLzppbiBgX19zZW5kX18nJC8KKworICAgICAgICAgICMgSlJ1YnkgKGFzIG9mIDEuNy4yKSBkb2Vzbid0IHB1dCB0aGUgYWN0dWFsIG1ldGhvZAorICAgICAgICAgICMgZm9yIHdoaWNoIHRoZSBhcmd1bWVudCBlcnJvciB3YXMgdGhyb3duIGluIHRoZSBiYWNrdHJhY2UsIHNvIHdlCisgICAgICAgICAgIyBkZXRlY3Qgd2hldGhlciBvdXIgc2VuZCB0aHJldyBhbiBhcmd1bWVudCBlcnJvci4KKyAgICAgICAgICBpZiAhKHRyYWNlWzBdID1+IC86aW4gYHNlbmQnJC8gJiYgdHJhY2VbMV0gPX4gLzppbiBgX3BlcmZvcm0nJC8pCisgICAgICAgICAgICByYWlzZSBlCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBKUnVieSAxLjcgZG9lc24ndCB1c2Ugc3RhbmRhcmQgZm9ybWF0dGluZyBmb3IgaXRzIEFyZ3VtZW50RXJyb3JzLgorICAgICAgICAgICAgbWVzc2FnZSA9ICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgje2dpdmVufSBmb3IgI3tleHBlY3RlZH0pIgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVsc2lmIChtZCA9IC9ed3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBcKGdpdmVuIChcZCspLCBleHBlY3RlZCAoXGQrKVwpLy5tYXRjaChlLm1lc3NhZ2UpKSAmJgorICAgICAgICAgICAgZS5iYWNrdHJhY2VbMF0gPX4gLzppbiBgI3tydWJ5X25hbWV9JyQvCisgICAgICAgICMgSGFuZGxlIHJ1YnkgMi4zIGVycm9yIGZvcm1hdHRpbmcKKyAgICAgICAgbWVzc2FnZSA9ICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgje21kWzFdfSBmb3IgI3ttZFsyXX0pIgorICAgICAgZWxzaWYgZS5tZXNzYWdlID1+IC9ed3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy8gJiYKKyAgICAgICAgICAgIGUuYmFja3RyYWNlWzBdICF+IC86aW4gYChibG9jayBpbiApPyN7cnVieV9uYW1lfSckLworICAgICAgICByYWlzZSBlCisgICAgICBlbmQKKyAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiI3ttZXNzYWdlfSBmb3IgYCN7bmFtZX0nIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3RyZWUvaW50ZXJwb2xhdGlvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3RyZWUvaW50ZXJwb2xhdGlvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkxNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS9pbnRlcnBvbGF0aW9uLnJiCkBAIC0wLDAgKzEsMjIzIEBACittb2R1bGUgU2Fzczo6U2NyaXB0OjpUcmVlCisgICMgQSBTYXNzU2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgYCN7fWAgaW50ZXJwb2xhdGlvbiBvdXRzaWRlIGEgc3RyaW5nLgorICAjCisgICMgQHNlZSBTdHJpbmdJbnRlcnBvbGF0aW9uCisgIGNsYXNzIEludGVycG9sYXRpb24gPCBOb2RlCisgICAgIyBAcmV0dXJuIFtOb2RlXSBUaGUgU2Fzc1NjcmlwdCBiZWZvcmUgdGhlIGludGVycG9sYXRpb24KKyAgICBhdHRyX3JlYWRlciA6YmVmb3JlCisKKyAgICAjIEByZXR1cm4gW05vZGVdIFRoZSBTYXNzU2NyaXB0IHdpdGhpbiB0aGUgaW50ZXJwb2xhdGlvbgorICAgIGF0dHJfcmVhZGVyIDptaWQKKworICAgICMgQHJldHVybiBbTm9kZV0gVGhlIFNhc3NTY3JpcHQgYWZ0ZXIgdGhlIGludGVycG9sYXRpb24KKyAgICBhdHRyX3JlYWRlciA6YWZ0ZXIKKworICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciB0aGVyZSB3YXMgd2hpdGVzcGFjZSBiZXR3ZWVuIGBiZWZvcmVgIGFuZCBgI3tgCisgICAgYXR0cl9yZWFkZXIgOndoaXRlc3BhY2VfYmVmb3JlCisKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgdGhlcmUgd2FzIHdoaXRlc3BhY2UgYmV0d2VlbiBgfWAgYW5kIGBhZnRlcmAKKyAgICBhdHRyX3JlYWRlciA6d2hpdGVzcGFjZV9hZnRlcgorCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIHRoZSBvcmlnaW5hbCBmb3JtYXQgb2YgdGhlIGludGVycG9sYXRpb24gd2FzCisgICAgIyAgIHBsYWluIHRleHQsIG5vdCBhbiBpbnRlcnBvbGF0aW9uLiBUaGlzIGlzIHVzZWQgd2hlbiBjb252ZXJ0aW5nIGJhY2sgdG8KKyAgICAjICAgU2Fzc1NjcmlwdC4KKyAgICBhdHRyX3JlYWRlciA6b3JpZ2luYWxseV90ZXh0CisKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgYSBjb2xvciB2YWx1ZSBwYXNzZWQgdG8gdGhlIGludGVycG9sYXRpb24gc2hvdWxkCisgICAgIyAgIGdlbmVyYXRlIGEgd2FybmluZy4KKyAgICBhdHRyX3JlYWRlciA6d2Fybl9mb3JfY29sb3IKKworICAgICMgVGhlIHR5cGUgb2YgaW50ZXJwb2xhdGlvbiBkZXByZWNhdGlvbiBmb3IgdGhpcyBub2RlLgorICAgICMKKyAgICAjIFRoaXMgY2FuIGJlIGA6bm9uZWAsIGluZGljYXRpbmcgdGhhdCB0aGUgbm9kZSBkb2Vzbid0IHVzZSBkZXByZWNhdGVkCisgICAgIyBpbnRlcnBvbGF0aW9uOyBgOmltbWVkaWF0ZWAsIGluZGljYXRpbmcgdGhhdCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgc2hvdWxkCisgICAgIyBiZSBlbWl0dGVkIGFzIHNvb24gYXMgcG9zc2libGU7IG9yIGA6cG90ZW50aWFsYCwgaW5kaWNhdGluZyB0aGF0IGEKKyAgICAjIGRlcHJlY2F0aW9uIHdhcm5pbmcgc2hvdWxkIGJlIGVtaXR0ZWQgaWYgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgdXNlZCBpbiBhCisgICAgIyB3YXkgdGhhdCB3b3VsZCBkaXN0aW5ndWlzaCBpdCBmcm9tIGEgbGlzdC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTeW1ib2xdCisgICAgYXR0cl9yZWFkZXIgOmRlcHJlY2F0aW9uCisKKyAgICAjIEludGVycG9sYXRpb24gaW4gYSBwcm9wZXJ0eSBpcyBvZiB0aGUgZm9ybSBgYmVmb3JlICN7bWlkfSBhZnRlcmAuCisgICAgIworICAgICMgQHBhcmFtIGJlZm9yZSBbTm9kZV0gU2VlIHtJbnRlcnBvbGF0aW9uI2JlZm9yZX0KKyAgICAjIEBwYXJhbSBtaWQgW05vZGVdIFNlZSB7SW50ZXJwb2xhdGlvbiNtaWR9CisgICAgIyBAcGFyYW0gYWZ0ZXIgW05vZGVdIFNlZSB7SW50ZXJwb2xhdGlvbiNhZnRlcn0KKyAgICAjIEBwYXJhbSB3YiBbQm9vbGVhbl0gU2VlIHtJbnRlcnBvbGF0aW9uI3doaXRlc3BhY2VfYmVmb3JlfQorICAgICMgQHBhcmFtIHdhIFtCb29sZWFuXSBTZWUge0ludGVycG9sYXRpb24jd2hpdGVzcGFjZV9hZnRlcn0KKyAgICAjIEBwYXJhbSBvcmlnaW5hbGx5X3RleHQgW0Jvb2xlYW5dIFNlZSB7SW50ZXJwb2xhdGlvbiNvcmlnaW5hbGx5X3RleHR9CisgICAgIyBAcGFyYW0gd2Fybl9mb3JfY29sb3IgW0Jvb2xlYW5dIFNlZSB7SW50ZXJwb2xhdGlvbiN3YXJuX2Zvcl9jb2xvcn0KKyAgICAjIEBjb21tZW50CisgICAgIyAgIHJ1Ym9jb3A6ZGlzYWJsZSBQYXJhbWV0ZXJMaXN0cworICAgIGRlZiBpbml0aWFsaXplKGJlZm9yZSwgbWlkLCBhZnRlciwgd2IsIHdhLCBvcHRzID0ge30pCisgICAgICAjIHJ1Ym9jb3A6ZW5hYmxlIFBhcmFtZXRlckxpc3RzCisgICAgICBAYmVmb3JlID0gYmVmb3JlCisgICAgICBAbWlkID0gbWlkCisgICAgICBAYWZ0ZXIgPSBhZnRlcgorICAgICAgQHdoaXRlc3BhY2VfYmVmb3JlID0gd2IKKyAgICAgIEB3aGl0ZXNwYWNlX2FmdGVyID0gd2EKKyAgICAgIEBvcmlnaW5hbGx5X3RleHQgPSBvcHRzWzpvcmlnaW5hbGx5X3RleHRdIHx8IGZhbHNlCisgICAgICBAd2Fybl9mb3JfY29sb3IgPSBvcHRzWzp3YXJuX2Zvcl9jb2xvcl0gfHwgZmFsc2UKKyAgICAgIEBkZXByZWNhdGlvbiA9IG9wdHNbOmRlcHJlY2F0aW9uXSB8fCA6bm9uZQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIEEgaHVtYW4tcmVhZGFibGUgcy1leHByZXNzaW9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uCisgICAgZGVmIGluc3BlY3QKKyAgICAgICIoaW50ZXJwb2xhdGlvbiAje0BiZWZvcmUuaW5zcGVjdH0gI3tAbWlkLmluc3BlY3R9ICN7QGFmdGVyLmluc3BlY3R9KSIKKyAgICBlbmQKKworICAgICMgQHNlZSBOb2RlI3RvX3Nhc3MKKyAgICBkZWYgdG9fc2FzcyhvcHRzID0ge30pCisgICAgICByZXR1cm4gdG9fcXVvdGVkX2VxdWl2YWxlbnQudG9fc2FzcyBpZiBkZXByZWNhdGlvbiA9PSA6aW1tZWRpYXRlCisKKyAgICAgIHJlcyA9ICIiCisgICAgICByZXMgPDwgQGJlZm9yZS50b19zYXNzKG9wdHMpIGlmIEBiZWZvcmUKKyAgICAgIHJlcyA8PCAnICcgaWYgQGJlZm9yZSAmJiBAd2hpdGVzcGFjZV9iZWZvcmUKKyAgICAgIHJlcyA8PCAnI3snIHVubGVzcyBAb3JpZ2luYWxseV90ZXh0CisgICAgICByZXMgPDwgQG1pZC50b19zYXNzKG9wdHMpCisgICAgICByZXMgPDwgJ30nIHVubGVzcyBAb3JpZ2luYWxseV90ZXh0CisgICAgICByZXMgPDwgJyAnIGlmIEBhZnRlciAmJiBAd2hpdGVzcGFjZV9hZnRlcgorICAgICAgcmVzIDw8IEBhZnRlci50b19zYXNzKG9wdHMpIGlmIEBhZnRlcgorICAgICAgcmVzCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYW4gYHVucXVvdGUoKWAgZXhwcmVzc2lvbiB0aGF0IHdpbGwgZXZhbHVhdGUgdG8gdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAjIHRoaXMgaW50ZXJwb2xhdGlvbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGVdCisgICAgZGVmIHRvX3F1b3RlZF9lcXVpdmFsZW50CisgICAgICBGdW5jYWxsLm5ldygKKyAgICAgICAgInVucXVvdGUiLAorICAgICAgICBbdG9fc3RyaW5nX2ludGVycG9sYXRpb24oc2VsZildLAorICAgICAgICBTYXNzOjpVdGlsOjpOb3JtYWxpemVkTWFwLm5ldywKKyAgICAgICAgbmlsLAorICAgICAgICBuaWwpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIHRocmVlIGNvbXBvbmVudHMgb2YgdGhlIGludGVycG9sYXRpb24sIGBiZWZvcmVgLCBgbWlkYCwgYW5kIGBhZnRlcmAuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXk8Tm9kZT5dCisgICAgIyBAc2VlICNpbml0aWFsaXplCisgICAgIyBAc2VlIE5vZGUjY2hpbGRyZW4KKyAgICBkZWYgY2hpbGRyZW4KKyAgICAgIFtAYmVmb3JlLCBAbWlkLCBAYWZ0ZXJdLmNvbXBhY3QKKyAgICBlbmQKKworICAgICMgQHNlZSBOb2RlI2RlZXBfY29weQorICAgIGRlZiBkZWVwX2NvcHkKKyAgICAgIG5vZGUgPSBkdXAKKyAgICAgIG5vZGUuaW5zdGFuY2VfdmFyaWFibGVfc2V0KCdAYmVmb3JlJywgQGJlZm9yZS5kZWVwX2NvcHkpIGlmIEBiZWZvcmUKKyAgICAgIG5vZGUuaW5zdGFuY2VfdmFyaWFibGVfc2V0KCdAbWlkJywgQG1pZC5kZWVwX2NvcHkpCisgICAgICBub2RlLmluc3RhbmNlX3ZhcmlhYmxlX3NldCgnQGFmdGVyJywgQGFmdGVyLmRlZXBfY29weSkgaWYgQGFmdGVyCisgICAgICBub2RlCisgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKworICAgICMgQ29udmVydHMgYSBzY3JpcHQgbm9kZSBpbnRvIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgaW50ZXJwb2xhdGlvbgorICAgICMgZXhwcmVzc2lvbi4KKyAgICAjCisgICAgIyBAcGFyYW0gbm9kZV9vcl9pbnRlcnAgW1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZV0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VHJlZTo6U3RyaW5nSW50ZXJwb2xhdGlvbl0KKyAgICBkZWYgdG9fc3RyaW5nX2ludGVycG9sYXRpb24obm9kZV9vcl9pbnRlcnApCisgICAgICB1bmxlc3Mgbm9kZV9vcl9pbnRlcnAuaXNfYT8oSW50ZXJwb2xhdGlvbikKKyAgICAgICAgbm9kZSA9IG5vZGVfb3JfaW50ZXJwCisgICAgICAgIHJldHVybiBzdHJpbmdfbGl0ZXJhbChub2RlLnZhbHVlLnRvX3MpIGlmIG5vZGUuaXNfYT8oTGl0ZXJhbCkKKyAgICAgICAgaWYgbm9kZS5pc19hPyhTdHJpbmdJbnRlcnBvbGF0aW9uKQorICAgICAgICAgIHJldHVybiBjb25jYXQoc3RyaW5nX2xpdGVyYWwobm9kZS5xdW90ZSksIGNvbmNhdChub2RlLCBzdHJpbmdfbGl0ZXJhbChub2RlLnF1b3RlKSkpCisgICAgICAgIGVuZAorICAgICAgICByZXR1cm4gU3RyaW5nSW50ZXJwb2xhdGlvbi5uZXcoc3RyaW5nX2xpdGVyYWwoIiIpLCBub2RlLCBzdHJpbmdfbGl0ZXJhbCgiIikpCisgICAgICBlbmQKKworICAgICAgaW50ZXJwID0gbm9kZV9vcl9pbnRlcnAKKyAgICAgIGFmdGVyX3N0cmluZ19vcl9pbnRlcnAgPQorICAgICAgICBpZiBpbnRlcnAuYWZ0ZXIKKyAgICAgICAgICB0b19zdHJpbmdfaW50ZXJwb2xhdGlvbihpbnRlcnAuYWZ0ZXIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdHJpbmdfbGl0ZXJhbCgiIikKKyAgICAgICAgZW5kCisgICAgICBpZiBpbnRlcnAuYWZ0ZXIgJiYgaW50ZXJwLndoaXRlc3BhY2VfYWZ0ZXIKKyAgICAgICAgYWZ0ZXJfc3RyaW5nX29yX2ludGVycCA9IGNvbmNhdChzdHJpbmdfbGl0ZXJhbCgnICcpLCBhZnRlcl9zdHJpbmdfb3JfaW50ZXJwKQorICAgICAgZW5kCisKKyAgICAgIG1pZF9zdHJpbmdfb3JfaW50ZXJwID0gdG9fc3RyaW5nX2ludGVycG9sYXRpb24oaW50ZXJwLm1pZCkKKworICAgICAgYmVmb3JlX3N0cmluZ19vcl9pbnRlcnAgPQorICAgICAgICBpZiBpbnRlcnAuYmVmb3JlCisgICAgICAgICAgdG9fc3RyaW5nX2ludGVycG9sYXRpb24oaW50ZXJwLmJlZm9yZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0cmluZ19saXRlcmFsKCIiKQorICAgICAgICBlbmQKKyAgICAgIGlmIGludGVycC5iZWZvcmUgJiYgaW50ZXJwLndoaXRlc3BhY2VfYmVmb3JlCisgICAgICAgIGJlZm9yZV9zdHJpbmdfb3JfaW50ZXJwID0gY29uY2F0KGJlZm9yZV9zdHJpbmdfb3JfaW50ZXJwLCBzdHJpbmdfbGl0ZXJhbCgnICcpKQorICAgICAgZW5kCisKKyAgICAgIGNvbmNhdChiZWZvcmVfc3RyaW5nX29yX2ludGVycCwgY29uY2F0KG1pZF9zdHJpbmdfb3JfaW50ZXJwLCBhZnRlcl9zdHJpbmdfb3JfaW50ZXJwKSkKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgICMgRXZhbHVhdGVzIHRoZSBpbnRlcnBvbGF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBlbnZpcm9ubWVudCBbU2Fzczo6RW52aXJvbm1lbnRdIFRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0byBldmFsdWF0ZSB0aGUgU2Fzc1NjcmlwdAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXQorICAgICMgICBUaGUgU2Fzc1NjcmlwdCBzdHJpbmcgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGludGVycG9sYXRpb24KKyAgICBkZWYgX3BlcmZvcm0oZW52aXJvbm1lbnQpCisgICAgICByZXMgPSAiIgorICAgICAgcmVzIDw8IEBiZWZvcmUucGVyZm9ybShlbnZpcm9ubWVudCkudG9fcyBpZiBAYmVmb3JlCisgICAgICByZXMgPDwgIiAiIGlmIEBiZWZvcmUgJiYgQHdoaXRlc3BhY2VfYmVmb3JlCisKKyAgICAgIHZhbCA9IEBtaWQucGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIGlmIEB3YXJuX2Zvcl9jb2xvciAmJiB2YWwuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IpICYmIHZhbC5uYW1lCisgICAgICAgIGFsdGVybmF0aXZlID0gT3BlcmF0aW9uLm5ldyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KCIiLCA6c3RyaW5nKSwgQG1pZCwgOnBsdXMpCisgICAgICAgIFNhc3M6OlV0aWwuc2Fzc193YXJuIDw8TUVTU0FHRQorV0FSTklORyBvbiBsaW5lICN7bGluZX0sIGNvbHVtbiAje3NvdXJjZV9yYW5nZS5zdGFydF9wb3Mub2Zmc2V0fSN7IiBvZiAje2ZpbGVuYW1lfSIgaWYgZmlsZW5hbWV9OgorWW91IHByb2JhYmx5IGRvbid0IG1lYW4gdG8gdXNlIHRoZSBjb2xvciB2YWx1ZSBgI3t2YWx9JyBpbiBpbnRlcnBvbGF0aW9uIGhlcmUuCitJdCBtYXkgZW5kIHVwIHJlcHJlc2VudGVkIGFzICN7dmFsLmluc3BlY3R9LCB3aGljaCB3aWxsIGxpa2VseSBwcm9kdWNlIGludmFsaWQgQ1NTLgorQWx3YXlzIHF1b3RlIGNvbG9yIG5hbWVzIHdoZW4gdXNpbmcgdGhlbSBhcyBzdHJpbmdzIChmb3IgZXhhbXBsZSwgIiN7dmFsfSIpLgorSWYgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgY29sb3IgdmFsdWUgaGVyZSwgdXNlIGAje2FsdGVybmF0aXZlLnRvX3Nhc3N9Jy4KK01FU1NBR0UKKyAgICAgIGVuZAorCisgICAgICByZXMgPDwgdmFsLnRvX3MoOnF1b3RlID0+IDpub25lKQorICAgICAgcmVzIDw8ICIgIiBpZiBAYWZ0ZXIgJiYgQHdoaXRlc3BhY2VfYWZ0ZXIKKyAgICAgIHJlcyA8PCBAYWZ0ZXIucGVyZm9ybShlbnZpcm9ubWVudCkudG9fcyBpZiBAYWZ0ZXIKKyAgICAgIHN0ciA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoCisgICAgICAgIHJlcywgOmlkZW50aWZpZXIsCisgICAgICAgICh0b19xdW90ZWRfZXF1aXZhbGVudC50b19zYXNzIGlmIGRlcHJlY2F0aW9uID09IDpwb3RlbnRpYWwpKQorICAgICAgc3RyLnNvdXJjZV9yYW5nZSA9IHNvdXJjZV9yYW5nZQorICAgICAgb3B0cyhzdHIpCisgICAgZW5kCisKKyAgICAjIENvbmNhdGVuYXRlcyB0d28gc3RyaW5nIGxpdGVyYWxzIG9yIHN0cmluZyBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb25zLgorICAgICMKKyAgICAjIEBwYXJhbSBzdHJpbmdfb3JfaW50ZXJwMSBbU2Fzczo6U2NyaXB0OjpUcmVlOjpMaXRlcmFsfFNhc3M6OlNjcmlwdDo6VHJlZTo6U3RyaW5nSW50ZXJwb2xhdGlvbl0KKyAgICAjIEBwYXJhbSBzdHJpbmdfb3JfaW50ZXJwMiBbU2Fzczo6U2NyaXB0OjpUcmVlOjpMaXRlcmFsfFNhc3M6OlNjcmlwdDo6VHJlZTo6U3RyaW5nSW50ZXJwb2xhdGlvbl0KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VHJlZTo6U3RyaW5nSW50ZXJwb2xhdGlvbl0KKyAgICBkZWYgY29uY2F0KHN0cmluZ19vcl9pbnRlcnAxLCBzdHJpbmdfb3JfaW50ZXJwMikKKyAgICAgIGlmIHN0cmluZ19vcl9pbnRlcnAxLmlzX2E/KExpdGVyYWwpICYmIHN0cmluZ19vcl9pbnRlcnAyLmlzX2E/KExpdGVyYWwpCisgICAgICAgIHJldHVybiBzdHJpbmdfbGl0ZXJhbChzdHJpbmdfb3JfaW50ZXJwMS52YWx1ZS52YWx1ZSArIHN0cmluZ19vcl9pbnRlcnAyLnZhbHVlLnZhbHVlKQorICAgICAgZW5kCisKKyAgICAgIGlmIHN0cmluZ19vcl9pbnRlcnAxLmlzX2E/KExpdGVyYWwpCisgICAgICAgIHN0cmluZyA9IHN0cmluZ19vcl9pbnRlcnAxCisgICAgICAgIGludGVycCA9IHN0cmluZ19vcl9pbnRlcnAyCisgICAgICAgIGJlZm9yZSA9IHN0cmluZ19saXRlcmFsKHN0cmluZy52YWx1ZS52YWx1ZSArIGludGVycC5iZWZvcmUudmFsdWUudmFsdWUpCisgICAgICAgIHJldHVybiBTdHJpbmdJbnRlcnBvbGF0aW9uLm5ldyhiZWZvcmUsIGludGVycC5taWQsIGludGVycC5hZnRlcikKKyAgICAgIGVuZAorCisgICAgICBTdHJpbmdJbnRlcnBvbGF0aW9uLm5ldygKKyAgICAgICAgc3RyaW5nX29yX2ludGVycDEuYmVmb3JlLAorICAgICAgICBzdHJpbmdfb3JfaW50ZXJwMS5taWQsCisgICAgICAgIGNvbmNhdChzdHJpbmdfb3JfaW50ZXJwMS5hZnRlciwgc3RyaW5nX29yX2ludGVycDIpKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGEgc3RyaW5nIGxpdGVyYWwgd2l0aCB0aGUgZ2l2ZW4gY29udGVudHMuCisgICAgIworICAgICMgQHBhcmFtIHN0cmluZyBbU3RyaW5nXQorICAgICMgQHJldHVybiBzdHJpbmcgW1Nhc3M6OlNjcmlwdDo6VHJlZTo6TGl0ZXJhbF0KKyAgICBkZWYgc3RyaW5nX2xpdGVyYWwoc3RyaW5nKQorICAgICAgTGl0ZXJhbC5uZXcoU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldyhzdHJpbmcsIDpzdHJpbmcpKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS9saXN0X2xpdGVyYWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL2xpc3RfbGl0ZXJhbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmJhYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS9saXN0X2xpdGVyYWwucmIKQEAgLTAsMCArMSwxMTkgQEAKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlRyZWUKKyAgIyBBIHBhcnNlIHRyZWUgbm9kZSByZXByZXNlbnRpbmcgYSBsaXN0IGxpdGVyYWwuIFdoZW4gcmVzb2x2ZWQsIHRoaXMgcmV0dXJucyBhCisgICMge1Nhc3M6OlRyZWU6OlZhbHVlOjpMaXN0fS4KKyAgY2xhc3MgTGlzdExpdGVyYWwgPCBOb2RlCisgICAgIyBUaGUgcGFyc2Ugbm9kZXMgZm9yIG1lbWJlcnMgb2YgdGhpcyBsaXN0LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PE5vZGU+XQorICAgIGF0dHJfcmVhZGVyIDplbGVtZW50cworCisgICAgIyBUaGUgb3BlcmF0b3Igc2VwYXJhdGluZyB0aGUgdmFsdWVzIG9mIHRoZSBsaXN0LiBFaXRoZXIgYDpjb21tYWAgb3IKKyAgICAjIGA6c3BhY2VgLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N5bWJvbF0KKyAgICBhdHRyX3JlYWRlciA6c2VwYXJhdG9yCisKKyAgICAjIFdoZXRoZXIgdGhlIGxpc3QgaXMgc3Vycm91bmRlZCBieSBzcXVhcmUgYnJhY2tldHMuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBhdHRyX3JlYWRlciA6YnJhY2tldGVkCisKKyAgICAjIENyZWF0ZXMgYSBuZXcgbGlzdCBsaXRlcmFsLgorICAgICMKKyAgICAjIEBwYXJhbSBlbGVtZW50cyBbQXJyYXk8Tm9kZT5dIFNlZSBceyNlbGVtZW50c30KKyAgICAjIEBwYXJhbSBzZXBhcmF0b3IgW1N5bWJvbF0gU2VlIFx7I3NlcGFyYXRvcn0KKyAgICAjIEBwYXJhbSBicmFja2V0ZWQgW0Jvb2xlYW5dIFNlZSBceyNicmFja2V0ZWR9CisgICAgZGVmIGluaXRpYWxpemUoZWxlbWVudHMsIHNlcGFyYXRvcjogbmlsLCBicmFja2V0ZWQ6IGZhbHNlKQorICAgICAgQGVsZW1lbnRzID0gZWxlbWVudHMKKyAgICAgIEBzZXBhcmF0b3IgPSBzZXBhcmF0b3IKKyAgICAgIEBicmFja2V0ZWQgPSBicmFja2V0ZWQKKyAgICBlbmQKKworICAgICMgQHNlZSBOb2RlI2NoaWxkcmVuCisgICAgZGVmIGNoaWxkcmVuOyBlbGVtZW50czsgZW5kCisKKyAgICAjIEBzZWUgVmFsdWUjdG9fc2FzcworICAgIGRlZiB0b19zYXNzKG9wdHMgPSB7fSkKKyAgICAgIHJldHVybiBicmFja2V0ZWQgPyAiW10iIDogIigpIiBpZiBlbGVtZW50cy5lbXB0eT8KKyAgICAgIG1lbWJlcnMgPSBlbGVtZW50cy5tYXAgZG8gfHZ8CisgICAgICAgIGlmIGVsZW1lbnRfbmVlZHNfcGFyZW5zPyh2KQorICAgICAgICAgICIoI3t2LnRvX3Nhc3Mob3B0cyl9KSIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHYudG9fc2FzcyhvcHRzKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBpZiBzZXBhcmF0b3IgPT0gOmNvbW1hICYmIG1lbWJlcnMubGVuZ3RoID09IDEKKyAgICAgICAgcmV0dXJuICIje2JyYWNrZXRlZCA/ICdbJyA6ICcoJ30je21lbWJlcnMuZmlyc3R9LCN7YnJhY2tldGVkID8gJ10nIDogJyknfSIKKyAgICAgIGVuZAorCisgICAgICBjb250ZW50cyA9IG1lbWJlcnMuam9pbihzZXBfc3RyKG5pbCkpCisgICAgICBicmFja2V0ZWQgPyAiWyN7Y29udGVudHN9XSIgOiBjb250ZW50cworICAgIGVuZAorCisgICAgIyBAc2VlIE5vZGUjZGVlcF9jb3B5CisgICAgZGVmIGRlZXBfY29weQorICAgICAgbm9kZSA9IGR1cAorICAgICAgbm9kZS5pbnN0YW5jZV92YXJpYWJsZV9zZXQoJ0BlbGVtZW50cycsIGVsZW1lbnRzLm1hcCB7fGV8IGUuZGVlcF9jb3B5fSkKKyAgICAgIG5vZGUKKyAgICBlbmQKKworICAgIGRlZiBpbnNwZWN0CisgICAgICAoYnJhY2tldGVkID8gJ1snIDogJygnKSArCisgICAgICAgIGVsZW1lbnRzLm1hcCB7fGV8IGUuaW5zcGVjdH0uam9pbihzZXBhcmF0b3IgPT0gOnNwYWNlID8gJyAnIDogJywgJykgKworICAgICAgICAoYnJhY2tldGVkID8gJ10nIDogJyknKQorICAgIGVuZAorCisgICAgZGVmIGZvcmNlX2RpdmlzaW9uIQorICAgICAgIyBEbyBub3RoaW5nLiBMaXN0cyBwcmV2ZW50IGRpdmlzaW9uIHByb3BhZ2F0aW9uLgorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICBkZWYgX3BlcmZvcm0oZW52aXJvbm1lbnQpCisgICAgICBsaXN0ID0gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdC5uZXcoCisgICAgICAgIGVsZW1lbnRzLm1hcCB7fGV8IGUucGVyZm9ybShlbnZpcm9ubWVudCl9LAorICAgICAgICBzZXBhcmF0b3I6IHNlcGFyYXRvciwKKyAgICAgICAgYnJhY2tldGVkOiBicmFja2V0ZWQpCisgICAgICBsaXN0LnNvdXJjZV9yYW5nZSA9IHNvdXJjZV9yYW5nZQorICAgICAgbGlzdC5vcHRpb25zID0gb3B0aW9ucworICAgICAgbGlzdAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgIyBSZXR1cm5zIHdoZXRoZXIgYW4gZWxlbWVudCBpbiB0aGUgbGlzdCBzaG91bGQgYmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcworICAgICMgd2hlbiBzZXJpYWxpemVkIHRvIFNhc3MuCisgICAgZGVmIGVsZW1lbnRfbmVlZHNfcGFyZW5zPyhlbGVtZW50KQorICAgICAgaWYgZWxlbWVudC5pc19hPyhMaXN0TGl0ZXJhbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlIGlmIGVsZW1lbnQuZWxlbWVudHMubGVuZ3RoIDwgMgorICAgICAgICByZXR1cm4gZmFsc2UgaWYgZWxlbWVudC5icmFja2V0ZWQKKyAgICAgICAgcmV0dXJuIFNhc3M6OlNjcmlwdDo6UGFyc2VyLnByZWNlZGVuY2Vfb2YoZWxlbWVudC5zZXBhcmF0b3IgfHwgOnNwYWNlKSA8PQorICAgICAgICAgICAgICAgU2Fzczo6U2NyaXB0OjpQYXJzZXIucHJlY2VkZW5jZV9vZihzZXBhcmF0b3IgfHwgOnNwYWNlKQorICAgICAgZW5kCisKKyAgICAgIHJldHVybiBmYWxzZSB1bmxlc3Mgc2VwYXJhdG9yID09IDpzcGFjZQorCisgICAgICBpZiBlbGVtZW50LmlzX2E/KFVuYXJ5T3BlcmF0aW9uKQorICAgICAgICByZXR1cm4gZWxlbWVudC5vcGVyYXRvciA9PSA6bWludXMgfHwgZWxlbWVudC5vcGVyYXRvciA9PSA6cGx1cworICAgICAgZW5kCisKKyAgICAgIHJldHVybiBmYWxzZSB1bmxlc3MgZWxlbWVudC5pc19hPyhPcGVyYXRpb24pCisgICAgICByZXR1cm4gdHJ1ZSB1bmxlc3MgZWxlbWVudC5vcGVyYXRvciA9PSA6ZGl2CisgICAgICAhKGlzX2xpdGVyYWxfbnVtYmVyPyhlbGVtZW50Lm9wZXJhbmQxKSAmJiBpc19saXRlcmFsX251bWJlcj8oZWxlbWVudC5vcGVyYW5kMikpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIGEgbnVtYmVyIGxpdGVyYWwgdGhhdCBzaG91bGRuJ3QgYmUgZGl2aWRlZC4KKyAgICBkZWYgaXNfbGl0ZXJhbF9udW1iZXI/KHZhbHVlKQorICAgICAgdmFsdWUuaXNfYT8oTGl0ZXJhbCkgJiYKKyAgICAgICAgdmFsdWUudmFsdWUuaXNfYT8oKFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcikpICYmCisgICAgICAgICF2YWx1ZS52YWx1ZS5vcmlnaW5hbC5uaWw/CisgICAgZW5kCisKKyAgICBkZWYgc2VwX3N0cihvcHRzID0gb3B0aW9ucykKKyAgICAgIHJldHVybiAnICcgaWYgc2VwYXJhdG9yID09IDpzcGFjZQorICAgICAgcmV0dXJuICcsJyBpZiBvcHRzICYmIG9wdHNbOnN0eWxlXSA9PSA6Y29tcHJlc3NlZAorICAgICAgJywgJworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS9saXRlcmFsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS9saXRlcmFsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGQ2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL2xpdGVyYWwucmIKQEAgLTAsMCArMSw0OSBAQAorbW9kdWxlIFNhc3M6OlNjcmlwdDo6VHJlZQorICAjIFRoZSBwYXJzZSB0cmVlIG5vZGUgZm9yIGEgbGl0ZXJhbCBzY2FsYXIgdmFsdWUuIFRoaXMgd3JhcHMgYW4gaW5zdGFuY2Ugb2YKKyAgIyB7U2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZX0uCisgICMKKyAgIyBMaXN0IGxpdGVyYWxzIHNob3VsZCB1c2Uge0xpc3RMaXRlcmFsfSBpbnN0ZWFkLgorICBjbGFzcyBMaXRlcmFsIDwgTm9kZQorICAgICMgVGhlIHdyYXBwZWQgdmFsdWUuCisgICAgIworICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICBhdHRyX3JlYWRlciA6dmFsdWUKKworICAgICMgQ3JlYXRlcyBhIG5ldyBsaXRlcmFsIHZhbHVlLgorICAgICMKKyAgICAjIEBwYXJhbSB2YWx1ZSBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0KKyAgICAjIEBzZWUgI3ZhbHVlCisgICAgZGVmIGluaXRpYWxpemUodmFsdWUpCisgICAgICBAdmFsdWUgPSB2YWx1ZQorICAgIGVuZAorCisgICAgIyBAc2VlIE5vZGUjY2hpbGRyZW4KKyAgICBkZWYgY2hpbGRyZW47IFtdOyBlbmQKKworICAgICMgQHNlZSBOb2RlI3RvX3Nhc3MKKyAgICBkZWYgdG9fc2FzcyhvcHRzID0ge30pOyB2YWx1ZS50b19zYXNzKG9wdHMpOyBlbmQKKworICAgICMgQHNlZSBOb2RlI2RlZXBfY29weQorICAgIGRlZiBkZWVwX2NvcHk7IGR1cDsgZW5kCisKKyAgICAjIEBzZWUgTm9kZSNvcHRpb25zPQorICAgIGRlZiBvcHRpb25zPShvcHRpb25zKQorICAgICAgdmFsdWUub3B0aW9ucyA9IG9wdGlvbnMKKyAgICBlbmQKKworICAgIGRlZiBpbnNwZWN0CisgICAgICB2YWx1ZS5pbnNwZWN0CisgICAgZW5kCisKKyAgICBkZWYgZm9yY2VfZGl2aXNpb24hCisgICAgICB2YWx1ZS5vcmlnaW5hbCA9IG5pbCBpZiB2YWx1ZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIpCisgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKworICAgIGRlZiBfcGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIHZhbHVlLnNvdXJjZV9yYW5nZSA9IHNvdXJjZV9yYW5nZQorICAgICAgdmFsdWUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3RyZWUvbWFwX2xpdGVyYWwucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL21hcF9saXRlcmFsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMmU4OGYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL21hcF9saXRlcmFsLnJiCkBAIC0wLDAgKzEsNjQgQEAKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlRyZWUKKyAgIyBBIGNsYXNzIHJlcHJlc2VudGluZyBhIG1hcCBsaXRlcmFsLiBXaGVuIHJlc29sdmVkLCB0aGlzIHJldHVybnMgYQorICAjIHtTYXNzOjpTY3JpcHQ6Ok5vZGU6Ok1hcH0uCisgIGNsYXNzIE1hcExpdGVyYWwgPCBOb2RlCisgICAgIyBUaGUga2V5L3ZhbHVlIHBhaXJzIHRoYXQgbWFrZSB1cCB0aGlzIG1hcCBub2RlLiBUaGlzIGlzbid0IGEgSGFzaCBzbyB0aGF0CisgICAgIyB3ZSBjYW4gZGV0ZWN0IGtleSBjb2xsaXNpb25zIG9uY2UgYWxsIHRoZSBrZXlzIGhhdmUgYmVlbiBwZXJmb3JtZWQuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXk8KE5vZGUsIE5vZGUpPl0KKyAgICBhdHRyX3JlYWRlciA6cGFpcnMKKworICAgICMgQ3JlYXRlcyBhIG5ldyBtYXAgbGl0ZXJhbC4KKyAgICAjCisgICAgIyBAcGFyYW0gcGFpcnMgW0FycmF5PChOb2RlLCBOb2RlKT5dIFNlZSBceyNwYWlyc30KKyAgICBkZWYgaW5pdGlhbGl6ZShwYWlycykKKyAgICAgIEBwYWlycyA9IHBhaXJzCisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSNjaGlsZHJlbgorICAgIGRlZiBjaGlsZHJlbgorICAgICAgQHBhaXJzLmZsYXR0ZW4KKyAgICBlbmQKKworICAgICMgQHNlZSBOb2RlI3RvX3Nhc3MKKyAgICBkZWYgdG9fc2FzcyhvcHRzID0ge30pCisgICAgICByZXR1cm4gIigpIiBpZiBwYWlycy5lbXB0eT8KKworICAgICAgdG9fc2FzcyA9IGxhbWJkYSBkbyB8dmFsdWV8CisgICAgICAgIGlmIHZhbHVlLmlzX2E/KExpc3RMaXRlcmFsKSAmJiB2YWx1ZS5zZXBhcmF0b3IgPT0gOmNvbW1hCisgICAgICAgICAgIigje3ZhbHVlLnRvX3Nhc3Mob3B0cyl9KSIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlLnRvX3Nhc3Mob3B0cykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIigiICsgcGFpcnMubWFwIHt8KGssIHYpfCAiI3t0b19zYXNzW2tdfTogI3t0b19zYXNzW3ZdfSJ9LmpvaW4oJywgJykgKyAiKSIKKyAgICBlbmQKKyAgICBhbGlhc19tZXRob2QgOmluc3BlY3QsIDp0b19zYXNzCisKKyAgICAjIEBzZWUgTm9kZSNkZWVwX2NvcHkKKyAgICBkZWYgZGVlcF9jb3B5CisgICAgICBub2RlID0gZHVwCisgICAgICBub2RlLmluc3RhbmNlX3ZhcmlhYmxlX3NldCgnQHBhaXJzJywKKyAgICAgICAgcGFpcnMubWFwIHt8KGssIHYpfCBbay5kZWVwX2NvcHksIHYuZGVlcF9jb3B5XX0pCisgICAgICBub2RlCisgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKworICAgICMgQHNlZSBOb2RlI19wZXJmb3JtCisgICAgZGVmIF9wZXJmb3JtKGVudmlyb25tZW50KQorICAgICAga2V5cyA9IFNldC5uZXcKKyAgICAgIG1hcCA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok1hcC5uZXcoSGFzaFtwYWlycy5tYXAgZG8gfChrLCB2KXwKKyAgICAgICAgaywgdiA9IGsucGVyZm9ybShlbnZpcm9ubWVudCksIHYucGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgICAgaWYga2V5cy5pbmNsdWRlPyhrKQorICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiRHVwbGljYXRlIGtleSAje2suaW5zcGVjdH0gaW4gbWFwICN7dG9fc2Fzc30uIikKKyAgICAgICAgZW5kCisgICAgICAgIGtleXMgPDwgaworICAgICAgICBbaywgdl0KKyAgICAgIGVuZF0pCisgICAgICBtYXAub3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgIG1hcAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS9ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OGRkNzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL25vZGUucmIKQEAgLTAsMCArMSwxMTkgQEAKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlRyZWUKKyAgIyBUaGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgU2Fzc1NjcmlwdCBwYXJzZSB0cmVlIG5vZGVzLgorICAjCisgICMgVXNlIFx7I3BlcmZvcm19IHRvIGV2YWx1YXRlIGEgcGFyc2UgdHJlZS4KKyAgY2xhc3MgTm9kZQorICAgICMgVGhlIG9wdGlvbnMgaGFzaCBmb3IgdGhpcyBub2RlLgorICAgICMKKyAgICAjIEByZXR1cm4gW3tTeW1ib2wgPT4gT2JqZWN0fV0KKyAgICBhdHRyX3JlYWRlciA6b3B0aW9ucworCisgICAgIyBUaGUgbGluZSBvZiB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdGhpcyBub2RlIGFwcGVhcmVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW0ludGVnZXJdCisgICAgYXR0cl9hY2Nlc3NvciA6bGluZQorCisgICAgIyBUaGUgc291cmNlIHJhbmdlIGluIHRoZSBkb2N1bWVudCBvbiB3aGljaCB0aGlzIG5vZGUgYXBwZWFyZWQuCisgICAgIworICAgICMgQHJldHVybiBbU2Fzczo6U291cmNlOjpSYW5nZV0KKyAgICBhdHRyX2FjY2Vzc29yIDpzb3VyY2VfcmFuZ2UKKworICAgICMgVGhlIGZpbGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdGhpcyBub2RlIGFwcGVhcmVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX2FjY2Vzc29yIDpmaWxlbmFtZQorCisgICAgIyBTZXRzIHRoZSBvcHRpb25zIGhhc2ggZm9yIHRoaXMgbm9kZSwKKyAgICAjIGFzIHdlbGwgYXMgZm9yIGFsbCBjaGlsZCBub2Rlcy4KKyAgICAjIFNlZSB7ZmlsZTpTQVNTX1JFRkVSRU5DRS5tZCNPcHRpb25zIHRoZSBTYXNzIG9wdGlvbnMgZG9jdW1lbnRhdGlvbn0uCisgICAgIworICAgICMgQHBhcmFtIG9wdGlvbnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gVGhlIG9wdGlvbnMKKyAgICBkZWYgb3B0aW9ucz0ob3B0aW9ucykKKyAgICAgIEBvcHRpb25zID0gb3B0aW9ucworICAgICAgY2hpbGRyZW4uZWFjaCBkbyB8Y3wKKyAgICAgICAgaWYgYy5pc19hPyBIYXNoCisgICAgICAgICAgYy52YWx1ZXMuZWFjaCB7fHZ8IHYub3B0aW9ucyA9IG9wdGlvbnN9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjLm9wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEV2YWx1YXRlcyB0aGUgbm9kZS4KKyAgICAjCisgICAgIyBceyNwZXJmb3JtfSBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiBkaXJlY3RseTsKKyAgICAjIGluc3RlYWQsIG92ZXJyaWRlIFx7I1xfcGVyZm9ybX0uCisgICAgIworICAgICMgQHBhcmFtIGVudmlyb25tZW50IFtTYXNzOjpFbnZpcm9ubWVudF0gVGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBTYXNzU2NyaXB0CisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlXSBUaGUgU2Fzc1NjcmlwdCBvYmplY3QgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIFNhc3NTY3JpcHQKKyAgICBkZWYgcGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIF9wZXJmb3JtKGVudmlyb25tZW50KQorICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgICBlLm1vZGlmeV9iYWNrdHJhY2UoOmxpbmUgPT4gbGluZSkKKyAgICAgIHJhaXNlIGUKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhbGwgY2hpbGQgbm9kZXMgb2YgdGhpcyBub2RlLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PE5vZGU+XQorICAgIGRlZiBjaGlsZHJlbgorICAgICAgU2Fzczo6VXRpbC5hYnN0cmFjdChzZWxmKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoaXMgU2Fzc1NjcmlwdCBleHByZXNzaW9uLgorICAgICMKKyAgICAjIEBvcHRpb25zIG9wdHMgOnF1b3RlIFtTdHJpbmddCisgICAgIyAgIFRoZSBwcmVmZXJyZWQgcXVvdGUgc3R5bGUgZm9yIHF1b3RlZCBzdHJpbmdzLiBJZiBgOm5vbmVgLCBzdHJpbmdzIGFyZQorICAgICMgICBhbHdheXMgZW1pdHRlZCB1bnF1b3RlZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgZGVmIHRvX3Nhc3Mob3B0cyA9IHt9KQorICAgICAgU2Fzczo6VXRpbC5hYnN0cmFjdChzZWxmKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGEgZGVlcCBjbG9uZSBvZiB0aGlzIG5vZGUuCisgICAgIyBUaGUgY2hpbGQgbm9kZXMgYXJlIGNsb25lZCwgYnV0IG9wdGlvbnMgYXJlIG5vdC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtOb2RlXQorICAgIGRlZiBkZWVwX2NvcHkKKyAgICAgIFNhc3M6OlV0aWwuYWJzdHJhY3Qoc2VsZikKKyAgICBlbmQKKworICAgICMgRm9yY2VzIGFueSBkaXZpc2lvbiBvcGVyYXRpb25zIHdpdGggbnVtYmVyIGxpdGVyYWxzIGluIHRoaXMgZXhwcmVzc2lvbiB0bworICAgICMgZG8gcmVhbCBkaXZpc2lvbiwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHN0cmluZ3MuCisgICAgZGVmIGZvcmNlX2RpdmlzaW9uIQorICAgICAgY2hpbGRyZW4uZWFjaCB7fGN8IGMuZm9yY2VfZGl2aXNpb24hfQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICAjIENvbnZlcnRzIHVuZGVyc2NvcmVzIHRvIGRhc2hlcyBpZiB0aGUgOmRhc2hlcml6ZSBvcHRpb24gaXMgc2V0LgorICAgIGRlZiBkYXNoZXJpemUocywgb3B0cykKKyAgICAgIGlmIG9wdHNbOmRhc2hlcml6ZV0KKyAgICAgICAgcy50cignXycsICctJykKKyAgICAgIGVsc2UKKyAgICAgICAgcworICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEV2YWx1YXRlcyB0aGlzIG5vZGUuCisgICAgIyBOb3RlIHRoYXQgYWxsIHtTYXNzOjpTY3JpcHQ6OlZhbHVlfSBvYmplY3RzIGNyZWF0ZWQgd2l0aGluIHRoaXMgbWV0aG9kCisgICAgIyBzaG91bGQgaGF2ZSB0aGVpciBceyNvcHRpb25zfSBhdHRyaWJ1dGUgc2V0LCBwcm9iYWJseSB2aWEgXHsjb3B0c30uCisgICAgIworICAgICMgQHBhcmFtIGVudmlyb25tZW50IFtTYXNzOjpFbnZpcm9ubWVudF0gVGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBTYXNzU2NyaXB0CisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlXSBUaGUgU2Fzc1NjcmlwdCBvYmplY3QgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIFNhc3NTY3JpcHQKKyAgICAjIEBzZWUgI3BlcmZvcm0KKyAgICBkZWYgX3BlcmZvcm0oZW52aXJvbm1lbnQpCisgICAgICBTYXNzOjpVdGlsLmFic3RyYWN0KHNlbGYpCisgICAgZW5kCisKKyAgICAjIFNldHMgdGhlIFx7I29wdGlvbnN9IGZpZWxkIG9uIHRoZSBnaXZlbiB2YWx1ZSBhbmQgcmV0dXJucyBpdC4KKyAgICAjCisgICAgIyBAcGFyYW0gdmFsdWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWVdCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlXQorICAgIGRlZiBvcHRzKHZhbHVlKQorICAgICAgdmFsdWUub3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgIHZhbHVlCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL29wZXJhdGlvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3RyZWUvb3BlcmF0aW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOGY2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL29wZXJhdGlvbi5yYgpAQCAtMCwwICsxLDE0OSBAQAorbW9kdWxlIFNhc3M6OlNjcmlwdDo6VHJlZQorICAjIEEgU2Fzc1NjcmlwdCBwYXJzZSBub2RlIHJlcHJlc2VudGluZyBhIGJpbmFyeSBvcGVyYXRpb24sCisgICMgc3VjaCBhcyBgJGEgKyAkYmAgb3IgYCJmb28iICsgMWAuCisgIGNsYXNzIE9wZXJhdGlvbiA8IE5vZGUKKyAgICBAQGNvbG9yX2FyaXRobWV0aWNfZGVwcmVjYXRpb24gPSBTYXNzOjpEZXByZWNhdGlvbi5uZXcKKyAgICBAQHVuaXRsZXNzX2VxdWFsc19kZXByZWNhdGlvbiA9IFNhc3M6OkRlcHJlY2F0aW9uLm5ldworCisgICAgYXR0cl9yZWFkZXIgOm9wZXJhbmQxCisgICAgYXR0cl9yZWFkZXIgOm9wZXJhbmQyCisgICAgYXR0cl9yZWFkZXIgOm9wZXJhdG9yCisKKyAgICAjIEBwYXJhbSBvcGVyYW5kMSBbU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlXSBUaGUgcGFyc2UtdHJlZSBub2RlCisgICAgIyAgIGZvciB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvcgorICAgICMgQHBhcmFtIG9wZXJhbmQyIFtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGVdIFRoZSBwYXJzZS10cmVlIG5vZGUKKyAgICAjICAgZm9yIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAgICAjIEBwYXJhbSBvcGVyYXRvciBbU3ltYm9sXSBUaGUgb3BlcmF0b3IgdG8gcGVyZm9ybS4KKyAgICAjICAgVGhpcyBzaG91bGQgYmUgb25lIG9mIHRoZSBiaW5hcnkgb3BlcmF0b3IgbmFtZXMgaW4ge1Nhc3M6OlNjcmlwdDo6TGV4ZXI6Ok9QRVJBVE9SU30KKyAgICBkZWYgaW5pdGlhbGl6ZShvcGVyYW5kMSwgb3BlcmFuZDIsIG9wZXJhdG9yKQorICAgICAgQG9wZXJhbmQxID0gb3BlcmFuZDEKKyAgICAgIEBvcGVyYW5kMiA9IG9wZXJhbmQyCisgICAgICBAb3BlcmF0b3IgPSBvcGVyYXRvcgorICAgICAgc3VwZXIoKQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIEEgaHVtYW4tcmVhZGFibGUgcy1leHByZXNzaW9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvcGVyYXRpb24KKyAgICBkZWYgaW5zcGVjdAorICAgICAgIigje0BvcGVyYXRvci5pbnNwZWN0fSAje0BvcGVyYW5kMS5pbnNwZWN0fSAje0BvcGVyYW5kMi5pbnNwZWN0fSkiCisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSN0b19zYXNzCisgICAgZGVmIHRvX3Nhc3Mob3B0cyA9IHt9KQorICAgICAgbzEgPSBvcGVyYW5kX3RvX3Nhc3MgQG9wZXJhbmQxLCA6bGVmdCwgb3B0cworICAgICAgbzIgPSBvcGVyYW5kX3RvX3Nhc3MgQG9wZXJhbmQyLCA6cmlnaHQsIG9wdHMKKyAgICAgIHNlcCA9CisgICAgICAgIGNhc2UgQG9wZXJhdG9yCisgICAgICAgIHdoZW4gOmNvbW1hOyAiLCAiCisgICAgICAgIHdoZW4gOnNwYWNlOyAiICIKKyAgICAgICAgZWxzZTsgIiAje1Nhc3M6OlNjcmlwdDo6TGV4ZXI6Ok9QRVJBVE9SU19SRVZFUlNFW0BvcGVyYXRvcl19ICIKKyAgICAgICAgZW5kCisgICAgICAiI3tvMX0je3NlcH0je28yfSIKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgb3BlcmFuZHMgZm9yIHRoaXMgb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PE5vZGU+XQorICAgICMgQHNlZSBOb2RlI2NoaWxkcmVuCisgICAgZGVmIGNoaWxkcmVuCisgICAgICBbQG9wZXJhbmQxLCBAb3BlcmFuZDJdCisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSNkZWVwX2NvcHkKKyAgICBkZWYgZGVlcF9jb3B5CisgICAgICBub2RlID0gZHVwCisgICAgICBub2RlLmluc3RhbmNlX3ZhcmlhYmxlX3NldCgnQG9wZXJhbmQxJywgQG9wZXJhbmQxLmRlZXBfY29weSkKKyAgICAgIG5vZGUuaW5zdGFuY2VfdmFyaWFibGVfc2V0KCdAb3BlcmFuZDInLCBAb3BlcmFuZDIuZGVlcF9jb3B5KQorICAgICAgbm9kZQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICAjIEV2YWx1YXRlcyB0aGUgb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBlbnZpcm9ubWVudCBbU2Fzczo6RW52aXJvbm1lbnRdIFRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0byBldmFsdWF0ZSB0aGUgU2Fzc1NjcmlwdAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZV0gVGhlIFNhc3NTY3JpcHQgb2JqZWN0IHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSBvcGVyYXRpb24KKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZSBvcGVyYXRpb24gaXMgdW5kZWZpbmVkIGZvciB0aGUgb3BlcmFuZHMKKyAgICBkZWYgX3BlcmZvcm0oZW52aXJvbm1lbnQpCisgICAgICB2YWx1ZTEgPSBAb3BlcmFuZDEucGVyZm9ybShlbnZpcm9ubWVudCkKKworICAgICAgIyBTcGVjaWFsLWNhc2UgOmFuZCBhbmQgOm9yIHRvIHN1cHBvcnQgc2hvcnQtY2lyY3VpdGluZy4KKyAgICAgIGlmIEBvcGVyYXRvciA9PSA6YW5kCisgICAgICAgIHJldHVybiB2YWx1ZTEudG9fYm9vbCA/IEBvcGVyYW5kMi5wZXJmb3JtKGVudmlyb25tZW50KSA6IHZhbHVlMQorICAgICAgZWxzaWYgQG9wZXJhdG9yID09IDpvcgorICAgICAgICByZXR1cm4gdmFsdWUxLnRvX2Jvb2wgPyB2YWx1ZTEgOiBAb3BlcmFuZDIucGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIGVuZAorCisgICAgICB2YWx1ZTIgPSBAb3BlcmFuZDIucGVyZm9ybShlbnZpcm9ubWVudCkKKworICAgICAgaWYgKHZhbHVlMS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdWxsKSB8fCB2YWx1ZTIuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVsbCkpICYmCisgICAgICAgICAgQG9wZXJhdG9yICE9IDplcSAmJiBAb3BlcmF0b3IgIT0gOm5lcQorICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoCisgICAgICAgICAgIkludmFsaWQgbnVsbCBvcGVyYXRpb246IFwiI3t2YWx1ZTEuaW5zcGVjdH0gI3tAb3BlcmF0b3J9ICN7dmFsdWUyLmluc3BlY3R9XCIuIikKKyAgICAgIGVuZAorCisgICAgICBiZWdpbgorICAgICAgICByZXN1bHQgPSBvcHRzKHZhbHVlMS5zZW5kKEBvcGVyYXRvciwgdmFsdWUyKSkKKyAgICAgIHJlc2N1ZSBOb01ldGhvZEVycm9yID0+IGUKKyAgICAgICAgcmFpc2UgZSB1bmxlc3MgZS5uYW1lLnRvX3MgPT0gQG9wZXJhdG9yLnRvX3MKKyAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCJVbmRlZmluZWQgb3BlcmF0aW9uOiBcIiN7dmFsdWUxfSAje0BvcGVyYXRvcn0gI3t2YWx1ZTJ9XCIuIikKKyAgICAgIGVuZAorCisgICAgICB3YXJuX2Zvcl9jb2xvcl9hcml0aG1ldGljKHZhbHVlMSwgdmFsdWUyKQorICAgICAgd2Fybl9mb3JfdW5pdGxlc3NfZXF1YWxzKHZhbHVlMSwgdmFsdWUyLCByZXN1bHQpCisKKyAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIHdhcm5fZm9yX2NvbG9yX2FyaXRobWV0aWModmFsdWUxLCB2YWx1ZTIpCisgICAgICByZXR1cm4gdW5sZXNzIEBvcGVyYXRvciA9PSA6cGx1cyB8fCBAb3BlcmF0b3IgPT0gOnRpbWVzIHx8IEBvcGVyYXRvciA9PSA6bWludXMgfHwKKyAgICAgICAgICAgICAgICAgICAgQG9wZXJhdG9yID09IDpkaXYgfHwgQG9wZXJhdG9yID09IDptb2QKKworICAgICAgaWYgdmFsdWUxLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcikKKyAgICAgICAgcmV0dXJuIHVubGVzcyB2YWx1ZTIuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IpCisgICAgICBlbHNpZiB2YWx1ZTEuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IpCisgICAgICAgIHJldHVybiB1bmxlc3MgdmFsdWUyLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yKSB8fCB2YWx1ZTIuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4KKyAgICAgIGVuZAorCisgICAgICBAQGNvbG9yX2FyaXRobWV0aWNfZGVwcmVjYXRpb24ud2FybihmaWxlbmFtZSwgbGluZSwgPDxXQVJOSU5HKQorVGhlIG9wZXJhdGlvbiBgI3t2YWx1ZTF9ICN7QG9wZXJhdG9yfSAje3ZhbHVlMn1gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zLgorQ29uc2lkZXIgdXNpbmcgU2FzcydzIGNvbG9yIGZ1bmN0aW9ucyBpbnN0ZWFkLgoraHR0cDovL3Nhc3MtbGFuZy5jb20vZG9jdW1lbnRhdGlvbi9TYXNzL1NjcmlwdC9GdW5jdGlvbnMuaHRtbCNvdGhlcl9jb2xvcl9mdW5jdGlvbnMKK1dBUk5JTkcKKyAgICBlbmQKKworICAgIGRlZiB3YXJuX2Zvcl91bml0bGVzc19lcXVhbHModmFsdWUxLCB2YWx1ZTIsIHJlc3VsdCkKKyAgICAgIHJldHVybiB1bmxlc3MgQG9wZXJhdG9yID09IDplcSB8fCBAb3BlcmF0b3IgPT0gOm5lcQorICAgICAgcmV0dXJuIHVubGVzcyB2YWx1ZTEuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKQorICAgICAgcmV0dXJuIHVubGVzcyB2YWx1ZTIuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKQorICAgICAgcmV0dXJuIHVubGVzcyB2YWx1ZTEudW5pdGxlc3M/ICE9IHZhbHVlMi51bml0bGVzcz8KKyAgICAgIHJldHVybiB1bmxlc3MgcmVzdWx0ID09IChpZiBAb3BlcmF0b3IgPT0gOmVxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sOjpUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbDo6RkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpCisKKyAgICAgIG9wZXJhdGlvbiA9ICIje3ZhbHVlMS50b19zYXNzfSAje0BvcGVyYXRvciA9PSA6ZXEgPyAnPT0nIDogJyE9J30gI3t2YWx1ZTIudG9fc2Fzc30iCisgICAgICBmdXR1cmVfdmFsdWUgPSBAb3BlcmF0b3IgPT0gOm5lcQorICAgICAgQEB1bml0bGVzc19lcXVhbHNfZGVwcmVjYXRpb24ud2FybihmaWxlbmFtZSwgbGluZSwgPDxXQVJOSU5HKQorVGhlIHJlc3VsdCBvZiBgI3tvcGVyYXRpb259YCB3aWxsIGJlIGAje2Z1dHVyZV92YWx1ZX1gIGluIGZ1dHVyZSByZWxlYXNlcyBvZiBTYXNzLgorVW5pdGxlc3MgbnVtYmVycyB3aWxsIG5vIGxvbmdlciBiZSBlcXVhbCB0byB0aGUgc2FtZSBudW1iZXJzIHdpdGggdW5pdHMuCitXQVJOSU5HCisgICAgZW5kCisKKyAgICBkZWYgb3BlcmFuZF90b19zYXNzKG9wLCBzaWRlLCBvcHRzKQorICAgICAgcmV0dXJuICIoI3tvcC50b19zYXNzKG9wdHMpfSkiIGlmIG9wLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6TGlzdExpdGVyYWwpCisgICAgICByZXR1cm4gb3AudG9fc2FzcyhvcHRzKSB1bmxlc3Mgb3AuaXNfYT8oT3BlcmF0aW9uKQorCisgICAgICBwcmVkID0gU2Fzczo6U2NyaXB0OjpQYXJzZXIucHJlY2VkZW5jZV9vZihAb3BlcmF0b3IpCisgICAgICBzdWJfcHJlZCA9IFNhc3M6OlNjcmlwdDo6UGFyc2VyLnByZWNlZGVuY2Vfb2Yob3Aub3BlcmF0b3IpCisgICAgICBhc3NvYyA9IFNhc3M6OlNjcmlwdDo6UGFyc2VyLmFzc29jaWF0aXZlPyhAb3BlcmF0b3IpCisgICAgICByZXR1cm4gIigje29wLnRvX3Nhc3Mob3B0cyl9KSIgaWYgc3ViX3ByZWQgPCBwcmVkIHx8CisgICAgICAgIChzaWRlID09IDpyaWdodCAmJiBzdWJfcHJlZCA9PSBwcmVkICYmICFhc3NvYykKKyAgICAgIG9wLnRvX3Nhc3Mob3B0cykKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3RyZWUvc2VsZWN0b3IucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL3NlbGVjdG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODUyY2QKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL3NlbGVjdG9yLnJiCkBAIC0wLDAgKzEsMjYgQEAKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlRyZWUKKyAgIyBBIFNhc3NTY3JpcHQgbm9kZSB0aGF0IHdpbGwgcmVzb2x2ZSB0byB0aGUgY3VycmVudCBzZWxlY3Rvci4KKyAgY2xhc3MgU2VsZWN0b3IgPCBOb2RlCisgICAgZGVmIGluaXRpYWxpemU7IGVuZAorCisgICAgZGVmIGNoaWxkcmVuCisgICAgICBbXQorICAgIGVuZAorCisgICAgZGVmIHRvX3Nhc3Mob3B0cyA9IHt9KQorICAgICAgJyYnCisgICAgZW5kCisKKyAgICBkZWYgZGVlcF9jb3B5CisgICAgICBkdXAKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgZGVmIF9wZXJmb3JtKGVudmlyb25tZW50KQorICAgICAgc2VsZWN0b3IgPSBlbnZpcm9ubWVudC5zZWxlY3RvcgorICAgICAgcmV0dXJuIG9wdHMoU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVsbC5uZXcpIHVubGVzcyBzZWxlY3RvcgorICAgICAgb3B0cyhzZWxlY3Rvci50b19zYXNzX3NjcmlwdCkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3RyZWUvc3RyaW5nX2ludGVycG9sYXRpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL3N0cmluZ19pbnRlcnBvbGF0aW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzNjMzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL3N0cmluZ19pbnRlcnBvbGF0aW9uLnJiCkBAIC0wLDAgKzEsMTI1IEBACittb2R1bGUgU2Fzczo6U2NyaXB0OjpUcmVlCisgICMgQSBTYXNzU2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgYCN7fWAgaW50ZXJwb2xhdGlvbiB3aXRoaW4gYSBzdHJpbmcuCisgICMKKyAgIyBAc2VlIEludGVycG9sYXRpb24KKyAgY2xhc3MgU3RyaW5nSW50ZXJwb2xhdGlvbiA8IE5vZGUKKyAgICAjIEByZXR1cm4gW0xpdGVyYWxdIFRoZSBzdHJpbmcgbGl0ZXJhbCBiZWZvcmUgdGhpcyBpbnRlcnBvbGF0aW9uLgorICAgIGF0dHJfcmVhZGVyIDpiZWZvcmUKKworICAgICMgQHJldHVybiBbTm9kZV0gVGhlIFNhc3NTY3JpcHQgd2l0aGluIHRoZSBpbnRlcnBvbGF0aW9uCisgICAgYXR0cl9yZWFkZXIgOm1pZAorCisgICAgIyBAcmV0dXJuIFtTdHJpbmdJbnRlcnBvbGF0aW9uLCBMaXRlcmFsXQorICAgICMgICAgIFRoZSBzdHJpbmcgbGl0ZXJhbCBvciBzdHJpbmcgaW50ZXJwb2xhdGlvbiBiZWZvcmUgdGhpcyBpbnRlcnBvbGF0aW9uLgorICAgIGF0dHJfcmVhZGVyIDphZnRlcgorCisgICAgIyBXaGV0aGVyIHRoaXMgaXMgYSBDU1Mgc3RyaW5nIG9yIGEgQ1NTIGlkZW50aWZpZXIuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQKKyAgICAjIHN0cmluZ3MgYXJlIHdyaXR0ZW4gd2l0aCBkb3VibGUtcXVvdGVzLCB3aGlsZSBpZGVudGlmaWVycyBhcmVuJ3QuCisgICAgIworICAgICMgU3RyaW5nIGludGVycG9sYXRpb25zIGFyZSBvbmx5IGV2ZXIgaWRlbnRpZmllcnMgaWYgdGhleSdyZSBxdW90ZS1saWtlCisgICAgIyBmdW5jdGlvbnMgc3VjaCBhcyBgdXJsKClgLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N5bWJvbF0gYDpzdHJpbmdgIG9yIGA6aWRlbnRpZmllcmAKKyAgICBkZWYgdHlwZQorICAgICAgQGJlZm9yZS52YWx1ZS50eXBlCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIHF1b3RlIGNoYXJhY3RlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHdyYXAgYSBTYXNzCisgICAgIyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGludGVycG9sYXRpb24uCisgICAgZGVmIHF1b3RlCisgICAgICBxdW90ZV9mb3Ioc2VsZikgfHwgJyInCisgICAgZW5kCisKKyAgICAjIEludGVycG9sYXRpb24gaW4gYSBzdHJpbmcgaXMgb2YgdGhlIGZvcm0gYCJiZWZvcmUgI3ttaWR9IGFmdGVyImAsCisgICAgIyB3aGVyZSBgYmVmb3JlYCBhbmQgYGFmdGVyYCBtYXkgaW5jbHVkZSBtb3JlIGludGVycG9sYXRpb24uCisgICAgIworICAgICMgQHBhcmFtIGJlZm9yZSBbU3RyaW5nSW50ZXJwb2xhdGlvbiwgTGl0ZXJhbF0gU2VlIHtTdHJpbmdJbnRlcnBvbGF0aW9uI2JlZm9yZX0KKyAgICAjIEBwYXJhbSBtaWQgW05vZGVdIFNlZSB7U3RyaW5nSW50ZXJwb2xhdGlvbiNtaWR9CisgICAgIyBAcGFyYW0gYWZ0ZXIgW0xpdGVyYWxdIFNlZSB7U3RyaW5nSW50ZXJwb2xhdGlvbiNhZnRlcn0KKyAgICBkZWYgaW5pdGlhbGl6ZShiZWZvcmUsIG1pZCwgYWZ0ZXIpCisgICAgICBAYmVmb3JlID0gYmVmb3JlCisgICAgICBAbWlkID0gbWlkCisgICAgICBAYWZ0ZXIgPSBhZnRlcgorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIEEgaHVtYW4tcmVhZGFibGUgcy1leHByZXNzaW9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uCisgICAgZGVmIGluc3BlY3QKKyAgICAgICIoc3RyaW5nX2ludGVycG9sYXRpb24gI3tAYmVmb3JlLmluc3BlY3R9ICN7QG1pZC5pbnNwZWN0fSAje0BhZnRlci5pbnNwZWN0fSkiCisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSN0b19zYXNzCisgICAgZGVmIHRvX3Nhc3Mob3B0cyA9IHt9KQorICAgICAgcXVvdGUgPSB0eXBlID09IDpzdHJpbmcgPyBvcHRzWzpxdW90ZV0gfHwgcXVvdGVfZm9yKHNlbGYpIHx8ICciJyA6IDpub25lCisgICAgICBvcHRzID0gb3B0cy5tZXJnZSg6cXVvdGUgPT4gcXVvdGUpCisKKyAgICAgIHJlcyA9ICIiCisgICAgICByZXMgPDwgcXVvdGUgaWYgcXVvdGUgIT0gOm5vbmUKKyAgICAgIHJlcyA8PCBfdG9fc2FzcyhiZWZvcmUsIG9wdHMpCisgICAgICByZXMgPDwgJyN7JyA8PCBAbWlkLnRvX3Nhc3Mob3B0cy5tZXJnZSg6cXVvdGUgPT4gbmlsKSkgPDwgJ30nCisgICAgICByZXMgPDwgX3RvX3Nhc3MoYWZ0ZXIsIG9wdHMpCisgICAgICByZXMgPDwgcXVvdGUgaWYgcXVvdGUgIT0gOm5vbmUKKyAgICAgIHJlcworICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSB0aHJlZSBjb21wb25lbnRzIG9mIHRoZSBpbnRlcnBvbGF0aW9uLCBgYmVmb3JlYCwgYG1pZGAsIGFuZCBgYWZ0ZXJgLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PE5vZGU+XQorICAgICMgQHNlZSAjaW5pdGlhbGl6ZQorICAgICMgQHNlZSBOb2RlI2NoaWxkcmVuCisgICAgZGVmIGNoaWxkcmVuCisgICAgICBbQGJlZm9yZSwgQG1pZCwgQGFmdGVyXS5jb21wYWN0CisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSNkZWVwX2NvcHkKKyAgICBkZWYgZGVlcF9jb3B5CisgICAgICBub2RlID0gZHVwCisgICAgICBub2RlLmluc3RhbmNlX3ZhcmlhYmxlX3NldCgnQGJlZm9yZScsIEBiZWZvcmUuZGVlcF9jb3B5KSBpZiBAYmVmb3JlCisgICAgICBub2RlLmluc3RhbmNlX3ZhcmlhYmxlX3NldCgnQG1pZCcsIEBtaWQuZGVlcF9jb3B5KQorICAgICAgbm9kZS5pbnN0YW5jZV92YXJpYWJsZV9zZXQoJ0BhZnRlcicsIEBhZnRlci5kZWVwX2NvcHkpIGlmIEBhZnRlcgorICAgICAgbm9kZQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICAjIEV2YWx1YXRlcyB0aGUgaW50ZXJwb2xhdGlvbi4KKyAgICAjCisgICAgIyBAcGFyYW0gZW52aXJvbm1lbnQgW1Nhc3M6OkVudmlyb25tZW50XSBUaGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggdG8gZXZhbHVhdGUgdGhlIFNhc3NTY3JpcHQKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10KKyAgICAjICAgVGhlIFNhc3NTY3JpcHQgc3RyaW5nIHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSBpbnRlcnBvbGF0aW9uCisgICAgZGVmIF9wZXJmb3JtKGVudmlyb25tZW50KQorICAgICAgcmVzID0gIiIKKyAgICAgIGJlZm9yZSA9IEBiZWZvcmUucGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIHJlcyA8PCBiZWZvcmUudmFsdWUKKyAgICAgIG1pZCA9IEBtaWQucGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIHJlcyA8PCAobWlkLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZykgPyBtaWQudmFsdWUgOiBtaWQudG9fcyg6cXVvdGUgPT4gOm5vbmUpKQorICAgICAgcmVzIDw8IEBhZnRlci5wZXJmb3JtKGVudmlyb25tZW50KS52YWx1ZQorICAgICAgb3B0cyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KHJlcywgYmVmb3JlLnR5cGUpKQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIF90b19zYXNzKHN0cmluZ19vcl9pbnRlcnAsIG9wdHMpCisgICAgICByZXN1bHQgPSBzdHJpbmdfb3JfaW50ZXJwLnRvX3Nhc3Mob3B0cykKKyAgICAgIG9wdHNbOnF1b3RlXSA9PSA6bm9uZSA/IHJlc3VsdCA6IHJlc3VsdC5zbGljZSgxLi4uLTEpCisgICAgZW5kCisKKyAgICBkZWYgcXVvdGVfZm9yKHN0cmluZ19vcl9pbnRlcnApCisgICAgICBpZiBzdHJpbmdfb3JfaW50ZXJwLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6TGl0ZXJhbCkKKyAgICAgICAgcmV0dXJuIG5pbCBpZiBzdHJpbmdfb3JfaW50ZXJwLnZhbHVlLnZhbHVlLmVtcHR5PworICAgICAgICByZXR1cm4gJyInIGlmIHN0cmluZ19vcl9pbnRlcnAudmFsdWUudmFsdWUuaW5jbHVkZT8oIiciKQorICAgICAgICByZXR1cm4gIiciIGlmIHN0cmluZ19vcl9pbnRlcnAudmFsdWUudmFsdWUuaW5jbHVkZT8oJyInKQorICAgICAgICByZXR1cm4gbmlsCisgICAgICBlbmQKKworICAgICAgIyBEb3VibGUtcXVvdGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHNpbmdsZSBxdW90ZXMuCisgICAgICBiZWZvcmVfcXVvdGUgPSBxdW90ZV9mb3Ioc3RyaW5nX29yX2ludGVycC5iZWZvcmUpCisgICAgICByZXR1cm4gJyInIGlmIGJlZm9yZV9xdW90ZSA9PSAnIicKKyAgICAgIGFmdGVyX3F1b3RlID0gcXVvdGVfZm9yKHN0cmluZ19vcl9pbnRlcnAuYWZ0ZXIpCisgICAgICByZXR1cm4gJyInIGlmIGFmdGVyX3F1b3RlID09ICciJworCisgICAgICAjIFJldHVybnMgIiciIGlmIGVpdGhlciBvciBib3RoIGluc2lzdCBvbiBzaW5nbGUgcXVvdGVzLCBhbmQgbmlsCisgICAgICAjIG90aGVyd2lzZS4KKyAgICAgIGJlZm9yZV9xdW90ZSB8fCBhZnRlcl9xdW90ZQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS91bmFyeV9vcGVyYXRpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL3VuYXJ5X29wZXJhdGlvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJkYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS91bmFyeV9vcGVyYXRpb24ucmIKQEAgLTAsMCArMSw2OSBAQAorbW9kdWxlIFNhc3M6OlNjcmlwdDo6VHJlZQorICAjIEEgU2Fzc1NjcmlwdCBwYXJzZSBub2RlIHJlcHJlc2VudGluZyBhIHVuYXJ5IG9wZXJhdGlvbiwKKyAgIyBzdWNoIGFzIGAtJGJgIG9yIGBub3QgdHJ1ZWAuCisgICMKKyAgIyBDdXJyZW50bHkgb25seSBgLWAsIGAvYCwgYW5kIGBub3RgIGFyZSB1bmFyeSBvcGVyYXRvcnMuCisgIGNsYXNzIFVuYXJ5T3BlcmF0aW9uIDwgTm9kZQorICAgICMgQHJldHVybiBbU3ltYm9sXSBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0KKyAgICBhdHRyX3JlYWRlciA6b3BlcmF0b3IKKworICAgICMgQHJldHVybiBbU2NyaXB0OjpOb2RlXSBUaGUgcGFyc2UtdHJlZSBub2RlIGZvciB0aGUgb2JqZWN0IG9mIHRoZSBvcGVyYXRvcgorICAgIGF0dHJfcmVhZGVyIDpvcGVyYW5kCisKKyAgICAjIEBwYXJhbSBvcGVyYW5kIFtTY3JpcHQ6Ok5vZGVdIFNlZSBceyNvcGVyYW5kfQorICAgICMgQHBhcmFtIG9wZXJhdG9yIFtTeW1ib2xdIFNlZSBceyNvcGVyYXRvcn0KKyAgICBkZWYgaW5pdGlhbGl6ZShvcGVyYW5kLCBvcGVyYXRvcikKKyAgICAgIEBvcGVyYW5kID0gb3BlcmFuZAorICAgICAgQG9wZXJhdG9yID0gb3BlcmF0b3IKKyAgICAgIHN1cGVyKCkKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbU3RyaW5nXSBBIGh1bWFuLXJlYWRhYmxlIHMtZXhwcmVzc2lvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3BlcmF0aW9uCisgICAgZGVmIGluc3BlY3QKKyAgICAgICIoI3tAb3BlcmF0b3IuaW5zcGVjdH0gI3tAb3BlcmFuZC5pbnNwZWN0fSkiCisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSN0b19zYXNzCisgICAgZGVmIHRvX3Nhc3Mob3B0cyA9IHt9KQorICAgICAgb3BlcmFuZCA9IEBvcGVyYW5kLnRvX3Nhc3Mob3B0cykKKyAgICAgIGlmIEBvcGVyYW5kLmlzX2E/KE9wZXJhdGlvbikgfHwKKyAgICAgICAgICAoQG9wZXJhdG9yID09IDptaW51cyAmJgorICAgICAgICAgICAob3BlcmFuZCA9fiBTYXNzOjpTQ1NTOjpSWDo6SURFTlQpID09IDApCisgICAgICAgIG9wZXJhbmQgPSAiKCN7QG9wZXJhbmQudG9fc2FzcyhvcHRzKX0pIgorICAgICAgZW5kCisgICAgICBvcCA9IFNhc3M6OlNjcmlwdDo6TGV4ZXI6Ok9QRVJBVE9SU19SRVZFUlNFW0BvcGVyYXRvcl0KKyAgICAgIG9wICsgKG9wID1+IC9bYS16XS8gPyAiICIgOiAiIikgKyBvcGVyYW5kCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIG9wZXJhbmQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxOb2RlPl0KKyAgICAjIEBzZWUgTm9kZSNjaGlsZHJlbgorICAgIGRlZiBjaGlsZHJlbgorICAgICAgW0BvcGVyYW5kXQorICAgIGVuZAorCisgICAgIyBAc2VlIE5vZGUjZGVlcF9jb3B5CisgICAgZGVmIGRlZXBfY29weQorICAgICAgbm9kZSA9IGR1cAorICAgICAgbm9kZS5pbnN0YW5jZV92YXJpYWJsZV9zZXQoJ0BvcGVyYW5kJywgQG9wZXJhbmQuZGVlcF9jb3B5KQorICAgICAgbm9kZQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICAjIEV2YWx1YXRlcyB0aGUgb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBlbnZpcm9ubWVudCBbU2Fzczo6RW52aXJvbm1lbnRdIFRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0byBldmFsdWF0ZSB0aGUgU2Fzc1NjcmlwdAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZV0gVGhlIFNhc3NTY3JpcHQgb2JqZWN0IHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSBvcGVyYXRpb24KKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZSBvcGVyYXRpb24gaXMgdW5kZWZpbmVkIGZvciB0aGUgb3BlcmFuZAorICAgIGRlZiBfcGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIG9wZXJhdG9yID0gInVuYXJ5XyN7QG9wZXJhdG9yfSIKKyAgICAgIHZhbHVlID0gQG9wZXJhbmQucGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIHZhbHVlLnNlbmQob3BlcmF0b3IpCisgICAgcmVzY3VlIE5vTWV0aG9kRXJyb3IgPT4gZQorICAgICAgcmFpc2UgZSB1bmxlc3MgZS5uYW1lLnRvX3MgPT0gb3BlcmF0b3IudG9fcworICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCJVbmRlZmluZWQgdW5hcnkgb3BlcmF0aW9uOiBcIiN7QG9wZXJhdG9yfSAje3ZhbHVlfVwiLiIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC90cmVlL3ZhcmlhYmxlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS92YXJpYWJsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE5NzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdHJlZS92YXJpYWJsZS5yYgpAQCAtMCwwICsxLDU3IEBACittb2R1bGUgU2Fzczo6U2NyaXB0OjpUcmVlCisgICMgQSBTYXNzU2NyaXB0IHBhcnNlIG5vZGUgcmVwcmVzZW50aW5nIGEgdmFyaWFibGUuCisgIGNsYXNzIFZhcmlhYmxlIDwgTm9kZQorICAgICMgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX3JlYWRlciA6bmFtZQorCisgICAgIyBUaGUgdW5kZXJzY29yZWQgbmFtZSBvZiB0aGUgdmFyaWFibGUuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfcmVhZGVyIDp1bmRlcnNjb3JlZF9uYW1lCisKKyAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFNlZSBceyNuYW1lfQorICAgIGRlZiBpbml0aWFsaXplKG5hbWUpCisgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgIEB1bmRlcnNjb3JlZF9uYW1lID0gbmFtZS50cigiLSIsICJfIikKKyAgICAgIHN1cGVyKCkKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbU3RyaW5nXSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFyaWFibGUKKyAgICBkZWYgaW5zcGVjdChvcHRzID0ge30pCisgICAgICAiJCN7ZGFzaGVyaXplKG5hbWUsIG9wdHMpfSIKKyAgICBlbmQKKyAgICBhbGlhc19tZXRob2QgOnRvX3Nhc3MsIDppbnNwZWN0CisKKyAgICAjIFJldHVybnMgYW4gZW1wdHkgYXJyYXkuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXk8Tm9kZT5dIGVtcHR5CisgICAgIyBAc2VlIE5vZGUjY2hpbGRyZW4KKyAgICBkZWYgY2hpbGRyZW4KKyAgICAgIFtdCisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSNkZWVwX2NvcHkKKyAgICBkZWYgZGVlcF9jb3B5CisgICAgICBkdXAKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgIyBFdmFsdWF0ZXMgdGhlIHZhcmlhYmxlLgorICAgICMKKyAgICAjIEBwYXJhbSBlbnZpcm9ubWVudCBbU2Fzczo6RW52aXJvbm1lbnRdIFRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0byBldmFsdWF0ZSB0aGUgU2Fzc1NjcmlwdAorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZV0gVGhlIFNhc3NTY3JpcHQgb2JqZWN0IHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZQorICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgdGhlIHZhcmlhYmxlIGlzIHVuZGVmaW5lZAorICAgIGRlZiBfcGVyZm9ybShlbnZpcm9ubWVudCkKKyAgICAgIHZhbCA9IGVudmlyb25tZW50LnZhcihuYW1lKQorICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCJVbmRlZmluZWQgdmFyaWFibGU6IFwiJCN7bmFtZX1cIi4iKSB1bmxlc3MgdmFsCisgICAgICBpZiB2YWwuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKSAmJiB2YWwub3JpZ2luYWwKKyAgICAgICAgdmFsID0gdmFsLmR1cAorICAgICAgICB2YWwub3JpZ2luYWwgPSBuaWwKKyAgICAgIGVuZAorICAgICAgdmFsCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzVkNjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS5yYgpAQCAtMCwwICsxLDEzIEBACittb2R1bGUgU2Fzczo6U2NyaXB0OjpWYWx1ZTsgZW5kCisKK3JlcXVpcmUgJ3Nhc3Mvc2NyaXB0L3ZhbHVlL2Jhc2UnCityZXF1aXJlICdzYXNzL3NjcmlwdC92YWx1ZS9zdHJpbmcnCityZXF1aXJlICdzYXNzL3NjcmlwdC92YWx1ZS9udW1iZXInCityZXF1aXJlICdzYXNzL3NjcmlwdC92YWx1ZS9jb2xvcicKK3JlcXVpcmUgJ3Nhc3Mvc2NyaXB0L3ZhbHVlL2Jvb2wnCityZXF1aXJlICdzYXNzL3NjcmlwdC92YWx1ZS9udWxsJworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdmFsdWUvbGlzdCcKK3JlcXVpcmUgJ3Nhc3Mvc2NyaXB0L3ZhbHVlL2FyZ19saXN0JworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdmFsdWUvbWFwJworcmVxdWlyZSAnc2Fzcy9zY3JpcHQvdmFsdWUvY2FsbGFibGUnCityZXF1aXJlICdzYXNzL3NjcmlwdC92YWx1ZS9mdW5jdGlvbicKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL2FyZ19saXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvYXJnX2xpc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4ZDc5NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL2FyZ19saXN0LnJiCkBAIC0wLDAgKzEsMzYgQEAKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlZhbHVlCisgICMgQSBTYXNzU2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgYSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LiBUaGlzIHdvcmtzIGp1c3QKKyAgIyBsaWtlIGEgbm9ybWFsIGxpc3QsIGJ1dCBjYW4gYWxzbyBjb250YWluIGtleXdvcmQgYXJndW1lbnRzLgorICAjCisgICMgVGhlIGtleXdvcmQgYXJndW1lbnRzIGF0dGFjaGVkIHRvIHRoaXMgbGlzdCBhcmUgdW51c2VkIGV4Y2VwdCB3aGVuIHRoaXMgaXMKKyAgIyBwYXNzZWQgYXMgYSBnbG9iIGFyZ3VtZW50IHRvIGEgZnVuY3Rpb24gb3IgbWl4aW4uCisgIGNsYXNzIEFyZ0xpc3QgPCBMaXN0CisgICAgIyBXaGV0aGVyIFx7I2tleXdvcmRzfSBoYXMgYmVlbiBhY2Nlc3NlZC4gSWYgc28sIHdlIGFzc3VtZSB0aGF0IGFsbCBrZXl3b3JkcworICAgICMgd2VyZSB2YWxpZCBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlZCB0aGlzIEFyZ0xpc3QuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBhdHRyX2FjY2Vzc29yIDprZXl3b3Jkc19hY2Nlc3NlZAorCisgICAgIyBDcmVhdGVzIGEgbmV3IGFyZ3VtZW50IGxpc3QuCisgICAgIworICAgICMgQHBhcmFtIHZhbHVlIFtBcnJheTxWYWx1ZT5dIFNlZSBce0xpc3QjdmFsdWV9LgorICAgICMgQHBhcmFtIGtleXdvcmRzIFtIYXNoPFN0cmluZywgVmFsdWU+LCBOb3JtYWxpemVkTWFwPFZhbHVlPl0gU2VlIFx7I2tleXdvcmRzfQorICAgICMgQHBhcmFtIHNlcGFyYXRvciBbU3RyaW5nXSBTZWUgXHtMaXN0I3NlcGFyYXRvcn0uCisgICAgZGVmIGluaXRpYWxpemUodmFsdWUsIGtleXdvcmRzLCBzZXBhcmF0b3IpCisgICAgICBzdXBlcih2YWx1ZSwgc2VwYXJhdG9yOiBzZXBhcmF0b3IpCisgICAgICBpZiBrZXl3b3Jkcy5pc19hPyhTYXNzOjpVdGlsOjpOb3JtYWxpemVkTWFwKQorICAgICAgICBAa2V5d29yZHMgPSBrZXl3b3JkcworICAgICAgZWxzZQorICAgICAgICBAa2V5d29yZHMgPSBTYXNzOjpVdGlsOjpOb3JtYWxpemVkTWFwLm5ldyhrZXl3b3JkcykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUga2V5d29yZCBhcmd1bWVudHMgYXR0YWNoZWQgdG8gdGhpcyBsaXN0LgorICAgICMKKyAgICAjIEByZXR1cm4gW05vcm1hbGl6ZWRNYXA8VmFsdWU+XQorICAgIGRlZiBrZXl3b3JkcworICAgICAgQGtleXdvcmRzX2FjY2Vzc2VkID0gdHJ1ZQorICAgICAgQGtleXdvcmRzCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9iYXNlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvYmFzZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTk2MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvYmFzZS5yYgpAQCAtMCwwICsxLDI1OCBAQAorbW9kdWxlIFNhc3M6OlNjcmlwdDo6VmFsdWUKKyAgIyBUaGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgU2Fzc1NjcmlwdCBvYmplY3RzLgorICAjCisgICMgTWFueSBvZiB0aGVzZSBtZXRob2RzLCBlc3BlY2lhbGx5IHRoZSBvbmVzIHRoYXQgY29ycmVzcG9uZCB0byBTYXNzU2NyaXB0IG9wZXJhdGlvbnMsCisgICMgYXJlIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB3aGljaCBtYXkgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgc29tZXdoYXQuCisgICMgVGhlIG9wZXJhdGlvbnMgbGlzdGVkIGhlcmUgYXJlIGp1c3QgdGhlIGRlZmF1bHRzLgorICBjbGFzcyBCYXNlCisgICAgIyBSZXR1cm5zIHRoZSBSdWJ5IHZhbHVlIG9mIHRoZSB2YWx1ZS4KKyAgICAjIFRoZSB0eXBlIG9mIHRoaXMgdmFsdWUgdmFyaWVzIGJhc2VkIG9uIHRoZSBzdWJjbGFzcy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtPYmplY3RdCisgICAgYXR0cl9yZWFkZXIgOnZhbHVlCisKKyAgICAjIFRoZSBzb3VyY2UgcmFuZ2UgaW4gdGhlIGRvY3VtZW50IG9uIHdoaWNoIHRoaXMgbm9kZSBhcHBlYXJlZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTb3VyY2U6OlJhbmdlXQorICAgIGF0dHJfYWNjZXNzb3IgOnNvdXJjZV9yYW5nZQorCisgICAgIyBDcmVhdGVzIGEgbmV3IHZhbHVlLgorICAgICMKKyAgICAjIEBwYXJhbSB2YWx1ZSBbT2JqZWN0XSBUaGUgb2JqZWN0IGZvciBceyN2YWx1ZX0KKyAgICBkZWYgaW5pdGlhbGl6ZSh2YWx1ZSA9IG5pbCkKKyAgICAgIHZhbHVlLmZyZWV6ZSB1bmxlc3MgdmFsdWUubmlsPyB8fCB2YWx1ZSA9PSB0cnVlIHx8IHZhbHVlID09IGZhbHNlCisgICAgICBAdmFsdWUgPSB2YWx1ZQorICAgICAgQG9wdGlvbnMgPSBuaWwKKyAgICBlbmQKKworICAgICMgU2V0cyB0aGUgb3B0aW9ucyBoYXNoIGZvciB0aGlzIG5vZGUsCisgICAgIyBhcyB3ZWxsIGFzIGZvciBhbGwgY2hpbGQgbm9kZXMuCisgICAgIyBTZWUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjT3B0aW9ucyB0aGUgU2FzcyBvcHRpb25zIGRvY3VtZW50YXRpb259LgorICAgICMKKyAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIFRoZSBvcHRpb25zCisgICAgYXR0cl93cml0ZXIgOm9wdGlvbnMKKworICAgICMgUmV0dXJucyB0aGUgb3B0aW9ucyBoYXNoIGZvciB0aGlzIG5vZGUuCisgICAgIworICAgICMgQHJldHVybiBbe1N5bWJvbCA9PiBPYmplY3R9XQorICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgdGhlIG9wdGlvbnMgaGFzaCBoYXNuJ3QgYmVlbiBzZXQuCisgICAgIyAgIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gdGhlIHZhbHVlIHdhcyBjcmVhdGVkCisgICAgIyAgIG91dHNpZGUgb2YgdGhlIHBhcnNlciBhbmQgXHsjdG9cX3N9IHdhcyBjYWxsZWQgb24gaXQKKyAgICBkZWYgb3B0aW9ucworICAgICAgcmV0dXJuIEBvcHRpb25zIGlmIEBvcHRpb25zCisgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoPDxNU0cpCitUaGUgI29wdGlvbnMgYXR0cmlidXRlIGlzIG5vdCBzZXQgb24gdGhpcyAje3NlbGYuY2xhc3N9LgorICBUaGlzIGVycm9yIGlzIHByb2JhYmx5IG9jY3VycmluZyBiZWNhdXNlICN0b19zIHdhcyBjYWxsZWQKKyAgb24gdGhpcyB2YWx1ZSB3aXRoaW4gYSBjdXN0b20gU2FzcyBmdW5jdGlvbiB3aXRob3V0IGZpcnN0CisgIHNldHRpbmcgdGhlICNvcHRpb25zIGF0dHJpYnV0ZS4KK01TRworICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgPT1gIG9wZXJhdGlvbi4KKyAgICAjICoqTm90ZSB0aGF0IHRoaXMgcmV0dXJucyBhIHtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sfSBvYmplY3QsCisgICAgIyBub3QgYSBSdWJ5IGJvb2xlYW4qKi4KKyAgICAjCisgICAgIyBAcGFyYW0gb3RoZXIgW1ZhbHVlXSBUaGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvcgorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbF0gVHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvdGhlciwKKyAgICAjICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgZGVmIGVxKG90aGVyKQorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbC5uZXcoc2VsZi5jbGFzcyA9PSBvdGhlci5jbGFzcyAmJiB2YWx1ZSA9PSBvdGhlci52YWx1ZSkKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYCE9YCBvcGVyYXRpb24uCisgICAgIyAqKk5vdGUgdGhhdCB0aGlzIHJldHVybnMgYSB7U2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbH0gb2JqZWN0LAorICAgICMgbm90IGEgUnVieSBib29sZWFuKiouCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtWYWx1ZV0gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2xdIEZhbHNlIGlmIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG90aGVyLAorICAgICMgICB0cnVlIG90aGVyd2lzZQorICAgIGRlZiBuZXEob3RoZXIpCisgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sLm5ldyghZXEob3RoZXIpLnRvX2Jvb2wpCisgICAgZW5kCisKKyAgICAjIFRoZSBTYXNzU2NyaXB0IGA9PWAgb3BlcmF0aW9uLgorICAgICMgKipOb3RlIHRoYXQgdGhpcyByZXR1cm5zIGEge1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2x9IG9iamVjdCwKKyAgICAjIG5vdCBhIFJ1YnkgYm9vbGVhbioqLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sXSBUcnVlIGlmIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG90aGVyLAorICAgICMgICBmYWxzZSBvdGhlcndpc2UKKyAgICBkZWYgdW5hcnlfbm90CisgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sLm5ldyghdG9fYm9vbCkKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYD1gIG9wZXJhdGlvbgorICAgICMgKHVzZWQgZm9yIHByb3ByaWV0YXJ5IE1TIHN5bnRheCBsaWtlIGBhbHBoYShvcGFjaXR5PTIwKWApLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlZhbHVlOjpTdHJpbmddIEEgc3RyaW5nIGNvbnRhaW5pbmcgYm90aCB2YWx1ZXMKKyAgICAjICAgc2VwYXJhdGVkIGJ5IGAiPSJgCisgICAgZGVmIHNpbmdsZV9lcShvdGhlcikKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIiN7c2VsZn09I3tvdGhlcn0iKQorICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgK2Agb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlZhbHVlOjpTdHJpbmddIEEgc3RyaW5nIGNvbnRhaW5pbmcgYm90aCB2YWx1ZXMKKyAgICAjICAgd2l0aG91dCBhbnkgc2VwYXJhdGlvbgorICAgIGRlZiBwbHVzKG90aGVyKQorICAgICAgdHlwZSA9IG90aGVyLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZykgPyBvdGhlci50eXBlIDogOmlkZW50aWZpZXIKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcodG9fcyg6cXVvdGUgPT4gOm5vbmUpICsgb3RoZXIudG9fcyg6cXVvdGUgPT4gOm5vbmUpLCB0eXBlKQorICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgLWAgb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlZhbHVlOjpTdHJpbmddIEEgc3RyaW5nIGNvbnRhaW5pbmcgYm90aCB2YWx1ZXMKKyAgICAjICAgc2VwYXJhdGVkIGJ5IGAiLSJgCisgICAgZGVmIG1pbnVzKG90aGVyKQorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygiI3tzZWxmfS0je290aGVyfSIpCisgICAgZW5kCisKKyAgICAjIFRoZSBTYXNzU2NyaXB0IGAvYCBvcGVyYXRpb24uCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtWYWx1ZV0gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAgICAjIEByZXR1cm4gW1NjcmlwdDo6VmFsdWU6OlN0cmluZ10gQSBzdHJpbmcgY29udGFpbmluZyBib3RoIHZhbHVlcworICAgICMgICBzZXBhcmF0ZWQgYnkgYCIvImAKKyAgICBkZWYgZGl2KG90aGVyKQorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygiI3tzZWxmfS8je290aGVyfSIpCisgICAgZW5kCisKKyAgICAjIFRoZSBTYXNzU2NyaXB0IHVuYXJ5IGArYCBvcGVyYXRpb24gKGUuZy4gYCskYWApLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlZhbHVlOjpTdHJpbmddIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHZhbHVlCisgICAgIyAgIHByZWNlZGVkIGJ5IGAiKyJgCisgICAgZGVmIHVuYXJ5X3BsdXMKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIisje3NlbGZ9IikKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgdW5hcnkgYC1gIG9wZXJhdGlvbiAoZS5nLiBgLSRhYCkuCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtWYWx1ZV0gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAgICAjIEByZXR1cm4gW1NjcmlwdDo6VmFsdWU6OlN0cmluZ10gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUKKyAgICAjICAgcHJlY2VkZWQgYnkgYCItImAKKyAgICBkZWYgdW5hcnlfbWludXMKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIi0je3NlbGZ9IikKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgdW5hcnkgYC9gIG9wZXJhdGlvbiAoZS5nLiBgLyRhYCkuCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtWYWx1ZV0gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAgICAjIEByZXR1cm4gW1NjcmlwdDo6VmFsdWU6OlN0cmluZ10gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUKKyAgICAjICAgcHJlY2VkZWQgYnkgYCIvImAKKyAgICBkZWYgdW5hcnlfZGl2CisgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KCIvI3tzZWxmfSIpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGlzIHZhbHVlLiBUd28gb2JqZWN0cycgaGFzaCBjb2RlcyBzaG91bGQgYmUKKyAgICAjIGVxdWFsIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtJbnRlZ2VyIGZvciBSdWJ5IDIuNC4wKywgRml4bnVtIGZvciBlYXJsaWVyIFJ1YnkgdmVyc2lvbnNdIFRoZSBoYXNoIGNvZGUuCisgICAgZGVmIGhhc2gKKyAgICAgIHZhbHVlLmhhc2gKKyAgICBlbmQKKworICAgIGRlZiBlcWw/KG90aGVyKQorICAgICAgc2VsZiA9PSBvdGhlcgorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIEEgcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlCisgICAgZGVmIGluc3BlY3QKKyAgICAgIHZhbHVlLmluc3BlY3QKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbQm9vbGVhbl0gYHRydWVgICh0aGUgUnVieSBib29sZWFuIHZhbHVlKQorICAgIGRlZiB0b19ib29sCisgICAgICB0cnVlCisgICAgZW5kCisKKyAgICAjIENvbXBhcmVzIHRoaXMgb2JqZWN0IHdpdGggYW5vdGhlci4KKyAgICAjCisgICAgIyBAcGFyYW0gb3RoZXIgW09iamVjdF0gVGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGgKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgb3Igbm90IHRoaXMgdmFsdWUgaXMgZXF1aXZhbGVudCB0byBgb3RoZXJgCisgICAgZGVmID09KG90aGVyKQorICAgICAgZXEob3RoZXIpLnRvX2Jvb2wKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbSW50ZWdlcl0gVGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyB2YWx1ZQorICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgdGhpcyB2YWx1ZSBpc24ndCBhbiBpbnRlZ2VyCisgICAgZGVmIHRvX2kKKyAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiI3tpbnNwZWN0fSBpcyBub3QgYW4gaW50ZWdlci4iKQorICAgIGVuZAorCisgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGlzIHZhbHVlIGlzbid0IGFuIGludGVnZXIKKyAgICBkZWYgYXNzZXJ0X2ludCE7IHRvX2k7IGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBzZXBhcmF0b3IgZm9yIHRoaXMgdmFsdWUuIEZvciBub24tbGlzdC1saWtlIHZhbHVlcyBvciB0aGUKKyAgICAjIGVtcHR5IGxpc3QsIHRoaXMgd2lsbCBiZSBgbmlsYC4gRm9yIGxpc3RzIG9yIG1hcHMsIGl0IHdpbGwgYmUgYDpzcGFjZWAgb3IKKyAgICAjIGA6Y29tbWFgLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N5bWJvbF0KKyAgICBkZWYgc2VwYXJhdG9yOyBuaWw7IGVuZAorCisgICAgIyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBzdXJyb3VuZGVkIGJ5IHNxdWFyZSBicmFja2V0cy4gRm9yIG5vbi1saXN0IHZhbHVlcywKKyAgICAjIHRoaXMgd2lsbCBiZSBgZmFsc2VgLgorICAgICMKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgZGVmIGJyYWNrZXRlZDsgZmFsc2U7IGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIHZhbHVlIGFzIGEgbGlzdC4KKyAgICAjIFNpbmdsZSB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgYXMgc2luZ2xlLWVsZW1lbnQgbGlzdHMuCisgICAgIworICAgICMgQHJldHVybiBbQXJyYXk8VmFsdWU+XSBUaGlzIHZhbHVlIGFzIGEgbGlzdAorICAgIGRlZiB0b19hCisgICAgICBbc2VsZl0KKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyB2YWx1ZSBhcyBhIGhhc2guIE1vc3QgdmFsdWVzIGRvbid0IGhhdmUgaGFzaAorICAgICMgcmVwcmVzZW50YXRpb25zLCBidXQgW01hcF1zIGFuZCBlbXB0eSBbTGlzdF1zIGRvLgorICAgICMKKyAgICAjIEByZXR1cm4gW0hhc2g8VmFsdWUsIFZhbHVlPl0gVGhpcyB2YWx1ZSBhcyBhIGhhc2gKKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoaXMgdmFsdWUgZG9lc24ndCBoYXZlIGEgaGFzaCByZXByZXNlbnRhdGlvbgorICAgIGRlZiB0b19oCisgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIiN7aW5zcGVjdH0gaXMgbm90IGEgbWFwLiIpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlCisgICAgIyBhcyBpdCB3b3VsZCBiZSBvdXRwdXQgdG8gdGhlIENTUyBkb2N1bWVudC4KKyAgICAjCisgICAgIyBAb3B0aW9ucyBvcHRzIDpxdW90ZSBbU3RyaW5nXQorICAgICMgICBUaGUgcHJlZmVycmVkIHF1b3RlIHN0eWxlIGZvciBxdW90ZWQgc3RyaW5ncy4gSWYgYDpub25lYCwgc3RyaW5ncyBhcmUKKyAgICAjICAgYWx3YXlzIGVtaXR0ZWQgdW5xdW90ZWQuCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgZGVmIHRvX3Mob3B0cyA9IHt9KQorICAgICAgU2Fzczo6VXRpbC5hYnN0cmFjdChzZWxmKQorICAgIGVuZAorICAgIGFsaWFzX21ldGhvZCA6dG9fc2FzcywgOnRvX3MKKworICAgICMgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIG9iamVjdCBpcyBudWxsLgorICAgICMKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIGBmYWxzZWAKKyAgICBkZWYgbnVsbD8KKyAgICAgIGZhbHNlCisgICAgZW5kCisKKyAgICAjIENyZWF0ZXMgYSBuZXcgbGlzdCBjb250YWluaW5nIGBjb250ZW50c2AgYnV0IHdpdGggdGhlIHNhbWUgYnJhY2tldHMgYW5kCisgICAgIyBzZXBhcmF0b3JzIGFzIHRoaXMgb2JqZWN0LCB3aGVuIGludGVycHJldGVkIGFzIGEgbGlzdC4KKyAgICAjCisgICAgIyBAcGFyYW0gY29udGVudHMgW0FycmF5PFZhbHVlPl0gVGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcgbGlzdC4KKyAgICAjIEBwYXJhbSBzZXBhcmF0b3IgW1N5bWJvbF0gVGhlIHNlcGFyYXRvciBvZiB0aGUgbmV3IGxpc3QuIERlZmF1bHRzIHRvIFx7I3NlcGFyYXRvcn0uCisgICAgIyBAcGFyYW0gYnJhY2tldGVkIFtCb29sZWFuXSBXaGV0aGVyIHRoZSBuZXcgbGlzdCBpcyBicmFja2V0ZWQuIERlZmF1bHRzIHRvIFx7I2JyYWNrZXRlZH0uCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XQorICAgIGRlZiB3aXRoX2NvbnRlbnRzKGNvbnRlbnRzLCBzZXBhcmF0b3I6IHNlbGYuc2VwYXJhdG9yLCBicmFja2V0ZWQ6IHNlbGYuYnJhY2tldGVkKQorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdC5uZXcoY29udGVudHMsIHNlcGFyYXRvcjogc2VwYXJhdG9yLCBicmFja2V0ZWQ6IGJyYWNrZXRlZCkKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgIyBFdmFsdWF0ZXMgdGhlIHZhbHVlLgorICAgICMKKyAgICAjIEBwYXJhbSBlbnZpcm9ubWVudCBbU2Fzczo6RW52aXJvbm1lbnRdIFRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0byBldmFsdWF0ZSB0aGUgU2Fzc1NjcmlwdAorICAgICMgQHJldHVybiBbVmFsdWVdIFRoaXMgdmFsdWUKKyAgICBkZWYgX3BlcmZvcm0oZW52aXJvbm1lbnQpCisgICAgICBzZWxmCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9ib29sLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvYm9vbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE3ODliCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvYm9vbC5yYgpAQCAtMCwwICsxLDM1IEBACittb2R1bGUgU2Fzczo6U2NyaXB0OjpWYWx1ZQorICAjIEEgU2Fzc1NjcmlwdCBvYmplY3QgcmVwcmVzZW50aW5nIGEgYm9vbGVhbiAodHJ1ZSBvciBmYWxzZSkgdmFsdWUuCisgIGNsYXNzIEJvb2wgPCBCYXNlCisgICAgIyBUaGUgdHJ1ZSB2YWx1ZSBpbiBTYXNzU2NyaXB0LgorICAgICMKKyAgICAjIFRoaXMgaXMgYXNzaWduZWQgYmVmb3JlIG5ldyBpcyBvdmVycmlkZGVuIGJlbG93IHNvIHRoYXQgd2UgdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICAgIFRSVUUgID0gbmV3KHRydWUpCisKKyAgICAjIFRoZSBmYWxzZSB2YWx1ZSBpbiBTYXNzU2NyaXB0LgorICAgICMKKyAgICAjIFRoaXMgaXMgYXNzaWduZWQgYmVmb3JlIG5ldyBpcyBvdmVycmlkZGVuIGJlbG93IHNvIHRoYXQgd2UgdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICAgIEZBTFNFID0gbmV3KGZhbHNlKQorCisgICAgIyBXZSBvdmVycmlkZSBvYmplY3QgY3JlYXRpb24gc28gdGhhdCB1c2VycyBvZiB0aGUgY29yZSBBUEkKKyAgICAjIHdpbGwgbm90IG5lZWQgdG8ga25vdyB0aGF0IGJvb2xlYW5zIGFyZSBzcGVjaWZpYyBjb25zdGFudHMuCisgICAgIworICAgICMgQHBhcmFtIHZhbHVlIEEgcnVieSB2YWx1ZSB0aGF0IHdpbGwgYmUgdGVzdGVkIGZvciB0cnV0aGluZXNzLgorICAgICMgQHJldHVybiBbQm9vbF0gVFJVRSBpZiB2YWx1ZSBpcyB0cnV0aHksIEZBTFNFIGlmIHZhbHVlIGlzIGZhbHNleQorICAgIGRlZiBzZWxmLm5ldyh2YWx1ZSkKKyAgICAgIHZhbHVlID8gVFJVRSA6IEZBTFNFCisgICAgZW5kCisKKyAgICAjIFRoZSBSdWJ5IHZhbHVlIG9mIHRoZSBib29sZWFuLgorICAgICMKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgYXR0cl9yZWFkZXIgOnZhbHVlCisgICAgYWxpYXNfbWV0aG9kIDp0b19ib29sLCA6dmFsdWUKKworICAgICMgQHJldHVybiBbU3RyaW5nXSAidHJ1ZSIgb3IgImZhbHNlIgorICAgIGRlZiB0b19zKG9wdHMgPSB7fSkKKyAgICAgIEB2YWx1ZS50b19zCisgICAgZW5kCisgICAgYWxpYXNfbWV0aG9kIDp0b19zYXNzLCA6dG9fcworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvY2FsbGFibGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9jYWxsYWJsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTEwZDBkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvY2FsbGFibGUucmIKQEAgLTAsMCArMSwyNSBAQAorbW9kdWxlIFNhc3M6OlNjcmlwdDo6VmFsdWUKKyAgIyBBIFNhc3NTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyBhIG51bGwgdmFsdWUuCisgIGNsYXNzIENhbGxhYmxlIDwgQmFzZQorICAgICMgQ29uc3RydWN0cyBhIENhbGxhYmxlIHZhbHVlIGZvciB1c2UgaW4gU2Fzc1NjcmlwdC4KKyAgICAjCisgICAgIyBAcGFyYW0gY2FsbGFibGUgW1Nhc3M6OkNhbGxhYmxlXSBUaGUgY2FsbGFibGUgdG8gYmUgdXNlZCB3aGVuIHRoZQorICAgICMgY2FsbGFibGUgaXMgY2FsbGVkLgorICAgIGRlZiBpbml0aWFsaXplKGNhbGxhYmxlKQorICAgICAgc3VwZXIoY2FsbGFibGUpCisgICAgZW5kCisKKyAgICBkZWYgdG9fcyhvcHRzID0ge30pCisgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIiN7dG9fc2Fzc30gaXNuJ3QgYSB2YWxpZCBDU1MgdmFsdWUuIikKKyAgICBlbmQKKworICAgIGRlZiBpbnNwZWN0CisgICAgICB0b19zYXNzCisgICAgZW5kCisKKyAgICAjIEBhYnN0cmFjdAorICAgIGRlZiB0b19zYXNzCisgICAgICBTYXNzOjpVdGlsLmFic3RyYWN0KHNlbGYpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9jb2xvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL2NvbG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YWJlODMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9jb2xvci5yYgpAQCAtMCwwICsxLDcwMyBAQAorbW9kdWxlIFNhc3M6OlNjcmlwdDo6VmFsdWUKKyAgIyBBIFNhc3NTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyBhIENTUyBjb2xvci4KKyAgIworICAjIEEgY29sb3IgbWF5IGJlIHJlcHJlc2VudGVkIGludGVybmFsbHkgYXMgUkdCQSwgSFNMQSwgb3IgYm90aC4KKyAgIyBJdCdzIG9yaWdpbmFsbHkgcmVwcmVzZW50ZWQgYXMgd2hhdGV2ZXIgaXRzIGlucHV0IGlzOworICAjIGlmIGl0J3MgY3JlYXRlZCB3aXRoIFJHQiB2YWx1ZXMsIGl0J3MgcmVwcmVzZW50ZWQgYXMgUkdCQSwKKyAgIyBhbmQgaWYgaXQncyBjcmVhdGVkIHdpdGggSFNMIHZhbHVlcywgaXQncyByZXByZXNlbnRlZCBhcyBIU0xBLgorICAjIE9uY2UgYSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCB0aGF0IHJlcXVpcmVzIHRoZSBvdGhlciByZXByZXNlbnRhdGlvbiAtLQorICAjIGZvciBleGFtcGxlLCBceyNyZWR9IGZvciBhbiBIU0wgY29sb3IgLS0KKyAgIyB0aGF0IGNvbXBvbmVudCBpcyBjYWxjdWxhdGVkIGFuZCBjYWNoZWQuCisgICMKKyAgIyBUaGUgYWxwaGEgY2hhbm5lbCBvZiBhIGNvbG9yIGlzIGluZGVwZW5kZW50IG9mIGl0cyBSR0Igb3IgSFNMIHJlcHJlc2VudGF0aW9uLgorICAjIEl0J3MgYWx3YXlzIHN0b3JlZCwgYXMgMSBpZiBub3RoaW5nIGVsc2UgaXMgc3BlY2lmaWVkLgorICAjIElmIG9ubHkgdGhlIGFscGhhIGNoYW5uZWwgaXMgbW9kaWZpZWQgdXNpbmcgXHsjd2l0aH0sCisgICMgdGhlIGNhY2hlZCBSR0IgYW5kIEhTTCB2YWx1ZXMgYXJlIHJldGFpbmVkLgorICBjbGFzcyBDb2xvciA8IEJhc2UKKyAgICAjIEBwcml2YXRlCisgICAgIworICAgICMgQ29udmVydCBhIHJ1YnkgaW50ZWdlciB0byBhIHJnYmEgY29tcG9uZW50cworICAgICMgQHBhcmFtIGNvbG9yIFtJbnRlZ2VyXQorICAgICMgQHJldHVybiBbQXJyYXk8SW50ZWdlcj5dIEFycmF5IG9mIDQgbnVtYmVycyByZXByZXNlbnRpbmcgcixnLGIgYW5kIGFscGhhCisgICAgZGVmIHNlbGYuaW50X3RvX3JnYmEoY29sb3IpCisgICAgICByZ2JhID0gKDAuLjMpLm1hcCB7fG58IGNvbG9yID4+IChuIDw8IDMpICYgMHhmZn0ucmV2ZXJzZQorICAgICAgcmdiYVstMV0gPSByZ2JhWy0xXSAvIDI1NS4wCisgICAgICByZ2JhCisgICAgZW5kCisKKyAgICBBTFRFUk5BVEVfQ09MT1JfTkFNRVMgPSBTYXNzOjpVdGlsLm1hcF92YWxzKAorICAgICAgeworICAgICAgICAnYXF1YScgICAgICAgICAgICAgICAgID0+IDB4MDBGRkZGRkYsCisgICAgICAgICdkYXJrZ3JleScgICAgICAgICAgICAgPT4gMHhBOUE5QTlGRiwKKyAgICAgICAgJ2RhcmtzbGF0ZWdyZXknICAgICAgICA9PiAweDJGNEY0RkZGLAorICAgICAgICAnZGltZ3JleScgICAgICAgICAgICAgID0+IDB4Njk2OTY5RkYsCisgICAgICAgICdmdWNoc2lhJyAgICAgICAgICAgICAgPT4gMHhGRjAwRkZGRiwKKyAgICAgICAgJ2dyZXknICAgICAgICAgICAgICAgICA9PiAweDgwODA4MEZGLAorICAgICAgICAnbGlnaHRncmV5JyAgICAgICAgICAgID0+IDB4RDNEM0QzRkYsCisgICAgICAgICdsaWdodHNsYXRlZ3JleScgICAgICAgPT4gMHg3Nzg4OTlGRiwKKyAgICAgICAgJ3NsYXRlZ3JleScgICAgICAgICAgICA9PiAweDcwODA5MEZGLAorICAgICAgfSwgJm1ldGhvZCg6aW50X3RvX3JnYmEpKQorCisgICAgIyBBIGhhc2ggZnJvbSBjb2xvciBuYW1lcyB0byBgW3JlZCwgZ3JlZW4sIGJsdWVdYCB2YWx1ZSBhcnJheXMuCisgICAgQ09MT1JfTkFNRVMgPSBTYXNzOjpVdGlsLm1hcF92YWxzKAorICAgICAgeworICAgICAgICAnYWxpY2VibHVlJyAgICAgICAgICAgID0+IDB4RjBGOEZGRkYsCisgICAgICAgICdhbnRpcXVld2hpdGUnICAgICAgICAgPT4gMHhGQUVCRDdGRiwKKyAgICAgICAgJ2FxdWFtYXJpbmUnICAgICAgICAgICA9PiAweDdGRkZENEZGLAorICAgICAgICAnYXp1cmUnICAgICAgICAgICAgICAgID0+IDB4RjBGRkZGRkYsCisgICAgICAgICdiZWlnZScgICAgICAgICAgICAgICAgPT4gMHhGNUY1RENGRiwKKyAgICAgICAgJ2Jpc3F1ZScgICAgICAgICAgICAgICA9PiAweEZGRTRDNEZGLAorICAgICAgICAnYmxhY2snICAgICAgICAgICAgICAgID0+IDB4MDAwMDAwRkYsCisgICAgICAgICdibGFuY2hlZGFsbW9uZCcgICAgICAgPT4gMHhGRkVCQ0RGRiwKKyAgICAgICAgJ2JsdWUnICAgICAgICAgICAgICAgICA9PiAweDAwMDBGRkZGLAorICAgICAgICAnYmx1ZXZpb2xldCcgICAgICAgICAgID0+IDB4OEEyQkUyRkYsCisgICAgICAgICdicm93bicgICAgICAgICAgICAgICAgPT4gMHhBNTJBMkFGRiwKKyAgICAgICAgJ2J1cmx5d29vZCcgICAgICAgICAgICA9PiAweERFQjg4N0ZGLAorICAgICAgICAnY2FkZXRibHVlJyAgICAgICAgICAgID0+IDB4NUY5RUEwRkYsCisgICAgICAgICdjaGFydHJldXNlJyAgICAgICAgICAgPT4gMHg3RkZGMDBGRiwKKyAgICAgICAgJ2Nob2NvbGF0ZScgICAgICAgICAgICA9PiAweEQyNjkxRUZGLAorICAgICAgICAnY29yYWwnICAgICAgICAgICAgICAgID0+IDB4RkY3RjUwRkYsCisgICAgICAgICdjb3JuZmxvd2VyYmx1ZScgICAgICAgPT4gMHg2NDk1RURGRiwKKyAgICAgICAgJ2Nvcm5zaWxrJyAgICAgICAgICAgICA9PiAweEZGRjhEQ0ZGLAorICAgICAgICAnY3JpbXNvbicgICAgICAgICAgICAgID0+IDB4REMxNDNDRkYsCisgICAgICAgICdjeWFuJyAgICAgICAgICAgICAgICAgPT4gMHgwMEZGRkZGRiwKKyAgICAgICAgJ2RhcmtibHVlJyAgICAgICAgICAgICA9PiAweDAwMDA4QkZGLAorICAgICAgICAnZGFya2N5YW4nICAgICAgICAgICAgID0+IDB4MDA4QjhCRkYsCisgICAgICAgICdkYXJrZ29sZGVucm9kJyAgICAgICAgPT4gMHhCODg2MEJGRiwKKyAgICAgICAgJ2RhcmtncmF5JyAgICAgICAgICAgICA9PiAweEE5QTlBOUZGLAorICAgICAgICAnZGFya2dyZWVuJyAgICAgICAgICAgID0+IDB4MDA2NDAwRkYsCisgICAgICAgICdkYXJra2hha2knICAgICAgICAgICAgPT4gMHhCREI3NkJGRiwKKyAgICAgICAgJ2RhcmttYWdlbnRhJyAgICAgICAgICA9PiAweDhCMDA4QkZGLAorICAgICAgICAnZGFya29saXZlZ3JlZW4nICAgICAgID0+IDB4NTU2QjJGRkYsCisgICAgICAgICdkYXJrb3JhbmdlJyAgICAgICAgICAgPT4gMHhGRjhDMDBGRiwKKyAgICAgICAgJ2RhcmtvcmNoaWQnICAgICAgICAgICA9PiAweDk5MzJDQ0ZGLAorICAgICAgICAnZGFya3JlZCcgICAgICAgICAgICAgID0+IDB4OEIwMDAwRkYsCisgICAgICAgICdkYXJrc2FsbW9uJyAgICAgICAgICAgPT4gMHhFOTk2N0FGRiwKKyAgICAgICAgJ2RhcmtzZWFncmVlbicgICAgICAgICA9PiAweDhGQkM4RkZGLAorICAgICAgICAnZGFya3NsYXRlYmx1ZScgICAgICAgID0+IDB4NDgzRDhCRkYsCisgICAgICAgICdkYXJrc2xhdGVncmF5JyAgICAgICAgPT4gMHgyRjRGNEZGRiwKKyAgICAgICAgJ2Rhcmt0dXJxdW9pc2UnICAgICAgICA9PiAweDAwQ0VEMUZGLAorICAgICAgICAnZGFya3Zpb2xldCcgICAgICAgICAgID0+IDB4OTQwMEQzRkYsCisgICAgICAgICdkZWVwcGluaycgICAgICAgICAgICAgPT4gMHhGRjE0OTNGRiwKKyAgICAgICAgJ2RlZXBza3libHVlJyAgICAgICAgICA9PiAweDAwQkZGRkZGLAorICAgICAgICAnZGltZ3JheScgICAgICAgICAgICAgID0+IDB4Njk2OTY5RkYsCisgICAgICAgICdkb2RnZXJibHVlJyAgICAgICAgICAgPT4gMHgxRTkwRkZGRiwKKyAgICAgICAgJ2ZpcmVicmljaycgICAgICAgICAgICA9PiAweEIyMjIyMkZGLAorICAgICAgICAnZmxvcmFsd2hpdGUnICAgICAgICAgID0+IDB4RkZGQUYwRkYsCisgICAgICAgICdmb3Jlc3RncmVlbicgICAgICAgICAgPT4gMHgyMjhCMjJGRiwKKyAgICAgICAgJ2dhaW5zYm9ybycgICAgICAgICAgICA9PiAweERDRENEQ0ZGLAorICAgICAgICAnZ2hvc3R3aGl0ZScgICAgICAgICAgID0+IDB4RjhGOEZGRkYsCisgICAgICAgICdnb2xkJyAgICAgICAgICAgICAgICAgPT4gMHhGRkQ3MDBGRiwKKyAgICAgICAgJ2dvbGRlbnJvZCcgICAgICAgICAgICA9PiAweERBQTUyMEZGLAorICAgICAgICAnZ3JheScgICAgICAgICAgICAgICAgID0+IDB4ODA4MDgwRkYsCisgICAgICAgICdncmVlbicgICAgICAgICAgICAgICAgPT4gMHgwMDgwMDBGRiwKKyAgICAgICAgJ2dyZWVueWVsbG93JyAgICAgICAgICA9PiAweEFERkYyRkZGLAorICAgICAgICAnaG9uZXlkZXcnICAgICAgICAgICAgID0+IDB4RjBGRkYwRkYsCisgICAgICAgICdob3RwaW5rJyAgICAgICAgICAgICAgPT4gMHhGRjY5QjRGRiwKKyAgICAgICAgJ2luZGlhbnJlZCcgICAgICAgICAgICA9PiAweENENUM1Q0ZGLAorICAgICAgICAnaW5kaWdvJyAgICAgICAgICAgICAgID0+IDB4NEIwMDgyRkYsCisgICAgICAgICdpdm9yeScgICAgICAgICAgICAgICAgPT4gMHhGRkZGRjBGRiwKKyAgICAgICAgJ2toYWtpJyAgICAgICAgICAgICAgICA9PiAweEYwRTY4Q0ZGLAorICAgICAgICAnbGF2ZW5kZXInICAgICAgICAgICAgID0+IDB4RTZFNkZBRkYsCisgICAgICAgICdsYXZlbmRlcmJsdXNoJyAgICAgICAgPT4gMHhGRkYwRjVGRiwKKyAgICAgICAgJ2xhd25ncmVlbicgICAgICAgICAgICA9PiAweDdDRkMwMEZGLAorICAgICAgICAnbGVtb25jaGlmZm9uJyAgICAgICAgID0+IDB4RkZGQUNERkYsCisgICAgICAgICdsaWdodGJsdWUnICAgICAgICAgICAgPT4gMHhBREQ4RTZGRiwKKyAgICAgICAgJ2xpZ2h0Y29yYWwnICAgICAgICAgICA9PiAweEYwODA4MEZGLAorICAgICAgICAnbGlnaHRjeWFuJyAgICAgICAgICAgID0+IDB4RTBGRkZGRkYsCisgICAgICAgICdsaWdodGdvbGRlbnJvZHllbGxvdycgPT4gMHhGQUZBRDJGRiwKKyAgICAgICAgJ2xpZ2h0Z3JlZW4nICAgICAgICAgICA9PiAweDkwRUU5MEZGLAorICAgICAgICAnbGlnaHRncmF5JyAgICAgICAgICAgID0+IDB4RDNEM0QzRkYsCisgICAgICAgICdsaWdodHBpbmsnICAgICAgICAgICAgPT4gMHhGRkI2QzFGRiwKKyAgICAgICAgJ2xpZ2h0c2FsbW9uJyAgICAgICAgICA9PiAweEZGQTA3QUZGLAorICAgICAgICAnbGlnaHRzZWFncmVlbicgICAgICAgID0+IDB4MjBCMkFBRkYsCisgICAgICAgICdsaWdodHNreWJsdWUnICAgICAgICAgPT4gMHg4N0NFRkFGRiwKKyAgICAgICAgJ2xpZ2h0c2xhdGVncmF5JyAgICAgICA9PiAweDc3ODg5OUZGLAorICAgICAgICAnbGlnaHRzdGVlbGJsdWUnICAgICAgID0+IDB4QjBDNERFRkYsCisgICAgICAgICdsaWdodHllbGxvdycgICAgICAgICAgPT4gMHhGRkZGRTBGRiwKKyAgICAgICAgJ2xpbWUnICAgICAgICAgICAgICAgICA9PiAweDAwRkYwMEZGLAorICAgICAgICAnbGltZWdyZWVuJyAgICAgICAgICAgID0+IDB4MzJDRDMyRkYsCisgICAgICAgICdsaW5lbicgICAgICAgICAgICAgICAgPT4gMHhGQUYwRTZGRiwKKyAgICAgICAgJ21hZ2VudGEnICAgICAgICAgICAgICA9PiAweEZGMDBGRkZGLAorICAgICAgICAnbWFyb29uJyAgICAgICAgICAgICAgID0+IDB4ODAwMDAwRkYsCisgICAgICAgICdtZWRpdW1hcXVhbWFyaW5lJyAgICAgPT4gMHg2NkNEQUFGRiwKKyAgICAgICAgJ21lZGl1bWJsdWUnICAgICAgICAgICA9PiAweDAwMDBDREZGLAorICAgICAgICAnbWVkaXVtb3JjaGlkJyAgICAgICAgID0+IDB4QkE1NUQzRkYsCisgICAgICAgICdtZWRpdW1wdXJwbGUnICAgICAgICAgPT4gMHg5MzcwREJGRiwKKyAgICAgICAgJ21lZGl1bXNlYWdyZWVuJyAgICAgICA9PiAweDNDQjM3MUZGLAorICAgICAgICAnbWVkaXVtc2xhdGVibHVlJyAgICAgID0+IDB4N0I2OEVFRkYsCisgICAgICAgICdtZWRpdW1zcHJpbmdncmVlbicgICAgPT4gMHgwMEZBOUFGRiwKKyAgICAgICAgJ21lZGl1bXR1cnF1b2lzZScgICAgICA9PiAweDQ4RDFDQ0ZGLAorICAgICAgICAnbWVkaXVtdmlvbGV0cmVkJyAgICAgID0+IDB4QzcxNTg1RkYsCisgICAgICAgICdtaWRuaWdodGJsdWUnICAgICAgICAgPT4gMHgxOTE5NzBGRiwKKyAgICAgICAgJ21pbnRjcmVhbScgICAgICAgICAgICA9PiAweEY1RkZGQUZGLAorICAgICAgICAnbWlzdHlyb3NlJyAgICAgICAgICAgID0+IDB4RkZFNEUxRkYsCisgICAgICAgICdtb2NjYXNpbicgICAgICAgICAgICAgPT4gMHhGRkU0QjVGRiwKKyAgICAgICAgJ25hdmFqb3doaXRlJyAgICAgICAgICA9PiAweEZGREVBREZGLAorICAgICAgICAnbmF2eScgICAgICAgICAgICAgICAgID0+IDB4MDAwMDgwRkYsCisgICAgICAgICdvbGRsYWNlJyAgICAgICAgICAgICAgPT4gMHhGREY1RTZGRiwKKyAgICAgICAgJ29saXZlJyAgICAgICAgICAgICAgICA9PiAweDgwODAwMEZGLAorICAgICAgICAnb2xpdmVkcmFiJyAgICAgICAgICAgID0+IDB4NkI4RTIzRkYsCisgICAgICAgICdvcmFuZ2UnICAgICAgICAgICAgICAgPT4gMHhGRkE1MDBGRiwKKyAgICAgICAgJ29yYW5nZXJlZCcgICAgICAgICAgICA9PiAweEZGNDUwMEZGLAorICAgICAgICAnb3JjaGlkJyAgICAgICAgICAgICAgID0+IDB4REE3MEQ2RkYsCisgICAgICAgICdwYWxlZ29sZGVucm9kJyAgICAgICAgPT4gMHhFRUU4QUFGRiwKKyAgICAgICAgJ3BhbGVncmVlbicgICAgICAgICAgICA9PiAweDk4RkI5OEZGLAorICAgICAgICAncGFsZXR1cnF1b2lzZScgICAgICAgID0+IDB4QUZFRUVFRkYsCisgICAgICAgICdwYWxldmlvbGV0cmVkJyAgICAgICAgPT4gMHhEQjcwOTNGRiwKKyAgICAgICAgJ3BhcGF5YXdoaXAnICAgICAgICAgICA9PiAweEZGRUZENUZGLAorICAgICAgICAncGVhY2hwdWZmJyAgICAgICAgICAgID0+IDB4RkZEQUI5RkYsCisgICAgICAgICdwZXJ1JyAgICAgICAgICAgICAgICAgPT4gMHhDRDg1M0ZGRiwKKyAgICAgICAgJ3BpbmsnICAgICAgICAgICAgICAgICA9PiAweEZGQzBDQkZGLAorICAgICAgICAncGx1bScgICAgICAgICAgICAgICAgID0+IDB4RERBMERERkYsCisgICAgICAgICdwb3dkZXJibHVlJyAgICAgICAgICAgPT4gMHhCMEUwRTZGRiwKKyAgICAgICAgJ3B1cnBsZScgICAgICAgICAgICAgICA9PiAweDgwMDA4MEZGLAorICAgICAgICAncmVkJyAgICAgICAgICAgICAgICAgID0+IDB4RkYwMDAwRkYsCisgICAgICAgICdyZWJlY2NhcHVycGxlJyAgICAgICAgPT4gMHg2NjMzOTlGRiwKKyAgICAgICAgJ3Jvc3licm93bicgICAgICAgICAgICA9PiAweEJDOEY4RkZGLAorICAgICAgICAncm95YWxibHVlJyAgICAgICAgICAgID0+IDB4NDE2OUUxRkYsCisgICAgICAgICdzYWRkbGVicm93bicgICAgICAgICAgPT4gMHg4QjQ1MTNGRiwKKyAgICAgICAgJ3NhbG1vbicgICAgICAgICAgICAgICA9PiAweEZBODA3MkZGLAorICAgICAgICAnc2FuZHlicm93bicgICAgICAgICAgID0+IDB4RjRBNDYwRkYsCisgICAgICAgICdzZWFncmVlbicgICAgICAgICAgICAgPT4gMHgyRThCNTdGRiwKKyAgICAgICAgJ3NlYXNoZWxsJyAgICAgICAgICAgICA9PiAweEZGRjVFRUZGLAorICAgICAgICAnc2llbm5hJyAgICAgICAgICAgICAgID0+IDB4QTA1MjJERkYsCisgICAgICAgICdzaWx2ZXInICAgICAgICAgICAgICAgPT4gMHhDMEMwQzBGRiwKKyAgICAgICAgJ3NreWJsdWUnICAgICAgICAgICAgICA9PiAweDg3Q0VFQkZGLAorICAgICAgICAnc2xhdGVibHVlJyAgICAgICAgICAgID0+IDB4NkE1QUNERkYsCisgICAgICAgICdzbGF0ZWdyYXknICAgICAgICAgICAgPT4gMHg3MDgwOTBGRiwKKyAgICAgICAgJ3Nub3cnICAgICAgICAgICAgICAgICA9PiAweEZGRkFGQUZGLAorICAgICAgICAnc3ByaW5nZ3JlZW4nICAgICAgICAgID0+IDB4MDBGRjdGRkYsCisgICAgICAgICdzdGVlbGJsdWUnICAgICAgICAgICAgPT4gMHg0NjgyQjRGRiwKKyAgICAgICAgJ3RhbicgICAgICAgICAgICAgICAgICA9PiAweEQyQjQ4Q0ZGLAorICAgICAgICAndGVhbCcgICAgICAgICAgICAgICAgID0+IDB4MDA4MDgwRkYsCisgICAgICAgICd0aGlzdGxlJyAgICAgICAgICAgICAgPT4gMHhEOEJGRDhGRiwKKyAgICAgICAgJ3RvbWF0bycgICAgICAgICAgICAgICA9PiAweEZGNjM0N0ZGLAorICAgICAgICAndHJhbnNwYXJlbnQnICAgICAgICAgID0+IDB4MDAwMDAwMDAsCisgICAgICAgICd0dXJxdW9pc2UnICAgICAgICAgICAgPT4gMHg0MEUwRDBGRiwKKyAgICAgICAgJ3Zpb2xldCcgICAgICAgICAgICAgICA9PiAweEVFODJFRUZGLAorICAgICAgICAnd2hlYXQnICAgICAgICAgICAgICAgID0+IDB4RjVERUIzRkYsCisgICAgICAgICd3aGl0ZScgICAgICAgICAgICAgICAgPT4gMHhGRkZGRkZGRiwKKyAgICAgICAgJ3doaXRlc21va2UnICAgICAgICAgICA9PiAweEY1RjVGNUZGLAorICAgICAgICAneWVsbG93JyAgICAgICAgICAgICAgID0+IDB4RkZGRjAwRkYsCisgICAgICAgICd5ZWxsb3dncmVlbicgICAgICAgICAgPT4gMHg5QUNEMzJGRgorICAgICAgfSwgJm1ldGhvZCg6aW50X3RvX3JnYmEpKQorCisgICAgIyBBIGhhc2ggZnJvbSBgW3JlZCwgZ3JlZW4sIGJsdWUsIGFscGhhXWAgdmFsdWUgYXJyYXlzIHRvIGNvbG9yIG5hbWVzLgorICAgIENPTE9SX05BTUVTX1JFVkVSU0UgPSBDT0xPUl9OQU1FUy5pbnZlcnQuZnJlZXplCisKKyAgICAjIFdlIGFkZCB0aGUgYWx0ZXJuYXRlIGNvbG9yIG5hbWVzIGFmdGVyIGludmVydGluZyBiZWNhdXNlCisgICAgIyBkaWZmZXJlbnQgcnVieSBpbXBsZW1lbnRhdGlvbnMgYW5kIHZlcnNpb25zIHZhcnkgb24gdGhlIG9yZGVyaW5nIG9mIHRoZSByZXN1bHQgb2YgaW52ZXJ0LgorICAgIENPTE9SX05BTUVTLnVwZGF0ZShBTFRFUk5BVEVfQ09MT1JfTkFNRVMpLmZyZWV6ZQorCisgICAgIyBUaGUgdXNlcidzIG9yaWdpbmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgYXR0cl9yZWFkZXIgOnJlcHJlc2VudGF0aW9uCisKKyAgICAjIENvbnN0cnVjdHMgYW4gUkdCIG9yIEhTTCBjb2xvciBvYmplY3QsCisgICAgIyBvcHRpb25hbGx5IHdpdGggYW4gYWxwaGEgY2hhbm5lbC4KKyAgICAjCisgICAgIyBSR0IgdmFsdWVzIGFyZSBjbGlwcGVkIHdpdGhpbiAwIGFuZCAyNTUuCisgICAgIyBTYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgdmFsdWVzIGFyZSBjbGlwcGVkIHdpdGhpbiAwIGFuZCAxMDAuCisgICAgIyBUaGUgYWxwaGEgdmFsdWUgaXMgY2xpcHBlZCB3aXRoaW4gMCBhbmQgMS4KKyAgICAjCisgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiBhbnkgY29sb3IgdmFsdWUgaXNuJ3QgaW4gdGhlIHNwZWNpZmllZCByYW5nZQorICAgICMKKyAgICAjIEBvdmVybG9hZCBpbml0aWFsaXplKGF0dHJzKQorICAgICMgICBUaGUgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGFzIGEgaGFzaC4gVGhpcyBoYXNoIG11c3QgY29udGFpbiBlaXRoZXIKKyAgICAjICAgYDpodWVgLCBgOnNhdHVyYXRpb25gLCBhbmQgYDpsaWdodG5lc3NgIGtleXMsIG9yIGA6cmVkYCwgYDpncmVlbmAsIGFuZAorICAgICMgICBgOmJsdWVgIGtleXMuIEl0IGNhbm5vdCBjb250YWluIGJvdGggSFNMIGFuZCBSR0Iga2V5cy4gSXQgbWF5IGFsc28KKyAgICAjICAgb3B0aW9uYWxseSBjb250YWluIGFuIGA6YWxwaGFgIGtleSwgYW5kIGEgYDpyZXByZXNlbnRhdGlvbmAga2V5CisgICAgIyAgIGluZGljYXRpbmcgdGhlIG9yaWdpbmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvciB0aGF0IHRoZSB1c2VyIHdyb3RlCisgICAgIyAgIGluIHRoZWlyIHN0eWxlc2hlZXQuCisgICAgIworICAgICMgICBAcGFyYW0gYXR0cnMgW3tTeW1ib2wgPT4gTnVtZXJpY31dIEEgaGFzaCBvZiBjb2xvciBhdHRyaWJ1dGVzIHRvIHZhbHVlcworICAgICMgICBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIG5vdCBlbm91Z2ggYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkLAorICAgICMgICAgIG9yIGJvdGggUkdCIGFuZCBIU0wgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkCisgICAgIworICAgICMgQG92ZXJsb2FkIGluaXRpYWxpemUocmdiYSwgW3JlcHJlc2VudGF0aW9uXSkKKyAgICAjICAgVGhlIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyBhbiBhcnJheS4KKyAgICAjICAgVGhpcyBvdmVybG9hZCBvbmx5IHN1cHBvcnRzIFJHQiBvciBSR0JBIGNvbG9ycy4KKyAgICAjCisgICAgIyAgIEBwYXJhbSByZ2JhIFtBcnJheTxOdW1lcmljPl0gQSB0aHJlZS0gb3IgZm91ci1lbGVtZW50IGFycmF5CisgICAgIyAgICAgb2YgdGhlIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBvcHRpb25hbGx5IGFscGhhIHZhbHVlcyAocmVzcGVjdGl2ZWx5KQorICAgICMgICAgIG9mIHRoZSBjb2xvcgorICAgICMgICBAcGFyYW0gcmVwcmVzZW50YXRpb24gW1N0cmluZ10gVGhlIG9yaWdpbmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvcgorICAgICMgICAgIHRoYXQgdGhlIHVzZXIgd3JvdGUgaW4gdGhlaXIgc3R5bGVzaGVldC4KKyAgICAjICAgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBpZiBub3QgZW5vdWdoIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZAorICAgIGRlZiBpbml0aWFsaXplKGF0dHJzLCByZXByZXNlbnRhdGlvbiA9IG5pbCwgYWxsb3dfYm90aF9yZ2JfYW5kX2hzbCA9IGZhbHNlKQorICAgICAgc3VwZXIobmlsKQorCisgICAgICBpZiBhdHRycy5pc19hPyhBcnJheSkKKyAgICAgICAgdW5sZXNzICgzLi40KS5pbmNsdWRlPyhhdHRycy5zaXplKQorICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJDb2xvci5uZXcoYXJyYXkpIGV4cGVjdHMgYSB0aHJlZS0gb3IgZm91ci1lbGVtZW50IGFycmF5IikKKyAgICAgICAgZW5kCisKKyAgICAgICAgcmVkLCBncmVlbiwgYmx1ZSA9IGF0dHJzWzAuLi4zXS5tYXAge3xjfCBTYXNzOjpVdGlsLnJvdW5kKGMpfQorICAgICAgICBAYXR0cnMgPSB7OnJlZCA9PiByZWQsIDpncmVlbiA9PiBncmVlbiwgOmJsdWUgPT4gYmx1ZX0KKyAgICAgICAgQGF0dHJzWzphbHBoYV0gPSBhdHRyc1szXSA/IGF0dHJzWzNdLnRvX2YgOiAxCisgICAgICAgIEByZXByZXNlbnRhdGlvbiA9IHJlcHJlc2VudGF0aW9uCisgICAgICBlbHNlCisgICAgICAgIGF0dHJzID0gYXR0cnMucmVqZWN0IHt8X2ssIHZ8IHYubmlsP30KKyAgICAgICAgaHNsID0gWzpodWUsIDpzYXR1cmF0aW9uLCA6bGlnaHRuZXNzXSAmIGF0dHJzLmtleXMKKyAgICAgICAgcmdiID0gWzpyZWQsIDpncmVlbiwgOmJsdWVdICYgYXR0cnMua2V5cworICAgICAgICBpZiAhYWxsb3dfYm90aF9yZ2JfYW5kX2hzbCAmJiAhaHNsLmVtcHR5PyAmJiAhcmdiLmVtcHR5PworICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJDb2xvci5uZXcoaGFzaCkgbWF5IG5vdCBoYXZlIGJvdGggSFNMIGFuZCBSR0Iga2V5cyBzcGVjaWZpZWQiKQorICAgICAgICBlbHNpZiBoc2wuZW1wdHk/ICYmIHJnYi5lbXB0eT8KKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiQ29sb3IubmV3KGhhc2gpIG11c3QgaGF2ZSBlaXRoZXIgSFNMIG9yIFJHQiBrZXlzIHNwZWNpZmllZCIpCisgICAgICAgIGVsc2lmICFoc2wuZW1wdHk/ICYmIGhzbC5zaXplICE9IDMKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiQ29sb3IubmV3KGhhc2gpIG11c3QgaGF2ZSBhbGwgdGhyZWUgSFNMIHZhbHVlcyBzcGVjaWZpZWQiKQorICAgICAgICBlbHNpZiAhcmdiLmVtcHR5PyAmJiByZ2Iuc2l6ZSAhPSAzCisgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIkNvbG9yLm5ldyhoYXNoKSBtdXN0IGhhdmUgYWxsIHRocmVlIFJHQiB2YWx1ZXMgc3BlY2lmaWVkIikKKyAgICAgICAgZW5kCisKKyAgICAgICAgQGF0dHJzID0gYXR0cnMKKyAgICAgICAgQGF0dHJzWzpodWVdICU9IDM2MCBpZiBAYXR0cnNbOmh1ZV0KKyAgICAgICAgQGF0dHJzWzphbHBoYV0gfHw9IDEKKyAgICAgICAgQHJlcHJlc2VudGF0aW9uID0gQGF0dHJzLmRlbGV0ZSg6cmVwcmVzZW50YXRpb24pCisgICAgICBlbmQKKworICAgICAgWzpyZWQsIDpncmVlbiwgOmJsdWVdLmVhY2ggZG8gfGt8CisgICAgICAgIG5leHQgaWYgQGF0dHJzW2tdLm5pbD8KKyAgICAgICAgQGF0dHJzW2tdID0gU2Fzczo6VXRpbC5yZXN0cmljdChTYXNzOjpVdGlsLnJvdW5kKEBhdHRyc1trXSksIDAuLjI1NSkKKyAgICAgIGVuZAorCisgICAgICBbOnNhdHVyYXRpb24sIDpsaWdodG5lc3NdLmVhY2ggZG8gfGt8CisgICAgICAgIG5leHQgaWYgQGF0dHJzW2tdLm5pbD8KKyAgICAgICAgQGF0dHJzW2tdID0gU2Fzczo6VXRpbC5yZXN0cmljdChAYXR0cnNba10sIDAuLjEwMCkKKyAgICAgIGVuZAorCisgICAgICBAYXR0cnNbOmFscGhhXSA9IFNhc3M6OlV0aWwucmVzdHJpY3QoQGF0dHJzWzphbHBoYV0sIDAuLjEpCisgICAgZW5kCisKKyAgICAjIENyZWF0ZSBhIG5ldyBjb2xvciBmcm9tIGEgdmFsaWQgQ1NTIGhleCBzdHJpbmcuCisgICAgIworICAgICMgVGhlIGxlYWRpbmcgaGFzaCBpcyBvcHRpb25hbC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtDb2xvcl0KKyAgICBkZWYgc2VsZi5mcm9tX2hleChoZXhfc3RyaW5nLCBhbHBoYSA9IG5pbCkKKyAgICAgIHVubGVzcyBoZXhfc3RyaW5nID1+IC9eIz8oWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkkL2kgfHwKKyAgICAgICAgICAgICBoZXhfc3RyaW5nID1+IC9eIz8oWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSkkL2kKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIiN7aGV4X3N0cmluZy5pbnNwZWN0fSBpcyBub3QgYSB2YWxpZCBoZXggY29sb3IuIikKKyAgICAgIGVuZAorICAgICAgcmVkICAgPSAkMS5sanVzdCgyLCAkMSkudG9faSgxNikKKyAgICAgIGdyZWVuID0gJDIubGp1c3QoMiwgJDIpLnRvX2koMTYpCisgICAgICBibHVlICA9ICQzLmxqdXN0KDIsICQzKS50b19pKDE2KQorCisgICAgICBoZXhfc3RyaW5nID0gIiMje2hleF9zdHJpbmd9IiB1bmxlc3MgaGV4X3N0cmluZ1swXSA9PSA/IworICAgICAgYXR0cnMgPSB7OnJlZCA9PiByZWQsIDpncmVlbiA9PiBncmVlbiwgOmJsdWUgPT4gYmx1ZSwgOnJlcHJlc2VudGF0aW9uID0+IGhleF9zdHJpbmd9CisgICAgICBhdHRyc1s6YWxwaGFdID0gYWxwaGEgaWYgYWxwaGEKKyAgICAgIG5ldyhhdHRycykKKyAgICBlbmQKKworICAgICMgVGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIGNvbG9yLgorICAgICMKKyAgICAjIEByZXR1cm4gW0ludGVnZXJdCisgICAgZGVmIHJlZAorICAgICAgaHNsX3RvX3JnYiEKKyAgICAgIEBhdHRyc1s6cmVkXQorICAgIGVuZAorCisgICAgIyBUaGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBjb2xvci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgIGRlZiBncmVlbgorICAgICAgaHNsX3RvX3JnYiEKKyAgICAgIEBhdHRyc1s6Z3JlZW5dCisgICAgZW5kCisKKyAgICAjIFRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgY29sb3IuCisgICAgIworICAgICMgQHJldHVybiBbSW50ZWdlcl0KKyAgICBkZWYgYmx1ZQorICAgICAgaHNsX3RvX3JnYiEKKyAgICAgIEBhdHRyc1s6Ymx1ZV0KKyAgICBlbmQKKworICAgICMgVGhlIGh1ZSBjb21wb25lbnQgb2YgdGhlIGNvbG9yLgorICAgICMKKyAgICAjIEByZXR1cm4gW051bWVyaWNdCisgICAgZGVmIGh1ZQorICAgICAgcmdiX3RvX2hzbCEKKyAgICAgIEBhdHRyc1s6aHVlXQorICAgIGVuZAorCisgICAgIyBUaGUgc2F0dXJhdGlvbiBjb21wb25lbnQgb2YgdGhlIGNvbG9yLgorICAgICMKKyAgICAjIEByZXR1cm4gW051bWVyaWNdCisgICAgZGVmIHNhdHVyYXRpb24KKyAgICAgIHJnYl90b19oc2whCisgICAgICBAYXR0cnNbOnNhdHVyYXRpb25dCisgICAgZW5kCisKKyAgICAjIFRoZSBsaWdodG5lc3MgY29tcG9uZW50IG9mIHRoZSBjb2xvci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtOdW1lcmljXQorICAgIGRlZiBsaWdodG5lc3MKKyAgICAgIHJnYl90b19oc2whCisgICAgICBAYXR0cnNbOmxpZ2h0bmVzc10KKyAgICBlbmQKKworICAgICMgVGhlIGFscGhhIGNoYW5uZWwgKG9wYWNpdHkpIG9mIHRoZSBjb2xvci4KKyAgICAjIFRoaXMgaXMgMSB1bmxlc3Mgb3RoZXJ3aXNlIGRlZmluZWQuCisgICAgIworICAgICMgQHJldHVybiBbSW50ZWdlcl0KKyAgICBkZWYgYWxwaGEKKyAgICAgIEBhdHRyc1s6YWxwaGFdLnRvX2YKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB3aGV0aGVyIHRoaXMgY29sb3Igb2JqZWN0IGlzIHRyYW5zbHVjZW50OworICAgICMgdGhhdCBpcywgd2hldGhlciB0aGUgYWxwaGEgY2hhbm5lbCBpcyBub24tMS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBhbHBoYT8KKyAgICAgIGFscGhhIDwgMQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjb21wb25lbnRzIG9mIHRoZSBjb2xvci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxJbnRlZ2VyPl0gQSBmcm96ZW4gdGhyZWUtZWxlbWVudCBhcnJheSBvZiB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUKKyAgICAjICAgdmFsdWVzIChyZXNwZWN0aXZlbHkpIG9mIHRoZSBjb2xvcgorICAgIGRlZiByZ2IKKyAgICAgIFtyZWQsIGdyZWVuLCBibHVlXS5mcmVlemUKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YgdGhlIGNvbG9yLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PEludGVnZXI+XSBBIGZyb3plbiBmb3VyLWVsZW1lbnQgYXJyYXkgb2YgdGhlIHJlZCwgZ3JlZW4sCisgICAgIyAgIGJsdWUsIGFuZCBhbHBoYSB2YWx1ZXMgKHJlc3BlY3RpdmVseSkgb2YgdGhlIGNvbG9yCisgICAgZGVmIHJnYmEKKyAgICAgIFtyZWQsIGdyZWVuLCBibHVlLCBhbHBoYV0uZnJlZXplCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIGh1ZSwgc2F0dXJhdGlvbiwgYW5kIGxpZ2h0bmVzcyBjb21wb25lbnRzIG9mIHRoZSBjb2xvci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxJbnRlZ2VyPl0gQSBmcm96ZW4gdGhyZWUtZWxlbWVudCBhcnJheSBvZiB0aGUKKyAgICAjICAgaHVlLCBzYXR1cmF0aW9uLCBhbmQgbGlnaHRuZXNzIHZhbHVlcyAocmVzcGVjdGl2ZWx5KSBvZiB0aGUgY29sb3IKKyAgICBkZWYgaHNsCisgICAgICBbaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3NdLmZyZWV6ZQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcywgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YgdGhlIGNvbG9yLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PEludGVnZXI+XSBBIGZyb3plbiBmb3VyLWVsZW1lbnQgYXJyYXkgb2YgdGhlIGh1ZSwKKyAgICAjICAgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCBhbmQgYWxwaGEgdmFsdWVzIChyZXNwZWN0aXZlbHkpIG9mIHRoZSBjb2xvcgorICAgIGRlZiBoc2xhCisgICAgICBbaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIGFscGhhXS5mcmVlemUKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYD09YCBvcGVyYXRpb24uCisgICAgIyAqKk5vdGUgdGhhdCB0aGlzIHJldHVybnMgYSB7U2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbH0gb2JqZWN0LAorICAgICMgbm90IGEgUnVieSBib29sZWFuKiouCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtWYWx1ZV0gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAgICAjIEByZXR1cm4gW0Jvb2xdIFRydWUgaWYgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3RoZXIsCisgICAgIyAgIGZhbHNlIG90aGVyd2lzZQorICAgIGRlZiBlcShvdGhlcikKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2wubmV3KAorICAgICAgICBvdGhlci5pc19hPyhDb2xvcikgJiYgcmdiID09IG90aGVyLnJnYiAmJiBhbHBoYSA9PSBvdGhlci5hbHBoYSkKKyAgICBlbmQKKworICAgIGRlZiBoYXNoCisgICAgICBbcmdiLCBhbHBoYV0uaGFzaAorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGEgY29weSBvZiB0aGlzIGNvbG9yIHdpdGggb25lIG9yIG1vcmUgY2hhbm5lbHMgY2hhbmdlZC4KKyAgICAjIFJHQiBvciBIU0wgY29sb3JzIG1heSBiZSBjaGFuZ2VkLCBidXQgbm90IGJvdGggYXQgb25jZS4KKyAgICAjCisgICAgIyBGb3IgZXhhbXBsZToKKyAgICAjCisgICAgIyAgICAgQ29sb3IubmV3KFsxMCwgMjAsIDMwXSkud2l0aCg6Ymx1ZSA9PiA0MCkKKyAgICAjICAgICAgICM9PiByZ2IoMTAsIDQwLCAzMCkKKyAgICAjICAgICBDb2xvci5uZXcoWzEyNiwgMTI2LCAxMjZdKS53aXRoKDpyZWQgPT4gMCwgOmdyZWVuID0+IDI1NSkKKyAgICAjICAgICAgICM9PiByZ2IoMCwgMjU1LCAxMjYpCisgICAgIyAgICAgQ29sb3IubmV3KFsyNTUsIDAsIDEyN10pLndpdGgoOnNhdHVyYXRpb24gPT4gNjApCisgICAgIyAgICAgICAjPT4gcmdiKDIwNCwgNTEsIDEyNykKKyAgICAjICAgICBDb2xvci5uZXcoWzEsIDIsIDNdKS53aXRoKDphbHBoYSA9PiAwLjQpCisgICAgIyAgICAgICAjPT4gcmdiYSgxLCAyLCAzLCAwLjQpCisgICAgIworICAgICMgQHBhcmFtIGF0dHJzIFt7U3ltYm9sID0+IE51bWVyaWN9XQorICAgICMgICBBIG1hcCBvZiBjaGFubmVsIG5hbWVzIChgOnJlZGAsIGA6Z3JlZW5gLCBgOmJsdWVgLAorICAgICMgICBgOmh1ZWAsIGA6c2F0dXJhdGlvbmAsIGA6bGlnaHRuZXNzYCwgb3IgYDphbHBoYWApIHRvIHZhbHVlcworICAgICMgQHJldHVybiBbQ29sb3JdIFRoZSBuZXcgQ29sb3Igb2JqZWN0CisgICAgIyBAcmFpc2UgW0FyZ3VtZW50RXJyb3JdIGlmIGJvdGggUkdCIGFuZCBIU0wga2V5cyBhcmUgc3BlY2lmaWVkCisgICAgZGVmIHdpdGgoYXR0cnMpCisgICAgICBhdHRycyA9IGF0dHJzLnJlamVjdCB7fF9rLCB2fCB2Lm5pbD99CisgICAgICBoc2wgPSAhKFs6aHVlLCA6c2F0dXJhdGlvbiwgOmxpZ2h0bmVzc10gJiBhdHRycy5rZXlzKS5lbXB0eT8KKyAgICAgIHJnYiA9ICEoWzpyZWQsIDpncmVlbiwgOmJsdWVdICYgYXR0cnMua2V5cykuZW1wdHk/CisgICAgICBpZiBoc2wgJiYgcmdiCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJDYW5ub3Qgc3BlY2lmeSBIU0wgYW5kIFJHQiB2YWx1ZXMgZm9yIGEgY29sb3IgYXQgdGhlIHNhbWUgdGltZSIpCisgICAgICBlbmQKKworICAgICAgaWYgaHNsCisgICAgICAgIFs6aHVlLCA6c2F0dXJhdGlvbiwgOmxpZ2h0bmVzc10uZWFjaCB7fGt8IGF0dHJzW2tdIHx8PSBzZW5kKGspfQorICAgICAgZWxzaWYgcmdiCisgICAgICAgIFs6cmVkLCA6Z3JlZW4sIDpibHVlXS5lYWNoIHt8a3wgYXR0cnNba10gfHw9IHNlbmQoayl9CisgICAgICBlbHNlCisgICAgICAgICMgSWYgd2UncmUganVzdCBjaGFuZ2luZyB0aGUgYWxwaGEgY2hhbm5lbCwKKyAgICAgICAgIyBrZWVwIGFsbCB0aGUgSFNML1JHQiBzdHVmZiB3ZSd2ZSBjYWxjdWxhdGVkCisgICAgICAgIGF0dHJzID0gQGF0dHJzLm1lcmdlKGF0dHJzKQorICAgICAgZW5kCisgICAgICBhdHRyc1s6YWxwaGFdIHx8PSBhbHBoYQorCisgICAgICBDb2xvci5uZXcoYXR0cnMsIG5pbCwgOmFsbG93X2JvdGhfcmdiX2FuZF9oc2wpCisgICAgZW5kCisKKyAgICAjIFRoZSBTYXNzU2NyaXB0IGArYCBvcGVyYXRpb24uCisgICAgIyBJdHMgZnVuY3Rpb25hbGl0eSBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIGl0cyBhcmd1bWVudDoKKyAgICAjCisgICAgIyB7TnVtYmVyfQorICAgICMgOiBBZGRzIHRoZSBudW1iZXIgdG8gZWFjaCBvZiB0aGUgUkdCIGNvbG9yIGNoYW5uZWxzLgorICAgICMKKyAgICAjIHtDb2xvcn0KKyAgICAjIDogQWRkcyBlYWNoIG9mIHRoZSBSR0IgY29sb3IgY2hhbm5lbHMgdG9nZXRoZXIuCisgICAgIworICAgICMge1ZhbHVlfQorICAgICMgOiBTZWUge1ZhbHVlOjpCYXNlI3BsdXN9LgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtDb2xvcl0gVGhlIHJlc3VsdGluZyBjb2xvcgorICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgYG90aGVyYCBpcyBhIG51bWJlciB3aXRoIHVuaXRzCisgICAgZGVmIHBsdXMob3RoZXIpCisgICAgICBpZiBvdGhlci5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIpIHx8IG90aGVyLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yKQorICAgICAgICBwaWVjZXdpc2Uob3RoZXIsIDorKQorICAgICAgZWxzZQorICAgICAgICBzdXBlcgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRoZSBTYXNzU2NyaXB0IGAtYCBvcGVyYXRpb24uCisgICAgIyBJdHMgZnVuY3Rpb25hbGl0eSBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIGl0cyBhcmd1bWVudDoKKyAgICAjCisgICAgIyB7TnVtYmVyfQorICAgICMgOiBTdWJ0cmFjdHMgdGhlIG51bWJlciBmcm9tIGVhY2ggb2YgdGhlIFJHQiBjb2xvciBjaGFubmVscy4KKyAgICAjCisgICAgIyB7Q29sb3J9CisgICAgIyA6IFN1YnRyYWN0cyBlYWNoIG9mIHRoZSBvdGhlciBjb2xvcidzIFJHQiBjb2xvciBjaGFubmVscyBmcm9tIHRoaXMgY29sb3Incy4KKyAgICAjCisgICAgIyB7VmFsdWV9CisgICAgIyA6IFNlZSB7VmFsdWU6OkJhc2UjbWludXN9LgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtDb2xvcl0gVGhlIHJlc3VsdGluZyBjb2xvcgorICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgYG90aGVyYCBpcyBhIG51bWJlciB3aXRoIHVuaXRzCisgICAgZGVmIG1pbnVzKG90aGVyKQorICAgICAgaWYgb3RoZXIuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKSB8fCBvdGhlci5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcikKKyAgICAgICAgcGllY2V3aXNlKG90aGVyLCA6LSkKKyAgICAgIGVsc2UKKyAgICAgICAgc3VwZXIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgKmAgb3BlcmF0aW9uLgorICAgICMgSXRzIGZ1bmN0aW9uYWxpdHkgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiBpdHMgYXJndW1lbnQ6CisgICAgIworICAgICMge051bWJlcn0KKyAgICAjIDogTXVsdGlwbGllcyB0aGUgbnVtYmVyIGJ5IGVhY2ggb2YgdGhlIFJHQiBjb2xvciBjaGFubmVscy4KKyAgICAjCisgICAgIyB7Q29sb3J9CisgICAgIyA6IE11bHRpcGxpZXMgZWFjaCBvZiB0aGUgUkdCIGNvbG9yIGNoYW5uZWxzIHRvZ2V0aGVyLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbTnVtYmVyLCBDb2xvcl0gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAgICAjIEByZXR1cm4gW0NvbG9yXSBUaGUgcmVzdWx0aW5nIGNvbG9yCisgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiBgb3RoZXJgIGlzIGEgbnVtYmVyIHdpdGggdW5pdHMKKyAgICBkZWYgdGltZXMob3RoZXIpCisgICAgICBpZiBvdGhlci5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIpIHx8IG90aGVyLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yKQorICAgICAgICBwaWVjZXdpc2Uob3RoZXIsIDoqKQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBOb01ldGhvZEVycm9yLm5ldyhuaWwsIDp0aW1lcykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgL2Agb3BlcmF0aW9uLgorICAgICMgSXRzIGZ1bmN0aW9uYWxpdHkgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiBpdHMgYXJndW1lbnQ6CisgICAgIworICAgICMge051bWJlcn0KKyAgICAjIDogRGl2aWRlcyBlYWNoIG9mIHRoZSBSR0IgY29sb3IgY2hhbm5lbHMgYnkgdGhlIG51bWJlci4KKyAgICAjCisgICAgIyB7Q29sb3J9CisgICAgIyA6IERpdmlkZXMgZWFjaCBvZiB0aGlzIGNvbG9yJ3MgUkdCIGNvbG9yIGNoYW5uZWxzIGJ5IHRoZSBvdGhlciBjb2xvcidzLgorICAgICMKKyAgICAjIHtWYWx1ZX0KKyAgICAjIDogU2VlIHtWYWx1ZTo6QmFzZSNkaXZ9LgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtDb2xvcl0gVGhlIHJlc3VsdGluZyBjb2xvcgorICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgYG90aGVyYCBpcyBhIG51bWJlciB3aXRoIHVuaXRzCisgICAgZGVmIGRpdihvdGhlcikKKyAgICAgIGlmIG90aGVyLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcikgfHwKKyAgICAgICAgICBvdGhlci5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcikKKyAgICAgICAgcGllY2V3aXNlKG90aGVyLCA6LykKKyAgICAgIGVsc2UKKyAgICAgICAgc3VwZXIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgJWAgb3BlcmF0aW9uLgorICAgICMgSXRzIGZ1bmN0aW9uYWxpdHkgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiBpdHMgYXJndW1lbnQ6CisgICAgIworICAgICMge051bWJlcn0KKyAgICAjIDogVGFrZXMgZWFjaCBvZiB0aGUgUkdCIGNvbG9yIGNoYW5uZWxzIG1vZHVsZSB0aGUgbnVtYmVyLgorICAgICMKKyAgICAjIHtDb2xvcn0KKyAgICAjIDogVGFrZXMgZWFjaCBvZiB0aGlzIGNvbG9yJ3MgUkdCIGNvbG9yIGNoYW5uZWxzIG1vZHVsbyB0aGUgb3RoZXIgY29sb3Incy4KKyAgICAjCisgICAgIyBAcGFyYW0gb3RoZXIgW051bWJlciwgQ29sb3JdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtDb2xvcl0gVGhlIHJlc3VsdGluZyBjb2xvcgorICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgYG90aGVyYCBpcyBhIG51bWJlciB3aXRoIHVuaXRzCisgICAgZGVmIG1vZChvdGhlcikKKyAgICAgIGlmIG90aGVyLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcikgfHwKKyAgICAgICAgICBvdGhlci5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvcikKKyAgICAgICAgcGllY2V3aXNlKG90aGVyLCA6JSkKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgTm9NZXRob2RFcnJvci5uZXcobmlsLCA6bW9kKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbG9yLgorICAgICMgVGhpcyBpcyB1c3VhbGx5IHRoZSBjb2xvcidzIGhleCB2YWx1ZSwKKyAgICAjIGJ1dCBpZiB0aGUgY29sb3IgaGFzIGEgbmFtZSB0aGF0J3MgdXNlZCBpbnN0ZWFkLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgIGRlZiB0b19zKG9wdHMgPSB7fSkKKyAgICAgIHJldHVybiBzbWFsbGVzdCBpZiBvcHRpb25zWzpzdHlsZV0gPT0gOmNvbXByZXNzZWQKKyAgICAgIHJldHVybiByZXByZXNlbnRhdGlvbiBpZiByZXByZXNlbnRhdGlvbgorCisgICAgICAjIElFMTAgZG9lc24ndCBwcm9wZXJseSBzdXBwb3J0IHRoZSBjb2xvciBuYW1lICJ0cmFuc3BhcmVudCIsIHNvIHdlIGVtaXQKKyAgICAgICMgZ2VuZXJhdGVkIHRyYW5zcGFyZW50IGNvbG9ycyBhcyByZ2JhKDAsIDAsIDAsIDApIGluIGZhdm9yIG9mIHRoYXQuIFNlZQorICAgICAgIyAjMTc4Mi4KKyAgICAgIHJldHVybiByZ2JhX3N0ciBpZiBOdW1iZXIuYmFzaWNhbGx5X2VxdWFsPyhhbHBoYSwgMCkKKyAgICAgIHJldHVybiBuYW1lIGlmIG5hbWUKKyAgICAgIGFscGhhPyA/IHJnYmFfc3RyIDogaGV4X3N0cgorICAgIGVuZAorICAgIGFsaWFzX21ldGhvZCA6dG9fc2FzcywgOnRvX3MKKworICAgICMgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sb3IuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgaGV4IHZhbHVlCisgICAgZGVmIGluc3BlY3QKKyAgICAgIGFscGhhPyA/IHJnYmFfc3RyIDogaGV4X3N0cgorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBjb2xvcidzIG5hbWUsIGlmIGl0IGhhcyBvbmUuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nLCBuaWxdCisgICAgZGVmIG5hbWUKKyAgICAgIENPTE9SX05BTUVTX1JFVkVSU0VbcmdiYV0KKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBzbWFsbGVzdAorICAgICAgc21hbGxfZXhwbGljaXRfc3RyID0gYWxwaGE/ID8gcmdiYV9zdHIgOiBoZXhfc3RyLmdzdWIoL14jKC4pXDEoLilcMiguKVwzJC8sICcjXDFcMlwzJykKKyAgICAgIFtyZXByZXNlbnRhdGlvbiwgQ09MT1JfTkFNRVNfUkVWRVJTRVtyZ2JhXSwgc21hbGxfZXhwbGljaXRfc3RyXS4KKyAgICAgICAgICBjb21wYWN0Lm1pbl9ieSB7fHN0cnwgc3RyLnNpemV9CisgICAgZW5kCisKKyAgICBkZWYgcmdiYV9zdHIKKyAgICAgIHNwbGl0ID0gb3B0aW9uc1s6c3R5bGVdID09IDpjb21wcmVzc2VkID8gJywnIDogJywgJworICAgICAgInJnYmEoI3tyZ2Iuam9pbihzcGxpdCl9I3tzcGxpdH0je051bWJlci5yb3VuZChhbHBoYSl9KSIKKyAgICBlbmQKKworICAgIGRlZiBoZXhfc3RyCisgICAgICByZWQsIGdyZWVuLCBibHVlID0gcmdiLm1hcCB7fG51bXwgbnVtLnRvX3MoMTYpLnJqdXN0KDIsICcwJyl9CisgICAgICAiIyN7cmVkfSN7Z3JlZW59I3tibHVlfSIKKyAgICBlbmQKKworICAgIGRlZiBvcGVyYXRpb25fbmFtZShvcGVyYXRpb24pCisgICAgICBjYXNlIG9wZXJhdGlvbgorICAgICAgd2hlbiA6KworICAgICAgICAiYWRkIgorICAgICAgd2hlbiA6LQorICAgICAgICAic3VidHJhY3QiCisgICAgICB3aGVuIDoqCisgICAgICAgICJtdWx0aXBseSIKKyAgICAgIHdoZW4gOi8KKyAgICAgICAgImRpdmlkZSIKKyAgICAgIHdoZW4gOiUKKyAgICAgICAgIm1vZHVsbyIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHBpZWNld2lzZShvdGhlciwgb3BlcmF0aW9uKQorICAgICAgb3RoZXJfbnVtID0gb3RoZXIuaXNfYT8gTnVtYmVyCisgICAgICBpZiBvdGhlcl9udW0gJiYgIW90aGVyLnVuaXRsZXNzPworICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoCisgICAgICAgICAgIkNhbm5vdCAje29wZXJhdGlvbl9uYW1lKG9wZXJhdGlvbil9IGEgbnVtYmVyIHdpdGggdW5pdHMgKCN7b3RoZXJ9KSB0byBhIGNvbG9yICgje3NlbGZ9KS4iCisgICAgICAgICkKKyAgICAgIGVuZAorCisgICAgICByZXN1bHQgPSBbXQorICAgICAgKDAuLi4zKS5lYWNoIGRvIHxpfAorICAgICAgICByZXMgPSByZ2JbaV0udG9fZi5zZW5kKG9wZXJhdGlvbiwgb3RoZXJfbnVtID8gb3RoZXIudmFsdWUgOiBvdGhlci5yZ2JbaV0pCisgICAgICAgIHJlc3VsdFtpXSA9IFtbcmVzLCAyNTVdLm1pbiwgMF0ubWF4CisgICAgICBlbmQKKworICAgICAgaWYgIW90aGVyX251bSAmJiBvdGhlci5hbHBoYSAhPSBhbHBoYQorICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIkFscGhhIGNoYW5uZWxzIG11c3QgYmUgZXF1YWw6ICN7c2VsZn0gI3tvcGVyYXRpb259ICN7b3RoZXJ9IikKKyAgICAgIGVuZAorCisgICAgICB3aXRoKDpyZWQgPT4gcmVzdWx0WzBdLCA6Z3JlZW4gPT4gcmVzdWx0WzFdLCA6Ymx1ZSA9PiByZXN1bHRbMl0pCisgICAgZW5kCisKKyAgICBkZWYgaHNsX3RvX3JnYiEKKyAgICAgIHJldHVybiBpZiBAYXR0cnNbOnJlZF0gJiYgQGF0dHJzWzpibHVlXSAmJiBAYXR0cnNbOmdyZWVuXQorCisgICAgICBoID0gQGF0dHJzWzpodWVdIC8gMzYwLjAKKyAgICAgIHMgPSBAYXR0cnNbOnNhdHVyYXRpb25dIC8gMTAwLjAKKyAgICAgIGwgPSBAYXR0cnNbOmxpZ2h0bmVzc10gLyAxMDAuMAorCisgICAgICAjIEFsZ29yaXRobSBmcm9tIHRoZSBDU1MzIHNwZWM6IGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvI2hzbC1jb2xvci4KKyAgICAgIG0yID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHMKKyAgICAgIG0xID0gbCAqIDIgLSBtMgorICAgICAgQGF0dHJzWzpyZWRdLCBAYXR0cnNbOmdyZWVuXSwgQGF0dHJzWzpibHVlXSA9IFsKKyAgICAgICAgaHVlX3RvX3JnYihtMSwgbTIsIGggKyAxLjAgLyAzKSwKKyAgICAgICAgaHVlX3RvX3JnYihtMSwgbTIsIGgpLAorICAgICAgICBodWVfdG9fcmdiKG0xLCBtMiwgaCAtIDEuMCAvIDMpCisgICAgICBdLm1hcCB7fGN8IFNhc3M6OlV0aWwucm91bmQoYyAqIDB4ZmYpfQorICAgIGVuZAorCisgICAgZGVmIGh1ZV90b19yZ2IobTEsIG0yLCBoKQorICAgICAgaCArPSAxIGlmIGggPCAwCisgICAgICBoIC09IDEgaWYgaCA+IDEKKyAgICAgIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggKiA2IGlmIGggKiA2IDwgMQorICAgICAgcmV0dXJuIG0yIGlmIGggKiAyIDwgMQorICAgICAgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIuMCAvIDMgLSBoKSAqIDYgaWYgaCAqIDMgPCAyCisgICAgICBtMQorICAgIGVuZAorCisgICAgZGVmIHJnYl90b19oc2whCisgICAgICByZXR1cm4gaWYgQGF0dHJzWzpodWVdICYmIEBhdHRyc1s6c2F0dXJhdGlvbl0gJiYgQGF0dHJzWzpsaWdodG5lc3NdCisgICAgICByLCBnLCBiID0gWzpyZWQsIDpncmVlbiwgOmJsdWVdLm1hcCB7fGt8IEBhdHRyc1trXSAvIDI1NS4wfQorCisgICAgICAjIEFsZ29yaXRobSBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSFNMX2FuZF9IU1YjQ29udmVyc2lvbl9mcm9tX1JHQl90b19IU0xfb3JfSFNWCisgICAgICBtYXggPSBbciwgZywgYl0ubWF4CisgICAgICBtaW4gPSBbciwgZywgYl0ubWluCisgICAgICBkID0gbWF4IC0gbWluCisKKyAgICAgIGggPQorICAgICAgICBjYXNlIG1heAorICAgICAgICB3aGVuIG1pbjsgMAorICAgICAgICB3aGVuIHI7IDYwICogKGcgLSBiKSAvIGQKKyAgICAgICAgd2hlbiBnOyA2MCAqIChiIC0gcikgLyBkICsgMTIwCisgICAgICAgIHdoZW4gYjsgNjAgKiAociAtIGcpIC8gZCArIDI0MAorICAgICAgICBlbmQKKworICAgICAgbCA9IChtYXggKyBtaW4pIC8gMi4wCisKKyAgICAgIHMgPQorICAgICAgICBpZiBtYXggPT0gbWluCisgICAgICAgICAgMAorICAgICAgICBlbHNpZiBsIDwgMC41CisgICAgICAgICAgZCAvICgyICogbCkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGQgLyAoMiAtIDIgKiBsKQorICAgICAgICBlbmQKKworICAgICAgQGF0dHJzWzpodWVdID0gaCAlIDM2MAorICAgICAgQGF0dHJzWzpzYXR1cmF0aW9uXSA9IHMgKiAxMDAKKyAgICAgIEBhdHRyc1s6bGlnaHRuZXNzXSA9IGwgKiAxMDAKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL2Z1bmN0aW9uLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvZnVuY3Rpb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmNTlhMgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL2Z1bmN0aW9uLnJiCkBAIC0wLDAgKzEsMTkgQEAKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlZhbHVlCisgICMgQSBTYXNzU2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgYSBmdW5jdGlvbi4KKyAgY2xhc3MgRnVuY3Rpb24gPCBDYWxsYWJsZQorICAgICMgQ29uc3RydWN0cyBhIEZ1bmN0aW9uIHZhbHVlIGZvciB1c2UgaW4gU2Fzc1NjcmlwdC4KKyAgICAjCisgICAgIyBAcGFyYW0gZnVuY3Rpb24gW1Nhc3M6OkNhbGxhYmxlXSBUaGUgY2FsbGFibGUgdG8gYmUgdXNlZCB3aGVuIHRoZQorICAgICMgZnVuY3Rpb24gaXMgaW52b2tlZC4KKyAgICBkZWYgaW5pdGlhbGl6ZShmdW5jdGlvbikKKyAgICAgIHVubGVzcyBmdW5jdGlvbi50eXBlID09ICJmdW5jdGlvbiIKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIkEgY2FsbGFibGUgb2YgdHlwZSBmdW5jdGlvbiB3YXMgZXhwZWN0ZWQuIikKKyAgICAgIGVuZAorICAgICAgc3VwZXIKKyAgICBlbmQKKworICAgIGRlZiB0b19zYXNzCisgICAgICAle2dldC1mdW5jdGlvbigiI3t2YWx1ZS5uYW1lfSIpfQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvaGVscGVycy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL2hlbHBlcnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyMTZjNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL2hlbHBlcnMucmIKQEAgLTAsMCArMSwyOTIgQEAKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlZhbHVlCisgICMgUHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgc2FzcyB2YWx1ZXMgZnJvbSB3aXRoaW4gcnVieSBtZXRob2RzLgorICAjIEBzaW5jZSBgMy4zLjBgCisgICMgQGNvbW1lbnQKKyAgIyAgIHJ1Ym9jb3A6ZGlzYWJsZSBNb2R1bGVMZW5ndGgKKyAgbW9kdWxlIEhlbHBlcnMKKyAgICAjIENvbnN0cnVjdCBhIFNhc3MgQm9vbGVhbi4KKyAgICAjCisgICAgIyBAcGFyYW0gdmFsdWUgW09iamVjdF0gQSBydWJ5IG9iamVjdCB0aGF0IHdpbGwgYmUgdGVzdGVkIGZvciB0cnV0aGluZXNzLgorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbF0gd2hldGhlciB0aGUgcnVieSB2YWx1ZSBpcyB0cnV0aHkuCisgICAgZGVmIGJvb2wodmFsdWUpCisgICAgICBCb29sLm5ldyh2YWx1ZSkKKyAgICBlbmQKKworICAgICMgQ29uc3RydWN0IGEgU2FzcyBDb2xvciBmcm9tIGEgaGV4IGNvbG9yIHN0cmluZy4KKyAgICAjCisgICAgIyBAcGFyYW0gdmFsdWUgWzo6U3RyaW5nXSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBoZXggY29sb3IuCisgICAgIyAgIFRoZSBsZWFkaW5nIGhhc2ggKCIjIikgaXMgb3B0aW9uYWwuCisgICAgIyBAcGFyYW0gYWxwaGEgWzo6TnVtYmVyXSBUaGUgYWxwaGEgY2hhbm5lbC4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLgorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdIHRoZSBjb2xvciBvYmplY3QKKyAgICBkZWYgaGV4X2NvbG9yKHZhbHVlLCBhbHBoYSA9IG5pbCkKKyAgICAgIENvbG9yLmZyb21faGV4KHZhbHVlLCBhbHBoYSkKKyAgICBlbmQKKworICAgICMgQ29uc3RydWN0IGEgU2FzcyBDb2xvciBmcm9tIGhzbCB2YWx1ZXMuCisgICAgIworICAgICMgQHBhcmFtIGh1ZSBbOjpOdW1iZXJdIFRoZSBodWUgb2YgdGhlIGNvbG9yIGluIGRlZ3JlZXMuCisgICAgIyAgIEEgbm9uLW5lZ2F0aXZlIG51bWJlciwgdXN1YWxseSBsZXNzIHRoYW4gMzYwLgorICAgICMgQHBhcmFtIHNhdHVyYXRpb24gWzo6TnVtYmVyXSBUaGUgc2F0dXJhdGlvbiBvZiB0aGUgY29sb3IuCisgICAgIyAgIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAgaW5jbHVzaXZlLgorICAgICMgQHBhcmFtIGxpZ2h0bmVzcyBbOjpOdW1iZXJdIFRoZSBsaWdodG5lc3Mgb2YgdGhlIGNvbG9yLgorICAgICMgICBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwIGluY2x1c2l2ZS4KKyAgICAjIEBwYXJhbSBhbHBoYSBbOjpOdW1iZXJdIFRoZSBhbHBoYSBjaGFubmVsLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuCisgICAgIworICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3JdIHRoZSBjb2xvciBvYmplY3QKKyAgICBkZWYgaHNsX2NvbG9yKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCBhbHBoYSA9IG5pbCkKKyAgICAgIGF0dHJzID0gezpodWUgPT4gaHVlLCA6c2F0dXJhdGlvbiA9PiBzYXR1cmF0aW9uLCA6bGlnaHRuZXNzID0+IGxpZ2h0bmVzc30KKyAgICAgIGF0dHJzWzphbHBoYV0gPSBhbHBoYSBpZiBhbHBoYQorICAgICAgQ29sb3IubmV3KGF0dHJzKQorICAgIGVuZAorCisgICAgIyBDb25zdHJ1Y3QgYSBTYXNzIENvbG9yIGZyb20gcmdiIHZhbHVlcy4KKyAgICAjCisgICAgIyBAcGFyYW0gcmVkIFs6Ok51bWJlcl0gVGhlIHJlZCBjb21wb25lbnQuIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUgaW5jbHVzaXZlLgorICAgICMgQHBhcmFtIGdyZWVuIFs6Ok51bWJlcl0gVGhlIGdyZWVuIGNvbXBvbmVudC4gTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSBpbmNsdXNpdmUuCisgICAgIyBAcGFyYW0gYmx1ZSBbOjpOdW1iZXJdIFRoZSBibHVlIGNvbXBvbmVudC4gTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSBpbmNsdXNpdmUuCisgICAgIyBAcGFyYW0gYWxwaGEgWzo6TnVtYmVyXSBUaGUgYWxwaGEgY2hhbm5lbC4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yXSB0aGUgY29sb3Igb2JqZWN0CisgICAgZGVmIHJnYl9jb2xvcihyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSA9IG5pbCkKKyAgICAgIGF0dHJzID0gezpyZWQgPT4gcmVkLCA6Z3JlZW4gPT4gZ3JlZW4sIDpibHVlID0+IGJsdWV9CisgICAgICBhdHRyc1s6YWxwaGFdID0gYWxwaGEgaWYgYWxwaGEKKyAgICAgIENvbG9yLm5ldyhhdHRycykKKyAgICBlbmQKKworICAgICMgQ29uc3RydWN0IGEgU2FzcyBOdW1iZXIgZnJvbSBhIHJ1YnkgbnVtYmVyLgorICAgICMKKyAgICAjIEBwYXJhbSBudW1iZXIgWzo6TnVtYmVyXSBBIG51bWVyaWMgdmFsdWUuCisgICAgIyBAcGFyYW0gdW5pdF9zdHJpbmcgWzo6U3RyaW5nXSBBIHVuaXQgc3RyaW5nIG9mIHRoZSBmb3JtCisgICAgIyAgIGBudW1lcmFsX3VuaXQxICogbnVtZXJhbF91bml0MiAuLi4gLyBkZW5vbWluYXRvcl91bml0MSAqIGRlbm9taW5hdG9yX3VuaXQyIC4uLmAKKyAgICAjICAgdGhpcyBpcyB0aGUgc2FtZSBmb3JtYXQgdGhhdCBpcyByZXR1cm5lZCBieQorICAgICMgICB7U2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyI3VuaXRfc3RyIHRoZSBgdW5pdF9zdHJgIG1ldGhvZH0KKyAgICAjCisgICAgIyBAc2VlIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlciN1bml0X3N0cgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIHNhc3MgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gcnVieSBudW1iZXIuCisgICAgZGVmIG51bWJlcihudW1iZXIsIHVuaXRfc3RyaW5nID0gbmlsKQorICAgICAgTnVtYmVyLm5ldyhudW1iZXIsICpwYXJzZV91bml0X3N0cmluZyh1bml0X3N0cmluZykpCisgICAgZW5kCisKKyAgICAjIEBvdmVybG9hZCBsaXN0KCplbGVtZW50cywgc2VwYXJhdG9yOiwgYnJhY2tldGVkOiBmYWxzZSkKKyAgICAjICAgQ3JlYXRlIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QgZnJvbSB0aGUgYXJndW1lbnRzIGdpdmVuLgorICAgICMgICBAcGFyYW0gZWxlbWVudHMgW0FycmF5PFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2U+XSBFYWNoIGFyZ3VtZW50IHdpbGwgYmUgYSBsaXN0IGVsZW1lbnQuCisgICAgIyAgIEBwYXJhbSBzZXBhcmF0b3IgW1N5bWJvbF0gRWl0aGVyIDpzcGFjZSBvciA6Y29tbWEuCisgICAgIyAgIEBwYXJhbSBicmFja2V0ZWQgW0Jvb2xlYW5dIFdoZXRoZXIgdGhlIGxpc3QgdXNlcyBzcXVhcmUgYnJhY2tldHMuCisgICAgIyAgIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdIFRoZSBzcGFjZSBzZXBhcmF0ZWQgbGlzdC4KKyAgICAjCisgICAgIyBAb3ZlcmxvYWQgbGlzdChhcnJheSwgc2VwYXJhdG9yOiwgYnJhY2tldGVkOiBmYWxzZSkKKyAgICAjICAgQ3JlYXRlIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QgZnJvbSB0aGUgYXJyYXkgZ2l2ZW4uCisgICAgIyAgIEBwYXJhbSBhcnJheSBbQXJyYXk8U2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZT5dIEEgcnVieSBhcnJheSBvZiBTYXNzIHZhbHVlcworICAgICMgICAgIHRvIG1ha2UgaW50byBhIGxpc3QuCisgICAgIyAgIEBwYXJhbSBzZXBhcmF0b3IgW1N5bWJvbF0gRWl0aGVyIDpzcGFjZSBvciA6Y29tbWEuCisgICAgIyAgIEBwYXJhbSBicmFja2V0ZWQgW0Jvb2xlYW5dIFdoZXRoZXIgdGhlIGxpc3QgdXNlcyBzcXVhcmUgYnJhY2tldHMuCisgICAgIyAgIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdIFRoZSBzcGFjZSBzZXBhcmF0ZWQgbGlzdC4KKyAgICBkZWYgbGlzdCgqZWxlbWVudHMsIHNlcGFyYXRvcjogbmlsLCBicmFja2V0ZWQ6IGZhbHNlKQorICAgICAgIyBTdXBwb3J0IHBhc3Npbmcgc2VwYXJhdG9yIGFzIHRoZSBsYXN0IHZhbHVlIGluIGVsZW1lbnRzIGZvcgorICAgICAgIyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KKyAgICAgIGlmIHNlcGFyYXRvci5uaWw/CisgICAgICAgIGlmIGVsZW1lbnRzLmxhc3QuaXNfYT8oU3ltYm9sKQorICAgICAgICAgIHNlcGFyYXRvciA9IGVsZW1lbnRzLnBvcAorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIkEgc2VwYXJhdG9yIG9mIDpzcGFjZSBvciA6Y29tbWEgbXVzdCBiZSBzcGVjaWZpZWQuIikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgaWYgZWxlbWVudHMuc2l6ZSA9PSAxICYmIGVsZW1lbnRzLmZpcnN0LmlzX2E/KEFycmF5KQorICAgICAgICBlbGVtZW50cyA9IGVsZW1lbnRzLmZpcnN0CisgICAgICBlbmQKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3QubmV3KGVsZW1lbnRzLCBzZXBhcmF0b3I6IHNlcGFyYXRvciwgYnJhY2tldGVkOiBicmFja2V0ZWQpCisgICAgZW5kCisKKyAgICAjIENvbnN0cnVjdCBhIFNhc3MgbWFwLgorICAgICMKKyAgICAjIEBwYXJhbSBoYXNoIFtIYXNoPFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2UsCisgICAgIyAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2U+XSBBIFJ1YnkgbWFwIHRvIGNvbnZlcnQgdG8gYSBTYXNzIG1hcC4KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok1hcF0gVGhlIG1hcC4KKyAgICBkZWYgbWFwKGhhc2gpCisgICAgICBNYXAubmV3KGhhc2gpCisgICAgZW5kCisKKyAgICAjIENyZWF0ZSBhIHNhc3MgbnVsbCB2YWx1ZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdWxsXQorICAgIGRlZiBudWxsCisgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdWxsLm5ldworICAgIGVuZAorCisgICAgIyBDcmVhdGUgYSBxdW90ZWQgc3RyaW5nLgorICAgICMKKyAgICAjIEBwYXJhbSBzdHIgWzo6U3RyaW5nXSBBIHJ1Ynkgc3RyaW5nLgorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nXSBBIHF1b3RlZCBzdHJpbmcuCisgICAgZGVmIHF1b3RlZF9zdHJpbmcoc3RyKQorICAgICAgU2Fzczo6U2NyaXB0OjpTdHJpbmcubmV3KHN0ciwgOnN0cmluZykKKyAgICBlbmQKKworICAgICMgQ3JlYXRlIGFuIHVucXVvdGVkIHN0cmluZy4KKyAgICAjCisgICAgIyBAcGFyYW0gc3RyIFs6OlN0cmluZ10gQSBydWJ5IHN0cmluZy4KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZ10gQW4gdW5xdW90ZWQgc3RyaW5nLgorICAgIGRlZiB1bnF1b3RlZF9zdHJpbmcoc3RyKQorICAgICAgU2Fzczo6U2NyaXB0OjpTdHJpbmcubmV3KHN0ciwgOmlkZW50aWZpZXIpCisgICAgZW5kCisgICAgYWxpYXNfbWV0aG9kIDppZGVudGlmaWVyLCA6dW5xdW90ZWRfc3RyaW5nCisKKyAgICAjIFBhcnNlcyBhIHVzZXItcHJvdmlkZWQgc2VsZWN0b3IuCisgICAgIworICAgICMgQHBhcmFtIHZhbHVlIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3RdCisgICAgIyAgIFRoZSBzZWxlY3RvciB0byBwYXJzZS4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nLCBhIGxpc3Qgb2YKKyAgICAjICAgc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgYXMgcmV0dXJuZWQgYnkgYCZgLgorICAgICMgQHBhcmFtIG5hbWUgW1N5bWJvbCwgbmlsXQorICAgICMgICBJZiBwcm92aWRlZCwgdGhlIG5hbWUgb2YgdGhlIHNlbGVjdG9yIGFyZ3VtZW50LiBUaGlzIGlzIHVzZWQKKyAgICAjICAgZm9yIGVycm9yIHJlcG9ydGluZy4KKyAgICAjIEBwYXJhbSBhbGxvd19wYXJlbnRfcmVmIFtCb29sZWFuXQorICAgICMgICBXaGV0aGVyIHRoZSBwYXJzZWQgc2VsZWN0b3Igc2hvdWxkIGFsbG93IHBhcmVudCByZWZlcmVuY2VzLgorICAgICMgQHJldHVybiBbU2Fzczo6U2VsZWN0b3I6OkNvbW1hU2VxdWVuY2VdIFRoZSBwYXJzZWQgc2VsZWN0b3IuCisgICAgIyBAdGhyb3cgW0FyZ3VtZW50RXJyb3JdIGlmIHRoZSBwYXJzZSBmYWlsZWQgZm9yIGFueSByZWFzb24uCisgICAgZGVmIHBhcnNlX3NlbGVjdG9yKHZhbHVlLCBuYW1lID0gbmlsLCBhbGxvd19wYXJlbnRfcmVmID0gZmFsc2UpCisgICAgICBzdHIgPSBub3JtYWxpemVfc2VsZWN0b3IodmFsdWUsIG5hbWUpCisgICAgICBiZWdpbgorICAgICAgICBTYXNzOjpTQ1NTOjpTdGF0aWNQYXJzZXIubmV3KHN0ciwgbmlsLCBuaWwsIDEsIDEsIGFsbG93X3BhcmVudF9yZWYpLnBhcnNlX3NlbGVjdG9yCisgICAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgICAgICBlcnIgPSAiI3t2YWx1ZS5pbnNwZWN0fSBpcyBub3QgYSB2YWxpZCBzZWxlY3RvcjogI3tlfSIKKyAgICAgICAgZXJyID0gIiQje25hbWUudG9fcy50cignXycsICctJyl9OiAje2Vycn0iIGlmIG5hbWUKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoZXJyKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFBhcnNlcyBhIHVzZXItcHJvdmlkZWQgY29tcGxleCBzZWxlY3Rvci4KKyAgICAjCisgICAgIyBBIGNvbXBsZXggc2VsZWN0b3IgY2FuIGNvbnRhaW4gY29tYmluYXRvcnMgYnV0IGNhbm5vdCBjb250YWluIGNvbW1hcy4KKyAgICAjCisgICAgIyBAcGFyYW0gdmFsdWUgW1Nhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZywgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdF0KKyAgICAjICAgVGhlIHNlbGVjdG9yIHRvIHBhcnNlLiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBsaXN0IG9mCisgICAgIyAgIHN0cmluZ3MuCisgICAgIyBAcGFyYW0gbmFtZSBbU3ltYm9sLCBuaWxdCisgICAgIyAgIElmIHByb3ZpZGVkLCB0aGUgbmFtZSBvZiB0aGUgc2VsZWN0b3IgYXJndW1lbnQuIFRoaXMgaXMgdXNlZAorICAgICMgICBmb3IgZXJyb3IgcmVwb3J0aW5nLgorICAgICMgQHBhcmFtIGFsbG93X3BhcmVudF9yZWYgW0Jvb2xlYW5dCisgICAgIyAgIFdoZXRoZXIgdGhlIHBhcnNlZCBzZWxlY3RvciBzaG91bGQgYWxsb3cgcGFyZW50IHJlZmVyZW5jZXMuCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTZWxlY3Rvcjo6U2VxdWVuY2VdIFRoZSBwYXJzZWQgc2VsZWN0b3IuCisgICAgIyBAdGhyb3cgW0FyZ3VtZW50RXJyb3JdIGlmIHRoZSBwYXJzZSBmYWlsZWQgZm9yIGFueSByZWFzb24uCisgICAgZGVmIHBhcnNlX2NvbXBsZXhfc2VsZWN0b3IodmFsdWUsIG5hbWUgPSBuaWwsIGFsbG93X3BhcmVudF9yZWYgPSBmYWxzZSkKKyAgICAgIHNlbGVjdG9yID0gcGFyc2Vfc2VsZWN0b3IodmFsdWUsIG5hbWUsIGFsbG93X3BhcmVudF9yZWYpCisgICAgICByZXR1cm4gc2VxIGlmIHNlbGVjdG9yLm1lbWJlcnMubGVuZ3RoID09IDEKKworICAgICAgZXJyID0gIiN7dmFsdWUuaW5zcGVjdH0gaXMgbm90IGEgY29tcGxleCBzZWxlY3RvciIKKyAgICAgIGVyciA9ICIkI3tuYW1lLnRvX3MudHIoJ18nLCAnLScpfTogI3tlcnJ9IiBpZiBuYW1lCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldyhlcnIpCisgICAgZW5kCisKKyAgICAjIFBhcnNlcyBhIHVzZXItcHJvdmlkZWQgY29tcG91bmQgc2VsZWN0b3IuCisgICAgIworICAgICMgQSBjb21wb3VuZCBzZWxlY3RvciBjYW5ub3QgY29udGFpbiBjb21iaW5hdG9ycyBvciBjb21tYXMuCisgICAgIworICAgICMgQHBhcmFtIHZhbHVlIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmddIFRoZSBzZWxlY3RvciB0byBwYXJzZS4KKyAgICAjIEBwYXJhbSBuYW1lIFtTeW1ib2wsIG5pbF0KKyAgICAjICAgSWYgcHJvdmlkZWQsIHRoZSBuYW1lIG9mIHRoZSBzZWxlY3RvciBhcmd1bWVudC4gVGhpcyBpcyB1c2VkCisgICAgIyAgIGZvciBlcnJvciByZXBvcnRpbmcuCisgICAgIyBAcGFyYW0gYWxsb3dfcGFyZW50X3JlZiBbQm9vbGVhbl0KKyAgICAjICAgV2hldGhlciB0aGUgcGFyc2VkIHNlbGVjdG9yIHNob3VsZCBhbGxvdyBwYXJlbnQgcmVmZXJlbmNlcy4KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNlbGVjdG9yOjpTaW1wbGVTZXF1ZW5jZV0gVGhlIHBhcnNlZCBzZWxlY3Rvci4KKyAgICAjIEB0aHJvdyBbQXJndW1lbnRFcnJvcl0gaWYgdGhlIHBhcnNlIGZhaWxlZCBmb3IgYW55IHJlYXNvbi4KKyAgICBkZWYgcGFyc2VfY29tcG91bmRfc2VsZWN0b3IodmFsdWUsIG5hbWUgPSBuaWwsIGFsbG93X3BhcmVudF9yZWYgPSBmYWxzZSkKKyAgICAgIGFzc2VydF90eXBlIHZhbHVlLCA6U3RyaW5nLCBuYW1lCisgICAgICBzZWxlY3RvciA9IHBhcnNlX3NlbGVjdG9yKHZhbHVlLCBuYW1lLCBhbGxvd19wYXJlbnRfcmVmKQorICAgICAgc2VxID0gc2VsZWN0b3IubWVtYmVycy5maXJzdAorICAgICAgc3NlcSA9IHNlcS5tZW1iZXJzLmZpcnN0CisgICAgICBpZiBzZWxlY3Rvci5tZW1iZXJzLmxlbmd0aCA9PSAxICYmIHNlcS5tZW1iZXJzLmxlbmd0aCA9PSAxICYmCisgICAgICAgICAgc3NlcS5pc19hPyhTYXNzOjpTZWxlY3Rvcjo6U2ltcGxlU2VxdWVuY2UpCisgICAgICAgIHJldHVybiBzc2VxCisgICAgICBlbmQKKworICAgICAgZXJyID0gIiN7dmFsdWUuaW5zcGVjdH0gaXMgbm90IGEgY29tcG91bmQgc2VsZWN0b3IiCisgICAgICBlcnIgPSAiJCN7bmFtZS50b19zLnRyKCdfJywgJy0nKX06ICN7ZXJyfSIgaWYgbmFtZQorICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoZXJyKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRydWUgd2hlbiB0aGUgbGl0ZXJhbCBpcyBhIHN0cmluZyBjb250YWluaW5nIGEgY2FsYygpLgorICAgICMKKyAgICAjIFVzZSBceyNzcGVjaWFsX251bWJlcj99IGluIHByZWZlcmVuY2UgdG8gdGhpcy4KKyAgICAjCisgICAgIyBAcGFyYW0gbGl0ZXJhbCBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZV0gVGhlIHZhbHVlIHRvIGNoZWNrCisgICAgIyBAcmV0dXJuIEJvb2xlYW4KKyAgICBkZWYgY2FsYz8obGl0ZXJhbCkKKyAgICAgIGxpdGVyYWwuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nKSAmJiBsaXRlcmFsLnZhbHVlID1+IC9jYWxjXCgvCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgd2hldGhlciB0aGUgbGl0ZXJhbCBpcyBhIHNwZWNpYWwgQ1NTIHZhbHVlIHRoYXQgbWF5IGV2YWx1YXRlIHRvIGEKKyAgICAjIG51bWJlciwgc3VjaCBhcyBgY2FsYygpYCBvciBgdmFyKClgLgorICAgICMKKyAgICAjIEBwYXJhbSBsaXRlcmFsIFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlXSBUaGUgdmFsdWUgdG8gY2hlY2sKKyAgICAjIEByZXR1cm4gQm9vbGVhbgorICAgIGRlZiBzcGVjaWFsX251bWJlcj8obGl0ZXJhbCkKKyAgICAgIGxpdGVyYWwuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nKSAmJiBsaXRlcmFsLnZhbHVlID1+IC8oY2FsY3x2YXIpXCgvCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICAjIENvbnZlcnRzIGEgdXNlci1wcm92aWRlZCBzZWxlY3RvciBpbnRvIHN0cmluZyBmb3JtIG9yIHRocm93cyBhbgorICAgICMgQXJndW1lbnRFcnJvciBpZiBpdCdzIGluIGFuIGludmFsaWQgZm9ybWF0LgorICAgIGRlZiBub3JtYWxpemVfc2VsZWN0b3IodmFsdWUsIG5hbWUpCisgICAgICBpZiAoc3RyID0gc2VsZWN0b3JfdG9fc3RyKHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHN0cgorICAgICAgZW5kCisKKyAgICAgIGVyciA9ICIje3ZhbHVlLmluc3BlY3R9IGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yOiBpdCBtdXN0IGJlIGEgc3RyaW5nLFxuIiArCisgICAgICAgICJhIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MiCisgICAgICBlcnIgPSAiJCN7bmFtZS50b19zLnRyKCdfJywgJy0nKX06ICN7ZXJyfSIgaWYgbmFtZQorICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoZXJyKQorICAgIGVuZAorCisgICAgIyBDb252ZXJ0cyBhIHVzZXItcHJvdmlkZWQgc2VsZWN0b3IgaW50byBzdHJpbmcgZm9ybSBvciByZXR1cm5zCisgICAgIyBgbmlsYCBpZiBpdCdzIGluIGFuIGludmFsaWQgZm9ybWF0LgorICAgIGRlZiBzZWxlY3Rvcl90b19zdHIodmFsdWUpCisgICAgICByZXR1cm4gdmFsdWUudmFsdWUgaWYgdmFsdWUuaXNfYT8oU2Fzczo6U2NyaXB0OjpTdHJpbmcpCisgICAgICByZXR1cm4gdW5sZXNzIHZhbHVlLmlzX2E/KFNhc3M6OlNjcmlwdDo6TGlzdCkKKworICAgICAgaWYgdmFsdWUuc2VwYXJhdG9yID09IDpjb21tYQorICAgICAgICByZXR1cm4gdmFsdWUudG9fYS5tYXAgZG8gfGNvbXBsZXh8CisgICAgICAgICAgbmV4dCBjb21wbGV4LnZhbHVlIGlmIGNvbXBsZXguaXNfYT8oU2Fzczo6U2NyaXB0OjpTdHJpbmcpCisgICAgICAgICAgcmV0dXJuIHVubGVzcyBjb21wbGV4LmlzX2E/KFNhc3M6OlNjcmlwdDo6TGlzdCkgJiYgY29tcGxleC5zZXBhcmF0b3IgPT0gOnNwYWNlCisgICAgICAgICAgcmV0dXJuIHVubGVzcyAoc3RyID0gc2VsZWN0b3JfdG9fc3RyKGNvbXBsZXgpKQorICAgICAgICAgIHN0cgorICAgICAgICBlbmQuam9pbignLCAnKQorICAgICAgZW5kCisKKyAgICAgIHZhbHVlLnRvX2EubWFwIGRvIHxjb21wb3VuZHwKKyAgICAgICAgcmV0dXJuIHVubGVzcyBjb21wb3VuZC5pc19hPyhTYXNzOjpTY3JpcHQ6OlN0cmluZykKKyAgICAgICAgY29tcG91bmQudmFsdWUKKyAgICAgIGVuZC5qb2luKCcgJykKKyAgICBlbmQKKworICAgICMgQHByaXZhdGUKKyAgICBWQUxJRF9VTklUID0gLyN7U2Fzczo6U0NTUzo6Ulg6Ok5NU1RBUlR9I3tTYXNzOjpTQ1NTOjpSWDo6Tk1DSEFSfXwlKi8KKworICAgICMgQGV4YW1wbGUKKyAgICAjICAgcGFyc2VfdW5pdF9zdHJpbmcoImVtKnB4L2luKiUiKSAjID0+IFtbImVtIiwgInB4XSwgWyJpbiIsICIlIl1dCisgICAgIworICAgICMgQHBhcmFtIHVuaXRfc3RyaW5nIFtTdHJpbmddIEEgc3RyaW5nIGFkaGVyaW5nIHRvIHRoZSBvdXRwdXQgb2YgYSBudW1iZXIgd2l0aCBjb21wbGV4CisgICAgIyAgIHVuaXRzLiBFLmcuICJlbSpweC9pbiolIgorICAgICMgQHJldHVybiBbQXJyYXk8QXJyYXk8U3RyaW5nPj5dIEEgbGlzdCBvZiBudW1lcmF0b3IgdW5pdHMgYW5kIGEgbGlzdCBvZiBkZW5vbWluYXRvciB1bml0cy4KKyAgICBkZWYgcGFyc2VfdW5pdF9zdHJpbmcodW5pdF9zdHJpbmcpCisgICAgICBkZW5vbWluYXRvcl91bml0cyA9IG51bWVyYXRvcl91bml0cyA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcjo6Tk9fVU5JVFMKKyAgICAgIHJldHVybiBudW1lcmF0b3JfdW5pdHMsIGRlbm9taW5hdG9yX3VuaXRzIHVubGVzcyB1bml0X3N0cmluZyAmJiB1bml0X3N0cmluZy5sZW5ndGggPiAwCisgICAgICBudW1fb3Zlcl9kZW5vbWluYXRvciA9IHVuaXRfc3RyaW5nLnNwbGl0KCVyeyAqLyAqfSkKKyAgICAgIHVubGVzcyAoMS4uMikuaW5jbHVkZT8obnVtX292ZXJfZGVub21pbmF0b3Iuc2l6ZSkKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIk1hbGZvcm1lZCB1bml0IHN0cmluZzogI3t1bml0X3N0cmluZ30iKQorICAgICAgZW5kCisgICAgICBudW1lcmF0b3JfdW5pdHMgPSBudW1fb3Zlcl9kZW5vbWluYXRvclswXS5zcGxpdCgvICpcKiAqLykKKyAgICAgIGRlbm9taW5hdG9yX3VuaXRzID0gKG51bV9vdmVyX2Rlbm9taW5hdG9yWzFdIHx8ICIiKS5zcGxpdCgvICpcKiAqLykKKyAgICAgIFtbbnVtZXJhdG9yX3VuaXRzLCAibnVtZXJhdG9yIl0sIFtkZW5vbWluYXRvcl91bml0cywgImRlbm9taW5hdG9yIl1dLmVhY2ggZG8gfHVuaXRzLCBuYW1lfAorICAgICAgICBpZiB1bml0X3N0cmluZyA9fiAlcnsvfSAmJiB1bml0cy5zaXplID09IDAKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiTWFsZm9ybWVkIHVuaXQgc3RyaW5nOiAje3VuaXRfc3RyaW5nfSIpCisgICAgICAgIGVuZAorICAgICAgICBpZiB1bml0cy5hbnk/IHt8dW5pdHwgdW5pdCAhfiBWQUxJRF9VTklUfQorICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJNYWxmb3JtZWQgI3tuYW1lfSBpbiB1bml0IHN0cmluZzogI3t1bml0X3N0cmluZ30iKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgW251bWVyYXRvcl91bml0cywgZGVub21pbmF0b3JfdW5pdHNdCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9saXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvbGlzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODlmZGQwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvbGlzdC5yYgpAQCAtMCwwICsxLDEzNCBAQAorbW9kdWxlIFNhc3M6OlNjcmlwdDo6VmFsdWUKKyAgIyBBIFNhc3NTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyBhIENTUyBsaXN0LgorICAjIFRoaXMgaW5jbHVkZXMgYm90aCBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgYW5kIHNwYWNlLXNlcGFyYXRlZCBsaXN0cy4KKyAgY2xhc3MgTGlzdCA8IEJhc2UKKyAgICAjIFRoZSBSdWJ5IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFZhbHVlPl0KKyAgICBhdHRyX3JlYWRlciA6dmFsdWUKKyAgICBhbGlhc19tZXRob2QgOnRvX2EsIDp2YWx1ZQorCisgICAgIyBUaGUgb3BlcmF0b3Igc2VwYXJhdGluZyB0aGUgdmFsdWVzIG9mIHRoZSBsaXN0LgorICAgICMgRWl0aGVyIGA6Y29tbWFgIG9yIGA6c3BhY2VgLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N5bWJvbF0KKyAgICBhdHRyX3JlYWRlciA6c2VwYXJhdG9yCisKKyAgICAjIFdoZXRoZXIgdGhlIGxpc3QgaXMgc3Vycm91bmRlZCBieSBzcXVhcmUgYnJhY2tldHMuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBhdHRyX3JlYWRlciA6YnJhY2tldGVkCisKKyAgICAjIENyZWF0ZXMgYSBuZXcgbGlzdC4KKyAgICAjCisgICAgIyBAcGFyYW0gdmFsdWUgW0FycmF5PFZhbHVlPl0gU2VlIFx7I3ZhbHVlfQorICAgICMgQHBhcmFtIHNlcGFyYXRvciBbU3ltYm9sXSBTZWUgXHsjc2VwYXJhdG9yfQorICAgICMgQHBhcmFtIGJyYWNrZXRlZCBbQm9vbGVhbl0gU2VlIFx7I2JyYWNrZXRlZH0KKyAgICBkZWYgaW5pdGlhbGl6ZSh2YWx1ZSwgc2VwYXJhdG9yOiBuaWwsIGJyYWNrZXRlZDogZmFsc2UpCisgICAgICBzdXBlcih2YWx1ZSkKKyAgICAgIEBzZXBhcmF0b3IgPSBzZXBhcmF0b3IKKyAgICAgIEBicmFja2V0ZWQgPSBicmFja2V0ZWQKKyAgICBlbmQKKworICAgICMgQHNlZSBWYWx1ZSNvcHRpb25zPQorICAgIGRlZiBvcHRpb25zPShvcHRpb25zKQorICAgICAgc3VwZXIKKyAgICAgIHZhbHVlLmVhY2gge3x2fCB2Lm9wdGlvbnMgPSBvcHRpb25zfQorICAgIGVuZAorCisgICAgIyBAc2VlIFZhbHVlI2VxCisgICAgZGVmIGVxKG90aGVyKQorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Qm9vbC5uZXcoCisgICAgICAgIG90aGVyLmlzX2E/KExpc3QpICYmIHZhbHVlID09IG90aGVyLnZhbHVlICYmCisgICAgICAgIHNlcGFyYXRvciA9PSBvdGhlci5zZXBhcmF0b3IgJiYgYnJhY2tldGVkID09IG90aGVyLmJyYWNrZXRlZCkKKyAgICBlbmQKKworICAgIGRlZiBoYXNoCisgICAgICBAaGFzaCB8fD0gW3ZhbHVlLCBzZXBhcmF0b3IsIGJyYWNrZXRlZF0uaGFzaAorICAgIGVuZAorCisgICAgIyBAc2VlIFZhbHVlI3RvX3MKKyAgICBkZWYgdG9fcyhvcHRzID0ge30pCisgICAgICBpZiAhYnJhY2tldGVkICYmIHZhbHVlLmVtcHR5PworICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIiN7aW5zcGVjdH0gaXNuJ3QgYSB2YWxpZCBDU1MgdmFsdWUuIikKKyAgICAgIGVuZAorCisgICAgICBtZW1iZXJzID0gdmFsdWUuCisgICAgICAgIHJlamVjdCB7fGV8IGUuaXNfYT8oTnVsbCkgfHwgZS5pc19hPyhMaXN0KSAmJiBlLnZhbHVlLmVtcHR5P30uCisgICAgICAgIG1hcCB7fGV8IGUudG9fcyhvcHRzKX0KKworICAgICAgY29udGVudHMgPSBtZW1iZXJzLmpvaW4oc2VwX3N0cikKKyAgICAgIGJyYWNrZXRlZCA/ICJbI3tjb250ZW50c31dIiA6IGNvbnRlbnRzCisgICAgZW5kCisKKyAgICAjIEBzZWUgVmFsdWUjdG9fc2FzcworICAgIGRlZiB0b19zYXNzKG9wdHMgPSB7fSkKKyAgICAgIHJldHVybiBicmFja2V0ZWQgPyAiW10iIDogIigpIiBpZiB2YWx1ZS5lbXB0eT8KKyAgICAgIG1lbWJlcnMgPSB2YWx1ZS5tYXAgZG8gfHZ8CisgICAgICAgIGlmIGVsZW1lbnRfbmVlZHNfcGFyZW5zPyh2KQorICAgICAgICAgICIoI3t2LnRvX3Nhc3Mob3B0cyl9KSIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHYudG9fc2FzcyhvcHRzKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBpZiBzZXBhcmF0b3IgPT0gOmNvbW1hICYmIG1lbWJlcnMubGVuZ3RoID09IDEKKyAgICAgICAgcmV0dXJuICIje2JyYWNrZXRlZCA/ICdbJyA6ICcoJ30je21lbWJlcnMuZmlyc3R9LCN7YnJhY2tldGVkID8gJ10nIDogJyknfSIKKyAgICAgIGVuZAorCisgICAgICBjb250ZW50cyA9IG1lbWJlcnMuam9pbihzZXBfc3RyKG5pbCkpCisgICAgICBicmFja2V0ZWQgPyAiWyN7Y29udGVudHN9XSIgOiBjb250ZW50cworICAgIGVuZAorCisgICAgIyBAc2VlIFZhbHVlI3RvX2gKKyAgICBkZWYgdG9faAorICAgICAgcmV0dXJuIHt9IGlmIHZhbHVlLmVtcHR5PworICAgICAgc3VwZXIKKyAgICBlbmQKKworICAgICMgQHNlZSBWYWx1ZSNpbnNwZWN0CisgICAgZGVmIGluc3BlY3QKKyAgICAgIChicmFja2V0ZWQgPyAnWycgOiAnKCcpICsKKyAgICAgICAgdmFsdWUubWFwIHt8ZXwgZS5pbnNwZWN0fS5qb2luKHNlcF9zdHIobmlsKSkgKworICAgICAgICAoYnJhY2tldGVkID8gJ10nIDogJyknKQorICAgIGVuZAorCisgICAgIyBBc3NlcnRzIGFuIGluZGV4IGlzIHdpdGhpbiB0aGUgbGlzdC4KKyAgICAjCisgICAgIyBAcHJpdmF0ZQorICAgICMKKyAgICAjIEBwYXJhbSBsaXN0IFtTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0XSBUaGUgbGlzdCBmb3Igd2hpY2ggdGhlIGluZGV4IHNob3VsZCBiZSBjaGVja2VkLgorICAgICMgQHBhcmFtIG4gW1Nhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIGluZGV4IGJlaW5nIGNoZWNrZWQuCisgICAgZGVmIHNlbGYuYXNzZXJ0X3ZhbGlkX2luZGV4KGxpc3QsIG4pCisgICAgICBpZiAhbi5pbnQ/IHx8IG4udG9faSA9PSAwCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCJMaXN0IGluZGV4ICN7bn0gbXVzdCBiZSBhIG5vbi16ZXJvIGludGVnZXIiKQorICAgICAgZWxzaWYgbGlzdC50b19hLnNpemUgPT0gMAorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiTGlzdCBpbmRleCBpcyAje259IGJ1dCBsaXN0IGhhcyBubyBpdGVtcyIpCisgICAgICBlbHNpZiBuLnRvX2kuYWJzID4gKHNpemUgPSBsaXN0LnRvX2Euc2l6ZSkKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoCisgICAgICAgICAgIkxpc3QgaW5kZXggaXMgI3tufSBidXQgbGlzdCBpcyBvbmx5ICN7c2l6ZX0gaXRlbSN7J3MnIGlmIHNpemUgIT0gMX0gbG9uZyIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBlbGVtZW50X25lZWRzX3BhcmVucz8oZWxlbWVudCkKKyAgICAgIGlmIGVsZW1lbnQuaXNfYT8oTGlzdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlIGlmIGVsZW1lbnQudmFsdWUubGVuZ3RoIDwgMgorICAgICAgICByZXR1cm4gZmFsc2UgaWYgZWxlbWVudC5icmFja2V0ZWQKKyAgICAgICAgcHJlY2VkZW5jZSA9IFNhc3M6OlNjcmlwdDo6UGFyc2VyLnByZWNlZGVuY2Vfb2Yoc2VwYXJhdG9yIHx8IDpzcGFjZSkKKyAgICAgICAgcmV0dXJuIFNhc3M6OlNjcmlwdDo6UGFyc2VyLnByZWNlZGVuY2Vfb2YoZWxlbWVudC5zZXBhcmF0b3IgfHwgOnNwYWNlKSA8PSBwcmVjZWRlbmNlCisgICAgICBlbmQKKworICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyBzZXBhcmF0b3IgPT0gOnNwYWNlCisgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIGVsZW1lbnQuaXNfYT8oU2Fzczo6U2NyaXB0OjpUcmVlOjpVbmFyeU9wZXJhdGlvbikKKyAgICAgIGVsZW1lbnQub3BlcmF0b3IgPT0gOm1pbnVzIHx8IGVsZW1lbnQub3BlcmF0b3IgPT0gOnBsdXMKKyAgICBlbmQKKworICAgIGRlZiBzZXBfc3RyKG9wdHMgPSBvcHRpb25zKQorICAgICAgcmV0dXJuICcgJyBpZiBzZXBhcmF0b3IgPT0gOnNwYWNlCisgICAgICByZXR1cm4gJywnIGlmIG9wdHMgJiYgb3B0c1s6c3R5bGVdID09IDpjb21wcmVzc2VkCisgICAgICAnLCAnCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9tYXAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9tYXAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxYzZhMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL21hcC5yYgpAQCAtMCwwICsxLDcwIEBACittb2R1bGUgU2Fzczo6U2NyaXB0OjpWYWx1ZQorICAjIEEgU2Fzc1NjcmlwdCBvYmplY3QgcmVwcmVzZW50aW5nIGEgbWFwIGZyb20ga2V5cyB0byB2YWx1ZXMuIEJvdGgga2V5cyBhbmQKKyAgIyB2YWx1ZXMgY2FuIGJlIGFueSBTYXNzU2NyaXB0IG9iamVjdC4KKyAgY2xhc3MgTWFwIDwgQmFzZQorICAgICMgVGhlIFJ1YnkgaGFzaCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIG1hcC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtIYXNoPE5vZGUsIE5vZGU+XQorICAgIGF0dHJfcmVhZGVyIDp2YWx1ZQorICAgIGFsaWFzX21ldGhvZCA6dG9faCwgOnZhbHVlCisKKyAgICAjIENyZWF0ZXMgYSBuZXcgbWFwLgorICAgICMKKyAgICAjIEBwYXJhbSBoYXNoIFtIYXNoPE5vZGUsIE5vZGU+XQorICAgIGRlZiBpbml0aWFsaXplKGhhc2gpCisgICAgICBzdXBlcihoYXNoKQorICAgIGVuZAorCisgICAgIyBAc2VlIFZhbHVlI29wdGlvbnM9CisgICAgZGVmIG9wdGlvbnM9KG9wdGlvbnMpCisgICAgICBzdXBlcgorICAgICAgdmFsdWUuZWFjaCBkbyB8aywgdnwKKyAgICAgICAgay5vcHRpb25zID0gb3B0aW9ucworICAgICAgICB2Lm9wdGlvbnMgPSBvcHRpb25zCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQHNlZSBWYWx1ZSNzZXBhcmF0b3IKKyAgICBkZWYgc2VwYXJhdG9yCisgICAgICA6Y29tbWEgdW5sZXNzIHZhbHVlLmVtcHR5PworICAgIGVuZAorCisgICAgIyBAc2VlIFZhbHVlI3RvX2EKKyAgICBkZWYgdG9fYQorICAgICAgdmFsdWUubWFwIGRvIHxrLCB2fAorICAgICAgICBsaXN0ID0gTGlzdC5uZXcoW2ssIHZdLCBzZXBhcmF0b3I6IDpzcGFjZSkKKyAgICAgICAgbGlzdC5vcHRpb25zID0gb3B0aW9ucworICAgICAgICBsaXN0CisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQHNlZSBWYWx1ZSNlcQorICAgIGRlZiBlcShvdGhlcikKKyAgICAgIEJvb2wubmV3KG90aGVyLmlzX2E/KE1hcCkgJiYgdmFsdWUgPT0gb3RoZXIudmFsdWUpCisgICAgZW5kCisKKyAgICBkZWYgaGFzaAorICAgICAgQGhhc2ggfHw9IHZhbHVlLmhhc2gKKyAgICBlbmQKKworICAgICMgQHNlZSBWYWx1ZSN0b19zCisgICAgZGVmIHRvX3Mob3B0cyA9IHt9KQorICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCIje2luc3BlY3R9IGlzbid0IGEgdmFsaWQgQ1NTIHZhbHVlLiIpCisgICAgZW5kCisKKyAgICBkZWYgdG9fc2FzcyhvcHRzID0ge30pCisgICAgICByZXR1cm4gIigpIiBpZiB2YWx1ZS5lbXB0eT8KKworICAgICAgdG9fc2FzcyA9IGxhbWJkYSBkbyB8dmFsdWV8CisgICAgICAgIGlmIHZhbHVlLmlzX2E/KExpc3QpICYmIHZhbHVlLnNlcGFyYXRvciA9PSA6Y29tbWEKKyAgICAgICAgICAiKCN7dmFsdWUudG9fc2FzcyhvcHRzKX0pIgorICAgICAgICBlbHNlCisgICAgICAgICAgdmFsdWUudG9fc2FzcyhvcHRzKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAiKCN7dmFsdWUubWFwIHt8KGssIHYpfCAiI3t0b19zYXNzW2tdfTogI3t0b19zYXNzW3ZdfSJ9LmpvaW4oJywgJyl9KSIKKyAgICBlbmQKKyAgICBhbGlhc19tZXRob2QgOmluc3BlY3QsIDp0b19zYXNzCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9udWxsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvbnVsbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ1NzNiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3JpcHQvdmFsdWUvbnVsbC5yYgpAQCAtMCwwICsxLDQ0IEBACittb2R1bGUgU2Fzczo6U2NyaXB0OjpWYWx1ZQorICAjIEEgU2Fzc1NjcmlwdCBvYmplY3QgcmVwcmVzZW50aW5nIGEgbnVsbCB2YWx1ZS4KKyAgY2xhc3MgTnVsbCA8IEJhc2UKKyAgICAjIFRoZSBudWxsIHZhbHVlIGluIFNhc3NTY3JpcHQuCisgICAgIworICAgICMgVGhpcyBpcyBhc3NpZ25lZCBiZWZvcmUgbmV3IGlzIG92ZXJyaWRkZW4gYmVsb3cgc28gdGhhdCB3ZSB1c2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisgICAgTlVMTCA9IG5ldyhuaWwpCisKKyAgICAjIFdlIG92ZXJyaWRlIG9iamVjdCBjcmVhdGlvbiBzbyB0aGF0IHVzZXJzIG9mIHRoZSBjb3JlIEFQSQorICAgICMgd2lsbCBub3QgbmVlZCB0byBrbm93IHRoYXQgbnVsbCBpcyBhIHNwZWNpZmljIGNvbnN0YW50LgorICAgICMKKyAgICAjIEBwcml2YXRlCisgICAgIyBAcmV0dXJuIFtOdWxsXSB0aGUge05VTEx9IGNvbnN0YW50LgorICAgIGRlZiBzZWxmLm5ldworICAgICAgTlVMTAorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBgZmFsc2VgICh0aGUgUnVieSBib29sZWFuIHZhbHVlKQorICAgIGRlZiB0b19ib29sCisgICAgICBmYWxzZQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBgdHJ1ZWAKKyAgICBkZWYgbnVsbD8KKyAgICAgIHRydWUKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbU3RyaW5nXSAnJyAoQW4gZW1wdHkgc3RyaW5nKQorICAgIGRlZiB0b19zKG9wdHMgPSB7fSkKKyAgICAgICcnCisgICAgZW5kCisKKyAgICBkZWYgdG9fc2FzcyhvcHRzID0ge30pCisgICAgICAnbnVsbCcKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBudWxsIHZhbHVlLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBkZWYgaW5zcGVjdAorICAgICAgJ251bGwnCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9udW1iZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9udW1iZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkMWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL251bWJlci5yYgpAQCAtMCwwICsxLDU2MyBAQAorbW9kdWxlIFNhc3M6OlNjcmlwdDo6VmFsdWUKKyAgIyBBIFNhc3NTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyBhIG51bWJlci4KKyAgIyBTYXNzU2NyaXB0IG51bWJlcnMgY2FuIGhhdmUgZGVjaW1hbCB2YWx1ZXMsCisgICMgYW5kIGNhbiBhbHNvIGhhdmUgdW5pdHMuCisgICMgRm9yIGV4YW1wbGUsIGAxMmAsIGAxcHhgLCBhbmQgYDEwLjQ1ZW1gCisgICMgYXJlIGFsbCB2YWxpZCB2YWx1ZXMuCisgICMKKyAgIyBOdW1iZXJzIGNhbiBhbHNvIGhhdmUgbW9yZSBjb21wbGV4IHVuaXRzLCBzdWNoIGFzIGAxcHgqZW0vaW5gLgorICAjIFRoZXNlIGNhbm5vdCBiZSBpbnB1dHRlZCBkaXJlY3RseSBpbiBTYXNzIGNvZGUgYXQgdGhlIG1vbWVudC4KKyAgY2xhc3MgTnVtYmVyIDwgQmFzZQorICAgICMgVGhlIFJ1YnkgdmFsdWUgb2YgdGhlIG51bWJlci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtOdW1lcmljXQorICAgIGF0dHJfcmVhZGVyIDp2YWx1ZQorCisgICAgIyBBIGxpc3Qgb2YgdW5pdHMgaW4gdGhlIG51bWVyYXRvciBvZiB0aGUgbnVtYmVyLgorICAgICMgRm9yIGV4YW1wbGUsIGAxcHgqZW0vaW4qY21gIHdvdWxkIHJldHVybiBgWyJweCIsICJlbSJdYAorICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nPl0KKyAgICBhdHRyX3JlYWRlciA6bnVtZXJhdG9yX3VuaXRzCisKKyAgICAjIEEgbGlzdCBvZiB1bml0cyBpbiB0aGUgZGVub21pbmF0b3Igb2YgdGhlIG51bWJlci4KKyAgICAjIEZvciBleGFtcGxlLCBgMXB4KmVtL2luKmNtYCB3b3VsZCByZXR1cm4gYFsiaW4iLCAiY20iXWAKKyAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZz5dCisgICAgYXR0cl9yZWFkZXIgOmRlbm9taW5hdG9yX3VuaXRzCisKKyAgICAjIFRoZSBvcmlnaW5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG51bWJlci4KKyAgICAjIEZvciBleGFtcGxlLCBhbHRob3VnaCB0aGUgcmVzdWx0IG9mIGAxcHgvMnB4YCBpcyBgMC41YCwKKyAgICAjIHRoZSB2YWx1ZSBvZiBgI29yaWdpbmFsYCBpcyBgIjFweC8ycHgiYC4KKyAgICAjCisgICAgIyBUaGlzIGlzIG9ubHkgbm9uLW5pbCB3aGVuIHRoZSBvcmlnaW5hbCB2YWx1ZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgQ1NTIHZhbHVlLAorICAgICMgYXMgaW4gYGZvbnQ6IDFweC8ycHhgLgorICAgICMKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW4sIG5pbF0KKyAgICBhdHRyX2FjY2Vzc29yIDpvcmlnaW5hbAorCisgICAgZGVmIHNlbGYucHJlY2lzaW9uCisgICAgICBUaHJlYWQuY3VycmVudFs6c2Fzc19udW1lcmljX3ByZWNpc2lvbl0gfHwgVGhyZWFkLm1haW5bOnNhc3NfbnVtZXJpY19wcmVjaXNpb25dIHx8IDEwCisgICAgZW5kCisKKyAgICAjIFNldHMgdGhlIG51bWJlciBvZiBkaWdpdHMgb2YgcHJlY2lzaW9uCisgICAgIyBGb3IgZXhhbXBsZSwgaWYgdGhpcyBpcyBgM2AsCisgICAgIyBgMy4xNDE1OTI2YCB3aWxsIGJlIHByaW50ZWQgYXMgYDMuMTQyYC4KKyAgICAjIFRoZSBudW1lcmljIHByZWNpc2lvbiBpcyBzdG9yZWQgYXMgYSB0aHJlYWQgbG9jYWwgZm9yIHRocmVhZCBzYWZldHkgcmVhc29ucy4KKyAgICAjIFRvIHNldCBmb3IgYWxsIHRocmVhZHMsIGJlIHN1cmUgdG8gc2V0IHRoZSBwcmVjaXNpb24gb24gdGhlIG1haW4gdGhyZWFkLgorICAgIGRlZiBzZWxmLnByZWNpc2lvbj0oZGlnaXRzKQorICAgICAgVGhyZWFkLmN1cnJlbnRbOnNhc3NfbnVtZXJpY19wcmVjaXNpb25dID0gZGlnaXRzLnJvdW5kCisgICAgICBUaHJlYWQuY3VycmVudFs6c2Fzc19udW1lcmljX3ByZWNpc2lvbl9mYWN0b3JdID0gbmlsCisgICAgICBUaHJlYWQuY3VycmVudFs6c2Fzc19udW1lcmljX2Vwc2lsb25dID0gbmlsCisgICAgZW5kCisKKyAgICAjIHRoZSBwcmVjaXNpb24gZmFjdG9yIHVzZWQgaW4gbnVtZXJpYyBvdXRwdXQKKyAgICAjIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgYHByZWNpc2lvbmAgbWV0aG9kLgorICAgIGRlZiBzZWxmLnByZWNpc2lvbl9mYWN0b3IKKyAgICAgIFRocmVhZC5jdXJyZW50WzpzYXNzX251bWVyaWNfcHJlY2lzaW9uX2ZhY3Rvcl0gfHw9IDEwLjAqKnByZWNpc2lvbgorICAgIGVuZAorCisgICAgIyBVc2VkIGluIGNoZWNraW5nIGVxdWFsaXR5IG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIEFueQorICAgICMgbnVtYmVycyB3aXRoaW4gYW4gYGVwc2lsb25gIG9mIGVhY2ggb3RoZXIgYXJlIGNvbnNpZGVyZWQgZnVuY3Rpb25hbGx5IGVxdWFsLgorICAgICMgVGhlIHZhbHVlIGZvciBlcHNpbG9uIGlzIG9uZSB0ZW50aCBvZiB0aGUgY3VycmVudCBudW1lcmljIHByZWNpc2lvbi4KKyAgICBkZWYgc2VsZi5lcHNpbG9uCisgICAgICBUaHJlYWQuY3VycmVudFs6c2Fzc19udW1lcmljX2Vwc2lsb25dIHx8PSAxIC8gKHByZWNpc2lvbl9mYWN0b3IgKiAxMCkKKyAgICBlbmQKKworICAgICMgVXNlZCBzbyB3ZSBkb24ndCBhbGxvY2F0ZSB0d28gbmV3IGFycmF5cyBmb3IgZWFjaCBuZXcgbnVtYmVyLgorICAgIE5PX1VOSVRTID0gW10KKworICAgICMgQHBhcmFtIHZhbHVlIFtOdW1lcmljXSBUaGUgdmFsdWUgb2YgdGhlIG51bWJlcgorICAgICMgQHBhcmFtIG51bWVyYXRvcl91bml0cyBbOjpTdHJpbmcsIEFycmF5PDo6U3RyaW5nPl0gU2VlIFx7I251bWVyYXRvclxfdW5pdHN9CisgICAgIyBAcGFyYW0gZGVub21pbmF0b3JfdW5pdHMgWzo6U3RyaW5nLCBBcnJheTw6OlN0cmluZz5dIFNlZSBceyNkZW5vbWluYXRvclxfdW5pdHN9CisgICAgZGVmIGluaXRpYWxpemUodmFsdWUsIG51bWVyYXRvcl91bml0cyA9IE5PX1VOSVRTLCBkZW5vbWluYXRvcl91bml0cyA9IE5PX1VOSVRTKQorICAgICAgbnVtZXJhdG9yX3VuaXRzID0gW251bWVyYXRvcl91bml0c10gaWYgbnVtZXJhdG9yX3VuaXRzLmlzX2E/KDo6U3RyaW5nKQorICAgICAgZGVub21pbmF0b3JfdW5pdHMgPSBbZGVub21pbmF0b3JfdW5pdHNdIGlmIGRlbm9taW5hdG9yX3VuaXRzLmlzX2E/KDo6U3RyaW5nKQorICAgICAgc3VwZXIodmFsdWUpCisgICAgICBAbnVtZXJhdG9yX3VuaXRzID0gbnVtZXJhdG9yX3VuaXRzCisgICAgICBAZGVub21pbmF0b3JfdW5pdHMgPSBkZW5vbWluYXRvcl91bml0cworICAgICAgQG9wdGlvbnMgPSBuaWwKKyAgICAgIG5vcm1hbGl6ZSEKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYCtgIG9wZXJhdGlvbi4KKyAgICAjIEl0cyBmdW5jdGlvbmFsaXR5IGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgaXRzIGFyZ3VtZW50OgorICAgICMKKyAgICAjIHtOdW1iZXJ9CisgICAgIyA6IEFkZHMgdGhlIHR3byBudW1iZXJzIHRvZ2V0aGVyLCBjb252ZXJ0aW5nIHVuaXRzIGlmIHBvc3NpYmxlLgorICAgICMKKyAgICAjIHtDb2xvcn0KKyAgICAjIDogQWRkcyB0aGlzIG51bWJlciB0byBlYWNoIG9mIHRoZSBSR0IgY29sb3IgY2hhbm5lbHMuCisgICAgIworICAgICMge1ZhbHVlfQorICAgICMgOiBTZWUge1ZhbHVlOjpCYXNlI3BsdXN9LgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtWYWx1ZV0gVGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCisgICAgIyBAcmFpc2UgW1Nhc3M6OlVuaXRDb252ZXJzaW9uRXJyb3JdIGlmIGBvdGhlcmAgaXMgYSBudW1iZXIgd2l0aCBpbmNvbXBhdGlibGUgdW5pdHMKKyAgICBkZWYgcGx1cyhvdGhlcikKKyAgICAgIGlmIG90aGVyLmlzX2E/IE51bWJlcgorICAgICAgICBvcGVyYXRlKG90aGVyLCA6KykKKyAgICAgIGVsc2lmIG90aGVyLmlzX2E/KENvbG9yKQorICAgICAgICBvdGhlci5wbHVzKHNlbGYpCisgICAgICBlbHNlCisgICAgICAgIHN1cGVyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYmluYXJ5IGAtYCBvcGVyYXRpb24gKGUuZy4gYCRhIC0gJGJgKS4KKyAgICAjIEl0cyBmdW5jdGlvbmFsaXR5IGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgaXRzIGFyZ3VtZW50OgorICAgICMKKyAgICAjIHtOdW1iZXJ9CisgICAgIyA6IFN1YnRyYWN0cyB0aGlzIG51bWJlciBmcm9tIHRoZSBvdGhlciwgY29udmVydGluZyB1bml0cyBpZiBwb3NzaWJsZS4KKyAgICAjCisgICAgIyB7VmFsdWV9CisgICAgIyA6IFNlZSB7VmFsdWU6OkJhc2UjbWludXN9LgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtWYWx1ZV0gVGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCisgICAgIyBAcmFpc2UgW1Nhc3M6OlVuaXRDb252ZXJzaW9uRXJyb3JdIGlmIGBvdGhlcmAgaXMgYSBudW1iZXIgd2l0aCBpbmNvbXBhdGlibGUgdW5pdHMKKyAgICBkZWYgbWludXMob3RoZXIpCisgICAgICBpZiBvdGhlci5pc19hPyBOdW1iZXIKKyAgICAgICAgb3BlcmF0ZShvdGhlciwgOi0pCisgICAgICBlbHNlCisgICAgICAgIHN1cGVyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgdW5hcnkgYCtgIG9wZXJhdGlvbiAoZS5nLiBgKyRhYCkuCisgICAgIworICAgICMgQHJldHVybiBbTnVtYmVyXSBUaGUgdmFsdWUgb2YgdGhpcyBudW1iZXIKKyAgICBkZWYgdW5hcnlfcGx1cworICAgICAgc2VsZgorICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCB1bmFyeSBgLWAgb3BlcmF0aW9uIChlLmcuIGAtJGFgKS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtOdW1iZXJdIFRoZSBuZWdhdGl2ZSB2YWx1ZSBvZiB0aGlzIG51bWJlcgorICAgIGRlZiB1bmFyeV9taW51cworICAgICAgTnVtYmVyLm5ldygtdmFsdWUsIEBudW1lcmF0b3JfdW5pdHMsIEBkZW5vbWluYXRvcl91bml0cykKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYCpgIG9wZXJhdGlvbi4KKyAgICAjIEl0cyBmdW5jdGlvbmFsaXR5IGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgaXRzIGFyZ3VtZW50OgorICAgICMKKyAgICAjIHtOdW1iZXJ9CisgICAgIyA6IE11bHRpcGxpZXMgdGhlIHR3byBudW1iZXJzIHRvZ2V0aGVyLCBjb252ZXJ0aW5nIHVuaXRzIGFwcHJvcHJpYXRlbHkuCisgICAgIworICAgICMge0NvbG9yfQorICAgICMgOiBNdWx0aXBsaWVzIGVhY2ggb2YgdGhlIFJHQiBjb2xvciBjaGFubmVscyBieSB0aGlzIG51bWJlci4KKyAgICAjCisgICAgIyBAcGFyYW0gb3RoZXIgW051bWJlciwgQ29sb3JdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtOdW1iZXIsIENvbG9yXSBUaGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KKyAgICAjIEByYWlzZSBbTm9NZXRob2RFcnJvcl0gaWYgYG90aGVyYCBpcyBhbiBpbnZhbGlkIHR5cGUKKyAgICBkZWYgdGltZXMob3RoZXIpCisgICAgICBpZiBvdGhlci5pc19hPyBOdW1iZXIKKyAgICAgICAgb3BlcmF0ZShvdGhlciwgOiopCisgICAgICBlbHNpZiBvdGhlci5pc19hPyBDb2xvcgorICAgICAgICBvdGhlci50aW1lcyhzZWxmKQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBOb01ldGhvZEVycm9yLm5ldyhuaWwsIDp0aW1lcykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgL2Agb3BlcmF0aW9uLgorICAgICMgSXRzIGZ1bmN0aW9uYWxpdHkgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiBpdHMgYXJndW1lbnQ6CisgICAgIworICAgICMge051bWJlcn0KKyAgICAjIDogRGl2aWRlcyB0aGlzIG51bWJlciBieSB0aGUgb3RoZXIsIGNvbnZlcnRpbmcgdW5pdHMgYXBwcm9wcmlhdGVseS4KKyAgICAjCisgICAgIyB7VmFsdWV9CisgICAgIyA6IFNlZSB7VmFsdWU6OkJhc2UjZGl2fS4KKyAgICAjCisgICAgIyBAcGFyYW0gb3RoZXIgW1ZhbHVlXSBUaGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvcgorICAgICMgQHJldHVybiBbVmFsdWVdIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgorICAgIGRlZiBkaXYob3RoZXIpCisgICAgICBpZiBvdGhlci5pc19hPyBOdW1iZXIKKyAgICAgICAgcmVzID0gb3BlcmF0ZShvdGhlciwgOi8pCisgICAgICAgIGlmIG9yaWdpbmFsICYmIG90aGVyLm9yaWdpbmFsCisgICAgICAgICAgcmVzLm9yaWdpbmFsID0gIiN7b3JpZ2luYWx9LyN7b3RoZXIub3JpZ2luYWx9IgorICAgICAgICBlbmQKKyAgICAgICAgcmVzCisgICAgICBlbHNlCisgICAgICAgIHN1cGVyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYCVgIG9wZXJhdGlvbi4KKyAgICAjCisgICAgIyBAcGFyYW0gb3RoZXIgW051bWJlcl0gVGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAgICAjIEByZXR1cm4gW051bWJlcl0gVGhpcyBudW1iZXIgbW9kdWxvIHRoZSBvdGhlcgorICAgICMgQHJhaXNlIFtOb01ldGhvZEVycm9yXSBpZiBgb3RoZXJgIGlzIGFuIGludmFsaWQgdHlwZQorICAgICMgQHJhaXNlIFtTYXNzOjpVbml0Q29udmVyc2lvbkVycm9yXSBpZiBgb3RoZXJgIGhhcyBpbmNvbXBhdGlibGUgdW5pdHMKKyAgICBkZWYgbW9kKG90aGVyKQorICAgICAgaWYgb3RoZXIuaXNfYT8oTnVtYmVyKQorICAgICAgICBvcGVyYXRlKG90aGVyLCA6JSkKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgTm9NZXRob2RFcnJvci5uZXcobmlsLCA6bW9kKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRoZSBTYXNzU2NyaXB0IGA9PWAgb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbVmFsdWVdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIHRoaXMgbnVtYmVyIGlzIGVxdWFsIHRvIHRoZSBvdGhlciBvYmplY3QKKyAgICBkZWYgZXEob3RoZXIpCisgICAgICByZXR1cm4gQm9vbDo6RkFMU0UgdW5sZXNzIG90aGVyLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcikKKyAgICAgIHRoaXMgPSBzZWxmCisgICAgICBiZWdpbgorICAgICAgICBpZiB1bml0bGVzcz8KKyAgICAgICAgICB0aGlzID0gdGhpcy5jb2VyY2Uob3RoZXIubnVtZXJhdG9yX3VuaXRzLCBvdGhlci5kZW5vbWluYXRvcl91bml0cykKKyAgICAgICAgZWxzZQorICAgICAgICAgIG90aGVyID0gb3RoZXIuY29lcmNlKEBudW1lcmF0b3JfdW5pdHMsIEBkZW5vbWluYXRvcl91bml0cykKKyAgICAgICAgZW5kCisgICAgICByZXNjdWUgU2Fzczo6VW5pdENvbnZlcnNpb25FcnJvcgorICAgICAgICByZXR1cm4gQm9vbDo6RkFMU0UKKyAgICAgIGVuZAorICAgICAgQm9vbC5uZXcoYmFzaWNhbGx5X2VxdWFsPyh0aGlzLnZhbHVlLCBvdGhlci52YWx1ZSkpCisgICAgZW5kCisKKyAgICBkZWYgaGFzaAorICAgICAgW3ZhbHVlLCBudW1lcmF0b3JfdW5pdHMsIGRlbm9taW5hdG9yX3VuaXRzXS5oYXNoCisgICAgZW5kCisKKyAgICAjIEhhc2gtZXF1YWxpdHkgd29ya3MgZGlmZmVyZW50bHkgdGhhbiBgPT1gIGVxdWFsaXR5IGZvciBudW1iZXJzLgorICAgICMgSGFzaC1lcXVhbGl0eSBtdXN0IGJlIHRyYW5zaXRpdmUsIHNvIGl0IGp1c3QgY29tcGFyZXMgdGhlIGV4YWN0IHZhbHVlLAorICAgICMgbnVtZXJhdG9yIHVuaXRzLCBhbmQgZGVub21pbmF0b3IgdW5pdHMuCisgICAgZGVmIGVxbD8ob3RoZXIpCisgICAgICBiYXNpY2FsbHlfZXF1YWw/KHZhbHVlLCBvdGhlci52YWx1ZSkgJiYgbnVtZXJhdG9yX3VuaXRzID09IG90aGVyLm51bWVyYXRvcl91bml0cyAmJgorICAgICAgICBkZW5vbWluYXRvcl91bml0cyA9PSBvdGhlci5kZW5vbWluYXRvcl91bml0cworICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgPmAgb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbTnVtYmVyXSBUaGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvcgorICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciB0aGlzIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIG90aGVyCisgICAgIyBAcmFpc2UgW05vTWV0aG9kRXJyb3JdIGlmIGBvdGhlcmAgaXMgYW4gaW52YWxpZCB0eXBlCisgICAgZGVmIGd0KG90aGVyKQorICAgICAgcmFpc2UgTm9NZXRob2RFcnJvci5uZXcobmlsLCA6Z3QpIHVubGVzcyBvdGhlci5pc19hPyhOdW1iZXIpCisgICAgICBvcGVyYXRlKG90aGVyLCA6PikKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYD49YCBvcGVyYXRpb24uCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtOdW1iZXJdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIHRoaXMgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIKKyAgICAjIEByYWlzZSBbTm9NZXRob2RFcnJvcl0gaWYgYG90aGVyYCBpcyBhbiBpbnZhbGlkIHR5cGUKKyAgICBkZWYgZ3RlKG90aGVyKQorICAgICAgcmFpc2UgTm9NZXRob2RFcnJvci5uZXcobmlsLCA6Z3RlKSB1bmxlc3Mgb3RoZXIuaXNfYT8oTnVtYmVyKQorICAgICAgb3BlcmF0ZShvdGhlciwgOj49KQorICAgIGVuZAorCisgICAgIyBUaGUgU2Fzc1NjcmlwdCBgPGAgb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbTnVtYmVyXSBUaGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvcgorICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciB0aGlzIG51bWJlciBpcyBsZXNzIHRoYW4gdGhlIG90aGVyCisgICAgIyBAcmFpc2UgW05vTWV0aG9kRXJyb3JdIGlmIGBvdGhlcmAgaXMgYW4gaW52YWxpZCB0eXBlCisgICAgZGVmIGx0KG90aGVyKQorICAgICAgcmFpc2UgTm9NZXRob2RFcnJvci5uZXcobmlsLCA6bHQpIHVubGVzcyBvdGhlci5pc19hPyhOdW1iZXIpCisgICAgICBvcGVyYXRlKG90aGVyLCA6PCkKKyAgICBlbmQKKworICAgICMgVGhlIFNhc3NTY3JpcHQgYDw9YCBvcGVyYXRpb24uCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtOdW1iZXJdIFRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIHRoaXMgbnVtYmVyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIKKyAgICAjIEByYWlzZSBbTm9NZXRob2RFcnJvcl0gaWYgYG90aGVyYCBpcyBhbiBpbnZhbGlkIHR5cGUKKyAgICBkZWYgbHRlKG90aGVyKQorICAgICAgcmFpc2UgTm9NZXRob2RFcnJvci5uZXcobmlsLCA6bHRlKSB1bmxlc3Mgb3RoZXIuaXNfYT8oTnVtYmVyKQorICAgICAgb3BlcmF0ZShvdGhlciwgOjw9KQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBDU1MgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBudW1iZXIKKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoaXMgbnVtYmVyIGhhcyB1bml0cyB0aGF0IGNhbid0IGJlIHVzZWQgaW4gQ1NTCisgICAgIyAgIChlLmcuIGBweCppbmApCisgICAgZGVmIHRvX3Mob3B0cyA9IHt9KQorICAgICAgcmV0dXJuIG9yaWdpbmFsIGlmIG9yaWdpbmFsCisgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIiN7aW5zcGVjdH0gaXNuJ3QgYSB2YWxpZCBDU1MgdmFsdWUuIikgdW5sZXNzIGxlZ2FsX3VuaXRzPworICAgICAgaW5zcGVjdAorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGEgcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBudW1iZXIuCisgICAgIworICAgICMgVGhpcyByZXByZXNlbnRhdGlvbiBpcyB2YWxpZCBDU1MgKGFuZCB2YWxpZCBTYXNzU2NyaXB0KQorICAgICMgYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmx5IG9uZSB1bml0LgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIHJlcHJlc2VudGF0aW9uCisgICAgZGVmIGluc3BlY3Qob3B0cyA9IHt9KQorICAgICAgcmV0dXJuIG9yaWdpbmFsIGlmIG9yaWdpbmFsCisKKyAgICAgIHZhbHVlID0gc2VsZi5jbGFzcy5yb3VuZChzZWxmLnZhbHVlKQorICAgICAgc3RyID0gdmFsdWUudG9fcworCisgICAgICAjIFJ1Ynkgd2lsbCBvY2Nhc2lvbmFsbHkgcHJpbnQgaW4gc2NpZW50aWZpYyBub3RhdGlvbiBpZiB0aGUgbnVtYmVyIGlzCisgICAgICAjIHNtYWxsIGVub3VnaC4gVGhhdCdzIHRlY2huaWNhbGx5IHZhbGlkIENTUywgYnV0IGl0J3Mgbm90IHdlbGwtc3VwcG9ydGVkCisgICAgICAjIGFuZCBjb25mdXNpbmcuCisgICAgICBzdHIgPSAoIiUwLiN7c2VsZi5jbGFzcy5wcmVjaXNpb259ZiIgJSB2YWx1ZSkuZ3N1YigvMCokLywgJycpIGlmIHN0ci5pbmNsdWRlPygnZScpCisKKyAgICAgICMgU29tZXRpbWVzIG51bWVyaWMgZm9ybWF0dGluZyB3aWxsIHJlc3VsdCBpbiBhIGRlY2ltYWwgbnVtYmVyIHdpdGggYSB0cmFpbGluZyB6ZXJvICh4LjApCisgICAgICBpZiBzdHIgPX4gLyguKilcLjAkLworICAgICAgICBzdHIgPSAkMQorICAgICAgZW5kCisKKyAgICAgICMgV2Ugb21pdCBhIGxlYWRpbmcgemVybyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQgaW4gY29tcHJlc3NlZCBtb2RlLgorICAgICAgaWYgQG9wdGlvbnMgJiYgb3B0aW9uc1s6c3R5bGVdID09IDpjb21wcmVzc2VkCisgICAgICAgIHN0ci5zdWIhKC9eKC0pPzBcLi8sICdcMS4nKQorICAgICAgZW5kCisKKyAgICAgIHVuaXRsZXNzPyA/IHN0ciA6ICIje3N0cn0je3VuaXRfc3RyfSIKKyAgICBlbmQKKyAgICBhbGlhc19tZXRob2QgOnRvX3Nhc3MsIDppbnNwZWN0CisKKyAgICAjIEByZXR1cm4gW0ludGVnZXJdIFRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBudW1iZXIKKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZSBudW1iZXIgaXNuJ3QgYW4gaW50ZWdlcgorICAgIGRlZiB0b19pCisgICAgICBzdXBlciB1bmxlc3MgaW50PworICAgICAgdmFsdWUudG9faQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIG9yIG5vdCB0aGlzIG51bWJlciBpcyBhbiBpbnRlZ2VyLgorICAgIGRlZiBpbnQ/CisgICAgICBiYXNpY2FsbHlfZXF1YWw/KHZhbHVlICUgMSwgMC4wKQorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIG9yIG5vdCB0aGlzIG51bWJlciBoYXMgbm8gdW5pdHMuCisgICAgZGVmIHVuaXRsZXNzPworICAgICAgQG51bWVyYXRvcl91bml0cy5lbXB0eT8gJiYgQGRlbm9taW5hdG9yX3VuaXRzLmVtcHR5PworICAgIGVuZAorCisgICAgIyBDaGVja3Mgd2hldGhlciB0aGUgbnVtYmVyIGhhcyB0aGUgbnVtZXJhdG9yIHVuaXQgc3BlY2lmaWVkLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIG51bWJlciA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5uZXcoMTAsICJweCIpCisgICAgIyAgIG51bWJlci5pc191bml0PygicHgiKSA9PiB0cnVlCisgICAgIyAgIG51bWJlci5pc191bml0PyhuaWwpID0+IGZhbHNlCisgICAgIworICAgICMgQHBhcmFtIHVuaXQgWzo6U3RyaW5nLCBuaWxdIFRoZSB1bml0IHRoZSBudW1iZXIgc2hvdWxkIGhhdmUgb3IgbmlsIGlmIHRoZSBudW1iZXIKKyAgICAjICAgc2hvdWxkIGJlIHVuaXRsZXNzLgorICAgICMgQHNlZSBOdW1iZXIjdW5pdGxlc3M/IFRoZSB1bml0bGVzcz8gbWV0aG9kIG1heSBiZSBtb3JlIHJlYWRhYmxlLgorICAgIGRlZiBpc191bml0Pyh1bml0KQorICAgICAgaWYgdW5pdAorICAgICAgICBkZW5vbWluYXRvcl91bml0cy5zaXplID09IDAgJiYgbnVtZXJhdG9yX3VuaXRzLnNpemUgPT0gMSAmJiBudW1lcmF0b3JfdW5pdHMuZmlyc3QgPT0gdW5pdAorICAgICAgZWxzZQorICAgICAgICB1bml0bGVzcz8KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIG9yIG5vdCB0aGlzIG51bWJlciBoYXMgdW5pdHMgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gQ1NTCisgICAgIyAgICh0aGF0IGlzLCB6ZXJvIG9yIG9uZSBceyNudW1lcmF0b3JcX3VuaXRzfSkuCisgICAgZGVmIGxlZ2FsX3VuaXRzPworICAgICAgKEBudW1lcmF0b3JfdW5pdHMuZW1wdHk/IHx8IEBudW1lcmF0b3JfdW5pdHMuc2l6ZSA9PSAxKSAmJiBAZGVub21pbmF0b3JfdW5pdHMuZW1wdHk/CisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhpcyBudW1iZXIgY29udmVydGVkIHRvIG90aGVyIHVuaXRzLgorICAgICMgVGhlIGNvbnZlcnNpb24gdGFrZXMgaW50byBhY2NvdW50IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBlLmcuIG1tIGFuZCBjbSwKKyAgICAjIGFzIHdlbGwgYXMgYmV0d2VlbiBlLmcuIGluIGFuZCBjbS4KKyAgICAjCisgICAgIyBJZiB0aGlzIG51bWJlciBoYXMgbm8gdW5pdHMsIGl0IHdpbGwgc2ltcGx5IHJldHVybiBpdHNlbGYKKyAgICAjIHdpdGggdGhlIGdpdmVuIHVuaXRzLgorICAgICMKKyAgICAjIEFuIGluY29tcGF0aWJsZSBjb2VyY2lvbiwgZS5nLiBiZXR3ZWVuIHB4IGFuZCBjbSwgd2lsbCByYWlzZSBhbiBlcnJvci4KKyAgICAjCisgICAgIyBAcGFyYW0gbnVtX3VuaXRzIFtBcnJheTxTdHJpbmc+XSBUaGUgbnVtZXJhdG9yIHVuaXRzIHRvIGNvZXJjZSB0aGlzIG51bWJlciBpbnRvLgorICAgICMgICBTZWUge1wjbnVtZXJhdG9yXF91bml0c30KKyAgICAjIEBwYXJhbSBkZW5fdW5pdHMgW0FycmF5PFN0cmluZz5dIFRoZSBkZW5vbWluYXRvciB1bml0cyB0byBjb2VyY2UgdGhpcyBudW1iZXIgaW50by4KKyAgICAjICAgU2VlIHtcI2Rlbm9taW5hdG9yXF91bml0c30KKyAgICAjIEByZXR1cm4gW051bWJlcl0gVGhlIG51bWJlciB3aXRoIHRoZSBuZXcgdW5pdHMKKyAgICAjIEByYWlzZSBbU2Fzczo6VW5pdENvbnZlcnNpb25FcnJvcl0gaWYgdGhlIGdpdmVuIHVuaXRzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbnVtYmVyJ3MKKyAgICAjICAgY3VycmVudCB1bml0cworICAgIGRlZiBjb2VyY2UobnVtX3VuaXRzLCBkZW5fdW5pdHMpCisgICAgICBOdW1iZXIubmV3KGlmIHVuaXRsZXNzPworICAgICAgICAgICAgICAgICAgIHZhbHVlCisgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB2YWx1ZSAqIGNvZXJjaW9uX2ZhY3RvcihAbnVtZXJhdG9yX3VuaXRzLCBudW1fdW5pdHMpIC8KKyAgICAgICAgICAgICAgICAgICAgIGNvZXJjaW9uX2ZhY3RvcihAZGVub21pbmF0b3JfdW5pdHMsIGRlbl91bml0cykKKyAgICAgICAgICAgICAgICAgZW5kLCBudW1fdW5pdHMsIGRlbl91bml0cykKKyAgICBlbmQKKworICAgICMgQHBhcmFtIG90aGVyIFtOdW1iZXJdIEEgbnVtYmVyIHRvIGRlY2lkZSBpZiBpdCBjYW4gYmUgY29tcGFyZWQgd2l0aCB0aGlzIG51bWJlci4KKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgb3Igbm90IHRoaXMgbnVtYmVyIGNhbiBiZSBjb21wYXJlZCB3aXRoIHRoZSBvdGhlci4KKyAgICBkZWYgY29tcGFyYWJsZV90bz8ob3RoZXIpCisgICAgICBvcGVyYXRlKG90aGVyLCA6KykKKyAgICAgIHRydWUKKyAgICByZXNjdWUgU2Fzczo6VW5pdENvbnZlcnNpb25FcnJvcgorICAgICAgZmFsc2UKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bml0cyBpbiB0aGlzIG51bWJlci4KKyAgICAjIEZvciBjb21wbGV4IHVuaXRzIHRoaXMgdGFrZXMgdGhlIGZvcm0gb2Y6CisgICAgIyBudW1lcmF0b3JfdW5pdDEgKiBudW1lcmF0b3JfdW5pdDIgLyBkZW5vbWluYXRvcl91bml0MSAqIGRlbm9taW5hdG9yX3VuaXQyCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdW5pdHMgaW4gdGhpcyBudW1iZXIKKyAgICBkZWYgdW5pdF9zdHIKKyAgICAgIHJ2ID0gQG51bWVyYXRvcl91bml0cy5zb3J0LmpvaW4oIioiKQorICAgICAgaWYgQGRlbm9taW5hdG9yX3VuaXRzLmFueT8KKyAgICAgICAgcnYgPDwgIi8iCisgICAgICAgIHJ2IDw8IEBkZW5vbWluYXRvcl91bml0cy5zb3J0LmpvaW4oIioiKQorICAgICAgZW5kCisgICAgICBydgorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgIyBAcHJpdmF0ZQorICAgICMgQHNlZSBTYXNzOjpTY3JpcHQ6Ok51bWJlci5iYXNpY2FsbHlfZXF1YWw/CisgICAgZGVmIGJhc2ljYWxseV9lcXVhbD8obnVtMSwgbnVtMikKKyAgICAgIHNlbGYuY2xhc3MuYmFzaWNhbGx5X2VxdWFsPyhudW0xLCBudW0yKQorICAgIGVuZAorCisgICAgIyBDaGVja3Mgd2hldGhlciB0d28gbnVtYmVycyBhcmUgd2l0aGluIGFuIGVwc2lsb24gb2YgZWFjaCBvdGhlci4KKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgZGVmIHNlbGYuYmFzaWNhbGx5X2VxdWFsPyhudW0xLCBudW0yKQorICAgICAgKG51bTEgLSBudW0yKS5hYnMgPCBlcHNpbG9uCisgICAgZW5kCisKKyAgICAjIEBwcml2YXRlCisgICAgZGVmIHNlbGYucm91bmQobnVtKQorICAgICAgaWYgbnVtLmlzX2E/KEZsb2F0KSAmJiAobnVtLmluZmluaXRlPyB8fCBudW0ubmFuPykKKyAgICAgICAgbnVtCisgICAgICBlbHNpZiBiYXNpY2FsbHlfZXF1YWw/KG51bSAlIDEsIDAuMCkKKyAgICAgICAgbnVtLnJvdW5kCisgICAgICBlbHNlCisgICAgICAgICgobnVtICogcHJlY2lzaW9uX2ZhY3Rvcikucm91bmQgLyBwcmVjaXNpb25fZmFjdG9yKS50b19mCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIE9QRVJBVElPTlMgPSBbOissIDotLCA6PD0sIDo8LCA6PiwgOj49LCA6JV0KKworICAgIGRlZiBvcGVyYXRlKG90aGVyLCBvcGVyYXRpb24pCisgICAgICB0aGlzID0gc2VsZgorICAgICAgaWYgT1BFUkFUSU9OUy5pbmNsdWRlPyhvcGVyYXRpb24pCisgICAgICAgIGlmIHVuaXRsZXNzPworICAgICAgICAgIHRoaXMgPSB0aGlzLmNvZXJjZShvdGhlci5udW1lcmF0b3JfdW5pdHMsIG90aGVyLmRlbm9taW5hdG9yX3VuaXRzKQorICAgICAgICBlbHNlCisgICAgICAgICAgb3RoZXIgPSBvdGhlci5jb2VyY2UoQG51bWVyYXRvcl91bml0cywgQGRlbm9taW5hdG9yX3VuaXRzKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgIyBhdm9pZCBpbnRlZ2VyIGRpdmlzaW9uCisgICAgICB2YWx1ZSA9IDovID09IG9wZXJhdGlvbiA/IHRoaXMudmFsdWUudG9fZiA6IHRoaXMudmFsdWUKKyAgICAgIHJlc3VsdCA9IHZhbHVlLnNlbmQob3BlcmF0aW9uLCBvdGhlci52YWx1ZSkKKworICAgICAgaWYgcmVzdWx0LmlzX2E/KE51bWVyaWMpCisgICAgICAgIE51bWJlci5uZXcocmVzdWx0LCAqY29tcHV0ZV91bml0cyh0aGlzLCBvdGhlciwgb3BlcmF0aW9uKSkKKyAgICAgIGVsc2UgIyBCb29sZWFuIG9wCisgICAgICAgIEJvb2wubmV3KHJlc3VsdCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNvZXJjaW9uX2ZhY3Rvcihmcm9tX3VuaXRzLCB0b191bml0cykKKyAgICAgICMgZ2V0IGEgbGlzdCBvZiB1bm1hdGNoZWQgdW5pdHMKKyAgICAgIGZyb21fdW5pdHMsIHRvX3VuaXRzID0gc2Fuc19jb21tb25fdW5pdHMoZnJvbV91bml0cywgdG9fdW5pdHMpCisKKyAgICAgIGlmIGZyb21fdW5pdHMuc2l6ZSAhPSB0b191bml0cy5zaXplIHx8ICFjb252ZXJ0YWJsZT8oZnJvbV91bml0cyB8IHRvX3VuaXRzKQorICAgICAgICByYWlzZSBTYXNzOjpVbml0Q29udmVyc2lvbkVycm9yLm5ldygKKyAgICAgICAgICAiSW5jb21wYXRpYmxlIHVuaXRzOiAnI3tmcm9tX3VuaXRzLmpvaW4oJyonKX0nIGFuZCAnI3t0b191bml0cy5qb2luKCcqJyl9Jy4iKQorICAgICAgZW5kCisKKyAgICAgIGZyb21fdW5pdHMuemlwKHRvX3VuaXRzKS5pbmplY3QoMSkge3xtLCBwfCBtICogY29udmVyc2lvbl9mYWN0b3IocFswXSwgcFsxXSl9CisgICAgZW5kCisKKyAgICBkZWYgY29tcHV0ZV91bml0cyh0aGlzLCBvdGhlciwgb3BlcmF0aW9uKQorICAgICAgY2FzZSBvcGVyYXRpb24KKyAgICAgIHdoZW4gOioKKyAgICAgICAgW3RoaXMubnVtZXJhdG9yX3VuaXRzICsgb3RoZXIubnVtZXJhdG9yX3VuaXRzLAorICAgICAgICAgdGhpcy5kZW5vbWluYXRvcl91bml0cyArIG90aGVyLmRlbm9taW5hdG9yX3VuaXRzXQorICAgICAgd2hlbiA6LworICAgICAgICBbdGhpcy5udW1lcmF0b3JfdW5pdHMgKyBvdGhlci5kZW5vbWluYXRvcl91bml0cywKKyAgICAgICAgIHRoaXMuZGVub21pbmF0b3JfdW5pdHMgKyBvdGhlci5udW1lcmF0b3JfdW5pdHNdCisgICAgICBlbHNlCisgICAgICAgIFt0aGlzLm51bWVyYXRvcl91bml0cywgdGhpcy5kZW5vbWluYXRvcl91bml0c10KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIG5vcm1hbGl6ZSEKKyAgICAgIHJldHVybiBpZiB1bml0bGVzcz8KKyAgICAgIEBudW1lcmF0b3JfdW5pdHMsIEBkZW5vbWluYXRvcl91bml0cyA9CisgICAgICAgIHNhbnNfY29tbW9uX3VuaXRzKEBudW1lcmF0b3JfdW5pdHMsIEBkZW5vbWluYXRvcl91bml0cykKKworICAgICAgQGRlbm9taW5hdG9yX3VuaXRzLmVhY2hfd2l0aF9pbmRleCBkbyB8ZCwgaXwKKyAgICAgICAgbmV4dCB1bmxlc3MgY29udmVydGFibGU/KGQpICYmICh1ID0gQG51bWVyYXRvcl91bml0cy5maW5kKCZtZXRob2QoOmNvbnZlcnRhYmxlPykpKQorICAgICAgICBAdmFsdWUgLz0gY29udmVyc2lvbl9mYWN0b3IoZCwgdSkKKyAgICAgICAgQGRlbm9taW5hdG9yX3VuaXRzLmRlbGV0ZV9hdChpKQorICAgICAgICBAbnVtZXJhdG9yX3VuaXRzLmRlbGV0ZV9hdChAbnVtZXJhdG9yX3VuaXRzLmluZGV4KHUpKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFRoaXMgaXMgdGhlIHNvdXJjZSBkYXRhIGZvciBhbGwgdGhlIHVuaXQgbG9naWMuIEl0J3MgcHJlLXByb2Nlc3NlZCB0byBtYWtlCisgICAgIyBpdCBlZmZpY2llbnQgdG8gZmlndXJlIG91dCB3aGV0aGVyIGEgc2V0IG9mIHVuaXRzIGlzIG11dHVhbGx5IGNvbXBhdGlibGUKKyAgICAjIGFuZCB3aGF0IHRoZSBjb252ZXJzaW9uIHJhdGlvIGlzIGJldHdlZW4gdHdvIHVuaXRzLgorICAgICMKKyAgICAjIFRoZXNlIGNvbWUgZnJvbSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWNzczMtdmFsdWVzLTIwMTIwMzA4Ly4KKyAgICByZWxhdGl2ZV9zaXplcyA9IFsKKyAgICAgIHsKKyAgICAgICAgJ2luJyA9PiBSYXRpb25hbCgxKSwKKyAgICAgICAgJ2NtJyA9PiBSYXRpb25hbCgxLCAyLjU0KSwKKyAgICAgICAgJ3BjJyA9PiBSYXRpb25hbCgxLCA2KSwKKyAgICAgICAgJ21tJyA9PiBSYXRpb25hbCgxLCAyNS40KSwKKyAgICAgICAgJ3EnID0+IFJhdGlvbmFsKDEsIDEwMS42KSwKKyAgICAgICAgJ3B0JyA9PiBSYXRpb25hbCgxLCA3MiksCisgICAgICAgICdweCcgPT4gUmF0aW9uYWwoMSwgOTYpCisgICAgICB9LAorICAgICAgeworICAgICAgICAnZGVnJyAgPT4gUmF0aW9uYWwoMSwgMzYwKSwKKyAgICAgICAgJ2dyYWQnID0+IFJhdGlvbmFsKDEsIDQwMCksCisgICAgICAgICdyYWQnICA9PiBSYXRpb25hbCgxLCAyICogTWF0aDo6UEkpLAorICAgICAgICAndHVybicgPT4gUmF0aW9uYWwoMSkKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICdzJyAgPT4gUmF0aW9uYWwoMSksCisgICAgICAgICdtcycgPT4gUmF0aW9uYWwoMSwgMTAwMCkKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICdIeicgID0+IFJhdGlvbmFsKDEpLAorICAgICAgICAna0h6JyA9PiBSYXRpb25hbCgxMDAwKQorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgJ2RwaScgID0+IFJhdGlvbmFsKDEpLAorICAgICAgICAnZHBjbScgPT4gUmF0aW9uYWwoMjU0LCAxMDApLAorICAgICAgICAnZHBweCcgPT4gUmF0aW9uYWwoOTYpCisgICAgICB9CisgICAgXQorCisgICAgIyBBIGhhc2ggZnJvbSBlYWNoIGtub3duIHVuaXQgdG8gdGhlIHNldCBvZiB1bml0cyB0aGF0IGl0J3MgbXV0dWFsbHkKKyAgICAjIGNvbnZlcnRpYmxlIHdpdGguCisgICAgTVVUVUFMTFlfQ09OVkVSVElCTEUgPSB7fQorICAgIHJlbGF0aXZlX3NpemVzLm1hcCBkbyB8dmFsdWVzfAorICAgICAgc2V0ID0gdmFsdWVzLmtleXMudG9fc2V0CisgICAgICB2YWx1ZXMua2V5cy5lYWNoIHt8bmFtZXwgTVVUVUFMTFlfQ09OVkVSVElCTEVbbmFtZV0gPSBzZXR9CisgICAgZW5kCisKKyAgICAjIEEgdHdvLWRpbWVuc2lvbmFsIGhhc2ggZnJvbSB0d28gdW5pdHMgdG8gdGhlIGNvbnZlcnNpb24gcmF0aW8gYmV0d2VlbgorICAgICMgdGhlbS4gTXVsdGlwbHkgYFhgIGJ5IGBDT05WRVJTSU9OX1RBQkxFW1hdW1ldYCB0byBjb252ZXJ0IGl0IHRvIGBZYC4KKyAgICBDT05WRVJTSU9OX1RBQkxFID0ge30KKyAgICByZWxhdGl2ZV9zaXplcy5lYWNoIGRvIHx2YWx1ZXN8CisgICAgICB2YWx1ZXMuZWFjaCBkbyB8KG5hbWUxLCB2YWx1ZTEpfAorICAgICAgICBDT05WRVJTSU9OX1RBQkxFW25hbWUxXSB8fD0ge30KKyAgICAgICAgdmFsdWVzLmVhY2ggZG8gfChuYW1lMiwgdmFsdWUyKXwKKyAgICAgICAgICB2YWx1ZSA9IHZhbHVlMSAvIHZhbHVlMgorICAgICAgICAgIENPTlZFUlNJT05fVEFCTEVbbmFtZTFdW25hbWUyXSA9IHZhbHVlLmRlbm9taW5hdG9yID09IDEgPyB2YWx1ZS50b19pIDogdmFsdWUudG9fZgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNvbnZlcnNpb25fZmFjdG9yKGZyb21fdW5pdCwgdG9fdW5pdCkKKyAgICAgIENPTlZFUlNJT05fVEFCTEVbZnJvbV91bml0XVt0b191bml0XQorICAgIGVuZAorCisgICAgZGVmIGNvbnZlcnRhYmxlPyh1bml0cykKKyAgICAgIHVuaXRzID0gQXJyYXkodW5pdHMpLnRvX3NldAorICAgICAgcmV0dXJuIHRydWUgaWYgdW5pdHMuZW1wdHk/CisgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIChtdXR1YWxseV9jb252ZXJ0aWJsZSA9IE1VVFVBTExZX0NPTlZFUlRJQkxFW3VuaXRzLmZpcnN0XSkKKyAgICAgIHVuaXRzLnN1YnNldD8obXV0dWFsbHlfY29udmVydGlibGUpCisgICAgZW5kCisKKyAgICBkZWYgc2Fuc19jb21tb25fdW5pdHModW5pdHMxLCB1bml0czIpCisgICAgICB1bml0czIgPSB1bml0czIuZHVwCisgICAgICAjIENhbid0IGp1c3QgdXNlIC0sIGJlY2F1c2Ugd2Ugd2FudCBweCpweCB0byBjb2VyY2UgcHJvcGVybHkgdG8gcHgqbW0KKyAgICAgIHVuaXRzMSA9IHVuaXRzMS5tYXAgZG8gfHV8CisgICAgICAgIGogPSB1bml0czIuaW5kZXgodSkKKyAgICAgICAgbmV4dCB1IHVubGVzcyBqCisgICAgICAgIHVuaXRzMi5kZWxldGVfYXQoaikKKyAgICAgICAgbmlsCisgICAgICBlbmQKKyAgICAgIHVuaXRzMS5jb21wYWN0IQorICAgICAgcmV0dXJuIHVuaXRzMSwgdW5pdHMyCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9zdHJpbmcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NjcmlwdC92YWx1ZS9zdHJpbmcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5YjA4OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2NyaXB0L3ZhbHVlL3N0cmluZy5yYgpAQCAtMCwwICsxLDEzOCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK21vZHVsZSBTYXNzOjpTY3JpcHQ6OlZhbHVlCisgICMgQSBTYXNzU2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgYSBDU1Mgc3RyaW5nICpvciogYSBDU1MgaWRlbnRpZmllci4KKyAgY2xhc3MgU3RyaW5nIDwgQmFzZQorICAgIEBAaW50ZXJwb2xhdGlvbl9kZXByZWNhdGlvbiA9IFNhc3M6OkRlcHJlY2F0aW9uLm5ldworCisgICAgIyBUaGUgUnVieSB2YWx1ZSBvZiB0aGUgc3RyaW5nLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX3JlYWRlciA6dmFsdWUKKworICAgICMgV2hldGhlciB0aGlzIGlzIGEgQ1NTIHN0cmluZyBvciBhIENTUyBpZGVudGlmaWVyLgorICAgICMgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBzdHJpbmdzIGFyZSB3cml0dGVuIHdpdGggZG91YmxlLXF1b3RlcywKKyAgICAjIHdoaWxlIGlkZW50aWZpZXJzIGFyZW4ndC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTeW1ib2xdIGA6c3RyaW5nYCBvciBgOmlkZW50aWZpZXJgCisgICAgYXR0cl9yZWFkZXIgOnR5cGUKKworICAgIGRlZiBzZWxmLnZhbHVlKGNvbnRlbnRzKQorICAgICAgY29udGVudHMuZ3N1YigiXFxcbiIsICIiKS5nc3ViKC9cXCg/OihbMC05YS1mQS1GXXsxLDZ9KVxzP3woLikpLykgZG8KKyAgICAgICAgbmV4dCAkMiBpZiAkMgorICAgICAgICAjIEhhbmRsZSB1bmljb2RlIGVzY2FwZXMgYXMgcGVyIENTUyBTeW50YXggTGV2ZWwgMyBzZWN0aW9uIDQuMy44LgorICAgICAgICBjb2RlX3BvaW50ID0gJDEudG9faSgxNikKKyAgICAgICAgaWYgY29kZV9wb2ludCA9PSAwIHx8IGNvZGVfcG9pbnQgPiAweDEwRkZGRiB8fAorICAgICAgICAgICAgKGNvZGVfcG9pbnQgPj0gMHhEODAwICYmIGNvZGVfcG9pbnQgPD0gMHhERkZGKQorICAgICAgICAgICfvv70nCisgICAgICAgIGVsc2UKKyAgICAgICAgICBbY29kZV9wb2ludF0ucGFjaygiVSIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIHF1b3RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYGNvbnRlbnRzYC4KKyAgICAjCisgICAgIyBAb3B0aW9ucyBvcHRzIDpxdW90ZSBbU3RyaW5nXQorICAgICMgICBUaGUgcHJlZmVycmVkIHF1b3RlIHN0eWxlIGZvciBxdW90ZWQgc3RyaW5ncy4gSWYgYDpub25lYCwgc3RyaW5ncyBhcmUKKyAgICAjICAgYWx3YXlzIGVtaXR0ZWQgdW5xdW90ZWQuIElmIGBuaWxgLCBxdW90aW5nIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseS4KKyAgICAjIEBvcHRpb25zIG9wdHMgOnNhc3MgW1N0cmluZ10KKyAgICAjICAgV2hldGhlciB0byBxdW90ZSBzdHJpbmdzIGZvciBTYXNzIHNvdXJjZSwgYXMgb3Bwb3NlZCB0byBDU1MuIERlZmF1bHRzIHRvIGBmYWxzZWAuCisgICAgZGVmIHNlbGYucXVvdGUoY29udGVudHMsIG9wdHMgPSB7fSkKKyAgICAgIHF1b3RlID0gb3B0c1s6cXVvdGVdCisKKyAgICAgICMgU2hvcnQtY2lyY3VpdCBpZiB0aGVyZSBhcmUgbm8gY2hhcmFjdGVycyB0aGF0IG5lZWQgcXVvdGluZy4KKyAgICAgIHVubGVzcyBjb250ZW50cyA9fiAvW1xuXFwiJ118XCNcey8KKyAgICAgICAgcXVvdGUgfHw9ICciJworICAgICAgICByZXR1cm4gIiN7cXVvdGV9I3tjb250ZW50c30je3F1b3RlfSIKKyAgICAgIGVuZAorCisgICAgICBpZiBxdW90ZS5uaWw/CisgICAgICAgIGlmIGNvbnRlbnRzLmluY2x1ZGU/KCciJykKKyAgICAgICAgICBpZiBjb250ZW50cy5pbmNsdWRlPygiJyIpCisgICAgICAgICAgICBxdW90ZSA9ICciJworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHF1b3RlID0gIiciCisgICAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICBxdW90ZSA9ICciJworICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFJlcGxhY2Ugc2luZ2xlIGJhY2tzbGFzaGVzIHdpdGggbXVsdGlwbGVzLgorICAgICAgY29udGVudHMgPSBjb250ZW50cy5nc3ViKCJcXCIsICJcXFxcXFxcXCIpCisKKyAgICAgICMgRXNjYXBlIGludGVycG9sYXRpb24uCisgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLmdzdWIoJyN7JywgIlxcXCN7IikgaWYgb3B0c1s6c2Fzc10KKworICAgICAgaWYgcXVvdGUgPT0gJyInCisgICAgICAgIGNvbnRlbnRzID0gY29udGVudHMuZ3N1YignIicsICJcXFwiIikKKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5nc3ViKCInIiwgIlxcJyIpCisgICAgICBlbmQKKworICAgICAgY29udGVudHMgPSBjb250ZW50cy5nc3ViKC9cbig/IVthLWZBLUYwLTlcc10pLywgIlxcYSIpLmdzdWIoIlxuIiwgIlxcYSAiKQorICAgICAgIiN7cXVvdGV9I3tjb250ZW50c30je3F1b3RlfSIKKyAgICBlbmQKKworICAgICMgQ3JlYXRlcyBhIG5ldyBzdHJpbmcuCisgICAgIworICAgICMgQHBhcmFtIHZhbHVlIFtTdHJpbmddIFNlZSBceyN2YWx1ZX0KKyAgICAjIEBwYXJhbSB0eXBlIFtTeW1ib2xdIFNlZSBceyN0eXBlfQorICAgICMgQHBhcmFtIGRlcHJlY2F0ZWRfaW50ZXJwX2VxdWl2YWxlbnQgW1N0cmluZz9dCisgICAgIyAgIElmIHRoaXMgd2FzIGNyZWF0ZWQgdmlhIGEgcG90ZW50aWFsbHktZGVwcmVjYXRlZCBzdHJpbmcgaW50ZXJwb2xhdGlvbiwKKyAgICAjICAgdGhpcyBpcyB0aGUgcmVwbGFjZW1lbnQgZXhwcmVzc2lvbiB0aGF0IHNob3VsZCBiZSBzdWdnZXN0ZWQgdG8gdGhlIHVzZXIuCisgICAgZGVmIGluaXRpYWxpemUodmFsdWUsIHR5cGUgPSA6aWRlbnRpZmllciwgZGVwcmVjYXRlZF9pbnRlcnBfZXF1aXZhbGVudCA9IG5pbCkKKyAgICAgIHN1cGVyKHZhbHVlKQorICAgICAgQHR5cGUgPSB0eXBlCisgICAgICBAZGVwcmVjYXRlZF9pbnRlcnBfZXF1aXZhbGVudCA9IGRlcHJlY2F0ZWRfaW50ZXJwX2VxdWl2YWxlbnQKKyAgICBlbmQKKworICAgICMgQHNlZSBWYWx1ZSNwbHVzCisgICAgZGVmIHBsdXMob3RoZXIpCisgICAgICBvdGhlcl92YWx1ZSA9IGlmIG90aGVyLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlci52YWx1ZQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXIudG9fcyg6cXVvdGUgPT4gOm5vbmUpCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldyh2YWx1ZSArIG90aGVyX3ZhbHVlLCB0eXBlKQorICAgIGVuZAorCisgICAgIyBAc2VlIFZhbHVlI3RvX3MKKyAgICBkZWYgdG9fcyhvcHRzID0ge30pCisgICAgICByZXR1cm4gQHZhbHVlLmdzdWIoL1xuXHMqLywgJyAnKSBpZiBvcHRzWzpxdW90ZV0gPT0gOm5vbmUgfHwgQHR5cGUgPT0gOmlkZW50aWZpZXIKKyAgICAgIFN0cmluZy5xdW90ZSh2YWx1ZSwgb3B0cykKKyAgICBlbmQKKworICAgICMgQHNlZSBWYWx1ZSN0b19zYXNzCisgICAgZGVmIHRvX3Nhc3Mob3B0cyA9IHt9KQorICAgICAgdG9fcyhvcHRzLm1lcmdlKDpzYXNzID0+IHRydWUpKQorICAgIGVuZAorCisgICAgZGVmIHNlcGFyYXRvcgorICAgICAgY2hlY2tfZGVwcmVjYXRlZF9pbnRlcnAKKyAgICAgIHN1cGVyCisgICAgZW5kCisKKyAgICBkZWYgdG9fYQorICAgICAgY2hlY2tfZGVwcmVjYXRlZF9pbnRlcnAKKyAgICAgIHN1cGVyCisgICAgZW5kCisKKyAgICAjIFByaW50cyBhIHdhcm5pbmcgaWYgdGhpcyBzdHJpbmcgd2FzIGNyZWF0ZWQgdXNpbmcgcG90ZW50aWFsbHktZGVwcmVjYXRlZAorICAgICMgaW50ZXJwb2xhdGlvbi4KKyAgICBkZWYgY2hlY2tfZGVwcmVjYXRlZF9pbnRlcnAKKyAgICAgIHJldHVybiB1bmxlc3MgQGRlcHJlY2F0ZWRfaW50ZXJwX2VxdWl2YWxlbnQKKworICAgICAgQEBpbnRlcnBvbGF0aW9uX2RlcHJlY2F0aW9uLndhcm4oc291cmNlX3JhbmdlLmZpbGUsIHNvdXJjZV9yYW5nZS5zdGFydF9wb3MubGluZSwgPDxXQVJOSU5HKQorXCN7fSBpbnRlcnBvbGF0aW9uIG5lYXIgb3BlcmF0b3JzIHdpbGwgYmUgc2ltcGxpZmllZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNhc3MuCitUbyBwcmVzZXJ2ZSB0aGUgY3VycmVudCBiZWhhdmlvciwgdXNlIHF1b3RlczoKKworICAje0BkZXByZWNhdGVkX2ludGVycF9lcXVpdmFsZW50fQorV0FSTklORworICAgIGVuZAorCisgICAgZGVmIGluc3BlY3QKKyAgICAgIFN0cmluZy5xdW90ZSh2YWx1ZSkKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2Nzcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2Nzcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDZlY2RiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3NzLnJiCkBAIC0wLDAgKzEsMTQgQEAKK3JlcXVpcmUgJ3Nhc3Mvc2Nzcy9yeCcKK3JlcXVpcmUgJ3Nhc3Mvc2Nzcy9wYXJzZXInCityZXF1aXJlICdzYXNzL3Njc3Mvc3RhdGljX3BhcnNlcicKK3JlcXVpcmUgJ3Nhc3Mvc2Nzcy9jc3NfcGFyc2VyJworCittb2R1bGUgU2FzcworICAjIFNDU1MgaXMgdGhlIENTUyBzeW50YXggZm9yIFNhc3MuCisgICMgSXQgcGFyc2VzIGludG8gdGhlIHNhbWUgc3ludGF4IHRyZWUgYXMgU2FzcywKKyAgIyBhbmQgZ2VuZXJhdGVzIHRoZSBzYW1lIHNvcnQgb2Ygb3V0cHV0IENTUy4KKyAgIworICAjIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvZGUgZm9yIHRoZSBwYXJzaW5nIG9mIFNDU1MuCisgICMgVGhlIGV2YWx1YXRpb24gaXMgaGFuZGxlZCBieSB0aGUgYnJvYWRlciB7U2Fzc30gbW9kdWxlLgorICBtb2R1bGUgU0NTUzsgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2Nzcy9jc3NfcGFyc2VyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3NzL2Nzc19wYXJzZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1OTJlYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2Nzcy9jc3NfcGFyc2VyLnJiCkBAIC0wLDAgKzEsNTYgQEAKK3JlcXVpcmUgJ3Nhc3Mvc2NyaXB0L2Nzc19wYXJzZXInCisKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBTQ1NTCisgICAgIyBUaGlzIGlzIGEgc3ViY2xhc3Mgb2Yge1BhcnNlcn0gd2hpY2ggb25seSBwYXJzZXMgcGxhaW4gQ1NTLgorICAgICMgSXQgZG9lc24ndCBzdXBwb3J0IGFueSBTYXNzIGV4dGVuc2lvbnMsIHN1Y2ggYXMgaW50ZXJwb2xhdGlvbiwKKyAgICAjIHBhcmVudCByZWZlcmVuY2VzLCBuZXN0ZWQgc2VsZWN0b3JzLCBhbmQgc28gZm9ydGguCisgICAgIyBJdCBkb2VzIHN1cHBvcnQgYWxsIHRoZSBzYW1lIENTUyBoYWNrcyBhcyB0aGUgU0NTUyBwYXJzZXIsIHRob3VnaC4KKyAgICBjbGFzcyBDc3NQYXJzZXIgPCBTdGF0aWNQYXJzZXIKKyAgICAgIHByaXZhdGUKKworICAgICAgZGVmIHBsYWNlaG9sZGVyX3NlbGVjdG9yOyBuaWw7IGVuZAorICAgICAgZGVmIHBhcmVudF9zZWxlY3RvcjsgbmlsOyBlbmQKKyAgICAgIGRlZiBpbnRlcnBvbGF0aW9uKHdhcm5fZm9yX2NvbG9yID0gZmFsc2UpOyBuaWw7IGVuZAorICAgICAgZGVmIHVzZV9jc3NfaW1wb3J0PzsgdHJ1ZTsgZW5kCisKKyAgICAgIGRlZiBibG9ja19jb250ZW50cyhub2RlLCBjb250ZXh0KQorICAgICAgICBpZiBub2RlLmlzX2E/KFNhc3M6OlRyZWU6OkRpcmVjdGl2ZU5vZGUpICYmIG5vZGUubm9ybWFsaXplZF9uYW1lID09ICdAa2V5ZnJhbWVzJworICAgICAgICAgIGNvbnRleHQgPSA6a2V5ZnJhbWVzCisgICAgICAgIGVuZAorICAgICAgICBzdXBlcihub2RlLCBjb250ZXh0KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBibG9ja19jaGlsZChjb250ZXh0KQorICAgICAgICBjYXNlIGNvbnRleHQKKyAgICAgICAgd2hlbiA6cnVsZXNldAorICAgICAgICAgIGRlY2xhcmF0aW9uCisgICAgICAgIHdoZW4gOnN0eWxlc2hlZXQKKyAgICAgICAgICBkaXJlY3RpdmUgfHwgcnVsZXNldAorICAgICAgICB3aGVuIDpkaXJlY3RpdmUKKyAgICAgICAgICBkaXJlY3RpdmUgfHwgZGVjbGFyYXRpb25fb3JfcnVsZXNldAorICAgICAgICB3aGVuIDprZXlmcmFtZXMKKyAgICAgICAgICBrZXlmcmFtZXNfcnVsZXNldAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgbmVzdGVkX3Byb3BlcnRpZXMhKG5vZGUpCisgICAgICAgIGV4cGVjdGVkKCdleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCknKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBydWxlc2V0CisgICAgICAgIHN0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICByZXR1cm4gdW5sZXNzIChzZWxlY3RvciA9IHNlbGVjdG9yX2NvbW1hX3NlcXVlbmNlKQorICAgICAgICBibG9jayhub2RlKFNhc3M6OlRyZWU6OlJ1bGVOb2RlLm5ldyhzZWxlY3RvciwgcmFuZ2Uoc3RhcnRfcG9zKSksIHN0YXJ0X3BvcyksIDpydWxlc2V0KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBrZXlmcmFtZXNfcnVsZXNldAorICAgICAgICBzdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgcmV0dXJuIHVubGVzcyAoc2VsZWN0b3IgPSBrZXlmcmFtZXNfc2VsZWN0b3IpCisgICAgICAgIGJsb2NrKG5vZGUoU2Fzczo6VHJlZTo6S2V5ZnJhbWVSdWxlTm9kZS5uZXcoc2VsZWN0b3Iuc3RyaXApLCBzdGFydF9wb3MpLCA6cnVsZXNldCkKKyAgICAgIGVuZAorCisgICAgICBAc2Fzc19zY3JpcHRfcGFyc2VyID0gU2Fzczo6U2NyaXB0OjpDc3NQYXJzZXIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2Nzcy9wYXJzZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3Njc3MvcGFyc2VyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTI2NmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3Njc3MvcGFyc2VyLnJiCkBAIC0wLDAgKzEsMTMxMyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK3JlcXVpcmUgJ3NldCcKKworbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFNDU1MKKyAgICAjIFRoZSBwYXJzZXIgZm9yIFNDU1MuCisgICAgIyBJdCBwYXJzZXMgYSBzdHJpbmcgb2YgY29kZSBpbnRvIGEgdHJlZSBvZiB7U2Fzczo6VHJlZTo6Tm9kZX1zLgorICAgIGNsYXNzIFBhcnNlcgorICAgICAgIyBFeHBvc2UgZm9yIHRoZSBTQVNTIHBhcnNlci4KKyAgICAgIGF0dHJfYWNjZXNzb3IgOm9mZnNldAorCisgICAgICAjIEBwYXJhbSBzdHIgW1N0cmluZywgU3RyaW5nU2Nhbm5lcl0gVGhlIHNvdXJjZSBkb2N1bWVudCB0byBwYXJzZS4KKyAgICAgICMgICBOb3RlIHRoYXQgYFBhcnNlcmAgKndvbid0KiByYWlzZSBhIG5pY2UgZXJyb3IgbWVzc2FnZSBpZiB0aGlzIGlzbid0IHByb3Blcmx5IHBhcnNlZDsKKyAgICAgICMgICBmb3IgdGhhdCwgeW91IHNob3VsZCB1c2UgdGhlIGhpZ2hlci1sZXZlbCB7U2Fzczo6RW5naW5lfSBvciB7U2Fzczo6Q1NTfS4KKyAgICAgICMgQHBhcmFtIGZpbGVuYW1lIFtTdHJpbmddIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlaW5nIHBhcnNlZC4gVXNlZCBmb3IKKyAgICAgICMgICB3YXJuaW5ncyBhbmQgc291cmNlIG1hcHMuCisgICAgICAjIEBwYXJhbSBpbXBvcnRlciBbU2Fzczo6SW1wb3J0ZXJzOjpCYXNlXSBUaGUgaW1wb3J0ZXIgdXNlZCB0byBpbXBvcnQgdGhlCisgICAgICAjICAgZmlsZSBiZWluZyBwYXJzZWQuIFVzZWQgZm9yIHNvdXJjZSBtYXBzLgorICAgICAgIyBAcGFyYW0gbGluZSBbSW50ZWdlcl0gVGhlIDEtYmFzZWQgbGluZSBvbiB3aGljaCB0aGUgc291cmNlIHN0cmluZyBhcHBlYXJlZCwKKyAgICAgICMgICBpZiBpdCdzIHBhcnQgb2YgYW5vdGhlciBkb2N1bWVudC4KKyAgICAgICMgQHBhcmFtIG9mZnNldCBbSW50ZWdlcl0gVGhlIDEtYmFzZWQgY2hhcmFjdGVyIChub3QgYnl0ZSkgb2Zmc2V0IGluIHRoZSBsaW5lIG9uCisgICAgICAjICAgd2hpY2ggdGhlIHNvdXJjZSBzdHJpbmcgc3RhcnRzLiBVc2VkIGZvciBlcnJvciByZXBvcnRpbmcgYW5kIHNvdXJjZW1hcAorICAgICAgIyAgIGJ1aWxkaW5nLgorICAgICAgZGVmIGluaXRpYWxpemUoc3RyLCBmaWxlbmFtZSwgaW1wb3J0ZXIsIGxpbmUgPSAxLCBvZmZzZXQgPSAxKQorICAgICAgICBAdGVtcGxhdGUgPSBzdHIKKyAgICAgICAgQGZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgQGltcG9ydGVyID0gaW1wb3J0ZXIKKyAgICAgICAgQGxpbmUgPSBsaW5lCisgICAgICAgIEBvZmZzZXQgPSBvZmZzZXQKKyAgICAgICAgQHN0cnMgPSBbXQorICAgICAgICBAZXhwZWN0ZWQgPSBuaWwKKyAgICAgICAgQHRocm93X2Vycm9yID0gZmFsc2UKKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlcyBhbiBTQ1NTIGRvY3VtZW50LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTYXNzOjpUcmVlOjpSb290Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgZG9jdW1lbnQgdHJlZQorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGVyZSdzIGEgc3ludGF4IGVycm9yIGluIHRoZSBkb2N1bWVudAorICAgICAgZGVmIHBhcnNlCisgICAgICAgIGluaXRfc2Nhbm5lciEKKyAgICAgICAgcm9vdCA9IHN0eWxlc2hlZXQKKyAgICAgICAgZXhwZWN0ZWQoInNlbGVjdG9yIG9yIGF0LXJ1bGUiKSB1bmxlc3Mgcm9vdCAmJiBAc2Nhbm5lci5lb3M/CisgICAgICAgIHJvb3QKKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlcyBhbiBpZGVudGlmaWVyIHdpdGggaW50ZXJwb2xhdGlvbi4KKyAgICAgICMgTm90ZSB0aGF0IHRoaXMgd29uJ3QgYXNzZXJ0IHRoYXQgdGhlIGlkZW50aWZpZXIgdGFrZXMgdXAgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmc7CisgICAgICAjIGl0J3MgbWVhbnQgdG8gYmUgdXNlZCB3aXRoIGBTdHJpbmdTY2FubmVyYHMgYXMgcGFydCBvZiBvdGhlciBwYXJzZXJzLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT4sIG5pbF0KKyAgICAgICMgICBUaGUgaW50ZXJwb2xhdGVkIGlkZW50aWZpZXIsIG9yIG5pbCBpZiBub25lIGNvdWxkIGJlIHBhcnNlZAorICAgICAgZGVmIHBhcnNlX2ludGVycF9pZGVudAorICAgICAgICBpbml0X3NjYW5uZXIhCisgICAgICAgIGludGVycF9pZGVudAorICAgICAgZW5kCisKKyAgICAgICMgUGFyc2VzIGEgc3VwcG9ydHMgY2xhdXNlIGZvciBhbiBAaW1wb3J0IGRpcmVjdGl2ZQorICAgICAgZGVmIHBhcnNlX3N1cHBvcnRzX2NsYXVzZQorICAgICAgICBpbml0X3NjYW5uZXIhCisgICAgICAgIHNzCisgICAgICAgIGNsYXVzZSA9IHN1cHBvcnRzX2NsYXVzZQorICAgICAgICBzcworICAgICAgICBjbGF1c2UKKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlcyBhIG1lZGlhIHF1ZXJ5IGxpc3QuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1Nhc3M6Ok1lZGlhOjpRdWVyeUxpc3RdIFRoZSBwYXJzZWQgcXVlcnkgbGlzdAorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGVyZSdzIGEgc3ludGF4IGVycm9yIGluIHRoZSBxdWVyeSBsaXN0LAorICAgICAgIyAgIG9yIGlmIGl0IGRvZXNuJ3QgdGFrZSB1cCB0aGUgZW50aXJlIGlucHV0IHN0cmluZy4KKyAgICAgIGRlZiBwYXJzZV9tZWRpYV9xdWVyeV9saXN0CisgICAgICAgIGluaXRfc2Nhbm5lciEKKyAgICAgICAgcWwgPSBtZWRpYV9xdWVyeV9saXN0CisgICAgICAgIGV4cGVjdGVkKCJtZWRpYSBxdWVyeSBsaXN0IikgdW5sZXNzIHFsICYmIEBzY2FubmVyLmVvcz8KKyAgICAgICAgcWwKKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlcyBhbiBhdC1yb290IHF1ZXJ5LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDs6VHJlZTo6Tm9kZT5dIFRoZSBpbnRlcnBvbGF0ZWQgcXVlcnkuCisgICAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIGlmIHRoZXJlJ3MgYSBzeW50YXggZXJyb3IgaW4gdGhlIHF1ZXJ5LAorICAgICAgIyAgIG9yIGlmIGl0IGRvZXNuJ3QgdGFrZSB1cCB0aGUgZW50aXJlIGlucHV0IHN0cmluZy4KKyAgICAgIGRlZiBwYXJzZV9hdF9yb290X3F1ZXJ5CisgICAgICAgIGluaXRfc2Nhbm5lciEKKyAgICAgICAgcXVlcnkgPSBhdF9yb290X3F1ZXJ5CisgICAgICAgIGV4cGVjdGVkKCJAYXQtcm9vdCBxdWVyeSBsaXN0IikgdW5sZXNzIHF1ZXJ5ICYmIEBzY2FubmVyLmVvcz8KKyAgICAgICAgcXVlcnkKKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlcyBhIHN1cHBvcnRzIHF1ZXJ5IGNvbmRpdGlvbi4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU2Fzczo6U3VwcG9ydHM6OkNvbmRpdGlvbl0gVGhlIHBhcnNlZCBjb25kaXRpb24KKyAgICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgdGhlcmUncyBhIHN5bnRheCBlcnJvciBpbiB0aGUgY29uZGl0aW9uLAorICAgICAgIyAgIG9yIGlmIGl0IGRvZXNuJ3QgdGFrZSB1cCB0aGUgZW50aXJlIGlucHV0IHN0cmluZy4KKyAgICAgIGRlZiBwYXJzZV9zdXBwb3J0c19jb25kaXRpb24KKyAgICAgICAgaW5pdF9zY2FubmVyIQorICAgICAgICBjb25kaXRpb24gPSBzdXBwb3J0c19jb25kaXRpb24KKyAgICAgICAgZXhwZWN0ZWQoInN1cHBvcnRzIGNvbmRpdGlvbiIpIHVubGVzcyBjb25kaXRpb24gJiYgQHNjYW5uZXIuZW9zPworICAgICAgICBjb25kaXRpb24KKyAgICAgIGVuZAorCisgICAgICAjIFBhcnNlcyBhIGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nLCBTYXNzOjpTY3JpcHQ7OlRyZWU6Ok5vZGU+XSBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlLgorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGVyZSdzIGEgc3ludGF4IGVycm9yIGluIHRoZSB2YWx1ZSwKKyAgICAgICMgICBvciBpZiBpdCBkb2Vzbid0IHRha2UgdXAgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmcuCisgICAgICBkZWYgcGFyc2VfZGVjbGFyYXRpb25fdmFsdWUKKyAgICAgICAgaW5pdF9zY2FubmVyIQorICAgICAgICB2YWx1ZSA9IGRlY2xhcmF0aW9uX3ZhbHVlCisgICAgICAgIGV4cGVjdGVkKCcifSInKSB1bmxlc3MgdmFsdWUgJiYgQHNjYW5uZXIuZW9zPworICAgICAgICB2YWx1ZQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgaW5jbHVkZSBTYXNzOjpTQ1NTOjpSWAorCisgICAgICBkZWYgc291cmNlX3Bvc2l0aW9uCisgICAgICAgIFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCBAb2Zmc2V0KQorICAgICAgZW5kCisKKyAgICAgIGRlZiByYW5nZShzdGFydF9wb3MsIGVuZF9wb3MgPSBzb3VyY2VfcG9zaXRpb24pCisgICAgICAgIFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KHN0YXJ0X3BvcywgZW5kX3BvcywgQGZpbGVuYW1lLCBAaW1wb3J0ZXIpCisgICAgICBlbmQKKworICAgICAgZGVmIGluaXRfc2Nhbm5lciEKKyAgICAgICAgQHNjYW5uZXIgPQorICAgICAgICAgIGlmIEB0ZW1wbGF0ZS5pc19hPyhTdHJpbmdTY2FubmVyKQorICAgICAgICAgICAgQHRlbXBsYXRlCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgU2Fzczo6VXRpbDo6TXVsdGlieXRlU3RyaW5nU2Nhbm5lci5uZXcoQHRlbXBsYXRlLnRyKCJcciIsICIiKSkKKyAgICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3R5bGVzaGVldAorICAgICAgICBub2RlID0gbm9kZShTYXNzOjpUcmVlOjpSb290Tm9kZS5uZXcoQHNjYW5uZXIuc3RyaW5nKSwgc291cmNlX3Bvc2l0aW9uKQorICAgICAgICBibG9ja19jb250ZW50cyhub2RlLCA6c3R5bGVzaGVldCkge3Mobm9kZSl9CisgICAgICBlbmQKKworICAgICAgZGVmIHMobm9kZSkKKyAgICAgICAgd2hpbGUgdG9rKFMpIHx8IHRvayhDREMpIHx8IHRvayhDRE8pIHx8IChjID0gdG9rKFNJTkdMRV9MSU5FX0NPTU1FTlQpKSB8fCAoYyA9IHRvayhDT01NRU5UKSkKKyAgICAgICAgICBuZXh0IHVubGVzcyBjCisgICAgICAgICAgcHJvY2Vzc19jb21tZW50IGMsIG5vZGUKKyAgICAgICAgICBjID0gbmlsCisgICAgICAgIGVuZAorICAgICAgICB0cnVlCisgICAgICBlbmQKKworICAgICAgZGVmIHNzCisgICAgICAgIG5pbCB3aGlsZSB0b2soUykgfHwgdG9rKFNJTkdMRV9MSU5FX0NPTU1FTlQpIHx8IHRvayhDT01NRU5UKQorICAgICAgICB0cnVlCisgICAgICBlbmQKKworICAgICAgZGVmIHNzX2NvbW1lbnRzKG5vZGUpCisgICAgICAgIHdoaWxlIHRvayhTKSB8fCAoYyA9IHRvayhTSU5HTEVfTElORV9DT01NRU5UKSkgfHwgKGMgPSB0b2soQ09NTUVOVCkpCisgICAgICAgICAgbmV4dCB1bmxlc3MgYworICAgICAgICAgIHByb2Nlc3NfY29tbWVudCBjLCBub2RlCisgICAgICAgICAgYyA9IG5pbAorICAgICAgICBlbmQKKworICAgICAgICB0cnVlCisgICAgICBlbmQKKworICAgICAgZGVmIHdoaXRlc3BhY2UKKyAgICAgICAgcmV0dXJuIHVubGVzcyB0b2soUykgfHwgdG9rKFNJTkdMRV9MSU5FX0NPTU1FTlQpIHx8IHRvayhDT01NRU5UKQorICAgICAgICBzcworICAgICAgZW5kCisKKyAgICAgIGRlZiBwcm9jZXNzX2NvbW1lbnQodGV4dCwgbm9kZSkKKyAgICAgICAgc2lsZW50ID0gdGV4dCA9fiAlcntcQS8vfQorICAgICAgICBsb3VkID0gIXNpbGVudCAmJiB0ZXh0ID1+ICVye1xBL1svKl0hfQorICAgICAgICBsaW5lID0gQGxpbmUgLSB0ZXh0LmNvdW50KCJcbiIpCisgICAgICAgIGNvbW1lbnRfc3RhcnQgPSBAc2Nhbm5lci5wb3MgLSB0ZXh0Lmxlbmd0aAorICAgICAgICBpbmRleF9iZWZvcmVfbGluZSA9IEBzY2FubmVyLnN0cmluZy5yaW5kZXgoIlxuIiwgY29tbWVudF9zdGFydCkgfHwgLTEKKyAgICAgICAgb2Zmc2V0ID0gY29tbWVudF9zdGFydCAtIGluZGV4X2JlZm9yZV9saW5lCisKKyAgICAgICAgaWYgc2lsZW50CisgICAgICAgICAgdmFsdWUgPSBbdGV4dC5zdWIoJXJ7XEFccyovL30sICcvKicpLmdzdWIoJXJ7XlxzKi8vfSwgJyAqJykgKyAnICovJ10KKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlID0gU2Fzczo6RW5naW5lLnBhcnNlX2ludGVycCh0ZXh0LCBsaW5lLCBvZmZzZXQsIDpmaWxlbmFtZSA9PiBAZmlsZW5hbWUpCisgICAgICAgICAgbGluZV9iZWZvcmVfY29tbWVudCA9IEBzY2FubmVyLnN0cmluZ1tpbmRleF9iZWZvcmVfbGluZSArIDEuLi5jb21tZW50X3N0YXJ0XQorICAgICAgICAgIHZhbHVlLnVuc2hpZnQobGluZV9iZWZvcmVfY29tbWVudC5nc3ViKC9bXlxzXS8sICcgJykpCisgICAgICAgIGVuZAorCisgICAgICAgIHR5cGUgPSBpZiBzaWxlbnQKKyAgICAgICAgICAgICAgICAgOnNpbGVudAorICAgICAgICAgICAgICAgZWxzaWYgbG91ZAorICAgICAgICAgICAgICAgICA6bG91ZAorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICA6bm9ybWFsCisgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgc3RhcnRfcG9zID0gU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcobGluZSwgb2Zmc2V0KQorICAgICAgICBjb21tZW50ID0gbm9kZShTYXNzOjpUcmVlOjpDb21tZW50Tm9kZS5uZXcodmFsdWUsIHR5cGUpLCBzdGFydF9wb3MpCisgICAgICAgIG5vZGUgPDwgY29tbWVudAorICAgICAgZW5kCisKKyAgICAgIERJUkVDVElWRVMgPSBTZXRbOm1peGluLCA6aW5jbHVkZSwgOmZ1bmN0aW9uLCA6cmV0dXJuLCA6ZGVidWcsIDp3YXJuLCA6Zm9yLAorICAgICAgICA6ZWFjaCwgOndoaWxlLCA6aWYsIDplbHNlLCA6ZXh0ZW5kLCA6aW1wb3J0LCA6bWVkaWEsIDpjaGFyc2V0LCA6Y29udGVudCwKKyAgICAgICAgOl9tb3pfZG9jdW1lbnQsIDphdF9yb290LCA6ZXJyb3JdCisKKyAgICAgIFBSRUZJWEVEX0RJUkVDVElWRVMgPSBTZXRbOnN1cHBvcnRzXQorCisgICAgICBkZWYgZGlyZWN0aXZlCisgICAgICAgIHN0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICByZXR1cm4gdW5sZXNzIHRvaygvQC8pCisgICAgICAgIG5hbWUgPSB0b2shKElERU5UKQorICAgICAgICBzcworCisgICAgICAgIGlmIChkaXIgPSBzcGVjaWFsX2RpcmVjdGl2ZShuYW1lLCBzdGFydF9wb3MpKQorICAgICAgICAgIHJldHVybiBkaXIKKyAgICAgICAgZWxzaWYgKGRpciA9IHByZWZpeGVkX2RpcmVjdGl2ZShuYW1lLCBzdGFydF9wb3MpKQorICAgICAgICAgIHJldHVybiBkaXIKKyAgICAgICAgZW5kCisKKyAgICAgICAgdmFsID0gYWxtb3N0X2FueV92YWx1ZQorICAgICAgICB2YWwgPSB2YWwgPyBbIkAje25hbWV9ICJdICsgU2Fzczo6VXRpbC5zdHJpcF9zdHJpbmdfYXJyYXkodmFsKSA6IFsiQCN7bmFtZX0iXQorICAgICAgICBkaXJlY3RpdmVfYm9keSh2YWwsIHN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgZGlyZWN0aXZlX2JvZHkodmFsdWUsIHN0YXJ0X3BvcykKKyAgICAgICAgbm9kZSA9IFNhc3M6OlRyZWU6OkRpcmVjdGl2ZU5vZGUubmV3KHZhbHVlKQorCisgICAgICAgIGlmIHRvaygvXHsvKQorICAgICAgICAgIG5vZGUuaGFzX2NoaWxkcmVuID0gdHJ1ZQorICAgICAgICAgIGJsb2NrX2NvbnRlbnRzKG5vZGUsIDpkaXJlY3RpdmUpCisgICAgICAgICAgdG9rISgvXH0vKQorICAgICAgICBlbmQKKworICAgICAgICBub2RlKG5vZGUsIHN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3BlY2lhbF9kaXJlY3RpdmUobmFtZSwgc3RhcnRfcG9zKQorICAgICAgICBzeW0gPSBuYW1lLnRyKCctJywgJ18nKS50b19zeW0KKyAgICAgICAgRElSRUNUSVZFUy5pbmNsdWRlPyhzeW0pICYmIHNlbmQoIiN7c3ltfV9kaXJlY3RpdmUiLCBzdGFydF9wb3MpCisgICAgICBlbmQKKworICAgICAgZGVmIHByZWZpeGVkX2RpcmVjdGl2ZShuYW1lLCBzdGFydF9wb3MpCisgICAgICAgIHN5bSA9IGRlcHJlZml4KG5hbWUpLnRyKCctJywgJ18nKS50b19zeW0KKyAgICAgICAgUFJFRklYRURfRElSRUNUSVZFUy5pbmNsdWRlPyhzeW0pICYmIHNlbmQoIiN7c3ltfV9kaXJlY3RpdmUiLCBuYW1lLCBzdGFydF9wb3MpCisgICAgICBlbmQKKworICAgICAgZGVmIG1peGluX2RpcmVjdGl2ZShzdGFydF9wb3MpCisgICAgICAgIG5hbWUgPSB0b2shIElERU5UCisgICAgICAgIGFyZ3MsIHNwbGF0ID0gc2Fzc19zY3JpcHQoOnBhcnNlX21peGluX2RlZmluaXRpb25fYXJnbGlzdCkKKyAgICAgICAgc3MKKyAgICAgICAgYmxvY2sobm9kZShTYXNzOjpUcmVlOjpNaXhpbkRlZk5vZGUubmV3KG5hbWUsIGFyZ3MsIHNwbGF0KSwgc3RhcnRfcG9zKSwgOmRpcmVjdGl2ZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgaW5jbHVkZV9kaXJlY3RpdmUoc3RhcnRfcG9zKQorICAgICAgICBuYW1lID0gdG9rISBJREVOVAorICAgICAgICBhcmdzLCBrZXl3b3Jkcywgc3BsYXQsIGt3YXJnX3NwbGF0ID0gc2Fzc19zY3JpcHQoOnBhcnNlX21peGluX2luY2x1ZGVfYXJnbGlzdCkKKyAgICAgICAgc3MKKyAgICAgICAgaW5jbHVkZV9ub2RlID0gbm9kZSgKKyAgICAgICAgICBTYXNzOjpUcmVlOjpNaXhpbk5vZGUubmV3KG5hbWUsIGFyZ3MsIGtleXdvcmRzLCBzcGxhdCwga3dhcmdfc3BsYXQpLCBzdGFydF9wb3MpCisgICAgICAgIGlmIHRvaz8oL1x7LykKKyAgICAgICAgICBpbmNsdWRlX25vZGUuaGFzX2NoaWxkcmVuID0gdHJ1ZQorICAgICAgICAgIGJsb2NrKGluY2x1ZGVfbm9kZSwgOmRpcmVjdGl2ZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGluY2x1ZGVfbm9kZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgY29udGVudF9kaXJlY3RpdmUoc3RhcnRfcG9zKQorICAgICAgICBzcworICAgICAgICBub2RlKFNhc3M6OlRyZWU6OkNvbnRlbnROb2RlLm5ldywgc3RhcnRfcG9zKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBmdW5jdGlvbl9kaXJlY3RpdmUoc3RhcnRfcG9zKQorICAgICAgICBuYW1lID0gdG9rISBJREVOVAorICAgICAgICBhcmdzLCBzcGxhdCA9IHNhc3Nfc2NyaXB0KDpwYXJzZV9mdW5jdGlvbl9kZWZpbml0aW9uX2FyZ2xpc3QpCisgICAgICAgIHNzCisgICAgICAgIGJsb2NrKG5vZGUoU2Fzczo6VHJlZTo6RnVuY3Rpb25Ob2RlLm5ldyhuYW1lLCBhcmdzLCBzcGxhdCksIHN0YXJ0X3BvcyksIDpmdW5jdGlvbikKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmV0dXJuX2RpcmVjdGl2ZShzdGFydF9wb3MpCisgICAgICAgIG5vZGUoU2Fzczo6VHJlZTo6UmV0dXJuTm9kZS5uZXcoc2Fzc19zY3JpcHQoOnBhcnNlKSksIHN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgZGVidWdfZGlyZWN0aXZlKHN0YXJ0X3BvcykKKyAgICAgICAgbm9kZShTYXNzOjpUcmVlOjpEZWJ1Z05vZGUubmV3KHNhc3Nfc2NyaXB0KDpwYXJzZSkpLCBzdGFydF9wb3MpCisgICAgICBlbmQKKworICAgICAgZGVmIHdhcm5fZGlyZWN0aXZlKHN0YXJ0X3BvcykKKyAgICAgICAgbm9kZShTYXNzOjpUcmVlOjpXYXJuTm9kZS5uZXcoc2Fzc19zY3JpcHQoOnBhcnNlKSksIHN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgZm9yX2RpcmVjdGl2ZShzdGFydF9wb3MpCisgICAgICAgIHRvayEoL1wkLykKKyAgICAgICAgdmFyID0gdG9rISBJREVOVAorICAgICAgICBzcworCisgICAgICAgIHRvayEoL2Zyb20vKQorICAgICAgICBmcm9tID0gc2Fzc19zY3JpcHQoOnBhcnNlX3VudGlsLCBTZXRbInRvIiwgInRocm91Z2giXSkKKyAgICAgICAgc3MKKworICAgICAgICBAZXhwZWN0ZWQgPSAnInRvIiBvciAidGhyb3VnaCInCisgICAgICAgIGV4Y2x1c2l2ZSA9ICh0b2soL3RvLykgfHwgdG9rISgvdGhyb3VnaC8pKSA9PSAndG8nCisgICAgICAgIHRvID0gc2Fzc19zY3JpcHQoOnBhcnNlKQorICAgICAgICBzcworCisgICAgICAgIGJsb2NrKG5vZGUoU2Fzczo6VHJlZTo6Rm9yTm9kZS5uZXcodmFyLCBmcm9tLCB0bywgZXhjbHVzaXZlKSwgc3RhcnRfcG9zKSwgOmRpcmVjdGl2ZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgZWFjaF9kaXJlY3RpdmUoc3RhcnRfcG9zKQorICAgICAgICB0b2shKC9cJC8pCisgICAgICAgIHZhcnMgPSBbdG9rIShJREVOVCldCisgICAgICAgIHNzCisgICAgICAgIHdoaWxlIHRvaygvLC8pCisgICAgICAgICAgc3MKKyAgICAgICAgICB0b2shKC9cJC8pCisgICAgICAgICAgdmFycyA8PCB0b2shKElERU5UKQorICAgICAgICAgIHNzCisgICAgICAgIGVuZAorCisgICAgICAgIHRvayEoL2luLykKKyAgICAgICAgbGlzdCA9IHNhc3Nfc2NyaXB0KDpwYXJzZSkKKyAgICAgICAgc3MKKworICAgICAgICBibG9jayhub2RlKFNhc3M6OlRyZWU6OkVhY2hOb2RlLm5ldyh2YXJzLCBsaXN0KSwgc3RhcnRfcG9zKSwgOmRpcmVjdGl2ZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgd2hpbGVfZGlyZWN0aXZlKHN0YXJ0X3BvcykKKyAgICAgICAgZXhwciA9IHNhc3Nfc2NyaXB0KDpwYXJzZSkKKyAgICAgICAgc3MKKyAgICAgICAgYmxvY2sobm9kZShTYXNzOjpUcmVlOjpXaGlsZU5vZGUubmV3KGV4cHIpLCBzdGFydF9wb3MpLCA6ZGlyZWN0aXZlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBpZl9kaXJlY3RpdmUoc3RhcnRfcG9zKQorICAgICAgICBleHByID0gc2Fzc19zY3JpcHQoOnBhcnNlKQorICAgICAgICBzcworICAgICAgICBub2RlID0gYmxvY2sobm9kZShTYXNzOjpUcmVlOjpJZk5vZGUubmV3KGV4cHIpLCBzdGFydF9wb3MpLCA6ZGlyZWN0aXZlKQorICAgICAgICBwb3MgPSBAc2Nhbm5lci5wb3MKKyAgICAgICAgbGluZSA9IEBsaW5lCisgICAgICAgIHNzCisKKyAgICAgICAgZWxzZV9ibG9jayhub2RlKSB8fAorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAjIEJhY2t0cmFjayBpbiBjYXNlIHRoZXJlIGFyZSBhbnkgY29tbWVudHMgd2Ugd2FudCB0byBwYXJzZQorICAgICAgICAgICAgQHNjYW5uZXIucG9zID0gcG9zCisgICAgICAgICAgICBAbGluZSA9IGxpbmUKKyAgICAgICAgICAgIG5vZGUKKyAgICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgZWxzZV9ibG9jayhub2RlKQorICAgICAgICBzdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgcmV0dXJuIHVubGVzcyB0b2soL0BlbHNlLykKKyAgICAgICAgc3MKKyAgICAgICAgZWxzZV9ub2RlID0gYmxvY2soCisgICAgICAgICAgbm9kZShTYXNzOjpUcmVlOjpJZk5vZGUubmV3KChzYXNzX3NjcmlwdCg6cGFyc2UpIGlmIHRvaygvaWYvKSkpLCBzdGFydF9wb3MpLAorICAgICAgICAgIDpkaXJlY3RpdmUpCisgICAgICAgIG5vZGUuYWRkX2Vsc2UoZWxzZV9ub2RlKQorICAgICAgICBwb3MgPSBAc2Nhbm5lci5wb3MKKyAgICAgICAgbGluZSA9IEBsaW5lCisgICAgICAgIHNzCisKKyAgICAgICAgZWxzZV9ibG9jayhub2RlKSB8fAorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAjIEJhY2t0cmFjayBpbiBjYXNlIHRoZXJlIGFyZSBhbnkgY29tbWVudHMgd2Ugd2FudCB0byBwYXJzZQorICAgICAgICAgICAgQHNjYW5uZXIucG9zID0gcG9zCisgICAgICAgICAgICBAbGluZSA9IGxpbmUKKyAgICAgICAgICAgIG5vZGUKKyAgICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgZWxzZV9kaXJlY3RpdmUoc3RhcnRfcG9zKQorICAgICAgICBlcnIoIkludmFsaWQgQ1NTOiBAZWxzZSBtdXN0IGNvbWUgYWZ0ZXIgQGlmIikKKyAgICAgIGVuZAorCisgICAgICBkZWYgZXh0ZW5kX2RpcmVjdGl2ZShzdGFydF9wb3MpCisgICAgICAgIHNlbGVjdG9yX3N0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICBAZXhwZWN0ZWQgPSAic2VsZWN0b3IiCisgICAgICAgIHNlbGVjdG9yID0gU2Fzczo6VXRpbC5zdHJpcF9zdHJpbmdfYXJyYXkoZXhwciEoOmFsbW9zdF9hbnlfdmFsdWUpKQorICAgICAgICBvcHRpb25hbCA9IHRvayhPUFRJT05BTCkKKyAgICAgICAgc3MKKyAgICAgICAgbm9kZShTYXNzOjpUcmVlOjpFeHRlbmROb2RlLm5ldyhzZWxlY3RvciwgISFvcHRpb25hbCwgcmFuZ2Uoc2VsZWN0b3Jfc3RhcnRfcG9zKSksIHN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgaW1wb3J0X2RpcmVjdGl2ZShzdGFydF9wb3MpCisgICAgICAgIHZhbHVlcyA9IFtdCisKKyAgICAgICAgbG9vcCBkbworICAgICAgICAgIHZhbHVlcyA8PCBleHByISg6aW1wb3J0X2FyZykKKyAgICAgICAgICBicmVhayBpZiB1c2VfY3NzX2ltcG9ydD8KKyAgICAgICAgICBicmVhayB1bmxlc3MgdG9rKC8sLykKKyAgICAgICAgICBzcworICAgICAgICBlbmQKKworICAgICAgICB2YWx1ZXMKKyAgICAgIGVuZAorCisgICAgICBkZWYgaW1wb3J0X2FyZworICAgICAgICBzdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgcmV0dXJuIHVubGVzcyAoc3RyID0gc3RyaW5nKSB8fCAodXJpID0gdG9rPygvdXJsXCgvaSkpCisgICAgICAgIGlmIHVyaQorICAgICAgICAgIHN0ciA9IHNhc3Nfc2NyaXB0KDpwYXJzZV9zdHJpbmcpCisgICAgICAgICAgc3MKKyAgICAgICAgICBzdXBwb3J0cyA9IHN1cHBvcnRzX2NsYXVzZQorICAgICAgICAgIHNzCisgICAgICAgICAgbWVkaWEgPSBtZWRpYV9xdWVyeV9saXN0CisgICAgICAgICAgc3MKKyAgICAgICAgICByZXR1cm4gbm9kZShUcmVlOjpDc3NJbXBvcnROb2RlLm5ldyhzdHIsIG1lZGlhLnRvX2EsIHN1cHBvcnRzKSwgc3RhcnRfcG9zKQorICAgICAgICBlbmQKKyAgICAgICAgc3MKKworICAgICAgICBzdXBwb3J0cyA9IHN1cHBvcnRzX2NsYXVzZQorICAgICAgICBzcworICAgICAgICBtZWRpYSA9IG1lZGlhX3F1ZXJ5X2xpc3QKKyAgICAgICAgaWYgc3RyID1+ICVye14oaHR0cHM/Oik/Ly99IHx8IG1lZGlhIHx8IHN1cHBvcnRzIHx8IHVzZV9jc3NfaW1wb3J0PworICAgICAgICAgIHJldHVybiBub2RlKAorICAgICAgICAgICAgU2Fzczo6VHJlZTo6Q3NzSW1wb3J0Tm9kZS5uZXcoCisgICAgICAgICAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5xdW90ZShzdHIpLCBtZWRpYS50b19hLCBzdXBwb3J0cyksIHN0YXJ0X3BvcykKKyAgICAgICAgZW5kCisKKyAgICAgICAgbm9kZShTYXNzOjpUcmVlOjpJbXBvcnROb2RlLm5ldyhzdHIuc3RyaXApLCBzdGFydF9wb3MpCisgICAgICBlbmQKKworICAgICAgZGVmIHVzZV9jc3NfaW1wb3J0PzsgZmFsc2U7IGVuZAorCisgICAgICBkZWYgbWVkaWFfZGlyZWN0aXZlKHN0YXJ0X3BvcykKKyAgICAgICAgYmxvY2sobm9kZShTYXNzOjpUcmVlOjpNZWRpYU5vZGUubmV3KGV4cHIhKDptZWRpYV9xdWVyeV9saXN0KS50b19hKSwgc3RhcnRfcG9zKSwgOmRpcmVjdGl2ZSkKKyAgICAgIGVuZAorCisgICAgICAjIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtbWVkaWFxdWVyaWVzLyNzeW50YXgKKyAgICAgIGRlZiBtZWRpYV9xdWVyeV9saXN0CisgICAgICAgIHF1ZXJ5ID0gbWVkaWFfcXVlcnkKKyAgICAgICAgcmV0dXJuIHVubGVzcyBxdWVyeQorICAgICAgICBxdWVyaWVzID0gW3F1ZXJ5XQorCisgICAgICAgIHNzCisgICAgICAgIHdoaWxlIHRvaygvLC8pCisgICAgICAgICAgc3M7IHF1ZXJpZXMgPDwgZXhwciEoOm1lZGlhX3F1ZXJ5KQorICAgICAgICBlbmQKKyAgICAgICAgc3MKKworICAgICAgICBTYXNzOjpNZWRpYTo6UXVlcnlMaXN0Lm5ldyhxdWVyaWVzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBtZWRpYV9xdWVyeQorICAgICAgICBpZiAoaWRlbnQxID0gaW50ZXJwX2lkZW50KQorICAgICAgICAgIHNzCisgICAgICAgICAgaWRlbnQyID0gaW50ZXJwX2lkZW50CisgICAgICAgICAgc3MKKyAgICAgICAgICBpZiBpZGVudDIgJiYgaWRlbnQyLmxlbmd0aCA9PSAxICYmIGlkZW50MlswXS5pc19hPyhTdHJpbmcpICYmIGlkZW50MlswXS5kb3duY2FzZSA9PSAnYW5kJworICAgICAgICAgICAgcXVlcnkgPSBTYXNzOjpNZWRpYTo6UXVlcnkubmV3KFtdLCBpZGVudDEsIFtdKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIGlkZW50MgorICAgICAgICAgICAgICBxdWVyeSA9IFNhc3M6Ok1lZGlhOjpRdWVyeS5uZXcoaWRlbnQxLCBpZGVudDIsIFtdKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBxdWVyeSA9IFNhc3M6Ok1lZGlhOjpRdWVyeS5uZXcoW10sIGlkZW50MSwgW10pCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIHJldHVybiBxdWVyeSB1bmxlc3MgdG9rKC9hbmQvaSkKKyAgICAgICAgICAgIHNzCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIHF1ZXJ5CisgICAgICAgICAgZXhwciA9IGV4cHIhKDptZWRpYV9leHByKQorICAgICAgICBlbHNlCisgICAgICAgICAgZXhwciA9IG1lZGlhX2V4cHIKKyAgICAgICAgICByZXR1cm4gdW5sZXNzIGV4cHIKKyAgICAgICAgZW5kCisgICAgICAgIHF1ZXJ5IHx8PSBTYXNzOjpNZWRpYTo6UXVlcnkubmV3KFtdLCBbXSwgW10pCisgICAgICAgIHF1ZXJ5LmV4cHJlc3Npb25zIDw8IGV4cHIKKworICAgICAgICBzcworICAgICAgICB3aGlsZSB0b2soL2FuZC9pKQorICAgICAgICAgIHNzOyBxdWVyeS5leHByZXNzaW9ucyA8PCBleHByISg6bWVkaWFfZXhwcikKKyAgICAgICAgZW5kCisKKyAgICAgICAgcXVlcnkKKyAgICAgIGVuZAorCisgICAgICBkZWYgcXVlcnlfZXhwcgorICAgICAgICBpbnRlcnAgPSBpbnRlcnBvbGF0aW9uCisgICAgICAgIHJldHVybiBpbnRlcnAgaWYgaW50ZXJwCisgICAgICAgIHJldHVybiB1bmxlc3MgdG9rKC9cKC8pCisgICAgICAgIHJlcyA9IFsnKCddCisgICAgICAgIHNzCisgICAgICAgIHJlcyA8PCBzYXNzX3NjcmlwdCg6cGFyc2UpCisKKyAgICAgICAgaWYgdG9rKC86LykKKyAgICAgICAgICByZXMgPDwgJzogJworICAgICAgICAgIHNzCisgICAgICAgICAgcmVzIDw8IHNhc3Nfc2NyaXB0KDpwYXJzZSkKKyAgICAgICAgZW5kCisgICAgICAgIHJlcyA8PCB0b2shKC9cKS8pCisgICAgICAgIHNzCisgICAgICAgIHJlcworICAgICAgZW5kCisKKyAgICAgICMgQWxpYXNlcyBhbGxvdyB1cyB0byB1c2UgZGlmZmVyZW50IGRlc2NyaXB0aW9ucyBpZiB0aGUgc2FtZQorICAgICAgIyBleHByZXNzaW9uIGZhaWxzIGluIGRpZmZlcmVudCBjb250ZXh0cy4KKyAgICAgIGFsaWFzX21ldGhvZCA6bWVkaWFfZXhwciwgOnF1ZXJ5X2V4cHIKKyAgICAgIGFsaWFzX21ldGhvZCA6YXRfcm9vdF9xdWVyeSwgOnF1ZXJ5X2V4cHIKKworICAgICAgZGVmIGNoYXJzZXRfZGlyZWN0aXZlKHN0YXJ0X3BvcykKKyAgICAgICAgbmFtZSA9IGV4cHIhKDpzdHJpbmcpCisgICAgICAgIHNzCisgICAgICAgIG5vZGUoU2Fzczo6VHJlZTo6Q2hhcnNldE5vZGUubmV3KG5hbWUpLCBzdGFydF9wb3MpCisgICAgICBlbmQKKworICAgICAgIyBUaGUgZG9jdW1lbnQgZGlyZWN0aXZlIGlzIHNwZWNpZmllZCBpbgorICAgICAgIyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbmRpdGlvbmFsLywgYnV0IEdlY2tvIGFsbG93cyB0aGUKKyAgICAgICMgYHVybC1wcmVmaXhgIGFuZCBgZG9tYWluYCBmdW5jdGlvbnMgdG8gb21pdCBxdW90YXRpb24gbWFya3MsIGNvbnRyYXJ5IHRvCisgICAgICAjIHRoZSBzdGFuZGFyZC4KKyAgICAgICMKKyAgICAgICMgV2UgY291bGQgcGFyc2UgYWxsIGRvY3VtZW50IGRpcmVjdGl2ZXMgYWNjb3JkaW5nIHRvIE1vemlsbGEncyBzeW50YXgsCisgICAgICAjIGJ1dCBpZiBzb21lb25lJ3MgdXNpbmcgZS5nLiBALXdlYmtpdC1kb2N1bWVudCB3ZSBkb24ndCB3YW50IHRoZW0gdG8KKyAgICAgICMgdGhpbmsgV2ViS2l0IHdvcmtzIHNhbnMgcXVvdGVzLgorICAgICAgZGVmIF9tb3pfZG9jdW1lbnRfZGlyZWN0aXZlKHN0YXJ0X3BvcykKKyAgICAgICAgcmVzID0gWyJALW1vei1kb2N1bWVudCAiXQorICAgICAgICBsb29wIGRvCisgICAgICAgICAgcmVzIDw8IHN0ciB7c3N9IDw8IGV4cHIhKDptb3pfZG9jdW1lbnRfZnVuY3Rpb24pCisgICAgICAgICAgaWYgKGMgPSB0b2soLywvKSkKKyAgICAgICAgICAgIHJlcyA8PCBjCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIGRpcmVjdGl2ZV9ib2R5KHJlcy5mbGF0dGVuLCBzdGFydF9wb3MpCisgICAgICBlbmQKKworICAgICAgZGVmIG1vel9kb2N1bWVudF9mdW5jdGlvbgorICAgICAgICB2YWwgPSBpbnRlcnBfdXJpIHx8IF9pbnRlcnBfc3RyaW5nKDp1cmxfcHJlZml4KSB8fAorICAgICAgICAgIF9pbnRlcnBfc3RyaW5nKDpkb21haW4pIHx8IGZ1bmN0aW9uKGZhbHNlKSB8fCBpbnRlcnBvbGF0aW9uCisgICAgICAgIHJldHVybiB1bmxlc3MgdmFsCisgICAgICAgIHNzCisgICAgICAgIHZhbAorICAgICAgZW5kCisKKyAgICAgIGRlZiBhdF9yb290X2RpcmVjdGl2ZShzdGFydF9wb3MpCisgICAgICAgIGlmIHRvaz8oL1woLykgJiYgKGV4cHIgPSBhdF9yb290X3F1ZXJ5KQorICAgICAgICAgIHJldHVybiBibG9jayhub2RlKFNhc3M6OlRyZWU6OkF0Um9vdE5vZGUubmV3KGV4cHIpLCBzdGFydF9wb3MpLCA6ZGlyZWN0aXZlKQorICAgICAgICBlbmQKKworICAgICAgICBhdF9yb290X25vZGUgPSBub2RlKFNhc3M6OlRyZWU6OkF0Um9vdE5vZGUubmV3LCBzdGFydF9wb3MpCisgICAgICAgIHJ1bGVfbm9kZSA9IHJ1bGVzZXQKKyAgICAgICAgcmV0dXJuIGJsb2NrKGF0X3Jvb3Rfbm9kZSwgOnN0eWxlc2hlZXQpIHVubGVzcyBydWxlX25vZGUKKyAgICAgICAgYXRfcm9vdF9ub2RlIDw8IHJ1bGVfbm9kZQorICAgICAgICBhdF9yb290X25vZGUKKyAgICAgIGVuZAorCisgICAgICBkZWYgYXRfcm9vdF9kaXJlY3RpdmVfbGlzdAorICAgICAgICByZXR1cm4gdW5sZXNzIChmaXJzdCA9IHRvayhJREVOVCkpCisgICAgICAgIGFyciA9IFtmaXJzdF0KKyAgICAgICAgc3MKKyAgICAgICAgd2hpbGUgKGUgPSB0b2soSURFTlQpKQorICAgICAgICAgIGFyciA8PCBlCisgICAgICAgICAgc3MKKyAgICAgICAgZW5kCisgICAgICAgIGFycgorICAgICAgZW5kCisKKyAgICAgIGRlZiBlcnJvcl9kaXJlY3RpdmUoc3RhcnRfcG9zKQorICAgICAgICBub2RlKFNhc3M6OlRyZWU6OkVycm9yTm9kZS5uZXcoc2Fzc19zY3JpcHQoOnBhcnNlKSksIHN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICAjIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29uZGl0aW9uYWwvCisgICAgICBkZWYgc3VwcG9ydHNfZGlyZWN0aXZlKG5hbWUsIHN0YXJ0X3BvcykKKyAgICAgICAgY29uZGl0aW9uID0gZXhwciEoOnN1cHBvcnRzX2NvbmRpdGlvbikKKyAgICAgICAgbm9kZSA9IFNhc3M6OlRyZWU6OlN1cHBvcnRzTm9kZS5uZXcobmFtZSwgY29uZGl0aW9uKQorCisgICAgICAgIHRvayEoL1x7LykKKyAgICAgICAgbm9kZS5oYXNfY2hpbGRyZW4gPSB0cnVlCisgICAgICAgIGJsb2NrX2NvbnRlbnRzKG5vZGUsIDpkaXJlY3RpdmUpCisgICAgICAgIHRvayEoL1x9LykKKworICAgICAgICBub2RlKG5vZGUsIHN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3VwcG9ydHNfY2xhdXNlCisgICAgICAgIHJldHVybiB1bmxlc3MgdG9rKC9zdXBwb3J0c1woL2kpCisgICAgICAgIHNzCisgICAgICAgIHN1cHBvcnRzID0gaW1wb3J0X3N1cHBvcnRzX2NvbmRpdGlvbgorICAgICAgICBzcworICAgICAgICB0b2shKC9cKS8pCisgICAgICAgIHN1cHBvcnRzCisgICAgICBlbmQKKworICAgICAgZGVmIHN1cHBvcnRzX2NvbmRpdGlvbgorICAgICAgICBzdXBwb3J0c19uZWdhdGlvbiB8fCBzdXBwb3J0c19vcGVyYXRvciB8fCBzdXBwb3J0c19pbnRlcnBvbGF0aW9uCisgICAgICBlbmQKKworICAgICAgZGVmIGltcG9ydF9zdXBwb3J0c19jb25kaXRpb24KKyAgICAgICAgc3VwcG9ydHNfY29uZGl0aW9uIHx8IHN1cHBvcnRzX2RlY2xhcmF0aW9uCisgICAgICBlbmQKKworICAgICAgZGVmIHN1cHBvcnRzX25lZ2F0aW9uCisgICAgICAgIHJldHVybiB1bmxlc3MgdG9rKC9ub3QvaSkKKyAgICAgICAgc3MKKyAgICAgICAgU2Fzczo6U3VwcG9ydHM6Ok5lZ2F0aW9uLm5ldyhleHByISg6c3VwcG9ydHNfY29uZGl0aW9uX2luX3BhcmVucykpCisgICAgICBlbmQKKworICAgICAgZGVmIHN1cHBvcnRzX29wZXJhdG9yCisgICAgICAgIGNvbmQgPSBzdXBwb3J0c19jb25kaXRpb25faW5fcGFyZW5zCisgICAgICAgIHJldHVybiB1bmxlc3MgY29uZAorICAgICAgICByZSA9IC9hbmR8b3IvaQorICAgICAgICB3aGlsZSAob3AgPSB0b2socmUpKQorICAgICAgICAgIHJlID0gLyN7b3B9L2kKKyAgICAgICAgICBzcworICAgICAgICAgIGNvbmQgPSBTYXNzOjpTdXBwb3J0czo6T3BlcmF0b3IubmV3KAorICAgICAgICAgICAgY29uZCwgZXhwciEoOnN1cHBvcnRzX2NvbmRpdGlvbl9pbl9wYXJlbnMpLCBvcCkKKyAgICAgICAgZW5kCisgICAgICAgIGNvbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3VwcG9ydHNfZGVjbGFyYXRpb24KKyAgICAgICAgICBuYW1lID0gc2Fzc19zY3JpcHQoOnBhcnNlKQorICAgICAgICAgIHRvayEoLzovKTsgc3MKKyAgICAgICAgICB2YWx1ZSA9IHNhc3Nfc2NyaXB0KDpwYXJzZSkKKyAgICAgICAgICBTYXNzOjpTdXBwb3J0czo6RGVjbGFyYXRpb24ubmV3KG5hbWUsIHZhbHVlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdXBwb3J0c19jb25kaXRpb25faW5fcGFyZW5zCisgICAgICAgIGludGVycCA9IHN1cHBvcnRzX2ludGVycG9sYXRpb24KKyAgICAgICAgcmV0dXJuIGludGVycCBpZiBpbnRlcnAKKyAgICAgICAgcmV0dXJuIHVubGVzcyB0b2soL1woLyk7IHNzCisgICAgICAgIGlmIChjb25kID0gc3VwcG9ydHNfY29uZGl0aW9uKQorICAgICAgICAgIHRvayEoL1wpLyk7IHNzCisgICAgICAgICAgY29uZAorICAgICAgICBlbHNlCisgICAgICAgICAgZGVjbCA9IHN1cHBvcnRzX2RlY2xhcmF0aW9uCisgICAgICAgICAgdG9rISgvXCkvKTsgc3MKKyAgICAgICAgICBkZWNsCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdXBwb3J0c19pbnRlcnBvbGF0aW9uCisgICAgICAgIGludGVycCA9IGludGVycG9sYXRpb24KKyAgICAgICAgcmV0dXJuIHVubGVzcyBpbnRlcnAKKyAgICAgICAgc3MKKyAgICAgICAgU2Fzczo6U3VwcG9ydHM6OkludGVycG9sYXRpb24ubmV3KGludGVycCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgdmFyaWFibGUKKyAgICAgICAgcmV0dXJuIHVubGVzcyB0b2soL1wkLykKKyAgICAgICAgc3RhcnRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgIG5hbWUgPSB0b2shKElERU5UKQorICAgICAgICBzczsgdG9rISgvOi8pOyBzcworCisgICAgICAgIGV4cHIgPSBzYXNzX3NjcmlwdCg6cGFyc2UpCisgICAgICAgIHdoaWxlIHRvaygvIS8pCisgICAgICAgICAgZmxhZ19uYW1lID0gdG9rIShJREVOVCkKKyAgICAgICAgICBpZiBmbGFnX25hbWUgPT0gJ2RlZmF1bHQnCisgICAgICAgICAgICBndWFyZGVkIHx8PSB0cnVlCisgICAgICAgICAgZWxzaWYgZmxhZ19uYW1lID09ICdnbG9iYWwnCisgICAgICAgICAgICBnbG9iYWwgfHw9IHRydWUKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIkludmFsaWQgZmxhZyBcIiEje2ZsYWdfbmFtZX1cIi4iLCA6bGluZSA9PiBAbGluZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBzcworICAgICAgICBlbmQKKworICAgICAgICByZXN1bHQgPSBTYXNzOjpUcmVlOjpWYXJpYWJsZU5vZGUubmV3KG5hbWUsIGV4cHIsIGd1YXJkZWQsIGdsb2JhbCkKKyAgICAgICAgbm9kZShyZXN1bHQsIHN0YXJ0X3BvcykKKyAgICAgIGVuZAorCisgICAgICBkZWYgb3BlcmF0b3IKKyAgICAgICAgIyBNYW55IG9mIHRoZXNlIG9wZXJhdG9ycyAoYWxsIGV4Y2VwdCAvIGFuZCAsKQorICAgICAgICAjIGFyZSBkaXNhbGxvd2VkIGJ5IHRoZSBDU1Mgc3BlYywKKyAgICAgICAgIyBidXQgdGhleSdyZSBpbmNsdWRlZCBoZXJlIGZvciBjb21wYXRpYmlsaXR5CisgICAgICAgICMgd2l0aCBzb21lIHByb3ByaWV0YXJ5IE1TIHByb3BlcnRpZXMKKyAgICAgICAgc3RyIHtzcyBpZiB0b2soJXJ7Wy8sOi49XX0pfQorICAgICAgZW5kCisKKyAgICAgIGRlZiBydWxlc2V0CisgICAgICAgIHN0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICByZXR1cm4gdW5sZXNzIChydWxlcyA9IGFsbW9zdF9hbnlfdmFsdWUpCisgICAgICAgIGJsb2NrKAorICAgICAgICAgIG5vZGUoCisgICAgICAgICAgICBTYXNzOjpUcmVlOjpSdWxlTm9kZS5uZXcocnVsZXMsIHJhbmdlKHN0YXJ0X3BvcykpLCBzdGFydF9wb3MpLCA6cnVsZXNldCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgYmxvY2sobm9kZSwgY29udGV4dCkKKyAgICAgICAgbm9kZS5oYXNfY2hpbGRyZW4gPSB0cnVlCisgICAgICAgIHRvayEoL1x7LykKKyAgICAgICAgYmxvY2tfY29udGVudHMobm9kZSwgY29udGV4dCkKKyAgICAgICAgdG9rISgvXH0vKQorICAgICAgICBub2RlCisgICAgICBlbmQKKworICAgICAgIyBBIGJsb2NrIG1heSBjb250YWluIGRlY2xhcmF0aW9ucyBhbmQvb3IgcnVsZXNldHMKKyAgICAgIGRlZiBibG9ja19jb250ZW50cyhub2RlLCBjb250ZXh0KQorICAgICAgICBibG9ja19naXZlbj8gPyB5aWVsZCA6IHNzX2NvbW1lbnRzKG5vZGUpCisgICAgICAgIG5vZGUgPDwgKGNoaWxkID0gYmxvY2tfY2hpbGQoY29udGV4dCkpCisgICAgICAgIHdoaWxlIHRvaygvOy8pIHx8IGhhc19jaGlsZHJlbj8oY2hpbGQpCisgICAgICAgICAgYmxvY2tfZ2l2ZW4/ID8geWllbGQgOiBzc19jb21tZW50cyhub2RlKQorICAgICAgICAgIG5vZGUgPDwgKGNoaWxkID0gYmxvY2tfY2hpbGQoY29udGV4dCkpCisgICAgICAgIGVuZAorICAgICAgICBub2RlCisgICAgICBlbmQKKworICAgICAgZGVmIGJsb2NrX2NoaWxkKGNvbnRleHQpCisgICAgICAgIHJldHVybiB2YXJpYWJsZSB8fCBkaXJlY3RpdmUgaWYgY29udGV4dCA9PSA6ZnVuY3Rpb24KKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlIHx8IGRpcmVjdGl2ZSB8fCBydWxlc2V0IGlmIGNvbnRleHQgPT0gOnN0eWxlc2hlZXQKKyAgICAgICAgdmFyaWFibGUgfHwgZGlyZWN0aXZlIHx8IGRlY2xhcmF0aW9uX29yX3J1bGVzZXQKKyAgICAgIGVuZAorCisgICAgICBkZWYgaGFzX2NoaWxkcmVuPyhjaGlsZF9vcl9hcnJheSkKKyAgICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyBjaGlsZF9vcl9hcnJheQorICAgICAgICByZXR1cm4gY2hpbGRfb3JfYXJyYXkubGFzdC5oYXNfY2hpbGRyZW4gaWYgY2hpbGRfb3JfYXJyYXkuaXNfYT8oQXJyYXkpCisgICAgICAgIGNoaWxkX29yX2FycmF5Lmhhc19jaGlsZHJlbgorICAgICAgZW5kCisKKyAgICAgICMgV2hlbiBwYXJzaW5nIHRoZSBjb250ZW50cyBvZiBhIHJ1bGVzZXQsIGl0IGNhbiBiZSBkaWZmaWN1bHQgdG8gdGVsbAorICAgICAgIyBkZWNsYXJhdGlvbnMgYXBhcnQgZnJvbSBuZXN0ZWQgcnVsZXNldHMuIFNpbmNlIHdlIGRvbid0IHRob3JvdWdobHkgcGFyc2UKKyAgICAgICMgc2VsZWN0b3JzIHVudGlsIGFmdGVyIHJlc29sdmluZyBpbnRlcnBvbGF0aW9uLCB3ZSBjYW4gc2hhcmUgYSBidW5jaCBvZgorICAgICAgIyB0aGUgcGFyc2luZyBvZiB0aGUgdHdvLCBidXQgd2UgbmVlZCB0byBkaXNhbWJpZ3VhdGUgdGhlbSBmaXJzdC4gV2UgdXNlCisgICAgICAjIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CisgICAgICAjCisgICAgICAjICogSWYgdGhlIGVudGl0eSBkb2Vzbid0IHN0YXJ0IHdpdGggYW4gaWRlbnRpZmllciBmb2xsb3dlZCBieSBhIGNvbG9uLAorICAgICAgIyAgIGl0J3MgYSBzZWxlY3Rvci4gVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBtb3N0bHktdW5pbXBvcnRhbnQgY2FzZXMKKyAgICAgICMgICBoZXJlIHRvIHN1cHBvcnQgdmFyaW91cyBkZWNsYXJhdGlvbiBoYWNrcy4KKyAgICAgICMKKyAgICAgICMgKiBJZiB0aGUgY29sb24gaXMgZm9sbG93ZWQgYnkgYW5vdGhlciBjb2xvbiwgaXQncyBhIHNlbGVjdG9yLgorICAgICAgIworICAgICAgIyAqIE90aGVyd2lzZSwgaWYgdGhlIGNvbG9uIGlzIGZvbGxvd2VkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4KKyAgICAgICMgICBpbnRlcnBvbGF0aW9uIG9yIGEgY2hhcmFjdGVyIHRoYXQncyB2YWxpZCBhcyB0aGUgYmVnaW5uaW5nIG9mIGFuCisgICAgICAjICAgaWRlbnRpZmllciwgaXQncyBhIGRlY2xhcmF0aW9uLgorICAgICAgIworICAgICAgIyAqIElmIHRoZSBjb2xvbiBpcyBmb2xsb3dlZCBieSBpbnRlcnBvbGF0aW9uIG9yIGEgdmFsaWQgaWRlbnRpZmllciwgdHJ5CisgICAgICAjICAgcGFyc2luZyBpdCBhcyBhIGRlY2xhcmF0aW9uIHZhbHVlLiBJZiB0aGlzIGZhaWxzLCBiYWNrdHJhY2sgYW5kIHBhcnNlCisgICAgICAjICAgaXQgYXMgYSBzZWxlY3Rvci4KKyAgICAgICMKKyAgICAgICMgKiBJZiB0aGUgZGVjbGFyYXRpb24gdmFsdWUgdmFsdWUgdmFsaWQgYnV0IGlzIGZvbGxvd2VkIGJ5ICJ7IiwgYmFja3RyYWNrCisgICAgICAjICAgYW5kIHBhcnNlIGl0IGFzIGEgc2VsZWN0b3IgYW55d2F5LiBUaGlzIGVuc3VyZXMgdGhhdCAiLmZvbzpiYXIgeyIgaXMKKyAgICAgICMgICBhbHdheXMgcGFyc2VkIGFzIGEgc2VsZWN0b3IgYW5kIG5ldmVyIGFzIGEgcHJvcGVydHkgd2l0aCBuZXN0ZWQKKyAgICAgICMgICBwcm9wZXJ0aWVzIGJlbmVhdGggaXQuCisgICAgICBkZWYgZGVjbGFyYXRpb25fb3JfcnVsZXNldAorICAgICAgICBzdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgZGVjbGFyYXRpb24gPSB0cnlfZGVjbGFyYXRpb24KKworICAgICAgICBpZiBkZWNsYXJhdGlvbi5uaWw/CisgICAgICAgICAgcmV0dXJuIHVubGVzcyAoc2VsZWN0b3IgPSBhbG1vc3RfYW55X3ZhbHVlKQorICAgICAgICBlbHNpZiBkZWNsYXJhdGlvbi5pc19hPyhBcnJheSkKKyAgICAgICAgICBzZWxlY3RvciA9IGRlY2xhcmF0aW9uCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIERlY2xhcmF0aW9uIHNob3VsZCBiZSBhIFByb3BOb2RlLgorICAgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbgorICAgICAgICBlbmQKKworICAgICAgICBpZiAoYWRkaXRpb25hbF9zZWxlY3RvciA9IGFsbW9zdF9hbnlfdmFsdWUpCisgICAgICAgICAgc2VsZWN0b3IgPDwgYWRkaXRpb25hbF9zZWxlY3RvcgorICAgICAgICBlbmQKKworICAgICAgICBibG9jaygKKyAgICAgICAgICBub2RlKAorICAgICAgICAgICAgU2Fzczo6VHJlZTo6UnVsZU5vZGUubmV3KG1lcmdlKHNlbGVjdG9yKSwgcmFuZ2Uoc3RhcnRfcG9zKSksIHN0YXJ0X3BvcyksIDpydWxlc2V0KQorICAgICAgZW5kCisKKyAgICAgICMgVHJpZXMgdG8gcGFyc2UgYSBkZWNsYXJhdGlvbiwgYW5kIHJldHVybnMgdGhlIHZhbHVlIHBhcnNlZCBzbyBmYXIgaWYgaXQKKyAgICAgICMgZmFpbHMuCisgICAgICAjCisgICAgICAjIFRoaXMgaGFzIHRocmVlIHBvc3NpYmxlIHJldHVybiB0eXBlcy4gSXQgY2FuIHJldHVybiBgbmlsYCwgaW5kaWNhdGluZworICAgICAgIyB0aGF0IHBhcnNpbmcgZmFpbGVkIGNvbXBsZXRlbHkgYW5kIHRoZSBzY2FubmVyIGhhc24ndCBtb3ZlZCBmb3J3YXJkIGF0CisgICAgICAjIGFsbC4gSXQgY2FuIHJldHVybiBhbiBBcnJheSwgaW5kaWNhdGluZyB0aGF0IHBhcnNpbmcgZmFpbGVkIGFmdGVyCisgICAgICAjIGNvbnN1bWluZyBzb21lIHRleHQgKHBvc3NpYmx5IGNvbnRhaW5pbmcgaW50ZXJwb2xhdGlvbiksIHdoaWNoIGlzCisgICAgICAjIHJldHVybmVkLiBPciBpdCBjYW4gcmV0dXJuIGEgUHJvcE5vZGUsIGluZGljYXRpbmcgdGhhdCBwYXJzaW5nCisgICAgICAjIHN1Y2NlZWRlZC4KKyAgICAgIGRlZiB0cnlfZGVjbGFyYXRpb24KKyAgICAgICAgIyBUaGlzIGFsbG93cyB0aGUgIipwcm9wOiB2YWwiLCAiOnByb3A6IHZhbCIsICIjcHJvcDogdmFsIiwgYW5kICIucHJvcDoKKyAgICAgICAgIyB2YWwiIGhhY2tzLgorICAgICAgICBuYW1lX3N0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICBpZiAocyA9IHRvaygvWzpcKlwuXXxcIyg/IVx7KS8pKQorICAgICAgICAgIG5hbWUgPSBbcywgc3RyIHtzc31dCisgICAgICAgICAgcmV0dXJuIG5hbWUgdW5sZXNzIChpZGVudCA9IGludGVycF9pZGVudCkKKyAgICAgICAgICBuYW1lIDw8IGlkZW50CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gdW5sZXNzIChuYW1lID0gaW50ZXJwX2lkZW50KQorICAgICAgICAgIG5hbWUgPSBBcnJheShuYW1lKQorICAgICAgICBlbmQKKworICAgICAgICBpZiAoY29tbWVudCA9IHRvayhDT01NRU5UKSkKKyAgICAgICAgICBuYW1lIDw8IGNvbW1lbnQKKyAgICAgICAgZW5kCisgICAgICAgIG5hbWVfZW5kX3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorCisgICAgICAgIG1pZCA9IFtzdHIge3NzfV0KKyAgICAgICAgcmV0dXJuIG5hbWUgKyBtaWQgdW5sZXNzIHRvaygvOi8pCisgICAgICAgIG1pZCA8PCAnOicKKworICAgICAgICAjIElmIHRoaXMgaXMgYSBDU1MgdmFyaWFibGUsIHBhcnNlIGl0IGFzIGEgcHJvcGVydHkgbm8gbWF0dGVyIHdoYXQuCisgICAgICAgIGlmIG5hbWUuZmlyc3QuaXNfYT8oU3RyaW5nKSAmJiBuYW1lLmZpcnN0LnN0YXJ0X3dpdGg/KCItLSIpCisgICAgICAgICAgcmV0dXJuIGNzc192YXJpYWJsZV9kZWNsYXJhdGlvbihuYW1lLCBuYW1lX3N0YXJ0X3BvcywgbmFtZV9lbmRfcG9zKQorICAgICAgICBlbmQKKworICAgICAgICByZXR1cm4gbmFtZSArIG1pZCArIFsnOiddIGlmIHRvaygvOi8pCisgICAgICAgIG1pZCA8PCBzdHIge3NzfQorICAgICAgICBwb3N0X2NvbG9uX3doaXRlc3BhY2UgPSAhbWlkLmxhc3QuZW1wdHk/CisgICAgICAgIGNvdWxkX2JlX3NlbGVjdG9yID0gIXBvc3RfY29sb25fd2hpdGVzcGFjZSAmJiAodG9rPyhJREVOVF9TVEFSVCkgfHwgdG9rPyhJTlRFUlBfU1RBUlQpKQorCisgICAgICAgIHZhbHVlX3N0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICB2YWx1ZSA9IG5pbAorICAgICAgICBlcnJvciA9IGNhdGNoX2Vycm9yIGRvCisgICAgICAgICAgdmFsdWUgPSB2YWx1ZSEKKyAgICAgICAgICBpZiB0b2s/KC9cey8pCisgICAgICAgICAgICAjIFByb3BlcnRpZXMgdGhhdCBhcmUgYW1iaWd1b3VzIHdpdGggc2VsZWN0b3JzIGNhbid0IGhhdmUgYWRkaXRpb25hbAorICAgICAgICAgICAgIyBwcm9wZXJ0aWVzIG5lc3RlZCBiZW5lYXRoIHRoZW0uCisgICAgICAgICAgICB0b2shKC87LykgaWYgY291bGRfYmVfc2VsZWN0b3IKKyAgICAgICAgICBlbHNpZiAhdG9rPygvWzt7fV0vKQorICAgICAgICAgICAgIyBXZSB3YW50IGFuIGV4Y2VwdGlvbiBpZiB0aGVyZSdzIG5vIHZhbGlkIGVuZC1vZi1wcm9wZXJ0eSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICMgZXhpc3RzLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjb25zdW1lIGl0IGlmIGl0IGRvZXMuCisgICAgICAgICAgICB0b2shKC9bO3t9XS8pCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIGVycm9yCisgICAgICAgICAgcmV0aHJvdyBlcnJvciB1bmxlc3MgY291bGRfYmVfc2VsZWN0b3IKKworICAgICAgICAgICMgSWYgdGhlIHZhbHVlIHdvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgc2VtaWNvbG9uLCBpdCdzIGRlZmluaXRlbHkKKyAgICAgICAgICAjIHN1cHBvc2VkIHRvIGJlIGEgcHJvcGVydHksIG5vdCBhIHNlbGVjdG9yLgorICAgICAgICAgIGFkZGl0aW9uYWxfc2VsZWN0b3IgPSBhbG1vc3RfYW55X3ZhbHVlCisgICAgICAgICAgcmV0aHJvdyBlcnJvciBpZiB0b2s/KC87LykKKworICAgICAgICAgIHJldHVybiBuYW1lICsgbWlkICsgKGFkZGl0aW9uYWxfc2VsZWN0b3IgfHwgW10pCisgICAgICAgIGVuZAorCisgICAgICAgIHZhbHVlX2VuZF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgc3MKKyAgICAgICAgcmVxdWlyZV9ibG9jayA9IHRvaz8oL1x7LykKKworICAgICAgICBub2RlID0gbm9kZShTYXNzOjpUcmVlOjpQcm9wTm9kZS5uZXcobmFtZS5mbGF0dGVuLmNvbXBhY3QsIFt2YWx1ZV0sIDpuZXcpLAorICAgICAgICAgICAgICAgICAgICBuYW1lX3N0YXJ0X3BvcywgdmFsdWVfZW5kX3BvcykKKyAgICAgICAgbm9kZS5uYW1lX3NvdXJjZV9yYW5nZSA9IHJhbmdlKG5hbWVfc3RhcnRfcG9zLCBuYW1lX2VuZF9wb3MpCisgICAgICAgIG5vZGUudmFsdWVfc291cmNlX3JhbmdlID0gcmFuZ2UodmFsdWVfc3RhcnRfcG9zLCB2YWx1ZV9lbmRfcG9zKQorCisgICAgICAgIHJldHVybiBub2RlIHVubGVzcyByZXF1aXJlX2Jsb2NrCisgICAgICAgIG5lc3RlZF9wcm9wZXJ0aWVzISBub2RlCisgICAgICBlbmQKKworICAgICAgZGVmIGNzc192YXJpYWJsZV9kZWNsYXJhdGlvbihuYW1lLCBuYW1lX3N0YXJ0X3BvcywgbmFtZV9lbmRfcG9zKQorICAgICAgICB2YWx1ZV9zdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgdmFsdWUgPSBkZWNsYXJhdGlvbl92YWx1ZQorICAgICAgICB2YWx1ZV9lbmRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisKKyAgICAgICAgbm9kZSA9IG5vZGUoU2Fzczo6VHJlZTo6UHJvcE5vZGUubmV3KG5hbWUuZmxhdHRlbi5jb21wYWN0LCB2YWx1ZSwgOm5ldyksCisgICAgICAgICAgICAgICAgICAgIG5hbWVfc3RhcnRfcG9zLCB2YWx1ZV9lbmRfcG9zKQorICAgICAgICBub2RlLm5hbWVfc291cmNlX3JhbmdlID0gcmFuZ2UobmFtZV9zdGFydF9wb3MsIG5hbWVfZW5kX3BvcykKKyAgICAgICAgbm9kZS52YWx1ZV9zb3VyY2VfcmFuZ2UgPSByYW5nZSh2YWx1ZV9zdGFydF9wb3MsIHZhbHVlX2VuZF9wb3MpCisgICAgICAgIG5vZGUKKyAgICAgIGVuZAorCisgICAgICAjIFRoaXMgcHJvZHVjdGlvbiBjb25zdW1lcyB2YWx1ZXMgdGhhdCBjb3VsZCBiZSBhIHNlbGVjdG9yLCBhbiBleHByZXNzaW9uLAorICAgICAgIyBvciBhIGNvbWJpbmF0aW9uIG9mIGJvdGguIEl0IHJlc3BlY3RzIHN0cmluZ3MgYW5kIGNvbW1lbnRzIGFuZCBzdXBwb3J0cworICAgICAgIyBpbnRlcnBvbGF0aW9uLiBJdCB3aWxsIGNvbnN1bWUgdXAgdG8gInsiLCAifSIsICI7Iiwgb3IgIiEiLgorICAgICAgIworICAgICAgIyBWYWx1ZXMgY29uc3VtZWQgYnkgdGhpcyBwcm9kdWN0aW9uIHdpbGwgdXN1YWxseSBiZSBwYXJzZWQgbW9yZQorICAgICAgIyB0aG9yb3VnaGx5IG9uY2UgaW50ZXJwb2xhdGlvbiBoYXMgYmVlbiByZXNvbHZlZC4KKyAgICAgIGRlZiBhbG1vc3RfYW55X3ZhbHVlCisgICAgICAgIHJldHVybiB1bmxlc3MgKHRvayA9IGFsbW9zdF9hbnlfdmFsdWVfdG9rZW4pCisgICAgICAgIHNlbCA9IFt0b2tdCisgICAgICAgIHdoaWxlICh0b2sgPSBhbG1vc3RfYW55X3ZhbHVlX3Rva2VuKQorICAgICAgICAgIHNlbCA8PCB0b2sKKyAgICAgICAgZW5kCisgICAgICAgIG1lcmdlKHNlbCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgYWxtb3N0X2FueV92YWx1ZV90b2tlbgorICAgICAgICB0b2soJXJ7CisgICAgICAgICAgKAorICAgICAgICAgICAgXFwuCisgICAgICAgICAgfAorICAgICAgICAgICAgKD8hdXJsXCgpCisgICAgICAgICAgICBbXiInL1wjITtce1x9XSAjICIKKyAgICAgICAgICB8CisgICAgICAgICAgICAjIGludGVycF91cmkgd2lsbCBoYW5kbGUgbW9zdCB1cmwoKSBjYWxscywgYnV0IG5vdCBvbmVzIHRoYXQgdGFrZSBzdHJpbmdzCisgICAgICAgICAgICB1cmxcKCN7V30oPz0iKQorICAgICAgICAgIHwKKyAgICAgICAgICAgIC8oPyFbLypdKQorICAgICAgICAgIHwKKyAgICAgICAgICAgIFwjKD8hXHspCisgICAgICAgICAgfAorICAgICAgICAgICAgISg/IVthLXpdKSAjIFRPRE86IG5ldmVyIGNvbnN1bWUgIiEiIHdoZW4gaXNzdWUgMTEyNiBpcyBmaXhlZC4KKyAgICAgICAgICApKworICAgICAgICB9eGkpIHx8IHRvayhDT01NRU5UKSB8fCB0b2soU0lOR0xFX0xJTkVfQ09NTUVOVCkgfHwgaW50ZXJwX3N0cmluZyB8fCBpbnRlcnBfdXJpIHx8CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbig6d2Fybl9mb3JfY29sb3IpCisgICAgICBlbmQKKworICAgICAgZGVmIGRlY2xhcmF0aW9uX3ZhbHVlKHRvcF9sZXZlbDogdHJ1ZSkKKyAgICAgICAgcmV0dXJuIHVubGVzcyAodG9rID0gZGVjbGFyYXRpb25fdmFsdWVfdG9rZW4odG9wX2xldmVsKSkKKyAgICAgICAgdmFsdWUgPSBbdG9rXQorICAgICAgICB3aGlsZSAodG9rID0gZGVjbGFyYXRpb25fdmFsdWVfdG9rZW4odG9wX2xldmVsKSkKKyAgICAgICAgICB2YWx1ZSA8PCB0b2sKKyAgICAgICAgZW5kCisgICAgICAgIG1lcmdlKHZhbHVlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBkZWNsYXJhdGlvbl92YWx1ZV90b2tlbih0b3BfbGV2ZWwpCisgICAgICAgICMgVGhpcyBjb21lcywgbW9yZSBvciBsZXNzLCBmcm9tIHRoZSBbdG9rZW4gY29uc3VtcHRpb24gYWxnb3JpdGhtXVtdLgorICAgICAgICAjIEhvd2V2ZXIsIHNpbmNlIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIHRva2VuIHNlbWFudGljcywgd2UKKyAgICAgICAgIyBqdXN0IGNvbnN1bWUgZXZlcnl0aGluZyB1bnRpbCB3ZSBjb21lIGFjcm9zcyBhIHRva2VuIHdpdGggc3BlY2lhbAorICAgICAgICAjIHNlbWFudGljcy4KKyAgICAgICAgIworICAgICAgICAjIFt0b2tlbiBjb25zdW1wdGlvbiBhbGdvcml0aG1dOiBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXN5bnRheC0zLyNjb25zdW1lLXRva2VuLgorICAgICAgICByZXN1bHQgPSB0b2soJXJ7CisgICAgICAgICAgKAorICAgICAgICAgICAgKD8hCisgICAgICAgICAgICAgIHVybFwoCisgICAgICAgICAgICApCisgICAgICAgICAgICBbXigpXFtcXXt9IicjLyBcdFxyXG5cZiN7dG9wX2xldmVsID8gIjshIiA6ICIifV0KKyAgICAgICAgICB8CisgICAgICAgICAgICBcIyg/IVx7KQorICAgICAgICAgIHwKKyAgICAgICAgICAgIC8oPyFcKikKKyAgICAgICAgICApKworICAgICAgICB9eGkpIHx8IGludGVycF9zdHJpbmcgfHwgaW50ZXJwX3VyaSB8fCBpbnRlcnBvbGF0aW9uIHx8IHRvayhDT01NRU5UKQorICAgICAgICByZXR1cm4gcmVzdWx0IGlmIHJlc3VsdAorCisgICAgICAgICMgRm9sZCB0b2dldGhlciBtdWx0aXBsZSBjaGFyYWN0ZXJzIG9mIHdoaXRlc3BhY2UgdGhhdCBkb24ndCBpbmNsdWRlCisgICAgICAgICMgbmV3bGluZXMuIFRoZSB2YWx1ZSBvbmx5IGNhcmVzIGFib3V0IHRoZSB0b2tlbml6YXRpb24sIHNvIHRoaXMgaXMgc2FmZQorICAgICAgICAjIGFzIGxvbmcgYXMgd2UgZG9uJ3QgZGVsZXRlIHdoaXRlc3BhY2UgZW50aXJlbHkuIEl0J3MgaW1wb3J0YW50IHRoYXQgd2UKKyAgICAgICAgIyBmb2xkIGhlcmUgcmF0aGVyIHRoYW4gcG9zdC1wcm9jZXNzaW5nLCBzaW5jZSB3ZSBhcmVuJ3QgYWxsb3dlZCB0byBmb2xkCisgICAgICAgICMgd2hpdGVzcGFjZSB3aXRoaW4gc3RyaW5ncyBhbmQgd2UgbG9zZSB0aGF0IGNvbnRleHQgbGF0ZXIgb24uCisgICAgICAgIGlmICh3cyA9IHRvayhTKSkKKyAgICAgICAgICByZXR1cm4gd3MuaW5jbHVkZT8oIlxuIikgPyB3cy5nc3ViKC9cQVteXG5dKi8sICcnKSA6ICcgJworICAgICAgICBlbmQKKworICAgICAgICBpZiB0b2soL1woLykKKyAgICAgICAgICB2YWx1ZSA9IGRlY2xhcmF0aW9uX3ZhbHVlKHRvcF9sZXZlbDogZmFsc2UpCisgICAgICAgICAgdG9rISgvXCkvKQorICAgICAgICAgIFsnKCcsICp2YWx1ZSwgJyknXQorICAgICAgICBlbHNpZiB0b2soL1xbLykKKyAgICAgICAgICB2YWx1ZSA9IGRlY2xhcmF0aW9uX3ZhbHVlKHRvcF9sZXZlbDogZmFsc2UpCisgICAgICAgICAgdG9rISgvXF0vKQorICAgICAgICAgIFsnWycsICp2YWx1ZSwgJ10nXQorICAgICAgICBlbHNpZiB0b2soL1x7LykKKyAgICAgICAgICB2YWx1ZSA9IGRlY2xhcmF0aW9uX3ZhbHVlKHRvcF9sZXZlbDogZmFsc2UpCisgICAgICAgICAgdG9rISgvXH0vKQorICAgICAgICAgIFsneycsICp2YWx1ZSwgJ30nXQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgZGVjbGFyYXRpb24KKyAgICAgICAgIyBUaGlzIGFsbG93cyB0aGUgIipwcm9wOiB2YWwiLCAiOnByb3A6IHZhbCIsICIjcHJvcDogdmFsIiwgYW5kICIucHJvcDoKKyAgICAgICAgIyB2YWwiIGhhY2tzLgorICAgICAgICBuYW1lX3N0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICBpZiAocyA9IHRvaygvWzpcKlwuXXxcIyg/IVx7KS8pKQorICAgICAgICAgIG5hbWUgPSBbcywgc3RyIHtzc30sICpleHByISg6aW50ZXJwX2lkZW50KV0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiB1bmxlc3MgKG5hbWUgPSBpbnRlcnBfaWRlbnQpCisgICAgICAgICAgbmFtZSA9IEFycmF5KG5hbWUpCisgICAgICAgIGVuZAorCisgICAgICAgIGlmIChjb21tZW50ID0gdG9rKENPTU1FTlQpKQorICAgICAgICAgIG5hbWUgPDwgY29tbWVudAorICAgICAgICBlbmQKKyAgICAgICAgbmFtZV9lbmRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgIHNzCisKKyAgICAgICAgdG9rISgvOi8pCisgICAgICAgIHNzCisgICAgICAgIHZhbHVlX3N0YXJ0X3BvcyA9IHNvdXJjZV9wb3NpdGlvbgorICAgICAgICB2YWx1ZSA9IHZhbHVlIQorICAgICAgICB2YWx1ZV9lbmRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgIHNzCisgICAgICAgIHJlcXVpcmVfYmxvY2sgPSB0b2s/KC9cey8pCisKKyAgICAgICAgbm9kZSA9IG5vZGUoU2Fzczo6VHJlZTo6UHJvcE5vZGUubmV3KG5hbWUuZmxhdHRlbi5jb21wYWN0LCBbdmFsdWVdLCA6bmV3KSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZV9zdGFydF9wb3MsIHZhbHVlX2VuZF9wb3MpCisgICAgICAgIG5vZGUubmFtZV9zb3VyY2VfcmFuZ2UgPSByYW5nZShuYW1lX3N0YXJ0X3BvcywgbmFtZV9lbmRfcG9zKQorICAgICAgICBub2RlLnZhbHVlX3NvdXJjZV9yYW5nZSA9IHJhbmdlKHZhbHVlX3N0YXJ0X3BvcywgdmFsdWVfZW5kX3BvcykKKworICAgICAgICByZXR1cm4gbm9kZSB1bmxlc3MgcmVxdWlyZV9ibG9jaworICAgICAgICBuZXN0ZWRfcHJvcGVydGllcyEgbm9kZQorICAgICAgZW5kCisKKyAgICAgIGRlZiB2YWx1ZSEKKyAgICAgICAgaWYgdG9rPygvXHsvKQorICAgICAgICAgIHN0ciA9IFNhc3M6OlNjcmlwdDo6VHJlZTo6TGl0ZXJhbC5uZXcoU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygiIikpCisgICAgICAgICAgc3RyLmxpbmUgPSBzb3VyY2VfcG9zaXRpb24ubGluZQorICAgICAgICAgIHN0ci5zb3VyY2VfcmFuZ2UgPSByYW5nZShzb3VyY2VfcG9zaXRpb24pCisgICAgICAgICAgcmV0dXJuIHN0cgorICAgICAgICBlbmQKKworICAgICAgICBzdGFydF9wb3MgPSBzb3VyY2VfcG9zaXRpb24KKyAgICAgICAgIyBUaGlzIGlzIGEgYml0IG9mIGEgZGlydHkgdHJpY2s6CisgICAgICAgICMgaWYgdGhlIHZhbHVlIGlzIGNvbXBsZXRlbHkgc3RhdGljLAorICAgICAgICAjIHdlIGRvbid0IHBhcnNlIGl0IGF0IGFsbCwgYW5kIGluc3RlYWQgcmV0dXJuIGEgcGxhaW4gb2xkIHN0cmluZworICAgICAgICAjIGNvbnRhaW5pbmcgdGhlIHZhbHVlLgorICAgICAgICAjIFRoaXMgcmVzdWx0cyBpbiBhIGRyYW1hdGljIHNwZWVkIGluY3JlYXNlLgorICAgICAgICBpZiAodmFsID0gdG9rKFNUQVRJQ19WQUxVRSkpCisgICAgICAgICAgc3RyID0gU2Fzczo6U2NyaXB0OjpUcmVlOjpMaXRlcmFsLm5ldyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KHZhbC5zdHJpcCkpCisgICAgICAgICAgc3RyLmxpbmUgPSBzdGFydF9wb3MubGluZQorICAgICAgICAgIHN0ci5zb3VyY2VfcmFuZ2UgPSByYW5nZShzdGFydF9wb3MpCisgICAgICAgICAgcmV0dXJuIHN0cgorICAgICAgICBlbmQKKyAgICAgICAgc2Fzc19zY3JpcHQoOnBhcnNlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBuZXN0ZWRfcHJvcGVydGllcyEobm9kZSkKKyAgICAgICAgQGV4cGVjdGVkID0gJ2V4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSBvciAieyInCisgICAgICAgIGJsb2NrKG5vZGUsIDpwcm9wZXJ0eSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgZXhwcihhbGxvd192YXIgPSB0cnVlKQorICAgICAgICB0ID0gdGVybShhbGxvd192YXIpCisgICAgICAgIHJldHVybiB1bmxlc3MgdAorICAgICAgICByZXMgPSBbdCwgc3RyIHtzc31dCisKKyAgICAgICAgd2hpbGUgKG8gPSBvcGVyYXRvcikgJiYgKHQgPSB0ZXJtKGFsbG93X3ZhcikpCisgICAgICAgICAgcmVzIDw8IG8gPDwgdCA8PCBzdHIge3NzfQorICAgICAgICBlbmQKKworICAgICAgICByZXMuZmxhdHRlbgorICAgICAgZW5kCisKKyAgICAgIGRlZiB0ZXJtKGFsbG93X3ZhcikKKyAgICAgICAgZSA9IHRvayhOVU1CRVIpIHx8CisgICAgICAgICAgICBpbnRlcnBfdXJpIHx8CisgICAgICAgICAgICBmdW5jdGlvbihhbGxvd192YXIpIHx8CisgICAgICAgICAgICBpbnRlcnBfc3RyaW5nIHx8CisgICAgICAgICAgICB0b2soVU5JQ09ERVJBTkdFKSB8fAorICAgICAgICAgICAgaW50ZXJwX2lkZW50IHx8CisgICAgICAgICAgICB0b2soSEVYQ09MT1IpIHx8CisgICAgICAgICAgICAoYWxsb3dfdmFyICYmIHZhcl9leHByKQorICAgICAgICByZXR1cm4gZSBpZiBlCisKKyAgICAgICAgb3AgPSB0b2soL1srLV0vKQorICAgICAgICByZXR1cm4gdW5sZXNzIG9wCisgICAgICAgIEBleHBlY3RlZCA9ICJudW1iZXIgb3IgZnVuY3Rpb24iCisgICAgICAgIFtvcCwKKyAgICAgICAgIHRvayhOVU1CRVIpIHx8IGZ1bmN0aW9uKGFsbG93X3ZhcikgfHwgKGFsbG93X3ZhciAmJiB2YXJfZXhwcikgfHwgZXhwciEoOmludGVycG9sYXRpb24pXQorICAgICAgZW5kCisKKyAgICAgIGRlZiBmdW5jdGlvbihhbGxvd192YXIpCisgICAgICAgIG5hbWUgPSB0b2soRlVOQ1RJT04pCisgICAgICAgIHJldHVybiB1bmxlc3MgbmFtZQorICAgICAgICBpZiBuYW1lID09ICJleHByZXNzaW9uKCIgfHwgbmFtZSA9PSAiY2FsYygiCisgICAgICAgICAgc3RyLCBfID0gU2Fzczo6U2hhcmVkLmJhbGFuY2UoQHNjYW5uZXIsID8oLCA/KSwgMSkKKyAgICAgICAgICBbbmFtZSwgc3RyXQorICAgICAgICBlbHNlCisgICAgICAgICAgW25hbWUsIHN0ciB7c3N9LCBleHByKGFsbG93X3ZhciksIHRvayEoL1wpLyldCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiB2YXJfZXhwcgorICAgICAgICByZXR1cm4gdW5sZXNzIHRvaygvXCQvKQorICAgICAgICBsaW5lID0gQGxpbmUKKyAgICAgICAgdmFyID0gU2Fzczo6U2NyaXB0OjpUcmVlOjpWYXJpYWJsZS5uZXcodG9rIShJREVOVCkpCisgICAgICAgIHZhci5saW5lID0gbGluZQorICAgICAgICB2YXIKKyAgICAgIGVuZAorCisgICAgICBkZWYgaW50ZXJwb2xhdGlvbih3YXJuX2Zvcl9jb2xvciA9IGZhbHNlKQorICAgICAgICByZXR1cm4gdW5sZXNzIHRvayhJTlRFUlBfU1RBUlQpCisgICAgICAgIHNhc3Nfc2NyaXB0KDpwYXJzZV9pbnRlcnBvbGF0ZWQsIHdhcm5fZm9yX2NvbG9yKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdHJpbmcKKyAgICAgICAgcmV0dXJuIHVubGVzcyB0b2soU1RSSU5HKQorICAgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcudmFsdWUoQHNjYW5uZXJbMV0gfHwgQHNjYW5uZXJbMl0pCisgICAgICBlbmQKKworICAgICAgZGVmIGludGVycF9zdHJpbmcKKyAgICAgICAgX2ludGVycF9zdHJpbmcoOmRvdWJsZSkgfHwgX2ludGVycF9zdHJpbmcoOnNpbmdsZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgaW50ZXJwX3VyaQorICAgICAgICBfaW50ZXJwX3N0cmluZyg6dXJpKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfaW50ZXJwX3N0cmluZyh0eXBlKQorICAgICAgICBzdGFydCA9IHRvayhTYXNzOjpTY3JpcHQ6OkxleGVyOjpTVFJJTkdfUkVHVUxBUl9FWFBSRVNTSU9OU1t0eXBlXVtmYWxzZV0pCisgICAgICAgIHJldHVybiB1bmxlc3Mgc3RhcnQKKyAgICAgICAgcmVzID0gW3N0YXJ0XQorCisgICAgICAgIG1pZF9yZSA9IFNhc3M6OlNjcmlwdDo6TGV4ZXI6OlNUUklOR19SRUdVTEFSX0VYUFJFU1NJT05TW3R5cGVdW3RydWVdCisgICAgICAgICMgQHNjYW5uZXJbMl0uZW1wdHk/IG1lYW5zIHdlJ3ZlIHN0YXJ0ZWQgYW4gaW50ZXJwb2xhdGVkIHNlY3Rpb24KKyAgICAgICAgd2hpbGUgQHNjYW5uZXJbMl0gPT0gJyN7JworICAgICAgICAgIEBzY2FubmVyLnBvcyAtPSAyICMgRG9uJ3QgY29uc3VtZSB0aGUgI3sKKyAgICAgICAgICByZXMubGFzdC5zbGljZSEoLTIuLi0xKQorICAgICAgICAgIHJlcyA8PCBleHByISg6aW50ZXJwb2xhdGlvbikgPDwgdG9rKG1pZF9yZSkKKyAgICAgICAgZW5kCisgICAgICAgIHJlcworICAgICAgZW5kCisKKyAgICAgIGRlZiBpbnRlcnBfaWRlbnQoc3RhcnQgPSBJREVOVCkKKyAgICAgICAgdmFsID0gdG9rKHN0YXJ0KSB8fCBpbnRlcnBvbGF0aW9uKDp3YXJuX2Zvcl9jb2xvcikgfHwgdG9rKElERU5UX0hZUEhFTl9JTlRFUlApCisgICAgICAgIHJldHVybiB1bmxlc3MgdmFsCisgICAgICAgIHJlcyA9IFt2YWxdCisgICAgICAgIHdoaWxlICh2YWwgPSB0b2soTkFNRSkgfHwgaW50ZXJwb2xhdGlvbig6d2Fybl9mb3JfY29sb3IpKQorICAgICAgICAgIHJlcyA8PCB2YWwKKyAgICAgICAgZW5kCisgICAgICAgIHJlcworICAgICAgZW5kCisKKyAgICAgIGRlZiBpbnRlcnBfaWRlbnRfb3JfdmFyCisgICAgICAgIGlkID0gaW50ZXJwX2lkZW50CisgICAgICAgIHJldHVybiBpZCBpZiBpZAorICAgICAgICB2YXIgPSB2YXJfZXhwcgorICAgICAgICByZXR1cm4gW3Zhcl0gaWYgdmFyCisgICAgICBlbmQKKworICAgICAgZGVmIHN0cgorICAgICAgICBAc3Rycy5wdXNoIFN0cmluZy5uZXcoIiIpCisgICAgICAgIHlpZWxkCisgICAgICAgIEBzdHJzLmxhc3QKKyAgICAgIGVuc3VyZQorICAgICAgICBAc3Rycy5wb3AKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3RyPworICAgICAgICBwb3MgPSBAc2Nhbm5lci5wb3MKKyAgICAgICAgbGluZSA9IEBsaW5lCisgICAgICAgIG9mZnNldCA9IEBvZmZzZXQKKyAgICAgICAgQHN0cnMucHVzaCAiIgorICAgICAgICB0aHJvd19lcnJvciB7eWllbGR9ICYmIEBzdHJzLmxhc3QKKyAgICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvcgorICAgICAgICBAc2Nhbm5lci5wb3MgPSBwb3MKKyAgICAgICAgQGxpbmUgPSBsaW5lCisgICAgICAgIEBvZmZzZXQgPSBvZmZzZXQKKyAgICAgICAgbmlsCisgICAgICBlbnN1cmUKKyAgICAgICAgQHN0cnMucG9wCisgICAgICBlbmQKKworICAgICAgZGVmIG5vZGUobm9kZSwgc3RhcnRfcG9zLCBlbmRfcG9zID0gc291cmNlX3Bvc2l0aW9uKQorICAgICAgICBub2RlLmxpbmUgPSBzdGFydF9wb3MubGluZQorICAgICAgICBub2RlLnNvdXJjZV9yYW5nZSA9IHJhbmdlKHN0YXJ0X3BvcywgZW5kX3BvcykKKyAgICAgICAgbm9kZQorICAgICAgZW5kCisKKyAgICAgIEBzYXNzX3NjcmlwdF9wYXJzZXIgPSBTYXNzOjpTY3JpcHQ6OlBhcnNlcgorCisgICAgICBjbGFzcyA8PCBzZWxmCisgICAgICAgICMgQHByaXZhdGUKKyAgICAgICAgYXR0cl9hY2Nlc3NvciA6c2Fzc19zY3JpcHRfcGFyc2VyCisgICAgICBlbmQKKworICAgICAgZGVmIHNhc3Nfc2NyaXB0KCphcmdzKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmNsYXNzLnNhc3Nfc2NyaXB0X3BhcnNlci5uZXcoQHNjYW5uZXIsIEBsaW5lLCBAb2Zmc2V0LAorICAgICAgICAgIDpmaWxlbmFtZSA9PiBAZmlsZW5hbWUsIDppbXBvcnRlciA9PiBAaW1wb3J0ZXIsIDphbGxvd19leHRyYV90ZXh0ID0+IHRydWUpCisgICAgICAgIHJlc3VsdCA9IHBhcnNlci5zZW5kKCphcmdzKQorICAgICAgICB1bmxlc3MgQHN0cnMuZW1wdHk/CisgICAgICAgICAgIyBDb252ZXJ0IHRvIENTUyBtYW51YWxseSBzbyB0aGF0IGNvbW1lbnRzIGFyZSBpZ25vcmVkLgorICAgICAgICAgIHNyYyA9IHJlc3VsdC50b19zYXNzCisgICAgICAgICAgQHN0cnMuZWFjaCB7fHN8IHMgPDwgc3JjfQorICAgICAgICBlbmQKKyAgICAgICAgQGxpbmUgPSBwYXJzZXIubGluZQorICAgICAgICBAb2Zmc2V0ID0gcGFyc2VyLm9mZnNldAorICAgICAgICByZXN1bHQKKyAgICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgICAgIHRocm93KDpfc2Fzc19wYXJzZXJfZXJyb3IsIHRydWUpIGlmIEB0aHJvd19lcnJvcgorICAgICAgICByYWlzZSBlCisgICAgICBlbmQKKworICAgICAgZGVmIG1lcmdlKGFycikKKyAgICAgICAgYXJyICYmIFNhc3M6OlV0aWwubWVyZ2VfYWRqYWNlbnRfc3RyaW5ncyhbYXJyXS5mbGF0dGVuKQorICAgICAgZW5kCisKKyAgICAgIEVYUFJfTkFNRVMgPSB7CisgICAgICAgIDptZWRpYV9xdWVyeSA9PiAibWVkaWEgcXVlcnkgKGUuZy4gcHJpbnQsIHNjcmVlbiwgcHJpbnQgYW5kIHNjcmVlbikiLAorICAgICAgICA6bWVkaWFfcXVlcnlfbGlzdCA9PiAibWVkaWEgcXVlcnkgKGUuZy4gcHJpbnQsIHNjcmVlbiwgcHJpbnQgYW5kIHNjcmVlbikiLAorICAgICAgICA6bWVkaWFfZXhwciA9PiAibWVkaWEgZXhwcmVzc2lvbiAoZS5nLiAobWluLWRldmljZS13aWR0aDogODAwcHgpKSIsCisgICAgICAgIDphdF9yb290X3F1ZXJ5ID0+ICJAYXQtcm9vdCBxdWVyeSAoZS5nLiAod2l0aG91dDogbWVkaWEpKSIsCisgICAgICAgIDphdF9yb290X2RpcmVjdGl2ZV9saXN0ID0+ICcqIG9yIGlkZW50aWZpZXInLAorICAgICAgICA6ZGVjbGFyYXRpb25fdmFsdWUgPT4gImV4cHJlc3Npb24gKGUuZy4gZnIsIDJuKzEpIiwKKyAgICAgICAgOmludGVycF9pZGVudCA9PiAiaWRlbnRpZmllciIsCisgICAgICAgIDpxdWFsaWZpZWRfbmFtZSA9PiAiaWRlbnRpZmllciIsCisgICAgICAgIDpleHByID0+ICJleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCkiLAorICAgICAgICA6c2VsZWN0b3JfY29tbWFfc2VxdWVuY2UgPT4gInNlbGVjdG9yIiwKKyAgICAgICAgOnN0cmluZyA9PiAic3RyaW5nIiwKKyAgICAgICAgOmltcG9ydF9hcmcgPT4gImZpbGUgdG8gaW1wb3J0IChzdHJpbmcgb3IgdXJsKCkpIiwKKyAgICAgICAgOm1vel9kb2N1bWVudF9mdW5jdGlvbiA9PiAibWF0Y2hpbmcgZnVuY3Rpb24gKGUuZy4gdXJsLXByZWZpeCgpLCBkb21haW4oKSkiLAorICAgICAgICA6c3VwcG9ydHNfY29uZGl0aW9uID0+ICJAc3VwcG9ydHMgY29uZGl0aW9uIChlLmcuIChkaXNwbGF5OiBmbGV4Ym94KSkiLAorICAgICAgICA6c3VwcG9ydHNfY29uZGl0aW9uX2luX3BhcmVucyA9PiAiQHN1cHBvcnRzIGNvbmRpdGlvbiAoZS5nLiAoZGlzcGxheTogZmxleGJveCkpIiwKKyAgICAgICAgOmFfbl9wbHVzX2IgPT4gIkFuK0IgZXhwcmVzc2lvbiIsCisgICAgICAgIDprZXlmcmFtZXNfc2VsZWN0b3JfY29tcG9uZW50ID0+ICJmcm9tLCB0bywgb3IgYSBwZXJjZW50YWdlIiwKKyAgICAgICAgOmtleWZyYW1lc19zZWxlY3RvciA9PiAia2V5ZnJhbWVzIHNlbGVjdG9yIChlLmcuIDEwJSkiCisgICAgICB9CisKKyAgICAgIFRPS19OQU1FUyA9IEhhc2hbU2Fzczo6U0NTUzo6UlguY29uc3RhbnRzLm1hcCBkbyB8Y3wKKyAgICAgICAgW1Nhc3M6OlNDU1M6OlJYLmNvbnN0X2dldChjKSwgYy5kb3duY2FzZV0KKyAgICAgIGVuZF0ubWVyZ2UoCisgICAgICAgIElERU5UID0+ICJpZGVudGlmaWVyIiwKKyAgICAgICAgL1s7e31dLyA9PiAnIjsiJywKKyAgICAgICAgL1xiKHdpdGhvdXR8d2l0aClcYi8gPT4gJyJ3aXRoIiBvciAid2l0aG91dCInCisgICAgICApCisKKyAgICAgIGRlZiB0b2s/KHJ4KQorICAgICAgICBAc2Nhbm5lci5tYXRjaD8ocngpCisgICAgICBlbmQKKworICAgICAgZGVmIGV4cHIhKG5hbWUpCisgICAgICAgIGUgPSBzZW5kKG5hbWUpCisgICAgICAgIHJldHVybiBlIGlmIGUKKyAgICAgICAgZXhwZWN0ZWQoRVhQUl9OQU1FU1tuYW1lXSB8fCBuYW1lLnRvX3MpCisgICAgICBlbmQKKworICAgICAgZGVmIHRvayEocngpCisgICAgICAgIHQgPSB0b2socngpCisgICAgICAgIHJldHVybiB0IGlmIHQKKyAgICAgICAgbmFtZSA9IFRPS19OQU1FU1tyeF0KKworICAgICAgICB1bmxlc3MgbmFtZQorICAgICAgICAgICMgRGlzcGxheSBiYXNpYyByZWdleHBzIGFzIHBsYWluIG9sZCBzdHJpbmdzCisgICAgICAgICAgc291cmNlID0gcnguc291cmNlLmdzdWIoJXJ7XFwvfSwgJy8nKQorICAgICAgICAgIHN0cmluZyA9IHJ4LnNvdXJjZS5nc3ViKC9cXCguKS8sICdcMScpCisgICAgICAgICAgbmFtZSA9IHNvdXJjZSA9PSBSZWdleHAuZXNjYXBlKHN0cmluZykgPyBzdHJpbmcuaW5zcGVjdCA6IHJ4Lmluc3BlY3QKKyAgICAgICAgZW5kCisKKyAgICAgICAgZXhwZWN0ZWQobmFtZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgZXhwZWN0ZWQobmFtZSkKKyAgICAgICAgdGhyb3coOl9zYXNzX3BhcnNlcl9lcnJvciwgdHJ1ZSkgaWYgQHRocm93X2Vycm9yCisgICAgICAgIHNlbGYuY2xhc3MuZXhwZWN0ZWQoQHNjYW5uZXIsIEBleHBlY3RlZCB8fCBuYW1lLCBAbGluZSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgZXJyKG1zZykKKyAgICAgICAgdGhyb3coOl9zYXNzX3BhcnNlcl9lcnJvciwgdHJ1ZSkgaWYgQHRocm93X2Vycm9yCisgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldyhtc2csIDpsaW5lID0+IEBsaW5lKQorICAgICAgZW5kCisKKyAgICAgIGRlZiB0aHJvd19lcnJvcgorICAgICAgICBvbGRfdGhyb3dfZXJyb3IsIEB0aHJvd19lcnJvciA9IEB0aHJvd19lcnJvciwgZmFsc2UKKyAgICAgICAgeWllbGQKKyAgICAgIGVuc3VyZQorICAgICAgICBAdGhyb3dfZXJyb3IgPSBvbGRfdGhyb3dfZXJyb3IKKyAgICAgIGVuZAorCisgICAgICBkZWYgY2F0Y2hfZXJyb3IoJmJsb2NrKQorICAgICAgICBvbGRfdGhyb3dfZXJyb3IsIEB0aHJvd19lcnJvciA9IEB0aHJvd19lcnJvciwgdHJ1ZQorICAgICAgICBwb3MgPSBAc2Nhbm5lci5wb3MKKyAgICAgICAgbGluZSA9IEBsaW5lCisgICAgICAgIG9mZnNldCA9IEBvZmZzZXQKKyAgICAgICAgZXhwZWN0ZWQgPSBAZXhwZWN0ZWQKKworICAgICAgICBsb2dnZXIgPSBTYXNzOjpMb2dnZXI6OkRlbGF5ZWQuaW5zdGFsbCEKKyAgICAgICAgaWYgY2F0Y2goOl9zYXNzX3BhcnNlcl9lcnJvcikge3lpZWxkOyBmYWxzZX0KKyAgICAgICAgICBAc2Nhbm5lci5wb3MgPSBwb3MKKyAgICAgICAgICBAbGluZSA9IGxpbmUKKyAgICAgICAgICBAb2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgICAgQGV4cGVjdGVkID0gZXhwZWN0ZWQKKyAgICAgICAgICB7OnBvcyA9PiBwb3MsIDpsaW5lID0+IGxpbmUsIDpleHBlY3RlZCA9PiBAZXhwZWN0ZWQsIDpibG9jayA9PiBibG9ja30KKyAgICAgICAgZWxzZQorICAgICAgICAgIGxvZ2dlci5mbHVzaAorICAgICAgICAgIG5pbAorICAgICAgICBlbmQKKyAgICAgIGVuc3VyZQorICAgICAgICBsb2dnZXIudW5pbnN0YWxsISBpZiBsb2dnZXIKKyAgICAgICAgQHRocm93X2Vycm9yID0gb2xkX3Rocm93X2Vycm9yCisgICAgICBlbmQKKworICAgICAgZGVmIHJldGhyb3coZXJyKQorICAgICAgICBpZiBAdGhyb3dfZXJyb3IKKyAgICAgICAgICB0aHJvdyA6X3Nhc3NfcGFyc2VyX2Vycm9yLCBlcnIKKyAgICAgICAgZWxzZQorICAgICAgICAgIEBzY2FubmVyID0gU2Fzczo6VXRpbDo6TXVsdGlieXRlU3RyaW5nU2Nhbm5lci5uZXcoQHNjYW5uZXIuc3RyaW5nKQorICAgICAgICAgIEBzY2FubmVyLnBvcyA9IGVycls6cG9zXQorICAgICAgICAgIEBsaW5lID0gZXJyWzpsaW5lXQorICAgICAgICAgIEBleHBlY3RlZCA9IGVycls6ZXhwZWN0ZWRdCisgICAgICAgICAgZXJyWzpibG9ja10uY2FsbAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEBwcml2YXRlCisgICAgICBkZWYgc2VsZi5leHBlY3RlZChzY2FubmVyLCBleHBlY3RlZCwgbGluZSkKKyAgICAgICAgcG9zID0gc2Nhbm5lci5wb3MKKworICAgICAgICBhZnRlciA9IHNjYW5uZXIuc3RyaW5nWzAuLi5wb3NdCisgICAgICAgICMgR2V0IHJpZCBvZiB3aGl0ZXNwYWNlIGJldHdlZW4gcG9zIGFuZCB0aGUgbGFzdCB0b2tlbiwKKyAgICAgICAgIyBidXQgb25seSBpZiB0aGVyZSdzIGEgbmV3bGluZSBpbiB0aGVyZQorICAgICAgICBhZnRlci5nc3ViISgvXHMqXG5ccyokLywgJycpCisgICAgICAgICMgQWxzbyBnZXQgcmlkIG9mIHN0dWZmIGJlZm9yZSB0aGUgbGFzdCBuZXdsaW5lCisgICAgICAgIGFmdGVyLmdzdWIhKC8uKlxuLywgJycpCisgICAgICAgIGFmdGVyID0gIi4uLiIgKyBhZnRlclstMTUuLi0xXSBpZiBhZnRlci5zaXplID4gMTgKKworICAgICAgICB3YXMgPSBzY2FubmVyLnJlc3QuZHVwCisgICAgICAgICMgR2V0IHJpZCBvZiB3aGl0ZXNwYWNlIGJldHdlZW4gcG9zIGFuZCB0aGUgbmV4dCB0b2tlbiwKKyAgICAgICAgIyBidXQgb25seSBpZiB0aGVyZSdzIGEgbmV3bGluZSBpbiB0aGVyZQorICAgICAgICB3YXMuZ3N1YiEoL15ccypcblxzKi8sICcnKQorICAgICAgICAjIEFsc28gZ2V0IHJpZCBvZiBzdHVmZiBhZnRlciB0aGUgbmV4dCBuZXdsaW5lCisgICAgICAgIHdhcy5nc3ViISgvXG4uKi8sICcnKQorICAgICAgICB3YXMgPSB3YXNbMC4uLjE1XSArICIuLi4iIGlmIHdhcy5zaXplID4gMTgKKworICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoCisgICAgICAgICAgIkludmFsaWQgQ1NTIGFmdGVyIFwiI3thZnRlcn1cIjogZXhwZWN0ZWQgI3tleHBlY3RlZH0sIHdhcyBcIiN7d2FzfVwiIiwKKyAgICAgICAgICA6bGluZSA9PiBsaW5lKQorICAgICAgZW5kCisKKyAgICAgICMgQXZvaWQgYWxsb2NhdGluZyBsb3RzIG9mIG5ldyBzdHJpbmdzIGZvciBgI3Rva2AuCisgICAgICAjIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgYCN0b2tgIGlzIGNhbGxlZCBhbGwgdGhlIHRpbWUuCisgICAgICBORVdMSU5FID0gIlxuIgorCisgICAgICBkZWYgdG9rKHJ4KQorICAgICAgICByZXMgPSBAc2Nhbm5lci5zY2FuKHJ4KQorCisgICAgICAgIHJldHVybiB1bmxlc3MgcmVzCisKKyAgICAgICAgbmV3bGluZV9jb3VudCA9IHJlcy5jb3VudChORVdMSU5FKQorICAgICAgICBpZiBuZXdsaW5lX2NvdW50ID4gMAorICAgICAgICAgIEBsaW5lICs9IG5ld2xpbmVfY291bnQKKyAgICAgICAgICBAb2Zmc2V0ID0gcmVzW3Jlcy5yaW5kZXgoTkVXTElORSkuLi0xXS5zaXplCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAb2Zmc2V0ICs9IHJlcy5zaXplCisgICAgICAgIGVuZAorCisgICAgICAgIEBleHBlY3RlZCA9IG5pbAorICAgICAgICBpZiAhQHN0cnMuZW1wdHk/ICYmIHJ4ICE9IENPTU1FTlQgJiYgcnggIT0gU0lOR0xFX0xJTkVfQ09NTUVOVAorICAgICAgICAgIEBzdHJzLmVhY2gge3xzfCBzIDw8IHJlc30KKyAgICAgICAgZW5kCisgICAgICAgIHJlcworICAgICAgZW5kCisKKyAgICAgICMgUmVtb3ZlIGEgdmVuZG9yIHByZWZpeCBmcm9tIGBzdHJgLgorICAgICAgZGVmIGRlcHJlZml4KHN0cikKKyAgICAgICAgc3RyLmdzdWIoL14tW2EtekEtWjAtOV0rLS8sICcnKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3Njc3MvcngucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3Njc3MvcngucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0OGE3NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2Nzcy9yeC5yYgpAQCAtMCwwICsxLDEzNCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK21vZHVsZSBTYXNzCisgIG1vZHVsZSBTQ1NTCisgICAgIyBBIG1vZHVsZSBjb250YWluaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZAorICAgICMgZm9yIGxleGluZyB0b2tlbnMgaW4gYW4gU0NTUyBkb2N1bWVudC4KKyAgICAjIE1vc3Qgb2YgdGhlc2UgYXJlIHRha2VuIGZyb20gW3RoZSBDU1MzIHNwZWNdKGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNsZXhpY2FsKSwKKyAgICAjIGFsdGhvdWdoIHNvbWUgaGF2ZSBiZWVuIG1vZGlmaWVkIGZvciB2YXJpb3VzIHJlYXNvbnMuCisgICAgbW9kdWxlIFJYCisgICAgICAjIFRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgQ1NTIGlkZW50aWZpZXIKKyAgICAgICMgdGhhdCB3aWxsIGhhdmUgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBzdHIgW1N0cmluZ10gVGhlIHN0cmluZyB0byBlc2NhcGUKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgZXNjYXBlZCBzdHJpbmcKKyAgICAgIGRlZiBzZWxmLmVzY2FwZV9pZGVudChzdHIpCisgICAgICAgIHJldHVybiAiIiBpZiBzdHIuZW1wdHk/CisgICAgICAgIHJldHVybiAiXFwje3N0cn0iIGlmIHN0ciA9PSAnLScgfHwgc3RyID09ICdfJworICAgICAgICBvdXQgPSAiIgorICAgICAgICB2YWx1ZSA9IHN0ci5kdXAKKyAgICAgICAgb3V0IDw8IHZhbHVlLnNsaWNlISgwLi4uMSkgaWYgdmFsdWUgPX4gL15bLV9dLworICAgICAgICBpZiB2YWx1ZVswLi4uMV0gPX4gTk1TVEFSVAorICAgICAgICAgIG91dCA8PCB2YWx1ZS5zbGljZSEoMC4uLjEpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBvdXQgPDwgZXNjYXBlX2NoYXIodmFsdWUuc2xpY2UhKDAuLi4xKSkKKyAgICAgICAgZW5kCisgICAgICAgIG91dCA8PCB2YWx1ZS5nc3ViKC9bXmEtekEtWjAtOV8tXS8pIHt8Y3wgZXNjYXBlX2NoYXIgY30KKyAgICAgICAgb3V0CisgICAgICBlbmQKKworICAgICAgIyBFc2NhcGVzIGEgc2luZ2xlIGNoYXJhY3RlciBmb3IgYSBDU1MgaWRlbnRpZmllci4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGMgW1N0cmluZ10gVGhlIGNoYXJhY3RlciB0byBlc2NhcGUuIFNob3VsZCBoYXZlIGxlbmd0aCAxCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIGVzY2FwZWQgY2hhcmFjdGVyCisgICAgICAjIEBwcml2YXRlCisgICAgICBkZWYgc2VsZi5lc2NhcGVfY2hhcihjKQorICAgICAgICByZXR1cm4gIlxcJTA2eCIgJSBjLm9yZCB1bmxlc3MgYyA9fiAlcntbIC0vOi1+XX0KKyAgICAgICAgIlxcI3tjfSIKKyAgICAgIGVuZAorCisgICAgICAjIENyZWF0ZXMgYSBSZWdleHAgZnJvbSBhIHBsYWluIHRleHQgc3RyaW5nLAorICAgICAgIyBlc2NhcGluZyBhbGwgc2lnbmlmaWNhbnQgY2hhcmFjdGVycy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHN0ciBbU3RyaW5nXSBUaGUgdGV4dCBvZiB0aGUgcmVnZXhwCisgICAgICAjIEBwYXJhbSBmbGFncyBbSW50ZWdlcl0gRmxhZ3MgZm9yIHRoZSBjcmVhdGVkIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgIyBAcmV0dXJuIFtSZWdleHBdCisgICAgICAjIEBwcml2YXRlCisgICAgICBkZWYgc2VsZi5xdW90ZShzdHIsIGZsYWdzID0gMCkKKyAgICAgICAgUmVnZXhwLm5ldyhSZWdleHAucXVvdGUoc3RyKSwgZmxhZ3MpCisgICAgICBlbmQKKworICAgICAgSCAgICAgICAgPSAvWzAtOWEtZkEtRl0vCisgICAgICBOTCAgICAgICA9IC9cbnxcclxufFxyfFxmLworICAgICAgVU5JQ09ERSAgPSAvXFwje0h9ezEsNn1bIFx0XHJcblxmXT8vCisgICAgICBzID0gJ1x1ezgwfS1cdXtEN0ZGfVx1e0UwMDB9LVx1e0ZGRkR9XHV7MTAwMDB9LVx1ezEwRkZGRn0nCisgICAgICBOT05BU0NJSSA9IC9bI3tzfV0vCisgICAgICBFU0NBUEUgICA9IC8je1VOSUNPREV9fFxcWyAtfiN7c31dLworICAgICAgTk1TVEFSVCAgPSAvW19hLXpBLVpdfCN7Tk9OQVNDSUl9fCN7RVNDQVBFfS8KKyAgICAgIE5NQ0hBUiAgID0gL1thLXpBLVowLTlfLV18I3tOT05BU0NJSX18I3tFU0NBUEV9LworICAgICAgU1RSSU5HMSAgPSAvXCIoKD86W15cblxyXGZcXCJdfFxcI3tOTH18I3tFU0NBUEV9KSopXCIvCisgICAgICBTVFJJTkcyICA9IC9cJygoPzpbXlxuXHJcZlxcJ118XFwje05MfXwje0VTQ0FQRX0pKilcJy8KKworICAgICAgSURFTlQgICAgPSAvLSoje05NU1RBUlR9I3tOTUNIQVJ9Ki8KKyAgICAgIE5BTUUgICAgID0gLyN7Tk1DSEFSfSsvCisgICAgICBTVFJJTkcgICA9IC8je1NUUklORzF9fCN7U1RSSU5HMn0vCisgICAgICBVUkxDSEFSICA9IC9bIyUmKi1+XXwje05PTkFTQ0lJfXwje0VTQ0FQRX0vCisgICAgICBVUkwgICAgICA9IC8oI3tVUkxDSEFSfSopLworICAgICAgVyAgICAgICAgPSAvWyBcdFxyXG5cZl0qLworICAgICAgVkFSSUFCTEUgPSAvKFwkKSgje1Nhc3M6OlNDU1M6OlJYOjpJREVOVH0pLworCisgICAgICAjIFRoaXMgaXMgbW9yZSBsaWJlcmFsIHRoYW4gdGhlIHNwZWMncyBkZWZpbml0aW9uLAorICAgICAgIyBidXQgdGhhdCBkZWZpbml0aW9uIGRpZG4ndCB3b3JrIHdlbGwgd2l0aCB0aGUgZ3JlZWRpbmVzcyBydWxlcworICAgICAgUkFOR0UgICAgPSAvKD86I3tIfXxcPyl7MSw2fS8KKworICAgICAgIyMKKworICAgICAgUyA9IC9bIFx0XHJcblxmXSsvCisKKyAgICAgIENPTU1FTlQgPSAlcnsvXCooW14qXXxcKitbXi8qXSkqXCoqXCovfQorICAgICAgU0lOR0xFX0xJTkVfQ09NTUVOVCA9ICVyey8vLiooXG5bIFx0XSovLy4qKSp9CisKKyAgICAgIENETyAgICAgICAgICAgID0gcXVvdGUoIjwhLS0iKQorICAgICAgQ0RDICAgICAgICAgICAgPSBxdW90ZSgiLS0+IikKKyAgICAgIElOQ0xVREVTICAgICAgID0gcXVvdGUoIn49IikKKyAgICAgIERBU0hNQVRDSCAgICAgID0gcXVvdGUoInw9IikKKyAgICAgIFBSRUZJWE1BVENIICAgID0gcXVvdGUoIl49IikKKyAgICAgIFNVRkZJWE1BVENIICAgID0gcXVvdGUoIiQ9IikKKyAgICAgIFNVQlNUUklOR01BVENIID0gcXVvdGUoIio9IikKKworICAgICAgSEFTSCA9IC8jI3tOQU1FfS8KKworICAgICAgSU1QT1JUQU5UID0gLyEje1d9aW1wb3J0YW50L2kKKworICAgICAgIyBBIHVuaXQgaXMgbGlrZSBhbiBJREVOVCwgYnV0IGRpc2FsbG93cyBhIGh5cGhlbiBmb2xsb3dlZCBieSBhIGRpZ2l0LgorICAgICAgIyBUaGlzIGFsbG93cyAiMXB4LTJweCIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgc3VidHJhY3Rpb24gcmF0aGVyIHRoYW4gIjEiCisgICAgICAjIHdpdGggdGhlIHVuaXQgInB4LTJweCIuIEl0IGFsc28gYWxsb3dzICIlIi4KKyAgICAgIFVOSVQgPSAvLT8je05NU1RBUlR9KD86W2EtekEtWjAtOV9dfCN7Tk9OQVNDSUl9fCN7RVNDQVBFfXwtKD8hXC4/XGQpKSp8JS8KKworICAgICAgVU5JVExFU1NfTlVNQkVSID0gLyg/OlswLTldK3xbMC05XSpcLlswLTldKykoPzpbZUVdWystXT9cZCspPy8KKyAgICAgIE5VTUJFUiA9IC8je1VOSVRMRVNTX05VTUJFUn0oPzoje1VOSVR9KT8vCisgICAgICBQRVJDRU5UQUdFID0gLyN7VU5JVExFU1NfTlVNQkVSfSUvCisKKyAgICAgIFVSSSA9IC91cmxcKCN7V30oPzoje1NUUklOR318I3tVUkx9KSN7V31cKS9pCisgICAgICBGVU5DVElPTiA9IC8je0lERU5UfVwoLworCisgICAgICBVTklDT0RFUkFOR0UgPSAvdVwrKD86I3tIfXsxLDZ9LSN7SH17MSw2fXwje1JBTkdFfSkvaQorCisgICAgICAjIERlZmluZWQgaW4gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI2xleAorICAgICAgUExVUyA9IC8je1d9XCsvCisgICAgICBHUkVBVEVSID0gLyN7V30+LworICAgICAgVElMREUgPSAvI3tXfX4vCisgICAgICBOT1QgPSBxdW90ZSgiOm5vdCgiLCBSZWdleHA6OklHTk9SRUNBU0UpCisKKyAgICAgICMgRGVmaW5lZCBpbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9DU1MvQC1tb3otZG9jdW1lbnQgYXMgYQorICAgICAgIyBub24tc3RhbmRhcmQgdmVyc2lvbiBvZiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbmRpdGlvbmFsLworICAgICAgVVJMX1BSRUZJWCA9IC91cmwtcHJlZml4XCgje1d9KD86I3tTVFJJTkd9fCN7VVJMfSkje1d9XCkvaQorICAgICAgRE9NQUlOID0gL2RvbWFpblwoI3tXfSg/OiN7U1RSSU5HfXwje1VSTH0pI3tXfVwpL2kKKworICAgICAgIyBDdXN0b20KKyAgICAgIEhFWENPTE9SID0gL1wjWzAtOWEtZkEtRl0rLworICAgICAgSU5URVJQX1NUQVJUID0gLyNcey8KKyAgICAgIEFOWSA9IC86KC1bLVx3XSstKT9hbnlcKC9pCisgICAgICBPUFRJT05BTCA9IC8hI3tXfW9wdGlvbmFsL2kKKyAgICAgIElERU5UX1NUQVJUID0gLy18I3tOTVNUQVJUfS8KKworICAgICAgSURFTlRfSFlQSEVOX0lOVEVSUCA9IC8tKD89I1x7KS8KKyAgICAgIFNUUklORzFfTk9JTlRFUlAgPSAvXCIoKD86W15cblxyXGZcXCIjXXwjKD8hXHspfCN7RVNDQVBFfSkqKVwiLworICAgICAgU1RSSU5HMl9OT0lOVEVSUCA9IC9cJygoPzpbXlxuXHJcZlxcJyNdfCMoPyFceyl8I3tFU0NBUEV9KSopXCcvCisgICAgICBTVFJJTkdfTk9JTlRFUlAgPSAvI3tTVFJJTkcxX05PSU5URVJQfXwje1NUUklORzJfTk9JTlRFUlB9LworCisgICAgICBTVEFUSUNfQ09NUE9ORU5UID0gLyN7SURFTlR9fCN7U1RSSU5HX05PSU5URVJQfXwje0hFWENPTE9SfXxbKy1dPyN7TlVNQkVSfXxcIWltcG9ydGFudC9pCisgICAgICBTVEFUSUNfVkFMVUUgPSAlcigje1NUQVRJQ19DT01QT05FTlR9KFxzKltccyxcL11ccyoje1NUQVRJQ19DT01QT05FTlR9KSooPz1bO31dKSlpCisgICAgICBTVEFUSUNfU0VMRUNUT1IgPSAvKCN7Tk1DSEFSfXxbIFx0XXxbLD4rKl18WzojLl0je05NU1RBUlR9KXsxLDUwfShbe10pL2kKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2Nzcy9zdGF0aWNfcGFyc2VyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zY3NzL3N0YXRpY19wYXJzZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllMjc5NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2Nzcy9zdGF0aWNfcGFyc2VyLnJiCkBAIC0wLDAgKzEsMzU0IEBACityZXF1aXJlICdzYXNzL3NjcmlwdC9jc3NfcGFyc2VyJworCittb2R1bGUgU2FzcworICBtb2R1bGUgU0NTUworICAgICMgQSBwYXJzZXIgZm9yIGEgc3RhdGljIFNDU1MgdHJlZS4KKyAgICAjIFBhcnNlcyB3aXRoIFNDU1MgZXh0ZW5zaW9ucywgbGlrZSBuZXN0ZWQgcnVsZXMgYW5kIHBhcmVudCBzZWxlY3RvcnMsCisgICAgIyBidXQgd2l0aG91dCBkeW5hbWljIFNhc3NTY3JpcHQuCisgICAgIyBUaGlzIGlzIHVzZWZ1bCBmb3IgZS5nLiBceyNwYXJzZVxfc2VsZWN0b3IgcGFyc2luZyBzZWxlY3RvcnN9CisgICAgIyBhZnRlciByZXNvbHZpbmcgdGhlIGludGVycG9sYXRpb24uCisgICAgY2xhc3MgU3RhdGljUGFyc2VyIDwgUGFyc2VyCisgICAgICAjIFBhcnNlcyB0aGUgdGV4dCBhcyBhIHNlbGVjdG9yLgorICAgICAgIworICAgICAgIyBAcGFyYW0gZmlsZW5hbWUgW1N0cmluZywgbmlsXSBUaGUgZmlsZSBpbiB3aGljaCB0aGUgc2VsZWN0b3IgYXBwZWFycywKKyAgICAgICMgICBvciBuaWwgaWYgdGhlcmUgaXMgbm8gc3VjaCBmaWxlLgorICAgICAgIyAgIFVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KKyAgICAgICMgQHJldHVybiBbU2VsZWN0b3I6OkNvbW1hU2VxdWVuY2VdIFRoZSBwYXJzZWQgc2VsZWN0b3IKKyAgICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgdGhlcmUncyBhIHN5bnRheCBlcnJvciBpbiB0aGUgc2VsZWN0b3IKKyAgICAgIGRlZiBwYXJzZV9zZWxlY3RvcgorICAgICAgICBpbml0X3NjYW5uZXIhCisgICAgICAgIHNlcSA9IGV4cHIhKDpzZWxlY3Rvcl9jb21tYV9zZXF1ZW5jZSkKKyAgICAgICAgZXhwZWN0ZWQoInNlbGVjdG9yIikgdW5sZXNzIEBzY2FubmVyLmVvcz8KKyAgICAgICAgc2VxLmxpbmUgPSBAbGluZQorICAgICAgICBzZXEuZmlsZW5hbWUgPSBAZmlsZW5hbWUKKyAgICAgICAgc2VxCisgICAgICBlbmQKKworICAgICAgIyBQYXJzZXMgYSBzdGF0aWMgYXQtcm9vdCBxdWVyeS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbKFN5bWJvbCwgQXJyYXk8U3RyaW5nPildIFRoZSB0eXBlIG9mIHRoZSBxdWVyeQorICAgICAgIyAgIChgOndpdGhgIG9yIGA6d2l0aG91dGApIGFuZCB0aGUgdmFsdWVzIHRoYXQgYXJlIGJlaW5nIGZpbHRlcmVkLgorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGVyZSdzIGEgc3ludGF4IGVycm9yIGluIHRoZSBxdWVyeSwKKyAgICAgICMgICBvciBpZiBpdCBkb2Vzbid0IHRha2UgdXAgdGhlIGVudGlyZSBpbnB1dCBzdHJpbmcuCisgICAgICBkZWYgcGFyc2Vfc3RhdGljX2F0X3Jvb3RfcXVlcnkKKyAgICAgICAgaW5pdF9zY2FubmVyIQorICAgICAgICB0b2shKC9cKC8pOyBzcworICAgICAgICB0eXBlID0gdG9rISgvXGIod2l0aG91dHx3aXRoKVxiLykudG9fc3ltOyBzcworICAgICAgICB0b2shKC86Lyk7IHNzCisgICAgICAgIGRpcmVjdGl2ZXMgPSBleHByISg6YXRfcm9vdF9kaXJlY3RpdmVfbGlzdCk7IHNzCisgICAgICAgIHRvayEoL1wpLykKKyAgICAgICAgZXhwZWN0ZWQoIkBhdC1yb290IHF1ZXJ5IGxpc3QiKSB1bmxlc3MgQHNjYW5uZXIuZW9zPworICAgICAgICByZXR1cm4gdHlwZSwgZGlyZWN0aXZlcworICAgICAgZW5kCisKKyAgICAgIGRlZiBwYXJzZV9rZXlmcmFtZXNfc2VsZWN0b3IKKyAgICAgICAgaW5pdF9zY2FubmVyIQorICAgICAgICBzZWwgPSBleHByISg6a2V5ZnJhbWVzX3NlbGVjdG9yKQorICAgICAgICBleHBlY3RlZCgia2V5ZnJhbWVzIHNlbGVjdG9yIikgdW5sZXNzIEBzY2FubmVyLmVvcz8KKyAgICAgICAgc2VsCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIFBhcnNlciNpbml0aWFsaXplCisgICAgICAjIEBwYXJhbSBhbGxvd19wYXJlbnRfcmVmIFtCb29sZWFuXSBXaGV0aGVyIHRvIGFsbG93IHRoZQorICAgICAgIyAgIHBhcmVudC1yZWZlcmVuY2Ugc2VsZWN0b3IsIGAmYCwgd2hlbiBwYXJzaW5nIHRoZSBkb2N1bWVudC4KKyAgICAgICMgQGNvbW1lbnQKKyAgICAgICMgICBydWJvY29wOmRpc2FibGUgUGFyYW1ldGVyTGlzdHMKKyAgICAgIGRlZiBpbml0aWFsaXplKHN0ciwgZmlsZW5hbWUsIGltcG9ydGVyLCBsaW5lID0gMSwgb2Zmc2V0ID0gMSwgYWxsb3dfcGFyZW50X3JlZiA9IHRydWUpCisgICAgICAgICMgcnVib2NvcDplbmFibGUgUGFyYW1ldGVyTGlzdHMKKyAgICAgICAgc3VwZXIoc3RyLCBmaWxlbmFtZSwgaW1wb3J0ZXIsIGxpbmUsIG9mZnNldCkKKyAgICAgICAgQGFsbG93X3BhcmVudF9yZWYgPSBhbGxvd19wYXJlbnRfcmVmCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBkZWYgbW96X2RvY3VtZW50X2Z1bmN0aW9uCisgICAgICAgIHZhbCA9IHRvayhVUkkpIHx8IHRvayhVUkxfUFJFRklYKSB8fCB0b2soRE9NQUlOKSB8fCBmdW5jdGlvbihmYWxzZSkKKyAgICAgICAgcmV0dXJuIHVubGVzcyB2YWwKKyAgICAgICAgc3MKKyAgICAgICAgW3ZhbF0KKyAgICAgIGVuZAorCisgICAgICBkZWYgdmFyaWFibGU7IG5pbDsgZW5kCisgICAgICBkZWYgc2NyaXB0X3ZhbHVlOyBuaWw7IGVuZAorICAgICAgZGVmIGludGVycG9sYXRpb24od2Fybl9mb3JfY29sb3IgPSBmYWxzZSk7IG5pbDsgZW5kCisgICAgICBkZWYgdmFyX2V4cHI7IG5pbDsgZW5kCisgICAgICBkZWYgaW50ZXJwX3N0cmluZzsgKHMgPSB0b2soU1RSSU5HKSkgJiYgW3NdOyBlbmQKKyAgICAgIGRlZiBpbnRlcnBfdXJpOyAocyA9IHRvayhVUkkpKSAmJiBbc107IGVuZAorICAgICAgZGVmIGludGVycF9pZGVudChpZGVudCA9IElERU5UKTsgKHMgPSB0b2soaWRlbnQpKSAmJiBbc107IGVuZAorICAgICAgZGVmIHVzZV9jc3NfaW1wb3J0PzsgdHJ1ZTsgZW5kCisKKyAgICAgIGRlZiBzcGVjaWFsX2RpcmVjdGl2ZShuYW1lLCBzdGFydF9wb3MpCisgICAgICAgIHJldHVybiB1bmxlc3MgJXcobWVkaWEgaW1wb3J0IGNoYXJzZXQgLW1vei1kb2N1bWVudCkuaW5jbHVkZT8obmFtZSkKKyAgICAgICAgc3VwZXIKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZWN0b3JfY29tbWFfc2VxdWVuY2UKKyAgICAgICAgc2VsID0gc2VsZWN0b3IKKyAgICAgICAgcmV0dXJuIHVubGVzcyBzZWwKKyAgICAgICAgc2VsZWN0b3JzID0gW3NlbF0KKyAgICAgICAgd3MgPSAnJworICAgICAgICB3aGlsZSB0b2soLywvKQorICAgICAgICAgIHdzIDw8IHN0ciB7c3N9CisgICAgICAgICAgbmV4dCB1bmxlc3MgKHNlbCA9IHNlbGVjdG9yKQorICAgICAgICAgIHNlbGVjdG9ycyA8PCBzZWwKKyAgICAgICAgICBpZiB3cy5pbmNsdWRlPygiXG4iKQorICAgICAgICAgICAgc2VsZWN0b3JzWy0xXSA9IFNlbGVjdG9yOjpTZXF1ZW5jZS5uZXcoWyJcbiJdICsgc2VsZWN0b3JzLmxhc3QubWVtYmVycykKKyAgICAgICAgICBlbmQKKyAgICAgICAgICB3cyA9ICcnCisgICAgICAgIGVuZAorICAgICAgICBTZWxlY3Rvcjo6Q29tbWFTZXF1ZW5jZS5uZXcoc2VsZWN0b3JzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxlY3Rvcl9zdHJpbmcKKyAgICAgICAgc2VsID0gc2VsZWN0b3IKKyAgICAgICAgcmV0dXJuIHVubGVzcyBzZWwKKyAgICAgICAgc2VsLnRvX3MKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZWN0b3IKKyAgICAgICAgc3RhcnRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgICMgVGhlIGNvbWJpbmF0b3IgaGVyZSBhbGxvd3MgdGhlICI+IEUiIGhhY2sKKyAgICAgICAgdmFsID0gY29tYmluYXRvciB8fCBzaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UKKyAgICAgICAgcmV0dXJuIHVubGVzcyB2YWwKKyAgICAgICAgbmwgPSBzdHIge3NzfS5pbmNsdWRlPygiXG4iKQorICAgICAgICByZXMgPSBbXQorICAgICAgICByZXMgPDwgdmFsCisgICAgICAgIHJlcyA8PCAiXG4iIGlmIG5sCisKKyAgICAgICAgd2hpbGUgKHZhbCA9IGNvbWJpbmF0b3IgfHwgc2ltcGxlX3NlbGVjdG9yX3NlcXVlbmNlKQorICAgICAgICAgIHJlcyA8PCB2YWwKKyAgICAgICAgICByZXMgPDwgIlxuIiBpZiBzdHIge3NzfS5pbmNsdWRlPygiXG4iKQorICAgICAgICBlbmQKKyAgICAgICAgc2VxID0gU2VsZWN0b3I6OlNlcXVlbmNlLm5ldyhyZXMuY29tcGFjdCkKKworICAgICAgICBpZiBzZXEubWVtYmVycy5hbnk/IHt8c3NlcXwgc3NlcS5pc19hPyhTZWxlY3Rvcjo6U2ltcGxlU2VxdWVuY2UpICYmIHNzZXEuc3ViamVjdD99CisgICAgICAgICAgbG9jYXRpb24gPSAiIG9mICN7QGZpbGVuYW1lfSIgaWYgQGZpbGVuYW1lCisgICAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gPDxNRVNTQUdFCitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgI3tzdGFydF9wb3MubGluZX0sIGNvbHVtbiAje3N0YXJ0X3Bvcy5vZmZzZXR9I3tsb2NhdGlvbn06CitUaGUgc3ViamVjdCBzZWxlY3RvciBvcGVyYXRvciAiISIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCitUaGlzIG9wZXJhdG9yIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICI6aGFzKCkiIGluIHRoZSBDU1Mgc3BlYy4KK0ZvciBleGFtcGxlOiAje3NlcS5zdWJqZWN0bGVzc30KK01FU1NBR0UKKyAgICAgICAgZW5kCisKKyAgICAgICAgc2VxCisgICAgICBlbmQKKworICAgICAgZGVmIGNvbWJpbmF0b3IKKyAgICAgICAgdG9rKFBMVVMpIHx8IHRvayhHUkVBVEVSKSB8fCB0b2soVElMREUpIHx8IHJlZmVyZW5jZV9jb21iaW5hdG9yCisgICAgICBlbmQKKworICAgICAgZGVmIHJlZmVyZW5jZV9jb21iaW5hdG9yCisgICAgICAgIHJldHVybiB1bmxlc3MgdG9rKCVyey99KQorICAgICAgICByZXMgPSAnLycKKyAgICAgICAgbnMsIG5hbWUgPSBleHByISg6cXVhbGlmaWVkX25hbWUpCisgICAgICAgIHJlcyA8PCBucyA8PCAnfCcgaWYgbnMKKyAgICAgICAgcmVzIDw8IG5hbWUgPDwgdG9rISglcnsvfSkKKworICAgICAgICBsb2NhdGlvbiA9ICIgb2YgI3tAZmlsZW5hbWV9IiBpZiBAZmlsZW5hbWUKKyAgICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gPDxNRVNTQUdFCitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgI3tAbGluZX0sIGNvbHVtbiAje0BvZmZzZXR9I3tsb2NhdGlvbn06CitUaGUgcmVmZXJlbmNlIGNvbWJpbmF0b3IgI3tyZXN9IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorTUVTU0FHRQorCisgICAgICAgIHJlcworICAgICAgZW5kCisKKyAgICAgIGRlZiBzaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2UKKyAgICAgICAgc3RhcnRfcG9zID0gc291cmNlX3Bvc2l0aW9uCisgICAgICAgIGUgPSBlbGVtZW50X25hbWUgfHwgaWRfc2VsZWN0b3IgfHwgY2xhc3Nfc2VsZWN0b3IgfHwgcGxhY2Vob2xkZXJfc2VsZWN0b3IgfHwgYXR0cmliIHx8CisgICAgICAgICAgICBwc2V1ZG8gfHwgcGFyZW50X3NlbGVjdG9yCisgICAgICAgIHJldHVybiB1bmxlc3MgZQorICAgICAgICByZXMgPSBbZV0KKworICAgICAgICAjIFRoZSB0b2soL1wqLykgYWxsb3dzIHRoZSAiRSoiIGhhY2sKKyAgICAgICAgd2hpbGUgKHYgPSBpZF9zZWxlY3RvciB8fCBjbGFzc19zZWxlY3RvciB8fCBwbGFjZWhvbGRlcl9zZWxlY3RvciB8fAorICAgICAgICAgICAgICAgICAgIGF0dHJpYiB8fCBwc2V1ZG8gfHwgKHRvaygvXCovKSAmJiBTZWxlY3Rvcjo6VW5pdmVyc2FsLm5ldyhuaWwpKSkKKyAgICAgICAgICByZXMgPDwgdgorICAgICAgICBlbmQKKworICAgICAgICBwb3MgPSBAc2Nhbm5lci5wb3MKKyAgICAgICAgbGluZSA9IEBsaW5lCisgICAgICAgIGlmIChzZWwgPSBzdHI/IHtzaW1wbGVfc2VsZWN0b3Jfc2VxdWVuY2V9KQorICAgICAgICAgIEBzY2FubmVyLnBvcyA9IHBvcworICAgICAgICAgIEBsaW5lID0gbGluZQorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAjIElmIHdlIHNlZSAiKkUiLCBkb24ndCBmb3JjZSBhIHRocm93IGJlY2F1c2UgdGhpcyBjb3VsZCBiZSB0aGUKKyAgICAgICAgICAgICMgIipwcm9wOiB2YWwiIGhhY2suCisgICAgICAgICAgICBleHBlY3RlZCgnInsiJykgaWYgcmVzLmxlbmd0aCA9PSAxICYmIHJlc1swXS5pc19hPyhTZWxlY3Rvcjo6VW5pdmVyc2FsKQorICAgICAgICAgICAgdGhyb3dfZXJyb3Ige2V4cGVjdGVkKCcieyInKX0KKyAgICAgICAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgICAgICAgICAgZS5tZXNzYWdlIDw8ICJcblxuXCIje3NlbH1cIiBtYXkgb25seSBiZSB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wb3VuZCBzZWxlY3Rvci4iCisgICAgICAgICAgICByYWlzZSBlCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIFNlbGVjdG9yOjpTaW1wbGVTZXF1ZW5jZS5uZXcocmVzLCB0b2soLyEvKSwgcmFuZ2Uoc3RhcnRfcG9zKSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgcGFyZW50X3NlbGVjdG9yCisgICAgICAgIHJldHVybiB1bmxlc3MgQGFsbG93X3BhcmVudF9yZWYgJiYgdG9rKC8mLykKKyAgICAgICAgU2VsZWN0b3I6OlBhcmVudC5uZXcodG9rKE5BTUUpKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjbGFzc19zZWxlY3RvcgorICAgICAgICByZXR1cm4gdW5sZXNzIHRvaygvXC4vKQorICAgICAgICBAZXhwZWN0ZWQgPSAiY2xhc3MgbmFtZSIKKyAgICAgICAgU2VsZWN0b3I6OkNsYXNzLm5ldyh0b2shKElERU5UKSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgaWRfc2VsZWN0b3IKKyAgICAgICAgcmV0dXJuIHVubGVzcyB0b2soLyMoPyFceykvKQorICAgICAgICBAZXhwZWN0ZWQgPSAiaWQgbmFtZSIKKyAgICAgICAgU2VsZWN0b3I6OklkLm5ldyh0b2shKE5BTUUpKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBwbGFjZWhvbGRlcl9zZWxlY3RvcgorICAgICAgICByZXR1cm4gdW5sZXNzIHRvaygvJS8pCisgICAgICAgIEBleHBlY3RlZCA9ICJwbGFjZWhvbGRlciBuYW1lIgorICAgICAgICBTZWxlY3Rvcjo6UGxhY2Vob2xkZXIubmV3KHRvayEoSURFTlQpKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBlbGVtZW50X25hbWUKKyAgICAgICAgbnMsIG5hbWUgPSBTYXNzOjpVdGlsLmRlc3RydWN0dXJlKHF1YWxpZmllZF9uYW1lKDphbGxvd19zdGFyX25hbWUpKQorICAgICAgICByZXR1cm4gdW5sZXNzIG5zIHx8IG5hbWUKKworICAgICAgICBpZiBuYW1lID09ICcqJworICAgICAgICAgIFNlbGVjdG9yOjpVbml2ZXJzYWwubmV3KG5zKQorICAgICAgICBlbHNlCisgICAgICAgICAgU2VsZWN0b3I6OkVsZW1lbnQubmV3KG5hbWUsIG5zKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgcXVhbGlmaWVkX25hbWUoYWxsb3dfc3Rhcl9uYW1lID0gZmFsc2UpCisgICAgICAgIG5hbWUgPSB0b2soSURFTlQpIHx8IHRvaygvXCovKSB8fCAodG9rPygvXHwvKSAmJiAiIikKKyAgICAgICAgcmV0dXJuIHVubGVzcyBuYW1lCisgICAgICAgIHJldHVybiBuaWwsIG5hbWUgdW5sZXNzIHRvaygvXHwvKQorCisgICAgICAgIHJldHVybiBuYW1lLCB0b2shKElERU5UKSB1bmxlc3MgYWxsb3dfc3Rhcl9uYW1lCisgICAgICAgIEBleHBlY3RlZCA9ICJpZGVudGlmaWVyIG9yICoiCisgICAgICAgIHJldHVybiBuYW1lLCB0b2soSURFTlQpIHx8IHRvayEoL1wqLykKKyAgICAgIGVuZAorCisgICAgICBkZWYgYXR0cmliCisgICAgICAgIHJldHVybiB1bmxlc3MgdG9rKC9cWy8pCisgICAgICAgIHNzCisgICAgICAgIG5zLCBuYW1lID0gYXR0cmliX25hbWUhCisgICAgICAgIHNzCisKKyAgICAgICAgb3AgPSB0b2soLz0vKSB8fAorICAgICAgICAgICAgIHRvayhJTkNMVURFUykgfHwKKyAgICAgICAgICAgICB0b2soREFTSE1BVENIKSB8fAorICAgICAgICAgICAgIHRvayhQUkVGSVhNQVRDSCkgfHwKKyAgICAgICAgICAgICB0b2soU1VGRklYTUFUQ0gpIHx8CisgICAgICAgICAgICAgdG9rKFNVQlNUUklOR01BVENIKQorICAgICAgICBpZiBvcAorICAgICAgICAgIEBleHBlY3RlZCA9ICJpZGVudGlmaWVyIG9yIHN0cmluZyIKKyAgICAgICAgICBzcworICAgICAgICAgIHZhbCA9IHRvayhJREVOVCkgfHwgdG9rIShTVFJJTkcpCisgICAgICAgICAgc3MKKyAgICAgICAgZW5kCisgICAgICAgIGZsYWdzID0gdG9rKElERU5UKSB8fCB0b2soU1RSSU5HKQorICAgICAgICB0b2shKC9cXS8pCisKKyAgICAgICAgU2VsZWN0b3I6OkF0dHJpYnV0ZS5uZXcobmFtZSwgbnMsIG9wLCB2YWwsIGZsYWdzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBhdHRyaWJfbmFtZSEKKyAgICAgICAgaWYgKG5hbWVfb3JfbnMgPSB0b2soSURFTlQpKQorICAgICAgICAgICMgRSwgRXxFCisgICAgICAgICAgaWYgdG9rKC9cfCg/IT0pLykKKyAgICAgICAgICAgIG5zID0gbmFtZV9vcl9ucworICAgICAgICAgICAgbmFtZSA9IHRvayhJREVOVCkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBuYW1lID0gbmFtZV9vcl9ucworICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgIyAqfEUgb3IgfEUKKyAgICAgICAgICBucyA9IHRvaygvXCovKSB8fCAiIgorICAgICAgICAgIHRvayEoL1x8LykKKyAgICAgICAgICBuYW1lID0gdG9rIShJREVOVCkKKyAgICAgICAgZW5kCisgICAgICAgIHJldHVybiBucywgbmFtZQorICAgICAgZW5kCisKKyAgICAgIFNFTEVDVE9SX1BTRVVET19DTEFTU0VTID0gJXcobm90IG1hdGNoZXMgY3VycmVudCBhbnkgaGFzIGhvc3QgaG9zdC1jb250ZXh0KS50b19zZXQKKworICAgICAgUFJFRklYRURfU0VMRUNUT1JfUFNFVURPX0NMQVNTRVMgPSAldyhudGgtY2hpbGQgbnRoLWxhc3QtY2hpbGQpLnRvX3NldAorCisgICAgICBTRUxFQ1RPUl9QU0VVRE9fRUxFTUVOVFMgPSAldyhzbG90dGVkKS50b19zZXQKKworICAgICAgZGVmIHBzZXVkbworICAgICAgICBzID0gdG9rKC86Oj8vKQorICAgICAgICByZXR1cm4gdW5sZXNzIHMKKyAgICAgICAgQGV4cGVjdGVkID0gInBzZXVkb2NsYXNzIG9yIHBzZXVkb2VsZW1lbnQiCisgICAgICAgIG5hbWUgPSB0b2shKElERU5UKQorICAgICAgICBpZiB0b2soL1woLykKKyAgICAgICAgICBzcworICAgICAgICAgIGRlcHJlZml4ZWQgPSBkZXByZWZpeChuYW1lKQorICAgICAgICAgIGlmIHMgPT0gJzonICYmIFNFTEVDVE9SX1BTRVVET19DTEFTU0VTLmluY2x1ZGU/KGRlcHJlZml4ZWQpCisgICAgICAgICAgICBzZWwgPSBzZWxlY3Rvcl9jb21tYV9zZXF1ZW5jZQorICAgICAgICAgIGVsc2lmIHMgPT0gJzonICYmIFBSRUZJWEVEX1NFTEVDVE9SX1BTRVVET19DTEFTU0VTLmluY2x1ZGU/KGRlcHJlZml4ZWQpCisgICAgICAgICAgICBhcmcsIHNlbCA9IHByZWZpeGVkX3NlbGVjdG9yX3BzZXVkbworICAgICAgICAgIGVsc2lmIHMgPT0gJzo6JyAmJiBTRUxFQ1RPUl9QU0VVRE9fRUxFTUVOVFMuaW5jbHVkZT8oZGVwcmVmaXhlZCkKKyAgICAgICAgICAgIHNlbCA9IHNlbGVjdG9yX2NvbW1hX3NlcXVlbmNlCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXJnID0gZXhwciEoOmRlY2xhcmF0aW9uX3ZhbHVlKS5qb2luCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICB0b2shKC9cKS8pCisgICAgICAgIGVuZAorICAgICAgICBTZWxlY3Rvcjo6UHNldWRvLm5ldyhzID09ICc6JyA/IDpjbGFzcyA6IDplbGVtZW50LCBuYW1lLCBhcmcsIHNlbCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgcHJlZml4ZWRfc2VsZWN0b3JfcHNldWRvCisgICAgICAgIHByZWZpeCA9IHN0ciBkbworICAgICAgICAgIGV4cHIgPSBzdHIge2V4cHIhKDphX25fcGx1c19iKX0KKyAgICAgICAgICBzcworICAgICAgICAgIHJldHVybiBleHByLCBuaWwgdW5sZXNzIHRvaygvb2YvKQorICAgICAgICAgIHNzCisgICAgICAgIGVuZAorICAgICAgICByZXR1cm4gcHJlZml4LCBleHByISg6c2VsZWN0b3JfY29tbWFfc2VxdWVuY2UpCisgICAgICBlbmQKKworICAgICAgZGVmIGFfbl9wbHVzX2IKKyAgICAgICAgaWYgKHBhcml0eSA9IHRvaygvZXZlbnxvZGQvaSkpCisgICAgICAgICAgcmV0dXJuIHBhcml0eQorICAgICAgICBlbmQKKworICAgICAgICBpZiB0b2soL1srLV0/WzAtOV0rLykKKyAgICAgICAgICBzcworICAgICAgICAgIHJldHVybiB0cnVlIHVubGVzcyB0b2soL24vKQorICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIHVubGVzcyB0b2soL1srLV0/bi9pKQorICAgICAgICBlbmQKKyAgICAgICAgc3MKKworICAgICAgICByZXR1cm4gdHJ1ZSB1bmxlc3MgdG9rKC9bKy1dLykKKyAgICAgICAgc3MKKyAgICAgICAgQGV4cGVjdGVkID0gIm51bWJlciIKKyAgICAgICAgdG9rISgvWzAtOV0rLykKKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBrZXlmcmFtZXNfc2VsZWN0b3IKKyAgICAgICAgc3MKKyAgICAgICAgc3RyIGRvCisgICAgICAgICAgcmV0dXJuIHVubGVzcyBrZXlmcmFtZXNfc2VsZWN0b3JfY29tcG9uZW50CisgICAgICAgICAgc3MKKyAgICAgICAgICB3aGlsZSB0b2soLywvKQorICAgICAgICAgICAgc3MKKyAgICAgICAgICAgIGV4cHIhKDprZXlmcmFtZXNfc2VsZWN0b3JfY29tcG9uZW50KQorICAgICAgICAgICAgc3MKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIGtleWZyYW1lc19zZWxlY3Rvcl9jb21wb25lbnQKKyAgICAgICAgdG9rKElERU5UKSB8fCB0b2soUEVSQ0VOVEFHRSkKKyAgICAgIGVuZAorCisgICAgICBAc2Fzc19zY3JpcHRfcGFyc2VyID0gQ2xhc3MubmV3KFNhc3M6OlNjcmlwdDo6Q3NzUGFyc2VyKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zZWxlY3Rvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2VsZWN0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjOGRlNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2VsZWN0b3IucmIKQEAgLTAsMCArMSwzMjcgQEAKK3JlcXVpcmUgJ3Nhc3Mvc2VsZWN0b3Ivc2ltcGxlJworcmVxdWlyZSAnc2Fzcy9zZWxlY3Rvci9hYnN0cmFjdF9zZXF1ZW5jZScKK3JlcXVpcmUgJ3Nhc3Mvc2VsZWN0b3IvY29tbWFfc2VxdWVuY2UnCityZXF1aXJlICdzYXNzL3NlbGVjdG9yL3BzZXVkbycKK3JlcXVpcmUgJ3Nhc3Mvc2VsZWN0b3Ivc2VxdWVuY2UnCityZXF1aXJlICdzYXNzL3NlbGVjdG9yL3NpbXBsZV9zZXF1ZW5jZScKKworbW9kdWxlIFNhc3MKKyAgIyBBIG5hbWVzcGFjZSBmb3Igbm9kZXMgaW4gdGhlIHBhcnNlIHRyZWUgZm9yIHNlbGVjdG9ycy4KKyAgIworICAjIHtDb21tYVNlcXVlbmNlfSBpcyB0aGUgdG9wbGV2ZWwgc2VsZWN0b3IsCisgICMgcmVwcmVzZW50aW5nIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIG9mIHtTZXF1ZW5jZX1zLAorICAjIHN1Y2ggYXMgYGZvbyBiYXIsIGJheiBiYW5nYC4KKyAgIyB7U2VxdWVuY2V9IGlzIHRoZSBuZXh0IGxldmVsLAorICAjIHJlcHJlc2VudGluZyB7U2ltcGxlU2VxdWVuY2V9cyBzZXBhcmF0ZWQgYnkgY29tYmluYXRvcnMgKGUuZy4gZGVzY2VuZGFudCBvciBjaGlsZCksCisgICMgc3VjaCBhcyBgZm9vIGJhcmAgb3IgYGZvbyA+IGJhciBiYXpgLgorICAjIHtTaW1wbGVTZXF1ZW5jZX0gaXMgYSBzZXF1ZW5jZSBvZiBzZWxlY3RvcnMgdGhhdCBhbGwgYXBwbHkgdG8gYSBzaW5nbGUgZWxlbWVudCwKKyAgIyBzdWNoIGFzIGBmb28uYmFyW2F0dHI9dmFsXWAuCisgICMgRmluYWxseSwge1NpbXBsZX0gaXMgdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIHNpbXBsZXN0IHNlbGVjdG9ycywKKyAgIyBzdWNoIGFzIGAuZm9vYCBvciBgI2JhcmAuCisgIG1vZHVsZSBTZWxlY3RvcgorICAgICMgVGhlIGJhc2UgdXNlZCBmb3IgY2FsY3VsYXRpbmcgc2VsZWN0b3Igc3BlY2lmaWNpdHkuIFRoZSBzcGVjIHNheXMgdGhpcworICAgICMgc2hvdWxkIGJlICJzdWZmaWNpZW50bHkgaGlnaCI7IGl0J3MgZXh0cmVtZWx5IHVubGlrZWx5IHRoYXQgYW55IHNpbmdsZQorICAgICMgc2VsZWN0b3Igc2VxdWVuY2Ugd2lsbCBjb250YWluIDEsMDAwIHNpbXBsZSBzZWxlY3RvcnMuCisgICAgU1BFQ0lGSUNJVFlfQkFTRSA9IDFfMDAwCisKKyAgICAjIEEgcGFyZW50LXJlZmVyZW5jaW5nIHNlbGVjdG9yIChgJmAgaW4gU2FzcykuCisgICAgIyBUaGUgZnVuY3Rpb24gb2YgdGhpcyBpcyB0byBiZSByZXBsYWNlZCBieSB0aGUgcGFyZW50IHNlbGVjdG9yCisgICAgIyBpbiB0aGUgbmVzdGVkIGhpZXJhcmNoeS4KKyAgICBjbGFzcyBQYXJlbnQgPCBTaW1wbGUKKyAgICAgICMgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nIHRoZSBgJmAuIGBuaWxgIGluZGljYXRlcyBubyBzdWZmaXguCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZywgbmlsXQorICAgICAgYXR0cl9yZWFkZXIgOnN1ZmZpeAorCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmcsIG5pbF0gU2VlIFx7I3N1ZmZpeH0KKyAgICAgIGRlZiBpbml0aWFsaXplKHN1ZmZpeCA9IG5pbCkKKyAgICAgICAgQHN1ZmZpeCA9IHN1ZmZpeAorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBTZWxlY3RvciN0b19zCisgICAgICBkZWYgdG9fcyhvcHRzID0ge30pCisgICAgICAgICImIiArIChAc3VmZml4IHx8ICcnKQorICAgICAgZW5kCisKKyAgICAgICMgQWx3YXlzIHJhaXNlcyBhbiBleGNlcHRpb24uCisgICAgICAjCisgICAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIFBhcmVudCBzZWxlY3RvcnMgc2hvdWxkIGJlIHJlc29sdmVkIGJlZm9yZSB1bmlmaWNhdGlvbgorICAgICAgIyBAc2VlIFNlbGVjdG9yI3VuaWZ5CisgICAgICBkZWYgdW5pZnkoc2VscykKKyAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCJbQlVHXSBDYW5ub3QgdW5pZnkgcGFyZW50IHNlbGVjdG9ycy4iKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEEgY2xhc3Mgc2VsZWN0b3IgKGUuZy4gYC5mb29gKS4KKyAgICBjbGFzcyBDbGFzcyA8IFNpbXBsZQorICAgICAgIyBUaGUgY2xhc3MgbmFtZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgYXR0cl9yZWFkZXIgOm5hbWUKKworICAgICAgIyBAcGFyYW0gbmFtZSBbU3RyaW5nXSBUaGUgY2xhc3MgbmFtZQorICAgICAgZGVmIGluaXRpYWxpemUobmFtZSkKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIFNlbGVjdG9yI3RvX3MKKyAgICAgIGRlZiB0b19zKG9wdHMgPSB7fSkKKyAgICAgICAgIi4iICsgQG5hbWUKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQWJzdHJhY3RTZXF1ZW5jZSNzcGVjaWZpY2l0eQorICAgICAgZGVmIHNwZWNpZmljaXR5CisgICAgICAgIFNQRUNJRklDSVRZX0JBU0UKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBBbiBpZCBzZWxlY3RvciAoZS5nLiBgI2Zvb2ApLgorICAgIGNsYXNzIElkIDwgU2ltcGxlCisgICAgICAjIFRoZSBpZCBuYW1lLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBhdHRyX3JlYWRlciA6bmFtZQorCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBpZCBuYW1lCisgICAgICBkZWYgaW5pdGlhbGl6ZShuYW1lKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgIGVuZAorCisgICAgICBkZWYgdW5pcXVlPworICAgICAgICB0cnVlCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIFNlbGVjdG9yI3RvX3MKKyAgICAgIGRlZiB0b19zKG9wdHMgPSB7fSkKKyAgICAgICAgIiMiICsgQG5hbWUKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgYG5pbGAgaWYgYHNlbHNgIGNvbnRhaW5zIGFuIHtJZH0gc2VsZWN0b3IKKyAgICAgICMgd2l0aCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhpcyBvbmUuCisgICAgICAjCisgICAgICAjIEBzZWUgU2VsZWN0b3IjdW5pZnkKKyAgICAgIGRlZiB1bmlmeShzZWxzKQorICAgICAgICByZXR1cm4gaWYgc2Vscy5hbnk/IHt8c2VsMnwgc2VsMi5pc19hPyhJZCkgJiYgbmFtZSAhPSBzZWwyLm5hbWV9CisgICAgICAgIHN1cGVyCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIEFic3RyYWN0U2VxdWVuY2Ujc3BlY2lmaWNpdHkKKyAgICAgIGRlZiBzcGVjaWZpY2l0eQorICAgICAgICBTUEVDSUZJQ0lUWV9CQVNFKioyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQSBwbGFjZWhvbGRlciBzZWxlY3RvciAoZS5nLiBgJWZvb2ApLgorICAgICMgVGhpcyBleGlzdHMgdG8gYmUgcmVwbGFjZWQgdmlhIGBAZXh0ZW5kYC4KKyAgICAjIFJ1bGVzZXRzIHVzaW5nIHRoaXMgc2VsZWN0b3Igd2lsbCBub3QgYmUgcHJpbnRlZCwgYnV0IGNhbiBiZSBleHRlbmRlZC4KKyAgICAjIE90aGVyd2lzZSwgdGhpcyBhY3RzIGp1c3QgbGlrZSBhIGNsYXNzIHNlbGVjdG9yLgorICAgIGNsYXNzIFBsYWNlaG9sZGVyIDwgU2ltcGxlCisgICAgICAjIFRoZSBwbGFjZWhvbGRlciBuYW1lLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBhdHRyX3JlYWRlciA6bmFtZQorCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBwbGFjZWhvbGRlciBuYW1lCisgICAgICBkZWYgaW5pdGlhbGl6ZShuYW1lKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgU2VsZWN0b3IjdG9fcworICAgICAgZGVmIHRvX3Mob3B0cyA9IHt9KQorICAgICAgICAiJSIgKyBAbmFtZQorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBBYnN0cmFjdFNlcXVlbmNlI3NwZWNpZmljaXR5CisgICAgICBkZWYgc3BlY2lmaWNpdHkKKyAgICAgICAgU1BFQ0lGSUNJVFlfQkFTRQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEEgdW5pdmVyc2FsIHNlbGVjdG9yIChgKmAgaW4gQ1NTKS4KKyAgICBjbGFzcyBVbml2ZXJzYWwgPCBTaW1wbGUKKyAgICAgICMgVGhlIHNlbGVjdG9yIG5hbWVzcGFjZS4gYG5pbGAgbWVhbnMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCBgIiJgIG1lYW5zIG5vCisgICAgICAjIG5hbWVzcGFjZSwgYCIqImAgbWVhbnMgYW55IG5hbWVzcGFjZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nLCBuaWxdCisgICAgICBhdHRyX3JlYWRlciA6bmFtZXNwYWNlCisKKyAgICAgICMgQHBhcmFtIG5hbWVzcGFjZSBbU3RyaW5nLCBuaWxdIFNlZSBceyNuYW1lc3BhY2V9CisgICAgICBkZWYgaW5pdGlhbGl6ZShuYW1lc3BhY2UpCisgICAgICAgIEBuYW1lc3BhY2UgPSBuYW1lc3BhY2UKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgU2VsZWN0b3IjdG9fcworICAgICAgZGVmIHRvX3Mob3B0cyA9IHt9KQorICAgICAgICBAbmFtZXNwYWNlID8gIiN7QG5hbWVzcGFjZX18KiIgOiAiKiIKKyAgICAgIGVuZAorCisgICAgICAjIFVuaWZpY2F0aW9uIG9mIGEgdW5pdmVyc2FsIHNlbGVjdG9yIGlzIHNvbWV3aGF0IGNvbXBsaWNhdGVkLAorICAgICAgIyBlc3BlY2lhbGx5IHdoZW4gYSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLgorICAgICAgIyBJZiB0aGVyZSBpcyBubyBuYW1lc3BhY2Ugc3BlY2lmaWVkCisgICAgICAjIG9yIGFueSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkIChuYW1lc3BhY2UgYCIqImApLAorICAgICAgIyB0aGVuIGBzZWxgIGlzIHJldHVybmVkIHdpdGhvdXQgY2hhbmdlCisgICAgICAjICh1bmxlc3MgaXQncyBlbXB0eSwgaW4gd2hpY2ggY2FzZSBgIioiYCBpcyByZXF1aXJlZCkuCisgICAgICAjCisgICAgICAjIElmIGEgbmFtZXNwYWNlIGlzIHNwZWNpZmllZAorICAgICAgIyBidXQgYHNlbGAgZG9lcyBub3Qgc3BlY2lmeSBhIG5hbWVzcGFjZSwKKyAgICAgICMgdGhlbiB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGlzIGFwcGxpZWQgdG8gYHNlbGAsCisgICAgICAjIGVpdGhlciBieSBhZGRpbmcgdGhpcyB7VW5pdmVyc2FsfSBzZWxlY3RvcgorICAgICAgIyBvciBhcHBseWluZyB0aGlzIG5hbWVzcGFjZSB0byBhbiBleGlzdGluZyB7RWxlbWVudH0gc2VsZWN0b3IuCisgICAgICAjCisgICAgICAjIElmIGJvdGggdGhpcyBzZWxlY3RvciAqYW5kKiBgc2VsYCBzcGVjaWZ5IG5hbWVzcGFjZXMsCisgICAgICAjIHRob3NlIG5hbWVzcGFjZXMgYXJlIHVuaWZpZWQgdmlhIHtTaW1wbGUjdW5pZnlfbmFtZXNwYWNlc30KKyAgICAgICMgYW5kIHRoZSB1bmlmaWVkIG5hbWVzcGFjZSBpcyB1c2VkLCBpZiBwb3NzaWJsZS4KKyAgICAgICMKKyAgICAgICMgQHRvZG8gVGhlcmUgYXJlIGxvdHMgb2YgY2FzZXMgdGhhdCB0aGlzIGRvY3VtZW50YXRpb24gc3BlY2lmaWVzOworICAgICAgIyAgIG1ha2Ugc3VyZSB3ZSB0aG9yb3VnaGx5IHRlc3QgKiphbGwgb2YgdGhlbSoqLgorICAgICAgIyBAdG9kbyBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgYSBkZWZhdWx0IG5hbWVzcGFjZSBoYXMgYmVlbiBkZWNsYXJlZAorICAgICAgIyAgIGFuZCBoYW5kbGUgbmFtZXNwYWNlLXVuc3BlY2lmaWVkIHNlbGVjdG9ycyBhY2NvcmRpbmdseS4KKyAgICAgICMgQHRvZG8gSWYgYW55IGJyYW5jaCBvZiBhIENvbW1hU2VxdWVuY2UgZW5kcyB1cCBiZWluZyBqdXN0IGAiKiJgLAorICAgICAgIyAgIHRoZW4gYWxsIG90aGVyIGJyYW5jaGVzIHNob3VsZCBiZSBlbGltaW5hdGVkCisgICAgICAjCisgICAgICAjIEBzZWUgU2VsZWN0b3IjdW5pZnkKKyAgICAgIGRlZiB1bmlmeShzZWxzKQorICAgICAgICBuYW1lID0KKyAgICAgICAgICBjYXNlIHNlbHMuZmlyc3QKKyAgICAgICAgICB3aGVuIFVuaXZlcnNhbDsgOnVuaXZlcnNhbAorICAgICAgICAgIHdoZW4gRWxlbWVudDsgc2Vscy5maXJzdC5uYW1lCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFtzZWxmXSArIHNlbHMgdW5sZXNzIG5hbWVzcGFjZS5uaWw/IHx8IG5hbWVzcGFjZSA9PSAnKicKKyAgICAgICAgICAgIHJldHVybiBzZWxzIHVubGVzcyBzZWxzLmVtcHR5PworICAgICAgICAgICAgcmV0dXJuIFtzZWxmXQorICAgICAgICAgIGVuZAorCisgICAgICAgIG5zLCBhY2NlcHQgPSB1bmlmeV9uYW1lc3BhY2VzKG5hbWVzcGFjZSwgc2Vscy5maXJzdC5uYW1lc3BhY2UpCisgICAgICAgIHJldHVybiB1bmxlc3MgYWNjZXB0CisgICAgICAgIFtuYW1lID09IDp1bml2ZXJzYWwgPyBVbml2ZXJzYWwubmV3KG5zKSA6IEVsZW1lbnQubmV3KG5hbWUsIG5zKV0gKyBzZWxzWzEuLi0xXQorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBBYnN0cmFjdFNlcXVlbmNlI3NwZWNpZmljaXR5CisgICAgICBkZWYgc3BlY2lmaWNpdHkKKyAgICAgICAgMAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEFuIGVsZW1lbnQgc2VsZWN0b3IgKGUuZy4gYGgxYCkuCisgICAgY2xhc3MgRWxlbWVudCA8IFNpbXBsZQorICAgICAgIyBUaGUgZWxlbWVudCBuYW1lLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBhdHRyX3JlYWRlciA6bmFtZQorCisgICAgICAjIFRoZSBzZWxlY3RvciBuYW1lc3BhY2UuIGBuaWxgIG1lYW5zIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgYCIiYCBtZWFucyBubworICAgICAgIyBuYW1lc3BhY2UsIGAiKiJgIG1lYW5zIGFueSBuYW1lc3BhY2UuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZywgbmlsXQorICAgICAgYXR0cl9yZWFkZXIgOm5hbWVzcGFjZQorCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBlbGVtZW50IG5hbWUKKyAgICAgICMgQHBhcmFtIG5hbWVzcGFjZSBbU3RyaW5nLCBuaWxdIFNlZSBceyNuYW1lc3BhY2V9CisgICAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBuYW1lc3BhY2UpCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgICBAbmFtZXNwYWNlID0gbmFtZXNwYWNlCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIFNlbGVjdG9yI3RvX3MKKyAgICAgIGRlZiB0b19zKG9wdHMgPSB7fSkKKyAgICAgICAgQG5hbWVzcGFjZSA/ICIje0BuYW1lc3BhY2V9fCN7QG5hbWV9IiA6IEBuYW1lCisgICAgICBlbmQKKworICAgICAgIyBVbmlmaWNhdGlvbiBvZiBhbiBlbGVtZW50IHNlbGVjdG9yIGlzIHNvbWV3aGF0IGNvbXBsaWNhdGVkLAorICAgICAgIyBlc3BlY2lhbGx5IHdoZW4gYSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLgorICAgICAgIyBGaXJzdCwgaWYgYHNlbGAgY29udGFpbnMgYW5vdGhlciB7RWxlbWVudH0gd2l0aCBhIGRpZmZlcmVudCBceyNuYW1lfSwKKyAgICAgICMgdGhlbiB0aGUgc2VsZWN0b3JzIGNhbid0IGJlIHVuaWZpZWQgYW5kIGBuaWxgIGlzIHJldHVybmVkLgorICAgICAgIworICAgICAgIyBPdGhlcndpc2UsIGlmIGBzZWxgIGRvZXNuJ3Qgc3BlY2lmeSBhIG5hbWVzcGFjZSwKKyAgICAgICMgb3IgaXQgc3BlY2lmaWVzIGFueSBuYW1lc3BhY2UgKHZpYSBgIioiYCksCisgICAgICAjIHRoZW4gaXQncyByZXR1cm5lZCB3aXRoIHRoaXMgZWxlbWVudCBzZWxlY3RvcgorICAgICAgIyAoZS5nLiBgLmZvb2AgYmVjb21lcyBgYS5mb29gIG9yIGBzdmd8YS5mb29gKS4KKyAgICAgICMgU2ltaWxhcmx5LCBpZiB0aGlzIHNlbGVjdG9yIGRvZXNuJ3Qgc3BlY2lmeSBhIG5hbWVzcGFjZSwKKyAgICAgICMgdGhlIG5hbWVzcGFjZSBmcm9tIGBzZWxgIGlzIHVzZWQuCisgICAgICAjCisgICAgICAjIElmIGJvdGggdGhpcyBzZWxlY3RvciAqYW5kKiBgc2VsYCBzcGVjaWZ5IG5hbWVzcGFjZXMsCisgICAgICAjIHRob3NlIG5hbWVzcGFjZXMgYXJlIHVuaWZpZWQgdmlhIHtTaW1wbGUjdW5pZnlfbmFtZXNwYWNlc30KKyAgICAgICMgYW5kIHRoZSB1bmlmaWVkIG5hbWVzcGFjZSBpcyB1c2VkLCBpZiBwb3NzaWJsZS4KKyAgICAgICMKKyAgICAgICMgQHRvZG8gVGhlcmUgYXJlIGxvdHMgb2YgY2FzZXMgdGhhdCB0aGlzIGRvY3VtZW50YXRpb24gc3BlY2lmaWVzOworICAgICAgIyAgIG1ha2Ugc3VyZSB3ZSB0aG9yb3VnaGx5IHRlc3QgKiphbGwgb2YgdGhlbSoqLgorICAgICAgIyBAdG9kbyBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgYSBkZWZhdWx0IG5hbWVzcGFjZSBoYXMgYmVlbiBkZWNsYXJlZAorICAgICAgIyAgIGFuZCBoYW5kbGUgbmFtZXNwYWNlLXVuc3BlY2lmaWVkIHNlbGVjdG9ycyBhY2NvcmRpbmdseS4KKyAgICAgICMKKyAgICAgICMgQHNlZSBTZWxlY3RvciN1bmlmeQorICAgICAgZGVmIHVuaWZ5KHNlbHMpCisgICAgICAgIGNhc2Ugc2Vscy5maXJzdAorICAgICAgICB3aGVuIFVuaXZlcnNhbDsKKyAgICAgICAgd2hlbiBFbGVtZW50OyByZXR1cm4gdW5sZXNzIG5hbWUgPT0gc2Vscy5maXJzdC5uYW1lCisgICAgICAgIGVsc2UgcmV0dXJuIFtzZWxmXSArIHNlbHMKKyAgICAgICAgZW5kCisKKyAgICAgICAgbnMsIGFjY2VwdCA9IHVuaWZ5X25hbWVzcGFjZXMobmFtZXNwYWNlLCBzZWxzLmZpcnN0Lm5hbWVzcGFjZSkKKyAgICAgICAgcmV0dXJuIHVubGVzcyBhY2NlcHQKKyAgICAgICAgW0VsZW1lbnQubmV3KG5hbWUsIG5zKV0gKyBzZWxzWzEuLi0xXQorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBBYnN0cmFjdFNlcXVlbmNlI3NwZWNpZmljaXR5CisgICAgICBkZWYgc3BlY2lmaWNpdHkKKyAgICAgICAgMQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEFuIGF0dHJpYnV0ZSBzZWxlY3RvciAoZS5nLiBgW2hyZWZePSJodHRwOi8vIl1gKS4KKyAgICBjbGFzcyBBdHRyaWJ1dGUgPCBTaW1wbGUKKyAgICAgICMgVGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT5dCisgICAgICBhdHRyX3JlYWRlciA6bmFtZQorCisgICAgICAjIFRoZSBhdHRyaWJ1dGUgbmFtZXNwYWNlLiBgbmlsYCBtZWFucyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIGAiImAgbWVhbnMKKyAgICAgICMgbm8gbmFtZXNwYWNlLCBgIioiYCBtZWFucyBhbnkgbmFtZXNwYWNlLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmcsIG5pbF0KKyAgICAgIGF0dHJfcmVhZGVyIDpuYW1lc3BhY2UKKworICAgICAgIyBUaGUgbWF0Y2hpbmcgb3BlcmF0b3IsIGUuZy4gYCI9ImAgb3IgYCJePSJgLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBhdHRyX3JlYWRlciA6b3BlcmF0b3IKKworICAgICAgIyBUaGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvci4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgYXR0cl9yZWFkZXIgOnZhbHVlCisKKyAgICAgICMgRmxhZ3MgZm9yIHRoZSBhdHRyaWJ1dGUgc2VsZWN0b3IgKGUuZy4gYGlgKS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgYXR0cl9yZWFkZXIgOmZsYWdzCisKKyAgICAgICMgQHBhcmFtIG5hbWUgW1N0cmluZ10gVGhlIGF0dHJpYnV0ZSBuYW1lCisgICAgICAjIEBwYXJhbSBuYW1lc3BhY2UgW1N0cmluZywgbmlsXSBTZWUgXHsjbmFtZXNwYWNlfQorICAgICAgIyBAcGFyYW0gb3BlcmF0b3IgW1N0cmluZ10gVGhlIG1hdGNoaW5nIG9wZXJhdG9yLCBlLmcuIGAiPSJgIG9yIGAiXj0iYAorICAgICAgIyBAcGFyYW0gdmFsdWUgW1N0cmluZ10gU2VlIFx7I3ZhbHVlfQorICAgICAgIyBAcGFyYW0gZmxhZ3MgW1N0cmluZ10gU2VlIFx7I2ZsYWdzfQorICAgICAgZGVmIGluaXRpYWxpemUobmFtZSwgbmFtZXNwYWNlLCBvcGVyYXRvciwgdmFsdWUsIGZsYWdzKQorICAgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgICAgQG5hbWVzcGFjZSA9IG5hbWVzcGFjZQorICAgICAgICBAb3BlcmF0b3IgPSBvcGVyYXRvcgorICAgICAgICBAdmFsdWUgPSB2YWx1ZQorICAgICAgICBAZmxhZ3MgPSBmbGFncworICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBTZWxlY3RvciN0b19zCisgICAgICBkZWYgdG9fcyhvcHRzID0ge30pCisgICAgICAgIHJlcyA9ICJbIgorICAgICAgICByZXMgPDwgQG5hbWVzcGFjZSA8PCAifCIgaWYgQG5hbWVzcGFjZQorICAgICAgICByZXMgPDwgQG5hbWUKKyAgICAgICAgcmVzIDw8IEBvcGVyYXRvciA8PCBAdmFsdWUgaWYgQHZhbHVlCisgICAgICAgIHJlcyA8PCAiICIgPDwgQGZsYWdzIGlmIEBmbGFncworICAgICAgICByZXMgPDwgIl0iCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIEFic3RyYWN0U2VxdWVuY2Ujc3BlY2lmaWNpdHkKKyAgICAgIGRlZiBzcGVjaWZpY2l0eQorICAgICAgICBTUEVDSUZJQ0lUWV9CQVNFCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2VsZWN0b3IvYWJzdHJhY3Rfc2VxdWVuY2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NlbGVjdG9yL2Fic3RyYWN0X3NlcXVlbmNlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTY3YTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NlbGVjdG9yL2Fic3RyYWN0X3NlcXVlbmNlLnJiCkBAIC0wLDAgKzEsMTEyIEBACittb2R1bGUgU2FzcworICBtb2R1bGUgU2VsZWN0b3IKKyAgICAjIFRoZSBhYnN0cmFjdCBwYXJlbnQgY2xhc3Mgb2YgdGhlIHZhcmlvdXMgc2VsZWN0b3Igc2VxdWVuY2UgY2xhc3Nlcy4KKyAgICAjCisgICAgIyBBbGwgc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IGEgYG1lbWJlcnNgIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gYXJyYXkKKyAgICAjIG9mIG9iamVjdCB0aGF0IHJlc3BvbmQgdG8gYCNsaW5lPWAgYW5kIGAjZmlsZW5hbWU9YCwgYXMgd2VsbCBhcyBhIGB0b19zYAorICAgICMgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWxlY3Rvci4KKyAgICBjbGFzcyBBYnN0cmFjdFNlcXVlbmNlCisgICAgICAjIFRoZSBsaW5lIG9mIHRoZSBTYXNzIHRlbXBsYXRlIG9uIHdoaWNoIHRoaXMgc2VsZWN0b3Igd2FzIGRlY2xhcmVkLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgICAgYXR0cl9yZWFkZXIgOmxpbmUKKworICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGlzIHNlbGVjdG9yIHdhcyBkZWNsYXJlZC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nLCBuaWxdCisgICAgICBhdHRyX3JlYWRlciA6ZmlsZW5hbWUKKworICAgICAgIyBTZXRzIHRoZSBsaW5lIG9mIHRoZSBTYXNzIHRlbXBsYXRlIG9uIHdoaWNoIHRoaXMgc2VsZWN0b3Igd2FzIGRlY2xhcmVkLgorICAgICAgIyBUaGlzIGFsc28gc2V0cyB0aGUgbGluZSBmb3IgYWxsIGNoaWxkIHNlbGVjdG9ycy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGxpbmUgW0ludGVnZXJdCisgICAgICAjIEByZXR1cm4gW0ludGVnZXJdCisgICAgICBkZWYgbGluZT0obGluZSkKKyAgICAgICAgbWVtYmVycy5lYWNoIHt8bXwgbS5saW5lID0gbGluZX0KKyAgICAgICAgQGxpbmUgPSBsaW5lCisgICAgICBlbmQKKworICAgICAgIyBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoaXMgc2VsZWN0b3Igd2FzIGRlY2xhcmVkLAorICAgICAgIyBvciBgbmlsYCBpZiBpdCB3YXMgbm90IGRlY2xhcmVkIGluIGEgZmlsZSAoZS5nLiBvbiBzdGRpbikuCisgICAgICAjIFRoaXMgYWxzbyBzZXRzIHRoZSBmaWxlbmFtZSBmb3IgYWxsIGNoaWxkIHNlbGVjdG9ycy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIGZpbGVuYW1lIFtTdHJpbmcsIG5pbF0KKyAgICAgICMgQHJldHVybiBbU3RyaW5nLCBuaWxdCisgICAgICBkZWYgZmlsZW5hbWU9KGZpbGVuYW1lKQorICAgICAgICBtZW1iZXJzLmVhY2gge3xtfCBtLmZpbGVuYW1lID0gZmlsZW5hbWV9CisgICAgICAgIEBmaWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGlzIHNlcXVlbmNlLgorICAgICAgIworICAgICAgIyBTdWJjbGFzc2VzIHNob3VsZCBkZWZpbmUgYCNfaGFzaGAgcmF0aGVyIHRoYW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwKKyAgICAgICMgd2hpY2ggYXV0b21hdGljYWxseSBoYW5kbGVzIG1lbW9pemluZyB0aGUgcmVzdWx0LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgICAgZGVmIGhhc2gKKyAgICAgICAgQF9oYXNoIHx8PSBfaGFzaAorICAgICAgZW5kCisKKyAgICAgICMgQ2hlY2tzIGVxdWFsaXR5IGJldHdlZW4gdGhpcyBhbmQgYW5vdGhlciBvYmplY3QuCisgICAgICAjCisgICAgICAjIFN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBgI19lcWw/YCByYXRoZXIgdGhhbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLAorICAgICAgIyB3aGljaCBoYW5kbGVzIGNoZWNraW5nIGNsYXNzIGVxdWFsaXR5IGFuZCBoYXNoIGVxdWFsaXR5LgorICAgICAgIworICAgICAgIyBAcGFyYW0gb3RoZXIgW09iamVjdF0gVGhlIG9iamVjdCB0byB0ZXN0IGVxdWFsaXR5IGFnYWluc3QKKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciBvciBub3QgdGhpcyBpcyBlcXVhbCB0byBgb3RoZXJgCisgICAgICBkZWYgZXFsPyhvdGhlcikKKyAgICAgICAgb3RoZXIuY2xhc3MgPT0gc2VsZi5jbGFzcyAmJiBvdGhlci5oYXNoID09IGhhc2ggJiYgX2VxbD8ob3RoZXIpCisgICAgICBlbmQKKyAgICAgIGFsaWFzX21ldGhvZCA6PT0sIDplcWw/CisKKyAgICAgICMgV2hldGhlciBvciBub3QgdGhpcyBzZWxlY3RvciBzaG91bGQgYmUgaGlkZGVuIGR1ZSB0byBjb250YWluaW5nIGEKKyAgICAgICMgcGxhY2Vob2xkZXIuCisgICAgICBkZWYgaW52aXNpYmxlPworICAgICAgICBAaW52aXNpYmxlIHx8PSBtZW1iZXJzLmFueT8gZG8gfG18CisgICAgICAgICAgbmV4dCBtLmludmlzaWJsZT8gaWYgbS5pc19hPyhBYnN0cmFjdFNlcXVlbmNlKSB8fCBtLmlzX2E/KFBzZXVkbykKKyAgICAgICAgICBtLmlzX2E/KFBsYWNlaG9sZGVyKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgdGhlIHNlbGVjdG9yIHN0cmluZy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIG9wdHMgW0hhc2hdIHJlbmRlcmluZyBvcHRpb25zLgorICAgICAgIyBAb3B0aW9uIG9wdHMgW1N5bWJvbF0gOnN0eWxlIFRoZSBjc3MgcmVuZGVyaW5nIHN0eWxlLgorICAgICAgIyBAb3B0aW9uIHBsYWNlaG9sZGVycyBbQm9vbGVhbl0gOnBsYWNlaG9sZGVycworICAgICAgIyAgIFdoZXRoZXIgdG8gaW5jbHVkZSBwbGFjZWhvbGRlciBzZWxlY3RvcnMuIERlZmF1bHRzIHRvIGB0cnVlYC4KKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgZGVmIHRvX3Mob3B0cyA9IHt9KQorICAgICAgICBTYXNzOjpVdGlsLmFic3RyYWN0KHNlbGYpCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHRoZSBzcGVjaWZpY2l0eSBvZiB0aGUgc2VsZWN0b3IuCisgICAgICAjCisgICAgICAjIFRoZSBiYXNlIGlzIGdpdmVuIGJ5IHtTYXNzOjpTZWxlY3Rvcjo6U1BFQ0lGSUNJVFlfQkFTRX0uIFRoaXMgY2FuIGJlIGEKKyAgICAgICMgbnVtYmVyIG9yIGEgcmFuZ2UgcmVwcmVzZW50aW5nIHBvc3NpYmxlIHNwZWNpZmljaXRpZXMuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0ludGVnZXIsIFJhbmdlXQorICAgICAgZGVmIHNwZWNpZmljaXR5CisgICAgICAgIF9zcGVjaWZpY2l0eShtZW1iZXJzKQorICAgICAgZW5kCisKKyAgICAgIHByb3RlY3RlZAorCisgICAgICBkZWYgX3NwZWNpZmljaXR5KGFycikKKyAgICAgICAgbWluID0gMAorICAgICAgICBtYXggPSAwCisgICAgICAgIGFyci5lYWNoIGRvIHxtfAorICAgICAgICAgIG5leHQgaWYgbS5pc19hPyhTdHJpbmcpCisgICAgICAgICAgc3BlYyA9IG0uc3BlY2lmaWNpdHkKKyAgICAgICAgICBpZiBzcGVjLmlzX2E/KFJhbmdlKQorICAgICAgICAgICAgbWluICs9IHNwZWMuYmVnaW4KKyAgICAgICAgICAgIG1heCArPSBzcGVjLmVuZAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1pbiArPSBzcGVjCisgICAgICAgICAgICBtYXggKz0gc3BlYworICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgbWluID09IG1heCA/IG1pbiA6IChtaW4uLm1heCkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zZWxlY3Rvci9jb21tYV9zZXF1ZW5jZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2VsZWN0b3IvY29tbWFfc2VxdWVuY2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzYzYzNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2VsZWN0b3IvY29tbWFfc2VxdWVuY2UucmIKQEAgLTAsMCArMSwxOTQgQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBTZWxlY3RvcgorICAgICMgQSBjb21tYS1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2Ygc2VsZWN0b3JzLgorICAgIGNsYXNzIENvbW1hU2VxdWVuY2UgPCBBYnN0cmFjdFNlcXVlbmNlCisgICAgICBAQGNvbXBvdW5kX2V4dGVuZF9kZXByZWNhdGlvbiA9IFNhc3M6OkRlcHJlY2F0aW9uLm5ldworCisgICAgICAjIFRoZSBjb21tYS1zZXBhcmF0ZWQgc2VsZWN0b3Igc2VxdWVuY2VzCisgICAgICAjIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xhc3MuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0FycmF5PFNlcXVlbmNlPl0KKyAgICAgIGF0dHJfcmVhZGVyIDptZW1iZXJzCisKKyAgICAgICMgQHBhcmFtIHNlcXMgW0FycmF5PFNlcXVlbmNlPl0gU2VlIFx7I21lbWJlcnN9CisgICAgICBkZWYgaW5pdGlhbGl6ZShzZXFzKQorICAgICAgICBAbWVtYmVycyA9IHNlcXMKKyAgICAgIGVuZAorCisgICAgICAjIFJlc29sdmVzIHRoZSB7UGFyZW50fSBzZWxlY3RvcnMgd2l0aGluIHRoaXMgc2VsZWN0b3IKKyAgICAgICMgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IHNlbGVjdG9yLAorICAgICAgIyBoYW5kbGluZyBjb21tYXMgYXBwcm9wcmlhdGVseS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHN1cGVyX2NzZXEgW0NvbW1hU2VxdWVuY2VdIFRoZSBwYXJlbnQgc2VsZWN0b3IKKyAgICAgICMgQHBhcmFtIGltcGxpY2l0X3BhcmVudCBbQm9vbGVhbl0gV2hldGhlciB0aGUgdGhlIHBhcmVudAorICAgICAgIyAgIHNlbGVjdG9yIHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIHByZXBlbmRlZCB0byB0aGUgcmVzb2x2ZWQKKyAgICAgICMgICBzZWxlY3RvciBpZiBpdCBjb250YWlucyBubyBwYXJlbnQgcmVmcy4KKyAgICAgICMgQHJldHVybiBbQ29tbWFTZXF1ZW5jZV0gVGhpcyBzZWxlY3Rvciwgd2l0aCBwYXJlbnQgcmVmZXJlbmNlcyByZXNvbHZlZAorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBJZiBhIHBhcmVudCBzZWxlY3RvciBpcyBpbnZhbGlkCisgICAgICBkZWYgcmVzb2x2ZV9wYXJlbnRfcmVmcyhzdXBlcl9jc2VxLCBpbXBsaWNpdF9wYXJlbnQgPSB0cnVlKQorICAgICAgICBpZiBzdXBlcl9jc2VxLm5pbD8KKyAgICAgICAgICBpZiBjb250YWluc19wYXJlbnRfcmVmPworICAgICAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KAorICAgICAgICAgICAgICAiQmFzZS1sZXZlbCBydWxlcyBjYW5ub3QgY29udGFpbiB0aGUgcGFyZW50LXNlbGVjdG9yLXJlZmVyZW5jaW5nIGNoYXJhY3RlciAnJicuIikKKyAgICAgICAgICBlbmQKKyAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBlbmQKKworICAgICAgICBDb21tYVNlcXVlbmNlLm5ldyhTYXNzOjpVdGlsLmZsYXR0ZW5fdmVydGljYWxseShAbWVtYmVycy5tYXAgZG8gfHNlcXwKKyAgICAgICAgICBzZXEucmVzb2x2ZV9wYXJlbnRfcmVmcyhzdXBlcl9jc2VxLCBpbXBsaWNpdF9wYXJlbnQpLm1lbWJlcnMKKyAgICAgICAgZW5kKSkKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgd2hldGhlciB0aGVyZSdzIGEge1BhcmVudH0gc2VsZWN0b3IgYW55d2hlcmUgaW4gdGhpcyBzZXF1ZW5jZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICAgIGRlZiBjb250YWluc19wYXJlbnRfcmVmPworICAgICAgICBAbWVtYmVycy5hbnk/IHt8c2VsfCBzZWwuY29udGFpbnNfcGFyZW50X3JlZj99CisgICAgICBlbmQKKworICAgICAgIyBOb24tZGVzdHJ1Y2l2ZWx5IGV4dGVuZHMgdGhpcyBzZWxlY3RvciB3aXRoIHRoZSBleHRlbnNpb25zIHNwZWNpZmllZCBpbiBhIGhhc2gKKyAgICAgICMgKHdoaWNoIHNob3VsZCBjb21lIGZyb20ge1Nhc3M6OlRyZWU6OlZpc2l0b3JzOjpDc3NpemV9KS4KKyAgICAgICMKKyAgICAgICMgQHRvZG8gTGluayB0aGlzIHRvIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbiBvbiBgQGV4dGVuZGAKKyAgICAgICMgICB3aGVuIHN1Y2ggYSB0aGluZyBleGlzdHMuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBleHRlbmRzIFtTYXNzOjpVdGlsOjpTdWJzZXRNYXB7U2VsZWN0b3I6OlNpbXBsZSA9PgorICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpDc3NpemU6OkV4dGVuZH1dCisgICAgICAjICAgVGhlIGV4dGVuc2lvbnMgdG8gcGVyZm9ybSBvbiB0aGlzIHNlbGVjdG9yCisgICAgICAjIEBwYXJhbSBwYXJlbnRfZGlyZWN0aXZlcyBbQXJyYXk8U2Fzczo6VHJlZTo6RGlyZWN0aXZlTm9kZT5dCisgICAgICAjICAgVGhlIGRpcmVjdGl2ZXMgY29udGFpbmluZyB0aGlzIHNlbGVjdG9yLgorICAgICAgIyBAcGFyYW0gcmVwbGFjZSBbQm9vbGVhbl0KKyAgICAgICMgICBXaGV0aGVyIHRvIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHNlbGVjdG9yIGVudGlyZWx5IG9yIGluY2x1ZGUKKyAgICAgICMgICBpdCBpbiB0aGUgcmVzdWx0LgorICAgICAgIyBAcGFyYW0gc2VlbiBbU2V0PEFycmF5PFNlbGVjdG9yOjpTaW1wbGU+Pl0KKyAgICAgICMgICBUaGUgc2V0IG9mIHNpbXBsZSBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHJlcGxhY2VkLgorICAgICAgIyBAcGFyYW0gb3JpZ2luYWwgW0Jvb2xlYW5dCisgICAgICAjICAgV2hldGhlciB0aGlzIGlzIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWluZyBleHRlbmRlZCwgYXMgb3Bwb3NlZCB0bworICAgICAgIyAgIHRoZSByZXN1bHQgb2YgYSBwcmV2aW91cyBleHRlbnNpb24gdGhhdCdzIGJlaW5nIHJlLWV4dGVuZGVkLgorICAgICAgIyBAcmV0dXJuIFtDb21tYVNlcXVlbmNlXSBBIGNvcHkgb2YgdGhpcyBzZWxlY3RvciwKKyAgICAgICMgICB3aXRoIGV4dGVuc2lvbnMgbWFkZSBhY2NvcmRpbmcgdG8gYGV4dGVuZHNgCisgICAgICBkZWYgZG9fZXh0ZW5kKGV4dGVuZHMsIHBhcmVudF9kaXJlY3RpdmVzID0gW10sIHJlcGxhY2UgPSBmYWxzZSwgc2VlbiA9IFNldC5uZXcsCisgICAgICAgICAgb3JpZ2luYWwgPSB0cnVlKQorICAgICAgICBDb21tYVNlcXVlbmNlLm5ldyhtZW1iZXJzLm1hcCBkbyB8c2VxfAorICAgICAgICAgIHNlcS5kb19leHRlbmQoZXh0ZW5kcywgcGFyZW50X2RpcmVjdGl2ZXMsIHJlcGxhY2UsIHNlZW4sIG9yaWdpbmFsKQorICAgICAgICBlbmQuZmxhdHRlbikKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBzZWxlY3RvciBtYXRjaGVzIGFsbCBlbGVtZW50cworICAgICAgIyB0aGF0IHRoZSBnaXZlbiBzZWxlY3RvciBtYXRjaGVzIChhcyB3ZWxsIGFzIHBvc3NpYmx5IG1vcmUpLgorICAgICAgIworICAgICAgIyBAZXhhbXBsZQorICAgICAgIyAgICguZm9vKS5zdXBlcnNlbGVjdG9yPyguZm9vLmJhcikgIz0+IHRydWUKKyAgICAgICMgICAoLmZvbykuc3VwZXJzZWxlY3Rvcj8oLmJhcikgIz0+IGZhbHNlCisgICAgICAjIEBwYXJhbSBjc2VxIFtDb21tYVNlcXVlbmNlXQorICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIHN1cGVyc2VsZWN0b3I/KGNzZXEpCisgICAgICAgIGNzZXEubWVtYmVycy5hbGw/IHt8c2VxMXwgbWVtYmVycy5hbnk/IHt8c2VxMnwgc2VxMi5zdXBlcnNlbGVjdG9yPyhzZXExKX19CisgICAgICBlbmQKKworICAgICAgIyBQb3B1bGF0ZXMgYSBzdWJzZXQgbWFwIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCB0byBleHRlbmQKKyAgICAgICMgc2VsZWN0b3JzLiBUaGlzIHJlZ2lzdGVycyBhbiBleHRlbnNpb24gd2l0aCB0aGlzIHNlbGVjdG9yIGFzCisgICAgICAjIHRoZSBleHRlbmRlciBhbmQgYGV4dGVuZGVlYCBhcyB0aGUgZXh0ZW5kZWUuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBleHRlbmRzIFtTYXNzOjpVdGlsOjpTdWJzZXRNYXB7U2VsZWN0b3I6OlNpbXBsZSA9PgorICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpDc3NpemU6OkV4dGVuZH1dCisgICAgICAjICAgVGhlIHN1YnNldCBtYXAgcmVwcmVzZW50aW5nIHRoZSBleHRlbnNpb25zIHRvIHBlcmZvcm0uCisgICAgICAjIEBwYXJhbSBleHRlbmRlZSBbQ29tbWFTZXF1ZW5jZV0gVGhlIHNlbGVjdG9yIGJlaW5nIGV4dGVuZGVkLgorICAgICAgIyBAcGFyYW0gZXh0ZW5kX25vZGUgW1Nhc3M6OlRyZWU6OkV4dGVuZE5vZGVdCisgICAgICAjICAgVGhlIG5vZGUgdGhhdCBjYXVzZWQgdGhpcyBleHRlbnNpb24uCisgICAgICAjIEBwYXJhbSBwYXJlbnRfZGlyZWN0aXZlcyBbQXJyYXk8U2Fzczo6VHJlZTo6RGlyZWN0aXZlTm9kZT5dCisgICAgICAjICAgVGhlIHBhcmVudCBkaXJlY3RpdmVzIGNvbnRhaW5pbmcgYGV4dGVuZF9ub2RlYC4KKyAgICAgICMgQHBhcmFtIGFsbG93X2NvbXBvdW5kX3RhcmdldCBbQm9vbGVhbl0KKyAgICAgICMgICBXaGV0aGVyIGBleHRlbmRlZWAgaXMgYWxsb3dlZCB0byBjb250YWluIGNvbXBvdW5kIHNlbGVjdG9ycy4KKyAgICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gaWYgdGhpcyBleHRlbnNpb24gaXMgaW52YWxpZC4KKyAgICAgIGRlZiBwb3B1bGF0ZV9leHRlbmRzKGV4dGVuZHMsIGV4dGVuZGVlLCBleHRlbmRfbm9kZSA9IG5pbCwgcGFyZW50X2RpcmVjdGl2ZXMgPSBbXSwKKyAgICAgICAgICBhbGxvd19jb21wb3VuZF90YXJnZXQgPSBmYWxzZSkKKyAgICAgICAgZXh0ZW5kZWUubWVtYmVycy5lYWNoIGRvIHxzZXF8CisgICAgICAgICAgaWYgc2VxLm1lbWJlcnMuc2l6ZSA+IDEKKyAgICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiQ2FuJ3QgZXh0ZW5kICN7c2VxfTogY2FuJ3QgZXh0ZW5kIG5lc3RlZCBzZWxlY3RvcnMiKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgc3NlcSA9IHNlcS5tZW1iZXJzLmZpcnN0CisgICAgICAgICAgaWYgIXNzZXEuaXNfYT8oU2Fzczo6U2VsZWN0b3I6OlNpbXBsZVNlcXVlbmNlKQorICAgICAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCJDYW4ndCBleHRlbmQgI3tzZXF9OiBpbnZhbGlkIHNlbGVjdG9yIikKKyAgICAgICAgICBlbHNpZiBzc2VxLm1lbWJlcnMuYW55PyB7fHNzfCBzcy5pc19hPyhTYXNzOjpTZWxlY3Rvcjo6UGFyZW50KX0KKyAgICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiQ2FuJ3QgZXh0ZW5kICN7c2VxfTogY2FuJ3QgZXh0ZW5kIHBhcmVudCBzZWxlY3RvcnMiKQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgc2VsID0gc3NlcS5tZW1iZXJzCisgICAgICAgICAgaWYgIWFsbG93X2NvbXBvdW5kX3RhcmdldCAmJiBzZWwubGVuZ3RoID4gMQorICAgICAgICAgICAgQEBjb21wb3VuZF9leHRlbmRfZGVwcmVjYXRpb24ud2Fybihzc2VxLmZpbGVuYW1lLCBzc2VxLmxpbmUsIDw8V0FSTklORykKK0V4dGVuZGluZyBhIGNvbXBvdW5kIHNlbGVjdG9yLCAje3NzZXF9LCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KK1NlZSBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9zYXNzL2lzc3Vlcy8xNTk5IGZvciBkZXRhaWxzLgorV0FSTklORworICAgICAgICAgIGVuZAorCisgICAgICAgICAgbWVtYmVycy5lYWNoIGRvIHxtZW1iZXJ8CisgICAgICAgICAgICB1bmxlc3MgbWVtYmVyLm1lbWJlcnMubGFzdC5pc19hPyhTYXNzOjpTZWxlY3Rvcjo6U2ltcGxlU2VxdWVuY2UpCisgICAgICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiI3ttZW1iZXJ9IGNhbid0IGV4dGVuZDogaW52YWxpZCBzZWxlY3RvciIpCisgICAgICAgICAgICBlbmQKKworICAgICAgICAgICAgZXh0ZW5kc1tzZWxdID0gU2Fzczo6VHJlZTo6VmlzaXRvcnM6OkNzc2l6ZTo6RXh0ZW5kLm5ldygKKyAgICAgICAgICAgICAgbWVtYmVyLCBzZWwsIGV4dGVuZF9ub2RlLCBwYXJlbnRfZGlyZWN0aXZlcywgZmFsc2UpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgVW5pZmllcyB0aGlzIHdpdGggYW5vdGhlciBjb21tYSBzZWxlY3RvciB0byBwcm9kdWNlIGEgc2VsZWN0b3IKKyAgICAgICMgdGhhdCBtYXRjaGVzIChhIHN1YnNldCBvZikgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGlucHV0cy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIG90aGVyIFtDb21tYVNlcXVlbmNlXQorICAgICAgIyBAcmV0dXJuIFtDb21tYVNlcXVlbmNlLCBuaWxdIFRoZSB1bmlmaWVkIHNlbGVjdG9yLCBvciBuaWwgaWYgdW5pZmljYXRpb24gZmFpbGVkLgorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBJZiB0aGlzIHNlbGVjdG9yIGNhbm5vdCBiZSB1bmlmaWVkLgorICAgICAgIyAgIFRoaXMgd2lsbCBvbmx5IGV2ZXIgb2NjdXIgd2hlbiBhIGR5bmFtaWMgc2VsZWN0b3IsCisgICAgICAjICAgc3VjaCBhcyB7UGFyZW50fSBvciB7SW50ZXJwb2xhdGlvbn0sIGlzIHVzZWQgaW4gdW5pZmljYXRpb24uCisgICAgICAjICAgU2luY2UgdGhlc2Ugc2VsZWN0b3JzIHNob3VsZCBiZSByZXNvbHZlZAorICAgICAgIyAgIGJ5IHRoZSB0aW1lIGV4dGVuc2lvbiBhbmQgdW5pZmljYXRpb24gaGFwcGVuLAorICAgICAgIyAgIHRoaXMgZXhjZXB0aW9uIHdpbGwgb25seSBldmVyIGJlIHJhaXNlZCBhcyBhIHJlc3VsdCBvZiBwcm9ncmFtbWVyIGVycm9yCisgICAgICBkZWYgdW5pZnkob3RoZXIpCisgICAgICAgIHJlc3VsdHMgPSBtZW1iZXJzLm1hcCB7fHNlcTF8IG90aGVyLm1lbWJlcnMubWFwIHt8c2VxMnwgc2VxMS51bmlmeShzZXEyKX19LmZsYXR0ZW4uY29tcGFjdAorICAgICAgICByZXN1bHRzLmVtcHR5PyA/IG5pbCA6IENvbW1hU2VxdWVuY2UubmV3KHJlc3VsdHMubWFwIHt8Y3NlcXwgY3NlcS5tZW1iZXJzfS5mbGF0dGVuKQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyBhIFNhc3NTY3JpcHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWxlY3Rvci4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdF0KKyAgICAgIGRlZiB0b19zYXNzX3NjcmlwdAorICAgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0Lm5ldyhtZW1iZXJzLm1hcCBkbyB8c2VxfAorICAgICAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3QubmV3KHNlcS5tZW1iZXJzLm1hcCBkbyB8Y29tcG9uZW50fAorICAgICAgICAgICAgbmV4dCBpZiBjb21wb25lbnQgPT0gIlxuIgorICAgICAgICAgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldyhjb21wb25lbnQudG9fcykKKyAgICAgICAgICBlbmQuY29tcGFjdCwgc2VwYXJhdG9yOiA6c3BhY2UpCisgICAgICAgIGVuZCwgc2VwYXJhdG9yOiA6Y29tbWEpCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZXF1ZW5jZS4KKyAgICAgICMgVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNlbGVjdG9yIHN0cmluZy4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgZGVmIGluc3BlY3QKKyAgICAgICAgbWVtYmVycy5tYXAge3xtfCBtLmluc3BlY3R9LmpvaW4oIiwgIikKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQWJzdHJhY3RTZXF1ZW5jZSN0b19zCisgICAgICBkZWYgdG9fcyhvcHRzID0ge30pCisgICAgICAgIEBtZW1iZXJzLm1hcCBkbyB8bXwKKyAgICAgICAgICBuZXh0IGlmIG9wdHNbOnBsYWNlaG9sZGVyXSA9PSBmYWxzZSAmJiBtLmludmlzaWJsZT8KKyAgICAgICAgICBtLnRvX3Mob3B0cykKKyAgICAgICAgZW5kLmNvbXBhY3QuCisgICAgICAgICAgam9pbihvcHRzWzpzdHlsZV0gPT0gOmNvbXByZXNzZWQgPyAiLCIgOiAiLCAiKS4KKyAgICAgICAgICBnc3ViKCIsIFxuIiwgIixcbiIpCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBkZWYgX2hhc2gKKyAgICAgICAgbWVtYmVycy5oYXNoCisgICAgICBlbmQKKworICAgICAgZGVmIF9lcWw/KG90aGVyKQorICAgICAgICBvdGhlci5jbGFzcyA9PSBzZWxmLmNsYXNzICYmIG90aGVyLm1lbWJlcnMuZXFsPyhtZW1iZXJzKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NlbGVjdG9yL3BzZXVkby5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2VsZWN0b3IvcHNldWRvLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOWYzMDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NlbGVjdG9yL3BzZXVkby5yYgpAQCAtMCwwICsxLDI4MyBAQAorIyBjb2Rpbmc6IHV0Zi04Cittb2R1bGUgU2FzcworICBtb2R1bGUgU2VsZWN0b3IKKyAgICAjIEEgcHNldWRvY2xhc3MgKGUuZy4gYDp2aXNpdGVkYCkgb3IgcHNldWRvZWxlbWVudCAoZS5nLiBgOjpmaXJzdC1saW5lYCkKKyAgICAjIHNlbGVjdG9yLiBJdCBjYW4gaGF2ZSBhcmd1bWVudHMgKGUuZy4gYDpudGgtY2hpbGQoMm4rMSlgKSB3aGljaCBjYW4KKyAgICAjIGNvbnRhaW4gc2VsZWN0b3JzIChlLmcuIGA6bnRoLWNoaWxkKDJuKzEgb2YgLmZvbylgKS4KKyAgICBjbGFzcyBQc2V1ZG8gPCBTaW1wbGUKKyAgICAgICMgU29tZSBwc2V1ZG8tY2xhc3Mtc3ludGF4IHNlbGVjdG9ycyBhcmUgYWN0dWFsbHkgY29uc2lkZXJlZAorICAgICAgIyBwc2V1ZG8tZWxlbWVudHMgYW5kIG11c3QgYmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gVGhpcyBpcyBhIGxpc3Qgb2Ygc3VjaAorICAgICAgIyBzZWxlY3RvcnMuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1NldDxTdHJpbmc+XQorICAgICAgQUNUVUFMTFlfRUxFTUVOVFMgPSAldyhhZnRlciBiZWZvcmUgZmlyc3QtbGluZSBmaXJzdC1sZXR0ZXIpLnRvX3NldAorCisgICAgICAjIExpa2UgXHsjdHlwZX0sIGJ1dCByZXR1cm5zIHRoZSB0eXBlIG9mIHNlbGVjdG9yIHRoaXMgbG9va3MgbGlrZSwgcmF0aGVyCisgICAgICAjIHRoYW4gdGhlIHR5cGUgaXQgaXMgc2VtYW50aWNhbGx5LiBUaGlzIG9ubHkgZGlmZmVycyBmcm9tIHR5cGUgZm9yCisgICAgICAjIHNlbGVjdG9ycyBpbiBce0FDVFVBTExZXF9FTEVNRU5UU30uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N5bWJvbF0KKyAgICAgIGF0dHJfcmVhZGVyIDpzeW50YWN0aWNfdHlwZQorCisgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBzZWxlY3Rvci4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgYXR0cl9yZWFkZXIgOm5hbWUKKworICAgICAgIyBUaGUgYXJndW1lbnQgdG8gdGhlIHNlbGVjdG9yLAorICAgICAgIyBvciBgbmlsYCBpZiBubyBhcmd1bWVudCB3YXMgZ2l2ZW4uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZywgbmlsXQorICAgICAgYXR0cl9yZWFkZXIgOmFyZworCisgICAgICAjIFRoZSBzZWxlY3RvciBhcmd1bWVudCwgb3IgYG5pbGAgaWYgbm8gc2VsZWN0b3IgZXhpc3RzLgorICAgICAgIworICAgICAgIyBJZiB0aGlzIGFuZCBceyNhcmdcfSBhcmUgYm90aCBzZXQsIFx7I2FyZ1x9IGlzIGNvbnNpZGVyZWQgYSBub24tc2VsZWN0b3IKKyAgICAgICMgcHJlZml4LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtDb21tYVNlcXVlbmNlXQorICAgICAgYXR0cl9yZWFkZXIgOnNlbGVjdG9yCisKKyAgICAgICMgQHBhcmFtIHN5bnRhY3RpY190eXBlIFtTeW1ib2xdIFNlZSBceyNzeW50YWN0aWNfdHlwZX0KKyAgICAgICMgQHBhcmFtIG5hbWUgW1N0cmluZ10gU2VlIFx7I25hbWV9CisgICAgICAjIEBwYXJhbSBhcmcgW25pbCwgU3RyaW5nXSBTZWUgXHsjYXJnfQorICAgICAgIyBAcGFyYW0gc2VsZWN0b3IgW25pbCwgQ29tbWFTZXF1ZW5jZV0gU2VlIFx7I3NlbGVjdG9yfQorICAgICAgZGVmIGluaXRpYWxpemUoc3ludGFjdGljX3R5cGUsIG5hbWUsIGFyZywgc2VsZWN0b3IpCisgICAgICAgIEBzeW50YWN0aWNfdHlwZSA9IHN5bnRhY3RpY190eXBlCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgICBAYXJnID0gYXJnCisgICAgICAgIEBzZWxlY3RvciA9IHNlbGVjdG9yCisgICAgICBlbmQKKworICAgICAgZGVmIHVuaXF1ZT8KKyAgICAgICAgdHlwZSA9PSA6Y2xhc3MgJiYgbm9ybWFsaXplZF9uYW1lID09ICdyb290JworICAgICAgZW5kCisKKyAgICAgICMgV2hldGhlciBvciBub3QgdGhpcyBzZWxlY3RvciBzaG91bGQgYmUgaGlkZGVuIGR1ZSB0byBjb250YWluaW5nIGEKKyAgICAgICMgcGxhY2Vob2xkZXIuCisgICAgICBkZWYgaW52aXNpYmxlPworICAgICAgICAjIDpub3QoKSBpcyBhIHNwZWNpYWwgY2FzZeKAlGlmIHlvdSBlbGltaW5hdGUgYWxsIHRoZSBwbGFjZWhvbGRlcnMgZnJvbQorICAgICAgICAjIGl0LCBpdCBzaG91bGQgbWF0Y2ggYW55dGhpbmcuCisgICAgICAgIG5hbWUgIT0gJ25vdCcgJiYgQHNlbGVjdG9yICYmIEBzZWxlY3Rvci5tZW1iZXJzLmFsbD8ge3xzfCBzLmludmlzaWJsZT99CisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHdpdGggXHsjc2VsZWN0b3J9IHNldCB0byBceyNuZXdcX3NlbGVjdG9yfS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIG5ld19zZWxlY3RvciBbQ29tbWFTZXF1ZW5jZV0KKyAgICAgICMgQHJldHVybiBbQXJyYXk8U2ltcGxlPl0KKyAgICAgIGRlZiB3aXRoX3NlbGVjdG9yKG5ld19zZWxlY3RvcikKKyAgICAgICAgcmVzdWx0ID0gUHNldWRvLm5ldyhzeW50YWN0aWNfdHlwZSwgbmFtZSwgYXJnLAorICAgICAgICAgIENvbW1hU2VxdWVuY2UubmV3KG5ld19zZWxlY3Rvci5tZW1iZXJzLm1hcCBkbyB8c2VxfAorICAgICAgICAgICAgbmV4dCBzZXEgdW5sZXNzIHNlcS5tZW1iZXJzLmxlbmd0aCA9PSAxCisgICAgICAgICAgICBzc2VxID0gc2VxLm1lbWJlcnMuZmlyc3QKKyAgICAgICAgICAgIG5leHQgc2VxIHVubGVzcyBzc2VxLmlzX2E/KFNpbXBsZVNlcXVlbmNlKSAmJiBzc2VxLm1lbWJlcnMubGVuZ3RoID09IDEKKyAgICAgICAgICAgIHNlbCA9IHNzZXEubWVtYmVycy5maXJzdAorICAgICAgICAgICAgbmV4dCBzZXEgdW5sZXNzIHNlbC5pc19hPyhQc2V1ZG8pICYmIHNlbC5zZWxlY3RvcgorCisgICAgICAgICAgICBjYXNlIG5vcm1hbGl6ZWRfbmFtZQorICAgICAgICAgICAgd2hlbiAnbm90JworICAgICAgICAgICAgICAjIEluIHRoZW9yeSwgaWYgdGhlcmUncyBhIG5lc3RlZCA6bm90IGl0cyBjb250ZW50cyBzaG91bGQgYmUKKyAgICAgICAgICAgICAgIyB1bmlmaWVkIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gRm9yIGV4YW1wbGUsIGlmIDpub3QoLmZvbykKKyAgICAgICAgICAgICAgIyBleHRlbmRzIC5iYXIsIDpub3QoLmJhcikgc2hvdWxkIGJlY29tZSAuZm9vOm5vdCguYmFyKS4gSG93ZXZlciwKKyAgICAgICAgICAgICAgIyB0aGlzIGlzIGEgbmFycm93IGVkZ2UgY2FzZSBhbmQgc3VwcG9ydGluZyBpdCBwcm9wZXJseSB3b3VsZCBtYWtlCisgICAgICAgICAgICAgICMgdGhpcyBjb2RlIGFuZCB0aGUgY29kZSBjYWxsaW5nIGl0IGEgbG90IG1vcmUgY29tcGxpY2F0ZWQsIHNvCisgICAgICAgICAgICAgICMgaXQncyBub3Qgc3VwcG9ydGVkIGZvciBub3cuCisgICAgICAgICAgICAgIG5leHQgW10gdW5sZXNzIHNlbC5ub3JtYWxpemVkX25hbWUgPT0gJ21hdGNoZXMnCisgICAgICAgICAgICAgIHNlbC5zZWxlY3Rvci5tZW1iZXJzCisgICAgICAgICAgICB3aGVuICdtYXRjaGVzJywgJ2FueScsICdjdXJyZW50JywgJ250aC1jaGlsZCcsICdudGgtbGFzdC1jaGlsZCcKKyAgICAgICAgICAgICAgIyBBcyBhYm92ZSwgd2UgY291bGQgdGhlb3JldGljYWxseSBzdXBwb3J0IDpub3Qgd2l0aGluIDptYXRjaGVzLCBidXQKKyAgICAgICAgICAgICAgIyBkb2luZyBzbyB3b3VsZCByZXF1aXJlIHRoaXMgbWV0aG9kIGFuZCBpdHMgY2FsbGVycyB0byBoYW5kbGUgbXVjaAorICAgICAgICAgICAgICAjIG1vcmUgY29tcGxleCBjYXNlcyB0aGF0IGxpa2VseSBhcmVuJ3Qgd29ydGggdGhlIHBhaW4uCisgICAgICAgICAgICAgIG5leHQgW10gdW5sZXNzIHNlbC5uYW1lID09IG5hbWUgJiYgc2VsLmFyZyA9PSBhcmcKKyAgICAgICAgICAgICAgc2VsLnNlbGVjdG9yLm1lbWJlcnMKKyAgICAgICAgICAgIHdoZW4gJ2hhcycsICdob3N0JywgJ2hvc3QtY29udGV4dCcsICdzbG90dGVkJworICAgICAgICAgICAgICAjIFdlIGNhbid0IGV4cGFuZCBuZXN0ZWQgc2VsZWN0b3JzIGhlcmUsIGJlY2F1c2UgZWFjaCBsYXllciBhZGRzIGFuCisgICAgICAgICAgICAgICMgYWRkaXRpb25hbCBsYXllciBvZiBzZW1hbnRpY3MuIEZvciBleGFtcGxlLCBgOmhhcyg6aGFzKGltZykpYAorICAgICAgICAgICAgICAjIGRvZXNuJ3QgbWF0Y2ggYDxkaXY+PGltZz48L2Rpdj5gIGJ1dCBgOmhhcyhpbWcpYCBkb2VzLgorICAgICAgICAgICAgICBzZWwKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZC5mbGF0dGVuKSkKKworICAgICAgICAjIE9sZGVyIGJyb3dzZXJzIHN1cHBvcnQgOm5vdCBidXQgb25seSB3aXRoIGEgc2luZ2xlIGNvbXBsZXggc2VsZWN0b3IuCisgICAgICAgICMgSW4gb3JkZXIgdG8gc3VwcG9ydCB0aG9zZSBicm93c2Vycywgd2UgYnJlYWsgdXAgdGhlIGNvbnRlbnRzIG9mIGEgOm5vdAorICAgICAgICAjIHVubGVzcyBpdCBvcmlnaW5hbGx5IGNvbnRhaW5lZCBhIHNlbGVjdG9yIGxpc3QuCisgICAgICAgIHJldHVybiBbcmVzdWx0XSB1bmxlc3Mgbm9ybWFsaXplZF9uYW1lID09ICdub3QnCisgICAgICAgIHJldHVybiBbcmVzdWx0XSBpZiBzZWxlY3Rvci5tZW1iZXJzLmxlbmd0aCA+IDEKKyAgICAgICAgcmVzdWx0LnNlbGVjdG9yLm1lbWJlcnMubWFwIGRvIHxzZXF8CisgICAgICAgICAgUHNldWRvLm5ldyhzeW50YWN0aWNfdHlwZSwgbmFtZSwgYXJnLCBDb21tYVNlcXVlbmNlLm5ldyhbc2VxXSkpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgVGhlIHR5cGUgb2YgdGhlIHNlbGVjdG9yLiBgOmNsYXNzYCBpZiB0aGlzIGlzIGEgcHNldWRvY2xhc3Mgc2VsZWN0b3IsCisgICAgICAjIGA6ZWxlbWVudGAgaWYgaXQncyBhIHBzZXVkb2VsZW1lbnQuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N5bWJvbF0KKyAgICAgIGRlZiB0eXBlCisgICAgICAgIEFDVFVBTExZX0VMRU1FTlRTLmluY2x1ZGU/KG5vcm1hbGl6ZWRfbmFtZSkgPyA6ZWxlbWVudCA6IHN5bnRhY3RpY190eXBlCisgICAgICBlbmQKKworICAgICAgIyBMaWtlIFx7I25hbWVcfSwgYnV0IHdpdGhvdXQgYW55IHZlbmRvciBwcmVmaXguCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgIGRlZiBub3JtYWxpemVkX25hbWUKKyAgICAgICAgQG5vcm1hbGl6ZWRfbmFtZSB8fD0gbmFtZS5nc3ViKC9eLVthLXpBLVowLTldKy0vLCAnJykKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgU2VsZWN0b3IjdG9fcworICAgICAgZGVmIHRvX3Mob3B0cyA9IHt9KQorICAgICAgICAjIDpub3QoKSBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSA6bm90KDxub3RoaW5nPikgc2hvdWxkIG1hdGNoCisgICAgICAgICMgZXZlcnl0aGluZy4KKyAgICAgICAgcmV0dXJuICcnIGlmIG5hbWUgPT0gJ25vdCcgJiYgQHNlbGVjdG9yICYmIEBzZWxlY3Rvci5tZW1iZXJzLmFsbD8ge3xtfCBtLmludmlzaWJsZT99CisKKyAgICAgICAgcmVzID0gKHN5bnRhY3RpY190eXBlID09IDpjbGFzcyA/ICI6IiA6ICI6OiIpICsgQG5hbWUKKyAgICAgICAgaWYgQGFyZyB8fCBAc2VsZWN0b3IKKyAgICAgICAgICByZXMgPDwgIigiCisgICAgICAgICAgcmVzIDw8IEBhcmcuc3RyaXAgaWYgQGFyZworICAgICAgICAgIHJlcyA8PCAiICIgaWYgQGFyZyAmJiBAc2VsZWN0b3IKKyAgICAgICAgICByZXMgPDwgQHNlbGVjdG9yLnRvX3Mob3B0cykgaWYgQHNlbGVjdG9yCisgICAgICAgICAgcmVzIDw8ICIpIgorICAgICAgICBlbmQKKyAgICAgICAgcmVzCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIGBuaWxgIGlmIHRoaXMgaXMgYSBwc2V1ZG9lbGVtZW50IHNlbGVjdG9yCisgICAgICAjIGFuZCBgc2Vsc2AgY29udGFpbnMgYSBwc2V1ZG9lbGVtZW50IHNlbGVjdG9yIGRpZmZlcmVudCB0aGFuIHRoaXMgb25lLgorICAgICAgIworICAgICAgIyBAc2VlIFNpbXBsZVNlcXVlbmNlI3VuaWZ5CisgICAgICBkZWYgdW5pZnkoc2VscykKKyAgICAgICAgcmV0dXJuIGlmIHR5cGUgPT0gOmVsZW1lbnQgJiYgc2Vscy5hbnk/IGRvIHxzZWx8CisgICAgICAgICAgc2VsLmlzX2E/KFBzZXVkbykgJiYgc2VsLnR5cGUgPT0gOmVsZW1lbnQgJiYKKyAgICAgICAgICAgIChzZWwubmFtZSAhPSBuYW1lIHx8IHNlbC5hcmcgIT0gYXJnIHx8IHNlbC5zZWxlY3RvciAhPSBzZWxlY3RvcikKKyAgICAgICAgZW5kCisgICAgICAgIHN1cGVyCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgc2VsZWN0b3IgbWF0Y2hlcyBhbGwgZWxlbWVudHMKKyAgICAgICMgdGhhdCB0aGUgZ2l2ZW4gc2VsZWN0b3IgbWF0Y2hlcyAoYXMgd2VsbCBhcyBwb3NzaWJseSBtb3JlKS4KKyAgICAgICMKKyAgICAgICMgQGV4YW1wbGUKKyAgICAgICMgICAoLmZvbykuc3VwZXJzZWxlY3Rvcj8oLmZvby5iYXIpICM9PiB0cnVlCisgICAgICAjICAgKC5mb28pLnN1cGVyc2VsZWN0b3I/KC5iYXIpICM9PiBmYWxzZQorICAgICAgIyBAcGFyYW0gdGhlaXJfc3NlcSBbU2ltcGxlU2VxdWVuY2VdCisgICAgICAjIEBwYXJhbSBwYXJlbnRzIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSwgU3RyaW5nPl0gVGhlIHBhcmVudCBzZWxlY3RvcnMgb2YgYHRoZWlyX3NzZXFgLCBpZiBhbnkuCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBkZWYgc3VwZXJzZWxlY3Rvcj8odGhlaXJfc3NlcSwgcGFyZW50cyA9IFtdKQorICAgICAgICBjYXNlIG5vcm1hbGl6ZWRfbmFtZQorICAgICAgICB3aGVuICdtYXRjaGVzJywgJ2FueScKKyAgICAgICAgICAjIDptYXRjaGVzIGNhbiBiZSBhIHN1cGVyc2VsZWN0b3Igb2YgYW5vdGhlciBzZWxlY3RvciBpbiBvbmUgb2YgdHdvCisgICAgICAgICAgIyB3YXlzLiBFaXRoZXIgaXRzIGNvbnN0aXR1ZW50IHNlbGVjdG9ycyBjYW4gYmUgYSBzdXBlcnNldCBvZiB0aG9zZSBvZgorICAgICAgICAgICMgYW5vdGhlciA6bWF0Y2hlcyBpbiB0aGUgb3RoZXIgc2VsZWN0b3IsIG9yIGFueSBvZiBpdHMgY29uc3RpdHVlbnQKKyAgICAgICAgICAjIHNlbGVjdG9ycyBjYW4gaW5kaXZpZHVhbGx5IGJlIGEgc3VwZXJzZWxlY3RvciBvZiB0aGUgb3RoZXIgc2VsZWN0b3IuCisgICAgICAgICAgKHRoZWlyX3NzZXEuc2VsZWN0b3JfcHNldWRvX2NsYXNzZXNbbm9ybWFsaXplZF9uYW1lXSB8fCBbXSkuYW55PyBkbyB8dGhlaXJfc2VsfAorICAgICAgICAgICAgbmV4dCBmYWxzZSB1bmxlc3MgdGhlaXJfc2VsLmlzX2E/KFBzZXVkbykKKyAgICAgICAgICAgIG5leHQgZmFsc2UgdW5sZXNzIHRoZWlyX3NlbC5uYW1lID09IG5hbWUKKyAgICAgICAgICAgIHNlbGVjdG9yLnN1cGVyc2VsZWN0b3I/KHRoZWlyX3NlbC5zZWxlY3RvcikKKyAgICAgICAgICBlbmQgfHwgc2VsZWN0b3IubWVtYmVycy5hbnk/IGRvIHxvdXJfc2VxfAorICAgICAgICAgICAgdGhlaXJfc2VxID0gU2VxdWVuY2UubmV3KHBhcmVudHMgKyBbdGhlaXJfc3NlcV0pCisgICAgICAgICAgICBvdXJfc2VxLnN1cGVyc2VsZWN0b3I/KHRoZWlyX3NlcSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgd2hlbiAnaGFzJywgJ2hvc3QnLCAnaG9zdC1jb250ZXh0JywgJ3Nsb3R0ZWQnCisgICAgICAgICAgIyBMaWtlIDptYXRjaGVzLCA6aGFzIChldCBhbCkgY2FuIGJlIGEgc3VwZXJzZWxlY3RvciBvZiBhbm90aGVyCisgICAgICAgICAgIyBzZWxlY3RvciBpZiBpdHMgY29uc3RpdHVlbnQgc2VsZWN0b3JzIGFyZSBhIHN1cGVyc2V0IG9mIHRob3NlIG9mCisgICAgICAgICAgIyBhbm90aGVyIDpoYXMgaW4gdGhlIG90aGVyIHNlbGVjdG9yLiBIb3dldmVyLCB0aGUgOm1hdGNoZXMgb3RoZXIgY2FzZQorICAgICAgICAgICMgZG9lc24ndCB3b3JrLCBiZWNhdXNlIDpoYXMgcmVmZXJzIHRvIG5lc3RlZCBlbGVtZW50cy4KKyAgICAgICAgICAodGhlaXJfc3NlcS5zZWxlY3Rvcl9wc2V1ZG9fY2xhc3Nlc1tub3JtYWxpemVkX25hbWVdIHx8IFtdKS5hbnk/IGRvIHx0aGVpcl9zZWx8CisgICAgICAgICAgICBuZXh0IGZhbHNlIHVubGVzcyB0aGVpcl9zZWwuaXNfYT8oUHNldWRvKQorICAgICAgICAgICAgbmV4dCBmYWxzZSB1bmxlc3MgdGhlaXJfc2VsLm5hbWUgPT0gbmFtZQorICAgICAgICAgICAgc2VsZWN0b3Iuc3VwZXJzZWxlY3Rvcj8odGhlaXJfc2VsLnNlbGVjdG9yKQorICAgICAgICAgIGVuZAorICAgICAgICB3aGVuICdub3QnCisgICAgICAgICAgc2VsZWN0b3IubWVtYmVycy5hbGw/IGRvIHxvdXJfc2VxfAorICAgICAgICAgICAgdGhlaXJfc3NlcS5tZW1iZXJzLmFueT8gZG8gfHRoZWlyX3NlbHwKKyAgICAgICAgICAgICAgaWYgdGhlaXJfc2VsLmlzX2E/KEVsZW1lbnQpIHx8IHRoZWlyX3NlbC5pc19hPyhJZCkKKyAgICAgICAgICAgICAgICAjIGA6bm90KGEpYCBpcyBhIHN1cGVyc2VsZWN0b3Igb2YgYGgxYCBhbmQgYDpub3QoI2ZvbylgIGlzIGEKKyAgICAgICAgICAgICAgICAjIHN1cGVyc2VsZWN0b3Igb2YgYCNiYXJgLgorICAgICAgICAgICAgICAgIG91cl9zc2VxID0gb3VyX3NlcS5tZW1iZXJzLmxhc3QKKyAgICAgICAgICAgICAgICBuZXh0IGZhbHNlIHVubGVzcyBvdXJfc3NlcS5pc19hPyhTaW1wbGVTZXF1ZW5jZSkKKyAgICAgICAgICAgICAgICBvdXJfc3NlcS5tZW1iZXJzLmFueT8gZG8gfG91cl9zZWx8CisgICAgICAgICAgICAgICAgICBvdXJfc2VsLmNsYXNzID09IHRoZWlyX3NlbC5jbGFzcyAmJiBvdXJfc2VsICE9IHRoZWlyX3NlbAorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV4dCBmYWxzZSB1bmxlc3MgdGhlaXJfc2VsLmlzX2E/KFBzZXVkbykKKyAgICAgICAgICAgICAgICBuZXh0IGZhbHNlIHVubGVzcyB0aGVpcl9zZWwubmFtZSA9PSBuYW1lCisgICAgICAgICAgICAgICAgIyA6bm90KFgpIGlzIGEgc3VwZXJzZWxlY3RvciBvZiA6bm90KFkpIGV4YWN0bHkgd2hlbiBZIGlzIGEKKyAgICAgICAgICAgICAgICAjIHN1cGVyc2VsZWN0b3Igb2YgWC4KKyAgICAgICAgICAgICAgICB0aGVpcl9zZWwuc2VsZWN0b3Iuc3VwZXJzZWxlY3Rvcj8oQ29tbWFTZXF1ZW5jZS5uZXcoW291cl9zZXFdKSkKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKyAgICAgICAgd2hlbiAnY3VycmVudCcKKyAgICAgICAgICAodGhlaXJfc3NlcS5zZWxlY3Rvcl9wc2V1ZG9fY2xhc3Nlc1snY3VycmVudCddIHx8IFtdKS5hbnk/IGRvIHx0aGVpcl9jdXJyZW50fAorICAgICAgICAgICAgbmV4dCBmYWxzZSBpZiB0aGVpcl9jdXJyZW50Lm5hbWUgIT0gbmFtZQorICAgICAgICAgICAgIyBFeHBsaWNpdGx5IGRvbid0IGNoZWNrIGZvciBuZXN0ZWQgc3VwZXJzZWxlY3RvciByZWxhdGlvbnNoaXBzCisgICAgICAgICAgICAjIGhlcmUuIDpjdXJyZW50KC5mb28pIGlzbid0IGFsd2F5cyBhIHN1cGVyc2VsZWN0b3Igb2YKKyAgICAgICAgICAgICMgOmN1cnJlbnQoLmZvby5iYXIpLCBzaW5jZSBpdCBtYXRjaGVzIHRoZSAqaW5uZXJtb3N0KiBhbmNlc3RvciBvZgorICAgICAgICAgICAgIyB0aGUgY3VycmVudCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuIEZvciBleGFtcGxlOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyAgICAgPGRpdiBjbGFzcz0iZm9vIGJhciI+CisgICAgICAgICAgICAjICAgICAgIDxwIGNsYXNzPSJmb28iPgorICAgICAgICAgICAgIyAgICAgICAgIDxzcGFuPmN1cnJlbnQgZWxlbWVudDwvc3Bhbj4KKyAgICAgICAgICAgICMgICAgICAgPC9wPgorICAgICAgICAgICAgIyAgICAgPC9kaXY+CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEhlcmUgOmN1cnJlbnQoLmZvbykgd291bGQgbWF0Y2ggdGhlIHAgZWxlbWVudCBhbmQgKm5vdCogdGhlIGRpdgorICAgICAgICAgICAgIyBlbGVtZW50LCB3aGVyZWFzIDpjdXJyZW50KC5mb28uYmFyKSB3b3VsZCBtYXRjaCB0aGUgZGl2IGFuZCBub3QKKyAgICAgICAgICAgICMgdGhlIHAuCisgICAgICAgICAgICBzZWxlY3RvciA9PSB0aGVpcl9jdXJyZW50LnNlbGVjdG9yCisgICAgICAgICAgZW5kCisgICAgICAgIHdoZW4gJ250aC1jaGlsZCcsICdudGgtbGFzdC1jaGlsZCcKKyAgICAgICAgICB0aGVpcl9zc2VxLm1lbWJlcnMuYW55PyBkbyB8dGhlaXJfc2VsfAorICAgICAgICAgICAgIyBUaGlzIG1pc3NlcyBhIGZldyBlZGdlIGNhc2VzLiBGb3IgZXhhbXBsZSwgYDpudGgtY2hpbGQobiBvZiBYKWAKKyAgICAgICAgICAgICMgaXMgYSBzdXBlcnNlbGVjdG9yIG9mIGBYYCwgYW5kIGA6bnRoLWNoaWxkKDJuIG9mIFgpYCBpcyBhCisgICAgICAgICAgICAjIHN1cGVyc2VsZWN0b3Igb2YgYDpudGgtY2hpbGQoNG4gb2YgWClgLiBUaGVzZSBzZWVtIHJhcmUgZW5vdWdoCisgICAgICAgICAgICAjIG5vdCB0byBiZSB3b3J0aCB3b3JyeWluZyBhYm91dCwgdGhvdWdoLgorICAgICAgICAgICAgbmV4dCBmYWxzZSB1bmxlc3MgdGhlaXJfc2VsLmlzX2E/KFBzZXVkbykKKyAgICAgICAgICAgIG5leHQgZmFsc2UgdW5sZXNzIHRoZWlyX3NlbC5uYW1lID09IG5hbWUKKyAgICAgICAgICAgIG5leHQgZmFsc2UgdW5sZXNzIHRoZWlyX3NlbC5hcmcgPT0gYXJnCisgICAgICAgICAgICBzZWxlY3Rvci5zdXBlcnNlbGVjdG9yPyh0aGVpcl9zZWwuc2VsZWN0b3IpCisgICAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICB0aHJvdyAiW0JVR10gVW5rbm93biBzZWxlY3RvciBwc2V1ZG8gY2xhc3MgI3tuYW1lfSIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIEFic3RyYWN0U2VxdWVuY2Ujc3BlY2lmaWNpdHkKKyAgICAgIGRlZiBzcGVjaWZpY2l0eQorICAgICAgICByZXR1cm4gMSBpZiB0eXBlID09IDplbGVtZW50CisgICAgICAgIHJldHVybiBTUEVDSUZJQ0lUWV9CQVNFIHVubGVzcyBzZWxlY3RvcgorICAgICAgICBAc3BlY2lmaWNpdHkgfHw9CisgICAgICAgICAgaWYgbm9ybWFsaXplZF9uYW1lID09ICdub3QnCisgICAgICAgICAgICBtaW4gPSAwCisgICAgICAgICAgICBtYXggPSAwCisgICAgICAgICAgICBzZWxlY3Rvci5tZW1iZXJzLmVhY2ggZG8gfHNlcXwKKyAgICAgICAgICAgICAgc3BlYyA9IHNlcS5zcGVjaWZpY2l0eQorICAgICAgICAgICAgICBpZiBzcGVjLmlzX2E/KFJhbmdlKQorICAgICAgICAgICAgICAgIG1pbiA9IFNhc3M6OlV0aWwubWF4KHNwZWMuYmVnaW4sIG1pbikKKyAgICAgICAgICAgICAgICBtYXggPSBTYXNzOjpVdGlsLm1heChzcGVjLmVuZCwgbWF4KQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWluID0gU2Fzczo6VXRpbC5tYXgoc3BlYywgbWluKQorICAgICAgICAgICAgICAgIG1heCA9IFNhc3M6OlV0aWwubWF4KHNwZWMsIG1heCkKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIG1pbiA9PSBtYXggPyBtYXggOiAobWluLi5tYXgpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbWluID0gMAorICAgICAgICAgICAgbWF4ID0gMAorICAgICAgICAgICAgc2VsZWN0b3IubWVtYmVycy5lYWNoIGRvIHxzZXF8CisgICAgICAgICAgICAgIHNwZWMgPSBzZXEuc3BlY2lmaWNpdHkKKyAgICAgICAgICAgICAgaWYgc3BlYy5pc19hPyhSYW5nZSkKKyAgICAgICAgICAgICAgICBtaW4gPSBTYXNzOjpVdGlsLm1pbihzcGVjLmJlZ2luLCBtaW4pCisgICAgICAgICAgICAgICAgbWF4ID0gU2Fzczo6VXRpbC5tYXgoc3BlYy5lbmQsIG1heCkKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1pbiA9IFNhc3M6OlV0aWwubWluKHNwZWMsIG1pbikKKyAgICAgICAgICAgICAgICBtYXggPSBTYXNzOjpVdGlsLm1heChzcGVjLCBtYXgpCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBtaW4gPT0gbWF4ID8gbWF4IDogKG1pbi4ubWF4KQorICAgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NlbGVjdG9yL3NlcXVlbmNlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zZWxlY3Rvci9zZXF1ZW5jZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTIwZmRlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zZWxlY3Rvci9zZXF1ZW5jZS5yYgpAQCAtMCwwICsxLDY2NSBAQAorbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFNlbGVjdG9yCisgICAgIyBBbiBvcGVyYXRvci1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2YKKyAgICAjIHtTaW1wbGVTZXF1ZW5jZSBzaW1wbGUgc2VsZWN0b3Igc2VxdWVuY2VzfS4KKyAgICBjbGFzcyBTZXF1ZW5jZSA8IEFic3RyYWN0U2VxdWVuY2UKKyAgICAgICMgU2V0cyB0aGUgbGluZSBvZiB0aGUgU2FzcyB0ZW1wbGF0ZSBvbiB3aGljaCB0aGlzIHNlbGVjdG9yIHdhcyBkZWNsYXJlZC4KKyAgICAgICMgVGhpcyBhbHNvIHNldHMgdGhlIGxpbmUgZm9yIGFsbCBjaGlsZCBzZWxlY3RvcnMuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBsaW5lIFtJbnRlZ2VyXQorICAgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgICAgZGVmIGxpbmU9KGxpbmUpCisgICAgICAgIG1lbWJlcnMuZWFjaCB7fG18IG0ubGluZSA9IGxpbmUgaWYgbS5pc19hPyhTaW1wbGVTZXF1ZW5jZSl9CisgICAgICAgIEBsaW5lID0gbGluZQorICAgICAgZW5kCisKKyAgICAgICMgU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGlzIHNlbGVjdG9yIHdhcyBkZWNsYXJlZCwKKyAgICAgICMgb3IgYG5pbGAgaWYgaXQgd2FzIG5vdCBkZWNsYXJlZCBpbiBhIGZpbGUgKGUuZy4gb24gc3RkaW4pLgorICAgICAgIyBUaGlzIGFsc28gc2V0cyB0aGUgZmlsZW5hbWUgZm9yIGFsbCBjaGlsZCBzZWxlY3RvcnMuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBmaWxlbmFtZSBbU3RyaW5nLCBuaWxdCisgICAgICAjIEByZXR1cm4gW1N0cmluZywgbmlsXQorICAgICAgZGVmIGZpbGVuYW1lPShmaWxlbmFtZSkKKyAgICAgICAgbWVtYmVycy5lYWNoIHt8bXwgbS5maWxlbmFtZSA9IGZpbGVuYW1lIGlmIG0uaXNfYT8oU2ltcGxlU2VxdWVuY2UpfQorICAgICAgICBmaWxlbmFtZQorICAgICAgZW5kCisKKyAgICAgICMgVGhlIGFycmF5IG9mIHtTaW1wbGVTZXF1ZW5jZSBzaW1wbGUgc2VsZWN0b3Igc2VxdWVuY2VzfSwgb3BlcmF0b3JzLCBhbmQKKyAgICAgICMgbmV3bGluZXMuIFRoZSBvcGVyYXRvcnMgYXJlIHN0cmluZ3Mgc3VjaCBhcyBgIisiYCBhbmQgYCI+ImAgcmVwcmVzZW50aW5nCisgICAgICAjIHRoZSBjb3JyZXNwb25kaW5nIENTUyBvcGVyYXRvcnMsIG9yIGludGVycG9sYXRlZCBTYXNzU2NyaXB0LiBOZXdsaW5lcworICAgICAgIyBhcmUgYWxzbyBuZXdsaW5lIHN0cmluZ3M7IHRoZXNlIGFyZW4ndCBzZW1hbnRpY2FsbHkgcmVsZXZhbnQsIGJ1dCB0aGV5CisgICAgICAjIGRvIGFmZmVjdCBmb3JtYXR0aW5nLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSwgU3RyaW5nfEFycmF5PFNhc3M6OlRyZWU6Ok5vZGUsIFN0cmluZz4+XQorICAgICAgYXR0cl9yZWFkZXIgOm1lbWJlcnMKKworICAgICAgIyBAcGFyYW0gc2Vxc19hbmRfb3BzIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSwgU3RyaW5nfEFycmF5PFNhc3M6OlRyZWU6Ok5vZGUsIFN0cmluZz4+XQorICAgICAgIyAgIFNlZSBceyNtZW1iZXJzfQorICAgICAgZGVmIGluaXRpYWxpemUoc2Vxc19hbmRfb3BzKQorICAgICAgICBAbWVtYmVycyA9IHNlcXNfYW5kX29wcworICAgICAgZW5kCisKKyAgICAgICMgUmVzb2x2ZXMgdGhlIHtQYXJlbnR9IHNlbGVjdG9ycyB3aXRoaW4gdGhpcyBzZWxlY3RvcgorICAgICAgIyBieSByZXBsYWNpbmcgdGhlbSB3aXRoIHRoZSBnaXZlbiBwYXJlbnQgc2VsZWN0b3IsCisgICAgICAjIGhhbmRsaW5nIGNvbW1hcyBhcHByb3ByaWF0ZWx5LgorICAgICAgIworICAgICAgIyBAcGFyYW0gc3VwZXJfY3NlcSBbQ29tbWFTZXF1ZW5jZV0gVGhlIHBhcmVudCBzZWxlY3RvcgorICAgICAgIyBAcGFyYW0gaW1wbGljaXRfcGFyZW50IFtCb29sZWFuXSBXaGV0aGVyIHRoZSB0aGUgcGFyZW50CisgICAgICAjICAgc2VsZWN0b3Igc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgcHJlcGVuZGVkIHRvIHRoZSByZXNvbHZlZAorICAgICAgIyAgIHNlbGVjdG9yIGlmIGl0IGNvbnRhaW5zIG5vIHBhcmVudCByZWZzLgorICAgICAgIyBAcmV0dXJuIFtDb21tYVNlcXVlbmNlXSBUaGlzIHNlbGVjdG9yLCB3aXRoIHBhcmVudCByZWZlcmVuY2VzIHJlc29sdmVkCisgICAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIElmIGEgcGFyZW50IHNlbGVjdG9yIGlzIGludmFsaWQKKyAgICAgIGRlZiByZXNvbHZlX3BhcmVudF9yZWZzKHN1cGVyX2NzZXEsIGltcGxpY2l0X3BhcmVudCkKKyAgICAgICAgbWVtYmVycyA9IEBtZW1iZXJzLmR1cAorICAgICAgICBubCA9IChtZW1iZXJzLmZpcnN0ID09ICJcbiIgJiYgbWVtYmVycy5zaGlmdCkKKyAgICAgICAgY29udGFpbnNfcGFyZW50X3JlZiA9IGNvbnRhaW5zX3BhcmVudF9yZWY/CisgICAgICAgIHJldHVybiBDb21tYVNlcXVlbmNlLm5ldyhbc2VsZl0pIGlmICFpbXBsaWNpdF9wYXJlbnQgJiYgIWNvbnRhaW5zX3BhcmVudF9yZWYKKworICAgICAgICB1bmxlc3MgY29udGFpbnNfcGFyZW50X3JlZgorICAgICAgICAgIG9sZF9tZW1iZXJzLCBtZW1iZXJzID0gbWVtYmVycywgW10KKyAgICAgICAgICBtZW1iZXJzIDw8IG5sIGlmIG5sCisgICAgICAgICAgbWVtYmVycyA8PCBTaW1wbGVTZXF1ZW5jZS5uZXcoW1BhcmVudC5uZXddLCBmYWxzZSkKKyAgICAgICAgICBtZW1iZXJzICs9IG9sZF9tZW1iZXJzCisgICAgICAgIGVuZAorCisgICAgICAgIENvbW1hU2VxdWVuY2UubmV3KFNhc3M6OlV0aWwucGF0aHMobWVtYmVycy5tYXAgZG8gfHNzZXFfb3Jfb3B8CisgICAgICAgICAgbmV4dCBbc3NlcV9vcl9vcF0gdW5sZXNzIHNzZXFfb3Jfb3AuaXNfYT8oU2ltcGxlU2VxdWVuY2UpCisgICAgICAgICAgc3NlcV9vcl9vcC5yZXNvbHZlX3BhcmVudF9yZWZzKHN1cGVyX2NzZXEpLm1lbWJlcnMKKyAgICAgICAgZW5kKS5tYXAgZG8gfHBhdGh8CisgICAgICAgICAgcGF0aF9tZW1iZXJzID0gcGF0aC5tYXAgZG8gfHNlcV9vcl9vcHwKKyAgICAgICAgICAgIG5leHQgc2VxX29yX29wIHVubGVzcyBzZXFfb3Jfb3AuaXNfYT8oU2VxdWVuY2UpCisgICAgICAgICAgICBzZXFfb3Jfb3AubWVtYmVycworICAgICAgICAgIGVuZAorICAgICAgICAgIGlmIHBhdGhfbWVtYmVycy5sZW5ndGggPT0gMiAmJiBwYXRoX21lbWJlcnNbMV1bMF0gPT0gIlxuIgorICAgICAgICAgICAgcGF0aF9tZW1iZXJzWzBdLnVuc2hpZnQgcGF0aF9tZW1iZXJzWzFdLnNoaWZ0CisgICAgICAgICAgZW5kCisgICAgICAgICAgU2VxdWVuY2UubmV3KHBhdGhfbWVtYmVycy5mbGF0dGVuKQorICAgICAgICBlbmQpCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHdoZXRoZXIgdGhlcmUncyBhIHtQYXJlbnR9IHNlbGVjdG9yIGFueXdoZXJlIGluIHRoaXMgc2VxdWVuY2UuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBkZWYgY29udGFpbnNfcGFyZW50X3JlZj8KKyAgICAgICAgbWVtYmVycy5hbnk/IGRvIHxzc2VxX29yX29wfAorICAgICAgICAgIG5leHQgZmFsc2UgdW5sZXNzIHNzZXFfb3Jfb3AuaXNfYT8oU2ltcGxlU2VxdWVuY2UpCisgICAgICAgICAgbmV4dCB0cnVlIGlmIHNzZXFfb3Jfb3AubWVtYmVycy5maXJzdC5pc19hPyhQYXJlbnQpCisgICAgICAgICAgc3NlcV9vcl9vcC5tZW1iZXJzLmFueT8gZG8gfHNlbHwKKyAgICAgICAgICAgIHNlbC5pc19hPyhQc2V1ZG8pICYmIHNlbC5zZWxlY3RvciAmJiBzZWwuc2VsZWN0b3IuY29udGFpbnNfcGFyZW50X3JlZj8KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBOb24tZGVzdHJ1Y3RpdmVseSBleHRlbmRzIHRoaXMgc2VsZWN0b3Igd2l0aCB0aGUgZXh0ZW5zaW9ucyBzcGVjaWZpZWQgaW4gYSBoYXNoCisgICAgICAjICh3aGljaCBzaG91bGQgY29tZSBmcm9tIHtTYXNzOjpUcmVlOjpWaXNpdG9yczo6Q3NzaXplfSkuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBleHRlbmRzIFtTYXNzOjpVdGlsOjpTdWJzZXRNYXB7U2VsZWN0b3I6OlNpbXBsZSA9PgorICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpDc3NpemU6OkV4dGVuZH1dCisgICAgICAjICAgVGhlIGV4dGVuc2lvbnMgdG8gcGVyZm9ybSBvbiB0aGlzIHNlbGVjdG9yCisgICAgICAjIEBwYXJhbSBwYXJlbnRfZGlyZWN0aXZlcyBbQXJyYXk8U2Fzczo6VHJlZTo6RGlyZWN0aXZlTm9kZT5dCisgICAgICAjICAgVGhlIGRpcmVjdGl2ZXMgY29udGFpbmluZyB0aGlzIHNlbGVjdG9yLgorICAgICAgIyBAcGFyYW0gcmVwbGFjZSBbQm9vbGVhbl0KKyAgICAgICMgICBXaGV0aGVyIHRvIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHNlbGVjdG9yIGVudGlyZWx5IG9yIGluY2x1ZGUKKyAgICAgICMgICBpdCBpbiB0aGUgcmVzdWx0LgorICAgICAgIyBAcGFyYW0gc2VlbiBbU2V0PEFycmF5PFNlbGVjdG9yOjpTaW1wbGU+Pl0KKyAgICAgICMgICBUaGUgc2V0IG9mIHNpbXBsZSBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHJlcGxhY2VkLgorICAgICAgIyBAcGFyYW0gb3JpZ2luYWwgW0Jvb2xlYW5dCisgICAgICAjICAgV2hldGhlciB0aGlzIGlzIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWluZyBleHRlbmRlZCwgYXMgb3Bwb3NlZCB0bworICAgICAgIyAgIHRoZSByZXN1bHQgb2YgYSBwcmV2aW91cyBleHRlbnNpb24gdGhhdCdzIGJlaW5nIHJlLWV4dGVuZGVkLgorICAgICAgIyBAcmV0dXJuIFtBcnJheTxTZXF1ZW5jZT5dIEEgbGlzdCBvZiBzZWxlY3RvcnMgZ2VuZXJhdGVkCisgICAgICAjICAgYnkgZXh0ZW5kaW5nIHRoaXMgc2VsZWN0b3Igd2l0aCBgZXh0ZW5kc2AuCisgICAgICAjICAgVGhlc2UgY29ycmVzcG9uZCB0byBhIHtDb21tYVNlcXVlbmNlfSdzIHtDb21tYVNlcXVlbmNlI21lbWJlcnMgbWVtYmVycyBhcnJheX0uCisgICAgICAjIEBzZWUgQ29tbWFTZXF1ZW5jZSNkb19leHRlbmQKKyAgICAgIGRlZiBkb19leHRlbmQoZXh0ZW5kcywgcGFyZW50X2RpcmVjdGl2ZXMsIHJlcGxhY2UsIHNlZW4sIG9yaWdpbmFsKQorICAgICAgICBleHRlbmRlZF9ub3RfZXhwYW5kZWQgPSBtZW1iZXJzLm1hcCBkbyB8c3NlcV9vcl9vcHwKKyAgICAgICAgICBuZXh0IFtbc3NlcV9vcl9vcF1dIHVubGVzcyBzc2VxX29yX29wLmlzX2E/KFNpbXBsZVNlcXVlbmNlKQorICAgICAgICAgIGV4dGVuZGVkID0gc3NlcV9vcl9vcC5kb19leHRlbmQoZXh0ZW5kcywgcGFyZW50X2RpcmVjdGl2ZXMsIHJlcGxhY2UsIHNlZW4pCisKKyAgICAgICAgICAjIFRoZSBGaXJzdCBMYXcgb2YgRXh0ZW5kIHNheXMgdGhhdCB0aGUgZ2VuZXJhdGVkIHNlbGVjdG9yIHNob3VsZCBoYXZlCisgICAgICAgICAgIyBzcGVjaWZpY2l0eSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhhdCBvZiB0aGUgb3JpZ2luYWwgc2VsZWN0b3IuCisgICAgICAgICAgIyBJbiBvcmRlciB0byBlbnN1cmUgdGhhdCwgd2UgcmVjb3JkIHRoZSBvcmlnaW5hbCBzZWxlY3RvcidzCisgICAgICAgICAgIyAoYGV4dGVuZGVkLmZpcnN0YCkgb3JpZ2luYWwgc3BlY2lmaWNpdHkuCisgICAgICAgICAgZXh0ZW5kZWQuZmlyc3QuYWRkX3NvdXJjZXMhKFtzZWxmXSkgaWYgb3JpZ2luYWwgJiYgIWludmlzaWJsZT8KKworICAgICAgICAgIGV4dGVuZGVkLm1hcCB7fHNlcXwgc2VxLm1lbWJlcnN9CisgICAgICAgIGVuZAorICAgICAgICB3ZWF2ZXMgPSBTYXNzOjpVdGlsLnBhdGhzKGV4dGVuZGVkX25vdF9leHBhbmRlZCkubWFwIHt8cGF0aHwgd2VhdmUocGF0aCl9CisgICAgICAgIHRyaW0od2VhdmVzKS5tYXAge3xwfCBTZXF1ZW5jZS5uZXcocCl9CisgICAgICBlbmQKKworICAgICAgIyBVbmlmaWVzIHRoaXMgd2l0aCBhbm90aGVyIHNlbGVjdG9yIHNlcXVlbmNlIHRvIHByb2R1Y2UgYSBzZWxlY3RvcgorICAgICAgIyB0aGF0IG1hdGNoZXMgKGEgc3Vic2V0IG9mKSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzLgorICAgICAgIworICAgICAgIyBAcGFyYW0gb3RoZXIgW1NlcXVlbmNlXQorICAgICAgIyBAcmV0dXJuIFtDb21tYVNlcXVlbmNlLCBuaWxdIFRoZSB1bmlmaWVkIHNlbGVjdG9yLCBvciBuaWwgaWYgdW5pZmljYXRpb24gZmFpbGVkLgorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBJZiB0aGlzIHNlbGVjdG9yIGNhbm5vdCBiZSB1bmlmaWVkLgorICAgICAgIyAgIFRoaXMgd2lsbCBvbmx5IGV2ZXIgb2NjdXIgd2hlbiBhIGR5bmFtaWMgc2VsZWN0b3IsCisgICAgICAjICAgc3VjaCBhcyB7UGFyZW50fSBvciB7SW50ZXJwb2xhdGlvbn0sIGlzIHVzZWQgaW4gdW5pZmljYXRpb24uCisgICAgICAjICAgU2luY2UgdGhlc2Ugc2VsZWN0b3JzIHNob3VsZCBiZSByZXNvbHZlZAorICAgICAgIyAgIGJ5IHRoZSB0aW1lIGV4dGVuc2lvbiBhbmQgdW5pZmljYXRpb24gaGFwcGVuLAorICAgICAgIyAgIHRoaXMgZXhjZXB0aW9uIHdpbGwgb25seSBldmVyIGJlIHJhaXNlZCBhcyBhIHJlc3VsdCBvZiBwcm9ncmFtbWVyIGVycm9yCisgICAgICBkZWYgdW5pZnkob3RoZXIpCisgICAgICAgIGJhc2UgPSBtZW1iZXJzLmxhc3QKKyAgICAgICAgb3RoZXJfYmFzZSA9IG90aGVyLm1lbWJlcnMubGFzdAorICAgICAgICByZXR1cm4gdW5sZXNzIGJhc2UuaXNfYT8oU2ltcGxlU2VxdWVuY2UpICYmIG90aGVyX2Jhc2UuaXNfYT8oU2ltcGxlU2VxdWVuY2UpCisgICAgICAgIHJldHVybiB1bmxlc3MgKHVuaWZpZWQgPSBvdGhlcl9iYXNlLnVuaWZ5KGJhc2UpKQorCisgICAgICAgIHdvdmVuID0gd2VhdmUoW21lbWJlcnNbMC4uLi0xXSwgb3RoZXIubWVtYmVyc1swLi4uLTFdICsgW3VuaWZpZWRdXSkKKyAgICAgICAgQ29tbWFTZXF1ZW5jZS5uZXcod292ZW4ubWFwIHt8d3wgU2VxdWVuY2UubmV3KHcpfSkKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBzZWxlY3RvciBtYXRjaGVzIGFsbCBlbGVtZW50cworICAgICAgIyB0aGF0IHRoZSBnaXZlbiBzZWxlY3RvciBtYXRjaGVzIChhcyB3ZWxsIGFzIHBvc3NpYmx5IG1vcmUpLgorICAgICAgIworICAgICAgIyBAZXhhbXBsZQorICAgICAgIyAgICguZm9vKS5zdXBlcnNlbGVjdG9yPyguZm9vLmJhcikgIz0+IHRydWUKKyAgICAgICMgICAoLmZvbykuc3VwZXJzZWxlY3Rvcj8oLmJhcikgIz0+IGZhbHNlCisgICAgICAjIEBwYXJhbSBjc2VxIFtTZXF1ZW5jZV0KKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICAgIGRlZiBzdXBlcnNlbGVjdG9yPyhzZXEpCisgICAgICAgIF9zdXBlcnNlbGVjdG9yPyhtZW1iZXJzLCBzZXEubWVtYmVycykKKyAgICAgIGVuZAorCisgICAgICAjIEBzZWUgQWJzdHJhY3RTZXF1ZW5jZSN0b19zCisgICAgICBkZWYgdG9fcyhvcHRzID0ge30pCisgICAgICAgIEBtZW1iZXJzLm1hcCB7fG18IG0uaXNfYT8oU3RyaW5nKSA/IG0gOiBtLnRvX3Mob3B0cyl9LmpvaW4oIiAiKS5nc3ViKC8gP1xuID8vLCAiXG4iKQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VxdWVuY2UuCisgICAgICAjIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzZWxlY3RvciBzdHJpbmcuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgIGRlZiBpbnNwZWN0CisgICAgICAgIG1lbWJlcnMubWFwIHt8bXwgbS5pbnNwZWN0fS5qb2luKCIgIikKKyAgICAgIGVuZAorCisgICAgICAjIEFkZCB0byB0aGUge1NpbXBsZVNlcXVlbmNlI3NvdXJjZXN9IHNldHMgb2YgdGhlIGNoaWxkIHNpbXBsZSBzZXF1ZW5jZXMuCisgICAgICAjIFRoaXMgZGVzdHJ1Y3RpdmVseSBtb2RpZmllcyB0aGlzIHNlcXVlbmNlJ3MgbWVtYmVycyBhcnJheSwgYnV0IG5vdCB0aGUKKyAgICAgICMgY2hpbGQgc2ltcGxlIHNlcXVlbmNlcy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHNvdXJjZXMgW1NldDxTZXF1ZW5jZT5dCisgICAgICBkZWYgYWRkX3NvdXJjZXMhKHNvdXJjZXMpCisgICAgICAgIG1lbWJlcnMubWFwISB7fG18IG0uaXNfYT8oU2ltcGxlU2VxdWVuY2UpID8gbS53aXRoX21vcmVfc291cmNlcyhzb3VyY2VzKSA6IG19CisgICAgICBlbmQKKworICAgICAgIyBDb252ZXJ0cyB0aGUgc3ViamVjdCBvcGVyYXRvciAiISIsIGlmIGl0IGV4aXN0cywgaW50byBhICI6aGFzKCkiCisgICAgICAjIHNlbGVjdG9yLgorICAgICAgIworICAgICAgIyBAcmV0dXIgW1NlcXVlbmNlXQorICAgICAgZGVmIHN1YmplY3RsZXNzCisgICAgICAgIHByZV9zdWJqZWN0ID0gW10KKyAgICAgICAgaGFzID0gW10KKyAgICAgICAgc3ViamVjdCA9IG5pbAorICAgICAgICBtZW1iZXJzLmVhY2ggZG8gfHNzZXFfb3Jfb3B8CisgICAgICAgICAgaWYgc3ViamVjdAorICAgICAgICAgICAgaGFzIDw8IHNzZXFfb3Jfb3AKKyAgICAgICAgICBlbHNpZiBzc2VxX29yX29wLmlzX2E/KFN0cmluZykgfHwgIXNzZXFfb3Jfb3Auc3ViamVjdD8KKyAgICAgICAgICAgIHByZV9zdWJqZWN0IDw8IHNzZXFfb3Jfb3AKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzdWJqZWN0ID0gc3NlcV9vcl9vcC5kdXAKKyAgICAgICAgICAgIHN1YmplY3QubWVtYmVycyA9IHNzZXFfb3Jfb3AubWVtYmVycy5kdXAKKyAgICAgICAgICAgIHN1YmplY3Quc3ViamVjdCA9IGZhbHNlCisgICAgICAgICAgICBoYXMgPSBbXQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICByZXR1cm4gc2VsZiB1bmxlc3Mgc3ViamVjdAorCisgICAgICAgIHVubGVzcyBoYXMuZW1wdHk/CisgICAgICAgICAgc3ViamVjdC5tZW1iZXJzIDw8IFBzZXVkby5uZXcoOmNsYXNzLCAnaGFzJywgbmlsLCBDb21tYVNlcXVlbmNlLm5ldyhbU2VxdWVuY2UubmV3KGhhcyldKSkKKyAgICAgICAgZW5kCisgICAgICAgIFNlcXVlbmNlLm5ldyhwcmVfc3ViamVjdCArIFtzdWJqZWN0XSkKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgICMgQ29uY2VwdHVhbGx5LCB0aGlzIGV4cGFuZHMgInBhcmVudGhlc2l6ZWQgc2VsZWN0b3JzIi4gVGhhdCBpcywgaWYgd2UKKyAgICAgICMgaGF2ZSBgLkEgLkIge0BleHRlbmQgLkN9YCBhbmQgYC5EIC5DIHsuLi59YCwgdGhpcyBjb25jZXB0dWFsbHkgZXhwYW5kcworICAgICAgIyBpbnRvIGAuRCAuQywgLkQgKC5BIC5CKWAsIGFuZCB0aGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgYC5EICguQSAuQilgIGludG8KKyAgICAgICMgYC5EIC5BIC5CLCAuQSAuRCAuQmAuIEZvciB0aG9yb3VnaG5lc3MsIGAuQS5EIC5CYCB3b3VsZCBhbHNvIGJlCisgICAgICAjIHJlcXVpcmVkLCBidXQgaW5jbHVkaW5nIG1lcmdlZCBzZWxlY3RvcnMgcmVzdWx0cyBpbiBleHBvbmVudGlhbCBvdXRwdXQKKyAgICAgICMgZm9yIHZlcnkgbGl0dGxlIGdhaW4uCisgICAgICAjCisgICAgICAjIEBwYXJhbSBwYXRoIFtBcnJheTxBcnJheTxTaW1wbGVTZXF1ZW5jZSBvciBTdHJpbmc+Pl0KKyAgICAgICMgICBBIGxpc3Qgb2YgcGFyZW50aGVzaXplZCBzZWxlY3RvciBncm91cHMuCisgICAgICAjIEByZXR1cm4gW0FycmF5PEFycmF5PFNpbXBsZVNlcXVlbmNlIG9yIFN0cmluZz4+XSBBIGxpc3Qgb2YgZnVsbHktZXhwYW5kZWQgc2VsZWN0b3JzLgorICAgICAgZGVmIHdlYXZlKHBhdGgpCisgICAgICAgICMgVGhpcyBmdW5jdGlvbiB3b3JrcyBieSBtb3ZpbmcgdGhyb3VnaCB0aGUgc2VsZWN0b3IgcGF0aCBsZWZ0LXRvLXJpZ2h0LAorICAgICAgICAjIGJ1aWxkaW5nIGFsbCBwb3NzaWJsZSBwcmVmaXhlcyBzaW11bHRhbmVvdXNseS4KKyAgICAgICAgcHJlZml4ZXMgPSBbW11dCisKKyAgICAgICAgcGF0aC5lYWNoIGRvIHxjdXJyZW50fAorICAgICAgICAgIG5leHQgaWYgY3VycmVudC5lbXB0eT8KKyAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5kdXAKKyAgICAgICAgICBsYXN0X2N1cnJlbnQgPSBbY3VycmVudC5wb3BdCisgICAgICAgICAgcHJlZml4ZXMgPSBwcmVmaXhlcy5tYXAgZG8gfHByZWZpeHwKKyAgICAgICAgICAgIHN1YiA9IHN1YndlYXZlKHByZWZpeCwgY3VycmVudCkKKyAgICAgICAgICAgIG5leHQgW10gdW5sZXNzIHN1YgorICAgICAgICAgICAgc3ViLm1hcCB7fHNlcXN8IHNlcXMgKyBsYXN0X2N1cnJlbnR9CisgICAgICAgICAgZW5kLmZsYXR0ZW4oMSkKKyAgICAgICAgZW5kCisgICAgICAgIHByZWZpeGVzCisgICAgICBlbmQKKworICAgICAgIyBUaGlzIGludGVyd2VhdmVzIHR3byBsaXN0cyBvZiBzZWxlY3RvcnMsCisgICAgICAjIHJldHVybmluZyBhbGwgcG9zc2libGUgb3JkZXJpbmdzIG9mIHRoZW0gKGluY2x1ZGluZyB1c2luZyB1bmlmaWNhdGlvbikKKyAgICAgICMgdGhhdCBtYWludGFpbiB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgdGhlIGlucHV0IGFycmF5cy4KKyAgICAgICMKKyAgICAgICMgRm9yIGV4YW1wbGUsIGdpdmVuIGAuZm9vIC5iYXJgIGFuZCBgLmJheiAuYmFuZ2AsCisgICAgICAjIHRoaXMgd291bGQgcmV0dXJuIGAuZm9vIC5iYXIgLmJheiAuYmFuZ2AsIGAuZm9vIC5iYXIuYmF6IC5iYW5nYCwKKyAgICAgICMgYC5mb28gLmJheiAuYmFyIC5iYW5nYCwgYC5mb28gLmJheiAuYmFyLmJhbmdgLCBgLmZvbyAuYmF6IC5iYW5nIC5iYXJgLAorICAgICAgIyBhbmQgc28gb24gdW50aWwgYC5iYXogLmJhbmcgLmZvbyAuYmFyYC4KKyAgICAgICMKKyAgICAgICMgU2VtYW50aWNhbGx5LCBmb3Igc2VsZWN0b3JzIEEgYW5kIEIsIHRoaXMgcmV0dXJucyBhbGwgc2VsZWN0b3JzIGBBQl9pYAorICAgICAgIyBzdWNoIHRoYXQgdGhlIHVuaW9uIG92ZXIgYWxsIGkgb2YgZWxlbWVudHMgbWF0Y2hlZCBieSBgQUJfaSBYYCBpcworICAgICAgIyBpZGVudGljYWwgdG8gdGhlIGludGVyc2VjdGlvbiBvZiBhbGwgZWxlbWVudHMgbWF0Y2hlZCBieSBgQSBYYCBhbmQgYWxsCisgICAgICAjIGVsZW1lbnRzIG1hdGNoZWQgYnkgYEIgWGAuIFNvbWUgYEFCX2lgIGFyZSBlbGlkZWQgdG8gcmVkdWNlIHRoZSBzaXplIG9mCisgICAgICAjIHRoZSBvdXRwdXQuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBzZXExIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSBvciBTdHJpbmc+XQorICAgICAgIyBAcGFyYW0gc2VxMiBbQXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nPl0KKyAgICAgICMgQHJldHVybiBbQXJyYXk8QXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nPj5dCisgICAgICBkZWYgc3Vid2VhdmUoc2VxMSwgc2VxMikKKyAgICAgICAgcmV0dXJuIFtzZXEyXSBpZiBzZXExLmVtcHR5PworICAgICAgICByZXR1cm4gW3NlcTFdIGlmIHNlcTIuZW1wdHk/CisKKyAgICAgICAgc2VxMSwgc2VxMiA9IHNlcTEuZHVwLCBzZXEyLmR1cAorICAgICAgICByZXR1cm4gdW5sZXNzIChpbml0ID0gbWVyZ2VfaW5pdGlhbF9vcHMoc2VxMSwgc2VxMikpCisgICAgICAgIHJldHVybiB1bmxlc3MgKGZpbiA9IG1lcmdlX2ZpbmFsX29wcyhzZXExLCBzZXEyKSkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGVyZSdzIG9ubHkgb25lIHJvb3Qgc2VsZWN0b3IgaW4gdGhlIG91dHB1dC4KKyAgICAgICAgcm9vdDEgPSBoYXNfcm9vdD8oc2VxMS5maXJzdCkgJiYgc2VxMS5zaGlmdAorICAgICAgICByb290MiA9IGhhc19yb290PyhzZXEyLmZpcnN0KSAmJiBzZXEyLnNoaWZ0CisgICAgICAgIGlmIHJvb3QxICYmIHJvb3QyCisgICAgICAgICAgcmV0dXJuIHVubGVzcyAocm9vdCA9IHJvb3QxLnVuaWZ5KHJvb3QyKSkKKyAgICAgICAgICBzZXExLnVuc2hpZnQgcm9vdAorICAgICAgICAgIHNlcTIudW5zaGlmdCByb290CisgICAgICAgIGVsc2lmIHJvb3QxCisgICAgICAgICAgc2VxMi51bnNoaWZ0IHJvb3QxCisgICAgICAgIGVsc2lmIHJvb3QyCisgICAgICAgICAgc2VxMS51bnNoaWZ0IHJvb3QyCisgICAgICAgIGVuZAorCisgICAgICAgIHNlcTEgPSBncm91cF9zZWxlY3RvcnMoc2VxMSkKKyAgICAgICAgc2VxMiA9IGdyb3VwX3NlbGVjdG9ycyhzZXEyKQorICAgICAgICBsY3MgPSBTYXNzOjpVdGlsLmxjcyhzZXEyLCBzZXExKSBkbyB8czEsIHMyfAorICAgICAgICAgIG5leHQgczEgaWYgczEgPT0gczIKKyAgICAgICAgICBuZXh0IHVubGVzcyBzMS5maXJzdC5pc19hPyhTaW1wbGVTZXF1ZW5jZSkgJiYgczIuZmlyc3QuaXNfYT8oU2ltcGxlU2VxdWVuY2UpCisgICAgICAgICAgbmV4dCBzMiBpZiBwYXJlbnRfc3VwZXJzZWxlY3Rvcj8oczEsIHMyKQorICAgICAgICAgIG5leHQgczEgaWYgcGFyZW50X3N1cGVyc2VsZWN0b3I/KHMyLCBzMSkKKyAgICAgICAgICBuZXh0IHVubGVzcyBtdXN0X3VuaWZ5PyhzMSwgczIpCisgICAgICAgICAgbmV4dCB1bmxlc3MgKHVuaWZpZWQgPSBTZXF1ZW5jZS5uZXcoczEpLnVuaWZ5KFNlcXVlbmNlLm5ldyhzMikpKQorICAgICAgICAgIHVuaWZpZWQubWVtYmVycy5maXJzdC5tZW1iZXJzIGlmIHVuaWZpZWQubWVtYmVycy5sZW5ndGggPT0gMQorICAgICAgICBlbmQKKworICAgICAgICBkaWZmID0gW1tpbml0XV0KKworICAgICAgICB1bnRpbCBsY3MuZW1wdHk/CisgICAgICAgICAgZGlmZiA8PCBjaHVua3Moc2VxMSwgc2VxMikge3xzfCBwYXJlbnRfc3VwZXJzZWxlY3Rvcj8ocy5maXJzdCwgbGNzLmZpcnN0KX0gPDwgW2xjcy5zaGlmdF0KKyAgICAgICAgICBzZXExLnNoaWZ0CisgICAgICAgICAgc2VxMi5zaGlmdAorICAgICAgICBlbmQKKyAgICAgICAgZGlmZiA8PCBjaHVua3Moc2VxMSwgc2VxMikge3xzfCBzLmVtcHR5P30KKyAgICAgICAgZGlmZiArPSBmaW4ubWFwIHt8c2VsfCBzZWwuaXNfYT8oQXJyYXkpID8gc2VsIDogW3NlbF19CisgICAgICAgIGRpZmYucmVqZWN0ISB7fGN8IGMuZW1wdHk/fQorCisgICAgICAgIFNhc3M6OlV0aWwucGF0aHMoZGlmZikubWFwIHt8cHwgcC5mbGF0dGVufS5yZWplY3Qge3xwfCBwYXRoX2hhc190d29fc3ViamVjdHM/KHApfQorICAgICAgZW5kCisKKyAgICAgICMgRXh0cmFjdHMgaW5pdGlhbCBzZWxlY3RvciBjb21iaW5hdG9ycyAoYCIrImAsIGAiPiJgLCBgIn4iYCwgYW5kIGAiXG4iYCkKKyAgICAgICMgZnJvbSB0d28gc2VxdWVuY2VzIGFuZCBtZXJnZXMgdGhlbSB0b2dldGhlciBpbnRvIGEgc2luZ2xlIGFycmF5IG9mCisgICAgICAjIHNlbGVjdG9yIGNvbWJpbmF0b3JzLgorICAgICAgIworICAgICAgIyBAcGFyYW0gc2VxMSBbQXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nPl0KKyAgICAgICMgQHBhcmFtIHNlcTIgW0FycmF5PFNpbXBsZVNlcXVlbmNlIG9yIFN0cmluZz5dCisgICAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZz4sIG5pbF0gSWYgdGhlcmUgYXJlIG5vIG9wZXJhdG9ycyBpbiB0aGUgbWVyZ2VkCisgICAgICAjICAgc2VxdWVuY2UsIHRoaXMgd2lsbCBiZSB0aGUgZW1wdHkgYXJyYXkuIElmIHRoZSBvcGVyYXRvcnMgY2Fubm90IGJlCisgICAgICAjICAgbWVyZ2VkLCB0aGlzIHdpbGwgYmUgbmlsLgorICAgICAgZGVmIG1lcmdlX2luaXRpYWxfb3BzKHNlcTEsIHNlcTIpCisgICAgICAgIG9wczEsIG9wczIgPSBbXSwgW10KKyAgICAgICAgb3BzMSA8PCBzZXExLnNoaWZ0IHdoaWxlIHNlcTEuZmlyc3QuaXNfYT8oU3RyaW5nKQorICAgICAgICBvcHMyIDw8IHNlcTIuc2hpZnQgd2hpbGUgc2VxMi5maXJzdC5pc19hPyhTdHJpbmcpCisKKyAgICAgICAgbmV3bGluZSA9IGZhbHNlCisgICAgICAgIG5ld2xpbmUgfHw9ICEhb3BzMS5zaGlmdCBpZiBvcHMxLmZpcnN0ID09ICJcbiIKKyAgICAgICAgbmV3bGluZSB8fD0gISFvcHMyLnNoaWZ0IGlmIG9wczIuZmlyc3QgPT0gIlxuIgorCisgICAgICAgICMgSWYgbmVpdGhlciBzZXF1ZW5jZSBpcyBhIHN1YnNlcXVlbmNlIG9mIHRoZSBvdGhlciwgdGhleSBjYW5ub3QgYmUKKyAgICAgICAgIyBtZXJnZWQgc3VjY2Vzc2Z1bGx5CisgICAgICAgIGxjcyA9IFNhc3M6OlV0aWwubGNzKG9wczEsIG9wczIpCisgICAgICAgIHJldHVybiB1bmxlc3MgbGNzID09IG9wczEgfHwgbGNzID09IG9wczIKKyAgICAgICAgKG5ld2xpbmUgPyBbIlxuIl0gOiBbXSkgKyAob3BzMS5zaXplID4gb3BzMi5zaXplID8gb3BzMSA6IG9wczIpCisgICAgICBlbmQKKworICAgICAgIyBFeHRyYWN0cyBmaW5hbCBzZWxlY3RvciBjb21iaW5hdG9ycyAoYCIrImAsIGAiPiJgLCBgIn4iYCkgYW5kIHRoZQorICAgICAgIyBzZWxlY3RvcnMgdG8gd2hpY2ggdGhleSBhcHBseSBmcm9tIHR3byBzZXF1ZW5jZXMgYW5kIG1lcmdlcyB0aGVtCisgICAgICAjIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgYXJyYXkuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBzZXExIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSBvciBTdHJpbmc+XQorICAgICAgIyBAcGFyYW0gc2VxMiBbQXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nPl0KKyAgICAgICMgQHJldHVybiBbQXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nIG9yCisgICAgICAjICAgICBBcnJheTxBcnJheTxTaW1wbGVTZXF1ZW5jZSBvciBTdHJpbmc+Pl0KKyAgICAgICMgICBJZiB0aGVyZSBhcmUgbm8gdHJhaWxpbmcgY29tYmluYXRvcnMgdG8gYmUgbWVyZ2VkLCB0aGlzIHdpbGwgYmUgdGhlCisgICAgICAjICAgZW1wdHkgYXJyYXkuIElmIHRoZSB0cmFpbGluZyBjb21iaW5hdG9ycyBjYW5ub3QgYmUgbWVyZ2VkLCB0aGlzIHdpbGwKKyAgICAgICMgICBiZSBuaWwuIE90aGVyd2lzZSwgdGhpcyB3aWxsIGNvbnRhaW5lZCB0aGUgbWVyZ2VkIHNlbGVjdG9yLiBBcnJheQorICAgICAgIyAgIGVsZW1lbnRzIGFyZSBbU2Fzczo6VXRpbCNwYXRoc10tc3R5bGUgb3B0aW9uczsgY29uY2VwdHVhbGx5LCBhbiAib3IiCisgICAgICAjICAgb2YgbXVsdGlwbGUgc2VsZWN0b3JzLgorICAgICAgIyBAY29tbWVudAorICAgICAgIyAgIHJ1Ym9jb3A6ZGlzYWJsZSBNZXRob2RMZW5ndGgKKyAgICAgIGRlZiBtZXJnZV9maW5hbF9vcHMoc2VxMSwgc2VxMiwgcmVzID0gW10pCisgICAgICAgIG9wczEsIG9wczIgPSBbXSwgW10KKyAgICAgICAgb3BzMSA8PCBzZXExLnBvcCB3aGlsZSBzZXExLmxhc3QuaXNfYT8oU3RyaW5nKQorICAgICAgICBvcHMyIDw8IHNlcTIucG9wIHdoaWxlIHNlcTIubGFzdC5pc19hPyhTdHJpbmcpCisKKyAgICAgICAgIyBOb3Qgd29ydGggdGhlIGhlYWRhY2hlIG9mIHRyeWluZyB0byBwcmVzZXJ2ZSBuZXdsaW5lcyBoZXJlLiBUaGUgbW9zdAorICAgICAgICAjIGltcG9ydGFudCB1c2Ugb2YgbmV3bGluZXMgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VsZWN0b3IgdG8gd3JhcAorICAgICAgICAjIGFjcm9zcyBsaW5lcyBhbnl3YXkuCisgICAgICAgIG9wczEucmVqZWN0ISB7fG98IG8gPT0gIlxuIn0KKyAgICAgICAgb3BzMi5yZWplY3QhIHt8b3wgbyA9PSAiXG4ifQorCisgICAgICAgIHJldHVybiByZXMgaWYgb3BzMS5lbXB0eT8gJiYgb3BzMi5lbXB0eT8KKyAgICAgICAgaWYgb3BzMS5zaXplID4gMSB8fCBvcHMyLnNpemUgPiAxCisgICAgICAgICAgIyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgb3BlcmF0b3JzLCBzb21ldGhpbmcgaGFja3kncyBnb2luZyBvbi4gSWYgb25lCisgICAgICAgICAgIyBpcyBhIHN1cGVyc2VxdWVuY2Ugb2YgdGhlIG90aGVyLCB1c2UgdGhhdCwgb3RoZXJ3aXNlIGdpdmUgdXAuCisgICAgICAgICAgbGNzID0gU2Fzczo6VXRpbC5sY3Mob3BzMSwgb3BzMikKKyAgICAgICAgICByZXR1cm4gdW5sZXNzIGxjcyA9PSBvcHMxIHx8IGxjcyA9PSBvcHMyCisgICAgICAgICAgcmVzLnVuc2hpZnQoKihvcHMxLnNpemUgPiBvcHMyLnNpemUgPyBvcHMxIDogb3BzMikucmV2ZXJzZSkKKyAgICAgICAgICByZXR1cm4gcmVzCisgICAgICAgIGVuZAorCisgICAgICAgICMgVGhpcyBjb2RlIGxvb2tzIGNvbXBsaWNhdGVkLCBidXQgaXQncyBhY3R1YWxseSBqdXN0IGEgYnVuY2ggb2Ygc3BlY2lhbAorICAgICAgICAjIGNhc2VzIGZvciBpbnRlcmFjdGlvbnMgYmV0d2VlbiBkaWZmZXJlbnQgY29tYmluYXRvcnMuCisgICAgICAgIG9wMSwgb3AyID0gb3BzMS5maXJzdCwgb3BzMi5maXJzdAorICAgICAgICBpZiBvcDEgJiYgb3AyCisgICAgICAgICAgc2VsMSA9IHNlcTEucG9wCisgICAgICAgICAgc2VsMiA9IHNlcTIucG9wCisgICAgICAgICAgaWYgb3AxID09ICd+JyAmJiBvcDIgPT0gJ34nCisgICAgICAgICAgICBpZiBzZWwxLnN1cGVyc2VsZWN0b3I/KHNlbDIpCisgICAgICAgICAgICAgIHJlcy51bnNoaWZ0IHNlbDIsICd+JworICAgICAgICAgICAgZWxzaWYgc2VsMi5zdXBlcnNlbGVjdG9yPyhzZWwxKQorICAgICAgICAgICAgICByZXMudW5zaGlmdCBzZWwxLCAnficKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbWVyZ2VkID0gc2VsMS51bmlmeShzZWwyKQorICAgICAgICAgICAgICByZXMudW5zaGlmdCBbCisgICAgICAgICAgICAgICAgW3NlbDEsICd+Jywgc2VsMiwgJ34nXSwKKyAgICAgICAgICAgICAgICBbc2VsMiwgJ34nLCBzZWwxLCAnfiddLAorICAgICAgICAgICAgICAgIChbbWVyZ2VkLCAnfiddIGlmIG1lcmdlZCkKKyAgICAgICAgICAgICAgXS5jb21wYWN0CisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbHNpZiAob3AxID09ICd+JyAmJiBvcDIgPT0gJysnKSB8fCAob3AxID09ICcrJyAmJiBvcDIgPT0gJ34nKQorICAgICAgICAgICAgaWYgb3AxID09ICd+JworICAgICAgICAgICAgICB0aWxkZV9zZWwsIHBsdXNfc2VsID0gc2VsMSwgc2VsMgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0aWxkZV9zZWwsIHBsdXNfc2VsID0gc2VsMiwgc2VsMQorICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICAgIGlmIHRpbGRlX3NlbC5zdXBlcnNlbGVjdG9yPyhwbHVzX3NlbCkKKyAgICAgICAgICAgICAgcmVzLnVuc2hpZnQgcGx1c19zZWwsICcrJworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtZXJnZWQgPSBwbHVzX3NlbC51bmlmeSh0aWxkZV9zZWwpCisgICAgICAgICAgICAgIHJlcy51bnNoaWZ0IFsKKyAgICAgICAgICAgICAgICBbdGlsZGVfc2VsLCAnficsIHBsdXNfc2VsLCAnKyddLAorICAgICAgICAgICAgICAgIChbbWVyZ2VkLCAnKyddIGlmIG1lcmdlZCkKKyAgICAgICAgICAgICAgXS5jb21wYWN0CisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbHNpZiBvcDEgPT0gJz4nICYmICV3KH4gKykuaW5jbHVkZT8ob3AyKQorICAgICAgICAgICAgcmVzLnVuc2hpZnQgc2VsMiwgb3AyCisgICAgICAgICAgICBzZXExLnB1c2ggc2VsMSwgb3AxCisgICAgICAgICAgZWxzaWYgb3AyID09ICc+JyAmJiAldyh+ICspLmluY2x1ZGU/KG9wMSkKKyAgICAgICAgICAgIHJlcy51bnNoaWZ0IHNlbDEsIG9wMQorICAgICAgICAgICAgc2VxMi5wdXNoIHNlbDIsIG9wMgorICAgICAgICAgIGVsc2lmIG9wMSA9PSBvcDIKKyAgICAgICAgICAgIG1lcmdlZCA9IHNlbDEudW5pZnkoc2VsMikKKyAgICAgICAgICAgIHJldHVybiB1bmxlc3MgbWVyZ2VkCisgICAgICAgICAgICByZXMudW5zaGlmdCBtZXJnZWQsIG9wMQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgVW5rbm93biBzZWxlY3RvciBjb21iaW5hdG9ycyBjYW4ndCBiZSB1bmlmaWVkCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICBlbmQKKyAgICAgICAgICByZXR1cm4gbWVyZ2VfZmluYWxfb3BzKHNlcTEsIHNlcTIsIHJlcykKKyAgICAgICAgZWxzaWYgb3AxCisgICAgICAgICAgc2VxMi5wb3AgaWYgb3AxID09ICc+JyAmJiBzZXEyLmxhc3QgJiYgc2VxMi5sYXN0LnN1cGVyc2VsZWN0b3I/KHNlcTEubGFzdCkKKyAgICAgICAgICByZXMudW5zaGlmdCBzZXExLnBvcCwgb3AxCisgICAgICAgICAgcmV0dXJuIG1lcmdlX2ZpbmFsX29wcyhzZXExLCBzZXEyLCByZXMpCisgICAgICAgIGVsc2UgIyBvcDIKKyAgICAgICAgICBzZXExLnBvcCBpZiBvcDIgPT0gJz4nICYmIHNlcTEubGFzdCAmJiBzZXExLmxhc3Quc3VwZXJzZWxlY3Rvcj8oc2VxMi5sYXN0KQorICAgICAgICAgIHJlcy51bnNoaWZ0IHNlcTIucG9wLCBvcDIKKyAgICAgICAgICByZXR1cm4gbWVyZ2VfZmluYWxfb3BzKHNlcTEsIHNlcTIsIHJlcykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgICMgQGNvbW1lbnQKKyAgICAgICMgICBydWJvY29wOmVuYWJsZSBNZXRob2RMZW5ndGgKKworICAgICAgIyBUYWtlcyBpbml0aWFsIHN1YnNlcXVlbmNlcyBvZiBgc2VxMWAgYW5kIGBzZXEyYCBhbmQgcmV0dXJucyBhbGwKKyAgICAgICMgb3JkZXJpbmdzIG9mIHRob3NlIHN1YnNlcXVlbmNlcy4gVGhlIGluaXRpYWwgc3Vic2VxdWVuY2VzIGFyZSBkZXRlcm1pbmVkCisgICAgICAjIGJ5IGEgYmxvY2suCisgICAgICAjCisgICAgICAjIERlc3RydWN0aXZlbHkgcmVtb3ZlcyB0aGUgaW5pdGlhbCBzdWJzZXF1ZW5jZXMgb2YgYHNlcTFgIGFuZCBgc2VxMmAuCisgICAgICAjCisgICAgICAjIEZvciBleGFtcGxlLCBnaXZlbiBgKEEgQiBDIHwgRCBFKWAgYW5kIGAoMSAyIHwgMyA0IDUpYCAod2l0aCBgfGAKKyAgICAgICMgZGVub3RpbmcgdGhlIGJvdW5kYXJ5IG9mIHRoZSBpbml0aWFsIHN1YnNlcXVlbmNlKSwgdGhpcyB3b3VsZCByZXR1cm4KKyAgICAgICMgYFsoQSBCIEMgMSAyKSwgKDEgMiBBIEIgQyldYC4gVGhlIHNlcXVlbmNlcyB3b3VsZCB0aGVuIGJlIGAoRCBFKWAgYW5kCisgICAgICAjIGAoMyA0IDUpYC4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHNlcTEgW0FycmF5XQorICAgICAgIyBAcGFyYW0gc2VxMiBbQXJyYXldCisgICAgICAjIEB5aWVsZCBbYV0gVXNlZCB0byBkZXRlcm1pbmUgd2hlbiB0byBjdXQgb2ZmIHRoZSBpbml0aWFsIHN1YnNlcXVlbmNlcy4KKyAgICAgICMgICBDYWxsZWQgcmVwZWF0ZWRseSBmb3IgZWFjaCBzZXF1ZW5jZSB1bnRpbCBpdCByZXR1cm5zIHRydWUuCisgICAgICAjIEB5aWVsZHBhcmFtIGEgW0FycmF5XSBBIGZpbmFsIHN1YnNlcXVlbmNlIG9mIG9uZSBpbnB1dCBzZXF1ZW5jZSBhZnRlcgorICAgICAgIyAgIGN1dHRpbmcgb2ZmIHNvbWUgaW5pdGlhbCBzdWJzZXF1ZW5jZS4KKyAgICAgICMgQHlpZWxkcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIG9yIG5vdCB0byBjdXQgb2ZmIHRoZSBpbml0aWFsIHN1YnNlcXVlbmNlCisgICAgICAjICAgaGVyZS4KKyAgICAgICMgQHJldHVybiBbQXJyYXk8QXJyYXk+XSBBbGwgcG9zc2libGUgb3JkZXJpbmdzIG9mIHRoZSBpbml0aWFsIHN1YnNlcXVlbmNlcy4KKyAgICAgIGRlZiBjaHVua3Moc2VxMSwgc2VxMikKKyAgICAgICAgY2h1bmsxID0gW10KKyAgICAgICAgY2h1bmsxIDw8IHNlcTEuc2hpZnQgdW50aWwgeWllbGQgc2VxMQorICAgICAgICBjaHVuazIgPSBbXQorICAgICAgICBjaHVuazIgPDwgc2VxMi5zaGlmdCB1bnRpbCB5aWVsZCBzZXEyCisgICAgICAgIHJldHVybiBbXSBpZiBjaHVuazEuZW1wdHk/ICYmIGNodW5rMi5lbXB0eT8KKyAgICAgICAgcmV0dXJuIFtjaHVuazJdIGlmIGNodW5rMS5lbXB0eT8KKyAgICAgICAgcmV0dXJuIFtjaHVuazFdIGlmIGNodW5rMi5lbXB0eT8KKyAgICAgICAgW2NodW5rMSArIGNodW5rMiwgY2h1bmsyICsgY2h1bmsxXQorICAgICAgZW5kCisKKyAgICAgICMgR3JvdXBzIGEgc2VxdWVuY2UgaW50byBzdWJzZXF1ZW5jZXMuIFRoZSBzdWJzZXF1ZW5jZXMgYXJlIGRldGVybWluZWQgYnkKKyAgICAgICMgc3RyaW5nczsgYWRqYWNlbnQgbm9uLXN0cmluZyBlbGVtZW50cyB3aWxsIGJlIHB1dCBpbnRvIHNlcGFyYXRlIGdyb3VwcywKKyAgICAgICMgYnV0IGFueSBlbGVtZW50IGFkamFjZW50IHRvIGEgc3RyaW5nIHdpbGwgYmUgZ3JvdXBlZCB3aXRoIHRoYXQgc3RyaW5nLgorICAgICAgIworICAgICAgIyBGb3IgZXhhbXBsZSwgYChBIEIgIkMiIEQgRSAiRiIgRyAiSCIgIkkiIEopYCB3aWxsIGJlY29tZSBgWyhBKSAoQiAiQyIgRCkKKyAgICAgICMgKEUgIkYiIEcgIkgiICJJIiBKKV1gLgorICAgICAgIworICAgICAgIyBAcGFyYW0gc2VxIFtBcnJheV0KKyAgICAgICMgQHJldHVybiBbQXJyYXk8QXJyYXk+XQorICAgICAgZGVmIGdyb3VwX3NlbGVjdG9ycyhzZXEpCisgICAgICAgIG5ld3NlcSA9IFtdCisgICAgICAgIHRhaWwgPSBzZXEuZHVwCisgICAgICAgIHVudGlsIHRhaWwuZW1wdHk/CisgICAgICAgICAgaGVhZCA9IFtdCisgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgIGhlYWQgPDwgdGFpbC5zaGlmdAorICAgICAgICAgIGVuZCB3aGlsZSAhdGFpbC5lbXB0eT8gJiYgaGVhZC5sYXN0LmlzX2E/KFN0cmluZykgfHwgdGFpbC5maXJzdC5pc19hPyhTdHJpbmcpCisgICAgICAgICAgbmV3c2VxIDw8IGhlYWQKKyAgICAgICAgZW5kCisgICAgICAgIG5ld3NlcQorICAgICAgZW5kCisKKyAgICAgICMgR2l2ZW4gdHdvIHNlbGVjdG9yIHNlcXVlbmNlcywgcmV0dXJucyB3aGV0aGVyIGBzZXExYCBpcyBhCisgICAgICAjIHN1cGVyc2VsZWN0b3Igb2YgYHNlcTJgOyB0aGF0IGlzLCB3aGV0aGVyIGBzZXExYCBtYXRjaGVzIGV2ZXJ5CisgICAgICAjIGVsZW1lbnQgYHNlcTJgIG1hdGNoZXMuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBzZXExIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSBvciBTdHJpbmc+XQorICAgICAgIyBAcGFyYW0gc2VxMiBbQXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nPl0KKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICAgIGRlZiBfc3VwZXJzZWxlY3Rvcj8oc2VxMSwgc2VxMikKKyAgICAgICAgc2VxMSA9IHNlcTEucmVqZWN0IHt8ZXwgZSA9PSAiXG4ifQorICAgICAgICBzZXEyID0gc2VxMi5yZWplY3Qge3xlfCBlID09ICJcbiJ9CisgICAgICAgICMgU2VsZWN0b3JzIHdpdGggbGVhZGluZyBvciB0cmFpbGluZyBvcGVyYXRvcnMgYXJlIG5laXRoZXIKKyAgICAgICAgIyBzdXBlcnNlbGVjdG9ycyBub3Igc3Vic2VsZWN0b3JzLgorICAgICAgICByZXR1cm4gaWYgc2VxMS5sYXN0LmlzX2E/KFN0cmluZykgfHwgc2VxMi5sYXN0LmlzX2E/KFN0cmluZykgfHwKKyAgICAgICAgICBzZXExLmZpcnN0LmlzX2E/KFN0cmluZykgfHwgc2VxMi5maXJzdC5pc19hPyhTdHJpbmcpCisgICAgICAgICMgTW9yZSBjb21wbGV4IHNlbGVjdG9ycyBhcmUgbmV2ZXIgc3VwZXJzZWxlY3RvcnMgb2YgbGVzcyBjb21wbGV4IG9uZXMKKyAgICAgICAgcmV0dXJuIGlmIHNlcTEuc2l6ZSA+IHNlcTIuc2l6ZQorICAgICAgICByZXR1cm4gc2VxMS5maXJzdC5zdXBlcnNlbGVjdG9yPyhzZXEyLmxhc3QsIHNlcTJbMC4uLi0xXSkgaWYgc2VxMS5zaXplID09IDEKKworICAgICAgICBfLCBzaSA9IHNlcTIuZWFjaF93aXRoX2luZGV4LmZpbmQgZG8gfGUsIGl8CisgICAgICAgICAgcmV0dXJuIGlmIGkgPT0gc2VxMi5zaXplIC0gMQorICAgICAgICAgIG5leHQgaWYgZS5pc19hPyhTdHJpbmcpCisgICAgICAgICAgc2VxMS5maXJzdC5zdXBlcnNlbGVjdG9yPyhlLCBzZXEyWzAuLi5pXSkKKyAgICAgICAgZW5kCisgICAgICAgIHJldHVybiB1bmxlc3Mgc2kKKworICAgICAgICBpZiBzZXExWzFdLmlzX2E/KFN0cmluZykKKyAgICAgICAgICByZXR1cm4gdW5sZXNzIHNlcTJbc2kgKyAxXS5pc19hPyhTdHJpbmcpCisKKyAgICAgICAgICAjIC5mb28gfiAuYmFyIGlzIGEgc3VwZXJzZWxlY3RvciBvZiAuZm9vICsgLmJhcgorICAgICAgICAgIHJldHVybiB1bmxlc3Mgc2VxMVsxXSA9PSAifiIgPyBzZXEyW3NpICsgMV0gIT0gIj4iIDogc2VxMVsxXSA9PSBzZXEyW3NpICsgMV0KKworICAgICAgICAgICMgLmZvbyA+IC5iYXogaXMgbm90IGEgc3VwZXJzZWxlY3RvciBvZiAuZm9vID4gLmJhciA+IC5iYXogb3IgLmZvbyA+CisgICAgICAgICAgIyAuYmFyIC5iYXosIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCAuYmF6IGlzIGEgc3VwZXJzZWxlY3RvciBvZiAuYmFyID4KKyAgICAgICAgICAjIC5iYXogYW5kIC5iYXIgLmJhei4gU2FtZSBnb2VzIGZvciArIGFuZCB+LgorICAgICAgICAgIHJldHVybiBpZiBzZXExLmxlbmd0aCA9PSAzICYmIHNlcTIubGVuZ3RoID4gMworCisgICAgICAgICAgcmV0dXJuIF9zdXBlcnNlbGVjdG9yPyhzZXExWzIuLi0xXSwgc2VxMltzaSArIDIuLi0xXSkKKyAgICAgICAgZWxzaWYgc2VxMltzaSArIDFdLmlzX2E/KFN0cmluZykKKyAgICAgICAgICByZXR1cm4gdW5sZXNzIHNlcTJbc2kgKyAxXSA9PSAiPiIKKyAgICAgICAgICByZXR1cm4gX3N1cGVyc2VsZWN0b3I/KHNlcTFbMS4uLTFdLCBzZXEyW3NpICsgMi4uLTFdKQorICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIF9zdXBlcnNlbGVjdG9yPyhzZXExWzEuLi0xXSwgc2VxMltzaSArIDEuLi0xXSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBMaWtlIFx7I19zdXBlcnNlbGVjdG9yP30sIGJ1dCBjb21wYXJlcyB0aGUgc2VsZWN0b3JzIGluIHRoZQorICAgICAgIyBjb250ZXh0IG9mIHBhcmVudCBzZWxlY3RvcnMsIGFzIHRob3VnaCB0aGV5IHNoYXJlZCBhbiBpbXBsaWNpdAorICAgICAgIyBiYXNlIHNpbXBsZSBzZWxlY3Rvci4gRm9yIGV4YW1wbGUsIGBCYCBpcyBub3Qgbm9ybWFsbHkgYQorICAgICAgIyBzdXBlcnNlbGVjdG9yIG9mIGBCIEFgLCBzaW5jZSBpdCBkb2Vzbid0IG1hdGNoIGBBYCBlbGVtZW50cy4KKyAgICAgICMgSG93ZXZlciwgaXQgaXMgYSBwYXJlbnQgc3VwZXJzZWxlY3Rvciwgc2luY2UgYEIgWGAgaXMgYQorICAgICAgIyBzdXBlcnNlbGVjdG9yIG9mIGBCIEEgWGAuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBzZXExIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSBvciBTdHJpbmc+XQorICAgICAgIyBAcGFyYW0gc2VxMiBbQXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nPl0KKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICAgIGRlZiBwYXJlbnRfc3VwZXJzZWxlY3Rvcj8oc2VxMSwgc2VxMikKKyAgICAgICAgYmFzZSA9IFNhc3M6OlNlbGVjdG9yOjpTaW1wbGVTZXF1ZW5jZS5uZXcoW1Nhc3M6OlNlbGVjdG9yOjpQbGFjZWhvbGRlci5uZXcoJzx0ZW1wPicpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpCisgICAgICAgIF9zdXBlcnNlbGVjdG9yPyhzZXExICsgW2Jhc2VdLCBzZXEyICsgW2Jhc2VdKQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyB3aGV0aGVyIHR3byBzZWxlY3RvcnMgbXVzdCBiZSB1bmlmaWVkIHRvIHByb2R1Y2UgYSB2YWxpZAorICAgICAgIyBjb21iaW5lZCBzZWxlY3Rvci4gVGhpcyBpcyB0cnVlIHdoZW4gYm90aCBzZWxlY3RvcnMgY29udGFpbiB0aGUgc2FtZQorICAgICAgIyB1bmlxdWUgc2ltcGxlIHNlbGVjdG9yIHN1Y2ggYXMgYW4gaWQuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBzZXExIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSBvciBTdHJpbmc+XQorICAgICAgIyBAcGFyYW0gc2VxMiBbQXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nPl0KKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICAgIGRlZiBtdXN0X3VuaWZ5PyhzZXExLCBzZXEyKQorICAgICAgICB1bmlxdWVfc2VsZWN0b3JzID0gc2VxMS5tYXAgZG8gfHNzZXF8CisgICAgICAgICAgbmV4dCBbXSBpZiBzc2VxLmlzX2E/KFN0cmluZykKKyAgICAgICAgICBzc2VxLm1lbWJlcnMuc2VsZWN0IHt8c2VsfCBzZWwudW5pcXVlP30KKyAgICAgICAgZW5kLmZsYXR0ZW4udG9fc2V0CisKKyAgICAgICAgcmV0dXJuIGZhbHNlIGlmIHVuaXF1ZV9zZWxlY3RvcnMuZW1wdHk/CisKKyAgICAgICAgc2VxMi5hbnk/IGRvIHxzc2VxfAorICAgICAgICAgIG5leHQgZmFsc2UgaWYgc3NlcS5pc19hPyhTdHJpbmcpCisgICAgICAgICAgc3NlcS5tZW1iZXJzLmFueT8gZG8gfHNlbHwKKyAgICAgICAgICAgIG5leHQgdW5sZXNzIHNlbC51bmlxdWU/CisgICAgICAgICAgICB1bmlxdWVfc2VsZWN0b3JzLmluY2x1ZGU/KHNlbCkKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBSZW1vdmVzIHJlZHVuZGFudCBzZWxlY3RvcnMgZnJvbSBiZXR3ZWVuIG11bHRpcGxlIGxpc3RzIG9mCisgICAgICAjIHNlbGVjdG9ycy4gVGhpcyB0YWtlcyBhIGxpc3Qgb2YgbGlzdHMgb2Ygc2VsZWN0b3Igc2VxdWVuY2VzOworICAgICAgIyBlYWNoIGluZGl2aWR1YWwgbGlzdCBpcyBhc3N1bWVkIHRvIGhhdmUgbm8gcmVkdW5kYW5jeSB3aXRoaW4KKyAgICAgICMgaXRzZWxmLiBBIHNlbGVjdG9yIGlzIG9ubHkgcmVtb3ZlZCBpZiBpdCdzIHJlZHVuZGFudCB3aXRoIGEKKyAgICAgICMgc2VsZWN0b3IgaW4gYW5vdGhlciBsaXN0LgorICAgICAgIworICAgICAgIyAiUmVkdW5kYW50IiBoZXJlIG1lYW5zIHRoYXQgb25lIHNlbGVjdG9yIGlzIGEgc3VwZXJzZWxlY3RvciBvZgorICAgICAgIyB0aGUgb3RoZXIuIFRoZSBtb3JlIHNwZWNpZmljIHNlbGVjdG9yIGlzIHJlbW92ZWQuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBzZXFzZXMgW0FycmF5PEFycmF5PEFycmF5PFNpbXBsZVNlcXVlbmNlIG9yIFN0cmluZz4+Pl0KKyAgICAgICMgQHJldHVybiBbQXJyYXk8QXJyYXk8U2ltcGxlU2VxdWVuY2Ugb3IgU3RyaW5nPj5dCisgICAgICBkZWYgdHJpbShzZXFzZXMpCisgICAgICAgICMgQXZvaWQgdHJ1bHkgaG9ycmlmaWMgcXVhZHJhdGljIGJlaGF2aW9yLiBUT0RPOiBJIHRoaW5rIHRoZXJlCisgICAgICAgICMgbWF5IGJlIGEgd2F5IHRvIGdldCBwZXJmZWN0IHRyaW1taW5nIHdpdGhvdXQgZ29pbmcgcXVhZHJhdGljLgorICAgICAgICByZXR1cm4gc2Vxc2VzLmZsYXR0ZW4oMSkgaWYgc2Vxc2VzLnNpemUgPiAxMDAKKworICAgICAgICAjIEtlZXAgdGhlIHJlc3VsdHMgaW4gYSBzZXBhcmF0ZSBhcnJheSBzbyB3ZSBjYW4gYmUgc3VyZSB3ZSBhcmVuJ3QKKyAgICAgICAgIyBjb21wYXJpbmcgYWdhaW5zdCBhbiBhbHJlYWR5LXRyaW1tZWQgc2VsZWN0b3IuIFRoaXMgZW5zdXJlcyB0aGF0IHR3bworICAgICAgICAjIGlkZW50aWNhbCBzZWxlY3RvcnMgZG9uJ3QgbXV0dWFsbHkgdHJpbSBvbmUgYW5vdGhlci4KKyAgICAgICAgcmVzdWx0ID0gc2Vxc2VzLmR1cAorCisgICAgICAgICMgVGhpcyBpcyBuXjIgb24gdGhlIHNlcXVlbmNlcywgYnV0IG9ubHkgY29tcGFyaW5nIGJldHdlZW4KKyAgICAgICAgIyBzZXBhcmF0ZSBzZXF1ZW5jZXMgc2hvdWxkIGxpbWl0IHRoZSBxdWFkcmF0aWMgYmVoYXZpb3IuCisgICAgICAgIHNlcXNlcy5lYWNoX3dpdGhfaW5kZXggZG8gfHNlcXMxLCBpfAorICAgICAgICAgIHJlc3VsdFtpXSA9IHNlcXMxLnJlamVjdCBkbyB8c2VxMXwKKyAgICAgICAgICAgICMgVGhlIG1heGltdW0gc3BlY2lmaWNpdHkgb2YgdGhlIHNvdXJjZXMgdGhhdCBjYXVzZWQgW3NlcTFdIHRvIGJlCisgICAgICAgICAgICAjIGdlbmVyYXRlZC4gSW4gb3JkZXIgZm9yIFtzZXExXSB0byBiZSByZW1vdmVkLCB0aGVyZSBtdXN0IGJlCisgICAgICAgICAgICAjIGFub3RoZXIgc2VsZWN0b3IgdGhhdCdzIGEgc3VwZXJzZWxlY3RvciBvZiBpdCAqYW5kKiB0aGF0IGhhcworICAgICAgICAgICAgIyBzcGVjaWZpY2l0eSBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMuCisgICAgICAgICAgICBtYXhfc3BlYyA9IF9zb3VyY2VzKHNlcTEpLm1hcCBkbyB8c2VxfAorICAgICAgICAgICAgICBzcGVjID0gc2VxLnNwZWNpZmljaXR5CisgICAgICAgICAgICAgIHNwZWMuaXNfYT8oUmFuZ2UpID8gc3BlYy5tYXggOiBzcGVjCisgICAgICAgICAgICBlbmQubWF4IHx8IDAKKworICAgICAgICAgICAgcmVzdWx0LmFueT8gZG8gfHNlcXMyfAorICAgICAgICAgICAgICBuZXh0IGlmIHNlcXMxLmVxdWFsPyhzZXFzMikKKyAgICAgICAgICAgICAgIyBTZWNvbmQgTGF3IG9mIEV4dGVuZDogdGhlIHNwZWNpZmljaXR5IG9mIGEgZ2VuZXJhdGVkIHNlbGVjdG9yCisgICAgICAgICAgICAgICMgc2hvdWxkIG5ldmVyIGJlIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWNpdHkgb2YgdGhlIGV4dGVuZGluZworICAgICAgICAgICAgICAjIHNlbGVjdG9yLgorICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXgzL3Nhc3MvaXNzdWVzLzMyNC4KKyAgICAgICAgICAgICAgc2VxczIuYW55PyBkbyB8c2VxMnwKKyAgICAgICAgICAgICAgICBzcGVjMiA9IF9zcGVjaWZpY2l0eShzZXEyKQorICAgICAgICAgICAgICAgIHNwZWMyID0gc3BlYzIuYmVnaW4gaWYgc3BlYzIuaXNfYT8oUmFuZ2UpCisgICAgICAgICAgICAgICAgc3BlYzIgPj0gbWF4X3NwZWMgJiYgX3N1cGVyc2VsZWN0b3I/KHNlcTIsIHNlcTEpCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICByZXN1bHQuZmxhdHRlbigxKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfaGFzaAorICAgICAgICBtZW1iZXJzLnJlamVjdCB7fG18IG0gPT0gIlxuIn0uaGFzaAorICAgICAgZW5kCisKKyAgICAgIGRlZiBfZXFsPyhvdGhlcikKKyAgICAgICAgb3RoZXIubWVtYmVycy5yZWplY3Qge3xtfCBtID09ICJcbiJ9LmVxbD8obWVtYmVycy5yZWplY3Qge3xtfCBtID09ICJcbiJ9KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBwYXRoX2hhc190d29fc3ViamVjdHM/KHBhdGgpCisgICAgICAgIHN1YmplY3QgPSBmYWxzZQorICAgICAgICBwYXRoLmVhY2ggZG8gfHNzZXFfb3Jfb3B8CisgICAgICAgICAgbmV4dCB1bmxlc3Mgc3NlcV9vcl9vcC5pc19hPyhTaW1wbGVTZXF1ZW5jZSkKKyAgICAgICAgICBuZXh0IHVubGVzcyBzc2VxX29yX29wLnN1YmplY3Q/CisgICAgICAgICAgcmV0dXJuIHRydWUgaWYgc3ViamVjdAorICAgICAgICAgIHN1YmplY3QgPSB0cnVlCisgICAgICAgIGVuZAorICAgICAgICBmYWxzZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfc291cmNlcyhzZXEpCisgICAgICAgIHMgPSBTZXQubmV3CisgICAgICAgIHNlcS5tYXAge3xzc2VxX29yX29wfCBzLm1lcmdlIHNzZXFfb3Jfb3Auc291cmNlcyBpZiBzc2VxX29yX29wLmlzX2E/KFNpbXBsZVNlcXVlbmNlKX0KKyAgICAgICAgcworICAgICAgZW5kCisKKyAgICAgIGRlZiBleHRlbmRlZF9ub3RfZXhwYW5kZWRfdG9fcyhleHRlbmRlZF9ub3RfZXhwYW5kZWQpCisgICAgICAgIGV4dGVuZGVkX25vdF9leHBhbmRlZC5tYXAgZG8gfGNob2ljZXN8CisgICAgICAgICAgY2hvaWNlcyA9IGNob2ljZXMubWFwIGRvIHxzZWx8CisgICAgICAgICAgICBuZXh0IHNlbC5maXJzdC50b19zIGlmIHNlbC5zaXplID09IDEKKyAgICAgICAgICAgICIje3NlbC5qb2luICcgJ30iCisgICAgICAgICAgZW5kCisgICAgICAgICAgbmV4dCBjaG9pY2VzLmZpcnN0IGlmIGNob2ljZXMuc2l6ZSA9PSAxICYmICFjaG9pY2VzLmluY2x1ZGU/KCcgJykKKyAgICAgICAgICAiKCN7Y2hvaWNlcy5qb2luICcsICd9KSIKKyAgICAgICAgZW5kLmpvaW4gJyAnCisgICAgICBlbmQKKworICAgICAgZGVmIGhhc19yb290Pyhzc2VxKQorICAgICAgICBzc2VxLmlzX2E/KFNpbXBsZVNlcXVlbmNlKSAmJgorICAgICAgICAgIHNzZXEubWVtYmVycy5hbnk/IHt8c2VsfCBzZWwuaXNfYT8oUHNldWRvKSAmJiBzZWwubm9ybWFsaXplZF9uYW1lID09ICJyb290In0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zZWxlY3Rvci9zaW1wbGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NlbGVjdG9yL3NpbXBsZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmY0YjhhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zZWxlY3Rvci9zaW1wbGUucmIKQEAgLTAsMCArMSwxMjQgQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBTZWxlY3RvcgorICAgICMgVGhlIGFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIHNpbXBsZSBzZWxlY3RvcnMKKyAgICAjICh0aGF0IGlzLCB0aG9zZSB0aGF0IGRvbid0IGNvbXBvc2UgbXVsdGlwbGUgc2VsZWN0b3JzKS4KKyAgICBjbGFzcyBTaW1wbGUKKyAgICAgICMgVGhlIGxpbmUgb2YgdGhlIFNhc3MgdGVtcGxhdGUgb24gd2hpY2ggdGhpcyBzZWxlY3RvciB3YXMgZGVjbGFyZWQuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0ludGVnZXJdCisgICAgICBhdHRyX2FjY2Vzc29yIDpsaW5lCisKKyAgICAgICMgVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhpcyBzZWxlY3RvciB3YXMgZGVjbGFyZWQsCisgICAgICAjIG9yIGBuaWxgIGlmIGl0IHdhcyBub3QgZGVjbGFyZWQgaW4gYSBmaWxlIChlLmcuIG9uIHN0ZGluKS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nLCBuaWxdCisgICAgICBhdHRyX2FjY2Vzc29yIDpmaWxlbmFtZQorCisgICAgICAjIFdoZXRoZXIgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBzaW1wbGUgc2VsZWN0b3IgaXMgYWxsb3dlZCBpbiBhIGdpdmVuCisgICAgICAjIGNvbXBsZXggc2VsZWN0b3IuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBkZWYgdW5pcXVlPworICAgICAgICBmYWxzZQorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSAjdG9fcworICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBkZWYgaW5zcGVjdAorICAgICAgICB0b19zCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHRoZSBzZWxlY3RvciBzdHJpbmcuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBvcHRzIFtIYXNoXSByZW5kZXJpbmcgb3B0aW9ucy4KKyAgICAgICMgQG9wdGlvbiBvcHRzIFtTeW1ib2xdIDpzdHlsZSBUaGUgY3NzIHJlbmRlcmluZyBzdHlsZS4KKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgZGVmIHRvX3Mob3B0cyA9IHt9KQorICAgICAgICBTYXNzOjpVdGlsLmFic3RyYWN0KHNlbGYpCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGlzIHNlbGVjdG9yIG9iamVjdC4KKyAgICAgICMKKyAgICAgICMgQnkgZGVmYXVsdCwgdGhpcyBpcyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgXHsjdG9cX2F9LAorICAgICAgIyBzbyBpZiB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGlycmVsZXZhbnQgdG8gdGhlIGlkZW50aXR5IG9mIHRoZSBzZWxlY3RvciwKKyAgICAgICMgdGhpcyBzaG91bGQgYmUgb3ZlcnJpZGRlbi4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbSW50ZWdlcl0KKyAgICAgIGRlZiBoYXNoCisgICAgICAgIEBfaGFzaCB8fD0gZXF1YWxpdHlfa2V5Lmhhc2gKKyAgICAgIGVuZAorCisgICAgICAjIENoZWNrcyBlcXVhbGl0eSBiZXR3ZWVuIHRoaXMgYW5kIGFub3RoZXIgb2JqZWN0LgorICAgICAgIworICAgICAgIyBCeSBkZWZhdWx0LCB0aGlzIGlzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBceyN0b1xfYX0sCisgICAgICAjIHNvIGlmIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gaXJyZWxldmFudCB0byB0aGUgaWRlbnRpdHkgb2YgdGhlIHNlbGVjdG9yLAorICAgICAgIyB0aGlzIHNob3VsZCBiZSBvdmVycmlkZGVuLgorICAgICAgIworICAgICAgIyBAcGFyYW0gb3RoZXIgW09iamVjdF0gVGhlIG9iamVjdCB0byB0ZXN0IGVxdWFsaXR5IGFnYWluc3QKKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciBvciBub3QgdGhpcyBpcyBlcXVhbCB0byBgb3RoZXJgCisgICAgICBkZWYgZXFsPyhvdGhlcikKKyAgICAgICAgb3RoZXIuY2xhc3MgPT0gc2VsZi5jbGFzcyAmJiBvdGhlci5oYXNoID09IGhhc2ggJiYgb3RoZXIuZXF1YWxpdHlfa2V5ID09IGVxdWFsaXR5X2tleQorICAgICAgZW5kCisgICAgICBhbGlhc19tZXRob2QgOj09LCA6ZXFsPworCisgICAgICAjIFVuaWZpZXMgdGhpcyBzZWxlY3RvciB3aXRoIGEge1NpbXBsZVNlcXVlbmNlfSdzIHtTaW1wbGVTZXF1ZW5jZSNtZW1iZXJzIG1lbWJlcnMgYXJyYXl9LAorICAgICAgIyByZXR1cm5pbmcgYW5vdGhlciBgU2ltcGxlU2VxdWVuY2VgIG1lbWJlcnMgYXJyYXkKKyAgICAgICMgdGhhdCBtYXRjaGVzIGJvdGggdGhpcyBzZWxlY3RvciBhbmQgdGhlIGlucHV0IHNlbGVjdG9yLgorICAgICAgIworICAgICAgIyBCeSBkZWZhdWx0LCB0aGlzIGp1c3QgYXBwZW5kcyB0aGlzIHNlbGVjdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5CisgICAgICAjIChvciByZXR1cm5zIHRoZSBvcmlnaW5hbCBhcnJheSBpZiB0aGlzIHNlbGVjdG9yIGFscmVhZHkgZXhpc3RzIGluIGl0KS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHNlbHMgW0FycmF5PFNpbXBsZT5dIEEge1NpbXBsZVNlcXVlbmNlfSdzIHtTaW1wbGVTZXF1ZW5jZSNtZW1iZXJzIG1lbWJlcnMgYXJyYXl9CisgICAgICAjIEByZXR1cm4gW0FycmF5PFNpbXBsZT4sIG5pbF0gQSB7U2ltcGxlU2VxdWVuY2V9IHtTaW1wbGVTZXF1ZW5jZSNtZW1iZXJzIG1lbWJlcnMgYXJyYXl9CisgICAgICAjICAgbWF0Y2hpbmcgYm90aCBgc2Vsc2AgYW5kIHRoaXMgc2VsZWN0b3IsCisgICAgICAjICAgb3IgYG5pbGAgaWYgdGhpcyBpcyBpbXBvc3NpYmxlIChlLmcuIHVuaWZ5aW5nIGAjZm9vYCBhbmQgYCNiYXJgKQorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBJZiB0aGlzIHNlbGVjdG9yIGNhbm5vdCBiZSB1bmlmaWVkLgorICAgICAgIyAgIFRoaXMgd2lsbCBvbmx5IGV2ZXIgb2NjdXIgd2hlbiBhIGR5bmFtaWMgc2VsZWN0b3IsCisgICAgICAjICAgc3VjaCBhcyB7UGFyZW50fSBvciB7SW50ZXJwb2xhdGlvbn0sIGlzIHVzZWQgaW4gdW5pZmljYXRpb24uCisgICAgICAjICAgU2luY2UgdGhlc2Ugc2VsZWN0b3JzIHNob3VsZCBiZSByZXNvbHZlZAorICAgICAgIyAgIGJ5IHRoZSB0aW1lIGV4dGVuc2lvbiBhbmQgdW5pZmljYXRpb24gaGFwcGVuLAorICAgICAgIyAgIHRoaXMgZXhjZXB0aW9uIHdpbGwgb25seSBldmVyIGJlIHJhaXNlZCBhcyBhIHJlc3VsdCBvZiBwcm9ncmFtbWVyIGVycm9yCisgICAgICBkZWYgdW5pZnkoc2VscykKKyAgICAgICAgcmV0dXJuIHNlbHMuZmlyc3QudW5pZnkoW3NlbGZdKSBpZiBzZWxzLmxlbmd0aCA9PSAxICYmIHNlbHMuZmlyc3QuaXNfYT8oVW5pdmVyc2FsKQorICAgICAgICByZXR1cm4gc2VscyBpZiBzZWxzLmFueT8ge3xzZWwyfCBlcWw/KHNlbDIpfQorICAgICAgICBpZiAhaXNfYT8oUHNldWRvKSB8fCAoc2Vscy5sYXN0LmlzX2E/KFBzZXVkbykgJiYgc2Vscy5sYXN0LnR5cGUgPT0gOmVsZW1lbnQpCisgICAgICAgICAgXywgaSA9IHNlbHMuZWFjaF93aXRoX2luZGV4LmZpbmQge3xzZWwsIF98IHNlbC5pc19hPyhQc2V1ZG8pfQorICAgICAgICBlbmQKKyAgICAgICAgcmV0dXJuIHNlbHMgKyBbc2VsZl0gdW5sZXNzIGkKKyAgICAgICAgc2Vsc1swLi4uaV0gKyBbc2VsZl0gKyBzZWxzW2kuLi0xXQorICAgICAgZW5kCisKKyAgICAgIHByb3RlY3RlZAorCisgICAgICAjIFJldHVybnMgdGhlIGtleSB1c2VkIGZvciB0ZXN0aW5nIHdoZXRoZXIgc2VsZWN0b3JzIGFyZSBlcXVhbC4KKyAgICAgICMKKyAgICAgICMgVGhpcyBpcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIFx7I3RvXF9zfS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgZGVmIGVxdWFsaXR5X2tleQorICAgICAgICBAZXF1YWxpdHlfa2V5IHx8PSB0b19zCisgICAgICBlbmQKKworICAgICAgIyBVbmlmaWVzIHR3byBuYW1lc3BhY2VzLAorICAgICAgIyByZXR1cm5pbmcgYSBuYW1lc3BhY2UgdGhhdCB3b3JrcyBmb3IgYm90aCBvZiB0aGVtIGlmIHBvc3NpYmxlLgorICAgICAgIworICAgICAgIyBAcGFyYW0gbnMxIFtTdHJpbmcsIG5pbF0gVGhlIGZpcnN0IG5hbWVzcGFjZS4KKyAgICAgICMgICBgbmlsYCBtZWFucyBub25lIHNwZWNpZmllZCwgZS5nLiBgZm9vYC4KKyAgICAgICMgICBUaGUgZW1wdHkgc3RyaW5nIG1lYW5zIG5vIG5hbWVzcGFjZSBzcGVjaWZpZWQsIGUuZy4gYHxmb29gLgorICAgICAgIyAgIGAiKiJgIG1lYW5zIGFueSBuYW1lc3BhY2UgaXMgYWxsb3dlZCwgZS5nLiBgKnxmb29gLgorICAgICAgIyBAcGFyYW0gbnMyIFtTdHJpbmcsIG5pbF0gVGhlIHNlY29uZCBuYW1lc3BhY2UuIFNlZSBgbnMxYC4KKyAgICAgICMgQHJldHVybiBbQXJyYXkoU3RyaW5nIG9yIG5pbCwgQm9vbGVhbildCisgICAgICAjICAgVGhlIGZpcnN0IHZhbHVlIGlzIHRoZSB1bmlmaWVkIG5hbWVzcGFjZSwgb3IgYG5pbGAgZm9yIG5vIG5hbWVzcGFjZS4KKyAgICAgICMgICBUaGUgc2Vjb25kIHZhbHVlIGlzIHdoZXRoZXIgb3Igbm90IGEgbmFtZXNwYWNlIHRoYXQgd29ya3MgZm9yIGJvdGggaW5wdXRzCisgICAgICAjICAgY291bGQgYmUgZm91bmQgYXQgYWxsLgorICAgICAgIyAgIElmIHRoZSBzZWNvbmQgdmFsdWUgaXMgYGZhbHNlYCwgdGhlIGZpcnN0IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAgZGVmIHVuaWZ5X25hbWVzcGFjZXMobnMxLCBuczIpCisgICAgICAgIHJldHVybiBuczIsIHRydWUgaWYgbnMxID09ICcqJworICAgICAgICByZXR1cm4gbnMxLCB0cnVlIGlmIG5zMiA9PSAnKicKKyAgICAgICAgcmV0dXJuIG5pbCwgZmFsc2UgdW5sZXNzIG5zMSA9PSBuczIKKyAgICAgICAgW25zMSwgdHJ1ZV0KKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zZWxlY3Rvci9zaW1wbGVfc2VxdWVuY2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NlbGVjdG9yL3NpbXBsZV9zZXF1ZW5jZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E2NWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zZWxlY3Rvci9zaW1wbGVfc2VxdWVuY2UucmIKQEAgLTAsMCArMSwzNDggQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBTZWxlY3RvcgorICAgICMgQSB1bnNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBzZWxlY3RvcnMKKyAgICAjIHRoYXQgYWxsIGFwcGx5IHRvIGEgc2luZ2xlIGVsZW1lbnQuCisgICAgIyBGb3IgZXhhbXBsZSwgYC5mb28jYmFyW2F0dHI9YmF6XWAgaXMgYSBzaW1wbGUgc2VxdWVuY2UKKyAgICAjIG9mIHRoZSBzZWxlY3RvcnMgYC5mb29gLCBgI2JhcmAsIGFuZCBgW2F0dHI9YmF6XWAuCisgICAgY2xhc3MgU2ltcGxlU2VxdWVuY2UgPCBBYnN0cmFjdFNlcXVlbmNlCisgICAgICAjIFRoZSBhcnJheSBvZiBpbmRpdmlkdWFsIHNlbGVjdG9ycy4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQXJyYXk8U2ltcGxlPl0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOm1lbWJlcnMKKworICAgICAgIyBUaGUgZXh0ZW5kaW5nIHNlbGVjdG9ycyB0aGF0IGNhdXNlZCB0aGlzIHNlbGVjdG9yIHNlcXVlbmNlIHRvIGJlCisgICAgICAjIGdlbmVyYXRlZC4gRm9yIGV4YW1wbGU6CisgICAgICAjCisgICAgICAjICAgICBhLmZvbyB7IC4uLiB9CisgICAgICAjICAgICBiLmJhciB7QGV4dGVuZCBhfQorICAgICAgIyAgICAgYy5iYXoge0BleHRlbmQgYn0KKyAgICAgICMKKyAgICAgICMgVGhlIGdlbmVyYXRlZCBzZWxlY3RvciBgYi5mb28uYmFyYCBoYXMgYHtiLmJhcn1gIGFzIGl0cyBgc291cmNlc2Agc2V0LAorICAgICAgIyBhbmQgdGhlIGdlbmVyYXRlZCBzZWxlY3RvciBgYy5mb28uYmFyLmJhemAgaGFzIGB7Yi5iYXIsIGMuYmF6fWAgYXMgaXRzCisgICAgICAjIGBzb3VyY2VzYCBzZXQuCisgICAgICAjCisgICAgICAjIFRoaXMgaXMgcG9wdWxhdGVkIGR1cmluZyB0aGUge1NlcXVlbmNlI2RvX2V4dGVuZH0gcHJvY2Vzcy4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiB7U2V0PFNlcXVlbmNlPn0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOnNvdXJjZXMKKworICAgICAgIyBUaGlzIHNlcXVlbmNlIHNvdXJjZSByYW5nZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU2Fzczo6U291cmNlOjpSYW5nZV0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOnNvdXJjZV9yYW5nZQorCisgICAgICAjIEBzZWUgXHsjc3ViamVjdD99CisgICAgICBhdHRyX3dyaXRlciA6c3ViamVjdAorCisgICAgICAjIFJldHVybnMgdGhlIGVsZW1lbnQgb3IgdW5pdmVyc2FsIHNlbGVjdG9yIGluIHRoaXMgc2VxdWVuY2UsCisgICAgICAjIGlmIGl0IGV4aXN0cy4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbRWxlbWVudCwgVW5pdmVyc2FsLCBuaWxdCisgICAgICBkZWYgYmFzZQorICAgICAgICBAYmFzZSB8fD0gKG1lbWJlcnMuZmlyc3QgaWYgbWVtYmVycy5maXJzdC5pc19hPyhFbGVtZW50KSB8fCBtZW1iZXJzLmZpcnN0LmlzX2E/KFVuaXZlcnNhbCkpCisgICAgICBlbmQKKworICAgICAgZGVmIHBzZXVkb19lbGVtZW50cworICAgICAgICBAcHNldWRvX2VsZW1lbnRzIHx8PSBtZW1iZXJzLnNlbGVjdCB7fHNlbHwgc2VsLmlzX2E/KFBzZXVkbykgJiYgc2VsLnR5cGUgPT0gOmVsZW1lbnR9CisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGVjdG9yX3BzZXVkb19jbGFzc2VzCisgICAgICAgIEBzZWxlY3Rvcl9wc2V1ZG9fY2xhc3NlcyB8fD0gbWVtYmVycy4KKyAgICAgICAgICBzZWxlY3Qge3xzZWx8IHNlbC5pc19hPyhQc2V1ZG8pICYmIHNlbC50eXBlID09IDpjbGFzcyAmJiBzZWwuc2VsZWN0b3J9LgorICAgICAgICAgIGdyb3VwX2J5IHt8c2VsfCBzZWwubm9ybWFsaXplZF9uYW1lfQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyB0aGUgbm9uLWJhc2UsIG5vbi1wc2V1ZG8tZWxlbWVudCBzZWxlY3RvcnMgaW4gdGhpcyBzZXF1ZW5jZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU2V0PFNpbXBsZT5dCisgICAgICBkZWYgcmVzdAorICAgICAgICBAcmVzdCB8fD0gU2V0Lm5ldyhtZW1iZXJzIC0gW2Jhc2VdIC0gcHNldWRvX2VsZW1lbnRzKQorICAgICAgZW5kCisKKyAgICAgICMgV2hldGhlciBvciBub3QgdGhpcyBjb21wb3VuZCBzZWxlY3RvciBpcyB0aGUgc3ViamVjdCBvZiB0aGUgcGFyZW50CisgICAgICAjIHNlbGVjdG9yOyB0aGF0IGlzLCB3aGV0aGVyIGl0IGlzIHByZXBlbmRlZCB3aXRoIGAkYCBhbmQgcmVwcmVzZW50cyB0aGUKKyAgICAgICMgYWN0dWFsIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHNlbGVjdGVkLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIHN1YmplY3Q/CisgICAgICAgIEBzdWJqZWN0CisgICAgICBlbmQKKworICAgICAgIyBAcGFyYW0gc2VsZWN0b3JzIFtBcnJheTxTaW1wbGU+XSBTZWUgXHsjbWVtYmVyc30KKyAgICAgICMgQHBhcmFtIHN1YmplY3QgW0Jvb2xlYW5dIFNlZSBceyNzdWJqZWN0P30KKyAgICAgICMgQHBhcmFtIHNvdXJjZV9yYW5nZSBbU2Fzczo6U291cmNlOjpSYW5nZV0KKyAgICAgIGRlZiBpbml0aWFsaXplKHNlbGVjdG9ycywgc3ViamVjdCwgc291cmNlX3JhbmdlID0gbmlsKQorICAgICAgICBAbWVtYmVycyA9IHNlbGVjdG9ycworICAgICAgICBAc3ViamVjdCA9IHN1YmplY3QKKyAgICAgICAgQHNvdXJjZXMgPSBTZXQubmV3CisgICAgICAgIEBzb3VyY2VfcmFuZ2UgPSBzb3VyY2VfcmFuZ2UKKyAgICAgIGVuZAorCisgICAgICAjIFJlc29sdmVzIHRoZSB7UGFyZW50fSBzZWxlY3RvcnMgd2l0aGluIHRoaXMgc2VsZWN0b3IKKyAgICAgICMgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IHNlbGVjdG9yLAorICAgICAgIyBoYW5kbGluZyBjb21tYXMgYXBwcm9wcmlhdGVseS4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHN1cGVyX2NzZXEgW0NvbW1hU2VxdWVuY2VdIFRoZSBwYXJlbnQgc2VsZWN0b3IKKyAgICAgICMgQHJldHVybiBbQ29tbWFTZXF1ZW5jZV0gVGhpcyBzZWxlY3Rvciwgd2l0aCBwYXJlbnQgcmVmZXJlbmNlcyByZXNvbHZlZAorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBJZiBhIHBhcmVudCBzZWxlY3RvciBpcyBpbnZhbGlkCisgICAgICBkZWYgcmVzb2x2ZV9wYXJlbnRfcmVmcyhzdXBlcl9jc2VxKQorICAgICAgICByZXNvbHZlZF9tZW1iZXJzID0gQG1lbWJlcnMubWFwIGRvIHxzZWx8CisgICAgICAgICAgbmV4dCBzZWwgdW5sZXNzIHNlbC5pc19hPyhQc2V1ZG8pICYmIHNlbC5zZWxlY3RvcgorICAgICAgICAgIHNlbC53aXRoX3NlbGVjdG9yKHNlbC5zZWxlY3Rvci5yZXNvbHZlX3BhcmVudF9yZWZzKHN1cGVyX2NzZXEsIGZhbHNlKSkKKyAgICAgICAgZW5kLmZsYXR0ZW4KKworICAgICAgICAjIFBhcmVudCBzZWxlY3RvciBvbmx5IGFwcGVhcnMgYXMgdGhlIGZpcnN0IHNlbGVjdG9yIGluIHRoZSBzZXF1ZW5jZQorICAgICAgICB1bmxlc3MgKHBhcmVudCA9IHJlc29sdmVkX21lbWJlcnMuZmlyc3QpLmlzX2E/KFBhcmVudCkKKyAgICAgICAgICByZXR1cm4gQ29tbWFTZXF1ZW5jZS5uZXcoW1NlcXVlbmNlLm5ldyhbU2ltcGxlU2VxdWVuY2UubmV3KHJlc29sdmVkX21lbWJlcnMsIHN1YmplY3Q/KV0pXSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgcmV0dXJuIHN1cGVyX2NzZXEgaWYgQG1lbWJlcnMuc2l6ZSA9PSAxICYmIHBhcmVudC5zdWZmaXgubmlsPworCisgICAgICAgIENvbW1hU2VxdWVuY2UubmV3KHN1cGVyX2NzZXEubWVtYmVycy5tYXAgZG8gfHN1cGVyX3NlcXwKKyAgICAgICAgICBtZW1iZXJzID0gc3VwZXJfc2VxLm1lbWJlcnMuZHVwCisgICAgICAgICAgbmV3bGluZSA9IG1lbWJlcnMucG9wIGlmIG1lbWJlcnMubGFzdCA9PSAiXG4iCisgICAgICAgICAgdW5sZXNzIG1lbWJlcnMubGFzdC5pc19hPyhTaW1wbGVTZXF1ZW5jZSkKKyAgICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiSW52YWxpZCBwYXJlbnQgc2VsZWN0b3IgZm9yIFwiI3tzZWxmfVwiOiBcIiIgKworICAgICAgICAgICAgICBzdXBlcl9zZXEudG9fcyArICciJykKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIHBhcmVudF9zdWIgPSBtZW1iZXJzLmxhc3QubWVtYmVycworICAgICAgICAgIHVubGVzcyBwYXJlbnQuc3VmZml4Lm5pbD8KKyAgICAgICAgICAgIHBhcmVudF9zdWIgPSBwYXJlbnRfc3ViLmR1cAorICAgICAgICAgICAgcGFyZW50X3N1YlstMV0gPSBwYXJlbnRfc3ViLmxhc3QuZHVwCisgICAgICAgICAgICBjYXNlIHBhcmVudF9zdWIubGFzdAorICAgICAgICAgICAgd2hlbiBTYXNzOjpTZWxlY3Rvcjo6Q2xhc3MsIFNhc3M6OlNlbGVjdG9yOjpJZCwgU2Fzczo6U2VsZWN0b3I6OlBsYWNlaG9sZGVyCisgICAgICAgICAgICAgIHBhcmVudF9zdWJbLTFdID0gcGFyZW50X3N1Yi5sYXN0LmNsYXNzLm5ldyhwYXJlbnRfc3ViLmxhc3QubmFtZSArIHBhcmVudC5zdWZmaXgpCisgICAgICAgICAgICB3aGVuIFNhc3M6OlNlbGVjdG9yOjpFbGVtZW50CisgICAgICAgICAgICAgIHBhcmVudF9zdWJbLTFdID0gcGFyZW50X3N1Yi5sYXN0LmNsYXNzLm5ldygKKyAgICAgICAgICAgICAgICBwYXJlbnRfc3ViLmxhc3QubmFtZSArIHBhcmVudC5zdWZmaXgsCisgICAgICAgICAgICAgICAgcGFyZW50X3N1Yi5sYXN0Lm5hbWVzcGFjZSkKKyAgICAgICAgICAgIHdoZW4gU2Fzczo6U2VsZWN0b3I6OlBzZXVkbworICAgICAgICAgICAgICBpZiBwYXJlbnRfc3ViLmxhc3QuYXJnIHx8IHBhcmVudF9zdWIubGFzdC5zZWxlY3RvcgorICAgICAgICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiSW52YWxpZCBwYXJlbnQgc2VsZWN0b3IgZm9yIFwiI3tzZWxmfVwiOiBcIiIgKworICAgICAgICAgICAgICAgICAgc3VwZXJfc2VxLnRvX3MgKyAnIicpCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBwYXJlbnRfc3ViWy0xXSA9IFNhc3M6OlNlbGVjdG9yOjpQc2V1ZG8ubmV3KAorICAgICAgICAgICAgICAgIHBhcmVudF9zdWIubGFzdC50eXBlLAorICAgICAgICAgICAgICAgIHBhcmVudF9zdWIubGFzdC5uYW1lICsgcGFyZW50LnN1ZmZpeCwKKyAgICAgICAgICAgICAgICBuaWwsIG5pbCkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCJJbnZhbGlkIHBhcmVudCBzZWxlY3RvciBmb3IgXCIje3NlbGZ9XCI6IFwiIiArCisgICAgICAgICAgICAgICAgc3VwZXJfc2VxLnRvX3MgKyAnIicpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKKworICAgICAgICAgIFNlcXVlbmNlLm5ldyhtZW1iZXJzWzAuLi4tMV0gKworICAgICAgICAgICAgW1NpbXBsZVNlcXVlbmNlLm5ldyhwYXJlbnRfc3ViICsgcmVzb2x2ZWRfbWVtYmVyc1sxLi4tMV0sIHN1YmplY3Q/KV0gKworICAgICAgICAgICAgW25ld2xpbmVdLmNvbXBhY3QpCisgICAgICAgICAgZW5kKQorICAgICAgZW5kCisKKyAgICAgICMgTm9uLWRlc3RydWN0aXZlbHkgZXh0ZW5kcyB0aGlzIHNlbGVjdG9yIHdpdGggdGhlIGV4dGVuc2lvbnMgc3BlY2lmaWVkIGluIGEgaGFzaAorICAgICAgIyAod2hpY2ggc2hvdWxkIGNvbWUgZnJvbSB7U2Fzczo6VHJlZTo6VmlzaXRvcnM6OkNzc2l6ZX0pLgorICAgICAgIworICAgICAgIyBAcGFyYW0gZXh0ZW5kcyBbe1NlbGVjdG9yOjpTaW1wbGUgPT4KKyAgICAgICMgICAgICAgICAgICAgICAgICBTYXNzOjpUcmVlOjpWaXNpdG9yczo6Q3NzaXplOjpFeHRlbmR9XQorICAgICAgIyAgIFRoZSBleHRlbnNpb25zIHRvIHBlcmZvcm0gb24gdGhpcyBzZWxlY3RvcgorICAgICAgIyBAcGFyYW0gcGFyZW50X2RpcmVjdGl2ZXMgW0FycmF5PFNhc3M6OlRyZWU6OkRpcmVjdGl2ZU5vZGU+XQorICAgICAgIyAgIFRoZSBkaXJlY3RpdmVzIGNvbnRhaW5pbmcgdGhpcyBzZWxlY3Rvci4KKyAgICAgICMgQHBhcmFtIHNlZW4gW1NldDxBcnJheTxTZWxlY3Rvcjo6U2ltcGxlPj5dCisgICAgICAjICAgVGhlIHNldCBvZiBzaW1wbGUgc2VxdWVuY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyByZXBsYWNlZC4KKyAgICAgICMgQHBhcmFtIG9yaWdpbmFsIFtCb29sZWFuXQorICAgICAgIyAgIFdoZXRoZXIgdGhpcyBpcyB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVpbmcgZXh0ZW5kZWQsIGFzIG9wcG9zZWQgdG8KKyAgICAgICMgICB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXMgZXh0ZW5zaW9uIHRoYXQncyBiZWluZyByZS1leHRlbmRlZC4KKyAgICAgICMgQHJldHVybiBbQXJyYXk8U2VxdWVuY2U+XSBBIGxpc3Qgb2Ygc2VsZWN0b3JzIGdlbmVyYXRlZAorICAgICAgIyAgIGJ5IGV4dGVuZGluZyB0aGlzIHNlbGVjdG9yIHdpdGggYGV4dGVuZHNgLgorICAgICAgIyBAc2VlIENvbW1hU2VxdWVuY2UjZG9fZXh0ZW5kCisgICAgICBkZWYgZG9fZXh0ZW5kKGV4dGVuZHMsIHBhcmVudF9kaXJlY3RpdmVzLCByZXBsYWNlLCBzZWVuKQorICAgICAgICBzZWVuX3dpdGhfcHNldWRvX3NlbGVjdG9ycyA9IHNlZW4uZHVwCisKKyAgICAgICAgbW9kaWZpZWRfb3JpZ2luYWwgPSBmYWxzZQorICAgICAgICBtZW1iZXJzID0gc2VsZi5tZW1iZXJzLm1hcCBkbyB8c2VsfAorICAgICAgICAgIG5leHQgc2VsIHVubGVzcyBzZWwuaXNfYT8oUHNldWRvKSAmJiBzZWwuc2VsZWN0b3IKKyAgICAgICAgICBuZXh0IHNlbCBpZiBzZWVuLmluY2x1ZGU/KFtzZWxdKQorICAgICAgICAgIGV4dGVuZGVkID0gc2VsLnNlbGVjdG9yLmRvX2V4dGVuZChleHRlbmRzLCBwYXJlbnRfZGlyZWN0aXZlcywgcmVwbGFjZSwgc2VlbiwgZmFsc2UpCisgICAgICAgICAgbmV4dCBzZWwgaWYgZXh0ZW5kZWQgPT0gc2VsLnNlbGVjdG9yCisgICAgICAgICAgZXh0ZW5kZWQubWVtYmVycy5yZWplY3QhIHt8c2VxfCBzZXEuaW52aXNpYmxlP30KKworICAgICAgICAgICMgRm9yIGA6bm90KClgLCB3ZSB1c3VhbGx5IHdhbnQgdG8gZ2V0IHJpZCBvZiBhbnkgY29tcGxleAorICAgICAgICAgICMgc2VsZWN0b3JzIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlIHRoZSBzZWxlY3RvciB0byBmYWlsIHRvCisgICAgICAgICAgIyBwYXJzZSBvbiBhbGwgYnJvd3NlcnMgYXQgdGltZSBvZiB3cml0aW5nLiBXZSBjYW4ga2VlcCB0aGVtCisgICAgICAgICAgIyBpZiBlaXRoZXIgdGhlIG9yaWdpbmFsIHNlbGVjdG9yIGhhZCBhIGNvbXBsZXggc2VsZWN0b3IsIG9yCisgICAgICAgICAgIyB0aGUgcmVzdWx0IG9mIGV4dGVuZGluZyBoYXMgb25seSBjb21wbGV4IHNlbGVjdG9ycywKKyAgICAgICAgICAjIGJlY2F1c2UgZWl0aGVyIHdheSB3ZSBhcmVuJ3QgYnJlYWtpbmcgYW55dGhpbmcgdGhhdCBpc24ndAorICAgICAgICAgICMgYWxyZWFkeSBicm9rZW4uCisgICAgICAgICAgaWYgc2VsLm5vcm1hbGl6ZWRfbmFtZSA9PSAnbm90JyAmJgorICAgICAgICAgICAgICAoc2VsLnNlbGVjdG9yLm1lbWJlcnMubm9uZT8ge3xzZXF8IHNlcS5tZW1iZXJzLmxlbmd0aCA+IDF9ICYmCisgICAgICAgICAgICAgICBleHRlbmRlZC5tZW1iZXJzLmFueT8ge3xzZXF8IHNlcS5tZW1iZXJzLmxlbmd0aCA9PSAxfSkKKyAgICAgICAgICAgIGV4dGVuZGVkLm1lbWJlcnMucmVqZWN0ISB7fHNlcXwgc2VxLm1lbWJlcnMubGVuZ3RoID4gMX0KKyAgICAgICAgICBlbmQKKworICAgICAgICAgIG1vZGlmaWVkX29yaWdpbmFsID0gdHJ1ZQorICAgICAgICAgIHJlc3VsdCA9IHNlbC53aXRoX3NlbGVjdG9yKGV4dGVuZGVkKQorICAgICAgICAgIHJlc3VsdC5lYWNoIHt8bmV3X3NlbHwgc2Vlbl93aXRoX3BzZXVkb19zZWxlY3RvcnMgPDwgW25ld19zZWxdfQorICAgICAgICAgIHJlc3VsdAorICAgICAgICBlbmQuZmxhdHRlbgorCisgICAgICAgIGdyb3VwcyA9IGV4dGVuZHNbbWVtYmVycy50b19zZXRdLmdyb3VwX2J5IHt8ZXh8IGV4LmV4dGVuZGVyfS50b19hCisgICAgICAgIGdyb3Vwcy5tYXAhIGRvIHxzZXEsIGdyb3VwfAorICAgICAgICAgIHNlbHMgPSBncm91cC5tYXAge3xlfCBlLnRhcmdldH0uZmxhdHRlbgorICAgICAgICAgICMgSWYgQSB7QGV4dGVuZCBCfSBhbmQgQyB7Li4ufSwKKyAgICAgICAgICAjIHNlcSBpcyBBLCBzZWxzIGlzIEIsIGFuZCBzZWxmIGlzIEMKKworICAgICAgICAgIHNlbGZfd2l0aG91dF9zZWwgPSBTYXNzOjpVdGlsLmFycmF5X21pbnVzKG1lbWJlcnMsIHNlbHMpCisgICAgICAgICAgZ3JvdXAuZWFjaCB7fGV8IGUuc3VjY2VzcyA9IHRydWV9CisgICAgICAgICAgdW5pZmllZCA9IHNlcS5tZW1iZXJzLmxhc3QudW5pZnkoU2ltcGxlU2VxdWVuY2UubmV3KHNlbGZfd2l0aG91dF9zZWwsIHN1YmplY3Q/KSkKKyAgICAgICAgICBuZXh0IHVubGVzcyB1bmlmaWVkCisgICAgICAgICAgZ3JvdXAuZWFjaCB7fGV8IGNoZWNrX2RpcmVjdGl2ZXNfbWF0Y2ghKGUsIHBhcmVudF9kaXJlY3RpdmVzKX0KKyAgICAgICAgICBuZXdfc2VxID0gU2VxdWVuY2UubmV3KHNlcS5tZW1iZXJzWzAuLi4tMV0gKyBbdW5pZmllZF0pCisgICAgICAgICAgbmV3X3NlcS5hZGRfc291cmNlcyEoc291cmNlcyArIFtzZXFdKQorICAgICAgICAgIFtzZWxzLCBuZXdfc2VxXQorICAgICAgICBlbmQKKyAgICAgICAgZ3JvdXBzLmNvbXBhY3QhCisgICAgICAgIGdyb3Vwcy5tYXAhIGRvIHxzZWxzLCBzZXF8CisgICAgICAgICAgbmV4dCBbXSBpZiBzZWVuLmluY2x1ZGU/KHNlbHMpCisgICAgICAgICAgc2VxLmRvX2V4dGVuZCgKKyAgICAgICAgICAgIGV4dGVuZHMsIHBhcmVudF9kaXJlY3RpdmVzLCBmYWxzZSwgc2Vlbl93aXRoX3BzZXVkb19zZWxlY3RvcnMgKyBbc2Vsc10sIGZhbHNlKQorICAgICAgICBlbmQKKyAgICAgICAgZ3JvdXBzLmZsYXR0ZW4hCisKKyAgICAgICAgaWYgbW9kaWZpZWRfb3JpZ2luYWwgfHwgIXJlcGxhY2UgfHwgZ3JvdXBzLmVtcHR5PworICAgICAgICAgICMgRmlyc3QgTGF3IG9mIEV4dGVuZDogdGhlIHJlc3VsdCBvZiBleHRlbmRpbmcgYSBzZWxlY3RvciBzaG91bGQKKyAgICAgICAgICAjIChhbG1vc3QpIGFsd2F5cyBjb250YWluIHRoZSBiYXNlIHNlbGVjdG9yLgorICAgICAgICAgICMKKyAgICAgICAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbmV4My9zYXNzL2lzc3Vlcy8zMjQuCisgICAgICAgICAgb3JpZ2luYWwgPSBTZXF1ZW5jZS5uZXcoW1NpbXBsZVNlcXVlbmNlLm5ldyhtZW1iZXJzLCBAc3ViamVjdCwgc291cmNlX3JhbmdlKV0pCisgICAgICAgICAgb3JpZ2luYWwuYWRkX3NvdXJjZXMhIHNvdXJjZXMKKyAgICAgICAgICBncm91cHMudW5zaGlmdCBvcmlnaW5hbAorICAgICAgICBlbmQKKyAgICAgICAgZ3JvdXBzLnVuaXEhCisgICAgICAgIGdyb3VwcworICAgICAgZW5kCisKKyAgICAgICMgVW5pZmllcyB0aGlzIHNlbGVjdG9yIHdpdGggYW5vdGhlciB7U2ltcGxlU2VxdWVuY2V9LCByZXR1cm5pbmcKKyAgICAgICMgYW5vdGhlciBgU2ltcGxlU2VxdWVuY2VgIHRoYXQgaXMgYSBzdWJzZWxlY3RvciBvZiBib3RoIGlucHV0CisgICAgICAjIHNlbGVjdG9ycy4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIG90aGVyIFtTaW1wbGVTZXF1ZW5jZV0KKyAgICAgICMgQHJldHVybiBbU2ltcGxlU2VxdWVuY2UsIG5pbF0gQSB7U2ltcGxlU2VxdWVuY2V9IG1hdGNoaW5nIGJvdGggYHNlbHNgIGFuZCB0aGlzIHNlbGVjdG9yLAorICAgICAgIyAgIG9yIGBuaWxgIGlmIHRoaXMgaXMgaW1wb3NzaWJsZSAoZS5nLiB1bmlmeWluZyBgI2Zvb2AgYW5kIGAjYmFyYCkKKyAgICAgICMgQHJhaXNlIFtTYXNzOjpTeW50YXhFcnJvcl0gSWYgdGhpcyBzZWxlY3RvciBjYW5ub3QgYmUgdW5pZmllZC4KKyAgICAgICMgICBUaGlzIHdpbGwgb25seSBldmVyIG9jY3VyIHdoZW4gYSBkeW5hbWljIHNlbGVjdG9yLAorICAgICAgIyAgIHN1Y2ggYXMge1BhcmVudH0gb3Ige0ludGVycG9sYXRpb259LCBpcyB1c2VkIGluIHVuaWZpY2F0aW9uLgorICAgICAgIyAgIFNpbmNlIHRoZXNlIHNlbGVjdG9ycyBzaG91bGQgYmUgcmVzb2x2ZWQKKyAgICAgICMgICBieSB0aGUgdGltZSBleHRlbnNpb24gYW5kIHVuaWZpY2F0aW9uIGhhcHBlbiwKKyAgICAgICMgICB0aGlzIGV4Y2VwdGlvbiB3aWxsIG9ubHkgZXZlciBiZSByYWlzZWQgYXMgYSByZXN1bHQgb2YgcHJvZ3JhbW1lciBlcnJvcgorICAgICAgZGVmIHVuaWZ5KG90aGVyKQorICAgICAgICBzc2VxID0gbWVtYmVycy5pbmplY3Qob3RoZXIubWVtYmVycykgZG8gfG1lbWJlciwgc2VsfAorICAgICAgICAgIHJldHVybiB1bmxlc3MgbWVtYmVyCisgICAgICAgICAgc2VsLnVuaWZ5KG1lbWJlcikKKyAgICAgICAgZW5kCisgICAgICAgIHJldHVybiB1bmxlc3Mgc3NlcQorICAgICAgICBTaW1wbGVTZXF1ZW5jZS5uZXcoc3NlcSwgb3RoZXIuc3ViamVjdD8gfHwgc3ViamVjdD8pCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgc2VsZWN0b3IgbWF0Y2hlcyBhbGwgZWxlbWVudHMKKyAgICAgICMgdGhhdCB0aGUgZ2l2ZW4gc2VsZWN0b3IgbWF0Y2hlcyAoYXMgd2VsbCBhcyBwb3NzaWJseSBtb3JlKS4KKyAgICAgICMKKyAgICAgICMgQGV4YW1wbGUKKyAgICAgICMgICAoLmZvbykuc3VwZXJzZWxlY3Rvcj8oLmZvby5iYXIpICM9PiB0cnVlCisgICAgICAjICAgKC5mb28pLnN1cGVyc2VsZWN0b3I/KC5iYXIpICM9PiBmYWxzZQorICAgICAgIyBAcGFyYW0gdGhlaXJfc3NlcSBbU2ltcGxlU2VxdWVuY2VdCisgICAgICAjIEBwYXJhbSBwYXJlbnRzIFtBcnJheTxTaW1wbGVTZXF1ZW5jZSwgU3RyaW5nPl0gVGhlIHBhcmVudCBzZWxlY3RvcnMgb2YgYHRoZWlyX3NzZXFgLCBpZiBhbnkuCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBkZWYgc3VwZXJzZWxlY3Rvcj8odGhlaXJfc3NlcSwgcGFyZW50cyA9IFtdKQorICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIGJhc2UubmlsPyB8fCBiYXNlLmVxbD8odGhlaXJfc3NlcS5iYXNlKQorICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHBzZXVkb19lbGVtZW50cy5lcWw/KHRoZWlyX3NzZXEucHNldWRvX2VsZW1lbnRzKQorICAgICAgICBvdXJfc3BjcyA9IHNlbGVjdG9yX3BzZXVkb19jbGFzc2VzCisgICAgICAgIHRoZWlyX3NwY3MgPSB0aGVpcl9zc2VxLnNlbGVjdG9yX3BzZXVkb19jbGFzc2VzCisKKyAgICAgICAgIyBTb21lIHBzdWVkby1zZWxlY3RvcnMgY2FuIGJlIHN1YnNlbGVjdG9ycyBvZiBub24tcHNldWRvIHNlbGVjdG9ycy4KKyAgICAgICAgIyBQdWxsIHRob3NlIG91dCBoZXJlIHNvIHdlIGNhbiBlZmZpY2llbnRseSBjaGVjayBhZ2FpbnN0IHRoZW0gYmVsb3cuCisgICAgICAgIHRoZWlyX3N1YnNlbGVjdG9yX3BzZXVkb3MgPSAldyhtYXRjaGVzIGFueSBudGgtY2hpbGQgbnRoLWxhc3QtY2hpbGQpLgorICAgICAgICAgIG1hcCB7fG5hbWV8IHRoZWlyX3NwY3NbbmFtZV0gfHwgW119LmZsYXR0ZW4KKworICAgICAgICAjIElmIGBzZWxmYCdzIG5vbi1wc2V1ZG8gc2ltcGxlIHNlbGVjdG9ycyBhcmVuJ3QgYSBzdWJzZXQgb2YgYHRoZWlyX3NzZXFgJ3MsCisgICAgICAgICMgaXQncyBkZWZpbml0ZWx5IG5vdCBhIHN1cGVyc2VsZWN0b3IuIFRoaXMgYWxzbyBjb25zaWRlcnMgYmVpbmcgbWF0Y2hlZAorICAgICAgICAjIGJ5IGA6bWF0Y2hlc2Agb3IgYDphbnlgLgorICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHJlc3QuYWxsPyBkbyB8b3VyX3NlbHwKKyAgICAgICAgICBuZXh0IHRydWUgaWYgb3VyX3NlbC5pc19hPyhQc2V1ZG8pICYmIG91cl9zZWwuc2VsZWN0b3IKKyAgICAgICAgICBuZXh0IHRydWUgaWYgdGhlaXJfc3NlcS5yZXN0LmluY2x1ZGU/KG91cl9zZWwpCisgICAgICAgICAgdGhlaXJfc3Vic2VsZWN0b3JfcHNldWRvcy5hbnk/IGRvIHx0aGVpcl9wc2V1ZG98CisgICAgICAgICAgICB0aGVpcl9wc2V1ZG8uc2VsZWN0b3IubWVtYmVycy5hbGw/IGRvIHx0aGVpcl9zZXF8CisgICAgICAgICAgICAgIG5leHQgZmFsc2UgdW5sZXNzIHRoZWlyX3NlcS5tZW1iZXJzLmxlbmd0aCA9PSAxCisgICAgICAgICAgICAgIHRoZWlyX3NzZXEgPSB0aGVpcl9zZXEubWVtYmVycy5maXJzdAorICAgICAgICAgICAgICBuZXh0IGZhbHNlIHVubGVzcyB0aGVpcl9zc2VxLmlzX2E/KFNpbXBsZVNlcXVlbmNlKQorICAgICAgICAgICAgICB0aGVpcl9zc2VxLnJlc3QuaW5jbHVkZT8ob3VyX3NlbCkKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKworICAgICAgICBvdXJfc3Bjcy5hbGw/IGRvIHxfbmFtZSwgcHNldWRvc3wKKyAgICAgICAgICBwc2V1ZG9zLmFsbD8ge3xwc2V1ZG98IHBzZXVkby5zdXBlcnNlbGVjdG9yPyh0aGVpcl9zc2VxLCBwYXJlbnRzKX0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBAc2VlIFNpbXBsZSN0b19zCisgICAgICBkZWYgdG9fcyhvcHRzID0ge30pCisgICAgICAgIHJlcyA9IEBtZW1iZXJzLm1hcCB7fG18IG0udG9fcyhvcHRzKX0uam9pbgorCisgICAgICAgICMgOm5vdCglZm9vKSBtYXkgcmVzb2x2ZSB0byB0aGUgZW1wdHkgc3RyaW5nLCBidXQgaXQgc2hvdWxkIG1hdGNoIGV2ZXJ5CisgICAgICAgICMgc2VsZWN0b3Igc28gd2UgcmVwbGFjZSBpdCB3aXRoICIqIi4KKyAgICAgICAgcmVzID0gJyonIGlmIHJlcy5lbXB0eT8KKworICAgICAgICByZXMgPDwgJyEnIGlmIHN1YmplY3Q/CisgICAgICAgIHJlcworICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VxdWVuY2UuCisgICAgICAjIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzZWxlY3RvciBzdHJpbmcuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgIGRlZiBpbnNwZWN0CisgICAgICAgIHJlcyA9IG1lbWJlcnMubWFwIHt8bXwgbS5pbnNwZWN0fS5qb2luCisgICAgICAgIHJlcyA8PCAnIScgaWYgc3ViamVjdD8KKyAgICAgICAgcmVzCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm4gYSBjb3B5IG9mIHRoaXMgc2ltcGxlIHNlcXVlbmNlIHdpdGggYHNvdXJjZXNgIG1lcmdlZCBpbnRvIHRoZQorICAgICAgIyB7U2ltcGxlU2VxdWVuY2Ujc291cmNlc30gc2V0LgorICAgICAgIworICAgICAgIyBAcGFyYW0gc291cmNlcyBbU2V0PFNlcXVlbmNlPl0KKyAgICAgICMgQHJldHVybiBbU2ltcGxlU2VxdWVuY2VdCisgICAgICBkZWYgd2l0aF9tb3JlX3NvdXJjZXMoc291cmNlcykKKyAgICAgICAgc3NlcSA9IGR1cAorICAgICAgICBzc2VxLm1lbWJlcnMgPSBtZW1iZXJzLmR1cAorICAgICAgICBzc2VxLnNvdXJjZXMgPSBzZWxmLnNvdXJjZXMgfCBzb3VyY2VzCisgICAgICAgIHNzZXEKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBjaGVja19kaXJlY3RpdmVzX21hdGNoIShleHRlbmQsIHBhcmVudF9kaXJlY3RpdmVzKQorICAgICAgICBkaXJzMSA9IGV4dGVuZC5kaXJlY3RpdmVzLm1hcCB7fGR8IGQucmVzb2x2ZWRfdmFsdWV9CisgICAgICAgIGRpcnMyID0gcGFyZW50X2RpcmVjdGl2ZXMubWFwIHt8ZHwgZC5yZXNvbHZlZF92YWx1ZX0KKyAgICAgICAgcmV0dXJuIGlmIFNhc3M6OlV0aWwuc3Vic2VxdWVuY2U/KGRpcnMxLCBkaXJzMikKKyAgICAgICAgbGluZSA9IGV4dGVuZC5ub2RlLmxpbmUKKyAgICAgICAgZmlsZW5hbWUgPSBleHRlbmQubm9kZS5maWxlbmFtZQorCisgICAgICAgICMgVE9ETyhud2Vpeik6IHRoaXMgc2hvdWxkIHVzZSB0aGUgU2FzcyBzdGFjayB0cmFjZSBvZiB0aGUgZXh0ZW5kIG5vZGUsCisgICAgICAgICMgbm90IHRoZSBzZWxlY3Rvci4KKyAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KDw8TUVTU0FHRSkKK1lvdSBtYXkgbm90IEBleHRlbmQgYW4gb3V0ZXIgc2VsZWN0b3IgZnJvbSB3aXRoaW4gI3tleHRlbmQuZGlyZWN0aXZlcy5sYXN0Lm5hbWV9LgorWW91IG1heSBvbmx5IEBleHRlbmQgc2VsZWN0b3JzIHdpdGhpbiB0aGUgc2FtZSBkaXJlY3RpdmUuCitGcm9tICJAZXh0ZW5kICN7ZXh0ZW5kLnRhcmdldC5qb2luKCcsICcpfSIgb24gbGluZSAje2xpbmV9I3siIG9mICN7ZmlsZW5hbWV9IiBpZiBmaWxlbmFtZX0uCitNRVNTQUdFCisgICAgICBlbmQKKworICAgICAgZGVmIF9oYXNoCisgICAgICAgIFtiYXNlLCByZXN0Lmhhc2hdLmhhc2gKKyAgICAgIGVuZAorCisgICAgICBkZWYgX2VxbD8ob3RoZXIpCisgICAgICAgIG90aGVyLmJhc2UuZXFsPyhiYXNlKSAmJiBvdGhlci5wc2V1ZG9fZWxlbWVudHMgPT0gcHNldWRvX2VsZW1lbnRzICYmCisgICAgICAgICAgb3RoZXIucmVzdC5lcWw/KHJlc3QpICYmIG90aGVyLnN1YmplY3Q/ID09IHN1YmplY3Q/CisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2hhcmVkLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zaGFyZWQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1MDk5NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc2hhcmVkLnJiCkBAIC0wLDAgKzEsNzYgQEAKK21vZHVsZSBTYXNzCisgICMgVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25hbGl0eSB0aGF0J3Mgc2hhcmVkIGJldHdlZW4gSGFtbCBhbmQgU2Fzcy4KKyAgbW9kdWxlIFNoYXJlZAorICAgIGV4dGVuZCBzZWxmCisKKyAgICAjIFNjYW5zIHRocm91Z2ggYSBzdHJpbmcgbG9va2luZyBmb3IgdGhlIGludGVyb3BsYXRpb24tb3BlbmluZyBgI3tgCisgICAgIyBhbmQsIHdoZW4gaXQncyBmb3VuZCwgeWllbGRzIHRoZSBzY2FubmVyIHRvIHRoZSBjYWxsaW5nIGNvZGUKKyAgICAjIHNvIGl0IGNhbiBoYW5kbGUgaXQgcHJvcGVybHkuCisgICAgIworICAgICMgVGhlIHNjYW5uZXIgd2lsbCBoYXZlIGFueSBiYWNrc2xhc2hlcyBpbW1lZGlhdGVseSBpbiBmcm9udCBvZiB0aGUgYCN7YAorICAgICMgYXMgdGhlIHNlY29uZCBjYXB0dXJlIGdyb3VwIChgc2NhblsyXWApLAorICAgICMgYW5kIHRoZSB0ZXh0IHByaW9yIHRvIHRoYXQgYXMgdGhlIGZpcnN0IChgc2NhblsxXWApLgorICAgICMKKyAgICAjIEB5aWVsZHBhcmFtIHNjYW4gW1N0cmluZ1NjYW5uZXJdIFRoZSBzY2FubmVyIHNjYW5uaW5nIHRocm91Z2ggdGhlIHN0cmluZworICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgdGV4dCByZW1haW5pbmcgaW4gdGhlIHNjYW5uZXIgYWZ0ZXIgYWxsIGAje2BzIGhhdmUgYmVlbiBwcm9jZXNzZWQKKyAgICBkZWYgaGFuZGxlX2ludGVycG9sYXRpb24oc3RyKQorICAgICAgc2NhbiA9IFNhc3M6OlV0aWw6Ok11bHRpYnl0ZVN0cmluZ1NjYW5uZXIubmV3KHN0cikKKyAgICAgIHlpZWxkIHNjYW4gd2hpbGUgc2Nhbi5zY2FuKC8oLio/KShcXCopXCNcey9tKQorICAgICAgc2Nhbi5yZXN0CisgICAgZW5kCisKKyAgICAjIE1vdmVzIGEgc2Nhbm5lciB0aHJvdWdoIGEgYmFsYW5jZWQgcGFpciBvZiBjaGFyYWN0ZXJzLgorICAgICMgRm9yIGV4YW1wbGU6CisgICAgIworICAgICMgICAgIEZvbyAoQmFyIChCYXogYmFuZykgYm9wKSAoQmFuZyAoYm9wIGJpcCkpCisgICAgIyAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgXgorICAgICMgICAgIGZyb20gICAgICAgICAgICAgICAgICAgIHRvCisgICAgIworICAgICMgQHBhcmFtIHNjYW5uZXIgW1N0cmluZ1NjYW5uZXJdIFRoZSBzdHJpbmcgc2Nhbm5lciB0byBtb3ZlCisgICAgIyBAcGFyYW0gc3RhcnQgW0NoYXJhY3Rlcl0gVGhlIGNoYXJhY3RlciBvcGVuaW5nIHRoZSBiYWxhbmNlZCBwYWlyLgorICAgICMgICBBIGBGaXhudW1gIGluIDEuOCwgYSBgU3RyaW5nYCBpbiAxLjkKKyAgICAjIEBwYXJhbSBmaW5pc2ggW0NoYXJhY3Rlcl0gVGhlIGNoYXJhY3RlciBjbG9zaW5nIHRoZSBiYWxhbmNlZCBwYWlyLgorICAgICMgICBBIGBGaXhudW1gIGluIDEuOCwgYSBgU3RyaW5nYCBpbiAxLjkKKyAgICAjIEBwYXJhbSBjb3VudCBbSW50ZWdlcl0gVGhlIG51bWJlciBvZiBvcGVuaW5nIGNoYXJhY3RlcnMgbWF0Y2hlZAorICAgICMgICBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZAorICAgICMgQHJldHVybiBbKFN0cmluZywgU3RyaW5nKV0gVGhlIHN0cmluZyBtYXRjaGVkIHdpdGhpbiB0aGUgYmFsYW5jZWQgcGFpcgorICAgICMgICBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZy4KKyAgICAjICAgYFsiRm9vIChCYXIgKEJheiBiYW5nKSBib3ApIiwgIiAoQmFuZyAoYm9wIGJpcCkpIl1gIGluIHRoZSBleGFtcGxlIGFib3ZlLgorICAgIGRlZiBiYWxhbmNlKHNjYW5uZXIsIHN0YXJ0LCBmaW5pc2gsIGNvdW50ID0gMCkKKyAgICAgIHN0ciA9ICcnCisgICAgICBzY2FubmVyID0gU2Fzczo6VXRpbDo6TXVsdGlieXRlU3RyaW5nU2Nhbm5lci5uZXcoc2Nhbm5lcikgdW5sZXNzIHNjYW5uZXIuaXNfYT8gU3RyaW5nU2Nhbm5lcgorICAgICAgcmVnZXhwID0gUmVnZXhwLm5ldygiKC4qPylbXFwje3N0YXJ0LmNocn1cXCN7ZmluaXNoLmNocn1dIiwgUmVnZXhwOjpNVUxUSUxJTkUpCisgICAgICB3aGlsZSBzY2FubmVyLnNjYW4ocmVnZXhwKQorICAgICAgICBzdHIgPDwgc2Nhbm5lci5tYXRjaGVkCisgICAgICAgIGNvdW50ICs9IDEgaWYgc2Nhbm5lci5tYXRjaGVkWy0xXSA9PSBzdGFydAorICAgICAgICBjb3VudCAtPSAxIGlmIHNjYW5uZXIubWF0Y2hlZFstMV0gPT0gZmluaXNoCisgICAgICAgIHJldHVybiBbc3RyLCBzY2FubmVyLnJlc3RdIGlmIGNvdW50ID09IDAKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBGb3JtYXRzIGEgc3RyaW5nIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZXMgYWJvdXQgaW5kZW50YXRpb24uCisgICAgIworICAgICMgQHBhcmFtIGluZGVudGF0aW9uIFtTdHJpbmddIFRoZSBzdHJpbmcgdXNlZCBmb3IgaW5kZW50YXRpb24KKyAgICAjIEBwYXJhbSB3YXMgW0Jvb2xlYW5dIFdoZXRoZXIgb3Igbm90IHRvIGFkZCBgIndhcyJgIG9yIGAid2VyZSJgCisgICAgIyAgIChkZXBlbmRpbmcgb24gaG93IG1hbnkgY2hhcmFjdGVycyB3ZXJlIGluIGBpbmRlbnRhdGlvbmApCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBuYW1lIG9mIHRoZSBpbmRlbnRhdGlvbiAoZS5nLiBgIjEyIHNwYWNlcyJgLCBgIjEgdGFiImApCisgICAgZGVmIGh1bWFuX2luZGVudGF0aW9uKGluZGVudGF0aW9uLCB3YXMgPSBmYWxzZSkKKyAgICAgIGlmICFpbmRlbnRhdGlvbi5pbmNsdWRlPyg/XHQpCisgICAgICAgIG5vdW4gPSAnc3BhY2UnCisgICAgICBlbHNpZiAhaW5kZW50YXRpb24uaW5jbHVkZT8oP1xzKQorICAgICAgICBub3VuID0gJ3RhYicKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGluZGVudGF0aW9uLmluc3BlY3QgKyAod2FzID8gJyB3YXMnIDogJycpCisgICAgICBlbmQKKworICAgICAgc2luZ3VsYXIgPSBpbmRlbnRhdGlvbi5sZW5ndGggPT0gMQorICAgICAgaWYgd2FzCisgICAgICAgIHdhcyA9IHNpbmd1bGFyID8gJyB3YXMnIDogJyB3ZXJlJworICAgICAgZWxzZQorICAgICAgICB3YXMgPSAnJworICAgICAgZW5kCisKKyAgICAgICIje2luZGVudGF0aW9uLmxlbmd0aH0gI3tub3VufSN7J3MnIHVubGVzcyBzaW5ndWxhcn0je3dhc30iCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NvdXJjZS9tYXAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NvdXJjZS9tYXAucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwNmExMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc291cmNlL21hcC5yYgpAQCAtMCwwICsxLDIxMyBAQAorbW9kdWxlIFNhc3M6OlNvdXJjZQorICBjbGFzcyBNYXAKKyAgICAjIEEgbWFwcGluZyBmcm9tIG9uZSBzb3VyY2UgcmFuZ2UgdG8gYW5vdGhlci4gSW5kaWNhdGVzIHRoYXQgYGlucHV0YCB3YXMKKyAgICAjIGNvbXBpbGVkIHRvIGBvdXRwdXRgLgorICAgICMKKyAgICAjIEAhYXR0cmlidXRlIGlucHV0CisgICAgIyAgIEByZXR1cm4gW1Nhc3M6OlNvdXJjZTo6UmFuZ2VdIFRoZSBzb3VyY2UgcmFuZ2UgaW4gdGhlIGlucHV0IGRvY3VtZW50LgorICAgICMKKyAgICAjIEAhYXR0cmlidXRlIG91dHB1dAorICAgICMgICBAcmV0dXJuIFtTYXNzOjpTb3VyY2U6OlJhbmdlXSBUaGUgc291cmNlIHJhbmdlIGluIHRoZSBvdXRwdXQgZG9jdW1lbnQuCisgICAgY2xhc3MgTWFwcGluZyA8IFN0cnVjdC5uZXcoOmlucHV0LCA6b3V0cHV0KQorICAgICAgIyBAcmV0dXJuIFtTdHJpbmddIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXBwaW5nLgorICAgICAgZGVmIGluc3BlY3QKKyAgICAgICAgIiN7aW5wdXQuaW5zcGVjdH0gPT4gI3tvdXRwdXQuaW5zcGVjdH0iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVGhlIG1hcHBpbmcgZGF0YSBvcmRlcmVkIGJ5IHRoZSBsb2NhdGlvbiBpbiB0aGUgdGFyZ2V0LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PE1hcHBpbmc+XQorICAgIGF0dHJfcmVhZGVyIDpkYXRhCisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgQGRhdGEgPSBbXQorICAgIGVuZAorCisgICAgIyBBZGRzIGEgbmV3IG1hcHBpbmcgZnJvbSBvbmUgc291cmNlIHJhbmdlIHRvIGFub3RoZXIuIE11bHRpcGxlIGludm9jYXRpb25zCisgICAgIyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgaGF2ZSBlYWNoIGBvdXRwdXRgIHJhbmdlIGNvbWUgYWZ0ZXIgYWxsIHByZXZpb3VzIHJhbmdlcy4KKyAgICAjCisgICAgIyBAcGFyYW0gaW5wdXQgW1Nhc3M6OlNvdXJjZTo6UmFuZ2VdCisgICAgIyAgIFRoZSBzb3VyY2UgcmFuZ2UgaW4gdGhlIGlucHV0IGRvY3VtZW50LgorICAgICMgQHBhcmFtIG91dHB1dCBbU2Fzczo6U291cmNlOjpSYW5nZV0KKyAgICAjICAgVGhlIHNvdXJjZSByYW5nZSBpbiB0aGUgb3V0cHV0IGRvY3VtZW50LgorICAgIGRlZiBhZGQoaW5wdXQsIG91dHB1dCkKKyAgICAgIEBkYXRhLnB1c2goTWFwcGluZy5uZXcoaW5wdXQsIG91dHB1dCkpCisgICAgZW5kCisKKyAgICAjIFNoaWZ0cyBhbGwgb3V0cHV0IHNvdXJjZSByYW5nZXMgZm9yd2FyZCBvbmUgb3IgbW9yZSBsaW5lcy4KKyAgICAjCisgICAgIyBAcGFyYW0gZGVsdGEgW0ludGVnZXJdIFRoZSBudW1iZXIgb2YgbGluZXMgdG8gc2hpZnQgdGhlIHJhbmdlcyBmb3J3YXJkLgorICAgIGRlZiBzaGlmdF9vdXRwdXRfbGluZXMoZGVsdGEpCisgICAgICByZXR1cm4gaWYgZGVsdGEgPT0gMAorICAgICAgQGRhdGEuZWFjaCBkbyB8bXwKKyAgICAgICAgbS5vdXRwdXQuc3RhcnRfcG9zLmxpbmUgKz0gZGVsdGEKKyAgICAgICAgbS5vdXRwdXQuZW5kX3Bvcy5saW5lICs9IGRlbHRhCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgU2hpZnRzIGFueSBvdXRwdXQgc291cmNlIHJhbmdlcyB0aGF0IGxpZSBvbiB0aGUgZmlyc3QgbGluZSBmb3J3YXJkIG9uZSBvcgorICAgICMgbW9yZSBjaGFyYWN0ZXJzIG9uIHRoYXQgbGluZS4KKyAgICAjCisgICAgIyBAcGFyYW0gZGVsdGEgW0ludGVnZXJdIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzaGlmdCB0aGUgcmFuZ2VzCisgICAgIyAgIGZvcndhcmQuCisgICAgZGVmIHNoaWZ0X291dHB1dF9vZmZzZXRzKGRlbHRhKQorICAgICAgcmV0dXJuIGlmIGRlbHRhID09IDAKKyAgICAgIEBkYXRhLmVhY2ggZG8gfG18CisgICAgICAgIGJyZWFrIGlmIG0ub3V0cHV0LnN0YXJ0X3Bvcy5saW5lID4gMQorICAgICAgICBtLm91dHB1dC5zdGFydF9wb3Mub2Zmc2V0ICs9IGRlbHRhCisgICAgICAgIG0ub3V0cHV0LmVuZF9wb3Mub2Zmc2V0ICs9IGRlbHRhIGlmIG0ub3V0cHV0LmVuZF9wb3MubGluZSA+IDEKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzb3VyY2UgbWFwLgorICAgICMKKyAgICAjIElmIHRoZSBgOmNzc191cmlgIG9wdGlvbiBpc24ndCBzcGVjaWZpZWQsIHRoZSBgOmNzc19wYXRoYCBhbmQKKyAgICAjIGA6c291cmNlbWFwX3BhdGhgIG9wdGlvbnMgbXVzdCBib3RoIGJlIHNwZWNpZmllZC4gQW55IG9wdGlvbnMgbWF5IGFsc28gYmUKKyAgICAjIHNwZWNpZmllZCBhbG9uZ3NpZGUgdGhlIGA6Y3NzX3VyaWAgb3B0aW9uLiBJZiBgOmNzc191cmlgIGlzbid0IHNwZWNpZmllZCwKKyAgICAjIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSBgOmNzc19wYXRoYCBhbmQgYDpzb3VyY2VtYXBfcGF0aGAgdXNpbmcgdGhlCisgICAgIyBhc3N1bXB0aW9uIHRoYXQgdGhlIGxvY2FsIGZpbGUgc3lzdGVtIGhhcyB0aGUgc2FtZSBsYXlvdXQgYXMgdGhlIHNlcnZlci4KKyAgICAjCisgICAgIyBSZWdhcmRsZXNzIG9mIHdoaWNoIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZCwgc291cmNlIHN0eWxlc2hlZXRzCisgICAgIyB0aGF0IGFyZSBpbXBvcnRlZCB1c2luZyBhIG5vbi1kZWZhdWx0IGltcG9ydGVyIHdpbGwgb25seSBiZSBsaW5rZWQgdG8gaW4KKyAgICAjIHRoZSBzb3VyY2UgbWFwIGlmIHRoZWlyIGltcG9ydGVycyBpbXBsZW1lbnQKKyAgICAjIFx7U2Fzczo6SW1wb3J0ZXJzOjpCYXNlI3B1YmxpY1xfdXJsXH0uCisgICAgIworICAgICMgQG9wdGlvbiBvcHRpb25zIDpjc3NfdXJpIFtTdHJpbmddCisgICAgIyAgIFRoZSBwdWJsaWNseS12aXNpYmxlIFVSSSBvZiB0aGUgQ1NTIG91dHB1dCBmaWxlLgorICAgICMgQG9wdGlvbiBvcHRpb25zIDpjc3NfcGF0aCBbU3RyaW5nXQorICAgICMgICBUaGUgbG9jYWwgcGF0aCBvZiB0aGUgQ1NTIG91dHB1dCBmaWxlLgorICAgICMgQG9wdGlvbiBvcHRpb25zIDpzb3VyY2VtYXBfcGF0aCBbU3RyaW5nXQorICAgICMgICBUaGUgKGV2ZW50dWFsKSBsb2NhbCBwYXRoIG9mIHRoZSBzb3VyY2VtYXAgZmlsZS4KKyAgICAjIEBvcHRpb24gb3B0aW9ucyA6dHlwZSBbU3ltYm9sXQorICAgICMgICBgOmF1dG9gIChkZWZhdWx0KSwgIGA6ZmlsZWAsIG9yIGA6aW5saW5lYC4KKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIEpTT04gc3RyaW5nLgorICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBJZiBuZWl0aGVyIGA6Y3NzX3VyaWAgbm9yIGA6Y3NzX3BhdGhgIGFuZAorICAgICMgICBgOnNvdXJjZW1hcF9wYXRoYCBhcmUgc3BlY2lmaWVkLgorICAgICMgQGNvbW1lbnQKKyAgICAjICAgcnVib2NvcDpkaXNhYmxlIE1ldGhvZExlbmd0aAorICAgIGRlZiB0b19qc29uKG9wdGlvbnMpCisgICAgICBjc3NfdXJpLCBjc3NfcGF0aCwgc291cmNlbWFwX3BhdGggPQorICAgICAgICBvcHRpb25zWzpjc3NfdXJpXSwgb3B0aW9uc1s6Y3NzX3BhdGhdLCBvcHRpb25zWzpzb3VyY2VtYXBfcGF0aF0KKyAgICAgIHVubGVzcyBjc3NfdXJpIHx8IChjc3NfcGF0aCAmJiBzb3VyY2VtYXBfcGF0aCkKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIlNhc3M6OlNvdXJjZTo6TWFwI3RvX2pzb24gcmVxdWlyZXMgZWl0aGVyICIgXAorICAgICAgICAgICJ0aGUgOmNzc191cmkgb3B0aW9uIG9yIGJvdGggdGhlIDpjc3NfcGF0aCBhbmQgOnNvdWNlbWFwX3BhdGggb3B0aW9ucy4iKQorICAgICAgZW5kCisgICAgICBjc3NfcGF0aCAmJj0gU2Fzczo6VXRpbC5wYXRobmFtZShGaWxlLmFic29sdXRlX3BhdGgoY3NzX3BhdGgpKQorICAgICAgc291cmNlbWFwX3BhdGggJiY9IFNhc3M6OlV0aWwucGF0aG5hbWUoRmlsZS5hYnNvbHV0ZV9wYXRoKHNvdXJjZW1hcF9wYXRoKSkKKyAgICAgIGNzc191cmkgfHw9IFNhc3M6OlV0aWwuZmlsZV91cmlfZnJvbV9wYXRoKAorICAgICAgICBTYXNzOjpVdGlsLnJlbGF0aXZlX3BhdGhfZnJvbShjc3NfcGF0aCwgc291cmNlbWFwX3BhdGguZGlybmFtZSkpCisKKyAgICAgIHJlc3VsdCA9ICJ7XG4iCisgICAgICB3cml0ZV9qc29uX2ZpZWxkKHJlc3VsdCwgInZlcnNpb24iLCAzLCB0cnVlKQorCisgICAgICBzb3VyY2VfdXJpX3RvX2lkID0ge30KKyAgICAgIGlkX3RvX3NvdXJjZV91cmkgPSB7fQorICAgICAgaWRfdG9fY29udGVudHMgPSB7fSBpZiBvcHRpb25zWzp0eXBlXSA9PSA6aW5saW5lCisgICAgICBuZXh0X3NvdXJjZV9pZCA9IDAKKyAgICAgIGxpbmVfZGF0YSA9IFtdCisgICAgICBzZWdtZW50X2RhdGFfZm9yX2xpbmUgPSBbXQorCisgICAgICAjIFRoZXNlIHRyYWNrIGRhdGEgbmVjZXNzYXJ5IGZvciB0aGUgZGVsdGEgY29kaW5nLgorICAgICAgcHJldmlvdXNfdGFyZ2V0X2xpbmUgPSBuaWwKKyAgICAgIHByZXZpb3VzX3RhcmdldF9vZmZzZXQgPSAxCisgICAgICBwcmV2aW91c19zb3VyY2VfbGluZSA9IDEKKyAgICAgIHByZXZpb3VzX3NvdXJjZV9vZmZzZXQgPSAxCisgICAgICBwcmV2aW91c19zb3VyY2VfaWQgPSAwCisKKyAgICAgIEBkYXRhLmVhY2ggZG8gfG18CisgICAgICAgIGZpbGUsIGltcG9ydGVyID0gbS5pbnB1dC5maWxlLCBtLmlucHV0LmltcG9ydGVyCisKKyAgICAgICAgbmV4dCB1bmxlc3MgaW1wb3J0ZXIKKworICAgICAgICBpZiBvcHRpb25zWzp0eXBlXSA9PSA6aW5saW5lCisgICAgICAgICAgc291cmNlX3VyaSA9IGZpbGUKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvdXJjZW1hcF9kaXIgPSBzb3VyY2VtYXBfcGF0aCAmJiBzb3VyY2VtYXBfcGF0aC5kaXJuYW1lLnRvX3MKKyAgICAgICAgICBzb3VyY2VtYXBfZGlyID0gbmlsIGlmIG9wdGlvbnNbOnR5cGVdID09IDpmaWxlCisgICAgICAgICAgc291cmNlX3VyaSA9IGltcG9ydGVyLnB1YmxpY191cmwoZmlsZSwgc291cmNlbWFwX2RpcikKKyAgICAgICAgICBuZXh0IHVubGVzcyBzb3VyY2VfdXJpCisgICAgICAgIGVuZAorCisgICAgICAgIGN1cnJlbnRfc291cmNlX2lkID0gc291cmNlX3VyaV90b19pZFtzb3VyY2VfdXJpXQorICAgICAgICB1bmxlc3MgY3VycmVudF9zb3VyY2VfaWQKKyAgICAgICAgICBjdXJyZW50X3NvdXJjZV9pZCA9IG5leHRfc291cmNlX2lkCisgICAgICAgICAgbmV4dF9zb3VyY2VfaWQgKz0gMQorCisgICAgICAgICAgc291cmNlX3VyaV90b19pZFtzb3VyY2VfdXJpXSA9IGN1cnJlbnRfc291cmNlX2lkCisgICAgICAgICAgaWRfdG9fc291cmNlX3VyaVtjdXJyZW50X3NvdXJjZV9pZF0gPSBzb3VyY2VfdXJpCisKKyAgICAgICAgICBpZiBvcHRpb25zWzp0eXBlXSA9PSA6aW5saW5lCisgICAgICAgICAgICBpZF90b19jb250ZW50c1tjdXJyZW50X3NvdXJjZV9pZF0gPQorICAgICAgICAgICAgICBpbXBvcnRlci5maW5kKGZpbGUsIHt9KS5pbnN0YW5jZV92YXJpYWJsZV9nZXQoJ0B0ZW1wbGF0ZScpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorCisgICAgICAgIFsKKyAgICAgICAgICBbbS5pbnB1dC5zdGFydF9wb3MsIG0ub3V0cHV0LnN0YXJ0X3Bvc10sCisgICAgICAgICAgW20uaW5wdXQuZW5kX3BvcywgbS5vdXRwdXQuZW5kX3Bvc10KKyAgICAgICAgXS5lYWNoIGRvIHxzb3VyY2VfcG9zLCB0YXJnZXRfcG9zfAorICAgICAgICAgIGlmIHByZXZpb3VzX3RhcmdldF9saW5lICE9IHRhcmdldF9wb3MubGluZQorICAgICAgICAgICAgbGluZV9kYXRhLnB1c2goc2VnbWVudF9kYXRhX2Zvcl9saW5lLmpvaW4oIiwiKSkgdW5sZXNzIHNlZ21lbnRfZGF0YV9mb3JfbGluZS5lbXB0eT8KKyAgICAgICAgICAgICh0YXJnZXRfcG9zLmxpbmUgLSAxIC0gKHByZXZpb3VzX3RhcmdldF9saW5lIHx8IDApKS50aW1lcyB7bGluZV9kYXRhLnB1c2goIiIpfQorICAgICAgICAgICAgcHJldmlvdXNfdGFyZ2V0X2xpbmUgPSB0YXJnZXRfcG9zLmxpbmUKKyAgICAgICAgICAgIHByZXZpb3VzX3RhcmdldF9vZmZzZXQgPSAxCisgICAgICAgICAgICBzZWdtZW50X2RhdGFfZm9yX2xpbmUgPSBbXQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgIyBgc2VnbWVudGAgaXMgYSBkYXRhIGNodW5rIGZvciBhIHNpbmdsZSBwb3NpdGlvbiBtYXBwaW5nLgorICAgICAgICAgIHNlZ21lbnQgPSAiIgorCisgICAgICAgICAgIyBGaWVsZCAxOiB6ZXJvLWJhc2VkIHN0YXJ0aW5nIG9mZnNldC4KKyAgICAgICAgICBzZWdtZW50IDw8IFNhc3M6OlV0aWwuZW5jb2RlX3ZscSh0YXJnZXRfcG9zLm9mZnNldCAtIHByZXZpb3VzX3RhcmdldF9vZmZzZXQpCisgICAgICAgICAgcHJldmlvdXNfdGFyZ2V0X29mZnNldCA9IHRhcmdldF9wb3Mub2Zmc2V0CisKKyAgICAgICAgICAjIEZpZWxkIDI6IHplcm8tYmFzZWQgaW5kZXggaW50byB0aGUgInNvdXJjZXMiIGxpc3QuCisgICAgICAgICAgc2VnbWVudCA8PCBTYXNzOjpVdGlsLmVuY29kZV92bHEoY3VycmVudF9zb3VyY2VfaWQgLSBwcmV2aW91c19zb3VyY2VfaWQpCisgICAgICAgICAgcHJldmlvdXNfc291cmNlX2lkID0gY3VycmVudF9zb3VyY2VfaWQKKworICAgICAgICAgICMgRmllbGQgMzogemVyby1iYXNlZCBzdGFydGluZyBsaW5lIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuCisgICAgICAgICAgc2VnbWVudCA8PCBTYXNzOjpVdGlsLmVuY29kZV92bHEoc291cmNlX3Bvcy5saW5lIC0gcHJldmlvdXNfc291cmNlX2xpbmUpCisgICAgICAgICAgcHJldmlvdXNfc291cmNlX2xpbmUgPSBzb3VyY2VfcG9zLmxpbmUKKworICAgICAgICAgICMgRmllbGQgNDogemVyby1iYXNlZCBzdGFydGluZyBvZmZzZXQgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4KKyAgICAgICAgICBzZWdtZW50IDw8IFNhc3M6OlV0aWwuZW5jb2RlX3ZscShzb3VyY2VfcG9zLm9mZnNldCAtIHByZXZpb3VzX3NvdXJjZV9vZmZzZXQpCisgICAgICAgICAgcHJldmlvdXNfc291cmNlX29mZnNldCA9IHNvdXJjZV9wb3Mub2Zmc2V0CisKKyAgICAgICAgICBzZWdtZW50X2RhdGFfZm9yX2xpbmUucHVzaChzZWdtZW50KQorCisgICAgICAgICAgcHJldmlvdXNfdGFyZ2V0X2xpbmUgPSB0YXJnZXRfcG9zLmxpbmUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGxpbmVfZGF0YS5wdXNoKHNlZ21lbnRfZGF0YV9mb3JfbGluZS5qb2luKCIsIikpCisgICAgICB3cml0ZV9qc29uX2ZpZWxkKHJlc3VsdCwgIm1hcHBpbmdzIiwgbGluZV9kYXRhLmpvaW4oIjsiKSkKKworICAgICAgc291cmNlX25hbWVzID0gW10KKyAgICAgICgwLi4ubmV4dF9zb3VyY2VfaWQpLmVhY2gge3xpZHwgc291cmNlX25hbWVzLnB1c2goaWRfdG9fc291cmNlX3VyaVtpZF0udG9fcyl9CisgICAgICB3cml0ZV9qc29uX2ZpZWxkKHJlc3VsdCwgInNvdXJjZXMiLCBzb3VyY2VfbmFtZXMpCisKKyAgICAgIGlmIG9wdGlvbnNbOnR5cGVdID09IDppbmxpbmUKKyAgICAgICAgd3JpdGVfanNvbl9maWVsZChyZXN1bHQsICJzb3VyY2VzQ29udGVudCIsCisgICAgICAgICAgKDAuLi5uZXh0X3NvdXJjZV9pZCkubWFwIHt8aWR8IGlkX3RvX2NvbnRlbnRzW2lkXX0pCisgICAgICBlbmQKKworICAgICAgd3JpdGVfanNvbl9maWVsZChyZXN1bHQsICJuYW1lcyIsIFtdKQorICAgICAgd3JpdGVfanNvbl9maWVsZChyZXN1bHQsICJmaWxlIiwgY3NzX3VyaSkKKworICAgICAgcmVzdWx0IDw8ICJcbn0iCisgICAgICByZXN1bHQKKyAgICBlbmQKKyAgICAjIEBjb21tZW50CisgICAgIyAgIHJ1Ym9jb3A6ZW5hYmxlIE1ldGhvZExlbmd0aAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIHdyaXRlX2pzb25fZmllbGQob3V0LCBuYW1lLCB2YWx1ZSwgaXNfZmlyc3QgPSBmYWxzZSkKKyAgICAgIG91dCA8PCAoaXNfZmlyc3QgPyAiIiA6ICIsXG4iKSA8PAorICAgICAgICAiXCIiIDw8CisgICAgICAgIFNhc3M6OlV0aWwuanNvbl9lc2NhcGVfc3RyaW5nKG5hbWUpIDw8CisgICAgICAgICJcIjogIiA8PAorICAgICAgICBTYXNzOjpVdGlsLmpzb25fdmFsdWVfb2YodmFsdWUpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NvdXJjZS9wb3NpdGlvbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc291cmNlL3Bvc2l0aW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmFmNDUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NvdXJjZS9wb3NpdGlvbi5yYgpAQCAtMCwwICsxLDM5IEBACittb2R1bGUgU2Fzczo6U291cmNlCisgIGNsYXNzIFBvc2l0aW9uCisgICAgIyBUaGUgb25lLWJhc2VkIGxpbmUgb2YgdGhlIGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24uCisgICAgIworICAgICMgQHJldHVybiBbSW50ZWdlcl0KKyAgICBhdHRyX2FjY2Vzc29yIDpsaW5lCisKKyAgICAjIFRoZSBvbmUtYmFzZWQgb2Zmc2V0IGluIHRoZSBsaW5lIG9mIHRoZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgIyBwb3NpdGlvbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgIGF0dHJfYWNjZXNzb3IgOm9mZnNldAorCisgICAgIyBAcGFyYW0gbGluZSBbSW50ZWdlcl0gVGhlIHNvdXJjZSBsaW5lCisgICAgIyBAcGFyYW0gb2Zmc2V0IFtJbnRlZ2VyXSBUaGUgc291cmNlIG9mZnNldAorICAgIGRlZiBpbml0aWFsaXplKGxpbmUsIG9mZnNldCkKKyAgICAgIEBsaW5lID0gbGluZQorICAgICAgQG9mZnNldCA9IG9mZnNldAorICAgIGVuZAorCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzb3VyY2UgcG9zaXRpb24uCisgICAgZGVmIGluc3BlY3QKKyAgICAgICIje2xpbmUuaW5zcGVjdH06I3tvZmZzZXQuaW5zcGVjdH0iCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSBzdHIgW1N0cmluZ10gVGhlIHN0cmluZyB0byBtb3ZlIHRocm91Z2guCisgICAgIyBAcmV0dXJuIFtQb3NpdGlvbl0gVGhlIHNvdXJjZSBwb3NpdGlvbiBhZnRlciBwcm9jZWVkaW5nIGZvcndhcmQgdGhyb3VnaAorICAgICMgICBgc3RyYC4KKyAgICBkZWYgYWZ0ZXIoc3RyKQorICAgICAgbmV3bGluZXMgPSBzdHIuY291bnQoIlxuIikKKyAgICAgIFBvc2l0aW9uLm5ldyhsaW5lICsgbmV3bGluZXMsCisgICAgICAgIGlmIG5ld2xpbmVzID09IDAKKyAgICAgICAgICBvZmZzZXQgKyBzdHIubGVuZ3RoCisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdHIubGVuZ3RoIC0gc3RyLnJpbmRleCgiXG4iKSAtIDEKKyAgICAgICAgZW5kKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zb3VyY2UvcmFuZ2UucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3NvdXJjZS9yYW5nZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTY4N2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zb3VyY2UvcmFuZ2UucmIKQEAgLTAsMCArMSw0MSBAQAorbW9kdWxlIFNhc3M6OlNvdXJjZQorICBjbGFzcyBSYW5nZQorICAgICMgVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSByYW5nZSBpbiB0aGUgZG9jdW1lbnQgKGluY2x1c2l2ZSkuCisgICAgIworICAgICMgQHJldHVybiBbU2Fzczo6U291cmNlOjpQb3NpdGlvbl0KKyAgICBhdHRyX2FjY2Vzc29yIDpzdGFydF9wb3MKKworICAgICMgVGhlIGVuZGluZyBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgaW4gdGhlIGRvY3VtZW50IChleGNsdXNpdmUpLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNvdXJjZTo6UG9zaXRpb25dCisgICAgYXR0cl9hY2Nlc3NvciA6ZW5kX3BvcworCisgICAgIyBUaGUgZmlsZSBpbiB3aGljaCB0aGlzIHNvdXJjZSByYW5nZSBhcHBlYXJzLiBUaGlzIGNhbiBiZSBuaWwgaWYgdGhlIGZpbGUKKyAgICAjIGlzIHVua25vd24gb3Igbm90IHlldCBnZW5lcmF0ZWQuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfYWNjZXNzb3IgOmZpbGUKKworICAgICMgVGhlIGltcG9ydGVyIHRoYXQgaW1wb3J0ZWQgdGhlIGZpbGUgaW4gd2hpY2ggdGhpcyBzb3VyY2UgcmFuZ2UgYXBwZWFycy4KKyAgICAjIFRoaXMgaXMgbmlsIGZvciB0YXJnZXQgcmFuZ2VzLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OkltcG9ydGVyczo6QmFzZV0KKyAgICBhdHRyX2FjY2Vzc29yIDppbXBvcnRlcgorCisgICAgIyBAcGFyYW0gc3RhcnRfcG9zIFtTYXNzOjpTb3VyY2U6OlBvc2l0aW9uXSBTZWUgXHsjc3RhcnRfcG9zfQorICAgICMgQHBhcmFtIGVuZF9wb3MgW1Nhc3M6OlNvdXJjZTo6UG9zaXRpb25dIFNlZSBceyNlbmRfcG9zfQorICAgICMgQHBhcmFtIGZpbGUgW1N0cmluZ10gU2VlIFx7I2ZpbGV9CisgICAgIyBAcGFyYW0gaW1wb3J0ZXIgW1Nhc3M6OkltcG9ydGVyczo6QmFzZV0gU2VlIFx7I2ltcG9ydGVyfQorICAgIGRlZiBpbml0aWFsaXplKHN0YXJ0X3BvcywgZW5kX3BvcywgZmlsZSwgaW1wb3J0ZXIgPSBuaWwpCisgICAgICBAc3RhcnRfcG9zID0gc3RhcnRfcG9zCisgICAgICBAZW5kX3BvcyA9IGVuZF9wb3MKKyAgICAgIEBmaWxlID0gZmlsZQorICAgICAgQGltcG9ydGVyID0gaW1wb3J0ZXIKKyAgICBlbmQKKworICAgICMgQHJldHVybiBbU3RyaW5nXSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc291cmNlIHJhbmdlLgorICAgIGRlZiBpbnNwZWN0CisgICAgICAiKCN7c3RhcnRfcG9zLmluc3BlY3R9IHRvICN7ZW5kX3Bvcy5pbnNwZWN0fSN7IiBpbiAje0BmaWxlfSIgaWYgQGZpbGV9KSIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3Mvc3RhY2sucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3N0YWNrLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTdhOTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3N0YWNrLnJiCkBAIC0wLDAgKzEsMTQwIEBACittb2R1bGUgU2FzcworICAjIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBzdGFjayB3aGVuIGNvbXBpbGluZyBhIFNhc3MgZmlsZS4KKyAgY2xhc3MgU3RhY2sKKyAgICAjIFRPRE86IHVzZSB0aGlzIHRvIGdlbmVyYXRlIHN0YWNrIGluZm9ybWF0aW9uIGZvciBTYXNzOjpTeW50YXhFcnJvcnMuCisKKyAgICAjIEEgc2luZ2xlIHN0YWNrIGZyYW1lLgorICAgIGNsYXNzIEZyYW1lCisgICAgICAjIFRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGlzIHN0YWNrIGZyYW1lIHdhcyBjcmVhdGVkLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBhdHRyX3JlYWRlciA6ZmlsZW5hbWUKKworICAgICAgIyBUaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhpcyBzdGFjayBmcmFtZSB3YXMgY3JlYXRlZC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgYXR0cl9yZWFkZXIgOmxpbmUKKworICAgICAgIyBUaGUgdHlwZSBvZiB0aGlzIHN0YWNrIGZyYW1lLiBUaGlzIGNhbiBiZSBgOmltcG9ydGAsIGA6bWl4aW5gLCBvcgorICAgICAgIyBgOmJhc2VgLgorICAgICAgIworICAgICAgIyBgOmJhc2VgIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgdGhlIGJvdHRvbS1tb3N0IGZyYW1lLCBtZWFuaW5nIHRoYXQgaXQKKyAgICAgICMgcmVwcmVzZW50cyBhIHNpbmdsZSBsaW5lIG9mIGNvZGUgcmF0aGVyIHRoYW4gYSBuZXN0ZWQgY29udGV4dC4gVGhlIHN0YWNrCisgICAgICAjIHdpbGwgb25seSBldmVyIGhhdmUgb25lIGJhc2UgZnJhbWUsIGFuZCBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgbW9zdAorICAgICAgIyBkZWVwbHktbmVzdGVkIGZyYW1lLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTeW1ib2w/XQorICAgICAgYXR0cl9yZWFkZXIgOnR5cGUKKworICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgc3RhY2sgZnJhbWUuIEZvciBtaXhpbiBmcmFtZXMsIHRoaXMgaXMgdGhlIG1peGluIG5hbWU7CisgICAgICAjIG90aGVyd2lzZSwgaXQncyBgbmlsYC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nP10KKyAgICAgIGF0dHJfcmVhZGVyIDpuYW1lCisKKyAgICAgIGRlZiBpbml0aWFsaXplKGZpbGVuYW1lLCBsaW5lLCB0eXBlLCBuYW1lID0gbmlsKQorICAgICAgICBAZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBAbGluZSA9IGxpbmUKKyAgICAgICAgQHR5cGUgPSB0eXBlCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgZW5kCisKKyAgICAgICMgV2hldGhlciB0aGlzIGZyYW1lIHJlcHJlc2VudHMgYW4gaW1wb3J0LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIGlzX2ltcG9ydD8KKyAgICAgICAgdHlwZSA9PSA6aW1wb3J0CisgICAgICBlbmQKKworICAgICAgIyBXaGV0aGVyIHRoaXMgZnJhbWUgcmVwcmVzZW50cyBhIG1peGluLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIGlzX21peGluPworICAgICAgICB0eXBlID09IDptaXhpbgorICAgICAgZW5kCisKKyAgICAgICMgV2hldGhlciB0aGlzIGlzIHRoZSBiYXNlIGZyYW1lLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIGlzX2Jhc2U/CisgICAgICAgIHR5cGUgPT0gOmJhc2UKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBUaGUgc3RhY2sgZnJhbWVzLiBUaGUgbGFzdCBmcmFtZSBpcyB0aGUgbW9zdCBkZWVwbHktbmVzdGVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PEZyYW1lPl0KKyAgICBhdHRyX3JlYWRlciA6ZnJhbWVzCisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgQGZyYW1lcyA9IFtdCisgICAgZW5kCisKKyAgICAjIFB1c2hlcyBhIGJhc2UgZnJhbWUgb250byB0aGUgc3RhY2suCisgICAgIworICAgICMgQHBhcmFtIGZpbGVuYW1lIFtTdHJpbmddIFNlZSBce0ZyYW1lI2ZpbGVuYW1lfS4KKyAgICAjIEBwYXJhbSBsaW5lIFtTdHJpbmddIFNlZSBce0ZyYW1lI2xpbmV9LgorICAgICMgQHlpZWxkIFtdIEEgYmxvY2sgaW4gd2hpY2ggdGhlIG5ldyBmcmFtZSBpcyBvbiB0aGUgc3RhY2suCisgICAgZGVmIHdpdGhfYmFzZShmaWxlbmFtZSwgbGluZSkKKyAgICAgIHdpdGhfZnJhbWUoZmlsZW5hbWUsIGxpbmUsIDpiYXNlKSB7eWllbGR9CisgICAgZW5kCisKKyAgICAjIFB1c2hlcyBhbiBpbXBvcnQgZnJhbWUgb250byB0aGUgc3RhY2suCisgICAgIworICAgICMgQHBhcmFtIGZpbGVuYW1lIFtTdHJpbmddIFNlZSBce0ZyYW1lI2ZpbGVuYW1lfS4KKyAgICAjIEBwYXJhbSBsaW5lIFtTdHJpbmddIFNlZSBce0ZyYW1lI2xpbmV9LgorICAgICMgQHlpZWxkIFtdIEEgYmxvY2sgaW4gd2hpY2ggdGhlIG5ldyBmcmFtZSBpcyBvbiB0aGUgc3RhY2suCisgICAgZGVmIHdpdGhfaW1wb3J0KGZpbGVuYW1lLCBsaW5lKQorICAgICAgd2l0aF9mcmFtZShmaWxlbmFtZSwgbGluZSwgOmltcG9ydCkge3lpZWxkfQorICAgIGVuZAorCisgICAgIyBQdXNoZXMgYSBtaXhpbiBmcmFtZSBvbnRvIHRoZSBzdGFjay4KKyAgICAjCisgICAgIyBAcGFyYW0gZmlsZW5hbWUgW1N0cmluZ10gU2VlIFx7RnJhbWUjZmlsZW5hbWV9LgorICAgICMgQHBhcmFtIGxpbmUgW1N0cmluZ10gU2VlIFx7RnJhbWUjbGluZX0uCisgICAgIyBAcGFyYW0gbmFtZSBbU3RyaW5nXSBTZWUgXHtGcmFtZSNuYW1lfS4KKyAgICAjIEB5aWVsZCBbXSBBIGJsb2NrIGluIHdoaWNoIHRoZSBuZXcgZnJhbWUgaXMgb24gdGhlIHN0YWNrLgorICAgIGRlZiB3aXRoX21peGluKGZpbGVuYW1lLCBsaW5lLCBuYW1lKQorICAgICAgd2l0aF9mcmFtZShmaWxlbmFtZSwgbGluZSwgOm1peGluLCBuYW1lKSB7eWllbGR9CisgICAgZW5kCisKKyAgICAjIFB1c2hlcyBhIGZ1bmN0aW9uIGZyYW1lIG9udG8gdGhlIHN0YWNrLgorICAgICMKKyAgICAjIEBwYXJhbSBmaWxlbmFtZSBbU3RyaW5nXSBTZWUgXHtGcmFtZSNmaWxlbmFtZX0uCisgICAgIyBAcGFyYW0gbGluZSBbU3RyaW5nXSBTZWUgXHtGcmFtZSNsaW5lfS4KKyAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFNlZSBce0ZyYW1lI25hbWV9LgorICAgICMgQHlpZWxkIFtdIEEgYmxvY2sgaW4gd2hpY2ggdGhlIG5ldyBmcmFtZSBpcyBvbiB0aGUgc3RhY2suCisgICAgZGVmIHdpdGhfZnVuY3Rpb24oZmlsZW5hbWUsIGxpbmUsIG5hbWUpCisgICAgICB3aXRoX2ZyYW1lKGZpbGVuYW1lLCBsaW5lLCA6ZnVuY3Rpb24sIG5hbWUpIHt5aWVsZH0KKyAgICBlbmQKKworICAgICMgUHVzaGVzIGEgZnVuY3Rpb24gZnJhbWUgb250byB0aGUgc3RhY2suCisgICAgIworICAgICMgQHBhcmFtIGZpbGVuYW1lIFtTdHJpbmddIFNlZSBce0ZyYW1lI2ZpbGVuYW1lfS4KKyAgICAjIEBwYXJhbSBsaW5lIFtTdHJpbmddIFNlZSBce0ZyYW1lI2xpbmV9LgorICAgICMgQHBhcmFtIG5hbWUgW1N0cmluZ10gU2VlIFx7RnJhbWUjbmFtZX0uCisgICAgIyBAeWllbGQgW10gQSBibG9jayBpbiB3aGljaCB0aGUgbmV3IGZyYW1lIGlzIG9uIHRoZSBzdGFjay4KKyAgICBkZWYgd2l0aF9kaXJlY3RpdmUoZmlsZW5hbWUsIGxpbmUsIG5hbWUpCisgICAgICB3aXRoX2ZyYW1lKGZpbGVuYW1lLCBsaW5lLCA6ZGlyZWN0aXZlLCBuYW1lKSB7eWllbGR9CisgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgKGZyYW1lcy5yZXZlcnNlICsgW25pbF0pLmVhY2hfY29ucygyKS5lYWNoX3dpdGhfaW5kZXguCisgICAgICAgICAgbWFwIGRvIHwoZnJhbWUsIGNhbGxlciksIGl8CisgICAgICAgICIje2kgPT0gMCA/ICdvbicgOiAnZnJvbSd9IGxpbmUgI3tmcmFtZS5saW5lfSIgKworICAgICAgICAgICIgb2YgI3tmcmFtZS5maWxlbmFtZSB8fCAnYW4gdW5rbm93biBmaWxlJ30iICsKKyAgICAgICAgICAoY2FsbGVyICYmIGNhbGxlci5uYW1lID8gIiwgaW4gYCN7Y2FsbGVyLm5hbWV9JyIgOiAiIikKKyAgICAgIGVuZC5qb2luKCJcbiIpCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgd2l0aF9mcmFtZShmaWxlbmFtZSwgbGluZSwgdHlwZSwgbmFtZSA9IG5pbCkKKyAgICAgIEBmcmFtZXMucG9wIGlmIEBmcmFtZXMubGFzdCAmJiBAZnJhbWVzLmxhc3QudHlwZSA9PSA6YmFzZQorICAgICAgQGZyYW1lcy5wdXNoKEZyYW1lLm5ldyhmaWxlbmFtZSwgbGluZSwgdHlwZSwgbmFtZSkpCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgQGZyYW1lcy5wb3AgdW5sZXNzIHR5cGUgPT0gOmJhc2UgJiYgQGZyYW1lcy5sYXN0ICYmIEBmcmFtZXMubGFzdC50eXBlICE9IDpiYXNlCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3N1cHBvcnRzLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zdXBwb3J0cy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY5YzRkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy9zdXBwb3J0cy5yYgpAQCAtMCwwICsxLDIyNSBAQAorIyBBIG5hbWVzcGFjZSBmb3IgdGhlIGBAc3VwcG9ydHNgIGNvbmRpdGlvbiBwYXJzZSB0cmVlLgorbW9kdWxlIFNhc3M6OlN1cHBvcnRzCisgICMgVGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgYWxsIFN1cHBvcnRzIGNvbmRpdGlvbnMuCisgIGNsYXNzIENvbmRpdGlvbgorICAgICMgUnVucyB0aGUgU2Fzc1NjcmlwdCBpbiB0aGUgc3VwcG9ydHMgY29uZGl0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBlbnZpcm9ubWVudCBbU2Fzczo6RW52aXJvbm1lbnRdIFRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0byBydW4gdGhlIHNjcmlwdC4KKyAgICBkZWYgcGVyZm9ybShlbnZpcm9ubWVudCk7IFNhc3M6OlV0aWwuYWJzdHJhY3Qoc2VsZik7IGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBDU1MgZm9yIHRoaXMgY29uZGl0aW9uLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBkZWYgdG9fY3NzOyBTYXNzOjpVdGlsLmFic3RyYWN0KHNlbGYpOyBlbmQKKworICAgICMgUmV0dXJucyB0aGUgU2Fzcy9DU1MgY29kZSBmb3IgdGhpcyBjb25kaXRpb24uCisgICAgIworICAgICMgQHBhcmFtIG9wdGlvbnMgW3tTeW1ib2wgPT4gT2JqZWN0fV0gQW4gb3B0aW9ucyBoYXNoIChzZWUge1Nhc3M6OkNTUyNpbml0aWFsaXplfSkuCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgZGVmIHRvX3NyYyhvcHRpb25zKTsgU2Fzczo6VXRpbC5hYnN0cmFjdChzZWxmKTsgZW5kCisKKyAgICAjIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhpcyBjb25kaXRpb24gYW5kIGFsbCBpdHMgY2hpbGRyZW4uCisgICAgIworICAgICMgQHJldHVybiBbQ29uZGl0aW9uXQorICAgIGRlZiBkZWVwX2NvcHk7IFNhc3M6OlV0aWwuYWJzdHJhY3Qoc2VsZik7IGVuZAorCisgICAgIyBTZXRzIHRoZSBvcHRpb25zIGhhc2ggZm9yIHRoZSBzY3JpcHQgbm9kZXMgaW4gdGhlIHN1cHBvcnRzIGNvbmRpdGlvbi4KKyAgICAjCisgICAgIyBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBUaGUgb3B0aW9ucyBoYXMgdG8gc2V0LgorICAgIGRlZiBvcHRpb25zPShvcHRpb25zKTsgU2Fzczo6VXRpbC5hYnN0cmFjdChzZWxmKTsgZW5kCisgIGVuZAorCisgICMgQW4gb3BlcmF0b3IgY29uZGl0aW9uIChlLmcuIGBDT05ESVRJT04xIGFuZCBDT05ESVRJT04yYCkuCisgIGNsYXNzIE9wZXJhdG9yIDwgQ29uZGl0aW9uCisgICAgIyBUaGUgbGVmdC1oYW5kIGNvbmRpdGlvbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTdXBwb3J0czo6Q29uZGl0aW9uXQorICAgIGF0dHJfYWNjZXNzb3IgOmxlZnQKKworICAgICMgVGhlIHJpZ2h0LWhhbmQgY29uZGl0aW9uLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlN1cHBvcnRzOjpDb25kaXRpb25dCisgICAgYXR0cl9hY2Nlc3NvciA6cmlnaHQKKworICAgICMgVGhlIG9wZXJhdG9yICgiYW5kIiBvciAib3IiKS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgYXR0cl9hY2Nlc3NvciA6b3AKKworICAgIGRlZiBpbml0aWFsaXplKGxlZnQsIHJpZ2h0LCBvcCkKKyAgICAgIEBsZWZ0ID0gbGVmdAorICAgICAgQHJpZ2h0ID0gcmlnaHQKKyAgICAgIEBvcCA9IG9wCisgICAgZW5kCisKKyAgICBkZWYgcGVyZm9ybShlbnYpCisgICAgICBAbGVmdC5wZXJmb3JtKGVudikKKyAgICAgIEByaWdodC5wZXJmb3JtKGVudikKKyAgICBlbmQKKworICAgIGRlZiB0b19jc3MKKyAgICAgICIje3BhcmVucyBAbGVmdCwgQGxlZnQudG9fY3NzfSAje29wfSAje3BhcmVucyBAcmlnaHQsIEByaWdodC50b19jc3N9IgorICAgIGVuZAorCisgICAgZGVmIHRvX3NyYyhvcHRpb25zKQorICAgICAgIiN7cGFyZW5zIEBsZWZ0LCBAbGVmdC50b19zcmMob3B0aW9ucyl9ICN7b3B9ICN7cGFyZW5zIEByaWdodCwgQHJpZ2h0LnRvX3NyYyhvcHRpb25zKX0iCisgICAgZW5kCisKKyAgICBkZWYgZGVlcF9jb3B5CisgICAgICBjb3B5ID0gZHVwCisgICAgICBjb3B5LmxlZnQgPSBAbGVmdC5kZWVwX2NvcHkKKyAgICAgIGNvcHkucmlnaHQgPSBAcmlnaHQuZGVlcF9jb3B5CisgICAgICBjb3B5CisgICAgZW5kCisKKyAgICBkZWYgb3B0aW9ucz0ob3B0aW9ucykKKyAgICAgIEBsZWZ0Lm9wdGlvbnMgPSBvcHRpb25zCisgICAgICBAcmlnaHQub3B0aW9ucyA9IG9wdGlvbnMKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBwYXJlbnMoY29uZGl0aW9uLCBzdHIpCisgICAgICBpZiBjb25kaXRpb24uaXNfYT8oTmVnYXRpb24pIHx8IChjb25kaXRpb24uaXNfYT8oT3BlcmF0b3IpICYmIGNvbmRpdGlvbi5vcCAhPSBvcCkKKyAgICAgICAgcmV0dXJuICIoI3tzdHJ9KSIKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN0cgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgICMgQSBuZWdhdGlvbiBjb25kaXRpb24gKGBub3QgQ09ORElUSU9OYCkuCisgIGNsYXNzIE5lZ2F0aW9uIDwgQ29uZGl0aW9uCisgICAgIyBUaGUgY29uZGl0aW9uIGJlaW5nIG5lZ2F0ZWQuCisgICAgIworICAgICMgQHJldHVybiBbU2Fzczo6U3VwcG9ydHM6OkNvbmRpdGlvbl0KKyAgICBhdHRyX2FjY2Vzc29yIDpjb25kaXRpb24KKworICAgIGRlZiBpbml0aWFsaXplKGNvbmRpdGlvbikKKyAgICAgIEBjb25kaXRpb24gPSBjb25kaXRpb24KKyAgICBlbmQKKworICAgIGRlZiBwZXJmb3JtKGVudikKKyAgICAgIEBjb25kaXRpb24ucGVyZm9ybShlbnYpCisgICAgZW5kCisKKyAgICBkZWYgdG9fY3NzCisgICAgICAibm90ICN7cGFyZW5zIEBjb25kaXRpb24udG9fY3NzfSIKKyAgICBlbmQKKworICAgIGRlZiB0b19zcmMob3B0aW9ucykKKyAgICAgICJub3QgI3twYXJlbnMgQGNvbmRpdGlvbi50b19zcmMob3B0aW9ucyl9IgorICAgIGVuZAorCisgICAgZGVmIGRlZXBfY29weQorICAgICAgY29weSA9IGR1cAorICAgICAgY29weS5jb25kaXRpb24gPSBjb25kaXRpb24uZGVlcF9jb3B5CisgICAgICBjb3B5CisgICAgZW5kCisKKyAgICBkZWYgb3B0aW9ucz0ob3B0aW9ucykKKyAgICAgIGNvbmRpdGlvbi5vcHRpb25zID0gb3B0aW9ucworICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIHBhcmVucyhzdHIpCisgICAgICByZXR1cm4gIigje3N0cn0pIiBpZiBAY29uZGl0aW9uLmlzX2E/KE5lZ2F0aW9uKSB8fCBAY29uZGl0aW9uLmlzX2E/KE9wZXJhdG9yKQorICAgICAgc3RyCisgICAgZW5kCisgIGVuZAorCisgICMgQSBkZWNsYXJhdGlvbiBjb25kaXRpb24gKGUuZy4gYChmZWF0dXJlOiB2YWx1ZSlgKS4KKyAgY2xhc3MgRGVjbGFyYXRpb24gPCBDb25kaXRpb24KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIGZlYXR1cmUgbmFtZS4KKyAgICBhdHRyX2FjY2Vzc29yIDpuYW1lCisKKyAgICAjIEAhYXR0cmlidXRlIHJlc29sdmVkX25hbWUKKyAgICAjICAgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgYWZ0ZXIgYW55IFNhc3NTY3JpcHQgaGFzIGJlZW4gcmVzb2x2ZWQuCisgICAgIyAgIE9ubHkgc2V0IG9uY2UgXHtUcmVlOjpWaXNpdG9yczo6UGVyZm9ybX0gaGFzIGJlZW4gcnVuLgorICAgICMKKyAgICAjICAgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX25hbWUKKworICAgICMgVGhlIGZlYXR1cmUgdmFsdWUuCisgICAgIworICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlXQorICAgIGF0dHJfYWNjZXNzb3IgOnZhbHVlCisKKyAgICAjIFRoZSB2YWx1ZSBvZiB0aGUgZmVhdHVyZSBhZnRlciBhbnkgU2Fzc1NjcmlwdCBoYXMgYmVlbiByZXNvbHZlZC4KKyAgICAjIE9ubHkgc2V0IG9uY2UgXHtUcmVlOjpWaXNpdG9yczo6UGVyZm9ybX0gaGFzIGJlZW4gcnVuLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX2FjY2Vzc29yIDpyZXNvbHZlZF92YWx1ZQorCisgICAgZGVmIGluaXRpYWxpemUobmFtZSwgdmFsdWUpCisgICAgICBAbmFtZSA9IG5hbWUKKyAgICAgIEB2YWx1ZSA9IHZhbHVlCisgICAgZW5kCisKKyAgICBkZWYgcGVyZm9ybShlbnYpCisgICAgICBAcmVzb2x2ZWRfbmFtZSA9IG5hbWUucGVyZm9ybShlbnYpCisgICAgICBAcmVzb2x2ZWRfdmFsdWUgPSB2YWx1ZS5wZXJmb3JtKGVudikKKyAgICBlbmQKKworICAgIGRlZiB0b19jc3MKKyAgICAgICIoI3tAcmVzb2x2ZWRfbmFtZX06ICN7QHJlc29sdmVkX3ZhbHVlfSkiCisgICAgZW5kCisKKyAgICBkZWYgdG9fc3JjKG9wdGlvbnMpCisgICAgICAiKCN7QG5hbWUudG9fc2FzcyhvcHRpb25zKX06ICN7QHZhbHVlLnRvX3Nhc3Mob3B0aW9ucyl9KSIKKyAgICBlbmQKKworICAgIGRlZiBkZWVwX2NvcHkKKyAgICAgIGNvcHkgPSBkdXAKKyAgICAgIGNvcHkubmFtZSA9IEBuYW1lLmRlZXBfY29weQorICAgICAgY29weS52YWx1ZSA9IEB2YWx1ZS5kZWVwX2NvcHkKKyAgICAgIGNvcHkKKyAgICBlbmQKKworICAgIGRlZiBvcHRpb25zPShvcHRpb25zKQorICAgICAgQG5hbWUub3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgIEB2YWx1ZS5vcHRpb25zID0gb3B0aW9ucworICAgIGVuZAorICBlbmQKKworICAjIEFuIGludGVycG9sYXRpb24gY29uZGl0aW9uIChlLmcuIGAjeyR2YXJ9YCkuCisgIGNsYXNzIEludGVycG9sYXRpb24gPCBDb25kaXRpb24KKyAgICAjIFRoZSBTYXNzU2NyaXB0IGV4cHJlc3Npb24gaW4gdGhlIGludGVycG9sYXRpb24uCisgICAgIworICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlXQorICAgIGF0dHJfYWNjZXNzb3IgOnZhbHVlCisKKyAgICAjIFRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBhZnRlciBpdCdzIGJlZW4gcmVzb2x2ZWQuCisgICAgIyBPbmx5IHNldCBvbmNlIFx7VHJlZTo6VmlzaXRvcnM6OlBlcmZvcm19IGhhcyBiZWVuIHJ1bi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgYXR0cl9hY2Nlc3NvciA6cmVzb2x2ZWRfdmFsdWUKKworICAgIGRlZiBpbml0aWFsaXplKHZhbHVlKQorICAgICAgQHZhbHVlID0gdmFsdWUKKyAgICBlbmQKKworICAgIGRlZiBwZXJmb3JtKGVudikKKyAgICAgIEByZXNvbHZlZF92YWx1ZSA9IHZhbHVlLnBlcmZvcm0oZW52KS50b19zKDpxdW90ZSA9PiA6bm9uZSkKKyAgICBlbmQKKworICAgIGRlZiB0b19jc3MKKyAgICAgIEByZXNvbHZlZF92YWx1ZQorICAgIGVuZAorCisgICAgZGVmIHRvX3NyYyhvcHRpb25zKQorICAgICAgQHZhbHVlLnRvX3Nhc3Mob3B0aW9ucykKKyAgICBlbmQKKworICAgIGRlZiBkZWVwX2NvcHkKKyAgICAgIGNvcHkgPSBkdXAKKyAgICAgIGNvcHkudmFsdWUgPSBAdmFsdWUuZGVlcF9jb3B5CisgICAgICBjb3B5CisgICAgZW5kCisKKyAgICBkZWYgb3B0aW9ucz0ob3B0aW9ucykKKyAgICAgIEB2YWx1ZS5vcHRpb25zID0gb3B0aW9ucworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL2F0X3Jvb3Rfbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9hdF9yb290X25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0ZDdhYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9hdF9yb290X25vZGUucmIKQEAgLTAsMCArMSw4MyBAQAorbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFRyZWUKKyAgICAjIEEgZHluYW1pYyBub2RlIHJlcHJlc2VudGluZyBhbiBgQGF0LXJvb3RgIGRpcmVjdGl2ZS4KKyAgICAjCisgICAgIyBBbiBgQGF0LXJvb3RgIGRpcmVjdGl2ZSB3aXRoIGEgc2VsZWN0b3IgaXMgY29udmVydGVkIHRvIGFuIFx7QXRSb290Tm9kZX0KKyAgICAjIGNvbnRhaW5pbmcgYSBce1J1bGVOb2RlfSBhdCBwYXJzZSB0aW1lLgorICAgICMKKyAgICAjIEBzZWUgU2Fzczo6VHJlZQorICAgIGNsYXNzIEF0Um9vdE5vZGUgPCBOb2RlCisgICAgICAjIFRoZSBxdWVyeSBmb3IgdGhpcyBub2RlIChlLmcuIGAod2l0aG91dDogbWVkaWEpYCksCisgICAgICAjIGludGVyc3BlcnNlZCB3aXRoIHtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGV9cyByZXByZXNlbnRpbmcKKyAgICAgICMgYCN7fWAtaW50ZXJwb2xhdGlvbi4gQW55IGFkamFjZW50IHN0cmluZ3Mgd2lsbCBiZSBtZXJnZWQKKyAgICAgICMgdG9nZXRoZXIuCisgICAgICAjCisgICAgICAjIFRoaXMgd2lsbCBiZSBuaWwgaWYgdGhlIGRpcmVjdGl2ZSBkaWRuJ3QgaGF2ZSBhIHF1ZXJ5LiBJbiB0aGlzCisgICAgICAjIGNhc2UsIHsjcmVzb2x2ZWRcX3R5cGV9IHdpbGwgYXV0b21hdGljYWxseSBiZSBzZXQgdG8KKyAgICAgICMgYDp3aXRob3V0YCBhbmQgeyNyZXNvbHZlZFxfcnVsZX0gd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHNldCB0byBgWyJydWxlIl1gLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT5dCisgICAgICBhdHRyX2FjY2Vzc29yIDpxdWVyeQorCisgICAgICAjIFRoZSByZXNvbHZlZCB0eXBlIG9mIHRoaXMgZGlyZWN0aXZlLiBgOndpdGhgIG9yIGA6d2l0aG91dGAuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N5bWJvbF0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX3R5cGUKKworICAgICAgIyBUaGUgcmVzb2x2ZWQgdmFsdWUgb2YgdGhpcyBkaXJlY3RpdmUgLS0gYSBsaXN0IG9mIGRpcmVjdGl2ZXMKKyAgICAgICMgdG8gZWl0aGVyIGluY2x1ZGUgb3IgZXhjbHVkZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nPl0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX3ZhbHVlCisKKyAgICAgICMgVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHRhYnMgdGhhdCB0aGUgY29udGVudHMgb2YgdGhpcyBub2RlCisgICAgICAjIHNob3VsZCBiZSBpbmRlbnRlZC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbTnVtYmVyXQorICAgICAgYXR0cl9hY2Nlc3NvciA6dGFicworCisgICAgICAjIFdoZXRoZXIgdGhlIGxhc3QgY2hpbGQgb2YgdGhpcyBub2RlIHNob3VsZCBiZSBjb25zaWRlcmVkIHRoZQorICAgICAgIyBlbmQgb2YgYSBncm91cC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOmdyb3VwX2VuZAorCisgICAgICBkZWYgaW5pdGlhbGl6ZShxdWVyeSA9IG5pbCkKKyAgICAgICAgc3VwZXIoKQorICAgICAgICBAcXVlcnkgPSBTYXNzOjpVdGlsLnN0cmlwX3N0cmluZ19hcnJheShTYXNzOjpVdGlsLm1lcmdlX2FkamFjZW50X3N0cmluZ3MocXVlcnkpKSBpZiBxdWVyeQorICAgICAgICBAdGFicyA9IDAKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGRpcmVjdGl2ZSBpcyBleGNsdWRlZCBieSB0aGlzCisgICAgICAjIG5vZGUuIGBkaXJlY3RpdmVgIG1heSBiZSAicnVsZSIsIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyCisgICAgICAjIG5vcm1hbCBDU1MgcnVsZXMgc2hvdWxkIGJlIGV4Y2x1ZGVkLgorICAgICAgIworICAgICAgIyBAcGFyYW0gZGlyZWN0aXZlIFtTdHJpbmddCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBkZWYgZXhjbHVkZT8oZGlyZWN0aXZlKQorICAgICAgICBpZiByZXNvbHZlZF90eXBlID09IDp3aXRoCisgICAgICAgICAgcmV0dXJuIGZhbHNlIGlmIHJlc29sdmVkX3ZhbHVlLmluY2x1ZGU/KCdhbGwnKQorICAgICAgICAgICFyZXNvbHZlZF92YWx1ZS5pbmNsdWRlPyhkaXJlY3RpdmUpCisgICAgICAgIGVsc2UgIyByZXNvbHZlZF90eXBlID09IDp3aXRob3V0CisgICAgICAgICAgcmV0dXJuIHRydWUgaWYgcmVzb2x2ZWRfdmFsdWUuaW5jbHVkZT8oJ2FsbCcpCisgICAgICAgICAgcmVzb2x2ZWRfdmFsdWUuaW5jbHVkZT8oZGlyZWN0aXZlKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBpcyBleGNsdWRlZCBieSB0aGlzIG5vZGUuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBub2RlIFtTYXNzOjpUcmVlOjpOb2RlXQorICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIGV4Y2x1ZGVfbm9kZT8obm9kZSkKKyAgICAgICAgcmV0dXJuIGV4Y2x1ZGU/KG5vZGUubmFtZS5nc3ViKC9eQC8sICcnKSkgaWYgbm9kZS5pc19hPyhTYXNzOjpUcmVlOjpEaXJlY3RpdmVOb2RlKQorICAgICAgICByZXR1cm4gZXhjbHVkZT8oJ2tleWZyYW1lcycpIGlmIG5vZGUuaXNfYT8oU2Fzczo6VHJlZTo6S2V5ZnJhbWVSdWxlTm9kZSkKKyAgICAgICAgZXhjbHVkZT8oJ3J1bGUnKSAmJiBub2RlLmlzX2E/KFNhc3M6OlRyZWU6OlJ1bGVOb2RlKQorICAgICAgZW5kCisKKyAgICAgICMgQHNlZSBOb2RlI2J1YmJsZXM/CisgICAgICBkZWYgYnViYmxlcz8KKyAgICAgICAgdHJ1ZQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvY2hhcnNldF9ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL2NoYXJzZXRfbm9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjA0ZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL2NoYXJzZXRfbm9kZS5yYgpAQCAtMCwwICsxLDIyIEBACittb2R1bGUgU2Fzczo6VHJlZQorICAjIEEgc3RhdGljIG5vZGUgcmVwcmVzZW50aW5nIGFuIHVucHJvY2Vzc2VkIFNhc3MgYEBjaGFyc2V0YCBkaXJlY3RpdmUuCisgICMKKyAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgY2xhc3MgQ2hhcnNldE5vZGUgPCBOb2RlCisgICAgIyBUaGUgbmFtZSBvZiB0aGUgY2hhcnNldC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgYXR0cl9hY2Nlc3NvciA6bmFtZQorCisgICAgIyBAcGFyYW0gbmFtZSBbU3RyaW5nXSBzZWUgXHsjbmFtZX0KKyAgICBkZWYgaW5pdGlhbGl6ZShuYW1lKQorICAgICAgQG5hbWUgPSBuYW1lCisgICAgICBzdXBlcigpCisgICAgZW5kCisKKyAgICAjIEBzZWUgTm9kZSNpbnZpc2libGU/CisgICAgZGVmIGludmlzaWJsZT8KKyAgICAgIHRydWUKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9jb21tZW50X25vZGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvY29tbWVudF9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzNhMTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvY29tbWVudF9ub2RlLnJiCkBAIC0wLDAgKzEsODIgQEAKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9ub2RlJworCittb2R1bGUgU2Fzczo6VHJlZQorICAjIEEgc3RhdGljIG5vZGUgcmVwcmVzZW50aW5nIGEgU2FzcyBjb21tZW50IChzaWxlbnQgb3IgbG91ZCkuCisgICMKKyAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgY2xhc3MgQ29tbWVudE5vZGUgPCBOb2RlCisgICAgIyBUaGUgdGV4dCBvZiB0aGUgY29tbWVudCwgbm90IGluY2x1ZGluZyBgLypgIGFuZCBgKi9gLgorICAgICMgSW50ZXJzcGVyc2VkIHdpdGgge1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZX1zIHJlcHJlc2VudGluZyBgI3t9YC1pbnRlcnBvbGF0aW9uCisgICAgIyBpZiB0aGlzIGlzIGEgbG91ZCBjb21tZW50LgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICBhdHRyX2FjY2Vzc29yIDp2YWx1ZQorCisgICAgIyBUaGUgdGV4dCBvZiB0aGUgY29tbWVudAorICAgICMgYWZ0ZXIgYW55IGludGVycG9sYXRlZCBTYXNzU2NyaXB0IGhhcyBiZWVuIHJlc29sdmVkLgorICAgICMgT25seSBzZXQgb25jZSBce1RyZWU6OlZpc2l0b3JzOjpQZXJmb3JtfSBoYXMgYmVlbiBydW4uCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX3ZhbHVlCisKKyAgICAjIFRoZSB0eXBlIG9mIHRoZSBjb21tZW50LiBgOnNpbGVudGAgbWVhbnMgaXQncyBuZXZlciBvdXRwdXQgdG8gQ1NTLAorICAgICMgYDpub3JtYWxgIG1lYW5zIGl0J3Mgb3V0cHV0IGluIGV2ZXJ5IGNvbXBpbGUgbW9kZSBleGNlcHQgYDpjb21wcmVzc2VkYCwKKyAgICAjIGFuZCBgOmxvdWRgIG1lYW5zIGl0J3Mgb3V0cHV0IGV2ZW4gaW4gYDpjb21wcmVzc2VkYC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTeW1ib2xdCisgICAgYXR0cl9hY2Nlc3NvciA6dHlwZQorCisgICAgIyBAcGFyYW0gdmFsdWUgW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0gU2VlIFx7I3ZhbHVlfQorICAgICMgQHBhcmFtIHR5cGUgW1N5bWJvbF0gU2VlIFx7I3R5cGV9CisgICAgZGVmIGluaXRpYWxpemUodmFsdWUsIHR5cGUpCisgICAgICBAdmFsdWUgPSBTYXNzOjpVdGlsLndpdGhfZXh0cmFjdGVkX3ZhbHVlcyh2YWx1ZSkge3xzdHJ8IG5vcm1hbGl6ZV9pbmRlbnRhdGlvbiBzdHJ9CisgICAgICBAdHlwZSA9IHR5cGUKKyAgICAgIHN1cGVyKCkKKyAgICBlbmQKKworICAgICMgQ29tcGFyZXMgdGhlIGNvbnRlbnRzIG9mIHR3byBjb21tZW50cy4KKyAgICAjCisgICAgIyBAcGFyYW0gb3RoZXIgW09iamVjdF0gVGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGgKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgb3Igbm90IHRoaXMgbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdAorICAgICMgICBhcmUgdGhlIHNhbWUKKyAgICBkZWYgPT0ob3RoZXIpCisgICAgICBzZWxmLmNsYXNzID09IG90aGVyLmNsYXNzICYmIHZhbHVlID09IG90aGVyLnZhbHVlICYmIHR5cGUgPT0gb3RoZXIudHlwZQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGEgc2lsZW50IGNvbW1lbnQKKyAgICAjIG9yIHRoZSBjdXJyZW50IHN0eWxlIGRvZXNuJ3QgcmVuZGVyIGNvbW1lbnRzLgorICAgICMKKyAgICAjIENvbW1lbnRzIHN0YXJ0aW5nIHdpdGggISBhcmUgbmV2ZXIgaW52aXNpYmxlIChhbmQgdGhlICEgaXMgcmVtb3ZlZCBmcm9tIHRoZSBvdXRwdXQuKQorICAgICMKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgZGVmIGludmlzaWJsZT8KKyAgICAgIGNhc2UgQHR5cGUKKyAgICAgIHdoZW4gOmxvdWQ7IGZhbHNlCisgICAgICB3aGVuIDpzaWxlbnQ7IHRydWUKKyAgICAgIGVsc2U7IHN0eWxlID09IDpjb21wcmVzc2VkCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBjb21tZW50LgorICAgICMKKyAgICAjIEByZXR1cm4gW0ludGVnZXJdCisgICAgZGVmIGxpbmVzCisgICAgICBAdmFsdWUuaW5qZWN0KDApIGRvIHxzLCBlfAorICAgICAgICBuZXh0IHMgKyBlLmNvdW50KCJcbiIpIGlmIGUuaXNfYT8oU3RyaW5nKQorICAgICAgICBuZXh0IHMKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIG5vcm1hbGl6ZV9pbmRlbnRhdGlvbihzdHIpCisgICAgICBpbmQgPSBzdHIuc3BsaXQoIlxuIikuaW5qZWN0KHN0clsvXlsgXHRdKi9dLnNwbGl0KCIiKSkgZG8gfHByZSwgbGluZXwKKyAgICAgICAgbGluZVsvXlsgXHRdKi9dLnNwbGl0KCIiKS56aXAocHJlKS5pbmplY3QoW10pIGRvIHxhcnIsIChhLCBiKXwKKyAgICAgICAgICBicmVhayBhcnIgaWYgYSAhPSBiCisgICAgICAgICAgYXJyIDw8IGEKKyAgICAgICAgZW5kCisgICAgICBlbmQuam9pbgorICAgICAgc3RyLmdzdWIoL14je2luZH0vLCAnJykKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9jb250ZW50X25vZGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvY29udGVudF9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjUyOGYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvY29udGVudF9ub2RlLnJiCkBAIC0wLDAgKzEsOSBAQAorbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFRyZWUKKyAgICAjIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIHBsYWNlbWVudCB3aXRoaW4gYSBtaXhpbiBvZiB0aGUgaW5jbHVkZSBzdGF0ZW1lbnQncyBjb250ZW50LgorICAgICMKKyAgICAjIEBzZWUgU2Fzczo6VHJlZQorICAgIGNsYXNzIENvbnRlbnROb2RlIDwgTm9kZQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL2Nzc19pbXBvcnRfbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9jc3NfaW1wb3J0X25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhNTkyNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9jc3NfaW1wb3J0X25vZGUucmIKQEAgLTAsMCArMSw2OCBAQAorbW9kdWxlIFNhc3M6OlRyZWUKKyAgIyBBIG5vZGUgcmVwcmVzZW50aW5nIGFuIGBAaW1wb3J0YCBydWxlIHRoYXQncyBpbXBvcnRpbmcgcGxhaW4gQ1NTLgorICAjCisgICMgQHNlZSBTYXNzOjpUcmVlCisgIGNsYXNzIENzc0ltcG9ydE5vZGUgPCBEaXJlY3RpdmVOb2RlCisgICAgIyBUaGUgVVJJIGJlaW5nIGltcG9ydGVkLCBlaXRoZXIgYXMgYSBwbGFpbiBzdHJpbmcgb3IgYW4gaW50ZXJwb2xhdGVkCisgICAgIyBzY3JpcHQgc3RyaW5nLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlXQorICAgIGF0dHJfYWNjZXNzb3IgOnVyaQorCisgICAgIyBUaGUgdGV4dCBvZiB0aGUgVVJJIGJlaW5nIGltcG9ydGVkIGFmdGVyIGFueSBpbnRlcnBvbGF0ZWQgU2Fzc1NjcmlwdCBoYXMKKyAgICAjIGJlZW4gcmVzb2x2ZWQuIE9ubHkgc2V0IG9uY2Uge1RyZWU6OlZpc2l0b3JzOjpQZXJmb3JtfSBoYXMgYmVlbiBydW4uCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX3VyaQorCisgICAgIyBUaGUgc3VwcG9ydHMgY29uZGl0aW9uIGZvciB0aGlzIGltcG9ydC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTdXBwb3J0czo6Q29uZGl0aW9uXQorICAgIGF0dHJfYWNjZXNzb3IgOnN1cHBvcnRzX2NvbmRpdGlvbgorCisgICAgIyBUaGUgbWVkaWEgcXVlcnkgZm9yIHRoaXMgcnVsZSwgaW50ZXJzcGVyc2VkIHdpdGgKKyAgICAjIHtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGV9cyByZXByZXNlbnRpbmcgYCN7fWAtaW50ZXJwb2xhdGlvbi4gQW55IGFkamFjZW50CisgICAgIyBzdHJpbmdzIHdpbGwgYmUgbWVyZ2VkIHRvZ2V0aGVyLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICBhdHRyX2FjY2Vzc29yIDpxdWVyeQorCisgICAgIyBUaGUgbWVkaWEgcXVlcnkgZm9yIHRoaXMgcnVsZSwgd2l0aG91dCBhbnkgdW5yZXNvbHZlZCBpbnRlcnBvbGF0aW9uLgorICAgICMgSXQncyBvbmx5IHNldCBvbmNlIHtUcmVlOjpWaXNpdG9yczo6UGVyZm9ybX0gaGFzIGJlZW4gcnVuLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6Ok1lZGlhOjpRdWVyeUxpc3RdCisgICAgYXR0cl9hY2Nlc3NvciA6cmVzb2x2ZWRfcXVlcnkKKworICAgICMgQHBhcmFtIHVyaSBbU3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGVdIFNlZSBceyN1cml9CisgICAgIyBAcGFyYW0gcXVlcnkgW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0gU2VlIFx7I3F1ZXJ5fQorICAgICMgQHBhcmFtIHN1cHBvcnRzX2NvbmRpdGlvbiBbU2Fzczo6U3VwcG9ydHM6OkNvbmRpdGlvbl0gU2VlIFx7I3N1cHBvcnRzX2NvbmRpdGlvbn0KKyAgICBkZWYgaW5pdGlhbGl6ZSh1cmksIHF1ZXJ5ID0gW10sIHN1cHBvcnRzX2NvbmRpdGlvbiA9IG5pbCkKKyAgICAgIEB1cmkgPSB1cmkKKyAgICAgIEBxdWVyeSA9IHF1ZXJ5CisgICAgICBAc3VwcG9ydHNfY29uZGl0aW9uID0gc3VwcG9ydHNfY29uZGl0aW9uCisgICAgICBzdXBlcignJykKKyAgICBlbmQKKworICAgICMgQHBhcmFtIHVyaSBbU3RyaW5nXSBTZWUgXHsjcmVzb2x2ZWRfdXJpfQorICAgICMgQHJldHVybiBbQ3NzSW1wb3J0Tm9kZV0KKyAgICBkZWYgc2VsZi5yZXNvbHZlZCh1cmkpCisgICAgICBub2RlID0gbmV3KHVyaSkKKyAgICAgIG5vZGUucmVzb2x2ZWRfdXJpID0gdXJpCisgICAgICBub2RlCisgICAgZW5kCisKKyAgICAjIEBzZWUgRGlyZWN0aXZlTm9kZSN2YWx1ZQorICAgIGRlZiB2YWx1ZTsgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcjsgZW5kCisKKyAgICAjIEBzZWUgRGlyZWN0aXZlTm9kZSNyZXNvbHZlZF92YWx1ZQorICAgIGRlZiByZXNvbHZlZF92YWx1ZQorICAgICAgQHJlc29sdmVkX3ZhbHVlIHx8PQorICAgICAgICBiZWdpbgorICAgICAgICAgIHN0ciA9ICJAaW1wb3J0ICN7cmVzb2x2ZWRfdXJpfSIKKyAgICAgICAgICBzdHIgPDwgIiBzdXBwb3J0cygje3N1cHBvcnRzX2NvbmRpdGlvbi50b19jc3N9KSIgaWYgc3VwcG9ydHNfY29uZGl0aW9uCisgICAgICAgICAgc3RyIDw8ICIgI3tyZXNvbHZlZF9xdWVyeS50b19jc3N9IiBpZiByZXNvbHZlZF9xdWVyeQorICAgICAgICAgIHN0cgorICAgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9kZWJ1Z19ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL2RlYnVnX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjMjg0MgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9kZWJ1Z19ub2RlLnJiCkBAIC0wLDAgKzEsMTggQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBUcmVlCisgICAgIyBBIGR5bmFtaWMgbm9kZSByZXByZXNlbnRpbmcgYSBTYXNzIGBAZGVidWdgIHN0YXRlbWVudC4KKyAgICAjCisgICAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgICBjbGFzcyBEZWJ1Z05vZGUgPCBOb2RlCisgICAgICAjIFRoZSBleHByZXNzaW9uIHRvIHByaW50LgorICAgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlRyZWU6Ok5vZGVdCisgICAgICBhdHRyX2FjY2Vzc29yIDpleHByCisKKyAgICAgICMgQHBhcmFtIGV4cHIgW1NjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIGV4cHJlc3Npb24gdG8gcHJpbnQKKyAgICAgIGRlZiBpbml0aWFsaXplKGV4cHIpCisgICAgICAgIEBleHByID0gZXhwcgorICAgICAgICBzdXBlcigpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9kaXJlY3RpdmVfbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9kaXJlY3RpdmVfbm9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTViYjcwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL2RpcmVjdGl2ZV9ub2RlLnJiCkBAIC0wLDAgKzEsNTkgQEAKK21vZHVsZSBTYXNzOjpUcmVlCisgICMgQSBzdGF0aWMgbm9kZSByZXByZXNlbnRpbmcgYW4gdW5wcm9jZXNzZWQgU2FzcyBgQGAtZGlyZWN0aXZlLgorICAjIERpcmVjdGl2ZXMga25vd24gdG8gU2FzcywgbGlrZSBgQGZvcmAgYW5kIGBAZGVidWdgLAorICAjIGFyZSBoYW5kbGVkIGJ5IHRoZWlyIG93biBub2RlczsKKyAgIyBvbmx5IENTUyBkaXJlY3RpdmVzIGxpa2UgYEBtZWRpYWAgYW5kIGBAZm9udC1mYWNlYCBiZWNvbWUge0RpcmVjdGl2ZU5vZGV9cy4KKyAgIworICAjIGBAaW1wb3J0YCBhbmQgYEBjaGFyc2V0YCBhcmUgc3BlY2lhbCBjYXNlczsKKyAgIyB0aGV5IGJlY29tZSB7SW1wb3J0Tm9kZX1zIGFuZCB7Q2hhcnNldE5vZGV9cywgcmVzcGVjdGl2ZWx5LgorICAjCisgICMgQHNlZSBTYXNzOjpUcmVlCisgIGNsYXNzIERpcmVjdGl2ZU5vZGUgPCBOb2RlCisgICAgIyBUaGUgdGV4dCBvZiB0aGUgZGlyZWN0aXZlLCBgQGAgYW5kIGFsbCwgd2l0aCBpbnRlcnBvbGF0aW9uIGluY2x1ZGVkLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICBhdHRyX2FjY2Vzc29yIDp2YWx1ZQorCisgICAgIyBUaGUgdGV4dCBvZiB0aGUgZGlyZWN0aXZlIGFmdGVyIGFueSBpbnRlcnBvbGF0ZWQgU2Fzc1NjcmlwdCBoYXMgYmVlbiByZXNvbHZlZC4KKyAgICAjIE9ubHkgc2V0IG9uY2UgXHtUcmVlOjpWaXNpdG9yczo6UGVyZm9ybX0gaGFzIGJlZW4gcnVuLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX2FjY2Vzc29yIDpyZXNvbHZlZF92YWx1ZQorCisgICAgIyBAc2VlIFJ1bGVOb2RlI3RhYnMKKyAgICBhdHRyX2FjY2Vzc29yIDp0YWJzCisKKyAgICAjIEBzZWUgUnVsZU5vZGUjZ3JvdXBfZW5kCisgICAgYXR0cl9hY2Nlc3NvciA6Z3JvdXBfZW5kCisKKyAgICAjIEBwYXJhbSB2YWx1ZSBbQXJyYXk8U3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGU+XSBTZWUgXHsjdmFsdWV9CisgICAgZGVmIGluaXRpYWxpemUodmFsdWUpCisgICAgICBAdmFsdWUgPSB2YWx1ZQorICAgICAgQHRhYnMgPSAwCisgICAgICBzdXBlcigpCisgICAgZW5kCisKKyAgICAjIEBwYXJhbSB2YWx1ZSBbU3RyaW5nXSBTZWUgXHsjcmVzb2x2ZWRfdmFsdWV9CisgICAgIyBAcmV0dXJuIFtEaXJlY3RpdmVOb2RlXQorICAgIGRlZiBzZWxmLnJlc29sdmVkKHZhbHVlKQorICAgICAgbm9kZSA9IG5ldyhbdmFsdWVdKQorICAgICAgbm9kZS5yZXNvbHZlZF92YWx1ZSA9IHZhbHVlCisgICAgICBub2RlCisgICAgZW5kCisKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZSwgaW5jbHVkaW5nIGBAYC4KKyAgICBkZWYgbmFtZQorICAgICAgQG5hbWUgfHw9IHZhbHVlLmZpcnN0LmdzdWIoLyAuKiQvLCAnJykKKyAgICBlbmQKKworICAgICMgU3RyaXBzIG91dCBhbnkgdmVuZG9yIHByZWZpeGVzIGFuZCBkb3duY2FzZXMgdGhlIGRpcmVjdGl2ZSBuYW1lLgorICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgbm9ybWFsaXplZCBuYW1lIG9mIHRoZSBkaXJlY3RpdmUuCisgICAgZGVmIG5vcm1hbGl6ZWRfbmFtZQorICAgICAgQG5vcm1hbGl6ZWRfbmFtZSB8fD0gbmFtZS5nc3ViKC9eKEApKD86LVthLXpBLVowLTldKy0pPy8sICdcMScpLmRvd25jYXNlCisgICAgZW5kCisKKyAgICBkZWYgYnViYmxlcz8KKyAgICAgIGhhc19jaGlsZHJlbgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL2VhY2hfbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9lYWNoX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2Y2ZhNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9lYWNoX25vZGUucmIKQEAgLTAsMCArMSwyNCBAQAorcmVxdWlyZSAnc2Fzcy90cmVlL25vZGUnCisKK21vZHVsZSBTYXNzOjpUcmVlCisgICMgQSBkeW5hbWljIG5vZGUgcmVwcmVzZW50aW5nIGEgU2FzcyBgQGVhY2hgIGxvb3AuCisgICMKKyAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgY2xhc3MgRWFjaE5vZGUgPCBOb2RlCisgICAgIyBUaGUgbmFtZXMgb2YgdGhlIGxvb3AgdmFyaWFibGVzLgorICAgICMgQHJldHVybiBbQXJyYXk8U3RyaW5nPl0KKyAgICBhdHRyX3JlYWRlciA6dmFycworCisgICAgIyBUaGUgcGFyc2UgdHJlZSBmb3IgdGhlIGxpc3QuCisgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlRyZWU6Ok5vZGVdCisgICAgYXR0cl9hY2Nlc3NvciA6bGlzdAorCisgICAgIyBAcGFyYW0gdmFycyBbQXJyYXk8U3RyaW5nPl0gVGhlIG5hbWVzIG9mIHRoZSBsb29wIHZhcmlhYmxlcworICAgICMgQHBhcmFtIGxpc3QgW1NjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIHBhcnNlIHRyZWUgZm9yIHRoZSBsaXN0CisgICAgZGVmIGluaXRpYWxpemUodmFycywgbGlzdCkKKyAgICAgIEB2YXJzID0gdmFycworICAgICAgQGxpc3QgPSBsaXN0CisgICAgICBzdXBlcigpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvZXJyb3Jfbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9lcnJvcl9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwM2ZkNjIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvZXJyb3Jfbm9kZS5yYgpAQCAtMCwwICsxLDE4IEBACittb2R1bGUgU2FzcworICBtb2R1bGUgVHJlZQorICAgICMgQSBkeW5hbWljIG5vZGUgcmVwcmVzZW50aW5nIGEgU2FzcyBgQGVycm9yYCBzdGF0ZW1lbnQuCisgICAgIworICAgICMgQHNlZSBTYXNzOjpUcmVlCisgICAgY2xhc3MgRXJyb3JOb2RlIDwgTm9kZQorICAgICAgIyBUaGUgZXhwcmVzc2lvbiB0byBwcmludC4KKyAgICAgICMgQHJldHVybiBbU2NyaXB0OjpUcmVlOjpOb2RlXQorICAgICAgYXR0cl9hY2Nlc3NvciA6ZXhwcgorCisgICAgICAjIEBwYXJhbSBleHByIFtTY3JpcHQ6OlRyZWU6Ok5vZGVdIFRoZSBleHByZXNzaW9uIHRvIHByaW50CisgICAgICBkZWYgaW5pdGlhbGl6ZShleHByKQorICAgICAgICBAZXhwciA9IGV4cHIKKyAgICAgICAgc3VwZXIoKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvZXh0ZW5kX25vZGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvZXh0ZW5kX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3YzIwYwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9leHRlbmRfbm9kZS5yYgpAQCAtMCwwICsxLDQzIEBACityZXF1aXJlICdzYXNzL3RyZWUvbm9kZScKKworbW9kdWxlIFNhc3M6OlRyZWUKKyAgIyBBIHN0YXRpYyBub2RlIHJlcHJlc2VudGluZyBhbiBgQGV4dGVuZGAgZGlyZWN0aXZlLgorICAjCisgICMgQHNlZSBTYXNzOjpUcmVlCisgIGNsYXNzIEV4dGVuZE5vZGUgPCBOb2RlCisgICAgIyBUaGUgcGFyc2VkIHNlbGVjdG9yIGFmdGVyIGludGVycG9sYXRpb24gaGFzIGJlZW4gcmVzb2x2ZWQuCisgICAgIyBPbmx5IHNldCBvbmNlIHtUcmVlOjpWaXNpdG9yczo6UGVyZm9ybX0gaGFzIGJlZW4gcnVuLgorICAgICMKKyAgICAjIEByZXR1cm4gW1NlbGVjdG9yOjpDb21tYVNlcXVlbmNlXQorICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX3NlbGVjdG9yCisKKyAgICAjIFRoZSBDU1Mgc2VsZWN0b3IgdG8gZXh0ZW5kLCBpbnRlcnNwZXJzZWQgd2l0aCB7U2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlfXMKKyAgICAjIHJlcHJlc2VudGluZyBgI3t9YC1pbnRlcnBvbGF0aW9uLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICBhdHRyX2FjY2Vzc29yIDpzZWxlY3RvcgorCisgICAgIyBUaGUgZXh0ZW5kZWQgc2VsZWN0b3Igc291cmNlIHJhbmdlLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNvdXJjZTo6UmFuZ2VdCisgICAgYXR0cl9hY2Nlc3NvciA6c2VsZWN0b3Jfc291cmNlX3JhbmdlCisKKyAgICAjIFdoZXRoZXIgdGhlIGBAZXh0ZW5kYCBpcyBhbGxvd2VkIHRvIG1hdGNoIG5vIHNlbGVjdG9ycyBvciBub3QuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgb3B0aW9uYWw/OyBAb3B0aW9uYWw7IGVuZAorCisgICAgIyBAcGFyYW0gc2VsZWN0b3IgW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICAjICAgVGhlIENTUyBzZWxlY3RvciB0byBleHRlbmQsCisgICAgIyAgIGludGVyc3BlcnNlZCB3aXRoIHtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGV9cworICAgICMgICByZXByZXNlbnRpbmcgYCN7fWAtaW50ZXJwb2xhdGlvbi4KKyAgICAjIEBwYXJhbSBvcHRpb25hbCBbQm9vbGVhbl0gU2VlIFx7RXh0ZW5kTm9kZSNvcHRpb25hbD99CisgICAgIyBAcGFyYW0gc2VsZWN0b3Jfc291cmNlX3JhbmdlIFtTYXNzOjpTb3VyY2U6OlJhbmdlXSBUaGUgZXh0ZW5kZWQgc2VsZWN0b3Igc291cmNlIHJhbmdlLgorICAgIGRlZiBpbml0aWFsaXplKHNlbGVjdG9yLCBvcHRpb25hbCwgc2VsZWN0b3Jfc291cmNlX3JhbmdlKQorICAgICAgQHNlbGVjdG9yID0gc2VsZWN0b3IKKyAgICAgIEBvcHRpb25hbCA9IG9wdGlvbmFsCisgICAgICBAc2VsZWN0b3Jfc291cmNlX3JhbmdlID0gc2VsZWN0b3Jfc291cmNlX3JhbmdlCisgICAgICBzdXBlcigpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvZm9yX25vZGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvZm9yX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzZjY1NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9mb3Jfbm9kZS5yYgpAQCAtMCwwICsxLDM2IEBACityZXF1aXJlICdzYXNzL3RyZWUvbm9kZScKKworbW9kdWxlIFNhc3M6OlRyZWUKKyAgIyBBIGR5bmFtaWMgbm9kZSByZXByZXNlbnRpbmcgYSBTYXNzIGBAZm9yYCBsb29wLgorICAjCisgICMgQHNlZSBTYXNzOjpUcmVlCisgIGNsYXNzIEZvck5vZGUgPCBOb2RlCisgICAgIyBUaGUgbmFtZSBvZiB0aGUgbG9vcCB2YXJpYWJsZS4KKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX3JlYWRlciA6dmFyCisKKyAgICAjIFRoZSBwYXJzZSB0cmVlIGZvciB0aGUgaW5pdGlhbCBleHByZXNzaW9uLgorICAgICMgQHJldHVybiBbU2NyaXB0OjpUcmVlOjpOb2RlXQorICAgIGF0dHJfYWNjZXNzb3IgOmZyb20KKworICAgICMgVGhlIHBhcnNlIHRyZWUgZm9yIHRoZSBmaW5hbCBleHByZXNzaW9uLgorICAgICMgQHJldHVybiBbU2NyaXB0OjpUcmVlOjpOb2RlXQorICAgIGF0dHJfYWNjZXNzb3IgOnRvCisKKyAgICAjIFdoZXRoZXIgdG8gaW5jbHVkZSBgdG9gIGluIHRoZSBsb29wIG9yIHN0b3AganVzdCBiZWZvcmUuCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGF0dHJfcmVhZGVyIDpleGNsdXNpdmUKKworICAgICMgQHBhcmFtIHZhciBbU3RyaW5nXSBTZWUgXHsjdmFyfQorICAgICMgQHBhcmFtIGZyb20gW1NjcmlwdDo6VHJlZTo6Tm9kZV0gU2VlIFx7I2Zyb219CisgICAgIyBAcGFyYW0gdG8gW1NjcmlwdDo6VHJlZTo6Tm9kZV0gU2VlIFx7I3RvfQorICAgICMgQHBhcmFtIGV4Y2x1c2l2ZSBbQm9vbGVhbl0gU2VlIFx7I2V4Y2x1c2l2ZX0KKyAgICBkZWYgaW5pdGlhbGl6ZSh2YXIsIGZyb20sIHRvLCBleGNsdXNpdmUpCisgICAgICBAdmFyID0gdmFyCisgICAgICBAZnJvbSA9IGZyb20KKyAgICAgIEB0byA9IHRvCisgICAgICBAZXhjbHVzaXZlID0gZXhjbHVzaXZlCisgICAgICBzdXBlcigpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvZnVuY3Rpb25fbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9mdW5jdGlvbl9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyY2ExOGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvZnVuY3Rpb25fbm9kZS5yYgpAQCAtMCwwICsxLDQ0IEBACittb2R1bGUgU2FzcworICBtb2R1bGUgVHJlZQorICAgICMgQSBkeW5hbWljIG5vZGUgcmVwcmVzZW50aW5nIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAgICAjCisgICAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgICBjbGFzcyBGdW5jdGlvbk5vZGUgPCBOb2RlCisgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgYXR0cl9yZWFkZXIgOm5hbWUKKworICAgICAgIyBUaGUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi4gRWFjaCBlbGVtZW50IGlzIGEgdHVwbGUKKyAgICAgICMgY29udGFpbmluZyB0aGUgdmFyaWFibGUgZm9yIGFyZ3VtZW50IGFuZCB0aGUgcGFyc2UgdHJlZSBmb3IKKyAgICAgICMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFyZ3VtZW50CisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0FycmF5PFNjcmlwdDo6VHJlZTo6Tm9kZT5dCisgICAgICBhdHRyX2FjY2Vzc29yIDphcmdzCisKKyAgICAgICMgVGhlIHNwbGF0IGFyZ3VtZW50IGZvciB0aGlzIGZ1bmN0aW9uLCBpZiBvbmUgZXhpc3RzLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlRyZWU6Ok5vZGU/XQorICAgICAgYXR0cl9hY2Nlc3NvciA6c3BsYXQKKworICAgICAgIyBTdHJpcHMgb3V0IGFueSB2ZW5kb3IgcHJlZml4ZXMuCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIG5vcm1hbGl6ZWQgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLgorICAgICAgZGVmIG5vcm1hbGl6ZWRfbmFtZQorICAgICAgICBAbm9ybWFsaXplZF9uYW1lIHx8PSBuYW1lLmdzdWIoL14oPzotW2EtekEtWjAtOV0rLSk/LywgJ1wxJykKKyAgICAgIGVuZAorCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBmdW5jdGlvbiBuYW1lCisgICAgICAjIEBwYXJhbSBhcmdzIFtBcnJheTwoU2NyaXB0OjpUcmVlOjpOb2RlLCBTY3JpcHQ6OlRyZWU6Ok5vZGUpPl0KKyAgICAgICMgICBUaGUgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24uCisgICAgICAjIEBwYXJhbSBzcGxhdCBbU2NyaXB0OjpUcmVlOjpOb2RlXSBTZWUgXHsjc3BsYXR9CisgICAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBhcmdzLCBzcGxhdCkKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBhcmdzID0gYXJncworICAgICAgICBAc3BsYXQgPSBzcGxhdAorICAgICAgICBzdXBlcigpCisKKyAgICAgICAgcmV0dXJuIHVubGVzcyAldyhhbmQgb3Igbm90KS5pbmNsdWRlPyhuYW1lKQorICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIkludmFsaWQgZnVuY3Rpb24gbmFtZSBcIiN7bmFtZX1cIi4iKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvaWZfbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9pZl9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZmVjN2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvaWZfbm9kZS5yYgpAQCAtMCwwICsxLDUyIEBACityZXF1aXJlICdzYXNzL3RyZWUvbm9kZScKKworbW9kdWxlIFNhc3M6OlRyZWUKKyAgIyBBIGR5bmFtaWMgbm9kZSByZXByZXNlbnRpbmcgYSBTYXNzIGBAaWZgIHN0YXRlbWVudC4KKyAgIworICAjIHtJZk5vZGV9cyBhcmUgYSBsaXR0bGUgb2RkLCBpbiB0aGF0IHRoZXkgYWxzbyByZXByZXNlbnQgYEBlbHNlYCBhbmQgYEBlbHNlIGlmYHMuCisgICMgVGhpcyBpcyBkb25lIGFzIGEgbGlua2VkIGxpc3Q6CisgICMgZWFjaCB7SWZOb2RlfSBoYXMgYSBsaW5rIChceyNlbHNlfSkgdG8gdGhlIG5leHQge0lmTm9kZX0uCisgICMKKyAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgY2xhc3MgSWZOb2RlIDwgTm9kZQorICAgICMgVGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCisgICAgIyBJZiB0aGlzIGlzIG5pbCwgdGhpcyBpcyBhbiBgQGVsc2VgIG5vZGUsIG5vdCBhbiBgQGVsc2UgaWZgLgorICAgICMKKyAgICAjIEByZXR1cm4gW1NjcmlwdDo6RXhwcl0KKyAgICBhdHRyX2FjY2Vzc29yIDpleHByCisKKyAgICAjIFRoZSBuZXh0IHtJZk5vZGV9IGluIHRoZSBpZi1lbHNlIGxpc3QsIG9yIGBuaWxgLgorICAgICMKKyAgICAjIEByZXR1cm4gW0lmTm9kZV0KKyAgICBhdHRyX2FjY2Vzc29yIDplbHNlCisKKyAgICAjIEBwYXJhbSBleHByIFtTY3JpcHQ6OkV4cHJdIFNlZSBceyNleHByfQorICAgIGRlZiBpbml0aWFsaXplKGV4cHIpCisgICAgICBAZXhwciA9IGV4cHIKKyAgICAgIEBsYXN0X2Vsc2UgPSBzZWxmCisgICAgICBzdXBlcigpCisgICAgZW5kCisKKyAgICAjIEFwcGVuZCBhbiBgQGVsc2VgIG5vZGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAjCisgICAgIyBAcGFyYW0gbm9kZSBbSWZOb2RlXSBUaGUgYEBlbHNlYCBub2RlIHRvIGFwcGVuZAorICAgIGRlZiBhZGRfZWxzZShub2RlKQorICAgICAgQGxhc3RfZWxzZS5lbHNlID0gbm9kZQorICAgICAgQGxhc3RfZWxzZSA9IG5vZGUKKyAgICBlbmQKKworICAgIGRlZiBfZHVtcChmKQorICAgICAgTWFyc2hhbC5kdW1wKFtleHByLCBzZWxmLmVsc2UsIGNoaWxkcmVuXSkKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLl9sb2FkKGRhdGEpCisgICAgICBleHByLCBlbHNlXywgY2hpbGRyZW4gPSBNYXJzaGFsLmxvYWQoZGF0YSkKKyAgICAgIG5vZGUgPSBJZk5vZGUubmV3KGV4cHIpCisgICAgICBub2RlLmVsc2UgPSBlbHNlXworICAgICAgbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuCisgICAgICBub2RlLmluc3RhbmNlX3ZhcmlhYmxlX3NldCgnQGxhc3RfZWxzZScsCisgICAgICAgIG5vZGUuZWxzZSA/IG5vZGUuZWxzZS5pbnN0YW5jZV92YXJpYWJsZV9nZXQoJ0BsYXN0X2Vsc2UnKSA6IG5vZGUpCisgICAgICBub2RlCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvaW1wb3J0X25vZGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvaW1wb3J0X25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1YmQzOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9pbXBvcnRfbm9kZS5yYgpAQCAtMCwwICsxLDc1IEBACittb2R1bGUgU2FzcworICBtb2R1bGUgVHJlZQorICAgICMgQSBzdGF0aWMgbm9kZSB0aGF0IHdyYXBzIHRoZSB7U2Fzczo6VHJlZX0gZm9yIGFuIGBAaW1wb3J0YGVkIGZpbGUuCisgICAgIyBJdCBkb2Vzbid0IGhhdmUgYSBmdW5jdGlvbmFsIHB1cnBvc2Ugb3RoZXIgdGhhbiB0byBhZGQgdGhlIGBAaW1wb3J0YGVkIGZpbGUKKyAgICAjIHRvIHRoZSBiYWNrdHJhY2UgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgIGNsYXNzIEltcG9ydE5vZGUgPCBSb290Tm9kZQorICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgaW1wb3J0ZWQgZmlsZSBhcyBpdCBhcHBlYXJzIGluIHRoZSBTYXNzIGRvY3VtZW50LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBhdHRyX3JlYWRlciA6aW1wb3J0ZWRfZmlsZW5hbWUKKworICAgICAgIyBTZXRzIHRoZSBpbXBvcnRlZCBmaWxlLgorICAgICAgYXR0cl93cml0ZXIgOmltcG9ydGVkX2ZpbGUKKworICAgICAgIyBAcGFyYW0gaW1wb3J0ZWRfZmlsZW5hbWUgW1N0cmluZ10gVGhlIG5hbWUgb2YgdGhlIGltcG9ydGVkIGZpbGUKKyAgICAgIGRlZiBpbml0aWFsaXplKGltcG9ydGVkX2ZpbGVuYW1lKQorICAgICAgICBAaW1wb3J0ZWRfZmlsZW5hbWUgPSBpbXBvcnRlZF9maWxlbmFtZQorICAgICAgICBzdXBlcihuaWwpCisgICAgICBlbmQKKworICAgICAgZGVmIGludmlzaWJsZT87IHRvX3MuZW1wdHk/OyBlbmQKKworICAgICAgIyBSZXR1cm5zIHRoZSBpbXBvcnRlZCBmaWxlLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTYXNzOjpFbmdpbmVdCisgICAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIElmIG5vIGZpbGUgY291bGQgYmUgZm91bmQgdG8gaW1wb3J0LgorICAgICAgZGVmIGltcG9ydGVkX2ZpbGUKKyAgICAgICAgQGltcG9ydGVkX2ZpbGUgfHw9IGltcG9ydAorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGltcG9ydCBzaG91bGQgZW1pdCBhIENTUyBAaW1wb3J0IGRlY2xhcmF0aW9uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSBzaW1wbGUgQ1NTIEBpbXBvcnQgZGVjbGFyYXRpb24uCisgICAgICBkZWYgY3NzX2ltcG9ydD8KKyAgICAgICAgaWYgQGltcG9ydGVkX2ZpbGVuYW1lID1+IC9cLmNzcyQvCisgICAgICAgICAgQGltcG9ydGVkX2ZpbGVuYW1lCisgICAgICAgIGVsc2lmIGltcG9ydGVkX2ZpbGUuaXNfYT8oU3RyaW5nKSAmJiBpbXBvcnRlZF9maWxlID1+IC9cLmNzcyQvCisgICAgICAgICAgaW1wb3J0ZWRfZmlsZQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBpbXBvcnQKKyAgICAgICAgcGF0aHMgPSBAb3B0aW9uc1s6bG9hZF9wYXRoc10KKworICAgICAgICBpZiBAb3B0aW9uc1s6aW1wb3J0ZXJdCisgICAgICAgICAgZiA9IEBvcHRpb25zWzppbXBvcnRlcl0uZmluZF9yZWxhdGl2ZSgKKyAgICAgICAgICAgIEBpbXBvcnRlZF9maWxlbmFtZSwgQG9wdGlvbnNbOmZpbGVuYW1lXSwgb3B0aW9uc19mb3JfaW1wb3J0ZXIpCisgICAgICAgICAgcmV0dXJuIGYgaWYgZgorICAgICAgICBlbmQKKworICAgICAgICBwYXRocy5lYWNoIGRvIHxwfAorICAgICAgICAgIGYgPSBwLmZpbmQoQGltcG9ydGVkX2ZpbGVuYW1lLCBvcHRpb25zX2Zvcl9pbXBvcnRlcikKKyAgICAgICAgICByZXR1cm4gZiBpZiBmCisgICAgICAgIGVuZAorCisgICAgICAgIGxpbmVzID0gWyJGaWxlIHRvIGltcG9ydCBub3QgZm91bmQgb3IgdW5yZWFkYWJsZTogI3tAaW1wb3J0ZWRfZmlsZW5hbWV9LiJdCisKKyAgICAgICAgaWYgcGF0aHMuc2l6ZSA9PSAxCisgICAgICAgICAgbGluZXMgPDwgIkxvYWQgcGF0aDogI3twYXRocy5maXJzdH0iCisgICAgICAgIGVsc2lmICFwYXRocy5lbXB0eT8KKyAgICAgICAgICBsaW5lcyA8PCAiTG9hZCBwYXRoczpcbiAgI3twYXRocy5qb2luKCJcbiAgIil9IgorICAgICAgICBlbmQKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IubmV3KGxpbmVzLmpvaW4oIlxuIikpCisgICAgICByZXNjdWUgU3ludGF4RXJyb3IgPT4gZQorICAgICAgICByYWlzZSBTeW50YXhFcnJvci5uZXcoZS5tZXNzYWdlLCA6bGluZSA9PiBsaW5lLCA6ZmlsZW5hbWUgPT4gQGZpbGVuYW1lKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBvcHRpb25zX2Zvcl9pbXBvcnRlcgorICAgICAgICBAb3B0aW9ucy5tZXJnZSg6X2Zyb21faW1wb3J0X25vZGUgPT4gdHJ1ZSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL2tleWZyYW1lX3J1bGVfbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9rZXlmcmFtZV9ydWxlX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3NWY5NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9rZXlmcmFtZV9ydWxlX25vZGUucmIKQEAgLTAsMCArMSwxNSBAQAorbW9kdWxlIFNhc3M6OlRyZWUKKyAgY2xhc3MgS2V5ZnJhbWVSdWxlTm9kZSA8IE5vZGUKKyAgICAjIFRoZSB0ZXh0IG9mIHRoZSBkaXJlY3RpdmUgYWZ0ZXIgYW55IGludGVycG9sYXRlZCBTYXNzU2NyaXB0IGhhcyBiZWVuIHJlc29sdmVkLgorICAgICMgU2luY2UgdGhpcyBpcyBvbmx5IGEgc3RhdGljIG5vZGUsIHRoaXMgaXMgdGhlIG9ubHkgdmFsdWUgcHJvcGVydHkuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX3ZhbHVlCisKKyAgICAjIEBwYXJhbSByZXNvbHZlZF92YWx1ZSBbU3RyaW5nXSBTZWUgXHsjcmVzb2x2ZWRfdmFsdWV9CisgICAgZGVmIGluaXRpYWxpemUocmVzb2x2ZWRfdmFsdWUpCisgICAgICBAcmVzb2x2ZWRfdmFsdWUgPSByZXNvbHZlZF92YWx1ZQorICAgICAgc3VwZXIoKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL21lZGlhX25vZGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvbWVkaWFfbm9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc4ZGUwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL21lZGlhX25vZGUucmIKQEAgLTAsMCArMSw0OCBAQAorbW9kdWxlIFNhc3M6OlRyZWUKKyAgIyBBIHN0YXRpYyBub2RlIHJlcHJlc2VudGluZyBhIGBAbWVkaWFgIHJ1bGUuCisgICMgYEBtZWRpYWAgcnVsZXMgYmVoYXZlIGRpZmZlcmVudGx5IGZyb20gb3RoZXIgZGlyZWN0aXZlcworICAjIGluIHRoYXQgd2hlbiB0aGV5J3JlIG5lc3RlZCB3aXRoaW4gcnVsZXMsCisgICMgdGhleSBidWJibGUgdXAgdG8gdG9wLWxldmVsLgorICAjCisgICMgQHNlZSBTYXNzOjpUcmVlCisgIGNsYXNzIE1lZGlhTm9kZSA8IERpcmVjdGl2ZU5vZGUKKyAgICAjIFRPRE86IHBhcnNlIGFuZCBjYWNoZSB0aGUgcXVlcnkgaW1tZWRpYXRlbHkgaWYgaXQgaGFzIG5vIGR5bmFtaWMgZWxlbWVudHMKKworICAgICMgVGhlIG1lZGlhIHF1ZXJ5IGZvciB0aGlzIHJ1bGUsIGludGVyc3BlcnNlZCB3aXRoIHtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGV9cworICAgICMgcmVwcmVzZW50aW5nIGAje31gLWludGVycG9sYXRpb24uIEFueSBhZGphY2VudCBzdHJpbmdzIHdpbGwgYmUgbWVyZ2VkCisgICAgIyB0b2dldGhlci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT5dCisgICAgYXR0cl9hY2Nlc3NvciA6cXVlcnkKKworICAgICMgVGhlIG1lZGlhIHF1ZXJ5IGZvciB0aGlzIHJ1bGUsIHdpdGhvdXQgYW55IHVucmVzb2x2ZWQgaW50ZXJwb2xhdGlvbi4gSXQncworICAgICMgb25seSBzZXQgb25jZSB7VHJlZTo6VmlzaXRvcnM6OlBlcmZvcm19IGhhcyBiZWVuIHJ1bi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpNZWRpYTo6UXVlcnlMaXN0XQorICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX3F1ZXJ5CisKKyAgICAjIEBwYXJhbSBxdWVyeSBbQXJyYXk8U3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGU+XSBTZWUgXHsjcXVlcnl9CisgICAgZGVmIGluaXRpYWxpemUocXVlcnkpCisgICAgICBAcXVlcnkgPSBxdWVyeQorICAgICAgc3VwZXIoJycpCisgICAgZW5kCisKKyAgICAjIEBzZWUgRGlyZWN0aXZlTm9kZSN2YWx1ZQorICAgIGRlZiB2YWx1ZTsgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcjsgZW5kCisKKyAgICAjIEBzZWUgRGlyZWN0aXZlTm9kZSNuYW1lCisgICAgZGVmIG5hbWU7ICdAbWVkaWEnOyBlbmQKKworICAgICMgQHNlZSBEaXJlY3RpdmVOb2RlI3Jlc29sdmVkX3ZhbHVlCisgICAgZGVmIHJlc29sdmVkX3ZhbHVlCisgICAgICBAcmVzb2x2ZWRfdmFsdWUgfHw9ICJAbWVkaWEgI3tyZXNvbHZlZF9xdWVyeS50b19jc3N9IgorICAgIGVuZAorCisgICAgIyBUcnVlIHdoZW4gdGhlIGRpcmVjdGl2ZSBoYXMgbm8gdmlzaWJsZSBjaGlsZHJlbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBpbnZpc2libGU/CisgICAgICBjaGlsZHJlbi5hbGw/IHt8Y3wgYy5pbnZpc2libGU/fQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL21peGluX2RlZl9ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL21peGluX2RlZl9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDhiZmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvbWl4aW5fZGVmX25vZGUucmIKQEAgLTAsMCArMSwzOCBAQAorbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFRyZWUKKyAgICAjIEEgZHluYW1pYyBub2RlIHJlcHJlc2VudGluZyBhIG1peGluIGRlZmluaXRpb24uCisgICAgIworICAgICMgQHNlZSBTYXNzOjpUcmVlCisgICAgY2xhc3MgTWl4aW5EZWZOb2RlIDwgTm9kZQorICAgICAgIyBUaGUgbWl4aW4gbmFtZS4KKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgYXR0cl9yZWFkZXIgOm5hbWUKKworICAgICAgIyBUaGUgYXJndW1lbnRzIGZvciB0aGUgbWl4aW4uCisgICAgICAjIEVhY2ggZWxlbWVudCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlIGZvciBhcmd1bWVudAorICAgICAgIyBhbmQgdGhlIHBhcnNlIHRyZWUgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQXJyYXk8KFNjcmlwdDo6VHJlZTo6Tm9kZSwgU2NyaXB0OjpUcmVlOjpOb2RlKT5dCisgICAgICBhdHRyX2FjY2Vzc29yIDphcmdzCisKKyAgICAgICMgVGhlIHNwbGF0IGFyZ3VtZW50IGZvciB0aGlzIG1peGluLCBpZiBvbmUgZXhpc3RzLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlRyZWU6Ok5vZGU/XQorICAgICAgYXR0cl9hY2Nlc3NvciA6c3BsYXQKKworICAgICAgIyBXaGV0aGVyIHRoZSBtaXhpbiB1c2VzIGBAY29udGVudGAuIFNldCBkdXJpbmcgdGhlIG5lc3RpbmcgY2hlY2sgcGhhc2UuCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBhdHRyX2FjY2Vzc29yIDpoYXNfY29udGVudAorCisgICAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBtaXhpbiBuYW1lCisgICAgICAjIEBwYXJhbSBhcmdzIFtBcnJheTwoU2NyaXB0OjpUcmVlOjpOb2RlLCBTY3JpcHQ6OlRyZWU6Ok5vZGUpPl0gU2VlIFx7I2FyZ3N9CisgICAgICAjIEBwYXJhbSBzcGxhdCBbU2NyaXB0OjpUcmVlOjpOb2RlXSBTZWUgXHsjc3BsYXR9CisgICAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBhcmdzLCBzcGxhdCkKKyAgICAgICAgQG5hbWUgPSBuYW1lCisgICAgICAgIEBhcmdzID0gYXJncworICAgICAgICBAc3BsYXQgPSBzcGxhdAorICAgICAgICBzdXBlcigpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9taXhpbl9ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL21peGluX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1OTJjMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9taXhpbl9ub2RlLnJiCkBAIC0wLDAgKzEsNTIgQEAKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9ub2RlJworCittb2R1bGUgU2Fzczo6VHJlZQorICAjIEEgc3RhdGljIG5vZGUgcmVwcmVzZW50aW5nIGEgbWl4aW4gaW5jbHVkZS4KKyAgIyBXaGVuIGluIGEgc3RhdGljIHRyZWUsIHRoZSBzb2xlIHB1cnBvc2UgaXMgdG8gd3JhcCBleGNlcHRpb25zCisgICMgdG8gYWRkIHRoZSBtaXhpbiB0byB0aGUgYmFja3RyYWNlLgorICAjCisgICMgQHNlZSBTYXNzOjpUcmVlCisgIGNsYXNzIE1peGluTm9kZSA8IE5vZGUKKyAgICAjIFRoZSBuYW1lIG9mIHRoZSBtaXhpbi4KKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX3JlYWRlciA6bmFtZQorCisgICAgIyBUaGUgYXJndW1lbnRzIHRvIHRoZSBtaXhpbi4KKyAgICAjIEByZXR1cm4gW0FycmF5PFNjcmlwdDo6VHJlZTo6Tm9kZT5dCisgICAgYXR0cl9hY2Nlc3NvciA6YXJncworCisgICAgIyBBIGhhc2ggZnJvbSBrZXl3b3JkIGFyZ3VtZW50IG5hbWVzIHRvIHZhbHVlcy4KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlV0aWw6Ok5vcm1hbGl6ZWRNYXA8U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICBhdHRyX2FjY2Vzc29yIDprZXl3b3JkcworCisgICAgIyBUaGUgZmlyc3Qgc3BsYXQgYXJndW1lbnQgZm9yIHRoaXMgbWl4aW4sIGlmIG9uZSBleGlzdHMuCisgICAgIworICAgICMgVGhpcyBjb3VsZCBiZSBhIGxpc3Qgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMsIGEgbWFwIG9mIGtleXdvcmQKKyAgICAjIGFyZ3VtZW50cywgb3IgYW4gYXJnbGlzdCBjb250YWluaW5nIGJvdGguCisgICAgIworICAgICMgQHJldHVybiBbTm9kZT9dCisgICAgYXR0cl9hY2Nlc3NvciA6c3BsYXQKKworICAgICMgVGhlIHNlY29uZCBzcGxhdCBhcmd1bWVudCBmb3IgdGhpcyBtaXhpbiwgaWYgb25lIGV4aXN0cy4KKyAgICAjCisgICAgIyBJZiB0aGlzIGV4aXN0cywgaXQncyBhbHdheXMgYSBtYXAgb2Yga2V5d29yZCBhcmd1bWVudHMsIGFuZAorICAgICMgXHsjc3BsYXR9IGlzIGFsd2F5cyBlaXRoZXIgYSBsaXN0IG9yIGFuIGFyZ2xpc3QuCisgICAgIworICAgICMgQHJldHVybiBbTm9kZT9dCisgICAgYXR0cl9hY2Nlc3NvciA6a3dhcmdfc3BsYXQKKworICAgICMgQHBhcmFtIG5hbWUgW1N0cmluZ10gVGhlIG5hbWUgb2YgdGhlIG1peGluCisgICAgIyBAcGFyYW0gYXJncyBbQXJyYXk8U2NyaXB0OjpUcmVlOjpOb2RlPl0gU2VlIFx7I2FyZ3N9CisgICAgIyBAcGFyYW0gc3BsYXQgW1NjcmlwdDo6VHJlZTo6Tm9kZV0gU2VlIFx7I3NwbGF0fQorICAgICMgQHBhcmFtIGt3YXJnX3NwbGF0IFtTY3JpcHQ6OlRyZWU6Ok5vZGVdIFNlZSBceyNrd2FyZ19zcGxhdH0KKyAgICAjIEBwYXJhbSBrZXl3b3JkcyBbU2Fzczo6VXRpbDo6Tm9ybWFsaXplZE1hcDxTY3JpcHQ6OlRyZWU6Ok5vZGU+XSBTZWUgXHsja2V5d29yZHN9CisgICAgZGVmIGluaXRpYWxpemUobmFtZSwgYXJncywga2V5d29yZHMsIHNwbGF0LCBrd2FyZ19zcGxhdCkKKyAgICAgIEBuYW1lID0gbmFtZQorICAgICAgQGFyZ3MgPSBhcmdzCisgICAgICBAa2V5d29yZHMgPSBrZXl3b3JkcworICAgICAgQHNwbGF0ID0gc3BsYXQKKyAgICAgIEBrd2FyZ19zcGxhdCA9IGt3YXJnX3NwbGF0CisgICAgICBzdXBlcigpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OTMyZjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvbm9kZS5yYgpAQCAtMCwwICsxLDI0MCBAQAorbW9kdWxlIFNhc3MKKyAgIyBBIG5hbWVzcGFjZSBmb3Igbm9kZXMgaW4gdGhlIFNhc3MgcGFyc2UgdHJlZS4KKyAgIworICAjIFRoZSBTYXNzIHBhcnNlIHRyZWUgaGFzIHRocmVlIHN0YXRlczogZHluYW1pYywgc3RhdGljIFNhc3MsIGFuZCBzdGF0aWMgQ1NTLgorICAjCisgICMgV2hlbiBpdCdzIGZpcnN0IHBhcnNlZCwgYSBTYXNzIGRvY3VtZW50IGlzIGluIHRoZSBkeW5hbWljIHN0YXRlLgorICAjIEl0IGhhcyBub2RlcyBmb3IgbWl4aW4gZGVmaW5pdGlvbnMgYW5kIGBAZm9yYCBsb29wcyBhbmQgc28gZm9ydGgsCisgICMgaW4gYWRkaXRpb24gdG8gbm9kZXMgZm9yIENTUyBydWxlcyBhbmQgcHJvcGVydGllcy4KKyAgIyBOb2RlcyB0aGF0IG9ubHkgYXBwZWFyIGluIHRoaXMgc3RhdGUgYXJlIGNhbGxlZCAqKmR5bmFtaWMgbm9kZXMqKi4KKyAgIworICAjIHtUcmVlOjpWaXNpdG9yczo6UGVyZm9ybX0gY3JlYXRlcyBhIHN0YXRpYyBTYXNzIHRyZWUsIHdoaWNoIGlzCisgICMgZGlmZmVyZW50LiBJdCBzdGlsbCBoYXMgbm9kZXMgZm9yIENTUyBydWxlcyBhbmQgcHJvcGVydGllcyBidXQgaXQKKyAgIyBkb2Vzbid0IGhhdmUgYW55IGR5bmFtaWMtZ2VuZXJhdGlvbi1yZWxhdGVkIG5vZGVzLiBUaGUgbm9kZXMgaW4KKyAgIyB0aGlzIHN0YXRlIGFyZSBpbiBhIHNpbWlsYXIgc3RydWN0dXJlIHRvIHRoZSBTYXNzIGRvY3VtZW50OiBydWxlcworICAjIGFuZCBwcm9wZXJ0aWVzIGFyZSBuZXN0ZWQgYmVuZWF0aCBvbmUgYW5vdGhlciwgYWx0aG91Z2ggdGhlCisgICMge1RyZWU6OlJ1bGVOb2RlfSBzZWxlY3RvcnMgYXJlIGFscmVhZHkgaW4gdGhlaXIgZmluYWwgc3RhdGUuIE5vZGVzCisgICMgdGhhdCBjYW4gYmUgaW4gdGhpcyBzdGF0ZSBvciBpbiB0aGUgZHluYW1pYyBzdGF0ZSBhcmUgY2FsbGVkCisgICMgKipzdGF0aWMgbm9kZXMqKjsgbm9kZXMgdGhhdCBjYW4gb25seSBiZSBpbiB0aGlzIHN0YXRlIGFyZSBjYWxsZWQKKyAgIyAqKnNvbGVseSBzdGF0aWMgbm9kZXMqKi4KKyAgIworICAjIHtUcmVlOjpWaXNpdG9yczo6Q3NzaXplfSBpcyB0aGVuIHVzZWQgdG8gY3JlYXRlIGEgc3RhdGljIENTUyB0cmVlLgorICAjIFRoaXMgaXMgbGlrZSBhIHN0YXRpYyBTYXNzIHRyZWUsCisgICMgYnV0IHRoZSBzdHJ1Y3R1cmUgZXhhY3RseSBtaXJyb3JzIHRoYXQgb2YgdGhlIGdlbmVyYXRlZCBDU1MuCisgICMgUnVsZXMgYW5kIHByb3BlcnRpZXMgY2FuJ3QgYmUgbmVzdGVkIGJlbmVhdGggb25lIGFub3RoZXIgaW4gdGhpcyBzdGF0ZS4KKyAgIworICAjIEZpbmFsbHksIHtUcmVlOjpWaXNpdG9yczo6VG9Dc3N9IGNhbiBiZSBjYWxsZWQgb24gYSBzdGF0aWMgQ1NTIHRyZWUKKyAgIyB0byBnZXQgdGhlIGFjdHVhbCBDU1MgY29kZSBhcyBhIHN0cmluZy4KKyAgbW9kdWxlIFRyZWUKKyAgICAjIFRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGFsbCBwYXJzZS10cmVlIG5vZGVzLgorICAgIGNsYXNzIE5vZGUKKyAgICAgIGluY2x1ZGUgRW51bWVyYWJsZQorCisgICAgICBkZWYgc2VsZi5pbmhlcml0ZWQoYmFzZSkKKyAgICAgICAgbm9kZV9uYW1lID0gYmFzZS5uYW1lLmdzdWIoLy4qOjooLio/KU5vZGUkLywgJ1xcMScpLmRvd25jYXNlCisgICAgICAgIGJhc2UuaW5zdGFuY2VfZXZhbCA8PC1NRVRIT0RTCisgICAgICAgICAgIyBAcmV0dXJuIFtTeW1ib2xdIFRoZSBuYW1lIHRoYXQgaXMgdXNlZCBmb3IgdGhpcyBub2RlIHdoZW4gdmlzaXRpbmcuCisgICAgICAgICAgZGVmIG5vZGVfbmFtZQorICAgICAgICAgICAgOiN7bm9kZV9uYW1lfQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgIyBAcmV0dXJuIFtTeW1ib2xdIFRoZSBtZXRob2QgdGhhdCBpcyB1c2VkIG9uIHRoZSB2aXNpdG9yIHRvIHZpc2l0IG5vZGVzIG9mIHRoaXMgdHlwZS4KKyAgICAgICAgICBkZWYgdmlzaXRfbWV0aG9kCisgICAgICAgICAgICA6dmlzaXRfI3tub2RlX25hbWV9CisgICAgICAgICAgZW5kCisKKyAgICAgICAgICAjIEByZXR1cm4gW1N5bWJvbF0gVGhlIG1ldGhvZCBuYW1lIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgcGFyZW50IGlzIGludmFsaWQuCisgICAgICAgICAgZGVmIGludmFsaWRfY2hpbGRfbWV0aG9kX25hbWUKKyAgICAgICAgICAgIDoiaW52YWxpZF8je25vZGVfbmFtZX1fY2hpbGQ/IgorICAgICAgICAgIGVuZAorCisgICAgICAgICAgIyBAcmV0dXJuIFtTeW1ib2xdIFRoZSBtZXRob2QgbmFtZSB0aGF0IGRldGVybWluZXMgaWYgdGhlIG5vZGUgaXMgYW4gaW52YWxpZCBwYXJlbnQuCisgICAgICAgICAgZGVmIGludmFsaWRfcGFyZW50X21ldGhvZF9uYW1lCisgICAgICAgICAgICA6ImludmFsaWRfI3tub2RlX25hbWV9X3BhcmVudD8iCisgICAgICAgICAgZW5kCisgICAgICAgIE1FVEhPRFMKKyAgICAgIGVuZAorCisgICAgICAjIFRoZSBjaGlsZCBub2RlcyBvZiB0aGlzIG5vZGUuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0FycmF5PFRyZWU6Ok5vZGU+XQorICAgICAgYXR0cl9yZWFkZXIgOmNoaWxkcmVuCisKKyAgICAgICMgV2hldGhlciBvciBub3QgdGhpcyBub2RlIGhhcyBjaGlsZCBub2Rlcy4KKyAgICAgICMgVGhpcyBtYXkgYmUgdHJ1ZSBldmVuIHdoZW4gXHsjY2hpbGRyZW59IGlzIGVtcHR5LAorICAgICAgIyBpbiB3aGljaCBjYXNlIHRoaXMgbm9kZSBoYXMgYW4gZW1wdHkgYmxvY2sgKGUuZy4gYHt9YCkuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBhdHRyX2FjY2Vzc29yIDpoYXNfY2hpbGRyZW4KKworICAgICAgIyBUaGUgbGluZSBvZiB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdGhpcyBub2RlIGFwcGVhcmVkLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgICAgYXR0cl9hY2Nlc3NvciA6bGluZQorCisgICAgICAjIFRoZSBzb3VyY2UgcmFuZ2UgaW4gdGhlIGRvY3VtZW50IG9uIHdoaWNoIHRoaXMgbm9kZSBhcHBlYXJlZC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU2Fzczo6U291cmNlOjpSYW5nZV0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOnNvdXJjZV9yYW5nZQorCisgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudCBvbiB3aGljaCB0aGlzIG5vZGUgYXBwZWFyZWQuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgIGF0dHJfd3JpdGVyIDpmaWxlbmFtZQorCisgICAgICAjIFRoZSBvcHRpb25zIGhhc2ggZm9yIHRoZSBub2RlLgorICAgICAgIyBTZWUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjT3B0aW9ucyB0aGUgU2FzcyBvcHRpb25zIGRvY3VtZW50YXRpb259LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFt7U3ltYm9sID0+IE9iamVjdH1dCisgICAgICBhdHRyX3JlYWRlciA6b3B0aW9ucworCisgICAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgICBAY2hpbGRyZW4gPSBbXQorICAgICAgICBAZmlsZW5hbWUgPSBuaWwKKyAgICAgICAgQG9wdGlvbnMgPSBuaWwKKyAgICAgIGVuZAorCisgICAgICAjIFNldHMgdGhlIG9wdGlvbnMgaGFzaCBmb3IgdGhlIG5vZGUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCisgICAgICAjCisgICAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIFRoZSBvcHRpb25zCisgICAgICAjIEBzZWUgI29wdGlvbnMKKyAgICAgIGRlZiBvcHRpb25zPShvcHRpb25zKQorICAgICAgICBTYXNzOjpUcmVlOjpWaXNpdG9yczo6U2V0T3B0aW9ucy52aXNpdChzZWxmLCBvcHRpb25zKQorICAgICAgZW5kCisKKyAgICAgICMgQHByaXZhdGUKKyAgICAgIGRlZiBjaGlsZHJlbj0oY2hpbGRyZW4pCisgICAgICAgIHNlbGYuaGFzX2NoaWxkcmVuIHx8PSAhY2hpbGRyZW4uZW1wdHk/CisgICAgICAgIEBjaGlsZHJlbiA9IGNoaWxkcmVuCisgICAgICBlbmQKKworICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdGhpcyBub2RlIGFwcGVhcmVkLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgICBkZWYgZmlsZW5hbWUKKyAgICAgICAgQGZpbGVuYW1lIHx8IChAb3B0aW9ucyAmJiBAb3B0aW9uc1s6ZmlsZW5hbWVdKQorICAgICAgZW5kCisKKyAgICAgICMgQXBwZW5kcyBhIGNoaWxkIHRvIHRoZSBub2RlLgorICAgICAgIworICAgICAgIyBAcGFyYW0gY2hpbGQgW1RyZWU6Ok5vZGUsIEFycmF5PFRyZWU6Ok5vZGU+XSBUaGUgY2hpbGQgbm9kZSBvciBub2RlcworICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiBgY2hpbGRgIGlzIGludmFsaWQKKyAgICAgIGRlZiA8PChjaGlsZCkKKyAgICAgICAgcmV0dXJuIGlmIGNoaWxkLm5pbD8KKyAgICAgICAgaWYgY2hpbGQuaXNfYT8oQXJyYXkpCisgICAgICAgICAgY2hpbGQuZWFjaCB7fGN8IHNlbGYgPDwgY30KKyAgICAgICAgZWxzZQorICAgICAgICAgIHNlbGYuaGFzX2NoaWxkcmVuID0gdHJ1ZQorICAgICAgICAgIEBjaGlsZHJlbiA8PCBjaGlsZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIENvbXBhcmVzIHRoaXMgbm9kZSBhbmQgYW5vdGhlciBvYmplY3QgKG9ubHkgb3RoZXIge1RyZWU6Ok5vZGV9cyB3aWxsIGJlIGVxdWFsKS4KKyAgICAgICMgVGhpcyBkb2VzIGEgc3RydWN0dXJhbCBjb21wYXJpc29uOworICAgICAgIyBpZiB0aGUgY29udGVudHMgb2YgdGhlIG5vZGVzIGFuZCBhbGwgdGhlIGNoaWxkIG5vZGVzIGFyZSBlcXVpdmFsZW50LAorICAgICAgIyB0aGVuIHRoZSBub2RlcyBhcmUgYXMgd2VsbC4KKyAgICAgICMKKyAgICAgICMgT25seSBzdGF0aWMgbm9kZXMgbmVlZCB0byBvdmVycmlkZSB0aGlzLgorICAgICAgIworICAgICAgIyBAcGFyYW0gb3RoZXIgW09iamVjdF0gVGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGgKKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciBvciBub3QgdGhpcyBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0CisgICAgICAjICAgYXJlIHRoZSBzYW1lCisgICAgICAjIEBzZWUgU2Fzczo6VHJlZQorICAgICAgZGVmID09KG90aGVyKQorICAgICAgICBzZWxmLmNsYXNzID09IG90aGVyLmNsYXNzICYmIG90aGVyLmNoaWxkcmVuID09IGNoaWxkcmVuCisgICAgICBlbmQKKworICAgICAgIyBUcnVlIGlmIFx7I3RvXF9zfSB3aWxsIHJldHVybiBgbmlsYDsKKyAgICAgICMgdGhhdCBpcywgaWYgdGhlIG5vZGUgc2hvdWxkbid0IGJlIHJlbmRlcmVkLgorICAgICAgIyBTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gYSBzdGF0aWMgdHJlZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICAgIGRlZiBpbnZpc2libGU/OyBmYWxzZTsgZW5kCisKKyAgICAgICMgVGhlIG91dHB1dCBzdHlsZS4gU2VlIHtmaWxlOlNBU1NfUkVGRVJFTkNFLm1kI09wdGlvbnMgdGhlIFNhc3Mgb3B0aW9ucyBkb2N1bWVudGF0aW9ufS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3ltYm9sXQorICAgICAgZGVmIHN0eWxlCisgICAgICAgIEBvcHRpb25zWzpzdHlsZV0KKyAgICAgIGVuZAorCisgICAgICAjIENvbXB1dGVzIHRoZSBDU1MgY29ycmVzcG9uZGluZyB0byB0aGlzIHN0YXRpYyBDU1MgdHJlZS4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgcmVzdWx0aW5nIENTUworICAgICAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgICAgIGRlZiBjc3MKKyAgICAgICAgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OlRvQ3NzLm5ldy52aXNpdChzZWxmKQorICAgICAgZW5kCisKKyAgICAgICMgQ29tcHV0ZXMgdGhlIENTUyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3RhdGljIENTUyB0cmVlLCBhbG9uZyB3aXRoCisgICAgICAjIHRoZSByZXNwZWN0aXZlIHNvdXJjZSBtYXAuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gWyhTdHJpbmcsIFNhc3M6OlNvdXJjZTo6TWFwKV0gVGhlIHJlc3VsdGluZyBDU1MgYW5kIHRoZSBzb3VyY2UgbWFwCisgICAgICAjIEBzZWUgU2Fzczo6VHJlZQorICAgICAgZGVmIGNzc193aXRoX3NvdXJjZW1hcAorICAgICAgICB2aXNpdG9yID0gU2Fzczo6VHJlZTo6VmlzaXRvcnM6OlRvQ3NzLm5ldyg6YnVpbGRfc291cmNlX21hcHBpbmcpCisgICAgICAgIHJlc3VsdCA9IHZpc2l0b3IudmlzaXQoc2VsZikKKyAgICAgICAgcmV0dXJuIHJlc3VsdCwgdmlzaXRvci5zb3VyY2VfbWFwcGluZworICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub2RlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICAgIGRlZiBpbnNwZWN0CisgICAgICAgIHJldHVybiBzZWxmLmNsYXNzLnRvX3MgdW5sZXNzIGhhc19jaGlsZHJlbgorICAgICAgICAiKCN7c2VsZi5jbGFzc30gI3tjaGlsZHJlbi5tYXAge3xjfCBjLmluc3BlY3R9LmpvaW4oJyAnKX0pIgorICAgICAgZW5kCisKKyAgICAgICMgSXRlcmF0ZXMgdGhyb3VnaCBlYWNoIG5vZGUgaW4gdGhlIHRyZWUgcm9vdGVkIGF0IHRoaXMgbm9kZQorICAgICAgIyBpbiBhIHByZS1vcmRlciB3YWxrLgorICAgICAgIworICAgICAgIyBAeWllbGQgbm9kZQorICAgICAgIyBAeWllbGRwYXJhbSBub2RlIFtOb2RlXSBhIG5vZGUgaW4gdGhlIHRyZWUKKyAgICAgIGRlZiBlYWNoCisgICAgICAgIHlpZWxkIHNlbGYKKyAgICAgICAgY2hpbGRyZW4uZWFjaCB7fGN8IGMuZWFjaCB7fG58IHlpZWxkIG59fQorICAgICAgZW5kCisKKyAgICAgICMgQ29udmVydHMgYSBub2RlIHRvIFNhc3MgY29kZSB0aGF0IHdpbGwgZ2VuZXJhdGUgaXQuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIEFuIG9wdGlvbnMgaGFzaCAoc2VlIHtTYXNzOjpDU1MjaW5pdGlhbGl6ZX0pCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIFNhc3MgY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlCisgICAgICBkZWYgdG9fc2FzcyhvcHRpb25zID0ge30pCisgICAgICAgIFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpDb252ZXJ0LnZpc2l0KHNlbGYsIG9wdGlvbnMsIDpzYXNzKQorICAgICAgZW5kCisKKyAgICAgICMgQ29udmVydHMgYSBub2RlIHRvIFNDU1MgY29kZSB0aGF0IHdpbGwgZ2VuZXJhdGUgaXQuCisgICAgICAjCisgICAgICAjIEBwYXJhbSBvcHRpb25zIFt7U3ltYm9sID0+IE9iamVjdH1dIEFuIG9wdGlvbnMgaGFzaCAoc2VlIHtTYXNzOjpDU1MjaW5pdGlhbGl6ZX0pCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIFNhc3MgY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlCisgICAgICBkZWYgdG9fc2NzcyhvcHRpb25zID0ge30pCisgICAgICAgIFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpDb252ZXJ0LnZpc2l0KHNlbGYsIG9wdGlvbnMsIDpzY3NzKQorICAgICAgZW5kCisKKyAgICAgICMgUmV0dXJuIGEgZGVlcCBjbG9uZSBvZiB0aGlzIG5vZGUuCisgICAgICAjIFRoZSBjaGlsZCBub2RlcyBhcmUgY2xvbmVkLCBidXQgb3B0aW9ucyBhcmUgbm90LgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtOb2RlXQorICAgICAgZGVmIGRlZXBfY29weQorICAgICAgICBTYXNzOjpUcmVlOjpWaXNpdG9yczo6RGVlcENvcHkudmlzaXQoc2VsZikKKyAgICAgIGVuZAorCisgICAgICAjIFdoZXRoZXIgb3Igbm90IHRoaXMgbm9kZSBidWJibGVzIHVwIHRocm91Z2ggUnVsZU5vZGVzLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIGJ1YmJsZXM/CisgICAgICAgIGZhbHNlCisgICAgICBlbmQKKworICAgICAgcHJvdGVjdGVkCisKKyAgICAgICMgQHNlZSBTYXNzOjpTaGFyZWQuYmFsYW5jZQorICAgICAgIyBAcmFpc2UgW1Nhc3M6OlN5bnRheEVycm9yXSBpZiB0aGUgYnJhY2tldHMgYXJlbid0IGJhbGFuY2VkCisgICAgICBkZWYgYmFsYW5jZSgqYXJncykKKyAgICAgICAgcmVzID0gU2Fzczo6U2hhcmVkLmJhbGFuY2UoKmFyZ3MpCisgICAgICAgIHJldHVybiByZXMgaWYgcmVzCisgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiVW5iYWxhbmNlZCBicmFja2V0cy4iLCA6bGluZSA9PiBsaW5lKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvcHJvcF9ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Byb3Bfbm9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2U4YmRkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Byb3Bfbm9kZS5yYgpAQCAtMCwwICsxLDE2MiBAQAorbW9kdWxlIFNhc3M6OlRyZWUKKyAgIyBBIHN0YXRpYyBub2RlIHJlcHJlc2VudGluZyBhIENTUyBwcm9wZXJ0eS4KKyAgIworICAjIEBzZWUgU2Fzczo6VHJlZQorICBjbGFzcyBQcm9wTm9kZSA8IE5vZGUKKyAgICAjIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSwKKyAgICAjIGludGVyc3BlcnNlZCB3aXRoIHtTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGV9cworICAgICMgcmVwcmVzZW50aW5nIGAje31gLWludGVycG9sYXRpb24uCisgICAgIyBBbnkgYWRqYWNlbnQgc3RyaW5ncyB3aWxsIGJlIG1lcmdlZCB0b2dldGhlci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtBcnJheTxTdHJpbmcsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZT5dCisgICAgYXR0cl9hY2Nlc3NvciA6bmFtZQorCisgICAgIyBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAjIGFmdGVyIGFueSBpbnRlcnBvbGF0ZWQgU2Fzc1NjcmlwdCBoYXMgYmVlbiByZXNvbHZlZC4KKyAgICAjIE9ubHkgc2V0IG9uY2UgXHtUcmVlOjpWaXNpdG9yczo6UGVyZm9ybX0gaGFzIGJlZW4gcnVuLgorICAgICMKKyAgICAjIEByZXR1cm4gW1N0cmluZ10KKyAgICBhdHRyX2FjY2Vzc29yIDpyZXNvbHZlZF9uYW1lCisKKyAgICAjIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgIworICAgICMgRm9yIG1vc3QgcHJvcGVydGllcywgdGhpcyB3aWxsIGp1c3QgY29udGFpbiBhIHNpbmdsZSBOb2RlLiBIb3dldmVyLCBmb3IKKyAgICAjIENTUyB2YXJpYWJsZXMsIGl0IHdpbGwgY29udGFpbiBtdWx0aXBsZSBzdHJpbmdzIGFuZCBub2RlcyByZXByZXNlbnRpbmcKKyAgICAjIGludGVycG9sYXRpb24uIEFueSBhZGphY2VudCBzdHJpbmdzIHdpbGwgYmUgbWVyZ2VkIHRvZ2V0aGVyLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICBhdHRyX2FjY2Vzc29yIDp2YWx1ZQorCisgICAgIyBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgIyBhZnRlciBhbnkgaW50ZXJwb2xhdGVkIFNhc3NTY3JpcHQgaGFzIGJlZW4gcmVzb2x2ZWQuCisgICAgIyBPbmx5IHNldCBvbmNlIFx7VHJlZTo6VmlzaXRvcnM6OlBlcmZvcm19IGhhcyBiZWVuIHJ1bi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgYXR0cl9hY2Nlc3NvciA6cmVzb2x2ZWRfdmFsdWUKKworICAgICMgSG93IGRlZXAgdGhpcyBwcm9wZXJ0eSBpcyBpbmRlbnRlZAorICAgICMgcmVsYXRpdmUgdG8gYSBub3JtYWwgcHJvcGVydHkuCisgICAgIyBUaGlzIGlzIG9ubHkgZ3JlYXRlciB0aGFuIDAgaW4gdGhlIGNhc2UgdGhhdDoKKyAgICAjCisgICAgIyAqIFRoaXMgbm9kZSBpcyBpbiBhIENTUyB0cmVlCisgICAgIyAqIFRoZSBzdHlsZSBpcyA6bmVzdGVkCisgICAgIyAqIFRoaXMgaXMgYSBjaGlsZCBwcm9wZXJ0eSBvZiBhbm90aGVyIHByb3BlcnR5CisgICAgIyAqIFRoZSBwYXJlbnQgcHJvcGVydHkgaGFzIGEgdmFsdWUsIGFuZCB0aHVzIHdpbGwgYmUgcmVuZGVyZWQKKyAgICAjCisgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgIGF0dHJfYWNjZXNzb3IgOnRhYnMKKworICAgICMgVGhlIHNvdXJjZSByYW5nZSBpbiB3aGljaCB0aGUgcHJvcGVydHkgbmFtZSBhcHBlYXJzLgorICAgICMKKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNvdXJjZTo6UmFuZ2VdCisgICAgYXR0cl9hY2Nlc3NvciA6bmFtZV9zb3VyY2VfcmFuZ2UKKworICAgICMgVGhlIHNvdXJjZSByYW5nZSBpbiB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgYXBwZWFycy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTb3VyY2U6OlJhbmdlXQorICAgIGF0dHJfYWNjZXNzb3IgOnZhbHVlX3NvdXJjZV9yYW5nZQorCisgICAgIyBXaGV0aGVyIHRoaXMgcmVwcmVzZW50cyBhIENTUyBjdXN0b20gcHJvcGVydHkuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgY3VzdG9tX3Byb3BlcnR5PworICAgICAgbmFtZS5maXJzdC5pc19hPyhTdHJpbmcpICYmIG5hbWUuZmlyc3Quc3RhcnRfd2l0aD8oIi0tIikKKyAgICBlbmQKKworICAgICMgQHBhcmFtIG5hbWUgW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0gU2VlIFx7I25hbWV9CisgICAgIyBAcGFyYW0gdmFsdWUgW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0gU2VlIFx7I3ZhbHVlfQorICAgICMgQHBhcmFtIHByb3Bfc3ludGF4IFtTeW1ib2xdIGA6bmV3YCBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYGE6IGJgLXN0eWxlIHN5bnRheCwKKyAgICAjICAgYDpvbGRgIGlmIGl0IHVzZXMgYDphIGJgLXN0eWxlIHN5bnRheAorICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHZhbHVlLCBwcm9wX3N5bnRheCkKKyAgICAgIEBuYW1lID0gU2Fzczo6VXRpbC5zdHJpcF9zdHJpbmdfYXJyYXkoCisgICAgICAgIFNhc3M6OlV0aWwubWVyZ2VfYWRqYWNlbnRfc3RyaW5ncyhuYW1lKSkKKyAgICAgIEB2YWx1ZSA9IFNhc3M6OlV0aWwubWVyZ2VfYWRqYWNlbnRfc3RyaW5ncyh2YWx1ZSkKKyAgICAgIEB2YWx1ZSA9IFNhc3M6OlV0aWwuc3RyaXBfc3RyaW5nX2FycmF5KEB2YWx1ZSkgdW5sZXNzIGN1c3RvbV9wcm9wZXJ0eT8KKyAgICAgIEB0YWJzID0gMAorICAgICAgQHByb3Bfc3ludGF4ID0gcHJvcF9zeW50YXgKKyAgICAgIHN1cGVyKCkKKyAgICBlbmQKKworICAgICMgQ29tcGFyZXMgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgdHdvIHByb3BlcnRpZXMuCisgICAgIworICAgICMgQHBhcmFtIG90aGVyIFtPYmplY3RdIFRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIG9yIG5vdCB0aGlzIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QKKyAgICAjICAgYXJlIHRoZSBzYW1lCisgICAgZGVmID09KG90aGVyKQorICAgICAgc2VsZi5jbGFzcyA9PSBvdGhlci5jbGFzcyAmJiBuYW1lID09IG90aGVyLm5hbWUgJiYgdmFsdWUgPT0gb3RoZXIudmFsdWUgJiYgc3VwZXIKKyAgICBlbmQKKworICAgICMgUmV0dXJucyBhIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaW5kaWNhdGluZyBob3cgdG8gZXNjYXBlIHBzZXVkby1jbGFzcyBzZWxlY3RvcnMuCisgICAgIyBUaGlzIG9ubHkgYXBwbGllcyBmb3Igb2xkLXN0eWxlIHByb3BlcnRpZXMgd2l0aCBubyB2YWx1ZSwKKyAgICAjIHNvIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGlzIGlzIG5ldy1zdHlsZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBtZXNzYWdlCisgICAgZGVmIHBzZXVkb19jbGFzc19zZWxlY3Rvcl9tZXNzYWdlCisgICAgICBpZiBAcHJvcF9zeW50YXggPT0gOm5ldyB8fAorICAgICAgICAgIGN1c3RvbV9wcm9wZXJ0eT8gfHwKKyAgICAgICAgICAhdmFsdWUuZmlyc3QuaXNfYT8oU2Fzczo6U2NyaXB0OjpUcmVlOjpMaXRlcmFsKSB8fAorICAgICAgICAgICF2YWx1ZS5maXJzdC52YWx1ZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpIHx8CisgICAgICAgICAgIXZhbHVlLmZpcnN0LnZhbHVlLnZhbHVlLmVtcHR5PworICAgICAgICByZXR1cm4gIiIKKyAgICAgIGVuZAorCisgICAgICAiXG5JZiAje2RlY2xhcmF0aW9uLmR1bXB9IHNob3VsZCBiZSBhIHNlbGVjdG9yLCB1c2UgXCJcXCN7ZGVjbGFyYXRpb259XCIgaW5zdGVhZC4iCisgICAgZW5kCisKKyAgICAjIENvbXB1dGVzIHRoZSBTYXNzIG9yIFNDU1MgY29kZSBmb3IgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgICMgVGhpcyBpcyBsaWtlIFx7I3RvXF9zY3NzfSBvciBceyN0b1xfc2Fzc30sCisgICAgIyBleGNlcHQgaXQgZG9lc24ndCBwcmludCBhbnkgY2hpbGQgcHJvcGVydGllcyBvciBhIHRyYWlsaW5nIHNlbWljb2xvbi4KKyAgICAjCisgICAgIyBAcGFyYW0gb3B0cyBbe1N5bWJvbCA9PiBPYmplY3R9XSBUaGUgb3B0aW9ucyBoYXNoIGZvciB0aGUgdHJlZS4KKyAgICAjIEBwYXJhbSBmbXQgW1N5bWJvbF0gYDpzY3NzYCBvciBgOnNhc3NgLgorICAgIGRlZiBkZWNsYXJhdGlvbihvcHRzID0gezpvbGQgPT4gQHByb3Bfc3ludGF4ID09IDpvbGR9LCBmbXQgPSA6c2FzcykKKyAgICAgIG5hbWUgPSBzZWxmLm5hbWUubWFwIHt8bnwgbi5pc19hPyhTdHJpbmcpID8gbiA6IG4udG9fc2FzcyhvcHRzKX0uam9pbgorICAgICAgdmFsdWUgPSBzZWxmLnZhbHVlLm1hcCB7fG58IG4uaXNfYT8oU3RyaW5nKSA/IG4gOiBuLnRvX3Nhc3Mob3B0cyl9LmpvaW4KKyAgICAgIHZhbHVlID0gIigje3ZhbHVlfSkiIGlmIHZhbHVlX25lZWRzX3BhcmVucz8KKworICAgICAgaWYgbmFtZVswXSA9PSA/OgorICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIlRoZSBcIiN7bmFtZX06ICN7dmFsdWV9XCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaGFjayBpcyBub3QgYWxsb3dlZCBpbiB0aGUgU2FzcyBpbmRlbnRlZCBzeW50YXgiKQorICAgICAgZW5kCisKKyAgICAgICMgVGhlIGluZGVudGVkIHN5bnRheCBkb2Vzbid0IHN1cHBvcnQgbmV3bGluZXMgaW4gY3VzdG9tIHByb3BlcnR5IHZhbHVlcywKKyAgICAgICMgYnV0IHdlIGNhbiBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlbSB0byBzcGFjZXMgaW5zdGVhZC4KKyAgICAgIHZhbHVlID0gdmFsdWUudHIoIlxuIiwgIiAiKSBpZiBmbXQgPT0gOnNhc3MKKworICAgICAgb2xkID0gb3B0c1s6b2xkXSAmJiBmbXQgPT0gOnNhc3MKKyAgICAgICIje29sZCA/ICc6JyA6ICcnfSN7bmFtZX0je29sZCA/ICcnIDogJzonfSN7Y3VzdG9tX3Byb3BlcnR5PyA/ICcnIDogJyAnfSN7dmFsdWV9Ii5yc3RyaXAKKyAgICBlbmQKKworICAgICMgQSBwcm9wZXJ0eSBub2RlIGlzIGludmlzaWJsZSBpZiBpdHMgdmFsdWUgaXMgZW1wdHkuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgaW52aXNpYmxlPworICAgICAgIWN1c3RvbV9wcm9wZXJ0eT8gJiYgcmVzb2x2ZWRfdmFsdWUuZW1wdHk/CisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICAjIFJldHVybnMgd2hldGhlciBceyN2YWx1ZX0gbmVlc2QgcGFyZW50aGVzZXMgaW4gb3JkZXIgdG8gYmUgcGFyc2VkCisgICAgIyBwcm9wZXJseSBhcyBkaXZpc2lvbi4KKyAgICBkZWYgdmFsdWVfbmVlZHNfcGFyZW5zPworICAgICAgcmV0dXJuIGZhbHNlIGlmIGN1c3RvbV9wcm9wZXJ0eT8KKworICAgICAgcm9vdCA9IHZhbHVlLmZpcnN0CisgICAgICByb290LmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6T3BlcmF0aW9uKSAmJgorICAgICAgICByb290Lm9wZXJhdG9yID09IDpkaXYgJiYKKyAgICAgICAgcm9vdC5vcGVyYW5kMS5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6OkxpdGVyYWwpICYmCisgICAgICAgIHJvb3Qub3BlcmFuZDEudmFsdWUuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKSAmJgorICAgICAgICByb290Lm9wZXJhbmQxLnZhbHVlLm9yaWdpbmFsLm5pbD8gJiYKKyAgICAgICAgcm9vdC5vcGVyYW5kMi5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6OkxpdGVyYWwpICYmCisgICAgICAgIHJvb3Qub3BlcmFuZDIudmFsdWUuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyKSAmJgorICAgICAgICByb290Lm9wZXJhbmQyLnZhbHVlLm9yaWdpbmFsLm5pbD8KKyAgICBlbmQKKworICAgIGRlZiBjaGVjayEKKyAgICAgIHJldHVybiB1bmxlc3MgQG9wdGlvbnNbOnByb3BlcnR5X3N5bnRheF0gJiYgQG9wdGlvbnNbOnByb3BlcnR5X3N5bnRheF0gIT0gQHByb3Bfc3ludGF4CisgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoCisgICAgICAgICJJbGxlZ2FsIHByb3BlcnR5IHN5bnRheDogY2FuJ3QgdXNlICN7QHByb3Bfc3ludGF4fSBzeW50YXggd2hlbiAiICsKKyAgICAgICAgIjpwcm9wZXJ0eV9zeW50YXggPT4gI3tAb3B0aW9uc1s6cHJvcGVydHlfc3ludGF4XS5pbnNwZWN0fSBpcyBzZXQuIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9yZXR1cm5fbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9yZXR1cm5fbm9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU2NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3JldHVybl9ub2RlLnJiCkBAIC0wLDAgKzEsMTkgQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBUcmVlCisgICAgIyBBIGR5bmFtaWMgbm9kZSByZXByZXNlbnRpbmcgcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvbi4KKyAgICAjCisgICAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgICBjbGFzcyBSZXR1cm5Ob2RlIDwgTm9kZQorICAgICAgIyBUaGUgZXhwcmVzc2lvbiB0byByZXR1cm4uCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1NjcmlwdDo6VHJlZTo6Tm9kZV0KKyAgICAgIGF0dHJfYWNjZXNzb3IgOmV4cHIKKworICAgICAgIyBAcGFyYW0gZXhwciBbU2NyaXB0OjpUcmVlOjpOb2RlXSBUaGUgZXhwcmVzc2lvbiB0byByZXR1cm4KKyAgICAgIGRlZiBpbml0aWFsaXplKGV4cHIpCisgICAgICAgIEBleHByID0gZXhwcgorICAgICAgICBzdXBlcigpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS9yb290X25vZGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvcm9vdF9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDJjYmQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvcm9vdF9ub2RlLnJiCkBAIC0wLDAgKzEsNDQgQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBUcmVlCisgICAgIyBBIHN0YXRpYyBub2RlIHRoYXQgaXMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgU2FzcyBkb2N1bWVudC4KKyAgICBjbGFzcyBSb290Tm9kZSA8IE5vZGUKKyAgICAgICMgVGhlIFNhc3MgdGVtcGxhdGUgZnJvbSB3aGljaCB0aGlzIG5vZGUgd2FzIGNyZWF0ZWQKKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHRlbXBsYXRlIFtTdHJpbmddCisgICAgICBhdHRyX3JlYWRlciA6dGVtcGxhdGUKKworICAgICAgIyBAcGFyYW0gdGVtcGxhdGUgW1N0cmluZ10gVGhlIFNhc3MgdGVtcGxhdGUgZnJvbSB3aGljaCB0aGlzIG5vZGUgd2FzIGNyZWF0ZWQKKyAgICAgIGRlZiBpbml0aWFsaXplKHRlbXBsYXRlKQorICAgICAgICBzdXBlcigpCisgICAgICAgIEB0ZW1wbGF0ZSA9IHRlbXBsYXRlCisgICAgICBlbmQKKworICAgICAgIyBSdW5zIHRoZSBkeW5hbWljIFNhc3MgY29kZSBhbmQgY29tcHV0ZXMgdGhlIENTUyBmb3IgdGhlIHRyZWUuCisgICAgICAjCisgICAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIGNvbXBpbGVkIENTUy4KKyAgICAgIGRlZiByZW5kZXIKKyAgICAgICAgY3NzX3RyZWUuY3NzCisgICAgICBlbmQKKworICAgICAgIyBSdW5zIHRoZSBkeW5hbWljIFNhc3MgY29kZSBhbmQgY29tcHV0ZXMgdGhlIENTUyBmb3IgdGhlIHRyZWUsIGFsb25nIHdpdGgKKyAgICAgICMgdGhlIHNvdXJjZW1hcC4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbKFN0cmluZywgU2Fzczo6U291cmNlOjpNYXApXSBUaGUgY29tcGlsZWQgQ1NTLCBhcyB3ZWxsIGFzCisgICAgICAjICAgdGhlIHNvdXJjZSBtYXAuIEBzZWUgI3JlbmRlcgorICAgICAgZGVmIHJlbmRlcl93aXRoX3NvdXJjZW1hcAorICAgICAgICBjc3NfdHJlZS5jc3Nfd2l0aF9zb3VyY2VtYXAKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBjc3NfdHJlZQorICAgICAgICBWaXNpdG9yczo6Q2hlY2tOZXN0aW5nLnZpc2l0KHNlbGYpCisgICAgICAgIHJlc3VsdCA9IFZpc2l0b3JzOjpQZXJmb3JtLnZpc2l0KHNlbGYpCisgICAgICAgIFZpc2l0b3JzOjpDaGVja05lc3RpbmcudmlzaXQocmVzdWx0KSAjIENoZWNrIGFnYWluIHRvIHZhbGlkYXRlIG1peGlucworICAgICAgICByZXN1bHQsIGV4dGVuZHMgPSBWaXNpdG9yczo6Q3NzaXplLnZpc2l0KHJlc3VsdCkKKyAgICAgICAgVmlzaXRvcnM6OkV4dGVuZC52aXNpdChyZXN1bHQsIGV4dGVuZHMpCisgICAgICAgIHJlc3VsdAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvcnVsZV9ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3J1bGVfbm9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ExNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3J1bGVfbm9kZS5yYgpAQCAtMCwwICsxLDE1NiBAQAorcmVxdWlyZSAncGF0aG5hbWUnCisKK21vZHVsZSBTYXNzOjpUcmVlCisgICMgQSBzdGF0aWMgbm9kZSByZXByZXNlbnRpbmcgYSBDU1MgcnVsZS4KKyAgIworICAjIEBzZWUgU2Fzczo6VHJlZQorICBjbGFzcyBSdWxlTm9kZSA8IE5vZGUKKyAgICAjIFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBpbmNsdWRlIHRoZSBwYXJlbnQgc2VsZWN0b3IKKyAgICBQQVJFTlQgPSAnJicKKworICAgICMgVGhlIENTUyBzZWxlY3RvciBmb3IgdGhpcyBydWxlLAorICAgICMgaW50ZXJzcGVyc2VkIHdpdGgge1Nhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZX1zCisgICAgIyByZXByZXNlbnRpbmcgYCN7fWAtaW50ZXJwb2xhdGlvbi4KKyAgICAjIEFueSBhZGphY2VudCBzdHJpbmdzIHdpbGwgYmUgbWVyZ2VkIHRvZ2V0aGVyLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPl0KKyAgICBhdHRyX2FjY2Vzc29yIDpydWxlCisKKyAgICAjIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoaXMgcnVsZSwgd2l0aG91dCBhbnkgdW5yZXNvbHZlZAorICAgICMgaW50ZXJwb2xhdGlvbiBidXQgd2l0aCBwYXJlbnQgcmVmZXJlbmNlcyBzdGlsbCBpbnRhY3QuIEl0J3Mgb25seQorICAgICMgZ3VhcmFudGVlZCB0byBiZSBzZXQgb25jZSB7VHJlZTo6VmlzaXRvcnM6OlBlcmZvcm19IGhhcyBiZWVuCisgICAgIyBydW4sIGJ1dCBpdCBtYXkgYmUgc2V0IGJlZm9yZSB0aGVuIGZvciBvcHRpbWl6YXRpb24gcmVhc29ucy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTZWxlY3Rvcjo6Q29tbWFTZXF1ZW5jZV0KKyAgICBhdHRyX2FjY2Vzc29yIDpwYXJzZWRfcnVsZXMKKworICAgICMgVGhlIENTUyBzZWxlY3RvciBmb3IgdGhpcyBydWxlLCB3aXRob3V0IGFueSB1bnJlc29sdmVkCisgICAgIyBpbnRlcnBvbGF0aW9uIG9yIHBhcmVudCByZWZlcmVuY2VzLiBJdCdzIG9ubHkgc2V0IG9uY2UKKyAgICAjIHtUcmVlOjpWaXNpdG9yczo6UGVyZm9ybX0gaGFzIGJlZW4gcnVuLgorICAgICMKKyAgICAjIEByZXR1cm4gW1NlbGVjdG9yOjpDb21tYVNlcXVlbmNlXQorICAgIGF0dHJfYWNjZXNzb3IgOnJlc29sdmVkX3J1bGVzCisKKyAgICAjIEhvdyBkZWVwIHRoaXMgcnVsZSBpcyBpbmRlbnRlZAorICAgICMgcmVsYXRpdmUgdG8gYSBiYXNlLWxldmVsIHJ1bGUuCisgICAgIyBUaGlzIGlzIG9ubHkgZ3JlYXRlciB0aGFuIDAgaW4gdGhlIGNhc2UgdGhhdDoKKyAgICAjCisgICAgIyAqIFRoaXMgbm9kZSBpcyBpbiBhIENTUyB0cmVlCisgICAgIyAqIFRoZSBzdHlsZSBpcyA6bmVzdGVkCisgICAgIyAqIFRoaXMgaXMgYSBjaGlsZCBydWxlIG9mIGFub3RoZXIgcnVsZQorICAgICMgKiBUaGUgcGFyZW50IHJ1bGUgaGFzIHByb3BlcnRpZXMsIGFuZCB0aHVzIHdpbGwgYmUgcmVuZGVyZWQKKyAgICAjCisgICAgIyBAcmV0dXJuIFtJbnRlZ2VyXQorICAgIGF0dHJfYWNjZXNzb3IgOnRhYnMKKworICAgICMgVGhlIGVudGlyZSBzZWxlY3RvciBzb3VyY2UgcmFuZ2UgZm9yIHRoaXMgcnVsZS4KKyAgICAjIEByZXR1cm4gW1Nhc3M6OlNvdXJjZTo6UmFuZ2VdCisgICAgYXR0cl9hY2Nlc3NvciA6c2VsZWN0b3Jfc291cmNlX3JhbmdlCisKKyAgICAjIFdoZXRoZXIgb3Igbm90IHRoaXMgcnVsZSBpcyB0aGUgbGFzdCBydWxlIGluIGEgbmVzdGVkIGdyb3VwLgorICAgICMgVGhpcyBpcyBvbmx5IHNldCBpbiBhIENTUyB0cmVlLgorICAgICMKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgYXR0cl9hY2Nlc3NvciA6Z3JvdXBfZW5kCisKKyAgICAjIFRoZSBzdGFjayB0cmFjZS4KKyAgICAjIFRoaXMgaXMgb25seSByZWFkYWJsZSBpbiBhIENTUyB0cmVlIGFzIGl0IGlzIHdyaXR0ZW4gZHVyaW5nIHRoZSBwZXJmb3JtIHN0ZXAKKyAgICAjIGFuZCBvbmx5IHdoZW4gdGhlIDp0cmFjZV9zZWxlY3RvcnMgb3B0aW9uIGlzIHNldC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmddCisgICAgYXR0cl9hY2Nlc3NvciA6c3RhY2tfdHJhY2UKKworICAgICMgQHBhcmFtIHJ1bGUgW0FycmF5PFN0cmluZywgU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlPiwgU2Fzczo6U2VsZWN0b3I6OkNvbW1hU2VxdWVuY2VdCisgICAgIyAgIFRoZSBDU1MgcnVsZSwgZWl0aGVyIHVucGFyc2VkIG9yIHBhcnNlZC4KKyAgICAjIEBwYXJhbSBzZWxlY3Rvcl9zb3VyY2VfcmFuZ2UgW1Nhc3M6OlNvdXJjZTo6UmFuZ2VdCisgICAgZGVmIGluaXRpYWxpemUocnVsZSwgc2VsZWN0b3Jfc291cmNlX3JhbmdlID0gbmlsKQorICAgICAgaWYgcnVsZS5pc19hPyhTYXNzOjpTZWxlY3Rvcjo6Q29tbWFTZXF1ZW5jZSkKKyAgICAgICAgQHJ1bGUgPSBbcnVsZS50b19zXQorICAgICAgICBAcGFyc2VkX3J1bGVzID0gcnVsZQorICAgICAgZWxzZQorICAgICAgICBtZXJnZWQgPSBTYXNzOjpVdGlsLm1lcmdlX2FkamFjZW50X3N0cmluZ3MocnVsZSkKKyAgICAgICAgQHJ1bGUgPSBTYXNzOjpVdGlsLnN0cmlwX3N0cmluZ19hcnJheShtZXJnZWQpCisgICAgICAgIHRyeV90b19wYXJzZV9ub25faW50ZXJwb2xhdGVkX3J1bGVzCisgICAgICBlbmQKKyAgICAgIEBzZWxlY3Rvcl9zb3VyY2VfcmFuZ2UgPSBzZWxlY3Rvcl9zb3VyY2VfcmFuZ2UKKyAgICAgIEB0YWJzID0gMAorICAgICAgc3VwZXIoKQorICAgIGVuZAorCisgICAgIyBJZiB3ZSd2ZSBwcmVjYWNoZWQgdGhlIHBhcnNlZCBzZWxlY3Rvciwgc2V0IHRoZSBsaW5lIG9uIGl0LCB0b28uCisgICAgZGVmIGxpbmU9KGxpbmUpCisgICAgICBAcGFyc2VkX3J1bGVzLmxpbmUgPSBsaW5lIGlmIEBwYXJzZWRfcnVsZXMKKyAgICAgIHN1cGVyCisgICAgZW5kCisKKyAgICAjIElmIHdlJ3ZlIHByZWNhY2hlZCB0aGUgcGFyc2VkIHNlbGVjdG9yLCBzZXQgdGhlIGZpbGVuYW1lIG9uIGl0LCB0b28uCisgICAgZGVmIGZpbGVuYW1lPShmaWxlbmFtZSkKKyAgICAgIEBwYXJzZWRfcnVsZXMuZmlsZW5hbWUgPSBmaWxlbmFtZSBpZiBAcGFyc2VkX3J1bGVzCisgICAgICBzdXBlcgorICAgIGVuZAorCisgICAgIyBDb21wYXJlcyB0aGUgY29udGVudHMgb2YgdHdvIHJ1bGVzLgorICAgICMKKyAgICAjIEBwYXJhbSBvdGhlciBbT2JqZWN0XSBUaGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aAorICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciBvciBub3QgdGhpcyBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0CisgICAgIyAgIGFyZSB0aGUgc2FtZQorICAgIGRlZiA9PShvdGhlcikKKyAgICAgIHNlbGYuY2xhc3MgPT0gb3RoZXIuY2xhc3MgJiYgcnVsZSA9PSBvdGhlci5ydWxlICYmIHN1cGVyCisgICAgZW5kCisKKyAgICAjIEFkZHMgYW5vdGhlciB7UnVsZU5vZGV9J3MgcnVsZXMgdG8gdGhpcyBvbmUncy4KKyAgICAjCisgICAgIyBAcGFyYW0gbm9kZSBbUnVsZU5vZGVdIFRoZSBvdGhlciBub2RlCisgICAgZGVmIGFkZF9ydWxlcyhub2RlKQorICAgICAgQHJ1bGUgPSBTYXNzOjpVdGlsLnN0cmlwX3N0cmluZ19hcnJheSgKKyAgICAgICAgU2Fzczo6VXRpbC5tZXJnZV9hZGphY2VudF9zdHJpbmdzKEBydWxlICsgWyJcbiJdICsgbm9kZS5ydWxlKSkKKyAgICAgIHRyeV90b19wYXJzZV9ub25faW50ZXJwb2xhdGVkX3J1bGVzCisgICAgZW5kCisKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dIFdoZXRoZXIgb3Igbm90IHRoaXMgcnVsZSBpcyBjb250aW51ZWQgb24gdGhlIG5leHQgbGluZQorICAgIGRlZiBjb250aW51ZWQ/CisgICAgICBsYXN0ID0gQHJ1bGUubGFzdAorICAgICAgbGFzdC5pc19hPyhTdHJpbmcpICYmIGxhc3RbLTFdID09ID8sCisgICAgZW5kCisKKyAgICAjIEEgaGFzaCB0aGF0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVsZSBpbiB0aGUgQ1NTIGRvY3VtZW50CisgICAgIyBpZiB0aGUge2ZpbGU6U0FTU19SRUZFUkVOQ0UubWQjZGVidWdfaW5mby1vcHRpb24gYDpkZWJ1Z19pbmZvYCBvcHRpb259IGlzIGVuYWJsZWQuCisgICAgIyBUaGlzIGRhdGEgaXMgdXNlZCBieSBlLmcuIFt0aGUgRmlyZVNhc3MgRmlyZWJ1ZworICAgICMgZXh0ZW5zaW9uXShodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9lbi1VUy9maXJlZm94L2FkZG9uLzEwMzk4OCkuCisgICAgIworICAgICMgQHJldHVybiBbeyN0b19zID0+ICN0b19zfV0KKyAgICBkZWYgZGVidWdfaW5mbworICAgICAgezpmaWxlbmFtZSA9PiBmaWxlbmFtZSAmJgorICAgICAgICAgKCJmaWxlOi8vIiArIFVSSTo6REVGQVVMVF9QQVJTRVIuZXNjYXBlKEZpbGUuZXhwYW5kX3BhdGgoZmlsZW5hbWUpKSksCisgICAgICAgOmxpbmUgPT4gbGluZX0KKyAgICBlbmQKKworICAgICMgQSBydWxlIG5vZGUgaXMgaW52aXNpYmxlIGlmIGl0IGhhcyBvbmx5IHBsYWNlaG9sZGVyIHNlbGVjdG9ycy4KKyAgICBkZWYgaW52aXNpYmxlPworICAgICAgcmVzb2x2ZWRfcnVsZXMubWVtYmVycy5hbGw/IHt8c2VxfCBzZXEuaW52aXNpYmxlP30KKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiB0cnlfdG9fcGFyc2Vfbm9uX2ludGVycG9sYXRlZF9ydWxlcworICAgICAgQHBhcnNlZF9ydWxlcyA9IG5pbAorICAgICAgcmV0dXJuIHVubGVzcyBAcnVsZS5hbGw/IHt8dHwgdC5pc19hPyhTdHJpbmcpfQorCisgICAgICAjIFdlIGRvbid0IHVzZSByZWFsIGZpbGVuYW1lL2xpbmUgaW5mbyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgaXQgeWV0LgorICAgICAgIyBXaGVuIHdlIGdldCBpdCwgd2UnbGwgc2V0IGl0IG9uIHRoZSBwYXJzZWQgcnVsZXMgaWYgcG9zc2libGUuCisgICAgICBwYXJzZXIgPSBuaWwKKyAgICAgIHdhcm5pbmdzID0gU2Fzczo6VXRpbC5zaWxlbmNlX3dhcm5pbmdzIGRvCisgICAgICAgIHBhcnNlciA9IFNhc3M6OlNDU1M6OlN0YXRpY1BhcnNlci5uZXcoQHJ1bGUuam9pbi5zdHJpcCwgbmlsLCBuaWwsIDEpCisgICAgICAgICMgcnVib2NvcDpkaXNhYmxlIFJlc2N1ZU1vZGlmaWVyCisgICAgICAgIEBwYXJzZWRfcnVsZXMgPSBwYXJzZXIucGFyc2Vfc2VsZWN0b3IgcmVzY3VlIG5pbAorICAgICAgICAjIHJ1Ym9jb3A6ZW5hYmxlIFJlc2N1ZU1vZGlmaWVyCisKKyAgICAgICAgJHN0ZGVyci5zdHJpbmcKKyAgICAgIGVuZAorCisgICAgICAjIElmIHBhcnNpbmcgcHJvZHVjZXMgYSB3YXJuaW5nLCB0aHJvdyBhd2F5IHRoZSByZXN1bHQgc28gd2UgY2FuIHBhcnNlCisgICAgICAjIGxhdGVyIHdpdGggdGhlIHJlYWwgZmlsZW5hbWUgaW5mby4KKyAgICAgIEBwYXJzZWRfcnVsZXMgPSBuaWwgdW5sZXNzIHdhcm5pbmdzLmVtcHR5PworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3N1cHBvcnRzX25vZGUucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvc3VwcG9ydHNfbm9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJmMDRiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3N1cHBvcnRzX25vZGUucmIKQEAgLTAsMCArMSwzOCBAQAorbW9kdWxlIFNhc3M6OlRyZWUKKyAgIyBBIHN0YXRpYyBub2RlIHJlcHJlc2VudGluZyBhIGBAc3VwcG9ydHNgIHJ1bGUuCisgICMKKyAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgY2xhc3MgU3VwcG9ydHNOb2RlIDwgRGlyZWN0aXZlTm9kZQorICAgICMgVGhlIG5hbWUsIHdoaWNoIG1heSBpbmNsdWRlIGEgYnJvd3NlciBwcmVmaXguCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfYWNjZXNzb3IgOm5hbWUKKworICAgICMgVGhlIHN1cHBvcnRzIGNvbmRpdGlvbi4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzOjpTdXBwb3J0czo6Q29uZGl0aW9uXQorICAgIGF0dHJfYWNjZXNzb3IgOmNvbmRpdGlvbgorCisgICAgIyBAcGFyYW0gY29uZGl0aW9uIFtTYXNzOjpTdXBwb3J0czo6Q29uZGl0aW9uXSBTZWUgXHsjY29uZGl0aW9ufQorICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIGNvbmRpdGlvbikKKyAgICAgIEBuYW1lID0gbmFtZQorICAgICAgQGNvbmRpdGlvbiA9IGNvbmRpdGlvbgorICAgICAgc3VwZXIoJycpCisgICAgZW5kCisKKyAgICAjIEBzZWUgRGlyZWN0aXZlTm9kZSN2YWx1ZQorICAgIGRlZiB2YWx1ZTsgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcjsgZW5kCisKKyAgICAjIEBzZWUgRGlyZWN0aXZlTm9kZSNyZXNvbHZlZF92YWx1ZQorICAgIGRlZiByZXNvbHZlZF92YWx1ZQorICAgICAgQHJlc29sdmVkX3ZhbHVlIHx8PSAiQCN7bmFtZX0gI3tjb25kaXRpb24udG9fY3NzfSIKKyAgICBlbmQKKworICAgICMgVHJ1ZSB3aGVuIHRoZSBkaXJlY3RpdmUgaGFzIG5vIHZpc2libGUgY2hpbGRyZW4uCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgaW52aXNpYmxlPworICAgICAgY2hpbGRyZW4uYWxsPyB7fGN8IGMuaW52aXNpYmxlP30KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS90cmFjZV9ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3RyYWNlX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3MWU4OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS90cmFjZV9ub2RlLnJiCkBAIC0wLDAgKzEsMzMgQEAKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9ub2RlJworCittb2R1bGUgU2Fzczo6VHJlZQorICAjIEEgc29sZWx5IHN0YXRpYyBub2RlIGxlZnQgb3ZlciBhZnRlciBhIG1peGluIGluY2x1ZGUgb3IgQGNvbnRlbnQgaGFzIGJlZW4gcGVyZm9ybWVkLgorICAjIEl0cyBzb2xlIHB1cnBvc2UgaXMgdG8gd3JhcCBleGNlcHRpb25zIHRvIGFkZCB0byB0aGUgYmFja3RyYWNlLgorICAjCisgICMgQHNlZSBTYXNzOjpUcmVlCisgIGNsYXNzIFRyYWNlTm9kZSA8IE5vZGUKKyAgICAjIFRoZSBuYW1lIG9mIHRoZSB0cmFjZSBlbnRyeSB0byBhZGQuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGF0dHJfcmVhZGVyIDpuYW1lCisKKyAgICAjIEBwYXJhbSBuYW1lIFtTdHJpbmddIFRoZSBuYW1lIG9mIHRoZSB0cmFjZSBlbnRyeSB0byBhZGQuCisgICAgZGVmIGluaXRpYWxpemUobmFtZSkKKyAgICAgIEBuYW1lID0gbmFtZQorICAgICAgc2VsZi5oYXNfY2hpbGRyZW4gPSB0cnVlCisgICAgICBzdXBlcigpCisgICAgZW5kCisKKyAgICAjIEluaXRpYWxpemVzIHRoaXMgbm9kZSBmcm9tIGFuIGV4aXN0aW5nIG5vZGUuCisgICAgIyBAcGFyYW0gbmFtZSBbU3RyaW5nXSBUaGUgbmFtZSBvZiB0aGUgdHJhY2UgZW50cnkgdG8gYWRkLgorICAgICMgQHBhcmFtIG5vZGUgW05vZGVdIFRoZSBub2RlIHRvIGNvcHkgaW5mb3JtYXRpb24gZnJvbS4KKyAgICAjIEByZXR1cm4gW1RyYWNlTm9kZV0KKyAgICBkZWYgc2VsZi5mcm9tX25vZGUobmFtZSwgbm9kZSkKKyAgICAgIHRyYWNlID0gbmV3KG5hbWUpCisgICAgICB0cmFjZS5saW5lID0gbm9kZS5saW5lCisgICAgICB0cmFjZS5maWxlbmFtZSA9IG5vZGUuZmlsZW5hbWUKKyAgICAgIHRyYWNlLm9wdGlvbnMgPSBub2RlLm9wdGlvbnMKKyAgICAgIHRyYWNlCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvdmFyaWFibGVfbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92YXJpYWJsZV9ub2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMGVkNTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvdmFyaWFibGVfbm9kZS5yYgpAQCAtMCwwICsxLDM2IEBACittb2R1bGUgU2FzcworICBtb2R1bGUgVHJlZQorICAgICMgQSBkeW5hbWljIG5vZGUgcmVwcmVzZW50aW5nIGEgdmFyaWFibGUgZGVmaW5pdGlvbi4KKyAgICAjCisgICAgIyBAc2VlIFNhc3M6OlRyZWUKKyAgICBjbGFzcyBWYXJpYWJsZU5vZGUgPCBOb2RlCisgICAgICAjIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4KKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgYXR0cl9yZWFkZXIgOm5hbWUKKworICAgICAgIyBUaGUgcGFyc2UgdHJlZSBmb3IgdGhlIHZhcmlhYmxlIHZhbHVlLgorICAgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlRyZWU6Ok5vZGVdCisgICAgICBhdHRyX2FjY2Vzc29yIDpleHByCisKKyAgICAgICMgV2hldGhlciB0aGlzIGlzIGEgZ3VhcmRlZCB2YXJpYWJsZSBhc3NpZ25tZW50IChgIWRlZmF1bHRgKS4KKyAgICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICAgIGF0dHJfcmVhZGVyIDpndWFyZGVkCisKKyAgICAgICMgV2hldGhlciB0aGlzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIGFzc2lnbm1lbnQgKGAhZ2xvYmFsYCkuCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBhdHRyX3JlYWRlciA6Z2xvYmFsCisKKyAgICAgICMgQHBhcmFtIG5hbWUgW1N0cmluZ10gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlCisgICAgICAjIEBwYXJhbSBleHByIFtTY3JpcHQ6OlRyZWU6Ok5vZGVdIFNlZSBceyNleHByfQorICAgICAgIyBAcGFyYW0gZ3VhcmRlZCBbQm9vbGVhbl0gU2VlIFx7I2d1YXJkZWR9CisgICAgICAjIEBwYXJhbSBnbG9iYWwgW0Jvb2xlYW5dIFNlZSBceyNnbG9iYWx9CisgICAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBleHByLCBndWFyZGVkLCBnbG9iYWwpCisgICAgICAgIEBuYW1lID0gbmFtZQorICAgICAgICBAZXhwciA9IGV4cHIKKyAgICAgICAgQGd1YXJkZWQgPSBndWFyZGVkCisgICAgICAgIEBnbG9iYWwgPSBnbG9iYWwKKyAgICAgICAgc3VwZXIoKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvdmlzaXRvcnMvYmFzZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9iYXNlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOGUxMzQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvdmlzaXRvcnMvYmFzZS5yYgpAQCAtMCwwICsxLDcyIEBACisjIFZpc2l0b3JzIGFyZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBTYXNzIHBhcnNlIHRyZWUuCisjIFZpc2l0b3JzIHNob3VsZCBleHRlbmQge1Zpc2l0b3JzOjpCYXNlfSwKKyMgd2hpY2ggcHJvdmlkZXMgYSBzbWFsbCBhbW91bnQgb2Ygc2NhZmZvbGRpbmcgZm9yIHRyYXZlcnNhbC4KK21vZHVsZSBTYXNzOjpUcmVlOjpWaXNpdG9ycworICAjIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBTYXNzIHZpc2l0b3JzLgorICAjIFZpc2l0b3JzIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcywKKyAgIyB0aGVuIGltcGxlbWVudCBgdmlzaXRfKmAgbWV0aG9kcyBmb3IgZWFjaCBub2RlIHRoZXkgY2FyZSBhYm91dAorICAjIChlLmcuIGB2aXNpdF9ydWxlYCBmb3Ige1J1bGVOb2RlfSBvciBgdmlzaXRfZm9yYCBmb3Ige0Zvck5vZGV9KS4KKyAgIyBUaGVzZSBtZXRob2RzIHRha2UgdGhlIG5vZGUgaW4gcXVlc3Rpb24gYXMgYXJndW1lbnQuCisgICMgVGhleSBtYXkgYHlpZWxkYCB0byB2aXNpdCB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIGN1cnJlbnQgbm9kZS4KKyAgIworICAjICpOb3RlKjogZHVlIHRvIHRoZSB1bnVzdWFsIG5hdHVyZSBvZiB7U2Fzczo6VHJlZTo6SWZOb2RlfSwKKyAgIyBzcGVjaWFsIGNhcmUgbXVzdCBiZSB0YWtlbiB0byBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBoYW5kbGVkLgorICAjIEluIHBhcnRpY3VsYXIsIHRoZXJlIGlzIG5vIGJ1aWx0LWluIHNjYWZmb2xkaW5nCisgICMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIGBAZWxzZWAgbm9kZXMuCisgICMKKyAgIyBAYWJzdHJhY3QKKyAgY2xhc3MgQmFzZQorICAgICMgUnVucyB0aGUgdmlzaXRvciBvbiBhIHRyZWUuCisgICAgIworICAgICMgQHBhcmFtIHJvb3QgW1RyZWU6Ok5vZGVdIFRoZSByb290IG5vZGUgb2YgdGhlIFNhc3MgdHJlZS4KKyAgICAjIEByZXR1cm4gW09iamVjdF0gVGhlIHJldHVybiB2YWx1ZSBvZiBceyN2aXNpdH0gZm9yIHRoZSByb290IG5vZGUuCisgICAgZGVmIHNlbGYudmlzaXQocm9vdCkKKyAgICAgIG5ldy5zZW5kKDp2aXNpdCwgcm9vdCkKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgIyBSdW5zIHRoZSB2aXNpdG9yIG9uIHRoZSBnaXZlbiBub2RlLgorICAgICMgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkbyBzb21ldGhpbmcgZm9yIGVhY2ggbm9kZS4KKyAgICAjCisgICAgIyBAcGFyYW0gbm9kZSBbVHJlZTo6Tm9kZV0gVGhlIG5vZGUgdG8gdmlzaXQuCisgICAgIyBAcmV0dXJuIFtPYmplY3RdIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGB2aXNpdF8qYCBtZXRob2QgZm9yIHRoaXMgbm9kZS4KKyAgICBkZWYgdmlzaXQobm9kZSkKKyAgICAgIGlmIHJlc3BvbmRfdG8/KG5vZGUuY2xhc3MudmlzaXRfbWV0aG9kLCB0cnVlKQorICAgICAgICBzZW5kKG5vZGUuY2xhc3MudmlzaXRfbWV0aG9kLCBub2RlKSB7dmlzaXRfY2hpbGRyZW4obm9kZSl9CisgICAgICBlbHNlCisgICAgICAgIHZpc2l0X2NoaWxkcmVuKG5vZGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVmlzaXQgdGhlIGNoaWxkIG5vZGVzIGZvciBhIGdpdmVuIG5vZGUuCisgICAgIyBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIGRvIHNvbWV0aGluZworICAgICMgd2l0aCB0aGUgY2hpbGQgbm9kZXMnIHJldHVybiB2YWx1ZXMuCisgICAgIworICAgICMgVGhpcyBtZXRob2QgaXMgcnVuIHdoZW4gYHZpc2l0XypgIG1ldGhvZHMgYHlpZWxkYCwKKyAgICAjIGFuZCBpdHMgcmV0dXJuIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIGB5aWVsZGAuCisgICAgIworICAgICMgQHBhcmFtIHBhcmVudCBbVHJlZTo6Tm9kZV0gVGhlIHBhcmVudCBub2RlIG9mIHRoZSBjaGlsZHJlbiB0byB2aXNpdC4KKyAgICAjIEByZXR1cm4gW0FycmF5PE9iamVjdD5dIFRoZSByZXR1cm4gdmFsdWVzIG9mIHRoZSBgdmlzaXRfKmAgbWV0aG9kcyBmb3IgdGhlIGNoaWxkcmVuLgorICAgIGRlZiB2aXNpdF9jaGlsZHJlbihwYXJlbnQpCisgICAgICBwYXJlbnQuY2hpbGRyZW4ubWFwIHt8Y3wgdmlzaXQoYyl9CisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIG5hbWUgb2YgYSBub2RlIGFzIHVzZWQgaW4gdGhlIGB2aXNpdF8qYCBtZXRob2QuCisgICAgIworICAgICMgQHBhcmFtIFtUcmVlOjpOb2RlXSBub2RlIFRoZSBub2RlLgorICAgICMgQHJldHVybiBbU3RyaW5nXSBUaGUgbmFtZS4KKyAgICBkZWYgc2VsZi5ub2RlX25hbWUobm9kZSkKKyAgICAgIFNhc3M6OlV0aWwuZGVwcmVjYXRlZChzZWxmLCAiQ2FsbCBub2RlLmNsYXNzLm5vZGVfbmFtZSBpbnN0ZWFkLiIpCisgICAgICBub2RlLmNsYXNzLm5vZGVfbmFtZQorICAgIGVuZAorCisgICAgIyBgeWllbGRgcywgdGhlbiBydW5zIHRoZSB2aXNpdG9yIG9uIHRoZSBgQGVsc2VgIGNsYXVzZSBpZiB0aGUgbm9kZSBoYXMgb25lLgorICAgICMgVGhpcyBleGlzdHMgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBgQGVsc2VgIGNsYXVzZSBnZXQgdmlzaXRlZC4KKyAgICBkZWYgdmlzaXRfaWYobm9kZSkKKyAgICAgIHlpZWxkCisgICAgICB2aXNpdChub2RlLmVsc2UpIGlmIG5vZGUuZWxzZQorICAgICAgbm9kZQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL2NoZWNrX25lc3RpbmcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvdmlzaXRvcnMvY2hlY2tfbmVzdGluZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTU0MWVmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL2NoZWNrX25lc3RpbmcucmIKQEAgLTAsMCArMSwxNzMgQEAKKyMgQSB2aXNpdG9yIGZvciBjaGVja2luZyB0aGF0IGFsbCBub2RlcyBhcmUgcHJvcGVybHkgbmVzdGVkLgorY2xhc3MgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OkNoZWNrTmVzdGluZyA8IFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpCYXNlCisgIHByb3RlY3RlZAorCisgIGRlZiBpbml0aWFsaXplCisgICAgQHBhcmVudHMgPSBbXQorICAgIEBwYXJlbnQgPSBuaWwKKyAgICBAY3VycmVudF9taXhpbl9kZWYgPSBuaWwKKyAgZW5kCisKKyAgZGVmIHZpc2l0KG5vZGUpCisgICAgaWYgKGVycm9yID0gQHBhcmVudCAmJiAoCisgICAgICAgIHRyeV9zZW5kKEBwYXJlbnQuY2xhc3MuaW52YWxpZF9jaGlsZF9tZXRob2RfbmFtZSwgQHBhcmVudCwgbm9kZSkgfHwKKyAgICAgICAgdHJ5X3NlbmQobm9kZS5jbGFzcy5pbnZhbGlkX3BhcmVudF9tZXRob2RfbmFtZSwgQHBhcmVudCwgbm9kZSkpKQorICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KGVycm9yKQorICAgIGVuZAorICAgIHN1cGVyCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgZS5tb2RpZnlfYmFja3RyYWNlKDpmaWxlbmFtZSA9PiBub2RlLmZpbGVuYW1lLCA6bGluZSA9PiBub2RlLmxpbmUpCisgICAgcmFpc2UgZQorICBlbmQKKworICBDT05UUk9MX05PREVTID0gW1Nhc3M6OlRyZWU6OkVhY2hOb2RlLCBTYXNzOjpUcmVlOjpGb3JOb2RlLCBTYXNzOjpUcmVlOjpJZk5vZGUsCisgICAgICAgICAgICAgICAgICAgU2Fzczo6VHJlZTo6V2hpbGVOb2RlLCBTYXNzOjpUcmVlOjpUcmFjZU5vZGVdCisgIFNDUklQVF9OT0RFUyA9IFtTYXNzOjpUcmVlOjpJbXBvcnROb2RlXSArIENPTlRST0xfTk9ERVMKKyAgZGVmIHZpc2l0X2NoaWxkcmVuKHBhcmVudCkKKyAgICBvbGRfcGFyZW50ID0gQHBhcmVudAorCisgICAgIyBXaGVuIGNoZWNraW5nIGEgc3RhdGljIHRyZWUsIHJlc29sdmUgYXQtcm9vdHMgdG8gYmUgc3VyZSB0aGV5IHdvbid0IHNlbmQKKyAgICAjIG5vZGVzIHdoZXJlIHRoZXkgZG9uJ3QgYmVsb25nLgorICAgIGlmIHBhcmVudC5pc19hPyhTYXNzOjpUcmVlOjpBdFJvb3ROb2RlKSAmJiBwYXJlbnQucmVzb2x2ZWRfdmFsdWUKKyAgICAgIG9sZF9wYXJlbnRzID0gQHBhcmVudHMKKyAgICAgIEBwYXJlbnRzID0gQHBhcmVudHMucmVqZWN0IHt8cHwgcGFyZW50LmV4Y2x1ZGVfbm9kZT8ocCl9CisgICAgICBAcGFyZW50ID0gQHBhcmVudHMucmV2ZXJzZS5lYWNoX3dpdGhfaW5kZXguCisgICAgICAgIGZpbmQge3xwLCBpfCAhdHJhbnNwYXJlbnRfcGFyZW50PyhwLCBAcGFyZW50c1staSAtIDJdKX0uZmlyc3QKKworICAgICAgYmVnaW4KKyAgICAgICAgcmV0dXJuIHN1cGVyCisgICAgICBlbnN1cmUKKyAgICAgICAgQHBhcmVudHMgPSBvbGRfcGFyZW50cworICAgICAgICBAcGFyZW50ID0gb2xkX3BhcmVudAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICB1bmxlc3MgdHJhbnNwYXJlbnRfcGFyZW50PyhwYXJlbnQsIG9sZF9wYXJlbnQpCisgICAgICBAcGFyZW50ID0gcGFyZW50CisgICAgZW5kCisKKyAgICBAcGFyZW50cy5wdXNoIHBhcmVudAorICAgIGJlZ2luCisgICAgICBzdXBlcgorICAgIGVuc3VyZQorICAgICAgQHBhcmVudCA9IG9sZF9wYXJlbnQKKyAgICAgIEBwYXJlbnRzLnBvcAorICAgIGVuZAorICBlbmQKKworICBkZWYgdmlzaXRfcm9vdChub2RlKQorICAgIHlpZWxkCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgZS5zYXNzX3RlbXBsYXRlIHx8PSBub2RlLnRlbXBsYXRlCisgICAgcmFpc2UgZQorICBlbmQKKworICBkZWYgdmlzaXRfaW1wb3J0KG5vZGUpCisgICAgeWllbGQKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBlLm1vZGlmeV9iYWNrdHJhY2UoOmZpbGVuYW1lID0+IG5vZGUuY2hpbGRyZW4uZmlyc3QuZmlsZW5hbWUpCisgICAgZS5hZGRfYmFja3RyYWNlKDpmaWxlbmFtZSA9PiBub2RlLmZpbGVuYW1lLCA6bGluZSA9PiBub2RlLmxpbmUpCisgICAgcmFpc2UgZQorICBlbmQKKworICBkZWYgdmlzaXRfbWl4aW5kZWYobm9kZSkKKyAgICBAY3VycmVudF9taXhpbl9kZWYsIG9sZF9taXhpbl9kZWYgPSBub2RlLCBAY3VycmVudF9taXhpbl9kZWYKKyAgICB5aWVsZAorICBlbnN1cmUKKyAgICBAY3VycmVudF9taXhpbl9kZWYgPSBvbGRfbWl4aW5fZGVmCisgIGVuZAorCisgIGRlZiBpbnZhbGlkX2NvbnRlbnRfcGFyZW50PyhwYXJlbnQsIGNoaWxkKQorICAgIGlmIEBjdXJyZW50X21peGluX2RlZgorICAgICAgQGN1cnJlbnRfbWl4aW5fZGVmLmhhc19jb250ZW50ID0gdHJ1ZQorICAgICAgbmlsCisgICAgZWxzZQorICAgICAgIkBjb250ZW50IG1heSBvbmx5IGJlIHVzZWQgd2l0aGluIGEgbWl4aW4uIgorICAgIGVuZAorICBlbmQKKworICBkZWYgaW52YWxpZF9jaGFyc2V0X3BhcmVudD8ocGFyZW50LCBjaGlsZCkKKyAgICAiQGNoYXJzZXQgbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgcm9vdCBvZiBhIGRvY3VtZW50LiIgdW5sZXNzIHBhcmVudC5pc19hPyhTYXNzOjpUcmVlOjpSb290Tm9kZSkKKyAgZW5kCisKKyAgVkFMSURfRVhURU5EX1BBUkVOVFMgPSBbU2Fzczo6VHJlZTo6UnVsZU5vZGUsIFNhc3M6OlRyZWU6Ok1peGluRGVmTm9kZSwgU2Fzczo6VHJlZTo6TWl4aW5Ob2RlXQorICBkZWYgaW52YWxpZF9leHRlbmRfcGFyZW50PyhwYXJlbnQsIGNoaWxkKQorICAgIHJldHVybiBpZiBpc19hbnlfb2Y/KHBhcmVudCwgVkFMSURfRVhURU5EX1BBUkVOVFMpCisgICAgIkV4dGVuZCBkaXJlY3RpdmVzIG1heSBvbmx5IGJlIHVzZWQgd2l0aGluIHJ1bGVzLiIKKyAgZW5kCisKKyAgSU5WQUxJRF9JTVBPUlRfUEFSRU5UUyA9IENPTlRST0xfTk9ERVMgKworICAgIFtTYXNzOjpUcmVlOjpNaXhpbkRlZk5vZGUsIFNhc3M6OlRyZWU6Ok1peGluTm9kZV0KKyAgZGVmIGludmFsaWRfaW1wb3J0X3BhcmVudD8ocGFyZW50LCBjaGlsZCkKKyAgICB1bmxlc3MgKEBwYXJlbnRzLm1hcCB7fHB8IHAuY2xhc3N9ICYgSU5WQUxJRF9JTVBPUlRfUEFSRU5UUykuZW1wdHk/CisgICAgICByZXR1cm4gIkltcG9ydCBkaXJlY3RpdmVzIG1heSBub3QgYmUgdXNlZCB3aXRoaW4gY29udHJvbCBkaXJlY3RpdmVzIG9yIG1peGlucy4iCisgICAgZW5kCisgICAgcmV0dXJuIGlmIHBhcmVudC5pc19hPyhTYXNzOjpUcmVlOjpSb290Tm9kZSkKKyAgICByZXR1cm4gIkNTUyBpbXBvcnQgZGlyZWN0aXZlcyBtYXkgb25seSBiZSB1c2VkIGF0IHRoZSByb290IG9mIGEgZG9jdW1lbnQuIiBpZiBjaGlsZC5jc3NfaW1wb3J0PworICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGUubW9kaWZ5X2JhY2t0cmFjZSg6ZmlsZW5hbWUgPT4gY2hpbGQuaW1wb3J0ZWRfZmlsZS5vcHRpb25zWzpmaWxlbmFtZV0pCisgICAgZS5hZGRfYmFja3RyYWNlKDpmaWxlbmFtZSA9PiBjaGlsZC5maWxlbmFtZSwgOmxpbmUgPT4gY2hpbGQubGluZSkKKyAgICByYWlzZSBlCisgIGVuZAorCisgIGRlZiBpbnZhbGlkX21peGluZGVmX3BhcmVudD8ocGFyZW50LCBjaGlsZCkKKyAgICByZXR1cm4gaWYgKEBwYXJlbnRzLm1hcCB7fHB8IHAuY2xhc3N9ICYgSU5WQUxJRF9JTVBPUlRfUEFSRU5UUykuZW1wdHk/CisgICAgIk1peGlucyBtYXkgbm90IGJlIGRlZmluZWQgd2l0aGluIGNvbnRyb2wgZGlyZWN0aXZlcyBvciBvdGhlciBtaXhpbnMuIgorICBlbmQKKworICBkZWYgaW52YWxpZF9mdW5jdGlvbl9wYXJlbnQ/KHBhcmVudCwgY2hpbGQpCisgICAgcmV0dXJuIGlmIChAcGFyZW50cy5tYXAge3xwfCBwLmNsYXNzfSAmIElOVkFMSURfSU1QT1JUX1BBUkVOVFMpLmVtcHR5PworICAgICJGdW5jdGlvbnMgbWF5IG5vdCBiZSBkZWZpbmVkIHdpdGhpbiBjb250cm9sIGRpcmVjdGl2ZXMgb3Igb3RoZXIgbWl4aW5zLiIKKyAgZW5kCisKKyAgVkFMSURfRlVOQ1RJT05fQ0hJTERSRU4gPSBbCisgICAgU2Fzczo6VHJlZTo6Q29tbWVudE5vZGUsICBTYXNzOjpUcmVlOjpEZWJ1Z05vZGUsIFNhc3M6OlRyZWU6OlJldHVybk5vZGUsCisgICAgU2Fzczo6VHJlZTo6VmFyaWFibGVOb2RlLCBTYXNzOjpUcmVlOjpXYXJuTm9kZSwgU2Fzczo6VHJlZTo6RXJyb3JOb2RlCisgIF0gKyBDT05UUk9MX05PREVTCisgIGRlZiBpbnZhbGlkX2Z1bmN0aW9uX2NoaWxkPyhwYXJlbnQsIGNoaWxkKQorICAgIHJldHVybiBpZiBpc19hbnlfb2Y/KGNoaWxkLCBWQUxJRF9GVU5DVElPTl9DSElMRFJFTikKKyAgICAiRnVuY3Rpb25zIGNhbiBvbmx5IGNvbnRhaW4gdmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCBjb250cm9sIGRpcmVjdGl2ZXMuIgorICBlbmQKKworICBWQUxJRF9QUk9QX0NISUxEUkVOID0gQ09OVFJPTF9OT0RFUyArIFtTYXNzOjpUcmVlOjpDb21tZW50Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Fzczo6VHJlZTo6UHJvcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc3M6OlRyZWU6Ok1peGluTm9kZV0KKyAgZGVmIGludmFsaWRfcHJvcF9jaGlsZD8ocGFyZW50LCBjaGlsZCkKKyAgICByZXR1cm4gaWYgaXNfYW55X29mPyhjaGlsZCwgVkFMSURfUFJPUF9DSElMRFJFTikKKyAgICAiSWxsZWdhbCBuZXN0aW5nOiBPbmx5IHByb3BlcnRpZXMgbWF5IGJlIG5lc3RlZCBiZW5lYXRoIHByb3BlcnRpZXMuIgorICBlbmQKKworICBWQUxJRF9QUk9QX1BBUkVOVFMgPSBbU2Fzczo6VHJlZTo6UnVsZU5vZGUsIFNhc3M6OlRyZWU6OktleWZyYW1lUnVsZU5vZGUsIFNhc3M6OlRyZWU6OlByb3BOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgU2Fzczo6VHJlZTo6TWl4aW5EZWZOb2RlLCBTYXNzOjpUcmVlOjpEaXJlY3RpdmVOb2RlLCBTYXNzOjpUcmVlOjpNaXhpbk5vZGVdCisgIGRlZiBpbnZhbGlkX3Byb3BfcGFyZW50PyhwYXJlbnQsIGNoaWxkKQorICAgIHJldHVybiBpZiBpc19hbnlfb2Y/KHBhcmVudCwgVkFMSURfUFJPUF9QQVJFTlRTKQorICAgICJQcm9wZXJ0aWVzIGFyZSBvbmx5IGFsbG93ZWQgd2l0aGluIHJ1bGVzLCBkaXJlY3RpdmVzLCBtaXhpbiBpbmNsdWRlcywgb3Igb3RoZXIgcHJvcGVydGllcy4iICsKKyAgICAgIGNoaWxkLnBzZXVkb19jbGFzc19zZWxlY3Rvcl9tZXNzYWdlCisgIGVuZAorCisgIGRlZiBpbnZhbGlkX3JldHVybl9wYXJlbnQ/KHBhcmVudCwgY2hpbGQpCisgICAgIkByZXR1cm4gbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gYSBmdW5jdGlvbi4iIHVubGVzcyBwYXJlbnQuaXNfYT8oU2Fzczo6VHJlZTo6RnVuY3Rpb25Ob2RlKQorICBlbmQKKworICBwcml2YXRlCisKKyAgIyBXaGV0aGVyIGBwYXJlbnRgIHNob3VsZCBiZSBhc3NpZ25lZCB0byBgQHBhcmVudGAuCisgIGRlZiB0cmFuc3BhcmVudF9wYXJlbnQ/KHBhcmVudCwgZ3JhbmRwYXJlbnQpCisgICAgaXNfYW55X29mPyhwYXJlbnQsIFNDUklQVF9OT0RFUykgfHwKKyAgICAgIChwYXJlbnQuYnViYmxlcz8gJiYKKyAgICAgICAhZ3JhbmRwYXJlbnQuaXNfYT8oU2Fzczo6VHJlZTo6Um9vdE5vZGUpICYmCisgICAgICAgIWdyYW5kcGFyZW50LmlzX2E/KFNhc3M6OlRyZWU6OkF0Um9vdE5vZGUpKQorICBlbmQKKworICBkZWYgaXNfYW55X29mPyh2YWwsIGNsYXNzZXMpCisgICAgY2xhc3Nlcy5lYWNoIGRvIHxjfAorICAgICAgcmV0dXJuIHRydWUgaWYgdmFsLmlzX2E/KGMpCisgICAgZW5kCisgICAgZmFsc2UKKyAgZW5kCisKKyAgZGVmIHRyeV9zZW5kKG1ldGhvZCwgKmFyZ3MpCisgICAgcmV0dXJuIHVubGVzcyByZXNwb25kX3RvPyhtZXRob2QsIHRydWUpCisgICAgc2VuZChtZXRob2QsICphcmdzKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL2NvbnZlcnQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvdmlzaXRvcnMvY29udmVydC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWQyMWEyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL2NvbnZlcnQucmIKQEAgLTAsMCArMSwzNTAgQEAKKyMgQSB2aXNpdG9yIGZvciBjb252ZXJ0aW5nIGEgU2FzcyB0cmVlIGludG8gYSBzb3VyY2Ugc3RyaW5nLgorY2xhc3MgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OkNvbnZlcnQgPCBTYXNzOjpUcmVlOjpWaXNpdG9yczo6QmFzZQorICAjIFJ1bnMgdGhlIHZpc2l0b3Igb24gYSB0cmVlLgorICAjCisgICMgQHBhcmFtIHJvb3QgW1RyZWU6Ok5vZGVdIFRoZSByb290IG5vZGUgb2YgdGhlIFNhc3MgdHJlZS4KKyAgIyBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBBbiBvcHRpb25zIGhhc2ggKHNlZSB7U2Fzczo6Q1NTI2luaXRpYWxpemV9KS4KKyAgIyBAcGFyYW0gZm9ybWF0IFtTeW1ib2xdIGA6c2Fzc2Agb3IgYDpzY3NzYC4KKyAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBTYXNzIG9yIFNDU1Mgc291cmNlIGZvciB0aGUgdHJlZS4KKyAgZGVmIHNlbGYudmlzaXQocm9vdCwgb3B0aW9ucywgZm9ybWF0KQorICAgIG5ldyhvcHRpb25zLCBmb3JtYXQpLnNlbmQoOnZpc2l0LCByb290KQorICBlbmQKKworICBwcm90ZWN0ZWQKKworICBkZWYgaW5pdGlhbGl6ZShvcHRpb25zLCBmb3JtYXQpCisgICAgQG9wdGlvbnMgPSBvcHRpb25zCisgICAgQGZvcm1hdCA9IGZvcm1hdAorICAgIEB0YWJzID0gMAorICAgICMgMiBzcGFjZXMgYnkgZGVmYXVsdAorICAgIEB0YWJfY2hhcnMgPSBAb3B0aW9uc1s6aW5kZW50XSB8fCAiICAiCisgICAgQGlzX2Vsc2UgPSBmYWxzZQorICBlbmQKKworICBkZWYgdmlzaXRfY2hpbGRyZW4ocGFyZW50KQorICAgIEB0YWJzICs9IDEKKyAgICByZXR1cm4gQGZvcm1hdCA9PSA6c2FzcyA/ICJcbiIgOiAiIHt9XG4iIGlmIHBhcmVudC5jaGlsZHJlbi5lbXB0eT8KKworICAgIHJlcyA9IHZpc2l0X3J1bGVfbGV2ZWwocGFyZW50LmNoaWxkcmVuKQorCisgICAgaWYgQGZvcm1hdCA9PSA6c2FzcworICAgICAgIlxuIiArIHJlcy5yc3RyaXAgKyAiXG4iCisgICAgZWxzZQorICAgICAgIiB7XG4iICsgcmVzLnJzdHJpcCArICJcbiN7QHRhYl9jaGFycyAqIChAdGFicyAtIDEpfX1cbiIKKyAgICBlbmQKKyAgZW5zdXJlCisgICAgQHRhYnMgLT0gMQorICBlbmQKKworICAjIEVuc3VyZXMgcHJvcGVyIHNwYWNpbmcgYmV0d2VlbiB0b3AtbGV2ZWwgbm9kZXMuCisgIGRlZiB2aXNpdF9yb290KG5vZGUpCisgICAgdmlzaXRfcnVsZV9sZXZlbChub2RlLmNoaWxkcmVuKQorICBlbmQKKworICBkZWYgdmlzaXRfY2hhcnNldChub2RlKQorICAgICIje3RhYl9zdHJ9QGNoYXJzZXQgXCIje25vZGUubmFtZX1cIiN7c2VtaX1cbiIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2NvbW1lbnQobm9kZSkKKyAgICB2YWx1ZSA9IGludGVycF90b19zcmMobm9kZS52YWx1ZSkKKyAgICBpZiBAZm9ybWF0ID09IDpzYXNzCisgICAgICBjb250ZW50ID0gdmFsdWUuZ3N1YiglcntcKi8kfSwgJycpLnJzdHJpcAorICAgICAgaWYgY29udGVudCA9fiAvXEFbIFx0XS8KKyAgICAgICAgIyBSZS1pbmRlbnQgU0NTUyBjb21tZW50cyBsaWtlIHRoaXM6CisgICAgICAgICMgICAgIC8qIGZvbworICAgICAgICAjICAgYmFyCisgICAgICAgICMgICAgICAgYmF6ICovCisgICAgICAgIGNvbnRlbnQuZ3N1YiEoL14vLCAnICAgJykKKyAgICAgICAgY29udGVudC5zdWIhKCVye1xBKFsgXHRdKikvXCp9LCAnLypcMScpCisgICAgICBlbmQKKworICAgICAgaWYgY29udGVudC5pbmNsdWRlPygiXG4iKQorICAgICAgICBjb250ZW50LmdzdWIhKC9cbiBcKi8sICJcbiAgIikKKyAgICAgICAgc3BhY2VzID0gY29udGVudC5zY2FuKC9cbiggKikvKS5tYXAge3xzfCBzLmZpcnN0LnNpemV9Lm1pbgorICAgICAgICBzZXAgPSBub2RlLnR5cGUgPT0gOnNpbGVudCA/ICJcbi8vIiA6ICJcbiAqIgorICAgICAgICBpZiBzcGFjZXMgPj0gMgorICAgICAgICAgIGNvbnRlbnQuZ3N1YiEoL1xuICAvLCBzZXApCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZW50LmdzdWIhKC9cbiN7JyAnICogc3BhY2VzfS8sIHNlcCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgY29udGVudC5nc3ViISglcntcQS9cKn0sICcvLycpIGlmIG5vZGUudHlwZSA9PSA6c2lsZW50CisgICAgICBjb250ZW50LmdzdWIhKC9eLywgdGFiX3N0cikKKyAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJzdHJpcCArICJcbiIKKyAgICBlbHNlCisgICAgICBzcGFjZXMgPSAoQHRhYl9jaGFycyAqIFtAdGFicyAtIHZhbHVlWy9eICovXS5zaXplLCAwXS5tYXgpCisgICAgICBjb250ZW50ID0gaWYgbm9kZS50eXBlID09IDpzaWxlbnQKKyAgICAgICAgICAgICAgICAgIHZhbHVlLmdzdWIoJXJ7XlsvIF1cKn0sICcvLycpLmdzdWIoJXJ7ICpcKi8kfSwgJycpCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgdmFsdWUKKyAgICAgICAgICAgICAgICBlbmQuZ3N1YigvXi8sIHNwYWNlcykgKyAiXG4iCisgICAgZW5kCisgICAgY29udGVudAorICBlbmQKKworICBkZWYgdmlzaXRfZGVidWcobm9kZSkKKyAgICAiI3t0YWJfc3RyfUBkZWJ1ZyAje25vZGUuZXhwci50b19zYXNzKEBvcHRpb25zKX0je3NlbWl9XG4iCisgIGVuZAorCisgIGRlZiB2aXNpdF9lcnJvcihub2RlKQorICAgICIje3RhYl9zdHJ9QGVycm9yICN7bm9kZS5leHByLnRvX3Nhc3MoQG9wdGlvbnMpfSN7c2VtaX1cbiIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2RpcmVjdGl2ZShub2RlKQorICAgIHJlcyA9ICIje3RhYl9zdHJ9I3tpbnRlcnBfdG9fc3JjKG5vZGUudmFsdWUpfSIKKyAgICByZXMuZ3N1YiEoL15AaW1wb3J0IFwjXHsoLiopXH0oW159XSopJC8sICdAaW1wb3J0IFwxXDInKQorICAgIHJldHVybiByZXMgKyAiI3tzZW1pfVxuIiB1bmxlc3Mgbm9kZS5oYXNfY2hpbGRyZW4KKyAgICByZXMgKyB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfZWFjaChub2RlKQorICAgIHZhcnMgPSBub2RlLnZhcnMubWFwIHt8dmFyfCAiJCN7ZGFzaGVyaXplKHZhcil9In0uam9pbigiLCAiKQorICAgICIje3RhYl9zdHJ9QGVhY2ggI3t2YXJzfSBpbiAje25vZGUubGlzdC50b19zYXNzKEBvcHRpb25zKX0je3lpZWxkfSIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2V4dGVuZChub2RlKQorICAgICIje3RhYl9zdHJ9QGV4dGVuZCAje3NlbGVjdG9yX3RvX3NyYyhub2RlLnNlbGVjdG9yKS5sc3RyaXB9IiArCisgICAgICAiI3snICFvcHRpb25hbCcgaWYgbm9kZS5vcHRpb25hbD99I3tzZW1pfVxuIgorICBlbmQKKworICBkZWYgdmlzaXRfZm9yKG5vZGUpCisgICAgIiN7dGFiX3N0cn1AZm9yICQje2Rhc2hlcml6ZShub2RlLnZhcil9IGZyb20gI3tub2RlLmZyb20udG9fc2FzcyhAb3B0aW9ucyl9ICIgKworICAgICAgIiN7bm9kZS5leGNsdXNpdmUgPyAndG8nIDogJ3Rocm91Z2gnfSAje25vZGUudG8udG9fc2FzcyhAb3B0aW9ucyl9I3t5aWVsZH0iCisgIGVuZAorCisgIGRlZiB2aXNpdF9mdW5jdGlvbihub2RlKQorICAgIGFyZ3MgPSBub2RlLmFyZ3MubWFwIGRvIHx2LCBkfAorICAgICAgZCA/ICIje3YudG9fc2FzcyhAb3B0aW9ucyl9OiAje2QudG9fc2FzcyhAb3B0aW9ucyl9IiA6IHYudG9fc2FzcyhAb3B0aW9ucykKKyAgICBlbmQuam9pbigiLCAiKQorICAgIGlmIG5vZGUuc3BsYXQKKyAgICAgIGFyZ3MgPDwgIiwgIiB1bmxlc3Mgbm9kZS5hcmdzLmVtcHR5PworICAgICAgYXJncyA8PCBub2RlLnNwbGF0LnRvX3Nhc3MoQG9wdGlvbnMpIDw8ICIuLi4iCisgICAgZW5kCisKKyAgICAiI3t0YWJfc3RyfUBmdW5jdGlvbiAje2Rhc2hlcml6ZShub2RlLm5hbWUpfSgje2FyZ3N9KSN7eWllbGR9IgorICBlbmQKKworICBkZWYgdmlzaXRfaWYobm9kZSkKKyAgICBuYW1lID0KKyAgICAgIGlmICFAaXNfZWxzZQorICAgICAgICAiaWYiCisgICAgICBlbHNpZiBub2RlLmV4cHIKKyAgICAgICAgImVsc2UgaWYiCisgICAgICBlbHNlCisgICAgICAgICJlbHNlIgorICAgICAgZW5kCisgICAgQGlzX2Vsc2UgPSBmYWxzZQorICAgIHN0ciA9ICIje3RhYl9zdHJ9QCN7bmFtZX0iCisgICAgc3RyIDw8ICIgI3tub2RlLmV4cHIudG9fc2FzcyhAb3B0aW9ucyl9IiBpZiBub2RlLmV4cHIKKyAgICBzdHIgPDwgeWllbGQKKyAgICBAaXNfZWxzZSA9IHRydWUKKyAgICBzdHIgPDwgdmlzaXQobm9kZS5lbHNlKSBpZiBub2RlLmVsc2UKKyAgICBzdHIKKyAgZW5zdXJlCisgICAgQGlzX2Vsc2UgPSBmYWxzZQorICBlbmQKKworICBkZWYgdmlzaXRfaW1wb3J0KG5vZGUpCisgICAgcXVvdGUgPSBAZm9ybWF0ID09IDpzY3NzID8gJyInIDogJycKKyAgICAiI3t0YWJfc3RyfUBpbXBvcnQgI3txdW90ZX0je25vZGUuaW1wb3J0ZWRfZmlsZW5hbWV9I3txdW90ZX0je3NlbWl9XG4iCisgIGVuZAorCisgIGRlZiB2aXNpdF9tZWRpYShub2RlKQorICAgICIje3RhYl9zdHJ9QG1lZGlhICN7cXVlcnlfaW50ZXJwX3RvX3NyYyhub2RlLnF1ZXJ5KX0je3lpZWxkfSIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3N1cHBvcnRzKG5vZGUpCisgICAgIiN7dGFiX3N0cn1AI3tub2RlLm5hbWV9ICN7bm9kZS5jb25kaXRpb24udG9fc3JjKEBvcHRpb25zKX0je3lpZWxkfSIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2Nzc2ltcG9ydChub2RlKQorICAgIGlmIG5vZGUudXJpLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSkKKyAgICAgIHN0ciA9ICIje3RhYl9zdHJ9QGltcG9ydCAje25vZGUudXJpLnRvX3Nhc3MoQG9wdGlvbnMpfSIKKyAgICBlbHNlCisgICAgICBzdHIgPSAiI3t0YWJfc3RyfUBpbXBvcnQgI3tub2RlLnVyaX0iCisgICAgZW5kCisgICAgc3RyIDw8ICIgc3VwcG9ydHMoI3tub2RlLnN1cHBvcnRzX2NvbmRpdGlvbi50b19zcmMoQG9wdGlvbnMpfSkiIGlmIG5vZGUuc3VwcG9ydHNfY29uZGl0aW9uCisgICAgc3RyIDw8ICIgI3tpbnRlcnBfdG9fc3JjKG5vZGUucXVlcnkpfSIgdW5sZXNzIG5vZGUucXVlcnkuZW1wdHk/CisgICAgIiN7c3RyfSN7c2VtaX1cbiIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X21peGluZGVmKG5vZGUpCisgICAgYXJncyA9CisgICAgICBpZiBub2RlLmFyZ3MuZW1wdHk/ICYmIG5vZGUuc3BsYXQubmlsPworICAgICAgICAiIgorICAgICAgZWxzZQorICAgICAgICBzdHIgPSAnKCcKKyAgICAgICAgc3RyIDw8IG5vZGUuYXJncy5tYXAgZG8gfHYsIGR8CisgICAgICAgICAgaWYgZAorICAgICAgICAgICAgIiN7di50b19zYXNzKEBvcHRpb25zKX06ICN7ZC50b19zYXNzKEBvcHRpb25zKX0iCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdi50b19zYXNzKEBvcHRpb25zKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQuam9pbigiLCAiKQorCisgICAgICAgIGlmIG5vZGUuc3BsYXQKKyAgICAgICAgICBzdHIgPDwgIiwgIiB1bmxlc3Mgbm9kZS5hcmdzLmVtcHR5PworICAgICAgICAgIHN0ciA8PCBub2RlLnNwbGF0LnRvX3Nhc3MoQG9wdGlvbnMpIDw8ICcuLi4nCisgICAgICAgIGVuZAorCisgICAgICAgIHN0ciA8PCAnKScKKyAgICAgIGVuZAorCisgICAgIiN7dGFiX3N0cn0je0Bmb3JtYXQgPT0gOnNhc3MgPyAnPScgOiAnQG1peGluICd9I3tkYXNoZXJpemUobm9kZS5uYW1lKX0je2FyZ3N9I3t5aWVsZH0iCisgIGVuZAorCisgIGRlZiB2aXNpdF9taXhpbihub2RlKQorICAgIGFyZ190b19zYXNzID0gbGFtYmRhIGRvIHxhcmd8CisgICAgICBzYXNzID0gYXJnLnRvX3Nhc3MoQG9wdGlvbnMpCisgICAgICBzYXNzID0gIigje3Nhc3N9KSIgaWYgYXJnLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6TGlzdExpdGVyYWwpICYmIGFyZy5zZXBhcmF0b3IgPT0gOmNvbW1hCisgICAgICBzYXNzCisgICAgZW5kCisKKyAgICB1bmxlc3Mgbm9kZS5hcmdzLmVtcHR5PyAmJiBub2RlLmtleXdvcmRzLmVtcHR5PyAmJiBub2RlLnNwbGF0Lm5pbD8KKyAgICAgIGFyZ3MgPSBub2RlLmFyZ3MubWFwKCZhcmdfdG9fc2FzcykKKyAgICAgIGtleXdvcmRzID0gbm9kZS5rZXl3b3Jkcy5hc19zdG9yZWQudG9fYS5tYXAge3xrLCB2fCAiJCN7ZGFzaGVyaXplKGspfTogI3thcmdfdG9fc2Fzc1t2XX0ifQorCisgICAgICBpZiBub2RlLnNwbGF0CisgICAgICAgIHNwbGF0ID0gIiN7YXJnX3RvX3Nhc3Nbbm9kZS5zcGxhdF19Li4uIgorICAgICAgICBrd2FyZ19zcGxhdCA9ICIje2FyZ190b19zYXNzW25vZGUua3dhcmdfc3BsYXRdfS4uLiIgaWYgbm9kZS5rd2FyZ19zcGxhdAorICAgICAgZW5kCisKKyAgICAgIGFyZ2xpc3QgPSAiKCN7W2FyZ3MsIHNwbGF0LCBrZXl3b3Jkcywga3dhcmdfc3BsYXRdLmZsYXR0ZW4uY29tcGFjdC5qb2luKCcsICcpfSkiCisgICAgZW5kCisgICAgIiN7dGFiX3N0cn0je0Bmb3JtYXQgPT0gOnNhc3MgPyAnKycgOiAnQGluY2x1ZGUgJ30iICsKKyAgICAgICIje2Rhc2hlcml6ZShub2RlLm5hbWUpfSN7YXJnbGlzdH0je25vZGUuaGFzX2NoaWxkcmVuID8geWllbGQgOiBzZW1pfVxuIgorICBlbmQKKworICBkZWYgdmlzaXRfY29udGVudChub2RlKQorICAgICIje3RhYl9zdHJ9QGNvbnRlbnQje3NlbWl9XG4iCisgIGVuZAorCisgIGRlZiB2aXNpdF9wcm9wKG5vZGUpCisgICAgcmVzID0gdGFiX3N0ciArIG5vZGUuZGVjbGFyYXRpb24oQG9wdGlvbnMsIEBmb3JtYXQpCisgICAgcmV0dXJuIHJlcyArIHNlbWkgKyAiXG4iIGlmIG5vZGUuY2hpbGRyZW4uZW1wdHk/CisgICAgcmVzICsgeWllbGQucnN0cmlwICsgc2VtaSArICJcbiIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3JldHVybihub2RlKQorICAgICIje3RhYl9zdHJ9QHJldHVybiAje25vZGUuZXhwci50b19zYXNzKEBvcHRpb25zKX0je3NlbWl9XG4iCisgIGVuZAorCisgIGRlZiB2aXNpdF9ydWxlKG5vZGUpCisgICAgcnVsZSA9IG5vZGUucGFyc2VkX3J1bGVzID8gW25vZGUucGFyc2VkX3J1bGVzLnRvX3NdIDogbm9kZS5ydWxlCisgICAgaWYgQGZvcm1hdCA9PSA6c2FzcworICAgICAgbmFtZSA9IHNlbGVjdG9yX3RvX3Nhc3MocnVsZSkKKyAgICAgIG5hbWUgPSAiXFwiICsgbmFtZSBpZiBuYW1lWzBdID09ID86CisgICAgICBuYW1lLmdzdWIoL14vLCB0YWJfc3RyKSArIHlpZWxkCisgICAgZWxzaWYgQGZvcm1hdCA9PSA6c2NzcworICAgICAgbmFtZSA9IHNlbGVjdG9yX3RvX3Njc3MocnVsZSkKKyAgICAgIHJlcyA9IG5hbWUgKyB5aWVsZAorICAgICAgaWYgbm9kZS5jaGlsZHJlbi5sYXN0LmlzX2E/KFNhc3M6OlRyZWU6OkNvbW1lbnROb2RlKSAmJiBub2RlLmNoaWxkcmVuLmxhc3QudHlwZSA9PSA6c2lsZW50CisgICAgICAgIHJlcy5zbGljZSEoLTMuLi0xKQorICAgICAgICByZXMgPDwgIlxuIiA8PCB0YWJfc3RyIDw8ICJ9XG4iCisgICAgICBlbmQKKyAgICAgIHJlcworICAgIGVuZAorICBlbmQKKworICBkZWYgdmlzaXRfdmFyaWFibGUobm9kZSkKKyAgICAiI3t0YWJfc3RyfSQje2Rhc2hlcml6ZShub2RlLm5hbWUpfTogI3tub2RlLmV4cHIudG9fc2FzcyhAb3B0aW9ucyl9IiArCisgICAgICAiI3snICFnbG9iYWwnIGlmIG5vZGUuZ2xvYmFsfSN7JyAhZGVmYXVsdCcgaWYgbm9kZS5ndWFyZGVkfSN7c2VtaX1cbiIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3dhcm4obm9kZSkKKyAgICAiI3t0YWJfc3RyfUB3YXJuICN7bm9kZS5leHByLnRvX3Nhc3MoQG9wdGlvbnMpfSN7c2VtaX1cbiIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3doaWxlKG5vZGUpCisgICAgIiN7dGFiX3N0cn1Ad2hpbGUgI3tub2RlLmV4cHIudG9fc2FzcyhAb3B0aW9ucyl9I3t5aWVsZH0iCisgIGVuZAorCisgIGRlZiB2aXNpdF9hdHJvb3Qobm9kZSkKKyAgICBpZiBub2RlLnF1ZXJ5CisgICAgICAiI3t0YWJfc3RyfUBhdC1yb290ICN7cXVlcnlfaW50ZXJwX3RvX3NyYyhub2RlLnF1ZXJ5KX0je3lpZWxkfSIKKyAgICBlbHNpZiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIG5vZGUuY2hpbGRyZW4uZmlyc3QuaXNfYT8oU2Fzczo6VHJlZTo6UnVsZU5vZGUpCisgICAgICBydWxlID0gbm9kZS5jaGlsZHJlbi5maXJzdAorICAgICAgIiN7dGFiX3N0cn1AYXQtcm9vdCAje3NlbGVjdG9yX3RvX3NyYyhydWxlLnJ1bGUpLmxzdHJpcH0je3Zpc2l0X2NoaWxkcmVuKHJ1bGUpfSIKKyAgICBlbHNlCisgICAgICAiI3t0YWJfc3RyfUBhdC1yb290I3t5aWVsZH0iCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB2aXNpdF9rZXlmcmFtZXJ1bGUobm9kZSkKKyAgICAiI3t0YWJfc3RyfSN7bm9kZS5yZXNvbHZlZF92YWx1ZX0je3lpZWxkfSIKKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgICMgVmlzaXQgcnVsZS1sZXZlbCBub2RlcyBhbmQgcmV0dXJuIHRoZWlyIGNvbnZlcnNpb24gd2l0aCBhcHByb3ByaWF0ZQorICAjIHdoaXRlc3BhY2UgYWRkZWQuCisgIGRlZiB2aXNpdF9ydWxlX2xldmVsKG5vZGVzKQorICAgIChub2RlcyArIFtuaWxdKS5lYWNoX2NvbnMoMikubWFwIGRvIHxjaGlsZCwgbnh0fAorICAgICAgdmlzaXQoY2hpbGQpICsKKyAgICAgICAgaWYgbnh0ICYmCisgICAgICAgICAgICAoY2hpbGQuaXNfYT8oU2Fzczo6VHJlZTo6Q29tbWVudE5vZGUpICYmIGNoaWxkLmxpbmUgKyBjaGlsZC5saW5lcyArIDEgPT0gbnh0LmxpbmUpIHx8CisgICAgICAgICAgICAoY2hpbGQuaXNfYT8oU2Fzczo6VHJlZTo6SW1wb3J0Tm9kZSkgJiYgbnh0LmlzX2E/KFNhc3M6OlRyZWU6OkltcG9ydE5vZGUpICYmCisgICAgICAgICAgICAgIGNoaWxkLmxpbmUgKyAxID09IG54dC5saW5lKSB8fAorICAgICAgICAgICAgKGNoaWxkLmlzX2E/KFNhc3M6OlRyZWU6OlZhcmlhYmxlTm9kZSkgJiYgbnh0LmlzX2E/KFNhc3M6OlRyZWU6OlZhcmlhYmxlTm9kZSkgJiYKKyAgICAgICAgICAgICAgY2hpbGQubGluZSArIDEgPT0gbnh0LmxpbmUpIHx8CisgICAgICAgICAgICAoY2hpbGQuaXNfYT8oU2Fzczo6VHJlZTo6UHJvcE5vZGUpICYmIG54dC5pc19hPyhTYXNzOjpUcmVlOjpQcm9wTm9kZSkpIHx8CisgICAgICAgICAgICAoY2hpbGQuaXNfYT8oU2Fzczo6VHJlZTo6TWl4aW5Ob2RlKSAmJiBueHQuaXNfYT8oU2Fzczo6VHJlZTo6TWl4aW5Ob2RlKSAmJgorICAgICAgICAgICAgICBjaGlsZC5saW5lICsgMSA9PSBueHQubGluZSkKKyAgICAgICAgICAiIgorICAgICAgICBlbHNlCisgICAgICAgICAgIlxuIgorICAgICAgICBlbmQKKyAgICBlbmQuam9pbi5yc3RyaXAgKyAiXG4iCisgIGVuZAorCisgIGRlZiBpbnRlcnBfdG9fc3JjKGludGVycCkKKyAgICBpbnRlcnAubWFwIHt8cnwgci5pc19hPyhTdHJpbmcpID8gciA6IHIudG9fc2FzcyhAb3B0aW9ucyl9LmpvaW4KKyAgZW5kCisKKyAgIyBMaWtlIGludGVycF90b19zcmMsIGJ1dCByZW1vdmVzIHRoZSB1bm5lY2Vzc2FyeSBgI3t9YCBhcm91bmQgdGhlIGtleXMgYW5kCisgICMgdmFsdWVzIGluIHF1ZXJ5IGV4cHJlc3Npb25zLgorICBkZWYgcXVlcnlfaW50ZXJwX3RvX3NyYyhpbnRlcnApCisgICAgaW50ZXJwID0gaW50ZXJwLm1hcCBkbyB8ZXwKKyAgICAgIG5leHQgZSB1bmxlc3MgZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6OkxpdGVyYWwpCisgICAgICBuZXh0IGUgdW5sZXNzIGUudmFsdWUuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nKQorICAgICAgZS52YWx1ZS52YWx1ZQorICAgIGVuZAorCisgICAgaW50ZXJwX3RvX3NyYyhpbnRlcnApCisgIGVuZAorCisgIGRlZiBzZWxlY3Rvcl90b19zcmMoc2VsKQorICAgIEBmb3JtYXQgPT0gOnNhc3MgPyBzZWxlY3Rvcl90b19zYXNzKHNlbCkgOiBzZWxlY3Rvcl90b19zY3NzKHNlbCkKKyAgZW5kCisKKyAgZGVmIHNlbGVjdG9yX3RvX3Nhc3Moc2VsKQorICAgIHNlbC5tYXAgZG8gfHJ8CisgICAgICBpZiByLmlzX2E/KFN0cmluZykKKyAgICAgICAgci5nc3ViKC8oLCk/KFsgXHRdKilcblxzKi8pIHskMSA/ICIjeyQxfSN7JDJ9XG4iIDogIiAifQorICAgICAgZWxzZQorICAgICAgICByLnRvX3Nhc3MoQG9wdGlvbnMpCisgICAgICBlbmQKKyAgICBlbmQuam9pbgorICBlbmQKKworICBkZWYgc2VsZWN0b3JfdG9fc2NzcyhzZWwpCisgICAgaW50ZXJwX3RvX3NyYyhzZWwpLmdzdWIoL15bIFx0XSovLCB0YWJfc3RyKS5nc3ViKC9bIFx0XSokLywgJycpCisgIGVuZAorCisgIGRlZiBzZW1pCisgICAgQGZvcm1hdCA9PSA6c2FzcyA/ICIiIDogIjsiCisgIGVuZAorCisgIGRlZiB0YWJfc3RyCisgICAgQHRhYl9jaGFycyAqIEB0YWJzCisgIGVuZAorCisgIGRlZiBkYXNoZXJpemUocykKKyAgICBpZiBAb3B0aW9uc1s6ZGFzaGVyaXplXQorICAgICAgcy50cignXycsICctJykKKyAgICBlbHNlCisgICAgICBzCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3RyZWUvdmlzaXRvcnMvY3NzaXplLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL2Nzc2l6ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODUxMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL2Nzc2l6ZS5yYgpAQCAtMCwwICsxLDM2MiBAQAorIyBBIHZpc2l0b3IgZm9yIGNvbnZlcnRpbmcgYSBzdGF0aWMgU2FzcyB0cmVlIGludG8gYSBzdGF0aWMgQ1NTIHRyZWUuCitjbGFzcyBTYXNzOjpUcmVlOjpWaXNpdG9yczo6Q3NzaXplIDwgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OkJhc2UKKyAgIyBAcGFyYW0gcm9vdCBbVHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZSB0byB2aXNpdC4KKyAgIyBAcmV0dXJuIFsoVHJlZTo6Tm9kZSwgU2Fzczo6VXRpbDo6U3Vic2V0TWFwKV0gVGhlIHJlc3VsdGluZyB0cmVlIG9mIHN0YXRpYyBub2RlcworICAjICAgKmFuZCogdGhlIGV4dGVuc2lvbnMgZGVmaW5lZCBmb3IgdGhpcyB0cmVlCisgIGRlZiBzZWxmLnZpc2l0KHJvb3QpOyBzdXBlcjsgZW5kCisKKyAgcHJvdGVjdGVkCisKKyAgIyBSZXR1cm5zIHRoZSBpbW1lZGlhdGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuCisgICMgQHJldHVybiBbVHJlZTo6Tm9kZV0KKyAgZGVmIHBhcmVudAorICAgIEBwYXJlbnRzLmxhc3QKKyAgZW5kCisKKyAgZGVmIGluaXRpYWxpemUKKyAgICBAcGFyZW50cyA9IFtdCisgICAgQGV4dGVuZHMgPSBTYXNzOjpVdGlsOjpTdWJzZXRNYXAubmV3CisgIGVuZAorCisgICMgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhpcyBhZGRzIHByb3BlciBtZXRhZGF0YSB0byB0aGUgYmFja3RyYWNlLgorICBkZWYgdmlzaXQobm9kZSkKKyAgICBzdXBlcihub2RlKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGUubW9kaWZ5X2JhY2t0cmFjZSg6ZmlsZW5hbWUgPT4gbm9kZS5maWxlbmFtZSwgOmxpbmUgPT4gbm9kZS5saW5lKQorICAgIHJhaXNlIGUKKyAgZW5kCisKKyAgIyBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBwYXJlbnQgbm9kZS4KKyAgZGVmIHZpc2l0X2NoaWxkcmVuKHBhcmVudCkKKyAgICB3aXRoX3BhcmVudCBwYXJlbnQgZG8KKyAgICAgIHBhcmVudC5jaGlsZHJlbiA9IHZpc2l0X2NoaWxkcmVuX3dpdGhvdXRfcGFyZW50KHBhcmVudCkKKyAgICAgIHBhcmVudAorICAgIGVuZAorICBlbmQKKworICAjIExpa2UgeyN2aXNpdFxfY2hpbGRyZW59LCBidXQgZG9lc24ndCBzZXQgeyNwYXJlbnR9LgorICAjCisgICMgQHBhcmFtIG5vZGUgW1Nhc3M6OlRyZWU6Ok5vZGVdCisgICMgQHJldHVybiBbQXJyYXk8U2Fzczo6VHJlZTo6Tm9kZT5dIHRoZSBmbGF0dGVuZWQgcmVzdWx0cyBvZgorICAjICAgdmlzaXRpbmcgYWxsIHRoZSBjaGlsZHJlbiBvZiBgbm9kZWAKKyAgZGVmIHZpc2l0X2NoaWxkcmVuX3dpdGhvdXRfcGFyZW50KG5vZGUpCisgICAgbm9kZS5jaGlsZHJlbi5tYXAge3xjfCB2aXNpdChjKX0uZmxhdHRlbgorICBlbmQKKworICAjIFJ1bnMgYSBibG9jayBvZiBjb2RlIHdpdGggdGhlIGN1cnJlbnQgcGFyZW50IG5vZGUKKyAgIyByZXBsYWNlZCB3aXRoIHRoZSBnaXZlbiBub2RlLgorICAjCisgICMgQHBhcmFtIHBhcmVudCBbVHJlZTo6Tm9kZV0gVGhlIG5ldyBwYXJlbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYmxvY2suCisgICMgQHlpZWxkIEEgYmxvY2sgaW4gd2hpY2ggdGhlIHBhcmVudCBpcyBzZXQgdG8gYHBhcmVudGAuCisgICMgQHJldHVybiBbT2JqZWN0XSBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBibG9jay4KKyAgZGVmIHdpdGhfcGFyZW50KHBhcmVudCkKKyAgICBAcGFyZW50cy5wdXNoIHBhcmVudAorICAgIHlpZWxkCisgIGVuc3VyZQorICAgIEBwYXJlbnRzLnBvcAorICBlbmQKKworICAjIENvbnZlcnRzIHRoZSBlbnRpcmUgZG9jdW1lbnQgdG8gQ1NTLgorICAjCisgICMgQHJldHVybiBbKFRyZWU6Ok5vZGUsIFNhc3M6OlV0aWw6OlN1YnNldE1hcCldIFRoZSByZXN1bHRpbmcgdHJlZSBvZiBzdGF0aWMgbm9kZXMKKyAgIyAgICphbmQqIHRoZSBleHRlbnNpb25zIGRlZmluZWQgZm9yIHRoaXMgdHJlZQorICBkZWYgdmlzaXRfcm9vdChub2RlKQorICAgIHlpZWxkCisKKyAgICBpZiBwYXJlbnQubmlsPworICAgICAgaW1wb3J0c190b19tb3ZlID0gW10KKyAgICAgIGltcG9ydF9saW1pdCA9IG5pbAorICAgICAgaSA9IC0xCisgICAgICBub2RlLmNoaWxkcmVuLnJlamVjdCEgZG8gfG58CisgICAgICAgIGkgKz0gMQorICAgICAgICBpZiBpbXBvcnRfbGltaXQKKyAgICAgICAgICBuZXh0IGZhbHNlIHVubGVzcyBuLmlzX2E/KFNhc3M6OlRyZWU6OkNzc0ltcG9ydE5vZGUpCisgICAgICAgICAgaW1wb3J0c190b19tb3ZlIDw8IG4KKyAgICAgICAgICBuZXh0IHRydWUKKyAgICAgICAgZW5kCisKKyAgICAgICAgaWYgIW4uaXNfYT8oU2Fzczo6VHJlZTo6Q29tbWVudE5vZGUpICYmCisgICAgICAgICAgICAhbi5pc19hPyhTYXNzOjpUcmVlOjpDaGFyc2V0Tm9kZSkgJiYKKyAgICAgICAgICAgICFuLmlzX2E/KFNhc3M6OlRyZWU6OkNzc0ltcG9ydE5vZGUpCisgICAgICAgICAgaW1wb3J0X2xpbWl0ID0gaQorICAgICAgICBlbmQKKworICAgICAgICBmYWxzZQorICAgICAgZW5kCisKKyAgICAgIGlmIGltcG9ydF9saW1pdAorICAgICAgICBub2RlLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlblswLi4uaW1wb3J0X2xpbWl0XSArIGltcG9ydHNfdG9fbW92ZSArCisgICAgICAgICAgbm9kZS5jaGlsZHJlbltpbXBvcnRfbGltaXQuLi0xXQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICByZXR1cm4gbm9kZSwgQGV4dGVuZHMKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBlLnNhc3NfdGVtcGxhdGUgfHw9IG5vZGUudGVtcGxhdGUKKyAgICByYWlzZSBlCisgIGVuZAorCisgICMgQSBzaW1wbGUgc3RydWN0IHdyYXBwaW5nIHVwIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGBAZXh0ZW5kYCBpbnN0YW5jZS4gQQorICAjIHNpbmdsZSB7RXh0ZW5kTm9kZX0gY2FuIGhhdmUgbXVsdGlwbGUgRXh0ZW5kcyBpZiBlaXRoZXIgdGhlIHBhcmVudCBub2RlIG9yCisgICMgdGhlIGV4dGVuZGVkIHNlbGVjdG9yIGlzIGEgY29tbWEgc2VxdWVuY2UuCisgICMKKyAgIyBAYXR0ciBleHRlbmRlciBbU2Fzczo6U2VsZWN0b3I6OlNlcXVlbmNlXQorICAjICAgVGhlIHNlbGVjdG9yIG9mIHRoZSBDU1MgcnVsZSBjb250YWluaW5nIHRoZSBgQGV4dGVuZGAuCisgICMgQGF0dHIgdGFyZ2V0IFtBcnJheTxTYXNzOjpTZWxlY3Rvcjo6U2ltcGxlPl0gVGhlIHNlbGVjdG9yIGJlaW5nIGBAZXh0ZW5kYGVkLgorICAjIEBhdHRyIG5vZGUgW1Nhc3M6OlRyZWU6OkV4dGVuZE5vZGVdIFRoZSBub2RlIHRoYXQgcHJvZHVjZWQgdGhpcyBleHRlbmQuCisgICMgQGF0dHIgZGlyZWN0aXZlcyBbQXJyYXk8U2Fzczo6VHJlZTo6RGlyZWN0aXZlTm9kZT5dCisgICMgICBUaGUgZGlyZWN0aXZlcyBjb250YWluaW5nIHRoZSBgQGV4dGVuZGAuCisgICMgQGF0dHIgc3VjY2VzcyBbQm9vbGVhbl0KKyAgIyAgIFdoZXRoZXIgdGhpcyBleHRlbmQgc3VjY2Vzc2Z1bGx5IG1hdGNoZWQgYSBzZWxlY3Rvci4KKyAgRXh0ZW5kID0gU3RydWN0Lm5ldyg6ZXh0ZW5kZXIsIDp0YXJnZXQsIDpub2RlLCA6ZGlyZWN0aXZlcywgOnN1Y2Nlc3MpCisKKyAgIyBSZWdpc3RlcnMgYW4gZXh0ZW5zaW9uIGluIHRoZSBgQGV4dGVuZHNgIHN1YnNldCBtYXAuCisgIGRlZiB2aXNpdF9leHRlbmQobm9kZSkKKyAgICBwYXJlbnQucmVzb2x2ZWRfcnVsZXMucG9wdWxhdGVfZXh0ZW5kcyhAZXh0ZW5kcywgbm9kZS5yZXNvbHZlZF9zZWxlY3Rvciwgbm9kZSwKKyAgICAgIEBwYXJlbnRzLnNlbGVjdCB7fHB8IHAuaXNfYT8oU2Fzczo6VHJlZTo6RGlyZWN0aXZlTm9kZSl9KQorICAgIFtdCisgIGVuZAorCisgICMgTW9kaWZpZXMgZXhjZXB0aW9uIGJhY2t0cmFjZXMgdG8gaW5jbHVkZSB0aGUgaW1wb3J0ZWQgZmlsZS4KKyAgZGVmIHZpc2l0X2ltcG9ydChub2RlKQorICAgIHZpc2l0X2NoaWxkcmVuX3dpdGhvdXRfcGFyZW50KG5vZGUpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgZS5tb2RpZnlfYmFja3RyYWNlKDpmaWxlbmFtZSA9PiBub2RlLmNoaWxkcmVuLmZpcnN0LmZpbGVuYW1lKQorICAgIGUuYWRkX2JhY2t0cmFjZSg6ZmlsZW5hbWUgPT4gbm9kZS5maWxlbmFtZSwgOmxpbmUgPT4gbm9kZS5saW5lKQorICAgIHJhaXNlIGUKKyAgZW5kCisKKyAgIyBBc3NlcnRzIHRoYXQgYWxsIHRoZSB0cmFjZWQgY2hpbGRyZW4gYXJlIHZhbGlkIGluIHRoZWlyIG5ldyBsb2NhdGlvbi4KKyAgZGVmIHZpc2l0X3RyYWNlKG5vZGUpCisgICAgdmlzaXRfY2hpbGRyZW5fd2l0aG91dF9wYXJlbnQobm9kZSkKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBlLm1vZGlmeV9iYWNrdHJhY2UoOm1peGluID0+IG5vZGUubmFtZSwgOmZpbGVuYW1lID0+IG5vZGUuZmlsZW5hbWUsIDpsaW5lID0+IG5vZGUubGluZSkKKyAgICBlLmFkZF9iYWNrdHJhY2UoOmZpbGVuYW1lID0+IG5vZGUuZmlsZW5hbWUsIDpsaW5lID0+IG5vZGUubGluZSkKKyAgICByYWlzZSBlCisgIGVuZAorCisgICMgQ29udmVydHMgbmVzdGVkIHByb3BlcnRpZXMgaW50byBmbGF0IHByb3BlcnRpZXMKKyAgIyBhbmQgdXBkYXRlcyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHByb3Agbm9kZSBiYXNlZCBvbiB0aGUgbmVzdGluZyBsZXZlbC4KKyAgZGVmIHZpc2l0X3Byb3Aobm9kZSkKKyAgICBpZiBwYXJlbnQuaXNfYT8oU2Fzczo6VHJlZTo6UHJvcE5vZGUpCisgICAgICBub2RlLnJlc29sdmVkX25hbWUgPSAiI3twYXJlbnQucmVzb2x2ZWRfbmFtZX0tI3tub2RlLnJlc29sdmVkX25hbWV9IgorICAgICAgbm9kZS50YWJzID0gcGFyZW50LnRhYnMgKyAocGFyZW50LnJlc29sdmVkX3ZhbHVlLmVtcHR5PyA/IDAgOiAxKSBpZiBub2RlLnN0eWxlID09IDpuZXN0ZWQKKyAgICBlbmQKKworICAgIHlpZWxkCisKKyAgICByZXN1bHQgPSBub2RlLmNoaWxkcmVuLmR1cAorICAgIGlmICFub2RlLnJlc29sdmVkX3ZhbHVlLmVtcHR5PyB8fCBub2RlLmNoaWxkcmVuLmVtcHR5PworICAgICAgbm9kZS5zZW5kKDpjaGVjayEpCisgICAgICByZXN1bHQudW5zaGlmdChub2RlKQorICAgIGVuZAorCisgICAgcmVzdWx0CisgIGVuZAorCisgIGRlZiB2aXNpdF9hdHJvb3Qobm9kZSkKKyAgICAjIElmIHRoZXJlIGFyZW4ndCBhbnkgbW9yZSBkaXJlY3RpdmVzIG9yIHJ1bGVzIHRoYXQgdGhpcyBAYXQtcm9vdCBuZWVkcyB0bworICAgICMgZXhjbHVkZSwgd2UgY2FuIGdldCByaWQgb2YgaXQgYW5kIGp1c3QgZXZhbHVhdGUgdGhlIGNoaWxkcmVuLgorICAgIGlmIEBwYXJlbnRzLm5vbmU/IHt8bnwgbm9kZS5leGNsdWRlX25vZGU/KG4pfQorICAgICAgcmVzdWx0cyA9IHZpc2l0X2NoaWxkcmVuX3dpdGhvdXRfcGFyZW50KG5vZGUpCisgICAgICByZXN1bHRzLmVhY2gge3xjfCBjLnRhYnMgKz0gbm9kZS50YWJzIGlmIGJ1YmJsYWJsZT8oYyl9CisgICAgICBpZiAhcmVzdWx0cy5lbXB0eT8gJiYgYnViYmxhYmxlPyhyZXN1bHRzLmxhc3QpCisgICAgICAgIHJlc3VsdHMubGFzdC5ncm91cF9lbmQgPSBub2RlLmdyb3VwX2VuZAorICAgICAgZW5kCisgICAgICByZXR1cm4gcmVzdWx0cworICAgIGVuZAorCisgICAgIyBJZiB0aGlzIEBhdC1yb290IGV4Y2x1ZGVzIHRoZSBpbW1lZGlhdGUgcGFyZW50LCByZXR1cm4gaXQgYXMtaXMgc28gdGhhdCBpdAorICAgICMgY2FuIGJlIGJ1YmJsZWQgdXAgYnkgdGhlIHBhcmVudCBub2RlLgorICAgIHJldHVybiBCdWJibGUubmV3KG5vZGUpIGlmIG5vZGUuZXhjbHVkZV9ub2RlPyhwYXJlbnQpCisKKyAgICAjIE90aGVyd2lzZSwgZHVwbGljYXRlIHRoZSBjdXJyZW50IHBhcmVudCBhbmQgbW92ZSBpdCBpbnRvIHRoZSBAYXQtcm9vdAorICAgICMgbm9kZS4gQXMgYWJvdmUsIHJldHVybmluZyBhbiBAYXQtcm9vdCBub2RlIHNpZ25hbHMgdG8gdGhlIHBhcmVudCBkaXJlY3RpdmUKKyAgICAjIHRoYXQgaXQgc2hvdWxkIGJlIGJ1YmJsZWQgdXB3YXJkcy4KKyAgICBidWJibGUobm9kZSkKKyAgZW5kCisKKyAgIyBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgYXJlIHZpc2libGUgYW5kIGhhdmUgY2hpbGRyZW4uIFRoaXMgbWVhbnMgdGhleSBuZWVkCisgICMgdG8gYmUgYWJsZSB0byBoYW5kbGUgYnViYmxpbmcgdXAgbm9kZXMgc3VjaCBhcyBAYXQtcm9vdCBhbmQgQG1lZGlhLgorCisgICMgVXBkYXRlcyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHJ1bGUgbm9kZSBiYXNlZCBvbiB0aGUgbmVzdGluZworICAjIGxldmVsLiBUaGUgc2VsZWN0b3JzIHdlcmUgcmVzb2x2ZWQgaW4ge1BlcmZvcm19LgorICBkZWYgdmlzaXRfcnVsZShub2RlKQorICAgIHlpZWxkCisKKyAgICBydWxlcyA9IG5vZGUuY2hpbGRyZW4uc2VsZWN0IHt8Y3wgYnViYmxhYmxlPyhjKX0KKyAgICBwcm9wcyA9IG5vZGUuY2hpbGRyZW4ucmVqZWN0IHt8Y3wgYnViYmxhYmxlPyhjKSB8fCBjLmludmlzaWJsZT99CisKKyAgICB1bmxlc3MgcHJvcHMuZW1wdHk/CisgICAgICBub2RlLmNoaWxkcmVuID0gcHJvcHMKKyAgICAgIHJ1bGVzLmVhY2gge3xyfCByLnRhYnMgKz0gMX0gaWYgbm9kZS5zdHlsZSA9PSA6bmVzdGVkCisgICAgICBydWxlcy51bnNoaWZ0KG5vZGUpCisgICAgZW5kCisKKyAgICBydWxlcyA9IGRlYnViYmxlKHJ1bGVzKQorICAgIHVubGVzcyBwYXJlbnQuaXNfYT8oU2Fzczo6VHJlZTo6UnVsZU5vZGUpIHx8IHJ1bGVzLmVtcHR5PyB8fCAhYnViYmxhYmxlPyhydWxlcy5sYXN0KQorICAgICAgcnVsZXMubGFzdC5ncm91cF9lbmQgPSB0cnVlCisgICAgZW5kCisgICAgcnVsZXMKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2tleWZyYW1lcnVsZShub2RlKQorICAgIHJldHVybiBub2RlIHVubGVzcyBub2RlLmhhc19jaGlsZHJlbgorCisgICAgeWllbGQKKworICAgIGRlYnViYmxlKG5vZGUuY2hpbGRyZW4sIG5vZGUpCisgIGVuZAorCisgICMgQnViYmxlcyBhIGRpcmVjdGl2ZSB1cCB0aHJvdWdoIFJ1bGVOb2Rlcy4KKyAgZGVmIHZpc2l0X2RpcmVjdGl2ZShub2RlKQorICAgIHJldHVybiBub2RlIHVubGVzcyBub2RlLmhhc19jaGlsZHJlbgorICAgIGlmIHBhcmVudC5pc19hPyhTYXNzOjpUcmVlOjpSdWxlTm9kZSkKKyAgICAgICMgQGtleWZyYW1lcyBzaG91bGRuJ3QgaW5jbHVkZSB0aGUgcnVsZSBub2Rlcywgc28gd2UgbWFudWFsbHkgY3JlYXRlIGEKKyAgICAgICMgYnViYmxlIHRoYXQgZG9lc24ndCBoYXZlIHRoZSBwYXJlbnQncyBjb250ZW50cyBmb3IgdGhlbS4KKyAgICAgIHJldHVybiBub2RlLm5vcm1hbGl6ZWRfbmFtZSA9PSAnQGtleWZyYW1lcycgPyBCdWJibGUubmV3KG5vZGUpIDogYnViYmxlKG5vZGUpCisgICAgZW5kCisKKyAgICB5aWVsZAorCisgICAgIyBTaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBtZXJlIHByZXNlbmNlIG9mIGFuIHVua25vd24gZGlyZWN0aXZlIG1heSBiZQorICAgICMgaW1wb3J0YW50LCB3ZSBzaG91bGQga2VlcCBhbiBlbXB0eSB2ZXJzaW9uIGFyb3VuZCBldmVuIGlmIGFsbCB0aGUgY29udGVudHMKKyAgICAjIGFyZSByZW1vdmVkIHZpYSBAYXQtcm9vdC4gSG93ZXZlciwgaWYgdGhlIGNvbnRlbnRzIGFyZSBqdXN0IGJ1YmJsZWQgb3V0LAorICAgICMgd2UgZG9uJ3QgbmVlZCB0byBkbyBzby4KKyAgICBkaXJlY3RpdmVfZXhpc3RzID0gbm9kZS5jaGlsZHJlbi5hbnk/IGRvIHxjaGlsZHwKKyAgICAgIG5leHQgdHJ1ZSB1bmxlc3MgY2hpbGQuaXNfYT8oQnViYmxlKQorICAgICAgbmV4dCBmYWxzZSB1bmxlc3MgY2hpbGQubm9kZS5pc19hPyhTYXNzOjpUcmVlOjpEaXJlY3RpdmVOb2RlKQorICAgICAgY2hpbGQubm9kZS5yZXNvbHZlZF92YWx1ZSA9PSBub2RlLnJlc29sdmVkX3ZhbHVlCisgICAgZW5kCisKKyAgICAjIFdlIGtub3cgZW1wdHkgQGtleWZyYW1lcyBkaXJlY3RpdmVzIGRvIG5vdGhpbmcuCisgICAgaWYgZGlyZWN0aXZlX2V4aXN0cyB8fCBub2RlLm5hbWUgPT0gJ0BrZXlmcmFtZXMnCisgICAgICBbXQorICAgIGVsc2UKKyAgICAgIGVtcHR5X25vZGUgPSBub2RlLmR1cAorICAgICAgZW1wdHlfbm9kZS5jaGlsZHJlbiA9IFtdCisgICAgICBbZW1wdHlfbm9kZV0KKyAgICBlbmQgKyBkZWJ1YmJsZShub2RlLmNoaWxkcmVuLCBub2RlKQorICBlbmQKKworICAjIEJ1YmJsZXMgdGhlIGBAbWVkaWFgIGRpcmVjdGl2ZSB1cCB0aHJvdWdoIFJ1bGVOb2RlcworICAjIGFuZCBtZXJnZXMgaXQgd2l0aCBvdGhlciBgQG1lZGlhYCBkaXJlY3RpdmVzLgorICBkZWYgdmlzaXRfbWVkaWEobm9kZSkKKyAgICByZXR1cm4gYnViYmxlKG5vZGUpIGlmIHBhcmVudC5pc19hPyhTYXNzOjpUcmVlOjpSdWxlTm9kZSkKKyAgICByZXR1cm4gQnViYmxlLm5ldyhub2RlKSBpZiBwYXJlbnQuaXNfYT8oU2Fzczo6VHJlZTo6TWVkaWFOb2RlKQorCisgICAgeWllbGQKKworICAgIGRlYnViYmxlKG5vZGUuY2hpbGRyZW4sIG5vZGUpIGRvIHxjaGlsZHwKKyAgICAgIG5leHQgY2hpbGQgdW5sZXNzIGNoaWxkLmlzX2E/KFNhc3M6OlRyZWU6Ok1lZGlhTm9kZSkKKyAgICAgICMgQ29waWVzIG9mIGBub2RlYCBjYW4gYmUgYnViYmxlZCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgaXQgd2l0aCBpdHMKKyAgICAgICMgb3duIHF1ZXJ5LgorICAgICAgbmV4dCBjaGlsZCBpZiBjaGlsZC5yZXNvbHZlZF9xdWVyeSA9PSBub2RlLnJlc29sdmVkX3F1ZXJ5CisgICAgICBuZXh0IGNoaWxkIGlmIGNoaWxkLnJlc29sdmVkX3F1ZXJ5ID0gY2hpbGQucmVzb2x2ZWRfcXVlcnkubWVyZ2Uobm9kZS5yZXNvbHZlZF9xdWVyeSkKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBCdWJibGVzIHRoZSBgQHN1cHBvcnRzYCBkaXJlY3RpdmUgdXAgdGhyb3VnaCBSdWxlTm9kZXMuCisgIGRlZiB2aXNpdF9zdXBwb3J0cyhub2RlKQorICAgIHJldHVybiBub2RlIHVubGVzcyBub2RlLmhhc19jaGlsZHJlbgorICAgIHJldHVybiBidWJibGUobm9kZSkgaWYgcGFyZW50LmlzX2E/KFNhc3M6OlRyZWU6OlJ1bGVOb2RlKQorCisgICAgeWllbGQKKworICAgIGRlYnViYmxlKG5vZGUuY2hpbGRyZW4sIG5vZGUpCisgIGVuZAorCisgIHByaXZhdGUKKworICAjICJCdWJibGVzIiBgbm9kZWAgb25lIGxldmVsIGJ5IGNvcHlpbmcgdGhlIHBhcmVudCBhbmQgd3JhcHBpbmcgYG5vZGVgJ3MKKyAgIyBjaGlsZHJlbiB3aXRoIGl0LgorICAjCisgICMgQHBhcmFtIG5vZGUgW1Nhc3M6OlRyZWU6Ok5vZGVdLgorICAjIEByZXR1cm4gW0J1YmJsZV0KKyAgZGVmIGJ1YmJsZShub2RlKQorICAgIG5ld19ydWxlID0gcGFyZW50LmR1cAorICAgIG5ld19ydWxlLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbgorICAgIG5vZGUuY2hpbGRyZW4gPSBbbmV3X3J1bGVdCisgICAgQnViYmxlLm5ldyhub2RlKQorICBlbmQKKworICAjIFBvcHMgYWxsIGJ1YmJsZXMgaW4gYGNoaWxkcmVuYCBhbmQgaW50ZXJzcGVyc2VzIHRoZSByZXN1bHRzIHdpdGggdGhlIG90aGVyCisgICMgdmFsdWVzLgorICAjCisgICMgSWYgYHBhcmVudGAgaXMgcGFzc2VkLCBpdCdzIGNvcGllZCBhbmQgdXNlZCBhcyB0aGUgcGFyZW50IG5vZGUgZm9yIHRoZQorICAjIG5lc3RlZCBwb3J0aW9ucyBvZiBgY2hpbGRyZW5gLgorICAjCisgICMgQHBhcmFtIGNoaWxkcmVuIFtMaXN0PFNhc3M6OlRyZWU6Ok5vZGUsIEJ1YmJsZT5dCisgICMgQHBhcmFtIHBhcmVudCBbU2Fzczo6VHJlZTo6Tm9kZV0KKyAgIyBAeWllbGQgW25vZGVdIEFuIG9wdGlvbmFsIGJsb2NrIGZvciBwcm9jZXNzaW5nIGJ1YmJsZWQgbm9kZXMuIEVhY2ggYnViYmxlZAorICAjICAgbm9kZSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGJsb2NrLgorICAjIEB5aWVsZHBhcmFtIG5vZGUgW1Nhc3M6OlRyZWU6Ok5vZGVdIEEgYnViYmxlZCBub2RlLgorICAjIEB5aWVsZHJldHVybiBbU2Fzczo6VHJlZTo6Tm9kZT9dIEEgbm9kZSB0byB1c2UgaW4gcGxhY2Ugb2YgdGhlIGJ1YmJsZWQgbm9kZS4KKyAgIyAgIFRoaXMgY2FuIGJlIHRoZSBub2RlIGl0c2VsZiwgb3IgYG5pbGAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbm9kZSBzaG91bGQgYmUKKyAgIyAgIG9taXR0ZWQuCisgICMgQHJldHVybiBbTGlzdDxTYXNzOjpUcmVlOjpOb2RlLCBCdWJibGU+XQorICBkZWYgZGVidWJibGUoY2hpbGRyZW4sIHBhcmVudCA9IG5pbCkKKyAgICAjIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIHBhcmVudCBzbyB0aGF0IHdlIGRvbid0IGRpdmlkZSBgcGFyZW50YAorICAgICMgdW5uZWNlc3NhcmlseSBpZiB0aGUgYEBhdC1yb290YCBkb2Vzbid0IHByb2R1Y2UgYW55IG5ldyBub2RlcyAoZS5nLgorICAgICMgYEBhdC1yb290IHtAZXh0ZW5kICVmb299YCkuCisgICAgcHJldmlvdXNfcGFyZW50ID0gbmlsCisKKyAgICBTYXNzOjpVdGlsLnNsaWNlX2J5KGNoaWxkcmVuKSB7fGN8IGMuaXNfYT8oQnViYmxlKX0ubWFwIGRvIHwoaXNfYnViYmxlLCBzbGljZSl8CisgICAgICB1bmxlc3MgaXNfYnViYmxlCisgICAgICAgIG5leHQgc2xpY2UgdW5sZXNzIHBhcmVudAorICAgICAgICBpZiBwcmV2aW91c19wYXJlbnQKKyAgICAgICAgICBwcmV2aW91c19wYXJlbnQuY2hpbGRyZW4ucHVzaCgqc2xpY2UpCisgICAgICAgICAgbmV4dCBbXQorICAgICAgICBlbHNlCisgICAgICAgICAgcHJldmlvdXNfcGFyZW50ID0gbmV3X3BhcmVudCA9IHBhcmVudC5kdXAKKyAgICAgICAgICBuZXdfcGFyZW50LmNoaWxkcmVuID0gc2xpY2UKKyAgICAgICAgICBuZXh0IG5ld19wYXJlbnQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgc2xpY2UubWFwIGRvIHxidWJibGV8CisgICAgICAgIG5leHQgdW5sZXNzIChub2RlID0gYmxvY2tfZ2l2ZW4/ID8geWllbGQoYnViYmxlLm5vZGUpIDogYnViYmxlLm5vZGUpCisgICAgICAgIG5vZGUudGFicyArPSBidWJibGUudGFicworICAgICAgICBub2RlLmdyb3VwX2VuZCA9IGJ1YmJsZS5ncm91cF9lbmQKKyAgICAgICAgcmVzdWx0cyA9IFt2aXNpdChub2RlKV0uZmxhdHRlbgorICAgICAgICBwcmV2aW91c19wYXJlbnQgPSBuaWwgdW5sZXNzIHJlc3VsdHMuZW1wdHk/CisgICAgICAgIHJlc3VsdHMKKyAgICAgIGVuZC5jb21wYWN0CisgICAgZW5kLmZsYXR0ZW4KKyAgZW5kCisKKyAgIyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgbm9kZSBjYW4gYmUgYnViYmxlZCB1cCB0aHJvdWdoIHRoZSBzeW50YXggdHJlZS4KKyAgIworICAjIEBwYXJhbSBub2RlIFtTYXNzOjpUcmVlOjpOb2RlXQorICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgIGRlZiBidWJibGFibGU/KG5vZGUpCisgICAgbm9kZS5pc19hPyhTYXNzOjpUcmVlOjpSdWxlTm9kZSkgfHwgbm9kZS5idWJibGVzPworICBlbmQKKworICAjIEEgd3JhcHBlciBjbGFzcyBmb3IgYSBub2RlIHRoYXQgaW5kaWNhdGVzIHRvIHRoZSBwYXJlbnQgdGhhdCBpdCBzaG91bGQKKyAgIyB0cmVhdCB0aGUgd3JhcHBlZCBub2RlIGFzIGEgc2libGluZyByYXRoZXIgdGhhbiBhIGNoaWxkLgorICAjCisgICMgTm9kZXMgc2hvdWxkIGJlIHdyYXBwZWQgYmVmb3JlIHRoZXkncmUgcGFzc2VkIHRvIFx7Q3NzaXplLnZpc2l0fS4gVGhleSB3aWxsCisgICMgYmUgYXV0b21hdGljYWxseSB2aXNpdGVkIHVwb24gY2FsbGluZyBceyNwb3B9LgorICAjCisgICMgVGhpcyBkdWNrIHR5cGVzIGFzIGEgW1Nhc3M6OlRyZWU6Ok5vZGVdIGZvciB0aGUgcHVycG9zZXMgb2YKKyAgIyB0cmVlLW1hbmlwdWxhdGlvbiBvcGVyYXRpb25zLgorICBjbGFzcyBCdWJibGUKKyAgICBhdHRyX2FjY2Vzc29yIDpub2RlCisgICAgYXR0cl9hY2Nlc3NvciA6dGFicworICAgIGF0dHJfYWNjZXNzb3IgOmdyb3VwX2VuZAorCisgICAgZGVmIGluaXRpYWxpemUobm9kZSkKKyAgICAgIEBub2RlID0gbm9kZQorICAgICAgQHRhYnMgPSAwCisgICAgZW5kCisKKyAgICBkZWYgYnViYmxlcz8KKyAgICAgIHRydWUKKyAgICBlbmQKKworICAgIGRlZiBpbnNwZWN0CisgICAgICAiKEJ1YmJsZSAje25vZGUuaW5zcGVjdH0pIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL2RlZXBfY29weS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9kZWVwX2NvcHkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkN2JhNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9kZWVwX2NvcHkucmIKQEAgLTAsMCArMSwxMDcgQEAKKyMgQSB2aXNpdG9yIGZvciBjb3B5aW5nIHRoZSBmdWxsIHN0cnVjdHVyZSBvZiBhIFNhc3MgdHJlZS4KK2NsYXNzIFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpEZWVwQ29weSA8IFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpCYXNlCisgIHByb3RlY3RlZAorCisgIGRlZiB2aXNpdChub2RlKQorICAgIHN1cGVyKG5vZGUuZHVwKQorICBlbmQKKworICBkZWYgdmlzaXRfY2hpbGRyZW4ocGFyZW50KQorICAgIHBhcmVudC5jaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbi5tYXAge3xjfCB2aXNpdChjKX0KKyAgICBwYXJlbnQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2RlYnVnKG5vZGUpCisgICAgbm9kZS5leHByID0gbm9kZS5leHByLmRlZXBfY29weQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9lcnJvcihub2RlKQorICAgIG5vZGUuZXhwciA9IG5vZGUuZXhwci5kZWVwX2NvcHkKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfZWFjaChub2RlKQorICAgIG5vZGUubGlzdCA9IG5vZGUubGlzdC5kZWVwX2NvcHkKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfZXh0ZW5kKG5vZGUpCisgICAgbm9kZS5zZWxlY3RvciA9IG5vZGUuc2VsZWN0b3IubWFwIHt8Y3wgYy5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUpID8gYy5kZWVwX2NvcHkgOiBjfQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9mb3Iobm9kZSkKKyAgICBub2RlLmZyb20gPSBub2RlLmZyb20uZGVlcF9jb3B5CisgICAgbm9kZS50byA9IG5vZGUudG8uZGVlcF9jb3B5CisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2Z1bmN0aW9uKG5vZGUpCisgICAgbm9kZS5hcmdzID0gbm9kZS5hcmdzLm1hcCB7fGssIHZ8IFtrLmRlZXBfY29weSwgdiAmJiB2LmRlZXBfY29weV19CisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2lmKG5vZGUpCisgICAgbm9kZS5leHByID0gbm9kZS5leHByLmRlZXBfY29weSBpZiBub2RlLmV4cHIKKyAgICBub2RlLmVsc2UgPSB2aXNpdChub2RlLmVsc2UpIGlmIG5vZGUuZWxzZQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9taXhpbmRlZihub2RlKQorICAgIG5vZGUuYXJncyA9IG5vZGUuYXJncy5tYXAge3xrLCB2fCBbay5kZWVwX2NvcHksIHYgJiYgdi5kZWVwX2NvcHldfQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9taXhpbihub2RlKQorICAgIG5vZGUuYXJncyA9IG5vZGUuYXJncy5tYXAge3xhfCBhLmRlZXBfY29weX0KKyAgICBub2RlLmtleXdvcmRzID0gU2Fzczo6VXRpbDo6Tm9ybWFsaXplZE1hcC5uZXcoSGFzaFtub2RlLmtleXdvcmRzLm1hcCB7fGssIHZ8IFtrLCB2LmRlZXBfY29weV19XSkKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfcHJvcChub2RlKQorICAgIG5vZGUubmFtZSA9IG5vZGUubmFtZS5tYXAge3xjfCBjLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSkgPyBjLmRlZXBfY29weSA6IGN9CisgICAgbm9kZS52YWx1ZSA9IG5vZGUudmFsdWUubWFwIHt8Y3wgYy5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUpID8gYy5kZWVwX2NvcHkgOiBjfQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9yZXR1cm4obm9kZSkKKyAgICBub2RlLmV4cHIgPSBub2RlLmV4cHIuZGVlcF9jb3B5CisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3J1bGUobm9kZSkKKyAgICBub2RlLnJ1bGUgPSBub2RlLnJ1bGUubWFwIHt8Y3wgYy5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUpID8gYy5kZWVwX2NvcHkgOiBjfQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF92YXJpYWJsZShub2RlKQorICAgIG5vZGUuZXhwciA9IG5vZGUuZXhwci5kZWVwX2NvcHkKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfd2Fybihub2RlKQorICAgIG5vZGUuZXhwciA9IG5vZGUuZXhwci5kZWVwX2NvcHkKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfd2hpbGUobm9kZSkKKyAgICBub2RlLmV4cHIgPSBub2RlLmV4cHIuZGVlcF9jb3B5CisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2RpcmVjdGl2ZShub2RlKQorICAgIG5vZGUudmFsdWUgPSBub2RlLnZhbHVlLm1hcCB7fGN8IGMuaXNfYT8oU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlKSA/IGMuZGVlcF9jb3B5IDogY30KKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfbWVkaWEobm9kZSkKKyAgICBub2RlLnF1ZXJ5ID0gbm9kZS5xdWVyeS5tYXAge3xjfCBjLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSkgPyBjLmRlZXBfY29weSA6IGN9CisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3N1cHBvcnRzKG5vZGUpCisgICAgbm9kZS5jb25kaXRpb24gPSBub2RlLmNvbmRpdGlvbi5kZWVwX2NvcHkKKyAgICB5aWVsZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL2V4dGVuZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9leHRlbmQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjM2UyMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9leHRlbmQucmIKQEAgLTAsMCArMSw2NCBAQAorIyBBIHZpc2l0b3IgZm9yIHBlcmZvcm1pbmcgc2VsZWN0b3IgaW5oZXJpdGFuY2Ugb24gYSBzdGF0aWMgQ1NTIHRyZWUuCisjCisjIERlc3RydWN0aXZlbHkgbW9kaWZpZXMgdGhlIHRyZWUuCitjbGFzcyBTYXNzOjpUcmVlOjpWaXNpdG9yczo6RXh0ZW5kIDwgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OkJhc2UKKyAgIyBQZXJmb3JtcyB0aGUgZ2l2ZW4gZXh0ZW5zaW9ucyBvbiB0aGUgc3RhdGljIENTUyB0cmVlIGJhc2VkIGluIGByb290YCwgdGhlbgorICAjIHZhbGlkYXRlcyB0aGF0IGFsbCBleHRlbmRzIG1hdGNoZWQgc29tZSBzZWxlY3Rvci4KKyAgIworICAjIEBwYXJhbSByb290IFtUcmVlOjpOb2RlXSBUaGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIHRvIHZpc2l0LgorICAjIEBwYXJhbSBleHRlbmRzIFtTYXNzOjpVdGlsOjpTdWJzZXRNYXB7U2VsZWN0b3I6OlNpbXBsZSA9PgorICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OkNzc2l6ZTo6RXh0ZW5kfV0KKyAgIyAgIFRoZSBleHRlbnNpb25zIHRvIHBlcmZvcm0gb24gdGhpcyB0cmVlLgorICAjIEByZXR1cm4gW09iamVjdF0gVGhlIHJldHVybiB2YWx1ZSBvZiBceyN2aXNpdH0gZm9yIHRoZSByb290IG5vZGUuCisgIGRlZiBzZWxmLnZpc2l0KHJvb3QsIGV4dGVuZHMpCisgICAgcmV0dXJuIGlmIGV4dGVuZHMuZW1wdHk/CisgICAgbmV3KGV4dGVuZHMpLnNlbmQoOnZpc2l0LCByb290KQorICAgIGNoZWNrX2V4dGVuZHNfZmlyZWQhIGV4dGVuZHMKKyAgZW5kCisKKyAgcHJvdGVjdGVkCisKKyAgZGVmIGluaXRpYWxpemUoZXh0ZW5kcykKKyAgICBAcGFyZW50X2RpcmVjdGl2ZXMgPSBbXQorICAgIEBleHRlbmRzID0gZXh0ZW5kcworICBlbmQKKworICAjIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHRoaXMgYWRkcyBwcm9wZXIgbWV0YWRhdGEgdG8gdGhlIGJhY2t0cmFjZS4KKyAgZGVmIHZpc2l0KG5vZGUpCisgICAgc3VwZXIobm9kZSkKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBlLm1vZGlmeV9iYWNrdHJhY2UoOmZpbGVuYW1lID0+IG5vZGUuZmlsZW5hbWUsIDpsaW5lID0+IG5vZGUubGluZSkKKyAgICByYWlzZSBlCisgIGVuZAorCisgICMgS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgcGFyZW50IGRpcmVjdGl2ZXMuCisgIGRlZiB2aXNpdF9jaGlsZHJlbihwYXJlbnQpCisgICAgQHBhcmVudF9kaXJlY3RpdmVzLnB1c2ggcGFyZW50IGlmIHBhcmVudC5pc19hPyhTYXNzOjpUcmVlOjpEaXJlY3RpdmVOb2RlKQorICAgIHN1cGVyCisgIGVuc3VyZQorICAgIEBwYXJlbnRfZGlyZWN0aXZlcy5wb3AgaWYgcGFyZW50LmlzX2E/KFNhc3M6OlRyZWU6OkRpcmVjdGl2ZU5vZGUpCisgIGVuZAorCisgICMgQXBwbGllcyB0aGUgZXh0ZW5kIHRvIGEgc2luZ2xlIHJ1bGUncyBzZWxlY3Rvci4KKyAgZGVmIHZpc2l0X3J1bGUobm9kZSkKKyAgICBub2RlLnJlc29sdmVkX3J1bGVzID0gbm9kZS5yZXNvbHZlZF9ydWxlcy5kb19leHRlbmQoQGV4dGVuZHMsIEBwYXJlbnRfZGlyZWN0aXZlcykKKyAgZW5kCisKKyAgY2xhc3MgPDwgc2VsZgorICAgIHByaXZhdGUKKworICAgIGRlZiBjaGVja19leHRlbmRzX2ZpcmVkIShleHRlbmRzKQorICAgICAgZXh0ZW5kcy5lYWNoX3ZhbHVlIGRvIHxleHwKKyAgICAgICAgbmV4dCBpZiBleC5zdWNjZXNzIHx8IGV4Lm5vZGUub3B0aW9uYWw/CisgICAgICAgIG1lc3NhZ2UgPSAiXCIje2V4LmV4dGVuZGVyfVwiIGZhaWxlZCB0byBAZXh0ZW5kIFwiI3tleC50YXJnZXQuam9pbn1cIi4iCisKKyAgICAgICAgIyBUT0RPKG53ZWl6KTogdGhpcyBzaG91bGQgdXNlIHRoZSBTYXNzIHN0YWNrIHRyYWNlIG9mIHRoZSBleHRlbmQgbm9kZS4KKyAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KDw8TUVTU0FHRSwgOmZpbGVuYW1lID0+IGV4Lm5vZGUuZmlsZW5hbWUsIDpsaW5lID0+IGV4Lm5vZGUubGluZSkKKyN7bWVzc2FnZX0KK1RoZSBzZWxlY3RvciAiI3tleC50YXJnZXQuam9pbn0iIHdhcyBub3QgZm91bmQuCitVc2UgIkBleHRlbmQgI3tleC50YXJnZXQuam9pbn0gIW9wdGlvbmFsIiBpZiB0aGUgZXh0ZW5kIHNob3VsZCBiZSBhYmxlIHRvIGZhaWwuCitNRVNTQUdFCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9wZXJmb3JtLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL3BlcmZvcm0ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhMTJiMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9wZXJmb3JtLnJiCkBAIC0wLDAgKzEsNTc2IEBACisjIEEgdmlzaXRvciBmb3IgY29udmVydGluZyBhIGR5bmFtaWMgU2FzcyB0cmVlIGludG8gYSBzdGF0aWMgU2FzcyB0cmVlLgorY2xhc3MgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OlBlcmZvcm0gPCBTYXNzOjpUcmVlOjpWaXNpdG9yczo6QmFzZQorICBAQGZ1bmN0aW9uX25hbWVfZGVwcmVjYXRpb24gPSBTYXNzOjpEZXByZWNhdGlvbi5uZXcKKworICBjbGFzcyA8PCBzZWxmCisgICAgIyBAcGFyYW0gcm9vdCBbVHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZSB0byB2aXNpdC4KKyAgICAjIEBwYXJhbSBlbnZpcm9ubWVudCBbU2Fzczo6RW52aXJvbm1lbnRdIFRoZSBsZXhpY2FsIGVudmlyb25tZW50LgorICAgICMgQHJldHVybiBbVHJlZTo6Tm9kZV0gVGhlIHJlc3VsdGluZyB0cmVlIG9mIHN0YXRpYyBub2Rlcy4KKyAgICBkZWYgdmlzaXQocm9vdCwgZW52aXJvbm1lbnQgPSBuaWwpCisgICAgICBuZXcoZW52aXJvbm1lbnQpLnNlbmQoOnZpc2l0LCByb290KQorICAgIGVuZAorCisgICAgIyBAYXBpIHByaXZhdGUKKyAgICAjIEBjb21tZW50CisgICAgIyAgIHJ1Ym9jb3A6ZGlzYWJsZSBNZXRob2RMZW5ndGgKKyAgICBkZWYgcGVyZm9ybV9hcmd1bWVudHMoY2FsbGFibGUsIGFyZ3MsIHNwbGF0LCBlbnZpcm9ubWVudCkKKyAgICAgIGRlc2MgPSAiI3tjYWxsYWJsZS50eXBlLmNhcGl0YWxpemV9ICN7Y2FsbGFibGUubmFtZX0iCisgICAgICBkb3duY2FzZV9kZXNjID0gIiN7Y2FsbGFibGUudHlwZX0gI3tjYWxsYWJsZS5uYW1lfSIKKworICAgICAgIyBBbGwga2V5d29yZHMgYXJlIGNvbnRhaW5lZCBpbiBzcGxhdC5rZXl3b3JkcyBmb3IgY29uc2lzdGVuY3ksCisgICAgICAjIGV2ZW4gaWYgdGhlcmUgd2VyZSBubyBzcGxhdHMgcGFzc2VkIGluLgorICAgICAgb2xkX2tleXdvcmRzX2FjY2Vzc2VkID0gc3BsYXQua2V5d29yZHNfYWNjZXNzZWQKKyAgICAgIGtleXdvcmRzID0gc3BsYXQua2V5d29yZHMKKyAgICAgIHNwbGF0LmtleXdvcmRzX2FjY2Vzc2VkID0gb2xkX2tleXdvcmRzX2FjY2Vzc2VkCisKKyAgICAgIGJlZ2luCisgICAgICAgIHVubGVzcyBrZXl3b3Jkcy5lbXB0eT8KKyAgICAgICAgICB1bmtub3duX2FyZ3MgPSBTYXNzOjpVdGlsLmFycmF5X21pbnVzKGtleXdvcmRzLmtleXMsCisgICAgICAgICAgICBjYWxsYWJsZS5hcmdzLm1hcCB7fHZhcnwgdmFyLmZpcnN0LnVuZGVyc2NvcmVkX25hbWV9KQorICAgICAgICAgIGlmIGNhbGxhYmxlLnNwbGF0ICYmIHVua25vd25fYXJncy5pbmNsdWRlPyhjYWxsYWJsZS5zcGxhdC51bmRlcnNjb3JlZF9uYW1lKQorICAgICAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCJBcmd1bWVudCAkI3tjYWxsYWJsZS5zcGxhdC5uYW1lfSBvZiAje2Rvd25jYXNlX2Rlc2N9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgdXNlZCBhcyBhIG5hbWVkIGFyZ3VtZW50LiIpCisgICAgICAgICAgZWxzaWYgdW5rbm93bl9hcmdzLmFueT8KKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gdW5rbm93bl9hcmdzLmxlbmd0aCA+IDEgPyAndGhlIGZvbGxvd2luZyBhcmd1bWVudHM6JyA6ICdhbiBhcmd1bWVudCBuYW1lZCcKKyAgICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiI3tkZXNjfSBkb2Vzbid0IGhhdmUgI3tkZXNjcmlwdGlvbn0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiN7dW5rbm93bl9hcmdzLm1hcCB7fG5hbWV8ICIkI3tuYW1lfSJ9LmpvaW4gJywgJ30uIikKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4ga2V5d29yZF9leGNlcHRpb24KKyAgICAgIGVuZAorCisgICAgICAjIElmIHRoZXJlJ3Mgbm8gc3BsYXQsIHJhaXNlIHRoZSBrZXl3b3JkIGV4Y2VwdGlvbiBpbW1lZGlhdGVseS4gVGhlIGFjdHVhbAorICAgICAgIyByYWlzaW5nIGhhcHBlbnMgaW4gdGhlIGVuc3VyZSBjbGF1c2UgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgICAgcmV0dXJuIGlmIGtleXdvcmRfZXhjZXB0aW9uICYmICFjYWxsYWJsZS5zcGxhdAorCisgICAgICBzcGxhdF9zZXAgPSA6Y29tbWEKKyAgICAgIGlmIHNwbGF0CisgICAgICAgIGFyZ3MgKz0gc3BsYXQudG9fYQorICAgICAgICBzcGxhdF9zZXAgPSBzcGxhdC5zZXBhcmF0b3IKKyAgICAgIGVuZAorCisgICAgICBpZiBhcmdzLnNpemUgPiBjYWxsYWJsZS5hcmdzLnNpemUgJiYgIWNhbGxhYmxlLnNwbGF0CisgICAgICAgIGV4dHJhX2FyZ3NfYmVjYXVzZV9vZl9zcGxhdCA9IHNwbGF0ICYmIGFyZ3Muc2l6ZSAtIHNwbGF0LnRvX2Euc2l6ZSA8PSBjYWxsYWJsZS5hcmdzLnNpemUKKworICAgICAgICB0YWtlcyA9IGNhbGxhYmxlLmFyZ3Muc2l6ZQorICAgICAgICBwYXNzZWQgPSBhcmdzLnNpemUKKyAgICAgICAgbWVzc2FnZSA9ICIje2Rlc2N9IHRha2VzICN7dGFrZXN9IGFyZ3VtZW50I3sncycgdW5sZXNzIHRha2VzID09IDF9ICIgKworICAgICAgICAgICJidXQgI3twYXNzZWR9ICN7cGFzc2VkID09IDEgPyAnd2FzJyA6ICd3ZXJlJ30gcGFzc2VkLiIKKyAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KG1lc3NhZ2UpIHVubGVzcyBleHRyYV9hcmdzX2JlY2F1c2Vfb2Zfc3BsYXQKKyAgICAgICAgIyBUT0RPOiB3aGVuIHRoZSBkZXByZWNhdGlvbiBwZXJpb2QgaXMgb3ZlciwgbWFrZSB0aGlzIGFuIGVycm9yLgorICAgICAgICBTYXNzOjpVdGlsLnNhc3Nfd2FybigiV0FSTklORzogI3ttZXNzYWdlfVxuIiArCisgICAgICAgICAgZW52aXJvbm1lbnQuc3RhY2sudG9fcy5nc3ViKC9eL20sICIgIiAqIDgpICsgIlxuIiArCisgICAgICAgICAgIlRoaXMgd2lsbCBiZSBhbiBlcnJvciBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgU2Fzcy4iKQorICAgICAgZW5kCisKKyAgICAgIGVudiA9IFNhc3M6OkVudmlyb25tZW50Lm5ldyhjYWxsYWJsZS5lbnZpcm9ubWVudCkKKyAgICAgIGNhbGxhYmxlLmFyZ3MuemlwKGFyZ3NbMC4uLmNhbGxhYmxlLmFyZ3MubGVuZ3RoXSkgZG8gfCh2YXIsIGRlZmF1bHQpLCB2YWx1ZXwKKyAgICAgICAgaWYgdmFsdWUgJiYga2V5d29yZHMuaGFzX2tleT8odmFyLm5hbWUpCisgICAgICAgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KCIje2Rlc2N9IHdhcyBwYXNzZWQgYXJndW1lbnQgJCN7dmFyLm5hbWV9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm90aCBieSBwb3NpdGlvbiBhbmQgYnkgbmFtZS4iKQorICAgICAgICBlbmQKKworICAgICAgICB2YWx1ZSB8fD0ga2V5d29yZHMuZGVsZXRlKHZhci5uYW1lKQorICAgICAgICB2YWx1ZSB8fD0gZGVmYXVsdCAmJiBkZWZhdWx0LnBlcmZvcm0oZW52KQorICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIiN7ZGVzY30gaXMgbWlzc2luZyBhcmd1bWVudCAje3Zhci5pbnNwZWN0fS4iKSB1bmxlc3MgdmFsdWUKKyAgICAgICAgZW52LnNldF9sb2NhbF92YXIodmFyLm5hbWUsIHZhbHVlKQorICAgICAgZW5kCisKKyAgICAgIGlmIGNhbGxhYmxlLnNwbGF0CisgICAgICAgIHJlc3QgPSBhcmdzW2NhbGxhYmxlLmFyZ3MubGVuZ3RoLi4tMV0gfHwgW10KKyAgICAgICAgYXJnX2xpc3QgPSBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpBcmdMaXN0Lm5ldyhyZXN0LCBrZXl3b3Jkcywgc3BsYXRfc2VwKQorICAgICAgICBhcmdfbGlzdC5vcHRpb25zID0gZW52Lm9wdGlvbnMKKyAgICAgICAgZW52LnNldF9sb2NhbF92YXIoY2FsbGFibGUuc3BsYXQubmFtZSwgYXJnX2xpc3QpCisgICAgICBlbmQKKworICAgICAgeWllbGQgZW52CisgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgIGVuc3VyZQorICAgICAgIyBJZiB0aGVyZSdzIGEga2V5d29yZCBleGNlcHRpb24sIHdlIGRvbid0IHdhbnQgdG8gdGhyb3cgaXQgaW1tZWRpYXRlbHksCisgICAgICAjIGJlY2F1c2UgdGhlIGludmFsaWQga2V5d29yZHMgbWF5IGJlIHBhcnQgb2YgYSBnbG9iIGFyZ3VtZW50IHRoYXQgc2hvdWxkIGJlCisgICAgICAjIHBhc3NlZCBvbiB0byBhbm90aGVyIGZ1bmN0aW9uLiBTbyB3ZSBvbmx5IHJhaXNlIGl0IGlmIHdlIHJlYWNoIHRoZSBlbmQgb2YKKyAgICAgICMgdGhpcyBmdW5jdGlvbiAqYW5kKiB0aGUga2V5d29yZHMgYXR0YWNoZWQgdG8gdGhlIGFyZ3VtZW50IGxpc3QgZ2xvYiBvYmplY3QKKyAgICAgICMgaGF2ZW4ndCBiZWVuIGFjY2Vzc2VkLgorICAgICAgIworICAgICAgIyBUaGUga2V5d29yZCBleGNlcHRpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGFueSBTYXNzIGVycm9ycywgYnV0IG5vdCBvdmVyCisgICAgICAjIG5vbi1TYXNzIGV4Y2VwdGlvbnMuCisgICAgICBpZiBrZXl3b3JkX2V4Y2VwdGlvbiAmJgorICAgICAgICAgICEoYXJnX2xpc3QgJiYgYXJnX2xpc3Qua2V5d29yZHNfYWNjZXNzZWQpICYmCisgICAgICAgICAgKGUubmlsPyB8fCBlLmlzX2E/KFNhc3M6OlN5bnRheEVycm9yKSkKKyAgICAgICAgcmFpc2Uga2V5d29yZF9leGNlcHRpb24KKyAgICAgIGVsc2lmIGUKKyAgICAgICAgcmFpc2UgZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIEBhcGkgcHJpdmF0ZQorICAgICMgQHJldHVybiBbU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QXJnTGlzdF0KKyAgICBkZWYgcGVyZm9ybV9zcGxhdChzcGxhdCwgcGVyZm9ybWVkX2tleXdvcmRzLCBrd2FyZ19zcGxhdCwgZW52aXJvbm1lbnQpCisgICAgICBhcmdzLCBrd2FyZ3MsIHNlcGFyYXRvciA9IFtdLCBuaWwsIDpjb21tYQorCisgICAgICBpZiBzcGxhdAorICAgICAgICBzcGxhdCA9IHNwbGF0LnBlcmZvcm0oZW52aXJvbm1lbnQpCisgICAgICAgIHNlcGFyYXRvciA9IHNwbGF0LnNlcGFyYXRvciB8fCBzZXBhcmF0b3IKKyAgICAgICAgaWYgc3BsYXQuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QXJnTGlzdCkKKyAgICAgICAgICBhcmdzID0gc3BsYXQudG9fYQorICAgICAgICAgIGt3YXJncyA9IHNwbGF0LmtleXdvcmRzCisgICAgICAgIGVsc2lmIHNwbGF0LmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok1hcCkKKyAgICAgICAgICBrd2FyZ3MgPSBhcmdfaGFzaChzcGxhdCkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFyZ3MgPSBzcGxhdC50b19hCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBrd2FyZ3MgfHw9IFNhc3M6OlV0aWw6Ok5vcm1hbGl6ZWRNYXAubmV3CisgICAgICBrd2FyZ3MudXBkYXRlKHBlcmZvcm1lZF9rZXl3b3JkcykKKworICAgICAgaWYga3dhcmdfc3BsYXQKKyAgICAgICAga3dhcmdfc3BsYXQgPSBrd2FyZ19zcGxhdC5wZXJmb3JtKGVudmlyb25tZW50KQorICAgICAgICB1bmxlc3Mga3dhcmdfc3BsYXQuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TWFwKQorICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiVmFyaWFibGUga2V5d29yZCBhcmd1bWVudHMgbXVzdCBiZSBhIG1hcCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIih3YXMgI3trd2FyZ19zcGxhdC5pbnNwZWN0fSkuIikKKyAgICAgICAgZW5kCisgICAgICAgIGt3YXJncy51cGRhdGUoYXJnX2hhc2goa3dhcmdfc3BsYXQpKQorICAgICAgZW5kCisKKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkFyZ0xpc3QubmV3KGFyZ3MsIGt3YXJncywgc2VwYXJhdG9yKQorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIGFyZ19oYXNoKG1hcCkKKyAgICAgIFNhc3M6OlV0aWwubWFwX2tleXMobWFwLnRvX2gpIGRvIHxrZXl8CisgICAgICAgIG5leHQga2V5LnZhbHVlIGlmIGtleS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpCisgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiVmFyaWFibGUga2V5d29yZCBhcmd1bWVudCBtYXAgbXVzdCBoYXZlIHN0cmluZyBrZXlzLlxuIiArCisgICAgICAgICAgIiN7a2V5Lmluc3BlY3R9IGlzIG5vdCBhIHN0cmluZyBpbiAje21hcC5pbnNwZWN0fS4iKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorICAjIEBjb21tZW50CisgICMgICBydWJvY29wOmVuYWJsZSBNZXRob2RMZW5ndGgKKworICBwcm90ZWN0ZWQKKworICBkZWYgaW5pdGlhbGl6ZShlbnYpCisgICAgQGVudmlyb25tZW50ID0gZW52CisgICAgQGluX2tleWZyYW1lcyA9IGZhbHNlCisgICAgQGF0X3Jvb3Rfd2l0aG91dF9ydWxlID0gZmFsc2UKKyAgZW5kCisKKyAgIyBJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkLCB0aGlzIGFkZHMgcHJvcGVyIG1ldGFkYXRhIHRvIHRoZSBiYWNrdHJhY2UuCisgIGRlZiB2aXNpdChub2RlKQorICAgIHJldHVybiBzdXBlcihub2RlLmR1cCkgdW5sZXNzIEBlbnZpcm9ubWVudAorICAgIEBlbnZpcm9ubWVudC5zdGFjay53aXRoX2Jhc2Uobm9kZS5maWxlbmFtZSwgbm9kZS5saW5lKSB7c3VwZXIobm9kZS5kdXApfQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGUubW9kaWZ5X2JhY2t0cmFjZSg6ZmlsZW5hbWUgPT4gbm9kZS5maWxlbmFtZSwgOmxpbmUgPT4gbm9kZS5saW5lKQorICAgIHJhaXNlIGUKKyAgZW5kCisKKyAgIyBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4KKyAgZGVmIHZpc2l0X2NoaWxkcmVuKHBhcmVudCkKKyAgICB3aXRoX2Vudmlyb25tZW50IFNhc3M6OkVudmlyb25tZW50Lm5ldyhAZW52aXJvbm1lbnQsIHBhcmVudC5vcHRpb25zKSBkbworICAgICAgcGFyZW50LmNoaWxkcmVuID0gc3VwZXIuZmxhdHRlbgorICAgICAgcGFyZW50CisgICAgZW5kCisgIGVuZAorCisgICMgUnVucyBhIGJsb2NrIG9mIGNvZGUgd2l0aCB0aGUgY3VycmVudCBlbnZpcm9ubWVudCByZXBsYWNlZCB3aXRoIHRoZSBnaXZlbiBvbmUuCisgICMKKyAgIyBAcGFyYW0gZW52IFtTYXNzOjpFbnZpcm9ubWVudF0gVGhlIG5ldyBlbnZpcm9ubWVudCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBibG9jay4KKyAgIyBAeWllbGQgQSBibG9jayBpbiB3aGljaCB0aGUgZW52aXJvbm1lbnQgaXMgc2V0IHRvIGBlbnZgLgorICAjIEByZXR1cm4gW09iamVjdF0gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYmxvY2suCisgIGRlZiB3aXRoX2Vudmlyb25tZW50KGVudikKKyAgICBvbGRfZW52LCBAZW52aXJvbm1lbnQgPSBAZW52aXJvbm1lbnQsIGVudgorICAgIHlpZWxkCisgIGVuc3VyZQorICAgIEBlbnZpcm9ubWVudCA9IG9sZF9lbnYKKyAgZW5kCisKKyAgIyBTZXRzIHRoZSBvcHRpb25zIG9uIHRoZSBlbnZpcm9ubWVudCBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgcm9vdC4KKyAgZGVmIHZpc2l0X3Jvb3Qobm9kZSkKKyAgICB5aWVsZAorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGUuc2Fzc190ZW1wbGF0ZSB8fD0gbm9kZS50ZW1wbGF0ZQorICAgIHJhaXNlIGUKKyAgZW5kCisKKyAgIyBSZW1vdmVzIHRoaXMgbm9kZSBmcm9tIHRoZSB0cmVlIGlmIGl0J3MgYSBzaWxlbnQgY29tbWVudC4KKyAgZGVmIHZpc2l0X2NvbW1lbnQobm9kZSkKKyAgICByZXR1cm4gW10gaWYgbm9kZS5pbnZpc2libGU/CisgICAgbm9kZS5yZXNvbHZlZF92YWx1ZSA9IHJ1bl9pbnRlcnBfbm9fc3RyaXAobm9kZS52YWx1ZSkKKyAgICBub2RlLnJlc29sdmVkX3ZhbHVlLmdzdWIhKC9cXChbXFwjXSkvLCAnXDEnKQorICAgIG5vZGUKKyAgZW5kCisKKyAgIyBQcmludHMgdGhlIGV4cHJlc3Npb24gdG8gU1RERVJSLgorICBkZWYgdmlzaXRfZGVidWcobm9kZSkKKyAgICByZXMgPSBub2RlLmV4cHIucGVyZm9ybShAZW52aXJvbm1lbnQpCisgICAgaWYgcmVzLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZykKKyAgICAgIHJlcyA9IHJlcy52YWx1ZQorICAgIGVsc2UKKyAgICAgIHJlcyA9IHJlcy50b19zYXNzCisgICAgZW5kCisgICAgaWYgbm9kZS5maWxlbmFtZQorICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gIiN7bm9kZS5maWxlbmFtZX06I3tub2RlLmxpbmV9IERFQlVHOiAje3Jlc30iCisgICAgZWxzZQorICAgICAgU2Fzczo6VXRpbC5zYXNzX3dhcm4gIkxpbmUgI3tub2RlLmxpbmV9IERFQlVHOiAje3Jlc30iCisgICAgZW5kCisgICAgW10KKyAgZW5kCisKKyAgIyBUaHJvd3MgdGhlIGV4cHJlc3Npb24gYXMgYW4gZXJyb3IuCisgIGRlZiB2aXNpdF9lcnJvcihub2RlKQorICAgIHJlcyA9IG5vZGUuZXhwci5wZXJmb3JtKEBlbnZpcm9ubWVudCkKKyAgICBpZiByZXMuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nKQorICAgICAgcmVzID0gcmVzLnZhbHVlCisgICAgZWxzZQorICAgICAgcmVzID0gcmVzLnRvX3Nhc3MKKyAgICBlbmQKKyAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcocmVzKQorICBlbmQKKworICAjIFJ1bnMgdGhlIGNoaWxkIG5vZGVzIG9uY2UgZm9yIGVhY2ggdmFsdWUgaW4gdGhlIGxpc3QuCisgIGRlZiB2aXNpdF9lYWNoKG5vZGUpCisgICAgbGlzdCA9IG5vZGUubGlzdC5wZXJmb3JtKEBlbnZpcm9ubWVudCkKKworICAgIHdpdGhfZW52aXJvbm1lbnQgU2Fzczo6U2VtaUdsb2JhbEVudmlyb25tZW50Lm5ldyhAZW52aXJvbm1lbnQpIGRvCisgICAgICBsaXN0LnRvX2EubWFwIGRvIHx2YWx1ZXwKKyAgICAgICAgaWYgbm9kZS52YXJzLmxlbmd0aCA9PSAxCisgICAgICAgICAgQGVudmlyb25tZW50LnNldF9sb2NhbF92YXIobm9kZS52YXJzLmZpcnN0LCB2YWx1ZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5vZGUudmFycy56aXAodmFsdWUudG9fYSkgZG8gfCh2YXIsIHN1Yl92YWx1ZSl8CisgICAgICAgICAgICBAZW52aXJvbm1lbnQuc2V0X2xvY2FsX3Zhcih2YXIsIHN1Yl92YWx1ZSB8fCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdWxsLm5ldykKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIG5vZGUuY2hpbGRyZW4ubWFwIHt8Y3wgdmlzaXQoYyl9CisgICAgICBlbmQuZmxhdHRlbgorICAgIGVuZAorICBlbmQKKworICAjIFJ1bnMgU2Fzc1NjcmlwdCBpbnRlcnBvbGF0aW9uIGluIHRoZSBzZWxlY3RvciwKKyAgIyBhbmQgdGhlbiBwYXJzZXMgdGhlIHJlc3VsdCBpbnRvIGEge1Nhc3M6OlNlbGVjdG9yOjpDb21tYVNlcXVlbmNlfS4KKyAgZGVmIHZpc2l0X2V4dGVuZChub2RlKQorICAgIHBhcnNlciA9IFNhc3M6OlNDU1M6OlN0YXRpY1BhcnNlci5uZXcocnVuX2ludGVycChub2RlLnNlbGVjdG9yKSwKKyAgICAgIG5vZGUuZmlsZW5hbWUsIG5vZGUub3B0aW9uc1s6aW1wb3J0ZXJdLCBub2RlLmxpbmUpCisgICAgbm9kZS5yZXNvbHZlZF9zZWxlY3RvciA9IHBhcnNlci5wYXJzZV9zZWxlY3RvcgorICAgIG5vZGUKKyAgZW5kCisKKyAgIyBSdW5zIHRoZSBjaGlsZCBub2RlcyBvbmNlIGZvciBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgdmFyeWluZyB0aGUgdmFyaWFibGUgZWFjaCB0aW1lLgorICBkZWYgdmlzaXRfZm9yKG5vZGUpCisgICAgZnJvbSA9IG5vZGUuZnJvbS5wZXJmb3JtKEBlbnZpcm9ubWVudCkKKyAgICB0byA9IG5vZGUudG8ucGVyZm9ybShAZW52aXJvbm1lbnQpCisgICAgZnJvbS5hc3NlcnRfaW50IQorICAgIHRvLmFzc2VydF9pbnQhCisKKyAgICB0byA9IHRvLmNvZXJjZShmcm9tLm51bWVyYXRvcl91bml0cywgZnJvbS5kZW5vbWluYXRvcl91bml0cykKKyAgICBkaXJlY3Rpb24gPSBmcm9tLnRvX2kgPiB0by50b19pID8gLTEgOiAxCisgICAgcmFuZ2UgPSBSYW5nZS5uZXcoZGlyZWN0aW9uICogZnJvbS50b19pLCBkaXJlY3Rpb24gKiB0by50b19pLCBub2RlLmV4Y2x1c2l2ZSkKKworICAgIHdpdGhfZW52aXJvbm1lbnQgU2Fzczo6U2VtaUdsb2JhbEVudmlyb25tZW50Lm5ldyhAZW52aXJvbm1lbnQpIGRvCisgICAgICByYW5nZS5tYXAgZG8gfGl8CisgICAgICAgIEBlbnZpcm9ubWVudC5zZXRfbG9jYWxfdmFyKG5vZGUudmFyLAorICAgICAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5uZXcoZGlyZWN0aW9uICogaSwKKyAgICAgICAgICAgIGZyb20ubnVtZXJhdG9yX3VuaXRzLCBmcm9tLmRlbm9taW5hdG9yX3VuaXRzKSkKKyAgICAgICAgbm9kZS5jaGlsZHJlbi5tYXAge3xjfCB2aXNpdChjKX0KKyAgICAgIGVuZC5mbGF0dGVuCisgICAgZW5kCisgIGVuZAorCisgICMgTG9hZHMgdGhlIGZ1bmN0aW9uIGludG8gdGhlIGVudmlyb25tZW50LgorICBkZWYgdmlzaXRfZnVuY3Rpb24obm9kZSkKKyAgICBlbnYgPSBTYXNzOjpFbnZpcm9ubWVudC5uZXcoQGVudmlyb25tZW50LCBub2RlLm9wdGlvbnMpCisKKyAgICBpZiBub2RlLm5vcm1hbGl6ZWRfbmFtZSA9PSAnY2FsYycgfHwgbm9kZS5ub3JtYWxpemVkX25hbWUgPT0gJ2VsZW1lbnQnIHx8CisgICAgICAgIG5vZGUubmFtZSA9PSAnZXhwcmVzc2lvbicgfHwgbm9kZS5uYW1lID09ICd1cmwnCisgICAgICBAQGZ1bmN0aW9uX25hbWVfZGVwcmVjYXRpb24ud2Fybihub2RlLmZpbGVuYW1lLCBub2RlLmxpbmUsIDw8V0FSTklORykKK05hbWluZyBhIGZ1bmN0aW9uICIje25vZGUubmFtZX0iIGlzIGRpc2FsbG93ZWQgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuCitUaGlzIG5hbWUgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgQ1NTIGZ1bmN0aW9uIHdpdGggc3BlY2lhbCBwYXJzZSBydWxlcy4KK1dBUk5JTkcKKyAgICBlbmQKKworICAgIEBlbnZpcm9ubWVudC5zZXRfbG9jYWxfZnVuY3Rpb24obm9kZS5uYW1lLAorICAgICAgU2Fzczo6Q2FsbGFibGUubmV3KG5vZGUubmFtZSwgbm9kZS5hcmdzLCBub2RlLnNwbGF0LCBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiwgZmFsc2UsICJmdW5jdGlvbiIsIDpzdHlsZXNoZWV0KSkKKyAgICBbXQorICBlbmQKKworICAjIFJ1bnMgdGhlIGNoaWxkIG5vZGVzIGlmIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIHRydWU7CisgICMgb3RoZXJ3aXNlLCB0cmllcyB0aGUgZWxzZSBub2Rlcy4KKyAgZGVmIHZpc2l0X2lmKG5vZGUpCisgICAgaWYgbm9kZS5leHByLm5pbD8gfHwgbm9kZS5leHByLnBlcmZvcm0oQGVudmlyb25tZW50KS50b19ib29sCisgICAgICB3aXRoX2Vudmlyb25tZW50IFNhc3M6OlNlbWlHbG9iYWxFbnZpcm9ubWVudC5uZXcoQGVudmlyb25tZW50KSBkbworICAgICAgICBub2RlLmNoaWxkcmVuLm1hcCB7fGN8IHZpc2l0KGMpfQorICAgICAgZW5kLmZsYXR0ZW4KKyAgICBlbHNpZiBub2RlLmVsc2UKKyAgICAgIHZpc2l0KG5vZGUuZWxzZSkKKyAgICBlbHNlCisgICAgICBbXQorICAgIGVuZAorICBlbmQKKworICAjIFJldHVybnMgYSBzdGF0aWMgRGlyZWN0aXZlTm9kZSBpZiB0aGlzIGlzIGltcG9ydGluZyBhIENTUyBmaWxlLAorICAjIG9yIHBhcnNlcyBhbmQgaW5jbHVkZXMgdGhlIGltcG9ydGVkIFNhc3MgZmlsZS4KKyAgZGVmIHZpc2l0X2ltcG9ydChub2RlKQorICAgIGlmIChwYXRoID0gbm9kZS5jc3NfaW1wb3J0PykKKyAgICAgIHJlc29sdmVkX25vZGUgPSBTYXNzOjpUcmVlOjpDc3NJbXBvcnROb2RlLnJlc29sdmVkKCJ1cmwoI3twYXRofSkiKQorICAgICAgcmVzb2x2ZWRfbm9kZS5vcHRpb25zID0gbm9kZS5vcHRpb25zCisgICAgICByZXNvbHZlZF9ub2RlLnNvdXJjZV9yYW5nZSA9IG5vZGUuc291cmNlX3JhbmdlCisgICAgICByZXR1cm4gcmVzb2x2ZWRfbm9kZQorICAgIGVuZAorICAgIGZpbGUgPSBub2RlLmltcG9ydGVkX2ZpbGUKKyAgICBpZiBAZW52aXJvbm1lbnQuc3RhY2suZnJhbWVzLmFueT8ge3xmfCBmLmlzX2ltcG9ydD8gJiYgZi5maWxlbmFtZSA9PSBmaWxlLm9wdGlvbnNbOmZpbGVuYW1lXX0KKyAgICAgIGhhbmRsZV9pbXBvcnRfbG9vcCEobm9kZSkKKyAgICBlbmQKKworICAgIGJlZ2luCisgICAgICBAZW52aXJvbm1lbnQuc3RhY2sud2l0aF9pbXBvcnQobm9kZS5maWxlbmFtZSwgbm9kZS5saW5lKSBkbworICAgICAgICByb290ID0gZmlsZS50b190cmVlCisgICAgICAgIFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpDaGVja05lc3RpbmcudmlzaXQocm9vdCkKKyAgICAgICAgbm9kZS5jaGlsZHJlbiA9IHJvb3QuY2hpbGRyZW4ubWFwIHt8Y3wgdmlzaXQoYyl9LmZsYXR0ZW4KKyAgICAgICAgbm9kZQorICAgICAgZW5kCisgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICAgIGUubW9kaWZ5X2JhY2t0cmFjZSg6ZmlsZW5hbWUgPT4gbm9kZS5pbXBvcnRlZF9maWxlLm9wdGlvbnNbOmZpbGVuYW1lXSkKKyAgICAgIGUuYWRkX2JhY2t0cmFjZSg6ZmlsZW5hbWUgPT4gbm9kZS5maWxlbmFtZSwgOmxpbmUgPT4gbm9kZS5saW5lKQorICAgICAgcmFpc2UgZQorICAgIGVuZAorICBlbmQKKworICAjIExvYWRzIGEgbWl4aW4gaW50byB0aGUgZW52aXJvbm1lbnQuCisgIGRlZiB2aXNpdF9taXhpbmRlZihub2RlKQorICAgIGVudiA9IFNhc3M6OkVudmlyb25tZW50Lm5ldyhAZW52aXJvbm1lbnQsIG5vZGUub3B0aW9ucykKKyAgICBAZW52aXJvbm1lbnQuc2V0X2xvY2FsX21peGluKG5vZGUubmFtZSwKKyAgICAgIFNhc3M6OkNhbGxhYmxlLm5ldyhub2RlLm5hbWUsIG5vZGUuYXJncywgbm9kZS5zcGxhdCwgZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4sIG5vZGUuaGFzX2NvbnRlbnQsICJtaXhpbiIsIDpzdHlsZXNoZWV0KSkKKyAgICBbXQorICBlbmQKKworICAjIFJ1bnMgYSBtaXhpbi4KKyAgZGVmIHZpc2l0X21peGluKG5vZGUpCisgICAgQGVudmlyb25tZW50LnN0YWNrLndpdGhfbWl4aW4obm9kZS5maWxlbmFtZSwgbm9kZS5saW5lLCBub2RlLm5hbWUpIGRvCisgICAgICBtaXhpbiA9IEBlbnZpcm9ubWVudC5taXhpbihub2RlLm5hbWUpCisgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoIlVuZGVmaW5lZCBtaXhpbiAnI3tub2RlLm5hbWV9Jy4iKSB1bmxlc3MgbWl4aW4KKworICAgICAgaWYgbm9kZS5jaGlsZHJlbi5hbnk/ICYmICFtaXhpbi5oYXNfY29udGVudAorICAgICAgICByYWlzZSBTYXNzOjpTeW50YXhFcnJvci5uZXcoJShNaXhpbiAiI3tub2RlLm5hbWV9IiBkb2VzIG5vdCBhY2NlcHQgYSBjb250ZW50IGJsb2NrLikpCisgICAgICBlbmQKKworICAgICAgYXJncyA9IG5vZGUuYXJncy5tYXAge3xhfCBhLnBlcmZvcm0oQGVudmlyb25tZW50KX0KKyAgICAgIGtleXdvcmRzID0gU2Fzczo6VXRpbC5tYXBfdmFscyhub2RlLmtleXdvcmRzKSB7fHZ8IHYucGVyZm9ybShAZW52aXJvbm1lbnQpfQorICAgICAgc3BsYXQgPSBzZWxmLmNsYXNzLnBlcmZvcm1fc3BsYXQobm9kZS5zcGxhdCwga2V5d29yZHMsIG5vZGUua3dhcmdfc3BsYXQsIEBlbnZpcm9ubWVudCkKKworICAgICAgc2VsZi5jbGFzcy5wZXJmb3JtX2FyZ3VtZW50cyhtaXhpbiwgYXJncywgc3BsYXQsIEBlbnZpcm9ubWVudCkgZG8gfGVudnwKKyAgICAgICAgZW52LmNhbGxlciA9IFNhc3M6OkVudmlyb25tZW50Lm5ldyhAZW52aXJvbm1lbnQpCisgICAgICAgIGVudi5jb250ZW50ID0gW25vZGUuY2hpbGRyZW4sIEBlbnZpcm9ubWVudF0gaWYgbm9kZS5oYXNfY2hpbGRyZW4KKworICAgICAgICB0cmFjZV9ub2RlID0gU2Fzczo6VHJlZTo6VHJhY2VOb2RlLmZyb21fbm9kZShub2RlLm5hbWUsIG5vZGUpCisgICAgICAgIHdpdGhfZW52aXJvbm1lbnQoZW52KSB7dHJhY2Vfbm9kZS5jaGlsZHJlbiA9IG1peGluLnRyZWUubWFwIHt8Y3wgdmlzaXQoYyl9LmZsYXR0ZW59CisgICAgICAgIHRyYWNlX25vZGUKKyAgICAgIGVuZAorICAgIGVuZAorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGUubW9kaWZ5X2JhY2t0cmFjZSg6bWl4aW4gPT4gbm9kZS5uYW1lLCA6bGluZSA9PiBub2RlLmxpbmUpCisgICAgZS5hZGRfYmFja3RyYWNlKDpsaW5lID0+IG5vZGUubGluZSkKKyAgICByYWlzZSBlCisgIGVuZAorCisgIGRlZiB2aXNpdF9jb250ZW50KG5vZGUpCisgICAgY29udGVudCwgY29udGVudF9lbnYgPSBAZW52aXJvbm1lbnQuY29udGVudAorICAgIHJldHVybiBbXSB1bmxlc3MgY29udGVudAorICAgIEBlbnZpcm9ubWVudC5zdGFjay53aXRoX21peGluKG5vZGUuZmlsZW5hbWUsIG5vZGUubGluZSwgJ0Bjb250ZW50JykgZG8KKyAgICAgIHRyYWNlX25vZGUgPSBTYXNzOjpUcmVlOjpUcmFjZU5vZGUuZnJvbV9ub2RlKCdAY29udGVudCcsIG5vZGUpCisgICAgICBjb250ZW50X2VudiA9IFNhc3M6OkVudmlyb25tZW50Lm5ldyhjb250ZW50X2VudikKKyAgICAgIGNvbnRlbnRfZW52LmNhbGxlciA9IFNhc3M6OkVudmlyb25tZW50Lm5ldyhAZW52aXJvbm1lbnQpCisgICAgICB3aXRoX2Vudmlyb25tZW50KGNvbnRlbnRfZW52KSBkbworICAgICAgICB0cmFjZV9ub2RlLmNoaWxkcmVuID0gY29udGVudC5tYXAge3xjfCB2aXNpdChjLmR1cCl9LmZsYXR0ZW4KKyAgICAgIGVuZAorICAgICAgdHJhY2Vfbm9kZQorICAgIGVuZAorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGUubW9kaWZ5X2JhY2t0cmFjZSg6bWl4aW4gPT4gJ0Bjb250ZW50JywgOmxpbmUgPT4gbm9kZS5saW5lKQorICAgIGUuYWRkX2JhY2t0cmFjZSg6bGluZSA9PiBub2RlLmxpbmUpCisgICAgcmFpc2UgZQorICBlbmQKKworICAjIFJ1bnMgYW55IFNhc3NTY3JpcHQgdGhhdCBtYXkgYmUgZW1iZWRkZWQgaW4gYSBwcm9wZXJ0eS4KKyAgZGVmIHZpc2l0X3Byb3Aobm9kZSkKKyAgICBub2RlLnJlc29sdmVkX25hbWUgPSBydW5faW50ZXJwKG5vZGUubmFtZSkKKworICAgICMgSWYgdGhlIG5vZGUncyB2YWx1ZSBpcyBqdXN0IGEgdmFyaWFibGUgb3Igc2ltaWxhciwgd2UgbWF5IGdldCBhIHVzZWZ1bAorICAgICMgc291cmNlIHJhbmdlIGZyb20gZXZhbHVhdGluZyBpdC4KKyAgICBpZiBub2RlLnZhbHVlLmxlbmd0aCA9PSAxICYmIG5vZGUudmFsdWUuZmlyc3QuaXNfYT8oU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlKQorICAgICAgcmVzdWx0ID0gbm9kZS52YWx1ZS5maXJzdC5wZXJmb3JtKEBlbnZpcm9ubWVudCkKKyAgICAgIG5vZGUucmVzb2x2ZWRfdmFsdWUgPSByZXN1bHQudG9fcworICAgICAgbm9kZS52YWx1ZV9zb3VyY2VfcmFuZ2UgPSByZXN1bHQuc291cmNlX3JhbmdlIGlmIHJlc3VsdC5zb3VyY2VfcmFuZ2UKKyAgICBlbHNpZiBub2RlLmN1c3RvbV9wcm9wZXJ0eT8KKyAgICAgIG5vZGUucmVzb2x2ZWRfdmFsdWUgPSBydW5faW50ZXJwX25vX3N0cmlwKG5vZGUudmFsdWUpCisgICAgZWxzZQorICAgICAgbm9kZS5yZXNvbHZlZF92YWx1ZSA9IHJ1bl9pbnRlcnAobm9kZS52YWx1ZSkKKyAgICBlbmQKKworICAgIHlpZWxkCisgIGVuZAorCisgICMgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uCisgIGRlZiB2aXNpdF9yZXR1cm4obm9kZSkKKyAgICB0aHJvdyA6X3Nhc3NfcmV0dXJuLCBub2RlLmV4cHIucGVyZm9ybShAZW52aXJvbm1lbnQpCisgIGVuZAorCisgICMgUnVucyBTYXNzU2NyaXB0IGludGVycG9sYXRpb24gaW4gdGhlIHNlbGVjdG9yLAorICAjIGFuZCB0aGVuIHBhcnNlcyB0aGUgcmVzdWx0IGludG8gYSB7U2Fzczo6U2VsZWN0b3I6OkNvbW1hU2VxdWVuY2V9LgorICBkZWYgdmlzaXRfcnVsZShub2RlKQorICAgIG9sZF9hdF9yb290X3dpdGhvdXRfcnVsZSA9IEBhdF9yb290X3dpdGhvdXRfcnVsZQorICAgIHBhcnNlciA9IFNhc3M6OlNDU1M6OlN0YXRpY1BhcnNlci5uZXcocnVuX2ludGVycChub2RlLnJ1bGUpLAorICAgICAgbm9kZS5maWxlbmFtZSwgbm9kZS5vcHRpb25zWzppbXBvcnRlcl0sIG5vZGUubGluZSkKKyAgICBpZiBAaW5fa2V5ZnJhbWVzCisgICAgICBrZXlmcmFtZV9ydWxlX25vZGUgPSBTYXNzOjpUcmVlOjpLZXlmcmFtZVJ1bGVOb2RlLm5ldyhwYXJzZXIucGFyc2Vfa2V5ZnJhbWVzX3NlbGVjdG9yKQorICAgICAga2V5ZnJhbWVfcnVsZV9ub2RlLm9wdGlvbnMgPSBub2RlLm9wdGlvbnMKKyAgICAgIGtleWZyYW1lX3J1bGVfbm9kZS5saW5lID0gbm9kZS5saW5lCisgICAgICBrZXlmcmFtZV9ydWxlX25vZGUuZmlsZW5hbWUgPSBub2RlLmZpbGVuYW1lCisgICAgICBrZXlmcmFtZV9ydWxlX25vZGUuc291cmNlX3JhbmdlID0gbm9kZS5zb3VyY2VfcmFuZ2UKKyAgICAgIGtleWZyYW1lX3J1bGVfbm9kZS5oYXNfY2hpbGRyZW4gPSBub2RlLmhhc19jaGlsZHJlbgorICAgICAgd2l0aF9lbnZpcm9ubWVudCBTYXNzOjpFbnZpcm9ubWVudC5uZXcoQGVudmlyb25tZW50LCBub2RlLm9wdGlvbnMpIGRvCisgICAgICAgIGtleWZyYW1lX3J1bGVfbm9kZS5jaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4ubWFwIHt8Y3wgdmlzaXQoYyl9LmZsYXR0ZW4KKyAgICAgIGVuZAorICAgICAga2V5ZnJhbWVfcnVsZV9ub2RlCisgICAgZWxzZQorICAgICAgQGF0X3Jvb3Rfd2l0aG91dF9ydWxlID0gZmFsc2UKKyAgICAgIG5vZGUucGFyc2VkX3J1bGVzIHx8PSBwYXJzZXIucGFyc2Vfc2VsZWN0b3IKKyAgICAgIG5vZGUucmVzb2x2ZWRfcnVsZXMgPSBub2RlLnBhcnNlZF9ydWxlcy5yZXNvbHZlX3BhcmVudF9yZWZzKAorICAgICAgICBAZW52aXJvbm1lbnQuc2VsZWN0b3IsICFvbGRfYXRfcm9vdF93aXRob3V0X3J1bGUpCisgICAgICBub2RlLnN0YWNrX3RyYWNlID0gQGVudmlyb25tZW50LnN0YWNrLnRvX3MgaWYgbm9kZS5vcHRpb25zWzp0cmFjZV9zZWxlY3RvcnNdCisgICAgICB3aXRoX2Vudmlyb25tZW50IFNhc3M6OkVudmlyb25tZW50Lm5ldyhAZW52aXJvbm1lbnQsIG5vZGUub3B0aW9ucykgZG8KKyAgICAgICAgQGVudmlyb25tZW50LnNlbGVjdG9yID0gbm9kZS5yZXNvbHZlZF9ydWxlcworICAgICAgICBub2RlLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi5tYXAge3xjfCB2aXNpdChjKX0uZmxhdHRlbgorICAgICAgZW5kCisgICAgICBub2RlCisgICAgZW5kCisgIGVuc3VyZQorICAgIEBhdF9yb290X3dpdGhvdXRfcnVsZSA9IG9sZF9hdF9yb290X3dpdGhvdXRfcnVsZQorICBlbmQKKworICAjIFNldHMgYSB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBmaXJzdCBsZXZlbCBvZiBydWxlIG5vZGVzCisgICMgc2hvdWxkbid0IGluY2x1ZGUgdGhlIHBhcmVudCBzZWxlY3RvciBieSBkZWZhdWx0LgorICBkZWYgdmlzaXRfYXRyb290KG5vZGUpCisgICAgaWYgbm9kZS5xdWVyeQorICAgICAgcGFyc2VyID0gU2Fzczo6U0NTUzo6U3RhdGljUGFyc2VyLm5ldyhydW5faW50ZXJwKG5vZGUucXVlcnkpLAorICAgICAgICBub2RlLmZpbGVuYW1lLCBub2RlLm9wdGlvbnNbOmltcG9ydGVyXSwgbm9kZS5saW5lKQorICAgICAgbm9kZS5yZXNvbHZlZF90eXBlLCBub2RlLnJlc29sdmVkX3ZhbHVlID0gcGFyc2VyLnBhcnNlX3N0YXRpY19hdF9yb290X3F1ZXJ5CisgICAgZWxzZQorICAgICAgbm9kZS5yZXNvbHZlZF90eXBlLCBub2RlLnJlc29sdmVkX3ZhbHVlID0gOndpdGhvdXQsIFsncnVsZSddCisgICAgZW5kCisKKyAgICBvbGRfYXRfcm9vdF93aXRob3V0X3J1bGUgPSBAYXRfcm9vdF93aXRob3V0X3J1bGUKKyAgICBvbGRfaW5fa2V5ZnJhbWVzID0gQGluX2tleWZyYW1lcworICAgIEBhdF9yb290X3dpdGhvdXRfcnVsZSA9IHRydWUgaWYgbm9kZS5leGNsdWRlPygncnVsZScpCisgICAgQGluX2tleWZyYW1lcyA9IGZhbHNlIGlmIG5vZGUuZXhjbHVkZT8oJ2tleWZyYW1lcycpCisgICAgeWllbGQKKyAgZW5zdXJlCisgICAgQGluX2tleWZyYW1lcyA9IG9sZF9pbl9rZXlmcmFtZXMKKyAgICBAYXRfcm9vdF93aXRob3V0X3J1bGUgPSBvbGRfYXRfcm9vdF93aXRob3V0X3J1bGUKKyAgZW5kCisKKyAgIyBMb2FkcyB0aGUgbmV3IHZhcmlhYmxlIHZhbHVlIGludG8gdGhlIGVudmlyb25tZW50LgorICBkZWYgdmlzaXRfdmFyaWFibGUobm9kZSkKKyAgICBlbnYgPSBAZW52aXJvbm1lbnQKKyAgICBlbnYgPSBlbnYuZ2xvYmFsX2VudiBpZiBub2RlLmdsb2JhbAorICAgIGlmIG5vZGUuZ3VhcmRlZAorICAgICAgdmFyID0gZW52LnZhcihub2RlLm5hbWUpCisgICAgICByZXR1cm4gW10gaWYgdmFyICYmICF2YXIubnVsbD8KKyAgICBlbmQKKworICAgIHZhbCA9IG5vZGUuZXhwci5wZXJmb3JtKEBlbnZpcm9ubWVudCkKKyAgICBpZiBub2RlLmV4cHIuc291cmNlX3JhbmdlCisgICAgICB2YWwuc291cmNlX3JhbmdlID0gbm9kZS5leHByLnNvdXJjZV9yYW5nZQorICAgIGVsc2UKKyAgICAgIHZhbC5zb3VyY2VfcmFuZ2UgPSBub2RlLnNvdXJjZV9yYW5nZQorICAgIGVuZAorICAgIGVudi5zZXRfdmFyKG5vZGUubmFtZSwgdmFsKQorICAgIFtdCisgIGVuZAorCisgICMgUHJpbnRzIHRoZSBleHByZXNzaW9uIHRvIFNUREVSUiB3aXRoIGEgc3R5bGVzaGVldCB0cmFjZS4KKyAgZGVmIHZpc2l0X3dhcm4obm9kZSkKKyAgICByZXMgPSBub2RlLmV4cHIucGVyZm9ybShAZW52aXJvbm1lbnQpCisgICAgcmVzID0gcmVzLnZhbHVlIGlmIHJlcy5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcpCisgICAgQGVudmlyb25tZW50LnN0YWNrLndpdGhfZGlyZWN0aXZlKG5vZGUuZmlsZW5hbWUsIG5vZGUubGluZSwgIkB3YXJuIikgZG8KKyAgICAgIG1zZyA9ICJXQVJOSU5HOiAje3Jlc31cbiAgICAgICAgICIKKyAgICAgIG1zZyA8PCBAZW52aXJvbm1lbnQuc3RhY2sudG9fcy5nc3ViKCJcbiIsICJcbiAgICAgICAgICIpIDw8ICJcbiIKKyAgICAgIFNhc3M6OlV0aWwuc2Fzc193YXJuIG1zZworICAgIGVuZAorICAgIFtdCisgIGVuZAorCisgICMgUnVucyB0aGUgY2hpbGQgbm9kZXMgdW50aWwgdGhlIGNvbnRpbnVhdGlvbiBleHByZXNzaW9uIGJlY29tZXMgZmFsc2UuCisgIGRlZiB2aXNpdF93aGlsZShub2RlKQorICAgIGNoaWxkcmVuID0gW10KKyAgICB3aXRoX2Vudmlyb25tZW50IFNhc3M6OlNlbWlHbG9iYWxFbnZpcm9ubWVudC5uZXcoQGVudmlyb25tZW50KSBkbworICAgICAgY2hpbGRyZW4gKz0gbm9kZS5jaGlsZHJlbi5tYXAge3xjfCB2aXNpdChjKX0gd2hpbGUgbm9kZS5leHByLnBlcmZvcm0oQGVudmlyb25tZW50KS50b19ib29sCisgICAgZW5kCisgICAgY2hpbGRyZW4uZmxhdHRlbgorICBlbmQKKworICBkZWYgdmlzaXRfZGlyZWN0aXZlKG5vZGUpCisgICAgbm9kZS5yZXNvbHZlZF92YWx1ZSA9IHJ1bl9pbnRlcnAobm9kZS52YWx1ZSkKKyAgICBvbGRfaW5fa2V5ZnJhbWVzLCBAaW5fa2V5ZnJhbWVzID0gQGluX2tleWZyYW1lcywgbm9kZS5ub3JtYWxpemVkX25hbWUgPT0gIkBrZXlmcmFtZXMiCisgICAgd2l0aF9lbnZpcm9ubWVudCBTYXNzOjpFbnZpcm9ubWVudC5uZXcoQGVudmlyb25tZW50KSBkbworICAgICAgbm9kZS5jaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4ubWFwIHt8Y3wgdmlzaXQoYyl9LmZsYXR0ZW4KKyAgICAgIG5vZGUKKyAgICBlbmQKKyAgZW5zdXJlCisgICAgQGluX2tleWZyYW1lcyA9IG9sZF9pbl9rZXlmcmFtZXMKKyAgZW5kCisKKyAgZGVmIHZpc2l0X21lZGlhKG5vZGUpCisgICAgcGFyc2VyID0gU2Fzczo6U0NTUzo6U3RhdGljUGFyc2VyLm5ldyhydW5faW50ZXJwKG5vZGUucXVlcnkpLAorICAgICAgbm9kZS5maWxlbmFtZSwgbm9kZS5vcHRpb25zWzppbXBvcnRlcl0sIG5vZGUubGluZSkKKyAgICBub2RlLnJlc29sdmVkX3F1ZXJ5IHx8PSBwYXJzZXIucGFyc2VfbWVkaWFfcXVlcnlfbGlzdAorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9zdXBwb3J0cyhub2RlKQorICAgIG5vZGUuY29uZGl0aW9uID0gbm9kZS5jb25kaXRpb24uZGVlcF9jb3B5CisgICAgbm9kZS5jb25kaXRpb24ucGVyZm9ybShAZW52aXJvbm1lbnQpCisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2Nzc2ltcG9ydChub2RlKQorICAgIG5vZGUucmVzb2x2ZWRfdXJpID0gcnVuX2ludGVycChbbm9kZS51cmldKQorICAgIGlmIG5vZGUucXVlcnkgJiYgIW5vZGUucXVlcnkuZW1wdHk/CisgICAgICBwYXJzZXIgPSBTYXNzOjpTQ1NTOjpTdGF0aWNQYXJzZXIubmV3KHJ1bl9pbnRlcnAobm9kZS5xdWVyeSksCisgICAgICAgIG5vZGUuZmlsZW5hbWUsIG5vZGUub3B0aW9uc1s6aW1wb3J0ZXJdLCBub2RlLmxpbmUpCisgICAgICBub2RlLnJlc29sdmVkX3F1ZXJ5IHx8PSBwYXJzZXIucGFyc2VfbWVkaWFfcXVlcnlfbGlzdAorICAgIGVuZAorICAgIGlmIG5vZGUuc3VwcG9ydHNfY29uZGl0aW9uCisgICAgICBub2RlLnN1cHBvcnRzX2NvbmRpdGlvbi5wZXJmb3JtKEBlbnZpcm9ubWVudCkKKyAgICBlbmQKKyAgICB5aWVsZAorICBlbmQKKworICBwcml2YXRlCisKKyAgZGVmIHJ1bl9pbnRlcnBfbm9fc3RyaXAodGV4dCkKKyAgICB0ZXh0Lm1hcCBkbyB8cnwKKyAgICAgIG5leHQgciBpZiByLmlzX2E/KFN0cmluZykKKyAgICAgIHIucGVyZm9ybShAZW52aXJvbm1lbnQpLnRvX3MoOnF1b3RlID0+IDpub25lKQorICAgIGVuZC5qb2luCisgIGVuZAorCisgIGRlZiBydW5faW50ZXJwKHRleHQpCisgICAgcnVuX2ludGVycF9ub19zdHJpcCh0ZXh0KS5zdHJpcAorICBlbmQKKworICBkZWYgaGFuZGxlX2ltcG9ydF9sb29wIShub2RlKQorICAgIG1zZyA9ICJBbiBAaW1wb3J0IGxvb3AgaGFzIGJlZW4gZm91bmQ6IgorICAgIGZpbGVzID0gQGVudmlyb25tZW50LnN0YWNrLmZyYW1lcy5zZWxlY3Qge3xmfCBmLmlzX2ltcG9ydD99Lm1hcCB7fGZ8IGYuZmlsZW5hbWV9LmNvbXBhY3QKKyAgICBpZiBub2RlLmZpbGVuYW1lID09IG5vZGUuaW1wb3J0ZWRfZmlsZS5vcHRpb25zWzpmaWxlbmFtZV0KKyAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygiI3ttc2d9ICN7bm9kZS5maWxlbmFtZX0gaW1wb3J0cyBpdHNlbGYiKQorICAgIGVuZAorCisgICAgZmlsZXMgPDwgbm9kZS5maWxlbmFtZSA8PCBub2RlLmltcG9ydGVkX2ZpbGUub3B0aW9uc1s6ZmlsZW5hbWVdCisgICAgbXNnIDw8ICJcbiIgPDwgZmlsZXMuZWFjaF9jb25zKDIpLm1hcCBkbyB8bTEsIG0yfAorICAgICAgIiAgICAje20xfSBpbXBvcnRzICN7bTJ9IgorICAgIGVuZC5qb2luKCJcbiIpCisgICAgcmFpc2UgU2Fzczo6U3ludGF4RXJyb3IubmV3KG1zZykKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9zZXRfb3B0aW9ucy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy9zZXRfb3B0aW9ucy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY0YTJiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL3NldF9vcHRpb25zLnJiCkBAIC0wLDAgKzEsMTM5IEBACisjIEEgdmlzaXRvciBmb3Igc2V0dGluZyBvcHRpb25zIG9uIHRoZSBTYXNzIHRyZWUKK2NsYXNzIFNhc3M6OlRyZWU6OlZpc2l0b3JzOjpTZXRPcHRpb25zIDwgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OkJhc2UKKyAgIyBAcGFyYW0gcm9vdCBbVHJlZTo6Tm9kZV0gVGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZSB0byB2aXNpdC4KKyAgIyBAcGFyYW0gb3B0aW9ucyBbe1N5bWJvbCA9PiBPYmplY3R9XSBUaGUgb3B0aW9ucyBoYXMgdG8gc2V0LgorICBkZWYgc2VsZi52aXNpdChyb290LCBvcHRpb25zKTsgbmV3KG9wdGlvbnMpLnNlbmQoOnZpc2l0LCByb290KTsgZW5kCisKKyAgcHJvdGVjdGVkCisKKyAgZGVmIGluaXRpYWxpemUob3B0aW9ucykKKyAgICBAb3B0aW9ucyA9IG9wdGlvbnMKKyAgZW5kCisKKyAgZGVmIHZpc2l0KG5vZGUpCisgICAgbm9kZS5pbnN0YW5jZV92YXJpYWJsZV9zZXQoJ0BvcHRpb25zJywgQG9wdGlvbnMpCisgICAgc3VwZXIKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2NvbW1lbnQobm9kZSkKKyAgICBub2RlLnZhbHVlLmVhY2gge3xjfCBjLm9wdGlvbnMgPSBAb3B0aW9ucyBpZiBjLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSl9CisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2RlYnVnKG5vZGUpCisgICAgbm9kZS5leHByLm9wdGlvbnMgPSBAb3B0aW9ucworICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9lcnJvcihub2RlKQorICAgIG5vZGUuZXhwci5vcHRpb25zID0gQG9wdGlvbnMKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfZWFjaChub2RlKQorICAgIG5vZGUubGlzdC5vcHRpb25zID0gQG9wdGlvbnMKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfZXh0ZW5kKG5vZGUpCisgICAgbm9kZS5zZWxlY3Rvci5lYWNoIHt8Y3wgYy5vcHRpb25zID0gQG9wdGlvbnMgaWYgYy5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUpfQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9mb3Iobm9kZSkKKyAgICBub2RlLmZyb20ub3B0aW9ucyA9IEBvcHRpb25zCisgICAgbm9kZS50by5vcHRpb25zID0gQG9wdGlvbnMKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfZnVuY3Rpb24obm9kZSkKKyAgICBub2RlLmFyZ3MuZWFjaCBkbyB8aywgdnwKKyAgICAgIGsub3B0aW9ucyA9IEBvcHRpb25zCisgICAgICB2Lm9wdGlvbnMgPSBAb3B0aW9ucyBpZiB2CisgICAgZW5kCisgICAgbm9kZS5zcGxhdC5vcHRpb25zID0gQG9wdGlvbnMgaWYgbm9kZS5zcGxhdAorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9pZihub2RlKQorICAgIG5vZGUuZXhwci5vcHRpb25zID0gQG9wdGlvbnMgaWYgbm9kZS5leHByCisgICAgdmlzaXQobm9kZS5lbHNlKSBpZiBub2RlLmVsc2UKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfaW1wb3J0KG5vZGUpCisgICAgIyBXZSBoYXZlIG5vIGdvb2Qgd2F5IG9mIHByb3BhZ2F0aW5nIHRoZSBuZXcgb3B0aW9ucyB0aHJvdWdoIGFuIEVuZ2luZQorICAgICMgaW5zdGFuY2UsIHNvIHdlIGp1c3QgbnVsbCBpdCBvdXQuIFRoaXMgYWxzbyBsZXRzIHVzIGF2b2lkIGNhY2hpbmcgYW4KKyAgICAjIGltcG9ydGVkIEVuZ2luZSBhbG9uZyB3aXRoIHRoZSBpbXBvcnRpbmcgc291cmNlIHRyZWUuCisgICAgbm9kZS5pbXBvcnRlZF9maWxlID0gbmlsCisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X21peGluZGVmKG5vZGUpCisgICAgbm9kZS5hcmdzLmVhY2ggZG8gfGssIHZ8CisgICAgICBrLm9wdGlvbnMgPSBAb3B0aW9ucworICAgICAgdi5vcHRpb25zID0gQG9wdGlvbnMgaWYgdgorICAgIGVuZAorICAgIG5vZGUuc3BsYXQub3B0aW9ucyA9IEBvcHRpb25zIGlmIG5vZGUuc3BsYXQKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfbWl4aW4obm9kZSkKKyAgICBub2RlLmFyZ3MuZWFjaCB7fGF8IGEub3B0aW9ucyA9IEBvcHRpb25zfQorICAgIG5vZGUua2V5d29yZHMuZWFjaCB7fF9rLCB2fCB2Lm9wdGlvbnMgPSBAb3B0aW9uc30KKyAgICBub2RlLnNwbGF0Lm9wdGlvbnMgPSBAb3B0aW9ucyBpZiBub2RlLnNwbGF0CisgICAgbm9kZS5rd2FyZ19zcGxhdC5vcHRpb25zID0gQG9wdGlvbnMgaWYgbm9kZS5rd2FyZ19zcGxhdAorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9wcm9wKG5vZGUpCisgICAgbm9kZS5uYW1lLmVhY2gge3xjfCBjLm9wdGlvbnMgPSBAb3B0aW9ucyBpZiBjLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSl9CisgICAgbm9kZS52YWx1ZS5lYWNoIHt8Y3wgYy5vcHRpb25zID0gQG9wdGlvbnMgaWYgYy5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUpfQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9yZXR1cm4obm9kZSkKKyAgICBub2RlLmV4cHIub3B0aW9ucyA9IEBvcHRpb25zCisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3J1bGUobm9kZSkKKyAgICBub2RlLnJ1bGUuZWFjaCB7fGN8IGMub3B0aW9ucyA9IEBvcHRpb25zIGlmIGMuaXNfYT8oU2Fzczo6U2NyaXB0OjpUcmVlOjpOb2RlKX0KKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfdmFyaWFibGUobm9kZSkKKyAgICBub2RlLmV4cHIub3B0aW9ucyA9IEBvcHRpb25zCisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3dhcm4obm9kZSkKKyAgICBub2RlLmV4cHIub3B0aW9ucyA9IEBvcHRpb25zCisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3doaWxlKG5vZGUpCisgICAgbm9kZS5leHByLm9wdGlvbnMgPSBAb3B0aW9ucworICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9kaXJlY3RpdmUobm9kZSkKKyAgICBub2RlLnZhbHVlLmVhY2gge3xjfCBjLm9wdGlvbnMgPSBAb3B0aW9ucyBpZiBjLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSl9CisgICAgeWllbGQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X21lZGlhKG5vZGUpCisgICAgbm9kZS5xdWVyeS5lYWNoIHt8Y3wgYy5vcHRpb25zID0gQG9wdGlvbnMgaWYgYy5pc19hPyhTYXNzOjpTY3JpcHQ6OlRyZWU6Ok5vZGUpfQorICAgIHlpZWxkCisgIGVuZAorCisgIGRlZiB2aXNpdF9jc3NpbXBvcnQobm9kZSkKKyAgICBub2RlLnF1ZXJ5LmVhY2gge3xjfCBjLm9wdGlvbnMgPSBAb3B0aW9ucyBpZiBjLmlzX2E/KFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSl9IGlmIG5vZGUucXVlcnkKKyAgICB5aWVsZAorICBlbmQKKworICBkZWYgdmlzaXRfc3VwcG9ydHMobm9kZSkKKyAgICBub2RlLmNvbmRpdGlvbi5vcHRpb25zID0gQG9wdGlvbnMKKyAgICB5aWVsZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3Zpc2l0b3JzL3RvX2Nzcy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy90b19jc3MucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjYTdhNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS92aXNpdG9ycy90b19jc3MucmIKQEAgLTAsMCArMSw0NDMgQEAKKyMgQSB2aXNpdG9yIGZvciBjb252ZXJ0aW5nIGEgU2FzcyB0cmVlIGludG8gQ1NTLgorY2xhc3MgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OlRvQ3NzIDwgU2Fzczo6VHJlZTo6VmlzaXRvcnM6OkJhc2UKKyAgIyBUaGUgc291cmNlIG1hcHBpbmcgZm9yIHRoZSBnZW5lcmF0ZWQgQ1NTIGZpbGUuIFRoaXMgaXMgb25seSBzZXQgaWYKKyAgIyBgYnVpbGRfc291cmNlX21hcHBpbmdgIGlzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgYW5kIFx7U2Fzczo6RW5naW5lI3JlbmRlcn0gaGFzIGJlZW4KKyAgIyBydW4uCisgIGF0dHJfcmVhZGVyIDpzb3VyY2VfbWFwcGluZworCisgICMgQHBhcmFtIGJ1aWxkX3NvdXJjZV9tYXBwaW5nIFtCb29sZWFuXSBXaGV0aGVyIHRvIGJ1aWxkIGEKKyAgIyAgIFx7U2Fzczo6U291cmNlOjpNYXB9IHdoaWxlIGNyZWF0aW5nIHRoZSBDU1Mgb3V0cHV0LiBUaGUgbWFwcGluZyB3aWxsCisgICMgICBiZSBhdmFpbGFibGUgZnJvbSBceyNzb3VyY2VcX21hcHBpbmd9IGFmdGVyIHRoZSB2aXNpdG9yIGhhcyBjb21wbGV0ZWQuCisgIGRlZiBpbml0aWFsaXplKGJ1aWxkX3NvdXJjZV9tYXBwaW5nID0gZmFsc2UpCisgICAgQHRhYnMgPSAwCisgICAgQGxpbmUgPSAxCisgICAgQG9mZnNldCA9IDEKKyAgICBAcmVzdWx0ID0gU3RyaW5nLm5ldygiIikKKyAgICBAc291cmNlX21hcHBpbmcgPSBidWlsZF9zb3VyY2VfbWFwcGluZyA/IFNhc3M6OlNvdXJjZTo6TWFwLm5ldyA6IG5pbAorICAgIEBsc3RyaXAgPSBuaWwKKyAgICBAaW5fZGlyZWN0aXZlID0gZmFsc2UKKyAgZW5kCisKKyAgIyBSdW5zIHRoZSB2aXNpdG9yIG9uIGBub2RlYC4KKyAgIworICAjIEBwYXJhbSBub2RlIFtTYXNzOjpUcmVlOjpOb2RlXSBUaGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIHRvIGNvbnZlcnQgdG8gQ1NTPgorICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIENTUyBvdXRwdXQuCisgIGRlZiB2aXNpdChub2RlKQorICAgIHN1cGVyCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgZS5tb2RpZnlfYmFja3RyYWNlKDpmaWxlbmFtZSA9PiBub2RlLmZpbGVuYW1lLCA6bGluZSA9PiBub2RlLmxpbmUpCisgICAgcmFpc2UgZQorICBlbmQKKworICBwcm90ZWN0ZWQKKworICBkZWYgd2l0aF90YWJzKHRhYnMpCisgICAgb2xkX3RhYnMsIEB0YWJzID0gQHRhYnMsIHRhYnMKKyAgICB5aWVsZAorICBlbnN1cmUKKyAgICBAdGFicyA9IG9sZF90YWJzCisgIGVuZAorCisgICMgQXNzb2NpYXRlIGFsbCBvdXRwdXQgcHJvZHVjZWQgaW4gYSBibG9jayB3aXRoIGEgZ2l2ZW4gbm9kZS4gVXNlZCBmb3Igc291cmNlCisgICMgbWFwcGluZy4KKyAgZGVmIGZvcl9ub2RlKG5vZGUsIGF0dHJfcHJlZml4ID0gbmlsKQorICAgIHJldHVybiB5aWVsZCB1bmxlc3MgQHNvdXJjZV9tYXBwaW5nCisgICAgc3RhcnRfcG9zID0gU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoQGxpbmUsIEBvZmZzZXQpCisgICAgeWllbGQKKworICAgIHJhbmdlX2F0dHIgPSBhdHRyX3ByZWZpeCA/IDoiI3thdHRyX3ByZWZpeH1fc291cmNlX3JhbmdlIiA6IDpzb3VyY2VfcmFuZ2UKKyAgICByZXR1cm4gaWYgbm9kZS5pbnZpc2libGU/IHx8ICFub2RlLnNlbmQocmFuZ2VfYXR0cikKKyAgICBzb3VyY2VfcmFuZ2UgPSBub2RlLnNlbmQocmFuZ2VfYXR0cikKKyAgICB0YXJnZXRfZW5kX3BvcyA9IFNhc3M6OlNvdXJjZTo6UG9zaXRpb24ubmV3KEBsaW5lLCBAb2Zmc2V0KQorICAgIHRhcmdldF9yYW5nZSA9IFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KHN0YXJ0X3BvcywgdGFyZ2V0X2VuZF9wb3MsIG5pbCkKKyAgICBAc291cmNlX21hcHBpbmcuYWRkKHNvdXJjZV9yYW5nZSwgdGFyZ2V0X3JhbmdlKQorICBlbmQKKworICBkZWYgdHJhaWxpbmdfc2VtaWNvbG9uPworICAgQHJlc3VsdC5lbmRfd2l0aD8oIjsiKSAmJiAhQHJlc3VsdC5lbmRfd2l0aD8oJ1w7JykKKyAgZW5kCisKKyAgIyBNb3ZlIHRoZSBvdXRwdXQgY3Vyc29yIGJhY2sgYGNoYXJzYCBjaGFyYWN0ZXJzLgorICBkZWYgZXJhc2UhKGNoYXJzKQorICAgIHJldHVybiBpZiBjaGFycyA9PSAwCisgICAgc3RyID0gQHJlc3VsdC5zbGljZSEoLWNoYXJzLi4tMSkKKyAgICBuZXdsaW5lcyA9IHN0ci5jb3VudCgiXG4iKQorICAgIGlmIG5ld2xpbmVzID4gMAorICAgICAgQGxpbmUgLT0gbmV3bGluZXMKKyAgICAgIEBvZmZzZXQgPSBAcmVzdWx0W0ByZXN1bHQucmluZGV4KCJcbiIpIHx8IDAuLi0xXS5zaXplCisgICAgZWxzZQorICAgICAgQG9mZnNldCAtPSBjaGFycworICAgIGVuZAorICBlbmQKKworICAjIEF2b2lkIGFsbG9jYXRpbmcgbG90cyBvZiBuZXcgc3RyaW5ncyBmb3IgYCNvdXRwdXRgLiBUaGlzIGlzIGltcG9ydGFudAorICAjIGJlY2F1c2UgYCNvdXRwdXRgIGlzIGNhbGxlZCBhbGwgdGhlIHRpbWUuCisgIE5FV0xJTkUgPSAiXG4iCisKKyAgIyBBZGQgYHNgIHRvIHRoZSBvdXRwdXQgc3RyaW5nIGFuZCB1cGRhdGUgdGhlIGxpbmUgYW5kIG9mZnNldCBpbmZvcm1hdGlvbgorICAjIGFjY29yZGluZ2x5LgorICBkZWYgb3V0cHV0KHMpCisgICAgaWYgQGxzdHJpcAorICAgICAgcyA9IHMuZ3N1YigvXEFccysvLCAiIikKKyAgICAgIEBsc3RyaXAgPSBmYWxzZQorICAgIGVuZAorCisgICAgbmV3bGluZXMgPSBzLmNvdW50KE5FV0xJTkUpCisgICAgaWYgbmV3bGluZXMgPiAwCisgICAgICBAbGluZSArPSBuZXdsaW5lcworICAgICAgQG9mZnNldCA9IHNbcy5yaW5kZXgoTkVXTElORSkuLi0xXS5zaXplCisgICAgZWxzZQorICAgICAgQG9mZnNldCArPSBzLnNpemUKKyAgICBlbmQKKworICAgIEByZXN1bHQgPDwgcworICBlbmQKKworICAjIFN0cmlwIGFsbCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIG91dHB1dCBzdHJpbmcuCisgIGRlZiByc3RyaXAhCisgICAgZXJhc2UhIEByZXN1bHQubGVuZ3RoIC0gMSAtIChAcmVzdWx0LnJpbmRleCgvW15cc10vKSB8fCAtMSkKKyAgZW5kCisKKyAgIyBsc3RyaXAgdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgZ2l2ZW4gYmxvY2suCisgIGRlZiBsc3RyaXAKKyAgICBvbGRfbHN0cmlwID0gQGxzdHJpcAorICAgIEBsc3RyaXAgPSB0cnVlCisgICAgeWllbGQKKyAgZW5zdXJlCisgICAgQGxzdHJpcCAmJj0gb2xkX2xzdHJpcAorICBlbmQKKworICAjIFByZXBlbmQgYHByZWZpeGAgdG8gdGhlIG91dHB1dCBzdHJpbmcuCisgIGRlZiBwcmVwZW5kIShwcmVmaXgpCisgICAgQHJlc3VsdC5pbnNlcnQgMCwgcHJlZml4CisgICAgcmV0dXJuIHVubGVzcyBAc291cmNlX21hcHBpbmcKKworICAgIGxpbmVfZGVsdGEgPSBwcmVmaXguY291bnQoIlxuIikKKyAgICBvZmZzZXRfZGVsdGEgPSBwcmVmaXguZ3N1YigvLipcbi8sICcnKS5zaXplCisgICAgQHNvdXJjZV9tYXBwaW5nLnNoaWZ0X291dHB1dF9vZmZzZXRzKG9mZnNldF9kZWx0YSkKKyAgICBAc291cmNlX21hcHBpbmcuc2hpZnRfb3V0cHV0X2xpbmVzKGxpbmVfZGVsdGEpCisgIGVuZAorCisgIGRlZiB2aXNpdF9yb290KG5vZGUpCisgICAgbm9kZS5jaGlsZHJlbi5lYWNoIGRvIHxjaGlsZHwKKyAgICAgIG5leHQgaWYgY2hpbGQuaW52aXNpYmxlPworICAgICAgdmlzaXQoY2hpbGQpCisgICAgICBuZXh0IGlmIG5vZGUuc3R5bGUgPT0gOmNvbXByZXNzZWQKKyAgICAgIG91dHB1dCAiXG4iCisgICAgICBuZXh0IHVubGVzcyBjaGlsZC5pc19hPyhTYXNzOjpUcmVlOjpEaXJlY3RpdmVOb2RlKSAmJiBjaGlsZC5oYXNfY2hpbGRyZW4gJiYgIWNoaWxkLmJ1YmJsZXM/CisgICAgICBvdXRwdXQgIlxuIgorICAgIGVuZAorICAgIHJzdHJpcCEKKyAgICBpZiBub2RlLnN0eWxlID09IDpjb21wcmVzc2VkICYmIHRyYWlsaW5nX3NlbWljb2xvbj8KKyAgICAgIGVyYXNlISAxCisgICAgZW5kCisgICAgcmV0dXJuICIiIGlmIEByZXN1bHQuZW1wdHk/CisKKyAgICBvdXRwdXQgIlxuIgorCisgICAgdW5sZXNzIEByZXN1bHQuYXNjaWlfb25seT8KKyAgICAgIGlmIG5vZGUuc3R5bGUgPT0gOmNvbXByZXNzZWQKKyAgICAgICAgIyBBIGJ5dGUgb3JkZXIgbWFyayBpcyBzdWZmaWNpZW50IHRvIHRlbGwgYnJvd3NlcnMgdGhhdCB0aGlzCisgICAgICAgICMgZmlsZSBpcyBVVEYtOCBlbmNvZGVkLCBhbmQgd2lsbCBvdmVycmlkZSBhbnkgb3RoZXIgZGV0ZWN0aW9uCisgICAgICAgICMgbWV0aG9kcyBhcyBwZXIgaHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jZGVjb2RlLWFuZC1lbmNvZGUuCisgICAgICAgIHByZXBlbmQhICJcdUZFRkYiCisgICAgICBlbHNlCisgICAgICAgIHByZXBlbmQhICJAY2hhcnNldCBcIlVURi04XCI7XG4iCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIEByZXN1bHQKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBlLnNhc3NfdGVtcGxhdGUgfHw9IG5vZGUudGVtcGxhdGUKKyAgICByYWlzZSBlCisgIGVuZAorCisgIGRlZiB2aXNpdF9jaGFyc2V0KG5vZGUpCisgICAgZm9yX25vZGUobm9kZSkge291dHB1dCgiQGNoYXJzZXQgXCIje25vZGUubmFtZX1cIjsiKX0KKyAgZW5kCisKKyAgZGVmIHZpc2l0X2NvbW1lbnQobm9kZSkKKyAgICByZXR1cm4gaWYgbm9kZS5pbnZpc2libGU/CisgICAgc3BhY2VzID0gKCcgICcgKiBbQHRhYnMgLSBub2RlLnJlc29sdmVkX3ZhbHVlWy9eICovXS5zaXplLCAwXS5tYXgpCisgICAgb3V0cHV0KHNwYWNlcykKKworICAgIGNvbnRlbnQgPSBub2RlLnJlc29sdmVkX3ZhbHVlLnNwbGl0KCJcbiIpLmpvaW4oIlxuIiArIHNwYWNlcykKKyAgICBpZiBub2RlLnR5cGUgPT0gOnNpbGVudAorICAgICAgY29udGVudC5nc3ViISglcnteKFxzKikvLyguKikkfSkgeyIjeyQxfS8qI3skMn0gKi8ifQorICAgIGVuZAorICAgIGlmIChub2RlLnN0eWxlID09IDpjb21wYWN0IHx8IG5vZGUuc3R5bGUgPT0gOmNvbXByZXNzZWQpICYmIG5vZGUudHlwZSAhPSA6bG91ZAorICAgICAgY29udGVudC5nc3ViISglcntcbiArKFwqICooPyEvKSk/fSwgJyAnKQorICAgIGVuZAorICAgIGZvcl9ub2RlKG5vZGUpIHtvdXRwdXQoY29udGVudCl9CisgIGVuZAorCisgICMgQGNvbW1lbnQKKyAgIyAgIHJ1Ym9jb3A6ZGlzYWJsZSBNZXRob2RMZW5ndGgKKyAgZGVmIHZpc2l0X2RpcmVjdGl2ZShub2RlKQorICAgIHdhc19pbl9kaXJlY3RpdmUgPSBAaW5fZGlyZWN0aXZlCisgICAgdGFiX3N0ciA9ICcgICcgKiBAdGFicworICAgIGlmICFub2RlLmhhc19jaGlsZHJlbiB8fCBub2RlLmNoaWxkcmVuLmVtcHR5PworICAgICAgb3V0cHV0KHRhYl9zdHIpCisgICAgICBmb3Jfbm9kZShub2RlKSB7b3V0cHV0KG5vZGUucmVzb2x2ZWRfdmFsdWUpfQorICAgICAgaWYgbm9kZS5oYXNfY2hpbGRyZW4KKyAgICAgICAgb3V0cHV0KCIjeycgJyB1bmxlc3Mgbm9kZS5zdHlsZSA9PSA6Y29tcHJlc3NlZH17fSIpCisgICAgICBlbHNpZiBub2RlLmNoaWxkcmVuLmVtcHR5PworICAgICAgICBvdXRwdXQoIjsiKQorICAgICAgZW5kCisgICAgICByZXR1cm4KKyAgICBlbmQKKworICAgIEBpbl9kaXJlY3RpdmUgfHw9ICFub2RlLmlzX2E/KFNhc3M6OlRyZWU6Ok1lZGlhTm9kZSkKKyAgICBvdXRwdXQodGFiX3N0cikgaWYgbm9kZS5zdHlsZSAhPSA6Y29tcHJlc3NlZAorICAgIGZvcl9ub2RlKG5vZGUpIHtvdXRwdXQobm9kZS5yZXNvbHZlZF92YWx1ZSl9CisgICAgb3V0cHV0KG5vZGUuc3R5bGUgPT0gOmNvbXByZXNzZWQgPyAieyIgOiAiIHsiKQorICAgIG91dHB1dChub2RlLnN0eWxlID09IDpjb21wYWN0ID8gJyAnIDogIlxuIikgaWYgbm9kZS5zdHlsZSAhPSA6Y29tcHJlc3NlZAorCisgICAgaGFkX2NoaWxkcmVuID0gdHJ1ZQorICAgIGZpcnN0ID0gdHJ1ZQorICAgIG5vZGUuY2hpbGRyZW4uZWFjaCBkbyB8Y2hpbGR8CisgICAgICBuZXh0IGlmIGNoaWxkLmludmlzaWJsZT8KKyAgICAgIGlmIG5vZGUuc3R5bGUgPT0gOmNvbXBhY3QKKyAgICAgICAgaWYgY2hpbGQuaXNfYT8oU2Fzczo6VHJlZTo6UHJvcE5vZGUpCisgICAgICAgICAgd2l0aF90YWJzKGZpcnN0IHx8ICFoYWRfY2hpbGRyZW4gPyAwIDogQHRhYnMgKyAxKSBkbworICAgICAgICAgICAgdmlzaXQoY2hpbGQpCisgICAgICAgICAgICBvdXRwdXQoJyAnKQorICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgdW5sZXNzIGhhZF9jaGlsZHJlbgorICAgICAgICAgICAgZXJhc2UhIDEKKyAgICAgICAgICAgIG91dHB1dCAiXG4iCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBpZiBmaXJzdAorICAgICAgICAgICAgbHN0cmlwIHt3aXRoX3RhYnMoQHRhYnMgKyAxKSB7dmlzaXQoY2hpbGQpfX0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB3aXRoX3RhYnMoQHRhYnMgKyAxKSB7dmlzaXQoY2hpbGQpfQorICAgICAgICAgIGVuZAorCisgICAgICAgICAgcnN0cmlwIQorICAgICAgICAgIG91dHB1dCAiXG4iCisgICAgICAgIGVuZAorICAgICAgICBoYWRfY2hpbGRyZW4gPSBjaGlsZC5oYXNfY2hpbGRyZW4KKyAgICAgICAgZmlyc3QgPSBmYWxzZQorICAgICAgZWxzaWYgbm9kZS5zdHlsZSA9PSA6Y29tcHJlc3NlZAorICAgICAgICB1bmxlc3MgaGFkX2NoaWxkcmVuCisgICAgICAgICAgb3V0cHV0KCI7IikgdW5sZXNzIHRyYWlsaW5nX3NlbWljb2xvbj8KKyAgICAgICAgZW5kCisgICAgICAgIHdpdGhfdGFicygwKSB7dmlzaXQoY2hpbGQpfQorICAgICAgICBoYWRfY2hpbGRyZW4gPSBjaGlsZC5oYXNfY2hpbGRyZW4KKyAgICAgIGVsc2UKKyAgICAgICAgd2l0aF90YWJzKEB0YWJzICsgMSkge3Zpc2l0KGNoaWxkKX0KKyAgICAgICAgb3V0cHV0ICJcbiIKKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJzdHJpcCEKKyAgICBpZiBub2RlLnN0eWxlID09IDpjb21wcmVzc2VkICYmIHRyYWlsaW5nX3NlbWljb2xvbj8KKyAgICAgIGVyYXNlISAxCisgICAgZW5kCisgICAgaWYgbm9kZS5zdHlsZSA9PSA6ZXhwYW5kZWQKKyAgICAgIG91dHB1dCgiXG4je3RhYl9zdHJ9IikKKyAgICBlbHNpZiBub2RlLnN0eWxlICE9IDpjb21wcmVzc2VkCisgICAgICBvdXRwdXQoIiAiKQorICAgIGVuZAorICAgIG91dHB1dCgifSIpCisgIGVuc3VyZQorICAgIEBpbl9kaXJlY3RpdmUgPSB3YXNfaW5fZGlyZWN0aXZlCisgIGVuZAorICAjIEBjb21tZW50CisgICMgICBydWJvY29wOmVuYWJsZSBNZXRob2RMZW5ndGgKKworICBkZWYgdmlzaXRfbWVkaWEobm9kZSkKKyAgICB3aXRoX3RhYnMoQHRhYnMgKyBub2RlLnRhYnMpIHt2aXNpdF9kaXJlY3RpdmUobm9kZSl9CisgICAgb3V0cHV0KCJcbiIpIGlmIG5vZGUuc3R5bGUgIT0gOmNvbXByZXNzZWQgJiYgbm9kZS5ncm91cF9lbmQKKyAgZW5kCisKKyAgZGVmIHZpc2l0X3N1cHBvcnRzKG5vZGUpCisgICAgdmlzaXRfbWVkaWEobm9kZSkKKyAgZW5kCisKKyAgZGVmIHZpc2l0X2Nzc2ltcG9ydChub2RlKQorICAgIHZpc2l0X2RpcmVjdGl2ZShub2RlKQorICBlbmQKKworICBkZWYgdmlzaXRfcHJvcChub2RlKQorICAgIHJldHVybiBpZiBub2RlLnJlc29sdmVkX3ZhbHVlLmVtcHR5PyAmJiAhbm9kZS5jdXN0b21fcHJvcGVydHk/CisgICAgdGFiX3N0ciA9ICcgICcgKiAoQHRhYnMgKyBub2RlLnRhYnMpCisgICAgb3V0cHV0KHRhYl9zdHIpCisgICAgZm9yX25vZGUobm9kZSwgOm5hbWUpIHtvdXRwdXQobm9kZS5yZXNvbHZlZF9uYW1lKX0KKyAgICBvdXRwdXQoIjoiKQorICAgIG91dHB1dCgiICIpIHVubGVzcyBub2RlLnN0eWxlID09IDpjb21wcmVzc2VkIHx8IG5vZGUuY3VzdG9tX3Byb3BlcnR5PworICAgIGZvcl9ub2RlKG5vZGUsIDp2YWx1ZSkgZG8KKyAgICAgIG91dHB1dChpZiBub2RlLmN1c3RvbV9wcm9wZXJ0eT8KKyAgICAgICAgICAgICAgIGZvcm1hdF9jdXN0b21fcHJvcGVydHlfdmFsdWUobm9kZSkKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBub2RlLnJlc29sdmVkX3ZhbHVlCisgICAgICAgICAgICAgZW5kKQorICAgIGVuZAorICAgIG91dHB1dCgiOyIpIHVubGVzcyBub2RlLnN0eWxlID09IDpjb21wcmVzc2VkCisgIGVuZAorCisgICMgQGNvbW1lbnQKKyAgIyAgIHJ1Ym9jb3A6ZGlzYWJsZSBNZXRob2RMZW5ndGgKKyAgZGVmIHZpc2l0X3J1bGUobm9kZSkKKyAgICB3aXRoX3RhYnMoQHRhYnMgKyBub2RlLnRhYnMpIGRvCisgICAgICBydWxlX3NlcGFyYXRvciA9IG5vZGUuc3R5bGUgPT0gOmNvbXByZXNzZWQgPyAnLCcgOiAnLCAnCisgICAgICBsaW5lX3NlcGFyYXRvciA9CisgICAgICAgIGNhc2Ugbm9kZS5zdHlsZQorICAgICAgICB3aGVuIDpuZXN0ZWQsIDpleHBhbmRlZDsgIlxuIgorICAgICAgICB3aGVuIDpjb21wcmVzc2VkOyAiIgorICAgICAgICBlbHNlOyAiICIKKyAgICAgICAgZW5kCisgICAgICBydWxlX2luZGVudCA9ICcgICcgKiBAdGFicworICAgICAgcGVyX3J1bGVfaW5kZW50LCB0b3RhbF9pbmRlbnQgPSBpZiBbOm5lc3RlZCwgOmV4cGFuZGVkXS5pbmNsdWRlPyhub2RlLnN0eWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtydWxlX2luZGVudCwgJyddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJycsIHJ1bGVfaW5kZW50XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKworICAgICAgam9pbmVkX3J1bGVzID0gbm9kZS5yZXNvbHZlZF9ydWxlcy5tZW1iZXJzLm1hcCBkbyB8c2VxfAorICAgICAgICBuZXh0IGlmIHNlcS5pbnZpc2libGU/CisgICAgICAgIHJ1bGVfcGFydCA9IHNlcS50b19zKHN0eWxlOiBub2RlLnN0eWxlLCBwbGFjZWhvbGRlcjogZmFsc2UpCisgICAgICAgIGlmIG5vZGUuc3R5bGUgPT0gOmNvbXByZXNzZWQKKyAgICAgICAgICBydWxlX3BhcnQuZ3N1YiEoLyhbXixdKVxzKlxuXHMqL20sICdcMSAnKQorICAgICAgICAgIHJ1bGVfcGFydC5nc3ViISgvXHMqKFsrPl0pXHMqL20sICdcMScpCisgICAgICAgICAgcnVsZV9wYXJ0LmdzdWIhKC9udGgoW14oIF0qKVwoKFteKV0qKVwpL20pIGRvIHxtYXRjaHwKKyAgICAgICAgICAgIG1hdGNoLnRyKCIgXHRcbiIsICIiKQorICAgICAgICAgIGVuZAorICAgICAgICAgIHJ1bGVfcGFydC5zdHJpcCEKKyAgICAgICAgZW5kCisgICAgICAgIHJ1bGVfcGFydAorICAgICAgZW5kLmNvbXBhY3Quam9pbihydWxlX3NlcGFyYXRvcikKKworICAgICAgam9pbmVkX3J1bGVzLmxzdHJpcCEKKyAgICAgIGpvaW5lZF9ydWxlcy5nc3ViISgvXHMqXG5ccyovLCAiI3tsaW5lX3NlcGFyYXRvcn0je3Blcl9ydWxlX2luZGVudH0iKQorCisgICAgICBvbGRfc3BhY2VzID0gJyAgJyAqIEB0YWJzCisgICAgICBpZiBub2RlLnN0eWxlICE9IDpjb21wcmVzc2VkCisgICAgICAgIGlmIG5vZGUub3B0aW9uc1s6ZGVidWdfaW5mb10gJiYgIUBpbl9kaXJlY3RpdmUKKyAgICAgICAgICB2aXNpdChkZWJ1Z19pbmZvX3J1bGUobm9kZS5kZWJ1Z19pbmZvLCBub2RlLm9wdGlvbnMpKQorICAgICAgICAgIG91dHB1dCAiXG4iCisgICAgICAgIGVsc2lmIG5vZGUub3B0aW9uc1s6dHJhY2Vfc2VsZWN0b3JzXQorICAgICAgICAgIG91dHB1dCgiI3tvbGRfc3BhY2VzfS8qICIpCisgICAgICAgICAgb3V0cHV0KG5vZGUuc3RhY2tfdHJhY2UuZ3N1YigiXG4iLCAiXG4gICAje29sZF9zcGFjZXN9IikpCisgICAgICAgICAgb3V0cHV0KCIgKi9cbiIpCisgICAgICAgIGVsc2lmIG5vZGUub3B0aW9uc1s6bGluZV9jb21tZW50c10KKyAgICAgICAgICBvdXRwdXQoIiN7b2xkX3NwYWNlc30vKiBsaW5lICN7bm9kZS5saW5lfSIpCisKKyAgICAgICAgICBpZiBub2RlLmZpbGVuYW1lCisgICAgICAgICAgICByZWxhdGl2ZV9maWxlbmFtZSA9CisgICAgICAgICAgICAgIGlmIG5vZGUub3B0aW9uc1s6Y3NzX2ZpbGVuYW1lXQorICAgICAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgICAgICBTYXNzOjpVdGlsLnJlbGF0aXZlX3BhdGhfZnJvbSgKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5maWxlbmFtZSwgRmlsZS5kaXJuYW1lKG5vZGUub3B0aW9uc1s6Y3NzX2ZpbGVuYW1lXSkpLnRvX3MKKyAgICAgICAgICAgICAgICByZXNjdWUgQXJndW1lbnRFcnJvcgorICAgICAgICAgICAgICAgICAgbmlsCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgcmVsYXRpdmVfZmlsZW5hbWUgfHw9IG5vZGUuZmlsZW5hbWUKKyAgICAgICAgICAgIG91dHB1dCgiLCAje3JlbGF0aXZlX2ZpbGVuYW1lfSIpCisgICAgICAgICAgZW5kCisKKyAgICAgICAgICBvdXRwdXQoIiAqL1xuIikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZW5kX3Byb3BzLCB0cmFpbGVyLCB0YWJzID0gJycsICcnLCAwCisgICAgICBpZiBub2RlLnN0eWxlID09IDpjb21wYWN0CisgICAgICAgIHNlcGFyYXRvciwgZW5kX3Byb3BzLCBicmFja2V0ID0gJyAnLCAnICcsICcgeyAnCisgICAgICAgIHRyYWlsZXIgPSAiXG4iIGlmIG5vZGUuZ3JvdXBfZW5kCisgICAgICBlbHNpZiBub2RlLnN0eWxlID09IDpjb21wcmVzc2VkCisgICAgICAgIHNlcGFyYXRvciwgYnJhY2tldCA9ICc7JywgJ3snCisgICAgICBlbHNlCisgICAgICAgIHRhYnMgPSBAdGFicyArIDEKKyAgICAgICAgc2VwYXJhdG9yLCBicmFja2V0ID0gIlxuIiwgIiB7XG4iCisgICAgICAgIHRyYWlsZXIgPSAiXG4iIGlmIG5vZGUuZ3JvdXBfZW5kCisgICAgICAgIGVuZF9wcm9wcyA9IChub2RlLnN0eWxlID09IDpleHBhbmRlZCA/ICJcbiIgKyBvbGRfc3BhY2VzIDogJyAnKQorICAgICAgZW5kCisgICAgICBvdXRwdXQodG90YWxfaW5kZW50ICsgcGVyX3J1bGVfaW5kZW50KQorICAgICAgZm9yX25vZGUobm9kZSwgOnNlbGVjdG9yKSB7b3V0cHV0KGpvaW5lZF9ydWxlcyl9CisgICAgICBvdXRwdXQoYnJhY2tldCkKKworICAgICAgd2l0aF90YWJzKHRhYnMpIGRvCisgICAgICAgIG5vZGUuY2hpbGRyZW4uZWFjaF93aXRoX2luZGV4IGRvIHxjaGlsZCwgaXwKKyAgICAgICAgICBpZiBpID4gMAorICAgICAgICAgICAgaWYgc2VwYXJhdG9yLnN0YXJ0X3dpdGg/KCI7IikgJiYgdHJhaWxpbmdfc2VtaWNvbG9uPworICAgICAgICAgICAgICBlcmFzZSEgMQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBvdXRwdXQoc2VwYXJhdG9yKQorICAgICAgICAgIGVuZAorICAgICAgICAgIHZpc2l0KGNoaWxkKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgaWYgbm9kZS5zdHlsZSA9PSA6Y29tcHJlc3NlZCAmJiB0cmFpbGluZ19zZW1pY29sb24/CisgICAgICAgIGVyYXNlISAxCisgICAgICBlbmQKKworICAgICAgb3V0cHV0KGVuZF9wcm9wcykKKyAgICAgIG91dHB1dCgifSIgKyB0cmFpbGVyKQorICAgIGVuZAorICBlbmQKKyAgIyBAY29tbWVudAorICAjICAgcnVib2NvcDplbmFibGUgTWV0aG9kTGVuZ3RoCisKKyAgZGVmIHZpc2l0X2tleWZyYW1lcnVsZShub2RlKQorICAgIHZpc2l0X2RpcmVjdGl2ZShub2RlKQorICBlbmQKKworICBwcml2YXRlCisKKyAgIyBSZWZvcm1hdHMgdGhlIHZhbHVlIG9mIGBub2RlYCBzbyB0aGF0IGl0J3MgbmljZWx5IGluZGVudGVkLCBwcmVzZXJ2aW5nIGl0cworICAjIGV4aXN0aW5nIHJlbGF0aXZlIGluZGVudGF0aW9uLgorICAjCisgICMgQHBhcmFtIG5vZGUgW1Nhc3M6OlNjcmlwdDo6VHJlZTo6UHJvcE5vZGVdIEEgY3VzdG9tIHByb3BlcnR5IG5vZGUuCisgICMgQHJldHVybiBbU3RyaW5nXQorICBkZWYgZm9ybWF0X2N1c3RvbV9wcm9wZXJ0eV92YWx1ZShub2RlKQorICAgIGlmIG5vZGUuc3R5bGUgPT0gOmNvbXBhY3QgfHwgbm9kZS5zdHlsZSA9PSA6Y29tcHJlc3NlZCB8fCAhbm9kZS5yZXNvbHZlZF92YWx1ZS5pbmNsdWRlPygiXG4iKQorICAgICAgIyBGb2xkaW5nIG5vdCBpbnZvbHZpbmcgbmV3bGluZXMgd2FzIGRvbmUgaW4gdGhlIHBhcnNlci4gV2UgY2FuIHNhZmVseQorICAgICAgIyBmb2xkIG5ld2xpbmVzIGhlcmUgYmVjYXVzZSB0b2tlbnMgbGlrZSBzdHJpbmdzIGNhbid0IGNvbnRhaW4gbGl0ZXJhbAorICAgICAgIyBuZXdsaW5lcywgc28gd2Uga25vdyBhbnkgYWRqYWNlbnQgd2hpdGVzcGFjZSBpcyB0b2tlbml6ZWQgYXMgd2hpdGVzcGFjZS4KKyAgICAgIHJldHVybiBub2RlLnJlc29sdmVkX3ZhbHVlLmdzdWIoL1sgXHRcclxmXSpcblsgXHRcclxmXG5dKi8sICcgJykKKyAgICBlbmQKKworICAgICMgRmluZCB0aGUgc21hbGxlc3QgYW1vdW50IG9mIGluZGVudGF0aW9uIGluIHRoZSBjdXN0b20gcHJvcGVydHkgYW5kIHVzZQorICAgICMgdGhhdCBhcyB0aGUgYmFzZSBpbmRlbnRhdGlvbiBsZXZlbC4KKyAgICBsaW5lcyA9IG5vZGUucmVzb2x2ZWRfdmFsdWUuc3BsaXQoIlxuIikKKyAgICBpbmRlbnRlZF9saW5lcyA9IGxpbmVzWzEuLi0xXQorICAgIG1pbl9pbmRlbnRhdGlvbiA9IGluZGVudGVkX2xpbmVzLgorICAgICAgbWFwIHt8bGluZXwgbGluZVsvXlsgXHRdKi9dfS4KKyAgICAgIHJlamVjdCB7fGxpbmV8IGxpbmUuZW1wdHk/fS4KKyAgICAgIG1pbl9ieSB7fGxpbmV8IGxpbmUubGVuZ3RofQorCisgICAgIyBMaW1pdCB0aGUgYmFzZSBpbmRlbnRhdGlvbiB0byB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyB0aGUgbm9kZSBuYW1lCisgICAgIyBzbyB0aGF0IGlmICpldmVyeSogbGluZSBpcyBpbmRlbnRlZCByZWxhdGl2ZSB0byB0aGUgcHJvcGVydHkgbmFtZSB0aGF0J3MKKyAgICAjIHByZXNlcnZlZC4KKyAgICBpZiBub2RlLm5hbWVfc291cmNlX3JhbmdlCisgICAgICBiYXNlX2luZGVudGF0aW9uID0gbWluX2luZGVudGF0aW9uWzAuLi5ub2RlLm5hbWVfc291cmNlX3JhbmdlLnN0YXJ0X3Bvcy5vZmZzZXQgLSAxXQorICAgIGVuZAorCisgICAgbGluZXMuZmlyc3QgKyAiXG4iICsgaW5kZW50ZWRfbGluZXMuam9pbigiXG4iKS5nc3ViKC9eI3tiYXNlX2luZGVudGF0aW9ufS8sICcgICcgKiBAdGFicykKKyAgZW5kCisKKyAgZGVmIGRlYnVnX2luZm9fcnVsZShkZWJ1Z19pbmZvLCBvcHRpb25zKQorICAgIG5vZGUgPSBTYXNzOjpUcmVlOjpEaXJlY3RpdmVOb2RlLnJlc29sdmVkKCJAbWVkaWEgLXNhc3MtZGVidWctaW5mbyIpCisgICAgZGVidWdfaW5mby5tYXAge3xrLCB2fCBbay50b19zLCB2LnRvX3NdfS50b19hLmVhY2ggZG8gfGssIHZ8CisgICAgICBydWxlID0gU2Fzczo6VHJlZTo6UnVsZU5vZGUubmV3KFsiIl0pCisgICAgICBydWxlLnJlc29sdmVkX3J1bGVzID0gU2Fzczo6U2VsZWN0b3I6OkNvbW1hU2VxdWVuY2UubmV3KAorICAgICAgICBbU2Fzczo6U2VsZWN0b3I6OlNlcXVlbmNlLm5ldygKKyAgICAgICAgICBbU2Fzczo6U2VsZWN0b3I6OlNpbXBsZVNlcXVlbmNlLm5ldygKKyAgICAgICAgICAgIFtTYXNzOjpTZWxlY3Rvcjo6RWxlbWVudC5uZXcoay50b19zLmdzdWIoL1teXHctXS8sICJcXFxcXFwwIiksIG5pbCldLAorICAgICAgICAgICAgZmFsc2UpCisgICAgICAgICAgXSkKKyAgICAgICAgXSkKKyAgICAgIHByb3AgPSBTYXNzOjpUcmVlOjpQcm9wTm9kZS5uZXcoWyIiXSwgWyIiXSwgOm5ldykKKyAgICAgIHByb3AucmVzb2x2ZWRfbmFtZSA9ICJmb250LWZhbWlseSIKKyAgICAgIHByb3AucmVzb2x2ZWRfdmFsdWUgPSBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQodi50b19zKQorICAgICAgcnVsZSA8PCBwcm9wCisgICAgICBub2RlIDw8IHJ1bGUKKyAgICBlbmQKKyAgICBub2RlLm9wdGlvbnMgPSBvcHRpb25zLm1lcmdlKDpkZWJ1Z19pbmZvID0+IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmxpbmVfY29tbWVudHMgPT4gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCisgICAgbm9kZQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3dhcm5fbm9kZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS93YXJuX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNDc4OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS93YXJuX25vZGUucmIKQEAgLTAsMCArMSwxOCBAQAorbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFRyZWUKKyAgICAjIEEgZHluYW1pYyBub2RlIHJlcHJlc2VudGluZyBhIFNhc3MgYEB3YXJuYCBzdGF0ZW1lbnQuCisgICAgIworICAgICMgQHNlZSBTYXNzOjpUcmVlCisgICAgY2xhc3MgV2Fybk5vZGUgPCBOb2RlCisgICAgICAjIFRoZSBleHByZXNzaW9uIHRvIHByaW50LgorICAgICAgIyBAcmV0dXJuIFtTY3JpcHQ6OlRyZWU6Ok5vZGVdCisgICAgICBhdHRyX2FjY2Vzc29yIDpleHByCisKKyAgICAgICMgQHBhcmFtIGV4cHIgW1NjcmlwdDo6VHJlZTo6Tm9kZV0gVGhlIGV4cHJlc3Npb24gdG8gcHJpbnQKKyAgICAgIGRlZiBpbml0aWFsaXplKGV4cHIpCisgICAgICAgIEBleHByID0gZXhwcgorICAgICAgICBzdXBlcigpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS93aGlsZV9ub2RlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy90cmVlL3doaWxlX25vZGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1MjlmMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdHJlZS93aGlsZV9ub2RlLnJiCkBAIC0wLDAgKzEsMTggQEAKK3JlcXVpcmUgJ3Nhc3MvdHJlZS9ub2RlJworCittb2R1bGUgU2Fzczo6VHJlZQorICAjIEEgZHluYW1pYyBub2RlIHJlcHJlc2VudGluZyBhIFNhc3MgYEB3aGlsZWAgbG9vcC4KKyAgIworICAjIEBzZWUgU2Fzczo6VHJlZQorICBjbGFzcyBXaGlsZU5vZGUgPCBOb2RlCisgICAgIyBUaGUgcGFyc2UgdHJlZSBmb3IgdGhlIGNvbnRpbnVhdGlvbiBleHByZXNzaW9uLgorICAgICMgQHJldHVybiBbU2NyaXB0OjpUcmVlOjpOb2RlXQorICAgIGF0dHJfYWNjZXNzb3IgOmV4cHIKKworICAgICMgQHBhcmFtIGV4cHIgW1NjcmlwdDo6VHJlZTo6Tm9kZV0gU2VlIFx7I2V4cHJ9CisgICAgZGVmIGluaXRpYWxpemUoZXhwcikKKyAgICAgIEBleHByID0gZXhwcgorICAgICAgc3VwZXIoKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy91dGlsLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy91dGlsLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YmExNDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3V0aWwucmIKQEAgLTAsMCArMSwxMDk3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorcmVxdWlyZSAnZXJiJworcmVxdWlyZSAnc2V0JworcmVxdWlyZSAnZW51bWVyYXRvcicKK3JlcXVpcmUgJ3N0cmluZ2lvJworcmVxdWlyZSAncmJjb25maWcnCityZXF1aXJlICd1cmknCityZXF1aXJlICd0aHJlYWQnCityZXF1aXJlICdwYXRobmFtZScKKworcmVxdWlyZSAnc2Fzcy9yb290JworcmVxdWlyZSAnc2Fzcy91dGlsL3N1YnNldF9tYXAnCisKK21vZHVsZSBTYXNzCisgICMgQSBtb2R1bGUgY29udGFpbmluZyB2YXJpb3VzIHVzZWZ1bCBmdW5jdGlvbnMuCisgICMgQGNvbW1lbnQKKyAgIyAgIHJ1Ym9jb3A6ZGlzYWJsZSBNb2R1bGVMZW5ndGgKKyAgbW9kdWxlIFV0aWwKKyAgICBleHRlbmQgc2VsZgorCisgICAgIyBBbiBhcnJheSBvZiBpbnRzIHJlcHJlc2VudGluZyB0aGUgUnVieSB2ZXJzaW9uIG51bWJlci4KKyAgICAjIEBhcGkgcHVibGljCisgICAgUlVCWV9WRVJTSU9OX0NPTVBPTkVOVFMgPSBSVUJZX1ZFUlNJT04uc3BsaXQoIi4iKS5tYXAge3xzfCBzLnRvX2l9CisKKyAgICAjIFRoZSBSdWJ5IGVuZ2luZSB3ZSdyZSBydW5uaW5nIHVuZGVyLiBEZWZhdWx0cyB0byBgInJ1YnkiYAorICAgICMgaWYgdGhlIHRvcC1sZXZlbCBjb25zdGFudCBpcyB1bmRlZmluZWQuCisgICAgIyBAYXBpIHB1YmxpYworICAgIFJVQllfRU5HSU5FID0gZGVmaW5lZD8oOjpSVUJZX0VOR0lORSkgPyA6OlJVQllfRU5HSU5FIDogInJ1YnkiCisKKyAgICAjIFJldHVybnMgdGhlIHBhdGggb2YgYSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBTYXNzIHJvb3QgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIEBwYXJhbSBmaWxlIFtTdHJpbmddIFRoZSBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgU2FzcyByb290CisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisgICAgZGVmIHNjb3BlKGZpbGUpCisgICAgICBGaWxlLmpvaW4oU2Fzczo6Uk9PVF9ESVIsIGZpbGUpCisgICAgZW5kCisKKyAgICAjIE1hcHMgdGhlIGtleXMgaW4gYSBoYXNoIGFjY29yZGluZyB0byBhIGJsb2NrLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIG1hcF9rZXlzKHs6Zm9vID0+ICJiYXIiLCA6YmF6ID0+ICJiYW5nIn0pIHt8a3wgay50b19zfQorICAgICMgICAgICM9PiB7ImZvbyIgPT4gImJhciIsICJiYXoiID0+ICJiYW5nIn0KKyAgICAjIEBwYXJhbSBoYXNoIFtIYXNoXSBUaGUgaGFzaCB0byBtYXAKKyAgICAjIEB5aWVsZCBba2V5XSBBIGJsb2NrIGluIHdoaWNoIHRoZSBrZXlzIGFyZSB0cmFuc2Zvcm1lZAorICAgICMgQHlpZWxkcGFyYW0ga2V5IFtPYmplY3RdIFRoZSBrZXkgdGhhdCBzaG91bGQgYmUgbWFwcGVkCisgICAgIyBAeWllbGRyZXR1cm4gW09iamVjdF0gVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGtleQorICAgICMgQHJldHVybiBbSGFzaF0gVGhlIG1hcHBlZCBoYXNoCisgICAgIyBAc2VlICNtYXBfdmFscworICAgICMgQHNlZSAjbWFwX2hhc2gKKyAgICBkZWYgbWFwX2tleXMoaGFzaCkKKyAgICAgIG1hcF9oYXNoKGhhc2gpIHt8aywgdnwgW3lpZWxkKGspLCB2XX0KKyAgICBlbmQKKworICAgICMgTWFwcyB0aGUgdmFsdWVzIGluIGEgaGFzaCBhY2NvcmRpbmcgdG8gYSBibG9jay4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBtYXBfdmFsdWVzKHs6Zm9vID0+ICJiYXIiLCA6YmF6ID0+ICJiYW5nIn0pIHt8dnwgdi50b19zeW19CisgICAgIyAgICAgIz0+IHs6Zm9vID0+IDpiYXIsIDpiYXogPT4gOmJhbmd9CisgICAgIyBAcGFyYW0gaGFzaCBbSGFzaF0gVGhlIGhhc2ggdG8gbWFwCisgICAgIyBAeWllbGQgW3ZhbHVlXSBBIGJsb2NrIGluIHdoaWNoIHRoZSB2YWx1ZXMgYXJlIHRyYW5zZm9ybWVkCisgICAgIyBAeWllbGRwYXJhbSB2YWx1ZSBbT2JqZWN0XSBUaGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgbWFwcGVkCisgICAgIyBAeWllbGRyZXR1cm4gW09iamVjdF0gVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZhbHVlCisgICAgIyBAcmV0dXJuIFtIYXNoXSBUaGUgbWFwcGVkIGhhc2gKKyAgICAjIEBzZWUgI21hcF9rZXlzCisgICAgIyBAc2VlICNtYXBfaGFzaAorICAgIGRlZiBtYXBfdmFscyhoYXNoKQorICAgICAgIyBXZSBkb24ndCBkZWxlZ2F0ZSB0byBtYXBfaGFzaCBmb3IgcGVyZm9ybWFuY2UgaGVyZQorICAgICAgIyBiZWNhdXNlIG1hcF9oYXNoIGRvZXMgbW9yZSB0aGFuIGlzIG5lY2Vzc2FyeS4KKyAgICAgIHJ2ID0gaGFzaC5jbGFzcy5uZXcKKyAgICAgIGhhc2ggPSBoYXNoLmFzX3N0b3JlZCBpZiBoYXNoLmlzX2E/KE5vcm1hbGl6ZWRNYXApCisgICAgICBoYXNoLmVhY2ggZG8gfGssIHZ8CisgICAgICAgIHJ2W2tdID0geWllbGQodikKKyAgICAgIGVuZAorICAgICAgcnYKKyAgICBlbmQKKworICAgICMgTWFwcyB0aGUga2V5LXZhbHVlIHBhaXJzIG9mIGEgaGFzaCBhY2NvcmRpbmcgdG8gYSBibG9jay4KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBtYXBfaGFzaCh7OmZvbyA9PiAiYmFyIiwgOmJheiA9PiAiYmFuZyJ9KSB7fGssIHZ8IFtrLnRvX3MsIHYudG9fc3ltXX0KKyAgICAjICAgICAjPT4geyJmb28iID0+IDpiYXIsICJiYXoiID0+IDpiYW5nfQorICAgICMgQHBhcmFtIGhhc2ggW0hhc2hdIFRoZSBoYXNoIHRvIG1hcAorICAgICMgQHlpZWxkIFtrZXksIHZhbHVlXSBBIGJsb2NrIGluIHdoaWNoIHRoZSBrZXktdmFsdWUgcGFpcnMgYXJlIHRyYW5zZm9ybWVkCisgICAgIyBAeWllbGRwYXJhbSBba2V5XSBUaGUgaGFzaCBrZXkKKyAgICAjIEB5aWVsZHBhcmFtIFt2YWx1ZV0gVGhlIGhhc2ggdmFsdWUKKyAgICAjIEB5aWVsZHJldHVybiBbKE9iamVjdCwgT2JqZWN0KV0gVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGBba2V5LCB2YWx1ZV1gIHBhaXIKKyAgICAjIEByZXR1cm4gW0hhc2hdIFRoZSBtYXBwZWQgaGFzaAorICAgICMgQHNlZSAjbWFwX2tleXMKKyAgICAjIEBzZWUgI21hcF92YWxzCisgICAgZGVmIG1hcF9oYXNoKGhhc2gpCisgICAgICAjIENvcHkgYW5kIG1vZGlmeSBpcyBtb3JlIHBlcmZvcm1hbnQgdGhhbiBtYXBwaW5nIHRvIGFuIGFycmF5IGFuZCB1c2luZworICAgICAgIyB0b19oYXNoIG9uIHRoZSByZXN1bHQuCisgICAgICBydiA9IGhhc2guY2xhc3MubmV3CisgICAgICBoYXNoLmVhY2ggZG8gfGssIHZ8CisgICAgICAgIG5ld19rZXksIG5ld192YWx1ZSA9IHlpZWxkKGssIHYpCisgICAgICAgIG5ld19rZXkgPSBoYXNoLmRlbm9ybWFsaXplKG5ld19rZXkpIGlmIGhhc2guaXNfYT8oTm9ybWFsaXplZE1hcCkgJiYgbmV3X2tleSA9PSBrCisgICAgICAgIHJ2W25ld19rZXldID0gbmV3X3ZhbHVlCisgICAgICBlbmQKKyAgICAgIHJ2CisgICAgZW5kCisKKyAgICAjIENvbXB1dGVzIHRoZSBwb3dlcnNldCBvZiB0aGUgZ2l2ZW4gYXJyYXkuCisgICAgIyBUaGlzIGlzIHRoZSBzZXQgb2YgYWxsIHN1YnNldHMgb2YgdGhlIGFycmF5LgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHBvd2Vyc2V0KFsxLCAyLCAzXSkgIz0+CisgICAgIyAgICAgU2V0W1NldFtdLCBTZXRbMV0sIFNldFsyXSwgU2V0WzNdLCBTZXRbMSwgMl0sIFNldFsyLCAzXSwgU2V0WzEsIDNdLCBTZXRbMSwgMiwgM11dCisgICAgIyBAcGFyYW0gYXJyIFtFbnVtZXJhYmxlXQorICAgICMgQHJldHVybiBbU2V0PFNldD5dIFRoZSBzdWJzZXRzIG9mIGBhcnJgCisgICAgZGVmIHBvd2Vyc2V0KGFycikKKyAgICAgIGFyci5pbmplY3QoW1NldC5uZXddLnRvX3NldCkgZG8gfHBvd2Vyc2V0LCBlbHwKKyAgICAgICAgbmV3X3Bvd2Vyc2V0ID0gU2V0Lm5ldworICAgICAgICBwb3dlcnNldC5lYWNoIGRvIHxzdWJzZXR8CisgICAgICAgICAgbmV3X3Bvd2Vyc2V0IDw8IHN1YnNldAorICAgICAgICAgIG5ld19wb3dlcnNldCA8PCBzdWJzZXQgKyBbZWxdCisgICAgICAgIGVuZAorICAgICAgICBuZXdfcG93ZXJzZXQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZXN0cmljdHMgYSBudW1iZXIgdG8gZmFsbGluZyB3aXRoaW4gYSBnaXZlbiByYW5nZS4KKyAgICAjIFJldHVybnMgdGhlIG51bWJlciBpZiBpdCBmYWxscyB3aXRoaW4gdGhlIHJhbmdlLAorICAgICMgb3IgdGhlIGNsb3Nlc3QgdmFsdWUgaW4gdGhlIHJhbmdlIGlmIGl0IGRvZXNuJ3QuCisgICAgIworICAgICMgQHBhcmFtIHZhbHVlIFtOdW1lcmljXQorICAgICMgQHBhcmFtIHJhbmdlIFtSYW5nZTxOdW1lcmljPl0KKyAgICAjIEByZXR1cm4gW051bWVyaWNdCisgICAgZGVmIHJlc3RyaWN0KHZhbHVlLCByYW5nZSkKKyAgICAgIFtbdmFsdWUsIHJhbmdlLmZpcnN0XS5tYXgsIHJhbmdlLmxhc3RdLm1pbgorICAgIGVuZAorCisgICAgIyBMaWtlIFtGaXhudW0ucm91bmRdLCBidXQgbGVhdmVzIHJvb21zIGZvciBzbGlnaHQgZmxvYXRpbmctcG9pbnQKKyAgICAjIGRpZmZlcmVuY2VzLgorICAgICMKKyAgICAjIEBwYXJhbSB2YWx1ZSBbTnVtZXJpY10KKyAgICAjIEByZXR1cm4gW051bWVyaWNdCisgICAgZGVmIHJvdW5kKHZhbHVlKQorICAgICAgIyBJZiB0aGUgbnVtYmVyIGlzIHdpdGhpbiBlcHNpbG9uIG9mIFguNSwgcm91bmQgdXAgKG9yIGRvd24gZm9yIG5lZ2F0aXZlCisgICAgICAjIG51bWJlcnMpLgorICAgICAgcmV0dXJuIHZhbHVlLnJvdW5kIGlmICh2YWx1ZSAlIDEpIC0gMC41IDw9IC0xICogU2NyaXB0OjpWYWx1ZTo6TnVtYmVyLmVwc2lsb24KKyAgICAgIHZhbHVlID4gMCA/IHZhbHVlLmNlaWwgOiB2YWx1ZS5mbG9vcgorICAgIGVuZAorCisgICAgIyBDb25jYXRlbmF0ZXMgYWxsIHN0cmluZ3MgdGhhdCBhcmUgYWRqYWNlbnQgaW4gYW4gYXJyYXksCisgICAgIyB3aGlsZSBsZWF2aW5nIG90aGVyIGVsZW1lbnRzIGFzIHRoZXkgYXJlLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIG1lcmdlX2FkamFjZW50X3N0cmluZ3MoWzEsICJmb28iLCAiYmFyIiwgMiwgImJheiJdKQorICAgICMgICAgICM9PiBbMSwgImZvb2JhciIsIDIsICJiYXoiXQorICAgICMgQHBhcmFtIGFyciBbQXJyYXldCisgICAgIyBAcmV0dXJuIFtBcnJheV0gVGhlIGVudW1lcmFibGUgd2l0aCBzdHJpbmdzIG1lcmdlZAorICAgIGRlZiBtZXJnZV9hZGphY2VudF9zdHJpbmdzKGFycikKKyAgICAgICMgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBvbmUgZWxlbWVudAorICAgICAgcmV0dXJuIGFyciBpZiBhcnIuc2l6ZSA8IDIKKyAgICAgIGFyci5pbmplY3QoW10pIGRvIHxhLCBlfAorICAgICAgICBpZiBlLmlzX2E/KFN0cmluZykKKyAgICAgICAgICBpZiBhLmxhc3QuaXNfYT8oU3RyaW5nKQorICAgICAgICAgICAgYS5sYXN0IDw8IGUKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhIDw8IGUuZHVwCisgICAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhIDw8IGUKKyAgICAgICAgZW5kCisgICAgICAgIGEKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBOb24tZGVzdHJ1Y3RpdmVseSByZXBsYWNlcyBhbGwgb2NjdXJyZW5jZXMgb2YgYSBzdWJzZXF1ZW5jZSBpbiBhbiBhcnJheQorICAgICMgd2l0aCBhbm90aGVyIHN1YnNlcXVlbmNlLgorICAgICMKKyAgICAjIEBleGFtcGxlCisgICAgIyAgIHJlcGxhY2Vfc3Vic2VxKFsxLCAyLCAzLCA0LCA1XSwgWzIsIDNdLCBbOmEsIDpiXSkKKyAgICAjICAgICAjPT4gWzEsIDphLCA6YiwgNCwgNV0KKyAgICAjCisgICAgIyBAcGFyYW0gYXJyIFtBcnJheV0gVGhlIGFycmF5IHdob3NlIHN1YnNlcXVlbmNlcyB3aWxsIGJlIHJlcGxhY2VkLgorICAgICMgQHBhcmFtIHN1YnNlcSBbQXJyYXldIFRoZSBzdWJzZXF1ZW5jZSB0byBmaW5kIGFuZCByZXBsYWNlLgorICAgICMgQHBhcmFtIHJlcGxhY2VtZW50IFtBcnJheV0gVGhlIHNlcXVlbmNlIHRoYXQgYHN1YnNlcWAgd2lsbCBiZSByZXBsYWNlZCB3aXRoLgorICAgICMgQHJldHVybiBbQXJyYXldIGBhcnJgIHdpdGggYHN1YnNlcWAgcmVwbGFjZWQgd2l0aCBgcmVwbGFjZW1lbnRgLgorICAgIGRlZiByZXBsYWNlX3N1YnNlcShhcnIsIHN1YnNlcSwgcmVwbGFjZW1lbnQpCisgICAgICBuZXcgPSBbXQorICAgICAgbWF0Y2hlZCA9IFtdCisgICAgICBpID0gMAorICAgICAgYXJyLmVhY2ggZG8gfGVsZW18CisgICAgICAgIGlmIGVsZW0gIT0gc3Vic2VxW2ldCisgICAgICAgICAgbmV3LnB1c2goKm1hdGNoZWQpCisgICAgICAgICAgbWF0Y2hlZCA9IFtdCisgICAgICAgICAgaSA9IDAKKyAgICAgICAgICBuZXcgPDwgZWxlbQorICAgICAgICAgIG5leHQKKyAgICAgICAgZW5kCisKKyAgICAgICAgaWYgaSA9PSBzdWJzZXEubGVuZ3RoIC0gMQorICAgICAgICAgIG1hdGNoZWQgPSBbXQorICAgICAgICAgIGkgPSAwCisgICAgICAgICAgbmV3LnB1c2goKnJlcGxhY2VtZW50KQorICAgICAgICBlbHNlCisgICAgICAgICAgbWF0Y2hlZCA8PCBlbGVtCisgICAgICAgICAgaSArPSAxCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBuZXcucHVzaCgqbWF0Y2hlZCkKKyAgICAgIG5ldworICAgIGVuZAorCisgICAgIyBJbnRlcnNwZXJzZXMgYSB2YWx1ZSBpbiBhbiBlbnVtZXJhYmxlLCBhcyB3b3VsZCBiZSBkb25lIHdpdGggYEFycmF5I2pvaW5gCisgICAgIyBidXQgd2l0aG91dCBjb25jYXRlbmF0aW5nIHRoZSBhcnJheSB0b2dldGhlciBhZnRlcndhcmRzLgorICAgICMKKyAgICAjIEBwYXJhbSBlbnVtIFtFbnVtZXJhYmxlXQorICAgICMgQHBhcmFtIHZhbAorICAgICMgQHJldHVybiBbQXJyYXldCisgICAgZGVmIGludGVyc3BlcnNlKGVudW0sIHZhbCkKKyAgICAgIGVudW0uaW5qZWN0KFtdKSB7fGEsIGV8IGEgPDwgZSA8PCB2YWx9WzAuLi4tMV0KKyAgICBlbmQKKworICAgIGRlZiBzbGljZV9ieShlbnVtKQorICAgICAgcmVzdWx0cyA9IFtdCisgICAgICBlbnVtLmVhY2ggZG8gfHZhbHVlfAorICAgICAgICBrZXkgPSB5aWVsZCh2YWx1ZSkKKyAgICAgICAgaWYgIXJlc3VsdHMuZW1wdHk/ICYmIHJlc3VsdHMubGFzdC5maXJzdCA9PSBrZXkKKyAgICAgICAgICByZXN1bHRzLmxhc3QubGFzdCA8PCB2YWx1ZQorICAgICAgICBlbHNlCisgICAgICAgICAgcmVzdWx0cyA8PCBba2V5LCBbdmFsdWVdXQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgcmVzdWx0cworICAgIGVuZAorCisgICAgIyBTdWJzdGl0dXRlcyBhIHN1Yi1hcnJheSBvZiBvbmUgYXJyYXkgd2l0aCBhbm90aGVyIHN1Yi1hcnJheS4KKyAgICAjCisgICAgIyBAcGFyYW0gYXJ5IFtBcnJheV0gVGhlIGFycmF5IGluIHdoaWNoIHRvIG1ha2UgdGhlIHN1YnN0aXR1dGlvbgorICAgICMgQHBhcmFtIGZyb20gW0FycmF5XSBUaGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdG8gcmVwbGFjZSB3aXRoIGB0b2AKKyAgICAjIEBwYXJhbSB0byBbQXJyYXldIFRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyB0byByZXBsYWNlIGBmcm9tYCB3aXRoCisgICAgZGVmIHN1YnN0aXR1dGUoYXJ5LCBmcm9tLCB0bykKKyAgICAgIHJlcyA9IGFyeS5kdXAKKyAgICAgIGkgPSAwCisgICAgICB3aGlsZSBpIDwgcmVzLnNpemUKKyAgICAgICAgaWYgcmVzW2kuLi5pICsgZnJvbS5zaXplXSA9PSBmcm9tCisgICAgICAgICAgcmVzW2kuLi5pICsgZnJvbS5zaXplXSA9IHRvCisgICAgICAgIGVuZAorICAgICAgICBpICs9IDEKKyAgICAgIGVuZAorICAgICAgcmVzCisgICAgZW5kCisKKyAgICAjIERlc3RydWN0aXZlbHkgc3RyaXBzIHdoaXRlc3BhY2UgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQKKyAgICAjIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBlbGVtZW50cywgcmVzcGVjdGl2ZWx5LAorICAgICMgaW4gdGhlIGFycmF5IChpZiB0aG9zZSBlbGVtZW50cyBhcmUgc3RyaW5ncykuCisgICAgIworICAgICMgQHBhcmFtIGFyciBbQXJyYXldCisgICAgIyBAcmV0dXJuIFtBcnJheV0gYGFycmAKKyAgICBkZWYgc3RyaXBfc3RyaW5nX2FycmF5KGFycikKKyAgICAgIGFyci5maXJzdC5sc3RyaXAhIGlmIGFyci5maXJzdC5pc19hPyhTdHJpbmcpCisgICAgICBhcnIubGFzdC5yc3RyaXAhIGlmIGFyci5sYXN0LmlzX2E/KFN0cmluZykKKyAgICAgIGFycgorICAgIGVuZAorCisgICAgIyBSZXR1cm4gYW4gYXJyYXkgb2YgYWxsIHBvc3NpYmxlIHBhdGhzIHRocm91Z2ggdGhlIGdpdmVuIGFycmF5cy4KKyAgICAjCisgICAgIyBAcGFyYW0gYXJycyBbQXJyYXk8QXJyYXk+XQorICAgICMgQHJldHVybiBbQXJyYXk8QXJyYXlzPl0KKyAgICAjCisgICAgIyBAZXhhbXBsZQorICAgICMgICBwYXRocyhbWzEsIDJdLCBbMywgNF0sIFs1XV0pICM9PgorICAgICMgICAgICMgW1sxLCAzLCA1XSwKKyAgICAjICAgICAjICBbMiwgMywgNV0sCisgICAgIyAgICAgIyAgWzEsIDQsIDVdLAorICAgICMgICAgICMgIFsyLCA0LCA1XV0KKyAgICBkZWYgcGF0aHMoYXJycykKKyAgICAgIGFycnMuaW5qZWN0KFtbXV0pIGRvIHxwYXRocywgYXJyfAorICAgICAgICBhcnIubWFwIHt8ZXwgcGF0aHMubWFwIHt8cGF0aHwgcGF0aCArIFtlXX19LmZsYXR0ZW4oMSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBDb21wdXRlcyBhIHNpbmdsZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSBmb3IgYHhgIGFuZCBgeWAuCisgICAgIyBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZXMsCisgICAgIyB0aGUgb25lIHJldHVybmVkIGlzIHRoYXQgd2hpY2ggc3RhcnRzIGZpcnN0IGluIGB4YC4KKyAgICAjCisgICAgIyBAcGFyYW0geCBbQXJyYXldCisgICAgIyBAcGFyYW0geSBbQXJyYXldCisgICAgIyBAeWllbGQgW2EsIGJdIEFuIG9wdGlvbmFsIGJsb2NrIHRvIHVzZSBpbiBwbGFjZSBvZiBhIGNoZWNrIGZvciBlcXVhbGl0eQorICAgICMgICBiZXR3ZWVuIGVsZW1lbnRzIG9mIGB4YCBhbmQgYHlgLgorICAgICMgQHlpZWxkcmV0dXJuIFtPYmplY3QsIG5pbF0gSWYgdGhlIHR3byB2YWx1ZXMgcmVnaXN0ZXIgYXMgZXF1YWwsCisgICAgIyAgIHRoaXMgd2lsbCByZXR1cm4gdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgTENTIGFycmF5LgorICAgICMgQHJldHVybiBbQXJyYXldIFRoZSBMQ1MKKyAgICBkZWYgbGNzKHgsIHksICZibG9jaykKKyAgICAgIHggPSBbbmlsLCAqeF0KKyAgICAgIHkgPSBbbmlsLCAqeV0KKyAgICAgIGJsb2NrIHx8PSBwcm9jIHt8YSwgYnwgYSA9PSBiICYmIGF9CisgICAgICBsY3NfYmFja3RyYWNlKGxjc190YWJsZSh4LCB5LCAmYmxvY2spLCB4LCB5LCB4LnNpemUgLSAxLCB5LnNpemUgLSAxLCAmYmxvY2spCisgICAgZW5kCisKKyAgICAjIExpa2UgYFN0cmluZy51cGNhc2VgLCBidXQgb25seSBldmVyIHVwY2FzZXMgQVNDSUkgbGV0dGVycy4KKyAgICBkZWYgdXBjYXNlKHN0cmluZykKKyAgICAgIHJldHVybiBzdHJpbmcudXBjYXNlIHVubGVzcyBydWJ5Ml80PworICAgICAgc3RyaW5nLnVwY2FzZSg6YXNjaWkpCisgICAgZW5kCisKKyAgICAjIExpa2UgYFN0cmluZy5kb3duY2FzZWAsIGJ1dCBvbmx5IGV2ZXIgZG93bmNhc2VzIEFTQ0lJIGxldHRlcnMuCisgICAgZGVmIGRvd25jYXNlKHN0cmluZykKKyAgICAgIHJldHVybiBzdHJpbmcuZG93bmNhc2UgdW5sZXNzIHJ1YnkyXzQ/CisgICAgICBzdHJpbmcuZG93bmNhc2UoOmFzY2lpKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGEgc3ViLWFycmF5IG9mIGBtaW51ZW5kYCBjb250YWluaW5nIG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgYWxzbyBpbgorICAgICMgYHN1YnRyYWhlbmRgLiBFbnN1cmVzIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBoYXMgdGhlIHNhbWUgb3JkZXIgYXMKKyAgICAjIGBtaW51ZW5kYCwgZXZlbiBvbiBSdWJpbml1cyB3aGVyZSB0aGF0J3Mgbm90IGd1YXJhbnRlZWQgYnkgYEFycmF5Iy1gLgorICAgICMKKyAgICAjIEBwYXJhbSBtaW51ZW5kIFtBcnJheV0KKyAgICAjIEBwYXJhbSBzdWJ0cmFoZW5kIFtBcnJheV0KKyAgICAjIEByZXR1cm4gW0FycmF5XQorICAgIGRlZiBhcnJheV9taW51cyhtaW51ZW5kLCBzdWJ0cmFoZW5kKQorICAgICAgcmV0dXJuIG1pbnVlbmQgLSBzdWJ0cmFoZW5kIHVubGVzcyByYng/CisgICAgICBzZXQgPSBTZXQubmV3KG1pbnVlbmQpIC0gc3VidHJhaGVuZAorICAgICAgbWludWVuZC5zZWxlY3Qge3xlfCBzZXQuaW5jbHVkZT8oZSl9CisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIG1heGltdW0gb2YgYHZhbDFgIGFuZCBgdmFsMmAuIFdlIHVzZSB0aGlzIG92ZXIgXHtBcnJheS5tYXh9IHRvCisgICAgIyBhdm9pZCB1bm5lY2Vzc2FyeSBnYXJiYWdlIGNvbGxlY3Rpb24uCisgICAgZGVmIG1heCh2YWwxLCB2YWwyKQorICAgICAgdmFsMSA+IHZhbDIgPyB2YWwxIDogdmFsMgorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIGB2YWwxYCBhbmQgYHZhbDJgLiBXZSB1c2UgdGhpcyBvdmVyIFx7QXJyYXkubWlufSB0bworICAgICMgYXZvaWQgdW5uZWNlc3NhcnkgZ2FyYmFnZSBjb2xsZWN0aW9uLgorICAgIGRlZiBtaW4odmFsMSwgdmFsMikKKyAgICAgIHZhbDEgPD0gdmFsMiA/IHZhbDEgOiB2YWwyCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIGNoYXJhY3RlciB0aGF0IGNhdXNlZCBhbgorICAgICMgYEVuY29kaW5nOjpVbmRlZmluZWRDb252ZXJzaW9uRXJyb3JgLgorICAgICMKKyAgICAjIEBwYXJhbSBlIFtFbmNvZGluZzo6VW5kZWZpbmVkQ29udmVyc2lvbkVycm9yXQorICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGRlZiB1bmRlZmluZWRfY29udmVyc2lvbl9lcnJvcl9jaGFyKGUpCisgICAgICAjIFJ1YmluaXVzIChhcyBvZiAyLjAuMC5yYzEpIHByZS1xdW90ZXMgdGhlIGVycm9yIGNoYXJhY3Rlci4KKyAgICAgIHJldHVybiBlLmVycm9yX2NoYXIgaWYgcmJ4PworICAgICAgIyBKUnVieSAoYXMgb2YgMS43LjIpIGRvZXNuJ3QgaGF2ZSBhbiBlcnJvcl9jaGFyIGZpZWxkIG9uCisgICAgICAjIEVuY29kaW5nOjpVbmRlZmluZWRDb252ZXJzaW9uRXJyb3IuCisgICAgICByZXR1cm4gZS5lcnJvcl9jaGFyLmR1bXAgdW5sZXNzIGpydWJ5PworICAgICAgZS5tZXNzYWdlWy9eIlteIl0rIi9dICMgIgorICAgIGVuZAorCisgICAgIyBBc3NlcnRzIHRoYXQgYHZhbHVlYCBmYWxscyB3aXRoaW4gYHJhbmdlYCAoaW5jbHVzaXZlKSwgbGVhdmluZworICAgICMgcm9vbSBmb3Igc2xpZ2h0IGZsb2F0aW5nLXBvaW50IGVycm9ycy4KKyAgICAjCisgICAgIyBAcGFyYW0gbmFtZSBbU3RyaW5nXSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUuIFVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgIyBAcGFyYW0gcmFuZ2UgW1JhbmdlXSBUaGUgYWxsb3dlZCByYW5nZSBvZiB2YWx1ZXMuCisgICAgIyBAcGFyYW0gdmFsdWUgW051bWVyaWMsIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlcl0gVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICMgQHBhcmFtIHVuaXQgW1N0cmluZ10gVGhlIHVuaXQgb2YgdGhlIHZhbHVlLiBVc2VkIGluIGVycm9yIHJlcG9ydGluZy4KKyAgICAjIEByZXR1cm4gW051bWVyaWNdIGB2YWx1ZWAgYWRqdXN0ZWQgdG8gZmFsbCB3aXRoaW4gcmFuZ2UsIGlmIGl0CisgICAgIyAgIHdhcyBvdXRzaWRlIGJ5IGEgZmxvYXRpbmctcG9pbnQgbWFyZ2luLgorICAgIGRlZiBjaGVja19yYW5nZShuYW1lLCByYW5nZSwgdmFsdWUsIHVuaXQgPSAnJykKKyAgICAgIGdyYWNlID0gKC0wLjAwMDAxLi4wLjAwMDAxKQorICAgICAgc3RyID0gdmFsdWUudG9fcworICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZSBpZiB2YWx1ZS5pc19hPyhTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIpCisgICAgICByZXR1cm4gdmFsdWUgaWYgcmFuZ2UuaW5jbHVkZT8odmFsdWUpCisgICAgICByZXR1cm4gcmFuZ2UuZmlyc3QgaWYgZ3JhY2UuaW5jbHVkZT8odmFsdWUgLSByYW5nZS5maXJzdCkKKyAgICAgIHJldHVybiByYW5nZS5sYXN0IGlmIGdyYWNlLmluY2x1ZGU/KHZhbHVlIC0gcmFuZ2UubGFzdCkKKyAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KAorICAgICAgICAiI3tuYW1lfSAje3N0cn0gbXVzdCBiZSBiZXR3ZWVuICN7cmFuZ2UuZmlyc3R9I3t1bml0fSBhbmQgI3tyYW5nZS5sYXN0fSN7dW5pdH0iKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGBzZXExYCBpcyBhIHN1YnNlcXVlbmNlIG9mIGBzZXEyYC4gVGhhdCBpcywgd2hldGhlcgorICAgICMgb3Igbm90IGBzZXEyYCBjb250YWlucyBldmVyeSBlbGVtZW50IGluIGBzZXExYCBpbiB0aGUgc2FtZSBvcmRlciAoYW5kCisgICAgIyBwb3NzaWJseSBtb3JlIGVsZW1lbnRzIGJlc2lkZXMpLgorICAgICMKKyAgICAjIEBwYXJhbSBzZXExIFtBcnJheV0KKyAgICAjIEBwYXJhbSBzZXEyIFtBcnJheV0KKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgZGVmIHN1YnNlcXVlbmNlPyhzZXExLCBzZXEyKQorICAgICAgaSA9IGogPSAwCisgICAgICBsb29wIGRvCisgICAgICAgIHJldHVybiB0cnVlIGlmIGkgPT0gc2VxMS5zaXplCisgICAgICAgIHJldHVybiBmYWxzZSBpZiBqID09IHNlcTIuc2l6ZQorICAgICAgICBpICs9IDEgaWYgc2VxMVtpXSA9PSBzZXEyW2pdCisgICAgICAgIGogKz0gMQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhbGxlciBvZiB0aGUgcHJldmlvdXMgbWV0aG9kLgorICAgICMKKyAgICAjIEBwYXJhbSBlbnRyeSBbU3RyaW5nXSBBbiBlbnRyeSBpbiB0aGUgYCNjYWxsZXJgIGxpc3QsIG9yIGEgc2ltaWxhcmx5IGZvcm1hdHRlZCBzdHJpbmcKKyAgICAjIEByZXR1cm4gW1tTdHJpbmcsIEludGVnZXIsIChTdHJpbmcsIG5pbCldXQorICAgICMgICBBbiBhcnJheSBjb250YWluaW5nIHRoZSBmaWxlbmFtZSwgbGluZSwgYW5kIG1ldGhvZCBuYW1lIG9mIHRoZSBjYWxsZXIuCisgICAgIyAgIFRoZSBtZXRob2QgbmFtZSBtYXkgYmUgbmlsCisgICAgZGVmIGNhbGxlcl9pbmZvKGVudHJ5ID0gbmlsKQorICAgICAgIyBKUnVieSBldmFsdWF0ZXMgYGNhbGxlcmAgaW5jb3JyZWN0bHkgd2hlbiBpdCdzIGluIGFuIGFjdHVhbCBkZWZhdWx0IGFyZ3VtZW50LgorICAgICAgZW50cnkgfHw9IGNhbGxlclsxXQorICAgICAgaW5mbyA9IGVudHJ5LnNjYW4oL14oKD86W0EtWmEtel06KT8uKj8pOigtPy4qPykoPzo6LipgKC4rKScpPyQvKS5maXJzdAorICAgICAgaW5mb1sxXSA9IGluZm9bMV0udG9faQorICAgICAgIyBUaGlzIGlzIGFkZGVkIGJ5IFJ1YmluaXVzIHRvIGRlc2lnbmF0ZSBhIGJsb2NrLCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdC4KKyAgICAgIGluZm9bMl0uc3ViISgvIFx7XH1cWi8sICcnKSBpZiBpbmZvWzJdCisgICAgICBpbmZvCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgd2hldGhlciBvbmUgdmVyc2lvbiBzdHJpbmcgcmVwcmVzZW50cyBhIG1vcmUgcmVjZW50IHZlcnNpb24gdGhhbiBhbm90aGVyLgorICAgICMKKyAgICAjIEBwYXJhbSB2MSBbU3RyaW5nXSBBIHZlcnNpb24gc3RyaW5nLgorICAgICMgQHBhcmFtIHYyIFtTdHJpbmddIEFub3RoZXIgdmVyc2lvbiBzdHJpbmcuCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiB2ZXJzaW9uX2d0KHYxLCB2MikKKyAgICAgICMgQ29uc3RydWN0IGFuIGFycmF5IHRvIG1ha2Ugc3VyZSB0aGUgc2hvcnRlciB2ZXJzaW9uIGlzIHBhZGRlZCB3aXRoIG5pbAorICAgICAgQXJyYXkubmV3KFt2MS5sZW5ndGgsIHYyLmxlbmd0aF0ubWF4KS56aXAodjEuc3BsaXQoIi4iKSwgdjIuc3BsaXQoIi4iKSkgZG8gfF8sIHAxLCBwMnwKKyAgICAgICAgcDEgfHw9ICIwIgorICAgICAgICBwMiB8fD0gIjAiCisgICAgICAgIHJlbGVhc2UxID0gcDEgPX4gL15bMC05XSskLworICAgICAgICByZWxlYXNlMiA9IHAyID1+IC9eWzAtOV0rJC8KKyAgICAgICAgaWYgcmVsZWFzZTEgJiYgcmVsZWFzZTIKKyAgICAgICAgICAjIEludGVnZXIgY29tcGFyaXNvbiBpZiBib3RoIGFyZSBmdWxsIHJlbGVhc2VzCisgICAgICAgICAgcDEsIHAyID0gcDEudG9faSwgcDIudG9faQorICAgICAgICAgIG5leHQgaWYgcDEgPT0gcDIKKyAgICAgICAgICByZXR1cm4gcDEgPiBwMgorICAgICAgICBlbHNpZiAhcmVsZWFzZTEgJiYgIXJlbGVhc2UyCisgICAgICAgICAgIyBTdHJpbmcgY29tcGFyaXNvbiBpZiBib3RoIGFyZSBwcmVyZWxlYXNlcworICAgICAgICAgIG5leHQgaWYgcDEgPT0gcDIKKyAgICAgICAgICByZXR1cm4gcDEgPiBwMgorICAgICAgICBlbHNlCisgICAgICAgICAgIyBJZiBvbmx5IG9uZSBpcyBhIHJlbGVhc2UsIHRoYXQgb25lIGlzIG5ld2VyCisgICAgICAgICAgcmV0dXJuIHJlbGVhc2UxCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgd2hldGhlciBvbmUgdmVyc2lvbiBzdHJpbmcgcmVwcmVzZW50cyB0aGUgc2FtZSBvciBhIG1vcmUKKyAgICAjIHJlY2VudCB2ZXJzaW9uIHRoYW4gYW5vdGhlci4KKyAgICAjCisgICAgIyBAcGFyYW0gdjEgW1N0cmluZ10gQSB2ZXJzaW9uIHN0cmluZy4KKyAgICAjIEBwYXJhbSB2MiBbU3RyaW5nXSBBbm90aGVyIHZlcnNpb24gc3RyaW5nLgorICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgdmVyc2lvbl9nZXEodjEsIHYyKQorICAgICAgdmVyc2lvbl9ndCh2MSwgdjIpIHx8ICF2ZXJzaW9uX2d0KHYyLCB2MSkKKyAgICBlbmQKKworICAgICMgVGhyb3dzIGEgTm90SW1wbGVtZW50ZWRFcnJvciBmb3IgYW4gYWJzdHJhY3QgbWV0aG9kLgorICAgICMKKyAgICAjIEBwYXJhbSBvYmogW09iamVjdF0gYHNlbGZgCisgICAgIyBAcmFpc2UgW05vdEltcGxlbWVudGVkRXJyb3JdCisgICAgZGVmIGFic3RyYWN0KG9iaikKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IubmV3KCIje29iai5jbGFzc30gbXVzdCBpbXBsZW1lbnQgIyN7Y2FsbGVyX2luZm9bMl19IikKKyAgICBlbmQKKworICAgICMgUHJpbnRzIGEgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgdGhlIGNhbGxlciBtZXRob2QuCisgICAgIworICAgICMgQHBhcmFtIG9iaiBbT2JqZWN0XSBgc2VsZmAKKyAgICAjIEBwYXJhbSBtZXNzYWdlIFtTdHJpbmddIEEgbWVzc2FnZSBkZXNjcmliaW5nIHdoYXQgdG8gZG8gaW5zdGVhZC4KKyAgICBkZWYgZGVwcmVjYXRlZChvYmosIG1lc3NhZ2UgPSBuaWwpCisgICAgICBvYmpfY2xhc3MgPSBvYmouaXNfYT8oQ2xhc3MpID8gIiN7b2JqfS4iIDogIiN7b2JqLmNsYXNzfSMiCisgICAgICBmdWxsX21lc3NhZ2UgPSAiREVQUkVDQVRJT04gV0FSTklORzogI3tvYmpfY2xhc3N9I3tjYWxsZXJfaW5mb1syXX0gIiArCisgICAgICAgICJ3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTYXNzLiN7KCJcbiIgKyBtZXNzYWdlKSBpZiBtZXNzYWdlfSIKKyAgICAgIFNhc3M6OlV0aWwuc2Fzc193YXJuIGZ1bGxfbWVzc2FnZQorICAgIGVuZAorCisgICAgIyBTaWxlbmNlIGFsbCBvdXRwdXQgdG8gU1RERVJSIHdpdGhpbiBhIGJsb2NrLgorICAgICMKKyAgICAjIEB5aWVsZCBBIGJsb2NrIGluIHdoaWNoIG5vIG91dHB1dCB3aWxsIGJlIHByaW50ZWQgdG8gU1RERVJSCisgICAgZGVmIHNpbGVuY2Vfd2FybmluZ3MKKyAgICAgIHRoZV9yZWFsX3N0ZGVyciwgJHN0ZGVyciA9ICRzdGRlcnIsIFN0cmluZ0lPLm5ldworICAgICAgeWllbGQKKyAgICBlbnN1cmUKKyAgICAgICRzdGRlcnIgPSB0aGVfcmVhbF9zdGRlcnIKKyAgICBlbmQKKworICAgICMgU2lsZW5jZXMgYWxsIFNhc3Mgd2FybmluZ3Mgd2l0aGluIGEgYmxvY2suCisgICAgIworICAgICMgQHlpZWxkIEEgYmxvY2sgaW4gd2hpY2ggbm8gU2FzcyB3YXJuaW5ncyB3aWxsIGJlIHByaW50ZWQKKyAgICBkZWYgc2lsZW5jZV9zYXNzX3dhcm5pbmdzCisgICAgICBvbGRfbGV2ZWwsIFNhc3MubG9nZ2VyLmxvZ19sZXZlbCA9IFNhc3MubG9nZ2VyLmxvZ19sZXZlbCwgOmVycm9yCisgICAgICB5aWVsZAorICAgIGVuc3VyZQorICAgICAgU2Fzcy5sb2dnZXIubG9nX2xldmVsID0gb2xkX2xldmVsCisgICAgZW5kCisKKyAgICAjIFRoZSBzYW1lIGFzIGBLZXJuZWwjd2FybmAsIGJ1dCBpcyBzaWxlbmNlZCBieSBceyNzaWxlbmNlXF9zYXNzXF93YXJuaW5nc30uCisgICAgIworICAgICMgQHBhcmFtIG1zZyBbU3RyaW5nXQorICAgIGRlZiBzYXNzX3dhcm4obXNnKQorICAgICAgU2Fzcy5sb2dnZXIud2FybigiI3ttc2d9XG4iKQorICAgIGVuZAorCisgICAgIyMgQ3Jvc3MgUmFpbHMgVmVyc2lvbiBDb21wYXRpYmlsaXR5CisKKyAgICAjIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIFJhaWxzIGFwcGxpY2F0aW9uLAorICAgICMgaWYgdGhpcyBpcyBydW5uaW5nIGluIGEgUmFpbHMgY29udGV4dC4KKyAgICAjIFJldHVybnMgYG5pbGAgaWYgbm8gc3VjaCByb290IGlzIGRlZmluZWQuCisgICAgIworICAgICMgQHJldHVybiBbU3RyaW5nLCBuaWxdCisgICAgZGVmIHJhaWxzX3Jvb3QKKyAgICAgIGlmIGRlZmluZWQ/KDo6UmFpbHMucm9vdCkKKyAgICAgICAgcmV0dXJuIDo6UmFpbHMucm9vdC50b19zIGlmIDo6UmFpbHMucm9vdAorICAgICAgICByYWlzZSAiRVJST1I6IFJhaWxzLnJvb3QgaXMgbmlsISIKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIFJBSUxTX1JPT1QudG9fcyBpZiBkZWZpbmVkPyhSQUlMU19ST09UKQorICAgICAgbmlsCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgdGhlIGVudmlyb25tZW50IG9mIHRoZSBSYWlscyBhcHBsaWNhdGlvbiwKKyAgICAjIGlmIHRoaXMgaXMgcnVubmluZyBpbiBhIFJhaWxzIGNvbnRleHQuCisgICAgIyBSZXR1cm5zIGBuaWxgIGlmIG5vIHN1Y2ggZW52aXJvbm1lbnQgaXMgZGVmaW5lZC4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtTdHJpbmcsIG5pbF0KKyAgICBkZWYgcmFpbHNfZW52CisgICAgICByZXR1cm4gOjpSYWlscy5lbnYudG9fcyBpZiBkZWZpbmVkPyg6OlJhaWxzLmVudikKKyAgICAgIHJldHVybiBSQUlMU19FTlYudG9fcyBpZiBkZWZpbmVkPyhSQUlMU19FTlYpCisgICAgICBuaWwKKyAgICBlbmQKKworICAgICMgUmV0dXJucyB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgaXMgdXNpbmcgQWN0aW9uUGFjaworICAgICMgdmVyc2lvbiAzLjAuMCBvciBncmVhdGVyLgorICAgICMKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgZGVmIGFwX2dlcV8zPworICAgICAgYXBfZ2VxPygiMy4wLjAuYmV0YTEiKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBpcyB1c2luZyBBY3Rpb25QYWNrCisgICAgIyBvZiBhIHZlcnNpb24gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoYXQgc3BlY2lmaWVkLgorICAgICMKKyAgICAjIEBwYXJhbSB2ZXJzaW9uIFtTdHJpbmddIFRoZSBzdHJpbmcgdmVyc2lvbiBudW1iZXIgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAjICAgU2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBSYWlscyAzLAorICAgICMgICBiZWNhdXNlIG90aGVyd2lzZSBBY3Rpb25QYWNrOjpWRVJTSU9OIGlzbid0IGF1dG9sb2FkZWQKKyAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgZGVmIGFwX2dlcT8odmVyc2lvbikKKyAgICAgICMgVGhlIEFjdGlvblBhY2sgbW9kdWxlIGlzIGFsd2F5cyBsb2FkZWQgYXV0b21hdGljYWxseSBpbiBSYWlscyA+PSAzCisgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIGRlZmluZWQ/KEFjdGlvblBhY2spICYmIGRlZmluZWQ/KEFjdGlvblBhY2s6OlZFUlNJT04pICYmCisgICAgICAgIGRlZmluZWQ/KEFjdGlvblBhY2s6OlZFUlNJT046OlNUUklORykKKworICAgICAgdmVyc2lvbl9nZXEoQWN0aW9uUGFjazo6VkVSU0lPTjo6U1RSSU5HLCB2ZXJzaW9uKQorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGFuIEFjdGlvblZpZXc6OlRlbXBsYXRlKiBjbGFzcy4KKyAgICAjIEluIHByZS0zLjAgdmVyc2lvbnMgb2YgUmFpbHMsIG1vc3Qgb2YgdGhlc2UgY2xhc3NlcworICAgICMgd2VyZSBvZiB0aGUgZm9ybSBgQWN0aW9uVmlldzo6VGVtcGxhdGVGb29gLAorICAgICMgd2hpbGUgYWZ0ZXJ3YXJkcyB0aGV5IHdlcmUgb2YgdGhlIGZvcm0gYEFjdGlvblZpZXc7OlRlbXBsYXRlOjpGb29gLgorICAgICMKKyAgICAjIEBwYXJhbSBuYW1lIFsjdG9fc10gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGdldC4KKyAgICAjICAgRm9yIGV4YW1wbGUsIGA6RXJyb3JgIHdpbGwgcmV0dXJuIGBBY3Rpb25WaWV3OjpUZW1wbGF0ZUVycm9yYAorICAgICMgICBvciBgQWN0aW9uVmlldzo6VGVtcGxhdGU6OkVycm9yYC4KKyAgICBkZWYgYXZfdGVtcGxhdGVfY2xhc3MobmFtZSkKKyAgICAgIHJldHVybiBBY3Rpb25WaWV3LmNvbnN0X2dldCgiVGVtcGxhdGUje25hbWV9IikgaWYgQWN0aW9uVmlldy5jb25zdF9kZWZpbmVkPygiVGVtcGxhdGUje25hbWV9IikKKyAgICAgIEFjdGlvblZpZXc6OlRlbXBsYXRlLmNvbnN0X2dldChuYW1lLnRvX3MpCisgICAgZW5kCisKKyAgICAjIyBDcm9zcy1PUyBDb21wYXRpYmlsaXR5CisgICAgIworICAgICMgVGhlc2UgbWV0aG9kcyBhcmUgY2FjaGVkIGJlY2F1c2Ugc29tZSBvZiB0aGVtIGFyZSBjYWxsZWQgcXVpdGUgZnJlcXVlbnRseQorICAgICMgYW5kIGV2ZW4gYmFzaWMgY2hlY2tzIGxpa2UgU3RyaW5nIz09IGFyZSB0b28gY29zdGx5IHRvIGJlIGNhbGxlZCByZXBlYXRlZGx5LgorCisgICAgIyBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIHJ1bm5pbmcgb24gV2luZG93cy4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiB3aW5kb3dzPworICAgICAgcmV0dXJuIEB3aW5kb3dzIGlmIGRlZmluZWQ/KEB3aW5kb3dzKQorICAgICAgQHdpbmRvd3MgPSAoUmJDb25maWc6OkNPTkZJR1snaG9zdF9vcyddID1+IC9tc3dpbnx3aW5kb3dzfG1pbmd3L2kpCisgICAgZW5kCisKKyAgICAjIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcnVubmluZyBvbiBJcm9uUnVieS4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBpcm9ucnVieT8KKyAgICAgIHJldHVybiBAaXJvbnJ1YnkgaWYgZGVmaW5lZD8oQGlyb25ydWJ5KQorICAgICAgQGlyb25ydWJ5ID0gUlVCWV9FTkdJTkUgPT0gImlyb25ydWJ5IgorICAgIGVuZAorCisgICAgIyBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIHJ1bm5pbmcgb24gUnViaW5pdXMuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYgcmJ4PworICAgICAgcmV0dXJuIEByYnggaWYgZGVmaW5lZD8oQHJieCkKKyAgICAgIEByYnggPSBSVUJZX0VOR0lORSA9PSAicmJ4IgorICAgIGVuZAorCisgICAgIyBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIHJ1bm5pbmcgb24gSlJ1YnkuCisgICAgIworICAgICMgQHJldHVybiBbQm9vbGVhbl0KKyAgICBkZWYganJ1Ynk/CisgICAgICByZXR1cm4gQGpydWJ5IGlmIGRlZmluZWQ/KEBqcnVieSkKKyAgICAgIEBqcnVieSA9IFJVQllfUExBVEZPUk0gPX4gL2phdmEvCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYW4gYXJyYXkgb2YgaW50cyByZXByZXNlbnRpbmcgdGhlIEpSdWJ5IHZlcnNpb24gbnVtYmVyLgorICAgICMKKyAgICAjIEByZXR1cm4gW0FycmF5PEludGVnZXI+XQorICAgIGRlZiBqcnVieV92ZXJzaW9uCisgICAgICBAanJ1YnlfdmVyc2lvbiB8fD0gOjpKUlVCWV9WRVJTSU9OLnNwbGl0KCIuIikubWFwIHt8c3wgcy50b19pfQorICAgIGVuZAorCisgICAgIyBMaWtlIGBEaXIuZ2xvYmAsIGJ1dCB3b3JrcyB3aXRoIGJhY2tzbGFzaC1zZXBhcmF0ZWQgcGF0aHMgb24gV2luZG93cy4KKyAgICAjCisgICAgIyBAcGFyYW0gcGF0aCBbU3RyaW5nXQorICAgIGRlZiBnbG9iKHBhdGgpCisgICAgICBwYXRoID0gcGF0aC50cignXFwnLCAnLycpIGlmIHdpbmRvd3M/CisgICAgICBpZiBibG9ja19naXZlbj8KKyAgICAgICAgRGlyLmdsb2IocGF0aCkge3xmfCB5aWVsZChmKX0KKyAgICAgIGVsc2UKKyAgICAgICAgRGlyLmdsb2IocGF0aCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBMaWtlIGBQYXRobmFtZS5uZXdgLCBidXQgbm9ybWFsaXplcyBXaW5kb3dzIHBhdGhzIHRvIGFsd2F5cyB1c2UgYmFja3NsYXNoCisgICAgIyBzZXBhcmF0b3JzLgorICAgICMKKyAgICAjIGBQYXRobmFtZSNyZWxhdGl2ZV9wYXRoX2Zyb21gIGNhbiBicmVhayBpZiB0aGUgdHdvIHBhdGhuYW1lcyBhcmVuJ3QKKyAgICAjIGNvbnNpc3RlbnQgaW4gdGhlaXIgc2xhc2ggc3R5bGUuCisgICAgIworICAgICMgQHBhcmFtIHBhdGggW1N0cmluZ10KKyAgICAjIEByZXR1cm4gW1BhdGhuYW1lXQorICAgIGRlZiBwYXRobmFtZShwYXRoKQorICAgICAgcGF0aCA9IHBhdGgudHIoIi8iLCAiXFwiKSBpZiB3aW5kb3dzPworICAgICAgUGF0aG5hbWUubmV3KHBhdGgpCisgICAgZW5kCisKKyAgICAjIExpa2UgYFBhdGhuYW1lI2NsZWFucGF0aGAsIGJ1dCBub3JtYWxpemVzIFdpbmRvd3MgcGF0aHMgdG8gYWx3YXlzIHVzZQorICAgICMgYmFja3NsYXNoIHNlcGFyYXRvcnMuIE5vcm1hbGx5LCBgUGF0aG5hbWUjY2xlYW5wYXRoYCBhY3R1YWxseSBkb2VzIHRoZQorICAgICMgcmV2ZXJzZSAtLSBpdCB3aWxsIGNvbnZlcnQgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzLCB3aGljaCBjYW4gYnJlYWsKKyAgICAjIGBQYXRobmFtZSNyZWxhdGl2ZV9wYXRoX2Zyb21gLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFtTdHJpbmcsIFBhdGhuYW1lXQorICAgICMgQHJldHVybiBbUGF0aG5hbWVdCisgICAgZGVmIGNsZWFucGF0aChwYXRoKQorICAgICAgcGF0aCA9IFBhdGhuYW1lLm5ldyhwYXRoKSB1bmxlc3MgcGF0aC5pc19hPyhQYXRobmFtZSkKKyAgICAgIHBhdGhuYW1lKHBhdGguY2xlYW5wYXRoLnRvX3MpCisgICAgZW5kCisKKyAgICAjIFJldHVybnMgYHBhdGhgIHdpdGggYWxsIHN5bWxpbmtzIHJlc29sdmVkLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFtTdHJpbmcsIFBhdGhuYW1lXQorICAgICMgQHJldHVybiBbUGF0aG5hbWVdCisgICAgZGVmIHJlYWxwYXRoKHBhdGgpCisgICAgICBwYXRoID0gUGF0aG5hbWUubmV3KHBhdGgpIHVubGVzcyBwYXRoLmlzX2E/KFBhdGhuYW1lKQorCisgICAgICAjIEV4cGxpY2l0bHkgRE9OJ1QgcnVuICNwYXRobmFtZSBoZXJlLiBXZSBkb24ndCB3YW50IHRvIGNvbnZlcnQKKyAgICAgICMgdG8gV2luZG93cyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBiZWNhdXNlIHdlJ3JlIGNvbXBhcmluZyB0aGVzZQorICAgICAgIyBhZ2FpbnN0IHRoZSBwYXRocyByZXR1cm5lZCBieSBMaXN0ZW4sIHdoaWNoIHVzZSBmb3J3YXJkCisgICAgICAjIHNsYXNoZXMgZXZlcnl3aGVyZS4KKyAgICAgIGJlZ2luCisgICAgICAgIHBhdGgucmVhbHBhdGgKKyAgICAgIHJlc2N1ZSBTeXN0ZW1DYWxsRXJyb3IKKyAgICAgICAgIyBJZiBbcGF0aF0gZG9lc24ndCBhY3R1YWxseSBleGlzdCwgZG9uJ3QgYmFpbCwganVzdAorICAgICAgICAjIHJldHVybiB0aGUgb3JpZ2luYWwuCisgICAgICAgIHBhdGgKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBSZXR1cm5zIGBwYXRoYCByZWxhdGl2ZSB0byBgZnJvbWAuCisgICAgIworICAgICMgVGhpcyBpcyBsaWtlIGBQYXRobmFtZSNyZWxhdGl2ZV9wYXRoX2Zyb21gIGV4Y2VwdCBpdCBhY2NlcHRzIGJvdGggc3RyaW5ncworICAgICMgYW5kIHBhdGhuYW1lcywgaXQgaGFuZGxlcyBXaW5kb3dzIHBhdGggc2VwYXJhdG9ycyBjb3JyZWN0bHksIGFuZCBpdCB0aHJvd3MKKyAgICAjIGFuIGVycm9yIHJhdGhlciB0aGFuIGNyYXNoaW5nIGlmIHRoZSBwYXRocyB1c2UgZGlmZmVyZW50IGVuY29kaW5ncworICAgICMgKGh0dHBzOi8vZ2l0aHViLmNvbS9ydWJ5L3J1YnkvcHVsbC83MTMpLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFtTdHJpbmcsIFBhdGhuYW1lXQorICAgICMgQHBhcmFtIGZyb20gW1N0cmluZywgUGF0aG5hbWVdCisgICAgIyBAcmV0dXJuIFtQYXRobmFtZT9dCisgICAgZGVmIHJlbGF0aXZlX3BhdGhfZnJvbShwYXRoLCBmcm9tKQorICAgICAgcGF0aG5hbWUocGF0aC50b19zKS5yZWxhdGl2ZV9wYXRoX2Zyb20ocGF0aG5hbWUoZnJvbS50b19zKSkKKyAgICByZXNjdWUgTm9NZXRob2RFcnJvciA9PiBlCisgICAgICByYWlzZSBlIHVubGVzcyBlLm5hbWUgPT0gOnplcm8/CisKKyAgICAgICMgV29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL3J1YnkvcnVieS9wdWxsLzcxMy4KKyAgICAgIHBhdGggPSBwYXRoLnRvX3MKKyAgICAgIGZyb20gPSBmcm9tLnRvX3MKKyAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IoIkluY29tcGF0aWJsZSBwYXRoIGVuY29kaW5nczogI3twYXRoLmluc3BlY3R9IGlzICN7cGF0aC5lbmNvZGluZ30sICIgKworICAgICAgICAiI3tmcm9tLmluc3BlY3R9IGlzICN7ZnJvbS5lbmNvZGluZ30iKQorICAgIGVuZAorCisgICAgIyBDb252ZXJ0cyBgcGF0aGAgdG8gYSAiZmlsZToiIFVSSS4gVGhpcyBoYW5kbGVzIFdpbmRvd3MgcGF0aHMgY29ycmVjdGx5LgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFtTdHJpbmcsIFBhdGhuYW1lXQorICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGRlZiBmaWxlX3VyaV9mcm9tX3BhdGgocGF0aCkKKyAgICAgIHBhdGggPSBwYXRoLnRvX3MgaWYgcGF0aC5pc19hPyhQYXRobmFtZSkKKyAgICAgIHBhdGggPSBwYXRoLnRyKCdcXCcsICcvJykgaWYgd2luZG93cz8KKyAgICAgIHBhdGggPSBVUkk6OkRFRkFVTFRfUEFSU0VSLmVzY2FwZShwYXRoKQorICAgICAgcmV0dXJuIHBhdGguc3RhcnRfd2l0aD8oJy8nKSA/ICJmaWxlOi8vIiArIHBhdGggOiBwYXRoIHVubGVzcyB3aW5kb3dzPworICAgICAgcmV0dXJuICJmaWxlOi8vLyIgKyBwYXRoLnRyKCJcXCIsICIvIikgaWYgcGF0aCA9fiAlcnteW2EtekEtWl06Wy9cXF19CisgICAgICByZXR1cm4gImZpbGU6IiArIHBhdGgudHIoIlxcIiwgIi8iKSBpZiBwYXRoID1+ICVye1xcXFxbXlxcXStcXFteXFwvXSt9CisgICAgICBwYXRoLnRyKCJcXCIsICIvIikKKyAgICBlbmQKKworICAgICMgUmV0cmllcyBhIGZpbGVzeXN0ZW0gb3BlcmF0aW9uIGlmIGl0IGZhaWxzIG9uIFdpbmRvd3MuIFdpbmRvd3MKKyAgICAjIGhhcyB3ZWlyZCBhbmQgZmxha3kgbG9ja2luZyBydWxlcyB0aGF0IGNhbiBjYXVzZSBvcGVyYXRpb25zIHRvIGZhaWwuCisgICAgIworICAgICMgQHlpZWxkIFtdIFRoZSBmaWxlc3lzdGVtIG9wZXJhdGlvbi4KKyAgICBkZWYgcmV0cnlfb25fd2luZG93cworICAgICAgcmV0dXJuIHlpZWxkIHVubGVzcyB3aW5kb3dzPworCisgICAgICBiZWdpbgorICAgICAgICB5aWVsZAorICAgICAgcmVzY3VlIFN5c3RlbUNhbGxFcnJvcgorICAgICAgICBzbGVlcCAwLjEKKyAgICAgICAgeWllbGQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBQcmVwYXJlIGEgdmFsdWUgZm9yIGEgZGVzdHJ1Y3R1cmluZyBhc3NpZ25tZW50IChlLmcuIGBhLCBiID0KKyAgICAjIHZhbGApLiBUaGlzIHdvcmtzIGFyb3VuZCBhIHBlcmZvcm1hbmNlIGJ1ZyB3aGVuIHVzaW5nCisgICAgIyBBY3RpdmVTdXBwb3J0LCBhbmQgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgd2hlbiBgdmFsYCBpcyBsaWtlbHkKKyAgICAjIHRvIGJlIGBuaWxgIHJlYXNvbmFibHkgb2Z0ZW4uCisgICAgIworICAgICMgU2VlIFt0aGlzIGJ1ZyByZXBvcnRdKGh0dHA6Ly9yZWRtaW5lLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzQ5MTcpLgorICAgICMKKyAgICAjIEBwYXJhbSB2YWwgW09iamVjdF0KKyAgICAjIEByZXR1cm4gW09iamVjdF0KKyAgICBkZWYgZGVzdHJ1Y3R1cmUodmFsKQorICAgICAgdmFsIHx8IFtdCisgICAgZW5kCisKKyAgICBDSEFSU0VUX1JFR0VYUCA9IC9cQUBjaGFyc2V0ICIoW14iXSspIi8KKyAgICBib20gPSAiXHVGRUZGIgorICAgIFVURl84X0JPTSA9IGJvbS5lbmNvZGUoIlVURi04IikuZm9yY2VfZW5jb2RpbmcoJ0JJTkFSWScpCisgICAgVVRGXzE2QkVfQk9NID0gYm9tLmVuY29kZSgiVVRGLTE2QkUiKS5mb3JjZV9lbmNvZGluZygnQklOQVJZJykKKyAgICBVVEZfMTZMRV9CT00gPSBib20uZW5jb2RlKCJVVEYtMTZMRSIpLmZvcmNlX2VuY29kaW5nKCdCSU5BUlknKQorCisgICAgIyMgQ3Jvc3MtUnVieS1WZXJzaW9uIENvbXBhdGliaWxpdHkKKworICAgICMgV2hldGhlciBvciBub3QgdGhpcyBpcyBydW5uaW5nIHVuZGVyIFJ1YnkgMi40IG9yIGhpZ2hlci4KKyAgICAjCisgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgIGRlZiBydWJ5Ml80PworICAgICAgcmV0dXJuIEBydWJ5Ml80IGlmIGRlZmluZWQ/KEBydWJ5Ml80KQorICAgICAgQHJ1YnkyXzQgPQorICAgICAgICBpZiBSVUJZX1ZFUlNJT05fQ09NUE9ORU5UU1swXSA9PSAyCisgICAgICAgICAgUlVCWV9WRVJTSU9OX0NPTVBPTkVOVFNbMV0gPj0gNAorICAgICAgICBlbHNlCisgICAgICAgICAgUlVCWV9WRVJTSU9OX0NPTVBPTkVOVFNbMF0gPiAyCisgICAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBMaWtlIHtcI2NoZWNrXF9lbmNvZGluZ30sIGJ1dCBhbHNvIGNoZWNrcyBmb3IgYSBgQGNoYXJzZXRgIGRlY2xhcmF0aW9uCisgICAgIyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGFuZCB1c2VzIHRoYXQgZW5jb2RpbmcgaWYgaXQgZXhpc3RzLgorICAgICMKKyAgICAjIFNhc3MgZm9sbG93cyBDU1MncyBkZWNvZGluZyBydWxlcy4KKyAgICAjCisgICAgIyBAcGFyYW0gc3RyIFtTdHJpbmddIFRoZSBzdHJpbmcgb2Ygd2hpY2ggdG8gY2hlY2sgdGhlIGVuY29kaW5nCisgICAgIyBAcmV0dXJuIFsoU3RyaW5nLCBFbmNvZGluZyldIFRoZSBvcmlnaW5hbCBzdHJpbmcgZW5jb2RlZCBhcyBVVEYtOCwKKyAgICAjICAgYW5kIHRoZSBzb3VyY2UgZW5jb2Rpbmcgb2YgdGhlIHN0cmluZworICAgICMgQHJhaXNlIFtFbmNvZGluZzo6VW5kZWZpbmVkQ29udmVyc2lvbkVycm9yXSBpZiB0aGUgc291cmNlIGVuY29kaW5nCisgICAgIyAgIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gVVRGLTgKKyAgICAjIEByYWlzZSBbQXJndW1lbnRFcnJvcl0gaWYgdGhlIGRvY3VtZW50IHVzZXMgYW4gdW5rbm93biBlbmNvZGluZyB3aXRoIGBAY2hhcnNldGAKKyAgICAjIEByYWlzZSBbU2Fzczo6U3ludGF4RXJyb3JdIElmIHRoZSBkb2N1bWVudCBkZWNsYXJlcyBhbiBlbmNvZGluZyB0aGF0CisgICAgIyAgIGRvZXNuJ3QgbWF0Y2ggaXRzIGNvbnRlbnRzLCBvciBpdCBkb2Vzbid0IGRlY2xhcmUgYW4gZW5jb2RpbmcgYW5kIGl0cworICAgICMgICBjb250ZW50cyBhcmUgaW52YWxpZCBpbiB0aGUgbmF0aXZlIGVuY29kaW5nLgorICAgIGRlZiBjaGVja19zYXNzX2VuY29kaW5nKHN0cikKKyAgICAgICMgRGV0ZXJtaW5lIHRoZSBmYWxsYmFjayBlbmNvZGluZyBmb2xsb3dpbmcgc2VjdGlvbiAzLjIgb2YgQ1NTIFN5bnRheCBMZXZlbCAzIGFuZCBFbmNvZGluZ3M6CisgICAgICAjIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3NzLXN5bnRheC0zLTIwMTMwOTE5LyNkZXRlcm1pbmUtdGhlLWZhbGxiYWNrLWVuY29kaW5nCisgICAgICAjIGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2RlY29kZQorICAgICAgYmluYXJ5ID0gc3RyLmR1cC5mb3JjZV9lbmNvZGluZygiQklOQVJZIikKKyAgICAgIGlmIGJpbmFyeS5zdGFydF93aXRoPyhVVEZfOF9CT00pCisgICAgICAgIGJpbmFyeS5zbGljZSEgMCwgVVRGXzhfQk9NLmxlbmd0aAorICAgICAgICBzdHIgPSBiaW5hcnkuZm9yY2VfZW5jb2RpbmcoJ1VURi04JykKKyAgICAgIGVsc2lmIGJpbmFyeS5zdGFydF93aXRoPyhVVEZfMTZCRV9CT00pCisgICAgICAgIGJpbmFyeS5zbGljZSEgMCwgVVRGXzE2QkVfQk9NLmxlbmd0aAorICAgICAgICBzdHIgPSBiaW5hcnkuZm9yY2VfZW5jb2RpbmcoJ1VURi0xNkJFJykKKyAgICAgIGVsc2lmIGJpbmFyeS5zdGFydF93aXRoPyhVVEZfMTZMRV9CT00pCisgICAgICAgIGJpbmFyeS5zbGljZSEgMCwgVVRGXzE2TEVfQk9NLmxlbmd0aAorICAgICAgICBzdHIgPSBiaW5hcnkuZm9yY2VfZW5jb2RpbmcoJ1VURi0xNkxFJykKKyAgICAgIGVsc2lmIGJpbmFyeSA9fiBDSEFSU0VUX1JFR0VYUAorICAgICAgICBjaGFyc2V0ID0gJDEuZm9yY2VfZW5jb2RpbmcoJ1VTLUFTQ0lJJykKKyAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZy5maW5kKGNoYXJzZXQpCisgICAgICAgIGlmIGVuY29kaW5nLm5hbWUgPT0gJ1VURi0xNicgfHwgZW5jb2RpbmcubmFtZSA9PSAnVVRGLTE2QkUnCisgICAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZy5maW5kKCdVVEYtOCcpCisgICAgICAgIGVuZAorICAgICAgICBzdHIgPSBiaW5hcnkuZm9yY2VfZW5jb2RpbmcoZW5jb2RpbmcpCisgICAgICBlbHNpZiBzdHIuZW5jb2RpbmcubmFtZSA9PSAiQVNDSUktOEJJVCIKKyAgICAgICAgIyBOb3JtYWxseSB3ZSB3YW50IHRvIGZhbGwgYmFjayBvbiBiZWxpZXZpbmcgdGhlIFJ1Ynkgc3RyaW5nCisgICAgICAgICMgZW5jb2RpbmcsIGJ1dCBpZiB0aGF0J3MganVzdCBiaW5hcnkgd2Ugd2FudCB0byBtYWtlIHN1cmUKKyAgICAgICAgIyBpdCdzIHZhbGlkIFVURi04LgorICAgICAgICBzdHIgPSBzdHIuZm9yY2VfZW5jb2RpbmcoJ3V0Zi04JykKKyAgICAgIGVuZAorCisgICAgICBmaW5kX2VuY29kaW5nX2Vycm9yKHN0cikgdW5sZXNzIHN0ci52YWxpZF9lbmNvZGluZz8KKworICAgICAgYmVnaW4KKyAgICAgICAgIyBJZiB0aGUgc3RyaW5nIGlzIHZhbGlkLCBwcmVwcm9jZXNzIGl0IGFjY29yZGluZyB0byBzZWN0aW9uIDMuMyBvZiBDU1MgU3ludGF4IExldmVsIDMuCisgICAgICAgIHJldHVybiBzdHIuZW5jb2RlKCJVVEYtOCIpLmdzdWIoL1xyXG4/fFxmLywgIlxuIikudHIoIlx1MDAwMCIsICLvv70iKSwgc3RyLmVuY29kaW5nCisgICAgICByZXNjdWUgRW5jb2RpbmdFcnJvcgorICAgICAgICBmaW5kX2VuY29kaW5nX2Vycm9yKHN0cikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBEZXN0cnVjdGl2ZWx5IHJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgdGhhdCBtYXRjaCBhIGJsb2NrLCBhbmQKKyAgICAjIHJldHVybnMgdGhlIHJlbW92ZWQgZWxlbWVudHMuCisgICAgIworICAgICMgQHBhcmFtIGFycmF5IFtBcnJheV0gVGhlIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIGVsZW1lbnRzLgorICAgICMgQHlpZWxkIFtlbF0gQ2FsbGVkIGZvciBlYWNoIGVsZW1lbnQuCisgICAgIyBAeWllbGRwYXJhbSBlbCBbKl0gVGhlIGVsZW1lbnQgdG8gdGVzdC4KKyAgICAjIEB5aWVsZHJldHVybiBbQm9vbGVhbl0gV2hldGhlciBvciBub3QgdG8gZXh0cmFjdCB0aGUgZWxlbWVudC4KKyAgICAjIEByZXR1cm4gW0FycmF5XSBUaGUgZXh0cmFjdGVkIGVsZW1lbnRzLgorICAgIGRlZiBleHRyYWN0IShhcnJheSkKKyAgICAgIG91dCA9IFtdCisgICAgICBhcnJheS5yZWplY3QhIGRvIHxlfAorICAgICAgICBuZXh0IGZhbHNlIHVubGVzcyB5aWVsZCBlCisgICAgICAgIG91dCA8PCBlCisgICAgICAgIHRydWUKKyAgICAgIGVuZAorICAgICAgb3V0CisgICAgZW5kCisKKyAgICAjIEZsYXR0ZW5zIHRoZSBmaXJzdCBsZXZlbCBvZiBuZXN0ZWQgYXJyYXlzIGluIGBhcnJzYC4gVW5saWtlCisgICAgIyBgQXJyYXkjZmxhdHRlbmAsIHRoaXMgb3JkZXJzIHRoZSByZXN1bHQgYnkgdGFraW5nIHRoZSBmaXJzdAorICAgICMgdmFsdWVzIGZyb20gZWFjaCBhcnJheSBpbiBvcmRlciwgdGhlbiB0aGUgc2Vjb25kLCBhbmQgc28gb24uCisgICAgIworICAgICMgQHBhcmFtIGFycnMgW0FycmF5XSBUaGUgYXJyYXkgdG8gZmxhdHRlbi4KKyAgICAjIEByZXR1cm4gW0FycmF5XSBUaGUgZmxhdHRlbmVkIGFycmF5LgorICAgIGRlZiBmbGF0dGVuX3ZlcnRpY2FsbHkoYXJycykKKyAgICAgIHJlc3VsdCA9IFtdCisgICAgICBhcnJzID0gYXJycy5tYXAge3xzdWJ8IHN1Yi5pc19hPyhBcnJheSkgPyBzdWIuZHVwIDogQXJyYXkoc3ViKX0KKyAgICAgIHVudGlsIGFycnMuZW1wdHk/CisgICAgICAgIGFycnMucmVqZWN0ISBkbyB8YXJyfAorICAgICAgICAgIHJlc3VsdCA8PCBhcnIuc2hpZnQKKyAgICAgICAgICBhcnIuZW1wdHk/CisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgICMgTGlrZSBgT2JqZWN0I2luc3BlY3RgLCBidXQgcHJlc2VydmVzIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHJhdGhlciB0aGFuCisgICAgIyBlc2NhcGluZyB0aGVtIHVuZGVyIFJ1YnkgMS45LjIuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHRoZQorICAgICMgcHJlY29tcGlsZWQgSGFtbCB0ZW1wbGF0ZSBjYW4gYmUgYCNlbmNvZGVgZCBpbnRvIGBAb3B0aW9uc1s6ZW5jb2RpbmddYAorICAgICMgYmVmb3JlIGJlaW5nIGV2YWx1YXRlZC4KKyAgICAjCisgICAgIyBAcGFyYW0gb2JqIHtPYmplY3R9CisgICAgIyBAcmV0dXJuIHtTdHJpbmd9CisgICAgZGVmIGluc3BlY3Rfb2JqKG9iaikKKyAgICAgIHJldHVybiBvYmouaW5zcGVjdCB1bmxlc3MgdmVyc2lvbl9nZXEoUlVCWV9WRVJTSU9OLCAiMS45LjIiKQorICAgICAgcmV0dXJuICc6JyArIGluc3BlY3Rfb2JqKG9iai50b19zKSBpZiBvYmouaXNfYT8oU3ltYm9sKQorICAgICAgcmV0dXJuIG9iai5pbnNwZWN0IHVubGVzcyBvYmouaXNfYT8oU3RyaW5nKQorICAgICAgJyInICsgb2JqLmdzdWIoL1tceDAwLVx4N0ZdKy8pIHt8c3wgcy5pbnNwZWN0WzEuLi4tMV19ICsgJyInCisgICAgZW5kCisKKyAgICAjIEV4dHJhY3RzIHRoZSBub24tc3RyaW5nIHZsYXVlcyBmcm9tIGFuIGFycmF5IGNvbnRhaW5pbmcgYm90aCBzdHJpbmdzIGFuZCBub24tc3RyaW5ncy4KKyAgICAjIFRoZXNlIHZhbHVlcyBhcmUgcmVwbGFjZWQgd2l0aCBlc2NhcGUgc2VxdWVuY2VzLgorICAgICMgVGhpcyBjYW4gYmUgdW5kb25lIHVzaW5nIFx7I2luamVjdFxfdmFsdWVzfS4KKyAgICAjCisgICAgIyBUaGlzIGlzIHVzZWZ1bCBlLmcuIHdoZW4gd2Ugd2FudCB0byBkbyBzdHJpbmcgbWFuaXB1bGF0aW9uCisgICAgIyBvbiBhbiBpbnRlcnBvbGF0ZWQgc3RyaW5nLgorICAgICMKKyAgICAjIFRoZSBwcmVjaXNlIGZvcm1hdCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyBub3QgZ3VhcmFudGVlZC4KKyAgICAjIEhvd2V2ZXIsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBuZXdsaW5lcyBhbmQgd2hpdGVzcGFjZSB3b24ndCBiZSBhZmZlY3RlZC4KKyAgICAjCisgICAgIyBAcGFyYW0gYXJyIFtBcnJheV0gVGhlIGFycmF5IGZyb20gd2hpY2ggdmFsdWVzIGFyZSBleHRyYWN0ZWQuCisgICAgIyBAcmV0dXJuIFsoU3RyaW5nLCBBcnJheSldIFRoZSByZXN1bHRpbmcgc3RyaW5nLCBhbmQgYW4gYXJyYXkgb2YgZXh0cmFjdGVkIHZhbHVlcy4KKyAgICBkZWYgZXh0cmFjdF92YWx1ZXMoYXJyKQorICAgICAgdmFsdWVzID0gW10KKyAgICAgIG1hcHBlZCA9IGFyci5tYXAgZG8gfGV8CisgICAgICAgIG5leHQgZS5nc3ViKCd7JywgJ3t7JykgaWYgZS5pc19hPyhTdHJpbmcpCisgICAgICAgIHZhbHVlcyA8PCBlCisgICAgICAgIG5leHQgInsje3ZhbHVlcy5jb3VudCAtIDF9fSIKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIG1hcHBlZC5qb2luLCB2YWx1ZXMKKyAgICBlbmQKKworICAgICMgVW5kb2VzIFx7I2V4dHJhY3RcX3ZhbHVlc30gYnkgdHJhbnNmb3JtaW5nIGEgc3RyaW5nIHdpdGggZXNjYXBlIHNlcXVlbmNlcworICAgICMgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzIGFuZCBub24tc3RyaW5nIHZhbHVlcy4KKyAgICAjCisgICAgIyBAcGFyYW0gc3RyIFtTdHJpbmddIFRoZSBzdHJpbmcgd2l0aCBlc2NhcGUgc2VxdWVuY2VzLgorICAgICMgQHBhcmFtIHZhbHVlcyBbQXJyYXldIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gaW5qZWN0LgorICAgICMgQHJldHVybiBbQXJyYXldIFRoZSBhcnJheSBvZiBzdHJpbmdzIGFuZCB2YWx1ZXMuCisgICAgZGVmIGluamVjdF92YWx1ZXMoc3RyLCB2YWx1ZXMpCisgICAgICByZXR1cm4gW3N0ci5nc3ViKCd7eycsICd7JyldIGlmIHZhbHVlcy5lbXB0eT8KKyAgICAgICMgQWRkIGFuIGV4dHJhIHsgc28gdGhhdCB3ZSBwcm9jZXNzIHRoZSB0YWlsIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICByZXN1bHQgPSAoc3RyICsgJ3t7Jykuc2NhbigvKC4qPykoPzooXHtceyl8XHsoXGQrKVx9KS9tKS5tYXAgZG8gfChwcmUsIGVzYywgbil8CisgICAgICAgIFtwcmUsIGVzYyA/ICd7JyA6ICcnLCBuID8gdmFsdWVzW24udG9faV0gOiAnJ10KKyAgICAgIGVuZC5mbGF0dGVuKDEpCisgICAgICByZXN1bHRbLTJdID0gJycgIyBHZXQgcmlkIG9mIHRoZSBleHRyYSB7CisgICAgICBtZXJnZV9hZGphY2VudF9zdHJpbmdzKHJlc3VsdCkucmVqZWN0IHt8c3wgcyA9PSAnJ30KKyAgICBlbmQKKworICAgICMgQWxsb3dzIG1vZGlmaWNhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBzdHJpbmcgZm9ybQorICAgICMgb2YgYW4gYXJyYXkgY29udGFpbmluZyBib3RoIHN0cmluZ3MgYW5kIG5vbi1zdHJpbmdzLgorICAgICMKKyAgICAjIEBwYXJhbSBhcnIgW0FycmF5XSBUaGUgYXJyYXkgZnJvbSB3aGljaCB2YWx1ZXMgYXJlIGV4dHJhY3RlZC4KKyAgICAjIEB5aWVsZCBbc3RyXSBBIGJsb2NrIGluIHdoaWNoIHN0cmluZyBtYW5pcHVsYXRpb24gY2FuIGJlIGRvbmUgdG8gdGhlIGFycmF5LgorICAgICMgQHlpZWxkcGFyYW0gc3RyIFtTdHJpbmddIFRoZSBzdHJpbmcgZm9ybSBvZiBgYXJyYC4KKyAgICAjIEB5aWVsZHJldHVybiBbU3RyaW5nXSBUaGUgbW9kaWZpZWQgc3RyaW5nLgorICAgICMgQHJldHVybiBbQXJyYXldIFRoZSBtb2RpZmllZCwgaW50ZXJwb2xhdGVkIGFycmF5LgorICAgIGRlZiB3aXRoX2V4dHJhY3RlZF92YWx1ZXMoYXJyKQorICAgICAgc3RyLCB2YWxzID0gZXh0cmFjdF92YWx1ZXMoYXJyKQorICAgICAgc3RyID0geWllbGQgc3RyCisgICAgICBpbmplY3RfdmFsdWVzKHN0ciwgdmFscykKKyAgICBlbmQKKworICAgICMgQnVpbGRzIGEgc291cmNlbWFwIGZpbGUgbmFtZSBnaXZlbiB0aGUgZ2VuZXJhdGVkIENTUyBmaWxlIG5hbWUuCisgICAgIworICAgICMgQHBhcmFtIGNzcyBbU3RyaW5nXSBUaGUgZ2VuZXJhdGVkIENTUyBmaWxlIG5hbWUuCisgICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBzb3VyY2UgbWFwIGZpbGUgbmFtZS4KKyAgICBkZWYgc291cmNlbWFwX25hbWUoY3NzKQorICAgICAgY3NzICsgIi5tYXAiCisgICAgZW5kCisKKyAgICAjIEVzY2FwZXMgY2VydGFpbiBjaGFyYWN0ZXJzIHNvIHRoYXQgdGhlIHJlc3VsdCBjYW4gYmUgdXNlZAorICAgICMgYXMgdGhlIEpTT04gc3RyaW5nIHZhbHVlLiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzdHJpbmcgaWYKKyAgICAjIG5vIGVzY2FwaW5nIGlzIG5lY2Vzc2FyeS4KKyAgICAjCisgICAgIyBAcGFyYW0gcyBbU3RyaW5nXSBUaGUgc3RyaW5nIHRvIGJlIGVzY2FwZWQKKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIGVzY2FwZWQgc3RyaW5nCisgICAgZGVmIGpzb25fZXNjYXBlX3N0cmluZyhzKQorICAgICAgcmV0dXJuIHMgaWYgcyAhfiAvWyJcXFxiXGZcblxyXHRdLworCisgICAgICByZXN1bHQgPSAiIgorICAgICAgcy5zcGxpdCgiIikuZWFjaCBkbyB8Y3wKKyAgICAgICAgY2FzZSBjCisgICAgICAgIHdoZW4gJyInLCAiXFwiCisgICAgICAgICAgcmVzdWx0IDw8ICJcXCIgPDwgYworICAgICAgICB3aGVuICJcbiIgdGhlbiByZXN1bHQgPDwgIlxcbiIKKyAgICAgICAgd2hlbiAiXHQiIHRoZW4gcmVzdWx0IDw8ICJcXHQiCisgICAgICAgIHdoZW4gIlxyIiB0aGVuIHJlc3VsdCA8PCAiXFxyIgorICAgICAgICB3aGVuICJcZiIgdGhlbiByZXN1bHQgPDwgIlxcZiIKKyAgICAgICAgd2hlbiAiXGIiIHRoZW4gcmVzdWx0IDw8ICJcXGIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXN1bHQgPDwgYworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgcmVzdWx0CisgICAgZW5kCisKKyAgICAjIENvbnZlcnRzIHRoZSBhcmd1bWVudCBpbnRvIGEgdmFsaWQgSlNPTiB2YWx1ZS4KKyAgICAjCisgICAgIyBAcGFyYW0gdiBbSW50ZWdlciwgU3RyaW5nLCBBcnJheSwgQm9vbGVhbiwgbmlsXQorICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgIGRlZiBqc29uX3ZhbHVlX29mKHYpCisgICAgICBjYXNlIHYKKyAgICAgIHdoZW4gSW50ZWdlcgorICAgICAgICB2LnRvX3MKKyAgICAgIHdoZW4gU3RyaW5nCisgICAgICAgICJcIiIgKyBqc29uX2VzY2FwZV9zdHJpbmcodikgKyAiXCIiCisgICAgICB3aGVuIEFycmF5CisgICAgICAgICJbIiArIHYubWFwIHt8eHwganNvbl92YWx1ZV9vZih4KX0uam9pbigiLCIpICsgIl0iCisgICAgICB3aGVuIE5pbENsYXNzCisgICAgICAgICJudWxsIgorICAgICAgd2hlbiBUcnVlQ2xhc3MKKyAgICAgICAgInRydWUiCisgICAgICB3aGVuIEZhbHNlQ2xhc3MKKyAgICAgICAgImZhbHNlIgorICAgICAgZWxzZQorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiVW5rbm93biB0eXBlOiAje3YuY2xhc3MubmFtZX0iKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBWTFFfQkFTRV9TSElGVCA9IDUKKyAgICBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQKKyAgICBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxCisgICAgVkxRX0NPTlRJTlVBVElPTl9CSVQgPSBWTFFfQkFTRQorCisgICAgQkFTRTY0X0RJR0lUUyA9ICgnQScuLidaJykudG9fYSArICgnYScuLid6JykudG9fYSArICgnMCcuLic5JykudG9fYSArIFsnKycsICcvJ10KKyAgICBCQVNFNjRfRElHSVRfTUFQID0gYmVnaW4KKyAgICAgIG1hcCA9IHt9CisgICAgICBCQVNFNjRfRElHSVRTLmVhY2hfd2l0aF9pbmRleC5tYXAgZG8gfGRpZ2l0LCBpfAorICAgICAgICBtYXBbZGlnaXRdID0gaQorICAgICAgZW5kCisgICAgICBtYXAKKyAgICBlbmQKKworICAgICMgRW5jb2RlcyBgdmFsdWVgIGFzIFZMUSAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WTFEpLgorICAgICMKKyAgICAjIEBwYXJhbSB2YWx1ZSBbSW50ZWdlcl0KKyAgICAjIEByZXR1cm4gW1N0cmluZ10gVGhlIGVuY29kZWQgdmFsdWUKKyAgICBkZWYgZW5jb2RlX3ZscSh2YWx1ZSkKKyAgICAgIGlmIHZhbHVlIDwgMAorICAgICAgICB2YWx1ZSA9ICgoLXZhbHVlKSA8PCAxKSB8IDEKKyAgICAgIGVsc2UKKyAgICAgICAgdmFsdWUgPDw9IDEKKyAgICAgIGVuZAorCisgICAgICByZXN1bHQgPSAnJworICAgICAgYmVnaW4KKyAgICAgICAgZGlnaXQgPSB2YWx1ZSAmIFZMUV9CQVNFX01BU0sKKyAgICAgICAgdmFsdWUgPj49IFZMUV9CQVNFX1NISUZUCisgICAgICAgIGlmIHZhbHVlID4gMAorICAgICAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUCisgICAgICAgIGVuZAorICAgICAgICByZXN1bHQgPDwgQkFTRTY0X0RJR0lUU1tkaWdpdF0KKyAgICAgIGVuZCB3aGlsZSB2YWx1ZSA+IDAKKyAgICAgIHJlc3VsdAorICAgIGVuZAorCisgICAgIyMgU3RhdGljIE1ldGhvZCBTdHVmZgorCisgICAgIyBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRVJCIGZvciBceyNkZWZcX3N0YXRpY1xfbWV0aG9kfSB3aWxsIGJlIHJ1bi4KKyAgICBjbGFzcyBTdGF0aWNDb25kaXRpb25hbENvbnRleHQKKyAgICAgICMgQHBhcmFtIHNldCBbI2luY2x1ZGU/XSBUaGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGFyZSBkZWZpbmVkIGZvciB0aGlzIGNvbnRleHQuCisgICAgICBkZWYgaW5pdGlhbGl6ZShzZXQpCisgICAgICAgIEBzZXQgPSBzZXQKKyAgICAgIGVuZAorCisgICAgICAjIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIHZhcmlhYmxlIGlzIGRlZmluZWQgZm9yIHRoaXMgY29udGV4dC4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIG5hbWUgW1N5bWJvbF0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlCisgICAgICAjIEByZXR1cm4gW0Jvb2xlYW5dCisgICAgICBkZWYgbWV0aG9kX21pc3NpbmcobmFtZSwgKmFyZ3MpCisgICAgICAgIHN1cGVyIHVubGVzcyBhcmdzLmVtcHR5PyAmJiAhYmxvY2tfZ2l2ZW4/CisgICAgICAgIEBzZXQuaW5jbHVkZT8obmFtZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBAcHJpdmF0ZQorICAgIEFUT01JQ19XUklURV9NVVRFWCA9IE11dGV4Lm5ldworCisgICAgIyBUaGlzIGNyZWF0ZXMgYSB0ZW1wIGZpbGUgYW5kIHlpZWxkcyBpdCBmb3Igd3JpdGluZy4gV2hlbiB0aGUKKyAgICAjIHdyaXRlIGlzIGNvbXBsZXRlLCB0aGUgZmlsZSBpcyBtb3ZlZCBpbnRvIHRoZSBkZXNpcmVkIGxvY2F0aW9uLgorICAgICMgVGhlIGF0b21pY2l0eSBvZiB0aGlzIG9wZXJhdGlvbiBpcyBwcm92aWRlZCBieSB0aGUgZmlsZXN5c3RlbSdzCisgICAgIyByZW5hbWUgb3BlcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBmaWxlbmFtZSBbU3RyaW5nXSBUaGUgZmlsZSB0byB3cml0ZSB0by4KKyAgICAjIEBwYXJhbSBwZXJtcyBbSW50ZWdlcl0gVGhlIHBlcm1pc3Npb25zIHVzZWQgZm9yIGNyZWF0aW5nIHRoaXMgZmlsZS4KKyAgICAjICAgV2lsbCBiZSBtYXNrZWQgYnkgdGhlIHByb2Nlc3MgdW1hc2suIERlZmF1bHRzIHRvIHJlYWRhYmxlL3dyaXRlYWJsZQorICAgICMgICBieSBhbGwgdXNlcnMgaG93ZXZlciB0aGUgdW1hc2sgdXN1YWxseSBjaGFuZ2VzIHRoaXMgdG8gb25seSBiZSB3cml0YWJsZQorICAgICMgICBieSB0aGUgcHJvY2VzcydzIHVzZXIuCisgICAgIyBAeWllbGRwYXJhbSB0bXBmaWxlIFtUZW1wZmlsZV0gVGhlIHRlbXAgZmlsZSB0aGF0IGNhbiBiZSB3cml0dGVuIHRvLgorICAgICMgQHJldHVybiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGJsb2NrLgorICAgIGRlZiBhdG9taWNfY3JlYXRlX2FuZF93cml0ZV9maWxlKGZpbGVuYW1lLCBwZXJtcyA9IDA2NjYpCisgICAgICByZXF1aXJlICd0ZW1wZmlsZScKKyAgICAgIHRtcGZpbGUgPSBUZW1wZmlsZS5uZXcoRmlsZS5iYXNlbmFtZShmaWxlbmFtZSksIEZpbGUuZGlybmFtZShmaWxlbmFtZSkpCisgICAgICB0bXBmaWxlLmJpbm1vZGUgaWYgdG1wZmlsZS5yZXNwb25kX3RvPyg6YmlubW9kZSkKKyAgICAgIHJlc3VsdCA9IHlpZWxkIHRtcGZpbGUKKyAgICAgIHRtcGZpbGUuY2xvc2UKKyAgICAgIEFUT01JQ19XUklURV9NVVRFWC5zeW5jaHJvbml6ZSBkbworICAgICAgICBiZWdpbgorICAgICAgICAgIEZpbGUuY2htb2QocGVybXMgJiB+RmlsZS51bWFzaywgdG1wZmlsZS5wYXRoKQorICAgICAgICByZXNjdWUgRXJybm86OkVQRVJNCisgICAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIHBlcm1pc3Npb25zIHRvIGNobW9kIHRoZSBmaWxlLCBkb24ndCBsZXQgdGhhdCBjcmFzaAorICAgICAgICAgICMgdGhlIGNvbXBpbGF0aW9uLiBTZWUgaXNzdWUgMTIxNS4KKyAgICAgICAgZW5kCisgICAgICAgIEZpbGUucmVuYW1lIHRtcGZpbGUucGF0aCwgZmlsZW5hbWUKKyAgICAgIGVuZAorICAgICAgcmVzdWx0CisgICAgZW5zdXJlCisgICAgICAjIGNsb3NlIGFuZCByZW1vdmUgdGhlIHRlbXBmaWxlIGlmIGl0IHN0aWxsIGV4aXN0cywKKyAgICAgICMgcHJlc3VtYWJseSBkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHdyaXRlCisgICAgICB0bXBmaWxlLmNsb3NlIGlmIHRtcGZpbGUKKyAgICAgIHRtcGZpbGUudW5saW5rIGlmIHRtcGZpbGUKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBmaW5kX2VuY29kaW5nX2Vycm9yKHN0cikKKyAgICAgIGVuY29kaW5nID0gc3RyLmVuY29kaW5nCisgICAgICBjciA9IFJlZ2V4cC5xdW90ZSgiXHIiLmVuY29kZShlbmNvZGluZykuZm9yY2VfZW5jb2RpbmcoJ0JJTkFSWScpKQorICAgICAgbGYgPSBSZWdleHAucXVvdGUoIlxuIi5lbmNvZGUoZW5jb2RpbmcpLmZvcmNlX2VuY29kaW5nKCdCSU5BUlknKSkKKyAgICAgIGZmID0gUmVnZXhwLnF1b3RlKCJcZiIuZW5jb2RlKGVuY29kaW5nKS5mb3JjZV9lbmNvZGluZygnQklOQVJZJykpCisgICAgICBsaW5lX2JyZWFrID0gLyN7Y3J9I3tsZn0/fCN7ZmZ9fCN7bGZ9LworCisgICAgICBzdHIuZm9yY2VfZW5jb2RpbmcoImJpbmFyeSIpLnNwbGl0KGxpbmVfYnJlYWspLmVhY2hfd2l0aF9pbmRleCBkbyB8bGluZSwgaXwKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBsaW5lLmVuY29kZShlbmNvZGluZykKKyAgICAgICAgcmVzY3VlIEVuY29kaW5nOjpVbmRlZmluZWRDb252ZXJzaW9uRXJyb3IgPT4gZQorICAgICAgICAgIHJhaXNlIFNhc3M6OlN5bnRheEVycm9yLm5ldygKKyAgICAgICAgICAgICJJbnZhbGlkICN7ZW5jb2RpbmcubmFtZX0gY2hhcmFjdGVyICN7dW5kZWZpbmVkX2NvbnZlcnNpb25fZXJyb3JfY2hhcihlKX0iLAorICAgICAgICAgICAgOmxpbmUgPT4gaSArIDEpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgV2Ugc2hvdWxkbid0IGdldCBoZXJlLCBidXQgaXQncyBwb3NzaWJsZSBzb21lIHdlaXJkIGVuY29kaW5nIHN0dWZmIGNhdXNlcyBpdC4KKyAgICAgIHJldHVybiBzdHIsIHN0ci5lbmNvZGluZworICAgIGVuZAorCisgICAgIyBDYWxjdWxhdGVzIHRoZSBtZW1vaXphdGlvbiB0YWJsZSBmb3IgdGhlIExlYXN0IENvbW1vbiBTdWJzZXF1ZW5jZSBhbGdvcml0aG0uCisgICAgIyBBbGdvcml0aG0gZnJvbSBbV2lraXBlZGlhXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xvbmdlc3RfY29tbW9uX3N1YnNlcXVlbmNlX3Byb2JsZW0jQ29tcHV0aW5nX3RoZV9sZW5ndGhfb2ZfdGhlX0xDUykKKyAgICBkZWYgbGNzX3RhYmxlKHgsIHkpCisgICAgICAjIFRoaXMgbWV0aG9kIGRvZXMgbm90IHRha2UgYSBibG9jayBhcyBhbiBleHBsaWNpdCBwYXJhbWV0ZXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgICAgICBjID0gQXJyYXkubmV3KHguc2l6ZSkge1tdfQorICAgICAgeC5zaXplLnRpbWVzIHt8aXwgY1tpXVswXSA9IDB9CisgICAgICB5LnNpemUudGltZXMge3xqfCBjWzBdW2pdID0gMH0KKyAgICAgICgxLi4ueC5zaXplKS5lYWNoIGRvIHxpfAorICAgICAgICAoMS4uLnkuc2l6ZSkuZWFjaCBkbyB8anwKKyAgICAgICAgICBjW2ldW2pdID0KKyAgICAgICAgICAgIGlmIHlpZWxkIHhbaV0sIHlbal0KKyAgICAgICAgICAgICAgY1tpIC0gMV1baiAtIDFdICsgMQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBbY1tpXVtqIC0gMV0sIGNbaSAtIDFdW2pdXS5tYXgKKyAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgYworICAgIGVuZAorICAgICMgcnVib2NvcDpkaXNhYmxlIFBhcmFtZXRlckxpc3RzCisKKyAgICAjIENvbXB1dGVzIGEgc2luZ2xlIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlIGZvciBhcnJheXMgeCBhbmQgeS4KKyAgICAjIEFsZ29yaXRobSBmcm9tIFtXaWtpcGVkaWFdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9uZ2VzdF9jb21tb25fc3Vic2VxdWVuY2VfcHJvYmxlbSNSZWFkaW5nX291dF9hbl9MQ1MpCisgICAgZGVmIGxjc19iYWNrdHJhY2UoYywgeCwgeSwgaSwgaiwgJmJsb2NrKQorICAgICAgIyBydWJvY29wOmVuYWJsZSBQYXJhbWV0ZXJMaXN0CisgICAgICByZXR1cm4gW10gaWYgaSA9PSAwIHx8IGogPT0gMAorICAgICAgaWYgKHYgPSB5aWVsZCh4W2ldLCB5W2pdKSkKKyAgICAgICAgcmV0dXJuIGxjc19iYWNrdHJhY2UoYywgeCwgeSwgaSAtIDEsIGogLSAxLCAmYmxvY2spIDw8IHYKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gbGNzX2JhY2t0cmFjZShjLCB4LCB5LCBpLCBqIC0gMSwgJmJsb2NrKSBpZiBjW2ldW2ogLSAxXSA+IGNbaSAtIDFdW2pdCisgICAgICBsY3NfYmFja3RyYWNlKGMsIHgsIHksIGkgLSAxLCBqLCAmYmxvY2spCisgICAgZW5kCisKKyAgICBzaW5nbGV0b25fbWV0aG9kcy5lYWNoIHt8bWV0aG9kfCBtb2R1bGVfZnVuY3Rpb24gbWV0aG9kfQorICBlbmQKK2VuZAorCityZXF1aXJlICdzYXNzL3V0aWwvbXVsdGlieXRlX3N0cmluZ19zY2FubmVyJworcmVxdWlyZSAnc2Fzcy91dGlsL25vcm1hbGl6ZWRfbWFwJwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy91dGlsL211bHRpYnl0ZV9zdHJpbmdfc2Nhbm5lci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdXRpbC9tdWx0aWJ5dGVfc3RyaW5nX3NjYW5uZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMDdmMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdXRpbC9tdWx0aWJ5dGVfc3RyaW5nX3NjYW5uZXIucmIKQEAgLTAsMCArMSwxNTEgQEAKK3JlcXVpcmUgJ3N0cnNjYW4nCisKK2lmIFNhc3M6OlV0aWwucmJ4PworICAjIFJ1YmluaXVzJ3MgU3RyaW5nU2Nhbm5lciBjbGFzcyBpbXBsZW1lbnRzIHNvbWUgb2YgaXRzIG1ldGhvZHMgaW4gdGVybXMgb2YKKyAgIyBvdGhlcnMsIHdoaWNoIGNhdXNlcyB1cyB0byBkb3VibGUtY291bnQgYnl0ZXMgaW4gc29tZSBjYXNlcyBpZiB3ZSBkbworICAjIHN0cmFpZ2h0Zm9yd2FyZCBpbmhlcml0YW5jZS4gVG8gd29yayBhcm91bmQgdGhpcywgd2UgdXNlIGEgZGVsZWdhdGUgY2xhc3MuCisgIHJlcXVpcmUgJ2RlbGVnYXRlJworICBjbGFzcyBTYXNzOjpVdGlsOjpNdWx0aWJ5dGVTdHJpbmdTY2FubmVyIDwgRGVsZWdhdGVDbGFzcyhTdHJpbmdTY2FubmVyKQorICAgIGRlZiBpbml0aWFsaXplKHN0cikKKyAgICAgIHN1cGVyKFN0cmluZ1NjYW5uZXIubmV3KHN0cikpCisgICAgICBAbWJfcG9zID0gMAorICAgICAgQG1iX21hdGNoZWRfc2l6ZSA9IG5pbAorICAgICAgQG1iX2xhc3RfcG9zID0gbmlsCisgICAgZW5kCisKKyAgICBkZWYgaXNfYT8oa2xhc3MpCisgICAgICBfX2dldG9ial9fLmlzX2E/KGtsYXNzKSB8fCBzdXBlcgorICAgIGVuZAorICBlbmQKK2Vsc2UKKyAgY2xhc3MgU2Fzczo6VXRpbDo6TXVsdGlieXRlU3RyaW5nU2Nhbm5lciA8IFN0cmluZ1NjYW5uZXIKKyAgICBkZWYgaW5pdGlhbGl6ZShzdHIpCisgICAgICBzdXBlcgorICAgICAgQG1iX3BvcyA9IDAKKyAgICAgIEBtYl9tYXRjaGVkX3NpemUgPSBuaWwKKyAgICAgIEBtYl9sYXN0X3BvcyA9IG5pbAorICAgIGVuZAorICBlbmQKK2VuZAorCisjIEEgd3JhcHBlciBvZiB0aGUgbmF0aXZlIFN0cmluZ1NjYW5uZXIgY2xhc3MgdGhhdCB3b3JrcyBjb3JyZWN0bHkgd2l0aAorIyBtdWx0aWJ5dGUgY2hhcmFjdGVyIGVuY29kaW5ncy4gVGhlIG5hdGl2ZSBjbGFzcyBkZWFscyBvbmx5IGluIGJ5dGVzLCBub3QKKyMgY2hhcmFjdGVycywgZm9yIG1ldGhvZHMgbGlrZSBbI3Bvc10gYW5kIFsjbWF0Y2hlZF9zaXplXS4gVGhpcyBjbGFzcyBkZWFscworIyBvbmx5IGluIGNoYXJhY3RlcnMsIGluc3RlYWQuCitjbGFzcyBTYXNzOjpVdGlsOjpNdWx0aWJ5dGVTdHJpbmdTY2FubmVyCisgIGRlZiBzZWxmLm5ldyhzdHIpCisgICAgcmV0dXJuIFN0cmluZ1NjYW5uZXIubmV3KHN0cikgaWYgc3RyLmFzY2lpX29ubHk/CisgICAgc3VwZXIKKyAgZW5kCisKKyAgYWxpYXNfbWV0aG9kIDpieXRlX3BvcywgOnBvcworICBhbGlhc19tZXRob2QgOmJ5dGVfbWF0Y2hlZF9zaXplLCA6bWF0Y2hlZF9zaXplCisKKyAgZGVmIGNoZWNrKHBhdHRlcm4pOyBfbWF0Y2ggc3VwZXI7IGVuZAorICBkZWYgY2hlY2tfdW50aWwocGF0dGVybik7IF9tYXRjaGVkIHN1cGVyOyBlbmQKKyAgZGVmIGdldGNoOyBfZm9yd2FyZCBfbWF0Y2ggc3VwZXI7IGVuZAorICBkZWYgbWF0Y2g/KHBhdHRlcm4pOyBfc2l6ZSBjaGVjayhwYXR0ZXJuKTsgZW5kCisgIGRlZiBtYXRjaGVkX3NpemU7IEBtYl9tYXRjaGVkX3NpemU7IGVuZAorICBkZWYgcGVlayhsZW4pOyBzdHJpbmdbQG1iX3BvcywgbGVuXTsgZW5kCisgIGFsaWFzX21ldGhvZCA6cGVlcCwgOnBlZWsKKyAgZGVmIHBvczsgQG1iX3BvczsgZW5kCisgIGFsaWFzX21ldGhvZCA6cG9pbnRlciwgOnBvcworICBkZWYgcmVzdF9zaXplOyByZXN0LnNpemU7IGVuZAorICBkZWYgc2NhbihwYXR0ZXJuKTsgX2ZvcndhcmQgX21hdGNoIHN1cGVyOyBlbmQKKyAgZGVmIHNjYW5fdW50aWwocGF0dGVybik7IF9mb3J3YXJkIF9tYXRjaGVkIHN1cGVyOyBlbmQKKyAgZGVmIHNraXAocGF0dGVybik7IF9zaXplIHNjYW4ocGF0dGVybik7IGVuZAorICBkZWYgc2tpcF91bnRpbChwYXR0ZXJuKTsgX21hdGNoZWQgX3NpemUgc2Nhbl91bnRpbChwYXR0ZXJuKTsgZW5kCisKKyAgZGVmIGdldF9ieXRlCisgICAgcmFpc2UgIk11bHRpYnl0ZVN0cmluZ1NjYW5uZXIgZG9lc24ndCBzdXBwb3J0ICNnZXRfYnl0ZS4iCisgIGVuZAorCisgIGRlZiBnZXRieXRlCisgICAgcmFpc2UgIk11bHRpYnl0ZVN0cmluZ1NjYW5uZXIgZG9lc24ndCBzdXBwb3J0ICNnZXRieXRlLiIKKyAgZW5kCisKKyAgZGVmIHBvcz0obikKKyAgICBAbWJfbGFzdF9wb3MgPSBuaWwKKworICAgICMgV2Ugc2V0IHBvc2l0aW9uIGtpbmQgb2YgYSBsb3QgZHVyaW5nIHBhcnNpbmcsIHNvIHdlIHdhbnQgaXQgdG8gYmUgYXMKKyAgICAjIGVmZmljaWVudCBhcyBwb3NzaWJsZS4gVGhpcyBpcyBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IFVURi04IGlzIGEKKyAgICAjIHZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZywgc28gaXQncyBkaWZmaWN1bHQgdG8gZmluZCB0aGUgYnl0ZSBsZW5ndGggdGhhdAorICAgICMgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgbGVuZ3RoLgorICAgICMKKyAgICAjIE91ciBoZXVyaXN0aWMgaGVyZSBpcyB0byB0cnkgdG8gY291bnQgdGhlIGZld2VzdCBwb3NzaWJsZSBjaGFyYWN0ZXJzLiBTbworICAgICMgaWYgdGhlIG5ldyBwb3NpdGlvbiBpcyBjbG9zZSB0byB0aGUgY3VycmVudCBvbmUsIGp1c3QgY291bnQgdGhlCisgICAgIyBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHR3bzsgaWYgdGhlIG5ldyBwb3NpdGlvbiBpcyBjbG9zZXIgdG8gdGhlCisgICAgIyBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZywganVzdCBjb3VudCB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZXJlLgorICAgIGlmIEBtYl9wb3MgLSBuIDwgQG1iX3BvcyAvIDIKKyAgICAgICMgTmV3IHBvc2l0aW9uIGlzIGNsb3NlIHRvIG9sZCBwb3NpdGlvbgorICAgICAgYnl0ZV9kZWx0YSA9IEBtYl9wb3MgPiBuID8gLXN0cmluZ1tuLi4uQG1iX3Bvc10uYnl0ZXNpemUgOiBzdHJpbmdbQG1iX3Bvcy4uLm5dLmJ5dGVzaXplCisgICAgICBzdXBlcihieXRlX3BvcyArIGJ5dGVfZGVsdGEpCisgICAgZWxzZQorICAgICAgIyBOZXcgcG9zaXRpb24gaXMgY2xvc2UgdG8gQk9TCisgICAgICBzdXBlcihzdHJpbmdbMC4uLm5dLmJ5dGVzaXplKQorICAgIGVuZAorICAgIEBtYl9wb3MgPSBuCisgIGVuZAorCisgIGRlZiByZXNldAorICAgIEBtYl9wb3MgPSAwCisgICAgQG1iX21hdGNoZWRfc2l6ZSA9IG5pbAorICAgIEBtYl9sYXN0X3BvcyA9IG5pbAorICAgIHN1cGVyCisgIGVuZAorCisgIGRlZiBzY2FuX2Z1bGwocGF0dGVybiwgYWR2YW5jZV9wb2ludGVyX3AsIHJldHVybl9zdHJpbmdfcCkKKyAgICByZXMgPSBfbWF0Y2ggc3VwZXIocGF0dGVybiwgYWR2YW5jZV9wb2ludGVyX3AsIHRydWUpCisgICAgX2ZvcndhcmQgcmVzIGlmIGFkdmFuY2VfcG9pbnRlcl9wCisgICAgcmV0dXJuIHJlcyBpZiByZXR1cm5fc3RyaW5nX3AKKyAgZW5kCisKKyAgZGVmIHNlYXJjaF9mdWxsKHBhdHRlcm4sIGFkdmFuY2VfcG9pbnRlcl9wLCByZXR1cm5fc3RyaW5nX3ApCisgICAgcmVzID0gc3VwZXIocGF0dGVybiwgYWR2YW5jZV9wb2ludGVyX3AsIHRydWUpCisgICAgX2ZvcndhcmQgcmVzIGlmIGFkdmFuY2VfcG9pbnRlcl9wCisgICAgX21hdGNoZWQoKHJlcyBpZiByZXR1cm5fc3RyaW5nX3ApKQorICBlbmQKKworICBkZWYgc3RyaW5nPShzdHIpCisgICAgQG1iX3BvcyA9IDAKKyAgICBAbWJfbWF0Y2hlZF9zaXplID0gbmlsCisgICAgQG1iX2xhc3RfcG9zID0gbmlsCisgICAgc3VwZXIKKyAgZW5kCisKKyAgZGVmIHRlcm1pbmF0ZQorICAgIEBtYl9wb3MgPSBzdHJpbmcuc2l6ZQorICAgIEBtYl9tYXRjaGVkX3NpemUgPSBuaWwKKyAgICBAbWJfbGFzdF9wb3MgPSBuaWwKKyAgICBzdXBlcgorICBlbmQKKyAgYWxpYXNfbWV0aG9kIDpjbGVhciwgOnRlcm1pbmF0ZQorCisgIGRlZiB1bnNjYW4KKyAgICBzdXBlcgorICAgIEBtYl9wb3MgPSBAbWJfbGFzdF9wb3MKKyAgICBAbWJfbGFzdF9wb3MgPSBAbWJfbWF0Y2hlZF9zaXplID0gbmlsCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgX3NpemUoc3RyKQorICAgIHN0ciAmJiBzdHIuc2l6ZQorICBlbmQKKworICBkZWYgX21hdGNoKHN0cikKKyAgICBAbWJfbWF0Y2hlZF9zaXplID0gc3RyICYmIHN0ci5zaXplCisgICAgc3RyCisgIGVuZAorCisgIGRlZiBfbWF0Y2hlZChyZXMpCisgICAgX21hdGNoIG1hdGNoZWQKKyAgICByZXMKKyAgZW5kCisKKyAgZGVmIF9mb3J3YXJkKHN0cikKKyAgICBAbWJfbGFzdF9wb3MgPSBAbWJfcG9zCisgICAgQG1iX3BvcyArPSBzdHIuc2l6ZSBpZiBzdHIKKyAgICBzdHIKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdXRpbC9ub3JtYWxpemVkX21hcC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdXRpbC9ub3JtYWxpemVkX21hcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmUzYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy91dGlsL25vcm1hbGl6ZWRfbWFwLnJiCkBAIC0wLDAgKzEsMTIyIEBACityZXF1aXJlICdkZWxlZ2F0ZScKKworbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFV0aWwKKyAgICAjIEEgaGFzaCB0aGF0IG5vcm1hbGl6ZXMgaXRzIHN0cmluZyBrZXlzIHdoaWxlIHN0aWxsIGFsbG93aW5nIHlvdSB0byBnZXQgYmFjaworICAgICMgdG8gdGhlIG9yaWdpbmFsIGtleXMgdGhhdCB3ZXJlIHN0b3JlZC4gSWYgc2V2ZXJhbCBkaWZmZXJlbnQgdmFsdWVzIG5vcm1hbGl6ZQorICAgICMgdG8gdGhlIHNhbWUgdmFsdWUsIHdoaWNoZXZlciBpcyBzdG9yZWQgbGFzdCB3aW5zLgorICAgIGNsYXNzIE5vcm1hbGl6ZWRNYXAKKyAgICAgICMgQ3JlYXRlIGEgbm9ybWFsaXplZCBtYXAKKyAgICAgIGRlZiBpbml0aWFsaXplKG1hcCA9IG5pbCkKKyAgICAgICAgQGtleV9zdHJpbmdzID0ge30KKyAgICAgICAgQG1hcCA9IHt9CisKKyAgICAgICAgbWFwLmVhY2gge3xrZXksIHZhbHVlfCBzZWxmW2tleV0gPSB2YWx1ZX0gaWYgbWFwCisgICAgICBlbmQKKworICAgICAgIyBTcGVjaWZpZXMgaG93IHRvIHRyYW5zZm9ybSB0aGUga2V5LgorICAgICAgIworICAgICAgIyBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRvIGNyZWF0ZSBvdGhlciBub3JtYWxpemF0aW9uIGJlaGF2aW9ycy4KKyAgICAgIGRlZiBub3JtYWxpemUoa2V5KQorICAgICAgICBrZXkudHIoIi0iLCAiXyIpCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIGBrZXlgIGFzIGl0IHdhcyBzdG9yZWQgYmVmb3JlCisgICAgICAjIG5vcm1hbGl6YXRpb24uIElmIGBrZXlgIGlzbid0IGluIHRoZSBtYXAsIHJldHVybnMgaXQgYXMgaXQgd2FzCisgICAgICAjIHBhc3NlZCBpbi4KKyAgICAgICMKKyAgICAgICMgQHJldHVybiBbU3RyaW5nXQorICAgICAgZGVmIGRlbm9ybWFsaXplKGtleSkKKyAgICAgICAgQGtleV9zdHJpbmdzW25vcm1hbGl6ZShrZXkpXSB8fCBrZXkKKyAgICAgIGVuZAorCisgICAgICAjIEBwcml2YXRlCisgICAgICBkZWYgW109KGssIHYpCisgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemUoaykKKyAgICAgICAgQG1hcFtub3JtYWxpemVkXSA9IHYKKyAgICAgICAgQGtleV9zdHJpbmdzW25vcm1hbGl6ZWRdID0gaworICAgICAgICB2CisgICAgICBlbmQKKworICAgICAgIyBAcHJpdmF0ZQorICAgICAgZGVmIFtdKGspCisgICAgICAgIEBtYXBbbm9ybWFsaXplKGspXQorICAgICAgZW5kCisKKyAgICAgICMgQHByaXZhdGUKKyAgICAgIGRlZiBoYXNfa2V5PyhrKQorICAgICAgICBAbWFwLmhhc19rZXk/KG5vcm1hbGl6ZShrKSkKKyAgICAgIGVuZAorCisgICAgICAjIEBwcml2YXRlCisgICAgICBkZWYgZGVsZXRlKGspCisgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemUoaykKKyAgICAgICAgQGtleV9zdHJpbmdzLmRlbGV0ZShub3JtYWxpemVkKQorICAgICAgICBAbWFwLmRlbGV0ZShub3JtYWxpemVkKQorICAgICAgZW5kCisKKyAgICAgICMgQHJldHVybiBbSGFzaF0gSGFzaCB3aXRoIHRoZSBrZXlzIGFzIHRoZXkgd2VyZSBzdG9yZWQgKGJlZm9yZSBub3JtYWxpemF0aW9uKS4KKyAgICAgIGRlZiBhc19zdG9yZWQKKyAgICAgICAgU2Fzczo6VXRpbC5tYXBfa2V5cyhAbWFwKSB7fGt8IEBrZXlfc3RyaW5nc1trXX0KKyAgICAgIGVuZAorCisgICAgICBkZWYgZW1wdHk/CisgICAgICAgIEBtYXAuZW1wdHk/CisgICAgICBlbmQKKworICAgICAgZGVmIHZhbHVlcworICAgICAgICBAbWFwLnZhbHVlcworICAgICAgZW5kCisKKyAgICAgIGRlZiBrZXlzCisgICAgICAgIEBtYXAua2V5cworICAgICAgZW5kCisKKyAgICAgIGRlZiBlYWNoCisgICAgICAgIEBtYXAuZWFjaCB7fGssIHZ8IHlpZWxkKGssIHYpfQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzaXplCisgICAgICAgIEBtYXAuc2l6ZQorICAgICAgZW5kCisKKyAgICAgIGRlZiB0b19oYXNoCisgICAgICAgIEBtYXAuZHVwCisgICAgICBlbmQKKworICAgICAgZGVmIHRvX2EKKyAgICAgICAgQG1hcC50b19hCisgICAgICBlbmQKKworICAgICAgZGVmIG1hcAorICAgICAgICBAbWFwLm1hcCB7fGssIHZ8IHlpZWxkKGssIHYpfQorICAgICAgZW5kCisKKyAgICAgIGRlZiBkdXAKKyAgICAgICAgZCA9IHN1cGVyCisgICAgICAgIGQuc2VuZCg6aW5zdGFuY2VfdmFyaWFibGVfc2V0LCAiQG1hcCIsIEBtYXAuZHVwKQorICAgICAgICBkCisgICAgICBlbmQKKworICAgICAgZGVmIHNvcnRfYnkKKyAgICAgICAgQG1hcC5zb3J0X2J5IHt8aywgdnwgeWllbGQgaywgdn0KKyAgICAgIGVuZAorCisgICAgICBkZWYgdXBkYXRlKG1hcCkKKyAgICAgICAgbWFwID0gbWFwLmFzX3N0b3JlZCBpZiBtYXAuaXNfYT8oTm9ybWFsaXplZE1hcCkKKyAgICAgICAgbWFwLmVhY2gge3xrLCB2fCBzZWxmW2tdID0gdn0KKyAgICAgIGVuZAorCisgICAgICBkZWYgbWV0aG9kX21pc3NpbmcobWV0aG9kLCAqYXJncywgJmJsb2NrKQorICAgICAgICBpZiBTYXNzLnRlc3RzX3J1bm5pbmcKKyAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygiVGhlIG1ldGhvZCAje21ldGhvZH0gbXVzdCBiZSBpbXBsZW1lbnRlZCBleHBsaWNpdGx5IikKKyAgICAgICAgZW5kCisgICAgICAgIEBtYXAuc2VuZChtZXRob2QsICphcmdzLCAmYmxvY2spCisgICAgICBlbmQKKworICAgICAgZGVmIHJlc3BvbmRfdG9fbWlzc2luZz8obWV0aG9kLCBpbmNsdWRlX3ByaXZhdGUgPSBmYWxzZSkKKyAgICAgICAgQG1hcC5yZXNwb25kX3RvPyhtZXRob2QsIGluY2x1ZGVfcHJpdmF0ZSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy91dGlsL3N1YnNldF9tYXAucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3V0aWwvc3Vic2V0X21hcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQwMWYyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS9saWIvc2Fzcy91dGlsL3N1YnNldF9tYXAucmIKQEAgLTAsMCArMSwxMDkgQEAKK3JlcXVpcmUgJ3NldCcKKworbW9kdWxlIFNhc3MKKyAgbW9kdWxlIFV0aWwKKyAgICAjIEEgbWFwIGZyb20gc2V0cyB0byB2YWx1ZXMuCisgICAgIyBBIHZhbHVlIGlzIFx7I1xbXT0gc2V0fSBieSBwcm92aWRpbmcgYSBzZXQgKHRoZSAic2V0LXNldCIpIGFuZCBhIHZhbHVlLAorICAgICMgd2hpY2ggaXMgdGhlbiByZWNvcmRlZCBhcyBjb3JyZXNwb25kaW5nIHRvIHRoYXQgc2V0LgorICAgICMgVmFsdWVzIGFyZSBceyNcW10gYWNjZXNzZWR9IGJ5IHByb3ZpZGluZyBhIHNldCAodGhlICJnZXQtc2V0IikKKyAgICAjIGFuZCByZXR1cm5pbmcgYWxsIHZhbHVlcyB0aGF0IGNvcnJlc3BvbmQgdG8gc2V0LXNldHMKKyAgICAjIHRoYXQgYXJlIHN1YnNldHMgb2YgdGhlIGdldC1zZXQuCisgICAgIworICAgICMgU3Vic2V0TWFwIHByZXNlcnZlcyB0aGUgb3JkZXIgb2YgdmFsdWVzIGFzIHRoZXkncmUgaW5zZXJ0ZWQuCisgICAgIworICAgICMgQGV4YW1wbGUKKyAgICAjICAgc3NtID0gU3Vic2V0TWFwLm5ldworICAgICMgICBzc21bU2V0WzEsIDJdXSA9ICJGb28iCisgICAgIyAgIHNzbVtTZXRbMiwgM11dID0gIkJhciIKKyAgICAjICAgc3NtW1NldFsxLCAyLCAzXV0gPSAiQmF6IgorICAgICMKKyAgICAjICAgc3NtW1NldFsxLCAyLCAzXV0gIz0+IFsiRm9vIiwgIkJhciIsICJCYXoiXQorICAgIGNsYXNzIFN1YnNldE1hcAorICAgICAgIyBDcmVhdGVzIGEgbmV3LCBlbXB0eSBTdWJzZXRNYXAuCisgICAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgICBAaGFzaCA9IHt9CisgICAgICAgIEB2YWxzID0gW10KKyAgICAgIGVuZAorCisgICAgICAjIFdoZXRoZXIgb3Igbm90IHRoaXMgU3Vic2V0TWFwIGhhcyBhbnkga2V5LXZhbHVlIHBhaXJzLgorICAgICAgIworICAgICAgIyBAcmV0dXJuIFtCb29sZWFuXQorICAgICAgZGVmIGVtcHR5PworICAgICAgICBAaGFzaC5lbXB0eT8KKyAgICAgIGVuZAorCisgICAgICAjIEFzc29jaWF0ZXMgYSB2YWx1ZSB3aXRoIGEgc2V0LgorICAgICAgIyBXaGVuIGBzZXRgIG9yIGFueSBvZiBpdHMgc3VwZXJzZXRzIGlzIGFjY2Vzc2VkLAorICAgICAgIyBgdmFsdWVgIHdpbGwgYmUgYW1vbmcgdGhlIHZhbHVlcyByZXR1cm5lZC4KKyAgICAgICMKKyAgICAgICMgTm90ZSB0aGF0IGlmIHRoZSBzYW1lIGBzZXRgIGlzIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcywKKyAgICAgICMgYWxsIGdpdmVuIGB2YWx1ZWBzIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgYHNldGAuCisgICAgICAjCisgICAgICAjIFRoaXMgcnVucyBpbiBgTyhuKWAgdGltZSwgd2hlcmUgYG5gIGlzIHRoZSBzaXplIG9mIGBzZXRgLgorICAgICAgIworICAgICAgIyBAcGFyYW0gc2V0IFsjdG9fc2V0XSBUaGUgc2V0IHRvIHVzZSBhcyB0aGUgbWFwIGtleS4gTWF5IG5vdCBiZSBlbXB0eS4KKyAgICAgICMgQHBhcmFtIHZhbHVlIFtPYmplY3RdIFRoZSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCBgc2V0YC4KKyAgICAgICMgQHJhaXNlIFtBcmd1bWVudEVycm9yXSBJZiBgc2V0YCBpcyBlbXB0eS4KKyAgICAgIGRlZiBbXT0oc2V0LCB2YWx1ZSkKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoIlN1YnNldE1hcCBrZXlzIG1heSBub3QgYmUgZW1wdHkuIikgaWYgc2V0LmVtcHR5PworCisgICAgICAgIGluZGV4ID0gQHZhbHMuc2l6ZQorICAgICAgICBAdmFscyA8PCB2YWx1ZQorICAgICAgICBzZXQuZWFjaCBkbyB8a3wKKyAgICAgICAgICBAaGFzaFtrXSB8fD0gW10KKyAgICAgICAgICBAaGFzaFtrXSA8PCBbc2V0LCBzZXQudG9fc2V0LCBpbmRleF0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgIyBSZXR1cm5zIGFsbCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHN1YnNldHMgb2YgYHNldGAuCisgICAgICAjCisgICAgICAjIEluIHRoZSB3b3JzdCBjYXNlLCB0aGlzIHJ1bnMgaW4gYE8obSptYXgobiwgbG9nIG0pKWAgdGltZSwKKyAgICAgICMgd2hlcmUgYG5gIGlzIHRoZSBzaXplIG9mIGBzZXRgCisgICAgICAjIGFuZCBgbWAgaXMgdGhlIG51bWJlciBvZiBhc3NvY2lhdGlvbnMgaW4gdGhlIG1hcC4KKyAgICAgICMgSG93ZXZlciwgdW5sZXNzIG1hbnkga2V5cyBpbiB0aGUgbWFwIG92ZXJsYXAgd2l0aCBgc2V0YCwKKyAgICAgICMgYG1gIHdpbGwgdHlwaWNhbGx5IGJlIG11Y2ggc21hbGxlci4KKyAgICAgICMKKyAgICAgICMgQHBhcmFtIHNldCBbU2V0XSBUaGUgc2V0IHRvIHVzZSBhcyB0aGUgbWFwIGtleS4KKyAgICAgICMgQHJldHVybiBbQXJyYXk8KE9iamVjdCwgI3RvX3NldCk+XSBBbiBhcnJheSBvZiBwYWlycywKKyAgICAgICMgICB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHN1YnNldCBvZiBgc2V0YCwKKyAgICAgICMgICBhbmQgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGF0IHN1YnNldCBvZiBgc2V0YAorICAgICAgIyAgIChvciB3aGF0ZXZlciBgI3RvX3NldGAgb2JqZWN0IHdhcyB1c2VkIHRvIHNldCB0aGUgdmFsdWUpCisgICAgICAjICAgVGhpcyBhcnJheSBpcyBpbiBpbnNlcnRpb24gb3JkZXIuCisgICAgICAjIEBzZWUgI1tdCisgICAgICBkZWYgZ2V0KHNldCkKKyAgICAgICAgcmVzID0gc2V0Lm1hcCBkbyB8a3wKKyAgICAgICAgICBzdWJzZXRzID0gQGhhc2hba10KKyAgICAgICAgICBuZXh0IHVubGVzcyBzdWJzZXRzCisgICAgICAgICAgc3Vic2V0cy5tYXAgZG8gfHN1YmVudW0sIHN1YnNldCwgaW5kZXh8CisgICAgICAgICAgICBuZXh0IHVubGVzcyBzdWJzZXQuc3Vic2V0PyhzZXQpCisgICAgICAgICAgICBbaW5kZXgsIHN1YmVudW1dCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZC5mbGF0dGVuKDEpCisgICAgICAgIHJlcy5jb21wYWN0IQorICAgICAgICByZXMudW5pcSEKKyAgICAgICAgcmVzLnNvcnQhCisgICAgICAgIHJlcy5tYXAhIHt8aSwgc3wgW0B2YWxzW2ldLCBzXX0KKyAgICAgICAgcmVzCisgICAgICBlbmQKKworICAgICAgIyBTYW1lIGFzIFx7I2dldH0sIGJ1dCBkb2Vzbid0IHJldHVybiB0aGUgc3Vic2V0cyBvZiB0aGUgYXJndW1lbnQKKyAgICAgICMgZm9yIHdoaWNoIHZhbHVlcyB3ZXJlIGZvdW5kLgorICAgICAgIworICAgICAgIyBAcGFyYW0gc2V0IFtTZXRdIFRoZSBzZXQgdG8gdXNlIGFzIHRoZSBtYXAga2V5LgorICAgICAgIyBAcmV0dXJuIFtBcnJheV0gVGhlIGFycmF5IG9mIGFsbCB2YWx1ZXMKKyAgICAgICMgICBhc3NvY2lhdGVkIHdpdGggc3Vic2V0cyBvZiBgc2V0YCwgaW4gaW5zZXJ0aW9uIG9yZGVyLgorICAgICAgIyBAc2VlICNnZXQKKyAgICAgIGRlZiBbXShzZXQpCisgICAgICAgIGdldChzZXQpLm1hcCB7fHYsIF98IHZ9CisgICAgICBlbmQKKworICAgICAgIyBJdGVyYXRlcyBvdmVyIGVhY2ggdmFsdWUgaW4gdGhlIHN1YnNldCBtYXAuIElnbm9yZXMga2V5cyBjb21wbGV0ZWx5LiBJZgorICAgICAgIyBtdWx0aXBsZSBrZXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUsIHRoaXMgd2lsbCByZXR1cm4gdGhlbSBtdWx0aXBsZSB0aW1lcy4KKyAgICAgICMKKyAgICAgICMgQHlpZWxkIFtPYmplY3RdIEVhY2ggdmFsdWUgaW4gdGhlIG1hcC4KKyAgICAgIGRlZiBlYWNoX3ZhbHVlCisgICAgICAgIEB2YWxzLmVhY2gge3x2fCB5aWVsZCB2fQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3V0aWwvdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdXRpbC90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWU4MWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3V0aWwvdGVzdC5yYgpAQCAtMCwwICsxLDkgQEAKK21vZHVsZSBTYXNzCisgIG1vZHVsZSBVdGlsCisgICAgbW9kdWxlIFRlc3QKKyAgICAgIGRlZiBza2lwKG1zZyA9IG5pbCwgYnQgPSBjYWxsZXIpCisgICAgICAgIHN1cGVyIGlmIGRlZmluZWQ/KHN1cGVyKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3ZlcnNpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL2xpYi9zYXNzL3ZlcnNpb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmMzMwYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvbGliL3Nhc3MvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDEyMiBAQAorcmVxdWlyZSAnZGF0ZScKK3JlcXVpcmUgJ3Nhc3MvdXRpbCcKKworbW9kdWxlIFNhc3MKKyAgIyBIYW5kbGVzIFNhc3MgdmVyc2lvbi1yZXBvcnRpbmcuCisgICMgU2FzcyBub3Qgb25seSByZXBvcnRzIHRoZSBzdGFuZGFyZCB0aHJlZSB2ZXJzaW9uIG51bWJlcnMsCisgICMgYnV0IGl0cyBHaXQgcmV2aXNpb24gaGFzaCBhcyB3ZWxsLAorICAjIGlmIGl0IHdhcyBpbnN0YWxsZWQgZnJvbSBHaXQuCisgIG1vZHVsZSBWZXJzaW9uCisgICAgIyBSZXR1cm5zIGEgaGFzaCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgU2Fzcy4KKyAgICAjIFRoZSBgOm1ham9yYCwgYDptaW5vcmAsIGFuZCBgOnRlZW55YCBrZXlzIGhhdmUgdGhlaXIgcmVzcGVjdGl2ZSBudW1iZXJzIGFzIEludGVnZXJzLgorICAgICMgVGhlIGA6bmFtZWAga2V5IGhhcyB0aGUgbmFtZSBvZiB0aGUgdmVyc2lvbi4KKyAgICAjIFRoZSBgOnN0cmluZ2Aga2V5IGNvbnRhaW5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZXJzaW9uLgorICAgICMgVGhlIGA6bnVtYmVyYCBrZXkgaXMgdGhlIG1ham9yLCBtaW5vciwgYW5kIHRlZW55IGtleXMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMuCisgICAgIyBUaGUgYDpkYXRlYCBrZXksIHdoaWNoIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGRlZmluZWQsIGlzIHRoZSBgRGF0ZVRpbWVgCisgICAgIyAgIGF0IHdoaWNoIHRoaXMgcmVsZWFzZSB3YXMgY3V0LgorICAgICMgSWYgU2FzcyBpcyBjaGVja2VkIG91dCBmcm9tIEdpdCwgdGhlIGA6cmV2YCBrZXkgd2lsbCBoYXZlIHRoZSByZXZpc2lvbiBoYXNoLgorICAgICMgRm9yIGV4YW1wbGU6CisgICAgIworICAgICMgICAgIHsKKyAgICAjICAgICAgIDpzdHJpbmcgPT4gIjIuMS4wLjk2MTYzOTMiLAorICAgICMgICAgICAgOnJldiAgICA9PiAiOTYxNjM5M2I4OTI0ZWYzNjYzOWM3ZTgyYWE4OGE1MWEyNGQxNjk0OSIsCisgICAgIyAgICAgICA6bnVtYmVyID0+ICIyLjEuMCIsCisgICAgIyAgICAgICA6ZGF0ZSAgID0+IERhdGVUaW1lLnBhcnNlKCJBcHIgMzAgMTM6NTI6MDEgMjAwOSAtMDcwMCIpLAorICAgICMgICAgICAgOm1ham9yICA9PiAyLCA6bWlub3IgPT4gMSwgOnRlZW55ID0+IDAKKyAgICAjICAgICB9CisgICAgIworICAgICMgSWYgYSBwcmVyZWxlYXNlIHZlcnNpb24gb2YgU2FzcyBpcyBiZWluZyB1c2VkLAorICAgICMgdGhlIGA6c3RyaW5nYCBhbmQgYDpudW1iZXJgIGZpZWxkcyB3aWxsIHJlZmxlY3QgdGhlIGZ1bGwgdmVyc2lvbgorICAgICMgKGUuZy4gYCIyLjIuYmV0YS4xImApLCBhbmQgdGhlIGA6dGVlbnlgIGZpZWxkIHdpbGwgYmUgYC0xYC4KKyAgICAjIEEgYDpwcmVyZWxlYXNlYCBrZXkgd2lsbCBjb250YWluIHRoZSBuYW1lIG9mIHRoZSBwcmVyZWxlYXNlIChlLmcuIGAiYmV0YSJgKSwKKyAgICAjIGFuZCBhIGA6cHJlcmVsZWFzZV9udW1iZXJgIGtleSB3aWxsIGNvbnRhaW4gdGhlIHJlcmVsZWFzZSBudW1iZXIuCisgICAgIyBGb3IgZXhhbXBsZToKKyAgICAjCisgICAgIyAgICAgeworICAgICMgICAgICAgOnN0cmluZyA9PiAiMy4wLmJldGEuMSIsCisgICAgIyAgICAgICA6bnVtYmVyID0+ICIzLjAuYmV0YS4xIiwKKyAgICAjICAgICAgIDpkYXRlICAgPT4gRGF0ZVRpbWUucGFyc2UoIk1hciAzMSAwMDozODowNCAyMDEwIC0wNzAwIiksCisgICAgIyAgICAgICA6bWFqb3IgPT4gMywgOm1pbm9yID0+IDAsIDp0ZWVueSA9PiAtMSwKKyAgICAjICAgICAgIDpwcmVyZWxlYXNlID0+ICJiZXRhIiwKKyAgICAjICAgICAgIDpwcmVyZWxlYXNlX251bWJlciA9PiAxCisgICAgIyAgICAgfQorICAgICMKKyAgICAjIEByZXR1cm4gW3tTeW1ib2wgPT4gU3RyaW5nL0ludGVnZXJ9XSBUaGUgdmVyc2lvbiBoYXNoCisgICAgIyBAY29tbWVudAorICAgIGRlZiB2ZXJzaW9uCisgICAgICByZXR1cm4gQEB2ZXJzaW9uIGlmIGRlZmluZWQ/KEBAdmVyc2lvbikKKworICAgICAgbnVtYmVycyA9IEZpbGUucmVhZChTYXNzOjpVdGlsLnNjb3BlKCdWRVJTSU9OJykpLnN0cmlwLnNwbGl0KCcuJykuCisgICAgICAgIG1hcCB7fG58IG4gPX4gL15bMC05XSskLyA/IG4udG9faSA6IG59CisgICAgICBuYW1lID0gRmlsZS5yZWFkKFNhc3M6OlV0aWwuc2NvcGUoJ1ZFUlNJT05fTkFNRScpKS5zdHJpcAorICAgICAgQEB2ZXJzaW9uID0geworICAgICAgICA6bWFqb3IgPT4gbnVtYmVyc1swXSwKKyAgICAgICAgOm1pbm9yID0+IG51bWJlcnNbMV0sCisgICAgICAgIDp0ZWVueSA9PiBudW1iZXJzWzJdLAorICAgICAgICA6bmFtZSA9PiBuYW1lCisgICAgICB9CisKKyAgICAgIGlmIChkYXRlID0gdmVyc2lvbl9kYXRlKQorICAgICAgICBAQHZlcnNpb25bOmRhdGVdID0gZGF0ZQorICAgICAgZW5kCisKKyAgICAgIGlmIG51bWJlcnNbM10uaXNfYT8oU3RyaW5nKQorICAgICAgICBAQHZlcnNpb25bOnRlZW55XSA9IC0xCisgICAgICAgIEBAdmVyc2lvbls6cHJlcmVsZWFzZV0gPSBudW1iZXJzWzNdCisgICAgICAgIEBAdmVyc2lvbls6cHJlcmVsZWFzZV9udW1iZXJdID0gbnVtYmVyc1s0XQorICAgICAgZW5kCisKKyAgICAgIEBAdmVyc2lvbls6bnVtYmVyXSA9IG51bWJlcnMuam9pbignLicpCisgICAgICBAQHZlcnNpb25bOnN0cmluZ10gPSBAQHZlcnNpb25bOm51bWJlcl0uZHVwCisKKyAgICAgIGlmIChyZXYgPSByZXZpc2lvbl9udW1iZXIpCisgICAgICAgIEBAdmVyc2lvbls6cmV2XSA9IHJldgorICAgICAgICB1bmxlc3MgcmV2WzBdID09ID8oCisgICAgICAgICAgQEB2ZXJzaW9uWzpzdHJpbmddIDw8ICIuIiA8PCByZXZbMC4uLjddCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEBAdmVyc2lvbls6c3RyaW5nXSA8PCAiICgje25hbWV9KSIKKyAgICAgIEBAdmVyc2lvbgorICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIHJldmlzaW9uX251bWJlcgorICAgICAgaWYgRmlsZS5leGlzdD8oU2Fzczo6VXRpbC5zY29wZSgnUkVWSVNJT04nKSkKKyAgICAgICAgcmV2ID0gRmlsZS5yZWFkKFNhc3M6OlV0aWwuc2NvcGUoJ1JFVklTSU9OJykpLnN0cmlwCisgICAgICAgIHJldHVybiByZXYgdW5sZXNzIHJldiA9fiAvXihbYS1mMC05XSt8XCguKlwpKSQvIHx8IHJldiA9PSAnKHVua25vd24pJworICAgICAgZW5kCisKKyAgICAgIHJldHVybiB1bmxlc3MgRmlsZS5leGlzdD8oU2Fzczo6VXRpbC5zY29wZSgnLmdpdC9IRUFEJykpCisgICAgICByZXYgPSBGaWxlLnJlYWQoU2Fzczo6VXRpbC5zY29wZSgnLmdpdC9IRUFEJykpLnN0cmlwCisgICAgICByZXR1cm4gcmV2IHVubGVzcyByZXYgPX4gL15yZWY6ICguKikkLworCisgICAgICByZWZfbmFtZSA9ICQxCisgICAgICByZWZfZmlsZSA9IFNhc3M6OlV0aWwuc2NvcGUoIi5naXQvI3tyZWZfbmFtZX0iKQorICAgICAgaW5mb19maWxlID0gU2Fzczo6VXRpbC5zY29wZSgiLmdpdC9pbmZvL3JlZnMiKQorICAgICAgcmV0dXJuIEZpbGUucmVhZChyZWZfZmlsZSkuc3RyaXAgaWYgRmlsZS5leGlzdD8ocmVmX2ZpbGUpCisgICAgICByZXR1cm4gdW5sZXNzIEZpbGUuZXhpc3Q/KGluZm9fZmlsZSkKKyAgICAgIEZpbGUub3BlbihpbmZvX2ZpbGUpIGRvIHxmfAorICAgICAgICBmLmVhY2ggZG8gfGx8CisgICAgICAgICAgc2hhLCByZWYgPSBsLnN0cmlwLnNwbGl0KCJcdCIsIDIpCisgICAgICAgICAgbmV4dCB1bmxlc3MgcmVmID09IHJlZl9uYW1lCisgICAgICAgICAgcmV0dXJuIHNoYQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgdmVyc2lvbl9kYXRlCisgICAgICByZXR1cm4gdW5sZXNzIEZpbGUuZXhpc3Q/KFNhc3M6OlV0aWwuc2NvcGUoJ1ZFUlNJT05fREFURScpKQorICAgICAgRGF0ZVRpbWUucGFyc2UoRmlsZS5yZWFkKFNhc3M6OlV0aWwuc2NvcGUoJ1ZFUlNJT05fREFURScpKS5zdHJpcCkKKyAgICBlbmQKKyAgZW5kCisKKyAgZXh0ZW5kIFNhc3M6OlZlcnNpb24KKworICAjIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiBTYXNzLgorICAjIEEgbW9yZSBmaW5lLWdyYWluZWQgcmVwcmVzZW50YXRpb24gaXMgYXZhaWxhYmxlIGZyb20gU2Fzcy52ZXJzaW9uLgorICAjIEBhcGkgcHVibGljCisgIFZFUlNJT04gPSB2ZXJzaW9uWzpzdHJpbmddIHVubGVzcyBkZWZpbmVkPyhTYXNzOjpWRVJTSU9OKQorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3JhaWxzL2luaXQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3JhaWxzL2luaXQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkNWJhYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvcmFpbHMvaW5pdC5yYgpAQCAtMCwwICsxIEBACitLZXJuZWwubG9hZCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uJywgJ2luaXQucmInKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mtc3BlYy55bWwgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy1zcGVjLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI1NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mtc3BlYy55bWwKQEAgLTAsMCArMSwzIEBACistLS0KKzplbmFibGVkOiB0cnVlCis6bGFuZ3VhZ2VfdmVyc2lvbjogJzMuNScKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2NhY2hlX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jYWNoZV90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI0NjBiYzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jYWNoZV90ZXN0LnJiCkBAIC0wLDAgKzEsMTMwIEBACityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL3Rlc3RfaGVscGVyJworcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3Nhc3MvZW5naW5lJworCitjbGFzcyBDYWNoZVRlc3QgPCBNaW5pVGVzdDo6VGVzdAorICBAQGNhY2hlX2RpciA9ICJ0bXAvZmlsZV9jYWNoZSIKKworICBkZWYgc2V0dXAKKyAgICBGaWxlVXRpbHMubWtkaXJfcCBAQGNhY2hlX2RpcgorICBlbmQKKworICBkZWYgdGVhcmRvd24KKyAgICBGaWxlVXRpbHMucm1fcmYgQEBjYWNoZV9kaXIKKyAgICBjbGVhbl91cF9zYXNzYworICBlbmQKKworICBkZWYgdGVzdF9maWxlX2NhY2hlX3dyaXRlc19hX2ZpbGUKKyAgICBmaWxlX3N0b3JlID0gU2Fzczo6Q2FjaGVTdG9yZXM6OkZpbGVzeXN0ZW0ubmV3KEBAY2FjaGVfZGlyKQorICAgIGZpbGVfc3RvcmUuc3RvcmUoImFzZGYvZm9vLnNjc3NjIiwgImZha2VzaGExIiwgcm9vdF9ub2RlKQorICAgIGFzc2VydCBGaWxlLmV4aXN0PygiI3tAQGNhY2hlX2Rpcn0vYXNkZi9mb28uc2Nzc2MiKQorICBlbmQKKworICBkZWYgdGVzdF9maWxlX2NhY2hlX3JlYWRzX2FfZmlsZQorICAgIGZpbGVfc3RvcmUgPSBTYXNzOjpDYWNoZVN0b3Jlczo6RmlsZXN5c3RlbS5uZXcoQEBjYWNoZV9kaXIpCisgICAgYXNzZXJ0ICFGaWxlLmV4aXN0PygiI3tAQGNhY2hlX2Rpcn0vYXNkZi9mb28uc2Nzc2MiKQorICAgIGZpbGVfc3RvcmUuc3RvcmUoImFzZGYvZm9vLnNjc3NjIiwgImZha2VzaGExIiwgcm9vdF9ub2RlKQorICAgIGFzc2VydCBGaWxlLmV4aXN0PygiI3tAQGNhY2hlX2Rpcn0vYXNkZi9mb28uc2Nzc2MiKQorICAgIGFzc2VydF9raW5kX29mIFNhc3M6OlRyZWU6OlJvb3ROb2RlLCBmaWxlX3N0b3JlLnJldHJpZXZlKCJhc2RmL2Zvby5zY3NzYyIsICJmYWtlc2hhMSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2ZpbGVfY2FjaGVfbWlzc19yZXR1cm5zX25pbAorICAgIGZpbGVfc3RvcmUgPSBTYXNzOjpDYWNoZVN0b3Jlczo6RmlsZXN5c3RlbS5uZXcoQEBjYWNoZV9kaXIpCisgICAgYXNzZXJ0ICFGaWxlLmV4aXN0PygiI3tAQGNhY2hlX2Rpcn0vYXNkZi9mb28uc2Nzc2MiKQorICAgIGFzc2VydF9uaWwgZmlsZV9zdG9yZS5yZXRyaWV2ZSgiYXNkZi9mb28uc2Nzc2MiLCAiZmFrZXNoYTEiKQorICBlbmQKKworICBkZWYgdGVzdF9zaGFfY2hhbmdlX2ludmFsaWRhdGVzX2NhY2hlX2FuZF9jbGVhbnNfdXAKKyAgICBmaWxlX3N0b3JlID0gU2Fzczo6Q2FjaGVTdG9yZXM6OkZpbGVzeXN0ZW0ubmV3KEBAY2FjaGVfZGlyKQorICAgIGFzc2VydCAhRmlsZS5leGlzdD8oIiN7QEBjYWNoZV9kaXJ9L2FzZGYvZm9vLnNjc3NjIikKKyAgICBmaWxlX3N0b3JlLnN0b3JlKCJhc2RmL2Zvby5zY3NzYyIsICJmYWtlc2hhMSIsIHJvb3Rfbm9kZSkKKyAgICBhc3NlcnQgRmlsZS5leGlzdD8oIiN7QEBjYWNoZV9kaXJ9L2FzZGYvZm9vLnNjc3NjIikKKyAgICBhc3NlcnRfbmlsIGZpbGVfc3RvcmUucmV0cmlldmUoImFzZGYvZm9vLnNjc3NjIiwgImRpZmZlcmVudHNoYTEiKQorICAgIGFzc2VydCAhRmlsZS5leGlzdD8oIiN7QEBjYWNoZV9kaXJ9L2FzZGYvZm9vLnNjc3NjIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmVyc2lvbl9jaGFuZ2VfaW52YWxpZGF0ZXNfY2FjaGVfYW5kX2NsZWFuc191cAorICAgIGZpbGVfc3RvcmUgPSBTYXNzOjpDYWNoZVN0b3Jlczo6RmlsZXN5c3RlbS5uZXcoQEBjYWNoZV9kaXIpCisgICAgYXNzZXJ0ICFGaWxlLmV4aXN0PygiI3tAQGNhY2hlX2Rpcn0vYXNkZi9mb28uc2Nzc2MiKQorICAgIGZpbGVfc3RvcmUuc3RvcmUoImFzZGYvZm9vLnNjc3NjIiwgImZha2VzaGExIiwgcm9vdF9ub2RlKQorICAgIGFzc2VydCBGaWxlLmV4aXN0PygiI3tAQGNhY2hlX2Rpcn0vYXNkZi9mb28uc2Nzc2MiKQorICAgIHJlYWxfdmVyc2lvbiA9IFNhc3M6OlZFUlNJT04KKyAgICBiZWdpbgorICAgICAgU2Fzczo6VkVSU0lPTi5yZXBsYWNlKCJhIGRpZmZlcmVudCB2ZXJzaW9uIikKKyAgICAgIGFzc2VydF9uaWwgZmlsZV9zdG9yZS5yZXRyaWV2ZSgiYXNkZi9mb28uc2Nzc2MiLCAiZmFrZXNoYTEiKQorICAgICAgYXNzZXJ0ICFGaWxlLmV4aXN0PygiI3tAQGNhY2hlX2Rpcn0vYXNkZi9mb28uc2Nzc2MiKQorICAgIGVuc3VyZQorICAgICAgU2Fzczo6VkVSU0lPTi5yZXBsYWNlKHJlYWxfdmVyc2lvbikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXJiaXRyYXJ5X29iamVjdHNfY2FuX2dvX2ludG9fY2FjaGUKKyAgICBjYWNoZSA9IFNhc3M6OkNhY2hlU3RvcmVzOjpNZW1vcnkubmV3CisgICAgYW5fb2JqZWN0ID0gezpmb28gPT4gOmJhcn0KKyAgICBjYWNoZS5zdG9yZSgiYW5fb2JqZWN0IiwgIiIsIGFuX29iamVjdCkKKyAgICBhc3NlcnRfZXF1YWwgYW5fb2JqZWN0LCBjYWNoZS5yZXRyaWV2ZSgiYW5fb2JqZWN0IiwgIiIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NhY2hlX25vZGVfd2l0aF91bm1hcnNoYWxhYmxlX29wdGlvbgorICAgIGVuZ2luZV93aXRoX3VubWFyc2hhbGFibGVfb3B0aW9ucygiZm9vIHthOiBiICsgY30iKS50b190cmVlCisgIGVuZAorCisgICMgUmVncmVzc2lvbiB0ZXN0cworCisgIGRlZiB0ZXN0X2NhY2hlX21peGluX2RlZl9zcGxhdF9zYXNzX25vZGVfd2l0aF91bm1hcnNoYWxhYmxlX29wdGlvbgorICAgIGVuZ2luZV93aXRoX3VubWFyc2hhbGFibGVfb3B0aW9ucyg8PFNBU1MsIDpzeW50YXggPT4gOnNhc3MpLnRvX3RyZWUKKz1jb2xvcigkYXJncy4uLikKKyAgY29sb3I6IHJlZAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jYWNoZV9taXhpbl9kZWZfc3BsYXRfc2Nzc19ub2RlX3dpdGhfdW5tYXJzaGFsYWJsZV9vcHRpb24KKyAgICBlbmdpbmVfd2l0aF91bm1hcnNoYWxhYmxlX29wdGlvbnMoPDxTQ1NTLCA6c3ludGF4ID0+IDpzY3NzKS50b190cmVlCitAbWl4aW4gY29sb3IoJGFyZ3MuLi4pIHsKKyAgY29sb3I6IHJlZDsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FjaGVfZnVuY3Rpb25fc3BsYXRfc2Fzc19ub2RlX3dpdGhfdW5tYXJzaGFsYWJsZV9vcHRpb24KKyAgICBlbmdpbmVfd2l0aF91bm1hcnNoYWxhYmxlX29wdGlvbnMoPDxTQVNTLCA6c3ludGF4ID0+IDpzYXNzKS50b190cmVlCitAZnVuY3Rpb24gY29sb3IoJGFyZ3MuLi4pCisgIEByZXR1cm4gcmVkCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NhY2hlX2Z1bmN0aW9uX3NwbGF0X3Njc3Nfbm9kZV93aXRoX3VubWFyc2hhbGFibGVfb3B0aW9uCisgICAgZW5naW5lX3dpdGhfdW5tYXJzaGFsYWJsZV9vcHRpb25zKDw8U0NTUywgOnN5bnRheCA9PiA6c2NzcykudG9fdHJlZQorQGZ1bmN0aW9uIGNvbG9yKCRhcmdzLi4uKSB7CisgIEByZXR1cm4gcmVkOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jYWNoZV9pbmNsdWRlX3NwbGF0X3Nhc3Nfbm9kZV93aXRoX3VubWFyc2hhbGFibGVfb3B0aW9uCisgICAgZW5naW5lX3dpdGhfdW5tYXJzaGFsYWJsZV9vcHRpb25zKDw8U0FTUywgOnN5bnRheCA9PiA6c2FzcykudG9fdHJlZQorQGluY2x1ZGUgY29sb3IoJGFyZ3MuLi4sICRrd2FyZ3MuLi4pCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NhY2hlX2luY2x1ZGVfc3BsYXRfc2Nzc19ub2RlX3dpdGhfdW5tYXJzaGFsYWJsZV9vcHRpb24KKyAgICBlbmdpbmVfd2l0aF91bm1hcnNoYWxhYmxlX29wdGlvbnMoPDxTQ1NTLCA6c3ludGF4ID0+IDpzY3NzKS50b190cmVlCitAaW5jbHVkZSBjb2xvcigkYXJncy4uLiwgJGt3YXJncy4uLik7CitTQ1NTCisgIGVuZAorCisgIHByaXZhdGUKKyAgZGVmIHJvb3Rfbm9kZQorICAgIFNhc3M6OkVuZ2luZS5uZXcoPDwtU0NTUywgOnN5bnRheCA9PiA6c2NzcykudG9fdHJlZQorICAgICAgQG1peGluIGNvbG9yKCRjKSB7IGNvbG9yOiAkY30KKyAgICAgIGRpdiB7IEBpbmNsdWRlIGNvbG9yKHJlZCk7IH0KKyAgICBTQ1NTCisgIGVuZAorCisgIGRlZiBlbmdpbmVfd2l0aF91bm1hcnNoYWxhYmxlX29wdGlvbnMoc3JjLCBvcHRpb25zPXt9KQorICAgIFNhc3M6OkVuZ2luZS5uZXcoc3JjLCB7CisgICAgICA6c3ludGF4ID0+IDpzY3NzLCA6b2JqZWN0ID0+IENsYXNzLm5ldy5uZXcsIDpmaWxlbmFtZSA9PiAnZmlsZS5zY3NzJywKKyAgICAgIDppbXBvcnRlciA9PiBTYXNzOjpJbXBvcnRlcnM6OkZpbGVzeXN0ZW0ubmV3KGFic29sdXRpemUoJ3RlbXBsYXRlcycpKQorICAgIH0ubWVyZ2Uob3B0aW9ucykpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jYWxsYmFja3NfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2NhbGxiYWNrc190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxNDM2MzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jYWxsYmFja3NfdGVzdC5yYgpAQCAtMCwwICsxLDYwIEBACityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL3Rlc3RfaGVscGVyJworcmVxdWlyZSAnc2Fzcy9jYWxsYmFja3MnCisKK2NsYXNzIENhbGxlckJhY2sKKyAgZXh0ZW5kIFNhc3M6OkNhbGxiYWNrcworICBkZWZpbmVfY2FsbGJhY2sgOmZvbworICBkZWZpbmVfY2FsbGJhY2sgOmJhcgorCisgIGRlZiBkb19mb28KKyAgICBydW5fZm9vCisgIGVuZAorCisgIGRlZiBkb19iYXIKKyAgICBydW5fYmFyIDEyCisgIGVuZAorZW5kCisKK21vZHVsZSBDbGFzc0xldmVsQ2FsbGVyQmFjaworICBleHRlbmQgU2Fzczo6Q2FsbGJhY2tzCisgIGRlZmluZV9jYWxsYmFjayA6Zm9vCisgIGV4dGVuZCBzZWxmCisKKyAgZGVmIGRvX2ZvbworICAgIHJ1bl9mb28KKyAgZW5kCitlbmQKKworY2xhc3MgU2Fzc0NhbGxiYWNrc1Rlc3QgPCBNaW5pVGVzdDo6VGVzdAorICBkZWYgdGVzdF9zaW1wbGVfY2FsbGJhY2sKKyAgICBjYiA9IENhbGxlckJhY2submV3CisgICAgdGhlcmUgPSBmYWxzZQorICAgIGNiLm9uX2ZvbyB7dGhlcmUgPSB0cnVlfQorICAgIGNiLmRvX2ZvbworICAgIGFzc2VydCB0aGVyZSwgIkV4cGVjdGVkIGNhbGxiYWNrIHRvIGJlIGNhbGxlZC4iCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpcGxlX2NhbGxiYWNrcworICAgIGNiID0gQ2FsbGVyQmFjay5uZXcKKyAgICBzdHIgPSAiIgorICAgIGNiLm9uX2ZvbyB7c3RyICs9ICJmaXJzdCJ9CisgICAgY2Iub25fZm9vIHtzdHIgKz0gIiBzZWNvbmQifQorICAgIGNiLmRvX2ZvbworICAgIGFzc2VydF9lcXVhbCAiZmlyc3Qgc2Vjb25kIiwgc3RyCisgIGVuZAorCisgIGRlZiB0ZXN0X2NhbGxiYWNrX3dpdGhfYXJnCisgICAgY2IgPSBDYWxsZXJCYWNrLm5ldworICAgIHZhbCA9IG5pbAorICAgIGNiLm9uX2JhciB7fGF8IHZhbCA9IGF9CisgICAgY2IuZG9fYmFyCisgICAgYXNzZXJ0X2VxdWFsIDEyLCB2YWwKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2xhc3NfbGV2ZWxfY2FsbGJhY2sKKyAgICB0aGVyZSA9IGZhbHNlCisgICAgQ2xhc3NMZXZlbENhbGxlckJhY2sub25fZm9vIHt0aGVyZSA9IHRydWV9CisgICAgQ2xhc3NMZXZlbENhbGxlckJhY2suZG9fZm9vCisgICAgYXNzZXJ0IHRoZXJlLCAiRXhwZWN0ZWQgY2FsbGJhY2sgdG8gYmUgY2FsbGVkLiIKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2NvbXBpbGVyX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jb21waWxlcl90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlZTU4MmIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jb21waWxlcl90ZXN0LnJiCkBAIC0wLDAgKzEsMjI1IEBACityZXF1aXJlICdtaW5pdGVzdC9hdXRvcnVuJworcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3Nhc3MvcGx1Z2luJworcmVxdWlyZSAnc2Fzcy9wbHVnaW4vY29tcGlsZXInCisKK2NsYXNzIENvbXBpbGVyVGVzdCA8IE1pbmlUZXN0OjpUZXN0CisgIGNsYXNzIEZha2VMaXN0ZW5lcgorICAgIGF0dHJfYWNjZXNzb3IgOm9wdGlvbnMKKyAgICBhdHRyX2FjY2Vzc29yIDpkaXJlY3RvcmllcworICAgIGF0dHJfcmVhZGVyIDpzdGFydF9jYWxsZWQKKyAgICBhdHRyX3JlYWRlciA6dGhyZWFkCisKKyAgICBkZWYgaW5pdGlhbGl6ZSgqYXJncywgJm9uX2ZpbGVzeXN0ZW1fZXZlbnQpCisgICAgICBzZWxmLm9wdGlvbnMgPSBhcmdzLmxhc3QuaXNfYT8oSGFzaCkgPyBhcmdzLnBvcCA6IHt9CisgICAgICBzZWxmLmRpcmVjdG9yaWVzID0gYXJncworICAgICAgQG9uX2ZpbGVzeXN0ZW1fZXZlbnQgPSBvbl9maWxlc3lzdGVtX2V2ZW50CisgICAgICBAc3RhcnRfY2FsbGVkID0gZmFsc2UKKyAgICAgIHJlc2V0X2V2ZW50cyEKKyAgICBlbmQKKworICAgIGRlZiBmaXJlX2V2ZW50cyEoKmFyZ3MpCisgICAgICBAb25fZmlsZXN5c3RlbV9ldmVudC5jYWxsKEBtb2RpZmllZCwgQGFkZGVkLCBAcmVtb3ZlZCkKKyAgICAgIHJlc2V0X2V2ZW50cyEKKyAgICBlbmQKKworICAgIGRlZiBjaGFuZ2VkKGZpbGVuYW1lKQorICAgICAgQG1vZGlmaWVkIDw8IEZpbGUuZXhwYW5kX3BhdGgoZmlsZW5hbWUpCisgICAgZW5kCisKKyAgICBkZWYgYWRkZWQoZmlsZW5hbWUpCisgICAgICBAYWRkZWQgPDwgRmlsZS5leHBhbmRfcGF0aChmaWxlbmFtZSkKKyAgICBlbmQKKworICAgIGRlZiByZW1vdmVkKGZpbGVuYW1lKQorICAgICAgQHJlbW92ZWQgPDwgRmlsZS5leHBhbmRfcGF0aChmaWxlbmFtZSkKKyAgICBlbmQKKworICAgIGRlZiBvbl9zdGFydCEoJnJ1bl9kdXJpbmdfc3RhcnQpCisgICAgICBAcnVuX2R1cmluZ19zdGFydCA9IHJ1bl9kdXJpbmdfc3RhcnQKKyAgICBlbmQKKworICAgIGRlZiBzdGFydCEKKyAgICAgIEBydW5fZHVyaW5nX3N0YXJ0LmNhbGwoc2VsZikgaWYgQHJ1bl9kdXJpbmdfc3RhcnQKKyAgICBlbmQKKworICAgIGRlZiBzdGFydAorICAgICAgcGFyZW50ID0gVGhyZWFkLmN1cnJlbnQKKyAgICAgIEB0aHJlYWQgPSBUaHJlYWQubmV3IGRvCisgICAgICAgIEBydW5fZHVyaW5nX3N0YXJ0LmNhbGwoc2VsZikgaWYgQHJ1bl9kdXJpbmdfc3RhcnQKKyAgICAgICAgcGFyZW50LnJhaXNlIEludGVycnVwdAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc3RvcAorICAgIGVuZAorCisgICAgZGVmIHJlc2V0X2V2ZW50cyEKKyAgICAgIEBtb2RpZmllZCA9IFtdCisgICAgICBAYWRkZWQgPSBbXQorICAgICAgQHJlbW92ZWQgPSBbXQorICAgIGVuZAorICBlbmQKKworICBtb2R1bGUgTW9ja1dhdGNoZXIKKyAgICBhdHRyX2FjY2Vzc29yIDpydW5fZHVyaW5nX3N0YXJ0CisgICAgYXR0cl9hY2Nlc3NvciA6dXBkYXRlX3N0eWxlc2hlZXRzX3RpbWVzCisgICAgYXR0cl9hY2Nlc3NvciA6dXBkYXRlX3N0eWxlc2hlZXRzX2NhbGxlZF93aXRoCisgICAgYXR0cl9hY2Nlc3NvciA6ZGVsZXRlZF9jc3NfZmlsZXMKKworICAgIGRlZiBmYWtlX2xpc3RlbmVyCisgICAgICBAZmFrZV9saXN0ZW5lcgorICAgIGVuZAorCisgICAgZGVmIHVwZGF0ZV9zdHlsZXNoZWV0cyhpbmRpdmlkdWFsX2ZpbGVzKQorICAgICAgQHVwZGF0ZV9zdHlsZXNoZWV0c190aW1lcyB8fD0gMAorICAgICAgQHVwZGF0ZV9zdHlsZXNoZWV0c190aW1lcyArPSAxCisgICAgICAoQHVwZGF0ZV9zdHlsZXNoZWV0c19jYWxsZWRfd2l0aCB8fD0gW10pIDw8IGluZGl2aWR1YWxfZmlsZXMKKyAgICBlbmQKKworICAgIGRlZiB0cnlfZGVsZXRlX2Nzcyhjc3NfZmlsZW5hbWUpCisgICAgICAoQGRlbGV0ZWRfY3NzX2ZpbGVzIHx8PSBbXSkgPDwgY3NzX2ZpbGVuYW1lCisgICAgZW5kCisKKyAgICBwcml2YXRlCisgICAgZGVmIGNyZWF0ZV9saXN0ZW5lcigqYXJncywgJm9uX2ZpbGVzeXN0ZW1fZXZlbnQpCisgICAgICBhcmdzLnBvcCBpZiBhcmdzLmxhc3QuaXNfYT8oSGFzaCkKKyAgICAgIEBmYWtlX2xpc3RlbmVyID0gRmFrZUxpc3RlbmVyLm5ldygqYXJncywgJm9uX2ZpbGVzeXN0ZW1fZXZlbnQpCisgICAgICBAZmFrZV9saXN0ZW5lci5vbl9zdGFydCEoJnJ1bl9kdXJpbmdfc3RhcnQpCisgICAgICBAZmFrZV9saXN0ZW5lcgorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9pbml0aWFsaXplCisgICAgd2F0Y2hlcgorICBlbmQKKworICBkZWYgdGVzdF93YXRjaF9zdGFydHNfdGhlX2xpc3RlbmVyCisgICAgc3RhcnRfY2FsbGVkID0gZmFsc2UKKyAgICBjID0gd2F0Y2hlciBkbyB8bGlzdGVuZXJ8CisgICAgICBzdGFydF9jYWxsZWQgPSB0cnVlCisgICAgZW5kCisgICAgYy53YXRjaAorICAgIGFzc2VydCBzdGFydF9jYWxsZWQsICJzdGFydCEgd2FzIG5vdCBjYWxsZWQiCisgIGVuZAorCisgIGRlZiB0ZXN0X3Nhc3NfY2FsbGJhY2tzX2ZpcmVfZnJvbV9saXN0ZW5lcl9ldmVudHMKKyAgICBjID0gd2F0Y2hlciBkbyB8bGlzdGVuZXJ8CisgICAgICBsaXN0ZW5lci5jaGFuZ2VkICJjaGFuZ2VkLnNjc3MiCisgICAgICBsaXN0ZW5lci5hZGRlZCAiYWRkZWQuc2NzcyIKKyAgICAgIGxpc3RlbmVyLnJlbW92ZWQgInJlbW92ZWQuc2NzcyIKKyAgICAgIGxpc3RlbmVyLmZpcmVfZXZlbnRzIQorICAgIGVuZAorCisgICAgbW9kaWZpZWRfZmlyZWQgPSBmYWxzZQorICAgIGMub25fdGVtcGxhdGVfbW9kaWZpZWQgZG8gfHNhc3NfZmlsZXwKKyAgICAgIG1vZGlmaWVkX2ZpcmVkID0gdHJ1ZQorICAgICAgYXNzZXJ0X2VxdWFsICJjaGFuZ2VkLnNjc3MiLCBzYXNzX2ZpbGUKKyAgICBlbmQKKworICAgIGFkZGVkX2ZpcmVkID0gZmFsc2UKKyAgICBjLm9uX3RlbXBsYXRlX2NyZWF0ZWQgZG8gfHNhc3NfZmlsZXwKKyAgICAgIGFkZGVkX2ZpcmVkID0gdHJ1ZQorICAgICAgYXNzZXJ0X2VxdWFsICJhZGRlZC5zY3NzIiwgc2Fzc19maWxlCisgICAgZW5kCisKKyAgICByZW1vdmVkX2ZpcmVkID0gZmFsc2UKKyAgICBjLm9uX3RlbXBsYXRlX2RlbGV0ZWQgZG8gfHNhc3NfZmlsZXwKKyAgICAgIHJlbW92ZWRfZmlyZWQgPSB0cnVlCisgICAgICBhc3NlcnRfZXF1YWwgInJlbW92ZWQuc2NzcyIsIHNhc3NfZmlsZQorICAgIGVuZAorCisgICAgYy53YXRjaAorCisgICAgYXNzZXJ0X2VxdWFsIDIsIGMudXBkYXRlX3N0eWxlc2hlZXRzX3RpbWVzCisgICAgYXNzZXJ0IG1vZGlmaWVkX2ZpcmVkCisgICAgYXNzZXJ0IGFkZGVkX2ZpcmVkCisgICAgYXNzZXJ0IHJlbW92ZWRfZmlyZWQKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVtb3ZpbmdfYV9zYXNzX2ZpbGVfcmVtb3Zlc19jb3JyZXNwb25kaW5nX2Nzc19maWxlCisgICAgYyA9IHdhdGNoZXIgZG8gfGxpc3RlbmVyfAorICAgICAgbGlzdGVuZXIucmVtb3ZlZCAicmVtb3ZlX21lLnNjc3MiCisgICAgICBsaXN0ZW5lci5maXJlX2V2ZW50cyEKKyAgICBlbmQKKworICAgIGMud2F0Y2gKKworICAgIGFzc2VydF9lcXVhbCAiLi9yZW1vdmVfbWUuY3NzIiwgYy5kZWxldGVkX2Nzc19maWxlcy5maXJzdAorICBlbmQKKworICBkZWYgdGVzdF9hbl9pbXBvcnRlcl9jYW5fd2F0Y2hfYW5faW1hZ2UKKyAgICBpbWFnZV9pbXBvcnRlciA9IFNhc3M6OkltcG9ydGVyczo6RmlsZXN5c3RlbS5uZXcoIi4iKQorICAgIGNsYXNzIDw8IGltYWdlX2ltcG9ydGVyCisgICAgICBkZWYgd2F0Y2hlZF9maWxlPyhmaWxlbmFtZSkKKyAgICAgICAgZmlsZW5hbWUgPX4gL1wucG5nJC8KKyAgICAgIGVuZAorICAgIGVuZAorICAgIGMgPSB3YXRjaGVyKDpsb2FkX3BhdGhzID0+IFtpbWFnZV9pbXBvcnRlcl0pIGRvIHxsaXN0ZW5lcnwKKyAgICAgIGxpc3RlbmVyLmNoYW5nZWQgImltYWdlLnBuZyIKKyAgICAgIGxpc3RlbmVyLmZpcmVfZXZlbnRzIQorICAgIGVuZAorCisgICAgbW9kaWZpZWRfZmlyZWQgPSBmYWxzZQorICAgIGMub25fdGVtcGxhdGVfbW9kaWZpZWQgZG8gfGZ8CisgICAgICBtb2RpZmllZF9maXJlZCA9IHRydWUKKyAgICAgIGFzc2VydF9lcXVhbCAiaW1hZ2UucG5nIiwgZgorICAgIGVuZAorCisgICAgYy53YXRjaAorCisgICAgYXNzZXJ0X2VxdWFsIDIsIGMudXBkYXRlX3N0eWxlc2hlZXRzX3RpbWVzCisgICAgYXNzZXJ0IG1vZGlmaWVkX2ZpcmVkCisgIGVuZAorCisgIGRlZiB0ZXN0X3dhdGNoaW5nX3NwZWNpZmljX2ZpbGVzX2FuZF9vbmVfaXNfZGVsZXRlZAorICAgIGRpcmVjdG9yaWVzID0gbmlsCisgICAgYyA9IHdhdGNoZXIgZG8gfGxpc3RlbmVyfAorICAgICAgZGlyZWN0b3JpZXMgPSBsaXN0ZW5lci5kaXJlY3RvcmllcworICAgICAgbGlzdGVuZXIucmVtb3ZlZCBGaWxlLmV4cGFuZF9wYXRoKCIuL2Zvby5zY3NzIikKKyAgICAgIGxpc3RlbmVyLmZpcmVfZXZlbnRzIQorICAgIGVuZAorICAgIGMud2F0Y2goW1tGaWxlLmV4cGFuZF9wYXRoKCIuL2Zvby5zY3NzIiksIEZpbGUuZXhwYW5kX3BhdGgoIi4vZm9vLmNzcyIpLCBuaWxdXSkKKyAgICBhc3NlcnQgZGlyZWN0b3JpZXMuaW5jbHVkZT8oRmlsZS5leHBhbmRfcGF0aCgiLiIpKSwgZGlyZWN0b3JpZXMuaW5zcGVjdAorICAgIGFzc2VydF9lcXVhbCBGaWxlLmV4cGFuZF9wYXRoKCIuL2Zvby5jc3MiKSwgYy5kZWxldGVkX2Nzc19maWxlcy5maXJzdCwgInRoZSBjb3JyZXNwb25kaW5nIGNzcyBmaWxlIHdhcyBub3QgZGVsZXRlZCIKKyAgICBhc3NlcnRfZXF1YWwgW10sIGMudXBkYXRlX3N0eWxlc2hlZXRzX2NhbGxlZF93aXRoWzFdLCAidGhlIHNhc3MgZmlsZSBzaG91bGQgbm90IGhhdmUgYmVlbiBjb21waWxlZCIKKyAgZW5kCisKKyAgZGVmIHRlc3Rfd2F0Y2hlZF9kaXJlY3Rvcmllc19hcmVfZGVkdXBwZWQKKyAgICBkaXJlY3RvcmllcyA9IG5pbAorICAgIGMgPSB3YXRjaGVyKDpsb2FkX3BhdGhzID0+IFsiLiIsICIuL2ZvbyIsICIuIl0pIGRvIHxsaXN0ZW5lcnwKKyAgICAgIGRpcmVjdG9yaWVzID0gbGlzdGVuZXIuZGlyZWN0b3JpZXMKKyAgICBlbmQKKyAgICBjLndhdGNoCisgICAgYXNzZXJ0X2VxdWFsIFtGaWxlLmV4cGFuZF9wYXRoKCIuIildLCBkaXJlY3RvcmllcworICBlbmQKKworICBkZWYgdGVzdF9hX2NoYW5nZWRfY3NzX2luX2Ffd2F0Y2hlZF9kaXJlY3RvcnlfZG9lc19ub3RfZm9yY2VfYV9jb21waWxlCisgICAgYyA9IHdhdGNoZXIgZG8gfGxpc3RlbmVyfAorICAgICAgbGlzdGVuZXIuY2hhbmdlZCAiZm9vLmNzcyIKKyAgICAgIGxpc3RlbmVyLmZpcmVfZXZlbnRzIQorICAgIGVuZAorCisgICAgYy5vbl90ZW1wbGF0ZV9tb2RpZmllZCBkbyB8ZnwKKyAgICAgIGFzc2VydCBmYWxzZSwgIlNob3VsZCBub3QgaGF2ZSBiZWVuIGNhbGxlZCIKKyAgICBlbmQKKworICAgIGMud2F0Y2gKKworICAgIGFzc2VydF9lcXVhbCAxLCBjLnVwZGF0ZV9zdHlsZXNoZWV0c190aW1lcworICBlbmQKKworICBwcml2YXRlCisKKyAgZGVmIGRlZmF1bHRfb3B0aW9ucworICAgIHs6dGVtcGxhdGVfbG9jYXRpb24gPT4gW1siLiIsIi4iXV19CisgIGVuZAorCisgIGRlZiB3YXRjaGVyKG9wdGlvbnMgPSB7fSwgJnJ1bl9kdXJpbmdfc3RhcnQpCisgICAgb3B0aW9ucyA9IGRlZmF1bHRfb3B0aW9ucy5tZXJnZShvcHRpb25zKQorICAgIHdhdGNoZXIgPSBTYXNzOjpQbHVnaW46OkNvbXBpbGVyLm5ldyhvcHRpb25zKQorICAgIHdhdGNoZXIuZXh0ZW5kKE1vY2tXYXRjaGVyKQorICAgIHdhdGNoZXIucnVuX2R1cmluZ19zdGFydCA9IHJ1bl9kdXJpbmdfc3RhcnQKKyAgICB3YXRjaGVyCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jb252ZXJzaW9uX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jb252ZXJzaW9uX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzM3YTI0MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2NvbnZlcnNpb25fdGVzdC5yYgpAQCAtMCwwICsxLDIxMzggQEAKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vdGVzdF9oZWxwZXInCisKK2NsYXNzIENvbnZlcnNpb25UZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgZGVmIHRlc3RfYmFzaWMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbyBiYXIKKyAgYmF6OiBiYW5nCisgIGJpcDogYm9wCitTQVNTCitmb28gYmFyIHsKKyAgYmF6OiBiYW5nOworICBiaXA6IGJvcDsKK30KK1NDU1MKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MsIG9wdGlvbnM6IHtvbGQ6IHRydWV9fQorZm9vIGJhcgorICA6YmF6IGJhbmcKKyAgOmJpcCBib3AKK1NBU1MKK2ZvbyBiYXIgeworICBiYXo6IGJhbmc7CisgIGJpcDogYm9wOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9zZWxlY3RvcgorICAgIGFzc2VydF9jb252ZXJ0cyAiZm9vIGJhciIsICJmb28gYmFyIHt9IgorICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9kaXJlY3RpdmUKKyAgICBhc3NlcnRfY29udmVydHMgIkBtZWRpYSBzY3JlZW4iLCAiQG1lZGlhIHNjcmVlbiB7fSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW1wdHlfY29udHJvbF9kaXJlY3RpdmUKKyAgICBhc3NlcnRfY29udmVydHMgIkBpZiBmYWxzZSIsICJAaWYgZmFsc2Uge30iCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RpbmcKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbyBiYXIKKyAgYmF6IGJhbmcKKyAgICBiYXo6IGJhbmcKKyAgICBiaXA6IGJvcAorCisgIGJsYXQ6IGJvbworU0FTUworZm9vIGJhciB7CisgIGJheiBiYW5nIHsKKyAgICBiYXo6IGJhbmc7CisgICAgYmlwOiBib3A7CisgIH0KKworICBibGF0OiBib287Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3Rpbmdfd2l0aF9wYXJlbnRfcmVmCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitmb28gYmFyCisgICY6aG92ZXIKKyAgICBiYXo6IGJhbmcKK1NBU1MKK2ZvbyBiYXIgeworICAmOmhvdmVyIHsKKyAgICBiYXo6IGJhbmc7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vIFwjeyRiYXIgKyAiYmF6In0uYmlwCisgIGJhejogYmFuZworCitmb28gL1wjeyRiYXIgKyAiYmF6In0vIC5iaXAKKyAgYmF6OiBiYW5nCitTQVNTCitmb28gXCN7JGJhciArICJiYXoifS5iaXAgeworICBiYXo6IGJhbmc7Cit9CisKK2ZvbyAvXCN7JGJhciArICJiYXoifS8gLmJpcCB7CisgIGJhejogYmFuZzsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlsaW5lX3NlbGVjdG9yX3dpdGhfY29tbWFzCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitmb28gYmFyLAorYmF6IGJhbmcKKyAgYmF6OiBiYW5nCitTQVNTCitmb28gYmFyLAorYmF6IGJhbmcgeworICBiYXo6IGJhbmc7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2JsYXQKKyAgZm9vIGJhciwKKyAgYmF6IGJhbmcKKyAgICBiYXo6IGJhbmcKK1NBU1MKK2JsYXQgeworICBmb28gYmFyLAorICBiYXogYmFuZyB7CisgICAgYmF6OiBiYW5nOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpbGluZV9zZWxlY3Rvcl93aXRob3V0X2NvbW1hcworICAgIGFzc2VydF9zY3NzX3RvX3Nhc3MgPDxTQVNTLCA8PFNDU1MKK2ZvbyBiYXIgYmF6IGJhbmcKKyAgYmF6OiBiYW5nCitTQVNTCitmb28gYmFyCitiYXogYmFuZyB7CisgIGJhejogYmFuZzsKK30KK1NDU1MKKworICAgIGFzc2VydF9zY3NzX3RvX3Njc3MgPDxTQ1NTCitmb28gYmFyCitiYXogYmFuZyB7CisgIGJhejogYmFuZzsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXNjYXBlZF9zZWxlY3RvcgorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vIGJhcgorICBcXDpob3ZlcgorICAgIGJhejogYmFuZworU0FTUworZm9vIGJhciB7CisgIDpob3ZlciB7CisgICAgYmF6OiBiYW5nOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb3BlcnR5X25hbWVfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vIGJhcgorICBiYXpcI3skYmFuZ31iaXBcI3skYm9wfTogMTIKK1NBU1MKK2ZvbyBiYXIgeworICBiYXpcI3skYmFuZ31iaXBcI3skYm9wfTogMTI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb3BlcnR5X3ZhbHVlX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbyBiYXIKKyAgYmF6OiAxMiBcI3skYmFuZ30gYmlwIFwjeyJib3AifSBibGF0CitTQVNTCitmb28gYmFyIHsKKyAgYmF6OiAxMiBcI3skYmFuZ30gYmlwIFwjeyJib3AifSBibGF0OworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9keW5hbWljX3Byb3BlcnRpZXMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbyBiYXIKKyAgYmF6OiAxMiAkYmFuZyAiYmlwIgorU0FTUworZm9vIGJhciB7CisgIGJhejogMTIgJGJhbmcgImJpcCI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2R5bmFtaWNfcHJvcGVydGllc193aXRoX29sZAorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUywgb3B0aW9uczoge29sZDogdHJ1ZX19Citmb28gYmFyCisgIDpiYXogMTIgJGJhbmcgImJpcCIKK1NBU1MKK2ZvbyBiYXIgeworICBiYXo6IDEyICRiYW5nICJiaXAiOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tdWx0aWxpbmVfcHJvcGVydGllcworICAgIGFzc2VydF9zY3NzX3RvX3Nhc3MgPDxTQVNTLCA8PFNDU1MKK2ZvbyBiYXIKKyAgYmF6OiBiaXAgYmFtIGJvb24KK1NBU1MKK2ZvbyBiYXIgeworICBiYXo6CisgICAgYmlwCisgIGJhbQorICAgICAgICBib29uOworfQorU0NTUworCisgICAgYXNzZXJ0X3Njc3NfdG9fc2NzcyA8PE9VVCwgc291cmNlOiA8PElOCitmb28gYmFyIHsKKyAgYmF6OiBiaXAgYmFtIGJvb247Cit9CitPVVQKK2ZvbyBiYXIgeworICBiYXo6CisgICAgYmlwCisgIGJhbQorICAgICAgICBib29uOworfQorSU4KKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlsaW5lX2R5bmFtaWNfcHJvcGVydGllcworICAgIGFzc2VydF9zY3NzX3RvX3Nhc3MgPDxTQVNTLCA8PFNDU1MKK2ZvbyBiYXIKKyAgYmF6OiAkYmlwICJiYW0iIDEycHgKK1NBU1MKK2ZvbyBiYXIgeworICBiYXo6CisgICAgJGJpcAorICAiYmFtIgorICAgICAgICAxMnB4OworfQorU0NTUworCisgICAgYXNzZXJ0X3Njc3NfdG9fc2NzcyA8PE9VVCwgc291cmNlOiA8PElOCitmb28gYmFyIHsKKyAgYmF6OiAkYmlwICJiYW0iIDEycHg7Cit9CitPVVQKK2ZvbyBiYXIgeworICBiYXo6CisgICAgJGJpcAorICAiYmFtIgorICAgICAgICAxMnB4OworfQorSU4KKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2lsZW50X2NvbW1lbnRzCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCisvLyBmb28KKworLy8gYmFyCisKKy8vIGJhegorCitmb28gYmFyCisgIGE6IGIKK1NBU1MKKy8vIGZvbworCisvLyBiYXIKKworLy8gYmF6CisKK2ZvbyBiYXIgeworICBhOiBiOworfQorU0NTUworCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCisvLyBmb28KKy8vIGJhcgorLy8gICBiYXoKKy8vIGJhbmcKKworZm9vIGJhcgorICBhOiBiCitTQVNTCisvLyBmb28KKy8vIGJhcgorLy8gICBiYXoKKy8vIGJhbmcKKworZm9vIGJhciB7CisgIGE6IGI7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKy8vIGZvbworLy8gYmFyCisvLyAgIGJhegorLy8gYmFuZworCitmb28gYmFyCisgIGE6IGIKK1NBU1MKKy8vIGZvbworLy8gYmFyCisvLyAgIGJhegorLy8gYmFuZworCitmb28gYmFyIHsKKyAgYTogYjsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX3NpbGVudF9jb21tZW50cworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vCisgIGJhcjogYmF6CisKKyAgLy8gYmlwIGJvcAorICAvLyBiZWVwIGJvb3AKKyAgYmFuZzogYml6egorCisgIC8vIGJ1YmJsZSBidWJibGUKKyAgLy8gdG9pbCB0cm91YmxlCitTQVNTCitmb28geworICBiYXI6IGJhejsKKworICAvLyBiaXAgYm9wCisgIC8vIGJlZXAgYm9vcAorICBiYW5nOiBiaXp6OworCisgIC8vIGJ1YmJsZSBidWJibGUKKyAgLy8gdG9pbCB0cm91YmxlCit9CitTQ1NTCisKKyAgICBhc3NlcnRfc2Fzc190b19zY3NzIDw8U0NTUywgPDxTQVNTCitmb28geworICBiYXI6IGJhejsKKworICAvLyBiaXAgYm9wCisgIC8vIGJlZXAgYm9vcAorICAvLyAgIGJhcCBibGltcAorICBiYW5nOiBiaXp6OworCisgIC8vIGJ1YmJsZSBidWJibGUKKyAgLy8gdG9pbCB0cm91YmxlCisgIC8vICAgIGdvcnAKK30KK1NDU1MKK2ZvbworICBiYXI6IGJhegorCisgIC8vIGJpcCBib3AKKyAgICAgYmVlcCBib29wCisgICAgICAgYmFwIGJsaW1wCisgIGJhbmc6IGJpenoKKworICAvLyBidWJibGUgYnViYmxlCisgICAgdG9pbCB0cm91YmxlCisgICAgICAgZ29ycAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9wcmVzZXJ2ZXNfdHJpcGxlX3NsYXNoX2NvbW1lbnRzCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCisvLy8gZm9vCisvLy8gYmFyCitmb28KKyAgLy8vIGJpcCBib3AKKyAgLy8vIGJlZXAgYm9vcAorU0FTUworLy8vIGZvbworLy8vIGJhcgorZm9vIHsKKyAgLy8vIGJpcCBib3AKKyAgLy8vIGJlZXAgYm9vcAorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9sb3VkX2NvbW1lbnRzCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCisvKiBmb28KKworLyogYmFyCisKKy8qIGJhegorCitmb28gYmFyCisgIGE6IGIKK1NBU1MKKy8qIGZvbyAqLworCisvKiBiYXIgKi8KKworLyogYmF6ICovCisKK2ZvbyBiYXIgeworICBhOiBiOworfQorU0NTUworCisgICAgYXNzZXJ0X3Njc3NfdG9fc2FzcyA8PFNBU1MsIDw8U0NTUworLyogZm9vCisgKiBiYXIKKyAqICAgYmF6CisgKiBiYW5nCisKK2ZvbyBiYXIKKyAgYTogYgorU0FTUworLyogZm9vCisgICBiYXIKKyAgICAgYmF6CisgICBiYW5nICovCisKK2ZvbyBiYXIgeworICBhOiBiOworfQorU0NTUworCisgICAgYXNzZXJ0X3Njc3NfdG9fc2NzcyA8PFNDU1MKKy8qIGZvbworICAgYmFyCisgICAgIGJhegorICAgYmFuZyAqLworCitmb28gYmFyIHsKKyAgYTogYjsKK30KK1NDU1MKKworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworLyogZm9vCisgKiBiYXIKKyAqICAgYmF6CisgKiBiYW5nCisKK2ZvbyBiYXIKKyAgYTogYgorU0FTUworLyogZm9vCisgKiBiYXIKKyAqICAgYmF6CisgKiBiYW5nICovCisKK2ZvbyBiYXIgeworICBhOiBiOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfbG91ZF9jb21tZW50cworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vCisgIGJhcjogYmF6CisKKyAgLyogYmlwIGJvcAorICAgKiBiZWVwIGJvb3AKKyAgYmFuZzogYml6egorCisgIC8qIGJ1YmJsZSBidWJibGUKKyAgICogdG9pbCB0cm91YmxlCitTQVNTCitmb28geworICBiYXI6IGJhejsKKworICAvKiBiaXAgYm9wCisgICAqIGJlZXAgYm9vcCAqLworICBiYW5nOiBiaXp6OworCisgIC8qIGJ1YmJsZSBidWJibGUKKyAgICogdG9pbCB0cm91YmxlICovCit9CitTQ1NTCisKKyAgICBhc3NlcnRfc2Fzc190b19zY3NzIDw8U0NTUywgPDxTQVNTCitmb28geworICBiYXI6IGJhejsKKworICAvKiBiaXAgYm9wCisgICAqIGJlZXAgYm9vcAorICAgKiAgIGJhcCBibGltcCAqLworICBiYW5nOiBiaXp6OworCisgIC8qIGJ1YmJsZSBidWJibGUKKyAgICogdG9pbCB0cm91YmxlCisgICAqICAgIGdvcnAgKi8KK30KK1NDU1MKK2ZvbworICBiYXI6IGJhegorCisgIC8qIGJpcCBib3AKKyAgICAgYmVlcCBib29wCisgICAgICAgYmFwIGJsaW1wCisgIGJhbmc6IGJpenoKKworICAvKiBidWJibGUgYnViYmxlCisgICAgdG9pbCB0cm91YmxlCisgICAgICAgZ29ycAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9wcmVzZXJ2ZXNfZG91YmxlX3N0YXJfY29tbWVudHMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKy8qKiBmb28KKyAqICBiYXIKK2ZvbworICAvKiogYmlwIGJvcAorICAgKiAgYmVlcCBib29wCitTQVNTCisvKiogZm9vCisgKiAgYmFyICovCitmb28geworICAvKiogYmlwIGJvcAorICAgKiAgYmVlcCBib29wICovCit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvdWRfY29tbWVudHNfd2l0aF93ZWlyZF9pbmRlbnRhdGlvbgorICAgIGFzc2VydF9zY3NzX3RvX3Nhc3MgPDxTQVNTLCA8PFNDU1MKK2ZvbworICAvKiAgICAgIGZvbworICAgKiBiYXIKKyAgICogICAgIGJhegorICBhOiBiCitTQVNTCitmb28geworICAvKiBmb28KK2JhcgorICAgIGJheiAqLworICBhOiBiOworfQorU0NTUworCisgICAgYXNzZXJ0X3Nhc3NfdG9fc2NzcyA8PFNDU1MsIDw8U0FTUworZm9vIHsKKyAgLyogICAgICBmb28KKyAgICogYmFyCisgICAqICAgICBiYXogKi8KKyAgYTogYjsKK30KK1NDU1MKK2ZvbworICAvKiAgICAgIGZvbworICAgICBiYXIKKyAgICAgICAgIGJhegorICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvdWRfY29tbWVudF9jb250YWluaW5nX3NpbGVudF9jb21tZW50CisgICAgYXNzZXJ0X3Njc3NfdG9fc2FzcyA8PFNBU1MsIDw8U0NTUworLyoKKyAqLy8gZm9vIGJhcgorU0FTUworLyoKKy8vIGZvbyBiYXIKKyovCitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpbGVudF9jb21tZW50X2NvbnRhaW5pbmdfbG91ZF9jb21tZW50CisgICAgYXNzZXJ0X3Njc3NfdG9fc2FzcyA8PFNBU1MsIDw8U0NTUworLy8gLyoKKy8vICAqIGZvbyBiYXIKKy8vICAqLworU0FTUworLy8gLyoKKy8vICAqIGZvbyBiYXIKKy8vICAqLworU0NTUworICBlbmQKKworICBkZWYgdGVzdF9pbW1lZGlhdGVseV9wcmVjZWRpbmdfY29tbWVudHMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKy8qIEZvbworICogQmFyCisgKiBCYXoKKy5mb28jYmFyCisgIGE6IGIKK1NBU1MKKy8qIEZvbworICogQmFyCisgKiBCYXogKi8KKy5mb28jYmFyIHsKKyAgYTogYjsKK30KK1NDU1MKKworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworLy8gRm9vCisvLyBCYXIKKy8vIEJhegorPWZvbworICBhOiBiCitTQVNTCisvLyBGb28KKy8vIEJhcgorLy8gQmF6CitAbWl4aW4gZm9vIHsKKyAgYTogYjsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1tZWRpYXRlbHlfZm9sbG93aW5nX2NvbW1lbnRzCisgICAgYXNzZXJ0X3Nhc3NfdG9fc2NzcyA8PFNDU1MsIDw8U0FTUworLmZvb2JhciB7CisgIC8vIHRyYWlsaW5nIGNvbW1lbnQKKyAgYTogMXB4OworfQorU0NTUworLmZvb2JhciAvLyB0cmFpbGluZyBjb21tZW50CisgIGE6IDFweAorU0FTUworCisgICAgYXNzZXJ0X3Nhc3NfdG9fc2NzcyA8PFNDU1MsIDw8U0FTUworLmZvb2JhciB7CisgIC8vIHRyYWlsaW5nIGNvbW1lbnQKKyAgYTogMXB4OworfQorU0NTUworLmZvb2JhciAgLyogdHJhaWxpbmcgY29tbWVudCAqLworICBhOiAxcHgKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVidWcKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICBAZGVidWcgMTJweAorCisgIGJhcjogYmF6CitTQVNTCitmb28geworICBAZGVidWcgMTJweDsKKworICBiYXI6IGJhejsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXJyb3IKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICBAZXJyb3IgIm9oIG5vISIKKworICBiYXI6IGJhegorU0FTUworZm9vIHsKKyAgQGVycm9yICJvaCBubyEiOworCisgIGJhcjogYmF6OworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9kaXJlY3RpdmVfd2l0aG91dF9jaGlsZHJlbgorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vCisgIEBmb28gI2JhciAiYmF6IgorCisgIGJhcjogYmF6CitTQVNTCitmb28geworICBAZm9vICNiYXIgImJheiI7CisKKyAgYmFyOiBiYXo7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RpcmVjdGl2ZV93aXRoX3Byb3BfY2hpbGRyZW4KKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICBAZm9vICNiYXIgImJheiIKKyAgICBhOiBiCisgICAgYzogZAorCisgIGJhcjogYmF6CitTQVNTCitmb28geworICBAZm9vICNiYXIgImJheiIgeworICAgIGE6IGI7CisgICAgYzogZDsKKyAgfQorCisgIGJhcjogYmF6OworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9kaXJlY3RpdmVfd2l0aF9ydWxlX2NoaWxkcmVuCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitmb28KKyAgQGZvbyAjYmFyICJiYXoiCisgICAgI2JsYXQKKyAgICAgIGE6IGIKKworICAgIC5iYW5nCisgICAgICBjOiBkCisgICAgICBlOiBmCisKKyAgYmFyOiBiYXoKK1NBU1MKK2ZvbyB7CisgIEBmb28gI2JhciAiYmF6IiB7CisgICAgI2JsYXQgeworICAgICAgYTogYjsKKyAgICB9CisKKyAgICAuYmFuZyB7CisgICAgICBjOiBkOworICAgICAgZTogZjsKKyAgICB9CisgIH0KKworICBiYXI6IGJhejsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGlyZWN0aXZlX3dpdGhfcnVsZV9hbmRfcHJvcF9jaGlsZHJlbgorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vCisgIEBmb28gI2JhciAiYmF6IgorICAgIGc6IGgKKworICAgICNibGF0CisgICAgICBhOiBiCisKKyAgICAuYmFuZworICAgICAgYzogZAorICAgICAgZTogZgorCisgICAgaTogagorCisgIGJhcjogYmF6CitTQVNTCitmb28geworICBAZm9vICNiYXIgImJheiIgeworICAgIGc6IGg7CisKKyAgICAjYmxhdCB7CisgICAgICBhOiBiOworICAgIH0KKworICAgIC5iYW5nIHsKKyAgICAgIGM6IGQ7CisgICAgICBlOiBmOworICAgIH0KKworICAgIGk6IGo7CisgIH0KKworICBiYXI6IGJhejsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2hhcnNldAorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworQGNoYXJzZXQgInV0Zi04IgorU0FTUworQGNoYXJzZXQgInV0Zi04IjsKK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9yCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitmb28KKyAgQGZvciAkYSBmcm9tICRiIHRvICRjCisgICAgYTogYgorCisgIEBmb3IgJGMgZnJvbSAxIHRvIDE2CisgICAgZDogZQorICAgIGY6IGcKK1NBU1MKK2ZvbyB7CisgIEBmb3IgJGEgZnJvbSAkYiB0byAkYyB7CisgICAgYTogYjsKKyAgfQorCisgIEBmb3IgJGMgZnJvbSAxIHRvIDE2IHsKKyAgICBkOiBlOworICAgIGY6IGc7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfd2hpbGUKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICBAd2hpbGUgZmxheigkYSArICRiKQorICAgIGE6IGIKKworICBAd2hpbGUgMQorICAgIGQ6IGUKKyAgICBmOiBnCitTQVNTCitmb28geworICBAd2hpbGUgZmxheigkYSArICRiKSB7CisgICAgYTogYjsKKyAgfQorCisgIEB3aGlsZSAxIHsKKyAgICBkOiBlOworICAgIGY6IGc7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWYKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICBAaWYgJGZvbyBvciAkYmFyCisgICAgYTogYgorCisgIEBpZiAkYmF6CisgICAgZDogZQorICBAZWxzZSBpZiAkYmFuZworICAgIGY6IGcKKyAgQGVsc2UKKyAgICBoOiBpCitTQVNTCitmb28geworICBAaWYgJGZvbyBvciAkYmFyIHsKKyAgICBhOiBiOworICB9CisKKyAgQGlmICRiYXogeworICAgIGQ6IGU7CisgIH0KKyAgQGVsc2UgaWYgJGJhbmcgeworICAgIGY6IGc7CisgIH0KKyAgQGVsc2UgeworICAgIGg6IGk7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWFjaAorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworYQorICBAZWFjaCAkbnVtYmVyIGluIDFweCAycHggM3B4IDRweAorICAgIGI6ICRudW1iZXIKKworYworICBAZWFjaCAkc3RyIGluIGZvbywgYmFyLCBiYXosIGJhbmcKKyAgICBkOiAkc3RyCisKK2MKKyAgQGVhY2ggJGtleSwgJHZhbHVlIGluIChmb286IDEsIGJhcjogMiwgYmF6OiAzKQorICAgIFwjeyRrZXl9OiAkdmFsdWUKK1NBU1MKK2EgeworICBAZWFjaCAkbnVtYmVyIGluIDFweCAycHggM3B4IDRweCB7CisgICAgYjogJG51bWJlcjsKKyAgfQorfQorCitjIHsKKyAgQGVhY2ggJHN0ciBpbiBmb28sIGJhciwgYmF6LCBiYW5nIHsKKyAgICBkOiAkc3RyOworICB9Cit9CisKK2MgeworICBAZWFjaCAka2V5LCAkdmFsdWUgaW4gKGZvbzogMSwgYmFyOiAyLCBiYXo6IDMpIHsKKyAgICBcI3ska2V5fTogJHZhbHVlOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydAorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworQGltcG9ydCBmb28KKworQGltcG9ydCB1cmwoYmFyLmNzcykKKworZm9vCisgIGJhcjogYmF6CitTQVNTCitAaW1wb3J0ICJmb28iOworCitAaW1wb3J0IHVybChiYXIuY3NzKTsKKworZm9vIHsKKyAgYmFyOiBiYXo7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK0BpbXBvcnQgZm9vLmNzcworCitAaW1wb3J0IHVybChiYXIuY3NzKQorCitmb28KKyAgYmFyOiBiYXoKK1NBU1MKK0BpbXBvcnQgImZvby5jc3MiOworCitAaW1wb3J0IHVybChiYXIuY3NzKTsKKworZm9vIHsKKyAgYmFyOiBiYXo7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF9hc19kaXJlY3RpdmVfaW5fc2FzcworICAgIGFzc2VydF9lcXVhbCAiQGltcG9ydCBmb28uY3NzXG4iLCB0b19zYXNzKCdAaW1wb3J0ICJmb28uY3NzIicpCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF9hc19kaXJlY3RpdmVfaW5fc2NzcworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworQGltcG9ydCAiZm9vLmNzcyIgcHJpbnQKK1NBU1MKK0BpbXBvcnQgImZvby5jc3MiIHByaW50OworU0NTUworCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitAaW1wb3J0IHVybChmb28uY3NzKSBzY3JlZW4sIHByaW50CitTQVNTCitAaW1wb3J0IHVybChmb28uY3NzKSBzY3JlZW4sIHByaW50OworU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hZGphY2VudF9pbXBvcnRzCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitAaW1wb3J0IGZvby5zYXNzCitAaW1wb3J0IGJhci5zY3NzCitAaW1wb3J0IGJhegorU0FTUworQGltcG9ydCAiZm9vLnNhc3MiOworQGltcG9ydCAiYmFyLnNjc3MiOworQGltcG9ydCAiYmF6IjsKK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9uX2FkamFjZW50X2ltcG9ydHMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK0BpbXBvcnQgZm9vLnNhc3MKKworQGltcG9ydCBiYXIuc2NzcworCitAaW1wb3J0IGJhegorU0FTUworQGltcG9ydCAiZm9vLnNhc3MiOworCitAaW1wb3J0ICJiYXIuc2NzcyI7CisKK0BpbXBvcnQgImJheiI7CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF93aXRoX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKyRmYW1pbHk6IHVucXVvdGUoIkRyb2lkK1NhbnMiKQorCitAaW1wb3J0IHVybCgiaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9XCN7JGZhbWlseX0iKQorU0FTUworJGZhbWlseTogdW5xdW90ZSgiRHJvaWQrU2FucyIpOworCitAaW1wb3J0IHVybCgiaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9XCN7JGZhbWlseX0iKTsKK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCisuZm9vCisgIEBleHRlbmQgLmJhcgorCisgIEBleHRlbmQgLmJhejpiYW5nCitTQVNTCisuZm9vIHsKKyAgQGV4dGVuZCAuYmFyOworCisgIEBleHRlbmQgLmJhejpiYW5nOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jb21tYV9leHRlbmRlZQorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworLmJhegorICBAZXh0ZW5kIC5mb28sIC5iYXIKK1NBU1MKKy5iYXogeworICBAZXh0ZW5kIC5mb28sIC5iYXI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2FyZ2xlc3NfbWl4aW5fZGVmaW5pdGlvbgorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworPWZvby1iYXIKKyAgYmF6CisgICAgYTogYgorU0FTUworQG1peGluIGZvby1iYXIgeworICBiYXogeworICAgIGE6IGI7CisgIH0KK30KK1NDU1MKKworICAgIGFzc2VydF9zY3NzX3RvX3Nhc3MgPDxTQVNTLCA8PFNDU1MKKz1mb28tYmFyCisgIGJhegorICAgIGE6IGIKK1NBU1MKK0BtaXhpbiBmb28tYmFyKCkgeworICBiYXogeworICAgIGE6IGI7CisgIH0KK30KK1NDU1MKKworICAgIGFzc2VydF9zYXNzX3RvX3Njc3MgPDxTQ1NTLCA8PFNBU1MKK0BtaXhpbiBmb28tYmFyIHsKKyAgYmF6IHsKKyAgICBhOiBiOworICB9Cit9CitTQ1NTCis9Zm9vLWJhcigpCisgIGJhegorICAgIGE6IGIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fZGVmaW5pdGlvbl93aXRob3V0X2RlZmF1bHRzCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCis9Zm9vLWJhcigkYmF6LCAkYmFuZykKKyAgYmF6CisgICAgYTogJGJheiAkYmFuZworU0FTUworQG1peGluIGZvby1iYXIoJGJheiwgJGJhbmcpIHsKKyAgYmF6IHsKKyAgICBhOiAkYmF6ICRiYW5nOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2RlZmluaXRpb25fd2l0aF9kZWZhdWx0cworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworPWZvby1iYXIoJGJheiwgJGJhbmc6IDEycHgpCisgIGJhegorICAgIGE6ICRiYXogJGJhbmcKK1NBU1MKK0BtaXhpbiBmb28tYmFyKCRiYXosICRiYW5nOiAxMnB4KSB7CisgIGJheiB7CisgICAgYTogJGJheiAkYmFuZzsKKyAgfQorfQorU0NTUworCisgICAgYXNzZXJ0X3Nhc3NfdG9fc2NzcyA8PFNDU1MsIDw8U0FTUworQG1peGluIGZvby1iYXIoJGJheiwgJGJhbmc6IGZvbykgeworICBiYXogeworICAgIGE6ICRiYXogJGJhbmc7CisgIH0KK30KK1NDU1MKKz1mb28tYmFyKCRiYXosICRiYW5nOiBmb28pCisgIGJhegorICAgIGE6ICRiYXogJGJhbmcKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXJnbGVzc19taXhpbl9pbmNsdWRlCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitmb28KKyAgK2Zvby1iYXIKKworICBhOiBibGlwCitTQVNTCitmb28geworICBAaW5jbHVkZSBmb28tYmFyOworCisgIGE6IGJsaXA7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2luY2x1ZGUKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICArZm9vLWJhcigxMnB4LCAiYmxheiIpCisKKyAgYTogYmxpcAorU0FTUworZm9vIHsKKyAgQGluY2x1ZGUgZm9vLWJhcigxMnB4LCAiYmxheiIpOworCisgIGE6IGJsaXA7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2luY2x1ZGVfd2l0aF9rZXl3b3JkX2FyZ3MKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICArZm9vLWJhcigxMnB4LCAiYmxheiIsICRibGlwOiBibGFwLCAkYmxvb3A6IGJsb3ApCisKKyAgK2Zvby1iYXIoJGJsaXA6IGJsYXAsICRibG9vcDogYmxvcCkKKworICBhOiBibGlwCitTQVNTCitmb28geworICBAaW5jbHVkZSBmb28tYmFyKDEycHgsICJibGF6IiwgJGJsaXA6IGJsYXAsICRibG9vcDogYmxvcCk7CisKKyAgQGluY2x1ZGUgZm9vLWJhcigkYmxpcDogYmxhcCwgJGJsb29wOiBibG9wKTsKKworICBhOiBibGlwOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jb25zZWN1dGl2ZV9taXhpbl9pbmNsdWRlcworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vCisgICtmb28tYmFyCisgICtmb28tYmFyCisKKyAgYTogYmxpcAorU0FTUworZm9vIHsKKyAgQGluY2x1ZGUgZm9vLWJhcjsKKyAgQGluY2x1ZGUgZm9vLWJhcjsKKworICBhOiBibGlwOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9pbmNsdWRlX3dpdGhfaHlwaGVuX2NvbnZlcnNpb25fa2V5d29yZF9hcmcKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICArZm9vLWJhcigkYS1iX2M6IHZhbCkKKworICBhOiBibGlwCitTQVNTCitmb28geworICBAaW5jbHVkZSBmb28tYmFyKCRhLWJfYzogdmFsKTsKKworICBhOiBibGlwOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hcmdsZXNzX2Z1bmN0aW9uX2RlZmluaXRpb24KKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK0BmdW5jdGlvbiBmb28oKQorICAkdmFyOiAxICsgMQorCisgIEByZXR1cm4gJHZhcgorU0FTUworQGZ1bmN0aW9uIGZvbygpIHsKKyAgJHZhcjogMSArIDE7CisKKyAgQHJldHVybiAkdmFyOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9kZWZpbml0aW9uX3dpdGhvdXRfZGVmYXVsdHMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK0BmdW5jdGlvbiBmb28oJHZhcjEsICR2YXIyKQorICBAaWYgJHZhcjEKKyAgICBAcmV0dXJuICR2YXIxICsgJHZhcjIKK1NBU1MKK0BmdW5jdGlvbiBmb28oJHZhcjEsICR2YXIyKSB7CisgIEBpZiAkdmFyMSB7CisgICAgQHJldHVybiAkdmFyMSArICR2YXIyOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX2RlZmluaXRpb25fd2l0aF9kZWZhdWx0cworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworQGZ1bmN0aW9uIGZvbygkdmFyMSwgJHZhcjI6IGZvbykKKyAgQGlmICR2YXIxCisgICAgQHJldHVybiAkdmFyMSArICR2YXIyCitTQVNTCitAZnVuY3Rpb24gZm9vKCR2YXIxLCAkdmFyMjogZm9vKSB7CisgIEBpZiAkdmFyMSB7CisgICAgQHJldHVybiAkdmFyMSArICR2YXIyOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX2RlZmluaXRpb24KKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKyR2YXIxOiAxMnB4ICsgMTVweAorCitmb28KKyAgJHZhcjI6IGZsYXooI2FiY2RlZikKKworICB2YWw6ICR2YXIxICR2YXIyCitTQVNTCiskdmFyMTogMTJweCArIDE1cHg7CisKK2ZvbyB7CisgICR2YXIyOiBmbGF6KCNhYmNkZWYpOworCisgIHZhbDogJHZhcjEgJHZhcjI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2d1YXJkZWRfdmFyaWFibGVfZGVmaW5pdGlvbgorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworJHZhcjE6IDEycHggKyAxNXB4ICFkZWZhdWx0CisKK2ZvbworICAkdmFyMjogZmxheigjYWJjZGVmKSAhZGVmYXVsdAorCisgIHZhbDogJHZhcjEgJHZhcjIKK1NBU1MKKyR2YXIxOiAxMnB4ICsgMTVweCAhZGVmYXVsdDsKKworZm9vIHsKKyAgJHZhcjI6IGZsYXooI2FiY2RlZikgIWRlZmF1bHQ7CisKKyAgdmFsOiAkdmFyMSAkdmFyMjsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlwbGVfdmFyaWFibGVfZGVmaW5pdGlvbnMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKyR2YXIxOiBmb28KKyR2YXIyOiBiYXIKKyR2YXIzOiBiYXoKKworJHZhcjQ6IGJpcAorJHZhcjU6IGJhcAorU0FTUworJHZhcjE6IGZvbzsKKyR2YXIyOiBiYXI7CiskdmFyMzogYmF6OworCiskdmFyNDogYmlwOworJHZhcjU6IGJhcDsKK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGl2aXNpb25fYXNzZXJ0ZWRfd2l0aF9wYXJlbnMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICBhOiAoMXB4IC8gMnB4KQorU0FTUworZm9vIHsKKyAgYTogKDFweCAvIDJweCk7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RpdmlzaW9uX25vdF9hc3NlcnRlZF93aGVuX3VubmVjZXNzYXJ5CisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCiskdmFyOiAxcHggLyAycHgKKworZm9vCisgIGE6ICR2YXIKK1NBU1MKKyR2YXI6IDFweCAvIDJweDsKKworZm9vIHsKKyAgYTogJHZhcjsKK30KK1NDU1MKKworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworJHZhcjogMXB4CisKK2ZvbworICBhOiAkdmFyIC8gMnB4CitTQVNTCiskdmFyOiAxcHg7CisKK2ZvbyB7CisgIGE6ICR2YXIgLyAycHg7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICBhOiAxICsgMXB4IC8gMnB4CitTQVNTCitmb28geworICBhOiAxICsgMXB4IC8gMnB4OworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9saXRlcmFsX3NsYXNoCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitmb28KKyAgYTogMXB4IC8gMnB4CitTQVNTCitmb28geworICBhOiAxcHggLyAycHg7Cit9CitTQ1NTCisKKyAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaXNzdWUgMTc4NworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vCisgIGE6IDFweCAvIDJweCAzcHgKK1NBU1MKK2ZvbyB7CisgIGE6IDFweCAvIDJweCAzcHg7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RpcmVjdGl2ZV93aXRoX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKyRiYXo6IDEyCisKK0Bmb28gYmFyXCN7JGJhen0gcXV4CisgIGE6IGIKK1NBU1MKKyRiYXo6IDEyOworCitAZm9vIGJhclwjeyRiYXp9IHF1eCB7CisgIGE6IGI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21lZGlhX3dpdGhfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworJGJhejogMTIKKworQG1lZGlhIGJhclwjeyRiYXp9CisgIGE6IGIKK1NBU1MKKyRiYXo6IDEyOworCitAbWVkaWEgYmFyXCN7JGJhen0geworICBhOiBiOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tZWRpYV93aXRoX2V4cHJlc3Npb25zCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCiskbWVkaWExOiBzY3JlZW4KKyRtZWRpYTI6IHByaW50CiskdmFyOiAtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW8KKyR2YWw6IDIwCisKK0BtZWRpYSBcI3skbWVkaWExfSBhbmQgKCR2YXIgKyAiLWZvbyI6ICR2YWwgKyA1KSwgb25seSBcI3skbWVkaWEyfQorICBhOiBiCitTQVNTCiskbWVkaWExOiBzY3JlZW47CiskbWVkaWEyOiBwcmludDsKKyR2YXI6IC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzsKKyR2YWw6IDIwOworCitAbWVkaWEgXCN7JG1lZGlhMX0gYW5kICgkdmFyICsgIi1mb28iOiAkdmFsICsgNSksIG9ubHkgXCN7JG1lZGlhMn0geworICBhOiBiOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tZWRpYV93aXRoX2ZlYXR1cmUKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK0BtZWRpYSBzY3JlZW4gYW5kICgtd2Via2l0LXRyYW5zZm9ybS0zZCkKKyAgYTogYgorU0FTUworQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtdHJhbnNmb3JtLTNkKSB7CisgIGE6IGI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3N1cHBvcnRzX3dpdGhfZXhwcmVzc2lvbnMKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKyRxdWVyeTogIihmZWF0dXJlMTogdmFsKSIKKyRmZWF0dXJlOiBmZWF0dXJlMgorJHZhbDogdmFsCisKK0BzdXBwb3J0cyAoXCN7JHF1ZXJ5fSBhbmQgKCRmZWF0dXJlOiAkdmFsKSkgb3IgKG5vdCAoJGZlYXR1cmUgKyAzOiAkdmFsICsgNCkpCisgIGZvbworICAgIGE6IGIKK1NBU1MKKyRxdWVyeTogIihmZWF0dXJlMTogdmFsKSI7CiskZmVhdHVyZTogZmVhdHVyZTI7CiskdmFsOiB2YWw7CisKK0BzdXBwb3J0cyAoXCN7JHF1ZXJ5fSBhbmQgKCRmZWF0dXJlOiAkdmFsKSkgb3IgKG5vdCAoJGZlYXR1cmUgKyAzOiAkdmFsICsgNCkpIHsKKyAgZm9vIHsKKyAgICBhOiBiOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgICMgSGFja3MKKworICBkZWYgdGVzdF9kZWNsYXJhdGlvbl9oYWNrcworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZm9vCisgIF9uYW1lOiB2YWwKKyAgKm5hbWU6IHZhbAorICAjbmFtZTogdmFsCisgIC5uYW1lOiB2YWwKKyAgbmFtZS8qKi86IHZhbAorICBuYW1lLypcXCoqLzogdmFsCisgIG5hbWU6IHZhbAorU0FTUworZm9vIHsKKyAgX25hbWU6IHZhbDsKKyAgKm5hbWU6IHZhbDsKKyAgI25hbWU6IHZhbDsKKyAgLm5hbWU6IHZhbDsKKyAgbmFtZS8qKi86IHZhbDsKKyAgbmFtZS8qXFwqKi86IHZhbDsKKyAgbmFtZTogdmFsOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9vbGRfZGVjbGFyYXRpb25faGFja3MKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MsIG9wdGlvbnM6IHtvbGQ6IHRydWV9fQorZm9vCisgIDpfbmFtZSB2YWwKKyAgOipuYW1lIHZhbAorICA6I25hbWUgdmFsCisgIDoubmFtZSB2YWwKKyAgOm5hbWUgdmFsCitTQVNTCitmb28geworICBfbmFtZTogdmFsOworICAqbmFtZTogdmFsOworICAjbmFtZTogdmFsOworICAubmFtZTogdmFsOworICBuYW1lOiB2YWw7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2hhY2tzCisgICAgYXNzZXJ0X3NlbGVjdG9yX3JlbmRlcnMgPSBsYW1iZGEgZG8gfHN8CisgICAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKyN7c30KKyAgYTogYgorU0FTUworI3tzfSB7CisgIGE6IGI7Cit9CitTQ1NTCisgICAgZW5kCisKKyAgICBhc3NlcnRfc2VsZWN0b3JfcmVuZGVyc1snPiBFJ10KKyAgICBhc3NlcnRfc2VsZWN0b3JfcmVuZGVyc1snKyBFJ10KKyAgICBhc3NlcnRfc2VsZWN0b3JfcmVuZGVyc1snfiBFJ10KKyAgICBhc3NlcnRfc2VsZWN0b3JfcmVuZGVyc1snPiA+IEUnXQorCisgICAgYXNzZXJ0X3NlbGVjdG9yX3JlbmRlcnNbJ0UqJ10KKyAgICBhc3NlcnRfc2VsZWN0b3JfcmVuZGVyc1snRSouZm9vJ10KKyAgICBhc3NlcnRfc2VsZWN0b3JfcmVuZGVyc1snRSo6aG92ZXInXQorICBlbmQKKworICBkZWYgdGVzdF9kaXNhbGxvd2VkX2NvbG9uX2hhY2sKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgJ1RoZSAiOm5hbWU6IHZhbCIgaGFjayBpcyBub3QgYWxsb3dlZCBpbiB0aGUgU2FzcyBpbmRlbnRlZCBzeW50YXgnKSBkbworICAgICAgdG9fc2FzcygiZm9vIHs6bmFtZTogdmFsO30iLCA6c3ludGF4ID0+IDpzY3NzKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfcHJvcGVydGllcworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworZGl2CisgIGJlZm9yZTogYmVmb3JlCisgIGJhY2tncm91bmQ6CisgICAgY29sb3I6IGJsdWUKKyAgICByZXBlYXQ6IG5vLXJlcGVhdAorICBhZnRlcjogYWZ0ZXIKK1NBU1MKK2RpdiB7CisgIGJlZm9yZTogYmVmb3JlOworICBiYWNrZ3JvdW5kOiB7CisgICAgY29sb3I6IGJsdWU7CisgICAgcmVwZWF0OiBuby1yZXBlYXQ7CisgIH07CisgIGFmdGVyOiBhZnRlcjsKK30KKworU0NTUworICBlbmQKKworICBkZWYgdGVzdF9kYXNoZXJpemUKKyAgICBhc3NlcnRfc2Fzc190b19zY3NzKDw8U0NTUywgPDxTQVNTLCBvcHRpb25zOiB7ZGFzaGVyaXplOiB0cnVlfSkKK0BtaXhpbiB1bmRlci1zY29yZWQtbWl4aW4oJHVuZGVyLXNjb3JlZC1hcmc6ICR1bmRlci1zY29yZWQtZGVmYXVsdCkgeworICBiYXI6ICR1bmRlci1zY29yZWQtYXJnOworfQorCitkaXYgeworICBmb286IHVuZGVyLXNjb3JlZC1mbigkdW5kZXItc2NvcmVkLXZhciArICJiZWZvcmVcI3skYW5vdGhlci11bmRlci1zY29yZWQtdmFyfWFmdGVyIik7CisKKyAgQGluY2x1ZGUgdW5kZXItc2NvcmVkLW1peGluKCRwYXNzZWQtYXJnKTsKKworICBzZWxlY3Rvci1cI3skdW5kZXItc2NvcmVkLWludGVycH06IGJvbGQ7Cit9CisKK0BpZiAkdW5kZXItc2NvcmVkIHsKKyAgQGZvciAkZm9yLXZhciBmcm9tICRmcm9tLXZhciB0byAkdG8tdmFyIHsKKyAgICBAd2hpbGUgJHdoaWxlLXZhciA9PSB0cnVlIHsKKyAgICAgICR3aGlsZS12YXI6IGZhbHNlOworICAgIH0KKyAgfQorfQorU0NTUworPXVuZGVyX3Njb3JlZF9taXhpbigkdW5kZXJfc2NvcmVkX2FyZzogJHVuZGVyX3Njb3JlZF9kZWZhdWx0KQorICBiYXI6ICR1bmRlcl9zY29yZWRfYXJnCitkaXYKKyAgZm9vOiB1bmRlcl9zY29yZWRfZm4oJHVuZGVyX3Njb3JlZF92YXIgKyAiYmVmb3JlXCN7JGFub3RoZXJfdW5kZXJfc2NvcmVkX3Zhcn1hZnRlciIpCisgICt1bmRlcl9zY29yZWRfbWl4aW4oJHBhc3NlZF9hcmcpCisgIHNlbGVjdG9yLVwjeyR1bmRlcl9zY29yZWRfaW50ZXJwfTogYm9sZAorQGlmICR1bmRlcl9zY29yZWQKKyAgQGZvciAkZm9yX3ZhciBmcm9tICRmcm9tX3ZhciB0byAkdG9fdmFyCisgICAgQHdoaWxlICR3aGlsZV92YXIgPT0gdHJ1ZQorICAgICAgJHdoaWxlX3ZhciA6IGZhbHNlCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvdWRfY29tbWVudF9jb252ZXJzaW9uCisgICAgYXNzZXJ0X2NvbnZlcnRzKDw8U0FTUywgPDxTQ1NTKQorLyohIFwjeyJpbnRlcnBvbGF0ZWQifQorU0FTUworLyohIFwjeyJpbnRlcnBvbGF0ZWQifSAqLworU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jb250ZW50X2NvbnZlcnNpb24KKyAgICBhc3NlcnRfY29udmVydHMoPDxTQVNTLCA8PFNDU1MpCiskY29sb3I6IGJsdWUKKworPWNvbnRleHQoJGNsYXNzLCAkY29sb3I6IHJlZCkKKyAgLlwjeyRjbGFzc30KKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3IKKworICAgIEBjb250ZW50CisKKyAgICBib3JkZXItY29sb3I6ICRjb2xvcgorCisrY29udGV4dChwYXJlbnQpCisgICtjb250ZXh0KGNoaWxkLCAkY29sb3I6IHllbGxvdykKKyAgICBjb2xvcjogJGNvbG9yCitTQVNTCiskY29sb3I6IGJsdWU7CisKK0BtaXhpbiBjb250ZXh0KCRjbGFzcywgJGNvbG9yOiByZWQpIHsKKyAgLlwjeyRjbGFzc30geworICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjsKKworICAgIEBjb250ZW50OworCisgICAgYm9yZGVyLWNvbG9yOiAkY29sb3I7CisgIH0KK30KKworQGluY2x1ZGUgY29udGV4dChwYXJlbnQpIHsKKyAgQGluY2x1ZGUgY29udGV4dChjaGlsZCwgJGNvbG9yOiB5ZWxsb3cpIHsKKyAgICBjb2xvcjogJGNvbG9yOworICB9Cit9CitTQ1NTCisKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW1wdHlfY29udGVudAorICAgIGFzc2VydF9zY3NzX3RvX3Njc3MoPDxTQ1NTKQorQG1peGluIGZvbyB7CisgIEBjb250ZW50OworfQorCitAaW5jbHVkZSBmb28ge30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGxhY2Vob2xkZXJfY29udmVyc2lvbgorICAgIGFzc2VydF9jb252ZXJ0cyg8PFNBU1MsIDw8U0NTUykKKyNjb250ZW50IGElZm9vLmJhcgorICBjb2xvcjogYmx1ZQorU0FTUworI2NvbnRlbnQgYSVmb28uYmFyIHsKKyAgY29sb3I6IGJsdWU7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3JlZmVyZW5jZV9zZWxlY3RvcgorICAgIGFzc2VydF9jb252ZXJ0cyg8PFNBU1MsIDw8U0NTUykKK2ZvbyAvYmFyfGJhei8gYmFuZworICBhOiBiCitTQVNTCitmb28gL2JhcnxiYXovIGJhbmcgeworICBhOiBiOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zdWJqZWN0CisgICAgYXNzZXJ0X2NvbnZlcnRzKDw8U0FTUywgPDxTQ1NTKQorZm9vIGJhciEgYmF6CisgIGE6IGIKK1NBU1MKK2ZvbyBiYXIhIGJheiB7CisgIGE6IGI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3BsYWNlaG9sZGVyX2ludGVyb3BsYXRpb25fY29udmVyc2lvbgorICAgIGFzc2VydF9jb252ZXJ0cyg8PFNBU1MsIDw8U0NTUykKKyRmb286IGZvbworCislXCN7JGZvb30KKyAgY29sb3I6IGJsdWUKKworLmJhcgorICBAZXh0ZW5kICVmb28KK1NBU1MKKyRmb286IGZvbzsKKworJVwjeyRmb299IHsKKyAgY29sb3I6IGJsdWU7Cit9CisKKy5iYXIgeworICBAZXh0ZW5kICVmb287Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2luZGVudAorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUywgb3B0aW9uczoge2luZGVudDogIiAgICAifQorZm9vIGJhcgorICAgIGJheiBiYW5nCisgICAgICAgIGJhejogYmFuZworICAgICAgICBiaXA6IGJvcAorCisgICAgYmxhdDogYm9vCitTQVNTCitmb28gYmFyIHsKKyAgICBiYXogYmFuZyB7CisgICAgICAgIGJhejogYmFuZzsKKyAgICAgICAgYmlwOiBib3A7CisgICAgfQorCisgICAgYmxhdDogYm9vOworfQorU0NTUworCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTLCBvcHRpb25zOiB7aW5kZW50OiAiXHQifQorZm9vIGJhcgorCWJheiBiYW5nCisJCWJhejogYmFuZworCQliaXA6IGJvcAorCisJYmxhdDogYm9vCitTQVNTCitmb28gYmFyIHsKKwliYXogYmFuZyB7CisJCWJhejogYmFuZzsKKwkJYmlwOiBib3A7CisJfQorCisJYmxhdDogYm9vOworfQorU0NTUworCisgICAgYXNzZXJ0X3Nhc3NfdG9fc2NzcyA8PFNDU1MsIDw8U0FTUywgb3B0aW9uczoge2luZGVudDogIiAgICAifQorZm9vIGJhciB7CisgICAgYmF6IGJhbmcgeworICAgICAgICBiYXo6IGJhbmc7CisgICAgICAgIGJpcDogYm9wOworICAgIH0KKworICAgIGJsYXQ6IGJvbzsKK30KK1NDU1MKK2ZvbyBiYXIKKyAgYmF6IGJhbmcKKyAgICBiYXo6IGJhbmcKKyAgICBiaXA6IGJvcAorCisgIGJsYXQ6IGJvbworU0FTUworCisgICAgYXNzZXJ0X3Nhc3NfdG9fc2NzcyA8PFNDU1MsIDw8U0FTUywgb3B0aW9uczoge2luZGVudDogIlx0In0KK2ZvbyBiYXIgeworCWJheiBiYW5nIHsKKwkJYmF6OiBiYW5nOworCQliaXA6IGJvcDsKKwl9CisKKwlibGF0OiBib287Cit9CitTQ1NTCitmb28gYmFyCisgIGJheiBiYW5nCisgICAgYmF6OiBiYW5nCisgICAgYmlwOiBib3AKKworICBibGF0OiBib28KK1NBU1MKKworICAgIGFzc2VydF9zY3NzX3RvX3Nhc3MgPDxTQVNTLCA8PFNDU1MsIG9wdGlvbnM6IHtpbmRlbnQ6ICIgICAgIn0KK2ZvbyBiYXIKKyAgICBiYXogYmFuZworICAgICAgICBiYXo6IGJhbmcKKyAgICAgICAgYmlwOiBib3AKKworICAgIGJsYXQ6IGJvbworU0FTUworZm9vIGJhciB7CisgIGJheiBiYW5nIHsKKyAgICBiYXo6IGJhbmc7CisgICAgYmlwOiBib3A7CisgIH0KKworICBibGF0OiBib287Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfc2Nzc190b19zYXNzIDw8U0FTUywgPDxTQ1NTLCBvcHRpb25zOiB7aW5kZW50OiAiXHQifQorZm9vIGJhcgorCWJheiBiYW5nCisJCWJhejogYmFuZworCQliaXA6IGJvcAorCisJYmxhdDogYm9vCitTQVNTCitmb28gYmFyIHsKKyAgYmF6IGJhbmcgeworICAgIGJhejogYmFuZzsKKyAgICBiaXA6IGJvcDsKKyAgfQorCisgIGJsYXQ6IGJvbzsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3dpdGhfb3B0aW9uYWwKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKK2ZvbworICBAZXh0ZW5kIC5iYXIgIW9wdGlvbmFsCitTQVNTCitmb28geworICBAZXh0ZW5kIC5iYXIgIW9wdGlvbmFsOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl92YXJfYXJncworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworPWZvbygkYXJncy4uLikKKyAgYTogYgorCis9YmFyKCRhLCAkYXJncy4uLikKKyAgYTogYgorCisuZm9vCisgICtmb28oJGxpc3QuLi4pCisKKyAgK2JhcigxLCAkbGlzdC4uLikKK1NBU1MKK0BtaXhpbiBmb28oJGFyZ3MuLi4pIHsKKyAgYTogYjsKK30KKworQG1peGluIGJhcigkYSwgJGFyZ3MuLi4pIHsKKyAgYTogYjsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGZvbygkbGlzdC4uLik7CisKKyAgQGluY2x1ZGUgYmFyKDEsICRsaXN0Li4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fdmFyX2t3YXJncworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworPWZvbygkYTogYiwgJGM6IGQpCisgIGE6ICRhCisgIGM6ICRjCisKKy5mb28KKyAgK2ZvbygkbGlzdC4uLiwgJG1hcC4uLikKKworICArZm9vKHBvcywgJGxpc3QuLi4sICRrd2Q6IHZhbCwgJG1hcC4uLikKK1NBU1MKK0BtaXhpbiBmb28oJGE6IGIsICRjOiBkKSB7CisgIGE6ICRhOworICBjOiAkYzsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGZvbygkbGlzdC4uLiwgJG1hcC4uLik7CisKKyAgQGluY2x1ZGUgZm9vKHBvcywgJGxpc3QuLi4sICRrd2Q6IHZhbCwgJG1hcC4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3Zhcl9hcmdzCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitAZnVuY3Rpb24gZm9vKCRhcmdzLi4uKQorICBAcmV0dXJuIGZvbworCitAZnVuY3Rpb24gYmFyKCRhLCAkYXJncy4uLikKKyAgQHJldHVybiBiYXIKKworLmZvbworICBhOiBmb28oJGxpc3QuLi4pCisgIGI6IGJhcigxLCAkbGlzdC4uLikKK1NBU1MKK0BmdW5jdGlvbiBmb28oJGFyZ3MuLi4pIHsKKyAgQHJldHVybiBmb287Cit9CisKK0BmdW5jdGlvbiBiYXIoJGEsICRhcmdzLi4uKSB7CisgIEByZXR1cm4gYmFyOworfQorCisuZm9vIHsKKyAgYTogZm9vKCRsaXN0Li4uKTsKKyAgYjogYmFyKDEsICRsaXN0Li4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fdmFyX2t3YXJncworICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworQGZ1bmN0aW9uIGZvbygkYTogYiwgJGM6IGQpCisgIEByZXR1cm4gZm9vCisKKy5mb28KKyAgYTogZm9vKCRsaXN0Li4uLCAkbWFwLi4uKQorICBiOiBmb28ocG9zLCAkbGlzdC4uLiwgJGt3ZDogdmFsLCAkbWFwLi4uKQorU0FTUworQGZ1bmN0aW9uIGZvbygkYTogYiwgJGM6IGQpIHsKKyAgQHJldHVybiBmb287Cit9CisKKy5mb28geworICBhOiBmb28oJGxpc3QuLi4sICRtYXAuLi4pOworICBiOiBmb28ocG9zLCAkbGlzdC4uLiwgJGt3ZDogdmFsLCAkbWFwLi4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdAorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworLmZvbworICBAYXQtcm9vdAorICAgIC5iYXIKKyAgICAgIGE6IGIKKworICAgIC5iYXoKKyAgICAgIGM6IGQKK1NBU1MKKy5mb28geworICBAYXQtcm9vdCB7CisgICAgLmJhciB7CisgICAgICBhOiBiOworICAgIH0KKworICAgIC5iYXogeworICAgICAgYzogZDsKKyAgICB9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF93aXRoX3NlbGVjdG9yCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCisuZm9vCisgIEBhdC1yb290IC5iYXIKKyAgICBhOiBiCitTQVNTCisuZm9vIHsKKyAgQGF0LXJvb3QgLmJhciB7CisgICAgYTogYjsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhvdXQKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKy5mb28KKyAgQGF0LXJvb3QgKHdpdGhvdXQ6IG1lZGlhIHJ1bGUpCisgICAgYTogYgorU0FTUworLmZvbyB7CisgIEBhdC1yb290ICh3aXRob3V0OiBtZWRpYSBydWxlKSB7CisgICAgYTogYjsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGgKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKy5mb28KKyAgQGF0LXJvb3QgKHdpdGg6IG1lZGlhIHJ1bGUpCisgICAgYTogYgorU0FTUworLmZvbyB7CisgIEBhdC1yb290ICh3aXRoOiBtZWRpYSBydWxlKSB7CisgICAgYTogYjsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl92YXJfa3dhcmdzX3dpdGhfbGlzdAorICAgIGFzc2VydF9jb252ZXJ0cyA8PFNBU1MsIDw8U0NTUworQGZ1bmN0aW9uIGZvbygkYTogYiwgJGM6IGQpCisgIEByZXR1cm4gJGEsICRjCisKKy5mb28KKyAgYTogZm9vKCRsaXN0Li4uLCAkbWFwLi4uKQorU0FTUworQGZ1bmN0aW9uIGZvbygkYTogYiwgJGM6IGQpIHsKKyAgQHJldHVybiAkYSwgJGM7Cit9CisKKy5mb28geworICBhOiBmb28oJGxpc3QuLi4sICRtYXAuLi4pOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9rZXlmcmFtZXMKKyAgICBhc3NlcnRfY29udmVydHMoPDxTQVNTLCA8PFNDU1MpCitAa2V5ZnJhbWVzIGlkZW50aWZpZXIKKyAgMCUKKyAgICB0b3A6IDAKKyAgICBsZWZ0OiAwCisKKyAgMzAlCisgICAgdG9wOiA1MHB4CisKKyAgNjglLCA3MiUKKyAgICBsZWZ0OiA1MHB4CisKKyAgMTAwJQorICAgIHRvcDogMTAwcHgKKyAgICBsZWZ0OiAxMDAlCitTQVNTCitAa2V5ZnJhbWVzIGlkZW50aWZpZXIgeworICAwJSB7CisgICAgdG9wOiAwOworICAgIGxlZnQ6IDA7CisgIH0KKworICAzMCUgeworICAgIHRvcDogNTBweDsKKyAgfQorCisgIDY4JSwgNzIlIHsKKyAgICBsZWZ0OiA1MHB4OworICB9CisKKyAgMTAwJSB7CisgICAgdG9wOiAxMDBweDsKKyAgICBsZWZ0OiAxMDAlOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgICMjIFJlZ3Jlc3Npb24gVGVzdHMKKworICBkZWYgdGVzdF9saXN0X2luX2FyZ3MKKyAgICBhc3NlcnRfY29udmVydHMoPDxTQVNTLCA8PFNDU1MpCisrbWl4aW4oKGEsIGIsIGMpKQorCisrbWl4aW4oJGFyZzogKGEsIGIsIGMpKQorCisrbWl4aW4oYSwgYiwgKGMsIGQsIGUpLi4uKQorU0FTUworQGluY2x1ZGUgbWl4aW4oKGEsIGIsIGMpKTsKKworQGluY2x1ZGUgbWl4aW4oJGFyZzogKGEsIGIsIGMpKTsKKworQGluY2x1ZGUgbWl4aW4oYSwgYiwgKGMsIGQsIGUpLi4uKTsKK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWVkaWFfcXVlcnlfd2l0aF9leHByCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCitAbWVkaWEgZm9vIGFuZCAoYmFyOiBiYXopCisgIGE6IGIKK1NBU1MKK0BtZWRpYSBmb28gYW5kIChiYXI6IGJheikgeworICBhOiBiOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfaWZfc3RhdGVtZW50cworICAgIGFzc2VydF9jb252ZXJ0cyg8PFNBU1MsIDw8U0NTUykKK0BpZiAkZm9vCisgIG9uZQorICAgIGE6IGIKK0BlbHNlCisgIEBpZiAkYmFyCisgICAgdHdvCisgICAgICBhOiBiCisgIEBlbHNlCisgICAgdGhyZWUKKyAgICAgIGE6IGIKK1NBU1MKK0BpZiAkZm9vIHsKKyAgb25lIHsKKyAgICBhOiBiOworICB9Cit9CitAZWxzZSB7CisgIEBpZiAkYmFyIHsKKyAgICB0d28geworICAgICAgYTogYjsKKyAgICB9CisgIH0KKyAgQGVsc2UgeworICAgIHRocmVlIHsKKyAgICAgIGE6IGI7CisgICAgfQorICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbW1lbnRfaW5kZW50YXRpb24KKyAgICBhc3NlcnRfY29udmVydHMoPDxTQVNTLCA8PFNDU1MsIG9wdGlvbnM6IHtpbmRlbnQ6ICcgICAgJ30pCitmb28KKyAgICAvLyBiYXIKKyAgICAvKiBiYXoKKyAgICBhOiBiCitTQVNTCitmb28geworICAgIC8vIGJhcgorICAgIC8qIGJheiAqLworICAgIGE6IGI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2tleXdvcmRfYXJndW1lbnRzCisgICAgYXNzZXJ0X2NvbnZlcnRzKDw8U0FTUywgPDxTQ1NTLCBvcHRpb25zOiB7ZGFzaGVyaXplOiB0cnVlfSkKKyRmb286IGZvbygkZGFzaC1lZDogMnB4KQorU0FTUworJGZvbzogZm9vKCRkYXNoLWVkOiAycHgpOworU0NTUworICAgIGFzc2VydF9zY3NzX3RvX3Nhc3MoPDxTQVNTLCA8PFNDU1MsIG9wdGlvbnM6IHtkYXNoZXJpemU6IHRydWV9KQorJGZvbzogZm9vKCRkYXNoLWVkOiAycHgpCitTQVNTCiskZm9vOiBmb28oJGRhc2hfZWQ6IDJweCk7CitTQ1NTCisgICAgYXNzZXJ0X3Nhc3NfdG9fc2Nzcyg8PFNDU1MsIDw8U0FTUywgb3B0aW9uczoge2Rhc2hlcml6ZTogdHJ1ZX0pCiskZm9vOiBmb28oJGRhc2gtZWQ6IDJweCk7CitTQ1NTCiskZm9vOiBmb28oJGRhc2hfZWQ6IDJweCkKK1NBU1MKKyAgICBhc3NlcnRfY29udmVydHMoPDxTQVNTLCA8PFNDU1MpCiskZm9vOiBmb28oJHVuZGVyX3Njb3JlZDogMXB4KQorU0FTUworJGZvbzogZm9vKCR1bmRlcl9zY29yZWQ6IDFweCk7CitTQ1NTCisgICAgYXNzZXJ0X2NvbnZlcnRzKDw8U0FTUywgPDxTQ1NTKQorJGZvbzogZm9vKCRkYXNoLWVkOiAycHgsICR1bmRlcl9zY29yZWQ6IDFweCkKK1NBU1MKKyRmb286IGZvbygkZGFzaC1lZDogMnB4LCAkdW5kZXJfc2NvcmVkOiAxcHgpOworU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hbWJpZ3VvdXNfbmVnYXRpb24KKyAgICBhc3NlcnRfY29udmVydHMoPDxTQVNTLCA8PFNDU1MsIG9wdGlvbnM6IHtpbmRlbnQ6ICcgICAgJ30pCitmb28KKyAgICBvazogLSRmb28KKyAgICBjb21tYTogMTBweCwgLSRmb28KKyAgICBuZWVkcy1wYXJlbnM6IDEwcHggKC0kZm9vKQorU0FTUworZm9vIHsKKyAgICBvazogLSRmb287CisgICAgY29tbWE6IDEwcHgsIC0kZm9vOworICAgIG5lZWRzLXBhcmVuczogMTBweCAoLSRmb28pOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZV93aXRoX2dsb2JhbAorICAgIGFzc2VydF9jb252ZXJ0cyg8PFNBU1MsIDw8U0NTUykKKyR2YXI6IDEKKworZm9vCisgICR2YXI6IDIgIWdsb2JhbAorICAkdmFyOiAzICFnbG9iYWwgIWRlZmF1bHQKK1NBU1MKKyR2YXI6IDE7CisKK2ZvbyB7CisgICR2YXI6IDIgIWdsb2JhbDsKKyAgJHZhcjogMyAhZ2xvYmFsICFkZWZhdWx0OworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9pbXBvcnRfd2l0aF9zdXBwb3J0c19jbGF1c2UKKyAgICBhc3NlcnRfY29udmVydHMoPDwnU0FTUycsIDw8J1NDU1MnKQorQGltcG9ydCB1cmwoImZhbGxiYWNrLWxheW91dC5jc3MiKSBzdXBwb3J0cyhub3QgKGRpc3BsYXk6ICN7JGRpc3BsYXktdHlwZX0pKQorU0FTUworQGltcG9ydCB1cmwoImZhbGxiYWNrLWxheW91dC5jc3MiKSBzdXBwb3J0cyhub3QgKGRpc3BsYXk6ICN7JGRpc3BsYXktdHlwZX0pKTsKK1NDU1MKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2NzczJzYXNzX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jc3Myc2Fzc190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1NjFhYzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jc3Myc2Fzc190ZXN0LnJiCkBAIC0wLDAgKzEsNTIzIEBACityZXF1aXJlICdtaW5pdGVzdC9hdXRvcnVuJworcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3Nhc3MvY3NzJworCitjbGFzcyBDU1MyU2Fzc1Rlc3QgPCBNaW5pVGVzdDo6VGVzdAorICBkZWYgdGVzdF9iYXNpYworICAgIGNzcyA9IDw8Q1NTCitoMSB7CisgIGNvbG9yOiByZWQ7Cit9CitDU1MKKyAgICBhc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyhjc3MpKQoraDEKKyAgY29sb3I6IHJlZAorU0FTUworICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9lcXVhbCg8PFNBU1MsIGNzczJzYXNzKGNzcywgOm9sZCA9PiB0cnVlKSl9CitoMQorICA6Y29sb3IgcmVkCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RpbmcKKyAgICBhc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyg8PENTUykpCitsaQorICBkaXNwbGF5OiBub25lCisKKyAgYQorICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZQorCisgICAgc3BhbgorICAgICAgY29sb3I6IHllbGxvdworCisgICAgJjpob3ZlcgorICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKK1NBU1MKK2xpIHsKKyAgZGlzcGxheTogbm9uZTsKK30KKworbGkgYSB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworbGkgYSBzcGFuIHsKKyAgY29sb3I6IHllbGxvdzsKK30KKworbGkgYTpob3ZlciB7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25vX25lc3RpbmdfYXJvdW5kX3J1bGVzCisgICAgYXNzZXJ0X2VxdWFsKDw8U0FTUywgY3NzMnNhc3MoPDxDU1MpKQorZGl2IC53YXJuaW5nCisgIGNvbG9yOiAjZDIxYTE5CisKK3NwYW4gLmRlYnVnCisgIGN1cnNvcjogY3Jvc3NoYWlyCisKK2RpdiAuZGVidWcKKyAgY3Vyc29yOiBkZWZhdWx0CitTQVNTCitkaXYgLndhcm5pbmcgeworICBjb2xvcjogI2QyMWExOTsgfQorc3BhbiAuZGVidWcgeworICBjdXJzb3I6IGNyb3NzaGFpcjt9CitkaXYgLmRlYnVnIHsKKyAgY3Vyc29yOiBkZWZhdWx0OyB9CitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tbWVudHNfbXVsdGlsaW5lCisgICAgY3NzID0gPDxDU1MKKy8qIGNvbW1lbnQgKi8KK2VsZXBoYW50LnJhd3IgeworICByYW1wYWdlczogZXhjZXNzaXZlbHk7Cit9CisKKy8qIGFjdHVhbCBtdWx0aWxpbmUKKyAgY29tbWVudCAqLworc3Bhbi50dXJrZXkgeworICBpc2Rpbm5lcjogdHJ1ZTsKK30KKworLnR1cmR1Y2tlbiB7CisgIC8qIFNvdW5kcyBmdW5ueQorICAgICBkb2Vzbid0IGl0ICovCisgIGNoaW1lcmE6IG5vdF9yZWFsbHk7Cit9CisKKyNvdmVyaGVyZSB7CisgIGJvcmVkOiBzb3J0YTsgLyogaXQncyBmb3IgYSBnb29kCisgIGNhdXNlICovCisgIGJldHRlcl90aGFuOiB0aHJlYWRfcG9vbHM7Cit9CisKKyNvbmVfbW9yZSB7CisgIGZpbmFsbHk6IHNyc2x5OworfSAvKiBqdXN0IGEgbGluZSBoZXJlICovCitDU1MKKyAgICBzYXNzID0gPDxTQVNTCisvKiBjb21tZW50CisKK2VsZXBoYW50LnJhd3IKKyAgcmFtcGFnZXM6IGV4Y2Vzc2l2ZWx5CisKKy8qIGFjdHVhbCBtdWx0aWxpbmUKKyAqY29tbWVudAorCitzcGFuLnR1cmtleQorICBpc2Rpbm5lcjogdHJ1ZQorCisudHVyZHVja2VuCisgIC8qIFNvdW5kcyBmdW5ueQorICAgKiBkb2Vzbid0IGl0CisgIGNoaW1lcmE6IG5vdF9yZWFsbHkKKworI292ZXJoZXJlCisgIGJvcmVkOiBzb3J0YQorCisgIC8qICAgICAgICAgICAgICAgICAgaXQncyBmb3IgYSBnb29kCisgICAqIGNhdXNlCisgIGJldHRlcl90aGFuOiB0aHJlYWRfcG9vbHMKKworI29uZV9tb3JlCisgIGZpbmFsbHk6IHNyc2x5CisKKy8qIGp1c3QgYSBsaW5lIGhlcmUKK1NBU1MKKyAgICBhc3NlcnRfZXF1YWwoc2FzcywgY3NzMnNhc3MoY3NzKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9sZF9jb21tYXMKKyAgICBhc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyg8PENTUykpCitsaQorICAub25lLCAudHdvCisgICAgY29sb3I6IHJlZAorU0FTUworbGkgLm9uZSB7CisgIGNvbG9yOiByZWQ7Cit9CitsaSAudHdvIHsKKyAgY29sb3I6IHJlZDsKK30KK0NTUworCisgICAgYXNzZXJ0X2VxdWFsKDw8U0FTUywgY3NzMnNhc3MoPDxDU1MpKQorLm9uZQorICBjb2xvcjogZ3JlZW4KKworLnR3bworICBjb2xvcjogZ3JlZW4KKyAgY29sb3I6IHJlZAorCisudGhyZWUKKyAgY29sb3I6IHJlZAorU0FTUworLm9uZSwgLnR3byB7CisgIGNvbG9yOiBncmVlbjsKK30KKworLnR3bywgLnRocmVlIHsKKyAgY29sb3I6IHJlZDsKK30KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9iYWRfZm9ybWF0dGluZworICAgIGFzc2VydF9lcXVhbCg8PFNBU1MsIGNzczJzYXNzKDw8Q1NTKSkKK2hlbGxvCisgIHBhcmVudDogdHJ1ZQorCisgIHRoZXJlCisgICAgcGFyZW50OiBmYWxzZQorCisgIHdobworICAgIGhvbzogZmFsc2UKKworICB3aHkKKyAgICB5OiB0cnVlCisKKyAgd2hlbgorICAgIHdlbjogbmFvCisKK2Rvd25faGVyZQorICB5ZWFoOiB0cnVlCitTQVNTCitoZWxsbyB7CisgIHBhcmVudDogdHJ1ZTsKK30KKworaGVsbG8gIHRoZXJlIHsKKyAgcGFyZW50OiBmYWxzZTsKK30KK2hlbGxvIHdobyAgeworICBob286IGZhbHNlOworfQoraGVsbG8gd2h5IHsKKyAgIHk6IHRydWU7Cit9CitoZWxsbyB3aGVuIHsKKyAgd2VuOiAgbmFvOworfQorCisKKworZG93bl9oZXJlIHsgeWVhaDogdHJ1ZTsgfQorQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbW1lbnRzX2luX3NlbGVjdG9ycworICAgIGFzc2VydF9lcXVhbCg8PFNBU1MsIGNzczJzYXNzKDw8Q1NTKSkKKy5qcworICAjbG9jYXRpb24tbmF2aWdhdGlvbi1mb3JtIC5mb3JtLXN1Ym1pdCwgI2J1c2luZXNzLWxpc3RpbmctZm9ybSAuZm9ybS1zdWJtaXQsICNkZXRhaWxUYWJzIHVsLCAjZGV0YWlsc0VuaGFuY2VkICNhZGRUYWdzLCAjbG9jYXRpb25TZWFyY2hMaXN0LCAjbW9yZUhvb2RzCisgICAgZGlzcGxheTogbm9uZQorCisjbmF2TGlzdExlZnQKKyAgZGlzcGxheTogbm9uZQorU0FTUworLmpzICNsb2NhdGlvbi1uYXZpZ2F0aW9uLWZvcm0gLmZvcm0tc3VibWl0LAorLmpzICNidXNpbmVzcy1saXN0aW5nLWZvcm0gLmZvcm0tc3VibWl0LAorLmpzICNkZXRhaWxUYWJzIHVsLAorLyogLmpzICNhZGRSZXZpZXcsICovCisvKiAuanMgI2FkZFRhZ3MsICovCisuanMgI2RldGFpbHNFbmhhbmNlZCAjYWRkVGFncywKKy5qcyAjbG9jYXRpb25TZWFyY2hMaXN0LAorLmpzICNtb3JlSG9vZHMsCisjbmF2TGlzdExlZnQKKyAgeyBkaXNwbGF5OiBub25lOyB9CitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHNldWRvX2NsYXNzZXNfYXJlX2VzY2FwZWQKKyAgICBhc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyg8PENTUykpCitcXDpmb2N1cworICBhOiBiCisKKyAgXFw6Zm9vCisgICAgYmFyOiBiYXoKK1NBU1MKKzpmb2N1cyB7YTogYjt9Cis6Zm9jdXMgOmZvbyB7YmFyOiBiYXo7fQorQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3N1YmplY3QKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyg8PENTUykpfQorLmZvbworICAuYmFyIQorICAgIC5iYXoKKyAgICAgIGE6IGIKKworICAgIC5iaXAKKyAgICAgIGM6IGQKKworICAuYmFyIC5ib25rCisgICAgZTogZgorCisuZmxpcCEKKyAgJi5iYXIKKyAgICBhOiBiCisKKyAgJi5iYXoKKyAgICBjOiBkCitTQVNTCisuZm9vIC5iYXIhIC5iYXoge2E6IGI7fQorLmZvbyAuYmFyISAuYmlwIHtjOiBkO30KKy5mb28gLmJhciAuYm9uayB7ZTogZjt9CisKKy5mbGlwLmJhciEge2E6IGI7fQorLmZsaXAuYmF6ISB7YzogZDt9CitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfa2V5ZnJhbWVzCisgICAgYXNzZXJ0X2VxdWFsKDw8U0FTUywgY3NzMnNhc3MoPDxDU1MpKQorQGtleWZyYW1lcyBkYXNoCisgIGZyb20KKyAgICBzdHJva2UtZGFzaGFycmF5OiAxLDIwMAorICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwCisKKyAgNTAlCisgICAgc3Ryb2tlLWRhc2hhcnJheTogODksMjAwCisgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IC0zNQorCisgIHRvCisgICAgc3Ryb2tlLWRhc2hhcnJheTogODksMjAwCisgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IC0xMjQKK1NBU1MKK0BrZXlmcmFtZXMgZGFzaCB7CisgIGZyb20geworICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEsMjAwOworICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwOworICB9CisgIDUwJSB7CisgICAgc3Ryb2tlLWRhc2hhcnJheTogODksMjAwOworICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAtMzU7CisgIH0KKyAgdG8geworICAgIHN0cm9rZS1kYXNoYXJyYXk6IDg5LDIwMDsKKyAgICBzdHJva2UtZGFzaG9mZnNldDogLTEyNDsKKyAgfQorfQorQ1NTCisgIGVuZAorCisgICMgUmVncmVzc2lvbnMKKworICBkZWYgdGVzdF9uZXN0aW5nX3dpdGhfbWF0Y2hpbmdfcHJvcGVydHkKKyAgICBhc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyg8PENTUykpCit1bAorICB3aWR0aDogMTBweAorCisgIGRpdgorICAgIHdpZHRoOiAyMHB4CisKK2FydGljbGUKKyAgd2lkdGg6IDEwcHgKKworICBwCisgICAgd2lkdGg6IDIwcHgKK1NBU1MKK3VsIHt3aWR0aDogMTBweH0KK3VsIGRpdiB7d2lkdGg6IDIwcHh9CithcnRpY2xlIHt3aWR0aDogMTBweH0KK2FydGljbGUgcCB7d2lkdGg6IDIwcHh9CitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW1wdHlfcnVsZQorICAgIGFzc2VydF9lcXVhbCg8PFNBU1MsIGNzczJzYXNzKDw8Q1NTKSkKK2EKK1NBU1MKK2Ege30KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9ydWxlX3dpdGhfc2VsZWN0b3JfY29tYmluYXRvcgorICAgIGFzc2VydF9lcXVhbCg8PFNBU1MsIGNzczJzYXNzKDw8Q1NTKSkKK2EKKyAgY29sb3I6IHJlZAorCisgID4gYgorU0FTUworYSB7Y29sb3I6IHJlZH0KK2EgPiBiIHt9CitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGluZ193aXRoaW5fbWVkaWEKKyAgICBhc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyg8PENTUykpCitAbWVkaWEgYWxsCisgIC5uZXh0IC52ZXZlbnQKKyAgICBwYWRkaW5nLWxlZnQ6IDAKKyAgICBwYWRkaW5nLXJpZ2h0OiAwCitTQVNTCitAbWVkaWEgYWxsIHsKKyAgLm5leHQgLnZldmVudCB7CisgICAgcGFkZGluZy1sZWZ0OiAwOworICAgIHBhZGRpbmctcmlnaHQ6IDA7IH0gfQorQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpbGluZV9zZWxlY3Rvcl93aXRoaW5fbWVkaWFfYW5kX3dpdGhfY2hpbGRfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyg8PENTUykpCitAbWVkaWEgYWxsCisgIGZvbyBiYXIsIGJhegorICAgIHBhZGRpbmctbGVmdDogMAorICAgIHBhZGRpbmctcmlnaHQ6IDAKK1NBU1MKK0BtZWRpYSBhbGwgeworICBmb28gYmFyLAorICBiYXogeworICAgIHBhZGRpbmctbGVmdDogMDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAwOyB9IH0KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9kb3VibGVfY29tbWEKKyAgICBhc3NlcnRfZXF1YWwoPDxTQVNTLCBjc3Myc2Fzcyg8PENTUykpCitmb28sIGJhcgorICBhOiBiCitTQVNTCitmb28sICwgYmFyIHsgYTogYiB9CitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3Jfc3BsaXR0aW5nCisgICAgYXNzZXJ0X2VxdWFsKDw8U0FTUywgY3NzMnNhc3MoPDxDU1MpKQorLmZvbyA+CisgIC5iYXIKKyAgICBhOiBiCisKKyAgLmJhegorICAgIGM6IGQKK1NBU1MKKy5mb28+LmJhciB7YTogYn0KKy5mb28+LmJheiB7YzogZH0KK0NTUworCisgICAgYXNzZXJ0X2VxdWFsKDw8U0FTUywgY3NzMnNhc3MoPDxDU1MpKQorLmZvbworICAmOjpiYXIKKyAgICBhOiBiCisKKyAgJjo6YmF6CisgICAgYzogZAorU0FTUworLmZvbzo6YmFyIHthOiBifQorLmZvbzo6YmF6IHtjOiBkfQorQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3RyaXBsZV9uZXN0aW5nCisgICAgYXNzZXJ0X2VxdWFsKDw8U0FTUywgY3NzMnNhc3MoPDxDU1MpKQorLmZvbyAuYmFyIC5iYXoKKyAgYTogYgorU0FTUworLmZvbyAuYmFyIC5iYXoge2E6IGJ9CitDU1MKKworICAgIGFzc2VydF9lcXVhbCg8PFNBU1MsIGNzczJzYXNzKDw8Q1NTKSkKKy5iYXIgPiAuYmF6CisgIGM6IGQKK1NBU1MKKy5iYXIgPiAuYmF6IHtjOiBkfQorQ1NTCisgIGVuZAorCisgICMgRXJyb3IgcmVwb3J0aW5nCisKKyAgZGVmIHRlc3RfZXJyb3JfcmVwb3J0aW5nCisgICAgY3NzMnNhc3MoImZvbyIpCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGVycgorICAgIGFzc2VydF9lcXVhbCgxLCBlcnIuc2Fzc19saW5lKQorICAgIGFzc2VydF9lcXVhbCgnSW52YWxpZCBDU1MgYWZ0ZXIgImZvbyI6IGV4cGVjdGVkICJ7Iiwgd2FzICIiJywgZXJyLm1lc3NhZ2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Vycm9yX3JlcG9ydGluZ19pbl9saW5lCisgICAgY3NzMnNhc3MoImZvb1xuYmFyIH1cbmJheiIpCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGVycgorICAgIGFzc2VydF9lcXVhbCgyLCBlcnIuc2Fzc19saW5lKQorICAgIGFzc2VydF9lcXVhbCgnSW52YWxpZCBDU1MgYWZ0ZXIgImJhciAiOiBleHBlY3RlZCAieyIsIHdhcyAifSInLCBlcnIubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXJyb3JfdHJ1bmNhdGVfYWZ0ZXIKKyAgICBjc3Myc2FzcygiI3siYSIgKiAxNn1mb28iKQorICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIGV4Y2VwdGlvbiIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlcnIKKyAgICBhc3NlcnRfZXF1YWwoMSwgZXJyLnNhc3NfbGluZSkKKyAgICBhc3NlcnRfZXF1YWwoJ0ludmFsaWQgQ1NTIGFmdGVyICIuLi5hYWFhYWFhYWFhYWFmb28iOiBleHBlY3RlZCAieyIsIHdhcyAiIicsIGVyci5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF9lcnJvcl90cnVuY2F0ZV93YXMKKyAgICBjc3Myc2FzcygiZm9vIH1mb28jeyJhIiAqIDE1fSIpCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGVycgorICAgIGFzc2VydF9lcXVhbCgxLCBlcnIuc2Fzc19saW5lKQorICAgIGFzc2VydF9lcXVhbCgnSW52YWxpZCBDU1MgYWZ0ZXIgImZvbyAiOiBleHBlY3RlZCAieyIsIHdhcyAifWZvb2FhYWFhYWFhYWFhLi4uIicsIGVyci5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF9lcnJvcl9kb2VzbnRfdHJ1bmNhdGVfYWZ0ZXJfd2hlbl9lbGlwc2lzX3dvdWxkX2FkZF9sZW5ndGgKKyAgICBjc3Myc2FzcygiI3siYSIgKiAxNX1mb28iKQorICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIGV4Y2VwdGlvbiIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlcnIKKyAgICBhc3NlcnRfZXF1YWwoMSwgZXJyLnNhc3NfbGluZSkKKyAgICBhc3NlcnRfZXF1YWwoJ0ludmFsaWQgQ1NTIGFmdGVyICJhYWFhYWFhYWFhYWFhYWFmb28iOiBleHBlY3RlZCAieyIsIHdhcyAiIicsIGVyci5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF9lcnJvcl9kb2VzbnRfdHJ1bmNhdGVfd2FzX3doZW5fZWxpcHNpc193b3VsZF9hZGRfbGVuZ3RoCisgICAgY3NzMnNhc3MoImZvbyB9Zm9vI3siYSIgKiAxNH0iKQorICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIGV4Y2VwdGlvbiIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlcnIKKyAgICBhc3NlcnRfZXF1YWwoMSwgZXJyLnNhc3NfbGluZSkKKyAgICBhc3NlcnRfZXF1YWwoJ0ludmFsaWQgQ1NTIGFmdGVyICJmb28gIjogZXhwZWN0ZWQgInsiLCB3YXMgIn1mb29hYWFhYWFhYWFhYWFhYSInLCBlcnIubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXJyb3JfZ2V0c19yaWRfb2ZfdHJhaWxpbmdfbmV3bGluZV9mb3JfYWZ0ZXIKKyAgICBjc3Myc2FzcygiZm9vICBcbiAgIikKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBleGNlcHRpb24iKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZXJyCisgICAgYXNzZXJ0X2VxdWFsKDIsIGVyci5zYXNzX2xpbmUpCisgICAgYXNzZXJ0X2VxdWFsKCdJbnZhbGlkIENTUyBhZnRlciAiZm9vIjogZXhwZWN0ZWQgInsiLCB3YXMgIiInLCBlcnIubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXJyb3JfZ2V0c19yaWRfb2ZfdHJhaWxpbmdfbmV3bGluZV9mb3Jfd2FzCisgICAgY3NzMnNhc3MoImZvbyBcbiAgfWZvbyIpCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGVycgorICAgIGFzc2VydF9lcXVhbCgyLCBlcnIuc2Fzc19saW5lKQorICAgIGFzc2VydF9lcXVhbCgnSW52YWxpZCBDU1MgYWZ0ZXIgImZvbyI6IGV4cGVjdGVkICJ7Iiwgd2FzICJ9Zm9vIicsIGVyci5tZXNzYWdlKQorICBlbmQKKworICAjIEVuY29kaW5ncworCisgIGRlZiB0ZXN0X2VuY29kaW5nX2Vycm9yCisgICAgY3NzMnNhc3MoImZvb1xuYmFyXG5iXHhGRWF6Ii5mb3JjZV9lbmNvZGluZygidXRmLTgiKSkKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBleGNlcHRpb24iKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCgzLCBlLnNhc3NfbGluZSkKKyAgICBhc3NlcnRfZXF1YWwoJ0ludmFsaWQgVVRGLTggY2hhcmFjdGVyICJceEZFIicsIGUubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXNjaWlfaW5jb21wYXRpYmxlX2VuY29kaW5nX2Vycm9yCisgICAgdGVtcGxhdGUgPSAiZm9vXG5iYXJcbmJfeiIuZW5jb2RlKCJ1dGYtMTZsZSIpCisgICAgdGVtcGxhdGVbOV0gPSAiXHhGRSIuZm9yY2VfZW5jb2RpbmcoInV0Zi0xNmxlIikKKyAgICBjc3Myc2Fzcyh0ZW1wbGF0ZSkKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBleGNlcHRpb24iKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCgzLCBlLnNhc3NfbGluZSkKKyAgICBhc3NlcnRfZXF1YWwoJ0ludmFsaWQgVVRGLTE2TEUgY2hhcmFjdGVyICJceEZFIicsIGUubWVzc2FnZSkKKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgIGRlZiBjc3Myc2FzcyhzdHJpbmcsIG9wdHM9e30pCisgICAgU2Fzczo6Q1NTLm5ldyhzdHJpbmcsIG9wdHMpLnJlbmRlcgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvY3NzX3ZhcmlhYmxlX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9jc3NfdmFyaWFibGVfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjkyYzUyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvY3NzX3ZhcmlhYmxlX3Rlc3QucmIKQEAgLTAsMCArMSwyMzcgQEAKKworcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3Nhc3MvZW5naW5lJworCisjIE1vc3QgQ1NTIHZhcmlhYmxlIHRlc3RzIGFyZSBpbiBzYXNzLXNwZWMsIGJ1dCBhIGZldyByZWxhdGUgdG8gZm9ybWF0dGluZyBvcgorIyBjb252ZXJzaW9uIGFuZCBzbyBiZWxvbmcgaGVyZS4KK2NsYXNzIENzc1ZhcmlhYmxlVGVzdCA8IE1pbmlUZXN0OjpUZXN0CisgIGRlZiB0ZXN0X2ZvbGRlZF9pbmxpbmVfd2hpdGVzcGFjZQorICAgIGFzc2VydF92YXJpYWJsZV92YWx1ZSAiZm9vIGJhciBiYXoiLCAiZm9vICAgIGJhciAgICAgICAgYmF6IgorICAgIGFzc2VydF92YXJpYWJsZV92YWx1ZSAiZm9vIGJhciIsICJmb28gXHQgICBiYXIiCisgIGVuZAorCisgIGRlZiB0ZXN0X2ZvbGRlZF9tdWx0aWxpbmVfd2hpdGVzcGFjZQorICAgICMgV2UgZG9uJ3Qgd2FudCB0byByZWZvcm1hdCBuZXdsaW5lcyBpbiBuZXN0ZWQgYW5kIGV4cGFuZGVkIG1vZGUsIHNvIHdlIGp1c3QKKyAgICAjIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGJlZm9yZSB0aGVtLgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICAtLW11bHRpbGluZTogZm9vCisgICAgYmFyOyB9CitDU1MKKy5mb28geworICAtLW11bHRpbGluZTogZm9vXHMKKyAgICBiYXI7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgLS1tdWx0aWxpbmU6IGZvbworCisKKyAgICBiYXI7IH0KK0NTUworLmZvbyB7CisgIC0tbXVsdGlsaW5lOiBmb29ccworCisKKyAgICBiYXI7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MsIHN0eWxlOiA6ZXhwYW5kZWQpCisuZm9vIHsKKyAgLS1tdWx0aWxpbmU6IGZvbworICAgIGJhcjsKK30KK0NTUworLmZvbyB7CisgIC0tbXVsdGlsaW5lOiBmb29ccworICAgIGJhcjsKK30KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUywgc3R5bGU6IDpleHBhbmRlZCkKKy5mb28geworICAtLW11bHRpbGluZTogZm9vCisKKworICAgIGJhcjsKK30KK0NTUworLmZvbyB7CisgIC0tbXVsdGlsaW5lOiBmb29ccworCisKKyAgICBiYXI7Cit9CitTQ1NTCisKKyAgICAjIEluIGNvbXBhY3QgYW5kIGNvbXByZXNzZWQgbW9kZSwgd2UgZm9sZCBhbGwgd2hpdGVzcGFjZSBhcm91bmQgbmV3bGluZXMKKyAgICAjIHRvZ2V0aGVyLgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUywgc3R5bGU6IDpjb21wYWN0KQorLmZvbyB7IC0tbXVsdGlsaW5lOiBmb28gYmFyOyB9CitDU1MKKy5mb28geworICAtLW11bHRpbGluZTogZm9vXHMKKyAgICBiYXI7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MsIHN0eWxlOiA6Y29tcGFjdCkKKy5mb28geyAtLW11bHRpbGluZTogZm9vIGJhcjsgfQorQ1NTCisuZm9vIHsKKyAgLS1tdWx0aWxpbmU6IGZvb1xzCisKKworICAgIGJhcjsKK30KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUywgc3R5bGU6IDpjb21wcmVzc2VkKQorLmZvb3stLW11bHRpbGluZTogZm9vIGJhcn0KK0NTUworLmZvbyB7CisgIC0tbXVsdGlsaW5lOiBmb29ccworICAgIGJhcjsKK30KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUywgc3R5bGU6IDpjb21wcmVzc2VkKQorLmZvb3stLW11bHRpbGluZTogZm9vIGJhcn0KK0NTUworLmZvbyB7CisgIC0tbXVsdGlsaW5lOiBmb29ccworCisKKyAgICBiYXI7Cit9CitTQ1NTCisgIGVuZAorCisgICMgQ29udmVyc2lvbi4KKworICBkZWYgdGVzdF9zdGF0aWNfdmFsdWVzX2NvbnZlcnQKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKy5mb28KKyAgLS1iYXI6IGJhegorU0FTUworLmZvbyB7CisgIC0tYmFyOiBiYXo7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKy5mb28KKyAgLS1iYXI6IFsoe3soWyE7XSl9fSldCitTQVNTCisuZm9vIHsKKyAgLS1iYXI6IFsoe3soWyE7XSl9fSldOworfQorU0NTUworCisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCisuZm9vCisgIC0tYmFyOiB7YTogYjsgYzogZH0KK1NBU1MKKy5mb28geworICAtLWJhcjoge2E6IGI7IGM6IGR9OworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9keW5hbWljX3ZhbHVlc19jb252ZXJ0CisgICAgYXNzZXJ0X2NvbnZlcnRzIDw8U0FTUywgPDxTQ1NTCisuZm9vCisgIC0tYmFyOiBiYXogXCN7YmFuZ30gcXV4CitTQVNTCisuZm9vIHsKKyAgLS1iYXI6IGJheiBcI3tiYW5nfSBxdXg7Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfY29udmVydHMgPDxTQVNTLCA8PFNDU1MKKy5mb28KKyAgLS1iYXI6ICJiYXogXCN7YmFuZ30gcXV4IgorU0FTUworLmZvbyB7CisgIC0tYmFyOiAiYmF6IFwje2Jhbmd9IHF1eCI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpbGluZV92YWx1ZV9jb252ZXJ0cworICAgIGFzc2VydF9zY3NzX3RvX3Njc3MgPDxTQ1NTCisuZm9vIHsKKyAgLS1iYXI6IHsKKyAgICBhOiBiOworICAgIGM6IGQ7CisgIH07Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfc2Nzc190b19zYXNzIDw8U0FTUywgPDxTQ1NTCisuZm9vCisgIC0tYmFyOiB7ICAgICBhOiBiOyAgICAgYzogZDsgICB9CitTQVNTCisuZm9vIHsKKyAgLS1iYXI6IHsKKyAgICBhOiBiOworICAgIGM6IGQ7CisgIH07Cit9CitTQ1NTCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgYXNzZXJ0X3ZhcmlhYmxlX3ZhbHVlKGV4cGVjdGVkLCBzb3VyY2UpCisgICAgZXhwZWN0ZWQgPSA8PENTUworeCB7CisgIC0tdmFyaWFibGU6ICN7ZXhwZWN0ZWR9OyB9CitDU1MKKworICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgcmVuZGVyX3ZhcmlhYmxlKHNvdXJjZSkKKyAgICBhc3NlcnRfZXF1YWwgZXhwZWN0ZWQsIHJlbmRlcl92YXJpYWJsZShzb3VyY2UsIHN5bnRheDogOnNhc3MpCisgIGVuZAorCisgIGRlZiByZW5kZXJfdmFyaWFibGUoc291cmNlLCBzeW50YXg6IDpzY3NzKQorICAgIHJlbmRlcihzeW50YXggPT0gOnNjc3MgPyA8PFNDU1MgOiA8PFNBU1MsIDpzeW50YXggPT4gc3ludGF4KQoreCB7CisgIC0tdmFyaWFibGU6ICN7c291cmNlfTsKK30KK1NDU1MKK3gKKyAgLS12YXJpYWJsZTogI3tzb3VyY2V9CitTQVNTCisgIGVuZAorCisgIGRlZiByZW5kZXIoc2Fzcywgb3B0aW9ucyA9IHt9KQorICAgIG9wdGlvbnNbOnN5bnRheF0gfHw9IDpzY3NzCisgICAgb3B0aW9uc1s6Y2FjaGVdID0gZmFsc2UKKyAgICBtdW5nZV9maWxlbmFtZSBvcHRpb25zCisgICAgU2Fzczo6RW5naW5lLm5ldyhzYXNzLCBvcHRpb25zKS5yZW5kZXIKKyAgZW5kCisKKyAgZGVmIHJlc29sdmUoc3RyLCBvcHRzID0ge30sIGVudmlyb25tZW50ID0gZW52KQorICAgIG11bmdlX2ZpbGVuYW1lIG9wdHMKKyAgICB2YWwgPSBldmFsKHN0ciwgb3B0cywgZW52aXJvbm1lbnQpCisgICAgYXNzZXJ0X2tpbmRfb2YgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6QmFzZSwgdmFsCisgICAgdmFsLm9wdGlvbnMgPSBvcHRzCisgICAgdmFsLmlzX2E/KFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZykgPyB2YWwudmFsdWUgOiB2YWwudG9fcworICBlbmQKKworICBkZWYgZXZhbChzdHIsIG9wdHMgPSB7fSwgZW52aXJvbm1lbnQgPSBlbnYpCisgICAgbXVuZ2VfZmlsZW5hbWUgb3B0cworICAgIFNhc3M6OlNjcmlwdC5wYXJzZShzdHIsIG9wdHMuZGVsZXRlKDpsaW5lKSB8fCAxLAorICAgICAgb3B0cy5kZWxldGUoOm9mZnNldCkgfHwgMCwgb3B0cykuCisgICAgICBwZXJmb3JtKFNhc3M6OkVudmlyb25tZW50Lm5ldyhlbnZpcm9ubWVudCwgb3B0cykpCisgIGVuZAorCisgIGRlZiBlbnYoaGFzaCA9IHt9KQorICAgIGVudiA9IFNhc3M6OkVudmlyb25tZW50Lm5ldworICAgIGhhc2guZWFjaCB7fGssIHZ8IGVudi5zZXRfdmFyKGssIHYpfQorICAgIGVudgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvZGF0YS9oc2wtcmdiLnR4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2RhdGEvaHNsLXJnYi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5ZTQ3MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2RhdGEvaHNsLXJnYi50eHQKQEAgLTAsMCArMSwzMTkgQEAKK2hzbCgwLCAxMDAlLCA1MCUpCitoc2woNjAsIDEwMCUsIDUwJSkKK2hzbCgxMjAsIDEwMCUsIDUwJSkKK2hzbCgxODAsIDEwMCUsIDUwJSkKK2hzbCgyNDAsIDEwMCUsIDUwJSkKK2hzbCgzMDAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigyNTUsIDAsIDApCityZ2IoMjU1LCAyNTUsIDApCityZ2IoMCwgMjU1LCAwKQorcmdiKDAsIDI1NSwgMjU1KQorcmdiKDAsIDAsIDI1NSkKK3JnYigyNTUsIDAsIDI1NSkKKworaHNsKC0zNjAsIDEwMCUsIDUwJSkKK2hzbCgtMzAwLCAxMDAlLCA1MCUpCitoc2woLTI0MCwgMTAwJSwgNTAlKQoraHNsKC0xODAsIDEwMCUsIDUwJSkKK2hzbCgtMTIwLCAxMDAlLCA1MCUpCitoc2woLTYwLCAxMDAlLCA1MCUpCis9PT09CityZ2IoMjU1LCAwLCAwKQorcmdiKDI1NSwgMjU1LCAwKQorcmdiKDAsIDI1NSwgMCkKK3JnYigwLCAyNTUsIDI1NSkKK3JnYigwLCAwLCAyNTUpCityZ2IoMjU1LCAwLCAyNTUpCisKK2hzbCgzNjAsIDEwMCUsIDUwJSkKK2hzbCg0MjAsIDEwMCUsIDUwJSkKK2hzbCg0ODAsIDEwMCUsIDUwJSkKK2hzbCg1NDAsIDEwMCUsIDUwJSkKK2hzbCg2MDAsIDEwMCUsIDUwJSkKK2hzbCg2NjAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigyNTUsIDAsIDApCityZ2IoMjU1LCAyNTUsIDApCityZ2IoMCwgMjU1LCAwKQorcmdiKDAsIDI1NSwgMjU1KQorcmdiKDAsIDAsIDI1NSkKK3JnYigyNTUsIDAsIDI1NSkKKworaHNsKDYxMjAsIDEwMCUsIDUwJSkKK2hzbCgtOTY2MCwgMTAwJSwgNTAlKQoraHNsKDk5ODQwLCAxMDAlLCA1MCUpCitoc2woLTkwMCwgMTAwJSwgNTAlKQoraHNsKC0xMDQ4ODAsIDEwMCUsIDUwJSkKK2hzbCgyODIwLCAxMDAlLCA1MCUpCis9PT09CityZ2IoMjU1LCAwLCAwKQorcmdiKDI1NSwgMjU1LCAwKQorcmdiKDAsIDI1NSwgMCkKK3JnYigwLCAyNTUsIDI1NSkKK3JnYigwLCAwLCAyNTUpCityZ2IoMjU1LCAwLCAyNTUpCisKK2hzbCgwLCAxMDAlLCA1MCUpCitoc2woMTIsIDEwMCUsIDUwJSkKK2hzbCgyNCwgMTAwJSwgNTAlKQoraHNsKDM2LCAxMDAlLCA1MCUpCitoc2woNDgsIDEwMCUsIDUwJSkKK2hzbCg2MCwgMTAwJSwgNTAlKQoraHNsKDcyLCAxMDAlLCA1MCUpCitoc2woODQsIDEwMCUsIDUwJSkKK2hzbCg5NiwgMTAwJSwgNTAlKQoraHNsKDEwOCwgMTAwJSwgNTAlKQoraHNsKDEyMCwgMTAwJSwgNTAlKQorPT09PQorcmdiKDI1NSwgMCwgMCkKK3JnYigyNTUsIDUxLCAwKQorcmdiKDI1NSwgMTAyLCAwKQorcmdiKDI1NSwgMTUzLCAwKQorcmdiKDI1NSwgMjA0LCAwKQorcmdiKDI1NSwgMjU1LCAwKQorcmdiKDIwNCwgMjU1LCAwKQorcmdiKDE1MywgMjU1LCAwKQorcmdiKDEwMiwgMjU1LCAwKQorcmdiKDUxLCAyNTUsIDApCityZ2IoMCwgMjU1LCAwKQorCitoc2woMTIwLCAxMDAlLCA1MCUpCitoc2woMTMyLCAxMDAlLCA1MCUpCitoc2woMTQ0LCAxMDAlLCA1MCUpCitoc2woMTU2LCAxMDAlLCA1MCUpCitoc2woMTY4LCAxMDAlLCA1MCUpCitoc2woMTgwLCAxMDAlLCA1MCUpCitoc2woMTkyLCAxMDAlLCA1MCUpCitoc2woMjA0LCAxMDAlLCA1MCUpCitoc2woMjE2LCAxMDAlLCA1MCUpCitoc2woMjI4LCAxMDAlLCA1MCUpCitoc2woMjQwLCAxMDAlLCA1MCUpCis9PT09CityZ2IoMCwgMjU1LCAwKQorcmdiKDAsIDI1NSwgNTEpCityZ2IoMCwgMjU1LCAxMDIpCityZ2IoMCwgMjU1LCAxNTMpCityZ2IoMCwgMjU1LCAyMDQpCityZ2IoMCwgMjU1LCAyNTUpCityZ2IoMCwgMjA0LCAyNTUpCityZ2IoMCwgMTUzLCAyNTUpCityZ2IoMCwgMTAyLCAyNTUpCityZ2IoMCwgNTEsIDI1NSkKK3JnYigwLCAwLCAyNTUpCisKK2hzbCgyNDAsIDEwMCUsIDUwJSkKK2hzbCgyNTIsIDEwMCUsIDUwJSkKK2hzbCgyNjQsIDEwMCUsIDUwJSkKK2hzbCgyNzYsIDEwMCUsIDUwJSkKK2hzbCgyODgsIDEwMCUsIDUwJSkKK2hzbCgzMDAsIDEwMCUsIDUwJSkKK2hzbCgzMTIsIDEwMCUsIDUwJSkKK2hzbCgzMjQsIDEwMCUsIDUwJSkKK2hzbCgzMzYsIDEwMCUsIDUwJSkKK2hzbCgzNDgsIDEwMCUsIDUwJSkKK2hzbCgzNjAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigwLCAwLCAyNTUpCityZ2IoNTEsIDAsIDI1NSkKK3JnYigxMDIsIDAsIDI1NSkKK3JnYigxNTMsIDAsIDI1NSkKK3JnYigyMDQsIDAsIDI1NSkKK3JnYigyNTUsIDAsIDI1NSkKK3JnYigyNTUsIDAsIDIwNCkKK3JnYigyNTUsIDAsIDE1MykKK3JnYigyNTUsIDAsIDEwMikKK3JnYigyNTUsIDAsIDUxKQorcmdiKDI1NSwgMCwgMCkKKworaHNsKDAsIDIwJSwgNTAlKQoraHNsKDAsIDYwJSwgNTAlKQoraHNsKDAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigxNTMsIDEwMiwgMTAyKQorcmdiKDIwNCwgNTEsIDUxKQorcmdiKDI1NSwgMCwgMCkKKworaHNsKDYwLCAyMCUsIDUwJSkKK2hzbCg2MCwgNjAlLCA1MCUpCitoc2woNjAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigxNTMsIDE1MywgMTAyKQorcmdiKDIwNCwgMjA0LCA1MSkKK3JnYigyNTUsIDI1NSwgMCkKKworaHNsKDEyMCwgMjAlLCA1MCUpCitoc2woMTIwLCA2MCUsIDUwJSkKK2hzbCgxMjAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigxMDIsIDE1MywgMTAyKQorcmdiKDUxLCAyMDQsIDUxKQorcmdiKDAsIDI1NSwgMCkKKworaHNsKDE4MCwgMjAlLCA1MCUpCitoc2woMTgwLCA2MCUsIDUwJSkKK2hzbCgxODAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigxMDIsIDE1MywgMTUzKQorcmdiKDUxLCAyMDQsIDIwNCkKK3JnYigwLCAyNTUsIDI1NSkKKworaHNsKDI0MCwgMjAlLCA1MCUpCitoc2woMjQwLCA2MCUsIDUwJSkKK2hzbCgyNDAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigxMDIsIDEwMiwgMTUzKQorcmdiKDUxLCA1MSwgMjA0KQorcmdiKDAsIDAsIDI1NSkKKworaHNsKDMwMCwgMjAlLCA1MCUpCitoc2woMzAwLCA2MCUsIDUwJSkKK2hzbCgzMDAsIDEwMCUsIDUwJSkKKz09PT0KK3JnYigxNTMsIDEwMiwgMTUzKQorcmdiKDIwNCwgNTEsIDIwNCkKK3JnYigyNTUsIDAsIDI1NSkKKworaHNsKDAsIDEwMCUsIDAlKQoraHNsKDAsIDEwMCUsIDEwJSkKK2hzbCgwLCAxMDAlLCAyMCUpCitoc2woMCwgMTAwJSwgMzAlKQoraHNsKDAsIDEwMCUsIDQwJSkKK2hzbCgwLCAxMDAlLCA1MCUpCitoc2woMCwgMTAwJSwgNjAlKQoraHNsKDAsIDEwMCUsIDcwJSkKK2hzbCgwLCAxMDAlLCA4MCUpCitoc2woMCwgMTAwJSwgOTAlKQoraHNsKDAsIDEwMCUsIDEwMCUpCis9PT09CityZ2IoMCwgMCwgMCkKK3JnYig1MSwgMCwgMCkKK3JnYigxMDIsIDAsIDApCityZ2IoMTUzLCAwLCAwKQorcmdiKDIwNCwgMCwgMCkKK3JnYigyNTUsIDAsIDApCityZ2IoMjU1LCA1MSwgNTEpCityZ2IoMjU1LCAxMDIsIDEwMikKK3JnYigyNTUsIDE1MywgMTUzKQorcmdiKDI1NSwgMjA0LCAyMDQpCityZ2IoMjU1LCAyNTUsIDI1NSkKKworaHNsKDYwLCAxMDAlLCAwJSkKK2hzbCg2MCwgMTAwJSwgMTAlKQoraHNsKDYwLCAxMDAlLCAyMCUpCitoc2woNjAsIDEwMCUsIDMwJSkKK2hzbCg2MCwgMTAwJSwgNDAlKQoraHNsKDYwLCAxMDAlLCA1MCUpCitoc2woNjAsIDEwMCUsIDYwJSkKK2hzbCg2MCwgMTAwJSwgNzAlKQoraHNsKDYwLCAxMDAlLCA4MCUpCitoc2woNjAsIDEwMCUsIDkwJSkKK2hzbCg2MCwgMTAwJSwgMTAwJSkKKz09PT0KK3JnYigwLCAwLCAwKQorcmdiKDUxLCA1MSwgMCkKK3JnYigxMDIsIDEwMiwgMCkKK3JnYigxNTMsIDE1MywgMCkKK3JnYigyMDQsIDIwNCwgMCkKK3JnYigyNTUsIDI1NSwgMCkKK3JnYigyNTUsIDI1NSwgNTEpCityZ2IoMjU1LCAyNTUsIDEwMikKK3JnYigyNTUsIDI1NSwgMTUzKQorcmdiKDI1NSwgMjU1LCAyMDQpCityZ2IoMjU1LCAyNTUsIDI1NSkKKworaHNsKDEyMCwgMTAwJSwgMCUpCitoc2woMTIwLCAxMDAlLCAxMCUpCitoc2woMTIwLCAxMDAlLCAyMCUpCitoc2woMTIwLCAxMDAlLCAzMCUpCitoc2woMTIwLCAxMDAlLCA0MCUpCitoc2woMTIwLCAxMDAlLCA1MCUpCitoc2woMTIwLCAxMDAlLCA2MCUpCitoc2woMTIwLCAxMDAlLCA3MCUpCitoc2woMTIwLCAxMDAlLCA4MCUpCitoc2woMTIwLCAxMDAlLCA5MCUpCitoc2woMTIwLCAxMDAlLCAxMDAlKQorPT09PQorcmdiKDAsIDAsIDApCityZ2IoMCwgNTEsIDApCityZ2IoMCwgMTAyLCAwKQorcmdiKDAsIDE1MywgMCkKK3JnYigwLCAyMDQsIDApCityZ2IoMCwgMjU1LCAwKQorcmdiKDUxLCAyNTUsIDUxKQorcmdiKDEwMiwgMjU1LCAxMDIpCityZ2IoMTUzLCAyNTUsIDE1MykKK3JnYigyMDQsIDI1NSwgMjA0KQorcmdiKDI1NSwgMjU1LCAyNTUpCisKK2hzbCgxODAsIDEwMCUsIDAlKQoraHNsKDE4MCwgMTAwJSwgMTAlKQoraHNsKDE4MCwgMTAwJSwgMjAlKQoraHNsKDE4MCwgMTAwJSwgMzAlKQoraHNsKDE4MCwgMTAwJSwgNDAlKQoraHNsKDE4MCwgMTAwJSwgNTAlKQoraHNsKDE4MCwgMTAwJSwgNjAlKQoraHNsKDE4MCwgMTAwJSwgNzAlKQoraHNsKDE4MCwgMTAwJSwgODAlKQoraHNsKDE4MCwgMTAwJSwgOTAlKQoraHNsKDE4MCwgMTAwJSwgMTAwJSkKKz09PT0KK3JnYigwLCAwLCAwKQorcmdiKDAsIDUxLCA1MSkKK3JnYigwLCAxMDIsIDEwMikKK3JnYigwLCAxNTMsIDE1MykKK3JnYigwLCAyMDQsIDIwNCkKK3JnYigwLCAyNTUsIDI1NSkKK3JnYig1MSwgMjU1LCAyNTUpCityZ2IoMTAyLCAyNTUsIDI1NSkKK3JnYigxNTMsIDI1NSwgMjU1KQorcmdiKDIwNCwgMjU1LCAyNTUpCityZ2IoMjU1LCAyNTUsIDI1NSkKKworaHNsKDI0MCwgMTAwJSwgMCUpCitoc2woMjQwLCAxMDAlLCAxMCUpCitoc2woMjQwLCAxMDAlLCAyMCUpCitoc2woMjQwLCAxMDAlLCAzMCUpCitoc2woMjQwLCAxMDAlLCA0MCUpCitoc2woMjQwLCAxMDAlLCA1MCUpCitoc2woMjQwLCAxMDAlLCA2MCUpCitoc2woMjQwLCAxMDAlLCA3MCUpCitoc2woMjQwLCAxMDAlLCA4MCUpCitoc2woMjQwLCAxMDAlLCA5MCUpCitoc2woMjQwLCAxMDAlLCAxMDAlKQorPT09PQorcmdiKDAsIDAsIDApCityZ2IoMCwgMCwgNTEpCityZ2IoMCwgMCwgMTAyKQorcmdiKDAsIDAsIDE1MykKK3JnYigwLCAwLCAyMDQpCityZ2IoMCwgMCwgMjU1KQorcmdiKDUxLCA1MSwgMjU1KQorcmdiKDEwMiwgMTAyLCAyNTUpCityZ2IoMTUzLCAxNTMsIDI1NSkKK3JnYigyMDQsIDIwNCwgMjU1KQorcmdiKDI1NSwgMjU1LCAyNTUpCisKK2hzbCgzMDAsIDEwMCUsIDAlKQoraHNsKDMwMCwgMTAwJSwgMTAlKQoraHNsKDMwMCwgMTAwJSwgMjAlKQoraHNsKDMwMCwgMTAwJSwgMzAlKQoraHNsKDMwMCwgMTAwJSwgNDAlKQoraHNsKDMwMCwgMTAwJSwgNTAlKQoraHNsKDMwMCwgMTAwJSwgNjAlKQoraHNsKDMwMCwgMTAwJSwgNzAlKQoraHNsKDMwMCwgMTAwJSwgODAlKQoraHNsKDMwMCwgMTAwJSwgOTAlKQoraHNsKDMwMCwgMTAwJSwgMTAwJSkKKz09PT0KK3JnYigwLCAwLCAwKQorcmdiKDUxLCAwLCA1MSkKK3JnYigxMDIsIDAsIDEwMikKK3JnYigxNTMsIDAsIDE1MykKK3JnYigyMDQsIDAsIDIwNCkKK3JnYigyNTUsIDAsIDI1NSkKK3JnYigyNTUsIDUxLCAyNTUpCityZ2IoMjU1LCAxMDIsIDI1NSkKK3JnYigyNTUsIDE1MywgMjU1KQorcmdiKDI1NSwgMjA0LCAyNTUpCityZ2IoMjU1LCAyNTUsIDI1NSkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2VuY29kaW5nX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9lbmNvZGluZ190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyMjE5NDgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9lbmNvZGluZ190ZXN0LnJiCkBAIC0wLDAgKzEsMTg4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVzdF9oZWxwZXInCityZXF1aXJlICdzYXNzL3V0aWwvdGVzdCcKKworY2xhc3MgRW5jb2RpbmdUZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBTYXNzOjpVdGlsOjpUZXN0CisKKyAgZGVmIHRlc3RfZW5jb2RpbmdfZXJyb3IKKyAgICByZW5kZXIoImZvb1xuYmFyXG5iXHhGRWF6Ii5mb3JjZV9lbmNvZGluZygidXRmLTgiKSkKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBleGNlcHRpb24iKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCgzLCBlLnNhc3NfbGluZSkKKyAgICBhc3NlcnRfZXF1YWwoJ0ludmFsaWQgVVRGLTggY2hhcmFjdGVyICJceEZFIicsIGUubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXNjaWlfaW5jb21wYXRpYmxlX2VuY29kaW5nX2Vycm9yCisgICAgdGVtcGxhdGUgPSAiZm9vXG5iYXJcbmJfeiIuZW5jb2RlKCJ1dGYtMTZsZSIpCisgICAgdGVtcGxhdGVbOV0gPSAiXHhGRSIuZm9yY2VfZW5jb2RpbmcoInV0Zi0xNmxlIikKKyAgICByZW5kZXIodGVtcGxhdGUpCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwoMywgZS5zYXNzX2xpbmUpCisgICAgYXNzZXJ0X2VxdWFsKCdJbnZhbGlkIFVURi0xNkxFIGNoYXJhY3RlciAiXHhGRSInLCBlLm1lc3NhZ2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X3ByZWZlcnNfY2hhcnNldF90b19ydWJ5X2VuY29kaW5nCisgICAgYXNzZXJ0X3JlbmRlcnNfZW5jb2RlZCg8PENTUywgPDxTQVNTLmVuY29kZSgiSUJNODY2IikuZm9yY2VfZW5jb2RpbmcoIlVURi04IikpCitAY2hhcnNldCAiVVRGLTgiOworZtCW0JYgeworICBhOiBiOyB9CitDU1MKK0BjaGFyc2V0ICJpYm04NjYiCitm0JbQlgorICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3VzZXNfcnVieV9lbmNvZGluZ193aXRob3V0X2NoYXJzZXQKKyAgICBhc3NlcnRfcmVuZGVyc19lbmNvZGVkKDw8Q1NTLCA8PFNBU1MuZW5jb2RlKCJJQk04NjYiKSkKK0BjaGFyc2V0ICJVVEYtOCI7CivRgtCQ0KwgeworICBhOiBiOyB9CitDU1MKK9GC0JDQrAorICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpYnl0ZV9jaGFyc2V0X3dpdGhvdXRfYm9tX2RlY2xhcmVkX2FzX2JpbmFyeQorICAgIGVuZ2luZSA9IFNhc3M6OkVuZ2luZS5uZXcoPDxTQVNTLmVuY29kZSgiVVRGLTE2TEUiKS5mb3JjZV9lbmNvZGluZygiQklOQVJZIikpCitAY2hhcnNldCAidXRmLTE2bGUiCitmw7PDsworICBhOiBiCitTQVNTCisgICAgIyBTaW5jZSBtdWx0aWJ5dGUgZW5jb2RpbmdzJyBAY2hhcnNldCBkZWNsYXJhdGlvbnMgYXJlbid0CisgICAgIyBBU0NJSS1jb21wYXRpYmxlLCB3ZSBoYXZlIHRvIGludGVycHJldCB0aGUgZmlsZXMgYXMgVVRGLTggd2hpY2ggd2lsbAorICAgICMgaW5ldml0YWJseSBmYWlsLgorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAiSW52YWxpZCBVVEYtOCBjaGFyYWN0ZXIgXCJcXHhGM1wiIikge2VuZ2luZS5yZW5kZXJ9CisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpYnl0ZV9jaGFyc2V0X3dpdGhvdXRfYm9tX2RlY2xhcmVkX2FzX3V0Zl84CisgICAgZW5naW5lID0gU2Fzczo6RW5naW5lLm5ldyg8PFNBU1MuZW5jb2RlKCJVVEYtMTZMRSIpLmZvcmNlX2VuY29kaW5nKCJVVEYtOCIpKQorQGNoYXJzZXQgInV0Zi0xNmxlIgorZsOzw7MKKyAgYTogYgorU0FTUworICAgICMgU2luY2UgbXVsdGlieXRlIGVuY29kaW5ncycgQGNoYXJzZXQgZGVjbGFyYXRpb25zIGFyZW4ndAorICAgICMgQVNDSUktY29tcGF0aWJsZSwgd2UgaGF2ZSB0byBpbnRlcnByZXQgdGhlIGZpbGVzIGFzIFVURi04IHdoaWNoIHdpbGwKKyAgICAjIGluZXZpdGFibHkgZmFpbC4KKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIkludmFsaWQgVVRGLTggY2hhcmFjdGVyIFwiXFx4RjNcIiIpIHtlbmdpbmUucmVuZGVyfQorICBlbmQKKworICBkZWYgdGVzdF91dGZfMTZsZV93aXRoX2JvbQorICAgIGFzc2VydF9yZW5kZXJzX2VuY29kZWQoPDxDU1MsIDw8U0FTUy5lbmNvZGUoIlVURi0xNkxFIikuZm9yY2VfZW5jb2RpbmcoIkJJTkFSWSIpKQorQGNoYXJzZXQgIlVURi04IjsKK2bDs8OzIHsKKyAgYTogYjsgfQorQ1NTCitcdUZFRkZmw7PDsworICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3V0Zl8xNmJlX3dpdGhfYm9tCisgICAgYXNzZXJ0X3JlbmRlcnNfZW5jb2RlZCg8PENTUywgPDxTQVNTLmVuY29kZSgiVVRGLTE2QkUiKS5mb3JjZV9lbmNvZGluZygiQklOQVJZIikpCitAY2hhcnNldCAiVVRGLTgiOworZsOzw7MgeworICBhOiBiOyB9CitDU1MKK1x1RkVGRmbDs8OzCisgIGE6IGIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXRmXzhfd2l0aF9ib20KKyAgICBhc3NlcnRfcmVuZGVyc19lbmNvZGVkKDw8Q1NTLCA8PFNBU1MuZm9yY2VfZW5jb2RpbmcoIkJJTkFSWSIpKQorQGNoYXJzZXQgIlVURi04IjsKK2bDs8OzIHsKKyAgYTogYjsgfQorQ1NTCitcdUZFRkZmw7PDsworICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NoYXJzZXRfd2l0aF9tdWx0aWJ5dGVfZW5jb2RpbmcKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KDw8U0FTUykKK0BjaGFyc2V0ICJ1dGYtMzJiZSIKK2bDs8OzCisgIGE6IGIKK1NBU1MKKyAgICAjIFRoZSBjaGFyc2V0IGRlY2xhcmF0aW9uIGlzIGp1c3QgZmFsc2UgaGVyZSwgc28gd2Ugc2hvdWxkIGdldCBhbgorICAgICMgZW5jb2RpbmcgZXJyb3IuCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJJbnZhbGlkIFVURi0zMkJFIGNoYXJhY3RlciBcIlxceEMzXCIiKSB7ZW5naW5lLnJlbmRlcn0KKyAgZW5kCisKKyAgZGVmIHRlc3RfY2hhcnNldF93aXRoX3NwZWNpYWxfY2FzZV9lbmNvZGluZworICAgICMgRm9yIHNvbWUgcmVhc29uLCBhIGZpbGUgd2l0aCBhbiBBU0NJSS1jb21wYXRpYmxlIFVURi0xNiBjaGFyc2V0CisgICAgIyBkZWNsYXJhdGlvbiBpcyBzcGVjY2VkIHRvIGJlIHBhcnNlZCBhcyBVVEYtOC4KKyAgICBhc3NlcnRfcmVuZGVyc19lbmNvZGVkKDw8Q1NTLCA8PFNBU1MuZm9yY2VfZW5jb2RpbmcoIkJJTkFSWSIpKQorQGNoYXJzZXQgIlVURi04IjsKK2bDs8OzIHsKKyAgYTogYjsgfQorQ1NTCitAY2hhcnNldCAidXRmLTE2IgorZsOzw7MKKyAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jb21wcmVzc2VkX291dHB1dF91c2VzX2JvbQorICAgIGFzc2VydF9lcXVhbCgiXHVGRUZGZsOzw7N7YTpifVxuIiwgcmVuZGVyKDw8U0FTUywgOnN0eWxlID0+IDpjb21wcmVzc2VkKSkKK2bDs8OzCisgIGE6IGIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmV3bGluZV9ub3JtYWxpemF0aW9uCisgICAgYXNzZXJ0X2VxdWFsKCIvKiBmb29cbmJhclxuYmF6XG5iYW5nXG5xdXggKi9cbiIsCisgICAgICByZW5kZXIoIi8qIGZvb1xuYmFyXHJcbmJhelxmYmFuZ1xycXV4ICovIiwgOnN5bnRheCA9PiA6c2NzcykpCisgIGVuZAorCisgIGRlZiB0ZXN0X251bGxfbm9ybWFsaXphdGlvbgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKCIvKiBmb29ceDAwYmFyXHgwMGJheiAqLyIsIDpzeW50YXggPT4gOnNjc3MpKQorQGNoYXJzZXQgIlVURi04IjsKKy8qIGZvb++/vWJhcu+/vWJheiAqLworQ1NTCisgIGVuZAorCisgICMgUmVncmVzc2lvbgorCisgIGRlZiB0ZXN0X211bHRpYnl0ZV9wcm9wX25hbWUKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorQGNoYXJzZXQgIlVURi04IjsKKyNiYXIgeworICBjw7Zsb3I6IGJsdWU7IH0KK0NTUworI2JhcgorICBjw7Zsb3I6IGJsdWUKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlieXRlX2FuZF9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTLCA6c3ludGF4ID0+IDpzY3NzKSkKKyNiYXIgeworICBiYWNrZ3JvdW5kOiBhIDAlOyB9CitDU1MKKyNiYXIgeworICAvLyDvo78KKyAgYmFja2dyb3VuZDogXCN7YX0gMCU7Cit9CitTQ1NTCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgYXNzZXJ0X3JlbmRlcnNfZW5jb2RlZChjc3MsIHNhc3MpCisgICAgcmVzdWx0ID0gcmVuZGVyKHNhc3MpCisgICAgYXNzZXJ0X2VxdWFsIGNzcy5lbmNvZGluZywgcmVzdWx0LmVuY29kaW5nCisgICAgYXNzZXJ0X2VxdWFsIGNzcywgcmVzdWx0CisgIGVuZAorCisgIGRlZiByZW5kZXIoc2Fzcywgb3B0aW9ucyA9IHt9KQorICAgIG11bmdlX2ZpbGVuYW1lIG9wdGlvbnMKKyAgICBTYXNzOjpFbmdpbmUubmV3KHNhc3MsIG9wdGlvbnMpLnJlbmRlcgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvZW5naW5lX3Rlc3QucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9lbmdpbmVfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNjY1NTgwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvZW5naW5lX3Rlc3QucmIKQEAgLTAsMCArMSwzNDk5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVzdF9oZWxwZXInCityZXF1aXJlICdzYXNzL2VuZ2luZScKK3JlcXVpcmUgJ3N0cmluZ2lvJworcmVxdWlyZSAnbW9ja19pbXBvcnRlcicKK3JlcXVpcmUgJ3BhdGhuYW1lJworCittb2R1bGUgU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnM6OlVzZXJGdW5jdGlvbnMKKyAgZGVmIG9wdGlvbihuYW1lKQorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoQG9wdGlvbnNbbmFtZS52YWx1ZS50b19zeW1dLnRvX3MpCisgIGVuZAorCisgIGRlZiBzZXRfYV92YXJpYWJsZShuYW1lLCB2YWx1ZSkKKyAgICBlbnZpcm9ubWVudC5zZXRfdmFyKG5hbWUudmFsdWUsIHZhbHVlKQorICAgIHJldHVybiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdWxsLm5ldworICBlbmQKKworICBkZWYgc2V0X2FfZ2xvYmFsX3ZhcmlhYmxlKG5hbWUsIHZhbHVlKQorICAgIGVudmlyb25tZW50LnNldF9nbG9iYWxfdmFyKG5hbWUudmFsdWUsIHZhbHVlKQorICAgIHJldHVybiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdWxsLm5ldworICBlbmQKKworICBkZWYgZ2V0X2FfdmFyaWFibGUobmFtZSkKKyAgICBlbnZpcm9ubWVudC52YXIobmFtZS52YWx1ZSkgfHwgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygidW5kZWZpbmVkIikKKyAgZW5kCitlbmQKKworbW9kdWxlIFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zCisgIGluY2x1ZGUgU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnM6OlVzZXJGdW5jdGlvbnMKK2VuZAorCitjbGFzcyBTYXNzRW5naW5lVGVzdCA8IE1pbmlUZXN0OjpUZXN0CisgIEZBS0VfRklMRV9OQU1FID0gX19GSUxFX18uZ3N1YigvcmIkLywic2FzcyIpCisgICMgQSBtYXAgb2YgZXJyb25lb3VzIFNhc3MgZG9jdW1lbnRzIHRvIHRoZSBlcnJvciBtZXNzYWdlcyB0aGV5IHNob3VsZCBwcm9kdWNlLgorICAjIFRoZSBlcnJvciBtZXNzYWdlcyBtYXkgYmUgYXJyYXlzOworICAjIGlmIHNvLCB0aGUgc2Vjb25kIGVsZW1lbnQgc2hvdWxkIGJlIHRoZSBsaW5lIG51bWJlciB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCBmb3IgdGhlIGVycm9yLgorICAjIElmIHRoaXMgaXNuJ3QgcHJvdmlkZWQsIHRoZSB0ZXN0cyB3aWxsIGFzc3VtZSB0aGUgbGluZSBudW1iZXIgc2hvdWxkIGJlIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGRvY3VtZW50LgorICBFWENFUFRJT05fTUFQID0geworICAgICIkYTogMSArICIgPT4gJ0ludmFsaWQgQ1NTIGFmdGVyICIxICsiOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiIicsCisgICAgIiRhOiAxICsgMiArIiA9PiAnSW52YWxpZCBDU1MgYWZ0ZXIgIjEgKyAyICsiOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiIicsCisgICAgIiRhOiAxICsgMiArICUiID0+ICdJbnZhbGlkIENTUyBhZnRlciAiMSArIDIgKyAiOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiJSInLAorICAgICIkYTogZm9vKFwiYmFyXCIiID0+ICdJbnZhbGlkIENTUyBhZnRlciAiZm9vKCJiYXIiIjogZXhwZWN0ZWQgIikiLCB3YXMgIiInLAorICAgICIkYTogMSB9IiA9PiAnSW52YWxpZCBDU1MgYWZ0ZXIgIjEgIjogZXhwZWN0ZWQgZXhwcmVzc2lvbiAoZS5nLiAxcHgsIGJvbGQpLCB3YXMgIn0iJywKKyAgICAiJGE6IDEgfWZvb1wiIiA9PiAnSW52YWxpZCBDU1MgYWZ0ZXIgIjEgIjogZXhwZWN0ZWQgZXhwcmVzc2lvbiAoZS5nLiAxcHgsIGJvbGQpLCB3YXMgIn1mb28iIicsCisgICAgIjoiID0+ICdJbnZhbGlkIHByb3BlcnR5OiAiOiIuJywKKyAgICAiOiBhIiA9PiAnSW52YWxpZCBwcm9wZXJ0eTogIjogYSIuJywKKyAgICAiYVxuICA6YiIgPT4gPDxNU0csCitJbnZhbGlkIHByb3BlcnR5OiAiOmIiIChubyB2YWx1ZSkuCitJZiAiOmIiIHNob3VsZCBiZSBhIHNlbGVjdG9yLCB1c2UgIlxcOmIiIGluc3RlYWQuCitNU0cKKyAgICAiYVxuICBiOiIgPT4gJ0ludmFsaWQgcHJvcGVydHk6ICJiOiIgKG5vIHZhbHVlKS4nLAorICAgICJhXG4gIDpiOiBjIiA9PiAnSW52YWxpZCBwcm9wZXJ0eTogIjpiOiBjIi4nLAorICAgICJhXG4gIDpiOmMgZCIgPT4gJ0ludmFsaWQgcHJvcGVydHk6ICI6YjpjIGQiLicsCisgICAgImFcbiAgOmIgYzsiID0+ICdJbnZhbGlkIENTUyBhZnRlciAiYyI6IGV4cGVjdGVkIGV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSwgd2FzICI7IicsCisgICAgImFcbiAgYjogYzsiID0+ICdJbnZhbGlkIENTUyBhZnRlciAiYyI6IGV4cGVjdGVkIGV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSwgd2FzICI7IicsCisgICAgIi5mb28gXmJhclxuICBhOiBiIiA9PiBbJ0ludmFsaWQgQ1NTIGFmdGVyICIuZm9vICI6IGV4cGVjdGVkIHNlbGVjdG9yLCB3YXMgIl5iYXIiJywgMV0sCisgICAgImFcbiAgQGV4dGVuZCAuZm9vIF5iYXIiID0+ICdJbnZhbGlkIENTUyBhZnRlciAiLmZvbyAiOiBleHBlY3RlZCBzZWxlY3Rvciwgd2FzICJeYmFyIicsCisgICAgImFcbiAgQGV4dGVuZCAuZm9vIC5iYXIiID0+ICJDYW4ndCBleHRlbmQgLmZvbyAuYmFyOiBjYW4ndCBleHRlbmQgbmVzdGVkIHNlbGVjdG9ycyIsCisgICAgImFcbiAgQGV4dGVuZCA+IiA9PiAiQ2FuJ3QgZXh0ZW5kID46IGludmFsaWQgc2VsZWN0b3IiLAorICAgICJhXG4gIEBleHRlbmQgJi5mb28iID0+ICJDYW4ndCBleHRlbmQgJi5mb286IGNhbid0IGV4dGVuZCBwYXJlbnQgc2VsZWN0b3JzIiwKKyAgICAiYTogYiIgPT4gJ1Byb3BlcnRpZXMgYXJlIG9ubHkgYWxsb3dlZCB3aXRoaW4gcnVsZXMsIGRpcmVjdGl2ZXMsIG1peGluIGluY2x1ZGVzLCBvciBvdGhlciBwcm9wZXJ0aWVzLicsCisgICAgIjphIGIiID0+ICdQcm9wZXJ0aWVzIGFyZSBvbmx5IGFsbG93ZWQgd2l0aGluIHJ1bGVzLCBkaXJlY3RpdmVzLCBtaXhpbiBpbmNsdWRlcywgb3Igb3RoZXIgcHJvcGVydGllcy4nLAorICAgICIkIiA9PiAnSW52YWxpZCB2YXJpYWJsZTogIiQiLicsCisgICAgIiRhIiA9PiAnSW52YWxpZCB2YXJpYWJsZTogIiRhIi4nLAorICAgICIkIGEiID0+ICdJbnZhbGlkIHZhcmlhYmxlOiAiJCBhIi4nLAorICAgICIkYSBiIiA9PiAnSW52YWxpZCB2YXJpYWJsZTogIiRhIGIiLicsCisgICAgIiRhOiAxYiArIDJjIiA9PiAiSW5jb21wYXRpYmxlIHVuaXRzOiAnYycgYW5kICdiJy4iLAorICAgICIkYTogMWIgPCAyYyIgPT4gIkluY29tcGF0aWJsZSB1bml0czogJ2MnIGFuZCAnYicuIiwKKyAgICAiJGE6IDFiID4gMmMiID0+ICJJbmNvbXBhdGlibGUgdW5pdHM6ICdjJyBhbmQgJ2InLiIsCisgICAgIiRhOiAxYiA8PSAyYyIgPT4gIkluY29tcGF0aWJsZSB1bml0czogJ2MnIGFuZCAnYicuIiwKKyAgICAiJGE6IDFiID49IDJjIiA9PiAiSW5jb21wYXRpYmxlIHVuaXRzOiAnYycgYW5kICdiJy4iLAorICAgICJhXG4gIGI6IDFiICogMmMiID0+ICIyYipjIGlzbid0IGEgdmFsaWQgQ1NTIHZhbHVlLiIsCisgICAgImFcbiAgYjogMWIgJSAyYyIgPT4gIkluY29tcGF0aWJsZSB1bml0czogJ2MnIGFuZCAnYicuIiwKKyAgICAiJGE6IDJweCArICNjY2MiID0+ICJDYW5ub3QgYWRkIGEgbnVtYmVyIHdpdGggdW5pdHMgKDJweCkgdG8gYSBjb2xvciAoI2NjYykuIiwKKyAgICAiJGE6ICNjY2MgKyAycHgiID0+ICJDYW5ub3QgYWRkIGEgbnVtYmVyIHdpdGggdW5pdHMgKDJweCkgdG8gYSBjb2xvciAoI2NjYykuIiwKKyAgICAiJiBhXG4gIDpiIGMiID0+IFsiQmFzZS1sZXZlbCBydWxlcyBjYW5ub3QgY29udGFpbiB0aGUgcGFyZW50LXNlbGVjdG9yLXJlZmVyZW5jaW5nIGNoYXJhY3RlciAnJicuIiwgMV0sCisgICAgImFcbiAgOmJcbiAgICBjIiA9PiAiSWxsZWdhbCBuZXN0aW5nOiBPbmx5IHByb3BlcnRpZXMgbWF5IGJlIG5lc3RlZCBiZW5lYXRoIHByb3BlcnRpZXMuIiwKKyAgICAiJGE6IGJcbiAgOmMgZFxuIiA9PiAiSWxsZWdhbCBuZXN0aW5nOiBOb3RoaW5nIG1heSBiZSBuZXN0ZWQgYmVuZWF0aCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIiwKKyAgICAiQGltcG9ydCB0ZW1wbGF0ZXMvYmFzaWNcbiAgZm9vIiA9PiAiSWxsZWdhbCBuZXN0aW5nOiBOb3RoaW5nIG1heSBiZSBuZXN0ZWQgYmVuZWF0aCBpbXBvcnQgZGlyZWN0aXZlcy4iLAorICAgICJmb29cbiAgQGltcG9ydCBmb28uY3NzIiA9PiAiQ1NTIGltcG9ydCBkaXJlY3RpdmVzIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlIHJvb3Qgb2YgYSBkb2N1bWVudC4iLAorICAgICJAaWYgdHJ1ZVxuICBAaW1wb3J0IGZvbyIgPT4gIkltcG9ydCBkaXJlY3RpdmVzIG1heSBub3QgYmUgdXNlZCB3aXRoaW4gY29udHJvbCBkaXJlY3RpdmVzIG9yIG1peGlucy4iLAorICAgICJAaWYgdHJ1ZVxuICAuZm9vXG4gICAgQGltcG9ydCBmb28iID0+ICJJbXBvcnQgZGlyZWN0aXZlcyBtYXkgbm90IGJlIHVzZWQgd2l0aGluIGNvbnRyb2wgZGlyZWN0aXZlcyBvciBtaXhpbnMuIiwKKyAgICAiQG1peGluIGZvb1xuICBAaW1wb3J0IGZvbyIgPT4gIkltcG9ydCBkaXJlY3RpdmVzIG1heSBub3QgYmUgdXNlZCB3aXRoaW4gY29udHJvbCBkaXJlY3RpdmVzIG9yIG1peGlucy4iLAorICAgICJAbWl4aW4gZm9vXG4gIC5mb29cbiAgICBAaW1wb3J0IGZvbyIgPT4gIkltcG9ydCBkaXJlY3RpdmVzIG1heSBub3QgYmUgdXNlZCB3aXRoaW4gY29udHJvbCBkaXJlY3RpdmVzIG9yIG1peGlucy4iLAorICAgICJAaW1wb3J0IGZvbzsiID0+ICJJbnZhbGlkIEBpbXBvcnQ6IGV4cGVjdGVkIGVuZCBvZiBsaW5lLCB3YXMgXCI7XCIuIiwKKyAgICAnJGZvbzogImJhciIgImJheiIgIScgPT4gJVF7SW52YWxpZCBDU1MgYWZ0ZXIgIiJiYXIiICJiYXoiICI6IGV4cGVjdGVkIGV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSwgd2FzICIhIn0sCisgICAgJyRmb286ICJiYXIiICJiYXoiICQnID0+ICVRe0ludmFsaWQgQ1NTIGFmdGVyICIiYmFyIiAiYmF6IiAiOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiJCJ9LCAjJworICAgICI9Zm9vXG4gIDpjb2xvciByZWRcbi5iYXJcbiAgK2JhbmciID0+ICJVbmRlZmluZWQgbWl4aW4gJ2JhbmcnLiIsCisgICAgIj1mb29cbiAgOmNvbG9yIHJlZFxuLmJhclxuICArYmFuZ19ib3AiID0+ICJVbmRlZmluZWQgbWl4aW4gJ2JhbmdfYm9wJy4iLAorICAgICI9Zm9vXG4gIDpjb2xvciByZWRcbi5iYXJcbiAgK2JhbmctYm9wIiA9PiAiVW5kZWZpbmVkIG1peGluICdiYW5nLWJvcCcuIiwKKyAgICAiLmZvb1xuICA9Zm9vXG4gICAgOmNvbG9yIHJlZFxuLmJhclxuICArZm9vIiA9PiAiVW5kZWZpbmVkIG1peGluICdmb28nLiIsCisgICAgIiAgICBhXG4gIGI6IGMiID0+IFsiSW5kZW50aW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGlzIGlsbGVnYWwuIiwgMV0sCisgICAgIiBcbiAgIFxuXHRcbiAgYVxuICBiOiBjIiA9PiBbIkluZGVudGluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudCBpcyBpbGxlZ2FsLiIsIDRdLAorICAgICJhXG4gIGI6IGNcbiBiOiBjIiA9PiBbIkluY29uc2lzdGVudCBpbmRlbnRhdGlvbjogMSBzcGFjZSB3YXMgdXNlZCBmb3IgaW5kZW50YXRpb24sIGJ1dCB0aGUgcmVzdCBvZiB0aGUgZG9jdW1lbnQgd2FzIGluZGVudGVkIHVzaW5nIDIgc3BhY2VzLiIsIDNdLAorICAgICJhXG4gIGI6IGNcbmFcbiBiOiBjIiA9PiBbIkluY29uc2lzdGVudCBpbmRlbnRhdGlvbjogMSBzcGFjZSB3YXMgdXNlZCBmb3IgaW5kZW50YXRpb24sIGJ1dCB0aGUgcmVzdCBvZiB0aGUgZG9jdW1lbnQgd2FzIGluZGVudGVkIHVzaW5nIDIgc3BhY2VzLiIsIDRdLAorICAgICJhXG5cdFx0YjogY1xuXHRiOiBjIiA9PiBbIkluY29uc2lzdGVudCBpbmRlbnRhdGlvbjogMSB0YWIgd2FzIHVzZWQgZm9yIGluZGVudGF0aW9uLCBidXQgdGhlIHJlc3Qgb2YgdGhlIGRvY3VtZW50IHdhcyBpbmRlbnRlZCB1c2luZyAyIHRhYnMuIiwgM10sCisgICAgImFcbiAgYjogY1xuICAgYjogYyIgPT4gWyJJbmNvbnNpc3RlbnQgaW5kZW50YXRpb246IDMgc3BhY2VzIHdlcmUgdXNlZCBmb3IgaW5kZW50YXRpb24sIGJ1dCB0aGUgcmVzdCBvZiB0aGUgZG9jdW1lbnQgd2FzIGluZGVudGVkIHVzaW5nIDIgc3BhY2VzLiIsIDNdLAorICAgICJhXG4gIGI6IGNcbiAgYVxuICAgZDogZSIgPT4gWyJJbmNvbnNpc3RlbnQgaW5kZW50YXRpb246IDMgc3BhY2VzIHdlcmUgdXNlZCBmb3IgaW5kZW50YXRpb24sIGJ1dCB0aGUgcmVzdCBvZiB0aGUgZG9jdW1lbnQgd2FzIGluZGVudGVkIHVzaW5nIDIgc3BhY2VzLiIsIDRdLAorICAgICJhXG4gXHRiOiBjIiA9PiBbIkluZGVudGF0aW9uIGNhbid0IHVzZSBib3RoIHRhYnMgYW5kIHNwYWNlcy4iLCAyXSwKKyAgICAiPWEoIiA9PiAnSW52YWxpZCBDU1MgYWZ0ZXIgIigiOiBleHBlY3RlZCB2YXJpYWJsZSAoZS5nLiAkZm9vKSwgd2FzICIiJywKKyAgICAiPWEoYikiID0+ICdJbnZhbGlkIENTUyBhZnRlciAiKCI6IGV4cGVjdGVkIHZhcmlhYmxlIChlLmcuICRmb28pLCB3YXMgImIpIicsCisgICAgIj1hKCwpIiA9PiAnSW52YWxpZCBDU1MgYWZ0ZXIgIigiOiBleHBlY3RlZCB2YXJpYWJsZSAoZS5nLiAkZm9vKSwgd2FzICIsKSInLAorICAgICI9YSgkKSIgPT4gJ0ludmFsaWQgQ1NTIGFmdGVyICIoIjogZXhwZWN0ZWQgdmFyaWFibGUgKGUuZy4gJGZvbyksIHdhcyAiJCkiJywKKyAgICAiPWEoJGZvbyBiYXIpIiA9PiAnSW52YWxpZCBDU1MgYWZ0ZXIgIigkZm9vICI6IGV4cGVjdGVkICIpIiwgd2FzICJiYXIpIicsCisgICAgIj1mb29cbiAgYmFyOiBiYXpcbitmb28iID0+IFsiUHJvcGVydGllcyBhcmUgb25seSBhbGxvd2VkIHdpdGhpbiBydWxlcywgZGlyZWN0aXZlcywgbWl4aW4gaW5jbHVkZXMsIG9yIG90aGVyIHByb3BlcnRpZXMuIiwgMl0sCisgICAgImEtXCN7JGJcbiAgYzogZCIgPT4gWydJbnZhbGlkIENTUyBhZnRlciAiYS0jeyRiIjogZXhwZWN0ZWQgIn0iLCB3YXMgIiInLCAxXSwKKyAgICAiPWEoJGI6IDEsICRjKSIgPT4gIlJlcXVpcmVkIGFyZ3VtZW50ICRjIG11c3QgY29tZSBiZWZvcmUgYW55IG9wdGlvbmFsIGFyZ3VtZW50cy4iLAorICAgICI9YSgkYjogMSlcbiAgYTogJGJcbmRpdlxuICArYSgxLDIpIiA9PiAiTWl4aW4gYSB0YWtlcyAxIGFyZ3VtZW50IGJ1dCAyIHdlcmUgcGFzc2VkLiIsCisgICAgIj1hKCRiOiAxKVxuICBhOiAkYlxuZGl2XG4gICthKDEsJGM6IDMpIiA9PiAiTWl4aW4gYSBkb2Vzbid0IGhhdmUgYW4gYXJndW1lbnQgbmFtZWQgJGMuIiwKKyAgICAiPWEoJGIpXG4gIGE6ICRiXG5kaXZcbiAgK2EiID0+ICJNaXhpbiBhIGlzIG1pc3NpbmcgYXJndW1lbnQgJGIuIiwKKyAgICAiQGZ1bmN0aW9uIGZvbygpXG4gIDEgKyAyIiA9PiAiRnVuY3Rpb25zIGNhbiBvbmx5IGNvbnRhaW4gdmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCBjb250cm9sIGRpcmVjdGl2ZXMuIiwKKyAgICAiQGZ1bmN0aW9uIGZvbygpXG4gIGZvbzogYmFyIiA9PiAiRnVuY3Rpb25zIGNhbiBvbmx5IGNvbnRhaW4gdmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCBjb250cm9sIGRpcmVjdGl2ZXMuIiwKKyAgICAiQGZ1bmN0aW9uIGZvbygpXG4gIGZvbzogYmFyXG4gIEByZXR1cm4gMyIgPT4gWyJGdW5jdGlvbnMgY2FuIG9ubHkgY29udGFpbiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYW5kIGNvbnRyb2wgZGlyZWN0aXZlcy4iLCAyXSwKKyAgICAiQGZ1bmN0aW9uIGZvb1xuICBAcmV0dXJuIDEiID0+IFsnSW52YWxpZCBDU1MgYWZ0ZXIgIiI6IGV4cGVjdGVkICIoIiwgd2FzICIiJywgMV0sCisgICAgIkBmdW5jdGlvbiBmb28oXG4gIEByZXR1cm4gMSIgPT4gWydJbnZhbGlkIENTUyBhZnRlciAiKCI6IGV4cGVjdGVkIHZhcmlhYmxlIChlLmcuICRmb28pLCB3YXMgIiInLCAxXSwKKyAgICAiQGZ1bmN0aW9uIGZvbyhiKVxuICBAcmV0dXJuIDEiID0+IFsnSW52YWxpZCBDU1MgYWZ0ZXIgIigiOiBleHBlY3RlZCB2YXJpYWJsZSAoZS5nLiAkZm9vKSwgd2FzICJiKSInLCAxXSwKKyAgICAiQGZ1bmN0aW9uIGZvbygsKVxuICBAcmV0dXJuIDEiID0+IFsnSW52YWxpZCBDU1MgYWZ0ZXIgIigiOiBleHBlY3RlZCB2YXJpYWJsZSAoZS5nLiAkZm9vKSwgd2FzICIsKSInLCAxXSwKKyAgICAiQGZ1bmN0aW9uIGZvbygkKVxuICBAcmV0dXJuIDEiID0+IFsnSW52YWxpZCBDU1MgYWZ0ZXIgIigiOiBleHBlY3RlZCB2YXJpYWJsZSAoZS5nLiAkZm9vKSwgd2FzICIkKSInLCAxXSwKKyAgICAiQGZ1bmN0aW9uIGZvbygpXG4gIEByZXR1cm4iID0+ICdJbnZhbGlkIEByZXR1cm46IGV4cGVjdGVkIGV4cHJlc3Npb24uJywKKyAgICAiQGZ1bmN0aW9uIGZvbygpXG4gIEByZXR1cm4gMVxuICAgICR2YXI6IHZhbCIgPT4gJ0lsbGVnYWwgbmVzdGluZzogTm90aGluZyBtYXkgYmUgbmVzdGVkIGJlbmVhdGggcmV0dXJuIGRpcmVjdGl2ZXMuJywKKyAgICAiQGZ1bmN0aW9uIGZvbygkYSlcbiAgQHJldHVybiAxXG5hXG4gIGI6IGZvbygpIiA9PiAnRnVuY3Rpb24gZm9vIGlzIG1pc3NpbmcgYXJndW1lbnQgJGEuJywKKyAgICAiQGZ1bmN0aW9uIGZvbygpXG4gIEByZXR1cm4gMVxuYVxuICBiOiBmb28oMikiID0+ICdGdW5jdGlvbiBmb28gdGFrZXMgMCBhcmd1bWVudHMgYnV0IDEgd2FzIHBhc3NlZC4nLAorICAgICJAZnVuY3Rpb24gZm9vKClcbiAgQHJldHVybiAxXG5hXG4gIGI6IGZvbygkYTogMSkiID0+ICJGdW5jdGlvbiBmb28gZG9lc24ndCBoYXZlIGFuIGFyZ3VtZW50IG5hbWVkICRhLiIsCisgICAgIkBmdW5jdGlvbiBmb28oKVxuICBAcmV0dXJuIDFcbmFcbiAgYjogZm9vKCRhOiAxLCAkYjogMikiID0+ICJGdW5jdGlvbiBmb28gZG9lc24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOiAkYSwgJGIuIiwKKyAgICAiQHJldHVybiAxIiA9PiAnQHJldHVybiBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiBhIGZ1bmN0aW9uLicsCisgICAgIkBpZiB0cnVlXG4gIEByZXR1cm4gMSIgPT4gJ0ByZXR1cm4gbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gYSBmdW5jdGlvbi4nLAorICAgICJAbWl4aW4gZm9vXG4gIEByZXR1cm4gMVxuQGluY2x1ZGUgZm9vIiA9PiBbJ0ByZXR1cm4gbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gYSBmdW5jdGlvbi4nLCAyXSwKKyAgICAiQGVsc2VcbiAgYVxuICAgIGI6IGMiID0+IFsiQGVsc2UgbXVzdCBjb21lIGFmdGVyIEBpZi4iLCAxXSwKKyAgICAiQGlmIGZhbHNlXG5AZWxzZSBmb28iID0+ICJJbnZhbGlkIGVsc2UgZGlyZWN0aXZlICdAZWxzZSBmb28nOiBleHBlY3RlZCAnaWYgPGV4cHI+Jy4iLAorICAgICJAaWYgZmFsc2VcbkBlbHNlIGlmICIgPT4gIkludmFsaWQgZWxzZSBkaXJlY3RpdmUgJ0BlbHNlIGlmJzogZXhwZWN0ZWQgJ2lmIDxleHByPicuIiwKKyAgICAiYVxuICAkYjogMTJcbmNcbiAgZDogJGIiID0+ICdVbmRlZmluZWQgdmFyaWFibGU6ICIkYiIuJywKKyAgICAiPWZvb1xuICAkYjogMTJcbmNcbiAgK2Zvb1xuICBkOiAkYiIgPT4gJ1VuZGVmaW5lZCB2YXJpYWJsZTogIiRiIi4nLAorICAgICJjXG4gIGQ6ICRiLWZvbyIgPT4gJ1VuZGVmaW5lZCB2YXJpYWJsZTogIiRiLWZvbyIuJywKKyAgICAiY1xuICBkOiAkYl9mb28iID0+ICdVbmRlZmluZWQgdmFyaWFibGU6ICIkYl9mb28iLicsCisgICAgJ0Bmb3IgJGEgZnJvbSAiZm9vIiB0byAxJyA9PiAnImZvbyIgaXMgbm90IGFuIGludGVnZXIuJywKKyAgICAnQGZvciAkYSBmcm9tIDEgdG8gIjIiJyA9PiAnIjIiIGlzIG5vdCBhbiBpbnRlZ2VyLicsCisgICAgJ0Bmb3IgJGEgZnJvbSAxIHRvICJmb28iJyA9PiAnImZvbyIgaXMgbm90IGFuIGludGVnZXIuJywKKyAgICAnQGZvciAkYSBmcm9tIDEgdG8gMS4yMzIzMjMyMzIzMicgPT4gJzEuMjMyMzIzMjMyMyBpcyBub3QgYW4gaW50ZWdlci4nLAorICAgICdAZm9yICRhIGZyb20gMXB4IHRvIDNlbScgPT4gIkluY29tcGF0aWJsZSB1bml0czogJ2VtJyBhbmQgJ3B4Jy4iLAorICAgICdAaWYnID0+ICJJbnZhbGlkIGlmIGRpcmVjdGl2ZSAnQGlmJzogZXhwZWN0ZWQgZXhwcmVzc2lvbi4iLAorICAgICdAd2hpbGUnID0+ICJJbnZhbGlkIHdoaWxlIGRpcmVjdGl2ZSAnQHdoaWxlJzogZXhwZWN0ZWQgZXhwcmVzc2lvbi4iLAorICAgICdAZGVidWcnID0+ICJJbnZhbGlkIGRlYnVnIGRpcmVjdGl2ZSAnQGRlYnVnJzogZXhwZWN0ZWQgZXhwcmVzc2lvbi4iLAorICAgICVRe0BkZWJ1ZyAiYSBtZXNzYWdlIlxuICAibmVzdGVkIG1lc3NhZ2UifSA9PiAiSWxsZWdhbCBuZXN0aW5nOiBOb3RoaW5nIG1heSBiZSBuZXN0ZWQgYmVuZWF0aCBkZWJ1ZyBkaXJlY3RpdmVzLiIsCisgICAgJ0BlcnJvcicgPT4gIkludmFsaWQgZXJyb3IgZGlyZWN0aXZlICdAZXJyb3InOiBleHBlY3RlZCBleHByZXNzaW9uLiIsCisgICAgJVF7QGVycm9yICJhIG1lc3NhZ2UiXG4gICJuZXN0ZWQgbWVzc2FnZSJ9ID0+ICJJbGxlZ2FsIG5lc3Rpbmc6IE5vdGhpbmcgbWF5IGJlIG5lc3RlZCBiZW5lYXRoIGVycm9yIGRpcmVjdGl2ZXMuIiwKKyAgICAnQHdhcm4nID0+ICJJbnZhbGlkIHdhcm4gZGlyZWN0aXZlICdAd2Fybic6IGV4cGVjdGVkIGV4cHJlc3Npb24uIiwKKyAgICAlUXtAd2FybiAiYSBtZXNzYWdlIlxuICAibmVzdGVkIG1lc3NhZ2UifSA9PiAiSWxsZWdhbCBuZXN0aW5nOiBOb3RoaW5nIG1heSBiZSBuZXN0ZWQgYmVuZWF0aCB3YXJuIGRpcmVjdGl2ZXMuIiwKKyAgICAiLyogZm9vXG4gICAgYmFyXG4gIGJheiIgPT4gIkluY29uc2lzdGVudCBpbmRlbnRhdGlvbjogcHJldmlvdXMgbGluZSB3YXMgaW5kZW50ZWQgYnkgNCBzcGFjZXMsIGJ1dCB0aGlzIGxpbmUgd2FzIGluZGVudGVkIGJ5IDIgc3BhY2VzLiIsCisgICAgJytmb28oMSArIDE6IDIpJyA9PiAnSW52YWxpZCBDU1MgYWZ0ZXIgIigxICsgMSI6IGV4cGVjdGVkIGNvbW1hLCB3YXMgIjogMikiJywKKyAgICAnK2ZvbygkdmFyOiApJyA9PiAnSW52YWxpZCBDU1MgYWZ0ZXIgIigkdmFyOiAiOiBleHBlY3RlZCBtaXhpbiBhcmd1bWVudCwgd2FzICIpIicsCisgICAgJytmb28oJHZhcjogYSwgJHZhcjogYiknID0+ICdLZXl3b3JkIGFyZ3VtZW50ICIkdmFyIiBwYXNzZWQgbW9yZSB0aGFuIG9uY2UnLAorICAgICcrZm9vKCR2YXItdmFyOiBhLCAkdmFyX3ZhcjogYiknID0+ICdLZXl3b3JkIGFyZ3VtZW50ICIkdmFyX3ZhciIgcGFzc2VkIG1vcmUgdGhhbiBvbmNlJywKKyAgICAnK2ZvbygkdmFyX3ZhcjogYSwgJHZhci12YXI6IGIpJyA9PiAnS2V5d29yZCBhcmd1bWVudCAiJHZhci12YXIiIHBhc3NlZCBtb3JlIHRoYW4gb25jZScsCisgICAgImFcbiAgYjogZm9vKDEgKyAxOiAyKSIgPT4gJ0ludmFsaWQgQ1NTIGFmdGVyICJmb28oMSArIDEiOiBleHBlY3RlZCBjb21tYSwgd2FzICI6IDIpIicsCisgICAgImFcbiAgYjogZm9vKCR2YXI6ICkiID0+ICdJbnZhbGlkIENTUyBhZnRlciAiZm9vKCR2YXI6ICI6IGV4cGVjdGVkIGZ1bmN0aW9uIGFyZ3VtZW50LCB3YXMgIikiJywKKyAgICAiYVxuICBiOiBmb28oJHZhcjogYSwgJHZhcjogYikiID0+ICdLZXl3b3JkIGFyZ3VtZW50ICIkdmFyIiBwYXNzZWQgbW9yZSB0aGFuIG9uY2UnLAorICAgICJhXG4gIGI6IGZvbygkdmFyLXZhcjogYSwgJHZhcl92YXI6IGIpIiA9PiAnS2V5d29yZCBhcmd1bWVudCAiJHZhcl92YXIiIHBhc3NlZCBtb3JlIHRoYW4gb25jZScsCisgICAgImFcbiAgYjogZm9vKCR2YXJfdmFyOiBhLCAkdmFyLXZhcjogYikiID0+ICdLZXl3b3JkIGFyZ3VtZW50ICIkdmFyLXZhciIgcGFzc2VkIG1vcmUgdGhhbiBvbmNlJywKKyAgICAiQGlmIGZvb1xuICBAZXh0ZW5kIC5iYXIiID0+IFsiRXh0ZW5kIGRpcmVjdGl2ZXMgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gcnVsZXMuIiwgMl0sCisgICAgIiR2YXI6IHRydWVcbkB3aGlsZSAkdmFyXG4gIEBleHRlbmQgLmJhclxuICAkdmFyOiBmYWxzZSIgPT4gWyJFeHRlbmQgZGlyZWN0aXZlcyBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiBydWxlcy4iLCAzXSwKKyAgICAiQGZvciAkaSBmcm9tIDAgdG8gMVxuICBAZXh0ZW5kIC5iYXIiID0+IFsiRXh0ZW5kIGRpcmVjdGl2ZXMgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gcnVsZXMuIiwgMl0sCisgICAgIkBtaXhpbiBmb29cbiAgQGV4dGVuZCAuYmFyXG5AaW5jbHVkZSBmb28iID0+IFsiRXh0ZW5kIGRpcmVjdGl2ZXMgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gcnVsZXMuIiwgMl0sCisgICAgImZvbyAlXG4gIGE6IGIiID0+IFsnSW52YWxpZCBDU1MgYWZ0ZXIgImZvbyAlIjogZXhwZWN0ZWQgcGxhY2Vob2xkZXIgbmFtZSwgd2FzICIiJywgMV0sCisgICAgIj1mb29cbiAgQGNvbnRlbnQgZXJyb3IiID0+ICJJbnZhbGlkIGNvbnRlbnQgZGlyZWN0aXZlLiBUcmFpbGluZyBjaGFyYWN0ZXJzIGZvdW5kOiBcImVycm9yXCIuIiwKKyAgICAiPWZvb1xuICBAY29udGVudFxuICAgIGI6IGMiID0+ICJJbGxlZ2FsIG5lc3Rpbmc6IE5vdGhpbmcgbWF5IGJlIG5lc3RlZCBiZW5lYXRoIEBjb250ZW50IGRpcmVjdGl2ZXMuIiwKKyAgICAiQGNvbnRlbnQiID0+ICdAY29udGVudCBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiBhIG1peGluLicsCisgICAgIj1zaW1wbGVcbiAgLnNpbXBsZVxuICAgIGNvbG9yOiByZWRcbitzaW1wbGVcbiAgY29sb3I6IGJsdWUiID0+IFsnTWl4aW4gInNpbXBsZSIgZG9lcyBub3QgYWNjZXB0IGEgY29udGVudCBibG9jay4nLCA0XSwKKyAgICAiQGltcG9ydCBcImZvb1wiIC8vIGJhciIgPT4gIkludmFsaWQgQ1NTIGFmdGVyIFwiXCJmb29cIiBcIjogZXhwZWN0ZWQgbWVkaWEgcXVlcnkgbGlzdCwgd2FzIFwiLy8gYmFyXCIiLAorICAgICJAYXQtcm9vdFxuICBhOiBiIiA9PiAiUHJvcGVydGllcyBhcmUgb25seSBhbGxvd2VkIHdpdGhpbiBydWxlcywgZGlyZWN0aXZlcywgbWl4aW4gaW5jbHVkZXMsIG9yIG90aGVyIHByb3BlcnRpZXMuIiwKKworICAgICMgUmVncmVzc2lvbiB0ZXN0cworICAgICJhXG4gIGI6XG4gICAgY1xuICAgIGQiID0+IFsiSWxsZWdhbCBuZXN0aW5nOiBPbmx5IHByb3BlcnRpZXMgbWF5IGJlIG5lc3RlZCBiZW5lYXRoIHByb3BlcnRpZXMuIiwgM10sCisgICAgIiYgZm9vXG4gIGJhcjogYmF6XG4gIGJsYXQ6IGJhbmciID0+IFsiQmFzZS1sZXZlbCBydWxlcyBjYW5ub3QgY29udGFpbiB0aGUgcGFyZW50LXNlbGVjdG9yLXJlZmVyZW5jaW5nIGNoYXJhY3RlciAnJicuIiwgMV0sCisgICAgImFcbiAgYjogY1xuJiBmb29cbiAgYmFyOiBiYXpcbiAgYmxhdDogYmFuZyIgPT4gWyJCYXNlLWxldmVsIHJ1bGVzIGNhbm5vdCBjb250YWluIHRoZSBwYXJlbnQtc2VsZWN0b3ItcmVmZXJlbmNpbmcgY2hhcmFjdGVyICcmJy4iLCAzXSwKKyAgICAiQCIgPT4gIkludmFsaWQgZGlyZWN0aXZlOiAnQCcuIiwKKyAgICAiJHI6IDIwZW0gKiAjY2NjIiA9PiBbIkNhbm5vdCBtdWx0aXBseSBhIG51bWJlciB3aXRoIHVuaXRzICgyMGVtKSB0byBhIGNvbG9yICgjY2NjKS4iLCAxXSwKKyAgICAiJHI6ICNjY2MgLyAxZW0iID0+IFsiQ2Fubm90IGRpdmlkZSBhIG51bWJlciB3aXRoIHVuaXRzICgxZW0pIHRvIGEgY29sb3IgKCNjY2MpLiIsIDFdLAorICB9CisKKyAgZGVmIHRlYXJkb3duCisgICAgY2xlYW5fdXBfc2Fzc2MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYmFzaWNfcmVuZGVyCisgICAgcmVuZGVyc19jb3JyZWN0bHkgImJhc2ljIiwgeyA6c3R5bGUgPT4gOmNvbXBhY3QgfQorICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9yZW5kZXIKKyAgICBhc3NlcnRfZXF1YWwgIiIsIHJlbmRlcigiIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlwbGVfY2FsbHNfdG9fcmVuZGVyCisgICAgc2FzcyA9IFNhc3M6OkVuZ2luZS5uZXcoImFcbiAgYjogYyIpCisgICAgYXNzZXJ0X2VxdWFsIHNhc3MucmVuZGVyLCBzYXNzLnJlbmRlcgorICBlbmQKKworICBkZWYgdGVzdF9hbHRlcm5hdGVfc3R5bGVzCisgICAgcmVuZGVyc19jb3JyZWN0bHkgImV4cGFuZGVkIiwgeyA6c3R5bGUgPT4gOmV4cGFuZGVkIH0KKyAgICByZW5kZXJzX2NvcnJlY3RseSAiY29tcGFjdCIsIHsgOnN0eWxlID0+IDpjb21wYWN0IH0KKyAgICByZW5kZXJzX2NvcnJlY3RseSAibmVzdGVkIiwgeyA6c3R5bGUgPT4gOm5lc3RlZCB9CisgICAgcmVuZGVyc19jb3JyZWN0bHkgImNvbXByZXNzZWQiLCB7IDpzdHlsZSA9PiA6Y29tcHJlc3NlZCB9CisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBpbGUKKyAgICBhc3NlcnRfZXF1YWwgImRpdiB7IGhlbGxvOiB3b3JsZDsgfVxuIiwgU2Fzcy5jb21waWxlKCIkd2hvOiB3b3JsZFxuZGl2XG4gIGhlbGxvOiAkd2hvIiwgOnN5bnRheCA9PiA6c2FzcywgOnN0eWxlID0+IDpjb21wYWN0KQorICAgIGFzc2VydF9lcXVhbCAiZGl2IHsgaGVsbG86IHdvcmxkOyB9XG4iLCBTYXNzLmNvbXBpbGUoIiR3aG86IHdvcmxkOyBkaXYgeyBoZWxsbzogJHdobyB9IiwgOnN0eWxlID0+IDpjb21wYWN0KQorICBlbmQKKworICBkZWYgdGVzdF9jb21waWxlX2ZpbGUKKyAgICBGaWxlVXRpbHMubWtkaXJfcChhYnNvbHV0aXplKCJ0bXAiKSkKKyAgICBvcGVuKGFic29sdXRpemUoInRtcC90ZXN0X2NvbXBpbGVfZmlsZS5zYXNzIiksICJ3Iikge3xmfCBmLndyaXRlKCIkd2hvOiB3b3JsZFxuZGl2XG4gIGhlbGxvOiAkd2hvIil9CisgICAgb3BlbihhYnNvbHV0aXplKCJ0bXAvdGVzdF9jb21waWxlX2ZpbGUuc2NzcyIpLCAidyIpIHt8ZnwgZi53cml0ZSgiJHdobzogd29ybGQ7IGRpdiB7IGhlbGxvOiAkd2hvIH0iKX0KKyAgICBhc3NlcnRfZXF1YWwgImRpdiB7IGhlbGxvOiB3b3JsZDsgfVxuIiwgU2Fzcy5jb21waWxlX2ZpbGUoYWJzb2x1dGl6ZSgidG1wL3Rlc3RfY29tcGlsZV9maWxlLnNhc3MiKSwgOnN0eWxlID0+IDpjb21wYWN0KQorICAgIGFzc2VydF9lcXVhbCAiZGl2IHsgaGVsbG86IHdvcmxkOyB9XG4iLCBTYXNzLmNvbXBpbGVfZmlsZShhYnNvbHV0aXplKCJ0bXAvdGVzdF9jb21waWxlX2ZpbGUuc2NzcyIpLCA6c3R5bGUgPT4gOmNvbXBhY3QpCisgIGVuc3VyZQorICAgIEZpbGVVdGlscy5ybV9yZihhYnNvbHV0aXplKCJ0bXAiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcGlsZV9maWxlX3RvX2Nzc19maWxlCisgICAgRmlsZVV0aWxzLm1rZGlyX3AoYWJzb2x1dGl6ZSgidG1wIikpCisgICAgb3BlbihhYnNvbHV0aXplKCJ0bXAvdGVzdF9jb21waWxlX2ZpbGUuc2FzcyIpLCAidyIpIHt8ZnwgZi53cml0ZSgiJHdobzogd29ybGRcbmRpdlxuICBoZWxsbzogJHdobyIpfQorICAgIG9wZW4oYWJzb2x1dGl6ZSgidG1wL3Rlc3RfY29tcGlsZV9maWxlLnNjc3MiKSwgInciKSB7fGZ8IGYud3JpdGUoIiR3aG86IHdvcmxkOyBkaXYgeyBoZWxsbzogJHdobyB9Iil9CisgICAgU2Fzcy5jb21waWxlX2ZpbGUoYWJzb2x1dGl6ZSgidG1wL3Rlc3RfY29tcGlsZV9maWxlLnNhc3MiKSwgYWJzb2x1dGl6ZSgidG1wL3Rlc3RfY29tcGlsZV9maWxlX3Nhc3MuY3NzIiksIDpzdHlsZSA9PiA6Y29tcGFjdCkKKyAgICBTYXNzLmNvbXBpbGVfZmlsZShhYnNvbHV0aXplKCJ0bXAvdGVzdF9jb21waWxlX2ZpbGUuc2NzcyIpLCBhYnNvbHV0aXplKCJ0bXAvdGVzdF9jb21waWxlX2ZpbGVfc2Nzcy5jc3MiKSwgOnN0eWxlID0+IDpjb21wYWN0KQorICAgIGFzc2VydF9lcXVhbCAiZGl2IHsgaGVsbG86IHdvcmxkOyB9XG4iLCBGaWxlLnJlYWQoYWJzb2x1dGl6ZSgidG1wL3Rlc3RfY29tcGlsZV9maWxlX3Nhc3MuY3NzIikpCisgICAgYXNzZXJ0X2VxdWFsICJkaXYgeyBoZWxsbzogd29ybGQ7IH1cbiIsIEZpbGUucmVhZChhYnNvbHV0aXplKCJ0bXAvdGVzdF9jb21waWxlX2ZpbGVfc2Nzcy5jc3MiKSkKKyAgZW5zdXJlCisgICAgRmlsZVV0aWxzLnJtX3JmKGFic29sdXRpemUoInRtcCIpKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2ZsZXhpYmxlX3RhYnVsYXRpb24KKyAgICBhc3NlcnRfZXF1YWwoInAge1xuICBhOiBiOyB9XG4gIHAgcSB7XG4gICAgYzogZDsgfVxuIiwKKyAgICAgICAgICAgICAgICAgcmVuZGVyKCJwXG4gYTogYlxuIHFcbiAgYzogZFxuIikpCisgICAgYXNzZXJ0X2VxdWFsKCJwIHtcbiAgYTogYjsgfVxuICBwIHEge1xuICAgIGM6IGQ7IH1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigicFxuXHRhOiBiXG5cdHFcblx0XHRjOiBkXG4iKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0X3NhbWVfbmFtZV9kaWZmZXJlbnRfZXh0CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UgU2Fzczo6U3ludGF4RXJyb3IsIDw8RVJST1IgZG8KK0l0J3Mgbm90IGNsZWFyIHdoaWNoIGZpbGUgdG8gaW1wb3J0IGZvciAnQGltcG9ydCAic2FtZV9uYW1lX2RpZmZlcmVudF9leHQiJy4KK0NhbmRpZGF0ZXM6CisgIHNhbWVfbmFtZV9kaWZmZXJlbnRfZXh0LnNhc3MKKyAgc2FtZV9uYW1lX2RpZmZlcmVudF9leHQuc2NzcworUGxlYXNlIGRlbGV0ZSBvciByZW5hbWUgYWxsIGJ1dCBvbmUgb2YgdGhlc2UgZmlsZXMuCitFUlJPUgorICAgICAgb3B0aW9ucyA9IHs6bG9hZF9wYXRocyA9PiBbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVtcGxhdGVzLyddfQorICAgICAgbXVuZ2VfZmlsZW5hbWUgb3B0aW9ucworICAgICAgU2Fzczo6RW5naW5lLm5ldygiQGltcG9ydCAnc2FtZV9uYW1lX2RpZmZlcmVudF9leHQnIiwgb3B0aW9ucykucmVuZGVyCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF9zYW1lX25hbWVfZGlmZmVyZW50X3BhcnRpYWxpdHkKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZSBTYXNzOjpTeW50YXhFcnJvciwgPDxFUlJPUiBkbworSXQncyBub3QgY2xlYXIgd2hpY2ggZmlsZSB0byBpbXBvcnQgZm9yICdAaW1wb3J0ICJzYW1lX25hbWVfZGlmZmVyZW50X3BhcnRpYWxpdHkiJy4KK0NhbmRpZGF0ZXM6CisgIF9zYW1lX25hbWVfZGlmZmVyZW50X3BhcnRpYWxpdHkuc2NzcworICBzYW1lX25hbWVfZGlmZmVyZW50X3BhcnRpYWxpdHkuc2NzcworUGxlYXNlIGRlbGV0ZSBvciByZW5hbWUgYWxsIGJ1dCBvbmUgb2YgdGhlc2UgZmlsZXMuCitFUlJPUgorICAgICAgb3B0aW9ucyA9IHs6bG9hZF9wYXRocyA9PiBbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVtcGxhdGVzLyddfQorICAgICAgbXVuZ2VfZmlsZW5hbWUgb3B0aW9ucworICAgICAgU2Fzczo6RW5naW5lLm5ldygiQGltcG9ydCAnc2FtZV9uYW1lX2RpZmZlcmVudF9wYXJ0aWFsaXR5JyIsIG9wdGlvbnMpLnJlbmRlcgorICAgIGVuZAorICBlbmQKKworICBFWENFUFRJT05fTUFQLmVhY2ggZG8gfGtleSwgdmFsdWV8CisgICAgZGVmaW5lX21ldGhvZCgidGVzdF9leGNlcHRpb24gKCN7a2V5Lmluc3BlY3R9KSIpIGRvCisgICAgICBsaW5lID0gMTAKKyAgICAgIGJlZ2luCisgICAgICAgIHNpbGVuY2Vfd2FybmluZ3Mge1Nhc3M6OkVuZ2luZS5uZXcoa2V5LCA6ZmlsZW5hbWUgPT4gRkFLRV9GSUxFX05BTUUsIDpsaW5lID0+IGxpbmUpLnJlbmRlcn0KKyAgICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlcnIKKyAgICAgICAgdmFsdWUgPSBbdmFsdWVdIHVubGVzcyB2YWx1ZS5pc19hPyhBcnJheSkKKworICAgICAgICBhc3NlcnRfZXF1YWwodmFsdWUuZmlyc3QucnN0cmlwLCBlcnIubWVzc2FnZSwgIkxpbmU6ICN7a2V5fSIpCisgICAgICAgIGFzc2VydF9lcXVhbChGQUtFX0ZJTEVfTkFNRSwgZXJyLnNhc3NfZmlsZW5hbWUpCisgICAgICAgIGFzc2VydF9lcXVhbCgodmFsdWVbMV0gfHwga2V5LnNwbGl0KCJcbiIpLmxlbmd0aCkgKyBsaW5lIC0gMSwgZXJyLnNhc3NfbGluZSwgIkxpbmU6ICN7a2V5fSIpCisgICAgICAgIGFzc2VydF9tYXRjaCgvI3tSZWdleHAuZXNjYXBlKEZBS0VfRklMRV9OQU1FKX06WzAtOV0rLywgZXJyLmJhY2t0cmFjZVswXSwgIkxpbmU6ICN7a2V5fSIpCisgICAgICBlbHNlCisgICAgICAgIGFzc2VydChmYWxzZSwgIkV4Y2VwdGlvbiBub3QgcmFpc2VkIGZvclxuI3trZXl9IikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9leGNlcHRpb25fbGluZQorICAgIHRvX3JlbmRlciA9IDw8U0FTUworcnVsZQorICBwcm9wOiB2YWwKKyAgLy8gY29tbWVudCEKKworICBicm9rZW46CitTQVNTCisgICAgYmVnaW4KKyAgICAgIFNhc3M6OkVuZ2luZS5uZXcodG9fcmVuZGVyKS5yZW5kZXIKKyAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZXJyCisgICAgICBhc3NlcnRfZXF1YWwoNSwgZXJyLnNhc3NfbGluZSkKKyAgICBlbHNlCisgICAgICBhc3NlcnQoZmFsc2UsICJFeGNlcHRpb24gbm90IHJhaXNlZCBmb3IgJyN7dG9fcmVuZGVyfSchIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXhjZXB0aW9uX2xvY2F0aW9uCisgICAgdG9fcmVuZGVyID0gPDxTQVNTCitydWxlCisgIHByb3A6IHZhbAorICAvLyBjb21tZW50IQorCisgIGJyb2tlbjoKK1NBU1MKKyAgICBiZWdpbgorICAgICAgU2Fzczo6RW5naW5lLm5ldyh0b19yZW5kZXIsIDpmaWxlbmFtZSA9PiBGQUtFX0ZJTEVfTkFNRSwgOmxpbmUgPT4gKF9fTElORV9fLTcpKS5yZW5kZXIKKyAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZXJyCisgICAgICBhc3NlcnRfZXF1YWwoRkFLRV9GSUxFX05BTUUsIGVyci5zYXNzX2ZpbGVuYW1lKQorICAgICAgYXNzZXJ0X2VxdWFsKChfX0xJTkVfXy02KSwgZXJyLnNhc3NfbGluZSkKKyAgICBlbHNlCisgICAgICBhc3NlcnQoZmFsc2UsICJFeGNlcHRpb24gbm90IHJhaXNlZCBmb3IgJyN7dG9fcmVuZGVyfSchIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0ZWRfZXhjZXB0aW9uCisgICAgWzEsIDIsIDMsIDRdLmVhY2ggZG8gfGl8CisgICAgICBiZWdpbgorICAgICAgICBTYXNzOjpFbmdpbmUubmV3KCJAaW1wb3J0IGJvcmsje2l9IiwgOmxvYWRfcGF0aHMgPT4gW0ZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3RlbXBsYXRlcy8nXSkucmVuZGVyCisgICAgICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZXJyCisgICAgICAgIGFzc2VydF9lcXVhbCgyLCBlcnIuc2Fzc19saW5lKQorICAgICAgICBhc3NlcnRfbWF0Y2goLyhcL3xeKWJvcmsje2l9XC5zYXNzJC8sIGVyci5zYXNzX2ZpbGVuYW1lKQorCisgICAgICAgIGFzc2VydF9oYXNoX2hhcyhlcnIuc2Fzc19iYWNrdHJhY2UuZmlyc3QsCisgICAgICAgICAgOmZpbGVuYW1lID0+IGVyci5zYXNzX2ZpbGVuYW1lLCA6bGluZSA9PiBlcnIuc2Fzc19saW5lKQorCisgICAgICAgIGFzc2VydF9uaWwoZXJyLnNhc3NfYmFja3RyYWNlWzFdWzpmaWxlbmFtZV0pCisgICAgICAgIGFzc2VydF9lcXVhbCgxLCBlcnIuc2Fzc19iYWNrdHJhY2VbMV1bOmxpbmVdKQorCisgICAgICAgIGFzc2VydF9tYXRjaCgvKFwvfF4pYm9yayN7aX1cLnNhc3M6MiQvLCBlcnIuYmFja3RyYWNlLmZpcnN0KQorICAgICAgICBhc3NlcnRfZXF1YWwoIihzYXNzKToxIiwgZXJyLmJhY2t0cmFjZVsxXSkKKyAgICAgIGVsc2UKKyAgICAgICAgYXNzZXJ0KGZhbHNlLCAiRXhjZXB0aW9uIG5vdCByYWlzZWQgZm9yIGltcG9ydGVkIHRlbXBsYXRlOiBib3JrI3tpfSIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZG91YmxlX2ltcG9ydGVkX2V4Y2VwdGlvbgorICAgIFsxLCAyLCAzLCA0XS5lYWNoIGRvIHxpfAorICAgICAgYmVnaW4KKyAgICAgICAgU2Fzczo6RW5naW5lLm5ldygiQGltcG9ydCBuZXN0ZWRfYm9yayN7aX0iLCA6bG9hZF9wYXRocyA9PiBbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVtcGxhdGVzLyddKS5yZW5kZXIKKyAgICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlcnIKKyAgICAgICAgYXNzZXJ0X2VxdWFsKDIsIGVyci5zYXNzX2xpbmUpCisgICAgICAgIGFzc2VydF9tYXRjaCgvKFwvfF4pYm9yayN7aX1cLnNhc3MkLywgZXJyLnNhc3NfZmlsZW5hbWUpCisKKyAgICAgICAgYXNzZXJ0X2hhc2hfaGFzKGVyci5zYXNzX2JhY2t0cmFjZS5maXJzdCwKKyAgICAgICAgICA6ZmlsZW5hbWUgPT4gZXJyLnNhc3NfZmlsZW5hbWUsIDpsaW5lID0+IGVyci5zYXNzX2xpbmUpCisKKyAgICAgICAgYXNzZXJ0X21hdGNoKC8oXC98XiluZXN0ZWRfYm9yayN7aX1cLnNhc3MkLywgZXJyLnNhc3NfYmFja3RyYWNlWzFdWzpmaWxlbmFtZV0pCisgICAgICAgIGFzc2VydF9lcXVhbCgyLCBlcnIuc2Fzc19iYWNrdHJhY2VbMV1bOmxpbmVdKQorCisgICAgICAgIGFzc2VydF9uaWwoZXJyLnNhc3NfYmFja3RyYWNlWzJdWzpmaWxlbmFtZV0pCisgICAgICAgIGFzc2VydF9lcXVhbCgxLCBlcnIuc2Fzc19iYWNrdHJhY2VbMl1bOmxpbmVdKQorCisgICAgICAgIGFzc2VydF9tYXRjaCgvKFwvfF4pYm9yayN7aX1cLnNhc3M6MiQvLCBlcnIuYmFja3RyYWNlLmZpcnN0KQorICAgICAgICBhc3NlcnRfbWF0Y2goLyhcL3xeKW5lc3RlZF9ib3JrI3tpfVwuc2FzczoyJC8sIGVyci5iYWNrdHJhY2VbMV0pCisgICAgICAgIGFzc2VydF9lcXVhbCgiKHNhc3MpOjEiLCBlcnIuYmFja3RyYWNlWzJdKQorICAgICAgZWxzZQorICAgICAgICBhc3NlcnQoZmFsc2UsICJFeGNlcHRpb24gbm90IHJhaXNlZCBmb3IgaW1wb3J0ZWQgdGVtcGxhdGU6IGJvcmsje2l9IikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl90cmFjaW5nCisgICAgYWN0dWFsX2NzcyA9IHJlbmRlcig8PC1TQ1NTLCA6c3ludGF4ID0+IDpzY3NzLCA6dHJhY2Vfc2VsZWN0b3JzID0+IHRydWUpCisgICAgICBAbWl4aW4gbWl4ZWQgeworICAgICAgICAubWl4ZWQgeyBjb2xvcjogcmVkOyB9CisgICAgICB9CisgICAgICAuY29udGV4dCB7CisgICAgICAgIEBpbmNsdWRlIG1peGVkOworICAgICAgfQorICAgIFNDU1MKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsYWN0dWFsX2NzcykKKy8qIG9uIGxpbmUgMiBvZiB0ZXN0X3NlbGVjdG9yX3RyYWNpbmdfaW5saW5lLnNjc3MsIGluIGBtaXhlZCcKKyAgIGZyb20gbGluZSA1IG9mIHRlc3Rfc2VsZWN0b3JfdHJhY2luZ19pbmxpbmUuc2NzcyAqLworLmNvbnRleHQgLm1peGVkIHsKKyAgY29sb3I6IHJlZDsgfQorQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2V4Y2VwdGlvbgorICAgIHJlbmRlcig8PFNBU1MpCis9ZXJyb3ItbWl4aW4oJGEpCisgIGNvbG9yOiAkYSAqIDFlbSAqIDFweAorCis9b3V0ZXItbWl4aW4oJGEpCisgICtlcnJvci1taXhpbigkYSkKKworLmVycm9yCisgICtvdXRlci1taXhpbigxMikKK1NBU1MKKyAgICBhc3NlcnQoZmFsc2UsICJFeGNlcHRpb24gbm90IHJhaXNlZCIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlcnIKKyAgICBhc3NlcnRfZXF1YWwoMiwgZXJyLnNhc3NfbGluZSkKKyAgICBhc3NlcnRfZXF1YWwoZmlsZW5hbWVfZm9yX3Rlc3QsIGVyci5zYXNzX2ZpbGVuYW1lKQorICAgIGFzc2VydF9lcXVhbCgiZXJyb3ItbWl4aW4iLCBlcnIuc2Fzc19taXhpbikKKworICAgIGFzc2VydF9oYXNoX2hhcyhlcnIuc2Fzc19iYWNrdHJhY2UuZmlyc3QsIDpsaW5lID0+IGVyci5zYXNzX2xpbmUsCisgICAgICA6ZmlsZW5hbWUgPT4gZXJyLnNhc3NfZmlsZW5hbWUsIDptaXhpbiA9PiBlcnIuc2Fzc19taXhpbikKKyAgICBhc3NlcnRfaGFzaF9oYXMoZXJyLnNhc3NfYmFja3RyYWNlWzFdLCA6bGluZSA9PiA1LAorICAgICAgOmZpbGVuYW1lID0+IGZpbGVuYW1lX2Zvcl90ZXN0LCA6bWl4aW4gPT4gIm91dGVyLW1peGluIikKKyAgICBhc3NlcnRfaGFzaF9oYXMoZXJyLnNhc3NfYmFja3RyYWNlWzJdLCA6bGluZSA9PiA4LAorICAgICAgOmZpbGVuYW1lID0+IGZpbGVuYW1lX2Zvcl90ZXN0LCA6bWl4aW4gPT4gbmlsKQorCisgICAgYXNzZXJ0X2VxdWFsKCIje2ZpbGVuYW1lX2Zvcl90ZXN0fToyOmluIGBlcnJvci1taXhpbiciLCBlcnIuYmFja3RyYWNlLmZpcnN0KQorICAgIGFzc2VydF9lcXVhbCgiI3tmaWxlbmFtZV9mb3JfdGVzdH06NTppbiBgb3V0ZXItbWl4aW4nIiwgZXJyLmJhY2t0cmFjZVsxXSkKKyAgICBhc3NlcnRfZXF1YWwoIiN7ZmlsZW5hbWVfZm9yX3Rlc3R9OjgiLCBlcnIuYmFja3RyYWNlWzJdKQorICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9jYWxsc2l0ZV9leGNlcHRpb24KKyAgICByZW5kZXIoPDxTQVNTKQorPW9uZS1hcmctbWl4aW4oJGEpCisgIGNvbG9yOiAkYQorCis9b3V0ZXItbWl4aW4oJGEpCisgICtvbmUtYXJnLW1peGluKCRhLCAxMikKKworLmVycm9yCisgICtvdXRlci1taXhpbigxMikKK1NBU1MKKyAgICBhc3NlcnQoZmFsc2UsICJFeGNlcHRpb24gbm90IHJhaXNlZCIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlcnIKKyAgICBhc3NlcnRfaGFzaF9oYXMoZXJyLnNhc3NfYmFja3RyYWNlLmZpcnN0LCA6bGluZSA9PiA1LAorICAgICAgOmZpbGVuYW1lID0+IGZpbGVuYW1lX2Zvcl90ZXN0LCA6bWl4aW4gPT4gIm9uZS1hcmctbWl4aW4iKQorICAgIGFzc2VydF9oYXNoX2hhcyhlcnIuc2Fzc19iYWNrdHJhY2VbMV0sIDpsaW5lID0+IDUsCisgICAgICA6ZmlsZW5hbWUgPT4gZmlsZW5hbWVfZm9yX3Rlc3QsIDptaXhpbiA9PiAib3V0ZXItbWl4aW4iKQorICAgIGFzc2VydF9oYXNoX2hhcyhlcnIuc2Fzc19iYWNrdHJhY2VbMl0sIDpsaW5lID0+IDgsCisgICAgICA6ZmlsZW5hbWUgPT4gZmlsZW5hbWVfZm9yX3Rlc3QsIDptaXhpbiA9PiBuaWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2V4Y2VwdGlvbl9jc3NpemUKKyAgICByZW5kZXIoPDxTQVNTKQorPXBhcmVudC1yZWYtbWl4aW4KKyAgJiBmb28KKyAgICBhOiBiCisKKz1vdXRlci1taXhpbgorICArcGFyZW50LXJlZi1taXhpbgorCisrb3V0ZXItbWl4aW4KK1NBU1MKKyAgICBhc3NlcnQoZmFsc2UsICJFeGNlcHRpb24gbm90IHJhaXNlZCIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlcnIKKyAgICBhc3NlcnRfaGFzaF9oYXMoZXJyLnNhc3NfYmFja3RyYWNlLmZpcnN0LCA6bGluZSA9PiAyLAorICAgICAgOmZpbGVuYW1lID0+IGZpbGVuYW1lX2Zvcl90ZXN0LCA6bWl4aW4gPT4gInBhcmVudC1yZWYtbWl4aW4iKQorICAgIGFzc2VydF9oYXNoX2hhcyhlcnIuc2Fzc19iYWNrdHJhY2VbMV0sIDpsaW5lID0+IDYsCisgICAgICA6ZmlsZW5hbWUgPT4gZmlsZW5hbWVfZm9yX3Rlc3QsIDptaXhpbiA9PiAib3V0ZXItbWl4aW4iKQorICAgIGFzc2VydF9oYXNoX2hhcyhlcnIuc2Fzc19iYWNrdHJhY2VbMl0sIDpsaW5lID0+IDgsCisgICAgICA6ZmlsZW5hbWUgPT4gZmlsZW5hbWVfZm9yX3Rlc3QsIDptaXhpbiA9PiBuaWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2FuZF9pbXBvcnRfZXhjZXB0aW9uCisgICAgU2Fzczo6RW5naW5lLm5ldygiQGltcG9ydCBuZXN0ZWRfbWl4aW5fYm9yayIsIDpsb2FkX3BhdGhzID0+IFtGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy90ZW1wbGF0ZXMvJ10pLnJlbmRlcgorICAgIGFzc2VydChmYWxzZSwgIkV4Y2VwdGlvbiBub3QgcmFpc2VkIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGVycgorICAgIGFzc2VydF9tYXRjaCgvKFwvfF4pbmVzdGVkX21peGluX2JvcmtcLnNhc3MkLywgZXJyLnNhc3NfYmFja3RyYWNlLmZpcnN0WzpmaWxlbmFtZV0pCisgICAgYXNzZXJ0X2hhc2hfaGFzKGVyci5zYXNzX2JhY2t0cmFjZS5maXJzdCwgOm1peGluID0+ICJlcnJvci1taXhpbiIsIDpsaW5lID0+IDQpCisKKyAgICBhc3NlcnRfbWF0Y2goLyhcL3xeKW1peGluX2JvcmtcLnNhc3MkLywgZXJyLnNhc3NfYmFja3RyYWNlWzFdWzpmaWxlbmFtZV0pCisgICAgYXNzZXJ0X2hhc2hfaGFzKGVyci5zYXNzX2JhY2t0cmFjZVsxXSwgOm1peGluID0+ICJvdXRlci1taXhpbiIsIDpsaW5lID0+IDIpCisKKyAgICBhc3NlcnRfbWF0Y2goLyhcL3xeKW1peGluX2JvcmtcLnNhc3MkLywgZXJyLnNhc3NfYmFja3RyYWNlWzJdWzpmaWxlbmFtZV0pCisgICAgYXNzZXJ0X2hhc2hfaGFzKGVyci5zYXNzX2JhY2t0cmFjZVsyXSwgOm1peGluID0+IG5pbCwgOmxpbmUgPT4gNSkKKworICAgIGFzc2VydF9tYXRjaCgvKFwvfF4pbmVzdGVkX21peGluX2JvcmtcLnNhc3MkLywgZXJyLnNhc3NfYmFja3RyYWNlWzNdWzpmaWxlbmFtZV0pCisgICAgYXNzZXJ0X2hhc2hfaGFzKGVyci5zYXNzX2JhY2t0cmFjZVszXSwgOm1peGluID0+IG5pbCwgOmxpbmUgPT4gNikKKworICAgIGFzc2VydF9oYXNoX2hhcyhlcnIuc2Fzc19iYWNrdHJhY2VbNF0sIDpmaWxlbmFtZSA9PiBuaWwsIDptaXhpbiA9PiBuaWwsIDpsaW5lID0+IDEpCisgIGVuZAorCisgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV9taXhpbgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy5mb28gLmJhciAuYmF6IHsKKyAgY29sb3I6IGJsdWU7IH0KKy5mb28gLmJhciAucXV4IHsKKyAgY29sb3I6IHJlZDsgfQorLmZvbyAuemFwIHsKKyAgY29sb3I6IGdyZWVuOyB9CitDU1MKK0BtaXhpbiBtYXAtdG8tcnVsZSgkbWFwLW9yLWNvbG9yKQorICBAaWYgdHlwZS1vZigkbWFwLW9yLWNvbG9yKSA9PSBtYXAKKyAgICBAZWFjaCAka2V5LCAkdmFsdWUgaW4gJG1hcC1vci1jb2xvcgorICAgICAgLlwjeyRrZXl9CisgICAgICAgIEBpbmNsdWRlIG1hcC10by1ydWxlKCR2YWx1ZSkKKyAgQGVsc2UKKyAgICBjb2xvcjogJG1hcC1vci1jb2xvcgorCitAaW5jbHVkZSBtYXAtdG8tcnVsZSgoZm9vOiAoYmFyOiAoYmF6OiBibHVlLCBxdXg6IHJlZCksIHphcDogZ3JlZW4pKSkKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZG91YmxlX2ltcG9ydF9sb29wX2V4Y2VwdGlvbgorICAgIGltcG9ydGVyID0gTW9ja0ltcG9ydGVyLm5ldworICAgIGltcG9ydGVyLmFkZF9pbXBvcnQoImZvbyIsICJAaW1wb3J0ICdiYXInIikKKyAgICBpbXBvcnRlci5hZGRfaW1wb3J0KCJiYXIiLCAiQGltcG9ydCAnZm9vJyIpCisKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KCdAaW1wb3J0ICJmb28iJywgOmZpbGVuYW1lID0+IGZpbGVuYW1lX2Zvcl90ZXN0LAorICAgICAgOmxvYWRfcGF0aHMgPT4gW2ltcG9ydGVyXSwgOmltcG9ydGVyID0+IGltcG9ydGVyKQorCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8RVJSLnJzdHJpcCkge2VuZ2luZS5yZW5kZXJ9CitBbiBAaW1wb3J0IGxvb3AgaGFzIGJlZW4gZm91bmQ6CisgICAgI3tmaWxlbmFtZV9mb3JfdGVzdH0gaW1wb3J0cyBmb28KKyAgICBmb28gaW1wb3J0cyBiYXIKKyAgICBiYXIgaW1wb3J0cyBmb28KK0VSUgorICBlbmQKKworICBkZWYgdGVzdF9kZWVwX2ltcG9ydF9sb29wX2V4Y2VwdGlvbgorICAgIGltcG9ydGVyID0gTW9ja0ltcG9ydGVyLm5ldworICAgIGltcG9ydGVyLmFkZF9pbXBvcnQoImZvbyIsICJAaW1wb3J0ICdiYXInIikKKyAgICBpbXBvcnRlci5hZGRfaW1wb3J0KCJiYXIiLCAiQGltcG9ydCAnYmF6JyIpCisgICAgaW1wb3J0ZXIuYWRkX2ltcG9ydCgiYmF6IiwgIkBpbXBvcnQgJ2ZvbyciKQorCisgICAgZW5naW5lID0gU2Fzczo6RW5naW5lLm5ldygnQGltcG9ydCAiZm9vIicsIDpmaWxlbmFtZSA9PiBmaWxlbmFtZV9mb3JfdGVzdCwKKyAgICAgIDpsb2FkX3BhdGhzID0+IFtpbXBvcnRlcl0sIDppbXBvcnRlciA9PiBpbXBvcnRlcikKKworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCA8PEVSUi5yc3RyaXApIHtlbmdpbmUucmVuZGVyfQorQW4gQGltcG9ydCBsb29wIGhhcyBiZWVuIGZvdW5kOgorICAgICN7ZmlsZW5hbWVfZm9yX3Rlc3R9IGltcG9ydHMgZm9vCisgICAgZm9vIGltcG9ydHMgYmFyCisgICAgYmFyIGltcG9ydHMgYmF6CisgICAgYmF6IGltcG9ydHMgZm9vCitFUlIKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXhjZXB0aW9uX2Nzc193aXRoX29mZnNldAorICAgIG9wdHMgPSB7OmZ1bGxfZXhjZXB0aW9uID0+IHRydWUsIDpsaW5lID0+IDM2Mn0KKyAgICByZW5kZXIoKCJhXG4gIGI6IGNcbiIgKiAxMCkgKyAiZFxuICBlOlxuIiArICgiZlxuICBnOiBoXG4iICogMTApLCBvcHRzKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgU2Fzczo6U3ludGF4RXJyb3IuZXhjZXB0aW9uX3RvX2NzcyhlLCBvcHRzWzpsaW5lXSkuc3BsaXQoIlxuIilbMC4uMTVdLmpvaW4oIlxuIikpCisvKgorRXJyb3I6IEludmFsaWQgcHJvcGVydHk6ICJlOiIgKG5vIHZhbHVlKS4KKyAgICAgICAgb24gbGluZSAzODMgb2YgdGVzdF9leGNlcHRpb25fY3NzX3dpdGhfb2Zmc2V0X2lubGluZS5zYXNzCisKKzM3ODogYQorMzc5OiAgIGI6IGMKKzM4MDogYQorMzgxOiAgIGI6IGMKKzM4MjogZAorMzgzOiAgIGU6CiszODQ6IGYKKzM4NTogICBnOiBoCiszODY6IGYKKzM4NzogICBnOiBoCiszODg6IGYKK0NTUworICBlbHNlCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhjZXB0aW9uIG5vdCByYWlzZWQgZm9yIHRlc3RfZXhjZXB0aW9uX2Nzc193aXRoX29mZnNldCIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4Y2VwdGlvbl9jc3Nfd2l0aF9taXhpbnMKKyAgICByZW5kZXIoPDxTQVNTLCA6ZnVsbF9leGNlcHRpb24gPT4gdHJ1ZSkKKz1lcnJvci1taXhpbigkYSkKKyAgY29sb3I6ICRhICogMWVtICogMXB4CisKKz1vdXRlci1taXhpbigkYSkKKyAgK2Vycm9yLW1peGluKCRhKQorCisuZXJyb3IKKyAgK291dGVyLW1peGluKDEyKQorU0FTUworICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgU2Fzczo6U3ludGF4RXJyb3IuZXhjZXB0aW9uX3RvX2NzcyhlKS5zcGxpdCgiXG4iKVswLi4xM10uam9pbigiXG4iKSkKKy8qCitFcnJvcjogMTJlbSpweCBpc24ndCBhIHZhbGlkIENTUyB2YWx1ZS4KKyAgICAgICAgb24gbGluZSAyIG9mIHRlc3RfZXhjZXB0aW9uX2Nzc193aXRoX21peGluc19pbmxpbmUuc2FzcywgaW4gYGVycm9yLW1peGluJworICAgICAgICBmcm9tIGxpbmUgNSBvZiB0ZXN0X2V4Y2VwdGlvbl9jc3Nfd2l0aF9taXhpbnNfaW5saW5lLnNhc3MsIGluIGBvdXRlci1taXhpbicKKyAgICAgICAgZnJvbSBsaW5lIDggb2YgdGVzdF9leGNlcHRpb25fY3NzX3dpdGhfbWl4aW5zX2lubGluZS5zYXNzCisKKzE6ID1lcnJvci1taXhpbigkYSkKKzI6ICAgY29sb3I6ICRhICogMWVtICogMXB4CiszOiAKKzQ6ID1vdXRlci1taXhpbigkYSkKKzU6ICAgK2Vycm9yLW1peGluKCRhKQorNjogCis3OiAuZXJyb3IKK0NTUworICBlbHNlCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhjZXB0aW9uIG5vdCByYWlzZWQiKQorICBlbmQKKworICBkZWYgdGVzdF9jc3NpemVfZXhjZXB0aW9uX2NzcworICAgIHJlbmRlcig8PFNBU1MsIDpmdWxsX2V4Y2VwdGlvbiA9PiB0cnVlKQorLmZpbGxlcgorICBzdHVmZjogInN0dWZmISIKKworYTogYgorCisubW9yZS5maWxsZXIKKyAgYTogYgorU0FTUworICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgU2Fzczo6U3ludGF4RXJyb3IuZXhjZXB0aW9uX3RvX2NzcyhlKS5zcGxpdCgiXG4iKVswLi4xMV0uam9pbigiXG4iKSkKKy8qCitFcnJvcjogUHJvcGVydGllcyBhcmUgb25seSBhbGxvd2VkIHdpdGhpbiBydWxlcywgZGlyZWN0aXZlcywgbWl4aW4gaW5jbHVkZXMsIG9yIG90aGVyIHByb3BlcnRpZXMuCisgICAgICAgIG9uIGxpbmUgNCBvZiB0ZXN0X2Nzc2l6ZV9leGNlcHRpb25fY3NzX2lubGluZS5zYXNzCisKKzE6IC5maWxsZXIKKzI6ICAgc3R1ZmY6ICJzdHVmZiEiCiszOiAKKzQ6IGE6IGIKKzU6IAorNjogLm1vcmUuZmlsbGVyCis3OiAgIGE6IGIKK0NTUworICBlbHNlCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhjZXB0aW9uIG5vdCByYWlzZWQiKQorICBlbmQKKworICBkZWYgdGVzdF9jc3NfaW1wb3J0CisgICAgYXNzZXJ0X2VxdWFsKCJAaW1wb3J0IHVybCguL2ZvbnRzLmNzcyk7XG4iLCByZW5kZXIoIkBpbXBvcnQgXCIuL2ZvbnRzLmNzc1wiIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2h0dHBfaW1wb3J0CisgICAgYXNzZXJ0X2VxdWFsKCJAaW1wb3J0IFwiaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2Fuc1wiO1xuIiwKKyAgICAgIHJlbmRlcigiQGltcG9ydCBcImh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnNcIiIpKQorICBlbmQKKworICBkZWYgdGVzdF9wcm90b2NvbF9yZWxhdGl2ZV9pbXBvcnQKKyAgICBhc3NlcnRfZXF1YWwoIkBpbXBvcnQgXCIvL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2Fuc1wiO1xuIiwKKyAgICAgIHJlbmRlcigiQGltcG9ydCBcIi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Ecm9pZCtTYW5zXCIiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0X3dpdGhfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCitAaW1wb3J0IHVybCgiaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2FucyIpOworQ1NTCiskZmFtaWx5OiB1bnF1b3RlKCJEcm9pZCtTYW5zIikKK0BpbXBvcnQgdXJsKCJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1cI3skZmFtaWx5fSIpCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF93aXRoX2R5bmFtaWNfbWVkaWFfcXVlcnkKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorQGltcG9ydCAiZm9vIiBwcmludCBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpby1mb286IDI1KTsKK0NTUworJG1lZGlhOiBwcmludAorJGtleTogLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvCiskdmFsdWU6IDIwCitAaW1wb3J0ICJmb28iIFwjeyRtZWRpYX0gYW5kICgka2V5ICsgIi1mb28iOiAkdmFsdWUgKyA1KQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF91cmxfaW1wb3J0CisgICAgYXNzZXJ0X2VxdWFsKCJAaW1wb3J0IHVybChmb250cy5zYXNzKTtcbiIsIHJlbmRlcigiQGltcG9ydCB1cmwoZm9udHMuc2FzcykiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2Fzc19pbXBvcnQKKyAgICBzYXNzY19maWxlID0gc2Fzc2NfcGF0aCgiaW1wb3J0ZWUiKQorICAgIGFzc2VydCAhRmlsZS5leGlzdD8oc2Fzc2NfZmlsZSkKKyAgICByZW5kZXJzX2NvcnJlY3RseSAiaW1wb3J0IiwgeyA6c3R5bGUgPT4gOmNvbXBhY3QsIDpsb2FkX3BhdGhzID0+IFtGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi90ZW1wbGF0ZXMiXSB9CisgICAgYXNzZXJ0IEZpbGUuZXhpc3Q/KHNhc3NjX2ZpbGUpCisgIGVuZAorCisgIGRlZiB0ZXN0X3Nhc3NfcGF0aG5hbWVfaW1wb3J0CisgICAgc2Fzc2NfZmlsZSA9IHNhc3NjX3BhdGgoImltcG9ydGVlIikKKyAgICBhc3NlcnQgIUZpbGUuZXhpc3Q/KHNhc3NjX2ZpbGUpCisgICAgcmVuZGVyc19jb3JyZWN0bHkoImltcG9ydCIsCisgICAgICA6c3R5bGUgPT4gOmNvbXBhY3QsCisgICAgICA6bG9hZF9wYXRocyA9PiBbUGF0aG5hbWUubmV3KEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiL3RlbXBsYXRlcyIpXSkKKyAgICBhc3NlcnQgRmlsZS5leGlzdD8oc2Fzc2NfZmlsZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0X2Zyb21fZ2xvYmFsX2xvYWRfcGF0aHMKKyAgICBpbXBvcnRlciA9IE1vY2tJbXBvcnRlci5uZXcKKyAgICBpbXBvcnRlci5hZGRfaW1wb3J0KCJpbXBvcnRlZCIsICJkaXZ7Y29sb3I6cmVkfSIpCisgICAgU2Fzcy5sb2FkX3BhdGhzIDw8IGltcG9ydGVyCisKKyAgICBhc3NlcnRfZXF1YWwgImRpdiB7XG4gIGNvbG9yOiByZWQ7IH1cbiIsIFNhc3M6OkVuZ2luZS5uZXcoJ0BpbXBvcnQgImltcG9ydGVkIicsIDppbXBvcnRlciA9PiBpbXBvcnRlcikucmVuZGVyCisgIGVuc3VyZQorICAgIFNhc3MubG9hZF9wYXRocy5jbGVhcgorICBlbmQKKworICBkZWYgdGVzdF9ub25leGlzdGVudF9pbXBvcnQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxFUlIucnN0cmlwKSBkbworRmlsZSB0byBpbXBvcnQgbm90IGZvdW5kIG9yIHVucmVhZGFibGU6IG5vbmV4aXN0ZW50LnNhc3MuCitFUlIKKyAgICAgIHJlbmRlcigiQGltcG9ydCBub25leGlzdGVudC5zYXNzIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9uZXhpc3RlbnRfZXh0ZW5zaW9ubGVzc19pbXBvcnQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxFUlIucnN0cmlwKSBkbworRmlsZSB0byBpbXBvcnQgbm90IGZvdW5kIG9yIHVucmVhZGFibGU6IG5vbmV4aXN0ZW50LgorRVJSCisgICAgICByZW5kZXIoIkBpbXBvcnQgbm9uZXhpc3RlbnQiKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9ub19jYWNoZQorICAgIGFzc2VydCAhRmlsZS5leGlzdD8oc2Fzc2NfcGF0aCgiaW1wb3J0ZWUiKSkKKyAgICByZW5kZXJzX2NvcnJlY3RseSgiaW1wb3J0IiwgeworICAgICAgICA6c3R5bGUgPT4gOmNvbXBhY3QsIDpjYWNoZSA9PiBmYWxzZSwKKyAgICAgICAgOmxvYWRfcGF0aHMgPT4gW0ZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiL3RlbXBsYXRlcyJdLAorICAgICAgfSkKKyAgICBhc3NlcnQgIUZpbGUuZXhpc3Q/KHNhc3NjX3BhdGgoImltcG9ydGVlIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF9pbl9ydWxlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6bG9hZF9wYXRocyA9PiBbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVtcGxhdGVzLyddKSkKKy5mb28gI2ZvbyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNiYWY7IH0KKworLmJhciB7CisgIGE6IGI7IH0KKyAgLmJhciAjZm9vIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmFmOyB9CitDU1MKKy5mb28KKyAgQGltcG9ydCBwYXJ0aWFsCisKKy5iYXIKKyAgYTogYgorICBAaW1wb3J0IHBhcnRpYWwKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5pdHMKKyAgICByZW5kZXJzX2NvcnJlY3RseSAidW5pdHMiCisgIGVuZAorCisgIGRlZiB0ZXN0X2RlZmF1bHRfZnVuY3Rpb24KKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorZm9vIHsKKyAgYmFyOiB1cmwoImZvby5wbmciKTsgfQorQ1NTCitmb28KKyAgYmFyOiB1cmwoImZvby5wbmciKQorU0FTUworICAgIGFzc2VydF9lcXVhbCgiZm9vIHtcbiAgYmFyOiB1cmwoKTsgfVxuIiwgcmVuZGVyKCJmb29cbiAgYmFyOiB1cmwoKVxuIikpOworICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmdfbWludXMKKyAgICBhc3NlcnRfZXF1YWwoImZvbyB7XG4gIGJhcjogYmF6LWJvb20tYmF0OyB9XG4iLCByZW5kZXIoJVF7Zm9vXG4gIGJhcjogYmF6LWJvb20tYmF0fSkpCisgICAgYXNzZXJ0X2VxdWFsKCJmb28ge1xuICBiYXI6IC1iYXotYm9vbTsgfVxuIiwgcmVuZGVyKCVRe2Zvb1xuICBiYXI6IC1iYXotYm9vbX0pKQorICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmdfZGl2CisgICAgYXNzZXJ0X2VxdWFsKCJmb28ge1xuICBiYXI6IGJhei9ib29tL2JhdDsgfVxuIiwgcmVuZGVyKCVRe2Zvb1xuICBiYXI6IGJhei9ib29tL2JhdH0pKQorICAgIGFzc2VydF9lcXVhbCgiZm9vIHtcbiAgYmFyOiAvYmF6L2Jvb207IH1cbiIsIHJlbmRlciglUXtmb29cbiAgYmFyOiAvYmF6L2Jvb219KSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYmFzaWNfbXVsdGlsaW5lX3NlbGVjdG9yCisgICAgYXNzZXJ0X2VxdWFsKCIjZm9vICNiYXIsXG4jYmF6ICNib29tIHtcbiAgZm9vOiBiYXI7IH1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiI2ZvbyAjYmFyLFxuI2JheiAjYm9vbVxuICBmb286IGJhciIpKQorICAgIGFzc2VydF9lcXVhbCgiI2ZvbyAjYmFyLFxuI2ZvbyAjYmF6IHtcbiAgZm9vOiBiYXI7IH1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiI2Zvb1xuICAjYmFyLFxuICAjYmF6XG4gICAgZm9vOiBiYXIiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiNmb28sXG4jYmFyIHtcbiAgZm9vOiBiYXI7IH1cbiAgI2ZvbyAjYmF6LFxuICAjYmFyICNiYXoge1xuICAgIGZvbzogYmFyOyB9XG4iLAorICAgICAgICAgICAgICAgICByZW5kZXIoIiNmb28sXG4jYmFyXG4gIGZvbzogYmFyXG4gICNiYXpcbiAgICBmb286IGJhciIpKQorICAgIGFzc2VydF9lcXVhbCgiI2ZvbyAjYmFyLCAjYmF6ICNib29tIHsgZm9vOiBiYXI7IH1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiI2ZvbyAjYmFyLFxuI2JheiAjYm9vbVxuICBmb286IGJhciIsIDpzdHlsZSA9PiA6Y29tcGFjdCkpCisgICAgICAgICAgICAgICAgIAorICAgIGFzc2VydF9lcXVhbCgiI2ZvbyAjYmFyLCNiYXogI2Jvb217Zm9vOmJhcn1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiI2ZvbyAjYmFyLFxuI2JheiAjYm9vbVxuICBmb286IGJhciIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCisKKyAgICBhc3NlcnRfZXF1YWwoIiNmb28gI2JhcixcbiNiYXogI2Jvb20ge1xuICBmb286IGJhcjsgfVxuIiwKKyAgICAgICAgICAgICAgICAgcmVuZGVyKCIjZm9vICNiYXIsLFxuLCNiYXogI2Jvb20sXG4gIGZvbzogYmFyIikpCisKKyAgICBhc3NlcnRfZXF1YWwoIiNiaXAgI2JvcCB7XG4gIGZvbzogYmFyOyB9XG4iLAorICAgICAgICAgICAgICAgICByZW5kZXIoIiNiaXAgI2JvcCwsICxcbiAgZm9vOiBiYXIiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcGxleF9tdWx0aWxpbmVfc2VsZWN0b3IKKyAgICByZW5kZXJzX2NvcnJlY3RseSAibXVsdGlsaW5lIgorICBlbmQKKworICBkZWYgdGVzdF9jb2xvbl9vbmx5CisgICAgYmVnaW4KKyAgICAgIHJlbmRlcigiYVxuICBiOiBjIiwgOnByb3BlcnR5X3N5bnRheCA9PiA6b2xkKQorICAgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgICBhc3NlcnRfZXF1YWwoIklsbGVnYWwgcHJvcGVydHkgc3ludGF4OiBjYW4ndCB1c2UgbmV3IHN5bnRheCB3aGVuIDpwcm9wZXJ0eV9zeW50YXggPT4gOm9sZCBpcyBzZXQuIiwKKyAgICAgICAgICAgICAgICAgICBlLm1lc3NhZ2UpCisgICAgICBhc3NlcnRfZXF1YWwoMiwgZS5zYXNzX2xpbmUpCisgICAgZWxzZQorICAgICAgYXNzZXJ0KGZhbHNlLCAiU3ludGF4RXJyb3Igbm90IHJhaXNlZCBmb3IgOnByb3BlcnR5X3N5bnRheCA9PiA6b2xkIikKKyAgICBlbmQKKworICAgIGJlZ2luCisgICAgICBzaWxlbmNlX3dhcm5pbmdzIHtyZW5kZXIoImFcbiAgOmIgYyIsIDpwcm9wZXJ0eV9zeW50YXggPT4gOm5ldyl9CisgICAgICBhc3NlcnRfZXF1YWwoMiwgZS5zYXNzX2xpbmUpCisgICAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICAgIGFzc2VydF9lcXVhbCgiSWxsZWdhbCBwcm9wZXJ0eSBzeW50YXg6IGNhbid0IHVzZSBvbGQgc3ludGF4IHdoZW4gOnByb3BlcnR5X3N5bnRheCA9PiA6bmV3IGlzIHNldC4iLAorICAgICAgICAgICAgICAgICAgIGUubWVzc2FnZSkKKyAgICBlbHNlCisgICAgICBhc3NlcnQoZmFsc2UsICJTeW50YXhFcnJvciBub3QgcmFpc2VkIGZvciA6cHJvcGVydHlfc3ludGF4ID0+IDpuZXciKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9wc2V1ZG9fZWxlbWVudHMKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorOjpmaXJzdC1saW5lIHsKKyAgc2l6ZTogMTBlbTsgfQorQ1NTCis6OmZpcnN0LWxpbmUKKyAgc2l6ZTogMTBlbQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9kaXJlY3RpdmUKKyAgICBhc3NlcnRfZXF1YWwoIkBhIGI7XG4iLCByZW5kZXIoIkBhIGIiKSkKKworICAgIGFzc2VydF9lcXVhbCgiQGEge1xuICBiOiBjOyB9XG4iLCByZW5kZXIoIkBhXG4gIGI6IGMiKSkKKyAgICBhc3NlcnRfZXF1YWwoIkBhIHsgYjogYzsgfVxuIiwgcmVuZGVyKCJAYVxuICBiOiBjIiwgOnN0eWxlID0+IDpjb21wYWN0KSkKKyAgICBhc3NlcnRfZXF1YWwoIkBhIHtcbiAgYjogYztcbn1cbiIsIHJlbmRlcigiQGFcbiAgYjogYyIsIDpzdHlsZSA9PiA6ZXhwYW5kZWQpKQorICAgIGFzc2VydF9lcXVhbCgiQGF7YjpjfVxuIiwgcmVuZGVyKCJAYVxuICBiOiBjIiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKSkKKworICAgIGFzc2VydF9lcXVhbCgiQGEge1xuICBiOiBjO1xuICBkOiBlOyB9XG4iLAorICAgICAgICAgICAgICAgICByZW5kZXIoIkBhXG4gIGI6IGNcbiAgZDogZSIpKQorICAgIGFzc2VydF9lcXVhbCgiQGEgeyBiOiBjOyBkOiBlOyB9XG4iLAorICAgICAgICAgICAgICAgICByZW5kZXIoIkBhXG4gIGI6IGNcbiAgZDogZSIsIDpzdHlsZSA9PiA6Y29tcGFjdCkpCisgICAgYXNzZXJ0X2VxdWFsKCJAYSB7XG4gIGI6IGM7XG4gIGQ6IGU7XG59XG4iLAorICAgICAgICAgICAgICAgICByZW5kZXIoIkBhXG4gIGI6IGNcbiAgZDogZSIsIDpzdHlsZSA9PiA6ZXhwYW5kZWQpKQorICAgIGFzc2VydF9lcXVhbCgiQGF7YjpjO2Q6ZX1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiQGFcbiAgYjogY1xuICBkOiBlIiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKSkKKworICAgIGFzc2VydF9lcXVhbCgiQGEge1xuICAjYiB7XG4gICAgYzogZDsgfSB9XG4iLAorICAgICAgICAgICAgICAgICByZW5kZXIoIkBhXG4gICNiXG4gICAgYzogZCIpKQorICAgIGFzc2VydF9lcXVhbCgiQGEgeyAjYiB7IGM6IGQ7IH0gfVxuIiwKKyAgICAgICAgICAgICAgICAgcmVuZGVyKCJAYVxuICAjYlxuICAgIGM6IGQiLCA6c3R5bGUgPT4gOmNvbXBhY3QpKQorICAgIGFzc2VydF9lcXVhbCgiQGEge1xuICAjYiB7XG4gICAgYzogZDtcbiAgfVxufVxuIiwKKyAgICAgICAgICAgICAgICAgcmVuZGVyKCJAYVxuICAjYlxuICAgIGM6IGQiLCA6c3R5bGUgPT4gOmV4cGFuZGVkKSkKKyAgICBhc3NlcnRfZXF1YWwoIkBheyNie2M6ZH19XG4iLAorICAgICAgICAgICAgICAgICByZW5kZXIoIkBhXG4gICNiXG4gICAgYzogZCIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCisKKyAgICBhc3NlcnRfZXF1YWwoIkBhIHtcbiAgI2Ige1xuICAgIGE6IGI7IH1cbiAgICAjYiAjYyB7XG4gICAgICBkOiBlOyB9IH1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiQGFcbiAgI2JcbiAgICBhOiBiXG4gICAgI2NcbiAgICAgIGQ6IGUiKSkKKyAgICBhc3NlcnRfZXF1YWwoIkBhIHsgI2IgeyBhOiBiOyB9XG4gICNiICNjIHsgZDogZTsgfSB9XG4iLAorICAgICAgICAgICAgICAgICByZW5kZXIoIkBhXG4gICNiXG4gICAgYTogYlxuICAgICNjXG4gICAgICBkOiBlIiwgOnN0eWxlID0+IDpjb21wYWN0KSkKKyAgICBhc3NlcnRfZXF1YWwoIkBhIHtcbiAgI2Ige1xuICAgIGE6IGI7XG4gIH1cbiAgI2IgI2Mge1xuICAgIGQ6IGU7XG4gIH1cbn1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiQGFcbiAgI2JcbiAgICBhOiBiXG4gICAgI2NcbiAgICAgIGQ6IGUiLCA6c3R5bGUgPT4gOmV4cGFuZGVkKSkKKyAgICBhc3NlcnRfZXF1YWwoIkBheyNie2E6Yn0jYiAjY3tkOmV9fVxuIiwKKyAgICAgICAgICAgICAgICAgcmVuZGVyKCJAYVxuICAjYlxuICAgIGE6IGJcbiAgICAjY1xuICAgICAgZDogZSIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgIAorICAgIGFzc2VydF9lcXVhbCgiQGEge1xuICAjZm9vLFxuICAjYmFyIHtcbiAgICBiOiBjOyB9IH1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiQGFcbiAgI2ZvbywgXG4gICNiYXJcbiAgICBiOiBjIikpCisgICAgYXNzZXJ0X2VxdWFsKCJAYSB7ICNmb28sICNiYXIgeyBiOiBjOyB9IH1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiQGFcbiAgI2ZvbywgXG4gICNiYXJcbiAgICBiOiBjIiwgOnN0eWxlID0+IDpjb21wYWN0KSkKKyAgICBhc3NlcnRfZXF1YWwoIkBhIHtcbiAgI2ZvbyxcbiAgI2JhciB7XG4gICAgYjogYztcbiAgfVxufVxuIiwKKyAgICAgICAgICAgICAgICAgcmVuZGVyKCJAYVxuICAjZm9vLCBcbiAgI2JhclxuICAgIGI6IGMiLCA6c3R5bGUgPT4gOmV4cGFuZGVkKSkKKyAgICBhc3NlcnRfZXF1YWwoIkBheyNmb28sI2JhcntiOmN9fVxuIiwKKyAgICAgICAgICAgICAgICAgcmVuZGVyKCJAYVxuICAjZm9vLCBcbiAgI2JhclxuICAgIGI6IGMiLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpKQorCisgICAgdG9fcmVuZGVyID0gPDxFTkQKK0BhCisgIGI6IGMKKyAgI2QKKyAgICBlOiBmCisgIGc6IGgKK0VORAorICAgIHJlbmRlcmVkID0gPDxFTkQKK0BhIHsgYjogYzsKKyAgI2QgeyBlOiBmOyB9CisgIGc6IGg7IH0KK0VORAorICAgIGFzc2VydF9lcXVhbChyZW5kZXJlZCwgcmVuZGVyKHRvX3JlbmRlciwgOnN0eWxlID0+IDpjb21wYWN0KSkKKyAgICAKKyAgICBhc3NlcnRfZXF1YWwoIkBhe2I6YzsjZHtlOmZ9ZzpofVxuIiwgcmVuZGVyKHRvX3JlbmRlciwgOnN0eWxlID0+IDpjb21wcmVzc2VkKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHJvcGVydHlfaGFja3MKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorZm9vIHsKKyAgX25hbWU6IHZhbDsKKyAgKm5hbWU6IHZhbDsKKyAgI25hbWU6IHZhbDsKKyAgLm5hbWU6IHZhbDsKKyAgbmFtZS8qKi86IHZhbDsKKyAgbmFtZS8qXFwqKi86IHZhbDsKKyAgbmFtZTogdmFsOyB9CitDU1MKK2ZvbworICBfbmFtZTogdmFsCisgICpuYW1lOiB2YWwKKyAgI25hbWU6IHZhbAorICAubmFtZTogdmFsCisgIG5hbWUvKiovOiB2YWwKKyAgbmFtZS8qXFwqKi86IHZhbAorICBuYW1lOiB2YWwKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHJvcGVydGllc193aXRoX3NwYWNlX2FmdGVyX2NvbG9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorZm9vIHsKKyAgYmFyOiBiYXo7CisgIGJpeno6IGJhcDsgfQorQ1NTCitmb28KKyAgYmFyIDogYmF6CisgIGJpenoJOiBiYXAKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGluZV9hbm5vdGF0aW9ucworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUywgOmxpbmVfY29tbWVudHMgPT4gdHJ1ZSwgOnN0eWxlID0+IDpjb21wYWN0KSkKKy8qIGxpbmUgMiwgdGVzdF9saW5lX2Fubm90YXRpb25zX2lubGluZS5zYXNzICovCitmb28gYmFyIHsgZm9vOiBiYXI7IH0KKy8qIGxpbmUgNSwgdGVzdF9saW5lX2Fubm90YXRpb25zX2lubGluZS5zYXNzICovCitmb28gYmF6IHsgYmxpcDogYmxvcDsgfQorCisvKiBsaW5lIDksIHRlc3RfbGluZV9hbm5vdGF0aW9uc19pbmxpbmUuc2FzcyAqLworZmxvb2RsZSB7IGZsb3A6IGJsb3A7IH0KKworLyogbGluZSAxOCwgdGVzdF9saW5lX2Fubm90YXRpb25zX2lubGluZS5zYXNzICovCitidXAgeyBtaXg6IG9uOyB9CisvKiBsaW5lIDE1LCB0ZXN0X2xpbmVfYW5ub3RhdGlvbnNfaW5saW5lLnNhc3MgKi8KK2J1cCBtaXhpbiB7IG1vb3A6IG11cDsgfQorCisvKiBsaW5lIDIyLCB0ZXN0X2xpbmVfYW5ub3RhdGlvbnNfaW5saW5lLnNhc3MgKi8KK2JpcCBob3AsIHNraXAgaG9wIHsgYTogYjsgfQorQ1NTCitmb28KKyAgYmFyCisgICAgZm9vOiBiYXIKKworICBiYXoKKyAgICBibGlwOiBibG9wCisKKworZmxvb2RsZQorCisgIGZsb3A6IGJsb3AKKworPW14bgorICBtaXg6IG9uCisgIG1peGluCisgICAgbW9vcDogbXVwCisKK2J1cAorICArbXhuCisKK2JpcCwgc2tpcAorICBob3AKKyAgICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpbmVfYW5ub3RhdGlvbnNfd2l0aF9maWxlbmFtZQorICAgIHJlbmRlcnNfY29ycmVjdGx5ICJsaW5lX251bWJlcnMiLCA6bGluZV9jb21tZW50cyA9PiB0cnVlLCA6bG9hZF9wYXRocyA9PiBbRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvdGVtcGxhdGVzIl0KKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVidWdfaW5mbworICAgIGVzY19maWxlX25hbWUgPSBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQoU2Fzczo6VXRpbC5zY29wZSgidGVzdF9kZWJ1Z19pbmZvX2lubGluZS5zYXNzIikpCisKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpkZWJ1Z19pbmZvID0+IHRydWUsIDpzdHlsZSA9PiA6Y29tcGFjdCkpCitAbWVkaWEgLXNhc3MtZGVidWctaW5mb3tmaWxlbmFtZXtmb250LWZhbWlseTpmaWxlXFw6XFwvXFwvI3tlc2NfZmlsZV9uYW1lfX1saW5le2ZvbnQtZmFtaWx5OlxcMDAwMDMyfX0KK2ZvbyBiYXIgeyBmb286IGJhcjsgfQorQG1lZGlhIC1zYXNzLWRlYnVnLWluZm97ZmlsZW5hbWV7Zm9udC1mYW1pbHk6ZmlsZVxcOlxcL1xcLyN7ZXNjX2ZpbGVfbmFtZX19bGluZXtmb250LWZhbWlseTpcXDAwMDAzNX19Citmb28gYmF6IHsgYmxpcDogYmxvcDsgfQorCitAbWVkaWEgLXNhc3MtZGVidWctaW5mb3tmaWxlbmFtZXtmb250LWZhbWlseTpmaWxlXFw6XFwvXFwvI3tlc2NfZmlsZV9uYW1lfX1saW5le2ZvbnQtZmFtaWx5OlxcMDAwMDM5fX0KK2Zsb29kbGUgeyBmbG9wOiBibG9wOyB9CisKK0BtZWRpYSAtc2Fzcy1kZWJ1Zy1pbmZve2ZpbGVuYW1le2ZvbnQtZmFtaWx5OmZpbGVcXDpcXC9cXC8je2VzY19maWxlX25hbWV9fWxpbmV7Zm9udC1mYW1pbHk6XFwwMDAwMzE4fX0KK2J1cCB7IG1peDogb247IH0KK0BtZWRpYSAtc2Fzcy1kZWJ1Zy1pbmZve2ZpbGVuYW1le2ZvbnQtZmFtaWx5OmZpbGVcXDpcXC9cXC8je2VzY19maWxlX25hbWV9fWxpbmV7Zm9udC1mYW1pbHk6XFwwMDAwMzE1fX0KK2J1cCBtaXhpbiB7IG1vb3A6IG11cDsgfQorCitAbWVkaWEgLXNhc3MtZGVidWctaW5mb3tmaWxlbmFtZXtmb250LWZhbWlseTpmaWxlXFw6XFwvXFwvI3tlc2NfZmlsZV9uYW1lfX1saW5le2ZvbnQtZmFtaWx5OlxcMDAwMDMyMn19CitiaXAgaG9wLCBza2lwIGhvcCB7IGE6IGI7IH0KK0NTUworZm9vCisgIGJhcgorICAgIGZvbzogYmFyCisKKyAgYmF6CisgICAgYmxpcDogYmxvcAorCisKK2Zsb29kbGUKKworICBmbG9wOiBibG9wCisKKz1teG4KKyAgbWl4OiBvbgorICBtaXhpbgorICAgIG1vb3A6IG11cAorCitidXAKKyAgK214bgorCitiaXAsIHNraXAKKyAgaG9wCisgICAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9kZWJ1Z19pbmZvX3dpdGhvdXRfZmlsZW5hbWUKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIFNhc3M6OkVuZ2luZS5uZXcoPDxTQVNTLCA6ZGVidWdfaW5mbyA9PiB0cnVlKS5yZW5kZXIpCitAbWVkaWEgLXNhc3MtZGVidWctaW5mb3tmaWxlbmFtZXt9bGluZXtmb250LWZhbWlseTpcXDAwMDAzMX19Citmb28geworICBhOiBiOyB9CitDU1MKK2ZvbworICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RlYnVnX2luZm9fd2l0aF9jb21wcmVzc2VkCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6ZGVidWdfaW5mbyA9PiB0cnVlLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpKQorZm9ve2E6Yn0KK0NTUworZm9vCisgIGE6IGIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVidWdfaW5mb193aXRoX2xpbmVfYW5ub3RhdGlvbnMKKyAgICBlc2NfZmlsZV9uYW1lID0gU2Fzczo6U0NTUzo6UlguZXNjYXBlX2lkZW50KFNhc3M6OlV0aWwuc2NvcGUoInRlc3RfZGVidWdfaW5mb193aXRoX2xpbmVfYW5ub3RhdGlvbnNfaW5saW5lLnNhc3MiKSkKKworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUywgOmRlYnVnX2luZm8gPT4gdHJ1ZSwgOmxpbmVfY29tbWVudHMgPT4gdHJ1ZSkpCitAbWVkaWEgLXNhc3MtZGVidWctaW5mb3tmaWxlbmFtZXtmb250LWZhbWlseTpmaWxlXFw6XFwvXFwvI3tlc2NfZmlsZV9uYW1lfX1saW5le2ZvbnQtZmFtaWx5OlxcMDAwMDMxfX0KK2ZvbyB7CisgIGE6IGI7IH0KK0NTUworZm9vCisgIGE6IGIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVidWdfaW5mb19pbl9rZXlmcmFtZXMKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpkZWJ1Z19pbmZvID0+IHRydWUpKQorQC13ZWJraXQta2V5ZnJhbWVzIHdhcm0geworICBmcm9tIHsKKyAgICBjb2xvcjogYmxhY2s7IH0KKyAgdG8geworICAgIGNvbG9yOiByZWQ7IH0gfQorQ1NTCitALXdlYmtpdC1rZXlmcmFtZXMgd2FybQorICBmcm9tCisgICAgY29sb3I6IGJsYWNrCisgIHRvCisgICAgY29sb3I6IHJlZAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9maXJzdF9saW5lCisgICAgYXNzZXJ0X2VxdWFsKCIjYSB7XG4gIGI6IGM7IH1cbiIsIHJlbmRlcigiI2FcblxuICBiOiBjIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2VzY2FwZWRfcnVsZQorICAgIGFzc2VydF9lcXVhbCgiOmZvY3VzIHtcbiAgYTogYjsgfVxuIiwgcmVuZGVyKCJcXDpmb2N1c1xuICBhOiBiIikpCisgICAgYXNzZXJ0X2VxdWFsKCJhIHtcbiAgYjogYzsgfVxuICBhIDpmb2N1cyB7XG4gICAgZDogZTsgfVxuIiwgcmVuZGVyKCJcXGFcbiAgYjogY1xuICBcXDpmb2N1c1xuICAgIGQ6IGUiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3JfbmV3bGluZQorICAgIGFzc2VydF9lcXVhbCgiZm9vIHtcbiAgYTogYjtcbiAgYzogZDtcbiAgZTogZjsgfVxuIiwgcmVuZGVyKCJmb29cciAgYTogYlxyXG4gIGM6IGRcblxyICBlOiBmIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb3BlcnR5X3dpdGhfY29udGVudF9hbmRfbmVzdGVkX3Byb3BzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2ZvbyB7CisgIGE6IGI7CisgICAgYS1jOiBkOworICAgICAgYS1jLWU6IGY7IH0KK0NTUworZm9vCisgIGE6IGIKKyAgICBjOiBkCisgICAgICBlOiBmCitTQVNTCisKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorZm9vIHsKKyAgYTogYjsKKyAgICBhLWMtZTogZjsgfQorQ1NTCitmb28KKyAgYTogYgorICAgIGM6CisgICAgICBlOiBmCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2d1YXJkZWRfYXNzaWduCisgICAgYXNzZXJ0X2VxdWFsKCJmb28ge1xuICBhOiBiOyB9XG4iLCByZW5kZXIoJVF7JGZvbzogYlxuJGZvbzogYyAhZGVmYXVsdFxuZm9vXG4gIGE6ICRmb299KSkKKyAgICBhc3NlcnRfZXF1YWwoImZvbyB7XG4gIGE6IGI7IH1cbiIsIHJlbmRlciglUXskZm9vOiBiICFkZWZhdWx0XG5mb29cbiAgYTogJGZvb30pKQorICAgIGFzc2VydF9lcXVhbCgiZm9vIHtcbiAgYTogYjsgfVxuIiwgcmVuZGVyKCVReyRmb286IG51bGxcbiRmb286IGIgIWRlZmF1bHRcbmZvb1xuICBhOiAkZm9vfSkpCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbWl4aW5zCisgICAgcmVuZGVyc19jb3JyZWN0bHkgIm1peGlucyIsIHsgOnN0eWxlID0+IDpleHBhbmRlZCB9CisgIGVuZAorCisgIGRlZiB0ZXN0X2RpcmVjdGl2ZV9zdHlsZV9taXhpbnMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitiYXIgeworICBwcm9wOiBiYXo7IH0KK0NTUworQG1peGluIGZvbygkYXJnKQorICBwcm9wOiAkYXJnCisKK2JhcgorICBAaW5jbHVkZSBmb28oYmF6KQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbnNfZG9udF9pbnRlcmZlcmVfd2l0aF9zaWJsaW5nX2NvbWJpbmF0b3IKKyAgICBhc3NlcnRfZXF1YWwoImZvbyArIGJhciB7XG4gIGE6IGI7IH1cbmZvbyArIGJheiB7XG4gIGM6IGQ7IH1cbiIsCisgICAgICAgICAgICAgICAgIHJlbmRlcigiZm9vXG4gICtcbiAgICBiYXJcbiAgICAgIGE6IGJcbiAgICBiYXpcbiAgICAgIGM6IGQiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fYXJncworICAgIGFzc2VydF9lcXVhbCgiYmxhdCB7XG4gIGJhejogaGk7IH1cbiIsIHJlbmRlcig8PFNBU1MpKQorPWZvbygkYmFyKQorICBiYXo6ICRiYXIKK2JsYXQKKyAgK2ZvbyhoaSkKK1NBU1MKKyAgICBhc3NlcnRfZXF1YWwoImJsYXQge1xuICBiYXo6IDM7IH1cbiIsIHJlbmRlcig8PFNBU1MpKQorPWZvbygkYSwgJGIpCisgIGJhejogJGEgKyAkYgorYmxhdAorICArZm9vKDEsIDIpCitTQVNTCisgICAgYXNzZXJ0X2VxdWFsKCJibGF0IHtcbiAgYmF6OiA0O1xuICBiYXo6IDM7XG4gIGJhejogNTtcbiAgYmFuZzogMzsgfVxuIiwgcmVuZGVyKDw8U0FTUykpCis9Zm9vKCRjOiAoNiArIDQpIC8gMikKKyAgYmF6OiAkYworJGM6IDMKK2JsYXQKKyAgK2ZvbygkYyArIDEpCisgICtmb28oKCRjICsgMykvMikKKyAgK2ZvbworICBiYW5nOiAkYworU0FTUworICBlbmQKKworICBkZWYgdGVzdF9kZWZhdWx0X3ZhbHVlc19mb3JfbWl4aW5fYXJndW1lbnRzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK3doaXRlIHsKKyAgY29sb3I6ICNGRkY7IH0KKworYmxhY2sgeworICBjb2xvcjogIzAwMDsgfQorQ1NTCis9Zm9vKCRhOiAjRkZGKQorICBjb2xvcjogJGEKK3doaXRlCisgICtmb28KK2JsYWNrCisgICtmb28oIzAwMCkKK1NBU1MKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorb25lIHsKKyAgY29sb3I6ICNmZmY7CisgIHBhZGRpbmc6IDFweDsKKyAgbWFyZ2luOiA0cHg7IH0KKwordHdvIHsKKyAgY29sb3I6ICNmZmY7CisgIHBhZGRpbmc6IDJweDsKKyAgbWFyZ2luOiA1cHg7IH0KKwordGhyZWUgeworICBjb2xvcjogI2ZmZjsKKyAgcGFkZGluZzogMnB4OworICBtYXJnaW46IDNweDsgfQorQ1NTCiskYTogNXB4Cis9Zm9vKCRhLCAkYjogMXB4LCAkYzogM3B4ICsgJGIpCisgIGNvbG9yOiAkYQorICBwYWRkaW5nOiAkYgorICBtYXJnaW46ICRjCitvbmUKKyAgK2ZvbygjZmZmKQordHdvCisgICtmb28oI2ZmZiwgMnB4KQordGhyZWUKKyAgK2ZvbygjZmZmLCAycHgsIDNweCkKK1NBU1MKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorb25lIHsKKyAgY29sb3I6ICNmZmY7CisgIHBhZGRpbmc6IDFweDsKKyAgbWFyZ2luOiA0cHg7IH0KKwordHdvIHsKKyAgY29sb3I6ICNmZmY7CisgIHBhZGRpbmc6IDJweDsKKyAgbWFyZ2luOiA1cHg7IH0KKwordGhyZWUgeworICBjb2xvcjogI2ZmZjsKKyAgcGFkZGluZzogMnB4OworICBtYXJnaW46IDNweDsgfQorQ1NTCiskYTogNXB4Cis9Zm9vKCRhLCAkYjogMXB4LCAkYzogbnVsbCkKKyAgJGM6IDNweCArICRiICFkZWZhdWx0CisgIGNvbG9yOiAkYQorICBwYWRkaW5nOiAkYgorICBtYXJnaW46ICRjCitvbmUKKyAgK2ZvbygjZmZmKQordHdvCisgICtmb28oI2ZmZiwgMnB4KQordGhyZWUKKyAgK2ZvbygjZmZmLCAycHgsIDNweCkKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaHlwaGVuX3VuZGVyc2NvcmVfaW5zZW5zaXRpdmVfbWl4aW5zCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2EgeworICBiOiAxMjsKKyAgYzogZm9vOyB9CitDU1MKKz1taXhpbi1oeXBoZW4KKyAgYjogMTIKKworPW1peGluX3VuZGVyCisgIGM6IGZvbworCithCisgICttaXhpbl9oeXBoZW4KKyAgK21peGluLXVuZGVyCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Nzc19pZGVudGlmaWVyX21peGluCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2EgeworICBmb286IDEyOyB9CitDU1MKKz1cXHtmb29cXCgxMlxcKSgkYSkKKyAgZm9vOiAkYQorCithCisgICtcXHtmb29cXCgxMlxcKSgxMikKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYmFzaWNfZnVuY3Rpb24KKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorYmFyIHsKKyAgYTogMzsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCkKKyAgQHJldHVybiAxICsgMgorCitiYXIKKyAgYTogZm9vKCkKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fYXJncworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCitiYXIgeworICBhOiAzOyB9CitDU1MKK0BmdW5jdGlvbiBwbHVzKCR2YXIxLCAkdmFyMikKKyAgQHJldHVybiAkdmFyMSArICR2YXIyCisKK2JhcgorICBhOiBwbHVzKDEsIDIpCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX2FyZ19kZWZhdWx0CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2JhciB7CisgIGE6IDM7IH0KK0NTUworQGZ1bmN0aW9uIHBsdXMoJHZhcjEsICR2YXIyOiAyKQorICBAcmV0dXJuICR2YXIxICsgJHZhcjIKKworYmFyCisgIGE6IHBsdXMoMSkKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fYXJnX2tleXdvcmQKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorYmFyIHsKKyAgYTogMWJhcjsgfQorQ1NTCitAZnVuY3Rpb24gcGx1cygkdmFyMTogMSwgJHZhcjI6IDIpCisgIEByZXR1cm4gJHZhcjEgKyAkdmFyMgorCitiYXIKKyAgYTogcGx1cygkdmFyMjogYmFyKQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl93aXRoX21pc3NpbmdfYXJndW1lbnQKKyAgICByZW5kZXIoPDxTQVNTKQorQGZ1bmN0aW9uIHBsdXMoJHZhcjEsICR2YXIyKQorICBAcmV0dXJuICR2YXIxICsgJHZhcjIKKworYmFyCisgIGE6IHBsdXMoJHZhcjI6IGJhcikKK1NBU1MKKyAgICBmbHVuaygiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwoIkZ1bmN0aW9uIHBsdXMgaXMgbWlzc2luZyBhcmd1bWVudCAkdmFyMS4iLCBlLm1lc3NhZ2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3dpdGhfZXh0cmFfYXJndW1lbnQKKyAgICByZW5kZXIoPDxTQVNTKQorQGZ1bmN0aW9uIHBsdXMoJHZhcjEsICR2YXIyKQorICBAcmV0dXJuICR2YXIxICsgJHZhcjIKKworYmFyCisgIGE6IHBsdXMoJHZhcjE6IGZvbywgJHZhcjI6IGJhciwgJHZhcjM6IGJheikKK1NBU1MKKyAgICBmbHVuaygiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwoIkZ1bmN0aW9uIHBsdXMgZG9lc24ndCBoYXZlIGFuIGFyZ3VtZW50IG5hbWVkICR2YXIzLiIsIGUubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fd2l0aF9wb3NpdGlvbmFsX2FuZF9rZXl3b3JkX2FyZ3VtZW50CisgICAgcmVuZGVyKDw8U0FTUykKK0BmdW5jdGlvbiBwbHVzKCR2YXIxLCAkdmFyMikKKyAgQHJldHVybiAkdmFyMSArICR2YXIyCisKK2JhcgorICBhOiBwbHVzKGZvbywgYmFyLCAkdmFyMjogYmF6KQorU0FTUworICAgIGZsdW5rKCJFeHBlY3RlZCBleGNlcHRpb24iKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCgiRnVuY3Rpb24gcGx1cyB3YXMgcGFzc2VkIGFyZ3VtZW50ICR2YXIyIGJvdGggYnkgcG9zaXRpb24gYW5kIGJ5IG5hbWUuIiwgZS5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl93aXRoX2tleXdvcmRfYmVmb3JlX3Bvc2l0aW9uYWxfYXJndW1lbnQKKyAgICByZW5kZXIoPDxTQVNTKQorQGZ1bmN0aW9uIHBsdXMoJHZhcjEsICR2YXIyKQorICBAcmV0dXJuICR2YXIxICsgJHZhcjIKKworYmFyCisgIGE6IHBsdXMoJHZhcjI6IGZvbywgYmFyKQorU0FTUworICAgIGZsdW5rKCJFeHBlY3RlZCBleGNlcHRpb24iKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCgiUG9zaXRpb25hbCBhcmd1bWVudHMgbXVzdCBjb21lIGJlZm9yZSBrZXl3b3JkIGFyZ3VtZW50cy4iLCBlLm1lc3NhZ2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3dpdGhfaWYKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorYmFyIHsKKyAgYTogZm9vOworICBiOiBiYXI7IH0KK0NTUworQGZ1bmN0aW9uIG15LWlmKCRjb25kLCAkdmFsMSwgJHZhbDIpCisgIEBpZiAkY29uZAorICAgIEByZXR1cm4gJHZhbDEKKyAgQGVsc2UKKyAgICBAcmV0dXJuICR2YWwyCisKK2JhcgorICBhOiBteS1pZih0cnVlLCBmb28sIGJhcikKKyAgYjogbXktaWYoZmFsc2UsIGZvbywgYmFyKQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl93aXRoX3ZhcgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCitiYXIgeworICBhOiAxOyB9CitDU1MKK0BmdW5jdGlvbiBmb28oJHZhbDEsICR2YWwyKQorICAkaW50ZXJtZWRpYXRlOiAkdmFsMSArICR2YWwyCisgIEByZXR1cm4gJGludGVybWVkaWF0ZS8zCisKK2JhcgorICBhOiBmb28oMSwgMikKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uX3ZhcmlhYmxlX3Njb3BlCisgICAgcmVuZGVyKDw8U0FTUykKK2JhcgorICAtbm8tb3A6IHNldC1hLXZhcmlhYmxlKHZhcmlhYmxlLCA1KQorICBhOiAkdmFyaWFibGUKK1NBU1MKKyAgICBmbHVuaygiRXhjZXB0aW9uIG5vdCByYWlzZWQgZm9yIHRlc3RfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uX3ZhcmlhYmxlX3Njb3BlIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwoJ1VuZGVmaW5lZCB2YXJpYWJsZTogIiR2YXJpYWJsZSIuJywgZS5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF91c2VyX2RlZmluZWRfZnVuY3Rpb25fY2FuX2NoYW5nZV9nbG9iYWxfdmFyaWFibGUKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorYmFyIHsKKyAgYTogNTsgfQorQ1NTCiskdmFyaWFibGU6IDAKK2JhcgorICAkbG9jYWw6IDEwCisgIC1uby1vcDogc2V0LWEtZ2xvYmFsLXZhcmlhYmxlKHZhcmlhYmxlLCA1KQorICBhOiAkdmFyaWFibGUKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uX2Nhbm5vdF9yZWFkX2xvY2FsX3ZhcmlhYmxlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2JhciB7CisgIGdsb2JhbDogMDsKKyAgbG9jYWw6IHVuZGVmaW5lZDsgfQorQ1NTCiskZ2xvYmFsOiAwCitiYXIKKyAgJGxvY2FsOiAxMAorICBnbG9iYWw6IGdldC1hLXZhcmlhYmxlKGdsb2JhbCkKKyAgbG9jYWw6IGdldC1hLXZhcmlhYmxlKGxvY2FsKQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jb250cm9sX2RpcmVjdGl2ZV9pbl9uZXN0ZWRfcHJvcGVydHkKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorZm9vIHsKKyAgYS1iOiBjOyB9CitDU1MKK2ZvbworICBhOgorICAgIEBpZiB0cnVlCisgICAgICBiOiBjCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwoImEtMSB7XG4gIGItMi0zOiBjLTM7IH1cbiIsIHJlbmRlcig8PFNBU1MpKQorJGE6IDEKKyRiOiAyCiskYzogMworYS1cI3skYX0KKyAgYi1cI3skYn0tXCN7JGN9OiBjLVwjeyRhICsgJGJ9CitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBsZXhfcHJvcGVydHlfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithLTEgeworICBiLTIgMy1maXp6YXAxODogYy0zOyB9CitDU1MKKyRhOiAxCiskYjogMgorJGM6IDMKK2EtXCN7JGF9CisgIGItXCN7JGIgJGN9LVwje2ZpenphcCArICgkYyArIDE1KX06IGMtXCN7JGEgKyAkYn0KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWZfZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsKCJhIHtcbiAgYjogMTsgfVxuIiwgcmVuZGVyKDw8U0FTUykpCiskdmFyOiB0cnVlCithCisgIEBpZiAkdmFyCisgICAgYjogMQorICBAaWYgbm90ICR2YXIKKyAgICBiOiAyCitTQVNTCisKKyAgICBhc3NlcnRfZXF1YWwoImEge1xuICBiOiAyOyB9XG4iLCByZW5kZXIoPDxTQVNTKSkKKyR2YXI6IG51bGwKK2EKKyAgQGlmICR2YXIKKyAgICBiOiAxCisgIEBpZiBub3QgJHZhcgorICAgIGI6IDIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9yCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2EtMCB7CisgIHR3by1pOiAwOyB9CisKK2EtMSB7CisgIHR3by1pOiAyOyB9CisKK2EtMiB7CisgIHR3by1pOiA0OyB9CisKK2EtMyB7CisgIHR3by1pOiA2OyB9CisKK2ItMSB7CisgIGotMTogMDsgfQorCitiLTIgeworICBqLTE6IDE7IH0KKworYi0zIHsKKyAgai0xOiAyOyB9CisKK2ItNCB7CisgIGotMTogMzsgfQorQ1NTCiskYTogMworQGZvciAkaSBmcm9tIDAgdG8gJGEgKyAxCisgIGEtXCN7JGl9CisgICAgdHdvLWk6IDIgKiAkaQorCitAZm9yICRqIGZyb20gMSB0aHJvdWdoIDQKKyAgYi1cI3skan0KKyAgICBqLTE6ICRqIC0gMQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF93aGlsZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithLTUgeworICBibG9vYmxlOiBnbG9vcDsgfQorCithLTQgeworICBibG9vYmxlOiBnbG9vcDsgfQorCithLTMgeworICBibG9vYmxlOiBnbG9vcDsgfQorCithLTIgeworICBibG9vYmxlOiBnbG9vcDsgfQorCithLTEgeworICBibG9vYmxlOiBnbG9vcDsgfQorQ1NTCiskYTogNQorQHdoaWxlICRhICE9IDAKKyAgYS1cI3skYX0KKyAgICBibG9vYmxlOiBnbG9vcAorICAkYTogJGEgLSAxICFnbG9iYWwKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWxzZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithIHsKKyAgdDE6IHQ7CisgIHQyOiB0OworICB0MzogdDsKKyAgdDQ6IHQ7IH0KK0NTUworYQorICBAaWYgdHJ1ZQorICAgIHQxOiB0CisgIEBlbHNlCisgICAgZjE6IGYKKworICBAaWYgZmFsc2UKKyAgICBmMjogZgorICBAZWxzZQorICAgIHQyOiB0CisKKyAgQGlmIGZhbHNlCisgICAgZjM6IGYxCisgIEBlbHNlIGlmIDEgKyAxID09IDMKKyAgICBmMzogZjIKKyAgQGVsc2UKKyAgICB0MzogdAorCisgIEBpZiBmYWxzZQorICAgIGY0OiBmMQorICBAZWxzZSBpZiAxICsgMSA9PSAyCisgICAgdDQ6IHQKKyAgQGVsc2UKKyAgICBmNDogZjIKKworICBAaWYgZmFsc2UKKyAgICBmNTogZjEKKyAgQGVsc2UgaWYgZmFsc2UKKyAgICBmNTogZjIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWFjaAorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithIHsKKyAgYjogMXB4OworICBiOiAycHg7CisgIGI6IDNweDsKKyAgYjogNHB4OworICBjOiBmb287CisgIGM6IGJhcjsKKyAgYzogYmF6OworICBjOiBiYW5nOworICBkOiBibHVlOyB9CitDU1MKK2EKKyAgQGVhY2ggJG51bWJlciBpbiAxcHggMnB4IDNweCA0cHgKKyAgICBiOiAkbnVtYmVyCisgIEBlYWNoICRzdHIgaW4gZm9vLCBiYXIsIGJheiwgYmFuZworICAgIGM6ICRzdHIKKyAgQGVhY2ggJHNpbmdsZSBpbiBibHVlCisgICAgZDogJHNpbmdsZQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9kZXN0cnVjdHVyaW5nX2VhY2gKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCithIHsKKyAgZm9vOiAxcHg7CisgIGJhcjogMnB4OworICBiYXo6IDNweDsgfQorCitjIHsKKyAgZm9vOiAiVmFsdWUgaXMgYmFyIjsKKyAgYmFyOiAiVmFsdWUgaXMgYmF6IjsKKyAgYmFuZzogIlZhbHVlIGlzICI7IH0KK0NTUworYQorICBAZWFjaCAkbmFtZSwgJG51bWJlciBpbiAoZm9vOiAxcHgsIGJhcjogMnB4LCBiYXo6IDNweCkKKyAgICBcI3skbmFtZX06ICRudW1iZXIKK2MKKyAgQGVhY2ggJGtleSwgJHZhbHVlIGluIChmb28gYmFyKSAoYmFyLCBiYXopIGJhbmcKKyAgICBcI3ska2V5fTogIlZhbHVlIGlzIFwjeyR2YWx1ZX0iCitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX3JlYXNzaWdubWVudAorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithIHsKKyAgYjogMTsKKyAgYzogMjsgfQorQ1NTCithCisgICRhOiAxCisgIGI6ICRhCisgICRhOiAyCisgIGM6ICRhCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2h5cGhlbl91bmRlcnNjb3JlX2luc2Vuc2l0aXZlX3ZhcmlhYmxlcworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCitkIHsKKyAgZTogMTM7CisgIGY6IGZvb2JhcjsgfQorQ1NTCiskdmFyLWh5cGhlbjogMTIKKyR2YXJfdW5kZXI6IGZvbworCiskdmFyX2h5cGhlbjogMSArICR2YXJfaHlwaGVuCiskdmFyLXVuZGVyOiAkdmFyLXVuZGVyICsgYmFyCisKK2QKKyAgZTogJHZhci1oeXBoZW4KKyAgZjogJHZhcl91bmRlcgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jc3NfaWRlbnRpZmllcl92YXJpYWJsZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithIHsKKyAgYjogMTI7IH0KK0NTUworJFxce2Zvb1xcKDEyXFwpOiAxMgorCithCisgIGI6ICRcXHtmb29cXCgxMlxcKQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9pbXBvcnRhbnQKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorYSB7CisgIGI6IDEycHggIWltcG9ydGFudDsgfQorQ1NTCiskZm9vOiAxMnB4CithCisgIGI6ICRmb28gIWltcG9ydGFudAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9hcmd1bWVudF9lcnJvcgorICAgIGFzc2VydF9yYWlzZXMoU2Fzczo6U3ludGF4RXJyb3IpIHsgcmVuZGVyKCJhXG4gIGI6IGhzbCgxKSIpIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tbWVudHNfYXRfdGhlX3RvcF9vZl9hX2RvY3VtZW50CisgICAgcmVuZGVyKDw8U0FTUykKKy8vCisgIFRoaXMgaXMgYSBjb21tZW50IHRoYXQKKyAgY29udGludWVzIHRvIHRoZSBzZWNvbmQgbGluZS4KK2ZvbworICBiYXI6IGJhegorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9sb3VkX2NvbW1lbnRzX2NvbnRhaW5pbmdfYV9jb21tZW50X2Nsb3NlCisgICAgYWN0dWFsX2NzcyA9IHJlbmRlcig8PFNBU1MpCisvKgorICBUaGlzIGlzIGEgY29tbWVudCB0aGF0CisgIGNvbnRpbnVlcyB0byB0aGUgc2Vjb25kIGxpbmUuICovCitmb28KKyAgYmFyOiBiYXoKK1NBU1MKK2Fzc2VydF9lcXVhbCg8PENTUywgYWN0dWFsX2NzcykKKy8qIFRoaXMgaXMgYSBjb21tZW50IHRoYXQKKyAqIGNvbnRpbnVlcyB0byB0aGUgc2Vjb25kIGxpbmUuICovCitmb28geworICBiYXI6IGJhejsgfQorQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvdWRfY29tbWVudHNfd2l0aF9zdGFycmVkX2xpbmVzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKKy8qIFRoaXMgaXMgYSBjb21tZW50IHRoYXQKKyAqIGNvbnRpbnVlcyB0byB0aGUgc2Vjb25kIGxpbmUuCisgKiBBbmQgZXZlbiB0byB0aGUgdGhpcmQhICovCitDU1MKKy8qIFRoaXMgaXMgYSBjb21tZW50IHRoYXQKKyAqIGNvbnRpbnVlcyB0byB0aGUgc2Vjb25kIGxpbmUuCisgKiBBbmQgZXZlbiB0byB0aGUgdGhpcmQhCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvdWRfY29tbWVudHNfd2l0aF9ub19zcGFjZV9hZnRlcl9zdGFycmVkX2xpbmVzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKKy8qYmlwIGJvcAorICpiZWVwIGJvb3AKKyAqYmFwIGJsaW1wICovCitDU1MKKy8qYmlwIGJvcAorICpiZWVwIGJvb3AKKyAqYmFwIGJsaW1wCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbW1lbnRfaW5kZW50YXRpb25fYXRfYmVnaW5uaW5nX29mX2RvYworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy8qIGZvbworICogYmFyCisgKiAgIGJheiAqLworZm9vIHsKKyAgYTogYjsgfQorQ1NTCisvKiBmb28KKyAgIGJhcgorICAgICBiYXoKK2ZvbworICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3VudXN1YWxfY29tbWVudF9pbmRlbnRhdGlvbgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKK2ZvbyB7CisgIC8qIGZvbworICAgKiBiYXIKKyAgICogICBiYXogKi8gfQorQ1NTCitmb28KKyAgLyogZm9vCisgICAgIGJhcgorICAgICAgIGJhegorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9sb3VkX2NvbW1lbnRfd2l0aF9jbG9zZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKK2ZvbyB7CisgIC8qIGZvbworICAgKiBiYXIgKi8gfQorQ1NTCitmb28KKyAgLyogZm9vCisgICAgIGJhciAqLworU0FTUworICBlbmQKKworICBkZWYgdGVzdF9sb3VkX2NvbW1lbnRfd2l0aF9zZXBhcmF0ZV9saW5lX2Nsb3NlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorZm9vIHsKKyAgLyogZm9vCisgICAqIGJhcgorICAgKi8gfQorQ1NTCitmb28KKyAgLyogZm9vCisgICAqIGJhcgorICAgKi8KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbG91ZF9jb21tZW50X2luX2NvbXByZXNzZWRfbW9kZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUywgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorZm9ve2NvbG9yOmJsdWU7LyohIGZvbworICogYmFyCisgKi99CitDU1MKK2ZvbworICBjb2xvcjogYmx1ZQorICAvKiEgZm9vCisgICAqIGJhcgorICAgKi8KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbG91ZF9jb21tZW50X2lzX2V2YWx1YXRlZAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy8qISBIdWU6IDMyNy4yMTY0OTQ4NDU0ZGVnICovCitDU1MKKy8qISBIdWU6IFwje2h1ZSgjZjgzNmEwKX0KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXR0cmlidXRlX3NlbGVjdG9yX3dpdGhfc3BhY2VzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2EgYltmb289YmFyXSB7CisgIGM6IGQ7IH0KK0NTUworYQorICBiW2ZvbyA9IGJhcl0KKyAgICBjOiBkCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3F1b3RlZF9jb2xvbgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithIGJbZm9vPSJiYXI6IGJheiJdIHsKKyAgYzogZDsgfQorQ1NTCithCisgIGJbZm9vPSJiYXI6IGJheiJdCisgICAgYzogZAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9xdW90ZWRfY29tbWEKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorYSBiW2Zvbz0iYmFyLCBiYXoiXSB7CisgIGM6IGQ7IH0KK0NTUworYQorICBiW2Zvbz0iYmFyLCBiYXoiXQorICAgIGM6IGQKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcXVvdGVkX2FtcGVyc2FuZAorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithIGJbZm9vPSJiYXIgJiBiYXoiXSB7CisgIGM6IGQ7IH0KK0NTUworYQorICBiW2Zvbz0iYmFyICYgYmF6Il0KKyAgICBjOiBkCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2VtcHR5X3NlbGVjdG9yX3dhcm5pbmcKKyAgICBhc3NlcnRfd2FybmluZyg8PEVORCkge3JlbmRlcigiZm9vIGJhciIpfQorV0FSTklORyBvbiBsaW5lIDEgb2YgdGVzdF9lbXB0eV9zZWxlY3Rvcl93YXJuaW5nX2lubGluZS5zYXNzOgorVGhpcyBzZWxlY3RvciBkb2Vzbid0IGhhdmUgYW55IHByb3BlcnRpZXMgYW5kIHdpbGwgbm90IGJlIHJlbmRlcmVkLgorRU5ECisgIGVuZAorCisgIGRlZiB0ZXN0X25vbnByaW50aW5nX2VtcHR5X3Byb3BlcnR5CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2EgeworICBjOiAiIjsKKyAgZTogZjsgfQorQ1NTCiskbnVsbC12YWx1ZTogbnVsbAorJGVtcHR5LXN0cmluZzogJycKKyRlbXB0eS1saXN0OiAobnVsbCkKK2EKKyAgYjogJG51bGwtdmFsdWUKKyAgYzogJGVtcHR5LXN0cmluZworICBkOiAkZW1wdHktbGlzdAorICBlOiBmCisKK2cKKyAgaDogbnVsbAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9yb290X2xldmVsX3BzZXVkb19jbGFzc193aXRoX25ld19wcm9wZXJ0aWVzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6cHJvcGVydHlfc3ludGF4ID0+IDpuZXcpKQorOmZvY3VzIHsKKyAgb3V0bGluZTogMDsgfQorQ1NTCis6Zm9jdXMKKyAgb3V0bGluZTogMAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9wc2V1ZG9fY2xhc3Nfd2l0aF9uZXdfcHJvcGVydGllcworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUywgOnByb3BlcnR5X3N5bnRheCA9PiA6bmV3KSkKK3AgOmZvY3VzIHsKKyAgb3V0bGluZTogMDsgfQorQ1NTCitwCisgIDpmb2N1cworICAgIG91dGxpbmU6IDAKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmlsX29wdGlvbgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUywgOmZvcm1hdCA9PiBuaWwpKQorZm9vIHsKKyAgYTogYjsgfQorQ1NTCitmb28KKyAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uX2luX3Jhd19mdW5jdGlvbnMKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorZm9vIHsKKyAgZmlsdGVyOiBwcm9naWQ6TWljcm9zb2Z0LmZvby5iYXIuQmF6KGZsaXA9Zm9vYmFyLCBiYW5nPSMwMGZmMDBjYyk7IH0KK0NTUworZm9vCisgIGZpbHRlcjogcHJvZ2lkOk1pY3Jvc29mdC5mb28uYmFyLkJheihmbGlwPVwje2ZvbyArIGJhcn0sIGJhbmc9IzAwZmYwMGNjKQorU0FTUworICBlbmQKKworICAjIFNhc3NTY3JpcHQgc3RyaW5nIGJlaGF2aW9yCisKKyAgZGVmIHRlc3RfcGx1c19wcmVzZXJ2ZXNfcXVvdGVkbmVzcworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCitmb28geworICBhOiAiZm9vMSI7CisgIGI6ICIxZm9vIjsKKyAgYzogZm9vMTsKKyAgZDogMWZvbzsKKyAgZTogImZvb2JhciI7CisgIGY6IGZvb2JhcjsgfQorQ1NTCitmb28KKyAgYTogImZvbyIgKyAxCisgIGI6IDEgKyAiZm9vIgorICBjOiBmb28gKyAxCisgIGQ6IDEgKyBmb28KKyAgZTogImZvbyIgKyBiYXIKKyAgZjogZm9vICsgImJhciIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29sb25fcHJvcGVydGllc19wcmVzZXJ2ZV9xdW90ZWRuZXNzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2ZvbyB7CisgIGE6ICJmb28iOworICBiOiBiYXI7CisgIGM6ICJmb28iIGJhcjsKKyAgZDogZm9vLCAiYmFyIjsgfQorQ1NTCitmb28KKyAgYTogImZvbyIKKyAgYjogYmFyCisgIGM6ICJmb28iIGJhcgorICBkOiBmb28sICJiYXIiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbG9uX3ZhcmlhYmxlc19wcmVzZXJ2ZV9xdW90ZWRuZXNzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2ZvbyB7CisgIGE6ICJmb28iOworICBiOiBiYXI7IH0KK0NTUworJGE6ICJmb28iCiskYjogYmFyCisKK2ZvbworICBhOiAkYQorICBiOiAkYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jb2xvbl9hcmdzX3ByZXNlcnZlX3F1b3RlZG5lc3MKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorZm9vIHsKKyAgYTogImZvbyI7CisgIGI6IGJhcjsKKyAgYzogImZvbyIgYmFyOworICBkOiBmb28sICJiYXIiOyB9CitDU1MKKz1mb28oJGE6ICJmb28iLCAkYjogYmFyLCAkYzogImZvbyIgYmFyLCAkZDogKGZvbywgImJhciIpKQorICBmb28KKyAgICBhOiAkYQorICAgIGI6ICRiCisgICAgYzogJGMKKyAgICBkOiAkZAorCisrZm9vCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25fdW5xdW90ZXNfc3RyaW5ncworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCisuZm9vLWJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvby1cI3siYmFyIn0KKyAgYTogYgorU0FTUworCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKKy5mb28geworICBhOiBiIGM7IH0KK0NTUworLmZvbworICBhOiBiIFwjeyJjIn0KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl91bnF1b3Rlc19zdHJpbmdzX2luX3ZhcnMKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorLmZvby1iYXIgeworICBhOiBiOyB9CitDU1MKKyR2YXI6ICJiYXIiCisKKy5mb28tXCN7JHZhcn0KKyAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uX2RlZXBfdW5xdW90ZXNfc3RyaW5ncworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCisuZm9vIHsKKyAgYTogYmFyIGJhejsgfQorQ1NTCisuZm9vCisgIGE6IFwjeyJiYXIiICJiYXoifQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF93YXJuX2RpcmVjdGl2ZQorICBleHBlY3RlZF93YXJuaW5nID0gPDxFWFBFQ1RBVElPTgorV0FSTklORzogdGhpcyBpcyBhIHdhcm5pbmcKKyAgICAgICAgIG9uIGxpbmUgNCBvZiB0ZXN0X3dhcm5fZGlyZWN0aXZlX2lubGluZS5zYXNzCisKK1dBUk5JTkc6IHRoaXMgaXMgYSBtaXhpbiB3YXJuaW5nCisgICAgICAgICBvbiBsaW5lIDIgb2YgdGVzdF93YXJuX2RpcmVjdGl2ZV9pbmxpbmUuc2FzcywgaW4gYGZvbycKKyAgICAgICAgIGZyb20gbGluZSA3IG9mIHRlc3Rfd2Fybl9kaXJlY3RpdmVfaW5saW5lLnNhc3MKK0VYUEVDVEFUSU9OCisgICAgYXNzZXJ0X3dhcm5pbmcgZXhwZWN0ZWRfd2FybmluZyBkbworICAgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorYmFyIHsKKyAgYzogZDsgfQorQ1NTCis9Zm9vCisgIEB3YXJuICJ0aGlzIGlzIGEgbWl4aW4gd2FybmluZyIKKworQHdhcm4gInRoaXMgaXMgYSB3YXJuaW5nIgorYmFyCisgIGM6IGQKKyAgK2ZvbworU0FTUworICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF93YXJuX2RpcmVjdGl2ZV93aGVuX3F1aWV0CisgICAgYXNzZXJ0X3dhcm5pbmcgIiIgZG8KKyAgICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUywgOnF1aWV0ID0+IHRydWUpCitDU1MKK0B3YXJuICJ0aGlzIGlzIGEgd2FybmluZyIKK1NBU1MKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfd2Fybl93aXRoX2ltcG9ydHMKKyAgICBwcmVmaXggPSBTYXNzOjpVdGlsLmNsZWFucGF0aChGaWxlLmRpcm5hbWUoX19GSUxFX18pKS50b19zCisgICAgZXhwZWN0ZWRfd2FybmluZyA9IDw8V0FSTgorV0FSTklORzogSW4gdGhlIG1haW4gZmlsZQorICAgICAgICAgb24gbGluZSAxIG9mICN7cHJlZml4fS90ZW1wbGF0ZXMvd2Fybi5zYXNzCisKK1dBUk5JTkc6IEltcG9ydGVkCisgICAgICAgICBvbiBsaW5lIDEgb2YgI3twcmVmaXh9L3RlbXBsYXRlcy93YXJuX2ltcG9ydGVkLnNhc3MKKyAgICAgICAgIGZyb20gbGluZSAyIG9mICN7cHJlZml4fS90ZW1wbGF0ZXMvd2Fybi5zYXNzCisKK1dBUk5JTkc6IEluIGFuIGltcG9ydGVkIG1peGluCisgICAgICAgICBvbiBsaW5lIDQgb2YgI3twcmVmaXh9L3RlbXBsYXRlcy93YXJuX2ltcG9ydGVkLnNhc3MsIGluIGBlbWl0cy1hLXdhcm5pbmcnCisgICAgICAgICBmcm9tIGxpbmUgMyBvZiAje3ByZWZpeH0vdGVtcGxhdGVzL3dhcm4uc2FzcworV0FSTgorICAgIGFzc2VydF93YXJuaW5nIGV4cGVjdGVkX3dhcm5pbmcgZG8KKyAgICAgIHJlbmRlcnNfY29ycmVjdGx5ICJ3YXJuIiwgOnN0eWxlID0+IDpjb21wYWN0LCA6bG9hZF9wYXRocyA9PiBbIiN7cHJlZml4fS90ZW1wbGF0ZXMiXQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9tZWRpYV9idWJibGluZworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy5mb28geworICBhOiBiOyB9CisgIEBtZWRpYSBiYXIgeworICAgIC5mb28geworICAgICAgYzogZDsgfSB9CisgIC5mb28gLmJheiB7CisgICAgZTogZjsgfQorICAgIEBtZWRpYSBiaXAgeworICAgICAgLmZvbyAuYmF6IHsKKyAgICAgICAgZzogaDsgfSB9CisKKy5vdGhlciB7CisgIGk6IGo7IH0KK0NTUworLmZvbworICBhOiBiCisgIEBtZWRpYSBiYXIKKyAgICBjOiBkCisgIC5iYXoKKyAgICBlOiBmCisgICAgQG1lZGlhIGJpcAorICAgICAgZzogaAorCisub3RoZXIKKyAgaTogagorU0FTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6c3R5bGUgPT4gOmNvbXBhY3QpCisuZm9vIHsgYTogYjsgfQorQG1lZGlhIGJhciB7IC5mb28geyBjOiBkOyB9IH0KKy5mb28gLmJheiB7IGU6IGY7IH0KK0BtZWRpYSBiaXAgeyAuZm9vIC5iYXogeyBnOiBoOyB9IH0KKworLm90aGVyIHsgaTogajsgfQorQ1NTCisuZm9vCisgIGE6IGIKKyAgQG1lZGlhIGJhcgorICAgIGM6IGQKKyAgLmJhegorICAgIGU6IGYKKyAgICBAbWVkaWEgYmlwCisgICAgICBnOiBoCisKKy5vdGhlcgorICBpOiBqCitTQVNTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzdHlsZSA9PiA6ZXhwYW5kZWQpCisuZm9vIHsKKyAgYTogYjsKK30KK0BtZWRpYSBiYXIgeworICAuZm9vIHsKKyAgICBjOiBkOworICB9Cit9CisuZm9vIC5iYXogeworICBlOiBmOworfQorQG1lZGlhIGJpcCB7CisgIC5mb28gLmJheiB7CisgICAgZzogaDsKKyAgfQorfQorCisub3RoZXIgeworICBpOiBqOworfQorQ1NTCisuZm9vCisgIGE6IGIKKyAgQG1lZGlhIGJhcgorICAgIGM6IGQKKyAgLmJhegorICAgIGU6IGYKKyAgICBAbWVkaWEgYmlwCisgICAgICBnOiBoCisKKy5vdGhlcgorICBpOiBqCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RvdWJsZV9tZWRpYV9idWJibGluZworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKK0BtZWRpYSBiYXIgYW5kIChhOiBiKSB7CisgIC5mb28geworICAgIGM6IGQ7IH0gfQorQ1NTCitAbWVkaWEgYmFyCisgIEBtZWRpYSAoYTogYikKKyAgICAuZm9vCisgICAgICBjOiBkCitTQVNTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitAbWVkaWEgYmFyIHsKKyAgLmZvbyB7CisgICAgYTogYjsgfSB9CisgIEBtZWRpYSBiYXIgYW5kIChhOiBiKSB7CisgICAgLmZvbyB7CisgICAgICBjOiBkOyB9IH0KK0NTUworLmZvbworICBAbWVkaWEgYmFyCisgICAgYTogYgorICAgIEBtZWRpYSAoYTogYikKKyAgICAgIGM6IGQKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZG91YmxlX21lZGlhX2J1YmJsaW5nX3dpdGhfY29tbWFzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorQG1lZGlhIChhOiBiKSBhbmQgKGU6IGYpLCAoYzogZCkgYW5kIChlOiBmKSwgKGE6IGIpIGFuZCAoZzogaCksIChjOiBkKSBhbmQgKGc6IGgpIHsKKyAgLmZvbyB7CisgICAgYzogZDsgfSB9CitDU1MKK0BtZWRpYSAoYTogYiksIChjOiBkKQorICBAbWVkaWEgKGU6IGYpLCAoZzogaCkKKyAgICAuZm9vCisgICAgICBjOiBkCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RvdWJsZV9tZWRpYV9idWJibGluZ193aXRoX3N1cnJvdW5kaW5nX3J1bGVzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorQG1lZGlhIChtaW4td2lkdGg6IDApIHsKKyAgYSB7CisgICAgYTogYTsgfQorCisgIGIgeworICAgIGJlZm9yZTogYjsKKyAgICBhZnRlcjogYjsgfSB9CisgIEBtZWRpYSAobWluLXdpZHRoOiAwKSBhbmQgKG1heC13aWR0aDogNTAwMHB4KSB7CisgICAgYiB7CisgICAgICB4OiB4OyB9IH0KKworQG1lZGlhIChtaW4td2lkdGg6IDApIHsKKyAgYyB7CisgICAgYzogYzsgfSB9CitDU1MKK0BtZWRpYSAobWluLXdpZHRoOiAwKQorICBhCisgICAgYTogYQorICBiCisgICAgYmVmb3JlOiBiCisgICAgQG1lZGlhIChtYXgtd2lkdGg6IDUwMDBweCkKKyAgICAgIHg6IHgKKyAgICBhZnRlcjogYgorICBjCisgICAgYzogYworU0FTUworICBlbmQKKworICBkZWYgdGVzdF9ydWxlX21lZGlhX3J1bGVfYnViYmxpbmcKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitAbWVkaWEgYmFyIHsKKyAgLmZvbyB7CisgICAgYTogYjsKKyAgICBlOiBmOyB9CisgICAgLmZvbyAuYmF6IHsKKyAgICAgIGM6IGQ7IH0gfQorQ1NTCisuZm9vCisgIEBtZWRpYSBiYXIKKyAgICBhOiBiCisgICAgLmJhegorICAgICAgYzogZAorICAgIGU6IGYKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX21lZGlhX2Fyb3VuZF9wcm9wZXJ0aWVzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorLm91dHNpZGUgeworICBjb2xvcjogcmVkOworICBiYWNrZ3JvdW5kOiBibHVlOyB9CisgIEBtZWRpYSBwcmludCB7CisgICAgLm91dHNpZGUgeworICAgICAgY29sb3I6IGJsYWNrOyB9IH0KKyAgQG1lZGlhIHByaW50IGFuZCAoYTogYikgeworICAgIC5vdXRzaWRlIC5pbnNpZGUgeworICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IH0gfQorCisgIC5vdXRzaWRlIC5taWRkbGUgeworICAgIGRpc3BsYXk6IGJsb2NrOyB9CitDU1MKKy5vdXRzaWRlCisgIGNvbG9yOiByZWQKKyAgQG1lZGlhIHByaW50CisgICAgY29sb3I6IGJsYWNrCisgICAgLmluc2lkZQorICAgICAgQG1lZGlhIChhOiBiKQorICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaworICBiYWNrZ3JvdW5kOiBibHVlCisgIC5taWRkbGUKKyAgICBkaXNwbGF5OiBibG9jaworU0FTUworICBlbmQKKworICBkZWYgdGVzdF9tZWRpYV93aXRoX3BhcmVudF9yZWZlcmVuY2VzCisgICAgc2Fzc19zdHIgPSA8PFNBU1MKKy5vdXRzaWRlCisgIEBtZWRpYSBwcmludAorICAgICYuaW5zaWRlCisgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaworU0FTUworICAgIGNzc19zdHIgPSA8PENTUworQG1lZGlhIHByaW50IHsKKyAgLm91dHNpZGUuaW5zaWRlIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsgfSB9CitDU1MKKyAgICBhc3NlcnRfZXF1YWwgY3NzX3N0ciwgcmVuZGVyKHNhc3Nfc3RyKQorICBlbmQKKworICBkZWYgdGVzdF9lbGltaW5hdGVkX21lZGlhX2J1YmJsaW5nCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorQG1lZGlhIHNjcmVlbiB7CisgIGE6IGI7IH0KK0NTUworQG1lZGlhIHNjcmVlbgorICBhOiBiCisgIEBtZWRpYSBwcmludAorICAgIGM6IGQKK1NBU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKK0BtZWRpYSBub3QgcHJpbnQgeworICBhOiBiOyB9CitDU1MKK0BtZWRpYSBub3QgcHJpbnQKKyAgYTogYgorICBAbWVkaWEgcHJpbnQKKyAgICBjOiBkCitTQVNTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitAbWVkaWEgbm90IHByaW50IHsKKyAgYTogYjsgfQorQ1NTCitAbWVkaWEgbm90IHByaW50CisgIGE6IGIKKyAgQG1lZGlhIG5vdCBzY3JlZW4KKyAgICBjOiBkCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X25vbl9lbGltaW5hdGVkX21lZGlhX2J1YmJsaW5nCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorQG1lZGlhIHNjcmVlbiB7CisgIGE6IGI7IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChhOiBiKSB7CisgIGM6IGQ7IH0KK0NTUworQG1lZGlhIHNjcmVlbgorICBhOiBiCisgIEBtZWRpYSBzY3JlZW4gYW5kIChhOiBiKQorICAgIGM6IGQKK1NBU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKK0BtZWRpYSBub3QgcHJpbnQgeworICBhOiBiOyB9CitAbWVkaWEgc2NyZWVuIHsKKyAgYzogZDsgfQorQ1NTCitAbWVkaWEgbm90IHByaW50CisgIGE6IGIKKyAgQG1lZGlhIHNjcmVlbgorICAgIGM6IGQKK1NBU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKK0BtZWRpYSBvbmx5IHNjcmVlbiB7CisgIGE6IGI7IH0KK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKGE6IGIpIHsKKyAgYzogZDsgfQorQ1NTCitAbWVkaWEgb25seSBzY3JlZW4KKyAgYTogYgorICBAbWVkaWEgc2NyZWVuIGFuZCAoYTogYikKKyAgICBjOiBkCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RpcmVjdGl2ZV9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorQGZvbyBiYXIxMiBxdXggeworICBhOiBiOyB9CitDU1MKKyRiYXo6IDEyCitAZm9vIGJhclwjeyRiYXp9IHF1eAorICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X21lZGlhX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitAbWVkaWEgYmFyMTIgeworICBhOiBiOyB9CitDU1MKKyRiYXo6IDEyCitAbWVkaWEgYmFyXCN7JGJhen0KKyAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZXNfaW5fbWVkaWEKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitAbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvLWZvbzogMjUpLCBvbmx5IHByaW50IHsKKyAgYTogYjsgfQorQ1NTCiskbWVkaWExOiBzY3JlZW4KKyRtZWRpYTI6IHByaW50CiskdmFyOiAtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW8KKyR2YWw6IDIwCitAbWVkaWEgXCN7JG1lZGlhMX0gYW5kICgkdmFyICsgIi1mb28iOiAkdmFsICsgNSksIG9ubHkgXCN7JG1lZGlhMn0KKyAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbworICBAYXQtcm9vdAorICAgIC5iYXIKKyAgICAgIGE6IGIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF93aXRoX3NlbGVjdG9yCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbworICBAYXQtcm9vdCAuYmFyCisgICAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhfcXVlcnkKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCisuZm9vIC5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28KKyAgQG1lZGlhIHNjcmVlbgorICAgIEBhdC1yb290ICh3aXRob3V0OiBtZWRpYSkKKyAgICAgIC5iYXIKKyAgICAgICAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF92YXJpYWJsZV9hc3NpZ25tZW50X3dpdGhfZ2xvYmFsCisgICAgYXNzZXJ0X25vX3dhcm5pbmcge2Fzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpfQorLmZvbyB7CisgIGE6IHg7IH0KKworLmJhciB7CisgIGI6IHg7IH0KK0NTUworJHZhcjogMQorCisuZm9vCisgICR2YXI6IHggIWdsb2JhbAorICBhOiAkdmFyCisKKy5iYXIKKyAgYjogJHZhcgorU0FTUworICBlbmQKKworICAjIFJlZ3Jlc3Npb24gdGVzdHMKKworICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uX2luX211bHRpbGluZV9zZWxlY3RvcgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCisuZm9vLAorLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbywKK1wjeyIuYmFyIn0KKyAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9saXN0X3NlcGFyYXRvcl93aXRoX2FyZ19saXN0CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKKy50ZXN0IHsKKyAgc2VwYXJhdG9yOiBjb21tYTsgfQorQ1NTCitAbWl4aW4gYXJnbGlzdC10ZXN0KCRhcmdzLi4uKQorICBzZXBhcmF0b3I6IGxpc3Qtc2VwYXJhdG9yKCRhcmdzKQorCisudGVzdAorICBAaW5jbHVkZSBhcmdsaXN0LXRlc3QodGhpcywgaXMsIGNvbW1hLCBzZXBhcmF0ZWQpCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3BhcmVudF9taXhpbl9pbl9jb250ZW50X25lc3RlZAorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithIHsKKyAgYjogYzsgfQorQ1NTCis9Zm9vCisgIEBjb250ZW50CisKKz1iYXIKKyAgK2ZvbworICAgICtmb28KKyAgICAgIGEKKyAgICAgICAgYjogYworCisrYmFyCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3N1cHBvcnRzX2J1YmJsZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitwYXJlbnQgeworICBiYWNrZ3JvdW5kOiBvcmFuZ2U7IH0KKyAgQHN1cHBvcnRzIChwZXJzcGVjdGl2ZTogMTBweCkgb3IgKC1tb3otcGVyc3BlY3RpdmU6IDEwcHgpIHsKKyAgICBwYXJlbnQgY2hpbGQgeworICAgICAgYmFja2dyb3VuZDogYmx1ZTsgfSB9CitDU1MKK3BhcmVudAorICBiYWNrZ3JvdW5kOiBvcmFuZ2UKKyAgQHN1cHBvcnRzIChwZXJzcGVjdGl2ZTogMTBweCkgb3IgKC1tb3otcGVyc3BlY3RpdmU6IDEwcHgpCisgICAgY2hpbGQKKyAgICAgIGJhY2tncm91bmQ6IGJsdWUKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGluZV9udW1iZXJzX3dpdGhfZG9zX2xpbmVfZW5kaW5ncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUywgOmxpbmVfY29tbWVudHMgPT4gdHJ1ZSkKKy8qIGxpbmUgNSwgdGVzdF9saW5lX251bWJlcnNfd2l0aF9kb3NfbGluZV9lbmRpbmdzX2lubGluZS5zYXNzICovCisuZm9vIHsKKyAgYTogYjsgfQorQ1NTCitccgorXHIKK1xyCitccgorLmZvbworICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX2luX21lZGlhX2luX21peGluCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTBweCkgeworICBib2R5IHsKKyAgICBiYWNrZ3JvdW5kOiByZWQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMjBweCkgeworICBib2R5IHsKKyAgICBiYWNrZ3JvdW5kOiBibHVlOyB9IH0KK0NTUworQG1peGluIHJlc3BvbmQtdG8oJHdpZHRoKQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkd2lkdGgpCisgICAgQGNvbnRlbnQKKworYm9keQorICBAaW5jbHVkZSByZXNwb25kLXRvKDEwcHgpCisgICAgYmFja2dyb3VuZDogcmVkCisgIEBpbmNsdWRlIHJlc3BvbmQtdG8oMjBweCkKKyAgICBiYWNrZ3JvdW5kOiBibHVlCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVycG9sYXRlZF9jb21tZW50X2luX21peGluCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorLyohIGNvbG9yOiByZWQgKi8KKy5mb28geworICBjb2xvcjogcmVkOyB9CisKKy8qISBjb2xvcjogYmx1ZSAqLworLmZvbyB7CisgIGNvbG9yOiBibHVlOyB9CisKKy8qISBjb2xvcjogZ3JlZW4gKi8KKy5mb28geworICBjb2xvcjogZ3JlZW47IH0KK0NTUworPWZvbygkdmFyKQorICAvKiEgY29sb3I6IFwjeyR2YXJ9CisgIC5mb28KKyAgICBjb2xvcjogJHZhcgorCisrZm9vKHJlZCkKKytmb28oYmx1ZSkKKytmb28oZ3JlZW4pCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3BhcmVuc19pbl9taXhpbnMKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorLmZvbyB7CisgIGNvbG9yOiAjMDFmZjdmOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMTAyOyB9CitDU1MKKz1mb28oJGMxLCAkYzI6IHJnYigwLCAxLCAyKSkKKyAgY29sb3I6ICRjMQorICBiYWNrZ3JvdW5kLWNvbG9yOiAkYzIKKworLmZvbworICArZm9vKHJnYigxLDI1NSwxMjcpKQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jb21tZW50X2JlbmVhdGhfcHJvcAorICAgIGFzc2VydF9lcXVhbCg8PFJFU1VMVCwgcmVuZGVyKDw8U09VUkNFKSkKKy5ib3ggeworICBib3JkZXItc3R5bGU6IHNvbGlkOyB9CitSRVNVTFQKKy5ib3gKKyAgYm9yZGVyOgorICAgIC8vY29sb3I6IGJsYWNrCisgICAgc3R5bGU6IHNvbGlkCitTT1VSQ0UKKworICAgIGFzc2VydF9lcXVhbCg8PFJFU1VMVCwgcmVuZGVyKDw8U09VUkNFKSkKKy5ib3ggeworICAvKiBjb2xvcjogYmxhY2sgKi8KKyAgYm9yZGVyLXN0eWxlOiBzb2xpZDsgfQorUkVTVUxUCisuYm94CisgIGJvcmRlcjoKKyAgICAvKiBjb2xvcjogYmxhY2sKKyAgICBzdHlsZTogc29saWQKK1NPVVJDRQorCisgICAgYXNzZXJ0X2VxdWFsKDw8UkVTVUxULCByZW5kZXIoPDxTT1VSQ0UsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCisuYm94e2JvcmRlci1zdHlsZTpzb2xpZH0KK1JFU1VMVAorLmJveAorICBib3JkZXI6CisgICAgLypjb2xvcjogYmxhY2sKKyAgICBzdHlsZTogc29saWQKK1NPVVJDRQorICBlbmQKKworICBkZWYgdGVzdF9jb21wcmVzc2VkX2NvbW1lbnRfYmVuZWF0aF9kaXJlY3RpdmUKKyAgICBhc3NlcnRfZXF1YWwoPDxSRVNVTFQsIHJlbmRlcig8PFNPVVJDRSwgOnN0eWxlID0+IDpjb21wcmVzc2VkKSkKK0Bmb297YTpifQorUkVTVUxUCitAZm9vCisgIGE6IGIKKyAgLypiOiBjCitTT1VSQ0UKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tbWVudF93aXRoX2NyYXp5X2luZGVudGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKKy8qIFRoaXMgaXMgYSBsb3VkIGNvbW1lbnQ6CisgKiAgICAgICAgICBXaGVyZSB0aGUgaW5kZW50YXRpb24gaXMgd29ua3kuICovCisuY29tbWVudCB7CisgIHdpZHRoOiAxcHg7IH0KK0NTUworLyoKKyAgVGhpcyBpcyBhIGxvdWQgY29tbWVudDoKKyAgICAgICAgICAgV2hlcmUgdGhlIGluZGVudGF0aW9uIGlzIHdvbmt5LgorLy8KKyAgVGhpcyBpcyBhIHNpbGVudCBjb21tZW50OgorICAgICAgICAgICBXaGVyZSB0aGUgaW5kZW50YXRpb24gaXMgd29ua3kuCisuY29tbWVudAorICB3aWR0aDogMXB4CitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3BsdXNfd2l0aF9zcGFjZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithICsgYiB7CisgIGNvbG9yOiBncmVlbjsgfQorQ1NTCithCisgICsgYgorICAgIGNvbG9yOiBncmVlbgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9saW5lX2NvbW1lbnQKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorLyogRm9vCisgKgorICogQmFyICovCitDU1MKKy8qCisgIEZvbworCisgIEJhcgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9jb21tZW50CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKKy8qICovCithIHsKKyAgLyogKi8KKyAgYjogYzsgfQorQ1NTCisvKgorYQorICAvKgorICBiOiBjCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X29wdGlvbnNfYXZhaWxhYmxlX2luX2Vudmlyb25tZW50CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2EgeworICBiOiBuZXN0ZWQ7IH0KK0NTUworYQorICBiOiBvcHRpb24oInN0eWxlIikKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0X3dpdGhfY29tbWFzX2luX3VybAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKK0BpbXBvcnQgdXJsKGZvby5jc3M/YmFyLGJheik7CitDU1MKK0BpbXBvcnQgdXJsKGZvby5jc3M/YmFyLGJheikKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2lsZW50X2NvbW1lbnRfaW5fcHJvcF92YWxfYWZ0ZXJfaW1wb3J0YW50CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKKy5hZHZhbmNlZCB7CisgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQorQ1NTCisuYWR2YW5jZWQKKyAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50IC8vIHllYWgsIHllYWguIGl0J3Mgbm90IHJlYWxseSBhIHN0eWxlIGFueXdheS4KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fd2l0aF9rZXl3b3JkX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCisubWl4ZWQgeworICByZXF1aXJlZDogZm9vOworICBhcmcxOiBkZWZhdWx0LXZhbDE7CisgIGFyZzI6IG5vbi1kZWZhdWx0LXZhbDI7IH0KK0NTUworPWEtbWl4aW4oJHJlcXVpcmVkLCAkYXJnMTogZGVmYXVsdC12YWwxLCAkYXJnMjogZGVmYXVsdC12YWwyKQorICByZXF1aXJlZDogJHJlcXVpcmVkCisgIGFyZzE6ICRhcmcxCisgIGFyZzI6ICRhcmcyCisubWl4ZWQKKyAgK2EtbWl4aW4oZm9vLCAkYXJnMjogbm9uLWRlZmF1bHQtdmFsMikKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fd2l0aF9rZXl3b3JkX2FyZ192YXJpYWJsZV92YWx1ZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy5taXhlZCB7CisgIHJlcXVpcmVkOiBmb287CisgIGFyZzE6IGRlZmF1bHQtdmFsMTsKKyAgYXJnMjogYS12YWx1ZTsgfQorQ1NTCis9YS1taXhpbigkcmVxdWlyZWQsICRhcmcxOiBkZWZhdWx0LXZhbDEsICRhcmcyOiBkZWZhdWx0LXZhbDIpCisgIHJlcXVpcmVkOiAkcmVxdWlyZWQKKyAgYXJnMTogJGFyZzEKKyAgYXJnMjogJGFyZzIKKy5taXhlZAorICAkYS12YWx1ZTogYS12YWx1ZQorICArYS1taXhpbihmb28sICRhcmcyOiAkYS12YWx1ZSkKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fa2V5d29yZF9hcmdzX2hhbmRsZV92YXJpYWJsZV91bmRlcnNjb3JlX2Rhc2hfZXF1aXZhbGVuY2UKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCisubWl4ZWQgeworICByZXF1aXJlZDogZm9vOworICBhcmcxOiBub24tZGVmYXVsdC12YWwxOworICBhcmcyOiBub24tZGVmYXVsdC12YWwyOyB9CitDU1MKKz1hLW1peGluKCRyZXF1aXJlZCwgJGFyZy0xOiBkZWZhdWx0LXZhbDEsICRhcmdfMjogZGVmYXVsdC12YWwyKQorICByZXF1aXJlZDogJHJlcXVpcmVkCisgIGFyZzE6ICRhcmdfMQorICBhcmcyOiAkYXJnLTIKKy5taXhlZAorICArYS1taXhpbihmb28sICRhcmctMjogbm9uLWRlZmF1bHQtdmFsMiwgJGFyZ18xOiBub24tZGVmYXVsdC12YWwxKQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9wYXNzaW5nX3JlcXVpcmVkX2FyZ3NfYXNfYV9rZXl3b3JkX2FyZworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy5taXhlZCB7CisgIHJlcXVpcmVkOiBmb287CisgIGFyZzE6IGRlZmF1bHQtdmFsMTsKKyAgYXJnMjogZGVmYXVsdC12YWwyOyB9CitDU1MKKz1hLW1peGluKCRyZXF1aXJlZCwgJGFyZzE6IGRlZmF1bHQtdmFsMSwgJGFyZzI6IGRlZmF1bHQtdmFsMikKKyAgcmVxdWlyZWQ6ICRyZXF1aXJlZAorICBhcmcxOiAkYXJnMQorICBhcmcyOiAkYXJnMgorLm1peGVkCisgICthLW1peGluKCRyZXF1aXJlZDogZm9vKQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9wYXNzaW5nX2FsbF9hc19rZXl3b3JkX2FyZ3NfaW5fb3Bwb3NpdGVfb3JkZXIKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCisubWl4ZWQgeworICByZXF1aXJlZDogZm9vOworICBhcmcxOiBub24tZGVmYXVsdC12YWwxOworICBhcmcyOiBub24tZGVmYXVsdC12YWwyOyB9CitDU1MKKz1hLW1peGluKCRyZXF1aXJlZCwgJGFyZzE6IGRlZmF1bHQtdmFsMSwgJGFyZzI6IGRlZmF1bHQtdmFsMikKKyAgcmVxdWlyZWQ6ICRyZXF1aXJlZAorICBhcmcxOiAkYXJnMQorICBhcmcyOiAkYXJnMgorLm1peGVkCisgICthLW1peGluKCRhcmcyOiBub24tZGVmYXVsdC12YWwyLCAkYXJnMTogbm9uLWRlZmF1bHQtdmFsMSwgJHJlcXVpcmVkOiBmb28pCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX291dHB1dF93aXRoX2NvbW1hCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorZm9vIHsKKyAgYTogYihjKSwgZChlKTsgfQorQ1NTCitmb28KKyAgYTogYihjKSwgZChlKQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uX3dpdGhfY29tbWEKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitmb28geworICBhOiBmb28sIGJhcjsgfQorQ1NTCiskZm9vOiBmb28KK2ZvbworICBhOiBcI3skZm9vfSwgYmFyCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19pbnRlcnBvbGF0aW9uX3dpdGhfY29tbWEKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitmb28geworICBhOiAiYmlwIGZvbyBiYXAiLCBiYXI7IH0KK0NTUworJGZvbzogZm9vCitmb28KKyAgYTogImJpcCBcI3skZm9vfSBiYXAiLCBiYXIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5rbm93bl9kaXJlY3RpdmUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitAYmF6IHsKKyAgYzogZDsgfQorQ1NTCitAYmF6CisgIGM6IGQKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbG91ZF9jb21tZW50X2ludGVycG9sYXRpb25zX2Nhbl9iZV9lc2NhcGVkCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorLyogXCN7Zm9vfSAqLworQ1NTCisvKiBcXFwje2Zvb30KK1NBU1MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCisvKiEgXCN7Zm9vfSAqLworQ1NTCisvKiEgXFxcI3tmb299CitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2NvbXByZXNzaW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCithPmIsYytkLDotbW96LWFueShlLGYsZyl7aDppfQorQ1NTCithID4gYiwgYyArIGQsIDotbW96LWFueShlLCBmLCBnKQorICBoOiBpCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbW1lbnRfbGlrZV9zZWxlY3RvcgorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAnSW52YWxpZCBDU1MgYWZ0ZXIgIi8iOiBleHBlY3RlZCBpZGVudGlmaWVyLCB3YXMgIiBmb28iJykge3JlbmRlcig8PFNBU1MpfQorLyBmb28KKyAgYTogYgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZW1wdHlfZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorQG1lZGlhIHNjcmVlbiB7CisgIC5mb28geworICAgIGE6IGI7IH0KKworICBAdW5rbm93bi1kaXJlY3RpdmU7IH0KK0NTUworQG1lZGlhIHNjcmVlbgorICAuZm9vCisgICAgYTogYgorCisgIEB1bmtub3duLWRpcmVjdGl2ZQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9vcmlnaW5hbF9maWxlbmFtZV9zZXQKKyAgICBpbXBvcnRlciA9IE1vY2tJbXBvcnRlci5uZXcKKyAgICBpbXBvcnRlci5hZGRfaW1wb3J0KCJpbXBvcnRlZCIsICJkaXZ7Y29sb3I6cmVkfSIpCisKKyAgICBvcmlnaW5hbF9maWxlbmFtZSA9IGZpbGVuYW1lX2Zvcl90ZXN0CisgICAgZW5naW5lID0gU2Fzczo6RW5naW5lLm5ldygnQGltcG9ydCAiaW1wb3J0ZWQiOyBkaXZ7Y29sb3I6Ymx1ZX0nLAorICAgICAgOmZpbGVuYW1lID0+IG9yaWdpbmFsX2ZpbGVuYW1lLCA6bG9hZF9wYXRocyA9PiBbaW1wb3J0ZXJdLCA6c3ludGF4ID0+IDpzY3NzLCA6aW1wb3J0ZXIgPT4gaW1wb3J0ZXIpCisgICAgZW5naW5lLnJlbmRlcgorCisgICAgYXNzZXJ0X2VxdWFsIG9yaWdpbmFsX2ZpbGVuYW1lLCBlbmdpbmUub3B0aW9uc1s6b3JpZ2luYWxfZmlsZW5hbWVdCisgICAgYXNzZXJ0X2VxdWFsIG9yaWdpbmFsX2ZpbGVuYW1lLCBpbXBvcnRlci5lbmdpbmUoImltcG9ydGVkIikub3B0aW9uc1s6b3JpZ2luYWxfZmlsZW5hbWVdCisgIGVuZAorCisgIGRlZiB0ZXN0X2NoYW5naW5nX3ByZWNpc2lvbgorICAgIG9sZF9wcmVjaXNpb24gPSBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIucHJlY2lzaW9uCisgICAgYmVnaW4KKyAgICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5wcmVjaXNpb24gPSA4CisgICAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitkaXYgeworICBtYXhpbXVtOiAxLjAwMDAwMDAxOworICB0b28tbXVjaDogMTsgfQorQ1NTCitkaXYKKyAgbWF4aW11bSA6IDEuMDAwMDAwMDEKKyAgdG9vLW11Y2g6IDEuMDAwMDAwMDAxCitTQVNTCisgICAgZW5zdXJlCisgICAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIucHJlY2lzaW9uID0gb2xkX3ByZWNpc2lvbgorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9jb250ZW50CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorLmNoaWxkcmVuIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmVkOworICBjb2xvcjogYmx1ZTsKKyAgYm9yZGVyLWNvbG9yOiByZWQ7IH0KK0NTUworJGNvbG9yOiBibHVlCis9Y29udGV4dCgkY2xhc3MsICRjb2xvcjogcmVkKQorICAuXCN7JGNsYXNzfQorICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcgorICAgIEBjb250ZW50CisgICAgYm9yZGVyLWNvbG9yOiAkY29sb3IKKytjb250ZXh0KGNoaWxkcmVuKQorICBjb2xvcjogJGNvbG9yCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2luX2NvbnRlbnQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCisucGFyZW50IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmVkOworICBib3JkZXItY29sb3I6IHJlZDsgfQorICAucGFyZW50IC5jaGlsZHJlbiB7CisgICAgY29sb3I6IGJsdWU7IH0KK0NTUworJGNvbG9yOiBibHVlCis9Y29udGV4dCgkY2xhc3MsICRjb2xvcjogcmVkKQorICAuXCN7JGNsYXNzfQorICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcgorICAgIEBjb250ZW50CisgICAgYm9yZGVyLWNvbG9yOiAkY29sb3IKKytjb250ZXh0KHBhcmVudCkKKyAgLmNoaWxkcmVuCisgICAgY29sb3I6ICRjb2xvcgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF91c2luZ19wYXJlbnRfbWl4aW5faW5fY29udGVudAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy5wYXJlbnQgeworICBiZWZvcmUtY29sb3I6IHJlZDsKKyAgYWZ0ZXItY29sb3I6IHJlZDsgfQorICAucGFyZW50IC5zaWJsaW5nIHsKKyAgICBiZWZvcmUtY29sb3I6IHllbGxvdzsKKyAgICBhZnRlci1jb2xvcjogeWVsbG93OyB9CisgICAgLnBhcmVudCAuc2libGluZyAuY2hpbGQgeworICAgICAgYmVmb3JlLWNvbG9yOiBncmVlbjsKKyAgICAgIGNvbG9yOiBibHVlOworICAgICAgYWZ0ZXItY29sb3I6IGdyZWVuOyB9CitDU1MKKyRjb2xvcjogYmx1ZQorPWNvbnRleHQoJGNsYXNzLCAkY29sb3I6IHJlZCkKKyAgLlwjeyRjbGFzc30KKyAgICBiZWZvcmUtY29sb3I6ICRjb2xvcgorICAgIEBjb250ZW50CisgICAgYWZ0ZXItY29sb3I6ICRjb2xvcgorK2NvbnRleHQocGFyZW50KQorICArY29udGV4dChzaWJsaW5nLCAkY29sb3I6IHllbGxvdykKKyAgICArY29udGV4dChjaGlsZCwgJGNvbG9yOiBncmVlbikKKyAgICAgIGNvbG9yOiAkY29sb3IKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29udGVudF9tb3JlX3RoYW5fb25jZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy5vbmNlIHsKKyAgY29sb3I6IGJsdWU7IH0KKworLnR3aWNlIHsKKyAgY29sb3I6IGJsdWU7IH0KK0NTUworJGNvbG9yOiBibHVlCis9Y29udGV4dCgkY2xhc3MsICRjb2xvcjogcmVkKQorICAub25jZQorICAgIEBjb250ZW50CisgIC50d2ljZQorICAgIEBjb250ZW50CisrY29udGV4dChwYXJlbnQpCisgIGNvbG9yOiAkY29sb3IKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29udGVudF93aXRoX3ZhcmlhYmxlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQVNTKQorLmZvbyB7CisgIGE6IDFweDsgfQorQ1NTCis9Zm9vCisgIC5mb28KKyAgICBAY29udGVudAorK2ZvbworICAkYTogMXB4CisgIGE6ICRhCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9jb250ZW50X2Jsb2NrcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKKy5mb28geworICBhOiBmb287IH0KKyAgLmZvbyAuYmFyIHsKKyAgICBhOiBiYXI7IH0KKyAgICAuZm9vIC5iYXIgLmJheiB7CisgICAgICBhOiBiYXo7IH0KKyAgICAgIC5mb28gLmJhciAuYmF6IC5vdXRzaWRlIHsKKyAgICAgICAgYTogb3V0c2lkZTsKKyAgICAgICAgY29sb3I6IHJlZDsgfQorQ1NTCiskYTogb3V0c2lkZQorPWJheigkYTogYmF6KQorICAuYmF6CisgICAgYTogJGEKKyAgICBAY29udGVudAorPWJhcigkYTogYmFyKQorICAuYmFyCisgICAgYTogJGEKKyAgICArYmF6CisgICAgICBAY29udGVudAorPWZvbygkYTogZm9vKQorICAuZm9vCisgICAgYTogJGEKKyAgICArYmFyCisgICAgICBAY29udGVudAorK2ZvbworICAub3V0c2lkZQorICAgIGE6ICRhCisgICAgY29sb3I6IHJlZAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jb250ZW50X25vdF9zZWVuX3Rocm91Z2hfbWl4aW4KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCithIGZvbyB7CisgIG1peGluOiBmb287CisgIGE6IGI7IH0KKyAgYSBmb28gYmFyIHsKKyAgICBtaXhpbjogYmFyOyB9CitDU1MKKz1mb28KKyAgZm9vCisgICAgbWl4aW46IGZvbworICAgIEBjb250ZW50CisgICAgK2JhcgorPWJhcgorICBiYXIKKyAgICBtaXhpbjogYmFyCisgICAgQGNvbnRlbnQKK2EKKyAgK2ZvbworICAgIGE6IGIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29udGVudF9iYWNrdHJhY2VfZm9yX3BlcmZvcm0KKyAgICByZW5kZXIoPDxTQVNTKQorPWZvbworICBAY29udGVudAorCithCisgICtmb28KKyAgICBiOiAxZW0gKyAycHgKK1NBU1MKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBleGNlcHRpb24iKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbChbCisgICAgICAgIHs6bWl4aW4gPT4gJ0Bjb250ZW50JywgOmxpbmUgPT4gNiwgOmZpbGVuYW1lID0+ICd0ZXN0X2NvbnRlbnRfYmFja3RyYWNlX2Zvcl9wZXJmb3JtX2lubGluZS5zYXNzJ30sCisgICAgICAgIHs6bWl4aW4gPT4gJ2ZvbycsIDpsaW5lID0+IDIsIDpmaWxlbmFtZSA9PiAndGVzdF9jb250ZW50X2JhY2t0cmFjZV9mb3JfcGVyZm9ybV9pbmxpbmUuc2Fzcyd9LAorICAgICAgICB7OmxpbmUgPT4gNSwgOmZpbGVuYW1lID0+ICd0ZXN0X2NvbnRlbnRfYmFja3RyYWNlX2Zvcl9wZXJmb3JtX2lubGluZS5zYXNzJ30sCisgICAgICBdLCBlLnNhc3NfYmFja3RyYWNlKQorICBlbmQKKworICBkZWYgdGVzdF9jb250ZW50X2JhY2t0cmFjZV9mb3JfY3NzaXplCisgICAgcmVuZGVyKDw8U0FTUykKKz1mb28KKyAgQGNvbnRlbnQKKworYQorICArZm9vCisgICAgQGV4dGVuZCBmb28gYmFyIGJhegorU0FTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIGV4Y2VwdGlvbiIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsKFsKKyAgICAgICAgezptaXhpbiA9PiAnQGNvbnRlbnQnLCA6bGluZSA9PiA2LCA6ZmlsZW5hbWUgPT4gJ3Rlc3RfY29udGVudF9iYWNrdHJhY2VfZm9yX2Nzc2l6ZV9pbmxpbmUuc2Fzcyd9LAorICAgICAgICB7Om1peGluID0+ICdmb28nLCA6bGluZSA9PiAyLCA6ZmlsZW5hbWUgPT4gJ3Rlc3RfY29udGVudF9iYWNrdHJhY2VfZm9yX2Nzc2l6ZV9pbmxpbmUuc2Fzcyd9LAorICAgICAgICB7OmxpbmUgPT4gNSwgOmZpbGVuYW1lID0+ICd0ZXN0X2NvbnRlbnRfYmFja3RyYWNlX2Zvcl9jc3NpemVfaW5saW5lLnNhc3MnfSwKKyAgICAgIF0sIGUuc2Fzc19iYWNrdHJhY2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX3dpdGhfYXJnc19hbmRfdmFyYXJnc19wYXNzZWRfbm9fdmFyX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzeW50YXggPT4gOnNjc3MpCisuZm9vIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogMzsgfQorQ1NTCitAbWl4aW4gdGhyZWUtb3ItbW9yZS1hcmdzKCRhLCAkYiwgJGMsICRyZXN0Li4uKSB7CisgIGE6ICRhOworICBiOiAkYjsKKyAgYzogJGM7Cit9CisKKy5mb28geworICBAaW5jbHVkZSB0aHJlZS1vci1tb3JlLWFyZ3MoJGE6IDEsICRiOiAyLCAkYzogMyk7Cit9CitTQVNTCisKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVidWdfaW5zcGVjdHNfc2Fzc19vYmplY3RzCisgICAgYXNzZXJ0X3dhcm5pbmcoPDxFTkQpIHtyZW5kZXIoIkBkZWJ1ZyAoYTogMSwgYjogMikiKX0KK3Rlc3RfZGVidWdfaW5zcGVjdHNfc2Fzc19vYmplY3RzX2lubGluZS5zYXNzOjEgREVCVUc6IChhOiAxLCBiOiAyKQorRU5ECisgICAgYXNzZXJ0X3dhcm5pbmcoPDxFTkQpIHtyZW5kZXIoIiRtYXA6IChhOiAxLCBiOiAyKTsgQGRlYnVnICRtYXAiLCA6c3ludGF4ID0+IDpzY3NzKX0KK3Rlc3RfZGVidWdfaW5zcGVjdHNfc2Fzc19vYmplY3RzX2lubGluZS5zY3NzOjEgREVCVUc6IChhOiAxLCBiOiAyKQorRU5ECisgIGVuZAorCisgIGRlZiB0ZXN0X2Vycm9yX3Rocm93c19zYXNzX29iamVjdHMKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIihhOiAxLCBiOiAyKSIpIHtyZW5kZXIoIkBlcnJvciAoYTogMSwgYjogMikiKX0KKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIihhOiAxLCBiOiAyKSIpIGRvCisgICAgICByZW5kZXIoIiRtYXA6IChhOiAxLCBiOiAyKTsgQGVycm9yICRtYXAiLCA6c3ludGF4ID0+IDpzY3NzKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9kZWZhdWx0X2FyZ19iZWZvcmVfc3BsYXQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzeW50YXggPT4gOnNjc3MpCisuZm9vLXBvc2l0aW9uYWwgeworICBhOiAxOworICBiOiAyOworICBwb3NpdGlvbmFsLWFyZ3VtZW50czogMywgNDsKKyAga2V5d29yZC1hcmd1bWVudHM6ICgpOyB9CisKKy5mb28ta2V5d29yZHMgeworICBhOiB0cnVlOworICBwb3NpdGlvbmFsLWFyZ3VtZW50czogKCk7CisgIGtleXdvcmQtYXJndW1lbnRzOiAoYzogYywgZDogZCk7IH0KK0NTUworQG1peGluIGZvbygkYTogdHJ1ZSwgJGI6IG51bGwsICRhcmd1bWVudHMuLi4pIHsKKyAgYTogJGE7CisgIGI6ICRiOworICBwb3NpdGlvbmFsLWFyZ3VtZW50czogaW5zcGVjdCgkYXJndW1lbnRzKTsKKyAga2V5d29yZC1hcmd1bWVudHM6IGluc3BlY3Qoa2V5d29yZHMoJGFyZ3VtZW50cykpOworfQorLmZvby1wb3NpdGlvbmFsIHsKKyAgQGluY2x1ZGUgZm9vKDEsIDIsIDMsIDQpOworfQorLmZvby1rZXl3b3JkcyB7CisgIEBpbmNsdWRlIGZvbygkYzogYywgJGQ6IGQpOworfQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9rZXlmcmFtZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitAa2V5ZnJhbWVzIGlkZW50aWZpZXIgeworICAwJSB7CisgICAgdG9wOiAwOworICAgIGxlZnQ6IDA7IH0KKyAgMzAlIHsKKyAgICB0b3A6IDUwcHg7IH0KKyAgNjglLCA3MiUgeworICAgIGxlZnQ6IDUwcHg7IH0KKyAgMTAwJSB7CisgICAgdG9wOiAxMDBweDsKKyAgICBsZWZ0OiAxMDAlOyB9IH0KK0NTUworQGtleWZyYW1lcyBpZGVudGlmaWVyCisgIDAlCisgICAgdG9wOiAwCisgICAgbGVmdDogMAorICBcI3siMzAlIn0KKyAgICB0b3A6IDUwcHgKKyAgNjglLCA3MiUKKyAgICBsZWZ0OiA1MHB4CisgIDEwMCUKKyAgICB0b3A6IDEwMHB4CisgICAgbGVmdDogMTAwJQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9wcmVmaXhlZF9rZXlmcmFtZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCitALW1vei1rZXlmcmFtZXMgaWRlbnRpZmllciB7CisgIDAlIHsKKyAgICB0b3A6IDA7CisgICAgbGVmdDogMDsgfQorICAzMCUgeworICAgIHRvcDogNTBweDsgfQorICA2OCUsIDcyJSB7CisgICAgbGVmdDogNTBweDsgfQorICAxMDAlIHsKKyAgICB0b3A6IDEwMHB4OworICAgIGxlZnQ6IDEwMCU7IH0gfQorQ1NTCitALW1vei1rZXlmcmFtZXMgaWRlbnRpZmllcgorICAwJQorICAgIHRvcDogMAorICAgIGxlZnQ6IDAKKyAgXCN7IjMwJSJ9CisgICAgdG9wOiA1MHB4CisgIDY4JSwgNzIlCisgICAgbGVmdDogNTBweAorICAxMDAlCisgICAgdG9wOiAxMDBweAorICAgIGxlZnQ6IDEwMCUKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXBwZXJjYXNlX2tleWZyYW1lcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUykKK0BLRVlGUkFNRVMgaWRlbnRpZmllciB7CisgIDAlIHsKKyAgICB0b3A6IDA7CisgICAgbGVmdDogMDsgfQorICAzMCUgeworICAgIHRvcDogNTBweDsgfQorICA2OCUsIDcyJSB7CisgICAgbGVmdDogNTBweDsgfQorICAxMDAlIHsKKyAgICB0b3A6IDEwMHB4OworICAgIGxlZnQ6IDEwMCU7IH0gfQorQ1NTCitAS0VZRlJBTUVTIGlkZW50aWZpZXIKKyAgMCUKKyAgICB0b3A6IDAKKyAgICBsZWZ0OiAwCisgIFwjeyIzMCUifQorICAgIHRvcDogNTBweAorICA2OCUsIDcyJQorICAgIGxlZnQ6IDUwcHgKKyAgMTAwJQorICAgIHRvcDogMTAwcHgKKyAgICBsZWZ0OiAxMDAlCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXByZXNzZWRfdW5rbm93bl9kaXJlY3RpdmUKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCit4e0Bmb287YTpiO0BiYXJ9CitDU1MKK3gKKyAgQGZvbworICBhOiBiCisgIEBiYXIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcHJlc3NlZF91bmtub3duX2RpcmVjdGl2ZV9pbl9kaXJlY3RpdmUKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCitAeHtAZm9vO2E6YjtAYmFyfQorQ1NTCitAeAorICBAZm9vCisgIGE6IGIKKyAgQGJhcgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jb21wcmVzc2VkX3Vua25vd25fZGlyZWN0aXZlX3dpdGhfY2hpbGRyZW5faW5fZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpKQorQHh7QGZvb3thOmJ9YzpkO0BiYXJ7ZTpmfX0KK0NTUworQHgKKyAgQGZvbworICAgIGE6IGIKKyAgYzogZAorICBAYmFyCisgICAgZTogZgorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jb21wcmVzc2VkX3J1bGVfaW5fZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpKQorQHh7Zm9ve2E6Yn1jOmQ7YmFye2U6Zn19CitDU1MKK0B4CisgIGZvbworICAgIGE6IGIKKyAgYzogZAorICBiYXIKKyAgICBlOiBmCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF90d29fY3NzX2ZpbGVzX2lzc3VlXzE4MDYKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzeW50YXggPT4gOnNjc3MsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCitAaW1wb3J0IHVybChcImZvby5jc3NcIik7QGltcG9ydCB1cmwoXCJiYXIuY3NzXCIpO0BpbXBvcnQgdXJsKFwiYmF6LmNzc1wiKQorQ1NTCitAaW1wb3J0IHVybCgiZm9vLmNzcyIpOworQGltcG9ydCB1cmwoImJhci5jc3MiKTsKK0BpbXBvcnQgdXJsKCJiYXouY3NzIik7CitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X251bWVyaWNfZm9ybWF0dGluZ19vZl9pbnRlZ2VycworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUywgOnN5bnRheCA9PiA6c2NzcywgOnN0eWxlID0+IDpjb21wcmVzc2VkKSkKK2F7bmVhcjozLjAwMDAwMDAwMDE7cGx1czozO21pbnVzOjM7bmVnYXRpdmU6LTN9CitDU1MKK2EgeworICBuZWFyOiAoMyArIDAuMDAwMDAwMDAwMSk7CisgIHBsdXM6ICgzICsgMC4wMDAwMDAwMDAwMDEpOworICBtaW51czogKDMgLSAwLjAwMDAwMDAwMDAwMSk7CisgIG5lZ2F0aXZlOiAoLTMgKyAwLjAwMDAwMDAwMDAwMSk7Cit9CitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2VzY2FwZWRfc2VtaWNvbG9uc19hcmVfbm90X2NvbXByZXNzZWQKKyAgICBhc3NlcnRfZXF1YWwoPDwnQ1NTJywgcmVuZGVyKDw8J1NBU1MnLCA6c3ludGF4ID0+IDpzY3NzLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpKQorZGl2e2NvbG9yOiNmMDAwMDBcOVwwXDt9CitDU1MKK2RpdiB7CisgY29sb3I6ICNmMDAwMDBcOVwwXDsKK30KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcHJlc3NlZF9vdXRwdXRfb2ZfbnRoX3NlbGVjdG9ycworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUywgOnN5bnRheCA9PiA6c2NzcywgOnN0eWxlID0+IDpjb21wcmVzc2VkKSkKKzpudGgtb2YtdHlwZSgybi0xKSw6bnRoLWNoaWxkKDJuLTEpLDpudGgoMm4tMSksOm50aC1vZi10eXBlKDJuLTEpLDpudGgtb2YtdHlwZSgybi0xKXtjb2xvcjpyZWR9Om50aC1vZi10eXBlKDJuKzEpLDpudGgtY2hpbGQoMm4rMSksOm50aCgybisxKSw6bnRoLW9mLXR5cGUoMm4rMSksOm50aC1vZi10eXBlKDJuKzEpe2NvbG9yOnJlZH0KK0NTUworOm50aC1vZi10eXBlKDJuLTEpLCA6bnRoLWNoaWxkKDJuLSAgMSksIDpudGgoMm4gIC0xKSwgOm50aC1vZi10eXBlKDJuICAtICAxKSwgOm50aC1vZi10eXBlKCAybiAgLSAgMSApIHsKKyAgY29sb3I6IHJlZCB9Cis6bnRoLW9mLXR5cGUoMm4rMSksIDpudGgtY2hpbGQoMm4rICAxKSwgOm50aCgybiAgKzEpLCA6bnRoLW9mLXR5cGUoMm4gICsgIDEpLCA6bnRoLW9mLXR5cGUoIDJuICArICAxICkgeworICBjb2xvcjogcmVkIH0KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVzY2VuZGFudF9zZWxlY3RvcnNfd2l0aF9sZWFkaW5nX2Rhc2gKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzeW50YXggPT4gOnNjc3MsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCithIC1ie2NvbG9yOnJlZH0KK0NTUworYSAtYiB7CisgIGNvbG9yOiByZWQgfQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9pbXBvcnRfd2l0aF9zdXBwb3J0c19jbGF1c2VfaW50ZXJwCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDwnU0FTUycsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCitAaW1wb3J0IHVybCgiZmFsbGJhY2stbGF5b3V0LmNzcyIpIHN1cHBvcnRzKG5vdCAoZGlzcGxheTogZmxleCkpCitDU1MKKyRkaXNwbGF5LXR5cGU6IGZsZXgKK0BpbXBvcnQgdXJsKCJmYWxsYmFjay1sYXlvdXQuY3NzIikgc3VwcG9ydHMobm90IChkaXNwbGF5OiAjeyRkaXNwbGF5LXR5cGV9KSkKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0X3dpdGhfc3VwcG9ydHNfY2xhdXNlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpKQorQGltcG9ydCB1cmwoImZhbGxiYWNrLWxheW91dC5jc3MiKSBzdXBwb3J0cyhub3QgKGRpc3BsYXk6IGZsZXgpKQorQ1NTCitAaW1wb3J0IHVybCgiZmFsbGJhY2stbGF5b3V0LmNzcyIpIHN1cHBvcnRzKG5vdCAoZGlzcGxheTogZmxleCkpCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXByZXNzZWRfY29tbWFzX2luX2F0dHJpYnV0ZV9zZWxlY3RvcnMKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCisuY2xhc3NuYW1lW2E9IjEsIDIsIDMiXSwuYW5vdGhlcltiPSI0LCA1LCA2Il17Y29sb3I6cmVkfQorQ1NTCisuY2xhc3NuYW1lW2E9IjEsIDIsIDMiXSwgLmFub3RoZXJbYj0iNCwgNSwgNiJdCisgIGNvbG9yOiByZWQKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdHJhaWxpbmdfY29tbWFzX2luX2FyZ2xpc3RzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTLCA6c3R5bGUgPT4gOm5lc3RlZCkpCisuaW5jbHVkZXMgeworICBvbmUtcG9zaXRpb25hbC1hcmc6IHBvc2l0aW9uYWwgMSBhOworICB0d28tcG9zaXRpb25hbC1hcmdzOiBwb3NpdGlvbmFsIDIgYSBiOworICBvbmUta2V5d29yZC1hcmc6IGtleXdvcmQgMSB6OworICB0d28ta2V5d29yZC1hcmdzOiBrZXl3b3JkIDIgeSB6OworICBtaXhlZC1hcmdzOiBtaXhlZCAyIHkgejsgfQorCisuY2FsbHMgeworICBvbmUtcG9zaXRpb25hbC1hcmc6IHBvc2l0aW9uYWwgMSBhOworICB0d28tcG9zaXRpb25hbC1hcmdzOiBwb3NpdGlvbmFsIDIgYSBiOworICBvbmUta2V5d29yZC1hcmc6IGtleXdvcmQgMSB6OworICB0d28ta2V5d29yZC1hcmdzOiBrZXl3b3JkIDIgeSB6OworICBtaXhlZC1hcmdzOiBtaXhlZCAyIHkgejsgfQorQ1NTCis9b25lLXBvc2l0aW9uYWwtYXJnKCRhLCkKKyAgb25lLXBvc2l0aW9uYWwtYXJnOiBwb3NpdGlvbmFsIDEgJGEKKworPXR3by1wb3NpdGlvbmFsLWFyZ3MoJGEsICRiLCkKKyAgdHdvLXBvc2l0aW9uYWwtYXJnczogcG9zaXRpb25hbCAyICRhICRiCisKKz1vbmUta2V5d29yZC1hcmcoJGE6IGEsKQorICBvbmUta2V5d29yZC1hcmc6IGtleXdvcmQgMSAkYQorCis9dHdvLWtleXdvcmQtYXJncygkYTogYSwgJGI6IGIsKQorICB0d28ta2V5d29yZC1hcmdzOiBrZXl3b3JkIDIgJGEgJGIKKworPW1peGVkLWFyZ3MoJGEsICRiOiBiLCkKKyAgbWl4ZWQtYXJnczogbWl4ZWQgMiAkYSAkYgorCitAZnVuY3Rpb24gb25lLXBvc2l0aW9uYWwtYXJnKCRhKQorICBAcmV0dXJuIHBvc2l0aW9uYWwgMSAkYQorCitAZnVuY3Rpb24gdHdvLXBvc2l0aW9uYWwtYXJncygkYSwgJGIpCisgIEByZXR1cm4gcG9zaXRpb25hbCAyICRhICRiCisKK0BmdW5jdGlvbiBvbmUta2V5d29yZC1hcmcoJGE6IGEpCisgIEByZXR1cm4ga2V5d29yZCAxICRhCisKK0BmdW5jdGlvbiB0d28ta2V5d29yZC1hcmdzKCRhOiBhLCAkYjogYikKKyAgQHJldHVybiBrZXl3b3JkIDIgJGEgJGIKKworQGZ1bmN0aW9uIG1peGVkLWFyZ3MoJGEsICRiOiBiKQorICBAcmV0dXJuIG1peGVkIDIgJGEgJGIKKworCisuaW5jbHVkZXMKKyAgK29uZS1wb3NpdGlvbmFsLWFyZyhhLCkKKyAgK3R3by1wb3NpdGlvbmFsLWFyZ3MoYSwgYiwpCisgICtvbmUta2V5d29yZC1hcmcoJGE6IHosKQorICArdHdvLWtleXdvcmQtYXJncygkYTogeSwgJGI6IHosKQorICArbWl4ZWQtYXJncyh5LCAkYjogeiwpCisKKworLmNhbGxzCisgIG9uZS1wb3NpdGlvbmFsLWFyZzogb25lLXBvc2l0aW9uYWwtYXJnKGEpCisgIHR3by1wb3NpdGlvbmFsLWFyZ3M6IHR3by1wb3NpdGlvbmFsLWFyZ3MoYSwgYikKKyAgb25lLWtleXdvcmQtYXJnOiBvbmUta2V5d29yZC1hcmcoJGE6IHopCisgIHR3by1rZXl3b3JkLWFyZ3M6IHR3by1rZXl3b3JkLWFyZ3MoJGE6IHksICRiOiB6KQorICBtaXhlZC1hcmdzOiBtaXhlZC1hcmdzKHksICRiOiB6KQorU0FTUworICBlbmQKKworICBwcml2YXRlCisKKyAgZGVmIGFzc2VydF9oYXNoX2hhcyhoYXNoLCBleHBlY3RlZCkKKyAgICBleHBlY3RlZC5lYWNoIGRvIHxrLCB2fAorICAgICAgaWYgdi5uaWw/CisgICAgICAgIGFzc2VydF9uaWwoaGFzaFtrXSkKKyAgICAgIGVsc2UKKyAgICAgICAgYXNzZXJ0X2VxdWFsKHYsIGhhc2hba10pCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9yZW5kZXJzX2VuY29kZWQoY3NzLCBzYXNzKQorICAgIHJlc3VsdCA9IHJlbmRlcihzYXNzKQorICAgIGFzc2VydF9lcXVhbCBjc3MuZW5jb2RpbmcsIHJlc3VsdC5lbmNvZGluZworICAgIGFzc2VydF9lcXVhbCBjc3MsIHJlc3VsdAorICBlbmQKKworICBkZWYgcmVuZGVyKHNhc3MsIG9wdGlvbnMgPSB7fSkKKyAgICBtdW5nZV9maWxlbmFtZSBvcHRpb25zCisgICAgb3B0aW9uc1s6aW1wb3J0ZXJdIHx8PSBNb2NrSW1wb3J0ZXIubmV3CisgICAgU2Fzczo6RW5naW5lLm5ldyhzYXNzLCBvcHRpb25zKS5yZW5kZXIKKyAgZW5kCisKKyAgZGVmIHJlbmRlcnNfY29ycmVjdGx5KG5hbWUsIG9wdGlvbnM9e30pCisgICAgc2Fzc19maWxlICA9IGxvYWRfZmlsZShuYW1lLCAic2FzcyIpCisgICAgY3NzX2ZpbGUgICA9IGxvYWRfZmlsZShuYW1lLCAiY3NzIikKKyAgICBvcHRpb25zWzpmaWxlbmFtZV0gfHw9IGZpbGVuYW1lKG5hbWUsICJzYXNzIikKKyAgICBvcHRpb25zWzpzeW50YXhdIHx8PSA6c2FzcworICAgIG9wdGlvbnNbOmNzc19maWxlbmFtZV0gfHw9IGZpbGVuYW1lKG5hbWUsICJjc3MiKQorICAgIGNzc19yZXN1bHQgPSBTYXNzOjpFbmdpbmUubmV3KHNhc3NfZmlsZSwgb3B0aW9ucykucmVuZGVyCisgICAgYXNzZXJ0X2VxdWFsIGNzc19maWxlLCBjc3NfcmVzdWx0CisgIGVuZAorCisgIGRlZiBsb2FkX2ZpbGUobmFtZSwgdHlwZSA9ICJzYXNzIikKKyAgICBAcmVzdWx0ID0gJycKKyAgICBGaWxlLm5ldyhmaWxlbmFtZShuYW1lLCB0eXBlKSkuZWFjaF9saW5lIHsgfGx8IEByZXN1bHQgKz0gbCB9CisgICAgQHJlc3VsdAorICBlbmQKKworICBkZWYgZmlsZW5hbWUobmFtZSwgdHlwZSkKKyAgICBwYXRoID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvI3t0eXBlID09ICdzYXNzJyA/ICd0ZW1wbGF0ZXMnIDogJ3Jlc3VsdHMnfS8je25hbWV9LiN7dHlwZX0iCisgICAgU2Fzczo6VXRpbC5jbGVhbnBhdGgocGF0aCkudG9fcworICBlbmQKKworICBkZWYgc2Fzc2NfcGF0aCh0ZW1wbGF0ZSkKKyAgICBzYXNzY19wYXRoID0gRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiL3RlbXBsYXRlcy8je3RlbXBsYXRlfS5zYXNzIikKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KCIiLCA6ZmlsZW5hbWUgPT4gc2Fzc2NfcGF0aCwKKyAgICAgIDppbXBvcnRlciA9PiBTYXNzOjpJbXBvcnRlcnM6OkZpbGVzeXN0ZW0ubmV3KCIuIikpCisgICAga2V5ID0gZW5naW5lLnNlbmQoOnNhc3NjX2tleSkKKyAgICBGaWxlLmpvaW4oZW5naW5lLm9wdGlvbnNbOmNhY2hlX2xvY2F0aW9uXSwga2V5KQorICBlbmQKK2VuZAorIApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvZXhlY190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvZXhlY190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhODA1N2UKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9leGVjX3Rlc3QucmIKQEAgLTAsMCArMSw5NSBAQAorcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ2ZpbGV1dGlscycKK3JlcXVpcmUgJ3Nhc3MvdXRpbC90ZXN0JworcmVxdWlyZSAndG1wZGlyJworCitjbGFzcyBFeGVjVGVzdCA8IE1pbmlUZXN0OjpUZXN0CisgIGluY2x1ZGUgU2Fzczo6VXRpbDo6VGVzdAorCisgIGRlZiBzZXR1cAorICAgIEBkaXIgPSBEaXIubWt0bXBkaXIKKyAgZW5kCisKKyAgZGVmIHRlYXJkb3duCisgICAgRmlsZVV0aWxzLnJtX3JmKEBkaXIpCisgICAgY2xlYW5fdXBfc2Fzc2MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2Nzc190X2V4cGFuZGVkCisgICAgc3JjID0gZ2V0X3BhdGgoInNyYy5zY3NzIikKKyAgICBkZXN0ID0gZ2V0X3BhdGgoImRlc3QuY3NzIikKKyAgICB3cml0ZShzcmMsICIucnVsZXNldCB7IG1hcmdpbjogMCB9IikKKyAgICBhc3NlcnQoZXhlYygqJXdbc2NzcyAtLXNvdXJjZW1hcD1ub25lIC10IGV4cGFuZGVkIC0tdW5peC1uZXdsaW5lc10ucHVzaChzcmMsIGRlc3QpKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5ydWxlc2V0IHtcbiAgbWFyZ2luOiAwO1xufVxuIiwgcmVhZChkZXN0KSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2Fzc19jb252ZXJ0X1Rfc2FzcworICAgIHNyYyA9IGdldF9wYXRoKCJzcmMuc2NzcyIpCisgICAgZGVzdCA9IGdldF9wYXRoKCJkZXN0LmNzcyIpCisgICAgd3JpdGUoc3JjLCAiLnJ1bGVzZXQgeyBtYXJnaW46IDAgfSIpCisgICAgYXNzZXJ0KGV4ZWMoKiV3W3Nhc3MtY29udmVydCAtVCBzYXNzIC0tdW5peC1uZXdsaW5lc10ucHVzaChzcmMsIGRlc3QpKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5ydWxlc2V0XG4gIG1hcmdpbjogMFxuIiwgcmVhZChkZXN0KSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2Fzc19jb252ZXJ0X1Rfc2Fzc19pbl9wbGFjZQorICAgIHNyYyA9IGdldF9wYXRoKCJzcmMuc2NzcyIpCisgICAgd3JpdGUoc3JjLCAiLnJ1bGVzZXQgeyBtYXJnaW46IDAgfSIpCisgICAgYXNzZXJ0KGV4ZWMoKiV3W3Nhc3MtY29udmVydCAtVCBzYXNzIC0taW4tcGxhY2UgLS11bml4LW5ld2xpbmVzXS5wdXNoKHNyYykpKQorICAgIGFzc2VydF9lcXVhbCgiLnJ1bGVzZXRcbiAgbWFyZ2luOiAwXG4iLCByZWFkKHNyYykpCisgIGVuZAorCisgIGRlZiB0ZXN0X3Njc3NfdF9leHBhbmRlZF9ub191bml4X25ld2xpbmVzCisgICAgcmV0dXJuIHNraXAgIkNhbiBiZSBydW4gb24gV2luZG93cyBvbmx5IiB1bmxlc3MgU2Fzczo6VXRpbC53aW5kb3dzPworICAgIHNyYyA9IGdldF9wYXRoKCJzcmMuc2NzcyIpCisgICAgZGVzdCA9IGdldF9wYXRoKCJkZXN0LmNzcyIpCisgICAgd3JpdGUoc3JjLCAiLnJ1bGVzZXQgeyBtYXJnaW46IDAgfSIpCisgICAgYXNzZXJ0KGV4ZWMoKiV3W3Njc3MgLXQgZXhwYW5kZWRdLnB1c2goc3JjLCBkZXN0KSkpCisgICAgYXNzZXJ0X2VxdWFsKCIucnVsZXNldCB7XHJcbiAgbWFyZ2luOiAwO1xyXG59XHJcbiIsIHJlYWQoZGVzdCkpCisgIGVuZAorCisgIGRlZiB0ZXN0X3Nhc3NfY29udmVydF9UX3Nhc3Nfbm9fdW5peF9uZXdsaW5lcworICAgIHJldHVybiBza2lwICJDYW4gYmUgcnVuIG9uIFdpbmRvd3Mgb25seSIgdW5sZXNzIFNhc3M6OlV0aWwud2luZG93cz8KKyAgICBzcmMgPSBnZXRfcGF0aCgic3JjLnNjc3MiKQorICAgIGRlc3QgPSBnZXRfcGF0aCgiZGVzdC5zYXNzIikKKyAgICB3cml0ZShzcmMsICIucnVsZXNldCB7IG1hcmdpbjogMCB9IikKKyAgICBhc3NlcnQoZXhlYygqJXdbc2Fzcy1jb252ZXJ0IC1UIHNhc3NdLnB1c2goc3JjLCBkZXN0KSkpCisgICAgYXNzZXJ0X2VxdWFsKCIucnVsZXNldFxyXG4gIG1hcmdpbjogMFxyXG4iLCByZWFkKGRlc3QpKQorICBlbmQKKworICBkZWYgdGVzdF9zYXNzX2NvbnZlcnRfVF9zYXNzX2luX3BsYWNlX25vX3VuaXhfbmV3bGluZXMKKyAgICByZXR1cm4gc2tpcCAiQ2FuIGJlIHJ1biBvbiBXaW5kb3dzIG9ubHkiIHVubGVzcyBTYXNzOjpVdGlsLndpbmRvd3M/CisgICAgc3JjID0gZ2V0X3BhdGgoInNyYy5zY3NzIikKKyAgICB3cml0ZShzcmMsICIucnVsZXNldCB7IG1hcmdpbjogMCB9IikKKyAgICBhc3NlcnQoZXhlYygqJXdbc2Fzcy1jb252ZXJ0IC1UIHNhc3MgLS1pbi1wbGFjZV0ucHVzaChzcmMpKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5ydWxlc2V0XHJcbiAgbWFyZ2luOiAwXHJcbiIsIHJlYWQoc3JjKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2Fzc19jb252ZXJ0X1IKKyAgICBEaXIuY2hkaXIoQGRpcikgZG8KKyAgICAgIHNyYyA9IGdldF9wYXRoKCJzdHlsZXMvc3JjLmNzcyIpCisgICAgICB3cml0ZShzcmMsICIucnVsZXNldCB7IG1hcmdpbjogMCB9IikKKyAgICAgIGFzc2VydChleGVjKCold1tzYXNzLWNvbnZlcnQgLVJxIC0tZnJvbSBjc3MgLS10byBzY3NzIC0tdHJhY2Ugc3R5bGVzXSkpCisgICAgZW5kCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgZ2V0X3BhdGgobmFtZSkKKyAgICBGaWxlLmpvaW4oQGRpciwgbmFtZSkKKyAgZW5kCisKKyAgZGVmIHJlYWQoZmlsZSkKKyAgICBvcGVuKGZpbGUsICdyYicpIHt8ZnwgZi5yZWFkfQorICBlbmQKKworICBkZWYgd3JpdGUoZmlsZSwgY29udGVudCkKKyAgICBGaWxlVXRpbHMubWtkaXJfcChGaWxlLmRpcm5hbWUoZmlsZSkpCisgICAgb3BlbihmaWxlLCAnd2InKSB7fGZ8IGYud3JpdGUoY29udGVudCl9CisgIGVuZAorCisgIGRlZiBleGVjKHNjcmlwdCwgKmFyZ3MpCisgICAgc2NyaXB0ID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vLi4vYmluLycgKyBzY3JpcHQKKyAgICBydWJ5ID0gRmlsZS5qb2luKFJiQ29uZmlnOjpDT05GSUdbJ2JpbmRpciddLCBSYkNvbmZpZzo6Q09ORklHWydydWJ5X2luc3RhbGxfbmFtZSddICsgUmJDb25maWc6OkNPTkZJR1snRVhFRVhUJ10pCisgICAgc3lzdGVtKHJ1YnksIHNjcmlwdCwgKmFyZ3MpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9leHRlbmRfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2V4dGVuZF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlMjYyMTYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9leHRlbmRfdGVzdC5yYgpAQCAtMCwwICsxLDE2NzggQEAKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vdGVzdF9oZWxwZXInCisKK2NsYXNzIEV4dGVuZFRlc3QgPCBNaW5pVGVzdDo6VGVzdAorICBkZWYgdGVzdF9iYXNpYworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28sIC5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28ge2E6IGJ9CisuYmFyIHtAZXh0ZW5kIC5mb299CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vLCAuYmFyIHsKKyAgYTogYjsgfQorQ1NTCisuYmFyIHtAZXh0ZW5kIC5mb299CisuZm9vIHthOiBifQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbywgLmJhciB7CisgIGE6IGI7IH0KKworLmJhciB7CisgIGM6IGQ7IH0KK0NTUworLmZvbyB7YTogYn0KKy5iYXIge2M6IGQ7IEBleHRlbmQgLmZvb30KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28sIC5iYXIgeworICBhOiBiOyB9CisKKy5iYXIgeworICBjOiBkOyB9CitDU1MKKy5mb28ge2E6IGJ9CisuYmFyIHtAZXh0ZW5kIC5mb287IGM6IGR9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2luZGVudGVkX3N5bnRheAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUywgOnN5bnRheCA9PiA6c2FzcykKKy5mb28sIC5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28KKyAgYTogYgorLmJhcgorICBAZXh0ZW5kIC5mb28KK1NBU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0FTUywgOnN5bnRheCA9PiA6c2FzcykKKy5mb28sIC5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28KKyAgYTogYgorLmJhcgorICBAZXh0ZW5kIFwjeyIuZm9vIn0KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlwbGVfdGFyZ2V0cworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28sIC5iYXIgeworICBhOiBiOyB9CisKKy5ibGlwIC5mb28sIC5ibGlwIC5iYXIgeworICBjOiBkOyB9CitDU1MKKy5mb28ge2E6IGJ9CisuYmFyIHtAZXh0ZW5kIC5mb299CisuYmxpcCAuZm9vIHtjOiBkfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tdWx0aXBsZV9leHRlbmRlZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vLCAuYmF6IHsKKyAgYTogYjsgfQorCisuYmFyLCAuYmF6IHsKKyAgYzogZDsgfQorQ1NTCisuZm9vIHthOiBifQorLmJhciB7YzogZH0KKy5iYXoge0BleHRlbmQgLmZvbzsgQGV4dGVuZCAuYmFyfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tdWx0aXBsZV9leHRlbmRzX3dpdGhfc2luZ2xlX2V4dGVuZGVyX2FuZF9zaW5nbGVfdGFyZ2V0CisgICAgYXNzZXJ0X2V4dGVuZHMoJy5mb28gLmJhcicsICcuYmF6IHtAZXh0ZW5kIC5mb287IEBleHRlbmQgLmJhcn0nLAorICAgICAgJy5mb28gLmJhciwgLmJheiAuYmFyLCAuZm9vIC5iYXosIC5iYXogLmJheicpCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5mb28uYmFyJywgJy5iYXoge0BleHRlbmQgLmZvbzsgQGV4dGVuZCAuYmFyfScsICcuZm9vLmJhciwgLmJheicKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlwbGVfZXh0ZW5kc193aXRoX211bHRpcGxlX2V4dGVuZGVyc19hbmRfc2luZ2xlX3RhcmdldAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28gLmJhciwgLmJheiAuYmFyLCAuZm9vIC5iYW5nLCAuYmF6IC5iYW5nIHsKKyAgYTogYjsgfQorQ1NTCisuZm9vIC5iYXIge2E6IGJ9CisuYmF6IHtAZXh0ZW5kIC5mb299CisuYmFuZyB7QGV4dGVuZCAuYmFyfQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvby5iYXIsIC5iYXIuYmF6LCAuYmF6LmJhbmcsIC5mb28uYmFuZyB7CisgIGE6IGI7IH0KK0NTUworLmZvby5iYXIge2E6IGJ9CisuYmF6IHtAZXh0ZW5kIC5mb299CisuYmFuZyB7QGV4dGVuZCAuYmFyfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jaGFpbmVkX2V4dGVuZHMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vLCAuYmFyLCAuYmF6LCAuYmlwIHsKKyAgYTogYjsgfQorQ1NTCisuZm9vIHthOiBifQorLmJhciB7QGV4dGVuZCAuZm9vfQorLmJheiB7QGV4dGVuZCAuYmFyfQorLmJpcCB7QGV4dGVuZCAuYmFyfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9keW5hbWljX2V4dGVuZGVlCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5mb28nLCAnLmJhciB7QGV4dGVuZCAjeyIuZm9vIn19JywgJy5mb28sIC5iYXInCisgICAgYXNzZXJ0X2V4dGVuZHMoJ1tiYXpePSJibGlwMTJweCJdJywgJy5iYXIge0BleHRlbmQgW2Jhel49ImJsaXAjezEycHh9Il19JywKKyAgICAgICdbYmF6Xj0iYmxpcDEycHgiXSwgLmJhcicpCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF90YXJnZXQKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmZvbyAuYmFyJywgJy5iYXoge0BleHRlbmQgLmJhcn0nLCAnLmZvbyAuYmFyLCAuZm9vIC5iYXonCisgIGVuZAorCisgIGRlZiB0ZXN0X3RhcmdldF93aXRoX2NoaWxkCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5mb28gLmJhcicsICcuYmF6IHtAZXh0ZW5kIC5mb299JywgJy5mb28gLmJhciwgLmJheiAuYmFyJworICBlbmQKKworICBkZWYgdGVzdF9jbGFzc191bmlmaWNhdGlvbgorICAgIGFzc2VydF91bmlmaWNhdGlvbiAnLmZvby5iYXInLCAnLmJheiB7QGV4dGVuZCAuZm9vfScsICcuZm9vLmJhciwgLmJhci5iYXonCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcuZm9vLmJheicsICcuYmF6IHtAZXh0ZW5kIC5mb299JywgJy5iYXonCisgIGVuZAorCisgIGRlZiB0ZXN0X2lkX3VuaWZpY2F0aW9uCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcuZm9vLmJhcicsICcjYmF6IHtAZXh0ZW5kIC5mb299JywgJy5mb28uYmFyLCAuYmFyI2JheicKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJy5mb28jYmF6JywgJyNiYXoge0BleHRlbmQgLmZvb30nLCAnI2JheicKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJy5mb28jYmF6JywgJyNiYXIge0BleHRlbmQgLmZvb30nLCAnLmZvbyNiYXonCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuaXZlcnNhbF91bmlmaWNhdGlvbl93aXRoX3NpbXBsZV90YXJnZXQKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJy5mb28nLCAnKiB7QGV4dGVuZCAuZm9vfScsICcuZm9vLCAqJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnLmZvbycsICcqfCoge0BleHRlbmQgLmZvb30nLCAnLmZvbywgKnwqJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnLmZvby5iYXInLCAnKiB7QGV4dGVuZCAuZm9vfScsICcuYmFyJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnLmZvby5iYXInLCAnKnwqIHtAZXh0ZW5kIC5mb299JywgJy5iYXInCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcuZm9vLmJhcicsICduc3wqIHtAZXh0ZW5kIC5mb299JywgJy5mb28uYmFyLCBuc3wqLmJhcicKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5pdmVyc2FsX3VuaWZpY2F0aW9uX3dpdGhfbmFtZXNwYWNlbGVzc191bml2ZXJzYWxfdGFyZ2V0CisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcqLmZvbycsICduc3wqIHtAZXh0ZW5kIC5mb299JywgJyouZm9vJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnKi5mb28nLCAnKiB7QGV4dGVuZCAuZm9vfScsICcqJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnKi5mb28nLCAnKnwqIHtAZXh0ZW5kIC5mb299JywgJyonCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcqfCouZm9vJywgJyoge0BleHRlbmQgLmZvb30nLCAnKnwqLmZvbywgKicKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJyp8Ki5mb28nLCAnKnwqIHtAZXh0ZW5kIC5mb299JywgJyp8KicKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJyp8Ki5mb28nLCAnbnN8KiB7QGV4dGVuZCAuZm9vfScsICcqfCouZm9vLCBuc3wqJworICBlbmQKKworICBkZWYgdGVzdF91bml2ZXJzYWxfdW5pZmljYXRpb25fd2l0aF9uYW1lc3BhY2VkX3VuaXZlcnNhbF90YXJnZXQKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJ25zfCouZm9vJywgJyoge0BleHRlbmQgLmZvb30nLCAnbnN8Ki5mb28nCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICduczF8Ki5mb28nLCAnbnMyfCoge0BleHRlbmQgLmZvb30nLCAnbnMxfCouZm9vJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnbnN8Ki5mb28nLCAnKnwqIHtAZXh0ZW5kIC5mb299JywgJ25zfConCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICduc3wqLmZvbycsICduc3wqIHtAZXh0ZW5kIC5mb299JywgJ25zfConCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuaXZlcnNhbF91bmlmaWNhdGlvbl93aXRoX25hbWVzcGFjZWxlc3NfZWxlbWVudF90YXJnZXQKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJ2EuZm9vJywgJ25zfCoge0BleHRlbmQgLmZvb30nLCAnYS5mb28nCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICdhLmZvbycsICcqIHtAZXh0ZW5kIC5mb299JywgJ2EnCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICdhLmZvbycsICcqfCoge0BleHRlbmQgLmZvb30nLCAnYScKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJyp8YS5mb28nLCAnKiB7QGV4dGVuZCAuZm9vfScsICcqfGEuZm9vLCBhJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnKnxhLmZvbycsICcqfCoge0BleHRlbmQgLmZvb30nLCAnKnxhJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnKnxhLmZvbycsICduc3wqIHtAZXh0ZW5kIC5mb299JywgJyp8YS5mb28sIG5zfGEnCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuaXZlcnNhbF91bmlmaWNhdGlvbl93aXRoX25hbWVzcGFjZWRfZWxlbWVudF90YXJnZXQKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJ25zfGEuZm9vJywgJyoge0BleHRlbmQgLmZvb30nLCAnbnN8YS5mb28nCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICduczF8YS5mb28nLCAnbnMyfCoge0BleHRlbmQgLmZvb30nLCAnbnMxfGEuZm9vJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnbnN8YS5mb28nLCAnKnwqIHtAZXh0ZW5kIC5mb299JywgJ25zfGEnCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICduc3xhLmZvbycsICduc3wqIHtAZXh0ZW5kIC5mb299JywgJ25zfGEnCisgIGVuZAorCisgIGRlZiB0ZXN0X2VsZW1lbnRfdW5pZmljYXRpb25fd2l0aF9zaW1wbGVfdGFyZ2V0CisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcuZm9vJywgJ2Ege0BleHRlbmQgLmZvb30nLCAnLmZvbywgYScKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJy5mb28uYmFyJywgJ2Ege0BleHRlbmQgLmZvb30nLCAnLmZvby5iYXIsIGEuYmFyJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnLmZvby5iYXInLCAnKnxhIHtAZXh0ZW5kIC5mb299JywgJy5mb28uYmFyLCAqfGEuYmFyJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnLmZvby5iYXInLCAnbnN8YSB7QGV4dGVuZCAuZm9vfScsICcuZm9vLmJhciwgbnN8YS5iYXInCisgIGVuZAorCisgIGRlZiB0ZXN0X2VsZW1lbnRfdW5pZmljYXRpb25fd2l0aF9uYW1lc3BhY2VsZXNzX3VuaXZlcnNhbF90YXJnZXQKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJyouZm9vJywgJ25zfGEge0BleHRlbmQgLmZvb30nLCAnKi5mb28nCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcqLmZvbycsICdhIHtAZXh0ZW5kIC5mb299JywgJyouZm9vLCBhJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnKi5mb28nLCAnKnxhIHtAZXh0ZW5kIC5mb299JywgJyouZm9vLCBhJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnKnwqLmZvbycsICdhIHtAZXh0ZW5kIC5mb299JywgJyp8Ki5mb28sIGEnCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcqfCouZm9vJywgJyp8YSB7QGV4dGVuZCAuZm9vfScsICcqfCouZm9vLCAqfGEnCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcqfCouZm9vJywgJ25zfGEge0BleHRlbmQgLmZvb30nLCAnKnwqLmZvbywgbnN8YScKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWxlbWVudF91bmlmaWNhdGlvbl93aXRoX25hbWVzcGFjZWRfdW5pdmVyc2FsX3RhcmdldAorICAgIGFzc2VydF91bmlmaWNhdGlvbiAnbnN8Ki5mb28nLCAnYSB7QGV4dGVuZCAuZm9vfScsICduc3wqLmZvbycKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJ25zMXwqLmZvbycsICduczJ8YSB7QGV4dGVuZCAuZm9vfScsICduczF8Ki5mb28nCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICduc3wqLmZvbycsICcqfGEge0BleHRlbmQgLmZvb30nLCAnbnN8Ki5mb28sIG5zfGEnCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICduc3wqLmZvbycsICduc3xhIHtAZXh0ZW5kIC5mb299JywgJ25zfCouZm9vLCBuc3xhJworICBlbmQKKworICBkZWYgdGVzdF9lbGVtZW50X3VuaWZpY2F0aW9uX3dpdGhfbmFtZXNwYWNlbGVzc19lbGVtZW50X3RhcmdldAorICAgIGFzc2VydF91bmlmaWNhdGlvbiAnYS5mb28nLCAnbnN8YSB7QGV4dGVuZCAuZm9vfScsICdhLmZvbycKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJ2EuZm9vJywgJ2gxIHtAZXh0ZW5kIC5mb299JywgJ2EuZm9vJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnYS5mb28nLCAnYSB7QGV4dGVuZCAuZm9vfScsICdhJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnYS5mb28nLCAnKnxhIHtAZXh0ZW5kIC5mb299JywgJ2EnCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICcqfGEuZm9vJywgJ2Ege0BleHRlbmQgLmZvb30nLCAnKnxhLmZvbywgYScKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJyp8YS5mb28nLCAnKnxhIHtAZXh0ZW5kIC5mb299JywgJyp8YScKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJyp8YS5mb28nLCAnbnN8YSB7QGV4dGVuZCAuZm9vfScsICcqfGEuZm9vLCBuc3xhJworICBlbmQKKworICBkZWYgdGVzdF9lbGVtZW50X3VuaWZpY2F0aW9uX3dpdGhfbmFtZXNwYWNlZF9lbGVtZW50X3RhcmdldAorICAgIGFzc2VydF91bmlmaWNhdGlvbiAnbnN8YS5mb28nLCAnYSB7QGV4dGVuZCAuZm9vfScsICduc3xhLmZvbycKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJ25zMXxhLmZvbycsICduczJ8YSB7QGV4dGVuZCAuZm9vfScsICduczF8YS5mb28nCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICduc3xhLmZvbycsICcqfGEge0BleHRlbmQgLmZvb30nLCAnbnN8YScKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJ25zfGEuZm9vJywgJ25zfGEge0BleHRlbmQgLmZvb30nLCAnbnN8YScKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXR0cmlidXRlX3VuaWZpY2F0aW9uCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICdbZm9vPWJhcl0uYmF6JywgJ1tmb289YmF6XSB7QGV4dGVuZCAuYmF6fScsICdbZm9vPWJhcl0uYmF6LCBbZm9vPWJhcl1bZm9vPWJhel0nCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICdbZm9vPWJhcl0uYmF6JywgJ1tmb29ePWJhcl0ge0BleHRlbmQgLmJhen0nLCAnW2Zvbz1iYXJdLmJheiwgW2Zvbz1iYXJdW2Zvb149YmFyXScKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJ1tmb289YmFyXS5iYXonLCAnW2Zvb3Q9YmFyXSB7QGV4dGVuZCAuYmF6fScsICdbZm9vPWJhcl0uYmF6LCBbZm9vPWJhcl1bZm9vdD1iYXJdJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnW2Zvbz1iYXJdLmJheicsICdbbnN8Zm9vPWJhcl0ge0BleHRlbmQgLmJhen0nLCAnW2Zvbz1iYXJdLmJheiwgW2Zvbz1iYXJdW25zfGZvbz1iYXJdJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnJS1hIFtmb289YmFyXS5iYXInLCAnW2Zvbz1iYXJdIHtAZXh0ZW5kIC5iYXJ9JywgJy1hIFtmb289YmFyXScKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHNldWRvX3VuaWZpY2F0aW9uCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICc6Zm9vLmJheicsICc6Zm9vKDJuKzEpIHtAZXh0ZW5kIC5iYXp9JywgJzpmb28uYmF6LCA6Zm9vOmZvbygybisxKScKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJzpmb28uYmF6JywgJzo6Zm9vIHtAZXh0ZW5kIC5iYXp9JywgJzpmb28uYmF6LCA6Zm9vOjpmb28nCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICc6OmZvby5iYXonLCAnOjpiYXIge0BleHRlbmQgLmJhen0nLCAnOjpmb28uYmF6JworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnOjpmb28uYmF6JywgJzo6Zm9vKDJuKzEpIHtAZXh0ZW5kIC5iYXp9JywgJzo6Zm9vLmJheicKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJzo6Zm9vLmJheicsICc6OmZvbyB7QGV4dGVuZCAuYmF6fScsICc6OmZvbycKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJzo6Zm9vKDJuKzEpLmJheicsICc6OmZvbygybisxKSB7QGV4dGVuZCAuYmF6fScsICc6OmZvbygybisxKScKKyAgICBhc3NlcnRfdW5pZmljYXRpb24gJzpmb28uYmF6JywgJzpiYXIge0BleHRlbmQgLmJhen0nLCAnOmZvby5iYXosIDpmb286YmFyJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnLmJhejpmb28nLCAnOmFmdGVyIHtAZXh0ZW5kIC5iYXp9JywgJy5iYXo6Zm9vLCA6Zm9vOmFmdGVyJworICAgIGFzc2VydF91bmlmaWNhdGlvbiAnLmJhejphZnRlcicsICc6Zm9vIHtAZXh0ZW5kIC5iYXp9JywgJy5iYXo6YWZ0ZXIsIDpmb286YWZ0ZXInCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uICc6Zm9vLmJheicsICc6Zm9vIHtAZXh0ZW5kIC5iYXp9JywgJzpmb28nCisgIGVuZAorCisgIGRlZiB0ZXN0X3BzZXVkb2VsZW1lbnRfcmVtYWluc19hdF9lbmRfb2Zfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmZvbzo6YmFyJywgJy5iYXoge0BleHRlbmQgLmZvb30nLCAnLmZvbzo6YmFyLCAuYmF6OjpiYXInCisgICAgYXNzZXJ0X2V4dGVuZHMgJ2EuZm9vOjpiYXInLCAnLmJheiB7QGV4dGVuZCAuZm9vfScsICdhLmZvbzo6YmFyLCBhLmJhejo6YmFyJworICBlbmQKKworICBkZWYgdGVzdF9wc2V1ZG9jbGFzc19yZW1haW5zX2F0X2VuZF9vZl9zZWxlY3RvcgorICAgIGFzc2VydF9leHRlbmRzICcuZm9vOmJhcicsICcuYmF6IHtAZXh0ZW5kIC5mb299JywgJy5mb286YmFyLCAuYmF6OmJhcicKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYS5mb286YmFyJywgJy5iYXoge0BleHRlbmQgLmZvb30nLCAnYS5mb286YmFyLCBhLmJhejpiYXInCisgIGVuZAorCisgIGRlZiB0ZXN0X2lkX3VuaWZpY2F0aW9uX2FnYWluCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uKCcjaWQuZm9vIC5iYXInLCAnI2lkLmJheiAucXV4IHtAZXh0ZW5kIC5iYXJ9JywKKyAgICAgICAgJyNpZC5mb28gLmJhciwgI2lkLmJhei5mb28gLnF1eCcpCisgIGVuZAorCisgIGRlZiB0ZXN0X3Jvb3RfdW5pZmljYXRpb24KKyAgICBhc3NlcnRfZXh0ZW5kcygKKyAgICAgICIuZm9vOnJvb3QgLmJhciIsCisgICAgICAiLmJhejpyb290IC5xdXgge0BleHRlbmQgLmJhcn0iLAorICAgICAgIi5mb286cm9vdCAuYmFyLCAuYmF6LmZvbzpyb290IC5xdXgiKQorICBlbmQKKworICBkZWYgdGVzdF9ub3RfcmVtYWluc19hdF9lbmRfb2Zfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmZvbzpub3QoLmJhciknLCAnLmJheiB7QGV4dGVuZCAuZm9vfScsICcuZm9vOm5vdCguYmFyKSwgLmJhejpub3QoLmJhciknCisgIGVuZAorCisgIGRlZiB0ZXN0X3BzZXVkb2VsZW1lbnRfZ29lc19sZWZ0ZXJfdGhhbl9wc2V1ZG9jbGFzcworICAgIGFzc2VydF9leHRlbmRzICcuZm9vOjpiYXInLCAnLmJhejpiYW5nIHtAZXh0ZW5kIC5mb299JywgJy5mb286OmJhciwgLmJhejpiYW5nOjpiYXInCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5mb286YmFyJywgJy5iYXo6OmJhbmcge0BleHRlbmQgLmZvb30nLCAnLmZvbzpiYXIsIC5iYXo6YmFyOjpiYW5nJworICBlbmQKKworICBkZWYgdGVzdF9wc2V1ZG9lbGVtZW50X2dvZXNfbGVmdGVyX3RoYW5fbm90CisgICAgYXNzZXJ0X2V4dGVuZHMgJy5mb286OmJhcicsICcuYmF6Om5vdCguYmFuZykge0BleHRlbmQgLmZvb30nLCAnLmZvbzo6YmFyLCAuYmF6Om5vdCguYmFuZyk6OmJhcicKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmZvbzpub3QoLmJhbmcpJywgJy5iYXo6OmJhciB7QGV4dGVuZCAuZm9vfScsICcuZm9vOm5vdCguYmFuZyksIC5iYXo6bm90KC5iYW5nKTo6YmFyJworICBlbmQKKworICBkZWYgdGVzdF9uZWdhdGlvbl91bmlmaWNhdGlvbgorICAgIGFzc2VydF9leHRlbmRzICc6bm90KC5mb28pLmJheicsICc6bm90KC5iYXIpIHtAZXh0ZW5kIC5iYXp9JywgJzpub3QoLmZvbykuYmF6LCA6bm90KC5mb28pOm5vdCguYmFyKScKKyAgICAjIFVuaWZ5aW5nIHRvIDpub3QoLmZvbykgaGVyZSB3b3VsZCByZWR1Y2UgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBvcmlnaW5hbCBzZWxlY3Rvci4KKyAgICBhc3NlcnRfZXh0ZW5kcyAnOm5vdCguZm9vKS5iYXonLCAnOm5vdCguZm9vKSB7QGV4dGVuZCAuYmF6fScsICc6bm90KC5mb28pLmJheiwgOm5vdCguZm9vKScKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHJlZml4ZWRfcHNldWRvY2xhc3NfdW5pZmljYXRpb24KKyAgICBhc3NlcnRfdW5pZmljYXRpb24oCisgICAgICAnOm50aC1jaGlsZCgybisxIG9mIC5mb28pLmJheicsCisgICAgICAnOm50aC1jaGlsZCgybiBvZiAuZm9vKSB7QGV4dGVuZCAuYmF6fScsCisgICAgICAnOm50aC1jaGlsZCgybisxIG9mIC5mb28pLmJheiwgOm50aC1jaGlsZCgybisxIG9mIC5mb28pOm50aC1jaGlsZCgybiBvZiAuZm9vKScpCisKKyAgICBhc3NlcnRfdW5pZmljYXRpb24oCisgICAgICAnOm50aC1jaGlsZCgybisxIG9mIC5mb28pLmJheicsCisgICAgICAnOm50aC1jaGlsZCgybisxIG9mIC5iYXIpIHtAZXh0ZW5kIC5iYXp9JywKKyAgICAgICc6bnRoLWNoaWxkKDJuKzEgb2YgLmZvbykuYmF6LCA6bnRoLWNoaWxkKDJuKzEgb2YgLmZvbyk6bnRoLWNoaWxkKDJuKzEgb2YgLmJhciknKQorCisgICAgYXNzZXJ0X3VuaWZpY2F0aW9uKAorICAgICAgJzpudGgtY2hpbGQoMm4rMSBvZiAuZm9vKS5iYXonLAorICAgICAgJzpudGgtY2hpbGQoMm4rMSBvZiAuZm9vKSB7QGV4dGVuZCAuYmF6fScsCisgICAgICAnOm50aC1jaGlsZCgybisxIG9mIC5mb28pJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX2ludG9fbm90CisgICAgYXNzZXJ0X2V4dGVuZHMoJzpub3QoLmZvbyknLCAnLngge0BleHRlbmQgLmZvb30nLCAnOm5vdCguZm9vKTpub3QoLngpJykKKyAgICBhc3NlcnRfZXh0ZW5kcygnOm5vdCguZm9vLmJhciknLCAnLngge0BleHRlbmQgLmJhcn0nLCAnOm5vdCguZm9vLmJhcik6bm90KC5mb28ueCknKQorICAgIGFzc2VydF9leHRlbmRzKAorICAgICAgJzpub3QoLmZvby5iYXIsIC5iYXouYmFyKScsCisgICAgICAnLngge0BleHRlbmQgLmJhcn0nLAorICAgICAgJzpub3QoLmZvby5iYXIsIC5mb28ueCwgLmJhei5iYXIsIC5iYXoueCknKQorICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRfaW50b19tZXJnZWFibGVfcHNldWRvY2xhc3NlcworICAgIGFzc2VydF9leHRlbmRzKCc6bWF0Y2hlcyguZm9vKScsICcueCB7QGV4dGVuZCAuZm9vfScsICc6bWF0Y2hlcyguZm9vLCAueCknKQorICAgIGFzc2VydF9leHRlbmRzKCc6bWF0Y2hlcyguZm9vLmJhciknLCAnLngge0BleHRlbmQgLmJhcn0nLCAnOm1hdGNoZXMoLmZvby5iYXIsIC5mb28ueCknKQorICAgIGFzc2VydF9leHRlbmRzKAorICAgICAgJzptYXRjaGVzKC5mb28uYmFyLCAuYmF6LmJhciknLAorICAgICAgJy54IHtAZXh0ZW5kIC5iYXJ9JywKKyAgICAgICc6bWF0Y2hlcyguZm9vLmJhciwgLmZvby54LCAuYmF6LmJhciwgLmJhei54KScpCisKKyAgICBhc3NlcnRfZXh0ZW5kcygnOi1tb3otYW55KC5mb28pJywgJy54IHtAZXh0ZW5kIC5mb299JywgJzotbW96LWFueSguZm9vLCAueCknKQorICAgIGFzc2VydF9leHRlbmRzKCc6Y3VycmVudCguZm9vKScsICcueCB7QGV4dGVuZCAuZm9vfScsICc6Y3VycmVudCguZm9vLCAueCknKQorICAgIGFzc2VydF9leHRlbmRzKCc6aGFzKC5mb28pJywgJy54IHtAZXh0ZW5kIC5mb299JywgJzpoYXMoLmZvbywgLngpJykKKyAgICBhc3NlcnRfZXh0ZW5kcygnOmhvc3QoLmZvbyknLCAnLngge0BleHRlbmQgLmZvb30nLCAnOmhvc3QoLmZvbywgLngpJykKKyAgICBhc3NlcnRfZXh0ZW5kcygnOmhvc3QtY29udGV4dCguZm9vKScsICcueCB7QGV4dGVuZCAuZm9vfScsICc6aG9zdC1jb250ZXh0KC5mb28sIC54KScpCisgICAgYXNzZXJ0X2V4dGVuZHMoJzpudGgtY2hpbGQobiBvZiAuZm9vKScsICcueCB7QGV4dGVuZCAuZm9vfScsICc6bnRoLWNoaWxkKG4gb2YgLmZvbywgLngpJykKKyAgICBhc3NlcnRfZXh0ZW5kcygKKyAgICAgICc6bnRoLWxhc3QtY2hpbGQobiBvZiAuZm9vKScsCisgICAgICAnLngge0BleHRlbmQgLmZvb30nLAorICAgICAgJzpudGgtbGFzdC1jaGlsZChuIG9mIC5mb28sIC54KScpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBsZXhfZXh0ZW5kX2ludG9fcHNldWRvY2xhc3MKKyAgICAjIFVubGlrZSBvdGhlciBzZWxlY3RvcnMsIHdlIGRvbid0IGFsbG93IGNvbXBsZXggc2VsZWN0b3JzIHRvIGJlCisgICAgIyBhZGRlZCB0byBgOm5vdGAgaWYgdGhleSB3ZXJlbid0IHRoZXJlIGJlZm9yZS4gQXQgdGltZSBvZgorICAgICMgd3JpdGluZywgbW9zdCBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoYXQgYW5kIHdpbGwgdGhyb3cgYXdheQorICAgICMgdGhlIGVudGlyZSBzZWxlY3RvciBpZiBpdCBleGlzdHMuCisgICAgI2Fzc2VydF9leHRlbmRzKCc6bm90KC5iYXIpJywgJy54IC55IHtAZXh0ZW5kIC5iYXJ9JywgJzpub3QoLmJhciknKQorCisgICAgIyBJZiB0aGUgYDpub3QoKWAgYWxyZWFkeSBoYXMgYSBjb21wbGV4IHNlbGVjdG9yLCB3ZSB3b24ndCBicmVhaworICAgICMgYW55dGhpbmcgYnkgYWRkaW5nIGEgbmV3IG9uZS4KKyAgICBhc3NlcnRfZXh0ZW5kcygnOm5vdCguYmF6IC5iYXIpJywgJy54IC55IHtAZXh0ZW5kIC5iYXJ9JywKKyAgICAgICc6bm90KC5iYXogLmJhcik6bm90KC5iYXogLnggLnkpOm5vdCgueCAuYmF6IC55KScpCisKKyAgICAjIElmIHRoZSBgOm5vdCgpYCB3b3VsZCBvbmx5IGNvbnRhaW4gY29tcGxleCBzZWxlY3RvcnMsIHRoZXJlJ3Mgbm8KKyAgICAjIGhhcm0gaW4gbGV0dGluZyBpdCBjb250aW51ZSB0byBleGlzdC4KKyAgICBhc3NlcnRfZXh0ZW5kcygnOm5vdCglYmFyKScsICcueCAueSB7QGV4dGVuZCAlYmFyfScsICc6bm90KC54IC55KScpCisKKyAgICBhc3NlcnRfZXh0ZW5kcygnOm1hdGNoZXMoLmJhciknLCAnLnggLnkge0BleHRlbmQgLmJhcn0nLCAnOm1hdGNoZXMoLmJhciwgLnggLnkpJykKKyAgICBhc3NlcnRfZXh0ZW5kcygnOmN1cnJlbnQoLmJhciknLCAnLnggLnkge0BleHRlbmQgLmJhcn0nLCAnOmN1cnJlbnQoLmJhciwgLnggLnkpJykKKyAgICBhc3NlcnRfZXh0ZW5kcygnOmhhcyguYmFyKScsICcueCAueSB7QGV4dGVuZCAuYmFyfScsICc6aGFzKC5iYXIsIC54IC55KScpCisgICAgYXNzZXJ0X2V4dGVuZHMoJzpob3N0KC5iYXIpJywgJy54IC55IHtAZXh0ZW5kIC5iYXJ9JywgJzpob3N0KC5iYXIsIC54IC55KScpCisgICAgYXNzZXJ0X2V4dGVuZHMoJzpob3N0LWNvbnRleHQoLmJhciknLCAnLnggLnkge0BleHRlbmQgLmJhcn0nLCAnOmhvc3QtY29udGV4dCguYmFyLCAueCAueSknKQorICAgIGFzc2VydF9leHRlbmRzKAorICAgICAgJzotbW96LWFueSguYmFyKScsCisgICAgICAnLnggLnkge0BleHRlbmQgLmJhcn0nLAorICAgICAgJzotbW96LWFueSguYmFyLCAueCAueSknKQorICAgIGFzc2VydF9leHRlbmRzKAorICAgICAgJzpudGgtY2hpbGQobiBvZiAuYmFyKScsCisgICAgICAnLnggLnkge0BleHRlbmQgLmJhcn0nLAorICAgICAgJzpudGgtY2hpbGQobiBvZiAuYmFyLCAueCAueSknKQorICAgIGFzc2VydF9leHRlbmRzKAorICAgICAgJzpudGgtbGFzdC1jaGlsZChuIG9mIC5iYXIpJywKKyAgICAgICcueCAueSB7QGV4dGVuZCAuYmFyfScsCisgICAgICAnOm50aC1sYXN0LWNoaWxkKG4gb2YgLmJhciwgLnggLnkpJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX292ZXJfc2VsZWN0b3JfcHNldWRvY2xhc3MKKyAgICBhc3NlcnRfZXh0ZW5kcygnOm5vdCguZm9vKScsICcueCB7QGV4dGVuZCA6bm90KC5mb28pfScsICc6bm90KC5mb28pLCAueCcpCisgICAgYXNzZXJ0X2V4dGVuZHMoCisgICAgICAnOm1hdGNoZXMoLmZvbywgLmJhciknLAorICAgICAgJy54IHtAZXh0ZW5kIDptYXRjaGVzKC5mb28sIC5iYXIpfScsCisgICAgICAnOm1hdGNoZXMoLmZvbywgLmJhciksIC54JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWF0Y2hlc193aXRoaW5fbm90CisgICAgYXNzZXJ0X2V4dGVuZHMoCisgICAgICAnOm5vdCguZm9vLCAuYmFyKScsCisgICAgICAnOm1hdGNoZXMoLngsIC55KSB7QGV4dGVuZCAuZm9vfScsCisgICAgICAnOm5vdCguZm9vLCAueCwgLnksIC5iYXIpJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHNldWRvY2xhc3Nlc19tZXJnZQorICAgIGFzc2VydF9leHRlbmRzKCc6bWF0Y2hlcyguZm9vKScsICc6bWF0Y2hlcyguYmFyKSB7QGV4dGVuZCAuZm9vfScsICc6bWF0Y2hlcyguZm9vLCAuYmFyKScpCisgICAgYXNzZXJ0X2V4dGVuZHMoJzotbW96LWFueSguZm9vKScsICc6LW1vei1hbnkoLmJhcikge0BleHRlbmQgLmZvb30nLCAnOi1tb3otYW55KC5mb28sIC5iYXIpJykKKyAgICBhc3NlcnRfZXh0ZW5kcygnOmN1cnJlbnQoLmZvbyknLCAnOmN1cnJlbnQoLmJhcikge0BleHRlbmQgLmZvb30nLCAnOmN1cnJlbnQoLmZvbywgLmJhciknKQorICAgIGFzc2VydF9leHRlbmRzKAorICAgICAgJzpudGgtY2hpbGQobiBvZiAuZm9vKScsCisgICAgICAnOm50aC1jaGlsZChuIG9mIC5iYXIpIHtAZXh0ZW5kIC5mb299JywKKyAgICAgICc6bnRoLWNoaWxkKG4gb2YgLmZvbywgLmJhciknKQorICAgIGFzc2VydF9leHRlbmRzKAorICAgICAgJzpudGgtbGFzdC1jaGlsZChuIG9mIC5mb28pJywKKyAgICAgICc6bnRoLWxhc3QtY2hpbGQobiBvZiAuYmFyKSB7QGV4dGVuZCAuZm9vfScsCisgICAgICAnOm50aC1sYXN0LWNoaWxkKG4gb2YgLmZvbywgLmJhciknKQorICBlbmQKKworICBkZWYgdGVzdF9uZXN0aW5nX3BzZXVkb2NsYXNzZXNfbWVyZ2UKKyAgICBhc3NlcnRfZXh0ZW5kcygnOmhhcyguZm9vKScsICc6aGFzKC5iYXIpIHtAZXh0ZW5kIC5mb299JywgJzpoYXMoLmZvbywgOmhhcyguYmFyKSknKQorICAgIGFzc2VydF9leHRlbmRzKCc6aG9zdCguZm9vKScsICc6aG9zdCguYmFyKSB7QGV4dGVuZCAuZm9vfScsICc6aG9zdCguZm9vLCA6aG9zdCguYmFyKSknKQorICAgIGFzc2VydF9leHRlbmRzKAorICAgICAgJzpob3N0LWNvbnRleHQoLmZvbyknLAorICAgICAgJzpob3N0LWNvbnRleHQoLmJhcikge0BleHRlbmQgLmZvb30nLAorICAgICAgJzpob3N0LWNvbnRleHQoLmZvbywgOmhvc3QtY29udGV4dCguYmFyKSknKQorICBlbmQKKworICBkZWYgdGVzdF9ub3RfdW5pZmllc193aXRoX3VuaXF1ZV92YWx1ZXMKKyAgICBhc3NlcnRfdW5pZmljYXRpb24oJ2ZvbycsICc6bm90KGJhcikge0BleHRlbmQgZm9vfScsICc6bm90KGJhciknKQorICAgIGFzc2VydF91bmlmaWNhdGlvbignI2ZvbycsICc6bm90KCNiYXIpIHtAZXh0ZW5kICNmb299JywgJzpub3QoI2JhciknKQorICBlbmQKKworICBkZWYgdGVzdF9ub3RfYWRkc19ub19zcGVjaWZpY2l0eQorICAgIGFzc2VydF9zcGVjaWZpY2l0eV9lcXVhbHMoJzpub3QoLmZvbyknLCAnLmZvbycpCisgIGVuZAorCisgIGRlZiB0ZXN0X21hdGNoZXNfaGFzX2Ffc3BlY2lmaWNpdHlfcmFuZ2UKKyAgICAjIGA6bWF0Y2hlcyguZm9vLCAjYmFyKWAgaGFzIG1pbmltdW0gc3BlY2lmaWNpdHkgZXF1YWwgdG8gdGhhdCBvZiBgLmZvb2AsCisgICAgIyB3aGljaCBtZWFucyBgOm1hdGNoZXMoLmZvbywgI2JhcikgLmFgIGNhbiBoYXZlIGxlc3Mgc3BlY2lmaWNpdHkgdGhhbgorICAgICMgYCNiLmFgLiBUaHVzIHRoZSBzZWxlY3RvciBnZW5lcmF0ZWQgYnkgYCNiLmFgIHNob3VsZCBiZSBwcmVzZXJ2ZWQuCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorOm1hdGNoZXMoLmZvbywgI2JhcikgLmEsIDptYXRjaGVzKC5mb28sICNiYXIpICNiLmEgeworICBhOiBiOyB9CitDU1MKKzptYXRjaGVzKC5mb28sICNiYXIpICV4IHthOiBifQorLmEge0BleHRlbmQgJXh9CisjYi5hIHtAZXh0ZW5kICV4fQorU0NTUworCisgICAgIyBgOm1hdGNoZXMoLmZvbywgI2JhcilgIGhhcyBtYXhpbXVtIHNwZWNpZmljaXR5IGVxdWFsIHRvIHRoYXQgb2YgYCNiYXJgLAorICAgICMgd2hpY2ggbWVhbnMgYDptYXRjaGVzKC5mb28sICNiYXIpLmJgIGNhbiBoYXZlIGdyZWF0ZXIgc3BlY2lmaWNpdHkgdGhhbiBgLmEKKyAgICAjIC5iYC4gVGh1cyB0aGUgc2VsZWN0b3IgZ2VuZXJhdGVkIGJ5IGA6bWF0Y2hlcyguZm9vLCAjYmFyKS5iYCBzaG91bGQgYmUKKyAgICAjIHByZXNlcnZlZC4KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuYSAuYiwgLmEgLmI6bWF0Y2hlcyguZm9vLCAjYmFyKSB7CisgIGE6IGI7IH0KK0NTUworLmEgJXgge2E6IGJ9CisuYiB7QGV4dGVuZCAleH0KKy5iOm1hdGNoZXMoLmZvbywgI2Jhcikge0BleHRlbmQgJXh9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9pbnRvX25vdF9hbmRfbm9ybWFsX2V4dGVuZAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy54Om5vdCgueSk6bm90KC5iYXIpLCAuZm9vOm5vdCgueSk6bm90KC5iYXIpIHsKKyAgYTogYjsgfQorQ1NTCisueDpub3QoLnkpIHthOiBifQorLmZvbyB7QGV4dGVuZCAueH0KKy5iYXIge0BleHRlbmQgLnl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9pbnRvX21hdGNoZXNfYW5kX25vcm1hbF9leHRlbmQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisueDptYXRjaGVzKC55LCAuYmFyKSwgLmZvbzptYXRjaGVzKC55LCAuYmFyKSB7CisgIGE6IGI7IH0KK0NTUworLng6bWF0Y2hlcygueSkge2E6IGJ9CisuZm9vIHtAZXh0ZW5kIC54fQorLmJhciB7QGV4dGVuZCAueX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlsYXllcl9wc2V1ZG9jbGFzc19leHRlbmQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCis6bWF0Y2hlcygueCwgLmZvbywgLmJhcikgeworICBhOiBiOyB9CitDU1MKKzptYXRjaGVzKC54KSB7YTogYn0KKy5mb28ge0BleHRlbmQgLnh9CisuYmFyIHtAZXh0ZW5kIC5mb299CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3Jvb3Rfb25seV9hbGxvd2VkX2F0X3Jvb3QKKyAgICBhc3NlcnRfZXh0ZW5kcygnOnJvb3QgLmZvbycsICcuYmFyIC5iYXoge0BleHRlbmQgLmZvb30nLAorICAgICAgJzpyb290IC5mb28sIDpyb290IC5iYXIgLmJheicpCisgICAgYXNzZXJ0X2V4dGVuZHMoJy5mb286cm9vdCAuYmFyJywgJy5iYXo6cm9vdCAuYmFuZyB7QGV4dGVuZCAuYmFyfScsCisgICAgICAnLmZvbzpyb290IC5iYXIsIC5iYXouZm9vOnJvb3QgLmJhbmcnKQorICAgIGFzc2VydF9leHRlbmRzKCdodG1sOnJvb3QgLmJhcicsICd4bWw6cm9vdCAuYmFuZyB7QGV4dGVuZCAuYmFyfScsICdodG1sOnJvb3QgLmJhcicpCisgICAgYXNzZXJ0X2V4dGVuZHMoJy5mb286cm9vdCA+IC5iYXIgLngnLCAnLmJhejpyb290IC5iYW5nIC55IHtAZXh0ZW5kIC54fScsCisgICAgICAnLmZvbzpyb290ID4gLmJhciAueCwgLmJhei5mb286cm9vdCA+IC5iYXIgLmJhbmcgLnknKQorICBlbmQKKworICBkZWYgdGVzdF9jb21tYV9leHRlbmRlZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28sIC5iYXogeworICBhOiBiOyB9CisKKy5iYXIsIC5iYXogeworICBjOiBkOyB9CitDU1MKKy5mb28ge2E6IGJ9CisuYmFyIHtjOiBkfQorLmJheiB7QGV4dGVuZCAuZm9vLCAuYmFyfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9yZWR1bmRhbnRfc2VsZWN0b3JfZWxpbWluYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vLmJhciwgLngsIC55IHsKKyAgYTogYjsgfQorQ1NTCisuZm9vLmJhciB7YTogYn0KKy54IHtAZXh0ZW5kIC5mb28sIC5iYXJ9CisueSB7QGV4dGVuZCAuZm9vLCAuYmFyfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfcHNldWRvX3NlbGVjdG9ycworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28gLmJhcjpub3QoLmJheiksIC5iYW5nIC5iYXI6bm90KC5iYXopIHsKKyAgYTogYjsgfQorQ1NTCisuZm9vIHsKKyAgLmJhcjpub3QoLmJheikge2E6IGJ9Cit9CisuYmFuZyB7QGV4dGVuZCAuZm9vfQorU0NTUworICBlbmQKKworICAjIyBMb25nIEV4dGVuZGVlcworCisgIGRlZiB0ZXN0X2xvbmdfZXh0ZW5kZWUKKyAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIHthc3NlcnRfZXh0ZW5kcyAnLmZvby5iYXInLCAnLmJheiB7QGV4dGVuZCAuZm9vLmJhcn0nLCAnLmZvby5iYXIsIC5iYXonfQorREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIDIgb2YgdGVzdF9sb25nX2V4dGVuZGVlX2lubGluZS5zY3NzOgorRXh0ZW5kaW5nIGEgY29tcG91bmQgc2VsZWN0b3IsIC5mb28uYmFyLCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KK1NlZSBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9zYXNzL2lzc3Vlcy8xNTk5IGZvciBkZXRhaWxzLgorV0FSTklORworICBlbmQKKworICBkZWYgdGVzdF9sb25nX2V4dGVuZGVlX3JlcXVpcmVzX2FsbF9zZWxlY3RvcnMKKyAgICBzaWxlbmNlX3dhcm5pbmdzIGRvCisgICAgICBhc3NlcnRfZXh0ZW5kX2RvZXNudF9tYXRjaCgnLmJheicsICcuZm9vLmJhcicsIDpub3RfZm91bmQsIDIpIGRvCisgICAgICAgIHJlbmRlcl9leHRlbmRzICcuZm9vJywgJy5iYXoge0BleHRlbmQgLmZvby5iYXJ9JworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvbmdfZXh0ZW5kZWVfbWF0Y2hlc19zdXBlcnNldHMKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfZXh0ZW5kcyAnLmZvby5iYXIuYmFwJywgJy5iYXoge0BleHRlbmQgLmZvby5iYXJ9JywgJy5mb28uYmFyLmJhcCwgLmJhcC5iYXonfQorICBlbmQKKworICBkZWYgdGVzdF9sb25nX2V4dGVuZGVlX3J1bnNfdW5pZmljYXRpb24KKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfZXh0ZW5kcyAnbnN8Ki5mb28uYmFyJywgJyp8YS5iYXoge0BleHRlbmQgLmZvby5iYXJ9JywgJ25zfCouZm9vLmJhciwgbnN8YS5iYXonfQorICBlbmQKKworICAjIyBMb25nIEV4dGVuZGVycworCisgIGRlZiB0ZXN0X2xvbmdfZXh0ZW5kZXIKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmZvby5iYXInLCAnLmJhei5iYW5nIHtAZXh0ZW5kIC5mb299JywgJy5mb28uYmFyLCAuYmFyLmJhei5iYW5nJworICBlbmQKKworICBkZWYgdGVzdF9sb25nX2V4dGVuZGVyX3J1bnNfdW5pZmljYXRpb24KKyAgICBhc3NlcnRfZXh0ZW5kcyAnbnN8Ki5mb28uYmFyJywgJyp8YS5iYXoge0BleHRlbmQgLmZvb30nLCAnbnN8Ki5mb28uYmFyLCBuc3xhLmJhci5iYXonCisgIGVuZAorCisgIGRlZiB0ZXN0X2xvbmdfZXh0ZW5kZXJfZG9lc250X3VuaWZ5CisgICAgYXNzZXJ0X2V4dGVuZHMgJ2EuZm9vI2JhcicsICdoMS5iYXoge0BleHRlbmQgLmZvb30nLCAnYS5mb28jYmFyJworICAgIGFzc2VydF9leHRlbmRzICdhLmZvbyNiYXInLCAnLmJhbmcjYmF6IHtAZXh0ZW5kIC5mb299JywgJ2EuZm9vI2JhcicKKyAgZW5kCisKKyAgIyMgTmVzdGVkIEV4dGVuZGVycworCisgIGRlZiB0ZXN0X25lc3RlZF9leHRlbmRlcgorICAgIGFzc2VydF9leHRlbmRzICcuZm9vJywgJ2ZvbyBiYXIge0BleHRlbmQgLmZvb30nLCAnLmZvbywgZm9vIGJhcicKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZGVyX3J1bnNfdW5pZmljYXRpb24KKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmZvby5iYXInLCAnZm9vIGJhciB7QGV4dGVuZCAuZm9vfScsICcuZm9vLmJhciwgZm9vIGJhci5iYXInCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9leHRlbmRlcl9kb2VzbnRfdW5pZnkKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYmF6LmZvbycsICdmb28gYmFyIHtAZXh0ZW5kIC5mb299JywgJ2Jhei5mb28nCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9leHRlbmRlcl9hbHRlcm5hdGVzX3BhcmVudHMKKyAgICBhc3NlcnRfZXh0ZW5kcygnLmJheiAuYmlwIC5mb28nLCAnZm9vIC5ncmFuayBiYXIge0BleHRlbmQgLmZvb30nLAorICAgICAgJy5iYXogLmJpcCAuZm9vLCAuYmF6IC5iaXAgZm9vIC5ncmFuayBiYXIsIGZvbyAuZ3JhbmsgLmJheiAuYmlwIGJhcicpCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9leHRlbmRlcl91bmlmaWVzX2lkZW50aWNhbF9wYXJlbnRzCisgICAgYXNzZXJ0X2V4dGVuZHMoJy5iYXogLmJpcCAuZm9vJywgJy5iYXogLmJpcCBiYXIge0BleHRlbmQgLmZvb30nLAorICAgICAgJy5iYXogLmJpcCAuZm9vLCAuYmF6IC5iaXAgYmFyJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZGVyX3VuaWZpZXNfY29tbW9uX3N1YnN0cmluZworICAgIGFzc2VydF9leHRlbmRzKCcuYmF6IC5iaXAgLmJhcCAuYmluayAuZm9vJywgJy5icmF0IC5iaXAgLmJhcCBiYXIge0BleHRlbmQgLmZvb30nLAorICAgICAgJy5iYXogLmJpcCAuYmFwIC5iaW5rIC5mb28sIC5iYXogLmJyYXQgLmJpcCAuYmFwIC5iaW5rIGJhciwgLmJyYXQgLmJheiAuYmlwIC5iYXAgLmJpbmsgYmFyJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZGVyX3VuaWZpZXNfY29tbW9uX3N1YnNlcQorICAgIGFzc2VydF9leHRlbmRzKCcuYSAueCAuYiAueSAuZm9vJywgJy5hIC5uIC5iIC5tIGJhciB7QGV4dGVuZCAuZm9vfScsCisgICAgICAnLmEgLnggLmIgLnkgLmZvbywgLmEgLnggLm4gLmIgLnkgLm0gYmFyLCAuYSAubiAueCAuYiAueSAubSBiYXIsIC5hIC54IC5uIC5iIC5tIC55IGJhciwgLmEgLm4gLnggLmIgLm0gLnkgYmFyJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZGVyX2Nob29zZXNfZmlyc3Rfc3Vic2VxCisgICAgYXNzZXJ0X2V4dGVuZHMoJy5hIC5iIC5jIC5kIC5mb28nLCAnLmMgLmQgLmEgLmIgLmJhciB7QGV4dGVuZCAuZm9vfScsCisgICAgICAnLmEgLmIgLmMgLmQgLmZvbywgLmEgLmIgLmMgLmQgLmEgLmIgLmJhcicpCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9leHRlbmRlcl9jb3VudHNfZXh0ZW5kZWRfc3Vic2VsZWN0b3JzCisgICAgYXNzZXJ0X2V4dGVuZHMoJy5hIC5iaXAuYm9wIC5mb28nLCAnLmIgLmJpcCAuYmFyIHtAZXh0ZW5kIC5mb299JywKKyAgICAgICcuYSAuYmlwLmJvcCAuZm9vLCAuYSAuYiAuYmlwLmJvcCAuYmFyLCAuYiAuYSAuYmlwLmJvcCAuYmFyJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZGVyX2NvdW50c19leHRlbmRlZF9zdXBlcnNlbGVjdG9ycworICAgIGFzc2VydF9leHRlbmRzKCcuYSAuYmlwIC5mb28nLCAnLmIgLmJpcC5ib3AgLmJhciB7QGV4dGVuZCAuZm9vfScsCisgICAgICAnLmEgLmJpcCAuZm9vLCAuYSAuYiAuYmlwLmJvcCAuYmFyLCAuYiAuYSAuYmlwLmJvcCAuYmFyJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZGVyX3dpdGhfY2hpbGRfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmJheiAuZm9vJywgJ2ZvbyA+IGJhciB7QGV4dGVuZCAuZm9vfScsICcuYmF6IC5mb28sIC5iYXogZm9vID4gYmFyJworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZXh0ZW5kZXJfZmluZHNfY29tbW9uX3NlbGVjdG9yc19hcm91bmRfY2hpbGRfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYSA+IGIgYyAuYzEnLCAnYSBjIC5jMiB7QGV4dGVuZCAuYzF9JywgJ2EgPiBiIGMgLmMxLCBhID4gYiBjIC5jMicKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYSA+IGIgYyAuYzEnLCAnYiBjIC5jMiB7QGV4dGVuZCAuYzF9JywgJ2EgPiBiIGMgLmMxLCBhID4gYiBjIC5jMicKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZGVyX2RvZXNudF9maW5kX2NvbW1vbl9zZWxlY3RvcnNfYXJvdW5kX2FkamFjZW50X3NpYmxpbmdfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYSArIGIgYyAuYzEnLCAnYSBjIC5jMiB7QGV4dGVuZCAuYzF9JywgJ2EgKyBiIGMgLmMxLCBhICsgYiBhIGMgLmMyLCBhIGEgKyBiIGMgLmMyJworICAgIGFzc2VydF9leHRlbmRzICdhICsgYiBjIC5jMScsICdhIGIgLmMyIHtAZXh0ZW5kIC5jMX0nLCAnYSArIGIgYyAuYzEsIGEgYSArIGIgYyAuYzInCisgICAgYXNzZXJ0X2V4dGVuZHMgJ2EgKyBiIGMgLmMxJywgJ2IgYyAuYzIge0BleHRlbmQgLmMxfScsICdhICsgYiBjIC5jMSwgYSArIGIgYyAuYzInCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9leHRlbmRlcl9kb2VzbnRfZmluZF9jb21tb25fc2VsZWN0b3JzX2Fyb3VuZF9zaWJsaW5nX3NlbGVjdG9yCisgICAgYXNzZXJ0X2V4dGVuZHMgJ2EgfiBiIGMgLmMxJywgJ2EgYyAuYzIge0BleHRlbmQgLmMxfScsICdhIH4gYiBjIC5jMSwgYSB+IGIgYSBjIC5jMiwgYSBhIH4gYiBjIC5jMicKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYSB+IGIgYyAuYzEnLCAnYSBiIC5jMiB7QGV4dGVuZCAuYzF9JywgJ2EgfiBiIGMgLmMxLCBhIGEgfiBiIGMgLmMyJworICAgIGFzc2VydF9leHRlbmRzICdhIH4gYiBjIC5jMScsICdiIGMgLmMyIHtAZXh0ZW5kIC5jMX0nLCAnYSB+IGIgYyAuYzEsIGEgfiBiIGMgLmMyJworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZXh0ZW5kZXJfZG9lc250X2ZpbmRfY29tbW9uX3NlbGVjdG9yc19hcm91bmRfcmVmZXJlbmNlX3NlbGVjdG9yCisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X2V4dGVuZHMgJ2EgL2Zvci8gYiBjIC5jMScsICdhIGMgLmMyIHtAZXh0ZW5kIC5jMX0nLCAnYSAvZm9yLyBiIGMgLmMxLCBhIC9mb3IvIGIgYSBjIC5jMiwgYSBhIC9mb3IvIGIgYyAuYzInfQorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9leHRlbmRzICdhIC9mb3IvIGIgYyAuYzEnLCAnYSBiIC5jMiB7QGV4dGVuZCAuYzF9JywgJ2EgL2Zvci8gYiBjIC5jMSwgYSBhIC9mb3IvIGIgYyAuYzInfQorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9leHRlbmRzICdhIC9mb3IvIGIgYyAuYzEnLCAnYiBjIC5jMiB7QGV4dGVuZCAuYzF9JywgJ2EgL2Zvci8gYiBjIC5jMSwgYSAvZm9yLyBiIGMgLmMyJ30KKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZGVyX3dpdGhfZWFybHlfY2hpbGRfc2VsZWN0b3JzX2RvZXNudF9zdWJzZXFfdGhlbQorICAgIGFzc2VydF9leHRlbmRzKCcuYmlwID4gLmJhcCAuZm9vJywgJy5ncmlwID4gLmJhcCAuYmFyIHtAZXh0ZW5kIC5mb299JywKKyAgICAgICcuYmlwID4gLmJhcCAuZm9vLCAuYmlwID4gLmJhcCAuZ3JpcCA+IC5iYXAgLmJhciwgLmdyaXAgPiAuYmFwIC5iaXAgPiAuYmFwIC5iYXInKQorICAgIGFzc2VydF9leHRlbmRzKCcuYmFwID4gLmJpcCAuZm9vJywgJy5iYXAgPiAuZ3JpcCAuYmFyIHtAZXh0ZW5kIC5mb299JywKKyAgICAgICcuYmFwID4gLmJpcCAuZm9vLCAuYmFwID4gLmJpcCAuYmFwID4gLmdyaXAgLmJhciwgLmJhcCA+IC5ncmlwIC5iYXAgPiAuYmlwIC5iYXInKQorICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZXh0ZW5kZXJfd2l0aF9jaGlsZF9zZWxlY3Rvcl91bmlmaWVzCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5iYXouZm9vJywgJ2ZvbyA+IGJhciB7QGV4dGVuZCAuZm9vfScsICcuYmF6LmZvbywgZm9vID4gYmFyLmJheicKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5iYXogPiAuZm9vLCAuYmF6ID4gLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmJheiA+IHsKKyAgLmZvbyB7YTogYn0KKyAgLmJhciB7QGV4dGVuZCAuZm9vfQorfQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyAuYmFyLCAuZm9vID4gLmJheiB7CisgIGE6IGI7IH0KK0NTUworLmZvbyB7CisgIC5iYXIge2E6IGJ9CisgID4gLmJheiB7QGV4dGVuZCAuYmFyfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZXh0ZW5kZXJfd2l0aF9lYXJseV9jaGlsZF9zZWxlY3RvcgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28gLmJhciwgLmZvbyAuYmlwID4gLmJheiB7CisgIGE6IGI7IH0KK0NTUworLmZvbyB7CisgIC5iYXIge2E6IGJ9CisgIC5iaXAgPiAuYmF6IHtAZXh0ZW5kIC5iYXJ9Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIC5iaXAgLmJhciwgLmZvbyAuYmlwIC5mb28gPiAuYmF6IHsKKyAgYTogYjsgfQorQ1NTCisuZm9vIHsKKyAgLmJpcCAuYmFyIHthOiBifQorICA+IC5iYXoge0BleHRlbmQgLmJhcn0KK30KK1NDU1MKKworICAgIGFzc2VydF9leHRlbmRzICcuZm9vID4gLmJhcicsICcuYmlwICsgLmJheiB7QGV4dGVuZCAuYmFyfScsICcuZm9vID4gLmJhciwgLmZvbyA+IC5iaXAgKyAuYmF6JworICAgIGFzc2VydF9leHRlbmRzICcuZm9vICsgLmJhcicsICcuYmlwID4gLmJheiB7QGV4dGVuZCAuYmFyfScsICcuZm9vICsgLmJhciwgLmJpcCA+IC5mb28gKyAuYmF6JworICAgIGFzc2VydF9leHRlbmRzICcuZm9vID4gLmJhcicsICcuYmlwID4gLmJheiB7QGV4dGVuZCAuYmFyfScsICcuZm9vID4gLmJhciwgLmJpcC5mb28gPiAuYmF6JworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZXh0ZW5kZXJfd2l0aF90cmFpbGluZ19jaGlsZF9zZWxlY3RvcgorICAgIGFzc2VydF9yYWlzZXMoU2Fzczo6U3ludGF4RXJyb3IsICJiYXIgPiBjYW4ndCBleHRlbmQ6IGludmFsaWQgc2VsZWN0b3IiKSBkbworICAgICAgcmVuZGVyKCJiYXIgPiB7QGV4dGVuZCAuYmF6fSIpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9leHRlbmRlcl93aXRoX3NpYmxpbmdfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmJheiAuZm9vJywgJ2ZvbyArIGJhciB7QGV4dGVuZCAuZm9vfScsICcuYmF6IC5mb28sIC5iYXogZm9vICsgYmFyJworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZXh0ZW5kZXJfd2l0aF9oYWNreV9zZWxlY3RvcgorICAgIGFzc2VydF9leHRlbmRzKCcuYmF6IC5mb28nLCAnZm9vICsgPiA+ICsgYmFyIHtAZXh0ZW5kIC5mb299JywKKyAgICAgICcuYmF6IC5mb28sIC5iYXogZm9vICsgPiA+ICsgYmFyLCBmb28gLmJheiArID4gPiArIGJhcicpCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5iYXogLmZvbycsICc+ID4gYmFyIHtAZXh0ZW5kIC5mb299JywgJy5iYXogLmZvbywgPiA+IC5iYXogYmFyJworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZXh0ZW5kZXJfbWVyZ2VzX3dpdGhfc2FtZV9zZWxlY3RvcgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28gLmJhciwgLmZvbyAuYmF6IHsKKyAgYTogYjsgfQorQ1NTCisuZm9vIHsKKyAgLmJhciB7YTogYn0KKyAgLmJheiB7QGV4dGVuZCAuYmFyfSB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9leHRlbmRlcl93aXRoX2NoaWxkX3NlbGVjdG9yX21lcmdlc193aXRoX3NhbWVfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXh0ZW5kcygnLmZvbyA+IC5iYXIgLmJheicsICcuZm9vID4gLmJhciAuYmFuZyB7QGV4dGVuZCAuYmF6fScsCisgICAgICAnLmZvbyA+IC5iYXIgLmJheiwgLmZvbyA+IC5iYXIgLmJhbmcnKQorICBlbmQKKworICAjIENvbWJpbmF0b3IgVW5pZmljYXRpb24KKworICBkZWYgdGVzdF9jb21iaW5hdG9yX3VuaWZpY2F0aW9uX2Zvcl9oYWNreV9jb21iaW5hdG9ycworICAgIGFzc2VydF9leHRlbmRzICcuYSA+ICsgeCcsICcuYiB5IHtAZXh0ZW5kIHh9JywgJy5hID4gKyB4LCAuYSAuYiA+ICsgeSwgLmIgLmEgPiArIHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hIHgnLCAnLmIgPiArIHkge0BleHRlbmQgeH0nLCAnLmEgeCwgLmEgLmIgPiArIHksIC5iIC5hID4gKyB5JworICAgIGFzc2VydF9leHRlbmRzICcuYSA+ICsgeCcsICcuYiA+ICsgeSB7QGV4dGVuZCB4fScsICcuYSA+ICsgeCwgLmEgLmIgPiArIHksIC5iIC5hID4gKyB5JworICAgIGFzc2VydF9leHRlbmRzICcuYSB+ID4gKyB4JywgJy5iID4gKyB5IHtAZXh0ZW5kIHh9JywgJy5hIH4gPiArIHgsIC5hIC5iIH4gPiArIHksIC5iIC5hIH4gPiArIHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hICsgPiB4JywgJy5iID4gKyB5IHtAZXh0ZW5kIHh9JywgJy5hICsgPiB4JworICAgIGFzc2VydF9leHRlbmRzICcuYSArID4geCcsICcuYiA+ICsgeSB7QGV4dGVuZCB4fScsICcuYSArID4geCcKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgfiA+ICsgLmIgPiB4JywgJy5jID4gKyAuZCA+IHkge0BleHRlbmQgeH0nLCAnLmEgfiA+ICsgLmIgPiB4LCAuYSAuYyB+ID4gKyAuZC5iID4geSwgLmMgLmEgfiA+ICsgLmQuYiA+IHknCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbWJpbmF0b3JfdW5pZmljYXRpb25fZG91YmxlX3RpbGRlCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hLmIgfiB4JywgJy5hIH4geSB7QGV4dGVuZCB4fScsICcuYS5iIH4geCwgLmEuYiB+IHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hIH4geCcsICcuYS5iIH4geSB7QGV4dGVuZCB4fScsICcuYSB+IHgsIC5hLmIgfiB5JworICAgIGFzc2VydF9leHRlbmRzICcuYSB+IHgnLCAnLmIgfiB5IHtAZXh0ZW5kIHh9JywgJy5hIH4geCwgLmEgfiAuYiB+IHksIC5iIH4gLmEgfiB5LCAuYi5hIH4geScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYS5hIH4geCcsICdiLmIgfiB5IHtAZXh0ZW5kIHh9JywgJ2EuYSB+IHgsIGEuYSB+IGIuYiB+IHksIGIuYiB+IGEuYSB+IHknCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbWJpbmF0b3JfdW5pZmljYXRpb25fdGlsZGVfcGx1cworICAgIGFzc2VydF9leHRlbmRzICcuYS5iICsgeCcsICcuYSB+IHkge0BleHRlbmQgeH0nLCAnLmEuYiArIHgsIC5hLmIgKyB5JworICAgIGFzc2VydF9leHRlbmRzICcuYSArIHgnLCAnLmEuYiB+IHkge0BleHRlbmQgeH0nLCAnLmEgKyB4LCAuYS5iIH4gLmEgKyB5LCAuYS5iICsgeScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgKyB4JywgJy5iIH4geSB7QGV4dGVuZCB4fScsICcuYSArIHgsIC5iIH4gLmEgKyB5LCAuYi5hICsgeScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYS5hICsgeCcsICdiLmIgfiB5IHtAZXh0ZW5kIHh9JywgJ2EuYSArIHgsIGIuYiB+IGEuYSArIHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hLmIgfiB4JywgJy5hICsgeSB7QGV4dGVuZCB4fScsICcuYS5iIH4geCwgLmEuYiB+IC5hICsgeSwgLmEuYiArIHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hIH4geCcsICcuYS5iICsgeSB7QGV4dGVuZCB4fScsICcuYSB+IHgsIC5hLmIgKyB5JworICAgIGFzc2VydF9leHRlbmRzICcuYSB+IHgnLCAnLmIgKyB5IHtAZXh0ZW5kIHh9JywgJy5hIH4geCwgLmEgfiAuYiArIHksIC5hLmIgKyB5JworICAgIGFzc2VydF9leHRlbmRzICdhLmEgfiB4JywgJ2IuYiArIHkge0BleHRlbmQgeH0nLCAnYS5hIH4geCwgYS5hIH4gYi5iICsgeScKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tYmluYXRvcl91bmlmaWNhdGlvbl9hbmdsZV9zaWJsaW5nCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hID4geCcsICcuYiB+IHkge0BleHRlbmQgeH0nLCAnLmEgPiB4LCAuYSA+IC5iIH4geScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgPiB4JywgJy5iICsgeSB7QGV4dGVuZCB4fScsICcuYSA+IHgsIC5hID4gLmIgKyB5JworICAgIGFzc2VydF9leHRlbmRzICcuYSB+IHgnLCAnLmIgPiB5IHtAZXh0ZW5kIHh9JywgJy5hIH4geCwgLmIgPiAuYSB+IHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hICsgeCcsICcuYiA+IHkge0BleHRlbmQgeH0nLCAnLmEgKyB4LCAuYiA+IC5hICsgeScKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tYmluYXRvcl91bmlmaWNhdGlvbl9kb3VibGVfYW5nbGUKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEuYiA+IHgnLCAnLmIgPiB5IHtAZXh0ZW5kIHh9JywgJy5hLmIgPiB4LCAuYi5hID4geScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgPiB4JywgJy5hLmIgPiB5IHtAZXh0ZW5kIHh9JywgJy5hID4geCwgLmEuYiA+IHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hID4geCcsICcuYiA+IHkge0BleHRlbmQgeH0nLCAnLmEgPiB4LCAuYi5hID4geScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYS5hID4geCcsICdiLmIgPiB5IHtAZXh0ZW5kIHh9JywgJ2EuYSA+IHgnCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbWJpbmF0b3JfdW5pZmljYXRpb25fZG91YmxlX3BsdXMKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEuYiArIHgnLCAnLmIgKyB5IHtAZXh0ZW5kIHh9JywgJy5hLmIgKyB4LCAuYi5hICsgeScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgKyB4JywgJy5hLmIgKyB5IHtAZXh0ZW5kIHh9JywgJy5hICsgeCwgLmEuYiArIHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hICsgeCcsICcuYiArIHkge0BleHRlbmQgeH0nLCAnLmEgKyB4LCAuYi5hICsgeScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnYS5hICsgeCcsICdiLmIgKyB5IHtAZXh0ZW5kIHh9JywgJ2EuYSArIHgnCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbWJpbmF0b3JfdW5pZmljYXRpb25fYW5nbGVfc3BhY2UKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEuYiA+IHgnLCAnLmEgeSB7QGV4dGVuZCB4fScsICcuYS5iID4geCwgLmEuYiA+IHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hID4geCcsICcuYS5iIHkge0BleHRlbmQgeH0nLCAnLmEgPiB4LCAuYS5iIC5hID4geScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgPiB4JywgJy5iIHkge0BleHRlbmQgeH0nLCAnLmEgPiB4LCAuYiAuYSA+IHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hLmIgeCcsICcuYSA+IHkge0BleHRlbmQgeH0nLCAnLmEuYiB4LCAuYS5iIC5hID4geScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgeCcsICcuYS5iID4geSB7QGV4dGVuZCB4fScsICcuYSB4LCAuYS5iID4geScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgeCcsICcuYiA+IHkge0BleHRlbmQgeH0nLCAnLmEgeCwgLmEgLmIgPiB5JworICBlbmQKKworICBkZWYgdGVzdF9jb21iaW5hdG9yX3VuaWZpY2F0aW9uX3BsdXNfc3BhY2UKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEuYiArIHgnLCAnLmEgeSB7QGV4dGVuZCB4fScsICcuYS5iICsgeCwgLmEgLmEuYiArIHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hICsgeCcsICcuYS5iIHkge0BleHRlbmQgeH0nLCAnLmEgKyB4LCAuYS5iIC5hICsgeScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgKyB4JywgJy5iIHkge0BleHRlbmQgeH0nLCAnLmEgKyB4LCAuYiAuYSArIHknCisgICAgYXNzZXJ0X2V4dGVuZHMgJy5hLmIgeCcsICcuYSArIHkge0BleHRlbmQgeH0nLCAnLmEuYiB4LCAuYS5iIC5hICsgeScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgeCcsICcuYS5iICsgeSB7QGV4dGVuZCB4fScsICcuYSB4LCAuYSAuYS5iICsgeScKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmEgeCcsICcuYiArIHkge0BleHRlbmQgeH0nLCAnLmEgeCwgLmEgLmIgKyB5JworICBlbmQKKworICBkZWYgdGVzdF9jb21iaW5hdG9yX3VuaWZpY2F0aW9uX25lc3RlZAorICAgIGFzc2VydF9leHRlbmRzICcuYSA+IC5iICsgeCcsICcuYyA+IC5kICsgeSB7QGV4dGVuZCB4fScsICcuYSA+IC5iICsgeCwgLmMuYSA+IC5kLmIgKyB5JworICAgIGFzc2VydF9leHRlbmRzICcuYSA+IC5iICsgeCcsICcuYyA+IHkge0BleHRlbmQgeH0nLCAnLmEgPiAuYiArIHgsIC5jLmEgPiAuYiArIHknCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbWJpbmF0b3JfdW5pZmljYXRpb25fd2l0aF9uZXdsaW5lcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5hID4KKy5iCisrIHgsIC5jLmEgPiAuZC5iICsgeSB7CisgIGE6IGI7IH0KK0NTUworLmEgPgorLmIKKysgeCB7YTogYn0KKy5jCis+IC5kICsKK3kge0BleHRlbmQgeH0KK1NDU1MKKyAgZW5kCisKKyAgIyBMb29wcworCisgIGRlZiB0ZXN0X2V4dGVuZF9zZWxmX2xvb3AKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogYjsgfQorQ1NTCisuZm9vIHthOiBiOyBAZXh0ZW5kIC5mb299CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Jhc2ljX2V4dGVuZF9sb29wCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbywgLmJhciB7CisgIGE6IGI7IH0KKworLmJhciwgLmZvbyB7CisgIGM6IGQ7IH0KK0NTUworLmZvbyB7YTogYjsgQGV4dGVuZCAuYmFyfQorLmJhciB7YzogZDsgQGV4dGVuZCAuZm9vfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF90aHJlZV9sZXZlbF9leHRlbmRfbG9vcAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28sIC5iYXosIC5iYXIgeworICBhOiBiOyB9CisKKy5iYXIsIC5mb28sIC5iYXogeworICBjOiBkOyB9CisKKy5iYXosIC5iYXIsIC5mb28geworICBlOiBmOyB9CitDU1MKKy5mb28ge2E6IGI7IEBleHRlbmQgLmJhcn0KKy5iYXIge2M6IGQ7IEBleHRlbmQgLmJhen0KKy5iYXoge2U6IGY7IEBleHRlbmQgLmZvb30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZF9sb29wCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmJhciwgLmJhciAuZm9vIHsKKyAgYTogYjsgfQorICAuYmFyIC5mb28geworICAgIGM6IGQ7IH0KK0NTUworLmJhciB7CisgIGE6IGI7CisgIC5mb28ge2M6IGQ7IEBleHRlbmQgLmJhcn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3Jvc3NfbG9vcAorICAgICMgVGhlIGZpcnN0IGxhdyBvZiBleHRlbmQgbWVhbnMgdGhlIHNlbGVjdG9yIHNob3VsZCBzdGljayBhcm91bmQuCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvby5iYXIsIC5mb28sIC5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28uYmFyIHthOiBifQorLmZvbyB7QGV4dGVuZCAuYmFyfQorLmJhciB7QGV4dGVuZCAuZm9vfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tdWx0aXBsZV9leHRlbmRlcl9tZXJnZXNfd2l0aF9zdXBlcnNldF9zZWxlY3RvcgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2EuYmFyLmJheiwgYS5mb28geworICBhOiBiOyB9CitDU1MKKy5mb28ge0BleHRlbmQgLmJhcjsgQGV4dGVuZCAuYmF6fQorYS5iYXIuYmF6IHthOiBifQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jb250cm9sX2Zsb3dfaWYKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisudHJ1ZSwgLmFsc28tdHJ1ZSB7CisgIGNvbG9yOiBncmVlbjsgfQorCisuZmFsc2UsIC5hbHNvLWZhbHNlIHsKKyAgY29sb3I6IHJlZDsgfQorQ1NTCisudHJ1ZSAgeyBjb2xvcjogZ3JlZW47IH0KKy5mYWxzZSB7IGNvbG9yOiByZWQ7ICAgfQorLmFsc28tdHJ1ZSB7CisgIEBpZiB0cnVlIHsgQGV4dGVuZCAudHJ1ZTsgIH0KKyAgQGVsc2UgICAgeyBAZXh0ZW5kIC5mYWxzZTsgfQorfQorLmFsc28tZmFsc2UgeworICBAaWYgZmFsc2UgeyBAZXh0ZW5kIC50cnVlOyAgfQorICBAZWxzZSAgICAgeyBAZXh0ZW5kIC5mYWxzZTsgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jb250cm9sX2Zsb3dfZm9yCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmJhc2UtMCwgLmFkZGVkIHsKKyAgY29sb3I6IGdyZWVuOyB9CisKKy5iYXNlLTEsIC5hZGRlZCB7CisgIGRpc3BsYXk6IGJsb2NrOyB9CisKKy5iYXNlLTIsIC5hZGRlZCB7CisgIGJvcmRlcjogMXB4IHNvbGlkIGJsdWU7IH0KK0NTUworLmJhc2UtMCAgeyBjb2xvcjogZ3JlZW47IH0KKy5iYXNlLTEgIHsgZGlzcGxheTogYmxvY2s7IH0KKy5iYXNlLTIgIHsgYm9yZGVyOiAxcHggc29saWQgYmx1ZTsgfQorLmFkZGVkIHsKKyAgQGZvciAkaSBmcm9tIDAgdG8gMyB7CisgICAgQGV4dGVuZCAuYmFzZS1cI3skaX07CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29udHJvbF9mbG93X3doaWxlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmJhc2UtMCwgLmFkZGVkIHsKKyAgY29sb3I6IGdyZWVuOyB9CisKKy5iYXNlLTEsIC5hZGRlZCB7CisgIGRpc3BsYXk6IGJsb2NrOyB9CisKKy5iYXNlLTIsIC5hZGRlZCB7CisgIGJvcmRlcjogMXB4IHNvbGlkIGJsdWU7IH0KK0NTUworLmJhc2UtMCAgeyBjb2xvcjogZ3JlZW47IH0KKy5iYXNlLTEgIHsgZGlzcGxheTogYmxvY2s7IH0KKy5iYXNlLTIgIHsgYm9yZGVyOiAxcHggc29saWQgYmx1ZTsgfQorLmFkZGVkIHsKKyAgJGkgOiAwOworICBAd2hpbGUgJGkgPCAzIHsKKyAgICBAZXh0ZW5kIC5iYXNlLVwjeyRpfTsKKyAgICAkaSA6ICRpICsgMTsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9iYXNpY19wbGFjZWhvbGRlcl9zZWxlY3RvcgorICAgIGFzc2VydF9leHRlbmRzICclZm9vJywgJy5iYXIge0BleHRlbmQgJWZvb30nLCAnLmJhcicKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW51c2VkX3BsYWNlaG9sZGVyX3NlbGVjdG9yCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmJheiB7CisgIGNvbG9yOiBibHVlOyB9CitDU1MKKyVmb28ge2NvbG9yOiBibHVlfQorJWJhciB7Y29sb3I6IHJlZH0KKy5iYXoge0BleHRlbmQgJWZvb30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGxhY2Vob2xkZXJfZGVzY2VuZGFudF9zZWxlY3RvcgorICAgIGFzc2VydF9leHRlbmRzICcjY29udGV4dCAlZm9vIGEnLCAnLmJhciB7QGV4dGVuZCAlZm9vfScsICcjY29udGV4dCAuYmFyIGEnCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbWlfcGxhY2Vob2xkZXJfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuYmFyIC5iYXogeworICBjb2xvcjogYmx1ZTsgfQorQ1NTCisjY29udGV4dCAlZm9vLCAuYmFyIC5iYXoge2NvbG9yOiBibHVlfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9wbGFjZWhvbGRlcl9zZWxlY3Rvcl93aXRoX211bHRpcGxlX2V4dGVuZGVycworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5iYXIsIC5iYXogeworICBjb2xvcjogYmx1ZTsgfQorQ1NTCislZm9vIHtjb2xvcjogYmx1ZX0KKy5iYXIge0BleHRlbmQgJWZvb30KKy5iYXoge0BleHRlbmQgJWZvb30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGxhY2Vob2xkZXJfc2VsZWN0b3JfYXNfbW9kaWZpZXIKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCithLmJhei5iYXIgeworICBjb2xvcjogYmx1ZTsgfQorQ1NTCithJWZvby5iYXoge2NvbG9yOiBibHVlfQorLmJhciB7QGV4dGVuZCAlZm9vfQorZGl2IHtAZXh0ZW5kICVmb299CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3BsYWNlaG9sZGVyX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuYmFyIHsKKyAgY29sb3I6IGJsdWU7IH0KK0NTUworJGZvbzogZm9vOworCislXCN7JGZvb30ge2NvbG9yOiBibHVlfQorLmJhciB7QGV4dGVuZCAlZm9vfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9wbGFjZWhvbGRlcl9pbl9zZWxlY3Rvcl9wc2V1ZG9jbGFzcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKzptYXRjaGVzKC5iYXIsIC5iYXopIHsKKyAgY29sb3I6IGJsdWU7IH0KK0NTUworOm1hdGNoZXMoJWZvbykge2NvbG9yOiBibHVlfQorLmJhciB7QGV4dGVuZCAlZm9vfQorLmJheiB7QGV4dGVuZCAlZm9vfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tZWRpYV9pbl9wbGFjZWhvbGRlcl9zZWxlY3RvcgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5iYXogeworICBjOiBkOyB9CitDU1MKKyVmb28ge2JhciB7QG1lZGlhIHNjcmVlbiB7YTogYn19fQorLmJheiB7YzogZH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX291dF9vZl9tZWRpYQorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCA8PEVSUikge3JlbmRlcig8PFNDU1MpfQorWW91IG1heSBub3QgQGV4dGVuZCBhbiBvdXRlciBzZWxlY3RvciBmcm9tIHdpdGhpbiBAbWVkaWEuCitZb3UgbWF5IG9ubHkgQGV4dGVuZCBzZWxlY3RvcnMgd2l0aGluIHRoZSBzYW1lIGRpcmVjdGl2ZS4KK0Zyb20gIkBleHRlbmQgLmZvbyIgb24gbGluZSAzIG9mIHRlc3RfZXh0ZW5kX291dF9vZl9tZWRpYV9pbmxpbmUuc2Nzcy4KK0VSUgorLmZvbyB7YTogYn0KK0BtZWRpYSBzY3JlZW4geworICAuYmFyIHtAZXh0ZW5kIC5mb299Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9vdXRfb2ZfdW5rbm93bl9kaXJlY3RpdmUKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxFUlIpIHtyZW5kZXIoPDxTQ1NTKX0KK1lvdSBtYXkgbm90IEBleHRlbmQgYW4gb3V0ZXIgc2VsZWN0b3IgZnJvbSB3aXRoaW4gQGZsb29ibGVob29mLgorWW91IG1heSBvbmx5IEBleHRlbmQgc2VsZWN0b3JzIHdpdGhpbiB0aGUgc2FtZSBkaXJlY3RpdmUuCitGcm9tICJAZXh0ZW5kIC5mb28iIG9uIGxpbmUgMyBvZiB0ZXN0X2V4dGVuZF9vdXRfb2ZfdW5rbm93bl9kaXJlY3RpdmVfaW5saW5lLnNjc3MuCitFUlIKKy5mb28ge2E6IGJ9CitAZmxvb2JsZWhvb2YgeworICAuYmFyIHtAZXh0ZW5kIC5mb299Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9vdXRfb2ZfbmVzdGVkX2RpcmVjdGl2ZXMKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxFUlIpIHtyZW5kZXIoPDxTQ1NTKX0KK1lvdSBtYXkgbm90IEBleHRlbmQgYW4gb3V0ZXIgc2VsZWN0b3IgZnJvbSB3aXRoaW4gQGZsb29ibGVob29mLgorWW91IG1heSBvbmx5IEBleHRlbmQgc2VsZWN0b3JzIHdpdGhpbiB0aGUgc2FtZSBkaXJlY3RpdmUuCitGcm9tICJAZXh0ZW5kIC5mb28iIG9uIGxpbmUgNCBvZiB0ZXN0X2V4dGVuZF9vdXRfb2ZfbmVzdGVkX2RpcmVjdGl2ZXNfaW5saW5lLnNjc3MuCitFUlIKK0BtZWRpYSBzY3JlZW4geworICAuZm9vIHthOiBifQorICBAZmxvb2JsZWhvb2YgeworICAgIC5iYXIge0BleHRlbmQgLmZvb30KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRfd2l0aGluX21lZGlhCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK0BtZWRpYSBzY3JlZW4geworICAuZm9vLCAuYmFyIHsKKyAgICBhOiBiOyB9IH0KK0NTUworQG1lZGlhIHNjcmVlbiB7CisgIC5mb28ge2E6IGJ9CisgIC5iYXIge0BleHRlbmQgLmZvb30KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3dpdGhpbl91bmtub3duX2RpcmVjdGl2ZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCitAZmxvb2JsZWhvb2YgeworICAuZm9vLCAuYmFyIHsKKyAgICBhOiBiOyB9IH0KK0NTUworQGZsb29ibGVob29mIHsKKyAgLmZvbyB7YTogYn0KKyAgLmJhciB7QGV4dGVuZCAuZm9vfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRfd2l0aGluX25lc3RlZF9kaXJlY3RpdmVzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK0BtZWRpYSBzY3JlZW4geworICBAZmxvb2JsZWhvb2YgeworICAgIC5mb28sIC5iYXIgeworICAgICAgYTogYjsgfSB9IH0KK0NTUworQG1lZGlhIHNjcmVlbiB7CisgIEBmbG9vYmxlaG9vZiB7CisgICAgLmZvbyB7YTogYn0KKyAgICAuYmFyIHtAZXh0ZW5kIC5mb299CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3dpdGhpbl9kaXNwYXJhdGVfbWVkaWEKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorQG1lZGlhIHNjcmVlbiB7CisgIC5mb28sIC5iYXIgeworICAgIGE6IGI7IH0gfQorQ1NTCitAbWVkaWEgc2NyZWVuIHsuZm9vIHthOiBifX0KK0BtZWRpYSBzY3JlZW4gey5iYXIge0BleHRlbmQgLmZvb319CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF93aXRoaW5fZGlzcGFyYXRlX3Vua25vd25fZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK0BmbG9vYmxlaG9vZiB7CisgIC5mb28sIC5iYXIgeworICAgIGE6IGI7IH0gfQorQGZsb29ibGVob29mIHt9CitDU1MKK0BmbG9vYmxlaG9vZiB7LmZvbyB7YTogYn19CitAZmxvb2JsZWhvb2Ygey5iYXIge0BleHRlbmQgLmZvb319CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF93aXRoaW5fZGlzcGFyYXRlX25lc3RlZF9kaXJlY3RpdmVzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK0BtZWRpYSBzY3JlZW4geworICBAZmxvb2JsZWhvb2YgeworICAgIC5mb28sIC5iYXIgeworICAgICAgYTogYjsgfSB9IH0KK0BtZWRpYSBzY3JlZW4geworICBAZmxvb2JsZWhvb2Yge30gfQorQ1NTCitAbWVkaWEgc2NyZWVuIHtAZmxvb2JsZWhvb2Ygey5mb28ge2E6IGJ9fX0KK0BtZWRpYSBzY3JlZW4ge0BmbG9vYmxlaG9vZiB7LmJhciB7QGV4dGVuZCAuZm9vfX19CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF93aXRoaW5fYW5kX3dpdGhvdXRfbWVkaWEKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxFUlIpIHtyZW5kZXIoPDxTQ1NTKX0KK1lvdSBtYXkgbm90IEBleHRlbmQgYW4gb3V0ZXIgc2VsZWN0b3IgZnJvbSB3aXRoaW4gQG1lZGlhLgorWW91IG1heSBvbmx5IEBleHRlbmQgc2VsZWN0b3JzIHdpdGhpbiB0aGUgc2FtZSBkaXJlY3RpdmUuCitGcm9tICJAZXh0ZW5kIC5mb28iIG9uIGxpbmUgNCBvZiB0ZXN0X2V4dGVuZF93aXRoaW5fYW5kX3dpdGhvdXRfbWVkaWFfaW5saW5lLnNjc3MuCitFUlIKKy5mb28ge2E6IGJ9CitAbWVkaWEgc2NyZWVuIHsKKyAgLmZvbyB7YzogZH0KKyAgLmJhciB7QGV4dGVuZCAuZm9vfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRfd2l0aGluX2FuZF93aXRob3V0X3Vua25vd25fZGlyZWN0aXZlCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8RVJSKSB7cmVuZGVyKDw8U0NTUyl9CitZb3UgbWF5IG5vdCBAZXh0ZW5kIGFuIG91dGVyIHNlbGVjdG9yIGZyb20gd2l0aGluIEBmbG9vYmxlaG9vZi4KK1lvdSBtYXkgb25seSBAZXh0ZW5kIHNlbGVjdG9ycyB3aXRoaW4gdGhlIHNhbWUgZGlyZWN0aXZlLgorRnJvbSAiQGV4dGVuZCAuZm9vIiBvbiBsaW5lIDQgb2YgdGVzdF9leHRlbmRfd2l0aGluX2FuZF93aXRob3V0X3Vua25vd25fZGlyZWN0aXZlX2lubGluZS5zY3NzLgorRVJSCisuZm9vIHthOiBifQorQGZsb29ibGVob29mIHsKKyAgLmZvbyB7YzogZH0KKyAgLmJhciB7QGV4dGVuZCAuZm9vfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRfd2l0aGluX2FuZF93aXRob3V0X25lc3RlZF9kaXJlY3RpdmVzCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8RVJSKSB7cmVuZGVyKDw8U0NTUyl9CitZb3UgbWF5IG5vdCBAZXh0ZW5kIGFuIG91dGVyIHNlbGVjdG9yIGZyb20gd2l0aGluIEBmbG9vYmxlaG9vZi4KK1lvdSBtYXkgb25seSBAZXh0ZW5kIHNlbGVjdG9ycyB3aXRoaW4gdGhlIHNhbWUgZGlyZWN0aXZlLgorRnJvbSAiQGV4dGVuZCAuZm9vIiBvbiBsaW5lIDUgb2YgdGVzdF9leHRlbmRfd2l0aGluX2FuZF93aXRob3V0X25lc3RlZF9kaXJlY3RpdmVzX2lubGluZS5zY3NzLgorRVJSCitAbWVkaWEgc2NyZWVuIHsKKyAgLmZvbyB7YTogYn0KKyAgQGZsb29ibGVob29mIHsKKyAgICAuZm9vIHtjOiBkfQorICAgIC5iYXIge0BleHRlbmQgLmZvb30KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRfd2l0aF9zdWJqZWN0X3RyYW5zZmVyc19zdWJqZWN0X3RvX2V4dGVuZGVyCisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSl9Citmb28gYmFyISBiYXosIGZvbyAuYmlwIC5iYXAhIGJheiwgLmJpcCBmb28gLmJhcCEgYmF6IHsKKyAgYTogYjsgfQorQ1NTCitmb28gYmFyISBiYXoge2E6IGJ9CisuYmlwIC5iYXAge0BleHRlbmQgYmFyfQorU0NTUworCisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSl9Citmb28ueCBiYXIueSEgYmF6LnosIGZvby54IC5iaXAgYmFyLmJhcCEgYmF6LnosIC5iaXAgZm9vLnggYmFyLmJhcCEgYmF6LnogeworICBhOiBiOyB9CitDU1MKK2Zvby54IGJhci55ISBiYXoueiB7YTogYn0KKy5iaXAgLmJhcCB7QGV4dGVuZCAueX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3dpdGhfc3ViamVjdF9yZXRhaW5zX3N1YmplY3Rfb25fdGFyZ2V0CisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSl9CisuZm9vISAuYmFyLCAuZm9vISAuYmlwIC5iYXAsIC5iaXAgLmZvbyEgLmJhcCB7CisgIGE6IGI7IH0KK0NTUworLmZvbyEgLmJhciB7YTogYn0KKy5iaXAgLmJhcCB7QGV4dGVuZCAuYmFyfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRfd2l0aF9zdWJqZWN0X3RyYW5zZmVyc19zdWJqZWN0X3RvX3RhcmdldAorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpfQorYS5mb28gLmJhciwgLmJpcCBhLmJhcCEgLmJhciB7CisgIGE6IGI7IH0KK0NTUworYS5mb28gLmJhciB7YTogYn0KKy5iaXAgLmJhcCEge0BleHRlbmQgLmZvb30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3dpdGhfc3ViamVjdF9yZXRhaW5zX3N1YmplY3Rfb25fZXh0ZW5kZXIKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKX0KKy5mb28gLmJhciwgLmZvbyAuYmlwISAuYmFwLCAuYmlwISAuZm9vIC5iYXAgeworICBhOiBiOyB9CitDU1MKKy5mb28gLmJhciB7YTogYn0KKy5iaXAhIC5iYXAge0BleHRlbmQgLmJhcn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3dpdGhfc3ViamVjdF9mYWlsc193aXRoX2NvbmZsaWN0aW5nX3N1YmplY3QKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKX0KK3ghIC5iYXIgeworICBhOiBiOyB9CitDU1MKK3ghIC5iYXIge2E6IGJ9Cit5ISAuYmFwIHtAZXh0ZW5kIC5iYXJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF93YXJuc193aGVuX2V4dGVuZGVlX2RvZXNudF9leGlzdAorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCA8PEVSUikge3JlbmRlcig8PFNDU1MpfQorIi5mb28iIGZhaWxlZCB0byBAZXh0ZW5kICIuYmFyIi4KK1RoZSBzZWxlY3RvciAiLmJhciIgd2FzIG5vdCBmb3VuZC4KK1VzZSAiQGV4dGVuZCAuYmFyICFvcHRpb25hbCIgaWYgdGhlIGV4dGVuZCBzaG91bGQgYmUgYWJsZSB0byBmYWlsLgorRVJSCisuZm9vIHtAZXh0ZW5kIC5iYXJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9zdWNjZWVkc193aGVuX29uZV9leHRlbnNpb25fZmFpbHNfYnV0X290aGVyc19kb250CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK2EuYmFyIHsKKyAgYTogYjsgfQorCisuYmFyLCBiLmZvbyB7CisgIGM6IGQ7IH0KK0NTUworYS5iYXIge2E6IGJ9CisuYmFyIHtjOiBkfQorYi5mb28ge0BleHRlbmQgLmJhcn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfb3B0aW9uYWxfZXh0ZW5kX3N1Y2NlZWRzX3doZW5fZXh0ZW5kZWVfZG9lc250X2V4aXN0CisgICAgYXNzZXJ0X2VxdWFsKCIiLCByZW5kZXIoPDxTQ1NTKSkKKy5mb28ge0BleHRlbmQgLmJhciAhb3B0aW9uYWx9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X29wdGlvbmFsX2V4dGVuZF9zdWNjZWVkc193aGVuX2V4dGVuc2lvbl9mYWlscworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCithLmJhciB7CisgIGE6IGI7IH0KK0NTUworYS5iYXIge2E6IGJ9CitiLmZvbyB7QGV4dGVuZCAuYmFyICFvcHRpb25hbH0KK1NDU1MKKyAgZW5kCisKKyAgIyBSZWdyZXNzaW9uIFRlc3RzCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3dpdGhfbWlkZGxlX3BzZXVkbworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisuYnRuOmFjdGl2ZS5mb2N1cywgOmFjdGl2ZS5mb2N1czpiZWZvcmUgeworICBhOiBiOyB9CitDU1MKKy5idG46YWN0aXZlLmZvY3VzIHthOiBifQorOmJlZm9yZSB7QGV4dGVuZCAuYnRufQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRfcGFyZW50X3NlbGVjdG9yX3N1ZmZpeAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5hLWIsIC5jIHsKKyAgeDogeTsgfQorQ1NTCisuYSB7Ji1iIHt4OiB5fX0KKy5jIHtAZXh0ZW5kIC5hLWJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3BzZXVkb19lbGVtZW50X3N1cGVyc2VsZWN0b3IKKyAgICAjIFBzZXVkby1lbGVtZW50cyBzaG91bGRuJ3QgYmUgcmVtb3ZlZCBpbiBzdXBlcnNlbGVjdG9yIGNhbGN1bGF0aW9ucy4KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCithI2JhciwgYSNiYXI6OmZibHRocCB7CisgIGE6IGI7IH0KK0NTUworJXgjYmFyIHthOiBifSAvLyBBZGQgYW4gaWQgdG8gbWFrZSB0aGUgcmVzdWx0cyBoYXZlIGhpZ2ggc3BlY2lmaWNpdHkKKyV5LCAleTo6ZmJsdGhwIHtAZXh0ZW5kICV4fQorYSB7QGV4dGVuZCAleX0KK1NDU1MKKworICAgICMgUHNldWRvLWNsYXNzZXMgY2FuIGJlIHJlbW92ZWQgd2hlbiB0aGUgc2Vjb25kIGxhdyBhbGxvd3MuCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorYSNiYXIgeworICBhOiBiOyB9CitDU1MKKyV4I2JhciB7YTogYn0KKyV5LCAleTpmYmx0aHAge0BleHRlbmQgJXh9CithIHtAZXh0ZW5kICV5fQorU0NTUworCisgICAgIyBBIGZldyBwc2V1ZG8tZWxlbWVudHMgY2FuIGJlIHdyaXR0ZW4gYXMgcHNldWRvLWVsZW1lbnRzIGZvciBoaXN0b3JpY2FsCisgICAgIyByZWFzb25zLiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzNC8jcHNldWRvLWVsZW1lbnRzLgorICAgICV3W2ZpcnN0LWxpbmUgZmlyc3QtbGV0dGVyIGJlZm9yZSBhZnRlcl0uZWFjaCBkbyB8cHNldWRvfAorICAgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorYSNiYXIsIGEjYmFyOiN7cHNldWRvfSB7CisgIGE6IGI7IH0KK0NTUworJXgjYmFyIHthOiBifQorJXksICV5OiN7cHNldWRvfSB7QGV4dGVuZCAleH0KK2Ege0BleHRlbmQgJXl9CitTQ1NTCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpcGxlX3NvdXJjZV9yZWR1bmRhbmN5X2VsaW1pbmF0aW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLnRlc3QtY2FzZSwgLnRlc3QtY2FzZTphY3RpdmUgeworICBjb2xvcjogcmVkOyB9CisKKy50ZXN0LWNhc2U6aG92ZXIgeworICBjb2xvcjogZ3JlZW47IH0KK0NTUworJWRlZmF1bHQtY29sb3Ige2NvbG9yOiByZWR9CislYWx0LWNvbG9yIHtjb2xvcjogZ3JlZW59CisKKyVkZWZhdWx0LXN0eWxlIHsKKyAgQGV4dGVuZCAlZGVmYXVsdC1jb2xvcjsKKyAgJjpob3ZlciB7QGV4dGVuZCAlYWx0LWNvbG9yfQorICAmOmFjdGl2ZSB7QGV4dGVuZCAlZGVmYXVsdC1jb2xvcn0KK30KKworLnRlc3QtY2FzZSB7QGV4dGVuZCAlZGVmYXVsdC1zdHlsZX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX3NpYmxpbmdfZXh0ZW5kCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLnBhcmVudCAuYmFyLCAucGFyZW50IC5mb28geworICB3aWR0aDogMjAwMHB4OyB9CitDU1MKKy5mb28ge0BleHRlbmQgLmJhcn0KKworLnBhcmVudCB7CisgIC5iYXIgeworICAgIHdpZHRoOiAyMDAwcHg7CisgIH0KKyAgLmZvbyB7CisgICAgQGV4dGVuZCAuYmFyCisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFyZW50X2FuZF9zaWJsaW5nX2V4dGVuZAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5wYXJlbnQxIC5wYXJlbnQyIC5jaGlsZDEuY2hpbGQyLCAucGFyZW50MiAucGFyZW50MSAuY2hpbGQxLmNoaWxkMiB7CisgIGM6IGQ7IH0KK0NTUworJWZvbyAlYmFyJWJheiB7YzogZH0KKworLnBhcmVudDEgeworICBAZXh0ZW5kICVmb287CisgIC5jaGlsZDEge0BleHRlbmQgJWJhcn0KK30KKworLnBhcmVudDIgeworICBAZXh0ZW5kICVmb287CisgIC5jaGlsZDIge0BleHRlbmQgJWJhen0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2V4dGVuZF9zcGVjaWZpY2l0eQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2EgOmIsIGEgOmI6YyB7CisgIGE6IGI7IH0KK0NTUworJWZvbyB7YTogYn0KKworYSB7CisgIDpiIHtAZXh0ZW5kICVmb299CisgIDpiOmMge0BleHRlbmQgJWZvb30KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2RvdWJsZV9leHRlbmRfb3B0aW1pemF0aW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLnBhcmVudDEgLmNoaWxkIHsKKyAgYTogYjsgfQorQ1NTCislZm9vICViYXIgeworICBhOiBiOworfQorCisucGFyZW50MSB7CisgIEBleHRlbmQgJWZvbzsKKworICAuY2hpbGQgeworICAgIEBleHRlbmQgJWJhcjsKKyAgfQorfQorCisucGFyZW50MiB7CisgIEBleHRlbmQgJWZvbzsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX2luX2RvdWJsZV9uZXN0ZWRfbWVkaWFfcXVlcnkKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAbWVkaWEgYWxsIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgeworICAuYmFyIHsKKyAgICBjb2xvcjogYmx1ZTsgfSB9CitDU1MKK0BtZWRpYSBhbGwgeworICBAbWVkaWEgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIHsKKyAgICAlZm9vIHtjb2xvcjogYmx1ZX0KKyAgICAuYmFyIHtAZXh0ZW5kICVmb299CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFydGlhbGx5X2ZhaWxlZF9leHRlbmQKKyAgICBhc3NlcnRfbm9fd2FybmluZyB7YXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSl9CisucmMsIHRlc3QgeworICBjb2xvcjogd2hpdGU7IH0KKworLnByaWNlcyBzcGFuLnBpbGwgc3Bhbi5yYyB7CisgIGNvbG9yOiByZWQ7IH0KK0NTUwordGVzdCB7IEBleHRlbmQgLnJjOyB9CisucmMge2NvbG9yOiB3aGl0ZTt9CisucHJpY2VzIHNwYW4ucGlsbCBzcGFuLnJjIHtjb2xvcjogcmVkO30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmV3bGluZV9uZWFyX2NvbWJpbmF0b3IKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuYSArCisuYiB4LCAuYSArCisuYiAuYyB5LCAuYyAuYSArCisuYiB5IHsKKyAgYTogYjsgfQorQ1NTCisuYSArCisuYiB4IHthOiBifQorLmMgeSB7QGV4dGVuZCB4fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9kdXBsaWNhdGVkX3NlbGVjdG9yX3dpdGhfbmV3bGluZXMKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmV4YW1wbGUtMS0xLAorLmV4YW1wbGUtMS0yLAorLm15LXBhZ2UtMSAubXktbW9kdWxlLTEtMSwKKy5leGFtcGxlLTEtMyB7CisgIGE6IGI7IH0KK0NTUworLmV4YW1wbGUtMS0xLAorLmV4YW1wbGUtMS0yLAorLmV4YW1wbGUtMS0zIHsKKyAgYTogYjsKK30KKworLm15LXBhZ2UtMSAubXktbW9kdWxlLTEtMSB7QGV4dGVuZCAuZXhhbXBsZS0xLTJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9zZWxlY3Rvcl93aXRoX2NoaWxkX3NlbGVjdG9yX2hhY2tfZXh0ZW5kZWUKKyAgICBhc3NlcnRfZXh0ZW5kcyAnPiAuZm9vJywgJ2ZvbyBiYXIge0BleHRlbmQgLmZvb30nLCAnPiAuZm9vLCA+IGZvbyBiYXInCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9zZWxlY3Rvcl93aXRoX2NoaWxkX3NlbGVjdG9yX2hhY2tfZXh0ZW5kZXIKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmZvbyAuYmFyJywgJz4gZm9vIGJhciB7QGV4dGVuZCAuYmFyfScsICcuZm9vIC5iYXIsID4gLmZvbyBmb28gYmFyLCA+IGZvbyAuZm9vIGJhcicKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX3NlbGVjdG9yX3dpdGhfY2hpbGRfc2VsZWN0b3JfaGFja19leHRlbmRlcl9hbmRfZXh0ZW5kZWUKKyAgICBhc3NlcnRfZXh0ZW5kcyAnPiAuZm9vJywgJz4gZm9vIGJhciB7QGV4dGVuZCAuZm9vfScsICc+IC5mb28sID4gZm9vIGJhcicKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX3NlbGVjdG9yX3dpdGhfY2hpbGRfc2VsZWN0b3JfaGFja19leHRlbmRlcl9hbmRfc2libGluZ19zZWxlY3Rvcl9leHRlbmRlZQorICAgIGFzc2VydF9leHRlbmRzICd+IC5mb28nLCAnPiBmb28gYmFyIHtAZXh0ZW5kIC5mb299JywgJ34gLmZvbycKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX3NlbGVjdG9yX3dpdGhfY2hpbGRfc2VsZWN0b3JfaGFja19leHRlbmRlcl9hbmRfZXh0ZW5kZWVfYW5kX25ld2xpbmUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCis+IC5mb28sID4gZmxpcCwKKz4gZm9vIGJhciB7CisgIGE6IGI7IH0KK0NTUworPiAuZm9vIHthOiBifQorZmxpcCwKKz4gZm9vIGJhciB7QGV4dGVuZCAuZm9vfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHRlbmRlZF9wYXJlbnRfYW5kX2NoaWxkX3JlZHVuZGFuY3lfZWxpbWluYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCithIGIsIGQgYiwgYSBjLCBkIGMgeworICBhOiBiOyB9CitDU1MKK2EgeworICBiIHthOiBifQorICBjIHtAZXh0ZW5kIGJ9Cit9CitkIHtAZXh0ZW5kIGF9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9yZWR1bmRhbmN5X2VsaW1pbmF0aW9uX3doZW5faXRfd291bGRfcmVkdWNlX3NwZWNpZmljaXR5CisgICAgYXNzZXJ0X2V4dGVuZHMgJ2EnLCAnYS5mb28ge0BleHRlbmQgYX0nLCAnYSwgYS5mb28nCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9yZWR1bmRhbmN5X2VsaW1pbmF0aW9uX3doZW5faXRfd291bGRfcHJlc2VydmVfc3BlY2lmaWNpdHkKKyAgICBhc3NlcnRfZXh0ZW5kcyAnLmJhciBhJywgJ2EuZm9vIHtAZXh0ZW5kIGF9JywgJy5iYXIgYScKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3JlZHVuZGFuY3lfZWxpbWluYXRpb25fbmV2ZXJfZWxpbWluYXRlc19iYXNlX3NlbGVjdG9yCisgICAgYXNzZXJ0X2V4dGVuZHMgJ2EuZm9vJywgJy5mb28ge0BleHRlbmQgYX0nLCAnYS5mb28sIC5mb28nCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9jcm9zc19icmFuY2hfcmVkdW5kYW5jeV9lbGltaW5hdGlvbgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5hIC5jIC5kLCAuYiAuYyAuYSAuZCB7CisgIGE6IGI7IH0KK0NTUworJXggLmMgJXkge2E6IGJ9CisuYSwgLmIge0BleHRlbmQgJXh9CisuYSAuZCB7QGV4dGVuZCAleX0KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5lIC5hIC5jIC5kLCAuYSAuYyAuZSAuZCwgLmUgLmIgLmMgLmEgLmQsIC5iIC5jIC5hIC5lIC5kIHsKKyAgYTogYjsgfQorQ1NTCisuZSAleiB7YTogYn0KKyV4IC5jICV5IHtAZXh0ZW5kICV6fQorLmEsIC5iIHtAZXh0ZW5kICV4fQorLmEgLmQge0BleHRlbmQgJXl9CitTQ1NTCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgYXNzZXJ0X2V4dGVuZF9kb2VzbnRfbWF0Y2goZXh0ZW5kZXIsIHRhcmdldCwgcmVhc29uLCBsaW5lLCBzeW50YXggPSA6c2NzcykKKyAgICBtZXNzYWdlID0gIlwiI3tleHRlbmRlcn1cIiBmYWlsZWQgdG8gQGV4dGVuZCBcIiN7dGFyZ2V0fVwiLiIKKyAgICByZWFzb24gPSAKKyAgICAgIGlmIHJlYXNvbiA9PSA6bm90X2ZvdW5kCisgICAgICAgICJUaGUgc2VsZWN0b3IgXCIje3RhcmdldH1cIiB3YXMgbm90IGZvdW5kLiIKKyAgICAgIGVsc2UKKyAgICAgICAgIk5vIHNlbGVjdG9ycyBtYXRjaGluZyBcIiN7dGFyZ2V0fVwiIGNvdWxkIGJlIHVuaWZpZWQgd2l0aCBcIiN7ZXh0ZW5kZXJ9XCIuIgorICAgICAgZW5kCisKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxFUlIpIHt5aWVsZH0KKyN7bWVzc2FnZX0KKyN7cmVhc29ufQorVXNlICJAZXh0ZW5kICN7dGFyZ2V0fSAhb3B0aW9uYWwiIGlmIHRoZSBleHRlbmQgc2hvdWxkIGJlIGFibGUgdG8gZmFpbC4KK0VSUgorICBlbmQKKworICBkZWYgYXNzZXJ0X3VuaWZpY2F0aW9uKHNlbGVjdG9yLCBleHRlbnNpb24sIHVuaWZpZWQsIG5lc3RlZCA9IHRydWUpCisgICAgIyBEbyBzb21lIHRyaWNrZXJ5IHNvIHRoZSBmaXJzdCBsYXcgb2YgZXh0ZW5kIGRvZXNuJ3QgZ2V0IGluIG91ciB3YXkuCisgICAgYXNzZXJ0X2V4dGVuZHMoCisgICAgICAiJS1hICN7c2VsZWN0b3J9IiwKKyAgICAgIGV4dGVuc2lvbiArICIgLWEge0BleHRlbmQgJS1hfSIsCisgICAgICB1bmlmaWVkLnNwbGl0KCcsICcpLm1hcCB7fHN8ICItYSAje3N9In0uam9pbignLCAnKSkKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9zcGVjaWZpY2l0eV9lcXVhbHMoc2VsMSwgc2VsMikKKyAgICBhc3NlcnRfc3BlY2lmaWNpdHlfZ3RlKHNlbDEsIHNlbDIpCisgICAgYXNzZXJ0X3NwZWNpZmljaXR5X2d0ZShzZWwyLCBzZWwxKQorICBlbmQKKworICBkZWYgYXNzZXJ0X3NwZWNpZmljaXR5X2d0ZShzZWwxLCBzZWwyKQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKyN7c2VsMX0gLmEgeworICBhOiBiOyB9CitDU1MKKyN7c2VsMX0gJS1hIHthOiBifQorLmEge0BleHRlbmQgJS1hfQorI3tzZWwyfS5hIHtAZXh0ZW5kICUtYX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHJlbmRlcl91bmlmaWNhdGlvbihzZWxlY3RvciwgZXh0ZW5zaW9uKQorICAgIHJlbmRlcl9leHRlbmRzKAorICAgICAgIiUtYSAje3NlbGVjdG9yfSIsCisgICAgICBleHRlbnNpb24gKyAiIC1hIHtAZXh0ZW5kICUtYX0iKQorICBlbmQKKworICBkZWYgYXNzZXJ0X2V4dGVuZHMoc2VsZWN0b3IsIGV4dGVuc2lvbiwgcmVzdWx0KQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyX2V4dGVuZHMoc2VsZWN0b3IsIGV4dGVuc2lvbikKKyN7cmVzdWx0fSB7CisgIGE6IGI7IH0KK0NTUworICBlbmQKKworICBkZWYgYXNzZXJ0X2V4dGVuZHNfdG9fbm90aGluZyhzZWxlY3RvciwgZXh0ZW5zaW9uKQorICAgIGFzc2VydF9lcXVhbCAnJywgcmVuZGVyX2V4dGVuZHMoc2VsZWN0b3IsIGV4dGVuc2lvbikKKyAgZW5kCisKKyAgZGVmIHJlbmRlcl9leHRlbmRzKHNlbGVjdG9yLCBleHRlbnNpb24pCisgICAgcmVuZGVyKDw8U0NTUykKKyN7c2VsZWN0b3J9IHthOiBifQorI3tleHRlbnNpb259CitTQ1NTCisgIGVuZAorCisgIGRlZiByZW5kZXIoc2Fzcywgb3B0aW9ucyA9IHt9KQorICAgIG9wdGlvbnMgPSB7OnN5bnRheCA9PiA6c2Nzc30ubWVyZ2Uob3B0aW9ucykKKyAgICBtdW5nZV9maWxlbmFtZSBvcHRpb25zCisgICAgU2Fzczo6RW5naW5lLm5ldyhzYXNzLCBvcHRpb25zKS5yZW5kZXIKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2ZpeHR1cmVzL3Rlc3Rfc3RhbGVuZXNzX2NoZWNrX2Fjcm9zc19pbXBvcnRlcnMuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvZml4dHVyZXMvdGVzdF9zdGFsZW5lc3NfY2hlY2tfYWNyb3NzX2ltcG9ydGVycy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiNjIyNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2ZpeHR1cmVzL3Rlc3Rfc3RhbGVuZXNzX2NoZWNrX2Fjcm9zc19pbXBvcnRlcnMuY3NzCkBAIC0wLDAgKzEgQEAKKy5wZWFyIHsgY29sb3I6IGdyZWVuOyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9maXh0dXJlcy90ZXN0X3N0YWxlbmVzc19jaGVja19hY3Jvc3NfaW1wb3J0ZXJzLnNjc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9maXh0dXJlcy90ZXN0X3N0YWxlbmVzc19jaGVja19hY3Jvc3NfaW1wb3J0ZXJzLnNjc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2OGFjOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2ZpeHR1cmVzL3Rlc3Rfc3RhbGVuZXNzX2NoZWNrX2Fjcm9zc19pbXBvcnRlcnMuc2NzcwpAQCAtMCwwICsxIEBACitAaW1wb3J0ICJhcHBsZSI7CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9mdW5jdGlvbnNfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2Z1bmN0aW9uc190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5M2IzODMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9mdW5jdGlvbnNfdGVzdC5yYgpAQCAtMCwwICsxLDIwMjEgQEAKK3JlcXVpcmUgJ21pbml0ZXN0L2F1dG9ydW4nCityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL3Rlc3RfaGVscGVyJworcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3Nhc3Mvc2NyaXB0JworcmVxdWlyZSAnbW9ja19pbXBvcnRlcicKKworbW9kdWxlIFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zCisgIGRlZiBub19rd19hcmdzCisgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygibm8ta3ctYXJncyIpCisgIGVuZAorCisgIGRlZiBvbmx5X3Zhcl9hcmdzKCphcmdzKQorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIm9ubHktdmFyLWFyZ3MoIithcmdzLm1hcHt8YXwgYS5wbHVzKFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5uZXcoMSkpLnRvX3MgfS5qb2luKCIsICIpKyIpIikKKyAgZW5kCisgIGRlY2xhcmUgOm9ubHlfdmFyX2FyZ3MsIFtdLCA6dmFyX2FyZ3MgPT4gdHJ1ZQorCisgIGRlZiBvbmx5X2t3X2FyZ3Moa3dhcmdzKQorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIm9ubHkta3ctYXJncygiICsga3dhcmdzLmtleXMubWFwIHt8YXwgYS50b19zfS5zb3J0LmpvaW4oIiwgIikgKyAiKSIpCisgIGVuZAorICBkZWNsYXJlIDpvbmx5X2t3X2FyZ3MsIFtdLCA6dmFyX2t3YXJncyA9PiB0cnVlCisKKyAgZGVmIGRlcHJlY2F0ZWRfYXJnX2ZuKGFyZzEsIGFyZzIsIGFyZzMgPSBuaWwpCisgICAgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TGlzdC5uZXcoCisgICAgICBbYXJnMSwgYXJnMiwgYXJnMyB8fCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdWxsLm5ld10sCisgICAgICBzZXBhcmF0b3I6IDpzcGFjZSkKKyAgZW5kCisgIGRlY2xhcmUgOmRlcHJlY2F0ZWRfYXJnX2ZuLCBbOmFyZzEsIDphcmcyLCA6YXJnM10sIDpkZXByZWNhdGVkID0+IFs6YXJnXzEsIDphcmdfMiwgOmFyZzNdCisgIGRlY2xhcmUgOmRlcHJlY2F0ZWRfYXJnX2ZuLCBbOmFyZzEsIDphcmcyXSwgOmRlcHJlY2F0ZWQgPT4gWzphcmdfMSwgOmFyZ18yXQorZW5kCisKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9uczo6VXNlckZ1bmN0aW9ucworICBkZWYgY2FsbF9vcHRpb25zX29uX25ld192YWx1ZQorICAgIHN0ciA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoImZvbyIpCisgICAgc3RyLm9wdGlvbnNbOmZvb10KKyAgICBzdHIKKyAgZW5kCisKKyAgZGVmIHVzZXJfZGVmaW5lZAorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIkknbSBhIHVzZXItZGVmaW5lZCBzdHJpbmchIikKKyAgZW5kCisKKyAgZGVmIF9wcmVjZWRpbmdfdW5kZXJzY29yZQorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoIkknbSBhbm90aGVyIHVzZXItZGVmaW5lZCBzdHJpbmchIikKKyAgZW5kCisKKyAgZGVmIGZldGNoX3RoZV92YXJpYWJsZQorICAgIGVudmlyb25tZW50LnZhcigndmFyaWFibGUnKQorICBlbmQKK2VuZAorCittb2R1bGUgU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnMKKyAgaW5jbHVkZSBTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9uczo6VXNlckZ1bmN0aW9ucworZW5kCisKK2NsYXNzIFNhc3NGdW5jdGlvblRlc3QgPCBNaW5pVGVzdDo6VGVzdAorICAjIFRlc3RzIHRha2VuIGZyb206CisgICMgICBodHRwOi8vd3d3LnczLm9yZy9TdHlsZS9DU1MvVGVzdC9DU1MzL0NvbG9yLzIwMDcwOTI3L2h0bWw0L3QwNDAyMDQtaHNsLWgtcm90YXRpbmctYi5odG0KKyAgIyAgIGh0dHA6Ly93d3cudzMub3JnL1N0eWxlL0NTUy9UZXN0L0NTUzMvQ29sb3IvMjAwNzA5MjcvaHRtbDQvdDA0MDIwNC1oc2wtdmFsdWVzLWIuaHRtCisgIEZpbGUucmVhZChGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi9kYXRhL2hzbC1yZ2IudHh0Iikuc3BsaXQoIlxuXG4iKS5lYWNoIGRvIHxjaHVua3wKKyAgICBoc2xzLCByZ2JzID0gY2h1bmsuc3RyaXAuc3BsaXQoIj09PT0iKQorICAgIGhzbHMuc3RyaXAuc3BsaXQoIlxuIikuemlwKHJnYnMuc3RyaXAuc3BsaXQoIlxuIikpIGRvIHxoc2wsIHJnYnwKKyAgICAgIGhzbF9tZXRob2QgPSAidGVzdF9oc2w6ICN7aHNsfSA9ICN7cmdifSIKKyAgICAgIHVubGVzcyBtZXRob2RfZGVmaW5lZD8oaHNsX21ldGhvZCkKKyAgICAgICAgZGVmaW5lX21ldGhvZChoc2xfbWV0aG9kKSBkbworICAgICAgICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZShyZ2IpLCBldmFsdWF0ZShoc2wpKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICByZ2JfdG9faHNsX21ldGhvZCA9ICJ0ZXN0X3JnYl90b19oc2w6ICN7cmdifSA9ICN7aHNsfSIKKyAgICAgIHVubGVzcyBtZXRob2RfZGVmaW5lZD8ocmdiX3RvX2hzbF9tZXRob2QpCisgICAgICAgIGRlZmluZV9tZXRob2QocmdiX3RvX2hzbF9tZXRob2QpIGRvCisgICAgICAgICAgcmdiX2NvbG9yID0gcGVyZm9ybShyZ2IpCisgICAgICAgICAgaHNsX2NvbG9yID0gcGVyZm9ybShoc2wpCisKKyAgICAgICAgICB3aGl0ZSA9IGhzbF9jb2xvci5saWdodG5lc3MgPT0gMTAwCisgICAgICAgICAgYmxhY2sgPSBoc2xfY29sb3IubGlnaHRuZXNzID09IDAKKyAgICAgICAgICBncmF5c2NhbGUgPSB3aGl0ZSB8fCBibGFjayB8fCBoc2xfY29sb3Iuc2F0dXJhdGlvbiA9PSAwCisKKyAgICAgICAgICBhc3NlcnRfaW5fZGVsdGEoaHNsX2NvbG9yLmh1ZSwgcmdiX2NvbG9yLmh1ZSwgMC4wMDAxLAorICAgICAgICAgICAgIkh1ZXMgc2hvdWxkIGJlIGVxdWFsIikgdW5sZXNzIGdyYXlzY2FsZQorICAgICAgICAgIGFzc2VydF9pbl9kZWx0YShoc2xfY29sb3Iuc2F0dXJhdGlvbiwgcmdiX2NvbG9yLnNhdHVyYXRpb24sIDAuMDAwMSwKKyAgICAgICAgICAgICJTYXR1cmF0aW9ucyBzaG91bGQgYmUgZXF1YWwiKSB1bmxlc3Mgd2hpdGUgfHwgYmxhY2sKKyAgICAgICAgICBhc3NlcnRfaW5fZGVsdGEoaHNsX2NvbG9yLmxpZ2h0bmVzcywgcmdiX2NvbG9yLmxpZ2h0bmVzcywgMC4wMDAxLAorICAgICAgICAgICAgIkxpZ2h0bmVzc2VzIHNob3VsZCBiZSBlcXVhbCIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2hzbF9rd2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgIiMzM2NjY2MiLCBldmFsdWF0ZSgiaHNsKCRodWU6IDE4MCwgJHNhdHVyYXRpb246IDYwJSwgJGxpZ2h0bmVzczogNTAlKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2hzbF9jbGFtcHNfYm91bmRzCisgICAgYXNzZXJ0X2VxdWFsKCIjMWYxZjFmIiwgZXZhbHVhdGUoImhzbCgxMCwgLTExNCwgMTIpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ3aGl0ZSIsIGV2YWx1YXRlKCJoc2woMTAsIDEwLCAyNTYlKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9oc2xfY2hlY2tzX3R5cGVzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRodWU6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgaHNsJyIsICJoc2woXCJmb29cIiwgMTAsIDEyKSIpOworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2F0dXJhdGlvbjogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBoc2wnIiwgImhzbCgxMCwgXCJmb29cIiwgMTIpIik7CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRsaWdodG5lc3M6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgaHNsJyIsICJoc2woMTAsIDEwLCBcImZvb1wiKSIpOworICBlbmQKKworICBkZWYgdGVzdF9oc2xhCisgICAgYXNzZXJ0X2VxdWFsICJyZ2JhKDUxLCAyMDQsIDIwNCwgMC40KSIsIGV2YWx1YXRlKCJoc2xhKDE4MCwgNjAlLCA1MCUsIDAuNCkiKQorICAgIGFzc2VydF9lcXVhbCAiIzMzY2NjYyIsIGV2YWx1YXRlKCJoc2xhKDE4MCwgNjAlLCA1MCUsIDEpIikKKyAgICBhc3NlcnRfZXF1YWwgInJnYmEoNTEsIDIwNCwgMjA0LCAwKSIsIGV2YWx1YXRlKCJoc2xhKDE4MCwgNjAlLCA1MCUsIDApIikKKyAgICBhc3NlcnRfZXF1YWwgInJnYmEoNTEsIDIwNCwgMjA0LCAwLjQpIiwgZXZhbHVhdGUoImhzbGEoJGh1ZTogMTgwLCAkc2F0dXJhdGlvbjogNjAlLCAkbGlnaHRuZXNzOiA1MCUsICRhbHBoYTogMC40KSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2hzbGFfY2xhbXBzX2JvdW5kcworICAgIGFzc2VydF9lcXVhbCgiIzFmMWYxZiIsIGV2YWx1YXRlKCJoc2xhKDEwLCAtMTE0LCAxMiwgMSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMjU1LCAyNTUsIDI1NSwgMCkiLCBldmFsdWF0ZSgiaHNsYSgxMCwgMTAsIDI1NiUsIDApIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDI4LCAyNCwgMjMsIDApIiwgZXZhbHVhdGUoImhzbGEoMTAsIDEwLCAxMCwgLTAuMSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiMxYzE4MTciLCBldmFsdWF0ZSgiaHNsYSgxMCwgMTAsIDEwLCAxLjEpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2hzbGFfY2hlY2tzX3R5cGVzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRodWU6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgaHNsYSciLCAiaHNsYShcImZvb1wiLCAxMCwgMTIsIDAuMykiKTsKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNhdHVyYXRpb246IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgaHNsYSciLCAiaHNsYSgxMCwgXCJmb29cIiwgMTIsIDApIik7CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRsaWdodG5lc3M6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgaHNsYSciLCAiaHNsYSgxMCwgMTAsIFwiZm9vXCIsIDEpIik7CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRhbHBoYTogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBoc2xhJyIsICJoc2xhKDEwLCAxMCwgMTAsIFwiZm9vXCIpIik7CisgIGVuZAorCisgIGRlZiB0ZXN0X2hzbGFfcGVyY2VudF93YXJuaW5nCisgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7ZXZhbHVhdGUoImhzbGEoMTgwLCA2MCUsIDUwJSwgNDAlKSIpfQorREVQUkVDQVRJT04gV0FSTklORzogUGFzc2luZyBhIHBlcmNlbnRhZ2UgYXMgdGhlIGFscGhhIHZhbHVlIHRvIGhzbGEoKSB3aWxsIGJlCitpbnRlcnByZXRlZCBkaWZmZXJlbnRseSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgU2Fzcy4gRm9yIG5vdywgdXNlIDQwIGluc3RlYWQuCitXQVJOSU5HCisgIGVuZAorCisgIGRlZiB0ZXN0X2hzbGFfdW5pdF93YXJuaW5nCisgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7ZXZhbHVhdGUoImhzbGEoMTgwLCA2MCUsIDUwJSwgNDBlbSkiKX0KK0RFUFJFQ0FUSU9OIFdBUk5JTkc6IFBhc3NpbmcgYSBudW1iZXIgd2l0aCB1bml0cyBhcyB0aGUgYWxwaGEgdmFsdWUgdG8gaHNsYSgpIGlzCitkZXByZWNhdGVkIGFuZCB3aWxsIGJlIGFuIGVycm9yIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLiBVc2UgNDAgaW5zdGVhZC4KK1dBUk5JTkcKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGVyY2VudGFnZQorICAgIGFzc2VydF9lcXVhbCgiNTAlIiwgIGV2YWx1YXRlKCJwZXJjZW50YWdlKC41KSIpKQorICAgIGFzc2VydF9lcXVhbCgiMTAwJSIsIGV2YWx1YXRlKCJwZXJjZW50YWdlKDEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIyNSUiLCAgZXZhbHVhdGUoInBlcmNlbnRhZ2UoMjVweCAvIDEwMHB4KSIpKQorICAgIGFzc2VydF9lcXVhbCgiNTAlIiwgIGV2YWx1YXRlKCJwZXJjZW50YWdlKCRudW1iZXI6IDAuNSkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGVyY2VudGFnZV9jaGVja3NfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG51bWJlcjogMjVweCBpcyBub3QgYSB1bml0bGVzcyBudW1iZXIgZm9yIGBwZXJjZW50YWdlJyIsICJwZXJjZW50YWdlKDI1cHgpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG51bWJlcjogI2NjY2NjYyBpcyBub3QgYSB1bml0bGVzcyBudW1iZXIgZm9yIGBwZXJjZW50YWdlJyIsICJwZXJjZW50YWdlKCNjY2MpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG51bWJlcjogXCJzdHJpbmdcIiBpcyBub3QgYSB1bml0bGVzcyBudW1iZXIgZm9yIGBwZXJjZW50YWdlJyIsICVRe3BlcmNlbnRhZ2UoInN0cmluZyIpfSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfcm91bmQKKyAgICBhc3NlcnRfZXF1YWwoIjUiLCAgIGV2YWx1YXRlKCJyb3VuZCg0LjgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI1cHgiLCBldmFsdWF0ZSgicm91bmQoNC44cHgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI1cHgiLCBldmFsdWF0ZSgicm91bmQoNS40OXB4KSIpKQorICAgIGFzc2VydF9lcXVhbCgiNXB4IiwgZXZhbHVhdGUoInJvdW5kKCRudW1iZXI6IDUuNDlweCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi02IiwgZXZhbHVhdGUoInJvdW5kKC01LjUpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X3JvdW5kX2NoZWNrc190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkdmFsdWU6ICNjY2NjY2MgaXMgbm90IGEgbnVtYmVyIGZvciBgcm91bmQnIiwgInJvdW5kKCNjY2MpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmxvb3IKKyAgICBhc3NlcnRfZXF1YWwoIjQiLCAgIGV2YWx1YXRlKCJmbG9vcig0LjgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI0cHgiLCBldmFsdWF0ZSgiZmxvb3IoNC44cHgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI0cHgiLCBldmFsdWF0ZSgiZmxvb3IoJG51bWJlcjogNC44cHgpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zsb29yX2NoZWNrc190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkdmFsdWU6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgZmxvb3InIiwgImZsb29yKFwiZm9vXCIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2VpbAorICAgIGFzc2VydF9lcXVhbCgiNSIsICAgZXZhbHVhdGUoImNlaWwoNC4xKSIpKQorICAgIGFzc2VydF9lcXVhbCgiNXB4IiwgZXZhbHVhdGUoImNlaWwoNC44cHgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI1cHgiLCBldmFsdWF0ZSgiY2VpbCgkbnVtYmVyOiA0LjhweCkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2VpbF9jaGVja3NfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHZhbHVlOiBcImFcIiBpcyBub3QgYSBudW1iZXIgZm9yIGBjZWlsJyIsICJjZWlsKFwiYVwiKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2FicworICAgIGFzc2VydF9lcXVhbCgiNSIsICAgZXZhbHVhdGUoImFicygtNSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjVweCIsIGV2YWx1YXRlKCJhYnMoLTVweCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjUiLCAgIGV2YWx1YXRlKCJhYnMoNSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjVweCIsIGV2YWx1YXRlKCJhYnMoNXB4KSIpKQorICAgIGFzc2VydF9lcXVhbCgiNXB4IiwgZXZhbHVhdGUoImFicygkbnVtYmVyOiA1cHgpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Fic19jaGVja3NfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHZhbHVlOiAjYWFhYWFhIGlzIG5vdCBhIG51bWJlciBmb3IgYGFicyciLCAiYWJzKCNhYWEpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWluCisgICAgYXNzZXJ0X2VxdWFsKCIxIiwgZXZhbHVhdGUoIm1pbigxLCAyLCAzKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSIsIGV2YWx1YXRlKCJtaW4oM3B4LCAycHgsIDEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI0ZW0iLCBldmFsdWF0ZSgibWluKDRlbSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEwY20iLCBldmFsdWF0ZSgibWluKDEwY20sIDZpbikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjFxIiwgZXZhbHVhdGUoIm1pbigxY20sIDFxKSIpKQorCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiNhYWFhYWEgaXMgbm90IGEgbnVtYmVyIGZvciBgbWluJyIsICJtaW4oI2FhYSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJJbmNvbXBhdGlibGUgdW5pdHM6ICdweCcgYW5kICdlbScuIiwgIm1pbigzZW0sIDRlbSwgMXB4KSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X21heAorICAgIGFzc2VydF9lcXVhbCgiMyIsIGV2YWx1YXRlKCJtYXgoMSwgMiwgMykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjMiLCBldmFsdWF0ZSgibWF4KDMsIDJweCwgMXB4KSIpKQorICAgIGFzc2VydF9lcXVhbCgiNGVtIiwgZXZhbHVhdGUoIm1heCg0ZW0pIikpCisgICAgYXNzZXJ0X2VxdWFsKCI2aW4iLCBldmFsdWF0ZSgibWF4KDEwY20sIDZpbikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjExbW0iLCBldmFsdWF0ZSgibWF4KDExbW0sIDEwcSkiKSkKKworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIjYWFhYWFhIGlzIG5vdCBhIG51bWJlciBmb3IgYG1heCciLCAibWF4KCNhYWEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiSW5jb21wYXRpYmxlIHVuaXRzOiAncHgnIGFuZCAnZW0nLiIsICJtYXgoM2VtLCA0ZW0sIDFweCkiKQorICBlbmQKKworICBkZWYgdGVzdF9yZ2IKKyAgICBhc3NlcnRfZXF1YWwoIiMxMjM0NTYiLCBldmFsdWF0ZSgicmdiKDE4LCA1MiwgODYpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjYmVhZGVkIiwgZXZhbHVhdGUoInJnYigxOTAsIDE3MywgMjM3KSIpKQorICAgIGFzc2VydF9lcXVhbCgic3ByaW5nZ3JlZW4iLCBldmFsdWF0ZSgicmdiKDAsIDI1NSwgMTI3KSIpKQorICAgIGFzc2VydF9lcXVhbCgic3ByaW5nZ3JlZW4iLCBldmFsdWF0ZSgicmdiKCRyZWQ6IDAsICRncmVlbjogMjU1LCAkYmx1ZTogMTI3KSIpKQorICBlbmQKKworICBkZWYgdGVzdF9yZ2JfcGVyY2VudAorICAgIGFzc2VydF9lcXVhbCgiIzEyMzQ1NyIsIGV2YWx1YXRlKCJyZ2IoNy4xJSwgMjAuNCUsIDM0JSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiNiZWFkZWQiLCBldmFsdWF0ZSgicmdiKDc0LjclLCAxNzMsIDkzJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiNiZWFkZWQiLCBldmFsdWF0ZSgicmdiKDE5MCwgNjglLCAyMzcpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjMDBmZjgwIiwgZXZhbHVhdGUoInJnYigwJSwgMTAwJSwgNTAlKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9yZ2JfY2xhbXBzX2JvdW5kcworICAgIGFzc2VydF9lcXVhbCgiI2ZmMDEwMSIsIGV2YWx1YXRlKCJyZ2IoMjU2LCAxLCAxKSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzAxZmYwMSIsIGV2YWx1YXRlKCJyZ2IoMSwgMjU2LCAxKSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzAxMDFmZiIsIGV2YWx1YXRlKCJyZ2IoMSwgMSwgMjU2KSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzAxZmZmZiIsIGV2YWx1YXRlKCJyZ2IoMSwgMjU2LCAyNTcpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjMDAwMTAxIiwgZXZhbHVhdGUoInJnYigtMSwgMSwgMSkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiX2NsYW1wc19wZXJjZW50X2JvdW5kcworICAgIGFzc2VydF9lcXVhbCgicmVkIiwgZXZhbHVhdGUoInJnYigxMDAuMSUsIDAsIDApIikpCisgICAgYXNzZXJ0X2VxdWFsKCJibGFjayIsIGV2YWx1YXRlKCJyZ2IoMCwgLTAuMSUsIDApIikpCisgICAgYXNzZXJ0X2VxdWFsKCJibHVlIiwgZXZhbHVhdGUoInJnYigwLCAwLCAxMDElKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9yZ2JfdGVzdHNfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHJlZDogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGByZ2InIiwgInJnYihcImZvb1wiLCAxMCwgMTIpIik7CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRncmVlbjogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGByZ2InIiwgInJnYigxMCwgXCJmb29cIiwgMTIpIik7CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRibHVlOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYHJnYiciLCAicmdiKDEwLCAxMCwgXCJmb29cIikiKTsKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiYQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgxOCwgNTIsIDg2LCAwLjUpIiwgZXZhbHVhdGUoInJnYmEoMTgsIDUyLCA4NiwgMC41KSIpKQorICAgIGFzc2VydF9lcXVhbCgiI2JlYWRlZCIsIGV2YWx1YXRlKCJyZ2JhKDE5MCwgMTczLCAyMzcsIDEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDI1NSwgMTI3LCAwKSIsIGV2YWx1YXRlKCJyZ2JhKDAsIDI1NSwgMTI3LCAwKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgwLCAyNTUsIDEyNywgMCkiLCBldmFsdWF0ZSgicmdiYSgkcmVkOiAwLCAkZ3JlZW46IDI1NSwgJGJsdWU6IDEyNywgJGFscGhhOiAwKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9yZ2JhX2NsYW1wc19ib3VuZHMKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMjU1LCAxLCAxLCAwLjMpIiwgZXZhbHVhdGUoInJnYmEoMjU2LCAxLCAxLCAwLjMpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDEsIDI1NSwgMSwgMC4zKSIsIGV2YWx1YXRlKCJyZ2JhKDEsIDI1NiwgMSwgMC4zKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgxLCAxLCAyNTUsIDAuMykiLCBldmFsdWF0ZSgicmdiYSgxLCAxLCAyNTYsIDAuMykiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMSwgMjU1LCAyNTUsIDAuMykiLCBldmFsdWF0ZSgicmdiYSgxLCAyNTYsIDI1NywgMC4zKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgwLCAxLCAxLCAwLjMpIiwgZXZhbHVhdGUoInJnYmEoLTEsIDEsIDEsIDAuMykiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMSwgMSwgMSwgMCkiLCBldmFsdWF0ZSgicmdiYSgxLCAxLCAxLCAtMC4yKSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzAxMDEwMSIsIGV2YWx1YXRlKCJyZ2JhKDEsIDEsIDEsIDEuMikiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiYV90ZXN0c190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkcmVkOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYHJnYmEnIiwgInJnYmEoXCJmb29cIiwgMTAsIDEyLCAwLjIpIik7CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRncmVlbjogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGByZ2JhJyIsICJyZ2JhKDEwLCBcImZvb1wiLCAxMiwgMC4xKSIpOworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYmx1ZTogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGByZ2JhJyIsICJyZ2JhKDEwLCAxMCwgXCJmb29cIiwgMCkiKTsKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGFscGhhOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYHJnYmEnIiwgInJnYmEoMTAsIDEwLCAxMCwgXCJmb29cIikiKTsKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiYV93aXRoX2NvbG9yCisgICAgYXNzZXJ0X2VxdWFsICJyZ2JhKDE2LCAzMiwgNDgsIDAuNSkiLCBldmFsdWF0ZSgicmdiYSgjMTAyMDMwLCAwLjUpIikKKyAgICBhc3NlcnRfZXF1YWwgInJnYmEoMCwgMCwgMjU1LCAwLjUpIiwgZXZhbHVhdGUoInJnYmEoYmx1ZSwgMC41KSIpCisgICAgYXNzZXJ0X2VxdWFsICJyZ2JhKDAsIDAsIDI1NSwgMC41KSIsIGV2YWx1YXRlKCJyZ2JhKCRjb2xvcjogYmx1ZSwgJGFscGhhOiAwLjUpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiYV93aXRoX2NvbG9yX3Rlc3RzX3R5cGVzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjogXCJmb29cIiBpcyBub3QgYSBjb2xvciBmb3IgYHJnYmEnIiwgInJnYmEoXCJmb29cIiwgMC4yKSIpOworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYWxwaGE6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgcmdiYSciLCAicmdiYShibHVlLCBcImZvb1wiKSIpOworICBlbmQKKworICBkZWYgdGVzdF9yZ2JhX3Rlc3RzX251bV9hcmdzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKDAgZm9yIDQpIGZvciBgcmdiYSciLCAicmdiYSgpIik7CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKDEgZm9yIDQpIGZvciBgcmdiYSciLCAicmdiYShibHVlKSIpOworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgzIGZvciA0KSBmb3IgYHJnYmEnIiwgInJnYmEoMSwgMiwgMykiKTsKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAoNSBmb3IgNCkgZm9yIGByZ2JhJyIsICJyZ2JhKDEsIDIsIDMsIDAuNCwgNSkiKTsKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiYV9wZXJjZW50X3dhcm5pbmcKKyAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIHtldmFsdWF0ZSgicmdiYSgxLCAyLCAzLCA0MCUpIil9CitERVBSRUNBVElPTiBXQVJOSU5HOiBQYXNzaW5nIGEgcGVyY2VudGFnZSBhcyB0aGUgYWxwaGEgdmFsdWUgdG8gcmdiYSgpIHdpbGwgYmUKK2ludGVycHJldGVkIGRpZmZlcmVudGx5IGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLiBGb3Igbm93LCB1c2UgNDAgaW5zdGVhZC4KK1dBUk5JTkcKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiYV91bml0X3dhcm5pbmcKKyAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIHtldmFsdWF0ZSgicmdiYSgxLCAyLCAzLCA0MGVtKSIpfQorREVQUkVDQVRJT04gV0FSTklORzogUGFzc2luZyBhIG51bWJlciB3aXRoIHVuaXRzIGFzIHRoZSBhbHBoYSB2YWx1ZSB0byByZ2JhKCkgaXMKK2RlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuIFVzZSA0MCBpbnN0ZWFkLgorV0FSTklORworICBlbmQKKworICBkZWYgdGVzdF9yZWQKKyAgICBhc3NlcnRfZXF1YWwoIjE4IiwgZXZhbHVhdGUoInJlZCgjMTIzNDU2KSIpKQorICAgIGFzc2VydF9lcXVhbCgiMTgiLCBldmFsdWF0ZSgicmVkKCRjb2xvcjogIzEyMzQ1NikiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVkX2V4Y2VwdGlvbgorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IDEyIGlzIG5vdCBhIGNvbG9yIGZvciBgcmVkJyIsICJyZWQoMTIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZ3JlZW4KKyAgICBhc3NlcnRfZXF1YWwoIjUyIiwgZXZhbHVhdGUoImdyZWVuKCMxMjM0NTYpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI1MiIsIGV2YWx1YXRlKCJncmVlbigkY29sb3I6ICMxMjM0NTYpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2dyZWVuX2V4Y2VwdGlvbgorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IDEyIGlzIG5vdCBhIGNvbG9yIGZvciBgZ3JlZW4nIiwgImdyZWVuKDEyKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2JsdWUKKyAgICBhc3NlcnRfZXF1YWwoIjg2IiwgZXZhbHVhdGUoImJsdWUoIzEyMzQ1NikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjg2IiwgZXZhbHVhdGUoImJsdWUoJGNvbG9yOiAjMTIzNDU2KSIpKQorICBlbmQKKworICBkZWYgdGVzdF9ibHVlX2V4Y2VwdGlvbgorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IDEyIGlzIG5vdCBhIGNvbG9yIGZvciBgYmx1ZSciLCAiYmx1ZSgxMikiKQorICBlbmQKKworICBkZWYgdGVzdF9odWUKKyAgICBhc3NlcnRfZXF1YWwoIjE4ZGVnIiwgZXZhbHVhdGUoImh1ZShoc2woMTgsIDUwJSwgMjAlKSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjE4ZGVnIiwgZXZhbHVhdGUoImh1ZSgkY29sb3I6IGhzbCgxOCwgNTAlLCAyMCUpKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9odWVfZXhjZXB0aW9uCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjogMTIgaXMgbm90IGEgY29sb3IgZm9yIGBodWUnIiwgImh1ZSgxMikiKQorICBlbmQKKworICBkZWYgdGVzdF9zYXR1cmF0aW9uCisgICAgYXNzZXJ0X2VxdWFsKCI1MiUiLCBldmFsdWF0ZSgic2F0dXJhdGlvbihoc2woMjAsIDUyJSwgMjAlKSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjUyJSIsIGV2YWx1YXRlKCJzYXR1cmF0aW9uKGhzbCgyMCwgNTIsIDIwJSkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI1MiUiLCBldmFsdWF0ZSgic2F0dXJhdGlvbigkY29sb3I6IGhzbCgyMCwgNTIsIDIwJSkpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NhdHVyYXRpb25fZXhjZXB0aW9uCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjogMTIgaXMgbm90IGEgY29sb3IgZm9yIGBzYXR1cmF0aW9uJyIsICJzYXR1cmF0aW9uKDEyKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpZ2h0bmVzcworICAgIGFzc2VydF9lcXVhbCgiODYlIiwgZXZhbHVhdGUoImxpZ2h0bmVzcyhoc2woMTIwLCA1MCUsIDg2JSkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI4NiUiLCBldmFsdWF0ZSgibGlnaHRuZXNzKGhzbCgxMjAsIDUwJSwgODYpKSIpKQorICAgIGFzc2VydF9lcXVhbCgiODYlIiwgZXZhbHVhdGUoImxpZ2h0bmVzcygkY29sb3I6IGhzbCgxMjAsIDUwJSwgODYpKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9saWdodG5lc3NfZXhjZXB0aW9uCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjogMTIgaXMgbm90IGEgY29sb3IgZm9yIGBsaWdodG5lc3MnIiwgImxpZ2h0bmVzcygxMikiKQorICBlbmQKKworICBkZWYgdGVzdF9hbHBoYQorICAgIGFzc2VydF9lcXVhbCgiMSIsIGV2YWx1YXRlKCJhbHBoYSgjMTIzNDU2KSIpKQorICAgIGFzc2VydF9lcXVhbCgiMC4zNCIsIGV2YWx1YXRlKCJhbHBoYShyZ2JhKDAsIDEsIDIsIDAuMzQpKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMCIsIGV2YWx1YXRlKCJhbHBoYShoc2xhKDAsIDEsIDIsIDApKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMCIsIGV2YWx1YXRlKCJhbHBoYSgkY29sb3I6IGhzbGEoMCwgMSwgMiwgMCkpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2FscGhhX2V4Y2VwdGlvbgorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IDEyIGlzIG5vdCBhIGNvbG9yIGZvciBgYWxwaGEnIiwgImFscGhhKDEyKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X29wYWNpdHkKKyAgICBhc3NlcnRfZXF1YWwoIjEiLCBldmFsdWF0ZSgib3BhY2l0eSgjMTIzNDU2KSIpKQorICAgIGFzc2VydF9lcXVhbCgiMC4zNCIsIGV2YWx1YXRlKCJvcGFjaXR5KHJnYmEoMCwgMSwgMiwgMC4zNCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIwIiwgZXZhbHVhdGUoIm9wYWNpdHkoaHNsYSgwLCAxLCAyLCAwKSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjAiLCBldmFsdWF0ZSgib3BhY2l0eSgkY29sb3I6IGhzbGEoMCwgMSwgMiwgMCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJvcGFjaXR5KDIwJSkiLCBldmFsdWF0ZSgib3BhY2l0eSgyMCUpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X29wYWNpdHlfZXhjZXB0aW9uCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjogXCJmb29cIiBpcyBub3QgYSBjb2xvciBmb3IgYG9wYWNpdHknIiwgIm9wYWNpdHkoZm9vKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X29wYWNpZnkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMCwgMCwgMCwgMC43NSkiLCBldmFsdWF0ZSgib3BhY2lmeShyZ2JhKDAsIDAsIDAsIDAuNSksIDAuMjUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDAsIDAsIDAuMykiLCBldmFsdWF0ZSgib3BhY2lmeShyZ2JhKDAsIDAsIDAsIDAuMiksIDAuMSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMCwgMCwgMCwgMC43KSIsIGV2YWx1YXRlKCJmYWRlLWluKHJnYmEoMCwgMCwgMCwgMC4yKSwgMC41cHgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJibGFjayIsIGV2YWx1YXRlKCJmYWRlX2luKHJnYmEoMCwgMCwgMCwgMC4yKSwgMC44KSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmxhY2siLCBldmFsdWF0ZSgib3BhY2lmeShyZ2JhKDAsIDAsIDAsIDAuMiksIDEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDAsIDAsIDAuMikiLCBldmFsdWF0ZSgib3BhY2lmeShyZ2JhKDAsIDAsIDAsIDAuMiksIDAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgwLCAwLCAwLCAwLjIpIiwgZXZhbHVhdGUoIm9wYWNpZnkoJGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMiksICRhbW91bnQ6IDAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgwLCAwLCAwLCAwLjIpIiwgZXZhbHVhdGUoImZhZGUtaW4oJGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMiksICRhbW91bnQ6IDAlKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9vcGFjaWZ5X3Rlc3RzX2JvdW5kcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJBbW91bnQgLTAuMDAxIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIGZvciBgb3BhY2lmeSciLAorICAgICAgIm9wYWNpZnkocmdiYSgwLCAwLCAwLCAwLjIpLCAtMC4wMDEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiQW1vdW50IDEuMDAxIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIGZvciBgb3BhY2lmeSciLAorICAgICAgIm9wYWNpZnkocmdiYSgwLCAwLCAwLCAwLjIpLCAxLjAwMSkiKQorICBlbmQKKworICBkZWYgdGVzdF9vcGFjaWZ5X3Rlc3RzX3R5cGVzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjogXCJmb29cIiBpcyBub3QgYSBjb2xvciBmb3IgYG9wYWNpZnknIiwgIm9wYWNpZnkoXCJmb29cIiwgMTAlKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRhbW91bnQ6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgb3BhY2lmeSciLCAib3BhY2lmeSgjZmZmLCBcImZvb1wiKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3RyYW5zcGFyZW50aXplCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDAsIDAsIDAuMykiLCBldmFsdWF0ZSgidHJhbnNwYXJlbnRpemUocmdiYSgwLCAwLCAwLCAwLjUpLCAwLjIpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDAsIDAsIDAuMSkiLCBldmFsdWF0ZSgidHJhbnNwYXJlbnRpemUocmdiYSgwLCAwLCAwLCAwLjIpLCAwLjEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDAsIDAsIDAuMikiLCBldmFsdWF0ZSgiZmFkZS1vdXQocmdiYSgwLCAwLCAwLCAwLjUpLCAwLjNweCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMCwgMCwgMCwgMCkiLCBldmFsdWF0ZSgiZmFkZV9vdXQocmdiYSgwLCAwLCAwLCAwLjIpLCAwLjIpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDAsIDAsIDApIiwgZXZhbHVhdGUoInRyYW5zcGFyZW50aXplKHJnYmEoMCwgMCwgMCwgMC4yKSwgMSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMCwgMCwgMCwgMC4yKSIsIGV2YWx1YXRlKCJ0cmFuc3BhcmVudGl6ZShyZ2JhKDAsIDAsIDAsIDAuMiksIDApIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDAsIDAsIDAuMikiLCBldmFsdWF0ZSgidHJhbnNwYXJlbnRpemUoJGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMiksICRhbW91bnQ6IDApIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDAsIDAsIDAsIDAuMikiLCBldmFsdWF0ZSgiZmFkZS1vdXQoJGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMiksICRhbW91bnQ6IDApIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X3RyYW5zcGFyZW50aXplX3Rlc3RzX2JvdW5kcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJBbW91bnQgLTAuMDAxIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIGZvciBgdHJhbnNwYXJlbnRpemUnIiwKKyAgICAgICJ0cmFuc3BhcmVudGl6ZShyZ2JhKDAsIDAsIDAsIDAuMiksIC0wLjAwMSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJBbW91bnQgMS4wMDEgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEgZm9yIGB0cmFuc3BhcmVudGl6ZSciLAorICAgICAgInRyYW5zcGFyZW50aXplKHJnYmEoMCwgMCwgMCwgMC4yKSwgMS4wMDEpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfdHJhbnNwYXJlbnRpemVfdGVzdHNfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGNvbG9yOiBcImZvb1wiIGlzIG5vdCBhIGNvbG9yIGZvciBgdHJhbnNwYXJlbnRpemUnIiwgInRyYW5zcGFyZW50aXplKFwiZm9vXCIsIDEwJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYW1vdW50OiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYHRyYW5zcGFyZW50aXplJyIsICJ0cmFuc3BhcmVudGl6ZSgjZmZmLCBcImZvb1wiKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpZ2h0ZW4KKyAgICBhc3NlcnRfZXF1YWwoIiM0ZDRkNGQiLCBldmFsdWF0ZSgibGlnaHRlbihoc2woMCwgMCwgMCksIDMwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiNlZTAwMDAiLCBldmFsdWF0ZSgibGlnaHRlbigjODAwLCAyMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ3aGl0ZSIsIGV2YWx1YXRlKCJsaWdodGVuKCNmZmYsIDIwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIndoaXRlIiwgZXZhbHVhdGUoImxpZ2h0ZW4oIzgwMCwgMTAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiM4ODAwMDAiLCBldmFsdWF0ZSgibGlnaHRlbigjODAwLCAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMjM4LCAwLCAwLCAwLjUpIiwgZXZhbHVhdGUoImxpZ2h0ZW4ocmdiYSgxMzYsIDAsIDAsIDAuNSksIDIwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMjM4LCAwLCAwLCAwLjUpIiwgZXZhbHVhdGUoImxpZ2h0ZW4oJGNvbG9yOiByZ2JhKDEzNiwgMCwgMCwgMC41KSwgJGFtb3VudDogMjAlKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9saWdodGVuX3Rlc3RzX2JvdW5kcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJBbW91bnQgLTAuMDAxIG11c3QgYmUgYmV0d2VlbiAwJSBhbmQgMTAwJSBmb3IgYGxpZ2h0ZW4nIiwKKyAgICAgICJsaWdodGVuKCMxMjMsIC0wLjAwMSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJBbW91bnQgMTAwLjAwMSBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIDEwMCUgZm9yIGBsaWdodGVuJyIsCisgICAgICAibGlnaHRlbigjMTIzLCAxMDAuMDAxKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpZ2h0ZW5fdGVzdHNfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGNvbG9yOiBcImZvb1wiIGlzIG5vdCBhIGNvbG9yIGZvciBgbGlnaHRlbiciLCAibGlnaHRlbihcImZvb1wiLCAxMCUpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGFtb3VudDogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBsaWdodGVuJyIsICJsaWdodGVuKCNmZmYsIFwiZm9vXCIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGFya2VuCisgICAgYXNzZXJ0X2VxdWFsKCIjZmY2YTAwIiwgZXZhbHVhdGUoImRhcmtlbihoc2woMjUsIDEwMCwgODApLCAzMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjMjIwMDAwIiwgZXZhbHVhdGUoImRhcmtlbigjODAwLCAyMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJibGFjayIsIGV2YWx1YXRlKCJkYXJrZW4oIzAwMCwgMjAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmxhY2siLCBldmFsdWF0ZSgiZGFya2VuKCM4MDAsIDEwMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjODgwMDAwIiwgZXZhbHVhdGUoImRhcmtlbigjODAwLCAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMzQsIDAsIDAsIDAuNSkiLCBldmFsdWF0ZSgiZGFya2VuKHJnYmEoMTM2LCAwLCAwLCAwLjUpLCAyMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDM0LCAwLCAwLCAwLjUpIiwgZXZhbHVhdGUoImRhcmtlbigkY29sb3I6IHJnYmEoMTM2LCAwLCAwLCAwLjUpLCAkYW1vdW50OiAyMCUpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Rhcmtlbl90ZXN0c19ib3VuZHMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiQW1vdW50IC0wLjAwMSBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIDEwMCUgZm9yIGBkYXJrZW4nIiwKKyAgICAgICJkYXJrZW4oIzEyMywgLTAuMDAxKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkFtb3VudCAxMDAuMDAxIG11c3QgYmUgYmV0d2VlbiAwJSBhbmQgMTAwJSBmb3IgYGRhcmtlbiciLAorICAgICAgImRhcmtlbigjMTIzLCAxMDAuMDAxKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Rhcmtlbl90ZXN0c190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IFwiZm9vXCIgaXMgbm90IGEgY29sb3IgZm9yIGBkYXJrZW4nIiwgImRhcmtlbihcImZvb1wiLCAxMCUpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGFtb3VudDogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBkYXJrZW4nIiwgImRhcmtlbigjZmZmLCBcImZvb1wiKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NhdHVyYXRlCisgICAgYXNzZXJ0X2VxdWFsKCIjZDlmMmQ5IiwgZXZhbHVhdGUoInNhdHVyYXRlKGhzbCgxMjAsIDMwLCA5MCksIDIwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiM5ZTNmM2YiLCBldmFsdWF0ZSgic2F0dXJhdGUoIzg1NSwgMjAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmxhY2siLCBldmFsdWF0ZSgic2F0dXJhdGUoIzAwMCwgMjAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgid2hpdGUiLCBldmFsdWF0ZSgic2F0dXJhdGUoI2ZmZiwgMjAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzMzZmYzMyIsIGV2YWx1YXRlKCJzYXR1cmF0ZSgjOGE4LCAxMDAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzg4YWE4OCIsIGV2YWx1YXRlKCJzYXR1cmF0ZSgjOGE4LCAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMTU4LCA2MywgNjMsIDAuNSkiLCBldmFsdWF0ZSgic2F0dXJhdGUocmdiYSgxMzYsIDg1LCA4NSwgMC41KSwgMjAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgxNTgsIDYzLCA2MywgMC41KSIsIGV2YWx1YXRlKCJzYXR1cmF0ZSgkY29sb3I6IHJnYmEoMTM2LCA4NSwgODUsIDAuNSksICRhbW91bnQ6IDIwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInNhdHVyYXRlKDUwJSkiLCBldmFsdWF0ZSgic2F0dXJhdGUoNTAlKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9zYXR1cmF0ZV90ZXN0c19ib3VuZHMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiQW1vdW50IC0wLjAwMSBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIDEwMCUgZm9yIGBzYXR1cmF0ZSciLAorICAgICAgInNhdHVyYXRlKCMxMjMsIC0wLjAwMSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJBbW91bnQgMTAwLjAwMSBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIDEwMCUgZm9yIGBzYXR1cmF0ZSciLAorICAgICAgInNhdHVyYXRlKCMxMjMsIDEwMC4wMDEpIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2F0dXJhdGVfdGVzdHNfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGNvbG9yOiBcImZvb1wiIGlzIG5vdCBhIGNvbG9yIGZvciBgc2F0dXJhdGUnIiwgInNhdHVyYXRlKFwiZm9vXCIsIDEwJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYW1vdW50OiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYHNhdHVyYXRlJyIsICJzYXR1cmF0ZSgjZmZmLCBcImZvb1wiKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Rlc2F0dXJhdGUKKyAgICBhc3NlcnRfZXF1YWwoIiNlM2U4ZTMiLCBldmFsdWF0ZSgiZGVzYXR1cmF0ZShoc2woMTIwLCAzMCwgOTApLCAyMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjNzI2YjZiIiwgZXZhbHVhdGUoImRlc2F0dXJhdGUoIzg1NSwgMjAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmxhY2siLCBldmFsdWF0ZSgiZGVzYXR1cmF0ZSgjMDAwLCAyMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ3aGl0ZSIsIGV2YWx1YXRlKCJkZXNhdHVyYXRlKCNmZmYsIDIwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiM5OTk5OTkiLCBldmFsdWF0ZSgiZGVzYXR1cmF0ZSgjOGE4LCAxMDAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzg4YWE4OCIsIGV2YWx1YXRlKCJkZXNhdHVyYXRlKCM4YTgsIDAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgxMTQsIDEwNywgMTA3LCAwLjUpIiwgZXZhbHVhdGUoImRlc2F0dXJhdGUocmdiYSgxMzYsIDg1LCA4NSwgMC41KSwgMjAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgxMTQsIDEwNywgMTA3LCAwLjUpIiwgZXZhbHVhdGUoImRlc2F0dXJhdGUoJGNvbG9yOiByZ2JhKDEzNiwgODUsIDg1LCAwLjUpLCAkYW1vdW50OiAyMCUpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Rlc2F0dXJhdGVfdGVzdHNfYm91bmRzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkFtb3VudCAtMC4wMDEgbXVzdCBiZSBiZXR3ZWVuIDAlIGFuZCAxMDAlIGZvciBgZGVzYXR1cmF0ZSciLAorICAgICAgImRlc2F0dXJhdGUoIzEyMywgLTAuMDAxKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkFtb3VudCAxMDAuMDAxIG11c3QgYmUgYmV0d2VlbiAwJSBhbmQgMTAwJSBmb3IgYGRlc2F0dXJhdGUnIiwKKyAgICAgICJkZXNhdHVyYXRlKCMxMjMsIDEwMC4wMDEpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVzYXR1cmF0ZV90ZXN0c190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IFwiZm9vXCIgaXMgbm90IGEgY29sb3IgZm9yIGBkZXNhdHVyYXRlJyIsICJkZXNhdHVyYXRlKFwiZm9vXCIsIDEwJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYW1vdW50OiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYGRlc2F0dXJhdGUnIiwgImRlc2F0dXJhdGUoI2ZmZiwgXCJmb29cIikiKQorICBlbmQKKworICBkZWYgdGVzdF9hZGp1c3RfaHVlCisgICAgYXNzZXJ0X2VxdWFsKCIjZGVlZGVkIiwgZXZhbHVhdGUoImFkanVzdC1odWUoaHNsKDEyMCwgMzAsIDkwKSwgNjBkZWcpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjZWRlZGRlIiwgZXZhbHVhdGUoImFkanVzdC1odWUoaHNsKDEyMCwgMzAsIDkwKSwgLTYwZGVnKSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzg4NmExMSIsIGV2YWx1YXRlKCJhZGp1c3QtaHVlKCM4MTEsIDQ1ZGVnKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmxhY2siLCBldmFsdWF0ZSgiYWRqdXN0LWh1ZSgjMDAwLCA0NWRlZykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIndoaXRlIiwgZXZhbHVhdGUoImFkanVzdC1odWUoI2ZmZiwgNDVkZWcpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjODhhYTg4IiwgZXZhbHVhdGUoImFkanVzdC1odWUoIzhhOCwgMzYwZGVnKSIpKQorICAgIGFzc2VydF9lcXVhbCgiIzg4YWE4OCIsIGV2YWx1YXRlKCJhZGp1c3QtaHVlKCM4YTgsIDBkZWcpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDEzNiwgMTA2LCAxNywgMC41KSIsIGV2YWx1YXRlKCJhZGp1c3QtaHVlKHJnYmEoMTM2LCAxNywgMTcsIDAuNSksIDQ1ZGVnKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgxMzYsIDEwNiwgMTcsIDAuNSkiLCBldmFsdWF0ZSgiYWRqdXN0LWh1ZSgkY29sb3I6IHJnYmEoMTM2LCAxNywgMTcsIDAuNSksICRkZWdyZWVzOiA0NWRlZykiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYWRqdXN0X2h1ZV90ZXN0c190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IFwiZm9vXCIgaXMgbm90IGEgY29sb3IgZm9yIGBhZGp1c3QtaHVlJyIsICJhZGp1c3QtaHVlKFwiZm9vXCIsIDEwJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkZGVncmVlczogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBhZGp1c3QtaHVlJyIsICJhZGp1c3QtaHVlKCNmZmYsIFwiZm9vXCIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfYWRqdXN0X2NvbG9yCisgICAgIyBIU0wKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoImhzbCgxODAsIDMwLCA5MCkiKSwKKyAgICAgIGV2YWx1YXRlKCJhZGp1c3QtY29sb3IoaHNsKDEyMCwgMzAsIDkwKSwgJGh1ZTogNjBkZWcpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJoc2woMTIwLCA1MCwgOTApIiksCisgICAgICBldmFsdWF0ZSgiYWRqdXN0LWNvbG9yKGhzbCgxMjAsIDMwLCA5MCksICRzYXR1cmF0aW9uOiAyMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJoc2woMTIwLCAzMCwgNjApIiksCisgICAgICBldmFsdWF0ZSgiYWRqdXN0LWNvbG9yKGhzbCgxMjAsIDMwLCA5MCksICRsaWdodG5lc3M6IC0zMCUpIikpCisgICAgIyBSR0IKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoInJnYigxNSwgMjAsIDMwKSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRyZWQ6IDUpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2IoMTAsIDE1LCAzMCkiKSwKKyAgICAgIGV2YWx1YXRlKCJhZGp1c3QtY29sb3IocmdiKDEwLCAyMCwgMzApLCAkZ3JlZW46IC01KSIpKQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgicmdiKDEwLCAyMCwgNDApIiksCisgICAgICBldmFsdWF0ZSgiYWRqdXN0LWNvbG9yKHJnYigxMCwgMjAsIDMwKSwgJGJsdWU6IDEwKSIpKQorICAgICMgQWxwaGEKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoImhzbGEoMTIwLCAzMCwgOTAsIDAuNjUpIiksCisgICAgICBldmFsdWF0ZSgiYWRqdXN0LWNvbG9yKGhzbCgxMjAsIDMwLCA5MCksICRhbHBoYTogLTAuMzUpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2JhKDEwLCAyMCwgMzAsIDAuOSkiKSwKKyAgICAgIGV2YWx1YXRlKCJhZGp1c3QtY29sb3IocmdiYSgxMCwgMjAsIDMwLCAwLjQpLCAkYWxwaGE6IDAuNSkiKSkKKworICAgICMgSFNMIGNvbXBvc2FiaWxpdHkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoImhzbCgxODAsIDIwLCA5MCkiKSwKKyAgICAgIGV2YWx1YXRlKCJhZGp1c3QtY29sb3IoaHNsKDEyMCwgMzAsIDkwKSwgJGh1ZTogNjBkZWcsICRzYXR1cmF0aW9uOiAtMTAlKSIpKQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsKDE4MCwgMjAsIDk1KSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihoc2woMTIwLCAzMCwgOTApLCAkaHVlOiA2MGRlZywgJHNhdHVyYXRpb246IC0xMCUsICRsaWdodG5lc3M6IDUlKSIpKQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsYSgxMjAsIDIwLCA5NSwgMC4zKSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihoc2woMTIwLCAzMCwgOTApLCAkc2F0dXJhdGlvbjogLTEwJSwgJGxpZ2h0bmVzczogNSUsICRhbHBoYTogLTAuNykiKSkKKworICAgICMgUkdCIGNvbXBvc2FiaWxpdHkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoInJnYigxNSwgMjAsIDI5KSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRyZWQ6IDUsICRibHVlOiAtMSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoInJnYigxNSwgNDUsIDI5KSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRyZWQ6IDUsICRncmVlbjogMjUsICRibHVlOiAtMSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoInJnYmEoMTAsIDI1LCAyOSwgMC43KSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRncmVlbjogNSwgJGJsdWU6IC0xLCAkYWxwaGE6IC0wLjMpIikpCisKKyAgICAjIEhTTCByYW5nZSByZXN0cmljdGlvbgorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsKDEyMCwgMzAsIDkwKSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihoc2woMTIwLCAzMCwgOTApLCAkaHVlOiA3MjBkZWcpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJoc2woMTIwLCAwLCA5MCkiKSwKKyAgICAgIGV2YWx1YXRlKCJhZGp1c3QtY29sb3IoaHNsKDEyMCwgMzAsIDkwKSwgJHNhdHVyYXRpb246IC05MCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJoc2woMTIwLCAzMCwgMTAwKSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihoc2woMTIwLCAzMCwgOTApLCAkbGlnaHRuZXNzOiAzMCUpIikpCisKKyAgICAjIFJHQiByYW5nZSByZXN0cmljdGlvbgorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgicmdiKDI1NSwgMjAsIDMwKSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRyZWQ6IDI1MCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoInJnYigxMCwgMCwgMzApIiksCisgICAgICBldmFsdWF0ZSgiYWRqdXN0LWNvbG9yKHJnYigxMCwgMjAsIDMwKSwgJGdyZWVuOiAtMzApIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2IoMTAsIDIwLCAwKSIpLAorICAgICAgZXZhbHVhdGUoImFkanVzdC1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRibHVlOiAtNDApIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2FkanVzdF9jb2xvcl90ZXN0c190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IFwiZm9vXCIgaXMgbm90IGEgY29sb3IgZm9yIGBhZGp1c3QtY29sb3InIiwgImFkanVzdC1jb2xvcihmb28sICRodWU6IDEwKSIpCisgICAgIyBIU0wKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGh1ZTogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBhZGp1c3QtY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgJGh1ZTogZm9vKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzYXR1cmF0aW9uOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYGFkanVzdC1jb2xvciciLAorICAgICAgImFkanVzdC1jb2xvcihibHVlLCAkc2F0dXJhdGlvbjogZm9vKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRsaWdodG5lc3M6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRsaWdodG5lc3M6IGZvbykiKQorICAgICMgUkdCCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRyZWQ6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRyZWQ6IGZvbykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkZ3JlZW46IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRncmVlbjogZm9vKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRibHVlOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYGFkanVzdC1jb2xvciciLAorICAgICAgImFkanVzdC1jb2xvcihibHVlLCAkYmx1ZTogZm9vKSIpCisgICAgIyBBbHBoYQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYWxwaGE6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRhbHBoYTogZm9vKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2FkanVzdF9jb2xvcl90ZXN0c19hcmdfcmFuZ2UKKyAgICAjIEhTTAorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2F0dXJhdGlvbjogQW1vdW50IDEwMSUgbXVzdCBiZSBiZXR3ZWVuIC0xMDAlIGFuZCAxMDAlIGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRzYXR1cmF0aW9uOiAxMDElKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzYXR1cmF0aW9uOiBBbW91bnQgLTEwMSUgbXVzdCBiZSBiZXR3ZWVuIC0xMDAlIGFuZCAxMDAlIGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRzYXR1cmF0aW9uOiAtMTAxJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkbGlnaHRuZXNzOiBBbW91bnQgMTAxJSBtdXN0IGJlIGJldHdlZW4gLTEwMCUgYW5kIDEwMCUgZm9yIGBhZGp1c3QtY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgJGxpZ2h0bmVzczogMTAxJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkbGlnaHRuZXNzOiBBbW91bnQgLTEwMSUgbXVzdCBiZSBiZXR3ZWVuIC0xMDAlIGFuZCAxMDAlIGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRsaWdodG5lc3M6IC0xMDElKSIpCisgICAgIyBSR0IKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHJlZDogQW1vdW50IDI1NiBtdXN0IGJlIGJldHdlZW4gLTI1NSBhbmQgMjU1IGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRyZWQ6IDI1NikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkcmVkOiBBbW91bnQgLTI1NiBtdXN0IGJlIGJldHdlZW4gLTI1NSBhbmQgMjU1IGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRyZWQ6IC0yNTYpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGdyZWVuOiBBbW91bnQgMjU2IG11c3QgYmUgYmV0d2VlbiAtMjU1IGFuZCAyNTUgZm9yIGBhZGp1c3QtY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgJGdyZWVuOiAyNTYpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGdyZWVuOiBBbW91bnQgLTI1NiBtdXN0IGJlIGJldHdlZW4gLTI1NSBhbmQgMjU1IGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRncmVlbjogLTI1NikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYmx1ZTogQW1vdW50IDI1NiBtdXN0IGJlIGJldHdlZW4gLTI1NSBhbmQgMjU1IGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRibHVlOiAyNTYpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGJsdWU6IEFtb3VudCAtMjU2IG11c3QgYmUgYmV0d2VlbiAtMjU1IGFuZCAyNTUgZm9yIGBhZGp1c3QtY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgJGJsdWU6IC0yNTYpIikKKyAgICAjIEFscGhhCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRhbHBoYTogQW1vdW50IDEuMSBtdXN0IGJlIGJldHdlZW4gLTEgYW5kIDEgZm9yIGBhZGp1c3QtY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgJGFscGhhOiAxLjEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGFscGhhOiBBbW91bnQgLTEuMSBtdXN0IGJlIGJldHdlZW4gLTEgYW5kIDEgZm9yIGBhZGp1c3QtY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgJGFscGhhOiAtMS4xKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2FkanVzdF9jb2xvcl9hcmd1bWVudF9lcnJvcnMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiVW5rbm93biBhcmd1bWVudCAkaG9vICgyNjBkZWcpIGZvciBgYWRqdXN0LWNvbG9yJyIsCisgICAgICAiYWRqdXN0LWNvbG9yKGJsdWUsICRob286IDI2MGRlZykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJDYW5ub3Qgc3BlY2lmeSBIU0wgYW5kIFJHQiB2YWx1ZXMgZm9yIGEgY29sb3IgYXQgdGhlIHNhbWUgdGltZSBmb3IgYGFkanVzdC1jb2xvciciLAorICAgICAgImFkanVzdC1jb2xvcihibHVlLCAkaHVlOiAxMjBkZWcsICRyZWQ6IDEwKSIpOworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIxMHB4IGlzIG5vdCBhIGtleXdvcmQgYXJndW1lbnQgZm9yIGBhZGp1c3RfY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgMTBweCkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIxMHB4IGlzIG5vdCBhIGtleXdvcmQgYXJndW1lbnQgZm9yIGBhZGp1c3RfY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgMTBweCwgMjBweCkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIxMHB4IGlzIG5vdCBhIGtleXdvcmQgYXJndW1lbnQgZm9yIGBhZGp1c3RfY29sb3InIiwKKyAgICAgICJhZGp1c3QtY29sb3IoYmx1ZSwgMTBweCwgJGh1ZTogMTgwZGVnKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NjYWxlX2NvbG9yCisgICAgIyBIU0wKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoImhzbCgxMjAsIDUxLCA5MCkiKSwKKyAgICAgIGV2YWx1YXRlKCJzY2FsZS1jb2xvcihoc2woMTIwLCAzMCwgOTApLCAkc2F0dXJhdGlvbjogMzAlKSIpKQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsKDEyMCwgMzAsIDc2LjUpIiksCisgICAgICBldmFsdWF0ZSgic2NhbGUtY29sb3IoaHNsKDEyMCwgMzAsIDkwKSwgJGxpZ2h0bmVzczogLTE1JSkiKSkKKyAgICAjIFJHQgorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgicmdiKDE1NywgMjAsIDMwKSIpLAorICAgICAgZXZhbHVhdGUoInNjYWxlLWNvbG9yKHJnYigxMCwgMjAsIDMwKSwgJHJlZDogNjAlKSIpKQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgicmdiKDEwLCAzOC44LCAzMCkiKSwKKyAgICAgIGV2YWx1YXRlKCJzY2FsZS1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRncmVlbjogOCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2IoMTAsIDIwLCAyMCkiKSwKKyAgICAgIGV2YWx1YXRlKCJzY2FsZS1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRibHVlOiAtKDEvMykqMTAwJSkiKSkKKyAgICAjIEFscGhhCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJoc2xhKDEyMCwgMzAsIDkwLCAwLjg2KSIpLAorICAgICAgZXZhbHVhdGUoInNjYWxlLWNvbG9yKGhzbCgxMjAsIDMwLCA5MCksICRhbHBoYTogLTE0JSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoInJnYmEoMTAsIDIwLCAzMCwgMC44MikiKSwKKyAgICAgIGV2YWx1YXRlKCJzY2FsZS1jb2xvcihyZ2JhKDEwLCAyMCwgMzAsIDAuOCksICRhbHBoYTogMTAlKSIpKQorCisgICAgIyBIU0wgY29tcG9zYWJpbGl0eQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsKDEyMCwgNTEsIDc2LjUpIiksCisgICAgICBldmFsdWF0ZSgic2NhbGUtY29sb3IoaHNsKDEyMCwgMzAsIDkwKSwgJHNhdHVyYXRpb246IDMwJSwgJGxpZ2h0bmVzczogLTE1JSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoImhzbGEoMTIwLCA1MSwgOTAsIDAuMikiKSwKKyAgICAgIGV2YWx1YXRlKCJzY2FsZS1jb2xvcihoc2woMTIwLCAzMCwgOTApLCAkc2F0dXJhdGlvbjogMzAlLCAkYWxwaGE6IC04MCUpIikpCisKKyAgICAjIFJHQiBjb21wb3NhYmlsaXR5CisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2IoMTU3LCAzOC44LCAzMCkiKSwKKyAgICAgIGV2YWx1YXRlKCJzY2FsZS1jb2xvcihyZ2IoMTAsIDIwLCAzMCksICRyZWQ6IDYwJSwgJGdyZWVuOiA4JSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoInJnYigxNTcsIDM4LjgsIDIwKSIpLAorICAgICAgZXZhbHVhdGUoInNjYWxlLWNvbG9yKHJnYigxMCwgMjAsIDMwKSwgJHJlZDogNjAlLCAkZ3JlZW46IDglLCAkYmx1ZTogLSgxLzMpKjEwMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2JhKDEwLCAzOC44LCAyMCwgMC41NSkiKSwKKyAgICAgIGV2YWx1YXRlKCJzY2FsZS1jb2xvcihyZ2JhKDEwLCAyMCwgMzAsIDAuNSksICRncmVlbjogOCUsICRibHVlOiAtKDEvMykqMTAwJSwgJGFscGhhOiAxMCUpIikpCisKKyAgICAjIEV4dHJlbWVzCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJoc2woMTIwLCAxMDAsIDkwKSIpLAorICAgICAgZXZhbHVhdGUoInNjYWxlLWNvbG9yKGhzbCgxMjAsIDMwLCA5MCksICRzYXR1cmF0aW9uOiAxMDAlKSIpKQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsKDEyMCwgMzAsIDkwKSIpLAorICAgICAgZXZhbHVhdGUoInNjYWxlLWNvbG9yKGhzbCgxMjAsIDMwLCA5MCksICRzYXR1cmF0aW9uOiAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoImhzbCgxMjAsIDAsIDkwKSIpLAorICAgICAgZXZhbHVhdGUoInNjYWxlLWNvbG9yKGhzbCgxMjAsIDMwLCA5MCksICRzYXR1cmF0aW9uOiAtMTAwJSkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2NhbGVfY29sb3JfdGVzdHNfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGNvbG9yOiBcImZvb1wiIGlzIG5vdCBhIGNvbG9yIGZvciBgc2NhbGUtY29sb3InIiwgInNjYWxlLWNvbG9yKGZvbywgJHJlZDogMTAlKSIpCisgICAgIyBIU0wKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNhdHVyYXRpb246IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgc2NhbGUtY29sb3InIiwKKyAgICAgICJzY2FsZS1jb2xvcihibHVlLCAkc2F0dXJhdGlvbjogZm9vKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRsaWdodG5lc3M6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgc2NhbGUtY29sb3InIiwKKyAgICAgICJzY2FsZS1jb2xvcihibHVlLCAkbGlnaHRuZXNzOiBmb28pIikKKyAgICAjIFJHQgorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkcmVkOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYHNjYWxlLWNvbG9yJyIsCisgICAgICAic2NhbGUtY29sb3IoYmx1ZSwgJHJlZDogZm9vKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRncmVlbjogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBzY2FsZS1jb2xvciciLAorICAgICAgInNjYWxlLWNvbG9yKGJsdWUsICRncmVlbjogZm9vKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRibHVlOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYHNjYWxlLWNvbG9yJyIsCisgICAgICAic2NhbGUtY29sb3IoYmx1ZSwgJGJsdWU6IGZvbykiKQorICAgICMgQWxwaGEKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGFscGhhOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYHNjYWxlLWNvbG9yJyIsCisgICAgICAic2NhbGUtY29sb3IoYmx1ZSwgJGFscGhhOiBmb28pIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2NhbGVfY29sb3JfYXJndW1lbnRfZXJyb3JzCisgICAgIyBSYW5nZQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2F0dXJhdGlvbjogQW1vdW50IDEwMSUgbXVzdCBiZSBiZXR3ZWVuIC0xMDAlIGFuZCAxMDAlIGZvciBgc2NhbGUtY29sb3InIiwKKyAgICAgICJzY2FsZS1jb2xvcihibHVlLCAkc2F0dXJhdGlvbjogMTAxJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkcmVkOiBBbW91bnQgLTEwMSUgbXVzdCBiZSBiZXR3ZWVuIC0xMDAlIGFuZCAxMDAlIGZvciBgc2NhbGUtY29sb3InIiwKKyAgICAgICJzY2FsZS1jb2xvcihibHVlLCAkcmVkOiAtMTAxJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYWxwaGE6IEFtb3VudCAtMTAxJSBtdXN0IGJlIGJldHdlZW4gLTEwMCUgYW5kIDEwMCUgZm9yIGBzY2FsZS1jb2xvciciLAorICAgICAgInNjYWxlLWNvbG9yKGJsdWUsICRhbHBoYTogLTEwMSUpIikKKworICAgICMgVW5pdAorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJFeHBlY3RlZCAkc2F0dXJhdGlvbiB0byBoYXZlIGEgdW5pdCBvZiAlIGJ1dCBnb3QgODAgZm9yIGBzY2FsZS1jb2xvciciLAorICAgICAgInNjYWxlLWNvbG9yKGJsdWUsICRzYXR1cmF0aW9uOiA4MCkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJFeHBlY3RlZCAkYWxwaGEgdG8gaGF2ZSBhIHVuaXQgb2YgJSBidXQgZ290IDAuNSBmb3IgYHNjYWxlLWNvbG9yJyIsCisgICAgICAic2NhbGUtY29sb3IoYmx1ZSwgJGFscGhhOiAwLjUpIikKKworICAgICMgVW5rbm93biBhcmd1bWVudAorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJVbmtub3duIGFyZ3VtZW50ICRodWUgKDgwJSkgZm9yIGBzY2FsZS1jb2xvciciLCAic2NhbGUtY29sb3IoYmx1ZSwgJGh1ZTogODAlKSIpCisKKyAgICAjIE5vbi1rZXl3b3JkIGFyZworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIxMHB4IGlzIG5vdCBhIGtleXdvcmQgYXJndW1lbnQgZm9yIGBzY2FsZV9jb2xvciciLCAic2NhbGUtY29sb3IoYmx1ZSwgMTBweCkiKQorCisgICAgIyBIU0wvUkdCCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkNhbm5vdCBzcGVjaWZ5IEhTTCBhbmQgUkdCIHZhbHVlcyBmb3IgYSBjb2xvciBhdCB0aGUgc2FtZSB0aW1lIGZvciBgc2NhbGUtY29sb3InIiwKKyAgICAgICJzY2FsZS1jb2xvcihibHVlLCAkbGlnaHRuZXNzOiAxMCUsICRyZWQ6IDIwJSkiKTsKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2hhbmdlX2NvbG9yCisgICAgIyBIU0wKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoImhzbCgxOTUsIDMwLCA5MCkiKSwKKyAgICAgIGV2YWx1YXRlKCJjaGFuZ2UtY29sb3IoaHNsKDEyMCwgMzAsIDkwKSwgJGh1ZTogMTk1ZGVnKSIpKQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsKDEyMCwgNTAsIDkwKSIpLAorICAgICAgZXZhbHVhdGUoImNoYW5nZS1jb2xvcihoc2woMTIwLCAzMCwgOTApLCAkc2F0dXJhdGlvbjogNTAlKSIpKQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsKDEyMCwgMzAsIDQwKSIpLAorICAgICAgZXZhbHVhdGUoImNoYW5nZS1jb2xvcihoc2woMTIwLCAzMCwgOTApLCAkbGlnaHRuZXNzOiA0MCUpIikpCisgICAgIyBSR0IKKyAgICBhc3NlcnRfZXF1YWwoZXZhbHVhdGUoInJnYigxMjMsIDIwLCAzMCkiKSwKKyAgICAgIGV2YWx1YXRlKCJjaGFuZ2UtY29sb3IocmdiKDEwLCAyMCwgMzApLCAkcmVkOiAxMjMpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2IoMTAsIDIzNCwgMzApIiksCisgICAgICBldmFsdWF0ZSgiY2hhbmdlLWNvbG9yKHJnYigxMCwgMjAsIDMwKSwgJGdyZWVuOiAyMzQpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2IoMTAsIDIwLCAxOTgpIiksCisgICAgICBldmFsdWF0ZSgiY2hhbmdlLWNvbG9yKHJnYigxMCwgMjAsIDMwKSwgJGJsdWU6IDE5OCkiKSkKKyAgICAjIEFscGhhCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJyZ2JhKDEwLCAyMCwgMzAsIDAuNzYpIiksCisgICAgICBldmFsdWF0ZSgiY2hhbmdlLWNvbG9yKHJnYigxMCwgMjAsIDMwKSwgJGFscGhhOiAwLjc2KSIpKQorCisgICAgIyBIU0wgY29tcG9zYWJpbGl0eQorICAgIGFzc2VydF9lcXVhbChldmFsdWF0ZSgiaHNsKDU2LCAzMCwgNDcpIiksCisgICAgICBldmFsdWF0ZSgiY2hhbmdlLWNvbG9yKGhzbCgxMjAsIDMwLCA5MCksICRodWU6IDU2ZGVnLCAkbGlnaHRuZXNzOiA0NyUpIikpCisgICAgYXNzZXJ0X2VxdWFsKGV2YWx1YXRlKCJoc2xhKDU2LCAzMCwgNDcsIDAuOSkiKSwKKyAgICAgIGV2YWx1YXRlKCJjaGFuZ2UtY29sb3IoaHNsKDEyMCwgMzAsIDkwKSwgJGh1ZTogNTZkZWcsICRsaWdodG5lc3M6IDQ3JSwgJGFscGhhOiAwLjkpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NoYW5nZV9jb2xvcl90ZXN0c190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3I6IFwiZm9vXCIgaXMgbm90IGEgY29sb3IgZm9yIGBjaGFuZ2UtY29sb3InIiwgImNoYW5nZS1jb2xvcihmb28sICRyZWQ6IDEwJSkiKQorICAgICMgSFNMCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzYXR1cmF0aW9uOiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYGNoYW5nZS1jb2xvciciLAorICAgICAgImNoYW5nZS1jb2xvcihibHVlLCAkc2F0dXJhdGlvbjogZm9vKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRsaWdodG5lc3M6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgY2hhbmdlLWNvbG9yJyIsCisgICAgICAiY2hhbmdlLWNvbG9yKGJsdWUsICRsaWdodG5lc3M6IGZvbykiKQorICAgICMgUkdCCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRyZWQ6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgY2hhbmdlLWNvbG9yJyIsICJjaGFuZ2UtY29sb3IoYmx1ZSwgJHJlZDogZm9vKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRncmVlbjogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBjaGFuZ2UtY29sb3InIiwgImNoYW5nZS1jb2xvcihibHVlLCAkZ3JlZW46IGZvbykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYmx1ZTogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBjaGFuZ2UtY29sb3InIiwgImNoYW5nZS1jb2xvcihibHVlLCAkYmx1ZTogZm9vKSIpCisgICAgIyBBbHBoYQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYWxwaGE6IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgY2hhbmdlLWNvbG9yJyIsICJjaGFuZ2UtY29sb3IoYmx1ZSwgJGFscGhhOiBmb28pIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2hhbmdlX2NvbG9yX2FyZ3VtZW50X2Vycm9ycworICAgICMgUmFuZ2UKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiU2F0dXJhdGlvbiAxMDElIG11c3QgYmUgYmV0d2VlbiAwJSBhbmQgMTAwJSBmb3IgYGNoYW5nZS1jb2xvciciLAorICAgICAgImNoYW5nZS1jb2xvcihibHVlLCAkc2F0dXJhdGlvbjogMTAxJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJMaWdodG5lc3MgMTAxJSBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIDEwMCUgZm9yIGBjaGFuZ2UtY29sb3InIiwKKyAgICAgICJjaGFuZ2UtY29sb3IoYmx1ZSwgJGxpZ2h0bmVzczogMTAxJSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJSZWQgdmFsdWUgLTEgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSBmb3IgYGNoYW5nZS1jb2xvciciLAorICAgICAgImNoYW5nZS1jb2xvcihibHVlLCAkcmVkOiAtMSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJHcmVlbiB2YWx1ZSAyNTYgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSBmb3IgYGNoYW5nZS1jb2xvciciLAorICAgICAgImNoYW5nZS1jb2xvcihibHVlLCAkZ3JlZW46IDI1NikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJCbHVlIHZhbHVlIDUwMCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1IGZvciBgY2hhbmdlLWNvbG9yJyIsCisgICAgICAiY2hhbmdlLWNvbG9yKGJsdWUsICRibHVlOiA1MDApIikKKworICAgICMgVW5rbm93biBhcmd1bWVudAorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJVbmtub3duIGFyZ3VtZW50ICRob28gKDgwJSkgZm9yIGBjaGFuZ2UtY29sb3InIiwgImNoYW5nZS1jb2xvcihibHVlLCAkaG9vOiA4MCUpIikKKworICAgICMgTm9uLWtleXdvcmQgYXJnCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIjEwcHggaXMgbm90IGEga2V5d29yZCBhcmd1bWVudCBmb3IgYGNoYW5nZV9jb2xvciciLCAiY2hhbmdlLWNvbG9yKGJsdWUsIDEwcHgpIikKKworICAgICMgSFNML1JHQgorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJDYW5ub3Qgc3BlY2lmeSBIU0wgYW5kIFJHQiB2YWx1ZXMgZm9yIGEgY29sb3IgYXQgdGhlIHNhbWUgdGltZSBmb3IgYGNoYW5nZS1jb2xvciciLAorICAgICAgImNoYW5nZS1jb2xvcihibHVlLCAkbGlnaHRuZXNzOiAxMCUsICRyZWQ6IDEyMCkiKTsKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWVfaGV4X3N0cgorICAgIGFzc2VydF9lcXVhbCgiI0ZGQUExMUNDIiwgZXZhbHVhdGUoJ2llLWhleC1zdHIoI2FhMTFjYyknKSkKKyAgICBhc3NlcnRfZXF1YWwoIiNGRkFBMTFDQyIsIGV2YWx1YXRlKCdpZS1oZXgtc3RyKCNhMWMpJykpCisgICAgYXNzZXJ0X2VxdWFsKCIjRkZBQTExQ0MiLCBldmFsdWF0ZSgnaWUtaGV4LXN0cigjQTFjKScpKQorICAgIGFzc2VydF9lcXVhbCgiIzgwRkYwMDAwIiwgZXZhbHVhdGUoJ2llLWhleC1zdHIocmdiYSgyNTUsIDAsIDAsIDAuNSkpJykpCisgIGVuZAorCisgIGRlZiB0ZXN0X21peAorICAgIGFzc2VydF9lcXVhbCgicHVycGxlIiwgZXZhbHVhdGUoIm1peCgjZjAwLCAjMDBmKSIpKQorICAgIGFzc2VydF9lcXVhbCgiZ3JheSIsIGV2YWx1YXRlKCJtaXgoI2YwMCwgIzBmZikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiM4MDkxNTUiLCBldmFsdWF0ZSgibWl4KCNmNzAsICMwYWEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjNDAwMGJmIiwgZXZhbHVhdGUoIm1peCgjZjAwLCAjMDBmLCAyNSUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDY0LCAwLCAxOTEsIDAuNzUpIiwgZXZhbHVhdGUoIm1peChyZ2JhKDI1NSwgMCwgMCwgMC41KSwgIzAwZikiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJlZCIsIGV2YWx1YXRlKCJtaXgoI2YwMCwgIzAwZiwgMTAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImJsdWUiLCBldmFsdWF0ZSgibWl4KCNmMDAsICMwMGYsIDAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgyNTUsIDAsIDAsIDAuNSkiLCBldmFsdWF0ZSgibWl4KCNmMDAsIHRyYW5zcGFyZW50aXplKCMwMGYsIDEpKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgwLCAwLCAyNTUsIDAuNSkiLCBldmFsdWF0ZSgibWl4KHRyYW5zcGFyZW50aXplKCNmMDAsIDEpLCAjMDBmKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmVkIiwgZXZhbHVhdGUoIm1peCgjZjAwLCB0cmFuc3BhcmVudGl6ZSgjMDBmLCAxKSwgMTAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImJsdWUiLCBldmFsdWF0ZSgibWl4KHRyYW5zcGFyZW50aXplKCNmMDAsIDEpLCAjMDBmLCAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMCwgMCwgMjU1LCAwKSIsIGV2YWx1YXRlKCJtaXgoI2YwMCwgdHJhbnNwYXJlbnRpemUoIzAwZiwgMSksIDAlKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmdiYSgyNTUsIDAsIDAsIDApIiwgZXZhbHVhdGUoIm1peCh0cmFuc3BhcmVudGl6ZSgjZjAwLCAxKSwgIzAwZiwgMTAwJSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMjU1LCAwLCAwLCAwKSIsIGV2YWx1YXRlKCJtaXgoJGNvbG9yMTogdHJhbnNwYXJlbnRpemUoI2YwMCwgMSksICRjb2xvcjI6ICMwMGYsICR3ZWlnaHQ6IDEwMCUpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X21peF90ZXN0c190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkY29sb3IxOiBcImZvb1wiIGlzIG5vdCBhIGNvbG9yIGZvciBgbWl4JyIsICJtaXgoXCJmb29cIiwgI2YwMCwgMTAlKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjI6IFwiZm9vXCIgaXMgbm90IGEgY29sb3IgZm9yIGBtaXgnIiwgIm1peCgjZjAwLCBcImZvb1wiLCAxMCUpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHdlaWdodDogXCJmb29cIiBpcyBub3QgYSBudW1iZXIgZm9yIGBtaXgnIiwgIm1peCgjZjAwLCAjYmFmLCBcImZvb1wiKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X21peF90ZXN0c19ib3VuZHMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiV2VpZ2h0IC0wLjAwMSBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIDEwMCUgZm9yIGBtaXgnIiwKKyAgICAgICJtaXgoIzEyMywgIzQ1NiwgLTAuMDAxKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIldlaWdodCAxMDAuMDAxIG11c3QgYmUgYmV0d2VlbiAwJSBhbmQgMTAwJSBmb3IgYG1peCciLAorICAgICAgIm1peCgjMTIzLCAjNDU2LCAxMDAuMDAxKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2dyYXlzY2FsZQorICAgIGFzc2VydF9lcXVhbCgiI2JiYmJiYiIsIGV2YWx1YXRlKCJncmF5c2NhbGUoI2FiYykiKSkKKyAgICBhc3NlcnRfZXF1YWwoImdyYXkiLCBldmFsdWF0ZSgiZ3JheXNjYWxlKCNmMDApIikpCisgICAgYXNzZXJ0X2VxdWFsKCJncmF5IiwgZXZhbHVhdGUoImdyYXlzY2FsZSgjMDBmKSIpKQorICAgIGFzc2VydF9lcXVhbCgid2hpdGUiLCBldmFsdWF0ZSgiZ3JheXNjYWxlKHdoaXRlKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmxhY2siLCBldmFsdWF0ZSgiZ3JheXNjYWxlKGJsYWNrKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmxhY2siLCBldmFsdWF0ZSgiZ3JheXNjYWxlKCRjb2xvcjogYmxhY2spIikpCisKKyAgICBhc3NlcnRfZXF1YWwoImdyYXlzY2FsZSgyKSIsIGV2YWx1YXRlKCJncmF5c2NhbGUoMikiKSkKKyAgICBhc3NlcnRfZXF1YWwoImdyYXlzY2FsZSgtNXB4KSIsIGV2YWx1YXRlKCJncmF5c2NhbGUoLTVweCkiKSkKKyAgZW5kCisKKyAgZGVmIHRldHNfZ3JheXNjYWxlX3Rlc3RzX3R5cGVzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjogXCJmb29cIiBpcyBub3QgYSBjb2xvciBmb3IgYGdyYXlzY2FsZSciLCAiZ3JheXNjYWxlKFwiZm9vXCIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcGxlbWVudAorICAgIGFzc2VydF9lcXVhbCgiI2NjYmJhYSIsIGV2YWx1YXRlKCJjb21wbGVtZW50KCNhYmMpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJjeWFuIiwgZXZhbHVhdGUoImNvbXBsZW1lbnQocmVkKSIpKQorICAgIGFzc2VydF9lcXVhbCgicmVkIiwgZXZhbHVhdGUoImNvbXBsZW1lbnQoY3lhbikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIndoaXRlIiwgZXZhbHVhdGUoImNvbXBsZW1lbnQod2hpdGUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJibGFjayIsIGV2YWx1YXRlKCJjb21wbGVtZW50KGJsYWNrKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmxhY2siLCBldmFsdWF0ZSgiY29tcGxlbWVudCgkY29sb3I6IGJsYWNrKSIpKQorICBlbmQKKworICBkZWYgdGV0c19jb21wbGVtZW50X3Rlc3RzX3R5cGVzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRjb2xvcjogXCJmb29cIiBpcyBub3QgYSBjb2xvciBmb3IgYGNvbXBsZW1lbnQnIiwgImNvbXBsZW1lbnQoXCJmb29cIikiKQorICBlbmQKKworICBkZWYgdGVzdF9pbnZlcnQKKyAgICBhc3NlcnRfZXF1YWwoIiMxMTIyMzMiLCBldmFsdWF0ZSgiaW52ZXJ0KCNlZGMpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIjZDhjYWJkIiwgZXZhbHVhdGUoImludmVydCgjZWRjLCAxMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJyZ2JhKDI0NSwgMjM1LCAyMjUsIDAuNSkiLCBldmFsdWF0ZSgiaW52ZXJ0KHJnYmEoMTAsIDIwLCAzMCwgMC41KSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInJnYmEoMzQsIDQyLCA1MCwgMC41KSIsIGV2YWx1YXRlKCJpbnZlcnQocmdiYSgxMCwgMjAsIDMwLCAwLjUpLCAxMCUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJpbnZlcnQoMjAlKSIsIGV2YWx1YXRlKCJpbnZlcnQoMjAlKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9pbnZlcnRfdGVzdHNfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGNvbG9yOiBcImZvb1wiIGlzIG5vdCBhIGNvbG9yIGZvciBgaW52ZXJ0JyIsICJpbnZlcnQoXCJmb29cIikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkd2VpZ2h0OiBcImZvb1wiIGlzIG5vdCBhIG51bWJlciBmb3IgYGludmVydCciLCAiaW52ZXJ0KCNlZGMsIFwiZm9vXCIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW52ZXJ0X3Rlc3RzX2JvdW5kcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJXZWlnaHQgLTAuMDAxIG11c3QgYmUgYmV0d2VlbiAwJSBhbmQgMTAwJSBmb3IgYGludmVydCciLAorICAgICAgImludmVydCgjZWRjLCAtMC4wMDEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiV2VpZ2h0IDEwMC4wMDEgbXVzdCBiZSBiZXR3ZWVuIDAlIGFuZCAxMDAlIGZvciBgaW52ZXJ0JyIsCisgICAgICAiaW52ZXJ0KCNlZGMsIDEwMC4wMDEpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5xdW90ZQorICAgIGFzc2VydF9lcXVhbCgnZm9vJywgZXZhbHVhdGUoJ3VucXVvdGUoImZvbyIpJykpCisgICAgYXNzZXJ0X2VxdWFsKCdmb28nLCBldmFsdWF0ZSgndW5xdW90ZShmb28pJykpCisgICAgYXNzZXJ0X2VxdWFsKCdmb28nLCBldmFsdWF0ZSgndW5xdW90ZSgkc3RyaW5nOiBmb28pJykpCisgICAgYXNzZXJ0X3dhcm5pbmcgPDxNRVNTQUdFIGRvCitERVBSRUNBVElPTiBXQVJOSU5HOiBQYXNzaW5nIGJsdWUsIGEgbm9uLXN0cmluZyB2YWx1ZSwgdG8gdW5xdW90ZSgpCit3aWxsIGJlIGFuIGVycm9yIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLgorICAgICAgICBvbiBsaW5lIDEgb2YgdGVzdF91bnF1b3RlX2lubGluZS5zY3NzCitNRVNTQUdFCisgICAgICBhc3NlcnRfZXF1YWwoJ2JsdWUnLCBldmFsdWF0ZSgndW5xdW90ZShibHVlKScpKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9xdW90ZQorICAgIGFzc2VydF9lcXVhbCgnImZvbyInLCBldmFsdWF0ZSgncXVvdGUoZm9vKScpKQorICAgIGFzc2VydF9lcXVhbCgnImZvbyInLCBldmFsdWF0ZSgncXVvdGUoImZvbyIpJykpCisgICAgYXNzZXJ0X2VxdWFsKCciZm9vIicsIGV2YWx1YXRlKCdxdW90ZSgkc3RyaW5nOiAiZm9vIiknKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcXVvdGVfdGVzdHNfdHlwZQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc3RyaW5nOiAjZmYwMDAwIGlzIG5vdCBhIHN0cmluZyBmb3IgYHF1b3RlJyIsICJxdW90ZSgjZjAwKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cl9sZW5ndGgKKyAgICBhc3NlcnRfZXF1YWwoJzMnLCBldmFsdWF0ZSgnc3RyLWxlbmd0aChmb28pJykpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cl9sZW5ndGhfcmVxdWlyZXNfYV9zdHJpbmcKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHN0cmluZzogI2ZmMDAwMCBpcyBub3QgYSBzdHJpbmcgZm9yIGBzdHItbGVuZ3RoJyIsICJzdHItbGVuZ3RoKCNmMDApIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyX2luc2VydAorICAgIGFzc2VydF9lcXVhbCgnWGFiY2QnLCBldmFsdWF0ZSgnc3RyLWluc2VydChhYmNkLCBYLCAwKScpKQorICAgIGFzc2VydF9lcXVhbCgnWGFiY2QnLCBldmFsdWF0ZSgnc3RyLWluc2VydChhYmNkLCBYLCAxKScpKQorICAgIGFzc2VydF9lcXVhbCgnYWJjWGQnLCBldmFsdWF0ZSgnc3RyLWluc2VydChhYmNkLCBYLCA0KScpKQorICAgIGFzc2VydF9lcXVhbCgnYWJjZFgnLCBldmFsdWF0ZSgnc3RyLWluc2VydChhYmNkLCBYLCAxMDApJykpCisgICAgYXNzZXJ0X2VxdWFsKCdYYWJjZCcsIGV2YWx1YXRlKCdzdHItaW5zZXJ0KGFiY2QsIFgsIC0xMDApJykpCisgICAgYXNzZXJ0X2VxdWFsKCdhWGJjZCcsIGV2YWx1YXRlKCdzdHItaW5zZXJ0KGFiY2QsIFgsIC00KScpKQorICAgIGFzc2VydF9lcXVhbCgnYWJjZFgnLCBldmFsdWF0ZSgnc3RyLWluc2VydChhYmNkLCBYLCAtMSknKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyX2luc2VydF9tYWludGFpbnNfcXVvdGVfb2ZfcHJpbWFyeV9zdHJpbmcKKyAgICBhc3NlcnRfZXF1YWwoJyJYZm9vIicsIGV2YWx1YXRlKCdzdHItaW5zZXJ0KCJmb28iLCBYLCAxKScpKQorICAgIGFzc2VydF9lcXVhbCgnIlhmb28iJywgZXZhbHVhdGUoJ3N0ci1pbnNlcnQoImZvbyIsICJYIiwgMSknKSkKKyAgICBhc3NlcnRfZXF1YWwoJ1hmb28nLCBldmFsdWF0ZSgnc3RyLWluc2VydChmb28sICJYIiwgMSknKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyX2luc2VydF9hc3NlcnRzX3R5cGVzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzdHJpbmc6ICNmZjAwMDAgaXMgbm90IGEgc3RyaW5nIGZvciBgc3RyLWluc2VydCciLCAic3RyLWluc2VydCgjZjAwLCBYLCAxKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRpbnNlcnQ6ICNmZjAwMDAgaXMgbm90IGEgc3RyaW5nIGZvciBgc3RyLWluc2VydCciLCAic3RyLWluc2VydChmb28sICNmMDAsIDEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGluZGV4OiAjZmYwMDAwIGlzIG5vdCBhIG51bWJlciBmb3IgYHN0ci1pbnNlcnQnIiwgInN0ci1pbnNlcnQoZm9vLCBYLCAjZjAwKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkV4cGVjdGVkICRpbmRleCB0byBiZSB1bml0bGVzcyBidXQgZ290IDEwcHggZm9yIGBzdHItaW5zZXJ0JyIsICJzdHItaW5zZXJ0KGZvbywgWCwgMTBweCkiKQorICBlbmQKKworICBkZWYgdGVzdF9zdHJfaW5kZXgKKyAgICBhc3NlcnRfZXF1YWwoJzEnLCBldmFsdWF0ZSgnc3RyLWluZGV4KGFiY2QsIGEpJykpCisgICAgYXNzZXJ0X2VxdWFsKCcxJywgZXZhbHVhdGUoJ3N0ci1pbmRleChhYmNkLCBhYiknKSkKKyAgICBhc3NlcnRfZXF1YWwoU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVsbC5uZXcsIHBlcmZvcm0oJ3N0ci1pbmRleChhYmNkLCBYKScpKQorICAgIGFzc2VydF9lcXVhbCgnMycsIGV2YWx1YXRlKCdzdHItaW5kZXgoYWJjZCwgYyknKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyX2luZGV4X2Fzc2VydHNfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHN0cmluZzogI2ZmMDAwMCBpcyBub3QgYSBzdHJpbmcgZm9yIGBzdHItaW5kZXgnIiwgInN0ci1pbmRleCgjZjAwLCBYKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzdWJzdHJpbmc6ICNmZjAwMDAgaXMgbm90IGEgc3RyaW5nIGZvciBgc3RyLWluZGV4JyIsICJzdHItaW5kZXgoYXNkZiwgI2YwMCkiKQorICBlbmQKKworICBkZWYgdGVzdF90b19sb3dlcl9jYXNlCisgICAgYXNzZXJ0X2VxdWFsKCdhYmNkJywgZXZhbHVhdGUoJ3RvLWxvd2VyLWNhc2UoQUJDRCknKSkKKyAgICBhc3NlcnRfZXF1YWwoJyJhYmNkIicsIGV2YWx1YXRlKCd0by1sb3dlci1jYXNlKCJBQkNEIiknKSkKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHN0cmluZzogI2ZmMDAwMCBpcyBub3QgYSBzdHJpbmcgZm9yIGB0by1sb3dlci1jYXNlJyIsICJ0by1sb3dlci1jYXNlKCNmMDApIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfdG9fdXBwZXJfY2FzZQorICAgIGFzc2VydF9lcXVhbCgnQUJDRCcsIGV2YWx1YXRlKCd0by11cHBlci1jYXNlKGFiY2QpJykpCisgICAgYXNzZXJ0X2VxdWFsKCciQUJDRCInLCBldmFsdWF0ZSgndG8tdXBwZXItY2FzZSgiYWJjZCIpJykpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzdHJpbmc6ICNmZjAwMDAgaXMgbm90IGEgc3RyaW5nIGZvciBgdG8tdXBwZXItY2FzZSciLCAidG8tdXBwZXItY2FzZSgjZjAwKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cl9zbGljZQorICAgIGFzc2VydF9lcXVhbCgnYmMnLCAgIGV2YWx1YXRlKCdzdHItc2xpY2UoYWJjZCwyLDMpJykpICAgICMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCisgICAgYXNzZXJ0X2VxdWFsKCdhJywgICAgZXZhbHVhdGUoJ3N0ci1zbGljZShhYmNkLDEsMSknKSkgICAgIyB3aGVuIHN0YXJ0ID0gZW5kCisgICAgYXNzZXJ0X2VxdWFsKCdhYicsICAgZXZhbHVhdGUoJ3N0ci1zbGljZShhYmNkLDEsMiknKSkgICAgIyBmb3IgY29tcGxldGVuZXNzCisgICAgYXNzZXJ0X2VxdWFsKCdhYmNkJywgZXZhbHVhdGUoJ3N0ci1zbGljZShhYmNkLDEsNCknKSkgICAgIyBhdCB0aGUgZW5kIHBvaW50cworICAgIGFzc2VydF9lcXVhbCgnYWJjZCcsIGV2YWx1YXRlKCdzdHItc2xpY2UoYWJjZCwwLDQpJykpICAgICMgd2hlbiBzdGFydCBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcKKyAgICBhc3NlcnRfZXF1YWwoJycsICAgICBldmFsdWF0ZSgnc3RyLXNsaWNlKGFiY2QsMSwwKScpKSAgICAjIHdoZW4gZW5kIGlzIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZworICAgIGFzc2VydF9lcXVhbCgnYWJjZCcsIGV2YWx1YXRlKCdzdHItc2xpY2UoYWJjZCwxLDEwMCknKSkgICMgd2hlbiBlbmQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgICBhc3NlcnRfZXF1YWwoJycsICAgICBldmFsdWF0ZSgnc3RyLXNsaWNlKGFiY2QsMiwxKScpKSAgICAjIHdoZW4gZW5kIGlzIGJlZm9yZSBzdGFydAorICAgIGFzc2VydF9lcXVhbCgnImJjIicsIGV2YWx1YXRlKCdzdHItc2xpY2UoImFiY2QiLDIsMyknKSkgICMgd2hlbiB1c2VkIHdpdGggYSBxdW90ZWQgc3RyaW5nCisgICAgYXNzZXJ0X2VxdWFsKCdiY2QnLCAgZXZhbHVhdGUoJ3N0ci1zbGljZShhYmNkLDIpJykpICAgICAgIyB3aGVuIGVuZCBpcyBvbWl0dGVkLCB5b3UgZ2V0IHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZworICAgIGFzc2VydF9lcXVhbCgnY2QnLCAgIGV2YWx1YXRlKCdzdHItc2xpY2UoYWJjZCwtMiknKSkgICAgICMgd2hlbiBzdGFydCBpcyBuZWdhdGl2ZSwgaXQgY291bnRzIGZyb20gdGhlIGJlZ2lubmluZworICAgIGFzc2VydF9lcXVhbCgnYmMnLCAgIGV2YWx1YXRlKCdzdHItc2xpY2UoYWJjZCwyLC0yKScpKSAgICMgd2hlbiBlbmQgaXMgbmVnYXRpdmUgaXQgY291bnRzIGluIGZyb20gdGhlIGVuZAorICAgIGFzc2VydF9lcXVhbCgnJywgICAgIGV2YWx1YXRlKCdzdHItc2xpY2UoYWJjZCwzLC0zKScpKSAgICMgd2hlbiBlbmQgaXMgbmVnYXRpdmUgYW5kIGNvbWVzIGJlZm9yZSB0aGUgc3RhcnQKKyAgICBhc3NlcnRfZXF1YWwoJ2JjJywgICBldmFsdWF0ZSgnc3RyLXNsaWNlKGFiY2QsLTMsLTIpJykpICAjIHdoZW4gYm90aCBhcmUgbmVnYXRpdmUKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHN0cmluZzogI2ZmMDAwMCBpcyBub3QgYSBzdHJpbmcgZm9yIGBzdHItc2xpY2UnIiwgInN0ci1zbGljZSgjZjAwLDIsMykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc3RhcnQtYXQ6ICNmZjAwMDAgaXMgbm90IGEgbnVtYmVyIGZvciBgc3RyLXNsaWNlJyIsICJzdHItc2xpY2UoYWJjZCwjZjAwLDMpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJGVuZC1hdDogI2ZmMDAwMCBpcyBub3QgYSBudW1iZXIgZm9yIGBzdHItc2xpY2UnIiwgInN0ci1zbGljZShhYmNkLDIsI2YwMCkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJFeHBlY3RlZCAkZW5kLWF0IHRvIGJlIHVuaXRsZXNzIGJ1dCBnb3QgM3B4IGZvciBgc3RyLXNsaWNlJyIsICJzdHItc2xpY2UoYWJjZCwyLDNweCkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJFeHBlY3RlZCAkc3RhcnQtYXQgdG8gYmUgdW5pdGxlc3MgYnV0IGdvdCAycHggZm9yIGBzdHItc2xpY2UnIiwgInN0ci1zbGljZShhYmNkLDJweCwzKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3VzZXJfZGVmaW5lZF9mdW5jdGlvbgorICAgIGFzc2VydF9lcXVhbCgiSSdtIGEgdXNlci1kZWZpbmVkIHN0cmluZyEiLCBldmFsdWF0ZSgidXNlcl9kZWZpbmVkKCkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uX3dpdGhfcHJlY2VkaW5nX3VuZGVyc2NvcmUKKyAgICBhc3NlcnRfZXF1YWwoIkknbSBhbm90aGVyIHVzZXItZGVmaW5lZCBzdHJpbmchIiwgZXZhbHVhdGUoIl9wcmVjZWRpbmdfdW5kZXJzY29yZSgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJJJ20gYW5vdGhlciB1c2VyLWRlZmluZWQgc3RyaW5nISIsIGV2YWx1YXRlKCItcHJlY2VkaW5nLXVuZGVyc2NvcmUoKSIpKQorICBlbmQKKworICBkZWYgdGVzdF91c2VyX2RlZmluZWRfZnVuY3Rpb25fdXNpbmdfZW52aXJvbm1lbnQKKyAgICBlbnZpcm9ubWVudCA9IGVudigndmFyaWFibGUnID0+IFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoJ1RoZSB2YXJpYWJsZScpKQorICAgIGFzc2VydF9lcXVhbCgiVGhlIHZhcmlhYmxlIiwgZXZhbHVhdGUoImZldGNoX3RoZV92YXJpYWJsZSgpIiwgZW52aXJvbm1lbnQpKQorICBlbmQKKworICBkZWYgdGVzdF9vcHRpb25zX29uX25ld192YWx1ZXNfZmFpbHMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSg8PE1TRywgImNhbGwtb3B0aW9ucy1vbi1uZXctdmFsdWUoKSIpCitUaGUgI29wdGlvbnMgYXR0cmlidXRlIGlzIG5vdCBzZXQgb24gdGhpcyBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcuCisgIFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgb2NjdXJyaW5nIGJlY2F1c2UgI3RvX3Mgd2FzIGNhbGxlZAorICBvbiB0aGlzIHZhbHVlIHdpdGhpbiBhIGN1c3RvbSBTYXNzIGZ1bmN0aW9uIHdpdGhvdXQgZmlyc3QKKyAgc2V0dGluZyB0aGUgI29wdGlvbnMgYXR0cmlidXRlLgorTVNHCisgIGVuZAorCisgIGRlZiB0ZXN0X3R5cGVfb2YKKyAgICBhc3NlcnRfZXF1YWwoInN0cmluZyIsIGV2YWx1YXRlKCJ0eXBlLW9mKFwiYXNkZlwiKSIpKQorICAgIGFzc2VydF9lcXVhbCgic3RyaW5nIiwgZXZhbHVhdGUoInR5cGUtb2YoYXNkZikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIm51bWJlciIsIGV2YWx1YXRlKCJ0eXBlLW9mKDFweCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImJvb2wiLCBldmFsdWF0ZSgidHlwZS1vZih0cnVlKSIpKQorICAgIGFzc2VydF9lcXVhbCgiY29sb3IiLCBldmFsdWF0ZSgidHlwZS1vZigjZmZmKSIpKQorICAgIGFzc2VydF9lcXVhbCgiY29sb3IiLCBldmFsdWF0ZSgidHlwZS1vZigkdmFsdWU6ICNmZmYpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJudWxsIiwgZXZhbHVhdGUoInR5cGUtb2YobnVsbCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImxpc3QiLCBldmFsdWF0ZSgidHlwZS1vZigxIDIgMykiKSkKKyAgICBhc3NlcnRfZXF1YWwoImxpc3QiLCBldmFsdWF0ZSgidHlwZS1vZigoMSwgMiwgMykpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJsaXN0IiwgZXZhbHVhdGUoInR5cGUtb2YoKCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJtYXAiLCBldmFsdWF0ZSgidHlwZS1vZigoZm9vOiBiYXIpKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9mZWF0dXJlX2V4aXN0cworICAgIGFzc2VydF9yYWlzZXMgQXJndW1lbnRFcnJvciBkbworICAgICAgU2Fzcy5hZGRfZmVhdHVyZSgibXktdGVzdC1mZWF0dXJlIikKKyAgICBlbmQKKyAgICBTYXNzLmFkZF9mZWF0dXJlKCItbXktdGVzdC1mZWF0dXJlIikKKyAgICBhc3NlcnRfZXF1YWwoInRydWUiLCBldmFsdWF0ZSgiZmVhdHVyZS1leGlzdHMoLW15LXRlc3QtZmVhdHVyZSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImZhbHNlIiwgZXZhbHVhdGUoImZlYXR1cmUtZXhpc3RzKHdoYXRpc3RoaXNpZG9udGV2ZW5rbm93KSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCJmZWF0dXJlLWV4aXN0cygkZmVhdHVyZTogLW15LXRlc3QtZmVhdHVyZSkiKSkKKyAgZW5zdXJlCisgICAgU2Fzczo6RmVhdHVyZXM6OktOT1dOX0ZFQVRVUkVTLmRlbGV0ZSgiLW15LXRlc3QtZmVhdHVyZSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuaXQKKyAgICBhc3NlcnRfZXF1YWwoJVF7IiJ9LCBldmFsdWF0ZSgidW5pdCgxMDApIikpCisgICAgYXNzZXJ0X2VxdWFsKCVReyJweCJ9LCBldmFsdWF0ZSgidW5pdCgxMDBweCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoJVF7ImVtKnB4In0sIGV2YWx1YXRlKCJ1bml0KDEwcHggKiA1ZW0pIikpCisgICAgYXNzZXJ0X2VxdWFsKCVReyJlbSpweCJ9LCBldmFsdWF0ZSgidW5pdCg1ZW0gKiAxMHB4KSIpKQorICAgIGFzc2VydF9lcXVhbCglUXsiZW0vcmVtIn0sIGV2YWx1YXRlKCJ1bml0KDEwcHggKiA1ZW0gLyAzMGNtIC8gMXJlbSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoJVF7ImVtKnZoL2NtKnJlbSJ9LCBldmFsdWF0ZSgidW5pdCgxMHZoICogNWVtIC8gMzBjbSAvIDFyZW0pIikpCisgICAgYXNzZXJ0X2VxdWFsKCVReyJweCJ9LCBldmFsdWF0ZSgidW5pdCgkbnVtYmVyOiAxMDBweCkiKSkKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG51bWJlcjogI2ZmMDAwMCBpcyBub3QgYSBudW1iZXIgZm9yIGB1bml0JyIsICJ1bml0KCNmMDApIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5pdGxlc3MKKyAgICBhc3NlcnRfZXF1YWwoJVF7dHJ1ZX0sIGV2YWx1YXRlKCJ1bml0bGVzcygxMDApIikpCisgICAgYXNzZXJ0X2VxdWFsKCVRe2ZhbHNlfSwgZXZhbHVhdGUoInVuaXRsZXNzKDEwMHB4KSIpKQorICAgIGFzc2VydF9lcXVhbCglUXtmYWxzZX0sIGV2YWx1YXRlKCJ1bml0bGVzcygkbnVtYmVyOiAxMDBweCkiKSkKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG51bWJlcjogI2ZmMDAwMCBpcyBub3QgYSBudW1iZXIgZm9yIGB1bml0bGVzcyciLCAidW5pdGxlc3MoI2YwMCkiKQorICBlbmQKKworICBkZWYgdGVzdF9jb21wYXJhYmxlCisgICAgYXNzZXJ0X2VxdWFsKCVRe3RydWV9LCBldmFsdWF0ZSgiY29tcGFyYWJsZSgycHgsIDFweCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoJVF7dHJ1ZX0sIGV2YWx1YXRlKCJjb21wYXJhYmxlKDEwY20sIDNtbSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoJVF7ZmFsc2V9LCBldmFsdWF0ZSgiY29tcGFyYWJsZSgxMDBweCwgM2VtKSIpKQorICAgIGFzc2VydF9lcXVhbCglUXtmYWxzZX0sIGV2YWx1YXRlKCJjb21wYXJhYmxlKCRudW1iZXIxOiAxMDBweCwgJG51bWJlcjI6IDNlbSkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcGFyYWJsZV9jaGVja3NfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG51bWJlcjE6ICNmZjAwMDAgaXMgbm90IGEgbnVtYmVyIGZvciBgY29tcGFyYWJsZSciLCAiY29tcGFyYWJsZSgjZjAwLCAxcHgpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG51bWJlcjI6ICNmZjAwMDAgaXMgbm90IGEgbnVtYmVyIGZvciBgY29tcGFyYWJsZSciLCAiY29tcGFyYWJsZSgxcHgsICNmMDApIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGVuZ3RoCisgICAgYXNzZXJ0X2VxdWFsKCI1IiwgZXZhbHVhdGUoImxlbmd0aCgxIDIgMyA0IDUpIikpCisgICAgYXNzZXJ0X2VxdWFsKCI0IiwgZXZhbHVhdGUoImxlbmd0aCgoZm9vLCBiYXIsIGJheiwgYmlwKSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjMiLCBldmFsdWF0ZSgibGVuZ3RoKChmb28sIGJhciwgYmF6IGJpcCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIzIiwgZXZhbHVhdGUoImxlbmd0aCgoZm9vLCBiYXIsIChiYXosIGJpcCkpKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSIsIGV2YWx1YXRlKCJsZW5ndGgoI2YwMCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjAiLCBldmFsdWF0ZSgibGVuZ3RoKCgpKSIpKQorICAgIGFzc2VydF9lcXVhbCgiNCIsIGV2YWx1YXRlKCJsZW5ndGgoMSAyICgpIDMpIikpCisKKyAgICBhc3NlcnRfZXF1YWwoIjIiLCBldmFsdWF0ZSgibGVuZ3RoKChmb286IGJhciwgYmFyOiBiYXopKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9udGgKKyAgICBhc3NlcnRfZXF1YWwoIjEiLCBldmFsdWF0ZSgibnRoKDEgMiAzLCAxKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMiIsIGV2YWx1YXRlKCJudGgoMSAyIDMsIDIpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIzIiwgZXZhbHVhdGUoIm50aCgxIDIgMywgLTEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxIiwgZXZhbHVhdGUoIm50aCgxIDIgMywgLTMpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIzIiwgZXZhbHVhdGUoIm50aCgoMSwgMiwgMyksIDMpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIzIiwgZXZhbHVhdGUoIm50aCgkbGlzdDogKDEsIDIsIDMpLCAkbjogMykiKSkKKyAgICBhc3NlcnRfZXF1YWwoImZvbyIsIGV2YWx1YXRlKCJudGgoZm9vLCAxKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYmFyIGJheiIsIGV2YWx1YXRlKCJudGgoZm9vIChiYXIgYmF6KSBiYW5nLCAyKSIpKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJMaXN0IGluZGV4IDAgbXVzdCBiZSBhIG5vbi16ZXJvIGludGVnZXIgZm9yIGBudGgnIiwgIm50aChmb28sIDApIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiTGlzdCBpbmRleCBpcyAtMTAgYnV0IGxpc3QgaXMgb25seSAxIGl0ZW0gbG9uZyBmb3IgYG50aCciLCAibnRoKGZvbywgLTEwKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkxpc3QgaW5kZXggMS41IG11c3QgYmUgYSBub24temVybyBpbnRlZ2VyIGZvciBgbnRoJyIsICJudGgoZm9vLCAxLjUpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiTGlzdCBpbmRleCBpcyA1IGJ1dCBsaXN0IGlzIG9ubHkgNCBpdGVtcyBsb25nIGZvciBgbnRoJyIsICJudGgoMSAyIDMgNCwgNSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJMaXN0IGluZGV4IGlzIDIgYnV0IGxpc3QgaXMgb25seSAxIGl0ZW0gbG9uZyBmb3IgYG50aCciLCAibnRoKGZvbywgMikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJMaXN0IGluZGV4IGlzIDEgYnV0IGxpc3QgaGFzIG5vIGl0ZW1zIGZvciBgbnRoJyIsICJudGgoKCksIDEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG46IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgbnRoJyIsICJudGgoMSAyIDMsIGZvbykiKQorCisgICAgYXNzZXJ0X2VxdWFsKCJmb28gYmFyIiwgZXZhbHVhdGUoIm50aCgoZm9vOiBiYXIsIGJhcjogYmF6KSwgMSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImJhciBiYXoiLCBldmFsdWF0ZSgibnRoKChmb286IGJhciwgYmFyOiBiYXopLCAyKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9zZXRfbnRoCisgICAgYXNzZXJ0X2VxdWFsKCJhIDIgMyIsIGV2YWx1YXRlKCJzZXQtbnRoKDEgMiAzLCAxLCBhKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSBhIDMiLCBldmFsdWF0ZSgic2V0LW50aCgxIDIgMywgMiwgYSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEgMiBhIiwgZXZhbHVhdGUoInNldC1udGgoMSAyIDMsIC0xLCBhKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYSAyIDMiLCBldmFsdWF0ZSgic2V0LW50aCgxIDIgMywgLTMsIGEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJhIDIgMyIsIGV2YWx1YXRlKCJzZXQtbnRoKCRsaXN0OiAxIDIgMywgJG46IC0zLCAkdmFsdWU6IGEpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxLCAyLCBhIiwgZXZhbHVhdGUoInNldC1udGgoKDEsIDIsIDMpLCAzLCBhKSIpKQorICAgIGFzc2VydF9lcXVhbCgiYSIsIGV2YWx1YXRlKCJzZXQtbnRoKGZvbywgMSwgYSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImZvbywgYSBiLCBiYXoiLCBldmFsdWF0ZSgic2V0LW50aCgoZm9vLCBiYXIsIGJheiksIDIsIChhIGIpKSIpKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJMaXN0IGluZGV4IDAgbXVzdCBiZSBhIG5vbi16ZXJvIGludGVnZXIgZm9yIGBzZXQtbnRoJyIsICJzZXQtbnRoKGZvbywgMCwgYSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJMaXN0IGluZGV4IGlzIC0xMCBidXQgbGlzdCBpcyBvbmx5IDEgaXRlbSBsb25nIGZvciBgc2V0LW50aCciLCAic2V0LW50aChmb28sIC0xMCwgYSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJMaXN0IGluZGV4IDEuNSBtdXN0IGJlIGEgbm9uLXplcm8gaW50ZWdlciBmb3IgYHNldC1udGgnIiwgInNldC1udGgoZm9vLCAxLjUsIGEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiTGlzdCBpbmRleCBpcyA1IGJ1dCBsaXN0IGlzIG9ubHkgNCBpdGVtcyBsb25nIGZvciBgc2V0LW50aCciLCAic2V0LW50aCgxIDIgMyA0LCA1LCBhKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkxpc3QgaW5kZXggaXMgMiBidXQgbGlzdCBpcyBvbmx5IDEgaXRlbSBsb25nIGZvciBgc2V0LW50aCciLCAic2V0LW50aChmb28sIDIsIGEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiTGlzdCBpbmRleCBpcyAxIGJ1dCBsaXN0IGhhcyBubyBpdGVtcyBmb3IgYHNldC1udGgnIiwgInNldC1udGgoKCksIDEsIGEpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG46IFwiZm9vXCIgaXMgbm90IGEgbnVtYmVyIGZvciBgc2V0LW50aCciLCAic2V0LW50aCgxIDIgMywgZm9vLCBhKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2pvaW4KKyAgICBhc3NlcnRfZXF1YWwoIjEgMiAzIiwgZXZhbHVhdGUoImpvaW4oMSAyLCAzKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSAyIDMiLCBldmFsdWF0ZSgiam9pbigxLCAyIDMpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxIDIgMyA0IiwgZXZhbHVhdGUoImpvaW4oMSAyLCAzIDQpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoIigxIDIgMyA0KSA9PSBqb2luKDEgMiwgMyA0KSIpKQorICAgIGFzc2VydF9lcXVhbCgiZmFsc2UiLCBldmFsdWF0ZSgiKDEgMiAoMyA0KSkgPT0gam9pbigxIDIsIDMgNCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEsIDIsIDMiLCBldmFsdWF0ZSgiam9pbigoMSwgMiksIDMpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxLCAyLCAzIiwgZXZhbHVhdGUoImpvaW4oMSwgKDIsIDMpKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSwgMiwgMywgNCIsIGV2YWx1YXRlKCJqb2luKCgxLCAyKSwgKDMsIDQpKSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCIoMSwgMiwgMywgNCkgPT0gam9pbigoMSwgMiksICgzLCA0KSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImZhbHNlIiwgZXZhbHVhdGUoIigxLCAyLCAoMywgNCkpID09IGpvaW4oKDEsIDIpLCAoMywgNCkpIikpCisKKyAgICBhc3NlcnRfZXF1YWwoIjEgMiIsIGV2YWx1YXRlKCJqb2luKDEsIDIpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxIDIgMyA0IiwgZXZhbHVhdGUoImpvaW4oMSAyLCAoMywgNCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxLCAyLCAzLCA0IiwgZXZhbHVhdGUoImpvaW4oKDEsIDIpLCAzIDQpIikpCisKKyAgICBhc3NlcnRfZXF1YWwoIjEgMiIsIGV2YWx1YXRlKCJqb2luKDEsIDIsIGF1dG8pIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxLCAyLCAzLCA0IiwgZXZhbHVhdGUoImpvaW4oMSAyLCAzIDQsIGNvbW1hKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSAyIDMgNCIsIGV2YWx1YXRlKCJqb2luKCgxLCAyKSwgKDMsIDQpLCBzcGFjZSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEsIDIiLCBldmFsdWF0ZSgiam9pbigxLCAyLCBjb21tYSkiKSkKKworICAgIGFzc2VydF9lcXVhbCgiMSAyIiwgZXZhbHVhdGUoImpvaW4oMSAyLCAoKSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEsIDIiLCBldmFsdWF0ZSgiam9pbigoMSwgMiksICgpKSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCIoMSAyKSA9PSBqb2luKDEgMiwgKCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoIigxLCAyKSA9PSBqb2luKCgxLCAyKSwgKCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJmYWxzZSIsIGV2YWx1YXRlKCIoMSAyICgpKSA9PSBqb2luKDEgMiwgKCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJmYWxzZSIsIGV2YWx1YXRlKCIoMSwgMiwgKCkpID09IGpvaW4oKDEsIDIpLCAoKSkiKSkKKworICAgIGFzc2VydF9lcXVhbCgiMSAyIiwgZXZhbHVhdGUoImpvaW4oKCksIDEgMikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEsIDIiLCBldmFsdWF0ZSgiam9pbigoKSwgKDEsIDIpKSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCIoMSAyKSA9PSBqb2luKCgpLCAxIDIpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoIigxLCAyKSA9PSBqb2luKCgpLCAoMSwgMikpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJmYWxzZSIsIGV2YWx1YXRlKCIoMSAyICgpKSA9PSBqb2luKCgpLCAxIDIpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJmYWxzZSIsIGV2YWx1YXRlKCIoMSwgMiwgKCkpID09IGpvaW4oKCksICgxLCAyKSkiKSkKKworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJTZXBhcmF0b3IgbmFtZSBtdXN0IGJlIHNwYWNlLCBjb21tYSwgb3IgYXV0byBmb3IgYGpvaW4nIiwgImpvaW4oMSwgMiwgYmFib29uKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzZXBhcmF0b3I6IDEyIGlzIG5vdCBhIHN0cmluZyBmb3IgYGpvaW4nIiwgImpvaW4oMSwgMiwgMTIpIikKKworICAgIGFzc2VydF9lcXVhbCgiZm9vIGJhciwgYmFyIGJheiwgYmF6IGJpcCwgYmlwIGJvcCIsCisgICAgICBwZXJmb3JtKCJqb2luKChmb286IGJhciwgYmFyOiBiYXopLCAoYmF6OiBiaXAsIGJpcDogYm9wKSkiKS50b19zYXNzKQorICAgIGFzc2VydF9lcXVhbCgiKGZvbyBiYXIpIChiYXIgYmF6KSAoYmF6IGJpcCkgKGJpcCBib3ApIiwKKyAgICAgIHBlcmZvcm0oImpvaW4oKGZvbzogYmFyLCBiYXI6IGJheiksIChiYXo6IGJpcCwgYmlwOiBib3ApLCBzcGFjZSkiKS50b19zYXNzKQorICAgIGFzc2VydF9lcXVhbCgiZm9vIGJhciAoYmF6IGJpcCkgKGJpcCBib3ApIiwKKyAgICAgIHBlcmZvcm0oImpvaW4oZm9vIGJhciwgKGJhejogYmlwLCBiaXA6IGJvcCkpIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoImZvbyBiYXIsIGJhciBiYXosIGJpcCwgYm9wIiwKKyAgICAgIHBlcmZvcm0oImpvaW4oKGZvbzogYmFyLCBiYXI6IGJheiksIGJpcCBib3ApIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoImJheiBiaXAsIGJpcCBib3AiLAorICAgICAgcGVyZm9ybSgiam9pbigoKSwgKGJhejogYmlwLCBiaXA6IGJvcCkpIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoImZvbyBiYXIsIGJhciBiYXoiLAorICAgICAgcGVyZm9ybSgiam9pbigoZm9vOiBiYXIsIGJhcjogYmF6KSwgKCkpIikudG9fc2FzcykKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXBwZW5kCisgICAgYXNzZXJ0X2VxdWFsKCIxIDIgMyIsIGV2YWx1YXRlKCJhcHBlbmQoMSAyLCAzKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSAyIDMgNCIsIGV2YWx1YXRlKCJhcHBlbmQoMSAyLCAzIDQpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJmYWxzZSIsIGV2YWx1YXRlKCIoMSAyIDMgNCkgPT0gYXBwZW5kKDEgMiwgMyA0KSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCIoMSAyICgzIDQpKSA9PSBhcHBlbmQoMSAyLCAzIDQpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxLCAyLCAzIiwgZXZhbHVhdGUoImFwcGVuZCgoMSwgMiksIDMpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxLCAyLCAzLCA0IiwgZXZhbHVhdGUoImFwcGVuZCgoMSwgMiksICgzLCA0KSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImZhbHNlIiwgZXZhbHVhdGUoIigxLCAyLCAzLCA0KSA9PSBhcHBlbmQoKDEsIDIpLCAoMywgNCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoIigxLCAyLCAoMywgNCkpID09IGFwcGVuZCgoMSwgMiksICgzLCA0KSkiKSkKKworICAgIGFzc2VydF9lcXVhbCgiMSAyIiwgZXZhbHVhdGUoImFwcGVuZCgxLCAyKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSAyIDMsIDQiLCBldmFsdWF0ZSgiYXBwZW5kKDEgMiwgKDMsIDQpKSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCIoMSAyICgzLCA0KSkgPT0gYXBwZW5kKDEgMiwgKDMsIDQpKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSwgMiwgMyA0IiwgZXZhbHVhdGUoImFwcGVuZCgoMSwgMiksIDMgNCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInRydWUiLCBldmFsdWF0ZSgiKDEsIDIsIDMgNCkgPT0gYXBwZW5kKCgxLCAyKSwgMyA0KSIpKQorCisgICAgYXNzZXJ0X2VxdWFsKCIxIDIiLCBldmFsdWF0ZSgiYXBwZW5kKDEsIDIsIGF1dG8pIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxLCAyLCAzIDQiLCBldmFsdWF0ZSgiYXBwZW5kKDEgMiwgMyA0LCBjb21tYSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEgMiAzLCA0IiwgZXZhbHVhdGUoImFwcGVuZCgoMSwgMiksICgzLCA0KSwgc3BhY2UpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxLCAyIiwgZXZhbHVhdGUoImFwcGVuZCgxLCAyLCBjb21tYSkiKSkKKworICAgIGFzc2VydF9lcXVhbCgiMSAyIiwgZXZhbHVhdGUoImFwcGVuZCgxIDIsICgpKSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSwgMiIsIGV2YWx1YXRlKCJhcHBlbmQoKDEsIDIpLCAoKSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoInRydWUiLCBldmFsdWF0ZSgiKDEgMiAoKSkgPT0gYXBwZW5kKDEgMiwgKCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoIigxLCAyLCAoKSkgPT0gYXBwZW5kKCgxLCAyKSwgKCkpIikpCisKKyAgICBhc3NlcnRfZXF1YWwoIjEgMiIsIGV2YWx1YXRlKCJhcHBlbmQoKCksIDEgMikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEsIDIiLCBldmFsdWF0ZSgiYXBwZW5kKCgpLCAoMSwgMikpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJmYWxzZSIsIGV2YWx1YXRlKCIoMSAyKSA9PSBhcHBlbmQoKCksIDEgMikiKSkKKyAgICBhc3NlcnRfZXF1YWwoInRydWUiLCBldmFsdWF0ZSgiKDEgMikgPT0gbnRoKGFwcGVuZCgoKSwgMSAyKSwgMSkiKSkKKworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJTZXBhcmF0b3IgbmFtZSBtdXN0IGJlIHNwYWNlLCBjb21tYSwgb3IgYXV0byBmb3IgYGFwcGVuZCciLCAiYXBwZW5kKDEsIDIsIGJhYm9vbikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VwYXJhdG9yOiAxMiBpcyBub3QgYSBzdHJpbmcgZm9yIGBhcHBlbmQnIiwgImFwcGVuZCgxLCAyLCAxMikiKQorCisgICAgYXNzZXJ0X2VxdWFsKCIxIDIgKGZvbzogYmFyKSIsIHBlcmZvcm0oImFwcGVuZCgxIDIsIChmb286IGJhcikpIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoImZvbyBiYXIsIGJhciBiYXosIDEiLCBwZXJmb3JtKCJhcHBlbmQoKGZvbzogYmFyLCBiYXI6IGJheiksIDEpIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoImZvbyBiYXIsIGJhciBiYXosIChiYXo6IGJpcCkiLAorICAgICAgcGVyZm9ybSgiYXBwZW5kKChmb286IGJhciwgYmFyOiBiYXopLCAoYmF6OiBiaXApKSIpLnRvX3Nhc3MpCisgIGVuZAorCisgIGRlZiB0ZXN0X3ppcAorICAgIGFzc2VydF9lcXVhbCgiMSAzIDUsIDIgNCA2IiwgZXZhbHVhdGUoInppcCgxIDIsIDMgNCwgNSA2KSIpKQorICAgIGFzc2VydF9lcXVhbCgiMSA0IDcsIDIgNSA4IiwgZXZhbHVhdGUoInppcCgxIDIgMywgNCA1IDYsIDcgOCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEgMiAzIiwgZXZhbHVhdGUoInppcCgxLCAyLCAzKSIpKQorICAgIGFzc2VydF9lcXVhbCgiKGZvbyBiYXIpIDEgMywgKGJhciBiYXopIDIgNCIsCisgICAgICBwZXJmb3JtKCJ6aXAoKGZvbzogYmFyLCBiYXI6IGJheiksIDEgMiwgMyA0KSIpLnRvX3Nhc3MpCisgIGVuZAorCisgIGRlZiB0ZXN0X2luZGV4CisgICAgbnVsbCA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bGwubmV3CisgICAgYXNzZXJ0X2VxdWFsKCIxIiwgZXZhbHVhdGUoImluZGV4KDFweCBzb2xpZCBibHVlLCAxcHgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIyIiwgZXZhbHVhdGUoImluZGV4KDFweCBzb2xpZCBibHVlLCBzb2xpZCkiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjMiLCBldmFsdWF0ZSgiaW5kZXgoMXB4IHNvbGlkIGJsdWUsICMwMGYpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxIiwgZXZhbHVhdGUoImluZGV4KDFweCwgMXB4KSIpKQorICAgIGFzc2VydF9lcXVhbChudWxsLCBwZXJmb3JtKCJpbmRleCgxcHggc29saWQgYmx1ZSwgMWVtKSIpKQorICAgIGFzc2VydF9lcXVhbChudWxsLCBwZXJmb3JtKCJpbmRleCgxcHggc29saWQgYmx1ZSwgbm90Zm91bmQpIikpCisgICAgYXNzZXJ0X2VxdWFsKG51bGwsIHBlcmZvcm0oImluZGV4KDFweCwgIzAwZikiKSkKKworICAgIGFzc2VydF9lcXVhbCgiMSIsIGV2YWx1YXRlKCJpbmRleCgoZm9vOiBiYXIsIGJhcjogYmF6KSwgKGZvbyBiYXIpKSIpKQorICAgIGFzc2VydF9lcXVhbChudWxsLCBwZXJmb3JtKCJpbmRleCgoZm9vOiBiYXIsIGJhcjogYmF6KSwgKGZvbzogYmFyKSkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGlzdF9zZXBhcmF0b3IKKyAgICBhc3NlcnRfZXF1YWwoInNwYWNlIiwgZXZhbHVhdGUoImxpc3Qtc2VwYXJhdG9yKDEgMiAzIDQgNSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImNvbW1hIiwgZXZhbHVhdGUoImxpc3Qtc2VwYXJhdG9yKChmb28sIGJhciwgYmF6LCBiaXApKSIpKQorICAgIGFzc2VydF9lcXVhbCgiY29tbWEiLCBldmFsdWF0ZSgibGlzdC1zZXBhcmF0b3IoKGZvbywgYmFyLCBiYXogYmlwKSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoImNvbW1hIiwgZXZhbHVhdGUoImxpc3Qtc2VwYXJhdG9yKChmb28sIGJhciwgKGJheiwgYmlwKSkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJzcGFjZSIsIGV2YWx1YXRlKCJsaXN0LXNlcGFyYXRvcigjZjAwKSIpKQorICAgIGFzc2VydF9lcXVhbCgic3BhY2UiLCBldmFsdWF0ZSgibGlzdC1zZXBhcmF0b3IoKCkpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJzcGFjZSIsIGV2YWx1YXRlKCJsaXN0LXNlcGFyYXRvcigxIDIgKCkgMykiKSkKKworICAgIGFzc2VydF9lcXVhbCgiY29tbWEiLCBldmFsdWF0ZSgibGlzdC1zZXBhcmF0b3IoKGZvbzogYmFyLCBiYXI6IGJheikpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2lmCisgICAgYXNzZXJ0X2VxdWFsKCIxcHgiLCBldmFsdWF0ZSgiaWYodHJ1ZSwgMXB4LCAycHgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIycHgiLCBldmFsdWF0ZSgiaWYoZmFsc2UsIDFweCwgMnB4KSIpKQorICAgIGFzc2VydF9lcXVhbCgiMnB4IiwgZXZhbHVhdGUoImlmKG51bGwsIDFweCwgMnB4KSIpKQorICAgIGFzc2VydF9lcXVhbCgiMXB4IiwgZXZhbHVhdGUoImlmKHRydWUsIDFweCwgJGJyb2tlbikiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjFweCIsIGV2YWx1YXRlKCJpZihmYWxzZSwgJGJyb2tlbiwgMXB4KSIpKQorICAgIGFzc2VydF9lcXVhbCgiMXB4IiwgZXZhbHVhdGUoImlmKGZhbHNlLCAkaWYtdHJ1ZTogJGJyb2tlbiwgJGlmLWZhbHNlOiAxcHgpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIxcHgiLCBldmFsdWF0ZSgiaWYodHJ1ZSwgJGlmLXRydWU6IDFweCwgJGlmLWZhbHNlOiAkYnJva2VuKSIpKQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisuaWYgeworICByZXN1bHQ6IHlheTsgfQorQ1NTCisuaWYgeworICAkc29tZXRoaW5nOiB5YXk7CisgIHJlc3VsdDogaWYodHJ1ZSwgJGlmLXRydWU6ICRzb21ldGhpbmcsICRpZi1mYWxzZTogJGJyb2tlbik7Cit9CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKy5pZiB7CisgIHJlc3VsdDogMXB4OyB9CitDU1MKKy5pZiB7CisgICRzcGxhdDogMXB4LCAycHg7CisgIHJlc3VsdDogaWYodHJ1ZSwgJHNwbGF0Li4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY291bnRlcgorICAgIGFzc2VydF9lcXVhbCgiY291bnRlcihmb28pIiwgZXZhbHVhdGUoImNvdW50ZXIoZm9vKSIpKQorICAgIGFzc2VydF9lcXVhbCgnY291bnRlcihpdGVtLCIuIiknLCBldmFsdWF0ZSgnY291bnRlcihpdGVtLCAiLiIpJykpCisgICAgYXNzZXJ0X2VxdWFsKCdjb3VudGVyKGl0ZW0sIi4iKScsIGV2YWx1YXRlKCdjb3VudGVyKGl0ZW0sIi4iKScpKQorICBlbmQKKworICBkZWYgdGVzdF9jb3VudGVycworICAgIGFzc2VydF9lcXVhbCgiY291bnRlcnMoZm9vKSIsIGV2YWx1YXRlKCJjb3VudGVycyhmb28pIikpCisgICAgYXNzZXJ0X2VxdWFsKCdjb3VudGVycyhpdGVtLCIuIiknLCBldmFsdWF0ZSgnY291bnRlcnMoaXRlbSwgIi4iKScpKQorICAgIGFzc2VydF9lcXVhbCgnY291bnRlcnMoaXRlbSwiLiIpJywgZXZhbHVhdGUoJ2NvdW50ZXJzKGl0ZW0sIi4iKScpKQorICBlbmQKKworICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3NfcmdiCisgICAgYXNzZXJ0X2VxdWFsKCVRe3doaXRlfSwgZXZhbHVhdGUoInJnYigkcmVkOiAyNTUsICRncmVlbjogMjU1LCAkYmx1ZTogMjU1KSIpKQorICBlbmQKKworICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3NfcmdiYQorICAgIGFzc2VydF9lcXVhbCglUXtyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSl9LCBldmFsdWF0ZSgicmdiYSgkcmVkOiAyNTUsICRncmVlbjogMjU1LCAkYmx1ZTogMjU1LCAkYWxwaGE6IDAuNSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoJVF7cmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpfSwgZXZhbHVhdGUoInJnYmEoJGNvbG9yOiAjZmZmLCAkYWxwaGE6IDAuNSkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfa2V5d29yZF9hcmdzX3JnYmFfd2l0aF9leHRyYV9hcmdzCisgICAgZXZhbHVhdGUoInJnYmEoJHJlZDogMjU1LCAkZ3JlZW46IDI1NSwgJGJsdWU6IDI1NSwgJGFscGhhOiAwLjUsICRleHRyYTogZXJyb3IpIikKKyAgICBmbHVuaygiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwoIkZ1bmN0aW9uIHJnYmEgZG9lc24ndCBoYXZlIGFuIGFyZ3VtZW50IG5hbWVkICRleHRyYSIsIGUubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfa2V5d29yZF9hcmdzX211c3RfaGF2ZV9zaWduYXR1cmUKKyAgICBldmFsdWF0ZSgibm8ta3ctYXJncygkZmFrZTogdmFsdWUpIikKKyAgICBmbHVuaygiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwoIkZ1bmN0aW9uIG5vX2t3X2FyZ3MgZG9lc24ndCBzdXBwb3J0IGtleXdvcmQgYXJndW1lbnRzIiwgZS5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Nfd2l0aF9taXNzaW5nX2FyZ3VtZW50CisgICAgZXZhbHVhdGUoInJnYigkcmVkOiAyNTUsICRncmVlbjogMjU1KSIpCisgICAgZmx1bmsoIkV4cGVjdGVkIGV4Y2VwdGlvbiIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsKCJGdW5jdGlvbiByZ2IgcmVxdWlyZXMgYW4gYXJndW1lbnQgbmFtZWQgJGJsdWUiLCBlLm1lc3NhZ2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X2tleXdvcmRfYXJnc193aXRoX2V4dHJhX2FyZ3VtZW50CisgICAgZXZhbHVhdGUoInJnYigkcmVkOiAyNTUsICRncmVlbjogMjU1LCAkYmx1ZTogMjU1LCAkcHVycGxlOiAyNTUpIikKKyAgICBmbHVuaygiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwoIkZ1bmN0aW9uIHJnYiBkb2Vzbid0IGhhdmUgYW4gYXJndW1lbnQgbmFtZWQgJHB1cnBsZSIsIGUubWVzc2FnZSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfa2V5d29yZF9hcmdzX3dpdGhfcG9zaXRpb25hbF9hbmRfa2V5d29yZF9hcmd1bWVudAorICAgIGV2YWx1YXRlKCJyZ2IoMjU1LCAyNTUsIDI1NSwgJHJlZDogMjU1KSIpCisgICAgZmx1bmsoIkV4cGVjdGVkIGV4Y2VwdGlvbiIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsKCJGdW5jdGlvbiByZ2Igd2FzIHBhc3NlZCBhcmd1bWVudCAkcmVkIGJvdGggYnkgcG9zaXRpb24gYW5kIGJ5IG5hbWUiLCBlLm1lc3NhZ2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X2tleXdvcmRfYXJnc193aXRoX2tleXdvcmRfYmVmb3JlX3Bvc2l0aW9uYWxfYXJndW1lbnQKKyAgICBldmFsdWF0ZSgicmdiKCRyZWQ6IDI1NSwgMjU1LCAyNTUpIikKKyAgICBmbHVuaygiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwoIlBvc2l0aW9uYWwgYXJndW1lbnRzIG11c3QgY29tZSBiZWZvcmUga2V5d29yZCBhcmd1bWVudHMuIiwgZS5tZXNzYWdlKQorICBlbmQKKworICBkZWYgdGVzdF9vbmx5X3Zhcl9hcmdzCisgICAgYXNzZXJ0X2VxdWFsICJvbmx5LXZhci1hcmdzKDJweCwgM3B4LCA0cHgpIiwgZXZhbHVhdGUoIm9ubHktdmFyLWFyZ3MoMXB4LCAycHgsIDNweCkiKQorICBlbmQKKworICBkZWYgdGVzdF9vbmx5X2t3X2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgIm9ubHkta3ctYXJncyhhLCBiLCBjKSIsIGV2YWx1YXRlKCJvbmx5LWt3LWFyZ3MoJGE6IDEsICRiOiAyLCAkYzogMykiKQorICBlbmQKKworICBkZWYgdGVzdF91bmlxdWVfaWQKKyAgICBsYXN0X2lkLCBjdXJyZW50X2lkID0gbmlsLCBldmFsdWF0ZSgidW5pcXVlLWlkKCkiKQorCisgICAgNTAudGltZXMgZG8KKyAgICAgIGxhc3RfaWQsIGN1cnJlbnRfaWQgPSBjdXJyZW50X2lkLCBldmFsdWF0ZSgidW5pcXVlLWlkKCkiKQorICAgICAgYXNzZXJ0X21hdGNoKC91W2EtejAtOV17OH0vLCBjdXJyZW50X2lkKQorICAgICAgcmVmdXRlX2VxdWFsIGxhc3RfaWQsIGN1cnJlbnRfaWQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX2dldAorICAgIGFzc2VydF9lcXVhbCAiMSIsIGV2YWx1YXRlKCJtYXAtZ2V0KChmb286IDEsIGJhcjogMiksIGZvbykiKQorICAgIGFzc2VydF9lcXVhbCAiMiIsIGV2YWx1YXRlKCJtYXAtZ2V0KChmb286IDEsIGJhcjogMiksIGJhcikiKQorICAgIGFzc2VydF9lcXVhbCAibnVsbCIsIHBlcmZvcm0oIm1hcC1nZXQoKGZvbzogMSwgYmFyOiAyKSwgYmF6KSIpLnRvX3Nhc3MKKyAgICBhc3NlcnRfZXF1YWwgIm51bGwiLCBwZXJmb3JtKCJtYXAtZ2V0KCgpLCBmb28pIikudG9fc2FzcworICBlbmQKKworICBkZWYgdGVzdF9tYXBfZ2V0X2NoZWNrc190eXBlCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRtYXA6IDEyIGlzIG5vdCBhIG1hcCBmb3IgYG1hcC1nZXQnIiwgIm1hcC1nZXQoMTIsIGJhcikiKQorICBlbmQKKworICBkZWYgdGVzdF9tYXBfbWVyZ2UKKyAgICBhc3NlcnRfZXF1YWwoIihmb286IDEsIGJhcjogMiwgYmF6OiAzKSIsCisgICAgICBwZXJmb3JtKCJtYXAtbWVyZ2UoKGZvbzogMSwgYmFyOiAyKSwgKGJhejogMykpIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoIihmb286IDEsIGJhcjogMikiLAorICAgICAgcGVyZm9ybSgibWFwLW1lcmdlKCgpLCAoZm9vOiAxLCBiYXI6IDIpKSIpLnRvX3Nhc3MpCisgICAgYXNzZXJ0X2VxdWFsKCIoZm9vOiAxLCBiYXI6IDIpIiwKKyAgICAgIHBlcmZvcm0oIm1hcC1tZXJnZSgoZm9vOiAxLCBiYXI6IDIpLCAoKSkiKS50b19zYXNzKQorICBlbmQKKworICBkZWYgdGVzdF9tYXBfbWVyZ2VfY2hlY2tzX3R5cGUKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG1hcDE6IDEyIGlzIG5vdCBhIG1hcCBmb3IgYG1hcC1tZXJnZSciLCAibWFwLW1lcmdlKDEyLCAoZm9vOiAxKSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkbWFwMjogMTIgaXMgbm90IGEgbWFwIGZvciBgbWFwLW1lcmdlJyIsICJtYXAtbWVyZ2UoKGZvbzogMSksIDEyKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF9yZW1vdmUKKyAgICBhc3NlcnRfZXF1YWwoIihmb286IDEsIGJhejogMykiLAorICAgICAgcGVyZm9ybSgibWFwLXJlbW92ZSgoZm9vOiAxLCBiYXI6IDIsIGJhejogMyksIGJhcikiKS50b19zYXNzKQorICAgIGFzc2VydF9lcXVhbCgiKGZvbzogMSwgYmF6OiAzKSIsCisgICAgICBwZXJmb3JtKCJtYXAtcmVtb3ZlKCRtYXA6IChmb286IDEsIGJhcjogMiwgYmF6OiAzKSwgJGtleTogYmFyKSIpLnRvX3Nhc3MpCisgICAgYXNzZXJ0X2VxdWFsKCIoKSIsCisgICAgICBwZXJmb3JtKCJtYXAtcmVtb3ZlKChmb286IDEsIGJhcjogMiwgYmF6OiAzKSwgZm9vLCBiYXIsIGJheikiKS50b19zYXNzKQorICAgIGFzc2VydF9lcXVhbCgiKCkiLCBwZXJmb3JtKCJtYXAtcmVtb3ZlKCgpLCBmb28pIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoIigpIiwgcGVyZm9ybSgibWFwLXJlbW92ZSgoKSwgZm9vLCBiYXIpIikudG9fc2FzcykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX3JlbW92ZV9jaGVja3NfdHlwZQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkbWFwOiAxMiBpcyBub3QgYSBtYXAgZm9yIGBtYXAtcmVtb3ZlJyIsICJtYXAtcmVtb3ZlKDEyLCBmb28pIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX2tleXMKKyAgICBhc3NlcnRfZXF1YWwoImZvbywgYmFyIiwKKyAgICAgIHBlcmZvcm0oIm1hcC1rZXlzKChmb286IDEsIGJhcjogMikpIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoIigpIiwgcGVyZm9ybSgibWFwLWtleXMoKCkpIikudG9fc2FzcykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX2tleXNfY2hlY2tzX3R5cGUKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG1hcDogMTIgaXMgbm90IGEgbWFwIGZvciBgbWFwLWtleXMnIiwgIm1hcC1rZXlzKDEyKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF92YWx1ZXMKKyAgICBhc3NlcnRfZXF1YWwoIjEsIDIiLCBwZXJmb3JtKCJtYXAtdmFsdWVzKChmb286IDEsIGJhcjogMikpIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoIjEsIDIsIDIiLAorICAgICAgcGVyZm9ybSgibWFwLXZhbHVlcygoZm9vOiAxLCBiYXI6IDIsIGJhejogMikpIikudG9fc2FzcykKKyAgICBhc3NlcnRfZXF1YWwoIigpIiwgcGVyZm9ybSgibWFwLXZhbHVlcygoKSkiKS50b19zYXNzKQorICBlbmQKKworICBkZWYgdGVzdF9tYXBfdmFsdWVzX2NoZWNrc190eXBlCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRtYXA6IDEyIGlzIG5vdCBhIG1hcCBmb3IgYG1hcC12YWx1ZXMnIiwgIm1hcC12YWx1ZXMoMTIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX2hhc19rZXkKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCBldmFsdWF0ZSgibWFwLWhhcy1rZXkoKGZvbzogMSwgYmFyOiAxKSwgZm9vKSIpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIGV2YWx1YXRlKCJtYXAtaGFzLWtleSgoZm9vOiAxLCBiYXI6IDEpLCBiYXopIikKKyAgICBhc3NlcnRfZXF1YWwgImZhbHNlIiwgZXZhbHVhdGUoIm1hcC1oYXMta2V5KCgpLCBmb28pIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX2hhc19rZXlfY2hlY2tzX3R5cGUKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG1hcDogMTIgaXMgbm90IGEgbWFwIGZvciBgbWFwLWhhcy1rZXknIiwgIm1hcC1oYXMta2V5KDEyLCBmb28pIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfa2V5d29yZHMKKyAgICAjIFRoZSBhY3R1YWwgZnVuY3Rpb25hbGl0eSBpcyB0ZXN0ZWQgaW4gdGVzdHMgd2hlcmUgcmVhbCBhcmdsaXN0cyBhcmUgcGFzc2VkLgorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkYXJnczogMTIgaXMgbm90IGEgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBmb3IgYGtleXdvcmRzJyIsICJrZXl3b3JkcygxMikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKAorICAgICAgIiRhcmdzOiAoMSAyIDMpIGlzIG5vdCBhIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgZm9yIGBrZXl3b3JkcyciLCAia2V5d29yZHMoMSAyIDMpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFydGlhbF9saXN0X29mX3BhaXJzX2RvZXNudF93b3JrX2FzX2FfbWFwCisgICAgYXNzZXJ0X3JhaXNlcyhTYXNzOjpTeW50YXhFcnJvcikge2V2YWx1YXRlKCJtYXAtZ2V0KChmb28gYmFyLCBiYXogYmFuZywgYmlwKSwgMSkiKX0KKyAgICBhc3NlcnRfcmFpc2VzKFNhc3M6OlN5bnRheEVycm9yKSB7ZXZhbHVhdGUoIm1hcC1nZXQoKGZvbyBiYXIsIGJheiBiYW5nLCBiaXAgYmFwIGJvcCksIDEpIil9CisgICAgYXNzZXJ0X3JhaXNlcyhTYXNzOjpTeW50YXhFcnJvcikge2V2YWx1YXRlKCJtYXAtZ2V0KChmb28gYmFyKSwgMSkiKX0KKyAgZW5kCisKKyAgZGVmIHRlc3RfYXNzZXJ0X3VuaXQKKyAgICBjdHggPSBTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9uczo6RXZhbHVhdGlvbkNvbnRleHQubmV3KFNhc3M6OkVudmlyb25tZW50Lm5ldyhuaWwsIHt9KSkKKyAgICBjdHguYXNzZXJ0X3VuaXQgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLm5ldygxMCwgWyJweCJdLCBbXSksICJweCIKKyAgICBjdHguYXNzZXJ0X3VuaXQgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLm5ldygxMCwgW10sIFtdKSwgbmlsCisKKyAgICBiZWdpbgorICAgICAgY3R4LmFzc2VydF91bml0IFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5uZXcoMTAsIFtdLCBbXSksICJweCIKKyAgICAgIGZhaWwKKyAgICByZXNjdWUgQXJndW1lbnRFcnJvciA9PiBlCisgICAgICBhc3NlcnRfZXF1YWwgIkV4cGVjdGVkIDEwIHRvIGhhdmUgYSB1bml0IG9mIHB4IiwgZS5tZXNzYWdlCisgICAgZW5kCisKKyAgICBiZWdpbgorICAgICAgY3R4LmFzc2VydF91bml0IFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5uZXcoMTAsIFsicHgiXSwgW10pLCBuaWwKKyAgICAgIGZhaWwKKyAgICByZXNjdWUgQXJndW1lbnRFcnJvciA9PiBlCisgICAgICBhc3NlcnRfZXF1YWwgIkV4cGVjdGVkIDEwcHggdG8gYmUgdW5pdGxlc3MiLCBlLm1lc3NhZ2UKKyAgICBlbmQKKworICAgIGJlZ2luCisgICAgICBjdHguYXNzZXJ0X3VuaXQgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLm5ldygxMCwgW10sIFtdKSwgInB4IiwgImFyZyIKKyAgICAgIGZhaWwKKyAgICByZXNjdWUgQXJndW1lbnRFcnJvciA9PiBlCisgICAgICBhc3NlcnRfZXF1YWwgIkV4cGVjdGVkICRhcmcgdG8gaGF2ZSBhIHVuaXQgb2YgcHggYnV0IGdvdCAxMCIsIGUubWVzc2FnZQorICAgIGVuZAorCisgICAgYmVnaW4KKyAgICAgIGN0eC5hc3NlcnRfdW5pdCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIubmV3KDEwLCBbInB4Il0sIFtdKSwgbmlsLCAiYXJnIgorICAgICAgZmFpbAorICAgIHJlc2N1ZSBBcmd1bWVudEVycm9yID0+IGUKKyAgICAgIGFzc2VydF9lcXVhbCAiRXhwZWN0ZWQgJGFyZyB0byBiZSB1bml0bGVzcyBidXQgZ290IDEwcHgiLCBlLm1lc3NhZ2UKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FsbF93aXRoX3Bvc2l0aW9uYWxfYXJndW1lbnRzCisgICAgIyBUT0RPOiBSZW1vdmUgdGhpcyBibG9jayBpbiA0LjAKKyAgICBTYXNzOjpVdGlsLnNpbGVuY2Vfc2Fzc193YXJuaW5ncyBkbworICAgICAgYXNzZXJ0X2VxdWFsIGV2YWx1YXRlKCJsaWdodGVuKGJsdWUsIDUlKSIpLCBldmFsdWF0ZSgiY2FsbChsaWdodGVuLCBibHVlLCA1JSkiKQorICAgIGVuZAorICAgIGFzc2VydF9lcXVhbCBldmFsdWF0ZSgibGlnaHRlbihibHVlLCA1JSkiKSwgZXZhbHVhdGUoImNhbGwoZ2V0LWZ1bmN0aW9uKGxpZ2h0ZW4pLCBibHVlLCA1JSkiKQorICBlbmQKKworICBkZWYgdGVzdF9jYWxsX3dpdGhfa2V5d29yZF9hcmd1bWVudHMKKyAgICAjIFRPRE86IFJlbW92ZSB0aGlzIGJsb2NrIGluIDQuMAorICAgIFNhc3M6OlV0aWwuc2lsZW5jZV9zYXNzX3dhcm5pbmdzIGRvCisgICAgICBhc3NlcnRfZXF1YWwoCisgICAgICAgIGV2YWx1YXRlKCJsaWdodGVuKCRjb2xvcjogYmx1ZSwgJGFtb3VudDogNSUpIiksCisgICAgICAgIGV2YWx1YXRlKCJjYWxsKGxpZ2h0ZW4sICRjb2xvcjogYmx1ZSwgJGFtb3VudDogNSUpIikpCisgICAgZW5kCisgICAgYXNzZXJ0X2VxdWFsKAorICAgICAgZXZhbHVhdGUoImxpZ2h0ZW4oJGNvbG9yOiBibHVlLCAkYW1vdW50OiA1JSkiKSwKKyAgICAgIGV2YWx1YXRlKCJjYWxsKGdldC1mdW5jdGlvbihsaWdodGVuKSwgJGNvbG9yOiBibHVlLCAkYW1vdW50OiA1JSkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2FsbF93aXRoX2tleXdvcmRfYW5kX3Bvc2l0aW9uYWxfYXJndW1lbnRzCisgICAgIyBUT0RPOiBSZW1vdmUgdGhpcyBibG9jayBpbiA0LjAKKyAgICBTYXNzOjpVdGlsLnNpbGVuY2Vfc2Fzc193YXJuaW5ncyBkbworICAgICAgYXNzZXJ0X2VxdWFsKAorICAgICAgICBldmFsdWF0ZSgibGlnaHRlbihibHVlLCAkYW1vdW50OiA1JSkiKSwKKyAgICAgICAgZXZhbHVhdGUoImNhbGwobGlnaHRlbiwgYmx1ZSwgJGFtb3VudDogNSUpIikpCisgICAgZW5kCisgICAgYXNzZXJ0X2VxdWFsKAorICAgICAgZXZhbHVhdGUoImxpZ2h0ZW4oYmx1ZSwgJGFtb3VudDogNSUpIiksCisgICAgICBldmFsdWF0ZSgiY2FsbChnZXQtZnVuY3Rpb24obGlnaHRlbiksIGJsdWUsICRhbW91bnQ6IDUlKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9jYWxsX3dpdGhfZHluYW1pY19uYW1lCisgICAgIyBUT0RPOiBSZW1vdmUgdGhpcyBibG9jayBpbiA0LjAKKyAgICBTYXNzOjpVdGlsLnNpbGVuY2Vfc2Fzc193YXJuaW5ncyBkbworICAgICAgYXNzZXJ0X2VxdWFsKAorICAgICAgICBldmFsdWF0ZSgibGlnaHRlbigkY29sb3I6IGJsdWUsICRhbW91bnQ6IDUlKSIpLAorICAgICAgICBldmFsdWF0ZSgiY2FsbCgkZm4sICRjb2xvcjogYmx1ZSwgJGFtb3VudDogNSUpIiwKKyAgICAgICAgICBlbnYoImZuIiA9PiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KCJsaWdodGVuIikpKSkKKyAgICBlbmQKKyAgICBhc3NlcnRfZXF1YWwoCisgICAgICBldmFsdWF0ZSgibGlnaHRlbigkY29sb3I6IGJsdWUsICRhbW91bnQ6IDUlKSIpLAorICAgICAgZXZhbHVhdGUoImNhbGwoJGZuLCAkY29sb3I6IGJsdWUsICRhbW91bnQ6IDUlKSIsCisgICAgICAgIGVudigiZm4iID0+IFNhc3M6OlNjcmlwdDo6VmFsdWU6OkZ1bmN0aW9uLm5ldygKKyAgICAgICAgICBTYXNzOjpDYWxsYWJsZS5uZXcoImxpZ2h0ZW4iLCBuaWwsIG5pbCwgbmlsLCBuaWwsIG5pbCwgImZ1bmN0aW9uIiwgOmJ1aWx0aW4pKSkpKQorICBlbmQKKworICAjIFRPRE86IFJlbW92ZSB0aGlzIHRlc3QgaW4gNC4wCisgIGRlZiB0ZXN0X2NhbGxfdXNlc19sb2NhbF9zY29wZQorICAgIFNhc3M6OlV0aWwuc2lsZW5jZV9zYXNzX3dhcm5pbmdzIGRvCisgICAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZmlyc3Qtc2NvcGUgeworICBhOiBsb2NhbDsgfQorCisuc2Vjb25kLXNjb3BlIHsKKyAgYTogZ2xvYmFsOyB9CitDU1MKK0BmdW5jdGlvbiBmb28oKSB7QHJldHVybiBnbG9iYWx9CisKKy5maXJzdC1zY29wZSB7CisgIEBmdW5jdGlvbiBmb28oKSB7QHJldHVybiBsb2NhbH0KKyAgYTogY2FsbChmb28pOworfQorCisuc2Vjb25kLXNjb3BlIHsKKyAgYTogY2FsbChmb28pOworfQorU0NTUworICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9jYWxsX3Vua25vd25fZnVuY3Rpb24KKyAgICAjIFRPRE86IFJlbW92ZSB0aGlzIGJsb2NrIGluIDQuMAorICAgIFNhc3M6OlV0aWwuc2lsZW5jZV9zYXNzX3dhcm5pbmdzIGRvCisgICAgICBhc3NlcnRfZXF1YWwgZXZhbHVhdGUoInVua25vd24ocmVkLCBibHVlKSIpLCBldmFsdWF0ZSgiY2FsbCh1bmtub3duLCByZWQsIGJsdWUpIikKKyAgICBlbmQKKyAgICBhc3NlcnRfZXF1YWwgZXZhbHVhdGUoInVua25vd24ocmVkLCBibHVlKSIpLCBldmFsdWF0ZSgiY2FsbChnZXQtZnVuY3Rpb24odW5rbm93biwgJGNzczogdHJ1ZSksIHJlZCwgYmx1ZSkiKQorICBlbmQKKworICBkZWYgdGVzdF9jYWxsX3dpdGhfbm9uX3N0cmluZ19hcmd1bWVudAorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlICIkZnVuY3Rpb246IDNweCBpcyBub3QgYSBmdW5jdGlvbiBmb3IgYGNhbGwnIiwgImNhbGwoM3B4KSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXJyb3JzX2luX2NhbGxlZF9mdW5jdGlvbgorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlICIkY29sb3I6IDNweCBpcyBub3QgYSBjb2xvciBmb3IgYGxpZ2h0ZW4nIiwKKyAgICAgICJjYWxsKGdldC1mdW5jdGlvbihsaWdodGVuKSwgM3B4LCA1JSkiCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX2V4aXN0cworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy50ZXN0IHsKKyAgZmFsc2U6IGZhbHNlOworICB0cnVlOiB0cnVlOworICB0cnVlOiB0cnVlOworICB0cnVlOiB0cnVlOworICB0cnVlOiB0cnVlOyB9CitDU1MKKyRnbG9iYWwtdmFyOiBoYXMtdmFsdWU7CisudGVzdCB7CisgIGZhbHNlOiB2YXJpYWJsZS1leGlzdHMoZm9vKTsKKyAgJGZvbzogaGFzLXZhbHVlOworICB0cnVlOiB2YXJpYWJsZS1leGlzdHMoZm9vKTsKKyAgdHJ1ZTogdmFyaWFibGUtZXhpc3RzKCRuYW1lOiBmb28pOworICB0cnVlOiB2YXJpYWJsZS1leGlzdHMoZ2xvYmFsLXZhcik7CisgIHRydWU6IHZhcmlhYmxlLWV4aXN0cygkbmFtZTogZ2xvYmFsLXZhcik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlX2V4aXN0c19jaGVja3NfdHlwZQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkbmFtZTogMSBpcyBub3QgYSBzdHJpbmcgZm9yIGB2YXJpYWJsZS1leGlzdHMnIiwgInZhcmlhYmxlLWV4aXN0cygxKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2dsb2JhbF92YXJpYWJsZV9leGlzdHMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisudGVzdCB7CisgIGZhbHNlOiBmYWxzZTsKKyAgZmFsc2U6IGZhbHNlOworICB0cnVlOiB0cnVlOworICB0cnVlOiB0cnVlOworICBmYWxzZTogZmFsc2U7CisgIHRydWU6IHRydWU7CisgIHRydWU6IHRydWU7IH0KK0NTUworJGc6IHNvbWV0aGluZzsKKyRoOiBudWxsOworJGZhbHNlOiBnbG9iYWwtdmFyaWFibGUtZXhpc3RzKGZvbyk7CiskdHJ1ZTogZ2xvYmFsLXZhcmlhYmxlLWV4aXN0cyhnKTsKKyRuYW1lZDogZ2xvYmFsLXZhcmlhYmxlLWV4aXN0cygkbmFtZTogZyk7CisudGVzdCB7CisgICRmb286IGxvY2FsbHktZGVmaW5lZDsKKyAgZmFsc2U6IGdsb2JhbC12YXJpYWJsZS1leGlzdHMoZm9vKTsKKyAgZmFsc2U6IGdsb2JhbC12YXJpYWJsZS1leGlzdHMoZm9vMik7CisgIHRydWU6IGdsb2JhbC12YXJpYWJsZS1leGlzdHMoZyk7CisgIHRydWU6IGdsb2JhbC12YXJpYWJsZS1leGlzdHMoaCk7CisgIGZhbHNlOiAkZmFsc2U7CisgIHRydWU6ICR0cnVlOworICB0cnVlOiAkbmFtZWQ7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2dsb2JhbF92YXJpYWJsZV9leGlzdHNfY2hlY2tzX3R5cGUKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJG5hbWU6IDEgaXMgbm90IGEgc3RyaW5nIGZvciBgZ2xvYmFsLXZhcmlhYmxlLWV4aXN0cyciLAorICAgICAgImdsb2JhbC12YXJpYWJsZS1leGlzdHMoMSkiKQorICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9leGlzdHMKKyAgICAjIGJ1aWx0LWlucworICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIGV2YWx1YXRlKCJmdW5jdGlvbi1leGlzdHMobGlnaHRlbikiKQorICAgICMgd2l0aCBuYW1lZCBhcmd1bWVudAorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIGV2YWx1YXRlKCJmdW5jdGlvbi1leGlzdHMoJG5hbWU6IGxpZ2h0ZW4pIikKKyAgICAjIHVzZXItZGVmaW5lZAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy50ZXN0IHsKKyAgZm9vLWV4aXN0czogdHJ1ZTsKKyAgYmFyLWV4aXN0czogZmFsc2U7IH0KK0NTUworQGZ1bmN0aW9uIGZvbygpIHsgQHJldHVybiAiZm9vIiB9CisudGVzdCB7CisgIGZvby1leGlzdHM6IGZ1bmN0aW9uLWV4aXN0cyhmb28pOworICBiYXItZXhpc3RzOiBmdW5jdGlvbi1leGlzdHMoYmFyKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fZXhpc3RzX2NoZWNrc190eXBlCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRuYW1lOiAxIGlzIG5vdCBhIHN0cmluZyBmb3IgYGZ1bmN0aW9uLWV4aXN0cyciLCAiZnVuY3Rpb24tZXhpc3RzKDEpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fZXhpc3RzCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIGV2YWx1YXRlKCJtaXhpbi1leGlzdHMoZm9vKSIpCisgICAgIyB3aXRoIG5hbWVkIGFyZ3VtZW50CisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIGV2YWx1YXRlKCJtaXhpbi1leGlzdHMoJG5hbWU6IGZvbykiKQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy50ZXN0IHsKKyAgZm9vLWV4aXN0czogdHJ1ZTsKKyAgYmFyLWV4aXN0czogZmFsc2U7IH0KK0NTUworQG1peGluIGZvbygpIHsgZm9vOiBleGlzdHMgfQorLnRlc3QgeworICBmb28tZXhpc3RzOiBtaXhpbi1leGlzdHMoZm9vKTsKKyAgYmFyLWV4aXN0czogbWl4aW4tZXhpc3RzKGJhcik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2V4aXN0c19jaGVja3NfdHlwZQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkbmFtZTogMSBpcyBub3QgYSBzdHJpbmcgZm9yIGBtaXhpbi1leGlzdHMnIiwgIm1peGluLWV4aXN0cygxKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2luc3BlY3QKKyAgICBhc3NlcnRfZXF1YWwgIigpIiwgZXZhbHVhdGUoImluc3BlY3QoKCkpIikKKyAgICBhc3NlcnRfZXF1YWwgIm51bGwiLCBldmFsdWF0ZSgiaW5zcGVjdChudWxsKSIpCisgICAgYXNzZXJ0X2VxdWFsICIxcHggbnVsbCAzcHgiLCBldmFsdWF0ZSgiaW5zcGVjdCgxcHggbnVsbCAzcHgpIikKKyAgICBhc3NlcnRfZXF1YWwgIihhOiAxLCBiOiAyKSIsIGV2YWx1YXRlKCJpbnNwZWN0KChhOiAxLCBiOiAyKSkiKQorICAgIGFzc2VydF9lcXVhbCAiKGE6IDEsIGI6IChjOiAyKSkiLCBldmFsdWF0ZSgiaW5zcGVjdCgoYTogMSwgYjogKGM6IDIpKSkiKQorICAgIGFzc2VydF9lcXVhbCAiKGE6IDEsIGI6ICgyLCAzKSkiLCBldmFsdWF0ZSgiaW5zcGVjdCgoYTogMSwgYjogKDIsIDMpKSkiKQorICAgIGFzc2VydF9lcXVhbCAiKGE6IDEsIGI6IDIgMykiLCBldmFsdWF0ZSgiaW5zcGVjdCgoYTogMSwgYjogMiAzKSkiKQorICBlbmQKKworICBkZWYgdGVzdF9yYW5kb20KKyAgICBTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9ucy5yYW5kb21fc2VlZCA9IDEKKyAgICBhc3NlcnRfZXF1YWwgIjAuNDE3MDIyMDA0NyIsIGV2YWx1YXRlKCJyYW5kb20oKSIpCisgICAgYXNzZXJ0X2VxdWFsICIxMyIsIGV2YWx1YXRlKCJyYW5kb20oMTAwKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3JhbmRvbV93b3Jrc193aXRob3V0X2Ffc2VlZAorICAgIGlmIFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zLmluc3RhbmNlX3ZhcmlhYmxlX2RlZmluZWQ/KCJAcmFuZG9tX251bWJlcl9nZW5lcmF0b3IiKQorICAgICAgU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnMuc2VuZCg6cmVtb3ZlX2luc3RhbmNlX3ZhcmlhYmxlLCAiQHJhbmRvbV9udW1iZXJfZ2VuZXJhdG9yIikKKyAgICBlbmQKKworICAgIHJlc3VsdCA9IHBlcmZvcm0oInJhbmRvbSgpIikKKyAgICBhc3NlcnRfa2luZF9vZiBTYXNzOjpTY3JpcHQ6Ok51bWJlciwgcmVzdWx0CisgICAgYXNzZXJ0IHJlc3VsdC52YWx1ZSA+PSAwLCAiUmFuZG9tIG51bWJlciB3YXMgYmVsb3cgMCIKKyAgICBhc3NlcnQgcmVzdWx0LnZhbHVlIDw9IDEsICJSYW5kb20gbnVtYmVyIHdhcyBhYm92ZSAxIgorICBlbmQKKworICBkZWYgdGVzdF9yYW5kb21fd2l0aF9saW1pdF9vbmUKKyAgICAjIFBhc3NpbmcgMSBhcyB0aGUgbGltaXQgc2hvdWxkIGFsd2F5cyByZXR1cm4gMSwgc2luY2UgbGltaXQgY2FsbHMgcmV0dXJuCisgICAgIyBpbnRlZ2VycyBmcm9tIDEgdG8gdGhlIGFyZ3VtZW50LCBzbyB3aGVuIHRoZSBhcmd1bWVudCBpcyAxLCBpdHMgYSBwcmVkaWNhdGJsZQorICAgICMgb3V0Y29tZQorICAgIGFzc2VydCAiMSIsIGV2YWx1YXRlKCJyYW5kb20oMSkiKQorICBlbmQKKworICBkZWYgdGVzdF9yYW5kb21fd2l0aF9saW1pdF90b29fbG93CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRsaW1pdCAwIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEgZm9yIGByYW5kb20nIiwgInJhbmRvbSgwKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3JhbmRvbV93aXRoX25vbl9pbnRlZ2VyX2xpbWl0CisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkV4cGVjdGVkICRsaW1pdCB0byBiZSBhbiBpbnRlZ2VyIGJ1dCBnb3QgMS41IGZvciBgcmFuZG9tJyIsICJyYW5kb20oMS41KSIpCisgIGVuZAorCisgICMgUmVncmVzc2lvbiB0ZXN0IGZvciAjMTYzOC4KKyAgZGVmIHRlc3RfcmFuZG9tX3dpdGhfZmxvYXRfaW50ZWdlcl9saW1pdAorICAgIHJlc3VsdCA9IHBlcmZvcm0oInJhbmRvbSgxLjApIikKKyAgICBhc3NlcnRfa2luZF9vZiBTYXNzOjpTY3JpcHQ6Ok51bWJlciwgcmVzdWx0CisgICAgYXNzZXJ0IHJlc3VsdC52YWx1ZSA+PSAwLCAiUmFuZG9tIG51bWJlciB3YXMgYmVsb3cgMCIKKyAgICBhc3NlcnQgcmVzdWx0LnZhbHVlIDw9IDEsICJSYW5kb20gbnVtYmVyIHdhcyBhYm92ZSAxIgorICBlbmQKKworICAjIFRoaXMgY291bGQgKnBvc3NpYmx5KiBmYWlsLCBidXQgZXhjZWVkaW5nbHkgdW5saWtlbHkKKyAgZGVmIHRlc3RfcmFuZG9tX2lzX3NlbWlfdW5pcXVlCisgICAgaWYgU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnMuaW5zdGFuY2VfdmFyaWFibGVfZGVmaW5lZD8oIkByYW5kb21fbnVtYmVyX2dlbmVyYXRvciIpCisgICAgICBTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9ucy5zZW5kKDpyZW1vdmVfaW5zdGFuY2VfdmFyaWFibGUsICJAcmFuZG9tX251bWJlcl9nZW5lcmF0b3IiKQorICAgIGVuZAorICAgIHJlZnV0ZV9lcXVhbCBldmFsdWF0ZSgicmFuZG9tKCkiKSwgZXZhbHVhdGUoInJhbmRvbSgpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVwcmVjYXRlZF9hcmdfbmFtZXMKKyAgICBhc3NlcnRfd2FybmluZyA8PFdBUk5JTkcgZG8KK0RFUFJFQ0FUSU9OIFdBUk5JTkc6IFRoZSBgJGFyZy0xJyBhcmd1bWVudCBmb3IgYGRlcHJlY2F0ZWQtYXJnLWZuKCknIGhhcyBiZWVuIHJlbmFtZWQgdG8gYCRhcmcxJy4KK0RFUFJFQ0FUSU9OIFdBUk5JTkc6IFRoZSBgJGFyZy0yJyBhcmd1bWVudCBmb3IgYGRlcHJlY2F0ZWQtYXJnLWZuKCknIGhhcyBiZWVuIHJlbmFtZWQgdG8gYCRhcmcyJy4KK1dBUk5JTkcKKyAgICAgIGFzc2VydF9lcXVhbCgiMSAyIDMiLAorICAgICAgICBldmFsdWF0ZSgiZGVwcmVjYXRlZC1hcmctZm4oJGFyZy0xOiAxLCAkYXJnLTI6IDIsICRhcmczOiAzKSIpKQorICAgIGVuZAorCisgICAgYXNzZXJ0X3dhcm5pbmcgPDxXQVJOSU5HIGRvCitERVBSRUNBVElPTiBXQVJOSU5HOiBUaGUgYCRhcmctMScgYXJndW1lbnQgZm9yIGBkZXByZWNhdGVkLWFyZy1mbigpJyBoYXMgYmVlbiByZW5hbWVkIHRvIGAkYXJnMScuCitERVBSRUNBVElPTiBXQVJOSU5HOiBUaGUgYCRhcmctMicgYXJndW1lbnQgZm9yIGBkZXByZWNhdGVkLWFyZy1mbigpJyBoYXMgYmVlbiByZW5hbWVkIHRvIGAkYXJnMicuCitXQVJOSU5HCisgICAgICBhc3NlcnRfZXF1YWwoIjEgMiIsCisgICAgICAgIGV2YWx1YXRlKCJkZXByZWNhdGVkLWFyZy1mbigkYXJnLTE6IDEsICRhcmctMjogMikiKSkKKyAgICBlbmQKKworICAgIGFzc2VydF93YXJuaW5nIDw8V0FSTklORyBkbworREVQUkVDQVRJT04gV0FSTklORzogVGhlIGAkYXJnXzEnIGFyZ3VtZW50IGZvciBgZGVwcmVjYXRlZC1hcmctZm4oKScgaGFzIGJlZW4gcmVuYW1lZCB0byBgJGFyZzEnLgorREVQUkVDQVRJT04gV0FSTklORzogVGhlIGAkYXJnXzInIGFyZ3VtZW50IGZvciBgZGVwcmVjYXRlZC1hcmctZm4oKScgaGFzIGJlZW4gcmVuYW1lZCB0byBgJGFyZzInLgorV0FSTklORworICAgICAgYXNzZXJ0X2VxdWFsKCIxIDIiLAorICAgICAgICBldmFsdWF0ZSgiZGVwcmVjYXRlZC1hcmctZm4oJGFyZ18xOiAxLCAkYXJnXzI6IDIpIikpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25vbl9kZXByZWNhdGVkX2FyZ19uYW1lcworICAgIGFzc2VydF9lcXVhbCgiMSAyIDMiLCBldmFsdWF0ZSgiZGVwcmVjYXRlZC1hcmctZm4oJGFyZzE6IDEsICRhcmcyOiAyLCAkYXJnMzogMykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIjEgMiIsIGV2YWx1YXRlKCJkZXByZWNhdGVkLWFyZy1mbigkYXJnMTogMSwgJGFyZzI6IDIpIikpCisgIGVuZAorCisgICMjIFNlbGVjdG9yIEZ1bmN0aW9ucworCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2FyZ3VtZW50X3BhcnNpbmcKKyAgICBhc3NlcnRfZXF1YWwoInRydWUiLCBldmFsdWF0ZSgic2VsZWN0b3ItcGFyc2UoJy5mb28nKSA9PSAoam9pbigoJy5mb28nLCksICgpLCBzcGFjZSksKSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCJzZWxlY3Rvci1wYXJzZSgnLmZvbyAuYmFyJykgPT0gKCcuZm9vJyAnLmJhcicsKSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsCisgICAgICBldmFsdWF0ZSgic2VsZWN0b3ItcGFyc2UoJy5mb28gLmJhciwgLmJheiAuYmFuZycpID09ICgnLmZvbycgJy5iYXInLCAnLmJheicgJy5iYW5nJykiKSkKKworICAgIGFzc2VydF9lcXVhbCgiLmZvbyAlYmFyIiwgZXZhbHVhdGUoInNlbGVjdG9yLXBhcnNlKCcuZm9vICViYXInKSIpKQorCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwKKyAgICAgIGV2YWx1YXRlKCJzZWxlY3Rvci1wYXJzZSgoJy5mb28nLCAnLmJhcicpKSA9PSBzZWxlY3Rvci1wYXJzZSgnLmZvbywgLmJhcicpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwKKyAgICAgIGV2YWx1YXRlKCJzZWxlY3Rvci1wYXJzZSgnLmZvbycgJy5iYXInKSA9PSBzZWxlY3Rvci1wYXJzZSgnLmZvbyAuYmFyJykiKSkKKworICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCJzZWxlY3Rvci1wYXJzZSgoJy5mb28nICcuYmFyJywgJy5iYXonICcuYmFuZycpKSA9PSAiICsKKyAgICAgICAgInNlbGVjdG9yLXBhcnNlKCcuZm9vIC5iYXIsIC5iYXogLmJhbmcnKSIpKQorICAgIGFzc2VydF9lcXVhbCgidHJ1ZSIsIGV2YWx1YXRlKCJzZWxlY3Rvci1wYXJzZSgoJy5mb28gLmJhcicsICcuYmF6IC5iYW5nJykpID09ICIgKworICAgICAgICAic2VsZWN0b3ItcGFyc2UoJy5mb28gLmJhciwgLmJheiAuYmFuZycpIikpCisKKyAgICAjIFRoaXMgbWF5IHRocm93IGFuIGVycm9yIGluIHRoZSBmdXR1cmUuCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoInNlbGVjdG9yLXBhcnNlKCgnLmZvbywgLmJhcicgJy5iYXosIC5iYW5nJykpID09ICIgKworICAgICAgICAic2VsZWN0b3ItcGFyc2UoJy5mb28sIC5iYXIgLmJheiwgLmJhbmcnKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9hcmd1bWVudF92YWxpZGF0aW9uCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzZWxlY3RvcjogMTIgaXMgbm90IGEgdmFsaWQgc2VsZWN0b3I6IGl0IG11c3QgYmUgYSBzdHJpbmcsXG4iICsKKyAgICAgICJhIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgZm9yIGBzZWxlY3Rvci1wYXJzZSciLCAic2VsZWN0b3ItcGFyc2UoMTIpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNlbGVjdG9yOiAoKChcIi5mb29cIiBcIi5iYXJcIiksIFwiLmJhelwiKSAoXCIuYmFuZ1wiLCBcIi5xdXhcIikpIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yOiBpdCBtdXN0IGJlIGEgc3RyaW5nLFxuIiArCisgICAgICAiYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIGZvciBgc2VsZWN0b3ItcGFyc2UnIiwKKyAgICAgICJzZWxlY3Rvci1wYXJzZSgoJy5mb28nICcuYmFyJywgJy5iYXonKSAoJy5iYW5nJywgJy5xdXgnKSkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VsZWN0b3I6IFwiLiNcIiBpcyBub3QgYSB2YWxpZCBzZWxlY3RvcjogSW52YWxpZCBDU1MgYWZ0ZXIgXCIuXCI6ICIgKworICAgICAgImV4cGVjdGVkIGNsYXNzIG5hbWUsIHdhcyBcIiNcIiBmb3IgYHNlbGVjdG9yLXBhcnNlJyIsICJzZWxlY3Rvci1wYXJzZSgnLiMnKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzZWxlY3RvcjogXCImLmZvb1wiIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yOiBJbnZhbGlkIENTUyBhZnRlciBcIlwiOiAiICsKKyAgICAgICJleHBlY3RlZCBzZWxlY3Rvciwgd2FzIFwiJi5mb29cIiBmb3IgYHNlbGVjdG9yLXBhcnNlJyIsICJzZWxlY3Rvci1wYXJzZSgnJi5mb28nKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX25lc3QKKyAgICBhc3NlcnRfZXF1YWwoIi5mb28iLCBldmFsdWF0ZSgic2VsZWN0b3ItbmVzdCgnLmZvbycpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIuZm9vIC5iYXIiLCBldmFsdWF0ZSgic2VsZWN0b3ItbmVzdCgnLmZvbycsICcuYmFyJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5mb28gLmJhciAuYmF6IiwgZXZhbHVhdGUoInNlbGVjdG9yLW5lc3QoJy5mb28nLCAnLmJhcicsICcuYmF6JykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5hIC5mb28gLmIgLmJhciIsIGV2YWx1YXRlKCJzZWxlY3Rvci1uZXN0KCcuYSAuZm9vJywgJy5iIC5iYXInKSIpKQorICAgIGFzc2VydF9lcXVhbCgiLmZvby5iYXIiLCBldmFsdWF0ZSgic2VsZWN0b3ItbmVzdCgnLmZvbycsICcmLmJhcicpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIuYmF6IC5mb28uYmFyIiwgZXZhbHVhdGUoInNlbGVjdG9yLW5lc3QoJy5mb28nLCAnJi5iYXInLCAnLmJheiAmJykiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfbmVzdF9jaGVja3NfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNlbGVjdG9yczogMTIgaXMgbm90IGEgdmFsaWQgc2VsZWN0b3I6IGl0IG11c3QgYmUgYSBzdHJpbmcsXG4iICsKKyAgICAgICJhIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgZm9yIGBzZWxlY3Rvci1uZXN0JyIsCisgICAgICAic2VsZWN0b3ItbmVzdCgxMikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VsZWN0b3JzOiAxMiBpcyBub3QgYSB2YWxpZCBzZWxlY3RvcjogaXQgbXVzdCBiZSBhIHN0cmluZyxcbiIgKworICAgICAgImEgbGlzdCBvZiBzdHJpbmdzLCBvciBhIGxpc3Qgb2YgbGlzdHMgb2Ygc3RyaW5ncyBmb3IgYHNlbGVjdG9yLW5lc3QnIiwKKyAgICAgICJzZWxlY3Rvci1uZXN0KCcuZm9vJywgMTIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfbmVzdF9hcmd1bWVudF92YWxpZGF0aW9uCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzZWxlY3RvcnM6IEF0IGxlYXN0IG9uZSBzZWxlY3RvciBtdXN0IGJlIHBhc3NlZCBmb3IgYHNlbGVjdG9yLW5lc3QnIiwKKyAgICAgICJzZWxlY3Rvci1uZXN0KCkiKQorICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9hcHBlbmQKKyAgICBhc3NlcnRfZXF1YWwoIi5mb28uYmFyIiwgZXZhbHVhdGUoInNlbGVjdG9yLWFwcGVuZCgnLmZvbycsICcuYmFyJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5hIC5mb28uYiAuYmFyIiwgZXZhbHVhdGUoInNlbGVjdG9yLWFwcGVuZCgnLmEgLmZvbycsICcuYiAuYmFyJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5mb28tc3VmZml4IiwgZXZhbHVhdGUoInNlbGVjdG9yLWFwcGVuZCgnLmZvbycsICctc3VmZml4JykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5mb28uYmFyLCAuZm9vLXN1ZmZpeCIsIGV2YWx1YXRlKCJzZWxlY3Rvci1hcHBlbmQoJy5mb28nLCAnLmJhciwgLXN1ZmZpeCcpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIuZm9vLS1zdWZmaXgiLCBldmFsdWF0ZSgic2VsZWN0b3ItYXBwZW5kKCcuZm9vJywgJy0tc3VmZml4JykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5mb28uYmFyLCAuZm9vLS1zdWZmaXgiLCBldmFsdWF0ZSgic2VsZWN0b3ItYXBwZW5kKCcuZm9vJywgJy5iYXIsIC0tc3VmZml4JykiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfYXBwZW5kX2NoZWNrc190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VsZWN0b3JzOiAxMiBpcyBub3QgYSB2YWxpZCBzZWxlY3RvcjogaXQgbXVzdCBiZSBhIHN0cmluZyxcbiIgKworICAgICAgImEgbGlzdCBvZiBzdHJpbmdzLCBvciBhIGxpc3Qgb2YgbGlzdHMgb2Ygc3RyaW5ncyBmb3IgYHNlbGVjdG9yLWFwcGVuZCciLAorICAgICAgInNlbGVjdG9yLWFwcGVuZCgxMikiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VsZWN0b3JzOiAxMiBpcyBub3QgYSB2YWxpZCBzZWxlY3RvcjogaXQgbXVzdCBiZSBhIHN0cmluZyxcbiIgKworICAgICAgImEgbGlzdCBvZiBzdHJpbmdzLCBvciBhIGxpc3Qgb2YgbGlzdHMgb2Ygc3RyaW5ncyBmb3IgYHNlbGVjdG9yLWFwcGVuZCciLAorICAgICAgInNlbGVjdG9yLWFwcGVuZCgnLmZvbycsIDEyKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2FwcGVuZF9lcnJvcnMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNlbGVjdG9yczogQXQgbGVhc3Qgb25lIHNlbGVjdG9yIG11c3QgYmUgcGFzc2VkIGZvciBgc2VsZWN0b3ItYXBwZW5kJyIsCisgICAgICAic2VsZWN0b3ItYXBwZW5kKCkiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJDYW4ndCBhcHBlbmQgXCI+IC5iYXJcIiB0byBcIi5mb29cIiBmb3IgYHNlbGVjdG9yLWFwcGVuZCciLAorICAgICAgInNlbGVjdG9yLWFwcGVuZCgnLmZvbycsICc+IC5iYXInKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkNhbid0IGFwcGVuZCBcIiouYmFyXCIgdG8gXCIuZm9vXCIgZm9yIGBzZWxlY3Rvci1hcHBlbmQnIiwKKyAgICAgICJzZWxlY3Rvci1hcHBlbmQoJy5mb28nLCAnKi5iYXInKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkNhbid0IGFwcGVuZCBcIm5zfHN1ZmZpeFwiIHRvIFwiLmZvb1wiIGZvciBgc2VsZWN0b3ItYXBwZW5kJyIsCisgICAgICAic2VsZWN0b3ItYXBwZW5kKCcuZm9vJywgJ25zfHN1ZmZpeCcpIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfZXh0ZW5kCisgICAgYXNzZXJ0X2VxdWFsKCIuZm9vIC54LCAuZm9vIC5hIC5iYXIsIC5hIC5mb28gLmJhciIsCisgICAgICBldmFsdWF0ZSgic2VsZWN0b3ItZXh0ZW5kKCcuZm9vIC54JywgJy54JywgJy5hIC5iYXInKSIpKQorICAgIGFzc2VydF9lcXVhbCgiLmZvbyAueCwgLmZvbyAuYmFuZywgLnguYmFyLCAuYmFyLmJhbmciLAorICAgICAgZXZhbHVhdGUoInNlbGVjdG9yLWV4dGVuZCgnLmZvbyAueCwgLnguYmFyJywgJy54JywgJy5iYW5nJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi55IC54LCAuZm9vIC54LCAueSAuZm9vLCAuZm9vIC5mb28iLAorICAgICAgZXZhbHVhdGUoInNlbGVjdG9yLWV4dGVuZCgnLnkgLngnLCAnLngsIC55JywgJy5mb28nKSIpKQorICAgIGFzc2VydF9lcXVhbCgiLmZvbyAueCwgLmZvbyAuYmFyLCAuZm9vIC5iYW5nIiwKKyAgICAgIGV2YWx1YXRlKCJzZWxlY3Rvci1leHRlbmQoJy5mb28gLngnLCAnLngnLCAnLmJhciwgLmJhbmcnKSIpKQorICAgIGFzc2VydF9lcXVhbCgiLmZvby54LCAuZm9vIiwKKyAgICAgIGV2YWx1YXRlKCJzZWxlY3Rvci1leHRlbmQoJy5mb28ueCcsICcueCcsICcuZm9vJykiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfZXh0ZW5kX2NoZWNrc190eXBlcworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VsZWN0b3I6IDEyIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yOiBpdCBtdXN0IGJlIGEgc3RyaW5nLFxuIiArCisgICAgICAiYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIGZvciBgc2VsZWN0b3ItZXh0ZW5kJyIsCisgICAgICAic2VsZWN0b3ItZXh0ZW5kKDEyLCAnLmZvbycsICcuYmFyJykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkZXh0ZW5kZWU6IDEyIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yOiBpdCBtdXN0IGJlIGEgc3RyaW5nLFxuIiArCisgICAgICAiYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIGZvciBgc2VsZWN0b3ItZXh0ZW5kJyIsCisgICAgICAic2VsZWN0b3ItZXh0ZW5kKCcuZm9vJywgMTIsICcuYmFyJykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkZXh0ZW5kZXI6IDEyIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yOiBpdCBtdXN0IGJlIGEgc3RyaW5nLFxuIiArCisgICAgICAiYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIGZvciBgc2VsZWN0b3ItZXh0ZW5kJyIsCisgICAgICAic2VsZWN0b3ItZXh0ZW5kKCcuZm9vJywgJy5iYXInLCAxMikiKQorICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9leHRlbmRfZXJyb3JzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIkNhbid0IGV4dGVuZCAuYmFyIC5iYXo6IGNhbid0IGV4dGVuZCBuZXN0ZWQgc2VsZWN0b3JzIGZvciAiICsKKyAgICAgICJgc2VsZWN0b3ItZXh0ZW5kJyIsICJzZWxlY3Rvci1leHRlbmQoJy5mb28nLCAnLmJhciAuYmF6JywgJy5iYW5nJykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCJDYW4ndCBleHRlbmQgPjogaW52YWxpZCBzZWxlY3RvciBmb3IgYHNlbGVjdG9yLWV4dGVuZCciLAorICAgICAgInNlbGVjdG9yLWV4dGVuZCgnLmZvbycsICc+JywgJy5iYW5nJykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIuYmFuZyA+IGNhbid0IGV4dGVuZDogaW52YWxpZCBzZWxlY3RvciBmb3IgYHNlbGVjdG9yLWV4dGVuZCciLAorICAgICAgInNlbGVjdG9yLWV4dGVuZCgnLmZvbycsICcuYmFyJywgJy5iYW5nID4nKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX3JlcGxhY2UKKyAgICBhc3NlcnRfZXF1YWwoIi5iYXIiLCBldmFsdWF0ZSgic2VsZWN0b3ItcmVwbGFjZSgnLmZvbycsICcuZm9vJywgJy5iYXInKSIpKQorICAgIGFzc2VydF9lcXVhbCgiLmZvby5iYXoiLCBldmFsdWF0ZSgic2VsZWN0b3ItcmVwbGFjZSgnLmZvby5iYXInLCAnLmJhcicsICcuYmF6JykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5hIC5mb28uYmF6IiwgZXZhbHVhdGUoInNlbGVjdG9yLXJlcGxhY2UoJy5mb28uYmFyJywgJy5iYXInLCAnLmEgLmJheicpIikpCisKKyAgICAjIFRoZXNlIHNob3VsZG4ndCB3YXJuIHNpbmNlIHdlIHN0aWxsIHN1cHBvcnQgY29tcG9udWQgdGFyZ2V0cyBmb3Igc2VsZWN0b3IKKyAgICAjIGZ1bmN0aW9ucy4KKyAgICBhc3NlcnRfbm9fd2FybmluZyB7YXNzZXJ0X2VxdWFsKCIuZm9vLmJhciIsIGV2YWx1YXRlKCJzZWxlY3Rvci1yZXBsYWNlKCcuZm9vLmJhcicsICcuYmF6LmJhcicsICcucXV4JykiKSl9CisgICAgYXNzZXJ0X25vX3dhcm5pbmcge2Fzc2VydF9lcXVhbCgiLmJhci5xdXgiLCBldmFsdWF0ZSgic2VsZWN0b3ItcmVwbGFjZSgnLmZvby5iYXIuYmF6JywgJy5mb28uYmF6JywgJy5xdXgnKSIpKX0KKworICAgIGFzc2VydF9lcXVhbCgiOm5vdCguYmFyKSIsIGV2YWx1YXRlKCJzZWxlY3Rvci1yZXBsYWNlKCc6bm90KC5mb28pJywgJy5mb28nLCAnLmJhcicpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIuYmFyIiwgZXZhbHVhdGUoInNlbGVjdG9yLXJlcGxhY2UoJzpub3QoLmZvbyknLCAnOm5vdCguZm9vKScsICcuYmFyJykiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfcmVwbGFjZV9jaGVja3NfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNlbGVjdG9yOiAxMiBpcyBub3QgYSB2YWxpZCBzZWxlY3RvcjogaXQgbXVzdCBiZSBhIHN0cmluZyxcbiIgKworICAgICAgImEgbGlzdCBvZiBzdHJpbmdzLCBvciBhIGxpc3Qgb2YgbGlzdHMgb2Ygc3RyaW5ncyBmb3IgYHNlbGVjdG9yLXJlcGxhY2UnIiwKKyAgICAgICJzZWxlY3Rvci1yZXBsYWNlKDEyLCAnLmZvbycsICcuYmFyJykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkb3JpZ2luYWw6IDEyIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yOiBpdCBtdXN0IGJlIGEgc3RyaW5nLFxuIiArCisgICAgICAiYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIGZvciBgc2VsZWN0b3ItcmVwbGFjZSciLAorICAgICAgInNlbGVjdG9yLXJlcGxhY2UoJy5mb28nLCAxMiwgJy5iYXInKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRyZXBsYWNlbWVudDogMTIgaXMgbm90IGEgdmFsaWQgc2VsZWN0b3I6IGl0IG11c3QgYmUgYSBzdHJpbmcsXG4iICsKKyAgICAgICJhIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgZm9yIGBzZWxlY3Rvci1yZXBsYWNlJyIsCisgICAgICAic2VsZWN0b3ItcmVwbGFjZSgnLmZvbycsICcuYmFyJywgMTIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfcmVwbGFjZV9lcnJvcnMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiQ2FuJ3QgZXh0ZW5kIC5iYXIgLmJhejogY2FuJ3QgZXh0ZW5kIG5lc3RlZCBzZWxlY3RvcnMgZm9yICIgKworICAgICAgImBzZWxlY3Rvci1yZXBsYWNlJyIsICJzZWxlY3Rvci1yZXBsYWNlKCcuZm9vJywgJy5iYXIgLmJheicsICcuYmFuZycpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiQ2FuJ3QgZXh0ZW5kID46IGludmFsaWQgc2VsZWN0b3IgZm9yIGBzZWxlY3Rvci1yZXBsYWNlJyIsCisgICAgICAic2VsZWN0b3ItcmVwbGFjZSgnLmZvbycsICc+JywgJy5iYW5nJykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIuYmFuZyA+IGNhbid0IGV4dGVuZDogaW52YWxpZCBzZWxlY3RvciBmb3IgYHNlbGVjdG9yLXJlcGxhY2UnIiwKKyAgICAgICJzZWxlY3Rvci1yZXBsYWNlKCcuZm9vJywgJy5iYXInLCAnLmJhbmcgPicpIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfdW5pZnkKKyAgICBhc3NlcnRfZXF1YWwoIi5mb28iLCBldmFsdWF0ZSgic2VsZWN0b3ItdW5pZnkoJy5mb28nLCAnLmZvbycpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIuZm9vLmJhciIsIGV2YWx1YXRlKCJzZWxlY3Rvci11bmlmeSgnLmZvbycsICcuYmFyJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIi5mb28uYmFyLmJheiIsIGV2YWx1YXRlKCJzZWxlY3Rvci11bmlmeSgnLmZvby5iYXInLCAnLmJhci5iYXonKSIpKQorICAgIGFzc2VydF9lcXVhbCgiLmEgLmIgLmZvby5iYXIsIC5iIC5hIC5mb28uYmFyIiwgZXZhbHVhdGUoInNlbGVjdG9yLXVuaWZ5KCcuYSAuZm9vJywgJy5iIC5iYXInKSIpKQorICAgIGFzc2VydF9lcXVhbCgiLmEgLmZvby5iYXIiLCBldmFsdWF0ZSgic2VsZWN0b3ItdW5pZnkoJy5hIC5mb28nLCAnLmEgLmJhcicpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIiLCBldmFsdWF0ZSgic2VsZWN0b3ItdW5pZnkoJ3AnLCAnYScpIikpCisgICAgYXNzZXJ0X2VxdWFsKCIiLCBldmFsdWF0ZSgic2VsZWN0b3ItdW5pZnkoJy5mb28gPicsICcuYmFyJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoIiIsIGV2YWx1YXRlKCJzZWxlY3Rvci11bmlmeSgnLmZvbycsICcuYmFyID4nKSIpKQorICAgIGFzc2VydF9lcXVhbCgiLmZvby5iYXosIC5mb28uYmFuZywgLmJhci5iYXosIC5iYXIuYmFuZyIsCisgICAgICBldmFsdWF0ZSgic2VsZWN0b3ItdW5pZnkoJy5mb28sIC5iYXInLCAnLmJheiwgLmJhbmcnKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl91bmlmeV9jaGVja3NfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNlbGVjdG9yMTogMTIgaXMgbm90IGEgdmFsaWQgc2VsZWN0b3I6IGl0IG11c3QgYmUgYSBzdHJpbmcsXG4iICsKKyAgICAgICJhIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgZm9yIGBzZWxlY3Rvci11bmlmeSciLAorICAgICAgInNlbGVjdG9yLXVuaWZ5KDEyLCAnLmZvbycpIikKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNlbGVjdG9yMjogMTIgaXMgbm90IGEgdmFsaWQgc2VsZWN0b3I6IGl0IG11c3QgYmUgYSBzdHJpbmcsXG4iICsKKyAgICAgICJhIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgZm9yIGBzZWxlY3Rvci11bmlmeSciLAorICAgICAgInNlbGVjdG9yLXVuaWZ5KCcuZm9vJywgMTIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2ltcGxlX3NlbGVjdG9ycworICAgIGFzc2VydF9lcXVhbCgnKC5mb28sKScsIGV2YWx1YXRlKCJpbnNwZWN0KHNpbXBsZS1zZWxlY3RvcnMoJy5mb28nKSkiKSkKKyAgICBhc3NlcnRfZXF1YWwoJy5mb28sIC5iYXInLCBldmFsdWF0ZSgiaW5zcGVjdChzaW1wbGUtc2VsZWN0b3JzKCcuZm9vLmJhcicpKSIpKQorICAgIGFzc2VydF9lcXVhbCgnLmZvbywgLmJhciwgOnBzZXVkbygiZmxpcCwgZmxhcCIpJywKKyAgICAgIGV2YWx1YXRlKCJpbnNwZWN0KHNpbXBsZS1zZWxlY3RvcnMoJy5mb28uYmFyOnBzZXVkbyhcImZsaXAsIGZsYXBcIiknKSkiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2ltcGxlX3NlbGVjdG9yc19jaGVja3NfdHlwZXMKKyAgICBhc3NlcnRfZXJyb3JfbWVzc2FnZSgiJHNlbGVjdG9yOiAxMiBpcyBub3QgYSBzdHJpbmcgZm9yIGBzaW1wbGUtc2VsZWN0b3JzJyIsCisgICAgICAic2ltcGxlLXNlbGVjdG9ycygxMikiKQorICBlbmQKKworICBkZWYgdGVzdF9zaW1wbGVfc2VsZWN0b3JzX2Vycm9ycworICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VsZWN0b3I6IFwiLmZvbyAuYmFyXCIgaXMgbm90IGEgY29tcG91bmQgc2VsZWN0b3IgZm9yIGBzaW1wbGUtc2VsZWN0b3JzJyIsCisgICAgICAic2ltcGxlLXNlbGVjdG9ycygnLmZvbyAuYmFyJykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VsZWN0b3I6IFwiLmZvbywuYmFyXCIgaXMgbm90IGEgY29tcG91bmQgc2VsZWN0b3IgZm9yIGBzaW1wbGUtc2VsZWN0b3JzJyIsCisgICAgICAic2ltcGxlLXNlbGVjdG9ycygnLmZvbywuYmFyJykiKQorICAgIGFzc2VydF9lcnJvcl9tZXNzYWdlKCIkc2VsZWN0b3I6IFwiLiNcIiBpcyBub3QgYSB2YWxpZCBzZWxlY3RvcjogSW52YWxpZCBDU1MgYWZ0ZXIgXCIuXCI6ICIgKworICAgICAgImV4cGVjdGVkIGNsYXNzIG5hbWUsIHdhcyBcIiNcIiBmb3IgYHNpbXBsZS1zZWxlY3RvcnMnIiwgInNpbXBsZS1zZWxlY3RvcnMoJy4jJykiKQorICBlbmQKKworICBkZWYgdGVzdF9pc19zdXBlcnNlbGVjdG9yCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoImlzLXN1cGVyc2VsZWN0b3IoJy5mb28nLCAnLmZvby5iYXInKSIpKQorICAgIGFzc2VydF9lcXVhbCgiZmFsc2UiLCBldmFsdWF0ZSgiaXMtc3VwZXJzZWxlY3RvcignLmZvby5iYXInLCAnLmZvbycpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoImlzLXN1cGVyc2VsZWN0b3IoJy5mb28nLCAnLmZvbycpIikpCisgICAgYXNzZXJ0X2VxdWFsKCJ0cnVlIiwgZXZhbHVhdGUoImlzLXN1cGVyc2VsZWN0b3IoJy5iYXInLCAnLmZvbyAuYmFyJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoImZhbHNlIiwgZXZhbHVhdGUoImlzLXN1cGVyc2VsZWN0b3IoJy5mb28gLmJhcicsICcuYmFyJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoInRydWUiLCBldmFsdWF0ZSgiaXMtc3VwZXJzZWxlY3RvcignLmZvbyAuYmFyJywgJy5mb28gPiAuYmFyJykiKSkKKyAgICBhc3NlcnRfZXF1YWwoImZhbHNlIiwgZXZhbHVhdGUoImlzLXN1cGVyc2VsZWN0b3IoJy5mb28gPiAuYmFyJywgJy5mb28gLmJhcicpIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2lzX3N1cGVyc2VsZWN0b3JfY2hlY2tzX3R5cGVzCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzdXBlcjogMTIgaXMgbm90IGEgdmFsaWQgc2VsZWN0b3I6IGl0IG11c3QgYmUgYSBzdHJpbmcsXG4iICsKKyAgICAgICJhIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MgZm9yIGBpcy1zdXBlcnNlbGVjdG9yJyIsCisgICAgICAiaXMtc3VwZXJzZWxlY3RvcigxMiwgJy5mb28nKSIpCisgICAgYXNzZXJ0X2Vycm9yX21lc3NhZ2UoIiRzdWI6IDEyIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yOiBpdCBtdXN0IGJlIGEgc3RyaW5nLFxuIiArCisgICAgICAiYSBsaXN0IG9mIHN0cmluZ3MsIG9yIGEgbGlzdCBvZiBsaXN0cyBvZiBzdHJpbmdzIGZvciBgaXMtc3VwZXJzZWxlY3RvciciLAorICAgICAgImlzLXN1cGVyc2VsZWN0b3IoJy5mb28nLCAxMikiKQorICBlbmQKKworICAjIyBSZWdyZXNzaW9uIFRlc3RzCisKKyAgZGVmIHRlc3RfaW5zcGVjdF9uZXN0ZWRfZW1wdHlfbGlzdHMKKyAgICBhc3NlcnRfZXF1YWwgIigpICgpIiwgZXZhbHVhdGUoImluc3BlY3QoKCkgKCkpIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2F0dXJhdGlvbl9ib3VuZHMKKyAgICBhc3NlcnRfZXF1YWwgIiNmYmZkZmYiLCBldmFsdWF0ZSgiaHNsKGh1ZSgjZmJmZGZmKSwgc2F0dXJhdGlvbigjZmJmZGZmKSwgbGlnaHRuZXNzKCNmYmZkZmYpKSIpCisgIGVuZAorCisgIHByaXZhdGUKKyAgZGVmIGVudihoYXNoID0ge30sIHBhcmVudCA9IG5pbCkKKyAgICBlbnYgPSBTYXNzOjpFbnZpcm9ubWVudC5uZXcocGFyZW50KQorICAgIGhhc2guZWFjaCB7fGssIHZ8IGVudi5zZXRfdmFyKGssIHYpfQorICAgIGVudgorICBlbmQKKworICBkZWYgZXZhbHVhdGUodmFsdWUsIGVudmlyb25tZW50ID0gZW52KQorICAgIHJlc3VsdCA9IHBlcmZvcm0odmFsdWUsIGVudmlyb25tZW50KQorICAgIGFzc2VydF9raW5kX29mIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2UsIHJlc3VsdAorICAgIHJldHVybiByZXN1bHQudG9fcworICBlbmQKKworICBkZWYgcGVyZm9ybSh2YWx1ZSwgZW52aXJvbm1lbnQgPSBlbnYpCisgICAgU2Fzczo6U2NyaXB0OjpQYXJzZXIucGFyc2UodmFsdWUsIDEsIDAsIHs6ZmlsZW5hbWUgPT4gIiN7dGVzdF9uYW1lfV9pbmxpbmUuc2NzcyJ9KS5wZXJmb3JtKGVudmlyb25tZW50KQorICBlbmQKKworICBkZWYgcmVuZGVyKHNhc3MsIG9wdGlvbnMgPSB7fSkKKyAgICBvcHRpb25zWzpzeW50YXhdIHx8PSA6c2NzcworICAgIG11bmdlX2ZpbGVuYW1lIG9wdGlvbnMKKyAgICBvcHRpb25zWzppbXBvcnRlcl0gfHw9IE1vY2tJbXBvcnRlci5uZXcKKyAgICBTYXNzOjpFbmdpbmUubmV3KHNhc3MsIG9wdGlvbnMpLnJlbmRlcgorICBlbmQKKworICBkZWYgYXNzZXJ0X2Vycm9yX21lc3NhZ2UobWVzc2FnZSwgdmFsdWUpCisgICAgZXZhbHVhdGUodmFsdWUpCisgICAgZmx1bmsoIkVycm9yIG1lc3NhZ2UgZXhwZWN0ZWQgYnV0IG5vdCByYWlzZWQ6ICN7bWVzc2FnZX0iKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbChtZXNzYWdlLCBlLm1lc3NhZ2UpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9pbXBvcnRlcl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvaW1wb3J0ZXJfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDM4ZjhmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvaW1wb3J0ZXJfdGVzdC5yYgpAQCAtMCwwICsxLDQyMCBAQAorcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvdGVzdF9oZWxwZXInCityZXF1aXJlICdtb2NrX2ltcG9ydGVyJworcmVxdWlyZSAnc2Fzcy9wbHVnaW4nCisKK2NsYXNzIEltcG9ydGVyVGVzdCA8IE1pbmlUZXN0OjpUZXN0CisKKyAgY2xhc3MgRnJ1aXRJbXBvcnRlciA8IFNhc3M6OkltcG9ydGVyczo6QmFzZQorICAgIGRlZiBmaW5kKG5hbWUsIGNvbnRleHQgPSBuaWwpCisgICAgICBmcnVpdCA9IHBhcnNlKG5hbWUpCisgICAgICByZXR1cm4gdW5sZXNzIGZydWl0CisgICAgICBjb2xvciA9IGNhc2UgZnJ1aXQKKyAgICAgIHdoZW4gImFwcGxlIgorICAgICAgICAicmVkIgorICAgICAgd2hlbiAib3JhbmdlIgorICAgICAgICAib3JhbmdlIgorICAgICAgZWxzZQorICAgICAgICAiYmx1ZSIKKyAgICAgIGVuZAorICAgICAgY29udGVudHMgPSAlUXsKKyAgICAgICAgJCN7ZnJ1aXR9LWNvbG9yOiAje2NvbG9yfSAhZGVmYXVsdDsKKyAgICAgICAgQG1peGluICN7ZnJ1aXR9IHsKKyAgICAgICAgICBjb2xvcjogJCN7ZnJ1aXR9LWNvbG9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBTYXNzOjpFbmdpbmUubmV3KGNvbnRlbnRzLCA6ZmlsZW5hbWUgPT4gbmFtZSwgOnN5bnRheCA9PiA6c2NzcywgOmltcG9ydGVyID0+IHNlbGYpCisgICAgZW5kCisKKyAgICBkZWYga2V5KG5hbWUsIGNvbnRleHQpCisgICAgICBbc2VsZi5jbGFzcy5uYW1lLCBuYW1lXQorICAgIGVuZAorCisgICAgZGVmIHB1YmxpY191cmwobmFtZSwgc291cmNlbWFwX2RpcmVjdG9yeSA9IG5pbCkKKyAgICAgICJodHRwOi8vI3twYXJzZShuYW1lKX0uZXhhbXBsZS5jb20vc3R5bGUuc2NzcyIKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBwYXJzZShuYW1lKQorICAgICAgbmFtZVslcntmcnVpdHMvKFx3KykoXC5zW2FjXXNzKT99LCAxXQorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBOb1B1YmxpY1VybEltcG9ydGVyIDwgRnJ1aXRJbXBvcnRlcgorICAgIGRlZiBwdWJsaWNfdXJsKG5hbWUsIHNvdXJjZW1hcF9kaXJlY3RvcnkgPSBuaWwpCisgICAgICBuaWwKKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGRlZiBwYXJzZShuYW1lKQorICAgICAgbmFtZVslcntlcGhlbWVyYWwvKFx3KykoXC5zW2FjXXNzKT99LCAxXQorICAgIGVuZAorICBlbmQKKworICAjIFRoaXMgY2xhc3MgcHJvdmVzIHRoYXQgeW91IGNhbiBvdmVycmlkZSB0aGUgZXh0ZW5zaW9uIHNjaGVtZSBmb3IgaW1wb3J0ZXJzCisgIGNsYXNzIFJldmVyc2VkRXh0SW1wb3J0ZXIgPCBTYXNzOjpJbXBvcnRlcnM6OkZpbGVzeXN0ZW0KKyAgICBkZWYgZXh0ZW5zaW9ucworICAgICAgeyJzc2NzIiA9PiA6c2NzcywgInNzYXMiID0+IDpzYXNzfQorICAgIGVuZAorICBlbmQKKworICAjIFRoaXMgaW1wb3J0ZXIgbWFwcyBvbmUgaW1wb3J0IHRvIGFub3RoZXIgaW1wb3J0CisgICMgYmFzZWQgb24gdGhlIG1hcHBpbmdzIHBhc3NlZCB0byBpbXBvcnRlcidzIGNvbnN0cnVjdG9yLgorICBjbGFzcyBJbmRpcmVjdEltcG9ydGVyIDwgU2Fzczo6SW1wb3J0ZXJzOjpCYXNlCisgICAgZGVmIGluaXRpYWxpemUobWFwcGluZ3MsIG10aW1lcykKKyAgICAgIEBtYXBwaW5ncyA9IG1hcHBpbmdzCisgICAgICBAbXRpbWVzID0gbXRpbWVzCisgICAgZW5kCisgICAgZGVmIGZpbmRfcmVsYXRpdmUodXJpLCBiYXNlLCBvcHRpb25zKQorICAgICAgbmlsCisgICAgZW5kCisgICAgZGVmIGZpbmQobmFtZSwgb3B0aW9ucykKKyAgICAgIGlmIEBtYXBwaW5ncy5oYXNfa2V5PyhuYW1lKQorICAgICAgICBTYXNzOjpFbmdpbmUubmV3KAorICAgICAgICAgICVRW0BpbXBvcnQgIiN7QG1hcHBpbmdzW25hbWVdfSI7XSwKKyAgICAgICAgICBvcHRpb25zLm1lcmdlKAorICAgICAgICAgICAgOmZpbGVuYW1lID0+IG5hbWUsCisgICAgICAgICAgICA6c3ludGF4ID0+IDpzY3NzLAorICAgICAgICAgICAgOmltcG9ydGVyID0+IHNlbGYKKyAgICAgICAgICApCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGRlZiBtdGltZSh1cmksIG9wdGlvbnMpCisgICAgICBAbXRpbWVzLmZldGNoKHVyaSwgQG10aW1lcy5oYXNfa2V5Pyh1cmkpID8gVGltZS5ub3cgOiBuaWwpCisgICAgZW5kCisgICAgZGVmIGtleSh1cmksIG9wdGlvbnMpCisgICAgICBbc2VsZi5jbGFzcy5uYW1lLCB1cmldCisgICAgZW5kCisgICAgZGVmIHRvX3MKKyAgICAgICJJbmRpcmVjdEltcG9ydGVyKCN7QG1hcHBpbmdzLmtleXMuam9pbigiLCAiKX0pIgorICAgIGVuZAorICBlbmQKKworICAjIFRoaXMgaW1wb3J0ZXIgbWFwcyB0aGUgaW1wb3J0IHRvIHNpbmdsZSBjbGFzcworICAjIGJhc2VkIG9uIHRoZSBtYXBwaW5ncyBwYXNzZWQgdG8gaW1wb3J0ZXIncyBjb25zdHJ1Y3Rvci4KKyAgY2xhc3MgQ2xhc3NJbXBvcnRlciA8IFNhc3M6OkltcG9ydGVyczo6QmFzZQorICAgIGRlZiBpbml0aWFsaXplKG1hcHBpbmdzLCBtdGltZXMpCisgICAgICBAbWFwcGluZ3MgPSBtYXBwaW5ncworICAgICAgQG10aW1lcyA9IG10aW1lcworICAgIGVuZAorICAgIGRlZiBmaW5kX3JlbGF0aXZlKHVyaSwgYmFzZSwgb3B0aW9ucykKKyAgICAgIG5pbAorICAgIGVuZAorICAgIGRlZiBmaW5kKG5hbWUsIG9wdGlvbnMpCisgICAgICBpZiBAbWFwcGluZ3MuaGFzX2tleT8obmFtZSkKKyAgICAgICAgU2Fzczo6RW5naW5lLm5ldygKKyAgICAgICAgICAlUVsuI3tuYW1lfXsje0BtYXBwaW5nc1tuYW1lXX19XSwKKyAgICAgICAgICBvcHRpb25zLm1lcmdlKAorICAgICAgICAgICAgOmZpbGVuYW1lID0+IG5hbWUsCisgICAgICAgICAgICA6c3ludGF4ID0+IDpzY3NzLAorICAgICAgICAgICAgOmltcG9ydGVyID0+IHNlbGYKKyAgICAgICAgICApCisgICAgICAgICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGRlZiBtdGltZSh1cmksIG9wdGlvbnMpCisgICAgICBAbXRpbWVzLmZldGNoKHVyaSwgQG10aW1lcy5oYXNfa2V5Pyh1cmkpID8gVGltZS5ub3cgOiBuaWwpCisgICAgZW5kCisgICAgZGVmIGtleSh1cmksIG9wdGlvbnMpCisgICAgICBbc2VsZi5jbGFzcy5uYW1lLCB1cmldCisgICAgZW5kCisgICAgZGVmIHRvX3MKKyAgICAgICJDbGFzc0ltcG9ydGVyKCN7QG1hcHBpbmdzLmtleXMuam9pbigiLCAiKX0pIgorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9jYW5fcmVzb2x2ZV9nZW5lcmF0ZWRfaW1wb3J0cworICAgIHNjc3NfZmlsZSA9ICVReworICAgICAgJHBlYXItY29sb3I6IGdyZWVuOworICAgICAgQGltcG9ydCAiZnJ1aXRzL2FwcGxlIjsgQGltcG9ydCAiZnJ1aXRzL29yYW5nZSI7IEBpbXBvcnQgImZydWl0cy9wZWFyIjsKKyAgICAgIC5hcHBsZSB7IEBpbmNsdWRlIGFwcGxlOyB9CisgICAgICAub3JhbmdlIHsgQGluY2x1ZGUgb3JhbmdlOyB9CisgICAgICAucGVhciB7IEBpbmNsdWRlIHBlYXI7IH0KKyAgICB9CisgICAgY3NzX2ZpbGUgPSA8PENTUworLmFwcGxlIHsgY29sb3I6IHJlZDsgfQorCisub3JhbmdlIHsgY29sb3I6IG9yYW5nZTsgfQorCisucGVhciB7IGNvbG9yOiBncmVlbjsgfQorQ1NTCisgICAgb3B0aW9ucyA9IHs6c3R5bGUgPT4gOmNvbXBhY3QsIDpsb2FkX3BhdGhzID0+IFtGcnVpdEltcG9ydGVyLm5ld10sIDpzeW50YXggPT4gOnNjc3N9CisgICAgYXNzZXJ0X2VxdWFsIGNzc19maWxlLCBTYXNzOjpFbmdpbmUubmV3KHNjc3NfZmlsZSwgb3B0aW9ucykucmVuZGVyCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuc2lvbl9vdmVycmlkZXMKKyAgICBGaWxlVXRpbHMubWtkaXJfcChhYnNvbHV0aXplKCJ0bXAiKSkKKyAgICBvcGVuKGFic29sdXRpemUoInRtcC9mb28uc3NhcyIpLCAidyIpIHt8ZnwgZi53cml0ZSgiLmZvb1xuICByZXZlcnNlZDogdHJ1ZVxuIil9CisgICAgb3BlbihhYnNvbHV0aXplKCJ0bXAvYmFyLnNzY3MiKSwgInciKSB7fGZ8IGYud3JpdGUoIi5iYXIge3JldmVyc2VkOiB0cnVlfVxuIil9CisgICAgc2Nzc19maWxlID0gJVF7CisgICAgICBAaW1wb3J0ICJmb28iLCAiYmFyIjsKKyAgICAgIEBpbXBvcnQgImZvby5zc2FzIiwgImJhci5zc2NzIjsKKyAgICB9CisgICAgY3NzX2ZpbGUgPSA8PENTUworLmZvbyB7IHJldmVyc2VkOiB0cnVlOyB9CisKKy5iYXIgeyByZXZlcnNlZDogdHJ1ZTsgfQorCisuZm9vIHsgcmV2ZXJzZWQ6IHRydWU7IH0KKworLmJhciB7IHJldmVyc2VkOiB0cnVlOyB9CitDU1MKKyAgICBvcHRpb25zID0gezpzdHlsZSA9PiA6Y29tcGFjdCwgOmxvYWRfcGF0aHMgPT4gW1JldmVyc2VkRXh0SW1wb3J0ZXIubmV3KGFic29sdXRpemUoInRtcCIpKV0sIDpzeW50YXggPT4gOnNjc3N9CisgICAgYXNzZXJ0X2VxdWFsIGNzc19maWxlLCBTYXNzOjpFbmdpbmUubmV3KHNjc3NfZmlsZSwgb3B0aW9ucykucmVuZGVyCisgIGVuc3VyZQorICAgIEZpbGVVdGlscy5ybV9yZihhYnNvbHV0aXplKCJ0bXAiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX2Fjcm9zc19pbXBvcnRlcnMKKyAgICBmaWxlX3N5c3RlbV9pbXBvcnRlciA9IFNhc3M6OkltcG9ydGVyczo6RmlsZXN5c3RlbS5uZXcoZml4dHVyZV9kaXIpCisgICAgIyBNYWtlIHN1cmUgdGhlIGZpcnN0IGltcG9ydCBpcyBvbGRlcgorICAgIGluZGlyZWN0X2ltcG9ydGVyID0gSW5kaXJlY3RJbXBvcnRlci5uZXcoeyJhcHBsZSIgPT4gInBlYXIifSwgeyJhcHBsZSIgPT4gVGltZS5ub3cgLSAxfSkKKyAgICAjIE1ha2UgY3NzIGZpbGUgaXMgbmV3ZXIgc28gdGhlIGRlcGVuZGVuY2llcyBhcmUgdGhlIG9ubHkgd2F5IGZvciB0aGUgY3NzIGZpbGUgdG8gYmUgb3V0IG9mIGRhdGUuCisgICAgRmlsZVV0aWxzLnRvdWNoKGZpeHR1cmVfZmlsZSgidGVzdF9zdGFsZW5lc3NfY2hlY2tfYWNyb3NzX2ltcG9ydGVycy5jc3MiKSkKKyAgICAjIE1ha2Ugc3VyZSB0aGUgZmlyc3QgaW1wb3J0IGlzIG9sZGVyCisgICAgY2xhc3NfaW1wb3J0ZXIgPSBDbGFzc0ltcG9ydGVyLm5ldyh7InBlYXIiID0+ICVRe2NvbG9yOiBncmVlbjt9fSwgeyJwZWFyIiA9PiBUaW1lLm5vdyArIDF9KQorCisgICAgb3B0aW9ucyA9IHsKKyAgICAgIDpzdHlsZSA9PiA6Y29tcGFjdCwKKyAgICAgIDpmaWxlbmFtZSA9PiBmaXh0dXJlX2ZpbGUoInRlc3Rfc3RhbGVuZXNzX2NoZWNrX2Fjcm9zc19pbXBvcnRlcnMuc2NzcyIpLAorICAgICAgOmltcG9ydGVyID0+IGZpbGVfc3lzdGVtX2ltcG9ydGVyLAorICAgICAgOmxvYWRfcGF0aHMgPT4gW2ZpbGVfc3lzdGVtX2ltcG9ydGVyLCBpbmRpcmVjdF9pbXBvcnRlciwgY2xhc3NfaW1wb3J0ZXJdLAorICAgICAgOnN5bnRheCA9PiA6c2NzcworICAgIH0KKworICAgIGFzc2VydF9lcXVhbCBGaWxlLnJlYWQoZml4dHVyZV9maWxlKCJ0ZXN0X3N0YWxlbmVzc19jaGVja19hY3Jvc3NfaW1wb3J0ZXJzLmNzcyIpKSwKKyAgICAgICAgICAgICAgICAgU2Fzczo6RW5naW5lLm5ldyhGaWxlLnJlYWQoZml4dHVyZV9maWxlKCJ0ZXN0X3N0YWxlbmVzc19jaGVja19hY3Jvc3NfaW1wb3J0ZXJzLnNjc3MiKSksIG9wdGlvbnMpLnJlbmRlcgorCisgICAgY2hlY2tlciA9IFNhc3M6OlBsdWdpbjo6U3RhbGVuZXNzQ2hlY2tlci5uZXcob3B0aW9ucykKKworICAgIGFzc2VydCBjaGVja2VyLnN0eWxlc2hlZXRfbmVlZHNfdXBkYXRlPygKKyAgICAgIGZpeHR1cmVfZmlsZSgidGVzdF9zdGFsZW5lc3NfY2hlY2tfYWNyb3NzX2ltcG9ydGVycy5jc3MiKSwKKyAgICAgIGZpeHR1cmVfZmlsZSgidGVzdF9zdGFsZW5lc3NfY2hlY2tfYWNyb3NzX2ltcG9ydGVycy5zY3NzIiksCisgICAgICBmaWxlX3N5c3RlbV9pbXBvcnRlcgorICAgICkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc291cmNlX21hcF93aXRoX29ubHlfY3NzX3VyaV9zdXBwb3J0c19wdWJsaWNfdXJsX2ltcG9ydHMKKyAgICBmcnVpdF9pbXBvcnRlciA9IEZydWl0SW1wb3J0ZXIubmV3CisKKyAgICBvcHRpb25zID0geworICAgICAgOmZpbGVuYW1lID0+ICdmcnVpdHMvb3JhbmdlJywKKyAgICAgIDppbXBvcnRlciA9PiBmcnVpdF9pbXBvcnRlciwKKyAgICAgIDpzeW50YXggPT4gOnNjc3MKKyAgICB9CisKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KDw8U0NTUywgb3B0aW9ucykKKy5vcmNoYXJkIHsKKyAgY29sb3I6IGJsdWU7Cit9CitTQ1NTCisKKyAgICBfLCBzb3VyY2VtYXAgPSBlbmdpbmUucmVuZGVyX3dpdGhfc291cmNlbWFwKCdzb3VyY2VtYXBfdXJpJykKKyAgICBhc3NlcnRfZXF1YWwgPDxKU09OLnN0cmlwLCBzb3VyY2VtYXAudG9fanNvbig6Y3NzX3VyaSA9PiAnY3NzX3VyaScpCit7CisidmVyc2lvbiI6IDMsCisibWFwcGluZ3MiOiAiQUFBQSxRQUFTO0VBQ1AsS0FBSyxFQUFFLElBQUkiLAorInNvdXJjZXMiOiBbImh0dHA6Ly9vcmFuZ2UuZXhhbXBsZS5jb20vc3R5bGUuc2NzcyJdLAorIm5hbWVzIjogW10sCisiZmlsZSI6ICJjc3NfdXJpIgorfQorSlNPTgorICBlbmQKKworICBkZWYgdGVzdF9zb3VyY2VfbWFwX3dpdGhfb25seV9jc3NfdXJpX2Nhbl9oYXZlX25vX3B1YmxpY191cmwKKyAgICBlcGhlbWVyYWxfaW1wb3J0ZXIgPSBOb1B1YmxpY1VybEltcG9ydGVyLm5ldworICAgIG1vY2tfaW1wb3J0ZXIgPSBNb2NrSW1wb3J0ZXIubmV3CisgICAgZGVmIG1vY2tfaW1wb3J0ZXIucHVibGljX3VybChuYW1lLCBzb3VyY2VtYXBfZGlyZWN0b3J5ID0gbmlsKQorICAgICAgInNvdXJjZV91cmkiCisgICAgZW5kCisKKyAgICBvcHRpb25zID0geworICAgICAgOmZpbGVuYW1lID0+IGZpbGVuYW1lX2Zvcl90ZXN0LAorICAgICAgOnNvdXJjZW1hcF9maWxlbmFtZSA9PiBzb3VyY2VtYXBfZmlsZW5hbWVfZm9yX3Rlc3QsCisgICAgICA6aW1wb3J0ZXIgPT4gbW9ja19pbXBvcnRlciwKKyAgICAgIDpzeW50YXggPT4gOnNjc3MsCisgICAgICA6bG9hZF9wYXRocyA9PiBbZXBoZW1lcmFsX2ltcG9ydGVyXSwKKyAgICAgIDpjYWNoZSA9PiBmYWxzZQorICAgIH0KKworICAgIGVuZ2luZSA9IFNhc3M6OkVuZ2luZS5uZXcoPDxTQ1NTLCBvcHRpb25zKQorQGltcG9ydCAiZXBoZW1lcmFsL29yYW5nZSI7Cisub3JhbmdlIHsKKyAgQGluY2x1ZGUgb3JhbmdlOworfQorU0NTUworCisgICAgY3NzX291dHB1dCwgc291cmNlbWFwID0gZW5naW5lLnJlbmRlcl93aXRoX3NvdXJjZW1hcCgnc291cmNlbWFwX3VyaScpCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLnN0cmlwLCBjc3Nfb3V0cHV0LnN0cmlwCisub3JhbmdlIHsKKyAgY29sb3I6IG9yYW5nZTsgfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD1zb3VyY2VtYXBfdXJpICovCitDU1MKKyAgICBtYXAgPSBzb3VyY2VtYXAudG9fanNvbig6Y3NzX3VyaSA9PiAnY3NzX3VyaScpCisgICAgYXNzZXJ0X2VxdWFsIDw8SlNPTi5zdHJpcCwgbWFwCit7CisidmVyc2lvbiI6IDMsCisibWFwcGluZ3MiOiAiQUFDQSxPQUFRIiwKKyJzb3VyY2VzIjogWyJzb3VyY2VfdXJpIl0sCisibmFtZXMiOiBbXSwKKyJmaWxlIjogImNzc191cmkiCit9CitKU09OCisgIGVuZAorCisgIGRlZiB0ZXN0X3NvdXJjZV9tYXBfd2l0aF9vbmx5X2Nzc191cmlfZmFsbHNfYmFja190b19maWxlX3VyaXMKKyAgICBmaWxlX3N5c3RlbV9pbXBvcnRlciA9IFNhc3M6OkltcG9ydGVyczo6RmlsZXN5c3RlbS5uZXcoJy4nKQorICAgIG9wdGlvbnMgPSB7CisgICAgICA6ZmlsZW5hbWUgPT4gZmlsZW5hbWVfZm9yX3Rlc3QoOnNjc3MpLAorICAgICAgOnNvdXJjZW1hcF9maWxlbmFtZSA9PiBzb3VyY2VtYXBfZmlsZW5hbWVfZm9yX3Rlc3QsCisgICAgICA6aW1wb3J0ZXIgPT4gZmlsZV9zeXN0ZW1faW1wb3J0ZXIsCisgICAgICA6c3ludGF4ID0+IDpzY3NzCisgICAgfQorCisgICAgZW5naW5lID0gU2Fzczo6RW5naW5lLm5ldyg8PFNDU1MsIG9wdGlvbnMpCisuZm9vIHthOiBifQorU0NTUworCisgICAgXywgc291cmNlbWFwID0gZW5naW5lLnJlbmRlcl93aXRoX3NvdXJjZW1hcCgnaHR0cDovLzEuZXhhbXBsZS5jb20vc3R5bGUubWFwJykKKworICAgIHVyaSA9IFNhc3M6OlV0aWwuZmlsZV91cmlfZnJvbV9wYXRoKEZpbGUuYWJzb2x1dGVfcGF0aChmaWxlbmFtZV9mb3JfdGVzdCg6c2NzcykpKQorICAgIGFzc2VydF9lcXVhbCA8PEpTT04uc3RyaXAsIHNvdXJjZW1hcC50b19qc29uKDpjc3NfdXJpID0+ICdjc3NfdXJpJykKK3sKKyJ2ZXJzaW9uIjogMywKKyJtYXBwaW5ncyI6ICJBQUFBLElBQUs7RUFBQyxDQUFDLEVBQUUsQ0FBQyIsCisic291cmNlcyI6IFsiI3t1cml9Il0sCisibmFtZXMiOiBbXSwKKyJmaWxlIjogImNzc191cmkiCit9CitKU09OCisgIGVuZAorCisgIGRlZiB0ZXN0X3NvdXJjZV9tYXBfd2l0aF9jc3NfdXJpX2FuZF9jc3NfcGF0aF9mYWxsc19iYWNrX3RvX2ZpbGVfdXJpcworICAgIGZpbGVfc3lzdGVtX2ltcG9ydGVyID0gU2Fzczo6SW1wb3J0ZXJzOjpGaWxlc3lzdGVtLm5ldygnLicpCisgICAgb3B0aW9ucyA9IHsKKyAgICAgIDpmaWxlbmFtZSA9PiBmaWxlbmFtZV9mb3JfdGVzdCg6c2NzcyksCisgICAgICA6c291cmNlbWFwX2ZpbGVuYW1lID0+IHNvdXJjZW1hcF9maWxlbmFtZV9mb3JfdGVzdCwKKyAgICAgIDppbXBvcnRlciA9PiBmaWxlX3N5c3RlbV9pbXBvcnRlciwKKyAgICAgIDpzeW50YXggPT4gOnNjc3MKKyAgICB9CisKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KDw8U0NTUywgb3B0aW9ucykKKy5mb28ge2E6IGJ9CitTQ1NTCisKKyAgICBfLCBzb3VyY2VtYXAgPSBlbmdpbmUucmVuZGVyX3dpdGhfc291cmNlbWFwKCdodHRwOi8vMS5leGFtcGxlLmNvbS9zdHlsZS5tYXAnKQorCisgICAgdXJpID0gU2Fzczo6VXRpbC5maWxlX3VyaV9mcm9tX3BhdGgoRmlsZS5hYnNvbHV0ZV9wYXRoKGZpbGVuYW1lX2Zvcl90ZXN0KDpzY3NzKSkpCisgICAgYXNzZXJ0X2VxdWFsIDw8SlNPTi5zdHJpcCwgc291cmNlbWFwLnRvX2pzb24oOmNzc191cmkgPT4gJ2Nzc191cmknLCA6Y3NzX3BhdGggPT4gJ2Nzc19wYXRoJykKK3sKKyJ2ZXJzaW9uIjogMywKKyJtYXBwaW5ncyI6ICJBQUFBLElBQUs7RUFBQyxDQUFDLEVBQUUsQ0FBQyIsCisic291cmNlcyI6IFsiI3t1cml9Il0sCisibmFtZXMiOiBbXSwKKyJmaWxlIjogImNzc191cmkiCit9CitKU09OCisgIGVuZAorCisgIGRlZiB0ZXN0X3NvdXJjZV9tYXBfd2l0aF9jc3NfdXJpX2FuZF9zb3VyY2VtYXBfcGF0aF9zdXBwb3J0c19maWxlc3lzdGVtX2ltcG9ydGVyCisgICAgZmlsZV9zeXN0ZW1faW1wb3J0ZXIgPSBTYXNzOjpJbXBvcnRlcnM6OkZpbGVzeXN0ZW0ubmV3KCcuJykKKyAgICBjc3NfdXJpID0gJ2Nzc191cmknCisgICAgc291cmNlbWFwX3BhdGggPSAnbWFwL3N0eWxlLm1hcCcKKyAgICBvcHRpb25zID0geworICAgICAgOmZpbGVuYW1lID0+ICdzYXNzL3N0eWxlLnNjc3MnLAorICAgICAgOnNvdXJjZW1hcF9maWxlbmFtZSA9PiBzb3VyY2VtYXBfcGF0aCwKKyAgICAgIDppbXBvcnRlciA9PiBmaWxlX3N5c3RlbV9pbXBvcnRlciwKKyAgICAgIDpzeW50YXggPT4gOnNjc3MKKyAgICB9CisKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KDw8U0NTUywgb3B0aW9ucykKKy5mb28ge2E6IGJ9CitTQ1NTCisKKyAgICByZW5kZXJlZCwgc291cmNlbWFwID0gZW5naW5lLnJlbmRlcl93aXRoX3NvdXJjZW1hcCgnaHR0cDovLzEuZXhhbXBsZS5jb20vc3R5bGUubWFwJykKKworCisgICAgcmVuZGVyZWQsIHNvdXJjZW1hcCA9IGVuZ2luZS5yZW5kZXJfd2l0aF9zb3VyY2VtYXAoJ2h0dHA6Ly9tYXAuZXhhbXBsZS5jb20vbWFwL3N0eWxlLm1hcCcpCisgICAgYXNzZXJ0X2VxdWFsIDw8SlNPTi5zdHJpcCwgc291cmNlbWFwLnRvX2pzb24oOmNzc191cmkgPT4gY3NzX3VyaSwgOnNvdXJjZW1hcF9wYXRoID0+IHNvdXJjZW1hcF9wYXRoKQoreworInZlcnNpb24iOiAzLAorIm1hcHBpbmdzIjogIkFBQUEsSUFBSztFQUFDLENBQUMsRUFBRSxDQUFDIiwKKyJzb3VyY2VzIjogWyIuLi9zYXNzL3N0eWxlLnNjc3MiXSwKKyJuYW1lcyI6IFtdLAorImZpbGUiOiAiY3NzX3VyaSIKK30KK0pTT04KKyAgZW5kCisKKyAgZGVmIHRlc3Rfc291cmNlX21hcF93aXRoX2Nzc19wYXRoX2FuZF9zb3VyY2VtYXBfcGF0aF9zdXBwb3J0c19maWxlX3N5c3RlbV9pbXBvcnRlcgorICAgIGZpbGVfc3lzdGVtX2ltcG9ydGVyID0gU2Fzczo6SW1wb3J0ZXJzOjpGaWxlc3lzdGVtLm5ldygnLicpCisgICAgc2Fzc19wYXRoID0gJ3Nhc3Mvc3R5bGUuc2NzcycKKyAgICBjc3NfcGF0aCA9ICdzdGF0aWMvc3R5bGUuY3NzJworICAgIHNvdXJjZW1hcF9wYXRoID0gJ21hcC9zdHlsZS5tYXAnCisgICAgb3B0aW9ucyA9IHsKKyAgICAgIDpmaWxlbmFtZSA9PiBzYXNzX3BhdGgsCisgICAgICA6c291cmNlbWFwX2ZpbGVuYW1lID0+IHNvdXJjZW1hcF9wYXRoLAorICAgICAgOmltcG9ydGVyID0+IGZpbGVfc3lzdGVtX2ltcG9ydGVyLAorICAgICAgOnN5bnRheCA9PiA6c2NzcworICAgIH0KKworICAgIGVuZ2luZSA9IFNhc3M6OkVuZ2luZS5uZXcoPDxTQ1NTLCBvcHRpb25zKQorLmZvbyB7YTogYn0KK1NDU1MKKworICAgIF8sIHNvdXJjZW1hcCA9IGVuZ2luZS5yZW5kZXJfd2l0aF9zb3VyY2VtYXAoJ2h0dHA6Ly9tYXAuZXhhbXBsZS5jb20vbWFwL3N0eWxlLm1hcCcpCisgICAgYXNzZXJ0X2VxdWFsIDw8SlNPTi5zdHJpcCwgc291cmNlbWFwLnRvX2pzb24oOmNzc19wYXRoID0+IGNzc19wYXRoLCA6c291cmNlbWFwX3BhdGggPT4gc291cmNlbWFwX3BhdGgpCit7CisidmVyc2lvbiI6IDMsCisibWFwcGluZ3MiOiAiQUFBQSxJQUFLO0VBQUMsQ0FBQyxFQUFFLENBQUMiLAorInNvdXJjZXMiOiBbIi4uL3Nhc3Mvc3R5bGUuc2NzcyJdLAorIm5hbWVzIjogW10sCisiZmlsZSI6ICIuLi9zdGF0aWMvc3R5bGUuY3NzIgorfQorSlNPTgorICBlbmQKKworICBkZWYgdGVzdF9yZW5kZXJfd2l0aF9zb3VyY2VtYXBfcmVxdWlyZXNfZmlsZW5hbWUKKyAgICBmaWxlX3N5c3RlbV9pbXBvcnRlciA9IFNhc3M6OkltcG9ydGVyczo6RmlsZXN5c3RlbS5uZXcoJy4nKQorICAgIGVuZ2luZSA9IFNhc3M6OkVuZ2luZS5uZXcoIi5mb28ge2E6IGJ9IiwgOnN5bnRheCA9PiA6c2NzcywgOmltcG9ydGVyID0+IGZpbGVfc3lzdGVtX2ltcG9ydGVyKQorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCA8PE1FU1NBR0UpIHtlbmdpbmUucmVuZGVyX3dpdGhfc291cmNlbWFwKCdzb3VyY2VtYXBfdXJsJyl9CitFcnJvciBnZW5lcmF0aW5nIHNvdXJjZSBtYXA6IGNvdWxkbid0IGRldGVybWluZSBwdWJsaWMgVVJMIGZvciB0aGUgc291cmNlIHN0eWxlc2hlZXQuCisgIE5vIGZpbGVuYW1lIGlzIGF2YWlsYWJsZSBzbyB0aGVyZSdzIG5vdGhpbmcgZm9yIHRoZSBzb3VyY2UgbWFwIHRvIGxpbmsgdG8uCitNRVNTQUdFCisgIGVuZAorCisgIGRlZiB0ZXN0X3JlbmRlcl93aXRoX3NvdXJjZW1hcF9yZXF1aXJlc19pbXBvcnRlcl93aXRoX3B1YmxpY191cmwKKyAgICBjbGFzc19pbXBvcnRlciA9IENsYXNzSW1wb3J0ZXIubmV3KHsicGVhciIgPT4gImNvbG9yOiBncmVlbjsifSwgeyJwZWFyIiA9PiBUaW1lLm5vd30pCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRSkge2NsYXNzX2ltcG9ydGVyLmZpbmQoInBlYXIiLCB7fSkucmVuZGVyX3dpdGhfc291cmNlbWFwKCdzb3VyY2VtYXBfdXJsJyl9CitFcnJvciBnZW5lcmF0aW5nIHNvdXJjZSBtYXA6IGNvdWxkbid0IGRldGVybWluZSBwdWJsaWMgVVJMIGZvciAicGVhciIuCisgIFdpdGhvdXQgYSBwdWJsaWMgVVJMLCB0aGVyZSdzIG5vdGhpbmcgZm9yIHRoZSBzb3VyY2UgbWFwIHRvIGxpbmsgdG8uCisgIEN1c3RvbSBpbXBvcnRlcnMgc2hvdWxkIGRlZmluZSB0aGUgI3B1YmxpY191cmwgbWV0aG9kLgorTUVTU0FHRQorICBlbmQKKworICBkZWYgZml4dHVyZV9kaXIKKyAgICBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgImZpeHR1cmVzIikKKyAgZW5kCisKKyAgZGVmIGZpeHR1cmVfZmlsZShwYXRoKQorICAgIEZpbGUuam9pbihmaXh0dXJlX2RpciwgcGF0aCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmlsZXN5c3RlbV9pbXBvcnRlcl9lcWwKKyAgICBpbXBvcnRlciA9IFNhc3M6OkltcG9ydGVyczo6RmlsZXN5c3RlbS5uZXcoJy4nKQorICAgIGFzc2VydCBpbXBvcnRlci5lcWw/KFNhc3M6OkltcG9ydGVyczo6RmlsZXN5c3RlbS5uZXcoJy4nKSkKKyAgICBhc3NlcnQgaW1wb3J0ZXIuZXFsPyhSZXZlcnNlZEV4dEltcG9ydGVyLm5ldygnLicpKQorICAgIGFzc2VydCAhaW1wb3J0ZXIuZXFsPyhTYXNzOjpJbXBvcnRlcnM6OkZpbGVzeXN0ZW0ubmV3KCdmb28nKSkKKyAgICBhc3NlcnQgIWltcG9ydGVyLmVxbD8obmlsKQorICAgIGFzc2VydCAhaW1wb3J0ZXIuZXFsPygnZm9vJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfYWJzb2x1dGVfZmlsZXNfYWNyb3NzX3RlbXBsYXRlX2xvY2F0aW9ucworICAgIGltcG9ydGVyID0gU2Fzczo6SW1wb3J0ZXJzOjpGaWxlc3lzdGVtLm5ldyhhYnNvbHV0aXplICd0ZW1wbGF0ZXMnKQorICAgIHJlZnV0ZV9uaWwgaW1wb3J0ZXIubXRpbWUoYWJzb2x1dGl6ZSgnbW9yZV90ZW1wbGF0ZXMvbW9yZTEuc2FzcycpLCB7fSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2xvZ2dlcl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbG9nZ2VyX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGQzMjY4MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL2xvZ2dlcl90ZXN0LnJiCkBAIC0wLDAgKzEsNTcgQEAKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vdGVzdF9oZWxwZXInCityZXF1aXJlICdwYXRobmFtZScKKworY2xhc3MgTG9nZ2VyVGVzdCA8IE1pbmlUZXN0OjpUZXN0CisKKyAgY2xhc3MgSW50ZXJjZXB0ZWRMb2dnZXIgPCBTYXNzOjpMb2dnZXI6OkJhc2UKKworICAgIGF0dHJfYWNjZXNzb3IgOm1lc3NhZ2VzCisKKyAgICBkZWYgaW5pdGlhbGl6ZSgqYXJncykKKyAgICAgIHN1cGVyCisgICAgICBzZWxmLm1lc3NhZ2VzID0gW10KKyAgICBlbmQKKworICAgIGRlZiByZXNldCEKKyAgICAgIHNlbGYubWVzc2FnZXMgPSBbXQorICAgIGVuZAorCisgICAgZGVmIF9sb2coKmFyZ3MpCisgICAgICBtZXNzYWdlcyA8PCBbYXJnc10KKyAgICBlbmQKKworICBlbmQKKworICBkZWYgdGVzdF9nbG9iYWxfc2Fzc19sb2dnZXJfaW5zdGFuY2VfZXhpc3RzCisgICAgYXNzZXJ0IFNhc3MubG9nZ2VyLnJlc3BvbmRfdG8/KDp3YXJuKQorICBlbmQKKworICBkZWYgdGVzdF9sb2dfbGV2ZWxfb3JkZXJzCisgICAgbG9nZ2VkX2xldmVscyA9IHsKKyAgICAgIDp0cmFjZSA9PiBbIFtdLCBbOnRyYWNlLCA6ZGVidWcsIDppbmZvLCA6d2FybiwgOmVycm9yXV0sCisgICAgICA6ZGVidWcgPT4gWyBbOnRyYWNlXSwgICBbOmRlYnVnLCA6aW5mbywgOndhcm4sIDplcnJvcl1dLAorICAgICAgOmluZm8gID0+IFsgWzp0cmFjZSwgOmRlYnVnXSwgICBbOmluZm8sIDp3YXJuLCA6ZXJyb3JdXSwKKyAgICAgIDp3YXJuICA9PiBbIFs6dHJhY2UsIDpkZWJ1ZywgOmluZm9dLCAgIFs6d2FybiwgOmVycm9yXV0sCisgICAgICA6ZXJyb3IgPT4gWyBbOnRyYWNlLCA6ZGVidWcsIDppbmZvLCA6d2Fybl0sICAgWzplcnJvcl1dCisgICAgfQorICAgIGxvZ2dlZF9sZXZlbHMuZWFjaCBkbyB8bGV2ZWwsIChzaG91bGRfbm90X2JlX2xvZ2dlZCwgc2hvdWxkX2JlX2xvZ2dlZCl8CisgICAgICBsb2dnZXIgPSBTYXNzOjpMb2dnZXI6OkJhc2UubmV3KGxldmVsKQorICAgICAgc2hvdWxkX25vdF9iZV9sb2dnZWQuZWFjaCBkbyB8c2hvdWxkX2xldmVsfAorICAgICAgICBhc3NlcnQgIWxvZ2dlci5sb2dnaW5nX2xldmVsPyhzaG91bGRfbGV2ZWwpCisgICAgICBlbmQKKyAgICAgIHNob3VsZF9iZV9sb2dnZWQuZWFjaCBkbyB8c2hvdWxkX2xldmVsfAorICAgICAgICBhc3NlcnQgbG9nZ2VyLmxvZ2dpbmdfbGV2ZWw/KHNob3VsZF9sZXZlbCkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9sb2dnaW5nX2Nhbl9iZV9kaXNhYmxlZAorICAgIGxvZ2dlciA9IEludGVyY2VwdGVkTG9nZ2VyLm5ldworICAgIGxvZ2dlci5lcnJvcigibWVzc2FnZSAjMSIpCisgICAgYXNzZXJ0X2VxdWFsIDEsIGxvZ2dlci5tZXNzYWdlcy5zaXplCisgICAgbG9nZ2VyLnJlc2V0IQorICAgIGxvZ2dlci5kaXNhYmxlZCA9IHRydWUKKyAgICBsb2dnZXIuZXJyb3IoIm1lc3NhZ2UgIzIiKQorICAgIGFzc2VydF9lcXVhbCAwLCBsb2dnZXIubWVzc2FnZXMuc2l6ZQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbW9ja19pbXBvcnRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vY2tfaW1wb3J0ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyNDc2ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vY2tfaW1wb3J0ZXIucmIKQEAgLTAsMCArMSw0OSBAQAorY2xhc3MgTW9ja0ltcG9ydGVyIDwgU2Fzczo6SW1wb3J0ZXJzOjpCYXNlCisgIGRlZiBpbml0aWFsaXplKG5hbWUgPSAibW9jayIpCisgICAgQG5hbWUgPSBuYW1lCisgICAgQGltcG9ydHMgPSBIYXNoLm5ldyh7fSkKKyAgZW5kCisKKyAgZGVmIGZpbmRfcmVsYXRpdmUodXJpLCBiYXNlLCBvcHRpb25zKQorICAgIG5pbAorICBlbmQKKworICBkZWYgZmluZCh1cmksIG9wdGlvbnMpCisgICAgY29udGVudHMgPSBAaW1wb3J0c1t1cmldWzpjb250ZW50c10KKyAgICByZXR1cm4gdW5sZXNzIGNvbnRlbnRzCisgICAgb3B0aW9uc1s6c3ludGF4XSA9IEBpbXBvcnRzW3VyaV1bOnN5bnRheF0KKyAgICBvcHRpb25zWzpmaWxlbmFtZV0gPSB1cmkKKyAgICBvcHRpb25zWzppbXBvcnRlcl0gPSBzZWxmCisgICAgQGltcG9ydHNbdXJpXVs6ZW5naW5lXSA9IFNhc3M6OkVuZ2luZS5uZXcoY29udGVudHMsIG9wdGlvbnMpCisgIGVuZAorCisgIGRlZiBtdGltZSh1cmksIG9wdGlvbnMpCisgICAgQGltcG9ydHNbdXJpXVs6bXRpbWVdCisgIGVuZAorCisgIGRlZiBrZXkodXJpLCBvcHRpb25zKQorICAgIFsibW9jayIsIHVyaV0KKyAgZW5kCisKKyAgZGVmIHRvX3MKKyAgICBAbmFtZQorICBlbmQKKworICAjIE1ldGhvZHMgZm9yIHRlc3RpbmcKKworICBkZWYgYWRkX2ltcG9ydCh1cmksIGNvbnRlbnRzLCBzeW50YXggPSA6c2NzcywgbXRpbWUgPSBUaW1lLm5vdyAtIDEwKQorICAgIEBpbXBvcnRzW3VyaV0gPSB7CisgICAgICA6Y29udGVudHMgPT4gY29udGVudHMsCisgICAgICA6bXRpbWUgPT4gbXRpbWUsCisgICAgICA6c3ludGF4ID0+IHN5bnRheAorICAgIH0KKyAgZW5kCisKKyAgZGVmIHRvdWNoKHVyaSkKKyAgICBAaW1wb3J0c1t1cmldWzptdGltZV0gPSBUaW1lLm5vdworICBlbmQKKworICBkZWYgZW5naW5lKHVyaSkKKyAgICBAaW1wb3J0c1t1cmldWzplbmdpbmVdCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9tb3JlX3Jlc3VsdHMvbW9yZTEuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbW9yZV9yZXN1bHRzL21vcmUxLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQxMTgyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbW9yZV9yZXN1bHRzL21vcmUxLmNzcwpAQCAtMCwwICsxLDkgQEAKK2JvZHkgeyBmb250OiBBcmlhbDsgYmFja2dyb3VuZDogYmx1ZTsgfQorCisjcGFnZSB7IHdpZHRoOiA3MDBweDsgaGVpZ2h0OiAxMDA7IH0KKyNwYWdlICNoZWFkZXIgeyBoZWlnaHQ6IDMwMHB4OyB9CisjcGFnZSAjaGVhZGVyIGgxIHsgZm9udC1zaXplOiA1MHB4OyBjb2xvcjogYmx1ZTsgfQorCisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5sZWZ0IHsgd2lkdGg6IDEwMHB4OyB9CisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5yaWdodCB7IHdpZHRoOiA2MDBweDsgfQorI2NvbnRlbnQudXNlci5zaG93ICNjb250YWluZXIuYm90dG9tIHsgYmFja2dyb3VuZDogYnJvd247IH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vcmVfcmVzdWx0cy9tb3JlMV93aXRoX2xpbmVfY29tbWVudHMuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbW9yZV9yZXN1bHRzL21vcmUxX3dpdGhfbGluZV9jb21tZW50cy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxZGJjYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vcmVfcmVzdWx0cy9tb3JlMV93aXRoX2xpbmVfY29tbWVudHMuY3NzCkBAIC0wLDAgKzEsMjYgQEAKKy8qIGxpbmUgMywgLi4vbW9yZV90ZW1wbGF0ZXMvbW9yZTEuc2FzcyAqLworYm9keSB7CisgIGZvbnQ6IEFyaWFsOworICBiYWNrZ3JvdW5kOiBibHVlOyB9CisKKy8qIGxpbmUgNywgLi4vbW9yZV90ZW1wbGF0ZXMvbW9yZTEuc2FzcyAqLworI3BhZ2UgeworICB3aWR0aDogNzAwcHg7CisgIGhlaWdodDogMTAwOyB9CisgIC8qIGxpbmUgMTAsIC4uL21vcmVfdGVtcGxhdGVzL21vcmUxLnNhc3MgKi8KKyAgI3BhZ2UgI2hlYWRlciB7CisgICAgaGVpZ2h0OiAzMDBweDsgfQorICAgIC8qIGxpbmUgMTIsIC4uL21vcmVfdGVtcGxhdGVzL21vcmUxLnNhc3MgKi8KKyAgICAjcGFnZSAjaGVhZGVyIGgxIHsKKyAgICAgIGZvbnQtc2l6ZTogNTBweDsKKyAgICAgIGNvbG9yOiBibHVlOyB9CisKKy8qIGxpbmUgMTgsIC4uL21vcmVfdGVtcGxhdGVzL21vcmUxLnNhc3MgKi8KKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLmxlZnQgeworICB3aWR0aDogMTAwcHg7IH0KKy8qIGxpbmUgMjAsIC4uL21vcmVfdGVtcGxhdGVzL21vcmUxLnNhc3MgKi8KKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLnJpZ2h0IHsKKyAgd2lkdGg6IDYwMHB4OyB9CisvKiBsaW5lIDIyLCAuLi9tb3JlX3RlbXBsYXRlcy9tb3JlMS5zYXNzICovCisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci5ib3R0b20geworICBiYWNrZ3JvdW5kOiBicm93bjsgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbW9yZV9yZXN1bHRzL21vcmVfaW1wb3J0LmNzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vcmVfcmVzdWx0cy9tb3JlX2ltcG9ydC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkYWUwOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vcmVfcmVzdWx0cy9tb3JlX2ltcG9ydC5jc3MKQEAgLTAsMCArMSwyOSBAQAorQGltcG9ydCB1cmwoYmFzaWMuY3NzKTsKK0BpbXBvcnQgdXJsKC4uL3Jlc3VsdHMvY29tcGxleC5jc3MpOworaW1wb3J0ZWQgeyBvdGhlcmNvbnN0OiBoZWxsbzsgbXljb25zdDogZ29vZGJ5ZTsgcHJlLW1peGluOiBoZXJlOyB9CisKK2JvZHkgeyBmb250OiBBcmlhbDsgYmFja2dyb3VuZDogYmx1ZTsgfQorCisjcGFnZSB7IHdpZHRoOiA3MDBweDsgaGVpZ2h0OiAxMDA7IH0KKyNwYWdlICNoZWFkZXIgeyBoZWlnaHQ6IDMwMHB4OyB9CisjcGFnZSAjaGVhZGVyIGgxIHsgZm9udC1zaXplOiA1MHB4OyBjb2xvcjogYmx1ZTsgfQorCisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5sZWZ0IHsgd2lkdGg6IDEwMHB4OyB9CisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5yaWdodCB7IHdpZHRoOiA2MDBweDsgfQorI2NvbnRlbnQudXNlci5zaG93ICNjb250YWluZXIuYm90dG9tIHsgYmFja2dyb3VuZDogYnJvd247IH0KKworbWlkcnVsZSB7IGludGhlOiBtaWRkbGU7IH0KKworYm9keSB7IGZvbnQ6IEFyaWFsOyBiYWNrZ3JvdW5kOiBibHVlOyB9CisKKyNwYWdlIHsgd2lkdGg6IDcwMHB4OyBoZWlnaHQ6IDEwMDsgfQorI3BhZ2UgI2hlYWRlciB7IGhlaWdodDogMzAwcHg7IH0KKyNwYWdlICNoZWFkZXIgaDEgeyBmb250LXNpemU6IDUwcHg7IGNvbG9yOiBibHVlOyB9CisKKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLmxlZnQgeyB3aWR0aDogMTAwcHg7IH0KKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLnJpZ2h0IHsgd2lkdGg6IDYwMHB4OyB9CisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci5ib3R0b20geyBiYWNrZ3JvdW5kOiBicm93bjsgfQorCisjZm9vIHsgYmFja2dyb3VuZC1jb2xvcjogI2JhZjsgfQorCitub25pbXBvcnRlZCB7IG15Y29uc3Q6IGhlbGxvOyBvdGhlcmNvbnN0OiBnb29kYnllOyBwb3N0LW1peGluOiBoZXJlOyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9tb3JlX3RlbXBsYXRlcy9fbW9yZV9wYXJ0aWFsLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9tb3JlX3RlbXBsYXRlcy9fbW9yZV9wYXJ0aWFsLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmNjI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vcmVfdGVtcGxhdGVzL19tb3JlX3BhcnRpYWwuc2FzcwpAQCAtMCwwICsxLDIgQEAKKyNmb28KKyAgOmJhY2tncm91bmQtY29sb3IgI2JhZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbW9yZV90ZW1wbGF0ZXMvbW9yZTEuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vcmVfdGVtcGxhdGVzL21vcmUxLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiNGU4NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL21vcmVfdGVtcGxhdGVzL21vcmUxLnNhc3MKQEAgLTAsMCArMSwyMyBAQAorCisKK2JvZHkgIAorICBmb250OiBBcmlhbAorICBiYWNrZ3JvdW5kOiBibHVlCisKKyNwYWdlCisgIHdpZHRoOiA3MDBweAorICBoZWlnaHQ6IDEwMAorICAjaGVhZGVyCisgICAgaGVpZ2h0OiAzMDBweAorICAgIGgxCisgICAgICBmb250LXNpemU6IDUwcHgKKyAgICAgIGNvbG9yOiAgICAgYmx1ZQorCisjY29udGVudC51c2VyLnNob3cKKyAgI2NvbnRhaW5lci50b3AKKyAgICAjY29sdW1uLmxlZnQKKyAgICAgIHdpZHRoOiAxMDBweAorICAgICNjb2x1bW4ucmlnaHQKKyAgICAgIHdpZHRoOiA2MDBweAorICAjY29udGFpbmVyLmJvdHRvbQorICAgIGJhY2tncm91bmQ6IGJyb3duCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9tb3JlX3RlbXBsYXRlcy9tb3JlX2ltcG9ydC5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbW9yZV90ZW1wbGF0ZXMvbW9yZV9pbXBvcnQuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTVhMzljCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvbW9yZV90ZW1wbGF0ZXMvbW9yZV9pbXBvcnQuc2FzcwpAQCAtMCwwICsxLDExIEBACiskcHJlY29uc3Q6IGhlbGxvCisKKz1wcmVtaXhpbgorICBwcmUtbWl4aW46IGhlcmUKKworQGltcG9ydCBpbXBvcnRlZSwgYmFzaWMsIGJhc2ljLmNzcywgLi4vcmVzdWx0cy9jb21wbGV4LmNzcywgbW9yZV9wYXJ0aWFsCisKK25vbmltcG9ydGVkCisgIG15Y29uc3Q6ICRwcmVjb25zdAorICBvdGhlcmNvbnN0OiAkcG9zdGNvbnN0CisgICtwb3N0bWl4aW4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3BsdWdpbl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcGx1Z2luX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQxZDMwYgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3BsdWdpbl90ZXN0LnJiCkBAIC0wLDAgKzEsNTUyIEBACityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL3Rlc3RfaGVscGVyJworcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3Nhc3MvcGx1Z2luJworcmVxdWlyZSAnZmlsZXV0aWxzJworCittb2R1bGUgU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnMKKyAgZGVmIGZpbGVuYW1lCisgICAgZmlsZW5hbWUgPSBvcHRpb25zWzpmaWxlbmFtZV0uZ3N1YiglcnsuKigoL1teL10rKXs0fSl9LCAnXDEnKQorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoZmlsZW5hbWUpCisgIGVuZAorCisgIGRlZiB3aGF0ZXZlcgorICAgIGN1c3RvbSA9IG9wdGlvbnNbOmN1c3RvbV0KKyAgICB3aGF0ZXZlciA9IGN1c3RvbSAmJiBjdXN0b21bOndoYXRldmVyXQorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcod2hhdGV2ZXIgfHwgImluY29ycmVjdCIpCisgIGVuZAorZW5kCisKK2NsYXNzIFNhc3NQbHVnaW5UZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgQEB0ZW1wbGF0ZXMgPSAld3sKKyAgICBjb21wbGV4IHNjcmlwdCBwYXJlbnRfcmVmIGltcG9ydCBzY3NzX2ltcG9ydCBhbHQKKyAgICBzdWJkaXIvc3ViZGlyIHN1YmRpci9uZXN0ZWRfc3ViZGlyL25lc3RlZF9zdWJkaXIKKyAgICBvcHRpb25zIGltcG9ydF9jb250ZW50IGZpbGVuYW1lX2ZuIGltcG9ydF9jaGFyc2V0CisgICAgaW1wb3J0X2NoYXJzZXRfaWJtODY2CisgIH0KKworICBAQGNhY2hlX3N0b3JlID0gU2Fzczo6Q2FjaGVTdG9yZXM6Ok1lbW9yeS5uZXcKKworICBkZWYgc2V0dXAKKyAgICBTYXNzOjpVdGlsLnJldHJ5X29uX3dpbmRvd3Mge0ZpbGVVdGlscy5ta2Rpcl9wIHRlbXBmaWxlX2xvY30KKyAgICBTYXNzOjpVdGlsLnJldHJ5X29uX3dpbmRvd3Mge0ZpbGVVdGlscy5ta2Rpcl9wIHRlbXBmaWxlX2xvYyhuaWwsIm1vcmVfIil9CisgICAgc2V0X3BsdWdpbl9vcHRzCisgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgcmVzZXRfbXRpbWVzCisgIGVuZAorCisgIGRlZiB0ZWFyZG93bgorICAgIGNsZWFuX3VwX3Nhc3NjCisgICAgU2Fzczo6UGx1Z2luLnJlc2V0IQorICAgIFNhc3M6OlV0aWwucmV0cnlfb25fd2luZG93cyB7RmlsZVV0aWxzLnJtX3IgdGVtcGZpbGVfbG9jfQorICAgIFNhc3M6OlV0aWwucmV0cnlfb25fd2luZG93cyB7RmlsZVV0aWxzLnJtX3IgdGVtcGZpbGVfbG9jKG5pbCwibW9yZV8iKX0KKyAgZW5kCisKKyAgQEB0ZW1wbGF0ZXMuZWFjaCBkbyB8bmFtZXwKKyAgICBkZWZpbmVfbWV0aG9kKCJ0ZXN0X3RlbXBsYXRlX3JlbmRlcnNfY29ycmVjdGx5ICgje25hbWV9KSIpIGRvCisgICAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfcmVuZGVyc19jb3JyZWN0bHkobmFtZSl9CisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25vX3VwZGF0ZQorICAgIEZpbGUuZGVsZXRlKHRlbXBmaWxlX2xvYygnYmFzaWMnKSkKKyAgICBhc3NlcnRfbmVlZHNfdXBkYXRlICdiYXNpYycKKyAgICBjaGVja19mb3JfdXBkYXRlcyEKKyAgICBhc3NlcnRfc3R5bGVzaGVldF91cGRhdGVkICdiYXNpYycKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXBkYXRlX25lZWRlZF93aGVuX21vZGlmaWVkCisgICAgdG91Y2ggJ2Jhc2ljJworICAgIGFzc2VydF9uZWVkc191cGRhdGUgJ2Jhc2ljJworICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIGFzc2VydF9zdHlsZXNoZWV0X3VwZGF0ZWQgJ2Jhc2ljJworICBlbmQKKworICBkZWYgdGVzdF91cGRhdGVfbmVlZGVkX3doZW5fZGVwZW5kZW5jeV9tb2RpZmllZAorICAgIHRvdWNoICdiYXNpYycKKyAgICBhc3NlcnRfbmVlZHNfdXBkYXRlICdpbXBvcnQnCisgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgYXNzZXJ0X3N0eWxlc2hlZXRfdXBkYXRlZCAnYmFzaWMnCisgICAgYXNzZXJ0X3N0eWxlc2hlZXRfdXBkYXRlZCAnaW1wb3J0JworICBlbmQKKworICBkZWYgdGVzdF91cGRhdGVfbmVlZGVkX3doZW5fc2Nzc19kZXBlbmRlbmN5X21vZGlmaWVkCisgICAgdG91Y2ggJ3Njc3NfaW1wb3J0ZWUnCisgICAgYXNzZXJ0X25lZWRzX3VwZGF0ZSAnaW1wb3J0JworICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIGFzc2VydF9zdHlsZXNoZWV0X3VwZGF0ZWQgJ3Njc3NfaW1wb3J0ZWUnCisgICAgYXNzZXJ0X3N0eWxlc2hlZXRfdXBkYXRlZCAnaW1wb3J0JworICBlbmQKKworICBkZWYgdGVzdF9zY3NzX3VwZGF0ZV9uZWVkZWRfd2hlbl9kZXBlbmRlbmN5X21vZGlmaWVkCisgICAgdG91Y2ggJ2Jhc2ljJworICAgIGFzc2VydF9uZWVkc191cGRhdGUgJ3Njc3NfaW1wb3J0JworICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIGFzc2VydF9zdHlsZXNoZWV0X3VwZGF0ZWQgJ2Jhc2ljJworICAgIGFzc2VydF9zdHlsZXNoZWV0X3VwZGF0ZWQgJ3Njc3NfaW1wb3J0JworICBlbmQKKworICBkZWYgdGVzdF91cGRhdGVfbmVlZGVkX3doZW5fbmVzdGVkX2ltcG9ydF9kZXBlbmRlbmN5X21vZGlmaWVkCisgICAgdG91Y2ggJ2Jhc2ljJworICAgIGFzc2VydF9uZWVkc191cGRhdGUgJ25lc3RlZF9pbXBvcnQnCisgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgYXNzZXJ0X3N0eWxlc2hlZXRfdXBkYXRlZCAnYmFzaWMnCisgICAgYXNzZXJ0X3N0eWxlc2hlZXRfdXBkYXRlZCAnc2Nzc19pbXBvcnQnCisgIGVuZAorCisgIGRlZiB0ZXN0X25vX3VwZGF0ZXNfd2hlbl9hbHdheXNfY2hlY2tfYW5kX2Fsd2F5c191cGRhdGVfYm90aF9mYWxzZQorICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zWzphbHdheXNfdXBkYXRlXSA9IGZhbHNlCisgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOmFsd2F5c19jaGVja10gPSBmYWxzZQorCisgICAgdG91Y2ggJ2Jhc2ljJworICAgIGFzc2VydF9uZWVkc191cGRhdGUgJ2Jhc2ljJworICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorCisgICAgIyBDaGVjayBpdCdzIHN0aWxsIHN0YWxlCisgICAgYXNzZXJ0X25lZWRzX3VwZGF0ZSAnYmFzaWMnCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bGxfZXhjZXB0aW9uX2hhbmRsaW5nCisgICAgRmlsZS5kZWxldGUodGVtcGZpbGVfbG9jKCdib3JrMScpKQorICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIEZpbGUub3Blbih0ZW1wZmlsZV9sb2MoJ2JvcmsxJykpIGRvIHxmaWxlfAorICAgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLnN0cmlwLCBmaWxlLnJlYWQuc3BsaXQoIlxuIilbMC4uLjZdLmpvaW4oIlxuIikpCisvKgorRXJyb3I6IFVuZGVmaW5lZCB2YXJpYWJsZTogIiRib3JrIi4KKyAgICAgICAgb24gbGluZSAyIG9mICN7dGVtcGxhdGVfbG9jKCdib3JrMScpfQorCisxOiBib3JrCisyOiAgIGJvcms6ICRib3JrCitDU1MKKyAgICBlbmQKKyAgICBGaWxlLmRlbGV0ZSh0ZW1wZmlsZV9sb2MoJ2JvcmsxJykpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bGxfZXhjZXB0aW9uX3dpdGhfYmxvY2tfY29tbWVudAorICAgIEZpbGUuZGVsZXRlKHRlbXBmaWxlX2xvYygnYm9yazUnKSkKKyAgICBjaGVja19mb3JfdXBkYXRlcyEKKyAgICBGaWxlLm9wZW4odGVtcGZpbGVfbG9jKCdib3JrNScpKSBkbyB8ZmlsZXwKKyAgICAgIGFzc2VydF9lcXVhbCg8PENTUy5zdHJpcCwgZmlsZS5yZWFkLnNwbGl0KCJcbiIpWzAuLi43XS5qb2luKCJcbiIpKQorLyoKK0Vycm9yOiBVbmRlZmluZWQgdmFyaWFibGU6ICIkYm9yayIuCisgICAgICAgIG9uIGxpbmUgMyBvZiAje3RlbXBsYXRlX2xvYygnYm9yazUnKX0KKworMTogYm9yaworMjogICAvKiBmb28gKlxcLworMzogICBib3JrOiAkYm9yaworQ1NTCisgICAgZW5kCisgICAgRmlsZS5kZWxldGUodGVtcGZpbGVfbG9jKCdib3JrMScpKQorICBlbmQKKworICBkZWYgdGVzdF9zaW5nbGVfbGV2ZWxfaW1wb3J0X2xvb3AKKyAgICBGaWxlLmRlbGV0ZSh0ZW1wZmlsZV9sb2MoJ3NpbmdsZV9pbXBvcnRfbG9vcCcpKQorICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIEZpbGUub3Blbih0ZW1wZmlsZV9sb2MoJ3NpbmdsZV9pbXBvcnRfbG9vcCcpKSBkbyB8ZmlsZXwKKyAgICAgIGFzc2VydF9lcXVhbCg8PENTUy5zdHJpcCwgZmlsZS5yZWFkLnNwbGl0KCJcbiIpWzAuLi4yXS5qb2luKCJcbiIpKQorLyoKK0Vycm9yOiBBbiBAaW1wb3J0IGxvb3AgaGFzIGJlZW4gZm91bmQ6ICN7dGVtcGxhdGVfbG9jKCdzaW5nbGVfaW1wb3J0X2xvb3AnKX0gaW1wb3J0cyBpdHNlbGYKK0NTUworICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9kb3VibGVfbGV2ZWxfaW1wb3J0X2xvb3AKKyAgICBGaWxlLmRlbGV0ZSh0ZW1wZmlsZV9sb2MoJ2RvdWJsZV9pbXBvcnRfbG9vcDEnKSkKKyAgICBjaGVja19mb3JfdXBkYXRlcyEKKyAgICBGaWxlLm9wZW4odGVtcGZpbGVfbG9jKCdkb3VibGVfaW1wb3J0X2xvb3AxJykpIGRvIHxmaWxlfAorICAgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLnN0cmlwLCBmaWxlLnJlYWQuc3BsaXQoIlxuIilbMC4uLjRdLmpvaW4oIlxuIikpCisvKgorRXJyb3I6IEFuIEBpbXBvcnQgbG9vcCBoYXMgYmVlbiBmb3VuZDoKKyAgICAgICAgICAgI3t0ZW1wbGF0ZV9sb2MoJ2RvdWJsZV9pbXBvcnRfbG9vcDEnKX0gaW1wb3J0cyAje3RlbXBsYXRlX2xvYygnX2RvdWJsZV9pbXBvcnRfbG9vcDInKX0KKyAgICAgICAgICAgI3t0ZW1wbGF0ZV9sb2MoJ19kb3VibGVfaW1wb3J0X2xvb3AyJyl9IGltcG9ydHMgI3t0ZW1wbGF0ZV9sb2MoJ2RvdWJsZV9pbXBvcnRfbG9vcDEnKX0KK0NTUworICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9pbXBvcnRfbmFtZV9jbGVhbnVwCisgICAgRmlsZS5kZWxldGUodGVtcGZpbGVfbG9jKCdzdWJkaXIvaW1wb3J0X3VwMScpKQorICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIEZpbGUub3Blbih0ZW1wZmlsZV9sb2MoJ3N1YmRpci9pbXBvcnRfdXAxJykpIGRvIHxmaWxlfAorICAgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLnN0cmlwLCBmaWxlLnJlYWQuc3BsaXQoIlxuIilbMC4uLjVdLmpvaW4oIlxuIikpCisvKgorRXJyb3I6IEZpbGUgdG8gaW1wb3J0IG5vdCBmb3VuZCBvciB1bnJlYWRhYmxlOiAuLi9zdWJkaXIvaW1wb3J0X3VwMy5zY3NzLgorICAgICAgIExvYWQgcGF0aDogI3t0ZW1wbGF0ZV9sb2N9CisgICAgICAgIG9uIGxpbmUgMSBvZiAje3RlbXBsYXRlX2xvYyAnc3ViZGlyL2ltcG9ydF91cDInfQorICAgICAgICBmcm9tIGxpbmUgMSBvZiAje3RlbXBsYXRlX2xvYyAnc3ViZGlyL2ltcG9ydF91cDEnfQorQ1NTCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25vbmZ1bGxfZXhjZXB0aW9uX2hhbmRsaW5nCisgICAgb2xkX2Z1bGxfZXhjZXB0aW9uID0gU2Fzczo6UGx1Z2luLm9wdGlvbnNbOmZ1bGxfZXhjZXB0aW9uXQorICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zWzpmdWxsX2V4Y2VwdGlvbl0gPSBmYWxzZQorCisgICAgRmlsZS5kZWxldGUodGVtcGZpbGVfbG9jKCdib3JrMScpKQorICAgIGFzc2VydF9yYWlzZXMoU2Fzczo6U3ludGF4RXJyb3IpIHtjaGVja19mb3JfdXBkYXRlcyF9CisgIGVuc3VyZQorICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zWzpmdWxsX2V4Y2VwdGlvbl0gPSBvbGRfZnVsbF9leGNlcHRpb24KKyAgZW5kCisKKyAgZGVmIHRlc3RfdHdvX3RlbXBsYXRlX2RpcmVjdG9yaWVzCisgICAgc2V0X3BsdWdpbl9vcHRzIDp0ZW1wbGF0ZV9sb2NhdGlvbiA9PiB7CisgICAgICB0ZW1wbGF0ZV9sb2MgPT4gdGVtcGZpbGVfbG9jLAorICAgICAgdGVtcGxhdGVfbG9jKG5pbCwnbW9yZV8nKSA9PiB0ZW1wZmlsZV9sb2MobmlsLCdtb3JlXycpCisgICAgfQorICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIFsnbW9yZTEnLCAnbW9yZV9pbXBvcnQnXS5lYWNoIHsgfG5hbWV8IGFzc2VydF9yZW5kZXJzX2NvcnJlY3RseShuYW1lLCA6cHJlZml4ID0+ICdtb3JlXycpIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RfdHdvX3RlbXBsYXRlX2RpcmVjdG9yaWVzX3dpdGhfbGluZV9hbm5vdGF0aW9ucworICAgIHNldF9wbHVnaW5fb3B0cyA6bGluZV9jb21tZW50cyA9PiB0cnVlLAorICAgICAgICAgICAgICAgICAgICA6c3R5bGUgPT4gOm5lc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgOnRlbXBsYXRlX2xvY2F0aW9uID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9sb2MgPT4gdGVtcGZpbGVfbG9jLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2xvYyhuaWwsJ21vcmVfJykgPT4gdGVtcGZpbGVfbG9jKG5pbCwnbW9yZV8nKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgYXNzZXJ0X3JlbmRlcnNfY29ycmVjdGx5KCdtb3JlMV93aXRoX2xpbmVfY29tbWVudHMnLCAnbW9yZTEnLCA6cHJlZml4ID0+ICdtb3JlXycpCisgIGVuZAorCisgIGRlZiB0ZXN0X2RvZXNudF9yZW5kZXJfcGFydGlhbHMKKyAgICBhc3NlcnQgIUZpbGUuZXhpc3Q/KHRlbXBmaWxlX2xvYygnX3BhcnRpYWwnKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdGVtcGxhdGVfbG9jYXRpb25fYXJyYXkKKyAgICBhc3NlcnRfZXF1YWwgW1t0ZW1wbGF0ZV9sb2MsIHRlbXBmaWxlX2xvY11dLCBTYXNzOjpQbHVnaW4udGVtcGxhdGVfbG9jYXRpb25fYXJyYXkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYWRkX3RlbXBsYXRlX2xvY2F0aW9uCisgICAgU2Fzczo6UGx1Z2luLmFkZF90ZW1wbGF0ZV9sb2NhdGlvbih0ZW1wbGF0ZV9sb2MobmlsLCAibW9yZV8iKSwgdGVtcGZpbGVfbG9jKG5pbCwgIm1vcmVfIikpCisgICAgYXNzZXJ0X2VxdWFsKAorICAgICAgW1t0ZW1wbGF0ZV9sb2MsIHRlbXBmaWxlX2xvY10sIFt0ZW1wbGF0ZV9sb2MobmlsLCAibW9yZV8iKSwgdGVtcGZpbGVfbG9jKG5pbCwgIm1vcmVfIildXSwKKyAgICAgIFNhc3M6OlBsdWdpbi50ZW1wbGF0ZV9sb2NhdGlvbl9hcnJheSkKKworICAgIHRvdWNoICdtb3JlMScsICdtb3JlXycKKyAgICB0b3VjaCAnYmFzaWMnCisgICAgYXNzZXJ0X25lZWRzX3VwZGF0ZSAibW9yZTEiLCAibW9yZV8iCisgICAgYXNzZXJ0X25lZWRzX3VwZGF0ZSAiYmFzaWMiCisgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgYXNzZXJ0X2RvZXNudF9uZWVkX3VwZGF0ZSAibW9yZTEiLCAibW9yZV8iCisgICAgYXNzZXJ0X2RvZXNudF9uZWVkX3VwZGF0ZSAiYmFzaWMiCisgIGVuZAorCisgIGRlZiB0ZXN0X3JlbW92ZV90ZW1wbGF0ZV9sb2NhdGlvbgorICAgIFNhc3M6OlBsdWdpbi5hZGRfdGVtcGxhdGVfbG9jYXRpb24odGVtcGxhdGVfbG9jKG5pbCwgIm1vcmVfIiksIHRlbXBmaWxlX2xvYyhuaWwsICJtb3JlXyIpKQorICAgIFNhc3M6OlBsdWdpbi5yZW1vdmVfdGVtcGxhdGVfbG9jYXRpb24odGVtcGxhdGVfbG9jLCB0ZW1wZmlsZV9sb2MpCisgICAgYXNzZXJ0X2VxdWFsKAorICAgICAgW1t0ZW1wbGF0ZV9sb2MobmlsLCAibW9yZV8iKSwgdGVtcGZpbGVfbG9jKG5pbCwgIm1vcmVfIildXSwKKyAgICAgIFNhc3M6OlBsdWdpbi50ZW1wbGF0ZV9sb2NhdGlvbl9hcnJheSkKKworICAgIHRvdWNoICdtb3JlMScsICdtb3JlXycKKyAgICB0b3VjaCAnYmFzaWMnCisgICAgYXNzZXJ0X25lZWRzX3VwZGF0ZSAibW9yZTEiLCAibW9yZV8iCisgICAgYXNzZXJ0X25lZWRzX3VwZGF0ZSAiYmFzaWMiCisgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgYXNzZXJ0X2RvZXNudF9uZWVkX3VwZGF0ZSAibW9yZTEiLCAibW9yZV8iCisgICAgYXNzZXJ0X25lZWRzX3VwZGF0ZSAiYmFzaWMiCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF9zYW1lX25hbWUKKyAgICBhc3NlcnRfd2FybmluZyA8PFdBUk5JTkcgZG8KK1dBUk5JTkc6IEluICN7dGVtcGxhdGVfbG9jfToKKyAgVGhlcmUgYXJlIG11bHRpcGxlIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIG5hbWUgInNhbWVfbmFtZV9kaWZmZXJlbnRfcGFydGlhbGl0eS5zY3NzIjoKKyAgICBfc2FtZV9uYW1lX2RpZmZlcmVudF9wYXJ0aWFsaXR5LnNjc3MKKyAgICBzYW1lX25hbWVfZGlmZmVyZW50X3BhcnRpYWxpdHkuc2NzcworV0FSTklORworICAgICAgdG91Y2ggIl9zYW1lX25hbWVfZGlmZmVyZW50X3BhcnRpYWxpdHkiCisgICAgICBhc3NlcnRfbmVlZHNfdXBkYXRlICJzYW1lX25hbWVfZGlmZmVyZW50X3BhcnRpYWxpdHkiCisgICAgZW5kCisgIGVuZAorCisgICMgQ2FsbGJhY2tzCisKKyAgZGVmIHRlc3RfdXBkYXRlZF9zdHlsZXNoZWV0X2NhbGxiYWNrX2Zvcl91cGRhdGVkX3RlbXBsYXRlCisgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOmFsd2F5c191cGRhdGVdID0gZmFsc2UKKyAgICB0b3VjaCAnYmFzaWMnCisgICAgYXNzZXJ0X25vX2NhbGxiYWNrIDp1cGRhdGVkX3N0eWxlc2hlZXQsIHRlbXBsYXRlX2xvYygiY29tcGxleCIpLCB0ZW1wZmlsZV9sb2MoImNvbXBsZXgiKSBkbworICAgICAgYXNzZXJ0X2NhbGxiYWNrcygKKyAgICAgICAgWzp1cGRhdGVkX3N0eWxlc2hlZXQsIHRlbXBsYXRlX2xvYygiYmFzaWMiKSwgdGVtcGZpbGVfbG9jKCJiYXNpYyIpXSwKKyAgICAgICAgWzp1cGRhdGVkX3N0eWxlc2hlZXQsIHRlbXBsYXRlX2xvYygiaW1wb3J0IiksIHRlbXBmaWxlX2xvYygiaW1wb3J0IildKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF91cGRhdGVkX3N0eWxlc2hlZXRfY2FsbGJhY2tfZm9yX2ZyZXNoX3RlbXBsYXRlCisgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOmFsd2F5c191cGRhdGVdID0gZmFsc2UKKyAgICBhc3NlcnRfbm9fY2FsbGJhY2sgOnVwZGF0ZWRfc3R5bGVzaGVldAorICBlbmQKKworICBkZWYgdGVzdF91cGRhdGVkX3N0eWxlc2hlZXRfY2FsbGJhY2tfZm9yX2Vycm9yX3RlbXBsYXRlCisgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOmFsd2F5c191cGRhdGVdID0gZmFsc2UKKyAgICB0b3VjaCAnYm9yazEnCisgICAgYXNzZXJ0X25vX2NhbGxiYWNrIDp1cGRhdGVkX3N0eWxlc2hlZXQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm90X3VwZGF0aW5nX3N0eWxlc2hlZXRfY2FsbGJhY2tfZm9yX2ZyZXNoX3RlbXBsYXRlCisgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOmFsd2F5c191cGRhdGVdID0gZmFsc2UKKyAgICBhc3NlcnRfY2FsbGJhY2sgOm5vdF91cGRhdGluZ19zdHlsZXNoZWV0LCB0ZW1wbGF0ZV9sb2MoImJhc2ljIiksIHRlbXBmaWxlX2xvYygiYmFzaWMiKQorICBlbmQKKworICBkZWYgdGVzdF9ub3RfdXBkYXRpbmdfc3R5bGVzaGVldF9jYWxsYmFja19mb3JfdXBkYXRlZF90ZW1wbGF0ZQorICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zWzphbHdheXNfdXBkYXRlXSA9IGZhbHNlCisgICAgYXNzZXJ0X2NhbGxiYWNrIDpub3RfdXBkYXRpbmdfc3R5bGVzaGVldCwgdGVtcGxhdGVfbG9jKCJjb21wbGV4IiksIHRlbXBmaWxlX2xvYygiY29tcGxleCIpIGRvCisgICAgICBhc3NlcnRfbm9fY2FsbGJhY2tzKAorICAgICAgICBbOnVwZGF0ZWRfc3R5bGVzaGVldCwgdGVtcGxhdGVfbG9jKCJiYXNpYyIpLCB0ZW1wZmlsZV9sb2MoImJhc2ljIildLAorICAgICAgICBbOnVwZGF0ZWRfc3R5bGVzaGVldCwgdGVtcGxhdGVfbG9jKCJpbXBvcnQiKSwgdGVtcGZpbGVfbG9jKCJpbXBvcnQiKV0pCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25vdF91cGRhdGluZ19zdHlsZXNoZWV0X2NhbGxiYWNrX3dpdGhfbmV2ZXJfdXBkYXRlCisgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOm5ldmVyX3VwZGF0ZV0gPSB0cnVlCisgICAgYXNzZXJ0X25vX2NhbGxiYWNrIDpub3RfdXBkYXRpbmdfc3R5bGVzaGVldAorICBlbmQKKworICBkZWYgdGVzdF9ub3RfdXBkYXRpbmdfc3R5bGVzaGVldF9jYWxsYmFja19mb3JfcGFydGlhbAorICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zWzphbHdheXNfdXBkYXRlXSA9IGZhbHNlCisgICAgYXNzZXJ0X25vX2NhbGxiYWNrIDpub3RfdXBkYXRpbmdfc3R5bGVzaGVldCwgdGVtcGxhdGVfbG9jKCJfcGFydGlhbCIpLCB0ZW1wZmlsZV9sb2MoIl9wYXJ0aWFsIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm90X3VwZGF0aW5nX3N0eWxlc2hlZXRfY2FsbGJhY2tfZm9yX2Vycm9yCisgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOmFsd2F5c191cGRhdGVdID0gZmFsc2UKKyAgICB0b3VjaCAnYm9yazEnCisgICAgYXNzZXJ0X25vX2NhbGxiYWNrIDpub3RfdXBkYXRpbmdfc3R5bGVzaGVldCwgdGVtcGxhdGVfbG9jKCJib3JrMSIpLCB0ZW1wZmlsZV9sb2MoImJvcmsxIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcGlsYXRpb25fZXJyb3JfY2FsbGJhY2sKKyAgICBTYXNzOjpQbHVnaW4ub3B0aW9uc1s6YWx3YXlzX3VwZGF0ZV0gPSBmYWxzZQorICAgIHRvdWNoICdib3JrMScKKyAgICBhc3NlcnRfY2FsbGJhY2soOmNvbXBpbGF0aW9uX2Vycm9yLAorICAgICAgbGFtYmRhIHt8ZXwgZS5tZXNzYWdlID09ICdVbmRlZmluZWQgdmFyaWFibGU6ICIkYm9yayIuJ30sCisgICAgICB0ZW1wbGF0ZV9sb2MoImJvcmsxIiksIHRlbXBmaWxlX2xvYygiYm9yazEiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcGlsYXRpb25fZXJyb3JfY2FsbGJhY2tfZm9yX2ZpbGVfYWNjZXNzCisgICAgU2Fzczo6UGx1Z2luLm9wdGlvbnNbOmFsd2F5c191cGRhdGVdID0gZmFsc2UKKyAgICBhc3NlcnRfY2FsbGJhY2soOmNvbXBpbGF0aW9uX2Vycm9yLAorICAgICAgbGFtYmRhIHt8ZXwgZS5pc19hPyhFcnJubzo6RU5PRU5UKX0sCisgICAgICB0ZW1wbGF0ZV9sb2MoIm5vbmV4aXN0ZW50IiksIHRlbXBmaWxlX2xvYygibm9uZXhpc3RlbnQiKSkgZG8KKyAgICAgIFNhc3M6OlBsdWdpbi51cGRhdGVfc3R5bGVzaGVldHMoW1t0ZW1wbGF0ZV9sb2MoIm5vbmV4aXN0ZW50IiksIHRlbXBmaWxlX2xvYygibm9uZXhpc3RlbnQiKV1dKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9jcmVhdGluZ19kaXJlY3RvcnlfY2FsbGJhY2sKKyAgICBTYXNzOjpQbHVnaW4ub3B0aW9uc1s6YWx3YXlzX3VwZGF0ZV0gPSBmYWxzZQorICAgIGRpciA9IEZpbGUuam9pbih0ZW1wZmlsZV9sb2MsICJzdWJkaXIiLCAibmVzdGVkX3N1YmRpciIpCisgICAgRmlsZVV0aWxzLnJtX3IgZGlyCisgICAgYXNzZXJ0X2NhbGxiYWNrIDpjcmVhdGluZ19kaXJlY3RvcnksIGRpcgorICBlbmQKKworICAjIyBSZWdyZXNzaW9uCisKKyAgZGVmIHRlc3RfY2FjaGVkX2RlcGVuZGVuY2llc191cGRhdGUKKyAgICBGaWxlVXRpbHMubXYodGVtcGxhdGVfbG9jKCJiYXNpYyIpLCB0ZW1wbGF0ZV9sb2MoImJhc2ljIiwgIm1vcmVfIikpCisgICAgc2V0X3BsdWdpbl9vcHRzIDpsb2FkX3BhdGhzID0+IFt0ZW1wbGF0ZV9sb2MobmlsLCAibW9yZV8iKV0KKworICAgIHRvdWNoICdiYXNpYycsICdtb3JlXycKKyAgICBhc3NlcnRfbmVlZHNfdXBkYXRlICJpbXBvcnQiCisgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgYXNzZXJ0X3JlbmRlcnNfY29ycmVjdGx5KCJpbXBvcnQiKQorICBlbnN1cmUKKyAgICBGaWxlVXRpbHMubXYodGVtcGxhdGVfbG9jKCJiYXNpYyIsICJtb3JlXyIpLCB0ZW1wbGF0ZV9sb2MoImJhc2ljIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2NhY2hlZF9yZWxhdGl2ZV9pbXBvcnQKKyAgICBvbGRfYWx3YXlzX3VwZGF0ZSA9IFNhc3M6OlBsdWdpbi5vcHRpb25zWzphbHdheXNfdXBkYXRlXQorICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zWzphbHdheXNfdXBkYXRlXSA9IHRydWUKKyAgICBjaGVja19mb3JfdXBkYXRlcyEKKyAgICBhc3NlcnRfcmVuZGVyc19jb3JyZWN0bHkoJ3N1YmRpci9zdWJkaXInKQorICBlbnN1cmUKKyAgICBTYXNzOjpQbHVnaW4ub3B0aW9uc1s6YWx3YXlzX3VwZGF0ZV0gPSBvbGRfYWx3YXlzX3VwZGF0ZQorICBlbmQKKworICBkZWYgdGVzdF9jYWNoZWRfaWYKKyAgICBzZXRfcGx1Z2luX29wdHMgOmNhY2hlX3N0b3JlID0+IFNhc3M6OkNhY2hlU3RvcmVzOjpGaWxlc3lzdGVtLm5ldyh0ZW1wZmlsZV9sb2MgKyAnL2NhY2hlJykKKyAgICBjaGVja19mb3JfdXBkYXRlcyEKKyAgICBhc3NlcnRfcmVuZGVyc19jb3JyZWN0bHkgJ2lmJworICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIGFzc2VydF9yZW5kZXJzX2NvcnJlY3RseSAnaWYnCisgIGVuc3VyZQorICAgIHNldF9wbHVnaW5fb3B0cworICBlbmQKKworICBkZWYgdGVzdF9jYWNoZWRfaW1wb3J0X29wdGlvbgorICAgIHNldF9wbHVnaW5fb3B0cyA6Y3VzdG9tID0+IHs6d2hhdGV2ZXIgPT4gImNvcnJlY3QifQorICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIGFzc2VydF9yZW5kZXJzX2NvcnJlY3RseSAiY2FjaGVkX2ltcG9ydF9vcHRpb24iCisKKyAgICBAQGNhY2hlX3N0b3JlLnJlc2V0IQorICAgIHNldF9wbHVnaW5fb3B0cyA6Y3VzdG9tID0+IG5pbCwgOmFsd2F5c191cGRhdGUgPT4gZmFsc2UKKyAgICBjaGVja19mb3JfdXBkYXRlcyEKKyAgICBhc3NlcnRfcmVuZGVyc19jb3JyZWN0bHkgImNhY2hlZF9pbXBvcnRfb3B0aW9uIgorCisgICAgc2V0X3BsdWdpbl9vcHRzIDpjdXN0b20gPT4gezp3aGF0ZXZlciA9PiAiY29ycmVjdCJ9LCA6YWx3YXlzX3VwZGF0ZSA9PiB0cnVlCisgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgYXNzZXJ0X3JlbmRlcnNfY29ycmVjdGx5ICJjYWNoZWRfaW1wb3J0X29wdGlvbiIKKyAgZW5zdXJlCisgICAgc2V0X3BsdWdpbl9vcHRzIDpjdXN0b20gPT4gbmlsCisgIGVuZAorCisgcHJpdmF0ZQorCisgIGRlZiBhc3NlcnRfcmVuZGVyc19jb3JyZWN0bHkoKmFyZ3VtZW50cykKKyAgICBvcHRpb25zID0gYXJndW1lbnRzLmxhc3QuaXNfYT8oSGFzaCkgPyBhcmd1bWVudHMucG9wIDoge30KKyAgICBwcmVmaXggPSBvcHRpb25zWzpwcmVmaXhdCisgICAgcmVzdWx0X25hbWUgPSBhcmd1bWVudHMuc2hpZnQKKyAgICB0ZW1wZmlsZV9uYW1lID0gYXJndW1lbnRzLnNoaWZ0IHx8IHJlc3VsdF9uYW1lCisKKyAgICBleHBlY3RlZF9zdHIgPSBGaWxlLnJlYWQocmVzdWx0X2xvYyhyZXN1bHRfbmFtZSwgcHJlZml4KSkKKyAgICBhY3R1YWxfc3RyID0gRmlsZS5yZWFkKHRlbXBmaWxlX2xvYyh0ZW1wZmlsZV9uYW1lLCBwcmVmaXgpKQorICAgIGV4cGVjdGVkX3N0ciA9IGV4cGVjdGVkX3N0ci5mb3JjZV9lbmNvZGluZygnSUJNODY2JykgaWYgcmVzdWx0X25hbWUgPT0gJ2ltcG9ydF9jaGFyc2V0X2libTg2NicKKyAgICBhY3R1YWxfc3RyID0gYWN0dWFsX3N0ci5mb3JjZV9lbmNvZGluZygnSUJNODY2JykgaWYgdGVtcGZpbGVfbmFtZSA9PSAnaW1wb3J0X2NoYXJzZXRfaWJtODY2JworICAgIGV4cGVjdGVkX2xpbmVzID0gZXhwZWN0ZWRfc3RyLnNwbGl0KCJcbiIpCisgICAgYWN0dWFsX2xpbmVzID0gYWN0dWFsX3N0ci5zcGxpdCgiXG4iKQorCisgICAgaWYgYWN0dWFsX2xpbmVzLmZpcnN0ID09ICIvKiIgJiYgZXhwZWN0ZWRfbGluZXMuZmlyc3QgIT0gIi8qIgorICAgICAgYXNzZXJ0KGZhbHNlLCBhY3R1YWxfbGluZXNbMC4uYWN0dWFsX2xpbmVzLmVhY2hfd2l0aF9pbmRleC5maW5kIHt8bCwgaXwgbCA9PSAiKi8ifS5sYXN0XS5qb2luKCJcbiIpKQorICAgIGVuZAorCisgICAgZXhwZWN0ZWRfbGluZXMuemlwKGFjdHVhbF9saW5lcykuZWFjaF93aXRoX2luZGV4IGRvIHxwYWlyLCBsaW5lfAorICAgICAgbWVzc2FnZSA9ICJ0ZW1wbGF0ZTogI3tyZXN1bHRfbmFtZX1cbmxpbmU6ICAgICAje2xpbmUgKyAxfSIKKyAgICAgIGFzc2VydF9lcXVhbChwYWlyLmZpcnN0LCBwYWlyLmxhc3QsIG1lc3NhZ2UpCisgICAgZW5kCisgICAgaWYgZXhwZWN0ZWRfbGluZXMuc2l6ZSA8IGFjdHVhbF9saW5lcy5zaXplCisgICAgICBhc3NlcnQoZmFsc2UsICIje2FjdHVhbF9saW5lcy5zaXplIC0gZXhwZWN0ZWRfbGluZXMuc2l6ZX0gVHJhaWxpbmcgbGluZXMgZm91bmQgaW4gI3t0ZW1wZmlsZV9uYW1lfS5jc3M6ICN7YWN0dWFsX2xpbmVzW2V4cGVjdGVkX2xpbmVzLnNpemUuLi0xXS5qb2luKCdcbicpfSIpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBhc3NlcnRfc3R5bGVzaGVldF91cGRhdGVkKG5hbWUpCisgICAgYXNzZXJ0X2RvZXNudF9uZWVkX3VwZGF0ZSBuYW1lCisKKyAgICAjIE1ha2Ugc3VyZSBpdCBpc24ndCBhbiBleGNlcHRpb24KKyAgICBleHBlY3RlZF9saW5lcyA9IEZpbGUucmVhZChyZXN1bHRfbG9jKG5hbWUpKS5zcGxpdCgiXG4iKQorICAgIGFjdHVhbF9saW5lcyA9IEZpbGUucmVhZCh0ZW1wZmlsZV9sb2MobmFtZSkpLnNwbGl0KCJcbiIpCisgICAgaWYgYWN0dWFsX2xpbmVzLmZpcnN0ID09ICIvKiIgJiYgZXhwZWN0ZWRfbGluZXMuZmlyc3QgIT0gIi8qIgorICAgICAgYXNzZXJ0KGZhbHNlLCBhY3R1YWxfbGluZXNbMC4uYWN0dWFsX2xpbmVzLmVhY2hfd2l0aF9pbmRleC5maW5kIHt8bCwgaXwgbCA9PSAiKi8ifS5sYXN0XS5qb2luKCJcbiIpKQorICAgIGVuZAorICBlbmQKKworICBkZWYgYXNzZXJ0X2NhbGxiYWNrKG5hbWUsICpleHBlY3RlZF9hcmdzKQorICAgIHJ1biA9IGZhbHNlCisgICAgcmVjZWl2ZWRfYXJncyA9IG5pbAorICAgIFNhc3M6OlBsdWdpbi5zZW5kKCJvbl8je25hbWV9IikgZG8gfCphcmdzfAorICAgICAgcmVjZWl2ZWRfYXJncyA9IGFyZ3MKKyAgICAgIHJ1biB8fD0gZXhwZWN0ZWRfYXJncy56aXAocmVjZWl2ZWRfYXJncykuYWxsPyBkbyB8ZWEsIHJhfAorICAgICAgICBlYS5yZXNwb25kX3RvPyg6Y2FsbCkgPyBlYS5jYWxsKHJhKSA6IGVhID09IHJhCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGlmIGJsb2NrX2dpdmVuPworICAgICAgU2Fzczo6VXRpbC5zaWxlbmNlX3Nhc3Nfd2FybmluZ3Mge3lpZWxkfQorICAgIGVsc2UKKyAgICAgIGNoZWNrX2Zvcl91cGRhdGVzIQorICAgIGVuZAorCisgICAgYXNzZXJ0IHJ1biwgIkV4cGVjdGVkICN7bmFtZX0gY2FsbGJhY2sgdG8gYmUgcnVuIHdpdGggYXJndW1lbnRzOlxuICAje2V4cGVjdGVkX2FyZ3MuaW5zcGVjdH1cbkhvd2V2ZXIsIGl0IGdvdDpcbiAgI3tyZWNlaXZlZF9hcmdzLmluc3BlY3R9IgorICBlbmQKKworICBkZWYgYXNzZXJ0X25vX2NhbGxiYWNrKG5hbWUsICp1bmV4cGVjdGVkX2FyZ3MpCisgICAgU2Fzczo6UGx1Z2luLnNlbmQoIm9uXyN7bmFtZX0iKSBkbyB8KmF8CisgICAgICBuZXh0IHVubGVzcyB1bmV4cGVjdGVkX2FyZ3MuZW1wdHk/IHx8IGEgPT0gdW5leHBlY3RlZF9hcmdzCisKKyAgICAgIG1zZyA9ICJFeHBlY3RlZCAje25hbWV9IGNhbGxiYWNrIG5vdCB0byBiZSBydW4iCisgICAgICBpZiAhdW5leHBlY3RlZF9hcmdzLmVtcHR5PworICAgICAgICBtc2cgPDwgIiB3aXRoIGFyZ3VtZW50cyAje3VuZXhwZWN0ZWRfYXJncy5pbnNwZWN0fSIKKyAgICAgIGVsc2lmICFhLmVtcHR5PworICAgICAgICBtc2cgPDwgIixcbiAgd2FzIHJ1biB3aXRoIGFyZ3VtZW50cyAje2EuaW5zcGVjdH0iCisgICAgICBlbmQKKworICAgICAgZmx1bmsgbXNnCisgICAgZW5kCisKKyAgICBpZiBibG9ja19naXZlbj8KKyAgICAgIHlpZWxkCisgICAgZWxzZQorICAgICAgY2hlY2tfZm9yX3VwZGF0ZXMhCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBhc3NlcnRfY2FsbGJhY2tzKCphcmdzKQorICAgIHJldHVybiBjaGVja19mb3JfdXBkYXRlcyEgaWYgYXJncy5lbXB0eT8KKyAgICBhc3NlcnRfY2FsbGJhY2soKmFyZ3MucG9wKSB7YXNzZXJ0X2NhbGxiYWNrcygqYXJncyl9CisgIGVuZAorCisgIGRlZiBhc3NlcnRfbm9fY2FsbGJhY2tzKCphcmdzKQorICAgIHJldHVybiBjaGVja19mb3JfdXBkYXRlcyEgaWYgYXJncy5lbXB0eT8KKyAgICBhc3NlcnRfbm9fY2FsbGJhY2soKmFyZ3MucG9wKSB7YXNzZXJ0X25vX2NhbGxiYWNrcygqYXJncyl9CisgIGVuZAorCisgIGRlZiBjaGVja19mb3JfdXBkYXRlcyEKKyAgICBTYXNzOjpVdGlsLnNpbGVuY2Vfc2Fzc193YXJuaW5ncyBkbworICAgICAgU2Fzczo6UGx1Z2luLmNoZWNrX2Zvcl91cGRhdGVzCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBhc3NlcnRfbmVlZHNfdXBkYXRlKCphcmdzKQorICAgIGFzc2VydChTYXNzOjpQbHVnaW46OlN0YWxlbmVzc0NoZWNrZXIuc3R5bGVzaGVldF9uZWVkc191cGRhdGU/KHRlbXBmaWxlX2xvYygqYXJncyksIHRlbXBsYXRlX2xvYygqYXJncykpLAorICAgICAgIkV4cGVjdGVkICN7dGVtcGxhdGVfbG9jKCphcmdzKX0gdG8gbmVlZCBhbiB1cGRhdGUuIikKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9kb2VzbnRfbmVlZF91cGRhdGUoKmFyZ3MpCisgICAgYXNzZXJ0KCFTYXNzOjpQbHVnaW46OlN0YWxlbmVzc0NoZWNrZXIuc3R5bGVzaGVldF9uZWVkc191cGRhdGU/KHRlbXBmaWxlX2xvYygqYXJncyksIHRlbXBsYXRlX2xvYygqYXJncykpLAorICAgICAgIkV4cGVjdGVkICN7dGVtcGxhdGVfbG9jKCphcmdzKX0gbm90IHRvIG5lZWQgYW4gdXBkYXRlLiIpCisgIGVuZAorCisgIGRlZiB0b3VjaCgqYXJncykKKyAgICBGaWxlVXRpbHMudG91Y2godGVtcGxhdGVfbG9jKCphcmdzKSkKKyAgZW5kCisKKyAgZGVmIHJlc2V0X210aW1lcworICAgIFNhc3M6OlBsdWdpbjo6U3RhbGVuZXNzQ2hlY2tlci5kZXBlbmRlbmNpZXNfY2FjaGUgPSB7fQorICAgIGF0aW1lID0gVGltZS5ub3cKKyAgICBtdGltZSA9IFRpbWUubm93IC0gNQorICAgIERpclsieyN7dGVtcGxhdGVfbG9jfSwje3RlbXBmaWxlX2xvY319LyoqLyoue2NzcyxzYXNzLHNjc3N9Il0uZWFjaCBkbyB8ZnwKKyAgICAgIFNhc3M6OlV0aWwucmV0cnlfb25fd2luZG93cyB7RmlsZS51dGltZShhdGltZSwgbXRpbWUsIGYpfQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVtcGxhdGVfbG9jKG5hbWUgPSBuaWwsIHByZWZpeCA9IG5pbCkKKyAgICBpZiBuYW1lCisgICAgICBzY3NzID0gYWJzb2x1dGl6ZSAiI3twcmVmaXh9dGVtcGxhdGVzLyN7bmFtZX0uc2NzcyIKKyAgICAgIEZpbGUuZXhpc3Q/KHNjc3MpID8gc2NzcyA6IGFic29sdXRpemUoIiN7cHJlZml4fXRlbXBsYXRlcy8je25hbWV9LnNhc3MiKQorICAgIGVsc2UKKyAgICAgIGFic29sdXRpemUgIiN7cHJlZml4fXRlbXBsYXRlcyIKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlbXBmaWxlX2xvYyhuYW1lID0gbmlsLCBwcmVmaXggPSBuaWwpCisgICAgaWYgbmFtZQorICAgICAgYWJzb2x1dGl6ZSAiI3twcmVmaXh9dG1wLyN7bmFtZX0uY3NzIgorICAgIGVsc2UKKyAgICAgIGFic29sdXRpemUgIiN7cHJlZml4fXRtcCIKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHJlc3VsdF9sb2MobmFtZSA9IG5pbCwgcHJlZml4ID0gbmlsKQorICAgIGlmIG5hbWUKKyAgICAgIGFic29sdXRpemUgIiN7cHJlZml4fXJlc3VsdHMvI3tuYW1lfS5jc3MiCisgICAgZWxzZQorICAgICAgYWJzb2x1dGl6ZSAiI3twcmVmaXh9cmVzdWx0cyIKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHNldF9wbHVnaW5fb3B0cyhvdmVycmlkZXMgPSB7fSkKKyAgICBTYXNzOjpQbHVnaW4ub3B0aW9ucy5tZXJnZSEoCisgICAgICA6dGVtcGxhdGVfbG9jYXRpb24gPT4gdGVtcGxhdGVfbG9jLAorICAgICAgOmNzc19sb2NhdGlvbiA9PiB0ZW1wZmlsZV9sb2MsCisgICAgICA6c3R5bGUgPT4gOmNvbXBhY3QsCisgICAgICA6YWx3YXlzX3VwZGF0ZSA9PiB0cnVlLAorICAgICAgOm5ldmVyX3VwZGF0ZSA9PiBmYWxzZSwKKyAgICAgIDpmdWxsX2V4Y2VwdGlvbiA9PiB0cnVlLAorICAgICAgOmNhY2hlX3N0b3JlID0+IEBAY2FjaGVfc3RvcmUsCisgICAgICA6c291cmNlbWFwID0+IDpub25lCisgICAgKQorICAgIFNhc3M6OlBsdWdpbi5vcHRpb25zLm1lcmdlIShvdmVycmlkZXMpCisgIGVuZAorZW5kCisKK2NsYXNzIFNhc3M6OkVuZ2luZQorICBhbGlhc19tZXRob2QgOm9sZF9yZW5kZXIsIDpyZW5kZXIKKworICBkZWYgcmVuZGVyCisgICAgcmFpc2UgImJvcmsgYm9yayBib3JrISIgaWYgQHRlbXBsYXRlWzBdID09ICJ7Ym9yayBub3chfSIKKyAgICBvbGRfcmVuZGVyCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2FsdC5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2FsdC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4NDM0MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvYWx0LmNzcwpAQCAtMCwwICsxLDQgQEAKK2gxIHsgZmxvYXQ6IGxlZnQ7IHdpZHRoOiAyNzRweDsgaGVpZ2h0OiA3NXB4OyBtYXJnaW46IDA7IGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7IGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IH0KK2gxIGE6aG92ZXIsIGgxIGE6dmlzaXRlZCB7IGNvbG9yOiBncmVlbjsgfQoraDEgYjpob3ZlciB7IGNvbG9yOiByZWQ7IGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyB9CitoMSBjb25zdCB7IG5vc3A6IDM7IHNwOiAzOyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2Jhc2ljLmNzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvYmFzaWMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDExODIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2Jhc2ljLmNzcwpAQCAtMCwwICsxLDkgQEAKK2JvZHkgeyBmb250OiBBcmlhbDsgYmFja2dyb3VuZDogYmx1ZTsgfQorCisjcGFnZSB7IHdpZHRoOiA3MDBweDsgaGVpZ2h0OiAxMDA7IH0KKyNwYWdlICNoZWFkZXIgeyBoZWlnaHQ6IDMwMHB4OyB9CisjcGFnZSAjaGVhZGVyIGgxIHsgZm9udC1zaXplOiA1MHB4OyBjb2xvcjogYmx1ZTsgfQorCisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5sZWZ0IHsgd2lkdGg6IDEwMHB4OyB9CisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5yaWdodCB7IHdpZHRoOiA2MDBweDsgfQorI2NvbnRlbnQudXNlci5zaG93ICNjb250YWluZXIuYm90dG9tIHsgYmFja2dyb3VuZDogYnJvd247IH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvY2FjaGVkX2ltcG9ydF9vcHRpb24uY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9jYWNoZWRfaW1wb3J0X29wdGlvbi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxYzBlNwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvY2FjaGVkX2ltcG9ydF9vcHRpb24uY3NzCkBAIC0wLDAgKzEsMyBAQAorcGFydGlhbCB7IHZhbHVlOiBjb3JyZWN0OyB9CisKK21haW4geyB2YWx1ZTogY29ycmVjdDsgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9jb21wYWN0LmNzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvY29tcGFjdC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0ZGNiNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvY29tcGFjdC5jc3MKQEAgLTAsMCArMSw1IEBACisjbWFpbiB7IHdpZHRoOiAxNWVtOyBjb2xvcjogIzAwMDBmZjsgfQorI21haW4gcCB7IGJvcmRlci1zdHlsZTogZG90dGVkOyAvKiBOZXN0ZWQgY29tbWVudCBNb3JlIG5lc3RlZCBzdHVmZiAqLyBib3JkZXItd2lkdGg6IDJweDsgfQorI21haW4gLmNvb2wgeyB3aWR0aDogMTAwcHg7IH0KKworI2xlZnQgeyBmb250LXNpemU6IDJlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZsb2F0OiBsZWZ0OyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2NvbXBsZXguY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9jb21wbGV4LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjMyZjFjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9jb21wbGV4LmNzcwpAQCAtMCwwICsxLDg2IEBACitib2R5IHsgbWFyZ2luOiAwOyBmb250OiAwLjg1ZW0gIkx1Y2lkYSBHcmFuZGUiLCAiVHJlYnVjaGV0IE1TIiwgVmVyZGFuYSwgc2Fucy1zZXJpZjsgY29sb3I6ICNmZmY7IGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2dsb2JhbF9iZy5naWYpOyB9CisKKyNwYWdlIHsgd2lkdGg6IDkwMHB4OyBtYXJnaW46IDAgYXV0bzsgYmFja2dyb3VuZDogIzQ0MDAwODsgYm9yZGVyLXRvcC13aWR0aDogNXB4OyBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXRvcC1jb2xvcjogI2ZmODUwMDsgfQorCisjaGVhZGVyIHsgaGVpZ2h0OiA3NXB4OyBwYWRkaW5nOiAwOyB9CisjaGVhZGVyIGgxIHsgZmxvYXQ6IGxlZnQ7IHdpZHRoOiAyNzRweDsgaGVpZ2h0OiA3NXB4OyBtYXJnaW46IDA7IGJhY2tncm91bmQtaW1hZ2U6IHVybCgvaW1hZ2VzL2dsb2JhbF9sb2dvLmdpZik7IC8qIENyYXp5IG5lc3RlZCBjb21tZW50ICovIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7IHRleHQtaW5kZW50OiAtOTk5OXB4OyB9CisjaGVhZGVyIC5zdGF0dXMgeyBmbG9hdDogcmlnaHQ7IHBhZGRpbmctdG9wOiAwLjVlbTsgcGFkZGluZy1sZWZ0OiAwLjVlbTsgcGFkZGluZy1yaWdodDogMC41ZW07IHBhZGRpbmctYm90dG9tOiAwOyB9CisjaGVhZGVyIC5zdGF0dXMgcCB7IGZsb2F0OiBsZWZ0OyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tcmlnaHQ6IDAuNWVtOyBtYXJnaW4tYm90dG9tOiAwOyBtYXJnaW4tbGVmdDogMDsgfQorI2hlYWRlciAuc3RhdHVzIHVsIHsgZmxvYXQ6IGxlZnQ7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQorI2hlYWRlciAuc3RhdHVzIGxpIHsgbGlzdC1zdHlsZS10eXBlOiBub25lOyBkaXNwbGF5OiBpbmxpbmU7IG1hcmdpbjogMCA1cHg7IH0KKyNoZWFkZXIgLnN0YXR1cyBhOmxpbmssICNoZWFkZXIgLnN0YXR1cyBhOnZpc2l0ZWQgeyBjb2xvcjogI2ZmODUwMDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisjaGVhZGVyIC5zdGF0dXMgYTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CisjaGVhZGVyIC5zZWFyY2ggeyBmbG9hdDogcmlnaHQ7IGNsZWFyOiByaWdodDsgbWFyZ2luOiAxMnB4IDAgMCAwOyB9CisjaGVhZGVyIC5zZWFyY2ggZm9ybSB7IG1hcmdpbjogMDsgfQorI2hlYWRlciAuc2VhcmNoIGlucHV0IHsgbWFyZ2luOiAwIDNweCAwIDA7IHBhZGRpbmc6IDJweDsgYm9yZGVyOiBub25lOyB9CisKKyNtZW51IHsgY2xlYXI6IGJvdGg7IHRleHQtYWxpZ246IHJpZ2h0OyBoZWlnaHQ6IDIwcHg7IGJvcmRlci1ib3R0b206IDVweCBzb2xpZCAjMDA2Yjk1OyBiYWNrZ3JvdW5kOiAjMDBhNGU0OyB9CisjbWVudSAuY29udGVzdHMgdWwgeyBtYXJnaW46IDAgNXB4IDAgMDsgcGFkZGluZzogMDsgfQorI21lbnUgLmNvbnRlc3RzIHVsIGxpIHsgbGlzdC1zdHlsZS10eXBlOiBub25lOyBtYXJnaW46IDAgNXB4OyBwYWRkaW5nOiA1cHggNXB4IDAgNXB4OyBkaXNwbGF5OiBpbmxpbmU7IGZvbnQtc2l6ZTogMS4xZW07IGNvbG9yOiAjZmZmOyBiYWNrZ3JvdW5kOiAjMDBhNGU0OyB9CisjbWVudSAuY29udGVzdHMgYTpsaW5rLCAjbWVudSAuY29udGVzdHMgYTp2aXNpdGVkIHsgY29sb3I6ICNmZmY7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KKyNtZW51IC5jb250ZXN0cyBhOmhvdmVyIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KKworI2NvbnRlbnQgeyBjbGVhcjogYm90aDsgfQorI2NvbnRlbnQgLmNvbnRhaW5lciB7IGNsZWFyOiBib3RoOyB9CisjY29udGVudCAuY29udGFpbmVyIC5jb2x1bW4geyBmbG9hdDogbGVmdDsgfQorI2NvbnRlbnQgLmNvbnRhaW5lciAuY29sdW1uIC5yaWdodCB7IGZsb2F0OiByaWdodDsgfQorI2NvbnRlbnQgYTpsaW5rLCAjY29udGVudCBhOnZpc2l0ZWQgeyBjb2xvcjogIzkzZDcwMDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisjY29udGVudCBhOmhvdmVyIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KKworI2NvbnRlbnQgcCwgI2NvbnRlbnQgZGl2IHsgd2lkdGg6IDQwZW07IH0KKyNjb250ZW50IHAgbGksICNjb250ZW50IHAgZHQsICNjb250ZW50IHAgZGQsICNjb250ZW50IGRpdiBsaSwgI2NvbnRlbnQgZGl2IGR0LCAjY29udGVudCBkaXYgZGQgeyBjb2xvcjogI2RkZmZkZDsgYmFja2dyb3VuZC1jb2xvcjogIzQ3OTJiYjsgfQorI2NvbnRlbnQgLmNvbnRhaW5lci52aWRlbyAuY29sdW1uLmxlZnQgeyB3aWR0aDogMjAwcHg7IH0KKyNjb250ZW50IC5jb250YWluZXIudmlkZW8gLmNvbHVtbi5sZWZ0IC5ib3ggeyBtYXJnaW4tdG9wOiAxMHB4OyB9CisjY29udGVudCAuY29udGFpbmVyLnZpZGVvIC5jb2x1bW4ubGVmdCAuYm94IHAgeyBtYXJnaW46IDAgMWVtIGF1dG8gMWVtOyB9CisjY29udGVudCAuY29udGFpbmVyLnZpZGVvIC5jb2x1bW4ubGVmdCAuYm94LnBhcnRpY2lwYW50cyBpbWcgeyBmbG9hdDogbGVmdDsgbWFyZ2luOiAwIDFlbSBhdXRvIDFlbTsgYm9yZGVyOiAxcHggc29saWQgIzZlMDAwZDsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgfQorI2NvbnRlbnQgLmNvbnRhaW5lci52aWRlbyAuY29sdW1uLmxlZnQgLmJveC5wYXJ0aWNpcGFudHMgaDIgeyBtYXJnaW46IDAgMCAxMHB4IDA7IHBhZGRpbmc6IDAuNWVtOyAvKiBUaGUgYmFja2dyb3VuZCBpbWFnZSBpcyBhIGdpZiEgKi8gYmFja2dyb3VuZDogIzZlMDAwZCB1cmwoL2ltYWdlcy9oZHJfcGFydGljaXBhbnQuZ2lmKSAycHggMnB4IG5vLXJlcGVhdDsgLyogT2theSBjaGVjayB0aGlzIG91dCBNdWx0aWxpbmUgY29tbWVudHMgV293IGR1ZGUgSSBtZWFuIHNlcmlvdXNseSwgV09XICovIHRleHQtaW5kZW50OiAtOTk5OXB4OyBib3JkZXItdG9wLXdpZHRoOiA1cHg7IGJvcmRlci10b3Atc3R5bGU6IHNvbGlkOyBib3JkZXItdG9wLWNvbG9yOiAjYTIwMDEzOyBib3JkZXItcmlnaHQtd2lkdGg6IDFweDsgYm9yZGVyLXJpZ2h0LXN0eWxlOiBkb3R0ZWQ7IH0KKyNjb250ZW50IC5jb250YWluZXIudmlkZW8gLmNvbHVtbi5taWRkbGUgeyB3aWR0aDogNTAwcHg7IH0KKyNjb250ZW50IC5jb250YWluZXIudmlkZW8gLmNvbHVtbi5yaWdodCB7IHdpZHRoOiAyMDBweDsgfQorI2NvbnRlbnQgLmNvbnRhaW5lci52aWRlbyAuY29sdW1uLnJpZ2h0IC5ib3ggeyBtYXJnaW4tdG9wOiAwOyB9CisjY29udGVudCAuY29udGFpbmVyLnZpZGVvIC5jb2x1bW4ucmlnaHQgLmJveCBwIHsgbWFyZ2luOiAwIDFlbSBhdXRvIDFlbTsgfQorI2NvbnRlbnQgLmNvbnRhaW5lci52aWRlbyAuY29sdW1uIHAgeyBtYXJnaW4tdG9wOiAwOyB9CisKKyNjb250ZW50LmNvbnRlc3RzIC5jb250YWluZXIuaW5mb3JtYXRpb24gLmNvbHVtbi5yaWdodCAuYm94IHsgbWFyZ2luOiAxZW0gMDsgfQorI2NvbnRlbnQuY29udGVzdHMgLmNvbnRhaW5lci5pbmZvcm1hdGlvbiAuY29sdW1uLnJpZ2h0IC5ib3gudmlkZW9zIC50aHVtYm5haWwgaW1nIHsgd2lkdGg6IDIwMHB4OyBoZWlnaHQ6IDE1MHB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IH0KKyNjb250ZW50LmNvbnRlc3RzIC5jb250YWluZXIuaW5mb3JtYXRpb24gLmNvbHVtbi5yaWdodCAuYm94LnZpZGVvcyBhOmxpbmssICNjb250ZW50LmNvbnRlc3RzIC5jb250YWluZXIuaW5mb3JtYXRpb24gLmNvbHVtbi5yaWdodCAuYm94LnZpZGVvcyBhOnZpc2l0ZWQgeyBjb2xvcjogIzkzZDcwMDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisjY29udGVudC5jb250ZXN0cyAuY29udGFpbmVyLmluZm9ybWF0aW9uIC5jb2x1bW4ucmlnaHQgLmJveC52aWRlb3MgYTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CisjY29udGVudC5jb250ZXN0cyAuY29udGFpbmVyLmluZm9ybWF0aW9uIC5jb2x1bW4ucmlnaHQgLmJveC52b3RlcyBhIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAyMDBweDsgaGVpZ2h0OiA2MHB4OyBtYXJnaW46IDE1cHggMDsgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYnRuX3ZvdGVub3cuZ2lmKSBuby1yZXBlYXQ7IHRleHQtaW5kZW50OiAtOTk5OXB4OyBvdXRsaW5lOiBub25lOyBib3JkZXI6IG5vbmU7IH0KKyNjb250ZW50LmNvbnRlc3RzIC5jb250YWluZXIuaW5mb3JtYXRpb24gLmNvbHVtbi5yaWdodCAuYm94LnZvdGVzIGgyIHsgbWFyZ2luOiA1MnB4IDAgMTBweCAwOyBwYWRkaW5nOiAwLjVlbTsgYmFja2dyb3VuZDogIzZlMDAwZCB1cmwoL2ltYWdlcy9oZHJfdmlkZW9zdGF0cy5naWYpIDJweCAycHggbm8tcmVwZWF0OyB0ZXh0LWluZGVudDogLTk5OTlweDsgYm9yZGVyLXRvcDogNXB4IHNvbGlkICNhMjAwMTM7IH0KKworI2NvbnRlbnQuY29udGVzdHMgLmNvbnRhaW5lci52aWRlbyAuYm94LnZpZGVvcyBoMiB7IG1hcmdpbjogMDsgcGFkZGluZzogMC41ZW07IGJhY2tncm91bmQ6ICM2ZTAwMGQgdXJsKC9pbWFnZXMvaGRyX25ld2VzdGNsaXBzLmdpZikgMnB4IDJweCBuby1yZXBlYXQ7IHRleHQtaW5kZW50OiAtOTk5OXB4OyBib3JkZXItdG9wOiA1cHggc29saWQgI2EyMDAxMzsgfQorI2NvbnRlbnQuY29udGVzdHMgLmNvbnRhaW5lci52aWRlbyAuYm94LnZpZGVvcyB0YWJsZSB7IHdpZHRoOiAxMDA7IH0KKyNjb250ZW50LmNvbnRlc3RzIC5jb250YWluZXIudmlkZW8gLmJveC52aWRlb3MgdGFibGUgdGQgeyBwYWRkaW5nOiAxZW07IHdpZHRoOiAyNTsgdmVydGljYWwtYWxpZ246IHRvcDsgfQorI2NvbnRlbnQuY29udGVzdHMgLmNvbnRhaW5lci52aWRlbyAuYm94LnZpZGVvcyB0YWJsZSB0ZCBwIHsgbWFyZ2luOiAwIDAgNXB4IDA7IH0KKyNjb250ZW50LmNvbnRlc3RzIC5jb250YWluZXIudmlkZW8gLmJveC52aWRlb3MgdGFibGUgdGQgYTpsaW5rLCAjY29udGVudC5jb250ZXN0cyAuY29udGFpbmVyLnZpZGVvIC5ib3gudmlkZW9zIHRhYmxlIHRkIGE6dmlzaXRlZCB7IGNvbG9yOiAjOTNkNzAwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KKyNjb250ZW50LmNvbnRlc3RzIC5jb250YWluZXIudmlkZW8gLmJveC52aWRlb3MgdGFibGUgdGQgYTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CisjY29udGVudC5jb250ZXN0cyAuY29udGFpbmVyLnZpZGVvIC5ib3gudmlkZW9zIC50aHVtYm5haWwgeyBmbG9hdDogbGVmdDsgfQorI2NvbnRlbnQuY29udGVzdHMgLmNvbnRhaW5lci52aWRlbyAuYm94LnZpZGVvcyAudGh1bWJuYWlsIGltZyB7IHdpZHRoOiA4MHB4OyBoZWlnaHQ6IDYwcHg7IG1hcmdpbjogMCAxMHB4IDAgMDsgYm9yZGVyOiAxcHggc29saWQgIzZlMDAwZDsgfQorCisjY29udGVudCAuY29udGFpbmVyLmNvbW1lbnRzIC5jb2x1bW4geyBtYXJnaW4tdG9wOiAxNXB4OyB9CisjY29udGVudCAuY29udGFpbmVyLmNvbW1lbnRzIC5jb2x1bW4ubGVmdCB7IHdpZHRoOiA2MDBweDsgfQorI2NvbnRlbnQgLmNvbnRhaW5lci5jb21tZW50cyAuY29sdW1uLmxlZnQgLmJveCBvbCB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQorI2NvbnRlbnQgLmNvbnRhaW5lci5jb21tZW50cyAuY29sdW1uLmxlZnQgLmJveCBsaSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAwIDAgMWVtIDA7IGJhY2tncm91bmQ6ICM2ZTAwMGQ7IGJvcmRlci10b3A6IDVweCBzb2xpZCAjYTIwMDEzOyB9CisjY29udGVudCAuY29udGFpbmVyLmNvbW1lbnRzIC5jb2x1bW4ubGVmdCAuYm94IGxpIGRpdiB7IG1hcmdpbi1ib3R0b206IDFlbTsgfQorI2NvbnRlbnQgLmNvbnRhaW5lci5jb21tZW50cyAuY29sdW1uLmxlZnQgLmJveCBsaSB1bCB7IHRleHQtYWxpZ246IHJpZ2h0OyB9CisjY29udGVudCAuY29udGFpbmVyLmNvbW1lbnRzIC5jb2x1bW4ubGVmdCAuYm94IGxpIHVsIGxpIHsgZGlzcGxheTogaW5saW5lOyBib3JkZXI6IG5vbmU7IHBhZGRpbmc6IDA7IH0KKyNjb250ZW50IC5jb250YWluZXIuY29tbWVudHMgLmNvbHVtbi5yaWdodCB7IHdpZHRoOiAyOTBweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB9CisjY29udGVudCAuY29udGFpbmVyLmNvbW1lbnRzIC5jb2x1bW4ucmlnaHQgaDIgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDAuNWVtOyBiYWNrZ3JvdW5kOiAjNmUwMDBkIHVybCgvaW1hZ2VzL2hkcl9hZGRjb21tZW50LmdpZikgMnB4IDJweCBuby1yZXBlYXQ7IHRleHQtaW5kZW50OiAtOTk5OXB4OyBib3JkZXItdG9wOiA1cHggc29saWQgI2EyMDAxMzsgfQorI2NvbnRlbnQgLmNvbnRhaW5lci5jb21tZW50cyAuY29sdW1uLnJpZ2h0IC5ib3ggdGV4dGFyZWEgeyB3aWR0aDogMjkwcHg7IGhlaWdodDogMTAwcHg7IGJvcmRlcjogbm9uZTsgfQorCisjZm9vdGVyIHsgbWFyZ2luLXRvcDogMTBweDsgcGFkZGluZzogMS4yZW0gMS41ZW07IGJhY2tncm91bmQ6ICNmZjg1MDA7IH0KKyNmb290ZXIgdWwgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgfQorI2Zvb3RlciB1bCBsaSB7IGRpc3BsYXk6IGlubGluZTsgbWFyZ2luOiAwIDAuNWVtOyBjb2xvcjogIzQ0MDAwODsgfQorI2Zvb3RlciB1bC5saW5rcyB7IGZsb2F0OiBsZWZ0OyB9CisjZm9vdGVyIHVsLmxpbmtzIGE6bGluaywgI2Zvb3RlciB1bC5saW5rcyBhOnZpc2l0ZWQgeyBjb2xvcjogIzQ0MDAwODsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisjZm9vdGVyIHVsLmxpbmtzIGE6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQorI2Zvb3RlciB1bC5jb3B5cmlnaHQgeyBmbG9hdDogcmlnaHQ7IH0KKworLmNsZWFyIHsgY2xlYXI6IGJvdGg7IH0KKworLmNlbnRlcmVkIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9CisKK2ltZyB7IGJvcmRlcjogbm9uZTsgfQorCitidXR0b24uc2hvcnQgeyB3aWR0aDogNjBweDsgaGVpZ2h0OiAyMnB4OyBwYWRkaW5nOiAwIDAgMnB4IDA7IGNvbG9yOiAjZmZmOyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2J0bl9zaG9ydC5naWYpIG5vLXJlcGVhdDsgfQorCit0YWJsZSB7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvY29tcHJlc3NlZC5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2NvbXByZXNzZWQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjI3ODYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2NvbXByZXNzZWQuY3NzCkBAIC0wLDAgKzEgQEAKKyNtYWlue3dpZHRoOjE1ZW07Y29sb3I6Ymx1ZX0jbWFpbiBwe2JvcmRlci1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXdpZHRoOjJweH0jbWFpbiAuY29vbHt3aWR0aDoxMDBweH0jbGVmdHtmb250LXNpemU6MmVtO2ZvbnQtd2VpZ2h0OmJvbGQ7ZmxvYXQ6bGVmdH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvZXhwYW5kZWQuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9leHBhbmRlZC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmOTFmYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvZXhwYW5kZWQuY3NzCkBAIC0wLDAgKzEsMTkgQEAKKyNtYWluIHsKKyAgd2lkdGg6IDE1ZW07CisgIGNvbG9yOiAjMDAwMGZmOworfQorI21haW4gcCB7CisgIGJvcmRlci1zdHlsZTogZG90dGVkOworICAvKiBOZXN0ZWQgY29tbWVudAorICAgKiBNb3JlIG5lc3RlZCBzdHVmZiAqLworICBib3JkZXItd2lkdGg6IDJweDsKK30KKyNtYWluIC5jb29sIHsKKyAgd2lkdGg6IDEwMHB4OworfQorCisjbGVmdCB7CisgIGZvbnQtc2l6ZTogMmVtOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZmxvYXQ6IGxlZnQ7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2ZpbGVuYW1lX2ZuLmNzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvZmlsZW5hbWVfZm4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWQ5YTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2ZpbGVuYW1lX2ZuLmNzcwpAQCAtMCwwICsxLDMgQEAKK2ZpbGVuYW1lIHsgaW1wb3J0ZWQ6IC90ZXN0L3Nhc3MvdGVtcGxhdGVzL19maWxlbmFtZV9mbl9pbXBvcnQuc2NzczsgfQorCitmaWxlbmFtZSB7IGxvY2FsOiAvdGVzdC9zYXNzL3RlbXBsYXRlcy9maWxlbmFtZV9mbi5zY3NzOyBsb2NhbC1taXhpbjogL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvZmlsZW5hbWVfZm4uc2NzczsgbG9jYWwtZnVuY3Rpb246IC90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ZpbGVuYW1lX2ZuLnNjc3M7IGltcG9ydGVkLW1peGluOiAvdGVzdC9zYXNzL3RlbXBsYXRlcy9fZmlsZW5hbWVfZm5faW1wb3J0LnNjc3M7IGltcG9ydGVkLWZ1bmN0aW9uOiAvdGVzdC9zYXNzL3RlbXBsYXRlcy9fZmlsZW5hbWVfZm5faW1wb3J0LnNjc3M7IH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvaWYuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9pZi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlODgxMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvaWYuY3NzCkBAIC0wLDAgKzEsMyBAQAorYSB7IGJyYW5jaDogaWY7IH0KKworYiB7IGJyYW5jaDogZWxzZTsgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9pbXBvcnQuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9pbXBvcnQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjgzODIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2ltcG9ydC5jc3MKQEAgLTAsMCArMSwzMSBAQAorQGltcG9ydCB1cmwoYmFzaWMuY3NzKTsKK0BpbXBvcnQgdXJsKC4uL3Jlc3VsdHMvY29tcGxleC5jc3MpOworaW1wb3J0ZWQgeyBvdGhlcmNvbnN0OiBoZWxsbzsgbXljb25zdDogZ29vZGJ5ZTsgcHJlLW1peGluOiBoZXJlOyB9CisKK2JvZHkgeyBmb250OiBBcmlhbDsgYmFja2dyb3VuZDogYmx1ZTsgfQorCisjcGFnZSB7IHdpZHRoOiA3MDBweDsgaGVpZ2h0OiAxMDA7IH0KKyNwYWdlICNoZWFkZXIgeyBoZWlnaHQ6IDMwMHB4OyB9CisjcGFnZSAjaGVhZGVyIGgxIHsgZm9udC1zaXplOiA1MHB4OyBjb2xvcjogYmx1ZTsgfQorCisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5sZWZ0IHsgd2lkdGg6IDEwMHB4OyB9CisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5yaWdodCB7IHdpZHRoOiA2MDBweDsgfQorI2NvbnRlbnQudXNlci5zaG93ICNjb250YWluZXIuYm90dG9tIHsgYmFja2dyb3VuZDogYnJvd247IH0KKworbWlkcnVsZSB7IGludGhlOiBtaWRkbGU7IH0KKworc2NzcyB7IGltcG9ydGVkOiB5ZXM7IH0KKworYm9keSB7IGZvbnQ6IEFyaWFsOyBiYWNrZ3JvdW5kOiBibHVlOyB9CisKKyNwYWdlIHsgd2lkdGg6IDcwMHB4OyBoZWlnaHQ6IDEwMDsgfQorI3BhZ2UgI2hlYWRlciB7IGhlaWdodDogMzAwcHg7IH0KKyNwYWdlICNoZWFkZXIgaDEgeyBmb250LXNpemU6IDUwcHg7IGNvbG9yOiBibHVlOyB9CisKKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLmxlZnQgeyB3aWR0aDogMTAwcHg7IH0KKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLnJpZ2h0IHsgd2lkdGg6IDYwMHB4OyB9CisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci5ib3R0b20geyBiYWNrZ3JvdW5kOiBicm93bjsgfQorCisjZm9vIHsgYmFja2dyb3VuZC1jb2xvcjogI2JhZjsgfQorCitub25pbXBvcnRlZCB7IG15Y29uc3Q6IGhlbGxvOyBvdGhlcmNvbnN0OiBnb29kYnllOyBwb3N0LW1peGluOiBoZXJlOyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2ltcG9ydF9jaGFyc2V0LmNzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvaW1wb3J0X2NoYXJzZXQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTg0YTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2ltcG9ydF9jaGFyc2V0LmNzcwpAQCAtMCwwICsxLDUgQEAKK0BjaGFyc2V0ICJVVEYtOCI7CitAaW1wb3J0IHVybChmb28uY3NzKTsKKy5mb28geyBhOiBiOyB9CisKKy5iYXIgeyBhOiDRiTsgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9pbXBvcnRfY2hhcnNldF9pYm04NjYuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9pbXBvcnRfY2hhcnNldF9pYm04NjYuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTg0YTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2ltcG9ydF9jaGFyc2V0X2libTg2Ni5jc3MKQEAgLTAsMCArMSw1IEBACitAY2hhcnNldCAiVVRGLTgiOworQGltcG9ydCB1cmwoZm9vLmNzcyk7CisuZm9vIHsgYTogYjsgfQorCisuYmFyIHsgYTog0Yk7IH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvaW1wb3J0X2NvbnRlbnQuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9pbXBvcnRfY29udGVudC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3ZTNmOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvaW1wb3J0X2NvbnRlbnQuY3NzCkBAIC0wLDAgKzEgQEAKK2EgeyBiOiBjOyB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9saW5lX251bWJlcnMuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9saW5lX251bWJlcnMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjU3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL2xpbmVfbnVtYmVycy5jc3MKQEAgLTAsMCArMSw0OSBAQAorLyogbGluZSAxLCAuLi90ZW1wbGF0ZXMvbGluZV9udW1iZXJzLnNhc3MgKi8KK2ZvbyB7CisgIGJhcjogYmF6OyB9CisKKy8qIGxpbmUgNiwgLi4vdGVtcGxhdGVzL2ltcG9ydGVlLnNhc3MgKi8KK2ltcG9ydGVkIHsKKyAgb3RoZXJjb25zdDogMTI7CisgIG15Y29uc3Q6IGdvb2RieWU7IH0KKyAgLyogbGluZSA1LCAuLi90ZW1wbGF0ZXMvbGluZV9udW1iZXJzLnNhc3MgKi8KKyAgaW1wb3J0ZWQgc3F1Z2dsZSB7CisgICAgYmxhdDogYmFuZzsgfQorCisvKiBsaW5lIDMsIC4uL3RlbXBsYXRlcy9iYXNpYy5zYXNzICovCitib2R5IHsKKyAgZm9udDogQXJpYWw7CisgIGJhY2tncm91bmQ6IGJsdWU7IH0KKworLyogbGluZSA3LCAuLi90ZW1wbGF0ZXMvYmFzaWMuc2FzcyAqLworI3BhZ2UgeworICB3aWR0aDogNzAwcHg7CisgIGhlaWdodDogMTAwOyB9CisgIC8qIGxpbmUgMTAsIC4uL3RlbXBsYXRlcy9iYXNpYy5zYXNzICovCisgICNwYWdlICNoZWFkZXIgeworICAgIGhlaWdodDogMzAwcHg7IH0KKyAgICAvKiBsaW5lIDEyLCAuLi90ZW1wbGF0ZXMvYmFzaWMuc2FzcyAqLworICAgICNwYWdlICNoZWFkZXIgaDEgeworICAgICAgZm9udC1zaXplOiA1MHB4OworICAgICAgY29sb3I6IGJsdWU7IH0KKworLyogbGluZSAxOCwgLi4vdGVtcGxhdGVzL2Jhc2ljLnNhc3MgKi8KKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLmxlZnQgeworICB3aWR0aDogMTAwcHg7IH0KKy8qIGxpbmUgMjAsIC4uL3RlbXBsYXRlcy9iYXNpYy5zYXNzICovCisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci50b3AgI2NvbHVtbi5yaWdodCB7CisgIHdpZHRoOiA2MDBweDsgfQorLyogbGluZSAyMiwgLi4vdGVtcGxhdGVzL2Jhc2ljLnNhc3MgKi8KKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLmJvdHRvbSB7CisgIGJhY2tncm91bmQ6IGJyb3duOyB9CisKKy8qIGxpbmUgMTMsIC4uL3RlbXBsYXRlcy9pbXBvcnRlZS5zYXNzICovCittaWRydWxlIHsKKyAgaW50aGU6IG1pZGRsZTsgfQorCisvKiBsaW5lIDEyLCAuLi90ZW1wbGF0ZXMvbGluZV9udW1iZXJzLnNhc3MgKi8KK3VtcGggeworICBmb286IGJhcjsgfQorICAvKiBsaW5lIDE4LCAuLi90ZW1wbGF0ZXMvaW1wb3J0ZWUuc2FzcyAqLworICB1bXBoIGJheiB7CisgICAgYmxhdDogYmFuZzsgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9taXhpbnMuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9taXhpbnMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODdmOTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL21peGlucy5jc3MKQEAgLTAsMCArMSw5NSBAQAorI21haW4geworICB3aWR0aDogMTVlbTsKKyAgY29sb3I6ICMwMDAwZmY7Cit9CisjbWFpbiBwIHsKKyAgYm9yZGVyLXRvcC13aWR0aDogMnB4OworICBib3JkZXItdG9wLWNvbG9yOiAjZmMwOworICBib3JkZXItbGVmdC13aWR0aDogMXB4OworICBib3JkZXItbGVmdC1jb2xvcjogIzAwMDsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4OworICBib3JkZXItc3R5bGU6IGRvdHRlZDsKKyAgYm9yZGVyLXdpZHRoOiAycHg7Cit9CisjbWFpbiAuY29vbCB7CisgIHdpZHRoOiAxMDBweDsKK30KKworI2xlZnQgeworICBib3JkZXItdG9wLXdpZHRoOiAycHg7CisgIGJvcmRlci10b3AtY29sb3I6ICNmYzA7CisgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7CisgIGJvcmRlci1sZWZ0LWNvbG9yOiAjMDAwOworICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7CisgIGZvbnQtc2l6ZTogMmVtOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNyaWdodCB7CisgIGJvcmRlci10b3Atd2lkdGg6IDJweDsKKyAgYm9yZGVyLXRvcC1jb2xvcjogI2ZjMDsKKyAgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsKKyAgYm9yZGVyLWxlZnQtY29sb3I6ICMwMDA7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDsKKyAgY29sb3I6ICNmMDA7CisgIGZvbnQtc2l6ZTogMjBweDsKKyAgZmxvYXQ6IHJpZ2h0OworfQorCisuYm9yZGVyZWQgeworICBib3JkZXItdG9wLXdpZHRoOiAycHg7CisgIGJvcmRlci10b3AtY29sb3I6ICNmYzA7CisgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7CisgIGJvcmRlci1sZWZ0LWNvbG9yOiAjMDAwOworICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7Cit9CisKKy5jb21wbGV4IHsKKyAgY29sb3I6ICNmMDA7CisgIGZvbnQtc2l6ZTogMjBweDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorLmNvbXBsZXg6YWZ0ZXIgeworICBjb250ZW50OiAiLiI7CisgIGRpc3BsYXk6IGJsb2NrOworICBoZWlnaHQ6IDA7CisgIGNsZWFyOiBib3RoOworICB2aXNpYmlsaXR5OiBoaWRkZW47Cit9CisqIGh0bWwgLmNvbXBsZXggeworICBoZWlnaHQ6IDFweDsKKyAgY29sb3I6ICNmMDA7CisgIGZvbnQtc2l6ZTogMjBweDsKK30KKworLm1vcmUtY29tcGxleCB7CisgIGNvbG9yOiAjZjAwOworICBmb250LXNpemU6IDIwcHg7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgZGlzcGxheTogaW5saW5lOworICAtd2Via2l0LW5vbnNlbnNlLXRvcC1yaWdodDogMXB4OworICAtd2Via2l0LW5vbnNlbnNlLWJvdHRvbS1sZWZ0OiAxcHg7Cit9CisubW9yZS1jb21wbGV4OmFmdGVyIHsKKyAgY29udGVudDogIi4iOworICBkaXNwbGF5OiBibG9jazsKKyAgaGVpZ2h0OiAwOworICBjbGVhcjogYm90aDsKKyAgdmlzaWJpbGl0eTogaGlkZGVuOworfQorKiBodG1sIC5tb3JlLWNvbXBsZXggeworICBoZWlnaHQ6IDFweDsKKyAgY29sb3I6ICNmMDA7CisgIGZvbnQtc2l6ZTogMjBweDsKK30KKy5tb3JlLWNvbXBsZXggYTpob3ZlciB7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICBjb2xvcjogI2YwMDsKKyAgZm9udC1zaXplOiAyMHB4OworICBib3JkZXItdG9wLXdpZHRoOiAycHg7CisgIGJvcmRlci10b3AtY29sb3I6ICNmYzA7CisgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7CisgIGJvcmRlci1sZWZ0LWNvbG9yOiAjMDAwOworICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7Cit9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL211bHRpbGluZS5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL211bHRpbGluZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhOTUzNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvbXVsdGlsaW5lLmNzcwpAQCAtMCwwICsxLDI0IEBACisjbWFpbiwKKyNoZWFkZXIgeworICBoZWlnaHQ6IDUwcHg7IH0KKyAgI21haW4gZGl2LAorICAjaGVhZGVyIGRpdiB7CisgICAgd2lkdGg6IDEwMHB4OyB9CisgICAgI21haW4gZGl2IGEgc3BhbiwKKyAgICAjbWFpbiBkaXYgZW0gc3BhbiwKKyAgICAjaGVhZGVyIGRpdiBhIHNwYW4sCisgICAgI2hlYWRlciBkaXYgZW0gc3BhbiB7CisgICAgICBjb2xvcjogcGluazsgfQorCisjb25lIGRpdi5uZXN0ZWQsCisjb25lIHNwYW4ubmVzdGVkLAorI29uZSBwLm5lc3RlZCwKKyN0d28gZGl2Lm5lc3RlZCwKKyN0d28gc3Bhbi5uZXN0ZWQsCisjdHdvIHAubmVzdGVkLAorI3RocmVlIGRpdi5uZXN0ZWQsCisjdGhyZWUgc3Bhbi5uZXN0ZWQsCisjdGhyZWUgcC5uZXN0ZWQgeworICBmb250LXdlaWdodDogYm9sZDsKKyAgYm9yZGVyLWNvbG9yOiByZWQ7CisgIGRpc3BsYXk6IGJsb2NrOyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL25lc3RlZC5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL25lc3RlZC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZTZjMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvbmVzdGVkLmNzcwpAQCAtMCwwICsxLDIyIEBACisjbWFpbiB7CisgIHdpZHRoOiAxNWVtOworICBjb2xvcjogIzAwMDBmZjsgfQorICAjbWFpbiBwIHsKKyAgICBib3JkZXItc3R5bGU6IGRvdHRlZDsKKyAgICAvKiBOZXN0ZWQgY29tbWVudAorICAgICAqIE1vcmUgbmVzdGVkIHN0dWZmICovCisgICAgYm9yZGVyLXdpZHRoOiAycHg7IH0KKyAgI21haW4gLmNvb2wgeworICAgIHdpZHRoOiAxMDBweDsgfQorCisjbGVmdCB7CisgIGZvbnQtc2l6ZTogMmVtOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZmxvYXQ6IGxlZnQ7IH0KKworI3JpZ2h0IC5oZWFkZXIgeworICBib3JkZXItc3R5bGU6IHNvbGlkOyB9CisjcmlnaHQgLmJvZHkgeworICBib3JkZXItc3R5bGU6IGRvdHRlZDsgfQorI3JpZ2h0IC5mb290ZXIgeworICBib3JkZXItc3R5bGU6IGRhc2hlZDsgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9vcHRpb25zLmNzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvb3B0aW9ucy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4ZjRjMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvb3B0aW9ucy5jc3MKQEAgLTAsMCArMSBAQAorZm9vIHsgc3R5bGU6IGNvbXBhY3Q7IH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3BhcmVudF9yZWYuY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9wYXJlbnRfcmVmLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg0Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy9wYXJlbnRfcmVmLmNzcwpAQCAtMCwwICsxLDEzIEBACithIHsgY29sb3I6ICMwMDA7IH0KK2E6aG92ZXIgeyBjb2xvcjogI2YwMDsgfQorCitwLCBkaXYgeyB3aWR0aDogMTAwZW07IH0KK3AgZm9vLCBkaXYgZm9vIHsgd2lkdGg6IDEwZW07IH0KK3A6aG92ZXIsIHAgYmFyLCBkaXY6aG92ZXIsIGRpdiBiYXIgeyBoZWlnaHQ6IDIwZW07IH0KKworI2Nvb2wgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6IDJlbTsgfQorLmllNyAjY29vbCwgLmllNiAjY29vbCB7IGNvbnRlbnQ6IHN0cmluZygiVG90YWxseSBub3QgY29vbC4iKTsgfQorLmZpcmVmb3ggI2Nvb2wgeyBjb250ZW50OiBzdHJpbmcoIlF1aXRlIGNvb2wuIik7IH0KKworLndvdywgLnNuYXp6eSB7IGZvbnQtZmFtaWx5OiBmYW50YXN5OyB9Cisud293OmhvdmVyLCAud293OnZpc2l0ZWQsIC5zbmF6enk6aG92ZXIsIC5zbmF6enk6dmlzaXRlZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3NjcmlwdC5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3NjcmlwdC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjZjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvc2NyaXB0LmNzcwpAQCAtMCwwICsxLDE2IEBACisjbWFpbiB7IGNvbnRlbnQ6IEhlbGxvXCE7IHFzdHI6ICdRdW8idGVkIiEnOyBoc3RyOiBIeXBoLWVuXCE7IHdpZHRoOiAzMGVtOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOyBjb2xvcjogI2ZmYTsgc2hvcnQtY29sb3I6ICMxMjM7IG5hbWVkLWNvbG9yOiBvbGl2ZTsgY29uOiAiZm9vIiBiYXIgOSBoaSB0aGVyZSAiYm9vbSI7IGNvbjI6ICJub3F1byIgcXVvOyB9CisjbWFpbiAjc2lkZWJhciB7IGJhY2tncm91bmQtY29sb3I6ICMwMGZmOTg7IG51bS1ub3JtYWw6IDEwOyBudW0tZGVjOiAxMC4yOyBudW0tZGVjMDogOTk7IG51bS1uZWc6IC0xMDsgZXNjOiAxMFwrMTI7IG1hbnk6IDY7IG9yZGVyOiA3OyBjb21wbGV4OiAjNGM5ZGIxaGkxNjsgfQorCisjcGx1cyB7IG51bS1udW06IDc7IG51bS1udW0tdW46IDI1ZW07IG51bS1udW0tdW4yOiAyM2VtOyBudW0tbnVtLW5lZzogOS44NzsgbnVtLXN0cjogMTAwcHg7IG51bS1jb2w6ICNiN2I3Yjc7IG51bS1wZXJjOiAzMSU7IHN0ci1zdHI6ICJoaSB0aGVyZSI7IHN0ci1zdHIyOiAiaGkgdGhlcmUiOyBzdHItY29sOiAiMTRlbSBzb2xpZCAjMTIzIjsgc3RyLW51bTogInRpbWVzOiAxMyI7IGNvbC1udW06ICNmZjdjOWU7IGNvbC1jb2w6ICM1MTczZmY7IH0KKworI21pbnVzIHsgbnVtLW51bTogOTAwOyBjb2wtbnVtOiAjZmFmYWY1OyBjb2wtY29sOiAjMDAwMDM1OyB1bmFyeS1udW06IC0xOyB1bmFyeS1jb25zdDogMTA7IHVuYXJ5LXBhcmVuOiAtMTE7IHVuYXJ5LXR3bzogMTI7IHVuYXJ5LW1hbnk6IDEyOyB1bmFyeS1jcmF6eTogLTE1OyB9CisKKyN0aW1lcyB7IG51bS1udW06IDc7IG51bS1jb2w6ICM3NDk2Yjg7IGNvbC1udW06ICMwOTIzNDU7IGNvbC1jb2w6ICMyNDM2NDg7IH0KKworI2RpdiB7IG51bS1udW06IDMuMzMzMzMzMzMzMzsgbnVtLW51bTI6IDMuMzMzMzMzMzMzMzsgY29sLW51bTogIzA5MjM0NTsgY29sLWNvbDogIzBiMGUxMDsgY29tcDogMXB4OyB9CisKKyNtb2QgeyBudW0tbnVtOiAyOyBjb2wtY29sOiAjMGYwZTA1OyBjb2wtbnVtOiAjMDIwMDAxOyB9CisKKyNjb25zdCB7IGVzY2FwZWQtcXVvdGU6IFwkZm9vIFwhYmFyOyBkZWZhdWx0OiBIZWxsb1whICFpbXBvcnRhbnQ7IH0KKworI3JlZ3Jlc3Npb24geyBhOiA0OyB9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3Njc3NfaW1wb3J0LmNzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvc2Nzc19pbXBvcnQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjgzODIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3Njc3NfaW1wb3J0LmNzcwpAQCAtMCwwICsxLDMxIEBACitAaW1wb3J0IHVybChiYXNpYy5jc3MpOworQGltcG9ydCB1cmwoLi4vcmVzdWx0cy9jb21wbGV4LmNzcyk7CitpbXBvcnRlZCB7IG90aGVyY29uc3Q6IGhlbGxvOyBteWNvbnN0OiBnb29kYnllOyBwcmUtbWl4aW46IGhlcmU7IH0KKworYm9keSB7IGZvbnQ6IEFyaWFsOyBiYWNrZ3JvdW5kOiBibHVlOyB9CisKKyNwYWdlIHsgd2lkdGg6IDcwMHB4OyBoZWlnaHQ6IDEwMDsgfQorI3BhZ2UgI2hlYWRlciB7IGhlaWdodDogMzAwcHg7IH0KKyNwYWdlICNoZWFkZXIgaDEgeyBmb250LXNpemU6IDUwcHg7IGNvbG9yOiBibHVlOyB9CisKKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLmxlZnQgeyB3aWR0aDogMTAwcHg7IH0KKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLnRvcCAjY29sdW1uLnJpZ2h0IHsgd2lkdGg6IDYwMHB4OyB9CisjY29udGVudC51c2VyLnNob3cgI2NvbnRhaW5lci5ib3R0b20geyBiYWNrZ3JvdW5kOiBicm93bjsgfQorCittaWRydWxlIHsgaW50aGU6IG1pZGRsZTsgfQorCitzY3NzIHsgaW1wb3J0ZWQ6IHllczsgfQorCitib2R5IHsgZm9udDogQXJpYWw7IGJhY2tncm91bmQ6IGJsdWU7IH0KKworI3BhZ2UgeyB3aWR0aDogNzAwcHg7IGhlaWdodDogMTAwOyB9CisjcGFnZSAjaGVhZGVyIHsgaGVpZ2h0OiAzMDBweDsgfQorI3BhZ2UgI2hlYWRlciBoMSB7IGZvbnQtc2l6ZTogNTBweDsgY29sb3I6IGJsdWU7IH0KKworI2NvbnRlbnQudXNlci5zaG93ICNjb250YWluZXIudG9wICNjb2x1bW4ubGVmdCB7IHdpZHRoOiAxMDBweDsgfQorI2NvbnRlbnQudXNlci5zaG93ICNjb250YWluZXIudG9wICNjb2x1bW4ucmlnaHQgeyB3aWR0aDogNjAwcHg7IH0KKyNjb250ZW50LnVzZXIuc2hvdyAjY29udGFpbmVyLmJvdHRvbSB7IGJhY2tncm91bmQ6IGJyb3duOyB9CisKKyNmb28geyBiYWNrZ3JvdW5kLWNvbG9yOiAjYmFmOyB9CisKK25vbmltcG9ydGVkIHsgbXljb25zdDogaGVsbG87IG90aGVyY29uc3Q6IGdvb2RieWU7IHBvc3QtbWl4aW46IGhlcmU7IH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvc2Nzc19pbXBvcnRlZS5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3Njc3NfaW1wb3J0ZWUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZmNmNDEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3Njc3NfaW1wb3J0ZWUuY3NzCkBAIC0wLDAgKzEsMiBAQAorc2NzcyB7CisgIGltcG9ydGVkOiB5ZXM7IH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvc3ViZGlyL25lc3RlZF9zdWJkaXIvbmVzdGVkX3N1YmRpci5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3N1YmRpci9uZXN0ZWRfc3ViZGlyL25lc3RlZF9zdWJkaXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYWRjZmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3N1YmRpci9uZXN0ZWRfc3ViZGlyL25lc3RlZF9zdWJkaXIuY3NzCkBAIC0wLDAgKzEgQEAKKyNwaSB7IHdpZHRoOiAzMTRweDsgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvc3ViZGlyL3N1YmRpci5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3N1YmRpci9zdWJkaXIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQ3MjgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3N1YmRpci9zdWJkaXIuY3NzCkBAIC0wLDAgKzEsMyBAQAorI25lc3RlZCB7IHJlbGF0aXZlOiB0cnVlOyB9CisKKyNzdWJkaXIgeyBmb250LXNpemU6IDIwcHg7IGZvbnQtd2VpZ2h0OiBib2xkOyB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy91bml0cy5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3VuaXRzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTExMDJlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy91bml0cy5jc3MKQEAgLTAsMCArMSwxMSBAQAorYiB7CisgIGZvbzogNXB4OworICBiYXI6IDI0cHg7CisgIGJhejogNjYuNjY2NjY2NjY2NyU7CisgIG1hbnktdW5pdHM6IDMyZW07CisgIG1tOiAxNW1tOworICBwYzogMnBjOworICBwdDogLTcycHQ7CisgIGluY2hlczogMmluOworICBtb3JlLWluY2hlczogMy41aW47CisgIG1peGVkOiAyLjA0MTY2NjY2NjdpbjsgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvcmVzdWx0cy93YXJuLmNzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvd2Fybi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvd2Fybi5jc3MKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Jlc3VsdHMvd2Fybl9pbXBvcnRlZC5jc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3dhcm5faW1wb3J0ZWQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9yZXN1bHRzL3dhcm5faW1wb3J0ZWQuY3NzCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9zY3JpcHRfY29udmVyc2lvbl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc2NyaXB0X2NvbnZlcnNpb25fdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYmQ5YTNhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc2NyaXB0X2NvbnZlcnNpb25fdGVzdC5yYgpAQCAtMCwwICsxLDM2NSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vdGVzdF9oZWxwZXInCityZXF1aXJlICdzYXNzL2VuZ2luZScKKworY2xhc3MgU2Fzc1NjcmlwdENvbnZlcnNpb25UZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgZGVmIHRlc3RfYm9vbAorICAgIGFzc2VydF9yZW5kZXJzICJ0cnVlIgorICAgIGFzc2VydF9yZW5kZXJzICJmYWxzZSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29sb3IKKyAgICBhc3NlcnRfcmVuZGVycyAiI2FiY2RlZiIKKyAgICBhc3NlcnRfcmVuZGVycyAiYmx1ZSIKKyAgICBhc3NlcnRfcmVuZGVycyAicmdiYSgwLCAxLCAyLCAwLjIpIgorICAgIGFzc2VydF9yZW5kZXJzICIjYWJjIgorICAgIGFzc2VydF9yZW5kZXJzICIjMDAwMGZmIgorICBlbmQKKworICBkZWYgdGVzdF9udW1iZXIKKyAgICBhc3NlcnRfcmVuZGVycyAiMTAiCisgICAgYXNzZXJ0X3JlbmRlcnMgIjEwLjM1IgorICAgIGFzc2VydF9yZW5kZXJzICIxMnB4IgorICAgIGFzc2VydF9yZW5kZXJzICIxMi40NXB4IgorCisgICAgYXNzZXJ0X2VxdWFsICIxMi4zNDU2Nzg5MDEzIiwgcmVuZGVyKCIxMi4zNDU2Nzg5MDEyOSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZworICAgIGFzc2VydF9yZW5kZXJzICciZm9vIicKKyAgICBhc3NlcnRfcmVuZGVycyAnImJhciBiYXoiJworICAgIGFzc2VydF9lcXVhbCAnImJheiBiYW5nIicsIHJlbmRlcigiJ2JheiBiYW5nJyIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19xdW90ZXMKKyAgICBhc3NlcnRfZXF1YWwgIidxdW90ZVwicXVvdGUnIiwgcmVuZGVyKCcicXVvdGVcXCJxdW90ZSInKQorICAgIGFzc2VydF9lcXVhbCAnInF1b3RlXCdxdW90ZSInLCByZW5kZXIoIidxdW90ZVxcJ3F1b3RlJyIpCisgICAgYXNzZXJ0X3JlbmRlcnMgJyJxdW90ZVwncXVvdGVcXCJxdW90ZSInCisgICAgYXNzZXJ0X2VxdWFsICcicXVvdGVcJ3F1b3RlXFwicXVvdGUiJywgcmVuZGVyKCIncXVvdGVcXCdxdW90ZVwicXVvdGUnIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyaW5nX2VzY2FwZXMKKyAgICBhc3NlcnRfcmVuZGVycyAnImZvb1xcXFxiYXIiJworICBlbmQKKworICBkZWYgdGVzdF9mdW5jYWxsCisgICAgYXNzZXJ0X3JlbmRlcnMgImZvbyh0cnVlLCBibHVlKSIKKyAgICBhc3NlcnRfcmVuZGVycyAiaHNsYSgyMGRlZywgMzAlLCA1MCUsIDAuMykiCisgICAgYXNzZXJ0X3JlbmRlcnMgImJsYW0oKSIKKworICAgIGFzc2VydF9yZW5kZXJzICItXHhDM1x4QkZvbygxMnB4KSIKKyAgICBhc3NlcnRfcmVuZGVycyAiLWZvbygxMnB4KSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY2FsbF93aXRoX2tleXdvcmRfYXJncworICAgIGFzc2VydF9yZW5kZXJzICJmb28oYXJnMSwgYXJnMiwgJGthcmcxOiB2YWwsICRrYXJnMjogdmFsMikiCisgICAgYXNzZXJ0X3JlbmRlcnMgImZvbygka2FyZzE6IHZhbCwgJGthcmcyOiB2YWwyKSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY2FsbF93aXRoX2h5cGhlbl9jb252ZXJzaW9uX2tleXdvcmRfYXJnCisgICAgYXNzZXJ0X3JlbmRlcnMgImZvbygkYS1iX2M6IHZhbCkiCisgIGVuZAorCisgIGRlZiB0ZXN0X3VybAorICAgIGFzc2VydF9yZW5kZXJzICJ1cmwoZm9vLmdpZikiCisgICAgYXNzZXJ0X3JlbmRlcnMgInVybCgkdmFyKSIKKyAgICBhc3NlcnRfcmVuZGVycyAidXJsKFwjeyR2YXJ9L2ZsaXAuZ2lmKSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmFyaWFibGUKKyAgICBhc3NlcnRfcmVuZGVycyAiJGZvby1iYXIiCisgICAgYXNzZXJ0X3JlbmRlcnMgIiRmbGF6bmljYXRlIgorICBlbmQKKworICBkZWYgdGVzdF9udWxsCisgICAgYXNzZXJ0X3JlbmRlcnMgIm51bGwiCisgIGVuZAorCisgIGRlZiB0ZXN0X3NwYWNlX2xpc3QKKyAgICBhc3NlcnRfcmVuZGVycyAiZm9vIGJhciBiYXoiCisgICAgYXNzZXJ0X3JlbmRlcnMgImZvbyAoYmFyIGJheikgYmlwIgorICAgIGFzc2VydF9yZW5kZXJzICJmb28gKGJhciwgYmF6KSBiaXAiCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbW1hX2xpc3QKKyAgICBhc3NlcnRfcmVuZGVycyAiZm9vLCBiYXIsIGJheiIKKyAgICBhc3NlcnRfcmVuZGVycyAiZm9vLCAoYmFyLCBiYXopLCBiaXAiCisgICAgYXNzZXJ0X3JlbmRlcnMgImZvbywgYmFyIGJheiwgYmlwIgorICBlbmQKKworICBkZWYgdGVzdF9zcGFjZV9saXN0X2FkZHNfcGFyZW5zX2Zvcl9jbGFyaXR5CisgICAgYXNzZXJ0X3JlbmRlcnMgIigxICsgMSkgKDIgLyA0KSAoMyAqIDUpIgorICBlbmQKKworICBkZWYgdGVzdF9jb21tYV9saXN0X2RvZXNudF9hZGRfcGFyZW5zCisgICAgYXNzZXJ0X3JlbmRlcnMgIjEgKyAxLCAyIC8gNCwgMyAqIDUiCisgIGVuZAorCisgIGRlZiB0ZXN0X2VtcHR5X2xpc3QKKyAgICBhc3NlcnRfcmVuZGVycyAiKCkiCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpc3RfaW5fYXJncworICAgIGFzc2VydF9yZW5kZXJzICJmb28oKGEsIGIsIGMpKSIKKyAgICBhc3NlcnRfcmVuZGVycyAiZm9vKCRhcmc6IChhLCBiLCBjKSkiCisgICAgYXNzZXJ0X3JlbmRlcnMgImZvbyhhLCBiLCAoYSwgYiwgYykuLi4pIgorICBlbmQKKworICBkZWYgdGVzdF9zaW5nbGV0b25fbGlzdAorICAgIGFzc2VydF9yZW5kZXJzICIoMSwpIgorICAgIGFzc2VydF9yZW5kZXJzICIoMSAyIDMsKSIKKyAgICBhc3NlcnRfcmVuZGVycyAiKCgxLCAyLCAzKSwpIgorICBlbmQKKworICBkZWYgdGVzdF9tYXAKKyAgICBhc3NlcnRfcmVuZGVycyAiKGZvbzogYmFyKSIKKyAgICBhc3NlcnRfcmVuZGVycyAiKGZvbzogYmFyLCBiYXo6IGJpcCkiCisgICAgYXNzZXJ0X3JlbmRlcnMgIihmb286IGJhciwgYmF6OiAoYmlwOiBiYXApKSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX2luX2xpc3QKKyAgICBhc3NlcnRfcmVuZGVycyAiKGZvbzogYmFyKSBiYXoiCisgICAgYXNzZXJ0X3JlbmRlcnMgIihmb286IGJhciksIChiYXo6IGJpcCkiCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpc3RfaW5fbWFwCisgICAgYXNzZXJ0X3JlbmRlcnMgIihmb286IGJhciBiYXopIgorICAgIGFzc2VydF9yZW5kZXJzICIoZm9vOiAoYmFyLCBiYXopLCBiaXA6IGJvcCkiCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yCisgICAgYXNzZXJ0X3JlbmRlcnMgIiYiCisgIGVuZAorCisgIGRlZiBzZWxmLnRlc3RfcHJlY2VkZW5jZShvdXRlciwgaW5uZXIpCisgICAgb3Bfb3V0ZXIgPSBTYXNzOjpTY3JpcHQ6OkxleGVyOjpPUEVSQVRPUlNfUkVWRVJTRVtvdXRlcl0KKyAgICBvcF9pbm5lciA9IFNhc3M6OlNjcmlwdDo6TGV4ZXI6Ok9QRVJBVE9SU19SRVZFUlNFW2lubmVyXQorICAgIGNsYXNzX2V2YWwgPDxSVUJZCisgICAgICBkZWYgdGVzdF9wcmVjZWRlbmNlXyN7b3V0ZXJ9XyN7aW5uZXJ9CisgICAgICAgIGFzc2VydF9yZW5kZXJzICIkZm9vICN7b3Bfb3V0ZXJ9ICRiYXIgI3tvcF9pbm5lcn0gJGJheiIKKyAgICAgICAgYXNzZXJ0X3JlbmRlcnMgIiRmb28gI3tvcF9pbm5lcn0gJGJhciAje29wX291dGVyfSAkYmF6IgorCisgICAgICAgIGFzc2VydF9yZW5kZXJzICIoJGZvbyAje29wX291dGVyfSAkYmFyKSAje29wX2lubmVyfSAkYmF6IgorICAgICAgICBhc3NlcnRfcmVuZGVycyAiJGZvbyAje29wX2lubmVyfSAoJGJhciAje29wX291dGVyfSAkYmF6KSIKKworICAgICAgICBhc3NlcnRfZXF1YWwgIiRmb28gI3tvcF9vdXRlcn0gJGJhciAje29wX2lubmVyfSAkYmF6IiwKKyAgICAgICAgICByZW5kZXIoIiRmb28gI3tvcF9vdXRlcn0gKCRiYXIgI3tvcF9pbm5lcn0gJGJheikiKQorICAgICAgICBhc3NlcnRfZXF1YWwgIiRmb28gI3tvcF9pbm5lcn0gJGJhciAje29wX291dGVyfSAkYmF6IiwKKyAgICAgICAgICByZW5kZXIoIigkZm9vICN7b3BfaW5uZXJ9ICRiYXIpICN7b3Bfb3V0ZXJ9ICRiYXoiKQorICAgICAgZW5kCitSVUJZCisgIGVuZAorCisgIGRlZiBzZWxmLmFzc2VydF9hc3NvY2lhdGl2ZShvcF9uYW1lLCBzaWJsaW5nX25hbWUpCisgICAgb3AgPSBzZXBhcmF0b3JfZm9yKG9wX25hbWUpCisgICAgc2libGluZyA9IHNlcGFyYXRvcl9mb3Ioc2libGluZ19uYW1lKQorICAgIGNsYXNzX2V2YWwgPDxSVUJZCisgICAgICBkZWYgdGVzdF9hc3NvY2lhdGl2ZV8je29wX25hbWV9XyN7c2libGluZ19uYW1lfQorICAgICAgICBhc3NlcnRfcmVuZGVycyAiJGZvbyN7b3B9JGJhciN7b3B9JGJheiIKKworICAgICAgICBhc3NlcnRfZXF1YWwgIiRmb28je29wfSRiYXIje29wfSRiYXoiLAorICAgICAgICAgIHJlbmRlcigiJGZvbyN7b3B9KCRiYXIje29wfSRiYXopIikKKyAgICAgICAgYXNzZXJ0X2VxdWFsICIkZm9vI3tvcH0kYmFyI3tvcH0kYmF6IiwKKyAgICAgICAgICByZW5kZXIoIigkZm9vI3tvcH0kYmFyKSN7b3B9JGJheiIpCisKKyAgICAgICAgYXNzZXJ0X2VxdWFsICIkZm9vI3tvcH0kYmFyI3tzaWJsaW5nfSRiYXoiLAorICAgICAgICAgIHJlbmRlcigiJGZvbyN7b3B9KCRiYXIje3NpYmxpbmd9JGJheikiKQorICAgICAgICBhc3NlcnRfZXF1YWwgIiRmb28je3NpYmxpbmd9JGJhciN7b3B9JGJheiIsCisgICAgICAgICAgcmVuZGVyKCIoJGZvbyN7c2libGluZ30kYmFyKSN7b3B9JGJheiIpCisgICAgICBlbmQKK1JVQlkKKyAgZW5kCisKKyAgZGVmIHNlbGYuc2VwYXJhdG9yX2ZvcihvcF9uYW1lKQorICAgIGNhc2Ugb3BfbmFtZQorICAgIHdoZW4gOmNvbW1hOyAiLCAiCisgICAgd2hlbiA6c3BhY2U7ICIgIgorICAgIGVsc2U7ICIgI3tTYXNzOjpTY3JpcHQ6OkxleGVyOjpPUEVSQVRPUlNfUkVWRVJTRVtvcF9uYW1lXX0gIgorICAgIGVuZAorICBlbmQKKworICBkZWYgc2VsZi5hc3NlcnRfbm9uX2Fzc29jaWF0aXZlKG9wX25hbWUsIHNpYmxpbmdfbmFtZSkKKyAgICBvcCA9IFNhc3M6OlNjcmlwdDo6TGV4ZXI6Ok9QRVJBVE9SU19SRVZFUlNFW29wX25hbWVdCisgICAgc2libGluZyA9IFNhc3M6OlNjcmlwdDo6TGV4ZXI6Ok9QRVJBVE9SU19SRVZFUlNFW3NpYmxpbmdfbmFtZV0KKyAgICBjbGFzc19ldmFsIDw8UlVCWQorICAgICAgZGVmIHRlc3Rfbm9uX2Fzc29jaWF0aXZlXyN7b3BfbmFtZX1fI3tzaWJsaW5nX25hbWV9CisgICAgICAgIGFzc2VydF9yZW5kZXJzICIkZm9vICN7b3B9ICRiYXIgI3tvcH0gJGJheiIKKworICAgICAgICBhc3NlcnRfcmVuZGVycyAiJGZvbyAje29wfSAoJGJhciAje29wfSAkYmF6KSIKKyAgICAgICAgYXNzZXJ0X2VxdWFsICIkZm9vICN7b3B9ICRiYXIgI3tvcH0gJGJheiIsCisgICAgICAgICAgcmVuZGVyKCIoJGZvbyAje29wfSAkYmFyKSAje29wfSAkYmF6IikKKworICAgICAgICBhc3NlcnRfcmVuZGVycyAiJGZvbyAje29wfSAoJGJhciAje3NpYmxpbmd9ICRiYXopIgorICAgICAgICBhc3NlcnRfZXF1YWwgIiRmb28gI3tzaWJsaW5nfSAkYmFyICN7b3B9ICRiYXoiLAorICAgICAgICAgIHJlbmRlcigiKCRmb28gI3tzaWJsaW5nfSAkYmFyKSAje29wfSAkYmF6IikKKyAgICAgIGVuZAorUlVCWQorICBlbmQKKworICB0ZXN0X3ByZWNlZGVuY2UgOm9yLCA6YW5kCisgIHRlc3RfcHJlY2VkZW5jZSA6YW5kLCA6ZXEKKyAgdGVzdF9wcmVjZWRlbmNlIDphbmQsIDpuZXEKKyAgdGVzdF9wcmVjZWRlbmNlIDplcSwgOmd0CisgIHRlc3RfcHJlY2VkZW5jZSA6ZXEsIDpndGUKKyAgdGVzdF9wcmVjZWRlbmNlIDplcSwgOmx0CisgIHRlc3RfcHJlY2VkZW5jZSA6ZXEsIDpsdGUKKyAgdGVzdF9wcmVjZWRlbmNlIDpndCwgOnBsdXMKKyAgdGVzdF9wcmVjZWRlbmNlIDpndCwgOm1pbnVzCisgIHRlc3RfcHJlY2VkZW5jZSA6cGx1cywgOnRpbWVzCisgIHRlc3RfcHJlY2VkZW5jZSA6cGx1cywgOmRpdgorICB0ZXN0X3ByZWNlZGVuY2UgOnBsdXMsIDptb2QKKworICBhc3NlcnRfYXNzb2NpYXRpdmUgOnBsdXMsIDptaW51cworICBhc3NlcnRfYXNzb2NpYXRpdmUgOnRpbWVzLCA6ZGl2CisgIGFzc2VydF9hc3NvY2lhdGl2ZSA6dGltZXMsIDptb2QKKworICBhc3NlcnRfbm9uX2Fzc29jaWF0aXZlIDptaW51cywgOnBsdXMKKyAgYXNzZXJ0X25vbl9hc3NvY2lhdGl2ZSA6ZGl2LCA6dGltZXMKKyAgYXNzZXJ0X25vbl9hc3NvY2lhdGl2ZSA6bW9kLCA6dGltZXMKKyAgYXNzZXJ0X25vbl9hc3NvY2lhdGl2ZSA6Z3QsIDpndGUKKyAgYXNzZXJ0X25vbl9hc3NvY2lhdGl2ZSA6Z3RlLCA6bHQKKyAgYXNzZXJ0X25vbl9hc3NvY2lhdGl2ZSA6bHQsIDpsdGUKKyAgYXNzZXJ0X25vbl9hc3NvY2lhdGl2ZSA6bHRlLCA6Z3QKKworICBkZWYgdGVzdF9jb21tYV9wcmVjZWRlbmNlCisgICAgYXNzZXJ0X3JlbmRlcnMgIiRmb28sICRiYXIsICRiYXoiCisKKyAgICBhc3NlcnRfcmVuZGVycyAiJGZvbyAoJGJhciwgJGJheikiCisgICAgYXNzZXJ0X3JlbmRlcnMgIigkZm9vLCAkYmFyKSAkYmF6IgorCisgICAgYXNzZXJ0X2VxdWFsICIkZm9vLCAkYmFyICRiYXoiLCByZW5kZXIoIiRmb28sICgkYmFyICRiYXopIikKKyAgICBhc3NlcnRfZXF1YWwgIiRmb28gJGJhciwgJGJheiIsIHJlbmRlcigiKCRmb28gJGJhciksICRiYXoiKQorCisgICAgYXNzZXJ0X2VxdWFsICIkZm9vLCAoJGJhciwgJGJheikiLCByZW5kZXIoIiRmb28sICgkYmFyLCAkYmF6KSIpCisgICAgYXNzZXJ0X2VxdWFsICIoJGZvbywgJGJhciksICRiYXoiLCByZW5kZXIoIigkZm9vLCAkYmFyKSwgJGJheiIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NwYWNlX3ByZWNlZGVuY2UKKyAgICBhc3NlcnRfcmVuZGVycyAiJGZvbyAkYmFyICRiYXoiCisKKyAgICBhc3NlcnRfcmVuZGVycyAiJGZvbyBvciAoJGJhciAkYmF6KSIKKyAgICBhc3NlcnRfcmVuZGVycyAiKCRmb28gJGJhcikgb3IgJGJheiIKKworICAgIGFzc2VydF9yZW5kZXJzICIkZm9vICgkYmFyIG9yICRiYXopIgorICAgIGFzc2VydF9yZW5kZXJzICIoJGZvbyBvciAkYmFyKSAkYmF6IgorCisgICAgYXNzZXJ0X2VxdWFsICIkZm9vICgkYmFyICRiYXopIiwgcmVuZGVyKCIkZm9vICgkYmFyICRiYXopIikKKyAgICBhc3NlcnRfZXF1YWwgIigkZm9vICRiYXIpICRiYXoiLCByZW5kZXIoIigkZm9vICRiYXIpICRiYXoiKQorICBlbmQKKworICBkZWYgdGVzdF91bmFyeV9vcAorICAgIGFzc2VydF9yZW5kZXJzICItMTJweCIKKyAgICBhc3NlcnRfcmVuZGVycyAnLyJmb28iJworICAgIGFzc2VydF9yZW5kZXJzICdub3QgdHJ1ZScKKworICAgIGFzc2VydF9yZW5kZXJzICItKGZvbygxMnB4KSkiCisgICAgYXNzZXJ0X3JlbmRlcnMgIi0oLWZvbygxMnB4KSkiCisgICAgYXNzZXJ0X3JlbmRlcnMgIi0oX2ZvbygxMnB4KSkiCisgICAgYXNzZXJ0X3JlbmRlcnMgIi0oXHhDM1x4QkZvbygxMnB4KSkiCisgICAgYXNzZXJ0X3JlbmRlcnMgIi0oYmx1ZSkiCisKKyAgICBhc3NlcnRfZXF1YWwgJ25vdCB0cnVlIG9yIGZhbHNlJywgcmVuZGVyKCcobm90IHRydWUpIG9yIGZhbHNlJykKKyAgICBhc3NlcnRfZXF1YWwgJ25vdCAodHJ1ZSBvciBmYWxzZSknLCByZW5kZXIoJ25vdCAodHJ1ZSBvciBmYWxzZSknKQorICBlbmQKKworICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsICd1bnF1b3RlKCIjeyRmb299I3skYmFyfSN7JGJhen0iKScsIHJlbmRlcigiJGZvb1wjeyRiYXJ9JGJheiIpCisgICAgYXNzZXJ0X2VxdWFsICd1bnF1b3RlKCIjeyRmb299I3skYmFyfSAjeyRiYXp9IiknLCByZW5kZXIoIiRmb29cI3skYmFyfSAkYmF6IikKKyAgICBhc3NlcnRfZXF1YWwgJ3VucXVvdGUoIiN7JGZvb30gI3skYmFyfSN7JGJhen0iKScsIHJlbmRlcigiJGZvbyBcI3skYmFyfSRiYXoiKQorICAgIGFzc2VydF9yZW5kZXJzICIkZm9vIFwjeyRiYXJ9ICRiYXoiCisgICAgYXNzZXJ0X3JlbmRlcnMgIiRmb28gXCN7JGJhcn1cI3skYmFuZ30gJGJheiIKKyAgICBhc3NlcnRfcmVuZGVycyAiJGZvbyBcI3skYmFyfSBcI3skYmFuZ30gJGJheiIKKyAgICBhc3NlcnRfZXF1YWwgJ3VucXVvdGUoIiN7JGJhcn0jeyRiYXp9IiknLCByZW5kZXIoIlwjeyRiYXJ9JGJheiIpCisgICAgYXNzZXJ0X2VxdWFsICd1bnF1b3RlKCIjeyRmb299I3skYmFyfSIpJywgcmVuZGVyKCIkZm9vXCN7JGJhcn0iKQorICAgIGFzc2VydF9yZW5kZXJzICJcI3skYmFyfSIKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl9pbl9mdW5jdGlvbgorICAgIGFzc2VydF9yZW5kZXJzICdmbGFibmFiYml0KCN7MSArICJmb28ifSknCisgICAgYXNzZXJ0X2VxdWFsICdmbGFibmFiYml0KHVucXVvdGUoIiN7JGZvb30gI3sxICsgImZvbyJ9I3skYmF6fSIpKScsCisgICAgICAgICAgICAgICAgIHJlbmRlcignZmxhYm5hYmJpdCgkZm9vICN7MSArICJmb28ifSRiYXopJykKKyAgICBhc3NlcnRfcmVuZGVycyAnZmxhYm5hYmJpdCgkZm9vICN7MSArICJmb28ifSN7MiArICJiYXIifSAkYmF6KScKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl9pbl9zdHJpbmdfZnVuY3Rpb24KKyAgICBhc3NlcnRfcmVuZGVycyAnY2FsYygjezEgKyAiZm9vIn0pJworICAgIGFzc2VydF9yZW5kZXJzICdjYWxjKGZvbyN7MSArICJmb28ifWJheiknCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25fbmVhcl9vcGVyYXRvcnMKKyAgICBhc3NlcnRfcmVuZGVycyAnI3sxICsgMn0gLCAjezMgKyA0fScKKyAgICBhc3NlcnRfcmVuZGVycyAnI3sxICsgMn0sICN7MyArIDR9JworICAgIGFzc2VydF9yZW5kZXJzICcjezEgKyAyfSAsI3szICsgNH0nCisgICAgYXNzZXJ0X3JlbmRlcnMgJyN7MSArIDJ9LCN7MyArIDR9JworICAgIGFzc2VydF9yZW5kZXJzICcjezEgKyAyfSwgI3szICsgNH0sICN7NSArIDZ9JworICAgIGFzc2VydF9yZW5kZXJzICczLCAjezMgKyA0fSwgMTEnCisKKyAgICBhc3NlcnRfcmVuZGVycyAnMyAvICN7MyArIDR9JworICAgIGFzc2VydF9yZW5kZXJzICczIC8jezMgKyA0fScKKyAgICBhc3NlcnRfcmVuZGVycyAnMy8gI3szICsgNH0nCisgICAgYXNzZXJ0X3JlbmRlcnMgJzMvI3szICsgNH0nCisKKyAgICBhc3NlcnRfZXF1YWwgJ3VucXVvdGUoIiN7MSArIDJ9ICogNyIpJywgcmVuZGVyKCcjezEgKyAyfSAqIDcnKQorICAgIGFzc2VydF9lcXVhbCAndW5xdW90ZSgiI3sxICsgMn0qIDciKScsIHJlbmRlcignI3sxICsgMn0qIDcnKQorICAgIGFzc2VydF9lcXVhbCAndW5xdW90ZSgiI3sxICsgMn0gKjciKScsIHJlbmRlcignI3sxICsgMn0gKjcnKQorICAgIGFzc2VydF9lcXVhbCAndW5xdW90ZSgiI3sxICsgMn0qNyIpJywgcmVuZGVyKCcjezEgKyAyfSo3JykKKworICAgIGFzc2VydF9yZW5kZXJzICctI3sxICsgMn0nCisgICAgYXNzZXJ0X2VxdWFsICd1bnF1b3RlKCItICN7MSArIDJ9IiknLCByZW5kZXIoJy0gI3sxICsgMn0nKQorCisgICAgYXNzZXJ0X2VxdWFsICd1bnF1b3RlKCI1ICsgI3sxICsgMn0gKiAjezMgKyA0fSIpJywgcmVuZGVyKCc1ICsgI3sxICsgMn0gKiAjezMgKyA0fScpCisgICAgYXNzZXJ0X2VxdWFsICd1bnF1b3RlKCI1ICsjezEgKyAyfSAqICN7MyArIDR9IiknLCByZW5kZXIoJzUgKyN7MSArIDJ9ICogI3szICsgNH0nKQorICAgIGFzc2VydF9lcXVhbCAndW5xdW90ZSgiNSsjezEgKyAyfSAqICN7MyArIDR9IiknLCByZW5kZXIoJzUrI3sxICsgMn0gKiAjezMgKyA0fScpCisgICAgYXNzZXJ0X2VxdWFsICd1bnF1b3RlKCIjezEgKyAyfSAqICN7MyArIDR9ICsgNSIpJywgcmVuZGVyKCcjezEgKyAyfSAqICN7MyArIDR9ICsgNScpCisgICAgYXNzZXJ0X2VxdWFsICd1bnF1b3RlKCIjezEgKyAyfSAqICN7MyArIDR9KyA1IiknLCByZW5kZXIoJyN7MSArIDJ9ICogI3szICsgNH0rIDUnKQorICAgIGFzc2VydF9lcXVhbCAndW5xdW90ZSgiI3sxICsgMn0gKiAjezMgKyA0fSs1IiknLCByZW5kZXIoJyN7MSArIDJ9ICogI3szICsgNH0rNScpCisKKyAgICBhc3NlcnRfZXF1YWwgJzUgLyB1bnF1b3RlKCIjezEgKyAyfSArICN7MyArIDR9IiknLCByZW5kZXIoJzUgLyAoI3sxICsgMn0gKyAjezMgKyA0fSknKQorICAgIGFzc2VydF9lcXVhbCAnNSAvIHVucXVvdGUoIiN7MSArIDJ9ICsgI3szICsgNH0iKScsIHJlbmRlcignNSAvKCN7MSArIDJ9ICsgI3szICsgNH0pJykKKyAgICBhc3NlcnRfZXF1YWwgJzUgLyB1bnF1b3RlKCIjezEgKyAyfSArICN7MyArIDR9IiknLCByZW5kZXIoJzUgLyggI3sxICsgMn0gKyAjezMgKyA0fSApJykKKyAgICBhc3NlcnRfZXF1YWwgJ3VucXVvdGUoIiN7MSArIDJ9ICsgI3szICsgNH0iKSAvIDUnLCByZW5kZXIoJygjezEgKyAyfSArICN7MyArIDR9KSAvIDUnKQorICAgIGFzc2VydF9lcXVhbCAndW5xdW90ZSgiI3sxICsgMn0gKyAjezMgKyA0fSIpIC8gNScsIHJlbmRlcignKCN7MSArIDJ9ICsgI3szICsgNH0pLyA1JykKKyAgICBhc3NlcnRfZXF1YWwgJ3VucXVvdGUoIiN7MSArIDJ9ICsgI3szICsgNH0iKSAvIDUnLCByZW5kZXIoJyggI3sxICsgMn0gKyAjezMgKyA0fSApLyA1JykKKworICAgIGFzc2VydF9lcXVhbCAndW5xdW90ZSgiI3sxICsgMn0gKyAjezIgKyAzfSIpJywgcmVuZGVyKCcjezEgKyAyfSArIDIgKyAzJykKKyAgICBhc3NlcnRfZXF1YWwgJ3VucXVvdGUoIiN7MSArIDJ9ICsjezIgKyAzfSIpJywgcmVuZGVyKCcjezEgKyAyfSArMiArIDMnKQorICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmdfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9yZW5kZXJzICciZm9vI3skYmFyfWJheiInCisgICAgYXNzZXJ0X3JlbmRlcnMgJyJmb28gI3skYmFyfWJheiInCisgICAgYXNzZXJ0X3JlbmRlcnMgJyJmb28jeyRiYXJ9IGJheiInCisgICAgYXNzZXJ0X3JlbmRlcnMgJyJmb28gI3skYmFyfSBiYXoiJworICAgIGFzc2VydF9yZW5kZXJzICciZm9vICN7JGJhcn0jeyRiYW5nfSBiYXoiJworICAgIGFzc2VydF9yZW5kZXJzICciZm9vICN7JGJhcn0gI3skYmFuZ30gYmF6IicKKyAgICBhc3NlcnRfcmVuZGVycyAnIiN7JGJhcn1iYXoiJworICAgIGFzc2VydF9yZW5kZXJzICciZm9vI3skYmFyfSInCisgICAgYXNzZXJ0X3JlbmRlcnMgJyIjeyRiYXJ9IicKKworICAgIGFzc2VydF9yZW5kZXJzICInXCJcI3tcImJhclwifVwiJyIKKyAgICBhc3NlcnRfcmVuZGVycyAnIlwje2Jhcn0iJworCisgICAgYXNzZXJ0X2VxdWFsICciZm9vI3skYmFyfWJheiInLCByZW5kZXIoIidmb29cI3skYmFyfWJheiciKQorICBlbmQKKworICBkZWYgdGVzdF9icmFja2V0ZWRfbGlzdHMKKyAgICBhc3NlcnRfcmVuZGVycygiW10iKQorICAgIGFzc2VydF9yZW5kZXJzKCJbZm9vLCBiYXJdIikKKyAgICBhc3NlcnRfcmVuZGVycygiW1tmb29dXSIpCisgICAgYXNzZXJ0X3JlbmRlcnMoIlsoZm9vIGJhcildIikKKyAgICBhc3NlcnRfcmVuZGVycygiW2ZvbyBiYXIsXSIpCisgICAgYXNzZXJ0X3JlbmRlcnMoIlsoZm9vLCldIikKKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgIGRlZiBhc3NlcnRfcmVuZGVycyhzY3JpcHQsIG9wdGlvbnMgPSB7fSkKKyAgICBhc3NlcnRfZXF1YWwoc2NyaXB0LCByZW5kZXIoc2NyaXB0LCBvcHRpb25zKSkKKyAgZW5kCisKKyAgZGVmIHJlbmRlcihzY3JpcHQsIG9wdGlvbnMgPSB7fSkKKyAgICBtdW5nZV9maWxlbmFtZShvcHRpb25zKQorICAgIG5vZGUgPSBTYXNzOjpTY3JpcHQucGFyc2Uoc2NyaXB0LCAxLCAwLCBvcHRpb25zLm1lcmdlKDpfY29udmVydCA9PiB0cnVlKSkKKyAgICBub2RlLnRvX3Nhc3MKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3NjcmlwdF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc2NyaXB0X3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc2NzU1ZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3NjcmlwdF90ZXN0LnJiCkBAIC0wLDAgKzEsMTQyOSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vdGVzdF9oZWxwZXInCityZXF1aXJlICdzYXNzL2VuZ2luZScKKworbW9kdWxlIFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zOjpVc2VyRnVuY3Rpb25zCisgIGRlZiBhc3NlcnRfb3B0aW9ucyh2YWwpCisgICAgdmFsLm9wdGlvbnNbOmZvb10KKyAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KCJPcHRpb25zIGRlZmluZWQhIikKKyAgZW5kCisKKyAgZGVmIGFyZ19lcnJvcgorICAgIGFzc2VydF9vcHRpb25zCisgIGVuZAorZW5kCisKK21vZHVsZSBTYXNzOjpTY3JpcHQ6OkZ1bmN0aW9ucworICBpbmNsdWRlIFNhc3M6OlNjcmlwdDo6RnVuY3Rpb25zOjpVc2VyRnVuY3Rpb25zCitlbmQKKworY2xhc3MgU2Fzc1NjcmlwdFRlc3QgPCBNaW5pVGVzdDo6VGVzdAorICBpbmNsdWRlIFNhc3M6OlNjcmlwdAorCisgIGRlZiB0ZXN0X2NvbG9yX2NsYW1wc19pbnB1dAorICAgIGFzc2VydF9lcXVhbCAwLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvci5uZXcoWzEsIDIsIC0xXSkuYmx1ZQorICAgIGFzc2VydF9lcXVhbCAyNTUsIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yLm5ldyhbMjU2LCAyLCAzXSkucmVkCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbG9yX2NsYW1wc19yZ2JhX2lucHV0CisgICAgYXNzZXJ0X2VxdWFsIDEsIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yLm5ldyhbMSwgMiwgMywgMS4xXSkuYWxwaGEKKyAgICBhc3NlcnRfZXF1YWwgMCwgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IubmV3KFsxLCAyLCAzLCAtMC4xXSkuYWxwaGEKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29sb3JfZnJvbV9oZXgKKyAgICBhc3NlcnRfZXF1YWwgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IubmV3KFswLDAsMF0pLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvci5mcm9tX2hleCgnMDAwMDAwJykKKyAgICBhc3NlcnRfZXF1YWwgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IubmV3KFswLDAsMF0pLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvci5mcm9tX2hleCgnIzAwMDAwMCcpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19lc2NhcGVzCisgICAgYXNzZXJ0X2VxdWFsICInIiwgcmVzb2x2ZSgiXCInXCIiKQorICAgIGFzc2VydF9lcXVhbCAnIicsIHJlc29sdmUoIlwiXFxcIlwiIikKKyAgICBhc3NlcnRfZXF1YWwgIlxcIiwgcmVzb2x2ZSgiXCJcXFxcXCIiKQorICAgIGFzc2VydF9lcXVhbCAi4piDIiwgcmVzb2x2ZSgiXCJcXDI2MDNcIiIpCisgICAgYXNzZXJ0X2VxdWFsICLimINmIiwgcmVzb2x2ZSgiXCJcXDI2MDMgZlwiIikKKyAgICBhc3NlcnRfZXF1YWwgIuKYg3giLCByZXNvbHZlKCJcIlxcMjYwM3hcIiIpCisgICAgYXNzZXJ0X2VxdWFsICJcXDI2MDMiLCByZXNvbHZlKCJcIlxcXFwyNjAzXCIiKQorICAgIGFzc2VydF9lcXVhbCAiXCN7Zm9vfSIsIHJlc29sdmUoIlwiXFxcI3tmb299XCIiKQorCisgICAgIyBVK0ZGRkQgaXMgdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlciwgIu+/vSIuCisgICAgYXNzZXJ0X2VxdWFsIFsweEZGRkRdLnBhY2soIlUiKSwgcmVzb2x2ZSgiXCJcXDBcIiIpCisgICAgYXNzZXJ0X2VxdWFsIFsweEZGRkRdLnBhY2soIlUiKSwgcmVzb2x2ZSgiXCJcXEZGRkZGRlwiIikKKyAgICBhc3NlcnRfZXF1YWwgWzB4RkZGRF0ucGFjaygiVSIpLCByZXNvbHZlKCJcIlxcRDgwMFwiIikKKyAgICBhc3NlcnRfZXF1YWwgWzB4RDdGRl0ucGFjaygiVSIpLCByZXNvbHZlKCJcIlxcRDdGRlwiIikKKyAgICBhc3NlcnRfZXF1YWwgWzB4RkZGRF0ucGFjaygiVSIpLCByZXNvbHZlKCJcIlxcREZGRlwiIikKKyAgICBhc3NlcnRfZXF1YWwgWzB4RTAwMF0ucGFjaygiVSIpLCByZXNvbHZlKCJcIlxcRTAwMFwiIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyaW5nX2VzY2FwZXNfYXJlX3Jlc29sdmVkX2JlZm9yZV9vcGVyYXRvcnMKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCciYWJjIiA9PSAiXDYxXDYyXDYzIicpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19xdW90ZQorICAgIGFzc2VydF9lcXVhbCAnImZvbyInLCByZXNvbHZlX3F1b3RlZCgnImZvbyInKQorICAgIGFzc2VydF9lcXVhbCAiJ2ZcIm9vJyIsIHJlc29sdmVfcXVvdGVkKCciZlwib28iJykKKyAgICBhc3NlcnRfZXF1YWwgIlwiZidvb1wiIiwgcmVzb2x2ZV9xdW90ZWQoIidmXFwnb28nIikKKyAgICBhc3NlcnRfZXF1YWwgIlwiZidvXFxcIm9cIiIsIHJlc29sdmVfcXVvdGVkKCInZlxcJ29cIm8nIikKKyAgICBhc3NlcnRfZXF1YWwgJyJmb28gYmFyIicsIHJlc29sdmVfcXVvdGVkKCciZm9vXDIwIGJhciInKQorICAgIGFzc2VydF9lcXVhbCAnImZvb1xhIGJhciInLCByZXNvbHZlX3F1b3RlZCgnImZvb1xhIGJhciInKQorICAgIGFzc2VydF9lcXVhbCAnInhcYXkiJywgcmVzb2x2ZV9xdW90ZWQoJyJ4XGEgeSInKQorICAgIGFzc2VydF9lcXVhbCAnIlxhICAiJywgcmVzb2x2ZV9xdW90ZWQoJyJcYVwyMCInKQorICAgIGFzc2VydF9lcXVhbCAnIlxhIGFiY2RlZiInLCByZXNvbHZlX3F1b3RlZCgnIlxhIGFiY2RlZiInKQorICAgIGFzc2VydF9lcXVhbCAnIuKYg2FiY2RlZiInLCByZXNvbHZlX3F1b3RlZCgnIlwyNjAzIGFiY2RlZiInKQorICAgIGFzc2VydF9lcXVhbCAnIlxcXFwiJywgcmVzb2x2ZV9xdW90ZWQoJyJcXFxcIicpCisgICAgYXNzZXJ0X2VxdWFsICciZm9vYmFyIicsIHJlc29sdmVfcXVvdGVkKCJcImZvb1xcXG5iYXJcIiIpCisgICAgYXNzZXJ0X2VxdWFsICciI3tmb299IicsIHJlc29sdmVfcXVvdGVkKCJcIlxcXCN7Zm9vfVwiIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29sb3JfbmFtZXMKKyAgICBhc3NlcnRfZXF1YWwgIndoaXRlIiwgcmVzb2x2ZSgid2hpdGUiKQorICAgIGFzc2VydF9lcXVhbCAiI2ZmZmZmZiIsIHJlc29sdmUoIiNmZmZmZmYiKQorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9lcXVhbCAiI2ZmZmZmZSIsIHJlc29sdmUoIndoaXRlIC0gIzAwMDAwMSIpfQorICAgIGFzc2VydF9lcXVhbCAidHJhbnNwYXJlbnQiLCByZXNvbHZlKCJ0cmFuc3BhcmVudCIpCisgICAgYXNzZXJ0X2VxdWFsICJyZ2JhKDAsIDAsIDAsIDApIiwgcmVzb2x2ZSgicmdiYSgwLCAwLCAwLCAwKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3JnYmFfY29sb3JfbGl0ZXJhbHMKKyAgICBhc3NlcnRfZXF1YWwgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6Q29sb3IubmV3KFsxLCAyLCAzLCAwLjc1XSksIGV2YWwoInJnYmEoMSwgMiwgMywgMC43NSkiKQorICAgIGFzc2VydF9lcXVhbCAicmdiYSgxLCAyLCAzLCAwLjc1KSIsIHJlc29sdmUoInJnYmEoMSwgMiwgMywgMC43NSkiKQorCisgICAgYXNzZXJ0X2VxdWFsIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yLm5ldyhbMSwgMiwgMywgMF0pLCBldmFsKCJyZ2JhKDEsIDIsIDMsIDApIikKKyAgICBhc3NlcnRfZXF1YWwgInJnYmEoMSwgMiwgMywgMCkiLCByZXNvbHZlKCJyZ2JhKDEsIDIsIDMsIDApIikKKworICAgIGFzc2VydF9lcXVhbCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpDb2xvci5uZXcoWzEsIDIsIDNdKSwgZXZhbCgicmdiYSgxLCAyLCAzLCAxKSIpCisgICAgYXNzZXJ0X2VxdWFsIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkNvbG9yLm5ldyhbMSwgMiwgMywgMV0pLCBldmFsKCJyZ2JhKDEsIDIsIDMsIDEpIikKKyAgICBhc3NlcnRfZXF1YWwgIiMwMTAyMDMiLCByZXNvbHZlKCJyZ2JhKDEsIDIsIDMsIDEpIikKKyAgICBhc3NlcnRfZXF1YWwgIndoaXRlIiwgcmVzb2x2ZSgicmdiYSgyNTUsIDI1NSwgMjU1LCAxKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3JnYmFfY29sb3JfbWF0aAorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9lcXVhbCAicmdiYSg1MCwgNTAsIDEwMCwgMC4zNSkiLCByZXNvbHZlKCJyZ2JhKDEsIDEsIDIsIDAuMzUpICogcmdiYSg1MCwgNTAsIDUwLCAwLjM1KSIpfQorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9lcXVhbCAicmdiYSg1MiwgNTIsIDUyLCAwLjI1KSIsIHJlc29sdmUoInJnYmEoMiwgMiwgMiwgMC4yNSkgKyByZ2JhKDUwLCA1MCwgNTAsIDAuMjUpIil9CisKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIkFscGhhIGNoYW5uZWxzIG11c3QgYmUgZXF1YWw6IHJnYmEoMSwgMiwgMywgMC4xNSkgKyByZ2JhKDUwLCA1MCwgNTAsIDAuNzUpIikgZG8KKyAgICAgIHNpbGVuY2Vfd2FybmluZ3Mge3Jlc29sdmUoInJnYmEoMSwgMiwgMywgMC4xNSkgKyByZ2JhKDUwLCA1MCwgNTAsIDAuNzUpIil9CisgICAgZW5kCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJBbHBoYSBjaGFubmVscyBtdXN0IGJlIGVxdWFsOiAjMTIzNDU2ICogcmdiYSg1MCwgNTAsIDUwLCAwLjc1KSIpIGRvCisgICAgICBzaWxlbmNlX3dhcm5pbmdzIHtyZXNvbHZlKCIjMTIzNDU2ICogcmdiYSg1MCwgNTAsIDUwLCAwLjc1KSIpfQorICAgIGVuZAorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAiQWxwaGEgY2hhbm5lbHMgbXVzdCBiZSBlcXVhbDogcmdiYSg1MCwgNTAsIDUwLCAwLjc1KSAvICMxMjM0NTYiKSBkbworICAgICAgc2lsZW5jZV93YXJuaW5ncyB7cmVzb2x2ZSgicmdiYSg1MCwgNTAsIDUwLCAwLjc1KSAvICMxMjM0NTYiKX0KKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiYV9udW1iZXJfbWF0aAorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9lcXVhbCAicmdiYSg0OSwgNDksIDQ5LCAwLjc1KSIsIHJlc29sdmUoInJnYmEoNTAsIDUwLCA1MCwgMC43NSkgLSAxIil9CisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X2VxdWFsICJyZ2JhKDEwMCwgMTAwLCAxMDAsIDAuNzUpIiwgcmVzb2x2ZSgicmdiYSg1MCwgNTAsIDUwLCAwLjc1KSAqIDIiKX0KKyAgZW5kCisKKyAgZGVmIHRlc3RfcmdiYV9yb3VuZGluZworICAgIGFzc2VydF9lcXVhbCAicmdiYSgxMCwgMSwgMCwgMC4xMjM0NTY3ODkyKSIsIHJlc29sdmUoInJnYmEoMTAuMCwgMS4yMzQ1Njc4OSwgMC4wLCAwLjEyMzQ1Njc4OTE5KSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3JnYl9jYWxjCisgICAgYXNzZXJ0X2VxdWFsICJyZ2IoY2FsYygyNTUgLSA1KSwgMCwgMCkiLCByZXNvbHZlKCJyZ2IoY2FsYygyNTUgLSA1KSwgMCwgMCkiKQorICBlbmQKKworICBkZWYgdGVzdF9yZ2JhX2NhbGMKKyAgICBhc3NlcnRfZXF1YWwgInJnYmEoY2FsYygyNTUgLSA1KSwgMCwgMCwgMC4xKSIsCisgICAgICByZXNvbHZlKCJyZ2JhKGNhbGMoMjU1IC0gNSksIDAsIDAsIDAuMSkiKQorICAgIGFzc2VydF9lcXVhbCAicmdiYSgxMjcsIDAsIDAsIGNhbGMoMC4xICsgMC41KSkiLAorICAgICAgcmVzb2x2ZSgicmdiYSgxMjcsIDAsIDAsIGNhbGMoMC4xICsgMC41KSkiKQorICBlbmQKKworICBkZWYgdGVzdF9yZ2JhX3Nob3J0aGFuZF9jYWxjCisgICAgYXNzZXJ0X2VxdWFsICJyZ2JhKDI1NSwgMCwgMCwgY2FsYygwLjEgKyAwLjUpKSIsCisgICAgICByZXNvbHZlKCJyZ2JhKHJlZCwgY2FsYygwLjEgKyAwLjUpKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2hzbF9jYWxjCisgICAgYXNzZXJ0X2VxdWFsICJoc2woY2FsYygzNjAgKiA1IC8gNiksIDUwJSwgNTAlKSIsIHJlc29sdmUoImhzbChjYWxjKDM2MCAqIDUgLyA2KSwgNTAlLCA1MCUpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfaHNsYV9jYWxjCisgICAgYXNzZXJ0X2VxdWFsICJoc2xhKGNhbGMoMzYwICogNSAvIDYpLCA1MCUsIDUwJSwgMC4xKSIsCisgICAgICByZXNvbHZlKCJoc2xhKGNhbGMoMzYwICogNSAvIDYpLCA1MCUsIDUwJSwgMC4xKSIpCisgICAgYXNzZXJ0X2VxdWFsICJoc2xhKDI3MCwgNTAlLCA1MCUsIGNhbGMoMC4xICsgMC4xKSkiLAorICAgICAgcmVzb2x2ZSgiaHNsYSgyNzAsIDUwJSwgNTAlLCBjYWxjKDAuMSArIDAuMSkpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcHJlc3NlZF9jb2xvcnMKKyAgICBhc3NlcnRfZXF1YWwgIiMxMjM0NTYiLCByZXNvbHZlKCIjMTIzNDU2IiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICAgIGFzc2VydF9lcXVhbCAicmdiYSgxLDIsMywwLjUpIiwgcmVzb2x2ZSgicmdiYSgxLCAyLCAzLCAwLjUpIiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICAgIGFzc2VydF9lcXVhbCAiIzEyMyIsIHJlc29sdmUoIiMxMTIyMzMiLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCisgICAgYXNzZXJ0X2VxdWFsICIjMDAwIiwgcmVzb2x2ZSgiYmxhY2siLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCisgICAgYXNzZXJ0X2VxdWFsICJyZWQiLCByZXNvbHZlKCIjZjAwIiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICAgIGFzc2VydF9lcXVhbCAiYmx1ZSIsIHJlc29sdmUoImJsdWUiLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCisgICAgYXNzZXJ0X2VxdWFsICJuYXZ5IiwgcmVzb2x2ZSgiIzAwMDA4MCIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkKKyAgICBhc3NlcnRfZXF1YWwgIm5hdnkgI2ZmZiIsIHJlc29sdmUoIiMwMDAwODAgd2hpdGUiLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCisgICAgYXNzZXJ0X2VxdWFsICJUaGlzIGNvbG9yIGlzICNmZmYiLCByZXNvbHZlKCciVGhpcyBjb2xvciBpcyAjeyB3aGl0ZSB9IicsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkKKyAgICBhc3NlcnRfZXF1YWwgInRyYW5zcGFyZW50IiwgcmVzb2x2ZSgicmdiYSgwLCAwLCAwLCAwKSIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcHJlc3NlZF9jb21tYQorICAgICMgYXNzZXJ0X2VxdWFsICJmb28sYmFyLGJheiIsIHJlc29sdmUoImZvbywgYmFyLCBiYXoiLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCisgICAgIyBhc3NlcnRfZXF1YWwgImZvbywjYmFmLGJheiIsIHJlc29sdmUoImZvbywgI2JhZiwgYmF6IiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICAgIGFzc2VydF9lcXVhbCAiZm9vLCNiYWYscmVkIiwgcmVzb2x2ZSgiZm9vLCAjYmFmLCAjZjAwIiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICBlbmQKKworICBkZWYgdGVzdF9pbXBsaWNpdF9zdHJpbmdzCisgICAgYXNzZXJ0X2VxdWFsIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoImZvbyIpLCBldmFsKCJmb28iKQorICAgIGFzc2VydF9lcXVhbCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KCJmb28vYmFyIiksIGV2YWwoImZvby9iYXIiKQorICBlbmQKKworICBkZWYgdGVzdF9iYXNpY19pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsICJmb28zYmFyIiwgcmVzb2x2ZSgiZm9vXCN7MSArIDJ9YmFyIikKKyAgICBhc3NlcnRfZXF1YWwgImZvbzMgYmFyIiwgcmVzb2x2ZSgiZm9vXCN7MSArIDJ9IGJhciIpCisgICAgYXNzZXJ0X2VxdWFsICJmb28gM2JhciIsIHJlc29sdmUoImZvbyBcI3sxICsgMn1iYXIiKQorICAgIGFzc2VydF9lcXVhbCAiZm9vIDMgYmFyIiwgcmVzb2x2ZSgiZm9vIFwjezEgKyAyfSBiYXIiKQorICAgIGFzc2VydF9lcXVhbCAiZm9vIDM1IGJhciIsIHJlc29sdmUoImZvbyBcI3sxICsgMn1cI3syICsgM30gYmFyIikKKyAgICBhc3NlcnRfZXF1YWwgImZvbyAzIDUgYmFyIiwgcmVzb2x2ZSgiZm9vIFwjezEgKyAyfSBcI3syICsgM30gYmFyIikKKyAgICBhc3NlcnRfZXF1YWwgIjNiYXIiLCByZXNvbHZlKCJcI3sxICsgMn1iYXIiKQorICAgIGFzc2VydF9lcXVhbCAiZm9vMyIsIHJlc29sdmUoImZvb1wjezEgKyAyfSIpCisgICAgYXNzZXJ0X2VxdWFsICIzIiwgcmVzb2x2ZSgiXCN7MSArIDJ9IikKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl9pbl9mdW5jdGlvbgorICAgIGFzc2VydF9lcXVhbCAnZmxhYm5hYmJpdCgxZm9vKScsIHJlc29sdmUoJ2ZsYWJuYWJiaXQoI3sxICsgImZvbyJ9KScpCisgICAgYXNzZXJ0X2VxdWFsICdmbGFibmFiYml0KGZvbyAxZm9vYmF6KScsIHJlc29sdmUoJ2ZsYWJuYWJiaXQoZm9vICN7MSArICJmb28ifWJheiknKQorICAgIGFzc2VydF9lcXVhbCgnZmxhYm5hYmJpdChmb28gMWZvbzJiYXIgYmF6KScsCisgICAgICByZXNvbHZlKCdmbGFibmFiYml0KGZvbyAjezEgKyAiZm9vIn0jezIgKyAiYmFyIn0gYmF6KScpKQorICBlbmQKKworICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uX25lYXJfb3BlcmF0b3JzCisgICAgc2lsZW5jZV93YXJuaW5ncyBkbworICAgICAgYXNzZXJ0X2VxdWFsICczICwgNycsIHJlc29sdmUoJyN7MSArIDJ9ICwgI3szICsgNH0nKQorICAgICAgYXNzZXJ0X2VxdWFsICczLCA3JywgcmVzb2x2ZSgnI3sxICsgMn0sICN7MyArIDR9JykKKyAgICAgIGFzc2VydF9lcXVhbCAnMyAsNycsIHJlc29sdmUoJyN7MSArIDJ9ICwjezMgKyA0fScpCisgICAgICBhc3NlcnRfZXF1YWwgJzMsNycsIHJlc29sdmUoJyN7MSArIDJ9LCN7MyArIDR9JykKKyAgICAgIGFzc2VydF9lcXVhbCAnMywgNywgMTEnLCByZXNvbHZlKCcjezEgKyAyfSwgI3szICsgNH0sICN7NSArIDZ9JykKKyAgICAgIGFzc2VydF9lcXVhbCAnMywgNywgMTEnLCByZXNvbHZlKCczLCAjezMgKyA0fSwgMTEnKQorICAgICAgYXNzZXJ0X2VxdWFsICczLCA3LCAxMScsIHJlc29sdmUoJzMsIDcsICN7NSArIDZ9JykKKworICAgICAgYXNzZXJ0X2VxdWFsICczIC8gNycsIHJlc29sdmUoJzMgLyAjezMgKyA0fScpCisgICAgICBhc3NlcnRfZXF1YWwgJzMgLzcnLCByZXNvbHZlKCczIC8jezMgKyA0fScpCisgICAgICBhc3NlcnRfZXF1YWwgJzMvIDcnLCByZXNvbHZlKCczLyAjezMgKyA0fScpCisgICAgICBhc3NlcnRfZXF1YWwgJzMvNycsIHJlc29sdmUoJzMvI3szICsgNH0nKQorCisgICAgICBhc3NlcnRfZXF1YWwgJzMgKiA3JywgcmVzb2x2ZSgnI3sxICsgMn0gKiA3JykKKyAgICAgIGFzc2VydF9lcXVhbCAnMyogNycsIHJlc29sdmUoJyN7MSArIDJ9KiA3JykKKyAgICAgIGFzc2VydF9lcXVhbCAnMyAqNycsIHJlc29sdmUoJyN7MSArIDJ9ICo3JykKKyAgICAgIGFzc2VydF9lcXVhbCAnMyo3JywgcmVzb2x2ZSgnI3sxICsgMn0qNycpCisKKyAgICAgIGFzc2VydF9lcXVhbCAnLTMnLCByZXNvbHZlKCctI3sxICsgMn0nKQorICAgICAgYXNzZXJ0X2VxdWFsICctIDMnLCByZXNvbHZlKCctICN7MSArIDJ9JykKKworICAgICAgYXNzZXJ0X2VxdWFsICc1ICsgMyAqIDcnLCByZXNvbHZlKCc1ICsgI3sxICsgMn0gKiAjezMgKyA0fScpCisgICAgICBhc3NlcnRfZXF1YWwgJzUgKzMgKiA3JywgcmVzb2x2ZSgnNSArI3sxICsgMn0gKiAjezMgKyA0fScpCisgICAgICBhc3NlcnRfZXF1YWwgJzUrMyAqIDcnLCByZXNvbHZlKCc1KyN7MSArIDJ9ICogI3szICsgNH0nKQorICAgICAgYXNzZXJ0X2VxdWFsICczICogNyArIDUnLCByZXNvbHZlKCcjezEgKyAyfSAqICN7MyArIDR9ICsgNScpCisgICAgICBhc3NlcnRfZXF1YWwgJzMgKiA3KyA1JywgcmVzb2x2ZSgnI3sxICsgMn0gKiAjezMgKyA0fSsgNScpCisgICAgICBhc3NlcnRfZXF1YWwgJzMgKiA3KzUnLCByZXNvbHZlKCcjezEgKyAyfSAqICN7MyArIDR9KzUnKQorCisgICAgICBhc3NlcnRfZXF1YWwgJzUvMyArIDcnLCByZXNvbHZlKCc1IC8gKCN7MSArIDJ9ICsgI3szICsgNH0pJykKKyAgICAgIGFzc2VydF9lcXVhbCAnNS8zICsgNycsIHJlc29sdmUoJzUgLygjezEgKyAyfSArICN7MyArIDR9KScpCisgICAgICBhc3NlcnRfZXF1YWwgJzUvMyArIDcnLCByZXNvbHZlKCc1IC8oICN7MSArIDJ9ICsgI3szICsgNH0gKScpCisgICAgICBhc3NlcnRfZXF1YWwgJzMgKyA3LzUnLCByZXNvbHZlKCcoI3sxICsgMn0gKyAjezMgKyA0fSkgLyA1JykKKyAgICAgIGFzc2VydF9lcXVhbCAnMyArIDcvNScsIHJlc29sdmUoJygjezEgKyAyfSArICN7MyArIDR9KS8gNScpCisgICAgICBhc3NlcnRfZXF1YWwgJzMgKyA3LzUnLCByZXNvbHZlKCcoICN7MSArIDJ9ICsgI3szICsgNH0gKS8gNScpCisKKyAgICAgIGFzc2VydF9lcXVhbCAnMyArIDUnLCByZXNvbHZlKCcjezEgKyAyfSArIDIgKyAzJykKKyAgICAgIGFzc2VydF9lcXVhbCAnMyArNScsIHJlc29sdmUoJyN7MSArIDJ9ICsyICsgMycpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsICJmb28gYmFyLCBiYXogYmFuZyIsIHJlc29sdmUoJyJmb28gI3siYmFyIn0sICN7ImJheiJ9IGJhbmciJykKKyAgICBhc3NlcnRfZXF1YWwgImZvbyBiYXIgYmF6IGJhbmciLCByZXNvbHZlKCciZm9vICN7IiN7ImJhIiArICJyIn0gYmF6In0gYmFuZyInKQorICAgIGFzc2VydF9lcXVhbCAnZm9vICN7YmFyIGJhen0gYmFuZycsIHJlc29sdmUoJyJmb28gXCN7I3siYmEiICsgInIifSBiYXp9IGJhbmciJykKKyAgICBhc3NlcnRfZXF1YWwgJ2ZvbyAje2JheiBiYW5nJywgcmVzb2x2ZSgnImZvbyAjeyJcI3siICsgImJheiJ9IGJhbmciJykKKyAgICBhc3NlcnRfZXF1YWwgImZvbzJiYXIiLCByZXNvbHZlKCdcJ2ZvbyN7MSArIDF9YmFyXCcnKQorICAgIGFzc2VydF9lcXVhbCAiZm9vMmJhciIsIHJlc29sdmUoJyJmb28jezEgKyAxfWJhciInKQorICAgIGFzc2VydF9lcXVhbCAiZm9vMWJhcjViYXo0YmFuZyIsIHJlc29sdmUoJ1wnZm9vI3sxICsgImJhciN7MiArIDN9YmF6IiArIDR9YmFuZ1wnJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl9pbl9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsICdmb28nLCByZXNvbHZlKCcjeyN7Zm9vfX0nKQorICAgIGFzc2VydF9lcXVhbCAnZm9vJywgcmVzb2x2ZSgnIiN7I3tmb299fSInKQorICAgIGFzc2VydF9lcXVhbCAnZm9vJywgcmVzb2x2ZSgnI3siI3tmb299In0nKQorICAgIGFzc2VydF9lcXVhbCAnZm9vJywgcmVzb2x2ZSgnIiN7IiN7Zm9vfSJ9IicpCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25fd2l0aF9uZXdsaW5lCisgICAgYXNzZXJ0X2VxdWFsICJcbmJhbmciLCByZXNvbHZlKCciI3siXGEgIn1iYW5nIicpCisgICAgYXNzZXJ0X2VxdWFsICJcblxuYmFuZyIsIHJlc29sdmUoJyIjeyJcYSAifVxhIGJhbmciJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfcnVsZV9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2ZvbyBiYXIgYmF6IGJhbmcgeworICBhOiBiOyB9CitDU1MKK2ZvbyBcI3siXCN7ImJhIiArICJyIn0gYmF6In0gYmFuZworICBhOiBiCitTQVNTCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2ZvbyBbYmFyPSJcI3tiYXIgYmF6fSJdIGJhbmcgeworICBhOiBiOyB9CitDU1MKK2ZvbyBbYmFyPSJcXFwje1wjeyJiYSIgKyAiciJ9IGJhen0iXSBiYW5nCisgIGE6IGIKK1NBU1MKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorZm9vIFtiYXI9Ilwje2JheiJdIGJhbmcgeworICBhOiBiOyB9CitDU1MKK2ZvbyBbYmFyPSJcI3siXFxcI3siICsgImJheiJ9Il0gYmFuZworICBhOiBiCitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2luYWNjZXNzaWJsZV9mdW5jdGlvbnMKKyAgICBhc3NlcnRfZXF1YWwgInNlbmQodG9fcykiLCByZXNvbHZlKCJzZW5kKHRvX3MpIiwgOmxpbmUgPT4gMikKKyAgICBhc3NlcnRfZXF1YWwgInB1YmxpY19pbnN0YW5jZV9tZXRob2RzKCkiLCByZXNvbHZlKCJwdWJsaWNfaW5zdGFuY2VfbWV0aG9kcygpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfYWRkaW5nX2Z1bmN0aW9uc19kaXJlY3RseV90b19mdW5jdGlvbnNfbW9kdWxlCisgICAgYXNzZXJ0ICFGdW5jdGlvbnMuY2FsbGFibGU/KCdub25leGlzdGVudCcpCisgICAgRnVuY3Rpb25zLmNsYXNzX2V2YWwgeyBkZWYgbm9uZXhpc3RlbnQ7IGVuZCB9CisgICAgYXNzZXJ0IEZ1bmN0aW9ucy5jYWxsYWJsZT8oJ25vbmV4aXN0ZW50JykKKyAgICBGdW5jdGlvbnMuc2VuZCA6cmVtb3ZlX21ldGhvZCwgOm5vbmV4aXN0ZW50CisgIGVuZAorCisgIGRlZiB0ZXN0X2RlZmF1bHRfZnVuY3Rpb25zCisgICAgYXNzZXJ0X2VxdWFsICJ1cmwoMTIpIiwgcmVzb2x2ZSgidXJsKDEyKSIpCisgICAgYXNzZXJ0X2VxdWFsICdibGFtKCJmb28iKScsIHJlc29sdmUoJ2JsYW0oImZvbyIpJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fcmVzdWx0c19oYXZlX29wdGlvbnMKKyAgICBhc3NlcnRfZXF1YWwgIk9wdGlvbnMgZGVmaW5lZCEiLCByZXNvbHZlKCJhc3NlcnRfb3B0aW9ucyhhYnMoMSkpIikKKyAgICBhc3NlcnRfZXF1YWwgIk9wdGlvbnMgZGVmaW5lZCEiLCByZXNvbHZlKCJhc3NlcnRfb3B0aW9ucyhyb3VuZCgxLjIpKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmNhbGxfcmVxdWlyZXNfbm9fd2hpdGVzcGFjZV9iZWZvcmVfbHBhcmVuCisgICAgYXNzZXJ0X2VxdWFsICJuby1yZXBlYXQgMTVweCIsIHJlc29sdmUoIm5vLXJlcGVhdCAoN3B4ICsgOHB4KSIpCisgICAgYXNzZXJ0X2VxdWFsICJuby1yZXBlYXQoMTVweCkiLCByZXNvbHZlKCJuby1yZXBlYXQoN3B4ICsgOHB4KSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2R5bmFtaWNfdXJsCisgICAgYXNzZXJ0X2VxdWFsICJ1cmwoZm9vLWJhcikiLCByZXNvbHZlKCJ1cmwoJGZvbykiLCB7fSwgZW52KCdmb28nID0+IFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoImZvby1iYXIiKSkpCisgICAgYXNzZXJ0X2VxdWFsICJ1cmwoZm9vLWJhciBiYXopIiwgcmVzb2x2ZSgidXJsKCRmb28gJGJhcikiLCB7fSwgZW52KCdmb28nID0+IFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoImZvby1iYXIiKSwgJ2JhcicgPT4gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygiYmF6IikpKQorICAgIGFzc2VydF9lcXVhbCAidXJsKGZvbyBiYXopIiwgcmVzb2x2ZSgidXJsKGZvbyAkYmFyKSIsIHt9LCBlbnYoJ2JhcicgPT4gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygiYmF6IikpKQorICAgIGFzc2VydF9lcXVhbCAidXJsKGZvbyBiYXIpIiwgcmVzb2x2ZSgidXJsKGZvbyAgICBiYXIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXJsX3dpdGhfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9lcXVhbCAidXJsKGh0dHA6Ly9zYXNzLWxhbmcuY29tL2ltYWdlcy9mb28tYmFyKSIsIHJlc29sdmUoInVybChodHRwOi8vc2Fzcy1sYW5nLmNvbS9pbWFnZXMvXCN7Zm9vLWJhcn0pIikKKyAgICBhc3NlcnRfZXF1YWwgJ3VybCgiaHR0cDovL3Nhc3MtbGFuZy5jb20vaW1hZ2VzL2Zvby1iYXIiKScsIHJlc29sdmUoInVybCgnaHR0cDovL3Nhc3MtbGFuZy5jb20vaW1hZ2VzL1wje2Zvby1iYXJ9JykiKQorICAgIGFzc2VydF9lcXVhbCAndXJsKCJodHRwOi8vc2Fzcy1sYW5nLmNvbS9pbWFnZXMvZm9vLWJhciIpJywgcmVzb2x2ZSgndXJsKCJodHRwOi8vc2Fzcy1sYW5nLmNvbS9pbWFnZXMvI3tmb28tYmFyfSIpJykKKyAgICBhc3NlcnRfdW5xdW90ZWQgInVybChodHRwOi8vc2Fzcy1sYW5nLmNvbS9pbWFnZXMvXCN7Zm9vLWJhcn0pIgorICBlbmQKKworICBkZWYgdGVzdF9oeXBoZW5hdGVkX3ZhcmlhYmxlcworICAgIGFzc2VydF9lcXVhbCgiYS1iIiwgcmVzb2x2ZSgiJGEtYiIsIHt9LCBlbnYoImEtYiIgPT4gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygiYS1iIikpKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcnVieV9lcXVhbGl0eQorICAgIGFzc2VydF9lcXVhbCBldmFsKCciZm9vIicpLCBldmFsKCciZm9vIicpCisgICAgYXNzZXJ0X2VxdWFsIGV2YWwoJzEnKSwgZXZhbCgnMS4wJykKKyAgICBhc3NlcnRfZXF1YWwgZXZhbCgnMSAyIDMuMCcpLCBldmFsKCcxIDIgMycpCisgICAgYXNzZXJ0X2VxdWFsIGV2YWwoJzEsIDIsIDMuMCcpLCBldmFsKCcxLCAyLCAzJykKKyAgICBhc3NlcnRfZXF1YWwgZXZhbCgnKDEgMiksICgzLCA0KSwgKDUgNiknKSwgZXZhbCgnKDEgMiksICgzLCA0KSwgKDUgNiknKQorICAgIHJlZnV0ZV9lcXVhbCBldmFsKCcxLCAyLCAzJyksIGV2YWwoJzEgMiAzJykKKyAgICByZWZ1dGVfZXF1YWwgZXZhbCgnMScpLCBldmFsKCciMSInKQorICBlbmQKKworICBkZWYgdGVzdF9ib29sZWFucworICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoInRydWUiKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCJmYWxzZSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X251bGwKKyAgICBhc3NlcnRfZXF1YWwgIiIsIHJlc29sdmUoIm51bGwiKQorICBlbmQKKworICBkZWYgdGVzdF9ib29sZWFuX29wcworICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoInRydWUgYW5kIHRydWUiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoImZhbHNlIG9yIHRydWUiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoInRydWUgb3IgZmFsc2UiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoInRydWUgb3IgdHJ1ZSIpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoImZhbHNlIG9yIGZhbHNlIikKKyAgICBhc3NlcnRfZXF1YWwgImZhbHNlIiwgcmVzb2x2ZSgiZmFsc2UgYW5kIHRydWUiKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCJ0cnVlIGFuZCBmYWxzZSIpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoImZhbHNlIGFuZCBmYWxzZSIpCisKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCJub3QgZmFsc2UiKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCJub3QgdHJ1ZSIpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgibm90IG5vdCB0cnVlIikKKworICAgIGFzc2VydF9lcXVhbCAiMSIsIHJlc29sdmUoImZhbHNlIG9yIDEiKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCJmYWxzZSBhbmQgMSIpCisgICAgYXNzZXJ0X2VxdWFsICIyIiwgcmVzb2x2ZSgiMiBvciAzIikKKyAgICBhc3NlcnRfZXF1YWwgIjMiLCByZXNvbHZlKCIyIGFuZCAzIikKKworICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIm51bGwgb3IgdHJ1ZSIpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgidHJ1ZSBvciBudWxsIikKKyAgICBhc3NlcnRfZXF1YWwgIiIsIHJlc29sdmUoIm51bGwgb3IgbnVsbCIpCisgICAgYXNzZXJ0X2VxdWFsICIiLCByZXNvbHZlKCJudWxsIGFuZCB0cnVlIikKKyAgICBhc3NlcnRfZXF1YWwgIiIsIHJlc29sdmUoInRydWUgYW5kIG51bGwiKQorICAgIGFzc2VydF9lcXVhbCAiIiwgcmVzb2x2ZSgibnVsbCBhbmQgbnVsbCIpCisKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCJub3QgbnVsbCIpCisKKyAgICBhc3NlcnRfZXF1YWwgIjEiLCByZXNvbHZlKCJudWxsIG9yIDEiKQorICAgIGFzc2VydF9lcXVhbCAiIiwgcmVzb2x2ZSgibnVsbCBhbmQgMSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2FyaXRobWV0aWNfb3BzCisgICAgYXNzZXJ0X2VxdWFsICIyIiwgcmVzb2x2ZSgiMSArIDEiKQorICAgIGFzc2VydF9lcXVhbCAiMCIsIHJlc29sdmUoIjEgLSAxIikKKyAgICBhc3NlcnRfZXF1YWwgIjgiLCByZXNvbHZlKCIyICogNCIpCisgICAgYXNzZXJ0X2VxdWFsICIwLjUiLCByZXNvbHZlKCIoMiAvIDQpIikKKyAgICBhc3NlcnRfZXF1YWwgIjIiLCByZXNvbHZlKCIoNCAvIDIpIikKKworICAgIGFzc2VydF9lcXVhbCAiLTEiLCByZXNvbHZlKCItMSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N1YnRyYWN0aW9uX3ZzX21pbnVzX3ZzX2lkZW50aWZpZXIKKyAgICBhc3NlcnRfZXF1YWwgIjAuMjVlbSIsIHJlc29sdmUoIjFlbS0uNzUiKQorICAgIGFzc2VydF9lcXVhbCAiMC4yNWVtIiwgcmVzb2x2ZSgiMWVtLTAuNzUiKQorICAgIGFzc2VydF9lcXVhbCAiMWVtIC0wLjc1IiwgcmVzb2x2ZSgiMWVtIC0uNzUiKQorICAgIGFzc2VydF9lcXVhbCAiMWVtIC0wLjc1IiwgcmVzb2x2ZSgiMWVtIC0wLjc1IikKKyAgICBhc3NlcnRfZXF1YWwgIjFlbS0gMC43NSIsIHJlc29sdmUoIjFlbS0gLjc1IikKKyAgICBhc3NlcnRfZXF1YWwgIjFlbS0gMC43NSIsIHJlc29sdmUoIjFlbS0gMC43NSIpCisgICAgYXNzZXJ0X2VxdWFsICIwLjI1ZW0iLCByZXNvbHZlKCIxZW0gLSAuNzUiKQorICAgIGFzc2VydF9lcXVhbCAiMC4yNWVtIiwgcmVzb2x2ZSgiMWVtIC0gMC43NSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19vcHMKKyAgICBhc3NlcnRfZXF1YWwgJyJmb28iICJiYXIiJywgcmVzb2x2ZSgnImZvbyIgImJhciInKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSAxIiwgcmVzb2x2ZSgndHJ1ZSAxJykKKyAgICBhc3NlcnRfZXF1YWwgJyJmb28iLCAiYmFyIicsIHJlc29sdmUoIidmb28nICwgJ2JhciciKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSwgMSIsIHJlc29sdmUoJ3RydWUgLCAxJykKKyAgICBhc3NlcnRfZXF1YWwgImZvb2JhciIsIHJlc29sdmUoJyJmb28iICsgImJhciInKQorICAgIGFzc2VydF9lcXVhbCAiXG5mb29cbnh5eiIsIHJlc29sdmUoJyJcYSBmb28iICsgIlxheHl6IicpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlMSIsIHJlc29sdmUoJ3RydWUgKyAxJykKKyAgICBhc3NlcnRfZXF1YWwgJyJmb28iLSJiYXIiJywgcmVzb2x2ZSgiJ2ZvbycgLSAnYmFyJyIpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlLTEiLCByZXNvbHZlKCd0cnVlIC0gMScpCisgICAgYXNzZXJ0X2VxdWFsICciZm9vIi8iYmFyIicsIHJlc29sdmUoJyJmb28iIC8gImJhciInKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZS8xIiwgcmVzb2x2ZSgndHJ1ZSAvIDEnKQorCisgICAgYXNzZXJ0X2VxdWFsICctImJhciInLCByZXNvbHZlKCItICdiYXInIikKKyAgICBhc3NlcnRfZXF1YWwgIi10cnVlIiwgcmVzb2x2ZSgnLSB0cnVlJykKKyAgICBhc3NlcnRfZXF1YWwgJy8iYmFyIicsIHJlc29sdmUoJy8gImJhciInKQorICAgIGFzc2VydF9lcXVhbCAiL3RydWUiLCByZXNvbHZlKCcvIHRydWUnKQorICBlbmQKKworICBkZWYgdGVzdF9yZWxhdGlvbmFsX29wcworICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCIxID4gMiIpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoIjIgPiAyIikKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCIzID4gMiIpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoIjEgPj0gMiIpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiMiA+PSAyIikKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCIzID49IDIiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIjEgPCAyIikKKyAgICBhc3NlcnRfZXF1YWwgImZhbHNlIiwgcmVzb2x2ZSgiMiA8IDIiKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCIzIDwgMiIpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiMSA8PSAyIikKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCIyIDw9IDIiKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCIzIDw9IDIiKQorICBlbmQKKworICBkZWYgdGVzdF9udWxsX29wcworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLAorICAgICAgJ0ludmFsaWQgbnVsbCBvcGVyYXRpb246ICJudWxsIHBsdXMgMSIuJykge2V2YWwoIm51bGwgKyAxIil9CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsCisgICAgICAnSW52YWxpZCBudWxsIG9wZXJhdGlvbjogIm51bGwgbWludXMgMSIuJykge2V2YWwoIm51bGwgLSAxIil9CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsCisgICAgICAnSW52YWxpZCBudWxsIG9wZXJhdGlvbjogIm51bGwgdGltZXMgMSIuJykge2V2YWwoIm51bGwgKiAxIil9CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsCisgICAgICAnSW52YWxpZCBudWxsIG9wZXJhdGlvbjogIm51bGwgZGl2IDEiLicpIHtldmFsKCJudWxsIC8gMSIpfQorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLAorICAgICAgJ0ludmFsaWQgbnVsbCBvcGVyYXRpb246ICJudWxsIG1vZCAxIi4nKSB7ZXZhbCgibnVsbCAlIDEiKX0KKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwKKyAgICAgICdJbnZhbGlkIG51bGwgb3BlcmF0aW9uOiAiMSBwbHVzIG51bGwiLicpIHtldmFsKCIxICsgbnVsbCIpfQorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLAorICAgICAgJ0ludmFsaWQgbnVsbCBvcGVyYXRpb246ICIxIG1pbnVzIG51bGwiLicpIHtldmFsKCIxIC0gbnVsbCIpfQorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLAorICAgICAgJ0ludmFsaWQgbnVsbCBvcGVyYXRpb246ICIxIHRpbWVzIG51bGwiLicpIHtldmFsKCIxICogbnVsbCIpfQorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLAorICAgICAgJ0ludmFsaWQgbnVsbCBvcGVyYXRpb246ICIxIGRpdiBudWxsIi4nKSB7ZXZhbCgiMSAvIG51bGwiKX0KKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwKKyAgICAgICdJbnZhbGlkIG51bGwgb3BlcmF0aW9uOiAiMSBtb2QgbnVsbCIuJykge2V2YWwoIjEgJSBudWxsIil9CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsCisgICAgICAnSW52YWxpZCBudWxsIG9wZXJhdGlvbjogIjEgZ3QgbnVsbCIuJykge2V2YWwoIjEgPiBudWxsIil9CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsCisgICAgICAnSW52YWxpZCBudWxsIG9wZXJhdGlvbjogIm51bGwgbHQgMSIuJykge2V2YWwoIm51bGwgPCAxIil9CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsCisgICAgICAnSW52YWxpZCBudWxsIG9wZXJhdGlvbjogIm51bGwgcGx1cyBudWxsIi4nKSB7ZXZhbCgibnVsbCArIG51bGwiKX0KKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwKKyAgICAgICdJbnZhbGlkIG51bGwgb3BlcmF0aW9uOiAiImZvbyIgcGx1cyBudWxsIi4nKSB7ZXZhbCgiZm9vICsgbnVsbCIpfQorICBlbmQKKworICBkZWYgdGVzdF9lcXVhbHMKKyAgICBhc3NlcnRfZXF1YWwoInRydWUiLCByZXNvbHZlKCciZm9vIiA9PSAkZm9vJywge30sCisgICAgICAgIGVudigiZm9vIiA9PiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KCJmb28iKSkpKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIjEgPT0gMS4wIikKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCJmYWxzZSAhPSB0cnVlIikKKyAgICBhc3NlcnRfZXF1YWwgImZhbHNlIiwgcmVzb2x2ZSgiMWVtID09IDFweCIpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoIjEyICE9IDEyIikKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCIoZm9vIGJhciBiYXopID09IChmb28gYmFyIGJheikiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIihmb28sIGJhciwgYmF6KSA9PSAoZm9vLCBiYXIsIGJheikiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoJygoMSAyKSwgKDMsIDQpLCAoNSA2KSkgPT0gKCgxIDIpLCAoMywgNCksICg1IDYpKScpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgnKCgxIDIpLCAoMyA0KSkgPT0gKDEgMiwgMyA0KScpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoJygoMSAyKSAzKSA9PSAoMSAyIDMpJykKKyAgICBhc3NlcnRfZXF1YWwgImZhbHNlIiwgcmVzb2x2ZSgnKDEgKDIgMykpID09ICgxIDIgMyknKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCcoKDEsIDIpICgzLCA0KSkgPT0gKDEsIDIgMywgNCknKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCcoMSAyIDMpID09ICgxLCAyLCAzKScpCisKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCdudWxsID09IG51bGwnKQorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCcibnVsbCIgPT0gbnVsbCcpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoJzAgPT0gbnVsbCcpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoJygpID09IG51bGwnKQorCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoJ251bGwgIT0gbnVsbCcpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgnIm51bGwiICE9IG51bGwnKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoJzAgIT0gbnVsbCcpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgnKCkgIT0gbnVsbCcpCisgIGVuZAorCisgIGRlZiB0ZXN0X21vZAorICAgIGFzc2VydF9lcXVhbCAiNSIsIHJlc29sdmUoIjI5ICUgMTIiKQorICAgIGFzc2VydF9lcXVhbCAiNXB4IiwgcmVzb2x2ZSgiMjlweCAlIDEyIikKKyAgICBhc3NlcnRfZXF1YWwgIjVweCIsIHJlc29sdmUoIjI5cHggJSAxMnB4IikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfb3BlcmF0aW9uX3ByZWNlZGVuY2UKKyAgICBhc3NlcnRfZXF1YWwgImZhbHNlIHRydWUiLCByZXNvbHZlKCJ0cnVlIGFuZCBmYWxzZSBmYWxzZSBvciB0cnVlIikKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCJmYWxzZSBhbmQgdHJ1ZSBvciB0cnVlIGFuZCB0cnVlIikKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCIxID09IDIgb3IgMyA9PSAzIikKKyAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCIxIDwgMiA9PSAzID49IDMiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIjEgKyAzID4gNCAtIDIiKQorICAgIGFzc2VydF9lcXVhbCAiMTEiLCByZXNvbHZlKCIxICsgMiAqIDMgKyA0IikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25zCisgICAgYXNzZXJ0X2VxdWFsICIjODBmZjgwIiwgcmVzb2x2ZSgiaHNsKDEyMCwgMTAwJSwgNzUlKSIpCisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X2VxdWFsICIjODFmZjgxIiwgcmVzb2x2ZSgiaHNsKDEyMCwgMTAwJSwgNzUlKSArICMwMTAwMDEiKX0KKyAgZW5kCisKKyAgZGVmIHRlc3Rfb3BlcmF0b3JfdW5pdF9jb252ZXJzaW9uCisgICAgYXNzZXJ0X2VxdWFsICIxLjFjbSIsIHJlc29sdmUoIjFjbSArIDFtbSIpCisgICAgYXNzZXJ0X2VxdWFsICI4cSIsIHJlc29sdmUoIjRxICsgMW1tIikKKyAgICBhc3NlcnRfZXF1YWwgIjQwLjAyNWNtIiwgcmVzb2x2ZSgiNDBjbSArIDFxIikKKyAgICBhc3NlcnRfZXF1YWwgIjJpbiIsIHJlc29sdmUoIjFpbiArIDk2cHgiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIjJtbSA8IDFjbSIpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiMTBtbSA9PSAxY20iKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIjEuMWNtID09IDExbW0iKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIjJtbSA9PSA4cSIpCisgICAgYXNzZXJ0X2VxdWFsICJmYWxzZSIsIHJlc29sdmUoIjJweCA+IDNxIikKKworICAgIFNhc3M6OkRlcHJlY2F0aW9uLmFsbG93X2RvdWJsZV93YXJuaW5ncyBkbworICAgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7YXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiMSA9PSAxY20iKX0KK0RFUFJFQ0FUSU9OIFdBUk5JTkcgb24gbGluZSAxIG9mIHRlc3Rfb3BlcmF0b3JfdW5pdF9jb252ZXJzaW9uX2lubGluZS5zYXNzOgorVGhlIHJlc3VsdCBvZiBgMSA9PSAxY21gIHdpbGwgYmUgYGZhbHNlYCBpbiBmdXR1cmUgcmVsZWFzZXMgb2YgU2Fzcy4KK1VuaXRsZXNzIG51bWJlcnMgd2lsbCBubyBsb25nZXIgYmUgZXF1YWwgdG8gdGhlIHNhbWUgbnVtYmVycyB3aXRoIHVuaXRzLgorV0FSTklORworCisgICAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIHthc3NlcnRfZXF1YWwgImZhbHNlIiwgcmVzb2x2ZSgiMSAhPSAxY20iKX0KK0RFUFJFQ0FUSU9OIFdBUk5JTkcgb24gbGluZSAxIG9mIHRlc3Rfb3BlcmF0b3JfdW5pdF9jb252ZXJzaW9uX2lubGluZS5zYXNzOgorVGhlIHJlc3VsdCBvZiBgMSAhPSAxY21gIHdpbGwgYmUgYHRydWVgIGluIGZ1dHVyZSByZWxlYXNlcyBvZiBTYXNzLgorVW5pdGxlc3MgbnVtYmVycyB3aWxsIG5vIGxvbmdlciBiZSBlcXVhbCB0byB0aGUgc2FtZSBudW1iZXJzIHdpdGggdW5pdHMuCitXQVJOSU5HCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2xlbmd0aF91bml0cworICAgIGFzc2VydF9lcXVhbCAiMi41NCIsIHJlc29sdmUoIigxaW4vMWNtKSIpCisgICAgYXNzZXJ0X2VxdWFsICIyLjM2MjIwNDcyNDQiLCByZXNvbHZlKCIoMWNtLzFwYykiKQorICAgIGFzc2VydF9lcXVhbCAiNC4yMzMzMzMzMzMzIiwgcmVzb2x2ZSgiKDFwYy8xbW0pIikKKyAgICBhc3NlcnRfZXF1YWwgIjIuODM0NjQ1NjY5MyIsIHJlc29sdmUoIigxbW0vMXB0KSIpCisgICAgYXNzZXJ0X2VxdWFsICIxLjMzMzMzMzMzMzMiLCByZXNvbHZlKCIoMXB0LzFweCkiKQorICAgIGFzc2VydF9lcXVhbCAiMC4wMTA0MTY2NjY3IiwgcmVzb2x2ZSgiKDFweC8xaW4pIikKKyAgICBhc3NlcnRfZXF1YWwgIjEuMDU4MzMzMzMzMyIsIHJlc29sdmUoIigxcHgvMXEpIikKKyAgICBhc3NlcnRfZXF1YWwgIjAuMDU5MDU1MTE4MSIsIHJlc29sdmUoIigxcS8xcGMpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfYW5nbGVfdW5pdHMKKyAgICBhc3NlcnRfZXF1YWwgIjEuMTExMTExMTExMSIsIHJlc29sdmUoIigxZGVnLzFncmFkKSIpCisgICAgYXNzZXJ0X2VxdWFsICIwLjAxNTcwNzk2MzMiLCByZXNvbHZlKCIoMWdyYWQvMXJhZCkiKQorICAgIGFzc2VydF9lcXVhbCAiMC4xNTkxNTQ5NDMxIiwgcmVzb2x2ZSgiKDFyYWQvMXR1cm4pIikKKyAgICBhc3NlcnRfZXF1YWwgIjM2MCIsIHJlc29sdmUoIigxdHVybi8xZGVnKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3RpbWVfdW5pdHMKKyAgICBhc3NlcnRfZXF1YWwgIjEwMDAiLCByZXNvbHZlKCIoMXMvMW1zKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2ZyZXF1ZW5jeV91bml0cworICAgIGFzc2VydF9lcXVhbCAiMC4wMDEiLCByZXNvbHZlKCIoMUh6LzFrSHopIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVzb2x1dGlvbl91bml0cworICAgIGFzc2VydF9lcXVhbCAiMC4zOTM3MDA3ODc0IiwgcmVzb2x2ZSgiKDFkcGkvMWRwY20pIikKKyAgICBhc3NlcnRfZXF1YWwgIjAuMDI2NDU4MzMzMyIsIHJlc29sdmUoIigxZHBjbS8xZHBweCkiKQorICAgIGFzc2VydF9lcXVhbCAiOTYiLCByZXNvbHZlKCIoMWRwcHgvMWRwaSkiKQorICBlbmQKKworICBkZWYgdGVzdF9vcGVyYXRpb25zX2hhdmVfb3B0aW9ucworICAgIGFzc2VydF9lcXVhbCAiT3B0aW9ucyBkZWZpbmVkISIsIHJlc29sdmUoImFzc2VydF9vcHRpb25zKDEgKyAxKSIpCisgICAgYXNzZXJ0X2VxdWFsICJPcHRpb25zIGRlZmluZWQhIiwgcmVzb2x2ZSgiYXNzZXJ0X29wdGlvbnMoJ2JhcicgKyAnYmF6JykiKQorICBlbmQKKworICBkZWYgdGVzdF9zbGFzaF9jb21waWxlc19saXRlcmFsbHlfd2hlbl9sZWZ0X2Fsb25lCisgICAgYXNzZXJ0X2VxdWFsICIxcHgvMnB4IiwgcmVzb2x2ZSgiMXB4LzJweCIpCisgICAgYXNzZXJ0X2VxdWFsICIxcHgvMnB4LzNweC80cHgiLCByZXNvbHZlKCIxcHgvMnB4LzNweC80cHgiKQorCisgICAgYXNzZXJ0X2VxdWFsICIxcHgvMnB4IHJlZHB4IGJsdWVweCIsIHJlc29sdmUoIjFweC8ycHggcmVkcHggYmx1ZXB4IikKKyAgICBhc3NlcnRfZXF1YWwgImZvbyAxcHgvMnB4LzNweCBiYXIiLCByZXNvbHZlKCJmb28gMXB4LzJweC8zcHggYmFyIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2xhc2hfZGl2aWRlc193aXRoX3BhcmVucworICAgIGFzc2VydF9lcXVhbCAiMC41IiwgcmVzb2x2ZSgiKDFweC8ycHgpIikKKyAgICBhc3NlcnRfZXF1YWwgIjAuNSIsIHJlc29sdmUoIigxcHgpLzJweCIpCisgICAgYXNzZXJ0X2VxdWFsICIwLjUiLCByZXNvbHZlKCIxcHgvKDJweCkiKQorICBlbmQKKworICBkZWYgdGVzdF9zbGFzaF9kaXZpZGVzX3dpdGhfb3RoZXJfYXJpdGhtZXRpYworICAgIGFzc2VydF9lcXVhbCAiMC41cHgiLCByZXNvbHZlKCIxcHgqMXB4LzJweCIpCisgICAgYXNzZXJ0X2VxdWFsICIwLjVweCIsIHJlc29sdmUoIjFweC8ycHgqMXB4IikKKyAgICBhc3NlcnRfZXF1YWwgIjAuNSIsIHJlc29sdmUoIjArMXB4LzJweCIpCisgICAgYXNzZXJ0X2VxdWFsICIwLjUiLCByZXNvbHZlKCIxcHgvMnB4KzAiKQorICBlbmQKKworICBkZWYgdGVzdF9zbGFzaF9kaXZpZGVzX3dpdGhfdmFyaWFibGUKKyAgICBhc3NlcnRfZXF1YWwgIjAuNSIsIHJlc29sdmUoIiR2YXIvMnB4Iiwge30sIGVudigidmFyIiA9PiBldmFsKCIxcHgiKSkpCisgICAgYXNzZXJ0X2VxdWFsICIwLjUiLCByZXNvbHZlKCIxcHgvJHZhciIsIHt9LCBlbnYoInZhciIgPT4gZXZhbCgiMnB4IikpKQorICAgIGFzc2VydF9lcXVhbCAiMC41IiwgcmVzb2x2ZSgiJHZhciIsIHt9LCBlbnYoInZhciIgPT4gZXZhbCgiMXB4LzJweCIpKSkKKyAgZW5kCisKKyAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIGlzc3VlIDE3ODYuCisgIGRlZiB0ZXN0X3NsYXNoX2RpdmlzaW9uX3dpdGhpbl9saXN0CisgICAgYXNzZXJ0X2VxdWFsICIxIDEvMiAxLzIiLCByZXNvbHZlKCIoMSAxLzIgMS8yKSIpCisgICAgYXNzZXJ0X2VxdWFsICIxLzIgMS8yIiwgcmVzb2x2ZSgiKDEvMiAxLzIpIikKKyAgICBhc3NlcnRfZXF1YWwgIjEvMiIsIHJlc29sdmUoIigxLzIsKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X25vbl9pZGVudF9jb2xvcnNfd2l0aF93cm9uZ19udW1iZXJfb2ZfZGlnaXRzCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsCisgICAgICAnSW52YWxpZCBDU1MgYWZ0ZXIgIiI6IGV4cGVjdGVkIGV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSwgd2FzICIjMSInKSB7ZXZhbCgiIzEiKX0KKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwKKyAgICAgICdJbnZhbGlkIENTUyBhZnRlciAiIjogZXhwZWN0ZWQgZXhwcmVzc2lvbiAoZS5nLiAxcHgsIGJvbGQpLCB3YXMgIiMxMiInKSB7ZXZhbCgiIzEyIil9CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsCisgICAgICAnSW52YWxpZCBDU1MgYWZ0ZXIgIiI6IGV4cGVjdGVkIGV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSwgd2FzICIjMTIzNCInKSB7ZXZhbCgiIzEyMzQiKX0KKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwKKyAgICAgICdJbnZhbGlkIENTUyBhZnRlciAiIjogZXhwZWN0ZWQgZXhwcmVzc2lvbiAoZS5nLiAxcHgsIGJvbGQpLCB3YXMgIiMxMjM0NSInKSB7ZXZhbCgiIzEyMzQ1Iil9CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICdJbnZhbGlkIENTUyBhZnRlciAiIjogZXhwZWN0ZWQgZXhwcmVzc2lvbiAoZS5nLiAnIFwKKyAgICAgICcxcHgsIGJvbGQpLCB3YXMgIiMxMjM0NTY3IicpIHtldmFsKCIjMTIzNDU2NyIpfQorICBlbmQKKworICBkZWYgdGVzdF9jYXNlX2luc2Vuc2l0aXZlX2NvbG9yX25hbWVzCisgICAgYXNzZXJ0X2VxdWFsICJCTFVFIiwgcmVzb2x2ZSgiQkxVRSIpCisgICAgYXNzZXJ0X2VxdWFsICJyRWQiLCByZXNvbHZlKCJyRWQiKQorICAgIGFzc2VydF9lcXVhbCAiIzgwNDAwMCIsIHJlc29sdmUoIm1peChHckVlTiwgUmVEKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2VtcHR5X2xpc3QKKyAgICBhc3NlcnRfZXF1YWwgIjEgMiAzIiwgcmVzb2x2ZSgiMSAyICgpIDMiKQorICAgIGFzc2VydF9lcXVhbCAiMSAyIDMiLCByZXNvbHZlKCIxIDIgMyAoKSIpCisgICAgYXNzZXJ0X2VxdWFsICIxIDIgMyIsIHJlc29sdmUoIigpIDEgMiAzIikKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIigpIGlzbid0IGEgdmFsaWQgQ1NTIHZhbHVlLiIpIHtyZXNvbHZlKCIoKSIpfQorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAiKCkgaXNuJ3QgYSB2YWxpZCBDU1MgdmFsdWUuIikge3Jlc29sdmUoIm50aChhcHBlbmQoKCksICgpKSwgMSkiKX0KKyAgZW5kCisKKyAgZGVmIHRlc3RfbGlzdF93aXRoX251bGxzCisgICAgYXNzZXJ0X2VxdWFsICIxLCAyLCAzIiwgcmVzb2x2ZSgiMSwgMiwgbnVsbCwgMyIpCisgICAgYXNzZXJ0X2VxdWFsICIxIDIgMyIsIHJlc29sdmUoIjEgMiBudWxsIDMiKQorICAgIGFzc2VydF9lcXVhbCAiMSwgMiwgMyIsIHJlc29sdmUoIjEsIDIsIDMsIG51bGwiKQorICAgIGFzc2VydF9lcXVhbCAiMSAyIDMiLCByZXNvbHZlKCIxIDIgMyBudWxsIikKKyAgICBhc3NlcnRfZXF1YWwgIjEsIDIsIDMiLCByZXNvbHZlKCJudWxsLCAxLCAyLCAzIikKKyAgICBhc3NlcnRfZXF1YWwgIjEgMiAzIiwgcmVzb2x2ZSgibnVsbCAxIDIgMyIpCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF9jYW5faGF2ZV90cmFpbGluZ19jb21tYQorICAgIGFzc2VydF9lcXVhbCgiKGZvbzogMSwgYmFyOiAyKSIsIGV2YWwoIihmb286IDEsIGJhcjogMiwpIikudG9fc2FzcykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGlzdF9jYW5faGF2ZV90cmFpbGluZ19jb21tYQorICAgIGFzc2VydF9lcXVhbCgiMSwgMiwgMyIsIHJlc29sdmUoIjEsIDIsIDMsIikpCisgIGVuZAorCisgIGRlZiB0ZXN0X3RyYWlsaW5nX2NvbW1hX2RlZmluZXNfc2luZ2xldG9uX2xpc3QKKyAgICBhc3NlcnRfZXF1YWwoIjEgMiAzIiwgcmVzb2x2ZSgibnRoKCgxIDIgMywpLCAxKSIpKQorICBlbmQKKworICBkZWYgdGVzdF9tYXBfY2Fubm90X2hhdmVfZHVwbGljYXRlX2tleXMKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgJ0R1cGxpY2F0ZSBrZXkgImZvbyIgaW4gbWFwIChmb286IGJhciwgZm9vOiBiYXopLicpIGRvCisgICAgICBldmFsKCIoZm9vOiBiYXIsIGZvbzogYmF6KSIpCisgICAgZW5kCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICdEdXBsaWNhdGUga2V5ICJmb28iIGluIG1hcCAoZm9vOiBiYXIsIGZvICsgbzogYmF6KS4nKSBkbworICAgICAgZXZhbCgiKGZvbzogYmFyLCBmbyArIG86IGJheikiKQorICAgIGVuZAorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAnRHVwbGljYXRlIGtleSAiZm9vIiBpbiBtYXAgKGZvbzogYmFyLCAiZm9vIjogYmF6KS4nKSBkbworICAgICAgZXZhbCgiKGZvbzogYmFyLCAnZm9vJzogYmF6KSIpCisgICAgZW5kCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICdEdXBsaWNhdGUga2V5IDJweCBpbiBtYXAgKDJweDogYmFyLCAxcHggKyAxcHg6IGJheikuJykgZG8KKyAgICAgIGV2YWwoIigycHg6IGJhciwgMXB4ICsgMXB4OiBiYXopIikKKyAgICBlbmQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgJ0R1cGxpY2F0ZSBrZXkgIzAwMDBmZiBpbiBtYXAgKGJsdWU6IGJhciwgIzAwZjogYmF6KS4nKSBkbworICAgICAgZXZhbCgiKGJsdWU6IGJhciwgIzAwZjogYmF6KSIpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25vbl9kdXBsaWNhdGVfbWFwX2tleXMKKyAgICAjIFRoZXNlIHNob3VsZG4ndCB0aHJvdyBlcnJvcnMKKyAgICBldmFsKCIoZm9vOiBmb28sIGJhcjogYmFyKSIpCisgICAgZXZhbCgiKDJweDogZm9vLCAyOiBiYXIpIikKKyAgICBldmFsKCIoMnB4OiBmb28sIDJlbTogYmFyKSIpCisgICAgZXZhbCgiKCcycHgnOiBmb28sIDJweDogYmFyKSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF9zeW50YXhfZXJyb3JzCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICdJbnZhbGlkIENTUyBhZnRlciAiKGZvbzoiOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiKSInKSBkbworICAgICAgZXZhbCgiKGZvbzopIikKKyAgICBlbmQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgJ0ludmFsaWQgQ1NTIGFmdGVyICIoIjogZXhwZWN0ZWQgIikiLCB3YXMgIjpiYXIpIicpIGRvCisgICAgICBldmFsKCIoOmJhcikiKQorICAgIGVuZAorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAnSW52YWxpZCBDU1MgYWZ0ZXIgIihmb28sIGJhciI6IGV4cGVjdGVkICIpIiwgd2FzICI6IGJheikiJykgZG8KKyAgICAgIGV2YWwoIihmb28sIGJhcjogYmF6KSIpCisgICAgZW5kCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICdJbnZhbGlkIENTUyBhZnRlciAiKGZvbzogYmFyLCBiYXoiOiBleHBlY3RlZCAiOiIsIHdhcyAiKSInKSBkbworICAgICAgZXZhbCgiKGZvbzogYmFyLCBiYXopIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVlcF9hcmd1bWVudF9lcnJvcl9ub3RfdW53cmFwcGVkCisgICAgIyBKUnVieSAoYXMgb2YgMS42LjcuMikgb2ZmZXJzIG5vIHdheSBvZiBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuCisgICAgIyBhcmd1bWVudCBlcnJvcnMgY2F1c2VkIGJ5IHByb2dyYW1taW5nIGVycm9ycyBpbiBhIGZ1bmN0aW9uIGFuZAorICAgICMgYXJndW1lbnQgZXJyb3JzIGV4cGxpY2l0bHkgdGhyb3duIHdpdGhpbiB0aGF0IGZ1bmN0aW9uLgorICAgIHJldHVybiBpZiBSVUJZX1BMQVRGT1JNID1+IC9qYXZhLworCisgICAgIyBEb24ndCB2YWxpZGF0ZSB0aGUgbWVzc2FnZTsgaXQncyBkaWZmZXJlbnQgb24gUnViaW5pdXMuCisgICAgYXNzZXJ0X3JhaXNlcyhBcmd1bWVudEVycm9yKSB7cmVzb2x2ZSgiYXJnLWVycm9yKCkiKX0KKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2hhbGxvd19hcmd1bWVudF9lcnJvcl91bndyYXBwZWQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKDEgZm9yIDApIGZvciBgYXJnLWVycm9yJyIpIHtyZXNvbHZlKCJhcmctZXJyb3IoMSkiKX0KKyAgZW5kCisKKyAgZGVmIHRlc3RfYm9vbGVhbl9vcHNfc2hvcnRfY2lyY3VpdAorICAgIGFzc2VydF9lcXVhbCAiZmFsc2UiLCByZXNvbHZlKCIkaWUgYW5kICRpZSA8PSA3Iiwge30sIGVudignaWUnID0+IFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJvb2wubmV3KGZhbHNlKSkpCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiJGllIG9yICR1bmRlZiIsIHt9LCBlbnYoJ2llJyA9PiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCb29sLm5ldyh0cnVlKSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yCisgICAgZW52ID0gU2Fzczo6RW52aXJvbm1lbnQubmV3CisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiJiA9PSBudWxsIiwge30sIGVudikKKworICAgIGVudi5zZWxlY3RvciA9IHNlbGVjdG9yKCcuZm9vLmJhciAuYmF6LmJhbmcsIC5iaXAuYm9wJykKKyAgICBhc3NlcnRfZXF1YWwgIi5mb28uYmFyIC5iYXouYmFuZywgLmJpcC5ib3AiLCByZXNvbHZlKCImIiwge30sIGVudikKKyAgICBhc3NlcnRfZXF1YWwgIi5mb28uYmFyIC5iYXouYmFuZyIsIHJlc29sdmUoIm50aCgmLCAxKSIsIHt9LCBlbnYpCisgICAgYXNzZXJ0X2VxdWFsICIuYmlwLmJvcCIsIHJlc29sdmUoIm50aCgmLCAyKSIsIHt9LCBlbnYpCisgICAgYXNzZXJ0X2VxdWFsICIuZm9vLmJhciIsIHJlc29sdmUoIm50aChudGgoJiwgMSksIDEpIiwge30sIGVudikKKyAgICBhc3NlcnRfZXF1YWwgIi5iYXouYmFuZyIsIHJlc29sdmUoIm50aChudGgoJiwgMSksIDIpIiwge30sIGVudikKKyAgICBhc3NlcnRfZXF1YWwgIi5iaXAuYm9wIiwgcmVzb2x2ZSgibnRoKG50aCgmLCAyKSwgMSkiLCB7fSwgZW52KQorICAgIGFzc2VydF9lcXVhbCAic3RyaW5nIiwgcmVzb2x2ZSgidHlwZS1vZihudGgobnRoKCYsIDEpLCAxKSkiLCB7fSwgZW52KQorCisgICAgZW52LnNlbGVjdG9yID0gc2VsZWN0b3IoJy5mb28gPiAuYmFyJykKKyAgICBhc3NlcnRfZXF1YWwgIi5mb28gPiAuYmFyIiwgcmVzb2x2ZSgiJiIsIHt9LCBlbnYpCisgICAgYXNzZXJ0X2VxdWFsICIuZm9vID4gLmJhciIsIHJlc29sdmUoIm50aCgmLCAxKSIsIHt9LCBlbnYpCisgICAgYXNzZXJ0X2VxdWFsICIuZm9vIiwgcmVzb2x2ZSgibnRoKG50aCgmLCAxKSwgMSkiLCB7fSwgZW52KQorICAgIGFzc2VydF9lcXVhbCAiPiIsIHJlc29sdmUoIm50aChudGgoJiwgMSksIDIpIiwge30sIGVudikKKyAgICBhc3NlcnRfZXF1YWwgIi5iYXIiLCByZXNvbHZlKCJudGgobnRoKCYsIDEpLCAzKSIsIHt9LCBlbnYpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX3dpdGhfbmV3bGluZXMKKyAgICBlbnYgPSBTYXNzOjpFbnZpcm9ubWVudC5uZXcKKyAgICBlbnYuc2VsZWN0b3IgPSBzZWxlY3RvcigiLmZvby5iYXJcbi5iYXouYmFuZyxcblxuLmJpcC5ib3AiKQorICAgIGFzc2VydF9lcXVhbCAiLmZvby5iYXIgLmJhei5iYW5nLCAuYmlwLmJvcCIsIHJlc29sdmUoIiYiLCB7fSwgZW52KQorICAgIGFzc2VydF9lcXVhbCAiLmZvby5iYXIgLmJhei5iYW5nIiwgcmVzb2x2ZSgibnRoKCYsIDEpIiwge30sIGVudikKKyAgICBhc3NlcnRfZXF1YWwgIi5iaXAuYm9wIiwgcmVzb2x2ZSgibnRoKCYsIDIpIiwge30sIGVudikKKyAgICBhc3NlcnRfZXF1YWwgIi5mb28uYmFyIiwgcmVzb2x2ZSgibnRoKG50aCgmLCAxKSwgMSkiLCB7fSwgZW52KQorICAgIGFzc2VydF9lcXVhbCAiLmJhei5iYW5nIiwgcmVzb2x2ZSgibnRoKG50aCgmLCAxKSwgMikiLCB7fSwgZW52KQorICAgIGFzc2VydF9lcXVhbCAiLmJpcC5ib3AiLCByZXNvbHZlKCJudGgobnRoKCYsIDIpLCAxKSIsIHt9LCBlbnYpCisgICAgYXNzZXJ0X2VxdWFsICJzdHJpbmciLCByZXNvbHZlKCJ0eXBlLW9mKG50aChudGgoJiwgMSksIDEpKSIsIHt9LCBlbnYpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NldHRpbmdfZ2xvYmFsX3ZhcmlhYmxlX2dsb2JhbGx5CisgICAgYXNzZXJ0X25vX3dhcm5pbmcge2Fzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUywgOnN5bnRheCA9PiA6c2NzcykpfQorLmZvbyB7CisgIGE6IDE7IH0KKworLmJhciB7CisgIGI6IDI7IH0KK0NTUworJHZhcjogMTsKKworLmZvbyB7CisgIGE6ICR2YXI7Cit9CisKKyR2YXI6IDI7CisKKy5iYXIgeworICBiOiAkdmFyOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zZXR0aW5nX2dsb2JhbF92YXJpYWJsZV9sb2NhbGx5CisgICAgYXNzZXJ0X25vX3dhcm5pbmcge2Fzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUywgOnN5bnRheCA9PiA6c2NzcykpfQorLmJhciB7CisgIGE6IHg7CisgIGI6IHk7CisgIGM6IHo7IH0KK0NTUworJHZhcjE6IDE7CiskdmFyMzogMzsKKworLmZvbyB7CisgICR2YXIxOiB4ICFnbG9iYWw7CisgICR2YXIyOiB5ICFnbG9iYWw7CisgIEBlYWNoICR2YXIzIGluIF8geworICAgICR2YXIzOiB6ICFnbG9iYWw7CisgIH0KK30KKworLmJhciB7CisgIGE6ICR2YXIxOworICBiOiAkdmFyMjsKKyAgYzogJHZhcjM7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NldHRpbmdfZ2xvYmFsX3ZhcmlhYmxlX2xvY2FsbHlfd2l0aF9kZWZhdWx0CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTLCA6c3ludGF4ID0+IDpzY3NzKSkKKy5iYXIgeworICBhOiAxOworICBiOiB5OworICBjOiB6OyB9CitDU1MKKyR2YXIxOiAxOworCisuZm9vIHsKKyAgJHZhcjE6IHggIWdsb2JhbCAhZGVmYXVsdDsKKyAgJHZhcjI6IHkgIWdsb2JhbCAhZGVmYXVsdDsKKyAgQGVhY2ggJHZhcjMgaW4gXyB7CisgICAgJHZhcjM6IHogIWdsb2JhbCAhZGVmYXVsdDsKKyAgfQorfQorCisuYmFyIHsKKyAgYTogJHZhcjE7CisgIGI6ICR2YXIyOworICBjOiAkdmFyMzsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2V0dGluZ19sb2NhbF92YXJpYWJsZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUywgOnN5bnRheCA9PiA6c2NzcykpCisuYSB7CisgIHZhbHVlOiBpbnNpZGU7IH0KKworLmIgeworICB2YWx1ZTogb3V0c2lkZTsgfQorQ1NTCiskdmFyOiBvdXRzaWRlOworCisuYSB7CisgICR2YXI6IGluc2lkZTsKKyAgdmFsdWU6ICR2YXI7Cit9CisKKy5iIHsKKyAgdmFsdWU6ICR2YXI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NldHRpbmdfbG9jYWxfdmFyaWFibGVfZnJvbV9pbm5lcl9zY29wZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUywgOnN5bnRheCA9PiA6c2NzcykpCisuYSAuYiB7CisgIHZhbHVlOiBpbnNpZGU7IH0KKy5hIC5jIHsKKyAgdmFsdWU6IGluc2lkZTsgfQorQ1NTCisuYSB7CisgICR2YXI6IG91dHNpZGU7CisKKyAgLmIgeworICAgICR2YXI6IGluc2lkZTsKKyAgICB2YWx1ZTogJHZhcjsKKyAgfQorCisgIC5jIHsKKyAgICB2YWx1ZTogJHZhcjsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9pZl9jYW5fYXNzaWduX3RvX2dsb2JhbF92YXJpYWJsZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MsIDpzeW50YXggPT4gOnNjc3MpCisuYSB7CisgIGI6IDI7IH0KK0NTUworJHZhcjogMTsKK0BpZiB0cnVlIHskdmFyOiAyfQorLmEge2I6ICR2YXJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Vsc2VfY2FuX2Fzc2lnbl90b19nbG9iYWxfdmFyaWFibGVzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTLCA6c3ludGF4ID0+IDpzY3NzKQorLmEgeworICBiOiAyOyB9CitDU1MKKyR2YXI6IDE7CitAaWYgZmFsc2Uge30KK0BlbHNlIHskdmFyOiAyfQorLmEge2I6ICR2YXJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zvcl9jYW5fYXNzaWduX3RvX2dsb2JhbF92YXJpYWJsZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MsIDpzeW50YXggPT4gOnNjc3MpCisuYSB7CisgIGI6IDI7IH0KK0NTUworJHZhcjogMTsKK0Bmb3IgJGkgZnJvbSAxIHRvIDIgeyR2YXI6IDJ9CisuYSB7YjogJHZhcn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWFjaF9jYW5fYXNzaWduX3RvX2dsb2JhbF92YXJpYWJsZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MsIDpzeW50YXggPT4gOnNjc3MpCisuYSB7CisgIGI6IDI7IH0KK0NTUworJHZhcjogMTsKK0BlYWNoICRhIGluIDEgeyR2YXI6IDJ9CisuYSB7YjogJHZhcn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfd2hpbGVfY2FuX2Fzc2lnbl90b19nbG9iYWxfdmFyaWFibGVzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTLCA6c3ludGF4ID0+IDpzY3NzKQorLmEgeworICBiOiAyOyB9CitDU1MKKyR2YXI6IDE7CitAd2hpbGUgJHZhciAhPSAyIHskdmFyOiAyfQorLmEge2I6ICR2YXJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2lmX2RvZXNudF9sZWFrX2xvY2FsX3ZhcmlhYmxlcworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAnVW5kZWZpbmVkIHZhcmlhYmxlOiAiJHZhciIuJykgZG8KKyAgICAgIHJlbmRlcig8PFNDU1MsIDpzeW50YXggPT4gOnNjc3MpCitAaWYgdHJ1ZSB7JHZhcjogMX0KKy5hIHtiOiAkdmFyfQorU0NTUworICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9lbHNlX2RvZXNudF9sZWFrX2xvY2FsX3ZhcmlhYmxlcworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAnVW5kZWZpbmVkIHZhcmlhYmxlOiAiJHZhciIuJykgZG8KKyAgICAgIHJlbmRlcig8PFNDU1MsIDpzeW50YXggPT4gOnNjc3MpCitAaWYgZmFsc2Uge30KK0BlbHNlIHskdmFyOiAxfQorLmEge2I6ICR2YXJ9CitTQ1NTCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zvcl9kb2VzbnRfbGVha19sb2NhbF92YXJpYWJsZXMKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgJ1VuZGVmaW5lZCB2YXJpYWJsZTogIiR2YXIiLicpIGRvCisgICAgICByZW5kZXIoPDxTQ1NTLCA6c3ludGF4ID0+IDpzY3NzKQorQGZvciAkaSBmcm9tIDEgdG8gMiB7JHZhcjogMX0KKy5hIHtiOiAkdmFyfQorU0NTUworICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9lYWNoX2RvZXNudF9sZWFrX2xvY2FsX3ZhcmlhYmxlcworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAnVW5kZWZpbmVkIHZhcmlhYmxlOiAiJHZhciIuJykgZG8KKyAgICAgIHJlbmRlcig8PFNDU1MsIDpzeW50YXggPT4gOnNjc3MpCitAZWFjaCAkYSBpbiAxIHskdmFyOiAxfQorLmEge2I6ICR2YXJ9CitTQ1NTCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X3doaWxlX2RvZXNudF9sZWFrX2xvY2FsX3ZhcmlhYmxlcworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAnVW5kZWZpbmVkIHZhcmlhYmxlOiAiJHZhciIuJykgZG8KKyAgICAgIHJlbmRlcig8PFNDU1MsIDpzeW50YXggPT4gOnNjc3MpCiskaXRlcjogdHJ1ZTsKK0B3aGlsZSAkaXRlciB7CisgICR2YXI6IDE7CisgICRpdGVyOiBmYWxzZTsKK30KKy5hIHtiOiAkdmFyfQorU0NTUworICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9jb2xvcl9mb3JtYXRfaXNfcHJlc2VydmVkX2J5X2RlZmF1bHQKKyAgICBhc3NlcnRfZXF1YWwgImJsdWUiLCByZXNvbHZlKCJibHVlIikKKyAgICBhc3NlcnRfZXF1YWwgImJMdUUiLCByZXNvbHZlKCJiTHVFIikKKyAgICBhc3NlcnRfZXF1YWwgIiMwMGYiLCByZXNvbHZlKCIjMDBmIikKKyAgICBhc3NlcnRfZXF1YWwgImJsdWUgIzAwRiIsIHJlc29sdmUoImJsdWUgIzAwRiIpCisgICAgYXNzZXJ0X2VxdWFsICJibHVlIiwgcmVzb2x2ZSgibnRoKGJsdWUgIzAwRiwgMSkiKQorICAgIGFzc2VydF9lcXVhbCAiIzAwRiIsIHJlc29sdmUoIm50aChibHVlICMwMEYsIDIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29sb3JfZm9ybWF0X2lzbnRfYWx3YXlzX3ByZXNlcnZlZF9pbl9jb21wcmVzc2VkX3N0eWxlCisgICAgYXNzZXJ0X2VxdWFsICJyZWQiLCByZXNvbHZlKCJyZWQiLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCisgICAgYXNzZXJ0X2VxdWFsICJyZWQiLCByZXNvbHZlKCIjZjAwIiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICAgIGFzc2VydF9lcXVhbCAicmVkIHJlZCIsIHJlc29sdmUoInJlZCAjZjAwIiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICAgIGFzc2VydF9lcXVhbCAicmVkIiwgcmVzb2x2ZSgibnRoKHJlZCAjZjAwLCAyKSIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29sb3JfZm9ybWF0X2lzX3NvbWV0aW1lc19wcmVzZXJ2ZWRfaW5fY29tcHJlc3NlZF9zdHlsZQorICAgIGFzc2VydF9lcXVhbCAiUmVEIiwgcmVzb2x2ZSgiUmVEIiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICAgIGFzc2VydF9lcXVhbCAiYmx1ZSIsIHJlc29sdmUoImJsdWUiLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCisgICAgYXNzZXJ0X2VxdWFsICIjMDBmIiwgcmVzb2x2ZSgiIzAwZiIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29sb3JfZm9ybWF0X2lzbnRfcHJlc2VydmVkX3doZW5fbW9kaWZpZWQKKyAgICBhc3NlcnRfZXF1YWwgIm1hZ2VudGEiLCByZXNvbHZlKCJjaGFuZ2UtY29sb3IoI2YwMCwgJGJsdWU6IDI1NSkiKQorICBlbmQKKworICBkZWYgdGVzdF9pZHMKKyAgICBhc3NlcnRfZXF1YWwgIiNmb28iLCByZXNvbHZlKCIjZm9vIikKKyAgICBhc3NlcnRfZXF1YWwgIiNhYmNkIiwgcmVzb2x2ZSgiI2FiY2QiKQorICAgIGFzc2VydF9lcXVhbCAiI2FiYy1kZWYiLCByZXNvbHZlKCIjYWJjLWRlZiIpCisgICAgYXNzZXJ0X2VxdWFsICIjYWJjX2RlZiIsIHJlc29sdmUoIiNhYmNfZGVmIikKKyAgICBhc3NlcnRfZXF1YWwgIiN1dncteHl6IiwgcmVzb2x2ZSgiI3V2dy14eXoiKQorICAgIGFzc2VydF9lcXVhbCAiI3V2d194eXoiLCByZXNvbHZlKCIjdXZ3X3h5eiIpCisgICAgYXNzZXJ0X2VxdWFsICIjdXZ3eHl6IiwgcmVzb2x2ZSgiI3V2dyArIHh5eiIpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NjaWVudGlmaWNfbm90YXRpb24KKyAgICBhc3NlcnRfZXF1YWwgIjIwMDAiLCByZXNvbHZlKCIyZTMiKQorICAgIGFzc2VydF9lcXVhbCAiMjAwMCIsIHJlc29sdmUoIjJFMyIpCisgICAgYXNzZXJ0X2VxdWFsICIyMDAwIiwgcmVzb2x2ZSgiMmUrMyIpCisgICAgYXNzZXJ0X2VxdWFsICIyMDAwZW0iLCByZXNvbHZlKCIyZTNlbSIpCisgICAgYXNzZXJ0X2VxdWFsICIyNTAwMDAwMDAwMCIsIHJlc29sdmUoIjIuNWUxMCIpCisgICAgYXNzZXJ0X2VxdWFsICIwLjEyMzQiLCByZXNvbHZlKCIxMjM0ZS00IikKKyAgICBhc3NlcnRfZXF1YWwgIjEyLjM0IiwgcmVzb2x2ZSgiMS4yMzRlMSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2lkZW50aWZpZXJfdW5pdHMKKyAgICBhc3NlcnRfZXF1YWwgIjUtZm9vIiwgcmVzb2x2ZSgiMi1mb28gKyAzLWZvbyIpCisgICAgYXNzZXJ0X2VxdWFsICI1LWZvby0iLCByZXNvbHZlKCIyLWZvby0gKyAzLWZvby0iKQorICAgIGFzc2VydF9lcXVhbCAiNS1cXHUyNjAzIiwgcmVzb2x2ZSgiMi1cXHUyNjAzICsgMy1cXHUyNjAzIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfYmFja3NsYXNoX25ld2xpbmVfaW5fc3RyaW5nCisgICAgYXNzZXJ0X2VxdWFsICdmb29iYXInLCByZXNvbHZlKCJcImZvb1xcXG5iYXJcIiIpCisgICAgYXNzZXJ0X2VxdWFsICdmb29iYXInLCByZXNvbHZlKCInZm9vXFxcbmJhciciKQorICBlbmQKKworICBkZWYgdGVzdF91bmNsb3NlZF9zcGVjaWFsX2Z1bgorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAnSW52YWxpZCBDU1MgYWZ0ZXIgImNhbGMoZm9vKCkiOiBleHBlY3RlZCAiKSIsIHdhcyAiIicpIGRvCisgICAgICByZXNvbHZlKCJjYWxjKGZvbygpIikKKyAgICBlbmQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgJ0ludmFsaWQgQ1NTIGFmdGVyICJjYWxjKCN7XCcpXCd9IjogZXhwZWN0ZWQgIikiLCB3YXMgIiInKSBkbworICAgICAgcmVzb2x2ZSgiY2FsYyhcI3snKSd9IikKKyAgICBlbmQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgJ0ludmFsaWQgQ1NTIGFmdGVyICJjYWxjKCN7Zm9vIjogZXhwZWN0ZWQgIn0iLCB3YXMgIiInKSBkbworICAgICAgcmVzb2x2ZSgiY2FsYyhcI3tmb28iKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9zcGVjaWFsX2Z1bl93aXRoX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgImNhbGMoKSkiLCByZXNvbHZlKCJjYWxjKFwjeycpJ30pIikKKyAgICBhc3NlcnRfZXF1YWwgImNhbGMoIyB7Zm9vfSkiLCByZXNvbHZlKCJjYWxjKCMge2Zvb30pIikKKyAgZW5kCisKKyAgIyBSZWdyZXNzaW9uIFRlc3RzCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl9hZnRlcl9zdHJpbmcKKyAgICBhc3NlcnRfZXF1YWwgJyJmb29iYXIiIDInLCByZXNvbHZlKCciZm9vYmFyIiAjezJ9JykKKyAgICBhc3NlcnRfZXF1YWwgImNhbGMoMSArIDIpIDMiLCByZXNvbHZlKCdjYWxjKDEgKyAyKSAjezN9JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVwZWF0ZWRseV9tb2RpZmllZF9jb2xvcgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCithIHsKKyAgbGluay1jb2xvcjogIzE2MUMxNDsKKyAgbGluay1jb2xvci1ob3ZlcjogYmxhY2s7CisgIGxpbmstY29sb3ItdGFwOiByZ2JhKDIyLCAyOCwgMjAsIDAuMyk7IH0KK0NTUworJGdyZWVuOiAjMTYxQzE0CiskbGluay1jb2xvcjogJGdyZWVuCiskbGluay1jb2xvci1ob3ZlcjogZGFya2VuKCRsaW5rLWNvbG9yLCAxMCUpCiskbGluay1jb2xvci10YXA6IHJnYmEoJGdyZWVuLCAwLjMpCisKK2EKKyAgbGluay1jb2xvcjogJGxpbmstY29sb3IKKyAgbGluay1jb2xvci1ob3ZlcjogJGxpbmstY29sb3ItaG92ZXIKKyAgbGluay1jb2xvci10YXA6ICRsaW5rLWNvbG9yLXRhcAorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9pbnNwZWN0X2RpdmlkZWRfbnVtYmVycworICAgIGFzc2VydF9lcXVhbCAiMXB4LzJweCIsIHJlc29sdmUoImluc3BlY3QoMXB4LzJweCkiKQorICAgIGFzc2VydF9lcXVhbCAiMC41IiwgcmVzb2x2ZSgiaW5zcGVjdCgoMXB4LzJweCkpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWludXNfd2l0aG91dF93aGl0ZXNwYWNlCisgICAgYXNzZXJ0X2VxdWFsICI1cHgiLCByZXNvbHZlKCIxNXB4LTEwcHgiKQorICAgIGFzc2VydF9lcXVhbCAiNXB4LSIsIHJlc29sdmUoIjE1cHgtLTEwcHgtIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWludXNfcHJlY2VkZWRfYnlfY29tbWVudAorICAgIGFzc2VydF9lcXVhbCAiMTVweCAtMTBweCIsIHJlc29sdmUoIjE1cHgvKiovLTEwcHgiKQorICBlbmQKKworICBkZWYgdGVzdF91c2VyX2RlZmluZWRfZnVuY3Rpb25fZm9yY2VzX2RpdmlzaW9uCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2EgeworICBiOiAxMHB4OyB9CitDU1MKK0BmdW5jdGlvbiBmb28oKQorICBAcmV0dXJuIDIwcHgKKworYQorICBiOiAoZm9vKCkgLyAyKQorU0FTUworCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQVNTKSkKK2EgeworICBiOiAxMHB4OyB9CitDU1MKK0BmdW5jdGlvbiBmb28oKQorICBAcmV0dXJuIDIwcHgKKworYQorICBiOiBmb28oKSAvIDIKK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY2FsbF9oYXNfaGlnaGVyX3ByZWNlZGVuY2VfdGhhbl9jb2xvcl9uYW1lCisgICAgYXNzZXJ0X2VxdWFsICJ0ZWFsKDEyKSIsIHJlc29sdmUoInRlYWwoMTIpIikKKyAgICBhc3NlcnRfZXF1YWwgInRlYWxiYW5nKDEyKSIsIHJlc29sdmUoInRlYWxiYW5nKDEyKSIpCisgICAgYXNzZXJ0X2VxdWFsICJ0ZWFsLWJhbmcoMTIpIiwgcmVzb2x2ZSgidGVhbC1iYW5nKDEyKSIpCisgICAgYXNzZXJ0X2VxdWFsICJ0ZWFsXFwrYmFuZygxMikiLCByZXNvbHZlKCJ0ZWFsXFwrYmFuZygxMikiKQorICBlbmQKKworICBkZWYgdGVzdF9mdW5jYWxsX2hhc19oaWdoZXJfcHJlY2VkZW5jZV90aGFuX3RydWVfZmFsc2VfbnVsbAorICAgIGFzc2VydF9lcXVhbCAidGVhbCgxMikiLCByZXNvbHZlKCJ0ZWFsKDEyKSIpCisgICAgYXNzZXJ0X2VxdWFsICJ0ZWFsYmFuZygxMikiLCByZXNvbHZlKCJ0ZWFsYmFuZygxMikiKQorICAgIGFzc2VydF9lcXVhbCAidGVhbC1iYW5nKDEyKSIsIHJlc29sdmUoInRlYWwtYmFuZygxMikiKQorICAgIGFzc2VydF9lcXVhbCAidGVhbFxcK2JhbmcoMTIpIiwgcmVzb2x2ZSgidGVhbFxcK2JhbmcoMTIpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfYW5kX29yX25vdF9kaXNhbGxvd2VkX2FzX2Z1bmN0aW9uX25hbWVzCisgICAgJXdbYW5kIG9yIG5vdF0uZWFjaCBkbyB8bmFtZXwKKyAgICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAiSW52YWxpZCBmdW5jdGlvbiBuYW1lIFwiI3tuYW1lfVwiLiIpIGRvCisgICAgICAgIHJlbmRlcig8PFNBU1MpCitAZnVuY3Rpb24gI3tuYW1lfSgpCisgIEByZXR1cm4gbnVsbAorU0FTUworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25fYWZ0ZXJfaGFzaAorICAgIGFzc2VydF9lcXVhbCAiIzIiLCByZXNvbHZlKCciIyN7MSArIDF9IicpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmNfY2FsbF9hcmdsaXN0X3RyYWlsaW5nX2NvbW1hCisgICAgYXNzZXJ0X2VxdWFsIGV2YWwoJ2ZvbyhiYXIpJyksIGV2YWwoJ2ZvbyhiYXIsICknKQorICBlbmQKKworICBkZWYgdGVzdF9jb2xvcl9wcmVmaXhlZF9pZGVudGlmaWVyCisgICAgYXNzZXJ0X2VxdWFsICJ0ZWFsYmFuZyIsIHJlc29sdmUoInRlYWxiYW5nIikKKyAgICBhc3NlcnRfZXF1YWwgInRlYWwtYmFuZyIsIHJlc29sdmUoInRlYWwtYmFuZyIpCisgIGVuZAorCisgIGRlZiB0ZXN0X29wX3ByZWZpeGVkX2lkZW50aWZpZXIKKyAgICBhc3NlcnRfZXF1YWwgIm5vdGJhbmciLCByZXNvbHZlKCJub3RiYW5nIikKKyAgICBhc3NlcnRfZXF1YWwgIm5vdC1iYW5nIiwgcmVzb2x2ZSgibm90LWJhbmciKQorICAgIGFzc2VydF9lcXVhbCAib3ItYmFuZyIsIHJlc29sdmUoIm9yLWJhbmciKQorICAgIGFzc2VydF9lcXVhbCAiYW5kLWJhbmciLCByZXNvbHZlKCJhbmQtYmFuZyIpCisgIGVuZAorCisgIGRlZiB0ZXN0X251bWJlcl9pbml0aWFsaXphdGlvbgorICAgIGFzc2VydF9lcXVhbCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIubmV3KDEwLCBbInB4Il0pLCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIubmV3KDEwLCAicHgiKQorICAgIGFzc2VydF9lcXVhbCBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIubmV3KDEwLCBbInB4Il0sIFsiZW0iXSksIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5uZXcoMTAsICJweCIsICJlbSIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2lzX3VuaXQKKyAgICBhc3NlcnQgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLm5ldygxMCwgInB4IikuaXNfdW5pdD8oInB4IikKKyAgICBhc3NlcnQgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLm5ldygxMCkuaXNfdW5pdD8obmlsKQorICAgIGFzc2VydCAhU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLm5ldygxMCwgInB4IiwgImVtIikuaXNfdW5pdD8oInB4IikKKyAgICBhc3NlcnQgIVNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5uZXcoMTAsIFtdLCAiZW0iKS5pc191bml0PygiZW0iKQorICAgIGFzc2VydCAhU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVtYmVyLm5ldygxMCwgWyJweCIsICJlbSJdKS5pc191bml0PygicHgiKQorICBlbmQKKworICBkZWYgdGVzdF9yZW5hbWVfcmVkaXJlY3QKKyAgICBhc3NlcnRfbm9fd2FybmluZyBkbworICAgICAgYXNzZXJ0X2VxdWFsIFNhc3M6OlNjcmlwdDo6VmFsdWU6OkJhc2UsIFNhc3M6OlNjcmlwdDo6TGl0ZXJhbAorICAgICAgYXNzZXJ0X2VxdWFsIFNhc3M6OlNjcmlwdDo6VHJlZTo6Tm9kZSwgU2Fzczo6U2NyaXB0OjpOb2RlCisgICAgICBhc3NlcnRfZXF1YWwgU2Fzczo6U2NyaXB0OjpUcmVlOjpPcGVyYXRpb24sIFNhc3M6OlNjcmlwdDo6T3BlcmF0aW9uCisgICAgICBhc3NlcnRfZXF1YWwgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLCBTYXNzOjpTY3JpcHQ6OlN0cmluZworICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9udW1iZXJfcHJpbnRpbmcKKyAgICBhc3NlcnRfZXF1YWwgIjEiLCByZXNvbHZlKCIxIikKKyAgICBhc3NlcnRfZXF1YWwgIjEiLCByZXNvbHZlKCIxLjAiKQorICAgIGFzc2VydF9lcXVhbCAiMTAwMDAwMDAwMCIsIHJlc29sdmUoIjEwMDAwMDAwMDAiKQorICAgIGFzc2VydF9lcXVhbCAiMC4wMDAwMSIsIHJlc29sdmUoIjAuMDAwMDEiKQorICAgIGFzc2VydF9lcXVhbCAiMS4xMjEyMTIxMjEyIiwgcmVzb2x2ZSgiMS4xMjEyMTIxMjEyNCIpCisgICAgYXNzZXJ0X2VxdWFsICIxLjEyMTIxMjEyMTMiLCByZXNvbHZlKCIxLjEyMTIxMjEyMTI1IikKKyAgICBhc3NlcnRfZXF1YWwgIkluZmluaXR5IiwgcmVzb2x2ZSgiKDEuMC8wLjApIikKKyAgICBhc3NlcnRfZXF1YWwgIi1JbmZpbml0eSIsIHJlc29sdmUoIigtMS4wLzAuMCkiKQorICAgIGFzc2VydF9lcXVhbCAiTmFOIiwgcmVzb2x2ZSgiKDAuMC8wLjApIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXF1YWxpdHlfdXNlc19hbl9lcHNpbG9uCisgICAgIyBBdCBsZWFzdCBvbiBteSBtYWNoaW5lLCB0aGlzIGNhbGN1bGF0aW9uIGludHJvZHVjZXMgYSBmbG9hdGluZyBwb2ludCBlcnJvcjoKKyAgICAjIDI5LjAgLyA3ICogNworICAgICMgPT4gMjkuMDAwMDAwMDAwMDAwMDA0CisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiMjkgPT0gKDI5IC8gNyAqIDcpIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tcHJlc3NlZF9vdXRwdXRfb2ZfbnVtYmVyc193aXRoX2xlYWRpbmdfemVyb3MKKyAgICBhc3NlcnRfZXF1YWwgIjEuNSIsIHJlc29sdmUoIjEuNSIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkKKyAgICBhc3NlcnRfZXF1YWwgIi41IiwgcmVzb2x2ZSgiMC41IiwgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorICAgIGFzc2VydF9lcXVhbCAiLS41IiwgcmVzb2x2ZSgiLTAuNSIsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkKKyAgICBhc3NlcnRfZXF1YWwgIjAuNSIsIHJlc29sdmUoIjAuNSIsIDpzdHlsZSA9PiA6Y29tcGFjdCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl93aXRob3V0X2RlcHJlY2F0aW9uX3dhcm5pbmcKKyAgICBhc3NlcnRfbm9fd2FybmluZyB7YXNzZXJ0X2VxdWFsICJhIiwgcmVzb2x2ZSgnI3thfScpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgImFiYyIsIHJlc29sdmUoJ2Eje2J9YycpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgIisgYSIsIHJlc29sdmUoJysgI3thfScpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgIi8gYSIsIHJlc29sdmUoJy8gI3thfScpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgIjEgLyBhIiwgcmVzb2x2ZSgnMSAvICN7YX0nKX0KKyAgICBhc3NlcnRfbm9fd2FybmluZyB7YXNzZXJ0X2VxdWFsICJhIC8gYiIsIHJlc29sdmUoJyN7YX0gLyAje2J9Jyl9CisgICAgYXNzZXJ0X25vX3dhcm5pbmcge2Fzc2VydF9lcXVhbCAiZm9vKDEgPSBhKSIsIHJlc29sdmUoJ2ZvbygxID0gI3thfSknKX0KKyAgICBhc3NlcnRfbm9fd2FybmluZyB7YXNzZXJ0X2VxdWFsICJmb28oYSA9IGIpIiwgcmVzb2x2ZSgnZm9vKCN7YX0gPSAje2J9KScpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgIi1hIiwgcmVzb2x2ZSgnLSN7YX0nKX0KKyAgICBhc3NlcnRfbm9fd2FybmluZyB7YXNzZXJ0X2VxdWFsICIxLWEiLCByZXNvbHZlKCcxLSN7YX0nKX0KKyAgICBhc3NlcnRfbm9fd2FybmluZyB7YXNzZXJ0X2VxdWFsICJhLSAxIiwgcmVzb2x2ZSgnI3thfS0gMScpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgImEtMSIsIHJlc29sdmUoJyN7YX0tMScpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgImEtYiIsIHJlc29sdmUoJyN7YX0tI3tifScpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgImExIiwgcmVzb2x2ZSgnI3thfTEnKX0KKyAgICBhc3NlcnRfbm9fd2FybmluZyB7YXNzZXJ0X2VxdWFsICJhYiIsIHJlc29sdmUoJyN7YX1iJyl9CisgICAgYXNzZXJ0X25vX3dhcm5pbmcge2Fzc2VydF9lcXVhbCAiMWEiLCByZXNvbHZlKCcxI3thfScpfQorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwgImJhIiwgcmVzb2x2ZSgnYiN7YX0nKX0KKyAgZW5kCisKKyAgZGVmIHRlc3RfbGVhZGluZ19pbnRlcnBvbGF0aW9uX3dpdGhfZGVwcmVjYXRpb25fd2FybmluZworICAgIGFzc2VydF9lcXVhbCAiYWIgPT0gMSIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnI3thICsgYn0gPT0gMScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiAhPSAxIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSAhPSAxJykKKyAgICBhc3NlcnRfZXF1YWwgImFiID4gMSIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnI3thICsgYn0gPiAxJykKKyAgICBhc3NlcnRfZXF1YWwgImFiID49IDEiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7YSArIGJ9ID49IDEnKQorICAgIGFzc2VydF9lcXVhbCAiYWIgPCAxIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSA8IDEnKQorICAgIGFzc2VydF9lcXVhbCAiYWIgPD0gMSIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnI3thICsgYn0gPD0gMScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiArIDEiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7YSArIGJ9ICsgMScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiAqIDEiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7YSArIGJ9ICogMScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiAtIDEiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7YSArIGJ9IC0gMScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiAlIDEiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7YSArIGJ9ICUgMScpCisgICAgYXNzZXJ0X2VxdWFsKAorICAgICAgImFidmFyIiwKKyAgICAgIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygKKyAgICAgICAgJyN7YSArIGJ9JHZhcicsICciI3thICsgYn0jeyR2YXJ9IicsCisgICAgICAgIGVudigndmFyJyA9PiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcubmV3KCJ2YXIiKSkpKQorICAgIGFzc2VydF9lcXVhbCgKKyAgICAgICJ2YXJhYiIsCisgICAgICByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoCisgICAgICAgICckdmFyI3thICsgYn0nLCAnIiN7JHZhcn0je2EgKyBifSInLAorICAgICAgICBlbnYoJ3ZhcicgPT4gU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLm5ldygidmFyIikpKSkKKyAgICBhc3NlcnRfZXF1YWwgImFiMSIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnI3thICsgYn0oMSknLCAnIiN7YSArIGJ9MSInKQorICAgIGFzc2VydF9lcXVhbCAiMWFiIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcoMSkje2EgKyBifScsICciMSN7YSArIGJ9IicpCisgIGVuZAorCisgIGRlZiB0ZXN0X3RyYWlsaW5nX2ludGVycG9sYXRpb25fd2l0aF9kZXByZWNhdGlvbl93YXJuaW5nCisgICAgYXNzZXJ0X2VxdWFsICJub3QgYWIiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJ25vdCAje2EgKyBifScpCisgICAgYXNzZXJ0X2VxdWFsICIxIGFuZCBhYiIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnMSBhbmQgI3thICsgYn0nKQorICAgIGFzc2VydF9lcXVhbCAiMSBvciBhYiIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnMSBvciAje2EgKyBifScpCisgICAgYXNzZXJ0X2VxdWFsICIxID09IGFiIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcxID09ICN7YSArIGJ9JykKKyAgICBhc3NlcnRfZXF1YWwgIjEgIT0gYWIiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJzEgIT0gI3thICsgYn0nKQorICAgIGFzc2VydF9lcXVhbCAiMSA+IGFiIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcxID4gI3thICsgYn0nKQorICAgIGFzc2VydF9lcXVhbCAiMSA+PSBhYiIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnMSA+PSAje2EgKyBifScpCisgICAgYXNzZXJ0X2VxdWFsICIxIDwgYWIiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJzEgPCAje2EgKyBifScpCisgICAgYXNzZXJ0X2VxdWFsICIxIDw9IGFiIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcxIDw9ICN7YSArIGJ9JykKKyAgICBhc3NlcnRfZXF1YWwgIjEgKyBhYiIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnMSArICN7YSArIGJ9JykKKyAgICBhc3NlcnRfZXF1YWwgIjEgKiBhYiIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnMSAqICN7YSArIGJ9JykKKyAgICBhc3NlcnRfZXF1YWwgIjEgLSBhYiIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnMSAtICN7YSArIGJ9JykKKyAgICBhc3NlcnRfZXF1YWwgIjEgJSBhYiIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnMSAlICN7YSArIGJ9JykKKyAgICBhc3NlcnRfZXF1YWwgIi0gYWIiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJy0gI3thICsgYn0nKQorICAgIGFzc2VydF9lcXVhbCAiMS0gYWIiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJzEtICN7YSArIGJ9JykKKyAgICBhc3NlcnRfZXF1YWwgIi0gYWIgMiAzIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCctICN7YSArIGJ9IDIgMycsICciLSAje2EgKyBifSAjezIgM30iJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfYnJhY2t0ZWluZ19pbnRlcnBvbGF0aW9uX3dpdGhfZGVwcmVjYXRpb25fd2FybmluZworICAgIGFzc2VydF9lcXVhbCAiYWIgPT0gY2QiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7YSArIGJ9ID09ICN7YyArIGR9JykKKyAgICBhc3NlcnRfZXF1YWwgImFiICE9IGNkIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSAhPSAje2MgKyBkfScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiA+IGNkIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSA+ICN7YyArIGR9JykKKyAgICBhc3NlcnRfZXF1YWwgImFiID49IGNkIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSA+PSAje2MgKyBkfScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiA8IGNkIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSA8ICN7YyArIGR9JykKKyAgICBhc3NlcnRfZXF1YWwgImFiIDw9IGNkIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSA8PSAje2MgKyBkfScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiArIGNkIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSArICN7YyArIGR9JykKKyAgICBhc3NlcnRfZXF1YWwgImFiICogY2QiLCByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7YSArIGJ9ICogI3tjICsgZH0nKQorICAgIGFzc2VydF9lcXVhbCAiYWIgLSBjZCIsIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnI3thICsgYn0gLSAje2MgKyBkfScpCisgICAgYXNzZXJ0X2VxdWFsICJhYiAlIGNkIiwgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcje2EgKyBifSAlICN7YyArIGR9JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwX3dhcm5pbmdfZm9ybWF0dGluZworICAgIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnI3sxfSArIDEnLCAnIjEgKyAxIicpCisgICAgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcjezF9ICsgImZvbyInLCAnXCcxICsgImZvbyJcJycpCisgICAgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCcjezF9ICsgXCdmb29cJycsICdcJzEgKyAiZm9vIlwnJykKKworICAgIHJlc29sdmVfd2l0aF9pbnRlcnBfd2FybmluZygnI3sxfSArICIje2EgKyBifSInLCAnXCcxICsgIiN7YSArIGJ9IlwnJykKKyAgICByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyIje2EgKyBifSIgKyAjezF9JywgJ1wnIiN7YSArIGJ9IiArIDFcJycpCisgICAgcmVzb2x2ZV93aXRoX2ludGVycF93YXJuaW5nKCciI3thICsgYn0iICsgI3sxfSArICIje2MgKyBkfSInLCAnXCciI3thICsgYn0iICsgMSArICIje2MgKyBkfSJcJycpCisKKyAgICByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7MX0gKyAiXCciJywgJyIxICsgXFwiXCdcXCIiJykKKyAgICByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7MX0gKyBcJyJcJycsICciMSArIFwnXFwiXCciJykKKyAgICByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoJyN7MX0gKyAiXCdcXCIiJywgJyIxICsgXFwiXCdcXFxcXFwiXFwiIicpCisgIGVuZAorCisgIGRlZiB0ZXN0X2luYWN0aXZlX2xhenlfaW50ZXJwb2xhdGlvbl9kZXByZWNhdGlvbl93YXJuaW5nCisgICAgYXNzZXJ0X2VxdWFsICcxLCAyLCAzJywgYXNzZXJ0X25vX3dhcm5pbmcge3Jlc29sdmUoJzEsICN7Mn0sIDMnKX0KKyAgICBhc3NlcnRfZXF1YWwgJzEsIDIsIDMnLCBhc3NlcnRfbm9fd2FybmluZyB7cmVzb2x2ZSgnMSwgMiwgI3szfScpfQorICAgIGFzc2VydF9lcXVhbCAnMSwyLDMnLCBhc3NlcnRfbm9fd2FybmluZyB7cmVzb2x2ZSgnMSwjezJ9LDMnKX0KKyAgICBhc3NlcnRfZXF1YWwgJzEgMiAzJywgYXNzZXJ0X25vX3dhcm5pbmcge3Jlc29sdmUoJyN7MX0gMiAzJyl9CisgICAgYXNzZXJ0X2VxdWFsICcxIDIgMycsIGFzc2VydF9ub193YXJuaW5nIHtyZXNvbHZlKCcxICN7Mn0gMycpfQorICAgIGFzc2VydF9lcXVhbCAnMSAyIDMnLCBhc3NlcnRfbm9fd2FybmluZyB7cmVzb2x2ZSgnMSAyICN7M30nKX0KKworICAgIGFzc2VydF9lcXVhbCAnKzEgMiAzJywgYXNzZXJ0X25vX3dhcm5pbmcge3Jlc29sdmUoJysjezF9IDIgMycpfQorICAgIGFzc2VydF9lcXVhbCAnLTEgMiAzJywgYXNzZXJ0X25vX3dhcm5pbmcge3Jlc29sdmUoJy0jezF9IDIgMycpfQorICAgIGFzc2VydF9lcXVhbCAnLzEgMiAzJywgYXNzZXJ0X25vX3dhcm5pbmcge3Jlc29sdmUoJy8jezF9IDIgMycpfQorCisgICAgYXNzZXJ0X2VxdWFsICcxLCAyLCAzMScsIGFzc2VydF9ub193YXJuaW5nIHtyZXNvbHZlKCcoMSwgI3syfSwgMykgKyAxJyl9CisgICAgYXNzZXJ0X2VxdWFsICcxMSwgMiwgMycsIGFzc2VydF9ub193YXJuaW5nIHtyZXNvbHZlKCcxICsgKDEsICN7Mn0sIDMpJyl9CisKKyAgICBhc3NlcnRfZXF1YWwgJ2EsIGIsIGMnLCBhc3NlcnRfbm9fd2FybmluZyB7cmVzb2x2ZSgnc2VsZWN0b3ItcGFyc2UoKGEsICN7Yn0sIGMpKScpfQorICBlbmQKKworICBkZWYgdGVzdF9hY3RpdmVfbGF6eV9pbnRlcnBvbGF0aW9uX2RlcHJlY2F0aW9uX3dhcm5pbmcKKyAgICBTYXNzOjpEZXByZWNhdGlvbi5hbGxvd19kb3VibGVfd2FybmluZ3MgZG8KKyAgICAgIGFzc2VydF9lcXVhbCAiMSwgMiwgMyIsIHJlc29sdmVfd2l0aF9sYXp5X2ludGVycF93YXJuaW5nKCdxdW90ZSgoMSwgI3syfSwgMykpJywgJyIxLCAyLCAzIicpCisgICAgICBhc3NlcnRfZXF1YWwgIjEiLCByZXNvbHZlX3dpdGhfbGF6eV9pbnRlcnBfd2FybmluZygnbGVuZ3RoKCgxLCAjezJ9LCAzKSknLCAnIjEsIDIsIDMiJykKKyAgICAgIGFzc2VydF9lcXVhbCAiMSwgMiwgMyIsIHJlc29sdmVfd2l0aF9sYXp5X2ludGVycF93YXJuaW5nKCdpbnNwZWN0KCgxLCAjezJ9LCAzKSknLCAnIjEsIDIsIDMiJykKKyAgICAgIGFzc2VydF9lcXVhbCAic3RyaW5nIiwgcmVzb2x2ZV93aXRoX2xhenlfaW50ZXJwX3dhcm5pbmcoJ3R5cGUtb2YoKDEsICN7Mn0sIDMpKScsICciMSwgMiwgMyInKQorCisgICAgICBhc3NlcnRfZXF1YWwgIisxIDIgMyIsIHJlc29sdmVfd2l0aF9sYXp5X2ludGVycF93YXJuaW5nKCdxdW90ZSgoKyN7MX0gMiAzKSknLCAnIisxICN7MiAzfSInKQorICAgICAgYXNzZXJ0X2VxdWFsICIvMSAyIDMiLCByZXNvbHZlX3dpdGhfbGF6eV9pbnRlcnBfd2FybmluZygncXVvdGUoKC8jezF9IDIgMykpJywgJyIvMSAjezIgM30iJykKKyAgICAgIGFzc2VydF9lcXVhbCAiLTEgMiAzIiwgcmVzb2x2ZV93aXRoX2xhenlfaW50ZXJwX3dhcm5pbmcoJ3F1b3RlKCgtI3sxfSAyIDMpKScsICciLTEgI3syIDN9IicpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbXBhcmlzb25fb2ZfY29tcGxleF91bml0cworICAgICMgVGVzdHMgZm9yIGlzc3VlICMxOTYwCisgICAgU2Fzczo6RGVwcmVjYXRpb24uYWxsb3dfZG91YmxlX3dhcm5pbmdzIGRvCisgICAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIGRvCitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgMSBvZiB0ZXN0X2NvbXBhcmlzb25fb2ZfY29tcGxleF91bml0c19pbmxpbmUuc2FzczoKK1RoZSByZXN1bHQgb2YgYDEwID09IDEwcHhgIHdpbGwgYmUgYGZhbHNlYCBpbiBmdXR1cmUgcmVsZWFzZXMgb2YgU2Fzcy4KK1VuaXRsZXNzIG51bWJlcnMgd2lsbCBubyBsb25nZXIgYmUgZXF1YWwgdG8gdGhlIHNhbWUgbnVtYmVycyB3aXRoIHVuaXRzLgorV0FSTklORworICAgICAgICBhc3NlcnRfZXF1YWwgInRydWUiLCByZXNvbHZlKCIxMCA9PSAyICogNXB4IikKKyAgICAgIGVuZAorICAgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSBkbworREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIDEgb2YgdGVzdF9jb21wYXJpc29uX29mX2NvbXBsZXhfdW5pdHNfaW5saW5lLnNhc3M6CitUaGUgcmVzdWx0IG9mIGAxMCA9PSAxMHB4KnB4YCB3aWxsIGJlIGBmYWxzZWAgaW4gZnV0dXJlIHJlbGVhc2VzIG9mIFNhc3MuCitVbml0bGVzcyBudW1iZXJzIHdpbGwgbm8gbG9uZ2VyIGJlIGVxdWFsIHRvIHRoZSBzYW1lIG51bWJlcnMgd2l0aCB1bml0cy4KK1dBUk5JTkcKKyAgICAgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiMTAgPT0gMnB4ICogNXB4IikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgYXNzZXJ0X2VxdWFsICJ0cnVlIiwgcmVzb2x2ZSgiMTBweCAqIDFweCA9PSAycHggKiA1cHgiKQorICAgIGFzc2VydF9lcXVhbCAidHJ1ZSIsIHJlc29sdmUoIjVweCAqIDFweCA8IDJweCAqIDVweCIpCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgcmVzb2x2ZV93aXRoX2xhenlfaW50ZXJwX3dhcm5pbmcoc3RyLCBjb250ZW50cyA9IG5pbCwgZW52aXJvbm1lbnQgPSBlbnYpCisgICAgY29udGVudHMgfHw9ICJcIiN7c3RyfVwiIgorICAgIHJlc3VsdCA9IGFzc2VydF93YXJuaW5nKDw8V0FSTklORykge3Jlc29sdmUoc3RyLCB7fSwgZW52aXJvbm1lbnQpfQorREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIDEgb2YgI3tmaWxlbmFtZV9mb3JfdGVzdH06CitcI3t9IGludGVycG9sYXRpb24gbmVhciBvcGVyYXRvcnMgd2lsbCBiZSBzaW1wbGlmaWVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgU2Fzcy4KK1RvIHByZXNlcnZlIHRoZSBjdXJyZW50IGJlaGF2aW9yLCB1c2UgcXVvdGVzOgorCisgIHVucXVvdGUoI3tjb250ZW50c30pCitXQVJOSU5HCisgICAgJF9zYXNzX2RlcHJlY2F0ZWRfaW50ZXJwX3dhcm5pbmdzID0gbmlsCisgICAgcmVzdWx0CisgIGVuZAorCisgIGRlZiByZXNvbHZlX3dpdGhfaW50ZXJwX3dhcm5pbmcoc3RyLCBjb250ZW50cyA9IG5pbCwgZW52aXJvbm1lbnQgPSBlbnYpCisgICAgY29udGVudHMgfHw9ICJcIiN7c3RyfVwiIgorICAgIGFzc2VydF93YXJuaW5nKDw8V0FSTklORykge3Jlc29sdmUoc3RyLCB7fSwgZW52aXJvbm1lbnQpfQorREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIDEgb2YgI3tmaWxlbmFtZV9mb3JfdGVzdH06CitcI3t9IGludGVycG9sYXRpb24gbmVhciBvcGVyYXRvcnMgd2lsbCBiZSBzaW1wbGlmaWVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgU2Fzcy4KK1RvIHByZXNlcnZlIHRoZSBjdXJyZW50IGJlaGF2aW9yLCB1c2UgcXVvdGVzOgorCisgIHVucXVvdGUoI3tjb250ZW50c30pCisKK1lvdSBjYW4gdXNlIHRoZSBzYXNzLWNvbnZlcnQgY29tbWFuZCB0byBhdXRvbWF0aWNhbGx5IGZpeCBtb3N0IGNhc2VzLgorV0FSTklORworICBlbmQKKworICBkZWYgcmVzb2x2ZShzdHIsIG9wdHMgPSB7fSwgZW52aXJvbm1lbnQgPSBlbnYpCisgICAgbXVuZ2VfZmlsZW5hbWUgb3B0cworICAgIHZhbCA9IGV2YWwoc3RyLCBvcHRzLCBlbnZpcm9ubWVudCkKKyAgICBhc3NlcnRfa2luZF9vZiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlLCB2YWwKKyAgICB2YWwub3B0aW9ucyA9IG9wdHMKKyAgICB2YWwuaXNfYT8oU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nKSA/IHZhbC52YWx1ZSA6IHZhbC50b19zCisgIGVuZAorCisgIGRlZiByZXNvbHZlX3F1b3RlZChzdHIsIG9wdHMgPSB7fSwgZW52aXJvbm1lbnQgPSBlbnYpCisgICAgbXVuZ2VfZmlsZW5hbWUgb3B0cworICAgIHZhbCA9IGV2YWwoc3RyLCBvcHRzLCBlbnZpcm9ubWVudCkKKyAgICBhc3NlcnRfa2luZF9vZiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpCYXNlLCB2YWwKKyAgICB2YWwudG9fcworICBlbmQKKworICBkZWYgYXNzZXJ0X3VucXVvdGVkKHN0ciwgb3B0cyA9IHt9LCBlbnZpcm9ubWVudCA9IGVudikKKyAgICBtdW5nZV9maWxlbmFtZSBvcHRzCisgICAgdmFsID0gZXZhbChzdHIsIG9wdHMsIGVudmlyb25tZW50KQorICAgIGFzc2VydF9raW5kX29mIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZywgdmFsCisgICAgYXNzZXJ0X2VxdWFsIDppZGVudGlmaWVyLCB2YWwudHlwZQorICBlbmQKKworICBkZWYgYXNzZXJ0X3F1b3RlZChzdHIsIG9wdHMgPSB7fSwgZW52aXJvbm1lbnQgPSBlbnYpCisgICAgbXVuZ2VfZmlsZW5hbWUgb3B0cworICAgIHZhbCA9IGV2YWwoc3RyLCBvcHRzLCBlbnZpcm9ubWVudCkKKyAgICBhc3NlcnRfa2luZF9vZiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpTdHJpbmcsIHZhbAorICAgIGFzc2VydF9lcXVhbCA6c3RyaW5nLCB2YWwudHlwZQorICBlbmQKKworICBkZWYgZXZhbChzdHIsIG9wdHMgPSB7fSwgZW52aXJvbm1lbnQgPSBlbnYpCisgICAgbXVuZ2VfZmlsZW5hbWUgb3B0cworICAgIFNhc3M6OlNjcmlwdC5wYXJzZShzdHIsIG9wdHMuZGVsZXRlKDpsaW5lKSB8fCAxLAorICAgICAgb3B0cy5kZWxldGUoOm9mZnNldCkgfHwgMCwgb3B0cykuCisgICAgICBwZXJmb3JtKFNhc3M6OkVudmlyb25tZW50Lm5ldyhlbnZpcm9ubWVudCwgb3B0cykpCisgIGVuZAorCisgIGRlZiByZW5kZXIoc2Fzcywgb3B0aW9ucyA9IHt9KQorICAgIG11bmdlX2ZpbGVuYW1lIG9wdGlvbnMKKyAgICBTYXNzOjpFbmdpbmUubmV3KHNhc3MsIG9wdGlvbnMpLnJlbmRlcgorICBlbmQKKworICBkZWYgZW52KGhhc2ggPSB7fSkKKyAgICBlbnYgPSBTYXNzOjpFbnZpcm9ubWVudC5uZXcKKyAgICBoYXNoLmVhY2gge3xrLCB2fCBlbnYuc2V0X3ZhcihrLCB2KX0KKyAgICBlbnYKKyAgZW5kCisKKyAgZGVmIHNlbGVjdG9yKHN0cikKKyAgICBwYXJzZXIgPSBTYXNzOjpTQ1NTOjpTdGF0aWNQYXJzZXIubmV3KAorICAgICAgc3RyLCBmaWxlbmFtZV9mb3JfdGVzdCwgU2Fzczo6SW1wb3J0ZXJzOjpGaWxlc3lzdGVtLm5ldygnLicpKQorICAgIHBhcnNlci5wYXJzZV9zZWxlY3RvcgorICBlbmQKKworICBkZWYgdGVzdF9udWxsX2lzX2Ffc2luZ2xldG9uCisgICAgYXNzZXJ0X3NhbWUgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6TnVsbC5uZXcsIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bGwubmV3CisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9zY3NzL2Nzc190ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc2Nzcy9jc3NfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTUxMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc2Nzcy9jc3NfdGVzdC5yYgpAQCAtMCwwICsxLDEyNjYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3Rlc3RfaGVscGVyJworcmVxdWlyZSAnc2Fzcy9zY3NzL2Nzc19wYXJzZXInCisKKyMgVGhlc2UgdGVzdHMganVzdCB0ZXN0IHRoZSBwYXJzaW5nIG9mIENTUworIyAoYm90aCBzdGFuZGFyZCBhbmQgYW55IGhhY2tzIHdlIGludGVuZCB0byBzdXBwb3J0KS4KKyMgVGVzdHMgb2YgU0NTUy1zcGVjaWZpYyBiZWhhdmlvciBnbyBpbiBzY3NzX3Rlc3QucmIuCitjbGFzcyBTY3NzQ3NzVGVzdCA8IE1pbmlUZXN0OjpUZXN0CisgIGluY2x1ZGUgU2Nzc1Rlc3RIZWxwZXIKKworICBkZWYgdGVzdF9iYXNpY19zY3NzCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK3NlbGVjdG9yIHsKKyAgcHJvcGVydHk6IHZhbHVlOworICBwcm9wZXJ0eTI6IHZhbHVlOyB9CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcignc2Vse3A6dn0nKQorc2VsIHsKKyAgcDogdjsgfQorQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2VtcHR5X3J1bGUKKyAgICBhc3NlcnRfZXF1YWwgIiIsIHJlbmRlcigiI2ZvbyAuYmFyIHt9IikKKyAgICBhc3NlcnRfZXF1YWwgIiIsIHJlbmRlcig8PFNDU1MpCisjZm9vIC5iYXIgeworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jZG9fYW5kX2NkY19pZ25vcmVkX2F0X3RvcGxldmVsCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYmFyOiBiYXo7IH0KKworYmFyIHsKKyAgYmFyOiBiYXo7IH0KKworYmF6IHsKKyAgYmFyOiBiYXo7IH0KK0NTUworZm9vIHtiYXI6IGJhen0KKzwhLS0KK2JhciB7YmFyOiBiYXp9CistLT4KK2JheiB7YmFyOiBiYXp9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuaWNvZGUKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworQGNoYXJzZXQgIlVURi04IjsKK2ZvbyB7CisgIGJhcjogZsO2w7YgYsOicjsgfQorU0NTUworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BjaGFyc2V0ICJVVEYtOCI7Citmb28geworICBiYXI6IGbDtsO2IGLDonI7IH0KK0NTUworZm9vIHsKKyAgYmFyOiBmw7bDtiBiw6JyOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludmlzaWJsZV9jb21tZW50cworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGE6IGQ7IH0KK0NTUworZm9vIHthOiAvKiBiOyBjOiAqLyBkfQorU0NTUworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGE6IGQ7IH0KK0NTUworZm9vIHthIC8qOiBiOyBjICovOiBkfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jcmF6eV9jb21tZW50cworICAgICMgaHR0cDovL3d3dy53My5vcmcvU3R5bGUvQ1NTL1Rlc3QvQ1NTMi4xL2N1cnJlbnQveGh0bWwxL3QwNDAxMDktYzE3LWNvbW1lbnRzLTAwLWIueGh0CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLyogVGhpcyBpcyBhIENTUyBjb21tZW50LiAqLworLm9uZSB7CisgIGNvbG9yOiBncmVlbjsgfQorCisvKiBBbm90aGVyIGNvbW1lbnQgKi8KKy8qIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCBiZSB1c2VkOgorLnR3byB7Y29sb3I6IHJlZDt9ICovCisudGhyZWUgeworICBjb2xvcjogZ3JlZW47CisgIC8qIGNvbG9yOiByZWQ7ICovIH0KKworLyoqCisuZm91ciB7Y29sb3I6IHJlZDt9ICovCisuZml2ZSB7CisgIGNvbG9yOiBncmVlbjsgfQorCisvKiovCisuc2l4IHsKKyAgY29sb3I6IGdyZWVuOyB9CisKKy8qKioqKioqKiovCisuc2V2ZW4geworICBjb2xvcjogZ3JlZW47IH0KKworLyogYSBjb21tZW50ICoqLworLmVpZ2h0IHsKKyAgY29sb3I6IGdyZWVuOyB9CitDU1MKKy8qIFRoaXMgaXMgYSBDU1MgY29tbWVudC4gKi8KKy5vbmUge2NvbG9yOiBncmVlbjt9IC8qIEFub3RoZXIgY29tbWVudCAqLworLyogVGhlIGZvbGxvd2luZyBzaG91bGQgbm90IGJlIHVzZWQ6CisudHdvIHtjb2xvcjogcmVkO30gKi8KKy50aHJlZSB7Y29sb3I6IGdyZWVuOyAvKiBjb2xvcjogcmVkOyAqL30KKy8qKgorLmZvdXIge2NvbG9yOiByZWQ7fSAqLworLmZpdmUge2NvbG9yOiBncmVlbjt9CisvKiovCisuc2l4IHtjb2xvcjogZ3JlZW47fQorLyoqKioqKioqKi8KKy5zZXZlbiB7Y29sb3I6IGdyZWVuO30KKy8qIGEgY29tbWVudCAqKi8KKy5laWdodCB7Y29sb3I6IGdyZWVuO30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcnVsZV9jb21tZW50cworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCisvKiBGb28gKi8KKy5mb28geworICBhOiBiOyB9CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLyogRm9vCisgKiBCYXIgKi8KKy5mb28geworICBhOiBiOyB9CitDU1MKKy8qIEZvbworICogQmFyICovLmZvbyB7CisgIGE6IGI7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHJvcGVydHlfY29tbWVudHMKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworLmZvbyB7CisgIC8qIEZvbyAqLworICBhOiBiOyB9CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIC8qIEZvbworICAgKiBCYXIgKi8KKyAgYTogYjsgfQorQ1NTCisuZm9vIHsKKyAgLyogRm9vCisgICAqIEJhciAqL2E6IGI7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfY29tbWVudHMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vICNiYXI6YmF6KGJpcCkgeworICBhOiBiOyB9CitDU1MKKy5mb28gLyogLmEgI2ZvbyAqLyAjYmFyOmJheigvKiBiYW5nICkqLyBiaXApIHsKKyAgYTogYjsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9sb25lbHlfY29tbWVudHMKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworLyogRm9vCisgKiBCYXIgKi8KK1NDU1MKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworLmZvbyB7CisgIC8qIEZvbworICAgKiBCYXIgKi8gfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tdWx0aXBsZV9jb21tZW50cworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCisvKiBGb28KKyAqIEJhciAqLworLyogQmF6CisgKiBCYW5nICovCitTQ1NTCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKKy5mb28geworICAvKiBGb28KKyAgICogQmFyICovCisgIC8qIEJhegorICAgKiBCYW5nICovIH0KK1NDU1MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgLyogRm9vIEJhciAqLworICAvKiBCYXogQmFuZyAqLyB9CitDU1MKKy5mb28geworICAvKiBGb28gQmFyICovLyogQmF6IEJhbmcgKi8gfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9iaXphcnJlbHlfZm9ybWF0dGVkX2NvbW1lbnRzCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKKy5mb28geworICAvKiBGb28KK0JhcgorICBCYXogKi8KKyAgYTogYjsgfQorU0NTUworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCisuZm9vIHsKKyAgICAvKiBGb28KK0JhcgorICBCYXogKi8KKyAgYTogYjsgfQorU0NTUworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICAgLyogRm9vCitCYXIgKi8KKyAgYTogYjsgfQorQ1NTCisuZm9vIHsvKiBGb28KKyAgIEJhciAqLworICBhOiBiOyB9CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgICAgLyogRm9vCisgQmFyCitCYXogKi8KKyAgYTogYjsgfQorQ1NTCisuZm9vIHsvKiBGb28KKyAgIEJhcgorICBCYXogKi8KKyAgYTogYjsgfQorU0NTUworICBlbmQKKworICAjIyBEZWNsYXJhdGlvbnMKKworICBkZWYgdGVzdF92ZW5kb3JfcHJvcGVydGllcworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitmb28geworICAtbW96LWZvby1iYXI6IGJsYXQ7CisgIC1vLWZsYXQtYmxhbmc6IHdpYmJsZTsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9kZWNsYXJhdGlvbnMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28geworICBiYXI6IGJhejsgfQorQ1NTCitmb28gezs7OzsKKyAgYmFyOiBiYXo7Ozs7CisgIDs7fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9iYXNpY19wcm9wZXJ0eV90eXBlcworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitmb28geworICBhOiAyOworICBiOiAyLjNlbTsKKyAgYzogNTAlOworICBkOiAiZnJheiBicmFuIjsKKyAgZTogZmxhbm55LWJsYW5ueS1ibGFuOworICBmOiB1cmwoaHR0cDovL3Nhc3MtbGFuZy5jb20pOworICBnOiBVK2ZmYT87CisgIGg6ICNhYWJiY2M7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25zCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK2ZvbyB7CisgIGE6IGZvby1iYXIoMTIpOworICBiOiAtZm9vLWJhci1iYXooMTMsIDE0IDE1KTsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF91bmFyeV9taW51cworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitmb28geworICBhOiAtMjsKKyAgYjogLTIuM2VtOworICBjOiAtNTAlOworICBkOiAtZm9vKGJhciBiYXopOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X29wZXJhdG9ycworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitmb28geworICBhOiBmb28gYmFyIGJhejsKKyAgYjogZm9vLCAjYWFiYmNjLCAtMTI7CisgIGM6IDFweC8ycHgvLTNweDsKKyAgZDogZm9vIGJhciwgYmF6L2Jhbmc7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0YW50CisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK2ZvbyB7CisgIGE6IGZvbyAhaW1wb3J0YW50OworICBiOiBmb28gYmFyICFpbXBvcnRhbnQ7CisgIGI6IGZvbywgYmFyICFpbXBvcnRhbnQ7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5pdGlhbF9oeXBoZW4KKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworZm9vIHsKKyAgYTogLW1vei1iYXItYmF6OworICBiOiBmb28gLW8tYmFyLWJhejsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tc19sb25nX2ZpbHRlcl9zeW50YXgKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28geworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGU9MSwgc3RhcnRDb2xvcnN0cj0jYzBmZjMzMDAsIGVuZENvbG9yc3RyPSNmZjAwMDAwMCk7CisgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KEdyYWRpZW50VHlwZT0xLCBzdGFydENvbG9yc3RyPSNjMGZmMzMwMCwgZW5kQ29sb3JzdHI9I2ZmMDAwMDAwKTsgfQorQ1NTCitmb28geworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGU9MSwgc3RhcnRDb2xvcnN0cj0jYzBmZjMzMDAsIGVuZENvbG9yc3RyPSNmZjAwMDAwMCk7CisgIGZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlPTEsIHN0YXJ0Q29sb3JzdHI9I2MwZmYzMzAwLCBlbmRDb2xvcnN0cj0jZmYwMDAwMDApOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21zX3Nob3J0X2ZpbHRlcl9zeW50YXgKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworZm9vIHsKKyAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTIwKTsKKyAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTIwLCBlbmFibGVkPXRydWUpOworICBmaWx0ZXI6IGJsYXpuaWNhdGUoZm9vPWJhciwgYmF6PWJhbmcgYmlwLCBiYXJ0PSNmYTQ2MDApOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RlY2xhcmF0aW9uX2hhY2tzCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK2ZvbyB7CisgIF9uYW1lOiB2YWw7CisgICpuYW1lOiB2YWw7CisgIDpuYW1lOiB2YWw7CisgIC5uYW1lOiB2YWw7CisgICNuYW1lOiB2YWw7CisgIG5hbWUvKiovOiB2YWw7CisgIG5hbWUvKlxcKiovOiB2YWw7CisgIG5hbWU6IHZhbDsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF90cmFpbGluZ19oYXNoX2hhY2sKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworZm9vIHsKKyAgZm9vOiBiYXI7CisgICNiYXo6IGJhbmc7CisgICNiaXA6IGJvcDsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF96ZXJvX2FyZ19mdW5jdGlvbnMKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworZm9vIHsKKyAgYTogZm9vKCk7CisgIGI6IGJhciBiYXotYmFuZygpIGJpcDsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9leHByZXNzaW9uX2Z1bmN0aW9uCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK2ZvbyB7CisgIGE6IDEycHggZXhwcmVzc2lvbigxICsgKDMgLyBGb28uYmFyKCJiYXoiICsgImJhbmciKSArIGZ1bmN0aW9uKCkge3JldHVybiAxMjt9KSAlIDEyKTsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jYWxjX2Z1bmN0aW9uCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK2ZvbyB7CisgIGE6IDEycHggY2FsYygxMDAlLzMgLSAyKjFlbSAtIDIqMXB4KTsKKyAgYjogMTJweCAtbW96LWNhbGMoMTAwJS8zIC0gMioxZW0gLSAyKjFweCk7CisgIGI6IDEycHggLXdlYmtpdC1jYWxjKDEwMCUvMyAtIDIqMWVtIC0gMioxcHgpOworICBiOiAxMnB4IC1mb29iYXItY2FsYygxMDAlLzMgLSAyKjFlbSAtIDIqMXB4KTsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9lbGVtZW50X2Z1bmN0aW9uCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK2ZvbyB7CisgIGE6IC1tb3otZWxlbWVudCgjZm9vKTsKKyAgYjogLXdlYmtpdC1lbGVtZW50KCNmb28pOworICBiOiAtZm9vYmFyLWVsZW1lbnQoI2Zvbyk7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5hcnlfb3BzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogLTAuNWVtOworICBiOiArMC41ZW07CisgIGM6IC1mb28oMTJweCk7CisgIGQ6ICtmb28oMTJweCk7IH0KK0NTUworZm9vIHsKKyAgYTogLTAuNWVtOworICBiOiArMC41ZW07CisgIGM6IC1mb28oMTJweCk7CisgIGQ6ICtmb28oMTJweCk7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3NzX3N0cmluZ19lc2NhcGVzCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK2ZvbyB7CisgIGE6ICJcXGZvbyBiYXIiOworICBiOiAiZm9vXFwgYmFyIjsKKyAgYzogIlxcMjAyMiBcXDAwMjAiOworICBkOiAiZm9vXFxcXGJhciI7CisgIGU6ICJmb29cXCInYmFyIjsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jc3NfaWRlbnRfZXNjYXBlcworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitmb28geworICBhOiBcXGZvbyBiYXI7CisgIGI6IGZvb1xcIGJhcjsKKyAgYzogXFwyMDIyIFxcMDAyMDsKKyAgZDogZm9vXFxcXGJhcjsKKyAgZTogZm9vXFwiXFwnYmFyOyB9CitTQ1NTCisgIGVuZAorCisgICMjIERpcmVjdGl2ZXMKKworICBkZWYgdGVzdF9uYW1lc3BhY2VfZGlyZWN0aXZlCisgICAgYXNzZXJ0X3BhcnNlcyAnQG5hbWVzcGFjZSAiaHR0cDovL3d3dy53My5vcmcvUHJvZmlsZXMveGh0bWwxLXN0cmljdCI7JworICAgIGFzc2VydF9wYXJzZXMgJ0BuYW1lc3BhY2UgdXJsKGh0dHA6Ly93d3cudzMub3JnL1Byb2ZpbGVzL3hodG1sMS1zdHJpY3QpOycKKyAgICBhc3NlcnRfcGFyc2VzICdAbmFtZXNwYWNlIGh0bWwgdXJsKCJodHRwOi8vd3d3LnczLm9yZy9Qcm9maWxlcy94aHRtbDEtc3RyaWN0Iik7JworICBlbmQKKworICBkZWYgdGVzdF9tZWRpYV9kaXJlY3RpdmUKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworQG1lZGlhIGFsbCB7CisgIHJ1bGUxIHsKKyAgICBwcm9wOiB2YWw7IH0KKworICBydWxlMiB7CisgICAgcHJvcDogdmFsOyB9IH0KK1NDU1MKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworQG1lZGlhIHNjcmVlbiwgcHJpbnQgeworICBydWxlMSB7CisgICAgcHJvcDogdmFsOyB9CisKKyAgcnVsZTIgeworICAgIHByb3A6IHZhbDsgfSB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21lZGlhX2RpcmVjdGl2ZV93aXRoX2tleXdvcmRzCisgICAgYXNzZXJ0X3BhcnNlcyA8PFNDU1MKK0BtZWRpYSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDApIHsKKyAgYTogYjsgfQorU0NTUworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitAbWVkaWEgb25seSBzY3JlZW4sIHByaW50IGFuZCAoZm9vOiAwcHgpIGFuZCAoYmFyOiBmbGFtKDEycHggc29saWQpKSB7CisgIGE6IGI7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0X2RpcmVjdGl2ZQorICAgIGFzc2VydF9wYXJzZXMgJ0BpbXBvcnQgImZvby5jc3MiOycKKyAgICBhc3NlcnRfcGFyc2VzICdAaW1wb3J0IHVybCgiZm9vLmNzcyIpOycKKyAgICBhc3NlcnRfcGFyc2VzICJAaW1wb3J0IHVybCgnZm9vLmNzcycpOyIKKyAgICBhc3NlcnRfcGFyc2VzICdAaW1wb3J0IHVybChmb28uY3NzKTsnCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAaW1wb3J0ICJmb28uY3NzIjsKK0NTUworQGltcG9ydCAnZm9vLmNzcyc7CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF9kaXJlY3RpdmVfd2l0aF9iYWNrc2xhc2hfbmV3bGluZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BpbXBvcnQgImZvb2Jhci5jc3MiOworQ1NTCitAaW1wb3J0ICJmb29cXAorYmFyLmNzcyI7CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19pbXBvcnRfZGlyZWN0aXZlX3dpdGhfbWVkaWEKKyAgICBhc3NlcnRfcGFyc2VzICdAaW1wb3J0ICJmb28uY3NzIiBzY3JlZW47JworICAgIGFzc2VydF9wYXJzZXMgJ0BpbXBvcnQgImZvby5jc3MiIHNjcmVlbiwgcHJpbnQ7JworICAgIGFzc2VydF9wYXJzZXMgJ0BpbXBvcnQgImZvby5jc3MiIHNjcmVlbiwgcHJpbnQgYW5kIChmb286IDApOycKKyAgICBhc3NlcnRfcGFyc2VzICdAaW1wb3J0ICJmb28uY3NzIiBzY3JlZW4sIG9ubHkgcHJpbnQsIHNjcmVlbiBhbmQgKGZvbzogMCk7JworICBlbmQKKworICBkZWYgdGVzdF91cmxfaW1wb3J0X2RpcmVjdGl2ZV93aXRoX21lZGlhCisgICAgYXNzZXJ0X3BhcnNlcyAnQGltcG9ydCB1cmwoImZvby5jc3MiKSBzY3JlZW47JworICAgIGFzc2VydF9wYXJzZXMgJ0BpbXBvcnQgdXJsKCJmb28uY3NzIikgc2NyZWVuLCBwcmludDsnCisgICAgYXNzZXJ0X3BhcnNlcyAnQGltcG9ydCB1cmwoImZvby5jc3MiKSBzY3JlZW4sIHByaW50IGFuZCAoZm9vOiAwKTsnCisgICAgYXNzZXJ0X3BhcnNlcyAnQGltcG9ydCB1cmwoImZvby5jc3MiKSBzY3JlZW4sIG9ubHkgcHJpbnQsIHNjcmVlbiBhbmQgKGZvbzogMCk7JworICBlbmQKKworICBkZWYgdGVzdF9wYWdlX2RpcmVjdGl2ZQorICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitAcGFnZSB7CisgIHByb3AxOiB2YWw7CisgIHByb3AyOiB2YWw7IH0KK1NDU1MKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworQHBhZ2UgZmxhcCB7CisgIHByb3AxOiB2YWw7CisgIHByb3AyOiB2YWw7IH0KK1NDU1MKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworQHBhZ2UgOmZpcnN0IHsKKyAgcHJvcDE6IHZhbDsKKyAgcHJvcDI6IHZhbDsgfQorU0NTUworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitAcGFnZSBmbGFwOmZpcnN0IHsKKyAgcHJvcDE6IHZhbDsKKyAgcHJvcDI6IHZhbDsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9ibG9ja2xlc3NfZGlyZWN0aXZlX3dpdGhvdXRfc2VtaWNvbG9uCisgICAgYXNzZXJ0X2VxdWFsICJAZm9vIFwiYmFyXCI7XG4iLCByZW5kZXIoJ0Bmb28gImJhciInKQorICBlbmQKKworICBkZWYgdGVzdF9kaXJlY3RpdmVfd2l0aF9sb3RzX29mX3doaXRlc3BhY2UKKyAgICBhc3NlcnRfZXF1YWwgIkBmb28gXCJiYXJcIjtcbiIsIHJlbmRlcignQGZvbyAgICAiYmFyIiAgOycpCisgIGVuZAorCisgIGRlZiB0ZXN0X2VtcHR5X2Jsb2NrbGVzc19kaXJlY3RpdmUKKyAgICBhc3NlcnRfcGFyc2VzICJAZm9vOyIKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlwbGVfYmxvY2tsZXNzX2RpcmVjdGl2ZXMKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworQGZvbyBiYXI7CitAYmFyIGJhejsKK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW1wdHlfYmxvY2tfZGlyZWN0aXZlCisgICAgYXNzZXJ0X3BhcnNlcyAiQGZvbyB7fSIKKyAgICBhc3NlcnRfZXF1YWwgIkBmb28ge31cbiIsIHJlbmRlcig8PFNDU1MpCitAZm9vIHsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlwbGVfYmxvY2tfZGlyZWN0aXZlcworICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitAZm9vIGJhciB7CisgIGE6IGI7IH0KK0BiYXIgYmF6IHsKKyAgYzogZDsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9ibG9ja19kaXJlY3RpdmVfd2l0aF9ydWxlX2FuZF9wcm9wZXJ0eQorICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitAZm9vIHsKKyAgcnVsZSB7CisgICAgYTogYjsgfQorCisgIGE6IGI7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYmxvY2tfZGlyZWN0aXZlX3dpdGhfc2VtaWNvbG9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQGZvbyB7CisgIGE6IGI7IH0KK0BiYXIgeworICBhOiBiOyB9CitDU1MKK0Bmb28ge2E6Yn07CitAYmFyIHthOmJ9OworU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tb3pfZG9jdW1lbnRfZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQC1tb3otZG9jdW1lbnQgdXJsKGh0dHA6Ly93d3cudzMub3JnLyksCisgICAgICAgICAgICAgICB1cmwtcHJlZml4KGh0dHA6Ly93d3cudzMub3JnL1N0eWxlLyksCisgICAgICAgICAgICAgICBkb21haW4obW96aWxsYS5vcmcpLAorICAgICAgICAgICAgICAgcmVnZXhwKCJeaHR0cHM6LioiKSB7CisgIC5mb28geworICAgIGE6IGI7IH0gfQorQ1NTCitALW1vei1kb2N1bWVudCB1cmwoaHR0cDovL3d3dy53My5vcmcvKSwKKyAgICAgICAgICAgICAgIHVybC1wcmVmaXgoaHR0cDovL3d3dy53My5vcmcvU3R5bGUvKSwKKyAgICAgICAgICAgICAgIGRvbWFpbihtb3ppbGxhLm9yZyksCisgICAgICAgICAgICAgICByZWdleHAoIl5odHRwczouKiIpIHsKKyAgLmZvbyB7YTogYn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3VwcG9ydHMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAc3VwcG9ydHMgKCgoYTogYikgYW5kIChjOiBkKSkgb3IgKG5vdCAoZDogZSkpKSBhbmQgKChub3QgKGY6IGcpKSBvciAobm90ICgoaDogaSkgYW5kIChqOiBrKSkpKSB7CisgIC5mb28geworICAgIGE6IGI7IH0gfQorQHN1cHBvcnRzIChhOiBiKSB7CisgIC5mb28geworICAgIGE6IGI7IH0gfQorQ1NTCitAc3VwcG9ydHMgKCgoYTogYikgYW5kIChjOiBkKSkgb3IgKG5vdCAoZDogZSkpKSBhbmQgKChub3QgKGY6IGcpKSBvciAobm90ICgoaDogaSkgYW5kIChqOiBrKSkpKSB7CisgIC5mb28geworICAgIGE6IGI7CisgIH0KK30KKworQHN1cHBvcnRzIChhOiBiKSB7CisgIC5mb28geworICAgIGE6IGI7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3VwcG9ydHNfd2l0aF9wcmVmaXgKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitALXByZWZpeC1zdXBwb3J0cyAoKChhOiBiKSBhbmQgKGM6IGQpKSBvciAobm90IChkOiBlKSkpIGFuZCAoKG5vdCAoZjogZykpIG9yIChub3QgKChoOiBpKSBhbmQgKGo6IGspKSkpIHsKKyAgLmZvbyB7CisgICAgYTogYjsgfSB9CitDU1MKK0AtcHJlZml4LXN1cHBvcnRzICgoKGE6IGIpIGFuZCAoYzogZCkpIG9yIChub3QgKGQ6IGUpKSkgYW5kICgobm90IChmOiBnKSkgb3IgKG5vdCAoKGg6IGkpIGFuZCAoajogaykpKSkgeworICAuZm9vIHsKKyAgICBhOiBiOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3N1cHBvcnRzX2FsbG93c19zaW1pbGFyX29wZXJhdG9yc193aXRob3V0X3BhcmVucworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BzdXBwb3J0cyAoYTogYikgYW5kIChjOiBkKSBhbmQgKGU6IGYpIHsKKyAgLmZvbyB7CisgICAgYTogYjsgfSB9CitAc3VwcG9ydHMgKGE6IGIpIG9yIChjOiBkKSBvciAoZTogZikgeworICAuZm9vIHsKKyAgICBhOiBiOyB9IH0KK0NTUworQHN1cHBvcnRzIChhOiBiKSBhbmQgKGM6IGQpIGFuZCAoZTogZikgeworICAuZm9vIHsKKyAgICBhOiBiOworICB9Cit9CisKK0BzdXBwb3J0cyAoYTogYikgb3IgKGM6IGQpIG9yIChlOiBmKSB7CisgIC5mb28geworICAgIGE6IGI7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfa2V5ZnJhbWVzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQGtleWZyYW1lcyBpZGVudGlmaWVyIHsKKyAgMCUgeworICAgIHRvcDogMDsKKyAgICBsZWZ0OiAwOyB9CisgIDMwJSB7CisgICAgdG9wOiA1MHB4OyB9CisgIDY4JSwgNzIlIHsKKyAgICBsZWZ0OiA1MHB4OyB9CisgIDEwMCUgeworICAgIHRvcDogMTAwcHg7CisgICAgbGVmdDogMTAwJTsgfSB9CitDU1MKK0BrZXlmcmFtZXMgaWRlbnRpZmllciB7CisgIDAlIHt0b3A6IDA7IGxlZnQ6IDB9CisgIDMwJSB7dG9wOiA1MHB4fQorICA2OCUsIDcyJSB7bGVmdDogNTBweH0KKyAgMTAwJSB7dG9wOiAxMDBweDsgbGVmdDogMTAwJX0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfa2V5ZnJhbWVzX3dpdGhfZW1wdHlfcnVsZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAa2V5ZnJhbWVzIGlkZW50aWZpZXIgeworICA1MCUgeworICAgIGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyB9IH0KK0NTUworQGtleWZyYW1lcyBpZGVudGlmaWVyIHsKKyAgMCUge30KKyAgNTAlIHtiYWNrZ3JvdW5kLWNvbG9yOiBibGFja30KKyAgMTAwJSB7fQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9rZXlmcmFtZXNfd2l0aF9jdXN0b21faWRlbnRpZmllcnMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitALXNrcm9sbHIta2V5ZnJhbWVzIGlkZW50aWZpZXIgeworICBjZW50ZXItdG9wIHsKKyAgICBsZWZ0OiAxMDAlOyB9CisgIHRvcC1ib3R0b20geworICAgIGxlZnQ6IDAlOyB9IH0KK0NTUworQC1za3JvbGxyLWtleWZyYW1lcyBpZGVudGlmaWVyIHsKKyAgY2VudGVyLXRvcCB7CisgICAgbGVmdDogMTAwJTsKKyAgfQorCisgIHRvcC1ib3R0b20geworICAgIGxlZnQ6IDAlOworICB9Cit9CisKK1NDU1MKKyAgZW5kCisKKyAgIyMgU2VsZWN0b3JzCisKKyAgIyBUYWtlbiBmcm9tIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL3NlbGVjdG9yczQvI292ZXJ2aWV3CisgIGRlZiB0ZXN0X3N1bW1hcml6ZWRfc2VsZWN0b3JzX3dpdGhfZWxlbWVudAorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJyonKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0UnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6bm90KHMpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOm5vdChzMSwgczIpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOm1hdGNoZXMoczEsIHMyKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpoYXMoczEsIHMyKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpoYXMoPiBzMSwgPiBzMiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0Uud2FybmluZycpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRSNteWlkJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFW2Zvb10nKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0VbZm9vPSJiYXIiXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRVtmb289ImJhciIgaV0nKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0VbZm9vfj0iYmFyIl0nKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0VbZm9vXj0iYmFyIl0nKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0VbZm9vJD0iYmFyIl0nKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0VbZm9vKj0iYmFyIl0nKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0VbZm9vfD0iZW4iXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpkaXIobHRyKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpsYW5nKGZyKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpsYW5nKHpoLCAqLWhhbnQpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOmFueS1saW5rJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOmxpbmsnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6dmlzaXRlZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpsb2NhbC1saW5rJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOmxvY2FsLWxpbmsoMCknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6dGFyZ2V0JykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOnNjb3BlJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOmN1cnJlbnQnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6Y3VycmVudChzKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpwYXN0JykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOmZ1dHVyZScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTphY3RpdmUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6aG92ZXInKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6Zm9jdXMnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6ZW5hYmxlZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpkaXNhYmxlZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpjaGVja2VkJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOmluZGV0ZXJtaW5hdGUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6ZGVmYXVsdCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTppbi1yYW5nZScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpvdXQtb2YtcmFuZ2UnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6cmVxdWlyZWQnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6b3B0aW9uYWwnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6cmVhZC1vbmx5JykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOnJlYWQtd3JpdGUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6cm9vdCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTplbXB0eScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpmaXJzdC1jaGlsZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpudGgtY2hpbGQobiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6bGFzdC1jaGlsZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpudGgtbGFzdC1jaGlsZChuKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpvbmx5LWNoaWxkJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOmZpcnN0LW9mLXR5cGUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6bnRoLW9mLXR5cGUobiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6bGFzdC1vZi10eXBlJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOm50aC1sYXN0LW9mLXR5cGUobiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6b25seS1vZi10eXBlJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFOm50aC1jaGlsZChuIG9mIHNlbGVjdG9yKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpudGgtbGFzdC1jaGlsZChuIG9mIHNlbGVjdG9yKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpudGgtY2hpbGQobiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6bnRoLWxhc3QtY2hpbGQobiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0UgRicpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRSA+IEYnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0UgKyBGJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFIH4gRicpCisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRSAvZm9vLyBGJyl9CisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRSEgPiBGJyl9CisKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdFIC9uc3xmb28vIEYnKX0KKworICAgICMgRnJvbSBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3Mtc2NvcGluZy0xLworICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0U6aG9zdChzKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRTpob3N0LWNvbnRleHQocyknKQorICBlbmQKKworICAjIFRha2VuIGZyb20gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvc2VsZWN0b3JzNC8jb3ZlcnZpZXcsIGJ1dCB3aXRob3V0IGVsZW1lbnQKKyAgIyBuYW1lcy4KKyAgZGVmIHRlc3RfbW9yZV9zdW1tYXJpemVkX3NlbGVjdG9ycworICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpub3QocyknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpub3QoczEsIHMyKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm1hdGNoZXMoczEsIHMyKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmhhcyhzMSwgczIpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6aGFzKD4gczEsID4gczIpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCcud2FybmluZycpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnI215aWQnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ1tmb29dJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdbZm9vPSJiYXIiXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2Zvbz0iYmFyIiBpXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2Zvb349ImJhciJdJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdbZm9vXj0iYmFyIl0nKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ1tmb28kPSJiYXIiXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2Zvbyo9ImJhciJdJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdbZm9vfD0iZW4iXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmRpcihsdHIpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6bGFuZyhmciknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpsYW5nKHpoLCAqLWhhbnQpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6YW55LWxpbmsnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpsaW5rJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6dmlzaXRlZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmxvY2FsLWxpbmsnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpsb2NhbC1saW5rKDApJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6dGFyZ2V0JykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6c2NvcGUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpjdXJyZW50JykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6Y3VycmVudChzKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOnBhc3QnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpmdXR1cmUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzphY3RpdmUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpob3ZlcicpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmZvY3VzJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6ZW5hYmxlZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmRpc2FibGVkJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6Y2hlY2tlZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmluZGV0ZXJtaW5hdGUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpkZWZhdWx0JykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6aW4tcmFuZ2UnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpvdXQtb2YtcmFuZ2UnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpyZXF1aXJlZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm9wdGlvbmFsJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6cmVhZC1vbmx5JykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6cmVhZC13cml0ZScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOnJvb3QnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzplbXB0eScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmZpcnN0LWNoaWxkJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6bnRoLWNoaWxkKG4pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6bGFzdC1jaGlsZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm50aC1sYXN0LWNoaWxkKG4pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6b25seS1jaGlsZCcpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmZpcnN0LW9mLXR5cGUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpudGgtb2YtdHlwZShuKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmxhc3Qtb2YtdHlwZScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm50aC1sYXN0LW9mLXR5cGUobiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpvbmx5LW9mLXR5cGUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpudGgtY2hpbGQobiBvZiBzZWxlY3RvciknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpudGgtbGFzdC1jaGlsZChuIG9mIHNlbGVjdG9yKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm50aC1jaGlsZChuKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm50aC1sYXN0LWNoaWxkKG4pJykKKworICAgICMgRnJvbSBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3Mtc2NvcGluZy0xLworICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpob3N0KHMpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6aG9zdC1jb250ZXh0KHMpJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXR0cmlidXRlX3NlbGVjdG9yc193aXRoX2lkZW50aWZpZXJzCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2Zvb349YmFyXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2Zvb149YmFyXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2ZvbyQ9YmFyXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2Zvbyo9YmFyXScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2Zvb3w9ZW5dJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbnRoX3NlbGVjdG9ycworICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpudGgtY2hpbGQoLW4pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6bnRoLWNoaWxkKCtuKScpCisKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6bnRoLWNoaWxkKGV2ZW4pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6bnRoLWNoaWxkKG9kZCknKQorCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm50aC1jaGlsZCg1MCknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpudGgtY2hpbGQoLTUwKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm50aC1jaGlsZCgrNTApJykKKworICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpudGgtY2hpbGQoMm4rMyknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpudGgtY2hpbGQoMm4tMyknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpudGgtY2hpbGQoKzJuLTMpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6bnRoLWNoaWxkKC0ybiszKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOm50aC1jaGlsZCgtMm4rIDMpJykKKworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCis6bnRoLWNoaWxkKDJuICsgMykgeworICBhOiBiOyB9CitDU1MKKzpudGgtY2hpbGQoIDJuICsgMyApIHsKKyAgYTogYjsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3RvcnNfY29udGFpbmluZ19zZWxlY3RvcnMKKyAgICBhc3NlcnRfc2VsZWN0b3JfY2FuX2NvbnRhaW5fc2VsZWN0b3JzKCc6bm90KDxzZWw+KScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX2Nhbl9jb250YWluX3NlbGVjdG9ycygnOmN1cnJlbnQoPHNlbD4pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfY2FuX2NvbnRhaW5fc2VsZWN0b3JzKCc6bnRoLWNoaWxkKG4gb2YgPHNlbD4pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfY2FuX2NvbnRhaW5fc2VsZWN0b3JzKCc6bnRoLWxhc3QtY2hpbGQobiBvZiA8c2VsPiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9jYW5fY29udGFpbl9zZWxlY3RvcnMoJzotbW96LWFueSg8c2VsPiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9jYW5fY29udGFpbl9zZWxlY3RvcnMoJzpoYXMoPHNlbD4pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfY2FuX2NvbnRhaW5fc2VsZWN0b3JzKCc6aGFzKCsgPHNlbD4pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfY2FuX2NvbnRhaW5fc2VsZWN0b3JzKCc6aG9zdCg8c2VsPiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9jYW5fY29udGFpbl9zZWxlY3RvcnMoJzpob3N0LWNvbnRleHQoPHNlbD4pJykKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9zZWxlY3Rvcl9jYW5fY29udGFpbl9zZWxlY3RvcnMoc2VsKQorICAgIHRyeSA9IGxhbWJkYSB7fHN1YnNlbHwgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcyhzZWwuZ3N1YignPHNlbD4nLCBzdWJzZWwpKX0KKworICAgIHRyeVsnZm9vfGJhciddCisgICAgdHJ5WycqfGJhciddCisKKyAgICB0cnlbJ2Zvb3wqJ10KKyAgICB0cnlbJyp8KiddCisKKyAgICB0cnlbJyNibGFoJ10KKyAgICB0cnlbJy5ibGFoJ10KKworICAgIHRyeVsnW2Zvb10nXQorICAgIHRyeVsnW2Zvb149ImJhciJdJ10KKyAgICB0cnlbJ1tiYXp8Zm9vfj0iYmFyIl0nXQorCisgICAgdHJ5Wyc6aG92ZXInXQorICAgIHRyeVsnOm50aC1jaGlsZCgybiArIDMpJ10KKworICAgIHRyeVsnaDEsIGgyLCBoMyddCisgICAgdHJ5WycjZm9vLCBiYXIsIFtiYXpdJ10KKworICAgICMgTm90IHRlY2huaWNhbGx5IGFsbG93ZWQgZm9yIG1vc3Qgc2VsZWN0b3JzLCBidXQgd2hhdCB0aGUgaGVjaworICAgIHRyeVsnOm5vdCgjZm9vKSddCisgICAgdHJ5WydhI2Zvby5iYXInXQorICAgIHRyeVsnI2ZvbyAuYmFyID4gYmF6J10KKyAgZW5kCisKKyAgZGVmIHRlc3RfbmFtZXNwYWNlZF9zZWxlY3RvcnMKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdmb298RScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnKnxFJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCdmb298KicpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnKnwqJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmFtZXNwYWNlZF9hdHRyaWJ1dGVfc2VsZWN0b3JzCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnW2Zvb3xiYXI9YmF6XScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnWyp8YmFyPWJhel0nKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ1tmb298YmFyfD1iYXpdJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tbWFfc2VsZWN0b3JzCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRSwgRicpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRSBGLCBHIEgnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0UgPiBGLCBHID4gSCcpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yc193aXRoX25ld2xpbmVzCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygiRSxcbkYiKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoIkVcbkYiKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoIkUsIEZcbkcsIEgiKQorICBlbmQKKworICBkZWYgdGVzdF9leHByZXNzaW9uX2ZhbGxiYWNrX3NlbGVjdG9ycworICAgIGFzc2VydF9kaXJlY3RpdmVfcGFyc2VzKCcwJScpCisgICAgYXNzZXJ0X2RpcmVjdGl2ZV9wYXJzZXMoJzYwJScpCisgICAgYXNzZXJ0X2RpcmVjdGl2ZV9wYXJzZXMoJzEwMCUnKQorICAgIGFzc2VydF9kaXJlY3RpdmVfcGFyc2VzKCcxMnB4JykKKyAgICBhc3NlcnRfZGlyZWN0aXZlX3BhcnNlcygnImZvbyInKQorICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbmFsX3BzZXVkb19zZWxlY3RvcnMKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6Zm9vKCJiYXIiKScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnOmZvbyhiYXIpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6Zm9vKDEycHgpJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6Zm9vKCspJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6Zm9vKC0pJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCc6Zm9vKCsiYmFyIiknKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJzpmb28oLSsrLS1iYXotImJhciIxMnB4KScpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2hhY2tzCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnPiBFJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCcrIEUnKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ34gRScpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnPiA+IEUnKQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKz4gPiBFIHsKKyAgYTogYjsgfQorQ1NTCis+PiBFIHsKKyAgYTogYjsgfQorU0NTUworCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRSonKQorICAgIGFzc2VydF9zZWxlY3Rvcl9wYXJzZXMoJ0UqLmZvbycpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnRSo6aG92ZXInKQorICBlbmQKKworICBkZWYgdGVzdF9zcGFjZWxlc3NfY29tYm9fc2VsZWN0b3JzCisgICAgYXNzZXJ0X2VxdWFsICJFID4gRiB7XG4gIGE6IGI7IH1cbiIsIHJlbmRlcigiRT5GIHsgYTogYjt9ICIpCisgICAgYXNzZXJ0X2VxdWFsICJFIH4gRiB7XG4gIGE6IGI7IH1cbiIsIHJlbmRlcigiRX5GIHsgYTogYjt9ICIpCisgICAgYXNzZXJ0X2VxdWFsICJFICsgRiB7XG4gIGE6IGI7IH1cbiIsIHJlbmRlcigiRStGIHsgYTogYjt9ICIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2VzY2FwZXNfaW5fc2VsZWN0b3JzCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnLlwhZm9vJykKKyAgICBhc3NlcnRfc2VsZWN0b3JfcGFyc2VzKCcuXDY2IGZvbycpCisgICAgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcygnLlwyMSBmb28nKQorICBlbmQKKworICBkZWYgdGVzdF9zdWJqZWN0X3NlbGVjdG9yX2RlcHJlY2F0aW9uCisgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7cmVuZGVyKCIuZm9vIC5iYXIhIC5iYXoge2E6IGJ9Iil9CitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgMSwgY29sdW1uIDE6CitUaGUgc3ViamVjdCBzZWxlY3RvciBvcGVyYXRvciAiISIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCitUaGlzIG9wZXJhdG9yIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICI6aGFzKCkiIGluIHRoZSBDU1Mgc3BlYy4KK0ZvciBleGFtcGxlOiAuZm9vIC5iYXI6aGFzKC5iYXopCitXQVJOSU5HCisKKyAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIHtyZW5kZXIoIi5mb28gLmJhciEgPiAuYmF6IHthOiBifSIpfQorREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIDEsIGNvbHVtbiAxOgorVGhlIHN1YmplY3Qgc2VsZWN0b3Igb3BlcmF0b3IgIiEiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorVGhpcyBvcGVyYXRvciBoYXMgYmVlbiByZXBsYWNlZCBieSAiOmhhcygpIiBpbiB0aGUgQ1NTIHNwZWMuCitGb3IgZXhhbXBsZTogLmZvbyAuYmFyOmhhcyg+IC5iYXopCitXQVJOSU5HCisKKyAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIHtyZW5kZXIoIi5mb28gLmJhciEge2E6IGJ9Iil9CitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgMSwgY29sdW1uIDE6CitUaGUgc3ViamVjdCBzZWxlY3RvciBvcGVyYXRvciAiISIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCitUaGlzIG9wZXJhdG9yIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICI6aGFzKCkiIGluIHRoZSBDU1Mgc3BlYy4KK0ZvciBleGFtcGxlOiAuZm9vIC5iYXIKK1dBUk5JTkcKKyAgZW5kCisKKyAgIyMgRXJyb3JzCisKKyAgZGVmIHRlc3RfaW52YWxpZF9kaXJlY3RpdmVzCisgICAgYXNzZXJ0X25vdF9wYXJzZXMoImlkZW50aWZpZXIiLCAnQDxlcnI+IGltcG9ydCAiZm9vIjsnKQorICAgIGFzc2VydF9ub3RfcGFyc2VzKCJpZGVudGlmaWVyIiwgJ0A8ZXJyPjEyICJmb28iOycpCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludmFsaWRfY2xhc3NlcworICAgIGFzc2VydF9ub3RfcGFyc2VzKCJjbGFzcyBuYW1lIiwgJ3AuPGVycj4gZm9vIHthOiBifScpCisgICAgYXNzZXJ0X25vdF9wYXJzZXMoImNsYXNzIG5hbWUiLCAncC48ZXJyPjFmb28ge2E6IGJ9JykKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW52YWxpZF9pZHMKKyAgICBhc3NlcnRfbm90X3BhcnNlcygiaWQgbmFtZSIsICdwIzxlcnI+IGZvbyB7YTogYn0nKQorICBlbmQKKworICBkZWYgdGVzdF9ub19wcm9wZXJ0aWVzX2F0X3RvcGxldmVsCisgICAgYXNzZXJ0X25vdF9wYXJzZXMoJ3BzZXVkb2NsYXNzIG9yIHBzZXVkb2VsZW1lbnQnLCAnYTo8ZXJyPiBiOycpCisgIGVuZAorCisgIGRlZiB0ZXN0X25vX3Njc3NfZGlyZWN0aXZlcworICAgIGFzc2VydF9wYXJzZXMoJ0BpbXBvcnQgImZvby5zYXNzIjsnKQorICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitAbWl4aW4gZm9vIHsKKyAgYTogYjsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9ub192YXJpYWJsZXMKKyAgICBhc3NlcnRfbm90X3BhcnNlcygic2VsZWN0b3Igb3IgYXQtcnVsZSIsICI8ZXJyPiR2YXIgPSAxMjsiKQorICAgIGFzc2VydF9ub3RfcGFyc2VzKCcifSInLCAiZm9vIHsgPGVycj4hdmFyID0gMTI7IH0iKQorICBlbmQKKworICBkZWYgdGVzdF9ub19wYXJlbnRfc2VsZWN0b3JzCisgICAgYXNzZXJ0X25vdF9wYXJzZXMoJyJ7IicsICJmb28gPGVycj4mLmJhciB7YTogYn0iKQorICBlbmQKKworICBkZWYgdGVzdF9ub19zZWxlY3Rvcl9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X25vdF9wYXJzZXMoJyJ7IicsICdmb28gPGVycj4jeyJiYXIifS5iYXoge2E6IGJ9JykKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9fcHJvcF9uYW1lX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfbm90X3BhcnNlcygnIjoiJywgJ2ZvbyB7YTxlcnI+I3siYmFyIn1iYXo6IGJ9JykKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9fcHJvcF92YWxfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9ub3RfcGFyc2VzKCcifSInLCAnZm9vIHthOiBiIDxlcnI+I3siYmFyIn0gY30nKQorICBlbmQKKworICBkZWYgdGVzdF9ub19zdHJpbmdfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9wYXJzZXMgPDxTQ1NTCitmb28geworICBhOiAiYmFuZyBcI3sxICsgICAgIiBiYXIgIn0gYmlwIjsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9ub19zYXNzX3NjcmlwdF92YWx1ZXMKKyAgICBhc3NlcnRfbm90X3BhcnNlcygnIn0iJywgJ2ZvbyB7YTogYiA8ZXJyPiogY30nKQorICBlbmQKKworICBkZWYgdGVzdF9ub19uZXN0ZWRfcnVsZXMKKyAgICBhc3NlcnRfbm90X3BhcnNlcygnIjoiJywgJ2ZvbyB7YmFyIDxlcnI+e2E6IGJ9fScpCisgICAgYXNzZXJ0X25vdF9wYXJzZXMoJyJ9IicsICdmb28gezxlcnI+W2Jhcj1iYXpdIHthOiBifX0nKQorICBlbmQKKworICBkZWYgdGVzdF9ub19uZXN0ZWRfcHJvcGVydGllcworICAgIGFzc2VydF9ub3RfcGFyc2VzKCdleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCknLCAnZm9vIHtiYXI6IDxlcnI+e2E6IGJ9fScpCisgICAgYXNzZXJ0X25vdF9wYXJzZXMoJ2V4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKScsICdmb28ge2JhcjogYmFuZyA8ZXJyPnthOiBifX0nKQorICBlbmQKKworICBkZWYgdGVzdF9ub19uZXN0ZWRfZGlyZWN0aXZlcworICAgIGFzc2VydF9ub3RfcGFyc2VzKCcifSInLCAnZm9vIHs8ZXJyPkBiYXIge2E6IGJ9fScpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Vycm9yX3dpdGhfd2luZG93c19uZXdsaW5lcworICAgIHJlbmRlciA8PFNDU1MKK2ZvbyB7YmFyfVxyCitiYXoge2E6IGJ9CitTQ1NTCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgc3ludGF4IGVycm9yIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwgJ0ludmFsaWQgQ1NTIGFmdGVyICJmb28ge2JhciI6IGV4cGVjdGVkICI6Iiwgd2FzICJ9IicsIGUubWVzc2FnZQorICAgIGFzc2VydF9lcXVhbCAxLCBlLnNhc3NfbGluZQorICBlbmQKKworICBkZWYgdGVzdF9uZXdsaW5lX2luX3Byb3BlcnR5X3ZhbHVlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKy5mb28geworICBiYXI6ICJiYXpiYW5nIjsgfQorQ1NTCisuZm9vIHsKKyAgYmFyOiAiYmF6XFwKK2JhbmciOworfQorU0NTUworICBlbmQKKworICAjIyBSZWdyZXNzaW9ucworCisgIGRlZiB0ZXN0X3ZlcnlfbG9uZ19jb21tZW50X2RvZXNudF90YWtlX2ZvcmV2ZXIKKyAgICBzdHJpbmcgPSAnYXNkZicgKiAoMTAwMDAwKQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisvKgorICAje3N0cmluZ30KKyovCitDU1MKKy8qCisgICN7c3RyaW5nfQorKi8KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbG9uZ191bmNsb3NlZF9jb21tZW50X2RvZXNudF90YWtlX2ZvcmV2ZXIKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwKKyAgICAgICdJbnZhbGlkIENTUyBhZnRlciAiLyoiOiBleHBlY3RlZCAiLyIsIHdhcyAiLy8qKioqKioqKioqKioqLi4uIicpIHtyZW5kZXIoPDxTQ1NTKX0KKy8qCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RvdWJsZV9zcGFjZV9zdHJpbmcKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmEgeworICBjb250ZW50OiAiICBhIjsgfQorQ1NTCisuYSB7CisgIGNvbnRlbnQ6ICIgIGEiOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF92ZXJ5X2xvbmdfbnVtYmVyX3dpdGhfaW1wb3J0YW50X2RvZXNudF90YWtlX2ZvcmV2ZXIKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmZvbyB7CisgIHdpZHRoOiA5Ny45MTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjclICFpbXBvcnRhbnQ7IH0KK0NTUworLmZvbyB7CisgIHdpZHRoOiA5Ny45MTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjclICFpbXBvcnRhbnQ7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX3dpdGhvdXRfY2xvc2luZ19icmFja2V0CisgICAgYXNzZXJ0X25vdF9wYXJzZXMoJyJdIicsICJmb29bYmFyIDxlcnI+e2E6IGJ9IikKKyAgZW5kCisKKyAgZGVmIHRlc3RfY2xvc2luZ19saW5lX2NvbW1lbnRfZW5kX3dpdGhfY29tcGFjdF9vdXRwdXQKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MsIDpzdHlsZSA9PiA6Y29tcGFjdCkpCisvKiBmb28gKi8KK2JhciB7IGJhejogYmFuZzsgfQorQ1NTCisvKgorICogZm9vCisgKi8KK2JhciB7YmF6OiBiYW5nfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zaW5nbGVfbGluZV9jb21tZW50X3dpdGhpbl9tdWx0aWxpbmVfY29tbWVudAorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCitib2R5IHsKKyAgLyoKKyAgLy9jb21tZW50IGhlcmUKKyAgKi8gfQorQ1NTCitib2R5IHsKKyAgLyoKKyAgLy9jb21tZW50IGhlcmUKKyAgKi8KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFsZm9ybWVkX21lZGlhCisgICAgcmVuZGVyIDw8U0NTUworQG1lZGlhIHsKKyAgbWFyZ2luOiAwOworfQorU0NTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICdJbnZhbGlkIENTUyBhZnRlciAiQG1lZGlhICI6IGV4cGVjdGVkIG1lZGlhIHF1ZXJ5IChlLmcuIHByaW50LCBzY3JlZW4sIHByaW50IGFuZCBzY3JlZW4pLCB3YXMgInsiJywgZS5tZXNzYWdlCisgICAgYXNzZXJ0X2VxdWFsIDEsIGUuc2Fzc19saW5lCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgYXNzZXJ0X3NlbGVjdG9yX3BhcnNlcyhzZWxlY3RvcikKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworI3tzZWxlY3Rvcn0geworICBhOiBiOyB9CitTQ1NTCisKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworOm5vdCgje3NlbGVjdG9yfSkgeworICBhOiBiOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiBhc3NlcnRfZGlyZWN0aXZlX3BhcnNlcyhwYXJhbSkKKyAgICBhc3NlcnRfcGFyc2VzIDw8U0NTUworQHVua25vd24gI3twYXJhbX0geworICBhOiBiOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiByZW5kZXIoc2Nzcywgb3B0aW9ucyA9IHt9KQorICAgIHRyZWUgPSBTYXNzOjpTQ1NTOjpDc3NQYXJzZXIubmV3KHNjc3MsIG9wdGlvbnNbOmZpbGVuYW1lXSwgbmlsKS5wYXJzZQorICAgIHRyZWUub3B0aW9ucyA9IFNhc3M6OkVuZ2luZTo6REVGQVVMVF9PUFRJT05TLm1lcmdlKG9wdGlvbnMpCisgICAgdHJlZS5yZW5kZXIKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Njc3MvcnhfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Njc3MvcnhfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOTIzZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc2Nzcy9yeF90ZXN0LnJiCkBAIC0wLDAgKzEsMTU5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3Nhc3MvZW5naW5lJworCitjbGFzcyBTY3NzUnhUZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBTYXNzOjpTQ1NTOjpSWAorCisgIGRlZiB0ZXN0X2lkZW50aWZpZXJzCisgICAgYXNzZXJ0X21hdGNoIElERU5ULCAiZm9vIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIlx4QzNceEJGb28iICMgSW5pdGlhbCBjaGFyIGNhbiBiZSBub25hc2NpaQorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIlxcMTIzYWJjb28iICMgSW5pdGlhbCBjaGFyIGNhbiBiZSB1bmljb2RlIGVzY2FwZQorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIlxcZiBvbyIgIyBVbmljb2RlIGVzY2FwZXMgY2FuIGJlIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICJcXGZhXHRvbyIKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICJcXGZmMlxyb28iCisgICAgYXNzZXJ0X21hdGNoIElERU5ULCAiXFxmMTNhXGZvbyIKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICJcXGYxM2FiY29vIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIlxcIG9vIiAjIEluaXRpYWwgY2hhciBjYW4gYmUgYSBwbGFpbiBlc2NhcGUgYXMgd2VsbAorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIlxcfm9vIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIlxcXFxvbyIKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICJcXHtvbyIKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICJcXFx4QzNceEJGb28iCisgICAgYXNzZXJ0X21hdGNoIElERU5ULCAiLWZvbyIgIyBDYW4gcHV0IGEgLSBiZWZvcmUgYW55dGhpbmcKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICItXHhDM1x4QkZvbyIKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICItXFxmIG9vIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIl9mb28iICMgQ2FuIHB1dCBhIF8gYmVmb3JlIGFueXRoaW5nCisgICAgYXNzZXJ0X21hdGNoIElERU5ULCAiX1x4QzNceEJGb28iCisgICAgYXNzZXJ0X21hdGNoIElERU5ULCAiX1xcZiBvbyIKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICItLWZvbyIgIyAiQ3VzdG9tIiBpZGVudGlmaWVyCisKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICJmb28tYmFyIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgImYwMTItMjMiCisgICAgYXNzZXJ0X21hdGNoIElERU5ULCAiZm9vXy1fYmFyIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgImYwMTJfMjMiCisKKyAgICAjIGh0dHA6Ly93d3cudzMub3JnL1N0eWxlL0NTUy9UZXN0L0NTUzIuMS9jdXJyZW50L3hodG1sMS9lc2NhcGVzLTAwMy54aHQKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICJjXFxsYXNzIgorICAgICMgaHR0cDovL3d3dy53My5vcmcvU3R5bGUvQ1NTL1Rlc3QvQ1NTMi4xL2N1cnJlbnQveGh0bWwxL2VzY2FwZXMtMDA0LnhodAorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgImNcXDAwMDA2Q2FzXFwwMDAwNzMiCisgICAgIyBodHRwOi8vd3d3LnczLm9yZy9TdHlsZS9DU1MvVGVzdC9DU1MyLjEvY3VycmVudC94aHRtbDEvaWRlbnQtMDAxLnhodAorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIklkRTZuLTN0MF82IgorICAgICMgaHR0cDovL3d3dy53My5vcmcvU3R5bGUvQ1NTL1Rlc3QvQ1NTMi4xL2N1cnJlbnQveGh0bWwxL2lkZW50LTAwNi54aHQKKyAgICBhc3NlcnRfbWF0Y2ggSURFTlQsICJcXDYwMDBpZGVudCIKKyAgICAjIGh0dHA6Ly93d3cudzMub3JnL1N0eWxlL0NTUy9UZXN0L0NTUzIuMS9jdXJyZW50L3hodG1sMS9pZGVudC0wMDcueGh0CisgICAgYXNzZXJ0X21hdGNoIElERU5ULCAiaWRlblxcNjAwMHRcXDYwMDAiCisgICAgIyBodHRwOi8vd3d3LnczLm9yZy9TdHlsZS9DU1MvVGVzdC9DU1MyLjEvY3VycmVudC94aHRtbDEvaWRlbnQtMDEzLnhodAorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIlxcLWlkZW50IgorICBlbmQKKworICBkZWYgdGVzdF91bmRlcnNjb3Jlc19pbl9pZGVudGlmaWVycworICAgIGFzc2VydF9tYXRjaCBJREVOVCwgImZvb19iYXIiCisgICAgYXNzZXJ0X21hdGNoIElERU5ULCAiX1x4QzNceEJGZm9vIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIl9fZm9vIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIl8xZm9vIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIi1fZm9vIgorICAgIGFzc2VydF9tYXRjaCBJREVOVCwgIl8tZm9vIgorICBlbmQKKworICBkZWYgdGVzdF9pbnZhbGlkX2lkZW50aWZpZXJzCisgICAgYXNzZXJ0X25vX21hdGNoIElERU5ULCAiIgorICAgIGFzc2VydF9ub19tYXRjaCBJREVOVCwgIjFmb28iCisgICAgYXNzZXJ0X25vX21hdGNoIElERU5ULCAiLTFmb28iCisgICAgYXNzZXJ0X25vX21hdGNoIElERU5ULCAiZm9vIGJhciIKKyAgICBhc3NlcnRfbm9fbWF0Y2ggSURFTlQsICJmb29+YmFyIgorCisgICAgIyBodHRwOi8vd3d3LnczLm9yZy9TdHlsZS9DU1MvVGVzdC9DU1MyLjEvY3VycmVudC94aHRtbDEvZXNjYXBlcy0wMDgueGh0CisgICAgYXNzZXJ0X25vX21hdGNoIElERU5ULCAiY1xcMDZDICBhc3MiCisgICAgYXNzZXJ0X25vX21hdGNoIElERU5ULCAiYmFja1xcNjdcbiByb3VuZCIKKyAgZW5kCisKKyAgZGVmIHRlc3RfZG91YmxlX3F1b3RlX3N0cmluZ3MKKyAgICBhc3NlcnRfbWF0Y2ggU1RSSU5HLCAnImZvbyBiYXIiJworICAgIGFzc2VydF9tYXRjaCBTVFJJTkcsICciZm9vXFxcbmJhciInCisgICAgYXNzZXJ0X21hdGNoIFNUUklORywgIlwiXFxcIlwiIgorICAgIGFzc2VydF9tYXRjaCBTVFJJTkcsICciXHQgISMkJSYoLX4oKSorLC0uLzAxMjM0NTY3ODl+IicKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2luZ2xlX3F1b3RlX3N0cmluZ3MKKyAgICBhc3NlcnRfbWF0Y2ggU1RSSU5HLCAiJ2ZvbyBiYXInIgorICAgIGFzc2VydF9tYXRjaCBTVFJJTkcsICInZm9vXFxcbmJhciciCisgICAgYXNzZXJ0X21hdGNoIFNUUklORywgIidcXCcnIgorICAgIGFzc2VydF9tYXRjaCBTVFJJTkcsICInXHQgISNcJCUmKC1+KCkqKywtLi8wMTIzNDU2Nzg5ficiCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludmFsaWRfc3RyaW5ncworICAgIGFzc2VydF9ub19tYXRjaCBTVFJJTkcsICJcImZvb1xuYmFyXCIiCisgICAgYXNzZXJ0X25vX21hdGNoIFNUUklORywgIlwiZm9vXCJiYXJcIiIKKyAgICBhc3NlcnRfbm9fbWF0Y2ggU1RSSU5HLCAiJ2Zvb1xuYmFyJyIKKyAgICBhc3NlcnRfbm9fbWF0Y2ggU1RSSU5HLCAiJ2ZvbydiYXInIgorICBlbmQKKworICBkZWYgdGVzdF91cmkKKyAgICBhc3NlcnRfbWF0Y2ggVVJJLCAndXJsKCJmb28gYmFyKSIpJworICAgIGFzc2VydF9tYXRjaCBVUkksICJ1cmwoJ2ZvbyBiYXIpJykiCisgICAgYXNzZXJ0X21hdGNoIFVSSSwgJ3VybCggImZvbyBiYXIpIiApJworICAgIGFzc2VydF9tYXRjaCBVUkksICJ1cmwoI1xcJSYqKissLS4vMDEyMzQ1Njc4OX4pIgorICBlbmQKKworICBkZWYgdGVzdF9pbnZhbGlkX3VyaQorICAgIGFzc2VydF9ub19tYXRjaCBVUkksICd1cmwoZm9vKWJhciknCisgIGVuZAorCisgIGRlZiB0ZXN0X3VuaWNvZGVfcmFuZ2UKKyAgICBhc3NlcnRfbWF0Y2ggVU5JQ09ERVJBTkdFLCAnVSswMC1GZicKKyAgICBhc3NlcnRfbWF0Y2ggVU5JQ09ERVJBTkdFLCAndSs5ODAtOUZGJworICAgIGFzc2VydF9tYXRjaCBVTklDT0RFUkFOR0UsICdVKzlhRj8/JworICAgIGFzc2VydF9tYXRjaCBVTklDT0RFUkFOR0UsICdVKz8/JworICBlbmQKKworICBkZWYgdGVzdF9lc2NhcGVfZW1wdHlfaWRlbnQKKyAgICBhc3NlcnRfZXF1YWwgIiIsIFNhc3M6OlNDU1M6OlJYLmVzY2FwZV9pZGVudCgiIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXNjYXBlX2p1c3RfcHJlZml4X2lkZW50CisgICAgYXNzZXJ0X2VxdWFsICJcXC0iLCBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQoIi0iKQorICAgIGFzc2VydF9lcXVhbCAiXFxfIiwgU2Fzczo6U0NTUzo6UlguZXNjYXBlX2lkZW50KCJfIikKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXNjYXBlX3BsYWluX2lkZW50CisgICAgYXNzZXJ0X2VxdWFsICJmb28iLCBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQoImZvbyIpCisgICAgYXNzZXJ0X2VxdWFsICJmb28tMWJhciIsIFNhc3M6OlNDU1M6OlJYLmVzY2FwZV9pZGVudCgiZm9vLTFiYXIiKQorICAgIGFzc2VydF9lcXVhbCAiLWZvby1iYXIiLCBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQoIi1mb28tYmFyIikKKyAgICBhc3NlcnRfZXF1YWwgImYyb29fYmFyIiwgU2Fzczo6U0NTUzo6UlguZXNjYXBlX2lkZW50KCJmMm9vX2JhciIpCisgICAgYXNzZXJ0X2VxdWFsICJfZm9vX2JhciIsIFNhc3M6OlNDU1M6OlJYLmVzY2FwZV9pZGVudCgiX2Zvb19iYXIiKQorICBlbmQKKworICBkZWYgdGVzdF9lc2NhcGVfaW5pdGlhbF9mdW5reV9pZGVudAorICAgIGFzc2VydF9lcXVhbCAiXFwwMDAwMzVmb28iLCBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQoIjVmb28iKQorICAgIGFzc2VydF9lcXVhbCAiLVxcMDAwMDM1Zm9vIiwgU2Fzczo6U0NTUzo6UlguZXNjYXBlX2lkZW50KCItNWZvbyIpCisgICAgYXNzZXJ0X2VxdWFsICJfXFwwMDAwMzVmb28iLCBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQoIl81Zm9vIikKKworICAgIGFzc2VydF9lcXVhbCAiXFwmZm9vIiwgU2Fzczo6U0NTUzo6UlguZXNjYXBlX2lkZW50KCImZm9vIikKKyAgICBhc3NlcnRfZXF1YWwgIi1cXCZmb28iLCBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQoIi0mZm9vIikKKworICAgIGFzc2VydF9lcXVhbCAiLVxcIGZvbyIsIFNhc3M6OlNDU1M6OlJYLmVzY2FwZV9pZGVudCgiLSBmb28iKQorICBlbmQKKworICBkZWYgdGVzdF9lc2NhcGVfbWlkX2Z1bmt5X2lkZW50CisgICAgYXNzZXJ0X2VxdWFsICJmb29cXCZiYXIiLCBTYXNzOjpTQ1NTOjpSWC5lc2NhcGVfaWRlbnQoImZvbyZiYXIiKQorICAgIGFzc2VydF9lcXVhbCAiZm9vXFwgXFwgYmFyIiwgU2Fzczo6U0NTUzo6UlguZXNjYXBlX2lkZW50KCJmb28gIGJhciIpCisgICAgYXNzZXJ0X2VxdWFsICJmb29cXDAwMDA3ZmJhciIsIFNhc3M6OlNDU1M6OlJYLmVzY2FwZV9pZGVudCgiZm9vXDE3N2JhciIpCisgIGVuZAorCisgIGRlZiB0ZXN0X25vX3N0YXRpY19oeXBoZW5hdGVkX3VuaXRzCisgICAgYXNzZXJ0X25vX21hdGNoIFNUQVRJQ19WQUxVRSwgIjIwcHgtMjBweCIKKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgIGRlZiBhc3NlcnRfbWF0Y2gocngsIHN0cikKKyAgICByZWZ1dGVfbmlsKG1hdGNoID0gcngubWF0Y2goc3RyKSkKKyAgICBhc3NlcnRfZXF1YWwgc3RyLnNpemUsIG1hdGNoWzBdLnNpemUKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9ub19tYXRjaChyeCwgc3RyKQorICAgIG1hdGNoID0gcngubWF0Y2goc3RyKQorICAgIHJlZnV0ZV9lcXVhbCBzdHIuc2l6ZSwgbWF0Y2ggJiYgbWF0Y2hbMF0uc2l6ZQorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9zY3NzL3Njc3NfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3Njc3Mvc2Nzc190ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkMDdkZGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9zY3NzL3Njc3NfdGVzdC5yYgpAQCAtMCwwICsxLDQyMzggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3Rlc3RfaGVscGVyJworCitjbGFzcyBTY3NzVGVzdCA8IE1pbmlUZXN0OjpUZXN0CisgIGluY2x1ZGUgU2Nzc1Rlc3RIZWxwZXIKKworICAjIyBPbmUtTGluZSBDb21tZW50cworCisgIGRlZiB0ZXN0X29uZV9saW5lX2NvbW1lbnRzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGJhejogYmFuZzsgfQorQ1NTCisuZm9vIHsvLyBiYXI6IGJhejt9CisgIGJhejogYmFuZzsgLy99Cit9CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyBiYXJbdmFsPSIvLyJdIHsKKyAgYmF6OiBiYW5nOyB9CitDU1MKKy5mb28gYmFyW3ZhbD0iLy8iXSB7CisgIGJhejogYmFuZzsgLy99Cit9CitTQ1NTCisgIGVuZAorCisgICMjIFNjcmlwdAorCisgIGRlZiB0ZXN0X3ZhcmlhYmxlcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2JsYXQgeworICBhOiBmb287IH0KK0NTUworJHZhcjogZm9vOworCitibGF0IHthOiAkdmFyfQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogMjsKKyAgYjogNjsgfQorQ1NTCitmb28geworICAkdmFyOiAyOworICAkYW5vdGhlci12YXI6IDQ7CisgIGE6ICR2YXI7CisgIGI6ICR2YXIgKyAkYW5vdGhlci12YXI7fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF91bmljb2RlX3ZhcmlhYmxlcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2JsYXQgeworICBhOiBmb287IH0KK0NTUworJHbDpHI6IGZvbzsKKworYmxhdCB7YTogJHbDpHJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2d1YXJkX2Fzc2lnbgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGE6IDE7IH0KK0NTUworJHZhcjogMTsKKyR2YXI6IDIgIWRlZmF1bHQ7CisKK2ZvbyB7YTogJHZhcn0KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGE6IDI7IH0KK0NTUworJHZhcjogMiAhZGVmYXVsdDsKKworZm9vIHthOiAkdmFyfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zYXNzX3NjcmlwdAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGE6IDM7CisgIGI6IC0xOworICBjOiBmb29iYXI7CisgIGQ6IDEycHg7IH0KK0NTUworZm9vIHsKKyAgYTogMSArIDI7CisgIGI6IDEgLSAyOworICBjOiBmb28gKyBiYXI7CisgIGQ6IGZsb29yKDEyLjNweCk7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVidWdfZGlyZWN0aXZlCisgICAgYXNzZXJ0X3dhcm5pbmcgInRlc3RfZGVidWdfZGlyZWN0aXZlX2lubGluZS5zY3NzOjIgREVCVUc6IGhlbGxvIHdvcmxkISIgZG8KKyAgICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGE6IGI7IH0KKworYmFyIHsKKyAgYzogZDsgfQorQ1NTCitmb28ge2E6IGJ9CitAZGVidWcgImhlbGxvIHdvcmxkISI7CitiYXIge2M6IGR9CitTQ1NTCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2Vycm9yX2RpcmVjdGl2ZQorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAiaGVsbG8gd29ybGQhIikge3JlbmRlcig8PFNDU1MpfQorZm9vIHthOiBifQorQGVycm9yICJoZWxsbyB3b3JsZCEiOworYmFyIHtjOiBkfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF93YXJuX2RpcmVjdGl2ZQorICAgIGV4cGVjdGVkX3dhcm5pbmcgPSA8PEVYUEVDVEFUSU9OCitXQVJOSU5HOiB0aGlzIGlzIGEgd2FybmluZworICAgICAgICAgb24gbGluZSAyIG9mIHRlc3Rfd2Fybl9kaXJlY3RpdmVfaW5saW5lLnNjc3MKKworV0FSTklORzogdGhpcyBpcyBhIG1peGluCisgICAgICAgICBvbiBsaW5lIDEgb2YgdGVzdF93YXJuX2RpcmVjdGl2ZV9pbmxpbmUuc2NzcywgaW4gYGZvbycKKyAgICAgICAgIGZyb20gbGluZSAzIG9mIHRlc3Rfd2Fybl9kaXJlY3RpdmVfaW5saW5lLnNjc3MKK0VYUEVDVEFUSU9OCisgICAgYXNzZXJ0X3dhcm5pbmcgZXhwZWN0ZWRfd2FybmluZyBkbworICAgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorYmFyIHsKKyAgYzogZDsgfQorQ1NTCitAbWl4aW4gZm9vIHsgQHdhcm4gInRoaXMgaXMgYSBtaXhpbiI7fQorQHdhcm4gInRoaXMgaXMgYSB3YXJuaW5nIjsKK2JhciB7YzogZDsgQGluY2x1ZGUgZm9vO30KK1NDU1MKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9yX2RpcmVjdGl2ZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBhOiAxOworICBhOiAyOworICBhOiAzOworICBhOiA0OyB9CitDU1MKKy5mb28geworICBAZm9yICR2YXIgZnJvbSAxIHRvIDUge2E6ICR2YXI7fQorfQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IDE7CisgIGE6IDI7CisgIGE6IDM7CisgIGE6IDQ7CisgIGE6IDU7IH0KK0NTUworLmZvbyB7CisgIEBmb3IgJHZhciBmcm9tIDEgdGhyb3VnaCA1IHthOiAkdmFyO30KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9yX2RpcmVjdGl2ZV93aXRoX3NhbWVfc3RhcnRfYW5kX2VuZAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0NTUworLmZvbyB7CisgIEBmb3IgJHZhciBmcm9tIDEgdG8gMSB7YTogJHZhcjt9Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsgfQorQ1NTCisuZm9vIHsKKyAgQGZvciAkdmFyIGZyb20gMSB0aHJvdWdoIDEge2E6ICR2YXI7fQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9kZWNyZW1lbnRpbmdfZXN0Zm9yX2RpcmVjdGl2ZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBhOiA1OworICBhOiA0OworICBhOiAzOworICBhOiAyOworICBhOiAxOyB9CitDU1MKKy5mb28geworICBAZm9yICR2YXIgZnJvbSA1IHRocm91Z2ggMSB7YTogJHZhcjt9Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogNTsKKyAgYTogNDsKKyAgYTogMzsKKyAgYTogMjsgfQorQ1NTCisuZm9vIHsKKyAgQGZvciAkdmFyIGZyb20gNSB0byAxIHthOiAkdmFyO30KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWZfZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogYjsgfQorQ1NTCitAaWYgImZvbyIgPT0gImZvbyIge2ZvbyB7YTogYn19CitAaWYgImZvbyIgIT0gImZvbyIge2JhciB7YTogYn19CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitiYXIgeworICBhOiBiOyB9CitDU1MKK0BpZiAiZm9vIiAhPSAiZm9vIiB7Zm9vIHthOiBifX0KK0BlbHNlIGlmICJmb28iID09ICJmb28iIHtiYXIge2E6IGJ9fQorQGVsc2UgaWYgdHJ1ZSB7YmF6IHthOiBifX0KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2JhciB7CisgIGE6IGI7IH0KK0NTUworQGlmICJmb28iICE9ICJmb28iIHtmb28ge2E6IGJ9fQorQGVsc2Uge2JhciB7YTogYn19CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbW1lbnRfYWZ0ZXJfaWZfZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogYjsKKyAgLyogVGhpcyBpcyBhIGNvbW1lbnQgKi8KKyAgYzogZDsgfQorQ1NTCitmb28geworICBAaWYgdHJ1ZSB7YTogYn0KKyAgLyogVGhpcyBpcyBhIGNvbW1lbnQgKi8KKyAgYzogZCB9CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogYjsKKyAgLyogVGhpcyBpcyBhIGNvbW1lbnQgKi8KKyAgYzogZDsgfQorQ1NTCitmb28geworICBAaWYgdHJ1ZSB7YTogYn0KKyAgQGVsc2Uge3g6IHl9CisgIC8qIFRoaXMgaXMgYSBjb21tZW50ICovCisgIGM6IGQgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF93aGlsZV9kaXJlY3RpdmUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsKKyAgYTogMjsKKyAgYTogMzsKKyAgYTogNDsgfQorQ1NTCiskaTogMTsKKworLmZvbyB7CisgIEB3aGlsZSAkaSAhPSA1IHsKKyAgICBhOiAkaTsKKyAgICAkaTogJGkgKyAxICFnbG9iYWw7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWFjaF9kaXJlY3RpdmUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCithIHsKKyAgYjogMXB4OworICBiOiAycHg7CisgIGI6IDNweDsKKyAgYjogNHB4OyB9CisKK2MgeworICBkOiBmb287CisgIGQ6IGJhcjsKKyAgZDogYmF6OworICBkOiBiYW5nOyB9CitDU1MKK2EgeworICBAZWFjaCAkbnVtYmVyIGluIDFweCAycHggM3B4IDRweCB7CisgICAgYjogJG51bWJlcjsKKyAgfQorfQorYyB7CisgIEBlYWNoICRzdHIgaW4gZm9vLCBiYXIsIGJheiwgYmFuZyB7CisgICAgZDogJHN0cjsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9kZXN0cnVjdHVyaW5nX2VhY2hfZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorYSB7CisgIGZvbzogMXB4OworICBiYXI6IDJweDsKKyAgYmF6OiAzcHg7IH0KKworYyB7CisgIGZvbzogIlZhbHVlIGlzIGJhciI7CisgIGJhcjogIlZhbHVlIGlzIGJheiI7CisgIGJhbmc6ICJWYWx1ZSBpcyAiOyB9CitDU1MKK2EgeworICBAZWFjaCAkbmFtZSwgJG51bWJlciBpbiAoZm9vOiAxcHgsIGJhcjogMnB4LCBiYXo6IDNweCkgeworICAgIFwjeyRuYW1lfTogJG51bWJlcjsKKyAgfQorfQorYyB7CisgIEBlYWNoICRrZXksICR2YWx1ZSBpbiAoZm9vIGJhcikgKGJhciwgYmF6KSBiYW5nIHsKKyAgICBcI3ska2V5fTogIlZhbHVlIGlzIFwjeyR2YWx1ZX0iOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Nzc19pbXBvcnRfZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsICJAaW1wb3J0IHVybChmb28uY3NzKTtcbiIsIHJlbmRlcignQGltcG9ydCAiZm9vLmNzcyI7JykKKyAgICBhc3NlcnRfZXF1YWwgIkBpbXBvcnQgdXJsKGZvby5jc3MpO1xuIiwgcmVuZGVyKCJAaW1wb3J0ICdmb28uY3NzJzsiKQorICAgIGFzc2VydF9lcXVhbCAiQGltcG9ydCB1cmwoXCJmb28uY3NzXCIpO1xuIiwgcmVuZGVyKCdAaW1wb3J0IHVybCgiZm9vLmNzcyIpOycpCisgICAgYXNzZXJ0X2VxdWFsICJAaW1wb3J0IHVybChcImZvby5jc3NcIik7XG4iLCByZW5kZXIoJ0BpbXBvcnQgdXJsKCJmb28uY3NzIik7JykKKyAgICBhc3NlcnRfZXF1YWwgIkBpbXBvcnQgdXJsKGZvby5jc3MpO1xuIiwgcmVuZGVyKCdAaW1wb3J0IHVybChmb28uY3NzKTsnKQorICBlbmQKKworICBkZWYgdGVzdF9jc3Nfc3RyaW5nX2ltcG9ydF9kaXJlY3RpdmVfd2l0aF9tZWRpYQorICAgIGFzc2VydF9wYXJzZXMgJ0BpbXBvcnQgImZvby5jc3MiIHNjcmVlbjsnCisgICAgYXNzZXJ0X3BhcnNlcyAnQGltcG9ydCAiZm9vLmNzcyIgc2NyZWVuLCBwcmludDsnCisgICAgYXNzZXJ0X3BhcnNlcyAnQGltcG9ydCAiZm9vLmNzcyIgc2NyZWVuLCBwcmludCBhbmQgKGZvbzogMCk7JworICAgIGFzc2VydF9wYXJzZXMgJ0BpbXBvcnQgImZvby5jc3MiIHNjcmVlbiwgb25seSBwcmludCwgc2NyZWVuIGFuZCAoZm9vOiAwKTsnCisgIGVuZAorCisgIGRlZiB0ZXN0X2Nzc191cmxfaW1wb3J0X2RpcmVjdGl2ZV93aXRoX21lZGlhCisgICAgYXNzZXJ0X3BhcnNlcyAnQGltcG9ydCB1cmwoImZvby5jc3MiKSBzY3JlZW47JworICAgIGFzc2VydF9wYXJzZXMgJ0BpbXBvcnQgdXJsKCJmb28uY3NzIikgc2NyZWVuLCBwcmludDsnCisgICAgYXNzZXJ0X3BhcnNlcyAnQGltcG9ydCB1cmwoImZvby5jc3MiKSBzY3JlZW4sIHByaW50IGFuZCAoZm9vOiAwKTsnCisgICAgYXNzZXJ0X3BhcnNlcyAnQGltcG9ydCB1cmwoImZvby5jc3MiKSBzY3JlZW4sIG9ubHkgcHJpbnQsIHNjcmVlbiBhbmQgKGZvbzogMCk7JworICBlbmQKKworICBkZWYgdGVzdF9tZWRpYV9pbXBvcnQKKyAgICBhc3NlcnRfZXF1YWwoIkBpbXBvcnQgXCIuL2ZvbnRzLnNhc3NcIiBhbGw7XG4iLCByZW5kZXIoIkBpbXBvcnQgXCIuL2ZvbnRzLnNhc3NcIiBhbGw7IikpCisgIGVuZAorCisgIGRlZiB0ZXN0X2R5bmFtaWNfbWVkaWFfaW1wb3J0CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK0BpbXBvcnQgImZvbyIgcHJpbnQgYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW8tZm9vOiAyNSk7CitDU1MKKyRtZWRpYTogcHJpbnQ7Ciska2V5OiAtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW87CiskdmFsdWU6IDIwOworQGltcG9ydCAiZm9vIiBcI3skbWVkaWF9IGFuZCAoJGtleSArICItZm9vIjogJHZhbHVlICsgNSk7CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2h0dHBfaW1wb3J0CisgICAgYXNzZXJ0X2VxdWFsKCJAaW1wb3J0IFwiaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2Fuc1wiO1xuIiwKKyAgICAgIHJlbmRlcigiQGltcG9ydCBcImh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnNcIjsiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHJvdG9jb2xfcmVsYXRpdmVfaW1wb3J0CisgICAgYXNzZXJ0X2VxdWFsKCJAaW1wb3J0IFwiLy9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnNcIjtcbiIsCisgICAgICByZW5kZXIoIkBpbXBvcnQgXCIvL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2Fuc1wiOyIpKQorICBlbmQKKworICBkZWYgdGVzdF9pbXBvcnRfd2l0aF9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQGltcG9ydCB1cmwoImh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnMiKTsKK0NTUworJGZhbWlseTogdW5xdW90ZSgiRHJvaWQrU2FucyIpOworQGltcG9ydCB1cmwoImh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVwjeyRmYW1pbHl9Iik7CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3VybF9pbXBvcnQKKyAgICBhc3NlcnRfZXF1YWwoIkBpbXBvcnQgdXJsKGZvbnRzLnNhc3MpO1xuIiwgcmVuZGVyKCJAaW1wb3J0IHVybChmb250cy5zYXNzKTsiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3NzX2ltcG9ydF9kb2VzbnRfbW92ZV90aHJvdWdoX2NvbW1lbnRzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLyogQ29tbWVudCAxICovCitAaW1wb3J0IHVybCgiZm9vLmNzcyIpOworLyogQ29tbWVudCAyICovCitAaW1wb3J0IHVybCgiYmFyLmNzcyIpOworQ1NTCisvKiBDb21tZW50IDEgKi8KK0BpbXBvcnQgdXJsKCJmb28uY3NzIik7CisKKy8qIENvbW1lbnQgMiAqLworQGltcG9ydCB1cmwoImJhci5jc3MiKTsKK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY3NzX2ltcG9ydF9tb3ZlbWVudF9zdG9wc19hdF9jb21tZW50cworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy8qIENvbW1lbnQgMSAqLworQGltcG9ydCB1cmwoImZvby5jc3MiKTsKKy8qIENvbW1lbnQgMiAqLworQGltcG9ydCB1cmwoImJhci5jc3MiKTsKKy5mb28geworICBhOiBiOyB9CisKKy8qIENvbW1lbnQgMyAqLworQ1NTCisvKiBDb21tZW50IDEgKi8KK0BpbXBvcnQgdXJsKCJmb28uY3NzIik7CisKKy8qIENvbW1lbnQgMiAqLworCisuZm9vIHthOiBifQorCisvKiBDb21tZW50IDMgKi8KK0BpbXBvcnQgdXJsKCJiYXIuY3NzIik7CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Jsb2NrX2NvbW1lbnRfaW5fc2NyaXB0CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogMWJhcjsgfQorQ1NTCitmb28ge2E6IDEgKyAvKiBmbGFuZyAqLyBiYXJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpbmVfY29tbWVudF9pbl9zY3JpcHQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28geworICBhOiAxYmxhbmc7IH0KK0NTUworZm9vIHthOiAxICsgLy8gZmxhbmcgfQorICBibGFuZyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0YXRpY19oeXBoZW5hdGVkX3VuaXQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28geworICBhOiAwcHg7IH0KK0NTUworZm9vIHthOiAxMHB4LTEwcHggfQorU0NTUworICBlbmQKKworICAjIyBOZXN0ZWQgUnVsZXMKKworICBkZWYgdGVzdF9uZXN0ZWRfcnVsZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28gYmFyIHsKKyAgYTogYjsgfQorQ1NTCitmb28ge2JhciB7YTogYn19CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIGJhciB7CisgIGE6IGI7IH0KK2ZvbyBiYXogeworICBiOiBjOyB9CitDU1MKK2ZvbyB7CisgIGJhciB7YTogYn0KKyAgYmF6IHtiOiBjfX0KK1NDU1MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28gYmFyIGJheiB7CisgIGE6IGI7IH0KK2ZvbyBiYW5nIGJpcCB7CisgIGE6IGI7IH0KK0NTUworZm9vIHsKKyAgYmFyIHtiYXoge2E6IGJ9fQorICBiYW5nIHtiaXAge2E6IGJ9fX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX3J1bGVzX3dpdGhfZGVjbGFyYXRpb25zCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogYjsgfQorICBmb28gYmFyIHsKKyAgICBjOiBkOyB9CitDU1MKK2ZvbyB7CisgIGE6IGI7CisgIGJhciB7YzogZH19CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogYjsgfQorICBmb28gYmFyIHsKKyAgICBjOiBkOyB9CitDU1MKK2ZvbyB7CisgIGJhciB7YzogZH0KKyAgYTogYn0KK1NDU1MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28geworICB1bXA6IG51bXA7CisgIGdydW1wOiBjbHVtcDsgfQorICBmb28gYmFyIHsKKyAgICBibGF0OiBiYW5nOworICAgIGhhYml0OiByYWJiaXQ7IH0KKyAgICBmb28gYmFyIGJheiB7CisgICAgICBhOiBiOyB9CisgICAgZm9vIGJhciBiaXAgeworICAgICAgYzogZDsgfQorICBmb28gYmliYmxlIGJhcCB7CisgICAgZTogZjsgfQorQ1NTCitmb28geworICB1bXA6IG51bXA7CisgIGdydW1wOiBjbHVtcDsKKyAgYmFyIHsKKyAgICBibGF0OiBiYW5nOworICAgIGhhYml0OiByYWJiaXQ7CisgICAgYmF6IHthOiBifQorICAgIGJpcCB7YzogZH19CisgIGJpYmJsZSB7CisgICAgYmFwIHtlOiBmfX19CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9ydWxlc193aXRoX2ZhbmN5X3NlbGVjdG9ycworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyAuYmFyIHsKKyAgYTogYjsgfQorZm9vIDpiYXogeworICBjOiBkOyB9Citmb28gYmFuZzpib3AgeworICBlOiBmOyB9Citmb28gOjpxdXggeworICBnOiBoOyB9Citmb28gemFwOjpmYmx0aHAgeworICBpOiBqOyB9CitDU1MKK2ZvbyB7CisgIC5iYXIge2E6IGJ9CisgIDpiYXoge2M6IGR9CisgIGJhbmc6Ym9wIHtlOiBmfQorICA6OnF1eCB7ZzogaH0KKyAgemFwOjpmYmx0aHAge2k6IGp9fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hbG1vc3RfYW1iaWd1b3VzX25lc3RlZF9ydWxlc19hbmRfZGVjbGFyYXRpb25zCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYmFyOiBiYXogYmFuZyBib3AgYmlkZGxlIHdvbyBsb29rIGF0IGFsbCB0aGVzZSBlbGVtczsgfQorICBmb28gYmFyOmJhejpiYW5nOmJvcDpiaWRkbGU6d29vOmxvb2s6YXQ6YWxsOnRoZXNlOnBzZXVkb2NsYXNzZXMgeworICAgIGE6IGI7IH0KKyAgZm9vIGJhcjpiYXogYmFuZyBib3AgYmlkZGxlIHdvbyBsb29rIGF0IGFsbCB0aGVzZSBlbGVtcyB7CisgICAgYTogYjsgfQorQ1NTCitmb28geworICBiYXI6YmF6OmJhbmc6Ym9wOmJpZGRsZTp3b286bG9vazphdDphbGw6dGhlc2U6cHNldWRvY2xhc3NlcyB7YTogYn07CisgIGJhcjpiYXogYmFuZyBib3AgYmlkZGxlIHdvbyBsb29rIGF0IGFsbCB0aGVzZSBlbGVtcyB7YTogYn07CisgIGJhcjpiYXogYmFuZyBib3AgYmlkZGxlIHdvbyBsb29rIGF0IGFsbCB0aGVzZSBlbGVtczsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXdsaW5lc19pbl9zZWxlY3RvcnMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28KK2JhciB7CisgIGE6IGI7IH0KK0NTUworZm9vCitiYXIge2E6IGJ9CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28gYmF6LAorZm9vIGJhbmcsCitiYXIgYmF6LAorYmFyIGJhbmcgeworICBhOiBiOyB9CitDU1MKK2ZvbywKK2JhciB7CisgIGJheiwKKyAgYmFuZyB7YTogYn19CitTQ1NTCisKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28KK2JhciBiYXoKK2JhbmcgeworICBhOiBiOyB9Citmb28KK2JhciBiaXAgYm9wIHsKKyAgYzogZDsgfQorQ1NTCitmb28KK2JhciB7CisgIGJhegorICBiYW5nIHthOiBifQorCisgIGJpcCBib3Age2M6IGR9fQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIGJhbmcsIGZvbyBiaXAKK2JvcCwgYmFyCitiYXogYmFuZywgYmFyCitiYXogYmlwCitib3AgeworICBhOiBiOyB9CitDU1MKK2ZvbywgYmFyCitiYXogeworICBiYW5nLCBiaXAKKyAgYm9wIHthOiBifX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdHJhaWxpbmdfY29tbWFfaW5fc2VsZWN0b3IKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisjZm9vICNiYXIsCisjYmF6ICNib29tIHsKKyAgYTogYjsgfQorCisjYmlwICNib3AgeworICBjOiBkOyB9CitDU1MKKyNmb28gI2JhciwsCissI2JheiAjYm9vbSwge2E6IGJ9CisKKyNiaXAgI2JvcCwgLCwge2M6IGR9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3BhcmVudF9zZWxlY3RvcnMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb286aG92ZXIgeworICBhOiBiOyB9CitiYXIgZm9vLmJheiB7CisgIGM6IGQ7IH0KK0NTUworZm9vIHsKKyAgJjpob3ZlciB7YTogYn0KKyAgYmFyICYuYmF6IHtjOiBkfX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFyZW50X3NlbGVjdG9yX3dpdGhfc3ViamVjdAorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUyl9CitiYXIgZm9vLmJheiEgLmJpcCB7CisgIGE6IGI7IH0KKworYmFyIGZvbyBiYXIuYmF6ISAuYmlwIHsKKyAgYzogZDsgfQorQ1NTCitmb28geworICBiYXIgJi5iYXohIC5iaXAge2E6IGJ9fQorCitmb28gYmFyIHsKKyAgYmFyICYuYmF6ISAuYmlwIHtjOiBkfX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFyZW50X3NlbGVjdG9yX3dpdGhfc3VmZml4CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvby1iYXIgeworICBhOiBiOyB9CisuZm9vX2JhciB7CisgIGM6IGQ7IH0KKy5mb29iYXIgeworICBlOiBmOyB9CisuZm9vMTIzIHsKKyAgZTogZjsgfQorCis6aG92ZXItc3VmZml4IHsKKyAgZzogaDsgfQorQ1NTCisuZm9vIHsKKyAgJi1iYXIge2E6IGJ9CisgICZfYmFyIHtjOiBkfQorICAmYmFyIHtlOiBmfQorICAmMTIzIHtlOiBmfQorfQorCis6aG92ZXIgeworICAmLXN1ZmZpeCB7ZzogaH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5rbm93bl9kaXJlY3RpdmVfYnViYmxpbmcKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MsIDpzdHlsZSA9PiA6bmVzdGVkKSkKK0BmYmx0aHAgeworICAuZm9vIC5iYXIgeworICAgIGE6IGI7IH0gfQorQ1NTCisuZm9vIHsKKyAgQGZibHRocCB7CisgICAgLmJhciB7YTogYn0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9rZXlmcmFtZV9idWJibGluZworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUywgOnN0eWxlID0+IDpuZXN0ZWQpKQorQGtleWZyYW1lcyBzcGluIHsKKyAgMCUgeworICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9IH0KK0Atd2Via2l0LWtleWZyYW1lcyBzcGluIHsKKyAgMCUgeworICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9IH0KK0NTUworLmZvbyB7CisgIEBrZXlmcmFtZXMgc3BpbiB7CisgICAgMCUge3RyYW5zZm9ybTogcm90YXRlKDBkZWcpfQorICB9CisgIEAtd2Via2l0LWtleWZyYW1lcyBzcGluIHsKKyAgICAwJSB7dHJhbnNmb3JtOiByb3RhdGUoMGRlZyl9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgIyMgTmFtZXNwYWNlIFByb3BlcnRpZXMKKworICBkZWYgdGVzdF9uYW1lc3BhY2VfcHJvcGVydGllcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGJhcjogYmF6OworICBiYW5nLWJpcDogMXB4OworICBiYW5nLWJvcDogYmFyOyB9CitDU1MKK2ZvbyB7CisgIGJhcjogYmF6OworICBiYW5nOiB7CisgICAgYmlwOiAxcHg7CisgICAgYm9wOiBiYXI7fX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2V2ZXJhbF9uYW1lc3BhY2VfcHJvcGVydGllcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGJhcjogYmF6OworICBiYW5nLWJpcDogMXB4OworICBiYW5nLWJvcDogYmFyOworICBidXp6LWZyYW06ICJmb28iOworICBidXp6LWZydW06IG1vbzsgfQorQ1NTCitmb28geworICBiYXI6IGJhejsKKyAgYmFuZzogeworICAgIGJpcDogMXB4OworICAgIGJvcDogYmFyO30KKyAgYnV6ejogeworICAgIGZyYW06ICJmb28iOworICAgIGZydW06IG1vbzsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfbmFtZXNwYWNlX3Byb3BlcnRpZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28geworICBiYXI6IGJhejsKKyAgYmFuZy1iaXA6IDFweDsKKyAgYmFuZy1ib3A6IGJhcjsKKyAgYmFuZy1ibGF0LWJhZjogYm9ydDsgfQorQ1NTCitmb28geworICBiYXI6IGJhejsKKyAgYmFuZzogeworICAgIGJpcDogMXB4OworICAgIGJvcDogYmFyOworICAgIGJsYXQ6e2JhZjpib3J0fX19CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25hbWVzcGFjZV9wcm9wZXJ0aWVzX3dpdGhfdmFsdWUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28geworICBiYXI6IGJhejsKKyAgICBiYXItYmlwOiBib3A7CisgICAgYmFyLWJpbmc6IGJvcDsgfQorQ1NTCitmb28geworICBiYXI6IGJheiB7CisgICAgYmlwOiBib3A7CisgICAgYmluZzogYm9wOyB9fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uYW1lc3BhY2VfcHJvcGVydGllc193aXRoX3NjcmlwdF92YWx1ZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGJhcjogYmF6YmFuZzsKKyAgICBiYXItYmlwOiBib3A7CisgICAgYmFyLWJpbmc6IGJvcDsgfQorQ1NTCitmb28geworICBiYXI6IGJheiArIGJhbmcgeworICAgIGJpcDogYm9wOworICAgIGJpbmc6IGJvcDsgfX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9fbmFtZXNwYWNlX3Byb3BlcnRpZXNfd2l0aG91dF9zcGFjZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyBiYXI6YmF6IHsKKyAgYmlwOiBib3A7IH0KK0NTUworZm9vIHsKKyAgYmFyOmJheiB7CisgICAgYmlwOiBib3AgfX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9fbmFtZXNwYWNlX3Byb3BlcnRpZXNfd2l0aG91dF9zcGFjZV9ldmVuX3doZW5faXRzX3VuYW1iaWd1b3VzCisgICAgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGJhcjpiYXogY2FsYygxICsgMikgeworICAgIGJpcDogYm9wIH19CitTQ1NTCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgc3ludGF4IGVycm9yIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwgJ0ludmFsaWQgQ1NTIGFmdGVyICJiYXI6YmF6IGNhbGMiOiBleHBlY3RlZCBzZWxlY3Rvciwgd2FzICIoMSArIDIpIicsIGUubWVzc2FnZQorICAgIGFzc2VydF9lcXVhbCAyLCBlLnNhc3NfbGluZQorICBlbmQKKworICBkZWYgdGVzdF9uYW1lc3BhY2VfcHJvcGVydGllc193aXRob3V0X3NwYWNlX2FsbG93ZWRfZm9yX25vbl9pZGVudGlmaWVyCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYmFyOiAxcHg7CisgICAgYmFyLWJpcDogYm9wOyB9CitDU1MKK2ZvbyB7CisgIGJhcjoxcHggeworICAgIGJpcDogYm9wIH19CitTQ1NTCisgIGVuZAorCisgICMjIE1peGlucworCisgIGRlZiB0ZXN0X2Jhc2ljX21peGlucworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBhOiBiOyB9CitDU1MKK0BtaXhpbiBmb28geworICAuZm9vIHthOiBifX0KKworQGluY2x1ZGUgZm9vOworU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorYmFyIHsKKyAgYzogZDsgfQorICBiYXIgLmZvbyB7CisgICAgYTogYjsgfQorQ1NTCitAbWl4aW4gZm9vIHsKKyAgLmZvbyB7YTogYn19CisKK2JhciB7CisgIEBpbmNsdWRlIGZvbzsKKyAgYzogZDsgfQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorYmFyIHsKKyAgYTogYjsKKyAgYzogZDsgfQorQ1NTCitAbWl4aW4gZm9vIHthOiBifQorCitiYXIgeworICBAaW5jbHVkZSBmb287CisgIGM6IGQ7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5zX3dpdGhfZW1wdHlfYXJncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBhOiBiOyB9CitDU1MKK0BtaXhpbiBmb28oKSB7YTogYn0KKworLmZvbyB7QGluY2x1ZGUgZm9vKCk7fQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IGI7IH0KK0NTUworQG1peGluIGZvbygpIHthOiBifQorCisuZm9vIHtAaW5jbHVkZSBmb287fQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IGI7IH0KK0NTUworQG1peGluIGZvbyB7YTogYn0KKworLmZvbyB7QGluY2x1ZGUgZm9vKCk7fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbnNfd2l0aF9hcmdzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IGJhcjsgfQorQ1NTCitAbWl4aW4gZm9vKCRhKSB7YTogJGF9CisKKy5mb28ge0BpbmNsdWRlIGZvbyhiYXIpfQorU0NTUworCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IGJhcjsKKyAgYjogMTJweDsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLCAkYikgeworICBhOiAkYTsKKyAgYjogJGI7IH0KKworLmZvbyB7QGluY2x1ZGUgZm9vKGJhciwgMTJweCl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2tleWZyYW1lc19ydWxlc19pbl9jb250ZW50CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQGtleWZyYW1lcyBpZGVudGlmaWVyIHsKKyAgMCUgeworICAgIHRvcDogMDsKKyAgICBsZWZ0OiAwOyB9CisgIDMwJSB7CisgICAgdG9wOiA1MHB4OyB9CisgIDY4JSwgNzIlIHsKKyAgICBsZWZ0OiA1MHB4OyB9CisgIDEwMCUgeworICAgIHRvcDogMTAwcHg7CisgICAgbGVmdDogMTAwJTsgfSB9CitDU1MKK0BtaXhpbiBrZXlmcmFtZXMgeworICBAa2V5ZnJhbWVzIGlkZW50aWZpZXIgeyBAY29udGVudCB9Cit9CisKK0BpbmNsdWRlIGtleWZyYW1lcyB7CisgIDAlIHt0b3A6IDA7IGxlZnQ6IDB9CisgIFwjeyIzMCUifSB7dG9wOiA1MHB4fQorICA2OCUsIDcyJSB7bGVmdDogNTBweH0KKyAgMTAwJSB7dG9wOiAxMDBweDsgbGVmdDogMTAwJX0KK30KK1NDU1MKKyAgZW5kCisKKyAgIyMgRnVuY3Rpb25zCisKKyAgZGVmIHRlc3RfYmFzaWNfZnVuY3Rpb24KKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MpKQorYmFyIHsKKyAgYTogMzsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCkgeworICBAcmV0dXJuIDEgKyAyOworfQorCitiYXIgeworICBhOiBmb28oKTsKK30KK1NBU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fYXJncworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0FTUykpCitiYXIgeworICBhOiAzOyB9CitDU1MKK0BmdW5jdGlvbiBwbHVzKCR2YXIxLCAkdmFyMikgeworICBAcmV0dXJuICR2YXIxICsgJHZhcjI7Cit9CisKK2JhciB7CisgIGE6IHBsdXMoMSwgMik7Cit9CitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Rpc2FsbG93ZWRfZnVuY3Rpb25fbmFtZXMKKyAgICBTYXNzOjpEZXByZWNhdGlvbi5hbGxvd19kb3VibGVfd2FybmluZ3MgZG8KKyAgICAgIGFzc2VydF93YXJuaW5nKDw8V0FSTklORykge3JlbmRlcig8PFNDU1MpfQorREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIDEgb2YgdGVzdF9kaXNhbGxvd2VkX2Z1bmN0aW9uX25hbWVzX2lubGluZS5zY3NzOgorTmFtaW5nIGEgZnVuY3Rpb24gImNhbGMiIGlzIGRpc2FsbG93ZWQgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuCitUaGlzIG5hbWUgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgQ1NTIGZ1bmN0aW9uIHdpdGggc3BlY2lhbCBwYXJzZSBydWxlcy4KK1dBUk5JTkcKK0BmdW5jdGlvbiBjYWxjKCkge30KK1NDU1MKKworICAgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7cmVuZGVyKDw8U0NTUyl9CitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgMSBvZiB0ZXN0X2Rpc2FsbG93ZWRfZnVuY3Rpb25fbmFtZXNfaW5saW5lLnNjc3M6CitOYW1pbmcgYSBmdW5jdGlvbiAiLW15LWNhbGMiIGlzIGRpc2FsbG93ZWQgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuCitUaGlzIG5hbWUgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgQ1NTIGZ1bmN0aW9uIHdpdGggc3BlY2lhbCBwYXJzZSBydWxlcy4KK1dBUk5JTkcKK0BmdW5jdGlvbiAtbXktY2FsYygpIHt9CitTQ1NTCisKKyAgICAgIGFzc2VydF93YXJuaW5nKDw8V0FSTklORykge3JlbmRlcig8PFNDU1MpfQorREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIDEgb2YgdGVzdF9kaXNhbGxvd2VkX2Z1bmN0aW9uX25hbWVzX2lubGluZS5zY3NzOgorTmFtaW5nIGEgZnVuY3Rpb24gImVsZW1lbnQiIGlzIGRpc2FsbG93ZWQgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuCitUaGlzIG5hbWUgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgQ1NTIGZ1bmN0aW9uIHdpdGggc3BlY2lhbCBwYXJzZSBydWxlcy4KK1dBUk5JTkcKK0BmdW5jdGlvbiBlbGVtZW50KCkge30KK1NDU1MKKworICAgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7cmVuZGVyKDw8U0NTUyl9CitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgMSBvZiB0ZXN0X2Rpc2FsbG93ZWRfZnVuY3Rpb25fbmFtZXNfaW5saW5lLnNjc3M6CitOYW1pbmcgYSBmdW5jdGlvbiAiLW15LWVsZW1lbnQiIGlzIGRpc2FsbG93ZWQgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuCitUaGlzIG5hbWUgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgQ1NTIGZ1bmN0aW9uIHdpdGggc3BlY2lhbCBwYXJzZSBydWxlcy4KK1dBUk5JTkcKK0BmdW5jdGlvbiAtbXktZWxlbWVudCgpIHt9CitTQ1NTCisKKyAgICAgIGFzc2VydF93YXJuaW5nKDw8V0FSTklORykge3JlbmRlcig8PFNDU1MpfQorREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIDEgb2YgdGVzdF9kaXNhbGxvd2VkX2Z1bmN0aW9uX25hbWVzX2lubGluZS5zY3NzOgorTmFtaW5nIGEgZnVuY3Rpb24gImV4cHJlc3Npb24iIGlzIGRpc2FsbG93ZWQgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuCitUaGlzIG5hbWUgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgQ1NTIGZ1bmN0aW9uIHdpdGggc3BlY2lhbCBwYXJzZSBydWxlcy4KK1dBUk5JTkcKK0BmdW5jdGlvbiBleHByZXNzaW9uKCkge30KK1NDU1MKKworICAgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7cmVuZGVyKDw8U0NTUyl9CitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgMSBvZiB0ZXN0X2Rpc2FsbG93ZWRfZnVuY3Rpb25fbmFtZXNfaW5saW5lLnNjc3M6CitOYW1pbmcgYSBmdW5jdGlvbiAidXJsIiBpcyBkaXNhbGxvd2VkIGFuZCB3aWxsIGJlIGFuIGVycm9yIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLgorVGhpcyBuYW1lIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIENTUyBmdW5jdGlvbiB3aXRoIHNwZWNpYWwgcGFyc2UgcnVsZXMuCitXQVJOSU5HCitAZnVuY3Rpb24gdXJsKCkge30KK1NDU1MKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfYWxsb3dlZF9mdW5jdGlvbl9uYW1lcworICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKX0KKy5hIHsKKyAgYjogYzsgfQorQ1NTCitAZnVuY3Rpb24gLW15LWV4cHJlc3Npb24oKSB7QHJldHVybiBjfQorCisuYSB7YjogLW15LWV4cHJlc3Npb24oKX0KK1NDU1MKKworICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKX0KKy5hIHsKKyAgYjogYzsgfQorQ1NTCitAZnVuY3Rpb24gLW15LXVybCgpIHtAcmV0dXJuIGN9CisKKy5hIHtiOiAtbXktdXJsKCl9CitTQ1NTCisgIGVuZAorCisgICMjIFZhciBBcmdzCisKKyAgZGVmIHRlc3RfbWl4aW5fdmFyX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsKKyAgYjogMiwgMywgNDsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLCAkYi4uLikgeworICBhOiAkYTsKKyAgYjogJGI7Cit9CisKKy5mb28ge0BpbmNsdWRlIGZvbygxLCAyLCAzLCA0KX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fZW1wdHlfdmFyX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsKKyAgYjogMDsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLCAkYi4uLikgeworICBhOiAkYTsKKyAgYjogbGVuZ3RoKCRiKTsKK30KKworLmZvbyB7QGluY2x1ZGUgZm9vKDEpfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl92YXJfYXJnc19hY3RfbGlrZV9saXN0CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IDM7CisgIGI6IDM7IH0KK0NTUworQG1peGluIGZvbygkYSwgJGIuLi4pIHsKKyAgYTogbGVuZ3RoKCRiKTsKKyAgYjogbnRoKCRiLCAyKTsKK30KKworLmZvbyB7QGluY2x1ZGUgZm9vKDEsIDIsIDMsIDQpfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9zcGxhdF9hcmdzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IDE7CisgIGI6IDI7CisgIGM6IDM7CisgIGQ6IDQ7IH0KK0NTUworQG1peGluIGZvbygkYSwgJGIsICRjLCAkZCkgeworICBhOiAkYTsKKyAgYjogJGI7CisgIGM6ICRjOworICBkOiAkZDsKK30KKworJGxpc3Q6IDIsIDMsIDQ7CisuZm9vIHtAaW5jbHVkZSBmb28oMSwgJGxpc3QuLi4pfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9zcGxhdF9leHByZXNzaW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IDE7CisgIGI6IDI7CisgIGM6IDM7CisgIGQ6IDQ7IH0KK0NTUworQG1peGluIGZvbygkYSwgJGIsICRjLCAkZCkgeworICBhOiAkYTsKKyAgYjogJGI7CisgIGM6ICRjOworICBkOiAkZDsKK30KKworLmZvbyB7QGluY2x1ZGUgZm9vKDEsICgyLCAzLCA0KS4uLil9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX3NwbGF0X2FyZ3Nfd2l0aF92YXJfYXJncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBhOiAxOworICBiOiAyLCAzLCA0OyB9CitDU1MKK0BtaXhpbiBmb28oJGEsICRiLi4uKSB7CisgIGE6ICRhOworICBiOiAkYjsKK30KKworJGxpc3Q6IDIsIDMsIDQ7CisuZm9vIHtAaW5jbHVkZSBmb28oMSwgJGxpc3QuLi4pfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9zcGxhdF9hcmdzX3dpdGhfdmFyX2FyZ3NfYW5kX25vcm1hbF9hcmdzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IDE7CisgIGI6IDI7CisgIGM6IDMsIDQ7IH0KK0NTUworQG1peGluIGZvbygkYSwgJGIsICRjLi4uKSB7CisgIGE6ICRhOworICBiOiAkYjsKKyAgYzogJGM7Cit9CisKKyRsaXN0OiAyLCAzLCA0OworLmZvbyB7QGluY2x1ZGUgZm9vKDEsICRsaXN0Li4uKX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fc3BsYXRfYXJnc193aXRoX3Zhcl9hcmdzX3ByZXNlcnZlc19zZXBhcmF0b3IKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsKKyAgYjogMiAzIDQgNTsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLCAkYi4uLikgeworICBhOiAkYTsKKyAgYjogJGI7Cit9CisKKyRsaXN0OiAzIDQgNTsKKy5mb28ge0BpbmNsdWRlIGZvbygxLCAyLCAkbGlzdC4uLil9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX3Zhcl9hbmRfc3BsYXRfYXJnc19wYXNzX3Rocm91Z2hfa2V5d29yZHMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMzsKKyAgYjogMTsKKyAgYzogMjsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLi4uKSB7CisgIEBpbmNsdWRlIGJhcigkYS4uLik7Cit9CisKK0BtaXhpbiBiYXIoJGIsICRjLCAkYSkgeworICBhOiAkYTsKKyAgYjogJGI7CisgIGM6ICRjOworfQorCisuZm9vIHtAaW5jbHVkZSBmb28oMSwgJGM6IDIsICRhOiAzKX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fdmFyX2tleXdvcmRfYXJncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBhOiAxOworICBiOiAyOworICBjOiAzOyB9CitDU1MKK0BtaXhpbiBmb28oJGFyZ3MuLi4pIHsKKyAgYTogbWFwLWdldChrZXl3b3JkcygkYXJncyksIGEpOworICBiOiBtYXAtZ2V0KGtleXdvcmRzKCRhcmdzKSwgYik7CisgIGM6IG1hcC1nZXQoa2V5d29yZHMoJGFyZ3MpLCBjKTsKK30KKworLmZvbyB7QGluY2x1ZGUgZm9vKCRhOiAxLCAkYjogMiwgJGM6IDMpfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9lbXB0eV92YXJfa2V5d29yZF9hcmdzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGxlbmd0aDogMDsgfQorQ1NTCitAbWl4aW4gZm9vKCRhcmdzLi4uKSB7CisgIGxlbmd0aDogbGVuZ3RoKGtleXdvcmRzKCRhcmdzKSk7Cit9CisKKy5mb28ge0BpbmNsdWRlIGZvb30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fbWFwX3NwbGF0CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IDE7CisgIGI6IDI7CisgIGM6IDM7IH0KK0NTUworQG1peGluIGZvbygkYSwgJGIsICRjKSB7CisgIGE6ICRhOworICBiOiAkYjsKKyAgYzogJGM7Cit9CisKKy5mb28geworICAkbWFwOiAoYTogMSwgYjogMiwgYzogMyk7CisgIEBpbmNsdWRlIGZvbygkbWFwLi4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fbWFwX2FuZF9saXN0X3NwbGF0CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIGE6IHg7CisgIGI6IHk7CisgIGM6IHo7CisgIGQ6IDE7CisgIGU6IDI7CisgIGY6IDM7IH0KK0NTUworQG1peGluIGZvbygkYSwgJGIsICRjLCAkZCwgJGUsICRmKSB7CisgIGE6ICRhOworICBiOiAkYjsKKyAgYzogJGM7CisgIGQ6ICRkOworICBlOiAkZTsKKyAgZjogJGY7Cit9CisKKy5mb28geworICAkbGlzdDogeCB5IHo7CisgICRtYXA6IChkOiAxLCBlOiAyLCBmOiAzKTsKKyAgQGluY2x1ZGUgZm9vKCRsaXN0Li4uLCAkbWFwLi4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fbWFwX3NwbGF0X3Rha2VzX3ByZWNlZGVuY2Vfb3Zlcl9wYXNzX3Rocm91Z2gKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogejsgfQorQ1NTCitAbWl4aW4gZm9vKCRhcmdzLi4uKSB7CisgICRtYXA6IChjOiB6KTsKKyAgQGluY2x1ZGUgYmFyKCRhcmdzLi4uLCAkbWFwLi4uKTsKK30KKworQG1peGluIGJhcigkYSwgJGIsICRjKSB7CisgIGE6ICRhOworICBiOiAkYjsKKyAgYzogJGM7Cit9CisKKy5mb28geworICBAaW5jbHVkZSBmb28oMSwgJGI6IDIsICRjOiAzKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fbGlzdF9vZl9wYWlyc19zcGxhdF90cmVhdGVkX2FzX2xpc3QKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogYSAxOworICBiOiBiIDI7CisgIGM6IGMgMzsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLCAkYiwgJGMpIHsKKyAgYTogJGE7CisgIGI6ICRiOworICBjOiAkYzsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGZvbygoYSAxLCBiIDIsIGMgMykuLi4pOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9zcGxhdF9hZnRlcl9rZXl3b3JkX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogMzsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLCAkYiwgJGMpIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogMzsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGZvbygxLCAkYzogMywgMi4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2tleXdvcmRfYXJnc19hZnRlcl9zcGxhdAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBhOiAxOworICBiOiAyOworICBjOiAzOyB9CitDU1MKK0BtaXhpbiBmb28oJGEsICRiLCAkYykgeworICBhOiAxOworICBiOiAyOworICBjOiAzOworfQorCisuZm9vIHsKKyAgQGluY2x1ZGUgZm9vKDEsIDIuLi4sICRjOiAzKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fa2V5d29yZF9zcGxhdF9hZnRlcl9rZXl3b3JkX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogMzsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLCAkYiwgJGMpIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogMzsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGZvbygxLCAkYjogMiwgKGM6IDMpLi4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fdHJpcGxlX2tleXdvcmRfc3BsYXRfbWVyZ2UKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgZm9vOiAxOworICBiYXI6IDI7CisgIGt3YXJnOiAzOworICBhOiAzOworICBiOiAyOworICBjOiAzOyB9CitDU1MKK0BtaXhpbiBmb28oJGZvbywgJGJhciwgJGt3YXJnLCAkYSwgJGIsICRjKSB7CisgIGZvbzogJGZvbzsKKyAgYmFyOiAkYmFyOworICBrd2FyZzogJGt3YXJnOworICBhOiAkYTsKKyAgYjogJGI7CisgIGM6ICRjOworfQorCitAbWl4aW4gYmFyKCRhcmdzLi4uKSB7CisgIEBpbmNsdWRlIGZvbygkYXJncy4uLiwgJGJhcjogMiwgJGE6IDIsICRiOiAyLCAoa3dhcmc6IDMsIGE6IDMsIGM6IDMpLi4uKTsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGJhcigkZm9vOiAxLCAkYTogMSwgJGI6IDEsICRjOiAxKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fbWFwX3NwbGF0X2NvbnZlcnRzX2h5cGhlbnNfYW5kX3VuZGVyc2NvcmVzX2Zvcl9yZWFsX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogMzsKKyAgZDogNDsgfQorQ1NTCitAbWl4aW4gZm9vKCRhLTEsICRiLTIsICRjXzMsICRkXzQpIHsKKyAgYTogJGEtMTsKKyAgYjogJGItMjsKKyAgYzogJGNfMzsKKyAgZDogJGRfNDsKK30KKworLmZvbyB7CisgICRtYXA6IChhLTE6IDEsIGJfMjogMiwgYy0zOiAzLCBkXzQ6IDQpOworICBAaW5jbHVkZSBmb28oJG1hcC4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX21hcF9zcGxhdF9kb2VzbnRfY29udmVydF9oeXBoZW5zX2FuZF91bmRlcnNjb3Jlc19mb3JfdmFyX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYS0xOiAxOworICBiXzI6IDI7CisgIGMtMzogMzsKKyAgZF80OiA0OyB9CitDU1MKK0BtaXhpbiBmb28oJGFyZ3MuLi4pIHsKKyAgQGVhY2ggJGtleSwgJHZhbHVlIGluIGtleXdvcmRzKCRhcmdzKSB7CisgICAgXCN7JGtleX06ICR2YWx1ZTsKKyAgfQorfQorCisuZm9vIHsKKyAgJG1hcDogKGEtMTogMSwgYl8yOiAyLCBjLTM6IDMsIGRfNDogNCk7CisgIEBpbmNsdWRlIGZvbygkbWFwLi4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fY29uZmxpY3Rpbmdfc3BsYXRfYWZ0ZXJfa2V5d29yZF9hcmdzCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRS5yc3RyaXApIHtyZW5kZXIoPDxTQ1NTKX0KK01peGluIGZvbyB3YXMgcGFzc2VkIGFyZ3VtZW50ICRiIGJvdGggYnkgcG9zaXRpb24gYW5kIGJ5IG5hbWUuCitNRVNTQUdFCitAbWl4aW4gZm9vKCRhLCAkYiwgJGMpIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogMzsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGZvbygxLCAkYjogMiwgMy4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2tleXdvcmRfc3BsYXRfbXVzdF9oYXZlX3N0cmluZ19rZXlzCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRS5yc3RyaXApIHtyZW5kZXIgPDxTQ1NTfQorVmFyaWFibGUga2V5d29yZCBhcmd1bWVudCBtYXAgbXVzdCBoYXZlIHN0cmluZyBrZXlzLgorMTIgaXMgbm90IGEgc3RyaW5nIGluICgxMjogMSkuCitNRVNTQUdFCitAbWl4aW4gZm9vKCRhKSB7CisgIGE6ICRhOworfQorCisuZm9vIHtAaW5jbHVkZSBmb28oKDEyOiAxKS4uLil9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX3Bvc2l0aW9uYWxfYXJnX2FmdGVyX3NwbGF0CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRS5yc3RyaXApIHtyZW5kZXIoPDxTQ1NTKX0KK09ubHkga2V5d29yZCBhcmd1bWVudHMgbWF5IGZvbGxvdyB2YXJpYWJsZSBhcmd1bWVudHMgKC4uLikuCitNRVNTQUdFCitAbWl4aW4gZm9vKCRhLCAkYiwgJGMpIHsKKyAgYTogMTsKKyAgYjogMjsKKyAgYzogMzsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGZvbygxLCAyLi4uLCAzKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fdmFyX2FyZ3Nfd2l0aF9rZXl3b3JkCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJQb3NpdGlvbmFsIGFyZ3VtZW50cyBtdXN0IGNvbWUgYmVmb3JlIGtleXdvcmQgYXJndW1lbnRzLiIpIHtyZW5kZXIgPDxTQ1NTfQorQG1peGluIGZvbygkYSwgJGIuLi4pIHsKKyAgYTogJGE7CisgIGI6ICRiOworfQorCisuZm9vIHtAaW5jbHVkZSBmb28oJGE6IDEsIDIsIDMsIDQpfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9rZXl3b3JkX2Zvcl92YXJfYXJnCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJBcmd1bWVudCAkYiBvZiBtaXhpbiBmb28gY2Fubm90IGJlIHVzZWQgYXMgYSBuYW1lZCBhcmd1bWVudC4iKSB7cmVuZGVyIDw8U0NTU30KK0BtaXhpbiBmb28oJGEsICRiLi4uKSB7CisgIGE6ICRhOworICBiOiAkYjsKK30KKworLmZvbyB7QGluY2x1ZGUgZm9vKDEsICRiOiAyIDMgNCl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2tleXdvcmRfZm9yX3Vua25vd25fYXJnX3dpdGhfdmFyX2FyZ3MKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIk1peGluIGZvbyBkb2Vzbid0IGhhdmUgYW4gYXJndW1lbnQgbmFtZWQgJGMuIikge3JlbmRlciA8PFNDU1N9CitAbWl4aW4gZm9vKCRhLCAkYi4uLikgeworICBhOiAkYTsKKyAgYjogJGI7Cit9CisKKy5mb28ge0BpbmNsdWRlIGZvbygxLCAkYzogMiAzIDQpfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9taXhpbl9tYXBfc3BsYXRfYmVmb3JlX2xpc3Rfc3BsYXQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIlZhcmlhYmxlIGtleXdvcmQgYXJndW1lbnRzIG11c3QgYmUgYSBtYXAgKHdhcyAoMiAzKSkuIikge3JlbmRlciA8PFNDU1N9CitAbWl4aW4gZm9vKCRhLCAkYiwgJGMpIHsKKyAgYTogJGE7CisgIGI6ICRiOworICBjOiAkYzsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIGZvbygoYTogMSkuLi4sICgyIDMpLi4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fbWFwX3NwbGF0X3dpdGhfdW5rbm93bl9rZXl3b3JkCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJNaXhpbiBmb28gZG9lc24ndCBoYXZlIGFuIGFyZ3VtZW50IG5hbWVkICRjLiIpIHtyZW5kZXIgPDxTQ1NTfQorQG1peGluIGZvbygkYSwgJGIpIHsKKyAgYTogJGE7CisgIGI6ICRiOworfQorCisuZm9vIHsKKyAgQGluY2x1ZGUgZm9vKDEsIDIsIChjOiAxKS4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX21hcF9zcGxhdF93aXRoX3dyb25nX3R5cGUKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIlZhcmlhYmxlIGtleXdvcmQgYXJndW1lbnRzIG11c3QgYmUgYSBtYXAgKHdhcyAxMikuIikge3JlbmRlciA8PFNDU1N9CitAbWl4aW4gZm9vKCRhLCAkYikgeworICBhOiAkYTsKKyAgYjogJGI7Cit9CisKKy5mb28geworICBAaW5jbHVkZSBmb28oKDEsIDIpLi4uLCAxMi4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX3NwbGF0X3Rvb19tYW55X2FyZ3MKKyAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIHtyZW5kZXIgPDxTQ1NTfQorV0FSTklORzogTWl4aW4gZm9vIHRha2VzIDIgYXJndW1lbnRzIGJ1dCA0IHdlcmUgcGFzc2VkLgorICAgICAgICBvbiBsaW5lIDIgb2YgI3tmaWxlbmFtZV9mb3JfdGVzdCg6c2Nzcyl9CitUaGlzIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuCitXQVJOSU5HCitAbWl4aW4gZm9vKCRhLCAkYikge30KK0BpbmNsdWRlIGZvbygoMSwgMiwgMywgNCkuLi4pOworU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl92YXJfYXJncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICB2YWw6ICJhOiAxLCBiOiAyLCAzLCA0IjsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCRhLCAkYi4uLikgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwjeyRifSI7Cit9CisKKy5mb28ge3ZhbDogZm9vKDEsIDIsIDMsIDQpfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9lbXB0eV92YXJfYXJncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICB2YWw6ICJhOiAxLCBiOiAwIjsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCRhLCAkYi4uLikgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwje2xlbmd0aCgkYil9IjsKK30KKworLmZvbyB7dmFsOiBmb28oMSl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3Zhcl9hcmdzX2FjdF9saWtlX2xpc3QKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAiYTogMywgYjogMyI7IH0KK0NTUworQGZ1bmN0aW9uIGZvbygkYSwgJGIuLi4pIHsKKyAgQHJldHVybiAiYTogXCN7bGVuZ3RoKCRiKX0sIGI6IFwje250aCgkYiwgMil9IjsKK30KKworLmZvbyB7dmFsOiBmb28oMSwgMiwgMywgNCl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3NwbGF0X2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAiYTogMSwgYjogMiwgYzogMywgZDogNCI7IH0KK0NTUworQGZ1bmN0aW9uIGZvbygkYSwgJGIsICRjLCAkZCkgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwjeyRifSwgYzogXCN7JGN9LCBkOiBcI3skZH0iOworfQorCiskbGlzdDogMiwgMywgNDsKKy5mb28ge3ZhbDogZm9vKDEsICRsaXN0Li4uKX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fc3BsYXRfZXhwcmVzc2lvbgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICB2YWw6ICJhOiAxLCBiOiAyLCBjOiAzLCBkOiA0IjsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCRhLCAkYiwgJGMsICRkKSB7CisgIEByZXR1cm4gImE6IFwjeyRhfSwgYjogXCN7JGJ9LCBjOiBcI3skY30sIGQ6IFwjeyRkfSI7Cit9CisKKy5mb28ge3ZhbDogZm9vKDEsICgyLCAzLCA0KS4uLil9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3NwbGF0X2FyZ3Nfd2l0aF92YXJfYXJncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICB2YWw6ICJhOiAxLCBiOiAyLCAzLCA0IjsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCRhLCAkYi4uLikgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwjeyRifSI7Cit9CisKKyRsaXN0OiAyLCAzLCA0OworLmZvbyB7dmFsOiBmb28oMSwgJGxpc3QuLi4pfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9zcGxhdF9hcmdzX3dpdGhfdmFyX2FyZ3NfYW5kX25vcm1hbF9hcmdzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIHZhbDogImE6IDEsIGI6IDIsIGM6IDMsIDQiOyB9CitDU1MKK0BmdW5jdGlvbiBmb28oJGEsICRiLCAkYy4uLikgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwjeyRifSwgYzogXCN7JGN9IjsKK30KKworJGxpc3Q6IDIsIDMsIDQ7CisuZm9vIHt2YWw6IGZvbygxLCAkbGlzdC4uLil9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3NwbGF0X2FyZ3Nfd2l0aF92YXJfYXJnc19wcmVzZXJ2ZXNfc2VwYXJhdG9yCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIHZhbDogImE6IDEsIGI6IDIgMyA0IDUiOyB9CitDU1MKK0BmdW5jdGlvbiBmb28oJGEsICRiLi4uKSB7CisgIEByZXR1cm4gImE6IFwjeyRhfSwgYjogXCN7JGJ9IjsKK30KKworJGxpc3Q6IDMgNCA1OworLmZvbyB7dmFsOiBmb28oMSwgMiwgJGxpc3QuLi4pfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl92YXJfYW5kX3NwbGF0X2FyZ3NfcGFzc190aHJvdWdoX2tleXdvcmRzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIHZhbDogImE6IDMsIGI6IDEsIGM6IDIiOyB9CitDU1MKK0BmdW5jdGlvbiBmb28oJGEuLi4pIHsKKyAgQHJldHVybiBiYXIoJGEuLi4pOworfQorCitAZnVuY3Rpb24gYmFyKCRiLCAkYywgJGEpIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3skYn0sIGM6IFwjeyRjfSI7Cit9CisKKy5mb28ge3ZhbDogZm9vKDEsICRjOiAyLCAkYTogMyl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3Zhcl9rZXl3b3JkX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAiYTogMSwgYjogMiwgYzogMyI7IH0KK0NTUworQGZ1bmN0aW9uIGZvbygkYXJncy4uLikgeworICBAcmV0dXJuICJhOiBcI3ttYXAtZ2V0KGtleXdvcmRzKCRhcmdzKSwgYSl9LCAiICsKKyAgICAiYjogXCN7bWFwLWdldChrZXl3b3JkcygkYXJncyksIGIpfSwgIiArCisgICAgImM6IFwje21hcC1nZXQoa2V5d29yZHMoJGFyZ3MpLCBjKX0iOworfQorCisuZm9vIHt2YWw6IGZvbygkYTogMSwgJGI6IDIsICRjOiAzKX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fZW1wdHlfdmFyX2tleXdvcmRfYXJncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBsZW5ndGg6IDA7IH0KK0NTUworQGZ1bmN0aW9uIGZvbygkYXJncy4uLikgeworICBAcmV0dXJuIGxlbmd0aChrZXl3b3JkcygkYXJncykpOworfQorCisuZm9vIHtsZW5ndGg6IGZvbygpfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9tYXBfc3BsYXQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAiYTogMSwgYjogMiwgYzogMyI7IH0KK0NTUworQGZ1bmN0aW9uIGZvbygkYSwgJGIsICRjKSB7CisgIEByZXR1cm4gImE6IFwjeyRhfSwgYjogXCN7JGJ9LCBjOiBcI3skY30iOworfQorCisuZm9vIHsKKyAgJG1hcDogKGE6IDEsIGI6IDIsIGM6IDMpOworICB2YWw6IGZvbygkbWFwLi4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fbWFwX2FuZF9saXN0X3NwbGF0CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIHZhbDogImE6IHgsIGI6IHksIGM6IHosIGQ6IDEsIGU6IDIsIGY6IDMiOyB9CitDU1MKK0BmdW5jdGlvbiBmb28oJGEsICRiLCAkYywgJGQsICRlLCAkZikgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwjeyRifSwgYzogXCN7JGN9LCBkOiBcI3skZH0sIGU6IFwjeyRlfSwgZjogXCN7JGZ9IjsKK30KKworLmZvbyB7CisgICRsaXN0OiB4IHkgejsKKyAgJG1hcDogKGQ6IDEsIGU6IDIsIGY6IDMpOworICB2YWw6IGZvbygkbGlzdC4uLiwgJG1hcC4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX21hcF9zcGxhdF90YWtlc19wcmVjZWRlbmNlX292ZXJfcGFzc190aHJvdWdoCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyB7CisgIHZhbDogImE6IDEsIGI6IDIsIGM6IHoiOyB9CitDU1MKK0BmdW5jdGlvbiBmb28oJGFyZ3MuLi4pIHsKKyAgJG1hcDogKGM6IHopOworICBAcmV0dXJuIGJhcigkYXJncy4uLiwgJG1hcC4uLik7Cit9CisKK0BmdW5jdGlvbiBiYXIoJGEsICRiLCAkYykgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwjeyRifSwgYzogXCN7JGN9IjsKK30KKworLmZvbyB7CisgIHZhbDogZm9vKDEsICRiOiAyLCAkYzogMyk7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3J1YnlfZnVuY3Rpb25fbWFwX3NwbGF0X3Rha2VzX3ByZWNlZGVuY2Vfb3Zlcl9wYXNzX3Rocm91Z2gKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAxIDIgMyB6OyB9CitDU1MKK0BmdW5jdGlvbiBmb28oJGFyZ3MuLi4pIHsKKyAgJG1hcDogKHZhbDogeik7CisgIEByZXR1cm4gYXBwZW5kKCRhcmdzLi4uLCAkbWFwLi4uKTsKK30KKworLmZvbyB7CisgIHZhbDogZm9vKDEgMiAzLCAkdmFsOiA0KQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9saXN0X29mX3BhaXJzX3NwbGF0X3RyZWF0ZWRfYXNfbGlzdAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICB2YWw6ICJhOiBhIDEsIGI6IGIgMiwgYzogYyAzIjsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCRhLCAkYiwgJGMpIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3skYn0sIGM6IFwjeyRjfSI7Cit9CisKKy5mb28geworICB2YWw6IGZvbygoYSAxLCBiIDIsIGMgMykuLi4pOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9zcGxhdF9hZnRlcl9rZXl3b3JkX2FyZ3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAiYTogMSwgYjogMiwgYzogMyI7IH0KK0NTUworQGZ1bmN0aW9uIGZvbygkYSwgJGIsICRjKSB7CisgIEByZXR1cm4gImE6IFwjeyRhfSwgYjogXCN7JGJ9LCBjOiBcI3skY30iOworfQorCisuZm9vIHsKKyAgdmFsOiBmb28oMSwgJGM6IDMsIDIuLi4pOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9rZXl3b3JkX2FyZ3NfYWZ0ZXJfc3BsYXQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAiYTogMSwgYjogMiwgYzogMyI7IH0KK0NTUworQGZ1bmN0aW9uIGZvbygkYSwgJGIsICRjKSB7CisgIEByZXR1cm4gImE6IFwjeyRhfSwgYjogXCN7JGJ9LCBjOiBcI3skY30iOworfQorCisuZm9vIHsKKyAgdmFsOiBmb28oMSwgMi4uLiwgJGM6IDMpOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9rZXl3b3JkX3NwbGF0X2FmdGVyX2tleXdvcmRfYXJncworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICB2YWw6ICJhOiAxLCBiOiAyLCBjOiAzIjsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCRhLCAkYiwgJGMpIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3skYn0sIGM6IFwjeyRjfSI7Cit9CisKKy5mb28geworICB2YWw6IGZvbygxLCAkYjogMiwgKGM6IDMpLi4uKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fdHJpcGxlX2tleXdvcmRfc3BsYXRfbWVyZ2UKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAiZm9vOiAxLCBiYXI6IDIsIGt3YXJnOiAzLCBhOiAzLCBiOiAyLCBjOiAzIjsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCRmb28sICRiYXIsICRrd2FyZywgJGEsICRiLCAkYykgeworICBAcmV0dXJuICJmb286IFwjeyRmb299LCBiYXI6IFwjeyRiYXJ9LCBrd2FyZzogXCN7JGt3YXJnfSwgYTogXCN7JGF9LCBiOiBcI3skYn0sIGM6IFwjeyRjfSI7Cit9CisKK0BmdW5jdGlvbiBiYXIoJGFyZ3MuLi4pIHsKKyAgQHJldHVybiBmb28oJGFyZ3MuLi4sICRiYXI6IDIsICRhOiAyLCAkYjogMiwgKGt3YXJnOiAzLCBhOiAzLCBjOiAzKS4uLik7Cit9CisKKy5mb28geworICB2YWw6IGJhcigkZm9vOiAxLCAkYTogMSwgJGI6IDEsICRjOiAxKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fY29uZmxpY3Rpbmdfc3BsYXRfYWZ0ZXJfa2V5d29yZF9hcmdzCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRS5yc3RyaXApIHtyZW5kZXIoPDxTQ1NTKX0KK0Z1bmN0aW9uIGZvbyB3YXMgcGFzc2VkIGFyZ3VtZW50ICRiIGJvdGggYnkgcG9zaXRpb24gYW5kIGJ5IG5hbWUuCitNRVNTQUdFCitAZnVuY3Rpb24gZm9vKCRhLCAkYiwgJGMpIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3skYn0sIGM6IFwjeyRjfSI7Cit9CisKKy5mb28geworICB2YWw6IGZvbygxLCAkYjogMiwgMy4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3Bvc2l0aW9uYWxfYXJnX2FmdGVyX3NwbGF0CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRS5yc3RyaXApIHtyZW5kZXIoPDxTQ1NTKX0KK09ubHkga2V5d29yZCBhcmd1bWVudHMgbWF5IGZvbGxvdyB2YXJpYWJsZSBhcmd1bWVudHMgKC4uLikuCitNRVNTQUdFCitAZnVuY3Rpb24gZm9vKCRhLCAkYiwgJGMpIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3skYn0sIGM6IFwjeyRjfSI7Cit9CisKKy5mb28geworICB2YWw6IGZvbygxLCAyLi4uLCAzKTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZnVuY3Rpb25fdmFyX2FyZ3Nfd2l0aF9rZXl3b3JkCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJQb3NpdGlvbmFsIGFyZ3VtZW50cyBtdXN0IGNvbWUgYmVmb3JlIGtleXdvcmQgYXJndW1lbnRzLiIpIHtyZW5kZXIgPDxTQ1NTfQorQGZ1bmN0aW9uIGZvbygkYSwgJGIuLi4pIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3skYn0iOworfQorCisuZm9vIHt2YWw6IGZvbygkYTogMSwgMiwgMywgNCl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX2tleXdvcmRfZm9yX3Zhcl9hcmcKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIkFyZ3VtZW50ICRiIG9mIGZ1bmN0aW9uIGZvbyBjYW5ub3QgYmUgdXNlZCBhcyBhIG5hbWVkIGFyZ3VtZW50LiIpIHtyZW5kZXIgPDxTQ1NTfQorQGZ1bmN0aW9uIGZvbygkYSwgJGIuLi4pIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3skYn0iOworfQorCisuZm9vIHt2YWw6IGZvbygxLCAkYjogMiAzIDQpfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9rZXl3b3JkX2Zvcl91bmtub3duX2FyZ193aXRoX3Zhcl9hcmdzCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJGdW5jdGlvbiBmb28gZG9lc24ndCBoYXZlIGFuIGFyZ3VtZW50IG5hbWVkICRjLiIpIHtyZW5kZXIgPDxTQ1NTfQorQGZ1bmN0aW9uIGZvbygkYSwgJGIuLi4pIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3tsZW5ndGgoJGIpfSI7Cit9CisKKy5mb28ge3ZhbDogZm9vKDEsICRjOiAyIDMgNCl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3Zhcl9hcmdzX3Bhc3NlZF90b19uYXRpdmUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgdmFsOiAjMTAyMDM1OyB9CitDU1MKK0BmdW5jdGlvbiBmb28oJGFyZ3MuLi4pIHsKKyAgQHJldHVybiBhZGp1c3QtY29sb3IoJGFyZ3MuLi4pOworfQorCisuZm9vIHt2YWw6IGZvbygjMTAyMDMwLCAkYmx1ZTogNSl9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX21hcF9zcGxhdF9iZWZvcmVfbGlzdF9zcGxhdAorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAiVmFyaWFibGUga2V5d29yZCBhcmd1bWVudHMgbXVzdCBiZSBhIG1hcCAod2FzICgyIDMpKS4iKSB7cmVuZGVyIDw8U0NTU30KK0BmdW5jdGlvbiBmb28oJGEsICRiLCAkYykgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwjeyRifSwgYzogXCN7JGN9IjsKK30KKworLmZvbyB7CisgIHZhbDogZm9vKChhOiAxKS4uLiwgKDIgMykuLi4pOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9tYXBfc3BsYXRfd2l0aF91bmtub3duX2tleXdvcmQKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIkZ1bmN0aW9uIGZvbyBkb2Vzbid0IGhhdmUgYW4gYXJndW1lbnQgbmFtZWQgJGMuIikge3JlbmRlciA8PFNDU1N9CitAZnVuY3Rpb24gZm9vKCRhLCAkYikgeworICBAcmV0dXJuICJhOiBcI3skYX0sIGI6IFwjeyRifSI7Cit9CisKKy5mb28geworICB2YWw6IGZvbygxLCAyLCAoYzogMSkuLi4pOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9tYXBfc3BsYXRfd2l0aF93cm9uZ190eXBlCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJWYXJpYWJsZSBrZXl3b3JkIGFyZ3VtZW50cyBtdXN0IGJlIGEgbWFwICh3YXMgMTIpLiIpIHtyZW5kZXIgPDxTQ1NTfQorQGZ1bmN0aW9uIGZvbygkYSwgJGIpIHsKKyAgQHJldHVybiAiYTogXCN7JGF9LCBiOiBcI3skYn0iOworfQorCisuZm9vIHsKKyAgdmFsOiBmb28oKDEsIDIpLi4uLCAxMi4uLik7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX2tleXdvcmRfc3BsYXRfbXVzdF9oYXZlX3N0cmluZ19rZXlzCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRS5yc3RyaXApIHtyZW5kZXIgPDxTQ1NTfQorVmFyaWFibGUga2V5d29yZCBhcmd1bWVudCBtYXAgbXVzdCBoYXZlIHN0cmluZyBrZXlzLgorMTIgaXMgbm90IGEgc3RyaW5nIGluICgxMjogMSkuCitNRVNTQUdFCitAZnVuY3Rpb24gZm9vKCRhKSB7CisgIEByZXR1cm4gJGE7Cit9CisKKy5mb28ge3ZhbDogZm9vKCgxMjogMSkuLi4pfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9zcGxhdF90b29fbWFueV9hcmdzCisgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7cmVuZGVyIDw8U0NTU30KK1dBUk5JTkc6IEZ1bmN0aW9uIGZvbyB0YWtlcyAyIGFyZ3VtZW50cyBidXQgNCB3ZXJlIHBhc3NlZC4KKyAgICAgICAgb24gbGluZSAyIG9mICN7ZmlsZW5hbWVfZm9yX3Rlc3QoOnNjc3MpfQorVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLgorV0FSTklORworQGZ1bmN0aW9uIGZvbygkYSwgJGIpIHtAcmV0dXJuIG51bGx9CiskdmFyOiBmb28oKDEsIDIsIDMsIDQpLi4uKTsKK1NDU1MKKyAgZW5kCisKKyAgIyMgSW50ZXJwb2xhdGlvbgorCisgIGRlZiB0ZXN0X2Jhc2ljX3NlbGVjdG9yX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28gYWIgYmF6IHsKKyAgYTogYjsgfQorQ1NTCitmb28gXCN7J2EnICsgJ2InfSBiYXoge2E6IGJ9CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vLmJhciBiYXogeworICBhOiBiOyB9CitDU1MKK2Zvb1wjeyIuYmFyIn0gYmF6IHthOiBifQorU0NTUworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2Zvby5iYXIgYmF6IHsKKyAgYTogYjsgfQorQ1NTCitcI3siZm9vIn0uYmFyIGJheiB7YTogYn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3Jfb25seV9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIGJhciB7CisgIGE6IGI7IH0KK0NTUworXCN7ImZvbyIgKyAiIGJhciJ9IHthOiBifQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9pbnRlcnBvbGF0aW9uX2JlZm9yZV9lbGVtZW50X25hbWUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb28gYmFyYmF6IHsKKyAgYTogYjsgfQorQ1NTCitcI3siZm9vIiArICIgYmFyIn1iYXoge2E6IGJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2ludGVycG9sYXRpb25faW5fc3RyaW5nCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vW3ZhbD0iYmFyIGZvbyBiYXIgYmF6Il0geworICBhOiBiOyB9CitDU1MKK2Zvb1t2YWw9ImJhciBcI3siZm9vIiArICIgYmFyIn0gYmF6Il0ge2E6IGJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2ludGVycG9sYXRpb25faW5fcHNldWRvY2xhc3MKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb286bnRoLWNoaWxkKDVuKSB7CisgIGE6IGI7IH0KK0NTUworZm9vOm50aC1jaGlsZChcI3s1ICsgIm4ifSkge2E6IGJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2ludGVycG9sYXRpb25fYXRfY2xhc3NfYmVnaW5pbm5nCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLnp6eiB7CisgIGE6IGI7IH0KK0NTUworJHp6ejogenp6OworLlwjeyR6enp9IHsgYTogYjsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9pbnRlcnBvbGF0aW9uX2F0X2lkX2JlZ2luaW5uZworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKyN6enogeworICBhOiBiOyB9CitDU1MKKyR6eno6IHp6ejsKKyNcI3skenp6fSB7IGE6IGI7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfaW50ZXJwb2xhdGlvbl9hdF9wc2V1ZG9fYmVnaW5pbm5nCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorOnp6ejo6enp6IHsKKyAgYTogYjsgfQorQ1NTCiskenp6OiB6eno7Cis6XCN7JHp6en06OlwjeyR6enp9IHsgYTogYjsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9pbnRlcnBvbGF0aW9uX2F0X2F0dHJfYmVnaW5uaW5nCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorW3p6ej1mb29dIHsKKyAgYTogYjsgfQorQ1NTCiskenp6OiB6eno7CitbXCN7JHp6en09Zm9vXSB7IGE6IGI7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfaW50ZXJwb2xhdGlvbl9hdF9hdHRyX2VuZAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK1tmb289enp6XSB7CisgIGE6IGI7IH0KK0NTUworJHp6ejogenp6OworW2Zvbz1cI3skenp6fV0geyBhOiBiOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX2ludGVycG9sYXRpb25fYXRfZGFzaGVzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZGl2IHsKKyAgLWZvby1hLWItZm9vOiBmb287IH0KK0NTUworJGEgOiBhOworJGIgOiBiOworZGl2IHsgLWZvby1cI3skYX0tXCN7JGJ9LWZvbzogZm9vIH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfaW50ZXJwb2xhdGlvbl9pbl9yZWZlcmVuY2VfY29tYmluYXRvcgorICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUyl9CisuZm9vIC9hLyAuYmFyIC9ifGMvIC5iYXogeworICBhOiBiOyB9CitDU1MKKyRhOiBhOworJGI6IGI7CiskYzogYzsKKy5mb28gL1wjeyRhfS8gLmJhciAvXCN7JGJ9fFwjeyRjfS8gLmJheiB7YTogYn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFyZW50X3NlbGVjdG9yX3dpdGhfcGFyZW50X2FuZF9zdWJqZWN0CisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKX0KK2JhciBmb28uYmF6ISAuYmlwIHsKKyAgYzogZDsgfQorQ1NTCiskc3ViamVjdDogIiEiOworZm9vIHsKKyAgYmFyICYuYmF6XCN7JHN1YmplY3R9IC5iaXAge2M6IGR9fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9iYXNpY19wcm9wX25hbWVfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGJhcmJhemJhbmc6IGJsaXA7IH0KK0NTUworZm9vIHtiYXJcI3siYmF6IiArICJiYW5nIn06IGJsaXB9CitTQ1NTCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYmFyMzogYmxpcDsgfQorQ1NTCitmb28ge2JhclwjezEgKyAyfTogYmxpcH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcHJvcF9uYW1lX29ubHlfaW50ZXJwb2xhdGlvbgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGJhemJhbmc6IGJsaXA7IH0KK0NTUworZm9vIHtcI3siYmF6IiArICJiYW5nIn06IGJsaXB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RpcmVjdGl2ZV9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQGZvbyBiYXIxMiBxdXggeworICBhOiBiOyB9CitDU1MKKyRiYXo6IDEyOworQGZvbyBiYXJcI3skYmF6fSBxdXgge2E6IGJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21lZGlhX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAbWVkaWEgYmFyMTIgeworICBhOiBiOyB9CitDU1MKKyRiYXo6IDEyOworQG1lZGlhIGJhclwjeyRiYXp9IHthOiBifQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zY3JpcHRfaW5fbWVkaWEKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyMCksIG9ubHkgcHJpbnQgeworICBhOiBiOyB9CitDU1MKKyRtZWRpYTE6IHNjcmVlbjsKKyRtZWRpYTI6IHByaW50OworJHZhcjogLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOworJHZhbDogMjA7CitAbWVkaWEgXCN7JG1lZGlhMX0gYW5kICgkdmFyOiAkdmFsKSwgb25seSBcI3skbWVkaWEyfSB7YTogYn0KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BtZWRpYSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEzKSB7CisgIGE6IGI7IH0KK0NTUworJHZhbHM6IDEgMiAzOworQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogNSArIDYgKyBudGgoJHZhbHMsIDIpKSB7YTogYn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWVkaWFfaW50ZXJwb2xhdGlvbl93aXRoX3JlcGFyc2UKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMDBweCkgeworICBhOiBiOyB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMDBweCkgeworICBhOiBiOyB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMDBweCkgeworICBhOiBiOyB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMDBweCksIHByaW50IGFuZCAobWF4LXdpZHRoOiAzMDBweCkgeworICBhOiBiOyB9CitDU1MKKyRjb25zdHJhaW50OiAiKG1heC13aWR0aDogMzAwcHgpIjsKKyRmcmFnbWVudDogIm5kIFwjeyRjb25zdHJhaW50fSI7CiskY29tbWE6ICJlZW4sIHByaSI7CitAbWVkaWEgc2NyZWVuIGFuZCBcI3skY29uc3RyYWludH0ge2E6IGJ9CitAbWVkaWEgc2NyZWVuIHsKKyAgQG1lZGlhIFwjeyRjb25zdHJhaW50fSB7YTogYn0KK30KK0BtZWRpYSBzY3JlZW4gYVwjeyRmcmFnbWVudH0ge2E6IGJ9CitAbWVkaWEgc2NyXCN7JGNvbW1hfW50IHsKKyAgQG1lZGlhIFwjeyRjb25zdHJhaW50fSB7YTogYn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbW96X2RvY3VtZW50X2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitALW1vei1kb2N1bWVudCB1cmwoaHR0cDovL3Nhc3MtbGFuZy5jb20vKSwKKyAgICAgICAgICAgICAgIHVybC1wcmVmaXgoaHR0cDovL3Nhc3MtbGFuZy5jb20vZG9jcyksCisgICAgICAgICAgICAgICBkb21haW4oc2Fzcy1sYW5nLmNvbSksCisgICAgICAgICAgICAgICBkb21haW4oInNhc3MtbGFuZy5jb20iKSB7CisgIC5mb28geworICAgIGE6IGI7IH0gfQorQ1NTCiskZG9tYWluOiAic2Fzcy1sYW5nLmNvbSI7CitALW1vei1kb2N1bWVudCB1cmwoaHR0cDovL1wjeyRkb21haW59LyksCisgICAgICAgICAgICAgICB1cmwtcHJlZml4KGh0dHA6Ly9cI3skZG9tYWlufS9kb2NzKSwKKyAgICAgICAgICAgICAgIGRvbWFpbihcI3skZG9tYWlufSksCisgICAgICAgICAgICAgICBcI3tkb21haW4oJGRvbWFpbil9IHsKKyAgLmZvbyB7YTogYn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3VwcG9ydHNfd2l0aF9leHByZXNzaW9ucworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BzdXBwb3J0cyAoKGZlYXR1cmUxOiB2YWwpIGFuZCAoZmVhdHVyZTI6IHZhbCkpIG9yIChub3QgKGZlYXR1cmUyMzogdmFsNCkpIHsKKyAgZm9vIHsKKyAgICBhOiBiOyB9IH0KK0NTUworJHF1ZXJ5OiAiKGZlYXR1cmUxOiB2YWwpIjsKKyRmZWF0dXJlOiBmZWF0dXJlMjsKKyR2YWw6IHZhbDsKK0BzdXBwb3J0cyAoXCN7JHF1ZXJ5fSBhbmQgKCRmZWF0dXJlOiAkdmFsKSkgb3IgKG5vdCAoJGZlYXR1cmUgKyAzOiAkdmFsICsgNCkpIHsKKyAgZm9vIHthOiBifQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zdXBwb3J0c19idWJibGluZworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BzdXBwb3J0cyAoZm9vOiBiYXIpIHsKKyAgYSB7CisgICAgYjogYzsgfQorICAgIEBzdXBwb3J0cyAoYmF6OiBiYW5nKSB7CisgICAgICBhIHsKKyAgICAgICAgZDogZTsgfSB9IH0KK0NTUworYSB7CisgIEBzdXBwb3J0cyAoZm9vOiBiYXIpIHsKKyAgICBiOiBjOworICAgIEBzdXBwb3J0cyAoYmF6OiBiYW5nKSB7CisgICAgICBkOiBlOworICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9yYW5kb21fZGlyZWN0aXZlX2ludGVycG9sYXRpb24KKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAZm9vIHVybChodHRwOi8vc2Fzcy1sYW5nLmNvbS8pLAorICAgICBkb21haW4oInNhc3MtbGFuZy5jb20iKSwKKyAgICAgImZvb2JhcmJheiIsCisgICAgIGZvb2JhcmJheiB7CisgIC5mb28geworICAgIGE6IGI7IH0gfQorQ1NTCiskZG9tYWluOiAic2Fzcy1sYW5nLmNvbSI7CitAZm9vIHVybChodHRwOi8vXCN7JGRvbWFpbn0vKSwKKyAgICAgXCN7ZG9tYWluKCRkb21haW4pfSwKKyAgICAgImZvb1wjeydiYScgKyAncid9YmF6IiwKKyAgICAgZm9vXCN7J2JhJyArICdyJ31iYXogeworICAuZm9vIHthOiBifQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jb2xvcl9pbnRlcnBvbGF0aW9uX3dhcm5pbmdfaW5fc2VsZWN0b3IKKyAgICBhc3NlcnRfd2FybmluZyg8PFdBUk5JTkcpIHthc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpfQorV0FSTklORyBvbiBsaW5lIDEsIGNvbHVtbiA0IG9mICN7ZmlsZW5hbWVfZm9yX3Rlc3QoOnNjc3MpfToKK1lvdSBwcm9iYWJseSBkb24ndCBtZWFuIHRvIHVzZSB0aGUgY29sb3IgdmFsdWUgYGJsdWUnIGluIGludGVycG9sYXRpb24gaGVyZS4KK0l0IG1heSBlbmQgdXAgcmVwcmVzZW50ZWQgYXMgIzAwMDBmZiwgd2hpY2ggd2lsbCBsaWtlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KK0Fsd2F5cyBxdW90ZSBjb2xvciBuYW1lcyB3aGVuIHVzaW5nIHRoZW0gYXMgc3RyaW5ncyAoZm9yIGV4YW1wbGUsICJibHVlIikuCitJZiB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSBjb2xvciB2YWx1ZSBoZXJlLCB1c2UgYCIiICsgYmx1ZScuCitXQVJOSU5HCitmb29ibHVlIHsKKyAgYTogYjsgfQorQ1NTCitmb29cI3tibHVlfSB7YTogYn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29sb3JfaW50ZXJwb2xhdGlvbl93YXJuaW5nX2luX2RpcmVjdGl2ZQorICAgIGFzc2VydF93YXJuaW5nKDw8V0FSTklORykge2Fzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUyl9CitXQVJOSU5HIG9uIGxpbmUgMSwgY29sdW1uIDEyIG9mICN7ZmlsZW5hbWVfZm9yX3Rlc3QoOnNjc3MpfToKK1lvdSBwcm9iYWJseSBkb24ndCBtZWFuIHRvIHVzZSB0aGUgY29sb3IgdmFsdWUgYGJsdWUnIGluIGludGVycG9sYXRpb24gaGVyZS4KK0l0IG1heSBlbmQgdXAgcmVwcmVzZW50ZWQgYXMgIzAwMDBmZiwgd2hpY2ggd2lsbCBsaWtlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KK0Fsd2F5cyBxdW90ZSBjb2xvciBuYW1lcyB3aGVuIHVzaW5nIHRoZW0gYXMgc3RyaW5ncyAoZm9yIGV4YW1wbGUsICJibHVlIikuCitJZiB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSBjb2xvciB2YWx1ZSBoZXJlLCB1c2UgYCIiICsgYmx1ZScuCitXQVJOSU5HCitAZmJsdGhwIGZvb2JsdWUgeworICBhOiBiOyB9CitDU1MKK0BmYmx0aHAgZm9vXCN7Ymx1ZX0ge2E6IGJ9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbG9yX2ludGVycG9sYXRpb25fd2FybmluZ19pbl9wcm9wZXJ0eV9uYW1lCisgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7YXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKX0KK1dBUk5JTkcgb24gbGluZSAxLCBjb2x1bW4gOCBvZiAje2ZpbGVuYW1lX2Zvcl90ZXN0KDpzY3NzKX06CitZb3UgcHJvYmFibHkgZG9uJ3QgbWVhbiB0byB1c2UgdGhlIGNvbG9yIHZhbHVlIGBibHVlJyBpbiBpbnRlcnBvbGF0aW9uIGhlcmUuCitJdCBtYXkgZW5kIHVwIHJlcHJlc2VudGVkIGFzICMwMDAwZmYsIHdoaWNoIHdpbGwgbGlrZWx5IHByb2R1Y2UgaW52YWxpZCBDU1MuCitBbHdheXMgcXVvdGUgY29sb3IgbmFtZXMgd2hlbiB1c2luZyB0aGVtIGFzIHN0cmluZ3MgKGZvciBleGFtcGxlLCAiYmx1ZSIpLgorSWYgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgY29sb3IgdmFsdWUgaGVyZSwgdXNlIGAiIiArIGJsdWUnLgorV0FSTklORworZm9vIHsKKyAgYS1ibHVlOiBiOyB9CitDU1MKK2ZvbyB7YS1cI3tibHVlfTogYn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9fY29sb3JfaW50ZXJwb2xhdGlvbl93YXJuaW5nX2luX3Byb3BlcnR5X3ZhbHVlCisgICAgYXNzZXJ0X25vX3dhcm5pbmcge2Fzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUyl9Citmb28geworICBhOiBiLWJsdWU7IH0KK0NTUworZm9vIHthOiBiLVwje2JsdWV9fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9ub19jb2xvcl9pbnRlcnBvbGF0aW9uX3dhcm5pbmdfZm9yX25hbWVsZXNzX2NvbG9yCisgICAgYXNzZXJ0X25vX3dhcm5pbmcge2Fzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUyl9Citmb28tI2FiY2RlZiB7CisgIGE6IGI7IH0KK0NTUworZm9vLVwjeyNhYmNkZWZ9IHthOiBifQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfbWl4aW5fZGVmCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogYjsgfQorQ1NTCitmb28geworICBAbWl4aW4gYmFyIHthOiBifQorICBAaW5jbHVkZSBiYXI7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX21peGluX3NoYWRvdworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGM6IGQ7IH0KKworYmF6IHsKKyAgYTogYjsgfQorQ1NTCitAbWl4aW4gYmFyIHthOiBifQorCitmb28geworICBAbWl4aW4gYmFyIHtjOiBkfQorICBAaW5jbHVkZSBiYXI7Cit9CisKK2JheiB7QGluY2x1ZGUgYmFyfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfZnVuY3Rpb25fZGVmCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorZm9vIHsKKyAgYTogMTsgfQorCitiYXIgeworICBiOiBmb28oKTsgfQorQ1NTCitmb28geworICBAZnVuY3Rpb24gZm9vKCkge0ByZXR1cm4gMX0KKyAgYTogZm9vKCk7IH0KKworYmFyIHtiOiBmb28oKX0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX2Z1bmN0aW9uX3NoYWRvdworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGE6IDI7IH0KKworYmF6IHsKKyAgYjogMTsgfQorQ1NTCitAZnVuY3Rpb24gZm9vKCkge0ByZXR1cm4gMX0KKworZm9vIHsKKyAgQGZ1bmN0aW9uIGZvbygpIHtAcmV0dXJuIDJ9CisgIGE6IGZvbygpOworfQorCitiYXoge2I6IGZvbygpfQorU0NTUworICBlbmQKKworICAjIyBAYXQtcm9vdAorCisgIGRlZiB0ZXN0X3NpbXBsZV9hdF9yb290CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbyB7CisgIEBhdC1yb290IHsKKyAgICAuYmFyIHthOiBifQorICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2F0X3Jvb3Rfd2l0aF9zZWxlY3RvcgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28geworICBAYXQtcm9vdCAuYmFyIHthOiBifQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X2luX21peGluCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmJhciB7CisgIGE6IGI7IH0KK0NTUworQG1peGluIGJhciB7CisgIEBhdC1yb290IC5iYXIge2E6IGJ9Cit9CisKKy5mb28geworICBAaW5jbHVkZSBiYXI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2F0X3Jvb3RfaW5fbWVkaWEKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAbWVkaWEgc2NyZWVuIHsKKyAgLmJhciB7CisgICAgYTogYjsgfSB9CitDU1MKK0BtZWRpYSBzY3JlZW4geworICAuZm9vIHsKKyAgICBAYXQtcm9vdCAuYmFyIHthOiBifQorICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2F0X3Jvb3RfaW5fYnViYmxlZF9tZWRpYQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BtZWRpYSBzY3JlZW4geworICAuYmFyIHsKKyAgICBhOiBiOyB9IH0KK0NTUworLmZvbyB7CisgIEBtZWRpYSBzY3JlZW4geworICAgIEBhdC1yb290IC5iYXIge2E6IGJ9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF9pbl91bmtub3duX2RpcmVjdGl2ZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BmYmx0aHAgeworICAuYmFyIHsKKyAgICBhOiBiOyB9IH0KK0NTUworQGZibHRocCB7CisgIC5mb28geworICAgIEBhdC1yb290IC5iYXIge2E6IGJ9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfY29tbWVudHNfaW5fYXRfcm9vdAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy8qIGZvbyAqLworLmJhciB7CisgIGE6IGI7IH0KKworLyogYmF6ICovCitDU1MKKy5mb28geworICBAYXQtcm9vdCB7CisgICAgLyogZm9vICovCisgICAgLmJhciB7YTogYn0KKyAgICAvKiBiYXogKi8KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jb21tZW50c19pbl9hdF9yb290X2luX21lZGlhCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQG1lZGlhIHNjcmVlbiB7CisgIC8qIGZvbyAqLworICAuYmFyIHsKKyAgICBhOiBiOyB9CisKKyAgLyogYmF6ICovIH0KK0NTUworQG1lZGlhIHNjcmVlbiB7CisgIC5mb28geworICAgIEBhdC1yb290IHsKKyAgICAgIC8qIGZvbyAqLworICAgICAgLmJhciB7YTogYn0KKyAgICAgIC8qIGJheiAqLworICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9jb21tZW50c19pbl9hdF9yb290X2luX3Vua25vd25fZGlyZWN0aXZlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQGZibHRocCB7CisgIC8qIGZvbyAqLworICAuYmFyIHsKKyAgICBhOiBiOyB9CisKKyAgLyogYmF6ICovIH0KK0NTUworQGZibHRocCB7CisgIC5mb28geworICAgIEBhdC1yb290IHsKKyAgICAgIC8qIGZvbyAqLworICAgICAgLmJhciB7YTogYn0KKyAgICAgIC8qIGJheiAqLworICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tZWRpYV9kaXJlY3RpdmVfaW5fYXRfcm9vdAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BtZWRpYSBzY3JlZW4geworICAuYmFyIHsKKyAgICBhOiBiOyB9IH0KK0NTUworLmZvbyB7CisgIEBhdC1yb290IHsKKyAgICBAbWVkaWEgc2NyZWVuIHsuYmFyIHthOiBifX0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9idWJibGVkX21lZGlhX2RpcmVjdGl2ZV9pbl9hdF9yb290CisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQG1lZGlhIHNjcmVlbiB7CisgIC5iYXIgLmJheiB7CisgICAgYTogYjsgfSB9CitDU1MKKy5mb28geworICBAYXQtcm9vdCB7CisgICAgLmJhciB7CisgICAgICBAbWVkaWEgc2NyZWVuIHsuYmF6IHthOiBifX0KKyAgICB9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfdW5rbm93bl9kaXJlY3RpdmVfaW5fYXRfcm9vdAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BmYmx0aHAgeworICAuYmFyIHsKKyAgICBhOiBiOyB9IH0KK0NTUworLmZvbyB7CisgIEBhdC1yb290IHsKKyAgICBAZmJsdGhwIHsuYmFyIHthOiBifX0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X2luX2F0X3Jvb3QKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuYmFyIHsKKyAgYTogYjsgfQorQ1NTCisuZm9vIHsKKyAgQGF0LXJvb3QgeworICAgIEBhdC1yb290IC5iYXIge2E6IGJ9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF93aXRoX3BhcmVudF9yZWYKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogYjsgfQorQ1NTCisuZm9vIHsKKyAgQGF0LXJvb3QgJiB7CisgICAgYTogYjsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9tdWx0aV9sZXZlbF9hdF9yb290X3dpdGhfcGFyZW50X3JlZgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28gLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbyB7CisgIEBhdC1yb290ICYgeworICAgIC5iYXIgeworICAgICAgQGF0LXJvb3QgJiB7CisgICAgICAgIGE6IGI7CisgICAgICB9CisgICAgfQorICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpX2xldmVsX2F0X3Jvb3Rfd2l0aF9pbm5lcl9wYXJlbnRfcmVmCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbyB7CisgIEBhdC1yb290IC5iYXIgeworICAgIEBhdC1yb290ICYgeworICAgICAgYTogYjsKKyAgICB9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF9iZW5lYXRoX2NvbW1hX3NlbGVjdG9yCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKy5iYXogeworICBhOiBiOyB9CitDU1MKKy5mb28sIC5iYXIgeworICBAYXQtcm9vdCAuYmF6IHsKKyAgICBhOiBiOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2F0X3Jvb3Rfd2l0aF9wYXJlbnRfcmVmX2FuZF9jbGFzcworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisuZm9vLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbyB7CisgIEBhdC1yb290ICYuYmFyIHsKKyAgICBhOiBiOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2F0X3Jvb3RfYmVuZWF0aF9jb21tYV9zZWxlY3Rvcl93aXRoX3BhcmVudF9yZWYKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmZvby5iYXosIC5iYXIuYmF6IHsKKyAgYTogYjsgfQorQ1NTCisuZm9vLCAuYmFyIHsKKyAgQGF0LXJvb3QgJi5iYXogeworICAgIGE6IGI7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgIyMgQGF0LXJvb3QgKC4uLikKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhvdXRfbWVkaWEKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIC5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28geworICBAbWVkaWEgc2NyZWVuIHsKKyAgICBAYXQtcm9vdCAod2l0aG91dDogbWVkaWEpIHsKKyAgICAgIC5iYXIgeworICAgICAgICBhOiBiOworICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhvdXRfc3VwcG9ydHMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIC5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28geworICBAc3VwcG9ydHMgKGZvbzogYmFyKSB7CisgICAgQGF0LXJvb3QgKHdpdGhvdXQ6IHN1cHBvcnRzKSB7CisgICAgICAuYmFyIHsKKyAgICAgICAgYTogYjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF93aXRob3V0X3J1bGUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAbWVkaWEgc2NyZWVuIHsKKyAgLmJhciB7CisgICAgYTogYjsgfSB9CitDU1MKKy5mb28geworICBAbWVkaWEgc2NyZWVuIHsKKyAgICBAYXQtcm9vdCAod2l0aG91dDogcnVsZSkgeworICAgICAgLmJhciB7CisgICAgICAgIGE6IGI7CisgICAgICB9CisgICAgfQorICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2F0X3Jvb3Rfd2l0aG91dF91bmtub3duX2RpcmVjdGl2ZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BmYmx0aHAge30KKy5mb28gLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbyB7CisgIEBmYmx0aHAgeworICAgIEBhdC1yb290ICh3aXRob3V0OiBmYmx0aHApIHsKKyAgICAgIC5iYXIgeworICAgICAgICBhOiBiOworICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhvdXRfbXVsdGlwbGUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAc3VwcG9ydHMgKGZvbzogYmFyKSB7CisgIC5iYXIgeworICAgIGE6IGI7IH0gfQorQ1NTCisuZm9vIHsKKyAgQG1lZGlhIHNjcmVlbiB7CisgICAgQHN1cHBvcnRzIChmb286IGJhcikgeworICAgICAgQGF0LXJvb3QgKHdpdGhvdXQ6IG1lZGlhIHJ1bGUpIHsKKyAgICAgICAgLmJhciB7CisgICAgICAgICAgYTogYjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhvdXRfYWxsCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQHN1cHBvcnRzIChmb286IGJhcikgeworICBAZmJsdGhwIHt9IH0KKy5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28geworICBAc3VwcG9ydHMgKGZvbzogYmFyKSB7CisgICAgQGZibHRocCB7CisgICAgICBAYXQtcm9vdCAod2l0aG91dDogYWxsKSB7CisgICAgICAgIC5iYXIgeworICAgICAgICAgIGE6IGI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF93aXRoX21lZGlhCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQG1lZGlhIHNjcmVlbiB7CisgIEBmYmx0aHAge30KKyAgLmJhciB7CisgICAgYTogYjsgfSB9CitDU1MKKy5mb28geworICBAbWVkaWEgc2NyZWVuIHsKKyAgICBAZmJsdGhwIHsKKyAgICAgIEBzdXBwb3J0cyAoZm9vOiBiYXIpIHsKKyAgICAgICAgQGF0LXJvb3QgKHdpdGg6IG1lZGlhKSB7CisgICAgICAgICAgLmJhciB7CisgICAgICAgICAgICBhOiBiOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhfcnVsZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BtZWRpYSBzY3JlZW4geworICBAZmJsdGhwIHt9IH0KKy5mb28gLmJhciB7CisgIGE6IGI7IH0KK0NTUworLmZvbyB7CisgIEBtZWRpYSBzY3JlZW4geworICAgIEBmYmx0aHAgeworICAgICAgQHN1cHBvcnRzIChmb286IGJhcikgeworICAgICAgICBAYXQtcm9vdCAod2l0aDogcnVsZSkgeworICAgICAgICAgIC5iYXIgeworICAgICAgICAgICAgYTogYjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF93aXRoX3N1cHBvcnRzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQG1lZGlhIHNjcmVlbiB7CisgIEBmYmx0aHAge30gfQorQHN1cHBvcnRzIChmb286IGJhcikgeworICAuYmFyIHsKKyAgICBhOiBiOyB9IH0KK0NTUworLmZvbyB7CisgIEBtZWRpYSBzY3JlZW4geworICAgIEBmYmx0aHAgeworICAgICAgQHN1cHBvcnRzIChmb286IGJhcikgeworICAgICAgICBAYXQtcm9vdCAod2l0aDogc3VwcG9ydHMpIHsKKyAgICAgICAgICAuYmFyIHsKKyAgICAgICAgICAgIGE6IGI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2F0X3Jvb3Rfd2l0aF91bmtub3duX2RpcmVjdGl2ZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BtZWRpYSBzY3JlZW4geworICBAZmJsdGhwIHt9IH0KK0BmYmx0aHAgeworICAuYmFyIHsKKyAgICBhOiBiOyB9IH0KK0NTUworLmZvbyB7CisgIEBtZWRpYSBzY3JlZW4geworICAgIEBmYmx0aHAgeworICAgICAgQHN1cHBvcnRzIChmb286IGJhcikgeworICAgICAgICBAYXQtcm9vdCAod2l0aDogZmJsdGhwKSB7CisgICAgICAgICAgLmJhciB7CisgICAgICAgICAgICBhOiBiOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhfbXVsdGlwbGUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAbWVkaWEgc2NyZWVuIHsKKyAgQGZibHRocCB7fQorICAuZm9vIC5iYXIgeworICAgIGE6IGI7IH0gfQorQ1NTCisuZm9vIHsKKyAgQG1lZGlhIHNjcmVlbiB7CisgICAgQGZibHRocCB7CisgICAgICBAc3VwcG9ydHMgKGZvbzogYmFyKSB7CisgICAgICAgIEBhdC1yb290ICh3aXRoOiBtZWRpYSBydWxlKSB7CisgICAgICAgICAgLmJhciB7CisgICAgICAgICAgICBhOiBiOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhfYWxsCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQG1lZGlhIHNjcmVlbiB7CisgIEBmYmx0aHAgeworICAgIEBzdXBwb3J0cyAoZm9vOiBiYXIpIHsKKyAgICAgIC5mb28gLmJhciB7CisgICAgICAgIGE6IGI7IH0gfSB9IH0KK0NTUworLmZvbyB7CisgIEBtZWRpYSBzY3JlZW4geworICAgIEBmYmx0aHAgeworICAgICAgQHN1cHBvcnRzIChmb286IGJhcikgeworICAgICAgICBAYXQtcm9vdCAod2l0aDogYWxsKSB7CisgICAgICAgICAgLmJhciB7CisgICAgICAgICAgICBhOiBiOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X2R5bmFtaWNfdmFsdWVzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorQG1lZGlhIHNjcmVlbiB7CisgIC5iYXIgeworICAgIGE6IGI7IH0gfQorQ1NTCiska2V5OiB3aXRoOworJHZhbHVlOiBtZWRpYTsKKy5mb28geworICBAbWVkaWEgc2NyZWVuIHsKKyAgICBAYXQtcm9vdCAoJGtleTogJHZhbHVlKSB7CisgICAgICAuYmFyIHsKKyAgICAgICAgYTogYjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF9pbnRlcnBvbGF0ZWRfcXVlcnkKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitAbWVkaWEgc2NyZWVuIHsKKyAgLmJhciB7CisgICAgYTogYjsgfSB9CitDU1MKKy5mb28geworICBAbWVkaWEgc2NyZWVuIHsKKyAgICBAYXQtcm9vdCAoXCN7IndpdGg6IG1lZGlhIn0pIHsKKyAgICAgIC5iYXIgeworICAgICAgICBhOiBiOworICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3BsdXNfZXh0ZW5kCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmZvbyAuYmFyIHsKKyAgYTogYjsgfQorQ1NTCislYmFzZSB7CisgIGE6IGI7Cit9CisKKy5mb28geworICBAbWVkaWEgc2NyZWVuIHsKKyAgICBAYXQtcm9vdCAod2l0aG91dDogbWVkaWEpIHsKKyAgICAgIC5iYXIgeworICAgICAgICBAZXh0ZW5kICViYXNlOworICAgICAgfQorICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhvdXRfa2V5ZnJhbWVzX2luX2tleWZyYW1lX3J1bGUKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuZm9vIHsKKyAgYTogYjsgfQorQ1NTCitAa2V5ZnJhbWVzIGlkZW50aWZpZXIgeworICAwJSB7CisgICAgQGF0LXJvb3QgKHdpdGhvdXQ6IGtleWZyYW1lcykgeworICAgICAgLmZvbyB7YTogYn0KKyAgICB9CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF93aXRob3V0X3J1bGVfaW5fa2V5ZnJhbWVfcnVsZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK0BrZXlmcmFtZXMgaWRlbnRpZmllciB7CisgIDAlIHsKKyAgICBhOiBiOyB9IH0KK0NTUworQGtleWZyYW1lcyBpZGVudGlmaWVyIHsKKyAgMCUgeworICAgIEBhdC1yb290ICh3aXRob3V0OiBydWxlKSB7YTogYn0KKyAgfQorfQorU0NTUworICBlbmQKKworICAjIyBTZWxlY3RvciBTY3JpcHQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9zY3JpcHQKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmZvbyAuYmFyIHsKKyAgY29udGVudDogIi5mb28gLmJhciI7IH0KK0NTUworLmZvbyAuYmFyIHsKKyAgY29udGVudDogIlwjeyZ9IjsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX3NlbGVjdG9yX3NjcmlwdAorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisuZm9vIC5iYXIgeworICBjb250ZW50OiAiLmZvbyAuYmFyIjsgfQorQ1NTCisuZm9vIHsKKyAgLmJhciB7CisgICAgY29udGVudDogIlwjeyZ9IjsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9uZXN0ZWRfc2VsZWN0b3Jfc2NyaXB0X3dpdGhfb3V0ZXJfY29tbWFfc2VsZWN0b3IKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmZvbyAuYmF6LCAuYmFyIC5iYXogeworICBjb250ZW50OiAiLmZvbyAuYmF6LCAuYmFyIC5iYXoiOyB9CitDU1MKKy5mb28sIC5iYXIgeworICAuYmF6IHsKKyAgICBjb250ZW50OiAiXCN7Jn0iOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3RlZF9zZWxlY3Rvcl9zY3JpcHRfd2l0aF9pbm5lcl9jb21tYV9zZWxlY3RvcgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisuZm9vIC5iYXIsIC5mb28gLmJheiB7CisgIGNvbnRlbnQ6ICIuZm9vIC5iYXIsIC5mb28gLmJheiI7IH0KK0NTUworLmZvbyB7CisgIC5iYXIsIC5iYXogeworICAgIGNvbnRlbnQ6ICJcI3smfSI7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3Jfc2NyaXB0X3Rocm91Z2hfbWl4aW4KKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmZvbyB7CisgIGNvbnRlbnQ6ICIuZm9vIjsgfQorQ1NTCitAbWl4aW4gbWl4aW4geworICBjb250ZW50OiAiXCN7Jn0iOworfQorCisuZm9vIHsKKyAgQGluY2x1ZGUgbWl4aW47Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX3NjcmlwdF90aHJvdWdoX2NvbnRlbnQKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmZvbyB7CisgIGNvbnRlbnQ6ICIuZm9vIjsgfQorQ1NTCitAbWl4aW4gbWl4aW4geworICBAY29udGVudDsKK30KKworLmZvbyB7CisgIEBpbmNsdWRlIG1peGluIHsKKyAgICBjb250ZW50OiAiXCN7Jn0iOworICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX3NjcmlwdF90aHJvdWdoX2Z1bmN0aW9uCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKy5mb28geworICBjb250ZW50OiAiLmZvbyI7IH0KK0NTUworQGZ1bmN0aW9uIGZuKCkgeworICBAcmV0dXJuICJcI3smfSI7Cit9CisKKy5mb28geworICBjb250ZW50OiBmbigpOworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9zY3JpcHRfdGhyb3VnaF9tZWRpYQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisuZm9vIHsKKyAgY29udGVudDogIm91dGVyIjsgfQorICBAbWVkaWEgc2NyZWVuIHsKKyAgICAuZm9vIC5iYXIgeworICAgICAgY29udGVudDogIi5mb28gLmJhciI7IH0gfQorQ1NTCisuZm9vIHsKKyAgY29udGVudDogIm91dGVyIjsKKyAgQG1lZGlhIHNjcmVlbiB7CisgICAgLmJhciB7CisgICAgICBjb250ZW50OiAiXCN7Jn0iOworICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9zY3JpcHRfc2F2ZV9hbmRfcmV1c2UKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmJhciB7CisgIGNvbnRlbnQ6ICIuZm9vIjsgfQorQ1NTCiskdmFyOiBudWxsOworLmZvbyB7CisgICR2YXI6ICYgIWdsb2JhbDsKK30KKworLmJhciB7CisgIGNvbnRlbnQ6ICJcI3skdmFyfSI7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlbGVjdG9yX3NjcmlwdF93aXRoX2F0X3Jvb3QKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmZvby1iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28geworICBAYXQtcm9vdCBcI3smfS1iYXIgeworICAgIGE6IGI7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlfbGV2ZWxfYXRfcm9vdF93aXRoX2lubmVyX3NlbGVjdG9yX3NjcmlwdAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5iYXIgeworICBhOiBiOyB9CitDU1MKKy5mb28geworICBAYXQtcm9vdCAuYmFyIHsKKyAgICBAYXQtcm9vdCBcI3smfSB7CisgICAgICBhOiBiOworICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdF9yb290X3dpdGhfYXRfcm9vdF90aHJvdWdoX21peGluCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKy5iYXItYmF6IHsKKyAgYTogYjsgfQorQ1NTCitAbWl4aW4gZm9vIHsKKyAgLmJhciB7CisgICAgQGF0LXJvb3QgXCN7Jn0tYmF6IHsKKyAgICAgIGE6IGI7CisgICAgfQorICB9Cit9CisKK0BpbmNsdWRlIGZvbzsKK1NDU1MKKyAgZW5kCisKKyAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Nhc3Mvc2Fzcy9pc3N1ZXMvMTI5NAorICBkZWYgdGVzdF9leHRlbmRfdG9wX2xldmVsZWRfYnlfYXRfcm9vdAorICAgIHJlbmRlcig8PFNDU1MpCisuc3Bhbi0xMCB7CisgIEBhdC1yb290ICh3aXRob3V0OiBhbGwpIHsKKyAgICBAZXh0ZW5kICVjb2x1bW47CisgIH0KK30KK1NDU1MKKworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICJFeHRlbmQgZGlyZWN0aXZlcyBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiBydWxlcy4iLCBlLm1lc3NhZ2UKKyAgICBhc3NlcnRfZXF1YWwgMywgZS5zYXNzX2xpbmUKKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRfcm9vdF9kb2VzbnRfYWx3YXlzX2JyZWFrX2Jsb2NrcworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5mb28geworICBhOiBiOyB9CisKK0BtZWRpYSBzY3JlZW4geworICAuZm9vIHsKKyAgICBjOiBkOyB9CisgIC5iYXIgeworICAgIGU6IGY7IH0gfQorQ1NTCislYmFzZSB7CisgIGE6IGI7Cit9CisKK0BtZWRpYSBzY3JlZW4geworICAuZm9vIHsKKyAgICBjOiBkOworICAgIEBhdC1yb290ICh3aXRob3V0OiBtZWRpYSkgeworICAgICAgQGV4dGVuZCAlYmFzZTsKKyAgICB9CisgIH0KKworICAuYmFyIHtlOiBmfQorfQorU0NTUworICBlbmQKKworICAjIyBFcnJvcnMKKworICBkZWYgdGVzdF9rZXlmcmFtZXNfcnVsZV9vdXRzaWRlX29mX2tleWZyYW1lcworICAgIHJlbmRlciA8PFNDU1MKKzAlIHsKKyAgdG9wOiAwOyB9CitTQ1NTCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgc3ludGF4IGVycm9yIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwgJ0ludmFsaWQgQ1NTIGFmdGVyICIiOiBleHBlY3RlZCBzZWxlY3Rvciwgd2FzICIwJSInLCBlLm1lc3NhZ2UKKyAgICBhc3NlcnRfZXF1YWwgMSwgZS5zYXNzX2xpbmUKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JfcnVsZV9pbl9rZXlmcmFtZXMKKyAgICByZW5kZXIgPDxTQ1NTCitAa2V5ZnJhbWVzIGlkZW50aWZpZXIgeworICAuZm9vIHsKKyAgICB0b3A6IDA7IH0gfQorU0NTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICdJbnZhbGlkIENTUyBhZnRlciAiIjogZXhwZWN0ZWQga2V5ZnJhbWVzIHNlbGVjdG9yIChlLmcuIDEwJSksIHdhcyAiLmZvbyInLCBlLm1lc3NhZ2UKKyAgICBhc3NlcnRfZXF1YWwgMiwgZS5zYXNzX2xpbmUKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdGVkX21peGluX2RlZl9pc19zY29wZWQKKyAgICByZW5kZXIgPDxTQ1NTCitmb28geworICBAbWl4aW4gYmFyIHthOiBifX0KK2JhciB7QGluY2x1ZGUgYmFyfQorU0NTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICJVbmRlZmluZWQgbWl4aW4gJ2JhcicuIiwgZS5tZXNzYWdlCisgICAgYXNzZXJ0X2VxdWFsIDMsIGUuc2Fzc19saW5lCisgIGVuZAorCisgIGRlZiB0ZXN0X3J1bGVzX2JlbmVhdGhfcHJvcGVydGllcworICAgIHJlbmRlciA8PFNDU1MKK2ZvbyB7CisgIGJhcjogeworICAgIGJheiB7CisgICAgICBiYW5nOiBib3AgfX19CitTQ1NTCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgc3ludGF4IGVycm9yIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwgJ0lsbGVnYWwgbmVzdGluZzogT25seSBwcm9wZXJ0aWVzIG1heSBiZSBuZXN0ZWQgYmVuZWF0aCBwcm9wZXJ0aWVzLicsIGUubWVzc2FnZQorICAgIGFzc2VydF9lcXVhbCAzLCBlLnNhc3NfbGluZQorICBlbmQKKworICBkZWYgdGVzdF91c2VzX3Byb3BlcnR5X2V4Y2VwdGlvbl93aXRoX3N0YXJfaGFjaworICAgIHJlbmRlciA8PFNDU1MKK2ZvbyB7CisgICpiYXI6YmF6IDxmYWlsPjsgfQorU0NTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICdJbnZhbGlkIENTUyBhZnRlciAiICAqYmFyOmJheiA8ZmFpbD4iOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiOyB9IicsIGUubWVzc2FnZQorICAgIGFzc2VydF9lcXVhbCAyLCBlLnNhc3NfbGluZQorICBlbmQKKworICBkZWYgdGVzdF91c2VzX3Byb3BlcnR5X2V4Y2VwdGlvbl93aXRoX2NvbG9uX2hhY2sKKyAgICByZW5kZXIgPDxTQ1NTCitmb28geworICA6YmFyOmJheiA8ZmFpbD47IH0KK1NDU1MKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBzeW50YXggZXJyb3IiKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCAnSW52YWxpZCBDU1MgYWZ0ZXIgIiAgOmJhcjpiYXogPGZhaWw+IjogZXhwZWN0ZWQgZXhwcmVzc2lvbiAoZS5nLiAxcHgsIGJvbGQpLCB3YXMgIjsgfSInLCBlLm1lc3NhZ2UKKyAgICBhc3NlcnRfZXF1YWwgMiwgZS5zYXNzX2xpbmUKKyAgZW5kCisKKyAgZGVmIHRlc3RfdXNlc19ydWxlX2V4Y2VwdGlvbl93aXRoX2RvdF9oYWNrCisgICAgcmVuZGVyIDw8U0NTUworZm9vIHsKKyAgLmJhcjpiYXogPGZhaWw+OyB9CitTQ1NTCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgc3ludGF4IGVycm9yIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwgJ0ludmFsaWQgQ1NTIGFmdGVyICIgIC5iYXI6YmF6IDxmYWlsPiI6IGV4cGVjdGVkIGV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSwgd2FzICI7IH0iJywgZS5tZXNzYWdlCisgICAgYXNzZXJ0X2VxdWFsIDIsIGUuc2Fzc19saW5lCisgIGVuZAorCisgIGRlZiB0ZXN0X3VzZXNfcHJvcGVydHlfZXhjZXB0aW9uX3dpdGhfc3BhY2VfYWZ0ZXJfbmFtZQorICAgIHJlbmRlciA8PFNDU1MKK2ZvbyB7CisgIGJhcjogYmF6IDxmYWlsPjsgfQorU0NTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICdJbnZhbGlkIENTUyBhZnRlciAiICBiYXI6IGJheiA8ZmFpbD4iOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiOyB9IicsIGUubWVzc2FnZQorICAgIGFzc2VydF9lcXVhbCAyLCBlLnNhc3NfbGluZQorICBlbmQKKworICBkZWYgdGVzdF91c2VzX3Byb3BlcnR5X2V4Y2VwdGlvbl93aXRoX25vbl9pZGVudGlmaWVyX2FmdGVyX25hbWUKKyAgICByZW5kZXIgPDxTQ1NTCitmb28geworICBiYXI6MXB4IDxmYWlsPjsgfQorU0NTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICdJbnZhbGlkIENTUyBhZnRlciAiICBiYXI6MXB4IDxmYWlsPiI6IGV4cGVjdGVkIGV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSwgd2FzICI7IH0iJywgZS5tZXNzYWdlCisgICAgYXNzZXJ0X2VxdWFsIDIsIGUuc2Fzc19saW5lCisgIGVuZAorCisgIGRlZiB0ZXN0X3VzZXNfcHJvcGVydHlfZXhjZXB0aW9uX3doZW5fZm9sbG93ZWRfYnlfb3Blbl9icmFja2V0CisgICAgcmVuZGVyIDw8U0NTUworZm9vIHsKKyAgYmFyOntiYXo6IC5mYWlsfSB9CitTQ1NTCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgc3ludGF4IGVycm9yIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwgJ0ludmFsaWQgQ1NTIGFmdGVyICIgIGJhcjp7YmF6OiAiOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiLmZhaWx9IH0iJywgZS5tZXNzYWdlCisgICAgYXNzZXJ0X2VxdWFsIDIsIGUuc2Fzc19saW5lCisgIGVuZAorCisgIGRlZiB0ZXN0X3NjcmlwdF9lcnJvcgorICAgIHJlbmRlciA8PFNDU1MKK2ZvbyB7CisgIGJhcjogImJheiIgKiAqIH0KK1NDU1MKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBzeW50YXggZXJyb3IiKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCAnSW52YWxpZCBDU1MgYWZ0ZXIgIiAgYmFyOiAiYmF6IiAqICI6IGV4cGVjdGVkIGV4cHJlc3Npb24gKGUuZy4gMXB4LCBib2xkKSwgd2FzICIqIH0iJywgZS5tZXNzYWdlCisgICAgYXNzZXJ0X2VxdWFsIDIsIGUuc2Fzc19saW5lCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpbGluZV9zY3JpcHRfc3ludGF4X2Vycm9yCisgICAgcmVuZGVyIDw8U0NTUworZm9vIHsKKyAgYmFyOgorICAgICJiYXoiICogKiB9CitTQ1NTCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgc3ludGF4IGVycm9yIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGUKKyAgICBhc3NlcnRfZXF1YWwgJ0ludmFsaWQgQ1NTIGFmdGVyICIgICAgImJheiIgKiAiOiBleHBlY3RlZCBleHByZXNzaW9uIChlLmcuIDFweCwgYm9sZCksIHdhcyAiKiB9IicsIGUubWVzc2FnZQorICAgIGFzc2VydF9lcXVhbCAzLCBlLnNhc3NfbGluZQorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aWxpbmVfc2NyaXB0X3J1bnRpbWVfZXJyb3IKKyAgICByZW5kZXIgPDxTQ1NTCitmb28geworICBiYXI6ICJiYXoiICsKKyAgICAiYmFyIiArCisgICAgJGJhbmcgfQorU0NTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICJVbmRlZmluZWQgdmFyaWFibGU6IFwiJGJhbmdcIi4iLCBlLm1lc3NhZ2UKKyAgICBhc3NlcnRfZXF1YWwgNCwgZS5zYXNzX2xpbmUKKyAgZW5kCisKKyAgZGVmIHRlc3RfcG9zdF9tdWx0aWxpbmVfc2NyaXB0X3J1bnRpbWVfZXJyb3IKKyAgICByZW5kZXIgPDxTQ1NTCitmb28geworICBiYXI6ICJiYXoiICsKKyAgICAiYmFyIiArCisgICAgImJheiI7CisgIGJpcDogJGJvcDsgfQorU0NTUworICAgIGFzc2VydChmYWxzZSwgIkV4cGVjdGVkIHN5bnRheCBlcnJvciIpCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsICJVbmRlZmluZWQgdmFyaWFibGU6IFwiJGJvcFwiLiIsIGUubWVzc2FnZQorICAgIGFzc2VydF9lcXVhbCA1LCBlLnNhc3NfbGluZQorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aWxpbmVfcHJvcGVydHlfcnVudGltZV9lcnJvcgorICAgIHJlbmRlciA8PFNDU1MKK2ZvbyB7CisgIGJhcjogYmF6CisgICAgYmFyCisgICAgXCN7JGJhbmd9IH0KK1NDU1MKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBzeW50YXggZXJyb3IiKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCAiVW5kZWZpbmVkIHZhcmlhYmxlOiBcIiRiYW5nXCIuIiwgZS5tZXNzYWdlCisgICAgYXNzZXJ0X2VxdWFsIDQsIGUuc2Fzc19saW5lCisgIGVuZAorCisgIGRlZiB0ZXN0X3Bvc3RfcmVzb2x1dGlvbl9zZWxlY3Rvcl9lcnJvcgorICAgIHJlbmRlciAiXG5cbmZvbyBcI3tcIikgYmFyXCJ9IHthOiBifSIKKyAgICBhc3NlcnQoZmFsc2UsICJFeHBlY3RlZCBzeW50YXggZXJyb3IiKQorICByZXNjdWUgU2Fzczo6U3ludGF4RXJyb3IgPT4gZQorICAgIGFzc2VydF9lcXVhbCAnSW52YWxpZCBDU1MgYWZ0ZXIgImZvbyAiOiBleHBlY3RlZCBzZWxlY3Rvciwgd2FzICIpIGJhciInLCBlLm1lc3NhZ2UKKyAgICBhc3NlcnRfZXF1YWwgMywgZS5zYXNzX2xpbmUKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFyZW50X2luX21pZF9zZWxlY3Rvcl9lcnJvcgorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCA8PE1FU1NBR0UucnN0cmlwKSB7cmVuZGVyIDw8U0NTU30KK0ludmFsaWQgQ1NTIGFmdGVyICIuZm9vIjogZXhwZWN0ZWQgInsiLCB3YXMgIiYuYmFyIgorCisiJi5iYXIiIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNvbXBvdW5kIHNlbGVjdG9yLgorTUVTU0FHRQorZmxpbSB7CisgIC5mb28mLmJhciB7YTogYn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFyZW50X2FmdGVyX3NlbGVjdG9yX2Vycm9yCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRS5yc3RyaXApIHtyZW5kZXIgPDxTQ1NTfQorSW52YWxpZCBDU1MgYWZ0ZXIgIi5mb28uYmFyIjogZXhwZWN0ZWQgInsiLCB3YXMgIiYiCisKKyImIiBtYXkgb25seSBiZSB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wb3VuZCBzZWxlY3Rvci4KK01FU1NBR0UKK2ZsaW0geworICAuZm9vLmJhciYge2E6IGJ9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2RvdWJsZV9wYXJlbnRfc2VsZWN0b3JfZXJyb3IKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxNRVNTQUdFLnJzdHJpcCkge3JlbmRlciA8PFNDU1N9CitJbnZhbGlkIENTUyBhZnRlciAiJiI6IGV4cGVjdGVkICJ7Iiwgd2FzICImIgorCisiJiIgbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY29tcG91bmQgc2VsZWN0b3IuCitNRVNTQUdFCitmbGltIHsKKyAgJiYge2E6IGJ9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25vX2xvbmVseV9lbHNlCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsIDw8TUVTU0FHRS5yc3RyaXApIHtyZW5kZXIgPDxTQ1NTfQorSW52YWxpZCBDU1M6IEBlbHNlIG11c3QgY29tZSBhZnRlciBAaWYKK01FU1NBR0UKK0BlbHNlIHtmb286IGJhcn0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZmFpbGVkX3BhcmVudF9zZWxlY3Rvcl93aXRoX3N1ZmZpeAorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCA8PE1FU1NBR0UucnN0cmlwKSB7cmVuZGVyKDw8U0NTUyl9CitJbnZhbGlkIHBhcmVudCBzZWxlY3RvciBmb3IgIiYtYmFyIjogIioiCitNRVNTQUdFCisqIHsKKyAgJi1iYXIge2E6IGJ9Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxNRVNTQUdFLnJzdHJpcCkge3JlbmRlcig8PFNDU1MpfQorSW52YWxpZCBwYXJlbnQgc2VsZWN0b3IgZm9yICImLWJhciI6ICJbZm9vPWJhcl0iCitNRVNTQUdFCitbZm9vPWJhcl0geworICAmLWJhciB7YTogYn0KK30KK1NDU1MKKworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCA8PE1FU1NBR0UucnN0cmlwKSB7cmVuZGVyKDw8U0NTUyl9CitJbnZhbGlkIHBhcmVudCBzZWxlY3RvciBmb3IgIiYtYmFyIjogIjo6bnRoLWNoaWxkKDJuKzEpIgorTUVTU0FHRQorOjpudGgtY2hpbGQoMm4rMSkgeworICAmLWJhciB7YTogYn0KK30KK1NDU1MKKworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCA8PE1FU1NBR0UucnN0cmlwKSB7cmVuZGVyKDw8U0NTUyl9CitJbnZhbGlkIHBhcmVudCBzZWxlY3RvciBmb3IgIiYtYmFyIjogIjpub3QoLmZvbykiCitNRVNTQUdFCis6bm90KC5mb28pIHsKKyAgJi1iYXIge2E6IGJ9Cit9CitTQ1NTCisKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxNRVNTQUdFLnJzdHJpcCkge3JlbmRlcig8PFNDU1MpfQorSW52YWxpZCBwYXJlbnQgc2VsZWN0b3IgZm9yICImLWJhciI6ICIuZm9vICsiCitNRVNTQUdFCisuZm9vICsgeworICAmLWJhciB7YTogYn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW1wdHlfbWVkaWFfcXVlcnlfZXJyb3IKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgPDxNRVNTQUdFLnJzdHJpcCkge3JlbmRlcig8PFNDU1MpfQorSW52YWxpZCBDU1MgYWZ0ZXIgIiI6IGV4cGVjdGVkIG1lZGlhIHF1ZXJ5IGxpc3QsIHdhcyAiIgorTUVTU0FHRQorQG1lZGlhIFwjeyIifSB7CisgIGZvbyB7YTogYn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmV3bGluZV9pbl9wcm9wZXJ0eV92YWx1ZQorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisuZm9vIHsKKyAgYmFyOiAiYmF6YmFuZyI7IH0KK0NTUworLmZvbyB7CisgICR2YXI6ICJiYXpcXAorYmFuZyI7CisgIGJhcjogJHZhcjsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmF3X25ld2xpbmVfd2FybmluZworICAgIGFzc2VydF93YXJuaW5nKDw8TUVTU0FHRS5yc3RyaXApIHthc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKX0KK0RFUFJFQ0FUSU9OIFdBUk5JTkcgb24gbGluZSAyLCBjb2x1bW4gOSBvZiAje2ZpbGVuYW1lX2Zvcl90ZXN0IDpzY3NzfToKK1VuZXNjYXBlZCBtdWx0aWxpbmUgc3RyaW5ncyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgU2Fzcy4KK1RvIGluY2x1ZGUgYSBuZXdsaW5lIGluIGEgc3RyaW5nLCB1c2UgIlxcYSIgb3IgIlxcYSAiIGFzIGluIENTUy4KK01FU1NBR0UKKy5mb28geworICBiYXI6ICJiYXpcXGEgYmFuZyI7IH0KK0NTUworLmZvbyB7CisgICR2YXI6ICJiYXoKK2JhbmciOworICBiYXI6ICR2YXI7Cit9CitTQ1NTCisgIGVuZAorCisgICMgUmVncmVzc2lvbgorCisgICMgUmVncmVzc2lvbiB0ZXN0IGZvciAjMjAzMS4KKyAgZGVmIHRlc3Rfbm9faW50ZXJwb2xhdGlvbl93YXJuaW5nX2luX25lc3RlZF9zZWxlY3RvcgorICAgIGFzc2VydF9ub193YXJuaW5nIHthc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKX0KK3ogYTpiKG4rMSkgeworICB4OiB5OyB9CitDU1MKK3ogeworICBhOmIobitcI3sxfSkgeworICAgIHg6IHk7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgIyBFbnN1cmVzIHRoYXQgdGhlIGZpeCBmb3IgIzIwMzEgZG9lc24ndCBoaWRlIGxlZ2l0aW1hdGUgd2FybmluZ3MuCisgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25fd2FybmluZ19pbl9zZWxlY3Rvcl9saWtlX3Byb3BlcnR5CisgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7YXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSl9CitERVBSRUNBVElPTiBXQVJOSU5HIG9uIGxpbmUgMiBvZiAje2ZpbGVuYW1lX2Zvcl90ZXN0IDpzY3NzfToKK1wje30gaW50ZXJwb2xhdGlvbiBuZWFyIG9wZXJhdG9ycyB3aWxsIGJlIHNpbXBsaWZpZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTYXNzLgorVG8gcHJlc2VydmUgdGhlIGN1cnJlbnQgYmVoYXZpb3IsIHVzZSBxdW90ZXM6CisKKyAgdW5xdW90ZSgibisxIikKKworWW91IGNhbiB1c2UgdGhlIHNhc3MtY29udmVydCBjb21tYW5kIHRvIGF1dG9tYXRpY2FsbHkgZml4IG1vc3QgY2FzZXMuCitXQVJOSU5HCit6IHsKKyAgYTogYihuKzEpOyB9CitDU1MKK3ogeworICBhOmIobitcI3sxfSk7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2VzY2FwZV9pbl9zZWxlY3RvcgorICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKCIuXFwhZm9vIHthOiBifSIpKQorLlxcIWZvbyB7CisgIGE6IGI7IH0KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9mb3JfZGlyZWN0aXZlX3dpdGhfZmxvYXRfYm91bmRzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKy5hIHsKKyAgYjogMDsKKyAgYjogMTsKKyAgYjogMjsKKyAgYjogMzsKKyAgYjogNDsKKyAgYjogNTsgfQorQ1NTCisuYSB7CisgIEBmb3IgJGkgZnJvbSAwLjAgdGhyb3VnaCA1LjAge2I6ICRpfQorfQorU0NTUworCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICIwLjUgaXMgbm90IGFuIGludGVnZXIuIikge3JlbmRlcig8PFNDU1MpfQorLmEgeworICBAZm9yICRpIGZyb20gMC41IHRocm91Z2ggNS4wIHtiOiAkaX0KK30KK1NDU1MKKworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAiNS41IGlzIG5vdCBhbiBpbnRlZ2VyLiIpIHtyZW5kZXIoPDxTQ1NTKX0KKy5hIHsKKyAgQGZvciAkaSBmcm9tIDAuMCB0aHJvdWdoIDUuNSB7YjogJGl9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3BhcmVudF9zZWxlY3Rvcl9pbl9mdW5jdGlvbl9wc2V1ZG9fc2VsZWN0b3IKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuYmFyOm5vdCguZm9vKSB7CisgIGE6IGI7IH0KKworLnF1eDpudGgtY2hpbGQoMm4gb2YgLmJheiAuYmFuZykgeworICBjOiBkOyB9CitDU1MKKy5mb28geworICAuYmFyOm5vdCgmKSB7YTogYn0KK30KKworLmJheiAuYmFuZyB7CisgIC5xdXg6bnRoLWNoaWxkKDJuIG9mICYpIHtjOiBkfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9wYXJlbnRfc2VsZWN0b3JfaW5fYW5kX291dF9vZl9mdW5jdGlvbl9wc2V1ZG9fc2VsZWN0b3IKKyAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL3Nhc3Mvc2Fzcy9pc3N1ZXMvMTQ2NCNpc3N1ZWNvbW1lbnQtNzAzNTIyODgKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmE6bm90KC5hLWIpIHsKKyAgeDogeTsgfQorQ1NTCisuYSB7CisgICY6bm90KCYtYikgeworICAgIHg6IHk7CisgIH0KK30KK1NDU1MKKworICAgIGFzc2VydF9lcXVhbCg8PENTUywgcmVuZGVyKDw8U0NTUykpCisuYTpudGgtY2hpbGQoMm4gb2YgLmEtYikgeworICB4OiB5OyB9CitDU1MKKy5hIHsKKyAgJjpudGgtY2hpbGQoMm4gb2YgJi1iKSB7CisgICAgeDogeTsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9hdHRyaWJ1dGVfc2VsZWN0b3JfaW5fc2VsZWN0b3JfcHNldWRvY2xhc3MKKyAgICAjIEV2ZW4gdGhvdWdoIHRoaXMgaXMgcGxhaW4gQ1NTLCBpdCBvbmx5IGZhaWxlZCB3aGVuIGdpdmVuIHRvIHRoZSBTQ1NTCisgICAgIyBwYXJzZXIuCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK1tocmVmXj0naHR0cDovLyddIHsKKyAgY29sb3I6IHJlZDsgfQorQ1NTCitbaHJlZl49J2h0dHA6Ly8nXSB7CisgIGNvbG9yOiByZWQ7Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3RvcF9sZXZlbF91bmtub3duX2RpcmVjdGl2ZV9pbl9hdF9yb290CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK0BmYmx0aHAgeworICBhOiBiOyB9CitDU1MKK0BhdC1yb290IHsKKyAgQGZibHRocCB7YTogYn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGFyZW50X3JlZl93aXRoX25ld2xpbmUKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorYS5jCissIGIuYyB7CisgIHg6IHk7IH0KK0NTUworYQorLCBiIHsmLmMge3g6IHl9fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9wYXJlbnRfcmVmX2luX25lc3RlZF9hdF9yb290CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKyN0ZXN0IHsKKyAgYm9yZGVyOiAwOyB9CisgICN0ZXN0OmhvdmVyIHsKKyAgICBkaXNwbGF5OiBub25lOyB9CitDU1MKK2EgeworICBAYXQtcm9vdCAjdGVzdCB7CisgICAgYm9yZGVyOiAwOworICAgICY6aG92ZXJ7CisgICAgICBkaXNwbGF5OiBub25lOworICAgIH0KKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9sb3VkX2NvbW1lbnRfaW5fY29tcHJlc3NlZF9tb2RlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKy8qISBmb28gKi8KK0NTUworLyohIGZvbyAqLworU0NTUworICBlbmQKKworICBkZWYgdGVzdF9wYXJzaW5nX2RlY2ltYWxzX2ZvbGxvd2VkX2J5X2NvbW1lbnRzX2RvZXNudF90YWtlX2ZvcmV2ZXIKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNDU1MpKQorLmZvbyB7CisgIHBhZGRpbmc6IDQuMjEwNTI2MzE1OCUgNC4yMTA1MjYzMTU4JSA1LjYzMTU3ODk0NzQlOyB9CitDU1MKKy5mb28geworICBwYWRkaW5nOiA0LjIxMDUyNjMxNTc4OTQ3JSA0LjIxMDUyNjMxNTc4OTQ3JSA1LjYzMTU3ODk0NzM2ODQyMSUgLyoqLworfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9wYXJzaW5nX21hbnlfbnVtYmVyc19kb2VzbnRfdGFrZV9mb3JldmVyCisgICAgdmFsdWVzID0gWyI4MCUgOTAlIl0gKiAxMDAwCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKKy5mb28geworICBwYWRkaW5nOiAje3ZhbHVlcy5qb2luKCcsICcpfTsgfQorQ1NTCisuZm9vIHsKKyAgcGFkZGluZzogI3t2YWx1ZXMuam9pbignLCAnKX07Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ltcG9ydF9jb21tZW50c19pbl9pbXBvcnRzCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK0BpbXBvcnQgdXJsKGZvby5jc3MpOworQGltcG9ydCB1cmwoYmFyLmNzcyk7CitAaW1wb3J0IHVybChiYXouY3NzKTsKK0NTUworQGltcG9ydCAiZm9vLmNzcyIsIC8vIHRoaXMgaXMgYSBjb21tZW50CisgICAgICAgICJiYXIuY3NzIiwgLyogdGhpcyBpcyBhbm90aGVyIGNvbW1lbnQgKi8KKyAgICAgICAgImJhei5jc3MiOyAvLyB0aGlzIGlzIGEgdGhpcmQgY29tbWVudAorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9yZWZlcmVuY2VfY29tYmluYXRvcl93aXRoX3BhcmVudF9yZWYKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpfQorYSAvZm9vLyBiIHsKKyAgYzogZDsgfQorQ1NTCithIHsmIC9mb28vIGIge2M6IGR9fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9yZWZlcmVuY2VfY29tYmluYXRvcl93YXJuaW5nCisgICAgYXNzZXJ0X3dhcm5pbmcoPDxXQVJOSU5HKSB7YXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKX0KK0RFUFJFQ0FUSU9OIFdBUk5JTkcgb24gbGluZSAxLCBjb2x1bW4gOCBvZiB0ZXN0X3JlZmVyZW5jZV9jb21iaW5hdG9yX3dhcm5pbmdfaW5saW5lLnNjc3M6CitUaGUgcmVmZXJlbmNlIGNvbWJpbmF0b3IgL2Zvby8gaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCitXQVJOSU5HCithIC9mb28vIGIgeworICBjOiBkOyB9CitDU1MKK2EgeyYgL2Zvby8gYiB7YzogZH19CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X25ld2xpbmVfc2VsZWN0b3JfcmVuZGVyZWRfbXVsdGlwbGVfdGltZXMKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCitmb3JtIGlucHV0LAorZm9ybSBzZWxlY3QgeworICBjb2xvcjogd2hpdGU7IH0KKworZm9ybSBpbnB1dCwKK2Zvcm0gc2VsZWN0IHsKKyAgY29sb3I6IHdoaXRlOyB9CitDU1MKK0Bmb3IgJGkgZnJvbSAxIHRocm91Z2ggMiB7CisgIGZvcm0geworICAgIGlucHV0LAorICAgIHNlbGVjdCB7CisgICAgICBjb2xvcjogd2hpdGU7CisgICAgfQorICB9Cit9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3Byb3BfbmFtZV9pbnRlcnBvbGF0aW9uX2FmdGVyX2h5cGhlbgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2EgeworICAtZm9vLWJhcjogYjsgfQorQ1NTCithIHsgLVwjeyJmb28ifS1iYXI6IGI7IH0KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3Rhcl9wbHVzX2FuZF9wYXJlbnQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisqICsgaHRtbCBmb28geworICBhOiBiOyB9CitDU1MKK2ZvbyB7KitodG1sICYge2E6IGJ9fQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF93ZWlyZF9hZGRlZF9zcGFjZQorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGJhcjogLW1vei1iaXA7IH0KK0NTUworJHZhbHVlIDogYmlwOworCitmb28geworICBiYXI6IC1tb3otXCN7JHZhbHVlfTsKK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl93aXRoX2JyYWNrZXRfb25fbmV4dF9saW5lCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorYS5mb28gYiB7CisgIGNvbG9yOiByZWQ7IH0KK0NTUworYS5cI3siZm9vIn0gYgore2NvbG9yOiByZWR9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dHJhX2NvbW1hX2luX21peGluX2FyZ2xpc3QKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCisuYmFyIHsKKyAgYmF6OiBiYXI7IH0KK0NTUworQG1peGluIGZvbygkYTEsKSB7CisgIGJhejogJGExOworfQorCisuYmFyIHsKKyAgQGluY2x1ZGUgZm9vKGJhciwgKTsKK30KK1NDU1MKKyAgZW5kCisKKworICBkZWYgdGVzdF9leHRyYV9jb21tYV9iZXR3ZWVuX3BhcmFtZXRlcnNfaW5fbWl4aW5fYXJnbGlzdAorICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKFNhc3M6OlN5bnRheEVycm9yLCAiSW52YWxpZCBDU1MgYWZ0ZXIgXCIuLi5uY2x1ZGUgZm9vKGJhcixcIjogZXhwZWN0ZWQgXCIpXCIsIHdhcyBcIiwgYmF6ICk7XCIiKSB7cmVuZGVyIDw8U0NTU30KK0BtaXhpbiBmb28oJGExLCAkYTIpIHsKKyAgYmF6OiAkYTE7CisgIGJlZjogJGEyOworfQorCisuYmFyIHsKKyAgQGluY2x1ZGUgZm9vKGJhciwsIGJheiApOworfQorU0NTUworICBlbmQKKworCisgIGRlZiB0ZXN0X2V4dHJhX2NvbW1hX2luX21peGluX2FyZ2xpc3RfZW5kaW5nX25lZWRzX2hhdmVfcGFyZW50aGVzZXNfYWZ0ZXIKKyAgICBhc3NlcnRfcmFpc2VfbWVzc2FnZShTYXNzOjpTeW50YXhFcnJvciwgIkludmFsaWQgQ1NTIGFmdGVyIFwiICAgIGJyaSxcIjogZXhwZWN0ZWQgXCIpXCIsIHdhcyBcIn07XCIiKSB7cmVuZGVyIDw8U0NTU30KK0BtaXhpbiBmb28oJGExLCAkYTIpIHsKKyAgYmF6OiAkYTE7CisgIGJhbDogJGEyOworfQorCisuYmFyIHsKKyAgQGluY2x1ZGUgZm9vKAorICAgIGJhciwKKyAgICBicmksCisgIH07Cit9CitTQ1NTCisgIGVuZAorCisKKworICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQordWwgbGkjZm9vIGEgc3Bhbi5sYWJlbCB7CisgIGZvbzogYmFyOyB9CitDU1MKKyRiYXIgOiAiI2ZvbyI7Cit1bCBsaVwjeyRiYXJ9IGEgc3Bhbi5sYWJlbCB7IGZvbzogYmFyOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX3dpdGhfa2V5d29yZF9hcmdzCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLm1peGVkIHsKKyAgcmVxdWlyZWQ6IGZvbzsKKyAgYXJnMTogZGVmYXVsdC12YWwxOworICBhcmcyOiBub24tZGVmYXVsdC12YWwyOyB9CitDU1MKK0BtaXhpbiBhLW1peGluKCRyZXF1aXJlZCwgJGFyZzE6IGRlZmF1bHQtdmFsMSwgJGFyZzI6IGRlZmF1bHQtdmFsMikgeworICByZXF1aXJlZDogJHJlcXVpcmVkOworICBhcmcxOiAkYXJnMTsKKyAgYXJnMjogJGFyZzI7Cit9CisubWl4ZWQgeyBAaW5jbHVkZSBhLW1peGluKGZvbywgJGFyZzI6IG5vbi1kZWZhdWx0LXZhbDIpOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2tleXdvcmRfYXJnX3Njb3BlCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLm1peGVkIHsKKyAgYXJnMTogZGVmYXVsdDsKKyAgYXJnMjogbm9uLWRlZmF1bHQ7IH0KK0NTUworJGFyZzE6IGRlZmF1bHQ7CiskYXJnMjogZGVmYXVsdDsKK0BtaXhpbiBhLW1peGluKCRhcmcxOiAkYXJnMSwgJGFyZzI6ICRhcmcyKSB7CisgIGFyZzE6ICRhcmcxOworICBhcmcyOiAkYXJnMjsKK30KKy5taXhlZCB7IEBpbmNsdWRlIGEtbWl4aW4oJGFyZzI6IG5vbi1kZWZhdWx0KTsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9wYXNzaW5nX3JlcXVpcmVkX2FyZ3NfYXNfYV9rZXl3b3JkX2FyZworICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5taXhlZCB7CisgIHJlcXVpcmVkOiBmb287CisgIGFyZzE6IGRlZmF1bHQtdmFsMTsKKyAgYXJnMjogZGVmYXVsdC12YWwyOyB9CitDU1MKK0BtaXhpbiBhLW1peGluKCRyZXF1aXJlZCwgJGFyZzE6IGRlZmF1bHQtdmFsMSwgJGFyZzI6IGRlZmF1bHQtdmFsMikgeworICByZXF1aXJlZDogJHJlcXVpcmVkOworICBhcmcxOiAkYXJnMTsKKyAgYXJnMjogJGFyZzI7IH0KKy5taXhlZCB7IEBpbmNsdWRlIGEtbWl4aW4oJHJlcXVpcmVkOiBmb28pOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3Bhc3NpbmdfYWxsX2FzX2tleXdvcmRfYXJnc19pbl9vcHBvc2l0ZV9vcmRlcgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKKy5taXhlZCB7CisgIHJlcXVpcmVkOiBmb287CisgIGFyZzE6IG5vbi1kZWZhdWx0LXZhbDE7CisgIGFyZzI6IG5vbi1kZWZhdWx0LXZhbDI7IH0KK0NTUworQG1peGluIGEtbWl4aW4oJHJlcXVpcmVkLCAkYXJnMTogZGVmYXVsdC12YWwxLCAkYXJnMjogZGVmYXVsdC12YWwyKSB7CisgIHJlcXVpcmVkOiAkcmVxdWlyZWQ7CisgIGFyZzE6ICRhcmcxOworICBhcmcyOiAkYXJnMjsgfQorLm1peGVkIHsgQGluY2x1ZGUgYS1taXhpbigkYXJnMjogbm9uLWRlZmF1bHQtdmFsMiwgJGFyZzE6IG5vbi1kZWZhdWx0LXZhbDEsICRyZXF1aXJlZDogZm9vKTsgfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3NfaW5fZnVuY3Rpb25zCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTKQorLmtleWVkIHsKKyAgY29sb3I6IHJnYmEoMTcwLCAxMTksIDIwNCwgMC40KTsgfQorQ1NTCisua2V5ZWQgeyBjb2xvcjogcmdiYSgkY29sb3I6ICNhN2MsICRhbHBoYTogMC40KSB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3Vua25vd25fa2V5d29yZF9hcmdfcmFpc2VzX2Vycm9yCisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoU2Fzczo6U3ludGF4RXJyb3IsICJNaXhpbiBhIGRvZXNuJ3QgaGF2ZSBhbiBhcmd1bWVudCBuYW1lZCAkYy4iKSB7cmVuZGVyIDw8U0NTU30KK0BtaXhpbiBhKCRiOiAxKSB7IGE6ICRiOyB9CitkaXYgeyBAaW5jbHVkZSBhKDEsICRjOiAzKTsgfQorU0NTUworICBlbmQKKworCisgIGRlZiB0ZXN0X25ld2xpbmVzX3JlbW92ZWRfZnJvbV9zZWxlY3RvcnNfd2hlbl9jb21wcmVzc2VkCisgICAgYXNzZXJ0X2VxdWFsIDw8Q1NTLCByZW5kZXIoPDxTQ1NTLCA6c3R5bGUgPT4gOmNvbXByZXNzZWQpCit6IGEseiBie2Rpc3BsYXk6YmxvY2t9CitDU1MKK2EKKywgYiB7CisgIHogJiB7CisgICAgZGlzcGxheTogYmxvY2s7CisgIH0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWZfZXJyb3JfbGluZQorICAgIGFzc2VydF9yYWlzZV9saW5lKDIpIHtyZW5kZXIoPDxTQ1NTKX0KK0BpZiB0cnVlIHtmb286IGJhcn0KK30KK1NDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlsaW5lX3ZhcgorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUykKK2ZvbyB7CisgIGE6IDM7CisgIGI6IGZhbHNlOworICBjOiBhIGIgYzsgfQorQ1NTCitmb28geworICAkdmFyMTogMSArCisgICAgMjsKKyAgJHZhcjI6IHRydWUgYW5kCisgICAgZmFsc2U7CisgICR2YXIzOiBhIGIKKyAgICBjOworICBhOiAkdmFyMTsKKyAgYjogJHZhcjI7CisgIGM6ICR2YXIzOyB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X21peGluX2NvbnRlbnQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNBU1MpCisucGFyZW50IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmVkOworICBib3JkZXItY29sb3I6IHJlZDsgfQorICAucGFyZW50IC5jaGlsZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OworICAgIGNvbG9yOiBibHVlOworICAgIGJvcmRlci1jb2xvcjogeWVsbG93OyB9CitDU1MKKyRjb2xvcjogYmx1ZTsKK0BtaXhpbiBjb250ZXh0KCRjbGFzcywgJGNvbG9yOiByZWQpIHsKKyAgLlwjeyRjbGFzc30geworICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjsKKyAgICBAY29udGVudDsKKyAgICBib3JkZXItY29sb3I6ICRjb2xvcjsKKyAgfQorfQorQGluY2x1ZGUgY29udGV4dChwYXJlbnQpIHsKKyAgQGluY2x1ZGUgY29udGV4dChjaGlsZCwgJGNvbG9yOiB5ZWxsb3cpIHsKKyAgICBjb2xvcjogJGNvbG9yOworICB9Cit9CitTQVNTCisgIGVuZAorCisgIGRlZiB0ZXN0X2VtcHR5X2NvbnRlbnQKKyAgICBhc3NlcnRfZXF1YWwgPDxDU1MsIHJlbmRlcig8PFNDU1MpCithIHsKKyAgYjogYzsgfQorQ1NTCitAbWl4aW4gZm9vIHsgQGNvbnRlbnQgfQorYSB7IGI6IGM7IEBpbmNsdWRlIGZvbyB7fSB9CitTQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X29wdGlvbnNfcGFzc2VkX3RvX3NjcmlwdAorICAgIGFzc2VydF9lcXVhbCA8PENTUywgcmVuZGVyKDw8U0NTUywgOnN0eWxlID0+IDpjb21wcmVzc2VkKQorZm9ve2NvbG9yOiMwMDB9CitDU1MKK2ZvbyB7Y29sb3I6IGRhcmtlbihibGFjaywgMTAlKX0KK1NDU1MKKyAgZW5kCisKKyAgIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9uZXgzL3Nhc3MvaXNzdWVzLzEwNAorICBkZWYgdGVzdF9ub19idWZmZXJfb3ZlcmZsb3cKKyAgICB0ZW1wbGF0ZSA9IHJlbmRlciA8PFNDU1MKKy5hYWEgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKK30KKy5hYWEgLmFhYSAuYWFhIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Cit9CisuYmJiIHsKKyAgQGV4dGVuZCAuYWFhOworfQorLnh4eCB7CisgIEBleHRlbmQgLmJiYjsKK30KKy55eXkgeworICBAZXh0ZW5kIC5iYmI7Cit9Cisuenp6IHsKKyAgQGV4dGVuZCAuYmJiOworfQorU0NTUworICAgIFNhc3M6OlNDU1M6OlBhcnNlci5uZXcodGVtcGxhdGUsICJ0ZXN0LnNjc3MiLCBuaWwpLnBhcnNlCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9pbl9tZWRpYV9pbl9ydWxlCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK0BtZWRpYSBzY3JlZW4geworICAuZm9vIHsKKyAgICBhOiBiOyB9IH0KK0NTUworLmZvbyB7CisgIEBtZWRpYSBzY3JlZW4geworICAgIEBleHRlbmQgJWJhcjsKKyAgfQorfQorCitAbWVkaWEgc2NyZWVuIHsKKyAgJWJhciB7CisgICAgYTogYjsKKyAgfQorfQorU0NTUworICBlbmQKKworICBkZWYgdGVzdF9pbXBvcnRfd2l0aF9zdXBwb3J0c19jbGF1c2VfaW50ZXJwCisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDwnU0FTUycsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCitAaW1wb3J0IHVybCgiZmFsbGJhY2stbGF5b3V0LmNzcyIpIHN1cHBvcnRzKG5vdCAoZGlzcGxheTogZmxleCkpCitDU1MKKyRkaXNwbGF5LXR5cGU6IGZsZXg7CitAaW1wb3J0IHVybCgiZmFsbGJhY2stbGF5b3V0LmNzcyIpIHN1cHBvcnRzKG5vdCAoZGlzcGxheTogI3skZGlzcGxheS10eXBlfSkpOworU0FTUworICBlbmQKKworICBkZWYgdGVzdF9pbXBvcnRfd2l0aF9zdXBwb3J0c19jbGF1c2UKKyAgICBhc3NlcnRfZXF1YWwoPDxDU1MsIHJlbmRlcig8PFNBU1MsIDpzdHlsZSA9PiA6Y29tcHJlc3NlZCkpCitAaW1wb3J0IHVybCgiZmFsbGJhY2stbGF5b3V0LmNzcyIpIHN1cHBvcnRzKG5vdCAoZGlzcGxheTogZmxleCkpOy5mb297YmFyOmJhen0KK0NTUworQGltcG9ydCB1cmwoImZhbGxiYWNrLWxheW91dC5jc3MiKSBzdXBwb3J0cyhub3QgKGRpc3BsYXk6IGZsZXgpKTsKKy5mb28geyBiYXI6IGJhejsgfQorU0FTUworICBlbmQKKworICBkZWYgdGVzdF9jcmxmCisgICAgIyBBdHRlbXB0IHRvIHJlcHJvZHVjZSBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9zYXNzL2lzc3Vlcy8xOTg1CisgICAgYXNzZXJ0X2VxdWFsKDw8Q1NTLCByZW5kZXIoPDxTQ1NTKSkKK3AgeworICBtYXJnaW46IDA7IH0KK0NTUworcCB7XHJcbiAgIG1hcmdpbjogMDtcclxufQorU0NTUworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9zY3NzL3Rlc3RfaGVscGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc2Nzcy90ZXN0X2hlbHBlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWUxNzdkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc2Nzcy90ZXN0X2hlbHBlci5yYgpAQCAtMCwwICsxLDM3IEBACityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uLy4uL3Rlc3RfaGVscGVyJworcmVxdWlyZSAnc2Fzcy9lbmdpbmUnCisKK21vZHVsZSBTY3NzVGVzdEhlbHBlcgorICBkZWYgYXNzZXJ0X3BhcnNlcyhzY3NzKQorICAgIGFzc2VydF9lcXVhbCBzY3NzLnJzdHJpcCwgcmVuZGVyKHNjc3MpLnJzdHJpcAorICBlbmQKKworICBkZWYgYXNzZXJ0X25vdF9wYXJzZXMoZXhwZWN0ZWQsIHNjc3MpCisgICAgcmFpc2UgIlRlbXBsYXRlIG11c3QgaW5jbHVkZSA8ZXJyPiB3aGVyZSBhbiBlcnJvciBpcyBleHBlY3RlZCIgdW5sZXNzIHNjc3MuaW5jbHVkZT8oIjxlcnI+IikKKworICAgIGFmdGVyLCB3YXMgPSBzY3NzLnNwbGl0KCI8ZXJyPiIpCisgICAgbGluZSA9IGFmdGVyLmNvdW50KCJcbiIpICsgMQorCisgICAgYWZ0ZXIuZ3N1YiEoL1xzKlxuXHMqJC8sICcnKQorICAgIGFmdGVyLmdzdWIhKC8uKlxuLywgJycpCisgICAgYWZ0ZXIgPSAiLi4uIiArIGFmdGVyWy0xNS4uLTFdIGlmIGFmdGVyLnNpemUgPiAxOAorCisgICAgd2FzLmdzdWIhKC9eXHMqXG5ccyovLCAnJykKKyAgICB3YXMuZ3N1YiEoL1xuLiovLCAnJykKKyAgICB3YXMgPSB3YXNbMC4uLjE1XSArICIuLi4iIGlmIHdhcy5zaXplID4gMTgKKworICAgIHRvX3JlbmRlciA9IHNjc3Muc3ViKCI8ZXJyPiIsICIiKQorICAgIHJlbmRlcih0b19yZW5kZXIpCisgICAgYXNzZXJ0KGZhbHNlLCAiRXhwZWN0ZWQgc3ludGF4IGVycm9yIGZvcjpcbiN7dG9fcmVuZGVyfVxuIikKKyAgcmVzY3VlIFNhc3M6OlN5bnRheEVycm9yID0+IGVycgorICAgIGFzc2VydF9lcXVhbCgiSW52YWxpZCBDU1MgYWZ0ZXIgXCIje2FmdGVyfVwiOiBleHBlY3RlZCAje2V4cGVjdGVkfSwgd2FzIFwiI3t3YXN9XCIiLAorICAgICAgZXJyLm1lc3NhZ2UpCisgICAgYXNzZXJ0X2VxdWFsIGxpbmUsIGVyci5zYXNzX2xpbmUKKyAgZW5kCisKKyAgZGVmIHJlbmRlcihzY3NzLCBvcHRpb25zID0ge30pCisgICAgb3B0aW9uc1s6c3ludGF4XSB8fD0gOnNjc3MKKyAgICBtdW5nZV9maWxlbmFtZSBvcHRpb25zCisgICAgU2Fzczo6RW5naW5lLm5ldyhzY3NzLCBvcHRpb25zKS5yZW5kZXIKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3NvdXJjZV9tYXBfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3NvdXJjZV9tYXBfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MTJiZmEyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc291cmNlX21hcF90ZXN0LnJiCkBAIC0wLDAgKzEsMTA1MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vdGVzdF9oZWxwZXInCityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3Rlc3RfaGVscGVyJworCitjbGFzcyBTb3VyY2VtYXBUZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgZGVmIHRlc3RfdG9fanNvbl9yZXF1aXJlc19hcmdzCisgICAgXywgc291cmNlbWFwID0gcmVuZGVyX3dpdGhfc291cmNlbWFwKCcnKQorICAgIGFzc2VydF9yYWlzZXMoQXJndW1lbnRFcnJvcikge3NvdXJjZW1hcC50b19qc29uKHt9KX0KKyAgICBhc3NlcnRfcmFpc2VzKEFyZ3VtZW50RXJyb3IpIHtzb3VyY2VtYXAudG9fanNvbih7OmNzc19wYXRoID0+ICdmb28nfSl9CisgICAgYXNzZXJ0X3JhaXNlcyhBcmd1bWVudEVycm9yKSB7c291cmNlbWFwLnRvX2pzb24oezpzb3VyY2VtYXBfcGF0aCA9PiAnZm9vJ30pfQorICBlbmQKKworICBkZWYgdGVzdF9zaW1wbGVfbWFwcGluZ19zY3NzCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX3NvdXJjZW1hcCA8PFNDU1MsIDw8Q1NTLCA8PEpTT04KK2EgeworICBmb286IGJhcjsKKy8qIFNPTUUgQ09NTUVOVCAqLworICBmb250LXNpemU6IDEycHg7Cit9CitTQ1NTCithIHsKKyAgZm9vOiBiYXI7CisgIC8qIFNPTUUgQ09NTUVOVCAqLworICBmb250LXNpemU6IDEycHg7IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKK3sKKyJ2ZXJzaW9uIjogMywKKyJtYXBwaW5ncyI6ICJBQUFBLENBQUU7RUFDQSxHQUFHLEVBQUUsR0FBRztFQUNWLGtCQUFrQjtFQUNoQixTQUFTLEVBQUUsSUFBSSIsCisic291cmNlcyI6IFsidGVzdF9zaW1wbGVfbWFwcGluZ19zY3NzX2lubGluZS5zY3NzIl0sCisibmFtZXMiOiBbXSwKKyJmaWxlIjogInRlc3QuY3NzIgorfQorSlNPTgorICBlbmQKKworICBkZWYgdGVzdF9zaW1wbGVfbWFwcGluZ19zYXNzCisgICAgc2lsZW5jZV93YXJuaW5ncyB7YXNzZXJ0X3BhcnNlc193aXRoX3NvdXJjZW1hcCA8PFNBU1MsIDw8Q1NTLCA8PEpTT04sIDpzeW50YXggPT4gOnNhc3N9CithCisgIGZvbzogYmFyCisgIC8qIFNPTUUgQ09NTUVOVCAqLworICA6Zm9udC1zaXplIDEycHgKK1NBU1MKK2EgeworICBmb286IGJhcjsKKyAgLyogU09NRSBDT01NRU5UICovCisgIGZvbnQtc2l6ZTogMTJweDsgfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworeworInZlcnNpb24iOiAzLAorIm1hcHBpbmdzIjogIkFBQUEsQ0FBQztFQUNDLEdBQUcsRUFBRSxHQUFHOztFQUVQLFNBQVMsRUFBQyxJQUFJIiwKKyJzb3VyY2VzIjogWyJ0ZXN0X3NpbXBsZV9tYXBwaW5nX3Nhc3NfaW5saW5lLnNhc3MiXSwKKyJuYW1lcyI6IFtdLAorImZpbGUiOiAidGVzdC5jc3MiCit9CitKU09OCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpbXBsZV9tYXBwaW5nX3dpdGhfZmlsZV91cmlzCisgICAgdXJpID0gU2Fzczo6VXRpbC5maWxlX3VyaV9mcm9tX3BhdGgoRmlsZS5hYnNvbHV0ZV9wYXRoKGZpbGVuYW1lX2Zvcl90ZXN0KDpzY3NzKSkpCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX3NvdXJjZW1hcCA8PFNDU1MsIDw8Q1NTLCA8PEpTT04sIDpzb3VyY2VtYXAgPT4gOmZpbGUKK2EgeworICBmb286IGJhcjsKKy8qIFNPTUUgQ09NTUVOVCAqLworICBmb250LXNpemU6IDEycHg7Cit9CitTQ1NTCithIHsKKyAgZm9vOiBiYXI7CisgIC8qIFNPTUUgQ09NTUVOVCAqLworICBmb250LXNpemU6IDEycHg7IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKK3sKKyJ2ZXJzaW9uIjogMywKKyJtYXBwaW5ncyI6ICJBQUFBLENBQUU7RUFDQSxHQUFHLEVBQUUsR0FBRztFQUNWLGtCQUFrQjtFQUNoQixTQUFTLEVBQUUsSUFBSSIsCisic291cmNlcyI6IFsiI3t1cml9Il0sCisibmFtZXMiOiBbXSwKKyJmaWxlIjogInRlc3QuY3NzIgorfQorSlNPTgorICBlbmQKKworICBkZWYgdGVzdF9tYXBwaW5nX3dpdGhfZGlyZWN0b3J5X3Njc3MKKyAgICBvcHRpb25zID0gezpmaWxlbmFtZSA9PiAic2Nzcy9zdHlsZS5zY3NzIiwgOm91dHB1dCA9PiAiY3NzL3N0eWxlLmNzcyJ9CisgICAgYXNzZXJ0X3BhcnNlc193aXRoX3NvdXJjZW1hcCA8PFNDU1MsIDw8Q1NTLCA8PEpTT04sIG9wdGlvbnMKK2EgeworICBmb286IGJhcjsKKy8qIFNPTUUgQ09NTUVOVCAqLworICBmb250LXNpemU6IDEycHg7Cit9CitTQ1NTCithIHsKKyAgZm9vOiBiYXI7CisgIC8qIFNPTUUgQ09NTUVOVCAqLworICBmb250LXNpemU6IDEycHg7IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9c3R5bGUuY3NzLm1hcCAqLworQ1NTCit7CisidmVyc2lvbiI6IDMsCisibWFwcGluZ3MiOiAiQUFBQSxDQUFFO0VBQ0EsR0FBRyxFQUFFLEdBQUc7RUFDVixrQkFBa0I7RUFDaEIsU0FBUyxFQUFFLElBQUkiLAorInNvdXJjZXMiOiBbIi4uL3Njc3Mvc3R5bGUuc2NzcyJdLAorIm5hbWVzIjogW10sCisiZmlsZSI6ICJzdHlsZS5jc3MiCit9CitKU09OCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcHBpbmdfd2l0aF9kaXJlY3Rvcnlfc2FzcworICAgIG9wdGlvbnMgPSB7OmZpbGVuYW1lID0+ICJzYXNzL3N0eWxlLnNhc3MiLCA6b3V0cHV0ID0+ICJjc3Mvc3R5bGUuY3NzIiwgOnN5bnRheCA9PiA6c2Fzc30KKyAgICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfcGFyc2VzX3dpdGhfc291cmNlbWFwIDw8U0FTUywgPDxDU1MsIDw8SlNPTiwgb3B0aW9uc30KK2EKKyAgZm9vOiBiYXIKKyAgLyogU09NRSBDT01NRU5UICovCisgIDpmb250LXNpemUgMTJweAorU0FTUworYSB7CisgIGZvbzogYmFyOworICAvKiBTT01FIENPTU1FTlQgKi8KKyAgZm9udC1zaXplOiAxMnB4OyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxlLmNzcy5tYXAgKi8KK0NTUworeworInZlcnNpb24iOiAzLAorIm1hcHBpbmdzIjogIkFBQUEsQ0FBQztFQUNDLEdBQUcsRUFBRSxHQUFHOztFQUVQLFNBQVMsRUFBQyxJQUFJIiwKKyJzb3VyY2VzIjogWyIuLi9zYXNzL3N0eWxlLnNhc3MiXSwKKyJuYW1lcyI6IFtdLAorImZpbGUiOiAic3R5bGUuY3NzIgorfQorSlNPTgorICBlbmQKKworICBkZWYgdGVzdF9zaW1wbGVfY2hhcnNldF9tYXBwaW5nX3Njc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfc291cmNlbWFwIDw8U0NTUywgPDxDU1MsIDw8SlNPTgorYSB7CisgIGbDs8OzOiBiw6FyOworfQorU0NTUworQGNoYXJzZXQgIlVURi04IjsKK2EgeworICBmw7PDszogYsOhcjsgfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworeworInZlcnNpb24iOiAzLAorIm1hcHBpbmdzIjogIjtBQUFBLENBQUU7RUFDQSxHQUFHLEVBQUUsR0FBRyIsCisic291cmNlcyI6IFsidGVzdF9zaW1wbGVfY2hhcnNldF9tYXBwaW5nX3Njc3NfaW5saW5lLnNjc3MiXSwKKyJuYW1lcyI6IFtdLAorImZpbGUiOiAidGVzdC5jc3MiCit9CitKU09OCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpbXBsZV9jaGFyc2V0X21hcHBpbmdfc2FzcworICAgIGFzc2VydF9wYXJzZXNfd2l0aF9zb3VyY2VtYXAgPDxTQVNTLCA8PENTUywgPDxKU09OLCA6c3ludGF4ID0+IDpzYXNzCithCisgIGbDs8OzOiBiw6FyCitTQVNTCitAY2hhcnNldCAiVVRGLTgiOworYSB7CisgIGbDs8OzOiBiw6FyOyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCit7CisidmVyc2lvbiI6IDMsCisibWFwcGluZ3MiOiAiO0FBQUEsQ0FBQztFQUNDLEdBQUcsRUFBRSxHQUFHIiwKKyJzb3VyY2VzIjogWyJ0ZXN0X3NpbXBsZV9jaGFyc2V0X21hcHBpbmdfc2Fzc19pbmxpbmUuc2FzcyJdLAorIm5hbWVzIjogW10sCisiZmlsZSI6ICJ0ZXN0LmNzcyIKK30KK0pTT04KKyAgZW5kCisKKyAgZGVmIHRlc3RfZGlmZmVyZW50X2NoYXJzZXRfdGhhbl9lbmNvZGluZ19zY3NzCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX3NvdXJjZW1hcCg8PFNDU1MuZm9yY2VfZW5jb2RpbmcoIklCTTg2NiIpLCA8PENTUywgPDxKU09OKQorQGNoYXJzZXQgIklCTTg2NiI7CitmXHg4Nlx4ODYgeworICBceDg2OiBiOworfQorU0NTUworQGNoYXJzZXQgIlVURi04IjsKK2bQltCWIHsKKyAg0JY6IGI7IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKK3sKKyJ2ZXJzaW9uIjogMywKKyJtYXBwaW5ncyI6ICI7QUFDQSxHQUFJO0VBQ0YsQ0FBQyxFQUFFLENBQUMiLAorInNvdXJjZXMiOiBbInRlc3RfZGlmZmVyZW50X2NoYXJzZXRfdGhhbl9lbmNvZGluZ19zY3NzX2lubGluZS5zY3NzIl0sCisibmFtZXMiOiBbXSwKKyJmaWxlIjogInRlc3QuY3NzIgorfQorSlNPTgorICBlbmQKKworICBkZWYgdGVzdF9kaWZmZXJlbnRfY2hhcnNldF90aGFuX2VuY29kaW5nX3Nhc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfc291cmNlbWFwKDw8U0FTUy5mb3JjZV9lbmNvZGluZygiSUJNODY2IiksIDw8Q1NTLCA8PEpTT04sIDpzeW50YXggPT4gOnNhc3MpCitAY2hhcnNldCAiSUJNODY2IgorZlx4ODZceDg2CisgIFx4ODY6IGIKK1NBU1MKK0BjaGFyc2V0ICJVVEYtOCI7Citm0JbQliB7CisgINCWOiBiOyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCit7CisidmVyc2lvbiI6IDMsCisibWFwcGluZ3MiOiAiO0FBQ0EsR0FBRztFQUNELENBQUMsRUFBRSxDQUFDIiwKKyJzb3VyY2VzIjogWyJ0ZXN0X2RpZmZlcmVudF9jaGFyc2V0X3RoYW5fZW5jb2Rpbmdfc2Fzc19pbmxpbmUuc2FzcyJdLAorIm5hbWVzIjogW10sCisiZmlsZSI6ICJ0ZXN0LmNzcyIKK30KK0pTT04KKyAgZW5kCisKKyAgZGVmIHRlc3RfaW1wb3J0X3NvdXJjZW1hcF9zY3NzCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX21hcHBpbmcgPDwnU0NTUycsIDw8J0NTUycKK0BpbXBvcnQge3sxfX11cmwoZm9vKXt7LzF9fSx7ezJ9fXVybChtb28pICAge3svMn19LCAgICAgICB7ezN9fXVybChiYXIpIHt7LzN9fTsKK0BpbXBvcnQge3s0fX11cmwoYmF6KSBzY3JlZW4gcHJpbnR7ey80fX07CitTQ1NTCit7ezF9fUBpbXBvcnQgdXJsKGZvbyl7ey8xfX07Cit7ezJ9fUBpbXBvcnQgdXJsKG1vbyl7ey8yfX07Cit7ezN9fUBpbXBvcnQgdXJsKGJhcil7ey8zfX07Cit7ezR9fUBpbXBvcnQgdXJsKGJheikgc2NyZWVuIHByaW50e3svNH19OworCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9pbXBvcnRfc291cmNlbWFwX3Nhc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQVNTJywgPDwnQ1NTJywgOnN5bnRheCA9PiA6c2FzcworQGltcG9ydCB7ezF9fWZvby5jc3N7ey8xfX0se3syfX1tb28uY3Nze3svMn19LCAgICAgIHt7M319YmFyLmNzc3t7LzN9fQorQGltcG9ydCB7ezR9fXVybChiYXouY3NzKXt7LzR9fQorQGltcG9ydCB7ezV9fXVybChxdXguY3NzKSBzY3JlZW4gcHJpbnR7ey81fX0KK1NBU1MKK3t7MX19QGltcG9ydCB1cmwoZm9vLmNzcyl7ey8xfX07Cit7ezJ9fUBpbXBvcnQgdXJsKG1vby5jc3Mpe3svMn19Owore3szfX1AaW1wb3J0IHVybChiYXIuY3NzKXt7LzN9fTsKK3t7NH19QGltcG9ydCB1cmwoYmF6LmNzcyl7ey80fX07Cit7ezV9fUBpbXBvcnQgdXJsKHF1eC5jc3MpIHNjcmVlbiBwcmludHt7LzV9fTsKKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWVkaWFfc291cmNlbWFwX3Njc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQ1NTJywgPDwnQ1NTJwore3sxfX1AbWVkaWEgc2NyZWVuLCB0diAge3svMX19eworICB7ezJ9fWJvZHkge3svMn19eworICAgIHt7M319bWF4LXdpZHRoe3svM319OiB7ezR9fTEwNzBweHt7LzR9fTsKKyAgfQorfQorU0NTUwore3sxfX1AbWVkaWEgc2NyZWVuLCB0dnt7LzF9fSB7CisgIHt7Mn19Ym9keXt7LzJ9fSB7CisgICAge3szfX1tYXgtd2lkdGh7ey8zfX06IHt7NH19MTA3MHB4e3svNH19OyB9IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWVkaWFfc291cmNlbWFwX3Nhc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQVNTJywgPDwnQ1NTJywgOnN5bnRheCA9PiA6c2Fzcwore3sxfX1AbWVkaWEgc2NyZWVuLCB0dnt7LzF9fQorICB7ezJ9fWJvZHl7ey8yfX0KKyAgICB7ezN9fW1heC13aWR0aHt7LzN9fToge3s0fX0xMDcwcHh7ey80fX0KK1NBU1MKK3t7MX19QG1lZGlhIHNjcmVlbiwgdHZ7ey8xfX0geworICB7ezJ9fWJvZHl7ey8yfX0geworICAgIHt7M319bWF4LXdpZHRoe3svM319OiB7ezR9fTEwNzBweHt7LzR9fTsgfSB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25fYW5kX3ZhcnNfc291cmNlbWFwX3Njc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQ1NTJywgPDwnQ1NTJworJHRlOiAidGUiOworJHRlYWw6IHt7NX19dGVhbHt7LzV9fTsKK3t7MX19cCB7ey8xfX17CisgIHt7Mn19Y29uI3skdGV9bnR7ey8yfX06IHt7M319IkkgYSN7JHRlfSAjezUgKyAxMH0gcGllcyEie3svM319OworICB7ezR9fWNvbG9ye3svNH19OiAkdGVhbDsKK30KKworJG5hbWU6IGZvbzsKKyRhdHRyOiBib3JkZXI7Cit7ezZ9fXAuI3skbmFtZX0ge3svNn19eworICB7ezd9fSN7JGF0dHJ9LWNvbG9ye3svN319OiB7ezh9fWJsdWV7ey84fX07CisgICRmb250LXNpemU6IDEycHg7CisgICRsaW5lLWhlaWdodDogMzBweDsKKyAge3s5fX1mb250e3svOX19OiB7ezEwfX0jeyRmb250LXNpemV9LyN7JGxpbmUtaGVpZ2h0fXt7LzEwfX07Cit9CitTQ1NTCit7ezF9fXB7ey8xfX0geworICB7ezJ9fWNvbnRlbnR7ey8yfX06IHt7M319IkkgYXRlIDE1IHBpZXMhInt7LzN9fTsKKyAge3s0fX1jb2xvcnt7LzR9fToge3s1fX10ZWFse3svNX19OyB9CisKK3t7Nn19cC5mb297ey82fX0geworICB7ezd9fWJvcmRlci1jb2xvcnt7Lzd9fToge3s4fX1ibHVle3svOH19OworICB7ezl9fWZvbnR7ey85fX06IHt7MTB9fTEycHgvMzBweHt7LzEwfX07IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl9hbmRfdmFyc19zb3VyY2VtYXBfc2FzcworICAgIGFzc2VydF9wYXJzZXNfd2l0aF9tYXBwaW5nIDw8J1NBU1MnLCA8PCdDU1MnLCA6c3ludGF4ID0+IDpzYXNzCiskdGU6ICJ0ZSIKKyR0ZWFsOiB7ezV9fXRlYWx7ey81fX0KK3t7MX19cHt7LzF9fQorICB7ezJ9fWNvbiN7JHRlfW50e3svMn19OiB7ezN9fSJJIGEjeyR0ZX0gI3s1ICsgMTB9IHBpZXMhInt7LzN9fQorICB7ezR9fWNvbG9ye3svNH19OiAkdGVhbAorCiskbmFtZTogZm9vCiskYXR0cjogYm9yZGVyCit7ezZ9fXAuI3skbmFtZX17ey82fX0KKyAge3s3fX0jeyRhdHRyfS1jb2xvcnt7Lzd9fToge3s4fX1ibHVle3svOH19CisgICRmb250LXNpemU6IDEycHgKKyAgJGxpbmUtaGVpZ2h0OiAzMHB4CisgIHt7OX19Zm9udHt7Lzl9fToge3sxMH19I3skZm9udC1zaXplfS8jeyRsaW5lLWhlaWdodH17ey8xMH19CitTQVNTCit7ezF9fXB7ey8xfX0geworICB7ezJ9fWNvbnRlbnR7ey8yfX06IHt7M319IkkgYXRlIDE1IHBpZXMhInt7LzN9fTsKKyAge3s0fX1jb2xvcnt7LzR9fToge3s1fX10ZWFse3svNX19OyB9CisKK3t7Nn19cC5mb297ey82fX0geworICB7ezd9fWJvcmRlci1jb2xvcnt7Lzd9fToge3s4fX1ibHVle3svOH19OworICB7ezl9fWZvbnR7ey85fX06IHt7MTB9fTEycHgvMzBweHt7LzEwfX07IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JzX3Byb3BlcnRpZXNfc291cmNlbWFwX3Njc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQ1NTJywgPDwnQ1NTJworJHdpZHRoOiAycHg7CiskdHJhbnNsdWNlbnQtcmVkOiByZ2JhKDI1NSwgMCwgMCwgMC41KTsKK3t7MX19YSB7ey8xfX17CisgIHt7OX19LnNwZWNpYWwge3svOX19eworICAgIHt7MTB9fWNvbG9ye3svMTB9fToge3sxMX19cmVke3svMTF9fTsKKyAgICB7ezEyfX0mOmhvdmVyIHt7LzEyfX17CisgICAgICB7ezEzfX1mb297ey8xM319OiB7ezE0fX1iYXJ7ey8xNH19OworICAgICAge3sxNX19Y3Vyc29ye3svMTV9fToge3sxNn19ZSArIC1yZXNpemV7ey8xNn19OworICAgICAge3sxN319Y29sb3J7ey8xN319OiB7ezE4fX1vcGFjaWZ5KCR0cmFuc2x1Y2VudC1yZWQsIDAuMyl7ey8xOH19OworICAgIH0KKyAgICB7ezE5fX0mOmFmdGVyIHt7LzE5fX17CisgICAgICB7ezIwfX1jb250ZW50e3svMjB9fToge3syMX19IkkgYXRlICN7NSArIDEwfSBwaWVzICN7JHdpZHRofSB0aGljayEie3svMjF9fTsKKyAgICB9CisgIH0KKyAge3syMn19JjphY3RpdmUge3svMjJ9fXsKKyAgICB7ezIzfX1ib3JkZXJ7ey8yM319OiB7ezI0fX0kd2lkdGggc29saWQgYmxhY2t7ey8yNH19OworICB9Cit7ezJ9fS8qIFNPTUUgQ09NTUVOVCAqL3t7LzJ9fQorICB7ezN9fWZvbnR7ey8zfX06IHt7NH19MnB4LzNweCB7ey80fX17CisgICAge3s1fX1mYW1pbHl7ey81fX06IHt7Nn19ZmFudGFzeXt7LzZ9fTsKKyAgICB7ezd9fXNpemV7ey83fX06IHt7OH19MWVtICsgKDJlbSAqIDMpe3svOH19OworICB9Cit9CitTQ1NTCit7ezF9fWF7ey8xfX0geworICB7ezJ9fS8qIFNPTUUgQ09NTUVOVCAqL3t7LzJ9fQorICB7ezN9fWZvbnR7ey8zfX06IHt7NH19MnB4LzNweHt7LzR9fTsKKyAgICB7ezV9fWZvbnQtZmFtaWx5e3svNX19OiB7ezZ9fWZhbnRhc3l7ey82fX07CisgICAge3s3fX1mb250LXNpemV7ey83fX06IHt7OH19N2Vte3svOH19OyB9CisgIHt7OX19YSAuc3BlY2lhbHt7Lzl9fSB7CisgICAge3sxMH19Y29sb3J7ey8xMH19OiB7ezExfX1yZWR7ey8xMX19OyB9CisgICAge3sxMn19YSAuc3BlY2lhbDpob3Zlcnt7LzEyfX0geworICAgICAge3sxM319Zm9ve3svMTN9fToge3sxNH19YmFye3svMTR9fTsKKyAgICAgIHt7MTV9fWN1cnNvcnt7LzE1fX06IHt7MTZ9fWUtcmVzaXple3svMTZ9fTsKKyAgICAgIHt7MTd9fWNvbG9ye3svMTd9fToge3sxOH19cmdiYSgyNTUsIDAsIDAsIDAuOCl7ey8xOH19OyB9CisgICAge3sxOX19YSAuc3BlY2lhbDphZnRlcnt7LzE5fX0geworICAgICAge3syMH19Y29udGVudHt7LzIwfX06IHt7MjF9fSJJIGF0ZSAxNSBwaWVzIDJweCB0aGljayEie3svMjF9fTsgfQorICB7ezIyfX1hOmFjdGl2ZXt7LzIyfX0geworICAgIHt7MjN9fWJvcmRlcnt7LzIzfX06IHt7MjR9fTJweCBzb2xpZCBibGFja3t7LzI0fX07IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2VsZWN0b3JzX3Byb3BlcnRpZXNfc291cmNlbWFwX3Nhc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQVNTJywgPDwnQ1NTJywgOnN5bnRheCA9PiA6c2FzcworJHdpZHRoOiAycHgKKyR0cmFuc2x1Y2VudC1yZWQ6IHJnYmEoMjU1LCAwLCAwLCAwLjUpCit7ezF9fWF7ey8xfX0KKyAge3s5fX0uc3BlY2lhbHt7Lzl9fQorICAgIHt7MTB9fWNvbG9ye3svMTB9fToge3sxMX19cmVke3svMTF9fQorICAgIHt7MTJ9fSY6aG92ZXJ7ey8xMn19CisgICAgICB7ezEzfX1mb297ey8xM319OiB7ezE0fX1iYXJ7ey8xNH19CisgICAgICB7ezE1fX1jdXJzb3J7ey8xNX19OiB7ezE2fX1lICsgLXJlc2l6ZXt7LzE2fX0KKyAgICAgIHt7MTd9fWNvbG9ye3svMTd9fToge3sxOH19b3BhY2lmeSgkdHJhbnNsdWNlbnQtcmVkLCAwLjMpe3svMTh9fQorICAgIHt7MTl9fSY6YWZ0ZXJ7ey8xOX19CisgICAgICB7ezIwfX1jb250ZW50e3svMjB9fToge3syMX19IkkgYXRlICN7NSArIDEwfSBwaWVzICN7JHdpZHRofSB0aGljayEie3svMjF9fQorICB7ezIyfX0mOmFjdGl2ZXt7LzIyfX0KKyAgICB7ezIzfX1ib3JkZXJ7ey8yM319OiB7ezI0fX0kd2lkdGggc29saWQgYmxhY2t7ey8yNH19CisKKyAge3syfX0vKiBTT01FIENPTU1FTlQgKi97ey8yfX0KKyAge3szfX1mb250e3svM319OiB7ezR9fTJweC8zcHh7ey80fX0KKyAgICB7ezV9fWZhbWlseXt7LzV9fToge3s2fX1mYW50YXN5e3svNn19CisgICAge3s3fX1zaXple3svN319OiB7ezh9fTFlbSArICgyZW0gKiAzKXt7Lzh9fQorU0FTUwore3sxfX1he3svMX19IHsKKyAge3syfX0vKiBTT01FIENPTU1FTlQgKi97ey8yfX0KKyAge3szfX1mb250e3svM319OiB7ezR9fTJweC8zcHh7ey80fX07CisgICAge3s1fX1mb250LWZhbWlseXt7LzV9fToge3s2fX1mYW50YXN5e3svNn19OworICAgIHt7N319Zm9udC1zaXple3svN319OiB7ezh9fTdlbXt7Lzh9fTsgfQorICB7ezl9fWEgLnNwZWNpYWx7ey85fX0geworICAgIHt7MTB9fWNvbG9ye3svMTB9fToge3sxMX19cmVke3svMTF9fTsgfQorICAgIHt7MTJ9fWEgLnNwZWNpYWw6aG92ZXJ7ey8xMn19IHsKKyAgICAgIHt7MTN9fWZvb3t7LzEzfX06IHt7MTR9fWJhcnt7LzE0fX07CisgICAgICB7ezE1fX1jdXJzb3J7ey8xNX19OiB7ezE2fX1lLXJlc2l6ZXt7LzE2fX07CisgICAgICB7ezE3fX1jb2xvcnt7LzE3fX06IHt7MTh9fXJnYmEoMjU1LCAwLCAwLCAwLjgpe3svMTh9fTsgfQorICAgIHt7MTl9fWEgLnNwZWNpYWw6YWZ0ZXJ7ey8xOX19IHsKKyAgICAgIHt7MjB9fWNvbnRlbnR7ey8yMH19OiB7ezIxfX0iSSBhdGUgMTUgcGllcyAycHggdGhpY2shInt7LzIxfX07IH0KKyAge3syMn19YTphY3RpdmV7ey8yMn19IHsKKyAgICB7ezIzfX1ib3JkZXJ7ey8yM319OiB7ezI0fX0ycHggc29saWQgYmxhY2t7ey8yNH19OyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dGVuZF9zb3VyY2VtYXBfc2NzcworICAgIGFzc2VydF9wYXJzZXNfd2l0aF9tYXBwaW5nIDw8J1NDU1MnLCA8PCdDU1MnCit7ezF9fS5lcnJvciB7ey8xfX17CisgIHt7Mn19Ym9yZGVye3svMn19OiB7ezN9fTFweCAjZmYwMGFhe3svM319OworICB7ezR9fWJhY2tncm91bmQtY29sb3J7ey80fX06IHt7NX19I2ZkZHt7LzV9fTsKK30KK3t7Nn19LnNlcmlvdXNFcnJvciB7ey82fX17CisgIEBleHRlbmQgLmVycm9yOworICB7ezd9fWJvcmRlci13aWR0aHt7Lzd9fToge3s4fX0zcHh7ey84fX07Cit9CitTQ1NTCit7ezF9fS5lcnJvciwgLnNlcmlvdXNFcnJvcnt7LzF9fSB7CisgIHt7Mn19Ym9yZGVye3svMn19OiB7ezN9fTFweCAjZmYwMGFhe3svM319OworICB7ezR9fWJhY2tncm91bmQtY29sb3J7ey80fX06IHt7NX19I2ZkZHt7LzV9fTsgfQorCit7ezZ9fS5zZXJpb3VzRXJyb3J7ey82fX0geworICB7ezd9fWJvcmRlci13aWR0aHt7Lzd9fToge3s4fX0zcHh7ey84fX07IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0ZW5kX3NvdXJjZW1hcF9zYXNzCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX21hcHBpbmcgPDwnU0FTUycsIDw8J0NTUycsIDpzeW50YXggPT4gOnNhc3MKK3t7MX19LmVycm9ye3svMX19CisgIHt7Mn19Ym9yZGVye3svMn19OiB7ezN9fTFweCAjZjAwe3svM319CisgIHt7NH19YmFja2dyb3VuZC1jb2xvcnt7LzR9fToge3s1fX0jZmRke3svNX19CisKK3t7Nn19LnNlcmlvdXNFcnJvcnt7LzZ9fQorICBAZXh0ZW5kIC5lcnJvcgorICB7ezd9fWJvcmRlci13aWR0aHt7Lzd9fToge3s4fX0zcHh7ey84fX0KK1NBU1MKK3t7MX19LmVycm9yLCAuc2VyaW91c0Vycm9ye3svMX19IHsKKyAge3syfX1ib3JkZXJ7ey8yfX06IHt7M319MXB4ICNmMDB7ey8zfX07CisgIHt7NH19YmFja2dyb3VuZC1jb2xvcnt7LzR9fToge3s1fX0jZmRke3svNX19OyB9CisKK3t7Nn19LnNlcmlvdXNFcnJvcnt7LzZ9fSB7CisgIHt7N319Ym9yZGVyLXdpZHRoe3svN319OiB7ezh9fTNweHt7Lzh9fTsgfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9mb3Jfc291cmNlbWFwX3Njc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQ1NTJywgPDwnQ1NTJworQGZvciAkaSBmcm9tIDEgdGhyb3VnaCAzIHsKKyAge3sxfX17ezR9fXt7N319Lml0ZW0tI3skaX0ge3svMX19e3svNH19e3svN319eyB7ezJ9fXt7NX19e3s4fX13aWR0aHt7LzJ9fXt7LzV9fXt7Lzh9fToge3szfX17ezZ9fXt7OX19MmVtICogJGl7ey8zfX17ey82fX17ey85fX07IH0KK30KK1NDU1MKK3t7MX19Lml0ZW0tMXt7LzF9fSB7CisgIHt7Mn19d2lkdGh7ey8yfX06IHt7M319MmVte3svM319OyB9CisKK3t7NH19Lml0ZW0tMnt7LzR9fSB7CisgIHt7NX19d2lkdGh7ey81fX06IHt7Nn19NGVte3svNn19OyB9CisKK3t7N319Lml0ZW0tM3t7Lzd9fSB7CisgIHt7OH19d2lkdGh7ey84fX06IHt7OX19NmVte3svOX19OyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Zvcl9zb3VyY2VtYXBfc2FzcworICAgIGFzc2VydF9wYXJzZXNfd2l0aF9tYXBwaW5nIDw8J1NBU1MnLCA8PCdDU1MnLCA6c3ludGF4ID0+IDpzYXNzCitAZm9yICRpIGZyb20gMSB0aHJvdWdoIDMKKyAge3sxfX17ezR9fXt7N319Lml0ZW0tI3skaX17ey8xfX17ey80fX17ey83fX0KKyAgICB7ezJ9fXt7NX19e3s4fX13aWR0aHt7LzJ9fXt7LzV9fXt7Lzh9fToge3szfX17ezZ9fXt7OX19MmVtICogJGl7ey8zfX17ey82fX17ey85fX0KK1NBU1MKK3t7MX19Lml0ZW0tMXt7LzF9fSB7CisgIHt7Mn19d2lkdGh7ey8yfX06IHt7M319MmVte3svM319OyB9CisKK3t7NH19Lml0ZW0tMnt7LzR9fSB7CisgIHt7NX19d2lkdGh7ey81fX06IHt7Nn19NGVte3svNn19OyB9CisKK3t7N319Lml0ZW0tM3t7Lzd9fSB7CisgIHt7OH19d2lkdGh7ey84fX06IHt7OX19NmVte3svOX19OyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X3doaWxlX3NvdXJjZW1hcF9zY3NzCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX21hcHBpbmcgPDwnU0NTUycsIDw8J0NTUycKKyRpOiA2OworQHdoaWxlICRpID4gMCB7CisgIHt7MX19e3s0fX17ezd9fS5pdGVtLSN7JGl9IHt7LzF9fXt7LzR9fXt7Lzd9fXsge3syfX17ezV9fXt7OH19d2lkdGh7ey8yfX17ey81fX17ey84fX06IHt7M319e3s2fX17ezl9fTJlbSAqICRpe3svM319e3svNn19e3svOX19OyB9CisgICRpOiAkaSAtIDIgIWdsb2JhbDsKK30KK1NDU1MKK3t7MX19Lml0ZW0tNnt7LzF9fSB7CisgIHt7Mn19d2lkdGh7ey8yfX06IHt7M319MTJlbXt7LzN9fTsgfQorCit7ezR9fS5pdGVtLTR7ey80fX0geworICB7ezV9fXdpZHRoe3svNX19OiB7ezZ9fThlbXt7LzZ9fTsgfQorCit7ezd9fS5pdGVtLTJ7ey83fX0geworICB7ezh9fXdpZHRoe3svOH19OiB7ezl9fTRlbXt7Lzl9fTsgfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworICBlbmQKKworICBkZWYgdGVzdF93aGlsZV9zb3VyY2VtYXBfc2FzcworICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQVNTJywgPDwnQ1NTJywgOnN5bnRheCA9PiA6c2FzcworJGk6IDYKK0B3aGlsZSAkaSA+IDAKKyAge3sxfX17ezR9fXt7N319Lml0ZW0tI3skaX17ey8xfX17ey80fX17ey83fX0KKyAgICB7ezJ9fXt7NX19e3s4fX13aWR0aHt7LzJ9fXt7LzV9fXt7Lzh9fToge3szfX17ezZ9fXt7OX19MmVtICogJGl7ey8zfX17ey82fX17ey85fX0KKyAgICAkaTogJGkgLSAyICFnbG9iYWwKK1NBU1MKK3t7MX19Lml0ZW0tNnt7LzF9fSB7CisgIHt7Mn19d2lkdGh7ey8yfX06IHt7M319MTJlbXt7LzN9fTsgfQorCit7ezR9fS5pdGVtLTR7ey80fX0geworICB7ezV9fXdpZHRoe3svNX19OiB7ezZ9fThlbXt7LzZ9fTsgfQorCit7ezd9fS5pdGVtLTJ7ey83fX0geworICB7ezh9fXdpZHRoe3svOH19OiB7ezl9fTRlbXt7Lzl9fTsgfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9lYWNoX3NvdXJjZW1hcF9zY3NzCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX21hcHBpbmcgPDwnU0NTUycsIDw8J0NTUycKK0BlYWNoICRhbmltYWwgaW4gcHVtYSwgc2VhLXNsdWcsIGVncmV0LCBzYWxhbWFuZGVyIHsKKyAge3sxfX17ezR9fXt7N319e3sxMH19LiN7JGFuaW1hbH0taWNvbiB7ey8xfX17ey80fX17ey83fX17ey8xMH19eworICAgIHt7Mn19e3s1fX17ezh9fXt7MTF9fWJhY2tncm91bmQtaW1hZ2V7ey8yfX17ey81fX17ey84fX17ey8xMX19OiB7ezN9fXt7Nn19e3s5fX17ezEyfX11cmwoJy9pbWFnZXMvI3skYW5pbWFsfS5wbmcnKXt7LzN9fXt7LzZ9fXt7Lzl9fXt7LzEyfX07CisgIH0KK30KK1NDU1MKK3t7MX19LnB1bWEtaWNvbnt7LzF9fSB7CisgIHt7Mn19YmFja2dyb3VuZC1pbWFnZXt7LzJ9fToge3szfX11cmwoIi9pbWFnZXMvcHVtYS5wbmciKXt7LzN9fTsgfQorCit7ezR9fS5zZWEtc2x1Zy1pY29ue3svNH19IHsKKyAge3s1fX1iYWNrZ3JvdW5kLWltYWdle3svNX19OiB7ezZ9fXVybCgiL2ltYWdlcy9zZWEtc2x1Zy5wbmciKXt7LzZ9fTsgfQorCit7ezd9fS5lZ3JldC1pY29ue3svN319IHsKKyAge3s4fX1iYWNrZ3JvdW5kLWltYWdle3svOH19OiB7ezl9fXVybCgiL2ltYWdlcy9lZ3JldC5wbmciKXt7Lzl9fTsgfQorCit7ezEwfX0uc2FsYW1hbmRlci1pY29ue3svMTB9fSB7CisgIHt7MTF9fWJhY2tncm91bmQtaW1hZ2V7ey8xMX19OiB7ezEyfX11cmwoIi9pbWFnZXMvc2FsYW1hbmRlci5wbmciKXt7LzEyfX07IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfZWFjaF9zb3VyY2VtYXBfc2FzcworICAgIGFzc2VydF9wYXJzZXNfd2l0aF9tYXBwaW5nIDw8J1NBU1MnLCA8PCdDU1MnLCA6c3ludGF4ID0+IDpzYXNzCitAZWFjaCAkYW5pbWFsIGluIHB1bWEsIHNlYS1zbHVnLCBlZ3JldCwgc2FsYW1hbmRlcgorICB7ezF9fXt7NH19e3s3fX17ezEwfX0uI3skYW5pbWFsfS1pY29ue3svMX19e3svNH19e3svN319e3svMTB9fQorICAgIHt7Mn19e3s1fX17ezh9fXt7MTF9fWJhY2tncm91bmQtaW1hZ2V7ey8yfX17ey81fX17ey84fX17ey8xMX19OiB7ezN9fXt7Nn19e3s5fX17ezEyfX11cmwoJy9pbWFnZXMvI3skYW5pbWFsfS5wbmcnKXt7LzN9fXt7LzZ9fXt7Lzl9fXt7LzEyfX0KK1NBU1MKK3t7MX19LnB1bWEtaWNvbnt7LzF9fSB7CisgIHt7Mn19YmFja2dyb3VuZC1pbWFnZXt7LzJ9fToge3szfX11cmwoIi9pbWFnZXMvcHVtYS5wbmciKXt7LzN9fTsgfQorCit7ezR9fS5zZWEtc2x1Zy1pY29ue3svNH19IHsKKyAge3s1fX1iYWNrZ3JvdW5kLWltYWdle3svNX19OiB7ezZ9fXVybCgiL2ltYWdlcy9zZWEtc2x1Zy5wbmciKXt7LzZ9fTsgfQorCit7ezd9fS5lZ3JldC1pY29ue3svN319IHsKKyAge3s4fX1iYWNrZ3JvdW5kLWltYWdle3svOH19OiB7ezl9fXVybCgiL2ltYWdlcy9lZ3JldC5wbmciKXt7Lzl9fTsgfQorCit7ezEwfX0uc2FsYW1hbmRlci1pY29ue3svMTB9fSB7CisgIHt7MTF9fWJhY2tncm91bmQtaW1hZ2V7ey8xMX19OiB7ezEyfX11cmwoIi9pbWFnZXMvc2FsYW1hbmRlci5wbmciKXt7LzEyfX07IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWl4aW5fc291cmNlbWFwX3Njc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQ1NTJywgPDwnQ1NTJworQG1peGluIGxhcmdlLXRleHQgeworICBmb250OiB7CisgICAge3syfX1zaXple3svMn19OiB7ezN9fTIwcHh7ey8zfX07CisgICAge3s0fX13ZWlnaHR7ey80fX06IHt7NX19Ym9sZHt7LzV9fTsKKyAgfQorICB7ezZ9fWNvbG9ye3svNn19OiB7ezd9fSNmZjAwMDB7ey83fX07Cit9CisKK3t7MX19LnBhZ2UtdGl0bGUge3svMX19eworICBAaW5jbHVkZSBsYXJnZS10ZXh0OworICB7ezh9fXBhZGRpbmd7ey84fX06IHt7OX19NHB4e3svOX19OworfQorCitAbWl4aW4gZGFzaGVkLWJvcmRlcigkY29sb3IsICR3aWR0aDoge3sxNH19MWlue3svMTR9fSkgeworICBib3JkZXI6IHsKKyAgICB7ezExfX17ezE4fX1jb2xvcnt7LzExfX17ey8xOH19OiAkY29sb3I7CisgICAge3sxM319e3syMH19d2lkdGh7ey8xM319e3svMjB9fTogJHdpZHRoOworICAgIHt7MTV9fXt7MjJ9fXN0eWxle3svMTV9fXt7LzIyfX06IHt7MTZ9fXt7MjN9fWRhc2hlZHt7LzE2fX17ey8yM319OworICB9Cit9CisKK3t7MTB9fXAge3svMTB9fXsgQGluY2x1ZGUgZGFzaGVkLWJvcmRlcih7ezEyfX1ibHVle3svMTJ9fSk7IH0KK3t7MTd9fWgxIHt7LzE3fX17IEBpbmNsdWRlIGRhc2hlZC1ib3JkZXIoe3sxOX19Ymx1ZXt7LzE5fX0sIHt7MjF9fTJpbnt7LzIxfX0pOyB9CisKK0BtaXhpbiBib3gtc2hhZG93KCRzaGFkb3dzLi4uKSB7CisgIHt7MjV9fS1tb3otYm94LXNoYWRvd3t7LzI1fX06IHt7MjZ9fSRzaGFkb3dze3svMjZ9fTsKKyAge3syN319LXdlYmtpdC1ib3gtc2hhZG93e3svMjd9fToge3syOH19JHNoYWRvd3N7ey8yOH19OworICB7ezI5fX1ib3gtc2hhZG93e3svMjl9fToge3szMH19JHNoYWRvd3N7ey8zMH19OworfQorCit7ezI0fX0uc2hhZG93cyB7ey8yNH19eworICBAaW5jbHVkZSBib3gtc2hhZG93KDBweCA0cHggNXB4ICM2NjYsIDJweCA2cHggMTBweCAjOTk5KTsKK30KK1NDU1MKK3t7MX19LnBhZ2UtdGl0bGV7ey8xfX0geworICB7ezJ9fWZvbnQtc2l6ZXt7LzJ9fToge3szfX0yMHB4e3svM319OworICB7ezR9fWZvbnQtd2VpZ2h0e3svNH19OiB7ezV9fWJvbGR7ey81fX07CisgIHt7Nn19Y29sb3J7ey82fX06IHt7N319I2ZmMDAwMHt7Lzd9fTsKKyAge3s4fX1wYWRkaW5ne3svOH19OiB7ezl9fTRweHt7Lzl9fTsgfQorCit7ezEwfX1we3svMTB9fSB7CisgIHt7MTF9fWJvcmRlci1jb2xvcnt7LzExfX06IHt7MTJ9fWJsdWV7ey8xMn19OworICB7ezEzfX1ib3JkZXItd2lkdGh7ey8xM319OiB7ezE0fX0xaW57ey8xNH19OworICB7ezE1fX1ib3JkZXItc3R5bGV7ey8xNX19OiB7ezE2fX1kYXNoZWR7ey8xNn19OyB9CisKK3t7MTd9fWgxe3svMTd9fSB7CisgIHt7MTh9fWJvcmRlci1jb2xvcnt7LzE4fX06IHt7MTl9fWJsdWV7ey8xOX19OworICB7ezIwfX1ib3JkZXItd2lkdGh7ey8yMH19OiB7ezIxfX0yaW57ey8yMX19OworICB7ezIyfX1ib3JkZXItc3R5bGV7ey8yMn19OiB7ezIzfX1kYXNoZWR7ey8yM319OyB9CisKK3t7MjR9fS5zaGFkb3dze3svMjR9fSB7CisgIHt7MjV9fS1tb3otYm94LXNoYWRvd3t7LzI1fX06IHt7MjZ9fTBweCA0cHggNXB4ICM2NjYsIDJweCA2cHggMTBweCAjOTk5e3svMjZ9fTsKKyAge3syN319LXdlYmtpdC1ib3gtc2hhZG93e3svMjd9fToge3syOH19MHB4IDRweCA1cHggIzY2NiwgMnB4IDZweCAxMHB4ICM5OTl7ey8yOH19OworICB7ezI5fX1ib3gtc2hhZG93e3svMjl9fToge3szMH19MHB4IDRweCA1cHggIzY2NiwgMnB4IDZweCAxMHB4ICM5OTl7ey8zMH19OyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCisgIGVuZAorCitkZWYgdGVzdF9taXhpbl9zb3VyY2VtYXBfc2FzcworICBzaWxlbmNlX3dhcm5pbmdzIHthc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PCdTQVNTJywgPDwnQ1NTJywgOnN5bnRheCA9PiA6c2Fzc30KKz1sYXJnZS10ZXh0CisgIDpmb250CisgICAge3syfX1zaXple3svMn19OiB7ezN9fTIwcHh7ey8zfX0KKyAgICB7ezR9fXdlaWdodHt7LzR9fToge3s1fX1ib2xke3svNX19CisgIHt7Nn19Y29sb3J7ey82fX06IHt7N319I2ZmMDAwMHt7Lzd9fQorCit7ezF9fS5wYWdlLXRpdGxle3svMX19CisgICtsYXJnZS10ZXh0CisgIHt7OH19cGFkZGluZ3t7Lzh9fToge3s5fX00cHh7ey85fX0KKworPWRhc2hlZC1ib3JkZXIoJGNvbG9yLCAkd2lkdGg6IHt7MTR9fTFpbnt7LzE0fX0pCisgIGJvcmRlcjoKKyAgICB7ezExfX17ezE4fX1jb2xvcnt7LzExfX17ey8xOH19OiAkY29sb3IKKyAgICB7ezEzfX17ezIwfX13aWR0aHt7LzEzfX17ey8yMH19OiAkd2lkdGgKKyAgICB7ezE1fX17ezIyfX1zdHlsZXt7LzE1fX17ey8yMn19OiB7ezE2fX17ezIzfX1kYXNoZWR7ey8xNn19e3svMjN9fQorCit7ezEwfX1we3svMTB9fQorICArZGFzaGVkLWJvcmRlcih7ezEyfX1ibHVle3svMTJ9fSkKKwore3sxN319aDF7ey8xN319CisgICtkYXNoZWQtYm9yZGVyKHt7MTl9fWJsdWV7ey8xOX19LCB7ezIxfX0yaW57ey8yMX19KQorCis9Ym94LXNoYWRvdygkc2hhZG93cy4uLikKKyAge3syNX19LW1vei1ib3gtc2hhZG93e3svMjV9fToge3syNn19JHNoYWRvd3N7ey8yNn19CisgIHt7Mjd9fS13ZWJraXQtYm94LXNoYWRvd3t7LzI3fX06IHt7Mjh9fSRzaGFkb3dze3svMjh9fQorICB7ezI5fX1ib3gtc2hhZG93e3svMjl9fToge3szMH19JHNoYWRvd3N7ey8zMH19CisKK3t7MjR9fS5zaGFkb3dze3svMjR9fQorICArYm94LXNoYWRvdygwcHggNHB4IDVweCAjNjY2LCAycHggNnB4IDEwcHggIzk5OSkKK1NBU1MKK3t7MX19LnBhZ2UtdGl0bGV7ey8xfX0geworICB7ezJ9fWZvbnQtc2l6ZXt7LzJ9fToge3szfX0yMHB4e3svM319OworICB7ezR9fWZvbnQtd2VpZ2h0e3svNH19OiB7ezV9fWJvbGR7ey81fX07CisgIHt7Nn19Y29sb3J7ey82fX06IHt7N319I2ZmMDAwMHt7Lzd9fTsKKyAge3s4fX1wYWRkaW5ne3svOH19OiB7ezl9fTRweHt7Lzl9fTsgfQorCit7ezEwfX1we3svMTB9fSB7CisgIHt7MTF9fWJvcmRlci1jb2xvcnt7LzExfX06IHt7MTJ9fWJsdWV7ey8xMn19OworICB7ezEzfX1ib3JkZXItd2lkdGh7ey8xM319OiB7ezE0fX0xaW57ey8xNH19OworICB7ezE1fX1ib3JkZXItc3R5bGV7ey8xNX19OiB7ezE2fX1kYXNoZWR7ey8xNn19OyB9CisKK3t7MTd9fWgxe3svMTd9fSB7CisgIHt7MTh9fWJvcmRlci1jb2xvcnt7LzE4fX06IHt7MTl9fWJsdWV7ey8xOX19OworICB7ezIwfX1ib3JkZXItd2lkdGh7ey8yMH19OiB7ezIxfX0yaW57ey8yMX19OworICB7ezIyfX1ib3JkZXItc3R5bGV7ey8yMn19OiB7ezIzfX1kYXNoZWR7ey8yM319OyB9CisKK3t7MjR9fS5zaGFkb3dze3svMjR9fSB7CisgIHt7MjV9fS1tb3otYm94LXNoYWRvd3t7LzI1fX06IHt7MjZ9fTBweCA0cHggNXB4ICM2NjYsIDJweCA2cHggMTBweCAjOTk5e3svMjZ9fTsKKyAge3syN319LXdlYmtpdC1ib3gtc2hhZG93e3svMjd9fToge3syOH19MHB4IDRweCA1cHggIzY2NiwgMnB4IDZweCAxMHB4ICM5OTl7ey8yOH19OworICB7ezI5fX1ib3gtc2hhZG93e3svMjl9fToge3szMH19MHB4IDRweCA1cHggIzY2NiwgMnB4IDZweCAxMHB4ICM5OTl7ey8zMH19OyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCitlbmQKKworICBkZWYgdGVzdF9mdW5jdGlvbl9zb3VyY2VtYXBfc2NzcworICAgIGFzc2VydF9wYXJzZXNfd2l0aF9tYXBwaW5nIDw8J1NDU1MnLCA8PCdDU1MnCiskZ3JpZC13aWR0aDogMjBweDsKKyRndXR0ZXItd2lkdGg6IDVweDsKKworQGZ1bmN0aW9uIGdyaWQtd2lkdGgoJG4pIHsKKyAgQHJldHVybiAkbiAqICRncmlkLXdpZHRoICsgKCRuIC0gMSkgKiAkZ3V0dGVyLXdpZHRoOworfQore3sxfX1zaWRlYmFyIHt7LzF9fXsge3syfX13aWR0aHt7LzJ9fToge3szfX1ncmlkLXdpZHRoKDUpe3svM319OyB9CitTQ1NTCit7ezF9fXNpZGViYXJ7ey8xfX0geworICB7ezJ9fXdpZHRoe3svMn19OiB7ezN9fTEyMHB4e3svM319OyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCisgIGVuZAorCisgIGRlZiB0ZXN0X2Z1bmN0aW9uX3NvdXJjZW1hcF9zYXNzCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX21hcHBpbmcgPDwnU0FTUycsIDw8J0NTUycsIDpzeW50YXggPT4gOnNhc3MKKyRncmlkLXdpZHRoOiAyMHB4CiskZ3V0dGVyLXdpZHRoOiA1cHgKKworQGZ1bmN0aW9uIGdyaWQtd2lkdGgoJG4pCisgIEByZXR1cm4gJG4gKiAkZ3JpZC13aWR0aCArICgkbiAtIDEpICogJGd1dHRlci13aWR0aAorCit7ezF9fXNpZGViYXJ7ey8xfX0KKyAge3syfX13aWR0aHt7LzJ9fToge3szfX1ncmlkLXdpZHRoKDUpe3svM319CitTQVNTCit7ezF9fXNpZGViYXJ7ey8xfX0geworICB7ezJ9fXdpZHRoe3svMn19OiB7ezN9fTEyMHB4e3svM319OyB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCisgIGVuZAorCisgICMgUmVncmVzc2lvbiB0ZXN0cworCisgIGRlZiB0ZXN0X3Byb3BlcnRpZXNfc2FzcworICAgIHNpbGVuY2Vfd2FybmluZ3Mge2Fzc2VydF9wYXJzZXNfd2l0aF9tYXBwaW5nIDw8U0FTUywgPDxDU1MsIDpzeW50YXggPT4gOnNhc3N9Cit7ezF9fS5mb297ey8xfX0KKyAgOnt7Mn19bmFtZXt7LzJ9fSB7ezN9fXZhbHVle3svM319CisgIHt7NH19bmFtZXt7LzR9fToge3s1fX12YWx1ZXt7LzV9fQorICA6e3s2fX1uYW1le3svNn19ICB7ezd9fXZhbHVle3svN319CisgIHt7OH19bmFtZXt7Lzh9fTogIHt7OX19dmFsdWV7ey85fX0KK1NBU1MKK3t7MX19LmZvb3t7LzF9fSB7CisgIHt7Mn19bmFtZXt7LzJ9fToge3szfX12YWx1ZXt7LzN9fTsKKyAge3s0fX1uYW1le3svNH19OiB7ezV9fXZhbHVle3svNX19OworICB7ezZ9fW5hbWV7ey82fX06IHt7N319dmFsdWV7ey83fX07CisgIHt7OH19bmFtZXt7Lzh9fToge3s5fX12YWx1ZXt7Lzl9fTsgfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9tdWx0aWxpbmVfc2NyaXB0X3Njc3MKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PFNDU1MsIDw8Q1NTLCA6c3ludGF4ID0+IDpzY3NzCiskdmFyOiB7ezN9fWZvbyArCisgICAgYmFye3svM319OyB7ezF9fXgge3svMX19eyB7ezJ9fXl7ey8yfX06ICR2YXIgfQorU0NTUwore3sxfX14e3svMX19IHsKKyAge3syfX15e3svMn19OiB7ezN9fWZvb2Jhcnt7LzN9fTsgfQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9tdWx0aWxpbmVfaW50ZXJwb2xhdGlvbl9zb3VyY2VfcmFuZ2UKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KDw8LVNDU1MsIDpjYWNoZSA9PiBmYWxzZSwgOnN5bnRheCA9PiA6c2NzcykKK3AgeworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtKAorICAgICAgICAgICdcI3sxMjN9Jyk7Cit9CitTQ1NTCisKKyAgICBpbnRlcnBvbGF0ZWQgPSBlbmdpbmUudG9fdHJlZS5jaGlsZHJlbi4KKyAgICAgIGZpcnN0LmNoaWxkcmVuLgorICAgICAgZmlyc3QudmFsdWUuZmlyc3QuY2hpbGRyZW5bMV0KKyAgICBhc3NlcnRfZXF1YWwgIjEyMyIsIGludGVycG9sYXRlZC50b19zYXNzCisgICAgcmFuZ2UgPSBpbnRlcnBvbGF0ZWQuc291cmNlX3JhbmdlCisgICAgYXNzZXJ0X2VxdWFsIDMsIHJhbmdlLnN0YXJ0X3Bvcy5saW5lCisgICAgYXNzZXJ0X2VxdWFsIDE0LCByYW5nZS5zdGFydF9wb3Mub2Zmc2V0CisgICAgYXNzZXJ0X2VxdWFsIDMsIHJhbmdlLmVuZF9wb3MubGluZQorICAgIGFzc2VydF9lcXVhbCAxNywgcmFuZ2UuZW5kX3Bvcy5vZmZzZXQKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGlzdF9zb3VyY2VfcmFuZ2UKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KDw8LVNDU1MsIDpjYWNoZSA9PiBmYWxzZSwgOnN5bnRheCA9PiA6c2NzcykKK0BlYWNoICRhLCAkYiBpbiAoMSwgMiksICgyLCA0KSwgKDMsIDYpIHsgfQorU0NTUworICAgIGxpc3QgPSBlbmdpbmUudG9fdHJlZS5jaGlsZHJlbi5maXJzdC5saXN0CisgICAgYXNzZXJ0X2VxdWFsIDEsIGxpc3Quc291cmNlX3JhbmdlLnN0YXJ0X3Bvcy5saW5lCisgICAgYXNzZXJ0X2VxdWFsIDEsIGxpc3Quc291cmNlX3JhbmdlLmVuZF9wb3MubGluZQorICAgIGFzc2VydF9lcXVhbCAxNiwgbGlzdC5zb3VyY2VfcmFuZ2Uuc3RhcnRfcG9zLm9mZnNldAorICAgIGFzc2VydF9lcXVhbCAzOCwgbGlzdC5zb3VyY2VfcmFuZ2UuZW5kX3Bvcy5vZmZzZXQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc291cmNlc19hcnJheV9pc191cmlfZXNjYXBlZAorICAgIG1hcCA9IFNhc3M6OlNvdXJjZTo6TWFwLm5ldworICAgIGltcG9ydGVyID0gU2Fzczo6SW1wb3J0ZXJzOjpGaWxlc3lzdGVtLm5ldygnLicpCisgICAgbWFwLmFkZCgKKyAgICAgIFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KAorICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldygwLCAwKSwKKyAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoMCwgMTApLAorICAgICAgICAnc291cmNlIGZpbGUuc2NzcycsCisgICAgICAgIGltcG9ydGVyKSwKKyAgICAgIFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KAorICAgICAgICBTYXNzOjpTb3VyY2U6OlBvc2l0aW9uLm5ldygwLCAwKSwKKyAgICAgICAgU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcoMCwgMTApLAorICAgICAgICBuaWwsIG5pbCkpCisKKyAgICBqc29uID0gbWFwLnRvX2pzb24oOmNzc19wYXRoID0+ICdvdXRwdXQgZmlsZS5jc3MnLCA6c291cmNlbWFwX3BhdGggPT4gJ291dHB1dCBmaWxlLmNzcy5tYXAnKQorICAgIGFzc2VydF9lcXVhbCBqc29uLCA8PEpTT04ucnN0cmlwCit7CisidmVyc2lvbiI6IDMsCisibWFwcGluZ3MiOiAiREFERCxVQUFVIiwKKyJzb3VyY2VzIjogWyJzb3VyY2UlMjBmaWxlLnNjc3MiXSwKKyJuYW1lcyI6IFtdLAorImZpbGUiOiAib3V0cHV0JTIwZmlsZS5jc3MiCit9CitKU09OCisgIGVuZAorCisgIGRlZiB0ZXN0X3Njc3NfY29tbWVudF9zb3VyY2VfcmFuZ2UKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PFNDU1MsIDw8Q1NTLCA6c3ludGF4ID0+IDpzY3NzCiskdmFyOiB2YWw7IHt7MX19LyogdGV4dCAqL3t7LzF9fQorCit7ezJ9fS8qIG11bHRpbGluZQorICAgY29tbWVudCAqL3t7LzJ9fQorU0NTUwore3sxfX0vKiB0ZXh0ICove3svMX19Cit7ezJ9fS8qIG11bHRpbGluZQorICAgY29tbWVudCAqL3t7LzJ9fQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9zYXNzX2NvbW1lbnRfc291cmNlX3JhbmdlCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX21hcHBpbmcgPDxTQVNTLCA8PENTUywgOnN5bnRheCA9PiA6c2Fzcwore3sxfX1ib2R5e3svMX19CisgIHt7Mn19LyogdGV4dCAqL3t7LzJ9fQorCit7ezN9fS8qIG11bHRpbGluZQorICAgY29tbWVudCAqL3t7LzN9fQorU0FTUwore3sxfX1ib2R5e3svMX19IHsKKyAge3syfX0vKiB0ZXh0ICove3svMn19IH0KKwore3szfX0vKiBtdWx0aWxpbmUKKyAqIGNvbW1lbnQgKi97ey8zfX0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC5jc3MubWFwICovCitDU1MKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2Nzc19jb21tZW50X2ludGVycG9sYXRpb25fc291cmNlX3JhbmdlCisgICAgYXNzZXJ0X3BhcnNlc193aXRoX21hcHBpbmcgPDxTQ1NTLCA8PENTUywgOnN5bnRheCA9PiA6c2NzcworJHZhcjogMjsge3sxfX0vKiB0d28gXCN7JHZhcn0gYW5kIGZvdXIgXCN7MiAqICR2YXJ9ICove3svMX19CisKK3t7Mn19LyogbXVsdGlsaW5lCisgICBjb21tZW50IFwjeyAyICsgMiB9IGFuZCBcI3sgMiArCisgICAyIH0gKi97ey8yfX0KK1NDU1MKK3t7MX19LyogdHdvIDIgYW5kIGZvdXIgNCAqL3t7LzF9fQore3syfX0vKiBtdWx0aWxpbmUKKyAgIGNvbW1lbnQgNCBhbmQgNCAqL3t7LzJ9fQorCisvKiMgc291cmNlTWFwcGluZ1VSTD10ZXN0LmNzcy5tYXAgKi8KK0NTUworICBlbmQKKworICBkZWYgdGVzdF9zYXNzX2NvbW1lbnRfaW50ZXJwb2xhdGlvbl9zb3VyY2VfcmFuZ2UKKyAgICBhc3NlcnRfcGFyc2VzX3dpdGhfbWFwcGluZyA8PFNBU1MsIDw8Q1NTLCA6c3ludGF4ID0+IDpzYXNzCiskdmFyOiAyCit7ezF9fS8qIHR3byBcI3skdmFyfSBhbmQgZm91ciBcI3syICogJHZhcn0gKi97ey8xfX0KKwore3syfX0vKiBtdWx0aWxpbmUKKyAgIGNvbW1lbnQgXCN7IDIgKyAyIH0gYW5kIFwjeyAyICsKKyAgIDIgfSAqL3t7LzJ9fQorU0FTUwore3sxfX0vKiB0d28gMiBhbmQgZm91ciA0ICove3svMX19Cit7ezJ9fS8qIG11bHRpbGluZQorICogY29tbWVudCA0IGFuZCA0ICove3svMn19CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPXRlc3QuY3NzLm1hcCAqLworQ1NTCisgIGVuZAorCisgIHByaXZhdGUKKworICBBTk5PVEFUSU9OX1JFR0VYID0gL1x7XHsoXC8/KShbXn1dKylcfVx9LworCisgIGRlZiBidWlsZF9yYW5nZXModGV4dCwgZmlsZV9uYW1lID0gbmlsKQorICAgIHJhbmdlcyA9IEhhc2gubmV3IHt8aCwga3wgaFtrXSA9IFtdfQorICAgIHN0YXJ0X3Bvc2l0aW9ucyA9IHt9CisgICAgdGV4dC5zcGxpdCgiXG4iKS5lYWNoX3dpdGhfaW5kZXggZG8gfGxpbmVfdGV4dCwgbGluZXwKKyAgICAgIGxpbmUgKz0gMSAjIGxpbmVzIHNob3VkIGJlIDEtYmFzZWQKKyAgICAgIHdoaWxlIChtYXRjaCA9IGxpbmVfdGV4dC5tYXRjaChBTk5PVEFUSU9OX1JFR0VYKSkKKyAgICAgICAgY2xvc2luZyA9ICFtYXRjaFsxXS5lbXB0eT8KKyAgICAgICAgbmFtZSA9IG1hdGNoWzJdCisgICAgICAgIG1hdGNoX29mZnNldHMgPSBtYXRjaC5vZmZzZXQoMCkKKyAgICAgICAgb2Zmc2V0ID0gbWF0Y2hfb2Zmc2V0c1swXSArIDEgIyBPZmZzZXRzIGFyZSAxLWJhc2VkIGluIHNvdXJjZSBtYXBzLgorICAgICAgICBhc3NlcnQoIWNsb3NpbmcgfHwgc3RhcnRfcG9zaXRpb25zW25hbWVdLCAiQ2xvc2luZyBhbm5vdGF0aW9uICN7bmFtZX0gZm91bmQgYmVmb3JlIG9wZW5pbmcgb25lLiIpCisgICAgICAgIHBvc2l0aW9uID0gU2Fzczo6U291cmNlOjpQb3NpdGlvbi5uZXcobGluZSwgb2Zmc2V0KQorICAgICAgICBpZiBjbG9zaW5nCisgICAgICAgICAgcmFuZ2VzW25hbWVdIDw8IFNhc3M6OlNvdXJjZTo6UmFuZ2UubmV3KAorICAgICAgICAgICAgc3RhcnRfcG9zaXRpb25zW25hbWVdLCBwb3NpdGlvbiwgZmlsZV9uYW1lLAorICAgICAgICAgICAgU2Fzczo6SW1wb3J0ZXJzOjpGaWxlc3lzdGVtLm5ldygnLicpKQorICAgICAgICAgIHN0YXJ0X3Bvc2l0aW9ucy5kZWxldGUgbmFtZQorICAgICAgICBlbHNlCisgICAgICAgICAgYXNzZXJ0KCFzdGFydF9wb3NpdGlvbnNbbmFtZV0sICJPdmVybGFwcGluZyByYW5nZSBhbm5vdGF0aW9uICN7bmFtZX0gZW5jb3VudGVyZWQgb24gbGluZSAje2xpbmV9IikKKyAgICAgICAgICBzdGFydF9wb3NpdGlvbnNbbmFtZV0gPSBwb3NpdGlvbgorICAgICAgICBlbmQKKyAgICAgICAgbGluZV90ZXh0LnNsaWNlIShtYXRjaF9vZmZzZXRzWzBdLCBtYXRjaF9vZmZzZXRzWzFdIC0gbWF0Y2hfb2Zmc2V0c1swXSkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJhbmdlcworICBlbmQKKworICBkZWYgYnVpbGRfbWFwcGluZ19mcm9tX2Fubm90YXRpb25zKHNvdXJjZSwgY3NzLCBzb3VyY2VfZmlsZV9uYW1lKQorICAgIHNvdXJjZV9yYW5nZXMgPSBidWlsZF9yYW5nZXMoc291cmNlLCBzb3VyY2VfZmlsZV9uYW1lKQorICAgIHRhcmdldF9yYW5nZXMgPSBidWlsZF9yYW5nZXMoY3NzKQorICAgIG1hcCA9IFNhc3M6OlNvdXJjZTo6TWFwLm5ldworICAgIHNvdXJjZV9yYW5nZXMubWFwIGRvIHwobmFtZSwgc291cmNlcyl8CisgICAgICAgIGFzc2VydChzb3VyY2VzLmxlbmd0aCA9PSAxLCAiI3tzb3VyY2VzLmxlbmd0aH0gc291cmNlIHJhbmdlcyBlbmNvdW50ZXJlZCBmb3IgYW5ub3RhdGlvbiAje25hbWV9IikKKyAgICAgICAgYXNzZXJ0KHRhcmdldF9yYW5nZXNbbmFtZV0sICJObyB0YXJnZXQgcmFuZ2VzIGZvciBhbm5vdGF0aW9uICN7bmFtZX0iKQorICAgICAgICB0YXJnZXRfcmFuZ2VzW25hbWVdLm1hcCB7fHRhcmdldF9yYW5nZXwgW3NvdXJjZXMuZmlyc3QsIHRhcmdldF9yYW5nZV19CisgICAgICBlbmQuCisgICAgICBmbGF0dGVuKDEpLgorICAgICAgc29ydF9ieSB7fChfLCB0YXJnZXQpfCBbdGFyZ2V0LnN0YXJ0X3Bvcy5saW5lLCB0YXJnZXQuc3RhcnRfcG9zLm9mZnNldF19LgorICAgICAgZWFjaCB7fChzMiwgdGFyZ2V0KXwgbWFwLmFkZChzMiwgdGFyZ2V0KX0KKyAgICBtYXAKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9wYXJzZXNfd2l0aF9tYXBwaW5nKHNvdXJjZSwgY3NzLCBvcHRpb25zPXt9KQorICAgIG9wdGlvbnNbOnN5bnRheF0gfHw9IDpzY3NzCisgICAgaW5wdXRfZmlsZW5hbWUgPSBmaWxlbmFtZV9mb3JfdGVzdChvcHRpb25zWzpzeW50YXhdKQorICAgIG1hcHBpbmcgPSBidWlsZF9tYXBwaW5nX2Zyb21fYW5ub3RhdGlvbnMoc291cmNlLCBjc3MsIGlucHV0X2ZpbGVuYW1lKQorICAgIHNvdXJjZS5nc3ViIShBTk5PVEFUSU9OX1JFR0VYLCAiIikKKyAgICBjc3MuZ3N1YiEoQU5OT1RBVElPTl9SRUdFWCwgIiIpCisgICAgcmVuZGVyZWQsIHNvdXJjZW1hcCA9IHJlbmRlcl93aXRoX3NvdXJjZW1hcChzb3VyY2UsIG9wdGlvbnMpCisgICAgYXNzZXJ0X2VxdWFsIGNzcy5yc3RyaXAsIHJlbmRlcmVkLnJzdHJpcAorICAgIGFzc2VydF9zb3VyY2VtYXBzX2VxdWFsIHNvdXJjZSwgY3NzLCBtYXBwaW5nLCBzb3VyY2VtYXAKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9wb3NpdGlvbnNfZXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCwgbGluZXMsIG1lc3NhZ2UgPSBuaWwpCisgICAgcHJlZml4ID0gbWVzc2FnZSA/IG1lc3NhZ2UgKyAiOiAiIDogIiIKKyAgICBleHBlY3RlZF9sb2NhdGlvbiA9IGxpbmVzW2V4cGVjdGVkLmxpbmUgLSAxXSArICJcbiIgKyAoIi0iICogKGV4cGVjdGVkLm9mZnNldCAtIDEpKSArICJeIgorICAgIGFjdHVhbF9sb2NhdGlvbiA9IGxpbmVzW2FjdHVhbC5saW5lIC0gMV0gKyAiXG4iICsgKCItIiAqIChhY3R1YWwub2Zmc2V0IC0gMSkpICsgIl4iCisgICAgYXNzZXJ0X2VxdWFsKGV4cGVjdGVkLmxpbmUsIGFjdHVhbC5saW5lLCBwcmVmaXggKworICAgICAgIkV4cGVjdGVkICN7ZXhwZWN0ZWQuaW5zcGVjdH1cbiIgKworICAgICAgZXhwZWN0ZWRfbG9jYXRpb24gKyAiXG5cbiIgKworICAgICAgIkJ1dCB3YXMgI3thY3R1YWwuaW5zcGVjdH1cbiIgKworICAgICAgYWN0dWFsX2xvY2F0aW9uKQorICAgIGFzc2VydF9lcXVhbChleHBlY3RlZC5vZmZzZXQsIGFjdHVhbC5vZmZzZXQsIHByZWZpeCArCisgICAgICAiRXhwZWN0ZWQgI3tleHBlY3RlZC5pbnNwZWN0fVxuIiArCisgICAgICBleHBlY3RlZF9sb2NhdGlvbiArICJcblxuIiArCisgICAgICAiQnV0IHdhcyAje2FjdHVhbC5pbnNwZWN0fVxuIiArCisgICAgICBhY3R1YWxfbG9jYXRpb24pCisgIGVuZAorCisgIGRlZiBhc3NlcnRfcmFuZ2VzX2VxdWFsKGV4cGVjdGVkLCBhY3R1YWwsIGxpbmVzLCBwcmVmaXgpCisgICAgYXNzZXJ0X3Bvc2l0aW9uc19lcXVhbChleHBlY3RlZC5zdGFydF9wb3MsIGFjdHVhbC5zdGFydF9wb3MsIGxpbmVzLCBwcmVmaXggKyAiIHN0YXJ0IHBvc2l0aW9uIikKKyAgICBhc3NlcnRfcG9zaXRpb25zX2VxdWFsKGV4cGVjdGVkLmVuZF9wb3MsIGFjdHVhbC5lbmRfcG9zLCBsaW5lcywgcHJlZml4ICsgIiBlbmQgcG9zaXRpb24iKQorICAgIGlmIGV4cGVjdGVkLmZpbGUubmlsPworICAgICAgYXNzZXJ0X25pbChhY3R1YWwuZmlsZSkKKyAgICBlbHNlCisgICAgICBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQuZmlsZSwgYWN0dWFsLmZpbGUpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBhc3NlcnRfc291cmNlbWFwc19lcXVhbChzb3VyY2UsIGNzcywgZXhwZWN0ZWQsIGFjdHVhbCkKKyAgICBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQuZGF0YS5sZW5ndGgsIGFjdHVhbC5kYXRhLmxlbmd0aCwgPDxNRVNTQUdFKQorV3JvbmcgbnVtYmVyIG9mIG1hcHBpbmdzLiBFeHBlY3RlZDoKKyN7ZHVtcF9zb3VyY2VtYXBfYXNfZXhwZWN0YXRpb24oc291cmNlLCBjc3MsIGV4cGVjdGVkKS5nc3ViKC9eLywgJ3wgJyl9CisKK0FjdHVhbDoKKyN7ZHVtcF9zb3VyY2VtYXBfYXNfZXhwZWN0YXRpb24oc291cmNlLCBjc3MsIGFjdHVhbCkuZ3N1YigvXi8sICd8ICcpfQorTUVTU0FHRQorICAgIHNvdXJjZV9saW5lcyA9IHNvdXJjZS5zcGxpdCgiXG4iKQorICAgIGNzc19saW5lcyA9IGNzcy5zcGxpdCgiXG4iKQorICAgIGV4cGVjdGVkLmRhdGEuemlwKGFjdHVhbC5kYXRhKSBkbyB8ZXhwZWN0ZWRfbWFwcGluZywgYWN0dWFsX21hcHBpbmd8CisgICAgICBhc3NlcnRfcmFuZ2VzX2VxdWFsKGV4cGVjdGVkX21hcHBpbmcuaW5wdXQsIGFjdHVhbF9tYXBwaW5nLmlucHV0LCBzb3VyY2VfbGluZXMsICJJbnB1dCIpCisgICAgICBhc3NlcnRfcmFuZ2VzX2VxdWFsKGV4cGVjdGVkX21hcHBpbmcub3V0cHV0LCBhY3R1YWxfbWFwcGluZy5vdXRwdXQsIGNzc19saW5lcywgIk91dHB1dCIpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiBhc3NlcnRfcGFyc2VzX3dpdGhfc291cmNlbWFwKHNvdXJjZSwgY3NzLCBzb3VyY2VtYXBfanNvbiwgb3B0aW9ucz17fSkKKyAgICByZW5kZXJlZCwgc291cmNlbWFwID0gcmVuZGVyX3dpdGhfc291cmNlbWFwKHNvdXJjZSwgb3B0aW9ucykKKyAgICBjc3NfcGF0aCA9IG9wdGlvbnNbOm91dHB1dF0gfHwgInRlc3QuY3NzIgorICAgIHNvdXJjZW1hcF9wYXRoID0gU2Fzczo6VXRpbC5zb3VyY2VtYXBfbmFtZShjc3NfcGF0aCkKKyAgICByZW5kZXJlZF9qc29uID0gc291cmNlbWFwLnRvX2pzb24oOmNzc19wYXRoID0+IGNzc19wYXRoLCA6c291cmNlbWFwX3BhdGggPT4gc291cmNlbWFwX3BhdGgsIDp0eXBlID0+IG9wdGlvbnNbOnNvdXJjZW1hcF0pCisKKyAgICBhc3NlcnRfZXF1YWwgY3NzLnJzdHJpcCwgcmVuZGVyZWQucnN0cmlwCisgICAgYXNzZXJ0X2VxdWFsIHNvdXJjZW1hcF9qc29uLnJzdHJpcCwgcmVuZGVyZWRfanNvbgorICBlbmQKKworICBkZWYgcmVuZGVyX3dpdGhfc291cmNlbWFwKHNvdXJjZSwgb3B0aW9ucz17fSkKKyAgICBvcHRpb25zWzpzeW50YXhdIHx8PSA6c2NzcworICAgIG11bmdlX2ZpbGVuYW1lIG9wdGlvbnMKKyAgICBlbmdpbmUgPSBTYXNzOjpFbmdpbmUubmV3KHNvdXJjZSwgb3B0aW9ucykKKyAgICBlbmdpbmUub3B0aW9uc1s6Y2FjaGVdID0gZmFsc2UKKyAgICBzb3VyY2VtYXBfcGF0aCA9IFNhc3M6OlV0aWwuc291cmNlbWFwX25hbWUob3B0aW9uc1s6b3V0cHV0XSB8fCAidGVzdC5jc3MiKQorICAgIGVuZ2luZS5yZW5kZXJfd2l0aF9zb3VyY2VtYXAgRmlsZS5iYXNlbmFtZShzb3VyY2VtYXBfcGF0aCkKKyAgZW5kCisKKyAgZGVmIGR1bXBfc291cmNlbWFwX2FzX2V4cGVjdGF0aW9uKHNvdXJjZSwgY3NzLCBzb3VyY2VtYXApCisgICAgbWFwcGluZ3NfdG9fYW5ub3RhdGlvbnMoc291cmNlLCBzb3VyY2VtYXAuZGF0YS5tYXAge3xkfCBkLmlucHV0fSkgKyAiXG5cbiIgKworICAgICAgIj0iICogMjAgKyAiIG1hcHMgdG86XG5cbiIgKworICAgICAgbWFwcGluZ3NfdG9fYW5ub3RhdGlvbnMoY3NzLCBzb3VyY2VtYXAuZGF0YS5tYXAge3xkfCBkLm91dHB1dH0pCisgIGVuZAorCisgIGRlZiBtYXBwaW5nc190b19hbm5vdGF0aW9ucyhzb3VyY2UsIHJhbmdlcykKKyAgICBhZGRpdGlvbmFsX29mZnNldHMgPSBIYXNoLm5ldygwKQorICAgIGxpbmVzID0gc291cmNlLnNwbGl0KCJcbiIpCisKKyAgICBhZGRfYW5ub3RhdGlvbiA9IGxhbWJkYSBkbyB8cG9zLCBzdHJ8CisgICAgICBsaW5lX251bSA9IHBvcy5saW5lIC0gMQorICAgICAgbGluZSA9IGxpbmVzW2xpbmVfbnVtXQorICAgICAgb2Zmc2V0ID0gcG9zLm9mZnNldCArIGFkZGl0aW9uYWxfb2Zmc2V0c1tsaW5lX251bV0gLSAxCisgICAgICBsaW5lIDw8ICIgIiAqIChvZmZzZXQgLSBsaW5lLmxlbmd0aCkgaWYgb2Zmc2V0ID4gbGluZS5sZW5ndGgKKyAgICAgIGxpbmUuaW5zZXJ0KG9mZnNldCwgc3RyKQorICAgICAgYWRkaXRpb25hbF9vZmZzZXRzW2xpbmVfbnVtXSArPSBzdHIubGVuZ3RoCisgICAgZW5kCisKKyAgICByYW5nZXMuZWFjaF93aXRoX2luZGV4IGRvIHxyYW5nZSwgaXwKKyAgICAgIGFkZF9hbm5vdGF0aW9uW3JhbmdlLnN0YXJ0X3BvcywgInt7I3tpICsgMX19fSJdCisgICAgICBhZGRfYW5ub3RhdGlvbltyYW5nZS5lbmRfcG9zLCAie3svI3tpICsgMX19fSJdCisgICAgZW5kCisKKyAgICByZXR1cm4gbGluZXMuam9pbigiXG4iKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc3VwZXJzZWxlY3Rvcl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3Mvc3VwZXJzZWxlY3Rvcl90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhZmQyYjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy9zdXBlcnNlbGVjdG9yX3Rlc3QucmIKQEAgLTAsMCArMSwyMDkgQEAKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vdGVzdF9oZWxwZXInCisKK2NsYXNzIFN1cGVyc2VsZWN0b3JUZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgZGVmIHRlc3Rfc3VwZXJzZWxlY3Rvcl9yZWZsZXhpdml0eQorICAgIGFzc2VydF9zdXBlcnNlbGVjdG9yICdoMScsICdoMScKKyAgICBhc3NlcnRfc3VwZXJzZWxlY3RvciAnLmZvbycsICcuZm9vJworICAgIGFzc2VydF9zdXBlcnNlbGVjdG9yICcjZm9vID4gLmJhciwgYmF6JywgJyNmb28gPiAuYmFyLCBiYXonCisgIGVuZAorCisgIGRlZiB0ZXN0X3NtYWxsZXJfY29tcG91bmRfc3VwZXJzZWxlY3RvcgorICAgIGFzc2VydF9zdHJpY3Rfc3VwZXJzZWxlY3RvciAnLmZvbycsICcuZm9vLmJhcicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5iYXInLCAnLmZvby5iYXInCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICdhJywgJ2EjYicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJyNiJywgJ2EjYicKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc21hbGxlcl9jb21wbGV4X3N1cGVyc2VsZWN0b3IKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5iYXInLCAnLmZvbyAuYmFyJworICAgIGFzc2VydF9zdHJpY3Rfc3VwZXJzZWxlY3RvciAnLmJhcicsICcuZm9vID4gLmJhcicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5iYXInLCAnLmZvbyArIC5iYXInCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICcuYmFyJywgJy5mb28gfiAuYmFyJworICBlbmQKKworICBkZWYgdGVzdF9zZWxlY3Rvcl9saXN0X3N1YnNldF9zdXBlcnNlbGVjdG9yCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICcuZm9vLCAuYmFyJywgJy5mb28nCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICcuZm9vLCAuYmFyLCAuYmF6JywgJy5mb28sIC5iYXonCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICcuZm9vLCAuYmF6LCAucXV4JywgJy5mb28uYmFyLCAuYmF6LmJhbmcnCisgIGVuZAorCisgIGRlZiB0ZXN0X2xlYWRpbmdfY29tYmluYXRvcl9zdXBlcnNlbGVjdG9yCisgICAgcmVmdXRlX3N1cGVyc2VsZWN0b3IgJysgLmZvbycsICcuZm9vJworICAgIHJlZnV0ZV9zdXBlcnNlbGVjdG9yICcrIC5mb28nLCAnLmJhciArIC5mb28nCisgIGVuZAorCisgIGRlZiB0ZXN0X3RyYWlsaW5nX2NvbWJpbmF0b3Jfc3VwZXJzZWxlY3RvcgorICAgIHJlZnV0ZV9zdXBlcnNlbGVjdG9yICcuZm9vICsnLCAnLmZvbycKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnLmZvbyArJywgJy5mb28gKyAuYmFyJworICBlbmQKKworICBkZWYgdGVzdF9tYXRjaGluZ19jb21iaW5hdG9yX3N1cGVyc2VsZWN0b3IKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gKyAuYmFyJywgJy5mb28gKyAuYmFyLmJheicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gKyAuYmFyJywgJy5mb28uYmF6ICsgLmJhcicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gPiAuYmFyJywgJy5mb28gPiAuYmFyLmJheicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gPiAuYmFyJywgJy5mb28uYmF6ID4gLmJhcicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gfiAuYmFyJywgJy5mb28gfiAuYmFyLmJheicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gfiAuYmFyJywgJy5mb28uYmF6IH4gLmJhcicKKyAgZW5kCisKKyAgZGVmIHRlc3RfZm9sbG93aW5nX3NpYmxpbmdfaXNfc3VwZXJzZWxlY3Rvcl9vZl9uZXh0X3NpYmxpbmcKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gfiAuYmFyJywgJy5mb28gKyAuYmFyLmJheicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gfiAuYmFyJywgJy5mb28uYmF6ICsgLmJhcicKKyAgZW5kCisKKyAgZGVmIHRlc3RfZGVzY2VuZGFudF9pc19zdXBlcnNlbGVjdG9yX29mX2NoaWxkCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICcuZm9vIC5iYXInLCAnLmZvbyA+IC5iYXIuYmF6JworICAgIGFzc2VydF9zdHJpY3Rfc3VwZXJzZWxlY3RvciAnLmZvbyAuYmFyJywgJy5mb28uYmF6ID4gLmJhcicKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJy5mb28gLmJheicsICcuZm9vID4gLmJhciA+IC5iYXonCisgIGVuZAorCisgIGRlZiB0ZXN0X2NoaWxkX2lzbnRfc3VwZXJzZWxlY3Rvcl9vZl9sb25nZXJfY2hpbGQKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnLmZvbyA+IC5iYXonLCAnLmZvbyA+IC5iYXIgPiAuYmF6JworICAgIHJlZnV0ZV9zdXBlcnNlbGVjdG9yICcuZm9vID4gLmJheicsICcuZm9vID4gLmJhciAuYmF6JworICBlbmQKKworICBkZWYgdGVzdF9mb2xsb3dpbmdfc2libGluZ19pc250X3N1cGVyc2VsZWN0b3Jfb2ZfbG9uZ2VyX2ZvbGxvd2luZ19zaWJsaW5nCisgICAgcmVmdXRlX3N1cGVyc2VsZWN0b3IgJy5mb28gKyAuYmF6JywgJy5mb28gKyAuYmFyICsgLmJheicKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnLmZvbyArIC5iYXonLCAnLmZvbyArIC5iYXIgLmJheicKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2libGluZ19pc250X3N1cGVyc2VsZWN0b3Jfb2ZfbG9uZ2VyX3NpYmxpbmcKKyAgICAjIFRoaXMgYWN0dWFsbHkgaXMgYSBzdXBlcnNlbGVjdG9yLCBidXQgaXQncyBhIHZlcnkgbmFycm93IGVkZ2UgY2FzZSBhbmQKKyAgICAjIGRldGVjdGluZyBpdCBpcyB2ZXJ5IGRpZmZpY3VsdCBhbmQgbWF5IGJlIGV4cG9uZW50aWFsIGluIHRoZSB3b3JzdCBjYXNlLgorICAgIHJlZnV0ZV9zdXBlcnNlbGVjdG9yICcuZm9vIH4gLmJheicsICcuZm9vIH4gLmJhciB+IC5iYXonCisKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnLmZvbyB+IC5iYXonLCAnLmZvbyB+IC5iYXIgLmJheicKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWF0Y2hlc19pc19zdXBlcnNlbGVjdG9yX29mX2NvbnN0aXR1ZW50X3NlbGVjdG9ycworICAgICV3W21hdGNoZXMgLW1vei1hbnldLmVhY2ggZG8gfG5hbWV8CisgICAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgIjoje25hbWV9KC5mb28sIC5iYXIpIiwgJy5mb28uYmF6JworICAgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICI6I3tuYW1lfSguZm9vLCAuYmFyKSIsICcuYmFyLmJheicKKyAgICAgIGFzc2VydF9zdHJpY3Rfc3VwZXJzZWxlY3RvciAiOiN7bmFtZX0oLmZvbyAuYmFyLCAuYmF6KSIsICcueCAuZm9vIC5iYXInCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X21hdGNoZXNfaXNfc3VwZXJzZWxlY3Rvcl9vZl9zdWJzZXRfbWF0Y2hlcworICAgIGFzc2VydF9zdHJpY3Rfc3VwZXJzZWxlY3RvciAnOm1hdGNoZXMoLmZvbywgLmJhciwgLmJheiknLCAnI3g6bWF0Y2hlcyguZm9vLmJpcCwgLmJhei5iYW5nKScKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJzotbW96LWFueSguZm9vLCAuYmFyLCAuYmF6KScsICcjeDotbW96LWFueSguZm9vLmJpcCwgLmJhei5iYW5nKScKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWF0Y2hlc19pc19ub3Rfc3VwZXJzZWxlY3Rvcl9vZl9hbnkKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnOm1hdGNoZXMoLmZvbywgLmJhciknLCAnOi1tb3otYW55KC5mb28sIC5iYXIpJworICAgIHJlZnV0ZV9zdXBlcnNlbGVjdG9yICc6LW1vei1hbnkoLmZvbywgLmJhciknLCAnOm1hdGNoZXMoLmZvbywgLmJhciknCisgIGVuZAorCisgIGRlZiB0ZXN0X21hdGNoZXNfY2FuX2JlX3N1YnNlbGVjdG9yCisgICAgJXdbbWF0Y2hlcyAtbW96LWFueV0uZWFjaCBkbyB8bmFtZXwKKyAgICAgIGFzc2VydF9zdXBlcnNlbGVjdG9yICcuZm9vJywgIjoje25hbWV9KC5mb28uYmFyKSIKKyAgICAgIGFzc2VydF9zdXBlcnNlbGVjdG9yICcuZm9vLmJhcicsICI6I3tuYW1lfSguZm9vLmJhci5iYXopIgorICAgICAgYXNzZXJ0X3N1cGVyc2VsZWN0b3IgJy5mb28nLCAiOiN7bmFtZX0oLmZvby5iYXIsIC5mb28uYmF6KSIKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfYW55X2lzX25vdF9zdXBlcnNlbGVjdG9yX29mX2RpZmZlcmVudF9wcmVmaXgKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnOi1tb3otYW55KC5mb28sIC5iYXIpJywgJzotcy1hbnkoLmZvbywgLmJhciknCisgIGVuZAorCisgIGRlZiB0ZXN0X25vdF9pc19zdXBlcnNlbGVjdG9yX29mX2xlc3NfY29tcGxleF9ub3QKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJzpub3QoLmZvby5iYXIpJywgJzpub3QoLmZvbyknCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICc6bm90KC5mb28gLmJhciknLCAnOm5vdCguYmFyKScKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm90X2lzX3N1cGVyc2VsZWN0b3Jfb2Zfc3VwZXJzZXQKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJzpub3QoLmZvby5iaXAsIC5iYXouYmFuZyknLCAnOm5vdCguZm9vLCAuYmFyLCAuYmF6KScKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJzpub3QoLmZvby5iaXAsIC5iYXouYmFuZyknLCAnOm5vdCguZm9vKTpub3QoLmJhcik6bm90KC5iYXopJworICBlbmQKKworICBkZWYgdGVzdF9ub3RfaXNfc3VwZXJzZWxlY3Rvcl9vZl91bmlxdWVfc2VsZWN0b3JzCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICc6bm90KGgxLmZvbyknLCAnYScKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJzpub3QoLmJheiAjZm9vKScsICcjYmFyJworICBlbmQKKworICBkZWYgdGVzdF9ub3RfaXNfbm90X3N1cGVyc2VsZWN0b3Jfb2Zfbm9uX3VuaXF1ZV9zZWxlY3RvcnMKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnOm5vdCguZm9vKScsICcuYmFyJworICAgIHJlZnV0ZV9zdXBlcnNlbGVjdG9yICc6bm90KDpob3ZlciknLCAnOnZpc2l0ZWQnCisgIGVuZAorCisgIGRlZiB0ZXN0X2N1cnJlbnRfaXNfc3VwZXJzZWxlY3Rvcl93aXRoX2lkZW50aWNhbF9pbm5hcmRzCisgICAgYXNzZXJ0X3N1cGVyc2VsZWN0b3IgJzpjdXJyZW50KC5mb28pJywgJzpjdXJyZW50KC5mb28pJworICBlbmQKKworICBkZWYgdGVzdF9jdXJyZW50X2lzX3N1cGVyc2VsZWN0b3Jfd2l0aF9zdWJzZWxlY3Rvcl9pbm5hcmRzCisgICAgcmVmdXRlX3N1cGVyc2VsZWN0b3IgJzpjdXJyZW50KC5mb28pJywgJzpjdXJyZW50KC5mb28uYmFyKScKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnOmN1cnJlbnQoLmZvby5iYXIpJywgJzpjdXJyZW50KC5mb28pJworICBlbmQKKworICBkZWYgdGVzdF9udGhfbWF0Y2hfaXNfc3VwZXJzZWxlY3Rvcl9vZl9zdWJzZXRfbnRoX21hdGNoCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yKAorICAgICAgJzpudGgtY2hpbGQoMm4gb2YgLmZvbywgLmJhciwgLmJheiknLCAnI3g6bnRoLWNoaWxkKDJuIG9mIC5mb28uYmlwLCAuYmF6LmJhbmcpJykKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IoCisgICAgICAnOm50aC1sYXN0LWNoaWxkKDJuIG9mIC5mb28sIC5iYXIsIC5iYXopJywgJyN4Om50aC1sYXN0LWNoaWxkKDJuIG9mIC5mb28uYmlwLCAuYmF6LmJhbmcpJykKKyAgZW5kCisKKyAgZGVmIHRlc3RfbnRoX21hdGNoX2lzX25vdF9zdXBlcnNlbGVjdG9yX29mX250aF9tYXRjaF93aXRoX2RpZmZlcmVudF9hcmcKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvcigKKyAgICAgICc6bnRoLWNoaWxkKDJuIG9mIC5mb28sIC5iYXIsIC5iYXopJywgJyN4Om50aC1jaGlsZCgybiArIDEgb2YgLmZvby5iaXAsIC5iYXouYmFuZyknKQorICAgIHJlZnV0ZV9zdXBlcnNlbGVjdG9yKAorICAgICAgJzpudGgtbGFzdC1jaGlsZCgybiBvZiAuZm9vLCAuYmFyLCAuYmF6KScsICcjeDpudGgtbGFzdC1jaGlsZCgybiArIDEgb2YgLmZvby5iaXAsIC5iYXouYmFuZyknKQorICBlbmQKKworICBkZWYgdGVzdF9udGhfbWF0Y2hfaXNfbm90X3N1cGVyc2VsZWN0b3Jfb2ZfbnRoX2xhc3RfbWF0Y2gKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvciAnOm50aC1jaGlsZCgybiBvZiAuZm9vLCAuYmFyKScsICc6bnRoLWxhc3QtY2hpbGQoMm4gb2YgLmZvbywgLmJhciknCisgICAgcmVmdXRlX3N1cGVyc2VsZWN0b3IgJzpudGgtbGFzdC1jaGlsZCgybiBvZiAuZm9vLCAuYmFyKScsICc6bnRoLWNoaWxkKDJuIG9mIC5mb28sIC5iYXIpJworICBlbmQKKworICBkZWYgdGVzdF9udGhfbWF0Y2hfY2FuX2JlX3N1YnNlbGVjdG9yCisgICAgJXdbbnRoLWNoaWxkIG50aC1sYXN0LWNoaWxkXS5lYWNoIGRvIHxuYW1lfAorICAgICAgYXNzZXJ0X3N1cGVyc2VsZWN0b3IgJy5mb28nLCAiOiN7bmFtZX0oMm4gb2YgLmZvby5iYXIpIgorICAgICAgYXNzZXJ0X3N1cGVyc2VsZWN0b3IgJy5mb28uYmFyJywgIjoje25hbWV9KDJuIG9mIC5mb28uYmFyLmJheikiCisgICAgICBhc3NlcnRfc3VwZXJzZWxlY3RvciAnLmZvbycsICI6I3tuYW1lfSgybiBvZiAuZm9vLmJhciwgLmZvby5iYXopIgorICAgIGVuZAorICBlbmQKKworICBkZWYgaGFzX2lzX3N1cGVyc2VsZWN0b3Jfb2Zfc3Vic2V0X2hvc3QKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJzpoYXMoLmZvbywgLmJhciwgLmJheiknLCAnOmhhcyguZm9vLmJpcCwgLmJhei5iYW5nKScKKyAgZW5kCisKKyAgZGVmIGhhc19pc250X3N1cGVyc2VsZWN0b3Jfb2ZfY29udGFpbmVkX3NlbGVjdG9yCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICc6aGFzKC5mb28sIC5iYXIsIC5iYXopJywgJy5mb28nCisgIGVuZAorCisgIGRlZiBob3N0X2lzX3N1cGVyc2VsZWN0b3Jfb2Zfc3Vic2V0X2hvc3QKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IgJzpob3N0KC5mb28sIC5iYXIsIC5iYXopJywgJzpob3N0KC5mb28uYmlwLCAuYmF6LmJhbmcpJworICBlbmQKKworICBkZWYgaG9zdF9pc250X3N1cGVyc2VsZWN0b3Jfb2ZfY29udGFpbmVkX3NlbGVjdG9yCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICc6aG9zdCguZm9vLCAuYmFyLCAuYmF6KScsICcuZm9vJworICBlbmQKKworICBkZWYgaG9zdF9jb250ZXh0X2lzX3N1cGVyc2VsZWN0b3Jfb2Zfc3Vic2V0X2hvc3QKKyAgICBhc3NlcnRfc3RyaWN0X3N1cGVyc2VsZWN0b3IoCisgICAgICAnOmhvc3QtY29udGV4dCguZm9vLCAuYmFyLCAuYmF6KScsICc6aG9zdC1jb250ZXh0KC5mb28uYmlwLCAuYmF6LmJhbmcpJykKKyAgZW5kCisKKyAgZGVmIGhvc3RfY29udGV4dF9pc250X3N1cGVyc2VsZWN0b3Jfb2ZfY29udGFpbmVkX3NlbGVjdG9yCisgICAgYXNzZXJ0X3N0cmljdF9zdXBlcnNlbGVjdG9yICc6aG9zdC1jb250ZXh0KC5mb28sIC5iYXIsIC5iYXopJywgJy5mb28nCisgIGVuZAorCisgIHByaXZhdGUKKworICBkZWYgYXNzZXJ0X3N1cGVyc2VsZWN0b3Ioc3VwZXJzZWxlY3Rvciwgc3Vic2VsZWN0b3IpCisgICAgYXNzZXJ0KHBhcnNlX3NlbGVjdG9yKHN1cGVyc2VsZWN0b3IpLnN1cGVyc2VsZWN0b3I/KHBhcnNlX3NlbGVjdG9yKHN1YnNlbGVjdG9yKSksCisgICAgICAiRXhwZWN0ZWQgI3tzdXBlcnNlbGVjdG9yfSB0byBiZSBhIHN1cGVyc2VsZWN0b3Igb2YgI3tzdWJzZWxlY3Rvcn0uIikKKyAgZW5kCisKKyAgZGVmIHJlZnV0ZV9zdXBlcnNlbGVjdG9yKHN1cGVyc2VsZWN0b3IsIHN1YnNlbGVjdG9yKQorICAgIGFzc2VydCghcGFyc2Vfc2VsZWN0b3Ioc3VwZXJzZWxlY3Rvcikuc3VwZXJzZWxlY3Rvcj8ocGFyc2Vfc2VsZWN0b3Ioc3Vic2VsZWN0b3IpKSwKKyAgICAgICJFeHBlY3RlZCAje3N1cGVyc2VsZWN0b3J9IG5vdCB0byBiZSBhIHN1cGVyc2VsZWN0b3Igb2YgI3tzdWJzZWxlY3Rvcn0uIikKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9zdHJpY3Rfc3VwZXJzZWxlY3RvcihzdXBlcnNlbGVjdG9yLCBzdWJzZWxlY3RvcikKKyAgICBhc3NlcnRfc3VwZXJzZWxlY3RvcihzdXBlcnNlbGVjdG9yLCBzdWJzZWxlY3RvcikKKyAgICByZWZ1dGVfc3VwZXJzZWxlY3RvcihzdWJzZWxlY3Rvciwgc3VwZXJzZWxlY3RvcikKKyAgZW5kCisKKyAgZGVmIHBhcnNlX3NlbGVjdG9yKHNlbGVjdG9yKQorICAgIFNhc3M6OlNDU1M6OkNzc1BhcnNlci5uZXcoc2VsZWN0b3IsIGZpbGVuYW1lX2Zvcl90ZXN0LCBuaWwpLnBhcnNlX3NlbGVjdG9yCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX2NhY2hlZF9pbXBvcnRfb3B0aW9uX3BhcnRpYWwuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9fY2FjaGVkX2ltcG9ydF9vcHRpb25fcGFydGlhbC5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZjlkM2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX2NhY2hlZF9pbXBvcnRfb3B0aW9uX3BhcnRpYWwuc2NzcwpAQCAtMCwwICsxIEBACitwYXJ0aWFsIHt2YWx1ZTogd2hhdGV2ZXIoKX0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9fZG91YmxlX2ltcG9ydF9sb29wMi5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL19kb3VibGVfaW1wb3J0X2xvb3AyLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhNGViNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9fZG91YmxlX2ltcG9ydF9sb29wMi5zYXNzCkBAIC0wLDAgKzEgQEAKK0BpbXBvcnQgImRvdWJsZV9pbXBvcnRfbG9vcDEiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL19maWxlbmFtZV9mbl9pbXBvcnQuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9fZmlsZW5hbWVfZm5faW1wb3J0LnNjc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExZWVjNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9fZmlsZW5hbWVfZm5faW1wb3J0LnNjc3MKQEAgLTAsMCArMSwxMSBAQAorQG1peGluIGltcG9ydGVkLW1peGluIHsKKyAgaW1wb3J0ZWQtbWl4aW46IGZpbGVuYW1lKCk7Cit9CisKK0BmdW5jdGlvbiBpbXBvcnRlZC1mdW5jdGlvbigpIHsKKyAgQHJldHVybiBmaWxlbmFtZSgpOworfQorCitmaWxlbmFtZSB7CisgIGltcG9ydGVkOiBmaWxlbmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL19pbXBvcnRlZF9jaGFyc2V0X2libTg2Ni5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL19pbXBvcnRlZF9jaGFyc2V0X2libTg2Ni5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzkzMTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX2ltcG9ydGVkX2NoYXJzZXRfaWJtODY2LnNhc3MKQEAgLTAsMCArMSw0IEBACitAY2hhcnNldCAiSUJNODY2IgorCisuYmFyCisgIGE6IOkKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9faW1wb3J0ZWRfY2hhcnNldF91dGY4LnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX2ltcG9ydGVkX2NoYXJzZXRfdXRmOC5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2RjNWIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX2ltcG9ydGVkX2NoYXJzZXRfdXRmOC5zYXNzCkBAIC0wLDAgKzEsNCBAQAorQGNoYXJzZXQgIlVURi04IgorCisuYmFyCisgIGE6INGJCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX2ltcG9ydGVkX2NvbnRlbnQuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9faW1wb3J0ZWRfY29udGVudC5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzRlMzMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX2ltcG9ydGVkX2NvbnRlbnQuc2FzcwpAQCAtMCwwICsxLDMgQEAKK0BtaXhpbiBmb28KKyAgYQorICAgIEBjb250ZW50CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX3BhcnRpYWwuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9fcGFydGlhbC5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODYyNzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvX3BhcnRpYWwuc2FzcwpAQCAtMCwwICsxLDIgQEAKKyNmb28KKyAgYmFja2dyb3VuZC1jb2xvcjogI2JhZgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL19zYW1lX25hbWVfZGlmZmVyZW50X3BhcnRpYWxpdHkuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9fc2FtZV9uYW1lX2RpZmZlcmVudF9wYXJ0aWFsaXR5LnNjc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0ZTgzYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9fc2FtZV9uYW1lX2RpZmZlcmVudF9wYXJ0aWFsaXR5LnNjc3MKQEAgLTAsMCArMSBAQAorLmZvbyB7cGFydGlhbDogeWVzfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9hbHQuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9hbHQuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmNiNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2FsdC5zYXNzCkBAIC0wLDAgKzEsMTYgQEAKK2gxCisgIDpmbG9hdCAgbGVmdAorICA6d2lkdGggIDI3NHB4CisgIGhlaWdodDogNzVweAorICBtYXJnaW46IDAKKyAgYmFja2dyb3VuZDoKKyAgICByZXBlYXQ6IG5vLXJlcGVhdAorICAgIDppbWFnZSBub25lCisgIGE6aG92ZXIsIGE6dmlzaXRlZAorICAgIGNvbG9yOiBncmVlbgorICBiOmhvdmVyCisgICAgY29sb3I6IHJlZAorICAgIDpiYWNrZ3JvdW5kLWNvbG9yIGdyZWVuCisgIGNvbnN0CisgICAgbm9zcDogMSArIDIKKyAgICBzcCA6IDEgKyAyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvYmFzaWMuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9iYXNpYy5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYzJmYTMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvYmFzaWMuc2FzcwpAQCAtMCwwICsxLDIzIEBACisKKworYm9keQorICBmb250OiBBcmlhbAorICBiYWNrZ3JvdW5kOiBibHVlCisKKyNwYWdlCisgIHdpZHRoOiA3MDBweAorICBoZWlnaHQ6IDEwMAorICAjaGVhZGVyCisgICAgaGVpZ2h0OiAzMDBweAorICAgIGgxCisgICAgICBmb250LXNpemU6IDUwcHgKKyAgICAgIGNvbG9yOiAgICAgYmx1ZQorCisjY29udGVudC51c2VyLnNob3cKKyAgI2NvbnRhaW5lci50b3AKKyAgICAjY29sdW1uLmxlZnQKKyAgICAgIHdpZHRoOiAxMDBweAorICAgICNjb2x1bW4ucmlnaHQKKyAgICAgIHdpZHRoOiA2MDBweAorICAjY29udGFpbmVyLmJvdHRvbQorICAgIGJhY2tncm91bmQ6IGJyb3duCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvYm9yazEuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9ib3JrMS5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODFiY2MKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvYm9yazEuc2FzcwpAQCAtMCwwICsxLDIgQEAKK2JvcmsKKyAgYm9yazogJGJvcmsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9ib3JrMi5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2JvcmsyLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyYWZiNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9ib3JrMi5zYXNzCkBAIC0wLDAgKzEsMiBAQAorYm9yaworICA6Ym9yazogYm9yazsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9ib3JrMy5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2JvcmszLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwZmI3MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9ib3JrMy5zYXNzCkBAIC0wLDAgKzEsMiBAQAorYm9yaworICBib3JrOgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2Jvcms0LnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvYm9yazQuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTYxMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2Jvcms0LnNhc3MKQEAgLTAsMCArMSwyIEBACisKK2Jvcms6IGJsYWgKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9ib3JrNS5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2Jvcms1LnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0NzIwNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9ib3JrNS5zYXNzCkBAIC0wLDAgKzEsMyBAQAorYm9yaworICAvKiBmb28gKi8KKyAgYm9yazogJGJvcmsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9jYWNoZWRfaW1wb3J0X29wdGlvbi5zY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2NhY2hlZF9pbXBvcnRfb3B0aW9uLnNjc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkZTU0MwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9jYWNoZWRfaW1wb3J0X29wdGlvbi5zY3NzCkBAIC0wLDAgKzEsMyBAQAorQGltcG9ydCAiY2FjaGVkX2ltcG9ydF9vcHRpb25fcGFydGlhbCI7CisKK21haW4ge3ZhbHVlOiB3aGF0ZXZlcigpfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2NvbXBhY3Quc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9jb21wYWN0LnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmZDhlYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9jb21wYWN0LnNhc3MKQEAgLTAsMCArMSwxNyBAQAorI21haW4KKyAgd2lkdGg6IDE1ZW0KKyAgY29sb3I6ICMwMDAwZmYKKyAgcAorICAgIGJvcmRlcjoKKyAgICAgIHN0eWxlOiBkb3R0ZWQKKyAgICAgIC8qIE5lc3RlZCBjb21tZW50CisgICAgICAgIE1vcmUgbmVzdGVkIHN0dWZmCisgICAgICB3aWR0aDogMnB4CisgIC5jb29sCisgICAgd2lkdGg6IDEwMHB4CisKKyNsZWZ0CisgIGZvbnQ6CisgICAgc2l6ZTogMmVtCisgICAgd2VpZ2h0OiBib2xkCisgIGZsb2F0OiBsZWZ0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvY29tcGxleC5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2NvbXBsZXguc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWM5Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2NvbXBsZXguc2FzcwpAQCAtMCwwICsxLDMwNSBAQAorYm9keQorICBtYXJnaW46IDAKKyAgZm9udDogICAwLjg1ZW0gIkx1Y2lkYSBHcmFuZGUiLCAiVHJlYnVjaGV0IE1TIiwgVmVyZGFuYSwgc2Fucy1zZXJpZgorICBjb2xvcjogI2ZmZgorICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9nbG9iYWxfYmcuZ2lmKQorCisjcGFnZQorICB3aWR0aDogICAgICA5MDBweAorICBtYXJnaW46ICAgICAwIGF1dG8KKyAgYmFja2dyb3VuZDogIzQ0MDAwOAorICBib3JkZXItdG9wOgorICAgIHdpZHRoOiA1cHgKKyAgICBzdHlsZTogc29saWQKKyAgICBjb2xvcjogI2ZmODUwMAorCisjaGVhZGVyCisgIGhlaWdodDogIDc1cHgKKyAgcGFkZGluZzogMAorICBoMQorICAgIGZsb2F0OiAgbGVmdAorICAgIHdpZHRoOiAgMjc0cHgKKyAgICBoZWlnaHQ6IDc1cHgKKyAgICBtYXJnaW46IDAKKyAgICBiYWNrZ3JvdW5kOgorICAgICAgaW1hZ2U6IHVybCgvaW1hZ2VzL2dsb2JhbF9sb2dvLmdpZikKKyAgICAgIC8qIENyYXp5IG5lc3RlZCBjb21tZW50CisgICAgICByZXBlYXQ6IG5vLXJlcGVhdAorICAgIHRleHQtaW5kZW50OiAtOTk5OXB4CisgIC5zdGF0dXMKKyAgICBmbG9hdDogICByaWdodAorICAgIHBhZGRpbmc6CisgICAgICB0b3A6IC41ZW0KKyAgICAgIGxlZnQ6IC41ZW0KKyAgICAgIHJpZ2h0OiAuNWVtCisgICAgICBib3R0b206IDAKKyAgICBwCisgICAgICBmbG9hdDogIGxlZnQKKyAgICAgIG1hcmdpbjoKKyAgICAgICAgdG9wOiAwCisgICAgICAgIHJpZ2h0OiAwLjVlbQorICAgICAgICBib3R0b206IDAKKyAgICAgICAgbGVmdDogMAorICAgIHVsCisgICAgICBmbG9hdDogICBsZWZ0CisgICAgICBtYXJnaW46ICAwCisgICAgICBwYWRkaW5nOiAwCisgICAgbGkKKyAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZQorICAgICAgZGlzcGxheTogaW5saW5lCisgICAgICBtYXJnaW46IDAgNXB4CisgICAgYTpsaW5rLCBhOnZpc2l0ZWQKKyAgICAgIGNvbG9yOiAjZmY4NTAwCisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUKKyAgICBhOmhvdmVyCisgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQorICAuc2VhcmNoCisgICAgZmxvYXQ6ICByaWdodAorICAgIGNsZWFyOiAgcmlnaHQKKyAgICBtYXJnaW46IDEycHggMCAwIDAKKyAgICBmb3JtCisgICAgICBtYXJnaW46IDAKKyAgICBpbnB1dAorICAgICAgbWFyZ2luOiAwIDNweCAwIDAKKyAgICAgIHBhZGRpbmc6IDJweAorICAgICAgYm9yZGVyOiBub25lCisKKyNtZW51IAorICBjbGVhcjogYm90aAorICB0ZXh0LWFsaWduOiByaWdodAorICBoZWlnaHQ6IDIwcHgKKyAgYm9yZGVyLWJvdHRvbTogNXB4IHNvbGlkICMwMDZiOTUKKyAgYmFja2dyb3VuZDogIzAwYTRlNAorICAuY29udGVzdHMKKyAgICB1bAorICAgICAgbWFyZ2luOiAwIDVweCAwIDAKKyAgICAgIHBhZGRpbmc6IDAKKyAgICAgIGxpIAorICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmUKKyAgICAgICAgbWFyZ2luOiAwIDVweAorICAgICAgICBwYWRkaW5nOiA1cHggNXB4IDAgNXB4CisgICAgICAgIGRpc3BsYXk6IGlubGluZQorICAgICAgICBmb250LXNpemU6IDEuMWVtCisgICAgICAgIC8vIFRoaXMgY29tbWVudCBpcyBwcm9wZXJseSBpbmRlbnRlZAorICAgICAgICBjb2xvcjogI2ZmZgorICAgICAgICBiYWNrZ3JvdW5kOiAjMDBhNGU0CisgICAgYTpsaW5rLCBhOnZpc2l0ZWQKKyAgICAgIGNvbG9yOiAjZmZmCisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUKKyAgICAgIGZvbnQtd2VpZ2h0OiBib2xkCisgICAgYTpob3ZlcgorICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKKworLy9HZW5lcmFsIGNvbnRlbnQgaW5mb3JtYXRpb24KKyNjb250ZW50CisgIGNsZWFyOiBib3RoCisgIC5jb250YWluZXIKKyAgICBjbGVhcjogYm90aAorICAgIC5jb2x1bW4KKyAgICAgIGZsb2F0OiBsZWZ0CisgICAgICAucmlnaHQKKyAgICAgICAgZmxvYXQ6IHJpZ2h0CisgIGE6bGluaywgYTp2aXNpdGVkCisgICAgY29sb3I6ICM5M2Q3MDAKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUKKyAgYTpob3ZlcgorICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lCisKKy8vIEEgaGFyZCB0YWI6CisJCisKKyNjb250ZW50CisgIHAsIGRpdgorICAgIHdpZHRoOiA0MGVtCisgICAgbGksIGR0LCBkZAorICAgICAgY29sb3I6ICNkZGZmZGQKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0NzkyYmIKKyAgLmNvbnRhaW5lci52aWRlbworICAgIC5jb2x1bW4ubGVmdAorICAgICAgd2lkdGg6IDIwMHB4CisgICAgICAuYm94CisgICAgICAgIG1hcmdpbi10b3A6IDEwcHgKKyAgICAgICAgcCAKKyAgICAgICAgICBtYXJnaW46IDAgMWVtIGF1dG8gMWVtCisgICAgICAuYm94LnBhcnRpY2lwYW50cyAKKyAgICAgICAgaW1nCisgICAgICAgICAgZmxvYXQ6ICBsZWZ0CisgICAgICAgICAgbWFyZ2luOiAwIDFlbSBhdXRvIDFlbQorICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM2ZTAwMGQKKyAgICAgICAgICAgIHN0eWxlOiBzb2xpZAorICAgICAgICBoMgorICAgICAgICAgIG1hcmdpbjogMCAwIDEwcHggMAorICAgICAgICAgIHBhZGRpbmc6IDAuNWVtCisgICAgICAgICAgLyogVGhlIGJhY2tncm91bmQgaW1hZ2UgaXMgYSBnaWYhCisgICAgICAgICAgYmFja2dyb3VuZDogIzZlMDAwZCB1cmwoL2ltYWdlcy9oZHJfcGFydGljaXBhbnQuZ2lmKSAycHggMnB4IG5vLXJlcGVhdAorICAgICAgICAgIC8qIE9rYXkgY2hlY2sgdGhpcyBvdXQKKyAgICAgICAgICAgIE11bHRpbGluZSBjb21tZW50cworICAgICAgICAgICAgV293IGR1ZGUKKyAgICAgICAgICAgIEkgbWVhbiBzZXJpb3VzbHksIFdPVworICAgICAgICAgIHRleHQtaW5kZW50OiAtOTk5OXB4CisgICAgICAgICAgLy8gQW5kIGFsc28uLi4KKyAgICAgICAgICAgIE11bHRpbGluZSBjb21tZW50cyB0aGF0IGRvbid0IG91dHB1dCEKKyAgICAgICAgICAgIFNuYXp6eSwgbm8/CisgICAgICAgICAgYm9yZGVyOgorICAgICAgICAgICAgdG9wOgorICAgICAgICAgICAgICB3aWR0aDogNXB4CisgICAgICAgICAgICAgIHN0eWxlOiBzb2xpZAorICAgICAgICAgICAgICBjb2xvcjogI2EyMDAxMworICAgICAgICAgICAgcmlnaHQ6CisgICAgICAgICAgICAgIHdpZHRoOiAxcHgKKyAgICAgICAgICAgICAgc3R5bGU6IGRvdHRlZAorICAgIC5jb2x1bW4ubWlkZGxlCisgICAgICB3aWR0aDogNTAwcHgKKyAgICAuY29sdW1uLnJpZ2h0CisgICAgICB3aWR0aDogMjAwcHgKKyAgICAgIC5ib3gKKyAgICAgICAgbWFyZ2luLXRvcDogMAorICAgICAgICBwCisgICAgICAgICAgbWFyZ2luOiAwIDFlbSBhdXRvIDFlbQorICAgIC5jb2x1bW4KKyAgICAgIHAKKyAgICAgICAgbWFyZ2luLXRvcDogMAorCisjY29udGVudC5jb250ZXN0cworICAuY29udGFpbmVyLmluZm9ybWF0aW9uIAorICAgIC5jb2x1bW4ucmlnaHQgCisgICAgICAuYm94CisgICAgICAgIG1hcmdpbjogMWVtIDAKKyAgICAgIC5ib3gudmlkZW9zCisgICAgICAgIC50aHVtYm5haWwgaW1nIAorICAgICAgICAgIHdpZHRoOiAgICAgICAgIDIwMHB4CisgICAgICAgICAgaGVpZ2h0OiAgICAgICAgMTUwcHgKKyAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHgKKyAgICAgICAgYTpsaW5rLCBhOnZpc2l0ZWQKKyAgICAgICAgICBjb2xvcjogIzkzZDcwMAorICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZQorICAgICAgICBhOmhvdmVyCisgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKKyAgICAgIC5ib3gudm90ZXMgCisgICAgICAgIGEKKyAgICAgICAgICBkaXNwbGF5OiBibG9jaworICAgICAgICAgIHdpZHRoOiAgMjAwcHgKKyAgICAgICAgICBoZWlnaHQ6IDYwcHgKKyAgICAgICAgICBtYXJnaW46IDE1cHggMAorICAgICAgICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2J0bl92b3Rlbm93LmdpZikgbm8tcmVwZWF0CisgICAgICAgICAgdGV4dC1pbmRlbnQ6IC05OTk5cHgKKyAgICAgICAgICBvdXRsaW5lOiBub25lCisgICAgICAgICAgYm9yZGVyOiAgbm9uZQorICAgICAgICBoMgorICAgICAgICAgIG1hcmdpbjogIDUycHggMCAxMHB4IDAKKyAgICAgICAgICBwYWRkaW5nOiAwLjVlbQorICAgICAgICAgIGJhY2tncm91bmQ6ICM2ZTAwMGQgdXJsKC9pbWFnZXMvaGRyX3ZpZGVvc3RhdHMuZ2lmKSAycHggMnB4IG5vLXJlcGVhdAorICAgICAgICAgIHRleHQtaW5kZW50OiAtOTk5OXB4CisgICAgICAgICAgYm9yZGVyLXRvcDogNXB4IHNvbGlkICNhMjAwMTMKKworI2NvbnRlbnQuY29udGVzdHMgCisgIC5jb250YWluZXIudmlkZW8KKyAgICAuYm94LnZpZGVvcworICAgICAgaDIKKyAgICAgICAgbWFyZ2luOiAgMAorICAgICAgICBwYWRkaW5nOiAwLjVlbQorICAgICAgICBiYWNrZ3JvdW5kOiAjNmUwMDBkIHVybCgvaW1hZ2VzL2hkcl9uZXdlc3RjbGlwcy5naWYpIDJweCAycHggbm8tcmVwZWF0CisgICAgICAgIHRleHQtaW5kZW50OiAtOTk5OXB4CisgICAgICAgIGJvcmRlci10b3A6IDVweCBzb2xpZCAjYTIwMDEzCisgICAgICB0YWJsZQorICAgICAgICB3aWR0aDogMTAwCisgICAgICAgIHRkIAorICAgICAgICAgIHBhZGRpbmc6IDFlbQorICAgICAgICAgIHdpZHRoOiAyNQorICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3AKKyAgICAgICAgICBwCisgICAgICAgICAgICBtYXJnaW46IDAgMCA1cHggMAorICAgICAgICAgIGE6bGluaywgYTp2aXNpdGVkICAgIAorICAgICAgICAgICAgY29sb3I6ICM5M2Q3MDAKKyAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZQorICAgICAgICAgIGE6aG92ZXIKKyAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lCisgICAgICAudGh1bWJuYWlsCisgICAgICAgIGZsb2F0OiBsZWZ0CisgICAgICAgIGltZworICAgICAgICAgIHdpZHRoOiAgODBweAorICAgICAgICAgIGhlaWdodDogNjBweAorICAgICAgICAgIG1hcmdpbjogMCAxMHB4IDAgMAorICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM2ZTAwMGQKKworI2NvbnRlbnQgCisgIC5jb250YWluZXIuY29tbWVudHMgCisgICAgLmNvbHVtbgorICAgICAgbWFyZ2luLXRvcDogMTVweAorICAgIC5jb2x1bW4ubGVmdAorICAgICAgd2lkdGg6IDYwMHB4CisgICAgICAuYm94IAorICAgICAgICBvbAorICAgICAgICAgIG1hcmdpbjogIDAKKyAgICAgICAgICBwYWRkaW5nOiAwCisgICAgICAgIGxpCisgICAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lCisgICAgICAgICAgcGFkZGluZzogMTBweAorICAgICAgICAgIG1hcmdpbjogMCAwIDFlbSAwCisgICAgICAgICAgYmFja2dyb3VuZDogIzZlMDAwZAorICAgICAgICAgIGJvcmRlci10b3A6IDVweCBzb2xpZCAjYTIwMDEzCisgICAgICAgICAgZGl2CisgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxZW0KKyAgICAgICAgICB1bAorICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQKKyAgICAgICAgICAgIGxpCisgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZQorICAgICAgICAgICAgICBib3JkZXI6IG5vbmUKKyAgICAgICAgICAgICAgcGFkZGluZzogMAorICAgIC5jb2x1bW4ucmlnaHQKKyAgICAgIHdpZHRoOiAgICAgICAgMjkwcHgKKyAgICAgIHBhZGRpbmctbGVmdDogMTBweAorICAgICAgaDIKKyAgICAgICAgbWFyZ2luOiAwCisgICAgICAgIHBhZGRpbmc6IDAuNWVtCisgICAgICAgIGJhY2tncm91bmQ6ICM2ZTAwMGQgdXJsKC9pbWFnZXMvaGRyX2FkZGNvbW1lbnQuZ2lmKSAycHggMnB4IG5vLXJlcGVhdAorICAgICAgICB0ZXh0LWluZGVudDogLTk5OTlweAorICAgICAgICBib3JkZXItdG9wOiA1cHggc29saWQgI2EyMDAxMworICAgICAgLmJveAorICAgICAgICB0ZXh0YXJlYQorICAgICAgICAgIHdpZHRoOiAgMjkwcHgKKyAgICAgICAgICBoZWlnaHQ6IDEwMHB4CisgICAgICAgICAgYm9yZGVyOiBub25lCisKKyNmb290ZXIKKyAgbWFyZ2luLXRvcDogMTBweAorICBwYWRkaW5nOiAgICAxLjJlbSAxLjVlbQorICBiYWNrZ3JvdW5kOiAjZmY4NTAwCisgIHVsCisgICAgbWFyZ2luOiAwCisgICAgcGFkZGluZzogMAorICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZQorICAgIGxpCisgICAgICBkaXNwbGF5OiBpbmxpbmUKKyAgICAgIG1hcmdpbjogIDAgMC41ZW0KKyAgICAgIGNvbG9yOiAgICM0NDAwMDgKKyAgdWwubGlua3MKKyAgICBmbG9hdDogbGVmdAorICAgIGE6bGluaywgYTp2aXNpdGVkCisgICAgICBjb2xvcjogIzQ0MDAwOAorICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lCisgICAgYTpob3ZlcgorICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKKyAgdWwuY29weXJpZ2h0CisgICAgZmxvYXQ6IHJpZ2h0CisKKworLmNsZWFyIAorICBjbGVhcjogYm90aAorCisuY2VudGVyZWQgCisgIHRleHQtYWxpZ246IGNlbnRlcgorCitpbWcKKyAgYm9yZGVyOiBub25lCisKK2J1dHRvbi5zaG9ydCAKKyAgd2lkdGg6ICAgNjBweAorICBoZWlnaHQ6ICAyMnB4CisgIHBhZGRpbmc6IDAgMCAycHggMAorICBjb2xvcjogICAjZmZmCisgIGJvcmRlcjogIG5vbmUKKyAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYnRuX3Nob3J0LmdpZikgbm8tcmVwZWF0CisKK3RhYmxlCisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9jb21wcmVzc2VkLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvY29tcHJlc3NlZC5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODlkMGIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvY29tcHJlc3NlZC5zYXNzCkBAIC0wLDAgKzEsMTUgQEAKKyNtYWluCisgIHdpZHRoOiAxNWVtCisgIGNvbG9yOiAjMDAwMGZmCisgIHAKKyAgICBib3JkZXI6CisgICAgICBzdHlsZTogZG90dGVkCisgICAgICB3aWR0aDogMnB4CisgIC5jb29sCisgICAgd2lkdGg6IDEwMHB4CisKKyNsZWZ0CisgIGZvbnQ6CisgICAgc2l6ZTogMmVtCisgICAgd2VpZ2h0OiBib2xkCisgIGZsb2F0OiBsZWZ0CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvZG91YmxlX2ltcG9ydF9sb29wMS5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2RvdWJsZV9pbXBvcnRfbG9vcDEuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc3Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2RvdWJsZV9pbXBvcnRfbG9vcDEuc2FzcwpAQCAtMCwwICsxIEBACitAaW1wb3J0ICJkb3VibGVfaW1wb3J0X2xvb3AyIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9leHBhbmRlZC5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2V4cGFuZGVkLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmZDhlYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9leHBhbmRlZC5zYXNzCkBAIC0wLDAgKzEsMTcgQEAKKyNtYWluCisgIHdpZHRoOiAxNWVtCisgIGNvbG9yOiAjMDAwMGZmCisgIHAKKyAgICBib3JkZXI6CisgICAgICBzdHlsZTogZG90dGVkCisgICAgICAvKiBOZXN0ZWQgY29tbWVudAorICAgICAgICBNb3JlIG5lc3RlZCBzdHVmZgorICAgICAgd2lkdGg6IDJweAorICAuY29vbAorICAgIHdpZHRoOiAxMDBweAorCisjbGVmdAorICBmb250OgorICAgIHNpemU6IDJlbQorICAgIHdlaWdodDogYm9sZAorICBmbG9hdDogbGVmdApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ZpbGVuYW1lX2ZuLnNjc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvZmlsZW5hbWVfZm4uc2NzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNkNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ZpbGVuYW1lX2ZuLnNjc3MKQEAgLTAsMCArMSwxOCBAQAorQGltcG9ydCAiZmlsZW5hbWVfZm5faW1wb3J0IjsKKworQG1peGluIGxvY2FsLW1peGluIHsKKyAgbG9jYWwtbWl4aW46IGZpbGVuYW1lKCk7Cit9CisKK0BmdW5jdGlvbiBsb2NhbC1mdW5jdGlvbigpIHsKKyAgQHJldHVybiBmaWxlbmFtZSgpOworfQorCitmaWxlbmFtZSB7CisgIGxvY2FsOiBmaWxlbmFtZSgpOworICBAaW5jbHVkZSBsb2NhbC1taXhpbjsKKyAgbG9jYWwtZnVuY3Rpb246IGxvY2FsLWZ1bmN0aW9uKCk7CisKKyAgQGluY2x1ZGUgaW1wb3J0ZWQtbWl4aW47CisgIGltcG9ydGVkLWZ1bmN0aW9uOiBpbXBvcnRlZC1mdW5jdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2lmLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvaWYuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODdiZmYwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2lmLnNhc3MKQEAgLTAsMCArMSwxMSBAQAorYQorICBAaWYgdHJ1ZQorICAgIGJyYW5jaDogaWYKKyAgQGVsc2UKKyAgICBicmFuY2g6IGVsc2UKKworYgorICBAaWYgZmFsc2UKKyAgICBicmFuY2g6IGlmCisgIEBlbHNlCisgICAgYnJhbmNoOiBlbHNlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvaW1wb3J0LnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvaW1wb3J0LnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0MmRhMAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9pbXBvcnQuc2FzcwpAQCAtMCwwICsxLDEyIEBACiskcHJlY29uc3Q6IGhlbGxvCisKKz1wcmVtaXhpbgorICBwcmUtbWl4aW46IGhlcmUKKworQGltcG9ydCBpbXBvcnRlZS5zYXNzLCBzY3NzX2ltcG9ydGVlLCAiYmFzaWMuc2FzcyIsIGJhc2ljLmNzcywgLi4vcmVzdWx0cy9jb21wbGV4LmNzcworQGltcG9ydCBwYXJ0aWFsLnNhc3MKKworbm9uaW1wb3J0ZWQKKyAgbXljb25zdDogJHByZWNvbnN0CisgIG90aGVyY29uc3Q6ICRwb3N0Y29uc3QKKyAgK3Bvc3RtaXhpbgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ltcG9ydF9jaGFyc2V0LnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvaW1wb3J0X2NoYXJzZXQuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODU0NDdjCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ltcG9ydF9jaGFyc2V0LnNhc3MKQEAgLTAsMCArMSw5IEBACisuZm9vCisgIGE6IGIKKworQGltcG9ydCAiZm9vLmNzcyIKKworLy8gRXZlbiB0aG91Z2ggdGhlIGltcG9ydGVkIGZpbGUgaXMgaW4gSUJNODY2LAorLy8gc2luY2UgdGhlIHJvb3QgZmlsZSBpcyBpbiBVVEYtOC9BU0NJSQorLy8gdGhlIG91dHB1dCB3aWxsIGVuZCB1cCBiZWluZyBVVEYtOC4KK0BpbXBvcnQgImltcG9ydGVkX2NoYXJzZXRfaWJtODY2IgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ltcG9ydF9jaGFyc2V0X2libTg2Ni5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ltcG9ydF9jaGFyc2V0X2libTg2Ni5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NGU3MDIKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvaW1wb3J0X2NoYXJzZXRfaWJtODY2LnNhc3MKQEAgLTAsMCArMSwxMSBAQAorQGNoYXJzZXQgIklCTTg2NiIKKworLmZvbworICBhOiBiCisKK0BpbXBvcnQgImZvby5jc3MiCisKKy8vIEV2ZW4gdGhvdWdoIHRoZSBpbXBvcnRlZCBmaWxlIGlzIGluIFVURi04LAorLy8gc2luY2UgdGhlIHJvb3QgZmlsZSBpcyBpbiBJQk04NjYKKy8vIHRoZSBvdXRwdXQgd2lsbCBlbmQgdXAgYmVpbmcgSUJNODY2LgorQGltcG9ydCAiaW1wb3J0ZWRfY2hhcnNldF91dGY4IgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ltcG9ydF9jb250ZW50LnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvaW1wb3J0X2NvbnRlbnQuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWY4YWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ltcG9ydF9jb250ZW50LnNhc3MKQEAgLTAsMCArMSw0IEBACitAaW1wb3J0IGltcG9ydGVkX2NvbnRlbnQKKworQGluY2x1ZGUgZm9vCisgIGI6IGMKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9pbXBvcnRlZS5sZXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2ltcG9ydGVlLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwM2EwZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9pbXBvcnRlZS5sZXNzCkBAIC0wLDAgKzEsMiBAQAorLmZvbyAgICB7YTogYn0KKy5iYXIgKCkge2M6IGR9CmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvaW1wb3J0ZWUuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9pbXBvcnRlZS5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTBlMjAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvaW1wb3J0ZWUuc2FzcwpAQCAtMCwwICsxLDE5IEBACiskcG9zdGNvbnN0OiBnb29kYnllCisKKz1wb3N0bWl4aW4KKyAgcG9zdC1taXhpbjogaGVyZQorCitpbXBvcnRlZAorICBvdGhlcmNvbnN0OiAkcHJlY29uc3QKKyAgbXljb25zdDogJHBvc3Rjb25zdAorICArcHJlbWl4aW4KKworQGltcG9ydCBiYXNpYworCittaWRydWxlCisgIGludGhlOiBtaWRkbGUKKworPWNyYXp5bWl4aW4KKyAgZm9vOiBiYXIKKyAgYmF6CisgICAgYmxhdDogYmFuZwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2xpbmVfbnVtYmVycy5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL2xpbmVfbnVtYmVycy5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZmMxMDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbGluZV9udW1iZXJzLnNhc3MKQEAgLTAsMCArMSwxMyBAQAorZm9vCisgIGJhcjogYmF6CisKKz1wcmVtaXhpbgorICBzcXVnZ2xlCisgICAgYmxhdDogYmFuZworCiskcHJlY29uc3Q6IDEyCisKK0BpbXBvcnQgaW1wb3J0ZWUKKwordW1waAorICArY3JhenltaXhpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9taXhpbl9ib3JrLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbWl4aW5fYm9yay5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NGFjYjkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbWl4aW5fYm9yay5zYXNzCkBAIC0wLDAgKzEsNSBAQAorPW91dGVyLW1peGluCisgICtlcnJvci1taXhpbgorCitmb28KKyAgK291dGVyLW1peGluCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbWl4aW5zLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbWl4aW5zLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNTU5NwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9taXhpbnMuc2FzcwpAQCAtMCwwICsxLDc2IEBACiskeWVsbG93OiAjZmMwCisKKz1ib3JkZXJlZAorICBib3JkZXI6CisgICAgdG9wOgorICAgICAgd2lkdGg6IDJweAorICAgICAgY29sb3I6ICR5ZWxsb3cKKyAgICBsZWZ0OgorICAgICAgd2lkdGg6IDFweAorICAgICAgY29sb3I6ICMwMDAKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4CisKKz1oZWFkZXItZm9udAorICBjb2xvcjogI2YwMAorICBmb250OgorICAgIHNpemU6IDIwcHgKKworPWNvbXBvdW5kCisgICtoZWFkZXItZm9udAorICArYm9yZGVyZWQKKworPWNvbXBsZXgKKyAgK2hlYWRlci1mb250CisgIHRleHQ6CisgICAgZGVjb3JhdGlvbjogbm9uZQorICAmOmFmdGVyCisgICAgY29udGVudDogIi4iCisgICAgZGlzcGxheTogYmxvY2sKKyAgICBoZWlnaHQ6IDAKKyAgICBjbGVhcjogYm90aAorICAgIHZpc2liaWxpdHk6IGhpZGRlbgorICAqIGh0bWwgJgorICAgIGhlaWdodDogMXB4CisgICAgK2hlYWRlci1mb250Cis9ZGVlcAorICBhOmhvdmVyCisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKKyAgICArY29tcG91bmQKKworCisjbWFpbgorICB3aWR0aDogMTVlbQorICBjb2xvcjogIzAwMDBmZgorICBwCisgICAgK2JvcmRlcmVkCisgICAgYm9yZGVyOgorICAgICAgc3R5bGU6IGRvdHRlZAorICAgICAgd2lkdGg6IDJweAorICAuY29vbAorICAgIHdpZHRoOiAxMDBweAorCisjbGVmdAorICArYm9yZGVyZWQKKyAgZm9udDoKKyAgICBzaXplOiAyZW0KKyAgICB3ZWlnaHQ6IGJvbGQKKyAgZmxvYXQ6IGxlZnQKKworI3JpZ2h0CisgICtib3JkZXJlZAorICAraGVhZGVyLWZvbnQKKyAgZmxvYXQ6IHJpZ2h0CisKKy5ib3JkZXJlZAorICArYm9yZGVyZWQKKworLmNvbXBsZXgKKyAgK2NvbXBsZXgKKworLm1vcmUtY29tcGxleAorICArY29tcGxleAorICArZGVlcAorICBkaXNwbGF5OiBpbmxpbmUKKyAgLXdlYmtpdC1ub25zZW5zZToKKyAgICB0b3AtcmlnaHQ6IDFweAorICAgIGJvdHRvbS1sZWZ0OiAxcHgKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9tdWx0aWxpbmUuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9tdWx0aWxpbmUuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTdkYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL211bHRpbGluZS5zYXNzCkBAIC0wLDAgKzEsMjAgQEAKKyNtYWluLAorI2hlYWRlcgorICBoZWlnaHQ6IDUwcHgKKyAgZGl2CisgICAgd2lkdGg6IDEwMHB4CisgICAgYSwKKyAgICBlbQorICAgICAgc3BhbgorICAgICAgICBjb2xvcjogcGluaworCisjb25lLAorI3R3bywKKyN0aHJlZQorICBkaXYubmVzdGVkLAorICBzcGFuLm5lc3RlZCwKKyAgcC5uZXN0ZWQKKyAgICBmb250OgorICAgICAgd2VpZ2h0OiBib2xkCisgICAgYm9yZGVyLWNvbG9yOiByZWQKKyAgICBkaXNwbGF5OiBibG9jawpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL25lc3RlZC5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL25lc3RlZC5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDg3NTAKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkLnNhc3MKQEAgLTAsMCArMSwyNSBAQAorI21haW4KKyAgd2lkdGg6IDE1ZW0KKyAgY29sb3I6ICMwMDAwZmYKKyAgcAorICAgIGJvcmRlcjoKKyAgICAgIHN0eWxlOiBkb3R0ZWQKKyAgICAgIC8qIE5lc3RlZCBjb21tZW50CisgICAgICAgIE1vcmUgbmVzdGVkIHN0dWZmCisgICAgICB3aWR0aDogMnB4CisgIC5jb29sCisgICAgd2lkdGg6IDEwMHB4CisKKyNsZWZ0CisgIGZvbnQ6CisgICAgc2l6ZTogMmVtCisgICAgd2VpZ2h0OiBib2xkCisgIGZsb2F0OiBsZWZ0CisKKyNyaWdodAorICAuaGVhZGVyCisgICAgYm9yZGVyLXN0eWxlOiBzb2xpZAorICAuYm9keQorICAgIGJvcmRlci1zdHlsZTogZG90dGVkCisgIC5mb290ZXIKKyAgICBib3JkZXItc3R5bGU6IGRhc2hlZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL25lc3RlZF9ib3JrMS5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL25lc3RlZF9ib3JrMS5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODQ5NmUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkX2JvcmsxLnNhc3MKQEAgLTAsMCArMSwyIEBACisKK0BpbXBvcnQgYm9yazEKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9uZXN0ZWRfYm9yazIuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9uZXN0ZWRfYm9yazIuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGIwYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL25lc3RlZF9ib3JrMi5zYXNzCkBAIC0wLDAgKzEsMiBAQAorCitAaW1wb3J0IGJvcmsyCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkX2JvcmszLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkX2JvcmszLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjY2Q2NgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9uZXN0ZWRfYm9yazMuc2FzcwpAQCAtMCwwICsxLDIgQEAKKworQGltcG9ydCBib3JrMwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL25lc3RlZF9ib3JrNC5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL25lc3RlZF9ib3JrNC5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3M2M5NDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkX2Jvcms0LnNhc3MKQEAgLTAsMCArMSwyIEBACisKK0BpbXBvcnQgYm9yazQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9uZXN0ZWRfaW1wb3J0LnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkX2ltcG9ydC5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjQ4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkX2ltcG9ydC5zYXNzCkBAIC0wLDAgKzEsMiBAQAorLmZvbworICBAaW1wb3J0IGJhc2ljCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkX21peGluX2Jvcmsuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9uZXN0ZWRfbWl4aW5fYm9yay5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OWZkYzcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvbmVzdGVkX21peGluX2Jvcmsuc2FzcwpAQCAtMCwwICsxLDYgQEAKKworCis9ZXJyb3ItbWl4aW4KKyAgd2lkdGg6IDFweCAqIDFlbQorCitAaW1wb3J0IG1peGluX2JvcmsKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9vcHRpb25zLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvb3B0aW9ucy5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOWQzYzQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvb3B0aW9ucy5zYXNzCkBAIC0wLDAgKzEsMiBAQAorZm9vCisgIHN0eWxlOiBvcHRpb24oInN0eWxlIikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvcGFyZW50X3JlZi5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3BhcmVudF9yZWYuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzg4MjkwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3BhcmVudF9yZWYuc2FzcwpAQCAtMCwwICsxLDI1IEBACithCisgIGNvbG9yOiAjMDAwCisgICY6aG92ZXIKKyAgICBjb2xvcjogI2YwMAorCitwLCBkaXYKKyAgd2lkdGg6IDEwMGVtCisgICYgZm9vCisgICAgd2lkdGg6IDEwZW0KKyAgJjpob3ZlciwgYmFyCisgICAgaGVpZ2h0OiAyMGVtCisKKyNjb29sCisgIGJvcmRlcjoKKyAgICBzdHlsZTogc29saWQKKyAgICB3aWR0aDogMmVtCisgIC5pZTcgJiwgLmllNiAmCisgICAgY29udGVudDogc3RyaW5nKCJUb3RhbGx5IG5vdCBjb29sLiIpCisgIC5maXJlZm94ICYKKyAgICBjb250ZW50OiBzdHJpbmcoIlF1aXRlIGNvb2wuIikKKworLndvdywgLnNuYXp6eQorICBmb250LWZhbWlseTogZmFudGFzeQorICAmOmhvdmVyLCAmOnZpc2l0ZWQKKyAgICBmb250LXdlaWdodDogYm9sZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NhbWVfbmFtZV9kaWZmZXJlbnRfZXh0LnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc2FtZV9uYW1lX2RpZmZlcmVudF9leHQuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDBhOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NhbWVfbmFtZV9kaWZmZXJlbnRfZXh0LnNhc3MKQEAgLTAsMCArMSwyIEBACisuZm9vCisgIGV4dDogc2FzcwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NhbWVfbmFtZV9kaWZmZXJlbnRfZXh0LnNjc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc2FtZV9uYW1lX2RpZmZlcmVudF9leHQuc2NzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA5MGNlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NhbWVfbmFtZV9kaWZmZXJlbnRfZXh0LnNjc3MKQEAgLTAsMCArMSBAQAorLmZvbyB7ZXh0OiBzY3NzfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NhbWVfbmFtZV9kaWZmZXJlbnRfcGFydGlhbGl0eS5zY3NzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NhbWVfbmFtZV9kaWZmZXJlbnRfcGFydGlhbGl0eS5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTdkMDYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc2FtZV9uYW1lX2RpZmZlcmVudF9wYXJ0aWFsaXR5LnNjc3MKQEAgLTAsMCArMSBAQAorLmZvbyB7cGFydGlhbDogbm99ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NjcmlwdC5zYXNzIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NjcmlwdC5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDNiZGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc2NyaXB0LnNhc3MKQEAgLTAsMCArMSwxMDEgQEAKKyR3aWR0aDogMTBlbSArIDIwCiskY29sb3I6ICMwMGZmOTgKKyRtYWluX3RleHQ6ICNmZmEKKyRudW06IDEwCiskZGVjOiAxMC4yCiskZGVjXzA6IDk5LjAKKyRuZWc6IC0xMAorJGVzYzogMTBcKzEyCiskc3RyOiBIZWxsb1whCiskcXN0cjogIlF1b1widGVkXCIhIgorJGhzdHI6IEh5cGgtZW5cIQorJHNwYWNlOiAjezUgKyA0fSBoaSB0aGVyZQorJHBlcmNlbnQ6IDExJQorJGNvbXBsZXg6IDFweC8xZW0KKworI21haW4KKyAgY29udGVudDogJHN0cgorICBxc3RyOiAkcXN0cgorICBoc3RyOiAkaHN0cgorICB3aWR0aDogJHdpZHRoCisgIGJhY2tncm91bmQtY29sb3I6ICMwMDAKKyAgY29sb3I6ICRtYWluX3RleHQKKyAgc2hvcnQtY29sb3I6ICMxMjMKKyAgbmFtZWQtY29sb3I6IG9saXZlCisgIGNvbjogImZvbyIgYmFyICgkc3BhY2UgImJvb20iKQorICBjb24yOiAibm9xdW8iIHF1bworICAjc2lkZWJhcgorICAgIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcgorICAgIG51bToKKyAgICAgIG5vcm1hbDogJG51bQorICAgICAgZGVjOiAkZGVjCisgICAgICBkZWMwOiAkZGVjXzAKKyAgICAgIG5lZzogJG5lZworICAgIGVzYzogJGVzYworICAgIG1hbnk6IDEgKyAyICsgMworICAgIG9yZGVyOiAxICsgMiAqIDMKKyAgICBjb21wbGV4OiAoKDEgKyAyKSArIDE1KSsjM2E4YjlmICsgKGhpKygxICsxKyAyKSogICA0KQorCisjcGx1cworICBudW06CisgICAgbnVtOiA1KzIKKyAgICBudW0tdW46IDEwZW0gKyAxNWVtCisgICAgbnVtLXVuMjogMTAgKyAxM2VtCisgICAgbnVtLW5lZzogMTAgKyAtLjEzCisgICAgc3RyOiAxMDAgKiAxcHgKKyAgICBjb2w6IDEzICsgI2FhYQorICAgIHBlcmM6ICRwZXJjZW50ICsgMjAlCisgIHN0cjoKKyAgICBzdHI6ICJoaSIgKyAiXCB0aGVyZSIKKyAgICBzdHIyOiAiaGkiICsgIiB0aGVyZSIKKyAgICBjb2w6ICIxNGVtIHNvbGlkICIgKyAjMTIzCisgICAgbnVtOiAidGltZXM6ICIgKyAxMworICBjb2w6CisgICAgbnVtOiAjZjAyICsgMTIzLjUKKyAgICBjb2w6ICMxMkEgKyAjNDA1MTYyCisKKyNtaW51cworICBudW06CisgICAgbnVtOiA5MTIgLSAxMgorICBjb2w6CisgICAgbnVtOiAjZmZmZmZhIC0gNS4yCisgICAgY29sOiAjYWJjZGVmIC0gI2ZlZGNiYQorICB1bmFyeToKKyAgICBudW06IC0xCisgICAgY29uc3Q6IC0kbmVnCisgICAgcGFyZW46IC0oNSArIDYpCisgICAgdHdvOiAtLTEyCisgICAgbWFueTogLS0tLS0tLS0xMgorICAgIGNyYXp5OiAtLS0tLSg1ICsgLS0tJG5lZykKKworI3RpbWVzCisgIG51bToKKyAgICBudW06IDIgKiAzLjUKKyAgICBjb2w6IDIgKiAjM2E0YjVjCisgIGNvbDoKKyAgICBudW06ICMxMjQ2OGEgKiAwLjUKKyAgICBjb2w6ICMxMjEyMTIgKiAjMDIwMzA0CisgICAgCisjZGl2CisgIG51bToKKyAgICBudW06ICgxMCAvIDMuMCkKKyAgICBudW0yOiAoMTAgLyAzKQorICBjb2w6CisgICAgbnVtOiAjMTI0NjhhIC8gMgorICAgIGNvbDogI2FiY2RlZiAvICMwZjBmMGYKKyAgY29tcDogICRjb21wbGV4ICogMWVtCisKKyNtb2QKKyAgbnVtOgorICAgIG51bTogMTcgJSAzCisgIGNvbDoKKyAgICBjb2w6ICM1ZjZlN2QgJSAjMTAyMDBhCisgICAgbnVtOiAjYWFhYmFjICUgMworCisjY29uc3QKKyAgZXNjYXBlZDoKKyAgICBxdW90ZTogXCRmb28gXCFiYXIKKyAgZGVmYXVsdDogJHN0ciAhaW1wb3J0YW50CisKKyNyZWdyZXNzaW9uCisgIGE6ICgzICsgMikgLSAxCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc2Nzc19pbXBvcnQuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zY3NzX2ltcG9ydC5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzVjNzkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc2Nzc19pbXBvcnQuc2NzcwpAQCAtMCwwICsxLDEyIEBACiskcHJlY29uc3Q6IGhlbGxvOworCitAbWl4aW4gcHJlbWl4aW4ge3ByZS1taXhpbjogaGVyZX0KKworQGltcG9ydCAiaW1wb3J0ZWUuc2FzcyIsICJzY3NzX2ltcG9ydGVlIiwgImJhc2ljLnNhc3MiLCAiYmFzaWMuY3NzIiwgIi4uL3Jlc3VsdHMvY29tcGxleC5jc3MiOworQGltcG9ydCAicGFydFwKK2lhbC5zYXNzIjsKKworbm9uaW1wb3J0ZWQgeworICBteWNvbnN0OiAkcHJlY29uc3Q7CisgIG90aGVyY29uc3Q6ICRwb3N0Y29uc3Q7CisgIEBpbmNsdWRlIHBvc3RtaXhpbjsgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3Njc3NfaW1wb3J0ZWUuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zY3NzX2ltcG9ydGVlLnNjc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0OWU2OAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zY3NzX2ltcG9ydGVlLnNjc3MKQEAgLTAsMCArMSBAQAorc2NzcyB7aW1wb3J0ZWQ6IHllc30KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zaW5nbGVfaW1wb3J0X2xvb3Auc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zaW5nbGVfaW1wb3J0X2xvb3Auc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjUwMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3NpbmdsZV9pbXBvcnRfbG9vcC5zYXNzCkBAIC0wLDAgKzEgQEAKK0BpbXBvcnQgInNpbmdsZV9pbXBvcnRfbG9vcCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc3ViZGlyL2ltcG9ydF91cDEuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zdWJkaXIvaW1wb3J0X3VwMS5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNTU5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc3ViZGlyL2ltcG9ydF91cDEuc2NzcwpAQCAtMCwwICsxIEBACitAaW1wb3J0ICIuLi9zdWJkaXIvaW1wb3J0X3VwMi5zY3NzIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc3ViZGlyL2ltcG9ydF91cDIuc2NzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zdWJkaXIvaW1wb3J0X3VwMi5zY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjVhNTkKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc3ViZGlyL2ltcG9ydF91cDIuc2NzcwpAQCAtMCwwICsxIEBACitAaW1wb3J0ICIuLi9zdWJkaXIvaW1wb3J0X3VwMy5zY3NzIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc3ViZGlyL25lc3RlZF9zdWJkaXIvX25lc3RlZF9wYXJ0aWFsLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc3ViZGlyL25lc3RlZF9zdWJkaXIvX25lc3RlZF9wYXJ0aWFsLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwY2E1NQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zdWJkaXIvbmVzdGVkX3N1YmRpci9fbmVzdGVkX3BhcnRpYWwuc2FzcwpAQCAtMCwwICsxLDIgQEAKKyNuZXN0ZWQKKyAgcmVsYXRpdmU6IHRydWUKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zdWJkaXIvbmVzdGVkX3N1YmRpci9uZXN0ZWRfc3ViZGlyLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc3ViZGlyL25lc3RlZF9zdWJkaXIvbmVzdGVkX3N1YmRpci5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTg4NWYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvc3ViZGlyL25lc3RlZF9zdWJkaXIvbmVzdGVkX3N1YmRpci5zYXNzCkBAIC0wLDAgKzEsMyBAQAorI3BpCisgIHdpZHRoOiAzMTRweAorICAgIApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3N1YmRpci9zdWJkaXIuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zdWJkaXIvc3ViZGlyLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzYzU0YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy9zdWJkaXIvc3ViZGlyLnNhc3MKQEAgLTAsMCArMSw2IEBACitAaW1wb3J0IG5lc3RlZF9zdWJkaXIvbmVzdGVkX3BhcnRpYWwuc2FzcworCisjc3ViZGlyCisgIGZvbnQ6CisgICAgc2l6ZTogMjBweAorICAgIHdlaWdodDogYm9sZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3VuaXRzLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvdW5pdHMuc2FzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTAxZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3VuaXRzLnNhc3MKQEAgLTAsMCArMSwxMSBAQAorYgorICBmb286IDAuNSAqIDEwcHgKKyAgYmFyOiAxMHp6eiAqIDEycHggLyA1enp6CisgIGJhejogcGVyY2VudGFnZSgxMi4wcHggLyAxOHB4KQorICBtYW55LXVuaXRzOiAxMC4wenp6IC8gM3l5eSAqIDEycHggLyA1enp6ICogM3l5eSAvIDNweCAqIDRlbQorICBtbTogNW1tICsgMWNtCisgIHBjOiAxcGMgKyAxMnB0CisgIHB0OiA3MnB0IC0gMmluCisgIGluY2hlczogMWluICsgMi41NGNtCisgIG1vcmUtaW5jaGVzOiAxaW4gKyAoKDcycHQgKiAyaW4pICsgKDM2cHQgKiAxaW4pKSAvIDIuNTRjbQorICBtaXhlZDogKDEgKyAoMWVtICogNnB4IC8gM2luKSkgKiA0aW4gLyAyZW0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy93YXJuLnNhc3MgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvd2Fybi5zYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNGM0NGEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZW1wbGF0ZXMvd2Fybi5zYXNzCkBAIC0wLDAgKzEsMyBAQAorQHdhcm4gIkluIHRoZSBtYWluIGZpbGUiCitAaW1wb3J0IHdhcm5faW1wb3J0ZWQuc2FzcworK2VtaXRzLWEtd2FybmluZwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVtcGxhdGVzL3dhcm5faW1wb3J0ZWQuc2FzcyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy93YXJuX2ltcG9ydGVkLnNhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzYmQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3RlbXBsYXRlcy93YXJuX2ltcG9ydGVkLnNhc3MKQEAgLTAsMCArMSw0IEBACitAd2FybiAiSW1wb3J0ZWQiCisKKz1lbWl0cy1hLXdhcm5pbmcKKyAgQHdhcm4gIkluIGFuIGltcG9ydGVkIG1peGluIgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVzdF9oZWxwZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy90ZXN0X2hlbHBlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWE0MzNmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdGVzdF9oZWxwZXIucmIKQEAgLTAsMCArMSw4IEBACit0ZXN0X2RpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykKKyQ6LnVuc2hpZnQgdGVzdF9kaXIgdW5sZXNzICQ6LmluY2x1ZGU/KHRlc3RfZGlyKQorCitjbGFzcyBNaW5pVGVzdDo6VGVzdAorICBkZWYgYWJzb2x1dGl6ZShmaWxlKQorICAgIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vI3tmaWxlfSIpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy91dGlsL211bHRpYnl0ZV9zdHJpbmdfc2Nhbm5lcl90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdXRpbC9tdWx0aWJ5dGVfc3RyaW5nX3NjYW5uZXJfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZjMzODFmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdXRpbC9tdWx0aWJ5dGVfc3RyaW5nX3NjYW5uZXJfdGVzdC5yYgpAQCAtMCwwICsxLDE1MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vLi4vdGVzdF9oZWxwZXInCisKK2NsYXNzIE11bHRpYnl0ZVN0cmluZ1NjYW5uZXJUZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgZGVmIHNldHVwCisgICAgQHNjYW5uZXIgPSBTYXNzOjpVdGlsOjpNdWx0aWJ5dGVTdHJpbmdTY2FubmVyLm5ldygiY8O2bG9yZsO8bCIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2luaXRpYWwKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSAwLCAwLCBuaWwsIG5pbAorICBlbmQKKworICBkZWYgdGVzdF9jaGVjaworICAgIGFzc2VydF9lcXVhbCAnY8O2JywgQHNjYW5uZXIuY2hlY2soLy4uLykKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSAwLCAwLCAyLCAzCisgICAgYXNzZXJ0X2VxdWFsIDAsIEBzY2FubmVyLnBvcworICAgIGFzc2VydF9lcXVhbCAwLCBAc2Nhbm5lci5wb3MKKyAgICBhc3NlcnRfZXF1YWwgMiwgQHNjYW5uZXIubWF0Y2hlZF9zaXplCisgICAgYXNzZXJ0X2VxdWFsIDMsIEBzY2FubmVyLmJ5dGVfbWF0Y2hlZF9zaXplCisgIGVuZAorCisgIGRlZiB0ZXN0X2NoZWNrX3VudGlsCisgICAgYXNzZXJ0X2VxdWFsICdjw7Zsb3Jmw7wnLCBAc2Nhbm5lci5jaGVja191bnRpbCgvZi4vKQorICAgIGFzc2VydF9zY2FubmVyX3N0YXRlIDAsIDAsIDIsIDMKKyAgZW5kCisKKyAgZGVmIHRlc3RfZ2V0Y2gKKyAgICBhc3NlcnRfZXF1YWwgJ2MnLCBAc2Nhbm5lci5nZXRjaAorICAgIGFzc2VydF9lcXVhbCAnw7YnLCBAc2Nhbm5lci5nZXRjaAorICAgIGFzc2VydF9zY2FubmVyX3N0YXRlIDIsIDMsIDEsIDIKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWF0Y2g/CisgICAgYXNzZXJ0X2VxdWFsIDIsIEBzY2FubmVyLm1hdGNoPygvLi4vKQorICAgIGFzc2VydF9zY2FubmVyX3N0YXRlIDAsIDAsIDIsIDMKKyAgZW5kCisKKyAgZGVmIHRlc3RfcGVlaworICAgIGFzc2VydF9lcXVhbCAnY8O2JywgQHNjYW5uZXIucGVlaygyKQorICAgIGFzc2VydF9zY2FubmVyX3N0YXRlIDAsIDAsIG5pbCwgbmlsCisgIGVuZAorCisgIGRlZiB0ZXN0X3Jlc3Rfc2l6ZQorICAgIGFzc2VydF9lcXVhbCAnY8O2JywgQHNjYW5uZXIuc2NhbigvLi4vKQorICAgIGFzc2VydF9lcXVhbCA2LCBAc2Nhbm5lci5yZXN0X3NpemUKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2NhbgorICAgIGFzc2VydF9lcXVhbCAnY8O2JywgQHNjYW5uZXIuc2NhbigvLi4vKQorICAgIGFzc2VydF9zY2FubmVyX3N0YXRlIDIsIDMsIDIsIDMKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2Nhbl91bnRpbAorICAgIGFzc2VydF9lcXVhbCAnY8O2bG9yZsO8JywgQHNjYW5uZXIuc2Nhbl91bnRpbCgvZi4vKQorICAgIGFzc2VydF9zY2FubmVyX3N0YXRlIDcsIDksIDIsIDMKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2tpcAorICAgIGFzc2VydF9lcXVhbCAyLCBAc2Nhbm5lci5za2lwKC8uLi8pCisgICAgYXNzZXJ0X3NjYW5uZXJfc3RhdGUgMiwgMywgMiwgMworICBlbmQKKworICBkZWYgdGVzdF9za2lwX3VudGlsCisgICAgYXNzZXJ0X2VxdWFsIDcsIEBzY2FubmVyLnNraXBfdW50aWwoL2YuLykKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSA3LCA5LCAyLCAzCisgIGVuZAorCisgIGRlZiB0ZXN0X3NldF9wb3MKKyAgICBAc2Nhbm5lci5wb3MgPSA3CisgICAgYXNzZXJ0X3NjYW5uZXJfc3RhdGUgNywgOSwgbmlsLCBuaWwKKyAgICBAc2Nhbm5lci5wb3MgPSA2CisgICAgYXNzZXJ0X3NjYW5uZXJfc3RhdGUgNiwgNywgbmlsLCBuaWwKKyAgICBAc2Nhbm5lci5wb3MgPSAxCisgICAgYXNzZXJ0X3NjYW5uZXJfc3RhdGUgMSwgMSwgbmlsLCBuaWwKKyAgZW5kCisKKyAgZGVmIHRlc3RfcmVzZXQKKyAgICBAc2Nhbm5lci5zY2FuKC8uLi8pCisgICAgQHNjYW5uZXIucmVzZXQKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSAwLCAwLCBuaWwsIG5pbAorICBlbmQKKworICBkZWYgdGVzdF9zY2FuX2Z1bGwKKyAgICBhc3NlcnRfZXF1YWwgJ2PDticsIEBzY2FubmVyLnNjYW5fZnVsbCgvLi4vLCB0cnVlLCB0cnVlKQorICAgIGFzc2VydF9zY2FubmVyX3N0YXRlIDIsIDMsIDIsIDMKKworICAgIEBzY2FubmVyLnJlc2V0CisgICAgYXNzZXJ0X2VxdWFsICdjw7YnLCBAc2Nhbm5lci5zY2FuX2Z1bGwoLy4uLywgZmFsc2UsIHRydWUpCisgICAgYXNzZXJ0X3NjYW5uZXJfc3RhdGUgMCwgMCwgMiwgMworCisgICAgQHNjYW5uZXIucmVzZXQKKyAgICBhc3NlcnRfbmlsIEBzY2FubmVyLnNjYW5fZnVsbCgvLi4vLCB0cnVlLCBmYWxzZSkKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSAyLCAzLCAyLCAzCisKKyAgICBAc2Nhbm5lci5yZXNldAorICAgIGFzc2VydF9uaWwgQHNjYW5uZXIuc2Nhbl9mdWxsKC8uLi8sIGZhbHNlLCBmYWxzZSkKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSAwLCAwLCAyLCAzCisgIGVuZAorCisgIGRlZiB0ZXN0X3NlYXJjaF9mdWxsCisgICAgYXNzZXJ0X2VxdWFsICdjw7Zsb3Jmw7wnLCBAc2Nhbm5lci5zZWFyY2hfZnVsbCgvZi4vLCB0cnVlLCB0cnVlKQorICAgIGFzc2VydF9zY2FubmVyX3N0YXRlIDcsIDksIDIsIDMKKworICAgIEBzY2FubmVyLnJlc2V0CisgICAgYXNzZXJ0X2VxdWFsICdjw7Zsb3Jmw7wnLCBAc2Nhbm5lci5zZWFyY2hfZnVsbCgvZi4vLCBmYWxzZSwgdHJ1ZSkKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSAwLCAwLCAyLCAzCisKKyAgICBAc2Nhbm5lci5yZXNldAorICAgIGFzc2VydF9uaWwgQHNjYW5uZXIuc2VhcmNoX2Z1bGwoL2YuLywgdHJ1ZSwgZmFsc2UpCisgICAgYXNzZXJ0X3NjYW5uZXJfc3RhdGUgNywgOSwgMiwgMworCisgICAgQHNjYW5uZXIucmVzZXQKKyAgICBhc3NlcnRfbmlsIEBzY2FubmVyLnNlYXJjaF9mdWxsKC9mLi8sIGZhbHNlLCBmYWxzZSkKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSAwLCAwLCAyLCAzCisgIGVuZAorCisgIGRlZiB0ZXN0X3NldF9zdHJpbmcKKyAgICBAc2Nhbm5lci5zY2FuKC8uLi8pCisgICAgQHNjYW5uZXIuc3RyaW5nID0gJ2bDtsOzYsOicicKKyAgICBhc3NlcnRfc2Nhbm5lcl9zdGF0ZSAwLCAwLCBuaWwsIG5pbAorICBlbmQKKworICBkZWYgdGVzdF90ZXJtaW5hdGUKKyAgICBAc2Nhbm5lci5zY2FuKC8uLi8pCisgICAgQHNjYW5uZXIudGVybWluYXRlCisgICAgYXNzZXJ0X3NjYW5uZXJfc3RhdGUgOCwgMTAsIG5pbCwgbmlsCisgIGVuZAorCisgIGRlZiB0ZXN0X3Vuc2NhbgorICAgIEBzY2FubmVyLnNjYW4oLy4uLykKKyAgICBAc2Nhbm5lci5zY2FuX3VudGlsKC9mLi8pCisgICAgQHNjYW5uZXIudW5zY2FuCisgICAgYXNzZXJ0X3NjYW5uZXJfc3RhdGUgMiwgMywgbmlsLCBuaWwKKyAgZW5kCisKKyAgcHJpdmF0ZQorCisgIGRlZiBhc3NlcnRfc2Nhbm5lcl9zdGF0ZShwb3MsIGJ5dGVfcG9zLCBtYXRjaGVkX3NpemUsIGJ5dGVfbWF0Y2hlZF9zaXplKQorICAgIGFzc2VydF9lcXVhbCBwb3MsIEBzY2FubmVyLnBvcywgJ3BvcycKKyAgICBhc3NlcnRfZXF1YWwgYnl0ZV9wb3MsIEBzY2FubmVyLmJ5dGVfcG9zLCAnYnl0ZV9wb3MnCisgICAgaWYgbWF0Y2hlZF9zaXplLm5pbD8KKyAgICAgIGFzc2VydF9uaWwgQHNjYW5uZXIubWF0Y2hlZF9zaXplLCAnbWF0Y2hlZF9zaXplJworICAgIGVsc2UKKyAgICAgIGFzc2VydF9lcXVhbCBtYXRjaGVkX3NpemUsIEBzY2FubmVyLm1hdGNoZWRfc2l6ZSwgJ21hdGNoZWRfc2l6ZScKKyAgICBlbmQKKyAgICBpZiBieXRlX21hdGNoZWRfc2l6ZS5uaWw/CisgICAgICBhc3NlcnRfbmlsIEBzY2FubmVyLmJ5dGVfbWF0Y2hlZF9zaXplLCAnYnl0ZV9tYXRjaGVkX3NpemUnCisgICAgZWxzZQorICAgICAgYXNzZXJ0X2VxdWFsIGJ5dGVfbWF0Y2hlZF9zaXplLCBAc2Nhbm5lci5ieXRlX21hdGNoZWRfc2l6ZSwgJ2J5dGVfbWF0Y2hlZF9zaXplJworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdXRpbC9ub3JtYWxpemVkX21hcF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdXRpbC9ub3JtYWxpemVkX21hcF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4MmY1MTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy91dGlsL25vcm1hbGl6ZWRfbWFwX3Rlc3QucmIKQEAgLTAsMCArMSw1MCBAQAorcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi8uLi90ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3Nhc3MvdXRpbC9ub3JtYWxpemVkX21hcCcKKworY2xhc3MgTm9ybWFsaXplZE1hcFRlc3QgPCBNaW5pVGVzdDo6VGVzdAorICBleHRlbmQgUHVibGljQXBpTGludGVyCisKKyAgbGludF9hcGkgSGFzaCwgU2Fzczo6VXRpbDo6Tm9ybWFsaXplZE1hcAorCisgIGRlZiBsaW50X2luc3RhbmNlCisgICAgU2Fzczo6VXRpbDo6Tm9ybWFsaXplZE1hcC5uZXcKKyAgZW5kCisKKyAgZGVmIHRlc3Rfbm9ybWFsaXplZF9tYXBfZXJyb3JzX3VubGVzc19leHBsaWNpdGx5X2ltcGxlbWVudGVkCisgICAgYXNzZXJ0IFNhc3MudGVzdHNfcnVubmluZworICAgIGFzc2VydF9yYWlzZV9tZXNzYWdlKEFyZ3VtZW50RXJyb3IsICJUaGUgbWV0aG9kIGludmVydCBtdXN0IGJlIGltcGxlbWVudGVkIGV4cGxpY2l0bHkiKSBkbworICAgICAgU2Fzczo6VXRpbDo6Tm9ybWFsaXplZE1hcC5uZXcuaW52ZXJ0CisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X25vcm1hbGl6ZWRfbWFwX2RvZXNfbm90X2Vycm9yX3doZW5fcmVsZWFzZWQKKyAgICBTYXNzLnRlc3RzX3J1bm5pbmcgPSBmYWxzZQorICAgIGFzc2VydF9lcXVhbCh7fSwgU2Fzczo6VXRpbDo6Tm9ybWFsaXplZE1hcC5uZXcuaW52ZXJ0KQorICBlbnN1cmUKKyAgICBTYXNzLnRlc3RzX3J1bm5pbmcgPSB0cnVlCisgIGVuZAorCisgIGRlZiB0ZXN0X2Jhc2ljX2xpZmVjeWNsZQorICAgIG0gPSBTYXNzOjpVdGlsOjpOb3JtYWxpemVkTWFwLm5ldworICAgIG1bImEtYiJdID0gMQorICAgIGFzc2VydF9lcXVhbCBbImFfYiJdLCBtLmtleXMKKyAgICBhc3NlcnRfZXF1YWwgMSwgbVsiYV9iIl0KKyAgICBhc3NlcnRfZXF1YWwgMSwgbVsiYS1iIl0KKyAgICBhc3NlcnQgbS5oYXNfa2V5PygiYV9iIikKKyAgICBhc3NlcnQgbS5oYXNfa2V5PygiYS1iIikKKyAgICBhc3NlcnRfZXF1YWwoeyJhLWIiID0+IDF9LCBtLmFzX3N0b3JlZCkKKyAgICBhc3NlcnRfZXF1YWwgMSwgbS5kZWxldGUoImEtYiIpCisgICAgYXNzZXJ0ICFtLmhhc19rZXk/KCJhLWIiKQorICAgIG1bImFfYiJdID0gMgorICAgIGFzc2VydF9lcXVhbCh7ImFfYiIgPT4gMn0sIG0uYXNfc3RvcmVkKQorICBlbmQKKworICBkZWYgdGVzdF9kdXAKKyAgICBtID0gU2Fzczo6VXRpbDo6Tm9ybWFsaXplZE1hcC5uZXcKKyAgICBtWyJhLWIiXSA9IDEKKyAgICBtMiA9IG0uZHVwCisgICAgbS5kZWxldGUoImEtYiIpCisgICAgYXNzZXJ0ICFtLmhhc19rZXk/KCJhLWIiKQorICAgIGFzc2VydCBtMi5oYXNfa2V5PygiYS1iIikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3V0aWwvc3Vic2V0X21hcF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdXRpbC9zdWJzZXRfbWFwX3Rlc3QucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWE5ODIwMwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3V0aWwvc3Vic2V0X21hcF90ZXN0LnJiCkBAIC0wLDAgKzEsOTAgQEAKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vLi4vdGVzdF9oZWxwZXInCisKK2NsYXNzIFN1YnNldE1hcFRlc3QgPCBNaW5pVGVzdDo6VGVzdAorICBkZWYgc2V0dXAKKyAgICBAc3NtID0gU2Fzczo6VXRpbDo6U3Vic2V0TWFwLm5ldworICAgIEBzc21bU2V0WzEsIDJdXSA9ICJGb28iCisgICAgQHNzbVtTZXRbImZpenoiLCAiZmF6eiJdXSA9ICJCYXIiCisKKyAgICBAc3NtW1NldFs6Zm9vLCA6YmFyXV0gPSAiQmF6IgorICAgIEBzc21bU2V0Wzpmb28sIDpiYXIsIDpiYXpdXSA9ICJCYW5nIgorCisgICAgQHNzbVtTZXRbOmJpcCwgOmJvcCwgOmJsaXBdXSA9ICJRdXgiCisgICAgQHNzbVtTZXRbOmJpcCwgOmJvcF1dID0gIlRocmFtIgorICBlbmQKKworICBkZWYgdGVzdF9lcXVhbF9rZXlzCisgICAgYXNzZXJ0X2VxdWFsIFtbIkZvbyIsIFNldFsxLCAyXV1dLCBAc3NtLmdldChTZXRbMSwgMl0pCisgICAgYXNzZXJ0X2VxdWFsIFtbIkJhciIsIFNldFsiZml6eiIsICJmYXp6Il1dXSwgQHNzbS5nZXQoU2V0WyJmaXp6IiwgImZhenoiXSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3Vic2V0X2tleXMKKyAgICBhc3NlcnRfZXF1YWwgW1siRm9vIiwgU2V0WzEsIDJdXV0sIEBzc20uZ2V0KFNldFsxLCAyLCAiZnV6eiJdKQorICAgIGFzc2VydF9lcXVhbCBbWyJCYXIiLCBTZXRbImZpenoiLCAiZmF6eiJdXV0sIEBzc20uZ2V0KFNldFsiZml6eiIsICJmYXp6IiwgM10pCisgIGVuZAorCisgIGRlZiB0ZXN0X3N1cGVyc2V0X2tleXMKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBzc20uZ2V0KFNldFsxXSkKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBzc20uZ2V0KFNldFsyXSkKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBzc20uZ2V0KFNldFsiZml6eiJdKQorICAgIGFzc2VydF9lcXVhbCBbXSwgQHNzbS5nZXQoU2V0WyJmYXp6Il0pCisgIGVuZAorCisgIGRlZiB0ZXN0X2Rpc2pvaW50X2tleXMKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBzc20uZ2V0KFNldFszLCA0XSkKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBzc20uZ2V0KFNldFsiZnV6eiIsICJmcml6eiJdKQorICAgIGFzc2VydF9lcXVhbCBbXSwgQHNzbS5nZXQoU2V0WyJncmFuIiwgMTVdKQorICBlbmQKKworICBkZWYgdGVzdF9zZW1pX2Rpc2pvaW50X2tleXMKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBzc20uZ2V0KFNldFsyLCAzXSkKKyAgICBhc3NlcnRfZXF1YWwgW10sIEBzc20uZ2V0KFNldFsiZml6eiIsICJmdXp6Il0pCisgICAgYXNzZXJ0X2VxdWFsIFtdLCBAc3NtLmdldChTZXRbMSwgImZhenoiXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW1wdHlfa2V5X3NldAorICAgIGFzc2VydF9yYWlzZXMoQXJndW1lbnRFcnJvcikge0Bzc21bU2V0W11dID0gIkZhaWwifQorICBlbmQKKworICBkZWYgdGVzdF9lbXB0eV9rZXlfZ2V0CisgICAgYXNzZXJ0X2VxdWFsIFtdLCBAc3NtLmdldChTZXRbXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlwbGVfc3Vic2V0cworICAgIGFzc2VydF9lcXVhbCBbWyJGb28iLCBTZXRbMSwgMl1dLCBbIkJhciIsIFNldFsiZml6eiIsICJmYXp6Il1dXSwgQHNzbS5nZXQoU2V0WzEsIDIsICJmaXp6IiwgImZhenoiXSkKKyAgICBhc3NlcnRfZXF1YWwgW1siRm9vIiwgU2V0WzEsIDJdXSwgWyJCYXIiLCBTZXRbImZpenoiLCAiZmF6eiJdXV0sIEBzc20uZ2V0KFNldFsxLCAyLCAzLCAiZml6eiIsICJmYXp6IiwgImZ1enoiXSkKKworICAgIGFzc2VydF9lcXVhbCBbWyJCYXoiLCBTZXRbOmZvbywgOmJhcl1dXSwgQHNzbS5nZXQoU2V0Wzpmb28sIDpiYXJdKQorICAgIGFzc2VydF9lcXVhbCBbWyJCYXoiLCBTZXRbOmZvbywgOmJhcl1dLCBbIkJhbmciLCBTZXRbOmZvbywgOmJhciwgOmJhel1dXSwgQHNzbS5nZXQoU2V0Wzpmb28sIDpiYXIsIDpiYXpdKQorICBlbmQKKworICBkZWYgdGVzdF9icmFja2V0X2JyYWNrZXQKKyAgICBhc3NlcnRfZXF1YWwgWyJGb28iXSwgQHNzbVtTZXRbMSwgMiwgImZ1enoiXV0KKyAgICBhc3NlcnRfZXF1YWwgWyJCYXoiLCAiQmFuZyJdLCBAc3NtW1NldFs6Zm9vLCA6YmFyLCA6YmF6XV0KKyAgZW5kCisKKyAgZGVmIHRlc3Rfb3JkZXJfcHJlc2VydmVkCisgICAgQHNzbVtTZXRbMTAsIDExLCAxMl1dID0gMQorICAgIEBzc21bU2V0WzEwLCAxMV1dID0gMgorICAgIEBzc21bU2V0WzExXV0gPSAzCisgICAgQHNzbVtTZXRbMTEsIDEyXV0gPSA0CisgICAgQHNzbVtTZXRbOSwgMTAsIDExLCAxMiwgMTNdXSA9IDUKKyAgICBAc3NtW1NldFsxMCwgMTNdXSA9IDYKKworICAgIGFzc2VydF9lcXVhbCgKKyAgICAgIFtbMSwgU2V0WzEwLCAxMSwgMTJdXSwgWzIsIFNldFsxMCwgMTFdXSwgWzMsIFNldFsxMV1dLCBbNCwgU2V0WzExLCAxMl1dLAorICAgICAgICBbNSwgU2V0WzksIDEwLCAxMSwgMTIsIDEzXV0sIFs2LCBTZXRbMTAsIDEzXV1dLAorICAgICAgQHNzbS5nZXQoU2V0WzksIDEwLCAxMSwgMTIsIDEzXSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpcGxlX2VxdWFsX3ZhbHVlcworICAgIEBzc21bU2V0WzExLCAxMl1dID0gMQorICAgIEBzc21bU2V0WzEyLCAxM11dID0gMgorICAgIEBzc21bU2V0WzEzLCAxNF1dID0gMQorICAgIEBzc21bU2V0WzE0LCAxNV1dID0gMQorCisgICAgYXNzZXJ0X2VxdWFsKAorICAgICAgW1sxLCBTZXRbMTEsIDEyXV0sIFsyLCBTZXRbMTIsIDEzXV0sIFsxLCBTZXRbMTMsIDE0XV0sIFsxLCBTZXRbMTQsIDE1XV1dLAorICAgICAgQHNzbS5nZXQoU2V0WzExLCAxMiwgMTMsIDE0LCAxNV0pKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdXRpbF90ZXN0LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdXRpbF90ZXN0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0NTRkNGMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3Qvc2Fzcy91dGlsX3Rlc3QucmIKQEAgLTAsMCArMSw0MDMgQEAKK3JlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vdGVzdF9oZWxwZXInCityZXF1aXJlICdwYXRobmFtZScKK3JlcXVpcmUgJ3RtcGRpcicKKworY2xhc3MgVXRpbFRlc3QgPCBNaW5pVGVzdDo6VGVzdAorICBpbmNsdWRlIFNhc3M6OlV0aWwKKworICBkZWYgdGVzdF9zY29wZQorICAgIGFzc2VydChGaWxlLmV4aXN0PyhzY29wZSgiUmFrZWZpbGUiKSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF9rZXlzCisgICAgYXNzZXJ0X2VxdWFsKHsKKyAgICAgICAgImZvbyIgPT4gMSwKKyAgICAgICAgImJhciIgPT4gMiwKKyAgICAgICAgImJheiIgPT4gMworICAgICAgfSwgbWFwX2tleXMoezpmb28gPT4gMSwgOmJhciA9PiAyLCA6YmF6ID0+IDN9KSB7fGt8IGsudG9fc30pCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF92YWxzCisgICAgYXNzZXJ0X2VxdWFsKHsKKyAgICAgICAgOmZvbyA9PiAiMSIsCisgICAgICAgIDpiYXIgPT4gIjIiLAorICAgICAgICA6YmF6ID0+ICIzIgorICAgICAgfSwgbWFwX3ZhbHMoezpmb28gPT4gMSwgOmJhciA9PiAyLCA6YmF6ID0+IDN9KSB7fGt8IGsudG9fc30pCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF9oYXNoCisgICAgYXNzZXJ0X2VxdWFsKHsKKyAgICAgICAgImZvbyIgPT4gIjEiLAorICAgICAgICAiYmFyIiA9PiAiMiIsCisgICAgICAgICJiYXoiID0+ICIzIgorICAgICAgfSwgbWFwX2hhc2goezpmb28gPT4gMSwgOmJhciA9PiAyLCA6YmF6ID0+IDN9KSB7fGssIHZ8IFtrLnRvX3MsIHYudG9fc119KQorICBlbmQKKworICBkZWYgdGVzdF9tYXBfaGFzaF93aXRoX25vcm1hbGl6ZWRfbWFwCisgICAgbWFwID0gTm9ybWFsaXplZE1hcC5uZXcoImZvby1iYXIiID0+IDEsICJiYXpfYmFuZyIgPT4gMikKKyAgICByZXN1bHQgPSBtYXBfaGFzaChtYXApIHt8aywgdnwgW2ssIHYudG9fc119CisgICAgYXNzZXJ0X2VxdWFsKCIxIiwgcmVzdWx0WyJmb28tYmFyIl0pCisgICAgYXNzZXJ0X2VxdWFsKCIxIiwgcmVzdWx0WyJmb29fYmFyIl0pCisgICAgYXNzZXJ0X2VxdWFsKCIyIiwgcmVzdWx0WyJiYXotYmFuZyJdKQorICAgIGFzc2VydF9lcXVhbCgiMiIsIHJlc3VsdFsiYmF6X2JhbmciXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfcG93ZXJzZXQKKyAgICBhc3NlcnRfZXF1YWwoW1tdLnRvX3NldF0udG9fc2V0LAorICAgICAgcG93ZXJzZXQoW10pKQorICAgIGFzc2VydF9lcXVhbChbW10udG9fc2V0LCBbMV0udG9fc2V0XS50b19zZXQsCisgICAgICBwb3dlcnNldChbMV0pKQorICAgIGFzc2VydF9lcXVhbChbW10udG9fc2V0LCBbMV0udG9fc2V0LCBbMl0udG9fc2V0LCBbMSwgMl0udG9fc2V0XS50b19zZXQsCisgICAgICBwb3dlcnNldChbMSwgMl0pKQorICAgIGFzc2VydF9lcXVhbChbW10udG9fc2V0LCBbMV0udG9fc2V0LCBbMl0udG9fc2V0LCBbM10udG9fc2V0LAorICAgICAgICBbMSwgMl0udG9fc2V0LCBbMiwgM10udG9fc2V0LCBbMSwgM10udG9fc2V0LCBbMSwgMiwgM10udG9fc2V0XS50b19zZXQsCisgICAgICBwb3dlcnNldChbMSwgMiwgM10pKQorICBlbmQKKworICBkZWYgdGVzdF9yZXN0cmljdAorICAgIGFzc2VydF9lcXVhbCgwLjUsIHJlc3RyaWN0KDAuNSwgMC4uMSkpCisgICAgYXNzZXJ0X2VxdWFsKDEsIHJlc3RyaWN0KDIsIDAuLjEpKQorICAgIGFzc2VydF9lcXVhbCgxLjMsIHJlc3RyaWN0KDIsIDAuLjEuMykpCisgICAgYXNzZXJ0X2VxdWFsKDAsIHJlc3RyaWN0KC0xLCAwLi4xKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWVyZ2VfYWRqYWNlbnRfc3RyaW5ncworICAgIGFzc2VydF9lcXVhbChbImZvbyBiYXIgYmF6IiwgOmJhbmcsICJiaXogYm9wIiwgMTJdLAorICAgICAgbWVyZ2VfYWRqYWNlbnRfc3RyaW5ncyhbImZvbyAiLCAiYmFyICIsICJiYXoiLCA6YmFuZywgImJpeiIsICIgYm9wIiwgMTJdKSkKKyAgICBzdHIgPSAiZm9vIgorICAgIGFzc2VydF9lcXVhbChbImZvbyBmb28gZm9vIiwgOmJhbmcsICJmb28gZm9vIiwgMTJdLAorICAgICAgbWVyZ2VfYWRqYWNlbnRfc3RyaW5ncyhbc3RyLCAiICIsIHN0ciwgIiAiLCBzdHIsIDpiYW5nLCBzdHIsICIgIiwgc3RyLCAxMl0pKQorICBlbmQKKworICBkZWYgdGVzdF9yZXBsYWNlX3N1YnNlcQorICAgIGFzc2VydF9lcXVhbChbMSwgMiwgOmEsIDpiLCA1XSwKKyAgICAgIHJlcGxhY2Vfc3Vic2VxKFsxLCAyLCAzLCA0LCA1XSwgWzMsIDRdLCBbOmEsIDpiXSkpCisgICAgYXNzZXJ0X2VxdWFsKFsxLCAyLCAzLCA0LCA1XSwKKyAgICAgIHJlcGxhY2Vfc3Vic2VxKFsxLCAyLCAzLCA0LCA1XSwgWzMsIDQsIDZdLCBbOmEsIDpiXSkpCisgICAgYXNzZXJ0X2VxdWFsKFsxLCAyLCAzLCA0LCA1XSwKKyAgICAgIHJlcGxhY2Vfc3Vic2VxKFsxLCAyLCAzLCA0LCA1XSwgWzQsIDUsIDZdLCBbOmEsIDpiXSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X2ludGVyc3BlcnNlCisgICAgYXNzZXJ0X2VxdWFsKFsiZm9vIiwgIiAiLCAiYmFyIiwgIiAiLCAiYmF6Il0sCisgICAgICBpbnRlcnNwZXJzZSgld1tmb28gYmFyIGJhel0sICIgIikpCisgICAgYXNzZXJ0X2VxdWFsKFtdLCBpbnRlcnNwZXJzZShbXSwgIiAiKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3Vic3RpdHV0ZQorICAgIGFzc2VydF9lcXVhbChbImZvbyIsICJiYXIiLCAiYmF6IiwgMywgNF0sCisgICAgICBzdWJzdGl0dXRlKFsxLCAyLCAzLCA0XSwgWzEsIDJdLCBbImZvbyIsICJiYXIiLCAiYmF6Il0pKQorICAgIGFzc2VydF9lcXVhbChbMSwgImZvbyIsICJiYXIiLCAiYmF6IiwgNF0sCisgICAgICBzdWJzdGl0dXRlKFsxLCAyLCAzLCA0XSwgWzIsIDNdLCBbImZvbyIsICJiYXIiLCAiYmF6Il0pKQorICAgIGFzc2VydF9lcXVhbChbMSwgMiwgImZvbyIsICJiYXIiLCAiYmF6Il0sCisgICAgICBzdWJzdGl0dXRlKFsxLCAyLCAzLCA0XSwgWzMsIDRdLCBbImZvbyIsICJiYXIiLCAiYmF6Il0pKQorCisgICAgYXNzZXJ0X2VxdWFsKFsxLCAiZm9vIiwgImJhciIsICJiYXoiLCAyLCAzLCA0XSwKKyAgICAgIHN1YnN0aXR1dGUoWzEsIDIsIDIsIDIsIDMsIDRdLCBbMiwgMl0sIFsiZm9vIiwgImJhciIsICJiYXoiXSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmlwX3N0cmluZ19hcnJheQorICAgIGFzc2VydF9lcXVhbChbImZvbyAiLCAiIGJhciAiLCAiIGJheiJdLAorICAgICAgc3RyaXBfc3RyaW5nX2FycmF5KFsiIGZvbyAiLCAiIGJhciAiLCAiIGJheiAiXSkpCisgICAgYXNzZXJ0X2VxdWFsKFs6Zm9vLCAiIGJhciAiLCAiIGJheiJdLAorICAgICAgc3RyaXBfc3RyaW5nX2FycmF5KFs6Zm9vLCAiIGJhciAiLCAiIGJheiAiXSkpCisgICAgYXNzZXJ0X2VxdWFsKFsiZm9vICIsICIgYmFyICIsIDpiYXpdLAorICAgICAgc3RyaXBfc3RyaW5nX2FycmF5KFsiIGZvbyAiLCAiIGJhciAiLCA6YmF6XSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X3BhdGhzCisgICAgYXNzZXJ0X2VxdWFsKFtbMSwgMywgNV0sIFsyLCAzLCA1XSwgWzEsIDQsIDVdLCBbMiwgNCwgNV1dLAorICAgICAgcGF0aHMoW1sxLCAyXSwgWzMsIDRdLCBbNV1dKSkKKyAgICBhc3NlcnRfZXF1YWwoW1tdXSwgcGF0aHMoW10pKQorICAgIGFzc2VydF9lcXVhbChbWzEsIDIsIDNdXSwgcGF0aHMoW1sxXSwgWzJdLCBbM11dKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGNzCisgICAgYXNzZXJ0X2VxdWFsKFsxLCAyLCAzXSwgbGNzKFsxLCAyLCAzXSwgWzEsIDIsIDNdKSkKKyAgICBhc3NlcnRfZXF1YWwoW10sIGxjcyhbXSwgWzEsIDIsIDNdKSkKKyAgICBhc3NlcnRfZXF1YWwoW10sIGxjcyhbMSwgMiwgM10sIFtdKSkKKyAgICBhc3NlcnRfZXF1YWwoWzEsIDIsIDNdLCBsY3MoWzUsIDEsIDQsIDIsIDMsIDE3XSwgWzAsIDAsIDEsIDIsIDYsIDNdKSkKKworICAgIGFzc2VydF9lcXVhbChbMV0sIGxjcyhbMSwgMiwgMywgNF0sIFs0LCAzLCAyLCAxXSkpCisgICAgYXNzZXJ0X2VxdWFsKFsxLCAyXSwgbGNzKFsxLCAyLCAzLCA0XSwgWzMsIDQsIDEsIDJdKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGNzX3dpdGhfYmxvY2sKKyAgICBhc3NlcnRfZXF1YWwoWyIxIiwgIjIiLCAiMyJdLAorICAgICAgbGNzKFsxLCA0LCAyLCA1LCAzXSwgWzEsIDIsIDNdKSB7fGEsIGJ8IGEgPT0gYiAmJiBhLnRvX3N9KQorICAgIGFzc2VydF9lcXVhbChbLTQsIDIsIDhdLAorICAgICAgbGNzKFstNSwgMywgMiwgOF0sIFstNCwgMSwgOF0pIHt8YSwgYnwgKGEgLSBiKS5hYnMgPD0gMSAmJiBbYSwgYl0ubWF4fSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3Vic2VxdWVuY2UKKyAgICBhc3NlcnQoc3Vic2VxdWVuY2U/KFsxLCAyLCAzXSwgWzEsIDIsIDNdKSkKKyAgICBhc3NlcnQoc3Vic2VxdWVuY2U/KFsxLCAyLCAzXSwgWzEsIDphLCAyLCA6YiwgM10pKQorICAgIGFzc2VydChzdWJzZXF1ZW5jZT8oWzEsIDIsIDNdLCBbOmEsIDEsIDpiLCA6YywgMiwgOmQsIDMsIDplLCA6Zl0pKQorCisgICAgYXNzZXJ0KCFzdWJzZXF1ZW5jZT8oWzEsIDIsIDNdLCBbMSwgMl0pKQorICAgIGFzc2VydCghc3Vic2VxdWVuY2U/KFsxLCAyLCAzXSwgWzEsIDMsIDJdKSkKKyAgICBhc3NlcnQoIXN1YnNlcXVlbmNlPyhbMSwgMiwgM10sIFszLCAyLCAxXSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X3NpbGVuY2Vfd2FybmluZ3MKKyAgICBvbGRfc3RkZXJyLCAkc3RkZXJyID0gJHN0ZGVyciwgU3RyaW5nSU8ubmV3CisgICAgd2FybiAiT3V0IgorICAgIGFzc2VydF9lcXVhbCgiT3V0XG4iLCAkc3RkZXJyLnN0cmluZykKKyAgICBzaWxlbmNlX3dhcm5pbmdzIHt3YXJuICJJbiJ9CisgICAgYXNzZXJ0X2VxdWFsKCJPdXRcbiIsICRzdGRlcnIuc3RyaW5nKQorICBlbnN1cmUKKyAgICAkc3RkZXJyID0gb2xkX3N0ZGVycgorICBlbmQKKworICBkZWYgdGVzdF9zYXNzX3dhcm4KKyAgICBhc3NlcnRfd2FybmluZygiRm9vISIpIHtzYXNzX3dhcm4gIkZvbyEifQorICBlbmQKKworICBkZWYgdGVzdF9zaWxlbmNlX3Nhc3Nfd2FybmluZ3MKKyAgICBvbGRfc3RkZXJyLCAkc3RkZXJyID0gJHN0ZGVyciwgU3RyaW5nSU8ubmV3CisgICAgc2lsZW5jZV9zYXNzX3dhcm5pbmdzIHt3YXJuICJPdXQifQorICAgIGFzc2VydF9lcXVhbCgiT3V0XG4iLCAkc3RkZXJyLnN0cmluZykKKyAgICBzaWxlbmNlX3Nhc3Nfd2FybmluZ3Mge3Nhc3Nfd2FybiAiSW4ifQorICAgIGFzc2VydF9lcXVhbCgiT3V0XG4iLCAkc3RkZXJyLnN0cmluZykKKyAgZW5zdXJlCisgICAgJHN0ZGVyciA9IG9sZF9zdGRlcnIKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXh0cmFjdAorICAgIGFyciA9IFsxLCAyLCAzLCA0LCA1XQorICAgIGFzc2VydF9lcXVhbChbMSwgMywgNV0sIGV4dHJhY3QhKGFycikge3xlfCBlICUgMiA9PSAxfSkKKyAgICBhc3NlcnRfZXF1YWwoWzIsIDRdLCBhcnIpCisgIGVuZAorCisgIGRlZiB0ZXN0X2ZsYXR0ZW5fdmVydGljYWxseQorICAgIGFzc2VydF9lcXVhbChbMSwgMiwgM10sIGZsYXR0ZW5fdmVydGljYWxseShbMSwgMiwgM10pKQorICAgIGFzc2VydF9lcXVhbChbMSwgMywgNSwgMiwgNCwgNl0sIGZsYXR0ZW5fdmVydGljYWxseShbWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0pKQorICAgIGFzc2VydF9lcXVhbChbMSwgMiwgNCwgMywgNSwgNl0sIGZsYXR0ZW5fdmVydGljYWxseShbMSwgWzIsIDNdLCBbNCwgNSwgNl1dKSkKKyAgICBhc3NlcnRfZXF1YWwoWzEsIDQsIDYsIDIsIDUsIDNdLCBmbGF0dGVuX3ZlcnRpY2FsbHkoW1sxLCAyLCAzXSwgWzQsIDVdLCA2XSkpCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4dHJhY3RfYW5kX2luamVjdF92YWx1ZXMKKyAgICB0ZXN0ID0gbGFtYmRhIHt8YXJyfCBhc3NlcnRfZXF1YWwoYXJyLCB3aXRoX2V4dHJhY3RlZF92YWx1ZXMoYXJyKSB7fHN0cnwgc3RyfSl9CisKKyAgICB0ZXN0W1snZm9vIGJhciddXQorICAgIHRlc3RbWydmb28gezEyfSBiYXInXV0KKyAgICB0ZXN0W1snZm9vIHt7MTJ9IGJhciddXQorICAgIHRlc3RbWydmb28ge3sxJywgMTIsICcyfSBiYXInXV0KKyAgICB0ZXN0W1snZm9vIDEnLCAyLCAnezMnLCA0LCA1LCA2LCAnezd9JywgOF1dCisgICAgdGVzdFtbJ2ZvbyAxJywgWzIsIDMsIDRdLCAnIGJhciddXQorICAgIHRlc3RbWydmb28gJywgMSwgIlxuIGJhclxuIiwgWzIsIDMsIDRdLCAiXG4gYmF6Il1dCisgIGVuZAorCisgIGRlZiBuZXN0ZWRfY2FsbGVyX2luZm9fZm4KKyAgICBjYWxsZXJfaW5mbworICBlbmQKKworICBkZWYgZG91YmxlX25lc3RlZF9jYWxsZXJfaW5mb19mbgorICAgIG5lc3RlZF9jYWxsZXJfaW5mb19mbgorICBlbmQKKworICBkZWYgdGVzdF9jYWxsZXJfaW5mbworICAgIGFzc2VydF9lcXVhbChbIi90bXAvZm9vLnJiIiwgMTIsICJmaXp6bGUiXSwgY2FsbGVyX2luZm8oIi90bXAvZm9vLnJiOjEyOiBpbiBgZml6emxlJyIpKQorICAgIGFzc2VydF9lcXVhbChbIi90bXAvZm9vLnJiIiwgMTIsIG5pbF0sIGNhbGxlcl9pbmZvKCIvdG1wL2Zvby5yYjoxMiIpKQorICAgIGFzc2VydF9lcXVhbChbIkM6L3RtcC9mb28ucmIiLCAxMiwgbmlsXSwgY2FsbGVyX2luZm8oIkM6L3RtcC9mb28ucmI6MTIiKSkKKyAgICBhc3NlcnRfZXF1YWwoWyIoc2FzcykiLCAxMiwgImJsYWgiXSwgY2FsbGVyX2luZm8oIihzYXNzKToxMjogaW4gYGJsYWgnIikpCisgICAgYXNzZXJ0X2VxdWFsKFsiIiwgMTIsICJib29wIl0sIGNhbGxlcl9pbmZvKCI6MTI6IGluIGBib29wJyIpKQorICAgIGFzc2VydF9lcXVhbChbIi90bXAvZm9vLnJiIiwgLTEyLCAiZml6emxlIl0sIGNhbGxlcl9pbmZvKCIvdG1wL2Zvby5yYjotMTI6IGluIGBmaXp6bGUnIikpCisgICAgYXNzZXJ0X2VxdWFsKFsiL3RtcC9mb28ucmIiLCAxMiwgImZpenpsZSJdLCBjYWxsZXJfaW5mbygiL3RtcC9mb28ucmI6MTI6IGluIGBmaXp6bGUge30nIikpCisgICAgYXNzZXJ0X2VxdWFsKFsiQzovdG1wL2Zvby5yYiIsIDEyLCAiZml6emxlIl0sIGNhbGxlcl9pbmZvKCJDOi90bXAvZm9vLnJiOjEyOiBpbiBgZml6emxlIHt9JyIpKQorCisgICAgaW5mbyA9IG5lc3RlZF9jYWxsZXJfaW5mb19mbgorICAgIGFzc2VydF9lcXVhbChfX0ZJTEVfXywgaW5mb1swXSkKKyAgICBhc3NlcnRfZXF1YWwoInRlc3RfY2FsbGVyX2luZm8iLCBpbmZvWzJdKQorCisgICAgaW5mbyA9IHByb2Mge25lc3RlZF9jYWxsZXJfaW5mb19mbn0uY2FsbAorICAgIGFzc2VydF9lcXVhbChfX0ZJTEVfXywgaW5mb1swXSkKKyAgICBhc3NlcnRfbWF0Y2goL14oYmxvY2sgaW4gKT90ZXN0X2NhbGxlcl9pbmZvJC8sIGluZm9bMl0pCisKKyAgICBpbmZvID0gZG91YmxlX25lc3RlZF9jYWxsZXJfaW5mb19mbgorICAgIGFzc2VydF9lcXVhbChfX0ZJTEVfXywgaW5mb1swXSkKKyAgICBhc3NlcnRfZXF1YWwoImRvdWJsZV9uZXN0ZWRfY2FsbGVyX2luZm9fZm4iLCBpbmZvWzJdKQorCisgICAgaW5mbyA9IHByb2Mge2RvdWJsZV9uZXN0ZWRfY2FsbGVyX2luZm9fZm59LmNhbGwKKyAgICBhc3NlcnRfZXF1YWwoX19GSUxFX18sIGluZm9bMF0pCisgICAgYXNzZXJ0X2VxdWFsKCJkb3VibGVfbmVzdGVkX2NhbGxlcl9pbmZvX2ZuIiwgaW5mb1syXSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmVyc2lvbl9ndAorICAgIGFzc2VydF92ZXJzaW9uX2d0KCIyLjAuMCIsICIxLjAuMCIpCisgICAgYXNzZXJ0X3ZlcnNpb25fZ3QoIjEuMS4wIiwgIjEuMC4wIikKKyAgICBhc3NlcnRfdmVyc2lvbl9ndCgiMS4wLjEiLCAiMS4wLjAiKQorICAgIGFzc2VydF92ZXJzaW9uX2d0KCIxLjAuMCIsICIxLjAuMC5yYyIpCisgICAgYXNzZXJ0X3ZlcnNpb25fZ3QoIjEuMC4wLjEiLCAiMS4wLjAucmMiKQorICAgIGFzc2VydF92ZXJzaW9uX2d0KCIxLjAuMC5yYyIsICIwLjkuOSIpCisgICAgYXNzZXJ0X3ZlcnNpb25fZ3QoIjEuMC4wLmJldGEiLCAiMS4wLjAuYWxwaGEiKQorCisgICAgYXNzZXJ0X3ZlcnNpb25fZXEoIjEuMC4wIiwgIjEuMC4wIikKKyAgICBhc3NlcnRfdmVyc2lvbl9lcSgiMS4wLjAiLCAiMS4wLjAuMCIpCisgIGVuZAorCisgIGRlZiBhc3NlcnRfdmVyc2lvbl9ndCh2MSwgdjIpCisgICAgI2Fzc2VydCh2ZXJzaW9uX2d0KHYxLCB2MiksICJFeHBlY3RlZCAje3YxfSA+ICN7djJ9IikKKyAgICBhc3NlcnQoIXZlcnNpb25fZ3QodjIsIHYxKSwgIkV4cGVjdGVkICN7djJ9IDwgI3t2MX0iKQorICBlbmQKKworICBkZWYgYXNzZXJ0X3ZlcnNpb25fZXEodjEsIHYyKQorICAgIGFzc2VydCghdmVyc2lvbl9ndCh2MSwgdjIpLCAiRXhwZWN0ZWQgI3t2MX0gPSAje3YyfSIpCisgICAgYXNzZXJ0KCF2ZXJzaW9uX2d0KHYyLCB2MSksICJFeHBlY3RlZCAje3YyfSA9ICN7djF9IikKKyAgZW5kCisKKyAgY2xhc3MgRm9vQmFyCisgICAgZGVmIGZvbworICAgICAgU2Fzczo6VXRpbC5hYnN0cmFjdChzZWxmKQorICAgIGVuZAorICAgIGRlZiBvbGRfbWV0aG9kCisgICAgICBTYXNzOjpVdGlsLmRlcHJlY2F0ZWQoc2VsZikKKyAgICBlbmQKKyAgICBkZWYgb2xkX21ldGhvZF93aXRoX2N1c3RvbV9tZXNzYWdlCisgICAgICBTYXNzOjpVdGlsLmRlcHJlY2F0ZWQoc2VsZiwgIkNhbGwgRm9vQmFyI25ld19tZXRob2QgaW5zdGVhZC4iKQorICAgIGVuZAorICAgIGRlZiBzZWxmLmFub3RoZXJfb2xkX21ldGhvZAorICAgICAgU2Fzczo6VXRpbC5kZXByZWNhdGVkKHNlbGYpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X2Fic3RyYWN0CisgICAgYXNzZXJ0X3JhaXNlX21lc3NhZ2UoTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICJVdGlsVGVzdDo6Rm9vQmFyIG11c3QgaW1wbGVtZW50ICNmb28iKSB7Rm9vQmFyLm5ldy5mb299CisgIGVuZAorCisgIGRlZiB0ZXN0X2RlcHJlY2F0ZWQKKyAgICBhc3NlcnRfd2FybmluZygiREVQUkVDQVRJT04gV0FSTklORzogVXRpbFRlc3Q6OkZvb0JhciNvbGRfbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNhc3MuIikgeyBGb29CYXIubmV3Lm9sZF9tZXRob2QgfQorICAgIGFzc2VydF93YXJuaW5nKDw8V0FSTklORykgeyBGb29CYXIubmV3Lm9sZF9tZXRob2Rfd2l0aF9jdXN0b21fbWVzc2FnZSB9CitERVBSRUNBVElPTiBXQVJOSU5HOiBVdGlsVGVzdDo6Rm9vQmFyI29sZF9tZXRob2Rfd2l0aF9jdXN0b21fbWVzc2FnZSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTYXNzLgorQ2FsbCBGb29CYXIjbmV3X21ldGhvZCBpbnN0ZWFkLgorV0FSTklORworICAgIGFzc2VydF93YXJuaW5nKCJERVBSRUNBVElPTiBXQVJOSU5HOiBVdGlsVGVzdDo6Rm9vQmFyLmFub3RoZXJfb2xkX21ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTYXNzLiIpIHsgRm9vQmFyLmFub3RoZXJfb2xkX21ldGhvZCB9CisgIGVuZAorCisgIGRlZiB0ZXN0X2pzb25fZXNjYXBlX3N0cmluZworICAgIGFzc2VydF9qc29uX3N0cmluZyAiIiwgIiIKKyAgICBhbHBoYW51bSA9ICgoIjAiLi4iOSIpLnRvX2EpLmNvbmNhdCgoImEiLi4ieiIpLnRvX2EpLmNvbmNhdCgoIkEiLi4iWiIpLnRvX2EpLmpvaW4KKyAgICBhc3NlcnRfanNvbl9zdHJpbmcgYWxwaGFudW0sIGFscGhhbnVtCisgICAgYXNzZXJ0X2pzb25fc3RyaW5nICInXCJcXCciLCAiJ1xcXCJcXFxcJyIKKyAgICBhc3NlcnRfanNvbl9zdHJpbmcgIlxiXGZcblxyXHQiLCAiXFxiXFxmXFxuXFxyXFx0IgorICBlbmQKKworICBkZWYgYXNzZXJ0X2pzb25fc3RyaW5nKHNvdXJjZSwgdGFyZ2V0KQorICAgIGFzc2VydF9lcXVhbCB0YXJnZXQsIGpzb25fZXNjYXBlX3N0cmluZyhzb3VyY2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X2pzb25fdmFsdWVfb2YKKyAgICBhc3NlcnRfanNvbl92YWx1ZSAwLCAiMCIKKyAgICBhc3NlcnRfanNvbl92YWx1ZSgtNDIsICItNDIiKQorICAgIGFzc2VydF9qc29uX3ZhbHVlIDQyLCAiNDIiCisgICAgYXNzZXJ0X2pzb25fdmFsdWUgdHJ1ZSwgInRydWUiCisgICAgYXNzZXJ0X2pzb25fdmFsdWUgZmFsc2UsICJmYWxzZSIKKyAgICBhc3NlcnRfanNvbl92YWx1ZSAiIiwgIlwiXCIiCisgICAgYXNzZXJ0X2pzb25fdmFsdWUgIlwiXCIiLCAiXCJcXFwiXFxcIlwiIgorICAgIGFzc2VydF9qc29uX3ZhbHVlICJNdWx0aVxuTGluZVxyU3RyaW5nIiwgIlwiTXVsdGlcXG5MaW5lXFxyU3RyaW5nXCIiCisgICAgYXNzZXJ0X2pzb25fdmFsdWUgWzEsICJzb21lXG5zdHIsaW5nIiwgZmFsc2UsIG5pbF0sICJbMSxcInNvbWVcXG5zdHIsaW5nXCIsZmFsc2UsbnVsbF0iCisgIGVuZAorCisgIGRlZiBhc3NlcnRfanNvbl92YWx1ZShzb3VyY2UsIHRhcmdldCkKKyAgICBhc3NlcnRfZXF1YWwgdGFyZ2V0LCBqc29uX3ZhbHVlX29mKHNvdXJjZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdmxxCisgICAgYXNzZXJ0X2VxdWFsICJBIiwgZW5jb2RlX3ZscSgwKQorICAgIGFzc2VydF9lcXVhbCAiZSIsIGVuY29kZV92bHEoMTUpCisgICAgYXNzZXJ0X2VxdWFsICJnQiIsIGVuY29kZV92bHEoMTYpCisgICAgYXNzZXJ0X2VxdWFsICJ3SCIsIGVuY29kZV92bHEoMTIwKQorICBlbmQKKworICBkZWYgYXNzZXJ0X3ZscV9lbmNvZGVzKGludCwgdmxxKQorICAgIHZscV9mcm9tX2RlY2ltYWxfYXJyYXkgPSBkZWNpbWFsX2FycmF5Lm1hcCB7fGR8IGVuY29kZV92bHEoZCl9LmpvaW4KKyAgICBkZWNpbWFsX2FycmF5X2Zyb21fdmxxID0gZGVjb2RlX3ZscSh2bHEpCisgICAgYXNzZXJ0X2VxdWFsIHZscSwgdmxxX2Zyb21fZGVjaW1hbF9hcnJheQorICAgIGFzc2VydF9lcXVhbCBkZWNpbWFsX2FycmF5LCBkZWNpbWFsX2FycmF5X2Zyb21fdmxxCisgIGVuZAorCisgIGRlZiB0ZXN0X3JvdW5kX3Jlc3BlY3RzX3ByZWNpc2lvbgorICAgIG9yaWdpbmFsX3ByZWNpc2lvbiA9IFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5wcmVjaXNpb24KKyAgICBhc3NlcnRfZXF1YWwgMCwgU2Fzczo6VXRpbC5yb3VuZCgwLjQ5OTk5OTk5OTkpCisgICAgIyAxMCA5cyBkb2Vzbid0IHdvcmsgYmVjYXVzZSAwLjQ5OTk5OTk5OTk5IC0gMC41IGlzIHZlcnkgc2xpZ2h0bHkgZ3JlYXRlcgorICAgICMgdGhhbiAtMC4xZTExIGR1ZSB0byBmbG9hdCBub25zZW5zZS4KKyAgICBhc3NlcnRfZXF1YWwgMSwgU2Fzczo6VXRpbC5yb3VuZCgwLjQ5OTk5OTk5OTk5OSkKKyAgICBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpOdW1iZXIucHJlY2lzaW9uID0gNgorICAgIGFzc2VydF9lcXVhbCAwLCBTYXNzOjpVdGlsLnJvdW5kKDAuNDk5OTk5KQorICAgIGFzc2VydF9lcXVhbCAxLCBTYXNzOjpVdGlsLnJvdW5kKDAuNDk5OTk5OTkpCisgIGVuc3VyZQorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bWJlci5wcmVjaXNpb24gPSBvcmlnaW5hbF9wcmVjaXNpb24KKyAgZW5kCisKKyAgZGVmIHRlc3RfYXRvbWljX3dyaXRlcworICAgICMgd2hlbiB1c2luZyBub3JtYWwgd3JpdGVzLCB0aGlzIHRlc3QgZmFpbHMgYWJvdXQgOTAlIG9mIHRoZSB0aW1lLgorICAgIGZpbGVuYW1lID0gRmlsZS5qb2luKERpci50bXBkaXIsICJ0ZXN0X2F0b21pYyIpCisgICAgNS50aW1lcyBkbworICAgICAgd3JpdGVzX3RvX3BlcmZvcm0gPSAldygxIDIgMyA0IDUgNiA3IDggOSkubWFwIHt8aXwgIiN7aX1cbiIgKiAxMDBfMDAwfQorICAgICAgdGhyZWFkcyA9IHdyaXRlc190b19wZXJmb3JtLm1hcCBkbyB8dG9fd3JpdGV8CisgICAgICAgIFRocmVhZC5uZXcgZG8KKyAgICAgICAgICAjIFRvIHNlZSB0aGlzIHRlc3QgZmFpbCB3aXRoIGEgbm9ybWFsIHdyaXRlLAorICAgICAgICAgICMgY2hhbmdlIHRvIHRoZSBzdGFuZGFyZCBmaWxlIG9wZW4gbWVjaGFuaXNtOgorICAgICAgICAgICMgb3BlbihmaWxlbmFtZSwgInciKSBkbyB8ZnwKKyAgICAgICAgICBhdG9taWNfY3JlYXRlX2FuZF93cml0ZV9maWxlKGZpbGVuYW1lKSBkbyB8ZnwKKyAgICAgICAgICAgIGYud3JpdGUodG9fd3JpdGUpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBsb29wIGRvCisgICAgICAgIGNvbnRlbnRzID0gRmlsZS5leGlzdD8oZmlsZW5hbWUpID8gRmlsZS5yZWFkKGZpbGVuYW1lKSA6IG5pbAorICAgICAgICBuZXh0IGlmIGNvbnRlbnRzLm5pbD8gfHwgY29udGVudHMuc2l6ZSA9PSAwCisgICAgICAgIHVubGVzcyB3cml0ZXNfdG9fcGVyZm9ybS5pbmNsdWRlPyhjb250ZW50cykKKyAgICAgICAgICBpZiBjb250ZW50cy5zaXplICE9IHdyaXRlc190b19wZXJmb3JtLmZpcnN0LnNpemUKKyAgICAgICAgICAgIGZhaWwgIkluY29tcGxldGUgd3JpdGUgZGV0ZWN0ZWQ6IHdhcyAje2NvbnRlbnRzLnNpemV9IGNoYXJhY3RlcnMsICIgKworICAgICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiAje3dyaXRlc190b19wZXJmb3JtLmZpcnN0LnNpemV9IgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhaWwgIkNvcnJ1cHRlZCByZWFkL3dyaXRlIGRldGVjdGVkIgorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgYnJlYWsgaWYgdGhyZWFkcy5hbGw/IHt8dHwgIXQuYWxpdmU/fQorICAgICAgZW5kCisgICAgICB0aHJlYWRzLmVhY2gge3x0fCB0LmpvaW59CisgICAgZW5kCisgIGVuc3VyZQorICAgIFNhc3M6OlV0aWwucmV0cnlfb25fd2luZG93cyB7RmlsZS5kZWxldGUgZmlsZW5hbWUgaWYgRmlsZS5leGlzdD8oZmlsZW5hbWUpfQorICBlbmQKKworICBkZWYgdGVzdF9hdG9taWNfd3JpdGVfcGVybWlzc2lvbnMKKyAgICBhdG9taWNfZmlsZW5hbWUgPSBGaWxlLmpvaW4oRGlyLnRtcGRpciwgInRlc3RfYXRvbWljX3Blcm1zLmF0b21pYyIpCisgICAgbm9ybWFsX2ZpbGVuYW1lID0gRmlsZS5qb2luKERpci50bXBkaXIsICJ0ZXN0X2F0b21pY19wZXJtcy5ub3JtYWwiKQorICAgIGF0b21pY19jcmVhdGVfYW5kX3dyaXRlX2ZpbGUoYXRvbWljX2ZpbGVuYW1lKSB7fGZ8IGYud3JpdGUoIndoYXRldmVyXG4iKSB9CisgICAgb3Blbihub3JtYWxfZmlsZW5hbWUsICJ3YiIpIHt8ZnwgZi53cml0ZSgid2hhdGV2ZXJcbiIpIH0KKyAgICBhc3NlcnRfZXF1YWwgRmlsZS5zdGF0KG5vcm1hbF9maWxlbmFtZSkubW9kZS50b19zKDgpLCBGaWxlLnN0YXQoYXRvbWljX2ZpbGVuYW1lKS5tb2RlLnRvX3MoOCkKKyAgZW5zdXJlCisgICAgRmlsZS51bmxpbmsoYXRvbWljX2ZpbGVuYW1lKSByZXNjdWUgbmlsCisgICAgRmlsZS51bmxpbmsobm9ybWFsX2ZpbGVuYW1lKSByZXNjdWUgbmlsCisgIGVuZAorCisgIGRlZiB0ZXN0X2F0b21pY193cml0ZXNfcmVzcGVjdF91bWFzaworICAgIGF0b21pY19maWxlbmFtZSA9IEZpbGUuam9pbihEaXIudG1wZGlyLCAidGVzdF9hdG9taWNfcGVybXMuYXRvbWljIikKKyAgICBhdG9taWNfY3JlYXRlX2FuZF93cml0ZV9maWxlKGF0b21pY19maWxlbmFtZSkgZG8gfGZ8CisgICAgICBmLndyaXRlKCJ3aGF0ZXZlclxuIikKKyAgICBlbmQKKyAgICBhc3NlcnRfZXF1YWwgMCwgRmlsZS5zdGF0KGF0b21pY19maWxlbmFtZSkubW9kZSAmIEZpbGUudW1hc2sKKyAgZW5zdXJlCisgICAgRmlsZS51bmxpbmsoYXRvbWljX2ZpbGVuYW1lKQorICBlbmQKKworICBjbGFzcyBGYWtlRXJyb3IgPCBSdW50aW1lRXJyb3I7IGVuZAorCisgIGRlZiB0ZXN0X2F0b21pY193cml0ZXNfaGFuZGxlc19leGNlcHRpb25zCisgICAgZmlsZW5hbWUgPSBGaWxlLmpvaW4oRGlyLnRtcGRpciwgInRlc3RfYXRvbWljX2V4Y2VwdGlvbiIpCisgICAgRmlsZVV0aWxzLnJtX2YoZmlsZW5hbWUpCisgICAgdG1wX2ZpbGVuYW1lID0gbmlsCisgICAgYXNzZXJ0X3JhaXNlcyBGYWtlRXJyb3IgZG8KKyAgICAgIGF0b21pY19jcmVhdGVfYW5kX3dyaXRlX2ZpbGUoZmlsZW5hbWUpIGRvIHxmfAorICAgICAgICB0bXBfZmlsZW5hbWUgPSBmLnBhdGgKKyAgICAgICAgcmFpc2UgRmFrZUVycm9yLm5ldyAiQm9ya2VuIgorICAgICAgZW5kCisgICAgZW5kCisgICAgYXNzZXJ0ICFGaWxlLmV4aXN0PyhmaWxlbmFtZSkKKyAgICBhc3NlcnQgIUZpbGUuZXhpc3Q/KHRtcF9maWxlbmFtZSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3ZhbHVlX2hlbHBlcnNfdGVzdC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtMy41LjEvdGVzdC9zYXNzL3ZhbHVlX2hlbHBlcnNfdGVzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOGMwN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Nhc3MvdmFsdWVfaGVscGVyc190ZXN0LnJiCkBAIC0wLDAgKzEsMTc4IEBACityZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL3Rlc3RfaGVscGVyJworCitjbGFzcyBWYWx1ZUhlbHBlcnNUZXN0IDwgTWluaVRlc3Q6OlRlc3QKKyAgaW5jbHVkZSBTYXNzOjpTY3JpcHQKKyAgaW5jbHVkZSBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpIZWxwZXJzCisKKyAgZGVmIHRlc3RfYm9vbAorICAgIGFzc2VydF9zYW1lIFZhbHVlOjpCb29sOjpUUlVFLCBib29sKHRydWUpCisgICAgYXNzZXJ0X3NhbWUgVmFsdWU6OkJvb2w6OkZBTFNFLCBib29sKGZhbHNlKQorICAgIGFzc2VydF9zYW1lIFZhbHVlOjpCb29sOjpGQUxTRSwgYm9vbChuaWwpCisgICAgYXNzZXJ0X3NhbWUgVmFsdWU6OkJvb2w6OlRSVUUsIGJvb2woT2JqZWN0Lm5ldykKKyAgZW5kCisKKyAgZGVmIHRlc3RfaGV4X2NvbG9yX3dpdGhfdGhyZWVfZGlnaXRzCisgICAgY29sb3IgPSBoZXhfY29sb3IoIkYwNyIpCisgICAgYXNzZXJ0X2VxdWFsIDI1NSwgY29sb3IucmVkCisgICAgYXNzZXJ0X2VxdWFsIDAsIGNvbG9yLmdyZWVuCisgICAgYXNzZXJ0X2VxdWFsIDExOSwgY29sb3IuYmx1ZQorICAgIGFzc2VydF9lcXVhbCAxLCBjb2xvci5hbHBoYQorICBlbmQKKworICBkZWYgdGVzdF9oZXhfY29sb3Jfd2l0aG91dF9oYXNoCisgICAgY29sb3Jfd2l0aG91dF9oYXNoID0gaGV4X2NvbG9yKCJGRjAwN0YiKQorICAgIGFzc2VydF9lcXVhbCAyNTUsIGNvbG9yX3dpdGhvdXRfaGFzaC5yZWQKKyAgICBhc3NlcnRfZXF1YWwgMCwgY29sb3Jfd2l0aG91dF9oYXNoLmdyZWVuCisgICAgYXNzZXJ0X2VxdWFsIDEyNywgY29sb3Jfd2l0aG91dF9oYXNoLmJsdWUKKyAgICBhc3NlcnRfZXF1YWwgMSwgY29sb3Jfd2l0aG91dF9oYXNoLmFscGhhCisgIGVuZAorCisgIGRlZiB0ZXN0X2hleF9jb2xvcl93aXRoX2hhc2gKKyAgICBjb2xvcl93aXRoX2hhc2ggPSBoZXhfY29sb3IoIiNGRjAwN0YiKQorICAgIGFzc2VydF9lcXVhbCAyNTUsIGNvbG9yX3dpdGhfaGFzaC5yZWQKKyAgICBhc3NlcnRfZXF1YWwgMCwgY29sb3Jfd2l0aF9oYXNoLmdyZWVuCisgICAgYXNzZXJ0X2VxdWFsIDEyNywgY29sb3Jfd2l0aF9oYXNoLmJsdWUKKyAgICBhc3NlcnRfZXF1YWwgMSwgY29sb3Jfd2l0aF9oYXNoLmFscGhhCisgIGVuZAorCisgIGRlZiB0ZXN0X21hbGZvcm1lZF9oZXhfY29sb3IKKyAgICBhc3NlcnRfcmFpc2VzIEFyZ3VtZW50RXJyb3IgZG8KKyAgICAgIGhleF9jb2xvcigiZ3JlZW4iKQorICAgIGVuZAorICAgIGFzc2VydF9yYWlzZXMgQXJndW1lbnRFcnJvciBkbworICAgICAgaGV4X2NvbG9yKCIjYWJjZCIpCisgICAgZW5kCisgIGVuZAorCisKKyAgZGVmIHRlc3RfaGV4X2NvbG9yX3dpdGhfYWxwaGEKKyAgICBjb2xvcl93aXRoX2FscGhhID0gaGV4X2NvbG9yKCJGRjAwN0YiLCAwLjUpCisgICAgYXNzZXJ0X2VxdWFsIDAuNSwgY29sb3Jfd2l0aF9hbHBoYS5hbHBoYQorICBlbmQKKworICBkZWYgdGVzdF9oZXhfY29sb3JfYWxwaGFfY2xhbXBzXzBfdG9fMQorICAgIGFzc2VydF9lcXVhbCAxLCBoZXhfY29sb3IoIkZGMDA3RiIsIDUwKS5hbHBoYQorICBlbmQKKworICBkZWYgdGVzdF9oc2xfY29sb3Jfd2l0aG91dF9hbHBoYQorICAgIG5vX2FscGhhID0gaHNsX2NvbG9yKDEsIDAuNSwgMSkKKyAgICBhc3NlcnRfZXF1YWwgMSwgbm9fYWxwaGEuaHVlCisgICAgYXNzZXJ0X2VxdWFsIDAuNSwgbm9fYWxwaGEuc2F0dXJhdGlvbgorICAgIGFzc2VydF9lcXVhbCAxLCBub19hbHBoYS5saWdodG5lc3MKKyAgICBhc3NlcnRfZXF1YWwgMSwgbm9fYWxwaGEuYWxwaGEKKyAgZW5kCisKKyAgZGVmIHRlc3RfaHNsX2NvbG9yX3dpdGhfYWxwaGEKKyAgICBoYXNfYWxwaGEgPSBoc2xfY29sb3IoMSwgMC41LCAxLCAwLjUpCisgICAgYXNzZXJ0X2VxdWFsIDEsIGhhc19hbHBoYS5odWUKKyAgICBhc3NlcnRfZXF1YWwgMC41LCBoYXNfYWxwaGEuc2F0dXJhdGlvbgorICAgIGFzc2VydF9lcXVhbCAxLCBoYXNfYWxwaGEubGlnaHRuZXNzCisgICAgYXNzZXJ0X2VxdWFsIDAuNSwgaGFzX2FscGhhLmFscGhhCisgIGVuZAorCisgIGRlZiB0ZXN0X3JnYl9jb2xvcl93aXRob3V0X2FscGhhCisgICAgbm9fYWxwaGEgPSByZ2JfY29sb3IoMjU1LCAwLCAwKQorICAgIGFzc2VydF9lcXVhbCAyNTUsIG5vX2FscGhhLnJlZAorICAgIGFzc2VydF9lcXVhbCAwLCBub19hbHBoYS5ncmVlbgorICAgIGFzc2VydF9lcXVhbCAwLCBub19hbHBoYS5ibHVlCisgICAgYXNzZXJ0X2VxdWFsIDEsIG5vX2FscGhhLmFscGhhCisgIGVuZAorCisgIGRlZiB0ZXN0X3JnYl9jb2xvcl93aXRoX2FscGhhCisgICAgaGFzX2FscGhhID0gcmdiX2NvbG9yKDI1NSwgMjU1LCAyNTUsIDAuNSkKKyAgICBhc3NlcnRfZXF1YWwgMjU1LCBoYXNfYWxwaGEucmVkCisgICAgYXNzZXJ0X2VxdWFsIDI1NSwgaGFzX2FscGhhLmdyZWVuCisgICAgYXNzZXJ0X2VxdWFsIDI1NSwgaGFzX2FscGhhLmJsdWUKKyAgICBhc3NlcnRfZXF1YWwgMC41LCBoYXNfYWxwaGEuYWxwaGEKKyAgZW5kCisKKyAgZGVmIHRlc3RfbnVtYmVyCisgICAgbiA9IG51bWJlcigxKQorICAgIGFzc2VydF9lcXVhbCAxLCBuLnZhbHVlCisgICAgYXNzZXJ0X2VxdWFsICIxIiwgbi50b19zYXNzCisgIGVuZAorCisgIGRlZiB0ZXN0X251bWJlcl93aXRoX3NpbmdsZV91bml0CisgICAgbiA9IG51bWJlcigxLCAicHgiKQorICAgIGFzc2VydF9lcXVhbCAxLCBuLnZhbHVlCisgICAgYXNzZXJ0X2VxdWFsICIxcHgiLCBuLnRvX3Nhc3MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbnVtYmVyX3dpdGhfc2luZ2FsX251bWVyYXRvcl9hbmRfZGVub21pbmF0b3IKKyAgICByYXRpbyA9IG51bWJlcigxLCAicHgvZW0iKQorICAgIGFzc2VydF9lcXVhbCAiMXB4L2VtIiwgcmF0aW8udG9fc2FzcworICBlbmQKKworICBkZWYgdGVzdF9udW1iZXJfd2l0aF9tYW55X251bWVyYXRvcl9hbmRfZGVub21pbmF0b3JfdW5pdHMKKyAgICBjb21wbGV4ID0gbnVtYmVyKDEsICJweCppbi9lbSolIikKKyAgICBhc3NlcnRfZXF1YWwgIjFpbipweC8lKmVtIiwgY29tcGxleC50b19zYXNzCisgIGVuZAorCisgIGRlZiB0ZXN0X251bWJlcl93aXRoX21hbnlfbnVtZXJhdG9yX2FuZF9kZW5vbWluYXRvcl91bml0c193aXRoX3NwYWNlcworICAgIGNvbXBsZXggPSBudW1iZXIoMSwgInB4ICogaW4gLyBlbSAqICUiKQorICAgIGFzc2VydF9lcXVhbCAiMWluKnB4LyUqZW0iLCBjb21wbGV4LnRvX3Nhc3MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbnVtYmVyX3dpdGhfbWFsZm9ybWVkX3VuaXRzCisgICAgYXNzZXJ0X3JhaXNlcyBBcmd1bWVudEVycm9yIGRvCisgICAgICBudW1iZXIoMSwgInB4L2VtLyUiKQorICAgIGVuZAorICAgIGFzc2VydF9yYWlzZXMgQXJndW1lbnRFcnJvciBkbworICAgICAgbnVtYmVyKDEsICIvIikKKyAgICBlbmQKKyAgICBhc3NlcnRfcmFpc2VzIEFyZ3VtZW50RXJyb3IgZG8KKyAgICAgIG51bWJlcigxLCAicHgvIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3BhY2VfbGlzdAorICAgIGwgPSBsaXN0KG51bWJlcigxLCAicHgiKSwgaGV4X2NvbG9yKCIjZjcxIiksIDpzcGFjZSkKKyAgICBsLm9wdGlvbnMgPSB7fQorICAgIGFzc2VydF9raW5kX29mIFNhc3M6OlNjcmlwdDo6VmFsdWU6Okxpc3QsIGwKKyAgICBhc3NlcnRfZXF1YWwgIjFweCAjZjcxIiwgbC50b19zYXNzCisgIGVuZAorCisgIGRlZiB0ZXN0X2NvbW1hX2xpc3QKKyAgICBsID0gbGlzdChudW1iZXIoMSwgInB4IiksIGhleF9jb2xvcigiI2Y3MSIpLCA6Y29tbWEpCisgICAgbC5vcHRpb25zID0ge30KKyAgICBhc3NlcnRfa2luZF9vZiBTYXNzOjpTY3JpcHQ6OlZhbHVlOjpMaXN0LCBsCisgICAgYXNzZXJ0X2VxdWFsICIxcHgsICNmNzEiLCBsLnRvX3Nhc3MKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWlzc2luZ19saXN0X3R5cGUKKyAgICBhc3NlcnRfcmFpc2VzIEFyZ3VtZW50RXJyb3IgZG8KKyAgICAgIGxpc3QobnVtYmVyKDEsICJweCIpLCBoZXhfY29sb3IoIiNmNzEiKSkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfbnVsbAorICAgIGFzc2VydF9raW5kX29mIFNhc3M6OlNjcmlwdDo6VmFsdWU6Ok51bGwsIG51bGwKKyAgZW5kCisKKyAgZGVmIHRlc3RfcXVvdGVkX3N0cmluZworICAgIHMgPSBxdW90ZWRfc3RyaW5nKCJzYXNzeSBzdHJpbmciKQorICAgIHMub3B0aW9ucyA9IHt9CisgICAgYXNzZXJ0X2tpbmRfb2YgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLCBzCisgICAgYXNzZXJ0X2VxdWFsICJzYXNzeSBzdHJpbmciLCBzLnZhbHVlCisgICAgYXNzZXJ0X2VxdWFsIDpzdHJpbmcsIHMudHlwZQorICAgIGFzc2VydF9lcXVhbCAnInNhc3N5IHN0cmluZyInLCBzLnRvX3Nhc3MKKyAgZW5kCisKKyAgZGVmIHRlc3RfaWRlbnRpZmllcgorICAgIHMgPSBpZGVudGlmaWVyKCJhLXNhc3MtaWRlbnQiKQorICAgIHMub3B0aW9ucyA9IHt9CisgICAgYXNzZXJ0X2tpbmRfb2YgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLCBzCisgICAgYXNzZXJ0X2VxdWFsICJhLXNhc3MtaWRlbnQiLCBzLnZhbHVlCisgICAgYXNzZXJ0X2VxdWFsIDppZGVudGlmaWVyLCBzLnR5cGUKKyAgICBhc3NlcnRfZXF1YWwgImEtc2Fzcy1pZGVudCIsIHMudG9fc2FzcworICBlbmQKKworICBkZWYgdGVzdF91bnF1b3RlZF9zdHJpbmcKKyAgICBzID0gdW5xdW90ZWRfc3RyaW5nKCJhLXNhc3MtaWRlbnQiKQorICAgIHMub3B0aW9ucyA9IHt9CisgICAgYXNzZXJ0X2tpbmRfb2YgU2Fzczo6U2NyaXB0OjpWYWx1ZTo6U3RyaW5nLCBzCisgICAgYXNzZXJ0X2VxdWFsICJhLXNhc3MtaWRlbnQiLCBzLnZhbHVlCisgICAgYXNzZXJ0X2VxdWFsIDppZGVudGlmaWVyLCBzLnR5cGUKKyAgICBhc3NlcnRfZXF1YWwgImEtc2Fzcy1pZGVudCIsIHMudG9fc2FzcworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Rlc3RfaGVscGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy0zLjUuMS90ZXN0L3Rlc3RfaGVscGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDIyMDMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLTMuNS4xL3Rlc3QvdGVzdF9oZWxwZXIucmIKQEAgLTAsMCArMSwxNDkgQEAKK2xpYl9kaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi9saWInCisKK3JlcXVpcmUgJ21pbml0ZXN0L2F1dG9ydW4nCityZXF1aXJlICdmaWxldXRpbHMnCiskOi51bnNoaWZ0IGxpYl9kaXIgdW5sZXNzICQ6LmluY2x1ZGU/KGxpYl9kaXIpCityZXF1aXJlICdzYXNzJworcmVxdWlyZSAnbWF0aG4nIGlmIEVOVlsnTUFUSE4nXSA9PSAndHJ1ZScKKworU2Fzczo6UkFJTFNfTE9BREVEID0gdHJ1ZSB1bmxlc3MgZGVmaW5lZD8oU2Fzczo6UkFJTFNfTE9BREVEKQorCitTYXNzLnRlc3RzX3J1bm5pbmcgPSB0cnVlCisKK2lmIGRlZmluZWQ/KEVuY29kaW5nKQorICAkLXcsIHcgPSBmYWxzZSwgJC13CisgIEVuY29kaW5nLmRlZmF1bHRfZXh0ZXJuYWwgPSAnVVRGLTgnCisgICQtdyA9IHcKK2VuZAorCittb2R1bGUgU2Fzczo6U2NyaXB0OjpGdW5jdGlvbnMKKyAgZGVmIG9wdGlvbihuYW1lKQorICAgIFNhc3M6OlNjcmlwdDo6VmFsdWU6OlN0cmluZy5uZXcoQG9wdGlvbnNbbmFtZS52YWx1ZS50b19zeW1dLnRvX3MpCisgIGVuZAorZW5kCisKK2NsYXNzIE1pbmlUZXN0OjpUZXN0CisgIGRlZiBtdW5nZV9maWxlbmFtZShvcHRzID0ge30pCisgICAgb3B0c1s6ZmlsZW5hbWVdIHx8PSBmaWxlbmFtZV9mb3JfdGVzdChvcHRzWzpzeW50YXhdIHx8IDpzYXNzKQorICAgIG9wdHNbOnNvdXJjZW1hcF9maWxlbmFtZV0gfHw9IHNvdXJjZW1hcF9maWxlbmFtZV9mb3JfdGVzdAorICAgIG9wdHMKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmFtZQorICAgIGNhbGxlci4KKyAgICAgIG1hcCB7fGN8IFNhc3M6OlV0aWwuY2FsbGVyX2luZm8oYylbMl19LgorICAgICAgY29tcGFjdC4KKyAgICAgIG1hcCB7fGN8IGMuc3ViKC9eKGJsb2NrfHJlc2N1ZSkgaW4gLywgJycpfS4KKyAgICAgIGZpbmQge3xjfCBjID1+IC9edGVzdF8vfQorICBlbmQKKworICBkZWYgZmlsZW5hbWVfZm9yX3Rlc3Qoc3ludGF4ID0gOnNhc3MpCisgICAgIiN7dGVzdF9uYW1lfV9pbmxpbmUuI3tzeW50YXh9IgorICBlbmQKKworICBkZWYgc291cmNlbWFwX2ZpbGVuYW1lX2Zvcl90ZXN0KHN5bnRheCA9IDpzYXNzKQorICAgICIje3Rlc3RfbmFtZX1faW5saW5lLmNzcy5tYXAiCisgIGVuZAorCisgIGRlZiBjbGVhbl91cF9zYXNzYworICAgIHBhdGggPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi8uLi8uc2Fzcy1jYWNoZSIKKyAgICBTYXNzOjpVdGlsLnJldHJ5X29uX3dpbmRvd3Mge0ZpbGVVdGlscy5ybV9yKHBhdGgpIGlmIEZpbGUuZXhpc3Q/KHBhdGgpfQorICBlbmQKKworICBkZWYgYXNzZXJ0X3dhcm5pbmcobWVzc2FnZSkKKyAgICB0aGVfcmVhbF9zdGRlcnIsICRzdGRlcnIgPSAkc3RkZXJyLCBTdHJpbmdJTy5uZXcKKyAgICByZXN1bHQgPSB5aWVsZAorCisgICAgaWYgbWVzc2FnZS5pc19hPyhSZWdleHApCisgICAgICBhc3NlcnRfbWF0Y2ggbWVzc2FnZSwgJHN0ZGVyci5zdHJpbmcuc3RyaXAKKyAgICBlbHNlCisgICAgICBhc3NlcnRfZXF1YWwgbWVzc2FnZS5zdHJpcCwgJHN0ZGVyci5zdHJpbmcuc3RyaXAKKyAgICBlbmQKKyAgICByZXN1bHQKKyAgZW5zdXJlCisgICAgJHN0ZGVyciA9IHRoZV9yZWFsX3N0ZGVycgorICBlbmQKKworICBkZWYgYXNzZXJ0X25vX3dhcm5pbmcKKyAgICB0aGVfcmVhbF9zdGRlcnIsICRzdGRlcnIgPSAkc3RkZXJyLCBTdHJpbmdJTy5uZXcKKyAgICByZXN1bHQgPSB5aWVsZAorICAgIGFzc2VydF9lcXVhbCAnJywgJHN0ZGVyci5zdHJpbmcKKyAgICByZXN1bHQKKyAgZW5zdXJlCisgICAgJHN0ZGVyciA9IHRoZV9yZWFsX3N0ZGVycgorICBlbmQKKworICBkZWYgc2lsZW5jZV93YXJuaW5ncygmYmxvY2spCisgICAgU2Fzczo6VXRpbC5zaWxlbmNlX3dhcm5pbmdzKCZibG9jaykKKyAgZW5kCisKKyAgZGVmIGFzc2VydF9yYWlzZV9tZXNzYWdlKGtsYXNzLCBtZXNzYWdlKQorICAgIHlpZWxkCisgIHJlc2N1ZSBFeGNlcHRpb24gPT4gZQorICAgIGFzc2VydF9pbnN0YW5jZV9vZihrbGFzcywgZSkKKyAgICBhc3NlcnRfZXF1YWwobWVzc2FnZSwgZS5tZXNzYWdlKQorICBlbHNlCisgICAgZmx1bmsgIkV4cGVjdGVkIGV4Y2VwdGlvbiAje2tsYXNzfSwgbm9uZSByYWlzZWQiCisgIGVuZAorCisgIGRlZiBhc3NlcnRfcmFpc2VfbGluZShsaW5lKQorICAgIHlpZWxkCisgIHJlc2N1ZSBTYXNzOjpTeW50YXhFcnJvciA9PiBlCisgICAgYXNzZXJ0X2VxdWFsKGxpbmUsIGUuc2Fzc19saW5lKQorICBlbHNlCisgICAgZmx1bmsgIkV4cGVjdGVkIGV4Y2VwdGlvbiBvbiBsaW5lICN7bGluZX0sIG5vbmUgcmFpc2VkIgorICBlbmQKKworICBkZWYgYXNzZXJ0X3Nhc3NfdG9fc2FzcyhzYXNzLCBvcHRpb25zOiB7fSkKKyAgICBhc3NlcnRfZXF1YWwoc2Fzcy5yc3RyaXAsIHRvX3Nhc3Moc2Fzcywgb3B0aW9ucykucnN0cmlwLAorICAgICAgIkV4cGVjdGVkIFNhc3MgdG8gdHJhbnNmb3JtIHRvIGl0c2VsZiIpCisgIGVuZAorCisgIGRlZiBhc3NlcnRfc2Nzc190b19zYXNzKHNhc3MsIHNjc3MsIG9wdGlvbnM6IHt9KQorICAgIGFzc2VydF9lcXVhbChzYXNzLnJzdHJpcCwgdG9fc2FzcyhzY3NzLCBvcHRpb25zLm1lcmdlKDpzeW50YXggPT4gOnNjc3MpKS5yc3RyaXAsCisgICAgICAiRXhwZWN0ZWQgU0NTUyB0byB0cmFuc2Zvcm0gdG8gU2FzcyIpCisgIGVuZAorCisgIGRlZiBhc3NlcnRfc2Nzc190b19zY3NzKHNjc3MsIHNvdXJjZTogc2Nzcywgb3B0aW9uczoge30pCisgICAgYXNzZXJ0X2VxdWFsKHNjc3MucnN0cmlwLCB0b19zY3NzKHNvdXJjZSwgb3B0aW9ucy5tZXJnZSg6c3ludGF4ID0+IDpzY3NzKSkucnN0cmlwLAorICAgICAgIkV4cGVjdGVkIFNDU1MgdG8gdHJhbnNmb3JtIHRvICN7c2NzcyA9PSBzb3VyY2UgPyAnaXRzZWxmJyA6ICdTQ1NTJ30iKQorICBlbmQKKworICBkZWYgYXNzZXJ0X3Nhc3NfdG9fc2NzcyhzY3NzLCBzYXNzLCBvcHRpb25zOiB7fSkKKyAgICBhc3NlcnRfZXF1YWwoc2Nzcy5yc3RyaXAsIHRvX3Njc3Moc2Fzcywgb3B0aW9ucykucnN0cmlwLAorICAgICAgIkV4cGVjdGVkIFNhc3MgdG8gdHJhbnNmb3JtIHRvIFNDU1MiKQorICBlbmQKKworICBkZWYgYXNzZXJ0X2NvbnZlcnRzKHNhc3MsIHNjc3MsIG9wdGlvbnM6IHt9KQorICAgIGFzc2VydF9zYXNzX3RvX3Nhc3Moc2Fzcywgb3B0aW9uczogb3B0aW9ucykKKyAgICBhc3NlcnRfc2Nzc190b19zYXNzKHNhc3MsIHNjc3MsIG9wdGlvbnM6IG9wdGlvbnMpCisgICAgYXNzZXJ0X3Njc3NfdG9fc2NzcyhzY3NzLCBvcHRpb25zOiBvcHRpb25zKQorICAgIGFzc2VydF9zYXNzX3RvX3Njc3Moc2Nzcywgc2Fzcywgb3B0aW9uczogb3B0aW9ucykKKyAgZW5kCisKKyAgZGVmIHRvX3Nhc3Moc2Nzcywgb3B0aW9ucyA9IHt9KQorICAgIFNhc3M6OlV0aWwuc2lsZW5jZV9zYXNzX3dhcm5pbmdzIGRvCisgICAgICBTYXNzOjpFbmdpbmUubmV3KHNjc3MsIG9wdGlvbnMpLnRvX3RyZWUudG9fc2FzcyhvcHRpb25zKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdG9fc2NzcyhzYXNzLCBvcHRpb25zID0ge30pCisgICAgU2Fzczo6VXRpbC5zaWxlbmNlX3Nhc3Nfd2FybmluZ3MgZG8KKyAgICAgIFNhc3M6OkVuZ2luZS5uZXcoc2Fzcywgb3B0aW9ucykudG9fdHJlZS50b19zY3NzKG9wdGlvbnMpCisgICAgZW5kCisgIGVuZAorZW5kCisKK21vZHVsZSBQdWJsaWNBcGlMaW50ZXIKKyAgZGVmIGxpbnRfYXBpKGFwaV9jbGFzcywgZHVja190eXBlX2NsYXNzKQorICAgIGRlZmluZV9tZXRob2QgOnRlc3RfbGludF9pbnN0YW5jZSBkbworICAgICAgYXNzZXJ0IGxpbnRfaW5zdGFuY2UuaXNfYT8oZHVja190eXBlX2NsYXNzKQorICAgIGVuZAorICAgIGFwaV9jbGFzcy5pbnN0YW5jZV9tZXRob2RzLmVhY2ggZG8gfG1ldGh8CisgICAgICBkZWZpbmVfbWV0aG9kIDoidGVzdF9oYXNfI3ttZXRofSIgZG8KKyAgICAgICAgYXNzZXJ0IGxpbnRfaW5zdGFuY2UucmVzcG9uZF90bz8obWV0aCksCisgICAgICAgICAgIiN7ZHVja190eXBlX2NsYXNzLm5hbWV9IGRvZXMgbm90IGltcGxlbWVudCAje21ldGh9IgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9DSEFOR0VMT0cubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9DSEFOR0VMT0cubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyYWRiZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL0NIQU5HRUxPRy5tZApAQCAtMCwwICsxIEBACisjIE1vdmVkIHRvIFtHaXRIdWIgcmVsZWFzZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vcmVsZWFzZXMpIHBhZ2UuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9DT05UUklCVVRJTkcubWQgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1ZDZkZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDM4IEBACitDb250cmlidXRlIHRvIExpc3RlbgorPT09PT09PT09PT09PT09PT09PQorCitGaWxlIGFuIGlzc3VlCistLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBoYXZlbid0IGFscmVhZHksIGZpcnN0IHNlZSBbVFJPVUJMRVNIT09USU5HXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL3dpa2kvVHJvdWJsZXNob290aW5nKSBmb3Iga25vd24gaXNzdWVzLCBzb2x1dGlvbnMgYW5kIHdvcmthcm91bmRzLgorCitZb3UgY2FuIHJlcG9ydCBidWdzIGFuZCBmZWF0dXJlIHJlcXVlc3RzIHRvIFtHaXRIdWIgSXNzdWVzXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2lzc3VlcykuCisKKyoqUGxlYXNlIGRvbid0IGFzayBxdWVzdGlvbiBpbiB0aGUgaXNzdWUgdHJhY2tlcioqLCBpbnN0ZWFkIGFzayB0aGVtIGluIG91cgorW0dvb2dsZSBncm91cF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2d1YXJkLWRldikgb3Igb24gYCNndWFyZGAgKGlyYy5mcmVlbm9kZS5uZXQpLgorCitUcnkgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgaXNzdWUgYmVsb25ncyB0bzogSXMgaXQgYW4gaXNzdWUgd2l0aCBMaXN0ZW4gaXRzZWxmIG9yIHdpdGggR3VhcmQ/CisKKworKipJdCdzIG1vc3QgbGlrZWx5IHRoYXQgeW91ciBidWcgZ2V0cyByZXNvbHZlZCBmYXN0ZXIgaWYgeW91IHByb3ZpZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSEqKgorCitUaGUgTU9TVCB1c2VmdWwgaW5mb3JtYXRpb24gaXMgZGVidWdnaW5nIG91dHB1dCBmcm9tIExpc3RlbiAoYExJU1RFTl9HRU1fREVCVUdHSU5HPTFgKSAtIHNlZSBbVFJPVUJMRVNIT09USU5HXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL3dpa2kvVHJvdWJsZXNob290aW5nKSBmb3IgZGV0YWlscy4KKworCitEZXZlbG9wbWVudAorLS0tLS0tLS0tLS0KKworKiBEb2N1bWVudGF0aW9uIGhvc3RlZCBhdCBbUnVieURvY10oaHR0cDovL3J1Ynlkb2MuaW5mby9naXRodWIvZ3VhcmQvbGlzdGVuL21hc3Rlci9mcmFtZXMpLgorKiBTb3VyY2UgaG9zdGVkIGF0IFtHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4pLgorCitQdWxsIHJlcXVlc3RzIGFyZSB2ZXJ5IHdlbGNvbWUhIFBsZWFzZSB0cnkgdG8gZm9sbG93IHRoZXNlIHNpbXBsZSBydWxlcyBpZiBhcHBsaWNhYmxlOgorCisqIFBsZWFzZSBjcmVhdGUgYSB0b3BpYyBicmFuY2ggZm9yIGV2ZXJ5IHNlcGFyYXRlIGNoYW5nZSB5b3UgbWFrZS4KKyogTWFrZSBzdXJlIHlvdXIgcGF0Y2hlcyBhcmUgd2VsbCB0ZXN0ZWQuIEFsbCBzcGVjcyBydW4gd2l0aCBgcmFrZSBzcGVjYCBtdXN0IHBhc3MuCisqIFVwZGF0ZSB0aGUgW1lhcmRdKGh0dHA6Ly95YXJkb2Mub3JnLykgZG9jdW1lbnRhdGlvbi4KKyogVXBkYXRlIHRoZSBbUkVBRE1FXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCkuCisqIFVwZGF0ZSB0aGUgW0NIQU5HRUxPR10oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9ibG9iL21hc3Rlci9DSEFOR0VMT0cubWQpIGZvciBub3Rld29ydGh5IGNoYW5nZXMuCisqIFBsZWFzZSAqKmRvIG5vdCBjaGFuZ2UqKiB0aGUgdmVyc2lvbiBudW1iZXIuCisKK0ZvciBxdWVzdGlvbnMgcGxlYXNlIGpvaW4gdXMgaW4gb3VyIFtHb29nbGUgZ3JvdXBdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9ndWFyZC1kZXYpIG9yIG9uCitgI2d1YXJkYCAoaXJjLmZyZWVub2RlLm5ldCkuCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9MSUNFTlNFLnR4dCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjcxYzgKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDIyIEBACitDb3B5cmlnaHQgKGMpIDIwMTMgVGhpYmF1ZCBHdWlsbGF1bWUtR2VudGlsCisKK01JVCBMaWNlbnNlCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL1JFQURNRS5tZCBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWYwYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjk3IEBACisjIFRoaXMgaXMgYSBGb3JrCisKK1RoaXMgaXMgYSBmb3JrIG9mIHRoZSBvZmZpY2lhbCB2ZXJzaW9uIGAzLjAueGAgYnJhbmNoLiBTYXNzIG5lZWQgdG8gc3VwcG9ydCBvbGRlcgordmVyc2lvbnMgb2YgcnVieSB0aGFuIEd1YXJkIHdhbnRzIHRvIHN1cHBvcnQgb24gYW4gb25nb2luZyBiYXNpcywgc28gd2UgYXJlIHJlbGVhc2luZwordXBkYXRlcyBhcyBuZWVkZWQgZm9yIGNyaXRpY2FsIGZpeGVzIGFuZCB3aWxsIHN1cHBvcnQgcnVieSAyLjAgYW5kCitncmVhdGVyIGZvciBhcyBsb25nIGFzIFNhc3MgdXNlcnMgbmVlZCBpdC4gT3VyIGJsb2cgaGFzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RocyBbUnVieSB2ZXJzaW9uIHBvbGljeSBmb3IgU2Fzc10oaHR0cDovL2Jsb2cuc2Fzcy1sYW5nLmNvbS9wb3N0cy81NjA3MTkpLgorCisjIExpc3RlbgorCitUaGUgTGlzdGVuIGdlbSBsaXN0ZW5zIHRvIGZpbGUgbW9kaWZpY2F0aW9ucyBhbmQgbm90aWZpZXMgeW91IGFib3V0IHRoZSBjaGFuZ2VzLgorCisjIyBGZWF0dXJlcworCisqIE9TLW9wdGltaXplZCBhZGFwdGVycyBvbiBNUkkgZm9yIE1hYyBPUyBYIDEwLjYrLCBMaW51eCwgXCpCU0QgYW5kIFdpbmRvd3MsIFttb3JlIGluZm9dKCNsaXN0ZW4tYWRhcHRlcnMpIGJlbG93LgorKiBEZXRlY3RzIGZpbGUgbW9kaWZpY2F0aW9uLCBhZGRpdGlvbiBhbmQgcmVtb3ZhbC4KKyogWW91IGNhbiB3YXRjaCBtdWx0aXBsZSBkaXJlY3Rvcmllcy4KKyogUmVnZXhwLXBhdHRlcm5zIGZvciBpZ25vcmluZyBwYXRocyBmb3IgbW9yZSBhY2N1cmFjeSBhbmQgc3BlZWQKKyogSW5jcmVhc2VkIGNoYW5nZSBkZXRlY3Rpb24gYWNjdXJhY3kgb24gT1MgWCBIRlMgYW5kIFZGQVQgdm9sdW1lcy4KKyogVGVzdGVkIG9uIE1SSSBSdWJ5IGVudmlyb25tZW50cyAoMi4wKyBvbmx5KSB2aWEgW1RyYXZpcyBDSV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2d1YXJkL2xpc3RlbiksCisKKyMjIElzc3VlcyAvIGxpbWl0YXRpb25zCisKKyogTGltaXRlZCBzdXBwb3J0IGZvciBzeW1saW5rZWQgZGlyZWN0b3JpZXMgKFsjMjc5XShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2lzc3Vlcy8yNzkpKToKKyAgKiBTeW1saW5rcyBhcmUgYWx3YXlzIGZvbGxvd2VkIChbIzI1XShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2lzc3Vlcy8yNSkpLgorICAqIFN5bWxpbmtlZCBkaXJlY3RvcmllcyBwb2ludGluZyB3aXRoaW4gYSB3YXRjaGVkIGRpcmVjdG9yeSBhcmUgbm90IHN1cHBvcnRlZCAoWyMyNzNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vcHVsbC8yNzMpLSBzZWUgW0R1cGxpY2F0ZSBkaXJlY3RvcnkgZXJyb3JzXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL3dpa2kvRHVwbGljYXRlLWRpcmVjdG9yeS1lcnJvcnMpKS4KKyogTm8gZGlyZWN0b3J5L2FkYXB0ZXItc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb25zLgorKiBTdXBwb3J0IGZvciBwbHVnaW5zIHBsYW5uZWQgZm9yIGZ1dHVyZS4KKyogVENQIGZ1bmN0aW9uYWxpdHkgd2FzIHJlbW92ZWQgaW4gTGlzdGVuIFszLjAuMF0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9yZWxlYXNlcy90YWcvdjMuMC4wKSAoWyMzMTldKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vaXNzdWVzLzMxOSksIFsjMjE4XShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2lzc3Vlcy8yMTgpKS4gVGhlcmUgYXJlIHBsYW5zIHRvIGV4dHJhY3QgdGhpcyBmZWF0dXJlIHRvIHNlcGFyYXRlIGdlbXMgKFsjMjU4XShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2lzc3Vlcy8yNTgpKSwgdW50aWwgdGhpcyBpcyBmaW5pc2hlZCwgeW91IGNhbiB1c2UgYnkgbG9ja2luZyB0aGUgYGxpc3RlbmAgZ2VtIHRvIHZlcnNpb24gYCd+PiAyLjEwJ2AuCisqIFNvbWUgZmlsZXN5c3RlbXMgd29uJ3Qgd29yayB3aXRob3V0IHBvbGxpbmcgKFZNL1ZhZ3JhbnQgU2hhcmVkIGZvbGRlcnMsIE5GUywgU2FtYmEsIHNzaGZzLCBldGMuKS4KKyogU3BlY3Mgc3VpdGUgb24gSlJ1YnkgYW5kIFJ1YmluaXVzIGFyZW4ndCByZWxpYWJsZSBvbiBUcmF2aXMgQ0ksIGJ1dCBzaG91bGQgd29yay4KKyogV2luZG93cyBhbmQgXCpCU0QgYWRhcHRlciBhcmVuJ3QgY29udGludW91c2x5IGFuZCBhdXRvbWF0aWNhbGx5IHRlc3RlZC4KKyogT1NYIGFkYXB0ZXIgaGFzIHNvbWUgcGVyZm9ybWFuY2UgbGltaXRhdGlvbnMgKFsjMzQyXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2lzc3Vlcy8zNDIpKS4KKyogUnVieSAxLjkuMyBpcyBubyBsb25nZXIgbWFpbnRhaW5lZCAoYW5kIG1heSBub3Qgd29yayB3aXRoIExpc3RlbikgLSBpdCdzIGJlc3QgdG8gdXBncmFkZSB0byBSdWJ5IDIuMi4yLgorCitQdWxsIHJlcXVlc3RzIG9yIGhlbHAgaXMgdmVyeSB3ZWxjb21lIGZvciB0aGVzZS4KKworIyMgSW5zdGFsbAorCitUaGUgc2ltcGxlc3Qgd2F5IHRvIGluc3RhbGwgTGlzdGVuIGlzIHRvIHVzZSBbQnVuZGxlcl0oaHR0cDovL2J1bmRsZXIuaW8pLgorCitgYGBydWJ5CitnZW0gJ2xpc3RlbicsICd+PiAzLjAnICMgTk9URTogZm9yIFRDUCBmdW5jdGlvbmFsaXR5LCB1c2UgJ34+IDIuMTAnIGZvciBub3cKK2BgYAorCisjIyBVc2FnZQorCitDYWxsIGBMaXN0ZW4udG9gIHdpdGggZWl0aGVyIGEgc2luZ2xlIGRpcmVjdG9yeSBvciBtdWx0aXBsZSBkaXJlY3RvcmllcywgdGhlbiBkZWZpbmUgdGhlICJjaGFuZ2VzIiBjYWxsYmFjayBpbiBhIGJsb2NrLgorCitgYGAgcnVieQorbGlzdGVuZXIgPSBMaXN0ZW4udG8oJ2Rpci90by9saXN0ZW4nLCAnZGlyL3RvL2xpc3RlbjInKSBkbyB8bW9kaWZpZWQsIGFkZGVkLCByZW1vdmVkfAorICBwdXRzICJtb2RpZmllZCBhYnNvbHV0ZSBwYXRoOiAje21vZGlmaWVkfSIKKyAgcHV0cyAiYWRkZWQgYWJzb2x1dGUgcGF0aDogI3thZGRlZH0iCisgIHB1dHMgInJlbW92ZWQgYWJzb2x1dGUgcGF0aDogI3tyZW1vdmVkfSIKK2VuZAorbGlzdGVuZXIuc3RhcnQgIyBub3QgYmxvY2tpbmcKK3NsZWVwCitgYGAKKworIyMjIFBhdXNlIC8gdW5wYXVzZSAvIHN0b3AKKworTGlzdGVuZXJzIGNhbiBhbHNvIGJlIGVhc2lseSBwYXVzZWQvdW5wYXVzZWQ6CisKK2BgYCBydWJ5CitsaXN0ZW5lciA9IExpc3Rlbi50bygnZGlyL3BhdGgvdG8vbGlzdGVuJykgeyB8bW9kaWZpZWQsIGFkZGVkLCByZW1vdmVkfCBwdXRzICdoYW5kbGUgY2hhbmdlcyBoZXJlLi4uJyB9CisKK2xpc3RlbmVyLnN0YXJ0CitsaXN0ZW5lci5wYXVzZWQ/ICMgPT4gZmFsc2UKK2xpc3RlbmVyLnByb2Nlc3Npbmc/ICMgPT4gdHJ1ZQorCitsaXN0ZW5lci5wYXVzZSAgICMgc3RvcHMgcHJvY2Vzc2luZyBjaGFuZ2VzIChidXQga2VlcHMgb24gY29sbGVjdGluZyB0aGVtKQorbGlzdGVuZXIucGF1c2VkPyAjID0+IHRydWUKK2xpc3RlbmVyLnByb2Nlc3Npbmc/ICMgPT4gZmFsc2UKKworbGlzdGVuZXIudW5wYXVzZSAjIHJlc3VtZXMgcHJvY2Vzc2luZyBjaGFuZ2VzICgic3RhcnQiIHdvdWxkIGRvIHRoZSBzYW1lKQorbGlzdGVuZXIuc3RvcCAgICAjIHN0b3AgYm90aCBsaXN0ZW5pbmcgdG8gY2hhbmdlcyBhbmQgcHJvY2Vzc2luZyB0aGVtCitgYGAKKworICBOb3RlOiBXaGlsZSBwYXVzZWQsIExpc3RlbiBrZWVwcyBvbiBjb2xsZWN0aW5nIGNoYW5nZXMgaW4gdGhlIGJhY2tncm91bmQgLSB0byBjbGVhciB0aGVtLCBjYWxsICJzdG9wIgorCisgIE5vdGU6IFlvdSBzaG91bGQga2VlcCB0cmFjayBvZiBhbGwgc3RhcnRlZCBsaXN0ZW5lcnMgYW5kIHN0b3AgdGhlbSBwcm9wZXJseSBvbiBmaW5pc2guCisKKyMjIyBJZ25vcmUgLyBpZ25vcmUhCisKK0xpc3RlbiBpZ25vcmVzIHNvbWUgZGlyZWN0b3JpZXMgYW5kIGV4dGVuc2lvbnMgYnkgZGVmYXVsdCAoU2VlIERFRkFVTFRfSUdOT1JFRF9ESVJFQ1RPUklFUyBhbmQgREVGQVVMVF9JR05PUkVEX0VYVEVOU0lPTlMgaW4gTGlzdGVuOjpTaWxlbmNlciksIHlvdSBjYW4gYWRkIGlnbm9yaW5nIHBhdHRlcm5zIHdpdGggdGhlIGBpZ25vcmVgIG9wdGlvbi9tZXRob2Qgb3Igb3ZlcndyaXRlIGRlZmF1bHQgd2l0aCBgaWdub3JlIWAgb3B0aW9uL21ldGhvZC4KKworYGBgIHJ1YnkKK2xpc3RlbmVyID0gTGlzdGVuLnRvKCdkaXIvcGF0aC90by9saXN0ZW4nLCBpZ25vcmU6IC9cLnR4dC8pIHsgfG1vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZHwgIyAuLi4gfQorbGlzdGVuZXIuc3RhcnQKK2xpc3RlbmVyLmlnbm9yZSEgL1wucGtnLyAjIG92ZXJ3cml0ZSBhbGwgcGF0dGVybnMgYW5kIG9ubHkgaWdub3JlIHBrZyBleHRlbnNpb24uCitsaXN0ZW5lci5pZ25vcmUgL1wucmIvICAgIyBpZ25vcmUgcmIgZXh0ZW5zaW9uIGluIGFkZGl0aW9uIG9mIHBrZy4KK3NsZWVwCitgYGAKKworTm90ZTogYDppZ25vcmVgIHJlZ2V4cCBwYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGFnYWluc3QgcmVsYXRpdmUgcGF0aHMuCisKK05vdGU6IElnbm9yaW5nIHBhdGhzIGRvZXMgbm90IGltcHJvdmUgcGVyZm9ybWFuY2UsIGV4Y2VwdCB3aGVuIFBvbGxpbmcgKFsjMjc0XShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2lzc3Vlcy8yNzQpKQorCisjIyMgT25seQorCitMaXN0ZW4gY2F0Y2hlcyBhbGwgZmlsZXMgKGxlc3MgdGhlIGlnbm9yZWQgb25lcykgYnkgZGVmYXVsdC4gSWYgeW91IHdhbnQgdG8gb25seSBsaXN0ZW4gdG8gYSBzcGVjaWZpYyB0eXBlIG9mIGZpbGUgKGkuZS4sIGp1c3QgYC5yYmAgZXh0ZW5zaW9uKSwgeW91IHNob3VsZCB1c2UgdGhlIGBvbmx5YCBvcHRpb24vbWV0aG9kLgorCitgYGAgcnVieQorbGlzdGVuZXIgPSBMaXN0ZW4udG8oJ2Rpci9wYXRoL3RvL2xpc3RlbicsIG9ubHk6IC9cLnJiJC8pIHsgfG1vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZHwgIyAuLi4gfQorbGlzdGVuZXIuc3RhcnQKK2xpc3RlbmVyLm9ubHkgL19zcGVjXC5yYiQvICMgb3ZlcndyaXRlIGFsbCBleGlzdGluZyBvbmx5IHBhdHRlcm5zLgorc2xlZXAKK2BgYAorCitOb3RlOiBgOm9ubHlgIHJlZ2V4cCBwYXR0ZXJucyBhcmUgZXZhbHVhdGVkIG9ubHkgYWdhaW5zdCByZWxhdGl2ZSAqKmZpbGUqKiBwYXRocy4KKworCisjIyBDaGFuZ2VzIGNhbGxiYWNrCisKK0NoYW5nZXMgdG8gdGhlIGxpc3RlbmVkLXRvIGRpcmVjdG9yaWVzIGdldHMgcmVwb3J0ZWQgYmFjayB0byB0aGUgdXNlciBpbiBhIGNhbGxiYWNrLgorVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZ2V0cyBpbnZva2VkLCB3aGVuIHRoZXJlIGFyZSBjaGFuZ2VzLCB3aXRoICoqdGhyZWUqKiBwYXJhbWV0ZXJzOgorYG1vZGlmaWVkYCwgYGFkZGVkYCBhbmQgYHJlbW92ZWRgIHBhdGhzLCBpbiB0aGF0IHBhcnRpY3VsYXIgb3JkZXIuCitQYXRocyBhcmUgYWx3YXlzIHJldHVybmVkIGluIHRoZWlyIGFic29sdXRlIGZvcm0uCisKK0V4YW1wbGU6CisKK2BgYHJ1YnkKK2xpc3RlbmVyID0gTGlzdGVuLnRvKCdwYXRoL3RvL2FwcCcpIGRvIHxtb2RpZmllZCwgYWRkZWQsIHJlbW92ZWR8CisgICMgVGhpcyBibG9jayB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBjaGFuZ2VzLgorZW5kCitsaXN0ZW5lci5zdGFydAorc2xlZXAKK2BgYAorCitvciAuLi4KKworYGBgcnVieQorIyBDcmVhdGUgYSBjYWxsYmFjaworY2FsbGJhY2sgPSBQcm9jLm5ldyBkbyB8bW9kaWZpZWQsIGFkZGVkLCByZW1vdmVkfAorICAjIFRoaXMgcHJvYyB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBjaGFuZ2VzLgorZW5kCitsaXN0ZW5lciA9IExpc3Rlbi50bygnZGlyJywgJmNhbGxiYWNrKQorbGlzdGVuZXIuc3RhcnQKK3NsZWVwCitgYGAKKworIyMgT3B0aW9ucworCitBbGwgdGhlIGZvbGxvd2luZyBvcHRpb25zIGNhbiBiZSBzZXQgdGhyb3VnaCB0aGUgYExpc3Rlbi50b2AgYWZ0ZXIgdGhlIGRpcmVjdG9yeSBwYXRoKHMpIHBhcmFtcy4KKworYGBgcnVieQoraWdub3JlOiBbJXJ7L2Zvby9iYXJ9LCAvXC5waWQkLywgL1wuY29mZmVlJC9dICAgIyBJZ25vcmUgYSBsaXN0IG9mIHBhdGhzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmF1bHQ6IFNlZSBERUZBVUxUX0lHTk9SRURfRElSRUNUT1JJRVMgYW5kIERFRkFVTFRfSUdOT1JFRF9FWFRFTlNJT05TIGluIExpc3Rlbjo6U2lsZW5jZXIKKworaWdub3JlITogJXJ7L2Zvby9iYXJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTYW1lIGFzIGlnbm9yZSBvcHRpb25zLCBidXQgb3ZlcndyaXRlIGRlZmF1bHQgaWdub3JlZCBwYXRocy4KKworb25seTogJXJ7LnJiJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPbmx5IGxpc3RlbiB0byBzcGVjaWZpYyBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWZhdWx0OiBub25lCisKK2xhdGVuY3k6IDAuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2V0IHRoZSBkZWxheSAoKippbiBzZWNvbmRzKiopIGJldHdlZW4gY2hlY2tpbmcgZm9yIGNoYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVmYXVsdDogMC4yNSBzZWMgKDEuMCBzZWMgZm9yIHBvbGxpbmcpCisKK3dhaXRfZm9yX2RlbGF5OiA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2V0IHRoZSBkZWxheSAoKippbiBzZWNvbmRzKiopIGJldHdlZW4gY2FsbHMgdG8gdGhlIGNhbGxiYWNrIHdoZW4gY2hhbmdlcyBleGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWZhdWx0OiAwLjEwIHNlYworCitmb3JjZV9wb2xsaW5nOiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZvcmNlIHRoZSB1c2Ugb2YgdGhlIHBvbGxpbmcgYWRhcHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWZhdWx0OiBub25lCisKK3JlbGF0aXZlOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2hldGhlciBjaGFuZ2VzIHNob3VsZCBiZSByZWxhdGl2ZSB0byBjdXJyZW50IGRpciBvciBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVmYXVsdDogZmFsc2UKKworcG9sbGluZ19mYWxsYmFja19tZXNzYWdlOiAnY3VzdG9tIG1lc3NhZ2UnICAgICAgIyBTZXQgYSBjdXN0b20gcG9sbGluZyBmYWxsYmFjayBtZXNzYWdlIChvciBkaXNhYmxlIGl0IHdpdGggZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmF1bHQ6ICJMaXN0ZW4gd2lsbCBiZSBwb2xsaW5nIGZvciBjaGFuZ2VzLiBMZWFybiBtb3JlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4jbGlzdGVuLWFkYXB0ZXJzLiIKK2BgYAorCisjIyBEZWJ1Z2dpbmcKKworU2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYExJU1RFTl9HRU1fREVCVUdHSU5HPTFgIHNldHMgdXAgdGhlIElORk8gbGV2ZWwgbG9nZ2VyLCB3aGlsZSBgTElTVEVOX0dFTV9ERUJVR0dJTkc9MmAgc2V0cyB1cCB0aGUgREVCVUcgbGV2ZWwgbG9nZ2VyLiAKKworWW91IGNhbiBhbHNvIHNldCBgTGlzdGVuLmxvZ2dlcmAgdG8gYSBjdXN0b20gbG9nZ2VyLgorCisKKyMjIExpc3RlbiBhZGFwdGVycworCitUaGUgTGlzdGVuIGdlbSBoYXMgYSBzZXQgb2YgYWRhcHRlcnMgdG8gbm90aWZ5IGl0IHdoZW4gdGhlcmUgYXJlIGNoYW5nZXMuCisKK1RoZXJlIGFyZSA0IE9TLXNwZWNpZmljIGFkYXB0ZXJzIHRvIHN1cHBvcnQgRGFyd2luLCBMaW51eCwgXCpCU0QgYW5kIFdpbmRvd3MuCitUaGVzZSBhZGFwdGVycyBhcmUgZmFzdCBhcyB0aGV5IHVzZSBzb21lIHN5c3RlbS1jYWxscyB0byBpbXBsZW1lbnQgdGhlIG5vdGlmeWluZyBmdW5jdGlvbi4KKworVGhlcmUgaXMgYWxzbyBhIHBvbGxpbmcgYWRhcHRlciAtIGFsdGhvdWdoIGl0J3MgbXVjaCBzbG93ZXIgdGhhbiBvdGhlciBhZGFwdGVycywKK2l0IHdvcmtzIG9uIGV2ZXJ5IHBsYXRmb3JtL3N5c3RlbSBhbmQgc2NlbmFyaW8gKGluY2x1ZGluZyBuZXR3b3JrIGZpbGVzeXN0ZW1zIHN1Y2ggYXMgVk0gc2hhcmVkIGZvbGRlcnMpLgorCitUaGUgRGFyd2luIGFuZCBMaW51eCBhZGFwdGVycyBhcmUgZGVwZW5kZW5jaWVzIG9mIHRoZSBMaXN0ZW4gZ2VtIHNvIHRoZXkgd29yayBvdXQgb2YgdGhlIGJveC4gRm9yIG90aGVyIGFkYXB0ZXJzIGEgc3BlY2lmaWMgZ2VtIHdpbGwgaGF2ZSB0byBiZSBhZGRlZCB0byB5b3VyIEdlbWZpbGUsIHBsZWFzZSByZWFkIGJlbG93LgorCitUaGUgTGlzdGVuIGdlbSB3aWxsIGNob29zZSB0aGUgYmVzdCBhZGFwdGVyIGF1dG9tYXRpY2FsbHksIGlmIHByZXNlbnQuIElmIHlvdQord2FudCB0byBmb3JjZSB0aGUgdXNlIG9mIHRoZSBwb2xsaW5nIGFkYXB0ZXIsIHVzZSB0aGUgYDpmb3JjZV9wb2xsaW5nYCBvcHRpb24KK3doaWxlIGluaXRpYWxpemluZyB0aGUgbGlzdGVuZXIuCisKKyMjIyBPbiBXaW5kb3dzCisKK0lmIHlvdSBhcmUgb24gV2luZG93cywgaXQncyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIFtgd2RtYF0oaHR0cHM6Ly9naXRodWIuY29tL01haGVyNEV2ZXIvd2RtKSBhZGFwdGVyIGluc3RlYWQgb2YgcG9sbGluZy4KKworUGxlYXNlIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgR2VtZmlsZToKKworYGBgcnVieQorZ2VtICd3ZG0nLCAnPj0gMC4xLjAnIGlmIEdlbS53aW5fcGxhdGZvcm0/CitgYGAKKworIyMjIE9uIFwqQlNECisKK0lmIHlvdSBhcmUgb24gXCpCU0QgeW91IGNhbiB0cnkgdG8gdXNlIHRoZSBbYHJiLWtxdWV1ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXQ4MTMvcmIta3F1ZXVlKSBhZGFwdGVyIGluc3RlYWQgb2YgcG9sbGluZy4KKworUGxlYXNlIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgR2VtZmlsZToKKworYGBgcnVieQorcmVxdWlyZSAncmJjb25maWcnCitpZiBSYkNvbmZpZzo6Q09ORklHWyd0YXJnZXRfb3MnXSA9fiAvYnNkfGRyYWdvbmZseS9pCisgIGdlbSAncmIta3F1ZXVlJywgJz49IDAuMicKK2VuZAorCitgYGAKKworIyMjIEdldHRpbmcgdGhlIFtwb2xsaW5nIGZhbGxiYWNrIG1lc3NhZ2VdKCNvcHRpb25zKT8KKworUGxlYXNlIHZpc2l0IHRoZSBbaW5zdGFsbGF0aW9uIHNlY3Rpb24gb2YgdGhlIExpc3RlbiBXSUtJXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL3dpa2kjaW5zdGFsbGF0aW9uKSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgb3B0aW9ucyBmb3IgcG90ZW50aWFsIGZpeGVzLgorCisjIyMgSXNzdWVzIGFuZCB0cm91Ymxlc2hvb3RpbmcKKworKk5PVEU6IHdpdGhvdXQgcHJvdmlkaW5nIHRoZSBvdXRwdXQgYWZ0ZXIgc2V0dGluZyB0aGUgYExJU1RFTl9HRU1fREVCVUdHSU5HPTFgIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdCBjYW4gYmUgYWxtb3N0IGltcG9zc2libGUgdG8gZ3Vlc3Mgd2h5IGxpc3RlbiBpcyBub3Qgd29ya2luZyBhcyBleHBlY3RlZC4qCisKK1NlZSBbVFJPVUJMRVNIT09USU5HXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL3dpa2kvVHJvdWJsZXNob290aW5nKQorCisjIyBQZXJmb3JtYW5jZQorCitJZiBMaXN0ZW4gc2VlbXMgc2xvdyBvciB1bnJlc3BvbnNpdmUsIG1ha2Ugc3VyZSB5b3UncmUgbm90IHVzaW5nIHRoZSBQb2xsaW5nIGFkYXB0ZXIgKHlvdSBzaG91bGQgc2VlIGEgd2FybmluZyB1cG9uIHN0YXJ0dXAgaWYgeW91IGFyZSkuCisKK0Fsc28sIGlmIHRoZSBkaXJlY3RvcmllcyB5b3UncmUgd2F0Y2hpbmcgY29udGFpbiBtYW55IGZpbGVzLCBtYWtlIHN1cmUgeW91J3JlOgorCisqIG5vdCB1c2luZyBQb2xsaW5nIChpZGVhbGx5KQorKiB1c2luZyBgOmlnbm9yZWAgYW5kIGA6b25seWAgb3B0aW9ucyB0byBhdm9pZCB0cmFja2luZyBkaXJlY3RvcmllcyB5b3UgZG9uJ3QgY2FyZSBhYm91dCAoaW1wb3J0YW50IHdpdGggUG9sbGluZyBhbmQgb24gTWFjT1MpCisqIHJ1bm5pbmcgTGlzdGVuIHdpdGggdGhlIGA6bGF0ZW5jeWAgYW5kIGA6d2FpdF9mb3JfZGVsYXlgIG9wdGlvbnMgbm90IHRvbyBzbWFsbCBvciB0b28gYmlnIChkZXBlbmRzIG9uIG5lZWRzKQorKiBub3Qgd2F0Y2hpbmcgZGlyZWN0b3JpZXMgd2l0aCBsb2cgZmlsZXMsIGRhdGFiYXNlIGZpbGVzIG9yIG90aGVyIGZyZXF1ZW50bHkgY2hhbmdpbmcgZmlsZXMKKyogbm90IHVzaW5nIGEgdmVyc2lvbiBvZiBMaXN0ZW4gcHJpb3IgdG8gMi43LjcKKyogbm90IGdldHRpbmcgc2lsZW50IGNyYXNoZXMgd2l0aGluIExpc3RlbiAoc2VlIExJU1RFTl9HRU1fREVCVUdHSU5HPTIpCisqIG5vdCBydW5uaW5nIG11bHRpcGxlIGluc3RhbmNlcyBvZiBMaXN0ZW4gaW4gdGhlIGJhY2tncm91bmQKKyogdXNpbmcgYSBmaWxlIHN5c3RlbSB3aXRoIGF0aW1lIG1vZGlmaWNhdGlvbiBkaXNhYmxlZCAoaWRlYWxseSkKKyogbm90IHVzaW5nIGEgZmlsZXN5c3RlbSB3aXRoIGluYWNjdXJhdGUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgKGlkZWFsbHkpLCBlLmcuIEhGUywgVkZBVAorKiBub3QgYnVmZmVyaW5nIHRvIGEgc2xvdyB0ZXJtaW5hbCAoZS5nLiB0cmFuc3BhcmVuY3kgKyBmYW5jeSBmb250ICsgc2xvdyBnZnggY2FyZCArIGxvdHMgb2Ygb3V0cHV0KQorKiBpZGVhbGx5IG5vdCBydW5uaW5nIGEgc2xvdyBlbmNyeXB0aW9uIHN0YWNrLCBlLmcuIGJ0cmZzICsgZWNyeXB0ZnMKKworV2hlbiBpbiBkb3VidCwgTElTVEVOX0dFTV9ERUJVR0dJTkc9MiBjYW4gaGVscCBkaXNjb3ZlciB0aGUgYWN0dWFsIGV2ZW50cyBhbmQgdGltZSB0aGV5IGhhcHBlbmVkLgorCitTZWUgYWxzbyBbVGlwcyBhbmQgVGVjaG5pcXVlc10oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi93aWtpL1RpcHMtYW5kLVRlY2huaXF1ZXMpLgorCisjIyBEZXZlbG9wbWVudAorCisqIERvY3VtZW50YXRpb24gaG9zdGVkIGF0IFtSdWJ5RG9jXShodHRwOi8vcnVieWRvYy5pbmZvL2dpdGh1Yi9ndWFyZC9saXN0ZW4vbWFzdGVyL2ZyYW1lcykuCisqIFNvdXJjZSBob3N0ZWQgYXQgW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3RlbikuCisKK1B1bGwgcmVxdWVzdHMgYXJlIHZlcnkgd2VsY29tZSEgUGxlYXNlIHRyeSB0byBmb2xsb3cgdGhlc2Ugc2ltcGxlIHJ1bGVzIGlmIGFwcGxpY2FibGU6CisKKyogUGxlYXNlIGNyZWF0ZSBhIHRvcGljIGJyYW5jaCBmb3IgZXZlcnkgc2VwYXJhdGUgY2hhbmdlIHlvdSBtYWtlLgorKiBNYWtlIHN1cmUgeW91ciBwYXRjaGVzIGFyZSB3ZWxsIHRlc3RlZC4gQWxsIHNwZWNzIG11c3QgcGFzcyBvbiBbVHJhdmlzIENJXShodHRwczovL3RyYXZpcy1jaS5vcmcvZ3VhcmQvbGlzdGVuKS4KKyogVXBkYXRlIHRoZSBbWWFyZF0oaHR0cDovL3lhcmRvYy5vcmcvKSBkb2N1bWVudGF0aW9uLgorKiBVcGRhdGUgdGhlIFtSRUFETUVdKGh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4vYmxvYi9tYXN0ZXIvUkVBRE1FLm1kKS4KKyogUGxlYXNlICoqZG8gbm90IGNoYW5nZSoqIHRoZSB2ZXJzaW9uIG51bWJlci4KKworRm9yIHF1ZXN0aW9ucyBwbGVhc2Ugam9pbiB1cyBpbiBvdXIgW0dvb2dsZSBncm91cF0oaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2d1YXJkLWRldikgb3Igb24KK2AjZ3VhcmRgIChpcmMuZnJlZW5vZGUubmV0KS4KKworIyMgQWNrbm93bGVkZ21lbnRzCisKKyogW01pY2hhZWwgS2Vzc2xlciAobmV0enBpcmF0KV1bXSBmb3IgaGF2aW5nIHdyaXR0ZW4gdGhlIFtpbml0aWFsIHNwZWNzXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2NvbW1pdC8xZTQ1N2IxM2IxYmI4YTI1ZDIyNDA0MjhjZTVlZDQ4OGJhZmJlZDFmKS4KKyogW1RyYXZpcyBUaWxsZXkgKHR0aWxsZXkpXVtdIGZvciB0aGlzIGF3ZXNvbWUgd29yayBvbiBbZnNzbV1bXSAmIFtyYi1mc2V2ZW50XVtdLgorKiBbTmF0aGFuIFdlaXplbmJhdW0gKG5leDMpXVtdIGZvciBbcmItaW5vdGlmeV1bXSwgYSB0aG9yb3VnaCBpbm90aWZ5IHdyYXBwZXIuCisqIFtNYXRoaWV1IEFybm9sZCAobWF0ODEzKV1bXSBmb3IgW3JiLWtxdWV1ZV1bXSwgYSBzaW1wbGUga3F1ZXVlIHdyYXBwZXIuCisqIFtNYWhlciBTYWxsYW1dW10gZm9yIFt3ZG1dW10sIHdpbmRvd3Mgc3VwcG9ydCB3b3VsZG4ndCBleGlzdCB3aXRob3V0IGhpbS4KKyogW1llaHVkYSBLYXR6ICh3eWNhdHMpXVtdIGZvciBbdmlnaWxvXVtdLCB0aGF0IGhhcyBiZWVuIGEgZ3JlYXQgc291cmNlIG9mIGluc3BpcmF0aW9uLgorCisjIyBBdXRob3IKKworW1RoaWJhdWQgR3VpbGxhdW1lLUdlbnRpbF0oaHR0cHM6Ly9naXRodWIuY29tL3RoaWJhdWRnZykgKFtAdGhpYmF1ZGdnXShodHRwczovL3R3aXR0ZXIuY29tL3RoaWJhdWRnZykpCisKKyMjIENvbnRyaWJ1dG9ycworCitbaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi9ncmFwaHMvY29udHJpYnV0b3JzXShodHRwczovL2dpdGh1Yi5jb20vZ3VhcmQvbGlzdGVuL2dyYXBocy9jb250cmlidXRvcnMpCisKK1tUaGliYXVkIEd1aWxsYXVtZS1HZW50aWwgKHRoaWJhdWRnZyldOiBodHRwczovL2dpdGh1Yi5jb20vdGhpYmF1ZGdnCitbTWFoZXIgU2FsbGFtXTogaHR0cHM6Ly9naXRodWIuY29tL01haGVyNEV2ZXIKK1tNaWNoYWVsIEtlc3NsZXIgKG5ldHpwaXJhdCldOiBodHRwczovL2dpdGh1Yi5jb20vbmV0enBpcmF0CitbVHJhdmlzIFRpbGxleSAodHRpbGxleSldOiBodHRwczovL2dpdGh1Yi5jb20vdHRpbGxleQorW2Zzc21dOiBodHRwczovL2dpdGh1Yi5jb20vdHRpbGxleS9mc3NtCitbcmItZnNldmVudF06IGh0dHBzOi8vZ2l0aHViLmNvbS90aGliYXVkZ2cvcmItZnNldmVudAorW01hdGhpZXUgQXJub2xkIChtYXQ4MTMpXTogaHR0cHM6Ly9naXRodWIuY29tL21hdDgxMworW05hdGhhbiBXZWl6ZW5iYXVtIChuZXgzKV06IGh0dHBzOi8vZ2l0aHViLmNvbS9uZXgzCitbcmItaW5vdGlmeV06IGh0dHBzOi8vZ2l0aHViLmNvbS9uZXgzL3JiLWlub3RpZnkKK1tzdGVyZW9ib29zdGVyXTogaHR0cHM6Ly9naXRodWIuY29tL3N0ZXJlb2Jvb3N0ZXIKK1tyYi1mY2hhbmdlXTogaHR0cHM6Ly9naXRodWIuY29tL3N0ZXJlb2Jvb3N0ZXIvcmItZmNoYW5nZQorW3JiLWtxdWV1ZV06IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXQ4MTMvcmIta3F1ZXVlCitbWWVodWRhIEthdHogKHd5Y2F0cyldOiBodHRwczovL2dpdGh1Yi5jb20vd3ljYXRzCitbdmlnaWxvXTogaHR0cHM6Ly9naXRodWIuY29tL3d5Y2F0cy92aWdpbG8KK1t3ZG1dOiBodHRwczovL2dpdGh1Yi5jb20vTWFoZXI0RXZlci93ZG0KZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWM5MTRmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuLnJiCkBAIC0wLDAgKzEsNTUgQEAKK3JlcXVpcmUgJ2xvZ2dlcicKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2xvZ2dlcicKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2xpc3RlbmVyJworCityZXF1aXJlICdzYXNzLWxpc3Rlbi9pbnRlcm5hbHMvdGhyZWFkX3Bvb2wnCisKKyMgQWx3YXlzIHNldCB1cCBsb2dnaW5nIGJ5IGRlZmF1bHQgZmlyc3QgdGltZSBmaWxlIGlzIHJlcXVpcmVkCisjCisjIE5PVEU6IElmIHlvdSBuZWVkIHRvIGNsZWFyIHRoZSBsb2dnZXIgY29tcGxldGVseSwgZG8gc28gKmFmdGVyKgorIyByZXF1aXJpbmcgdGhpcyBmaWxlLiBJZiB5b3UgbmVlZCB0byBzZXQgYSBjdXN0b20gbG9nZ2VyLAorIyByZXF1aXJlIHRoZSBsaXN0ZW4vbG9nZ2VyIGZpbGUgYW5kIHNldCB0aGUgbG9nZ2VyIGJlZm9yZSByZXF1aXJpbmcKKyMgdGhpcyBmaWxlLgorU2Fzc0xpc3Rlbi5zZXR1cF9kZWZhdWx0X2xvZ2dlcl9pZl91bnNldAorCisjIFdvbid0IHByaW50IGFueXRoaW5nIGJ5IGRlZmF1bHQgYmVjYXVzZSBvZiBsZXZlbCAtIHVubGVzcyB5b3UndmUgc2V0CisjIExJU1RFTl9HRU1fREVCVUdHSU5HIG9yIHByb3ZpZGVkIHlvdXIgb3duIGxvZ2dlciB3aXRoIGEgaGlnaCBlbm91Z2ggbGV2ZWwKK1Nhc3NMaXN0ZW46OkxvZ2dlci5pbmZvICJTYXNzTGlzdGVuIGxvZ2xldmVsIHNldCB0bzogI3tTYXNzTGlzdGVuLmxvZ2dlci5sZXZlbH0iCitTYXNzTGlzdGVuOjpMb2dnZXIuaW5mbyAiU2Fzc0xpc3RlbiB2ZXJzaW9uOiAje1Nhc3NMaXN0ZW46OlZFUlNJT059IgorCittb2R1bGUgU2Fzc0xpc3RlbgorICBjbGFzcyA8PCBzZWxmCisgICAgIyBMaXN0ZW5zIHRvIGZpbGUgc3lzdGVtIG1vZGlmaWNhdGlvbnMgb24gYSBlaXRoZXIgc2luZ2xlIGRpcmVjdG9yeSBvcgorICAgICMgbXVsdGlwbGUgZGlyZWN0b3JpZXMuCisgICAgIworICAgICMgQHBhcmFtIChzZWUgU2Fzc0xpc3Rlbjo6TGlzdGVuZXIjbmV3KQorICAgICMKKyAgICAjIEB5aWVsZCBbbW9kaWZpZWQsIGFkZGVkLCByZW1vdmVkXSB0aGUgY2hhbmdlZCBmaWxlcworICAgICMgQHlpZWxkcGFyYW0gW0FycmF5PFN0cmluZz5dIG1vZGlmaWVkIHRoZSBsaXN0IG9mIG1vZGlmaWVkIGZpbGVzCisgICAgIyBAeWllbGRwYXJhbSBbQXJyYXk8U3RyaW5nPl0gYWRkZWQgdGhlIGxpc3Qgb2YgYWRkZWQgZmlsZXMKKyAgICAjIEB5aWVsZHBhcmFtIFtBcnJheTxTdHJpbmc+XSByZW1vdmVkIHRoZSBsaXN0IG9mIHJlbW92ZWQgZmlsZXMKKyAgICAjCisgICAgIyBAcmV0dXJuIFtTYXNzTGlzdGVuOjpMaXN0ZW5lcl0gdGhlIGxpc3RlbmVyCisgICAgIworICAgIGRlZiB0bygqYXJncywgJmJsb2NrKQorICAgICAgQGxpc3RlbmVycyB8fD0gW10KKyAgICAgIExpc3RlbmVyLm5ldygqYXJncywgJmJsb2NrKS50YXAgZG8gfGxpc3RlbmVyfAorICAgICAgICBAbGlzdGVuZXJzIDw8IGxpc3RlbmVyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBgbGlzdGVuYCBiaW5hcnkgdG8gaGFuZGxlIEN0cmwtQworICAgICMKKyAgICBkZWYgc3RvcAorICAgICAgSW50ZXJuYWxzOjpUaHJlYWRQb29sLnN0b3AKKyAgICAgIEBsaXN0ZW5lcnMgfHw9IFtdCisKKyAgICAgICMgVE9ETzogc2hvdWxkIHVzZSBhIG11dGV4IGZvciB0aGlzCisgICAgICBAbGlzdGVuZXJzLmVhY2ggZG8gfGxpc3RlbmVyfAorICAgICAgICAjIGNhbGwgc3RvcCB0byBoYWx0IHRoZSBtYWluIGxvb3AKKyAgICAgICAgbGlzdGVuZXIuc3RvcAorICAgICAgZW5kCisgICAgICBAbGlzdGVuZXJzID0gbmlsCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vYWRhcHRlci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTQ5NzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vYWRhcHRlci5yYgpAQCAtMCwwICsxLDQzIEBACityZXF1aXJlICdzYXNzLWxpc3Rlbi9hZGFwdGVyL2Jhc2UnCityZXF1aXJlICdzYXNzLWxpc3Rlbi9hZGFwdGVyL2JzZCcKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2FkYXB0ZXIvZGFyd2luJworcmVxdWlyZSAnc2Fzcy1saXN0ZW4vYWRhcHRlci9saW51eCcKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2FkYXB0ZXIvcG9sbGluZycKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2FkYXB0ZXIvd2luZG93cycKKworbW9kdWxlIFNhc3NMaXN0ZW4KKyAgbW9kdWxlIEFkYXB0ZXIKKyAgICBPUFRJTUlaRURfQURBUFRFUlMgPSBbRGFyd2luLCBMaW51eCwgQlNELCBXaW5kb3dzXQorICAgIFBPTExJTkdfRkFMTEJBQ0tfTUVTU0FHRSA9ICdTYXNzTGlzdGVuIHdpbGwgYmUgcG9sbGluZyBmb3IgY2hhbmdlcy4nXAorICAgICAgJ0xlYXJuIG1vcmUgYXQgaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3RlbiNsaXN0ZW4tYWRhcHRlcnMuJworCisgICAgZGVmIHNlbGYuc2VsZWN0KG9wdGlvbnMgPSB7fSkKKyAgICAgIF9sb2cgOmRlYnVnLCAnQWRhcHRlcjogY29uc2lkZXJpbmcgcG9sbGluZyAuLi4nCisgICAgICByZXR1cm4gUG9sbGluZyBpZiBvcHRpb25zWzpmb3JjZV9wb2xsaW5nXQorICAgICAgX2xvZyA6ZGVidWcsICdBZGFwdGVyOiBjb25zaWRlcmluZyBvcHRpbWl6ZWQgYmFja2VuZC4uLicKKyAgICAgIHJldHVybiBfdXNhYmxlX2FkYXB0ZXJfY2xhc3MgaWYgX3VzYWJsZV9hZGFwdGVyX2NsYXNzCisgICAgICBfbG9nIDpkZWJ1ZywgJ0FkYXB0ZXI6IGZhbGxpbmcgYmFjayB0byBwb2xsaW5nLi4uJworICAgICAgX3dhcm5fcG9sbGluZ19mYWxsYmFjayhvcHRpb25zKQorICAgICAgUG9sbGluZworICAgIHJlc2N1ZQorICAgICAgX2xvZyA6d2FybiwgZm9ybWF0KCdBZGFwdGVyOiBmYWlsZWQ6ICVzOiVzJywgJEVSUk9SX1BPU0lUSU9OLmluc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgJEVSUk9SX1BPU0lUSU9OICogIlxuIikKKyAgICAgIHJhaXNlCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBkZWYgc2VsZi5fdXNhYmxlX2FkYXB0ZXJfY2xhc3MKKyAgICAgIE9QVElNSVpFRF9BREFQVEVSUy5kZXRlY3QoJjp1c2FibGU/KQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuX3dhcm5fcG9sbGluZ19mYWxsYmFjayhvcHRpb25zKQorICAgICAgbXNnID0gb3B0aW9ucy5mZXRjaCg6cG9sbGluZ19mYWxsYmFja19tZXNzYWdlLCBQT0xMSU5HX0ZBTExCQUNLX01FU1NBR0UpCisgICAgICBLZXJuZWwud2FybiAiW1Nhc3NMaXN0ZW4gd2FybmluZ106XG4gICN7bXNnfSIgaWYgbXNnCisgICAgZW5kCisKKyAgICBkZWYgc2VsZi5fbG9nKHR5cGUsIG1lc3NhZ2UpCisgICAgICBTYXNzTGlzdGVuOjpMb2dnZXIuc2VuZCh0eXBlLCBtZXNzYWdlKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2FkYXB0ZXIvYmFzZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2Jhc2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOTA3MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2Jhc2UucmIKQEAgLTAsMCArMSwxMzcgQEAKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL29wdGlvbnMnCityZXF1aXJlICdzYXNzLWxpc3Rlbi9yZWNvcmQnCityZXF1aXJlICdzYXNzLWxpc3Rlbi9jaGFuZ2UnCisKK21vZHVsZSBTYXNzTGlzdGVuCisgIG1vZHVsZSBBZGFwdGVyCisgICAgY2xhc3MgQmFzZQorICAgICAgYXR0cl9yZWFkZXIgOm9wdGlvbnMKKworICAgICAgIyBUT0RPOiBvbmx5IHVzZWQgYnkgdGVzdHMKKyAgICAgIERFRkFVTFRTID0ge30KKworICAgICAgYXR0cl9yZWFkZXIgOmNvbmZpZworCisgICAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcpCisgICAgICAgIEBzdGFydGVkID0gZmFsc2UKKyAgICAgICAgQGNvbmZpZyA9IGNvbmZpZworCisgICAgICAgIEBjb25maWd1cmVkID0gbmlsCisKKyAgICAgICAgZmFpbCAnTm8gZGlyZWN0b3JpZXMgdG8gd2F0Y2ghJyBpZiBjb25maWcuZGlyZWN0b3JpZXMuZW1wdHk/CisKKyAgICAgICAgZGVmYXVsdHMgPSBzZWxmLmNsYXNzLmNvbnN0X2dldCgnREVGQVVMVFMnKQorICAgICAgICBAb3B0aW9ucyA9IFNhc3NMaXN0ZW46Ok9wdGlvbnMubmV3KGNvbmZpZy5hZGFwdGVyX29wdGlvbnMsIGRlZmF1bHRzKQorICAgICAgcmVzY3VlCisgICAgICAgIF9sb2dfZXhjZXB0aW9uICdhZGFwdGVyIGNvbmZpZyBmYWlsZWQ6ICVzOiVzIGNhbGxlZCBmcm9tOiAlcycsIGNhbGxlcgorICAgICAgICByYWlzZQorICAgICAgZW5kCisKKyAgICAgICMgVE9ETzogaXQncyBhIHNlcGFyYXRlIG1ldGhvZCBhcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciB0ZXN0cworICAgICAgZGVmIGNvbmZpZ3VyZQorICAgICAgICBpZiBAY29uZmlndXJlZAorICAgICAgICAgIF9sb2coOndhcm4sICdBZGFwdGVyIGFscmVhZHkgY29uZmlndXJlZCEnKQorICAgICAgICAgIHJldHVybgorICAgICAgICBlbmQKKworICAgICAgICBAY29uZmlndXJlZCA9IHRydWUKKworICAgICAgICBAY2FsbGJhY2tzIHx8PSB7fQorICAgICAgICBjb25maWcuZGlyZWN0b3JpZXMuZWFjaCBkbyB8ZGlyfAorICAgICAgICAgIGNhbGxiYWNrID0gQGNhbGxiYWNrc1tkaXJdIHx8IGxhbWJkYSBkbyB8ZXZlbnR8CisgICAgICAgICAgICBfcHJvY2Vzc19ldmVudChkaXIsIGV2ZW50KQorICAgICAgICAgIGVuZAorICAgICAgICAgIEBjYWxsYmFja3NbZGlyXSA9IGNhbGxiYWNrCisgICAgICAgICAgX2NvbmZpZ3VyZShkaXIsICZjYWxsYmFjaykKKyAgICAgICAgZW5kCisKKyAgICAgICAgQHNuYXBzaG90cyB8fD0ge30KKyAgICAgICAgIyBUT0RPOiBzZXBhcmF0ZSBjb25maWcgcGVyIGRpcmVjdG9yeSAoc29tZSBkYXkgbWF5YmUpCisgICAgICAgIGNoYW5nZV9jb25maWcgPSBDaGFuZ2U6OkNvbmZpZy5uZXcoY29uZmlnLnF1ZXVlLCBjb25maWcuc2lsZW5jZXIpCisgICAgICAgIGNvbmZpZy5kaXJlY3Rvcmllcy5lYWNoIGRvIHxkaXJ8CisgICAgICAgICAgcmVjb3JkID0gUmVjb3JkLm5ldyhkaXIpCisgICAgICAgICAgc25hcHNob3QgPSBDaGFuZ2UubmV3KGNoYW5nZV9jb25maWcsIHJlY29yZCkKKyAgICAgICAgICBAc25hcHNob3RzW2Rpcl0gPSBzbmFwc2hvdAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3RhcnRlZD8KKyAgICAgICAgQHN0YXJ0ZWQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc3RhcnQKKyAgICAgICAgY29uZmlndXJlCisKKyAgICAgICAgaWYgc3RhcnRlZD8KKyAgICAgICAgICBfbG9nKDp3YXJuLCAnQWRhcHRlciBhbHJlYWR5IHN0YXJ0ZWQhJykKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW5kCisKKyAgICAgICAgQHN0YXJ0ZWQgPSB0cnVlCisKKyAgICAgICAgY2FsbGluZ19zdGFjayA9IGNhbGxlci5kdXAKKyAgICAgICAgU2Fzc0xpc3Rlbjo6SW50ZXJuYWxzOjpUaHJlYWRQb29sLmFkZCBkbworICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBAc25hcHNob3RzLnZhbHVlcy5lYWNoIGRvIHxzbmFwc2hvdHwKKyAgICAgICAgICAgICAgX3RpbWVkKCdSZWNvcmQuYnVpbGQoKScpIHsgc25hcHNob3QucmVjb3JkLmJ1aWxkIH0KKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgX3J1bgorICAgICAgICAgIHJlc2N1ZQorICAgICAgICAgICAgbXNnID0gJ3J1bigpIGluIHRocmVhZCBmYWlsZWQ6ICVzOlxuJ1wKKyAgICAgICAgICAgICAgJyAlc1xuXG5jYWxsZWQgZnJvbTpcbiAlcycKKyAgICAgICAgICAgIF9sb2dfZXhjZXB0aW9uKG1zZywgY2FsbGluZ19zdGFjaykKKyAgICAgICAgICAgIHJhaXNlICMgZm9yIHVuaXQgdGVzdHMgbW9zdGx5CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdG9wCisgICAgICAgIF9zdG9wCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudXNhYmxlPworICAgICAgICBjb25zdF9nZXQoJ09TX1JFR0VYUCcpID1+IFJiQ29uZmlnOjpDT05GSUdbJ3RhcmdldF9vcyddCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICBkZWYgX3N0b3AKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3RpbWVkKHRpdGxlKQorICAgICAgICBzdGFydCA9IFRpbWUubm93LnRvX2YKKyAgICAgICAgeWllbGQKKyAgICAgICAgZGlmZiA9IFRpbWUubm93LnRvX2YgLSBzdGFydAorICAgICAgICBTYXNzTGlzdGVuOjpMb2dnZXIuaW5mbyBmb3JtYXQoJyVzOiAlLjA1ZiBzZWNvbmRzJywgdGl0bGUsIGRpZmYpCisgICAgICByZXNjdWUKKyAgICAgICAgU2Fzc0xpc3Rlbjo6TG9nZ2VyLndhcm4gIiN7dGl0bGV9IGNyYXNoZWQ6ICN7JEVSUk9SX0lORk8uaW5zcGVjdH0iCisgICAgICAgIHJhaXNlCisgICAgICBlbmQKKworICAgICAgIyBUT0RPOiBhbGxvdyBiYWNrZW5kIGFkYXB0ZXJzIHRvIHBhc3Mgc3BlY2lmaWMgaW52YWxpZGF0aW9uIG9iamVjdHMKKyAgICAgICMgZS5nLiBEYXJ3aW4gLT4gRGlyUmVzY2FuLCBJTm90aWZ5IC0+IE1vdmVTY2FuLCBldGMuCisgICAgICBkZWYgX3F1ZXVlX2NoYW5nZSh0eXBlLCBkaXIsIHJlbF9wYXRoLCBvcHRpb25zKQorICAgICAgICBAc25hcHNob3RzW2Rpcl0uaW52YWxpZGF0ZSh0eXBlLCByZWxfcGF0aCwgb3B0aW9ucykKKyAgICAgIGVuZAorCisgICAgICBkZWYgX2xvZygqYXJncywgJmJsb2NrKQorICAgICAgICBzZWxmLmNsYXNzLnNlbmQoOl9sb2csICphcmdzLCAmYmxvY2spCisgICAgICBlbmQKKworICAgICAgZGVmIF9sb2dfZXhjZXB0aW9uKG1zZywgY2FsbGVyX3N0YWNrKQorICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXQoCisgICAgICAgICAgbXNnLAorICAgICAgICAgICRFUlJPUl9JTkZPLAorICAgICAgICAgICRFUlJPUl9QT1NJVElPTiAqICJcbiIsCisgICAgICAgICAgY2FsbGVyX3N0YWNrICogIlxuIgorICAgICAgICApCisKKyAgICAgICAgX2xvZyg6ZXJyb3IsIGZvcm1hdHRlZCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5fbG9nKCphcmdzLCAmYmxvY2spCisgICAgICAgIFNhc3NMaXN0ZW46OkxvZ2dlci5zZW5kKCphcmdzLCAmYmxvY2spCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2JzZC5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2JzZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGU1ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2FkYXB0ZXIvYnNkLnJiCkBAIC0wLDAgKzEsMTA2IEBACisjIExpc3RlbmVyIGltcGxlbWVudGF0aW9uIGZvciBCU0QncyBga3F1ZXVlYC4KKyMgQHNlZSBodHRwOi8vd3d3LmZyZWVic2Qub3JnL2NnaS9tYW4uY2dpP3F1ZXJ5PWtxdWV1ZQorIyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXQ4MTMvcmIta3F1ZXVlL2Jsb2IvbWFzdGVyL2xpYi9yYi1rcXVldWUvcXVldWUucmIKKyMKK21vZHVsZSBTYXNzTGlzdGVuCisgIG1vZHVsZSBBZGFwdGVyCisgICAgY2xhc3MgQlNEIDwgQmFzZQorICAgICAgT1NfUkVHRVhQID0gL2JzZHxkcmFnb25mbHkvaQorCisgICAgICBERUZBVUxUUyA9IHsKKyAgICAgICAgZXZlbnRzOiBbCisgICAgICAgICAgOmRlbGV0ZSwKKyAgICAgICAgICA6d3JpdGUsCisgICAgICAgICAgOmV4dGVuZCwKKyAgICAgICAgICA6YXR0cmliLAorICAgICAgICAgIDpyZW5hbWUKKyAgICAgICAgICAjIDpsaW5rLCA6cmV2b2tlCisgICAgICAgIF0KKyAgICAgIH0KKworICAgICAgQlVORExFUl9ERUNMQVJFX0dFTSA9IDw8LUVPUy5nc3ViKC9eIHs2fS8sICcnKQorICAgICAgICBQbGVhc2UgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBHZW1maWxlIHRvIGF2b2lkIHBvbGxpbmcgZm9yIGNoYW5nZXM6CisgICAgICAgICAgcmVxdWlyZSAncmJjb25maWcnCisgICAgICAgICAgaWYgUmJDb25maWc6OkNPTkZJR1sndGFyZ2V0X29zJ10gPX4gLyN7T1NfUkVHRVhQfS8KKyAgICAgICAgICAgIGdlbSAncmIta3F1ZXVlJywgJz49IDAuMicKKyAgICAgICAgICBlbmQKKyAgICAgIEVPUworCisgICAgICBkZWYgc2VsZi51c2FibGU/CisgICAgICAgIHJldHVybiBmYWxzZSB1bmxlc3Mgc3VwZXIKKyAgICAgICAgcmVxdWlyZSAncmIta3F1ZXVlJworICAgICAgICByZXF1aXJlICdmaW5kJworICAgICAgICB0cnVlCisgICAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICAgIEtlcm5lbC53YXJuIEJVTkRMRVJfREVDTEFSRV9HRU0KKyAgICAgICAgZmFsc2UKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBfY29uZmlndXJlKGRpcmVjdG9yeSwgJl9jYWxsYmFjaykKKyAgICAgICAgQHdvcmtlciB8fD0gS1F1ZXVlOjpRdWV1ZS5uZXcKKyAgICAgICAgQGNhbGxiYWNrID0gX2NhbGxiYWNrCisgICAgICAgICMgdXNlIFJlY29yZCB0byBtYWtlIGEgc25hcHNob3Qgb2YgZGlyLCBzbyB3ZQorICAgICAgICAjIGNhbiBkZXRlY3QgbmV3IGZpbGVzCisgICAgICAgIF9maW5kKGRpcmVjdG9yeS50b19zKSB7IHxwYXRofCBfd2F0Y2hfZmlsZShwYXRoLCBAd29ya2VyKSB9CisgICAgICBlbmQKKworICAgICAgZGVmIF9ydW4KKyAgICAgICAgQHdvcmtlci5ydW4KKyAgICAgIGVuZAorCisgICAgICBkZWYgX3Byb2Nlc3NfZXZlbnQoZGlyLCBldmVudCkKKyAgICAgICAgZnVsbF9wYXRoID0gX2V2ZW50X3BhdGgoZXZlbnQpCisgICAgICAgIGlmIGZ1bGxfcGF0aC5kaXJlY3Rvcnk/CisgICAgICAgICAgIyBGb3JjZSBkaXIgY29udGVudCB0cmFja2luZyB0byBraWNrIGluLCBvciB3ZSB3b24ndCBoYXZlCisgICAgICAgICAgIyBuYW1lcyBvZiBhZGRlZCBmaWxlcworICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCAnLicsIHJlY3Vyc2l2ZTogdHJ1ZSkKKyAgICAgICAgZWxzaWYgZnVsbF9wYXRoLmV4aXN0PworICAgICAgICAgIHBhdGggPSBmdWxsX3BhdGgucmVsYXRpdmVfcGF0aF9mcm9tKGRpcikKKyAgICAgICAgICBfcXVldWVfY2hhbmdlKDpmaWxlLCBkaXIsIHBhdGgudG9fcywgY2hhbmdlOiBfY2hhbmdlKGV2ZW50LmZsYWdzKSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBJZiBpdCBpcyBhIGRpcmVjdG9yeSwgYW5kIGl0IGhhcyBhIHdyaXRlIGZsYWcsIGl0IG1lYW5zIGEKKyAgICAgICAgIyBmaWxlIGhhcyBiZWVuIGFkZGVkIHNvIGZpbmQgb3V0IHdoaWNoIGFuZCBkZWFsIHdpdGggaXQuCisgICAgICAgICMgTm8gbmVlZCB0byBjaGVjayBmb3IgcmVtb3ZlZCBmaWxlcywga3F1ZXVlIHdpbGwgZm9yZ2V0IHRoZW0KKyAgICAgICAgIyB3aGVuIHRoZSB2ZnMgZG9lcy4KKyAgICAgICAgX3dhdGNoX2Zvcl9uZXdfZmlsZShldmVudCkgaWYgZnVsbF9wYXRoLmRpcmVjdG9yeT8KKyAgICAgIGVuZAorCisgICAgICBkZWYgX2NoYW5nZShldmVudF9mbGFncykKKyAgICAgICAgeyBtb2RpZmllZDogWzphdHRyaWIsIDpleHRlbmRdLAorICAgICAgICAgIGFkZGVkOiAgICBbOndyaXRlXSwKKyAgICAgICAgICByZW1vdmVkOiAgWzpyZW5hbWUsIDpkZWxldGVdCisgICAgICAgIH0uZWFjaCBkbyB8Y2hhbmdlLCBmbGFnc3wKKyAgICAgICAgICByZXR1cm4gY2hhbmdlIHVubGVzcyAoZmxhZ3MgJiBldmVudF9mbGFncykuZW1wdHk/CisgICAgICAgIGVuZAorICAgICAgICBuaWwKKyAgICAgIGVuZAorCisgICAgICBkZWYgX2V2ZW50X3BhdGgoZXZlbnQpCisgICAgICAgIFBhdGhuYW1lLm5ldyhldmVudC53YXRjaGVyLnBhdGgpCisgICAgICBlbmQKKworICAgICAgZGVmIF93YXRjaF9mb3JfbmV3X2ZpbGUoZXZlbnQpCisgICAgICAgIHF1ZXVlID0gZXZlbnQud2F0Y2hlci5xdWV1ZQorICAgICAgICBfZmluZChfZXZlbnRfcGF0aChldmVudCkudG9fcykgZG8gfGZpbGVfcGF0aHwKKyAgICAgICAgICB1bmxlc3MgcXVldWUud2F0Y2hlcnMuZGV0ZWN0IHsgfF8sIHZ8IHYucGF0aCA9PSBmaWxlX3BhdGgudG9fcyB9CisgICAgICAgICAgICBfd2F0Y2hfZmlsZShmaWxlX3BhdGgsIHF1ZXVlKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3dhdGNoX2ZpbGUocGF0aCwgcXVldWUpCisgICAgICAgIHF1ZXVlLndhdGNoX2ZpbGUocGF0aCwgKm9wdGlvbnMuZXZlbnRzLCAmQGNhbGxiYWNrKQorICAgICAgcmVzY3VlIEVycm5vOjpFTk9FTlQgPT4gZQorICAgICAgICBfbG9nIDp3YXJuLCAia3F1ZXVlOiB3YXRjaCBmaWxlIGZhaWxlZDogI3tlLm1lc3NhZ2V9IgorICAgICAgZW5kCisKKyAgICAgICMgUXVpY2sgcnVib2NvcCB3b3JrYXJvdW5kCisgICAgICBkZWYgX2ZpbmQoKnBhdGhzLCAmYmxvY2spCisgICAgICAgIEZpbmQuc2VuZCg6ZmluZCwgKnBhdGhzLCAmYmxvY2spCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2NvbmZpZy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2NvbmZpZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM4MDdhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2FkYXB0ZXIvY29uZmlnLnJiCkBAIC0wLDAgKzEsMjYgQEAKK3JlcXVpcmUgJ3BhdGhuYW1lJworCittb2R1bGUgU2Fzc0xpc3RlbgorICBtb2R1bGUgQWRhcHRlcgorICAgIGNsYXNzIENvbmZpZworICAgICAgYXR0cl9yZWFkZXIgOmRpcmVjdG9yaWVzCisgICAgICBhdHRyX3JlYWRlciA6c2lsZW5jZXIKKyAgICAgIGF0dHJfcmVhZGVyIDpxdWV1ZQorICAgICAgYXR0cl9yZWFkZXIgOmFkYXB0ZXJfb3B0aW9ucworCisgICAgICBkZWYgaW5pdGlhbGl6ZShkaXJlY3RvcmllcywgcXVldWUsIHNpbGVuY2VyLCBhZGFwdGVyX29wdGlvbnMpCisgICAgICAgICMgRGVmYXVsdCB0byBjdXJyZW50IGRpcmVjdG9yeSBpZiBubyBkaXJlY3RvcmllcyBhcmUgc3VwcGxpZWQKKyAgICAgICAgZGlyZWN0b3JpZXMgPSBbRGlyLnB3ZF0gaWYgZGlyZWN0b3JpZXMudG9fYS5lbXB0eT8KKyAgICAgICAgCisgICAgICAgICMgVE9ETzogZml4IChmbGF0dGVuLCBhcnJheSwgY29tcGFjdD8pCisgICAgICAgIEBkaXJlY3RvcmllcyA9IGRpcmVjdG9yaWVzLm1hcCBkbyB8ZGlyZWN0b3J5fAorICAgICAgICAgIFBhdGhuYW1lLm5ldyhkaXJlY3RvcnkudG9fcykucmVhbHBhdGgKKyAgICAgICAgZW5kCisKKyAgICAgICAgQHNpbGVuY2VyID0gc2lsZW5jZXIKKyAgICAgICAgQHF1ZXVlID0gcXVldWUKKyAgICAgICAgQGFkYXB0ZXJfb3B0aW9ucyA9IGFkYXB0ZXJfb3B0aW9ucworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vYWRhcHRlci9kYXJ3aW4ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vYWRhcHRlci9kYXJ3aW4ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0MzcyNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2Rhcndpbi5yYgpAQCAtMCwwICsxLDg4IEBACityZXF1aXJlICd0aHJlYWQnCityZXF1aXJlICdzYXNzLWxpc3Rlbi9pbnRlcm5hbHMvdGhyZWFkX3Bvb2wnCisKK21vZHVsZSBTYXNzTGlzdGVuCisgIG1vZHVsZSBBZGFwdGVyCisgICAgIyBBZGFwdGVyIGltcGxlbWVudGF0aW9uIGZvciBNYWMgT1MgWCBgRlNFdmVudHNgLgorICAgICMKKyAgICBjbGFzcyBEYXJ3aW4gPCBCYXNlCisgICAgICBPU19SRUdFWFAgPSAvZGFyd2luKD88bWFqb3JfdmVyc2lvbj4xXGQrKS9pCisKKyAgICAgICMgVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjaGVja2luZyBmb3IgY2hhbmdlcy4KKyAgICAgIERFRkFVTFRTID0geyBsYXRlbmN5OiAwLjEgfQorCisgICAgICBJTkNPTVBBVElCTEVfR0VNX1ZFUlNJT04gPSA8PC1FT1MuZ3N1YigvXiB7OH0vLCAnJykKKyAgICAgICAgcmItZnNldmVudCA+IDAuOS40IG5vIGxvbmdlciBzdXBwb3J0cyBPUyBYIDEwLjYgdGhyb3VnaCAxMC44LgorCisgICAgICAgIFBsZWFzZSBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIEdlbWZpbGUgdG8gYXZvaWQgcG9sbGluZyBmb3IgY2hhbmdlczoKKyAgICAgICAgICByZXF1aXJlICdyYmNvbmZpZycKKyAgICAgICAgICBpZiBSYkNvbmZpZzo6Q09ORklHWyd0YXJnZXRfb3MnXSA9fiAvZGFyd2luKDFbMC0zXSkvaQorICAgICAgICAgICAgZ2VtICdyYi1mc2V2ZW50JywgJzw9IDAuOS40JworICAgICAgICAgIGVuZAorICAgICAgRU9TCisKKyAgICAgIGRlZiBzZWxmLnVzYWJsZT8KKyAgICAgICAgcmVxdWlyZSAncmItZnNldmVudCcKKyAgICAgICAgZGFyd2luX3ZlcnNpb24gPSBSYkNvbmZpZzo6Q09ORklHWyd0YXJnZXRfb3MnXVtPU19SRUdFWFAsIDptYWpvcl92ZXJzaW9uXSBvciByZXR1cm4gZmFsc2UKKyAgICAgICAgcmV0dXJuIHRydWUgaWYgZGFyd2luX3ZlcnNpb24udG9faSA+PSAxMyAjIGRhcndpbjEzIGlzIE9TIFggMTAuOQorICAgICAgICByZXR1cm4gdHJ1ZSBpZiBHZW06OlZlcnNpb24ubmV3KEZTRXZlbnQ6OlZFUlNJT04pIDw9IEdlbTo6VmVyc2lvbi5uZXcoJzAuOS40JykKKyAgICAgICAgS2VybmVsLndhcm4gSU5DT01QQVRJQkxFX0dFTV9WRVJTSU9OCisgICAgICAgIGZhbHNlCisgICAgICBlbmQKKworICAgICAgcHJpdmF0ZQorCisgICAgICAjIE5PVEU6IGVhY2ggZGlyZWN0b3J5IGdldHMgYSBESUZGRVJFTlQgY2FsbGJhY2shCisgICAgICBkZWYgX2NvbmZpZ3VyZShkaXIsICZjYWxsYmFjaykKKyAgICAgICAgb3B0cyA9IHsgbGF0ZW5jeTogb3B0aW9ucy5sYXRlbmN5IH0KKworICAgICAgICBAd29ya2VycyB8fD0gOjpRdWV1ZS5uZXcKKyAgICAgICAgQHdvcmtlcnMgPDwgRlNFdmVudC5uZXcudGFwIGRvIHx3b3JrZXJ8CisgICAgICAgICAgX2xvZyA6ZGVidWcsICJmc2V2ZW50OiB3YXRjaGluZzogI3tkaXIudG9fcy5pbnNwZWN0fSIKKyAgICAgICAgICB3b3JrZXIud2F0Y2goZGlyLnRvX3MsIG9wdHMsICZjYWxsYmFjaykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIF9ydW4KKyAgICAgICAgZmlyc3QgPSBAd29ya2Vycy5wb3AKKworICAgICAgICAjIE5PVEU6IF9ydW4gaXMgY2FsbGVkIHdpdGhpbiBhIHRocmVhZCwgc28gcnVuIGV2ZXJ5IG90aGVyCisgICAgICAgICMgd29ya2VyIGluIGl0J3Mgb3duIHRocmVhZAorICAgICAgICBfcnVuX3dvcmtlcnNfaW5fYmFja2dyb3VuZChfdG9fYXJyYXkoQHdvcmtlcnMpKQorICAgICAgICBfcnVuX3dvcmtlcihmaXJzdCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3Byb2Nlc3NfZXZlbnQoZGlyLCBldmVudCkKKyAgICAgICAgX2xvZyA6ZGVidWcsICJmc2V2ZW50OiBwcm9jZXNzaW5nIGV2ZW50OiAje2V2ZW50Lmluc3BlY3R9IgorICAgICAgICBldmVudC5lYWNoIGRvIHxwYXRofAorICAgICAgICAgIG5ld19wYXRoID0gUGF0aG5hbWUubmV3KHBhdGguc3ViKC9cLyQvLCAnJykpCisgICAgICAgICAgX2xvZyA6ZGVidWcsICJmc2V2ZW50OiAje25ld19wYXRofSIKKyAgICAgICAgICAjIFRPRE86IGRvZXMgdGhpcyBwcmVzZXJ2ZSBzeW1saW5rcz8KKyAgICAgICAgICByZWxfcGF0aCA9IG5ld19wYXRoLnJlbGF0aXZlX3BhdGhfZnJvbShkaXIpLnRvX3MKKyAgICAgICAgICBfcXVldWVfY2hhbmdlKDpkaXIsIGRpciwgcmVsX3BhdGgsIHJlY3Vyc2l2ZTogdHJ1ZSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIF9ydW5fd29ya2VyKHdvcmtlcikKKyAgICAgICAgX2xvZyA6ZGVidWcsICJmc2V2ZW50OiBydW5uaW5nIHdvcmtlcjogI3t3b3JrZXIuaW5zcGVjdH0iCisgICAgICAgIHdvcmtlci5ydW4KKyAgICAgIHJlc2N1ZQorICAgICAgICBfbG9nX2V4Y2VwdGlvbiAnZnNldmVudDogcnVubmluZyB3b3JrZXIgZmFpbGVkOiAlczolcyBjYWxsZWQgZnJvbTogJXMnLCBjYWxsZXIKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3J1bl93b3JrZXJzX2luX2JhY2tncm91bmQod29ya2VycykKKyAgICAgICAgd29ya2Vycy5lYWNoIGRvIHx3b3JrZXJ8CisgICAgICAgICAgIyBOT1RFOiB3aGlsZSBwYXNzaW5nIGxvY2FsIHZhcmlhYmxlcyB0byB0aGUgYmxvY2sgYmVsb3cgaXMgbm90CisgICAgICAgICAgIyB0aHJlYWQgc2FmZSwgdXNpbmcgJ3dvcmtlcicgZnJvbSB0aGUgZW51bWVyYXRvciBhYm92ZSBpcyBvaworICAgICAgICAgIFNhc3NMaXN0ZW46OkludGVybmFsczo6VGhyZWFkUG9vbC5hZGQgeyBfcnVuX3dvcmtlcih3b3JrZXIpIH0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIF90b19hcnJheShxdWV1ZSkKKyAgICAgICAgd29ya2VycyA9IFtdCisgICAgICAgIHdvcmtlcnMgPDwgcXVldWUucG9wIHVudGlsIHF1ZXVlLmVtcHR5PworICAgICAgICB3b3JrZXJzCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2xpbnV4LnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2FkYXB0ZXIvbGludXgucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkMGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL2xpbnV4LnJiCkBAIC0wLDAgKzEsMTA4IEBACittb2R1bGUgU2Fzc0xpc3RlbgorICBtb2R1bGUgQWRhcHRlcgorICAgICMgQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmV4My9yYi1pbm90aWZ5CisgICAgY2xhc3MgTGludXggPCBCYXNlCisgICAgICBPU19SRUdFWFAgPSAvbGludXgvaQorCisgICAgICBERUZBVUxUUyA9IHsKKyAgICAgICAgZXZlbnRzOiBbCisgICAgICAgICAgOnJlY3Vyc2l2ZSwKKyAgICAgICAgICA6YXR0cmliLAorICAgICAgICAgIDpjcmVhdGUsCisgICAgICAgICAgOmRlbGV0ZSwKKyAgICAgICAgICA6bW92ZSwKKyAgICAgICAgICA6Y2xvc2Vfd3JpdGUKKyAgICAgICAgXSwKKyAgICAgICAgd2FpdF9mb3JfZGVsYXk6IDAuMQorICAgICAgfQorCisgICAgICBwcml2YXRlCisKKyAgICAgIFdJS0lfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9saXN0ZW4nXAorICAgICAgICAnL3dpa2kvSW5jcmVhc2luZy10aGUtYW1vdW50LW9mLWlub3RpZnktd2F0Y2hlcnMnCisKKyAgICAgIElOT1RJRllfTElNSVRfTUVTU0FHRSA9IDw8LUVPUy5nc3ViKC9eXHMqLywgJycpCisgICAgICAgIEZBVEFMOiBTYXNzTGlzdGVuIGVycm9yOiB1bmFibGUgdG8gbW9uaXRvciBkaXJlY3RvcmllcyBmb3IgY2hhbmdlcy4KKyAgICAgICAgVmlzaXQgI3tXSUtJX1VSTH0gZm9yIGluZm8gb24gaG93IHRvIGZpeCB0aGlzLgorICAgICAgRU9TCisKKyAgICAgIGRlZiBfY29uZmlndXJlKGRpcmVjdG9yeSwgJmNhbGxiYWNrKQorICAgICAgICByZXF1aXJlICdyYi1pbm90aWZ5JworICAgICAgICBAd29ya2VyIHx8PSA6OklOb3RpZnk6Ok5vdGlmaWVyLm5ldworICAgICAgICBAd29ya2VyLndhdGNoKGRpcmVjdG9yeS50b19zLCAqb3B0aW9ucy5ldmVudHMsICZjYWxsYmFjaykKKyAgICAgIHJlc2N1ZSBFcnJubzo6RU5PU1BDCisgICAgICAgIGFib3J0KElOT1RJRllfTElNSVRfTUVTU0FHRSkKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3J1bgorICAgICAgICBUaHJlYWQuY3VycmVudFs6bGlzdGVuX2Jsb2NraW5nX3JlYWRfdGhyZWFkXSA9IHRydWUKKyAgICAgICAgQHdvcmtlci5ydW4KKyAgICAgICAgVGhyZWFkLmN1cnJlbnRbOmxpc3Rlbl9ibG9ja2luZ19yZWFkX3RocmVhZF0gPSBmYWxzZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfcHJvY2Vzc19ldmVudChkaXIsIGV2ZW50KQorICAgICAgICAjIE5PVEU6IGF2b2lkIHVzaW5nIGV2ZW50LmFic29sdXRlX25hbWUgc2luY2UgbmV3IEFQSQorICAgICAgICAjIHdpbGwgbmVlZCB0byBoYXZlIGEgY3VzdG9tIHJlY3Vyc2lvbiBpbXBsZW1lbnRlZAorICAgICAgICAjIHRvIHByb3Blcmx5IG1hdGNoIGV2ZW50cyB0byBjb25maWd1cmVkIGRpcmVjdG9yaWVzCisgICAgICAgIHBhdGggPSBQYXRobmFtZS5uZXcoZXZlbnQud2F0Y2hlci5wYXRoKSArIGV2ZW50Lm5hbWUKKyAgICAgICAgcmVsX3BhdGggPSBwYXRoLnJlbGF0aXZlX3BhdGhfZnJvbShkaXIpLnRvX3MKKworICAgICAgICBfbG9nKDpkZWJ1ZykgeyAiaW5vdGlmeTogI3tyZWxfcGF0aH0gKCN7ZXZlbnQuZmxhZ3MuaW5zcGVjdH0pIiB9CisKKyAgICAgICAgaWYgLzF8dHJ1ZS8gPX4gRU5WWydMSVNURU5fR0VNX1NJTVVMQVRFX0ZTRVZFTlQnXQorICAgICAgICAgIGlmIChldmVudC5mbGFncyAmIFs6bW92ZWRfdG8sIDptb3ZlZF9mcm9tXSkgfHwgX2Rpcl9ldmVudD8oZXZlbnQpCisgICAgICAgICAgICByZWxfcGF0aCA9IHBhdGguZGlybmFtZS5yZWxhdGl2ZV9wYXRoX2Zyb20oZGlyKS50b19zCisgICAgICAgICAgICBfcXVldWVfY2hhbmdlKDpkaXIsIGRpciwgcmVsX3BhdGgsIHt9KQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCByZWxfcGF0aCwge30pCisgICAgICAgICAgZW5kCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVuZAorCisgICAgICAgIHJldHVybiBpZiBfc2tpcF9ldmVudD8oZXZlbnQpCisKKyAgICAgICAgY29va2llX3BhcmFtcyA9IGV2ZW50LmNvb2tpZS56ZXJvPyA/IHt9IDogeyBjb29raWU6IGV2ZW50LmNvb2tpZSB9CisKKyAgICAgICAgIyBOb3RlOiBkb24ndCBwYXNzIG9wdGlvbnMgdG8gZm9yY2UgcmVzY2FubmluZyB0aGUgZGlyZWN0b3J5LCBzbyB3ZSBjYW4KKyAgICAgICAgIyBkZXRlY3QgbW92aW5nL2RlbGV0aW5nIGEgd2hvbGUgdHJlZQorICAgICAgICBpZiBfZGlyX2V2ZW50PyhldmVudCkKKyAgICAgICAgICBfcXVldWVfY2hhbmdlKDpkaXIsIGRpciwgcmVsX3BhdGgsIGNvb2tpZV9wYXJhbXMpCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVuZAorCisgICAgICAgIHBhcmFtcyA9IGNvb2tpZV9wYXJhbXMubWVyZ2UoY2hhbmdlOiBfY2hhbmdlKGV2ZW50LmZsYWdzKSkKKworICAgICAgICBfcXVldWVfY2hhbmdlKDpmaWxlLCBkaXIsIHJlbF9wYXRoLCBwYXJhbXMpCisgICAgICBlbmQKKworICAgICAgZGVmIF9za2lwX2V2ZW50PyhldmVudCkKKyAgICAgICAgIyBFdmVudCBvbiByb290IGRpcmVjdG9yeQorICAgICAgICByZXR1cm4gdHJ1ZSBpZiBldmVudC5uYW1lID09ICcnCisgICAgICAgICMgSU5vdGlmeSByZXBvcnRzIGNoYW5nZXMgdG8gZmlsZXMgaW5zaWRlIGRpcmVjdG9yaWVzIGFzIGV2ZW50cworICAgICAgICAjIG9uIHRoZSBkaXJlY3RvcmllcyB0aGVtc2VsdmVzIHRvby4KKyAgICAgICAgIworICAgICAgICAjIEBzZWUgaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzcvaW5vdGlmeQorICAgICAgICBfZGlyX2V2ZW50PyhldmVudCkgJiYgKGV2ZW50LmZsYWdzICYgWzpjbG9zZSwgOm1vZGlmeV0pLmFueT8KKyAgICAgIGVuZAorCisgICAgICBkZWYgX2NoYW5nZShldmVudF9mbGFncykKKyAgICAgICAgeyBtb2RpZmllZDogICBbOmF0dHJpYiwgOmNsb3NlX3dyaXRlXSwKKyAgICAgICAgICBtb3ZlZF90bzogICBbOm1vdmVkX3RvXSwKKyAgICAgICAgICBtb3ZlZF9mcm9tOiBbOm1vdmVkX2Zyb21dLAorICAgICAgICAgIGFkZGVkOiAgICAgIFs6Y3JlYXRlXSwKKyAgICAgICAgICByZW1vdmVkOiAgICBbOmRlbGV0ZV0gfS5lYWNoIGRvIHxjaGFuZ2UsIGZsYWdzfAorICAgICAgICAgIHJldHVybiBjaGFuZ2UgdW5sZXNzIChmbGFncyAmIGV2ZW50X2ZsYWdzKS5lbXB0eT8KKyAgICAgICAgZW5kCisgICAgICAgIG5pbAorICAgICAgZW5kCisKKyAgICAgIGRlZiBfZGlyX2V2ZW50PyhldmVudCkKKyAgICAgICAgZXZlbnQuZmxhZ3MuaW5jbHVkZT8oOmlzZGlyKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfc3RvcAorICAgICAgICBAd29ya2VyICYmIEB3b3JrZXIuY2xvc2UKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2FkYXB0ZXIvcG9sbGluZy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL3BvbGxpbmcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2ZDNjOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL3BvbGxpbmcucmIKQEAgLTAsMCArMSwzNyBAQAorbW9kdWxlIFNhc3NMaXN0ZW4KKyAgbW9kdWxlIEFkYXB0ZXIKKyAgICAjIFBvbGxpbmcgQWRhcHRlciB0aGF0IHdvcmtzIGNyb3NzLXBsYXRmb3JtIGFuZAorICAgICMgaGFzIG5vIGRlcGVuZGVuY2llcy4gVGhpcyBpcyB0aGUgYWRhcHRlciB0aGF0CisgICAgIyB1c2VzIHRoZSBtb3N0IENQVSBwcm9jZXNzaW5nIHBvd2VyIGFuZCBoYXMgaGlnaGVyCisgICAgIyBmaWxlIElPIHRoYW4gdGhlIG90aGVyIGltcGxlbWVudGF0aW9ucy4KKyAgICAjCisgICAgY2xhc3MgUG9sbGluZyA8IEJhc2UKKyAgICAgIE9TX1JFR0VYUCA9IC8vICMgbWF0Y2ggZXZlcnkgT1MKKworICAgICAgREVGQVVMVFMgPSB7IGxhdGVuY3k6IDEuMCwgd2FpdF9mb3JfZGVsYXk6IDAuMDUgfQorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBfY29uZmlndXJlKF8sICZjYWxsYmFjaykKKyAgICAgICAgQHBvbGxpbmdfY2FsbGJhY2tzIHx8PSBbXQorICAgICAgICBAcG9sbGluZ19jYWxsYmFja3MgPDwgY2FsbGJhY2sKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3J1bgorICAgICAgICBsb29wIGRvCisgICAgICAgICAgc3RhcnQgPSBUaW1lLm5vdy50b19mCisgICAgICAgICAgQHBvbGxpbmdfY2FsbGJhY2tzLmVhY2ggZG8gfGNhbGxiYWNrfAorICAgICAgICAgICAgY2FsbGJhY2suY2FsbChuaWwpCisgICAgICAgICAgICBuYXBfdGltZSA9IG9wdGlvbnMubGF0ZW5jeSAtIChUaW1lLm5vdy50b19mIC0gc3RhcnQpCisgICAgICAgICAgICAjIFRPRE86IHdhcm4gaWYgbmFwX3RpbWUgaXMgbmVnYXRpdmUgKHBvbGxpbmcgdG9vIHNsb3cpCisgICAgICAgICAgICBzbGVlcChuYXBfdGltZSkgaWYgbmFwX3RpbWUgPiAwCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBfcHJvY2Vzc19ldmVudChkaXIsIF8pCisgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCAnLicsIHJlY3Vyc2l2ZTogdHJ1ZSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2FkYXB0ZXIvd2luZG93cy5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL3dpbmRvd3MucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxNGUxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9hZGFwdGVyL3dpbmRvd3MucmIKQEAgLTAsMCArMSw5OSBAQAorbW9kdWxlIFNhc3NMaXN0ZW4KKyAgbW9kdWxlIEFkYXB0ZXIKKyAgICAjIEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gZm9yIFdpbmRvd3MgYHdkbWAuCisgICAgIworICAgIGNsYXNzIFdpbmRvd3MgPCBCYXNlCisgICAgICBPU19SRUdFWFAgPSAvbXN3aW58bWluZ3d8Y3lnd2luL2kKKworICAgICAgQlVORExFUl9ERUNMQVJFX0dFTSA9IDw8LUVPUy5nc3ViKC9eIHs2fS8sICcnKQorICAgICAgICBQbGVhc2UgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBHZW1maWxlIHRvIGF2b2lkIHBvbGxpbmcgZm9yIGNoYW5nZXM6CisgICAgICAgICAgZ2VtICd3ZG0nLCAnPj0gMC4xLjAnIGlmIEdlbS53aW5fcGxhdGZvcm0/CisgICAgICBFT1MKKworICAgICAgZGVmIHNlbGYudXNhYmxlPworICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHN1cGVyCisgICAgICAgIHJlcXVpcmUgJ3dkbScKKyAgICAgICAgdHJ1ZQorICAgICAgcmVzY3VlIExvYWRFcnJvcgorICAgICAgICBfbG9nIDpkZWJ1ZywgZm9ybWF0KCd3ZG0gLSBsb2FkIGZhaWxlZDogJXM6JXMnLCAkRVJST1JfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRVJST1JfUE9TSVRJT04gKiAiXG4iKQorCisgICAgICAgIEtlcm5lbC53YXJuIEJVTkRMRVJfREVDTEFSRV9HRU0KKyAgICAgICAgZmFsc2UKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBfY29uZmlndXJlKGRpciwgJmNhbGxiYWNrKQorICAgICAgICByZXF1aXJlICd3ZG0nCisgICAgICAgIF9sb2cgOmRlYnVnLCAnd2RtIC0gc3RhcnRpbmcuLi4nCisgICAgICAgIEB3b3JrZXIgfHw9IFdETTo6TW9uaXRvci5uZXcKKyAgICAgICAgQHdvcmtlci53YXRjaF9yZWN1cnNpdmVseShkaXIudG9fcywgOmZpbGVzKSBkbyB8Y2hhbmdlfAorICAgICAgICAgIGNhbGxiYWNrLmNhbGwoWzpmaWxlLCBjaGFuZ2VdKQorICAgICAgICBlbmQKKworICAgICAgICBAd29ya2VyLndhdGNoX3JlY3Vyc2l2ZWx5KGRpci50b19zLCA6ZGlyZWN0b3JpZXMpIGRvIHxjaGFuZ2V8CisgICAgICAgICAgY2FsbGJhY2suY2FsbChbOmRpciwgY2hhbmdlXSkKKyAgICAgICAgZW5kCisKKyAgICAgICAgZXZlbnRzID0gWzphdHRyaWJ1dGVzLCA6bGFzdF93cml0ZV0KKyAgICAgICAgQHdvcmtlci53YXRjaF9yZWN1cnNpdmVseShkaXIudG9fcywgKmV2ZW50cykgZG8gfGNoYW5nZXwKKyAgICAgICAgICBjYWxsYmFjay5jYWxsKFs6YXR0ciwgY2hhbmdlXSkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIF9ydW4KKyAgICAgICAgQHdvcmtlci5ydW4hCisgICAgICBlbmQKKworICAgICAgZGVmIF9wcm9jZXNzX2V2ZW50KGRpciwgZXZlbnQpCisgICAgICAgIF9sb2cgOmRlYnVnLCAid2RtIC0gY2FsbGJhY2s6ICN7ZXZlbnQuaW5zcGVjdH0iCisKKyAgICAgICAgdHlwZSwgY2hhbmdlID0gZXZlbnQKKworICAgICAgICBmdWxsX3BhdGggPSBQYXRobmFtZShjaGFuZ2UucGF0aCkKKworICAgICAgICByZWxfcGF0aCA9IGZ1bGxfcGF0aC5yZWxhdGl2ZV9wYXRoX2Zyb20oZGlyKS50b19zCisKKyAgICAgICAgb3B0aW9ucyA9IHsgY2hhbmdlOiBfY2hhbmdlKGNoYW5nZS50eXBlKSB9CisKKyAgICAgICAgY2FzZSB0eXBlCisgICAgICAgIHdoZW4gOmZpbGUKKyAgICAgICAgICBfcXVldWVfY2hhbmdlKDpmaWxlLCBkaXIsIHJlbF9wYXRoLCBvcHRpb25zKQorICAgICAgICB3aGVuIDphdHRyCisgICAgICAgICAgdW5sZXNzIGZ1bGxfcGF0aC5kaXJlY3Rvcnk/CisgICAgICAgICAgICBfcXVldWVfY2hhbmdlKDpmaWxlLCBkaXIsIHJlbF9wYXRoLCBvcHRpb25zKQorICAgICAgICAgIGVuZAorICAgICAgICB3aGVuIDpkaXIKKyAgICAgICAgICBpZiBjaGFuZ2UudHlwZSA9PSA6cmVtb3ZlZAorICAgICAgICAgICAgIyBUT0RPOiBjaGVjayBpZiB3YXRjaGVkIGRpcj8KKyAgICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCBQYXRobmFtZShyZWxfcGF0aCkuZGlybmFtZS50b19zLCB7fSkKKyAgICAgICAgICBlbHNpZiBjaGFuZ2UudHlwZSA9PSA6YWRkZWQKKyAgICAgICAgICAgIF9xdWV1ZV9jaGFuZ2UoOmRpciwgZGlyLCByZWxfcGF0aCwge30pCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBkbyBub3RoaW5nIC0gY2hhbmdlZCBkaXJlY3RvcnkgbWVhbnMgZWl0aGVyOgorICAgICAgICAgICAgIyAgIC0gcmVtb3ZlZCBzdWJkaXJzIChoYW5kbGVkIGFib3ZlKQorICAgICAgICAgICAgIyAgIC0gYWRkZWQgc3ViZGlycyAoaGFuZGxlZCBhYm92ZSkKKyAgICAgICAgICAgICMgICAtIHJlbW92ZWQgZmlsZXMgKGhhbmRsZWQgYnkgX2ZpbGVfY2FsbGJhY2spCisgICAgICAgICAgICAjICAgLSBhZGRlZCBmaWxlcyAoaGFuZGxlZCBieSBfZmlsZV9jYWxsYmFjaykKKyAgICAgICAgICAgICMgc28gd2hhdCdzIGxlZnQ/CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgcmVzY3VlCisgICAgICAgIGRldGFpbHMgPSBldmVudC5pbnNwZWN0CisgICAgICAgIF9sb2cgOmVycm9yLCBmb3JtYXQoJ3dkbSAtIGNhbGxiYWNrICglKTogJXM6JXMnLCBkZXRhaWxzLCAkRVJST1JfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRVJST1JfUE9TSVRJT04gKiAiXG4iKQorICAgICAgICByYWlzZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfY2hhbmdlKHR5cGUpCisgICAgICAgIHsgbW9kaWZpZWQ6IFs6bW9kaWZpZWQsIDphdHRyaWJdLCAjIFRPRE86IGlzIGF0dHJpYiByZWFsbHkgcGFzc2VkPworICAgICAgICAgIGFkZGVkOiAgICBbOmFkZGVkLCA6cmVuYW1lZF9uZXdfZmlsZV0sCisgICAgICAgICAgcmVtb3ZlZDogIFs6cmVtb3ZlZCwgOnJlbmFtZWRfb2xkX2ZpbGVdIH0uZWFjaCBkbyB8Y2hhbmdlLCB0eXBlc3wKKyAgICAgICAgICByZXR1cm4gY2hhbmdlIGlmIHR5cGVzLmluY2x1ZGU/KHR5cGUpCisgICAgICAgIGVuZAorICAgICAgICBuaWwKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2JhY2tlbmQucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vYmFja2VuZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRkNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2JhY2tlbmQucmIKQEAgLTAsMCArMSw0MyBAQAorcmVxdWlyZSAnc2Fzcy1saXN0ZW4vYWRhcHRlcicKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2FkYXB0ZXIvYmFzZScKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2FkYXB0ZXIvY29uZmlnJworCityZXF1aXJlICdmb3J3YXJkYWJsZScKKworIyBUaGlzIGNsYXNzIGp1c3QgYWdncmVnYXRlcyBjb25maWd1cmF0aW9uIG9iamVjdCB0byBhdm9pZCBMaXN0ZW5lciBzcGVjcworIyBmcm9tIGV4cGxvZGluZyB3aXRoIGh1Z2UgdGVzdCBzZXR1cCBibG9ja3MKK21vZHVsZSBTYXNzTGlzdGVuCisgIGNsYXNzIEJhY2tlbmQKKyAgICBkZWYgaW5pdGlhbGl6ZShkaXJlY3RvcmllcywgcXVldWUsIHNpbGVuY2VyLCBjb25maWcpCisgICAgICBhZGFwdGVyX3NlbGVjdF9vcHRzID0gY29uZmlnLmFkYXB0ZXJfc2VsZWN0X29wdGlvbnMKKworICAgICAgYWRhcHRlcl9jbGFzcyA9IEFkYXB0ZXIuc2VsZWN0KGFkYXB0ZXJfc2VsZWN0X29wdHMpCisKKyAgICAgICMgVXNlIGRlZmF1bHQgZnJvbSBhZGFwdGVyIGlmIHBvc3NpYmxlCisgICAgICBAbWluX2RlbGF5X2JldHdlZW5fZXZlbnRzID0gY29uZmlnLm1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cworICAgICAgQG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cyB8fD0gYWRhcHRlcl9jbGFzczo6REVGQVVMVFNbOndhaXRfZm9yX2RlbGF5XQorICAgICAgQG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cyB8fD0gMC4xCisKKyAgICAgIGFkYXB0ZXJfb3B0cyA9IGNvbmZpZy5hZGFwdGVyX2luc3RhbmNlX29wdGlvbnMoYWRhcHRlcl9jbGFzcykKKworICAgICAgYWNvbmZpZyA9IEFkYXB0ZXI6OkNvbmZpZy5uZXcoZGlyZWN0b3JpZXMsIHF1ZXVlLCBzaWxlbmNlciwgYWRhcHRlcl9vcHRzKQorICAgICAgQGFkYXB0ZXIgPSBhZGFwdGVyX2NsYXNzLm5ldyhhY29uZmlnKQorICAgIGVuZAorCisgICAgZGVmIHN0YXJ0CisgICAgICBhZGFwdGVyLnN0YXJ0CisgICAgZW5kCisKKyAgICBkZWYgc3RvcAorICAgICAgYWRhcHRlci5zdG9wCisgICAgZW5kCisKKyAgICBkZWYgbWluX2RlbGF5X2JldHdlZW5fZXZlbnRzCisgICAgICBAbWluX2RlbGF5X2JldHdlZW5fZXZlbnRzCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBhdHRyX3JlYWRlciA6YWRhcHRlcgorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2NoYW5nZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9jaGFuZ2UucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxZjA3YwotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9jaGFuZ2UucmIKQEAgLTAsMCArMSw3OCBAQAorcmVxdWlyZSAnc2Fzcy1saXN0ZW4vZmlsZScKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2RpcmVjdG9yeScKKworbW9kdWxlIFNhc3NMaXN0ZW4KKyAgIyBUT0RPOiByZW5hbWUgdG8gU25hcHNob3QKKyAgY2xhc3MgQ2hhbmdlCisgICAgIyBUT0RPOiB0ZXN0IHRoaXMgY2xhc3MgZm9yIGNvdmVyYWdlCisgICAgY2xhc3MgQ29uZmlnCisgICAgICBkZWYgaW5pdGlhbGl6ZShxdWV1ZSwgc2lsZW5jZXIpCisgICAgICAgIEBxdWV1ZSA9IHF1ZXVlCisgICAgICAgIEBzaWxlbmNlciA9IHNpbGVuY2VyCisgICAgICBlbmQKKworICAgICAgZGVmIHNpbGVuY2VkPyhwYXRoLCB0eXBlKQorICAgICAgICBAc2lsZW5jZXIuc2lsZW5jZWQ/KFBhdGhuYW1lKHBhdGgpLCB0eXBlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBxdWV1ZSgqYXJncykKKyAgICAgICAgQHF1ZXVlIDw8IGFyZ3MKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgYXR0cl9yZWFkZXIgOnJlY29yZAorCisgICAgZGVmIGluaXRpYWxpemUoY29uZmlnLCByZWNvcmQpCisgICAgICBAY29uZmlnID0gY29uZmlnCisgICAgICBAcmVjb3JkID0gcmVjb3JkCisgICAgZW5kCisKKyAgICAjIEludmFsaWRhdGUgc29tZSBwYXJ0IG9mIHRoZSBzbmFwc2hvdC9yZWNvcmQgKGRpciwgZmlsZSwgc3VidHJlZSwgZXRjLikKKyAgICBkZWYgaW52YWxpZGF0ZSh0eXBlLCByZWxfcGF0aCwgb3B0aW9ucykKKyAgICAgIHdhdGNoZWRfZGlyID0gUGF0aG5hbWUubmV3KHJlY29yZC5yb290KQorCisgICAgICBjaGFuZ2UgPSBvcHRpb25zWzpjaGFuZ2VdCisgICAgICBjb29raWUgPSBvcHRpb25zWzpjb29raWVdCisKKyAgICAgIGlmICFjb29raWUgJiYgY29uZmlnLnNpbGVuY2VkPyhyZWxfcGF0aCwgdHlwZSkKKyAgICAgICAgU2Fzc0xpc3Rlbjo6TG9nZ2VyLmRlYnVnIHsgICIoc2lsZW5jZWQpOiAje3JlbF9wYXRoLmluc3BlY3R9IiB9CisgICAgICAgIHJldHVybgorICAgICAgZW5kCisKKyAgICAgIHBhdGggPSB3YXRjaGVkX2RpciArIHJlbF9wYXRoCisKKyAgICAgIFNhc3NMaXN0ZW46OkxvZ2dlci5kZWJ1ZyBkbworICAgICAgICBsb2dfZGV0YWlscyA9IG9wdGlvbnNbOnNpbGVuY2VdICYmICdyZWNvcmRpbmcnIHx8IGNoYW5nZSB8fCAndW5rbm93bicKKyAgICAgICAgIiN7bG9nX2RldGFpbHN9OiAje3R5cGV9OiN7cGF0aH0gKCN7b3B0aW9ucy5pbnNwZWN0fSkiCisgICAgICBlbmQKKworICAgICAgaWYgY2hhbmdlCisgICAgICAgIG9wdGlvbnMgPSBjb29raWUgPyB7IGNvb2tpZTogY29va2llIH0gOiB7fQorICAgICAgICBjb25maWcucXVldWUodHlwZSwgY2hhbmdlLCB3YXRjaGVkX2RpciwgcmVsX3BhdGgsIG9wdGlvbnMpCisgICAgICBlbHNlCisgICAgICAgIGlmIHR5cGUgPT0gOmRpcgorICAgICAgICAgICMgTk9URTogUE9TU0lCTEUgUkVDVVJTSU9OCisgICAgICAgICAgIyBUT0RPOiBmaXggLSB1c2UgYSBxdWV1ZSBpbnN0ZWFkCisgICAgICAgICAgRGlyZWN0b3J5LnNjYW4oc2VsZiwgcmVsX3BhdGgsIG9wdGlvbnMpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjaGFuZ2UgPSBGaWxlLmNoYW5nZShyZWNvcmQsIHJlbF9wYXRoKQorICAgICAgICAgIHJldHVybiBpZiAhY2hhbmdlIHx8IG9wdGlvbnNbOnNpbGVuY2VdCisgICAgICAgICAgY29uZmlnLnF1ZXVlKDpmaWxlLCBjaGFuZ2UsIHdhdGNoZWRfZGlyLCByZWxfcGF0aCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICByZXNjdWUgUnVudGltZUVycm9yID0+IGV4CisgICAgICBtc2cgPSBmb3JtYXQoCisgICAgICAgICclcyMlcyBjcmFzaGVkICVzOiVzJywKKyAgICAgICAgc2VsZi5jbGFzcywKKyAgICAgICAgX19tZXRob2RfXywKKyAgICAgICAgZXhpbnNwZWN0LAorICAgICAgICBleC5iYWNrdHJhY2UgKiAiXG4iKQorICAgICAgU2Fzc0xpc3Rlbjo6TG9nZ2VyLmVycm9yKG1zZykKKyAgICAgIHJhaXNlCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBhdHRyX3JlYWRlciA6Y29uZmlnCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vY2xpLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2NsaS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYxOTNkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2NsaS5yYgpAQCAtMCwwICsxLDY1IEBACityZXF1aXJlICd0aG9yJworcmVxdWlyZSAnc2Fzcy1saXN0ZW4nCityZXF1aXJlICdsb2dnZXInCisKK21vZHVsZSBTYXNzTGlzdGVuCisgIGNsYXNzIENMSSA8IFRob3IKKyAgICBkZWZhdWx0X3Rhc2sgOnN0YXJ0CisKKyAgICBkZXNjICdzdGFydCcsICdTdGFydHMgU2Fzc0xpc3RlbicKKworICAgIGNsYXNzX29wdGlvbiA6dmVyYm9zZSwKKyAgICAgICAgICAgICAgICAgdHlwZTogICAgOmJvb2xlYW4sCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLAorICAgICAgICAgICAgICAgICBhbGlhc2VzOiAnLXYnLAorICAgICAgICAgICAgICAgICBiYW5uZXI6ICAnVmVyYm9zZScKKworICAgIGNsYXNzX29wdGlvbiA6ZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICB0eXBlOiAgICA6YXJyYXksCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICcuJywKKyAgICAgICAgICAgICAgICAgYWxpYXNlczogJy1kJywKKyAgICAgICAgICAgICAgICAgYmFubmVyOiAgJ1RoZSBkaXJlY3RvcnkgdG8gbGlzdGVuIHRvJworCisgICAgY2xhc3Nfb3B0aW9uIDpyZWxhdGl2ZSwKKyAgICAgICAgICAgICAgICAgdHlwZTogICAgOmJvb2xlYW4sCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLAorICAgICAgICAgICAgICAgICBhbGlhc2VzOiAnLXInLAorICAgICAgICAgICAgICAgICBiYW5uZXI6ICAnQ29udmVydCBwYXRocyByZWxhdGl2ZSB0byBjdXJyZW50IGRpcmVjdG9yeScKKworICAgIGRlZiBzdGFydAorICAgICAgU2Fzc0xpc3Rlbjo6Rm9yd2FyZGVyLm5ldyhvcHRpb25zKS5zdGFydAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBGb3J3YXJkZXIKKyAgICBhdHRyX3JlYWRlciA6bG9nZ2VyCisgICAgZGVmIGluaXRpYWxpemUob3B0aW9ucykKKyAgICAgIEBvcHRpb25zID0gb3B0aW9ucworICAgICAgQGxvZ2dlciA9IDo6TG9nZ2VyLm5ldyhTVERPVVQpCisgICAgICBAbG9nZ2VyLmxldmVsID0gOjpMb2dnZXI6OklORk8KKyAgICAgIEBsb2dnZXIuZm9ybWF0dGVyID0gcHJvYyB7IHxfLCBfLCBfLCBtc2d8ICIje21zZ31cbiIgfQorICAgIGVuZAorCisgICAgZGVmIHN0YXJ0CisgICAgICBsb2dnZXIuaW5mbyAnU3RhcnRpbmcgbGlzdGVuLi4uJworICAgICAgZGlyZWN0b3J5ID0gQG9wdGlvbnNbOmRpcmVjdG9yeV0KKyAgICAgIHJlbGF0aXZlID0gQG9wdGlvbnNbOnJlbGF0aXZlXQorICAgICAgY2FsbGJhY2sgPSBwcm9jIGRvIHxtb2RpZmllZCwgYWRkZWQsIHJlbW92ZWR8CisgICAgICAgIGlmIEBvcHRpb25zWzp2ZXJib3NlXQorICAgICAgICAgIGxvZ2dlci5pbmZvICIrICN7YWRkZWR9IiB1bmxlc3MgYWRkZWQuZW1wdHk/CisgICAgICAgICAgbG9nZ2VyLmluZm8gIi0gI3tyZW1vdmVkfSIgdW5sZXNzIHJlbW92ZWQuZW1wdHk/CisgICAgICAgICAgbG9nZ2VyLmluZm8gIj4gI3ttb2RpZmllZH0iIHVubGVzcyBtb2RpZmllZC5lbXB0eT8KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgbGlzdGVuZXIgPSBTYXNzTGlzdGVuLnRvKAorICAgICAgICBkaXJlY3RvcnksCisgICAgICAgIHJlbGF0aXZlOiByZWxhdGl2ZSwKKyAgICAgICAgJmNhbGxiYWNrKQorCisgICAgICBsaXN0ZW5lci5zdGFydAorCisgICAgICBzbGVlcCAwLjUgd2hpbGUgbGlzdGVuZXIucHJvY2Vzc2luZz8KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9kaXJlY3RvcnkucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vZGlyZWN0b3J5LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWI3MDQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vZGlyZWN0b3J5LnJiCkBAIC0wLDAgKzEsODcgQEAKK3JlcXVpcmUgJ3NldCcKKworbW9kdWxlIFNhc3NMaXN0ZW4KKyAgIyBUT0RPOiByZWZhY3RvciAodHVybiBpdCBpbnRvIGEgbm9ybWFsIG9iamVjdCwgY2FjaGUgdGhlIHN0YXQsIGV0YykKKyAgY2xhc3MgRGlyZWN0b3J5CisgICAgZGVmIHNlbGYuc2NhbihzbmFwc2hvdCwgcmVsX3BhdGgsIG9wdGlvbnMpCisgICAgICByZWNvcmQgPSBzbmFwc2hvdC5yZWNvcmQKKyAgICAgIGRpciA9IFBhdGhuYW1lLm5ldyhyZWNvcmQucm9vdCkKKyAgICAgIHByZXZpb3VzID0gcmVjb3JkLmRpcl9lbnRyaWVzKHJlbF9wYXRoKQorCisgICAgICByZWNvcmQuYWRkX2RpcihyZWxfcGF0aCkKKworICAgICAgIyBUT0RPOiB1c2UgY2hpbGRyZW4od2l0aF9kaXJlY3Rvcnk6IGZhbHNlKQorICAgICAgcGF0aCA9IGRpciArIHJlbF9wYXRoCisgICAgICBjdXJyZW50ID0gU2V0Lm5ldyhfY2hpbGRyZW4ocGF0aCkpCisKKyAgICAgIFNhc3NMaXN0ZW46OkxvZ2dlci5kZWJ1ZyBkbworICAgICAgICBmb3JtYXQoJyVzOiAlcyglcyk6ICVzIC0+ICVzJywKKyAgICAgICAgICAgICAgIChvcHRpb25zWzpzaWxlbmNlXSA/ICdSZWNvcmRpbmcnIDogJ1NjYW5uaW5nJyksCisgICAgICAgICAgICAgICByZWxfcGF0aCwgb3B0aW9ucy5pbnNwZWN0LCBwcmV2aW91cy5pbnNwZWN0LCBjdXJyZW50Lmluc3BlY3QpCisgICAgICBlbmQKKworICAgICAgYmVnaW4KKyAgICAgICAgY3VycmVudC5lYWNoIGRvIHxmdWxsX3BhdGh8CisgICAgICAgICAgdHlwZSA9IDo6RmlsZS5sc3RhdChmdWxsX3BhdGgudG9fcykuZGlyZWN0b3J5PyA/IDpkaXIgOiA6ZmlsZQorICAgICAgICAgIGl0ZW1fcmVsX3BhdGggPSBmdWxsX3BhdGgucmVsYXRpdmVfcGF0aF9mcm9tKGRpcikudG9fcworICAgICAgICAgIF9jaGFuZ2Uoc25hcHNob3QsIHR5cGUsIGl0ZW1fcmVsX3BhdGgsIG9wdGlvbnMpCisgICAgICAgIGVuZAorICAgICAgcmVzY3VlIEVycm5vOjpFTk9FTlQKKyAgICAgICAgIyBUaGUgZGlyZWN0b3J5IGNoYW5nZWQgbWVhbndoaWxlLCBzbyByZXNjYW4gaXQKKyAgICAgICAgY3VycmVudCA9IFNldC5uZXcoX2NoaWxkcmVuKHBhdGgpKQorICAgICAgICByZXRyeQorICAgICAgZW5kCisKKyAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgdGVzdGVkIHByb3Blcmx5CisgICAgICBwcmV2aW91cyA9IHByZXZpb3VzLnJlamVjdCB7IHxlbnRyeSwgX3wgY3VycmVudC5pbmNsdWRlPyBwYXRoICsgZW50cnkgfQorCisgICAgICBfYXN5bmNfY2hhbmdlcyhzbmFwc2hvdCwgUGF0aG5hbWUubmV3KHJlbF9wYXRoKSwgcHJldmlvdXMsIG9wdGlvbnMpCisKKyAgICByZXNjdWUgRXJybm86OkVOT0VOVCwgRXJybm86OkVIT1NURE9XTgorICAgICAgcmVjb3JkLnVuc2V0X3BhdGgocmVsX3BhdGgpCisgICAgICBfYXN5bmNfY2hhbmdlcyhzbmFwc2hvdCwgUGF0aG5hbWUubmV3KHJlbF9wYXRoKSwgcHJldmlvdXMsIG9wdGlvbnMpCisKKyAgICByZXNjdWUgRXJybm86OkVOT1RESVIKKyAgICAgICMgVE9ETzogcGF0aCBub3QgdGVzdGVkCisgICAgICByZWNvcmQudW5zZXRfcGF0aChyZWxfcGF0aCkKKyAgICAgIF9hc3luY19jaGFuZ2VzKHNuYXBzaG90LCBwYXRoLCBwcmV2aW91cywgb3B0aW9ucykKKyAgICAgIF9jaGFuZ2Uoc25hcHNob3QsIDpmaWxlLCByZWxfcGF0aCwgb3B0aW9ucykKKyAgICByZXNjdWUKKyAgICAgIFNhc3NMaXN0ZW46OkxvZ2dlci53YXJuIGRvCisgICAgICAgIGZvcm1hdCgnc2NhbiBESUVEOiAlczolcycsICRFUlJPUl9JTkZPLCAkRVJST1JfUE9TSVRJT04gKiAiXG4iKQorICAgICAgZW5kCisgICAgICByYWlzZQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuX2FzeW5jX2NoYW5nZXMoc25hcHNob3QsIHBhdGgsIHByZXZpb3VzLCBvcHRpb25zKQorICAgICAgZmFpbCAiTm90IGEgUGF0aG5hbWU6ICN7cGF0aC5pbnNwZWN0fSIgdW5sZXNzIHBhdGgucmVzcG9uZF90bz8oOmNoaWxkcmVuKQorICAgICAgcHJldmlvdXMuZWFjaCBkbyB8ZW50cnksIGRhdGF8CisgICAgICAgICMgVE9ETzogdGhpcyBpcyBhIGhhY2sgd2l0aCBpbnN1ZmZpY2llbnQgdGVzdGluZworICAgICAgICB0eXBlID0gZGF0YS5rZXk/KDptdGltZSkgPyA6ZmlsZSA6IDpkaXIKKyAgICAgICAgcmVsX3BhdGhfcyA9IChwYXRoICsgZW50cnkpLnRvX3MKKyAgICAgICAgX2NoYW5nZShzbmFwc2hvdCwgdHlwZSwgcmVsX3BhdGhfcywgb3B0aW9ucykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHNlbGYuX2NoYW5nZShzbmFwc2hvdCwgdHlwZSwgcGF0aCwgb3B0aW9ucykKKyAgICAgIHJldHVybiBzbmFwc2hvdC5pbnZhbGlkYXRlKHR5cGUsIHBhdGgsIG9wdGlvbnMpIGlmIHR5cGUgPT0gOmRpcgorCisgICAgICAjIE1pbm9yIHBhcmFtIGNsZWFudXAgZm9yIHRlc3RzCisgICAgICAjIFRPRE86IHVzZSBhIGRlZGljYXRlZCBFdmVudCBjbGFzcworICAgICAgb3B0cyA9IG9wdGlvbnMuZHVwCisgICAgICBvcHRzLmRlbGV0ZSg6cmVjdXJzaXZlKQorICAgICAgc25hcHNob3QuaW52YWxpZGF0ZSh0eXBlLCBwYXRoLCBvcHRzKQorICAgIGVuZAorCisgICAgZGVmIHNlbGYuX2NoaWxkcmVuKHBhdGgpCisgICAgICByZXR1cm4gcGF0aC5jaGlsZHJlbiB1bmxlc3MgUlVCWV9FTkdJTkUgPT0gJ2pydWJ5JworCisgICAgICAjIEpSdWJ5IGluY29uc2lzdGVuY3kgd29ya2Fyb3VuZCwgc2VlOgorICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vanJ1YnkvanJ1YnkvaXNzdWVzLzM4NDAKKyAgICAgIGV4aXN0cyA9IHBhdGguZXhpc3Q/CisgICAgICBkaXJlY3RvcnkgPSBwYXRoLmRpcmVjdG9yeT8KKyAgICAgIHJldHVybiBwYXRoLmNoaWxkcmVuIHVubGVzcyAoZXhpc3RzICYmICFkaXJlY3RvcnkpCisgICAgICByYWlzZSBFcnJubzo6RU5PVERJUiwgcGF0aC50b19zCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vZXZlbnQvY29uZmlnLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2V2ZW50L2NvbmZpZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzA5ZWJlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2V2ZW50L2NvbmZpZy5yYgpAQCAtMCwwICsxLDU5IEBACittb2R1bGUgU2Fzc0xpc3RlbgorICBtb2R1bGUgRXZlbnQKKyAgICBjbGFzcyBDb25maWcKKyAgICAgIGRlZiBpbml0aWFsaXplKAorICAgICAgICBsaXN0ZW5lciwKKyAgICAgICAgZXZlbnRfcXVldWUsCisgICAgICAgIHF1ZXVlX29wdGltaXplciwKKyAgICAgICAgd2FpdF9mb3JfZGVsYXksCisgICAgICAgICZibG9jaykKKworICAgICAgICBAbGlzdGVuZXIgPSBsaXN0ZW5lcgorICAgICAgICBAZXZlbnRfcXVldWUgPSBldmVudF9xdWV1ZQorICAgICAgICBAcXVldWVfb3B0aW1pemVyID0gcXVldWVfb3B0aW1pemVyCisgICAgICAgIEBtaW5fZGVsYXlfYmV0d2Vlbl9ldmVudHMgPSB3YWl0X2Zvcl9kZWxheQorICAgICAgICBAYmxvY2sgPSBibG9jaworICAgICAgZW5kCisKKyAgICAgIGRlZiBzbGVlcCgqYXJncykKKyAgICAgICAgS2VybmVsLnNsZWVwKCphcmdzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjYWxsKCphcmdzKQorICAgICAgICBAYmxvY2suY2FsbCgqYXJncykgaWYgQGJsb2NrCisgICAgICBlbmQKKworICAgICAgZGVmIHRpbWVzdGFtcAorICAgICAgICBUaW1lLm5vdy50b19mCisgICAgICBlbmQKKworICAgICAgZGVmIGV2ZW50X3F1ZXVlCisgICAgICAgIEBldmVudF9xdWV1ZQorICAgICAgZW5kCisKKyAgICAgIGRlZiBjYWxsYWJsZT8KKyAgICAgICAgQGJsb2NrCisgICAgICBlbmQKKworICAgICAgZGVmIG9wdGltaXplX2NoYW5nZXMoY2hhbmdlcykKKyAgICAgICAgQHF1ZXVlX29wdGltaXplci5zbW9vc2hfY2hhbmdlcyhjaGFuZ2VzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBtaW5fZGVsYXlfYmV0d2Vlbl9ldmVudHMKKyAgICAgICAgQG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cworICAgICAgZW5kCisKKyAgICAgIGRlZiBzdG9wcGVkPworICAgICAgICBsaXN0ZW5lci5zdGF0ZSA9PSA6c3RvcHBlZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBwYXVzZWQ/CisgICAgICAgIGxpc3RlbmVyLnN0YXRlID09IDpwYXVzZWQKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGF0dHJfcmVhZGVyIDpsaXN0ZW5lcgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2V2ZW50L2xvb3AucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vZXZlbnQvbG9vcC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmNhZWMyCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2V2ZW50L2xvb3AucmIKQEAgLTAsMCArMSwxMTcgQEAKK3JlcXVpcmUgJ3RocmVhZCcKKworcmVxdWlyZSAndGltZW91dCcKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2V2ZW50L3Byb2Nlc3NvcicKKworbW9kdWxlIFNhc3NMaXN0ZW4KKyAgbW9kdWxlIEV2ZW50CisgICAgY2xhc3MgTG9vcAorICAgICAgY2xhc3MgRXJyb3IgPCBSdW50aW1lRXJyb3IKKyAgICAgICAgY2xhc3MgTm90U3RhcnRlZCA8IEVycm9yCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbml0aWFsaXplKGNvbmZpZykKKyAgICAgICAgQGNvbmZpZyA9IGNvbmZpZworICAgICAgICBAd2FpdF90aHJlYWQgPSBuaWwKKyAgICAgICAgQHN0YXRlID0gOnBhdXNlZAorICAgICAgICBAcmVhc29ucyA9IDo6UXVldWUubmV3CisgICAgICBlbmQKKworICAgICAgZGVmIHdha2V1cF9vbl9ldmVudAorICAgICAgICByZXR1cm4gaWYgc3RvcHBlZD8KKyAgICAgICAgcmV0dXJuIHVubGVzcyBwcm9jZXNzaW5nPworICAgICAgICByZXR1cm4gdW5sZXNzIHdhaXRfdGhyZWFkLmFsaXZlPworICAgICAgICBfd2FrZXVwKDpldmVudCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgcGF1c2VkPworICAgICAgICB3YWl0X3RocmVhZCAmJiBzdGF0ZSA9PSA6cGF1c2VkCisgICAgICBlbmQKKworICAgICAgZGVmIHByb2Nlc3Npbmc/CisgICAgICAgIHJldHVybiBmYWxzZSBpZiBzdG9wcGVkPworICAgICAgICByZXR1cm4gZmFsc2UgaWYgcGF1c2VkPworICAgICAgICBzdGF0ZSA9PSA6cHJvY2Vzc2luZworICAgICAgZW5kCisKKyAgICAgIGRlZiBzZXR1cAorICAgICAgICAjIFRPRE86IHVzZSBhIEZpYmVyIGluc3RlYWQ/CisgICAgICAgIHEgPSA6OlF1ZXVlLm5ldworICAgICAgICBAd2FpdF90aHJlYWQgPSBJbnRlcm5hbHM6OlRocmVhZFBvb2wuYWRkIGRvCisgICAgICAgICAgX3dhaXRfZm9yX2NoYW5nZXMocSwgY29uZmlnKQorICAgICAgICBlbmQKKworICAgICAgICBTYXNzTGlzdGVuOjpMb2dnZXIuZGVidWcoJ1dhaXRpbmcgZm9yIHByb2Nlc3NpbmcgdG8gc3RhcnQuLi4nKQorICAgICAgICBUaW1lb3V0LnRpbWVvdXQoNSkgeyBxLnBvcCB9CisgICAgICBlbmQKKworICAgICAgZGVmIHJlc3VtZQorICAgICAgICBmYWlsIEVycm9yOjpOb3RTdGFydGVkIGlmIHN0b3BwZWQ/CisgICAgICAgIHJldHVybiB1bmxlc3Mgd2FpdF90aHJlYWQKKyAgICAgICAgX3dha2V1cCg6cmVzdW1lKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBwYXVzZQorICAgICAgICAjIFRPRE86IHdvcmtzPworICAgICAgICAjIGZhaWwgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgZW5kCisKKyAgICAgIGRlZiB0ZWFyZG93bgorICAgICAgICByZXR1cm4gdW5sZXNzIHdhaXRfdGhyZWFkCisgICAgICAgIGlmIHdhaXRfdGhyZWFkLmFsaXZlPworICAgICAgICAgIF93YWtldXAoOnRlYXJkb3duKQorICAgICAgICAgIHdhaXRfdGhyZWFkLmpvaW4KKyAgICAgICAgZW5kCisgICAgICAgIEB3YWl0X3RocmVhZCA9IG5pbAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzdG9wcGVkPworICAgICAgICAhd2FpdF90aHJlYWQKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGF0dHJfcmVhZGVyIDpjb25maWcKKyAgICAgIGF0dHJfcmVhZGVyIDp3YWl0X3RocmVhZAorCisgICAgICBhdHRyX2FjY2Vzc29yIDpzdGF0ZQorCisgICAgICBkZWYgX3dhaXRfZm9yX2NoYW5nZXMocmVhZHlfcXVldWUsIGNvbmZpZykKKyAgICAgICAgcHJvY2Vzc29yID0gRXZlbnQ6OlByb2Nlc3Nvci5uZXcoY29uZmlnLCBAcmVhc29ucykKKworICAgICAgICBfd2FpdF91bnRpbF9yZXN1bWVkKHJlYWR5X3F1ZXVlKQorICAgICAgICBwcm9jZXNzb3IubG9vcF9mb3IoY29uZmlnLm1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cykKKyAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGV4CisgICAgICAgIF9uaWNlX2Vycm9yKGV4KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfc2xlZXAoKmFyZ3MpCisgICAgICAgIEtlcm5lbC5zbGVlcCgqYXJncykKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3dhaXRfdW50aWxfcmVzdW1lZChyZWFkeV9xdWV1ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IDpwYXVzZWQKKyAgICAgICAgcmVhZHlfcXVldWUgPDwgOnJlYWR5CisgICAgICAgIHNsZWVwCisgICAgICAgIHNlbGYuc3RhdGUgPSA6cHJvY2Vzc2luZworICAgICAgZW5kCisKKyAgICAgIGRlZiBfbmljZV9lcnJvcihleCkKKyAgICAgICAgaW5kZW50ID0gIlxuIC0tICIKKyAgICAgICAgbXNnID0gZm9ybWF0KAorICAgICAgICAgICdleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyBldmVudHM6ICVzIEJhY2t0cmFjZTolcyVzJywKKyAgICAgICAgICBleCwKKyAgICAgICAgICBpbmRlbnQsCisgICAgICAgICAgZXguYmFja3RyYWNlICogaW5kZW50CisgICAgICAgICkKKyAgICAgICAgU2Fzc0xpc3Rlbjo6TG9nZ2VyLmVycm9yKG1zZykKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3dha2V1cChyZWFzb24pCisgICAgICAgIEByZWFzb25zIDw8IHJlYXNvbgorICAgICAgICB3YWl0X3RocmVhZC53YWtldXAKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2V2ZW50L3Byb2Nlc3Nvci5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9ldmVudC9wcm9jZXNzb3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwMjg4MAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9ldmVudC9wcm9jZXNzb3IucmIKQEAgLTAsMCArMSwxMjIgQEAKK21vZHVsZSBTYXNzTGlzdGVuCisgIG1vZHVsZSBFdmVudAorICAgIGNsYXNzIFByb2Nlc3NvcgorICAgICAgZGVmIGluaXRpYWxpemUoY29uZmlnLCByZWFzb25zKQorICAgICAgICBAY29uZmlnID0gY29uZmlnCisgICAgICAgIEByZWFzb25zID0gcmVhc29ucworICAgICAgICBfcmVzZXRfbm9fdW5wcm9jZXNzZWRfZXZlbnRzCisgICAgICBlbmQKKworICAgICAgIyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseSBpbnN0ZWFkIG9mIGNoZWNraW5nIHRoZSBzdGF0ZSBhdCBhcmJpdHJhcnkKKyAgICAgICMgcG9pbnRzIGluIHRpbWUKKyAgICAgIGRlZiBsb29wX2ZvcihsYXRlbmN5KQorICAgICAgICBAbGF0ZW5jeSA9IGxhdGVuY3kKKworICAgICAgICBsb29wIGRvCisgICAgICAgICAgX3dhaXRfdW50aWxfZXZlbnRzCisgICAgICAgICAgX3dhaXRfdW50aWxfZXZlbnRzX2NhbG1fZG93bgorICAgICAgICAgIF93YWl0X3VudGlsX25vX2xvbmdlcl9wYXVzZWQKKyAgICAgICAgICBfcHJvY2Vzc19jaGFuZ2VzCisgICAgICAgIGVuZAorICAgICAgcmVzY3VlIFN0b3BwZWQKKyAgICAgICAgU2Fzc0xpc3Rlbjo6TG9nZ2VyLmRlYnVnKCdQcm9jZXNzaW5nIHN0b3BwZWQnKQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgY2xhc3MgU3RvcHBlZCA8IFJ1bnRpbWVFcnJvcgorICAgICAgZW5kCisKKyAgICAgIGRlZiBfd2FpdF91bnRpbF9ldmVudHNfY2FsbV9kb3duCisgICAgICAgIGxvb3AgZG8KKyAgICAgICAgICBub3cgPSBfdGltZXN0YW1wCisKKyAgICAgICAgICAjIEFzc3VyZSB0aGVyZSdzIGF0IGxlYXN0IGxhdGVuY3kgYmV0d2VlbiBjYWxsYmFja3MgdG8gYWxsb3cKKyAgICAgICAgICAjIGZvciBhY2N1bXVsYXRpbmcgY2hhbmdlcworICAgICAgICAgIGRpZmYgPSBfZGVhZGxpbmUgLSBub3cKKyAgICAgICAgICBicmVhayBpZiBkaWZmIDw9IDAKKworICAgICAgICAgICMgZ2l2ZSBldmVudHMgYSBiaXQgb2YgdGltZSB0byBhY2N1bXVsYXRlIHNvIHRoZXkgY2FuIGJlCisgICAgICAgICAgIyBjb21wcmVzc2VkL29wdGltaXplZAorICAgICAgICAgIF9zbGVlcCg6d2FpdGluZ191bnRpbF9sYXRlbmN5LCBkaWZmKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3dhaXRfdW50aWxfbm9fbG9uZ2VyX3BhdXNlZAorICAgICAgICAjIFRPRE86IG1heSBub3QgYmUgYSBnb29kIGlkZWE/CisgICAgICAgIF9zbGVlcCg6d2FpdGluZ19mb3JfdW5wYXVzZSkgd2hpbGUgY29uZmlnLnBhdXNlZD8KKyAgICAgIGVuZAorCisgICAgICBkZWYgX2NoZWNrX3N0b3BwZWQKKyAgICAgICAgcmV0dXJuIHVubGVzcyBjb25maWcuc3RvcHBlZD8KKworICAgICAgICBfZmx1c2hfd2FrZXVwX3JlYXNvbnMKKyAgICAgICAgcmFpc2UgU3RvcHBlZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBfc2xlZXAoX2xvY2FsX3JlYXNvbiwgKmFyZ3MpCisgICAgICAgIF9jaGVja19zdG9wcGVkCisgICAgICAgIHNsZWVwX2R1cmF0aW9uID0gY29uZmlnLnNsZWVwKCphcmdzKQorICAgICAgICBfY2hlY2tfc3RvcHBlZAorCisgICAgICAgIF9mbHVzaF93YWtldXBfcmVhc29ucyBkbyB8cmVhc29ufAorICAgICAgICAgIG5leHQgdW5sZXNzIHJlYXNvbiA9PSA6ZXZlbnQKKyAgICAgICAgICBfcmVtZW1iZXJfdGltZV9vZl9maXJzdF91bnByb2Nlc3NlZF9ldmVudCB1bmxlc3MgY29uZmlnLnBhdXNlZD8KKyAgICAgICAgZW5kCisKKyAgICAgICAgc2xlZXBfZHVyYXRpb24KKyAgICAgIGVuZAorCisgICAgICBkZWYgX3JlbWVtYmVyX3RpbWVfb2ZfZmlyc3RfdW5wcm9jZXNzZWRfZXZlbnQKKyAgICAgICAgQGZpcnN0X3VucHJvY2Vzc2VkX2V2ZW50X3RpbWUgfHw9IF90aW1lc3RhbXAKKyAgICAgIGVuZAorCisgICAgICBkZWYgX3Jlc2V0X25vX3VucHJvY2Vzc2VkX2V2ZW50cworICAgICAgICBAZmlyc3RfdW5wcm9jZXNzZWRfZXZlbnRfdGltZSA9IG5pbAorICAgICAgZW5kCisKKyAgICAgIGRlZiBfZGVhZGxpbmUKKyAgICAgICAgQGZpcnN0X3VucHJvY2Vzc2VkX2V2ZW50X3RpbWUgKyBAbGF0ZW5jeQorICAgICAgZW5kCisKKyAgICAgIGRlZiBfd2FpdF91bnRpbF9ldmVudHMKKyAgICAgICAgIyBUT0RPOiBsb25nIHNsZWVwIG1heSBub3QgYmUgYSBnb29kIGlkZWE/CisgICAgICAgIF9zbGVlcCg6d2FpdGluZ19mb3JfZXZlbnRzKSB3aGlsZSBjb25maWcuZXZlbnRfcXVldWUuZW1wdHk/CisgICAgICAgIEBmaXJzdF91bnByb2Nlc3NlZF9ldmVudF90aW1lIHx8PSBfdGltZXN0YW1wCisgICAgICBlbmQKKworICAgICAgZGVmIF9mbHVzaF93YWtldXBfcmVhc29ucworICAgICAgICByZWFzb25zID0gQHJlYXNvbnMKKyAgICAgICAgdW50aWwgcmVhc29ucy5lbXB0eT8KKyAgICAgICAgICByZWFzb24gPSByZWFzb25zLnBvcAorICAgICAgICAgIHlpZWxkIHJlYXNvbiBpZiBibG9ja19naXZlbj8KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIF90aW1lc3RhbXAKKyAgICAgICAgY29uZmlnLnRpbWVzdGFtcAorICAgICAgZW5kCisKKyAgICAgICMgZm9yIGVhc2llciB0ZXN0aW5nIHdpdGhvdXQgc2xlZXAgbG9vcAorICAgICAgZGVmIF9wcm9jZXNzX2NoYW5nZXMKKyAgICAgICAgX3Jlc2V0X25vX3VucHJvY2Vzc2VkX2V2ZW50cworCisgICAgICAgIGNoYW5nZXMgPSBbXQorICAgICAgICBjaGFuZ2VzIDw8IGNvbmZpZy5ldmVudF9xdWV1ZS5wb3AgdW50aWwgY29uZmlnLmV2ZW50X3F1ZXVlLmVtcHR5PworCisgICAgICAgIGNhbGxhYmxlID0gY29uZmlnLmNhbGxhYmxlPworICAgICAgICByZXR1cm4gdW5sZXNzIGNhbGxhYmxlCisKKyAgICAgICAgaGFzaCA9IGNvbmZpZy5vcHRpbWl6ZV9jaGFuZ2VzKGNoYW5nZXMpCisgICAgICAgIHJlc3VsdCA9IFtoYXNoWzptb2RpZmllZF0sIGhhc2hbOmFkZGVkXSwgaGFzaFs6cmVtb3ZlZF1dCisgICAgICAgIHJldHVybiBpZiByZXN1bHQuYWxsPygmOmVtcHR5PykKKworICAgICAgICBibG9ja19zdGFydCA9IF90aW1lc3RhbXAKKyAgICAgICAgY29uZmlnLmNhbGwoKnJlc3VsdCkKKyAgICAgICAgU2Fzc0xpc3Rlbjo6TG9nZ2VyLmRlYnVnICJDYWxsYmFjayB0b29rICN7X3RpbWVzdGFtcCAtIGJsb2NrX3N0YXJ0fSBzZWMiCisgICAgICBlbmQKKworICAgICAgYXR0cl9yZWFkZXIgOmNvbmZpZworICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2V2ZW50L3F1ZXVlLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2V2ZW50L3F1ZXVlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzYzNjcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vZXZlbnQvcXVldWUucmIKQEAgLTAsMCArMSw1OCBAQAorcmVxdWlyZSAndGhyZWFkJworCityZXF1aXJlICdmb3J3YXJkYWJsZScKKworbW9kdWxlIFNhc3NMaXN0ZW4KKyAgbW9kdWxlIEV2ZW50CisgICAgY2xhc3MgUXVldWUKKyAgICAgIGNsYXNzIENvbmZpZworICAgICAgICBkZWYgaW5pdGlhbGl6ZShyZWxhdGl2ZSkKKyAgICAgICAgICBAcmVsYXRpdmUgPSByZWxhdGl2ZQorICAgICAgICBlbmQKKworICAgICAgICBkZWYgcmVsYXRpdmU/CisgICAgICAgICAgQHJlbGF0aXZlCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBpbml0aWFsaXplKGNvbmZpZywgJmJsb2NrKQorICAgICAgICBAZXZlbnRfcXVldWUgPSA6OlF1ZXVlLm5ldworICAgICAgICBAYmxvY2sgPSBibG9jaworICAgICAgICBAY29uZmlnID0gY29uZmlnCisgICAgICBlbmQKKworICAgICAgZGVmIDw8KGFyZ3MpCisgICAgICAgIHR5cGUsIGNoYW5nZSwgZGlyLCBwYXRoLCBvcHRpb25zID0gKmFyZ3MKKyAgICAgICAgZmFpbCAiSW52YWxpZCB0eXBlOiAje3R5cGUuaW5zcGVjdH0iIHVubGVzcyBbOmRpciwgOmZpbGVdLmluY2x1ZGU/IHR5cGUKKyAgICAgICAgZmFpbCAiSW52YWxpZCBjaGFuZ2U6ICN7Y2hhbmdlLmluc3BlY3R9IiB1bmxlc3MgY2hhbmdlLmlzX2E/KFN5bWJvbCkKKyAgICAgICAgZmFpbCAiSW52YWxpZCBwYXRoOiAje3BhdGguaW5zcGVjdH0iIHVubGVzcyBwYXRoLmlzX2E/KFN0cmluZykKKworICAgICAgICBkaXIgPSBfc2FmZV9yZWxhdGl2ZV9mcm9tX2N3ZChkaXIpCisgICAgICAgIGV2ZW50X3F1ZXVlLnB1YmxpY19zZW5kKDo8PCwgW3R5cGUsIGNoYW5nZSwgZGlyLCBwYXRoLCBvcHRpb25zXSkKKworICAgICAgICBibG9jay5jYWxsKGFyZ3MpIGlmIGJsb2NrCisgICAgICBlbmQKKworICAgICAgZGVmIGVtcHR5PworICAgICAgICBldmVudF9xdWV1ZS5lbXB0eT8KKyAgICAgIGVuZAorCisgICAgICBkZWYgcG9wCisgICAgICAgIGV2ZW50X3F1ZXVlLnBvcAorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgYXR0cl9yZWFkZXIgOmV2ZW50X3F1ZXVlCisgICAgICBhdHRyX3JlYWRlciA6YmxvY2sKKyAgICAgIGF0dHJfcmVhZGVyIDpjb25maWcKKworICAgICAgZGVmIF9zYWZlX3JlbGF0aXZlX2Zyb21fY3dkKGRpcikKKyAgICAgICAgcmV0dXJuIGRpciB1bmxlc3MgY29uZmlnLnJlbGF0aXZlPworICAgICAgICBkaXIucmVsYXRpdmVfcGF0aF9mcm9tKFBhdGhuYW1lLnB3ZCkKKyAgICAgIHJlc2N1ZSBBcmd1bWVudEVycm9yCisgICAgICAgIGRpcgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vZmlsZS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9maWxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjBiZDcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vZmlsZS5yYgpAQCAtMCwwICsxLDgwIEBACityZXF1aXJlICdkaWdlc3QvbWQ1JworCittb2R1bGUgU2Fzc0xpc3RlbgorICBjbGFzcyBGaWxlCisgICAgZGVmIHNlbGYuY2hhbmdlKHJlY29yZCwgcmVsX3BhdGgpCisgICAgICBwYXRoID0gUGF0aG5hbWUubmV3KHJlY29yZC5yb290KSArIHJlbF9wYXRoCisgICAgICBsc3RhdCA9IHBhdGgubHN0YXQKKworICAgICAgZGF0YSA9IHsgbXRpbWU6IGxzdGF0Lm10aW1lLnRvX2YsIG1vZGU6IGxzdGF0Lm1vZGUgfQorCisgICAgICByZWNvcmRfZGF0YSA9IHJlY29yZC5maWxlX2RhdGEocmVsX3BhdGgpCisKKyAgICAgIGlmIHJlY29yZF9kYXRhLmVtcHR5PworICAgICAgICByZWNvcmQudXBkYXRlX2ZpbGUocmVsX3BhdGgsIGRhdGEpCisgICAgICAgIHJldHVybiA6YWRkZWQKKyAgICAgIGVuZAorCisgICAgICBpZiBkYXRhWzptb2RlXSAhPSByZWNvcmRfZGF0YVs6bW9kZV0KKyAgICAgICAgcmVjb3JkLnVwZGF0ZV9maWxlKHJlbF9wYXRoLCBkYXRhKQorICAgICAgICByZXR1cm4gOm1vZGlmaWVkCisgICAgICBlbmQKKworICAgICAgaWYgZGF0YVs6bXRpbWVdICE9IHJlY29yZF9kYXRhWzptdGltZV0KKyAgICAgICAgcmVjb3JkLnVwZGF0ZV9maWxlKHJlbF9wYXRoLCBkYXRhKQorICAgICAgICByZXR1cm4gOm1vZGlmaWVkCisgICAgICBlbmQKKworICAgICAgcmV0dXJuIGlmIC8xfHRydWUvID1+IEVOVlsnTElTVEVOX0dFTV9ESVNBQkxFX0hBU0hJTkcnXQorICAgICAgcmV0dXJuIHVubGVzcyBzZWxmLmluYWNjdXJhdGVfbWFjX3RpbWU/KGxzdGF0KQorCisgICAgICAjIENoZWNrIGlmIGNoYW5nZSBoYXBwZW5lZCB3aXRoaW4gMSBzZWNvbmQgKG1heWJlIGl0J3MgZXZlbgorICAgICAgIyB0b28gbXVjaCwgZS5nLiAwLjMtMC41IGNvdWxkIGJlIHN1ZmZpY2llbnQpLgorICAgICAgIworICAgICAgIyBXaXRoIHJiLWZzZXZlbnQsIHRoZXJlJ3MgYSAoY29uZmlndXJhYmxlKSBsYXRlbmN5IGJldHdlZW4KKyAgICAgICMgd2hlbiBmaWxlIHdhcyBjaGFuZ2VkIGFuZCB3aGVuIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkLgorICAgICAgIworICAgICAgIyBJZiBhIGZpbGUgaXMgc2F2ZWQgYXQgPz8/MTQuOTk4LCBieSB0aGUgdGltZSB0aGUgZXZlbnQgaXMKKyAgICAgICMgYWN0dWFsbHkgcmVjZWl2ZWQgYnkgU2Fzc0xpc3RlbiwgdGhlIHRpbWUgY291bGQgYWxyZWFkeSBiZSBlLmcuCisgICAgICAjID8/PzE1LjcuCisgICAgICAjCisgICAgICAjIEFuZCBzaW5jZSBEYXJ3aW4gYWRhcHRlciB1c2VzIGRpcmVjdG9yeSBzY2FubmluZywgdGhlIGZpbGUKKyAgICAgICMgbXRpbWUgbWF5IGJlIHRoZSBzYW1lIChlLmcuIGZpbGUgd2FzIGNoYW5nZWQgYXQgPz8/MTQuMDAxLAorICAgICAgIyB0aGVuIGF0ID8/PzE0Ljk5OCwgYnV0IHRoZSBmc3RhdCB0aW1lIHdvdWxkIGJlID8/PzE0LjAgaW4KKyAgICAgICMgYm90aCBjYXNlcykuCisgICAgICAjCisgICAgICAjIElmIGNoYW5nZSBoYXBwZW5kIGF0ID8/PzE0Ljk5OTk5NywgdGhlIG10aW1lIGlzIDE0LjAsIHNvIGZvcgorICAgICAgIyBhbiBtdGltZT0/Pz8xNC4wIHdlIGFzc3VtZSBpdCBjb3VsZCBldmVuIGJlIGFsbW9zdCA/Pz8xNS4wCisgICAgICAjCisgICAgICAjIFNvIGlmIFRpbWUubm93LnRvX2YgaXMgPz8/MTUuOTk5OTk4IGFuZCBzdGF0IHJlcG9ydHMgbXRpbWUKKyAgICAgICMgYXQgPz8/MTQuMCwgdGhlbiBldmVudCB3YXMgZHVlIHRvIHRoYXQgZmlsZSdkIGNoYW5nZSB3aGVuOgorICAgICAgIworICAgICAgIyA/Pz8xNS45OTk5OTcgLSA/Pz8xNC45OTk5OTggPCAxLjBzCisgICAgICAjCisgICAgICAjIFNvIHRoZSAiMiIgaXMgIjEgKyAxIiAoMXMgdG8gY292ZXIgcmItZnNldmVudCBsYXRlbmN5ICsKKyAgICAgICMgMXMgbWF4aW11bSBkaWZmZXJlbmNlIGJldHdlZW4gcmVhbCBtdGltZSBhbmQgdGhhdCByZWNvcmRlZAorICAgICAgIyBpbiB0aGUgZmlsZSBzeXN0ZW0pCisgICAgICAjCisgICAgICByZXR1cm4gaWYgZGF0YVs6bXRpbWVdLnRvX2kgKyAyIDw9IFRpbWUubm93LnRvX2YKKworICAgICAgbWQ1ID0gRGlnZXN0OjpNRDUuZmlsZShwYXRoKS5kaWdlc3QKKyAgICAgIHJlY29yZC51cGRhdGVfZmlsZShyZWxfcGF0aCwgZGF0YS5tZXJnZShtZDU6IG1kNSkpCisgICAgICA6bW9kaWZpZWQgaWYgcmVjb3JkX2RhdGFbOm1kNV0gJiYgbWQ1ICE9IHJlY29yZF9kYXRhWzptZDVdCisgICAgcmVzY3VlIFN5c3RlbUNhbGxFcnJvcgorICAgICAgcmVjb3JkLnVuc2V0X3BhdGgocmVsX3BhdGgpCisgICAgICA6cmVtb3ZlZAorICAgIHJlc2N1ZQorICAgICAgU2Fzc0xpc3Rlbjo6TG9nZ2VyLmRlYnVnICJsc3RhdCBmYWlsZWQgZm9yOiAje3JlbF9wYXRofSAoI3skRVJST1JfSU5GT30pIgorICAgICAgcmFpc2UKKyAgICBlbmQKKworICAgIGRlZiBzZWxmLmluYWNjdXJhdGVfbWFjX3RpbWU/KHN0YXQpCisgICAgICAjICdtYWMnIG1lYW5zIE1vZGlmaWVkL0FjY2Vzc2VkL0NyZWF0ZWQKKworICAgICAgIyBTaW5jZSBwcmVjaXNpb24gZGVwZW5kcyBvbiBtb3VudGVkIEZTIChlLmcuIHlvdSBjYW4gaGF2ZSBhIEZBVCBwYXJ0aWlvbgorICAgICAgIyBtb3VudGVkIG9uIExpbnV4KSwgY2hlY2sgZm9yIGZpZWxkcyB3aXRoIGEgcmVtYWluZGVyIHRvIGRldGVjdCB0aGlzCisKKyAgICAgIFtzdGF0Lm10aW1lLCBzdGF0LmN0aW1lLCBzdGF0LmF0aW1lXS5tYXAoJjp1c2VjKS5hbGw/KCY6emVybz8pCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vZnNtLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2ZzbS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjUzYjc2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2ZzbS5yYgpAQCAtMCwwICsxLDEzMSBAQAorIyBDb2RlIGNvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9jZWxsdWxvaWQvY2VsbHVsb2lkLWZzbQorbW9kdWxlIFNhc3NMaXN0ZW4KKyAgbW9kdWxlIEZTTQorICAgIERFRkFVTFRfU1RBVEUgPSA6ZGVmYXVsdCAjIERlZmF1bHQgc3RhdGUgbmFtZSB1bmxlc3Mgb25lIGlzIGV4cGxpY2l0bHkgc2V0CisKKyAgICAjIEluY2x1ZGVkIGhvb2sgdG8gZXh0ZW5kIGNsYXNzIG1ldGhvZHMKKyAgICBkZWYgc2VsZi5pbmNsdWRlZChrbGFzcykKKyAgICAgIGtsYXNzLnNlbmQgOmV4dGVuZCwgQ2xhc3NNZXRob2RzCisgICAgZW5kCisKKyAgICBtb2R1bGUgQ2xhc3NNZXRob2RzCisgICAgICAjIE9idGFpbiBvciBzZXQgdGhlIGRlZmF1bHQgc3RhdGUKKyAgICAgICMgUGFzc2luZyBhIHN0YXRlIG5hbWUgc2V0cyB0aGUgZGVmYXVsdCBzdGF0ZQorICAgICAgZGVmIGRlZmF1bHRfc3RhdGUobmV3X2RlZmF1bHQgPSBuaWwpCisgICAgICAgIGlmIG5ld19kZWZhdWx0CisgICAgICAgICAgQGRlZmF1bHRfc3RhdGUgPSBuZXdfZGVmYXVsdC50b19zeW0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGRlZmluZWQ/KEBkZWZhdWx0X3N0YXRlKSA/IEBkZWZhdWx0X3N0YXRlIDogREVGQVVMVF9TVEFURQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIE9idGFpbiB0aGUgdmFsaWQgc3RhdGVzIGZvciB0aGlzIEZTTQorICAgICAgZGVmIHN0YXRlcworICAgICAgICBAc3RhdGVzIHx8PSB7fQorICAgICAgZW5kCisKKyAgICAgICMgRGVjbGFyZSBhbiBGU00gc3RhdGUgYW5kIG9wdGlvbmFsbHkgcHJvdmlkZSBhIGNhbGxiYWNrIGJsb2NrIHRvIGZpcmUKKyAgICAgICMgT3B0aW9uczoKKyAgICAgICMgKiB0bzogYSBzdGF0ZSBvciBhcnJheSBvZiBzdGF0ZXMgdGhpcyBzdGF0ZSBjYW4gdHJhbnNpdGlvbiB0bworICAgICAgZGVmIHN0YXRlKCphcmdzLCAmYmxvY2spCisgICAgICAgIGlmIGFyZ3MubGFzdC5pc19hPyBIYXNoCisgICAgICAgICAgIyBTdHJpbmdpZnkga2V5cyA6LworICAgICAgICAgIG9wdGlvbnMgPSBhcmdzLnBvcC5lYWNoX3dpdGhfb2JqZWN0KHt9KSB7IHwoaywgdiksIGh8IGhbay50b19zXSA9IHYgfQorICAgICAgICBlbHNlCisgICAgICAgICAgb3B0aW9ucyA9IHt9CisgICAgICAgIGVuZAorCisgICAgICAgIGFyZ3MuZWFjaCBkbyB8bmFtZXwKKyAgICAgICAgICBuYW1lID0gbmFtZS50b19zeW0KKyAgICAgICAgICBkZWZhdWx0X3N0YXRlIG5hbWUgaWYgb3B0aW9uc1snZGVmYXVsdCddCisgICAgICAgICAgc3RhdGVzW25hbWVdID0gU3RhdGUubmV3KG5hbWUsIG9wdGlvbnNbJ3RvJ10sICZibG9jaykKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQmUga2luZCBhbmQgY2FsbCBzdXBlciBpZiB5b3UgbXVzdCByZWRlZmluZSBpbml0aWFsaXplCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBzdGF0ZSA9IHNlbGYuY2xhc3MuZGVmYXVsdF9zdGF0ZQorICAgIGVuZAorCisgICAgIyBPYnRhaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEZTTQorICAgIGF0dHJfcmVhZGVyIDpzdGF0ZQorCisgICAgZGVmIHRyYW5zaXRpb24oc3RhdGVfbmFtZSkKKyAgICAgIG5ld19zdGF0ZSA9IHZhbGlkYXRlX2FuZF9zYW5pdGl6ZV9uZXdfc3RhdGUoc3RhdGVfbmFtZSkKKyAgICAgIHJldHVybiB1bmxlc3MgbmV3X3N0YXRlCisgICAgICB0cmFuc2l0aW9uX3dpdGhfY2FsbGJhY2tzIShuZXdfc3RhdGUpCisgICAgZW5kCisKKyAgICAjIEltbWVkaWF0ZSBzdGF0ZSB0cmFuc2l0aW9uIHdpdGggbm8gY2hlY2tzLCBvciBjYWxsYmFja3MuICJEYW5nZXJvdXMhIgorICAgIGRlZiB0cmFuc2l0aW9uIShzdGF0ZV9uYW1lKQorICAgICAgQHN0YXRlID0gc3RhdGVfbmFtZQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICBkZWYgdmFsaWRhdGVfYW5kX3Nhbml0aXplX25ld19zdGF0ZShzdGF0ZV9uYW1lKQorICAgICAgc3RhdGVfbmFtZSA9IHN0YXRlX25hbWUudG9fc3ltCisKKyAgICAgIHJldHVybiBpZiBjdXJyZW50X3N0YXRlX25hbWUgPT0gc3RhdGVfbmFtZQorCisgICAgICBpZiBjdXJyZW50X3N0YXRlICYmICFjdXJyZW50X3N0YXRlLnZhbGlkX3RyYW5zaXRpb24/KHN0YXRlX25hbWUpCisgICAgICAgIHZhbGlkID0gY3VycmVudF9zdGF0ZS50cmFuc2l0aW9ucy5tYXAoJjp0b19zKS5qb2luKCcsICcpCisgICAgICAgIG1zZyA9ICIje3NlbGYuY2xhc3N9IGNhbid0IGNoYW5nZSBzdGF0ZSBmcm9tICcje0BzdGF0ZX0nIlwKKyAgICAgICAgICAiIHRvICcje3N0YXRlX25hbWV9Jywgb25seSB0bzogI3t2YWxpZH0iCisgICAgICAgIGZhaWwgQXJndW1lbnRFcnJvciwgbXNnCisgICAgICBlbmQKKworICAgICAgbmV3X3N0YXRlID0gc3RhdGVzW3N0YXRlX25hbWVdCisKKyAgICAgIHVubGVzcyBuZXdfc3RhdGUKKyAgICAgICAgcmV0dXJuIGlmIHN0YXRlX25hbWUgPT0gZGVmYXVsdF9zdGF0ZQorICAgICAgICBmYWlsIEFyZ3VtZW50RXJyb3IsICJpbnZhbGlkIHN0YXRlIGZvciAje3NlbGYuY2xhc3N9OiAje3N0YXRlX25hbWV9IgorICAgICAgZW5kCisKKyAgICAgIG5ld19zdGF0ZQorICAgIGVuZAorCisgICAgZGVmIHRyYW5zaXRpb25fd2l0aF9jYWxsYmFja3MhKHN0YXRlX25hbWUpCisgICAgICB0cmFuc2l0aW9uISBzdGF0ZV9uYW1lLm5hbWUKKyAgICAgIHN0YXRlX25hbWUuY2FsbChzZWxmKQorICAgIGVuZAorCisgICAgZGVmIHN0YXRlcworICAgICAgc2VsZi5jbGFzcy5zdGF0ZXMKKyAgICBlbmQKKworICAgIGRlZiBkZWZhdWx0X3N0YXRlCisgICAgICBzZWxmLmNsYXNzLmRlZmF1bHRfc3RhdGUKKyAgICBlbmQKKworICAgIGRlZiBjdXJyZW50X3N0YXRlCisgICAgICBzdGF0ZXNbQHN0YXRlXQorICAgIGVuZAorCisgICAgZGVmIGN1cnJlbnRfc3RhdGVfbmFtZQorICAgICAgY3VycmVudF9zdGF0ZSAmJiBjdXJyZW50X3N0YXRlLm5hbWUgfHwgJycKKyAgICBlbmQKKworICAgIGNsYXNzIFN0YXRlCisgICAgICBhdHRyX3JlYWRlciA6bmFtZSwgOnRyYW5zaXRpb25zCisKKyAgICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHRyYW5zaXRpb25zID0gbmlsLCAmYmxvY2spCisgICAgICAgIEBuYW1lLCBAYmxvY2sgPSBuYW1lLCBibG9jaworICAgICAgICBAdHJhbnNpdGlvbnMgPSBuaWwKKyAgICAgICAgQHRyYW5zaXRpb25zID0gQXJyYXkodHJhbnNpdGlvbnMpLm1hcCgmOnRvX3N5bSkgaWYgdHJhbnNpdGlvbnMKKyAgICAgIGVuZAorCisgICAgICBkZWYgY2FsbChvYmopCisgICAgICAgIG9iai5pbnN0YW5jZV9ldmFsKCZAYmxvY2spIGlmIEBibG9jaworICAgICAgZW5kCisKKyAgICAgIGRlZiB2YWxpZF90cmFuc2l0aW9uPyhuZXdfc3RhdGUpCisgICAgICAgICMgQWxsIHRyYW5zaXRpb25zIGFyZSBhbGxvd2VkIHVubGVzcyBleHByZXNzbHkKKyAgICAgICAgcmV0dXJuIHRydWUgdW5sZXNzIEB0cmFuc2l0aW9ucworCisgICAgICAgIEB0cmFuc2l0aW9ucy5pbmNsdWRlPyBuZXdfc3RhdGUudG9fc3ltCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9pbnRlcm5hbHMvdGhyZWFkX3Bvb2wucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vaW50ZXJuYWxzL3RocmVhZF9wb29sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMmIyMTQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vaW50ZXJuYWxzL3RocmVhZF9wb29sLnJiCkBAIC0wLDAgKzEsMjkgQEAKK21vZHVsZSBTYXNzTGlzdGVuCisgICMgQHByaXZhdGUgYXBpCisgIG1vZHVsZSBJbnRlcm5hbHMKKyAgICBtb2R1bGUgVGhyZWFkUG9vbAorICAgICAgZGVmIHNlbGYuYWRkKCZibG9jaykKKyAgICAgICAgVGhyZWFkLm5ldyB7IGJsb2NrLmNhbGwgfS50YXAgZG8gfHRofAorICAgICAgICAgIChAdGhyZWFkcyB8fD0gUXVldWUubmV3KSA8PCB0aAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdG9wCisgICAgICAgIHJldHVybiB1bmxlc3MgQHRocmVhZHMgfHw9IG5pbAorICAgICAgICByZXR1cm4gaWYgQHRocmVhZHMuZW1wdHk/ICMgcmV0dXJuIHRvIGF2b2lkIHVzaW5nIHBvc3NpYmx5IHN0dWJiZWQgUXVldWUKKworICAgICAgICBraWxsZWQgPSBRdWV1ZS5uZXcKKyAgICAgICAgIyBZb3UgY2FuJ3Qga2lsbCBhIHJlYWQgb24gYSBkZXNjcmlwdG9yIGluIEpSdWJ5LCBzbyBsZXQncyBqdXN0CisgICAgICAgICMgaWdub3JlIHJ1bm5pbmcgdGhyZWFkcyAobGlzdGVuIHJiLWlub3RpZnkgd2FpdGluZyBmb3IgZGlzayBhY3Rpdml0eQorICAgICAgICAjIGJlZm9yZSBjbG9zaW5nKSAgcHJheSB0aHJlYWRzIGRpZSBmYXN0ZXIgdGhhbiB0aGV5IGFyZSBjcmVhdGVkLi4uCisgICAgICAgIGxpbWl0ID0gUlVCWV9FTkdJTkUgPT0gJ2pydWJ5JyA/IFsxXSA6IFtdCisKKyAgICAgICAga2lsbGVkIDw8IEB0aHJlYWRzLnBvcC5raWxsIHVudGlsIEB0aHJlYWRzLmVtcHR5PworICAgICAgICB1bnRpbCBraWxsZWQuZW1wdHk/CisgICAgICAgICAgdGggPSBraWxsZWQucG9wCisgICAgICAgICAgdGguam9pbigqbGltaXQpIHVubGVzcyB0aFs6bGlzdGVuX2Jsb2NraW5nX3JlYWRfdGhyZWFkXQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2xpc3RlbmVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2xpc3RlbmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWUyYTcKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vbGlzdGVuZXIucmIKQEAgLTAsMCArMSwxMzIgQEAKK3JlcXVpcmUgJ0VuZ2xpc2gnCisKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL3ZlcnNpb24nCisKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2JhY2tlbmQnCisKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL3NpbGVuY2VyJworcmVxdWlyZSAnc2Fzcy1saXN0ZW4vc2lsZW5jZXIvY29udHJvbGxlcicKKworcmVxdWlyZSAnc2Fzcy1saXN0ZW4vcXVldWVfb3B0aW1pemVyJworCityZXF1aXJlICdzYXNzLWxpc3Rlbi9mc20nCisKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2V2ZW50L2xvb3AnCityZXF1aXJlICdzYXNzLWxpc3Rlbi9ldmVudC9xdWV1ZScKK3JlcXVpcmUgJ3Nhc3MtbGlzdGVuL2V2ZW50L2NvbmZpZycKKworcmVxdWlyZSAnc2Fzcy1saXN0ZW4vbGlzdGVuZXIvY29uZmlnJworCittb2R1bGUgU2Fzc0xpc3RlbgorICBjbGFzcyBMaXN0ZW5lcgorICAgIGluY2x1ZGUgU2Fzc0xpc3Rlbjo6RlNNCisKKyAgICAjIEluaXRpYWxpemVzIHRoZSBkaXJlY3RvcmllcyBsaXN0ZW5lci4KKyAgICAjCisgICAgIyBAcGFyYW0gW1N0cmluZ10gZGlyZWN0b3J5IHRoZSBkaXJlY3RvcmllcyB0byBsaXN0ZW4gdG8KKyAgICAjIEBwYXJhbSBbSGFzaF0gb3B0aW9ucyB0aGUgbGlzdGVuIG9wdGlvbnMgKHNlZSBTYXNzTGlzdGVuOjpMaXN0ZW5lcjo6T3B0aW9ucykKKyAgICAjCisgICAgIyBAeWllbGQgW21vZGlmaWVkLCBhZGRlZCwgcmVtb3ZlZF0gdGhlIGNoYW5nZWQgZmlsZXMKKyAgICAjIEB5aWVsZHBhcmFtIFtBcnJheTxTdHJpbmc+XSBtb2RpZmllZCB0aGUgbGlzdCBvZiBtb2RpZmllZCBmaWxlcworICAgICMgQHlpZWxkcGFyYW0gW0FycmF5PFN0cmluZz5dIGFkZGVkIHRoZSBsaXN0IG9mIGFkZGVkIGZpbGVzCisgICAgIyBAeWllbGRwYXJhbSBbQXJyYXk8U3RyaW5nPl0gcmVtb3ZlZCB0aGUgbGlzdCBvZiByZW1vdmVkIGZpbGVzCisgICAgIworICAgIGRlZiBpbml0aWFsaXplKCpkaXJzLCAmYmxvY2spCisgICAgICBvcHRpb25zID0gZGlycy5sYXN0LmlzX2E/KEhhc2gpID8gZGlycy5wb3AgOiB7fQorCisgICAgICBAY29uZmlnID0gQ29uZmlnLm5ldyhvcHRpb25zKQorCisgICAgICBlcV9jb25maWcgPSBFdmVudDo6UXVldWU6OkNvbmZpZy5uZXcoQGNvbmZpZy5yZWxhdGl2ZT8pCisgICAgICBxdWV1ZSA9IEV2ZW50OjpRdWV1ZS5uZXcoZXFfY29uZmlnKSB7IEBwcm9jZXNzb3Iud2FrZXVwX29uX2V2ZW50IH0KKworICAgICAgc2lsZW5jZXIgPSBTaWxlbmNlci5uZXcKKyAgICAgIHJ1bGVzID0gQGNvbmZpZy5zaWxlbmNlcl9ydWxlcworICAgICAgQHNpbGVuY2VyX2NvbnRyb2xsZXIgPSBTaWxlbmNlcjo6Q29udHJvbGxlci5uZXcoc2lsZW5jZXIsIHJ1bGVzKQorCisgICAgICBAYmFja2VuZCA9IEJhY2tlbmQubmV3KGRpcnMsIHF1ZXVlLCBzaWxlbmNlciwgQGNvbmZpZykKKworICAgICAgb3B0aW1pemVyX2NvbmZpZyA9IFF1ZXVlT3B0aW1pemVyOjpDb25maWcubmV3KEBiYWNrZW5kLCBzaWxlbmNlcikKKworICAgICAgcGNvbmZpZyA9IEV2ZW50OjpDb25maWcubmV3KAorICAgICAgICBzZWxmLAorICAgICAgICBxdWV1ZSwKKyAgICAgICAgUXVldWVPcHRpbWl6ZXIubmV3KG9wdGltaXplcl9jb25maWcpLAorICAgICAgICBAYmFja2VuZC5taW5fZGVsYXlfYmV0d2Vlbl9ldmVudHMsCisgICAgICAgICZibG9jaykKKworICAgICAgQHByb2Nlc3NvciA9IEV2ZW50OjpMb29wLm5ldyhwY29uZmlnKQorCisgICAgICBzdXBlcigpICMgRlNNCisgICAgZW5kCisKKyAgICBkZWZhdWx0X3N0YXRlIDppbml0aWFsaXppbmcKKworICAgIHN0YXRlIDppbml0aWFsaXppbmcsIHRvOiBbOmJhY2tlbmRfc3RhcnRlZCwgOnN0b3BwZWRdCisKKyAgICBzdGF0ZSA6YmFja2VuZF9zdGFydGVkLCB0bzogWzpmcm9udGVuZF9yZWFkeSwgOnN0b3BwZWRdIGRvCisgICAgICBiYWNrZW5kLnN0YXJ0CisgICAgZW5kCisKKyAgICBzdGF0ZSA6ZnJvbnRlbmRfcmVhZHksIHRvOiBbOnByb2Nlc3NpbmdfZXZlbnRzLCA6c3RvcHBlZF0gZG8KKyAgICAgIHByb2Nlc3Nvci5zZXR1cAorICAgIGVuZAorCisgICAgc3RhdGUgOnByb2Nlc3NpbmdfZXZlbnRzLCB0bzogWzpwYXVzZWQsIDpzdG9wcGVkXSBkbworICAgICAgcHJvY2Vzc29yLnJlc3VtZQorICAgIGVuZAorCisgICAgc3RhdGUgOnBhdXNlZCwgdG86IFs6cHJvY2Vzc2luZ19ldmVudHMsIDpzdG9wcGVkXSBkbworICAgICAgcHJvY2Vzc29yLnBhdXNlCisgICAgZW5kCisKKyAgICBzdGF0ZSA6c3RvcHBlZCwgdG86IFs6YmFja2VuZF9zdGFydGVkXSBkbworICAgICAgYmFja2VuZC5zdG9wICMgc2hvdWxkIGJlIGJlZm9yZSBwcm9jZXNzb3IudGVhcmRvd24gdG8gaGFsdCBldmVudHMgQVNBUAorICAgICAgcHJvY2Vzc29yLnRlYXJkb3duCisgICAgZW5kCisKKyAgICAjIFN0YXJ0cyBwcm9jZXNzaW5nIGV2ZW50cyBhbmQgc3RhcnRzIGFkYXB0ZXJzCisgICAgIyBvciByZXN1bWVzIGludm9raW5nIGNhbGxiYWNrcyBpZiBwYXVzZWQKKyAgICBkZWYgc3RhcnQKKyAgICAgIHRyYW5zaXRpb24gOmJhY2tlbmRfc3RhcnRlZCBpZiBzdGF0ZSA9PSA6aW5pdGlhbGl6aW5nCisgICAgICB0cmFuc2l0aW9uIDpmcm9udGVuZF9yZWFkeSBpZiBzdGF0ZSA9PSA6YmFja2VuZF9zdGFydGVkCisgICAgICB0cmFuc2l0aW9uIDpwcm9jZXNzaW5nX2V2ZW50cyBpZiBzdGF0ZSA9PSA6ZnJvbnRlbmRfcmVhZHkKKyAgICAgIHRyYW5zaXRpb24gOnByb2Nlc3NpbmdfZXZlbnRzIGlmIHN0YXRlID09IDpwYXVzZWQKKyAgICBlbmQKKworICAgICMgU3RvcHMgYm90aCBsaXN0ZW5pbmcgZm9yIGV2ZW50cyBhbmQgcHJvY2Vzc2luZyB0aGVtCisgICAgZGVmIHN0b3AKKyAgICAgIHRyYW5zaXRpb24gOnN0b3BwZWQKKyAgICBlbmQKKworICAgICMgU3RvcHMgaW52b2tpbmcgY2FsbGJhY2tzIChtZXNzYWdlcyBwaWxlIHVwKQorICAgIGRlZiBwYXVzZQorICAgICAgdHJhbnNpdGlvbiA6cGF1c2VkCisgICAgZW5kCisKKyAgICAjIHByb2Nlc3NpbmcgbWVhbnMgY2FsbGJhY2tzIGFyZSBjYWxsZWQKKyAgICBkZWYgcHJvY2Vzc2luZz8KKyAgICAgIHN0YXRlID09IDpwcm9jZXNzaW5nX2V2ZW50cworICAgIGVuZAorCisgICAgZGVmIHBhdXNlZD8KKyAgICAgIHN0YXRlID09IDpwYXVzZWQKKyAgICBlbmQKKworICAgIGRlZiBpZ25vcmUocmVnZXhwcykKKyAgICAgIEBzaWxlbmNlcl9jb250cm9sbGVyLmFwcGVuZF9pZ25vcmVzKHJlZ2V4cHMpCisgICAgZW5kCisKKyAgICBkZWYgaWdub3JlIShyZWdleHBzKQorICAgICAgQHNpbGVuY2VyX2NvbnRyb2xsZXIucmVwbGFjZV93aXRoX2JhbmdfaWdub3JlcyhyZWdleHBzKQorICAgIGVuZAorCisgICAgZGVmIG9ubHkocmVnZXhwcykKKyAgICAgIEBzaWxlbmNlcl9jb250cm9sbGVyLnJlcGxhY2Vfd2l0aF9vbmx5KHJlZ2V4cHMpCisgICAgZW5kCisKKyAgICBwcml2YXRlCisKKyAgICBhdHRyX3JlYWRlciA6cHJvY2Vzc29yCisgICAgYXR0cl9yZWFkZXIgOmJhY2tlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9saXN0ZW5lci9jb25maWcucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vbGlzdGVuZXIvY29uZmlnLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWNlNGUKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vbGlzdGVuZXIvY29uZmlnLnJiCkBAIC0wLDAgKzEsNDUgQEAKK21vZHVsZSBTYXNzTGlzdGVuCisgIGNsYXNzIExpc3RlbmVyCisgICAgY2xhc3MgQ29uZmlnCisgICAgICBERUZBVUxUUyA9IHsKKyAgICAgICAgIyBMaXN0ZW5lciBvcHRpb25zCisgICAgICAgIGRlYnVnOiBmYWxzZSwgIyBUT0RPOiBpcyB0aGlzIGJyb2tlbj8KKyAgICAgICAgd2FpdF9mb3JfZGVsYXk6IG5pbCwgIyBOT1RFOiBzaG91bGQgYmUgcHJvdmlkZWQgYnkgYWRhcHRlciBpZiBwb3NzaWJsZQorICAgICAgICByZWxhdGl2ZTogZmFsc2UsCisKKyAgICAgICAgIyBCYWNrZW5kIHNlbGVjdGluZyBvcHRpb25zCisgICAgICAgIGZvcmNlX3BvbGxpbmc6IGZhbHNlLAorICAgICAgICBwb2xsaW5nX2ZhbGxiYWNrX21lc3NhZ2U6IG5pbAorICAgICAgfQorCisgICAgICBkZWYgaW5pdGlhbGl6ZShvcHRzKQorICAgICAgICBAb3B0aW9ucyA9IERFRkFVTFRTLm1lcmdlKG9wdHMpCisgICAgICAgIEByZWxhdGl2ZSA9IEBvcHRpb25zWzpyZWxhdGl2ZV0KKyAgICAgICAgQG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cyA9IEBvcHRpb25zWzp3YWl0X2Zvcl9kZWxheV0KKyAgICAgICAgQHNpbGVuY2VyX3J1bGVzID0gQG9wdGlvbnMgIyBzaWxlbmNlciB3aWxsIGV4dHJhY3Qgd2hhdCBpdCBuZWVkcworICAgICAgZW5kCisKKyAgICAgIGRlZiByZWxhdGl2ZT8KKyAgICAgICAgQHJlbGF0aXZlCisgICAgICBlbmQKKworICAgICAgZGVmIG1pbl9kZWxheV9iZXR3ZWVuX2V2ZW50cworICAgICAgICBAbWluX2RlbGF5X2JldHdlZW5fZXZlbnRzCisgICAgICBlbmQKKworICAgICAgZGVmIHNpbGVuY2VyX3J1bGVzCisgICAgICAgIEBzaWxlbmNlcl9ydWxlcworICAgICAgZW5kCisKKyAgICAgIGRlZiBhZGFwdGVyX2luc3RhbmNlX29wdGlvbnMoa2xhc3MpCisgICAgICAgIHZhbGlkX2tleXMgPSBrbGFzcy5jb25zdF9nZXQoJ0RFRkFVTFRTJykua2V5cworICAgICAgICBIYXNoW0BvcHRpb25zLnNlbGVjdCB7IHxrZXksIF98IHZhbGlkX2tleXMuaW5jbHVkZT8oa2V5KSB9XQorICAgICAgZW5kCisKKyAgICAgIGRlZiBhZGFwdGVyX3NlbGVjdF9vcHRpb25zCisgICAgICAgIHZhbGlkX2tleXMgPSAldyhmb3JjZV9wb2xsaW5nIHBvbGxpbmdfZmFsbGJhY2tfbWVzc2FnZSkubWFwKCY6dG9fc3ltKQorICAgICAgICBIYXNoW0BvcHRpb25zLnNlbGVjdCB7IHxrZXksIF98IHZhbGlkX2tleXMuaW5jbHVkZT8oa2V5KSB9XQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vbG9nZ2VyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2xvZ2dlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJlOGJkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL2xvZ2dlci5yYgpAQCAtMCwwICsxLDMyIEBACittb2R1bGUgU2Fzc0xpc3RlbgorICBkZWYgc2VsZi5sb2dnZXIKKyAgICBAbG9nZ2VyIHx8PSBuaWwKKyAgZW5kCisKKyAgZGVmIHNlbGYubG9nZ2VyPShsb2dnZXIpCisgICAgQGxvZ2dlciA9IGxvZ2dlcgorICBlbmQKKworICBkZWYgc2VsZi5zZXR1cF9kZWZhdWx0X2xvZ2dlcl9pZl91bnNldAorICAgIHNlbGYubG9nZ2VyIHx8PSA6OkxvZ2dlci5uZXcoU1RERVJSKS50YXAgZG8gfGxvZ2dlcnwKKyAgICAgIGRlYnVnZ2luZyA9IEVOVlsnTElTVEVOX0dFTV9ERUJVR0dJTkcnXQorICAgICAgbG9nZ2VyLmxldmVsID0KKyAgICAgICAgY2FzZSBkZWJ1Z2dpbmcudG9fcworICAgICAgICB3aGVuIC8yLworICAgICAgICAgIDo6TG9nZ2VyOjpERUJVRworICAgICAgICB3aGVuIC90cnVlfHllc3wxL2kKKyAgICAgICAgICA6OkxvZ2dlcjo6SU5GTworICAgICAgICBlbHNlCisgICAgICAgICAgOjpMb2dnZXI6OkVSUk9SCisgICAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBMb2dnZXIKKyAgICBbOmZhdGFsLCA6ZXJyb3IsIDp3YXJuLCA6aW5mbywgOmRlYnVnXS5lYWNoIGRvIHxtZXRofAorICAgICAgZGVmaW5lX3NpbmdsZXRvbl9tZXRob2QobWV0aCkgZG8gfCphcmdzLCAmYmxvY2t8CisgICAgICAgIFNhc3NMaXN0ZW4ubG9nZ2VyLnB1YmxpY19zZW5kKG1ldGgsICphcmdzLCAmYmxvY2spIGlmIFNhc3NMaXN0ZW4ubG9nZ2VyCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9vcHRpb25zLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL29wdGlvbnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhMzMyNgotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9vcHRpb25zLnJiCkBAIC0wLDAgKzEsMjMgQEAKK21vZHVsZSBTYXNzTGlzdGVuCisgIGNsYXNzIE9wdGlvbnMKKyAgICBkZWYgaW5pdGlhbGl6ZShvcHRzLCBkZWZhdWx0cykKKyAgICAgIEBvcHRpb25zID0ge30KKyAgICAgIGdpdmVuX29wdGlvbnMgPSBvcHRzLmR1cAorICAgICAgZGVmYXVsdHMua2V5cy5lYWNoIGRvIHxrZXl8CisgICAgICAgIEBvcHRpb25zW2tleV0gPSBnaXZlbl9vcHRpb25zLmRlbGV0ZShrZXkpIHx8IGRlZmF1bHRzW2tleV0KKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gaWYgZ2l2ZW5fb3B0aW9ucy5lbXB0eT8KKworICAgICAgbXNnID0gIlVua25vd24gb3B0aW9uczogI3tnaXZlbl9vcHRpb25zLmluc3BlY3R9IgorICAgICAgU2Fzc0xpc3Rlbjo6TG9nZ2VyLndhcm4gbXNnCisgICAgICBmYWlsIG1zZworICAgIGVuZAorCisgICAgZGVmIG1ldGhvZF9taXNzaW5nKG5hbWUsICpfKQorICAgICAgcmV0dXJuIEBvcHRpb25zW25hbWVdIGlmIEBvcHRpb25zLmtleT8obmFtZSkKKyAgICAgIG1zZyA9ICJCYWQgb3B0aW9uOiAje25hbWUuaW5zcGVjdH0gKHZhbGlkOiN7QG9wdGlvbnMua2V5cy5pbnNwZWN0fSkiCisgICAgICBmYWlsIE5hbWVFcnJvciwgbXNnCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vcXVldWVfb3B0aW1pemVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3F1ZXVlX29wdGltaXplci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTBjNDQzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3F1ZXVlX29wdGltaXplci5yYgpAQCAtMCwwICsxLDEzMiBAQAorbW9kdWxlIFNhc3NMaXN0ZW4KKyAgY2xhc3MgUXVldWVPcHRpbWl6ZXIKKyAgICBjbGFzcyBDb25maWcKKyAgICAgIGRlZiBpbml0aWFsaXplKGFkYXB0ZXJfY2xhc3MsIHNpbGVuY2VyKQorICAgICAgICBAYWRhcHRlcl9jbGFzcyA9IGFkYXB0ZXJfY2xhc3MKKyAgICAgICAgQHNpbGVuY2VyID0gc2lsZW5jZXIKKyAgICAgIGVuZAorCisgICAgICBkZWYgZXhpc3Q/KHBhdGgpCisgICAgICAgIFBhdGhuYW1lKHBhdGgpLmV4aXN0PworICAgICAgZW5kCisKKyAgICAgIGRlZiBzaWxlbmNlZD8ocGF0aCwgdHlwZSkKKyAgICAgICAgQHNpbGVuY2VyLnNpbGVuY2VkPyhwYXRoLCB0eXBlKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBkZWJ1ZygqYXJncywgJmJsb2NrKQorICAgICAgICBTYXNzTGlzdGVuLmxvZ2dlci5kZWJ1ZygqYXJncywgJmJsb2NrKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgc21vb3NoX2NoYW5nZXMoY2hhbmdlcykKKyAgICAgICMgVE9ETzogYWRhcHRlciBjb3VsZCBiZSBuaWwgYXQgdGhpcyBwb2ludCAoc2h1dGRvd24pCisgICAgICBjb29raWVzID0gY2hhbmdlcy5ncm91cF9ieSBkbyB8XywgXywgXywgXywgb3B0aW9uc3wKKyAgICAgICAgKG9wdGlvbnMgfHwge30pWzpjb29raWVdCisgICAgICBlbmQKKyAgICAgIF9zcXVhc2hfY2hhbmdlcyhfcmVpbnRlcnByZXRfcmVsYXRlZF9jaGFuZ2VzKGNvb2tpZXMpKQorICAgIGVuZAorCisgICAgZGVmIGluaXRpYWxpemUoY29uZmlnKQorICAgICAgQGNvbmZpZyA9IGNvbmZpZworICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgYXR0cl9yZWFkZXIgOmNvbmZpZworCisgICAgIyBncm91cHMgY2hhbmdlcyBpbnRvIHRoZSBleHBlY3RlZCBzdHJ1Y3R1cmUgZXhwZWN0ZWQgYnkKKyAgICAjIGNsaWVudHMKKyAgICBkZWYgX3NxdWFzaF9jaGFuZ2VzKGNoYW5nZXMpCisgICAgICAjIFdlIGNvbWJpbmUgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICAgIyBOZXdlciBjbGllbnRzIHNob3VsZCByZWNlaXZlIGRpciBhbmQgcGF0aCBzZXBhcmF0ZWx5CisgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5tYXAgeyB8Y2hhbmdlLCBkaXIsIHBhdGh8IFtjaGFuZ2UsIGRpciArIHBhdGhdIH0KKworICAgICAgYWN0aW9ucyA9IGNoYW5nZXMuZ3JvdXBfYnkoJjpsYXN0KS5tYXAgZG8gfHBhdGgsIGFjdGlvbl9saXN0fAorICAgICAgICBbX2xvZ2ljYWxfYWN0aW9uX2ZvcihwYXRoLCBhY3Rpb25fbGlzdC5tYXAoJjpmaXJzdCkpLCBwYXRoLnRvX3NdCisgICAgICBlbmQKKworICAgICAgY29uZmlnLmRlYnVnKCJsaXN0ZW46IHJhdyBjaGFuZ2VzOiAje2FjdGlvbnMuaW5zcGVjdH0iKQorCisgICAgICB7IG1vZGlmaWVkOiBbXSwgYWRkZWQ6IFtdLCByZW1vdmVkOiBbXSB9LnRhcCBkbyB8c3F1YXNoZWR8CisgICAgICAgIGFjdGlvbnMuZWFjaCBkbyB8dHlwZSwgcGF0aHwKKyAgICAgICAgICBzcXVhc2hlZFt0eXBlXSA8PCBwYXRoIHVubGVzcyB0eXBlLm5pbD8KKyAgICAgICAgZW5kCisgICAgICAgIGNvbmZpZy5kZWJ1ZygibGlzdGVuOiBmaW5hbCBjaGFuZ2VzOiAje3NxdWFzaGVkLmluc3BlY3R9IikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIF9sb2dpY2FsX2FjdGlvbl9mb3IocGF0aCwgYWN0aW9ucykKKyAgICAgIGFjdGlvbnMgPDwgOmFkZGVkIGlmIGFjdGlvbnMuZGVsZXRlKDptb3ZlZF90bykKKyAgICAgIGFjdGlvbnMgPDwgOnJlbW92ZWQgaWYgYWN0aW9ucy5kZWxldGUoOm1vdmVkX2Zyb20pCisKKyAgICAgIG1vZGlmaWVkID0gYWN0aW9ucy5kZXRlY3QgeyB8eHwgeCA9PSA6bW9kaWZpZWQgfQorICAgICAgX2NhbGN1bGF0ZV9hZGRfcmVtb3ZlX2RpZmZlcmVuY2UoYWN0aW9ucywgcGF0aCwgbW9kaWZpZWQpCisgICAgZW5kCisKKyAgICBkZWYgX2NhbGN1bGF0ZV9hZGRfcmVtb3ZlX2RpZmZlcmVuY2UoYWN0aW9ucywgcGF0aCwgZGVmYXVsdF9pZl9leGlzdHMpCisgICAgICBhZGRlZCA9IGFjdGlvbnMuY291bnQgeyB8eHwgeCA9PSA6YWRkZWQgfQorICAgICAgcmVtb3ZlZCA9IGFjdGlvbnMuY291bnQgeyB8eHwgeCA9PSA6cmVtb3ZlZCB9CisgICAgICBkaWZmID0gYWRkZWQgLSByZW1vdmVkCisKKyAgICAgICMgVE9ETzogYXZvaWQgY2hlY2tpbmcgaWYgcGF0aCBleGlzdHMgYW5kIGluc3RlYWQgYXNzdW1lIHRoZSBldmVudHMgYXJlCisgICAgICAjIGluIG9yZGVyIChpZiBsYXN0IGlzIDpyZW1vdmVkLCBpdCBkb2Vzbid0IGV4aXN0LCBldGMuKQorICAgICAgaWYgY29uZmlnLmV4aXN0PyhwYXRoKQorICAgICAgICBpZiBkaWZmID4gMAorICAgICAgICAgIDphZGRlZAorICAgICAgICBlbHNpZiBkaWZmLnplcm8/ICYmIGFkZGVkID4gMAorICAgICAgICAgIDptb2RpZmllZAorICAgICAgICBlbHNlCisgICAgICAgICAgZGVmYXVsdF9pZl9leGlzdHMKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIGRpZmYgPCAwID8gOnJlbW92ZWQgOiBuaWwKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyByZW1vdmUgZXh0cmFuZW91cyByYi1pbm90aWZ5IGV2ZW50cywga2VlcGluZyB0aGVtIG9ubHkgaWYgaXQncyBhIHBvc3NpYmxlCisgICAgIyBlZGl0b3IgcmVuYW1lKCkgY2FsbCAoZS5nLiBLYXRlIGFuZCBTdWJsaW1lKQorICAgIGRlZiBfcmVpbnRlcnByZXRfcmVsYXRlZF9jaGFuZ2VzKGNvb2tpZXMpCisgICAgICB0YWJsZSA9IHsgbW92ZWRfdG86IDphZGRlZCwgbW92ZWRfZnJvbTogOnJlbW92ZWQgfQorICAgICAgY29va2llcy5tYXAgZG8gfF8sIGNoYW5nZXN8CisgICAgICAgIGRhdGEgPSBfZGV0ZWN0X3Bvc3NpYmxlX2VkaXRvcl9zYXZlKGNoYW5nZXMpCisgICAgICAgIGlmIGRhdGEKKyAgICAgICAgICB0b19kaXIsIHRvX2ZpbGUgPSBkYXRhCisgICAgICAgICAgW1s6bW9kaWZpZWQsIHRvX2RpciwgdG9fZmlsZV1dCisgICAgICAgIGVsc2UKKyAgICAgICAgICBub3Rfc2lsZW5jZWQgPSBjaGFuZ2VzLnJlamVjdCBkbyB8dHlwZSwgXywgXywgcGF0aCwgX3wKKyAgICAgICAgICAgIGNvbmZpZy5zaWxlbmNlZD8oUGF0aG5hbWUocGF0aCksIHR5cGUpCisgICAgICAgICAgZW5kCisgICAgICAgICAgbm90X3NpbGVuY2VkLm1hcCBkbyB8XywgY2hhbmdlLCBkaXIsIHBhdGgsIF98CisgICAgICAgICAgICBbdGFibGUuZmV0Y2goY2hhbmdlLCBjaGFuZ2UpLCBkaXIsIHBhdGhdCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kLmZsYXR0ZW4oMSkKKyAgICBlbmQKKworICAgIGRlZiBfZGV0ZWN0X3Bvc3NpYmxlX2VkaXRvcl9zYXZlKGNoYW5nZXMpCisgICAgICByZXR1cm4gdW5sZXNzIGNoYW5nZXMuc2l6ZSA9PSAyCisKKyAgICAgIGZyb21fdHlwZSA9IGZyb21fY2hhbmdlID0gZnJvbSA9IG5pbAorICAgICAgdG9fdHlwZSA9IHRvX2NoYW5nZSA9IHRvX2RpciA9IHRvID0gbmlsCisKKyAgICAgIGNoYW5nZXMuZWFjaCBkbyB8ZGF0YXwKKyAgICAgICAgY2FzZSBkYXRhWzFdCisgICAgICAgIHdoZW4gOm1vdmVkX2Zyb20KKyAgICAgICAgICBmcm9tX3R5cGUsIGZyb21fY2hhbmdlLCBfLCBmcm9tLCBfID0gZGF0YQorICAgICAgICB3aGVuIDptb3ZlZF90bworICAgICAgICAgIHRvX3R5cGUsIHRvX2NoYW5nZSwgdG9fZGlyLCB0bywgXyA9IGRhdGEKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBuaWwKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgcmV0dXJuIHVubGVzcyBmcm9tICYmIHRvCisKKyAgICAgICMgRXhwZWN0IGFuIGlnbm9yZWQgbW92ZWRfZnJvbSBhbmQgbm9uLWlnbm9yZWQgbW92ZWRfdG8KKyAgICAgICMgdG8gcXVhbGlmeSBhcyBhbiAiZWRpdG9yIG1vZGlmeSIKKyAgICAgIHJldHVybiB1bmxlc3MgY29uZmlnLnNpbGVuY2VkPyhQYXRobmFtZShmcm9tKSwgZnJvbV90eXBlKQorICAgICAgY29uZmlnLnNpbGVuY2VkPyhQYXRobmFtZSh0byksIHRvX3R5cGUpID8gbmlsIDogW3RvX2RpciwgdG9dCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vcmVjb3JkLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3JlY29yZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg3NTExCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3JlY29yZC5yYgpAQCAtMCwwICsxLDEyMCBAQAorcmVxdWlyZSAndGhyZWFkJworcmVxdWlyZSAnc2Fzcy1saXN0ZW4vcmVjb3JkL2VudHJ5JworcmVxdWlyZSAnc2Fzcy1saXN0ZW4vcmVjb3JkL3N5bWxpbmtfZGV0ZWN0b3InCisKK21vZHVsZSBTYXNzTGlzdGVuCisgIGNsYXNzIFJlY29yZAorICAgICMgVE9ETzogb25lIFJlY29yZCBvYmplY3QgcGVyIHdhdGNoZWQgZGlyZWN0b3J5PworICAgICMgVE9ETzogZGVwcmVjYXRlCisKKyAgICBhdHRyX3JlYWRlciA6cm9vdAorICAgIGRlZiBpbml0aWFsaXplKGRpcmVjdG9yeSkKKyAgICAgIEB0cmVlID0gX2F1dG9faGFzaAorICAgICAgQHJvb3QgPSBkaXJlY3RvcnkudG9fcworICAgIGVuZAorCisgICAgZGVmIGFkZF9kaXIocmVsX3BhdGgpCisgICAgICByZXR1cm4gaWYgW25pbCwgJycsICcuJ10uaW5jbHVkZT8gcmVsX3BhdGgKKyAgICAgIEB0cmVlW3JlbF9wYXRoXSB8fD0ge30KKyAgICBlbmQKKworICAgIGRlZiB1cGRhdGVfZmlsZShyZWxfcGF0aCwgZGF0YSkKKyAgICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gUGF0aG5hbWUocmVsX3BhdGgpLnNwbGl0Lm1hcCgmOnRvX3MpCisgICAgICBfZmFzdF91cGRhdGVfZmlsZShkaXJuYW1lLCBiYXNlbmFtZSwgZGF0YSkKKyAgICBlbmQKKworICAgIGRlZiB1bnNldF9wYXRoKHJlbF9wYXRoKQorICAgICAgZGlybmFtZSwgYmFzZW5hbWUgPSBQYXRobmFtZShyZWxfcGF0aCkuc3BsaXQubWFwKCY6dG9fcykKKyAgICAgIF9mYXN0X3Vuc2V0X3BhdGgoZGlybmFtZSwgYmFzZW5hbWUpCisgICAgZW5kCisKKyAgICBkZWYgZmlsZV9kYXRhKHJlbF9wYXRoKQorICAgICAgZGlybmFtZSwgYmFzZW5hbWUgPSBQYXRobmFtZShyZWxfcGF0aCkuc3BsaXQubWFwKCY6dG9fcykKKyAgICAgIGlmIFtuaWwsICcnLCAnLiddLmluY2x1ZGU/IGRpcm5hbWUKKyAgICAgICAgdHJlZVtiYXNlbmFtZV0gfHw9IHt9CisgICAgICAgIHRyZWVbYmFzZW5hbWVdLmR1cAorICAgICAgZWxzZQorICAgICAgICB0cmVlW2Rpcm5hbWVdIHx8PSB7fQorICAgICAgICB0cmVlW2Rpcm5hbWVdW2Jhc2VuYW1lXSB8fD0ge30KKyAgICAgICAgdHJlZVtkaXJuYW1lXVtiYXNlbmFtZV0uZHVwCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBkaXJfZW50cmllcyhyZWxfcGF0aCkKKyAgICAgIHN1YnRyZWUgPQorICAgICAgICBpZiBbbmlsLCAnJywgJy4nXS5pbmNsdWRlPyByZWxfcGF0aC50b19zCisgICAgICAgICAgdHJlZQorICAgICAgICBlbHNlCisgICAgICAgICAgdHJlZVtyZWxfcGF0aC50b19zXSB8fD0gX2F1dG9faGFzaAorICAgICAgICAgIHRyZWVbcmVsX3BhdGgudG9fc10KKyAgICAgICAgZW5kCisKKyAgICAgIHJlc3VsdCA9IHt9CisgICAgICBzdWJ0cmVlLmVhY2ggZG8gfGtleSwgdmFsdWVzfAorICAgICAgICAjIG9ubHkgZ2V0IGRhdGEgZm9yIGZpbGUgZW50cmllcworICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlcy5rZXk/KDptdGltZSkgPyB2YWx1ZXMgOiB7fQorICAgICAgZW5kCisgICAgICByZXN1bHQKKyAgICBlbmQKKworICAgIGRlZiBidWlsZAorICAgICAgQHRyZWUgPSBfYXV0b19oYXNoCisgICAgICAjIFRPRE86IHRlc3Qgd2l0aCBhIGZpbGUgbmFtZSBnaXZlbgorICAgICAgIyBUT0RPOiB0ZXN0IG90aGVyIHBlcm1pc3Npb25zCisgICAgICAjIFRPRE86IHRlc3Qgd2l0aCBtaXhlZCBlbmNvZGluZworICAgICAgc3ltbGlua19kZXRlY3RvciA9IFN5bWxpbmtEZXRlY3Rvci5uZXcKKyAgICAgIHJlbWFpbmluZyA9IDo6UXVldWUubmV3CisgICAgICByZW1haW5pbmcgPDwgRW50cnkubmV3KHJvb3QsIG5pbCwgbmlsKQorICAgICAgX2Zhc3RfYnVpbGRfZGlyKHJlbWFpbmluZywgc3ltbGlua19kZXRlY3RvcikgdW50aWwgcmVtYWluaW5nLmVtcHR5PworICAgIGVuZAorCisgICAgcHJpdmF0ZQorCisgICAgZGVmIF9hdXRvX2hhc2gKKyAgICAgIEhhc2gubmV3IHsgfGgsIGt8IGhba10gPSBIYXNoLm5ldyB9CisgICAgZW5kCisKKyAgICBkZWYgdHJlZQorICAgICAgQHRyZWUKKyAgICBlbmQKKworICAgIGRlZiBfZmFzdF91cGRhdGVfZmlsZShkaXJuYW1lLCBiYXNlbmFtZSwgZGF0YSkKKyAgICAgIGlmIFtuaWwsICcnLCAnLiddLmluY2x1ZGU/IGRpcm5hbWUKKyAgICAgICAgdHJlZVtiYXNlbmFtZV0gPSAodHJlZVtiYXNlbmFtZV0gfHwge30pLm1lcmdlKGRhdGEpCisgICAgICBlbHNlCisgICAgICAgIHRyZWVbZGlybmFtZV0gfHw9IHt9CisgICAgICAgIHRyZWVbZGlybmFtZV1bYmFzZW5hbWVdID0gKHRyZWVbZGlybmFtZV1bYmFzZW5hbWVdIHx8IHt9KS5tZXJnZShkYXRhKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgX2Zhc3RfdW5zZXRfcGF0aChkaXJuYW1lLCBiYXNlbmFtZSkKKyAgICAgICMgdGhpcyBtYXkgbmVlZCB0byBiZSByZXdvcmtlZCB0byBwcm9wZXJseSByZW1vdmUKKyAgICAgICMgZW50cmllcyBmcm9tIGEgdHJlZSwgd2l0aG91dCBhZGRpbmcgbm9uLWV4aXN0aW5nIGRpcnMgdG8gdGhlIHJlY29yZAorICAgICAgaWYgW25pbCwgJycsICcuJ10uaW5jbHVkZT8gZGlybmFtZQorICAgICAgICByZXR1cm4gdW5sZXNzIHRyZWUua2V5PyhiYXNlbmFtZSkKKyAgICAgICAgdHJlZS5kZWxldGUoYmFzZW5hbWUpCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiB1bmxlc3MgdHJlZS5rZXk/KGRpcm5hbWUpCisgICAgICAgIHRyZWVbZGlybmFtZV0uZGVsZXRlKGJhc2VuYW1lKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgX2Zhc3RfYnVpbGRfZGlyKHJlbWFpbmluZywgc3ltbGlua19kZXRlY3RvcikKKyAgICAgIGVudHJ5ID0gcmVtYWluaW5nLnBvcAorICAgICAgY2hpbGRyZW4gPSBlbnRyeS5jaGlsZHJlbiAjIE5PVEU6IGNoaWxkcmVuKCkgaW1wbGljaXRseSB0ZXN0cyBpZiBkaXIKKyAgICAgIHN5bWxpbmtfZGV0ZWN0b3IudmVyaWZ5X3Vud2F0Y2hlZCEoZW50cnkpCisgICAgICBjaGlsZHJlbi5lYWNoIHsgfGNoaWxkfCByZW1haW5pbmcgPDwgY2hpbGQgfQorICAgICAgYWRkX2RpcihlbnRyeS5yZWNvcmRfZGlyX2tleSkKKyAgICByZXNjdWUgRXJybm86OkVOT1RESVIKKyAgICAgIF9mYXN0X3RyeV9maWxlKGVudHJ5KQorICAgIHJlc2N1ZSBTeXN0ZW1DYWxsRXJyb3IsIFN5bWxpbmtEZXRlY3Rvcjo6RXJyb3IKKyAgICAgIF9mYXN0X3Vuc2V0X3BhdGgoZW50cnkucmVsYXRpdmUsIGVudHJ5Lm5hbWUpCisgICAgZW5kCisKKyAgICBkZWYgX2Zhc3RfdHJ5X2ZpbGUoZW50cnkpCisgICAgICBfZmFzdF91cGRhdGVfZmlsZShlbnRyeS5yZWxhdGl2ZSwgZW50cnkubmFtZSwgZW50cnkubWV0YSkKKyAgICByZXNjdWUgU3lzdGVtQ2FsbEVycm9yCisgICAgICBfZmFzdF91bnNldF9wYXRoKGVudHJ5LnJlbGF0aXZlLCBlbnRyeS5uYW1lKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3JlY29yZC9lbnRyeS5yYiBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9yZWNvcmQvZW50cnkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhMWM0MQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9yZWNvcmQvZW50cnkucmIKQEAgLTAsMCArMSw2MiBAQAorbW9kdWxlIFNhc3NMaXN0ZW4KKyAgIyBAcHJpdmF0ZSBhcGkKKyAgY2xhc3MgUmVjb3JkCisgICAgIyBSZXByZXNlbnRzIGEgZGlyZWN0b3J5IGVudHJ5IChkaXIgb3IgZmlsZSkKKyAgICBjbGFzcyBFbnRyeQorICAgICAgIyBmaWxlOiAiL2hvbWUvbWUvd2F0Y2hlZF9kaXIiLCAiYXBwL21vZGVscyIsICJmb28ucmIiCisgICAgICAjIGRpciwgIi9ob21lL21lL3dhdGNoZWRfZGlyIiwgIi4iCisgICAgICBkZWYgaW5pdGlhbGl6ZShyb290LCByZWxhdGl2ZSwgbmFtZSA9IG5pbCkKKyAgICAgICAgQHJvb3QsIEByZWxhdGl2ZSwgQG5hbWUgPSByb290LCByZWxhdGl2ZSwgbmFtZQorICAgICAgZW5kCisKKyAgICAgIGF0dHJfcmVhZGVyIDpyb290LCA6cmVsYXRpdmUsIDpuYW1lCisKKyAgICAgIGRlZiBjaGlsZHJlbgorICAgICAgICBjaGlsZF9yZWxhdGl2ZSA9IF9qb2luCisgICAgICAgIChfZW50cmllcyhzeXNfcGF0aCkgLSAldyguIC4uKSkubWFwIGRvIHxuYW1lfAorICAgICAgICAgIEVudHJ5Lm5ldyhAcm9vdCwgY2hpbGRfcmVsYXRpdmUsIG5hbWUpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBtZXRhCisgICAgICAgIGxzdGF0ID0gOjpGaWxlLmxzdGF0KHN5c19wYXRoKQorICAgICAgICB7IG10aW1lOiBsc3RhdC5tdGltZS50b19mLCBtb2RlOiBsc3RhdC5tb2RlIH0KKyAgICAgIGVuZAorCisgICAgICAjIHJlY29yZCBoYXNoIGlzIGUuZy4KKyAgICAgICMgaWYgQHJlY29yZFsiL2hvbWUvbWUvd2F0Y2hlZF9kaXIiXVsicHJvamVjdC9hcHAvbW9kZWxzIl1bImZvby5yYiJdCisgICAgICAjIGlmIEByZWNvcmRbIi9ob21lL21lL3dhdGNoZWRfZGlyIl1bInByb2plY3QvYXBwIl1bIm1vZGVscyJdCisgICAgICAjIHJlY29yZF9kaXJfa2V5IGlzICJwcm9qZWN0L2FwcC9tb2RlbHMiCisgICAgICBkZWYgcmVjb3JkX2Rpcl9rZXkKKyAgICAgICAgOjpGaWxlLmpvaW4oKltAcmVsYXRpdmUsIEBuYW1lXS5jb21wYWN0KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzeXNfcGF0aAorICAgICAgICAjIFVzZSBmdWxsIHBhdGggaW4gY2FzZSBzb21lb25lIHVzZXMgY2hkaXIKKyAgICAgICAgOjpGaWxlLmpvaW4oKltAcm9vdCwgQHJlbGF0aXZlLCBAbmFtZV0uY29tcGFjdCkKKyAgICAgIGVuZAorCisgICAgICBkZWYgcmVhbF9wYXRoCisgICAgICAgIEByZWFsX3BhdGggfHw9IDo6RmlsZS5yZWFscGF0aChzeXNfcGF0aCkKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBfam9pbgorICAgICAgICBhcmdzID0gW0ByZWxhdGl2ZSwgQG5hbWVdLmNvbXBhY3QKKyAgICAgICAgYXJncy5lbXB0eT8gPyBuaWwgOiA6OkZpbGUuam9pbigqYXJncykKKyAgICAgIGVuZAorCisgICAgICBkZWYgX2VudHJpZXMoZGlyKQorICAgICAgICByZXR1cm4gRGlyLmVudHJpZXMoZGlyKSB1bmxlc3MgUlVCWV9FTkdJTkUgPT0gJ2pydWJ5JworCisgICAgICAgICMgSlJ1YnkgaW5jb25zaXN0ZW5jeSB3b3JrYXJvdW5kLCBzZWU6CisgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2pydWJ5L2pydWJ5L2lzc3Vlcy8zODQwCisgICAgICAgIGV4aXN0cyA9IDo6RmlsZS5leGlzdD8oZGlyKQorICAgICAgICBkaXJlY3RvcnkgPSA6OkZpbGUuZGlyZWN0b3J5PyhkaXIpCisgICAgICAgIHJldHVybiBEaXIuZW50cmllcyhkaXIpIHVubGVzcyAoZXhpc3RzICYmICFkaXJlY3RvcnkpCisgICAgICAgIHJhaXNlIEVycm5vOjpFTk9URElSLCBkaXIKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3JlY29yZC9zeW1saW5rX2RldGVjdG9yLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3JlY29yZC9zeW1saW5rX2RldGVjdG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhY2VkMjMKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vcmVjb3JkL3N5bWxpbmtfZGV0ZWN0b3IucmIKQEAgLTAsMCArMSwzOSBAQAorcmVxdWlyZSAnc2V0JworCittb2R1bGUgU2Fzc0xpc3RlbgorICAjIEBwcml2YXRlIGFwaQorICBjbGFzcyBSZWNvcmQKKyAgICBjbGFzcyBTeW1saW5rRGV0ZWN0b3IKKyAgICAgIFdJS0kgPSAnaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3Rlbi93aWtpL0R1cGxpY2F0ZS1kaXJlY3RvcnktZXJyb3JzJworCisgICAgICBTWU1MSU5LX0xPT1BfRVJST1IgPSA8PC1FT1MKKyAgICAgICAgKiogRVJST1I6IGRpcmVjdG9yeSBpcyBhbHJlYWR5IGJlaW5nIHdhdGNoZWQhICoqCisKKyAgICAgICAgRGlyZWN0b3J5OiAlcworCisgICAgICAgIGlzIGFscmVhZHkgYmVpbmcgd2F0Y2hlZCB0aHJvdWdoOiAlcworCisgICAgICAgIE1PUkUgSU5GTzogI3tXSUtJfQorICAgICAgRU9TCisKKyAgICAgIGNsYXNzIEVycm9yIDwgUnVudGltZUVycm9yCisgICAgICBlbmQKKworICAgICAgZGVmIGluaXRpYWxpemUKKyAgICAgICAgQHJlYWxfZGlycyA9IFNldC5uZXcKKyAgICAgIGVuZAorCisgICAgICBkZWYgdmVyaWZ5X3Vud2F0Y2hlZCEoZW50cnkpCisgICAgICAgIHJlYWxfcGF0aCA9IGVudHJ5LnJlYWxfcGF0aAorICAgICAgICBAcmVhbF9kaXJzLmFkZD8ocmVhbF9wYXRoKSB8fCBfZmFpbChlbnRyeS5zeXNfcGF0aCwgcmVhbF9wYXRoKQorICAgICAgZW5kCisKKyAgICAgIHByaXZhdGUKKworICAgICAgZGVmIF9mYWlsKHN5bWxpbmtlZCwgcmVhbF9wYXRoKQorICAgICAgICBTVERFUlIucHV0cyBmb3JtYXQoU1lNTElOS19MT09QX0VSUk9SLCBzeW1saW5rZWQsIHJlYWxfcGF0aCkKKyAgICAgICAgZmFpbCBFcnJvciwgJ0ZhaWxlZCBkdWUgdG8gbG9vcGVkIHN5bWxpbmtzJworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vc2lsZW5jZXIucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vc2lsZW5jZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3MzVmYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9zaWxlbmNlci5yYgpAQCAtMCwwICsxLDk3IEBACittb2R1bGUgU2Fzc0xpc3RlbgorICBjbGFzcyBTaWxlbmNlcgorICAgICMgVGhlIGRlZmF1bHQgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IGdldCBpZ25vcmVkLgorICAgIERFRkFVTFRfSUdOT1JFRF9ESVJFQ1RPUklFUyA9ICVye14oPzoKKyAgICAgIFwuZ2l0CisgICAgICB8IFwuc3ZuCisgICAgICB8IFwuaGcKKyAgICAgIHwgXC5yYngKKyAgICAgIHwgXC5idW5kbGUKKyAgICAgIHwgYnVuZGxlCisgICAgICB8IHZlbmRvci9idW5kbGUKKyAgICAgIHwgbG9nCisgICAgICB8IHRtcAorICAgICAgfHZlbmRvci9ydWJ5CisgICAgKSgvfCQpfXgKKworICAgICMgVGhlIGRlZmF1bHQgbGlzdCBvZiBmaWxlcyB0aGF0IGdldCBpZ25vcmVkLgorICAgIERFRkFVTFRfSUdOT1JFRF9FWFRFTlNJT05TICA9IC8oPzoKKyAgICAgICMgS2F0ZSdzIHRtcFwvc3dwIGZpbGVzCisgICAgICBcLi4qXGQrXC5uZXcKKyAgICAgIHwgXC5rYXRlLXN3cAorCisgICAgICAjIEdlZGl0IHRtcCBmaWxlcworICAgICAgfCBcLmdvdXRwdXRzdHJlYW0tLns2fQorCisgICAgICAjIEludGVsbGlqIGZpbGVzCisgICAgICB8IF9fX2piX2Jha19fXworICAgICAgfCBfX19qYl9vbGRfX18KKworICAgICAgIyBWaW0gc3dhcCBmaWxlcyBhbmQgd3JpdGUgdGVzdAorICAgICAgfCBcLnN3W3B4XQorICAgICAgfCBcLnN3cHgKKyAgICAgIHwgXjQ5MTMKKworICAgICAgIyBTZWQgdGVtcG9yYXJ5IGZpbGVzIC0gYnV0IHdpdGhvdXQgYWN0dWFsIHdvcmRzLCBsaWtlICdzZWRhdGl2ZXMnCisgICAgICB8ICg/Ol4KKyAgICAgICAgIHNlZAorCisgICAgICAgICAoPzoKKyAgICAgICAgICBbYS16QS1aMC05XXswfVtBLVpdezF9W2EtekEtWjAtOV17NX0gfAorICAgICAgICAgIFthLXpBLVowLTldezF9W0EtWl17MX1bYS16QS1aMC05XXs0fSB8CisgICAgICAgICAgW2EtekEtWjAtOV17Mn1bQS1aXXsxfVthLXpBLVowLTldezN9IHwKKyAgICAgICAgICBbYS16QS1aMC05XXszfVtBLVpdezF9W2EtekEtWjAtOV17Mn0gfAorICAgICAgICAgIFthLXpBLVowLTldezR9W0EtWl17MX1bYS16QS1aMC05XXsxfSB8CisgICAgICAgICAgW2EtekEtWjAtOV17NX1bQS1aXXsxfVthLXpBLVowLTldezB9CisgICAgICAgICApCisgICAgICAgICkKKworICAgICAgIyBvdGhlciBmaWxlcworICAgICAgfCBcLkRTX1N0b3JlCisgICAgICB8IFwudG1wCisgICAgICB8IH4KKyAgICApJC94CisKKyAgICBhdHRyX2FjY2Vzc29yIDpvbmx5X3BhdHRlcm5zLCA6aWdub3JlX3BhdHRlcm5zCisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgY29uZmlndXJlKHt9KQorICAgIGVuZAorCisgICAgZGVmIGNvbmZpZ3VyZShvcHRpb25zKQorICAgICAgQG9ubHlfcGF0dGVybnMgPSBvcHRpb25zWzpvbmx5XSA/IEFycmF5KG9wdGlvbnNbOm9ubHldKSA6IG5pbAorICAgICAgQGlnbm9yZV9wYXR0ZXJucyA9IF9pbml0X2lnbm9yZXMob3B0aW9uc1s6aWdub3JlXSwgb3B0aW9uc1s6aWdub3JlIV0pCisgICAgZW5kCisKKyAgICAjIE5vdGU6IHJlbGF0aXZlX3BhdGggaXMgdGVtcG9yYXJpbHkgZXhwZWN0ZWQgdG8gYmUgYSByZWxhdGl2ZSBQYXRobmFtZSB0bworICAgICMgbWFrZSByZWZhY3RvcmluZyBlYXNpZXIgKGlkZWFsbHksIGl0IHdvdWxkIHRha2UgYSBzdHJpbmcpCisKKyAgICAjIFRPRE86IHN3aXRjaCB0eXBlIGFuZCBwYXRoIHBsYWNlcyAtIGFuZCB2ZXJpZnkKKyAgICBkZWYgc2lsZW5jZWQ/KHJlbGF0aXZlX3BhdGgsIHR5cGUpCisgICAgICBwYXRoID0gcmVsYXRpdmVfcGF0aC50b19zCisKKyAgICAgIGlmIG9ubHlfcGF0dGVybnMgJiYgdHlwZSA9PSA6ZmlsZQorICAgICAgICByZXR1cm4gdHJ1ZSB1bmxlc3Mgb25seV9wYXR0ZXJucy5hbnk/IHsgfHBhdHRlcm58IHBhdGggPX4gcGF0dGVybiB9CisgICAgICBlbmQKKworICAgICAgaWdub3JlX3BhdHRlcm5zLmFueT8geyB8cGF0dGVybnwgcGF0aCA9fiBwYXR0ZXJuIH0KKyAgICBlbmQKKworICAgIHByaXZhdGUKKworICAgIGF0dHJfcmVhZGVyIDpvcHRpb25zCisKKyAgICBkZWYgX2luaXRfaWdub3JlcyhpZ25vcmVzLCBvdmVycmlkZXMpCisgICAgICBwYXR0ZXJucyA9IFtdCisgICAgICB1bmxlc3Mgb3ZlcnJpZGVzCisgICAgICAgIHBhdHRlcm5zIDw8IERFRkFVTFRfSUdOT1JFRF9ESVJFQ1RPUklFUworICAgICAgICBwYXR0ZXJucyA8PCBERUZBVUxUX0lHTk9SRURfRVhURU5TSU9OUworICAgICAgZW5kCisKKyAgICAgIHBhdHRlcm5zIDw8IGlnbm9yZXMKKyAgICAgIHBhdHRlcm5zIDw8IG92ZXJyaWRlcworCisgICAgICBwYXR0ZXJucy5jb21wYWN0LmZsYXR0ZW4KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9zaWxlbmNlci9jb250cm9sbGVyLnJiIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3NpbGVuY2VyL2NvbnRyb2xsZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2MmVjOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9nZW1zL3Nhc3MtbGlzdGVuLTQuMC4wL2xpYi9zYXNzLWxpc3Rlbi9zaWxlbmNlci9jb250cm9sbGVyLnJiCkBAIC0wLDAgKzEsNDggQEAKK21vZHVsZSBTYXNzTGlzdGVuCisgIGNsYXNzIFNpbGVuY2VyCisgICAgY2xhc3MgQ29udHJvbGxlcgorICAgICAgZGVmIGluaXRpYWxpemUoc2lsZW5jZXIsIGRlZmF1bHRfb3B0aW9ucykKKyAgICAgICAgQHNpbGVuY2VyID0gc2lsZW5jZXIKKworICAgICAgICBvcHRzID0gZGVmYXVsdF9vcHRpb25zCisKKyAgICAgICAgQHByZXZfc2lsZW5jZXJfb3B0aW9ucyA9IHt9CisgICAgICAgIHJ1bGVzID0gWzpvbmx5LCA6aWdub3JlLCA6aWdub3JlIV0ubWFwIGRvIHxvcHRpb258CisgICAgICAgICAgW29wdGlvbiwgb3B0c1tvcHRpb25dXSBpZiBvcHRzLmtleT8gb3B0aW9uCisgICAgICAgIGVuZAorCisgICAgICAgIF9yZWNvbmZpZ3VyZV9zaWxlbmNlcihIYXNoW3J1bGVzLmNvbXBhY3RdKQorICAgICAgZW5kCisKKyAgICAgIGRlZiBhcHBlbmRfaWdub3JlcygqcmVnZXhwcykKKyAgICAgICAgcHJldl9pZ25vcmVzID0gQXJyYXkoQHByZXZfc2lsZW5jZXJfb3B0aW9uc1s6aWdub3JlXSkKKyAgICAgICAgX3JlY29uZmlndXJlX3NpbGVuY2VyKGlnbm9yZTogW3ByZXZfaWdub3JlcyArIHJlZ2V4cHNdKQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZXBsYWNlX3dpdGhfYmFuZ19pZ25vcmVzKHJlZ2V4cHMpCisgICAgICAgIF9yZWNvbmZpZ3VyZV9zaWxlbmNlcihpZ25vcmUhOiByZWdleHBzKQorICAgICAgZW5kCisKKyAgICAgIGRlZiByZXBsYWNlX3dpdGhfb25seShyZWdleHBzKQorICAgICAgICBfcmVjb25maWd1cmVfc2lsZW5jZXIob25seTogcmVnZXhwcykKKyAgICAgIGVuZAorCisgICAgICBwcml2YXRlCisKKyAgICAgIGRlZiBfcmVjb25maWd1cmVfc2lsZW5jZXIoZXh0cmFfb3B0aW9ucykKKyAgICAgICAgb3B0cyA9IGV4dHJhX29wdGlvbnMuZHVwCisgICAgICAgIG9wdHMgPSBvcHRzLm1hcCBkbyB8a2V5LCB2YWx1ZXwKKyAgICAgICAgICBba2V5LCBBcnJheSh2YWx1ZSkuZmxhdHRlbi5jb21wYWN0XQorICAgICAgICBlbmQKKyAgICAgICAgb3B0cyA9IEhhc2hbb3B0c10KKworICAgICAgICBpZiBvcHRzLmtleT8oOmlnbm9yZSkgJiYgb3B0c1s6aWdub3JlXS5lbXB0eT8KKyAgICAgICAgICBvcHRzLmRlbGV0ZSg6aWdub3JlKQorICAgICAgICBlbmQKKworICAgICAgICBAcHJldl9zaWxlbmNlcl9vcHRpb25zID0gb3B0cworICAgICAgICBAc2lsZW5jZXIuY29uZmlndXJlKEBwcmV2X3NpbGVuY2VyX29wdGlvbnMuZHVwLmZyZWV6ZSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3ZlcnNpb24ucmIgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvZ2Vtcy9zYXNzLWxpc3Rlbi00LjAuMC9saWIvc2Fzcy1saXN0ZW4vdmVyc2lvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWZhNWQwCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL2dlbXMvc2Fzcy1saXN0ZW4tNC4wLjAvbGliL3Nhc3MtbGlzdGVuL3ZlcnNpb24ucmIKQEAgLTAsMCArMSwzIEBACittb2R1bGUgU2Fzc0xpc3RlbgorICBWRVJTSU9OID0gJzQuMC4wJworZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvYWRkcmVzc2FibGUtMi41LjIuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9hZGRyZXNzYWJsZS0yLjUuMi5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWRjMWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvYWRkcmVzc2FibGUtMi41LjIuZ2Vtc3BlYwpAQCAtMCwwICsxLDM5IEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IGFkZHJlc3NhYmxlIDIuNS4yIHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJhZGRyZXNzYWJsZSIuZnJlZXplCisgIHMudmVyc2lvbiA9ICIyLjUuMiIKKworICBzLnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb24gPSBHZW06OlJlcXVpcmVtZW50Lm5ldygiPj0gMCIuZnJlZXplKSBpZiBzLnJlc3BvbmRfdG8/IDpyZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uPQorICBzLnJlcXVpcmVfcGF0aHMgPSBbImxpYiIuZnJlZXplXQorICBzLmF1dGhvcnMgPSBbIkJvYiBBbWFuIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE3LTA4LTI1IgorICBzLmRlc2NyaXB0aW9uID0gIkFkZHJlc3NhYmxlIGlzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBVUkkgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBwYXJ0IG9mXG5SdWJ5J3Mgc3RhbmRhcmQgbGlicmFyeS4gSXQgbW9yZSBjbG9zZWx5IGNvbmZvcm1zIHRvIHRoZSByZWxldmFudCBSRkNzIGFuZFxuYWRkcyBzdXBwb3J0IGZvciBJUklzIGFuZCBVUkkgdGVtcGxhdGVzLlxuIi5mcmVlemUKKyAgcy5lbWFpbCA9ICJib2JAc3Bvcmttb25nZXIuY29tIi5mcmVlemUKKyAgcy5leHRyYV9yZG9jX2ZpbGVzID0gWyJSRUFETUUubWQiLmZyZWV6ZV0KKyAgcy5maWxlcyA9IFsiUkVBRE1FLm1kIi5mcmVlemVdCisgIHMuaG9tZXBhZ2UgPSAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb3JrbW9uZ2VyL2FkZHJlc3NhYmxlIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiQXBhY2hlLTIuMCIuZnJlZXplXQorICBzLnJkb2Nfb3B0aW9ucyA9IFsiLS1tYWluIi5mcmVlemUsICJSRUFETUUubWQiLmZyZWV6ZV0KKyAgcy5yZXF1aXJlZF9ydWJ5X3ZlcnNpb24gPSBHZW06OlJlcXVpcmVtZW50Lm5ldygiPj0gMi4wIi5mcmVlemUpCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiVVJJIEltcGxlbWVudGF0aW9uIi5mcmVlemUKKworICBzLmluc3RhbGxlZF9ieV92ZXJzaW9uID0gIjIuNi4xMSIgaWYgcy5yZXNwb25kX3RvPyA6aW5zdGFsbGVkX2J5X3ZlcnNpb24KKworICBpZiBzLnJlc3BvbmRfdG8/IDpzcGVjaWZpY2F0aW9uX3ZlcnNpb24gdGhlbgorICAgIHMuc3BlY2lmaWNhdGlvbl92ZXJzaW9uID0gNAorCisgICAgaWYgR2VtOjpWZXJzaW9uLm5ldyhHZW06OlZFUlNJT04pID49IEdlbTo6VmVyc2lvbi5uZXcoJzEuMi4wJykgdGhlbgorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPHB1YmxpY19zdWZmaXg+LmZyZWV6ZSwgWyI8IDQuMCIsICI+PSAyLjAuMiJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxidW5kbGVyPi5mcmVlemUsIFsifj4gMS4wIl0pCisgICAgZWxzZQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxwdWJsaWNfc3VmZml4Pi5mcmVlemUsIFsiPCA0LjAiLCAiPj0gMi4wLjIiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgIGVuZAorICBlbHNlCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxwdWJsaWNfc3VmZml4Pi5mcmVlemUsIFsiPCA0LjAiLCAiPj0gMi4wLjIiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyJ+PiAxLjAiXSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9jb2xvcmF0b3ItMS4xLjAuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9jb2xvcmF0b3ItMS4xLjAuZ2Vtc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjg1MTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL2NvbG9yYXRvci0xLjEuMC5nZW1zcGVjCkBAIC0wLDAgKzEsMzQgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyMgc3R1YjogY29sb3JhdG9yIDEuMS4wIHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJjb2xvcmF0b3IiLmZyZWV6ZQorICBzLnZlcnNpb24gPSAiMS4xLjAiCisKKyAgcy5yZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDAiLmZyZWV6ZSkgaWYgcy5yZXNwb25kX3RvPyA6cmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbj0KKyAgcy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiLmZyZWV6ZV0KKyAgcy5hdXRob3JzID0gWyJQYXJrZXIgTW9vcmUiLmZyZWV6ZSwgIkJyYW5kb24gTWF0aGlzIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE2LTA2LTI5IgorICBzLmVtYWlsID0gWyJwYXJrcm1vb3JlQGdtYWlsLmNvbSIuZnJlZXplLCAiYnJhbmRvbkBpbWF0aGlzLmNvbSIuZnJlZXplXQorICBzLmV4dHJhX3Jkb2NfZmlsZXMgPSBbIlJFQURNRS5tYXJrZG93biIuZnJlZXplLCAiTElDRU5TRSIuZnJlZXplXQorICBzLmZpbGVzID0gWyJMSUNFTlNFIi5mcmVlemUsICJSRUFETUUubWFya2Rvd24iLmZyZWV6ZV0KKyAgcy5ob21lcGFnZSA9ICJodHRwczovL2dpdGh1Yi5jb20vb2N0b3ByZXNzL2NvbG9yYXRvciIuZnJlZXplCisgIHMubGljZW5zZXMgPSBbIk1JVCIuZnJlZXplXQorICBzLnJkb2Nfb3B0aW9ucyA9IFsiLS1jaGFyc2V0PVVURi04Ii5mcmVlemVdCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiQ29sb3JpemUgeW91ciB0ZXh0IGluIHRoZSB0ZXJtaW5hbC4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPHJzcGVjPi5mcmVlemUsIFsifj4gMy4xIl0pCisgICAgZWxzZQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyc3BlYz4uZnJlZXplLCBbIn4+IDMuMSJdKQorICAgIGVuZAorICBlbHNlCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyc3BlYz4uZnJlZXplLCBbIn4+IDMuMSJdKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL2ZmaS0xLjkuMTguZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9mZmktMS45LjE4LmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiODRjZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9mZmktMS45LjE4LmdlbXNwZWMKQEAgLTAsMCArMSw0OSBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorIyBzdHViOiBmZmkgMS45LjE4IHJ1YnkgbGliCisjIHN0dWI6IGV4dC9mZmlfYy9leHRjb25mLnJiCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJmZmkiLmZyZWV6ZQorICBzLnZlcnNpb24gPSAiMS45LjE4IgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMucmVxdWlyZV9wYXRocyA9IFsibGliIi5mcmVlemVdCisgIHMuYXV0aG9ycyA9IFsiV2F5bmUgTWVpc3NuZXIiLmZyZWV6ZV0KKyAgcy5kYXRlID0gIjIwMTctMDMtMDMiCisgIHMuZGVzY3JpcHRpb24gPSAiUnVieSBGRkkgbGlicmFyeSIuZnJlZXplCisgIHMuZW1haWwgPSAid21laXNzbmVyQGdtYWlsLmNvbSIuZnJlZXplCisgIHMuZXh0ZW5zaW9ucyA9IFsiZXh0L2ZmaV9jL2V4dGNvbmYucmIiLmZyZWV6ZV0KKyAgcy5maWxlcyA9IFsiZXh0L2ZmaV9jL2V4dGNvbmYucmIiLmZyZWV6ZV0KKyAgcy5ob21lcGFnZSA9ICJodHRwOi8vd2lraS5naXRodWIuY29tL2ZmaS9mZmkiLmZyZWV6ZQorICBzLmxpY2Vuc2VzID0gWyJCU0QtMy1DbGF1c2UiLmZyZWV6ZV0KKyAgcy5yZG9jX29wdGlvbnMgPSBbIi0tZXhjbHVkZT1leHQvZmZpX2MvLipcXC5vJCIuZnJlZXplLCAiLS1leGNsdWRlPWZmaV9jXFwuKGJ1bmRsZXxzbykkIi5mcmVlemVdCisgIHMucmVxdWlyZWRfcnVieV92ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDEuOC43Ii5mcmVlemUpCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiUnVieSBGRkkiLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPHJha2U+LmZyZWV6ZSwgWyJ+PiAxMC4xIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPHJha2UtY29tcGlsZXI+LmZyZWV6ZSwgWyJ+PiAxLjAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cmFrZS1jb21waWxlci1kb2NrPi5mcmVlemUsIFsifj4gMC42LjAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cnNwZWM+LmZyZWV6ZSwgWyJ+PiAyLjE0LjEiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cnVieWdlbXMtdGFza3M+LmZyZWV6ZSwgWyJ+PiAwLjIuNCJdKQorICAgIGVsc2UKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIn4+IDEwLjEiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZS1jb21waWxlcj4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyYWtlLWNvbXBpbGVyLWRvY2s+LmZyZWV6ZSwgWyJ+PiAwLjYuMCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyc3BlYz4uZnJlZXplLCBbIn4+IDIuMTQuMSJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxydWJ5Z2Vtcy10YXNrcz4uZnJlZXplLCBbIn4+IDAuMi40Il0pCisgICAgZW5kCisgIGVsc2UKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJha2U+LmZyZWV6ZSwgWyJ+PiAxMC4xIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyYWtlLWNvbXBpbGVyPi5mcmVlemUsIFsifj4gMS4wIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyYWtlLWNvbXBpbGVyLWRvY2s+LmZyZWV6ZSwgWyJ+PiAwLjYuMCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cnNwZWM+LmZyZWV6ZSwgWyJ+PiAyLjE0LjEiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJ1YnlnZW1zLXRhc2tzPi5mcmVlemUsIFsifj4gMC4yLjQiXSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9mb3J3YXJkYWJsZS1leHRlbmRlZC0yLjYuMC5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL2ZvcndhcmRhYmxlLWV4dGVuZGVkLTIuNi4wLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlZjBkZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9mb3J3YXJkYWJsZS1leHRlbmRlZC0yLjYuMC5nZW1zcGVjCkBAIC0wLDAgKzEsMjAgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyMgc3R1YjogZm9yd2FyZGFibGUtZXh0ZW5kZWQgMi42LjAgcnVieSBsaWIKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lID0gImZvcndhcmRhYmxlLWV4dGVuZGVkIi5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjIuNi4wIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMucmVxdWlyZV9wYXRocyA9IFsibGliIi5mcmVlemVdCisgIHMuYXV0aG9ycyA9IFsiSm9yZG9uIEJlZHdlbGwiLmZyZWV6ZV0KKyAgcy5kYXRlID0gIjIwMTYtMDQtMDYiCisgIHMuZGVzY3JpcHRpb24gPSAiRm9yd2FyZGFibGUgd2l0aCBoYXNoLCBhbmQgaW5zdGFuY2UgdmFyaWFibGUgZXh0ZW5zaW9ucy4iLmZyZWV6ZQorICBzLmVtYWlsID0gWyJqb3Jkb25AZW52eWdlZWtzLmlvIi5mcmVlemVdCisgIHMuaG9tZXBhZ2UgPSAiaHR0cDovL2dpdGh1Yi5jb20vZW52eWdlZWtzL2ZvcndhcmRhYmxlLWV4dGVuZGVkIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiRm9yd2FyZGFibGUgd2l0aCBoYXNoLCBhbmQgaW5zdGFuY2UgdmFyaWFibGUgZXh0ZW5zaW9ucy4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvamVreWxsLTMuNS4yLmdlbXNwZWMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvamVreWxsLTMuNS4yLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExODAwZQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9qZWt5bGwtMy41LjIuZ2Vtc3BlYwpAQCAtMCwwICsxLDY1IEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IGpla3lsbCAzLjUuMiBydWJ5IGxpYgorCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICBzLm5hbWUgPSAiamVreWxsIi5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjMuNS4yIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMucmVxdWlyZV9wYXRocyA9IFsibGliIi5mcmVlemVdCisgIHMuYXV0aG9ycyA9IFsiVG9tIFByZXN0b24tV2VybmVyIi5mcmVlemVdCisgIHMuYmluZGlyID0gImV4ZSIuZnJlZXplCisgIHMuZGF0ZSA9ICIyMDE3LTA4LTEyIgorICBzLmRlc2NyaXB0aW9uID0gIkpla3lsbCBpcyBhIHNpbXBsZSwgYmxvZyBhd2FyZSwgc3RhdGljIHNpdGUgZ2VuZXJhdG9yLiIuZnJlZXplCisgIHMuZW1haWwgPSAidG9tQG1vam9tYm8uY29tIi5mcmVlemUKKyAgcy5leGVjdXRhYmxlcyA9IFsiamVreWxsIi5mcmVlemVdCisgIHMuZXh0cmFfcmRvY19maWxlcyA9IFsiUkVBRE1FLm1hcmtkb3duIi5mcmVlemUsICJMSUNFTlNFIi5mcmVlemVdCisgIHMuZmlsZXMgPSBbIkxJQ0VOU0UiLmZyZWV6ZSwgIlJFQURNRS5tYXJrZG93biIuZnJlZXplLCAiZXhlL2pla3lsbCIuZnJlZXplXQorICBzLmhvbWVwYWdlID0gImh0dHBzOi8vZ2l0aHViLmNvbS9qZWt5bGwvamVreWxsIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucmRvY19vcHRpb25zID0gWyItLWNoYXJzZXQ9VVRGLTgiLmZyZWV6ZV0KKyAgcy5yZXF1aXJlZF9ydWJ5X3ZlcnNpb24gPSBHZW06OlJlcXVpcmVtZW50Lm5ldygiPj0gMi4wLjAiLmZyZWV6ZSkKKyAgcy5ydWJ5Z2Vtc192ZXJzaW9uID0gIjIuNi4xMSIuZnJlZXplCisgIHMuc3VtbWFyeSA9ICJBIHNpbXBsZSwgYmxvZyBhd2FyZSwgc3RhdGljIHNpdGUgZ2VuZXJhdG9yLiIuZnJlZXplCisKKyAgcy5pbnN0YWxsZWRfYnlfdmVyc2lvbiA9ICIyLjYuMTEiIGlmIHMucmVzcG9uZF90bz8gOmluc3RhbGxlZF9ieV92ZXJzaW9uCisKKyAgaWYgcy5yZXNwb25kX3RvPyA6c3BlY2lmaWNhdGlvbl92ZXJzaW9uIHRoZW4KKyAgICBzLnNwZWNpZmljYXRpb25fdmVyc2lvbiA9IDIKKworICAgIGlmIEdlbTo6VmVyc2lvbi5uZXcoR2VtOjpWRVJTSU9OKSA+PSBHZW06OlZlcnNpb24ubmV3KCcxLjIuMCcpIHRoZW4KKyAgICAgIHMuYWRkX3J1bnRpbWVfZGVwZW5kZW5jeSglcTxhZGRyZXNzYWJsZT4uZnJlZXplLCBbIn4+IDIuNCJdKQorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPGNvbG9yYXRvcj4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPGpla3lsbC1zYXNzLWNvbnZlcnRlcj4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPGpla3lsbC13YXRjaD4uZnJlZXplLCBbIn4+IDEuMSJdKQorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPGtyYW1kb3duPi5mcmVlemUsIFsifj4gMS4zIl0pCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8bGlxdWlkPi5mcmVlemUsIFsifj4gNC4wIl0pCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8bWVyY2VuYXJ5Pi5mcmVlemUsIFsifj4gMC4zLjMiXSkKKyAgICAgIHMuYWRkX3J1bnRpbWVfZGVwZW5kZW5jeSglcTxwYXRodXRpbD4uZnJlZXplLCBbIn4+IDAuOSJdKQorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPHJvdWdlPi5mcmVlemUsIFsifj4gMS43Il0pCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8c2FmZV95YW1sPi5mcmVlemUsIFsifj4gMS4wIl0pCisgICAgZWxzZQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxhZGRyZXNzYWJsZT4uZnJlZXplLCBbIn4+IDIuNCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxjb2xvcmF0b3I+LmZyZWV6ZSwgWyJ+PiAxLjAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8amVreWxsLXNhc3MtY29udmVydGVyPi5mcmVlemUsIFsifj4gMS4wIl0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGpla3lsbC13YXRjaD4uZnJlZXplLCBbIn4+IDEuMSJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxrcmFtZG93bj4uZnJlZXplLCBbIn4+IDEuMyJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxsaXF1aWQ+LmZyZWV6ZSwgWyJ+PiA0LjAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8bWVyY2VuYXJ5Pi5mcmVlemUsIFsifj4gMC4zLjMiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cGF0aHV0aWw+LmZyZWV6ZSwgWyJ+PiAwLjkiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cm91Z2U+LmZyZWV6ZSwgWyJ+PiAxLjciXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8c2FmZV95YW1sPi5mcmVlemUsIFsifj4gMS4wIl0pCisgICAgZW5kCisgIGVsc2UKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGFkZHJlc3NhYmxlPi5mcmVlemUsIFsifj4gMi40Il0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxjb2xvcmF0b3I+LmZyZWV6ZSwgWyJ+PiAxLjAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGpla3lsbC1zYXNzLWNvbnZlcnRlcj4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8amVreWxsLXdhdGNoPi5mcmVlemUsIFsifj4gMS4xIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxrcmFtZG93bj4uZnJlZXplLCBbIn4+IDEuMyJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8bGlxdWlkPi5mcmVlemUsIFsifj4gNC4wIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxtZXJjZW5hcnk+LmZyZWV6ZSwgWyJ+PiAwLjMuMyJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cGF0aHV0aWw+LmZyZWV6ZSwgWyJ+PiAwLjkiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJvdWdlPi5mcmVlemUsIFsifj4gMS43Il0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxzYWZlX3lhbWw+LmZyZWV6ZSwgWyJ+PiAxLjAiXSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9qZWt5bGwtZmVlZC0wLjkuMi5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL2pla3lsbC1mZWVkLTAuOS4yLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhZmFiNAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9qZWt5bGwtZmVlZC0wLjkuMi5nZW1zcGVjCkBAIC0wLDAgKzEsNDkgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyMgc3R1YjogamVreWxsLWZlZWQgMC45LjIgcnVieSBsaWIKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lID0gImpla3lsbC1mZWVkIi5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjAuOS4yIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMucmVxdWlyZV9wYXRocyA9IFsibGliIi5mcmVlemVdCisgIHMuYXV0aG9ycyA9IFsiQmVuIEJhbHRlciIuZnJlZXplXQorICBzLmRhdGUgPSAiMjAxNy0wMy0yOCIKKyAgcy5lbWFpbCA9IFsiYmVuLmJhbHRlckBnaXRodWIuY29tIi5mcmVlemVdCisgIHMuaG9tZXBhZ2UgPSAiaHR0cHM6Ly9naXRodWIuY29tL2pla3lsbC9qZWt5bGwtZmVlZCIuZnJlZXplCisgIHMubGljZW5zZXMgPSBbIk1JVCIuZnJlZXplXQorICBzLnJ1YnlnZW1zX3ZlcnNpb24gPSAiMi42LjExIi5mcmVlemUKKyAgcy5zdW1tYXJ5ID0gIkEgSmVreWxsIHBsdWdpbiB0byBnZW5lcmF0ZSBhbiBBdG9tIGZlZWQgb2YgeW91ciBKZWt5bGwgcG9zdHMiLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8amVreWxsPi5mcmVlemUsIFsifj4gMy4zIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyJ+PiAxLjYiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIn4+IDEwLjAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cnNwZWM+LmZyZWV6ZSwgWyJ+PiAzLjAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8dHlwaG9ldXM+LmZyZWV6ZSwgWyJ+PiAwLjciXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8bm9rb2dpcmk+LmZyZWV6ZSwgWyJ+PiAxLjYiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cnVib2NvcD4uZnJlZXplLCBbIj49IDAiXSkKKyAgICBlbHNlCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGpla3lsbD4uZnJlZXplLCBbIn4+IDMuMyJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxidW5kbGVyPi5mcmVlemUsIFsifj4gMS42Il0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJha2U+LmZyZWV6ZSwgWyJ+PiAxMC4wIl0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJzcGVjPi5mcmVlemUsIFsifj4gMy4wIl0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHR5cGhvZXVzPi5mcmVlemUsIFsifj4gMC43Il0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPG5va29naXJpPi5mcmVlemUsIFsifj4gMS42Il0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJ1Ym9jb3A+LmZyZWV6ZSwgWyI+PSAwIl0pCisgICAgZW5kCisgIGVsc2UKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGpla3lsbD4uZnJlZXplLCBbIn4+IDMuMyJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuNiJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIn4+IDEwLjAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJzcGVjPi5mcmVlemUsIFsifj4gMy4wIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTx0eXBob2V1cz4uZnJlZXplLCBbIn4+IDAuNyJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8bm9rb2dpcmk+LmZyZWV6ZSwgWyJ+PiAxLjYiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJ1Ym9jb3A+LmZyZWV6ZSwgWyI+PSAwIl0pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wLmdlbXNwZWMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvamVreWxsLXNhc3MtY29udmVydGVyLTEuNS4wLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkYWY4NAotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9qZWt5bGwtc2Fzcy1jb252ZXJ0ZXItMS41LjAuZ2Vtc3BlYwpAQCAtMCwwICsxLDQzIEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IGpla3lsbC1zYXNzLWNvbnZlcnRlciAxLjUuMCBydWJ5IGxpYgorCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICBzLm5hbWUgPSAiamVreWxsLXNhc3MtY29udmVydGVyIi5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjEuNS4wIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMucmVxdWlyZV9wYXRocyA9IFsibGliIi5mcmVlemVdCisgIHMuYXV0aG9ycyA9IFsiUGFya2VyIE1vb3JlIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE2LTExLTE0IgorICBzLmVtYWlsID0gWyJwYXJrcm1vb3JlQGdtYWlsLmNvbSIuZnJlZXplXQorICBzLmhvbWVwYWdlID0gImh0dHBzOi8vZ2l0aHViLmNvbS9qZWt5bGwvamVreWxsLXNhc3MtY29udmVydGVyIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiQSBiYXNpYyBTYXNzIGNvbnZlcnRlciBmb3IgSmVreWxsLiIuZnJlZXplCisKKyAgcy5pbnN0YWxsZWRfYnlfdmVyc2lvbiA9ICIyLjYuMTEiIGlmIHMucmVzcG9uZF90bz8gOmluc3RhbGxlZF9ieV92ZXJzaW9uCisKKyAgaWYgcy5yZXNwb25kX3RvPyA6c3BlY2lmaWNhdGlvbl92ZXJzaW9uIHRoZW4KKyAgICBzLnNwZWNpZmljYXRpb25fdmVyc2lvbiA9IDQKKworICAgIGlmIEdlbTo6VmVyc2lvbi5uZXcoR2VtOjpWRVJTSU9OKSA+PSBHZW06OlZlcnNpb24ubmV3KCcxLjIuMCcpIHRoZW4KKyAgICAgIHMuYWRkX3J1bnRpbWVfZGVwZW5kZW5jeSglcTxzYXNzPi5mcmVlemUsIFsifj4gMy40Il0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyJ+PiAxLjUiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cnNwZWM+LmZyZWV6ZSwgWyI+PSAwIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPGpla3lsbD4uZnJlZXplLCBbIj49IDIuMCJdKQorICAgIGVsc2UKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8c2Fzcz4uZnJlZXplLCBbIn4+IDMuNCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxidW5kbGVyPi5mcmVlemUsIFsifj4gMS41Il0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJha2U+LmZyZWV6ZSwgWyI+PSAwIl0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJzcGVjPi5mcmVlemUsIFsiPj0gMCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxqZWt5bGw+LmZyZWV6ZSwgWyI+PSAyLjAiXSkKKyAgICBlbmQKKyAgZWxzZQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8c2Fzcz4uZnJlZXplLCBbIn4+IDMuNCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuNSJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJzcGVjPi5mcmVlemUsIFsiPj0gMCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8amVreWxsPi5mcmVlemUsIFsiPj0gMi4wIl0pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvamVreWxsLXdhdGNoLTEuNS4wLmdlbXNwZWMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvamVreWxsLXdhdGNoLTEuNS4wLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhNDBlOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9qZWt5bGwtd2F0Y2gtMS41LjAuZ2Vtc3BlYwpAQCAtMCwwICsxLDQ2IEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IGpla3lsbC13YXRjaCAxLjUuMCBydWJ5IGxpYgorCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICBzLm5hbWUgPSAiamVreWxsLXdhdGNoIi5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjEuNS4wIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMucmVxdWlyZV9wYXRocyA9IFsibGliIi5mcmVlemVdCisgIHMuYXV0aG9ycyA9IFsiUGFya2VyIE1vb3JlIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE2LTA3LTIwIgorICBzLmVtYWlsID0gWyJwYXJrcm1vb3JlQGdtYWlsLmNvbSIuZnJlZXplXQorICBzLmhvbWVwYWdlID0gImh0dHBzOi8vZ2l0aHViLmNvbS9qZWt5bGwvamVreWxsLXdhdGNoIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiUmVidWlsZCB5b3VyIEpla3lsbCBzaXRlIHdoZW4gYSBmaWxlIGNoYW5nZXMgd2l0aCB0aGUgYC0td2F0Y2hgIHN3aXRjaC4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8bGlzdGVuPi5mcmVlemUsIFsiPCAzLjEiLCAifj4gMy4wIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyJ+PiAxLjYiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cnVib2NvcD4uZnJlZXplLCBbIn4+IDAuMzUuMSJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxyYWtlPi5mcmVlemUsIFsiPj0gMCJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxyc3BlYz4uZnJlZXplLCBbIn4+IDMuMCJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxqZWt5bGw+LmZyZWV6ZSwgWyI+PSAyLjAiXSkKKyAgICBlbHNlCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGxpc3Rlbj4uZnJlZXplLCBbIjwgMy4xIiwgIn4+IDMuMCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxidW5kbGVyPi5mcmVlemUsIFsifj4gMS42Il0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJ1Ym9jb3A+LmZyZWV6ZSwgWyJ+PiAwLjM1LjEiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cnNwZWM+LmZyZWV6ZSwgWyJ+PiAzLjAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8amVreWxsPi5mcmVlemUsIFsiPj0gMi4wIl0pCisgICAgZW5kCisgIGVsc2UKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGxpc3Rlbj4uZnJlZXplLCBbIjwgMy4xIiwgIn4+IDMuMCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuNiJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cnVib2NvcD4uZnJlZXplLCBbIn4+IDAuMzUuMSJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJzcGVjPi5mcmVlemUsIFsifj4gMy4wIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxqZWt5bGw+LmZyZWV6ZSwgWyI+PSAyLjAiXSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9rcmFtZG93bi0xLjE0LjAuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9rcmFtZG93bi0xLjE0LjAuZ2Vtc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVmMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL2tyYW1kb3duLTEuMTQuMC5nZW1zcGVjCkBAIC0wLDAgKzEsNTYgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyMgc3R1Yjoga3JhbWRvd24gMS4xNC4wIHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJrcmFtZG93biIuZnJlZXplCisgIHMudmVyc2lvbiA9ICIxLjE0LjAiCisKKyAgcy5yZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDAiLmZyZWV6ZSkgaWYgcy5yZXNwb25kX3RvPyA6cmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbj0KKyAgcy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiLmZyZWV6ZV0KKyAgcy5hdXRob3JzID0gWyJUaG9tYXMgTGVpdG5lciIuZnJlZXplXQorICBzLmRhdGUgPSAiMjAxNy0wNi0yNiIKKyAgcy5kZXNjcmlwdGlvbiA9ICJrcmFtZG93biBpcyB5ZXQtYW5vdGhlci1tYXJrZG93bi1wYXJzZXIgYnV0IGZhc3QsIHB1cmUgUnVieSxcbnVzaW5nIGEgc3RyaWN0IHN5bnRheCBkZWZpbml0aW9uIGFuZCBzdXBwb3J0aW5nIHNldmVyYWwgY29tbW9uIGV4dGVuc2lvbnMuXG4iLmZyZWV6ZQorICBzLmVtYWlsID0gInRfbGVpdG5lckBnbXguYXQiLmZyZWV6ZQorICBzLmV4ZWN1dGFibGVzID0gWyJrcmFtZG93biIuZnJlZXplXQorICBzLmZpbGVzID0gWyJiaW4va3JhbWRvd24iLmZyZWV6ZV0KKyAgcy5ob21lcGFnZSA9ICJodHRwOi8va3JhbWRvd24uZ2V0dGFsb25nLm9yZyIuZnJlZXplCisgIHMubGljZW5zZXMgPSBbIk1JVCIuZnJlZXplXQorICBzLnJkb2Nfb3B0aW9ucyA9IFsiLS1tYWluIi5mcmVlemUsICJsaWIva3JhbWRvd24vZG9jdW1lbnQucmIiLmZyZWV6ZV0KKyAgcy5ydWJ5Z2Vtc192ZXJzaW9uID0gIjIuNi4xMSIuZnJlZXplCisgIHMuc3VtbWFyeSA9ICJrcmFtZG93biBpcyBhIGZhc3QsIHB1cmUtUnVieSBNYXJrZG93bi1zdXBlcnNldCBjb252ZXJ0ZXIuIi5mcmVlemUKKworICBzLmluc3RhbGxlZF9ieV92ZXJzaW9uID0gIjIuNi4xMSIgaWYgcy5yZXNwb25kX3RvPyA6aW5zdGFsbGVkX2J5X3ZlcnNpb24KKworICBpZiBzLnJlc3BvbmRfdG8/IDpzcGVjaWZpY2F0aW9uX3ZlcnNpb24gdGhlbgorICAgIHMuc3BlY2lmaWNhdGlvbl92ZXJzaW9uID0gNAorCisgICAgaWYgR2VtOjpWZXJzaW9uLm5ldyhHZW06OlZFUlNJT04pID49IEdlbTo6VmVyc2lvbi5uZXcoJzEuMi4wJykgdGhlbgorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxtaW5pdGVzdD4uZnJlZXplLCBbIn4+IDUuMCJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxjb2RlcmF5Pi5mcmVlemUsIFsifj4gMS4wLjAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cm91Z2U+LmZyZWV6ZSwgWyJ+PiAxLjgiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8c3RyaW5nZXg+LmZyZWV6ZSwgWyJ+PiAxLjUuMSJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxwcmF3bj4uZnJlZXplLCBbIn4+IDIuMCJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxwcmF3bi10YWJsZT4uZnJlZXplLCBbIn4+IDAuMi4yIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPHJpdGV4Pi5mcmVlemUsIFsifj4gMS4wIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPGl0ZXh0b21tbD4uZnJlZXplLCBbIn4+IDEuNSJdKQorICAgIGVsc2UKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8bWluaXRlc3Q+LmZyZWV6ZSwgWyJ+PiA1LjAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8Y29kZXJheT4uZnJlZXplLCBbIn4+IDEuMC4wIl0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJvdWdlPi5mcmVlemUsIFsifj4gMS44Il0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHN0cmluZ2V4Pi5mcmVlemUsIFsifj4gMS41LjEiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cHJhd24+LmZyZWV6ZSwgWyJ+PiAyLjAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cHJhd24tdGFibGU+LmZyZWV6ZSwgWyJ+PiAwLjIuMiJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyaXRleD4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxpdGV4dG9tbWw+LmZyZWV6ZSwgWyJ+PiAxLjUiXSkKKyAgICBlbmQKKyAgZWxzZQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8bWluaXRlc3Q+LmZyZWV6ZSwgWyJ+PiA1LjAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGNvZGVyYXk+LmZyZWV6ZSwgWyJ+PiAxLjAuMCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cm91Z2U+LmZyZWV6ZSwgWyJ+PiAxLjgiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHN0cmluZ2V4Pi5mcmVlemUsIFsifj4gMS41LjEiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHByYXduPi5mcmVlemUsIFsifj4gMi4wIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxwcmF3bi10YWJsZT4uZnJlZXplLCBbIn4+IDAuMi4yIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyaXRleD4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8aXRleHRvbW1sPi5mcmVlemUsIFsifj4gMS41Il0pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvbGlxdWlkLTQuMC4wLmdlbXNwZWMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvbGlxdWlkLTQuMC4wLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiYmVmYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9saXF1aWQtNC4wLjAuZ2Vtc3BlYwpAQCAtMCwwICsxLDM3IEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IGxpcXVpZCA0LjAuMCBydWJ5IGxpYgorCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICBzLm5hbWUgPSAibGlxdWlkIi5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjQuMC4wIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAxLjMuNyIuZnJlZXplKSBpZiBzLnJlc3BvbmRfdG8/IDpyZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uPQorICBzLnJlcXVpcmVfcGF0aHMgPSBbImxpYiIuZnJlZXplXQorICBzLmF1dGhvcnMgPSBbIlRvYmlhcyBMXHUwMEZDdGtlIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE2LTEyLTE0IgorICBzLmVtYWlsID0gWyJ0b2JpQGxlZXRzb2Z0LmNvbSIuZnJlZXplXQorICBzLmV4dHJhX3Jkb2NfZmlsZXMgPSBbIkhpc3RvcnkubWQiLmZyZWV6ZSwgIlJFQURNRS5tZCIuZnJlZXplXQorICBzLmZpbGVzID0gWyJIaXN0b3J5Lm1kIi5mcmVlemUsICJSRUFETUUubWQiLmZyZWV6ZV0KKyAgcy5ob21lcGFnZSA9ICJodHRwOi8vd3d3LmxpcXVpZG1hcmt1cC5vcmciLmZyZWV6ZQorICBzLmxpY2Vuc2VzID0gWyJNSVQiLmZyZWV6ZV0KKyAgcy5yZXF1aXJlZF9ydWJ5X3ZlcnNpb24gPSBHZW06OlJlcXVpcmVtZW50Lm5ldygiPj0gMi4xLjAiLmZyZWV6ZSkKKyAgcy5ydWJ5Z2Vtc192ZXJzaW9uID0gIjIuNi4xMSIuZnJlZXplCisgIHMuc3VtbWFyeSA9ICJBIHNlY3VyZSwgbm9uLWV2YWxpbmcgZW5kIHVzZXIgdGVtcGxhdGUgZW5naW5lIHdpdGggYWVzdGhldGljIG1hcmt1cC4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPHJha2U+LmZyZWV6ZSwgWyJ+PiAxMS4zIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPG1pbml0ZXN0Pi5mcmVlemUsIFsiPj0gMCJdKQorICAgIGVsc2UKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIn4+IDExLjMiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8bWluaXRlc3Q+LmZyZWV6ZSwgWyI+PSAwIl0pCisgICAgZW5kCisgIGVsc2UKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJha2U+LmZyZWV6ZSwgWyJ+PiAxMS4zIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxtaW5pdGVzdD4uZnJlZXplLCBbIj49IDAiXSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9saXN0ZW4tMy4wLjguZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9saXN0ZW4tMy4wLjguZ2Vtc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2IwMGZhCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL2xpc3Rlbi0zLjAuOC5nZW1zcGVjCkBAIC0wLDAgKzEsNDEgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyMgc3R1YjogbGlzdGVuIDMuMC44IHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJsaXN0ZW4iLmZyZWV6ZQorICBzLnZlcnNpb24gPSAiMy4wLjgiCisKKyAgcy5yZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDAiLmZyZWV6ZSkgaWYgcy5yZXNwb25kX3RvPyA6cmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbj0KKyAgcy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiLmZyZWV6ZV0KKyAgcy5hdXRob3JzID0gWyJUaGliYXVkIEd1aWxsYXVtZS1HZW50aWwiLmZyZWV6ZV0KKyAgcy5kYXRlID0gIjIwMTYtMDUtMTgiCisgIHMuZGVzY3JpcHRpb24gPSAiVGhlIExpc3RlbiBnZW0gbGlzdGVucyB0byBmaWxlIG1vZGlmaWNhdGlvbnMgYW5kIG5vdGlmaWVzIHlvdSBhYm91dCB0aGUgY2hhbmdlcy4gV29ya3MgZXZlcnl3aGVyZSEiLmZyZWV6ZQorICBzLmVtYWlsID0gInRoaWJhdWRAdGhpYmF1ZC5nZyIuZnJlZXplCisgIHMuZXhlY3V0YWJsZXMgPSBbImxpc3RlbiIuZnJlZXplXQorICBzLmZpbGVzID0gWyJiaW4vbGlzdGVuIi5mcmVlemVdCisgIHMuaG9tZXBhZ2UgPSAiaHR0cHM6Ly9naXRodWIuY29tL2d1YXJkL2xpc3RlbiIuZnJlZXplCisgIHMubGljZW5zZXMgPSBbIk1JVCIuZnJlZXplXQorICBzLnJlcXVpcmVkX3J1YnlfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAxLjkuMyIuZnJlZXplKQorICBzLnJ1YnlnZW1zX3ZlcnNpb24gPSAiMi42LjExIi5mcmVlemUKKyAgcy5zdW1tYXJ5ID0gIkxpc3RlbiB0byBmaWxlIG1vZGlmaWNhdGlvbnMiLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8cmItZnNldmVudD4uZnJlZXplLCBbIj49IDAuOS40IiwgIn4+IDAuOSJdKQorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPHJiLWlub3RpZnk+LmZyZWV6ZSwgWyI+PSAwLjkuNyIsICJ+PiAwLjkiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIj49IDEuMy41Il0pCisgICAgZWxzZQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyYi1mc2V2ZW50Pi5mcmVlemUsIFsiPj0gMC45LjQiLCAifj4gMC45Il0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJiLWlub3RpZnk+LmZyZWV6ZSwgWyI+PSAwLjkuNyIsICJ+PiAwLjkiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIj49IDEuMy41Il0pCisgICAgZW5kCisgIGVsc2UKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJiLWZzZXZlbnQ+LmZyZWV6ZSwgWyI+PSAwLjkuNCIsICJ+PiAwLjkiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJiLWlub3RpZnk+LmZyZWV6ZSwgWyI+PSAwLjkuNyIsICJ+PiAwLjkiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyI+PSAxLjMuNSJdKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL21lcmNlbmFyeS0wLjMuNi5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL21lcmNlbmFyeS0wLjMuNi5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTRmNzYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvbWVyY2VuYXJ5LTAuMy42LmdlbXNwZWMKQEAgLTAsMCArMSwzOCBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorIyBzdHViOiBtZXJjZW5hcnkgMC4zLjYgcnVieSBsaWIKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lID0gIm1lcmNlbmFyeSIuZnJlZXplCisgIHMudmVyc2lvbiA9ICIwLjMuNiIKKworICBzLnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb24gPSBHZW06OlJlcXVpcmVtZW50Lm5ldygiPj0gMCIuZnJlZXplKSBpZiBzLnJlc3BvbmRfdG8/IDpyZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uPQorICBzLnJlcXVpcmVfcGF0aHMgPSBbImxpYiIuZnJlZXplXQorICBzLmF1dGhvcnMgPSBbIlRvbSBQcmVzdG9uLVdlcm5lciIuZnJlZXplLCAiUGFya2VyIE1vb3JlIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE2LTA0LTA4IgorICBzLmRlc2NyaXB0aW9uID0gIkxpZ2h0d2VpZ2h0IGFuZCBmbGV4aWJsZSBsaWJyYXJ5IGZvciB3cml0aW5nIGNvbW1hbmQtbGluZSBhcHBzIGluIFJ1YnkuIi5mcmVlemUKKyAgcy5lbWFpbCA9IFsidG9tQG1vam9tYm8uY29tIi5mcmVlemUsICJwYXJrcm1vb3JlQGdtYWlsLmNvbSIuZnJlZXplXQorICBzLmhvbWVwYWdlID0gImh0dHBzOi8vZ2l0aHViLmNvbS9qZWt5bGwvbWVyY2VuYXJ5Ii5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiTGlnaHR3ZWlnaHQgYW5kIGZsZXhpYmxlIGxpYnJhcnkgZm9yIHdyaXRpbmcgY29tbWFuZC1saW5lIGFwcHMgaW4gUnVieS4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyJ+PiAxLjMiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cnNwZWM+LmZyZWV6ZSwgWyJ+PiAzLjAiXSkKKyAgICBlbHNlCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyJ+PiAxLjMiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cnNwZWM+LmZyZWV6ZSwgWyJ+PiAzLjAiXSkKKyAgICBlbmQKKyAgZWxzZQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuMyJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJzcGVjPi5mcmVlemUsIFsifj4gMy4wIl0pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvbWluaW1hLTIuMS4xLmdlbXNwZWMgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvbWluaW1hLTIuMS4xLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyMjIxOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9taW5pbWEtMi4xLjEuZ2Vtc3BlYwpAQCAtMCwwICsxLDM2IEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IG1pbmltYSAyLjEuMSBydWJ5IGxpYgorCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICBzLm5hbWUgPSAibWluaW1hIi5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjIuMS4xIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMubWV0YWRhdGEgPSB7ICJwbHVnaW5fdHlwZSIgPT4gInRoZW1lIiB9IGlmIHMucmVzcG9uZF90bz8gOm1ldGFkYXRhPQorICBzLnJlcXVpcmVfcGF0aHMgPSBbImxpYiIuZnJlZXplXQorICBzLmF1dGhvcnMgPSBbIkpvZWwgR2xvdmllciIuZnJlZXplXQorICBzLmJpbmRpciA9ICJleGUiLmZyZWV6ZQorICBzLmRhdGUgPSAiMjAxNy0wNC0xMyIKKyAgcy5lbWFpbCA9IFsiamdsb3ZpZXJAZ2l0aHViLmNvbSIuZnJlZXplXQorICBzLmhvbWVwYWdlID0gImh0dHBzOi8vZ2l0aHViLmNvbS9qZWt5bGwvbWluaW1hIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiQSBiZWF1dGlmdWwsIG1pbmltYWwgdGhlbWUgZm9yIEpla3lsbC4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8amVreWxsPi5mcmVlemUsIFsifj4gMy4zIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyJ+PiAxLjEyIl0pCisgICAgZWxzZQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxqZWt5bGw+LmZyZWV6ZSwgWyJ+PiAzLjMiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuMTIiXSkKKyAgICBlbmQKKyAgZWxzZQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8amVreWxsPi5mcmVlemUsIFsifj4gMy4zIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxidW5kbGVyPi5mcmVlemUsIFsifj4gMS4xMiJdKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL3BhdGh1dGlsLTAuMTQuMC5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL3BhdGh1dGlsLTAuMTQuMC5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzQ5MmYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvcGF0aHV0aWwtMC4xNC4wLmdlbXNwZWMKQEAgLTAsMCArMSwzMiBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorIyBzdHViOiBwYXRodXRpbCAwLjE0LjAgcnVieSBsaWIKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lID0gInBhdGh1dGlsIi5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjAuMTQuMCIKKworICBzLnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb24gPSBHZW06OlJlcXVpcmVtZW50Lm5ldygiPj0gMCIuZnJlZXplKSBpZiBzLnJlc3BvbmRfdG8/IDpyZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uPQorICBzLnJlcXVpcmVfcGF0aHMgPSBbImxpYiIuZnJlZXplXQorICBzLmF1dGhvcnMgPSBbIkpvcmRvbiBCZWR3ZWxsIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE2LTA1LTE5IgorICBzLmRlc2NyaXB0aW9uID0gIkxpa2UgUGF0aG5hbWUgYnV0IGEgbGl0dGxlIGxlc3MgaW5zYW5lLiIuZnJlZXplCisgIHMuZW1haWwgPSBbImpvcmRvbkBlbnZ5Z2Vla3MuaW8iLmZyZWV6ZV0KKyAgcy5ob21lcGFnZSA9ICJodHRwOi8vZ2l0aHViLmNvbS9lbnZ5Z2Vla3MvcGF0aHV0aWxzIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiQWxtb3N0IGxpa2UgUGF0aG5hbWUgYnV0IGp1c3QgYSBsaXR0bGUgbGVzcyBpbnNhbmUuIi5mcmVlemUKKworICBzLmluc3RhbGxlZF9ieV92ZXJzaW9uID0gIjIuNi4xMSIgaWYgcy5yZXNwb25kX3RvPyA6aW5zdGFsbGVkX2J5X3ZlcnNpb24KKworICBpZiBzLnJlc3BvbmRfdG8/IDpzcGVjaWZpY2F0aW9uX3ZlcnNpb24gdGhlbgorICAgIHMuc3BlY2lmaWNhdGlvbl92ZXJzaW9uID0gNAorCisgICAgaWYgR2VtOjpWZXJzaW9uLm5ldyhHZW06OlZFUlNJT04pID49IEdlbTo6VmVyc2lvbi5uZXcoJzEuMi4wJykgdGhlbgorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPGZvcndhcmRhYmxlLWV4dGVuZGVkPi5mcmVlemUsIFsifj4gMi42Il0pCisgICAgZWxzZQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxmb3J3YXJkYWJsZS1leHRlbmRlZD4uZnJlZXplLCBbIn4+IDIuNiJdKQorICAgIGVuZAorICBlbHNlCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxmb3J3YXJkYWJsZS1leHRlbmRlZD4uZnJlZXplLCBbIn4+IDIuNiJdKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL3B1YmxpY19zdWZmaXgtMy4wLjAuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9wdWJsaWNfc3VmZml4LTMuMC4wLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmNDRiOQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9wdWJsaWNfc3VmZml4LTMuMC4wLmdlbXNwZWMKQEAgLTAsMCArMSw0MSBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorIyBzdHViOiBwdWJsaWNfc3VmZml4IDMuMC4wIHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJwdWJsaWNfc3VmZml4Ii5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjMuMC4wIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMucmVxdWlyZV9wYXRocyA9IFsibGliIi5mcmVlemVdCisgIHMuYXV0aG9ycyA9IFsiU2ltb25lIENhcmxldHRpIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE3LTA4LTA0IgorICBzLmRlc2NyaXB0aW9uID0gIlB1YmxpY1N1ZmZpeCBjYW4gcGFyc2UgYW5kIGRlY29tcG9zZSBhIGRvbWFpbiBuYW1lIGludG8gdG9wIGxldmVsIGRvbWFpbiwgZG9tYWluIGFuZCBzdWJkb21haW5zLiIuZnJlZXplCisgIHMuZW1haWwgPSBbIndlcHBvc0B3ZXBwb3MubmV0Ii5mcmVlemVdCisgIHMuZXh0cmFfcmRvY19maWxlcyA9IFsiTElDRU5TRS50eHQiLmZyZWV6ZV0KKyAgcy5maWxlcyA9IFsiTElDRU5TRS50eHQiLmZyZWV6ZV0KKyAgcy5ob21lcGFnZSA9ICJodHRwczovL3NpbW9uZWNhcmxldHRpLmNvbS9jb2RlL3B1YmxpY3N1ZmZpeC1ydWJ5Ii5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucmVxdWlyZWRfcnVieV92ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDIuMSIuZnJlZXplKQorICBzLnJ1YnlnZW1zX3ZlcnNpb24gPSAiMi42LjExIi5mcmVlemUKKyAgcy5zdW1tYXJ5ID0gIkRvbWFpbiBuYW1lIHBhcnNlciBiYXNlZCBvbiB0aGUgUHVibGljIFN1ZmZpeCBMaXN0LiIuZnJlZXplCisKKyAgcy5pbnN0YWxsZWRfYnlfdmVyc2lvbiA9ICIyLjYuMTEiIGlmIHMucmVzcG9uZF90bz8gOmluc3RhbGxlZF9ieV92ZXJzaW9uCisKKyAgaWYgcy5yZXNwb25kX3RvPyA6c3BlY2lmaWNhdGlvbl92ZXJzaW9uIHRoZW4KKyAgICBzLnNwZWNpZmljYXRpb25fdmVyc2lvbiA9IDQKKworICAgIGlmIEdlbTo6VmVyc2lvbi5uZXcoR2VtOjpWRVJTSU9OKSA+PSBHZW06OlZlcnNpb24ubmV3KCcxLjIuMCcpIHRoZW4KKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8bW9jaGE+LmZyZWV6ZSwgWyI+PSAwIl0pCisgICAgICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5KCVxPHlhcmQ+LmZyZWV6ZSwgWyI+PSAwIl0pCisgICAgZWxzZQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyYWtlPi5mcmVlemUsIFsiPj0gMCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxtb2NoYT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8eWFyZD4uZnJlZXplLCBbIj49IDAiXSkKKyAgICBlbmQKKyAgZWxzZQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmFrZT4uZnJlZXplLCBbIj49IDAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPG1vY2hhPi5mcmVlemUsIFsiPj0gMCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8eWFyZD4uZnJlZXplLCBbIj49IDAiXSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9yYi1mc2V2ZW50LTAuMTAuMi5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL3JiLWZzZXZlbnQtMC4xMC4yLmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhY2YxNQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9yYi1mc2V2ZW50LTAuMTAuMi5nZW1zcGVjCkBAIC0wLDAgKzEsNDIgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyMgc3R1YjogcmItZnNldmVudCAwLjEwLjIgcnVieSBsaWIKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lID0gInJiLWZzZXZlbnQiLmZyZWV6ZQorICBzLnZlcnNpb24gPSAiMC4xMC4yIgorCisgIHMucmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAwIi5mcmVlemUpIGlmIHMucmVzcG9uZF90bz8gOnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb249CisgIHMubWV0YWRhdGEgPSB7ICJzb3VyY2VfY29kZV91cmkiID0+ICJodHRwczovL2dpdGh1Yi5jb20vdGhpYmF1ZGdnL3JiLWZzZXZlbnQiIH0gaWYgcy5yZXNwb25kX3RvPyA6bWV0YWRhdGE9CisgIHMucmVxdWlyZV9wYXRocyA9IFsibGliIi5mcmVlemVdCisgIHMuYXV0aG9ycyA9IFsiVGhpYmF1ZCBHdWlsbGF1bWUtR2VudGlsIi5mcmVlemUsICJUcmF2aXMgVGlsbGV5Ii5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE3LTA3LTAxIgorICBzLmRlc2NyaXB0aW9uID0gIkZTRXZlbnRzIEFQSSB3aXRoIFNpZ25hbHMgY2F0Y2hpbmcgKHdpdGhvdXQgUnVieUNvY29hKSIuZnJlZXplCisgIHMuZW1haWwgPSBbInRoaWJhdWRAdGhpYmF1ZC5nZyIuZnJlZXplLCAidHRpbGxleUBnbWFpbC5jb20iLmZyZWV6ZV0KKyAgcy5ob21lcGFnZSA9ICJodHRwOi8vcnVieWdlbXMub3JnL2dlbXMvcmItZnNldmVudCIuZnJlZXplCisgIHMubGljZW5zZXMgPSBbIk1JVCIuZnJlZXplXQorICBzLnJ1YnlnZW1zX3ZlcnNpb24gPSAiMi42LjExIi5mcmVlemUKKyAgcy5zdW1tYXJ5ID0gIlZlcnkgc2ltcGxlICYgdXNhYmxlIEZTRXZlbnRzIEFQSSIuZnJlZXplCisKKyAgcy5pbnN0YWxsZWRfYnlfdmVyc2lvbiA9ICIyLjYuMTEiIGlmIHMucmVzcG9uZF90bz8gOmluc3RhbGxlZF9ieV92ZXJzaW9uCisKKyAgaWYgcy5yZXNwb25kX3RvPyA6c3BlY2lmaWNhdGlvbl92ZXJzaW9uIHRoZW4KKyAgICBzLnNwZWNpZmljYXRpb25fdmVyc2lvbiA9IDQKKworICAgIGlmIEdlbTo6VmVyc2lvbi5uZXcoR2VtOjpWRVJTSU9OKSA+PSBHZW06OlZlcnNpb24ubmV3KCcxLjIuMCcpIHRoZW4KKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxyc3BlYz4uZnJlZXplLCBbIn4+IDMuNiJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxndWFyZC1yc3BlYz4uZnJlZXplLCBbIn4+IDQuMiJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxyYWtlPi5mcmVlemUsIFsifj4gMTIuMCJdKQorICAgIGVsc2UKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuMCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyc3BlYz4uZnJlZXplLCBbIn4+IDMuNiJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxndWFyZC1yc3BlYz4uZnJlZXplLCBbIn4+IDQuMiJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyYWtlPi5mcmVlemUsIFsifj4gMTIuMCJdKQorICAgIGVuZAorICBlbHNlCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxidW5kbGVyPi5mcmVlemUsIFsifj4gMS4wIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyc3BlYz4uZnJlZXplLCBbIn4+IDMuNiJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8Z3VhcmQtcnNwZWM+LmZyZWV6ZSwgWyJ+PiA0LjIiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJha2U+LmZyZWV6ZSwgWyJ+PiAxMi4wIl0pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvcmItaW5vdGlmeS0wLjkuMTAuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9yYi1pbm90aWZ5LTAuOS4xMC5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTQ5NWQKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvcmItaW5vdGlmeS0wLjkuMTAuZ2Vtc3BlYwpAQCAtMCwwICsxLDQwIEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IHJiLWlub3RpZnkgMC45LjEwIHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJyYi1pbm90aWZ5Ii5mcmVlemUKKyAgcy52ZXJzaW9uID0gIjAuOS4xMCIKKworICBzLnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb24gPSBHZW06OlJlcXVpcmVtZW50Lm5ldygiPj0gMCIuZnJlZXplKSBpZiBzLnJlc3BvbmRfdG8/IDpyZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uPQorICBzLnJlcXVpcmVfcGF0aHMgPSBbImxpYiIuZnJlZXplXQorICBzLmF1dGhvcnMgPSBbIk5hdGFsaWUgV2VpemVuYmF1bSIuZnJlZXplLCAiU2FtdWVsIFdpbGxpYW1zIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE3LTA2LTE3IgorICBzLmVtYWlsID0gWyJuZXgzNDJAZ21haWwuY29tIi5mcmVlemUsICJzYW11ZWwud2lsbGlhbXNAb3Jpb250cmFuc2Zlci5jby5ueiIuZnJlZXplXQorICBzLmhvbWVwYWdlID0gImh0dHBzOi8vZ2l0aHViLmNvbS9ndWFyZC9yYi1pbm90aWZ5Ii5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiQSBSdWJ5IHdyYXBwZXIgZm9yIExpbnV4IGlub3RpZnksIHVzaW5nIEZGSSIuZnJlZXplCisKKyAgcy5pbnN0YWxsZWRfYnlfdmVyc2lvbiA9ICIyLjYuMTEiIGlmIHMucmVzcG9uZF90bz8gOmluc3RhbGxlZF9ieV92ZXJzaW9uCisKKyAgaWYgcy5yZXNwb25kX3RvPyA6c3BlY2lmaWNhdGlvbl92ZXJzaW9uIHRoZW4KKyAgICBzLnNwZWNpZmljYXRpb25fdmVyc2lvbiA9IDQKKworICAgIGlmIEdlbTo6VmVyc2lvbi5uZXcoR2VtOjpWRVJTSU9OKSA+PSBHZW06OlZlcnNpb24ubmV3KCcxLjIuMCcpIHRoZW4KKyAgICAgIHMuYWRkX3J1bnRpbWVfZGVwZW5kZW5jeSglcTxmZmk+LmZyZWV6ZSwgWyI8IDIiLCAiPj0gMC41LjAiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8cnNwZWM+LmZyZWV6ZSwgWyJ+PiAzLjQiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIn4+IDEuMyJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxyYWtlPi5mcmVlemUsIFsiPCAxMyIsICI+PSAxMC41LjAiXSkKKyAgICBlbHNlCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGZmaT4uZnJlZXplLCBbIjwgMiIsICI+PSAwLjUuMCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyc3BlYz4uZnJlZXplLCBbIn4+IDMuNCJdKQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxidW5kbGVyPi5mcmVlemUsIFsifj4gMS4zIl0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJha2U+LmZyZWV6ZSwgWyI8IDEzIiwgIj49IDEwLjUuMCJdKQorICAgIGVuZAorICBlbHNlCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxmZmk+LmZyZWV6ZSwgWyI8IDIiLCAiPj0gMC41LjAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJzcGVjPi5mcmVlemUsIFsifj4gMy40Il0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxidW5kbGVyPi5mcmVlemUsIFsifj4gMS4zIl0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyYWtlPi5mcmVlemUsIFsiPCAxMyIsICI+PSAxMC41LjAiXSkKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9yb3VnZS0xLjExLjEuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9yb3VnZS0xLjExLjEuZ2Vtc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2NmNjlkCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL3JvdWdlLTEuMTEuMS5nZW1zcGVjCkBAIC0wLDAgKzEsMjMgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyMgc3R1Yjogcm91Z2UgMS4xMS4xIHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJyb3VnZSIuZnJlZXplCisgIHMudmVyc2lvbiA9ICIxLjExLjEiCisKKyAgcy5yZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDAiLmZyZWV6ZSkgaWYgcy5yZXNwb25kX3RvPyA6cmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbj0KKyAgcy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiLmZyZWV6ZV0KKyAgcy5hdXRob3JzID0gWyJKZWFuaW5lIEFka2lzc29uIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE2LTA2LTE0IgorICBzLmRlc2NyaXB0aW9uID0gIlJvdWdlIGFpbXMgdG8gYSBiZSBhIHNpbXBsZSwgZWFzeS10by1leHRlbmQgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgcHlnbWVudHMuIi5mcmVlemUKKyAgcy5lbWFpbCA9IFsiam5lZW5Aam5lZW4ubmV0Ii5mcmVlemVdCisgIHMuZXhlY3V0YWJsZXMgPSBbInJvdWdpZnkiLmZyZWV6ZV0KKyAgcy5maWxlcyA9IFsiYmluL3JvdWdpZnkiLmZyZWV6ZV0KKyAgcy5ob21lcGFnZSA9ICJodHRwOi8vcm91Z2Uuam5lZW4ubmV0LyIuZnJlZXplCisgIHMubGljZW5zZXMgPSBbIk1JVCwgMi1jbGF1c2UgQlNEIi5mcmVlemVdCisgIHMucnVieWZvcmdlX3Byb2plY3QgPSAicm91Z2UiLmZyZWV6ZQorICBzLnJ1YnlnZW1zX3ZlcnNpb24gPSAiMi42LjExIi5mcmVlemUKKyAgcy5zdW1tYXJ5ID0gIkEgcHVyZS1ydWJ5IGNvbG9yaXplciBiYXNlZCBvbiBweWdtZW50cyIuZnJlZXplCisKKyAgcy5pbnN0YWxsZWRfYnlfdmVyc2lvbiA9ICIyLjYuMTEiIGlmIHMucmVzcG9uZF90bz8gOmluc3RhbGxlZF9ieV92ZXJzaW9uCitlbmQKZGlmZiAtLWdpdCBhL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9zYWZlX3lhbWwtMS4wLjQuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9zYWZlX3lhbWwtMS4wLjQuZ2Vtc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI2ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL3NhZmVfeWFtbC0xLjAuNC5nZW1zcGVjCkBAIC0wLDAgKzEsMjMgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyMgc3R1Yjogc2FmZV95YW1sIDEuMC40IHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJzYWZlX3lhbWwiLmZyZWV6ZQorICBzLnZlcnNpb24gPSAiMS4wLjQiCisKKyAgcy5yZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDAiLmZyZWV6ZSkgaWYgcy5yZXNwb25kX3RvPyA6cmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbj0KKyAgcy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiLmZyZWV6ZV0KKyAgcy5hdXRob3JzID0gWyJEYW4gVGFvIi5mcmVlemVdCisgIHMuZGF0ZSA9ICIyMDE0LTA5LTI4IgorICBzLmRlc2NyaXB0aW9uID0gIlBhcnNlIFlBTUwgc2FmZWx5Ii5mcmVlemUKKyAgcy5lbWFpbCA9ICJkYW5pZWwudGFvQGdtYWlsLmNvbSIuZnJlZXplCisgIHMuZXhlY3V0YWJsZXMgPSBbInNhZmVfeWFtbCIuZnJlZXplXQorICBzLmZpbGVzID0gWyJiaW4vc2FmZV95YW1sIi5mcmVlemVdCisgIHMuaG9tZXBhZ2UgPSAiaHR0cHM6Ly9naXRodWIuY29tL2R0YW8vc2FmZV95YW1sIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucmVxdWlyZWRfcnVieV92ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDEuOC43Ii5mcmVlemUpCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiU2FtZVlBTUwgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgWUFNTC5sb2FkIHN1aXRhYmxlIGZvciBhY2NlcHRpbmcgdXNlciBpbnB1dCBpbiBSdWJ5IGFwcGxpY2F0aW9ucy4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvc2Fzcy0zLjUuMS5nZW1zcGVjIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL3Nhc3MtMy41LjEuZ2Vtc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2I2ZTMzCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2J1bmRsZS9ydWJ5LzIuNC4wL3NwZWNpZmljYXRpb25zL3Nhc3MtMy41LjEuZ2Vtc3BlYwpAQCAtMCwwICsxLDQ1IEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IHNhc3MgMy41LjEgcnVieSBsaWIKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lID0gInNhc3MiLmZyZWV6ZQorICBzLnZlcnNpb24gPSAiMy41LjEiCisKKyAgcy5yZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDAiLmZyZWV6ZSkgaWYgcy5yZXNwb25kX3RvPyA6cmVxdWlyZWRfcnVieWdlbXNfdmVyc2lvbj0KKyAgcy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiLmZyZWV6ZV0KKyAgcy5hdXRob3JzID0gWyJOYXRhbGllIFdlaXplbmJhdW0iLmZyZWV6ZSwgIkNocmlzIEVwcHN0ZWluIi5mcmVlemUsICJIYW1wdG9uIENhdGxpbiIuZnJlZXplXQorICBzLmRhdGUgPSAiMjAxNy0wNy0xMyIKKyAgcy5kZXNjcmlwdGlvbiA9ICIgICAgICBTYXNzIG1ha2VzIENTUyBmdW4gYWdhaW4uIFNhc3MgaXMgYW4gZXh0ZW5zaW9uIG9mIENTUywgYWRkaW5nXG4gICAgICBuZXN0ZWQgcnVsZXMsIHZhcmlhYmxlcywgbWl4aW5zLCBzZWxlY3RvciBpbmhlcml0YW5jZSwgYW5kIG1vcmUuXG4gICAgICBJdCdzIHRyYW5zbGF0ZWQgdG8gd2VsbC1mb3JtYXR0ZWQsIHN0YW5kYXJkIENTUyB1c2luZyB0aGVcbiAgICAgIGNvbW1hbmQgbGluZSB0b29sIG9yIGEgd2ViLWZyYW1ld29yayBwbHVnaW4uXG4iLmZyZWV6ZQorICBzLmVtYWlsID0gInNhc3MtbGFuZ0Bnb29nbGVncm91cHMuY29tIi5mcmVlemUKKyAgcy5leGVjdXRhYmxlcyA9IFsic2FzcyIuZnJlZXplLCAic2Fzcy1jb252ZXJ0Ii5mcmVlemUsICJzY3NzIi5mcmVlemVdCisgIHMuZmlsZXMgPSBbImJpbi9zYXNzIi5mcmVlemUsICJiaW4vc2Fzcy1jb252ZXJ0Ii5mcmVlemUsICJiaW4vc2NzcyIuZnJlZXplXQorICBzLmhvbWVwYWdlID0gImh0dHA6Ly9zYXNzLWxhbmcuY29tLyIuZnJlZXplCisgIHMubGljZW5zZXMgPSBbIk1JVCIuZnJlZXplXQorICBzLnJlcXVpcmVkX3J1YnlfdmVyc2lvbiA9IEdlbTo6UmVxdWlyZW1lbnQubmV3KCI+PSAyLjAuMCIuZnJlZXplKQorICBzLnJ1Ynlmb3JnZV9wcm9qZWN0ID0gInNhc3MiLmZyZWV6ZQorICBzLnJ1YnlnZW1zX3ZlcnNpb24gPSAiMi42LjExIi5mcmVlemUKKyAgcy5zdW1tYXJ5ID0gIkEgcG93ZXJmdWwgYnV0IGVsZWdhbnQgQ1NTIGNvbXBpbGVyIHRoYXQgbWFrZXMgQ1NTIGZ1biBhZ2Fpbi4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8c2Fzcy1saXN0ZW4+LmZyZWV6ZSwgWyJ+PiA0LjAuMCJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTx5YXJkPi5mcmVlemUsIFsifj4gMC44LjcuNiJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxyZWRjYXJwZXQ+LmZyZWV6ZSwgWyJ+PiAyLjMuMCJdKQorICAgICAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSglcTxtaW5pdGVzdD4uZnJlZXplLCBbIj49IDUiXSkKKyAgICBlbHNlCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHNhc3MtbGlzdGVuPi5mcmVlemUsIFsifj4gNC4wLjAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8eWFyZD4uZnJlZXplLCBbIn4+IDAuOC43LjYiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8cmVkY2FycGV0Pi5mcmVlemUsIFsifj4gMi4zLjAiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8bWluaXRlc3Q+LmZyZWV6ZSwgWyI+PSA1Il0pCisgICAgZW5kCisgIGVsc2UKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHNhc3MtbGlzdGVuPi5mcmVlemUsIFsifj4gNC4wLjAiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHlhcmQ+LmZyZWV6ZSwgWyJ+PiAwLjguNy42Il0pCisgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyZWRjYXJwZXQ+LmZyZWV6ZSwgWyJ+PiAyLjMuMCJdKQorICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8bWluaXRlc3Q+LmZyZWV6ZSwgWyI+PSA1Il0pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvc2Fzcy1saXN0ZW4tNC4wLjAuZ2Vtc3BlYyBiL3ZlbmRvci9idW5kbGUvcnVieS8yLjQuMC9zcGVjaWZpY2F0aW9ucy9zYXNzLWxpc3Rlbi00LjAuMC5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTEzNzEKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvYnVuZGxlL3J1YnkvMi40LjAvc3BlY2lmaWNhdGlvbnMvc2Fzcy1saXN0ZW4tNC4wLjAuZ2Vtc3BlYwpAQCAtMCwwICsxLDM5IEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCisjIHN0dWI6IHNhc3MtbGlzdGVuIDQuMC4wIHJ1YnkgbGliCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSA9ICJzYXNzLWxpc3RlbiIuZnJlZXplCisgIHMudmVyc2lvbiA9ICI0LjAuMCIKKworICBzLnJlcXVpcmVkX3J1YnlnZW1zX3ZlcnNpb24gPSBHZW06OlJlcXVpcmVtZW50Lm5ldygiPj0gMCIuZnJlZXplKSBpZiBzLnJlc3BvbmRfdG8/IDpyZXF1aXJlZF9ydWJ5Z2Vtc192ZXJzaW9uPQorICBzLnJlcXVpcmVfcGF0aHMgPSBbImxpYiIuZnJlZXplXQorICBzLmF1dGhvcnMgPSBbIlRoaWJhdWQgR3VpbGxhdW1lLUdlbnRpbCIuZnJlZXplXQorICBzLmRhdGUgPSAiMjAxNy0wNy0xMyIKKyAgcy5kZXNjcmlwdGlvbiA9ICJUaGlzIGZvcmsgb2YgZ3VhcmQvbGlzdGVuIHByb3ZpZGVzIGEgc3RhYmxlIEFQSSBmb3IgdXNlcnMgb2YgdGhlIHJ1YnkgU2FzcyBDTEkiLmZyZWV6ZQorICBzLmVtYWlsID0gInRoaWJhdWRAdGhpYmF1ZC5nZyIuZnJlZXplCisgIHMuaG9tZXBhZ2UgPSAiaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlzdGVuIi5mcmVlemUKKyAgcy5saWNlbnNlcyA9IFsiTUlUIi5mcmVlemVdCisgIHMucmVxdWlyZWRfcnVieV92ZXJzaW9uID0gR2VtOjpSZXF1aXJlbWVudC5uZXcoIj49IDEuOS4zIi5mcmVlemUpCisgIHMucnVieWdlbXNfdmVyc2lvbiA9ICIyLjYuMTEiLmZyZWV6ZQorICBzLnN1bW1hcnkgPSAiRm9yayBvZiBndWFyZC9saXN0ZW4iLmZyZWV6ZQorCisgIHMuaW5zdGFsbGVkX2J5X3ZlcnNpb24gPSAiMi42LjExIiBpZiBzLnJlc3BvbmRfdG8/IDppbnN0YWxsZWRfYnlfdmVyc2lvbgorCisgIGlmIHMucmVzcG9uZF90bz8gOnNwZWNpZmljYXRpb25fdmVyc2lvbiB0aGVuCisgICAgcy5zcGVjaWZpY2F0aW9uX3ZlcnNpb24gPSA0CisKKyAgICBpZiBHZW06OlZlcnNpb24ubmV3KEdlbTo6VkVSU0lPTikgPj0gR2VtOjpWZXJzaW9uLm5ldygnMS4yLjAnKSB0aGVuCisgICAgICBzLmFkZF9ydW50aW1lX2RlcGVuZGVuY3koJXE8cmItZnNldmVudD4uZnJlZXplLCBbIj49IDAuOS40IiwgIn4+IDAuOSJdKQorICAgICAgcy5hZGRfcnVudGltZV9kZXBlbmRlbmN5KCVxPHJiLWlub3RpZnk+LmZyZWV6ZSwgWyI+PSAwLjkuNyIsICJ+PiAwLjkiXSkKKyAgICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIj49IDEuMy41Il0pCisgICAgZWxzZQorICAgICAgcy5hZGRfZGVwZW5kZW5jeSglcTxyYi1mc2V2ZW50Pi5mcmVlemUsIFsiPj0gMC45LjQiLCAifj4gMC45Il0pCisgICAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJiLWlub3RpZnk+LmZyZWV6ZSwgWyI+PSAwLjkuNyIsICJ+PiAwLjkiXSkKKyAgICAgIHMuYWRkX2RlcGVuZGVuY3koJXE8YnVuZGxlcj4uZnJlZXplLCBbIj49IDEuMy41Il0pCisgICAgZW5kCisgIGVsc2UKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJiLWZzZXZlbnQ+LmZyZWV6ZSwgWyI+PSAwLjkuNCIsICJ+PiAwLjkiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPHJiLWlub3RpZnk+LmZyZWV6ZSwgWyI+PSAwLjkuNyIsICJ+PiAwLjkiXSkKKyAgICBzLmFkZF9kZXBlbmRlbmN5KCVxPGJ1bmRsZXI+LmZyZWV6ZSwgWyI+PSAxLjMuNSJdKQorICBlbmQKK2VuZAo=